ZGlmZiAtLWdpdCBhLy5jbGFzc3BhdGggYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzI1OTk2Li4wMDAwMDAwCi0tLSBhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhjbHVkaW5nPSJqb3NodWEvY29ycHVzL3xqb3NodWEvZGVjb2Rlci9EZWNvZGVyVGhyZWFkVGVzdC5qYXZhfGpvc2h1YS9kZWNvZGVyL2ZmL3xqb3NodWEvZGVjb2Rlci9mZi9sbS98am9zaHVhL2xhdHRpY2UvfGpvc2h1YS91dGlsL2lvL3xqb3NodWEvem1lcnQvIiBpbmNsdWRpbmc9Impvc2h1YS8iIGtpbmQ9InNyYyIgcGF0aD0idGVzdCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9hc20tMy4xLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9jb2xsZWN0aW9ucy1nZW5lcmljLTQuMDEuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2pheGVuLTEuMS4xLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9qdW5nLWFsZ29yaXRobXMtMi4wLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9qdW5nLWFwaS0yLjAuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2p1bmctZ3JhcGgtaW1wbC0yLjAuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2p1bmctdmlzdWFsaXphdGlvbi0yLjAuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL3BtZC00LjIuNS5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvYmVya2VsZXlhbGlnbmVyLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9iZXJrZWxleWxtLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi90ZXN0bmctNi43LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9tb2NraXRvLWFsbC0xLjkuNS5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvanVuaXQtNC4xMC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvY29tbW9ucy1jbGktMS4yLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImNsYXNzIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGVjNDUyMTQuLjg2OTMwMGUgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSwzICsxLDUgQEAKK1ZFUlNJT04KKwogY2xhc3MvCiBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0vc3JpbG0vU1dJR1RZUEVfcF9OZ3JhbS5qYXZhCiBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0vc3JpbG0vU1dJR1RZUEVfcF9Wb2NhYi5qYXZhCmRpZmYgLS1naXQgYS8ucHJvamVjdCBiLy5wcm9qZWN0CmluZGV4IDZkOGMzMzIuLjdiNmVkOGUgMTAwNjQ0Ci0tLSBhLy5wcm9qZWN0CisrKyBiLy5wcm9qZWN0CkBAIC0xLDMzICsxLDE4IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgogPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5qb3NodWE8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+Ci0JCQk8dHJpZ2dlcnM+ZnVsbCxpbmNyZW1lbnRhbCw8L3RyaWdnZXJzPgotCQkJPGFyZ3VtZW50cz4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5MYXVuY2hDb25maWdIYW5kbGU8L2tleT4KLQkJCQkJPHZhbHVlPiZsdDtwcm9qZWN0Jmd0Oy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQ3JlYXRlIGphci5sYXVuY2g8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotCTx2YXJpYWJsZUxpc3Q+Ci0JCTx2YXJpYWJsZT4KLQkJCTxuYW1lPkpPU0hVQTwvbmFtZT4KLQkJCTx2YWx1ZT4kJTdCUFJPSkVDVF9MT0MlN0Q8L3ZhbHVlPgotCQk8L3ZhcmlhYmxlPgotCTwvdmFyaWFibGVMaXN0PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CisgIDxuYW1lPmpvc2h1YTwvbmFtZT4KKyAgPGNvbW1lbnQ+CisgIDwvY29tbWVudD4KKyAgPHByb2plY3RzPgorICA8L3Byb2plY3RzPgorICA8YnVpbGRTcGVjPgorICAgIDxidWlsZENvbW1hbmQ+CisgICAgICA8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKyAgICAgIDxhcmd1bWVudHM+CisgICAgICA8L2FyZ3VtZW50cz4KKyAgICA8L2J1aWxkQ29tbWFuZD4KKyAgPC9idWlsZFNwZWM+CisgIDxuYXR1cmVzPgorICAgIDxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorICA8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9DSEFOR0VMT0cgYi9DSEFOR0VMT0cKaW5kZXggMDcyMDYyMC4uYzkwZGMzNSAxMDA2NDQKLS0tIGEvQ0hBTkdFTE9HCisrKyBiL0NIQU5HRUxPRwpAQCAtMSwzICsxLDIyIEBACis2LjAuNSAoT2N0b2JlciAyMywgMjAxNSkKKz09PT09PT09PT09PT09PT09PT09PT09PQorCistIEtlbkxNIHVwZGF0ZWQsIGluY2x1ZGVzIGxhc3RseSBpbXByb3ZlZCBjbWFrZS1iYXNlZCBidWlsZAorLSBGaXggZm9yIGdyYW1tYXIgcGFja2luZyB0aGF0IHByZXZpb3VzbHkgbGltaXRlZCB0aGUgc2l6ZSBvZiBncmFtbWFycyAoZXNwLiBIaWVybykKKy0gU3VwcG9ydCBmb3IgZGVjb2Rpbmcgd2l0aCBtdWx0aXBsZSBwYWNrZWQgZ3JhbW1hcnMgKGlmIHBhY2tlZCB0b2dldGhlcikKKy0gRmVhdHVyZSBmdW5jdGlvbnMgbm93IHJlcG9ydCBkZW5zZSBmZWF0dXJlcywgZm9yIG1vcmUgZWZmaWNpZW50IGhhbmRsaW5nCistIEFkZGVkIEFkYUdyYWQgYW5kIGludGVybmFsIE1JUkEKKy0gUGlwZWxpbmU6CisgIC0gQWxpZ25tZW50IG9mIGRpZmZlcmVudCBjaHVua3Mgbm93IHBhcmFsbGVsaXplZAorICAtIENvbXB1dGVzIG1ldGVvciBzY29yZXMgaWYgJE1FVEVPUiBpcyBkZWZpbmVkCisgIC0gVXBkYXRlZCB0byB1c2UgSGFkb29wIDIuNS4yCisgIC0gUmV3b3JrZWQgaG93IG11bHRpcGxlIHR1bmluZyBydW5zIChmb3Igb3B0aW1pemVyIGluc3RhYmlsaXR5KSBmdW5jdGlvbiAKKy0gTWF2ZW4gY29tcGF0aWJpbGl0eQorLSBEZXZlbG9wZXJzCisgIC0gQW50IGVjbGlwc2UgdGFyZ2V0CisgIC0gQWRkZWQgY29kZSBmb3JtYXR0aW5nIHNwZWMgZm9yIEVjbGlwc2UgaW1wb3J0CistIE1hbnkgYnVnZml4ZXMgYW5kIG90aGVyIGltcHJvdmVtZW50cworCiA2LjAuNCAoSnVuZSAxNSwgMjAxNSkKID09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQppbmRleCA1MzhhMWNlLi5kYzViMjk2IDEwMDY0NAotLS0gYS9MSUNFTlNFCisrKyBiL0xJQ0VOU0UKQEAgLTEsNCArMSw0IEBACi1Db3B5cmlnaHQgKGMpIDIwMTQsIEpvaG5zIEhvcGtpbnMgVW5pdmVyc2l0eSAKK0NvcHlyaWdodCAoYykgMjAxNSwgSm9obnMgSG9wa2lucyBVbml2ZXJzaXR5IAogQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogQlNEIDItY2xhdXNlIGxpY2Vuc2UKZGlmZiAtLWdpdCBhL2Jpbi9tZXRlb3IgYi9iaW4vbWV0ZW9yCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmOThhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vbWV0ZW9yCkBAIC0wLDAgKzEsMTIgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworaWYgW1sgLXogJDMgXV07IHRoZW4KKyAgZWNobyAiVXNhZ2U6IG1ldGVvciBvdXRwdXQgcmVmZXJlbmNlIGxhbmciCisgIGV4aXQgMQorZmkKKworb3V0cHV0PSQxCityZWZlcmVuY2U9JDIKK2xhbmc9JDMKKworamF2YSAtWG14MkcgLWphciAkTUVURU9SL21ldGVvci0qLmphciAkb3V0cHV0ICRyZWZlcmVuY2UgLWwgJGxhbmcKZGlmZiAtLWdpdCBhL2J1aWxkLnhtbCBiL2J1aWxkLnhtbAppbmRleCA3NzIzYWJmLi44YzZmYWJlIDEwMDY0NAotLS0gYS9idWlsZC54bWwKKysrIGIvYnVpbGQueG1sCkBAIC03LDYgKzcsNyBAQAogICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIgLz4KIAogICA8cHJvcGVydHkgbmFtZT0iSk9TSFVBIiB2YWx1ZT0iJHtiYXNlZGlyfSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9IktFTkxNIiB2YWx1ZT0iJHtiYXNlZGlyfS9zcmMva2VubG0iIC8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIHZhbHVlPSIke0pPU0hVQX0vc3JjIiAvPgogICA8cHJvcGVydHkgbmFtZT0idGVzdCIgdmFsdWU9IiR7Sk9TSFVBfS90ZXN0IiAvPgogICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIHZhbHVlPSIke0pPU0hVQX0vY2xhc3MiIC8+CkBAIC0xNCwyMyArMTUsMTcgQEAKICAgPHByb3BlcnR5IG5hbWU9InRocmF4bGliIiB2YWx1ZT0iJHtKT1NIVUF9L3RocmF4L2JpbiIgLz4KICAgPHByb3BlcnR5IG5hbWU9ImRvYyIgdmFsdWU9IiR7Sk9TSFVBfS9kb2MiIC8+CiAKLSAgPCEtLSBUT0RPOiBzaG91bGQgdGhlc2UgYmUgbWFkZSBpbnRvICdwYXRoJ3MgaW5zdGVhZCBvZiAncHJvcGVydHkncz8gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0bmciIHZhbHVlPSIke2xpYn0vdGVzdG5nLTYuNy5qYXIiIC8+Ci0gIDwhLS0gPHByb3BlcnR5IG5hbWU9ImJkYiIgICAgdmFsdWU9IiR7bGlifS9qZS0zLjIuMjMuamFyIi8+IC0tPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJjbGkiIHZhbHVlPSJjb21tb25zLWNsaS0xLjIuamFyIi8+Ci0KICAgPHBhdGggaWQ9ImNvbXBpbGUuYWxsLmNsYXNzcGF0aCI+CiAgICAgPGZpbGVzZXQgZGlyPSIke2xpYn0iPgotICAgICAgPGluY2x1ZGUgbmFtZT0iJHtjbGl9IiAvPgotICAgICAgPCEtLSBKdW5nIHVzZXMgYSBCU0QtbGlrZSBsaWNlbnNlLCBzZWUgLi9saWIvTElDRU5TRVMvTElDRU5TRS1qdW5nLnR4dCAtLT4KICAgICAgIDxpbmNsdWRlIG5hbWU9Imp1bmctYXBpLTIuMC5qYXIiIC8+CiAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5nLWdyYXBoLWltcGwtMi4wLmphciIgLz4KICAgICAgIDxpbmNsdWRlIG5hbWU9Imp1bmctYWxnb3JpdGhtcy0yLjAuamFyIiAvPgogICAgICAgPGluY2x1ZGUgbmFtZT0ianVuZy12aXN1YWxpemF0aW9uLTIuMC5qYXIiIC8+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSJjb2xsZWN0aW9ucy1nZW5lcmljLTQuMDEuamFyIiAvPgogICAgICAgPGluY2x1ZGUgbmFtZT0iYmVya2VsZXlsbS5qYXIiIC8+CiAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5pdC00LjEwLmphciIgLz4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbW1vbnMtY2xpLTEuMi5qYXIiIC8+CisgICAgICA8aW5jbHVkZSBuYW1lPSJjb2xsZWN0aW9ucy1nZW5lcmljLTQuMDEuamFyIiAvPgorICAgICAgPGluY2x1ZGUgbmFtZT0iYXJnczRqLTIuMC4yOS5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgogICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJheGxpYn0iPgogICAgICAgPGluY2x1ZGUgbmFtZT0idGhyYXguamFyIiAvPgpAQCAtNTcsMzMgKzUyLDEzIEBACiAgICAgPCEtLSA8L2lmPiAtLT4KICAgPC90YXJnZXQ+CiAKLSAgPCEtLSBTZXQgZ2l0IHZlcnNpb24gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iZ2l0LXZlcnNpb24iIGRlc2NyaXB0aW9uPSItLT4gU3RvcmUgbGF0ZXN0IGdpdCBjb21taXQgSUQiPgotICAgIDxleGVjIGV4ZWN1dGFibGU9ImdpdCI+Ci0gICAgICA8YXJnIHZhbHVlPSJyZXYtcGFyc2UiLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii0tc2hvcnQiLz4KLSAgICAgIDxhcmcgdmFsdWU9IkhFQUQiLz4KLSAgICA8L2V4ZWM+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ic2V0LWpvc2h1YS12ZXJzaW9uIiB1bmxlc3M9ImVudi5KT1NIVUFfVkVSU0lPTiIgZGVzY3JpcHRpb249Ii0tPiBQcm9tcHQgdXNlciB0byBzZXQgSm9zaHVhIHZlcnNpb24gZW52aXJvbm1lbnQgdmFyaWFibGUiPgotICAgIDxmYWlsIG1lc3NhZ2U9IlBsZWFzZSBzZXQgdGhlICRKT1NIVUFfVkVSU0lPTiBlbnZpcm9ubWVudCB2YXJpYWJsZS4iIC8+Ci0gIDwvdGFyZ2V0PgotCiAgIDx0YXJnZXQgbmFtZT0ic2V0LWphdmEtaG9tZSIgdW5sZXNzPSJlbnYuSkFWQV9IT01FIiBkZXNjcmlwdGlvbj0iLS0+IFByb21wdCB1c2VyIHRvIHNldCBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUiPgogICAgIDxmYWlsIG1lc3NhZ2U9IlBsZWFzZSBzZXQgdGhlICRKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUuIiAvPgogICAgIDwhLS0gVE9ETzogYWRkIHN1Z2dlc3Rpb24gdG8gdXNlIC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvSG9tZS8gaWZmIG9uIE9TWCAtLT4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJrZW5sbSIgZGVwZW5kcz0iY2hlY2stam9zaHVhLWhvbWUiIGRlc2NyaXB0aW9uPSItLT4gJ01ha2UnIHRoZSBrZW5sbSBzb2ZydHdhcmUgaW4gJHtzcmN9L2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtLyI+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0ibWFrZSI+Ci0gICAgICA8YXJnIHZhbHVlPSItaiIgLz4KLSAgICAgIDxhcmcgdmFsdWU9IjQiIC8+Ci0gICAgICA8YXJnIHZhbHVlPSItQyIgLz4KLSAgICAgIDxhcmcgdmFsdWU9IiR7c3JjfS9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS8iIC8+Ci0gICAgICA8YXJnIHZhbHVlPSJpbnN0YWxsIiAvPgotICAgICAgPGFyZyB2YWx1ZT0iQk9PU1RfUk9PVD0ke2Vudi5CT09TVF9ST09UfSIgLz4KLSAgICA8L2V4ZWM+CisgIDx0YXJnZXQgbmFtZT0ia2VubG0iIGRlcGVuZHM9ImNoZWNrLWpvc2h1YS1ob21lIiBkZXNjcmlwdGlvbj0iLS0+IEJ1aWxkIEtlbkxNIj4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIuL2J1aWxkX2tlbmxtLnNoIiBkaXI9IiR7Sk9TSFVBfS9qbmkiIC8+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iZ2l6YSIgZGVwZW5kcz0iY2hlY2stam9zaHVhLWhvbWUiIGRlc2NyaXB0aW9uPSItLT4gJ01ha2UnIHRoZSBnaXphIHNvZnR3YXJlIGluIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC8iPgpAQCAtOTEsMjIgKzY2LDE1IEBACiAgICAgICA8YXJnIHZhbHVlPSItaiIgLz4KICAgICAgIDxhcmcgdmFsdWU9IjQiIC8+CiAgICAgICA8YXJnIHZhbHVlPSItQyIgLz4KLSAgICAgIDxhcmcgdmFsdWU9InNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC8iIC8+CisgICAgICA8YXJnIHZhbHVlPSIke3NyY30vZ2l6YS1wcC8iIC8+CiAgICAgICA8YXJnIHZhbHVlPSJhbGwiIC8+CiAgICAgICA8YXJnIHZhbHVlPSJpbnN0YWxsIiAvPgogICAgIDwvZXhlYz4KICAgICA8ZXhlYyBleGVjdXRhYmxlPSJtYWtlIj4KICAgICAgIDxhcmcgdmFsdWU9Ii1DIiAvPgotICAgICAgPGFyZyB2YWx1ZT0ic2NyaXB0cy90cmFpbmluZy9zeW1hbC8iIC8+CisgICAgICA8YXJnIHZhbHVlPSIke3NyY30vc3ltYWwiIC8+CiAgICAgICA8YXJnIHZhbHVlPSJhbGwiIC8+CiAgICAgPC9leGVjPgotICAgIDwhLS0gCSAgPGV4ZWMgZXhlY3V0YWJsZT0iLi9jb25maWd1cmUiIGRpcj0ic2NyaXB0cy90cmFpbmluZy9NR0laQSIgLz4gLS0+Ci0gICAgPCEtLSAJICA8ZXhlYyBleGVjdXRhYmxlPSJtYWtlIj4gLS0+Ci0gICAgPCEtLSAJCTxhcmcgdmFsdWU9Ii1DIHNjcmlwdHMvdHJhaW5pbmcvTUdJWkEvIiAvPiAtLT4KLSAgICA8IS0tICAgICAgIDwvZXhlYz4gLS0+Ci0gICAgPCEtLSAJICA8ZXhlYyBleGVjdXRhYmxlPSJjcCI+IC0tPgotICAgIDwhLS0gCQk8YXJnIHZhbHVlPSItQyBzY3JpcHRzL3RyYWluaW5nL01HSVpBLyIgLz4gLS0+Ci0gICAgPCEtLSAgICAgICA8L2V4ZWM+IC0tPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InBhcmFsbGVsaXplIiBkZXBlbmRzPSJjaGVjay1qb3NodWEtaG9tZSIgZGVzY3JpcHRpb249Ii0tPiAnTWFrZScgdGhlIHBhcmFsbGVsaXplIHNvZnR3YXJlIGluIHNjcmlwdHMvdHJhaW5pbmcvcGFyYWxsZWxpemUvIj4KQEAgLTEzMSwxMCArOTksNiBAQAogCiAgIDx0YXJnZXQgbmFtZT0idGhyYXgiIGRlcGVuZHM9ImNoZWNrLWpvc2h1YS1ob21lIiBkZXNjcmlwdGlvbj0iLS0+IEJ1aWxkIFRocmF4Ij4KICAgICA8c3ViYW50IGJ1aWxkcGF0aD0idGhyYXgiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImVudi5IQURPT1AiIHZhbHVlPSIke2xpYn0iIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZW52LkhBRE9PUF9WRVJTSU9OIiB2YWx1ZT0iMC4yMC4yMDMuMCIgLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbnYuQVdTX1NESyIgdmFsdWU9IiR7Sk9TSFVBfSIgLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbnYuQVdTX1ZFUlNJT04iIHZhbHVlPSIxLjEuMyIgLz4KICAgICA8L3N1YmFudD4KICAgPC90YXJnZXQ+CiAKQEAgLTE0Miw3ICsxMDYsNyBAQAogICAgICAgIHBpcGVsaW5lLnBsIGFuZCB0ZXN0L2hhZG9vcC8gLS0+CiAgIDx0YXJnZXQgbmFtZT0iZG93bmxvYWQtaGFkb29wIiBkZXBlbmRzPSJjaGVjay1qb3NodWEtaG9tZSIgZGVzY3JpcHRpb249Ii0tPiBEb3dubG9hZCB0aGUgSGFkb29wIHNvZnR3YXJlIj4KICAgICA8Z2V0Ci0gICAgICBzcmM9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9oYWRvb3AvY29yZS9oYWRvb3AtMC4yMC4yL2hhZG9vcC0wLjIwLjIudGFyLmd6IgorICAgICAgc3JjPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvaGFkb29wL2NvcmUvaGFkb29wLTIuNS4yL2hhZG9vcC0yLjUuMi50YXIuZ3oiCiAgICAgICBkZXN0PSIke0pPU0hVQX0vbGliIgogICAgICAgdXNldGltZXN0YW1wPSJ0cnVlIgogICAgICAgc2tpcGV4aXN0aW5nPSJ0cnVlIiAvPgpAQCAtMTcwLDkgKzEzNCw5IEBACiAgIDwvdGFyZ2V0PgogCiAgIDwhLS0gQ29tcGlsZSB0aGUgSmF2YSBjb2RlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJqYXZhIiBkZXBlbmRzPSJjaGVjay1qb3NodWEtaG9tZSIgZGVzY3JpcHRpb249Ii0tPiBDb21waWxlIHRoZSBKYXZhIGNvZGUiPgorICA8dGFyZ2V0IG5hbWU9ImphdmEiIGRlcGVuZHM9ImNoZWNrLWpvc2h1YS1ob21lLHZlcnNpb24iIGRlc2NyaXB0aW9uPSItLT4gQ29tcGlsZSB0aGUgSmF2YSBjb2RlIj4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIgLz4KLSAgICA8amF2YWMgY29tcGlsZXI9ImphdmFjMS43IiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iY29tcGlsZS5hbGwuY2xhc3NwYXRoIiBkZWJ1Zz0ib24iIGVuY29kaW5nPSJ1dGY4IiBzb3VyY2VwYXRoPSIiIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSI+CisgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJjb21waWxlLmFsbC5jbGFzc3BhdGgiIGRlYnVnPSJvbiIgZW5jb2Rpbmc9InV0ZjgiIHNvdXJjZXBhdGg9IiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIj4KICAgICAgIDwhLS0gV2UgbnVsbGlmeSB0aGUgc291cmNlcGF0aCBpbiBvcmRlciB0byBkaXNhYmxlIEFudCdzIHVzdWFsIHJlc29sdXRpb24gbWVjaGFuaXNtLiBUaGlzIG1ha2VzIGl0IGFuIGVycm9yIGZvciBvdXIgYmFzaWMgY29kZSB0byBjYWxsIGludG8gY29kZSB0aGF0IGhhcyBleHRlcm5hbCBkZXBlbmRlbmNpZXMsIHJhdGhlciB0aGFuIGF1dG8taW5jbHVkaW5nIHRob3NlIGZpbGVzIGFuZCB0aGVuIGhhdmluZyBhIGNsYXNzcGF0aCBlcnJvci4gLS0+CiAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CiAKQEAgLTE4NCw3ICsxNDgsNyBAQAogCiAgIDwhLS0gQ3JlYXRlIGEgSkFSIGZpbGUgLS0+CiAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJqYXZhLGNoZWNrLWpvc2h1YS1ob21lIiBkZXNjcmlwdGlvbj0iLS0+IENyZWF0ZSBhIEpBUiBmaWxlIG9mIGNvbXBpbGVzIGNsYXNzZXMiPgotICAgIDxqYXIgZGVzdGZpbGU9IiR7YnVpbGR9L2pvc2h1YS5qYXIiIGluZGV4PSJ0cnVlIj4KKyAgICA8amFyIGRlc3RmaWxlPSIke2xpYn0vam9zaHVhLmphciIgaW5kZXg9InRydWUiPgogICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkfSI+CiAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2xhc3MiIC8+CiAgICAgICA8L2ZpbGVzZXQ+CkBAIC0yMTEsMTUgKzE3NSwxOSBAQAogICA8L3RhcmdldD4KIAogICA8IS0tIENyZWF0ZSBhIHZlcnNpb25lZCByZWxlYXNlIC0tPgotICA8dGFyZ2V0IG5hbWU9InJlbGVhc2UiIGRlcGVuZHM9InNldC1qb3NodWEtdmVyc2lvbiwgZGV2ZWwtY2xlYW4sIGluaXQsIHRocmF4IiBkZXNjcmlwdGlvbj0iLS0+IENyZWF0ZSBhIHZlcnNpb25lZCByZWxlYXNlIj4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuL3NjcmlwdHMvc3VwcG9ydC9tYWtlLXJlbGVhc2Uuc2giPgotICAgICAgPGFyZyB2YWx1ZT0iJHtlbnYuSk9TSFVBX1ZFUlNJT059IiAvPgorICA8dGFyZ2V0IG5hbWU9InJlbGVhc2UiIGRlcGVuZHM9ImRldmVsLWNsZWFuLCBpbml0LCB0aHJheCwgdmVyc2lvbiIgZGVzY3JpcHRpb249Ii0tPiBDcmVhdGUgYSB2ZXJzaW9uZWQgcmVsZWFzZSI+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi9zY3JpcHRzL3N1cHBvcnQvbWFrZS1yZWxlYXNlLnNoIiAvPgorICA8L3RhcmdldD4KKworICAgIDwhLS0gU2V0IGdpdCB2ZXJzaW9uIC0tPgorICA8dGFyZ2V0IG5hbWU9InZlcnNpb24iIGRlc2NyaXB0aW9uPSJCdWlsZCBWRVJTSU9OIGZpbGUiPgorICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4vc2NyaXB0cy9zdXBwb3J0L3dyaXRlLXZlcnNpb24uc2giPgogICAgIDwvZXhlYz4KICAgPC90YXJnZXQ+CiAKICAgPCEtLSBDcmVhdGUgYSBKQVIgZmlsZSBvZiB0aGUgc291cmNlIGNvZGUgLS0+CiAgIDx0YXJnZXQgbmFtZT0ic291cmNlLWphciIgZGVzY3JpcHRpb249Ii0tPiBDcmVhdGUgYSBKQVIgZmlsZSBvZiB0aGUgc291cmNlIGNvZGUiPgotICAgIDxqYXIgZGVzdGZpbGU9IiR7YnVpbGR9L2pvc2h1YS1zcmMuamFyIj4KKyAgICA8amFyIGRlc3RmaWxlPSIke2xpYn0vam9zaHVhLXNyYy5qYXIiPgogICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkfSI+CiAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIgLz4KICAgICAgIDwvZmlsZXNldD4KQEAgLTIyOSwyMSArMTk3LDI3IEBACiAgIDwhLS0gfn5+fn4gQ2xlYW5pbmcgdGFza3Mgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAtLT4KIAogICA8IS0tIERlbGV0ZSB0aGUgY29tcGlsZWQgZmlsZXMgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImNsZWFuLXRocmF4LGNsZWFuLWphdmEiIGRlc2NyaXB0aW9uPSItLT4gQ2xlYW4gKHJlbW92ZSkgYWxsIGJ1aWxkIGRpcmVjdG9yaWVzIj4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSJtYWtlIj4KLSAgICAgIDxhcmcgdmFsdWU9Ii1DIiAvPgotICAgICAgPGFyZyB2YWx1ZT0ic2NyaXB0cy90cmFpbmluZy9naXphLXBwIiAvPgotICAgICAgPGFyZyB2YWx1ZT0iY2xlYW4iIC8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii9iaW4vYmFzaCIgZGlyPSJzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0iPgotICAgICAgPGFyZyB2YWx1ZT0iY2xlYW4iIC8+Ci0gICAgPC9leGVjPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJjbGVhbi10aHJheCxjbGVhbi1qYXZhLGNsZWFuLWtlbmxtLGNsZWFuLWdpemEiIGRlc2NyaXB0aW9uPSItLT4gQ2xlYW4gKHJlbW92ZSkgYWxsIGJ1aWxkIGRpcmVjdG9yaWVzIj4KICAgICA8ZGVsZXRlIGZpbGU9IiR7bGlifS9saWJrZW4uc28iIC8+CiAgICAgPGRlbGV0ZSBmaWxlPSJ0cmVlX3Zpc3VhbGl6ZXIvdHJlZV92aXN1YWxpemVyLmphciIgLz4KICAgICA8ZGVsZXRlIGRpcj0iZG9jL2h0bWwiIC8+CiAgICAgPGRlbGV0ZSBkaXI9ImRvYy9sYXRleCIgLz4KICAgPC90YXJnZXQ+CiAKKyAgPCEtLSBDbGVhbiB1cCBHSVpBIGFuZCBzeW1hbCBjb2RlIC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuLWdpemEiIGRlc2NyaXB0aW9uPSItLT4gQ2xlYW4gR0laQSBhbmQgc3ltYWwiPgorICAgIDxleGVjIGV4ZWN1dGFibGU9Im1ha2UiPgorICAgICAgPGFyZyB2YWx1ZT0iLUMiIC8+CisgICAgICA8YXJnIHZhbHVlPSIke3NyY30vZ2l6YS1wcCIgLz4KKyAgICAgIDxhcmcgdmFsdWU9ImNsZWFuIiAvPgorICAgIDwvZXhlYz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSJtYWtlIj4KKyAgICAgIDxhcmcgdmFsdWU9Ii1DIiAvPgorICAgICAgPGFyZyB2YWx1ZT0iJHtzcmN9L3N5bWFsIiAvPgorICAgICAgPGFyZyB2YWx1ZT0iY2xlYW4iIC8+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKwogICA8IS0tIERlbGV0ZSBqdXN0IHRoZSBqYXZhIGZpbGVzIC0tPgogICA8dGFyZ2V0IG5hbWU9ImNsZWFuLWphdmEiIGRlc2NyaXB0aW9uPSItLT4gRGVsZXRlIGp1c3QgdGhlIGphdmEgZmlsZXMiPgogICAgIDxkZWxldGUgdmVyYm9zZT0idHJ1ZSIgcXVpZXQ9InRydWUiPgpAQCAtMjU0LDQ0ICsyMjgsMTcgQEAKICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJjbGVhbi10aHJheCIgZGVzY3JpcHRpb249Ii0tPiBEZWxldGUganVzdCB0aGUgdGhyYXggZmlsZXMiPgotICAgICAgPGRlbGV0ZSB2ZXJib3NlPSJ0cnVlIiBxdWlldD0idHJ1ZSI+CisgICAgPGRlbGV0ZSB2ZXJib3NlPSJ0cnVlIiBxdWlldD0idHJ1ZSI+CiAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGhyYXhsaWJ9Ij4KICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jbGFzcyIvPgogICAgICAgPC9maWxlc2V0PgogICAgIDwvZGVsZXRlPgogICA8L3RhcmdldD4KIAotICA8IS0tIEVYUEVSSU1FTlRBTDogRGVsZXRlICphbGwqIGdlbmVyYXRlZCBmaWxlcyAtLT4KLSAgPHRhcmdldCBuYW1lPSJkaXN0Y2xlYW4iIGRlcGVuZHM9ImNsZWFuIiBkZXNjcmlwdGlvbj0iLS0+IEVYUEVSSU1FTlRBTDogRGVsZXRlICphbGwqIGdlbmVyYXRlZCBmaWxlcyI+Ci0gICAgPCEtLSBCVUc6IHRoaXMgZG9lc24ndCBkZWxldGUgZW1wdHkgZm9sZGVycyAobmVpdGhlciAke2J1aWxkfSBpdHNlbGYsIG5vciB0aGUgY2xhc3MgZGlycyAodGhlIGxhdHRlciBtYWtlcyBzZW5zZSBzaW5jZSB3ZSBkb24ndCB0cmF2ZXJzZSB0aGVtKSkgLS0+Ci0gICAgPGRlbGV0ZSB2ZXJib3NlPSJ0cnVlIiBxdWlldD0idHJ1ZSIgaW5jbHVkZUVtcHR5RGlycz0idHJ1ZSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGR9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iam9zaHVhLmphciIgLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iam9zaHVhLXVpLmphciIgLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2RlbGV0ZT4KLQotICAgIDwhLS0gSEFDSzogdGhlc2UgdHdvIHdvcmsgcGVyZmVjdGx5LCBidXQgbWF5YmUgcHJvYmxlbWF0aWMgaWYgcGVvcGxlIHJlc2V0ICR7dGVzdH0gb3IgJHtkb2N9IC0tPgotICAgIDxkZWxldGUgdmVyYm9zZT0idHJ1ZSIgcXVpZXQ9InRydWUiIGluY2x1ZGVFbXB0eURpcnM9InRydWUiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3R9LW91dHB1dCIgLz4KLSAgICA8L2RlbGV0ZT4KLQotICAgIDxkZWxldGUgdmVyYm9zZT0idHJ1ZSIgcXVpZXQ9InRydWUiIGluY2x1ZGVFbXB0eURpcnM9InRydWUiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RvY30iIGluY2x1ZGVzPSIqKi8qLnRtcCIgLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtkb2N9L2h0bWwiIC8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZG9jfS9sYXRleCIgLz4KLSAgICA8L2RlbGV0ZT4KLQotICAgIDxkZWxldGUgdmVyYm9zZT0idHJ1ZSIgcXVpZXQ9InRydWUiIGZpbGU9Impvc2h1YS1mYi54bWwiIC8+Ci0KLSAgICA8ZGVsZXRlIHZlcmJvc2U9InRydWUiIHF1aWV0PSJ0cnVlIiBpbmNsdWRlRW1wdHlEaXJzPSJ0cnVlIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0idHJlZV92aXN1YWxpemVyIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0idHJlZV92aXN1YWxpemVyLmphciIgLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2RlbGV0ZT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbi1rZW5sbSIgZGVzY3JpcHRpb249Ii0tPiBDbGVhbmluZyB1cCBLZW5MTSI+CisgICAgPGRlbGV0ZSBkaXI9IiR7S0VOTE19L2J1aWxkIiAvPgogICA8L3RhcmdldD4KIAotCiAgIDwhLS0gRGVsZXRlICphbGwqIGdlbmVyYXRlZCBmaWxlcywKICAgICAgICBpbmNsdWRpbmcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIG5vdCB0cmFja2VkIGJ5IGdpdCAtLT4KICAgPHRhcmdldCBuYW1lPSJkZXZlbC1jbGVhbiIgZGVzY3JpcHRpb249Ii0tPiBEZWxldGUgKmFsbCogZ2VuZXJhdGVkIGZpbGVzLCBpbmNsdWRpbmcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIG5vdCB0cmFja2VkIGJ5IGdpdCI+CkBAIC0zMTMsMTcgKzI2MCw2IEBACiAgICAgPC9leGVjPgogICA8L3RhcmdldD4KIAotICA8IS0tIH5+fn5+IEphdmFkb2Mgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gLS0+Ci0KLSAgPCEtLSBDb21waWxlIHRoZSBKYXZhZG9jcyBpbnRvIHdlYiBwYWdlcyAtLT4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXNjcmlwdGlvbj0iLS0+IENvbXBpbGUgdGhlIEphdmFkb2NzIGludG8gd2ViIHBhZ2VzIj4KLSAgICA8bWtkaXIgZGlyPSIke2RvY30iIC8+Ci0gICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSJqb3NodWEuKiIgY2xhc3NwYXRoPSIke2NsaX0iIHNvdXJjZXBhdGg9IiR7c3JjfSIgZGVzdGRpcj0iJHtkb2N9IiBhdXRob3I9InRydWUiIHZlcnNpb249InRydWUiIGNoYXJzZXQ9InV0Zi04IiBvdmVydmlldz0ic3JjL292ZXJ2aWV3Lmh0bWwiPgotICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS8iIC8+Ci0gICAgICA8bGluayBocmVmPSJodHRwOi8vY29tbW9ucy5hcGFjaGUub3JnL2NsaS9hcGktcmVsZWFzZSIgLz4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotCiAgIDwhLS0gfn5+fn4gRG94eWdlbiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAtLT4KIAogICA8dGFza2RlZiB1cmk9ImFudGxpYjpvcmcuZG94eWdlbi50b29scyIgcmVzb3VyY2U9Im9yZy9kb3h5Z2VuL3Rvb2xzL2FudGxpYi54bWwiIGNsYXNzcGF0aD0iJHtsaWJ9L2FudC1kb3h5Z2VuLTEuNi4xLmphciIgLz4KQEAgLTM0MSwyOCArMjc3LDcgQEAKICAgICA8L2V4ZWM+CiAgIDwvdGFyZ2V0PgogCi0gIDwhLS0gfn5+fn4gVGVzdE5HIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAtLT4KLQotICA8IS0tIERlZmluZSB0aGUgdW5pdCB0ZXN0aW5nIHRhc2sgLS0+Ci0gIDx0YXNrZGVmIHJlc291cmNlPSJ0ZXN0bmd0YXNrcyIgY2xhc3NwYXRoPSIke3Rlc3RuZ30iIC8+Ci0KLQotICA8IS0tIENvbXBpbGUgdGhlIHVuaXQgdGVzdCBjb2RlIC0tPgotICA8IS0tIEZJWE1FOiB3aHkgaXMgdGhpcyBicm9rZW4gb3V0IGZyb20gdGhlICd0ZXN0JyB0YXJnZXQ/IC0tPgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdHMiIGRlcGVuZHM9ImphdmEiIGRlc2NyaXB0aW9uPSItLT4gQ29tcGlsZSB0aGUgdW5pdCB0ZXN0IGNvZGUiPgotICAgIDxqYXZhYyBjb21waWxlcj0iamF2YWMxLjUiIHNyY2Rpcj0iJHt0ZXN0fS9qb3NodWEvdWkiIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGg9IiR7dGVzdG5nfToke2J1aWxkfSIgZGVidWc9Im9uIiBlbmNvZGluZz0idXRmOCIgLz4KLSAgPC90YXJnZXQ+Ci0KLQotICA8IS0tIFJ1biB0aGUgdW5pdCB0ZXN0cyAtLT4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0bmciIGRlcGVuZHM9ImFsbCxjb21waWxlLXRlc3RzIiBkZXNjcmlwdGlvbj0iLS0+IFJ1biB0aGUgdW5pdCB0ZXN0cyI+Ci0gICAgPHRlc3RuZyBjbGFzc3BhdGg9IiR7YnVpbGR9IiBzb3VyY2VkaXI9IiR7dGVzdH0iPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLURmaWxlLmVuY29kaW5nPVVURjgiIC8+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItWG1zMjU2bSIgLz4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1YbXgyNTZtIiAvPgotICAgICAgPHhtbGZpbGVzZXQgZGlyPSIke3Rlc3R9IiBpbmNsdWRlcz0idGVzdG5nLnhtbCIgLz4KLSAgICA8L3Rlc3RuZz4KLSAgPC90YXJnZXQ+CisgIDwhLS0gfn5+fn4gSXZ5IH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gLS0+CiAKICAgPHByb3BlcnR5IG5hbWU9Iml2eS5pbnN0YWxsLnZlcnNpb24iIHZhbHVlPSIyLjIuMCIgLz4KICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iaXZ5LmhvbWUiIHZhbHVlPSIke2Vudi5JVllfSE9NRX0iPgpAQCAtNDA2LDcgKzMyMSw2NCBAQAogICAgIDxwcm9wZXJ0eSBuYW1lPSJpdnkuZGVmYXVsdC5pdnkudXNlci5kaXIiIHZhbHVlPSIke0pPU0hVQX0vbGliIiAvPgogICAgIDxpdnk6Y29uZmlndXJlIGZpbGU9IiR7Sk9TSFVBfS9saWIvaXZ5c2V0dGluZ3MueG1sIiAvPgogICAgIDxpdnk6cmVzb2x2ZSBmaWxlPSIke0pPU0hVQX0vbGliL2l2eS54bWwiIC8+Ci0gICAgPGl2eTpyZXRyaWV2ZSB0eXBlPSJqYXIiIC8+CisgICAgPGl2eTpyZXRyaWV2ZSB0eXBlPSJqYXIsYnVuZGxlIiAvPgorICA8L3RhcmdldD4KKworICAgIDwhLS0gdGFyZ2V0OiBjbGVhbi1lY2xpcHNlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuLWVjbGlwc2UiIGRlcGVuZHM9ImNsZWFuIiAKKyAgICBkZXNjcmlwdGlvbj0iLS0+IGNsZWFucyB0aGUgZWNsaXBzZSBwcm9qZWN0Ii8+IAorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIEVjbGlwc2UgdGFyZ2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBjbGFzc3BhdGggZm9yIGdlbmVyYXRpbmcgZWNsaXBzZSBwcm9qZWN0IC0tPgorICA8cGF0aCBpZD0iZWNsaXBzZS5jbGFzc3BhdGgiPgorICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJ9Ij4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioqLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImFudC1lY2xpcHNlLTEuMC1qdm0xLjIuamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgICA8ZmlsZXNldCBkaXI9IiR7bGlifSI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisgIDwvcGF0aD4KKyAgCisgIDwhLS0gdGFyZ2V0OiBhbnQtZWNsaXBzZS1kb3dubG9hZCAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFudC1lY2xpcHNlLWRvd25sb2FkIiBkZXNjcmlwdGlvbj0iLS0+IERvd25sb2FkcyB0aGUgYW50LWVjbGlwc2UgYmluYXJ5LiI+CisgICAgPGdldCBzcmM9Imh0dHA6Ly9kb3dubG9hZHMuc291cmNlZm9yZ2UubmV0L3Byb2plY3QvYW50LWVjbGlwc2UvYW50LWVjbGlwc2UvMS4wL2FudC1lY2xpcHNlLTEuMC5iaW4udGFyLmJ6MiIKKyAgICAgICAgIGRlc3Q9IiR7c3JjfS9hbnQtZWNsaXBzZS0xLjAuYmluLnRhci5iejIiIHVzZXRpbWVzdGFtcD0iZmFsc2UiIC8+CisKKyAgICA8dW50YXIgc3JjPSIke3NyY30vYW50LWVjbGlwc2UtMS4wLmJpbi50YXIuYnoyIgorICAgICAgICAgICBkZXN0PSIke3NyY30iIGNvbXByZXNzaW9uPSJiemlwMiI+CisgICAgICA8cGF0dGVybnNldD4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ibGliL2FudC1lY2xpcHNlLTEuMC1qdm0xLjIuamFyIi8+CisgICAgICA8L3BhdHRlcm5zZXQ+CisgICAgPC91bnRhcj4KKworICAgIDxkZWxldGUgZmlsZT0iJHtzcmN9L2FudC1lY2xpcHNlLTEuMC5iaW4udGFyLmJ6MiIgLz4KKyAgPC90YXJnZXQ+CisgIAorICA8IS0tIHRhcmdldDogZWNsaXBzZSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJlY2xpcHNlIiAKKyAgICAgICAgICBkZXBlbmRzPSJpbml0LGphcixhbnQtZWNsaXBzZS1kb3dubG9hZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iLS0+IENyZWF0ZSBlY2xpcHNlIHByb2plY3QgZmlsZXMiPgorCisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJlY2xpcHNlLnByb2plY3QiPgorICAgICAgPHBhdGggcGF0aD0iJHtiYXNlZGlyfSIvPgorICAgICAgPHJlZ2V4cG1hcHBlciBmcm9tPSJeLiovKFteL10rKSQkIiB0bz0iXDEiIGhhbmRsZWRpcnNlcD0ieWVzIi8+CisgICAgPC9wYXRoY29udmVydD4KKyAgCisgICAgPHRhc2tkZWYgbmFtZT0iZWNsaXBzZSIKKyAgICAgICAgICAgICBjbGFzc25hbWU9InByYW50bC5hbnQuZWNsaXBzZS5FY2xpcHNlVGFzayIKKyAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7c3JjfS9saWIvYW50LWVjbGlwc2UtMS4wLWp2bTEuMi5qYXIiIC8+CisgICAgPGVjbGlwc2UgdXBkYXRlYWx3YXlzPSJ0cnVlIj4KKyAgICAgIDxwcm9qZWN0IG5hbWU9IiR7ZWNsaXBzZS5wcm9qZWN0fSIgLz4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDxsaWJyYXJ5IHBhdGhyZWY9ImVjbGlwc2UuY2xhc3NwYXRoIiBleHBvcnRlZD0iZmFsc2UiIC8+CisgICAgICAgIDxzb3VyY2UgcGF0aD0iJHtiYXNlZGlyfS9zcmMiIC8+CisgICAgICAgIDxvdXRwdXQgcGF0aD0iJHtidWlsZH0iIC8+CisgICAgICA8L2NsYXNzcGF0aD4KKyAgICA8L2VjbGlwc2U+CiAgIDwvdGFyZ2V0PgogCiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9lY2xpcHNlLWNvZGVmb3JtYXQueG1sIGIvZWNsaXBzZS1jb2RlZm9ybWF0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTRlN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZWNsaXBzZS1jb2RlZm9ybWF0LnhtbApAQCAtMCwwICsxLDI2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8cHJvZmlsZXMgdmVyc2lvbj0iMTEiPgorPHByb2ZpbGUga2luZD0iQ29kZUZvcm1hdHRlclByb2ZpbGUiIG5hbWU9Ikpvc2h1YSIgdmVyc2lvbj0iMTEiPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZCIgdmFsdWU9IjAiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGUiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHMiIHZhbHVlPSIxNiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uIiB2YWx1ZT0iODAiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2ZvciIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGUiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGUiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZSIgdmFsdWU9IjEiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb24iIHZhbHVlPSIyIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9IjE2Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuayIgdmFsdWU9IjEiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2UiIHZhbHVlPSIwIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlIiB2YWx1ZT0iMS41Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnMiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl93cmFwcGVkX2xpbmVzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2siIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbCIgdmFsdWU9IjE2Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGUiIHZhbHVlPSIxIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSIxNiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2giIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2UiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudCIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdCIgdmFsdWU9IjEwMCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWYiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbiIgdmFsdWU9IjAiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZSIgdmFsdWU9IjIiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50IiB2YWx1ZT0iMCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllciIgdmFsdWU9ImVycm9yIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhciIgdmFsdWU9InNwYWNlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHkiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2QiIHZhbHVlPSIxIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2ZvciIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50IiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHkiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaCIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXIiIHZhbHVlPSJlcnJvciIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaCIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jayIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudCIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXMiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZSIgdmFsdWU9IjIiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jayIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWYiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudCIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvciIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXMiIHZhbHVlPSJmYWxzZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3QiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlIiB2YWx1ZT0iMSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSIxNiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2UiIHZhbHVlPSIxLjUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9IjIiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSIxNiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb24iIHZhbHVlPSIxNiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlIiB2YWx1ZT0iZW5hYmxlZCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXIiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aCIgdmFsdWU9IjgwIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3VwcyIgdmFsdWU9IjEiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHkiIHZhbHVlPSIwIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWwiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXIiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zIiB2YWx1ZT0iMSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl9saW5lc19pbl9jb21tZW50cyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlciIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHMiIHZhbHVlPSIxIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWwiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGUiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtIiB2YWx1ZT0iMS41Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXIiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzIiB2YWx1ZT0iMCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2siIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXIiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2giIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0IiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaCIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHMiIHZhbHVlPSIxIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXIiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbiIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgorPC9wcm9maWxlPgorPC9wcm9maWxlcz4KZGlmZiAtLWdpdCBhL2puaS9idWlsZF9rZW5sbS5zaCBiL2puaS9idWlsZF9rZW5sbS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDc4MDJiCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2J1aWxkX2tlbmxtLnNoCkBAIC0wLDAgKzEsMjUgQEAKKyMhL2Jpbi9iYXNoCisKK3NldCAtdQorCitleHBvcnQgS0VOTE1fTUFYX09SREVSPTEwCitleHBvcnQgQ1hYRkxBR1MrPSIgLU8zIC1mUElDIC1ESEFWRV9aTElCIgorZXhwb3J0IExERkxBR1MrPSIgLWx6IgorZXhwb3J0IENYWD0ke0NYWDotZysrfQorCitjZCAkSk9TSFVBL3NyYy9rZW5sbQorW1sgISAtZCBidWlsZCBdXSAmJiBta2RpciBidWlsZAorY2QgYnVpbGQKK2NtYWtlIC4uIC1ES0VOTE1fTUFYX09SREVSPSRLRU5MTV9NQVhfT1JERVIgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UKK21ha2UKK2NwIGJpbi97cXVlcnksbG1wbHosYnVpbGRfYmluYXJ5fSAkSk9TSFVBL2JpbgorCitpZiBbICIkKHVuYW1lKSIgPT0gRGFyd2luIF07IHRoZW4KKyAgU1VGRklYPWR5bGliCisgIFJUPSIiCitlbHNlCisgIFJUPS1scnQKKyAgU1VGRklYPXNvCitmaQorCiskQ1hYIC1zdGQ9Z251KysxMSAtSS4gLURLRU5MTV9NQVhfT1JERVI9JEtFTkxNX01BWF9PUkRFUiAtSSRKQVZBX0hPTUUvaW5jbHVkZSAtSSRKT1NIVUEvc3JjL2tlbmxtIC1JJEpBVkFfSE9NRS9pbmNsdWRlL2xpbnV4IC1JJEpBVkFfSE9NRS9pbmNsdWRlL2RhcndpbiAkSk9TSFVBL2puaS9rZW5sbV93cmFwLmNjIGxtL0NNYWtlRmlsZXMva2VubG0uZGlyLyoubyB1dGlsL0NNYWtlRmlsZXMva2VubG1fdXRpbC5kaXIvKi5vIHV0aWwvQ01ha2VGaWxlcy9rZW5sbV91dGlsLmRpci9kb3VibGUtY29udmVyc2lvbi8qLm8gLXNoYXJlZCAtbyAkSk9TSFVBL2xpYi9saWJrZW4uJFNVRkZJWCAkQ1hYRkxBR1MgJExERkxBR1MgJFJUCmRpZmYgLS1naXQgYS9qbmkva2VubG1fd3JhcC5jYyBiL2puaS9rZW5sbV93cmFwLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjZmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkva2VubG1fd3JhcC5jYwpAQCAtMCwwICsxLDQwMCBAQAorI2luY2x1ZGUgImxtL2VudW1lcmF0ZV92b2NhYi5oaCIKKyNpbmNsdWRlICJsbS9tb2RlbC5oaCIKKyNpbmNsdWRlICJsbS9sZWZ0LmhoIgorI2luY2x1ZGUgImxtL3N0YXRlLmhoIgorI2luY2x1ZGUgInV0aWwvbXVybXVyX2hhc2guaGgiCisjaW5jbHVkZSAidXRpbC9wb29sLmhoIgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKy8vIEdyci4gIEV2ZXJ5Ym9keSdzIGNvbXBpbGVyIGlzIHNsaWdodGx5IGRpZmZlcmVudCBhbmQgSSdtIHRyeWluZyB0byBub3QgZGVwZW5kIG9uIGJvb3N0LiAgIAorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKy8vIFZlcmlmeSB0aGF0IGppbnQgYW5kIGxtOjpuZ3JhbTo6V29yZEluZGV4IGFyZSB0aGUgc2FtZSBzaXplLiBJZiB0aGlzIGJyZWFrcworLy8gZm9yIHlvdSwgdGhlcmUncyBhIG5lZWQgdG8gcmV2aXNlIHByb2JTdHJpbmcuCituYW1lc3BhY2UgeworCit0ZW1wbGF0ZTxib29sPiBzdHJ1Y3QgU3RhdGljQ2hlY2sgeworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgU3RhdGljQ2hlY2s8dHJ1ZT4geworICB0eXBlZGVmIGJvb2wgU3RhdGljQXNzZXJ0aW9uUGFzc2VkOworfTsKKwordHlwZWRlZiBTdGF0aWNDaGVjazxzaXplb2YoamludCkgPT0gc2l6ZW9mKGxtOjpXb3JkSW5kZXgpPjo6U3RhdGljQXNzZXJ0aW9uUGFzc2VkIEZsb2F0U2l6ZTsKKwordHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIGxtOjpuZ3JhbTo6Q2hhcnRTdGF0ZSo+IFBvb2xIYXNoOworCisvKioKKyAqIEEgQ2hhcnQgYnVuZGxlcyB0b2dldGhlciBhIGhhc2hfbWFwIHRoYXQgbWFwcyBDaGFydFN0YXRlIHNpZ25hdHVyZXMgdG8gYSBzaW5nbGUgb2JqZWN0CisgKiBpbnN0YW50aWF0ZWQgdXNpbmcgYSBwb29sLiBUaGlzIGFsbG93cyBkdXBsaWNhdGUgc3RhdGVzIHRvIGF2b2lkIGFsbG9jYXRpbmcgc2VwYXJhdGUKKyAqIHN0YXRlIG9iamVjdHMgYXQgbXVsdGlwbGUgcGxhY2VzIHRocm91Z2hvdXQgYSBzZW50ZW5jZSwgYW5kIGFsc28gYWxsb3dzIHN0YXRlIHRvIGJlCisgKiBzaGFyZWQgYWNyb3NzIEtlbkxNcyBmb3IgdGhlIHNhbWUgc2VudGVuY2UuCisgKi8KK3N0cnVjdCBDaGFydCB7CisgIC8vIEEgY2FjaGUgZm9yIGFsbG9jYXRlZCBjaGFydCBvYmplY3RzCisgIFBvb2xIYXNoKiBwb29sSGFzaDsKKyAgLy8gUG9vbCB1c2VkIHRvIGFsbG9jYXRlIG5ldyBvbmVzCisgIHV0aWw6OlBvb2wqIHBvb2w7CisKKyAgQ2hhcnQoKSB7CisgICAgcG9vbEhhc2ggPSBuZXcgUG9vbEhhc2goKTsKKyAgICBwb29sID0gbmV3IHV0aWw6OlBvb2woKTsKKyAgfQorCisgIH5DaGFydCgpIHsKKyAgICBkZWxldGUgcG9vbEhhc2g7CisgICAgcG9vbC0+RnJlZUFsbCgpOworICAgIGRlbGV0ZSBwb29sOworICB9CisKKyAgbG06Om5ncmFtOjpDaGFydFN0YXRlKiBwdXQoY29uc3QgbG06Om5ncmFtOjpDaGFydFN0YXRlJiBzdGF0ZSkgeworICAgIHVpbnQ2NF90IGhhc2hWYWx1ZSA9IGxtOjpuZ3JhbTo6aGFzaF92YWx1ZShzdGF0ZSk7CisgIAorICAgIGlmIChwb29sSGFzaC0+ZmluZChoYXNoVmFsdWUpID09IHBvb2xIYXNoLT5lbmQoKSkgeworICAgICAgbG06Om5ncmFtOjpDaGFydFN0YXRlKiBwb2ludGVyID0gKGxtOjpuZ3JhbTo6Q2hhcnRTdGF0ZSAqKXBvb2wtPkFsbG9jYXRlKHNpemVvZihsbTo6bmdyYW06OkNoYXJ0U3RhdGUpKTsKKyAgICAgICpwb2ludGVyID0gc3RhdGU7CisgICAgICAoKnBvb2xIYXNoKVtoYXNoVmFsdWVdID0gcG9pbnRlcjsKKyAgICB9CisKKyAgICByZXR1cm4gKCpwb29sSGFzaClbaGFzaFZhbHVlXTsKKyAgfQorfTsKKworLy8gVm9jYWIgaWRzIGFib3ZlIHdoYXQgdGhlIHZvY2FidWxhcnkga25vd3MgYWJvdXQgYXJlIHVua25vd24gYW5kIHNob3VsZAorLy8gYmUgbWFwcGVkIHRvIHRoYXQuIAordm9pZCBNYXBBcnJheShjb25zdCBzdGQ6OnZlY3RvcjxsbTo6V29yZEluZGV4PiYgbWFwLCBqaW50ICpiZWdpbiwgamludCAqZW5kKSB7CisgIGZvciAoamludCAqaSA9IGJlZ2luOyBpIDwgZW5kOyArK2kpIHsKKyAgICAqaSA9IG1hcFsqaV07CisgIH0KK30KKworY2hhciAqUGllY2VDb3B5KGNvbnN0IFN0cmluZ1BpZWNlICZzdHIpIHsKKyAgY2hhciAqcmV0ID0gKGNoYXIqKSBtYWxsb2Moc3RyLnNpemUoKSArIDEpOworICBtZW1jcHkocmV0LCBzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKTsKKyAgcmV0W3N0ci5zaXplKCldID0gMDsKKyAgcmV0dXJuIHJldDsKK30KKworLy8gUmF0aGVyIHRoYW4gaGFuZGxlIHNldmVyYWwgZGlmZmVyZW50IGluc3RhbnRpYXRpb25zIG92ZXIgSk5JLCB3ZSdsbCBqdXN0CisvLyBkbyB2aXJ0dWFsIGNhbGxzIEMrKy1zaWRlLgorY2xhc3MgVmlydHVhbEJhc2UgeworcHVibGljOgorICB2aXJ0dWFsIH5WaXJ0dWFsQmFzZSgpIHsKKyAgfQorCisgIHZpcnR1YWwgZmxvYXQgUHJvYihqaW50ICpiZWdpbiwgamludCAqZW5kKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBmbG9hdCBQcm9iUnVsZShqbG9uZyAqYmVnaW4sIGpsb25nICplbmQsIGxtOjpuZ3JhbTo6Q2hhcnRTdGF0ZSYgc3RhdGUpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIGZsb2F0IFByb2JTdHJpbmcoamludCAqIGNvbnN0IGJlZ2luLCBqaW50ICogY29uc3QgZW5kLAorICAgICAgamludCBzdGFydCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgZmxvYXQgRXN0aW1hdGVSdWxlKGpsb25nICpiZWdpbiwgamxvbmcgKmVuZCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdWludDhfdCBPcmRlcigpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIGJvb2wgUmVnaXN0ZXJXb3JkKGNvbnN0IFN0cmluZ1BpZWNlJiB3b3JkLCBjb25zdCBpbnQgam9zaHVhX2lkKSA9IDA7CisKKyAgdm9pZCBSZW1lbWJlclJldHVybk1ldGhvZChqY2xhc3MgY2hhcnRfcGFpciwgam1ldGhvZElEIGNoYXJ0X3BhaXJfaW5pdCkgeworICAgIGNoYXJ0X3BhaXJfID0gY2hhcnRfcGFpcjsKKyAgICBjaGFydF9wYWlyX2luaXRfID0gY2hhcnRfcGFpcl9pbml0OworICB9CisKKyAgamNsYXNzIENoYXJ0UGFpcigpIGNvbnN0IHsgcmV0dXJuIGNoYXJ0X3BhaXJfOyB9CisgIGptZXRob2RJRCBDaGFydFBhaXJJbml0KCkgY29uc3QgeyByZXR1cm4gY2hhcnRfcGFpcl9pbml0XzsgfQorCitwcm90ZWN0ZWQ6CisgIFZpcnR1YWxCYXNlKCkgeworICB9CisKK3ByaXZhdGU6CisgIC8vIEhhY2s6IHRoZXNlIGFyZSByZW1lbWJlcmVkIHNvIHdlIGNhbiBhdm9pZCBsb29raW5nIHRoZW0gdXAgZXZlcnkgdGltZS4KKyAgamNsYXNzIGNoYXJ0X3BhaXJfOworICBqbWV0aG9kSUQgY2hhcnRfcGFpcl9pbml0XzsKK307CisKK3RlbXBsYXRlPGNsYXNzIE1vZGVsPiBjbGFzcyBWaXJ0dWFsSW1wbDogcHVibGljIFZpcnR1YWxCYXNlIHsKK3B1YmxpYzoKKyAgVmlydHVhbEltcGwoY29uc3QgY2hhciAqbmFtZSkgOgorICAgICAgbV8obmFtZSkgeworICAgIC8vIEluc2VydCB1bmtub3duIGlkIG1hcHBpbmcuCisgICAgbWFwXy5wdXNoX2JhY2soMCk7CisgIH0KKworICB+VmlydHVhbEltcGwoKSB7CisgIH0KKworICBmbG9hdCBQcm9iKGppbnQgKiBjb25zdCBiZWdpbiwgamludCAqIGNvbnN0IGVuZCkgY29uc3QgeworICAgIE1hcEFycmF5KG1hcF8sIGJlZ2luLCBlbmQpOworCisgICAgc3RkOjpyZXZlcnNlKGJlZ2luLCBlbmQgLSAxKTsKKyAgICBsbTo6bmdyYW06OlN0YXRlIGlnbm9yZWQ7CisgICAgcmV0dXJuIG1fLkZ1bGxTY29yZUZvcmdvdFN0YXRlKAorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGxtOjpXb3JkSW5kZXgqPihiZWdpbiksCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbG06OldvcmRJbmRleCo+KGVuZCAtIDEpLCAqKGVuZCAtIDEpLAorICAgICAgICBpZ25vcmVkKS5wcm9iOworICB9CisKKyAgZmxvYXQgUHJvYlJ1bGUoamxvbmcgKiBjb25zdCBiZWdpbiwgamxvbmcgKiBjb25zdCBlbmQsIGxtOjpuZ3JhbTo6Q2hhcnRTdGF0ZSYgc3RhdGUpIGNvbnN0IHsKKyAgICBpZiAoYmVnaW4gPT0gZW5kKSByZXR1cm4gMC4wOworICAgIGxtOjpuZ3JhbTo6UnVsZVNjb3JlPE1vZGVsPiBydWxlU2NvcmUobV8sIHN0YXRlKTsKKworICAgIGlmICgqYmVnaW4gPCAwKSB7CisgICAgICBydWxlU2NvcmUuQmVnaW5Ob25UZXJtaW5hbCgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBsbTo6bmdyYW06OkNoYXJ0U3RhdGUqPigtKmJlZ2luKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGxtOjpXb3JkSW5kZXggd29yZCA9IG1hcF9bKmJlZ2luXTsKKyAgICAgIGlmICh3b3JkID09IG1fLkdldFZvY2FidWxhcnkoKS5CZWdpblNlbnRlbmNlKCkpIHsKKyAgICAgICAgcnVsZVNjb3JlLkJlZ2luU2VudGVuY2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJ1bGVTY29yZS5UZXJtaW5hbCh3b3JkKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChqbG9uZyogaSA9IGJlZ2luICsgMTsgaSAhPSBlbmQ7IGkrKykgeworICAgICAgbG9uZyB3b3JkID0gKmk7CisgICAgICBpZiAod29yZCA8IDApCisgICAgICAgIHJ1bGVTY29yZS5Ob25UZXJtaW5hbCgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBsbTo6bmdyYW06OkNoYXJ0U3RhdGUqPigtd29yZCkpOworICAgICAgZWxzZQorICAgICAgICBydWxlU2NvcmUuVGVybWluYWwobWFwX1t3b3JkXSk7CisgICAgfQorICAgIHJldHVybiBydWxlU2NvcmUuRmluaXNoKCk7CisgIH0KKworICBmbG9hdCBFc3RpbWF0ZVJ1bGUoamxvbmcgKiBjb25zdCBiZWdpbiwgamxvbmcgKiBjb25zdCBlbmQpIGNvbnN0IHsKKyAgICBpZiAoYmVnaW4gPT0gZW5kKSByZXR1cm4gMC4wOworICAgIGxtOjpuZ3JhbTo6Q2hhcnRTdGF0ZSBudWxsU3RhdGU7CisgICAgbG06Om5ncmFtOjpSdWxlU2NvcmU8TW9kZWw+IHJ1bGVTY29yZShtXywgbnVsbFN0YXRlKTsKKworICAgIGlmICgqYmVnaW4gPCAwKSB7CisgICAgICBydWxlU2NvcmUuUmVzZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgbG06OldvcmRJbmRleCB3b3JkID0gbWFwX1sqYmVnaW5dOworICAgICAgaWYgKHdvcmQgPT0gbV8uR2V0Vm9jYWJ1bGFyeSgpLkJlZ2luU2VudGVuY2UoKSkgeworICAgICAgICBydWxlU2NvcmUuQmVnaW5TZW50ZW5jZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcnVsZVNjb3JlLlRlcm1pbmFsKHdvcmQpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGpsb25nKiBpID0gYmVnaW4gKyAxOyBpICE9IGVuZDsgaSsrKSB7CisgICAgICBsb25nIHdvcmQgPSAqaTsKKyAgICAgIGlmICh3b3JkIDwgMCkKKyAgICAgICAgcnVsZVNjb3JlLlJlc2V0KCk7CisgICAgICBlbHNlCisgICAgICAgIHJ1bGVTY29yZS5UZXJtaW5hbChtYXBfW3dvcmRdKTsKKyAgICB9CisgICAgcmV0dXJuIHJ1bGVTY29yZS5GaW5pc2goKTsKKyAgfQorCisgIGZsb2F0IFByb2JTdHJpbmcoamludCAqIGNvbnN0IGJlZ2luLCBqaW50ICogY29uc3QgZW5kLCBqaW50IHN0YXJ0KSBjb25zdCB7CisgICAgTWFwQXJyYXkobWFwXywgYmVnaW4sIGVuZCk7CisKKyAgICBmbG9hdCBwcm9iOworICAgIGxtOjpuZ3JhbTo6U3RhdGUgc3RhdGU7CisgICAgaWYgKHN0YXJ0ID09IDApIHsKKyAgICAgIHByb2IgPSAwOworICAgICAgc3RhdGUgPSBtXy5OdWxsQ29udGV4dFN0YXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6cmV2ZXJzZShiZWdpbiwgYmVnaW4gKyBzdGFydCk7CisgICAgICBwcm9iID0gbV8uRnVsbFNjb3JlRm9yZ290U3RhdGUoCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBsbTo6V29yZEluZGV4Kj4oYmVnaW4pLAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbG06OldvcmRJbmRleCo+KGJlZ2luICsgc3RhcnQpLAorICAgICAgICAgIGJlZ2luW3N0YXJ0XSwgc3RhdGUpLnByb2I7CisgICAgICArK3N0YXJ0OworICAgIH0KKyAgICBsbTo6bmdyYW06OlN0YXRlIHN0YXRlMjsKKyAgICBmb3IgKGNvbnN0IGppbnQgKmkgPSBiZWdpbiArIHN0YXJ0OzspIHsKKyAgICAgIGlmIChpID49IGVuZCkKKyAgICAgICAgYnJlYWs7CisgICAgICBmbG9hdCBnb3QgPSBtXy5TY29yZShzdGF0ZSwgKmksIHN0YXRlMik7CisgICAgICBpKys7CisgICAgICBwcm9iICs9IGdvdDsKKyAgICAgIGlmIChpID49IGVuZCkKKyAgICAgICAgYnJlYWs7CisgICAgICBnb3QgPSBtXy5TY29yZShzdGF0ZTIsICppLCBzdGF0ZSk7CisgICAgICBpKys7CisgICAgICBwcm9iICs9IGdvdDsKKyAgICB9CisgICAgcmV0dXJuIHByb2I7CisgIH0KKworICB1aW50OF90IE9yZGVyKCkgY29uc3QgeworICAgIHJldHVybiBtXy5PcmRlcigpOworICB9CisKKyAgYm9vbCBSZWdpc3RlcldvcmQoY29uc3QgU3RyaW5nUGllY2UmIHdvcmQsIGNvbnN0IGludCBqb3NodWFfaWQpIHsKKyAgICBpZiAobWFwXy5zaXplKCkgPD0gam9zaHVhX2lkKSB7CisgICAgICBtYXBfLnJlc2l6ZShqb3NodWFfaWQgKyAxLCAwKTsKKyAgICB9CisgICAgYm9vbCBhbHJlYWR5X3ByZXNlbnQgPSBmYWxzZTsKKyAgICBpZiAobWFwX1tqb3NodWFfaWRdICE9IDApCisgICAgICBhbHJlYWR5X3ByZXNlbnQgPSB0cnVlOworICAgIG1hcF9bam9zaHVhX2lkXSA9IG1fLkdldFZvY2FidWxhcnkoKS5JbmRleCh3b3JkKTsKKyAgICByZXR1cm4gYWxyZWFkeV9wcmVzZW50OworICB9CisKK3ByaXZhdGU6CisgIE1vZGVsIG1fOworICBzdGQ6OnZlY3RvcjxsbTo6V29yZEluZGV4PiBtYXBfOworfTsKKworVmlydHVhbEJhc2UgKkNvbnN0cnVjdE1vZGVsKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkgeworICB1c2luZyBuYW1lc3BhY2UgbG06Om5ncmFtOworICBNb2RlbFR5cGUgbW9kZWxfdHlwZTsKKyAgaWYgKCFSZWNvZ25pemVCaW5hcnkoZmlsZV9uYW1lLCBtb2RlbF90eXBlKSkKKyAgICBtb2RlbF90eXBlID0gSEFTSF9QUk9CSU5HOworICBzd2l0Y2ggKG1vZGVsX3R5cGUpIHsKKyAgY2FzZSBQUk9CSU5HOgorICAgIHJldHVybiBuZXcgVmlydHVhbEltcGw8UHJvYmluZ01vZGVsPihmaWxlX25hbWUpOworICBjYXNlIFJFU1RfUFJPQklORzoKKyAgICByZXR1cm4gbmV3IFZpcnR1YWxJbXBsPFJlc3RQcm9iaW5nTW9kZWw+KGZpbGVfbmFtZSk7CisgIGNhc2UgVFJJRToKKyAgICByZXR1cm4gbmV3IFZpcnR1YWxJbXBsPFRyaWVNb2RlbD4oZmlsZV9uYW1lKTsKKyAgY2FzZSBBUlJBWV9UUklFOgorICAgIHJldHVybiBuZXcgVmlydHVhbEltcGw8QXJyYXlUcmllTW9kZWw+KGZpbGVfbmFtZSk7CisgIGNhc2UgUVVBTlRfVFJJRToKKyAgICByZXR1cm4gbmV3IFZpcnR1YWxJbXBsPFF1YW50VHJpZU1vZGVsPihmaWxlX25hbWUpOworICBjYXNlIFFVQU5UX0FSUkFZX1RSSUU6CisgICAgcmV0dXJuIG5ldyBWaXJ0dWFsSW1wbDxRdWFudEFycmF5VHJpZU1vZGVsPihmaWxlX25hbWUpOworICBkZWZhdWx0OgorICAgIFVUSUxfVEhST1coCisgICAgICAgIGxtOjpGb3JtYXRMb2FkRXhjZXB0aW9uLAorICAgICAgICAiVW5yZWNvZ25pemVkIGZpbGUgZm9ybWF0ICIgPDwgKHVuc2lnbmVkKSBtb2RlbF90eXBlCisgICAgICAgICAgICA8PCAiIGluIGZpbGUgIiA8PCBmaWxlX25hbWUpOworICB9Cit9CisKK30gLy8gbmFtZXNwYWNlCisKK2V4dGVybiAiQyIgeworCitKTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX2pvc2h1YV9kZWNvZGVyX2ZmX2xtX0tlbkxNX2NvbnN0cnVjdCgKKyAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqc3RyaW5nIGZpbGVfbmFtZSkgeworICBjb25zdCBjaGFyICpzdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGZpbGVfbmFtZSwgMCk7CisgIGlmICghc3RyKQorICAgIHJldHVybiAwOworCisgIFZpcnR1YWxCYXNlICpyZXQ7CisgIHRyeSB7CisgICAgcmV0ID0gQ29uc3RydWN0TW9kZWwoc3RyKTsKKworICAgIC8vIEdldCBhIGNsYXNzIHJlZmVyZW5jZSBmb3IgdGhlIHR5cGUgcGFpciB0aGF0IGNoYXIKKyAgICBqY2xhc3MgbG9jYWxfY2hhcnRfcGFpciA9IGVudi0+RmluZENsYXNzKCJqb3NodWEvZGVjb2Rlci9mZi9sbS9LZW5MTSRTdGF0ZVByb2JQYWlyIik7CisgICAgVVRJTF9USFJPV19JRighbG9jYWxfY2hhcnRfcGFpciwgdXRpbDo6RXhjZXB0aW9uLCAiRmFpbGVkIHRvIGZpbmQgam9zaHVhL2RlY29kZXIvZmYvbG0vS2VuTE0kU3RhdGVQcm9iUGFpciIpOworICAgIGpjbGFzcyBjaGFydF9wYWlyID0gKGpjbGFzcyllbnYtPk5ld0dsb2JhbFJlZihsb2NhbF9jaGFydF9wYWlyKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGxvY2FsX2NoYXJ0X3BhaXIpOworCisgICAgLy8gR2V0IHRoZSBNZXRob2QgSUQgb2YgdGhlIGNvbnN0cnVjdG9yIHdoaWNoIHRha2VzIGFuIGludAorICAgIGptZXRob2RJRCBjaGFydF9wYWlyX2luaXQgPSBlbnYtPkdldE1ldGhvZElEKGNoYXJ0X3BhaXIsICI8aW5pdD4iLCAiKEpGKVYiKTsKKyAgICBVVElMX1RIUk9XX0lGKCFjaGFydF9wYWlyX2luaXQsIHV0aWw6OkV4Y2VwdGlvbiwgIkZhaWxlZCB0byBmaW5kIGluaXQgbWV0aG9kIik7CisKKyAgICByZXQtPlJlbWVtYmVyUmV0dXJuTWV0aG9kKGNoYXJ0X3BhaXIsIGNoYXJ0X3BhaXJfaW5pdCk7CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uICZlKSB7CisgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICBhYm9ydCgpOworICB9CisgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGZpbGVfbmFtZSwgc3RyKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8amxvbmc+KHJldCk7Cit9CisKK0pOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qb3NodWFfZGVjb2Rlcl9mZl9sbV9LZW5MTV9kZXN0cm95KAorICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGpsb25nIHBvaW50ZXIpIHsKKyAgVmlydHVhbEJhc2UgKmJhc2UgPSByZWludGVycHJldF9jYXN0PFZpcnR1YWxCYXNlKj4ocG9pbnRlcik7CisgIGVudi0+RGVsZXRlR2xvYmFsUmVmKGJhc2UtPkNoYXJ0UGFpcigpKTsKKyAgZGVsZXRlIGJhc2U7Cit9CisKK0pOSUVYUE9SVCBsb25nIEpOSUNBTEwgSmF2YV9qb3NodWFfZGVjb2Rlcl9mZl9sbV9LZW5MTV9jcmVhdGVQb29sKAorICAgIEpOSUVudiAqZW52LCBqY2xhc3MpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZz4obmV3IENoYXJ0KCkpOworfQorCitKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfam9zaHVhX2RlY29kZXJfZmZfbG1fS2VuTE1fZGVzdHJveVBvb2woCisgICAgSk5JRW52ICplbnYsIGpjbGFzcywgamxvbmcgcG9pbnRlcikgeworICBDaGFydCogY2hhcnQgPSByZWludGVycHJldF9jYXN0PENoYXJ0Kj4ocG9pbnRlcik7CisgIGRlbGV0ZSBjaGFydDsKK30KKworSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2pvc2h1YV9kZWNvZGVyX2ZmX2xtX0tlbkxNX29yZGVyKAorICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGpsb25nIHBvaW50ZXIpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmlydHVhbEJhc2UqPihwb2ludGVyKS0+T3JkZXIoKTsKK30KKworSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9qb3NodWFfZGVjb2Rlcl9mZl9sbV9LZW5MTV9yZWdpc3RlcldvcmQoCisgICAgSk5JRW52ICplbnYsIGpjbGFzcywgamxvbmcgcG9pbnRlciwganN0cmluZyB3b3JkLCBqaW50IGlkKSB7CisgIGNvbnN0IGNoYXIgKnN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMod29yZCwgMCk7CisgIGlmICghc3RyKQorICAgIHJldHVybiBmYWxzZTsKKyAgamludCByZXQ7CisgIHRyeSB7CisgICAgcmV0ID0gcmVpbnRlcnByZXRfY2FzdDxWaXJ0dWFsQmFzZSo+KHBvaW50ZXIpLT5SZWdpc3RlcldvcmQoc3RyLCBpZCk7CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uICZlKSB7CisgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICBhYm9ydCgpOworICB9CisgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHdvcmQsIHN0cik7CisgIHJldHVybiByZXQ7Cit9CisKK0pOSUVYUE9SVCBqZmxvYXQgSk5JQ0FMTCBKYXZhX2pvc2h1YV9kZWNvZGVyX2ZmX2xtX0tlbkxNX3Byb2IoCisgICAgSk5JRW52ICplbnYsIGpjbGFzcywgamxvbmcgcG9pbnRlciwgamludEFycmF5IGFycikgeworICBqaW50IGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyKTsKKyAgaWYgKGxlbmd0aCA8PSAwKQorICAgIHJldHVybiAwLjA7CisgIC8vIEdDQyBvbmx5LgorICBqaW50IHZhbHVlc1tsZW5ndGhdOworICBlbnYtPkdldEludEFycmF5UmVnaW9uKGFyciwgMCwgbGVuZ3RoLCB2YWx1ZXMpOworCisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFZpcnR1YWxCYXNlKj4ocG9pbnRlciktPlByb2IodmFsdWVzLAorICAgICAgdmFsdWVzICsgbGVuZ3RoKTsKK30KKworSk5JRVhQT1JUIGpmbG9hdCBKTklDQUxMIEphdmFfam9zaHVhX2RlY29kZXJfZmZfbG1fS2VuTE1fcHJvYlN0cmluZygKKyAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqbG9uZyBwb2ludGVyLCBqaW50QXJyYXkgYXJyLCBqaW50IHN0YXJ0KSB7CisgIGppbnQgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnIpOworICBpZiAobGVuZ3RoIDw9IHN0YXJ0KQorICAgIHJldHVybiAwLjA7CisgIC8vIEdDQyBvbmx5LgorICBqaW50IHZhbHVlc1tsZW5ndGhdOworICBlbnYtPkdldEludEFycmF5UmVnaW9uKGFyciwgMCwgbGVuZ3RoLCB2YWx1ZXMpOworCisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFZpcnR1YWxCYXNlKj4ocG9pbnRlciktPlByb2JTdHJpbmcodmFsdWVzLAorICAgICAgdmFsdWVzICsgbGVuZ3RoLCBzdGFydCk7Cit9CisKK0pOSUVYUE9SVCBqb2JqZWN0IEpOSUNBTEwgSmF2YV9qb3NodWFfZGVjb2Rlcl9mZl9sbV9LZW5MTV9wcm9iUnVsZSgKKyAgSk5JRW52ICplbnYsIGpjbGFzcywgamxvbmcgcG9pbnRlciwgamxvbmcgY2hhcnRQdHIsIGpsb25nQXJyYXkgYXJyKSB7CisgIGppbnQgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnIpOworICAvLyBHQ0Mgb25seS4KKyAgamxvbmcgdmFsdWVzW2xlbmd0aF07CisgIGVudi0+R2V0TG9uZ0FycmF5UmVnaW9uKGFyciwgMCwgbGVuZ3RoLCB2YWx1ZXMpOworCisgIC8vIENvbXB1dGUgdGhlIHByb2JhYmlsaXR5CisgIGxtOjpuZ3JhbTo6Q2hhcnRTdGF0ZSBvdXRTdGF0ZTsKKyAgY29uc3QgVmlydHVhbEJhc2UgKmJhc2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFZpcnR1YWxCYXNlKj4ocG9pbnRlcik7CisgIGZsb2F0IHByb2IgPSBiYXNlLT5Qcm9iUnVsZSh2YWx1ZXMsIHZhbHVlcyArIGxlbmd0aCwgb3V0U3RhdGUpOworCisgIENoYXJ0KiBjaGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hhcnQqPihjaGFydFB0cik7CisgIGxtOjpuZ3JhbTo6Q2hhcnRTdGF0ZSogb3V0U3RhdGVQdHIgPSBjaGFydC0+cHV0KG91dFN0YXRlKTsKKworICAvLyBDYWxsIGJhY2sgY29uc3RydWN0b3IgdG8gYWxsb2NhdGUgYSBuZXcgaW5zdGFuY2UsIHdpdGggYW4gaW50IGFyZ3VtZW50CisgIHJldHVybiBlbnYtPk5ld09iamVjdChiYXNlLT5DaGFydFBhaXIoKSwgYmFzZS0+Q2hhcnRQYWlySW5pdCgpLCAobG9uZylvdXRTdGF0ZVB0ciwgcHJvYik7Cit9CisKK0pOSUVYUE9SVCBqZmxvYXQgSk5JQ0FMTCBKYXZhX2pvc2h1YV9kZWNvZGVyX2ZmX2xtX0tlbkxNX2VzdGltYXRlUnVsZSgKKyAgSk5JRW52ICplbnYsIGpjbGFzcywgamxvbmcgcG9pbnRlciwgamxvbmdBcnJheSBhcnIpIHsKKyAgamludCBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycik7CisgIC8vIEdDQyBvbmx5LgorICBqbG9uZyB2YWx1ZXNbbGVuZ3RoXTsKKyAgZW52LT5HZXRMb25nQXJyYXlSZWdpb24oYXJyLCAwLCBsZW5ndGgsIHZhbHVlcyk7CisKKyAgLy8gQ29tcHV0ZSB0aGUgcHJvYmFiaWxpdHkKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmlydHVhbEJhc2UqPihwb2ludGVyKS0+RXN0aW1hdGVSdWxlKHZhbHVlcywKKyAgICAgIHZhbHVlcyArIGxlbmd0aCk7Cit9CisKK30gLy8gZXh0ZXJuCmRpZmYgLS1naXQgYS9saWIvY29sbGVjdGlvbnMtZ2VuZXJpYy00LjAxLmphciBiL2xpYi9jb2xsZWN0aW9ucy1nZW5lcmljLTQuMDEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQwMDljLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2xsZWN0aW9ucy1nZW5lcmljLTQuMDEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2l2eS54bWwgYi9saWIvaXZ5LnhtbAppbmRleCBhYmFiYWRhLi5iZWQyZDg0IDEwMDY0NAotLS0gYS9saWIvaXZ5LnhtbAorKysgYi9saWIvaXZ5LnhtbApAQCAtMiwxOSArMiwxNCBAQAogICA8aW5mbyBvcmdhbmlzYXRpb249Impvc2h1YSIgbW9kdWxlPSJqb3NodWEiLz4KICAgPGRlcGVuZGVuY2llcz4KICAgICA8ZGVwZW5kZW5jeSBvcmc9Im5ldC5zb3VyY2Vmb3JnZS5hbnQtZG94eWdlbiIgbmFtZT0iYW50LWRveHlnZW4iIHJldj0iMS42LjEiIC8+Ci0gICAgPGRlcGVuZGVuY3kgb3JnPSJhc20iIG5hbWU9ImFzbSIgcmV2PSIzLjEiLz4KLSAgICA8ZGVwZW5kZW5jeSBvcmc9ImNvbS5hbWF6b25hd3MiIG5hbWU9ImF3cy1qYXZhLXNkayIgcmV2PSIxLjEuMyIvPgotICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS5jb21tb25zIiBuYW1lPSJjb21tb25zLWNsaSIgcmV2PSIxLjIiLz4KLSAgICA8ZGVwZW5kZW5jeSBvcmc9ImNvbW1vbnMtbG9nZ2luZyIgbmFtZT0iY29tbW9ucy1sb2dnaW5nIiByZXY9IjEuMS4xIi8+Ci0gICAgPGRlcGVuZGVuY3kgb3JnPSJqYXhlbiIgbmFtZT0iamF4ZW4iIHJldj0iMS4xLjEiLz4KICAgICA8ZGVwZW5kZW5jeSBvcmc9Im5ldC5zZi5qdW5nIiBuYW1lPSJqdW5nLWFsZ29yaXRobXMiIHJldj0iMi4wIi8+CiAgICAgPGRlcGVuZGVuY3kgb3JnPSJuZXQuc2YuanVuZyIgbmFtZT0ianVuZy1hcGkiIHJldj0iMi4wIi8+CiAgICAgPGRlcGVuZGVuY3kgb3JnPSJuZXQuc2YuanVuZyIgbmFtZT0ianVuZy1ncmFwaC1pbXBsIiByZXY9IjIuMCIvPgogICAgIDxkZXBlbmRlbmN5IG9yZz0ibmV0LnNmLmp1bmciIG5hbWU9Imp1bmctdmlzdWFsaXphdGlvbiIgcmV2PSIyLjAiLz4KLSAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUuaGFkb29wIiBuYW1lPSJoYWRvb3AtY29yZSIgcmV2PSIwLjIwLjIwMy4wIi8+CisgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuYXBhY2hlLmNvbW1vbnMiIG5hbWU9ImNvbW1vbnMtY2xpIiByZXY9IjEuMiIvPgogICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLnRlc3RuZyIgbmFtZT0idGVzdG5nIiByZXY9IjYuNyIvPgotICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLm1vY2tpdG8iIG5hbWU9Im1vY2tpdG8tYWxsIiByZXY9IjEuOS41Ii8+Ci0gICAgPGRlcGVuZGVuY3kgb3JnPSJwbWQiIG5hbWU9InBtZCIgcmV2PSI0LjIuNSIvPgogICAgIDxkZXBlbmRlbmN5IG9yZz0ianVuaXQiICBuYW1lPSJqdW5pdCIgcmV2PSI0LjEwIiAvPgorICAgIDxkZXBlbmRlbmN5IG9yZz0ibmV0LnNvdXJjZWZvcmdlLmNvbGxlY3Rpb25zIiBuYW1lPSJjb2xsZWN0aW9ucy1nZW5lcmljIiByZXY9IjQuMDEiLz4KKyAgICA8ZGVwZW5kZW5jeSBvcmc9ImFyZ3M0aiIgbmFtZT0iYXJnczRqIiByZXY9IjIuMC4yOSIgLz4KICAgPC9kZXBlbmRlbmNpZXM+CiA8L2l2eS1tb2R1bGU+CmRpZmYgLS1naXQgYS9saWIvaXZ5c2V0dGluZ3MueG1sIGIvbGliL2l2eXNldHRpbmdzLnhtbAppbmRleCA2ZGFkZDNkLi5hNmZkNjM1IDEwMDY0NAotLS0gYS9saWIvaXZ5c2V0dGluZ3MueG1sCisrKyBiL2xpYi9pdnlzZXR0aW5ncy54bWwKQEAgLTksNyArOSw3IEBACiAgICAgICA8L2ZpbGVzeXN0ZW0+CiAgICAgICA8aWJpYmxpbyBuYW1lPSJjZW50cmFsIiBtMmNvbXBhdGlibGU9InRydWUiLz4KICAgICAgIDxpYmlibGlvIG5hbWU9InRvb2xzLmdiaWYub3JnIiBtMmNvbXBhdGlibGU9InRydWUiIHJvb3Q9Imh0dHA6Ly90b29scy5nYmlmLm9yZy9tYXZlbi9yZXBvc2l0b3J5LyIgLz4KLSAgICAgIDxwYWNrYWdlciBuYW1lPSJyb3VuZHVwIiBidWlsZFJvb3Q9IiR7ZW52LkpPU0hVQX0vbGliL3BhY2thZ2VyL2J1aWxkIiByZXNvdXJjZUNhY2hlPSIke2Vudi5KT1NIVUF9L2xpYi9jYWNoZSI+CisgICAgICA8cGFja2FnZXIgbmFtZT0icm91bmR1cCIgYnVpbGRSb290PSIke0pPU0hVQX0vbGliL3BhY2thZ2VyL2J1aWxkIiByZXNvdXJjZUNhY2hlPSIke0pPU0hVQX0vbGliL2NhY2hlIj4KICAgICAgICAgPGl2eSBwYXR0ZXJuPSJodHRwOi8vaXZ5cm91bmR1cC5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvcmVwby9tb2R1bGVzL1tvcmdhbmlzYXRpb25dL1ttb2R1bGVdL1tyZXZpc2lvbl0vaXZ5LnhtbCIvPgogICAgICAgICA8YXJ0aWZhY3QgcGF0dGVybj0iaHR0cDovL2l2eXJvdW5kdXAuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL3JlcG8vbW9kdWxlcy9bb3JnYW5pc2F0aW9uXS9bbW9kdWxlXS9bcmV2aXNpb25dL3BhY2thZ2VyLnhtbCIvPgogICAgICAgPC9wYWNrYWdlcj4KZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNGFhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9wb20ueG1sCkBAIC0wLDAgKzEsMTI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICAgQXBhY2hlIE1hdmVuIDIgUE9NIGdlbmVyYXRlZCBieSBBcGFjaGUgSXZ5CisgICBodHRwOi8vYW50LmFwYWNoZS5vcmcvaXZ5LworICAgQXBhY2hlIEl2eSB2ZXJzaW9uOiAyLjIuMCAyMDEwMDkyMzIzMDYyMworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPGdyb3VwSWQ+am9zaHVhPC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD5qb3NodWE8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgIDx2ZXJzaW9uPjYuMC40PC92ZXJzaW9uPgorICA8YnVpbGQ+CisgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4xPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c291cmNlPjEuODwvc291cmNlPgorICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8IS0tIDxkZXBlbmRlbmN5PiAtLT4KKyAgICA8IS0tICAgPGdyb3VwSWQ+bmV0LnNvdXJjZWZvcmdlLmFudC1kb3h5Z2VuPC9ncm91cElkPiAtLT4KKyAgICA8IS0tICAgPGFydGlmYWN0SWQ+YW50LWRveHlnZW48L2FydGlmYWN0SWQ+IC0tPgorICAgIDwhLS0gICA8dmVyc2lvbj4xLjYuMTwvdmVyc2lvbj4gLS0+CisgICAgPCEtLSAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4gLS0+CisgICAgPCEtLSA8L2RlcGVuZGVuY3k+IC0tPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+ZWR1LmJlcmtlbGV5Lm5scDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmJlcmtlbGV5bG08L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5hc208L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5hc208L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjE8L3ZlcnNpb24+CisgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmFtYXpvbmF3czwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmF3cy1qYXZhLXNkazwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMS4zPC92ZXJzaW9uPgorICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0gICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+IC0tPgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jbGk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNsaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDwhLS0gICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+IC0tPgorICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgorICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmpheGVuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amF4ZW48L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KKyAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5uZXQuc2YuanVuZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bmctYWxnb3JpdGhtczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5uZXQuc2YuanVuZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bmctYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm5ldC5zZi5qdW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuZy1ncmFwaC1pbXBsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm5ldC5zZi5qdW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuZy12aXN1YWxpemF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaGFkb29wPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aGFkb29wLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4wLjIwLjIwMy4wPC92ZXJzaW9uPgorICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy50ZXN0bmc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD50ZXN0bmc8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj42Ljc8L3ZlcnNpb24+CisgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tb2NraXRvLWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuOS41PC92ZXJzaW9uPgorICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPnBtZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBtZDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjQuMi41PC92ZXJzaW9uPgorICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjEwPC92ZXJzaW9uPgorICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvcHktY29uZmlnLnBsIGIvc2NyaXB0cy9jb3B5LWNvbmZpZy5wbAppbmRleCA4NjdiNDcwLi4yYmI0NGYwIDEwMDc1NQotLS0gYS9zY3JpcHRzL2NvcHktY29uZmlnLnBsCisrKyBiL3NjcmlwdHMvY29weS1jb25maWcucGwKQEAgLTI2LDcgKzI2LDcgQEAKICMgU3RlcCAxLiBwcm9jZXNzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGtleS92YWx1ZSBwYWlycy4gIFRoZSBrZXlzIGFyZSBtYXRjaGVkIG5leHQgdG8gdGhlCiAjIGNvbmZpZyBmaWxlIGFuZCB0aGUgY29uZmlnZmlsZSB2YWx1ZXMgcmVwbGFjZWQgd2l0aCB0aG9zZSBmb3VuZCBvbiB0aGUgY29tbWFuZC1saW5lLgogCi1teSAoJXBhcmFtcywld2VpZ2h0cyxAZmVhdHVyZXMpOworbXkgKCVwYXJhbXMsJXdlaWdodHMsJWZlYXR1cmVzKTsKIHdoaWxlIChteSAka2V5ID0gc2hpZnQgQEFSR1YpIHsKICAgIyBtYWtlIHN1cmUgdGhlIHBhcmFtZXRlciBoYXMgYSBsZWFkaW5nIGRhc2gKICAgaWYgKCRrZXkgIX4gL14tLykgewpAQCAtNDMsNyArNDMsNyBAQAogCiAgICMgLWZlYXR1cmUtZnVuY3Rpb24gbGluZXMgYXJlIGdhdGhlcmVkLCBvdGhlciBrZXlzIGNhbiBiZSBwcmVzZW50IG9ubHkgb25jZQogICBpZiAoJGtleSBlcSAiZmVhdHVyZWZ1bmN0aW9uIikgewotICAgIHB1c2goQGZlYXR1cmVzLCAkdmFsdWUpOworICAgICRmZWF0dXJlc3skdmFsdWV9ID0gJHZhbHVlOwogICB9IGVsc2lmICgka2V5IGVxICJ3ZWlnaHRzIikgewogICAgIG15IEB0b2tlbnMgPSBzcGxpdCgnICcsICR2YWx1ZSk7CiAgICAgZm9yIChteSAkaSA9IDA7ICRpIDwgQHRva2VuczsgJGkgKz0gMikgewpAQCAtMTA1LDYgKzEwNSwxMyBAQAogICAgICAgfQogICAgIH0KIAorICAgICMgSWYgYW4gZXhhY3QgZmVhdHVyZSBmdW5jdGlvbiBsaW5lIGlzIGluIHRoZSBjb25maWcgZmlsZSwgZGVsZXRlCisgICAgIyBpdCBmcm9tIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHNvIGl0IGRvZXNuJ3QgZ2V0IHByaW50ZWQKKyAgICAjIGxhdGVyLiBBbGwgZmVhdHVyZXMgbm90IGZvdW5kIGluIHRoZSBjb25maWcgZmlsZSBhcmUgYXBwZW5kZWQuCisgICAgaWYgKCRub3JtX2tleSBlcSAiZmVhdHVyZWZ1bmN0aW9uIiBhbmQgZXhpc3RzICRmZWF0dXJlc3skdmFsdWV9KSB7CisgICAgICBkZWxldGUgJGZlYXR1cmVzeyR2YWx1ZX07CisgICAgfQorCiAgICAgIyBpZiB0aGUgcGFyYW1ldGVyIHdhcyBmb3VuZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBwcmludCBvdXQgaXRzIHJlcGxhY2VkIHZhbHVlCiAgICAgaWYgKGV4aXN0cyAkcGFyYW1zeyRub3JtX2tleX0pIHsKICAgICAgIHByaW50ICIka2V5ID0gIiAuICRwYXJhbXN7JG5vcm1fa2V5fSAuICJcbiI7CkBAIC0xMzAsMTMgKzEzNywxNCBAQAogaWYgKHNjYWxhcihrZXlzKCVwYXJhbXMpKSkgewogICBwcmludCAkLzsKICAgZm9yZWFjaCBteSAka2V5IChrZXlzICVwYXJhbXMpIHsKKyAgICBuZXh0IGlmICRrZXkgPX4gL150bS87ICMgc2tpcCB1bnVzZWQgdG0gZmxhZ3MKICAgICBwcmludCBTVERFUlIgIiogV0FSTklORzogbm8ga2V5ICcka2V5JyBmb3VuZCBpbiBjb25maWcgZmlsZSAoYXBwZW5kaW5nIHRvIGVuZClcbiI7CiAgICAgcHJpbnQgIiRrZXkgPSAkcGFyYW1zeyRrZXl9XG4iOwogICB9CiB9CiAKICMgcHJpbnQgb3V0IHRoZSBmZWF0dXJlIGZ1bmN0aW9ucwotbWFwIHsgcHJpbnQgImZlYXR1cmUtZnVuY3Rpb24gPSAkX1xuIiB9IEBmZWF0dXJlczsKK21hcCB7IHByaW50ICJmZWF0dXJlLWZ1bmN0aW9uID0gJF9cbiIgfSAoa2V5cyAlZmVhdHVyZXMpOwogcHJpbnQgJC87CiAKICMgUHJpbnQgb3V0IHRoZSB3ZWlnaHRzCmRpZmYgLS1naXQgYS9zY3JpcHRzL2ZlYXR1cmVzL2FkZFNwYXJzZUZlYXR1cmVzLnB5IGIvc2NyaXB0cy9mZWF0dXJlcy9hZGRTcGFyc2VGZWF0dXJlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNzExZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9mZWF0dXJlcy9hZGRTcGFyc2VGZWF0dXJlcy5weQpAQCAtMCwwICsxLDg1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IHN5cworaW1wb3J0IGd6aXAKK2ltcG9ydCBhcmdwYXJzZQorCitwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigiQWRkcyBzcGFyc2UgZmVhdHVyZXMgdG8gYSBNb3NlcyB0dGFibGUiKQorcGFyc2VyLmFkZF9hcmd1bWVudCgiLXAiLCAiLS10dGFibGUiLCBkZXN0PSJmaWx0ZXJlZFBUIiwgaGVscD0iQSBwaHJhc2UgdGFibGUsIHByZWZlcmFibHkgYSBmaWx0ZXJlZCBvbmUiKQorcGFyc2VyLmFkZF9hcmd1bWVudCgiLW8iLCAiLS1vdXRwdXQiLCBkZXN0PSJmZWF0dXJpemVkUFQiLCBoZWxwPSJUaGUgbG9jYXRpb24gb2YgdGhlIG91dHB1dCB0dGFibGUiLCBkZWZhdWx0PSJ0dW5pbmcvZmlsdGVyZWQuMS9waHJhc2UtdGFibGUuZnQuMC0wLjEuMS5neiIpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCItZiIsICItLXNwYXJzZV9mIiwgZGVzdD0ic3BhcnNlRiIsIGhlbHA9IlNvdXJjZSBzcGFyc2UgZmVhdHVyZXMiLCBkZWZhdWx0PSJtb2RlbC9zcGFyc2UtZmVhdHVyZXMuMS5lbi50b3AxMDAwIikKK3BhcnNlci5hZGRfYXJndW1lbnQoIi1lIiwgIi0tc3BhcnNlX2UiLCBkZXN0PSJzcGFyc2VFIiwgaGVscD0iVGFyZ2V0IHNwYXJzZSBmZWF0dXJlcyIsIGRlZmF1bHQ9Im1vZGVsL3NwYXJzZS1mZWF0dXJlcy4xLmVzLnRvcDEwMDAiKQorb3B0cyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworaWYgb3B0cy5maWx0ZXJlZFBUIGlzIE5vbmU6CisgICAgcGFyc2VyLnByaW50X2hlbHAoKQorICAgIHN5cy5leGl0KCkKKworZmlsdGVyZWRQVCA9IG9wdHMuZmlsdGVyZWRQVAorZmVhdHVyaXplZFBUID0gZ3ppcC5vcGVuKG9wdHMuZmVhdHVyaXplZFBULCAnd2InKQorc3BhcnNlRSA9IG9wdHMuc3BhcnNlRQorc3BhcnNlRiA9IG9wdHMuc3BhcnNlRgorCitmZWF0c0UgPSBbXQorZmVhdHNGID0gW10KKworIyBGaXJzdCByZWFkIG9mZiB0aGUgc3BhcnNlIGZlYXR1cmVzIGFuZCBzdG9yZSB0aGVtCit3aXRoIG9wZW4oc3BhcnNlRSkgYXMgc0U6CisgICAgZm9yIGxpbmUgaW4gc0U6CisgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgZmVhdHNFLmFwcGVuZChsaW5lKQord2l0aCBvcGVuKHNwYXJzZUYpIGFzIHNGOgorICAgIGZvciBsaW5lIGluIHNGOgorICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgIGZlYXRzRi5hcHBlbmQobGluZSkKKword3QgPSBzZXQoKQorcGhyYXNlV1QgPSBbXQorCitwdCA9IGd6aXAub3BlbihmaWx0ZXJlZFBULCAncmInKQorZm9yIGxpbmUgaW4gcHQ6CisgICAgbGluZUNvbXAgPSBsaW5lLnNwbGl0KCJ8fHwiKQorICAgIGFzc2VydCBsZW4obGluZUNvbXApID4gMworICAgIHNQaHJhc2UgPSBsaW5lQ29tcFswXS5zdHJpcCgpLnNwbGl0KCkKKyAgICB0UGhyYXNlID0gbGluZUNvbXBbMV0uc3RyaXAoKS5zcGxpdCgpCisgICAgYWxpZ25tZW50ID0gbGluZUNvbXBbM10uc3RyaXAoKS5zcGxpdCgpCisgICAgIyBDYWNoZSBwaHJhc2UgZmVhdHVyZXMgZm9yIHVzZSBsYXRlcgorICAgIGxvY2FsV1QgPSBzZXQoKQorICAgICMgUmVhZCBhbGlnbWVudCBpbmZvbWF0aW9uCisgICAgZm9yIGl0ZW0gaW4gYWxpZ25tZW50OgorICAgICAgICBpdGVtID0gaXRlbS5zcGxpdCgiLSIpCisgICAgICAgICMgQWRkIHNlZW4gd29yZCB0cmFuc2xhdGlvbnMgdG8gYSBzZXQKKyAgICAgICAgIyBpZiB0aGV5IHdlcmUgc2VlbiBpbiB0aGUgbGV4aWNhbCBmZWF0dXJlcworICAgICAgICBzV29yZCA9IHNQaHJhc2VbaW50KGl0ZW1bMF0pXQorICAgICAgICB0V29yZCA9IHRQaHJhc2VbaW50KGl0ZW1bMV0pXQorICAgICAgICBpZiBzV29yZCBpbiBmZWF0c0YgYW5kIHRXb3JkIGluIGZlYXRzRToKKyAgICAgICAgICAgIHd0LmFkZCgoc1dvcmQsIHRXb3JkKSkKKyAgICAgICAgICAgIGxvY2FsV1QuYWRkKChzV29yZCwgdFdvcmQpKQorCisgICAgcGhyYXNlV1QuYXBwZW5kKGxvY2FsV1QpCisKK3B0LnNlZWsoMCkKKyMgQ29udmVydCB0byBhIGxpc3QKK3d0ID0gbGlzdCh3dCkKK2ZvciBpLCBsaW5lIGluIGVudW1lcmF0ZShwdCk6CisgICAgbGluZUNvbXAgPSBsaW5lLnNwbGl0KCJ8fHwiKQorICAgIGFzc2VydCBsZW4obGluZUNvbXApID4gMworICAgIHNQaHJhc2UgPSBsaW5lQ29tcFswXS5zdHJpcCgpLnNwbGl0KCkKKyAgICB0UGhyYXNlID0gbGluZUNvbXBbMV0uc3RyaXAoKS5zcGxpdCgpCisgICAgIyBMZXhpY2FsIHNwYXJzZSBmZWF0dXJlcworICAgICMgU0QgPSBTb3VyY2Ugd29yZCBkZWxldGlvbiwgVEkgPSB0YXJnZXQgd29yZCBkZWxldGlvbgorICAgICMgV1QgPSB3b3JkIHRyYW5zbGF0aW9uCisgICAgc2RfZmVhdHVyZXMgPSBbIlNEXyIrdG9rZW4rIj0xIiBmb3IgdG9rZW4gaW4gc1BocmFzZSBpZiB0b2tlbiBpbiBmZWF0c0ZdCisgICAgdGlfZmVhdHVyZXMgPSBbIlRJXyIrdG9rZW4rIj0xIiBmb3IgdG9rZW4gaW4gdFBocmFzZSBpZiB0b2tlbiBpbiBmZWF0c0VdCisgICAgd3RfZmVhdHVyZXMgPSBbXQorICAgIGZvciBmZWF0IGluIHBocmFzZVdUW2ldOgorICAgICAgICB3dF9mZWF0dXJlcy5hcHBlbmQoIldUXyIgKyBmZWF0WzBdICsgIn4iICsgZmVhdFsxXSArICI9MSIpCisKKyAgICBhbGxfZmVhdHMgPSBzZF9mZWF0dXJlcyArIHRpX2ZlYXR1cmVzICsgd3RfZmVhdHVyZXMKKyAgICAjIHd0X2ZlYXR1cmVzID0gWyIxIiBpZiBmZWF0IGluIHBocmFzZVdUW2ldIGVsc2UgIjAiIGZvciBmZWF0IGluIHd0XQorICAgIGxpbmVDb21wWzJdICs9ICIgIi5qb2luKGFsbF9mZWF0cykgKyAiICIKKyAgICBmZWF0dXJpemVkUFQud3JpdGUoInx8fCIuam9pbihsaW5lQ29tcCkpCisgICAgc3lzLnN0ZG91dC53cml0ZSgiXHIlZiUlIiAlIChmbG9hdChpICogMTAwKS9sZW4ocGhyYXNlV1QpKSkKKyAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKworZmVhdHVyaXplZFBULmNsb3NlKCkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc3VwcG9ydC9ncmFtbWFyLXBhY2tlci5wbCBiL3NjcmlwdHMvc3VwcG9ydC9ncmFtbWFyLXBhY2tlci5wbAppbmRleCA2NmI0ZDBmLi41MzNiY2FlIDEwMDc1NQotLS0gYS9zY3JpcHRzL3N1cHBvcnQvZ3JhbW1hci1wYWNrZXIucGwKKysrIGIvc2NyaXB0cy9zdXBwb3J0L2dyYW1tYXItcGFja2VyLnBsCkBAIC0yMCw2MCArMjAsODAgQEAKIHVzZSBGaWxlOjpCYXNlbmFtZSBxdy9iYXNlbmFtZS87CiAKIG15ICVvcHRzID0gKAorICBnID0+ICcnLCAgICAgICAgIyBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBncmFtbWFycyB0byBwYWNrCisgIG8gPT4gJycsICAgICAgICAjIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGdyYW1tYXIgb3V0cHV0IGRpcmVjdG9yaWVzCiAgIG0gPT4gJzhnJywgICAgICAjIGFtb3VudCBvZiBtZW1vcnkgdG8gZ2l2ZSB0aGUgcGFja2VyCiAgIFQgPT4gJy90bXAnLCAgICAjIGxvY2F0aW9uIG9mIHRlbXBvcmFyeSBzcGFjZQogICB2ID0+IDAsICAgICAgICAgIyB2ZXJib3NlCiApOwotZ2V0b3B0cygibTpUOnYiLCBcJW9wdHMpOworZ2V0b3B0cygibTpUOnZnOm86IiwgXCVvcHRzKSB8fCBkaWUgdXNhZ2UoKTsKIAogbXkgJEpPU0hVQSA9ICRFTlZ7Sk9TSFVBfSBvciBkaWUgInlvdSBtdXN0IGRlZmluZWQgXCRKT1NIVUEiOwogbXkgJENBVCAgICA9ICIkSk9TSFVBL3NjcmlwdHMvdHJhaW5pbmcvc2NhdCI7CiAKIHN1YiB1c2FnZSB7Ci0gIHByaW50ICJVc2FnZTogZ3JhbW1hci1wYWNrZXIucGwgWy1tIE1FTV0gWy1UIC9wYXRoL3RvL3RtcF0gaW5wdXQtZ3JhbW1hciBbb3V0cHV0LWRpcj1ncmFtbWFyLnBhY2tlZF1cbiI7CisgIHByaW50ICJVc2FnZTogZ3JhbW1hci1wYWNrZXIucGwgWy1tIE1FTV0gWy1UIC9wYXRoL3RvL3RtcF0gLWcgJ2dyYW1tYXIgW2dyYW1tYXIyIC4uLl0nIC1vICdncmFtbWFyLnBhY2tlZCBbZ3JhbW1hcjIucGFja2VkIC4uLl0nXG4iOwogICBleGl0IDE7CiB9CiAKLW15ICRncmFtbWFyID0gc2hpZnQgb3IgdXNhZ2UoKTsKLW15ICRvdXRwdXRfZGlyID0gc2hpZnQgfHwgImdyYW1tYXIucGFja2VkIjsKK215IEBncmFtbWFycyA9IHNwbGl0KCcgJywgJG9wdHN7Z30pOworbXkgQG91dHB1dHMgPSBzcGxpdCgnICcsICRvcHRze299KTsKIAotaWYgKCEgLWUgJGdyYW1tYXIpIHsKLSAgcHJpbnQgIiogRkFUQUw6IENhbid0IGZpbmQgZ3JhbW1hciAnJGdyYW1tYXInXG4iOwotICBleGl0IDE7CisjIG1ha2Ugc3VyZSBvdXRwdXRzIGlzIHNhbWUgc2l6ZSBhcyBpbnB1dHMsIG9yIDAKK2RpZSB1c2FnZSgpIGlmIChzY2FsYXIoQG91dHB1dHMpICE9IDAgJiYgc2NhbGFyKEBvdXRwdXRzKSAhPSBzY2FsYXIoQGdyYW1tYXJzKSk7CisKKyMgaWYgbm8gb3V0cHV0cyBnaXZlbiwgZ2VuZXJhdGUgZGVmYXVsdCBuYW1lcworaWYgKHNjYWxhcihAb3V0cHV0cykgPCBzY2FsYXIoQGdyYW1tYXJzKSkgeworICBmb3IgKG15ICRpID0gMTsgJGkgPCBAZ3JhbW1hcnM7ICRpKyspIHsKKyAgICBwdXNoKEBvdXRwdXRzLCAkaSA9PSAxID8gImdyYW1tYXIucGFja2VkIiA6ICJncmFtbWFyJGkucGFja2VkIik7CisgIH0KIH0KIAotIyBTb3J0IHRoZSBncmFtbWFyIG9yIHBocmFzZSB0YWJsZQotbXkgJG5hbWUgPSBiYXNlbmFtZSgkZ3JhbW1hcik7Ci1teSAodW5kZWYsJHNvcnRlZF9ncmFtbWFyKSA9IHRlbXBmaWxlKCIke25hbWV9WFhYWCIsIERJUiA9PiAkb3B0c3tUfSwgVU5MSU5LID0+IDEpOwotcHJpbnQgU1RERVJSICJTb3J0aW5nIGdyYW1tYXIgdG8gJHNvcnRlZF9ncmFtbWFyLi4uXG4iIGlmICRvcHRze3Z9OwotCi0jIFdlIG5lZWQgdG8gc29ydCBieSBzb3VyY2Ugc2lkZSwgd2hpY2ggaXMgZmllbGQgMCAoZm9yIHBocmFzZSB0YWJsZXMgbm90IGxpc3RpbmcgdGhlIExIUykKLSMgb3IgZmllbGQgMSAoY29udmVudGlvbiwgVGhyYXggZm9ybWF0KQotY2hvbXAobXkgJGZpcnN0X2xpbmUgPSBgJENBVCAkZ3JhbW1hciB8IGhlYWQgLW4xYCk7Ci1pZiAoJGZpcnN0X2xpbmUgPX4gL15cWy8pIHsKLSAgIyByZWd1bGFyIGdyYW1tYXIKLSAgaWYgKHN5c3RlbSgiJENBVCAkZ3JhbW1hciB8IHNvcnQgLWszLDMgLS1idWZmZXItc2l6ZT0kb3B0c3ttfSAtVCAkb3B0c3tUfSB8IGd6aXAgLTluID4gJHNvcnRlZF9ncmFtbWFyIikpIHsKLSAgICBwcmludCBTVERFUlIgIiogRkFUQUw6IENvdWxkbid0IHNvcnQgdGhlIGdyYW1tYXIgKG5vdCBlbm91Z2ggbWVtb3J5PyBzaG9ydCBvbiB0bXAgc3BhY2U/KVxuIjsKLSAgICBleGl0IDI7CitteSAkZ3JhbW1hcl9ubyA9IDA7CitteSBAc29ydGVkX2dyYW1tYXJzOworZm9yZWFjaCBteSAkZ3JhbW1hciAoQGdyYW1tYXJzKSB7CisgICRncmFtbWFyX25vKys7CisgIGlmICghIC1lICRncmFtbWFyKSB7CisgICAgcHJpbnQgIiogRkFUQUw6IENhbid0IGZpbmQgZ3JhbW1hciAnJGdyYW1tYXInXG4iOworICAgIGV4aXQgMTsKICAgfQotfSBlbHNlIHsKLSAgIyBwaHJhc2UtYmFzZWQgZ3JhbW1hciAtLSBwcmVwZW5kIG5vbnRlcm1pbmFsIHN5bWJvbAotICBpZiAoc3lzdGVtKCIkQ0FUICRncmFtbWFyIHwgJEpPU0hVQS9zY3JpcHRzL3N1cHBvcnQvbW9zZXNfcGhyYXNlX3RvX2pvc2h1YS5wbCB8IHNvcnQgLWszLDMgLS1idWZmZXItc2l6ZT0kb3B0c3ttfSAtVCAkb3B0c3tUfSB8IGd6aXAgLTluID4gJHNvcnRlZF9ncmFtbWFyIikpIHsKLSAgICBwcmludCBTVERFUlIgIiogRkFUQUw6IENvdWxkbid0IHNvcnQgdGhlIGdyYW1tYXIgKG5vdCBlbm91Z2ggbWVtb3J5PyBzaG9ydCBvbiB0bXAgc3BhY2U/KVxuIjsKLSAgICBleGl0IDI7Ci0gIH0KLX0gIAotI215ICRzb3VyY2VfZmllbGQgPSAoJGZpcnN0X2xpbmUgPX4gL15cWy8pID8gIjMsMyIgOiAiMSwxIjsKIAotJGdyYW1tYXIgPSAkc29ydGVkX2dyYW1tYXI7CisgICMgU29ydCB0aGUgZ3JhbW1hciBvciBwaHJhc2UgdGFibGUKKyAgbXkgJG5hbWUgPSBiYXNlbmFtZSgkZ3JhbW1hcik7CisgIG15ICh1bmRlZiwkc29ydGVkX2dyYW1tYXIpID0gdGVtcGZpbGUoIiR7bmFtZX1YWFhYIiwgRElSID0+ICRvcHRze1R9LCBVTkxJTksgPT4gMSk7CisgIHByaW50IFNUREVSUiAiU29ydGluZyBncmFtbWFyIHRvICRzb3J0ZWRfZ3JhbW1hci4uLlxuIiBpZiAkb3B0c3t2fTsKKworICAjIFdlIG5lZWQgdG8gc29ydCBieSBzb3VyY2Ugc2lkZSwgd2hpY2ggaXMgZmllbGQgMSAoZm9yIHBocmFzZSB0YWJsZXMgbm90IGxpc3RpbmcgdGhlIExIUykKKyAgIyBvciBmaWVsZCAyIChjb252ZW50aW9uLCBUaHJheCBmb3JtYXQpCisgIGNob21wKG15ICRmaXJzdF9saW5lID0gYCRDQVQgJGdyYW1tYXIgfCBoZWFkIC1uMWApOworICBpZiAoJGZpcnN0X2xpbmUgPX4gL15cWy8pIHsKKyAgICAjIHJlZ3VsYXIgZ3JhbW1hcgorICAgIGlmIChzeXN0ZW0oIiRDQVQgJGdyYW1tYXIgfCBzZWQgJ3MvIHx8fCAvXHQvZycgfCBzb3J0IC1rMiwyIC1rMywzIC0tYnVmZmVyLXNpemU9JG9wdHN7bX0gLVQgJG9wdHN7VH0gfCBzZWQgJ3MvXHQvIHx8fCAvZycgfCBnemlwIC05biA+ICRzb3J0ZWRfZ3JhbW1hciIpKSB7CisgICAgICBwcmludCBTVERFUlIgIiogRkFUQUw6IENvdWxkbid0IHNvcnQgdGhlIGdyYW1tYXIgKG5vdCBlbm91Z2ggbWVtb3J5PyBzaG9ydCBvbiB0bXAgc3BhY2U/KVxuIjsKKyAgICAgIGV4aXQgMjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgIyBNb3NlcyBwaHJhc2UtYmFzZWQgZ3JhbW1hciAtLSBwcmVwZW5kIG5vbnRlcm1pbmFsIHN5bWJvbCBhbmQgLWxvZygpIHRoZSB3ZWlnaHRzCisgICAgaWYgKHN5c3RlbSgiJENBVCAkZ3JhbW1hciB8ICRKT1NIVUEvc2NyaXB0cy9zdXBwb3J0L21vc2VzX3BocmFzZV90b19qb3NodWEucGwgfCBzb3J0IC1rMywzIC0tYnVmZmVyLXNpemU9JG9wdHN7bX0gLVQgJG9wdHN7VH0gfCBnemlwIC05biA+ICRzb3J0ZWRfZ3JhbW1hciIpKSB7CisgICAgICBwcmludCBTVERFUlIgIiogRkFUQUw6IENvdWxkbid0IHNvcnQgdGhlIGdyYW1tYXIgKG5vdCBlbm91Z2ggbWVtb3J5PyBzaG9ydCBvbiB0bXAgc3BhY2U/KVxuIjsKKyAgICAgIGV4aXQgMjsKKyAgICB9CisgIH0gIAorCisgIHB1c2goQHNvcnRlZF9ncmFtbWFycywgJHNvcnRlZF9ncmFtbWFyKTsKK30KKwogCiAjIERvIHRoZSBwYWNraW5nIHVzaW5nIHRoZSBjb25maWcuCi1teSAkY21kID0gImphdmEgLVhteCRvcHRze219IC1jcCAkSk9TSFVBL2NsYXNzIGpvc2h1YS50b29scy5HcmFtbWFyUGFja2VyIC1wICRvdXRwdXRfZGlyIC1nICRncmFtbWFyIjsKK215ICRncmFtbWFycyA9IGpvaW4oIiAiLCBAc29ydGVkX2dyYW1tYXJzKTsKK215ICRvdXRwdXRzICA9IGpvaW4oIiAiLCBAb3V0cHV0cyk7CitteSAkY21kID0gImphdmEgLVhteCRvcHRze219IC1jcCAkSk9TSFVBL2xpYi9hcmdzNGotMi4wLjI5LmphcjokSk9TSFVBL2NsYXNzIGpvc2h1YS50b29scy5HcmFtbWFyUGFja2VyQ2xpIC1nICRncmFtbWFycyAtLW91dHB1dHMgJG91dHB1dHMiOwogcHJpbnQgU1RERVJSICJQYWNraW5nIHdpdGggJGNtZC4uLlxuIiBpZiAkb3B0c3t2fTsKKwogbXkgJHJldHZhbCA9IHN5c3RlbSgkY21kKTsKIAogaWYgKCRyZXR2YWwgPT0gMCkgewotICB1bmxpbmsoJHNvcnRlZF9ncmFtbWFyKTsKKyAgbWFwIHsgdW5saW5rKCRfKSB9IEBzb3J0ZWRfZ3JhbW1hcnM7CiB9IGVsc2UgewogICBwcmludCBTVERFUlIgIiogRkFUQUw6IENvdWxkbid0IHBhY2sgdGhlIGdyYW1tYXIuXG4iOwogICBleGl0IDE7CmRpZmYgLS1naXQgYS9zY3JpcHRzL3N1cHBvcnQvbWFrZS1yZWxlYXNlLnNoIGIvc2NyaXB0cy9zdXBwb3J0L21ha2UtcmVsZWFzZS5zaAppbmRleCA5MzVmOTIyLi42NDg5YmRmIDEwMDc1NQotLS0gYS9zY3JpcHRzL3N1cHBvcnQvbWFrZS1yZWxlYXNlLnNoCisrKyBiL3NjcmlwdHMvc3VwcG9ydC9tYWtlLXJlbGVhc2Uuc2gKQEAgLTQsMzEgKzQsNDAgQEAKIAogc2V0IC11CiAKLXZlcnNpb249JDEKLQogY2QgJEpPU0hVQQotYW50IGNsZWFuIGphdmEKK2FudCBqYXZhIHZlcnNpb24KKworaWYgW1sgISAtZSBWRVJTSU9OIF1dOyB0aGVuCisgIGVjaG8gIiogRkFUQUw6IGNhbid0IGZpbmQgdGhlIHZlcnNpb24gZmlsZSEiCisgIGV4aXQKK2ZpCisKK3ZlcnNpb249JChncmVwIF5yZWxlYXNlIFZFUlNJT04gfCBhd2sgJ3twcmludCAkTkZ9JykKK2NvbW1pdD0kKGdyZXAgXmN1cnJlbnQgVkVSU0lPTiB8IGF3ayAne3ByaW50ICRORn0nKQorY2xlYW49JChlY2hvICRjb21taXQgfCBjdXQgLWQtIC1mMikKKworaWYgW1sgJGNsZWFuICE9ICIwIiBdXTsgdGhlbgorICB2ZXJzaW9uPSRjb21taXQKK2ZpCisKK2VjaG8gIkJ1bmRsaW5nIHVwIGpvc2h1YS0kdmVyc2lvbiIKKwogW1sgISAtZCByZWxlYXNlIF1dICYmIG1rZGlyIHJlbGVhc2UKIHJtIC1mIGpvc2h1YS0kdmVyc2lvbiAmJiBsbiAtcyAkSk9TSFVBIGpvc2h1YS0kdmVyc2lvbgogCi13Z2V0IC1xciBqb3NodWEtZGVjb2Rlci5vcmcKLQotIyBTYXZlIHRoZSBjdXJyZW50IHZlcnNpb24gYW5kIGNvbW1pdCB0byBhIGZpbGUKLWVjaG8gInJlbGVhc2UgdmVyc2lvbjogJHZlcnNpb24iID4gVkVSU0lPTgotZWNobyAiY3VycmVudCBjb21taXQ6ICQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSIgPj4gVkVSU0lPTgord2dldCAtciBodHRwOi8vam9zaHVhLWRlY29kZXIub3JnLwogCiB0YXIgY3pmIHJlbGVhc2Uvam9zaHVhLSR2ZXJzaW9uLnRneiBcCiAgICAgLS1leGNsdWRlPScqficgLS1leGNsdWRlPScjKicgXAotICAgIGpvc2h1YS0kdmVyc2lvbi97UkVBRE1FLm1kLFZFUlNJT04sYnVpbGQueG1sLGxvZ2dpbmcucHJvcGVydGllc30gXAorICAgIGpvc2h1YS0kdmVyc2lvbi97UkVBRE1FLm1kLFZFUlNJT04sQ0hBTkdFTE9HLGJ1aWxkLnhtbCxsb2dnaW5nLnByb3BlcnRpZXN9IFwKICAgICBqb3NodWEtJHZlcnNpb24vc3JjIFwKICAgICBqb3NodWEtJHZlcnNpb24vYmluIFwKICAgICBqb3NodWEtJHZlcnNpb24vY2xhc3MgXAotICAgIGpvc2h1YS0kdmVyc2lvbi9saWIveypqYXIsZW5nX3NtNi5ncixoYWRvb3AtMC4yMC4yLnRhci5neixSRUFETUUsTElDRU5TRVN9IFwKKyAgICBqb3NodWEtJHZlcnNpb24vbGliL3sqamFyLGVuZ19zbTYuZ3IsaGFkb29wLTIuNS4yLnRhci5neixSRUFETUUsTElDRU5TRVN9IFwKICAgICBqb3NodWEtJHZlcnNpb24vc2NyaXB0cyBcCiAgICAgam9zaHVhLSR2ZXJzaW9uL3Rlc3QgXAogICAgIGpvc2h1YS0kdmVyc2lvbi9leGFtcGxlcyBcCiAgICAgam9zaHVhLSR2ZXJzaW9uL3RocmF4L2Jpbi90aHJheC5qYXIgXAotICAgIGpvc2h1YS0kdmVyc2lvbi90aHJheC9zY3JpcHRzIFwKICAgICBqb3NodWEtJHZlcnNpb24vam9zaHVhLWRlY29kZXIub3JnCiAKIHJtIC1mIGpvc2h1YS0kdmVyc2lvbgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9zdXBwb3J0L21vc2VzMmpvc2h1YV9ncmFtbWFyLnBsIGIvc2NyaXB0cy9zdXBwb3J0L21vc2VzMmpvc2h1YV9ncmFtbWFyLnBsCmluZGV4IDA2ZTRiNzMuLmFiMTBhMjMgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvc3VwcG9ydC9tb3NlczJqb3NodWFfZ3JhbW1hci5wbAorKysgYi9zY3JpcHRzL3N1cHBvcnQvbW9zZXMyam9zaHVhX2dyYW1tYXIucGwKQEAgLTksMTEgKzksMTEgQEAKICMKICMgKDEpIFRoZSBydWxlIHN5bnRheC4gTW9zZXMnIHJ1bGVzIGxvb2sgbGlrZSB0aGlzOgogIyAKLSMgICAgIGRlciBbWF1bTk5dIFtYXSB8fHwgb2YgdGhlIFtYXVtOTl0gW1BQXSB8fHwgMC0wIDAtMSAxLTIgfHx8IDEgfHx8IHx8fAorIyAgICAgZGVyIFtYXVtOTl0gW1hdIHx8fCBvZiB0aGUgW1hdW05OXSBbUFBdIHx8fCAwLTAgMC0xIDEtMiB8fHwgLjMwMSAuNjk4OSB8fHwgfHx8CiAjCiAjIFdoZXJlYXMgdGhlIGNvcnJlc3BvbmRpbmcgSm9zaHVhIHJ1bGUgbG9va3MgbGlrZSB0aGlzOgogIyAKLSMgICAgIFtQUF0gfHx8IGRlciBbTk5dIHx8fCBvZiB0aGUgW05OXSB8fHwgMQorIyAgICAgW1BQXSB8fHwgZGVyIFtOTiwxXSB8fHwgb2YgdGhlIFtOTiwxXSB8fHwgMC41IDAuMgogIwogIyAoVGhpcyBkb2Vzbid0IGFwcGx5IHRvIHBocmFzZSB0YWJsZXMsIG9mIGNvdXJzZSkuCiAjCmRpZmYgLS1naXQgYS9zY3JpcHRzL3N1cHBvcnQvbW9zZXNfcGhyYXNlX3RvX2pvc2h1YS5wbCBiL3NjcmlwdHMvc3VwcG9ydC9tb3Nlc19waHJhc2VfdG9fam9zaHVhLnBsCmluZGV4IDRkYzgxOTguLjViMDRhNWUgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvc3VwcG9ydC9tb3Nlc19waHJhc2VfdG9fam9zaHVhLnBsCisrKyBiL3NjcmlwdHMvc3VwcG9ydC9tb3Nlc19waHJhc2VfdG9fam9zaHVhLnBsCkBAIC0xMSw3ICsxMSwxMiBAQAogICBteSBAdG9rZW5zID0gc3BsaXQoLyBcfFx8XHwgLywgJGxpbmUpOwogCiAgIHVuc2hpZnQoQHRva2VucywgIltYXSIpOwotICAkdG9rZW5zWzNdID0gam9pbigiICIsIG1hcCB7IC1sb2coJF8pIH0gc3BsaXQoJyAnLCAkdG9rZW5zWzNdKSk7CisgICR0b2tlbnNbM10gPSBqb2luKCIgIiwgbWFwIHsgLW15bG9nKCRfKSB9IHNwbGl0KCcgJywgJHRva2Vuc1szXSkpOwogCiAgIHByaW50IGpvaW4oIiB8fHwgIiwgQHRva2Vucyk7CiB9CisKK3N1YiBteWxvZyB7CisgIG15ICgkbnVtKSA9IEBfOworICByZXR1cm4gKCRudW0gPT0gMCkgPyAtMTAwIDogbG9nKCRudW0pOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9zdXBwb3J0L3J1bl9idW5kbGVyLnB5IGIvc2NyaXB0cy9zdXBwb3J0L3J1bl9idW5kbGVyLnB5CmluZGV4IDk2NzVmMjcuLjkzMTFlNjkgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvc3VwcG9ydC9ydW5fYnVuZGxlci5weQorKysgYi9zY3JpcHRzL3N1cHBvcnQvcnVuX2J1bmRsZXIucHkKQEAgLTE1LDcgKzE1LDYgQEAKIGZyb20gc3VicHJvY2VzcyBpbXBvcnQgQ2FsbGVkUHJvY2Vzc0Vycm9yLCBQb3BlbiwgUElQRQogaW1wb3J0IHN5cwogCi0KIEVYQU1QTEUgPSByIiIiCiBFeGFtcGxlIGludm9jYXRpb246CiAKQEAgLTIzLDE3ICsyMiwxNyBAQAogICAtLWZvcmNlIFwKICAgLS12ZXJib3NlIFwKICAgL3BhdGgvdG8vb3JpZ2luL2RpcmVjdG9yeS90ZXN0L21vZGVsL2pvc2h1YS5jb25maWcgXAotICAtLXJvb3QgL3BhdGgvdG8vb3JpZ2luL2RpcmVjdG9yeSBcCisgIC0tcm9vdCAvcGF0aC90by9vcmlnaW4vZGlyZWN0b3J5L3Rlc3QvbW9kZWwgXAogICBuZXctYnVuZGxlLWRpcmVjdG9yeSBcCiAgIC0tY29weS1jb25maWctb3B0aW9ucyBcCiAgICAgJy10b3AtbiAxIC1vdXRwdXQtZm9ybWF0ICVTIC1tYXJrLW9vdnMgZmFsc2UnIFwKLSAgLS1wYWNrLXRtICdwdCAvcGF0aC90by9vcmlnaW4vZGlyZWN0b3J5L2dyYW1tYXIuZ3onCisgIC0tcGFjay10bSAvcGF0aC90by9vcmlnaW4vZGlyZWN0b3J5L2dyYW1tYXIuZ3oKIAogTm90ZTogVGhlIG9wdGlvbnMgaW5jbHVkZWQgaW4gdGhlIHZhbHVlIHN0cmluZyBmb3IgdGhlIC0tY29weS1jb25maWctb3B0aW9ucwogYXJndW1lbnQgY2FuIGVpdGhlciBiZSBKb3NodWEgb3B0aW9ucyBvciBvcHRpb25zIGZvciB0aGUKICRKT1NIVUEvc2NyaXB0cy9jb3B5LWNvbmZpZy5wbCBzY3JpcHQuIFRoZSBvcmRlciBvZiB0aGUgLS1bcGFjay1ddG0gb3B0aW9ucyBtdXN0CiBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgZ3JhbW1hciBjb25maWd1cmF0aW9uIGxpbmVzIHRoZXkgaW50ZW5kIHRvCi1vdmVycmlkZSBpbiB0aGUgam9zaHVhLmNvbmZpZyBmaWxlLgorb3ZlcnJpZGUgaW4gdGhlIGpvc2h1YS5jb25maWcgZmlsZSwgYW5kIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSAtLXBhY2stdG0gb3B0aW9uLgogIiIiCiAKIFJFQURNRV9URU1QTEFURSA9ICIiIkpvc2h1YSBDb25maWd1cmF0aW9uIFJ1biBCdW5kbGUKQEAgLTEwNCw2ICsxMDMsOCBAQAogIiIiCiAKIEpPU0hVQV9QQVRIID0gb3MuZW52aXJvbi5nZXQoJ0pPU0hVQScpCitkZWZhdWx0X25vcm1hbGl6ZXIgPSBvcy5wYXRoLmpvaW4oSk9TSFVBX1BBVEgsICJzY3JpcHRzL3RyYWluaW5nL25vcm1hbGl6ZS5wbCIpCitkZWZhdWx0X3Rva2VuaXplciA9IG9zLnBhdGguam9pbihKT1NIVUFfUEFUSCwgInNjcmlwdHMvdHJhaW5pbmcvcGVubi10cmVlYmFuay10b2tlbml6ZXIucGVybCIpCiBGSUxFX1RZUEVfVE9LRU5TID0gWydsbScsICd0bSddCiBGSUxFX1RZUEVfT1BUSU9OUyA9IFsnLXBhdGgnLCAnLWxtX2ZpbGUnXQogCkBAIC0zMjUsNiArMzI2LDcgQEAKIAogZGVmIHJ1bl9ncmFtbWFyX3BhY2tlcihzcmNfcGF0aCwgZGVzdF9wYXRoKToKICAgICBjbWQgPSBbb3MucGF0aC5qb2luKEpPU0hVQV9QQVRILCAic2NyaXB0cy9zdXBwb3J0L2dyYW1tYXItcGFja2VyLnBsIiksCisgICAgICAgICAgICItVCIsIG9wdHMudG1wZGlyLAogICAgICAgICAgICBzcmNfcGF0aCwgZGVzdF9wYXRoXQogICAgIGxvZ2dpbmcuaW5mbygKICAgICAgICAgJ1J1bm5pbmcgdGhlIGdyYW1tYXItcGFja2VyLnBsIHNjcmlwdCB3aXRoIHRoZSBjb21tYW5kOiAlcycKQEAgLTU1NSw2ICs1NTcsMTggQEAKICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAnLS1hYnNvbHV0ZScsIGRlc3Q9J2Fic29sdXRlJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgaGVscD0iVXNlIGFic29sdXRlIGluc3RlYWQgb2YgcmVsYXRpdmUgcGF0aHMgZm9yIG1vZGVsIGZpbGUgbG9jYXRpb25zIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1zb3VyY2UnLCBkZXN0PSdzb3VyY2UnLAorICAgICAgICBoZWxwPSJTb3VyY2UgbGFuZ3VhZ2UgdHdvLWNoYXJhY3RlciBjb2RlIChJU08gNjM5LTEpIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1ub3JtYWxpemVyJywgZGVmYXVsdD1kZWZhdWx0X25vcm1hbGl6ZXIsCisgICAgICAgIGhlbHA9InNvdXJjZSBzZW50ZW5jZSBub3JtYWxpemVyIHRoYXQgd2FzIGFwcGxpZWQgdG8gdGhlIG1vZGVsIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS10b2tlbml6ZXInLCBkZWZhdWx0PWRlZmF1bHRfdG9rZW5pemVyLAorICAgICAgICBoZWxwPSJzb3VyY2Ugc2VudGVuY2UgdG9rZW5pemVyIHRoYXQgd2FzIGFwcGxpZWQgdG8gdGhlIG1vZGVsIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLVQnLCBkZXN0PSd0bXBkaXInLCBkZWZhdWx0PScvdG1wJywKKyAgICAgICAgaGVscD0idGVtcCBkaXJlY3RvcnkiKQogCiAgICAgcmV0dXJuIHBhcnNlci5wYXJzZV9hcmdzKGNsYXJncykKIApAQCAtNzA0LDYgKzcxOCw3IEBACiAKIAogZGVmIG1haW4oYXJndik6CisgICAgZ2xvYmFsIG9wdHMKICAgICBvcHRzID0gaGFuZGxlX2FyZ3MoYXJndlsxOl0pCiAKICAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9zdXBwb3J0L3dyaXRlLXZlcnNpb24uc2ggYi9zY3JpcHRzL3N1cHBvcnQvd3JpdGUtdmVyc2lvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjBlNTEzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9zdXBwb3J0L3dyaXRlLXZlcnNpb24uc2gKQEAgLTAsMCArMSwxMCBAQAorIyEvYmluL2Jhc2gKKworc2V0IC11CisKK3ZlcnNpb249JChnaXQgZGVzY3JpYmUgLS1hYmJyZXY9MCAtLWRpcnR5KQorCisjIFNhdmUgdGhlIGN1cnJlbnQgdmVyc2lvbiBhbmQgY29tbWl0IHRvIGEgZmlsZQorZWNobyAicmVsZWFzZSB2ZXJzaW9uOiAkKGdpdCBkZXNjcmliZSAtLWFiYnJldj0wKSIgPiAkSk9TSFVBL1ZFUlNJT04KK2VjaG8gImN1cnJlbnQgY29tbWl0OiAkKGdpdCBkZXNjcmliZSAtLWxvbmcgLS1kaXJ0eSkiID4+ICRKT1NIVUEvVkVSU0lPTgorCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBLy5jdnNpZ25vcmUgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YmU1NjMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLmFuanV0YQotLnRtX3Byb2plY3QqCi0ubGlicwotLmRlcHMKLS4qc3dwCi0ubmF1dGlsdXMtbWV0YWZpbGUueG1sCi0qLmF1dG9zYXZlCi0qLnB3cwotKi5iYWsKLSp+Ci0jKiMKLSouZ2xhZGVwCi0qLmxhCi0qLmxvCi0qLm8KLSouY2xhc3MKLSoucHljCi1hY2xvY2FsLm00Ci1hdXRvbTR0ZS5jYWNoZQotY29uZmlnLmgKLWNvbmZpZy5oLmluCi1jb25maWcubG9nCi1jb25maWcuc3RhdHVzCi1jb25maWd1cmUKLWludGx0b29sLWV4dHJhY3QqCi1pbnRsdG9vbC1tZXJnZSoKLWludGx0b29sLW1vZHVsZXMqCi1pbnRsdG9vbC11cGRhdGUqCi1saWJ0b29sCi1wcmVwYXJlLnNoCi1zdGFtcC1oKgotbHRtYWluLnNoCi1ta2luc3RhbGxkaXJzCi1jb25maWcuZ3Vlc3MKLWNvbmZpZy5zdWIKLU1ha2VmaWxlCi1NYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9BVVRIT1JTIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9BVVRIT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvQVVUSE9SUworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL0NNYWtlTGlzdHMudHh0IGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9DTWFrZUxpc3RzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzOGU1MS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL0NNYWtlTGlzdHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotUFJPSkVDVCAobWdpemEpCi0KLVNFVChNR0laQV9WRVJTSU9OX01BSk9SICIwIikKLVNFVChNR0laQV9WRVJTSU9OX01JTk9SICI3IikKLVNFVChNR0laQV9WRVJTSU9OX1BBVENIICIwIikKLQotTUFUSChFWFBSIE1HSVpBX0lOVF9WRVJTSU9OICIoJHtNR0laQV9WRVJTSU9OX01BSk9SfSAqIDEwMDAwKSArICgke01HSVpBX1ZFUlNJT05fTUlOT1J9ICogMTAwKSArICgke01HSVpBX1ZFUlNJT05fUEFUQ0h9ICogMSkiICkKLQotU0VUKE1HSVpBX1ZFUlNJT04gIiR7TUdJWkFfVkVSU0lPTl9NQUpPUn0uJHtNR0laQV9WRVJTSU9OX01JTk9SfS4ke01HSVpBX1ZFUlNJT05fUEFUQ0h9IikKLQotI0NNYWtlIDIuNisgaXMgcmVjb21tZW5kZWQgdG8gYW4gaW1wcm92ZWQgQm9vc3QgbW9kdWxlCi1DTUFLRV9NSU5JTVVNX1JFUVVJUkVEKFZFUlNJT04gMi42LjAgRkFUQUxfRVJST1IpCi0KLUlGKENPTU1BTkQgY21ha2VfcG9saWN5KQotICBjbWFrZV9wb2xpY3koU0VUIENNUDAwMDMgTkVXKQotRU5ESUYoQ09NTUFORCBjbWFrZV9wb2xpY3kpCi0KLUlGKENNQUtFX0lOU1RBTExfUFJFRklYX0lOSVRJQUxJWkVEX1RPX0RFRkFVTFQpCi0gICAgU0VUKENNQUtFX0lOU1RBTExfUFJFRklYCi0gICAgICAgICJpbnN0IiBDQUNIRSBQQVRIICJNR0laQSBpbnN0YWxsIHByZWZpeCIgRk9SQ0UKLSAgICAgICAgKQotICAgIE1FU1NBR0UoU1RBVFVTICJZb3UgaGF2ZSBub3Qgc2V0IHRoZSBpbnN0YWxsIGRpciwgZGVmYXVsdCB0byAnLi9pbnN0JywgaWYKLSAgICB5b3Ugd2FudCB0byBzZXQgaXQsIHVzZSBjbWFrZSAtRENNQUtFX0lOU1RBTExfUFJFRklYIHRvIGRvIHNvIikKLUVORElGKENNQUtFX0lOU1RBTExfUFJFRklYX0lOSVRJQUxJWkVEX1RPX0RFRkFVTFQpCi0KLSNzZXQgdmFyaW91cyBwbGF0Zm9ybSBzcGVjaWZpYyBnbG9iYWwgb3B0aW9ucwotSUYoV0lOMzIpCi0gU0VUKENNQUtFX0RFQlVHX1BPU1RGSVggImQiKQotIE9QVElPTiggVVNFXzY0X0JJVCAiU2V0IHRvIG9uIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgV2luNjQiIE9GRiApCi1FTkRJRihXSU4zMikKLQotCi0KLUlOQ0xVREUoY21ha2UvRmluZFRSMS5jbWFrZSkKLQotIyBpbmNsdWRlIHNwZWNpZmljIG1vZHVsZXMKLVNFVChDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTUFLRV9TT1VSQ0VfRElSfS9jbWFrZSIpCi0KLQotIyBGaW5kIEJvb3N0IGxpYnJhcnksIHNwZWNpZnkKLSMgQk9PU1RfUk9PVD0vZS9wcm9ncmFtcy9ib29zdF8xXzM1XzAKLSMgQk9PU1RfTElCUkFSWURJUj0kQk9PU1RfUk9PVC9zdGFnZS9saWIKLQotc2V0KEJvb3N0X1VTRV9TVEFUSUNfTElCUyAgICAgICAgT04pCi1zZXQoQm9vc3RfVVNFX01VTFRJVEhSRUFERUQgICAgICBPTikKLXNldChCb29zdF9VU0VfU1RBVElDX1JVTlRJTUUgICAgT0ZGKQotCi0KLUZJTkRfUEFDS0FHRSggQm9vc3QgMS40MSBDT01QT05FTlRTIHRocmVhZCkKLQotIElGKEJvb3N0X0ZPVU5EKQotICAgIElGIChOT1QgX2Jvb3N0X0lOX0NBQ0hFKQotICAgICBNRVNTQUdFKCAiQm9vc3QgZm91bmQiICkKLSAgICAgbWVzc2FnZShTVEFUVVMgIkJvb3N0X0lOQ0xVREVfRElSICAgIDogJHtCb29zdF9JTkNMVURFX0RJUn0iKQotICAgIEVORElGIChOT1QgX2Jvb3N0X0lOX0NBQ0hFKQotCUxJTktfRElSRUNUT1JJRVMgKCAke0Jvb3N0X0xJQlJBUllfRElSU30gKQotCUlOQ0xVREVfRElSRUNUT1JJRVMgKCAke0Jvb3N0X0lOQ0xVREVfRElSU30gKQotRUxTRSgpCi0gICAgTUVTU0FHRShGQVRBTF9FUlJPUiAiQm9vc3Qgbm90IGZvdW5kLCBwbGVhc2Ugc2V0IHRoZSBCT09TVF9ST09UIGFuZCBCT09TVF9MSUJSQVJZRElSIGVudmlyb25tZW50IHZhcmlhYmxlcyAiICkKLUVORElGKCkKLQotQUREX1NVQkRJUkVDVE9SWSAoc3JjKQotQUREX1NVQkRJUkVDVE9SWSAoc3JjL21rY2xzKQotQUREX1NVQkRJUkVDVE9SWSAoc2NyaXB0cykKLQotSUYgKFdJTjMyKQotTUVTU0FHRSggU1RBVFVTICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiApCi1NRVNTQUdFKCBTVEFUVVMgIlVTRV82NF9CSVQgPSAke1VTRV82NF9CSVR9IiApCi1NRVNTQUdFKCBTVEFUVVMgIkNoYW5nZSBhIHZhbHVlIHdpdGg6IGNtYWtlIC1EPFZhcmlhYmxlPj08VmFsdWU+IiApCi1NRVNTQUdFKCBTVEFUVVMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iICkKLQotCi1TRVQoIFVTRV82NF9CSVQgIiR7VVNFXzY0X0JJVH0iIENBQ0hFIEJPT0wKLSAgICAiU2V0IHRvIE9OIHRvIGJ1aWxkIFdpbjY0IiBGT1JDRSApCi1FTkRJRigpCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvQ09QWUlORyBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvQ09QWUlORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhOWVkMC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSw2NzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNwotCi0gQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKLQotICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgYSBmcmVlLCBjb3B5bGVmdCBsaWNlbnNlIGZvcgotc29mdHdhcmUgYW5kIG90aGVyIGtpbmRzIG9mIHdvcmtzLgotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhbmQgb3RoZXIgcHJhY3RpY2FsIHdvcmtzIGFyZSBkZXNpZ25lZAotdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIHRoZSB3b3Jrcy4gIEJ5IGNvbnRyYXN0LAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8KLXNoYXJlIGFuZCBjaGFuZ2UgYWxsIHZlcnNpb25zIG9mIGEgcHJvZ3JhbS0tdG8gbWFrZSBzdXJlIGl0IHJlbWFpbnMgZnJlZQotc29mdHdhcmUgZm9yIGFsbCBpdHMgdXNlcnMuICBXZSwgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdXNlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vc3Qgb2Ygb3VyIHNvZnR3YXJlOyBpdCBhcHBsaWVzIGFsc28gdG8KLWFueSBvdGhlciB3b3JrIHJlbGVhc2VkIHRoaXMgd2F5IGJ5IGl0cyBhdXRob3JzLiAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoZW0gaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91Ci13YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldwotZnJlZSBwcm9ncmFtcywgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBwcmV2ZW50IG90aGVycyBmcm9tIGRlbnlpbmcgeW91Ci10aGVzZSByaWdodHMgb3IgYXNraW5nIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIFRoZXJlZm9yZSwgeW91IGhhdmUKLWNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZgoteW91IG1vZGlmeSBpdDogcmVzcG9uc2liaWxpdGllcyB0byByZXNwZWN0IHRoZSBmcmVlZG9tIG9mIG90aGVycy4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBwYXNzIG9uIHRvIHRoZSByZWNpcGllbnRzIHRoZSBzYW1lCi1mcmVlZG9tcyB0aGF0IHlvdSByZWNlaXZlZC4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZQotb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkKLWtub3cgdGhlaXIgcmlnaHRzLgotCi0gIERldmVsb3BlcnMgdGhhdCB1c2UgdGhlIEdOVSBHUEwgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczoKLSgxKSBhc3NlcnQgY29weXJpZ2h0IG9uIHRoZSBzb2Z0d2FyZSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBMaWNlbnNlCi1naXZpbmcgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IGl0LgotCi0gIEZvciB0aGUgZGV2ZWxvcGVycycgYW5kIGF1dGhvcnMnIHByb3RlY3Rpb24sIHRoZSBHUEwgY2xlYXJseSBleHBsYWlucwotdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiAgRm9yIGJvdGggdXNlcnMnIGFuZAotYXV0aG9ycycgc2FrZSwgdGhlIEdQTCByZXF1aXJlcyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIGJlIG1hcmtlZCBhcwotY2hhbmdlZCwgc28gdGhhdCB0aGVpciBwcm9ibGVtcyB3aWxsIG5vdCBiZSBhdHRyaWJ1dGVkIGVycm9uZW91c2x5IHRvCi1hdXRob3JzIG9mIHByZXZpb3VzIHZlcnNpb25zLgotCi0gIFNvbWUgZGV2aWNlcyBhcmUgZGVzaWduZWQgdG8gZGVueSB1c2VycyBhY2Nlc3MgdG8gaW5zdGFsbCBvciBydW4KLW1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBzb2Z0d2FyZSBpbnNpZGUgdGhlbSwgYWx0aG91Z2ggdGhlIG1hbnVmYWN0dXJlcgotY2FuIGRvIHNvLiAgVGhpcyBpcyBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZSBhaW0gb2YKLXByb3RlY3RpbmcgdXNlcnMnIGZyZWVkb20gdG8gY2hhbmdlIHRoZSBzb2Z0d2FyZS4gIFRoZSBzeXN0ZW1hdGljCi1wYXR0ZXJuIG9mIHN1Y2ggYWJ1c2Ugb2NjdXJzIGluIHRoZSBhcmVhIG9mIHByb2R1Y3RzIGZvciBpbmRpdmlkdWFscyB0bwotdXNlLCB3aGljaCBpcyBwcmVjaXNlbHkgd2hlcmUgaXQgaXMgbW9zdCB1bmFjY2VwdGFibGUuICBUaGVyZWZvcmUsIHdlCi1oYXZlIGRlc2lnbmVkIHRoaXMgdmVyc2lvbiBvZiB0aGUgR1BMIHRvIHByb2hpYml0IHRoZSBwcmFjdGljZSBmb3IgdGhvc2UKLXByb2R1Y3RzLiAgSWYgc3VjaCBwcm9ibGVtcyBhcmlzZSBzdWJzdGFudGlhbGx5IGluIG90aGVyIGRvbWFpbnMsIHdlCi1zdGFuZCByZWFkeSB0byBleHRlbmQgdGhpcyBwcm92aXNpb24gdG8gdGhvc2UgZG9tYWlucyBpbiBmdXR1cmUgdmVyc2lvbnMKLW9mIHRoZSBHUEwsIGFzIG5lZWRlZCB0byBwcm90ZWN0IHRoZSBmcmVlZG9tIG9mIHVzZXJzLgotCi0gIEZpbmFsbHksIGV2ZXJ5IHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuCi1TdGF0ZXMgc2hvdWxkIG5vdCBhbGxvdyBwYXRlbnRzIHRvIHJlc3RyaWN0IGRldmVsb3BtZW50IGFuZCB1c2Ugb2YKLXNvZnR3YXJlIG9uIGdlbmVyYWwtcHVycG9zZSBjb21wdXRlcnMsIGJ1dCBpbiB0aG9zZSB0aGF0IGRvLCB3ZSB3aXNoIHRvCi1hdm9pZCB0aGUgc3BlY2lhbCBkYW5nZXIgdGhhdCBwYXRlbnRzIGFwcGxpZWQgdG8gYSBmcmVlIHByb2dyYW0gY291bGQKLW1ha2UgaXQgZWZmZWN0aXZlbHkgcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHRoZSBHUEwgYXNzdXJlcyB0aGF0Ci1wYXRlbnRzIGNhbm5vdCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgcHJvZ3JhbSBub24tZnJlZS4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQotICAgICAgICAgICAgICAgICAgICAgICBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gIDAuIERlZmluaXRpb25zLgotCi0gICJUaGlzIExpY2Vuc2UiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi0gICJDb3B5cmlnaHQiIGFsc28gbWVhbnMgY29weXJpZ2h0LWxpa2UgbGF3cyB0aGF0IGFwcGx5IHRvIG90aGVyIGtpbmRzIG9mCi13b3Jrcywgc3VjaCBhcyBzZW1pY29uZHVjdG9yIG1hc2tzLgotCi0gICJUaGUgUHJvZ3JhbSIgcmVmZXJzIHRvIGFueSBjb3B5cmlnaHRhYmxlIHdvcmsgbGljZW5zZWQgdW5kZXIgdGhpcwotTGljZW5zZS4gIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLiAgIkxpY2Vuc2VlcyIgYW5kCi0icmVjaXBpZW50cyIgbWF5IGJlIGluZGl2aWR1YWxzIG9yIG9yZ2FuaXphdGlvbnMuCi0KLSAgVG8gIm1vZGlmeSIgYSB3b3JrIG1lYW5zIHRvIGNvcHkgZnJvbSBvciBhZGFwdCBhbGwgb3IgcGFydCBvZiB0aGUgd29yawotaW4gYSBmYXNoaW9uIHJlcXVpcmluZyBjb3B5cmlnaHQgcGVybWlzc2lvbiwgb3RoZXIgdGhhbiB0aGUgbWFraW5nIG9mIGFuCi1leGFjdCBjb3B5LiAgVGhlIHJlc3VsdGluZyB3b3JrIGlzIGNhbGxlZCBhICJtb2RpZmllZCB2ZXJzaW9uIiBvZiB0aGUKLWVhcmxpZXIgd29yayBvciBhIHdvcmsgImJhc2VkIG9uIiB0aGUgZWFybGllciB3b3JrLgotCi0gIEEgImNvdmVyZWQgd29yayIgbWVhbnMgZWl0aGVyIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0gb3IgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbS4KLQotICBUbyAicHJvcGFnYXRlIiBhIHdvcmsgbWVhbnMgdG8gZG8gYW55dGhpbmcgd2l0aCBpdCB0aGF0LCB3aXRob3V0Ci1wZXJtaXNzaW9uLCB3b3VsZCBtYWtlIHlvdSBkaXJlY3RseSBvciBzZWNvbmRhcmlseSBsaWFibGUgZm9yCi1pbmZyaW5nZW1lbnQgdW5kZXIgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGF3LCBleGNlcHQgZXhlY3V0aW5nIGl0IG9uIGEKLWNvbXB1dGVyIG9yIG1vZGlmeWluZyBhIHByaXZhdGUgY29weS4gIFByb3BhZ2F0aW9uIGluY2x1ZGVzIGNvcHlpbmcsCi1kaXN0cmlidXRpb24gKHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLCBtYWtpbmcgYXZhaWxhYmxlIHRvIHRoZQotcHVibGljLCBhbmQgaW4gc29tZSBjb3VudHJpZXMgb3RoZXIgYWN0aXZpdGllcyBhcyB3ZWxsLgotCi0gIFRvICJjb252ZXkiIGEgd29yayBtZWFucyBhbnkga2luZCBvZiBwcm9wYWdhdGlvbiB0aGF0IGVuYWJsZXMgb3RoZXIKLXBhcnRpZXMgdG8gbWFrZSBvciByZWNlaXZlIGNvcGllcy4gIE1lcmUgaW50ZXJhY3Rpb24gd2l0aCBhIHVzZXIgdGhyb3VnaAotYSBjb21wdXRlciBuZXR3b3JrLCB3aXRoIG5vIHRyYW5zZmVyIG9mIGEgY29weSwgaXMgbm90IGNvbnZleWluZy4KLQotICBBbiBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZSBkaXNwbGF5cyAiQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyIKLXRvIHRoZSBleHRlbnQgdGhhdCBpdCBpbmNsdWRlcyBhIGNvbnZlbmllbnQgYW5kIHByb21pbmVudGx5IHZpc2libGUKLWZlYXR1cmUgdGhhdCAoMSkgZGlzcGxheXMgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSwgYW5kICgyKQotdGVsbHMgdGhlIHVzZXIgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHdvcmsgKGV4Y2VwdCB0byB0aGUKLWV4dGVudCB0aGF0IHdhcnJhbnRpZXMgYXJlIHByb3ZpZGVkKSwgdGhhdCBsaWNlbnNlZXMgbWF5IGNvbnZleSB0aGUKLXdvcmsgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmCi10aGUgaW50ZXJmYWNlIHByZXNlbnRzIGEgbGlzdCBvZiB1c2VyIGNvbW1hbmRzIG9yIG9wdGlvbnMsIHN1Y2ggYXMgYQotbWVudSwgYSBwcm9taW5lbnQgaXRlbSBpbiB0aGUgbGlzdCBtZWV0cyB0aGlzIGNyaXRlcmlvbi4KLQotICAxLiBTb3VyY2UgQ29kZS4KLQotICBUaGUgInNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yawotZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgIk9iamVjdCBjb2RlIiBtZWFucyBhbnkgbm9uLXNvdXJjZQotZm9ybSBvZiBhIHdvcmsuCi0KLSAgQSAiU3RhbmRhcmQgSW50ZXJmYWNlIiBtZWFucyBhbiBpbnRlcmZhY2UgdGhhdCBlaXRoZXIgaXMgYW4gb2ZmaWNpYWwKLXN0YW5kYXJkIGRlZmluZWQgYnkgYSByZWNvZ25pemVkIHN0YW5kYXJkcyBib2R5LCBvciwgaW4gdGhlIGNhc2Ugb2YKLWludGVyZmFjZXMgc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIG9uZSB0aGF0Ci1pcyB3aWRlbHkgdXNlZCBhbW9uZyBkZXZlbG9wZXJzIHdvcmtpbmcgaW4gdGhhdCBsYW5ndWFnZS4KLQotICBUaGUgIlN5c3RlbSBMaWJyYXJpZXMiIG9mIGFuIGV4ZWN1dGFibGUgd29yayBpbmNsdWRlIGFueXRoaW5nLCBvdGhlcgotdGhhbiB0aGUgd29yayBhcyBhIHdob2xlLCB0aGF0IChhKSBpcyBpbmNsdWRlZCBpbiB0aGUgbm9ybWFsIGZvcm0gb2YKLXBhY2thZ2luZyBhIE1ham9yIENvbXBvbmVudCwgYnV0IHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoYXQgTWFqb3IKLUNvbXBvbmVudCwgYW5kIChiKSBzZXJ2ZXMgb25seSB0byBlbmFibGUgdXNlIG9mIHRoZSB3b3JrIHdpdGggdGhhdAotTWFqb3IgQ29tcG9uZW50LCBvciB0byBpbXBsZW1lbnQgYSBTdGFuZGFyZCBJbnRlcmZhY2UgZm9yIHdoaWNoIGFuCi1pbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbiBzb3VyY2UgY29kZSBmb3JtLiAgQQotIk1ham9yIENvbXBvbmVudCIsIGluIHRoaXMgY29udGV4dCwgbWVhbnMgYSBtYWpvciBlc3NlbnRpYWwgY29tcG9uZW50Ci0oa2VybmVsLCB3aW5kb3cgc3lzdGVtLCBhbmQgc28gb24pIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpbmcgc3lzdGVtCi0oaWYgYW55KSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSB3b3JrIHJ1bnMsIG9yIGEgY29tcGlsZXIgdXNlZCB0bwotcHJvZHVjZSB0aGUgd29yaywgb3IgYW4gb2JqZWN0IGNvZGUgaW50ZXJwcmV0ZXIgdXNlZCB0byBydW4gaXQuCi0KLSAgVGhlICJDb3JyZXNwb25kaW5nIFNvdXJjZSIgZm9yIGEgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIG1lYW5zIGFsbAotdGhlIHNvdXJjZSBjb2RlIG5lZWRlZCB0byBnZW5lcmF0ZSwgaW5zdGFsbCwgYW5kIChmb3IgYW4gZXhlY3V0YWJsZQotd29yaykgcnVuIHRoZSBvYmplY3QgY29kZSBhbmQgdG8gbW9kaWZ5IHRoZSB3b3JrLCBpbmNsdWRpbmcgc2NyaXB0cyB0bwotY29udHJvbCB0aG9zZSBhY3Rpdml0aWVzLiAgSG93ZXZlciwgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgd29yaydzCi1TeXN0ZW0gTGlicmFyaWVzLCBvciBnZW5lcmFsLXB1cnBvc2UgdG9vbHMgb3IgZ2VuZXJhbGx5IGF2YWlsYWJsZSBmcmVlCi1wcm9ncmFtcyB3aGljaCBhcmUgdXNlZCB1bm1vZGlmaWVkIGluIHBlcmZvcm1pbmcgdGhvc2UgYWN0aXZpdGllcyBidXQKLXdoaWNoIGFyZSBub3QgcGFydCBvZiB0aGUgd29yay4gIEZvciBleGFtcGxlLCBDb3JyZXNwb25kaW5nIFNvdXJjZQotaW5jbHVkZXMgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHNvdXJjZSBmaWxlcyBmb3IKLXRoZSB3b3JrLCBhbmQgdGhlIHNvdXJjZSBjb2RlIGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljYWxseQotbGlua2VkIHN1YnByb2dyYW1zIHRoYXQgdGhlIHdvcmsgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHJlcXVpcmUsCi1zdWNoIGFzIGJ5IGludGltYXRlIGRhdGEgY29tbXVuaWNhdGlvbiBvciBjb250cm9sIGZsb3cgYmV0d2VlbiB0aG9zZQotc3VicHJvZ3JhbXMgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSB3b3JrLgotCi0gIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgdXNlcnMKLWNhbiByZWdlbmVyYXRlIGF1dG9tYXRpY2FsbHkgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgQ29ycmVzcG9uZGluZwotU291cmNlLgotCi0gIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYSB3b3JrIGluIHNvdXJjZSBjb2RlIGZvcm0gaXMgdGhhdAotc2FtZSB3b3JrLgotCi0gIDIuIEJhc2ljIFBlcm1pc3Npb25zLgotCi0gIEFsbCByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UgYXJlIGdyYW50ZWQgZm9yIHRoZSB0ZXJtIG9mCi1jb3B5cmlnaHQgb24gdGhlIFByb2dyYW0sIGFuZCBhcmUgaXJyZXZvY2FibGUgcHJvdmlkZWQgdGhlIHN0YXRlZAotY29uZGl0aW9ucyBhcmUgbWV0LiAgVGhpcyBMaWNlbnNlIGV4cGxpY2l0bHkgYWZmaXJtcyB5b3VyIHVubGltaXRlZAotcGVybWlzc2lvbiB0byBydW4gdGhlIHVubW9kaWZpZWQgUHJvZ3JhbS4gIFRoZSBvdXRwdXQgZnJvbSBydW5uaW5nIGEKLWNvdmVyZWQgd29yayBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSBvbmx5IGlmIHRoZSBvdXRwdXQsIGdpdmVuIGl0cwotY29udGVudCwgY29uc3RpdHV0ZXMgYSBjb3ZlcmVkIHdvcmsuICBUaGlzIExpY2Vuc2UgYWNrbm93bGVkZ2VzIHlvdXIKLXJpZ2h0cyBvZiBmYWlyIHVzZSBvciBvdGhlciBlcXVpdmFsZW50LCBhcyBwcm92aWRlZCBieSBjb3B5cmlnaHQgbGF3LgotCi0gIFlvdSBtYXkgbWFrZSwgcnVuIGFuZCBwcm9wYWdhdGUgY292ZXJlZCB3b3JrcyB0aGF0IHlvdSBkbyBub3QKLWNvbnZleSwgd2l0aG91dCBjb25kaXRpb25zIHNvIGxvbmcgYXMgeW91ciBsaWNlbnNlIG90aGVyd2lzZSByZW1haW5zCi1pbiBmb3JjZS4gIFlvdSBtYXkgY29udmV5IGNvdmVyZWQgd29ya3MgdG8gb3RoZXJzIGZvciB0aGUgc29sZSBwdXJwb3NlCi1vZiBoYXZpbmcgdGhlbSBtYWtlIG1vZGlmaWNhdGlvbnMgZXhjbHVzaXZlbHkgZm9yIHlvdSwgb3IgcHJvdmlkZSB5b3UKLXdpdGggZmFjaWxpdGllcyBmb3IgcnVubmluZyB0aG9zZSB3b3JrcywgcHJvdmlkZWQgdGhhdCB5b3UgY29tcGx5IHdpdGgKLXRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgaW4gY29udmV5aW5nIGFsbCBtYXRlcmlhbCBmb3Igd2hpY2ggeW91IGRvCi1ub3QgY29udHJvbCBjb3B5cmlnaHQuICBUaG9zZSB0aHVzIG1ha2luZyBvciBydW5uaW5nIHRoZSBjb3ZlcmVkIHdvcmtzCi1mb3IgeW91IG11c3QgZG8gc28gZXhjbHVzaXZlbHkgb24geW91ciBiZWhhbGYsIHVuZGVyIHlvdXIgZGlyZWN0aW9uCi1hbmQgY29udHJvbCwgb24gdGVybXMgdGhhdCBwcm9oaWJpdCB0aGVtIGZyb20gbWFraW5nIGFueSBjb3BpZXMgb2YKLXlvdXIgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgb3V0c2lkZSB0aGVpciByZWxhdGlvbnNoaXAgd2l0aCB5b3UuCi0KLSAgQ29udmV5aW5nIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIGlzIHBlcm1pdHRlZCBzb2xlbHkgdW5kZXIKLXRoZSBjb25kaXRpb25zIHN0YXRlZCBiZWxvdy4gIFN1YmxpY2Vuc2luZyBpcyBub3QgYWxsb3dlZDsgc2VjdGlvbiAxMAotbWFrZXMgaXQgdW5uZWNlc3NhcnkuCi0KLSAgMy4gUHJvdGVjdGluZyBVc2VycycgTGVnYWwgUmlnaHRzIEZyb20gQW50aS1DaXJjdW12ZW50aW9uIExhdy4KLQotICBObyBjb3ZlcmVkIHdvcmsgc2hhbGwgYmUgZGVlbWVkIHBhcnQgb2YgYW4gZWZmZWN0aXZlIHRlY2hub2xvZ2ljYWwKLW1lYXN1cmUgdW5kZXIgYW55IGFwcGxpY2FibGUgbGF3IGZ1bGZpbGxpbmcgb2JsaWdhdGlvbnMgdW5kZXIgYXJ0aWNsZQotMTEgb2YgdGhlIFdJUE8gY29weXJpZ2h0IHRyZWF0eSBhZG9wdGVkIG9uIDIwIERlY2VtYmVyIDE5OTYsIG9yCi1zaW1pbGFyIGxhd3MgcHJvaGliaXRpbmcgb3IgcmVzdHJpY3RpbmcgY2lyY3VtdmVudGlvbiBvZiBzdWNoCi1tZWFzdXJlcy4KLQotICBXaGVuIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHlvdSB3YWl2ZSBhbnkgbGVnYWwgcG93ZXIgdG8gZm9yYmlkCi1jaXJjdW12ZW50aW9uIG9mIHRlY2hub2xvZ2ljYWwgbWVhc3VyZXMgdG8gdGhlIGV4dGVudCBzdWNoIGNpcmN1bXZlbnRpb24KLWlzIGVmZmVjdGVkIGJ5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8KLXRoZSBjb3ZlcmVkIHdvcmssIGFuZCB5b3UgZGlzY2xhaW0gYW55IGludGVudGlvbiB0byBsaW1pdCBvcGVyYXRpb24gb3IKLW1vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBhcyBhIG1lYW5zIG9mIGVuZm9yY2luZywgYWdhaW5zdCB0aGUgd29yaydzCi11c2VycywgeW91ciBvciB0aGlyZCBwYXJ0aWVzJyBsZWdhbCByaWdodHMgdG8gZm9yYmlkIGNpcmN1bXZlbnRpb24gb2YKLXRlY2hub2xvZ2ljYWwgbWVhc3VyZXMuCi0KLSAgNC4gQ29udmV5aW5nIFZlcmJhdGltIENvcGllcy4KLQotICBZb3UgbWF5IGNvbnZleSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSBhcyB5b3UKLXJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kCi1hcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2U7Ci1rZWVwIGludGFjdCBhbGwgbm90aWNlcyBzdGF0aW5nIHRoYXQgdGhpcyBMaWNlbnNlIGFuZCBhbnkKLW5vbi1wZXJtaXNzaXZlIHRlcm1zIGFkZGVkIGluIGFjY29yZCB3aXRoIHNlY3Rpb24gNyBhcHBseSB0byB0aGUgY29kZTsKLWtlZXAgaW50YWN0IGFsbCBub3RpY2VzIG9mIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYWxsCi1yZWNpcGllbnRzIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotICBZb3UgbWF5IGNoYXJnZSBhbnkgcHJpY2Ugb3Igbm8gcHJpY2UgZm9yIGVhY2ggY29weSB0aGF0IHlvdSBjb252ZXksCi1hbmQgeW91IG1heSBvZmZlciBzdXBwb3J0IG9yIHdhcnJhbnR5IHByb3RlY3Rpb24gZm9yIGEgZmVlLgotCi0gIDUuIENvbnZleWluZyBNb2RpZmllZCBTb3VyY2UgVmVyc2lvbnMuCi0KLSAgWW91IG1heSBjb252ZXkgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBvciB0aGUgbW9kaWZpY2F0aW9ucyB0bwotcHJvZHVjZSBpdCBmcm9tIHRoZSBQcm9ncmFtLCBpbiB0aGUgZm9ybSBvZiBzb3VyY2UgY29kZSB1bmRlciB0aGUKLXRlcm1zIG9mIHNlY3Rpb24gNCwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IG1vZGlmaWVkCi0gICAgaXQsIGFuZCBnaXZpbmcgYSByZWxldmFudCBkYXRlLgotCi0gICAgYikgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgaXQgaXMKLSAgICByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBjb25kaXRpb25zIGFkZGVkIHVuZGVyIHNlY3Rpb24KLSAgICA3LiAgVGhpcyByZXF1aXJlbWVudCBtb2RpZmllcyB0aGUgcmVxdWlyZW1lbnQgaW4gc2VjdGlvbiA0IHRvCi0gICAgImtlZXAgaW50YWN0IGFsbCBub3RpY2VzIi4KLQotICAgIGMpIFlvdSBtdXN0IGxpY2Vuc2UgdGhlIGVudGlyZSB3b3JrLCBhcyBhIHdob2xlLCB1bmRlciB0aGlzCi0gICAgTGljZW5zZSB0byBhbnlvbmUgd2hvIGNvbWVzIGludG8gcG9zc2Vzc2lvbiBvZiBhIGNvcHkuICBUaGlzCi0gICAgTGljZW5zZSB3aWxsIHRoZXJlZm9yZSBhcHBseSwgYWxvbmcgd2l0aCBhbnkgYXBwbGljYWJsZSBzZWN0aW9uIDcKLSAgICBhZGRpdGlvbmFsIHRlcm1zLCB0byB0aGUgd2hvbGUgb2YgdGhlIHdvcmssIGFuZCBhbGwgaXRzIHBhcnRzLAotICAgIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgYXJlIHBhY2thZ2VkLiAgVGhpcyBMaWNlbnNlIGdpdmVzIG5vCi0gICAgcGVybWlzc2lvbiB0byBsaWNlbnNlIHRoZSB3b3JrIGluIGFueSBvdGhlciB3YXksIGJ1dCBpdCBkb2VzIG5vdAotICAgIGludmFsaWRhdGUgc3VjaCBwZXJtaXNzaW9uIGlmIHlvdSBoYXZlIHNlcGFyYXRlbHkgcmVjZWl2ZWQgaXQuCi0KLSAgICBkKSBJZiB0aGUgd29yayBoYXMgaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2VzLCBlYWNoIG11c3QgZGlzcGxheQotICAgIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXM7IGhvd2V2ZXIsIGlmIHRoZSBQcm9ncmFtIGhhcyBpbnRlcmFjdGl2ZQotICAgIGludGVyZmFjZXMgdGhhdCBkbyBub3QgZGlzcGxheSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzLCB5b3VyCi0gICAgd29yayBuZWVkIG5vdCBtYWtlIHRoZW0gZG8gc28uCi0KLSAgQSBjb21waWxhdGlvbiBvZiBhIGNvdmVyZWQgd29yayB3aXRoIG90aGVyIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudAotd29ya3MsIHdoaWNoIGFyZSBub3QgYnkgdGhlaXIgbmF0dXJlIGV4dGVuc2lvbnMgb2YgdGhlIGNvdmVyZWQgd29yaywKLWFuZCB3aGljaCBhcmUgbm90IGNvbWJpbmVkIHdpdGggaXQgc3VjaCBhcyB0byBmb3JtIGEgbGFyZ2VyIHByb2dyYW0sCi1pbiBvciBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuCi0iYWdncmVnYXRlIiBpZiB0aGUgY29tcGlsYXRpb24gYW5kIGl0cyByZXN1bHRpbmcgY29weXJpZ2h0IGFyZSBub3QKLXVzZWQgdG8gbGltaXQgdGhlIGFjY2VzcyBvciBsZWdhbCByaWdodHMgb2YgdGhlIGNvbXBpbGF0aW9uJ3MgdXNlcnMKLWJleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4gIEluY2x1c2lvbiBvZiBhIGNvdmVyZWQgd29yawotaW4gYW4gYWdncmVnYXRlIGRvZXMgbm90IGNhdXNlIHRoaXMgTGljZW5zZSB0byBhcHBseSB0byB0aGUgb3RoZXIKLXBhcnRzIG9mIHRoZSBhZ2dyZWdhdGUuCi0KLSAgNi4gQ29udmV5aW5nIE5vbi1Tb3VyY2UgRm9ybXMuCi0KLSAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMKLW9mIHNlY3Rpb25zIDQgYW5kIDUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gY29udmV5IHRoZQotbWFjaGluZS1yZWFkYWJsZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLAotaW4gb25lIG9mIHRoZXNlIHdheXM6Ci0KLSAgICBhKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0Ci0gICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSB0aGUKLSAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmaXhlZCBvbiBhIGR1cmFibGUgcGh5c2ljYWwgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCi0KLSAgICBiKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0Ci0gICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSBhCi0gICAgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzIGFuZCB2YWxpZCBmb3IgYXMKLSAgICBsb25nIGFzIHlvdSBvZmZlciBzcGFyZSBwYXJ0cyBvciBjdXN0b21lciBzdXBwb3J0IGZvciB0aGF0IHByb2R1Y3QKLSAgICBtb2RlbCwgdG8gZ2l2ZSBhbnlvbmUgd2hvIHBvc3Nlc3NlcyB0aGUgb2JqZWN0IGNvZGUgZWl0aGVyICgxKSBhCi0gICAgY29weSBvZiB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGFsbCB0aGUgc29mdHdhcmUgaW4gdGhlCi0gICAgcHJvZHVjdCB0aGF0IGlzIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBvbiBhIGR1cmFibGUgcGh5c2ljYWwKLSAgICBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UsIGZvciBhIHByaWNlIG5vCi0gICAgbW9yZSB0aGFuIHlvdXIgcmVhc29uYWJsZSBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyB0aGlzCi0gICAgY29udmV5aW5nIG9mIHNvdXJjZSwgb3IgKDIpIGFjY2VzcyB0byBjb3B5IHRoZQotICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZyb20gYSBuZXR3b3JrIHNlcnZlciBhdCBubyBjaGFyZ2UuCi0KLSAgICBjKSBDb252ZXkgaW5kaXZpZHVhbCBjb3BpZXMgb2YgdGhlIG9iamVjdCBjb2RlIHdpdGggYSBjb3B5IG9mIHRoZQotICAgIHdyaXR0ZW4gb2ZmZXIgdG8gcHJvdmlkZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBUaGlzCi0gICAgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IG9jY2FzaW9uYWxseSBhbmQgbm9uY29tbWVyY2lhbGx5LCBhbmQKLSAgICBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUgb2JqZWN0IGNvZGUgd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQKLSAgICB3aXRoIHN1YnNlY3Rpb24gNmIuCi0KLSAgICBkKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGJ5IG9mZmVyaW5nIGFjY2VzcyBmcm9tIGEgZGVzaWduYXRlZAotICAgIHBsYWNlIChncmF0aXMgb3IgZm9yIGEgY2hhcmdlKSwgYW5kIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIHRoZQotICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGluIHRoZSBzYW1lIHdheSB0aHJvdWdoIHRoZSBzYW1lIHBsYWNlIGF0IG5vCi0gICAgZnVydGhlciBjaGFyZ2UuICBZb3UgbmVlZCBub3QgcmVxdWlyZSByZWNpcGllbnRzIHRvIGNvcHkgdGhlCi0gICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuICBJZiB0aGUgcGxhY2UgdG8KLSAgICBjb3B5IHRoZSBvYmplY3QgY29kZSBpcyBhIG5ldHdvcmsgc2VydmVyLCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UKLSAgICBtYXkgYmUgb24gYSBkaWZmZXJlbnQgc2VydmVyIChvcGVyYXRlZCBieSB5b3Ugb3IgYSB0aGlyZCBwYXJ0eSkKLSAgICB0aGF0IHN1cHBvcnRzIGVxdWl2YWxlbnQgY29weWluZyBmYWNpbGl0aWVzLCBwcm92aWRlZCB5b3UgbWFpbnRhaW4KLSAgICBjbGVhciBkaXJlY3Rpb25zIG5leHQgdG8gdGhlIG9iamVjdCBjb2RlIHNheWluZyB3aGVyZSB0byBmaW5kIHRoZQotICAgIENvcnJlc3BvbmRpbmcgU291cmNlLiAgUmVnYXJkbGVzcyBvZiB3aGF0IHNlcnZlciBob3N0cyB0aGUKLSAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSwgeW91IHJlbWFpbiBvYmxpZ2F0ZWQgdG8gZW5zdXJlIHRoYXQgaXQgaXMKLSAgICBhdmFpbGFibGUgZm9yIGFzIGxvbmcgYXMgbmVlZGVkIHRvIHNhdGlzZnkgdGhlc2UgcmVxdWlyZW1lbnRzLgotCi0gICAgZSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uLCBwcm92aWRlZAotICAgIHlvdSBpbmZvcm0gb3RoZXIgcGVlcnMgd2hlcmUgdGhlIG9iamVjdCBjb2RlIGFuZCBDb3JyZXNwb25kaW5nCi0gICAgU291cmNlIG9mIHRoZSB3b3JrIGFyZSBiZWluZyBvZmZlcmVkIHRvIHRoZSBnZW5lcmFsIHB1YmxpYyBhdCBubwotICAgIGNoYXJnZSB1bmRlciBzdWJzZWN0aW9uIDZkLgotCi0gIEEgc2VwYXJhYmxlIHBvcnRpb24gb2YgdGhlIG9iamVjdCBjb2RlLCB3aG9zZSBzb3VyY2UgY29kZSBpcyBleGNsdWRlZAotZnJvbSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgYXMgYSBTeXN0ZW0gTGlicmFyeSwgbmVlZCBub3QgYmUKLWluY2x1ZGVkIGluIGNvbnZleWluZyB0aGUgb2JqZWN0IGNvZGUgd29yay4KLQotICBBICJVc2VyIFByb2R1Y3QiIGlzIGVpdGhlciAoMSkgYSAiY29uc3VtZXIgcHJvZHVjdCIsIHdoaWNoIG1lYW5zIGFueQotdGFuZ2libGUgcGVyc29uYWwgcHJvcGVydHkgd2hpY2ggaXMgbm9ybWFsbHkgdXNlZCBmb3IgcGVyc29uYWwsIGZhbWlseSwKLW9yIGhvdXNlaG9sZCBwdXJwb3Nlcywgb3IgKDIpIGFueXRoaW5nIGRlc2lnbmVkIG9yIHNvbGQgZm9yIGluY29ycG9yYXRpb24KLWludG8gYSBkd2VsbGluZy4gIEluIGRldGVybWluaW5nIHdoZXRoZXIgYSBwcm9kdWN0IGlzIGEgY29uc3VtZXIgcHJvZHVjdCwKLWRvdWJ0ZnVsIGNhc2VzIHNoYWxsIGJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvdmVyYWdlLiAgRm9yIGEgcGFydGljdWxhcgotcHJvZHVjdCByZWNlaXZlZCBieSBhIHBhcnRpY3VsYXIgdXNlciwgIm5vcm1hbGx5IHVzZWQiIHJlZmVycyB0byBhCi10eXBpY2FsIG9yIGNvbW1vbiB1c2Ugb2YgdGhhdCBjbGFzcyBvZiBwcm9kdWN0LCByZWdhcmRsZXNzIG9mIHRoZSBzdGF0dXMKLW9mIHRoZSBwYXJ0aWN1bGFyIHVzZXIgb3Igb2YgdGhlIHdheSBpbiB3aGljaCB0aGUgcGFydGljdWxhciB1c2VyCi1hY3R1YWxseSB1c2VzLCBvciBleHBlY3RzIG9yIGlzIGV4cGVjdGVkIHRvIHVzZSwgdGhlIHByb2R1Y3QuICBBIHByb2R1Y3QKLWlzIGEgY29uc3VtZXIgcHJvZHVjdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHByb2R1Y3QgaGFzIHN1YnN0YW50aWFsCi1jb21tZXJjaWFsLCBpbmR1c3RyaWFsIG9yIG5vbi1jb25zdW1lciB1c2VzLCB1bmxlc3Mgc3VjaCB1c2VzIHJlcHJlc2VudAotdGhlIG9ubHkgc2lnbmlmaWNhbnQgbW9kZSBvZiB1c2Ugb2YgdGhlIHByb2R1Y3QuCi0KLSAgIkluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiIgZm9yIGEgVXNlciBQcm9kdWN0IG1lYW5zIGFueSBtZXRob2RzLAotcHJvY2VkdXJlcywgYXV0aG9yaXphdGlvbiBrZXlzLCBvciBvdGhlciBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBpbnN0YWxsCi1hbmQgZXhlY3V0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBhIGNvdmVyZWQgd29yayBpbiB0aGF0IFVzZXIgUHJvZHVjdCBmcm9tCi1hIG1vZGlmaWVkIHZlcnNpb24gb2YgaXRzIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhlIGluZm9ybWF0aW9uIG11c3QKLXN1ZmZpY2UgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRpbnVlZCBmdW5jdGlvbmluZyBvZiB0aGUgbW9kaWZpZWQgb2JqZWN0Ci1jb2RlIGlzIGluIG5vIGNhc2UgcHJldmVudGVkIG9yIGludGVyZmVyZWQgd2l0aCBzb2xlbHkgYmVjYXVzZQotbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUuCi0KLSAgSWYgeW91IGNvbnZleSBhbiBvYmplY3QgY29kZSB3b3JrIHVuZGVyIHRoaXMgc2VjdGlvbiBpbiwgb3Igd2l0aCwgb3IKLXNwZWNpZmljYWxseSBmb3IgdXNlIGluLCBhIFVzZXIgUHJvZHVjdCwgYW5kIHRoZSBjb252ZXlpbmcgb2NjdXJzIGFzCi1wYXJ0IG9mIGEgdHJhbnNhY3Rpb24gaW4gd2hpY2ggdGhlIHJpZ2h0IG9mIHBvc3Nlc3Npb24gYW5kIHVzZSBvZiB0aGUKLVVzZXIgUHJvZHVjdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgcmVjaXBpZW50IGluIHBlcnBldHVpdHkgb3IgZm9yIGEKLWZpeGVkIHRlcm0gKHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSB0cmFuc2FjdGlvbiBpcyBjaGFyYWN0ZXJpemVkKSwgdGhlCi1Db3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCB1bmRlciB0aGlzIHNlY3Rpb24gbXVzdCBiZSBhY2NvbXBhbmllZAotYnkgdGhlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbi4gIEJ1dCB0aGlzIHJlcXVpcmVtZW50IGRvZXMgbm90IGFwcGx5Ci1pZiBuZWl0aGVyIHlvdSBub3IgYW55IHRoaXJkIHBhcnR5IHJldGFpbnMgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbAotbW9kaWZpZWQgb2JqZWN0IGNvZGUgb24gdGhlIFVzZXIgUHJvZHVjdCAoZm9yIGV4YW1wbGUsIHRoZSB3b3JrIGhhcwotYmVlbiBpbnN0YWxsZWQgaW4gUk9NKS4KLQotICBUaGUgcmVxdWlyZW1lbnQgdG8gcHJvdmlkZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gZG9lcyBub3QgaW5jbHVkZSBhCi1yZXF1aXJlbWVudCB0byBjb250aW51ZSB0byBwcm92aWRlIHN1cHBvcnQgc2VydmljZSwgd2FycmFudHksIG9yIHVwZGF0ZXMKLWZvciBhIHdvcmsgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQgYnkgdGhlIHJlY2lwaWVudCwgb3IgZm9yCi10aGUgVXNlciBQcm9kdWN0IGluIHdoaWNoIGl0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGluc3RhbGxlZC4gIEFjY2VzcyB0byBhCi1uZXR3b3JrIG1heSBiZSBkZW5pZWQgd2hlbiB0aGUgbW9kaWZpY2F0aW9uIGl0c2VsZiBtYXRlcmlhbGx5IGFuZAotYWR2ZXJzZWx5IGFmZmVjdHMgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbmV0d29yayBvciB2aW9sYXRlcyB0aGUgcnVsZXMgYW5kCi1wcm90b2NvbHMgZm9yIGNvbW11bmljYXRpb24gYWNyb3NzIHRoZSBuZXR3b3JrLgotCi0gIENvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkLCBhbmQgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIHByb3ZpZGVkLAotaW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gYSBmb3JtYXQgdGhhdCBpcyBwdWJsaWNseQotZG9jdW1lbnRlZCAoYW5kIHdpdGggYW4gaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4KLXNvdXJjZSBjb2RlIGZvcm0pLCBhbmQgbXVzdCByZXF1aXJlIG5vIHNwZWNpYWwgcGFzc3dvcmQgb3Iga2V5IGZvcgotdW5wYWNraW5nLCByZWFkaW5nIG9yIGNvcHlpbmcuCi0KLSAgNy4gQWRkaXRpb25hbCBUZXJtcy4KLQotICAiQWRkaXRpb25hbCBwZXJtaXNzaW9ucyIgYXJlIHRlcm1zIHRoYXQgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcwotTGljZW5zZSBieSBtYWtpbmcgZXhjZXB0aW9ucyBmcm9tIG9uZSBvciBtb3JlIG9mIGl0cyBjb25kaXRpb25zLgotQWRkaXRpb25hbCBwZXJtaXNzaW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbnRpcmUgUHJvZ3JhbSBzaGFsbAotYmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlIGluY2x1ZGVkIGluIHRoaXMgTGljZW5zZSwgdG8gdGhlIGV4dGVudAotdGhhdCB0aGV5IGFyZSB2YWxpZCB1bmRlciBhcHBsaWNhYmxlIGxhdy4gIElmIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMKLWFwcGx5IG9ubHkgdG8gcGFydCBvZiB0aGUgUHJvZ3JhbSwgdGhhdCBwYXJ0IG1heSBiZSB1c2VkIHNlcGFyYXRlbHkKLXVuZGVyIHRob3NlIHBlcm1pc3Npb25zLCBidXQgdGhlIGVudGlyZSBQcm9ncmFtIHJlbWFpbnMgZ292ZXJuZWQgYnkKLXRoaXMgTGljZW5zZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucy4KLQotICBXaGVuIHlvdSBjb252ZXkgYSBjb3B5IG9mIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uCi1yZW1vdmUgYW55IGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgZnJvbSB0aGF0IGNvcHksIG9yIGZyb20gYW55IHBhcnQgb2YKLWl0LiAgKEFkZGl0aW9uYWwgcGVybWlzc2lvbnMgbWF5IGJlIHdyaXR0ZW4gdG8gcmVxdWlyZSB0aGVpciBvd24KLXJlbW92YWwgaW4gY2VydGFpbiBjYXNlcyB3aGVuIHlvdSBtb2RpZnkgdGhlIHdvcmsuKSAgWW91IG1heSBwbGFjZQotYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvbiBtYXRlcmlhbCwgYWRkZWQgYnkgeW91IHRvIGEgY292ZXJlZCB3b3JrLAotZm9yIHdoaWNoIHlvdSBoYXZlIG9yIGNhbiBnaXZlIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBwZXJtaXNzaW9uLgotCi0gIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgZm9yIG1hdGVyaWFsIHlvdQotYWRkIHRvIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IChpZiBhdXRob3JpemVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZgotdGhhdCBtYXRlcmlhbCkgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGVybXM6Ci0KLSAgICBhKSBEaXNjbGFpbWluZyB3YXJyYW50eSBvciBsaW1pdGluZyBsaWFiaWxpdHkgZGlmZmVyZW50bHkgZnJvbSB0aGUKLSAgICB0ZXJtcyBvZiBzZWN0aW9ucyAxNSBhbmQgMTYgb2YgdGhpcyBMaWNlbnNlOyBvcgotCi0gICAgYikgUmVxdWlyaW5nIHByZXNlcnZhdGlvbiBvZiBzcGVjaWZpZWQgcmVhc29uYWJsZSBsZWdhbCBub3RpY2VzIG9yCi0gICAgYXV0aG9yIGF0dHJpYnV0aW9ucyBpbiB0aGF0IG1hdGVyaWFsIG9yIGluIHRoZSBBcHByb3ByaWF0ZSBMZWdhbAotICAgIE5vdGljZXMgZGlzcGxheWVkIGJ5IHdvcmtzIGNvbnRhaW5pbmcgaXQ7IG9yCi0KLSAgICBjKSBQcm9oaWJpdGluZyBtaXNyZXByZXNlbnRhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoYXQgbWF0ZXJpYWwsIG9yCi0gICAgcmVxdWlyaW5nIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBtYXRlcmlhbCBiZSBtYXJrZWQgaW4KLSAgICByZWFzb25hYmxlIHdheXMgYXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHZlcnNpb247IG9yCi0KLSAgICBkKSBMaW1pdGluZyB0aGUgdXNlIGZvciBwdWJsaWNpdHkgcHVycG9zZXMgb2YgbmFtZXMgb2YgbGljZW5zb3JzIG9yCi0gICAgYXV0aG9ycyBvZiB0aGUgbWF0ZXJpYWw7IG9yCi0KLSAgICBlKSBEZWNsaW5pbmcgdG8gZ3JhbnQgcmlnaHRzIHVuZGVyIHRyYWRlbWFyayBsYXcgZm9yIHVzZSBvZiBzb21lCi0gICAgdHJhZGUgbmFtZXMsIHRyYWRlbWFya3MsIG9yIHNlcnZpY2UgbWFya3M7IG9yCi0KLSAgICBmKSBSZXF1aXJpbmcgaW5kZW1uaWZpY2F0aW9uIG9mIGxpY2Vuc29ycyBhbmQgYXV0aG9ycyBvZiB0aGF0Ci0gICAgbWF0ZXJpYWwgYnkgYW55b25lIHdobyBjb252ZXlzIHRoZSBtYXRlcmlhbCAob3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YKLSAgICBpdCkgd2l0aCBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBvZiBsaWFiaWxpdHkgdG8gdGhlIHJlY2lwaWVudCwgZm9yCi0gICAgYW55IGxpYWJpbGl0eSB0aGF0IHRoZXNlIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIGRpcmVjdGx5IGltcG9zZSBvbgotICAgIHRob3NlIGxpY2Vuc29ycyBhbmQgYXV0aG9ycy4KLQotICBBbGwgb3RoZXIgbm9uLXBlcm1pc3NpdmUgYWRkaXRpb25hbCB0ZXJtcyBhcmUgY29uc2lkZXJlZCAiZnVydGhlcgotcmVzdHJpY3Rpb25zIiB3aXRoaW4gdGhlIG1lYW5pbmcgb2Ygc2VjdGlvbiAxMC4gIElmIHRoZSBQcm9ncmFtIGFzIHlvdQotcmVjZWl2ZWQgaXQsIG9yIGFueSBwYXJ0IG9mIGl0LCBjb250YWlucyBhIG5vdGljZSBzdGF0aW5nIHRoYXQgaXQgaXMKLWdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIGEgdGVybSB0aGF0IGlzIGEgZnVydGhlcgotcmVzdHJpY3Rpb24sIHlvdSBtYXkgcmVtb3ZlIHRoYXQgdGVybS4gIElmIGEgbGljZW5zZSBkb2N1bWVudCBjb250YWlucwotYSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGJ1dCBwZXJtaXRzIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZyB1bmRlciB0aGlzCi1MaWNlbnNlLCB5b3UgbWF5IGFkZCB0byBhIGNvdmVyZWQgd29yayBtYXRlcmlhbCBnb3Zlcm5lZCBieSB0aGUgdGVybXMKLW9mIHRoYXQgbGljZW5zZSBkb2N1bWVudCwgcHJvdmlkZWQgdGhhdCB0aGUgZnVydGhlciByZXN0cmljdGlvbiBkb2VzCi1ub3Qgc3Vydml2ZSBzdWNoIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZy4KLQotICBJZiB5b3UgYWRkIHRlcm1zIHRvIGEgY292ZXJlZCB3b3JrIGluIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiwgeW91Ci1tdXN0IHBsYWNlLCBpbiB0aGUgcmVsZXZhbnQgc291cmNlIGZpbGVzLCBhIHN0YXRlbWVudCBvZiB0aGUKLWFkZGl0aW9uYWwgdGVybXMgdGhhdCBhcHBseSB0byB0aG9zZSBmaWxlcywgb3IgYSBub3RpY2UgaW5kaWNhdGluZwotd2hlcmUgdG8gZmluZCB0aGUgYXBwbGljYWJsZSB0ZXJtcy4KLQotICBBZGRpdGlvbmFsIHRlcm1zLCBwZXJtaXNzaXZlIG9yIG5vbi1wZXJtaXNzaXZlLCBtYXkgYmUgc3RhdGVkIGluIHRoZQotZm9ybSBvZiBhIHNlcGFyYXRlbHkgd3JpdHRlbiBsaWNlbnNlLCBvciBzdGF0ZWQgYXMgZXhjZXB0aW9uczsKLXRoZSBhYm92ZSByZXF1aXJlbWVudHMgYXBwbHkgZWl0aGVyIHdheS4KLQotICA4LiBUZXJtaW5hdGlvbi4KLQotICBZb3UgbWF5IG5vdCBwcm9wYWdhdGUgb3IgbW9kaWZ5IGEgY292ZXJlZCB3b3JrIGV4Y2VwdCBhcyBleHByZXNzbHkKLXByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBwcm9wYWdhdGUgb3IKLW1vZGlmeSBpdCBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlcgotdGhpcyBMaWNlbnNlIChpbmNsdWRpbmcgYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIHVuZGVyIHRoZSB0aGlyZAotcGFyYWdyYXBoIG9mIHNlY3Rpb24gMTEpLgotCi0gIEhvd2V2ZXIsIGlmIHlvdSBjZWFzZSBhbGwgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgdGhlbiB5b3VyCi1saWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMgcmVpbnN0YXRlZCAoYSkKLXByb3Zpc2lvbmFsbHksIHVubGVzcyBhbmQgdW50aWwgdGhlIGNvcHlyaWdodCBob2xkZXIgZXhwbGljaXRseSBhbmQKLWZpbmFsbHkgdGVybWluYXRlcyB5b3VyIGxpY2Vuc2UsIGFuZCAoYikgcGVybWFuZW50bHksIGlmIHRoZSBjb3B5cmlnaHQKLWhvbGRlciBmYWlscyB0byBub3RpZnkgeW91IG9mIHRoZSB2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zCi1wcmlvciB0byA2MCBkYXlzIGFmdGVyIHRoZSBjZXNzYXRpb24uCi0KLSAgTW9yZW92ZXIsIHlvdXIgbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzCi1yZWluc3RhdGVkIHBlcm1hbmVudGx5IGlmIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vdGlmaWVzIHlvdSBvZiB0aGUKLXZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMsIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGhhdmUKLXJlY2VpdmVkIG5vdGljZSBvZiB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlIChmb3IgYW55IHdvcmspIGZyb20gdGhhdAotY29weXJpZ2h0IGhvbGRlciwgYW5kIHlvdSBjdXJlIHRoZSB2aW9sYXRpb24gcHJpb3IgdG8gMzAgZGF5cyBhZnRlcgoteW91ciByZWNlaXB0IG9mIHRoZSBub3RpY2UuCi0KLSAgVGVybWluYXRpb24gb2YgeW91ciByaWdodHMgdW5kZXIgdGhpcyBzZWN0aW9uIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUKLWxpY2Vuc2VzIG9mIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9yIHJpZ2h0cyBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlLiAgSWYgeW91ciByaWdodHMgaGF2ZSBiZWVuIHRlcm1pbmF0ZWQgYW5kIG5vdCBwZXJtYW5lbnRseQotcmVpbnN0YXRlZCwgeW91IGRvIG5vdCBxdWFsaWZ5IHRvIHJlY2VpdmUgbmV3IGxpY2Vuc2VzIGZvciB0aGUgc2FtZQotbWF0ZXJpYWwgdW5kZXIgc2VjdGlvbiAxMC4KLQotICA5LiBBY2NlcHRhbmNlIE5vdCBSZXF1aXJlZCBmb3IgSGF2aW5nIENvcGllcy4KLQotICBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlIGluIG9yZGVyIHRvIHJlY2VpdmUgb3IKLXJ1biBhIGNvcHkgb2YgdGhlIFByb2dyYW0uICBBbmNpbGxhcnkgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsKLW9jY3VycmluZyBzb2xlbHkgYXMgYSBjb25zZXF1ZW5jZSBvZiB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uCi10byByZWNlaXZlIGEgY29weSBsaWtld2lzZSBkb2VzIG5vdCByZXF1aXJlIGFjY2VwdGFuY2UuICBIb3dldmVyLAotbm90aGluZyBvdGhlciB0aGFuIHRoaXMgTGljZW5zZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gcHJvcGFnYXRlIG9yCi1tb2RpZnkgYW55IGNvdmVyZWQgd29yay4gIFRoZXNlIGFjdGlvbnMgaW5mcmluZ2UgY29weXJpZ2h0IGlmIHlvdSBkbwotbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBwcm9wYWdhdGluZyBhCi1jb3ZlcmVkIHdvcmssIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLgotCi0gIDEwLiBBdXRvbWF0aWMgTGljZW5zaW5nIG9mIERvd25zdHJlYW0gUmVjaXBpZW50cy4KLQotICBFYWNoIHRpbWUgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5Ci1yZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwgbGljZW5zb3JzLCB0byBydW4sIG1vZGlmeSBhbmQKLXByb3BhZ2F0ZSB0aGF0IHdvcmssIHN1YmplY3QgdG8gdGhpcyBMaWNlbnNlLiAgWW91IGFyZSBub3QgcmVzcG9uc2libGUKLWZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGggdGhpcyBMaWNlbnNlLgotCi0gIEFuICJlbnRpdHkgdHJhbnNhY3Rpb24iIGlzIGEgdHJhbnNhY3Rpb24gdHJhbnNmZXJyaW5nIGNvbnRyb2wgb2YgYW4KLW9yZ2FuaXphdGlvbiwgb3Igc3Vic3RhbnRpYWxseSBhbGwgYXNzZXRzIG9mIG9uZSwgb3Igc3ViZGl2aWRpbmcgYW4KLW9yZ2FuaXphdGlvbiwgb3IgbWVyZ2luZyBvcmdhbml6YXRpb25zLiAgSWYgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkCi13b3JrIHJlc3VsdHMgZnJvbSBhbiBlbnRpdHkgdHJhbnNhY3Rpb24sIGVhY2ggcGFydHkgdG8gdGhhdAotdHJhbnNhY3Rpb24gd2hvIHJlY2VpdmVzIGEgY29weSBvZiB0aGUgd29yayBhbHNvIHJlY2VpdmVzIHdoYXRldmVyCi1saWNlbnNlcyB0byB0aGUgd29yayB0aGUgcGFydHkncyBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCBoYWQgb3IgY291bGQKLWdpdmUgdW5kZXIgdGhlIHByZXZpb3VzIHBhcmFncmFwaCwgcGx1cyBhIHJpZ2h0IHRvIHBvc3Nlc3Npb24gb2YgdGhlCi1Db3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBmcm9tIHRoZSBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCwgaWYKLXRoZSBwcmVkZWNlc3NvciBoYXMgaXQgb3IgY2FuIGdldCBpdCB3aXRoIHJlYXNvbmFibGUgZWZmb3J0cy4KLQotICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBleGVyY2lzZSBvZiB0aGUKLXJpZ2h0cyBncmFudGVkIG9yIGFmZmlybWVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEZvciBleGFtcGxlLCB5b3UgbWF5Ci1ub3QgaW1wb3NlIGEgbGljZW5zZSBmZWUsIHJveWFsdHksIG9yIG90aGVyIGNoYXJnZSBmb3IgZXhlcmNpc2Ugb2YKLXJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHlvdSBtYXkgbm90IGluaXRpYXRlIGxpdGlnYXRpb24KLShpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0Ci1hbnkgcGF0ZW50IGNsYWltIGlzIGluZnJpbmdlZCBieSBtYWtpbmcsIHVzaW5nLCBzZWxsaW5nLCBvZmZlcmluZyBmb3IKLXNhbGUsIG9yIGltcG9ydGluZyB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdC4KLQotICAxMS4gUGF0ZW50cy4KLQotICBBICJjb250cmlidXRvciIgaXMgYSBjb3B5cmlnaHQgaG9sZGVyIHdobyBhdXRob3JpemVzIHVzZSB1bmRlciB0aGlzCi1MaWNlbnNlIG9mIHRoZSBQcm9ncmFtIG9yIGEgd29yayBvbiB3aGljaCB0aGUgUHJvZ3JhbSBpcyBiYXNlZC4gIFRoZQotd29yayB0aHVzIGxpY2Vuc2VkIGlzIGNhbGxlZCB0aGUgY29udHJpYnV0b3IncyAiY29udHJpYnV0b3IgdmVyc2lvbiIuCi0KLSAgQSBjb250cmlidXRvcidzICJlc3NlbnRpYWwgcGF0ZW50IGNsYWltcyIgYXJlIGFsbCBwYXRlbnQgY2xhaW1zCi1vd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBjb250cmlidXRvciwgd2hldGhlciBhbHJlYWR5IGFjcXVpcmVkIG9yCi1oZXJlYWZ0ZXIgYWNxdWlyZWQsIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIGJ5IHNvbWUgbWFubmVyLCBwZXJtaXR0ZWQKLWJ5IHRoaXMgTGljZW5zZSwgb2YgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBpdHMgY29udHJpYnV0b3IgdmVyc2lvbiwKLWJ1dCBkbyBub3QgaW5jbHVkZSBjbGFpbXMgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgb25seSBhcyBhCi1jb25zZXF1ZW5jZSBvZiBmdXJ0aGVyIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udHJpYnV0b3IgdmVyc2lvbi4gIEZvcgotcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgaW5jbHVkZXMgdGhlIHJpZ2h0IHRvIGdyYW50Ci1wYXRlbnQgc3VibGljZW5zZXMgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YKLXRoaXMgTGljZW5zZS4KLQotICBFYWNoIGNvbnRyaWJ1dG9yIGdyYW50cyB5b3UgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgdGhlIGNvbnRyaWJ1dG9yJ3MgZXNzZW50aWFsIHBhdGVudCBjbGFpbXMsIHRvCi1tYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBpbXBvcnQgYW5kIG90aGVyd2lzZSBydW4sIG1vZGlmeSBhbmQKLXByb3BhZ2F0ZSB0aGUgY29udGVudHMgb2YgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24uCi0KLSAgSW4gdGhlIGZvbGxvd2luZyB0aHJlZSBwYXJhZ3JhcGhzLCBhICJwYXRlbnQgbGljZW5zZSIgaXMgYW55IGV4cHJlc3MKLWFncmVlbWVudCBvciBjb21taXRtZW50LCBob3dldmVyIGRlbm9taW5hdGVkLCBub3QgdG8gZW5mb3JjZSBhIHBhdGVudAotKHN1Y2ggYXMgYW4gZXhwcmVzcyBwZXJtaXNzaW9uIHRvIHByYWN0aWNlIGEgcGF0ZW50IG9yIGNvdmVuYW50IG5vdCB0bwotc3VlIGZvciBwYXRlbnQgaW5mcmluZ2VtZW50KS4gIFRvICJncmFudCIgc3VjaCBhIHBhdGVudCBsaWNlbnNlIHRvIGEKLXBhcnR5IG1lYW5zIHRvIG1ha2Ugc3VjaCBhbiBhZ3JlZW1lbnQgb3IgY29tbWl0bWVudCBub3QgdG8gZW5mb3JjZSBhCi1wYXRlbnQgYWdhaW5zdCB0aGUgcGFydHkuCi0KLSAgSWYgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywga25vd2luZ2x5IHJlbHlpbmcgb24gYSBwYXRlbnQgbGljZW5zZSwKLWFuZCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgaXMgbm90IGF2YWlsYWJsZSBmb3IgYW55b25lCi10byBjb3B5LCBmcmVlIG9mIGNoYXJnZSBhbmQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgdGhyb3VnaCBhCi1wdWJsaWNseSBhdmFpbGFibGUgbmV0d29yayBzZXJ2ZXIgb3Igb3RoZXIgcmVhZGlseSBhY2Nlc3NpYmxlIG1lYW5zLAotdGhlbiB5b3UgbXVzdCBlaXRoZXIgKDEpIGNhdXNlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB0byBiZSBzbwotYXZhaWxhYmxlLCBvciAoMikgYXJyYW5nZSB0byBkZXByaXZlIHlvdXJzZWxmIG9mIHRoZSBiZW5lZml0IG9mIHRoZQotcGF0ZW50IGxpY2Vuc2UgZm9yIHRoaXMgcGFydGljdWxhciB3b3JrLCBvciAoMykgYXJyYW5nZSwgaW4gYSBtYW5uZXIKLWNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSwgdG8gZXh0ZW5kIHRoZSBwYXRlbnQKLWxpY2Vuc2UgdG8gZG93bnN0cmVhbSByZWNpcGllbnRzLiAgIktub3dpbmdseSByZWx5aW5nIiBtZWFucyB5b3UgaGF2ZQotYWN0dWFsIGtub3dsZWRnZSB0aGF0LCBidXQgZm9yIHRoZSBwYXRlbnQgbGljZW5zZSwgeW91ciBjb252ZXlpbmcgdGhlCi1jb3ZlcmVkIHdvcmsgaW4gYSBjb3VudHJ5LCBvciB5b3VyIHJlY2lwaWVudCdzIHVzZSBvZiB0aGUgY292ZXJlZCB3b3JrCi1pbiBhIGNvdW50cnksIHdvdWxkIGluZnJpbmdlIG9uZSBvciBtb3JlIGlkZW50aWZpYWJsZSBwYXRlbnRzIGluIHRoYXQKLWNvdW50cnkgdGhhdCB5b3UgaGF2ZSByZWFzb24gdG8gYmVsaWV2ZSBhcmUgdmFsaWQuCi0KLSAgSWYsIHB1cnN1YW50IHRvIG9yIGluIGNvbm5lY3Rpb24gd2l0aCBhIHNpbmdsZSB0cmFuc2FjdGlvbiBvcgotYXJyYW5nZW1lbnQsIHlvdSBjb252ZXksIG9yIHByb3BhZ2F0ZSBieSBwcm9jdXJpbmcgY29udmV5YW5jZSBvZiwgYQotY292ZXJlZCB3b3JrLCBhbmQgZ3JhbnQgYSBwYXRlbnQgbGljZW5zZSB0byBzb21lIG9mIHRoZSBwYXJ0aWVzCi1yZWNlaXZpbmcgdGhlIGNvdmVyZWQgd29yayBhdXRob3JpemluZyB0aGVtIHRvIHVzZSwgcHJvcGFnYXRlLCBtb2RpZnkKLW9yIGNvbnZleSBhIHNwZWNpZmljIGNvcHkgb2YgdGhlIGNvdmVyZWQgd29yaywgdGhlbiB0aGUgcGF0ZW50IGxpY2Vuc2UKLXlvdSBncmFudCBpcyBhdXRvbWF0aWNhbGx5IGV4dGVuZGVkIHRvIGFsbCByZWNpcGllbnRzIG9mIHRoZSBjb3ZlcmVkCi13b3JrIGFuZCB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICBBIHBhdGVudCBsaWNlbnNlIGlzICJkaXNjcmltaW5hdG9yeSIgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSB3aXRoaW4KLXRoZSBzY29wZSBvZiBpdHMgY292ZXJhZ2UsIHByb2hpYml0cyB0aGUgZXhlcmNpc2Ugb2YsIG9yIGlzCi1jb25kaXRpb25lZCBvbiB0aGUgbm9uLWV4ZXJjaXNlIG9mIG9uZSBvciBtb3JlIG9mIHRoZSByaWdodHMgdGhhdCBhcmUKLXNwZWNpZmljYWxseSBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIFlvdSBtYXkgbm90IGNvbnZleSBhIGNvdmVyZWQKLXdvcmsgaWYgeW91IGFyZSBhIHBhcnR5IHRvIGFuIGFycmFuZ2VtZW50IHdpdGggYSB0aGlyZCBwYXJ0eSB0aGF0IGlzCi1pbiB0aGUgYnVzaW5lc3Mgb2YgZGlzdHJpYnV0aW5nIHNvZnR3YXJlLCB1bmRlciB3aGljaCB5b3UgbWFrZSBwYXltZW50Ci10byB0aGUgdGhpcmQgcGFydHkgYmFzZWQgb24gdGhlIGV4dGVudCBvZiB5b3VyIGFjdGl2aXR5IG9mIGNvbnZleWluZwotdGhlIHdvcmssIGFuZCB1bmRlciB3aGljaCB0aGUgdGhpcmQgcGFydHkgZ3JhbnRzLCB0byBhbnkgb2YgdGhlCi1wYXJ0aWVzIHdobyB3b3VsZCByZWNlaXZlIHRoZSBjb3ZlcmVkIHdvcmsgZnJvbSB5b3UsIGEgZGlzY3JpbWluYXRvcnkKLXBhdGVudCBsaWNlbnNlIChhKSBpbiBjb25uZWN0aW9uIHdpdGggY29waWVzIG9mIHRoZSBjb3ZlcmVkIHdvcmsKLWNvbnZleWVkIGJ5IHlvdSAob3IgY29waWVzIG1hZGUgZnJvbSB0aG9zZSBjb3BpZXMpLCBvciAoYikgcHJpbWFyaWx5Ci1mb3IgYW5kIGluIGNvbm5lY3Rpb24gd2l0aCBzcGVjaWZpYyBwcm9kdWN0cyBvciBjb21waWxhdGlvbnMgdGhhdAotY29udGFpbiB0aGUgY292ZXJlZCB3b3JrLCB1bmxlc3MgeW91IGVudGVyZWQgaW50byB0aGF0IGFycmFuZ2VtZW50LAotb3IgdGhhdCBwYXRlbnQgbGljZW5zZSB3YXMgZ3JhbnRlZCwgcHJpb3IgdG8gMjggTWFyY2ggMjAwNy4KLQotICBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBjb25zdHJ1ZWQgYXMgZXhjbHVkaW5nIG9yIGxpbWl0aW5nCi1hbnkgaW1wbGllZCBsaWNlbnNlIG9yIG90aGVyIGRlZmVuc2VzIHRvIGluZnJpbmdlbWVudCB0aGF0IG1heQotb3RoZXJ3aXNlIGJlIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYXBwbGljYWJsZSBwYXRlbnQgbGF3LgotCi0gIDEyLiBObyBTdXJyZW5kZXIgb2YgT3RoZXJzJyBGcmVlZG9tLgotCi0gIElmIGNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGNvbnZleSBhCi1jb3ZlcmVkIHdvcmsgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5Ci1ub3QgY29udmV5IGl0IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYWdyZWUgdG8gdGVybXMgdGhhdCBvYmxpZ2F0ZSB5b3UKLXRvIGNvbGxlY3QgYSByb3lhbHR5IGZvciBmdXJ0aGVyIGNvbnZleWluZyBmcm9tIHRob3NlIHRvIHdob20geW91IGNvbnZleQotdGhlIFByb2dyYW0sIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIHRob3NlIHRlcm1zIGFuZCB0aGlzCi1MaWNlbnNlIHdvdWxkIGJlIHRvIHJlZnJhaW4gZW50aXJlbHkgZnJvbSBjb252ZXlpbmcgdGhlIFByb2dyYW0uCi0KLSAgMTMuIFVzZSB3aXRoIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0KLSAgTm90d2l0aHN0YW5kaW5nIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLCB5b3UgaGF2ZQotcGVybWlzc2lvbiB0byBsaW5rIG9yIGNvbWJpbmUgYW55IGNvdmVyZWQgd29yayB3aXRoIGEgd29yayBsaWNlbnNlZAotdW5kZXIgdmVyc2lvbiAzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW50byBhIHNpbmdsZQotY29tYmluZWQgd29yaywgYW5kIHRvIGNvbnZleSB0aGUgcmVzdWx0aW5nIHdvcmsuICBUaGUgdGVybXMgb2YgdGhpcwotTGljZW5zZSB3aWxsIGNvbnRpbnVlIHRvIGFwcGx5IHRvIHRoZSBwYXJ0IHdoaWNoIGlzIHRoZSBjb3ZlcmVkIHdvcmssCi1idXQgdGhlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi1zZWN0aW9uIDEzLCBjb25jZXJuaW5nIGludGVyYWN0aW9uIHRocm91Z2ggYSBuZXR3b3JrIHdpbGwgYXBwbHkgdG8gdGhlCi1jb21iaW5hdGlvbiBhcyBzdWNoLgotCi0gIDE0LiBSZXZpc2VkIFZlcnNpb25zIG9mIHRoaXMgTGljZW5zZS4KLQotICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZgotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotICBFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZQotUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbiBvZiB0aGUgR05VIEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlICJvciBhbnkgbGF0ZXIgdmVyc2lvbiIgYXBwbGllcyB0byBpdCwgeW91IGhhdmUgdGhlCi1vcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCBudW1iZXJlZAotdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQKLWJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgSWYgdGhlIFByb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBwcm94eSBjYW4gZGVjaWRlIHdoaWNoIGZ1dHVyZQotdmVyc2lvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB1c2VkLCB0aGF0IHByb3h5J3MKLXB1YmxpYyBzdGF0ZW1lbnQgb2YgYWNjZXB0YW5jZSBvZiBhIHZlcnNpb24gcGVybWFuZW50bHkgYXV0aG9yaXplcyB5b3UKLXRvIGNob29zZSB0aGF0IHZlcnNpb24gZm9yIHRoZSBQcm9ncmFtLgotCi0gIExhdGVyIGxpY2Vuc2UgdmVyc2lvbnMgbWF5IGdpdmUgeW91IGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50Ci1wZXJtaXNzaW9ucy4gIEhvd2V2ZXIsIG5vIGFkZGl0aW9uYWwgb2JsaWdhdGlvbnMgYXJlIGltcG9zZWQgb24gYW55Ci1hdXRob3Igb3IgY29weXJpZ2h0IGhvbGRlciBhcyBhIHJlc3VsdCBvZiB5b3VyIGNob29zaW5nIHRvIGZvbGxvdyBhCi1sYXRlciB2ZXJzaW9uLgotCi0gIDE1LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LgotCi0gIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkKLUFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQKLUhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkKLU9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0KLUlTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRgotQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDE2LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4KLQotICBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTU9ESUZJRVMgQU5EL09SIENPTlZFWVMKLVRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQotR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFCi1VU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GCi1EQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRAotUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksCi1FVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi1TVUNIIERBTUFHRVMuCi0KLSAgMTcuIEludGVycHJldGF0aW9uIG9mIFNlY3Rpb25zIDE1IGFuZCAxNi4KLQotICBJZiB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50eSBhbmQgbGltaXRhdGlvbiBvZiBsaWFiaWxpdHkgcHJvdmlkZWQKLWFib3ZlIGNhbm5vdCBiZSBnaXZlbiBsb2NhbCBsZWdhbCBlZmZlY3QgYWNjb3JkaW5nIHRvIHRoZWlyIHRlcm1zLAotcmV2aWV3aW5nIGNvdXJ0cyBzaGFsbCBhcHBseSBsb2NhbCBsYXcgdGhhdCBtb3N0IGNsb3NlbHkgYXBwcm94aW1hdGVzCi1hbiBhYnNvbHV0ZSB3YWl2ZXIgb2YgYWxsIGNpdmlsIGxpYWJpbGl0eSBpbiBjb25uZWN0aW9uIHdpdGggdGhlCi1Qcm9ncmFtLCB1bmxlc3MgYSB3YXJyYW50eSBvciBhc3N1bXB0aW9uIG9mIGxpYWJpbGl0eSBhY2NvbXBhbmllcyBhCi1jb3B5IG9mIHRoZSBQcm9ncmFtIGluIHJldHVybiBmb3IgYSBmZWUuCi0KLSAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotc3RhdGUgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi0gIElmIHRoZSBwcm9ncmFtIGRvZXMgdGVybWluYWwgaW50ZXJhY3Rpb24sIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQKLW5vdGljZSBsaWtlIHRoaXMgd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIDxwcm9ncmFtPiAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLSAgICBUaGlzIHByb2dyYW0gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHlvdXIgcHJvZ3JhbSdzIGNvbW1hbmRzCi1taWdodCBiZSBkaWZmZXJlbnQ7IGZvciBhIEdVSSBpbnRlcmZhY2UsIHlvdSB3b3VsZCB1c2UgYW4gImFib3V0IGJveCIuCi0KLSAgWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHNjaG9vbCwKLWlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZiBuZWNlc3NhcnkuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLCBhbmQgaG93IHRvIGFwcGx5IGFuZCBmb2xsb3cgdGhlIEdOVSBHUEwsIHNlZQotPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0gIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0KLWludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQotbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoCi10aGUgbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLiAgQnV0IGZpcnN0LCBwbGVhc2UgcmVhZAotPGh0dHA6Ly93d3cuZ251Lm9yZy9waGlsb3NvcGh5L3doeS1ub3QtbGdwbC5odG1sPi4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvQ2hhbmdlTG9nIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9JTlNUQUxMIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9JTlNUQUxMCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2UzZGNhLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvSU5TVEFMTAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWNtYWtlIC4KLW1ha2UKLW1ha2UgaW5zdGFsbAotCi1JZiB5b3Ugd2FudCB0byBpbnN0YWxsIHRvIGEgY3VzdG9tIGxvY2F0aW9uLCBhZGQgdGhlIGZvbGxvd2luZyBmbGFnIHdoZW4geW91IHJ1biBjbWFrZToKLS1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9L3BhdGgvdG8vY3VzdG9tL2xvY2F0aW9uCi0KLQotTk9URTogQm9vc3QgVmVyc2lvbiAxLjQ4IGhhcyBwcm9ibGVtIHdpdGggdGhlIGNvZGUsIHlvdSBjYW4gdXNlIGVpdGhlciAxLjQ2IG9yIDEuNTArLiBVbmZvcnR1bmF0ZWx5IDEuNDggaXMgc2hpcHBlZCB3aXRoIFVidW50dSAxMi4wNCBMVFMsIHlvdSBjYW4gZWl0aGVyIGRvd25sb2FkIGFuZCBjb21waWxlIGxpYmJvb3N0IDEuNTArIGZyb20gdGhlaXIgd2Vic2l0ZSwgb3IganVzdCBkbyB0aGlzOgotCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJib29zdDEuNDYtYWxsLWRldgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9NYWtlZmlsZS5hbSBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMjhmODEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgotIyMgQ3JlYXRlZCBieSBBbmp1dGEKLQotU1VCRElSUyA9IHNyYyAKLQotbWdpemFkb2NkaXIgPSAke3ByZWZpeH0vZG9jL21naXphCi1tZ2l6YWRvY19EQVRBID0gXAotCVJFQURNRVwKLQlDT1BZSU5HXAotCUFVVEhPUlNcCi0JQ2hhbmdlTG9nXAotCUlOU1RBTExcCi0JTkVXUwotCi1tZ2l6YXNjcmlwdHNkaXIgPSAke3ByZWZpeH0vc2NyaXB0cy8KLQotbWdpemFzY3JpcHRzX1NDUklQVFMgPSBcCi0JCQkJICAgc2NyaXB0cy8qCi0KLUVYVFJBX0RJU1QgPSAkKG1naXphZG9jX0RBVEEpIFwKLQkgICAgICAgICAke21naXphc2NyaXB0c19TQ1JJUFRTfQotIyBDb3B5IGFsbCB0aGUgc3BlYyBmaWxlcy4gT2YgY291cmNlLCBvbmx5IG9uZSBpcyBhY3R1YWxseSB1c2VkLgotZGlzdC1ob29rOgotCWZvciBzcGVjZmlsZSBpbiAqLnNwZWM7IGRvIFwKLQkJaWYgdGVzdCAtZiAkJHNwZWNmaWxlOyB0aGVuIFwKLQkJCWNwIC1wICQkc3BlY2ZpbGUgJChkaXN0ZGlyKTsgXAotCQlmaSBcCi0JZG9uZQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL01ha2VmaWxlLmluIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0MGQ2Mi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjgzICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAuMSBmcm9tIE1ha2VmaWxlLmFtLgotIyBAY29uZmlndXJlX2lucHV0QAotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1AU0VUX01BS0VACi0KLQotVlBBVEggPSBAc3JjZGlyQAotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLXN1YmRpciA9IC4KLURJU1RfQ09NTU9OID0gUkVBRE1FICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAotCSQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvY29uZmlnLmguaW4gXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlIEFVVEhPUlMgQ09QWUlORyBDaGFuZ2VMb2cgSU5TVEFMTCBORVdTIFwKLQljb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBkZXBjb21wIGluc3RhbGwtc2ggbHRtYWluLnNoIG1pc3NpbmcKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1hbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUyA9IGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgXAotIGNvbmZpZ3VyZS5saW5lbm8gY29uZmlnLnN0YXR1cy5saW5lbm8KLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9Ci1hbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQobWdpemFzY3JpcHRzZGlyKSIgXAotCSIkKERFU1RESVIpJChtZ2l6YWRvY2RpcikiCi1tZ2l6YXNjcmlwdHNTQ1JJUFRfSU5TVEFMTCA9ICQoSU5TVEFMTF9TQ1JJUFQpCi1TQ1JJUFRTID0gJChtZ2l6YXNjcmlwdHNfU0NSSVBUUykKLVNPVVJDRVMgPQotRElTVF9TT1VSQ0VTID0KLVJFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi0JaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKLQlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKLQlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7Ci1hbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAotICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCi0gICAgKikgZj0kJHA7OyBcCi0gIGVzYWM7Ci1hbV9fc3RyaXBfZGlyID0gYGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgOwotbWdpemFkb2NEQVRBX0lOU1RBTEwgPSAkKElOU1RBTExfREFUQSkKLURBVEEgPSAkKG1naXphZG9jX0RBVEEpCi1SRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyA9IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUJXAotICBkaXN0Y2xlYW4tcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi1FVEFHUyA9IGV0YWdzCi1DVEFHUyA9IGN0YWdzCi1ESVNUX1NVQkRJUlMgPSAkKFNVQkRJUlMpCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi1hbV9fcmVtb3ZlX2Rpc3RkaXIgPSBcCi0gIHsgdGVzdCAhIC1kICQoZGlzdGRpcikgXAotICAgIHx8IHsgZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgISAtcGVybSAtMjAwIC1leGVjIGNobW9kIHUrdyB7fSAnOycgXAotICAgICAgICAgJiYgcm0gLWZyICQoZGlzdGRpcik7IH07IH0KLURJU1RfQVJDSElWRVMgPSAkKGRpc3RkaXIpLnRhci5negotR1pJUF9FTlYgPSAtLWJlc3QKLWRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKLWRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLiAtdHlwZSBmIC1wcmludAotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQU1UQVIgPSBAQU1UQVJACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFAgPSBAQ1BQQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DWFggPSBAQ1hYQAotQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAotQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUdSRVAgPSBAR1JFUEAKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0RJUl9QID0gQE1LRElSX1BACi1PQkpFWFQgPSBAT0JKRVhUQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACi1QQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAotUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACi1QQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAotUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKLVBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAotUkFOTElCID0gQFJBTkxJQkAKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TVFJJUCA9IEBTVFJJUEAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWFic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACi1hYnNfc3JjZGlyID0gQGFic19zcmNkaXJACi1hYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACi1hYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKLWFjX2N0X0NDID0gQGFjX2N0X0NDQAotYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKLWFtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAotYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKLWFtX19xdW90ZSA9IEBhbV9fcXVvdGVACi1hbV9fdGFyID0gQGFtX190YXJACi1hbV9fdW50YXIgPSBAYW1fX3VudGFyQAotYmluZGlyID0gQGJpbmRpckAKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRkaXIgPSBAYnVpbGRkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRvY2RpciA9IEBkb2NkaXJACi1kdmlkaXIgPSBAZHZpZGlyQAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1TVUJESVJTID0gc3JjIAotbWdpemFkb2NkaXIgPSAke3ByZWZpeH0vZG9jL21naXphCi1tZ2l6YWRvY19EQVRBID0gXAotCVJFQURNRVwKLQlDT1BZSU5HXAotCUFVVEhPUlNcCi0JQ2hhbmdlTG9nXAotCUlOU1RBTExcCi0JTkVXUwotCi1tZ2l6YXNjcmlwdHNkaXIgPSAke3ByZWZpeH0vc2NyaXB0cy8KLW1naXphc2NyaXB0c19TQ1JJUFRTID0gXAotCQkJCSAgIHNjcmlwdHMvKgotCi1FWFRSQV9ESVNUID0gJChtZ2l6YWRvY19EQVRBKSBcCi0JICAgICAgICAgJHttZ2l6YXNjcmlwdHNfU0NSSVBUU30KLQotYWxsOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotLlNVRkZJWEVTOgotYW0tLXJlZnJlc2g6Ci0JQDoKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgIGVjaG8gJyBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgJzsgXAotCSAgICAgIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgXAotCQkmJiBleGl0IDA7IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICBNYWtlZmlsZSc7IFwKLQljZCAkKHRvcF9zcmNkaXIpICYmIFwKLQkgICQoQVVUT01BS0UpIC0tZ251ICBNYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGVjaG8gJyAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMnOyBcCi0JICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1czs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCi0KLWNvbmZpZy5oOiBzdGFtcC1oMQotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCSAgcm0gLWYgc3RhbXAtaDE7IFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHN0YW1wLWgxOyBcCi0JZWxzZSA6OyBmaQotCi1zdGFtcC1oMTogJChzcmNkaXIpL2NvbmZpZy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQHJtIC1mIHN0YW1wLWgxCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyBjb25maWcuaAotJChzcmNkaXIpL2NvbmZpZy5oLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlybSAtZiBzdGFtcC1oMQotCXRvdWNoICRACi0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oIHN0YW1wLWgxCi1pbnN0YWxsLW1naXphc2NyaXB0c1NDUklQVFM6ICQobWdpemFzY3JpcHRzX1NDUklQVFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JdGVzdCAteiAiJChtZ2l6YXNjcmlwdHNkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtZ2l6YXNjcmlwdHNkaXIpIgotCUBsaXN0PSckKG1naXphc2NyaXB0c19TQ1JJUFRTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKLQkgIGlmIHRlc3QgLWYgJCRkJCRwOyB0aGVuIFwKLQkgICAgZj1gZWNobyAiJCRwIiB8IHNlZCAnc3xeLiovfHw7JCh0cmFuc2Zvcm0pJ2A7IFwKLQkgICAgZWNobyAiICQobWdpemFzY3JpcHRzU0NSSVBUX0lOU1RBTEwpICckJGQkJHAnICckKERFU1RESVIpJChtZ2l6YXNjcmlwdHNkaXIpLyQkZiciOyBcCi0JICAgICQobWdpemFzY3JpcHRzU0NSSVBUX0lOU1RBTEwpICIkJGQkJHAiICIkKERFU1RESVIpJChtZ2l6YXNjcmlwdHNkaXIpLyQkZiI7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1tZ2l6YXNjcmlwdHNTQ1JJUFRTOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQobWdpemFzY3JpcHRzX1NDUklQVFMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBmPWBlY2hvICIkJHAiIHwgc2VkICdzfF4uKi98fDskKHRyYW5zZm9ybSknYDsgXAotCSAgZWNobyAiIHJtIC1mICckKERFU1RESVIpJChtZ2l6YXNjcmlwdHNkaXIpLyQkZiciOyBcCi0JICBybSAtZiAiJChERVNURElSKSQobWdpemFzY3JpcHRzZGlyKS8kJGYiOyBcCi0JZG9uZQotaW5zdGFsbC1tZ2l6YWRvY0RBVEE6ICQobWdpemFkb2NfREFUQSkKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKG1naXphZG9jZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobWdpemFkb2NkaXIpIgotCUBsaXN0PSckKG1naXphZG9jX0RBVEEpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAotCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKLQkgIGVjaG8gIiAkKG1naXphZG9jREFUQV9JTlNUQUxMKSAnJCRkJCRwJyAnJChERVNURElSKSQobWdpemFkb2NkaXIpLyQkZiciOyBcCi0JICAkKG1naXphZG9jREFUQV9JTlNUQUxMKSAiJCRkJCRwIiAiJChERVNURElSKSQobWdpemFkb2NkaXIpLyQkZiI7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1tZ2l6YWRvY0RBVEE6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChtZ2l6YWRvY19EQVRBKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKLQkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQobWdpemFkb2NkaXIpLyQkZiciOyBcCi0JICBybSAtZiAiJChERVNURElSKSQobWdpemFkb2NkaXIpLyQkZiI7IFwKLQlkb25lCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0kKFJFQ1VSU0lWRV9UQVJHRVRTKToKLQlAZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICB8fCBldmFsICQkZmFpbGNvbTsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi0kKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKToKLQlAZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCWNhc2UgIiRAIiBpbiBcCi0JICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCi0JICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCi0JZXNhYzsgXAotCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCXJldj0iJCRyZXYgLiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi1jdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjdGFncyk7IFwKLQlkb25lCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtdHB5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiBUQUdTCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9LjsgXAotCWVsc2UgXAotCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9OyBcCi0JZmk7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKLQkgICAgICB0YWdzPSIkJHRhZ3MgJCRpbmNsdWRlX29wdGlvbj0kJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICQkdGFncyAkJHVuaXF1ZTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiBjdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JdGFncz07IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdGFncyAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQl0ZXN0IC1kICQoZGlzdGRpcikgfHwgbWtkaXIgJChkaXN0ZGlyKQotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKLQkgICAgfHwgJChNS0RJUl9QKSAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgZGlzdGRpcj1gJChhbV9fY2QpICQoZGlzdGRpcikgJiYgcHdkYDsgXAotCSAgICB0b3BfZGlzdGRpcj1gJChhbV9fY2QpICQodG9wX2Rpc3RkaXIpICYmIHB3ZGA7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmIFwKLQkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAgICAgICB0b3BfZGlzdGRpcj0iJCR0b3BfZGlzdGRpciIgXAotCSAgICAgICAgZGlzdGRpcj0iJCRkaXN0ZGlyLyQkc3ViZGlyIiBcCi0JCWFtX19yZW1vdmVfZGlzdGRpcj06IFwKLQkJYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogXAotCSAgICAgICAgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBcCi0JICBkaXN0LWhvb2sKLQktZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgISAtcGVybSAtNzc3IC1leGVjIGNobW9kIGErcnd4IHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWxpbmtzIDEgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00MDAgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWV4ZWMgJChpbnN0YWxsX3NoKSAtYyAtbSBhK3Ige30ge30gXDsgXAotCXx8IGNobW9kIC1SIGErciAkKGRpc3RkaXIpCi1kaXN0LWd6aXA6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LWJ6aXAyOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGJ6aXAyIC05IC1jID4kKGRpc3RkaXIpLnRhci5iejIKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1sem1hOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGx6bWEgLTkgLWMgPiQoZGlzdGRpcikudGFyLmx6bWEKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC10YXJaOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGNvbXByZXNzIC1jID4kKGRpc3RkaXIpLnRhci5aCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3Qtc2hhcjogZGlzdGRpcgotCXNoYXIgJChkaXN0ZGlyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS5zaGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtemlwOiBkaXN0ZGlyCi0JLXJtIC1mICQoZGlzdGRpcikuemlwCi0JemlwIC1ycSAkKGRpc3RkaXIpLnppcCAkKGRpc3RkaXIpCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QgZGlzdC1hbGw6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQljYXNlICckKERJU1RfQVJDSElWRVMpJyBpbiBcCi0JKi50YXIuZ3oqKSBcCi0JICBHWklQPSQoR1pJUF9FTlYpIGd1bnppcCAtYyAkKGRpc3RkaXIpLnRhci5neiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnRhci5iejIqKSBcCi0JICBidW56aXAyIC1jICQoZGlzdGRpcikudGFyLmJ6MiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnRhci5sem1hKikgXAotCSAgdW5sem1hIC1jICQoZGlzdGRpcikudGFyLmx6bWEgfCAkKGFtX191bnRhcikgOztcCi0JKi50YXIuWiopIFwKLQkgIHVuY29tcHJlc3MgLWMgJChkaXN0ZGlyKS50YXIuWiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnNoYXIuZ3oqKSBcCi0JICBHWklQPSQoR1pJUF9FTlYpIGd1bnppcCAtYyAkKGRpc3RkaXIpLnNoYXIuZ3ogfCB1bnNoYXIgOztcCi0JKi56aXAqKSBcCi0JICB1bnppcCAkKGRpc3RkaXIpLnppcCA7O1wKLQllc2FjCi0JY2htb2QgLVIgYS13ICQoZGlzdGRpcik7IGNobW9kIGErdyAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKS9fYnVpbGQKLQlta2RpciAkKGRpc3RkaXIpL19pbnN0Ci0JY2htb2QgYS13ICQoZGlzdGRpcikKLQlkY19pbnN0YWxsX2Jhc2U9YCQoYW1fX2NkKSAkKGRpc3RkaXIpL19pbnN0ICYmIHB3ZCB8IHNlZCAtZSAncyxeW146XFwvXTpbXFwvXSwvLCdgIFwKLQkgICYmIGRjX2Rlc3RkaXI9IiQke1RNUERJUi0vdG1wfS9hbS1kYy0kJCQkLyIgXAotCSAgJiYgY2QgJChkaXN0ZGlyKS9fYnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgICAkKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKLQkgICAgICAgIGRpc3R1bmluc3RhbGxjaGVjayBcCi0JICAmJiBjaG1vZCAtUiBhLXcgIiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAmJiAoeyBcCi0JICAgICAgIChjZCAuLi8uLiAmJiB1bWFzayAwNzcgJiYgbWtkaXIgIiQkZGNfZGVzdGRpciIpIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBpbnN0YWxsIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiB1bmluc3RhbGwgXAotCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIFwKLQkgICAgICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2Rlc3RkaXIiIGRpc3R1bmluc3RhbGxjaGVjazsgXAotCSAgICAgIH0gfHwgeyBybSAtcmYgIiQkZGNfZGVzdGRpciI7IGV4aXQgMTsgfSkgXAotCSAgJiYgcm0gLXJmICIkJGRjX2Rlc3RkaXIiIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QgXAotCSAgJiYgcm0gLXJmICQoRElTVF9BUkNISVZFUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdGNsZWFuY2hlY2sKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQlAKGVjaG8gIiQoZGlzdGRpcikgYXJjaGl2ZXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbjogIjsgXAotCSAgbGlzdD0nJChESVNUX0FSQ0hJVkVTKSc7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUpIHwgXAotCSAgc2VkIC1lIDFoIC1lIDFzLy4vPS9nIC1lIDFwIC1lIDF4IC1lICckJHAnIC1lICckJHgnCi1kaXN0dW5pbnN0YWxsY2hlY2s6Ci0JQGNkICQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpcikgXAotCSYmIHRlc3QgYCQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWxlIDEgXAotCSAgIHx8IHsgZWNobyAiRVJST1I6IGZpbGVzIGxlZnQgYWZ0ZXIgdW5pbnN0YWxsOiIgOyBcCi0JICAgICAgICBpZiB0ZXN0IC1uICIkKERFU1RESVIpIjsgdGhlbiBcCi0JICAgICAgICAgIGVjaG8gIiAgKGNoZWNrIERFU1RESVIgc3VwcG9ydCkiOyBcCi0JICAgICAgICBmaSA7IFwKLQkgICAgICAgICQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgOyBcCi0JICAgICAgICBleGl0IDE7IH0gPiYyCi1kaXN0Y2xlYW5jaGVjazogZGlzdGNsZWFuCi0JQGlmIHRlc3QgJyQoc3JjZGlyKScgPSAuIDsgdGhlbiBcCi0JICBlY2hvICJFUlJPUjogZGlzdGNsZWFuY2hlY2sgY2FuIG9ubHkgcnVuIGZyb20gYSBWUEFUSCBidWlsZCIgOyBcCi0JICBleGl0IDEgOyBcCi0JZmkKLQlAdGVzdCBgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1lcSAwIFwKLQkgIHx8IHsgZWNobyAiRVJST1I6IGZpbGVzIGxlZnQgaW4gYnVpbGQgZGlyZWN0b3J5IGFmdGVyIGRpc3RjbGVhbjoiIDsgXAotCSAgICAgICAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgOyBcCi0JICAgICAgIGV4aXQgMTsgfSA+JjIKLWNoZWNrLWFtOiBhbGwtYW0KLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUgJChTQ1JJUFRTKSAkKERBVEEpIGNvbmZpZy5oCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQlmb3IgZGlyIGluICIkKERFU1RESVIpJChtZ2l6YXNjcmlwdHNkaXIpIiAiJChERVNURElSKSQobWdpemFkb2NkaXIpIjsgZG8gXAotCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAotCWRvbmUKLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKLQkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLXRhZ3MKLQotZHZpOiBkdmktcmVjdXJzaXZlCi0KLWR2aS1hbToKLQotaHRtbDogaHRtbC1yZWN1cnNpdmUKLQotaW5mbzogaW5mby1yZWN1cnNpdmUKLQotaW5mby1hbToKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1naXphZG9jREFUQSBpbnN0YWxsLW1naXphc2NyaXB0c1NDUklQVFMKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06Ci0KLWluc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1yZWN1cnNpdmUKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQotCS1ybSAtcmYgJCh0b3Bfc3JjZGlyKS9hdXRvbTR0ZS5jYWNoZQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljCi0KLXBkZjogcGRmLXJlY3Vyc2l2ZQotCi1wZGYtYW06Ci0KLXBzOiBwcy1yZWN1cnNpdmUKLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLW1naXphZG9jREFUQSB1bmluc3RhbGwtbWdpemFzY3JpcHRzU0NSSVBUUwotCi0uTUFLRTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgaW5zdGFsbC1hbSBcCi0JaW5zdGFsbC1zdHJpcAotCi0uUEhPTlk6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIENUQUdTIEdUQUdTIFwKLQlhbGwgYWxsLWFtIGFtLS1yZWZyZXNoIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAotCWN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0IGRpc3QtYWxsIGRpc3QtYnppcDIgZGlzdC1nemlwIFwKLQlkaXN0LWhvb2sgZGlzdC1sem1hIGRpc3Qtc2hhciBkaXN0LXRhclogZGlzdC16aXAgZGlzdGNoZWNrIFwKLQlkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tdGFncyBcCi0JZGlzdGNsZWFuY2hlY2sgZGlzdGRpciBkaXN0dW5pbnN0YWxsY2hlY2sgZHZpIGR2aS1hbSBodG1sIFwKLQlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKLQlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKLQlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAotCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLW1naXphZG9jREFUQSBcCi0JaW5zdGFsbC1tZ2l6YXNjcmlwdHNTQ1JJUFRTIGluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIFwKLQlpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAotCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBpbnN0YWxsZGlycy1hbSBtYWludGFpbmVyLWNsZWFuIFwKLQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgXAotCXBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gXAotCXVuaW5zdGFsbC1tZ2l6YWRvY0RBVEEgdW5pbnN0YWxsLW1naXphc2NyaXB0c1NDUklQVFMKLQotIyBDb3B5IGFsbCB0aGUgc3BlYyBmaWxlcy4gT2YgY291cmNlLCBvbmx5IG9uZSBpcyBhY3R1YWxseSB1c2VkLgotZGlzdC1ob29rOgotCWZvciBzcGVjZmlsZSBpbiAqLnNwZWM7IGRvIFwKLQkJaWYgdGVzdCAtZiAkJHNwZWNmaWxlOyB0aGVuIFwKLQkJCWNwIC1wICQkc3BlY2ZpbGUgJChkaXN0ZGlyKTsgXAotCQlmaSBcCi0JZG9uZQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9ORVdTIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9ORVdTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvTkVXUworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL1JFQURNRSBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvUkVBRE1FCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvUkVMRUFTRV9OT1RFLnR4dCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvUkVMRUFTRV9OT1RFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxZjY4NS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL1JFTEVBU0VfTk9URS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1SZWxlYXNlIE5vdGVzDQotMC43LjANCi0NCi1PdmVydmlldw0KLQ0KLVRoZSB2ZXJzaW9uIHByb3ZpZGUgYSBuZXcgYnVpbGRpbmcgc3lzdGVtIGJ5IGNtYWtlIGFuZCBuYXRpdmUgTVMgV2luZG93cyBzdXBwb3J0LiBQbGVhc2UgYmUgYWR2aXNlZCB0aGF0IHRoZSBjb2RlIGhhcyB1bmRlcmdvbmUgYSBsb3Qgb2YgbW9kaWZpY2F0aW9ucywgaWYgeW91IGFyZSBub3QgdXNpbmcgTVMgV2luZG93cywgd2Ugc3VnZ2VzdCB5b3UgdXNlIG9sZCAwLjYuMyB2ZXJzaW9uIHVudGlsIG1vcmUgdGVzdC4NCi0NCi1Zb3UgYXJlIHdlbGNvbWVkIHRvIGhlbHAgdGVzdGluZyBpdCBhbmQgcmVwb3J0IGJ1Z3MuDQotDQotVGhhbmsgeW91Lg0KLQ0KLU5ldyBCdWlsZGluZyBTeXN0ZW0NCi0NCi1JbiBhZGRpdGlvbmFsIHRvIEdOVSBhdXRvdG9vbHMsIE1HSVpBKysgbm93IHN1cHBvcnRzIENNYWtlLiBVc2UNCi0NCi1jbWFrZSANCi1tYWtlDQotbWFrZSBpbnN0YWxsDQotDQotdG8gYnVpbGQgYW5kIGluc3RhbGwsIG9uIGJvdGggV2luZG93cyBhbmQgTGludXguDQotDQotTmF0aXZlIE1TIFdpbmRvd3Mgc3VwcG9ydA0KLQ0KLVRoZSBjb2RlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHByb3ZpZGUgbmF0aXZlIFdpbmRvd3Mgc3VwcG9ydC4gWW91IGNhbiBub3cgZ2VuZXJhdGUgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBhbmQgYnVpbGQgaXQgYnkgaW52b2tpbmc6DQotDQotY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTAiDQotbXNidWlsZCAvcDpDb25maWd1cmF0aW9uPVJlbGVhc2UgbWdpemEuc2xuDQotDQotRG93bmxvYWQgbGluayBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9tZ2l6YXBwL2ZpbGVzL21naXphcHAtMC43LjAudGFyLmd6L2Rvd25sb2FkLg0KLTAuNi4zDQotDQotTWVtb3J5IG9wdGltaXphdGlvbg0KLQ0KLUZpbHRlciB2b2NhYnVsYXJ5IC8gd29yZCBjbGFzcyBhbmQgZWxpbWluYXRlIGR1cGxpY2F0aW9ucy4gQmVpbmcgYWJsZSB0byB0cmFpbiB3aXRoIDM0TSBzZW50ZW5jZSBwYWlycyBhbmQga2VlcCBtZW1vcnkgYmVsb3cgMkcuDQotDQotQnVnIGZpeA0KLQ0KLVdoZW4gbG9nIGZpbGUgd2FzIHNwZWNpZmllZCwgbW9kZWwgMy80LzUgdHJhaW5pbmcgd2lsbCBvY2Nhc2lvbmFsbHkgZW5jb3VudGVyIHJhY2luZyBjb25kaXRpb24gYW5kIGNyYXNoLiBUaGUgdW5uZWNlc3NhcnkgbG9nZ2luZyBpbmZvcm1hdGlvbiBpcyByZW1vdmVkLCBiZWNhdXNlIHRoZSBzYW1lIG1lc3NhZ2UgaXMgYWxyZWFkeSBwcmludGVkIG9uIHNjcmVlbi4NCi0NCi1Eb3dubG9hZCBsaW5rIGh0dHA6Ly93d3cuY3MuY211LmVkdS9+cWluZy9yZWxlYXNlL21naXphLTAuNi4zLTEwLTAxLTExLnRhci5nei4NCi0wLjYuMg0KLQ0KLU1pbm9yIGludGVyZmFjZSBjaGFuZ2UgdG8ga2VlcCBjb21wYXRpYmlsaXR5IHdpdGggQ2hhc2tpIDAuMi4yLCB0aGUgc3ltYWwuc2ggc2NyaXB0IG5lZWQgZmlsZSBuYW1lIHRvIGJlIHNwZWNpZmllZCBpbnN0ZWFkIG9mIGRpcmVjdGx5IG91dHB1dHMgdG8gU1RET1VULg0KLQ0KLURvd25sb2FkIGxpbmsgaHR0cDovL3d3dy5jcy5jbXUuZWR1L35xaW5nL3JlbGVhc2UvbWdpemEtMC42LjItMDktMTItMDcudGFyLmd6Lg0KLTAuNi4xDQotDQotU2luY2UgdGhlIHRoaXMgcmVsZWFzZSB0aGUgTUdJWkEgaXMgc2VwYXJhdGVkIGZyb20gUU1UIHBhY2thZ2UgYW5kIHRoZXJlZm9yZSB0aGUgZGVwZW5kZW5jaWVzIGFyZSByZW1vdmVkLiBDdXJyZW50bHkgdGhlIG9ubHkgZGVwZW5kZW5jeSBpcyBwdGhyZWFkIGxpYnJhcnkuDQotDQotU2NyaXB0cyBmb3IgZm9yY2UgYWxpZ25tZW50IC8gcmVzdW1lIHRyYWluaW5nIGlzIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlLiBQbGVhc2UgcmVmZXIgdG8gZm9yY2VhbGlnbm1lbnQNCi0NCi1BZGRlZCBlcnJvciB0b2xlcmFuY2UgZnVuY3Rpb25hbGl0eSBmb3IgaG1tbm9ybSBleGVjdXRhYmxlLCB3aGljaCBhbGxvd3MgaWdub3JpbmcgYSBudW1iZXIgb2YgdHJ1bmtzLg0KLQ0KLURvd25sb2FkIGxpbms6IGh0dHA6Ly93d3cuY3MuY211LmVkdS9+cWluZy9yZWxlYXNlL21naXphLTAuNi4xLTA5LTExLTE3LnRhci5neg0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvVE9ETy50YXNrcyBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvVE9ETy50YXNrcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmYTI4Mi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL1RPRE8udGFza3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGd0b2RvPgotICA8Y2F0ZWdvcnkgdGl0bGU9IlBlcnNvbmFsIiBwbGFjZT0iMCIvPgotICA8Y2F0ZWdvcnkgdGl0bGU9IkJ1c2luZXNzIiBwbGFjZT0iMSIvPgotICA8Y2F0ZWdvcnkgdGl0bGU9IlVuZmlsZWQiIHBsYWNlPSIyIi8+Ci08L2d0b2RvPgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9hY2xvY2FsLm00IGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTE5YzQ3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDkzMiArMCwwIEBACi0jIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4xMC4xIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCi0jIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1tNF9pZm5kZWYoW0FDX0FVVE9DT05GX1ZFUlNJT05dLAotICBbbTRfY29weShbbTRfUEFDS0FHRV9WRVJTSU9OXSwgW0FDX0FVVE9DT05GX1ZFUlNJT05dKV0pZG5sCi1tNF9pZihBQ19BVVRPQ09ORl9WRVJTSU9OLCBbMi42Ml0sLAotW200X3dhcm5pbmcoW3RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZvciBhdXRvY29uZiAyLjYyLgotWW91IGhhdmUgYW5vdGhlciB2ZXJzaW9uIG9mIGF1dG9jb25mLiAgSXQgbWF5IHdvcmssIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0by4KLUlmIHlvdSBoYXZlIHByb2JsZW1zLCB5b3UgbWF5IG5lZWQgdG8gcmVnZW5lcmF0ZSB0aGUgYnVpbGQgc3lzdGVtIGVudGlyZWx5LgotVG8gZG8gc28sIHVzZSB0aGUgcHJvY2VkdXJlIGRvY3VtZW50ZWQgYnkgdGhlIHBhY2thZ2UsIHR5cGljYWxseSBgYXV0b3JlY29uZicuXSldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiwgMjAwNyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCi0jIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgotIyAoVGhpcyBwcml2YXRlIG1hY3JvIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhpcyBmaWxlLikKLUFDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwKLVthbV9fYXBpX3ZlcnNpb249JzEuMTAnCi1kbmwgU29tZSB1c2VycyBmaW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIG1pc3Rha2UgaXQgZm9yIGEgd2F5IHRvCi1kbmwgcmVxdWlyZSBzb21lIG1pbmltdW0gdmVyc2lvbi4gIFBvaW50IHRoZW0gdG8gdGhlIHJpZ2h0IG1hY3JvLgotbTRfaWYoWyQxXSwgWzEuMTAuMV0sIFtdLAotICAgICAgW0FDX0ZBVEFMKFtEbyBub3QgY2FsbCAkMCwgdXNlIEFNX0lOSVRfQVVUT01BS0UoWyQxXSkuXSldKWRubAotXSkKLQotIyBfQU1fQVVUT0NPTkZfVkVSU0lPTihWRVJTSU9OKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBhY2xvY2FsIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGZpbmQgdGhlIEF1dG9jb25mIHZlcnNpb24uCi0jIFRoaXMgaXMgYSBwcml2YXRlIG1hY3JvIHRvby4gIFVzaW5nIG00X2RlZmluZSBzaW1wbGlmaWVzCi0jIHRoZSBsb2dpYyBpbiBhY2xvY2FsLCB3aGljaCBjYW4gc2ltcGx5IGlnbm9yZSB0aGlzIGRlZmluaXRpb24uCi1tNF9kZWZpbmUoW19BTV9BVVRPQ09ORl9WRVJTSU9OXSwgW10pCi0KLSMgQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENhbGwgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBzbyB0aGV5IGNhbiBiZSB0cmFjZWQuCi0jIFRoaXMgZnVuY3Rpb24gaXMgQUNfUkVRVUlSRWQgYnkgQUNfSU5JVF9BVVRPTUFLRS4KLUFDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwKLVtBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjEwLjFdKWRubAotbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKLSAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAotX0FNX0FVVE9DT05GX1ZFUlNJT04oQUNfQVVUT0NPTkZfVkVSU0lPTildKQotCi0jIEFNX0FVWF9ESVJfRVhQQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEZvciBwcm9qZWN0cyB1c2luZyBBQ19DT05GSUdfQVVYX0RJUihbZm9vXSksIEF1dG9jb25mIHNldHMKLSMgJGFjX2F1eF9kaXIgdG8gYCRzcmNkaXIvZm9vJy4gIEluIG90aGVyIHByb2plY3RzLCBpdCBpcyBzZXQgdG8KLSMgYCRzcmNkaXInLCBgJHNyY2Rpci8uLicsIG9yIGAkc3JjZGlyLy4uLy4uJy4KLSMKLSMgT2YgY291cnNlLCBBdXRvbWFrZSBtdXN0IGhvbm9yIHRoaXMgdmFyaWFibGUgd2hlbmV2ZXIgaXQgY2FsbHMgYQotIyB0b29sIGZyb20gdGhlIGF1eGlsaWFyeSBkaXJlY3RvcnkuICBUaGUgcHJvYmxlbSBpcyB0aGF0ICRzcmNkaXIgKGFuZAotIyB0aGVyZWZvcmUgJGFjX2F1eF9kaXIgYXMgd2VsbCkgY2FuIGJlIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZSwKLSMgZGVwZW5kaW5nIG9uIGhvdyBjb25maWd1cmUgaXMgcnVuLiAgVGhpcyBpcyBwcmV0dHkgYW5ub3lpbmcsIHNpbmNlCi0jIGl0IG1ha2VzICRhY19hdXhfZGlyIHF1aXRlIHVudXNhYmxlIGluIHN1YmRpcmVjdG9yaWVzOiBpbiB0aGUgdG9wCi0jIHNvdXJjZSBkaXJlY3RvcnksIGFueSBmb3JtIHdpbGwgd29yayBmaW5lLCBidXQgaW4gc3ViZGlyZWN0b3JpZXMgYQotIyByZWxhdGl2ZSBwYXRoIG5lZWRzIHRvIGJlIGFkanVzdGVkIGZpcnN0LgotIwotIyAkYWNfYXV4X2Rpci9taXNzaW5nCi0jICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaWYgJGFjX2F1eF9kaXIgaXMgcmVsYXRpdmUKLSMgJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZwotIyAgICBmYWlscyBpZiAkYWNfYXV4X2RpciBpcyBhYnNvbHV0ZSwKLSMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpbiBhIFZQQVRIIGJ1aWxkIHdpdGgKLSMgICAgICAgICAgYSByZWxhdGl2ZSAkYWNfYXV4X2RpcgotIwotIyBUaGUgcmVhc29uIG9mIHRoZSBsYXR0ZXIgZmFpbHVyZSBpcyB0aGF0ICR0b3Bfc3JjZGlyIGFuZCAkYWNfYXV4X2RpcgotIyBhcmUgYm90aCBwcmVmaXhlZCBieSAkc3JjZGlyLiAgSW4gYW4gaW4tc291cmNlIGJ1aWxkIHRoaXMgaXMgdXN1YWxseQotIyBoYXJtbGVzcyBiZWNhdXNlICRzcmNkaXIgaXMgYC4nLCBidXQgdGhpbmdzIHdpbGwgYnJva2Ugd2hlbiB5b3UKLSMgc3RhcnQgYSBWUEFUSCBidWlsZCBvciB1c2UgYW4gYWJzb2x1dGUgJHNyY2Rpci4KLSMKLSMgU28gd2UgY291bGQgdXNlIHNvbWV0aGluZyBzaW1pbGFyIHRvICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcsCi0jIGlmZiB3ZSBzdHJpcCB0aGUgbGVhZGluZyAkc3JjZGlyIGZyb20gJGFjX2F1eF9kaXIuICBUaGF0IHdvdWxkIGJlOgotIyAgIGFtX2F1eF9kaXI9J1wkKHRvcF9zcmNkaXIpLydgZXhwciAiJGFjX2F1eF9kaXIiIDogIiRzcmNkaXIvLypcKC4qXCkiYAotIyBhbmQgdGhlbiB3ZSB3b3VsZCBkZWZpbmUgJE1JU1NJTkcgYXMKLSMgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKLSMgVGhpcyB3aWxsIHdvcmsgYXMgbG9uZyBhcyBNSVNTSU5HIGlzIG5vdCBjYWxsZWQgZnJvbSBjb25maWd1cmUsIGJlY2F1c2UKLSMgdW5mb3J0dW5hdGVseSAkKHRvcF9zcmNkaXIpIGhhcyBubyBtZWFuaW5nIGluIGNvbmZpZ3VyZS4KLSMgSG93ZXZlciB0aGVyZSBhcmUgb3RoZXIgdmFyaWFibGVzLCBsaWtlIENDLCB3aGljaCBhcmUgb2Z0ZW4gdXNlZCBpbgotIyBjb25maWd1cmUsIGFuZCBjb3VsZCB0aGVyZWZvcmUgbm90IHVzZSB0aGlzICJmaXhlZCIgJGFjX2F1eF9kaXIuCi0jCi0jIEFub3RoZXIgc29sdXRpb24sIHVzZWQgaGVyZSwgaXMgdG8gYWx3YXlzIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbgotIyBhYnNvbHV0ZSBQQVRILiAgVGhlIGRyYXdiYWNrIGlzIHRoYXQgdXNpbmcgYWJzb2x1dGUgcGF0aHMgcHJldmVudCBhCi0jIGNvbmZpZ3VyZWQgdHJlZSB0byBiZSBtb3ZlZCB3aXRob3V0IHJlY29uZmlndXJhdGlvbi4KLQotQUNfREVGVU4oW0FNX0FVWF9ESVJfRVhQQU5EXSwKLVtkbmwgUmVseSBvbiBhdXRvY29uZiB0byBzZXQgdXAgQ0RQQVRIIHByb3Blcmx5LgotQUNfUFJFUkVRKFsyLjUwXSlkbmwKLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLV0pCi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNAotCi0jIFRoaXMgd2FzIG1lcmdlZCBpbnRvIEFDX1BST0dfQ0MgaW4gQXV0b2NvbmYuCi0KLUFVX0RFRlVOKFtBTV9QUk9HX0NDX1NURENdLAotW0FDX1BST0dfQ0MKLUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFskMDoKLQl5b3VyIGNvZGUgc2hvdWxkIG5vIGxvbmdlciBkZXBlbmQgdXBvbiBgYW1fY3ZfcHJvZ19jY19zdGRjJywgYnV0IHVwb24KLQlgYWNfY3ZfcHJvZ19jY19zdGRjJy4gIFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBhc3NpZ25tZW50IHdoZW4KLQl5b3UgYWRqdXN0IHRoZSBjb2RlLiAgWW91IGNhbiBhbHNvIHJlbW92ZSB0aGUgYWJvdmUgY2FsbCB0bwotCUFDX1BST0dfQ0MgaWYgeW91IGFscmVhZHkgY2FsbGVkIGl0IGVsc2V3aGVyZS5dKQotYW1fY3ZfcHJvZ19jY19zdGRjPSRhY19jdl9wcm9nX2NjX3N0ZGMKLV0pCi1BVV9ERUZVTihbZnBfUFJPR19DQ19TVERDXSkKLQotIyBBTV9DT05ESVRJT05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA4Ci0KLSMgQU1fQ09ORElUSU9OQUwoTkFNRSwgU0hFTEwtQ09ORElUSU9OKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKLVtBQ19QUkVSRVEoMi41MilkbmwKLSBpZmVsc2UoWyQxXSwgW1RSVUVdLCAgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldLAotCVskMV0sIFtGQUxTRV0sIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSlkbmwKLUFDX1NVQlNUKFskMV9UUlVFXSlkbmwKLUFDX1NVQlNUKFskMV9GQUxTRV0pZG5sCi1fQU1fU1VCU1RfTk9UTUFLRShbJDFfVFJVRV0pZG5sCi1fQU1fU1VCU1RfTk9UTUFLRShbJDFfRkFMU0VdKWRubAotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmkKLUFDX0NPTkZJR19DT01NQU5EU19QUkUoCi1baWYgdGVzdCAteiAiJHskMV9UUlVFfSIgJiYgdGVzdCAteiAiJHskMV9GQUxTRX0iOyB0aGVuCi0gIEFDX01TR19FUlJPUihbW2NvbmRpdGlvbmFsICIkMSIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS5dXSkKLWZpXSldKQotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA5Ci0KLSMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgYEFDX1BST0dfQ0MnIGJlCi0jIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAotIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKLSMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZwotIyBDQyBldGMuIGluIHRoZSBNYWtlZmlsZSwgd2lsbCBhc2sgZm9yIGFuIEFDX1BST0dfQ0MgdXNlLi4uCi0KLQotIyBfQU1fREVQRU5ERU5DSUVTKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2VlIGhvdyB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBkZXBlbmRlbmN5IGNoZWNraW5nLgotIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiR0NKIiwgb3IgIk9CSkMiLgotIyBXZSB0cnkgYSBmZXcgdGVjaG5pcXVlcyBhbmQgdXNlIHRoYXQgdG8gc2V0IGEgc2luZ2xlIGNhY2hlIHZhcmlhYmxlLgotIwotIyBXZSBkb24ndCBBQ19SRVFVSVJFIHRoZSBjb3JyZXNwb25kaW5nIEFDX1BST0dfQ0Mgc2luY2UgdGhlIGxhdHRlciB3YXMKLSMgbW9kaWZpZWQgdG8gaW52b2tlIF9BTV9ERVBFTkRFTkNJRVMoQ0MpOyB3ZSB3b3VsZCBoYXZlIGEgY2lyY3VsYXIKLSMgZGVwZW5kZW5jeSwgYW5kIGdpdmVuIHRoYXQgdGhlIHVzZXIgaXMgbm90IGV4cGVjdGVkIHRvIHJ1biB0aGlzIG1hY3JvLAotIyBqdXN0IHJlbHkgb24gQUNfUFJPR19DQy4KLUFDX0RFRlVOKFtfQU1fREVQRU5ERU5DSUVTXSwKLVtBQ19SRVFVSVJFKFtBTV9TRVRfREVQRElSXSlkbmwKLUFDX1JFUVVJUkUoW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSlkbmwKLUFDX1JFUVVJUkUoW0FNX01BS0VfSU5DTFVERV0pZG5sCi1BQ19SRVFVSVJFKFtBTV9ERVBfVFJBQ0tdKWRubAotCi1pZmVsc2UoWyQxXSwgQ0MsICAgW2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIENYWCwgIFtkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBPQkpDLCBbZGVwY2M9IiRPQkpDIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAotICAgICAgIFskMV0sIFVQQywgIFtkZXBjYz0iJFVQQyIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBHQ0osICBbZGVwY2M9IiRHQ0oiICBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAotICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKLQotQUNfQ0FDSEVfQ0hFQ0soW2RlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjXSwKLSAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCi1baWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgotICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCi0gICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCi0gICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCi0gICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCi0gIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKLSAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKLSAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKLSAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCi0gICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAotICAjIGRpcmVjdG9yeS4KLSAgbWtkaXIgc3ViCi0KLSAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gWydzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJ10gPCAuL2RlcGNvbXBgCi0gIGZpCi0gIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbwotICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycwotICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKLSAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCi0gICAgIwotICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5Ci0gICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KLSAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KLSAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKLSAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KLSAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKLSAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCi0gICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgotICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCi0gICAgZG9uZQotICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKLQotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBub3NpZGVlZmZlY3QpCi0gICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKLSAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgotCWNvbnRpbnVlCi0gICAgICBlbHNlCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgICA7OwotICAgIG5vbmUpIGJyZWFrIDs7Ci0gICAgZXNhYwotICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgotICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5Ci0gICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gXAotICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCi0gICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgLW8gc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5jIFwKLSAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0MS5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCi0gICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQotICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAotICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCi0gICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKLSAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gICAgICAgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLQotICBjZCAuLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi1lbHNlCi0gIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLWZpCi1dKQotQUNfU1VCU1QoWyQxREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCi1BTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXAkMV0sIFsKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQotXSkKLQotCi0jIEFNX1NFVF9ERVBESVIKLSMgLS0tLS0tLS0tLS0tLQotIyBDaG9vc2UgYSBkaXJlY3RvcnkgbmFtZSBmb3IgZGVwZW5kZW5jeSBmaWxlcy4KLSMgVGhpcyBtYWNybyBpcyBBQ19SRVFVSVJFZCBpbiBfQU1fREVQRU5ERU5DSUVTCi1BQ19ERUZVTihbQU1fU0VUX0RFUERJUl0sCi1bQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKLUFDX1NVQlNUKFtERVBESVJdLCBbIiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiXSlkbmwKLV0pCi0KLQotIyBBTV9ERVBfVFJBQ0sKLSMgLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fREVQX1RSQUNLXSwKLVtBQ19BUkdfRU5BQkxFKGRlcGVuZGVuY3ktdHJhY2tpbmcsCi1bICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCi0gIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzXSkKLWlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgotICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgotICBBTURFUEJBQ0tTTEFTSD0nXCcKLWZpCi1BTV9DT05ESVRJT05BTChbQU1ERVBdLCBbdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vXSkKLUFDX1NVQlNUKFtBTURFUEJBQ0tTTEFTSF0pZG5sCi1fQU1fU1VCU1RfTk9UTUFLRShbQU1ERVBCQUNLU0xBU0hdKWRubAotXSkKLQotIyBHZW5lcmF0ZSBjb2RlIHRvIHNldCB1cCBkZXBlbmRlbmN5IHRyYWNraW5nLiAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jc2VyaWFsIDMKLQotIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKLVtmb3IgbWYgaW4gJENPTkZJR19GSUxFUzsgZG8KLSAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKLSAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KLSAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAotICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KLSAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKLSAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KLSAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKLSAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCi0gIGlmIHNlZCAtbiAncyxeIy4qZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlLiosWCxwJyAiJG1mIiB8IGdyZXAgWCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBkaXJwYXJ0PWBBU19ESVJOQU1FKCIkbWYiKWAKLSAgZWxzZQotICAgIGNvbnRpbnVlCi0gIGZpCi0gICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCi0gICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KLSAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKLSAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCi0gIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAotICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAotICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKLSAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCi0gICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICMgZXhwYW5zaW9uLgotICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKLSAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLSAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KLSAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKLSAgICBmZGlyPWBBU19ESVJOQU1FKFsiJGZpbGUiXSlgCi0gICAgQVNfTUtESVJfUChbJGRpcnBhcnQvJGZkaXJdKQotICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCi0gICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCi0gIGRvbmUKLWRvbmUKLV0pIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKLQotCi0jIEFNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRoaXMgbWFjcm8gc2hvdWxkIG9ubHkgYmUgaW52b2tlZCBvbmNlIC0tIHVzZSB2aWEgQUNfUkVRVUlSRS4KLSMKLSMgVGhpcyBjb2RlIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBhdXRvbWF0aWMgZGVwZW5kZW5jeSB0cmFja2luZwotIyBpcyBlbmFibGVkLiAgRklYTUUuICBUaGlzIGNyZWF0ZXMgZWFjaCBgLlAnIGZpbGUgdGhhdCB3ZSB3aWxsCi0jIG5lZWQgaW4gb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBkZXBlbmRlbmN5IGhhbmRsaW5nIGNvZGUuCi1BQ19ERUZVTihbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotW0FDX0NPTkZJR19DT01NQU5EUyhbZGVwZmlsZXNdLAotICAgICBbdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKLSAgICAgW0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciJdKQotXSkKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgOAotCi0jIEFNX0NPTkZJR19IRUFERVIgaXMgb2Jzb2xldGUuICBJdCBoYXMgYmVlbiByZXBsYWNlZCBieSBBQ19DT05GSUdfSEVBREVSUy4KLUFVX0RFRlVOKFtBTV9DT05GSUdfSEVBREVSXSwgW0FDX0NPTkZJR19IRUFERVJTKCRAKV0pCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCi0jIDIwMDUsIDIwMDYsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMTMKLQotIyBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2guICBTb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYKLSMgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuICBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBBTV9JTklUX0FVVE9NQUtFKFBBQ0tBR0UsIFZFUlNJT04sIFtOTy1ERUZJTkVdKQotIyBBTV9JTklUX0FVVE9NQUtFKFtPUFRJT05TXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGhlIGNhbGwgd2l0aCBQQUNLQUdFIGFuZCBWRVJTSU9OIGFyZ3VtZW50cyBpcyB0aGUgb2xkIHN0eWxlCi0jIGNhbGwgKHByZSBhdXRvY29uZi0yLjUwKSwgd2hpY2ggaXMgYmVpbmcgcGhhc2VkIG91dC4gIFBBQ0tBR0UKLSMgYW5kIFZFUlNJT04gc2hvdWxkIG5vdyBiZSBwYXNzZWQgdG8gQUNfSU5JVCBhbmQgcmVtb3ZlZCBmcm9tCi0jIHRoZSBjYWxsIHRvIEFNX0lOSVRfQVVUT01BS0UuCi0jIFdlIHN1cHBvcnQgYm90aCBjYWxsIHN0eWxlcyBmb3IgdGhlIHRyYW5zaXRpb24uICBBZnRlcgotIyB0aGUgbmV4dCBBdXRvbWFrZSByZWxlYXNlLCBBdXRvY29uZiBjYW4gbWFrZSB0aGUgQUNfSU5JVAotIyBhcmd1bWVudHMgbWFuZGF0b3J5LCBhbmQgdGhlbiB3ZSBjYW4gZGVwZW5kIG9uIGEgbmV3IEF1dG9jb25mCi0jIHJlbGVhc2UgYW5kIGRyb3AgdGhlIG9sZCBjYWxsIHN1cHBvcnQuCi1BQ19ERUZVTihbQU1fSU5JVF9BVVRPTUFLRV0sCi1bQUNfUFJFUkVRKFsyLjYwXSlkbmwKLWRubCBBdXRvY29uZiB3YW50cyB0byBkaXNhbGxvdyBBTV8gbmFtZXMuICBXZSBleHBsaWNpdGx5IGFsbG93Ci1kbmwgdGhlIG9uZXMgd2UgY2FyZSBhYm91dC4KLW00X3BhdHRlcm5fYWxsb3coW15BTV9bQS1aXStGTEFHUyRdKWRubAotQUNfUkVRVUlSRShbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKWRubAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIjsgdGhlbgotICAjIFVzZSAtSSQoc3JjZGlyKSBvbmx5IHdoZW4gJChzcmNkaXIpICE9IC4sIHNvIHRoYXQgbWFrZSdzIG91dHB1dAotICAjIGlzIG5vdCBwb2xsdXRlZCB3aXRoIHJlcGVhdGVkICItSS4iCi0gIEFDX1NVQlNUKFthbV9faXNyY10sIFsnIC1JJChzcmNkaXIpJ10pX0FNX1NVQlNUX05PVE1BS0UoW2FtX19pc3JjXSlkbmwKLSAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi0gIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotICBmaQotZmkKLQotIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCi1pZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgotICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLSAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCi0gIGVsc2UKLSAgICBDWUdQQVRIX1c9ZWNobwotICBmaQotZmkKLUFDX1NVQlNUKFtDWUdQQVRIX1ddKQotCi0jIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCi1kbmwgRGlzdGluZ3Vpc2ggYmV0d2VlbiBvbGQtc3R5bGUgYW5kIG5ldy1zdHlsZSBjYWxscy4KLW00X2lmdmFsKFskMl0sCi1bbTRfaWZ2YWwoWyQzXSwgW19BTV9TRVRfT1BUSU9OKFtuby1kZWZpbmVdKV0pZG5sCi0gQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJDFdKWRubAotIEFDX1NVQlNUKFtWRVJTSU9OXSwgWyQyXSldLAotW19BTV9TRVRfT1BUSU9OUyhbJDFdKWRubAotZG5sIERpYWdub3NlIG9sZC1zdHlsZSBBQ19JTklUIHdpdGggbmV3LXN0eWxlIEFNX0FVVE9NQUtFX0lOSVQuCi1tNF9pZihtNF9pZmRlZihbQUNfUEFDS0FHRV9OQU1FXSwgMSltNF9pZmRlZihbQUNfUEFDS0FHRV9WRVJTSU9OXSwgMSksIDExLCwKLSAgW200X2ZhdGFsKFtBQ19JTklUIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBwYWNrYWdlIGFuZCB2ZXJzaW9uIGFyZ3VtZW50c10pXSlkbmwKLSBBQ19TVUJTVChbUEFDS0FHRV0sIFsnQUNfUEFDS0FHRV9UQVJOQU1FJ10pZG5sCi0gQUNfU1VCU1QoW1ZFUlNJT05dLCBbJ0FDX1BBQ0tBR0VfVkVSU0lPTiddKV0pZG5sCi0KLV9BTV9JRl9PUFRJT04oW25vLWRlZmluZV0sLAotW0FDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLSBBQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKV0pZG5sCi0KLSMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pZG5sCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pZG5sCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0pCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0pCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8pCi1BTV9QUk9HX0lOU1RBTExfU0gKLUFNX1BST0dfSU5TVEFMTF9TVFJJUAotQUNfUkVRVUlSRShbQU1fUFJPR19NS0RJUl9QXSlkbmwKLSMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCi0jIHNvbWUgcGxhdGZvcm1zLgotQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi1BQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAotX0FNX0lGX09QVElPTihbdGFyLXVzdGFyXSwgW19BTV9QUk9HX1RBUihbdXN0YXJdKV0sCi0gICAgICAgICAgICAgIFtfQU1fSUZfT1BUSU9OKFt0YXItcGF4XSwgW19BTV9QUk9HX1RBUihbcGF4XSldLAotCSAgICAgIAkJICAgICBbX0FNX1BST0dfVEFSKFt2N10pXSldKQotX0FNX0lGX09QVElPTihbbm8tZGVwZW5kZW5jaWVzXSwsCi1bQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ0NdLAotICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKLSAgICAgICAgICAgICAgICAgIFtkZWZpbmUoW0FDX1BST0dfQ0NdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX0NDXSlbX0FNX0RFUEVOREVOQ0lFUyhDQyldKV0pZG5sCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAotICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0sCi0gICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX0NYWF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZm4oW0FDX1BST0dfQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSldKWRubAotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfT0JKQ10sCi0gICAgICAgICAgICAgICAgICBbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0sCi0gICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX09CSkNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX09CSkNdKVtfQU1fREVQRU5ERU5DSUVTKE9CSkMpXSldKWRubAotXSkKLV0pCi0KLQotIyBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotIyBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLSMgdGhhdCBpcyBnZW5lcmF0ZWQuICBUaGUgc3RhbXAgZmlsZXMgYXJlIG51bWJlcmVkIHRvIGhhdmUgZGlmZmVyZW50IG5hbWVzLgotCi0jIEF1dG9jb25mIGNhbGxzIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0sgKHdoZW4gZGVmaW5lZCkgaW4gdGhlCi0jIGxvb3Agd2hlcmUgY29uZmlnLnN0YXR1cyBjcmVhdGVzIHRoZSBoZWFkZXJzLCBzbyB3ZSBjYW4gZ2VuZXJhdGUKLSMgb3VyIHN0YW1wIGZpbGVzIHRoZXJlLgotQUNfREVGVU4oW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLAotWyMgQ29tcHV0ZSAkMSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9hcmc9JDEKLV9hbV9zdGFtcF9jb3VudD0xCi1mb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KLSAgY2FzZSAkX2FtX2hlYWRlciBpbgotICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCi0gICAgICBicmVhayA7OwotICAgICogKQotICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OwotICBlc2FjCi1kb25lCi1lY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YEFTX0RJUk5BTUUoWyIkX2FtX2FyZyJdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX1BST0dfSU5TVEFMTF9TSAotIyAtLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lICRpbnN0YWxsX3NoLgotQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TSF0sCi1bQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAotaW5zdGFsbF9zaD0ke2luc3RhbGxfc2gtIlwkKFNIRUxMKSAkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIn0KLUFDX1NVQlNUKGluc3RhbGxfc2gpXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDIKLQotIyBDaGVjayB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIGZpbGUtc3lzdGVtIHN1cHBvcnRzIGZpbGVuYW1lcwotIyB3aXRoIGEgbGVhZGluZyBkb3QuICBGb3IgaW5zdGFuY2UgTVMtRE9TIGRvZXNuJ3QuCi1BQ19ERUZVTihbQU1fU0VUX0xFQURJTkdfRE9UXSwKLVtybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotQUNfU1VCU1QoW2FtX19sZWFkaW5nX2RvdF0pXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotIyBGcm9tIEppbSBNZXllcmluZwotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA0Ci0KLUFDX0RFRlVOKFtBTV9NQUlOVEFJTkVSX01PREVdLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotCQkJICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCi0gIEFDX01TR19SRVNVTFQoWyRVU0VfTUFJTlRBSU5FUl9NT0RFXSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCBbdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllc10pCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotQVVfREVGVU4oW2ptX01BSU5UQUlORVJfTU9ERV0sIFtBTV9NQUlOVEFJTkVSX01PREVdKQotCi0jIENoZWNrIHRvIHNlZSBob3cgJ21ha2UnIHRyZWF0cyBpbmNsdWRlcy4JICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMwotCi0jIEFNX01BS0VfSU5DTFVERSgpCi0jIC0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIHRvIHNlZSBob3cgbWFrZSB0cmVhdHMgaW5jbHVkZXMuCi1BQ19ERUZVTihbQU1fTUFLRV9JTkNMVURFXSwKLVthbV9tYWtlPSR7TUFLRS1tYWtlfQotY2F0ID4gY29uZmluYyA8PCAnRU5EJwotYW1fX2RvaXQ6Ci0JQGVjaG8gZG9uZQotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIFdlIGdyZXAgb3V0IGBFbnRlcmluZyBkaXJlY3RvcnknIGFuZCBgTGVhdmluZyBkaXJlY3RvcnknCi0jIG1lc3NhZ2VzIHdoaWNoIGNhbiBvY2N1ciBpZiBgdycgZW5kcyB1cCBpbiBNQUtFRkxBR1MuCi0jIEluIHBhcnRpY3VsYXIgd2UgZG9uJ3QgbG9vayBhdCBgXm1ha2U6JyBiZWNhdXNlIEdOVSBtYWtlIG1pZ2h0Ci0jIGJlIGludm9rZWQgdW5kZXIgc29tZSBvdGhlciBuYW1lICh1c3VhbGx5ICJnbWFrZSIpLCBpbiB3aGljaAotIyBjYXNlIGl0IHByaW50cyBpdHMgbmV3IG5hbWUgaW5zdGVhZCBvZiBgbWFrZScuCi1pZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbCB8IGdyZXAgLXYgJ2luZyBkaXJlY3RvcnknYCIgPSAiZG9uZSI7IHRoZW4KLSAgIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgIGFtX19xdW90ZT0KLSAgIF9hbV9yZXN1bHQ9R05VCi1maQotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAiID0gImRvbmUiOyB0aGVuCi0gICAgICBhbV9faW5jbHVkZT0uaW5jbHVkZQotICAgICAgYW1fX3F1b3RlPSJcIiIKLSAgICAgIF9hbV9yZXN1bHQ9QlNECi0gICBmaQotZmkKLUFDX1NVQlNUKFthbV9faW5jbHVkZV0pCi1BQ19TVUJTVChbYW1fX3F1b3RlXSkKLUFDX01TR19SRVNVTFQoWyRfYW1fcmVzdWx0XSkKLXJtIC1mIGNvbmZpbmMgY29uZm1mCi1dKQotCi0jIEZha2UgdGhlIGV4aXN0ZW5jZSBvZiBwcm9ncmFtcyB0aGF0IEdOVSBtYWludGFpbmVycyB1c2UuICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDUKLQotIyBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fTUlTU0lOR19QUk9HXSwKLVtBQ19SRVFVSVJFKFtBTV9NSVNTSU5HX0hBU19SVU5dKQotJDE9JHskMS0iJHthbV9taXNzaW5nX3J1bn0kMiJ9Ci1BQ19TVUJTVCgkMSldKQotCi0KLSMgQU1fTUlTU0lOR19IQVNfUlVOCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgTUlTU0lORyBpZiBub3QgZGVmaW5lZCBzbyBmYXIgYW5kIHRlc3QgaWYgaXQgc3VwcG9ydHMgLS1ydW4uCi0jIElmIGl0IGRvZXMsIHNldCBhbV9taXNzaW5nX3J1biB0byB1c2UgaXQsIG90aGVyd2lzZSwgdG8gbm90aGluZy4KLUFDX0RFRlVOKFtBTV9NSVNTSU5HX0hBU19SVU5dLAotW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLUFDX1JFUVVJUkVfQVVYX0ZJTEUoW21pc3NpbmddKWRubAotdGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICBBQ19NU0dfV0FSTihbYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmddKQotZmkKLV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX1BST0dfTUtESVJfUAotIyAtLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgZm9yIGBta2RpciAtcCcuCi1BQ19ERUZVTihbQU1fUFJPR19NS0RJUl9QXSwKLVtBQ19QUkVSRVEoWzIuNjBdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19NS0RJUl9QXSlkbmwKLWRubCBBdXRvbWFrZSAxLjggdG8gMS45LjYgdXNlZCB0byBkZWZpbmUgbWtkaXJfcC4gIFdlIG5vdyB1c2UgTUtESVJfUCwKLWRubCB3aGlsZSBrZWVwaW5nIGEgZGVmaW5pdGlvbiBvZiBta2Rpcl9wIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotZG5sIEBNS0RJUl9QQCBpcyBtYWdpYzogQUNfT1VUUFVUIGFkanVzdHMgaXRzIHZhbHVlIGZvciBlYWNoIE1ha2VmaWxlLgotZG5sIEhvd2V2ZXIgd2UgY2Fubm90IGRlZmluZSBta2Rpcl9wIGFzICQoTUtESVJfUCkgZm9yIHRoZSBzYWtlIG9mCi1kbmwgTWFrZWZpbGUuaW5zIHRoYXQgZG8gbm90IGRlZmluZSBNS0RJUl9QLCBzbyB3ZSBkbyBvdXIgb3duCi1kbmwgYWRqdXN0bWVudCB1c2luZyB0b3BfYnVpbGRkaXIgKHdoaWNoIGlzIGRlZmluZWQgbW9yZSBvZnRlbiB0aGFuCi1kbmwgTUtESVJfUCkuCi1BQ19TVUJTVChbbWtkaXJfcF0sIFsiJE1LRElSX1AiXSlkbmwKLWNhc2UgJG1rZGlyX3AgaW4KLSAgW1tcXC8kXV0qIHwgPzpbW1xcL11dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotXSkKLQotIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMwotCi0jIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAotW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCi0KLSMgX0FNX1NFVF9PUFRJT04oTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNldCBvcHRpb24gTkFNRS4gIFByZXNlbnRseSB0aGF0IG9ubHkgbWVhbnMgZGVmaW5pbmcgYSBmbGFnIGZvciB0aGlzIG9wdGlvbi4KLUFDX0RFRlVOKFtfQU1fU0VUX09QVElPTl0sCi1bbTRfZGVmaW5lKF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCAxKV0pCi0KLSMgX0FNX1NFVF9PUFRJT05TKE9QVElPTlMpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgT1BUSU9OUyBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIEF1dG9tYWtlIG9wdGlvbnMuCi1BQ19ERUZVTihbX0FNX1NFVF9PUFRJT05TXSwKLVtBQ19GT1JFQUNIKFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQotCi0jIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KLUFDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKLVttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQotCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLiAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDQKLQotIyBBTV9TQU5JVFlfQ0hFQ0sKLSMgLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkWypdIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkWypdIiAhPSAiWCBjb25mdGVzdC5maWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiJFsyXSIgPSBjb25mdGVzdC5maWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9QUk9HX0lOU1RBTExfU1RSSVAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAotIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKLSMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKLSMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCi0jIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKLSMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQotIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgotQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCi1bQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWRubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgotICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCi1maQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKLUFDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIF9BTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUHJldmVudCBBdXRvbWFrZSBmcm9tIG91dHB1dHRpbmcgVkFSSUFCTEUgPSBAVkFSSUFCTEVAIGluIE1ha2VmaWxlLmluLgotIyBUaGlzIG1hY3JvIGlzIHRyYWNlZCBieSBBdXRvbWFrZS4KLUFDX0RFRlVOKFtfQU1fU1VCU1RfTk9UTUFLRV0pCi0KLSMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDIKLQotIyBfQU1fUFJPR19UQVIoRk9STUFUKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbCBpbiBmb3JtYXQgRk9STUFULgotIyBGT1JNQVQgc2hvdWxkIGJlIG9uZSBvZiBgdjcnLCBgdXN0YXInLCBvciBgcGF4Jy4KLSMKLSMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3RhcikgdGhhdCBpcyBhIGNvbW1hbmQKLSMgd3JpdGluZyB0byBzdGRvdXQgYSBGT1JNQVQtdGFyYmFsbCBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkKLSMgJHRhcmRpci4KLSMgICAgIHRhcmRpcj1kaXJlY3RvcnkgJiYgJChhbV9fdGFyKSA+IHJlc3VsdC50YXIKLSMKLSMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3VudGFyKSB0aGF0IGV4dHJhY3Qgc3VjaAotIyBhIHRhcmJhbGwgcmVhZCBmcm9tIHN0ZGluLgotIyAgICAgJChhbV9fdW50YXIpIDwgcmVzdWx0LnRhcgotQUNfREVGVU4oW19BTV9QUk9HX1RBUl0sCi1bIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotQU1fTUlTU0lOR19QUk9HKFtBTVRBUl0sIFt0YXJdKQotbTRfaWYoWyQxXSwgW3Y3XSwKLSAgICAgW2FtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJ10sCi0gICAgIFttNF9jYXNlKFskMV0sIFt1c3Rhcl0sLCBbcGF4XSwsCi0gICAgICAgICAgICAgIFttNF9mYXRhbChbVW5rbm93biB0YXIgZm9ybWF0XSldKQotQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY3JlYXRlIGEgJDEgdGFyIGFyY2hpdmVdKQotIyBMb29wIG92ZXIgYWxsIGtub3duIG1ldGhvZHMgdG8gY3JlYXRlIGEgdGFyIGFyY2hpdmUgdW50aWwgb25lIHdvcmtzLgotX2FtX3Rvb2xzPSdnbnV0YXIgbTRfaWYoWyQxXSwgW3VzdGFyXSwgW3BsYWludGFyXSkgcGF4IGNwaW8gbm9uZScKLV9hbV90b29scz0ke2FtX2N2X3Byb2dfdGFyXyQxLSRfYW1fdG9vbHN9Ci0jIERvIG5vdCBmb2xkIHRoZSBhYm92ZSB0d28gbGluZSBpbnRvIG9uZSwgYmVjYXVzZSBUcnU2NCBzaCBhbmQKLSMgU29sYXJpcyBzaCB3aWxsIG5vdCBncm9rIHNwYWNlcyBpbiB0aGUgcmhzIG9mIGAtJy4KLWZvciBfYW1fdG9vbCBpbiAkX2FtX3Rvb2xzCi1kbwotICBjYXNlICRfYW1fdG9vbCBpbgotICBnbnV0YXIpCi0gICAgZm9yIF9hbV90YXIgaW4gdGFyIGdudXRhciBndGFyOwotICAgIGRvCi0gICAgICBBTV9SVU5fTE9HKFskX2FtX3RhciAtLXZlcnNpb25dKSAmJiBicmVhawotICAgIGRvbmUKLSAgICBhbV9fdGFyPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9IiRfYW1fdGFyIC14ZiAtIgotICAgIDs7Ci0gIHBsYWludGFyKQotICAgICMgTXVzdCBza2lwIEdOVSB0YXI6IGlmIGl0IGRvZXMgbm90IHN1cHBvcnQgLS1mb3JtYXQ9IGl0IGRvZXNuJ3QgY3JlYXRlCi0gICAgIyB1c3RhciB0YXJiYWxsIGVpdGhlci4KLSAgICAodGFyIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxICYmIGNvbnRpbnVlCi0gICAgYW1fX3Rhcj0ndGFyIGNoZiAtICIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89J3RhciBjaGYgLSAiJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSd0YXIgeGYgLScKLSAgICA7OwotICBwYXgpCi0gICAgYW1fX3Rhcj0ncGF4IC1MIC14ICQxIC13ICIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89J3BheCAtTCAteCAkMSAtdyAiJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSdwYXggLXInCi0gICAgOzsKLSAgY3BpbykKLSAgICBhbV9fdGFyPSdmaW5kICIkJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKLSAgICBhbV9fdGFyXz0nZmluZCAiJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKLSAgICBhbV9fdW50YXI9J2NwaW8gLWkgLUggJDEgLWQnCi0gICAgOzsKLSAgbm9uZSkKLSAgICBhbV9fdGFyPWZhbHNlCi0gICAgYW1fX3Rhcl89ZmFsc2UKLSAgICBhbV9fdW50YXI9ZmFsc2UKLSAgICA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgdmFsdWUgd2FzIGNhY2hlZCwgc3RvcCBub3cuICBXZSBqdXN0IHdhbnRlZCB0byBoYXZlIGFtX190YXIKLSAgIyBhbmQgYW1fX3VudGFyIHNldC4KLSAgdGVzdCAtbiAiJHthbV9jdl9wcm9nX3Rhcl8kMX0iICYmIGJyZWFrCi0KLSAgIyB0YXIvdW50YXIgYSBkdW1teSBkaXJlY3RvcnksIGFuZCBzdG9wIGlmIHRoZSBjb21tYW5kIHdvcmtzCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gIGVjaG8gR3JlcE1lID4gY29uZnRlc3QuZGlyL2ZpbGUKLSAgQU1fUlVOX0xPRyhbdGFyZGlyPWNvbmZ0ZXN0LmRpciAmJiBldmFsICRhbV9fdGFyXyA+Y29uZnRlc3QudGFyXSkKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LnRhcjsgdGhlbgotICAgIEFNX1JVTl9MT0coWyRhbV9fdW50YXIgPGNvbmZ0ZXN0LnRhcl0pCi0gICAgZ3JlcCBHcmVwTWUgY29uZnRlc3QuZGlyL2ZpbGUgPi9kZXYvbnVsbCAyPiYxICYmIGJyZWFrCi0gIGZpCi1kb25lCi1ybSAtcmYgY29uZnRlc3QuZGlyCi0KLUFDX0NBQ0hFX1ZBTChbYW1fY3ZfcHJvZ190YXJfJDFdLCBbYW1fY3ZfcHJvZ190YXJfJDE9JF9hbV90b29sXSkKLUFDX01TR19SRVNVTFQoWyRhbV9jdl9wcm9nX3Rhcl8kMV0pXSkKLUFDX1NVQlNUKFthbV9fdGFyXSkKLUFDX1NVQlNUKFthbV9fdW50YXJdKQotXSkgIyBfQU1fUFJPR19UQVIKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9hdXRvZ2VuLnNoIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9hdXRvZ2VuLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWIzNDZhLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvYXV0b2dlbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0jIS9iaW4vc2gKLSMgUnVuIHRoaXMgdG8gZ2VuZXJhdGUgYWxsIHRoZSBpbml0aWFsIG1ha2VmaWxlcywgZXRjLgotCi1zcmNkaXI9YGRpcm5hbWUgJDBgCi10ZXN0IC16ICIkc3JjZGlyIiAmJiBzcmNkaXI9LgotCi1ESUU9MAotCi1pZiBbIC1uICIkR05PTUUyX0RJUiIgXTsgdGhlbgotCUFDTE9DQUxfRkxBR1M9Ii1JICRHTk9NRTJfRElSL3NoYXJlL2FjbG9jYWwgJEFDTE9DQUxfRkxBR1MiCi0JTERfTElCUkFSWV9QQVRIPSIkR05PTUUyX0RJUi9saWI6JExEX0xJQlJBUllfUEFUSCIKLQlQQVRIPSIkR05PTUUyX0RJUi9iaW46JFBBVEgiCi0JZXhwb3J0IFBBVEgKLQlleHBvcnQgTERfTElCUkFSWV9QQVRICi1maQotCi0odGVzdCAtZiAkc3JjZGlyL2NvbmZpZ3VyZS5hYykgfHwgewotICAgIGVjaG8gLW4gIioqRXJyb3IqKjogRGlyZWN0b3J5ICJcYCRzcmNkaXJcJyIgZG9lcyBub3QgbG9vayBsaWtlIHRoZSIKLSAgICBlY2hvICIgdG9wLWxldmVsIHBhY2thZ2UgZGlyZWN0b3J5IgotICAgIGV4aXQgMQotfQotCi0oYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxIHx8IHsKLSAgZWNobwotICBlY2hvICIqKkVycm9yKio6IFlvdSBtdXN0IGhhdmUgXGBhdXRvY29uZicgaW5zdGFsbGVkLiIKLSAgZWNobyAiRG93bmxvYWQgdGhlIGFwcHJvcHJpYXRlIHBhY2thZ2UgZm9yIHlvdXIgZGlzdHJpYnV0aW9uLCIKLSAgZWNobyAib3IgZ2V0IHRoZSBzb3VyY2UgdGFyYmFsbCBhdCBmdHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251LyIKLSAgRElFPTEKLX0KLQotKGdyZXAgIl5JVF9QUk9HX0lOVExUT09MIiAkc3JjZGlyL2NvbmZpZ3VyZS5hYyA+L2Rldi9udWxsKSAmJiB7Ci0gIChpbnRsdG9vbGl6ZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgfHwgewotICAgIGVjaG8gCi0gICAgZWNobyAiKipFcnJvcioqOiBZb3UgbXVzdCBoYXZlIFxgaW50bHRvb2wnIGluc3RhbGxlZC4iCi0gICAgZWNobyAiWW91IGNhbiBnZXQgaXQgZnJvbToiCi0gICAgZWNobyAiICBmdHA6Ly9mdHAuZ25vbWUub3JnL3B1Yi9HTk9NRS8iCi0gICAgRElFPTEKLSAgfQotfQotCi0oZ3JlcCAiXkFNX1BST0dfWE1MX0kxOE5fVE9PTFMiICRzcmNkaXIvY29uZmlndXJlLmFjID4vZGV2L251bGwpICYmIHsKLSAgKHhtbC1pMThuLXRvb2xpemUgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxIHx8IHsKLSAgICBlY2hvCi0gICAgZWNobyAiKipFcnJvcioqOiBZb3UgbXVzdCBoYXZlIFxgeG1sLWkxOG4tdG9vbGl6ZScgaW5zdGFsbGVkLiIKLSAgICBlY2hvICJZb3UgY2FuIGdldCBpdCBmcm9tOiIKLSAgICBlY2hvICIgIGZ0cDovL2Z0cC5nbm9tZS5vcmcvcHViL0dOT01FLyIKLSAgICBESUU9MQotICB9Ci19Ci0KLShncmVwICJeQU1fUFJPR19MSUJUT09MIiAkc3JjZGlyL2NvbmZpZ3VyZS5hYyA+L2Rldi9udWxsKSAmJiB7Ci0gIChsaWJ0b29sIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMSB8fCB7Ci0gICAgZWNobwotICAgIGVjaG8gIioqRXJyb3IqKjogWW91IG11c3QgaGF2ZSBcYGxpYnRvb2wnIGluc3RhbGxlZC4iCi0gICAgZWNobyAiWW91IGNhbiBnZXQgaXQgZnJvbTogZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS8iCi0gICAgRElFPTEKLSAgfQotfQotCi0oZ3JlcCAiXkFNX0dMSUJfR05VX0dFVFRFWFQiICRzcmNkaXIvY29uZmlndXJlLmFjID4vZGV2L251bGwpICYmIHsKLSAgKGdyZXAgInNlZC4qUE9URklMRVMiICRzcmNkaXIvY29uZmlndXJlLmFjKSA+IC9kZXYvbnVsbCB8fCBcCi0gIChnbGliLWdldHRleHRpemUgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxIHx8IHsKLSAgICBlY2hvCi0gICAgZWNobyAiKipFcnJvcioqOiBZb3UgbXVzdCBoYXZlIFxgZ2xpYicgaW5zdGFsbGVkLiIKLSAgICBlY2hvICJZb3UgY2FuIGdldCBpdCBmcm9tOiBmdHA6Ly9mdHAuZ3RrLm9yZy9wdWIvZ3RrIgotICAgIERJRT0xCi0gIH0KLX0KLQotKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMSB8fCB7Ci0gIGVjaG8KLSAgZWNobyAiKipFcnJvcioqOiBZb3UgbXVzdCBoYXZlIFxgYXV0b21ha2UnIGluc3RhbGxlZC4iCi0gIGVjaG8gIllvdSBjYW4gZ2V0IGl0IGZyb206IGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvIgotICBESUU9MQotICBOT19BVVRPTUFLRT15ZXMKLX0KLQotCi0jIGlmIG5vIGF1dG9tYWtlLCBkb24ndCBib3RoZXIgdGVzdGluZyBmb3IgYWNsb2NhbAotdGVzdCAtbiAiJE5PX0FVVE9NQUtFIiB8fCAoYWNsb2NhbCAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgfHwgewotICBlY2hvCi0gIGVjaG8gIioqRXJyb3IqKjogTWlzc2luZyBcYGFjbG9jYWwnLiAgVGhlIHZlcnNpb24gb2YgXGBhdXRvbWFrZSciCi0gIGVjaG8gImluc3RhbGxlZCBkb2Vzbid0IGFwcGVhciByZWNlbnQgZW5vdWdoLiIKLSAgZWNobyAiWW91IGNhbiBnZXQgYXV0b21ha2UgZnJvbSBmdHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251LyIKLSAgRElFPTEKLX0KLQotaWYgdGVzdCAiJERJRSIgLWVxIDE7IHRoZW4KLSAgZXhpdCAxCi1maQotCi1pZiB0ZXN0IC16ICIkKiI7IHRoZW4KLSAgZWNobyAiKipXYXJuaW5nKio6IEkgYW0gZ29pbmcgdG8gcnVuIFxgY29uZmlndXJlJyB3aXRoIG5vIGFyZ3VtZW50cy4iCi0gIGVjaG8gIklmIHlvdSB3aXNoIHRvIHBhc3MgYW55IHRvIGl0LCBwbGVhc2Ugc3BlY2lmeSB0aGVtIG9uIHRoZSIKLSAgZWNobyBcYCQwXCciIGNvbW1hbmQgbGluZS4iCi0gIGVjaG8KLWZpCi0KLWNhc2UgJENDIGluCi14bGMgKQotICBhbV9vcHQ9LS1pbmNsdWRlLWRlcHM7OwotZXNhYwotCi1mb3IgY29pbiBpbiBgZmluZCAkc3JjZGlyIC1wYXRoICRzcmNkaXIvQ1ZTIC1wcnVuZSAtbyAtbmFtZSBjb25maWd1cmUuYWMgLXByaW50YAotZG8gCi0gIGRyPWBkaXJuYW1lICRjb2luYAotICBpZiB0ZXN0IC1mICRkci9OTy1BVVRPLUdFTjsgdGhlbgotICAgIGVjaG8gc2tpcHBpbmcgJGRyIC0tIGZsYWdnZWQgYXMgbm8gYXV0by1nZW4KLSAgZWxzZQotICAgIGVjaG8gcHJvY2Vzc2luZyAkZHIKLSAgICAoIGNkICRkcgotCi0gICAgICBhY2xvY2FsaW5jbHVkZT0iJEFDTE9DQUxfRkxBR1MiCi0KLSAgICAgIGlmIGdyZXAgIl5BTV9HTElCX0dOVV9HRVRURVhUIiBjb25maWd1cmUuYWMgPi9kZXYvbnVsbDsgdGhlbgotCWVjaG8gIkNyZWF0aW5nICRkci9hY2xvY2FsLm00IC4uLiIKLQl0ZXN0IC1yICRkci9hY2xvY2FsLm00IHx8IHRvdWNoICRkci9hY2xvY2FsLm00Ci0JZWNobyAiUnVubmluZyBnbGliLWdldHRleHRpemUuLi4gIElnbm9yZSBub24tZmF0YWwgbWVzc2FnZXMuIgotCWVjaG8gIm5vIiB8IGdsaWItZ2V0dGV4dGl6ZSAtLWZvcmNlIC0tY29weQotCWVjaG8gIk1ha2luZyAkZHIvYWNsb2NhbC5tNCB3cml0YWJsZSAuLi4iCi0JdGVzdCAtciAkZHIvYWNsb2NhbC5tNCAmJiBjaG1vZCB1K3cgJGRyL2FjbG9jYWwubTQKLSAgICAgIGZpCi0gICAgICBpZiBncmVwICJeSVRfUFJPR19JTlRMVE9PTCIgY29uZmlndXJlLmFjID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgZWNobyAiUnVubmluZyBpbnRsdG9vbGl6ZS4uLiIKLQlpbnRsdG9vbGl6ZSAtLWNvcHkgLS1mb3JjZSAtLWF1dG9tYWtlCi0gICAgICBmaQotICAgICAgaWYgZ3JlcCAiXkFNX1BST0dfWE1MX0kxOE5fVE9PTFMiIGNvbmZpZ3VyZS5hYyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgIGVjaG8gIlJ1bm5pbmcgeG1sLWkxOG4tdG9vbGl6ZS4uLiIKLQl4bWwtaTE4bi10b29saXplIC0tY29weSAtLWZvcmNlIC0tYXV0b21ha2UKLSAgICAgIGZpCi0gICAgICBpZiBncmVwICJeQU1fUFJPR19MSUJUT09MIiBjb25maWd1cmUuYWMgPi9kZXYvbnVsbDsgdGhlbgotCWlmIHRlc3QgLXogIiROT19MSUJUT09MSVpFIiA7IHRoZW4gCi0JICBlY2hvICJSdW5uaW5nIGxpYnRvb2xpemUuLi4iCi0JICBsaWJ0b29saXplIC0tZm9yY2UgLS1jb3B5Ci0JZmkKLSAgICAgIGZpCi0gICAgICBlY2hvICJSdW5uaW5nIGFjbG9jYWwgJGFjbG9jYWxpbmNsdWRlIC4uLiIKLSAgICAgIGFjbG9jYWwgJGFjbG9jYWxpbmNsdWRlCi0gICAgICBpZiBncmVwICJeQU1fQ09ORklHX0hFQURFUiIgY29uZmlndXJlLmFjID4vZGV2L251bGw7IHRoZW4KLQllY2hvICJSdW5uaW5nIGF1dG9oZWFkZXIuLi4iCi0JYXV0b2hlYWRlcgotICAgICAgZmkKLSAgICAgIGVjaG8gIlJ1bm5pbmcgYXV0b21ha2UgLS1nbnUgJGFtX29wdCAuLi4iCi0gICAgICBhdXRvbWFrZSAtLWFkZC1taXNzaW5nIC0tZ251ICRhbV9vcHQKLSAgICAgIGVjaG8gIlJ1bm5pbmcgYXV0b2NvbmYgLi4uIgotICAgICAgYXV0b2NvbmYKLSAgICApCi0gIGZpCi1kb25lCi0KLWNvbmZfZmxhZ3M9Ii0tZW5hYmxlLW1haW50YWluZXItbW9kZSIKLQotaWYgdGVzdCB4JE5PQ09ORklHVVJFID0geDsgdGhlbgotICBlY2hvIFJ1bm5pbmcgJHNyY2Rpci9jb25maWd1cmUgJGNvbmZfZmxhZ3MgIiRAIiAuLi4KLSAgJHNyY2Rpci9jb25maWd1cmUgJGNvbmZfZmxhZ3MgIiRAIiBcCi0gICYmIGVjaG8gTm93IHR5cGUgXGBtYWtlXCcgdG8gY29tcGlsZS4gfHwgZXhpdCAxCi1lbHNlCi0gIGVjaG8gU2tpcHBpbmcgY29uZmlndXJlIHByb2Nlc3MuCi1maQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9jbWFrZS9DaGVja0NYWFNvdXJjZUNvbXBpbGVzLmNtYWtlIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9jbWFrZS9DaGVja0NYWFNvdXJjZUNvbXBpbGVzLmNtYWtlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTIxYzg5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvY21ha2UvQ2hlY2tDWFhTb3VyY2VDb21waWxlcy5jbWFrZQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMgLSBDaGVjayBpZiB0aGUgc291cmNlIGNvZGUgcHJvdmlkZWQgaW4gdGhlIFNPVVJDRSBhcmd1bWVudCBjb21waWxlcy4KLSMgQ0hFQ0tfQ1hYX1NPVVJDRV9DT01QSUxFUyhTT1VSQ0UgVkFSKQotIyAtIG1hY3JvIHdoaWNoIGNoZWNrcyBpZiB0aGUgc291cmNlIGNvZGUgY29tcGlsZXMKLSMgIFNPVVJDRSAtIHNvdXJjZSBjb2RlIHRvIHRyeSB0byBjb21waWxlCi0jICBWQVIgICAgLSB2YXJpYWJsZSB0byBzdG9yZSB3aGV0aGVyIHRoZSBzb3VyY2UgY29kZSBjb21waWxlZAotIwotIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBtYXkgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWFjcm8gdG8KLSMgbW9kaWZ5IHRoZSB3YXkgdGhlIGNoZWNrIGlzIHJ1bjoKLSMKLSMgIENNQUtFX1JFUVVJUkVEX0ZMQUdTID0gc3RyaW5nIG9mIGNvbXBpbGUgY29tbWFuZCBsaW5lIGZsYWdzCi0jICBDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyA9IGxpc3Qgb2YgbWFjcm9zIHRvIGRlZmluZSAoLURGT089YmFyKQotIyAgQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgPSBsaXN0IG9mIGluY2x1ZGUgZGlyZWN0b3JpZXMKLSMgIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyA9IGxpc3Qgb2YgbGlicmFyaWVzIHRvIGxpbmsKLQotTUFDUk8oQ0hFQ0tfQ1hYX1NPVVJDRV9DT01QSUxFUyBTT1VSQ0UgVkFSKQotICBJRigiJHtWQVJ9IiBNQVRDSEVTICJeJHtWQVJ9JCIpCi0gICAgU0VUKE1BQ1JPX0NIRUNLX0ZVTkNUSU9OX0RFRklOSVRJT05TIAotICAgICAgIi1EJHtWQVJ9ICR7Q01BS0VfUkVRVUlSRURfRkxBR1N9IikKLSAgICBJRihDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMpCi0gICAgICBTRVQoQ0hFQ0tfQ1hYX1NPVVJDRV9DT01QSUxFU19BRERfTElCUkFSSUVTCi0gICAgICAgICItRExJTktfTElCUkFSSUVTOlNUUklORz0ke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQotICAgIEVMU0UoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQotICAgICAgU0VUKENIRUNLX0NYWF9TT1VSQ0VfQ09NUElMRVNfQUREX0xJQlJBUklFUykKLSAgICBFTkRJRihDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMpCi0gICAgSUYoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMpCi0gICAgICBTRVQoQ0hFQ0tfQ1hYX1NPVVJDRV9DT01QSUxFU19BRERfSU5DTFVERVMKLSAgICAgICAgIi1ESU5DTFVERV9ESVJFQ1RPUklFUzpTVFJJTkc9JHtDTUFLRV9SRVFVSVJFRF9JTkNMVURFU30iKQotICAgIEVMU0UoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMpCi0gICAgICBTRVQoQ0hFQ0tfQ1hYX1NPVVJDRV9DT01QSUxFU19BRERfSU5DTFVERVMpCi0gICAgRU5ESUYoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMpCi0gICAgRklMRShXUklURSAiJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9zcmMuY3h4IgotICAgICAgIiR7U09VUkNFfVxuIikKLQotICAgIE1FU1NBR0UoU1RBVFVTICJQZXJmb3JtaW5nIFRlc3QgJHtWQVJ9IikKLSAgICBUUllfQ09NUElMRSgke1ZBUn0KLSAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0KLSAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VUbXAvc3JjLmN4eAotICAgICAgQ09NUElMRV9ERUZJTklUSU9OUyAke0NNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfQotICAgICAgQ01BS0VfRkxBR1MgLURDT01QSUxFX0RFRklOSVRJT05TOlNUUklORz0ke01BQ1JPX0NIRUNLX0ZVTkNUSU9OX0RFRklOSVRJT05TfQotICAgICAgIiR7Q0hFQ0tfQ1hYX1NPVVJDRV9DT01QSUxFU19BRERfTElCUkFSSUVTfSIKLSAgICAgICIke0NIRUNLX0NYWF9TT1VSQ0VfQ09NUElMRVNfQUREX0lOQ0xVREVTfSIKLSAgICAgIE9VVFBVVF9WQVJJQUJMRSBPVVRQVVQpCi0gICAgSUYoJHtWQVJ9KQotICAgICAgU0VUKCR7VkFSfSAxIENBQ0hFIElOVEVSTkFMICJUZXN0ICR7VkFSfSIpCi0gICAgICBNRVNTQUdFKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7VkFSfSAtIFN1Y2Nlc3MiKQotICAgICAgRklMRShBUFBFTkQgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZU91dHB1dC5sb2cgCi0gICAgICAgICJQZXJmb3JtaW5nIEMrKyBTT1VSQ0UgRklMRSBUZXN0ICR7VkFSfSBzdWNjZWRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgotICAgICAgICAiJHtPVVRQVVR9XG4iCi0gICAgICAgICJTb3VyY2UgZmlsZSB3YXM6XG4ke1NPVVJDRX1cbiIpCi0gICAgRUxTRSgke1ZBUn0pCi0gICAgICBNRVNTQUdFKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7VkFSfSAtIEZhaWxlZCIpCi0gICAgICBTRVQoJHtWQVJ9ICIiIENBQ0hFIElOVEVSTkFMICJUZXN0ICR7VkFSfSIpCi0gICAgICBGSUxFKEFQUEVORCAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlRXJyb3IubG9nIAotICAgICAgICAiUGVyZm9ybWluZyBDKysgU09VUkNFIEZJTEUgVGVzdCAke1ZBUn0gZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQ6XG4iCi0gICAgICAgICIke09VVFBVVH1cbiIKLSAgICAgICAgIlNvdXJjZSBmaWxlIHdhczpcbiR7U09VUkNFfVxuIikKLSAgICBFTkRJRigke1ZBUn0pCi0gIEVORElGKCIke1ZBUn0iIE1BVENIRVMgIl4ke1ZBUn0kIikKLUVORE1BQ1JPKENIRUNLX0NYWF9TT1VSQ0VfQ09NUElMRVMpCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvY21ha2UvRmluZFRSMS5jbWFrZSBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvY21ha2UvRmluZFRSMS5jbWFrZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmMmI0NC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL2NtYWtlL0ZpbmRUUjEuY21ha2UKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jIENoZWNrIGF2YWlsYWJpbGl0eSBvZiBDKysgVFIxIGNvbnRlbnRzLgotCi0jIFNldHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6Ci0jCi0jIFRSMV9TSEFSRURfUFRSX0ZPVU5EICAgICAgICAgIC0tIHN0ZDo6dHIxOjpzaGFyZWRfcHRyMTxUPiBhdmFpbGFibGUKLSMgVFIxX1NIQVJFRF9QVFJfVVNFX1RSMV9NRU1PUlkgLS0gI2luY2x1ZGUgPHRyMS9tZW1vcnk+Ci0jIFRSMV9TSEFSRURfUFRSX1VTRV9NRU1PUlkgICAgIC0tICNpbmNsdWRlIDxtZW1vcnk+Ci0gCi0jIFdlIG5lZWQgdG8gaGF2ZSBhdCBsZWFzdCB0aGlzIHZlcnNpb24gdG8gc3VwcG9ydCB0aGUgVkVSU0lPTl9MRVNTIGFyZ3VtZW50IHRvICdpZicgKDIuNi4yKSBhbmQgdW5zZXQgKDIuNi4zKQotY21ha2VfcG9saWN5KFBVU0gpCi0gICAgY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNi4zKQotY21ha2VfcG9saWN5KFBPUCkKLQotSU5DTFVERSgke1BST0pFQ1RfU09VUkNFX0RJUn0vY21ha2UvQ2hlY2tDWFhTb3VyY2VDb21waWxlcy5jbWFrZSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIHN0ZDo6dHIxOjpzaGFyZWRfcHRyPFQ+Ci0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgCi1jaGVja19jeHhfc291cmNlX2NvbXBpbGVzKAotICAgIgotICAgI2luY2x1ZGUgPHRyMS9tZW1vcnk+Ci0gICBpbnQgbWFpbigpIHsKLSAgICAgIHN0ZDo6dHIxOjpzaGFyZWRfcHRyPGludD4gcHRyOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0gICIKLVRSMV9TSEFSRURfUFRSX1VTRV9UUjFfTUVNT1JZKQotY2hlY2tfY3h4X3NvdXJjZV9jb21waWxlcygKLSAgICAgICAgIgotICAgICAgICAjaW5jbHVkZSA8bWVtb3J5PgotICAgICAgICBpbnQgbWFpbigpIHsKLSAgICAgICAgICAgc3RkOjp0cjE6OnNoYXJlZF9wdHI8aW50PiBwdHI7Ci0gICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIgotVFIxX1NIQVJFRF9QVFJfVVNFX01FTU9SWSkKLSAgIAotc2V0IChUUjFfU0hBUkVEX1BUUiAtTk9URk9VTkQpCi1pZiAoVFIxX1NIQVJFRF9QVFJfVVNFX1RSMV9NRU1PUlkpCi1zZXQgKFRSMV9TSEFSRURfUFRSX0ZPVU5EIFRSVUUpCi1lbmRpZiAoVFIxX1NIQVJFRF9QVFJfVVNFX1RSMV9NRU1PUlkpCi1pZiAoVFIxX1NIQVJFRF9QVFJfVVNFX01FTU9SWSkKLXNldCAoVFIxX1NIQVJFRF9QVFJfRk9VTkQgVFJVRSkKLWVuZGlmIChUUjFfU0hBUkVEX1BUUl9VU0VfTUVNT1JZKQotICAgIAotbWFya19hc19hZHZhbmNlZCAoVFIxX1NIQVJFRF9QVFJfRk9VTkQpCi1tYXJrX2FzX2FkdmFuY2VkIChUUjFfU0hBUkVEX1BUUl9VU0VfVFIxX01FTU9SWSkKLW1hcmtfYXNfYWR2YW5jZWQgKFRSMV9TSEFSRURfUFRSX1VTRV9NRU1PUlkpCi0gICAgCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDxLLCBWPgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAKLWNoZWNrX2N4eF9zb3VyY2VfY29tcGlsZXMoCi0gICAgICAgICIKLSAgICAgICAgI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfbWFwPgotICAgICAgICBpbnQgbWFpbigpIHsKLSAgICAgICAgICAgICBzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDxpbnQsIGludD4gbTsKLSAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICAiCi0gICAgICAgIFRSMV9VTk9SREVSRURfTUFQX1VTRV9UUjFfVU5PUkRFUkVEX01BUCkKLWNoZWNrX2N4eF9zb3VyY2VfY29tcGlsZXMoCi0gICAgICAgICIKLSAgICAgICAgI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0gICAgICAgIGludCBtYWluKCkgewotICAgICAgICBzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDxpbnQsIGludD4gbTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAiCi0gICAgICAgVFIxX1VOT1JERVJFRF9NQVBfVVNFX1VOT1JERVJFRF9NQVApCi0gICAgCi1zZXQgKFRSMV9VTk9SREVSRURfTUFQIC1OT1RGT1VORCkKLWlmIChUUjFfVU5PUkRFUkVEX01BUF9VU0VfVFIxX1VOT1JERVJFRF9NQVApCi1zZXQgKFRSMV9VTk9SREVSRURfTUFQX0ZPVU5EIFRSVUUpCi1lbmRpZiAoVFIxX1VOT1JERVJFRF9NQVBfVVNFX1RSMV9VTk9SREVSRURfTUFQKQotaWYgKFRSMV9VTk9SREVSRURfTUFQX1VTRV9VTk9SREVSRURfTUFQKQotc2V0IChUUjFfVU5PUkRFUkVEX01BUF9GT1VORCBUUlVFKQotZW5kaWYgKFRSMV9VTk9SREVSRURfTUFQX1VTRV9VTk9SREVSRURfTUFQKQotICAgCi1tYXJrX2FzX2FkdmFuY2VkIChUUjFfVU5PUkRFUkVEX01BUF9GT1VORCkKLW1hcmtfYXNfYWR2YW5jZWQgKFRSMV9VTk9SREVSRURfTUFQX1VTRV9UUjFfVU5PUkRFUkVEX01BUCkKLW1hcmtfYXNfYWR2YW5jZWQgKFRSMV9VTk9SREVSRURfTUFQX1VTRV9VTk9SREVSRURfTUFQKQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL2NtYWtlL1NSTEJvb3N0LmNtYWtlIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9jbWFrZS9TUkxCb29zdC5jbWFrZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzYTk1Ni4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL2NtYWtlL1NSTEJvb3N0LmNtYWtlCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotI0xvY2F0ZSBCb29zdCBsaWJzLiBXaW5kb3dzIHVzZXJzOiBtYWtlIHN1cmUgQk9PU1RfUk9PVCBhbmQgQk9PU1RfUEFUSCBhcmUgc2V0IGNvcnJlY3RseSBvbiB5b3VyIGVudmlyb25tZW50LgotI1NlZSB0aGUgc2l0ZSBGQVEgZm9yIG1vcmUgZGV0YWlscy4KLQotTUFDUk8gKEdFVF9CT09TVF9JTkNMVURFX1BBVEggcGF0aCBsaWJzKQotICAjdG9kbzogYWxsb3cgdGhpcyB0byBmYWxsIGJhY2sgb24gYSBsb2NhbCBkaXN0cmlidXRlZCBjb3B5LCBzbyB1c2VyIGRvZXNuJ3QgaGF2ZSB0byBkL2wgQm9vc3Qgc2VwZXJhdGVseQotICAKLSAgI3RvZG86IGxpbWl0IEJvb3N0IHZlcnNpb24/Ci0gICN0b2RvOiB1c2UgQ09NUE9ORU5UUyB0aHJlYWRzIHRvIGxvY2F0ZSBib29zdF90aHJlYWRzIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGN1cnJlbnQgc3VwcG9ydAotICBJRihCb29zdF9GT1VORCkKLSAgICBJRiAoTk9UIF9ib29zdF9JTl9DQUNIRSkKLSAgICAgIE1FU1NBR0UoICJCb29zdCBmb3VuZCIgKQotICAgICAgbWVzc2FnZShTVEFUVVMgIkJvb3N0X0lOQ0xVREVfRElSICAgIDogJHtCb29zdF9JTkNMVURFX0RJUn0iKQotICAgIEVORElGIChOT1QgX2Jvb3N0X0lOX0NBQ0hFKQotICAgIFNFVCgke3BhdGh9ICR7Qm9vc3RfSU5DTFVERV9ESVJTfSApCi0JU0VUKCR7bGlic30gJHtCb29zdF9MSUJSQVJJRVN9ICkKLQlsaW5rX2RpcmVjdG9yaWVzICggJHtCb29zdF9MSUJSQVJZX0RJUlN9ICkKLSAgRUxTRSgpCi0gICAgTUVTU0FHRShGQVRBTF9FUlJPUiAiQm9vc3Qgbm90IGZvdW5kLCBwbGVhc2Ugc2V0IHRoZSBCT09TVF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlICIgKQotICBFTkRJRigpCi1FTkRNQUNSTyAoR0VUX0JPT1NUX0lOQ0xVREVfUEFUSCBwYXRoIGxpYnMpCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvY29uZmlnLmd1ZXNzIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9jb25maWcuZ3Vlc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzMjA3OWEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9jb25maWcuZ3Vlc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTI2ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCi0jICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOAotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDgtMDEtMjMnCi0KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSMgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLQotIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPHBlckBib3RobmVyLmNvbT4uCi0jIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAotIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCi0jCi0jIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KLSMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCi0jIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgotIwotIyBUaGUgcGxhbiBpcyB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBieSBjb25maWd1cmUgc2NyaXB0cyBpZiB5b3UKLSMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBidWlsZCBzeXN0ZW0gdHlwZS4KLQotbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCi0KLXVzYWdlPSJcCi1Vc2FnZTogJDAgW09QVElPTl0KLQotT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgotCi1PcGVyYXRpb24gbW9kZXM6Ci0gIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0Ci0gIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0Ci0KLVJlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCi0KLXZlcnNpb249IlwKLUdOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCi0KLU9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCi13YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCi0KLWhlbHA9IgotVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0jIFBhcnNlIGNvbW1hbmQgbGluZQotd2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCi0gIGNhc2UgJDEgaW4KLSAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQotICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OwotICAgIC0tdmVyc2lvbiB8IC12ICkKLSAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7Ci0gICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCi0gICAgICAgc2hpZnQ7IGJyZWFrIDs7Ci0gICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgotICAgICAgIGJyZWFrIDs7Ci0gICAgLSogKQotICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCi0gICAgICAgZXhpdCAxIDs7Ci0gICAgKiApCi0gICAgICAgYnJlYWsgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0ICQjICE9IDA7IHRoZW4KLSAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCi0gIGV4aXQgMQotZmkKLQotdHJhcCAnZXhpdCAxJyAxIDIgMTUKLQotIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYQotIyBjb21waWxlciB0byBhaWQgaW4gc3lzdGVtIGRldGVjdGlvbiBpcyBkaXNjb3VyYWdlZCBhcyBpdCByZXF1aXJlcwotIyB0ZW1wb3JhcnkgZmlsZXMgdG8gYmUgY3JlYXRlZCBhbmQsIGFzIHlvdSBjYW4gc2VlIGJlbG93LCBpdCBpcyBhCi0jIGhlYWRhY2hlIHRvIGRlYWwgd2l0aCBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCi0KLSMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKLSMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KLQotIyBQb3J0YWJsZSB0bXAgZGlyZWN0b3J5IGNyZWF0aW9uIGluc3BpcmVkIGJ5IHRoZSBBdXRvY29uZiB0ZWFtLgotCi1zZXRfY2NfZm9yX2J1aWxkPScKLXRyYXAgImV4aXRjb2RlPVwkPzsgKHJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsKSAmJiBleGl0IFwkZXhpdGNvZGUiIDAgOwotdHJhcCAicm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGw7IGV4aXQgMSIgMSAyIDEzIDE1IDsKLTogJHtUTVBESVI9L3RtcH0gOwotIHsgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiJFRNUERJUi9jZ1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJiB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIiA7IH0gfHwKLSB7IHRlc3QgLW4gIiRSQU5ET00iICYmIHRtcD0kVE1QRElSL2NnJCQtJFJBTkRPTSAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApIDsgfSB8fAotIHsgdG1wPSRUTVBESVIvY2ctJCQgJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSAmJiBlY2hvICJXYXJuaW5nOiBjcmVhdGluZyBpbnNlY3VyZSB0ZW1wIGRpcmVjdG9yeSIgPiYyIDsgfSB8fAotIHsgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIgOyBleGl0IDEgOyB9IDsKLWR1bW15PSR0bXAvZHVtbXkgOwotdG1wZmlsZXM9IiRkdW1teS5jICRkdW1teS5vICRkdW1teS5yZWwgJGR1bW15IiA7Ci1jYXNlICRDQ19GT1JfQlVJTEQsJEhPU1RfQ0MsJENDIGluCi0gLCwpICAgIGVjaG8gImludCB4OyIgPiAkZHVtbXkuYyA7Ci0JZm9yIGMgaW4gY2MgZ2NjIGM4OSBjOTkgOyBkbwotCSAgaWYgKCRjIC1jIC1vICRkdW1teS5vICRkdW1teS5jKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JICAgICBDQ19GT1JfQlVJTEQ9IiRjIjsgYnJlYWsgOwotCSAgZmkgOwotCWRvbmUgOwotCWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHggOyB0aGVuCi0JICBDQ19GT1JfQlVJTEQ9bm9fY29tcGlsZXJfZm91bmQgOwotCWZpCi0JOzsKLSAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OwotICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKLWVzYWMgOyBzZXRfY2NfZm9yX2J1aWxkPSA7JwotCi0jIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgotIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCi1pZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAotZmkKLQotVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCi1VTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KLVVOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCi1VTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KLQotIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgotCi1jYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCi0gICAgKjpOZXRCU0Q6KjoqKQotCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCi0JIyBtb3JlIG9mIHRoZSB0dXBwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAotCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5Ci0JIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCi0JIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAotCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgotCSMKLQkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKLQkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KLQlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCi0JVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm1lYikgbWFjaGluZT1hcm1lYi11bmtub3duIDs7Ci0JICAgIGFybSopIG1hY2hpbmU9YXJtLXVua25vd24gOzsKLQkgICAgc2gzZWwpIG1hY2hpbmU9c2hsLXVua25vd24gOzsKLQkgICAgc2gzZWIpIG1hY2hpbmU9c2gtdW5rbm93biA7OwotCSAgICBzaDVlbCkgbWFjaGluZT1zaDVsZS11bmtub3duIDs7Ci0JICAgICopIG1hY2hpbmU9JHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24gOzsKLQllc2FjCi0JIyBUaGUgT3BlcmF0aW5nIFN5c3RlbSBpbmNsdWRpbmcgb2JqZWN0IGZvcm1hdCwgaWYgaXQgaGFzIHN3aXRjaGVkCi0JIyB0byBFTEYgcmVjZW50bHksIG9yIHdpbGwgaW4gdGhlIGZ1dHVyZS4KLQljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCi0JICAgIGFybSp8aTM4NnxtNjhrfG5zMzJrfHNoMyp8c3BhcmN8dmF4KQotCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCWlmIGVjaG8gX19FTEZfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCi0JCQl8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsCi0JCXRoZW4KLQkJICAgICMgT25jZSBhbGwgdXRpbGl0aWVzIGNhbiBiZSBFQ09GRiAobmV0YnNkZWNvZmYpIG9yIGEub3V0IChuZXRic2Rhb3V0KS4KLQkJICAgICMgUmV0dXJuIG5ldGJzZCBmb3IgZWl0aGVyLiAgRklYPwotCQkgICAgb3M9bmV0YnNkCi0JCWVsc2UKLQkJICAgIG9zPW5ldGJzZGVsZgotCQlmaQotCQk7OwotCSAgICAqKQotCSAgICAgICAgb3M9bmV0YnNkCi0JCTs7Ci0JZXNhYwotCSMgVGhlIE9TIHJlbGVhc2UKLQkjIERlYmlhbiBHTlUvTmV0QlNEIG1hY2hpbmVzIGhhdmUgYSBkaWZmZXJlbnQgdXNlcmxhbmQsIGFuZAotCSMgdGh1cywgbmVlZCBhIGRpc3RpbmN0IHRyaXBsZXQuIEhvd2V2ZXIsIHRoZXkgZG8gbm90IG5lZWQKLQkjIGtlcm5lbCB2ZXJzaW9uIGluZm9ybWF0aW9uLCBzbyBpdCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhCi0JIyBzdWl0YWJsZSB0YWcsIGluIHRoZSBzdHlsZSBvZiBsaW51eC1nbnUuCi0JY2FzZSAiJHtVTkFNRV9WRVJTSU9OfSIgaW4KLQkgICAgRGViaWFuKikKLQkJcmVsZWFzZT0nLWdudScKLQkJOzsKLQkgICAgKikKLQkJcmVsZWFzZT1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQkJOzsKLQllc2FjCi0JIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06Ci0JIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06Ci0JIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgotCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgotCWV4aXQgOzsKLSAgICAqOk9wZW5CU0Q6KjoqKQotCVVOQU1FX01BQ0hJTkVfQVJDSD1gYXJjaCB8IHNlZCAncy9PcGVuQlNELi8vJ2AKLQllY2hvICR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6ZWtrb0JTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZWtrb2JzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpTb2xpZEJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc29saWRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG1hY3BwYzpNaXJCU0Q6KjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpNaXJCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgYWxwaGE6T1NGMToqOiopCi0JY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgotCSo0LjApCi0JCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JCTs7Ci0JKjUuKikKLQkgICAgICAgIFVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQ0fSdgCi0JCTs7Ci0JZXNhYwotCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCi0JIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKLQkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCi0JIyB0eXBlcyB0aHJvdWdoIGhlYWQgLW4gMSwgc28gd2Ugb25seSBkZXRlY3QgdGhlIHR5cGUgb2YgQ1BVIDAuCi0JQUxQSEFfQ1BVX1RZUEU9YC91c3Ivc2Jpbi9wc3JpbmZvIC12IHwgc2VkIC1uIC1lICdzL14gIFRoZSBhbHBoYSBcKC4qXCkgcHJvY2Vzc29yLiokL1wxL3AnIHwgaGVhZCAtbiAxYAotCWNhc2UgIiRBTFBIQV9DUFVfVFlQRSIgaW4KLQkgICAgIkVWNCAoMjEwNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7Ci0JICAgICJFVjQuNSAoMjEwNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7Ci0JICAgICJMQ0E0ICgyMTA2Ni8yMTA2OCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkVWNSAoMjExNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiIDs7Ci0JICAgICJFVjUuNiAoMjExNjRBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIgOzsKLQkgICAgIkVWNS42ICgyMTE2NFBDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiIDs7Ci0JICAgICJFVjUuNyAoMjExNjRQQykiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU3IiA7OwotCSAgICAiRVY2ICgyMTI2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIgOzsKLQkgICAgIkVWNi43ICgyMTI2NEEpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IiA7OwotCSAgICAiRVY2LjhDQiAoMjEyNjRDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKLQkgICAgIkVWNi44QUwgKDIxMjY0QikiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7Ci0JICAgICJFVjYuOENYICgyMTI2NEQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OwotCSAgICAiRVY2LjlBICgyMTI2NC9FVjY5QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjkiIDs7Ci0JICAgICJFVjcgKDIxMzY0KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3IiA7OwotCSAgICAiRVY3LjkgKDIxMzY0QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7Ci0JZXNhYwotCSMgQSBQbi5uIHZlcnNpb24gaXMgYSBwYXRjaGVkIHZlcnNpb24uCi0JIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCi0JIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KLQkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KLQkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltQVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlleGl0IDs7Ci0gICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKLQkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/Ci0JIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCi0JIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/Ci0JZWNobyBhbHBoYS1wYy1pbnRlcml4Ci0JZXhpdCA7OwotICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKLQllY2hvIGFscGhhLWRlYy13aW5udDMuNQotCWV4aXQgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstdW5rbm93bi1zeXN2NAotCWV4aXQgOzsKLSAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKLQlleGl0IDs7Ci0gICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCi0JZXhpdCA7OwotICAgICo6T1MvMzkwOio6KikKLQllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCi0JZXhpdCA7OwotICAgICo6ei9WTToqOiopCi0JZWNobyBzMzkwLWlibS16dm1vZQotCWV4aXQgOzsKLSAgICAqOk9TNDAwOio6KikKLSAgICAgICAgZWNobyBwb3dlcnBjLWlibS1vczQwMAotCWV4aXQgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBhcm06cmlzY29zOio6Knxhcm06UklTQ09TOio6KikKLQllY2hvIGFybS11bmtub3duLXJpc2NvcwotCWV4aXQgOzsKLSAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQotCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKLQlleGl0IDs7Ci0gICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCi0JIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KLQlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCi0JZWxzZQotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKLQlmaQotCWV4aXQgOzsKLSAgICBOSUxFKjoqOio6ZGNvc3gpCi0JZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAotCWV4aXQgOzsKLSAgICBEUlM/NjAwMDp1bml4OjQuMDo2KikKLQllY2hvIHNwYXJjLWljbC1ueDYKLQlleGl0IDs7Ci0gICAgRFJTPzYwMDA6VU5JWF9TVjo0LjIqOjcqIHwgRFJTPzYwMDA6aXNpczo0LjIqOjcqKQotCWNhc2UgYC91c3IvYmluL3VuYW1lIC1wYCBpbgotCSAgICBzcGFyYykgZWNobyBzcGFyYy1pY2wtbng3OyBleGl0IDs7Ci0JZXNhYyA7OwotICAgIHN1bjRIOlN1bk9TOjUuKjoqKQotCWVjaG8gc3BhcmMtaGFsLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgaTg2cGM6U3VuT1M6NS4qOiogfCBpODZ4ZW46U3VuT1M6NS4qOiopCi0JZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgIHN1bjQqOlN1bk9TOjYqOiopCi0JIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKLQkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAotCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDs7Ci0gICAgc3VuMyo6U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIHN1bio6Kjo0LjJCU0Q6KikKLQlVTkFNRV9SRUxFQVNFPWAoc2VkIDFxIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAotCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKLQljYXNlICJgL2Jpbi9hcmNoYCIgaW4KLQkgICAgc3VuMykKLQkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQkgICAgc3VuNCkKLQkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JZXNhYwotCWV4aXQgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCi0gICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90Ci0gICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgotICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKLSAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQotICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90Ci0gICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCi0gICAgIyBiZSBubyBwcm9ibGVtLgotICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCA7OwotICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgbTY4azptYWNodGVuOio6KikKLQllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgcG93ZXJwYzptYWNodGVuOio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUklTQyo6TWFjaDoqOiopCi0JZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMwotCWV4aXQgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBWQVgqOlVMVFJJWCo6KjoqKQotCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIDIwMjA6Q0xJWDoqOiogfCAyNDMwOkNMSVg6KjoqKQotCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmCi0JICBkdW1teWFyZz1gZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCAmJgotCSAgU1lTVEVNX05BTUU9YCRkdW1teSAkZHVtbXlhcmdgICYmCi0JICAgIHsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQotCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAotCWV4aXQgOzsKLSAgICBNb3Rvcm9sYToqOjQuMzpQTDgtKikKLQllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4Ci0JZXhpdCA7OwotICAgIE5pZ2h0X0hhd2s6KjoqOlBvd2VyTUFYX09TIHwgU3luZXJneTpQb3dlck1BWF9PUzoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAotCWV4aXQgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCA7OwotICAgIG04OGs6Q1gvVVg6Nyo6KikKLQllY2hvIG04OGstaGFycmlzLWN4dXg3Ci0JZXhpdCA7OwotICAgIG04OGs6Kjo0KjpSNCopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0Ci0JZXhpdCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCA7OwotICAgIEFWaWlPTjpkZ3V4Oio6KikKLSAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKLSAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKLQlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCi0JdGhlbgotCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKLQkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KLQkgICAgdGhlbgotCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQkgICAgZWxzZQotCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KLQkgICAgZmkKLQllbHNlCi0JICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gCWV4aXQgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCA7OwotICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQotCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKLQlleGl0IDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCA7OwotICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KLQllY2hvIHJvbXAtaWJtLWFpeCAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgOzsgICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpKjg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDs7Ci0gICAgaWE2NDpBSVg6KjoqKQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgOzsKLSAgICAqOkFJWDoyOjMpCi0JaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+Ci0KLQkJbWFpbigpCi0JCQl7Ci0JCQlpZiAoIV9fcG93ZXJfcGMoKSkKLQkJCQlleGl0KDEpOwotCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKLQkJCWV4aXQoMCk7Ci0JCQl9Ci1FT0YKLQkJaWYgJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAKLQkJdGhlbgotCQkJZWNobyAiJFNZU1RFTV9OQU1FIgotCQllbHNlCi0JCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKLQkJZmkKLQllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKLQllbHNlCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKLQlmaQotCWV4aXQgOzsKLSAgICAqOkFJWDoqOls0NTZdKQotCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAotCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fQVJDSD1yczYwMDAKLQllbHNlCi0JCUlCTV9BUkNIPXBvd2VycGMKLQlmaQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDs7Ci0gICAgKjpBSVg6KjoqKQotCWVjaG8gcnM2MDAwLWlibS1haXgKLQlleGl0IDs7Ci0gICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCi0JZWNobyByb21wLWlibS1ic2Q0LjQKLQlleGl0IDs7Ci0gICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKLQllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCi0JZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKLSAgICAqOkJPU1g6KjoqKQotCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgOzsKLSAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQotCWVjaG8gbTY4ay1idWxsLXN5c3YzCi0JZXhpdCA7OwotICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKLQllY2hvIG02OGstaHAtYnNkCi0JZXhpdCA7OwotICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCi0JZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgOzsKLSAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCi0JSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7Ci0JICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKLQkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCi0JCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCi0JCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgotICAgICAgICAgICAgICAgICAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAotICAgICAgICAgICAgICAgICAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQotICAgICAgICAgICAgICAgICAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OwotCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCi0gICAgICAgICAgICAgICAgICAgICAgICBlc2FjIDs7Ci0gICAgICAgICAgICAgICAgICAgIGVzYWMKLQkJZmkKLQkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCi0JCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCSAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+JGR1bW15LmMKLQotICAgICAgICAgICAgICAjZGVmaW5lIF9IUFVYX1NPVVJDRQotICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KLQotICAgICAgICAgICAgICBpbnQgbWFpbiAoKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotCi0gICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkKLSAgICAgICAgICAgICAgCXsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOgotICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCi0gICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKQotICAgICAgICAgICAgICAJCXsKLSAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOwotICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJCX0gYnJlYWs7Ci0gICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCi0gICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICNlbmRpZgotICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICBleGl0ICgwKTsKLSAgICAgICAgICAgICAgfQotRU9GCi0JCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAotCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQotCQlmaSA7OwotCWVzYWMKLQlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KLQl0aGVuCi0JICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQotCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZwotCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKLQkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKLQkgICAgIwotCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCi0JICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCi0JICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCi0JICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMwotCi0JICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKLQkJZ3JlcCBfX0xQNjRfXyA+L2Rldi9udWxsCi0JICAgIHRoZW4KLQkJSFBfQVJDSD0iaHBwYTIuMHciCi0JICAgIGVsc2UKLQkJSFBfQVJDSD0iaHBwYTY0IgotCSAgICBmaQotCWZpCi0JZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgOzsKLSAgICBpYTY0OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQllY2hvIGlhNjQtaHAtaHB1eCR7SFBVWF9SRVZ9Ci0JZXhpdCA7OwotICAgIDMwNTAqOkhJLVVYOio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0JaW50Ci0JbWFpbiAoKQotCXsKLQkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLQkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCi0JICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAotCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCi0JICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGNwdSkKLQkJewotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCi0JICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGV4aXQgKDApOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCi0JCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQotCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKLQlleGl0IDs7Ci0gICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1ic2QKLQlleGl0IDs7Ci0gICAgOTAwMC84Pz86NC4zYnNkOio6KikKLQllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCA7OwotICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKLQllY2hvIGhwcGExLjAtaHAtbXBlaXgKLQlleGl0IDs7Ci0gICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCi0JZWNobyBocHBhMS4xLWhwLW9zZgotCWV4aXQgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCA7OwotICAgIGkqODY6T1NGMToqOiopCi0JaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKLQllbHNlCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKLQlmaQotCWV4aXQgOzsKLSAgICBwYXJpc2MqOkxpdGVzKjoqOiopCi0JZWNobyBocHBhMS4xLWhwLWxpdGVzCi0JZXhpdCA7OwotICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgOzsKLSAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLSAgICAgICAgZXhpdCA7OwotICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgOzsKLSAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCi0JZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDs7Ci0gICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCA7OwotICAgIENSQVkqWS1NUDoqOio6KikKLQllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAotCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgQ1JBWSpUUzoqOio6KikKLQllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKlQzRToqOio6KikKLQllY2hvIGFscGhhZXY1LWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgQ1JBWSpTVjE6KjoqOiopCi0JZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgKjpVTklDT1MvbXA6KjoqKQotCWVjaG8gY3JheW52LWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCi0JRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLSAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAotICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAotICAgICAgICBlY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotICAgICAgICBleGl0IDs7Ci0gICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLQlleGl0IDs7Ci0gICAgaSo4NjpCU0QvMzg2Oio6KiB8IGkqODY6QlNEL09TOio6KiB8ICo6QXNjZW5kXCBFbWJlZGRlZC9PUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIHNwYXJjKjpCU0QvT1M6KjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOkJTRC9PUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpGcmVlQlNEOio6KikKLQljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KLQkgICAgcGM5OCkKLQkJZWNobyBpMzg2LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKLQkgICAgYW1kNjQpCi0JCWVjaG8geDg2XzY0LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKLQkgICAgKikKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKLQllc2FjCi0JZXhpdCA7OwotICAgIGkqOkNZR1dJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCi0JZXhpdCA7OwotICAgICo6TUlOR1cqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKLQlleGl0IDs7Ci0gICAgaSo6d2luZG93czMyKjoqKQotICAgIAkjIHVuYW1lIC1tIGluY2x1ZGVzICItcGMiIG9uIHRoaXMgc3lzdGVtLgotICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tbWluZ3czMgotCWV4aXQgOzsKLSAgICBpKjpQVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgotCWV4aXQgOzsKLSAgICAqOkludGVyaXgqOlszNDU2XSopCi0gICAgCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgotCSAgICB4ODYpCi0JCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQotCQlleGl0IDs7Ci0JICAgIEVNNjRUIHwgYXV0aGVudGljYW1kKQotCQllY2hvIHg4Nl82NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9Ci0JCWV4aXQgOzsKLQkgICAgSUE2NCkKLQkJZWNobyBpYTY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KLQkJZXhpdCA7OwotCWVzYWMgOzsKLSAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCi0JZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKLQlleGl0IDs7Ci0gICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCi0JIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPwotCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCi0JIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PwotCWVjaG8gaTU4Ni1wYy1pbnRlcml4Ci0JZXhpdCA7OwotICAgIGkqOlVXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KLQlleGl0IDs7Ci0gICAgYW1kNjQ6Q1lHV0lOKjoqOiogfCB4ODZfNjQ6Q1lHV0lOKjoqOiopCi0JZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KLQlleGl0IDs7Ci0gICAgcCo6Q1lHV0lOKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCi0JZXhpdCA7OwotICAgIHByZXAqOlN1bk9TOjUuKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgKjpHTlU6KjoqKQotCSMgdGhlIEdOVSBzeXN0ZW0KLQllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKLQlleGl0IDs7Ci0gICAgKjpHTlUvKjoqOiopCi0JIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC1nbnUKLQlleGl0IDs7Ci0gICAgaSo4NjpNaW5peDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4Ci0JZXhpdCA7OwotICAgIGFybSo6TGludXg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlpZiBlY2hvIF9fQVJNX0VBQklfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCi0JICAgIHwgZ3JlcCAtcSBfX0FSTV9FQUJJX18KLQl0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251ZWFiaQotCWZpCi0JZXhpdCA7OwotICAgIGF2cjMyKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGNyaXM6TGludXg6KjoqKQotCWVjaG8gY3Jpcy1heGlzLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBjcmlzdjMyOkxpbnV4Oio6KikKLQllY2hvIGNyaXN2MzItYXhpcy1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgZnJ2OkxpbnV4Oio6KikKLSAgICAJZWNobyBmcnYtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgaWE2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIG0zMnIqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgbTY4KjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIG1pcHM6TGludXg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSN1bmRlZiBDUFUKLQkjdW5kZWYgbWlwcwotCSN1bmRlZiBtaXBzZWwKLQkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQotCUNQVT1taXBzZWwKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCi0JQ1BVPW1pcHMKLQkjZWxzZQotCUNQVT0KLQkjZW5kaWYKLQkjZW5kaWYKLUVPRgotCWV2YWwgImAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgc2VkIC1uICcKLQkgICAgL15DUFUvewotCQlzOiA6OmcKLQkJcAotCSAgICB9J2AiCi0JdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KLQk7OwotICAgIG1pcHM2NDpMaW51eDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI3VuZGVmIENQVQotCSN1bmRlZiBtaXBzNjQKLQkjdW5kZWYgbWlwczY0ZWwKLQkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQotCUNQVT1taXBzNjRlbAotCSNlbHNlCi0JI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKLQlDUFU9bWlwczY0Ci0JI2Vsc2UKLQlDUFU9Ci0JI2VuZGlmCi0JI2VuZGlmCi1FT0YKLQlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCi0JICAgIC9eQ1BVL3sKLQkJczogOjpnCi0JCXAKLQkgICAgfSdgIgotCXRlc3QgeCIke0NQVX0iICE9IHggJiYgeyBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiOyBleGl0OyB9Ci0JOzsKLSAgICBvcjMyOkxpbnV4Oio6KikKLQllY2hvIG9yMzItdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgcHBjOkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgcHBjNjQ6TGludXg6KjoqKQotCWVjaG8gcG93ZXJwYzY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGFscGhhOkxpbnV4Oio6KikKLQljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgotCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKLQkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OwotCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OwotCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OwotCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKLQkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OwotCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7Ci0gICAgICAgIGVzYWMKLQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIGxkLnNvLjEgPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQotCWV4aXQgOzsKLSAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCi0JIyBMb29rIGZvciBDUFUgbGV2ZWwKLQljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgotCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7Ci0JICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKLQkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OwotCWVzYWMKLQlleGl0IDs7Ci0gICAgcGFyaXNjNjQ6TGludXg6KjoqIHwgaHBwYTY0OkxpbnV4Oio6KikKLQllY2hvIGhwcGE2NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4Ci0JZXhpdCA7OwotICAgIHNoNjQqOkxpbnV4Oio6KikKLSAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHNoKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICB2YXg6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHg4Nl82NDpMaW51eDoqOiopCi0JZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgeHRlbnNhKjpMaW51eDoqOiopCi0gICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBpKjg2OkxpbnV4Oio6KikKLQkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbwotCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKLQkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCi0JIyBTZXQgTENfQUxMPUMgdG8gZW5zdXJlIGxkIG91dHB1dHMgbWVzc2FnZXMgaW4gRW5nbGlzaC4KLQlsZF9zdXBwb3J0ZWRfdGFyZ2V0cz1gY2QgLzsgTENfQUxMPUMgbGQgLS1oZWxwIDI+JjEgXAotCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCB0YXJnZXRzOi8hZAotCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKLQkJCQkgICAgcy8uKnN1cHBvcnRlZCB0YXJnZXRzOiAqLy8KLQkJCQkgICAgcy8gLiovLwotCQkJCSAgICBwJ2AKLSAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF90YXJnZXRzIiBpbgotCSAgZWxmMzItaTM4NikKLQkJVEVOVEFUSVZFPSIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudSIKLQkJOzsKLQkgIGEub3V0LWkzODYtbGludXgpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKLQkJZXhpdCA7OwotCSAgY29mZi1pMzg2KQotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiCi0JCWV4aXQgOzsKLQkgICIiKQotCQkjIEVpdGhlciBhIHByZS1CRkQgYS5vdXQgbGlua2VyIChsaW51eC1nbnVvbGRsZCkgb3IKLQkJIyBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251b2xkbGQiCi0JCWV4aXQgOzsKLQllc2FjCi0JIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLQkjaWZkZWYgX19FTEZfXwotCSMgaWZkZWYgX19HTElCQ19fCi0JIyAgaWYgX19HTElCQ19fID49IDIKLQlMSUJDPWdudQotCSMgIGVsc2UKLQlMSUJDPWdudWxpYmMxCi0JIyAgZW5kaWYKLQkjIGVsc2UKLQlMSUJDPWdudWxpYmMxCi0JIyBlbmRpZgotCSNlbHNlCi0JI2lmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgfHwgZGVmaW5lZChfX1BHSSkgfHwgZGVmaW5lZChfX1NVTlBST19DKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKQotCUxJQkM9Z251Ci0JI2Vsc2UKLQlMSUJDPWdudWFvdXQKLQkjZW5kaWYKLQkjZW5kaWYKLQkjaWZkZWYgX19kaWV0bGliY19fCi0JTElCQz1kaWV0bGliYwotCSNlbmRpZgotRU9GCi0JZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJwotCSAgICAvXkxJQkMvewotCQlzOiA6OmcKLQkJcAotCSAgICB9J2AiCi0JdGVzdCB4IiR7TElCQ30iICE9IHggJiYgewotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iCi0JCWV4aXQKLQl9Ci0JdGVzdCB4IiR7VEVOVEFUSVZFfSIgIT0geCAmJiB7IGVjaG8gIiR7VEVOVEFUSVZFfSI7IGV4aXQ7IH0KLQk7OwotICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCi0JIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KLQkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCi0JIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KLQllY2hvIGkzODYtc2VxdWVudC1zeXN2NAotCWV4aXQgOzsKLSAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQotICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCi0gICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KLSAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAotCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KLSAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDs7Ci0gICAgaSo4NjpPUy8yOio6KikKLQkjIElmIHdlIHdlcmUgYWJsZSB0byBmaW5kIGB1bmFtZScsIHRoZW4gRU1YIFVuaXggY29tcGF0aWJpbGl0eQotCSMgaXMgcHJvYmFibHkgaW5zdGFsbGVkLgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1vczItZW14Ci0JZXhpdCA7OwotICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAotCWV4aXQgOzsKLSAgICBpKjg2OmF0aGVvczoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYXRoZW9zCi0JZXhpdCA7OwotICAgIGkqODY6c3lsbGFibGU6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeWxsYWJsZQotCWV4aXQgOzsKLSAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKLQllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIGkqODY6KkRPUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zZG9zZGpncHAKLQlleGl0IDs7Ci0gICAgaSo4NjoqOjQuKjoqIHwgaSo4NjpTWVNURU1fVjo0Lio6KikKLQlVTkFNRV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAncy9cL01QJC8vJ2AKLQlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9Ci0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMfQotCWZpCi0JZXhpdCA7OwotICAgIGkqODY6Kjo1Ols2NzhdKikKLSAgICAJIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIGFuZCBPcGVuU2VydmVyIDYuCi0JY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KLQkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7Ci0JICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OwotCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OwotCWVzYWMKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDs7Ci0gICAgaSo4NjoqOjMuMjoqKQotCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KLQkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAotCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCi0JCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2Ci0JCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDs7Ci0gICAgcGM6KjoqOiopCi0JIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6Ci0gICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0gICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCi0JZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKLSAgICAgICAgZXhpdCA7OwotICAgIEludGVsOk1hY2g6Myo6KikKLQllY2hvIGkzODYtcGMtbWFjaDMKLQlleGl0IDs7Ci0gICAgcGFyYWdvbjoqOio6KikKLQllY2hvIGk4NjAtaW50ZWwtb3NmMQotCWV4aXQgOzsKLSAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0Ci0JaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKLQllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCi0JICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAotCWZpCi0JZXhpdCA7OwotICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKLQkjICJtaW5pZnJhbWUiCi0JZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2Ci0JZXhpdCA7OwotICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKLQllY2hvIG02OGstY29udmVyZ2VudC1zeXN2Ci0JZXhpdCA7OwotICAgIE02ODA/MDpELU5JWDo1LjM6KikKLQllY2hvIG02OGstZGlhYi1kbml4Ci0JZXhpdCA7OwotICAgIE02OCo6KjpSM1ZbNTY3OF0qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIHsgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JzsgZXhpdDsgfSA7OwotICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQotCU9TX1JFTD0nJwotCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAotCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0JICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAotCSAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKLSAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKLSAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0gICAgICAgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0OyBleGl0OyB9IDs7Ci0gICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCi0JZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCi0JZWNobyBtNjhrLWF0YXJpLXN5c3Y0Ci0JZXhpdCA7OwotICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIHJzNjAwMDpMeW54T1M6Mi4qOiopCi0JZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC4wKjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU01bQkVdUzpVTklYX1NWOio6KikKLQllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFJNKjpSZWxpYW50VU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCA7OwotICAgIFJNKjpTSU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCA7OwotICAgICo6U0lOSVgtKjoqOiopCi0JaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAotCWVsc2UKLQkJZWNobyBuczMyay1zbmktc3lzdgotCWZpCi0JZXhpdCA7OwotICAgIFBFTlRJVU06Kjo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgotICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0Ci0gICAgICAgIGV4aXQgOzsKLSAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKLQkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCi0JIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKLQlleGl0IDs7Ci0gICAgKjoqOio6RlRYKikKLQkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KLQllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAotCWV4aXQgOzsKLSAgICBpKjg2OlZPUzoqOiopCi0JIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXN0cmF0dXMtdm9zCi0JZXhpdCA7OwotICAgICo6Vk9TOio6KikKLQkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KLQllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKLQlleGl0IDs7Ci0gICAgbWM2OCo6QS9VWDoqOiopCi0JZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbmV3cyo6TkVXUy1PUzo2KjoqKQotCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDs7Ci0gICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCi0JaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCi0JICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotICAgICAgICBleGl0IDs7Ci0gICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgotCWVjaG8gcG93ZXJwYy1iZS1iZW9zCi0JZXhpdCA7OwotICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYXBwbGUtYmVvcwotCWV4aXQgOzsKLSAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgotCWVjaG8gaTU4Ni1wYy1iZW9zCi0JZXhpdCA7OwotICAgIFNYLTQ6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTWC01OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU1gtNjpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFNYLTc6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTWC04OlNVUEVSLVVYOio6KikKLQllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU1gtOFI6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6UmhhcHNvZHk6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpEYXJ3aW46KjoqKQotCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCi0JY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCi0JICAgIHVua25vd24pIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjIDs7Ci0JZXNhYwotCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LWFwcGxlLWRhcndpbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCi0JVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKLQlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCi0JCVVOQU1FX1BST0NFU1NPUj1pMzg2Ci0JCVVOQU1FX01BQ0hJTkU9cGMKLQlmaQotCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpRTlg6Kjo0KikKLQllY2hvIGkzODYtcGMtcW54Ci0JZXhpdCA7OwotICAgIE5TRS0/Ok5PTlNUT1BfS0VSTkVMOio6KikKLQllY2hvIG5zZS10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCi0JZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpOb25TdG9wLVVYOio6KikKLQllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAotCWV4aXQgOzsKLSAgICBCUzIwMDA6UE9TSVgqOio6KikKLQllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKLQlleGl0IDs7Ci0gICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpQbGFuOToqOiopCi0JIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2Ci0JIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKLQkjIG9wZXJhdGluZyBzeXN0ZW1zLgotCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCi0JICAgIFVOQU1FX01BQ0hJTkU9aTM4NgotCWVsc2UKLQkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCi0JZmkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQotCWV4aXQgOzsKLSAgICAqOlRPUFMtMTA6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMTAKLQlleGl0IDs7Ci0gICAgKjpURU5FWDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRlbmV4Ci0JZXhpdCA7OwotICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC1kZWMtdG9wczIwCi0JZXhpdCA7OwotICAgIFhLTC0xOlRPUFMtMjA6KjoqIHwgVFlQRTU6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC14a2wtdG9wczIwCi0JZXhpdCA7OwotICAgICo6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAotCWV4aXQgOzsKLSAgICAqOklUUzoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLWl0cwotCWV4aXQgOzsKLSAgICBTRUk6KjoqOlNFSVVYKQotICAgICAgICBlY2hvIG1pcHMtc2VpLXNlaXV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOkRyYWdvbkZseToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZHJhZ29uZmx5YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAotCWV4aXQgOzsKLSAgICAqOipWTVM6KjoqKQotICAgIAlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCi0JICAgIEEqKSBlY2hvIGFscGhhLWRlYy12bXMgOyBleGl0IDs7Ci0JICAgIEkqKSBlY2hvIGlhNjQtZGVjLXZtcyA7IGV4aXQgOzsKLQkgICAgViopIGVjaG8gdmF4LWRlYy12bXMgOyBleGl0IDs7Ci0JZXNhYyA7OwotICAgICo6WEVOSVg6KjpTeXNWKQotCWVjaG8gaTM4Ni1wYy14ZW5peAotCWV4aXQgOzsKLSAgICBpKjg2OnNreW9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2t5b3NgZWNobyAke1VOQU1FX1JFTEVBU0V9YCB8IHNlZCAtZSAncy8gLiokLy8nCi0JZXhpdCA7OwotICAgIGkqODY6cmRvczoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXJkb3MKLQlleGl0IDs7Ci1lc2FjCi0KLSNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgotI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgotCi1ldmFsICRzZXRfY2NfZm9yX2J1aWxkCi1jYXQgPiRkdW1teS5jIDw8RU9GCi0jaWZkZWYgX1NFUVVFTlRfCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2VuZGlmCi1tYWluICgpCi17Ci0jaWYgZGVmaW5lZCAoc29ueSkKLSNpZiBkZWZpbmVkIChNSVBTRUIpCi0gIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCi0gICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCi0gIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0gIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKLSNpZmRlZiBORVdTT1M0Ci0gICAgICAgICAgIjQiCi0jZWxzZQotCSAgIiIKLSNlbmRpZgotICAgICAgICAgKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKLSAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCi0gIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE5lWFQpCi0jaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCi0jZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCi0jZW5kaWYKLSAgaW50IHZlcnNpb247Ci0gIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKLSAgaWYgKHZlcnNpb24gPCA0KQotICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKLSNpZiBkZWZpbmVkIChVTUFYVikKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoQ01VKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX18zODZCU0RfXykKLSAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc2VxdWVudCkKLSNpZiBkZWZpbmVkIChpMzg2KQotICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKG5zMzIwMDApCi0gIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCi0gICAgc3RydWN0IHV0c25hbWUgdW47Ci0KLSAgICB1bmFtZSgmdW4pOwotCi0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgewotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCi0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOwotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHZheCkKLSMgaWYgIWRlZmluZWQgKHVsdHJpeCkKLSMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgaWYgZGVmaW5lZCAoQlNEKQotIyAgIGlmIEJTRCA9PSA0MwotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKLSMgICBlbHNlCi0jICAgIGlmIEJTRCA9PSAxOTkwMDYKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOwotIyAgICBlbHNlCi0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbHNlCi0gICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSMgIGVuZGlmCi0jIGVsc2UKLSAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQotICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotICBleGl0ICgxKTsKLX0KLUVPRgotCi0kQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgotCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQotCi0jIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCi0KLXRlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdDsgfQotCi0jIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCi0KLWlmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCi10aGVuCi0gICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KLSAgICBjMSopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIGMyKikKLQlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKLQl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKLQllbHNlIGVjaG8gYzItY29udmV4LWJzZAotCWZpCi0JZXhpdCA7OwotICAgIGMzNCopCi0JZWNobyBjMzQtY29udmV4LWJzZAotCWV4aXQgOzsKLSAgICBjMzgqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLQlleGl0IDs7Ci0gICAgYzQqKQotCWVjaG8gYzQtY29udmV4LWJzZAotCWV4aXQgOzsKLSAgICBlc2FjCi1maQotCi1jYXQgPiYyIDw8RU9GCi0kMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCi0KLVRoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCi10aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Ci1kb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KLQotICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKLWFuZAotICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECi0KLUlmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQotc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKLXBlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCi1pbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCi0KLWNvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCi0KLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAotL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAotCi1ob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAotL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAotL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCi0KLVVOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9Ci1VTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQotVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQotVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KLUVPRgotCi1leGl0IDEKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9jb25maWcuaC5pbiBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvY29uZmlnLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjhiM2UuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9jb25maWcuaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwotI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX05BTUUKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL2NvbmZpZy5zdWIgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL2NvbmZpZy5zdWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3NTk4MjUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9jb25maWcuc3ViCisrKyAvZGV2L251bGwKQEAgLTEsMTY1OCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCi0jICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOAotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDgtMDEtMTYnCi0KLSMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgotIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCi0jIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0jIDAyMTEwLTEzMDEsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCi0jIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KLSMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCi0jIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCi0KLSMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCi0jIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcwotIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgotIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucwotIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKLSMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcwotIyBjb25maWd1cmF0aW9uLgotCi0jIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgotIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQotIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQotIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCi0KLW1lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAotCi11c2FnZT0iXAotVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKLSAgICAgICAkMCBbT1BUSU9OXSBBTElBUwotCi1DYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCi0KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCi13YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCi0KLWhlbHA9IgotVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0jIFBhcnNlIGNvbW1hbmQgbGluZQotd2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCi0gIGNhc2UgJDEgaW4KLSAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQotICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OwotICAgIC0tdmVyc2lvbiB8IC12ICkKLSAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7Ci0gICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCi0gICAgICAgc2hpZnQ7IGJyZWFrIDs7Ci0gICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgotICAgICAgIGJyZWFrIDs7Ci0gICAgLSogKQotICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKLSAgICAgICBleGl0IDEgOzsKLQotICAgICpsb2NhbCopCi0gICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCi0gICAgICAgZWNobyAkMQotICAgICAgIGV4aXQgOzsKLQotICAgICogKQotICAgICAgIGJyZWFrIDs7Ci0gIGVzYWMKLWRvbmUKLQotY2FzZSAkIyBpbgotIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotIDEpIDs7Ci0gKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCi0gICAgZXhpdCAxOzsKLWVzYWMKLQotIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgotIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KLW1heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAotY2FzZSAkbWF5YmVfb3MgaW4KLSAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgbGludXgtdWNsaWJjKiB8IFwKLSAgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAotICBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCi0gICAgb3M9LSRtYXliZV9vcwotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCi0gICAgOzsKLSAgKikKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCi0gICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCi0gICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAotICAgIGVsc2Ugb3M9OyBmaQotICAgIDs7Ci1lc2FjCi0KLSMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbwotIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KLSMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKLSMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgotY2FzZSAkb3MgaW4KLQktc3VuKm9zKikKLQkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCi0JCTs7Ci0JLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKLQktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKLQktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAotCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCi0JLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKLQktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKLQktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5KQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zY291dCkKLQkJOzsKLQktd3JzKQotCQlvcz0tdnh3b3JrcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLWNob3J1c29zKikKLQkJb3M9LWNob3J1c29zCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLSAJLWNob3J1c3JkYikKLSAJCW9zPS1jaG9ydXNyZGIKLQkJYmFzaWNfbWFjaGluZT0kMQotIAkJOzsKLQktaGl1eCopCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JLXNjbzYpCi0JCW9zPS1zY281djYKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY281KQotCQlvcz0tc2NvMy4ydjUKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY280KQotCQlvcz0tc2NvMy4ydjQKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjIuWzQtOV0qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4ydls0LTldKikKLQkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY281djYqKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbyopCi0JCW9zPS1zY28zLjJ2MgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXVkayopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCopCi0JCW9zPS1seW54b3MKLQkJOzsKLQktcHR4KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCi0JCTs7Ci0JLXdpbmRvd3NudCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKLQkJOzsKLQktcHNvcyopCi0JCW9zPS1wc29zCi0JCTs7Ci0JLW1pbnQgfCAtbWludFswLTldKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCi0JIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KLQkxNzUwYSB8IDU4MCBcCi0JfCBhMjlrIFwKLQl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFldjZbNzhdIHwgYWxwaGFwY2E1WzY3XSBcCi0JfCBhbHBoYTY0IHwgYWxwaGE2NGV2WzQtOF0gfCBhbHBoYTY0ZXY1NiB8IGFscGhhNjRldjZbNzhdIHwgYWxwaGE2NHBjYTVbNjddIFwKLQl8IGFtMzNfMi4wIFwKLQl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciB8IGF2cjMyIFwKLQl8IGJmaW4gXAotCXwgYzR4IHwgY2xpcHBlciBcCi0JfCBkMTB2IHwgZDMwdiB8IGRseCB8IGRzcDE2eHggXAotCXwgZmlkbyB8IGZyMzAgfCBmcnYgXAotCXwgaDgzMDAgfCBoODUwMCB8IGhwcGEgfCBocHBhMS5bMDFdIHwgaHBwYTIuMCB8IGhwcGEyLjBbbnddIHwgaHBwYTY0IFwKLQl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAotCXwgaXAyayB8IGlxMjAwMCBcCi0JfCBtMzJjIHwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIFwKLQl8IG1heHEgfCBtYiB8IG1pY3JvYmxhemUgfCBtY29yZSB8IG1lcCBcCi0JfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKLQl8IG1pcHMxNiBcCi0JfCBtaXBzNjQgfCBtaXBzNjRlbCBcCi0JfCBtaXBzNjR2ciB8IG1pcHM2NHZyZWwgXAotCXwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKLQl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKLQl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKLQl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKLQl8IG1pcHM2NHZyNTkwMCB8IG1pcHM2NHZyNTkwMGVsIFwKLQl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKLQl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCi0JfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCi0JfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAotCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAotCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKLQl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCi0JfCBtbjEwMjAwIHwgbW4xMDMwMCBcCi0JfCBtdCBcCi0JfCBtc3A0MzAgXAotCXwgbmlvcyB8IG5pb3MyIFwKLQl8IG5zMTZrIHwgbnMzMmsgXAotCXwgb3IzMiBcCi0JfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAotCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAotCXwgcHlyYW1pZCBcCi0JfCBzY29yZSBcCi0JfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAotCXwgc2g2NCB8IHNoNjRsZSBcCi0JfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCi0JfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAotCXwgc3B1IHwgc3Ryb25nYXJtIFwKLQl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCi0JfCB2ODUwIHwgdjg1MGUgXAotCXwgd2UzMmsgXAotCXwgeDg2IHwgeGMxNnggfCB4c2NhbGUgfCB4c2NhbGVlW2JsXSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCi0JfCB6OGspCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMikKLQkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQlvcz0tbm9uZQotCQk7OwotCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQotCQk7OwotCW1zMSkKLQkJYmFzaWNfbWFjaGluZT1tdC11bmtub3duCi0JCTs7Ci0KLQkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJwotCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAotCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KLQlpKjg2IHwgeDg2XzY0KQotCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYwotCSAgOzsKLQkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgotCSotKi0qKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KLQk1ODAtKiBcCi0JfCBhMjlrLSogXAotCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCi0JfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAotCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCi0JfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybWViLSogfCBhcm12Ki0qIFwKLQl8IGF2ci0qIHwgYXZyMzItKiBcCi0JfCBiZmluLSogfCBiczIwMDAtKiBcCi0JfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiB8IGM1NHgtKiB8IGM1NXgtKiB8IGM2eC0qIFwKLQl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCi0JfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCi0JfCBlbHhzaS0qIFwKLQl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKLQl8IGg4MzAwLSogfCBoODUwMC0qIFwKLQl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCi0JfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAotCXwgaXAyay0qIHwgaXEyMDAwLSogXAotCXwgbTMyYy0qIHwgbTMyci0qIHwgbTMycmxlLSogXAotCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKLQl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWF4cS0qIHwgbWNvcmUtKiBcCi0JfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCi0JfCBtaXBzMTYtKiBcCi0JfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAotCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCi0JfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKLQl8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCi0JfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAotCXwgbWlwczY0dnI1MDAwLSogfCBtaXBzNjR2cjUwMDBlbC0qIFwKLQl8IG1pcHM2NHZyNTkwMC0qIHwgbWlwczY0dnI1OTAwZWwtKiBcCi0JfCBtaXBzaXNhMzItKiB8IG1pcHNpc2EzMmVsLSogXAotCXwgbWlwc2lzYTMycjItKiB8IG1pcHNpc2EzMnIyZWwtKiBcCi0JfCBtaXBzaXNhNjQtKiB8IG1pcHNpc2E2NGVsLSogXAotCXwgbWlwc2lzYTY0cjItKiB8IG1pcHNpc2E2NHIyZWwtKiBcCi0JfCBtaXBzaXNhNjRzYjEtKiB8IG1pcHNpc2E2NHNiMWVsLSogXAotCXwgbWlwc2lzYTY0c3I3MWstKiB8IG1pcHNpc2E2NHNyNzFrZWwtKiBcCi0JfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKLQl8IG1taXgtKiBcCi0JfCBtdC0qIFwKLQl8IG1zcDQzMC0qIFwKLQl8IG5pb3MtKiB8IG5pb3MyLSogXAotCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCi0JfCBvcmlvbi0qIFwKLQl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAotCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogfCBwcGNiZS0qIFwKLQl8IHB5cmFtaWQtKiBcCi0JfCByb21wLSogfCByczYwMDAtKiBcCi0JfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzIzXWUtKiB8IHNoWzM0XWViLSogfCBzaGViLSogfCBzaGJlLSogXAotCXwgc2hsZS0qIHwgc2hbMTIzNF1sZS0qIHwgc2gzZWxlLSogfCBzaDY0LSogfCBzaDY0bGUtKiBcCi0JfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM2NGItKiB8IHNwYXJjNjR2LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiBcCi0JfCBzcGFyY2xpdGUtKiBcCi0JfCBzcGFyY3Y4LSogfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3BhcmN2OXYtKiB8IHN0cm9uZ2FybS0qIHwgc3YxLSogfCBzeD8tKiBcCi0JfCB0YWhvZS0qIHwgdGh1bWItKiBcCi0JfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiBcCi0JfCB0cm9uLSogXAotCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKLQl8IHdlMzJrLSogXAotCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCi0JfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYSotKiBcCi0JfCB5bXAtKiBcCi0JfCB6OGstKikKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLCB3aXRoIGdsb2IgbWF0Y2guCi0JeHRlbnNhKikKLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAotCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCi0JMzg2YnNkKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tYnNkCi0JCTs7Ci0JM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAotCQk7OwotCTNiKikKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlhMjlraGlmKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLSAgICAJYWJhY3VzKQotCQliYXNpY19tYWNoaW5lPWFiYWN1cy11bmtub3duCi0JCTs7Ci0JYWRvYmU2OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCi0JCW9zPS1zY291dAotCQk7OwotCWFsbGlhbnQgfCBmeDgwKQotCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAotCQk7OwotCWFsdG9zIHwgYWx0b3MzMDY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKLQkJOzsKLQlhbTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKLQkJb3M9LWJzZAotCQk7OwotCWFtZDY0KQotCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYwotCQk7OwotCWFtZDY0LSopCi0JCWJhc2ljX21hY2hpbmU9eDg2XzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JYW1kYWhsKQotCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKLQkJb3M9LXN5c3YKLQkJOzsKLQlhbWlnYSB8IGFtaWdhLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCTs7Ci0JYW1pZ2FvcyB8IGFtaWdhZG9zKQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQlvcz0tYW1pZ2FvcwotCQk7OwotCWFtaWdhdW5peCB8IGFtaXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1zeXN2NAotCQk7OwotCWFwb2xsbzY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYXBvbGxvNjhic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LWJzZAotCQk7OwotCWF1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCW9zPS1hdXgKLQkJOzsKLQliYWxhbmNlKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKLQkJb3M9LWR5bml4Ci0JCTs7Ci0JYmxhY2tmaW4pCi0JCWJhc2ljX21hY2hpbmU9YmZpbi11bmtub3duCi0JCW9zPS1saW51eAotCQk7OwotCWJsYWNrZmluLSopCi0JCWJhc2ljX21hY2hpbmU9YmZpbi1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQlvcz0tbGludXgKLQkJOzsKLQljOTApCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCBqOTApCi0JCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyYXludikKLQkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQotCQlvcz0tdW5pY29zbXAKLQkJOzsKLQljcjE2KQotCQliYXNpY19tYWNoaW5lPWNyMTYtdW5rbm93bgotCQlvcz0tZWxmCi0JCTs7Ci0JY3JkcyB8IHVub3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCi0JCTs7Ci0JY3Jpc3YzMiB8IGNyaXN2MzItKiB8IGV0cmF4ZnMqKQotCQliYXNpY19tYWNoaW5lPWNyaXN2MzItYXhpcwotCQk7OwotCWNyaXMgfCBjcmlzLSogfCBldHJheCopCi0JCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCi0JCTs7Ci0JY3J4KQotCQliYXNpY19tYWNoaW5lPWNyeC11bmtub3duCi0JCW9zPS1lbGYKLQkJOzsKLQlkYTMwIHwgZGEzMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAotCQk7OwotCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKLQkJYmFzaWNfbWFjaGluZT1taXBzLWRlYwotCQk7OwotCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMxMAotCQk7OwotCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMyMAotCQk7OwotCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCi0JICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQotCQk7OwotCWRlbHRhODgpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQotCQlvcz0tc3lzdjMKLQkJOzsKLQlkamdwcCkKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCi0JCW9zPS1tc2Rvc2RqZ3BwCi0JCTs7Ci0JZHB4MjAgfCBkcHgyMC0qKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCi0JCW9zPS1ib3N4Ci0JCTs7Ci0JZHB4MiogfCBkcHgyKi1idWxsKQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjMKLQkJOzsKLQllYm1vbjI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tZWJtb24KLQkJOzsKLQllbHhzaSkKLQkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQotCQlvcz0tYnNkCi0JCTs7Ci0JZW5jb3JlIHwgdW1heCB8IG1tYXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCi0JCTs7Ci0JZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQotCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCWZ4MjgwMCkKLQkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKLQkJOzsKLQlnZW5peCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1ucwotCQk7OwotCWdtaWNybykKLQkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybwotCQlvcz0tc3lzdgotCQk7OwotCWdvMzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tZ28zMgotCQk7OwotCWgzMDUwciogfCBoaXV4KikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQloODMwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloODMwMHhyYXkpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0teHJheQotCQk7OwotCWg4NTAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWhhcnJpcykKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tc3lzdjMKLQkJOzsKLQlocDMwMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDMwMGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ic2QKLQkJOzsKLQlocDMwMGhwdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0taHB1eAotCQk7OwotCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAotCQk7OwotCWhwOWszWzItOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHBwYS1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0JaHBwYW9zZikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1vc2YKLQkJOzsKLQlocHBybykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlpMzcwLWlibSogfCBpYm0qKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCTs7Ci0jIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KLQlpKjg2djMyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YzMgotCQk7OwotCWkqODZ2NCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjQKLQkJOzsKLQlpKjg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaSo4NnNvbDIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlpMzg2bWFjaCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKLQkJb3M9LW1hY2gKLQkJOzsKLQlpMzg2LXZzdGEgfCB2c3RhKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tdnN0YQotCQk7OwotCWlyaXMgfCBpcmlzNGQpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1pcml4KikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LWlyaXg0Ci0JCQk7OwotCQllc2FjCi0JCTs7Ci0JaXNpNjggfCBpc2kpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKLQkJb3M9LXN5c3YKLQkJOzsKLQltNjhrbm9tbXUpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1saW51eAotCQk7OwotCW02OGtub21tdS0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWluZ3czMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1taW5ndzMyCi0JCTs7Ci0JbWluZ3czMmNlKQotCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCi0JCW9zPS1taW5ndzMyY2UKLQkJOzsKLQltaW5pZnJhbWUpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKLQkJOzsKLQkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci0JbWlwczMqLSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCi0JCTs7Ci0JbWlwczMqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCi0JCTs7Ci0JbW9uaXRvcikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCW1vcnBob3MpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JCW9zPS1tb3JwaG9zCi0JCTs7Ci0JbXNkb3MpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tbXNkb3MKLQkJOzsKLQltczEtKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9tczEtL210LS8nYAotCQk7OwotCW12cykKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQlvcz0tbXZzCi0JCTs7Ci0JbmNyMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgotCQlvcz0tc3lzdjQKLQkJOzsKLQluZXRic2QzODYpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1uZXRic2QKLQkJOzsKLQluZXR3aW5kZXIpCi0JCWJhc2ljX21hY2hpbmU9YXJtdjRsLXJlYmVsCi0JCW9zPS1saW51eAotCQk7OwotCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzMTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmVjdjcwKQotCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQluZXh0IHwgbSotbmV4dCApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0Ci0JCWNhc2UgJG9zIGluCi0JCSAgICAtbmV4dHN0ZXAqICkKLQkJCTs7Ci0JCSAgICAtbnMyKikKLQkJICAgICAgb3M9LW5leHRzdGVwMgotCQkJOzsKLQkJICAgICopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDMKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQluaDMwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaFs0NV0wMDApCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaW5keTk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1uaW5keQotCQk7OwotCW1vbjk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1tb245NjAKLQkJOzsKLQlub25zdG9wdXgpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1jb21wYXEKLQkJb3M9LW5vbnN0b3B1eAotCQk7OwotCW5wMSkKLQkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKLQkJOzsKLQluc3ItdGFuZGVtKQotCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KLQkJOzsKLQlvcDUwbi0qIHwgb3A2MGMtKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0Jb3BlbnJpc2MgfCBvcGVucmlzYy0qKQotCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgotCQk7OwotCW9zNDAwKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCi0JCW9zPS1vczQwMAotCQk7OwotCU9TRTY4MDAwIHwgb3NlNjgwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlvczY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKLQkJb3M9LW9zNjhrCi0JCTs7Ci0JcGEtaGl0YWNoaSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQlwYXJhZ29uKQotCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKLQkJb3M9LW9zZgotCQk7OwotCXBhcmlzYykKLQkJYmFzaWNfbWFjaGluZT1ocHBhLXVua25vd24KLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JcGFyaXNjLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQlvcz0tbGludXgKLQkJOzsKLQlwYmQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCi0JCTs7Ci0JcGJiKQotCQliYXNpY19tYWNoaW5lPW02OGstdHRpCi0JCTs7Ci0JcGM1MzIgfCBwYzUzMi0qKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCi0JCTs7Ci0JcGM5OCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCTs7Ci0JcGM5OC0qKQotCQliYXNpY19tYWNoaW5lPWkzODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1wYwotCQk7OwotCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW00KQotCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKLQkJOzsKLQlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bTQtKikKLQkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcG4pCi0JCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKLQkJOzsKLQlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JCTs7Ci0JcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCi0JCTs7Ci0JcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgotCQk7OwotCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCi0JCTs7Ci0JcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwczIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KLQkJOzsKLQlwdzMyKQotCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgotCQlvcz0tcHczMgotCQk7OwotCXJkb3MpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tcmRvcwotCQk7OwotCXJvbTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCXJtWzQ2XTAwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwotCQk7OwotCXJ0cGMgfCBydHBjLSopCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlzMzkwIHwgczM5MC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCi0JCTs7Ci0JczM5MHggfCBzMzkweC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQotCQk7OwotCXNhMjkyMDApCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXNiMSkKLQkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgotCQk7OwotCXNiMWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KLQkJOzsKLQlzZGUpCi0JCWJhc2ljX21hY2hpbmU9bWlwc2lzYTMyLXNkZQotCQlvcz0tZWxmCi0JCTs7Ci0Jc2VpKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2VpCi0JCW9zPS1zZWl1eAotCQk7OwotCXNlcXVlbnQpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCTs7Ci0Jc2gpCi0JCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0Jc2g1ZWwpCi0JCWJhc2ljX21hY2hpbmU9c2g1bGUtdW5rbm93bgotCQk7OwotCXNoNjQpCi0JCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCi0JCTs7Ci0Jc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKLQkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jc3BzNykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YyCi0JCTs7Ci0Jc3B1cikKLQkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KLQkJOzsKLQlzdDIwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KLQkJOzsKLQlzdHJhdHVzKQotCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cwotCQlvcz0tc3lzdjQKLQkJOzsKLQlzdW4yKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJOzsKLQlzdW4yb3MzKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjJvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuM29zMykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuM29zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNG9zMykKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjRvczQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40c29sMikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0Jc3VuMyB8IHN1bjMtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQk7OwotCXN1bjQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0Jc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KLQkJOzsKLQlzdjEpCi0JCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXN5bW1ldHJ5KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQl0M2UpCi0JCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdDkwKQotCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0aWM1NHggfCBjNTR4KikKLQkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCXRpYzU1eCB8IGM1NXgqKQotCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JdGljNnggfCBjNngqKQotCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KLQkJb3M9LWNvZmYKLQkJOzsKLQl0aWxlKikKLQkJYmFzaWNfbWFjaGluZT10aWxlLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCXR4MzkpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgotCQk7OwotCXR4MzllbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KLQkJOzsKLQl0b2FkMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKLQkJb3M9LXRvcHMyMAotCQk7OwotCXRvd2VyIHwgdG93ZXItMzIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKLQkJOzsKLQl0cGYpCi0JCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCi0JCW9zPS10cGYKLQkJOzsKLQl1ZGkyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXVsdHJhMykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQotCQlvcz0tc3ltMQotCQk7OwotCXY4MTAgfCBuZWN2ODEwKQotCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCi0JCW9zPS1ub25lCi0JCTs7Ci0JdmF4dikKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0Jdm1zKQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXZtcwotCQk7OwotCXZwcCp8dnh8dngtKikKLQkJYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKLQkJOzsKLQl2eHdvcmtzOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczY4KQotCQliYXNpY19tYWNoaW5lPW02OGstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXc2NSopCi0JCWJhc2ljX21hY2hpbmU9dzY1LXdkYwotCQlvcz0tbm9uZQotCQk7OwotCXc4OWstKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJb3M9LXByb2VsZgotCQk7OwotCXhib3gpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQlvcz0tbWluZ3czMgotCQk7OwotCXhwcyB8IHhwczEwMCkKLQkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCi0JCTs7Ci0JeW1wKQotCQliYXNpY19tYWNoaW5lPXltcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl6OGstKi1jb2ZmKQotCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCi0JCW9zPS1zaW0KLQkJOzsKLQlub25lKQotCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQotCQlvcz0tbm9uZQotCQk7OwotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCi0jIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCi0Jdzg5aykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJOzsKLQlvcDUwbikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCW9wNjBjKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jcm9tcCkKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCW1taXgpCi0JCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAotCQk7OwotCXJzNjAwMCkKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCi0JCTs7Ci0JdmF4KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJOzsKLQlwZHAxMCkKLQkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAotCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KLQkJOzsKLQlwZHAxMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKLQkJOzsKLQl3ZTMyaykKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFszNF1lYiB8IHNoWzEyMzRdbGUgfCBzaFsyM11lbGUpCi0JCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgotCQk7OwotCXNwYXJjIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCWN5ZHJhKQotCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKLQkJOzsKLQlvcmlvbikKLQkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKLQkJOzsKLQlvcmlvbjEwNSkKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAotCQk7OwotCW1hYyB8IG1wdyB8IG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQk7OwotCXBtYWMgfCBwbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCi0JCTs7Ci0JKi11bmtub3duKQotCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgotCQk7OwotCSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLQotIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1kaWdpdGFsKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCi0JCTs7Ci0JKi1jb21tb2RvcmUqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAotCQk7OwotCSopCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1pZiBbIHgiJG9zIiAhPSB4IiIgXQotdGhlbgotY2FzZSAkb3MgaW4KLSAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKLSAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KLQkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KLQktc29sYXJpczEgfCAtc29sYXJpczEuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAotCQk7OwotCS1zb2xhcmlzKQotCQlvcz0tc29sYXJpczIKLQkJOzsKLQktc3ZyNCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS11bml4d2FyZSopCi0JCW9zPS1zeXN2NC4ydXcKLQkJOzsKLQktZ251L2xpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgotCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCi0JIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCi0JLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAotCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCi0JICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKLQkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKLQkgICAgICB8IC1hb3MqIFwKLQkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAotCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAotCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIFwKLQkgICAgICB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAotCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAotCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKLQkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCi0JICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCi0JICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogXAotCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKLQkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtdWNsaWJjKiBcCi0JICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAotCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCi0JICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCi0JICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCi0JICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAotCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAotCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KiBcCi0JICAgICAgfCAtc2t5b3MqIHwgLWhhaWt1KiB8IC1yZG9zKiB8IC10b3BwZXJzKiB8IC1kcm9wcyopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1xbngqKQotCQljYXNlICRiYXNpY19tYWNoaW5lIGluCi0JCSAgICB4ODYtKiB8IGkqODYtKikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LW50byRvcwotCQkJOzsKLQkJZXNhYwotCQk7OwotCS1udG8tcW54KikKLQkJOzsKLQktbnRvKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCi0JCTs7Ci0JLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAotCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQotCQk7OwotCS1tYWMqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCi0JCTs7Ci0JLWxpbnV4LWRpZXRsaWJjKQotCQlvcz0tbGludXgtZGlldGxpYmMKLQkJOzsKLQktbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JLXN1bm9zNSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKLQkJOzsKLQktc3Vub3M2KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAotCQk7OwotCS1vcGVuZWQqKQotCQlvcz0tb3BlbmVkaXRpb24KLQkJOzsKLSAgICAgICAgLW9zNDAwKikKLQkJb3M9LW9zNDAwCi0JCTs7Ci0JLXdpbmNlKikKLQkJb3M9LXdpbmNlCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS1hdGhlb3MqKQotCQlvcz0tYXRoZW9zCi0JCTs7Ci0JLXN5bGxhYmxlKikKLQkJb3M9LXN5bGxhYmxlCi0JCTs7Ci0JLTM4NmJzZCkKLQkJb3M9LWJzZAotCQk7OwotCS1jdGl4KiB8IC11dHMqKQotCQlvcz0tc3lzdgotCQk7OwotCS1ub3ZhKikKLQkJb3M9LXJ0bWstbm92YQotCQk7OwotCS1uczIgKQotCQlvcz0tbmV4dHN0ZXAyCi0JCTs7Ci0JLW5zayopCi0JCW9zPS1uc2sKLQkJOzsKLQkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCi0JLXNpbml4NS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAotCQk7OwotCS1zaW5peCopCi0JCW9zPS1zeXN2NAotCQk7OwotICAgICAgICAtdHBmKikKLQkJb3M9LXRwZgotCQk7OwotCS10cml0b24qKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktb3NzKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCS1zdnIzKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3lzdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCi0JLXN5c3YqKQotCQk7OwotCS1vc2UqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLWVzMTgwMCopCi0JCW9zPS1vc2UKLQkJOzsKLQkteGVuaXgpCi0JCW9zPS14ZW5peAotCQk7OwotCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JLWFyb3MqKQotCQlvcz0tYXJvcwotCQk7OwotCS1rYW9zKikKLQkJb3M9LWthb3MKLQkJOzsKLQktenZtb2UpCi0JCW9zPS16dm1vZQotCQk7OwotCS1ub25lKQotCQk7OwotCSopCi0JCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgotCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi1lbHNlCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KLSMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCi0jIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKLSMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKLSMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQotIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCi0jIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgotCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0gICAgICAgIHNjb3JlLSopCi0JCW9zPS1lbGYKLQkJOzsKLSAgICAgICAgc3B1LSopCi0JCW9zPS1lbGYKLQkJOzsKLQkqLWFjb3JuKQotCQlvcz0tcmlzY2l4MS4yCi0JCTs7Ci0JYXJtKi1yZWJlbCkKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JYXJtKi1zZW1pKQotCQlvcz0tYW91dAotCQk7OwotICAgICAgICBjNHgtKiB8IHRpYzR4LSopCi0gICAgICAgIAlvcz0tY29mZgotCQk7OwotCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KLQlwZHAxMC0qKQotCQlvcz0tdG9wczIwCi0JCTs7Ci0JcGRwMTEtKikKLQkJb3M9LW5vbmUKLQkJOzsKLQkqLWRlYyB8IHZheC0qKQotCQlvcz0tdWx0cml4NC4yCi0JCTs7Ci0JbTY4Ki1hcG9sbG8pCi0JCW9zPS1kb21haW4KLQkJOzsKLQlpMzg2LXN1bikKLQkJb3M9LXN1bm9zNC4wLjIKLQkJOzsKLQltNjgwMDAtc3VuKQotCQlvcz0tc3Vub3MzCi0JCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQotCQkjIGRlZmF1bHQuCi0JCSMgb3M9LXN1bm9zNAotCQk7OwotCW02OCotY2lzY28pCi0JCW9zPS1hb3V0Ci0JCTs7Ci0gICAgICAgIG1lcC0qKQotCQlvcz0tZWxmCi0JCTs7Ci0JbWlwcyotY2lzY28pCi0JCW9zPS1lbGYKLQkJOzsKLQltaXBzKi0qKQotCQlvcz0tZWxmCi0JCTs7Ci0Jb3IzMi0qKQotCQlvcz0tY29mZgotCQk7OwotCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCi0JCW9zPS1zeXN2MwotCQk7OwotCXNwYXJjLSogfCAqLXN1bikKLQkJb3M9LXN1bm9zNC4xLjEKLQkJOzsKLQkqLWJlKQotCQlvcz0tYmVvcwotCQk7OwotCSotaGFpa3UpCi0JCW9zPS1oYWlrdQotCQk7OwotCSotaWJtKQotCQlvcz0tYWl4Ci0JCTs7Ci0gICAgCSota251dGgpCi0JCW9zPS1tbWl4d2FyZQotCQk7OwotCSotd2VjKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi13aW5ib25kKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1va2kpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLWhwKQotCQlvcz0taHB1eAotCQk7OwotCSotaGl0YWNoaSkKLQkJb3M9LWhpdXgKLQkJOzsKLQlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1jYm0pCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JKi1kZykKLQkJb3M9LWRndXgKLQkJOzsKLQkqLWRvbHBoaW4pCi0JCW9zPS1zeXN2MwotCQk7OwotCW02OGstY2N1cikKLQkJb3M9LXJ0dQotCQk7OwotCW04OGstb21yb24qKQotCQlvcz0tbHVuYQotCQk7OwotCSotbmV4dCApCi0JCW9zPS1uZXh0c3RlcAotCQk7OwotCSotc2VxdWVudCkKLQkJb3M9LXB0eAotCQk7OwotCSotY3JkcykKLQkJb3M9LXVub3MKLQkJOzsKLQkqLW5zKQotCQlvcz0tZ2VuaXgKLQkJOzsKLQlpMzcwLSopCi0JCW9zPS1tdnMKLQkJOzsKLQkqLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLQkqLWdvdWxkKQotCQlvcz0tc3lzdgotCQk7OwotCSotaGlnaGxldmVsKQotCQlvcz0tYnNkCi0JCTs7Ci0JKi1lbmNvcmUpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLXNnaSkKLQkJb3M9LWlyaXgKLQkJOzsKLQkqLXNpZW1lbnMpCi0JCW9zPS1zeXN2NAotCQk7OwotCSotbWFzc2NvbXApCi0JCW9zPS1ydHUKLQkJOzsKLQlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCi0JCW9zPS11eHB2Ci0JCTs7Ci0JKi1yb202OGspCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi0qYnVnKQotCQlvcz0tY29mZgotCQk7OwotCSotYXBwbGUpCi0JCW9zPS1tYWNvcwotCQk7OwotCSotYXRhcmkqKQotCQlvcz0tbWludAotCQk7OwotCSopCi0JCW9zPS1ub25lCi0JCTs7Ci1lc2FjCi1maQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQotIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KLXZlbmRvcj11bmtub3duCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi11bmtub3duKQotCQljYXNlICRvcyBpbgotCQkJLXJpc2NpeCopCi0JCQkJdmVuZG9yPWFjb3JuCi0JCQkJOzsKLQkJCS1zdW5vcyopCi0JCQkJdmVuZG9yPXN1bgotCQkJCTs7Ci0JCQktYWl4KikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1iZW9zKikKLQkJCQl2ZW5kb3I9YmUKLQkJCQk7OwotCQkJLWhwdXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktbXBlaXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktaGl1eCopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLXVub3MqKQotCQkJCXZlbmRvcj1jcmRzCi0JCQkJOzsKLQkJCS1kZ3V4KikKLQkJCQl2ZW5kb3I9ZGcKLQkJCQk7OwotCQkJLWx1bmEqKQotCQkJCXZlbmRvcj1vbXJvbgotCQkJCTs7Ci0JCQktZ2VuaXgqKQotCQkJCXZlbmRvcj1ucwotCQkJCTs7Ci0JCQktbXZzKiB8IC1vcGVuZWQqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLW9zNDAwKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1wdHgqKQotCQkJCXZlbmRvcj1zZXF1ZW50Ci0JCQkJOzsKLQkJCS10cGYqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKLQkJCQl2ZW5kb3I9d3JzCi0JCQkJOzsKLQkJCS1hdXgqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktaG1zKikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktbXB3KiB8IC1tYWNvcyopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCi0JCQkJdmVuZG9yPWF0YXJpCi0JCQkJOzsKLQkJCS12b3MqKQotCQkJCXZlbmRvcj1zdHJhdHVzCi0JCQkJOzsKLQkJZXNhYwotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAotCQk7OwotZXNhYwotCi1lY2hvICRiYXNpY19tYWNoaW5lJG9zCi1leGl0Ci0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgotIyB0aW1lLXN0YW1wLWVuZDogIiciCi0jIEVuZDoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvY29uZmlndXJlIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkNWNhM2QuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9jb25maWd1cmUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL2NvbmZpZ3VyZS5hYyBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvY29uZmlndXJlLmFjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDY5NmQwLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvY29uZmlndXJlLmFjCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwgQ3JlYXRlZCBieSBBbmp1dGEgYXBwbGljYXRpb24gd2l6YXJkLgotCi1BQ19JTklUKG1naXphLCAxLjApCi0KLUFNX0lOSVRfQVVUT01BS0UoQUNfUEFDS0FHRV9OQU1FLCBBQ19QQUNLQUdFX1ZFUlNJT04pCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oKQotQU1fTUFJTlRBSU5FUl9NT0RFCi0KLUFDX0lTQ19QT1NJWAotQUNfUFJPR19DWFgKLUFNX1BST0dfQ0NfU1REQwotQUNfSEVBREVSX1NUREMKLQotCi0KLUFDX1BST0dfUkFOTElCCi1BTV9QUk9HX0xJQlRPT0wKLUFDX1BST0dfTElCVE9PTAotCi0KLQotCi1BQ19PVVRQVVQoWwotTWFrZWZpbGUKLXNyYy9NYWtlZmlsZQotc3JjL21rY2xzL01ha2VmaWxlCi1dKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9kZXBjb21wIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9kZXBjb21wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWY5NzM2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvZGVwY29tcAorKysgL2Rldi9udWxsCkBAIC0xLDU4OSArMCwwIEBACi0jISAvYmluL3NoCi0jIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKLQotc2NyaXB0dmVyc2lvbj0yMDA3LTAzLTI5LjAxCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0jIDAyMTEwLTEzMDEsIFVTQS4KLQotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IEFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+LgotCi1jYXNlICQxIGluCi0gICcnKQotICAgICBlY2hvICIkMDogTm8gY29tbWFuZC4gIFRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gICAgIGV4aXQgMTsKLSAgICAgOzsKLSAgLWggfCAtLWgqKQotICAgIGNhdCA8PFxFT0YKLVVzYWdlOiBkZXBjb21wIFstLWhlbHBdIFstLXZlcnNpb25dIFBST0dSQU0gW0FSR1NdCi0KLVJ1biBQUk9HUkFNUyBBUkdTIHRvIGNvbXBpbGUgYSBmaWxlLCBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcwotYXMgc2lkZS1lZmZlY3RzLgotCi1FbnZpcm9ubWVudCB2YXJpYWJsZXM6Ci0gIGRlcG1vZGUgICAgIERlcGVuZGVuY3kgdHJhY2tpbmcgbW9kZS4KLSAgc291cmNlICAgICAgU291cmNlIGZpbGUgcmVhZCBieSBgUFJPR1JBTVMgQVJHUycuCi0gIG9iamVjdCAgICAgIE9iamVjdCBmaWxlIG91dHB1dCBieSBgUFJPR1JBTVMgQVJHUycuCi0gIERFUERJUiAgICAgIGRpcmVjdG9yeSB3aGVyZSB0byBzdG9yZSBkZXBlbmRlbmNpZXMuCi0gIGRlcGZpbGUgICAgIERlcGVuZGVuY3kgZmlsZSB0byBvdXRwdXQuCi0gIHRtcGRlcGZpbGUgIFRlbXBvcmFyeSBmaWxlIHRvIHVzZSB3aGVuIG91dHB1dGluZyBkZXBlbmRlbmNpZXMuCi0gIGxpYnRvb2wgICAgIFdoZXRoZXIgbGlidG9vbCBpcyB1c2VkICh5ZXMvbm8pLgotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgotRU9GCi0gICAgZXhpdCAkPwotICAgIDs7Ci0gIC12IHwgLS12KikKLSAgICBlY2hvICJkZXBjb21wICRzY3JpcHR2ZXJzaW9uIgotICAgIGV4aXQgJD8KLSAgICA7OwotZXNhYwotCi1pZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KLSAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCi1kZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAotICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KLXRtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9Ci0KLXJtIC1mICIkdG1wZGVwZmlsZSIKLQotIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCi0jIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAotIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQotIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KLWlmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCi0gICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgotICBnY2NmbGFnPS1NCi0gIGRlcG1vZGU9Z2NjCi1maQotCi1pZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KLSAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KLSAgIGRhc2htZmxhZz0teE0KLSAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKLWZpCi0KLWNhc2UgIiRkZXBtb2RlIiBpbgotZ2NjMykKLSMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0Ci0jIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQotIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgotIyMgVW5mb3J0dW5hdGVseSwgRnJlZUJTRCBjODkgYWNjZXB0YW5jZSBvZiBmbGFncyBkZXBlbmRzIHVwb24KLSMjIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgb3JkZXI7IHNvIGFkZCB0aGUgZmxhZ3Mgd2hlcmUgdGhleQotIyMgYXBwZWFyIGluIGRlcGVuZDIuYW0uICBOb3RlIHRoYXQgdGhlIHNsb3dkb3duIGluY3VycmVkIGhlcmUKLSMjIGFmZmVjdHMgb25seSBjb25maWd1cmU6IGluIG1ha2VmaWxlcywgJUZBU1RERVAlIHNob3J0Y3V0cyB0aGlzLgotICBmb3IgYXJnCi0gIGRvCi0gICAgY2FzZSAkYXJnIGluCi0gICAgLWMpIHNldCBmbm9yZCAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIiAiJGFyZyIgOzsKLSAgICAqKSAgc2V0IGZub3JkICIkQCIgIiRhcmciIDs7Ci0gICAgZXNhYwotICAgIHNoaWZ0ICMgZm5vcmQKLSAgICBzaGlmdCAjICRhcmcKLSAgZG9uZQotICAiJEAiCi0gIHN0YXQ9JD8KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICAgZXhpdCAkc3RhdAotICBmaQotICBtdiAiJHRtcGRlcGZpbGUiICIkZGVwZmlsZSIKLSAgOzsKLQotZ2NjKQotIyMgVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBnZXQgZGVwZW5kZW5jeSBvdXRwdXQgZnJvbSBnY2MuICBIZXJlJ3MKLSMjIHdoeSB3ZSBwaWNrIHRoaXMgcmF0aGVyIG9ic2N1cmUgbWV0aG9kOgotIyMgLSBEb24ndCB3YW50IHRvIHVzZSAtTUQgYmVjYXVzZSB3ZSdkIGxpa2UgdGhlIGRlcGVuZGVuY2llcyB0byBlbmQKLSMjICAgdXAgaW4gYSBzdWJkaXIuICBIYXZpbmcgdG8gcmVuYW1lIGJ5IGhhbmQgaXMgdWdseS4KLSMjICAgKFdlIG1pZ2h0IGVuZCB1cCBkb2luZyB0aGlzIGFueXdheSB0byBzdXBwb3J0IG90aGVyIGNvbXBpbGVycy4pCi0jIyAtIFRoZSBERVBFTkRFTkNJRVNfT1VUUFVUIGVudmlyb25tZW50IHZhcmlhYmxlIG1ha2VzIGdjYyBhY3QgbGlrZQotIyMgICAtTU0sIG5vdCAtTSAoZGVzcGl0ZSB3aGF0IHRoZSBkb2NzIHNheSkuCi0jIyAtIFVzaW5nIC1NIGRpcmVjdGx5IG1lYW5zIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIHR3aWNlIChldmVuIHdvcnNlCi0jIyAgIHRoYW4gcmVuYW1pbmcpLgotICBpZiB0ZXN0IC16ICIkZ2NjZmxhZyI7IHRoZW4KLSAgICBnY2NmbGFnPS1NRCwKLSAgZmkKLSAgIiRAIiAtV3AsIiRnY2NmbGFnJHRtcGRlcGZpbGUiCi0gIHN0YXQ9JD8KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICAgZXhpdCAkc3RhdAotICBmaQotICBybSAtZiAiJGRlcGZpbGUiCi0gIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0gIGFscGhhPUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKLSMjIFRoZSBzZWNvbmQgLWUgZXhwcmVzc2lvbiBoYW5kbGVzIERPUy1zdHlsZSBmaWxlIG5hbWVzIHdpdGggZHJpdmUgbGV0dGVycy4KLSAgc2VkIC1lICdzL15bXjpdKjogLyAvJyBcCi0gICAgICAtZSAncy9eWyckYWxwaGEnXTpcL1teOl0qOiAvIC8nIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0jIyBUaGlzIG5leHQgcGllY2Ugb2YgbWFnaWMgYXZvaWRzIHRoZSBgZGVsZXRlZCBoZWFkZXIgZmlsZScgcHJvYmxlbS4KLSMjIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2hlbiBhIGhlYWRlciBmaWxlIHdoaWNoIGFwcGVhcnMgaW4gYSAuUCBmaWxlCi0jIyBpcyBkZWxldGVkLCB0aGUgZGVwZW5kZW5jeSBjYXVzZXMgbWFrZSB0byBkaWUgKGJlY2F1c2UgdGhlcmUgaXMKLSMjIHR5cGljYWxseSBubyB3YXkgdG8gcmVidWlsZCB0aGUgaGVhZGVyKS4gIFdlIGF2b2lkIHRoaXMgYnkgYWRkaW5nCi0jIyBkdW1teSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggaGVhZGVyIGZpbGUuICBUb28gYmFkIGdjYyBkb2Vzbid0IGRvCi0jIyB0aGlzIGZvciB1cyBkaXJlY3RseS4KLSAgdHIgJyAnICcKLScgPCAiJHRtcGRlcGZpbGUiIHwKLSMjIFNvbWUgdmVyc2lvbnMgb2YgZ2NjIHB1dCBhIHNwYWNlIGJlZm9yZSB0aGUgYDonLiAgT24gdGhlIHRoZW9yeQotIyMgdGhhdCB0aGUgc3BhY2UgbWVhbnMgc29tZXRoaW5nLCB3ZSBhZGQgYSBzcGFjZSB0byB0aGUgb3V0cHV0IGFzCi0jIyB3ZWxsLgotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotaHApCi0gICMgVGhpcyBjYXNlIGV4aXN0cyBvbmx5IHRvIGxldCBkZXBlbmQubTQgZG8gaXRzIHdvcmsuICBJdCB3b3JrcyBieQotICAjIGxvb2tpbmcgYXQgdGhlIHRleHQgb2YgdGhpcyBzY3JpcHQuICBUaGlzIGNhc2Ugd2lsbCBuZXZlciBiZSBydW4sCi0gICMgc2luY2UgaXQgaXMgY2hlY2tlZCBmb3IgYWJvdmUuCi0gIGV4aXQgMQotICA7OwotCi1zZ2kpCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgICIkQCIgIi1XcCwtTUR1cGRhdGUsJHRtcGRlcGZpbGUiCi0gIGVsc2UKLSAgICAiJEAiIC1NRHVwZGF0ZSAiJHRtcGRlcGZpbGUiCi0gIGZpCi0gIHN0YXQ9JD8KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICAgZXhpdCAkc3RhdAotICBmaQotICBybSAtZiAiJGRlcGZpbGUiCi0KLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuICAjIHllcywgdGhlIHNvdXJjZWZpbGUgZGVwZW5kIG9uIG90aGVyIGZpbGVzCi0gICAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLQotICAgICMgQ2xpcCBvZmYgdGhlIGluaXRpYWwgZWxlbWVudCAodGhlIGRlcGVuZGVudCkuICBEb24ndCB0cnkgdG8gYmUKLSAgICAjIGNsZXZlciBhbmQgcmVwbGFjZSB0aGlzIHdpdGggc2VkIGNvZGUsIGFzIElSSVggc2VkIHdvbid0IGhhbmRsZQotICAgICMgbGluZXMgd2l0aCBtb3JlIHRoYW4gYSBmaXhlZCBudW1iZXIgb2YgY2hhcmFjdGVycyAoNDA5NiBpbgotICAgICMgSVJJWCA2LjIgc2VkLCA4MTkyIGluIElSSVggNi41KS4gIFdlIGFsc28gcmVtb3ZlIGNvbW1lbnQgbGluZXM7Ci0gICAgIyB0aGUgSVJJWCBjYyBhZGRzIGNvbW1lbnRzIGxpa2UgYCM6ZmVjJyB0byB0aGUgZW5kIG9mIHRoZQotICAgICMgZGVwZW5kZW5jeSBsaW5lLgotICAgIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiBcCi0gICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIHwgXAotICAgIHRyICcKLScgJyAnID4+ICRkZXBmaWxlCi0gICAgZWNobyA+PiAkZGVwZmlsZQotCi0gICAgIyBUaGUgc2Vjb25kIHBhc3MgZ2VuZXJhdGVzIGEgZHVtbXkgZW50cnkgZm9yIGVhY2ggaGVhZGVyIGZpbGUuCi0gICAgdHIgJyAnICcKLScgPCAiJHRtcGRlcGZpbGUiIFwKLSAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyAtZSAncy8kLzovJyBcCi0gICA+PiAkZGVwZmlsZQotICBlbHNlCi0gICAgIyBUaGUgc291cmNlZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBkZXBlbmRlbmNpZXMsIHNvIGp1c3QKLSAgICAjIHN0b3JlIGEgZHVtbXkgY29tbWVudCBsaW5lLCB0byBhdm9pZCBlcnJvcnMgd2l0aCB0aGUgTWFrZWZpbGUKLSAgICAjICJpbmNsdWRlIGJhc2VuYW1lLlBsbyIgc2NoZW1lLgotICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCi0gIGZpCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotYWl4KQotICAjIFRoZSBDIGZvciBBSVggQ29tcGlsZXIgdXNlcyAtTSBhbmQgb3V0cHV0cyB0aGUgZGVwZW5kZW5jaWVzCi0gICMgaW4gYSAudSBmaWxlLiAgSW4gb2xkZXIgdmVyc2lvbnMsIHRoaXMgZmlsZSBhbHdheXMgbGl2ZXMgaW4gdGhlCi0gICMgY3VycmVudCBkaXJlY3RvcnkuICBBbHNvLCB0aGUgQUlYIGNvbXBpbGVyIHB1dHMgYCRvYmplY3Q6JyBhdCB0aGUKLSAgIyBzdGFydCBvZiBlYWNoIGxpbmU7ICRvYmplY3QgZG9lc24ndCBoYXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KLSAgIyBWZXJzaW9uIDYgdXNlcyB0aGUgZGlyZWN0b3J5IGluIGJvdGggY2FzZXMuCi0gIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCi0gIHRlc3QgIngkZGlyIiA9ICJ4JG9iamVjdCIgJiYgZGlyPQotICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS51Ci0gICAgdG1wZGVwZmlsZTI9JGJhc2UudQotICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS51Ci0gICAgIiRAIiAtV2MsLU0KLSAgZWxzZQotICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS51Ci0gICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLnUKLSAgICB0bXBkZXBmaWxlMz0kZGlyJGJhc2UudQotICAgICIkQCIgLU0KLSAgZmkKLSAgc3RhdD0kPwotCi0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0KLSAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIKLSAgZG8KLSAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKLSAgZG9uZQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KLSAgICAjIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybSBgZm9vLm86IGRlcGVuZGVudC5oJy4KLSAgICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bwotICAgICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KLSAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KLSAgICBzZWQgLWUgJ3MsXi4qXC5bYS16XSo6WwkgXSosLCcgLWUgJ3MsJCw6LCcgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWljYykKLSAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCi0gICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYwotICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKLSAgIyAgICBmb28ubzogc3ViL2Zvby5jCi0gICMgICAgZm9vLm86IHN1Yi9mb28uaAotICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKLSAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYwotICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCi0gICMgICAgc3ViL2Zvby5jOgotICAjICAgIHN1Yi9mb28uaDoKLSAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKLSAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAotICAjICAgICBzdWIvZm9vLmggLi4uIFwKLSAgIyAgICAgLi4uCi0KLSAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCi0gICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCi0gICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCi0gICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KLSAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0gICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8Ci0gICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotaHAyKQotICAjIFRoZSAiaHAiIHN0YW56YSBhYm92ZSBkb2VzIG5vdCB3b3JrIHdpdGggYUNDIChDKyspIGFuZCBIUCdzIGlhNjQKLSAgIyBjb21waWxlcnMsIHdoaWNoIGhhdmUgaW50ZWdyYXRlZCBwcmVwcm9jZXNzb3JzLiAgVGhlIGNvcnJlY3Qgb3B0aW9uCi0gICMgdG8gdXNlIHdpdGggdGhlc2UgaXMgK01ha2VkOyBpdCB3cml0ZXMgZGVwZW5kZW5jaWVzIHRvIGEgZmlsZSBuYW1lZAotICAjICdmb28uZCcsIHdoaWNoIGxhbmRzIG5leHQgdG8gdGhlIG9iamVjdCBmaWxlLCB3aGVyZXZlciB0aGF0Ci0gICMgaGFwcGVucyB0byBiZS4KLSAgIyBNdWNoIG9mIHRoaXMgaXMgc2ltaWxhciB0byB0aGUgdHJ1NjQgY2FzZTsgc2VlIGNvbW1lbnRzIHRoZXJlLgotICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAotICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UuZAotICAgIHRtcGRlcGZpbGUyPSRkaXIubGlicy8kYmFzZS5kCi0gICAgIiRAIiAtV2MsK01ha2VkCi0gIGVsc2UKLSAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UuZAotICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5kCi0gICAgIiRAIiArTWFrZWQKLSAgZmkKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIgotICAgICBleGl0ICRzdGF0Ci0gIGZpCi0KLSAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKLSAgZG8KLSAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKLSAgZG9uZQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KLSAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgICAjIEFkZCBgZGVwZW5kZW50Lmg6JyBsaW5lcy4KLSAgICBzZWQgLW5lICcyLCR7OyBzL14gKi8vOyBzLyBcXCokLy87IHMvJC86LzsgcDt9JyAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCi0gIGZpCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlMiIKLSAgOzsKLQotdHJ1NjQpCi0gICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCi0gICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCi0gICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0Ci0gICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KLSAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KLSAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCi0gICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKLQotICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgICAjIFdpdGggVHJ1NjQgY2MsIHNoYXJlZCBvYmplY3RzIGNhbiBhbHNvIGJlIHVzZWQgdG8gbWFrZSBhCi0gICAgICAjIHN0YXRpYyBsaWJyYXJ5LiAgVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBpbiBsaWJ0b29sIDEuNCBzZXJpZXMgdG8KLSAgICAgICMgaGFuZGxlIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzIGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uLgotICAgICAgIyBXaXRoIGxpYnRvb2wgMS40LCBkZXBlbmRlbmNpZXMgd2VyZSBvdXRwdXQgaW4gJGRpci5saWJzLyRiYXNlLmxvLmQuCi0gICAgICAjCi0gICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhpcyBleGNlcHRpb24gd2FzIHJlbW92ZWQsIGFuZCBsaWJ0b29sIG5vdwotICAgICAgIyBnZW5lcmF0ZXMgMiBzZXBhcmF0ZSBvYmplY3RzIGZvciB0aGUgMiBsaWJyYXJpZXMuICBUaGVzZSB0d28KLSAgICAgICMgY29tcGlsYXRpb25zIG91dHB1dCBkZXBlbmRlbmNpZXMgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQKLSAgICAgICMgaW4gJGRpciRiYXNlLm8uZC4gIFdlIGhhdmUgdG8gY2hlY2sgZm9yIGJvdGggZmlsZXMsIGJlY2F1c2UKLSAgICAgICMgb25lIG9mIHRoZSB0d28gY29tcGlsYXRpb25zIGNhbiBiZSBkaXNhYmxlZC4gIFdlIHNob3VsZCBwcmVmZXIKLSAgICAgICMgJGRpciRiYXNlLm8uZCBvdmVyICRkaXIubGlicy8kYmFzZS5vLmQgYmVjYXVzZSB0aGUgbGF0dGVyIGlzCi0gICAgICAjIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB3aGVuIC5saWJzLyBpcyBkZWxldGVkLCB3aGlsZSBpZ25vcmluZwotICAgICAgIyB0aGUgZm9ybWVyIHdvdWxkIGNhdXNlIGEgZGlzdGNsZWFuY2hlY2sgcGFuaWMuCi0gICAgICB0bXBkZXBmaWxlMT0kZGlyLmxpYnMvJGJhc2UubG8uZCAgICMgbGlidG9vbCAxLjQKLSAgICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5vLmQgICAgICAgICAgIyBsaWJ0b29sIDEuNQotICAgICAgdG1wZGVwZmlsZTM9JGRpci5saWJzLyRiYXNlLm8uZCAgICAjIGxpYnRvb2wgMS41Ci0gICAgICB0bXBkZXBmaWxlND0kZGlyLmxpYnMvJGJhc2UuZCAgICAgICMgQ29tcGFxIENDQyBWNi4yLTUwNAotICAgICAgIiRAIiAtV2MsLU1ECi0gICBlbHNlCi0gICAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2Uuby5kCi0gICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAotICAgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLmQKLSAgICAgIHRtcGRlcGZpbGU0PSRkaXIkYmFzZS5kCi0gICAgICAiJEAiIC1NRAotICAgZmkKLQotICAgc3RhdD0kPwotICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gICBlbHNlCi0gICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIiAiJHRtcGRlcGZpbGU0IgotICAgICAgZXhpdCAkc3RhdAotICAgZmkKLQotICAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKLSAgIGRvCi0gICAgIHRlc3QgLWYgIiR0bXBkZXBmaWxlIiAmJiBicmVhawotICAgZG9uZQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgotICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gICBlbHNlCi0gICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICAgZmkKLSAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgIDs7Ci0KLSNub3NpZGVlZmZlY3QpCi0gICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAotICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgotCi1kYXNobXN0ZG91dCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCi0gICIkQCIgfHwgZXhpdCAkPwotCi0gICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0KLSAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRhcmcgaW4KLSAgICAtbykKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICRvYmplY3QpCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgICBzaGlmdCAjICRhcmcKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCi0gICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKLSAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgotICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgotICAiJEAiICRkYXNobWZsYWcgfAotICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8IFwKLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWRhc2hYbXN0ZG91dCkKLSAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQotICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLW1ha2VkZXBlbmQpCi0gICIkQCIgfHwgZXhpdCAkPwotICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0gICMgWCBtYWtlZGVwZW5kCi0gIHNoaWZ0Ci0gIGNsZWFyZWQ9bm8KLSAgZm9yIGFyZyBpbiAiJEAiOyBkbwotICAgIGNhc2UgJGNsZWFyZWQgaW4KLSAgICBubykKLSAgICAgIHNldCAiIjsgc2hpZnQKLSAgICAgIGNsZWFyZWQ9eWVzIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiRhcmciIGluCi0gICAgLUQqfC1JKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKLSAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQotICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KLSAgICAtKnwkb2JqZWN0KQotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OwotICAgIGVzYWMKLSAgZG9uZQotICBvYmpfc3VmZml4PSJgZWNobyAkb2JqZWN0IHwgc2VkICdzL14uKlwuLy4vJ2AiCi0gIHRvdWNoICIkdG1wZGVwZmlsZSIKLSAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCi0nIHwgXAotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKLSAgOzsKLQotY3BwKQotICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKLSAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0KLSAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLQotICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCi0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGFyZyBpbgotICAgIC1vKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgJG9iamVjdCkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICopCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLSAgICAgIHNoaWZ0ICMgZm5vcmQKLSAgICAgIHNoaWZ0ICMgJGFyZwotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICAiJEAiIC1FIHwKLSAgICBzZWQgLW4gLWUgJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgXAotICAgICAgIC1lICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLiovIHM6OiBcMSBcXDpwJyB8Ci0gICAgc2VkICckIHM6IFxcJDo6JyA+ICIkdG1wZGVwZmlsZSIKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBjYXQgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgc2VkIDwgIiR0bXBkZXBmaWxlIiAnL14kL2Q7cy9eIC8vO3MvIFxcJC8vO3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1tc3Zpc3VhbGNwcCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8sCi0gICMgYmVjYXVzZSB3ZSBtdXN0IHVzZSAtbyB3aGVuIHJ1bm5pbmcgbGlidG9vbC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgIiRhcmciIGluCi0gICAgIi1HbSJ8Ii9HbSJ8Ii1HaSJ8Ii9HaSJ8Ii1aSSJ8Ii9aSSIpCi0Jc2V0IGZub3JkICIkQCIKLQlzaGlmdAotCXNoaWZ0Ci0JOzsKLSAgICAqKQotCXNldCBmbm9yZCAiJEAiICIkYXJnIgotCXNoaWZ0Ci0Jc2hpZnQKLQk7OwotICAgIGVzYWMKLSAgZG9uZQotICAiJEAiIC1FIHwKLSAgc2VkIC1uICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLyBzOjplY2hvICJgY3lncGF0aCAtdSBcXCJcMVxcImAiOnAnIHwgc29ydCB8IHVuaXEgPiAiJHRtcGRlcGZpbGUiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OglcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCi0gIGVjaG8gIgkiID4+ICIkZGVwZmlsZSIKLSAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OlwxXDo6cCcgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLW5vbmUpCi0gIGV4ZWMgIiRAIgotICA7OwotCi0qKQotICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKLSAgZXhpdCAxCi0gIDs7Ci1lc2FjCi0KLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTogc2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOiAyCi0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC1lbmQ6ICIkIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL2luc3RhbGwtc2ggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL2luc3RhbGwtc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1ODk3ZGUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9pbnN0YWxsLXNoCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKLQotc2NyaXB0dmVyc2lvbj0yMDA2LTEyLTI1LjAwCi0KLSMgVGhpcyBvcmlnaW5hdGVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCksIHdoaWNoIHdhcwotIyBsYXRlciByZWxlYXNlZCBpbiBYMTFSNiAoeGMvY29uZmlnL3V0aWwvaW5zdGFsbC5zaCkgd2l0aCB0aGUKLSMgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZS4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk0IFggQ29uc29ydGl1bQotIwotIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci0jIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bwotIyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQotIyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKLSMgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLSMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSMKLSMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0jCi0jIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0jIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi0jIFggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSMgQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDLQotIyBUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotIwotIyBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdAotIyBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbC0KLSMgaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29yLQotIyB0aXVtLgotIwotIwotIyBGU0YgY2hhbmdlcyB0byB0aGlzIGZpbGUgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLgotIwotIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAotIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAotIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgotIwotIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCi0jIGZyb20gc2NyYXRjaC4KLQotbmw9JwotJwotSUZTPSIgIiIJJG5sIgotCi0jIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKLQotIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgotZG9pdD0ke0RPSVRQUk9HLX0KLWlmIHRlc3QgLXogIiRkb2l0IjsgdGhlbgotICBkb2l0X2V4ZWM9ZXhlYwotZWxzZQotICBkb2l0X2V4ZWM9JGRvaXQKLWZpCi0KLSMgUHV0IGluIGFic29sdXRlIGZpbGUgbmFtZXMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7Ci0jIG9yIHVzZSBlbnZpcm9ubWVudCB2YXJzLgotCi1jaGdycHByb2c9JHtDSEdSUFBST0ctY2hncnB9Ci1jaG1vZHByb2c9JHtDSE1PRFBST0ctY2htb2R9Ci1jaG93bnByb2c9JHtDSE9XTlBST0ctY2hvd259Ci1jbXBwcm9nPSR7Q01QUFJPRy1jbXB9Ci1jcHByb2c9JHtDUFBST0ctY3B9Ci1ta2RpcnByb2c9JHtNS0RJUlBST0ctbWtkaXJ9Ci1tdnByb2c9JHtNVlBST0ctbXZ9Ci1ybXByb2c9JHtSTVBST0ctcm19Ci1zdHJpcHByb2c9JHtTVFJJUFBST0ctc3RyaXB9Ci0KLXBvc2l4X2dsb2I9Jz8nCi1pbml0aWFsaXplX3Bvc2l4X2dsb2I9JwotICB0ZXN0ICIkcG9zaXhfZ2xvYiIgIT0gIj8iIHx8IHsKLSAgICBpZiAoc2V0IC1mKSAyPi9kZXYvbnVsbDsgdGhlbgotICAgICAgcG9zaXhfZ2xvYj0KLSAgICBlbHNlCi0gICAgICBwb3NpeF9nbG9iPToKLSAgICBmaQotICB9Ci0nCi0KLXBvc2l4X21rZGlyPQotCi0jIERlc2lyZWQgbW9kZSBvZiBpbnN0YWxsZWQgZmlsZS4KLW1vZGU9MDc1NQotCi1jaGdycGNtZD0KLWNobW9kY21kPSRjaG1vZHByb2cKLWNob3duY21kPQotbXZjbWQ9JG12cHJvZwotcm1jbWQ9IiRybXByb2cgLWYiCi1zdHJpcGNtZD0KLQotc3JjPQotZHN0PQotZGlyX2FyZz0KLWRzdF9hcmc9Ci0KLWNvcHlfb25fY2hhbmdlPWZhbHNlCi1ub190YXJnZXRfZGlyZWN0b3J5PQotCi11c2FnZT0iXAotVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFstVF0gU1JDRklMRSBEU1RGSUxFCi0gICBvcjogJDAgW09QVElPTl0uLi4gU1JDRklMRVMuLi4gRElSRUNUT1JZCi0gICBvcjogJDAgW09QVElPTl0uLi4gLXQgRElSRUNUT1JZIFNSQ0ZJTEVTLi4uCi0gICBvcjogJDAgW09QVElPTl0uLi4gLWQgRElSRUNUT1JJRVMuLi4KLQotSW4gdGhlIDFzdCBmb3JtLCBjb3B5IFNSQ0ZJTEUgdG8gRFNURklMRS4KLUluIHRoZSAybmQgYW5kIDNyZCwgY29weSBhbGwgU1JDRklMRVMgdG8gRElSRUNUT1JZLgotSW4gdGhlIDR0aCwgY3JlYXRlIERJUkVDVE9SSUVTLgotCi1PcHRpb25zOgotICAgICAtLWhlbHAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0LgotICAgICAtLXZlcnNpb24gIGRpc3BsYXkgdmVyc2lvbiBpbmZvIGFuZCBleGl0LgotCi0gIC1jICAgICAgICAgICAgKGlnbm9yZWQpCi0gIC1DICAgICAgICAgICAgaW5zdGFsbCBvbmx5IGlmIGRpZmZlcmVudCAocHJlc2VydmUgdGhlIGxhc3QgZGF0YSBtb2RpZmljYXRpb24gdGltZSkKLSAgLWQgICAgICAgICAgICBjcmVhdGUgZGlyZWN0b3JpZXMgaW5zdGVhZCBvZiBpbnN0YWxsaW5nIGZpbGVzLgotICAtZyBHUk9VUCAgICAgICRjaGdycHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIEdST1VQLgotICAtbSBNT0RFICAgICAgICRjaG1vZHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIE1PREUuCi0gIC1vIFVTRVIgICAgICAgJGNob3ducHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gVVNFUi4KLSAgLXMgICAgICAgICAgICAkc3RyaXBwcm9nIGluc3RhbGxlZCBmaWxlcy4KLSAgLXQgRElSRUNUT1JZICBpbnN0YWxsIGludG8gRElSRUNUT1JZLgotICAtVCAgICAgICAgICAgIHJlcG9ydCBhbiBlcnJvciBpZiBEU1RGSUxFIGlzIGEgZGlyZWN0b3J5LgotCi1FbnZpcm9ubWVudCB2YXJpYWJsZXMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29tbWFuZHM6Ci0gIENIR1JQUFJPRyBDSE1PRFBST0cgQ0hPV05QUk9HIENNUFBST0cgQ1BQUk9HIE1LRElSUFJPRyBNVlBST0cKLSAgUk1QUk9HIFNUUklQUFJPRwotIgotCi13aGlsZSB0ZXN0ICQjIC1uZSAwOyBkbwotICBjYXNlICQxIGluCi0gICAgLWMpIDs7Ci0KLSAgICAtQykgY29weV9vbl9jaGFuZ2U9dHJ1ZTs7Ci0KLSAgICAtZCkgZGlyX2FyZz10cnVlOzsKLQotICAgIC1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKLQlzaGlmdDs7Ci0KLSAgICAtLWhlbHApIGVjaG8gIiR1c2FnZSI7IGV4aXQgJD87OwotCi0gICAgLW0pIG1vZGU9JDIKLQljYXNlICRtb2RlIGluCi0JICAqJyAnKiB8IConCScqIHwgKicKLScqCSAgfCAqJyonKiB8IConPycqIHwgKidbJyopCi0JICAgIGVjaG8gIiQwOiBpbnZhbGlkIG1vZGU6ICRtb2RlIiA+JjIKLQkgICAgZXhpdCAxOzsKLQllc2FjCi0Jc2hpZnQ7OwotCi0gICAgLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgotCXNoaWZ0OzsKLQotICAgIC1zKSBzdHJpcGNtZD0kc3RyaXBwcm9nOzsKLQotICAgIC10KSBkc3RfYXJnPSQyCi0Jc2hpZnQ7OwotCi0gICAgLVQpIG5vX3RhcmdldF9kaXJlY3Rvcnk9dHJ1ZTs7Ci0KLSAgICAtLXZlcnNpb24pIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIjsgZXhpdCAkPzs7Ci0KLSAgICAtLSkJc2hpZnQKLQlicmVhazs7Ci0KLSAgICAtKikJZWNobyAiJDA6IGludmFsaWQgb3B0aW9uOiAkMSIgPiYyCi0JZXhpdCAxOzsKLQotICAgICopICBicmVhazs7Ci0gIGVzYWMKLSAgc2hpZnQKLWRvbmUKLQotaWYgdGVzdCAkIyAtbmUgMCAmJiB0ZXN0IC16ICIkZGlyX2FyZyRkc3RfYXJnIjsgdGhlbgotICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KLSAgIyBXaGVuIC10IGlzIHVzZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZC4KLSAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgotICBmb3IgYXJnCi0gIGRvCi0gICAgaWYgdGVzdCAtbiAiJGRzdF9hcmciOyB0aGVuCi0gICAgICAjICRAIGlzIG5vdCBlbXB0eTogaXQgY29udGFpbnMgYXQgbGVhc3QgJGFyZy4KLSAgICAgIHNldCBmbm9yZCAiJEAiICIkZHN0X2FyZyIKLSAgICAgIHNoaWZ0ICMgZm5vcmQKLSAgICBmaQotICAgIHNoaWZ0ICMgYXJnCi0gICAgZHN0X2FyZz0kYXJnCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgJCMgLWVxIDA7IHRoZW4KLSAgaWYgdGVzdCAteiAiJGRpcl9hcmciOyB0aGVuCi0gICAgZWNobyAiJDA6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkLiIgPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0gICMgSXQncyBPSyB0byBjYWxsIGBpbnN0YWxsLXNoIC1kJyB3aXRob3V0IGFyZ3VtZW50LgotICAjIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGNyZWF0aW5nIGNvbmRpdGlvbmFsIGRpcmVjdG9yaWVzLgotICBleGl0IDAKLWZpCi0KLWlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgotICB0cmFwICcoZXhpdCAkPyk7IGV4aXQnIDEgMiAxMyAxNQotCi0gICMgU2V0IHVtYXNrIHNvIGFzIG5vdCB0byBjcmVhdGUgdGVtcHMgd2l0aCB0b28tZ2VuZXJvdXMgbW9kZXMuCi0gICMgSG93ZXZlciwgJ3N0cmlwJyByZXF1aXJlcyBib3RoIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyB0byB0ZW1wcy4KLSAgY2FzZSAkbW9kZSBpbgotICAgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgotICAgICo2NDQpIGNwX3VtYXNrPTEzMzs7Ci0gICAgKjc1NSkgY3BfdW1hc2s9MjI7OwotCi0gICAgKlswLTddKQotICAgICAgaWYgdGVzdCAteiAiJHN0cmlwY21kIjsgdGhlbgotCXVfcGx1c19ydz0KLSAgICAgIGVsc2UKLQl1X3BsdXNfcnc9JyUgMjAwJwotICAgICAgZmkKLSAgICAgIGNwX3VtYXNrPWBleHByICcoJyA3NzcgLSAkbW9kZSAlIDEwMDAgJyknICR1X3BsdXNfcndgOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAteiAiJHN0cmlwY21kIjsgdGhlbgotCXVfcGx1c19ydz0KLSAgICAgIGVsc2UKLQl1X3BsdXNfcnc9LHUrcncKLSAgICAgIGZpCi0gICAgICBjcF91bWFzaz0kbW9kZSR1X3BsdXNfcnc7OwotICBlc2FjCi1maQotCi1mb3Igc3JjCi1kbwotICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCi0gIGNhc2UgJHNyYyBpbgotICAgIC0qKSBzcmM9Li8kc3JjOzsKLSAgZXNhYwotCi0gIGlmIHRlc3QgLW4gIiRkaXJfYXJnIjsgdGhlbgotICAgIGRzdD0kc3JjCi0gICAgZHN0ZGlyPSRkc3QKLSAgICB0ZXN0IC1kICIkZHN0ZGlyIgotICAgIGRzdGRpcl9zdGF0dXM9JD8KLSAgZWxzZQotCi0gICAgIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGNwcHJvZyAkc3JjICRkc3R0bXAiIGNvbW1hbmQKLSAgICAjIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkCi0gICAgIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCi0gICAgaWYgdGVzdCAhIC1mICIkc3JjIiAmJiB0ZXN0ICEgLWQgIiRzcmMiOyB0aGVuCi0gICAgICBlY2hvICIkMDogJHNyYyBkb2VzIG5vdCBleGlzdC4iID4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRkc3RfYXJnIjsgdGhlbgotICAgICAgZWNobyAiJDA6IG5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4iID4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGRzdD0kZHN0X2FyZwotICAgICMgUHJvdGVjdCBuYW1lcyBzdGFydGluZyB3aXRoIGAtJy4KLSAgICBjYXNlICRkc3QgaW4KLSAgICAgIC0qKSBkc3Q9Li8kZHN0OzsKLSAgICBlc2FjCi0KLSAgICAjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyB3b24ndCB3b3JrCi0gICAgIyBpZiBkb3VibGUgc2xhc2hlcyBhcmVuJ3QgaWdub3JlZC4KLSAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgotICAgICAgaWYgdGVzdCAtbiAiJG5vX3RhcmdldF9kaXJlY3RvcnkiOyB0aGVuCi0JZWNobyAiJDA6ICRkc3RfYXJnOiBJcyBhIGRpcmVjdG9yeSIgPiYyCi0JZXhpdCAxCi0gICAgICBmaQotICAgICAgZHN0ZGlyPSRkc3QKLSAgICAgIGRzdD0kZHN0ZGlyL2BiYXNlbmFtZSAiJHNyYyJgCi0gICAgICBkc3RkaXJfc3RhdHVzPTAKLSAgICBlbHNlCi0gICAgICAjIFByZWZlciBkaXJuYW1lLCBidXQgZmFsbCBiYWNrIG9uIGEgc3Vic3RpdHV0ZSBpZiBkaXJuYW1lIGZhaWxzLgotICAgICAgZHN0ZGlyPWAKLQkoZGlybmFtZSAiJGRzdCIpIDI+L2Rldi9udWxsIHx8Ci0JZXhwciBYIiRkc3QiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JICAgICBYIiRkc3QiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JICAgICBYIiRkc3QiIDogJ1hcKC8vXCkkJyBcfCBcCi0JICAgICBYIiRkc3QiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotCWVjaG8gWCIkZHN0IiB8Ci0JICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JCSAgIHMvL1wxLwotCQkgICBxCi0JCSB9Ci0JCSAvXlhcKFwvXC9cKVteL10uKi97Ci0JCSAgIHMvL1wxLwotCQkgICBxCi0JCSB9Ci0JCSAvXlhcKFwvXC9cKSQvewotCQkgICBzLy9cMS8KLQkJICAgcQotCQkgfQotCQkgL15YXChcL1wpLiovewotCQkgICBzLy9cMS8KLQkJICAgcQotCQkgfQotCQkgcy8uKi8uLzsgcScKLSAgICAgIGAKLQotICAgICAgdGVzdCAtZCAiJGRzdGRpciIKLSAgICAgIGRzdGRpcl9zdGF0dXM9JD8KLSAgICBmaQotICBmaQotCi0gIG9ic29sZXRlX21rZGlyX3VzZWQ9ZmFsc2UKLQotICBpZiB0ZXN0ICRkc3RkaXJfc3RhdHVzICE9IDA7IHRoZW4KLSAgICBjYXNlICRwb3NpeF9ta2RpciBpbgotICAgICAgJycpCi0JIyBDcmVhdGUgaW50ZXJtZWRpYXRlIGRpcnMgdXNpbmcgbW9kZSA3NTUgYXMgbW9kaWZpZWQgYnkgdGhlIHVtYXNrLgotCSMgVGhpcyBpcyBsaWtlIEZyZWVCU0QgJ2luc3RhbGwnIGFzIG9mIDE5OTctMTAtMjguCi0JdW1hc2s9YHVtYXNrYAotCWNhc2UgJHN0cmlwY21kLiR1bWFzayBpbgotCSAgIyBPcHRpbWl6ZSBjb21tb24gY2FzZXMuCi0JICAqWzIzNjddWzIzNjddKSBta2Rpcl91bWFzaz0kdW1hc2s7OwotCSAgLiowWzAyXVswMl0gfCAuWzAyXVswMl0gfCAuWzAyXSkgbWtkaXJfdW1hc2s9MjI7OwotCi0JICAqWzAtN10pCi0JICAgIG1rZGlyX3VtYXNrPWBleHByICR1bWFzayArIDIyIFwKLQkgICAgICAtICR1bWFzayAlIDEwMCAlIDQwICsgJHVtYXNrICUgMjAgXAotCSAgICAgIC0gJHVtYXNrICUgMTAgJSA0ICsgJHVtYXNrICUgMgotCSAgICBgOzsKLQkgICopIG1rZGlyX3VtYXNrPSR1bWFzayxnby13OzsKLQllc2FjCi0KLQkjIFdpdGggLWQsIGNyZWF0ZSB0aGUgbmV3IGRpcmVjdG9yeSB3aXRoIHRoZSB1c2VyLXNwZWNpZmllZCBtb2RlLgotCSMgT3RoZXJ3aXNlLCByZWx5IG9uICRta2Rpcl91bWFzay4KLQlpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLQkgIG1rZGlyX21vZGU9LW0kbW9kZQotCWVsc2UKLQkgIG1rZGlyX21vZGU9Ci0JZmkKLQotCXBvc2l4X21rZGlyPWZhbHNlCi0JY2FzZSAkdW1hc2sgaW4KLQkgICpbMTIzNTY3XVswLTddWzAtN10pCi0JICAgICMgUE9TSVggbWtkaXIgLXAgc2V0cyB1K3d4IGJpdHMgcmVnYXJkbGVzcyBvZiB1bWFzaywgd2hpY2gKLQkgICAgIyBpcyBpbmNvbXBhdGlibGUgd2l0aCBGcmVlQlNEICdpbnN0YWxsJyB3aGVuICh1bWFzayAmIDMwMCkgIT0gMC4KLQkgICAgOzsKLQkgICopCi0JICAgIHRtcGRpcj0ke1RNUERJUi0vdG1wfS9pbnMkUkFORE9NLSQkCi0JICAgIHRyYXAgJ3JldD0kPzsgcm1kaXIgIiR0bXBkaXIvZCIgIiR0bXBkaXIiIDI+L2Rldi9udWxsOyBleGl0ICRyZXQnIDAKLQotCSAgICBpZiAodW1hc2sgJG1rZGlyX3VtYXNrICYmCi0JCWV4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJHRtcGRpci9kIikgPi9kZXYvbnVsbCAyPiYxCi0JICAgIHRoZW4KLQkgICAgICBpZiB0ZXN0IC16ICIkZGlyX2FyZyIgfHwgewotCQkgICAjIENoZWNrIGZvciBQT1NJWCBpbmNvbXBhdGliaWxpdGllcyB3aXRoIC1tLgotCQkgICAjIEhQLVVYIDExLjIzIGFuZCBJUklYIDYuNSBta2RpciAtbSAtcCBzZXRzIGdyb3VwLSBvcgotCQkgICAjIG90aGVyLXdyaXRlYWJsZSBiaXQgb2YgcGFyZW50IGRpcmVjdG9yeSB3aGVuIGl0IHNob3VsZG4ndC4KLQkJICAgIyBGcmVlQlNEIDYuMSBta2RpciAtbSAtcCBzZXRzIG1vZGUgb2YgZXhpc3RpbmcgZGlyZWN0b3J5LgotCQkgICBsc19sZF90bXBkaXI9YGxzIC1sZCAiJHRtcGRpciJgCi0JCSAgIGNhc2UgJGxzX2xkX3RtcGRpciBpbgotCQkgICAgIGQ/Pz8/LT9yLSopIGRpZmZlcmVudF9tb2RlPTcwMDs7Ci0JCSAgICAgZD8/Pz8tPy0tKikgZGlmZmVyZW50X21vZGU9NzU1OzsKLQkJICAgICAqKSBmYWxzZTs7Ci0JCSAgIGVzYWMgJiYKLQkJICAgJG1rZGlycHJvZyAtbSRkaWZmZXJlbnRfbW9kZSAtcCAtLSAiJHRtcGRpciIgJiYgewotCQkgICAgIGxzX2xkX3RtcGRpcl8xPWBscyAtbGQgIiR0bXBkaXIiYAotCQkgICAgIHRlc3QgIiRsc19sZF90bXBkaXIiID0gIiRsc19sZF90bXBkaXJfMSIKLQkJICAgfQotCQkgfQotCSAgICAgIHRoZW4gcG9zaXhfbWtkaXI9OgotCSAgICAgIGZpCi0JICAgICAgcm1kaXIgIiR0bXBkaXIvZCIgIiR0bXBkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIFJlbW92ZSBhbnkgZGlycyBsZWZ0IGJlaGluZCBieSBhbmNpZW50IG1rZGlyIGltcGxlbWVudGF0aW9ucy4KLQkgICAgICBybWRpciAuLyRta2Rpcl9tb2RlIC4vLXAgLi8tLSAyPi9kZXYvbnVsbAotCSAgICBmaQotCSAgICB0cmFwICcnIDA7OwotCWVzYWM7OwotICAgIGVzYWMKLQotICAgIGlmCi0gICAgICAkcG9zaXhfbWtkaXIgJiYgKAotCXVtYXNrICRta2Rpcl91bWFzayAmJgotCSRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIKLSAgICAgICkKLSAgICB0aGVuIDoKLSAgICBlbHNlCi0KLSAgICAgICMgVGhlIHVtYXNrIGlzIHJpZGljdWxvdXMsIG9yIG1rZGlyIGRvZXMgbm90IGNvbmZvcm0gdG8gUE9TSVgsCi0gICAgICAjIG9yIGl0IGZhaWxlZCBwb3NzaWJseSBkdWUgdG8gYSByYWNlIGNvbmRpdGlvbi4gIENyZWF0ZSB0aGUKLSAgICAgICMgZGlyZWN0b3J5IHRoZSBzbG93IHdheSwgc3RlcCBieSBzdGVwLCBjaGVja2luZyBmb3IgcmFjZXMgYXMgd2UgZ28uCi0KLSAgICAgIGNhc2UgJGRzdGRpciBpbgotCS8qKSBwcmVmaXg9Jy8nOzsKLQktKikgcHJlZml4PScuLyc7OwotCSopICBwcmVmaXg9Jyc7OwotICAgICAgZXNhYwotCi0gICAgICBldmFsICIkaW5pdGlhbGl6ZV9wb3NpeF9nbG9iIgotCi0gICAgICBvSUZTPSRJRlMKLSAgICAgIElGUz0vCi0gICAgICAkcG9zaXhfZ2xvYiBzZXQgLWYKLSAgICAgIHNldCBmbm9yZCAkZHN0ZGlyCi0gICAgICBzaGlmdAotICAgICAgJHBvc2l4X2dsb2Igc2V0ICtmCi0gICAgICBJRlM9JG9JRlMKLQotICAgICAgcHJlZml4ZXM9Ci0KLSAgICAgIGZvciBkCi0gICAgICBkbwotCXRlc3QgLXogIiRkIiAmJiBjb250aW51ZQotCi0JcHJlZml4PSRwcmVmaXgkZAotCWlmIHRlc3QgLWQgIiRwcmVmaXgiOyB0aGVuCi0JICBwcmVmaXhlcz0KLQllbHNlCi0JICBpZiAkcG9zaXhfbWtkaXI7IHRoZW4KLQkgICAgKHVtYXNrPSRta2Rpcl91bWFzayAmJgotCSAgICAgJGRvaXRfZXhlYyAkbWtkaXJwcm9nICRta2Rpcl9tb2RlIC1wIC0tICIkZHN0ZGlyIikgJiYgYnJlYWsKLQkgICAgIyBEb24ndCBmYWlsIGlmIHR3byBpbnN0YW5jZXMgYXJlIHJ1bm5pbmcgY29uY3VycmVudGx5LgotCSAgICB0ZXN0IC1kICIkcHJlZml4IiB8fCBleGl0IDEKLQkgIGVsc2UKLQkgICAgY2FzZSAkcHJlZml4IGluCi0JICAgICAgKlwnKikgcXByZWZpeD1gZWNobyAiJHByZWZpeCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OwotCSAgICAgICopIHFwcmVmaXg9JHByZWZpeDs7Ci0JICAgIGVzYWMKLQkgICAgcHJlZml4ZXM9IiRwcmVmaXhlcyAnJHFwcmVmaXgnIgotCSAgZmkKLQlmaQotCXByZWZpeD0kcHJlZml4LwotICAgICAgZG9uZQotCi0gICAgICBpZiB0ZXN0IC1uICIkcHJlZml4ZXMiOyB0aGVuCi0JIyBEb24ndCBmYWlsIGlmIHR3byBpbnN0YW5jZXMgYXJlIHJ1bm5pbmcgY29uY3VycmVudGx5LgotCSh1bWFzayAkbWtkaXJfdW1hc2sgJiYKLQkgZXZhbCAiXCRkb2l0X2V4ZWMgXCRta2RpcnByb2cgJHByZWZpeGVzIikgfHwKLQkgIHRlc3QgLWQgIiRkc3RkaXIiIHx8IGV4aXQgMQotCW9ic29sZXRlX21rZGlyX3VzZWQ9dHJ1ZQotICAgICAgZmkKLSAgICBmaQotICBmaQotCi0gIGlmIHRlc3QgLW4gIiRkaXJfYXJnIjsgdGhlbgotICAgIHsgdGVzdCAteiAiJGNob3duY21kIiB8fCAkZG9pdCAkY2hvd25jbWQgIiRkc3QiOyB9ICYmCi0gICAgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdCI7IH0gJiYKLSAgICB7IHRlc3QgIiRvYnNvbGV0ZV9ta2Rpcl91c2VkJGNob3duY21kJGNoZ3JwY21kIiA9IGZhbHNlIHx8Ci0gICAgICB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdCI7IH0gfHwgZXhpdCAxCi0gIGVsc2UKLQotICAgICMgTWFrZSBhIGNvdXBsZSBvZiB0ZW1wIGZpbGUgbmFtZXMgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCi0gICAgZHN0dG1wPSRkc3RkaXIvX2luc3QuJCRfCi0gICAgcm10bXA9JGRzdGRpci9fcm0uJCRfCi0KLSAgICAjIFRyYXAgdG8gY2xlYW4gdXAgdGhvc2UgdGVtcCBmaWxlcyBhdCBleGl0LgotICAgIHRyYXAgJ3JldD0kPzsgcm0gLWYgIiRkc3R0bXAiICIkcm10bXAiICYmIGV4aXQgJHJldCcgMAotCi0gICAgIyBDb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZS4KLSAgICAodW1hc2sgJGNwX3VtYXNrICYmICRkb2l0X2V4ZWMgJGNwcHJvZyAiJHNyYyIgIiRkc3R0bXAiKSAmJgotCi0gICAgIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzLgotICAgICMKLSAgICAjIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCi0gICAgIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCi0gICAgIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgotICAgICMKLSAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0dG1wIjsgfSAmJgotICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3R0bXAiOyB9ICYmCi0gICAgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IH0gJiYKLSAgICB7IHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICRtb2RlICIkZHN0dG1wIjsgfSAmJgotCi0gICAgIyBJZiAtQywgZG9uJ3QgYm90aGVyIHRvIGNvcHkgaWYgaXQgd291bGRuJ3QgY2hhbmdlIHRoZSBmaWxlLgotICAgIGlmICRjb3B5X29uX2NoYW5nZSAmJgotICAgICAgIG9sZD1gTENfQUxMPUMgbHMgLWRsTCAiJGRzdCIJMj4vZGV2L251bGxgICYmCi0gICAgICAgbmV3PWBMQ19BTEw9QyBscyAtZGxMICIkZHN0dG1wIgkyPi9kZXYvbnVsbGAgJiYKLQotICAgICAgIGV2YWwgIiRpbml0aWFsaXplX3Bvc2l4X2dsb2IiICYmCi0gICAgICAgJHBvc2l4X2dsb2Igc2V0IC1mICYmCi0gICAgICAgc2V0IFggJG9sZCAmJiBvbGQ9OiQyOiQ0OiQ1OiQ2ICYmCi0gICAgICAgc2V0IFggJG5ldyAmJiBuZXc9OiQyOiQ0OiQ1OiQ2ICYmCi0gICAgICAgJHBvc2l4X2dsb2Igc2V0ICtmICYmCi0KLSAgICAgICB0ZXN0ICIkb2xkIiA9ICIkbmV3IiAmJgotICAgICAgICRjbXBwcm9nICIkZHN0IiAiJGRzdHRtcCIgPi9kZXYvbnVsbCAyPiYxCi0gICAgdGhlbgotICAgICAgcm0gLWYgIiRkc3R0bXAiCi0gICAgZWxzZQotICAgICAgIyBSZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCi0gICAgICAkZG9pdCAkbXZjbWQgLWYgIiRkc3R0bXAiICIkZHN0IiAyPi9kZXYvbnVsbCB8fAotCi0gICAgICAjIFRoZSByZW5hbWUgZmFpbGVkLCBwZXJoYXBzIGJlY2F1c2UgbXYgY2FuJ3QgcmVuYW1lIHNvbWV0aGluZyBlbHNlCi0gICAgICAjIHRvIGl0c2VsZiwgb3IgcGVyaGFwcyBiZWNhdXNlIG12IGlzIHNvIGFuY2llbnQgdGhhdCBpdCBkb2VzIG5vdAotICAgICAgIyBzdXBwb3J0IC1mLgotICAgICAgewotCSMgTm93IHJlbW92ZSBvciBtb3ZlIGFzaWRlIGFueSBvbGQgZmlsZSBhdCBkZXN0aW5hdGlvbiBsb2NhdGlvbi4KLQkjIFdlIHRyeSB0aGlzIHR3byB3YXlzIHNpbmNlIHJtIGNhbid0IHVubGluayBpdHNlbGYgb24gc29tZQotCSMgc3lzdGVtcyBhbmQgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbWlnaHQgYmUgYnVzeSBmb3Igb3RoZXIKLQkjIHJlYXNvbnMuICBJbiB0aGlzIGNhc2UsIHRoZSBmaW5hbCBjbGVhbnVwIG1pZ2h0IGZhaWwgYnV0IHRoZSBuZXcKLQkjIGZpbGUgc2hvdWxkIHN0aWxsIGluc3RhbGwgc3VjY2Vzc2Z1bGx5LgotCXsKLQkgIHRlc3QgISAtZiAiJGRzdCIgfHwKLQkgICRkb2l0ICRybWNtZCAtZiAiJGRzdCIgMj4vZGV2L251bGwgfHwKLQkgIHsgJGRvaXQgJG12Y21kIC1mICIkZHN0IiAiJHJtdG1wIiAyPi9kZXYvbnVsbCAmJgotCSAgICB7ICRkb2l0ICRybWNtZCAtZiAiJHJtdG1wIiAyPi9kZXYvbnVsbDsgOjsgfQotCSAgfSB8fAotCSAgeyBlY2hvICIkMDogY2Fubm90IHVubGluayBvciByZW5hbWUgJGRzdCIgPiYyCi0JICAgIChleGl0IDEpOyBleGl0IDEKLQkgIH0KLQl9ICYmCi0KLQkjIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCi0JJGRvaXQgJG12Y21kICIkZHN0dG1wIiAiJGRzdCIKLSAgICAgIH0KLSAgICBmaSB8fCBleGl0IDEKLQotICAgIHRyYXAgJycgMAotICBmaQotZG9uZQotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCi0jIEVuZDoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvbHRtYWluLnNoIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9sdG1haW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDZlYWQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9sdG1haW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4NDEzICswLDAgQEAKLSMgR2VuZXJhdGVkIGZyb20gbHRtYWluLm00c2guCi0KLSMgbHRtYWluLnNoIChHTlUgbGlidG9vbCkgMi4yLjYKLSMgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLSMgd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSMgR05VIExpYnRvb2wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAotIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKLSMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0jCi0jIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQotIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwKLSMgb3Igb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLQotIyBVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KLSMKLSMgUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jCi0jICAgICAtLWNvbmZpZyAgICAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcwotIyAgICAgLS1kZWJ1ZyAgICAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZwotIyAtbiwgLS1kcnktcnVuICAgICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKLSMgICAgIC0tZmVhdHVyZXMgICAgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotIyAgICAgLS1tb2RlPU1PREUgICAgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUKLSMgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMgIGRvbid0IHJlbW92ZSBkdXBsaWNhdGUgZGVwZW5kZW5jeSBsaWJyYXJpZXMKLSMgICAgIC0tcXVpZXQsIC0tc2lsZW50ICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSMgICAgIC0tdGFnPVRBRyAgICAgICAgICAgIHVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIHRhZyBUQUcKLSMgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgKGRlZmF1bHQpCi0jICAgICAtLXZlcnNpb24gICAgICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCi0jIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBwcmludCBzaG9ydCBvciBsb25nIGhlbHAgbWVzc2FnZQotIwotIyBNT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0jCi0jICAgICAgIGNsZWFuICAgICAgICAgICAgICByZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5Ci0jICAgICAgIGNvbXBpbGUgICAgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0Ci0jICAgICAgIGV4ZWN1dGUgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQotIyAgICAgICBmaW5pc2ggICAgICAgICAgICAgY29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcwotIyAgICAgICBpbnN0YWxsICAgICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKLSMgICAgICAgbGluayAgICAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQotIyAgICAgICB1bmluc3RhbGwgICAgICAgICAgcmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxlZCBkaXJlY3RvcnkKLSMKLSMgTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLgotIyBUcnkgYCRwcm9nbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4KLSMKLSMgV2hlbiByZXBvcnRpbmcgYSBidWcsIHBsZWFzZSBkZXNjcmliZSBhIHRlc3QgY2FzZSB0byByZXByb2R1Y2UgaXQgYW5kCi0jIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLSMKLSMgICAgICAgaG9zdC10cmlwbGV0OgkkaG9zdAotIyAgICAgICBzaGVsbDoJCSRTSEVMTAotIyAgICAgICBjb21waWxlcjoJCSRMVENDCi0jICAgICAgIGNvbXBpbGVyIGZsYWdzOgkJJExUQ0ZMQUdTCi0jICAgICAgIGxpbmtlcjoJCSRMRCAoZ251PyAkd2l0aF9nbnVfbGQpCi0jICAgICAgICRwcm9nbmFtZToJCShHTlUgbGlidG9vbCkgMi4yLjYgRGViaWFuLTIuMi42YS00Ci0jICAgICAgIGF1dG9tYWtlOgkJJGF1dG9tYWtlX3ZlcnNpb24KLSMgICAgICAgYXV0b2NvbmY6CQkkYXV0b2NvbmZfdmVyc2lvbgotIwotIyBSZXBvcnQgYnVncyB0byA8YnVnLWxpYnRvb2xAZ251Lm9yZz4uCi0KLVBST0dSQU09bHRtYWluLnNoCi1QQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049IjIuMi42IERlYmlhbi0yLjIuNmEtNCIKLVRJTUVTVEFNUD0iIgotcGFja2FnZV9yZXZpc2lvbj0xLjMwMTIKLQotIyBCZSBCb3VybmUgY29tcGF0aWJsZQotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAqcG9zaXgqKSBzZXQgLW8gcG9zaXg7OyBlc2FjCi1maQotQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLQotIyBOTFMgbnVpc2FuY2VzOiBXZSBzYXZlIHRoZSBvbGQgdmFsdWVzIHRvIHJlc3RvcmUgZHVyaW5nIGV4ZWN1dGUgbW9kZS4KLSMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCi0jIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAotIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotbHRfdXNlcl9sb2NhbGU9Ci1sdF9zYWZlX2xvY2FsZT0KLWZvciBsdF92YXIgaW4gTEFORyBMQU5HVUFHRSBMQ19BTEwgTENfQ1RZUEUgTENfQ09MTEFURSBMQ19NRVNTQUdFUwotZG8KLSAgZXZhbCAiaWYgdGVzdCBcIlwkeyRsdF92YXIrc2V0fVwiID0gc2V0OyB0aGVuCi0gICAgICAgICAgc2F2ZV8kbHRfdmFyPVwkJGx0X3ZhcgotICAgICAgICAgICRsdF92YXI9QwotCSAgZXhwb3J0ICRsdF92YXIKLQkgIGx0X3VzZXJfbG9jYWxlPVwiJGx0X3Zhcj1cXFwkc2F2ZV9cJGx0X3ZhcjsgXCRsdF91c2VyX2xvY2FsZVwiCi0JICBsdF9zYWZlX2xvY2FsZT1cIiRsdF92YXI9QzsgXCRsdF9zYWZlX2xvY2FsZVwiCi0JZmkiCi1kb25lCi0KLSRsdF91bnNldCBDRFBBVEgKLQotCi0KLQotCi06ICR7Q1A9ImNwIC1mIn0KLTogJHtFQ0hPPSJlY2hvIn0KLTogJHtFR1JFUD0iL2Jpbi9ncmVwIC1FIn0KLTogJHtGR1JFUD0iL2Jpbi9ncmVwIC1GIn0KLTogJHtHUkVQPSIvYmluL2dyZXAifQotOiAke0xOX1M9ImxuIC1zIn0KLTogJHtNQUtFPSJtYWtlIn0KLTogJHtNS0RJUj0ibWtkaXIifQotOiAke01WPSJtdiAtZiJ9Ci06ICR7Uk09InJtIC1mIn0KLTogJHtTRUQ9Ii9iaW4vc2VkIn0KLTogJHtTSEVMTD0iJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0ifQotOiAke1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyJ9Ci0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLUVYSVRfU1VDQ0VTUz0wCi1FWElUX0ZBSUxVUkU9MQotRVhJVF9NSVNNQVRDSD02MyAgIyAkPyA9IDYzIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmVyc2lvbiBtaXNtYXRjaCB0byBtaXNzaW5nLgotRVhJVF9TS0lQPTc3CSAgIyAkPyA9IDc3IGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBza2lwcGVkIHRlc3QgdG8gYXV0b21ha2UuCi0KLWV4aXRfc3RhdHVzPSRFWElUX1NVQ0NFU1MKLQotIyBNYWtlIHN1cmUgSUZTIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQKLWx0X25sPScKLScKLUlGUz0iIAkkbHRfbmwiCi0KLWRpcm5hbWU9InMsL1teL10qJCwsIgotYmFzZW5hbWU9InMsXi4qLywsIgotCi0jIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50Ci0jIHBlcmZvcm0gZnVuY19iYXNlbmFtZSBhbmQgZnVuY19kaXJuYW1lIGluIGEgc2luZ2xlIGZ1bmN0aW9uCi0jIGNhbGw6Ci0jICAgZGlybmFtZTogIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LAotIyAgICAgICAgICAgICBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsIG90aGVyd2lzZSBzZXQgcmVzdWx0Ci0jICAgICAgICAgICAgIHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KLSMgICAgICAgICAgICAgdmFsdWUgcmV0dXJuZWQgaW4gIiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotIyAgIGJhc2VuYW1lOiBDb21wdXRlIGZpbGVuYW1lIG9mIEZJTEUuCi0jICAgICAgICAgICAgIHZhbHVlIHJldHVuZWQgaW4gIiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLSMgSW1wbGVtZW50YXRpb24gbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIGZ1bmNfZGlybmFtZQotIyBhbmQgZnVuY19iYXNlbmFtZS4gRm9yIGVmZmljaWVuY3ksIHdlIGRvIG5vdCBkZWxlZ2F0ZSB0bwotIyB0aG9zZSBmdW5jdGlvbnMgYnV0IGluc3RlYWQgZHVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IGhlcmUuCi1mdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICgpCi17Ci0gICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0gIGZ1bmNfZGlybmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJGRpcm5hbWUiYAotICBpZiB0ZXN0ICJYJGZ1bmNfZGlybmFtZV9yZXN1bHQiID0gIlgkezF9IjsgdGhlbgotICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iCi0gIGVsc2UKLSAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdCR7Mn0iCi0gIGZpCi0gIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRiYXNlbmFtZSJgCi19Ci0KLSMgR2VuZXJhdGVkIHNoZWxsIGZ1bmN0aW9ucyBpbnNlcnRlZCBoZXJlLgotCi0jIFdvcmsgYXJvdW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWUgb24gSVJJWCA2LjUuIE9uIElSSVggNi40Kywgc2gKLSMgaXMga3NoIGJ1dCB3aGVuIHRoZSBzaGVsbCBpcyBpbnZva2VkIGFzICJzaCIgYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mCi0jIHRoZSBfWFBHIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBlcXVhbCB0byAxIChvbmUpLCB0aGUgc3BlY2lhbAotIyBwb3NpdGlvbmFsIHBhcmFtZXRlciAkMCwgd2l0aGluIGEgZnVuY3Rpb24gY2FsbCwgaXMgdGhlIG5hbWUgb2YgdGhlCi0jIGZ1bmN0aW9uLgotcHJvZ3BhdGg9IiQwIgotCi0jIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbToKLSMgSW4gdGhlIHVubGlrZWx5IGV2ZW50ICRwcm9nbmFtZSBiZWdhbiB3aXRoIGEgJy0nLCBpdCB3b3VsZCBwbGF5IGhhdm9jIHdpdGgKLSMgZnVuY19lY2hvIChpbWFnaW5lIHByb2duYW1lPS1uKSwgc28gd2UgcHJlcGVuZCAuLyBpbiB0aGF0IGNhc2U6Ci1mdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkcHJvZ3BhdGgiCi1wcm9nbmFtZT0kZnVuY19iYXNlbmFtZV9yZXN1bHQKLWNhc2UgJHByb2duYW1lIGluCi0gIC0qKSBwcm9nbmFtZT0uLyRwcm9nbmFtZSA7OwotZXNhYwotCi0jIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGFic29sdXRlIHBhdGggZm9yIHJlZXhlY3V0aW9uOgotY2FzZSAkcHJvZ3BhdGggaW4KLSAgW1xcL10qfFtBLVphLXpdOlxcKikgOzsKLSAgKltcXC9dKikKLSAgICAgcHJvZ2Rpcj0kZnVuY19kaXJuYW1lX3Jlc3VsdAotICAgICBwcm9nZGlyPWBjZCAiJHByb2dkaXIiICYmIHB3ZGAKLSAgICAgcHJvZ3BhdGg9IiRwcm9nZGlyLyRwcm9nbmFtZSIKLSAgICAgOzsKLSAgKikKLSAgICAgc2F2ZV9JRlM9IiRJRlMiCi0gICAgIElGUz06Ci0gICAgIGZvciBwcm9nZGlyIGluICRQQVRIOyBkbwotICAgICAgIElGUz0iJHNhdmVfSUZTIgotICAgICAgIHRlc3QgLXggIiRwcm9nZGlyLyRwcm9nbmFtZSIgJiYgYnJlYWsKLSAgICAgZG9uZQotICAgICBJRlM9IiRzYXZlX0lGUyIKLSAgICAgdGVzdCAtbiAiJHByb2dkaXIiIHx8IHByb2dkaXI9YHB3ZGAKLSAgICAgcHJvZ3BhdGg9IiRwcm9nZGlyLyRwcm9nbmFtZSIKLSAgICAgOzsKLWVzYWMKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9IiR7U0VEfSInIC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbYCIkXFxdXCkvXFxcMS9nJwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KLWRvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFsiYFxcXVwpL1xcXDEvZycKLQotIyBSZS1gXCcgcGFyYW1ldGVyIGV4cGFuc2lvbnMgaW4gb3V0cHV0IG9mIGRvdWJsZV9xdW90ZV9zdWJzdCB0aGF0IHdlcmUKLSMgYFwnLWVkIGluIGlucHV0IHRvIHRoZSBzYW1lLiAgSWYgYW4gb2RkIG51bWJlciBvZiBgXCcgcHJlY2VkZWQgYSAnJCcKLSMgaW4gaW5wdXQgdG8gZG91YmxlX3F1b3RlX3N1YnN0LCB0aGF0ICckJyB3YXMgcHJvdGVjdGVkIGZyb20gZXhwYW5zaW9uLgotIyBTaW5jZSBlYWNoIGlucHV0IGBcJyBpcyBub3cgdHdvIGBcJ3MsIGxvb2sgZm9yIGFueSBudW1iZXIgb2YgcnVucyBvZgotIyBmb3VyIGBcJ3MgZm9sbG93ZWQgYnkgdHdvIGBcJ3MgYW5kIHRoZW4gYSAnJCcuICBgXCcgdGhhdCAnJCcuCi1icz0nXFwnCi1iczI9J1xcXFwnCi1iczQ9J1xcXFxcXFxcJwotZG9sbGFyPSdcJCcKLXNlZF9kb3VibGVfYmFja3NsYXNoPSJcCi0gIHMvJGJzNC8mXFwKLS9nCi0gIHMvXiRiczIkZG9sbGFyLyRicyYvCi0gIHMvXFwoW14kYnNdXFwpJGJzMiRkb2xsYXIvXFwxJGJzMiRicyRkb2xsYXIvZwotICBzL1xuLy9nIgotCi0jIFN0YW5kYXJkIG9wdGlvbnM6Ci1vcHRfZHJ5X3J1bj1mYWxzZQotb3B0X2hlbHA9ZmFsc2UKLW9wdF9xdWlldD1mYWxzZQotb3B0X3ZlcmJvc2U9ZmFsc2UKLW9wdF93YXJuaW5nPToKLQotIyBmdW5jX2VjaG8gYXJnLi4uCi0jIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UsIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgbW9kZQotIyBuYW1lIGlmIGl0IGhhcyBiZWVuIHNldCB5ZXQuCi1mdW5jX2VjaG8gKCkKLXsKLSAgICAkRUNITyAiJHByb2duYW1lJHttb2RlKzogfSRtb2RlOiAkKiIKLX0KLQotIyBmdW5jX3ZlcmJvc2UgYXJnLi4uCi0jIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgaW4gdmVyYm9zZSBtb2RlIG9ubHkuCi1mdW5jX3ZlcmJvc2UgKCkKLXsKLSAgICAkb3B0X3ZlcmJvc2UgJiYgZnVuY19lY2hvICR7MSsiJEAifQotCi0gICAgIyBBIGJ1ZyBpbiBiYXNoIGhhbHRzIHRoZSBzY3JpcHQgaWYgdGhlIGxhc3QgbGluZSBvZiBhIGZ1bmN0aW9uCi0gICAgIyBmYWlscyB3aGVuIHNldCAtZSBpcyBpbiBmb3JjZSwgc28gd2UgbmVlZCBhbm90aGVyIGNvbW1hbmQgdG8KLSAgICAjIHdvcmsgYXJvdW5kIHRoYXQ6Ci0gICAgOgotfQotCi0jIGZ1bmNfZXJyb3IgYXJnLi4uCi0jIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCi1mdW5jX2Vycm9yICgpCi17Ci0gICAgJEVDSE8gIiRwcm9nbmFtZSR7bW9kZSs6IH0kbW9kZTogIiR7MSsiJEAifSAxPiYyCi19Ci0KLSMgZnVuY193YXJuaW5nIGFyZy4uLgotIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCi1mdW5jX3dhcm5pbmcgKCkKLXsKLSAgICAkb3B0X3dhcm5pbmcgJiYgJEVDSE8gIiRwcm9nbmFtZSR7bW9kZSs6IH0kbW9kZTogd2FybmluZzogIiR7MSsiJEAifSAxPiYyCi0KLSAgICAjIGJhc2ggYnVnIGFnYWluOgotICAgIDoKLX0KLQotIyBmdW5jX2ZhdGFsX2Vycm9yIGFyZy4uLgotIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBhbmQgZXhpdC4KLWZ1bmNfZmF0YWxfZXJyb3IgKCkKLXsKLSAgICBmdW5jX2Vycm9yICR7MSsiJEAifQotICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotfQotCi0jIGZ1bmNfZmF0YWxfaGVscCBhcmcuLi4KLSMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciwgZm9sbG93ZWQgYnkKLSMgYSBoZWxwIGhpbnQsIGFuZCBleGl0LgotZnVuY19mYXRhbF9oZWxwICgpCi17Ci0gICAgZnVuY19lcnJvciAkezErIiRAIn0KLSAgICBmdW5jX2ZhdGFsX2Vycm9yICIkaGVscCIKLX0KLWhlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgICMjIGRlZmF1bHQKLQotCi0jIGZ1bmNfZ3JlcCBleHByZXNzaW9uIGZpbGVuYW1lCi0jIENoZWNrIHdoZXRoZXIgRVhQUkVTU0lPTiBtYXRjaGVzIGFueSBsaW5lIG9mIEZJTEVOQU1FLCB3aXRob3V0IG91dHB1dC4KLWZ1bmNfZ3JlcCAoKQotewotICAgICRHUkVQICIkMSIgIiQyIiA+L2Rldi9udWxsIDI+JjEKLX0KLQotCi0jIGZ1bmNfbWtkaXJfcCBkaXJlY3RvcnktcGF0aAotIyBNYWtlIHN1cmUgdGhlIGVudGlyZSBwYXRoIHRvIERJUkVDVE9SWS1QQVRIIGlzIGF2YWlsYWJsZS4KLWZ1bmNfbWtkaXJfcCAoKQotewotICAgIG15X2RpcmVjdG9yeV9wYXRoPSIkMSIKLSAgICBteV9kaXJfbGlzdD0KLQotICAgIGlmIHRlc3QgLW4gIiRteV9kaXJlY3RvcnlfcGF0aCIgJiYgdGVzdCAiJG9wdF9kcnlfcnVuIiAhPSAiOiI7IHRoZW4KLQotICAgICAgIyBQcm90ZWN0IGRpcmVjdG9yeSBuYW1lcyBzdGFydGluZyB3aXRoIGAtJwotICAgICAgY2FzZSAkbXlfZGlyZWN0b3J5X3BhdGggaW4KLSAgICAgICAgLSopIG15X2RpcmVjdG9yeV9wYXRoPSIuLyRteV9kaXJlY3RvcnlfcGF0aCIgOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBXaGlsZSBzb21lIHBvcnRpb24gb2YgRElSIGRvZXMgbm90IHlldCBleGlzdC4uLgotICAgICAgd2hpbGUgdGVzdCAhIC1kICIkbXlfZGlyZWN0b3J5X3BhdGgiOyBkbwotICAgICAgICAjIC4uLm1ha2UgYSBsaXN0IGluIHRvcG1vc3QgZmlyc3Qgb3JkZXIuICBVc2UgYSBjb2xvbiBkZWxpbWl0ZWQKLQkjIGxpc3QgaW5jYXNlIHNvbWUgcG9ydGlvbiBvZiBwYXRoIGNvbnRhaW5zIHdoaXRlc3BhY2UuCi0gICAgICAgIG15X2Rpcl9saXN0PSIkbXlfZGlyZWN0b3J5X3BhdGg6JG15X2Rpcl9saXN0IgotCi0gICAgICAgICMgSWYgdGhlIGxhc3QgcG9ydGlvbiBhZGRlZCBoYXMgbm8gc2xhc2ggaW4gaXQsIHRoZSBsaXN0IGlzIGRvbmUKLSAgICAgICAgY2FzZSAkbXlfZGlyZWN0b3J5X3BhdGggaW4gKi8qKSA7OyAqKSBicmVhayA7OyBlc2FjCi0KLSAgICAgICAgIyAuLi5vdGhlcndpc2UgdGhyb3cgYXdheSB0aGUgY2hpbGQgZGlyZWN0b3J5IGFuZCBsb29wCi0gICAgICAgIG15X2RpcmVjdG9yeV9wYXRoPWAkRUNITyAiWCRteV9kaXJlY3RvcnlfcGF0aCIgfCAkWHNlZCAtZSAiJGRpcm5hbWUiYAotICAgICAgZG9uZQotICAgICAgbXlfZGlyX2xpc3Q9YCRFQ0hPICJYJG15X2Rpcl9saXN0IiB8ICRYc2VkIC1lICdzLDoqJCwsJ2AKLQotICAgICAgc2F2ZV9ta2Rpcl9wX0lGUz0iJElGUyI7IElGUz0nOicKLSAgICAgIGZvciBteV9kaXIgaW4gJG15X2Rpcl9saXN0OyBkbwotCUlGUz0iJHNhdmVfbWtkaXJfcF9JRlMiCi0gICAgICAgICMgbWtkaXIgY2FuIGZhaWwgd2l0aCBhIGBGaWxlIGV4aXN0JyBlcnJvciBpZiB0d28gcHJvY2Vzc2VzCi0gICAgICAgICMgdHJ5IHRvIGNyZWF0ZSBvbmUgb2YgdGhlIGRpcmVjdG9yaWVzIGNvbmN1cnJlbnRseS4gIERvbid0Ci0gICAgICAgICMgc3RvcCBpbiB0aGF0IGNhc2UhCi0gICAgICAgICRNS0RJUiAiJG15X2RpciIgMj4vZGV2L251bGwgfHwgOgotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9ta2Rpcl9wX0lGUyIKLQotICAgICAgIyBCYWlsIG91dCBpZiB3ZSAob3Igc29tZSBvdGhlciBwcm9jZXNzKSBmYWlsZWQgdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgotICAgICAgdGVzdCAtZCAiJG15X2RpcmVjdG9yeV9wYXRoIiB8fCBcCi0gICAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgIkZhaWxlZCB0byBjcmVhdGUgXGAkMSciCi0gICAgZmkKLX0KLQotCi0jIGZ1bmNfbWt0ZW1wZGlyIFtzdHJpbmddCi0jIE1ha2UgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgd29uJ3QgY2xhc2ggd2l0aCBvdGhlciBydW5uaW5nCi0jIGxpYnRvb2wgcHJvY2Vzc2VzLCBhbmQgYXZvaWRzIHJhY2UgY29uZGl0aW9ucyBpZiBwb3NzaWJsZS4gIElmCi0jIGdpdmVuLCBTVFJJTkcgaXMgdGhlIGJhc2VuYW1lIGZvciB0aGF0IGRpcmVjdG9yeS4KLWZ1bmNfbWt0ZW1wZGlyICgpCi17Ci0gICAgbXlfdGVtcGxhdGU9IiR7VE1QRElSLS90bXB9LyR7MS0kcHJvZ25hbWV9IgotCi0gICAgaWYgdGVzdCAiJG9wdF9kcnlfcnVuIiA9ICI6IjsgdGhlbgotICAgICAgIyBSZXR1cm4gYSBkaXJlY3RvcnkgbmFtZSwgYnV0IGRvbid0IGNyZWF0ZSBpdCBpbiBkcnktcnVuIG1vZGUKLSAgICAgIG15X3RtcGRpcj0iJHtteV90ZW1wbGF0ZX0tJCQiCi0gICAgZWxzZQotCi0gICAgICAjIElmIG1rdGVtcCB3b3JrcywgdXNlIHRoYXQgZmlyc3QgYW5kIGZvcmVtb3N0Ci0gICAgICBteV90bXBkaXI9YG1rdGVtcCAtZCAiJHtteV90ZW1wbGF0ZX0tWFhYWFhYWFgiIDI+L2Rldi9udWxsYAotCi0gICAgICBpZiB0ZXN0ICEgLWQgIiRteV90bXBkaXIiOyB0aGVuCi0gICAgICAgICMgRmFpbGluZyB0aGF0LCBhdCBsZWFzdCB0cnkgYW5kIHVzZSAkUkFORE9NIHRvIGF2b2lkIGEgcmFjZQotICAgICAgICBteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSR7UkFORE9NLTB9JCQiCi0KLSAgICAgICAgc2F2ZV9ta3RlbXBkaXJfdW1hc2s9YHVtYXNrYAotICAgICAgICB1bWFzayAwMDc3Ci0gICAgICAgICRNS0RJUiAiJG15X3RtcGRpciIKLSAgICAgICAgdW1hc2sgJHNhdmVfbWt0ZW1wZGlyX3VtYXNrCi0gICAgICBmaQotCi0gICAgICAjIElmIHdlJ3JlIG5vdCBpbiBkcnktcnVuIG1vZGUsIGJvbWIgb3V0IG9uIGZhaWx1cmUKLSAgICAgIHRlc3QgLWQgIiRteV90bXBkaXIiIHx8IFwKLSAgICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IFxgJG15X3RtcGRpciciCi0gICAgZmkKLQotICAgICRFQ0hPICJYJG15X3RtcGRpciIgfCAkWHNlZAotfQotCi0KLSMgZnVuY19xdW90ZV9mb3JfZXZhbCBhcmcKLSMgQWVzdGhldGljYWxseSBxdW90ZSBBUkcgdG8gYmUgZXZhbGVkIGxhdGVyLgotIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHdvIHZhbHVlczogRlVOQ19RVU9URV9GT1JfRVZBTF9SRVNVTFQKLSMgaXMgZG91YmxlLXF1b3RlZCwgc3VpdGFibGUgZm9yIGEgc3Vic2VxdWVudCBldmFsLCB3aGVyZWFzCi0jIEZVTkNfUVVPVEVfRk9SX0VWQUxfVU5RVU9URURfUkVTVUxUIGhhcyBtZXJlbHkgYWxsIGNoYXJhY3RlcnMKLSMgd2hpY2ggYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlIHF1b3RlcyBiYWNrc2xhc2hpZmllZC4KLWZ1bmNfcXVvdGVfZm9yX2V2YWwgKCkKLXsKLSAgICBjYXNlICQxIGluCi0gICAgICAqW1xcXGBcIlwkXSopCi0JZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQ9YCRFQ0hPICJYJDEiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYCA7OwotICAgICAgKikKLSAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQ9IiQxIiA7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0IGluCi0gICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMgdG8gZGVsYXkKLSAgICAgICMgd29yZCBzcGxpdHRpbmcsIGNvbW1hbmQgc3Vic3RpdHV0aW9uIGFuZCBhbmQgdmFyaWFibGUKLSAgICAgICMgZXhwYW5zaW9uIGZvciBhIHN1YnNlcXVlbnQgZXZhbC4KLSAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5Ci0gICAgICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0gICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0PSJcIiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdFwiIgotICAgICAgICA7OwotICAgICAgKikKLSAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdCIKLSAgICBlc2FjCi19Ci0KLQotIyBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgYXJnCi0jIEFlc3RoZXRpY2FsbHkgcXVvdGUgQVJHIHRvIGJlIGV2YWxlZCBsYXRlcjsgc2FtZSBhcyBhYm92ZSwKLSMgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgotZnVuY19xdW90ZV9mb3JfZXhwYW5kICgpCi17Ci0gICAgY2FzZSAkMSBpbgotICAgICAgKltcXFxgXCJdKikKLQlteV9hcmc9YCRFQ0hPICJYJDEiIHwgJFhzZWQgXAotCSAgICAtZSAiJGRvdWJsZV9xdW90ZV9zdWJzdCIgLWUgIiRzZWRfZG91YmxlX2JhY2tzbGFzaCJgIDs7Ci0gICAgICAqKQotICAgICAgICBteV9hcmc9IiQxIiA7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJG15X2FyZyBpbgotICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIHRvIGRlbGF5Ci0gICAgICAjIHdvcmQgc3BsaXR0aW5nIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbiBmb3IgYSBzdWJzZXF1ZW50IGV2YWwuCi0gICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQotICAgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotICAgICAgICBteV9hcmc9IlwiJG15X2FyZ1wiIgotICAgICAgICA7OwotICAgIGVzYWMKLQotICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQ9IiRteV9hcmciCi19Ci0KLQotIyBmdW5jX3Nob3dfZXZhbCBjbWQgW2ZhaWxfZXhwXQotIyBVbmxlc3Mgb3B0X3NpbGVudCBpcyB0cnVlLCB0aGVuIG91dHB1dCBDTUQuICBUaGVuLCBpZiBvcHRfZHJ5cnVuIGlzCi0jIG5vdCB0cnVlLCBldmFsdWF0ZSBDTUQuICBJZiB0aGUgZXZhbHVhdGlvbiBvZiBDTUQgZmFpbHMsIGFuZCBGQUlMX0VYUAotIyBpcyBnaXZlbiwgdGhlbiBldmFsdWF0ZSBpdC4KLWZ1bmNfc2hvd19ldmFsICgpCi17Ci0gICAgbXlfY21kPSIkMSIKLSAgICBteV9mYWlsX2V4cD0iJHsyLTp9IgotCi0gICAgJHtvcHRfc2lsZW50LWZhbHNlfSB8fCB7Ci0gICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRteV9jbWQiCi0gICAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCi0gICAgfQotCi0gICAgaWYgJHtvcHRfZHJ5X3J1bi1mYWxzZX07IHRoZW4gOjsgZWxzZQotICAgICAgZXZhbCAiJG15X2NtZCIKLSAgICAgIG15X3N0YXR1cz0kPwotICAgICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLWVxIDA7IHRoZW4gOjsgZWxzZQotCWV2YWwgIihleGl0ICRteV9zdGF0dXMpOyAkbXlfZmFpbF9leHAiCi0gICAgICBmaQotICAgIGZpCi19Ci0KLQotIyBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgY21kIFtmYWlsX2V4cF0KLSMgVW5sZXNzIG9wdF9zaWxlbnQgaXMgdHJ1ZSwgdGhlbiBvdXRwdXQgQ01ELiAgVGhlbiwgaWYgb3B0X2RyeXJ1biBpcwotIyBub3QgdHJ1ZSwgZXZhbHVhdGUgQ01ELiAgSWYgdGhlIGV2YWx1YXRpb24gb2YgQ01EIGZhaWxzLCBhbmQgRkFJTF9FWFAKLSMgaXMgZ2l2ZW4sIHRoZW4gZXZhbHVhdGUgaXQuICBVc2UgdGhlIHNhdmVkIGxvY2FsZSBmb3IgZXZhbHVhdGlvbi4KLWZ1bmNfc2hvd19ldmFsX2xvY2FsZSAoKQotewotICAgIG15X2NtZD0iJDEiCi0gICAgbXlfZmFpbF9leHA9IiR7Mi06fSIKLQotICAgICR7b3B0X3NpbGVudC1mYWxzZX0gfHwgewotICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkbXlfY21kIgotICAgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgotICAgIH0KLQotICAgIGlmICR7b3B0X2RyeV9ydW4tZmFsc2V9OyB0aGVuIDo7IGVsc2UKLSAgICAgIGV2YWwgIiRsdF91c2VyX2xvY2FsZQotCSAgICAkbXlfY21kIgotICAgICAgbXlfc3RhdHVzPSQ/Ci0gICAgICBldmFsICIkbHRfc2FmZV9sb2NhbGUiCi0gICAgICBpZiB0ZXN0ICIkbXlfc3RhdHVzIiAtZXEgMDsgdGhlbiA6OyBlbHNlCi0JZXZhbCAiKGV4aXQgJG15X3N0YXR1cyk7ICRteV9mYWlsX2V4cCIKLSAgICAgIGZpCi0gICAgZmkKLX0KLQotCi0KLQotCi0jIGZ1bmNfdmVyc2lvbgotIyBFY2hvIHZlcnNpb24gbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi1mdW5jX3ZlcnNpb24gKCkKLXsKLSAgICAkU0VEIC1uICcvXiMgJyRQUk9HUkFNJyAoR05VIC8sLyMgd2FycmFudHk7IC8gewotICAgICAgICBzL14jIC8vCi0Jcy9eIyAqJC8vCi0gICAgICAgIHMvXCgoQylcKVsgMC05LC1dKlwoIFsxLTldWzAtOV0qXCkvXDFcMi8KLSAgICAgICAgcAotICAgICB9JyA8ICIkcHJvZ3BhdGgiCi0gICAgIGV4aXQgJD8KLX0KLQotIyBmdW5jX3VzYWdlCi0jIEVjaG8gc2hvcnQgaGVscCBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLWZ1bmNfdXNhZ2UgKCkKLXsKLSAgICAkU0VEIC1uICcvXiMgVXNhZ2U6LywvIyAtaC8gewotICAgICAgICBzL14jIC8vCi0Jcy9eIyAqJC8vCi0Jcy9cJHByb2duYW1lLyckcHJvZ25hbWUnLwotCXAKLSAgICB9JyA8ICIkcHJvZ3BhdGgiCi0gICAgJEVDSE8KLSAgICAkRUNITyAicnVuIFxgJHByb2duYW1lIC0taGVscCB8IG1vcmUnIGZvciBmdWxsIHVzYWdlIgotICAgIGV4aXQgJD8KLX0KLQotIyBmdW5jX2hlbHAKLSMgRWNobyBsb25nIGhlbHAgbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi1mdW5jX2hlbHAgKCkKLXsKLSAgICAkU0VEIC1uICcvXiMgVXNhZ2U6LywvIyBSZXBvcnQgYnVncyB0by8gewotICAgICAgICBzL14jIC8vCi0Jcy9eIyAqJC8vCi0JcypcJHByb2duYW1lKickcHJvZ25hbWUnKgotCXMqXCRob3N0KiciJGhvc3QiJyoKLQlzKlwkU0hFTEwqJyIkU0hFTEwiJyoKLQlzKlwkTFRDQyonIiRMVENDIicqCi0JcypcJExUQ0ZMQUdTKiciJExUQ0ZMQUdTIicqCi0JcypcJExEKiciJExEIicqCi0Jcy9cJHdpdGhfZ251X2xkLyciJHdpdGhfZ251X2xkIicvCi0Jcy9cJGF1dG9tYWtlX3ZlcnNpb24vJyJgKGF1dG9tYWtlIC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCi0Jcy9cJGF1dG9jb25mX3ZlcnNpb24vJyJgKGF1dG9jb25mIC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCi0JcAotICAgICB9JyA8ICIkcHJvZ3BhdGgiCi0gICAgZXhpdCAkPwotfQotCi0jIGZ1bmNfbWlzc2luZ19hcmcgYXJnbmFtZQotIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yIGFuZCBzZXQgZ2xvYmFsCi0jIGV4aXRfY21kLgotZnVuY19taXNzaW5nX2FyZyAoKQotewotICAgIGZ1bmNfZXJyb3IgIm1pc3NpbmcgYXJndW1lbnQgZm9yICQxIgotICAgIGV4aXRfY21kPWV4aXQKLX0KLQotZXhpdF9jbWQ9OgotCi0KLQotCi0KLSMgQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyAkRUNITy4KLWlmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gIHNoaWZ0Ci1lbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKLSAgOgotZWxpZiB0ZXN0ICJYYHsgJEVDSE8gJ1x0JzsgfSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KLSAgIyBZaXBwZWUsICRFQ0hPIHdvcmtzIQotICA6Ci1lbHNlCi0gICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgJEVDSE8gd2lsbCB3b3JrLgotICBleGVjICRTSEVMTCAiJHByb2dwYXRoIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLWZpCi0KLWlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PEVPRgotJCoKLUVPRgotICBleGl0ICRFWElUX1NVQ0NFU1MKLWZpCi0KLW1hZ2ljPSIlJSVNQUdJQyB2YXJpYWJsZSUlJSIKLW1hZ2ljX2V4ZT0iJSUlTUFHSUMgRVhFIHZhcmlhYmxlJSUlIgotCi0jIEdsb2JhbCB2YXJpYWJsZXMuCi0jICRtb2RlIGlzIHVuc2V0Ci1ub25vcHQ9Ci1leGVjdXRlX2RsZmlsZXM9Ci1wcmVzZXJ2ZV9hcmdzPQotbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgotbzJsbz0icy9cXC4ke29iamV4dH1cJC8ubG8vIgotZXh0cmFjdGVkX2FyY2hpdmVzPQotZXh0cmFjdGVkX3NlcmlhbD0wCi0KLW9wdF9kcnlfcnVuPWZhbHNlCi1vcHRfZHVwbGljYXRlX2RlcHM9ZmFsc2UKLW9wdF9zaWxlbnQ9ZmFsc2UKLW9wdF9kZWJ1Zz06Ci0KLSMgSWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgaW4gYW55IG9mIHRoZSBhY3Rpb25zLCB0aGUgY29tbWFuZCBpbiBpdAotIyB3aWxsIGJlIGV4ZWNlZCBhdCB0aGUgZW5kLiAgVGhpcyBwcmV2ZW50cyBoZXJlLWRvY3VtZW50cyBmcm9tIGJlaW5nCi0jIGxlZnQgb3ZlciBieSBzaGVsbHMuCi1leGVjX2NtZD0KLQotIyBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gYXJnLi4uCi0jIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGZvbGxvd2VkIGJ5Ci0jIGEgY29uZmlndXJhdGlvbiBmYWlsdXJlIGhpbnQsIGFuZCBleGl0LgotZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICgpCi17Ci0gICAgZnVuY19lcnJvciAkezErIiRAIn0KLSAgICBmdW5jX2Vycm9yICJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotICAgIGZ1bmNfZmF0YWxfZXJyb3IgIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuIgotfQotCi0KLSMgZnVuY19jb25maWcKLSMgRGlzcGxheSB0aGUgY29uZmlndXJhdGlvbiBmb3IgYWxsIHRoZSB0YWdzIGluIHRoaXMgc2NyaXB0LgotZnVuY19jb25maWcgKCkKLXsKLSAgICByZV9iZWdpbmNmPSdeIyAjIyMgQkVHSU4gTElCVE9PTCcKLSAgICByZV9lbmRjZj0nXiMgIyMjIEVORCBMSUJUT09MJwotCi0gICAgIyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24uCi0gICAgJFNFRCAiMSwvJHJlX2JlZ2luY2YgQ09ORklHL2Q7LyRyZV9lbmRjZiBDT05GSUcvLFwkZCIgPCAiJHByb2dwYXRoIgotCi0gICAgIyBOb3cgcHJpbnQgdGhlIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgdGFncy4KLSAgICBmb3IgdGFnbmFtZSBpbiAkdGFnbGlzdDsgZG8KLSAgICAgICRTRUQgLW4gIi8kcmVfYmVnaW5jZiBUQUcgQ09ORklHOiAkdGFnbmFtZVwkLywvJHJlX2VuZGNmIFRBRyBDT05GSUc6ICR0YWduYW1lXCQvcCIgPCAiJHByb2dwYXRoIgotICAgIGRvbmUKLQotICAgIGV4aXQgJD8KLX0KLQotIyBmdW5jX2ZlYXR1cmVzCi0jIERpc3BsYXkgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4KLWZ1bmNfZmVhdHVyZXMgKCkKLXsKLSAgICAkRUNITyAiaG9zdDogJGhvc3QiCi0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICRFQ0hPICJlbmFibGUgc2hhcmVkIGxpYnJhcmllcyIKLSAgICBlbHNlCi0gICAgICAkRUNITyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGZpCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgJEVDSE8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgICRFQ0hPICJkaXNhYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZmkKLQotICAgIGV4aXQgJD8KLX0KLQotIyBmdW5jX2VuYWJsZV90YWcgdGFnbmFtZQotIyBWZXJpZnkgdGhhdCBUQUdOQU1FIGlzIHZhbGlkLCBhbmQgZWl0aGVyIGZsYWcgYW4gZXJyb3IgYW5kIGV4aXQsIG9yCi0jIGVuYWJsZSB0aGUgVEFHTkFNRSB0YWcuICBXZSBhbHNvIGFkZCBUQUdOQU1FIHRvIHRoZSBnbG9iYWwgJHRhZ2xpc3QKLSMgdmFyaWFibGUgaGVyZS4KLWZ1bmNfZW5hYmxlX3RhZyAoKQotewotICAjIEdsb2JhbCB2YXJpYWJsZToKLSAgdGFnbmFtZT0iJDEiCi0KLSAgcmVfYmVnaW5jZj0iXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWVcJCIKLSAgcmVfZW5kY2Y9Il4jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZVwkIgotICBzZWRfZXh0cmFjdGNmPSIvJHJlX2JlZ2luY2YvLC8kcmVfZW5kY2YvcCIKLQotICAjIFZhbGlkYXRlIHRhZ25hbWUuCi0gIGNhc2UgJHRhZ25hbWUgaW4KLSAgICAqWyEtX0EtWmEtejAtOSwvXSopCi0gICAgICBmdW5jX2ZhdGFsX2Vycm9yICJpbnZhbGlkIHRhZyBuYW1lOiAkdGFnbmFtZSIKLSAgICAgIDs7Ci0gIGVzYWMKLQotICAjIERvbid0IHRlc3QgZm9yIHRoZSAiZGVmYXVsdCIgQyB0YWcsIGFzIHdlIGtub3cgaXQncwotICAjIHRoZXJlIGJ1dCBub3Qgc3BlY2lhbGx5IG1hcmtlZC4KLSAgY2FzZSAkdGFnbmFtZSBpbgotICAgIENDKSA7OwotICAgICopCi0gICAgICBpZiAkR1JFUCAiJHJlX2JlZ2luY2YiICIkcHJvZ3BhdGgiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCXRhZ2xpc3Q9IiR0YWdsaXN0ICR0YWduYW1lIgotCi0JIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4gIEJlIGNhcmVmdWwgdG8gcXVvdGUgdGhlIHBhdGgKLQkjIGFuZCB0aGUgc2VkIHNjcmlwdCwgdG8gYXZvaWQgc3BsaXR0aW5nIG9uIHdoaXRlc3BhY2UsIGJ1dAotCSMgYWxzbyBkb24ndCB1c2Ugbm9uLXBvcnRhYmxlIHF1b3RlcyB3aXRoaW4gYmFja3F1b3RlcyB3aXRoaW4KLQkjIHF1b3RlcyB3ZSBoYXZlIHRvIGRvIGl0IGluIDIgc3RlcHM6Ci0JZXh0cmFjdGVkY2Y9YCRTRUQgLW4gLWUgIiRzZWRfZXh0cmFjdGNmIiA8ICIkcHJvZ3BhdGgiYAotCWV2YWwgIiRleHRyYWN0ZWRjZiIKLSAgICAgIGVsc2UKLQlmdW5jX2Vycm9yICJpZ25vcmluZyB1bmtub3duIHRhZyAkdGFnbmFtZSIKLSAgICAgIGZpCi0gICAgICA7OwotICBlc2FjCi19Ci0KLSMgUGFyc2Ugb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5LiAgVGhpcyBjb21lcyBhcyBzb29uIGFzIHBvc3NpYmxlIGluCi0jIHRoZSBzY3JpcHQgdG8gbWFrZSB0aGluZ3MgbGlrZSBgbGlidG9vbCAtLXZlcnNpb24nIGhhcHBlbiBxdWlja2x5LgotewotCi0gICMgU2hvcnRoYW5kIGZvciAtLW1vZGU9Zm9vLCBvbmx5IHZhbGlkIGFzIHRoZSBmaXJzdCBhcmd1bWVudAotICBjYXNlICQxIGluCi0gIGNsZWFufGNsZWF8Y2xlfGNsKQotICAgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNsZWFuICR7MSsiJEAifTsgc2hpZnQKLSAgICA7OwotICBjb21waWxlfGNvbXBpbHxjb21waXxjb21wfGNvbXxjb3xjKQotICAgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNvbXBpbGUgJHsxKyIkQCJ9OyBzaGlmdAotICAgIDs7Ci0gIGV4ZWN1dGV8ZXhlY3V0fGV4ZWN1fGV4ZWN8ZXhlfGV4fGUpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZXhlY3V0ZSAkezErIiRAIn07IHNoaWZ0Ci0gICAgOzsKLSAgZmluaXNofGZpbmlzfGZpbml8ZmlufGZpfGYpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZmluaXNoICR7MSsiJEAifTsgc2hpZnQKLSAgICA7OwotICBpbnN0YWxsfGluc3RhbHxpbnN0YXxpbnN0fGluc3xpbnxpKQotICAgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGluc3RhbGwgJHsxKyIkQCJ9OyBzaGlmdAotICAgIDs7Ci0gIGxpbmt8bGlufGxpfGwpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgbGluayAkezErIiRAIn07IHNoaWZ0Ci0gICAgOzsKLSAgdW5pbnN0YWxsfHVuaW5zdGFsfHVuaW5zdGF8dW5pbnN0fHVuaW5zfHVuaW58dW5pfHVufHUpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgdW5pbnN0YWxsICR7MSsiJEAifTsgc2hpZnQKLSAgICA7OwotICBlc2FjCi0KLSAgIyBQYXJzZSBub24tbW9kZSBzcGVjaWZpYyBhcmd1bWVudHM6Ci0gIHdoaWxlIHRlc3QgIiQjIiAtZ3QgMDsgZG8KLSAgICBvcHQ9IiQxIgotICAgIHNoaWZ0Ci0KLSAgICBjYXNlICRvcHQgaW4KLSAgICAgIC0tY29uZmlnKQkJZnVuY19jb25maWcJCQkJCTs7Ci0KLSAgICAgIC0tZGVidWcpCQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0IgotCQkJZnVuY19lY2hvICJlbmFibGluZyBzaGVsbCB0cmFjZSBtb2RlIgotCQkJb3B0X2RlYnVnPSdzZXQgLXgnCi0JCQkkb3B0X2RlYnVnCi0JCQk7OwotCi0gICAgICAtZGxvcGVuKQkJdGVzdCAiJCMiIC1lcSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgIiRvcHQiICYmIGJyZWFrCi0JCQlleGVjdXRlX2RsZmlsZXM9IiRleGVjdXRlX2RsZmlsZXMgJDEiCi0JCQlzaGlmdAotCQkJOzsKLQotICAgICAgLS1kcnktcnVuIHwgLW4pCW9wdF9kcnlfcnVuPToJCQkJCTs7Ci0gICAgICAtLWZlYXR1cmVzKSAgICAgICBmdW5jX2ZlYXR1cmVzCQkJCQk7OwotICAgICAgLS1maW5pc2gpCQltb2RlPSJmaW5pc2giCQkJCQk7OwotCi0gICAgICAtLW1vZGUpCQl0ZXN0ICIkIyIgLWVxIDAgJiYgZnVuY19taXNzaW5nX2FyZyAiJG9wdCIgJiYgYnJlYWsKLQkJCWNhc2UgJDEgaW4KLQkJCSAgIyBWYWxpZCBtb2RlIGFyZ3VtZW50czoKLQkJCSAgY2xlYW4pCTs7Ci0JCQkgIGNvbXBpbGUpCTs7Ci0JCQkgIGV4ZWN1dGUpCTs7Ci0JCQkgIGZpbmlzaCkJOzsKLQkJCSAgaW5zdGFsbCkJOzsKLQkJCSAgbGluaykJCTs7Ci0JCQkgIHJlbGluaykJOzsKLQkJCSAgdW5pbnN0YWxsKQk7OwotCi0JCQkgICMgQ2F0Y2ggYW55dGhpbmcgZWxzZSBhcyBhbiBlcnJvcgotCQkJICAqKSBmdW5jX2Vycm9yICJpbnZhbGlkIGFyZ3VtZW50IGZvciAkb3B0IgotCQkJICAgICBleGl0X2NtZD1leGl0Ci0JCQkgICAgIGJyZWFrCi0JCQkgICAgIDs7Ci0JCSAgICAgICAgZXNhYwotCi0JCQltb2RlPSIkMSIKLQkJCXNoaWZ0Ci0JCQk7OwotCi0gICAgICAtLXByZXNlcnZlLWR1cC1kZXBzKQotCQkJb3B0X2R1cGxpY2F0ZV9kZXBzPToJCQkJOzsKLQotICAgICAgLS1xdWlldHwtLXNpbGVudCkJcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJG9wdCIKLQkJCW9wdF9zaWxlbnQ9OgotCQkJOzsKLQotICAgICAgLS12ZXJib3NlfCAtdikJcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJG9wdCIKLQkJCW9wdF9zaWxlbnQ9ZmFsc2UKLQkJCTs7Ci0KLSAgICAgIC0tdGFnKQkJdGVzdCAiJCMiIC1lcSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgIiRvcHQiICYmIGJyZWFrCi0JCQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0ICQxIgotCQkJZnVuY19lbmFibGVfdGFnICIkMSIJIyB0YWduYW1lIGlzIHNldCBoZXJlCi0JCQlzaGlmdAotCQkJOzsKLQotICAgICAgIyBTZXBhcmF0ZSBvcHRhcmdzIHRvIGxvbmcgb3B0aW9uczoKLSAgICAgIC1kbG9wZW49KnwtLW1vZGU9KnwtLXRhZz0qKQotCQkJZnVuY19vcHRfc3BsaXQgIiRvcHQiCi0JCQlzZXQgZHVtbXkgIiRmdW5jX29wdF9zcGxpdF9vcHQiICIkZnVuY19vcHRfc3BsaXRfYXJnIiAkezErIiRAIn0KLQkJCXNoaWZ0Ci0JCQk7OwotCi0gICAgICAtXD98LWgpCQlmdW5jX3VzYWdlCQkJCQk7OwotICAgICAgLS1oZWxwKQkJb3B0X2hlbHA9OgkJCQkJOzsKLSAgICAgIC0tdmVyc2lvbikJZnVuY192ZXJzaW9uCQkJCQk7OwotCi0gICAgICAtKikJCWZ1bmNfZmF0YWxfaGVscCAidW5yZWNvZ25pemVkIG9wdGlvbiBcYCRvcHQnIgk7OwotCi0gICAgICAqKQkJbm9ub3B0PSIkb3B0IgotCQkJYnJlYWsKLQkJCTs7Ci0gICAgZXNhYwotICBkb25lCi0KLQotICBjYXNlICRob3N0IGluCi0gICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKnB3MzIqIHwgKmNlZ2NjKikKLSAgICAgICMgZG9uJ3QgZWxpbWluYXRlIGR1cGxpY2F0aW9ucyBpbiAkcG9zdGRlcHMgYW5kICRwcmVkZXBzCi0gICAgICBvcHRfZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPToKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9JG9wdF9kdXBsaWNhdGVfZGVwcwotICAgICAgOzsKLSAgZXNhYwotCi0gICMgSGF2aW5nIHdhcm5lZCBhYm91dCBhbGwgbWlzLXNwZWNpZmllZCBvcHRpb25zLCBiYWlsIG91dCBpZgotICAjIGFueXRoaW5nIHdhcyB3cm9uZy4KLSAgJGV4aXRfY21kICRFWElUX0ZBSUxVUkUKLX0KLQotIyBmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2gKLSMgRW5zdXJlIHRoYXQgd2UgYXJlIHVzaW5nIG00IG1hY3JvcywgYW5kIGxpYnRvb2wgc2NyaXB0IGZyb20gdGhlIHNhbWUKLSMgcmVsZWFzZSBvZiBsaWJ0b29sLgotZnVuY19jaGVja192ZXJzaW9uX21hdGNoICgpCi17Ci0gIGlmIHRlc3QgIiRwYWNrYWdlX3JldmlzaW9uIiAhPSAiJG1hY3JvX3JldmlzaW9uIjsgdGhlbgotICAgIGlmIHRlc3QgIiRWRVJTSU9OIiAhPSAiJG1hY3JvX3ZlcnNpb24iOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICIkbWFjcm9fdmVyc2lvbiI7IHRoZW4KLSAgICAgICAgY2F0ID4mMiA8PF9MVF9FT0YKLSRwcm9nbmFtZTogVmVyc2lvbiBtaXNtYXRjaCBlcnJvci4gIFRoaXMgaXMgJFBBQ0tBR0UgJFZFUlNJT04sIGJ1dCB0aGUKLSRwcm9nbmFtZTogZGVmaW5pdGlvbiBvZiB0aGlzIExUX0lOSVQgY29tZXMgZnJvbSBhbiBvbGRlciByZWxlYXNlLgotJHByb2duYW1lOiBZb3Ugc2hvdWxkIHJlY3JlYXRlIGFjbG9jYWwubTQgd2l0aCBtYWNyb3MgZnJvbSAkUEFDS0FHRSAkVkVSU0lPTgotJHByb2duYW1lOiBhbmQgcnVuIGF1dG9jb25mIGFnYWluLgotX0xUX0VPRgotICAgICAgZWxzZQotICAgICAgICBjYXQgPiYyIDw8X0xUX0VPRgotJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgYnV0IHRoZQotJHByb2duYW1lOiBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tICRQQUNLQUdFICRtYWNyb192ZXJzaW9uLgotJHByb2duYW1lOiBZb3Ugc2hvdWxkIHJlY3JlYXRlIGFjbG9jYWwubTQgd2l0aCBtYWNyb3MgZnJvbSAkUEFDS0FHRSAkVkVSU0lPTgotJHByb2duYW1lOiBhbmQgcnVuIGF1dG9jb25mIGFnYWluLgotX0xUX0VPRgotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBjYXQgPiYyIDw8X0xUX0VPRgotJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgcmV2aXNpb24gJHBhY2thZ2VfcmV2aXNpb24sCi0kcHJvZ25hbWU6IGJ1dCB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIExUX0lOSVQgY29tZXMgZnJvbSByZXZpc2lvbiAkbWFjcm9fcmV2aXNpb24uCi0kcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tIHJldmlzaW9uICRwYWNrYWdlX3JldmlzaW9uCi0kcHJvZ25hbWU6IG9mICRQQUNLQUdFICRWRVJTSU9OIGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCi1fTFRfRU9GCi0gICAgZmkKLQotICAgIGV4aXQgJEVYSVRfTUlTTUFUQ0gKLSAgZmkKLX0KLQotCi0jIyAtLS0tLS0tLS0tLSAjIwotIyMgICAgTWFpbi4gICAgIyMKLSMjIC0tLS0tLS0tLS0tICMjCi0KLSRvcHRfaGVscCB8fCB7Ci0gICMgU2FuaXR5IGNoZWNrcyBmaXJzdDoKLSAgZnVuY19jaGVja192ZXJzaW9uX21hdGNoCi0KLSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCi0gICAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IgotICBmaQotCi0gIHRlc3QgLXogIiRtb2RlIiAmJiBmdW5jX2ZhdGFsX2Vycm9yICJlcnJvcjogeW91IG11c3Qgc3BlY2lmeSBhIE1PREUuIgotCi0KLSAgIyBEYXJ3aW4gc3Vja3MKLSAgZXZhbCBzdGRfc2hyZXh0PVwiJHNocmV4dF9jbWRzXCIKLQotCi0gICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCi0gIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCi0gICAgZnVuY19lcnJvciAidW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIgotICAgICRFQ0hPICIkaGVscCIgMT4mMgotICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICBmaQotCi0gICMgQ2hhbmdlIHRoZSBoZWxwIG1lc3NhZ2UgdG8gYSBtb2RlLXNwZWNpZmljIG9uZS4KLSAgZ2VuZXJpY19oZWxwPSIkaGVscCIKLSAgaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCAtLW1vZGU9JG1vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLX0KLQotCi0jIGZ1bmNfbGFsaWJfcCBmaWxlCi0jIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIGAubGEnIGxpYnJhcnkgb3IgYC5sbycgb2JqZWN0IGZpbGUuCi0jIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0Ci0jIGRldGVybWluZWQgaW1wb3N0ZXJzLgotZnVuY19sYWxpYl9wICgpCi17Ci0gICAgdGVzdCAtZiAiJDEiICYmCi0gICAgICAkU0VEIC1lIDRxICIkMSIgMj4vZGV2L251bGwgXAotICAgICAgICB8ICRHUkVQICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIgPiAvZGV2L251bGwgMj4mMQotfQotCi0jIGZ1bmNfbGFsaWJfdW5zYWZlX3AgZmlsZQotIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCBgLmxhJyBsaWJyYXJ5IG9yIGAubG8nIG9iamVjdCBmaWxlLgotIyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHNhbWUgY2hlY2sgYXMgZnVuY19sYWxpYl9wIHdpdGhvdXQKLSMgcmVzb3J0aW5nIHRvIGV4dGVybmFsIHByb2dyYW1zLiAgVG8gdGhpcyBlbmQsIGl0IHJlZGlyZWN0cyBzdGRpbiBhbmQKLSMgY2xvc2VzIGl0IGFmdGVyd2FyZHMsIHdpdGhvdXQgc2F2aW5nIHRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IuCi0jIEFzIGEgc2FmZXR5IG1lYXN1cmUsIHVzZSBpdCBvbmx5IHdoZXJlIGEgbmVnYXRpdmUgcmVzdWx0IHdvdWxkIGJlCi0jIGZhdGFsIGFueXdheS4gIFdvcmtzIGlmIGBmaWxlJyBkb2VzIG5vdCBleGlzdC4KLWZ1bmNfbGFsaWJfdW5zYWZlX3AgKCkKLXsKLSAgICBsYWxpYl9wPW5vCi0gICAgaWYgdGVzdCAtZiAiJDEiICYmIHRlc3QgLXIgIiQxIiAmJiBleGVjIDU8JjAgPCIkMSI7IHRoZW4KLQlmb3IgbGFsaWJfcF9sIGluIDEgMiAzIDQKLQlkbwotCSAgICByZWFkIGxhbGliX3BfbGluZQotCSAgICBjYXNlICIkbGFsaWJfcF9saW5lIiBpbgotCQlcI1wgR2VuZXJhdGVkXCBieVwgKiRQQUNLQUdFKiApIGxhbGliX3A9eWVzOyBicmVhazs7Ci0JICAgIGVzYWMKLQlkb25lCi0JZXhlYyAwPCY1IDU8Ji0KLSAgICBmaQotICAgIHRlc3QgIiRsYWxpYl9wIiA9IHllcwotfQotCi0jIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wIGZpbGUKLSMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQKLSMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKLSMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCi1mdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAoKQotewotICAgIGZ1bmNfbGFsaWJfcCAiJDEiCi19Ci0KLSMgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wIGZpbGUKLSMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBleGVjdXRhYmxlCi0jIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0Ci0jIGRldGVybWluZWQgaW1wb3N0ZXJzLgotZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICgpCi17Ci0gICAgZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXg9Ci0gICAgY2FzZSAkMSBpbgotICAgICouZXhlKSA7OwotICAgICopIGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4PS5leGUgOzsKLSAgICBlc2FjCi0gICAgJEdSRVAgIiRtYWdpY19leGUiICIkMSRmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeCIgPi9kZXYvbnVsbCAyPiYxCi19Ci0KLSMgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSBmaWxlCi0jIEFzc3VtZXMgZmlsZSBpcyBhbiBsdHdyYXBwZXJfZXhlY3V0YWJsZQotIyB1c2VzICRmaWxlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZmlsZW5hbWUgZm9yIGEKLSMgdGVtcG9yYXJ5IGx0d3JhcHBlcl9zY3JpcHQuCi1mdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICgpCi17Ci0gICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQ9IiIKLSAgICBpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiQxIjsgdGhlbgotCWZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiQxIiAiIiAiLiIKLQlmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQlmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdD0iJGZ1bmNfZGlybmFtZV9yZXN1bHQvJG9iamRpci8ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdH1fbHRzaHdyYXBwZXIiCi0gICAgZmkKLX0KLQotIyBmdW5jX2x0d3JhcHBlcl9wIGZpbGUKLSMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgb3Igd3JhcHBlciBleGVjdXRhYmxlCi0jIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0Ci0jIGRldGVybWluZWQgaW1wb3N0ZXJzLgotZnVuY19sdHdyYXBwZXJfcCAoKQotewotICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkMSIgfHwgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkMSIKLX0KLQotCi0jIGZ1bmNfZXhlY3V0ZV9jbWRzIGNvbW1hbmRzIGZhaWxfY21kCi0jIEV4ZWN1dGUgdGlsZGUtZGVsaW1pdGVkIENPTU1BTkRTLgotIyBJZiBGQUlMX0NNRCBpcyBnaXZlbiwgZXZhbCB0aGF0IHVwb24gZmFpbHVyZS4KLSMgRkFJTF9DTUQgbWF5IHJlYWQtYWNjZXNzIHRoZSBjdXJyZW50IGNvbW1hbmQgaW4gdmFyaWFibGUgQ01EIQotZnVuY19leGVjdXRlX2NtZHMgKCkKLXsKLSAgICAkb3B0X2RlYnVnCi0gICAgc2F2ZV9pZnM9JElGUzsgSUZTPSd+JwotICAgIGZvciBjbWQgaW4gJDE7IGRvCi0gICAgICBJRlM9JHNhdmVfaWZzCi0gICAgICBldmFsIGNtZD1cIiRjbWRcIgotICAgICAgZnVuY19zaG93X2V2YWwgIiRjbWQiICIkezItOn0iCi0gICAgZG9uZQotICAgIElGUz0kc2F2ZV9pZnMKLX0KLQotCi0jIGZ1bmNfc291cmNlIGZpbGUKLSMgU291cmNlIEZJTEUsIGFkZGluZyBkaXJlY3RvcnkgY29tcG9uZW50IGlmIG5lY2Vzc2FyeS4KLSMgTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gY3lnd2luL21pbmd3IHRvIGFwcGVuZCBhIGRvdCB0bwotIyBGSUxFIGV2ZW4gaWYgYm90aCBGSUxFIGFuZCBGSUxFLmV4ZSBleGlzdDogYXV0b21hdGljLWFwcGVuZC0uZXhlCi0jIGJlaGF2aW9yIGhhcHBlbnMgb25seSBmb3IgZXhlYygzKSwgbm90IGZvciBvcGVuKDIpISAgQWxzbywgc291cmNpbmcKLSMgYEZJTEUuJyBkb2VzIG5vdCB3b3JrIG9uIGN5Z3dpbiBtYW5hZ2VkIG1vdW50cy4KLWZ1bmNfc291cmNlICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgIGNhc2UgJDEgaW4KLSAgICAqLyogfCAqXFwqKQkuICIkMSIgOzsKLSAgICAqKQkJLiAiLi8kMSIgOzsKLSAgICBlc2FjCi19Ci0KLQotIyBmdW5jX2luZmVyX3RhZyBhcmcKLSMgSW5mZXIgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGlmIGFueSBhcmUgYXZhaWxhYmxlIGFuZAotIyBpZiBvbmUgd2Fzbid0IGNob3NlbiB2aWEgdGhlICItLXRhZyIgY29tbWFuZCBsaW5lIG9wdGlvbi4KLSMgT25seSBhdHRlbXB0IHRoaXMgaWYgdGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUKLSMgY29tbWFuZCBkb2Vzbid0IG1hdGNoIHRoZSBkZWZhdWx0IGNvbXBpbGVyLgotIyBhcmcgaXMgdXN1YWxseSBvZiB0aGUgZm9ybSAnZ2NjIC4uLicKLWZ1bmNfaW5mZXJfdGFnICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgIGlmIHRlc3QgLW4gIiRhdmFpbGFibGVfdGFncyIgJiYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCi0gICAgICBDQ19xdW90ZWQ9Ci0gICAgICBmb3IgYXJnIGluICRDQzsgZG8KLSAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKLQlDQ19xdW90ZWQ9IiRDQ19xdW90ZWQgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotICAgICAgZG9uZQotICAgICAgY2FzZSAkQCBpbgotICAgICAgIyBCbGFua3MgaW4gdGhlIGNvbW1hbmQgbWF5IGhhdmUgYmVlbiBzdHJpcHBlZCBieSB0aGUgY2FsbGluZyBzaGVsbCwKLSAgICAgICMgYnV0IG5vdCBmcm9tIHRoZSBDQyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIGNvbmZpZ3VyZSB3YXMgcnVuLgotICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiBgJEVDSE8gJENDYCAiKiB8ICJgJEVDSE8gJENDYCAiKiB8ICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiIGAkRUNITyAkQ0NfcXVvdGVkYCAiKiB8ICJgJEVDSE8gJENDX3F1b3RlZGAgIiopIDs7Ci0gICAgICAjIEJsYW5rcyBhdCB0aGUgc3RhcnQgb2YgJGJhc2VfY29tcGlsZSB3aWxsIGNhdXNlIHRoaXMgdG8gZmFpbAotICAgICAgIyBpZiB3ZSBkb24ndCBjaGVjayBmb3IgdGhlbSBhcyB3ZWxsLgotICAgICAgKikKLQlmb3IgeiBpbiAkYXZhaWxhYmxlX3RhZ3M7IGRvCi0JICBpZiAkR1JFUCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHokIiA8ICIkcHJvZ3BhdGgiID4gL2Rldi9udWxsOyB0aGVuCi0JICAgICMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uCi0JICAgIGV2YWwgImAke1NFRH0gLW4gLWUgJy9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC9wJyA8ICRwcm9ncGF0aGAiCi0JICAgIENDX3F1b3RlZD0KLQkgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCi0JICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotCSAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCi0JICAgICAgQ0NfcXVvdGVkPSIkQ0NfcXVvdGVkICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQkgICAgZG9uZQotCSAgICBjYXNlICIkQCAiIGluCi0JICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiBgJEVDSE8gJENDYCAiKiB8ICJgJEVDSE8gJENDYCAiKiB8ICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiIGAkRUNITyAkQ0NfcXVvdGVkYCAiKiB8ICJgJEVDSE8gJENDX3F1b3RlZGAgIiopCi0JICAgICAgIyBUaGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZSBjb21tYW5kIG1hdGNoZXMKLQkgICAgICAjIHRoZSBvbmUgaW4gdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uLgotCSAgICAgICMgQXNzdW1lIHRoaXMgaXMgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uIHdlIHdhbnQuCi0JICAgICAgdGFnbmFtZT0kegotCSAgICAgIGJyZWFrCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkKLQlkb25lCi0JIyBJZiAkdGFnbmFtZSBzdGlsbCBpc24ndCBzZXQsIHRoZW4gbm8gdGFnZ2VkIGNvbmZpZ3VyYXRpb24KLQkjIHdhcyBmb3VuZCBhbmQgbGV0IHRoZSB1c2VyIGtub3cgdGhhdCB0aGUgIi0tdGFnIiBjb21tYW5kCi0JIyBsaW5lIG9wdGlvbiBtdXN0IGJlIHVzZWQuCi0JaWYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCi0JICBmdW5jX2VjaG8gInVuYWJsZSB0byBpbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiIKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgInNwZWNpZnkgYSB0YWcgd2l0aCBcYC0tdGFnJyIKLSMJZWxzZQotIwkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgJHRhZ25hbWUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgIGZpCi19Ci0KLQotCi0jIGZ1bmNfd3JpdGVfbGlidG9vbF9vYmplY3Qgb3V0cHV0X25hbWUgcGljX25hbWUgbm9ucGljX25hbWUKLSMgQ3JlYXRlIGEgbGlidG9vbCBvYmplY3QgZmlsZSAoYW5hbG9nb3VzIHRvIGEgIi5sYSIgZmlsZSksCi0jIGJ1dCBkb24ndCBjcmVhdGUgaXQgaWYgd2UncmUgZG9pbmcgYSBkcnkgcnVuLgotZnVuY193cml0ZV9saWJ0b29sX29iamVjdCAoKQotewotICAgIHdyaXRlX2xpYm9iaj0kezF9Ci0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIHdyaXRlX2xvYmo9XCckezJ9XCcKLSAgICBlbHNlCi0gICAgICB3cml0ZV9sb2JqPW5vbmUKLSAgICBmaQotCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgd3JpdGVfb2xkb2JqPVwnJHszfVwnCi0gICAgZWxzZQotICAgICAgd3JpdGVfb2xkb2JqPW5vbmUKLSAgICBmaQotCi0gICAgJG9wdF9kcnlfcnVuIHx8IHsKLSAgICAgIGNhdCA+JHt3cml0ZV9saWJvYmp9VCA8PEVPRgotIyAkd3JpdGVfbGlib2JqIC0gYSBsaWJ0b29sIG9iamVjdCBmaWxlCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KLSMKLSMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQotIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCi0KLSMgTmFtZSBvZiB0aGUgUElDIG9iamVjdC4KLXBpY19vYmplY3Q9JHdyaXRlX2xvYmoKLQotIyBOYW1lIG9mIHRoZSBub24tUElDIG9iamVjdAotbm9uX3BpY19vYmplY3Q9JHdyaXRlX29sZG9iagotCi1FT0YKLSAgICAgICRNViAiJHt3cml0ZV9saWJvYmp9VCIgIiR7d3JpdGVfbGlib2JqfSIKLSAgICB9Ci19Ci0KLSMgZnVuY19tb2RlX2NvbXBpbGUgYXJnLi4uCi1mdW5jX21vZGVfY29tcGlsZSAoKQotewotICAgICRvcHRfZGVidWcKLSAgICAjIEdldCB0aGUgY29tcGlsYXRpb24gY29tbWFuZCBhbmQgdGhlIHNvdXJjZSBmaWxlLgotICAgIGJhc2VfY29tcGlsZT0KLSAgICBzcmNmaWxlPSIkbm9ub3B0IiAgIyAgYWx3YXlzIGtlZXAgYSBub24tZW1wdHkgdmFsdWUgaW4gInNyY2ZpbGUiCi0gICAgc3VwcHJlc3Nfb3B0PXllcwotICAgIHN1cHByZXNzX291dHB1dD0KLSAgICBhcmdfbW9kZT1ub3JtYWwKLSAgICBsaWJvYmo9Ci0gICAgbGF0ZXI9Ci0gICAgcGllX2ZsYWc9Ci0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgJGFyZ19tb2RlIGluCi0gICAgICBhcmcgICkKLQkjIGRvIG5vdCAiY29udGludWUiLiAgSW5zdGVhZCwgYWRkIHRoaXMgdG8gYmFzZV9jb21waWxlCi0JbGFzdGFyZz0iJGFyZyIKLQlhcmdfbW9kZT1ub3JtYWwKLQk7OwotCi0gICAgICB0YXJnZXQgKQotCWxpYm9iaj0iJGFyZyIKLQlhcmdfbW9kZT1ub3JtYWwKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIG5vcm1hbCApCi0JIyBBY2NlcHQgYW55IGNvbW1hbmQtbGluZSBvcHRpb25zLgotCWNhc2UgJGFyZyBpbgotCS1vKQotCSAgdGVzdCAtbiAiJGxpYm9iaiIgJiYgXAotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJ5b3UgY2Fubm90IHNwZWNpZnkgXGAtbycgbW9yZSB0aGFuIG9uY2UiCi0JICBhcmdfbW9kZT10YXJnZXQKLQkgIGNvbnRpbnVlCi0JICA7OwotCi0JLXBpZSB8IC1mcGllIHwgLWZQSUUpCi0gICAgICAgICAgcGllX2ZsYWc9IiRwaWVfZmxhZyAkYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0KLQktc2hhcmVkIHwgLXN0YXRpYyB8IC1wcmVmZXItcGljIHwgLXByZWZlci1ub24tcGljKQotCSAgbGF0ZXI9IiRsYXRlciAkYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0KLQktbm8tc3VwcHJlc3MpCi0JICBzdXBwcmVzc19vcHQ9bm8KLQkgIGNvbnRpbnVlCi0JICA7OwotCi0JLVhjb21waWxlcikKLQkgIGFyZ19tb2RlPWFyZyAgIyAgdGhlIG5leHQgb25lIGdvZXMgaW50byB0aGUgImJhc2VfY29tcGlsZSIgYXJnIGxpc3QKLQkgIGNvbnRpbnVlICAgICAgIyAgVGhlIGN1cnJlbnQgInNyY2ZpbGUiIHdpbGwgZWl0aGVyIGJlIHJldGFpbmVkIG9yCi0JICA7OyAgICAgICAgICAgICMgIHJlcGxhY2VkIGxhdGVyLiAgSSB3b3VsZCBndWVzcyB0aGF0IHdvdWxkIGJlIGEgYnVnLgotCi0JLVdjLCopCi0JICBmdW5jX3N0cmlwbmFtZSAnLVdjLCcgJycgIiRhcmciCi0JICBhcmdzPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkgIGxhc3Rhcmc9Ci0JICBzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKLQkgIGZvciBhcmcgaW4gJGFyZ3M7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotCSAgICBsYXN0YXJnPSIkbGFzdGFyZyAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIGZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGxhc3RhcmciCi0JICBsYXN0YXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQotCSAgIyBBZGQgdGhlIGFyZ3VtZW50cyB0byBiYXNlX2NvbXBpbGUuCi0JICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQotCSopCi0JICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCi0JICAjIFRoZSBwcmV2aW91cyAic3JjZmlsZSIgYmVjb21lcyB0aGUgY3VycmVudCBhcmd1bWVudC4KLQkgICMKLQkgIGxhc3Rhcmc9IiRzcmNmaWxlIgotCSAgc3JjZmlsZT0iJGFyZyIKLQkgIDs7Ci0JZXNhYyAgIyAgY2FzZSAkYXJnCi0JOzsKLSAgICAgIGVzYWMgICAgIyAgY2FzZSAkYXJnX21vZGUKLQotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KLSAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRsYXN0YXJnIgotICAgICAgYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLSAgICBkb25lICMgZm9yIGFyZwotCi0gICAgY2FzZSAkYXJnX21vZGUgaW4KLSAgICBhcmcpCi0gICAgICBmdW5jX2ZhdGFsX2Vycm9yICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIGFyZ3VtZW50IGZvciAtWGNvbXBpbGUiCi0gICAgICA7OwotICAgIHRhcmdldCkKLSAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2l0aCBcYC1vJyIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IG9iamVjdC4KLSAgICAgIHRlc3QgLXogIiRsaWJvYmoiICYmIHsKLQlmdW5jX2Jhc2VuYW1lICIkc3JjZmlsZSIKLQlsaWJvYmo9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLSAgICAgIH0KLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBSZWNvZ25pemUgc2V2ZXJhbCBkaWZmZXJlbnQgZmlsZSBzdWZmaXhlcy4KLSAgICAjIElmIHRoZSB1c2VyIHNwZWNpZmllcyAtbyBmaWxlLm8sIGl0IGlzIHJlcGxhY2VkIHdpdGggZmlsZS5sbwotICAgIGNhc2UgJGxpYm9iaiBpbgotICAgICouW2NDRlNpZm1zb10gfCBcCi0gICAgKi5hZGEgfCAqLmFkYiB8ICouYWRzIHwgKi5hc20gfCBcCi0gICAgKi5jKysgfCAqLmNjIHwgKi5paSB8ICouY2xhc3MgfCAqLmNwcCB8ICouY3h4IHwgXAotICAgICouW2ZGXVswOV0/IHwgKi5mb3IgfCAqLmphdmEgfCAqLm9iaiB8ICouc3gpCi0gICAgICBmdW5jX3hmb3JtICIkbGlib2JqIgotICAgICAgbGlib2JqPSRmdW5jX3hmb3JtX3Jlc3VsdAotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBjYXNlICRsaWJvYmogaW4KLSAgICAqLmxvKSBmdW5jX2xvMm8gIiRsaWJvYmoiOyBvYmo9JGZ1bmNfbG8yb19yZXN1bHQgOzsKLSAgICAqKQotICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkbGlib2JqJyIKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQotCi0gICAgZm9yIGFyZyBpbiAkbGF0ZXI7IGRvCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1zaGFyZWQpCi0JdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIFwKLQkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAiY2FuIG5vdCBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IgotCWJ1aWxkX29sZF9saWJzPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtc3RhdGljKQotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXByZWZlci1waWMpCi0JcGljX21vZGU9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcHJlZmVyLW5vbi1waWMpCi0JcGljX21vZGU9bm8KLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGxpYm9iaiIKLSAgICB0ZXN0ICJYJGxpYm9iaiIgIT0gIlgkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiIFwKLSAgICAgICYmICRFQ0hPICJYJGxpYm9iaiIgfCAkR1JFUCAnW11+I14qe307PD4/IiciJyInCSAmKCl8YCRbXScgXAotICAgICAgJiYgZnVuY193YXJuaW5nICJsaWJvYmogbmFtZSBcYCRsaWJvYmonIG1heSBub3QgY29udGFpbiBzaGVsbCBzcGVjaWFsIGNoYXJhY3RlcnMuIgotICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRvYmoiICIvIiAiIgotICAgIG9iam5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLSAgICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLSAgICBsb2JqPSR7eGRpcn0kb2JqZGlyLyRvYmpuYW1lCi0KLSAgICB0ZXN0IC16ICIkYmFzZV9jb21waWxlIiAmJiBcCi0gICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIgotCi0gICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICByZW1vdmVsaXN0PSIkb2JqICRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKLSAgICBlbHNlCi0gICAgICByZW1vdmVsaXN0PSIkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCi0gICAgZmkKLQotICAgICMgT24gQ3lnd2luIHRoZXJlJ3Mgbm8gInJlYWwiIFBJQyBmbGFnIHNvIHdlIG11c3QgYnVpbGQgYm90aCBvYmplY3QgdHlwZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKLSAgICAgIHBpY19tb2RlPWRlZmF1bHQKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgPSBubyAmJiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0gICAgICAjIG5vbi1QSUMgY29kZSBpbiBzaGFyZWQgbGlicmFyaWVzIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgIHBpY19tb2RlPWRlZmF1bHQKLSAgICBmaQotCi0gICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKLSAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKLSAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCi0gICAgICBvdXRwdXRfb2JqPWAkRUNITyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MlXC5bXi5dKiQlJSdgLiR7b2JqZXh0fQotICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCi0gICAgZWxzZQotICAgICAgb3V0cHV0X29iaj0KLSAgICAgIG5lZWRfbG9ja3M9bm8KLSAgICAgIGxvY2tmaWxlPQotICAgIGZpCi0KLSAgICAjIExvY2sgdGhpcyBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IGlzIG5lZWRlZAotICAgICMgV2UgdXNlIHRoaXMgc2NyaXB0IGZpbGUgdG8gbWFrZSB0aGUgbGluaywgaXQgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGZpbGUKLSAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB5ZXM7IHRoZW4KLSAgICAgIHVudGlsICRvcHRfZHJ5X3J1biB8fCBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KLQlmdW5jX2VjaG8gIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgotCXNsZWVwIDIKLSAgICAgIGRvbmUKLSAgICBlbGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm47IHRoZW4KLSAgICAgIGlmIHRlc3QgLWYgIiRsb2NrZmlsZSI7IHRoZW4KLQkkRUNITyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLSAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRvdXRwdXRfb2JqIgotICAgICAgJEVDSE8gIiRzcmNmaWxlIiA+ICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKLSAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkbG9ja2ZpbGUiCi0gICAgdHJhcCAnJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFJyAxIDIgMTUKLQotICAgIGlmIHRlc3QgLW4gIiRmaXhfc3JjZmlsZV9wYXRoIjsgdGhlbgotICAgICAgZXZhbCBzcmNmaWxlPVwiJGZpeF9zcmNmaWxlX3BhdGhcIgotICAgIGZpCi0gICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHNyY2ZpbGUiCi0gICAgcXNyY2ZpbGU9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0Ci0KLSAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KLSAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQotCi0gICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IG5vOyB0aGVuCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgotICAgICAgZWxzZQotCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKLQljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSIKLSAgICAgIGZpCi0KLSAgICAgIGZ1bmNfbWtkaXJfcCAiJHhkaXIkb2JqZGlyIgotCi0gICAgICBpZiB0ZXN0IC16ICIkb3V0cHV0X29iaiI7IHRoZW4KLQkjIFBsYWNlIFBJQyBvYmplY3RzIGluICRvYmpkaXIKLQljb21tYW5kPSIkY29tbWFuZCAtbyAkbG9iaiIKLSAgICAgIGZpCi0KLSAgICAgIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSAiJGNvbW1hbmQiCVwKLSAgICAgICAgICAndGVzdCAtbiAiJG91dHB1dF9vYmoiICYmICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFJwotCi0gICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCi0JIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCi0JJEVDSE8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotCi0gICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZCwgdGhlbiBnbyBvbiB0byBjb21waWxlIHRoZSBuZXh0IG9uZQotICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkbG9iaiI7IHRoZW4KLQlmdW5jX3Nob3dfZXZhbCAnJE1WICIkb3V0cHV0X29iaiIgIiRsb2JqIicgXAotCSAgJ2Vycm9yPSQ/OyAkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRlcnJvcicKLSAgICAgIGZpCi0KLSAgICAgICMgQWxsb3cgZXJyb3IgbWVzc2FnZXMgb25seSBmcm9tIHRoZSBmaXJzdCBjb21waWxhdGlvbi4KLSAgICAgIGlmIHRlc3QgIiRzdXBwcmVzc19vcHQiID0geWVzOyB0aGVuCi0Jc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJwotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBPbmx5IGJ1aWxkIGEgcG9zaXRpb24tZGVwZW5kZW50IG9iamVjdCBpZiB3ZSBidWlsZCBvbGQgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0geWVzOyB0aGVuCi0JIyBEb24ndCBidWlsZCBQSUMgY29kZQotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlJHBpZV9mbGFnIgotICAgICAgZWxzZQotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IHllczsgdGhlbgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvYmoiCi0gICAgICBmaQotCi0gICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KLSAgICAgIGNvbW1hbmQ9IiRjb21tYW5kJHN1cHByZXNzX291dHB1dCIKLSAgICAgIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSAiJGNvbW1hbmQiIFwKLSAgICAgICAgJyRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgotCSRFQ0hPICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1idXQgaXQgc2hvdWxkIGNvbnRhaW46Ci0kc3JjZmlsZQotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKLSAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJG9iaiI7IHRoZW4KLQlmdW5jX3Nob3dfZXZhbCAnJE1WICIkb3V0cHV0X29iaiIgIiRvYmoiJyBcCi0JICAnZXJyb3I9JD87ICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJGVycm9yJwotICAgICAgZmkKLSAgICBmaQotCi0gICAgJG9wdF9kcnlfcnVuIHx8IHsKLSAgICAgIGZ1bmNfd3JpdGVfbGlidG9vbF9vYmplY3QgIiRsaWJvYmoiICIkb2JqZGlyLyRvYmpuYW1lIiAiJG9iam5hbWUiCi0KLSAgICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotCXJlbW92ZWxpc3Q9JGxvY2tmaWxlCi0gICAgICAgICRSTSAiJGxvY2tmaWxlIgotICAgICAgZmkKLSAgICB9Ci0KLSAgICBleGl0ICRFWElUX1NVQ0NFU1MKLX0KLQotJG9wdF9oZWxwIHx8IHsKLXRlc3QgIiRtb2RlIiA9IGNvbXBpbGUgJiYgZnVuY19tb2RlX2NvbXBpbGUgJHsxKyIkQCJ9Ci19Ci0KLWZ1bmNfbW9kZV9oZWxwICgpCi17Ci0gICAgIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCi0gICAgY2FzZSAkbW9kZSBpbgotICAgICAgIiIpCi0gICAgICAgICMgR2VuZXJpYyBoZWxwIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSB1c2FnZSBjb21tZW50cwotICAgICAgICAjIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZpbGUuCi0gICAgICAgIGZ1bmNfaGVscAotICAgICAgICA7OwotCi0gICAgICBjbGVhbikKLSAgICAgICAgJEVDSE8gXAotIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNsZWFuIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KLQotUmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLQotUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCi0odHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCi10byBSTS4KLQotSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgb2JqZWN0IG9yIHByb2dyYW0sIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZAotd2l0aCBpdCBhcmUgZGVsZXRlZC4gT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgotICAgICAgICA7OwotCi0gICAgICBjb21waWxlKQotICAgICAgJEVDSE8gXAotIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKLQotQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtbyBPVVRQVVQtRklMRSAgICBzZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUgdG8gT1VUUFVULUZJTEUKLSAgLW5vLXN1cHByZXNzICAgICAgZG8gbm90IHN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBmb3IgbXVsdGlwbGUgcGFzc2VzCi0gIC1wcmVmZXItcGljICAgICAgIHRyeSB0byBidWlsZGluZyBQSUMgb2JqZWN0cyBvbmx5Ci0gIC1wcmVmZXItbm9uLXBpYyAgIHRyeSB0byBidWlsZGluZyBub24tUElDIG9iamVjdHMgb25seQotICAtc2hhcmVkICAgICAgICAgICBkbyBub3QgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZwotICAtc3RhdGljICAgICAgICAgICBvbmx5IGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKLQotQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKLWZyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCi0KLVRoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQotU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCi1saWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCi0gICAgICAgIDs7Ci0KLSAgICAgIGV4ZWN1dGUpCi0gICAgICAgICRFQ0hPIFwKLSJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCi0KLUF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAotCi1UaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCi1mbGFncy4KLQotSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAotaW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5Ci1kaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KLQotVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCi0gICAgICAgIDs7Ci0KLSAgICAgIGZpbmlzaCkKLSAgICAgICAgJEVDSE8gXAotIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgotCi1Db21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgotCi1FYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgotCi1UaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKLXRoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgotICAgICAgICA7OwotCi0gICAgICBpbnN0YWxsKQotICAgICAgICAkRUNITyBcCi0iVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KLQotSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCi0KLUlOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQotZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCi0KLVRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBJTlNUQUxMLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgotCi0gIC1pbnN0LXByZWZpeCBQUkVGSVgtRElSICBVc2UgUFJFRklYLURJUiBhcyBhIHN0YWdpbmcgYXJlYSBmb3IgaW5zdGFsbGF0aW9uCi0KLVRoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5Ci1CU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKLSAgICAgICAgOzsKLQotICAgICAgbGluaykKLSAgICAgICAgJEVDSE8gXAotIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCi0KLUxpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KLWNyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCi0KLUxJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQotYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCi0KLVRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgotCi0gIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAotICAtYXZvaWQtdmVyc2lvbiAgICBkbyBub3QgYWRkIGEgdmVyc2lvbiBzdWZmaXggaWYgcG9zc2libGUKLSAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCi0gIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGx0X3ByZWxvYWRlZF9zeW1ib2xzCi0gIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCi0gIC1leHBvcnQtc3ltYm9scyBTWU1GSUxFCi0gICAgICAgICAgICAgICAgICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gU1lNRklMRQotICAtZXhwb3J0LXN5bWJvbHMtcmVnZXggUkVHRVgKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIG1hdGNoaW5nIFJFR0VYCi0gIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKLSAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKLSAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCi0gIC1uby1mYXN0LWluc3RhbGwgIGRpc2FibGUgdGhlIGZhc3QtaW5zdGFsbCBtb2RlCi0gIC1uby1pbnN0YWxsICAgICAgIGxpbmsgYSBub3QtaW5zdGFsbGFibGUgZXhlY3V0YWJsZQotICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKLSAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCi0gIC1vYmplY3RsaXN0IEZJTEUgIFVzZSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGZvdW5kIGluIEZJTEUgdG8gc3BlY2lmeSBvYmplY3RzCi0gIC1wcmVjaW91cy1maWxlcy1yZWdleCBSRUdFWAotICAgICAgICAgICAgICAgICAgICBkb24ndCByZW1vdmUgb3V0cHV0IGZpbGVzIG1hdGNoaW5nIFJFR0VYCi0gIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCi0gIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKLSAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKLSAgLXNoYXJlZCAgICAgICAgICAgb25seSBkbyBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKLSAgLXNocmV4dCBTVUZGSVggICAgb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIHNoYXJlZCBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uCi0gIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCi0gIC1zdGF0aWMtbGlidG9vbC1saWJzCi0gICAgICAgICAgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCi0gICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KLSAgLXdlYWsgTElCTkFNRSAgICAgZGVjbGFyZSB0aGF0IHRoZSB0YXJnZXQgcHJvdmlkZXMgdGhlIExJQk5BTUUgaW50ZXJmYWNlCi0KLUFsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCi0KLUV2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCi10cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQotb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKLW9ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKLXJlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAotdXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCi1pcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgotICAgICAgICA7OwotCi0gICAgICB1bmluc3RhbGwpCi0gICAgICAgICRFQ0hPIFwKLSJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgotCi1SZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQotUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCi0odHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCi10byBSTS4KLQotSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCi1PdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCi0gICAgICAgIDs7Ci0KLSAgICAgICopCi0gICAgICAgIGZ1bmNfZmF0YWxfaGVscCAiaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIKLSAgICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAkRUNITwotICAgICRFQ0hPICJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy4iCi0KLSAgICBleGl0ICQ/Ci19Ci0KLSAgIyBOb3cgdGhhdCB3ZSd2ZSBjb2xsZWN0ZWQgYSBwb3NzaWJsZSAtLW1vZGUgYXJnLCBzaG93IGhlbHAgaWYgbmVjZXNzYXJ5Ci0gICRvcHRfaGVscCAmJiBmdW5jX21vZGVfaGVscAotCi0KLSMgZnVuY19tb2RlX2V4ZWN1dGUgYXJnLi4uCi1mdW5jX21vZGVfZXhlY3V0ZSAoKQotewotICAgICRvcHRfZGVidWcKLSAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY29tbWFuZCBuYW1lLgotICAgIGNtZD0iJG5vbm9wdCIKLSAgICB0ZXN0IC16ICIkY21kIiAmJiBcCi0gICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIgotCi0gICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KLSAgICBmb3IgZmlsZSBpbiAkZXhlY3V0ZV9kbGZpbGVzOyBkbwotICAgICAgdGVzdCAtZiAiJGZpbGUiIFwKLQl8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiCi0KLSAgICAgIGRpcj0KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICoubGEpCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlmdW5jX2xhbGliX3Vuc2FmZV9wICIkZmlsZSIgXAotCSAgfHwgZnVuY19mYXRhbF9oZWxwICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKLQotCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgotCWRsbmFtZT0KLQlsaWJyYXJ5X25hbWVzPQotCWZ1bmNfc291cmNlICIkZmlsZSIKLQotCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgotCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCi0JICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCi0JICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgXAotCSAgICBmdW5jX3dhcm5pbmcgIlxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgotCSAgY29udGludWUKLQlmaQotCi0JZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCi0JZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQotCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgotCSAgZGlyPSIkZGlyLyRvYmpkaXIiCi0JZWxzZQotCSAgaWYgdGVzdCAhIC1mICIkZGlyLyRkbG5hbWUiOyB0aGVuCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciCi0JICBmaQotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCi0JZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCi0JZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQk7OwotCi0gICAgICAqKQotCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCi0gICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0gICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCi0KLSAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCi0gICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKLSAgICAgIGVsc2UKLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCi0gICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgotCi0gICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgotICAgIGFyZ3M9Ci0gICAgZm9yIGZpbGUKLSAgICBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgLSopIDs7Ci0gICAgICAqKQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLQlpZiBmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAiJGZpbGUiOyB0aGVuCi0JICBmdW5jX3NvdXJjZSAiJGZpbGUiCi0JICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgotCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCi0JZWxpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgotCSAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCi0JICBmdW5jX3NvdXJjZSAiJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0IgotCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KLQkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCi0gICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkZmlsZSIKLSAgICAgIGFyZ3M9IiRhcmdzICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0ICJYJG9wdF9kcnlfcnVuIiA9IFhmYWxzZTsgdGhlbgotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCi0JZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotICAgICAgZmkKLQotICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb25tZW50IHZhcmlhYmxlcwotICAgICAgZm9yIGx0X3ZhciBpbiBMQU5HIExBTkdVQUdFIExDX0FMTCBMQ19DVFlQRSBMQ19DT0xMQVRFIExDX01FU1NBR0VTCi0gICAgICBkbwotCWV2YWwgImlmIHRlc3QgXCJcJHtzYXZlXyRsdF92YXIrc2V0fVwiID0gc2V0OyB0aGVuCi0gICAgICAgICAgICAgICAgJGx0X3Zhcj1cJHNhdmVfJGx0X3ZhcjsgZXhwb3J0ICRsdF92YXIKLQkgICAgICBlbHNlCi0JCSRsdF91bnNldCAkbHRfdmFyCi0JICAgICAgZmkiCi0gICAgICBkb25lCi0KLSAgICAgICMgTm93IHByZXBhcmUgdG8gYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KLSAgICAgIGV4ZWNfY21kPSJcJGNtZCRhcmdzIgotICAgIGVsc2UKLSAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCi0gICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQlldmFsICJcJEVDSE8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgotCSRFQ0hPICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0gICAgICBmaQotICAgICAgJEVDSE8gIiRjbWQkYXJncyIKLSAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgIGZpCi19Ci0KLXRlc3QgIiRtb2RlIiA9IGV4ZWN1dGUgJiYgZnVuY19tb2RlX2V4ZWN1dGUgJHsxKyIkQCJ9Ci0KLQotIyBmdW5jX21vZGVfZmluaXNoIGFyZy4uLgotZnVuY19tb2RlX2ZpbmlzaCAoKQotewotICAgICRvcHRfZGVidWcKLSAgICBsaWJkaXJzPSIkbm9ub3B0IgotICAgIGFkbWluY21kcz0KLQotICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCi0gICAgICBmb3IgZGlyCi0gICAgICBkbwotCWxpYmRpcnM9IiRsaWJkaXJzICRkaXIiCi0gICAgICBkb25lCi0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgotCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KLQkgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkZmluaXNoX2NtZHMiICdhZG1pbmNtZHM9IiRhZG1pbmNtZHMKLSciJGNtZCInIicKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KLQkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KLQkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCi0JICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZHMiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcwotICAgICAgICRjbWRzIgotCWZpCi0gICAgICBkb25lCi0gICAgZmkKLQotICAgICMgRXhpdCBoZXJlIGlmIHRoZXkgd2FudGVkIHNpbGVudCBtb2RlLgotICAgICRvcHRfc2lsZW50ICYmIGV4aXQgJEVYSVRfU1VDQ0VTUwotCi0gICAgJEVDSE8gIlgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiB8ICRYc2VkCi0gICAgJEVDSE8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKLSAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotICAgICAgJEVDSE8gIiAgICRsaWJkaXIiCi0gICAgZG9uZQotICAgICRFQ0hPCi0gICAgJEVDSE8gIklmIHlvdSBldmVyIGhhcHBlbiB0byB3YW50IHRvIGxpbmsgYWdhaW5zdCBpbnN0YWxsZWQgbGlicmFyaWVzIgotICAgICRFQ0hPICJpbiBhIGdpdmVuIGRpcmVjdG9yeSwgTElCRElSLCB5b3UgbXVzdCBlaXRoZXIgdXNlIGxpYnRvb2wsIGFuZCIKLSAgICAkRUNITyAic3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgdXNlIHRoZSBcYC1MTElCRElSJyIKLSAgICAkRUNITyAiZmxhZyBkdXJpbmcgbGlua2luZyBhbmQgZG8gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmc6IgotICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgJEVDSE8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICAkRUNITyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotICAgICAgJEVDSE8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkcnVucGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgJEVDSE8gIiAgICAgZHVyaW5nIGxpbmtpbmciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLSAgICAgIGxpYmRpcj1MSUJESVIKLSAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotICAgICAgJEVDSE8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCi0gICAgICAkRUNITyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgcnVuIHRoZXNlIGNvbW1hbmRzOiRhZG1pbmNtZHMiCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgICAgJEVDSE8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgotICAgIGZpCi0gICAgJEVDSE8KLQotICAgICRFQ0hPICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKLSAgICBjYXNlICRob3N0IGluCi0gICAgICBzb2xhcmlzMi5bNjc4OV18c29sYXJpczIuMVswLTldKQotICAgICAgICAkRUNITyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSksIGNybGUoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCIKLQkkRUNITyAicGFnZXMuIgotCTs7Ci0gICAgICAqKQotICAgICAgICAkRUNITyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCBwYWdlcy4iCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICAgICRFQ0hPICJYLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgfCAkWHNlZAotICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotfQotCi10ZXN0ICIkbW9kZSIgPSBmaW5pc2ggJiYgZnVuY19tb2RlX2ZpbmlzaCAkezErIiRAIn0KLQotCi0jIGZ1bmNfbW9kZV9pbnN0YWxsIGFyZy4uLgotZnVuY19tb2RlX2luc3RhbGwgKCkKLXsKLSAgICAkb3B0X2RlYnVnCi0gICAgIyBUaGVyZSBtYXkgYmUgYW4gb3B0aW9uYWwgc2goMSkgYXJndW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgICMgaW5zdGFsbF9wcm9nIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MgTlQpLgotICAgIGlmIHRlc3QgIiRub25vcHQiID0gIiRTSEVMTCIgfHwgdGVzdCAiJG5vbm9wdCIgPSAvYmluL3NoIHx8Ci0gICAgICAgIyBBbGxvdyB0aGUgdXNlIG9mIEdOVSBzaHRvb2wncyBpbnN0YWxsIGNvbW1hbmQuCi0gICAgICAgJEVDSE8gIlgkbm9ub3B0IiB8ICRHUkVQIHNodG9vbCA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkbm9ub3B0IgotICAgICAgaW5zdGFsbF9wcm9nPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQgIgotICAgICAgYXJnPSQxCi0gICAgICBzaGlmdAotICAgIGVsc2UKLSAgICAgIGluc3RhbGxfcHJvZz0KLSAgICAgIGFyZz0kbm9ub3B0Ci0gICAgZmkKLQotICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KLSAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKLSAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2ckZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0KLSAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCi0gICAgZGVzdD0KLSAgICBmaWxlcz0KLSAgICBvcHRzPQotICAgIHByZXY9Ci0gICAgaW5zdGFsbF90eXBlPQotICAgIGlzZGlyPW5vCi0gICAgc3RyaXBtZT0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgotCWZpbGVzPSIkZmlsZXMgJGRlc3QiCi0JZGVzdD0kYXJnCi0JY29udGludWUKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWQpIGlzZGlyPXllcyA7OwotICAgICAgLWYpCi0JY2FzZSAiICRpbnN0YWxsX3Byb2cgIiBpbgotCSpbXFxcIC9dY3BcICopIDs7Ci0JKikgcHJldj0kYXJnIDs7Ci0JZXNhYwotCTs7Ci0gICAgICAtZyB8IC1tIHwgLW8pCi0JcHJldj0kYXJnCi0JOzsKLSAgICAgIC1zKQotCXN0cmlwbWU9IiAtcyIKLQljb250aW51ZQotCTs7Ci0gICAgICAtKikKLQk7OwotICAgICAgKikKLQkjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZGVkIGFuIGFyZ3VtZW50LCB0aGVuIHNraXAgaXQuCi0JaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0JICBwcmV2PQotCWVsc2UKLQkgIGRlc3Q9JGFyZwotCSAgY29udGludWUKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCi0gICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLSAgICBkb25lCi0KLSAgICB0ZXN0IC16ICIkaW5zdGFsbF9wcm9nIiAmJiBcCi0gICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIgotCi0gICAgdGVzdCAtbiAiJHByZXYiICYmIFwKLSAgICAgIGZ1bmNfZmF0YWxfaGVscCAidGhlIFxgJHByZXYnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIKLQotICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgotCWZ1bmNfZmF0YWxfaGVscCAibm8gZmlsZSBvciBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCi0gICAgICBlbHNlCi0JZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGEgZGVzdGluYXRpb24iCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAjIFN0cmlwIGFueSB0cmFpbGluZyBzbGFzaCBmcm9tIHRoZSBkZXN0aW5hdGlvbi4KLSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLycgIiRkZXN0IgotICAgIGRlc3Q9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCi0gICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnkuCi0gICAgdGVzdCAtZCAiJGRlc3QiICYmIGlzZGlyPXllcwotICAgIGlmIHRlc3QgIiRpc2RpciIgPSB5ZXM7IHRoZW4KLSAgICAgIGRlc3RkaXI9IiRkZXN0IgotICAgICAgZGVzdG5hbWU9Ci0gICAgZWxzZQotICAgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJGRlc3QiICIiICIuIgotICAgICAgZGVzdGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCi0gICAgICBkZXN0bmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCi0gICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCi0gICAgICBzZXQgZHVtbXkgJGZpbGVzOyBzaGlmdAotICAgICAgdGVzdCAiJCMiIC1ndCAxICYmIFwKLQlmdW5jX2ZhdGFsX2hlbHAgIlxgJGRlc3QnIGlzIG5vdCBhIGRpcmVjdG9yeSIKLSAgICBmaQotICAgIGNhc2UgJGRlc3RkaXIgaW4KLSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0gICAgKikKLSAgICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQljYXNlICRmaWxlIGluCi0JKi5sbykgOzsKLQkqKQotCSAgZnVuY19mYXRhbF9oZWxwICJcYCRkZXN0ZGlyJyBtdXN0IGJlIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIgotCSAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgc3RhdGljbGlicz0KLSAgICBmdXR1cmVfbGliZGlycz0KLSAgICBjdXJyZW50X2xpYmRpcnM9Ci0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCi0gICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi4kbGliZXh0KQotCSMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCi0Jc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGZpbGUiCi0JOzsKLQotICAgICAgKi5sYSkKLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRmaWxlIiBcCi0JICB8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKLQotCWxpYnJhcnlfbmFtZXM9Ci0Jb2xkX2xpYnJhcnk9Ci0JcmVsaW5rX2NvbW1hbmQ9Ci0JZnVuY19zb3VyY2UgIiRmaWxlIgotCi0JIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgotCWlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCi0JICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBjdXJyZW50X2xpYmRpcnM9IiRjdXJyZW50X2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQllbHNlCi0JICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCi0JICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotCi0JZnVuY19kaXJuYW1lICIkZmlsZSIgIi8iICIiCi0JZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQlkaXI9IiRkaXIkb2JqZGlyIgotCi0JaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSAgIyBEZXRlcm1pbmUgdGhlIHByZWZpeCB0aGUgdXNlciBoYXMgYXBwbGllZCB0byBvdXIgZnV0dXJlIGRpci4KLQkgIGluc3RfcHJlZml4X2Rpcj1gJEVDSE8gIlgkZGVzdGRpciIgfCAkWHNlZCAtZSAicyUkbGliZGlyXCQlJSJgCi0KLQkgICMgRG9uJ3QgYWxsb3cgdGhlIHVzZXIgdG8gcGxhY2UgdXMgb3V0c2lkZSBvZiBvdXIgZXhwZWN0ZWQKLQkgICMgbG9jYXRpb24gYi9jIHRoaXMgcHJldmVudHMgZmluZGluZyBkZXBlbmRlbnQgbGlicmFyaWVzIHRoYXQKLQkgICMgYXJlIGluc3RhbGxlZCB0byB0aGUgc2FtZSBwcmVmaXguCi0JICAjIEF0IHByZXNlbnQsIHRoaXMgY2hlY2sgZG9lc24ndCBhZmZlY3Qgd2luZG93cyAuZGxsJ3MgdGhhdAotCSAgIyBhcmUgaW5zdGFsbGVkIGludG8gJGxpYmRpci8uLi9iaW4gKGN1cnJlbnRseSwgdGhhdCB3b3JrcyBmaW5lKQotCSAgIyBidXQgaXQncyBzb21ldGhpbmcgdG8ga2VlcCBhbiBleWUgb24uCi0JICB0ZXN0ICIkaW5zdF9wcmVmaXhfZGlyIiA9ICIkZGVzdGRpciIgJiYgXAotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJlcnJvcjogY2Fubm90IGluc3RhbGwgXGAkZmlsZScgdG8gYSBkaXJlY3Rvcnkgbm90IGVuZGluZyBpbiAkbGliZGlyIgotCi0JICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgotCSAgICAjIFN0aWNrIHRoZSBpbnN0X3ByZWZpeF9kaXIgZGF0YSBpbnRvIHRoZSBsaW5rIGNvbW1hbmQuCi0JICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAaW5zdF9wcmVmaXhfZGlyQCUtaW5zdC1wcmVmaXgtZGlyICRpbnN0X3ByZWZpeF9kaXIlImAKLQkgIGVsc2UKLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBpbnN0X3ByZWZpeF9kaXJAJSUiYAotCSAgZmkKLQotCSAgZnVuY193YXJuaW5nICJyZWxpbmtpbmcgXGAkZmlsZSciCi0JICBmdW5jX3Nob3dfZXZhbCAiJHJlbGlua19jb21tYW5kIiBcCi0JICAgICdmdW5jX2ZhdGFsX2Vycm9yICJlcnJvcjogcmVsaW5rIFxgJGZpbGUnXCcnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiJwotCWZpCi0KLQkjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgotCXNldCBkdW1teSAkbGlicmFyeV9uYW1lczsgc2hpZnQKLQlpZiB0ZXN0IC1uICIkMSI7IHRoZW4KLQkgIHJlYWxuYW1lPSIkMSIKLQkgIHNoaWZ0Ci0KLQkgIHNyY25hbWU9IiRyZWFsbmFtZSIKLQkgIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCIgJiYgc3JjbmFtZT0iJHJlYWxuYW1lIlQKLQotCSAgIyBJbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgYnVpbGQgdGhlIHN5bWxpbmtzLgotCSAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kc3JjbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiIFwKLQkgICAgICAnZXhpdCAkPycKLQkgIHRzdHJpcG1lPSIkc3RyaXBtZSIKLQkgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKLQkgICAgY2FzZSAkcmVhbG5hbWUgaW4KLQkgICAgKi5kbGwuYSkKLQkgICAgICB0c3RyaXBtZT0iIgotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgOzsKLQkgIGVzYWMKLQkgIGlmIHRlc3QgLW4gIiR0c3RyaXBtZSIgJiYgdGVzdCAtbiAiJHN0cmlwbGliIjsgdGhlbgotCSAgICBmdW5jX3Nob3dfZXZhbCAiJHN0cmlwbGliICRkZXN0ZGlyLyRyZWFsbmFtZSIgJ2V4aXQgJD8nCi0JICBmaQotCi0JICBpZiB0ZXN0ICIkIyIgLWd0IDA7IHRoZW4KLQkgICAgIyBEZWxldGUgdGhlIG9sZCBzeW1saW5rcywgYW5kIGNyZWF0ZSBuZXcgb25lcy4KLQkgICAgIyBUcnkgYGxuIC1zZicgZmlyc3QsIGJlY2F1c2UgdGhlIGBsbicgYmluYXJ5IG1pZ2h0IGRlcGVuZCBvbgotCSAgICAjIHRoZSBzeW1saW5rIHdlIHJlcGxhY2UhICBTb2xhcmlzIC9iaW4vbG4gZG9lcyBub3QgdW5kZXJzdGFuZCAtZiwKLQkgICAgIyBzbyB3ZSBhbHNvIG5lZWQgdG8gdHJ5IHJtICYmIGxuIC1zLgotCSAgICBmb3IgbGlua25hbWUKLQkgICAgZG8KLQkgICAgICB0ZXN0ICIkbGlua25hbWUiICE9ICIkcmVhbG5hbWUiIFwKLQkJJiYgZnVuY19zaG93X2V2YWwgIihjZCAkZGVzdGRpciAmJiB7ICRMTl9TIC1mICRyZWFsbmFtZSAkbGlua25hbWUgfHwgeyAkUk0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWU7IH07IH0pIgotCSAgICBkb25lCi0JICBmaQotCi0JICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0JICBsaWI9IiRkZXN0ZGlyLyRyZWFsbmFtZSIKLQkgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdGluc3RhbGxfY21kcyIgJ2V4aXQgJD8nCi0JZmkKLQotCSMgSW5zdGFsbCB0aGUgcHNldWRvLWxpYnJhcnkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzLgotCWZ1bmNfYmFzZW5hbWUgIiRmaWxlIgotCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQlpbnN0bmFtZT0iJGRpci8kbmFtZSJpCi0JZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIiAnZXhpdCAkPycKLQotCSMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KLQl0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCi0KLQkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLQllbHNlCi0JICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKLQkgIGRlc3RmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgotCWZpCi0KLQkjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgotCWNhc2UgJGRlc3RmaWxlIGluCi0JKi5sbykKLQkgIGZ1bmNfbG8ybyAiJGRlc3RmaWxlIgotCSAgc3RhdGljZGVzdD0kZnVuY19sbzJvX3Jlc3VsdAotCSAgOzsKLQkqLiRvYmpleHQpCi0JICBzdGF0aWNkZXN0PSIkZGVzdGZpbGUiCi0JICBkZXN0ZmlsZT0KLQkgIDs7Ci0JKikKLQkgIGZ1bmNfZmF0YWxfaGVscCAiY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciCi0JICA7OwotCWVzYWMKLQotCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgotCXRlc3QgLW4gIiRkZXN0ZmlsZSIgJiYgXAotCSAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIiAnZXhpdCAkPycKLQotCSMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgotCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JICBmdW5jX2xvMm8gIiRmaWxlIgotCSAgc3RhdGljb2JqPSRmdW5jX2xvMm9fcmVzdWx0Ci0JICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyBcJHN0YXRpY29iaiBcJHN0YXRpY2Rlc3QiICdleGl0ICQ/JwotCWZpCi0JZXhpdCAkRVhJVF9TVUNDRVNTCi0JOzsKLQotICAgICAgKikKLQkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLQllbHNlCi0JICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKLQkgIGRlc3RmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgotCWZpCi0KLQkjIElmIHRoZSBmaWxlIGlzIG1pc3NpbmcsIGFuZCB0aGVyZSBpcyBhIC5leGUgb24gdGhlIGVuZCwgc3RyaXAgaXQKLQkjIGJlY2F1c2UgaXQgaXMgbW9zdCBsaWtlbHkgYSBsaWJ0b29sIHNjcmlwdCB3ZSBhY3R1YWxseSB3YW50IHRvCi0JIyBpbnN0YWxsCi0Jc3RyaXBwZWRfZXh0PSIiCi0JY2FzZSAkZmlsZSBpbgotCSAgKi5leGUpCi0JICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCi0JICAgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZmlsZSIKLQkgICAgICBmaWxlPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkgICAgICBzdHJpcHBlZF9leHQ9Ii5leGUiCi0JICAgIGZpCi0JICAgIDs7Ci0JZXNhYwotCi0JIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotCWNhc2UgJGhvc3QgaW4KLQkqY3lnd2luKiB8ICptaW5ndyopCi0JICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCi0JICAgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCi0JICAgICAgd3JhcHBlcj0kZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKLQkgICAgZWxzZQotCSAgICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCi0JICAgICAgd3JhcHBlcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JICAgIGZpCi0JICAgIDs7Ci0JKikKLQkgICAgd3JhcHBlcj0kZmlsZQotCSAgICA7OwotCWVzYWMKLQlpZiBmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAiJHdyYXBwZXIiOyB0aGVuCi0JICBub3RpbnN0X2RlcGxpYnM9Ci0JICByZWxpbmtfY29tbWFuZD0KLQotCSAgZnVuY19zb3VyY2UgIiR3cmFwcGVyIgotCi0JICAjIENoZWNrIHRoZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHNldC4KLQkgIHRlc3QgLXogIiRnZW5lcmF0ZWRfYnlfbGlidG9vbF92ZXJzaW9uIiAmJiBcCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCR3cmFwcGVyJyIKLQotCSAgZmluYWxpemU9eWVzCi0JICBmb3IgbGliIGluICRub3RpbnN0X2RlcGxpYnM7IGRvCi0JICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KLQkgICAgbGliZGlyPQotCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgotCSAgICAgIGZ1bmNfc291cmNlICIkbGliIgotCSAgICBmaQotCSAgICBsaWJmaWxlPSIkbGliZGlyLyJgJEVDSE8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKLQkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KLQkgICAgICBmdW5jX3dhcm5pbmcgIlxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIgotCSAgICAgIGZpbmFsaXplPW5vCi0JICAgIGZpCi0JICBkb25lCi0KLQkgIHJlbGlua19jb21tYW5kPQotCSAgZnVuY19zb3VyY2UgIiR3cmFwcGVyIgotCi0JICBvdXRwdXRuYW1lPQotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAgICRvcHRfZHJ5X3J1biB8fCB7Ci0JICAgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllczsgdGhlbgotCSAgICAgICAgdG1wZGlyPWBmdW5jX21rdGVtcGRpcmAKLQkJZnVuY19iYXNlbmFtZSAiJGZpbGUkc3RyaXBwZWRfZXh0IgotCQlmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0JICAgICAgICBvdXRwdXRuYW1lPSIkdG1wZGlyLyRmaWxlIgotCSAgICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCSAgICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dG5hbWUiJyVnJ2AKLQotCSAgICAgICAgJG9wdF9zaWxlbnQgfHwgewotCSAgICAgICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRyZWxpbmtfY29tbWFuZCIKLQkJICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCi0JICAgICAgICB9Ci0JICAgICAgICBpZiBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKLQkgICAgICAgICAgZWxzZQotCQkgIGZ1bmNfZXJyb3IgImVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIKLQkJICAkb3B0X2RyeV9ydW4gfHwgJHtSTX1yICIkdG1wZGlyIgotCQkgIGNvbnRpbnVlCi0JICAgICAgICBmaQotCSAgICAgICAgZmlsZT0iJG91dHB1dG5hbWUiCi0JICAgICAgZWxzZQotCSAgICAgICAgZnVuY193YXJuaW5nICJjYW5ub3QgcmVsaW5rIFxgJGZpbGUnIgotCSAgICAgIGZpCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgotCSAgICBmaWxlPWAkRUNITyAiWCRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKLQkgIGZpCi0JZmkKLQotCSMgcmVtb3ZlIC5leGUgc2luY2UgY3lnd2luIC91c3IvYmluL2luc3RhbGwgd2lsbCBhcHBlbmQgYW5vdGhlcgotCSMgb25lIGFueXdheQotCWNhc2UgJGluc3RhbGxfcHJvZywkaG9zdCBpbgotCSovdXNyL2Jpbi9pbnN0YWxsKiwqY3lnd2luKikKLQkgIGNhc2UgJGZpbGU6JGRlc3RmaWxlIGluCi0JICAqLmV4ZToqLmV4ZSkKLQkgICAgIyB0aGlzIGlzIG9rCi0JICAgIDs7Ci0JICAqLmV4ZToqKQotCSAgICBkZXN0ZmlsZT0kZGVzdGZpbGUuZXhlCi0JICAgIDs7Ci0JICAqOiouZXhlKQotCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRkZXN0ZmlsZSIKLQkgICAgZGVzdGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2dcJHN0cmlwbWUgXCRmaWxlIFwkZGVzdGZpbGUiICdleGl0ICQ/JwotCSRvcHRfZHJ5X3J1biB8fCBpZiB0ZXN0IC1uICIkb3V0cHV0bmFtZSI7IHRoZW4KLQkgICR7Uk19ciAiJHRtcGRpciIKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCi0gICAgICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKLSAgICAgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQotICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgotICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKLQotICAgICAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgXCRmaWxlIFwkb2xkbGliIiAnZXhpdCAkPycKLQotICAgICAgaWYgdGVzdCAtbiAiJHN0cmlwbWUiICYmIHRlc3QgLW4gIiRvbGRfc3RyaXBsaWIiOyB0aGVuCi0JZnVuY19zaG93X2V2YWwgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIgJ2V4aXQgJD8nCi0gICAgICBmaQotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0gICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9wb3N0aW5zdGFsbF9jbWRzIiAnZXhpdCAkPycKLSAgICBkb25lCi0KLSAgICB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiICYmIFwKLSAgICAgIGZ1bmNfd2FybmluZyAicmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIKLQotICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCi0gICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgotICAgICAgJG9wdF9kcnlfcnVuICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKLSAgICAgIGV4ZWNfY21kPSckU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycycKLSAgICBlbHNlCi0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICBmaQotfQotCi10ZXN0ICIkbW9kZSIgPSBpbnN0YWxsICYmIGZ1bmNfbW9kZV9pbnN0YWxsICR7MSsiJEAifQotCi0KLSMgZnVuY19nZW5lcmF0ZV9kbHN5bXMgb3V0cHV0bmFtZSBvcmlnaW5hdG9yIHBpY19wCi0jIEV4dHJhY3Qgc3ltYm9scyBmcm9tIGRscHJlZmlsZXMgYW5kIGNyZWF0ZSAke291dHB1dG5hbWV9Uy5vIHdpdGgKLSMgYSBkbHByZW9wZW4gc3ltYm9sIHRhYmxlLgotZnVuY19nZW5lcmF0ZV9kbHN5bXMgKCkKLXsKLSAgICAkb3B0X2RlYnVnCi0gICAgbXlfb3V0cHV0bmFtZT0iJDEiCi0gICAgbXlfb3JpZ2luYXRvcj0iJDIiCi0gICAgbXlfcGljX3A9IiR7My1ub30iCi0gICAgbXlfcHJlZml4PWAkRUNITyAiJG15X29yaWdpbmF0b3IiIHwgc2VkICdzJVteYS16QS1aMC05XSVfJWcnYAotICAgIG15X2Rsc3ltcz0KLQotICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCi0gICAgICBpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JbXlfZGxzeW1zPSIke215X291dHB1dG5hbWV9Uy5jIgotICAgICAgZWxzZQotCWZ1bmNfZXJyb3IgIm5vdCBjb25maWd1cmVkIHRvIGV4dHJhY3QgZ2xvYmFsIHN5bWJvbHMgZnJvbSBkbHByZW9wZW5lZCBmaWxlcyIKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRteV9kbHN5bXMiOyB0aGVuCi0gICAgICBjYXNlICRteV9kbHN5bXMgaW4KLSAgICAgICIiKSA7OwotICAgICAgKi5jKQotCSMgRGlzY292ZXIgdGhlIG5saXN0IG9mIGVhY2ggb2YgdGhlIGRsZmlsZXMuCi0Jbmxpc3Q9IiRvdXRwdXRfb2JqZGlyLyR7bXlfb3V0cHV0bmFtZX0ubm0iCi0KLQlmdW5jX3Nob3dfZXZhbCAiJFJNICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgotCi0JIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KLQlmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCi0KLQkkb3B0X2RyeV9ydW4gfHwgJEVDSE8gPiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKLS8qICRteV9kbHN5bXMgLSBzeW1ib2wgcmVzb2x1dGlvbiB0YWJsZSBmb3IgXGAkbXlfb3V0cHV0bmFtZScgZGxzeW0gZW11bGF0aW9uLiAqLwotLyogR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiBcIkNcIiB7Ci0jZW5kaWYKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKLSIKLQotCWlmIHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCi0JICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJG91dHB1dCciCi0KLQkgICRvcHRfZHJ5X3J1biB8fCBlY2hvICc6IEBQUk9HUkFNQCAnID4gIiRubGlzdCIKLQotCSAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgotCSAgcHJvZ2ZpbGVzPWAkRUNITyAiWCRvYmpzJG9sZF9kZXBsaWJzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JICBmb3IgcHJvZ2ZpbGUgaW4gJHByb2dmaWxlczsgZG8KLQkgICAgZnVuY192ZXJib3NlICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRwcm9nZmlsZSciCi0JICAgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkTk0gJHByb2dmaWxlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgIGRvbmUKLQotCSAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgICBldmFsICckRUdSRVAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICB9Ci0JICBmaQotCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICRvcHRfZHJ5X3J1biB8fCB7Ci0JICAgICAgZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgIGV2YWwgJyRNViAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgIH0KLQkgIGZpCi0KLQkgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCi0JICBpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiCi0JICAgICRvcHRfZHJ5X3J1biB8fCB7Ci0JICAgICAgJFJNICRleHBvcnRfc3ltYm9scwotCSAgICAgIGV2YWwgIiR7U0VEfSAtbiAtZSAnL146IEBQUk9HUkFNQCAkL2QnIC1lICdzL14uKiBcKC4qXCkkL1wxL3AnICInPCAiJG5saXN0IiA+ICIkZXhwb3J0X3N5bWJvbHMiJwotCSAgICAgIGNhc2UgJGhvc3QgaW4KLQkgICAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKLSAgICAgICAgICAgICAgICBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJwotICAgICAgICAgICAgICAgIGV2YWwgJ2NhdCAiJGV4cG9ydF9zeW1ib2xzIiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKLQkgICAgICAgIDs7Ci0JICAgICAgZXNhYwotCSAgICB9Ci0JICBlbHNlCi0JICAgICRvcHRfZHJ5X3J1biB8fCB7Ci0JICAgICAgZXZhbCAiJHtTRUR9IC1lICdzL1woW10uWypeJF1cKS9cXFxcXDEvZycgLWUgJ3MvXi8gLycgLWUgJ3MvJC8kLyciJyA8ICIkZXhwb3J0X3N5bWJvbHMiID4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCInCi0JICAgICAgZXZhbCAnJEdSRVAgLWYgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICAgIGNhc2UgJGhvc3QgaW4KLQkgICAgICAgICpjeWd3aW4gfCAqbWluZ3cqIHwgKmNlZ2NjKiApCi0JICAgICAgICAgIGV2YWwgImVjaG8gRVhQT1JUUyAiJz4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCi0JICAgICAgICAgIGV2YWwgJ2NhdCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKLQkgICAgICAgICAgOzsKLQkgICAgICBlc2FjCi0JICAgIH0KLQkgIGZpCi0JZmkKLQotCWZvciBkbHByZWZpbGUgaW4gJGRscHJlZmlsZXM7IGRvCi0JICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGRscHJlZmlsZSciCi0JICBmdW5jX2Jhc2VuYW1lICIkZGxwcmVmaWxlIgotCSAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCSAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgZXZhbCAnJEVDSE8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKLQkgICAgZXZhbCAiJE5NICRkbHByZWZpbGUgMj4vZGV2L251bGwgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgotCSAgfQotCWRvbmUKLQotCSRvcHRfZHJ5X3J1biB8fCB7Ci0JICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IGFuIGVtcHR5IGZpbGUuCi0JICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgotCi0JICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAkRUdSRVAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVAotCSAgICAkTVYgIiRubGlzdCJUICIkbmxpc3QiCi0JICBmaQotCi0JICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotCSAgaWYgJEdSRVAgLXYgIl46ICIgPCAiJG5saXN0IiB8Ci0JICAgICAgaWYgc29ydCAtayAzIDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXNvcnQgLWsgMwotCSAgICAgIGVsc2UKLQkJc29ydCArMgotCSAgICAgIGZpIHwKLQkgICAgICB1bmlxID4gIiRubGlzdCJTOyB0aGVuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgJEdSRVAgLXYgIl46ICIgPCAiJG5saXN0IiA+ICIkbmxpc3QiUwotCSAgZmkKLQotCSAgaWYgdGVzdCAtZiAiJG5saXN0IlM7IHRoZW4KLQkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyInCi0JICBlbHNlCi0JICAgICRFQ0hPICcvKiBOT05FICovJyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKLQkgIGZpCi0KLQkgICRFQ0hPID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHZvaWQgKmFkZHJlc3M7Ci19IGx0X2Rsc3ltbGlzdDsKLSIKLQkgIGNhc2UgJGhvc3QgaW4KLQkgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQotCSAgICAkRUNITyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKLS8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UKLSAgIHJ1bnRpbWUgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uCi0gICBvbiBwc2V1ZG8tcmVsb2NzLiAgKi8iCi0JICAgIGx0X2Rsc3ltX2NvbnN0PSA7OwotCSAgKm9zZjUqKQotCSAgICBlY2hvID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAotLyogVGhpcyBzeXN0ZW0gZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggcmVsb2NhdGlvbnMgaW4gY29uc3QgZGF0YSAqLyIKLQkgICAgbHRfZGxzeW1fY29uc3Q9IDs7Ci0JICAqKQotCSAgICBsdF9kbHN5bV9jb25zdD1jb25zdCA7OwotCSAgZXNhYwotCi0JICAkRUNITyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKLWV4dGVybiAkbHRfZGxzeW1fY29uc3QgbHRfZGxzeW1saXN0Ci1sdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW107Ci0kbHRfZGxzeW1fY29uc3QgbHRfZGxzeW1saXN0Ci1sdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW10gPQote1wKLSAgeyBcIiRteV9vcmlnaW5hdG9yXCIsICh2b2lkICopIDAgfSwiCi0KLQkgIGNhc2UgJG5lZWRfbGliX3ByZWZpeCBpbgotCSAgbm8pCi0JICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgotCSAgICA7OwotCSAgKikKLQkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeCIgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKLQkgICAgOzsKLQkgIGVzYWMKLQkgICRFQ0hPID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAotICB7MCwgKHZvaWQgKikgMH0KLX07Ci0KLS8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLwotI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAotc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKLSAgcmV0dXJuIGx0XyR7bXlfcHJlZml4fV9MVFhfcHJlbG9hZGVkX3N5bWJvbHM7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWZcCi0iCi0JfSAjICEkb3B0X2RyeV9ydW4KLQotCXBpY19mbGFnX2Zvcl9zeW10YWJsZT0KLQljYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkqIiAtc3RhdGljICIqKSA7OwotCSopCi0JICBjYXNlICRob3N0IGluCi0JICAjIGNvbXBpbGluZyB0aGUgc3ltYm9sIHRhYmxlIGZpbGUgd2l0aCBwaWNfZmxhZyB3b3JrcyBhcm91bmQKLQkgICMgYSBGcmVlQlNEIGJ1ZyB0aGF0IGNhdXNlcyBwcm9ncmFtcyB0byBjcmFzaCB3aGVuIC1sbSBpcwotCSAgIyBsaW5rZWQgYmVmb3JlIGFueSBvdGhlciBQSUMgb2JqZWN0LiAgQnV0IHdlIG11c3Qgbm90IHVzZQotCSAgIyBwaWNfZmxhZyB3aGVuIGxpbmtpbmcgd2l0aCAtc3RhdGljLiAgVGhlIHByb2JsZW0gZXhpc3RzIGluCi0JICAjIEZyZWVCU0QgMi4yLjYgYW5kIGlzIGZpeGVkIGluIEZyZWVCU0QgMy4xLgotCSAgKi0qLWZyZWVic2QyKnwqLSotZnJlZWJzZDMuMCp8Ki0qLWZyZWVic2RlbGYzLjAqKQotCSAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURGUkVFQlNEX1dPUktBUk9VTkQiIDs7Ci0JICAqLSotaHB1eCopCi0JICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyIgIDs7Ci0JICAqKQotCSAgICBpZiB0ZXN0ICJYJG15X3BpY19wIiAhPSBYbm87IHRoZW4KLQkgICAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWciCi0JICAgIGZpCi0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLQlzeW10YWJfY2ZsYWdzPQotCWZvciBhcmcgaW4gJExUQ0ZMQUdTOyBkbwotCSAgY2FzZSAkYXJnIGluCi0JICAtcGllIHwgLWZwaWUgfCAtZlBJRSkgOzsKLQkgICopIHN5bXRhYl9jZmxhZ3M9IiRzeW10YWJfY2ZsYWdzICRhcmciIDs7Ci0JICBlc2FjCi0JZG9uZQotCi0JIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KLQlmdW5jX3Nob3dfZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDJHN5bXRhYl9jZmxhZ3MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJG15X2Rsc3ltcyIpJyAnZXhpdCAkPycKLQotCSMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBmaWxlcy4KLQlmdW5jX3Nob3dfZXZhbCAnJFJNICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIicKLQotCSMgVHJhbnNmb3JtIHRoZSBzeW1ib2wgZmlsZSBpbnRvIHRoZSBjb3JyZWN0IG5hbWUuCi0Jc3ltZmlsZW9iaj0iJG91dHB1dF9vYmpkaXIvJHtteV9vdXRwdXRuYW1lfVMuJG9iamV4dCIKLQljYXNlICRob3N0IGluCi0JKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCi0JICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbXlfb3V0cHV0bmFtZS5kZWYiOyB0aGVuCi0JICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8kbXlfb3V0cHV0bmFtZS5kZWYgJHN5bWZpbGVvYmolImAKLQkgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCi0JICBlbHNlCi0JICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAotCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAotCSAgZmkKLQkgIDs7Ci0JKikKLQkgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAotCSAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICAqKQotCWZ1bmNfZmF0YWxfZXJyb3IgInVua25vd24gc3VmZml4IGZvciBcYCRteV9kbHN5bXMnIgotCTs7Ci0gICAgICBlc2FjCi0gICAgZWxzZQotICAgICAgIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KLSAgICAgICMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKLSAgICAgICMgcmVhbGx5IHdhcyByZXF1aXJlZC4KLQotICAgICAgIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KLSAgICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0gICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0gICAgZmkKLX0KLQotIyBmdW5jX3dpbjMyX2xpYmlkIGFyZwotIyByZXR1cm4gdGhlIGxpYnJhcnkgdHlwZSBvZiBmaWxlICdhcmcnCi0jCi0jIE5lZWQgYSBsb3Qgb2YgZ29vIHRvIGhhbmRsZSAqYm90aCogRExMcyBhbmQgaW1wb3J0IGxpYnMKLSMgSGFzIHRvIGJlIGEgc2hlbGwgZnVuY3Rpb24gaW4gb3JkZXIgdG8gJ2VhdCcgdGhlIGFyZ3VtZW50Ci0jIHRoYXQgaXMgc3VwcGxpZWQgd2hlbiAkZmlsZV9tYWdpY19jb21tYW5kIGlzIGNhbGxlZC4KLWZ1bmNfd2luMzJfbGliaWQgKCkKLXsKLSAgJG9wdF9kZWJ1ZwotICB3aW4zMl9saWJpZF90eXBlPSJ1bmtub3duIgotICB3aW4zMl9maWxlcmVzPWBmaWxlIC1MICQxIDI+L2Rldi9udWxsYAotICBjYXNlICR3aW4zMl9maWxlcmVzIGluCi0gICphclwgYXJjaGl2ZVwgaW1wb3J0XCBsaWJyYXJ5KikgIyBkZWZpbml0ZWx5IGltcG9ydAotICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIGltcG9ydCIKLSAgICA7OwotICAqYXJcIGFyY2hpdmUqKSAjIGNvdWxkIGJlIGFuIGltcG9ydCwgb3Igc3RhdGljCi0gICAgaWYgZXZhbCAkT0JKRFVNUCAtZiAkMSB8ICRTRUQgLWUgJzEwcScgMj4vZGV2L251bGwgfAotICAgICAgICRFR1JFUCAnZmlsZSBmb3JtYXQgcGUtaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JyA+L2Rldi9udWxsIDsgdGhlbgotICAgICAgd2luMzJfbm1yZXM9YGV2YWwgJE5NIC1mIHBvc2l4IC1BICQxIHwKLQkkU0VEIC1uIC1lICcKLQkgICAgMSwxMDB7Ci0JCS8gSSAvewotCQkgICAgcywuKixpbXBvcnQsCi0JCSAgICBwCi0JCSAgICBxCi0JCX0KLQkgICAgfSdgCi0gICAgICBjYXNlICR3aW4zMl9ubXJlcyBpbgotICAgICAgaW1wb3J0KikgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIGltcG9ydCI7OwotICAgICAgKikgICAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIHN0YXRpYyI7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgOzsKLSAgKkRMTCopCi0gICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKLSAgICA7OwotICAqZXhlY3V0YWJsZSopICMgYnV0IHNoZWxsIHNjcmlwdHMgYXJlICJleGVjdXRhYmxlIiB0b28uLi4KLSAgICBjYXNlICR3aW4zMl9maWxlcmVzIGluCi0gICAgKk1TXCBXaW5kb3dzXCBQRVwgSW50ZWwqKQotICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLSAgJEVDSE8gIiR3aW4zMl9saWJpZF90eXBlIgotfQotCi0KLQotIyBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSBkaXIgb2xkbGliCi1mdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAoKQotewotICAgICRvcHRfZGVidWcKLSAgICBmX2V4X2FuX2FyX2Rpcj0iJDEiOyBzaGlmdAotICAgIGZfZXhfYW5fYXJfb2xkbGliPSIkMSIKLSAgICBmdW5jX3Nob3dfZXZhbCAiKGNkIFwkZl9leF9hbl9hcl9kaXIgJiYgJEFSIHggXCJcJGZfZXhfYW5fYXJfb2xkbGliXCIpIiAnZXhpdCAkPycKLSAgICBpZiAoJEFSIHQgIiRmX2V4X2FuX2FyX29sZGxpYiIgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgotICAgICA6Ci0gICAgZWxzZQotICAgICAgZnVuY19mYXRhbF9lcnJvciAib2JqZWN0IG5hbWUgY29uZmxpY3RzIGluIGFyY2hpdmU6ICRmX2V4X2FuX2FyX2Rpci8kZl9leF9hbl9hcl9vbGRsaWIiCi0gICAgZmkKLX0KLQotCi0jIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyBnZW50b3Agb2xkbGliIC4uLgotZnVuY19leHRyYWN0X2FyY2hpdmVzICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgIG15X2dlbnRvcD0iJDEiOyBzaGlmdAotICAgIG15X29sZGxpYnM9JHsxKyIkQCJ9Ci0gICAgbXlfb2xkb2Jqcz0iIgotICAgIG15X3hsaWI9IiIKLSAgICBteV94YWJzPSIiCi0gICAgbXlfeGRpcj0iIgotCi0gICAgZm9yIG15X3hsaWIgaW4gJG15X29sZGxpYnM7IGRvCi0gICAgICAjIEV4dHJhY3QgdGhlIG9iamVjdHMuCi0gICAgICBjYXNlICRteV94bGliIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBteV94YWJzPSIkbXlfeGxpYiIgOzsKLQkqKSBteV94YWJzPWBwd2RgIi8kbXlfeGxpYiIgOzsKLSAgICAgIGVzYWMKLSAgICAgIGZ1bmNfYmFzZW5hbWUgIiRteV94bGliIgotICAgICAgbXlfeGxpYj0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotICAgICAgbXlfeGxpYl91PSRteV94bGliCi0gICAgICB3aGlsZSA6OyBkbwotICAgICAgICBjYXNlICIgJGV4dHJhY3RlZF9hcmNoaXZlcyAiIGluCi0JKiIgJG15X3hsaWJfdSAiKikKLQkgIGZ1bmNfYXJpdGggJGV4dHJhY3RlZF9zZXJpYWwgKyAxCi0JICBleHRyYWN0ZWRfc2VyaWFsPSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgbXlfeGxpYl91PWx0JGV4dHJhY3RlZF9zZXJpYWwtJG15X3hsaWIgOzsKLQkqKSBicmVhayA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIGV4dHJhY3RlZF9hcmNoaXZlcz0iJGV4dHJhY3RlZF9hcmNoaXZlcyAkbXlfeGxpYl91IgotICAgICAgbXlfeGRpcj0iJG15X2dlbnRvcC8kbXlfeGxpYl91IgotCi0gICAgICBmdW5jX21rZGlyX3AgIiRteV94ZGlyIgotCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAqLWRhcndpbiopCi0JZnVuY192ZXJib3NlICJFeHRyYWN0aW5nICRteV94YWJzIgotCSMgRG8gbm90IGJvdGhlciBkb2luZyBhbnl0aGluZyBpZiBqdXN0IGEgZHJ5IHJ1bgotCSRvcHRfZHJ5X3J1biB8fCB7Ci0JICBkYXJ3aW5fb3JpZ19kaXI9YHB3ZGAKLQkgIGNkICRteV94ZGlyIHx8IGV4aXQgJD8KLQkgIGRhcndpbl9hcmNoaXZlPSRteV94YWJzCi0JICBkYXJ3aW5fY3VyZGlyPWBwd2RgCi0JICBkYXJ3aW5fYmFzZV9hcmNoaXZlPWBiYXNlbmFtZSAiJGRhcndpbl9hcmNoaXZlImAKLQkgIGRhcndpbl9hcmNoZXM9YCRMSVBPIC1pbmZvICIkZGFyd2luX2FyY2hpdmUiIDI+L2Rldi9udWxsIHwgJEdSRVAgQXJjaGl0ZWN0dXJlcyAyPi9kZXYvbnVsbCB8fCB0cnVlYAotCSAgaWYgdGVzdCAtbiAiJGRhcndpbl9hcmNoZXMiOyB0aGVuCi0JICAgIGRhcndpbl9hcmNoZXM9YCRFQ0hPICIkZGFyd2luX2FyY2hlcyIgfCAkU0VEIC1lICdzLy4qYXJlOi8vJ2AKLQkgICAgZGFyd2luX2FyY2g9Ci0JICAgIGZ1bmNfdmVyYm9zZSAiJGRhcndpbl9iYXNlX2FyY2hpdmUgaGFzIG11bHRpcGxlIGFyY2hpdGVjdHVyZXMgJGRhcndpbl9hcmNoZXMiCi0JICAgIGZvciBkYXJ3aW5fYXJjaCBpbiAgJGRhcndpbl9hcmNoZXMgOyBkbwotCSAgICAgIGZ1bmNfbWtkaXJfcCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKLQkgICAgICAkTElQTyAtdGhpbiAkZGFyd2luX2FyY2ggLW91dHB1dCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IiAiJHtkYXJ3aW5fYXJjaGl2ZX0iCi0JICAgICAgY2QgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCi0JICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgImBwd2RgIiAiJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKLQkgICAgICBjZCAiJGRhcndpbl9jdXJkaXIiCi0JICAgICAgJFJNICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCi0JICAgIGRvbmUgIyAkZGFyd2luX2FyY2hlcwotICAgICAgICAgICAgIyMgT2theSBub3cgd2UndmUgYSBidW5jaCBvZiB0aGluIG9iamVjdHMsIGdvdHRhIGZhdHRlbiB0aGVtIHVwIDopCi0JICAgIGRhcndpbl9maWxlbGlzdD1gZmluZCB1bmZhdC0kJCAtdHlwZSBmIC1uYW1lIFwqLm8gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICRTRUQgLWUgIiRiYXNlbmFtZSIgfCBzb3J0IC11YAotCSAgICBkYXJ3aW5fZmlsZT0KLQkgICAgZGFyd2luX2ZpbGVzPQotCSAgICBmb3IgZGFyd2luX2ZpbGUgaW4gJGRhcndpbl9maWxlbGlzdDsgZG8KLQkgICAgICBkYXJ3aW5fZmlsZXM9YGZpbmQgdW5mYXQtJCQgLW5hbWUgJGRhcndpbl9maWxlIC1wcmludCB8ICROTDJTUGAKLQkgICAgICAkTElQTyAtY3JlYXRlIC1vdXRwdXQgIiRkYXJ3aW5fZmlsZSIgJGRhcndpbl9maWxlcwotCSAgICBkb25lICMgJGRhcndpbl9maWxlbGlzdAotCSAgICAkUk0gLXJmIHVuZmF0LSQkCi0JICAgIGNkICIkZGFyd2luX29yaWdfZGlyIgotCSAgZWxzZQotCSAgICBjZCAkZGFyd2luX29yaWdfZGlyCi0JICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgotCSAgZmkgIyAkZGFyd2luX2FyY2hlcwotCX0gIyAhJG9wdF9kcnlfcnVuCi0JOzsKLSAgICAgICopCi0gICAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgotCTs7Ci0gICAgICBlc2FjCi0gICAgICBteV9vbGRvYmpzPSIkbXlfb2xkb2JqcyAiYGZpbmQgJG15X3hkaXIgLW5hbWUgXCouJG9iamV4dCAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotICAgIGRvbmUKLQotICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQ9IiRteV9vbGRvYmpzIgotfQotCi0KLQotIyBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MSBbYXJnPW5vXQotIwotIyBFbWl0IHRoZSBmaXJzdCBwYXJ0IG9mIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvbiBzdGRvdXQuCi0jIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aAotIyBmdW5jX2VtaXRfd3JhcHBlcigpLCBiZWxvdy4KLWZ1bmNfZW1pdF93cmFwcGVyX3BhcnQxICgpCi17Ci0JZnVuY19lbWl0X3dyYXBwZXJfcGFydDFfYXJnMT1ubwotCWlmIHRlc3QgLW4gIiQxIiA7IHRoZW4KLQkgIGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQxX2FyZzE9JDEKLQlmaQotCi0JJEVDSE8gIlwKLSMhICRTSEVMTAotCi0jICRvdXRwdXQgLSB0ZW1wb3Jhcnkgd3JhcHBlciBzY3JpcHQgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKLSMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgotIwotIyBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKLSMgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgotIwotIyBUaGlzIHdyYXBwZXIgc2NyaXB0IHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLSMgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nJHtTRUR9IC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCi0KLSMgQmUgQm91cm5lIGNvbXBhdGlibGUKLWlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiBcJHsxK1wiXCRAXCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnXCR7MStcIlwkQFwifSc9J1wiXCRAXCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgXGAoc2V0IC1vKSAyPi9kZXYvbnVsbFxgIGluICpwb3NpeCopIHNldCAtbyBwb3NpeDs7IGVzYWMKLWZpCi1CSU5fU0g9eHBnNDsgZXhwb3J0IEJJTl9TSCAjIGZvciBUcnU2NAotRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi1yZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiCi0KLSMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KLWlmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgotICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKLSAgZ2VuZXJhdGVkX2J5X2xpYnRvb2xfdmVyc2lvbj0nJG1hY3JvX3ZlcnNpb24nCi0gIG5vdGluc3RfZGVwbGlicz0nJG5vdGluc3RfZGVwbGlicycKLWVsc2UKLSAgIyBXaGVuIHdlIGFyZSBzb3VyY2VkIGluIGV4ZWN1dGUgbW9kZSwgXCRmaWxlIGFuZCBcJEVDSE8gYXJlIGFscmVhZHkgc2V0LgotICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCi0gICAgRUNITz1cIiRxZWNob1wiCi0gICAgZmlsZT1cIlwkMFwiCi0gICAgIyBNYWtlIHN1cmUgZWNobyB3b3Jrcy4KLSAgICBpZiB0ZXN0IFwiWFwkMVwiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICAgICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgICAgIHNoaWZ0Ci0gICAgZWxpZiB0ZXN0IFwiWFxgeyBcJEVDSE8gJ1x0JzsgfSAyPi9kZXYvbnVsbFxgXCIgPSAnWFx0JzsgdGhlbgotICAgICAgIyBZaXBwZWUsIFwkRUNITyB3b3JrcyEKLSAgICAgIDoKLSAgICBlbHNlCi0gICAgICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwsIGFuZCB0aGVuIG1heWJlIFwkRUNITyB3aWxsIHdvcmsuCi0gICAgICBleGVjICRTSEVMTCBcIlwkMFwiIC0tbm8tcmVleGVjIFwkezErXCJcJEBcIn0KLSAgICBmaQotICBmaVwKLSIKLQkkRUNITyAiXAotCi0gICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCi0gIHRoaXNkaXI9XGBcJEVDSE8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCi0gIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KLQotICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KLSAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgJHtTRUR9IC1uICdzLy4qLT4gLy9wJ1xgCi0gIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KLSAgICBkZXN0ZGlyPVxgXCRFQ0hPIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKLQotICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KLSAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCi0gICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KLSAgICAgIFtcXFxcL10qIHwgW0EtWmEtel06W1xcXFwvXSopIHRoaXNkaXI9XCJcJGRlc3RkaXJcIiA7OwotICAgICAgKikgdGhpc2Rpcj1cIlwkdGhpc2Rpci9cJGRlc3RkaXJcIiA7OwotICAgICAgZXNhYwotICAgIGZpCi0KLSAgICBmaWxlPVxgXCRFQ0hPIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJV4uKi8lJSdcYAotICAgIGZpbGU9XGBscyAtbGQgXCJcJHRoaXNkaXIvXCRmaWxlXCIgfCAke1NFRH0gLW4gJ3MvLiotPiAvL3AnXGAKLSAgZG9uZQotIgotfQotIyBlbmQ6IGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQxCi0KLSMgZnVuY19lbWl0X3dyYXBwZXJfcGFydDIgW2FyZz1ub10KLSMKLSMgRW1pdCB0aGUgc2Vjb25kIHBhcnQgb2YgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9uIHN0ZG91dC4KLSMgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoCi0jIGZ1bmNfZW1pdF93cmFwcGVyKCksIGJlbG93LgotZnVuY19lbWl0X3dyYXBwZXJfcGFydDIgKCkKLXsKLQlmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0Ml9hcmcxPW5vCi0JaWYgdGVzdCAtbiAiJDEiIDsgdGhlbgotCSAgZnVuY19lbWl0X3dyYXBwZXJfcGFydDJfYXJnMT0kMQotCWZpCi0KLQkkRUNITyAiXAotCi0gICMgVXN1YWxseSAnbm8nLCBleGNlcHQgb24gY3lnd2luL21pbmd3IHdoZW4gZW1iZWRkZWQgaW50bwotICAjIHRoZSBjd3JhcHBlci4KLSAgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVI9JGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQyX2FyZzEKLSAgaWYgdGVzdCBcIlwkV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVJcIiA9IFwieWVzXCI7IHRoZW4KLSAgICAjIHNwZWNpYWwgY2FzZSBmb3IgJy4nCi0gICAgaWYgdGVzdCBcIlwkdGhpc2RpclwiID0gXCIuXCI7IHRoZW4KLSAgICAgIHRoaXNkaXI9XGBwd2RcYAotICAgIGZpCi0gICAgIyByZW1vdmUgLmxpYnMgZnJvbSB0aGlzZGlyCi0gICAgY2FzZSBcIlwkdGhpc2RpclwiIGluCi0gICAgKltcXFxcL10kb2JqZGlyICkgdGhpc2Rpcj1cYFwkRUNITyBcIlhcJHRoaXNkaXJcIiB8IFwkWHNlZCAtZSAncyVbXFxcXC9dW15cXFxcL10qJCUlJ1xgIDs7Ci0gICAgJG9iamRpciApICAgdGhpc2Rpcj0uIDs7Ci0gICAgZXNhYwotICBmaQotCi0gICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCi0gIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKLSAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKLSIKLQotCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICAkRUNITyAiXAotICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZSckZXhlZXh0Ci0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0KLSAgaWYgdGVzdCAhIC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIHx8Ci0gICAgIHsgZmlsZT1cYGxzIC0xZHQgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCJcJHByb2dkaXIvLi4vXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfCAke1NFRH0gMXFcYDsgXFwKLSAgICAgICB0ZXN0IFwiWFwkZmlsZVwiICE9IFwiWFwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfTsgdGhlbgotCi0gICAgZmlsZT1cIlwkXCQtXCRwcm9ncmFtXCIKLQotICAgIGlmIHRlc3QgISAtZCBcIlwkcHJvZ2RpclwiOyB0aGVuCi0gICAgICAkTUtESVIgXCJcJHByb2dkaXJcIgotICAgIGVsc2UKLSAgICAgICRSTSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotICAgIGZpIgotCi0JICAkRUNITyAiXAotCi0gICAgIyByZWxpbmsgZXhlY3V0YWJsZSBpZiBuZWNlc3NhcnkKLSAgICBpZiB0ZXN0IC1uIFwiXCRyZWxpbmtfY29tbWFuZFwiOyB0aGVuCi0gICAgICBpZiByZWxpbmtfY29tbWFuZF9vdXRwdXQ9XGBldmFsIFwkcmVsaW5rX2NvbW1hbmQgMj4mMVxgOyB0aGVuIDoKLSAgICAgIGVsc2UKLQkkRUNITyBcIlwkcmVsaW5rX2NvbW1hbmRfb3V0cHV0XCIgPiYyCi0JJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0JZXhpdCAxCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAkTVYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfHwKLSAgICB7ICRSTSBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsKLSAgICAgICRNViBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfQotICAgICRSTSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotICBmaSIKLQllbHNlCi0JICAkRUNITyAiXAotICBwcm9ncmFtPSckb3V0cHV0bmFtZScKLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLSIKLQlmaQotCi0JJEVDSE8gIlwKLQotICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgotCi0JIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCi0JaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgotCSAgJEVDSE8gIlwKLSAgICAjIEFkZCBvdXIgb3duIGxpYnJhcnkgcGF0aCB0byAkc2hsaWJwYXRoX3ZhcgotICAgICRzaGxpYnBhdGhfdmFyPVwiJHRlbXBfcnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIKLQotICAgICMgU29tZSBzeXN0ZW1zIGNhbm5vdCBjb3BlIHdpdGggY29sb24tdGVybWluYXRlZCAkc2hsaWJwYXRoX3ZhcgotICAgICMgVGhlIHNlY29uZCBjb2xvbiBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEJlT1MgUjQgc2VkCi0gICAgJHNobGlicGF0aF92YXI9XGBcJEVDSE8gXCJYXCQkc2hsaWJwYXRoX3ZhclwiIHwgXCRYc2VkIC1lICdzLzo6KlwkLy8nXGAKLQotICAgIGV4cG9ydCAkc2hsaWJwYXRoX3ZhcgotIgotCWZpCi0KLQkjIGZpeHVwIHRoZSBkbGwgc2VhcmNocGF0aCBpZiB3ZSBuZWVkIHRvLgotCWlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgotCSAgJEVDSE8gIlwKLSAgICAjIEFkZCB0aGUgZGxsIHNlYXJjaCBwYXRoIGNvbXBvbmVudHMgdG8gdGhlIGV4ZWN1dGFibGUgUEFUSAotICAgIFBBVEg9JGRsbHNlYXJjaHBhdGg6XCRQQVRICi0iCi0JZmkKLQotCSRFQ0hPICJcCi0gICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KLSIKLQljYXNlICRob3N0IGluCi0JIyBCYWNrc2xhc2hlcyBzZXBhcmF0ZSBkaXJlY3RvcmllcyBvbiBwbGFpbiB3aW5kb3dzCi0JKi0qLW1pbmd3IHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKLQkgICRFQ0hPICJcCi0gICAgICBleGVjIFwiXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0KLQkqKQotCSAgJEVDSE8gIlwKLSAgICAgIGV4ZWMgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQotIgotCSAgOzsKLQllc2FjCi0JJEVDSE8gIlwKLSAgICAgIFwkRUNITyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkKlwiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCi0gICAgXCRFQ0hPIFwiXCQwOiBlcnJvcjogXFxcYFwkcHJvZ2Rpci9cJHByb2dyYW0nIGRvZXMgbm90IGV4aXN0XCIgMT4mMgotICAgIFwkRUNITyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgotICAgICRFQ0hPIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpXAotIgotfQotIyBlbmQ6IGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQyCi0KLQotIyBmdW5jX2VtaXRfd3JhcHBlciBbYXJnPW5vXQotIwotIyBFbWl0IGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvbiBzdGRvdXQuCi0jIERvbid0IGRpcmVjdGx5IG9wZW4gYSBmaWxlIGJlY2F1c2Ugd2UgbWF5IHdhbnQgdG8KLSMgaW5jb3Jwb3JhdGUgdGhlIHNjcmlwdCBjb250ZW50cyB3aXRoaW4gYSBjeWd3aW4vbWluZ3cKLSMgd3JhcHBlciBleGVjdXRhYmxlLiAgTXVzdCBPTkxZIGJlIGNhbGxlZCBmcm9tIHdpdGhpbgotIyBmdW5jX21vZGVfbGluayBiZWNhdXNlIGl0IGRlcGVuZHMgb24gYSBudW1iZXIgb2YgdmFyaWFibGVzCi0jIHNldCB0aGVyZWluLgotIwotIyBBUkcgaXMgdGhlIHZhbHVlIHRoYXQgdGhlIFdSQVBQRVJfU0NSSVBUX0JFTE9OR1NfSU5fT0JKRElSCi0jIHZhcmlhYmxlIHdpbGwgdGFrZS4gIElmICd5ZXMnLCB0aGVuIHRoZSBlbWl0dGVkIHNjcmlwdAotIyB3aWxsIGFzc3VtZSB0aGF0IHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggaXQgaXMgc3RvcmVkIGlzCi0jIHRoZSAkb2JqZGlyIGRpcmVjdG9yeS4gIFRoaXMgaXMgYSBjeWd3aW4vbWluZ3ctc3BlY2lmaWMKLSMgYmVoYXZpb3IuCi1mdW5jX2VtaXRfd3JhcHBlciAoKQotewotCWZ1bmNfZW1pdF93cmFwcGVyX2FyZzE9bm8KLQlpZiB0ZXN0IC1uICIkMSIgOyB0aGVuCi0JICBmdW5jX2VtaXRfd3JhcHBlcl9hcmcxPSQxCi0JZmkKLQotCSMgc3BsaXQgdGhpcyB1cCBzbyB0aGF0IGZ1bmNfZW1pdF9jd3JhcHBlcmV4ZV9zcmMKLQkjIGNhbiBjYWxsIGVhY2ggcGFydCBpbmRlcGVuZGVudGx5LgotCWZ1bmNfZW1pdF93cmFwcGVyX3BhcnQxICIke2Z1bmNfZW1pdF93cmFwcGVyX2FyZzF9IgotCWZ1bmNfZW1pdF93cmFwcGVyX3BhcnQyICIke2Z1bmNfZW1pdF93cmFwcGVyX2FyZzF9IgotfQotCi0KLSMgZnVuY190b19ob3N0X3BhdGggYXJnCi0jCi0jIENvbnZlcnQgcGF0aHMgdG8gaG9zdCBmb3JtYXQgd2hlbiB1c2VkIHdpdGggYnVpbGQgdG9vbHMuCi0jIEludGVuZGVkIGZvciB1c2Ugd2l0aCAibmF0aXZlIiBtaW5ndyAod2hlcmUgbGlidG9vbCBpdHNlbGYKLSMgaXMgcnVubmluZyB1bmRlciB0aGUgbXN5cyBzaGVsbCksIG9yIGluIHRoZSBmb2xsb3dpbmcgY3Jvc3MtCi0jIGJ1aWxkIGVudmlyb25tZW50czoKLSMgICAgJGJ1aWxkICAgICAgICAgICRob3N0Ci0jICAgIG1pbmd3IChtc3lzKSAgICBtaW5ndyAgW2UuZy4gbmF0aXZlXQotIyAgICBjeWd3aW4gICAgICAgICAgbWluZ3cKLSMgICAgKm5peCArIHdpbmUgICAgIG1pbmd3Ci0jIHdoZXJlIHdpbmUgaXMgZXF1aXBwZWQgd2l0aCB0aGUgYHdpbmVwYXRoJyBleGVjdXRhYmxlLgotIyBJbiB0aGUgbmF0aXZlIG1pbmd3IGNhc2UsIHRoZSAobXN5cykgc2hlbGwgYXV0b21hdGljYWxseQotIyBjb252ZXJ0cyBwYXRocyBmb3IgYW55IG5vbi1tc3lzIGFwcGxpY2F0aW9ucyBpdCBsYXVuY2hlcywKLSMgYnV0IHRoYXQgZmFjaWxpdHkgaXNuJ3QgYXZhaWxhYmxlIGZyb20gaW5zaWRlIHRoZSBjd3JhcHBlci4KLSMgU2ltaWxhciBhY2NvbW1vZGF0aW9ucyBhcmUgbmVjZXNzYXJ5IGZvciAkaG9zdCBtaW5ndyBhbmQKLSMgJGJ1aWxkIGN5Z3dpbi4gIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBkb2VzIG5vIGhhcm0gZm9yIG90aGVyCi0jICRob3N0LyRidWlsZCBjb21iaW5hdGlvbnMgbm90IGxpc3RlZCBhYm92ZS4KLSMKLSMgQVJHIGlzIHRoZSBwYXRoIChvbiAkYnVpbGQpIHRoYXQgc2hvdWxkIGJlIGNvbnZlcnRlZCB0bwotIyB0aGUgcHJvcGVyIHJlcHJlc2VudGF0aW9uIGZvciAkaG9zdC4gVGhlIHJlc3VsdCBpcyBzdG9yZWQKLSMgaW4gJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KLWZ1bmNfdG9faG9zdF9wYXRoICgpCi17Ci0gIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCi0gIGlmIHRlc3QgLW4gIiQxIiA7IHRoZW4KLSAgICBjYXNlICRob3N0IGluCi0gICAgICAqbWluZ3cqICkKLSAgICAgICAgbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeT0nc3xcXFxcKnxcXHxnO3N8L3xcXHxnO3N8XFx8XFxcXHxnJwotICAgICAgICBjYXNlICRidWlsZCBpbgotICAgICAgICAgICptaW5ndyogKSAjIGFjdHVhbGx5LCBtc3lzCi0gICAgICAgICAgICAjIGF3a3dhcmQ6IGNtZCBhcHBlbmRzIHNwYWNlcyB0byByZXN1bHQKLSAgICAgICAgICAgIGx0X3NlZF9zdHJpcF90cmFpbGluZ19zcGFjZXM9InMvWyBdKlwkLy8iCi0gICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPWAoIGNtZCAvL2MgZWNobyAiJDEiIHxcCi0gICAgICAgICAgICAgICRTRUQgLWUgIiRsdF9zZWRfc3RyaXBfdHJhaWxpbmdfc3BhY2VzIiApIDI+L2Rldi9udWxsIHx8IGVjaG8gIiJgCi0gICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9YGVjaG8gIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiB8XAotICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCi0gICAgICAgICAgICA7OwotICAgICAgICAgICpjeWd3aW4qICkKLSAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9YGN5Z3BhdGggLXcgIiQxImAKLSAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiIHxcCi0gICAgICAgICAgICAgICRTRUQgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKLSAgICAgICAgICAgIDs7Ci0gICAgICAgICAgKiApCi0gICAgICAgICAgICAjIFVuZm9ydHVuYXRlbHksIHdpbmVwYXRoIGRvZXMgbm90IGV4aXQgd2l0aCBhIG5vbi16ZXJvCi0gICAgICAgICAgICAjIGVycm9yIGNvZGUsIHNvIHdlIGFyZSBmb3JjZWQgdG8gY2hlY2sgdGhlIGNvbnRlbnRzIG9mCi0gICAgICAgICAgICAjIHN0ZG91dC4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBjb21tYW5kIGlzIG5vdAotICAgICAgICAgICAgIyBmb3VuZCwgdGhlIHNoZWxsIHdpbGwgc2V0IGFuIGV4aXQgY29kZSBvZiAxMjcgYW5kIHByaW50Ci0gICAgICAgICAgICAjICphbiBlcnJvciBtZXNzYWdlKiB0byBzdGRvdXQuIFNvIHdlIG11c3QgY2hlY2sgZm9yIGJvdGgKLSAgICAgICAgICAgICMgZXJyb3IgY29kZSBvZiB6ZXJvIEFORCBub24tZW1wdHkgc3Rkb3V0LCB3aGljaCBleHBsYWlucwotICAgICAgICAgICAgIyB0aGUgb2RkIGNvbnN0cnVjdGlvbjoKLSAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9YHdpbmVwYXRoIC13ICIkMSIgMj4vZGV2L251bGxgCi0gICAgICAgICAgICBpZiB0ZXN0ICIkPyIgLWVxIDAgJiYgdGVzdCAtbiAiJHtmdW5jX3RvX2hvc3RfcGF0aF90bXAxfSI7IHRoZW4KLSAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PWBlY2hvICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgfFwKLSAgICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICMgQWxsb3cgd2FybmluZyBiZWxvdy4KLSAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIiCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICBpZiB0ZXN0IC16ICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IiA7IHRoZW4KLSAgICAgICAgICBmdW5jX2Vycm9yICJDb3VsZCBub3QgZGV0ZXJtaW5lIGhvc3QgcGF0aCBjb3JyZXNwb25kaW5nIHRvIgotICAgICAgICAgIGZ1bmNfZXJyb3IgIiAgJyQxJyIKLSAgICAgICAgICBmdW5jX2Vycm9yICJDb250aW51aW5nLCBidXQgdW5pbnN0YWxsZWQgZXhlY3V0YWJsZXMgbWF5IG5vdCB3b3JrLiIKLSAgICAgICAgICAjIEZhbGxiYWNrOgotICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotfQotIyBlbmQ6IGZ1bmNfdG9faG9zdF9wYXRoCi0KLSMgZnVuY190b19ob3N0X3BhdGhsaXN0IGFyZwotIwotIyBDb252ZXJ0IHBhdGhsaXN0cyB0byBob3N0IGZvcm1hdCB3aGVuIHVzZWQgd2l0aCBidWlsZCB0b29scy4KLSMgU2VlIGZ1bmNfdG9faG9zdF9wYXRoKCksIGFib3ZlLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHRoZQotIyBmb2xsb3dpbmcgJGJ1aWxkLyRob3N0IGNvbWJpbmF0aW9ucyAoYnV0IGRvZXMgbm8gaGFybSBmb3IKLSMgY29tYmluYXRpb25zIG5vdCBsaXN0ZWQgaGVyZSk6Ci0jICAgICRidWlsZCAgICAgICAgICAkaG9zdAotIyAgICBtaW5ndyAobXN5cykgICAgbWluZ3cgIFtlLmcuIG5hdGl2ZV0KLSMgICAgY3lnd2luICAgICAgICAgIG1pbmd3Ci0jICAgICpuaXggKyB3aW5lICAgICBtaW5ndwotIwotIyBQYXRoIHNlcGFyYXRvcnMgYXJlIGFsc28gY29udmVydGVkIGZyb20gJGJ1aWxkIGZvcm1hdCB0bwotIyAkaG9zdCBmb3JtYXQuIElmIEFSRyBiZWdpbnMgb3IgZW5kcyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IKLSMgY2hhcmFjdGVyLCBpdCBpcyBwcmVzZXJ2ZWQgKGJ1dCBjb252ZXJ0ZWQgdG8gJGhvc3QgZm9ybWF0KQotIyBvbiBvdXRwdXQuCi0jCi0jIEFSRyBpcyBhIHBhdGhsaXN0IChvbiAkYnVpbGQpIHRoYXQgc2hvdWxkIGJlIGNvbnZlcnRlZCB0bwotIyB0aGUgcHJvcGVyIHJlcHJlc2VudGF0aW9uIG9uICRob3N0LiBUaGUgcmVzdWx0IGlzIHN0b3JlZAotIyBpbiAkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdC4KLWZ1bmNfdG9faG9zdF9wYXRobGlzdCAoKQotewotICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSIkMSIKLSAgaWYgdGVzdCAtbiAiJDEiIDsgdGhlbgotICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICptaW5ndyogKQotICAgICAgICBsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5PSdzfFxcXFwqfFxcfGc7c3wvfFxcfGc7c3xcXHxcXFxcfGcnCi0gICAgICAgICMgUmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlcnMgZnJvbQotICAgICAgICAjIEFSRy4gbXN5cyBiZWhhdmlvciBpcyBpbmNvbnNpc3RlbnQgaGVyZSwgY3lncGF0aCB0dXJucyB0aGVtCi0gICAgICAgICMgaW50byAnLjsnIGFuZCAnOy4nLCBhbmQgd2luZXBhdGggaWdub3JlcyB0aGVtIGNvbXBsZXRlbHkuCi0gICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyPSIkMSIKLSAgICAgICAgIyBPbmNlIHNldCBmb3IgdGhpcyBjYWxsLCB0aGlzIHZhcmlhYmxlIHNob3VsZCBub3QgYmUKLSAgICAgICAgIyByZWFzc2lnbmVkLiBJdCBpcyB1c2VkIGluIHRoYSBmYWxsYmFjayBjYXNlLgotICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMT1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyIiB8XAotICAgICAgICAgICRTRUQgLWUgJ3N8XjoqfHwnIC1lICdzfDoqJHx8J2AKLSAgICAgICAgY2FzZSAkYnVpbGQgaW4KLSAgICAgICAgICAqbWluZ3cqICkgIyBBY3R1YWxseSwgbXN5cy4KLSAgICAgICAgICAgICMgQXdrd2FyZDogY21kIGFwcGVuZHMgc3BhY2VzIHRvIHJlc3VsdC4KLSAgICAgICAgICAgIGx0X3NlZF9zdHJpcF90cmFpbGluZ19zcGFjZXM9InMvWyBdKlwkLy8iCi0gICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMj1gKCBjbWQgLy9jIGVjaG8gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMSIgfFwKLSAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9zdHJpcF90cmFpbGluZ19zcGFjZXMiICkgMj4vZGV2L251bGwgfHwgZWNobyAiImAKLSAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9YGVjaG8gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMiIgfFwKLSAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnkiYAotICAgICAgICAgICAgOzsKLSAgICAgICAgICAqY3lnd2luKiApCi0gICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMj1gY3lncGF0aCAtdyAtcCAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxImAKLSAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9YGVjaG8gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMiIgfFwKLSAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnkiYAotICAgICAgICAgICAgOzsKLSAgICAgICAgICAqICkKLSAgICAgICAgICAgICMgdW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lc24ndCBjb252ZXJ0IHBhdGhsaXN0cwotICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iIgotICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X29sZElGUz0kSUZTCi0gICAgICAgICAgICBJRlM9OgotICAgICAgICAgICAgZm9yIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9mIGluICRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMSA7IGRvCi0gICAgICAgICAgICAgIElGUz0kZnVuY190b19ob3N0X3BhdGhsaXN0X29sZElGUwotICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkZnVuY190b19ob3N0X3BhdGhsaXN0X2YiIDsgdGhlbgotICAgICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoICIkZnVuY190b19ob3N0X3BhdGhsaXN0X2YiCi0gICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIgOyB0aGVuCi0gICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdCIgOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9IiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCi0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9IiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0OyRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCi0gICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgIElGUz06Ci0gICAgICAgICAgICBkb25lCi0gICAgICAgICAgICBJRlM9JGZ1bmNfdG9faG9zdF9wYXRobGlzdF9vbGRJRlMKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgaWYgdGVzdCAteiAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQiIDsgdGhlbgotICAgICAgICAgIGZ1bmNfZXJyb3IgIkNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGhvc3QgcGF0aChzKSBjb3JyZXNwb25kaW5nIHRvIgotICAgICAgICAgIGZ1bmNfZXJyb3IgIiAgJyQxJyIKLSAgICAgICAgICBmdW5jX2Vycm9yICJDb250aW51aW5nLCBidXQgdW5pbnN0YWxsZWQgZXhlY3V0YWJsZXMgbWF5IG5vdCB3b3JrLiIKLSAgICAgICAgICAjIEZhbGxiYWNrLiBUaGlzIG1heSBicmVhayBpZiAkMSBjb250YWlucyBET1Mtc3R5bGUgZHJpdmUKLSAgICAgICAgICAjIHNwZWNpZmljYXRpb25zLiBUaGUgZml4IGlzIG5vdCB0byBjb21wbGljYXRlIHRoZSBleHByZXNzaW9uCi0gICAgICAgICAgIyBiZWxvdywgYnV0IGZvciB0aGUgdXNlciB0byBwcm92aWRlIGEgd29ya2luZyB3aW5lIGluc3RhbGxhdGlvbgotICAgICAgICAgICMgd2l0aCB3aW5lcGF0aCBzbyB0aGF0IHBhdGggdHJhbnNsYXRpb24gaW4gdGhlIGNyb3NzLXRvLW1pbmd3Ci0gICAgICAgICAgIyBjYXNlIHdvcmtzIHByb3Blcmx5LgotICAgICAgICAgIGx0X3JlcGxhY2VfcGF0aHNlcF9uaXhfdG9fZG9zPSJzfDp8O3xnIgotICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9YGVjaG8gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMSIgfFwKLSAgICAgICAgICAgICRTRUQgLWUgIiRsdF9yZXBsYWNlX3BhdGhzZXBfbml4X3RvX2RvcyJgCi0gICAgICAgIGZpCi0gICAgICAgICMgTm93LCBhZGQgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9ycyBiYWNrCi0gICAgICAgIGNhc2UgIiQxIiBpbgotICAgICAgICAgIDoqICkgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iOyRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0IgotICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICBjYXNlICIkMSIgaW4KLSAgICAgICAgICAqOiApIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9IiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0OyIKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi19Ci0jIGVuZDogZnVuY190b19ob3N0X3BhdGhsaXN0Ci0KLSMgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYwotIyBlbWl0IHRoZSBzb3VyY2UgY29kZSBmb3IgYSB3cmFwcGVyIGV4ZWN1dGFibGUgb24gc3Rkb3V0Ci0jIE11c3QgT05MWSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gZnVuY19tb2RlX2xpbmsgYmVjYXVzZQotIyBpdCBkZXBlbmRzIG9uIGEgbnVtYmVyIG9mIHZhcmlhYmxlIHNldCB0aGVyZWluLgotZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyAoKQotewotCWNhdCA8PEVPRgotCi0vKiAkY3dyYXBwZXJzb3VyY2UgLSB0ZW1wb3Jhcnkgd3JhcHBlciBleGVjdXRhYmxlIGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCi0gICBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCi0KLSAgIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAotICAgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgotCi0gICBUaGlzIHdyYXBwZXIgZXhlY3V0YWJsZSBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0gICBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCi0KLSAgIEN1cnJlbnRseSwgaXQgc2ltcGx5IGV4ZWNzIHRoZSB3cmFwcGVyICpzY3JpcHQqICIkU0hFTEwgJG91dHB1dCIsCi0gICBidXQgY291bGQgZXZlbnR1YWxseSBhYnNvcmIgYWxsIG9mIHRoZSBzY3JpcHRzIGZ1bmN0aW9uYWxpdHkgYW5kCi0gICBleGVjICRvYmpkaXIvJG91dHB1dG5hbWUgZGlyZWN0bHkuCi0qLwotRU9GCi0JICAgIGNhdCA8PCJFT0YiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZmRlZiBfTVNDX1ZFUgotIyBpbmNsdWRlIDxkaXJlY3QuaD4KLSMgaW5jbHVkZSA8cHJvY2Vzcy5oPgotIyBpbmNsdWRlIDxpby5oPgotIyBkZWZpbmUgc2V0bW9kZSBfc2V0bW9kZQotI2Vsc2UKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGluY2x1ZGUgPHN0ZGludC5oPgotIyBpZmRlZiBfX0NZR1dJTl9fCi0jICBpbmNsdWRlIDxpby5oPgotIyAgZGVmaW5lIEhBVkVfU0VURU5WCi0jICBpZmRlZiBfX1NUUklDVF9BTlNJX18KLWNoYXIgKnJlYWxwYXRoIChjb25zdCBjaGFyICosIGNoYXIgKik7Ci1pbnQgcHV0ZW52IChjaGFyICopOwotaW50IHNldGVudiAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7Ci0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmIGRlZmluZWQoUEFUSF9NQVgpCi0jIGRlZmluZSBMVF9QQVRITUFYIFBBVEhfTUFYCi0jZWxpZiBkZWZpbmVkKE1BWFBBVEhMRU4pCi0jIGRlZmluZSBMVF9QQVRITUFYIE1BWFBBVEhMRU4KLSNlbHNlCi0jIGRlZmluZSBMVF9QQVRITUFYIDEwMjQKLSNlbmRpZgotCi0jaWZuZGVmIFNfSVhPVEgKLSMgZGVmaW5lIFNfSVhPVEggMAotI2VuZGlmCi0jaWZuZGVmIFNfSVhHUlAKLSMgZGVmaW5lIFNfSVhHUlAgMAotI2VuZGlmCi0KLSNpZmRlZiBfTVNDX1ZFUgotIyBkZWZpbmUgU19JWFVTUiBfU19JRVhFQwotIyBkZWZpbmUgc3RhdCBfc3RhdAotIyBpZm5kZWYgX0lOVFBUUl9UX0RFRklORUQKLSMgIGRlZmluZSBpbnRwdHJfdCBpbnQKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1IKLSMgZGVmaW5lIERJUl9TRVBBUkFUT1IgJy8nCi0jIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOicKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX01TRE9TX18pIHx8IGRlZmluZWQgKF9fREpHUFBfXykgfHwgXAotICBkZWZpbmVkIChfX09TMl9fKQotIyBkZWZpbmUgSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0KLSMgZGVmaW5lIEZPUEVOX1dCICJ3YiIKLSMgaWZuZGVmIERJUl9TRVBBUkFUT1JfMgotIyAgZGVmaW5lIERJUl9TRVBBUkFUT1JfMiAnXFwnCi0jIGVuZGlmCi0jIGlmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCi0jICBkZWZpbmUgUEFUSF9TRVBBUkFUT1JfMiAnOycKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1JfMgotIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gRElSX1NFUEFSQVRPUikKLSNlbHNlIC8qIERJUl9TRVBBUkFUT1JfMiAqLwotIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgXAotCSgoKGNoKSA9PSBESVJfU0VQQVJBVE9SKSB8fCAoKGNoKSA9PSBESVJfU0VQQVJBVE9SXzIpKQotI2VuZGlmIC8qIERJUl9TRVBBUkFUT1JfMiAqLwotCi0jaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKLSMgZGVmaW5lIElTX1BBVEhfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBQQVRIX1NFUEFSQVRPUikKLSNlbHNlIC8qIFBBVEhfU0VQQVJBVE9SXzIgKi8KLSMgZGVmaW5lIElTX1BBVEhfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBQQVRIX1NFUEFSQVRPUl8yKQotI2VuZGlmIC8qIFBBVEhfU0VQQVJBVE9SXzIgKi8KLQotI2lmZGVmIF9fQ1lHV0lOX18KLSMgZGVmaW5lIEZPUEVOX1dCICJ3YiIKLSNlbmRpZgotCi0jaWZuZGVmIEZPUEVOX1dCCi0jIGRlZmluZSBGT1BFTl9XQiAidyIKLSNlbmRpZgotI2lmbmRlZiBfT19CSU5BUlkKLSMgZGVmaW5lIF9PX0JJTkFSWSAwCi0jZW5kaWYKLQotI2RlZmluZSBYTUFMTE9DKHR5cGUsIG51bSkgICAgICAoKHR5cGUgKikgeG1hbGxvYyAoKG51bSkgKiBzaXplb2YodHlwZSkpKQotI2RlZmluZSBYRlJFRShzdGFsZSkgZG8geyBcCi0gIGlmIChzdGFsZSkgeyBmcmVlICgodm9pZCAqKSBzdGFsZSk7IHN0YWxlID0gMDsgfSBcCi19IHdoaWxlICgwKQotCi0jdW5kZWYgTFRXUkFQUEVSX0RFQlVHUFJJTlRGCi0jaWYgZGVmaW5lZCBERUJVR1dSQVBQRVIKLSMgZGVmaW5lIExUV1JBUFBFUl9ERUJVR1BSSU5URihhcmdzKSBsdHdyYXBwZXJfZGVidWdwcmludGYgYXJncwotc3RhdGljIHZvaWQKLWx0d3JhcHBlcl9kZWJ1Z3ByaW50ZiAoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOwotICAgICh2b2lkKSB2ZnByaW50ZiAoc3RkZXJyLCBmbXQsIGFyZ3MpOwotICAgIHZhX2VuZCAoYXJncyk7Ci19Ci0jZWxzZQotIyBkZWZpbmUgTFRXUkFQUEVSX0RFQlVHUFJJTlRGKGFyZ3MpCi0jZW5kaWYKLQotY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lID0gTlVMTDsKLQotdm9pZCAqeG1hbGxvYyAoc2l6ZV90IG51bSk7Ci1jaGFyICp4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpOwotY29uc3QgY2hhciAqYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKTsKLWNoYXIgKmZpbmRfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqd3JhcHBlcik7Ci1jaGFyICpjaGFzZV9zeW1saW5rcyAoY29uc3QgY2hhciAqcGF0aHNwZWMpOwotaW50IG1ha2VfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCk7Ci1pbnQgY2hlY2tfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCk7Ci1jaGFyICpzdHJlbmR6YXAgKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KTsKLXZvaWQgbHRfZmF0YWwgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLik7Ci12b2lkIGx0X3NldGVudiAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOwotY2hhciAqbHRfZXh0ZW5kX3N0ciAoY29uc3QgY2hhciAqb3JpZ192YWx1ZSwgY29uc3QgY2hhciAqYWRkLCBpbnQgdG9fZW5kKTsKLXZvaWQgbHRfb3B0X3Byb2Nlc3NfZW52X3NldCAoY29uc3QgY2hhciAqYXJnKTsKLXZvaWQgbHRfb3B0X3Byb2Nlc3NfZW52X3ByZXBlbmQgKGNvbnN0IGNoYXIgKmFyZyk7Ci12b2lkIGx0X29wdF9wcm9jZXNzX2Vudl9hcHBlbmQgKGNvbnN0IGNoYXIgKmFyZyk7Ci1pbnQgbHRfc3BsaXRfbmFtZV92YWx1ZSAoY29uc3QgY2hhciAqYXJnLCBjaGFyKiogbmFtZSwgY2hhcioqIHZhbHVlKTsKLXZvaWQgbHRfdXBkYXRlX2V4ZV9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7Ci12b2lkIGx0X3VwZGF0ZV9saWJfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqc2NyaXB0X3RleHRfcGFydDEgPQotRU9GCi0KLQkgICAgZnVuY19lbWl0X3dyYXBwZXJfcGFydDEgeWVzIHwKLQkgICAgICAgICRTRUQgLWUgJ3MvXChbXFwiXVwpL1xcXDEvZycgXAotCSAgICAgICAgICAgICAtZSAncy9eLyAgIi8nIC1lICdzLyQvXFxuIi8nCi0JICAgIGVjaG8gIjsiCi0JICAgIGNhdCA8PEVPRgotCi1zdGF0aWMgY29uc3QgY2hhciAqc2NyaXB0X3RleHRfcGFydDIgPQotRU9GCi0JICAgIGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQyIHllcyB8Ci0JICAgICAgICAkU0VEIC1lICdzL1woW1xcIl1cKS9cXFwxL2cnIFwKLQkgICAgICAgICAgICAgLWUgJ3MvXi8gICIvJyAtZSAncy8kL1xcbiIvJwotCSAgICBlY2hvICI7IgotCi0JICAgIGNhdCA8PEVPRgotY29uc3QgY2hhciAqIE1BR0lDX0VYRSA9ICIkbWFnaWNfZXhlIjsKLWNvbnN0IGNoYXIgKiBMSUJfUEFUSF9WQVJOQU1FID0gIiRzaGxpYnBhdGhfdmFyIjsKLUVPRgotCi0JICAgIGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KLSAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0ICIkdGVtcF9ycGF0aCIKLQkgICAgICBjYXQgPDxFT0YKLWNvbnN0IGNoYXIgKiBMSUJfUEFUSF9WQUxVRSAgID0gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0IjsKLUVPRgotCSAgICBlbHNlCi0JICAgICAgY2F0IDw8IkVPRiIKLWNvbnN0IGNoYXIgKiBMSUJfUEFUSF9WQUxVRSAgID0gIiI7Ci1FT0YKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KLSAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0ICIkZGxsc2VhcmNocGF0aDoiCi0JICAgICAgY2F0IDw8RU9GCi1jb25zdCBjaGFyICogRVhFX1BBVEhfVkFSTkFNRSA9ICJQQVRIIjsKLWNvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQUxVRSAgID0gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0IjsKLUVPRgotCSAgICBlbHNlCi0JICAgICAgY2F0IDw8IkVPRiIKLWNvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQVJOQU1FID0gIiI7Ci1jb25zdCBjaGFyICogRVhFX1BBVEhfVkFMVUUgICA9ICIiOwotRU9GCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgICAgICBjYXQgPDxFT0YKLWNvbnN0IGNoYXIgKiBUQVJHRVRfUFJPR1JBTV9OQU1FID0gImx0LSRvdXRwdXRuYW1lIjsgLyogaG9wZWZ1bGx5LCBubyAuZXhlICovCi1FT0YKLQkgICAgZWxzZQotCSAgICAgIGNhdCA8PEVPRgotY29uc3QgY2hhciAqIFRBUkdFVF9QUk9HUkFNX05BTUUgPSAiJG91dHB1dG5hbWUiOyAvKiBob3BlZnVsbHksIG5vIC5leGUgKi8KLUVPRgotCSAgICBmaQotCi0KLQkgICAgY2F0IDw8IkVPRiIKLQotI2RlZmluZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAgICAgICAgICItLWx0LSIKLSNkZWZpbmUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVhfTEVOR1RIICA1Ci0KLXN0YXRpYyBjb25zdCBzaXplX3Qgb3B0X3ByZWZpeF9sZW4gICAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYX0xFTkdUSDsKLXN0YXRpYyBjb25zdCBjaGFyICpsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYOwotCi1zdGF0aWMgY29uc3QgY2hhciAqZHVtcHNjcmlwdF9vcHQgICAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAiZHVtcC1zY3JpcHQiOwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGVudl9zZXRfb3B0X2xlbiAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWF9MRU5HVEggKyA3Owotc3RhdGljIGNvbnN0IGNoYXIgKmVudl9zZXRfb3B0ICAgICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImVudi1zZXQiOwotICAvKiBhcmd1bWVudCBpcyBwdXRlbnYtc3R5bGUgImZvbz1iYXIiLCB2YWx1ZSBvZiBmb28gaXMgc2V0IHRvIGJhciAqLwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGVudl9wcmVwZW5kX29wdF9sZW4gPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWF9MRU5HVEggKyAxMTsKLXN0YXRpYyBjb25zdCBjaGFyICplbnZfcHJlcGVuZF9vcHQgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJlbnYtcHJlcGVuZCI7Ci0gIC8qIGFyZ3VtZW50IGlzIHB1dGVudi1zdHlsZSAiZm9vPWJhciIsIG5ldyB2YWx1ZSBvZiBmb28gaXMgYmFyJHtmb299ICovCi0KLXN0YXRpYyBjb25zdCBzaXplX3QgZW52X2FwcGVuZF9vcHRfbGVuICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYX0xFTkdUSCArIDEwOwotc3RhdGljIGNvbnN0IGNoYXIgKmVudl9hcHBlbmRfb3B0ICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImVudi1hcHBlbmQiOwotICAvKiBhcmd1bWVudCBpcyBwdXRlbnYtc3R5bGUgImZvbz1iYXIiLCBuZXcgdmFsdWUgb2YgZm9vIGlzICR7Zm9vfWJhciAqLwotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGNoYXIgKipuZXdhcmd6OwotICBpbnQgIG5ld2FyZ2M7Ci0gIGNoYXIgKnRtcF9wYXRoc3BlYzsKLSAgY2hhciAqYWN0dWFsX2N3cmFwcGVyX3BhdGg7Ci0gIGNoYXIgKmFjdHVhbF9jd3JhcHBlcl9uYW1lOwotICBjaGFyICp0YXJnZXRfbmFtZTsKLSAgY2hhciAqbHRfYXJndl96ZXJvOwotICBpbnRwdHJfdCBydmFsID0gMTI3OwotCi0gIGludCBpOwotCi0gIHByb2dyYW1fbmFtZSA9IChjaGFyICopIHhzdHJkdXAgKGJhc2VfbmFtZSAoYXJndlswXSkpOwotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKG1haW4pIGFyZ3ZbMF0gICAgICA6ICVzXG4iLCBhcmd2WzBdKSk7Ci0gIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgcHJvZ3JhbV9uYW1lIDogJXNcbiIsIHByb2dyYW1fbmFtZSkpOwotCi0gIC8qIHZlcnkgc2ltcGxlIGFyZyBwYXJzaW5nOyBkb24ndCB3YW50IHRvIHJlbHkgb24gZ2V0b3B0ICovCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoYXJndltpXSwgZHVtcHNjcmlwdF9vcHQpID09IDApCi0JewotRU9GCi0JICAgIGNhc2UgIiRob3N0IiBpbgotCSAgICAgICptaW5ndyogfCAqY3lnd2luKiApCi0JCSMgbWFrZSBzdGRvdXQgdXNlICJ1bml4IiBsaW5lIGVuZGluZ3MKLQkJZWNobyAiICAgICAgICAgIHNldG1vZGUoMSxfT19CSU5BUlkpOyIKLQkJOzsKLQkgICAgICBlc2FjCi0KLQkgICAgY2F0IDw8IkVPRiIKLQkgIHByaW50ZiAoIiVzIiwgc2NyaXB0X3RleHRfcGFydDEpOwotCSAgcHJpbnRmICgiJXMiLCBzY3JpcHRfdGV4dF9wYXJ0Mik7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIG5ld2FyZ3ogPSBYTUFMTE9DIChjaGFyICosIGFyZ2MgKyAxKTsKLSAgdG1wX3BhdGhzcGVjID0gZmluZF9leGVjdXRhYmxlIChhcmd2WzBdKTsKLSAgaWYgKHRtcF9wYXRoc3BlYyA9PSBOVUxMKQotICAgIGx0X2ZhdGFsICgiQ291bGRuJ3QgZmluZCAlcyIsIGFyZ3ZbMF0pOwotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKG1haW4pIGZvdW5kIGV4ZSAoYmVmb3JlIHN5bWxpbmsgY2hhc2UpIGF0IDogJXNcbiIsCi0JCQkgIHRtcF9wYXRoc3BlYykpOwotCi0gIGFjdHVhbF9jd3JhcHBlcl9wYXRoID0gY2hhc2Vfc3ltbGlua3MgKHRtcF9wYXRoc3BlYyk7Ci0gIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgZm91bmQgZXhlIChhZnRlciBzeW1saW5rIGNoYXNlKSBhdCA6ICVzXG4iLAotCQkJICBhY3R1YWxfY3dyYXBwZXJfcGF0aCkpOwotICBYRlJFRSAodG1wX3BhdGhzcGVjKTsKLQotICBhY3R1YWxfY3dyYXBwZXJfbmFtZSA9IHhzdHJkdXAoIGJhc2VfbmFtZSAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpKTsKLSAgc3RyZW5kemFwIChhY3R1YWxfY3dyYXBwZXJfcGF0aCwgYWN0dWFsX2N3cmFwcGVyX25hbWUpOwotCi0gIC8qIHdyYXBwZXIgbmFtZSB0cmFuc2Zvcm1zICovCi0gIHN0cmVuZHphcCAoYWN0dWFsX2N3cmFwcGVyX25hbWUsICIuZXhlIik7Ci0gIHRtcF9wYXRoc3BlYyA9IGx0X2V4dGVuZF9zdHIgKGFjdHVhbF9jd3JhcHBlcl9uYW1lLCAiLmV4ZSIsIDEpOwotICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX25hbWUpOwotICBhY3R1YWxfY3dyYXBwZXJfbmFtZSA9IHRtcF9wYXRoc3BlYzsKLSAgdG1wX3BhdGhzcGVjID0gMDsKLQotICAvKiB0YXJnZXRfbmFtZSB0cmFuc2Zvcm1zIC0tIHVzZSBhY3R1YWwgdGFyZ2V0IHByb2dyYW0gbmFtZTsgbWlnaHQgaGF2ZSBsdC0gcHJlZml4ICovCi0gIHRhcmdldF9uYW1lID0geHN0cmR1cCAoYmFzZV9uYW1lIChUQVJHRVRfUFJPR1JBTV9OQU1FKSk7Ci0gIHN0cmVuZHphcCAodGFyZ2V0X25hbWUsICIuZXhlIik7Ci0gIHRtcF9wYXRoc3BlYyA9IGx0X2V4dGVuZF9zdHIgKHRhcmdldF9uYW1lLCAiLmV4ZSIsIDEpOwotICBYRlJFRSAodGFyZ2V0X25hbWUpOwotICB0YXJnZXRfbmFtZSA9IHRtcF9wYXRoc3BlYzsKLSAgdG1wX3BhdGhzcGVjID0gMDsKLQotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKG1haW4pIGxpYnRvb2wgdGFyZ2V0IG5hbWU6ICVzXG4iLAotCQkJICB0YXJnZXRfbmFtZSkpOwotRU9GCi0KLQkgICAgY2F0IDw8RU9GCi0gIG5ld2FyZ3pbMF0gPQotICAgIFhNQUxMT0MgKGNoYXIsIChzdHJsZW4gKGFjdHVhbF9jd3JhcHBlcl9wYXRoKSArCi0JCSAgICBzdHJsZW4gKCIkb2JqZGlyIikgKyAxICsgc3RybGVuIChhY3R1YWxfY3dyYXBwZXJfbmFtZSkgKyAxKSk7Ci0gIHN0cmNweSAobmV3YXJnelswXSwgYWN0dWFsX2N3cmFwcGVyX3BhdGgpOwotICBzdHJjYXQgKG5ld2FyZ3pbMF0sICIkb2JqZGlyIik7Ci0gIHN0cmNhdCAobmV3YXJnelswXSwgIi8iKTsKLUVPRgotCi0JICAgIGNhdCA8PCJFT0YiCi0gIC8qIHN0b3AgaGVyZSwgYW5kIGNvcHkgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyB0aGlzIHR3aWNlICovCi0gIHRtcF9wYXRoc3BlYyA9IHhzdHJkdXAgKG5ld2FyZ3pbMF0pOwotCi0gIC8qIGRvIE5PVCB3YW50IHRoZSBsdC0gcHJlZml4IGhlcmUsIHNvIHVzZSBhY3R1YWxfY3dyYXBwZXJfbmFtZSAqLwotICBzdHJjYXQgKG5ld2FyZ3pbMF0sIGFjdHVhbF9jd3JhcHBlcl9uYW1lKTsKLQotICAvKiBETyB3YW50IHRoZSBsdC0gcHJlZml4IGhlcmUgaWYgaXQgZXhpc3RzLCBzbyB1c2UgdGFyZ2V0X25hbWUgKi8KLSAgbHRfYXJndl96ZXJvID0gbHRfZXh0ZW5kX3N0ciAodG1wX3BhdGhzcGVjLCB0YXJnZXRfbmFtZSwgMSk7Ci0gIFhGUkVFICh0bXBfcGF0aHNwZWMpOwotICB0bXBfcGF0aHNwZWMgPSBOVUxMOwotRU9GCi0KLQkgICAgY2FzZSAkaG9zdF9vcyBpbgotCSAgICAgIG1pbmd3KikKLQkgICAgY2F0IDw8IkVPRiIKLSAgewotICAgIGNoYXIqIHA7Ci0gICAgd2hpbGUgKChwID0gc3RyY2hyIChuZXdhcmd6WzBdLCAnXFwnKSkgIT0gTlVMTCkKLSAgICAgIHsKLQkqcCA9ICcvJzsKLSAgICAgIH0KLSAgICB3aGlsZSAoKHAgPSBzdHJjaHIgKGx0X2FyZ3ZfemVybywgJ1xcJykpICE9IE5VTEwpCi0gICAgICB7Ci0JKnAgPSAnLyc7Ci0gICAgICB9Ci0gIH0KLUVPRgotCSAgICA7OwotCSAgICBlc2FjCi0KLQkgICAgY2F0IDw8IkVPRiIKLSAgWEZSRUUgKHRhcmdldF9uYW1lKTsKLSAgWEZSRUUgKGFjdHVhbF9jd3JhcHBlcl9wYXRoKTsKLSAgWEZSRUUgKGFjdHVhbF9jd3JhcHBlcl9uYW1lKTsKLQotICBsdF9zZXRlbnYgKCJCSU5fU0giLCAieHBnNCIpOyAvKiBmb3IgVHJ1NjQgKi8KLSAgbHRfc2V0ZW52ICgiRFVBTENBU0UiLCAiMSIpOyAgLyogZm9yIE1TSyBzaCAqLwotICBsdF91cGRhdGVfbGliX3BhdGggKExJQl9QQVRIX1ZBUk5BTUUsIExJQl9QQVRIX1ZBTFVFKTsKLSAgbHRfdXBkYXRlX2V4ZV9wYXRoIChFWEVfUEFUSF9WQVJOQU1FLCBFWEVfUEFUSF9WQUxVRSk7Ci0KLSAgbmV3YXJnYz0wOwotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChhcmd2W2ldLCBlbnZfc2V0X29wdCwgZW52X3NldF9vcHRfbGVuKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGFyZ3ZbaV1bZW52X3NldF9vcHRfbGVuXSA9PSAnPScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBhcmd2W2ldICsgZW52X3NldF9vcHRfbGVuICsgMTsKLSAgICAgICAgICAgICAgbHRfb3B0X3Byb2Nlc3NfZW52X3NldCAocCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYXJndltpXVtlbnZfc2V0X29wdF9sZW5dID09ICdcMCcgJiYgaSArIDEgPCBhcmdjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfc2V0IChhcmd2WysraV0pOyAvKiBkb24ndCBjb3B5ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbHRfZmF0YWwgKCIlcyBtaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50IiwgZW52X3NldF9vcHQpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICBpZiAoc3RybmNtcCAoYXJndltpXSwgZW52X3ByZXBlbmRfb3B0LCBlbnZfcHJlcGVuZF9vcHRfbGVuKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGFyZ3ZbaV1bZW52X3ByZXBlbmRfb3B0X2xlbl0gPT0gJz0nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb25zdCBjaGFyICpwID0gYXJndltpXSArIGVudl9wcmVwZW5kX29wdF9sZW4gKyAxOwotICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfcHJlcGVuZCAocCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYXJndltpXVtlbnZfcHJlcGVuZF9vcHRfbGVuXSA9PSAnXDAnICYmIGkgKyAxIDwgYXJnYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbHRfb3B0X3Byb2Nlc3NfZW52X3ByZXBlbmQgKGFyZ3ZbKytpXSk7IC8qIGRvbid0IGNvcHkgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBsdF9mYXRhbCAoIiVzIG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQiLCBlbnZfcHJlcGVuZF9vcHQpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICBpZiAoc3RybmNtcCAoYXJndltpXSwgZW52X2FwcGVuZF9vcHQsIGVudl9hcHBlbmRfb3B0X2xlbikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhcmd2W2ldW2Vudl9hcHBlbmRfb3B0X2xlbl0gPT0gJz0nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb25zdCBjaGFyICpwID0gYXJndltpXSArIGVudl9hcHBlbmRfb3B0X2xlbiArIDE7Ci0gICAgICAgICAgICAgIGx0X29wdF9wcm9jZXNzX2Vudl9hcHBlbmQgKHApOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGFyZ3ZbaV1bZW52X2FwcGVuZF9vcHRfbGVuXSA9PSAnXDAnICYmIGkgKyAxIDwgYXJnYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbHRfb3B0X3Byb2Nlc3NfZW52X2FwcGVuZCAoYXJndlsrK2ldKTsgLyogZG9uJ3QgY29weSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGx0X2ZhdGFsICgiJXMgbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCIsIGVudl9hcHBlbmRfb3B0KTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgaWYgKHN0cm5jbXAgKGFyZ3ZbaV0sIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4LCBvcHRfcHJlZml4X2xlbikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIC8qIGhvd2V2ZXIsIGlmIHRoZXJlIGlzIGFuIG9wdGlvbiBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKLSAgICAgICAgICAgICBuYW1lc3BhY2UsIGJ1dCBpdCBpcyBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGtub3cgYWJvdXQgYW5kCi0gICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGRlYWx0IHdpdGgsIGFib3ZlIChpbmx1ZGluZyBkdW1wLXNjcmlwdCksIHRoZW4KLSAgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IuIE90aGVyd2lzZSwgdGFyZ2V0cyBtaWdodCBiZWdpbiB0byBiZWxpZXZlCi0gICAgICAgICAgICAgdGhleSBhcmUgYWxsb3dlZCB0byB1c2Ugb3B0aW9ucyBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKLSAgICAgICAgICAgICBuYW1lc3BhY2UuIFRoZSBmaXJzdCB0aW1lIGFueSB1c2VyIGNvbXBsYWlucyBhYm91dCB0aGlzLCB3ZSdsbAotICAgICAgICAgICAgIG5lZWQgdG8gbWFrZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCBhIGNvbmZpZ3VyZS10aW1lIG9wdGlvbgotICAgICAgICAgICAgIG9yIGEgY29uZmlndXJlLmFjLXNldHRhYmxlIHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIGx0X2ZhdGFsICgiVW5yZWNvZ25pemVkIG9wdGlvbiBpbiAlcyBuYW1lc3BhY2U6ICclcyciLAotICAgICAgICAgICAgICAgICAgICBsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCwgYXJndltpXSk7Ci0gICAgICAgIH0KLSAgICAgIC8qIG90aGVyd2lzZSAuLi4gKi8KLSAgICAgIG5ld2FyZ3pbKytuZXdhcmdjXSA9IHhzdHJkdXAgKGFyZ3ZbaV0pOwotICAgIH0KLSAgbmV3YXJnelsrK25ld2FyZ2NdID0gTlVMTDsKLQotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgICAgICgoIihtYWluKSBsdF9hcmd2X3plcm8gOiAlc1xuIiwgKGx0X2FyZ3ZfemVybyA/IGx0X2FyZ3ZfemVybyA6ICI8TlVMTD4iKSkpOwotICBmb3IgKGkgPSAwOyBpIDwgbmV3YXJnYzsgaSsrKQotICAgIHsKLSAgICAgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgbmV3YXJnelslZF0gICA6ICVzXG4iLCBpLCAobmV3YXJneltpXSA/IG5ld2FyZ3pbaV0gOiAiPE5VTEw+IikpKTsKLSAgICB9Ci0KLUVPRgotCi0JICAgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgICAgICBtaW5ndyopCi0JCWNhdCA8PCJFT0YiCi0gIC8qIGV4ZWN2IGRvZXNuJ3QgYWN0dWFsbHkgd29yayBvbiBtaW5ndyBhcyBleHBlY3RlZCBvbiB1bml4ICovCi0gIHJ2YWwgPSBfc3Bhd252IChfUF9XQUlULCBsdF9hcmd2X3plcm8sIChjb25zdCBjaGFyICogY29uc3QgKikgbmV3YXJneik7Ci0gIGlmIChydmFsID09IC0xKQotICAgIHsKLSAgICAgIC8qIGZhaWxlZCB0byBzdGFydCBwcm9jZXNzICovCi0gICAgICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKG1haW4pIGZhaWxlZCB0byBsYXVuY2ggdGFyZ2V0IFwiJXNcIjogZXJybm8gPSAlZFxuIiwgbHRfYXJndl96ZXJvLCBlcnJubykpOwotICAgICAgcmV0dXJuIDEyNzsKLSAgICB9Ci0gIHJldHVybiBydmFsOwotRU9GCi0JCTs7Ci0JICAgICAgKikKLQkJY2F0IDw8IkVPRiIKLSAgZXhlY3YgKGx0X2FyZ3ZfemVybywgbmV3YXJneik7Ci0gIHJldHVybiBydmFsOyAvKiA9MTI3LCBidXQgYXZvaWRzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nICovCi1FT0YKLQkJOzsKLQkgICAgZXNhYwotCi0JICAgIGNhdCA8PCJFT0YiCi19Ci0KLXZvaWQgKgoteG1hbGxvYyAoc2l6ZV90IG51bSkKLXsKLSAgdm9pZCAqcCA9ICh2b2lkICopIG1hbGxvYyAobnVtKTsKLSAgaWYgKCFwKQotICAgIGx0X2ZhdGFsICgiTWVtb3J5IGV4aGF1c3RlZCIpOwotCi0gIHJldHVybiBwOwotfQotCi1jaGFyICoKLXhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgcmV0dXJuIHN0cmluZyA/IHN0cmNweSAoKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzdHJpbmcpICsgMSksCi0JCQkgIHN0cmluZykgOiBOVUxMOwotfQotCi1jb25zdCBjaGFyICoKLWJhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqYmFzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICAvKiBTa2lwIG92ZXIgdGhlIGRpc2sgbmFtZSBpbiBNU0RPUyBwYXRobmFtZXMuICovCi0gIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgbmFtZVswXSkgJiYgbmFtZVsxXSA9PSAnOicpCi0gICAgbmFtZSArPSAyOwotI2VuZGlmCi0KLSAgZm9yIChiYXNlID0gbmFtZTsgKm5hbWU7IG5hbWUrKykKLSAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAoKm5hbWUpKQotICAgICAgYmFzZSA9IG5hbWUgKyAxOwotICByZXR1cm4gYmFzZTsKLX0KLQotaW50Ci1jaGVja19leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKQotewotICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKGNoZWNrX2V4ZWN1dGFibGUpICA6ICVzXG4iLAotCQkJICBwYXRoID8gKCpwYXRoID8gcGF0aCA6ICJFTVBUWSEiKSA6ICJOVUxMISIpKTsKLSAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKChzdGF0IChwYXRoLCAmc3QpID49IDApCi0gICAgICAmJiAoc3Quc3RfbW9kZSAmIChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpKSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLW1ha2VfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgaW50IHJ2YWwgPSAwOwotICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKG1ha2VfZXhlY3V0YWJsZSkgICA6ICVzXG4iLAotCQkJICBwYXRoID8gKCpwYXRoID8gcGF0aCA6ICJFTVBUWSEiKSA6ICJOVUxMISIpKTsKLSAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkKLSAgICB7Ci0gICAgICBydmFsID0gY2htb2QgKHBhdGgsIHN0LnN0X21vZGUgfCBTX0lYT1RIIHwgU19JWEdSUCB8IFNfSVhVU1IpOwotICAgIH0KLSAgcmV0dXJuIHJ2YWw7Ci19Ci0KLS8qIFNlYXJjaGVzIGZvciB0aGUgZnVsbCBwYXRoIG9mIHRoZSB3cmFwcGVyLiAgUmV0dXJucwotICAgbmV3bHkgYWxsb2NhdGVkIGZ1bGwgcGF0aCBuYW1lIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZQotICAgRG9lcyBub3QgY2hhc2Ugc3ltbGlua3MsIGV2ZW4gb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGVtLgotKi8KLWNoYXIgKgotZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyICp3cmFwcGVyKQotewotICBpbnQgaGFzX3NsYXNoID0gMDsKLSAgY29uc3QgY2hhciAqcDsKLSAgY29uc3QgY2hhciAqcF9uZXh0OwotICAvKiBzdGF0aWMgYnVmZmVyIGZvciBnZXRjd2QgKi8KLSAgY2hhciB0bXBbTFRfUEFUSE1BWCArIDFdOwotICBpbnQgdG1wX2xlbjsKLSAgY2hhciAqY29uY2F0X25hbWU7Ci0KLSAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihmaW5kX2V4ZWN1dGFibGUpICAgOiAlc1xuIiwKLQkJCSAgd3JhcHBlciA/ICgqd3JhcHBlciA/IHdyYXBwZXIgOiAiRU1QVFkhIikgOiAiTlVMTCEiKSk7Ci0KLSAgaWYgKCh3cmFwcGVyID09IE5VTEwpIHx8ICgqd3JhcHBlciA9PSAnXDAnKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBBYnNvbHV0ZSBwYXRoPyAqLwotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICBpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIHdyYXBwZXJbMF0pICYmIHdyYXBwZXJbMV0gPT0gJzonKQotICAgIHsKLSAgICAgIGNvbmNhdF9uYW1lID0geHN0cmR1cCAod3JhcHBlcik7Ci0gICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQotCXJldHVybiBjb25jYXRfbmFtZTsKLSAgICAgIFhGUkVFIChjb25jYXRfbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2VuZGlmCi0gICAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAod3JhcHBlclswXSkpCi0JewotCSAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKLQkgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCi0JICAgIHJldHVybiBjb25jYXRfbmFtZTsKLQkgIFhGUkVFIChjb25jYXRfbmFtZSk7Ci0JfQotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICAgIH0KLSNlbmRpZgotCi0gIGZvciAocCA9IHdyYXBwZXI7ICpwOyBwKyspCi0gICAgaWYgKCpwID09ICcvJykKLSAgICAgIHsKLQloYXNfc2xhc2ggPSAxOwotCWJyZWFrOwotICAgICAgfQotICBpZiAoIWhhc19zbGFzaCkKLSAgICB7Ci0gICAgICAvKiBubyBzbGFzaGVzOyBzZWFyY2ggUEFUSCAqLwotICAgICAgY29uc3QgY2hhciAqcGF0aCA9IGdldGVudiAoIlBBVEgiKTsKLSAgICAgIGlmIChwYXRoICE9IE5VTEwpCi0JewotCSAgZm9yIChwID0gcGF0aDsgKnA7IHAgPSBwX25leHQpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpxOwotCSAgICAgIHNpemVfdCBwX2xlbjsKLQkgICAgICBmb3IgKHEgPSBwOyAqcTsgcSsrKQotCQlpZiAoSVNfUEFUSF9TRVBBUkFUT1IgKCpxKSkKLQkJICBicmVhazsKLQkgICAgICBwX2xlbiA9IHEgLSBwOwotCSAgICAgIHBfbmV4dCA9ICgqcSA9PSAnXDAnID8gcSA6IHEgKyAxKTsKLQkgICAgICBpZiAocF9sZW4gPT0gMCkKLQkJewotCQkgIC8qIGVtcHR5IHBhdGg6IGN1cnJlbnQgZGlyZWN0b3J5ICovCi0JCSAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQotCQkgICAgbHRfZmF0YWwgKCJnZXRjd2QgZmFpbGVkIik7Ci0JCSAgdG1wX2xlbiA9IHN0cmxlbiAodG1wKTsKLQkJICBjb25jYXRfbmFtZSA9Ci0JCSAgICBYTUFMTE9DIChjaGFyLCB0bXBfbGVuICsgMSArIHN0cmxlbiAod3JhcHBlcikgKyAxKTsKLQkJICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOwotCQkgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOwotCQkgIHN0cmNweSAoY29uY2F0X25hbWUgKyB0bXBfbGVuICsgMSwgd3JhcHBlcik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb25jYXRfbmFtZSA9Ci0JCSAgICBYTUFMTE9DIChjaGFyLCBwX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7Ci0JCSAgbWVtY3B5IChjb25jYXRfbmFtZSwgcCwgcF9sZW4pOwotCQkgIGNvbmNhdF9uYW1lW3BfbGVuXSA9ICcvJzsKLQkJICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgcF9sZW4gKyAxLCB3cmFwcGVyKTsKLQkJfQotCSAgICAgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCi0JCXJldHVybiBjb25jYXRfbmFtZTsKLQkgICAgICBYRlJFRSAoY29uY2F0X25hbWUpOwotCSAgICB9Ci0JfQotICAgICAgLyogbm90IGZvdW5kIGluIFBBVEg7IGFzc3VtZSBjdXJkaXIgKi8KLSAgICB9Ci0gIC8qIFJlbGF0aXZlIHBhdGggfCBub3QgZm91bmQgaW4gcGF0aDogcHJlcGVuZCBjd2QgKi8KLSAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQotICAgIGx0X2ZhdGFsICgiZ2V0Y3dkIGZhaWxlZCIpOwotICB0bXBfbGVuID0gc3RybGVuICh0bXApOwotICBjb25jYXRfbmFtZSA9IFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOwotICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOwotICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKLSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKLQotICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQotICAgIHJldHVybiBjb25jYXRfbmFtZTsKLSAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNoYXIgKgotY2hhc2Vfc3ltbGlua3MgKGNvbnN0IGNoYXIgKnBhdGhzcGVjKQotewotI2lmbmRlZiBTX0lTTE5LCi0gIHJldHVybiB4c3RyZHVwIChwYXRoc3BlYyk7Ci0jZWxzZQotICBjaGFyIGJ1ZltMVF9QQVRITUFYXTsKLSAgc3RydWN0IHN0YXQgczsKLSAgY2hhciAqdG1wX3BhdGhzcGVjID0geHN0cmR1cCAocGF0aHNwZWMpOwotICBjaGFyICpwOwotICBpbnQgaGFzX3N5bWxpbmtzID0gMDsKLSAgd2hpbGUgKHN0cmxlbiAodG1wX3BhdGhzcGVjKSAmJiAhaGFzX3N5bWxpbmtzKQotICAgIHsKLSAgICAgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCJjaGVja2luZyBwYXRoIGNvbXBvbmVudCBmb3Igc3ltbGlua3M6ICVzXG4iLAotCQkJICAgICAgdG1wX3BhdGhzcGVjKSk7Ci0gICAgICBpZiAobHN0YXQgKHRtcF9wYXRoc3BlYywgJnMpID09IDApCi0JewotCSAgaWYgKFNfSVNMTksgKHMuc3RfbW9kZSkgIT0gMCkKLQkgICAgewotCSAgICAgIGhhc19zeW1saW5rcyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogc2VhcmNoIGJhY2t3YXJkcyBmb3IgbGFzdCBESVJfU0VQQVJBVE9SICovCi0JICBwID0gdG1wX3BhdGhzcGVjICsgc3RybGVuICh0bXBfcGF0aHNwZWMpIC0gMTsKLQkgIHdoaWxlICgocCA+IHRtcF9wYXRoc3BlYykgJiYgKCFJU19ESVJfU0VQQVJBVE9SICgqcCkpKQotCSAgICBwLS07Ci0JICBpZiAoKHAgPT0gdG1wX3BhdGhzcGVjKSAmJiAoIUlTX0RJUl9TRVBBUkFUT1IgKCpwKSkpCi0JICAgIHsKLQkgICAgICAvKiBubyBtb3JlIERJUl9TRVBBUkFUT1JTIGxlZnQgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKnAgPSAnXDAnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICplcnJzdHIgPSBzdHJlcnJvciAoZXJybm8pOwotCSAgbHRfZmF0YWwgKCJFcnJvciBhY2Nlc3NpbmcgZmlsZSAlcyAoJXMpIiwgdG1wX3BhdGhzcGVjLCBlcnJzdHIpOwotCX0KLSAgICB9Ci0gIFhGUkVFICh0bXBfcGF0aHNwZWMpOwotCi0gIGlmICghaGFzX3N5bWxpbmtzKQotICAgIHsKLSAgICAgIHJldHVybiB4c3RyZHVwIChwYXRoc3BlYyk7Ci0gICAgfQotCi0gIHRtcF9wYXRoc3BlYyA9IHJlYWxwYXRoIChwYXRoc3BlYywgYnVmKTsKLSAgaWYgKHRtcF9wYXRoc3BlYyA9PSAwKQotICAgIHsKLSAgICAgIGx0X2ZhdGFsICgiQ291bGQgbm90IGZvbGxvdyBzeW1saW5rcyBmb3IgJXMiLCBwYXRoc3BlYyk7Ci0gICAgfQotICByZXR1cm4geHN0cmR1cCAodG1wX3BhdGhzcGVjKTsKLSNlbmRpZgotfQotCi1jaGFyICoKLXN0cmVuZHphcCAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpCi17Ci0gIHNpemVfdCBsZW4sIHBhdGxlbjsKLQotICBhc3NlcnQgKHN0ciAhPSBOVUxMKTsKLSAgYXNzZXJ0IChwYXQgIT0gTlVMTCk7Ci0KLSAgbGVuID0gc3RybGVuIChzdHIpOwotICBwYXRsZW4gPSBzdHJsZW4gKHBhdCk7Ci0KLSAgaWYgKHBhdGxlbiA8PSBsZW4pCi0gICAgewotICAgICAgc3RyICs9IGxlbiAtIHBhdGxlbjsKLSAgICAgIGlmIChzdHJjbXAgKHN0ciwgcGF0KSA9PSAwKQotCSpzdHIgPSAnXDAnOwotICAgIH0KLSAgcmV0dXJuIHN0cjsKLX0KLQotc3RhdGljIHZvaWQKLWx0X2Vycm9yX2NvcmUgKGludCBleGl0X3N0YXR1cywgY29uc3QgY2hhciAqbW9kZSwKLQkgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwgdmFfbGlzdCBhcCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAiLCBwcm9ncmFtX25hbWUsIG1vZGUpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIi5cbiIpOwotCi0gIGlmIChleGl0X3N0YXR1cyA+PSAwKQotICAgIGV4aXQgKGV4aXRfc3RhdHVzKTsKLX0KLQotdm9pZAotbHRfZmF0YWwgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKLXsKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQgKGFwLCBtZXNzYWdlKTsKLSAgbHRfZXJyb3JfY29yZSAoRVhJVF9GQUlMVVJFLCAiRkFUQUwiLCBtZXNzYWdlLCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotfQotCi12b2lkCi1sdF9zZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKGx0X3NldGVudikgc2V0dGluZyAnJXMnIHRvICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lID8gbmFtZSA6ICI8TlVMTD4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID8gdmFsdWUgOiAiPE5VTEw+IikpKTsKLSAgewotI2lmZGVmIEhBVkVfU0VURU5WCi0gICAgLyogYWx3YXlzIG1ha2UgYSBjb3B5LCBmb3IgY29uc2lzdGVuY3kgd2l0aCAhSEFWRV9TRVRFTlYgKi8KLSAgICBjaGFyICpzdHIgPSB4c3RyZHVwICh2YWx1ZSk7Ci0gICAgc2V0ZW52IChuYW1lLCBzdHIsIDEpOwotI2Vsc2UKLSAgICBpbnQgbGVuID0gc3RybGVuIChuYW1lKSArIDEgKyBzdHJsZW4gKHZhbHVlKSArIDE7Ci0gICAgY2hhciAqc3RyID0gWE1BTExPQyAoY2hhciwgbGVuKTsKLSAgICBzcHJpbnRmIChzdHIsICIlcz0lcyIsIG5hbWUsIHZhbHVlKTsKLSAgICBpZiAocHV0ZW52IChzdHIpICE9IEVYSVRfU1VDQ0VTUykKLSAgICAgIHsKLSAgICAgICAgWEZSRUUgKHN0cik7Ci0gICAgICB9Ci0jZW5kaWYKLSAgfQotfQotCi1jaGFyICoKLWx0X2V4dGVuZF9zdHIgKGNvbnN0IGNoYXIgKm9yaWdfdmFsdWUsIGNvbnN0IGNoYXIgKmFkZCwgaW50IHRvX2VuZCkKLXsKLSAgY2hhciAqbmV3X3ZhbHVlOwotICBpZiAob3JpZ192YWx1ZSAmJiAqb3JpZ192YWx1ZSkKLSAgICB7Ci0gICAgICBpbnQgb3JpZ192YWx1ZV9sZW4gPSBzdHJsZW4gKG9yaWdfdmFsdWUpOwotICAgICAgaW50IGFkZF9sZW4gPSBzdHJsZW4gKGFkZCk7Ci0gICAgICBuZXdfdmFsdWUgPSBYTUFMTE9DIChjaGFyLCBhZGRfbGVuICsgb3JpZ192YWx1ZV9sZW4gKyAxKTsKLSAgICAgIGlmICh0b19lbmQpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSwgb3JpZ192YWx1ZSk7Ci0gICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUgKyBvcmlnX3ZhbHVlX2xlbiwgYWRkKTsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUsIGFkZCk7Ci0gICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUgKyBhZGRfbGVuLCBvcmlnX3ZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5ld192YWx1ZSA9IHhzdHJkdXAgKGFkZCk7Ci0gICAgfQotICByZXR1cm4gbmV3X3ZhbHVlOwotfQotCi1pbnQKLWx0X3NwbGl0X25hbWVfdmFsdWUgKGNvbnN0IGNoYXIgKmFyZywgY2hhcioqIG5hbWUsIGNoYXIqKiB2YWx1ZSkKLXsKLSAgY29uc3QgY2hhciAqcDsKLSAgaW50IGxlbjsKLSAgaWYgKCFhcmcgfHwgISphcmcpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcCA9IHN0cmNociAoYXJnLCAoaW50KSc9Jyk7Ci0KLSAgaWYgKCFwKQotICAgIHJldHVybiAxOwotCi0gICp2YWx1ZSA9IHhzdHJkdXAgKCsrcCk7Ci0KLSAgbGVuID0gc3RybGVuIChhcmcpIC0gc3RybGVuICgqdmFsdWUpOwotICAqbmFtZSA9IFhNQUxMT0MgKGNoYXIsIGxlbik7Ci0gIHN0cm5jcHkgKCpuYW1lLCBhcmcsIGxlbi0xKTsKLSAgKCpuYW1lKVtsZW4gLSAxXSA9ICdcMCc7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWx0X29wdF9wcm9jZXNzX2Vudl9zZXQgKGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgY2hhciAqbmFtZSA9IE5VTEw7Ci0gIGNoYXIgKnZhbHVlID0gTlVMTDsKLQotICBpZiAobHRfc3BsaXRfbmFtZV92YWx1ZSAoYXJnLCAmbmFtZSwgJnZhbHVlKSAhPSAwKQotICAgIHsKLSAgICAgIFhGUkVFIChuYW1lKTsKLSAgICAgIFhGUkVFICh2YWx1ZSk7Ci0gICAgICBsdF9mYXRhbCAoImJhZCBhcmd1bWVudCBmb3IgJXM6ICclcyciLCBlbnZfc2V0X29wdCwgYXJnKTsKLSAgICB9Ci0KLSAgbHRfc2V0ZW52IChuYW1lLCB2YWx1ZSk7Ci0gIFhGUkVFIChuYW1lKTsKLSAgWEZSRUUgKHZhbHVlKTsKLX0KLQotdm9pZAotbHRfb3B0X3Byb2Nlc3NfZW52X3ByZXBlbmQgKGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgY2hhciAqbmFtZSA9IE5VTEw7Ci0gIGNoYXIgKnZhbHVlID0gTlVMTDsKLSAgY2hhciAqbmV3X3ZhbHVlID0gTlVMTDsKLQotICBpZiAobHRfc3BsaXRfbmFtZV92YWx1ZSAoYXJnLCAmbmFtZSwgJnZhbHVlKSAhPSAwKQotICAgIHsKLSAgICAgIFhGUkVFIChuYW1lKTsKLSAgICAgIFhGUkVFICh2YWx1ZSk7Ci0gICAgICBsdF9mYXRhbCAoImJhZCBhcmd1bWVudCBmb3IgJXM6ICclcyciLCBlbnZfcHJlcGVuZF9vcHQsIGFyZyk7Ci0gICAgfQotCi0gIG5ld192YWx1ZSA9IGx0X2V4dGVuZF9zdHIgKGdldGVudiAobmFtZSksIHZhbHVlLCAwKTsKLSAgbHRfc2V0ZW52IChuYW1lLCBuZXdfdmFsdWUpOwotICBYRlJFRSAobmV3X3ZhbHVlKTsKLSAgWEZSRUUgKG5hbWUpOwotICBYRlJFRSAodmFsdWUpOwotfQotCi12b2lkCi1sdF9vcHRfcHJvY2Vzc19lbnZfYXBwZW5kIChjb25zdCBjaGFyICphcmcpCi17Ci0gIGNoYXIgKm5hbWUgPSBOVUxMOwotICBjaGFyICp2YWx1ZSA9IE5VTEw7Ci0gIGNoYXIgKm5ld192YWx1ZSA9IE5VTEw7Ci0KLSAgaWYgKGx0X3NwbGl0X25hbWVfdmFsdWUgKGFyZywgJm5hbWUsICZ2YWx1ZSkgIT0gMCkKLSAgICB7Ci0gICAgICBYRlJFRSAobmFtZSk7Ci0gICAgICBYRlJFRSAodmFsdWUpOwotICAgICAgbHRfZmF0YWwgKCJiYWQgYXJndW1lbnQgZm9yICVzOiAnJXMnIiwgZW52X2FwcGVuZF9vcHQsIGFyZyk7Ci0gICAgfQotCi0gIG5ld192YWx1ZSA9IGx0X2V4dGVuZF9zdHIgKGdldGVudiAobmFtZSksIHZhbHVlLCAxKTsKLSAgbHRfc2V0ZW52IChuYW1lLCBuZXdfdmFsdWUpOwotICBYRlJFRSAobmV3X3ZhbHVlKTsKLSAgWEZSRUUgKG5hbWUpOwotICBYRlJFRSAodmFsdWUpOwotfQotCi12b2lkCi1sdF91cGRhdGVfZXhlX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKGx0X3VwZGF0ZV9leGVfcGF0aCkgbW9kaWZ5aW5nICclcycgYnkgcHJlcGVuZGluZyAnJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSA/IG5hbWUgOiAiPE5VTEw+IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA/IHZhbHVlIDogIjxOVUxMPiIpKSk7Ci0KLSAgaWYgKG5hbWUgJiYgKm5hbWUgJiYgdmFsdWUgJiYgKnZhbHVlKQotICAgIHsKLSAgICAgIGNoYXIgKm5ld192YWx1ZSA9IGx0X2V4dGVuZF9zdHIgKGdldGVudiAobmFtZSksIHZhbHVlLCAwKTsKLSAgICAgIC8qIHNvbWUgc3lzdGVtcyBjYW4ndCBjb3BlIHdpdGggYSAnOictdGVybWluYXRlZCBwYXRoICMnICovCi0gICAgICBpbnQgbGVuID0gc3RybGVuIChuZXdfdmFsdWUpOwotICAgICAgd2hpbGUgKCgobGVuID0gc3RybGVuIChuZXdfdmFsdWUpKSA+IDApICYmIElTX1BBVEhfU0VQQVJBVE9SIChuZXdfdmFsdWVbbGVuLTFdKSkKLSAgICAgICAgewotICAgICAgICAgIG5ld192YWx1ZVtsZW4tMV0gPSAnXDAnOwotICAgICAgICB9Ci0gICAgICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7Ci0gICAgICBYRlJFRSAobmV3X3ZhbHVlKTsKLSAgICB9Ci19Ci0KLXZvaWQKLWx0X3VwZGF0ZV9saWJfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0gIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobHRfdXBkYXRlX2xpYl9wYXRoKSBtb2RpZnlpbmcgJyVzJyBieSBwcmVwZW5kaW5nICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lID8gbmFtZSA6ICI8TlVMTD4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID8gdmFsdWUgOiAiPE5VTEw+IikpKTsKLQotICBpZiAobmFtZSAmJiAqbmFtZSAmJiB2YWx1ZSAmJiAqdmFsdWUpCi0gICAgewotICAgICAgY2hhciAqbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDApOwotICAgICAgbHRfc2V0ZW52IChuYW1lLCBuZXdfdmFsdWUpOwotICAgICAgWEZSRUUgKG5ld192YWx1ZSk7Ci0gICAgfQotfQotCi0KLUVPRgotfQotIyBlbmQ6IGZ1bmNfZW1pdF9jd3JhcHBlcmV4ZV9zcmMKLQotIyBmdW5jX21vZGVfbGluayBhcmcuLi4KLWZ1bmNfbW9kZV9saW5rICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgIGNhc2UgJGhvc3QgaW4KLSAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQotICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAotICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAotICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQotICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9jYXRpb24uCi0gICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubwotCi0gICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKLSAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90Ci0gICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQotICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCi0gICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICAqKQotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgbGlidG9vbF9hcmdzPSRub25vcHQKLSAgICBiYXNlX2NvbXBpbGU9IiRub25vcHQgJEAiCi0gICAgY29tcGlsZV9jb21tYW5kPSRub25vcHQKLSAgICBmaW5hbGl6ZV9jb21tYW5kPSRub25vcHQKLQotICAgIGNvbXBpbGVfcnBhdGg9Ci0gICAgZmluYWxpemVfcnBhdGg9Ci0gICAgY29tcGlsZV9zaGxpYnBhdGg9Ci0gICAgZmluYWxpemVfc2hsaWJwYXRoPQotICAgIGNvbnZlbmllbmNlPQotICAgIG9sZF9jb252ZW5pZW5jZT0KLSAgICBkZXBsaWJzPQotICAgIG9sZF9kZXBsaWJzPQotICAgIGNvbXBpbGVyX2ZsYWdzPQotICAgIGxpbmtlcl9mbGFncz0KLSAgICBkbGxzZWFyY2hwYXRoPQotICAgIGxpYl9zZWFyY2hfcGF0aD1gcHdkYAotICAgIGluc3RfcHJlZml4X2Rpcj0KLSAgICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0KLQotICAgIGF2b2lkX3ZlcnNpb249bm8KLSAgICBkbGZpbGVzPQotICAgIGRscHJlZmlsZXM9Ci0gICAgZGxzZWxmPW5vCi0gICAgZXhwb3J0X2R5bmFtaWM9bm8KLSAgICBleHBvcnRfc3ltYm9scz0KLSAgICBleHBvcnRfc3ltYm9sc19yZWdleD0KLSAgICBnZW5lcmF0ZWQ9Ci0gICAgbGlib2Jqcz0KLSAgICBsdGxpYnM9Ci0gICAgbW9kdWxlPW5vCi0gICAgbm9faW5zdGFsbD1ubwotICAgIG9ianM9Ci0gICAgbm9uX3BpY19vYmplY3RzPQotICAgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PQotICAgIHByZWZlcl9zdGF0aWNfbGlicz1ubwotICAgIHByZWxvYWQ9bm8KLSAgICBwcmV2PQotICAgIHByZXZhcmc9Ci0gICAgcmVsZWFzZT0KLSAgICBycGF0aD0KLSAgICB4cnBhdGg9Ci0gICAgcGVybV9ycGF0aD0KLSAgICB0ZW1wX3JwYXRoPQotICAgIHRocmVhZF9zYWZlPW5vCi0gICAgdmluZm89Ci0gICAgdmluZm9fbnVtYmVyPW5vCi0gICAgd2Vha19saWJzPQotICAgIHNpbmdsZV9tb2R1bGU9IiR7d2x9LXNpbmdsZV9tb2R1bGUiCi0gICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQotCi0gICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtc2hhcmVkKQotCXRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiBcCi0JICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gImNhbiBub3QgYnVpbGQgYSBzaGFyZWQgbGlicmFyeSIKLQlidWlsZF9vbGRfbGlicz1ubwotCWJyZWFrCi0JOzsKLSAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQotCWNhc2UgJGFyZyBpbgotCS1hbGwtc3RhdGljKQotCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgIGZ1bmNfd2FybmluZyAiY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iCi0JICBmaQotCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQkgIGZpCi0JICBwcmVmZXJfc3RhdGljX2xpYnM9eWVzCi0JICA7OwotCS1zdGF0aWMpCi0JICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCi0JICBmaQotCSAgcHJlZmVyX3N0YXRpY19saWJzPWJ1aWx0Ci0JICA7OwotCS1zdGF0aWMtbGlidG9vbC1saWJzKQotCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCSAgZmkKLQkgIHByZWZlcl9zdGF0aWNfbGlicz15ZXMKLQkgIDs7Ci0JZXNhYwotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotCWJyZWFrCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFNlZSBpZiBvdXIgc2hhcmVkIGFyY2hpdmVzIGRlcGVuZCBvbiBzdGF0aWMgYXJjaGl2ZXMuCi0gICAgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIGJ1aWxkX29sZF9saWJzPXllcwotCi0gICAgIyBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudHMsIHRyYW5zZm9ybWluZyB0aGVtIG9uIHRoZSB3YXkuCi0gICAgd2hpbGUgdGVzdCAiJCMiIC1ndCAwOyBkbwotICAgICAgYXJnPSIkMSIKLSAgICAgIHNoaWZ0Ci0gICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotICAgICAgcWFyZz0kZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQKLSAgICAgIGZ1bmNfYXBwZW5kIGxpYnRvb2xfYXJncyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQotICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQljYXNlICRwcmV2IGluCi0Jb3V0cHV0KQotCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgQE9VVFBVVEAiCi0JICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgQE9VVFBVVEAiCi0JICA7OwotCWVzYWMKLQotCWNhc2UgJHByZXYgaW4KLQlkbGZpbGVzfGRscHJlZmlsZXMpCi0JICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSBubzsgdGhlbgotCSAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgotCSAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiBAU1lNRklMRUAiCi0JICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiBAU1lNRklMRUAiCi0JICAgIHByZWxvYWQ9eWVzCi0JICBmaQotCSAgY2FzZSAkYXJnIGluCi0JICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgotCSAgZm9yY2UpCi0JICAgIGlmIHRlc3QgIiRkbHNlbGYiID0gbm87IHRoZW4KLQkgICAgICBkbHNlbGY9bmVlZGxlc3MKLQkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKLQkgICAgZmkKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIHNlbGYpCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICAgICBkbHNlbGY9eWVzCi0JICAgIGVsaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiICE9IHllczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxzZQotCSAgICAgIGRsc2VsZj1uZWVkbGVzcwotCSAgICAgIGV4cG9ydF9keW5hbWljPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICAgIGVsc2UKLQkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQlleHBzeW1zKQotCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCi0JICB0ZXN0IC1mICIkYXJnIiBcCi0JICAgIHx8IGZ1bmNfZmF0YWxfZXJyb3IgInN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JZXhwc3ltc19yZWdleCkKLQkgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWZyYW1ld29yaykKLQkgIGNhc2UgJGhvc3QgaW4KLQkgICAgKi0qLWRhcndpbiopCi0JICAgICAgY2FzZSAiJGRlcGxpYnMgIiBpbgotCQkqIiAkcWFyZy5sdGZyYW1ld29yayAiKikgOzsKLQkJKikgZGVwbGlicz0iJGRlcGxpYnMgJHFhcmcubHRmcmFtZXdvcmsiICMgdGhpcyBpcyBmaXhlZCBsYXRlcgotCQkgICA7OwotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgZXNhYwotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWluc3RfcHJlZml4KQotCSAgaW5zdF9wcmVmaXhfZGlyPSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCW9iamVjdGxpc3QpCi0JICBpZiB0ZXN0IC1mICIkYXJnIjsgdGhlbgotCSAgICBzYXZlX2FyZz0kYXJnCi0JICAgIG1vcmVhcmdzPQotCSAgICBmb3IgZmlsIGluIGBjYXQgIiRzYXZlX2FyZyJgCi0JICAgIGRvCi0jCSAgICAgIG1vcmVhcmdzPSIkbW9yZWFyZ3MgJGZpbCIKLQkgICAgICBhcmc9JGZpbAotCSAgICAgICMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgotCi0JICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgotCSAgICAgIGlmIGZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRhcmciOyB0aGVuCi0JCXBpY19vYmplY3Q9Ci0JCW5vbl9waWNfb2JqZWN0PQotCi0JCSMgUmVhZCB0aGUgLmxvIGZpbGUKLQkJZnVuY19zb3VyY2UgIiRhcmciCi0KLQkJaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8Ci0JCSAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKLQkJICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJgotCQkgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiID0gbm9uZTsgdGhlbgotCQkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIgotCQlmaQotCi0JCSMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JCWZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCi0JCXhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCi0JCWlmIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkJICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgotCi0JCSAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCQkgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgotCQkgICAgICBkbGZpbGVzPSIkZGxmaWxlcyAkcGljX29iamVjdCIKLQkJICAgICAgcHJldj0KLQkJICAgICAgY29udGludWUKLQkJICAgIGVsc2UKLQkJICAgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkJICAgICAgcHJldj1kbHByZWZpbGVzCi0JCSAgICBmaQotCQkgIGZpCi0KLQkJICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQotCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkJICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLQkJICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgotCQkgICAgcHJldj0KLQkJICBmaQotCi0JCSAgIyBBIFBJQyBvYmplY3QuCi0JCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRwaWNfb2JqZWN0IgotCQkgIGFyZz0iJHBpY19vYmplY3QiCi0JCWZpCi0KLQkJIyBOb24tUElDIG9iamVjdC4KLQkJaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkJICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCi0KLQkJICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKLQkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCi0JCSAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCi0JCSAgICBhcmc9IiRub25fcGljX29iamVjdCIKLQkJICBmaQotCQllbHNlCi0JCSAgIyBJZiB0aGUgUElDIG9iamVjdCBleGlzdHMsIHVzZSBpdCBpbnN0ZWFkLgotCQkgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KLQkJICBub25fcGljX29iamVjdD0iJHBpY19vYmplY3QiCi0JCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgotCQlmaQotCSAgICAgIGVsc2UKLQkJIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCi0JCWlmICRvcHRfZHJ5X3J1bjsgdGhlbgotCQkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKLQkJICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQotCQkgIGZ1bmNfbG8ybyAiJGFyZyIKLQkJICBwaWNfb2JqZWN0PSR4ZGlyJG9iamRpci8kZnVuY19sbzJvX3Jlc3VsdAotCQkgIG5vbl9waWNfb2JqZWN0PSR4ZGlyJGZ1bmNfbG8yb19yZXN1bHQKLQkJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCi0JCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgotCSAgICAgICAgZWxzZQotCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBvYmplY3QiCi0JCWZpCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZWxzZQotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJsaW5rIGlucHV0IGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKLQkgIGZpCi0JICBhcmc9JHNhdmVfYXJnCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcHJlY2lvdXNfcmVnZXgpCi0JICBwcmVjaW91c19maWxlc19yZWdleD0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlyZWxlYXNlKQotCSAgcmVsZWFzZT0iLSRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcnBhdGggfCB4cnBhdGgpCi0JICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQkgIGNhc2UgJGFyZyBpbgotCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSAgKikKLQkgICAgZnVuY19mYXRhbF9lcnJvciAib25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBpZiB0ZXN0ICIkcHJldiIgPSBycGF0aDsgdGhlbgotCSAgICBjYXNlICIkcnBhdGggIiBpbgotCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqKSBycGF0aD0iJHJwYXRoICRhcmciIDs7Ci0JICAgIGVzYWMKLQkgIGVsc2UKLQkgICAgY2FzZSAiJHhycGF0aCAiIGluCi0JICAgICoiICRhcmcgIiopIDs7Ci0JICAgICopIHhycGF0aD0iJHhycGF0aCAkYXJnIiA7OwotCSAgICBlc2FjCi0JICBmaQotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXNocmV4dCkKLQkgIHNocmV4dF9jbWRzPSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXdlYWspCi0JICB3ZWFrX2xpYnM9IiR3ZWFrX2xpYnMgJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQl4Y2NsaW5rZXIpCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJHFhcmciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgotCSAgcHJldj0KLQkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRxYXJnIgotCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRxYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0JeGNvbXBpbGVyKQotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkcWFyZyIKLQkgIHByZXY9Ci0JICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkcWFyZyIKLQkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkcWFyZyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCXhsaW5rZXIpCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJHFhcmciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRxYXJnIgotCSAgcHJldj0KLQkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICR3bCRxYXJnIgotCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICR3bCRxYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0JKikKLQkgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQllc2FjCi0gICAgICBmaSAjIHRlc3QgLW4gIiRwcmV2IgotCi0gICAgICBwcmV2YXJnPSIkYXJnIgotCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1hbGwtc3RhdGljKQotCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgIyBTZWUgY29tbWVudCBmb3IgLXN0YXRpYyBmbGFnIGJlbG93LCBmb3IgbW9yZSBkZXRhaWxzLgotCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGxpbmtfc3RhdGljX2ZsYWciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hbGxvdy11bmRlZmluZWQpCi0JIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgotCWZ1bmNfZmF0YWxfZXJyb3IgIlxgLWFsbG93LXVuZGVmaW5lZCcgbXVzdCBub3QgYmUgdXNlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IgotCTs7Ci0KLSAgICAgIC1hdm9pZC12ZXJzaW9uKQotCWF2b2lkX3ZlcnNpb249eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZGxvcGVuKQotCXByZXY9ZGxmaWxlcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRscHJlb3BlbikKLQlwcmV2PWRscHJlZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1leHBvcnQtZHluYW1pYykKLQlleHBvcnRfZHluYW1pYz15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1leHBvcnQtc3ltYm9scyB8IC1leHBvcnQtc3ltYm9scy1yZWdleCkKLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgIGZ1bmNfZmF0YWxfZXJyb3IgIm1vcmUgdGhhbiBvbmUgLWV4cG9ydGVkLXN5bWJvbHMgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQiCi0JZmkKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1leHBvcnQtc3ltYm9scyI7IHRoZW4KLQkgIHByZXY9ZXhwc3ltcwotCWVsc2UKLQkgIHByZXY9ZXhwc3ltc19yZWdleAotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZnJhbWV3b3JrKQotCXByZXY9ZnJhbWV3b3JrCi0JY29udGludWUKLQk7OwotCi0gICAgICAtaW5zdC1wcmVmaXgtZGlyKQotCXByZXY9aW5zdF9wcmVmaXgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgVGhlIG5hdGl2ZSBJUklYIGxpbmtlciB1bmRlcnN0YW5kcyAtTEFORzoqLCAtTElTVDoqIGFuZCAtTE5POioKLSAgICAgICMgc28sIGlmIHdlIHNlZSB0aGVzZSBmbGFncyBiZSBjYXJlZnVsIG5vdCB0byB0cmVhdCB0aGVtIGxpa2UgLUwKLSAgICAgIC1MW0EtWl1bQS1aXSo6KikKLQljYXNlICR3aXRoX2djYy8kaG9zdCBpbgotCW5vLyotKi1pcml4KiB8IC8qLSotaXJpeCopCi0JICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgotCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCi0JICA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1MKikKLQlmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkYXJnIgotCWRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JaWYgdGVzdCAteiAiJGRpciI7IHRoZW4KLQkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJyZXF1aXJlIG5vIHNwYWNlIGJldHdlZW4gXGAtTCcgYW5kIFxgJDEnIgotCSAgZWxzZQotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJuZWVkIHBhdGggZm9yIFxgLUwnIG9wdGlvbiIKLQkgIGZpCi0JZmkKLQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQljYXNlICRkaXIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0JKikKLQkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLQkgIHRlc3QgLXogIiRhYnNkaXIiICYmIFwKLQkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIgotCSAgZGlyPSIkYWJzZGlyIgotCSAgOzsKLQllc2FjCi0JY2FzZSAiJGRlcGxpYnMgIiBpbgotCSoiIC1MJGRpciAiKikgOzsKLQkqKQotCSAgZGVwbGlicz0iJGRlcGxpYnMgLUwkZGlyIgotCSAgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiCi0JICA7OwotCWVzYWMKLQljYXNlICRob3N0IGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKLQkgIHRlc3RiaW5kaXI9YCRFQ0hPICJYJGRpciIgfCAkWHNlZCAtZSAncyovbGliJCovYmluKidgCi0JICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KLQkgICoiOiRkaXI6IiopIDs7Ci0JICA6OikgZGxsc2VhcmNocGF0aD0kZGlyOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkaXIiOzsKLQkgIGVzYWMKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7Ci0JICA6OikgZGxsc2VhcmNocGF0aD0kdGVzdGJpbmRpcjs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokdGVzdGJpbmRpciI7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbCopCi0JaWYgdGVzdCAiWCRhcmciID0gIlgtbGMiIHx8IHRlc3QgIlgkYXJnIiA9ICJYLWxtIjsgdGhlbgotCSAgY2FzZSAkaG9zdCBpbgotCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLWJlb3MqIHwgKi1jZWdjYyopCi0JICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBvciBtYXRoIGxpYnJhcnkgKGFzIHN1Y2gpCi0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqLSotb3MyKikKLQkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIGxpYnJhcnkgKGFzIHN1Y2gpCi0JICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCi0JICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgotCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKLQkgICAgOzsKLQkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKLQkgICAgIyBSaGFwc29keSBDIGFuZCBtYXRoIGxpYnJhcmllcyBhcmUgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQkgICAgZGVwbGlicz0iJGRlcGxpYnMgU3lzdGVtLmx0ZnJhbWV3b3JrIgotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQotCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCi0JICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0JICBlc2FjCi0JZWxpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sY19yIjsgdGhlbgotCSBjYXNlICRob3N0IGluCi0JICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQotCSAgICMgRG8gbm90IGluY2x1ZGUgbGliY19yIGRpcmVjdGx5LCB1c2UgLXB0aHJlYWQgZmxhZy4KLQkgICBjb250aW51ZQotCSAgIDs7Ci0JIGVzYWMKLQlmaQotCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbW9kdWxlKQotCW1vZHVsZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgVHJ1NjQgVU5JWCB1c2VzIC1tb2RlbCBbYXJnXSB0byBkZXRlcm1pbmUgdGhlIGxheW91dCBvZiBDKysKLSAgICAgICMgY2xhc3NlcywgbmFtZSBtYW5nbGluZywgYW5kIGV4Y2VwdGlvbiBoYW5kbGluZy4KLSAgICAgICMgRGFyd2luIHVzZXMgdGhlIC1hcmNoIGZsYWcgdG8gZGV0ZXJtaW5lIG91dHB1dCBhcmNoaXRlY3R1cmUuCi0gICAgICAtbW9kZWx8LWFyY2h8LWlzeXNyb290KQotCWNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKLQlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgotCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgotCXByZXY9eGNvbXBpbGVyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlfC10aHJlYWRzKQotCWNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKLQlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgotCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgotCWNhc2UgIiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCi0JICAgICoiICRhcmcgIiopIDs7Ci0JICAgICogKSBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRhcmciIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW11bHRpX21vZHVsZSkKLQlzaW5nbGVfbW9kdWxlPSIke3dsfS1tdWx0aV9tb2R1bGUiCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbm8tZmFzdC1pbnN0YWxsKQotCWZhc3RfaW5zdGFsbD1ubwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW5vLWluc3RhbGwpCi0JY2FzZSAkaG9zdCBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi0qLWRhcndpbiogfCAqLWNlZ2NjKikKLQkgICMgVGhlIFBBVEggaGFja2VyeSBpbiB3cmFwcGVyIHNjcmlwdHMgaXMgcmVxdWlyZWQgb24gV2luZG93cwotCSAgIyBhbmQgRGFyd2luIGluIG9yZGVyIGZvciB0aGUgbG9hZGVyIHRvIGZpbmQgYW55IGRsbHMgaXQgbmVlZHMuCi0JICBmdW5jX3dhcm5pbmcgIlxgLW5vLWluc3RhbGwnIGlzIGlnbm9yZWQgZm9yICRob3N0IgotCSAgZnVuY193YXJuaW5nICJhc3N1bWluZyBcYC1uby1mYXN0LWluc3RhbGwnIGluc3RlYWQiCi0JICBmYXN0X2luc3RhbGw9bm8KLQkgIDs7Ci0JKikgbm9faW5zdGFsbD15ZXMgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbm8tdW5kZWZpbmVkKQotCWFsbG93X3VuZGVmaW5lZD1ubwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW9iamVjdGxpc3QpCi0JcHJldj1vYmplY3RsaXN0Ci0JY29udGludWUKLQk7OwotCi0gICAgICAtbykgcHJldj1vdXRwdXQgOzsKLQotICAgICAgLXByZWNpb3VzLWZpbGVzLXJlZ2V4KQotCXByZXY9cHJlY2lvdXNfcmVnZXgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1yZWxlYXNlKQotCXByZXY9cmVsZWFzZQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXJwYXRoKQotCXByZXY9cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKQotCXByZXY9eHJwYXRoCi0JY29udGludWUKLQk7OwotCi0gICAgICAtUiopCi0JZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGFyZyIKLQlkaXI9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCWNhc2UgJGRpciBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKLQkqKQotCSAgZnVuY19mYXRhbF9lcnJvciAib25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiCi0JICA7OwotCWVzYWMKLQljYXNlICIkeHJwYXRoICIgaW4KLQkqIiAkZGlyICIqKSA7OwotCSopIHhycGF0aD0iJHhycGF0aCAkZGlyIiA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1zaGFyZWQpCi0JIyBUaGUgZWZmZWN0cyBvZiAtc2hhcmVkIGFyZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgbG9vcC4KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1zaHJleHQpCi0JcHJldj1zaHJleHQKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1zdGF0aWMgfCAtc3RhdGljLWxpYnRvb2wtbGlicykKLQkjIFRoZSBlZmZlY3RzIG9mIC1zdGF0aWMgYXJlIGRlZmluZWQgaW4gYSBwcmV2aW91cyBsb29wLgotCSMgV2UgdXNlZCB0byBkbyB0aGUgc2FtZSBhcyAtYWxsLXN0YXRpYyBvbiBwbGF0Zm9ybXMgdGhhdAotCSMgZGlkbid0IGhhdmUgYSBQSUMgZmxhZywgYnV0IHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGVmZmVjdHMKLQkjIHdvdWxkIGJlIGVxdWl2YWxlbnQgd2FzIHdyb25nLiAgSXQgd291bGQgYnJlYWsgb24gYXQgbGVhc3QKLQkjIERpZ2l0YWwgVW5peCBhbmQgQUlYLgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXRocmVhZC1zYWZlKQotCXRocmVhZF9zYWZlPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXZlcnNpb24taW5mbykKLQlwcmV2PXZpbmZvCi0JY29udGludWUKLQk7OwotCi0gICAgICAtdmVyc2lvbi1udW1iZXIpCi0JcHJldj12aW5mbwotCXZpbmZvX251bWJlcj15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC13ZWFrKQotICAgICAgICBwcmV2PXdlYWsKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1XYywqKQotCWZ1bmNfc3RyaXBuYW1lICctV2MsJyAnJyAiJGFyZyIKLQlhcmdzPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQlhcmc9Ci0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCi0JZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkZmxhZyIKLQkgIGFyZz0iJGFyZyAkd2wkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0JZnVuY19zdHJpcG5hbWUgJyAnICcnICIkYXJnIgotCWFyZz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JOzsKLQotICAgICAgLVdsLCopCi0JZnVuY19zdHJpcG5hbWUgJy1XbCwnICcnICIkYXJnIgotCWFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCWFyZz0KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKLQlmb3IgZmxhZyBpbiAkYXJnczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgotCSAgYXJnPSIkYXJnICR3bCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0JZnVuY19zdHJpcG5hbWUgJyAnICcnICIkYXJnIgotCWFyZz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JOzsKLQotICAgICAgLVhjb21waWxlcikKLQlwcmV2PXhjb21waWxlcgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVhsaW5rZXIpCi0JcHJldj14bGlua2VyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtWENDbGlua2VyKQotCXByZXY9eGNjbGlua2VyCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIC1tc2dfKiBmb3Igb3NmIGNjCi0gICAgICAtbXNnXyopCi0JZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKLQlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQk7OwotCi0gICAgICAjIC02NCwgLW1pcHNbMC05XSBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIFNHSSBjb21waWxlcgotICAgICAgIyAtclswLTldWzAtOV0qIHNwZWNpZmllcyB0aGUgcHJvY2Vzc29yIG9uIHRoZSBTR0kgY29tcGlsZXIKLSAgICAgICMgLXhhcmNoPSosIC14dGFyZ2V0PSogZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBTdW4gY29tcGlsZXIKLSAgICAgICMgK0RBKiwgK0REKiBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIEhQIGNvbXBpbGVyCi0gICAgICAjIC1xKiBwYXNzIHRocm91Z2ggY29tcGlsZXIgYXJncyBmb3IgdGhlIElCTSBjb21waWxlcgotICAgICAgIyAtbSosIC10WzQ1XSosIC10eHNjYWxlKiBwYXNzIHRocm91Z2ggYXJjaGl0ZWN0dXJlLXNwZWNpZmljCi0gICAgICAjIGNvbXBpbGVyIGFyZ3MgZm9yIEdDQwotICAgICAgIyAtRi9wYXRoIGdpdmVzIHBhdGggdG8gdW5pbnN0YWxsZWQgZnJhbWV3b3JrcywgZ2NjIG9uIGRhcndpbgotICAgICAgIyAtcCwgLXBnLCAtLWNvdmVyYWdlLCAtZnByb2ZpbGUtKiBwYXNzIHRocm91Z2ggcHJvZmlsaW5nIGZsYWcgZm9yIEdDQwotICAgICAgIyBAZmlsZSBHQ0MgcmVzcG9uc2UgZmlsZXMKLSAgICAgIC02NHwtbWlwc1swLTldfC1yWzAtOV1bMC05XSp8LXhhcmNoPSp8LXh0YXJnZXQ9KnwrREEqfCtERCp8LXEqfC1tKnwgXAotICAgICAgLXRbNDVdKnwtdHhzY2FsZSp8LXB8LXBnfC0tY292ZXJhZ2V8LWZwcm9maWxlLSp8LUYqfEAqKQotICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotICAgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgotICAgICAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgotICAgICAgICBjb250aW51ZQotICAgICAgICA7OwotCi0gICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgZmxhZy4KLSAgICAgIC0qIHwgKyopCi0gICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCi0JYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0JOzsKLQotICAgICAgKi4kb2JqZXh0KQotCSMgQSBzdGFuZGFyZCBvYmplY3QuCi0Jb2Jqcz0iJG9ianMgJGFyZyIKLQk7OwotCi0gICAgICAqLmxvKQotCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgotCWlmIGZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRhcmciOyB0aGVuCi0JICBwaWNfb2JqZWN0PQotCSAgbm9uX3BpY19vYmplY3Q9Ci0KLQkgICMgUmVhZCB0aGUgLmxvIGZpbGUKLQkgIGZ1bmNfc291cmNlICIkYXJnIgotCi0JICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwKLQkgICAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKLQkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYKLQkgICAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIgotCSAgZmkKLQotCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KLQkgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCi0JICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQotCSAgaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkgICAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKLQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgotCQlkbGZpbGVzPSIkZGxmaWxlcyAkcGljX29iamVjdCIKLQkJcHJldj0KLQkJY29udGludWUKLQkgICAgICBlbHNlCi0JCSMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JCXByZXY9ZGxwcmVmaWxlcwotCSAgICAgIGZpCi0JICAgIGZpCi0KLQkgICAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLQkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkcGljX29iamVjdCIKLQkgICAgICBwcmV2PQotCSAgICBmaQotCi0JICAgICMgQSBQSUMgb2JqZWN0LgotCSAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCi0JICAgIGFyZz0iJHBpY19vYmplY3QiCi0JICBmaQotCi0JICAjIE5vbi1QSUMgb2JqZWN0LgotCSAgaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JICAgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCi0JICAgIG5vbl9waWNfb2JqZWN0PSIkeGRpciRub25fcGljX29iamVjdCIKLQotCSAgICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKLQkgICAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgotCSAgICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KLQkgICAgICBhcmc9IiRub25fcGljX29iamVjdCIKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgIyBJZiB0aGUgUElDIG9iamVjdCBleGlzdHMsIHVzZSBpdCBpbnN0ZWFkLgotCSAgICAjICR4ZGlyIHdhcyBwcmVwZW5kZWQgdG8gJHBpY19vYmplY3QgYWJvdmUuCi0JICAgIG5vbl9waWNfb2JqZWN0PSIkcGljX29iamVjdCIKLQkgICAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgotCSAgZmkKLQllbHNlCi0JICAjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KLQkgIGlmICRvcHRfZHJ5X3J1bjsgdGhlbgotCSAgICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotCSAgICBmdW5jX2Rpcm5hbWUgIiRhcmciICIvIiAiIgotCSAgICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQotCSAgICBmdW5jX2xvMm8gIiRhcmciCi0JICAgIHBpY19vYmplY3Q9JHhkaXIkb2JqZGlyLyRmdW5jX2xvMm9fcmVzdWx0Ci0JICAgIG5vbl9waWNfb2JqZWN0PSR4ZGlyJGZ1bmNfbG8yb19yZXN1bHQKLQkgICAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRwaWNfb2JqZWN0IgotCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCi0JICBlbHNlCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBvYmplY3QiCi0JICBmaQotCWZpCi0JOzsKLQotICAgICAgKi4kbGliZXh0KQotCSMgQW4gYXJjaGl2ZS4KLQlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCW9sZF9kZXBsaWJzPSIkb2xkX2RlcGxpYnMgJGFyZyIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgotCi0JaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCi0JICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgotCSAgcHJldj0KLQllbGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICMgVGhlIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCi0JICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgcHJldj0KLQllbHNlCi0JICBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgYXJndW1lbnQuCi0gICAgICAqKQotCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAotCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCi0JZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKLQlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQk7OwotICAgICAgZXNhYyAjIGFyZwotCi0gICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCi0JZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKLQlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZSAjIGFyZ3VtZW50IHBhcnNpbmcgbG9vcAotCi0gICAgdGVzdCAtbiAiJHByZXYiICYmIFwKLSAgICAgIGZ1bmNfZmF0YWxfaGVscCAidGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIKLQotICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXMgJiYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KLSAgICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0gICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgotICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCi0gICAgZmkKLQotICAgIG9sZGxpYnM9Ci0gICAgIyBjYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIHdpdGhvdXQgaXRzIGRpcmVjdG9yeQotICAgIGZ1bmNfYmFzZW5hbWUgIiRvdXRwdXQiCi0gICAgb3V0cHV0bmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotICAgIGxpYm9ianNfc2F2ZT0iJGxpYm9ianMiCi0KLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgICMgZ2V0IHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJHNobGlicGF0aF92YXIKLSAgICAgIGV2YWwgc2hsaWJfc2VhcmNoX3BhdGg9XGBcJEVDSE8gXCJYXCR7JHNobGlicGF0aF92YXJ9XCIgXHwgXCRYc2VkIC1lIFwncy86LyAvZ1wnXGAKLSAgICBlbHNlCi0gICAgICBzaGxpYl9zZWFyY2hfcGF0aD0KLSAgICBmaQotICAgIGV2YWwgc3lzX2xpYl9zZWFyY2hfcGF0aD1cIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNcIgotICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKLQotICAgIGZ1bmNfZGlybmFtZSAiJG91dHB1dCIgIi8iICIiCi0gICAgb3V0cHV0X29iamRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkb2JqZGlyIgotICAgICMgQ3JlYXRlIHRoZSBvYmplY3QgZGlyZWN0b3J5LgotICAgIGZ1bmNfbWtkaXJfcCAiJG91dHB1dF9vYmpkaXIiCi0KLSAgICAjIERldGVybWluZSB0aGUgdHlwZSBvZiBvdXRwdXQKLSAgICBjYXNlICRvdXRwdXQgaW4KLSAgICAiIikKLSAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQgZmlsZSIKLSAgICAgIDs7Ci0gICAgKi4kbGliZXh0KSBsaW5rbW9kZT1vbGRsaWIgOzsKLSAgICAqLmxvIHwgKi4kb2JqZXh0KSBsaW5rbW9kZT1vYmogOzsKLSAgICAqLmxhKSBsaW5rbW9kZT1saWIgOzsKLSAgICAqKSBsaW5rbW9kZT1wcm9nIDs7ICMgQW55dGhpbmcgZWxzZSBzaG91bGQgYmUgYSBwcm9ncmFtLgotICAgIGVzYWMKLQotICAgIHNwZWNpYWxkZXBsaWJzPQotCi0gICAgbGlicz0KLSAgICAjIEZpbmQgYWxsIGludGVyZGVwZW5kZW50IGRlcGxpYnMgYnkgc2VhcmNoaW5nIGZvciBsaWJyYXJpZXMKLSAgICAjIHRoYXQgYXJlIGxpbmtlZCBtb3JlIHRoYW4gb25jZSAoZS5nLiAtbGEgLWxiIC1sYSkKLSAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbwotICAgICAgaWYgJG9wdF9kdXBsaWNhdGVfZGVwcyA7IHRoZW4KLQljYXNlICIkbGlicyAiIGluCi0JKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBsaWJzPSIkbGlicyAkZGVwbGliIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLSAgICAgIGxpYnM9IiRwcmVkZXBzICRsaWJzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggJHBvc3RkZXBzIgotCi0gICAgICAjIENvbXB1dGUgbGlicmFyaWVzIHRoYXQgYXJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiAkcHJlZGVwcwotICAgICAgIyAkcG9zdGRlcHMgYW5kIG1hcmsgdGhlbSBhcyBzcGVjaWFsIChpLmUuLCB3aG9zZSBkdXBsaWNhdGVzIGFyZQotICAgICAgIyBub3QgdG8gYmUgZWxpbWluYXRlZCkuCi0gICAgICBwcmVfcG9zdF9kZXBzPQotICAgICAgaWYgJG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM7IHRoZW4KLQlmb3IgcHJlX3Bvc3RfZGVwIGluICRwcmVkZXBzICRwb3N0ZGVwczsgZG8KLQkgIGNhc2UgIiRwcmVfcG9zdF9kZXBzICIgaW4KLQkgICoiICRwcmVfcG9zdF9kZXAgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJHByZV9wb3N0X2RlcHMiIDs7Ci0JICBlc2FjCi0JICBwcmVfcG9zdF9kZXBzPSIkcHJlX3Bvc3RfZGVwcyAkcHJlX3Bvc3RfZGVwIgotCWRvbmUKLSAgICAgIGZpCi0gICAgICBwcmVfcG9zdF9kZXBzPQotICAgIGZpCi0KLSAgICBkZXBsaWJzPQotICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KLSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9Ci0gICAgbmVlZF9yZWxpbms9bm8gIyB3aGV0aGVyIHdlJ3JlIGxpbmtpbmcgYW55IHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgbm90aW5zdF9kZXBsaWJzPSAjIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKLSAgICBub3RpbnN0X3BhdGg9ICMgcGF0aHMgdGhhdCBjb250YWluIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKLQotICAgIGNhc2UgJGxpbmttb2RlIGluCi0gICAgbGliKQotCXBhc3Nlcz0iY29udiBkbHByZW9wZW4gbGluayIKLQlmb3IgZmlsZSBpbiAkZGxmaWxlcyAkZGxwcmVmaWxlczsgZG8KLQkgIGNhc2UgJGZpbGUgaW4KLQkgICoubGEpIDs7Ci0JICAqKQotCSAgICBmdW5jX2ZhdGFsX2hlbHAgImxpYnJhcmllcyBjYW4gXGAtZGxvcGVuJyBvbmx5IGxpYnRvb2wgbGlicmFyaWVzOiAkZmlsZSIKLQkgICAgOzsKLQkgIGVzYWMKLQlkb25lCi0JOzsKLSAgICBwcm9nKQotCWNvbXBpbGVfZGVwbGlicz0KLQlmaW5hbGl6ZV9kZXBsaWJzPQotCWFsbGRlcGxpYnM9bm8KLQluZXdkbGZpbGVzPQotCW5ld2RscHJlZmlsZXM9Ci0JcGFzc2VzPSJjb252IHNjYW4gZGxvcGVuIGRscHJlb3BlbiBsaW5rIgotCTs7Ci0gICAgKikgIHBhc3Nlcz0iY29udiIKLQk7OwotICAgIGVzYWMKLQotICAgIGZvciBwYXNzIGluICRwYXNzZXM7IGRvCi0gICAgICAjIFRoZSBwcmVvcGVuIHBhc3MgaW4gbGliIG1vZGUgcmV2ZXJzZXMgJGRlcGxpYnM7IHB1dCBpdCBiYWNrIGhlcmUKLSAgICAgICMgc28gdGhhdCAtTCBjb21lcyBiZWZvcmUgbGlicyB0aGF0IG5lZWQgaXQgZm9yIGluc3RhbmNlLi4uCi0gICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIjsgdGhlbgotCSMjIEZJWE1FOiBGaW5kIHRoZSBwbGFjZSB3aGVyZSB0aGUgbGlzdCBpcyByZWJ1aWx0IGluIHRoZSB3cm9uZwotCSMjICAgICAgICBvcmRlciwgYW5kIGZpeCBpdCB0aGVyZSBwcm9wZXJseQotICAgICAgICB0bXBfZGVwbGlicz0KLQlmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgdG1wX2RlcGxpYnM9IiRkZXBsaWIgJHRtcF9kZXBsaWJzIgotCWRvbmUKLQlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAotCSB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiI7IHRoZW4KLQlsaWJzPSIkZGVwbGlicyIKLQlkZXBsaWJzPQotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JY2FzZSAkcGFzcyBpbgotCWRsb3BlbikgbGlicz0iJGRsZmlsZXMiIDs7Ci0JZGxwcmVvcGVuKSBsaWJzPSIkZGxwcmVmaWxlcyIgOzsKLQlsaW5rKQotCSAgbGlicz0iJGRlcGxpYnMgJURFUExJQlMlIgotCSAgdGVzdCAiWCRsaW5rX2FsbF9kZXBsaWJzIiAhPSBYbm8gJiYgbGlicz0iJGxpYnMgJGRlcGVuZGVuY3lfbGlicyIKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGRscHJlb3BlbiI7IHRoZW4KLQkjIENvbGxlY3QgYW5kIGZvcndhcmQgZGVwbGlicyBvZiBwcmVvcGVuZWQgbGlidG9vbCBsaWJzCi0JZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICMgSWdub3JlIG5vbi1saWJ0b29sLWxpYnMKLQkgIGRlcGVuZGVuY3lfbGlicz0KLQkgIGNhc2UgJGxpYiBpbgotCSAgKi5sYSkJZnVuY19zb3VyY2UgIiRsaWIiIDs7Ci0JICBlc2FjCi0KLQkgICMgQ29sbGVjdCBwcmVvcGVuZWQgbGlidG9vbCBkZXBsaWJzLCBleGNlcHQgYW55IHRoaXMgbGlicmFyeQotCSAgIyBoYXMgZGVjbGFyZWQgYXMgd2VhayBsaWJzCi0JICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0gICAgICAgICAgICBkZXBsaWJfYmFzZT1gJEVDSE8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICIkYmFzZW5hbWUiYAotCSAgICBjYXNlICIgJHdlYWtfbGlicyAiIGluCi0JICAgICoiICRkZXBsaWJfYmFzZSAiKikgOzsKLQkgICAgKikgZGVwbGlicz0iJGRlcGxpYnMgJGRlcGxpYiIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWRvbmUKLQlsaWJzPSIkZGxwcmVmaWxlcyIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KLQkjIENvbGxlY3QgZGxwcmVvcGVuZWQgbGlicmFyaWVzCi0Jc2F2ZV9kZXBsaWJzPSIkZGVwbGlicyIKLQlkZXBsaWJzPQotICAgICAgZmkKLQotICAgICAgZm9yIGRlcGxpYiBpbiAkbGliczsgZG8KLQlsaWI9Ci0JZm91bmQ9bm8KLQljYXNlICRkZXBsaWIgaW4KLQktbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlfC10aHJlYWRzKQotCSAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZWxzZQotCSAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWIiCi0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgOyB0aGVuCi0JCWNhc2UgIiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCi0JCSAgICAqIiAkZGVwbGliICIqKSA7OwotCQkgICAgKiApIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGRlcGxpYiIgOzsKLQkJZXNhYwotCSAgICBmaQotCSAgZmkKLQkgIGNvbnRpbnVlCi0JICA7OwotCS1sKikKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZzsgdGhlbgotCSAgICBmdW5jX3dhcm5pbmcgIlxgLWwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHMiCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCSAgZnVuY19zdHJpcG5hbWUgJy1sJyAnJyAiJGRlcGxpYiIKLQkgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgotCSAgICBzZWFyY2hkaXJzPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycyAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGgiCi0JICBlbHNlCi0JICAgIHNlYXJjaGRpcnM9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGgiCi0JICBmaQotCSAgZm9yIHNlYXJjaGRpciBpbiAkc2VhcmNoZGlyczsgZG8KLQkgICAgZm9yIHNlYXJjaF9leHQgaW4gLmxhICRzdGRfc2hyZXh0IC5zbyAuYTsgZG8KLQkgICAgICAjIFNlYXJjaCB0aGUgbGlidG9vbCBsaWJyYXJ5Ci0JICAgICAgbGliPSIkc2VhcmNoZGlyL2xpYiR7bmFtZX0ke3NlYXJjaF9leHR9IgotCSAgICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCi0JCWlmIHRlc3QgIiRzZWFyY2hfZXh0IiA9ICIubGEiOyB0aGVuCi0JCSAgZm91bmQ9eWVzCi0JCWVsc2UKLQkJICBmb3VuZD1ubwotCQlmaQotCQlicmVhayAyCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZG9uZQotCSAgaWYgdGVzdCAiJGZvdW5kIiAhPSB5ZXM7IHRoZW4KLQkgICAgIyBkZXBsaWIgZG9lc24ndCBzZWVtIHRvIGJlIGEgbGlidG9vbCBsaWJyYXJ5Ci0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICAgIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZpCi0JICAgIGNvbnRpbnVlCi0JICBlbHNlICMgZGVwbGliIGlzIGEgbGlidG9vbCBsaWJyYXJ5Ci0JICAgICMgSWYgJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyAmJiAkZGVwbGliIGlzIGEgc3RkbGliLAotCSAgICAjIFdlIG5lZWQgdG8gZG8gc29tZSBzcGVjaWFsIHRoaW5ncyBoZXJlLCBhbmQgbm90IGxhdGVyLgotCSAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikKLQkJaWYgZnVuY19sYWxpYl9wICIkbGliIjsgdGhlbgotCQkgIGxpYnJhcnlfbmFtZXM9Ci0JCSAgb2xkX2xpYnJhcnk9Ci0JCSAgZnVuY19zb3VyY2UgIiRsaWIiCi0JCSAgZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbwotCQkgICAgbGw9IiRsIgotCQkgIGRvbmUKLQkJICBpZiB0ZXN0ICJYJGxsIiA9ICJYJG9sZF9saWJyYXJ5IiA7IHRoZW4gIyBvbmx5IHN0YXRpYyB2ZXJzaW9uIGF2YWlsYWJsZQotCQkgICAgZm91bmQ9bm8KLQkJICAgIGZ1bmNfZGlybmFtZSAiJGxpYiIgIiIgIi4iCi0JCSAgICBsYWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCi0JCSAgICBsaWI9JGxhZGlyLyRvbGRfbGlicmFyeQotCQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCQkgICAgZWxzZQotCQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCQkgICAgZmkKLQkJICAgIGNvbnRpbnVlCi0JCSAgZmkKLQkJZmkKLQkJOzsKLQkgICAgICAqKSA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGZpCi0JICA7OyAjIC1sCi0JKi5sdGZyYW1ld29yaykKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgIGVsc2UKLQkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiA7IHRoZW4KLQkJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KLQkJICAgICoiICRkZXBsaWIgIiopIDs7Ci0JCSAgICAqICkgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkZGVwbGliIiA7OwotCQllc2FjCi0JICAgIGZpCi0JICBmaQotCSAgY29udGludWUKLQkgIDs7Ci0JLUwqKQotCSAgY2FzZSAkbGlua21vZGUgaW4KLQkgIGxpYikKLQkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgdGVzdCAiJHBhc3MiID0gY29udiAmJiBjb250aW51ZQotCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKLQkgICAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCi0JICAgIDs7Ci0JICBwcm9nKQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgICBjb250aW51ZQotCSAgICBmaQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBzY2FuOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGZpCi0JICAgIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCi0JICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgotCSAgICA7OwotCSAgKikKLQkgICAgZnVuY193YXJuaW5nICJcYC1MJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIgotCSAgICA7OwotCSAgZXNhYyAjIGxpbmttb2RlCi0JICBjb250aW51ZQotCSAgOzsgIyAtTAotCS1SKikKLQkgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KLQkgICAgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGRlcGxpYiIKLQkgICAgZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkgICAgIyBNYWtlIHN1cmUgdGhlIHhycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgICAgY2FzZSAiJHhycGF0aCAiIGluCi0JICAgICoiICRkaXIgIiopIDs7Ci0JICAgICopIHhycGF0aD0iJHhycGF0aCAkZGlyIiA7OwotCSAgICBlc2FjCi0JICBmaQotCSAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCSoubGEpIGxpYj0iJGRlcGxpYiIgOzsKLQkqLiRsaWJleHQpCi0JICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCSAgY2FzZSAkbGlua21vZGUgaW4KLQkgIGxpYikKLQkgICAgIyBMaW5raW5nIGNvbnZlbmllbmNlIG1vZHVsZXMgaW50byBzaGFyZWQgbGlicmFyaWVzIGlzIGFsbG93ZWQsCi0JICAgICMgYnV0IGxpbmtpbmcgb3RoZXIgc3RhdGljIGxpYnJhcmllcyBpcyBub24tcG9ydGFibGUuCi0JICAgIGNhc2UgIiAkZGxwcmVjb252ZW5pZW5jZWxpYnMgIiBpbgotCSAgICAqIiAkZGVwbGliICIqKSA7OwotCSAgICAqKQotCSAgICAgIHZhbGlkX2FfbGliPW5vCi0JICAgICAgY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkJbWF0Y2hfcGF0dGVybiopCi0JCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKLQkJICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCi0JCSAgaWYgZXZhbCAiXCRFQ0hPIFwiWCRkZXBsaWJcIiIgMj4vZGV2L251bGwgfCAkWHNlZCAtZSAxMHEgXAotCQkgICAgfCAkRUdSRVAgIiRtYXRjaF9wYXR0ZXJuX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCQkgICAgdmFsaWRfYV9saWI9eWVzCi0JCSAgZmkKLQkJOzsKLQkJcGFzc19hbGwpCi0JCSAgdmFsaWRfYV9saWI9eWVzCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICAgIGlmIHRlc3QgIiR2YWxpZF9hX2xpYiIgIT0geWVzOyB0aGVuCi0JCSRFQ0hPCi0JCSRFQ0hPICIqKiogV2FybmluZzogVHJ5aW5nIHRvIGxpbmsgd2l0aCBzdGF0aWMgbGliIGFyY2hpdmUgJGRlcGxpYi4iCi0JCSRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkJJEVDSE8gIioqKiBiZWNhdXNlIHRoZSBmaWxlIGV4dGVuc2lvbnMgLiRsaWJleHQgb2YgdGhpcyBhcmd1bWVudCBtYWtlcyBtZSBiZWxpZXZlIgotCQkkRUNITyAiKioqIHRoYXQgaXQgaXMganVzdCBhIHN0YXRpYyBhcmNoaXZlIHRoYXQgSSBzaG91bGQgbm90IHVzZSBoZXJlLiIKLQkgICAgICBlbHNlCi0JCSRFQ0hPCi0JCSRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSIKLQkJJEVDSE8gIioqKiBzdGF0aWMgbGlicmFyeSAkZGVwbGliIGlzIG5vdCBwb3J0YWJsZSEiCi0JCWRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICBwcm9nKQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBmaQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYyAjIGxpbmttb2RlCi0JICA7OyAjICouJGxpYmV4dAotCSoubG8gfCAqLiRvYmpleHQpCi0JICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbiB8fCB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICAgIyBJZiB0aGVyZSBpcyBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCi0JICAgICAgIyB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRlcGxpYiIKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGRlcGxpYiIKLQkgICAgZmkKLQkgIGZpCi0JICBjb250aW51ZQotCSAgOzsKLQklREVQTElCUyUpCi0JICBhbGxkZXBsaWJzPXllcwotCSAgY29udGludWUKLQkgIDs7Ci0JZXNhYyAjIGNhc2UgJGRlcGxpYgotCi0JaWYgdGVzdCAiJGZvdW5kIiA9IHllcyB8fCB0ZXN0IC1mICIkbGliIjsgdGhlbiA6Ci0JZWxzZQotCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgdGhlIGxpYnJhcnkgXGAkbGliJyBvciB1bmhhbmRsZWQgYXJndW1lbnQgXGAkZGVwbGliJyIKLQlmaQotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlmdW5jX2xhbGliX3Vuc2FmZV9wICIkbGliIiBcCi0JICB8fCBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKLQotCWZ1bmNfZGlybmFtZSAiJGxpYiIgIiIgIi4iCi0JbGFkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCi0JZGxuYW1lPQotCWRsb3Blbj0KLQlkbHByZW9wZW49Ci0JbGliZGlyPQotCWxpYnJhcnlfbmFtZXM9Ci0Jb2xkX2xpYnJhcnk9Ci0JaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0KLQkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAotCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGVzIGluc3RhbGxlZCwgb3Igc2hvdWxkbm90bGluawotCWluc3RhbGxlZD15ZXMKLQlzaG91bGRub3RsaW5rPW5vCi0JYXZvaWR0ZW1wcnBhdGg9Ci0KLQotCSMgUmVhZCB0aGUgLmxhIGZpbGUKLQlmdW5jX3NvdXJjZSAiJGxpYiIKLQotCSMgQ29udmVydCAiLWZyYW1ld29yayBmb28iIHRvICJmb28ubHRmcmFtZXdvcmsiCi0JaWYgdGVzdCAtbiAiJGluaGVyaXRlZF9saW5rZXJfZmxhZ3MiOyB0aGVuCi0JICB0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz1gJEVDSE8gIlgkaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkWHNlZCAtZSAncy8tZnJhbWV3b3JrIFwoW14gJF0qXCkvXDEubHRmcmFtZXdvcmsvZydgCi0JICBmb3IgdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyBpbiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZ3M7IGRvCi0JICAgIGNhc2UgIiAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgotCSAgICAgICoiICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnICIqKSA7OwotCSAgICAgICopIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWciOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JZGVwZW5kZW5jeV9saWJzPWAkRUNITyAiWCAkZGVwZW5kZW5jeV9saWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAotCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8Ci0JICAgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iIHx8Ci0JICAgeyB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IH07IHRoZW4KLQkgIHRlc3QgLW4gIiRkbG9wZW4iICYmIGRsZmlsZXM9IiRkbGZpbGVzICRkbG9wZW4iCi0JICB0ZXN0IC1uICIkZGxwcmVvcGVuIiAmJiBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGxwcmVvcGVuIgotCWZpCi0KLQlpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAjIE9ubHkgY2hlY2sgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcwotCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKLQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIKLQkgICAgZmkKLQkgICAgIyBJdCBpcyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeSwgc28gYWRkIGluIGl0cyBvYmplY3RzLgotCSAgICBjb252ZW5pZW5jZT0iJGNvbnZlbmllbmNlICRsYWRpci8kb2JqZGlyLyRvbGRfbGlicmFyeSIKLQkgICAgb2xkX2NvbnZlbmllbmNlPSIkb2xkX2NvbnZlbmllbmNlICRsYWRpci8kb2JqZGlyLyRvbGRfbGlicmFyeSIKLQkgICAgdG1wX2xpYnM9Ci0JICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICAgIGlmICRvcHRfZHVwbGljYXRlX2RlcHMgOyB0aGVuCi0JCWNhc2UgIiR0bXBfbGlicyAiIGluCi0JCSoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgotCSAgICBkb25lCi0JICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgdGhlbgotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIGNvbnZlbmllbmNlIGxpYnJhcnkiCi0JICBmaQotCSAgY29udGludWUKLQlmaSAjICRwYXNzID0gY29udgotCi0KLQkjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCi0JbGlua2xpYj0KLQlmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCi0JICBsaW5rbGliPSIkbCIKLQlkb25lCi0JaWYgdGVzdCAteiAiJGxpbmtsaWIiOyB0aGVuCi0JICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIKLQlmaQotCi0JIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCi0JaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCi0JICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgLWRsb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciCi0JICBmaQotCSAgaWYgdGVzdCAteiAiJGRsbmFtZSIgfHwKLQkgICAgIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8Ci0JICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICMgSWYgdGhlcmUgaXMgbm8gZGxuYW1lLCBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nCi0JICAgICMgc3RhdGljYWxseSwgd2UgbmVlZCB0byBwcmVsb2FkLiAgV2UgYWxzbyBuZWVkIHRvIHByZWxvYWQgYW55Ci0JICAgICMgZGVwZW5kZW50IGxpYnJhcmllcyBzbyBsaWJsdGRsJ3MgZGVwbGliIHByZWxvYWRlciBkb2Vzbid0Ci0JICAgICMgYm9tYiBvdXQgaW4gdGhlIGxvYWQgZGVwbGlicyBwaGFzZS4KLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGxpYiAkZGVwZW5kZW5jeV9saWJzIgotCSAgZWxzZQotCSAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliIgotCSAgZmkKLQkgIGNvbnRpbnVlCi0JZmkgIyAkcGFzcyA9IGRsb3BlbgotCi0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAkbGFkaXIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic19sYWRpcj0iJGxhZGlyIiA7OwotCSopCi0JICBhYnNfbGFkaXI9YGNkICIkbGFkaXIiICYmIHB3ZGAKLQkgIGlmIHRlc3QgLXogIiRhYnNfbGFkaXIiOyB0aGVuCi0JICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsYWRpciciCi0JICAgIGZ1bmNfd2FybmluZyAicGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIKLQkgICAgYWJzX2xhZGlyPSIkbGFkaXIiCi0JICBmaQotCSAgOzsKLQllc2FjCi0JZnVuY19iYXNlbmFtZSAiJGxpYiIKLQlsYW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQotCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgotCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgISAtZiAiJGxpYmRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KLQkgICAgZnVuY193YXJuaW5nICJsaWJyYXJ5IFxgJGxpYicgd2FzIG1vdmVkLiIKLQkgICAgZGlyPSIkbGFkaXIiCi0JICAgIGFic2Rpcj0iJGFic19sYWRpciIKLQkgICAgbGliZGlyPSIkYWJzX2xhZGlyIgotCSAgZWxzZQotCSAgICBkaXI9IiRsaWJkaXIiCi0JICAgIGFic2Rpcj0iJGxpYmRpciIKLQkgIGZpCi0JICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSBYeWVzICYmIGF2b2lkdGVtcHJwYXRoPXllcwotCWVsc2UKLQkgIGlmIHRlc3QgISAtZiAiJGxhZGlyLyRvYmpkaXIvJGxpbmtsaWIiICYmIHRlc3QgLWYgIiRhYnNfbGFkaXIvJGxpbmtsaWIiOyB0aGVuCi0JICAgIGRpcj0iJGxhZGlyIgotCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCi0JICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKLQkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCi0JICBlbHNlCi0JICAgIGRpcj0iJGxhZGlyLyRvYmpkaXIiCi0JICAgIGFic2Rpcj0iJGFic19sYWRpci8kb2JqZGlyIgotCSAgICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCi0JICAgIG5vdGluc3RfcGF0aD0iJG5vdGluc3RfcGF0aCAkYWJzX2xhZGlyIgotCSAgZmkKLQlmaSAjICRpbnN0YWxsZWQgPSB5ZXMKLQlmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmxhJyAiJGxhbmFtZSIKLQluYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQotCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgotCWlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgotCSAgaWYgdGVzdCAteiAiJGxpYmRpciIgJiYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgZnVuY19mYXRhbF9lcnJvciAib25seSBsaWJyYXJpZXMgbWF5IC1kbHByZW9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIgotCSAgZmkKLQkgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scwotCSAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCi0JICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgICAjIEtlZXAgYSBsaXN0IG9mIHByZW9wZW5lZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMgdG8gY2hlY2sKLQkgICAgIyB0aGF0IHRoZXkgYXJlIGJlaW5nIHVzZWQgY29ycmVjdGx5IGluIHRoZSBsaW5rIHBhc3MuCi0JICAgIHRlc3QgLXogIiRsaWJkaXIiICYmIFwKLQkJZGxwcmVjb252ZW5pZW5jZWxpYnM9IiRkbHByZWNvbnZlbmllbmNlbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKLQkgICMgT3RoZXJ3aXNlLCB1c2UgdGhlIGRsbmFtZSwgc28gdGhhdCBsdF9kbG9wZW4gZmluZHMgaXQuCi0JICBlbGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCi0JICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJGRsbmFtZSIKLQkgIGVsc2UKLQkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kbGlua2xpYiIKLQkgIGZpCi0JZmkgIyAkcGFzcyA9IGRscHJlb3BlbgotCi0JaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICMgTGluayB0aGUgY29udmVuaWVuY2UgbGlicmFyeQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgotCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKLQkgIGVsaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGZpbmFsaXplX2RlcGxpYnMiCi0JICBlbHNlCi0JICAgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiICMgdXNlZCBmb3IgcHJvZyxzY2FuIHBhc3MKLQkgIGZpCi0JICBjb250aW51ZQotCWZpCi0KLQotCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nICYmIHRlc3QgIiRwYXNzIiAhPSBsaW5rOyB0aGVuCi0JICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGxhZGlyIgotCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKLQotCSAgbGlua2FsbGRlcGxpYnM9bm8KLQkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubyB8fCB0ZXN0IC16ICIkbGlicmFyeV9uYW1lcyIgfHwKLQkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KLQkgICAgbGlua2FsbGRlcGxpYnM9eWVzCi0JICBmaQotCi0JICB0bXBfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKLQkgICAgICAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKLQkJIDs7Ci0JICAgIGVzYWMKLQkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPwotCSAgICBpZiB0ZXN0ICIkbGlua2FsbGRlcGxpYnMiID0geWVzOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgICMgTmVlZCB0byBoYXJkY29kZSBzaGFyZWQgbGlicmFyeSBwYXRocwotCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCi0JICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZpCi0JICAgIGlmICRvcHRfZHVwbGljYXRlX2RlcHMgOyB0aGVuCi0JICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICBkb25lICMgZm9yIGRlcGxpYgotCSAgY29udGludWUKLQlmaSAjICRsaW5rbW9kZSA9IHByb2cuLi4KLQotCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCi0JICAgICB7IHsgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicyIgPSBubyB8fAotCSAgICAgICAgIHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMsJGluc3RhbGxlZCIgPSAiYnVpbHQseWVzIjsgfSB8fAotCSAgICAgICB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCi0JICAgICMgV2UgbmVlZCB0byBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoCi0JICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC16ICIkYXZvaWR0ZW1wcnBhdGgiIDsgdGhlbgotCSAgICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgICAgICBjYXNlICIkdGVtcF9ycGF0aDoiIGluCi0JICAgICAgKiIkYWJzZGlyOiIqKSA7OwotCSAgICAgICopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoJGFic2RpcjoiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCi0JICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KLQkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQotCSAgICAjIHNlYXJjaCBwYXRoLgotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkgIyAkbGlua21vZGUsJHBhc3MgPSBwcm9nLGxpbmsuLi4KLQotCSAgaWYgdGVzdCAiJGFsbGRlcGxpYnMiID0geWVzICYmCi0JICAgICB7IHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSBwYXNzX2FsbCB8fAotCSAgICAgICB7IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmCi0JCSB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IH07IH07IHRoZW4KLQkgICAgIyBXZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGZvciBzdGF0aWMgbGlicmFyaWVzCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCWZpCi0KLQlsaW5rX3N0YXRpYz1ubyAjIFdoZXRoZXIgdGhlIGRlcGxpYiB3aWxsIGJlIGxpbmtlZCBzdGF0aWNhbGx5Ci0JdXNlX3N0YXRpY19saWJzPSRwcmVmZXJfc3RhdGljX2xpYnMKLQlpZiB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IGJ1aWx0ICYmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCi0JICB1c2Vfc3RhdGljX2xpYnM9bm8KLQlmaQotCWlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgotCSAgIHsgdGVzdCAiJHVzZV9zdGF0aWNfbGlicyIgPSBubyB8fCB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCi0JICBjYXNlICRob3N0IGluCi0JICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqKQotCSAgICAgICMgTm8gcG9pbnQgaW4gcmVsaW5raW5nIERMTHMgYmVjYXVzZSBwYXRocyBhcmUgbm90IGVuY29kZWQKLQkgICAgICBub3RpbnN0X2RlcGxpYnM9IiRub3RpbnN0X2RlcGxpYnMgJGxpYiIKLQkgICAgICBuZWVkX3JlbGluaz1ubwotCSAgICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubzsgdGhlbgotCSAgICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgotCSAgICAgIG5lZWRfcmVsaW5rPXllcwotCSAgICBmaQotCSAgICA7OwotCSAgZXNhYwotCSAgIyBUaGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkKLQotCSAgIyBXYXJuIGFib3V0IHBvcnRhYmlsaXR5LCBjYW4ndCBsaW5rIGFnYWluc3QgLW1vZHVsZSdzIG9uIHNvbWUKLQkgICMgc3lzdGVtcyAoZGFyd2luKS4gIERvbid0IGJsZWF0IGFib3V0IGRsb3BlbmVkIG1vZHVsZXMgdGhvdWdoIQotCSAgZGxvcGVubW9kdWxlPSIiCi0JICBmb3IgZGxwcmVtb2R1bGV0ZXN0IGluICRkbHByZWZpbGVzOyBkbwotCSAgICBpZiB0ZXN0ICJYJGRscHJlbW9kdWxldGVzdCIgPSAiWCRsaWIiOyB0aGVuCi0JICAgICAgZGxvcGVubW9kdWxlPSIkZGxwcmVtb2R1bGV0ZXN0IgotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICBkb25lCi0JICBpZiB0ZXN0IC16ICIkZGxvcGVubW9kdWxlIiAmJiB0ZXN0ICIkc2hvdWxkbm90bGluayIgPSB5ZXMgJiYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgotCSAgICAkRUNITwotCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgZXhlY3V0YWJsZSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKLQkgICAgZWxzZQotCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBsb2FkYWJsZSBtb2R1bGUiCi0JICAgIGZpCi0JICAgICRFQ0hPICIqKiogJGxpbmtsaWIgaXMgbm90IHBvcnRhYmxlISIKLQkgIGZpCi0JICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmCi0JICAgICB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiA9IHllczsgdGhlbgotCSAgICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGguCi0JICAgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKLQkgICAgIyBzZWFyY2ggcGF0aC4KLQkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotCSAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAqKQotCSAgICAgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KLQkgICAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfcnBhdGg9IiRjb21waWxlX3JwYXRoICRhYnNkaXIiCi0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotCSAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAqKQotCSAgICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiCi0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0KLQkgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyI7IHRoZW4KLQkgICAgIyBmaWd1cmUgb3V0IHRoZSBzb25hbWUKLQkgICAgc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JICAgIHNoaWZ0Ci0JICAgIHJlYWxuYW1lPSIkMSIKLQkgICAgc2hpZnQKLQkgICAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCi0JICAgICMgdXNlIGRsbmFtZSBpZiB3ZSBnb3QgaXQuIGl0J3MgcGVyZmVjdGx5IGdvb2QsIG5vPwotCSAgICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgotCSAgICAgIHNvbmFtZT0iJGRsbmFtZSIKLQkgICAgZWxpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCi0JICAgICAgIyBibGVoIHdpbmRvd3MKLQkgICAgICBjYXNlICRob3N0IGluCi0JICAgICAgKmN5Z3dpbiogfCBtaW5ndyogfCAqY2VnY2MqKQotCSAgICAgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKLQkJbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JCXZlcnN1ZmZpeD0iLSRtYWpvciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotCSAgICBlbHNlCi0JICAgICAgc29uYW1lPSIkcmVhbG5hbWUiCi0JICAgIGZpCi0KLQkgICAgIyBNYWtlIGEgbmV3IG5hbWUgZm9yIHRoZSBleHRyYWN0X2V4cHN5bXNfY21kcyB0byB1c2UKLQkgICAgc29yb290PSIkc29uYW1lIgotCSAgICBmdW5jX2Jhc2VuYW1lICIkc29yb290IgotCSAgICBzb25hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkgICAgZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5kbGwnICIkc29uYW1lIgotCSAgICBuZXdsaWI9bGliaW1wLSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuYQotCi0JICAgICMgSWYgdGhlIGxpYnJhcnkgaGFzIG5vIGV4cG9ydCBsaXN0LCB0aGVuIGNyZWF0ZSBvbmUgbm93Ci0JICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIjsgdGhlbiA6Ci0JICAgIGVsc2UKLQkgICAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBcYCRzb25hbWUnIgotCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkZXh0cmFjdF9leHBzeW1zX2NtZHMiICdleGl0ICQ/JwotCSAgICBmaQotCi0JICAgICMgQ3JlYXRlICRuZXdsaWIKLQkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG5ld2xpYiI7IHRoZW4gOjsgZWxzZQotCSAgICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBpbXBvcnQgbGlicmFyeSBmb3IgXGAkc29uYW1lJyIKLQkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIiAnZXhpdCAkPycKLQkgICAgZmkKLQkgICAgIyBtYWtlIHN1cmUgdGhlIGxpYnJhcnkgdmFyaWFibGVzIGFyZSBwb2ludGluZyB0byB0aGUgbmV3IGxpYnJhcnkKLQkgICAgZGlyPSRvdXRwdXRfb2JqZGlyCi0JICAgIGxpbmtsaWI9JG5ld2xpYgotCSAgZmkgIyB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiCi0KLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiAhPSByZWxpbms7IHRoZW4KLQkgICAgYWRkX3NobGlicGF0aD0KLQkgICAgYWRkX2Rpcj0KLQkgICAgYWRkPQotCSAgICBsaWJfbGlua2VkPXllcwotCSAgICBjYXNlICRoYXJkY29kZV9hY3Rpb24gaW4KLQkgICAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSBubzsgdGhlbgotCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCi0JCWNhc2UgJGhvc3QgaW4KLQkJICAqLSotc2NvMy4ydjUuMC5bMDI0XSopIGFkZF9kaXI9Ii1MJGRpciIgOzsKLQkJICAqLSotc3lzdjQqdXcyKikgYWRkX2Rpcj0iLUwkZGlyIiA7OwotCQkgICotKi1zeXN2NU9wZW5VTklYKiB8ICotKi1zeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgXAotCQkgICAgKi0qLXVuaXh3YXJlNyopIGFkZF9kaXI9Ii1MJGRpciIgOzsKLQkJICAqLSotZGFyd2luKiApCi0JCSAgICAjIGlmIHRoZSBsaWIgaXMgYSAobm9uLWRsb3BlbmVkKSBtb2R1bGUgdGhlbiB3ZSBjYW4gbm90Ci0JCSAgICAjIGxpbmsgYWdhaW5zdCBpdCwgc29tZW9uZSBpcyBpZ25vcmluZyB0aGUgZWFybGllciB3YXJuaW5ncwotCQkgICAgaWYgL3Vzci9iaW4vZmlsZSAtTCAkYWRkIDI+IC9kZXYvbnVsbCB8Ci0JCQkgJEdSRVAgIjogW146XSogYnVuZGxlIiA+L2Rldi9udWxsIDsgdGhlbgotCQkgICAgICBpZiB0ZXN0ICJYJGRsb3Blbm1vZHVsZSIgIT0gIlgkbGliIjsgdGhlbgotCQkJJEVDSE8gIioqKiBXYXJuaW5nOiBsaWIgJGxpbmtsaWIgaXMgYSBtb2R1bGUsIG5vdCBhIHNoYXJlZCBsaWJyYXJ5IgotCQkJaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IiA7IHRoZW4KLQkJCSAgJEVDSE8KLQkJCSAgJEVDSE8gIioqKiBBbmQgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgc3RhdGljIGFyY2hpdmUgYXZhaWxhYmxlIgotCQkJICAkRUNITyAiKioqIFRoZSBsaW5rIHdpbGwgcHJvYmFibHkgZmFpbCwgc29ycnkiCi0JCQllbHNlCi0JCQkgIGFkZD0iJGRpci8kb2xkX2xpYnJhcnkiCi0JCQlmaQotCQkgICAgICBlbGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkJCWFkZD0iJGRpci8kb2xkX2xpYnJhcnkiCi0JCSAgICAgIGZpCi0JCSAgICBmaQotCQllc2FjCi0JICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgotCQljYXNlICRob3N0IGluCi0JCSotKi1zdW5vcyopIGFkZF9zaGxpYnBhdGg9IiRkaXIiIDs7Ci0JCWVzYWMKLQkJYWRkX2Rpcj0iLUwkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSBubzsgdGhlbgotCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxzZQotCQlsaWJfbGlua2VkPW5vCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICByZWxpbmspCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXMgJiYKLQkgICAgICAgICB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiA9IG5vOyB0aGVuCi0JCWFkZD0iJGRpci8kbGlua2xpYiIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCQlhZGRfZGlyPSItTCRkaXIiCi0JCSMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KLQkJaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KLQkJICBjYXNlICRsaWJkaXIgaW4KLQkJICAgIFtcXC9dKikKLQkJICAgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKLQkJICAgICAgOzsKLQkJICBlc2FjCi0JCWZpCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxzZQotCQlsaWJfbGlua2VkPW5vCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICAqKSBsaWJfbGlua2VkPW5vIDs7Ci0JICAgIGVzYWMKLQotCSAgICBpZiB0ZXN0ICIkbGliX2xpbmtlZCIgIT0geWVzOyB0aGVuCi0JICAgICAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJ1bnN1cHBvcnRlZCBoYXJkY29kZSBwcm9wZXJ0aWVzIgotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRhZGRfc2hsaWJwYXRoIjsgdGhlbgotCSAgICAgIGNhc2UgOiRjb21waWxlX3NobGlicGF0aDogaW4KLQkgICAgICAqIjokYWRkX3NobGlicGF0aDoiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGFkZF9zaGxpYnBhdGg6IiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkX2RpciAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZCAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0geWVzICYmCi0JCSB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0geWVzICYmCi0JCSB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkJY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KLQkJKiI6JGxpYmRpcjoiKikgOzsKLQkJKikgZmluYWxpemVfc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoJGxpYmRpcjoiIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICBmaQotCSAgZmkKLQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JICAgIGFkZF9zaGxpYnBhdGg9Ci0JICAgIGFkZF9kaXI9Ci0JICAgIGFkZD0KLQkgICAgIyBGaW5hbGl6ZSBjb21tYW5kIGZvciBib3RoIGlzIHNpbXBsZToganVzdCBoYXJkY29kZSBpdC4KLQkgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXMgJiYKLQkgICAgICAgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSIgPSBubzsgdGhlbgotCSAgICAgIGFkZD0iJGxpYmRpci8kbGlua2xpYiIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLQkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCi0JICAgICAgYWRkPSItbCRuYW1lIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCSAgICAgIGNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCi0JICAgICAgKiI6JGxpYmRpcjoiKikgOzsKLQkgICAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgYWRkPSItbCRuYW1lIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzOyB0aGVuCi0JICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciIgJiYKLQkJIHRlc3QgLWYgIiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIiA7IHRoZW4KLQkJYWRkPSIkaW5zdF9wcmVmaXhfZGlyJGxpYmRpci8kbGlua2xpYiIKLQkgICAgICBlbHNlCi0JCWFkZD0iJGxpYmRpci8kbGlua2xpYiIKLQkgICAgICBmaQotCSAgICBlbHNlCi0JICAgICAgIyBXZSBjYW5ub3Qgc2VlbSB0byBoYXJkY29kZSBpdCwgZ3Vlc3Mgd2UnbGwgZmFrZSBpdC4KLQkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCi0JICAgICAgIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgotCSAgICAgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCi0JCWNhc2UgJGxpYmRpciBpbgotCQkgIFtcXC9dKikKLQkJICAgIGFkZF9kaXI9IiRhZGRfZGlyIC1MJGluc3RfcHJlZml4X2RpciRsaWJkaXIiCi0JCSAgICA7OwotCQllc2FjCi0JICAgICAgZmkKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZF9kaXIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZCAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBkZXBsaWJzPSIkYWRkX2RpciAkZGVwbGlicyIKLQkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBkZXBsaWJzPSIkYWRkICRkZXBsaWJzIgotCSAgICBmaQotCSAgZmkKLQllbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAjIEhlcmUgd2UgYXNzdW1lIHRoYXQgb25lIG9mIGhhcmRjb2RlX2RpcmVjdCBvciBoYXJkY29kZV9taW51c19MCi0JICAjIGlzIG5vdCB1bnN1cHBvcnRlZC4gIFRoaXMgaXMgdmFsaWQgb24gYWxsIGtub3duIHN0YXRpYyBhbmQKLQkgICMgc2hhcmVkIHBsYXRmb3Jtcy4KLQkgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgbGlua2xpYj0iJG9sZF9saWJyYXJ5IgotCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJGxpbmtsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgIGVsc2UKLQkgICAgY29tcGlsZV9kZXBsaWJzPSItbCRuYW1lIC1MJGRpciAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSItbCRuYW1lIC1MJGRpciAkZmluYWxpemVfZGVwbGlicyIKLQkgIGZpCi0JZWxpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBOb3QgYSBzaGFyZWQgbGlicmFyeQotCSAgaWYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgotCSAgICAjIFdlJ3JlIHRyeWluZyBsaW5rIGEgc2hhcmVkIGxpYnJhcnkgYWdhaW5zdCBhIHN0YXRpYyBvbmUKLQkgICAgIyBidXQgdGhlIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgaXQuCi0KLQkgICAgIyBKdXN0IHByaW50IGEgd2FybmluZyBhbmQgYWRkIHRoZSBsaWJyYXJ5IHRvIGRlcGVuZGVuY3lfbGlicyBzbwotCSAgICAjIHRoYXQgdGhlIHByb2dyYW0gY2FuIGJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBzdGF0aWMgbGlicmFyeS4KLQkgICAgJEVDSE8KLQkgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBUaGlzIHN5c3RlbSBjYW4gbm90IGxpbmsgdG8gc3RhdGljIGxpYiBhcmNoaXZlICRsaWIuIgotCSAgICAkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkgICAgJEVDSE8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JICAgICRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCSAgICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgotCSAgICAgICRFQ0hPICIqKiogQnV0IGFzIHlvdSB0cnkgdG8gYnVpbGQgYSBtb2R1bGUgbGlicmFyeSwgbGlidG9vbCB3aWxsIHN0aWxsIGNyZWF0ZSAiCi0JICAgICAgJEVDSE8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIGFwcGxpY2F0aW9uIgotCSAgICAgICRFQ0hPICIqKiogaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZyB0byByZXNvbHZlIHN5bWJvbHMgYXQgcnVudGltZS4iCi0JICAgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkJJEVDSE8KLQkJJEVDSE8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgotCQkkRUNITyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkJJEVDSE8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKLQkJJEVDSE8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKLQkJYnVpbGRfb2xkX2xpYnM9eWVzCi0JICAgICAgZWxzZQotCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgICBmaQotCSAgICBmaQotCSAgZWxzZQotCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKLQkgICAgbGlua19zdGF0aWM9eWVzCi0JICBmaQotCWZpICMgbGluayBzaGFyZWQvc3RhdGljIGxpYnJhcnk/Ci0KLQlpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkZGVwZW5kZW5jeV9saWJzIiAmJgotCSAgICAgeyB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiAhPSB5ZXMgfHwKLQkgICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyB8fAotCSAgICAgICB0ZXN0ICIkbGlua19zdGF0aWMiID0geWVzOyB9OyB0aGVuCi0JICAgICMgRXh0cmFjdCAtUiBmcm9tIGRlcGVuZGVuY3lfbGlicwotCSAgICB0ZW1wX2RlcGxpYnM9Ci0JICAgIGZvciBsaWJkaXIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgICBjYXNlICRsaWJkaXIgaW4KLQkgICAgICAtUiopIGZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRsaWJkaXIiCi0JICAgICAgICAgICB0ZW1wX3hycGF0aD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JCSAgIGNhc2UgIiAkeHJwYXRoICIgaW4KLQkJICAgKiIgJHRlbXBfeHJwYXRoICIqKSA7OwotCQkgICAqKSB4cnBhdGg9IiR4cnBhdGggJHRlbXBfeHJwYXRoIjs7Ci0JCSAgIGVzYWM7OwotCSAgICAgICopIHRlbXBfZGVwbGlicz0iJHRlbXBfZGVwbGlicyAkbGliZGlyIjs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICAgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKLQkgIGZpCi0KLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkYWJzZGlyIgotCSAgIyBMaW5rIGFnYWluc3QgdGhpcyBsaWJyYXJ5Ci0JICB0ZXN0ICIkbGlua19zdGF0aWMiID0gbm8gJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkYWJzX2xhZGlyLyRsYW5hbWUgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICMgLi4uIGFuZCBpdHMgZGVwZW5kZW5jeV9saWJzCi0JICB0bXBfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGlmICRvcHRfZHVwbGljYXRlX2RlcHMgOyB0aGVuCi0JICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubzsgdGhlbgotCSAgICAjIEFkZCB0aGUgc2VhcmNoIHBhdGhzIG9mIGFsbCBkZXBlbmRlbmN5IGxpYnJhcmllcwotCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgICAgcGF0aD0KLQkgICAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgICAtTCopIHBhdGg9IiRkZXBsaWIiIDs7Ci0JICAgICAgKi5sYSkKLQkgICAgICAgIGZ1bmNfZGlybmFtZSAiJGRlcGxpYiIgIiIgIi4iCi0JCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCi0JCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCQljYXNlICRkaXIgaW4KLQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnNkaXI9IiRkaXIiIDs7Ci0JCSopCi0JCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAotCQkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCi0JCSAgICBmdW5jX3dhcm5pbmcgImNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIKLQkJICAgIGFic2Rpcj0iJGRpciIKLQkJICBmaQotCQkgIDs7Ci0JCWVzYWMKLQkJaWYgJEdSRVAgIl5pbnN0YWxsZWQ9bm8iICRkZXBsaWIgPiAvZGV2L251bGw7IHRoZW4KLQkJY2FzZSAkaG9zdCBpbgotCQkqLSotZGFyd2luKikKLQkJICBkZXBkZXBsPQotCQkgIGV2YWwgZGVwbGlicmFyeV9uYW1lcz1gJHtTRUR9IC1uIC1lICdzL15saWJyYXJ5X25hbWVzPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKLQkJICBpZiB0ZXN0IC1uICIkZGVwbGlicmFyeV9uYW1lcyIgOyB0aGVuCi0JCSAgICBmb3IgdG1wIGluICRkZXBsaWJyYXJ5X25hbWVzIDsgZG8KLQkJICAgICAgZGVwZGVwbD0kdG1wCi0JCSAgICBkb25lCi0JCSAgICBpZiB0ZXN0IC1mICIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiIDsgdGhlbgotCQkgICAgICBkZXBkZXBsPSIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiCi0JCSAgICAgIGRhcndpbl9pbnN0YWxsX25hbWU9YCR7T1RPT0x9IC1MICRkZXBkZXBsIHwgYXdrICd7aWYgKE5SID09IDIpIHtwcmludCAkMTtleGl0fX0nYAotICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRkYXJ3aW5faW5zdGFsbF9uYW1lIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICBkYXJ3aW5faW5zdGFsbF9uYW1lPWAke09UT09MNjR9IC1MICRkZXBkZXBsICB8IGF3ayAne2lmIChOUiA9PSAyKSB7cHJpbnQgJDE7ZXhpdH19J2AKLSAgICAgICAgICAgICAgICAgICAgICBmaQotCQkgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWR5bGliX2ZpbGUgJHt3bH0ke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCi0JCSAgICAgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAtZHlsaWJfZmlsZSAke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCi0JCSAgICAgIHBhdGg9Ci0JCSAgICBmaQotCQkgIGZpCi0JCSAgOzsKLQkJKikKLQkJICBwYXRoPSItTCRhYnNkaXIvJG9iamRpciIKLQkJICA7OwotCQllc2FjCi0JCWVsc2UKLQkJICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAotCQkgIHRlc3QgLXogIiRsaWJkaXIiICYmIFwKLQkJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgotCQkgIHRlc3QgIiRhYnNkaXIiICE9ICIkbGliZGlyIiAmJiBcCi0JCSAgICBmdW5jX3dhcm5pbmcgIlxgJGRlcGxpYicgc2VlbXMgdG8gYmUgbW92ZWQiCi0KLQkJICBwYXRoPSItTCRhYnNkaXIiCi0JCWZpCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCi0JICAgICAgKiIgJHBhdGggIiopIDs7Ci0JICAgICAgKikgZGVwbGlicz0iJHBhdGggJGRlcGxpYnMiIDs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICBmaSAjIGxpbmtfYWxsX2RlcGxpYnMgIT0gbm8KLQlmaSAjIGxpbmttb2RlID0gbGliCi0gICAgICBkb25lICMgZm9yIGRlcGxpYiBpbiAkbGlicwotICAgICAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgotCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSAicHJvZyI7IHRoZW4KLQkgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRjb21waWxlX2RlcGxpYnMiCi0JICBmaW5hbGl6ZV9kZXBsaWJzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGZpbmFsaXplX2RlcGxpYnMiCi0JZWxzZQotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAiYCRFQ0hPICJYICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKLQlmaQotICAgICAgZmkKLSAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKLSAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgotCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKLQlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCi0JICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCWRvbmUKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gZGxvcGVuOyB0aGVuCi0JaWYgdGVzdCAiJHBhc3MiICE9IGNvbnY7IHRoZW4KLQkgICMgTWFrZSBzdXJlIGxpYl9zZWFyY2hfcGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgIGxpYl9zZWFyY2hfcGF0aD0KLQkgIGZvciBkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aDsgZG8KLQkgICAgY2FzZSAiJGxpYl9zZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRkaXIgIiopIDs7Ci0JICAgICopIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBuZXdsaWJfc2VhcmNoX3BhdGg9Ci0JZmkKLQotCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgIT0gInByb2csbGluayI7IHRoZW4KLQkgIHZhcnM9ImRlcGxpYnMiCi0JZWxzZQotCSAgdmFycz0iY29tcGlsZV9kZXBsaWJzIGZpbmFsaXplX2RlcGxpYnMiCi0JZmkKLQlmb3IgdmFyIGluICR2YXJzIGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICMgQWRkIGxpYnJhcmllcyB0byAkdmFyIGluIHJldmVyc2Ugb3JkZXIKLQkgIGV2YWwgdG1wX2xpYnM9XCJcJCR2YXJcIgotCSAgbmV3X2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICR0bXBfbGliczsgZG8KLQkgICAgIyBGSVhNRTogUGVkYW50aWNhbGx5LCB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbywgc28KLQkgICAgIyAgICAgICAgdGhhdCBzb21lIG5hc3R5IGRlcGVuZGVuY3kgbG9vcCBpc24ndCBhY2NpZGVudGFsbHkKLQkgICAgIyAgICAgICAgYnJva2VuOgotCSAgICAjbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgotCSAgICAjIFByYWdtYXRpY2FsbHksIHRoaXMgc2VlbXMgdG8gY2F1c2UgdmVyeSBmZXcgcHJvYmxlbXMgaW4KLQkgICAgIyBwcmFjdGljZToKLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OwotCSAgICAtUiopIDs7Ci0JICAgICopCi0JICAgICAgIyBBbmQgaGVyZSBpcyB0aGUgcmVhc29uOiB3aGVuIGEgbGlicmFyeSBhcHBlYXJzIG1vcmUKLQkgICAgICAjIHRoYW4gb25jZSBhcyBhbiBleHBsaWNpdCBkZXBlbmRlbmNlIG9mIGEgbGlicmFyeSwgb3IKLQkgICAgICAjIGlzIGltcGxpY2l0bHkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlIGJ5IHRoZQotCSAgICAgICMgY29tcGlsZXIsIGl0IGlzIGNvbnNpZGVyZWQgc3BlY2lhbCwgYW5kIG11bHRpcGxlCi0JICAgICAgIyBvY2N1cnJlbmNlcyB0aGVyZW9mIGFyZSBub3QgcmVtb3ZlZC4gIENvbXBhcmUgdGhpcwotCSAgICAgICMgd2l0aCBoYXZpbmcgdGhlIHNhbWUgbGlicmFyeSBiZWluZyBsaXN0ZWQgYXMgYQotCSAgICAgICMgZGVwZW5kZW5jeSBvZiBtdWx0aXBsZSBvdGhlciBsaWJyYXJpZXM6IGluIHRoaXMgY2FzZSwKLQkgICAgICAjIHdlIGtub3cgKHBlZGFudGljYWxseSwgd2UgYXNzdW1lKSB0aGUgbGlicmFyeSBkb2VzIG5vdAotCSAgICAgICMgbmVlZCB0byBiZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UsIHNvIHdlIGtlZXAgb25seSB0aGUKLQkgICAgICAjIGxhc3QgY29weS4gIFRoaXMgaXMgbm90IGFsd2F5cyByaWdodCwgYnV0IGl0IGlzIHJhcmUKLQkgICAgICAjIGVub3VnaCB0aGF0IHdlIHJlcXVpcmUgdXNlcnMgdGhhdCByZWFsbHkgbWVhbiB0byBwbGF5Ci0JICAgICAgIyBzdWNoIHVucG9ydGFibGUgbGlua2luZyB0cmlja3MgdG8gbGluayB0aGUgbGlicmFyeQotCSAgICAgICMgdXNpbmcgLVdsLC1sbmFtZSwgc28gdGhhdCBsaWJ0b29sIGRvZXMgbm90IGNvbnNpZGVyIGl0Ci0JICAgICAgIyBmb3IgZHVwbGljYXRlIHJlbW92YWwuCi0JICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OwotCSAgICAgICopCi0JCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCQkqIiAkZGVwbGliICIqKSA7OwotCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7Ci0JCWVzYWMKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCSAgdG1wX2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikKLQkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSA7OwotCSAgICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgotCWRvbmUgIyBmb3IgdmFyCi0gICAgICBmaQotICAgICAgIyBMYXN0IHN0ZXA6IHJlbW92ZSBydW50aW1lIGxpYnMgZnJvbSBkZXBlbmRlbmN5X2xpYnMKLSAgICAgICMgKHRoZXkgc3RheSBpbiBkZXBsaWJzKQotICAgICAgdG1wX2xpYnM9Ci0gICAgICBmb3IgaSBpbiAkZGVwZW5kZW5jeV9saWJzIDsgZG8KLQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggIiBpbgotCSoiICRpICIqKQotCSAgaT0iIgotCSAgOzsKLQllc2FjCi0JaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgotCSAgdG1wX2xpYnM9IiR0bXBfbGlicyAkaSIKLQlmaQotICAgICAgZG9uZQotICAgICAgZGVwZW5kZW5jeV9saWJzPSR0bXBfbGlicwotICAgIGRvbmUgIyBmb3IgcGFzcwotICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0gICAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKLSAgICBmaQotICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLSAgICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotICAgIGZpCi0KLSAgICBjYXNlICRsaW5rbW9kZSBpbgotICAgIG9sZGxpYikKLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCi0JZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgotICAgICAgZmkKLQotICAgICAgY2FzZSAiICRkZXBsaWJzIiBpbgotICAgICAgKlwgLWwqIHwgKlwgLUwqKQotCWZ1bmNfd2FybmluZyAiXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgOzsKLSAgICAgIGVzYWMKLQotICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCi0KLSAgICAgIHRlc3QgLW4gIiR4cnBhdGgiICYmIFwKLQlmdW5jX3dhcm5pbmcgIlxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgotCi0gICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKLQlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgotCi0gICAgICB0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCi0KLSAgICAgIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgotCi0gICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KLSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotICAgICAgb2xkbGlicz0iJG91dHB1dCIKLSAgICAgIG9ianM9IiRvYmpzJG9sZF9kZXBsaWJzIgotICAgICAgOzsKLQotICAgIGxpYikKLSAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KLSAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KLSAgICAgIGxpYiopCi0JZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5sYScgIiRvdXRwdXRuYW1lIgotCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCi0JZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JOzsKLSAgICAgICopCi0JdGVzdCAiJG1vZHVsZSIgPSBubyAmJiBcCi0JICBmdW5jX2ZhdGFsX2hlbHAgImxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciCi0KLQlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgotCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAotCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgotCSAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JICBldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgotCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JZWxzZQotCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgotCSAgbGlibmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JZmkKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0JICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIKLQllbHNlCi0JICAkRUNITwotCSAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIG5vbi1saWJ0b29sIgotCSAgJEVDSE8gIioqKiBvYmplY3RzICRvYmpzIGlzIG5vdCBwb3J0YWJsZSEiCi0JICBsaWJvYmpzPSIkbGlib2JqcyAkb2JqcyIKLQlmaQotICAgICAgZmkKLQotICAgICAgdGVzdCAiJGRsc2VsZiIgIT0gbm8gJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuIHNlbGYnIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIgotCi0gICAgICBzZXQgZHVtbXkgJHJwYXRoCi0gICAgICBzaGlmdAotICAgICAgdGVzdCAiJCMiIC1ndCAxICYmIFwKLQlmdW5jX3dhcm5pbmcgImlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IgotCi0gICAgICBpbnN0YWxsX2xpYmRpcj0iJDEiCi0KLSAgICAgIG9sZGxpYnM9Ci0gICAgICBpZiB0ZXN0IC16ICIkcnBhdGgiOyB0aGVuCi0JaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgQnVpbGRpbmcgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnkuCi0JICAjIFNvbWUgY29tcGlsZXJzIGhhdmUgcHJvYmxlbXMgd2l0aCBhIGAuYWwnIGV4dGVuc2lvbiBzbwotCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZXh0ZW5zaW9uIGFuCi0JICAjIGFyY2hpdmUgbm9ybWFsbHkgd291bGQuCi0JICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0ICRvbGRsaWJzIgotCSAgYnVpbGRfbGlidG9vbF9saWJzPWNvbnZlbmllbmNlCi0JICBidWlsZF9vbGRfbGlicz15ZXMKLQlmaQotCi0JdGVzdCAtbiAiJHZpbmZvIiAmJiBcCi0JICBmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKLQotCXRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCi0JICBmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKLSAgICAgIGVsc2UKLQotCSMgUGFyc2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXJndW1lbnQuCi0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzonCi0Jc2V0IGR1bW15ICR2aW5mbyAwIDAgMAotCXNoaWZ0Ci0JSUZTPSIkc2F2ZV9pZnMiCi0KLQl0ZXN0IC1uICIkNyIgJiYgXAotCSAgZnVuY19mYXRhbF9oZWxwICJ0b28gbWFueSBwYXJhbWV0ZXJzIHRvIFxgLXZlcnNpb24taW5mbyciCi0KLQkjIGNvbnZlcnQgYWJzb2x1dGUgdmVyc2lvbiBudW1iZXJzIHRvIGxpYnRvb2wgYWdlcwotCSMgdGhpcyByZXRhaW5zIGNvbXBhdGliaWxpdHkgd2l0aCAubGEgZmlsZXMgYW5kIGF0dGVtcHRzCi0JIyB0byBtYWtlIHRoZSBjb2RlIGJlbG93IGEgYml0IG1vcmUgY29tcHJlaGVuc2libGUKLQotCWNhc2UgJHZpbmZvX251bWJlciBpbgotCXllcykKLQkgIG51bWJlcl9tYWpvcj0iJDEiCi0JICBudW1iZXJfbWlub3I9IiQyIgotCSAgbnVtYmVyX3JldmlzaW9uPSIkMyIKLQkgICMKLQkgICMgVGhlcmUgYXJlIHJlYWxseSBvbmx5IHR3byBraW5kcyAtLSB0aG9zZSB0aGF0Ci0JICAjIHVzZSB0aGUgY3VycmVudCByZXZpc2lvbiBhcyB0aGUgbWFqb3IgdmVyc2lvbgotCSAgIyBhbmQgdGhvc2UgdGhhdCBzdWJ0cmFjdCBhZ2UgYW5kIHVzZSBhZ2UgYXMKLQkgICMgYSBtaW5vciB2ZXJzaW9uLiAgQnV0LCB0aGVuIHRoZXJlIGlzIGlyaXgKLQkgICMgd2hpY2ggaGFzIGFuIGV4dHJhIDEgYWRkZWQganVzdCBmb3IgZnVuCi0JICAjCi0JICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQkgIGRhcndpbnxsaW51eHxvc2Z8d2luZG93c3xub25lKQotCSAgICBmdW5jX2FyaXRoICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yCi0JICAgIGN1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JICAgIGFnZT0iJG51bWJlcl9taW5vciIKLQkgICAgcmV2aXNpb249IiRudW1iZXJfcmV2aXNpb24iCi0JICAgIDs7Ci0JICBmcmVlYnNkLWFvdXR8ZnJlZWJzZC1lbGZ8c3Vub3MpCi0JICAgIGN1cnJlbnQ9IiRudW1iZXJfbWFqb3IiCi0JICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgotCSAgICBhZ2U9IjAiCi0JICAgIDs7Ci0JICBpcml4fG5vbnN0b3B1eCkKLQkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgotCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCi0JICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgotCSAgICBsdF9pcml4X2luY3JlbWVudD1ubwotCSAgICA7OwotCSAgKikKLQkgICAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIKLQkgICAgOzsKLQkgIGVzYWMKLQkgIDs7Ci0Jbm8pCi0JICBjdXJyZW50PSIkMSIKLQkgIHJldmlzaW9uPSIkMiIKLQkgIGFnZT0iJDMiCi0JICA7OwotCWVzYWMKLQotCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCi0JY2FzZSAkY3VycmVudCBpbgotCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKLQkqKQotCSAgZnVuY19lcnJvciAiQ1VSUkVOVCBcYCRjdXJyZW50JyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAkcmV2aXNpb24gaW4KLQkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7Ci0JKikKLQkgIGZ1bmNfZXJyb3IgIlJFVklTSU9OIFxgJHJldmlzaW9uJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAkYWdlIGluCi0JMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OwotCSopCi0JICBmdW5jX2Vycm9yICJBR0UgXGAkYWdlJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKLQkgIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJGFnZSIgLWd0ICIkY3VycmVudCI7IHRoZW4KLQkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIgotCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgotCWZpCi0KLQkjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCi0JbWFqb3I9Ci0JdmVyc3VmZml4PQotCXZlcnN0cmluZz0KLQljYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQlub25lKSA7OwotCi0JZGFyd2luKQotCSAgIyBMaWtlIExpbnV4LCBidXQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIGF2YWlsYWJsZSBpbgotCSAgIyB2ZXJzdHJpbmcgZm9yIGNvZGluZyBpdCBpbnRvIHRoZSBsaWJyYXJ5IGhlYWRlcgotCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKLQkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotCSAgIyBEYXJ3aW4gbGQgZG9lc24ndCBsaWtlIDAgZm9yIHRoZXNlIG9wdGlvbnMuLi4KLQkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgKyAxCi0JICBtaW5vcl9jdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgeGxjdmVyc3RyaW5nPSIke3dsfS1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudCAke3dsfS1jdXJyZW50X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudC4kcmV2aXNpb24iCi0JICB2ZXJzdHJpbmc9Ii1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJG1pbm9yX2N1cnJlbnQgLWN1cnJlbnRfdmVyc2lvbiAkbWlub3JfY3VycmVudC4kcmV2aXNpb24iCi0JICA7OwotCi0JZnJlZWJzZC1hb3V0KQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiI7Ci0JICA7OwotCi0JZnJlZWJzZC1lbGYpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiCi0JICA7OwotCi0JaXJpeCB8IG5vbnN0b3B1eCkKLQkgIGlmIHRlc3QgIlgkbHRfaXJpeF9pbmNyZW1lbnQiID0gIlhubyI7IHRoZW4KLQkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKLQkgIGVsc2UKLQkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UgKyAxCi0JICBmaQotCSAgbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0KLQkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotCSAgICBub25zdG9wdXgpIHZlcnN0cmluZ19wcmVmaXg9bm9uc3RvcHV4IDs7Ci0JICAgICopICAgICAgICAgdmVyc3RyaW5nX3ByZWZpeD1zZ2kgOzsKLQkgIGVzYWMKLQkgIHZlcnN0cmluZz0iJHZlcnN0cmluZ19wcmVmaXgkbWFqb3IuJHJldmlzaW9uIgotCi0JICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotCSAgbG9vcD0kcmV2aXNpb24KLQkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KLQkgICAgZnVuY19hcml0aCAkcmV2aXNpb24gLSAkbG9vcAotCSAgICBpZmFjZT0kZnVuY19hcml0aF9yZXN1bHQKLQkgICAgZnVuY19hcml0aCAkbG9vcCAtIDEKLQkgICAgbG9vcD0kZnVuY19hcml0aF9yZXN1bHQKLQkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKLQkgIGRvbmUKLQotCSAgIyBCZWZvcmUgdGhpcyBwb2ludCwgJG1ham9yIG11c3Qgbm90IGNvbnRhaW4gYC4nLgotCSAgbWFqb3I9LiRtYWpvcgotCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgotCSAgOzsKLQotCWxpbnV4KQotCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKLQkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotCSAgOzsKLQotCW9zZikKLQkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkYWdlCi0JICBtYWpvcj0uJGZ1bmNfYXJpdGhfcmVzdWx0Ci0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRhZ2UKLQkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KLQkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRsb29wCi0JICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQotCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKLQkgIGRvbmUKLQotCSAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgotCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7Y3VycmVudH0uMCIKLQkgIDs7Ci0KLQlxbngpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiCi0JICA7OwotCi0Jc3Vub3MpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIgotCSAgOzsKLQotCXdpbmRvd3MpCi0JICAjIFVzZSAnLScgcmF0aGVyIHRoYW4gJy4nLCBzaW5jZSB3ZSBvbmx5IHdhbnQgb25lCi0JICAjIGV4dGVuc2lvbiBvbiBET1MgOC4zIGZpbGVzeXN0ZW1zLgotCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKLQkgIG1ham9yPSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgdmVyc3VmZml4PSItJG1ham9yIgotCSAgOzsKLQotCSopCi0JICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gInVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIKLQkgIDs7Ci0JZXNhYwotCi0JIyBDbGVhciB0aGUgdmVyc2lvbiBpbmZvIGlmIHdlIGRlZmF1bHRlZCwgYW5kIHRoZXkgc3BlY2lmaWVkIGEgcmVsZWFzZS4KLQlpZiB0ZXN0IC16ICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSAgbWFqb3I9Ci0JICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQkgIGRhcndpbikKLQkgICAgIyB3ZSBjYW4ndCBjaGVjayBmb3IgIjAuMCIgaW4gYXJjaGl2ZV9jbWRzIGR1ZSB0byBxdW90aW5nCi0JICAgICMgcHJvYmxlbXMsIHNvIHdlIHJlc2V0IGl0IGNvbXBsZXRlbHkKLQkgICAgdmVyc3RyaW5nPQotCSAgICA7OwotCSAgKikKLQkgICAgdmVyc3RyaW5nPSIwLjAiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCi0JICAgIHZlcnN1ZmZpeD0KLQkgIGVsc2UKLQkgICAgdmVyc3VmZml4PSIuMC4wIgotCSAgZmkKLQlmaQotCi0JIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCi0JaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3VmZml4PQotCSAgdmVyc3RyaW5nPSIiCi0JZmkKLQotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KLQlpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgIGZ1bmNfd2FybmluZyAidW5kZWZpbmVkIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gJGhvc3Qgc2hhcmVkIGxpYnJhcmllcyIKLQkgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgZmkKLQllbHNlCi0JICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKLQlmaQotCi0gICAgICBmaQotCi0gICAgICBmdW5jX2dlbmVyYXRlX2Rsc3ltcyAiJGxpYm5hbWUiICIkbGlibmFtZSIgInllcyIKLSAgICAgIGxpYm9ianM9IiRsaWJvYmpzICRzeW1maWxlb2JqIgotICAgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KLQotICAgICAgaWYgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgotCSMgUmVtb3ZlIG91ciBvdXRwdXRzLCBidXQgZG9uJ3QgcmVtb3ZlIG9iamVjdCBmaWxlcyBzaW5jZSB0aGV5Ci0JIyBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2hlbiBjb21waWxpbmcgUElDIG9iamVjdHMuCi0JcmVtb3ZlbGlzdD0KLQl0ZW1wcmVtb3ZlbGlzdD1gJEVDSE8gIiRvdXRwdXRfb2JqZGlyLyoiYAotCWZvciBwIGluICR0ZW1wcmVtb3ZlbGlzdDsgZG8KLQkgIGNhc2UgJHAgaW4KLQkgICAgKi4kb2JqZXh0IHwgKi5nY25vKQotCSAgICAgICA7OwotCSAgICAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSB8ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogfCAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qKQotCSAgICAgICBpZiB0ZXN0ICJYJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiAhPSAiWCI7IHRoZW4KLQkJIGlmICRFQ0hPICIkcCIgfCAkRUdSRVAgLWUgIiRwcmVjaW91c19maWxlc19yZWdleCIgPi9kZXYvbnVsbCAyPiYxCi0JCSB0aGVuCi0JCSAgIGNvbnRpbnVlCi0JCSBmaQotCSAgICAgICBmaQotCSAgICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkcCIKLQkgICAgICAgOzsKLQkgICAgKikgOzsKLQkgIGVzYWMKLQlkb25lCi0JdGVzdCAtbiAiJHJlbW92ZWxpc3QiICYmIFwKLQkgIGZ1bmNfc2hvd19ldmFsICIke1JNfXIgXCRyZW1vdmVsaXN0IgotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IGNvbnZlbmllbmNlIDsgdGhlbgotCW9sZGxpYnM9IiRvbGRsaWJzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0KLQkjIFRyYW5zZm9ybSAubG8gZmlsZXMgdG8gLm8gZmlsZXMuCi0Jb2xkb2Jqcz0iJG9ianMgImAkRUNITyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JyQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAKLSAgICAgIGZpCi0KLSAgICAgICMgRWxpbWluYXRlIGFsbCB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMuCi0gICAgICAjZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KLSAgICAgICMJbGliX3NlYXJjaF9wYXRoPWAkRUNITyAiWCRsaWJfc2VhcmNoX3BhdGggIiB8ICRYc2VkIC1lICJzJSAkcGF0aCAlICVnImAKLSAgICAgICMJZGVwbGlicz1gJEVDSE8gIlgkZGVwbGlicyAiIHwgJFhzZWQgLWUgInMlIC1MJHBhdGggJSAlZyJgCi0gICAgICAjCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIlgkZGVwZW5kZW5jeV9saWJzICIgfCAkWHNlZCAtZSAicyUgLUwkcGF0aCAlICVnImAKLSAgICAgICNkb25lCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgotCXRlbXBfeHJwYXRoPQotCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KLQkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgotCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZG9uZQotCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSBkbGZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzIHRoYXQgd29uJ3QgYmUgZGxwcmVvcGVuZWQKLSAgICAgIG9sZF9kbGZpbGVzPSIkZGxmaWxlcyIKLSAgICAgIGRsZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxmaWxlczsgZG8KLQljYXNlICIgJGRscHJlZmlsZXMgJGRsZmlsZXMgIiBpbgotCSoiICRsaWIgIiopIDs7Ci0JKikgZGxmaWxlcz0iJGRsZmlsZXMgJGxpYiIgOzsKLQllc2FjCi0gICAgICBkb25lCi0KLSAgICAgICMgTWFrZSBzdXJlIGRscHJlZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMKLSAgICAgIG9sZF9kbHByZWZpbGVzPSIkZGxwcmVmaWxlcyIKLSAgICAgIGRscHJlZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KLQljYXNlICIkZGxwcmVmaWxlcyAiIGluCi0JKiIgJGxpYiAiKikgOzsKLQkqKSBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliIiA7OwotCWVzYWMKLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JICBjYXNlICRob3N0IGluCi0JICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKiB8ICotY2VnY2MqKQotCSAgICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCi0JICAgIDs7Ci0JICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JICAgICMgUmhhcHNvZHkgQyBsaWJyYXJ5IGlzIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JICAgIGRlcGxpYnM9IiRkZXBsaWJzIFN5c3RlbS5sdGZyYW1ld29yayIKLQkgICAgOzsKLQkgICotKi1uZXRic2QqKQotCSAgICAjIERvbid0IGxpbmsgd2l0aCBsaWJjIHVudGlsIHRoZSBhLm91dCBsZC5zbyBpcyBmaXhlZC4KLQkgICAgOzsKLQkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQotCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KLQkgICAgOzsKLQkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKLQkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCi0JICAgIDs7Ci0JICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCi0JICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKLQkgICAgOzsKLQkgICopCi0JICAgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgb3RoZXIgc3lzdGVtcyBpZiBuZWNlc3NhcnkuCi0JICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX25lZWRfbGMiID0gInllcyI7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCi0JICAgIGZpCi0JICAgIDs7Ci0JICBlc2FjCi0JZmkKLQotCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KLQluYW1lX3NhdmU9JG5hbWUKLQlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKLQlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKLQl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4Ci0JbWFqb3Jfc2F2ZT0kbWFqb3IKLQkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluawotCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bwotCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PwotCXJlbGVhc2U9IiIKLQl2ZXJzdWZmaXg9IiIKLQltYWpvcj0iIgotCW5ld2RlcGxpYnM9Ci0JZHJvcHBlZGRlcHM9bm8KLQljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCXBhc3NfYWxsKQotCSAgIyBEb24ndCBjaGVjayBmb3Igc2hhcmVkL3N0YXRpYy4gIEV2ZXJ5dGhpbmcgd29ya3MuCi0JICAjIFRoaXMgbWlnaHQgYmUgYSBsaXR0bGUgbmFpdmUuICBXZSBtaWdodCB3YW50IHRvIGNoZWNrCi0JICAjIHdoZXRoZXIgdGhlIGxpYnJhcnkgZXhpc3RzIG9yIG5vdC4gIEJ1dCB0aGlzIGlzIG9uCi0JICAjIG9zZjMgJiBvc2Y0IGFuZCBJJ20gbm90IHJlYWxseSBzdXJlLi4uIEp1c3QKLQkgICMgaW1wbGVtZW50aW5nIHdoYXQgd2FzIGFscmVhZHkgdGhlIGJlaGF2aW9yLgotCSAgbmV3ZGVwbGlicz0kZGVwbGlicwotCSAgOzsKLQl0ZXN0X2NvbXBpbGUpCi0JICAjIFRoaXMgY29kZSBzdHJlc3NlcyB0aGUgImxpYnJhcmllcyBhcmUgcHJvZ3JhbXMiIHBhcmFkaWdtIHRvIGl0cwotCSAgIyBsaW1pdHMuIE1heWJlIGV2ZW4gYnJlYWtzIGl0LiAgV2UgY29tcGlsZSBhIHByb2dyYW0sIGxpbmtpbmcgaXQKLQkgICMgYWdhaW5zdCB0aGUgZGVwbGlicyBhcyBhIHByb3h5IGZvciB0aGUgbGlicmFyeS4gIFRoZW4gd2UgY2FuIGNoZWNrCi0JICAjIHdoZXRoZXIgdGhleSBsaW5rZWQgaW4gc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIGxkZC4KLQkgICRvcHRfZHJ5X3J1biB8fCAkUk0gY29uZnRlc3QuYwotCSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotCSAgaW50IG1haW4oKSB7IHJldHVybiAwOyB9Ci1FT0YKLQkgICRvcHRfZHJ5X3J1biB8fCAkUk0gY29uZnRlc3QKLQkgIGlmICRMVENDICRMVENGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRkZXBsaWJzOyB0aGVuCi0JICAgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKLQkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCi0JICAgICAgY2FzZSAkaSBpbgotCSAgICAgIC1sKikKLQkJZnVuY19zdHJpcG5hbWUgLWwgJycgIiRpIgotCQluYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkJaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQkgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCQkgICoiICRpICIqKQotCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgICBpPSIiCi0JCSAgICA7OwotCQkgIGVzYWMKLQkJZmkKLQkJaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgotCQkgIGxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAotCQkgIGRlcGxpYl9tYXRjaGVzPWBldmFsICJcXCRFQ0hPIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiImAKLQkJICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzOyBzaGlmdAotCQkgIGRlcGxpYl9tYXRjaD0kMQotCQkgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KLQkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgIGVsc2UKLQkJICAgIGRyb3BwZWRkZXBzPXllcwotCQkgICAgJEVDSE8KLQkJICAgICRFQ0hPICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKLQkJICAgICRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgICAgJEVDSE8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSAgICAkRUNITyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBJIGJlbGlldmUgeW91IGRvIG5vdCBoYXZlIgotCQkgICAgJEVDSE8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIGl0IGZvciIKLQkJICAgICRFQ0hPICIqKiogaXRzIGR5bmFtaWMgZGVwZW5kZW5jeSBsaXN0IHRoYXQgcHJvZ3JhbXMgZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCi0JCSAgZmkKLQkJZmkKLQkJOzsKLQkgICAgICAqKQotCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgIGVsc2UKLQkgICAgIyBFcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlyc3QgY29tcGlsZS4gIExldCdzIHRyeSB0byBzYWx2YWdlCi0JICAgICMgdGhlIHNpdHVhdGlvbjogQ29tcGlsZSBhIHNlcGFyYXRlIHByb2dyYW0gZm9yIGVhY2ggbGlicmFyeS4KLQkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCi0JICAgICAgY2FzZSAkaSBpbgotCSAgICAgIC1sKikKLQkJZnVuY19zdHJpcG5hbWUgLWwgJycgIiRpIgotCQluYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkJJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdAotCQlpZiAkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaTsgdGhlbgotCQkgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKLQkJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JCSAgICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJICAgICoiICRpICIqKQotCQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICAgICAgaT0iIgotCQkgICAgICA7OwotCQkgICAgZXNhYwotCQkgIGZpCi0JCSAgaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgotCQkgICAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCi0JCSAgICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCAiXFwkRUNITyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcIiJgCi0JCSAgICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzOyBzaGlmdAotCQkgICAgZGVwbGliX21hdGNoPSQxCi0JCSAgICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgICAgZWxzZQotCQkgICAgICBkcm9wcGVkZGVwcz15ZXMKLQkJICAgICAgJEVDSE8KLQkJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgotCQkgICAgICAkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJICAgICAgJEVDSE8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSAgICAgICRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCSAgICAgICRFQ0hPICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSB0aGlzIG9uZSIKLQkJICAgICAgJEVDSE8gIioqKiBhcyBhIGR5bmFtaWMgZGVwZW5kZW5jeSB0aGF0IHByb2dyYW1zIGNhbiBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKLQkJICAgIGZpCi0JCSAgZmkKLQkJZWxzZQotCQkgIGRyb3BwZWRkZXBzPXllcwotCQkgICRFQ0hPCi0JCSAgJEVDSE8gIioqKiBXYXJuaW5nISAgTGlicmFyeSAkaSBpcyBuZWVkZWQgYnkgdGhpcyBsaWJyYXJ5IGJ1dCBJIHdhcyBub3QgYWJsZSB0byIKLQkJICAkRUNITyAiKioqIG1ha2UgaXQgbGluayBpbiEgIFlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gaW5zdGFsbCBpdCBvciBzb21lIgotCQkgICRFQ0hPICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgotCQkgICRFQ0hPICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgotCQlmaQotCQk7OwotCSAgICAgICopCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgZmkKLQkgIDs7Ci0JZmlsZV9tYWdpYyopCi0JICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kOyBzaGlmdAotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAotCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgICBjYXNlICRhX2RlcGxpYiBpbgotCSAgICAtbCopCi0JICAgICAgZnVuY19zdHJpcG5hbWUgLWwgJycgIiRhX2RlcGxpYiIKLQkgICAgICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCQkqIiAkYV9kZXBsaWIgIiopCi0JCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkgIGFfZGVwbGliPSIiCi0JCSAgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCi0JCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCQkgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAotCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KLQkJICAgICAgIyBGb2xsb3cgc29mdCBsaW5rcy4KLQkJICAgICAgaWYgbHMgLWxMZCAiJHBvdGVudF9saWIiIDI+L2Rldi9udWxsIHwKLQkJCSAkR1JFUCAiIC0+ICIgPi9kZXYvbnVsbDsgdGhlbgotCQkJY29udGludWUKLQkJICAgICAgZmkKLQkJICAgICAgIyBUaGUgc3RhdGVtZW50IGFib3ZlIHRyaWVzIHRvIGF2b2lkIGVudGVyaW5nIGFuCi0JCSAgICAgICMgZW5kbGVzcyBsb29wIGJlbG93LCBpbiBjYXNlIG9mIGN5Y2xpYyBsaW5rcy4KLQkJICAgICAgIyBXZSBtaWdodCBzdGlsbCBlbnRlciBhbiBlbmRsZXNzIGxvb3AsIHNpbmNlIGEgbGluawotCQkgICAgICAjIGxvb3AgY2FuIGJlIGNsb3NlZCB3aGlsZSB3ZSBmb2xsb3cgbGlua3MsCi0JCSAgICAgICMgYnV0IHNvIHdoYXQ/Ci0JCSAgICAgIHBvdGxpYj0iJHBvdGVudF9saWIiCi0JCSAgICAgIHdoaWxlIHRlc3QgLWggIiRwb3RsaWIiIDI+L2Rldi9udWxsOyBkbwotCQkJcG90bGlibGluaz1gbHMgLWxkICRwb3RsaWIgfCAke1NFRH0gJ3MvLiogLT4gLy8nYAotCQkJY2FzZSAkcG90bGlibGluayBpbgotCQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7Ci0JCQkqKSBwb3RsaWI9YCRFQ0hPICJYJHBvdGxpYiIgfCAkWHNlZCAtZSAncyxbXi9dKiQsLCdgIiRwb3RsaWJsaW5rIjs7Ci0JCQllc2FjCi0JCSAgICAgIGRvbmUKLQkJICAgICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJHBvdGxpYlwiIDI+L2Rldi9udWxsIHwKLQkJCSAkU0VEIC1lIDEwcSB8Ci0JCQkgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJCWFfZGVwbGliPSIiCi0JCQlicmVhayAyCi0JCSAgICAgIGZpCi0JCSAgZG9uZQotCQlkb25lCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlkcm9wcGVkZGVwcz15ZXMKLQkJJEVDSE8KLQkJJEVDSE8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgotCQkkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJJEVDSE8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCSRFQ0hPICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgotCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KLQkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciBmaWxlIG1hZ2ljIHRlc3QpIgotCQllbHNlCi0JCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCi0JCSAgJEVDSE8gIioqKiB1c2luZyBhIGZpbGUgbWFnaWMuIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgotCQlmaQotCSAgICAgIGZpCi0JICAgICAgOzsKLQkgICAgKikKLQkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgotCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgotCSAgOzsKLQltYXRjaF9wYXR0ZXJuKikKLQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0Ci0JICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCi0JICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JICAgIGNhc2UgJGFfZGVwbGliIGluCi0JICAgIC1sKikKLQkgICAgICBmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGFfZGVwbGliIgotCSAgICAgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JCSoiICRhX2RlcGxpYiAiKikKLQkJICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCSAgYV9kZXBsaWI9IiIKLQkJICA7OwotCQllc2FjCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKLQkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCi0JCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCi0JCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbwotCQkgICAgcG90bGliPSIkcG90ZW50X2xpYiIgIyBzZWUgc3ltbGluay1jaGVjayBhYm92ZSBpbiBmaWxlX21hZ2ljIHRlc3QKLQkJICAgIGlmIGV2YWwgIlwkRUNITyBcIlgkcG90ZW50X2xpYlwiIiAyPi9kZXYvbnVsbCB8ICRYc2VkIC1lIDEwcSB8IFwKLQkJICAgICAgICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJICAgICAgYV9kZXBsaWI9IiIKLQkJICAgICAgYnJlYWsgMgotCQkgICAgZmkKLQkJICBkb25lCi0JCWRvbmUKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWRyb3BwZWRkZXBzPXllcwotCQkkRUNITwotCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCi0JCSRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkJJEVDSE8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCi0JCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgotCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIHJlZ2V4IHBhdHRlcm4gdGVzdCkiCi0JCWVsc2UKLQkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKLQkJICAkRUNITyAiKioqIHVzaW5nIGEgcmVnZXggcGF0dGVybi4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCi0JCWZpCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICAqKQotCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCi0JICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCi0JICA7OwotCW5vbmUgfCB1bmtub3duIHwgKikKLQkgIG5ld2RlcGxpYnM9IiIKLQkgIHRtcF9kZXBsaWJzPWAkRUNITyAiWCAkZGVwbGlicyIgfCAkWHNlZCBcCi0JICAgICAgLWUgJ3MvIC1sYyQvLycgLWUgJ3MvIC1bTFJdW14gXSovL2cnYAotCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICBmb3IgaSBpbiAkcHJlZGVwcyAkcG9zdGRlcHMgOyBkbwotCSAgICAgICMgY2FuJ3QgdXNlIFhzZWQgYmVsb3csIGJlY2F1c2UgJGkgbWlnaHQgY29udGFpbiAnLycKLQkgICAgICB0bXBfZGVwbGlicz1gJEVDSE8gIlggJHRtcF9kZXBsaWJzIiB8ICRYc2VkIC1lICJzLCRpLCwiYAotCSAgICBkb25lCi0JICBmaQotCSAgaWYgJEVDSE8gIlggJHRtcF9kZXBsaWJzIiB8ICRYc2VkIC1lICdzL1sJIF0vL2cnIHwKLQkgICAgICRHUkVQIC4gPi9kZXYvbnVsbDsgdGhlbgotCSAgICAkRUNITwotCSAgICBpZiB0ZXN0ICJYJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9ICJYbm9uZSI7IHRoZW4KLQkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgcGxhdGZvcm0uIgotCSAgICBlbHNlCi0JICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IGtub3duIHRvIGJlIHN1cHBvcnRlZC4iCi0JICAgIGZpCi0JICAgICRFQ0hPICIqKiogQWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBkcm9wcGVkLiIKLQkgICAgZHJvcHBlZGRlcHM9eWVzCi0JICBmaQotCSAgOzsKLQllc2FjCi0JdmVyc3VmZml4PSR2ZXJzdWZmaXhfc2F2ZQotCW1ham9yPSRtYWpvcl9zYXZlCi0JcmVsZWFzZT0kcmVsZWFzZV9zYXZlCi0JbGlibmFtZT0kbGlibmFtZV9zYXZlCi0JbmFtZT0kbmFtZV9zYXZlCi0KLQljYXNlICRob3N0IGluCi0JKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSAgIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgd2l0aCB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgbmV3ZGVwbGlicz1gJEVDSE8gIlggJG5ld2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKLQkgIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJGRyb3BwZWRkZXBzIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KLQkgICAgJEVDSE8KLQkgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBsaWJ0b29sIGNvdWxkIG5vdCBzYXRpc2Z5IGFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IgotCSAgICAkRUNITyAiKioqIGRlcGVuZGVuY2llcyBvZiBtb2R1bGUgJGxpYm5hbWUuICBUaGVyZWZvcmUsIGxpYnRvb2wgd2lsbCBjcmVhdGUiCi0JICAgICRFQ0hPICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyIKLQkgICAgJEVDSE8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKLQkgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgICAgICAkRUNITwotCSAgICAgICRFQ0hPICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKLQkgICAgICAkRUNITyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkgICAgICAkRUNITyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgotCSAgICAgICRFQ0hPICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKLQkgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCi0JICAgICAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JICAgIGVsc2UKLQkgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgJEVDSE8gIioqKiBUaGUgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlIGJlZW4gZHJvcHBlZCBoZXJlIHdpbGwgYmUiCi0JICAgICRFQ0hPICIqKiogYXV0b21hdGljYWxseSBhZGRlZCB3aGVuZXZlciBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggdGhpcyBsaWJyYXJ5IgotCSAgICAkRUNITyAiKioqIG9yIGlzIGRlY2xhcmVkIHRvIC1kbG9wZW4gaXQuIgotCi0JICAgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0gbm87IHRoZW4KLQkgICAgICAkRUNITwotCSAgICAgICRFQ0hPICIqKiogU2luY2UgdGhpcyBsaWJyYXJ5IG11c3Qgbm90IGNvbnRhaW4gdW5kZWZpbmVkIHN5bWJvbHMsIgotCSAgICAgICRFQ0hPICIqKiogYmVjYXVzZSBlaXRoZXIgdGhlIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgdGhlbSBvciIKLQkgICAgICAkRUNITyAiKioqIGl0IHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZCB3aXRoIC1uby11bmRlZmluZWQsIgotCSAgICAgICRFQ0hPICIqKiogbGlidG9vbCB3aWxsIG9ubHkgY3JlYXRlIGEgc3RhdGljIHZlcnNpb24gb2YgaXQuIgotCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCQlvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCi0JCWJ1aWxkX29sZF9saWJzPXllcwotCSAgICAgIGVsc2UKLQkJYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgICAgZmkKLQkgICAgZmkKLQkgIGZpCi0JZmkKLQkjIERvbmUgY2hlY2tpbmcgZGVwbGlicyEKLQlkZXBsaWJzPSRuZXdkZXBsaWJzCi0gICAgICBmaQotICAgICAgIyBUaW1lIHRvIGNoYW5nZSBhbGwgb3VyICJmb28ubHRmcmFtZXdvcmsiIHN0dWZmIGJhY2sgdG8gIi1mcmFtZXdvcmsgZm9vIgotICAgICAgY2FzZSAkaG9zdCBpbgotCSotKi1kYXJ3aW4qKQotCSAgbmV3ZGVwbGlicz1gJEVDSE8gIlggJG5ld2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCi0JICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz1gJEVDSE8gIlggJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAotCSAgZGVwbGlicz1gJEVDSE8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCi0JICA7OwotICAgICAgZXNhYwotCi0gICAgICAjIG1vdmUgbGlicmFyeSBzZWFyY2ggcGF0aHMgdGhhdCBjb2luY2lkZSB3aXRoIHBhdGhzIHRvIG5vdCB5ZXQKLSAgICAgICMgaW5zdGFsbGVkIGxpYnJhcmllcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IHNlYXJjaCBsaXN0Ci0gICAgICBuZXdfbGlicz0KLSAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCi0JY2FzZSAiICRuZXdfbGlicyAiIGluCi0JKiIgLUwkcGF0aC8kb2JqZGlyICIqKSA7OwotCSopCi0JICBjYXNlICIgJGRlcGxpYnMgIiBpbgotCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQotCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KLQljYXNlICRkZXBsaWIgaW4KLQktTCopCi0JICBjYXNlICIgJG5ld19saWJzICIgaW4KLQkgICoiICRkZXBsaWIgIiopIDs7Ci0JICAqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7Ci0JICBlc2FjCi0JICA7OwotCSopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICBkZXBsaWJzPSIkbmV3X2xpYnMiCi0KLSAgICAgICMgQWxsIHRoZSBsaWJyYXJ5LXNwZWNpZmljIHZhcmlhYmxlcyAoaW5zdGFsbF9saWJkaXIgaXMgc2V0IGFib3ZlKS4KLSAgICAgIGxpYnJhcnlfbmFtZXM9Ci0gICAgICBvbGRfbGlicmFyeT0KLSAgICAgIGRsbmFtZT0KLQotICAgICAgIyBUZXN0IGFnYWluLCB3ZSBtYXkgaGF2ZSBkZWNpZGVkIG5vdCB0byBidWlsZCBpdCBhbnkgbW9yZQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiA9IHllczsgdGhlbgotCSAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocwotCSAgaGFyZGNvZGVfbGliZGlycz0KLQkgIGRlcF9ycGF0aD0KLQkgIHJwYXRoPSIkZmluYWxpemVfcnBhdGgiCi0JICB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHJwYXRoPSIkY29tcGlsZV9ycGF0aCRycGF0aCIKLQkgIGZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbwotCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkJaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JCSAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkJZWxzZQotCQkgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkJICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCQkgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJICAgIDs7Ci0JCSAgKikKLQkJICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQkgICAgOzsKLQkJICBlc2FjCi0JCWZpCi0JICAgICAgZWxzZQotCQlldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JCWRlcF9ycGF0aD0iJGRlcF9ycGF0aCAkZmxhZyIKLQkgICAgICBmaQotCSAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGRvbmUKLQkgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgICAgIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICBsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCI7IHRoZW4KLQkgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXCIKLQkgICAgZWxzZQotCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBmaQotCSAgZmkKLQkgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCi0JICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICAgIHJwYXRoPQotCSAgICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbwotCSAgICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgICAgZG9uZQotCSAgICBldmFsICIkcnVucGF0aF92YXI9JyRycGF0aFwkJHJ1bnBhdGhfdmFyJzsgZXhwb3J0ICRydW5wYXRoX3ZhciIKLQkgIGZpCi0JICB0ZXN0IC1uICIkZGVwX3JwYXRoIiAmJiBkZXBsaWJzPSIkZGVwX3JwYXRoICRkZXBsaWJzIgotCWZpCi0KLQlzaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgiCi0JdGVzdCAiJG1vZGUiICE9IHJlbGluayAmJiBzaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRzaGxpYnBhdGgiCi0JaWYgdGVzdCAtbiAiJHNobGlicGF0aCI7IHRoZW4KLQkgIGV2YWwgIiRzaGxpYnBhdGhfdmFyPSckc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3Zhcic7IGV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLQlmaQotCi0JIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCi0JZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKLQlldmFsIGxpYnJhcnlfbmFtZXM9XCIkbGlicmFyeV9uYW1lc19zcGVjXCIKLQlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQlzaGlmdAotCXJlYWxuYW1lPSIkMSIKLQlzaGlmdAotCi0JaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgotCSAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotCWVsc2UKLQkgIHNvbmFtZT0iJHJlYWxuYW1lIgotCWZpCi0JaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KLQkgIGRsbmFtZT0kc29uYW1lCi0JZmkKLQotCWxpYj0iJG91dHB1dF9vYmpkaXIvJHJlYWxuYW1lIgotCWxpbmtuYW1lcz0KLQlmb3IgbGluawotCWRvCi0JICBsaW5rbmFtZXM9IiRsaW5rbmFtZXMgJGxpbmsiCi0JZG9uZQotCi0JIyBVc2Ugc3RhbmRhcmQgb2JqZWN0cyBpZiB0aGV5IGFyZSBwaWMKLQl0ZXN0IC16ICIkcGljX2ZsYWciICYmIGxpYm9ianM9YCRFQ0hPICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQl0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQotCi0JZGVsZmlsZXM9Ci0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgJG9wdF9kcnlfcnVuIHx8IGNwICIkZXhwb3J0X3N5bWJvbHMiICIkb3V0cHV0X29iamRpci8kbGlibmFtZS51ZXhwIgotCSAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCi0JICBkZWxmaWxlcz0iJGRlbGZpbGVzICRleHBvcnRfc3ltYm9scyIKLQlmaQotCi0Jb3JpZ19leHBvcnRfc3ltYm9scz0KLQljYXNlICRob3N0X29zIGluCi0JY3lnd2luKiB8IG1pbmd3KiB8IGNlZ2NjKikKLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAjIGV4cG9ydGluZyB1c2luZyB1c2VyIHN1cHBsaWVkIHN5bWZpbGUKLQkgICAgaWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiICE9IHhFWFBPUlRTOyB0aGVuCi0JICAgICAgIyBhbmQgaXQncyBOT1QgYWxyZWFkeSBhIC5kZWYgZmlsZS4gTXVzdCBmaWd1cmUgb3V0Ci0JICAgICAgIyB3aGljaCBvZiB0aGUgZ2l2ZW4gc3ltYm9scyBhcmUgZGF0YSBzeW1ib2xzIGFuZCB0YWcKLQkgICAgICAjIHRoZW0gYXMgc3VjaC4gU28sIHRyaWdnZXIgdXNlIG9mIGV4cG9ydF9zeW1ib2xzX2NtZHMuCi0JICAgICAgIyBleHBvcnRfc3ltYm9scyBnZXRzIHJlYXNzaWduZWQgaW5zaWRlIHRoZSAicHJlcGFyZQotCSAgICAgICMgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scyIgaWYgc3RhdGVtZW50LCBzbyB0aGUKLQkgICAgICAjIGluY2x1ZGVfZXhwc3ltcyBsb2dpYyBzdGlsbCB3b3Jrcy4KLQkgICAgICBvcmlnX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCi0JICAgICAgZXhwb3J0X3N5bWJvbHM9Ci0JICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotCSAgICBmaQotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCi0JIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCi0JICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCi0JICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGNtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKLQkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICAgICBmdW5jX2xlbiAiICRjbWQiCi0JICAgICAgbGVuPSRmdW5jX2xlbl9yZXN1bHQKLQkgICAgICBpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KLQkJZnVuY19zaG93X2V2YWwgIiRjbWQiICdleGl0ICQ/JwotCQlza2lwcGVkX2V4cG9ydD1mYWxzZQotCSAgICAgIGVsc2UKLQkJIyBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGV4ZWN1dGUgaW4gb25lIHN0ZXAuCi0JCWZ1bmNfdmVyYm9zZSAidXNpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZSBmb3IgZXhwb3J0IGxpc3QuLi4iCi0JCXNraXBwZWRfZXhwb3J0PToKLQkJIyBCcmVhayBvdXQgZWFybHksIG90aGVyd2lzZSBza2lwcGVkX2V4cG9ydCBtYXkgYmUKLQkJIyBzZXQgdG8gZmFsc2UgYnkgYSBsYXRlciBidXQgc2hvcnRlciBjbWQuCi0JCWJyZWFrCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAmJiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiOyB0aGVuCi0JICAgICAgZnVuY19zaG93X2V2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJGV4cG9ydF9zeW1ib2xzIiA+ICIke2V4cG9ydF9zeW1ib2xzfVQiJwotCSAgICAgIGZ1bmNfc2hvd19ldmFsICckTVYgIiR7ZXhwb3J0X3N5bWJvbHN9VCIgIiRleHBvcnRfc3ltYm9scyInCi0JICAgIGZpCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICB0bXBfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKLQkgIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIiAmJiB0bXBfZXhwb3J0X3N5bWJvbHM9IiRvcmlnX2V4cG9ydF9zeW1ib2xzIgotCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyRFQ0hPICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkWHNlZCB8ICRTUDJOTCA+PiAiJHRtcF9leHBvcnRfc3ltYm9scyInCi0JZmkKLQotCWlmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICAjIFRoZSBnaXZlbiBleHBvcnRzX3N5bWJvbHMgZmlsZSBoYXMgdG8gYmUgZmlsdGVyZWQsIHNvIGZpbHRlciBpdC4KLQkgIGZ1bmNfdmVyYm9zZSAiZmlsdGVyIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyB0byB0YWcgREFUQSBleHBvcnRzIgotCSAgIyBGSVhNRTogJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIHBvdGVudGlhbGx5IGNvbnRhaW5zIGxvdHMgb2YKLQkgICMgJ3MnIGNvbW1hbmRzIHdoaWNoIG5vdCBhbGwgc2VkcyBjYW4gaGFuZGxlLiBHTlUgc2VkIHNob3VsZCBiZSBmaW5lCi0JICAjIHRob3VnaC4gQWxzbywgdGhlIGZpbHRlciBzY2FsZXMgc3VwZXJsaW5lYXJseSB3aXRoIHRoZSBudW1iZXIgb2YKLQkgICMgZ2xvYmFsIHZhcmlhYmxlcy4gam9pbigxKSB3b3VsZCBiZSBuaWNlIGhlcmUsIGJ1dCB1bmZvcnR1bmF0ZWx5Ci0JICAjIGlzbid0IGEgYmxlc3NlZCB0b29sLgotCSAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWUgJy9bICxdREFUQS8hZDtzLFwoLipcKVwoWyBcLF0uKlwpLHN8XlwxJHxcMVwyfCwnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyCi0JICBkZWxmaWxlcz0iJGRlbGZpbGVzICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIiCi0JICBleHBvcnRfc3ltYm9scz0kb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYKLQkgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1mICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciA8ICRvcmlnX2V4cG9ydF9zeW1ib2xzID4gJGV4cG9ydF9zeW1ib2xzCi0JZmkKLQotCXRtcF9kZXBsaWJzPQotCWZvciB0ZXN0X2RlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkgIGNhc2UgIiAkY29udmVuaWVuY2UgIiBpbgotCSAgKiIgJHRlc3RfZGVwbGliICIqKSA7OwotCSAgKikKLQkgICAgdG1wX2RlcGxpYnM9IiR0bXBfZGVwbGlicyAkdGVzdF9kZXBsaWIiCi0JICAgIDs7Ci0JICBlc2FjCi0JZG9uZQotCWRlcGxpYnM9IiR0bXBfZGVwbGlicyIKLQotCWlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyIgJiYKLQkgICAgdGVzdCAiJGNvbXBpbGVyX25lZWRzX29iamVjdCIgPSB5ZXMgJiYKLQkgICAgdGVzdCAteiAiJGxpYm9ianMiOyB0aGVuCi0JICAgICMgZXh0cmFjdCB0aGUgYXJjaGl2ZXMsIHNvIHdlIGhhdmUgb2JqZWN0cyB0byBsaXN0LgotCSAgICAjIFRPRE86IGNvdWxkIG9wdGltaXplIHRoaXMgdG8ganVzdCBleHRyYWN0IG9uZSBhcmNoaXZlLgotCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLQkgIGZpCi0JICBpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcwotCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KLQkgIGVsc2UKLQkgICAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQkgICAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCi0JICAgIGxpYm9ianM9IiRsaWJvYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgotCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAiJHRocmVhZF9zYWZlIiA9IHllcyAmJiB0ZXN0IC1uICIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgZXZhbCBmbGFnPVwiJHRocmVhZF9zYWZlX2ZsYWdfc3BlY1wiCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZsYWciCi0JZmkKLQotCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZwotCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkUk0gJHtyZWFsbmFtZX1VICYmICRNViAkcmVhbG5hbWUgJHtyZWFsbmFtZX1VKScgfHwgZXhpdCAkPwotCWZpCi0KLQkjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2V4cHN5bV9jbWRzXCIKLQkgICAgY21kcz0kbW9kdWxlX2V4cHN5bV9jbWRzCi0JICBlbHNlCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9jbWRzXCIKLQkgICAgY21kcz0kbW9kdWxlX2NtZHMKLQkgIGZpCi0JZWxzZQotCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9leHBzeW1fY21kc1wiCi0JICAgIGNtZHM9JGFyY2hpdmVfZXhwc3ltX2NtZHMKLQkgIGVsc2UKLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9jbWRzXCIKLQkgICAgY21kcz0kYXJjaGl2ZV9jbWRzCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmCi0JICAgZnVuY19sZW4gIiAkdGVzdF9jbWRzIiAmJgotCSAgIGxlbj0kZnVuY19sZW5fcmVzdWx0ICYmCi0JICAgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCi0JICA6Ci0JZWxzZQotCSAgIyBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGxpbmsgaW4gb25lIHN0ZXAsIGxpbmsgcGllY2V3aXNlCi0JICAjIG9yLCBpZiB1c2luZyBHTlUgbGQgYW5kIHNraXBwZWRfZXhwb3J0IGlzIG5vdCA6LCB1c2UgYSBsaW5rZXIKLQkgICMgc2NyaXB0LgotCi0JICAjIFNhdmUgdGhlIHZhbHVlIG9mICRvdXRwdXQgYW5kICRsaWJvYmpzIGJlY2F1c2Ugd2Ugd2FudCB0bwotCSAgIyB1c2UgdGhlbSBsYXRlci4gIElmIHdlIGhhdmUgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsIHdlCi0JICAjIHdhbnQgdG8gdXNlIHNhdmVfbGlib2JqcyBhcyBpdCB3YXMgYmVmb3JlCi0JICAjIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIHdhcyBleHBhbmRlZCwgYmVjYXVzZSB3ZSBjYW4ndAotCSAgIyBhc3N1bWUgdGhlIGxpbmtlciB1bmRlcnN0YW5kcyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYy4KLQkgICMgVGhpcyBtYXkgaGF2ZSB0byBiZSByZXZpc2l0ZWQsIGluIGNhc2UgdG9vIG1hbnkKLQkgICMgY29udmVuaWVuY2UgbGlicmFyaWVzIGdldCBsaW5rZWQgaW4gYW5kIGVuZCB1cCBleGNlZWRpbmcKLQkgICMgdGhlIHNwZWMuCi0JICBpZiB0ZXN0IC16ICIkY29udmVuaWVuY2UiIHx8IHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCi0JICBmaQotCSAgc2F2ZV9vdXRwdXQ9JG91dHB1dAotCSAgb3V0cHV0X2xhPWAkRUNITyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRiYXNlbmFtZSJgCi0KLQkgICMgQ2xlYXIgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGNyZWF0aW9uIGNvbW1hbmQgcXVldWUgYW5kCi0JICAjIGluaXRpYWxpemUgayB0byBvbmUuCi0JICB0ZXN0X2NtZHM9Ci0JICBjb25jYXRfY21kcz0KLQkgIG9iamxpc3Q9Ci0JICBsYXN0X3JvYmo9Ci0JICBrPTEKLQotCSAgaWYgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0JICAgIG91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5sbmtzY3JpcHQKLQkgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyBHTlUgbGQgc2NyaXB0OiAkb3V0cHV0IgotCSAgICAkRUNITyAnSU5QVVQgKCcgPiAkb3V0cHV0Ci0JICAgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcwotCSAgICBkbwotCSAgICAgICRFQ0hPICIkb2JqIiA+PiAkb3V0cHV0Ci0JICAgIGRvbmUKLQkgICAgJEVDSE8gJyknID4+ICRvdXRwdXQKLQkgICAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkb3V0cHV0IgotCSAgZWxpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgIlgkZmlsZV9saXN0X3NwZWMiICE9IFg7IHRoZW4KLQkgICAgb3V0cHV0PSR7b3V0cHV0X29iamRpcn0vJHtvdXRwdXRfbGF9LmxuawotCSAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIGxpbmtlciBpbnB1dCBmaWxlIGxpc3Q6ICRvdXRwdXQiCi0JICAgIDogPiAkb3V0cHV0Ci0JICAgIHNldCB4ICRzYXZlX2xpYm9ianMKLQkgICAgc2hpZnQKLQkgICAgZmlyc3RvYmo9Ci0JICAgIGlmIHRlc3QgIiRjb21waWxlcl9uZWVkc19vYmplY3QiID0geWVzOyB0aGVuCi0JICAgICAgZmlyc3RvYmo9IiQxICIKLQkgICAgICBzaGlmdAotCSAgICBmaQotCSAgICBmb3Igb2JqCi0JICAgIGRvCi0JICAgICAgJEVDSE8gIiRvYmoiID4+ICRvdXRwdXQKLQkgICAgZG9uZQotCSAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXQiCi0JICAgIG91dHB1dD0kZmlyc3RvYmpcIiRmaWxlX2xpc3Rfc3BlYyRvdXRwdXRcIgotCSAgZWxzZQotCSAgICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIjsgdGhlbgotCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuLi4iCi0JICAgICAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0Ci0JICAgICAgZXZhbCB0ZXN0X2NtZHM9XCIkcmVsb2FkX2NtZHNcIgotCSAgICAgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKLQkgICAgICBsZW4wPSRmdW5jX2xlbl9yZXN1bHQKLQkgICAgICBsZW49JGxlbjAKLQotCSAgICAgICMgTG9vcCBvdmVyIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbGlua2VkLgotCSAgICAgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcwotCSAgICAgIGRvCi0JCWZ1bmNfbGVuICIgJG9iaiIKLQkJZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAotCQlsZW49JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JCWlmIHRlc3QgIlgkb2JqbGlzdCIgPSBYIHx8Ci0JCSAgIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIjsgdGhlbgotCQkgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgotCQllbHNlCi0JCSAgIyBUaGUgY29tbWFuZCAkdGVzdF9jbWRzIGlzIGFsbW9zdCB0b28gbG9uZywgYWRkIGEKLQkJICAjIGNvbW1hbmQgdG8gdGhlIHF1ZXVlLgotCQkgIGlmIHRlc3QgIiRrIiAtZXEgMSA7IHRoZW4KLQkJICAgICMgVGhlIGZpcnN0IGZpbGUgZG9lc24ndCBoYXZlIGEgcHJldmlvdXMgY29tbWFuZCB0byBhZGQuCi0JCSAgICBldmFsIGNvbmNhdF9jbWRzPVwiJHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgotCQkgIGVsc2UKLQkJICAgICMgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMgd2lsbCBsaW5rIGluCi0JCSAgICAjIHRoZSBsYXN0IG9uZSBjcmVhdGVkLgotCQkgICAgZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHN+JHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmp+XCRSTSAkbGFzdF9yb2JqXCIKLQkJICBmaQotCQkgIGxhc3Rfcm9iaj0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAotCQkgIGZ1bmNfYXJpdGggJGsgKyAxCi0JCSAgaz0kZnVuY19hcml0aF9yZXN1bHQKLQkJICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKLQkJICBvYmpsaXN0PSRvYmoKLQkJICBmdW5jX2xlbiAiICRsYXN0X3JvYmoiCi0JCSAgZnVuY19hcml0aCAkbGVuMCArICRmdW5jX2xlbl9yZXN1bHQKLQkJICBsZW49JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JCWZpCi0JICAgICAgZG9uZQotCSAgICAgICMgSGFuZGxlIHRoZSByZW1haW5pbmcgb2JqZWN0cyBieSBjcmVhdGluZyBvbmUgbGFzdAotCSAgICAgICMgcmVsb2FkYWJsZSBvYmplY3QgZmlsZS4gIEFsbCBzdWJzZXF1ZW50IHJlbG9hZGFibGUgb2JqZWN0Ci0JICAgICAgIyBmaWxlcyB3aWxsIGxpbmsgaW4gdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCi0JICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+Ci0JICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKLQkgICAgICBpZiB0ZXN0IC1uICIkbGFzdF9yb2JqIjsgdGhlbgotCSAgICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfX5cJFJNICRsYXN0X3JvYmpcIgotCSAgICAgIGZpCi0JICAgICAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkb3V0cHV0IgotCi0JICAgIGVsc2UKLQkgICAgICBvdXRwdXQ9Ci0JICAgIGZpCi0KLQkgICAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KLQkgICAgICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgotCSAgICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCi0JICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgICBsaWJvYmpzPSRvdXRwdXQKLQkgICAgICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byBjcmVhdGUgdGhlIGV4cG9ydCBmaWxlLgotCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgotCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzJGV4cG9ydF9zeW1ib2xzX2NtZHNcIgotCSAgICAgIGlmIHRlc3QgLW4gIiRsYXN0X3JvYmoiOyB0aGVuCi0JCWV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzflwkUk0gJGxhc3Rfcm9ialwiCi0JICAgICAgZmkKLQkgICAgZmkKLQotCSAgICB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJgotCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgYSB0ZW1wb3JhcnkgcmVsb2FkYWJsZSBvYmplY3QgZmlsZTogJG91dHB1dCIKLQotCSAgICAjIExvb3AgdGhyb3VnaCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGFib3ZlIGFuZCBleGVjdXRlIHRoZW0uCi0JICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICBmb3IgY21kIGluICRjb25jYXRfY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkb3B0X3NpbGVudCB8fCB7Ci0JCSAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkY21kIgotCQkgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKLQkgICAgICB9Ci0JICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWQiIHx8IHsKLQkJbHRfZXhpdD0kPwotCi0JCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAotCQlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkJICAoIGNkICIkb3V0cHV0X29iamRpciIgJiYgXAotCQkgICAgJFJNICIke3JlYWxuYW1lfVQiICYmIFwKLQkJICAgICRNViAiJHtyZWFsbmFtZX1VIiAiJHJlYWxuYW1lIiApCi0JCWZpCi0KLQkJZXhpdCAkbHRfZXhpdAotCSAgICAgIH0KLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICYmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCi0JICAgICAgZnVuY19zaG93X2V2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJGV4cG9ydF9zeW1ib2xzIiA+ICIke2V4cG9ydF9zeW1ib2xzfVQiJwotCSAgICAgIGZ1bmNfc2hvd19ldmFsICckTVYgIiR7ZXhwb3J0X3N5bWJvbHN9VCIgIiRleHBvcnRfc3ltYm9scyInCi0JICAgIGZpCi0JICBmaQotCi0gICAgICAgICAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgIHRtcF9leHBvcnRfc3ltYm9scz0iJGV4cG9ydF9zeW1ib2xzIgotCSAgICAgIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIiAmJiB0bXBfZXhwb3J0X3N5bWJvbHM9IiRvcmlnX2V4cG9ydF9zeW1ib2xzIgotCSAgICAgICRvcHRfZHJ5X3J1biB8fCBldmFsICckRUNITyAiWCRpbmNsdWRlX2V4cHN5bXMiIHwgJFhzZWQgfCAkU1AyTkwgPj4gIiR0bXBfZXhwb3J0X3N5bWJvbHMiJwotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSAgICAgICMgVGhlIGdpdmVuIGV4cG9ydHNfc3ltYm9scyBmaWxlIGhhcyB0byBiZSBmaWx0ZXJlZCwgc28gZmlsdGVyIGl0LgotCSAgICAgIGZ1bmNfdmVyYm9zZSAiZmlsdGVyIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyB0byB0YWcgREFUQSBleHBvcnRzIgotCSAgICAgICMgRklYTUU6ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciBwb3RlbnRpYWxseSBjb250YWlucyBsb3RzIG9mCi0JICAgICAgIyAncycgY29tbWFuZHMgd2hpY2ggbm90IGFsbCBzZWRzIGNhbiBoYW5kbGUuIEdOVSBzZWQgc2hvdWxkIGJlIGZpbmUKLQkgICAgICAjIHRob3VnaC4gQWxzbywgdGhlIGZpbHRlciBzY2FsZXMgc3VwZXJsaW5lYXJseSB3aXRoIHRoZSBudW1iZXIgb2YKLQkgICAgICAjIGdsb2JhbCB2YXJpYWJsZXMuIGpvaW4oMSkgd291bGQgYmUgbmljZSBoZXJlLCBidXQgdW5mb3J0dW5hdGVseQotCSAgICAgICMgaXNuJ3QgYSBibGVzc2VkIHRvb2wuCi0JICAgICAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWUgJy9bICxdREFUQS8hZDtzLFwoLipcKVwoWyBcLF0uKlwpLHN8XlwxJHxcMVwyfCwnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyCi0JICAgICAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIgotCSAgICAgIGV4cG9ydF9zeW1ib2xzPSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZgotCSAgICAgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1mICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciA8ICRvcmlnX2V4cG9ydF9zeW1ib2xzID4gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGZpCi0JICBmaQotCi0JICBsaWJvYmpzPSRvdXRwdXQKLQkgICMgUmVzdG9yZSB0aGUgdmFsdWUgb2Ygb3V0cHV0LgotCSAgb3V0cHV0PSRzYXZlX291dHB1dAotCi0JICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiICYmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9Ci0JICBmaQotCSAgIyBFeHBhbmQgdGhlIGxpYnJhcnkgbGlua2luZyBjb21tYW5kcyBhZ2FpbiB0byByZXNldCB0aGUKLQkgICMgdmFsdWUgb2YgJGxpYm9ianMgZm9yIHBpZWNld2lzZSBsaW5raW5nLgotCi0JICAjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0JICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICAgICAgY21kcz0kbW9kdWxlX2V4cHN5bV9jbWRzCi0JICAgIGVsc2UKLQkgICAgICBjbWRzPSRtb2R1bGVfY21kcwotCSAgICBmaQotCSAgZWxzZQotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgICAgIGNtZHM9JGFyY2hpdmVfZXhwc3ltX2NtZHMKLQkgICAgZWxzZQotCSAgICAgIGNtZHM9JGFyY2hpdmVfY21kcwotCSAgICBmaQotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAtbiAiJGRlbGZpbGVzIjsgdGhlbgotCSAgIyBBcHBlbmQgdGhlIGNvbW1hbmQgdG8gcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcyB0byAkY21kcy4KLQkgIGV2YWwgY21kcz1cIlwkY21kc35cJFJNICRkZWxmaWxlc1wiCi0JZmkKLQotCSMgQWRkIGFueSBvYmplY3RzIGZyb20gcHJlbG9hZGVkIGNvbnZlbmllbmNlIGxpYnJhcmllcwotCWlmIHRlc3QgLW4gIiRkbHByZWZpbGVzIjsgdGhlbgotCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkZGxwcmVmaWxlcwotCSAgbGlib2Jqcz0iJGxpYm9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCi0JICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQotCWZpCi0KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQlmb3IgY21kIGluICRjbWRzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBldmFsIGNtZD1cIiRjbWRcIgotCSAgJG9wdF9zaWxlbnQgfHwgewotCSAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRjbWQiCi0JICAgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKLQkgIH0KLQkgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkY21kIiB8fCB7Ci0JICAgIGx0X2V4aXQ9JD8KLQotCSAgICAjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQkgICAgaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JICAgICAgKCBjZCAiJG91dHB1dF9vYmpkaXIiICYmIFwKLQkgICAgICAgICRSTSAiJHtyZWFsbmFtZX1UIiAmJiBcCi0JCSRNViAiJHtyZWFsbmFtZX1VIiAiJHJlYWxuYW1lIiApCi0JICAgIGZpCi0KLQkgICAgZXhpdCAkbHRfZXhpdAotCSAgfQotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQotCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAotCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkUk0gJHtyZWFsbmFtZX1UICYmICRNViAkcmVhbG5hbWUgJHtyZWFsbmFtZX1UICYmICRNViAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScgfHwgZXhpdCAkPwotCi0JICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGV4aXQgJEVYSVRfU1VDQ0VTUwotCWZpCi0KLQkjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgotCWZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbwotCSAgaWYgdGVzdCAiJHJlYWxuYW1lIiAhPSAiJGxpbmtuYW1lIjsgdGhlbgotCSAgICBmdW5jX3Nob3dfZXZhbCAnKGNkICIkb3V0cHV0X29iamRpciIgJiYgJFJNICIkbGlua25hbWUiICYmICRMTl9TICIkcmVhbG5hbWUiICIkbGlua25hbWUiKScgJ2V4aXQgJD8nCi0JICBmaQotCWRvbmUKLQotCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgotCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCi0JICBkbG5hbWU9IiRzb25hbWUiCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgb2JqKQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiAkZGVwbGlicyIgaW4KLSAgICAgICpcIC1sKiB8ICpcIC1MKikKLQlmdW5jX3dhcm5pbmcgIlxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgOzsKLSAgICAgIGVzYWMKLQotICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKLQotICAgICAgdGVzdCAtbiAiJHhycGF0aCIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtUicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKLQotICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCi0KLSAgICAgIHRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgotCi0gICAgICBjYXNlICRvdXRwdXQgaW4KLSAgICAgICoubG8pCi0JdGVzdCAtbiAiJG9ianMkb2xkX2RlcGxpYnMiICYmIFwKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIKLQotCWxpYm9iaj0kb3V0cHV0Ci0JZnVuY19sbzJvICIkbGlib2JqIgotCW9iaj0kZnVuY19sbzJvX3Jlc3VsdAotCTs7Ci0gICAgICAqKQotCWxpYm9iaj0KLQlvYmo9IiRvdXRwdXQiCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgotICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkb2JqICRsaWJvYmoKLQotICAgICAgIyBPYmplY3RzIGZyb20gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgVGhpcyBhc3N1bWVzCi0gICAgICAjIHNpbmdsZS12ZXJzaW9uIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFdoZW5ldmVyIHdlIGNyZWF0ZQotICAgICAgIyBkaWZmZXJlbnQgb25lcyBmb3IgUElDL25vbi1QSUMsIHRoaXMgd2UnbGwgaGF2ZSB0byBkdXBsaWNhdGUKLSAgICAgICMgdGhlIGV4dHJhY3Rpb24uCi0gICAgICByZWxvYWRfY29udl9vYmpzPQotICAgICAgZ2VudG9wPQotICAgICAgIyByZWxvYWRfY21kcyBydW5zICRMRCBkaXJlY3RseSwgc28gbGV0IHVzIGdldCByaWQgb2YKLSAgICAgICMgLVdsIGZyb20gd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgYW5kIGhvcGUgd2UgY2FuIGdldCBieSB3aXRoCi0gICAgICAjIHR1cm5pbmcgY29tbWEgaW50byBzcGFjZS4uCi0gICAgICB3bD0KLQotICAgICAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCWlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGV2YWwgdG1wX3dob2xlX2FyY2hpdmVfZmxhZ3M9XCIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCSAgcmVsb2FkX2NvbnZfb2Jqcz0kcmVsb2FkX29ianNcIGAkRUNITyAiWCR0bXBfd2hvbGVfYXJjaGl2ZV9mbGFncyIgfCAkWHNlZCAtZSAnc3wsfCB8ZydgCi0JZWxzZQotCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke29ian14IgotCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQotCSAgcmVsb2FkX2NvbnZfb2Jqcz0iJHJlbG9hZF9vYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLSAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyRvbGRfZGVwbGlicyAiYCRFQ0hPICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0kJy9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYCIgJHJlbG9hZF9jb252X29ianMiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCi0gICAgICBvdXRwdXQ9IiRvYmoiCi0gICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJHJlbG9hZF9jbWRzIiAnZXhpdCAkPycKLQotICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCi0gICAgICBpZiB0ZXN0IC16ICIkbGlib2JqIjsgdGhlbgotCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCi0JICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKLQlmaQotCi0JZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSAgZnVuY19zaG93X2V2YWwgJyR7Uk19ciAiJGdlbnRvcCInCi0JZmkKLQotCSMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0Ci0JIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KLQkjICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCi0JIyAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIiB8fCBleGl0ICQ/Ci0JZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciIHx8IHRlc3QgIiRwaWNfbW9kZSIgIT0gZGVmYXVsdDsgdGhlbgotCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCi0JcmVsb2FkX29ianM9IiRsaWJvYmpzICRyZWxvYWRfY29udl9vYmpzIgotCW91dHB1dD0iJGxpYm9iaiIKLQlmdW5jX2V4ZWN1dGVfY21kcyAiJHJlbG9hZF9jbWRzIiAnZXhpdCAkPycKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCi0JZnVuY19zaG93X2V2YWwgJyR7Uk19ciAiJGdlbnRvcCInCi0gICAgICBmaQotCi0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIDs7Ci0KLSAgICBwcm9nKQotICAgICAgY2FzZSAkaG9zdCBpbgotCSpjeWd3aW4qKSBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXQiCi0JICAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0LmV4ZTs7Ci0gICAgICBlc2FjCi0gICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKLQlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiCi0KLSAgICAgIHRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIKLQotICAgICAgdGVzdCAiJHByZWxvYWQiID0geWVzIFwKLSAgICAgICAgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHVua25vd24gXAotCSYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgPSB1bmtub3duIFwKLQkmJiB0ZXN0ICIkZGxvcGVuX3NlbGZfc3RhdGljIiA9IHVua25vd24gJiYgXAotCSAgZnVuY193YXJuaW5nICJcYExUX0lOSVQoW2Rsb3Blbl0pJyBub3QgdXNlZC4gQXNzdW1pbmcgbm8gZGxvcGVuIHN1cHBvcnQuIgotCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgaXMgdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQljb21waWxlX2RlcGxpYnM9YCRFQ0hPICJYICRjb21waWxlX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKLQlmaW5hbGl6ZV9kZXBsaWJzPWAkRUNITyAiWCAkZmluYWxpemVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICotKi1kYXJ3aW4qKQotCSMgRG9uJ3QgYWxsb3cgbGF6eSBsaW5raW5nLCBpdCBicmVha3MgQysrIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLQkjIEJ1dCBpcyBzdXBwb3NlZGx5IGZpeGVkIG9uIDEwLjQgb3IgbGF0ZXIgKHlheSEpLgotCWlmIHRlc3QgIiR0YWduYW1lIiA9IENYWCA7IHRoZW4KLQkgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQtMTAuMH0gaW4KLQkgICAgMTAuWzAxMjNdKQotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCi0JICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHt3bH0tYmluZF9hdF9sb2FkIgotCSAgICA7OwotCSAgZXNhYwotCWZpCi0JIyBUaW1lIHRvIGNoYW5nZSBhbGwgb3VyICJmb28ubHRmcmFtZXdvcmsiIHN0dWZmIGJhY2sgdG8gIi1mcmFtZXdvcmsgZm9vIgotCWNvbXBpbGVfZGVwbGlicz1gJEVDSE8gIlggJGNvbXBpbGVfZGVwbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKLQlmaW5hbGl6ZV9kZXBsaWJzPWAkRUNITyAiWCAkZmluYWxpemVfZGVwbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKLQk7OwotICAgICAgZXNhYwotCi0KLSAgICAgICMgbW92ZSBsaWJyYXJ5IHNlYXJjaCBwYXRocyB0aGF0IGNvaW5jaWRlIHdpdGggcGF0aHMgdG8gbm90IHlldAotICAgICAgIyBpbnN0YWxsZWQgbGlicmFyaWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIGxpc3QKLSAgICAgIG5ld19saWJzPQotICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KLQljYXNlICIgJG5ld19saWJzICIgaW4KLQkqIiAtTCRwYXRoLyRvYmpkaXIgIiopIDs7Ci0JKikKLQkgIGNhc2UgIiAkY29tcGlsZV9kZXBsaWJzICIgaW4KLQkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKLQkgICAgbmV3X2xpYnM9IiRuZXdfbGlicyAtTCRwYXRoLyRvYmpkaXIiIDs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIGZvciBkZXBsaWIgaW4gJGNvbXBpbGVfZGVwbGliczsgZG8KLQljYXNlICRkZXBsaWIgaW4KLQktTCopCi0JICBjYXNlICIgJG5ld19saWJzICIgaW4KLQkgICoiICRkZXBsaWIgIiopIDs7Ci0JICAqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7Ci0JICBlc2FjCi0JICA7OwotCSopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICBjb21waWxlX2RlcGxpYnM9IiRuZXdfbGlicyIKLQotCi0gICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGNvbXBpbGVfZGVwbGlicyIKLSAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRmaW5hbGl6ZV9kZXBsaWJzIgotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgkeHJwYXRoIjsgdGhlbgotCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KLQlmb3IgbGliZGlyIGluICRycGF0aCAkeHJwYXRoOyBkbwotCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgotCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZG9uZQotICAgICAgZmkKLQotICAgICAgIyBOb3cgaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKLSAgICAgIHJwYXRoPQotICAgICAgaGFyZGNvZGVfbGliZGlycz0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGNvbXBpbGVfcnBhdGggJGZpbmFsaXplX3JwYXRoOyBkbwotCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JICAgICAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KLQkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCTs7Ci0JICAgICAgKikKLQkJaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZWxzZQotCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCi0JICBmaQotCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLQljYXNlICRob3N0IGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKLQkgIHRlc3RiaW5kaXI9YCR7RUNIT30gIiRsaWJkaXIiIHwgJHtTRUR9IC1lICdzKi9saWIkKi9iaW4qJ2AKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JGxpYmRpcjoiKikgOzsKLQkgIDo6KSBkbGxzZWFyY2hwYXRoPSRsaWJkaXI7OwotCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGxpYmRpciI7OwotCSAgZXNhYwotCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCi0JICAqIjokdGVzdGJpbmRpcjoiKikgOzsKLQkgIDo6KSBkbGxzZWFyY2hwYXRoPSR0ZXN0YmluZGlyOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiR0ZXN0YmluZGlyIjs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0gICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLSAgICAgIGZpCi0gICAgICBjb21waWxlX3JwYXRoPSIkcnBhdGgiCi0KLSAgICAgIHJwYXRoPQotICAgICAgaGFyZGNvZGVfbGliZGlycz0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGZpbmFsaXplX3JwYXRoOyBkbwotCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JICAgICAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KLQkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCTs7Ci0JICAgICAgKikKLQkJaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZWxzZQotCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCi0JICBmaQotCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgY2FzZSAiJGZpbmFsaXplX3Blcm1fcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3Blcm1fcnBhdGg9IiRmaW5hbGl6ZV9wZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0gICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLSAgICAgIGZpCi0gICAgICBmaW5hbGl6ZV9ycGF0aD0iJHJwYXRoIgotCi0gICAgICBpZiB0ZXN0IC1uICIkbGlib2JqcyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSMgVHJhbnNmb3JtIGFsbCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gc3RhbmRhcmQgb2JqZWN0cy4KLQljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCWZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLSAgICAgIGZpCi0KLSAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkb3V0cHV0bmFtZSIgIkBQUk9HUkFNQCIgIm5vIgotCi0gICAgICAjIHRlbXBsYXRlIHByZWxpbmtpbmcgc3RlcAotICAgICAgaWYgdGVzdCAtbiAiJHByZWxpbmtfY21kcyI7IHRoZW4KLQlmdW5jX2V4ZWN1dGVfY21kcyAiJHByZWxpbmtfY21kcyIgJ2V4aXQgJD8nCi0gICAgICBmaQotCi0gICAgICB3cmFwcGVyc19yZXF1aXJlZD15ZXMKLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiApCi0gICAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotICAgICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICAqY2VnY2MpCi0gICAgICAgICMgRGlzYWJsZSB3cmFwcGVycyBmb3IgY2VnY2MsIHdlIGFyZSBjcm9zcyBjb21waWxpbmcgYW55d2F5LgotICAgICAgICB3cmFwcGVyc19yZXF1aXJlZD1ubwotICAgICAgICA7OwotICAgICAgKikKLSAgICAgICAgaWYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IG5vIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotICAgICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICBpZiB0ZXN0ICIkd3JhcHBlcnNfcmVxdWlyZWQiID0gbm87IHRoZW4KLQkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JY29tcGlsZV9jb21tYW5kPWAkRUNITyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCi0JbGlua19jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0KLQkjIFdlIGhhdmUgbm8gdW5pbnN0YWxsZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMsIHNvIGZpbmFsaXplIHJpZ2h0IG5vdy4KLQlleGl0X3N0YXR1cz0wCi0JZnVuY19zaG93X2V2YWwgIiRsaW5rX2NvbW1hbmQiICdleGl0X3N0YXR1cz0kPycKLQotCSMgRGVsZXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCi0JaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IjsgdGhlbgotCSAgZnVuY19zaG93X2V2YWwgJyRSTSAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IicKLQlmaQotCi0JZXhpdCAkZXhpdF9zdGF0dXMKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKLSAgICAgIGZpCi0KLSAgICAgIGNvbXBpbGVfdmFyPQotICAgICAgZmluYWxpemVfdmFyPQotICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCWlmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmFsaXplX3Blcm1fcnBhdGgiOyB0aGVuCi0JICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgcnBhdGg9Ci0JICBmb3IgZGlyIGluICRmaW5hbGl6ZV9wZXJtX3JwYXRoOyBkbwotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICBkb25lCi0JICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbm9faW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkjIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzY3JpcHQuCi0JbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotCSMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGUuCi0JJG9wdF9kcnlfcnVuIHx8ICRSTSAkb3V0cHV0Ci0JIyBMaW5rIHRoZSBleGVjdXRhYmxlIGFuZCBleGl0Ci0JZnVuY19zaG93X2V2YWwgIiRsaW5rX2NvbW1hbmQiICdleGl0ICQ/JwotCWV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLQkjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQlyZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCi0JZnVuY193YXJuaW5nICJ0aGlzIHBsYXRmb3JtIGRvZXMgbm90IGxpa2UgdW5pbnN0YWxsZWQgc2hhcmVkIGxpYnJhcmllcyIKLQlmdW5jX3dhcm5pbmcgIlxgJG91dHB1dCcgd2lsbCBiZSByZWxpbmtlZCBkdXJpbmcgaW5zdGFsbGF0aW9uIgotICAgICAgZWxzZQotCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiICE9IG5vOyB0aGVuCi0JICBsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkY29tcGlsZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJVwkcHJvZ2Rpci9cJGZpbGUlZydgCi0JICBlbHNlCi0JICAgICMgZmFzdF9pbnN0YWxsIGlzIHNldCB0byBuZWVkbGVzcwotCSAgICByZWxpbmtfY29tbWFuZD0KLQkgIGZpCi0JZWxzZQotCSAgbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JICByZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0gICAgICBsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJGxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZydgCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGVzLgotICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkb3V0cHV0ICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyL2x0LSRvdXRwdXRuYW1lCi0KLSAgICAgIGZ1bmNfc2hvd19ldmFsICIkbGlua19jb21tYW5kIiAnZXhpdCAkPycKLQotICAgICAgIyBOb3cgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdC4KLSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJG91dHB1dCIKLQotICAgICAgIyBRdW90ZSB0aGUgcmVsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgotICAgICAgaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKLQlmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KLQkgIGlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCAkbHRfdW5zZXQgJHZhciB8fCB7ICR2YXI9OyBleHBvcnQgJHZhcjsgfTsgfTsgJHJlbGlua19jb21tYW5kIgotCSAgZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQkgIGVsc2UKLQkgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHZhcl92YWx1ZSIKLQkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCSAgZmkKLQlkb25lCi0JcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJHJlbGlua19jb21tYW5kKSIKLQlyZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBRdW90ZSAkRUNITyBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0ICJYJEVDSE8iID0gIlgkU0hFTEwgJHByb2dwYXRoIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLQljYXNlICRwcm9ncGF0aCBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcWVjaG89IiRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjs7Ci0JKikgcWVjaG89IiRTSEVMTCBgcHdkYC8kcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjs7Ci0JZXNhYwotCXFlY2hvPWAkRUNITyAiWCRxZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBlbHNlCi0JcWVjaG89YCRFQ0hPICJYJEVDSE8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBub3QgaW4gZHJ5IHJ1biBtb2RlLgotICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQkjIHdpbjMyIHdpbGwgdGhpbmsgdGhlIHNjcmlwdCBpcyBhIGJpbmFyeSBpZiBpdCBoYXMKLQkjIGEgLmV4ZSBzdWZmaXgsIHNvIHdlIHN0cmlwIGl0IG9mZiBoZXJlLgotCWNhc2UgJG91dHB1dCBpbgotCSAgKi5leGUpIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG91dHB1dCIKLQkgICAgICAgICBvdXRwdXQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OwotCWVzYWMKLQkjIHRlc3QgZm9yIGN5Z3dpbiBiZWNhdXNlIG12IGZhaWxzIHcvbyAuZXhlIGV4dGVuc2lvbnMKLQljYXNlICRob3N0IGluCi0JICAqY3lnd2luKikKLQkgICAgZXhlZXh0PS5leGUKLQkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0bmFtZSIKLQkgICAgb3V0cHV0bmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7Ci0JICAqKSBleGVleHQ9IDs7Ci0JZXNhYwotCWNhc2UgJGhvc3QgaW4KLQkgICpjeWd3aW4qIHwgKm1pbmd3KiApCi0JICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRvdXRwdXQiICIiICIuIgotCSAgICBvdXRwdXRfbmFtZT0kZnVuY19iYXNlbmFtZV9yZXN1bHQKLQkgICAgb3V0cHV0X3BhdGg9JGZ1bmNfZGlybmFtZV9yZXN1bHQKLQkgICAgY3dyYXBwZXJzb3VyY2U9IiRvdXRwdXRfcGF0aC8kb2JqZGlyL2x0LSRvdXRwdXRfbmFtZS5jIgotCSAgICBjd3JhcHBlcj0iJG91dHB1dF9wYXRoLyRvdXRwdXRfbmFtZS5leGUiCi0JICAgICRSTSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyCi0JICAgIHRyYXAgIiRSTSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyOyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQotCi0JICAgIGZ1bmNfZW1pdF9jd3JhcHBlcmV4ZV9zcmMgPiAkY3dyYXBwZXJzb3VyY2UKLQotCSAgICAjIFRoZSB3cmFwcGVyIGV4ZWN1dGFibGUgaXMgYnVpbHQgdXNpbmcgdGhlICRob3N0IGNvbXBpbGVyLAotCSAgICAjIGJlY2F1c2UgaXQgY29udGFpbnMgJGhvc3QgcGF0aHMgYW5kIGZpbGVzLiBJZiBjcm9zcy0KLQkgICAgIyBjb21waWxpbmcsIGl0LCBsaWtlIHRoZSB0YXJnZXQgZXhlY3V0YWJsZSwgbXVzdCBiZQotCSAgICAjIGV4ZWN1dGVkIG9uIHRoZSAkaG9zdCBvciB1bmRlciBhbiBlbXVsYXRpb24gZW52aXJvbm1lbnQuCi0JICAgICRvcHRfZHJ5X3J1biB8fCB7Ci0JICAgICAgJExUQ0MgJExUQ0ZMQUdTIC1vICRjd3JhcHBlciAkY3dyYXBwZXJzb3VyY2UKLQkgICAgICAkU1RSSVAgJGN3cmFwcGVyCi0JICAgIH0KLQotCSAgICAjIE5vdywgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdCBmb3IgZnVuY19zb3VyY2UgdXNlOgotCSAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICRjd3JhcHBlcgotCSAgICAkUk0gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0Ci0JICAgIHRyYXAgIiRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQ7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1Ci0JICAgICRvcHRfZHJ5X3J1biB8fCB7Ci0JICAgICAgIyBub3RlOiB0aGlzIHNjcmlwdCB3aWxsIG5vdCBiZSBleGVjdXRlZCwgc28gZG8gbm90IGNobW9kLgotCSAgICAgIGlmIHRlc3QgIngkYnVpbGQiID0gIngkaG9zdCIgOyB0aGVuCi0JCSRjd3JhcHBlciAtLWx0LWR1bXAtc2NyaXB0ID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0Ci0JICAgICAgZWxzZQotCQlmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAotCSAgICAgIGZpCi0JICAgIH0KLQkgIDs7Ci0JICAqICkKLQkgICAgJFJNICRvdXRwdXQKLQkgICAgdHJhcCAiJFJNICRvdXRwdXQ7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1Ci0KLQkgICAgZnVuY19lbWl0X3dyYXBwZXIgbm8gPiAkb3V0cHV0Ci0JICAgIGNobW9kICt4ICRvdXRwdXQKLQkgIDs7Ci0JZXNhYwotICAgICAgfQotICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gb2xkLWZhc2hpb25lZCBhcmNoaXZlLgotICAgIGZvciBvbGRsaWIgaW4gJG9sZGxpYnM7IGRvCi0KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gY29udmVuaWVuY2U7IHRoZW4KLQlvbGRvYmpzPSIkbGlib2Jqc19zYXZlICRzeW1maWxlb2JqIgotCWFkZGxpYnM9IiRjb252ZW5pZW5jZSIKLQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG1vZHVsZTsgdGhlbgotCSAgb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKLQkgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWVsc2UKLQkgIG9sZG9ianM9IiRvbGRfZGVwbGlicyAkbm9uX3BpY19vYmplY3RzIgotCSAgaWYgdGVzdCAiJHByZWxvYWQiID0geWVzICYmIHRlc3QgLWYgIiRzeW1maWxlb2JqIjsgdGhlbgotCSAgICBvbGRvYmpzPSIkb2xkb2JqcyAkc3ltZmlsZW9iaiIKLQkgIGZpCi0JZmkKLQlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGFkZGxpYnMiOyB0aGVuCi0JZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQlnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCWZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRhZGRsaWJzCi0Jb2xkb2Jqcz0iJG9sZG9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCi0gICAgICBmaQotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWNtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKLSAgICAgIGVsc2UKLQotCSMgQWRkIGFueSBvYmplY3RzIGZyb20gcHJlbG9hZGVkIGNvbnZlbmllbmNlIGxpYnJhcmllcwotCWlmIHRlc3QgLW4gIiRkbHByZWZpbGVzIjsgdGhlbgotCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkZGxwcmVmaWxlcwotCSAgb2xkb2Jqcz0iJG9sZG9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCi0JZmkKLQotCSMgUE9TSVggZGVtYW5kcyBubyBwYXRocyB0byBiZSBlbmNvZGVkIGluIGFyY2hpdmVzLiAgV2UgaGF2ZQotCSMgdG8gYXZvaWQgY3JlYXRpbmcgYXJjaGl2ZXMgd2l0aCBkdXBsaWNhdGUgYmFzZW5hbWVzIGlmIHdlCi0JIyBtaWdodCBoYXZlIHRvIGV4dHJhY3QgdGhlbSBhZnRlcndhcmRzLCBlLmcuLCB3aGVuIGNyZWF0aW5nIGEKLQkjIHN0YXRpYyBhcmNoaXZlIG91dCBvZiBhIGNvbnZlbmllbmNlIGxpYnJhcnksIG9yIHdoZW4gbGlua2luZwotCSMgdGhlIGVudGlyZXR5IG9mIGEgbGlidG9vbCBhcmNoaXZlIGludG8gYW5vdGhlciAoY3VycmVudGx5Ci0JIyBub3Qgc3VwcG9ydGVkIGJ5IGxpYnRvb2wpLgotCWlmIChmb3Igb2JqIGluICRvbGRvYmpzCi0JICAgIGRvCi0JICAgICAgZnVuY19iYXNlbmFtZSAiJG9iaiIKLQkgICAgICAkRUNITyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCSAgICBkb25lIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KLQkgIDoKLQllbHNlCi0JICAkRUNITyAiY29weWluZyBzZWxlY3RlZCBvYmplY3QgZmlsZXMgdG8gYXZvaWQgYmFzZW5hbWUgY29uZmxpY3RzLi4uIgotCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCSAgZnVuY19ta2Rpcl9wICIkZ2VudG9wIgotCSAgc2F2ZV9vbGRvYmpzPSRvbGRvYmpzCi0JICBvbGRvYmpzPQotCSAgY291bnRlcj0xCi0JICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKLQkgIGRvCi0JICAgIGZ1bmNfYmFzZW5hbWUgIiRvYmoiCi0JICAgIG9iamJhc2U9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkgICAgY2FzZSAiICRvbGRvYmpzICIgaW4KLQkgICAgIiAiKSBvbGRvYmpzPSRvYmogOzsKLQkgICAgKltcIC9dIiRvYmpiYXNlICIqKQotCSAgICAgIHdoaWxlIDo7IGRvCi0JCSMgTWFrZSBzdXJlIHdlIGRvbid0IHBpY2sgYW4gYWx0ZXJuYXRlIG5hbWUgdGhhdCBhbHNvCi0JCSMgb3ZlcmxhcHMuCi0JCW5ld29iaj1sdCRjb3VudGVyLSRvYmpiYXNlCi0JCWZ1bmNfYXJpdGggJGNvdW50ZXIgKyAxCi0JCWNvdW50ZXI9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JCWNhc2UgIiAkb2xkb2JqcyAiIGluCi0JCSpbXCAvXSIkbmV3b2JqICIqKSA7OwotCQkqKSBpZiB0ZXN0ICEgLWYgIiRnZW50b3AvJG5ld29iaiI7IHRoZW4gYnJlYWs7IGZpIDs7Ci0JCWVzYWMKLQkgICAgICBkb25lCi0JICAgICAgZnVuY19zaG93X2V2YWwgImxuICRvYmogJGdlbnRvcC8kbmV3b2JqIHx8IGNwICRvYmogJGdlbnRvcC8kbmV3b2JqIgotCSAgICAgIG9sZG9ianM9IiRvbGRvYmpzICRnZW50b3AvJG5ld29iaiIKLQkgICAgICA7OwotCSAgICAqKSBvbGRvYmpzPSIkb2xkb2JqcyAkb2JqIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCi0KLQlmdW5jX2xlbiAiICRjbWRzIgotCWxlbj0kZnVuY19sZW5fcmVzdWx0Ci0JaWYgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCi0JICBjbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCi0JZWxzZQotCSAgIyB0aGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGxpbmsgaW4gb25lIHN0ZXAsIGxpbmsgaW4gcGFydHMKLQkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgcGllY2V3aXNlIGFyY2hpdmUgbGlua2luZy4uLiIKLQkgIHNhdmVfUkFOTElCPSRSQU5MSUIKLQkgIFJBTkxJQj06Ci0JICBvYmpsaXN0PQotCSAgY29uY2F0X2NtZHM9Ci0JICBzYXZlX29sZG9ianM9JG9sZG9ianMKLQkgIG9sZG9ianM9Ci0JICAjIElzIHRoZXJlIGEgYmV0dGVyIHdheSBvZiBmaW5kaW5nIHRoZSBsYXN0IG9iamVjdCBpbiB0aGUgbGlzdD8KLQkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcwotCSAgZG8KLQkgICAgbGFzdF9vbGRvYmo9JG9iagotCSAgZG9uZQotCSAgZXZhbCB0ZXN0X2NtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCi0JICBmdW5jX2xlbiAiICR0ZXN0X2NtZHMiCi0JICBsZW4wPSRmdW5jX2xlbl9yZXN1bHQKLQkgIGxlbj0kbGVuMAotCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCi0JICBkbwotCSAgICBmdW5jX2xlbiAiICRvYmoiCi0JICAgIGZ1bmNfYXJpdGggJGxlbiArICRmdW5jX2xlbl9yZXN1bHQKLQkgICAgbGVuPSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgICBmdW5jX2FwcGVuZCBvYmpsaXN0ICIgJG9iaiIKLQkgICAgaWYgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iOyB0aGVuCi0JICAgICAgOgotCSAgICBlbHNlCi0JICAgICAgIyB0aGUgYWJvdmUgY29tbWFuZCBzaG91bGQgYmUgdXNlZCBiZWZvcmUgaXQgZ2V0cyB0b28gbG9uZwotCSAgICAgIG9sZG9ianM9JG9iamxpc3QKLQkgICAgICBpZiB0ZXN0ICIkb2JqIiA9ICIkbGFzdF9vbGRvYmoiIDsgdGhlbgotCQlSQU5MSUI9JHNhdmVfUkFOTElCCi0JICAgICAgZmkKLQkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KLQkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JG9sZF9hcmNoaXZlX2NtZHNcIgotCSAgICAgIG9iamxpc3Q9Ci0JICAgICAgbGVuPSRsZW4wCi0JICAgIGZpCi0JICBkb25lCi0JICBSQU5MSUI9JHNhdmVfUkFOTElCCi0JICBvbGRvYmpzPSRvYmpsaXN0Ci0JICBpZiB0ZXN0ICJYJG9sZG9ianMiID0gIlgiIDsgdGhlbgotCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzXCIKLQkgIGVsc2UKLQkgICAgZXZhbCBjbWRzPVwiXCRjb25jYXRfY21kc35cJG9sZF9hcmNoaXZlX2NtZHNcIgotCSAgZmkKLQlmaQotICAgICAgZmkKLSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkY21kcyIgJ2V4aXQgJD8nCi0gICAgZG9uZQotCi0gICAgdGVzdCAtbiAiJGdlbmVyYXRlZCIgJiYgXAotICAgICAgZnVuY19zaG93X2V2YWwgIiR7Uk19ciRnZW5lcmF0ZWQiCi0KLSAgICAjIE5vdyBjcmVhdGUgdGhlIGxpYnRvb2wgYXJjaGl2ZS4KLSAgICBjYXNlICRvdXRwdXQgaW4KLSAgICAqLmxhKQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS4kbGliZXh0IgotICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICAjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCi0gICAgICBmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KLQlpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgotCSAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8ICRsdF91bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCi0JZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCi0JICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JZWxzZQotCSAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHZhcl92YWx1ZSIKLQkgIHJlbGlua19jb21tYW5kPSIkdmFyPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdDsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBRdW90ZSB0aGUgbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KLSAgICAgIHJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1tb2RlPXJlbGluayAkbGlidG9vbF9hcmdzIEBpbnN0X3ByZWZpeF9kaXJAKSIKLSAgICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYXV0b21hdGljIiA9IHllcyA7IHRoZW4KLQlyZWxpbmtfY29tbWFuZD0KLSAgICAgIGZpCi0KLSAgICAgICMgT25seSBjcmVhdGUgdGhlIG91dHB1dCBpZiBub3QgYSBkcnkgcnVuLgotICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQlmb3IgaW5zdGFsbGVkIGluIG5vIHllczsgZG8KLQkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX2xpYmRpciI7IHRoZW4KLQkgICAgICBicmVhawotCSAgICBmaQotCSAgICBvdXRwdXQ9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkKLQkgICAgIyBSZXBsYWNlIGFsbCB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcyB3aXRoIHRoZSBpbnN0YWxsZWQgb25lcwotCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9Ci0JICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgICAqLmxhKQotCQlmdW5jX2Jhc2VuYW1lICIkZGVwbGliIgotCQluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0JCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCi0JCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKLQkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKLQkJbmV3ZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzICRsaWJkaXIvJG5hbWUiCi0JCTs7Ci0JICAgICAgKikgbmV3ZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgbmV3ZGxmaWxlcz0KLQotCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbwotCSAgICAgIGNhc2UgJGxpYiBpbgotCSAgICAgICoubGEpCi0JICAgICAgICBmdW5jX2Jhc2VuYW1lICIkbGliIgotCQluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0JCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCi0JCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKLQkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKLQkJbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGxpYmRpci8kbmFtZSIKLQkJOzsKLQkgICAgICAqKSBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKLQkgICAgbmV3ZGxwcmVmaWxlcz0KLQkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICAgICBjYXNlICRsaWIgaW4KLQkgICAgICAqLmxhKQotCQkjIE9ubHkgcGFzcyBwcmVvcGVuZWQgZmlsZXMgdG8gdGhlIHBzZXVkby1hcmNoaXZlIChmb3IKLQkJIyBldmVudHVhbCBsaW5raW5nIHdpdGggdGhlIGFwcC4gdGhhdCBsaW5rcyBpdCkgaWYgd2UKLQkJIyBkaWRuJ3QgYWxyZWFkeSBsaW5rIHRoZSBwcmVvcGVuZWQgb2JqZWN0cyBkaXJlY3RseSBpbnRvCi0JCSMgdGhlIGxpYnJhcnk6Ci0JCWZ1bmNfYmFzZW5hbWUgIiRsaWIiCi0JCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKLQkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAotCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgotCQluZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkbGliZGlyLyRuYW1lIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKLQkgIGVsc2UKLQkgICAgbmV3ZGxmaWxlcz0KLQkgICAgZm9yIGxpYiBpbiAkZGxmaWxlczsgZG8KLQkgICAgICBjYXNlICRsaWIgaW4KLQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7Ci0JCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGFicyIKLQkgICAgZG9uZQotCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKLQkgICAgbmV3ZGxwcmVmaWxlcz0KLQkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICAgICBjYXNlICRsaWIgaW4KLQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7Ci0JCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGFicyIKLQkgICAgZG9uZQotCSAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKLQkgIGZpCi0JICAkUk0gJG91dHB1dAotCSAgIyBwbGFjZSBkbG5hbWUgaW4gY29ycmVjdCBwb3NpdGlvbiBmb3IgY3lnd2luCi0JICB0ZGxuYW1lPSRkbG5hbWUKLQkgIGNhc2UgJGhvc3QsJG91dHB1dCwkaW5zdGFsbGVkLCRtb2R1bGUsJGRsbmFtZSBpbgotCSAgICAqY3lnd2luKiwqbGFpLHllcyxubywqLmRsbCB8ICptaW5ndyosKmxhaSx5ZXMsbm8sKi5kbGwgfCAqY2VnY2MqLCpsYWkseWVzLG5vLCouZGxsKSB0ZGxuYW1lPS4uL2Jpbi8kZGxuYW1lIDs7Ci0JICBlc2FjCi0JICAkRUNITyA+ICRvdXRwdXQgIlwKLSMgJG91dHB1dG5hbWUgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KLSMKLSMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQotIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCi0KLSMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgotZGxuYW1lPSckdGRsbmFtZScKLQotIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCi1saWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKLQotIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCi1vbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JwotCi0jIExpbmtlciBmbGFncyB0aGF0IGNhbiBub3QgZ28gaW4gZGVwZW5kZW5jeV9saWJzLgotaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0nJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzJwotCi0jIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KLWRlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKLQotIyBOYW1lcyBvZiBhZGRpdGlvbmFsIHdlYWsgbGlicmFyaWVzIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeQotd2Vha19saWJyYXJ5X25hbWVzPSckd2Vha19saWJzJwotCi0jIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgotY3VycmVudD0kY3VycmVudAotYWdlPSRhZ2UKLXJldmlzaW9uPSRyZXZpc2lvbgotCi0jIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KLWluc3RhbGxlZD0kaW5zdGFsbGVkCi0KLSMgU2hvdWxkIHdlIHdhcm4gYWJvdXQgcG9ydGFiaWxpdHkgd2hlbiBsaW5raW5nIGFnYWluc3QgLW1vZHVsZXM/Ci1zaG91bGRub3RsaW5rPSRtb2R1bGUKLQotIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCi1kbG9wZW49JyRkbGZpbGVzJwotZGxwcmVvcGVuPSckZGxwcmVmaWxlcycKLQotIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgotbGliZGlyPSckaW5zdGFsbF9saWJkaXInIgotCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubyAmJiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0geWVzOyB0aGVuCi0JICAgICRFQ0hPID4+ICRvdXRwdXQgIlwKLXJlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIiCi0JICBmaQotCWRvbmUKLSAgICAgIH0KLQotICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgotICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KLSAgICAgIGZ1bmNfc2hvd19ldmFsICcoIGNkICIkb3V0cHV0X29iamRpciIgJiYgJFJNICIkb3V0cHV0bmFtZSIgJiYgJExOX1MgIi4uLyRvdXRwdXRuYW1lIiAiJG91dHB1dG5hbWUiICknICdleGl0ICQ/JwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgZXhpdCAkRVhJVF9TVUNDRVNTCi19Ci0KLXsgdGVzdCAiJG1vZGUiID0gbGluayB8fCB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IH0gJiYKLSAgICBmdW5jX21vZGVfbGluayAkezErIiRAIn0KLQotCi0jIGZ1bmNfbW9kZV91bmluc3RhbGwgYXJnLi4uCi1mdW5jX21vZGVfdW5pbnN0YWxsICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgIFJNPSIkbm9ub3B0IgotICAgIGZpbGVzPQotICAgIHJtZm9yY2U9Ci0gICAgZXhpdF9zdGF0dXM9MAotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCi0gICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCi0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWYpIFJNPSIkUk0gJGFyZyI7IHJtZm9yY2U9eWVzIDs7Ci0gICAgICAtKikgUk09IiRSTSAkYXJnIiA7OwotICAgICAgKikgZmlsZXM9IiRmaWxlcyAkYXJnIiA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIHRlc3QgLXogIiRSTSIgJiYgXAotICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iCi0KLSAgICBybWRpcnM9Ci0KLSAgICBvcmlnb2JqZGlyPSIkb2JqZGlyIgotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLSAgICAgIGZ1bmNfZGlybmFtZSAiJGZpbGUiICIiICIuIgotICAgICAgZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLSAgICAgIGlmIHRlc3QgIlgkZGlyIiA9IFguOyB0aGVuCi0Jb2JqZGlyPSIkb3JpZ29iamRpciIKLSAgICAgIGVsc2UKLQlvYmpkaXI9IiRkaXIvJG9yaWdvYmpkaXIiCi0gICAgICBmaQotICAgICAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCi0gICAgICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0gICAgICB0ZXN0ICIkbW9kZSIgPSB1bmluc3RhbGwgJiYgb2JqZGlyPSIkZGlyIgotCi0gICAgICAjIFJlbWVtYmVyIG9iamRpciBmb3IgcmVtb3ZhbCBsYXRlciwgYmVpbmcgY2FyZWZ1bCB0byBhdm9pZCBkdXBsaWNhdGVzCi0gICAgICBpZiB0ZXN0ICIkbW9kZSIgPSBjbGVhbjsgdGhlbgotCWNhc2UgIiAkcm1kaXJzICIgaW4KLQkgICoiICRvYmpkaXIgIiopIDs7Ci0JICAqKSBybWRpcnM9IiRybWRpcnMgJG9iamRpciIgOzsKLQllc2FjCi0gICAgICBmaQotCi0gICAgICAjIERvbid0IGVycm9yIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QgYW5kIHJtIC1mIHdhcyB1c2VkLgotICAgICAgaWYgeyB0ZXN0IC1MICIkZmlsZSI7IH0gPi9kZXYvbnVsbCAyPiYxIHx8Ci0JIHsgdGVzdCAtaCAiJGZpbGUiOyB9ID4vZGV2L251bGwgMj4mMSB8fAotCSB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KLQk6Ci0gICAgICBlbGlmIHRlc3QgLWQgIiRmaWxlIjsgdGhlbgotCWV4aXRfc3RhdHVzPTEKLQljb250aW51ZQotICAgICAgZWxpZiB0ZXN0ICIkcm1mb3JjZSIgPSB5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZmkKLQotICAgICAgcm1maWxlcz0iJGZpbGUiCi0KLSAgICAgIGNhc2UgJG5hbWUgaW4KLSAgICAgICoubGEpCi0JIyBQb3NzaWJseSBhIGxpYnRvb2wgYXJjaGl2ZSwgc28gdmVyaWZ5IGl0LgotCWlmIGZ1bmNfbGFsaWJfcCAiJGZpbGUiOyB0aGVuCi0JICBmdW5jX3NvdXJjZSAkZGlyLyRuYW1lCi0KLQkgICMgRGVsZXRlIHRoZSBsaWJ0b29sIGxpYnJhcmllcyBhbmQgc3ltbGlua3MuCi0JICBmb3IgbiBpbiAkbGlicmFyeV9uYW1lczsgZG8KLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbiIKLQkgIGRvbmUKLQkgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kb2xkX2xpYnJhcnkiCi0KLQkgIGNhc2UgIiRtb2RlIiBpbgotCSAgY2xlYW4pCi0JICAgIGNhc2UgIiAgJGxpYnJhcnlfbmFtZXMgIiBpbgotCSAgICAjICIgICIgaW4gdGhlIGJlZ2lubmluZyBjYXRjaGVzIGVtcHR5ICRkbG5hbWUKLQkgICAgKiIgJGRsbmFtZSAiKikgOzsKLQkgICAgKikgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kZGxuYW1lIiA7OwotCSAgICBlc2FjCi0JICAgIHRlc3QgLW4gIiRsaWJkaXIiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9aSIKLQkgICAgOzsKLQkgIHVuaW5zdGFsbCkKLQkgICAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCi0JICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0dW5pbnN0YWxsX2NtZHMiICd0ZXN0ICIkcm1mb3JjZSIgPSB5ZXMgfHwgZXhpdF9zdGF0dXM9MScKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIG9sZF9wb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkb2xkX3Bvc3R1bmluc3RhbGxfY21kcyIgJ3Rlc3QgIiRybWZvcmNlIiA9IHllcyB8fCBleGl0X3N0YXR1cz0xJwotCSAgICBmaQotCSAgICAjIEZJWE1FOiBzaG91bGQgcmVpbnN0YWxsIHRoZSBiZXN0IHJlbWFpbmluZyBzaGFyZWQgbGlicmFyeS4KLQkgICAgOzsKLQkgIGVzYWMKLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBQb3NzaWJseSBhIGxpYnRvb2wgb2JqZWN0LCBzbyB2ZXJpZnkgaXQuCi0JaWYgZnVuY19sYWxpYl9wICIkZmlsZSI7IHRoZW4KLQotCSAgIyBSZWFkIHRoZSAubG8gZmlsZQotCSAgZnVuY19zb3VyY2UgJGRpci8kbmFtZQotCi0JICAjIEFkZCBQSUMgb2JqZWN0IHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZS4KLQkgIGlmIHRlc3QgLW4gIiRwaWNfb2JqZWN0IiAmJgotCSAgICAgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kcGljX29iamVjdCIKLQkgIGZpCi0KLQkgICMgQWRkIG5vbi1QSUMgb2JqZWN0IHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZS4KLQkgIGlmIHRlc3QgLW4gIiRub25fcGljX29iamVjdCIgJiYKLQkgICAgIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRub25fcGljX29iamVjdCIKLQkgIGZpCi0JZmkKLQk7OwotCi0gICAgICAqKQotCWlmIHRlc3QgIiRtb2RlIiA9IGNsZWFuIDsgdGhlbgotCSAgbm9leGVuYW1lPSRuYW1lCi0JICBjYXNlICRmaWxlIGluCi0JICAqLmV4ZSkKLQkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZmlsZSIKLQkgICAgZmlsZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG5hbWUiCi0JICAgIG5vZXhlbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JICAgICMgJGZpbGUgd2l0aCAuZXhlIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gcm1maWxlcywKLQkgICAgIyBhZGQgJGZpbGUgd2l0aG91dCAuZXhlCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRmaWxlIgotCSAgICA7OwotCSAgZXNhYwotCSAgIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgYSBsaWJ0b29sIHByb2dyYW0uCi0JICBpZiBmdW5jX2x0d3JhcHBlcl9wICIkZmlsZSI7IHRoZW4KLQkgICAgaWYgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkZmlsZSI7IHRoZW4KLQkgICAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKLQkgICAgICByZWxpbmtfY29tbWFuZD0KLQkgICAgICBmdW5jX3NvdXJjZSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKLQkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQiCi0JICAgIGVsc2UKLQkgICAgICByZWxpbmtfY29tbWFuZD0KLQkgICAgICBmdW5jX3NvdXJjZSAkZGlyLyRub2V4ZW5hbWUKLQkgICAgZmkKLQotCSAgICAjIG5vdGUgJG5hbWUgc3RpbGwgY29udGFpbnMgLmV4ZSBpZiBpdCB3YXMgaW4gJGZpbGUgb3JpZ2luYWxseQotCSAgICAjIGFzIGRvZXMgdGhlIHZlcnNpb24gb2YgJGZpbGUgdGhhdCB3YXMgYWRkZWQgaW50byAkcm1maWxlcwotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuYW1lICRvYmpkaXIvJHtuYW1lfVMuJHtvYmpleHR9IgotCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllcyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0kbmFtZSIKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiWCRub2V4ZW5hbWUiICE9ICJYJG5hbWUiIDsgdGhlbgotCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvbHQtJHtub2V4ZW5hbWV9LmMiCi0JICAgIGZpCi0JICBmaQotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGZ1bmNfc2hvd19ldmFsICIkUk0gJHJtZmlsZXMiICdleGl0X3N0YXR1cz0xJwotICAgIGRvbmUKLSAgICBvYmpkaXI9IiRvcmlnb2JqZGlyIgotCi0gICAgIyBUcnkgdG8gcmVtb3ZlIHRoZSAke29iamRpcn1zIGluIHRoZSBkaXJlY3RvcmllcyB3aGVyZSB3ZSBkZWxldGVkIGZpbGVzCi0gICAgZm9yIGRpciBpbiAkcm1kaXJzOyBkbwotICAgICAgaWYgdGVzdCAtZCAiJGRpciI7IHRoZW4KLQlmdW5jX3Nob3dfZXZhbCAicm1kaXIgJGRpciA+L2Rldi9udWxsIDI+JjEiCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi19Ci0KLXsgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsIHx8IHRlc3QgIiRtb2RlIiA9IGNsZWFuOyB9ICYmCi0gICAgZnVuY19tb2RlX3VuaW5zdGFsbCAkezErIiRAIn0KLQotdGVzdCAteiAiJG1vZGUiICYmIHsKLSAgaGVscD0iJGdlbmVyaWNfaGVscCIKLSAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERSIKLX0KLQotdGVzdCAteiAiJGV4ZWNfY21kIiAmJiBcCi0gIGZ1bmNfZmF0YWxfaGVscCAiaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIKLQotaWYgdGVzdCAtbiAiJGV4ZWNfY21kIjsgdGhlbgotICBldmFsIGV4ZWMgIiRleGVjX2NtZCIKLSAgZXhpdCAkRVhJVF9GQUlMVVJFCi1maQotCi1leGl0ICRleGl0X3N0YXR1cwotCi0KLSMgVGhlIFRBR3MgYmVsb3cgYXJlIGRlZmluZWQgc3VjaCB0aGF0IHdlIG5ldmVyIGdldCBpbnRvIGEgc2l0dWF0aW9uCi0jIGluIHdoaWNoIHdlIGRpc2FibGUgYm90aCBraW5kcyBvZiBsaWJyYXJpZXMuICBHaXZlbiBjb25mbGljdGluZwotIyBjaG9pY2VzLCB3ZSBnbyBmb3IgYSBzdGF0aWMgbGlicmFyeSwgdGhhdCBpcyB0aGUgbW9zdCBwb3J0YWJsZSwKLSMgc2luY2Ugd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2VyZSBkaXNhYmxlZCBiZWNhdXNlCi0jIHRoZSB1c2VyIGFza2VkIGZvciB0aGF0IG9yIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydAotIyB0aGVtLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIEFJWCwgYmVjYXVzZSB3ZSBkb24ndAotIyBzdXBwb3J0IGhhdmluZyBib3RoIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBlbmFibGVkIGF0IHRoZSBzYW1lCi0jIHRpbWUgb24gdGhhdCBwbGF0Zm9ybSwgc28gd2UgZGVmYXVsdCB0byBhIHNoYXJlZC1vbmx5IGNvbmZpZ3VyYXRpb24uCi0jIElmIGEgZGlzYWJsZS1zaGFyZWQgdGFnIGlzIGdpdmVuLCB3ZSdsbCBmYWxsYmFjayB0byBhIHN0YXRpYy1vbmx5Ci0jIGNvbmZpZ3VyYXRpb24uICBCdXQgd2UnbGwgbmV2ZXIgZ28gZnJvbSBzdGF0aWMtb25seSB0byBzaGFyZWQtb25seS4KLQotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAotYnVpbGRfbGlidG9vbF9saWJzPW5vCi1idWlsZF9vbGRfbGlicz15ZXMKLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCi0KLSMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKLWJ1aWxkX29sZF9saWJzPWBjYXNlICRidWlsZF9saWJ0b29sX2xpYnMgaW4geWVzKSBlY2hvIG5vOzsgKikgZWNobyB5ZXM7OyBlc2FjYAotIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6c2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOjIKLSMgRW5kOgotIyB2aTpzdz0yCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvbWFudWFsLWNvbXBpbGUvY29tcGlsZS5zaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvbWFudWFsLWNvbXBpbGUvY29tcGlsZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTEyMDkwMS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL21hbnVhbC1jb21waWxlL2NvbXBpbGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jR0NDPWdjYwotI0dQUD1nKysKLSNMREZMQUdTPSItc3RhdGljIgotCi0jIG1hYywgJ2NvcyBPU1ggZG9lc24ndCBzdXBwb3J0IHN0YXRpYyBsaW5raW5nIGFuZCBvdGhlciBzdWNoIG5vbnNlbnNlCi1HQ0M9Z2NjLW1wLTQuNQotR1BQPWcrKy1tcC00LjUKLQotU1JDX0RJUj0vVXNlcnMvaGlldWhvYW5nL3dvcmtzcGFjZS9tZ2l6YXBwL3RydW5rL21naXphcHAvc3JjCi1CT09TVF9ST09UPS9Vc2Vycy9oaWV1aG9hbmcvd29ya3NwYWNlL2Jvb3N0L2Jvb3N0XzFfNTJfMAotQk9PU1RfTElCUkFSWURJUj0vVXNlcnMvaGlldWhvYW5nL3dvcmtzcGFjZS9ib29zdC9ib29zdF8xXzUyXzAvbGliNjQvCi0KLQotcm0gKi5vIGxpYm1naXphLmEgZDRub3JtIGhtbW5vcm0gbWdpemEgcGxhaW4yc250IHNudDJjb29jIHNudDJjb29jLXJlZHVjZS1tZW0tcHJlcHJvY2VzcyBzbnQycGxhaW4gc3ltYWwgbWtjbHMKLQotJEdQUCAtSSRTUkNfRElSIC1JJEJPT1NUX1JPT1QvaW5jbHVkZSAtYyAtZlBJQyAgIFwKLSAkU1JDX0RJUi9hbGlnbm1lbnQuY3BwIFwKLSAkU1JDX0RJUi9BbGlnblRhYmxlcy5jcHAgXAotICRTUkNfRElSL0FUYWJsZXMuY3BwIFwKLSAkU1JDX0RJUi9jb2xsQ291bnRzLmNwcCBcCi0gJFNSQ19ESVIvRGljdGlvbmFyeS5jcHAgXAotICRTUkNfRElSL0ZvcndhcmRCYWNrd2FyZC5jcHAgXAotICRTUkNfRElSL2dldFNlbnRlbmNlLmNwcCBcCi0gJFNSQ19ESVIvaG1tLmNwcCBcCi0gJFNSQ19ESVIvSE1NVGFibGVzLmNwcCBcCi0gJFNSQ19ESVIvbG9ncHJvYi5jcHAgXAotICRTUkNfRElSL21vZGVsMS5jcHAgXAotICRTUkNfRElSL21vZGVsMi5jcHAgXAotICRTUkNfRElSL21vZGVsMnRvMy5jcHAgXAotICRTUkNfRElSL21vZGVsMzQ1LXBlZy5jcHAgXAotICRTUkNfRElSL21vZGVsMy5jcHAgXAotICRTUkNfRElSL21vZGVsM192aXRlcmJpLmNwcCBcCi0gJFNSQ19ESVIvbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwIFwKLSAkU1JDX0RJUi9Nb3ZlU3dhcE1hdHJpeC5jcHAgXAotICRTUkNfRElSL215YXNzZXJ0LmNwcCBcCi0gJFNSQ19ESVIvTlRhYmxlcy5jcHAgXAotICRTUkNfRElSL1BhcmFtZXRlci5jcHAgXAotICRTUkNfRElSL3BhcnNlLmNwcCBcCi0gJFNSQ19ESVIvUGVycGxleGl0eS5jcHAgXAotICRTUkNfRElSL3JlcG9ydHMuY3BwIFwKLSAkU1JDX0RJUi9TZXRBcnJheS5jcHAgXAotICRTUkNfRElSL3RyYW5zcGFpcl9tb2RlbDMuY3BwIFwKLSAkU1JDX0RJUi90cmFuc3BhaXJfbW9kZWw0LmNwcCBcCi0gJFNSQ19ESVIvdHJhbnNwYWlyX21vZGVsNS5jcHAgXAotICRTUkNfRElSL1RUYWJsZXMuY3BwIFwKLSAkU1JDX0RJUi91dGlsaXR5LmNwcCBcCi0gJFNSQ19ESVIvdm9jYWIuY3BwCi0KLSRHQ0MgLWMgLWZQSUMgJFNSQ19ESVIvY21kLmMKLQotYXIgcnZzIGxpYm1naXphLmEgKi5vCi0KLSRHUFAgLW8gZDRub3JtICRTUkNfRElSL2Q0bm9ybS5jeHggICAgICAkTERGTEFHUyAtSSRCT09TVF9ST09UIC1JJFNSQ19ESVIgLUwuIC1sbWdpemEgIC1MJEJPT1NUX0xJQlJBUllESVIgLWxib29zdF9zeXN0ZW0tbXQgLWxib29zdF90aHJlYWQtbXQgLWxwdGhyZWFkIAotCi0kR1BQIC1vIGhtbW5vcm0gJFNSQ19ESVIvaG1tbm9ybS5jeHggICAgJExERkxBR1MgLUkkQk9PU1RfUk9PVCAtSSRTUkNfRElSIC4vbGlibWdpemEuYSAgLUwkQk9PU1RfTElCUkFSWURJUiAtbGJvb3N0X3N5c3RlbS1tdCAtbGJvb3N0X3RocmVhZC1tdCAtbHB0aHJlYWQgCi0KLSRHUFAgLW8gbWdpemEgJFNSQ19ESVIvbWFpbi5jcHAgICAgICAgICAkTERGTEFHUyAtSSRCT09TVF9ST09UIC1JJFNSQ19ESVIgLi9saWJtZ2l6YS5hICAtTCRCT09TVF9MSUJSQVJZRElSIC1sYm9vc3Rfc3lzdGVtLW10IC1sYm9vc3RfdGhyZWFkLW10IC1scHRocmVhZCAKLQotJEdQUCAtbyBwbGFpbjJzbnQgJFNSQ19ESVIvcGxhaW4yc250LmNwcAotCi0kR1BQIC1vIHNudDJjb29jICAkU1JDX0RJUi9zbnQyY29vYy5jcHAgCi0KLSRHUFAgLW8gc250MmNvb2MtcmVkdWNlLW1lbS1wcmVwcm9jZXNzICRTUkNfRElSL3NudDJjb29jLXJlZHVjZS1tZW0tcHJlcHJvY2Vzcy5jcHAgCi0KLSRHUFAgLW8gc250MnBsYWluICRTUkNfRElSL3NudDJwbGFpbi5jcHAgCi0KLSRHUFAgLW8gc3ltYWwgJFNSQ19ESVIvc3ltYWwuY3BwICAgICAgICAkTERGTEFHUyAtSSRCT09TVF9ST09UIC1JJFNSQ19ESVIgLi9saWJtZ2l6YS5hICAtTCRCT09TVF9MSUJSQVJZRElSIC1sYm9vc3Rfc3lzdGVtLW10IC1sYm9vc3RfdGhyZWFkLW10IC1scHRocmVhZCAKLQotJEdQUCAtSSRTUkNfRElSL21rY2xzICAtbyBta2NscyAkU1JDX0RJUi9ta2Nscy9ta2Nscy5jcHAgJFNSQ19ESVIvbWtjbHMvZ2VuZXJhbC5jcHAgJFNSQ19ESVIvbWtjbHMvS2F0ZWdQcm9ibGVtS0JDLmNwcCAkU1JDX0RJUi9ta2Nscy9LYXRlZ1Byb2JsZW0uY3BwICRTUkNfRElSL21rY2xzL1Byb2JsZW0uY3BwICRTUkNfRElSL21rY2xzL1Byb2JsZW1UZXN0LmNwcCAkU1JDX0RJUi9ta2Nscy9JdGVyT3B0aW1pemF0aW9uLmNwcCAkU1JDX0RJUi9ta2Nscy9TdGF0VmFyLmNwcCAkU1JDX0RJUi9ta2Nscy9UQU9wdGltaXphdGlvbi5jcHAgJFNSQ19ESVIvbWtjbHMvU0FPcHRpbWl6YXRpb24uY3BwICRTUkNfRElSL21rY2xzL0dEQU9wdGltaXphdGlvbi5jcHAgJFNSQ19ESVIvbWtjbHMvTVlPcHRpbWl6YXRpb24uY3BwICRTUkNfRElSL21rY2xzL1JSVE9wdGltaXphdGlvbi5jcHAgJFNSQ19ESVIvbWtjbHMvSENPcHRpbWl6YXRpb24uY3BwICRTUkNfRElSL21rY2xzL09wdGltaXphdGlvbi5jcHAgJFNSQ19ESVIvbWtjbHMvS2F0ZWdQcm9ibGVtV0JDLmNwcCAkU1JDX0RJUi9ta2Nscy9LYXRlZ1Byb2JsZW1UZXN0LmNwcAotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvbWFudWFsLWNvbXBpbGUvdHJhbnNmZXIuc2ggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL21hbnVhbC1jb21waWxlL3RyYW5zZmVyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjM1Mzk2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvbWFudWFsLWNvbXBpbGUvdHJhbnNmZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXNjcCBtZ2l6YSBzeW1hbCBzbnQycGxhaW4gc250MmNvb2MtcmVkdWNlLW1lbS1wcmVwcm9jZXNzIHNudDJjb29jIHBsYWluMnNudCBta2NscyBobW1ub3JtIGQ0bm9ybSAuLi9zY3JpcHRzL21lcmdlX2FsaWdubWVudC5weSAgczA1NjU3NDFAdGhvcjovaG9tZS9zMDU2NTc0MS9SRUxFQVNFLTEuMC9iaW5hcmllcy9tYWMtNjRiaXQvdHJhaW5pbmctdG9vbHMvbWdpemEKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9tZ2l6YS5hbmp1dGEgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL21naXphLmFuanV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3ZGNmMS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL21naXphLmFuanV0YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGFuanV0YT4KLSAgICA8cGx1Z2luIG5hbWU9IkdCRiBQcm9qZWN0IE1hbmFnZXIiCi0gICAgICAgICAgICB1cmw9Imh0dHA6Ly9hbmp1dGEub3JnL3BsdWdpbnMvIgotICAgICAgICAgICAgbWFuZGF0b3J5PSJ5ZXMiPgotCQk8cmVxdWlyZSBncm91cD0iQW5qdXRhIFBsdWdpbiIKLSAgICAgICAgICAgICAgICAgYXR0cmlidXRlPSJJbnRlcmZhY2VzIgotICAgICAgICAgICAgICAgICB2YWx1ZT0iSUFuanV0YVByb2plY3RNYW5hZ2VyIi8+Ci0JCTxyZXF1aXJlIGdyb3VwPSJQcm9qZWN0IgotICAgICAgICAgICAgICAgICBhdHRyaWJ1dGU9IlN1cHBvcnRlZC1Qcm9qZWN0LVR5cGVzIgotICAgICAgICAgICAgICAgICB2YWx1ZT0iYXV0b21ha2UiLz4KLQk8L3BsdWdpbj4KLQk8cGx1Z2luIG5hbWU9Ik1ha2UgQnVpbGQgU3lzdGVtIgotICAgICAgICAgICAgdXJsPSJodHRwOi8vYW5qdXRhLm9yZy9wbHVnaW5zLyIKLSAgICAgICAgICAgIG1hbmRhdG9yeT0ieWVzIj4KLQkJPHJlcXVpcmUgZ3JvdXA9IkFuanV0YSBQbHVnaW4iCi0gICAgICAgICAgICAgICAgIGF0dHJpYnV0ZT0iSW50ZXJmYWNlcyIKLSAgICAgICAgICAgICAgICAgdmFsdWU9IklBbmp1dGFCdWlsZGFibGUiLz4KLQkJPHJlcXVpcmUgZ3JvdXA9IkJ1aWxkIgotICAgICAgICAgICAgICAgICBhdHRyaWJ1dGU9IlN1cHBvcnRlZC1CdWlsZC1UeXBlcyIKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im1ha2UiLz4KLQk8L3BsdWdpbj4KLQk8cGx1Z2luIG5hbWU9IlRhc2sgTWFuYWdlciIKLSAgICAgICAgICAgIHVybD0iaHR0cDovL2FuanV0YS5vcmcvcGx1Z2lucy8iCi0gICAgICAgICAgICBtYW5kYXRvcnk9Im5vIj4KLQkJPHJlcXVpcmUgZ3JvdXA9IkFuanV0YSBQbHVnaW4iCi0gICAgICAgICAgICAgICAgIGF0dHJpYnV0ZT0iSW50ZXJmYWNlcyIKLSAgICAgICAgICAgICAgICAgdmFsdWU9IklBbmp1dGFUb2RvIi8+Ci0JPC9wbHVnaW4+Ci0JPHBsdWdpbiBuYW1lPSJEZWJ1ZyBNYW5hZ2VyIgotICAgICAgICAgICAgdXJsPSJodHRwOi8vYW5qdXRhLm9yZy9wbHVnaW5zLyIKLSAgICAgICAgICAgIG1hbmRhdG9yeT0ibm8iPgotCQk8cmVxdWlyZSBncm91cD0iQW5qdXRhIFBsdWdpbiIKLSAgICAgICAgICAgICAgICAgYXR0cmlidXRlPSJJbnRlcmZhY2VzIgotICAgICAgICAgICAgICAgICB2YWx1ZT0iSUFuanV0YURlYnVnZ2VyTWFuYWdlciIvPgotCTwvcGx1Z2luPgotPC9hbmp1dGE+CmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL21pc3NpbmcgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL21pc3NpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjOGZmNzAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9taXNzaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCi0KLXNjcmlwdHZlcnNpb249MjAwNi0wNS0xMC4yMwotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBPcmlnaW5hbGx5IGJ5IEZyYW4sY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotIyAwMjExMC0xMzAxLCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgZXhpdCAxCi1maQotCi1ydW49Ogotc2VkX291dHB1dD0ncy8uKiAtLW91dHB1dFsgPV1cKFteIF0qXCkuKi9cMS9wJwotc2VkX21pbnVzbz0ncy8uKiAtbyBcKFteIF0qXCkuKi9cMS9wJwotCi0jIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCi0jIHNyY2RpciBhbHJlYWR5LgotaWYgdGVzdCAtZiBjb25maWd1cmUuYWM7IHRoZW4KLSAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5hYwotZWxzZQotICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmluCi1maQotCi1tc2c9Im1pc3Npbmcgb24geW91ciBzeXN0ZW0iCi0KLWNhc2UgJDEgaW4KLS0tcnVuKQotICAjIFRyeSB0byBydW4gcmVxdWVzdGVkIHByb2dyYW0sIGFuZCBqdXN0IGV4aXQgaWYgaXQgc3VjY2VlZHMuCi0gIHJ1bj0KLSAgc2hpZnQKLSAgIiRAIiAmJiBleGl0IDAKLSAgIyBFeGl0IGNvZGUgNjMgbWVhbnMgdmVyc2lvbiBtaXNtYXRjaC4gIFRoaXMgb2Z0ZW4gaGFwcGVucwotICAjIHdoZW4gdGhlIHVzZXIgdHJ5IHRvIHVzZSBhbiBhbmNpZW50IHZlcnNpb24gb2YgYSB0b29sIG9uCi0gICMgYSBmaWxlIHRoYXQgcmVxdWlyZXMgYSBtaW5pbXVtIHZlcnNpb24uICBJbiB0aGlzIGNhc2Ugd2UKLSAgIyB3ZSBzaG91bGQgcHJvY2VlZCBoYXMgaWYgdGhlIHByb2dyYW0gaGFkIGJlZW4gYWJzZW50LCBvcgotICAjIGlmIC0tcnVuIGhhZG4ndCBiZWVuIHBhc3NlZC4KLSAgaWYgdGVzdCAkPyA9IDYzOyB0aGVuCi0gICAgcnVuPToKLSAgICBtc2c9InByb2JhYmx5IHRvbyBvbGQiCi0gIGZpCi0gIDs7Ci0KLSAgLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQotICAgIGVjaG8gIlwKLSQwIFtPUFRJT05dLi4uIFBST0dSQU0gW0FSR1VNRU5UXS4uLgotCi1IYW5kbGUgXGBQUk9HUkFNIFtBUkdVTUVOVF0uLi4nIGZvciB3aGVuIFBST0dSQU0gaXMgbWlzc2luZywgb3IgcmV0dXJuIGFuCi1lcnJvciBzdGF0dXMgaWYgdGhlcmUgaXMgbm8ga25vd24gaGFuZGxpbmcgZm9yIFBST0dSQU0uCi0KLU9wdGlvbnM6Ci0gIC1oLCAtLWhlbHAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAtdiwgLS12ZXJzaW9uICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgLS1ydW4gICAgICAgICAgIHRyeSB0byBydW4gdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCBlbXVsYXRlIGl0IGlmIGl0IGZhaWxzCi0KLVN1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKLSAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JwotICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKLSAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKLSAgYXV0b200dGUgICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZSwgb3IgY3JlYXRlIGEgc3R1YiBvbmUKLSAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcwotICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0gIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCi0gIGhlbHAybWFuICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKLSAgbGV4ICAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgbWFrZWluZm8gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQotICB0YXIgICAgICAgICAgdHJ5IHRhciwgZ251dGFyLCBndGFyLCB0aGVuIHRhciB3aXRob3V0IG5vbi1wb3J0YWJsZSBmbGFncwotICB5YWNjICAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0KLVNlbmQgYnVnIHJlcG9ydHMgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4iCi0gICAgZXhpdCAkPwotICAgIDs7Ci0KLSAgLXZ8LS12fC0tdmV8LS12ZXJ8LS12ZXJzfC0tdmVyc2l8LS12ZXJzaW98LS12ZXJzaW9uKQotICAgIGVjaG8gIm1pc3NpbmcgJHNjcmlwdHZlcnNpb24gKEdOVSBBdXRvbWFrZSkiCi0gICAgZXhpdCAkPwotICAgIDs7Ci0KLSAgLSopCi0gICAgZWNobyAxPiYyICIkMDogVW5rbm93biBcYCQxJyBvcHRpb24iCi0gICAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICAgIGV4aXQgMQotICAgIDs7Ci0KLWVzYWMKLQotIyBOb3cgZXhpdCBpZiB3ZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLiAgQWxzbyBleGl0IG5vdyBpZiB3ZQotIyBkb24ndCBoYXZlIGl0IGFuZCAtLXZlcnNpb24gd2FzIHBhc3NlZCAobW9zdCBsaWtlbHkgdG8gZGV0ZWN0Ci0jIHRoZSBwcm9ncmFtKS4KLWNhc2UgJDEgaW4KLSAgbGV4fHlhY2MpCi0gICAgIyBOb3QgR05VIHByb2dyYW1zLCB0aGV5IGRvbid0IGhhdmUgLS12ZXJzaW9uLgotICAgIDs7Ci0KLSAgdGFyKQotICAgIGlmIHRlc3QgLW4gIiRydW4iOyB0aGVuCi0gICAgICAgZWNobyAxPiYyICJFUlJPUjogXGB0YXInIHJlcXVpcmVzIC0tcnVuIgotICAgICAgIGV4aXQgMQotICAgIGVsaWYgdGVzdCAieCQyIiA9ICJ4LS12ZXJzaW9uIiB8fCB0ZXN0ICJ4JDIiID0gIngtLWhlbHAiOyB0aGVuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBlbGlmIHRlc3QgIngkMiIgPSAieC0tdmVyc2lvbiIgfHwgdGVzdCAieCQyIiA9ICJ4LS1oZWxwIjsgdGhlbgotICAgICAgICMgQ291bGQgbm90IHJ1biAtLXZlcnNpb24gb3IgLS1oZWxwLiAgVGhpcyBpcyBwcm9iYWJseSBzb21lb25lCi0gICAgICAgIyBydW5uaW5nIGAkVE9PTCAtLXZlcnNpb24nIG9yIGAkVE9PTCAtLWhlbHAnIHRvIGNoZWNrIHdoZXRoZXIKLSAgICAgICAjICRUT09MIGV4aXN0cyBhbmQgbm90IGtub3dpbmcgJFRPT0wgdXNlcyBtaXNzaW5nLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0gICAgOzsKLWVzYWMKLQotIyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgb3IgZmFpbHMgdG8gcnVuIChwb3NzaWJseSBhbiBvdXRkYXRlZCB2ZXJzaW9uKSwKLSMgdHJ5IHRvIGVtdWxhdGUgaXQuCi1jYXNlICQxIGluCi0gIGFjbG9jYWwqKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tCi0gICAgICAgICBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggYWNsb2NhbC5tNAotICAgIDs7Ci0KLSAgYXV0b2NvbmYpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQotICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKLSAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggY29uZmlndXJlCi0gICAgOzsKLQotICBhdXRvaGVhZGVyKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQotICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnICR7Y29uZmlndXJlX2FjfWAKLSAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKLSAgICB0b3VjaF9maWxlcz0KLSAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCi0gICAgICBjYXNlICRmIGluCi0gICAgICAqOiopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgImBlY2hvICIkZiIgfAotCQkJCSAgICAgICBzZWQgLWUgJ3MvXlteOl0qOi8vJyAtZSAncy86LiovLydgOzsKLSAgICAgICopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgJGYuaW4iOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gICAgdG91Y2ggJHRvdWNoX2ZpbGVzCi0gICAgOzsKLQotICBhdXRvbWFrZSopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4KLSAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgotICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8Ci0JICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKLQkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKLSAgICA7OwotCi0gIGF1dG9tNHRlKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbmVlZGVkLCBidXQgaXMgJG1zZy4KLSAgICAgICAgIFlvdSBtaWdodCBoYXZlIG1vZGlmaWVkIHNvbWUgZmlsZXMgd2l0aG91dCBoYXZpbmcgdGhlCi0gICAgICAgICBwcm9wZXIgdG9vbHMgZm9yIGZ1cnRoZXIgaGFuZGxpbmcgdGhlbS4KLSAgICAgICAgIFlvdSBjYW4gZ2V0IFxgJDEnIGFzIHBhcnQgb2YgXGBBdXRvY29uZicgZnJvbSBhbnkgR05VCi0gICAgICAgICBhcmNoaXZlIHNpdGUuIgotCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX291dHB1dCJgCi0gICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9taW51c28iYAotICAgIGlmIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgotCXRvdWNoICRmaWxlCi0gICAgZWxzZQotCXRlc3QgLXogIiRmaWxlIiB8fCBleGVjID4kZmlsZQotCWVjaG8gIiMhIC9iaW4vc2giCi0JZWNobyAiIyBDcmVhdGVkIGJ5IEdOVSBBdXRvbWFrZSBtaXNzaW5nIGFzIGEgcmVwbGFjZW1lbnQgb2YiCi0JZWNobyAiIyAgJCAkQCIKLQllY2hvICJleGl0IDAiCi0JY2htb2QgK3ggJGZpbGUKLQlleGl0IDEKLSAgICBmaQotICAgIDs7Ci0KLSAgYmlzb258eWFjYykKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCi0gICAgaWYgdGVzdCAkIyAtbmUgMTsgdGhlbgotICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKLQljYXNlICRMQVNUQVJHIGluCi0JKi55KQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAotCSAgICBpZiB0ZXN0IC1mICIkU1JDRklMRSI7IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmMKLQkgICAgZmkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2gvJ2AKLQkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5oCi0JICAgIGZpCi0JICA7OwotCWVzYWMKLSAgICBmaQotICAgIGlmIHRlc3QgISAtZiB5LnRhYi5oOyB0aGVuCi0JZWNobyA+eS50YWIuaAotICAgIGZpCi0gICAgaWYgdGVzdCAhIC1mIHkudGFiLmM7IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPnkudGFiLmMKLSAgICBmaQotICAgIDs7Ci0KLSAgbGV4fGZsZXgpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiBsZXgueXkuYwotICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAkTEFTVEFSRyBpbgotCSoubCkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKLQkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYwotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiB0ZXN0ICEgLWYgbGV4Lnl5LmM7IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPmxleC55eS5jCi0gICAgZmkKLSAgICA7OwotCi0gIGhlbHAybWFuKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0JIHlvdSBtb2RpZmllZCBhIGRlcGVuZGVuY3kgb2YgYSBtYW51YWwgcGFnZS4gIFlvdSBtYXkgbmVlZCB0aGUKLQkgXGBIZWxwMm1hbicgcGFja2FnZSBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlCi0JIGVmZmVjdC4gIFlvdSBjYW4gZ2V0IFxgSGVscDJtYW4nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX291dHB1dCJgCi0gICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9taW51c28iYAotICAgIGlmIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgotCXRvdWNoICRmaWxlCi0gICAgZWxzZQotCXRlc3QgLXogIiRmaWxlIiB8fCBleGVjID4kZmlsZQotCWVjaG8gIi5hYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UiCi0JZXhpdCAxCi0gICAgZmkKLSAgICA7OwotCi0gIG1ha2VpbmZvKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC50ZXhpJyBvciBcYC50ZXhpbmZvJyBmaWxlLCBvciBhbnkgb3RoZXIgZmlsZQotICAgICAgICAgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiAgVGhlIHNwdXJpb3VzCi0gICAgICAgICBjYWxsIG1pZ2h0IGFsc28gYmUgdGhlIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgYnVnZ3kgXGBtYWtlJyAoQUlYLAotICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCi0gICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgICMgVGhlIGZpbGUgdG8gdG91Y2ggaXMgdGhhdCBzcGVjaWZpZWQgd2l0aCAtbyAuLi4KLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKLSAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCi0gICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCi0gICAgICAjIC4uLiBvciBpdCBpcyB0aGUgb25lIHNwZWNpZmllZCB3aXRoIEBzZXRmaWxlbmFtZSAuLi4KLSAgICAgIGluZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAotICAgICAgZmlsZT1gc2VkIC1uICcKLQkvXkBzZXRmaWxlbmFtZS97Ci0JICBzLy4qIFwoW14gXSpcKSAqJC9cMS8KLQkgIHAKLQkgIHEKLQl9JyAkaW5maWxlYAotICAgICAgIyAuLi4gb3IgaXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBzb3VyY2UgbmFtZSAoZGlyL2YudGV4aSBiZWNvbWVzIGYuaW5mbykKLSAgICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkaW5maWxlIiB8IHNlZCAncywuKi8sLDtzLC5bXi5dKiQsLCdgLmluZm8KLSAgICBmaQotICAgICMgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSB1c2VyIHJlYWxseSBuZWVkcyBtYWtlaW5mbzsKLSAgICAjIGxldCdzIGZhaWwgd2l0aG91dCB0b3VjaGluZyBhbnl0aGluZy4KLSAgICB0ZXN0IC1mICRmaWxlIHx8IGV4aXQgMQotICAgIHRvdWNoICRmaWxlCi0gICAgOzsKLQotICB0YXIpCi0gICAgc2hpZnQKLQotICAgICMgV2UgaGF2ZSBhbHJlYWR5IHRyaWVkIHRhciBpbiB0aGUgZ2VuZXJpYyBwYXJ0LgotICAgICMgTG9vayBmb3IgZ251dGFyL2d0YXIgYmVmb3JlIGludm9jYXRpb24gdG8gYXZvaWQgdWdseSBlcnJvcgotICAgICMgbWVzc2FnZXMuCi0gICAgaWYgKGdudXRhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KLSAgICAgICBnbnV0YXIgIiRAIiAmJiBleGl0IDAKLSAgICBmaQotICAgIGlmIChndGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgotICAgICAgIGd0YXIgIiRAIiAmJiBleGl0IDAKLSAgICBmaQotICAgIGZpcnN0YXJnPSIkMSIKLSAgICBpZiBzaGlmdDsgdGhlbgotCWNhc2UgJGZpcnN0YXJnIGluCi0JKm8qKQotCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL28vL2AKLQkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCi0JICAgIDs7Ci0JZXNhYwotCWNhc2UgJGZpcnN0YXJnIGluCi0JKmgqKQotCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL2gvL2AKLQkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCi0JICAgIDs7Ci0JZXNhYwotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IEkgY2FuJ3Qgc2VlbSB0byBiZSBhYmxlIHRvIHJ1biBcYHRhcicgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgotICAgICAgICAgWW91IG1heSB3YW50IHRvIGluc3RhbGwgR05VIHRhciBvciBGcmVlIHBheHV0aWxzLCBvciBjaGVjayB0aGUKLSAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIGlzICRtc2cuCi0gICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQotICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCi0gICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXNpdGVzIGZvciBpbnN0YWxsaW5nCi0gICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQotICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgotICAgIGV4aXQgMQotICAgIDs7Ci1lc2FjCi0KLWV4aXQgMAotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCi0jIEVuZDoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9DTWFrZUxpc3RzLnR4dCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9DTWFrZUxpc3RzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJkMGYzMy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUlOU1RBTEwoUFJPR1JBTVMgZm9yY2UtYWxpZ24tbW9zZXMuc2ggIGdpemEyYmFsLnBsICBtZXJnZV9hbGlnbm1lbnQucHkgIHBsYWluMnNudC1oYXN2Y2IucHkgIHNudHBvc3Rwcm9jLnB5IGZvcmNlLWFsaWduLW1vc2VzLW9sZC5zaCBydW4uc2ggc250MmNvb2MucGwKLSAgICBERVNUSU5BVElPTiBzY3JpcHRzCi0gICAgUEVSTUlTU0lPTlMgT1dORVJfRVhFQ1VURSBPV05FUl9SRUFEIE9XTkVSX1dSSVRFCi0gICAgKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zY3JpcHRzL1RyaW1CbGFua3Muc2ggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvVHJpbUJsYW5rcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzhiZDI4Yi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvVHJpbUJsYW5rcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotc2VkIC1lICdzL15bIFx0XSovLycgLWUgJ3MvWyBcdF1bIFx0XSovIC9nJyAtZSAncy9bIFx0XSokLy8nCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9mb3JjZS1hbGlnbi1tb3Nlcy1vbGQuc2ggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvZm9yY2UtYWxpZ24tbW9zZXMtb2xkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDRjZjEyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9mb3JjZS1hbGlnbi1tb3Nlcy1vbGQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIS91c3IvYmluL2VudiBiYXNoCi0KLU1HSVpBPSR7UU1UX0hPTUV9L2Jpbi9tZ2l6YQotCi1pZiBbICQjIC1sdCA0IF07IHRoZW4KLQllY2hvICJPSywgdGhpcyBpcyBzaW1wbGUsIHB1dCBtZSBpbnRvIHlvdXIgTW9zZXMgdHJhaW5pbmcgZGlyZWN0b3J5LCBsaW5rIHlvdXIgc291cmNlL3RhcmdldCBjb3JwdXMiIDE+JjIKLQllY2hvICJhbmQgcnVuICIgJDAgIiBQUkVGSVggc3JjX3RhZyB0Z3RfdGFnIHJvb3QtZGlyLiIgMT4mMgotCWVjaG8gImFuZCBnZXQgZm9yY2UtYWxpZ25lZCBkYXRhOiByb290LWRpci9naXphLltzcmMtdGd0fHRndC1zcmNdLyouQTMuZmluYWwuKiAiIDE+JjIKLQllY2hvICJtYWtlIHN1cmUgSSBjYW4gZmluZCBQUkVGSVguc3JjX3RhZy10Z3RfdGFnIGFuZCBQUkVGSVgudGd0X3RhZy1zcmNfdGFnLCBhbmQgXCR7UU1UX0hPTUV9IGlzIHNldCIgMT4mMgotCWV4aXQKLWZpCi0KLVBSRT0kMQotU1JDPSQyCi1UR1Q9JDMKLVJPT1Q9JDQKLQotbWtkaXIgLXAgJFJPT1QvZ2l6YS4ke1NSQ30tJHtUR1R9Ci1ta2RpciAtcCAkUk9PVC9naXphLiR7VEdUfS0ke1NSQ30KLW1rZGlyIC1wICRST09UL2NvcnB1cwotCi1lY2hvICJHZW5lcmF0aW5nIGNvcnB1cyBmaWxlICIgMT4mMgotCi0ke1FNVF9IT01FfS9zY3JpcHRzL3BsYWluMnNudC1oYXN2Y2IucHkgY29ycHVzLyRTUkMudmNiIGNvcnB1cy8kVEdULnZjYiAke1BSRX0uJHtTUkN9ICR7UFJFfS4ke1RHVH0gJFJPT1QvY29ycHVzLyR7VEdUfS0ke1NSQ30uc250ICRST09UL2NvcnB1cy8ke1NSQ30tJHtUR1R9LnNudCAkUk9PVC9jb3JwdXMvJFNSQy52Y2IgJFJPT1QvY29ycHVzLyRUR1QudmNiCi0KLWxuIC1zZiAkUFdEL2NvcnB1cy8kU1JDLnZjYi5jbGFzc2VzICRQV0QvY29ycHVzLyRUR1QudmNiLmNsYXNzZXMgJFJPT1QvY29ycHVzLwotCi1lY2hvICJHZW5lcmF0aW5nIGNvLW9jY3VycmVuY2UgZmlsZSAiIDE+JjIKLQotJHtRTVRfSE9NRX0vYmluL3NudDJjb29jICRST09UL2dpemEuJHtUR1R9LSR7U1JDfS8kVEdULSR7U1JDfS5jb29jICRST09UL2NvcnB1cy8kU1JDLnZjYiAkUk9PVC9jb3JwdXMvJFRHVC52Y2IgJFJPT1QvY29ycHVzLyR7VEdUfS0ke1NSQ30uc250Ci0ke1FNVF9IT01FfS9iaW4vL3NudDJjb29jICRST09UL2dpemEuJHtTUkN9LSR7VEdUfS8kU1JDLSR7VEdUfS5jb29jICRST09UL2NvcnB1cy8kVEdULnZjYiAkUk9PVC9jb3JwdXMvJFNSQy52Y2IgJFJPT1QvY29ycHVzLyR7U1JDfS0ke1RHVH0uc250Ci0KLWVjaG8gIlJ1bm5pbmcgZm9yY2UgYWxpZ25tZW50ICIgMT4mMgotCi0kTUdJWkEgZ2l6YS4kVEdULSRTUkMvJFRHVC0kU1JDLmdpemFjZmcgLWMgJFJPT1QvY29ycHVzLyRUR1QtJFNSQy5zbnQgLW8gJFJPT1QvZ2l6YS4ke1RHVH0tJHtTUkN9LyRUR1QtJHtTUkN9IFwKLS1zICRST09UL2NvcnB1cy8kU1JDLnZjYiAtdCAkUk9PVC9jb3JwdXMvJFRHVC52Y2IgLW0xIDAgLW0yIDAgLW1oIDAgLWNvb2N1cnJlbmNlICRST09UL2dpemEuJHtUR1R9LSR7U1JDfS8kVEdULSR7U1JDfS5jb29jIFwKLS1yZXN0YXJ0IDExIC1wcmV2aW91c3QgZ2l6YS4kVEdULSRTUkMvJFRHVC0kU1JDLnQzLmZpbmFsIFwKLS1wcmV2aW91c2EgZ2l6YS4kVEdULSRTUkMvJFRHVC0kU1JDLmEzLmZpbmFsIC1wcmV2aW91c2QgZ2l6YS4kVEdULSRTUkMvJFRHVC0kU1JDLmQzLmZpbmFsIFwKLS1wcmV2aW91c24gZ2l6YS4kVEdULSRTUkMvJFRHVC0kU1JDLm4zLmZpbmFsIC1wcmV2aW91c2Q0IGdpemEuJFRHVC0kU1JDLyRUR1QtJFNSQy5kNC5maW5hbCBcCi0tcHJldmlvdXNkNDIgZ2l6YS4kVEdULSRTUkMvJFRHVC0kU1JDLkQ0LmZpbmFsIC1tMyAwIC1tNCAxCi0KLSRNR0laQSBnaXphLiRTUkMtJFRHVC8kU1JDLSRUR1QuZ2l6YWNmZyAtYyAkUk9PVC9jb3JwdXMvJFNSQy0kVEdULnNudCAtbyAkUk9PVC9naXphLiR7U1JDfS0ke1RHVH0vJFNSQy0ke1RHVH0gXAotLXMgJFJPT1QvY29ycHVzLyRUR1QudmNiIC10ICRST09UL2NvcnB1cy8kU1JDLnZjYiAtbTEgMCAtbTIgMCAtbWggMCAtY29vY3VycmVuY2UgJFJPT1QvZ2l6YS4ke1NSQ30tJHtUR1R9LyRTUkMtJHtUR1R9LmNvb2MgXAotLXJlc3RhcnQgMTEgLXByZXZpb3VzdCBnaXphLiRTUkMtJFRHVC8kU1JDLSRUR1QudDMuZmluYWwgXAotLXByZXZpb3VzYSBnaXphLiRTUkMtJFRHVC8kU1JDLSRUR1QuYTMuZmluYWwgLXByZXZpb3VzZCBnaXphLiRTUkMtJFRHVC8kU1JDLSRUR1QuZDMuZmluYWwgXAotLXByZXZpb3VzbiBnaXphLiRTUkMtJFRHVC8kU1JDLSRUR1QubjMuZmluYWwgLXByZXZpb3VzZDQgZ2l6YS4kU1JDLSRUR1QvJFNSQy0kVEdULmQ0LmZpbmFsIFwKLS1wcmV2aW91c2Q0MiBnaXphLiRTUkMtJFRHVC8kU1JDLSRUR1QuRDQuZmluYWwgLW0zIDAgLW00IDEKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zY3JpcHRzL2ZvcmNlLWFsaWduLW1vc2VzLnNoIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zY3JpcHRzL2ZvcmNlLWFsaWduLW1vc2VzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzk1YmNiLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9mb3JjZS1hbGlnbi1tb3Nlcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IGJhc2gKLQotTUdJWkE9JHtRTVRfSE9NRX0vYmluL21naXphCi0KLWlmIFsgJCMgLWx0IDQgXTsgdGhlbgotCWVjaG8gIk9LLCB0aGlzIGlzIHNpbXBsZSwgcHV0IG1lIGludG8geW91ciBNb3NlcyB0cmFpbmluZyBkaXJlY3RvcnksIGxpbmsgeW91ciBzb3VyY2UvdGFyZ2V0IGNvcnB1cyIgMT4mMgotCWVjaG8gImFuZCBydW4gIiAkMCAiIFBSRUZJWCBzcmNfdGFnIHRndF90YWcgcm9vdC1kaXIuIiAxPiYyCi0JZWNobyAiYW5kIGdldCBmb3JjZS1hbGlnbmVkIGRhdGE6IHJvb3QtZGlyL2dpemEuW3NyYy10Z3R8dGd0LXNyY10vKi5BMy5maW5hbC4qICIgMT4mMgotCWVjaG8gIm1ha2Ugc3VyZSBJIGNhbiBmaW5kIFBSRUZJWC5zcmNfdGFnLXRndF90YWcgYW5kIFBSRUZJWC50Z3RfdGFnLXNyY190YWcsIGFuZCBcJHtRTVRfSE9NRX0gaXMgc2V0IiAxPiYyCi0JZXhpdAotZmkKLQotUFJFPSQxCi1TUkM9JDIKLVRHVD0kMwotUk9PVD0kNAotTlVNPSQ1Ci0KLW1rZGlyIC1wICRST09UL2dpemEtaW52ZXJzZS4ke05VTX0KLW1rZGlyIC1wICRST09UL2dpemEuJHtOVU19Ci1ta2RpciAtcCAkUk9PVC9wcmVwYXJlZC4ke05VTX0KLQotZWNobyAiR2VuZXJhdGluZyBjb3JwdXMgZmlsZSAiIDE+JjIKLQotJHtRTVRfSE9NRX0vc2NyaXB0cy9wbGFpbjJzbnQtaGFzdmNiLnB5IHByZXBhcmVkLiR7TlVNfS8kU1JDLnZjYiBwcmVwYXJlZC4ke05VTX0vJFRHVC52Y2IgJHtQUkV9LiR7U1JDfSAke1BSRX0uJHtUR1R9ICRST09UL3ByZXBhcmVkLiR7TlVNfS8ke1RHVH0tJHtTUkN9LnNudCAkUk9PVC9wcmVwYXJlZC4ke05VTX0vJHtTUkN9LSR7VEdUfS5zbnQgJFJPT1QvcHJlcGFyZWQuJHtOVU19LyRTUkMudmNiICRST09UL3ByZXBhcmVkLiR7TlVNfS8kVEdULnZjYgotCi1sbiAtc2YgJFBXRC9wcmVwYXJlZC4ke05VTX0vJFNSQy52Y2IuY2xhc3NlcyAkUFdEL3ByZXBhcmVkLiR7TlVNfS8kVEdULnZjYi5jbGFzc2VzICRST09UL3ByZXBhcmVkLiR7TlVNfS8KLQotZWNobyAiR2VuZXJhdGluZyBjby1vY2N1cnJlbmNlIGZpbGUgIiAxPiYyCi0KLSR7UU1UX0hPTUV9L2Jpbi9zbnQyY29vYyAkUk9PVC9naXphLiR7TlVNfS8kVEdULSR7U1JDfS5jb29jICRST09UL3ByZXBhcmVkLiR7TlVNfS8kU1JDLnZjYiAkUk9PVC9wcmVwYXJlZC4ke05VTX0vJFRHVC52Y2IgJFJPT1QvcHJlcGFyZWQuJHtOVU19LyR7VEdUfS0ke1NSQ30uc250Ci0ke1FNVF9IT01FfS9iaW4vL3NudDJjb29jICRST09UL2dpemEtaW52ZXJzZS4ke05VTX0vJFNSQy0ke1RHVH0uY29vYyAkUk9PVC9wcmVwYXJlZC4ke05VTX0vJFRHVC52Y2IgJFJPT1QvcHJlcGFyZWQuJHtOVU19LyRTUkMudmNiICRST09UL3ByZXBhcmVkLiR7TlVNfS8ke1NSQ30tJHtUR1R9LnNudAotCi1lY2hvICJSdW5uaW5nIGZvcmNlIGFsaWdubWVudCAiIDE+JjIKLQotJE1HSVpBIGdpemEuJFRHVC0kU1JDLyRUR1QtJFNSQy5naXphY2ZnIC1jICRST09UL3ByZXBhcmVkLiR7TlVNfS8kVEdULSRTUkMuc250IC1vICRST09UL2dpemEuJHtOVU19LyRUR1QtJHtTUkN9IFwKLS1zICRST09UL3ByZXBhcmVkLiR7TlVNfS8kU1JDLnZjYiAtdCAkUk9PVC9wcmVwYXJlZC4ke05VTX0vJFRHVC52Y2IgLW0xIDAgLW0yIDAgLW1oIDAgLWNvb2N1cnJlbmNlICRST09UL2dpemEuJHtOVU19LyRUR1QtJHtTUkN9LmNvb2MgXAotLXJlc3RhcnQgMTEgLXByZXZpb3VzdCBnaXphLiRUR1QtJFNSQy8kVEdULSRTUkMudDMuZmluYWwgXAotLXByZXZpb3VzYSBnaXphLiRUR1QtJFNSQy8kVEdULSRTUkMuYTMuZmluYWwgLXByZXZpb3VzZCBnaXphLiRUR1QtJFNSQy8kVEdULSRTUkMuZDMuZmluYWwgXAotLXByZXZpb3VzbiBnaXphLiRUR1QtJFNSQy8kVEdULSRTUkMubjMuZmluYWwgLXByZXZpb3VzZDQgZ2l6YS4kVEdULSRTUkMvJFRHVC0kU1JDLmQ0LmZpbmFsIFwKLS1wcmV2aW91c2Q0MiBnaXphLiRUR1QtJFNSQy8kVEdULSRTUkMuRDQuZmluYWwgLW0zIDAgLW00IDEKLQotJE1HSVpBIGdpemEuJFNSQy0kVEdULyRTUkMtJFRHVC5naXphY2ZnIC1jICRST09UL3ByZXBhcmVkLiR7TlVNfS8kU1JDLSRUR1Quc250IC1vICRST09UL2dpemEtaW52ZXJzZS4ke05VTX0vJFNSQy0ke1RHVH0gXAotLXMgJFJPT1QvcHJlcGFyZWQuJHtOVU19LyRUR1QudmNiIC10ICRST09UL3ByZXBhcmVkLiR7TlVNfS8kU1JDLnZjYiAtbTEgMCAtbTIgMCAtbWggMCAtY29vY3VycmVuY2UgJFJPT1QvZ2l6YS1pbnZlcnNlLiR7TlVNfS8kU1JDLSR7VEdUfS5jb29jIFwKLS1yZXN0YXJ0IDExIC1wcmV2aW91c3QgZ2l6YS4kU1JDLSRUR1QvJFNSQy0kVEdULnQzLmZpbmFsIFwKLS1wcmV2aW91c2EgZ2l6YS4kU1JDLSRUR1QvJFNSQy0kVEdULmEzLmZpbmFsIC1wcmV2aW91c2QgZ2l6YS4kU1JDLSRUR1QvJFNSQy0kVEdULmQzLmZpbmFsIFwKLS1wcmV2aW91c24gZ2l6YS4kU1JDLSRUR1QvJFNSQy0kVEdULm4zLmZpbmFsIC1wcmV2aW91c2Q0IGdpemEuJFNSQy0kVEdULyRTUkMtJFRHVC5kNC5maW5hbCBcCi0tcHJldmlvdXNkNDIgZ2l6YS4kU1JDLSRUR1QvJFNSQy0kVEdULkQ0LmZpbmFsIC1tMyAwIC1tNCAxCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9naXphMmJhbC5wbCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9naXphMmJhbC5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmIxMzRjMC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvZ2l6YTJiYWwucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotIyEgL3Vzci9iaW4vcGVybAotCi0jICRJZDogZ2l6YTJiYWwucGwgMTU2MiAyMDA4LTAyLTE5IDIwOjQ4OjE0WiByZWRwb255ICQKLSNDb252ZXJ0cyBkaXJlY3QgYW5kIGludmVydGVkIGFsaWdubWVudHMgaW50byBhIG1vcmUgY29tcGFjdCAKLSNiaS1hbGlnbm1lbnQgZm9ybWF0LiBJdCBvcHRpb25hbGx5IHJlYWRzIHRoZSBjb3VudGluZyBmaWxlIAotI3Byb2R1Y2VkIGJ5IGdpemEgY29udGFpbmluZyB0aGUgZnJlcXVlbmN5IG9mIGVhY2ggdHJhbmluZyBzZW50ZW5jZS4KLQotI0NvcHlyaWdodCBNYXJjZWxsbyBGZWRlcmljbywgTm92ZW1iZXIgMjAwNAotCi0oJGNudCwkZGlyLCRpbnYpPSgpOwotCi13aGlsZSAoJHc9c2hpZnQgQEFSR1YpewotICAkZGlyPXNoaWZ0KEBBUkdWKSxuZXh0ICBpZiAkdyBlcSAiLWQiOwotICAkaW52PXNoaWZ0KEBBUkdWKSxuZXh0ICBpZiAkdyBlcSAiLWkiOwotICAkY250PXNoaWZ0KEBBUkdWKSxuZXh0ICBpZiAkdyBlcSAiLWMiOwotfSAKLQotbXkgJGxjID0gMDsKLQotaWYgKCEkZGlyIHx8ICFpbnYpewotIHByaW50ICAidXNhZ2U6IGdpemEyYmFsLnBsIFstYyA8Y291bnQtZmlsZT5dIC1kIDxkaXItYWxpZ24tZmlsZT4gLWkgPGludi1hbGlnbi1maWxlPlxuIjsgCi0gcHJpbnQgICJpbnB1dCBmaWxlcyBjYW4gYmUgYWxzbyBjb21tYW5kcywgZS5nLiAtZCBcImd1bnppcCAtYyBmaWxlLmd6XCJcbiI7Ci0gZXhpdCgwKTsKLX0KLQotJHw9MTsKLQotb3BlbihESVIsIjwkZGlyIikgfHwgb3BlbihESVIsIiRkaXJ8IikgfHwgZGllICJjYW5ub3Qgb3BlbiAkZGlyXG4iOwotb3BlbihJTlYsIjwkaW52IikgfHwgb3BlbihJTlYsIiRpbnZ8IikgfHwgZGllICJjYW5ub3Qgb3BlbiAkZGlyXG4iOwotCi1pZiAoJGNudCl7Ci1vcGVuKENOVCwiPCRjbnQiKSB8fCBvcGVuKENOVCwiJGNudHwiKSB8fCBkaWUgImNhbm5vdCBvcGVuICRkaXJcbiI7Ci19Ci0KLQotc3ViIFJlYWRCaUFsaWduewotICAgIGxvY2FsKCRmZDAsJGZkMSwkZmQyLCpzMSwqczIsKmEsKmIsKmMpPUBfOwotICAgIGxvY2FsKCRkdW1teSwkbik7Ci0KLSAgICBjaG9wKCRjPTwkZmQwPik7ICMjIGNvdW50Ci0gICAgJGR1bW15PTwkZmQwPjsgIyMgaGVhZGVyCi0gICAgJGR1bW15PTwkZmQwPjsgIyMgaGVhZGVyCi0gICAgJGM9MSBpZiAhJGM7Ci0KLSAgICAkZHVtbXk9PCRmZDE+OyAjIyBoZWFkZXIKLSAgICBjaG9wKCRzMT08JGZkMT4pOwotICAgIGNob3AoJHQxPTwkZmQxPik7Ci0KLSAgICAkZHVtbXk9PCRmZDI+OyAjIyBoZWFkZXIKLSAgICBjaG9wKCRzMj08JGZkMj4pOwotICAgIGNob3AoJHQyPTwkZmQyPik7Ci0KLSAgICBAYT1AYj0oKTsKLSAgICAkbGMrKzsKLQotICAgICNnZXQgdGFyZ2V0IHN0YXRpc3RpY3MKLSAgICAkbj0xOwotICAgICR0MT1+cy9OVUxMIFwoXHsoKFxzK1xkKykqKVxzK1x9XCkvLzsKLSAgICB3aGlsZSAoJHQxPX5zLyhcUyspXHMrXChceygoXHMrXGQrKSopXHMrXH1cKS8vKXsKLSAgICAgICAgZ3JlcCgkYVskX109JG4sc3BsaXQoL1xzKy8sJDIpKTsKLSAgICAgICAgJG4rKzsKLSAgICB9Ci0KLSAgICAkbT0xOwotICAgICR0Mj1+cy9OVUxMIFwoXHsoKFxzK1xkKykqKVxzK1x9XCkvLzsKLSAgICB3aGlsZSAoJHQyPX5zLyhcUyspXHMrXChceygoXHMrXGQrKSopXHMrXH1cKS8vKXsKLSAgICAgICAgZ3JlcCgkYlskX109JG0sc3BsaXQoL1xzKy8sJDIpKTsKLSAgICAgICAgJG0rKzsKLSAgICB9Ci0KLSAgICAkTT1zcGxpdCgvXHMrLywkczEpOwotICAgICROPXNwbGl0KC9ccysvLCRzMik7Ci0KLSAgICBpZiAoJG0gIT0gKCRNKzEpIHx8ICRuICE9ICgkTisxKSkgewotICAgICAgcHJpbnQgU1RERVJSICJTZW50ZW5jZSBtaXNtYXRjaCBlcnJvciEgTGluZSAjJGxjXG4iOwotICAgICAgJHMxID0gIkFMSUdOX0VSUiI7Ci0gICAgICAkczIgPSAiQUxJR05fRVJSIjsKLSAgICAgIEBhPSgpOyBAYj0oKTsKLSAgICAgIGZvciAoJGo9MTskajwyOyRqKyspeyAkYVskal09MTsgfQotICAgICAgZm9yICgkaT0xOyRpPDI7JGkrKyl7ICRiWyRpXT0xOyB9Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBmb3IgKCRqPTE7JGo8JG07JGorKyl7Ci0gICAgICAgICRhWyRqXT0wIGlmICEkYVskal07Ci0gICAgfQotCi0gICAgZm9yICgkaT0xOyRpPCRuOyRpKyspewotICAgICAgICAkYlskaV09MCBpZiAhJGJbJGldOwotICAgIH0KLQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLSRza2lwPTA7Ci0kY2NjPTA7Ci13aGlsZSghZW9mKERJUikpewotCi0gICAgaWYgKFJlYWRCaUFsaWduKENOVCxESVIsSU5WLCpzcmMsKnRndCwqYSwqYiwqYykpCi0gICAgewotCSRjY2MrKzsKLSAgICAgICAgcHJpbnQgIiRjXG4iOwotICAgICAgICBwcmludCAkI2EsIiAkc3JjIFwjIEBhWzEuLiQjYV1cbiI7Ci0gICAgICAgIHByaW50ICQjYiwiICR0Z3QgXCMgQGJbMS4uJCNiXVxuIjsKLSAgICB9Ci0gICAgZWxzZXsKLSAgICAJcHJpbnQgIlxuIjsKLSAgICAgICAgcHJpbnQgU1RERVJSICIuIiBpZiAhKCsrJHNraXAgJSAxMDAwKTsKLSAgICB9Ci19OwotcHJpbnQgU1RERVJSICJza2lwPTwkc2tpcD4gY291bnRzPTwkY2NjPlxuIjsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9tZXJnZV9hbGlnbm1lbnQucHkgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvbWVyZ2VfYWxpZ25tZW50LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjZiYzY4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9tZXJnZV9hbGlnbm1lbnQucHkKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMgQXV0aG9yIDogUWluIEdhbwotIyBEYXRlICAgOiBEZWMgMzEsIDIwMDcKLSMgUHVycG9zZTogQ29tYmluZSBtdWx0aXBsZSBhbGlnbm1lbnQgZmlsZXMgaW50byBhIHNpbmdsZSBvbmUsIHRoZSBmaWxlcyBhcmUKLSMgICAgICAgICAgcHJvZGN1Y2VkIGJ5IE1HSVpBLCB3aGljaCBoYXMgc2VudGVuY2UgSURzLCBhbmQgZXZlcnkgZmlsZSBpcyAKLSMgICAgICAgICAgb3JkZXJlZCBpbnNpZGUKLQotaW1wb3J0IHN5cwotaW1wb3J0IHJlCi0KLWlmIGxlbihzeXMuYXJndik8MjoKLQlzeXMuc3RkZXJyLndyaXRlKCJQcm92aWRlIG1lIHRoZSBmaWxlIG5hbWVzIChhdCBsZWFzdCAyKVxuIik7Ci0Jc3lzLmV4aXQoKTsKLQotc2VudF9pZCA9IDA7Ci0KLWZpbGVzID0gW107Ci1pZHMgPSBbXTsKLQotc2VudHMgPSBbXTsKLWRvbmUgPSBbXTsKLQotZm9yIGkgaW4gcmFuZ2UoMSxsZW4oc3lzLmFyZ3YpKToKLQlmaWxlcy5hcHBlbmQob3BlbihzeXMuYXJndltpXSwiciIpKTsKLQlpZHMuYXBwZW5kKDApOwotCXNlbnRzLmFwcGVuZCgiIik7Ci0JZG9uZS5hcHBlbmQoRmFsc2UpOwotCi1yID0gcmUuY29tcGlsZSgiXFwoKFxcZCspXFwpIik7CQotaSA9IDA7Ci13aGlsZSBpPCBsZW4oZmlsZXMpOgotCXN0MSA9IGZpbGVzW2ldLnJlYWRsaW5lKCk7Ci0Jc3QyID0gZmlsZXNbaV0ucmVhZGxpbmUoKTsKLQlzdDMgPSBmaWxlc1tpXS5yZWFkbGluZSgpOwotCWlmIGxlbihzdDEpPT0wIG9yIGxlbihzdDIpPT0wIG9yIGxlbihzdDMpPT0wOgotCQlkb25lW2ldID0gVHJ1ZTsKLQllbHNlOgotCQltdCA9IHIuc2VhcmNoKHN0MSk7Ci0JCWlkID0gaW50KG10Lmdyb3VwKDEpKTsKLQkJaWRzW2ldID0gaWQ7Ci0JCXNlbnRzW2ldID0gKHN0MSwgc3QyLCBzdDMpOwotCWkgKz0gMQotCQkKLWNvbnQgPSBUcnVlOwotd2hpbGUgKGNvbnQpOgotCXNlbnRfaWQgKz0gMTsKLQl3cml0ZU9uZSA9IEZhbHNlOwotIyBOb3cgdHJ5IHRvIHJlYWQgbW9yZSBzZW50ZW5jZXMKLQlpID0gMDsKLQljb250ID0gRmFsc2U7Ci0Jd2hpbGUgaSA8IGxlbihmaWxlcyk6Ci0JCWlmIGRvbmVbaV06Ci0JCQlpKz0xCi0JCQljb250aW51ZTsKLQkJY29udCA9IFRydWU7Ci0JCWlmIGlkc1tpXSA9PSBzZW50X2lkOgotCQkJc3lzLnN0ZG91dC53cml0ZSgiJXMlcyVzIiUoc2VudHNbaV1bMF0sc2VudHNbaV1bMV0sc2VudHNbaV1bMl0pKTsKLQkJCXdyaXRlT25lID0gVHJ1ZTsKLQkJCXN0MSA9IGZpbGVzW2ldLnJlYWRsaW5lKCk7Ci0JCQlzdDIgPSBmaWxlc1tpXS5yZWFkbGluZSgpOwotCQkJc3QzID0gZmlsZXNbaV0ucmVhZGxpbmUoKTsKLQkJCWlmIGxlbihzdDEpPT0wIG9yIGxlbihzdDIpPT0wIG9yIGxlbihzdDMpPT0wOgotCQkJCWRvbmVbaV0gPSBUcnVlOwotCQkJZWxzZToKLQkJCQltdCA9IHIuc2VhcmNoKHN0MSk7Ci0JCQkJaWQgPSBpbnQobXQuZ3JvdXAoMSkpOwotCQkJCWlkc1tpXSA9IGlkOwotCQkJCXNlbnRzW2ldID0gKHN0MSwgc3QyLCBzdDMpOwotCQkJCWNvbnQgPSBUcnVlOwotCQkJYnJlYWs7Ci0JCWVsaWYgaWRzW2ldIDwgc2VudF9pZDoKLQkJCXN5cy5zdGRlcnIud3JpdGUoIkVSUk9SISBEVVBMSUNBVEVEIEVOVFJZICVkXG4iICUgaWRzW2ldKTsKLQkJCXN5cy5leGl0KCk7Ci0JCWVsc2U6Ci0JCQljb250ID0gVHJ1ZTsKLQkJaSs9MTsKLQlpZiAobm90IHdyaXRlT25lKSBhbmQgY29udDoKLQkJc3lzLnN0ZGVyci53cml0ZSgiRVJST1IhIE1JU1NJTkcgRU5UUnkgJWRcbiIgJSBzZW50X2lkKTsKLQkJI3N5cy5leGl0KCk7Ci1zeXMuc3RkZXJyLndyaXRlKCJDb21iaW5lZCAlZCBmaWxlcywgdG90YWxseSAlZCBzZW50cyBcbiIgJShsZW4oZmlsZXMpLHNlbnRfaWQtMSkpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zY3JpcHRzL3BsYWluMnNudC1oYXN2Y2IucHkgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvcGxhaW4yc250LWhhc3ZjYi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDkwYzQ5My4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvcGxhaW4yc250LWhhc3ZjYi5weQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotCi1mcm9tIHN5cyBpbXBvcnQgKgotCi1kZWYgbG9hZHZjYihmbmFtZSxvdXQpOgotCWRpY3Q9e307Ci0JZGYgPSBvcGVuKGZuYW1lLCJyIik7Ci0JZm9yIGxpbmUgaW4gZGY6Ci0JCW91dC53cml0ZShsaW5lKTsKLQkJd3MgPSBsaW5lLnN0cmlwKCkuc3BsaXQoKTsKLQkgICAgICAgIGlkID0gaW50KHdzWzBdKTsKLQkJd2QgPSB3c1sxXTsKLQkJZGljdFt3ZF09aWQ7Ci0JcmV0dXJuIGRpY3Q7Ci0KLWlmIGxlbihhcmd2KTw5OgotCXN0ZGVyci53cml0ZSgiRXJyb3IsIHRoZSBpbnB1dCBzaG91bGQgYmUgXG4iKTsKLQlzdGRlcnIud3JpdGUoIiVzIGV2Y2IgZnZjYiBldHh0IGZ0eHQgZXNudChvdXQpIGZzbnQob3V0KSBldmNieChvdXQpIGZ2Y2J4KG91dClcbiIgJSBhcmd2WzBdKTsKLQlzdGRlcnIud3JpdGUoIllvdSBzaG91bGQgY29uY2F0ZW5hdGUgdGhlIGV2Y2J4IGFuZCBmdmNieCB0byBleGlzdGluZyB2Y2IgZmlsZXNcbiIpOwotCWV4aXQoKTsKLQotZWluID0gb3Blbihhcmd2WzNdLCJyIik7Ci1maW4gPSBvcGVuKGFyZ3ZbNF0sInIiKTsKLQotZW91dCA9IG9wZW4oYXJndls1XSwidyIpOwotZm91dCA9IG9wZW4oYXJndls2XSwidyIpOwotCi1ldmNieCA9IG9wZW4oYXJndls3XSwidyIpOwotZnZjYnggPSBvcGVuKGFyZ3ZbOF0sInciKTsKLWV2Y2IgPSBsb2FkdmNiKGFyZ3ZbMV0sZXZjYngpOwotZnZjYiA9IGxvYWR2Y2IoYXJndlsyXSxmdmNieCk7Ci0KLWk9MAotd2hpbGUgVHJ1ZToKLQlpKz0xOwotCWVsaW5lPWVpbi5yZWFkbGluZSgpOwotCWZsaW5lPWZpbi5yZWFkbGluZSgpOwotCWlmIGxlbihlbGluZSk9PTAgb3IgbGVuKGZsaW5lKT09MDoKLQkJYnJlYWs7Ci0JZXdvcmRzID0gZWxpbmUuc3RyaXAoKS5zcGxpdCgpOwotCWZ3b3JkcyA9IGZsaW5lLnN0cmlwKCkuc3BsaXQoKTsKLQllbCA9IFtdOwotCWZsID0gW107Ci0Jaj0wOwotCWZvciB3IGluIGV3b3JkczoKLQkJais9MQotCQlpZiBldmNiLmhhc19rZXkodyk6Ci0JCQllbC5hcHBlbmQoZXZjYlt3XSk7Ci0JCWVsc2U6Ci0JCQlpZiBldmNiLmhhc19rZXkody5sb3dlcigpKToKLQkJCQllbC5hcHBlbmQoZXZjYlt3Lmxvd2VyKCldKTsKLQkJCWVsc2U6Ci0JCQkJIyNzdGRvdXQud3JpdGUoIiNFICVkICVkICVzXG4iICUgKGksaix3KSkKLQkJCQkjZWwuYXBwZW5kKDEpOwotCQkJCW5pZCA9IGxlbihldmNiKSsxOwotCQkJCWV2Y2Jbdy5sb3dlcigpXSA9IG5pZDsKLQkJCQlldmNieC53cml0ZSgiJWQgJXMgMVxuIiAlIChuaWQsIHcpKTsKLQkJCQllbC5hcHBlbmQobmlkKTsKLQotCWo9MDsKLQlmb3IgdyBpbiBmd29yZHM6Ci0JCWorPTEKLQkJaWYgZnZjYi5oYXNfa2V5KHcpOgotCQkJZmwuYXBwZW5kKGZ2Y2Jbd10pOwotCQllbHNlOgotCQkJaWYgZnZjYi5oYXNfa2V5KHcubG93ZXIoKSk6Ci0JCQkJZmwuYXBwZW5kKGZ2Y2Jbdy5sb3dlcigpXSk7Ci0JCQllbHNlOgotCQkJCSNzdGRvdXQud3JpdGUoIiNGICVkICVkICVzXG4iICUgKGksaix3KSkKLQkJCQluaWQgPSBsZW4oZnZjYikrMTsKLQkJCQlmdmNiW3cubG93ZXIoKV0gPSBuaWQ7Ci0JCQkJZnZjYngud3JpdGUoIiVkICVzIDFcbiIgJSAobmlkLCB3KSk7Ci0JCQkJZmwuYXBwZW5kKG5pZCk7Ci0JCQkJI2ZsLmFwcGVuZCgxKTsKLQllb3V0LndyaXRlKCIxXG4iKTsKLQlmb3V0LndyaXRlKCIxXG4iKTsKLQlmb3IgSSBpbiBlbDoKLQkJZW91dC53cml0ZSgiJWQgIiAlIEkpOwotCWVvdXQud3JpdGUoIlxuIik7Ci0JZm9yIEkgaW4gZmw6Ci0JCWVvdXQud3JpdGUoIiVkICIgJSBJKTsKLQkJZm91dC53cml0ZSgiJWQgIiAlIEkpOwotCWVvdXQud3JpdGUoIlxuIik7Ci0JZm91dC53cml0ZSgiXG4iKTsKLQlmb3IgSSBpbiBlbDoKLQkJZm91dC53cml0ZSgiJWQgIiAlIEkpOwotCWZvdXQud3JpdGUoIlxuIik7Ci0KLWZvdXQuY2xvc2UoKTsKLWVvdXQuY2xvc2UoKTsKLWZ2Y2J4LmNsb3NlKCk7Ci1ldmNieC5jbG9zZSgpOwotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvcnVuLnNoIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zY3JpcHRzL3J1bi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmJiMzk3Mi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvcnVuLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotUFJFPXRlc3QKLVNSQz1mcgotVEdUPWVuCi1OVU09MQotU0NSSVBUX0RJUj0vb3B0L0FPL3N3L2VkaW5idXJnaC1jb2RlL3NjcmlwdHMtMjAxMTA5MjYtMTQyNQotCi1leHBvcnQgUU1UX0hPTUU9L3Jvb3Qvd29ya3NwYWNlL21naXphcHAKLQotcm0gLXJmIG91dAotCi0kUU1UX0hPTUUvc2NyaXB0cy9mb3JjZS1hbGlnbi1tb3Nlcy5zaCAkUFJFICRTUkMgJFRHVCBvdXQgMQotCi1lY2hvICJGSU5JU0hFRCBmb3JjZWQgYWxpZ25tZW50IgotCi0kU0NSSVBUX0RJUi8uLi9tZXJnZV9hbGlnbm1lbnQucHkgb3V0L2dpemEtaW52ZXJzZS4kTlVNLyRTUkMtJFRHVC5BMy5maW5hbC5wYXJ0KiB8IGd6aXAgLWMgPiBvdXQvZ2l6YS1pbnZlcnNlLiROVU0vJFNSQy0kVEdULkEzLmZpbmFsLmd6Ci0kU0NSSVBUX0RJUi8uLi9tZXJnZV9hbGlnbm1lbnQucHkgb3V0L2dpemEuJE5VTS8kVEdULSRTUkMuQTMuZmluYWwucGFydCogfCBnemlwIC1jID4gb3V0L2dpemEuJE5VTS8kVEdULSRTUkMuQTMuZmluYWwuZ3oKLQotJFNDUklQVF9ESVIvdHJhaW5pbmcvc3ltYWwvZ2l6YTJiYWwucGwgLWQgImd6aXAgLWNkIG91dC9naXphLiROVU0vJFRHVC0kU1JDLkEzLmZpbmFsLmd6IiAtaSAiZ3ppcCAtY2Qgb3V0L2dpemEtaW52ZXJzZS4kTlVNLyRTUkMtJFRHVC5BMy5maW5hbC5neiIgfCAkU0NSSVBUX0RJUi90cmFpbmluZy9zeW1hbC9zeW1hbCAtYWxpZ25tZW50PSJncm93IiAtZGlhZ29uYWw9InllcyIgLWZpbmFsPSJ5ZXMiIC1ib3RoPSJ5ZXMiID4gb3V0L2FsaWduZWQuMS5ncm93LWRpYWctZmluYWwtYW5kCi0KLWVjaG8gIkZJTklTSEVEIGdpemEyYmFsICYgc3ltYWwiCi0KLSRTQ1JJUFRfRElSL3RyYWluaW5nL3BocmFzZS1leHRyYWN0L2V4dHJhY3QgJFBSRS4kVEdUICRQUkUuJFNSQyBvdXQvYWxpZ25lZC4xLmdyb3ctZGlhZy1maW5hbC1hbmQgb3V0L2V4dHJhY3QuMSA3IG9yaWVudGF0aW9uIC0tbW9kZWwgd2JlLW1zZAotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvc250MmNvb2MucGwgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvc250MmNvb2MucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViYmVmYWIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zY3JpcHRzL3NudDJjb29jLnBsCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsIC13IAotCi0jIHNudGNvb2MucGVybCBbLXNvcnQtYnVmZmVyLXNpemUgMjAwTV0gWy1zb3J0LWJhdGNoLXNpemUgMjUzXSBbLXNvcnQtY29tcHJlc3MgZ3ppcF0gb3V0cHV0IHZjYjEgdmNiMiBzbnQxMiAKLQotdXNlIHN0cmljdDsKLXVzZSBGaWxlOjpCYXNlbmFtZTsKLXVzZSBGaW5kQmluIHF3KCRCaW4pOwotCi1zdWIgc3lzdGVtQ2hlY2soJCk7Ci0KLW15ICRzb3J0QXJncyA9ICIiOwotZm9yIChteSAkaSA9IDA7ICRpIDwgKEBBUkdWIC0gNCk7ICsrJGkpCi17Ci0gIG15ICRhcmcgPSAkQVJHVlskaV07Ci0gIGlmICgkYXJnIGVxICItc29ydC1idWZmZXItc2l6ZSIpCi0gIHsKLQkJJHNvcnRBcmdzIC49ICIgLVMgIiAuJEFSR1ZbKyskaV07Ci0gIH0KLSAgZWxzaWYgKCRhcmcgZXEgIi1zb3J0LWJhdGNoLXNpemUiKQotICB7Ci0JICAkc29ydEFyZ3MgLj0gIiAtLWJhdGNoLXNpemUgIiAuJEFSR1ZbKyskaV07Ci0gIH0KLSAgZWxzaWYgKCRhcmcgZXEgIi1zb3J0LWNvbXByZXNzIikKLSAgewotCSAgJHNvcnRBcmdzIC49ICIgLS1jb21wcmVzcy1wcm9ncmFtICIgLiRBUkdWWysrJGldOwotICB9Ci19Ci0JCQkJCQotbXkgJG91dAkJPSAkQVJHVltAQVJHViAtIDRdOwotbXkgJHZjYjEJPSAkQVJHVltAQVJHViAtIDNdOwotbXkgJHZjYjIJPSAkQVJHVltAQVJHViAtIDJdOwotbXkgJHNudDEyCT0gJEFSR1ZbQEFSR1YgLSAxXTsKLQotbXkgJFNPUlRfRVhFQyA9IGBnc29ydCAtLWhlbHAgMj4vZGV2L251bGxgOyAKLWlmKCRTT1JUX0VYRUMpIHsKLSAgJFNPUlRfRVhFQyA9ICdnc29ydCc7Ci19Ci1lbHNlIHsKLSAgJFNPUlRfRVhFQyA9ICdzb3J0JzsKLX0KLQotbXkgJFRNUERJUj1kaXJuYW1lKCRvdXQpOwotCi1teSAkY21kOwotJGNtZCA9ICIkQmluL3NudDJjb29jcm1wICR2Y2IxICR2Y2IyICRzbnQxMiAiOwotJGNtZCAuPSAifCAkU09SVF9FWEVDICRzb3J0QXJncyAtVCAkVE1QRElSIC1uayAxIC1uayAyIHwgdW5pcSA+ICRvdXQiOwotc3lzdGVtQ2hlY2soJGNtZCk7Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXN1YiBzeXN0ZW1DaGVjaygkKQotewotICBteSAkY21kID0gc2hpZnQ7Ci0JcHJpbnQgU1RERVJSICJFeGVjdXRpbmcgJGNtZCBcbiI7Ci0JCi0gIG15ICRyZXRWYWwgPSBzeXN0ZW0oJGNtZCk7Ci0gIGlmICgkcmV0VmFsICE9IDApCi0gIHsKLSAgICBleGl0KDEpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9zbnRwb3N0cHJvYy5weSBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9zbnRwb3N0cHJvYy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjNiZjUyOC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NjcmlwdHMvc250cG9zdHByb2MucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLSMgVGhpcyBzY3JpcHQgcG9zdCBwcm9jZXNzIHRoZSBzbnQgZmlsZSAtLSBlaXRoZXIgaW4gc2luZ2xlLWxpbmUgZm9ybWF0IG9yIGluIG11bHRpLWxpbmUgZm9ybWF0Ci0jIFRoZSBvdXRwdXQsIGhvd2V2ZXIsIHdpbGwgYWx3YXlzIGJlIGluIHNpbmdsZS1saW5lIGZvcm1hdAotCi1mcm9tIHN5cyBpbXBvcnQgKgotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCi1pbXBvcnQgcmU7Ci11c2FnZSA9ICIiIgotVGhlIHNjcmlwdCBwb3N0IHByb2Nlc3MgdGhlIHNudCBmaWxlLCB0aGUgaW5wdXQgY291bGQgYmUgc2luZ2xlLWxpbmUgc250IAotZmlsZSBvciBtdWx0aS1saW5lLCAodHJpcGxlIGxpbmUpIGFuZCBjYW4gaW5zZXJ0IHNlbnRlbmNlIHdlaWdodCB0byB0aGUKLWZpbGUgKC13KSBvciBhZGQgcGFydGlhbCBhbGlnbm1lbnQgdG8gdGhlIGZpbGUgKC1hKQotVXNhZ2UgJXByb2cgLXMgc250ZmlsZSAtdyB3ZWlnaHQtZmlsZSAtYSBhbGlnbmZpbGUgLW8gb3V0cHV0ZmlsZQotIiIiCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIodXNhZ2U9dXNhZ2UpCi0KLQotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLQotcGFyc2VyLmFkZF9vcHRpb24oIi1zIiwgIi0tc250IiwgZGVzdD0ic250IixkZWZhdWx0PU5vbmUsCi0JCWhlbHA9IlRoZSBpbnB1dCBzbnQgZmlsZSIsIG1ldGF2YXI9IkZJTEUiKQotCi1wYXJzZXIuYWRkX29wdGlvbigiLXciLCAiLS13ZWlnaHQiLCBkZXN0PSJ3ZWlnaHQiLGRlZmF1bHQ9Tm9uZSwKLQkJaGVscD0iVGhlIGlucHV0IHdlaWdodCBmaWxlIiwgbWV0YXZhcj0iRklMRSIpCi0KLQotcGFyc2VyLmFkZF9vcHRpb24oIi1vIiwgIi0tb3V0cHV0IiwgZGVzdD0ib3V0cHV0IixkZWZhdWx0PSItIiwKLQkJaGVscD0iVGhlIGlucHV0IHBhcnRpYWwgYWxpZ25tZW50IGZpbGUsIG9uZSBzZW50ZW5jZSBwZXIgbGluZSIsIG1ldGF2YXI9IkZJTEUiKQotCi1wYXJzZXIuYWRkX29wdGlvbigiLWEiLCAiLS1hbGlnbiIsIGRlc3Q9ImFsaWduIixkZWZhdWx0PU5vbmUsCi0JCWhlbHA9IlRoZSBpbnB1dCBwYXJ0aWFsIGFsaWdubWVudCBmaWxlLCBvbmUgc2VudGVuY2UgcGVyIGxpbmUiLCBtZXRhdmFyPSJGSUxFIikKLQotCi0ob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncygpCi0KLWlmIG9wdGlvbnMuc250ID09IE5vbmU6Ci0JcGFyc2VyLnByaW50X2hlbHAoKTsKLQlleGl0KCk7Ci1lbHNlOgotCXNmaWxlID0gb3BlbihvcHRpb25zLnNudCwiciIpOwotCi1pZiBvcHRpb25zLm91dHB1dD09Ii0iOgotCW9maWxlID0gc3Rkb3V0OwotZWxzZToKLQlvZmlsZSA9IG9wZW4ob3B0aW9ucy5vdXRwdXQsInciKTsKLQotd2ZpbGUgPSBOb25lOwotCi1pZiBvcHRpb25zLndlaWdodCA8PiBOb25lOgotCXdmaWxlID0gb3BlbihvcHRpb25zLndlaWdodCwiciIpOwotCi1hZmlsZSA9IE5vbmU7Ci1pZiBvcHRpb25zLmFsaWduIDw+IE5vbmU6Ci0JYWZpbGUgPSBvcGVuKG9wdGlvbnMuYWxpZ24sInIiKTsKLQotcnIgPSByZS5jb21waWxlKCJbXFx8XFwjXFwqXSIpOwotd3QgPSAwLjA7Ci1hbCA9IHt9OwotZSA9ICIiOwotZiA9ICIiOwotCi1kZWYgcGFyc2VfYXgobGluZSk6Ci0JYWxxID0ge307Ci0JYWxzID0gbGluZS5zdHJpcCgpLnNwbGl0KCIgIik7Ci0JZm9yIGUgaW4gYWxzOgotCQlpZiBsZW4oZS5zdHJpcCgpKT4wOgotCQkJYWxvID0gZS5zcGxpdCgiLSIpOwotCQkJaWYgbGVuKGFsbyk9PTI6Ci0JCQkJYWxxW3R1cGxlKGFsbyldID0gMTsKLQlyZXR1cm4gYWxxOwotCQotCi0KLQotCi0KLXdoaWxlIFRydWU6Ci0JbCA9IHNmaWxlLnJlYWRsaW5lKCk7Ci0JaWYgbGVuKGwpID09IDA6Ci0JCWJyZWFrOwotCWxwID0gcnIuc3BsaXQobC5zdHJpcCgpKTsKLQlpZiBsZW4obHApPj0zOgotCQl3dCA9IGZsb2F0KGxwWzBdKTsKLQkJZSA9IGxwWzFdOwotCQlmID0gbHBbMl07Ci0JCWlmIGxlbihscCkgPiAzOgotCQkJYWwgPSBwYXJzZV9heChscFszXSk7Ci0JCWVsc2U6Ci0JCQlhbCA9IHt9OwotCWVsc2U6Ci0JCXd0ID0gZmxvYXQobCk7Ci0JCWUgPSBzZmlsZS5yZWFkbGluZSgpLnN0cmlwKCk7Ci0JCWYgPSBzZmlsZS5yZWFkbGluZSgpLnN0cmlwKCk7Ci0JCWFsPXt9Ci0JaWYgd2ZpbGUgPD4gTm9uZToKLQkJbHcgPSB3ZmlsZS5yZWFkbGluZSgpLnN0cmlwKCk7Ci0JCWlmIGxlbihsdyk+MDoKLQkJCXd0ID0gZmxvYXQobHcpOwotCQllbHNlOgotCQkJd3QgPSAxOwotCWlmIGFmaWxlIDw+IE5vbmU6Ci0JCWxhID0gYWZpbGUucmVhZGxpbmUoKS5zdHJpcCgpOwotCQlpZiBsZW4obGEpPjA6Ci0JCQlhbDEgPSBwYXJzZV9heChsYSk7Ci0JCQlmb3IgZW50cnkgaW4gYWwxLmtleXMoKToKLQkJCQlhbFtlbnRyeV0gPSAxOwotCi0Jb2ZpbGUud3JpdGUoIiVnIHwgJXMgfCAlcyIgJSAod3QsIGUsIGYpKTsKLQlpZiBsZW4oYWwpPjA6Ci0JCW9maWxlLndyaXRlKCIgfCIpOwotCi0JCWZvciBlbnRyeSBpbiBhbC5rZXlzKCk6Ci0JCQlvZmlsZS53cml0ZSgiICVzLSVzIiAlIGVudHJ5KTsKLQlvZmlsZS53cml0ZSgiXG4iKTsKLQotCQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zY3JpcHRzL3N5bWFsLnNoIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zY3JpcHRzL3N5bWFsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQ2YmViLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc2NyaXB0cy9zeW1hbC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IGJhc2gKLQotT1VUUFVUPSQxCi1zaGlmdAotR0laQTJCQUw9JDEKLXNoaWZ0Ci1TWU1BTD0kMQotc2hpZnQKLVNUT1Q9JDEKLXNoaWZ0Ci1UVE9TPSQxCi1zaGlmdAotCi1wZXJsICRHSVpBMkJBTCAtZCAke1NUT1R9IC1pICR7VFRPU30gfCAkU1lNQUwgJCogPiAkT1VUUFVUIAotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy8uY3ZzaWdub3JlIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1MjcxZi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLmxpYnMKLS5kZXBzCi0uKnN3cAotLm5hdXRpbHVzLW1ldGFmaWxlLnhtbAotKi5hdXRvc2F2ZQotKi5iYWsKLSp+Ci0jKiMKLSouZ2xhZGVwCi0qLmxhCi0qLmxvCi0qLm8KLSouY2xhc3MKLSoucHljCi0qLnBsdWdpbgotTWFrZWZpbGUKLU1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9BVGFibGVzLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0FUYWJsZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2M0YWQyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0FUYWJsZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0KLUVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2luY2x1ZGUgIkFUYWJsZXMuaCIgCi0jaW5jbHVkZSAiR2xvYmFscy5oIgotI2luY2x1ZGUgIm15YXNzZXJ0LmgiCi0jaW5jbHVkZSAiUGFyYW1ldGVyLmgiCi0KLUdMT0JBTF9QQVJBTUVURVIoYm9vbCxDb21wYWN0QURUYWJsZSwiY29tcGFjdGFkdGFibGUiLCIxOiBvbmx5IDMtZGltZW5zaW9uYWwgYWxpZ25tZW50IHRhYmxlIGZvciBJQk0tMiBhbmQgSUJNLTMiLFBBUkxFVl9NT0RFTFMsMSk7Ci1HTE9CQUxfUEFSQU1FVEVSKGZsb2F0LGFtb2RlbF9zbW9vdGhfZmFjdG9yLCJtb2RlbDIzU21vb3RoRmFjdG9yIiwic21vb3RoaW5nIHBhcmFtZXRlciBmb3IgSUJNLTIvMyAoaW50ZXJwb2xhdGlvbiB3aXRoIGNvbnN0YW50KSIsUEFSTEVWX1NNT09USCwwLjApOwotCi10ZW1wbGF0ZSA8Y2xhc3MgVkFMVFlQRT4KLXZvaWQgYW1vZGVsPFZBTFRZUEU+OjpwcmludFRhYmxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBjb25zdHsKLSAgLy8gcHJpbnQgYW1vZGVsIHRvIGZpbGUgd2l0aCB0aGUgbmFtZSBmaWxlbmFtZSAoaXQnbGwgYmUgY3JlYXRlZCBvciBvdmVyd3JpdHRlbiAKLSAgLy8gZm9ybWF0IDogZm9yIGEgdGFibGUgOiAKLSAgLy8gICAgICAgICAgICAgIGFqIGogbCBtICB2YWwgCi0gIC8vIHdoZXJlIGFqIGlzIHNvdXJjZSB3b3JkIHBvcywgaiB0YXJnZXQgd29yZCBwb3MsIGwgc291cmNlIHNlbnRlbmNlIGxlbmd0aCwgCi0gIC8vICAgICAgIG0gaXMgdGFyZ2V0IHNlbnRlbmNlIGxlbmd0aC4KLSAgLy8gICAgICAgICAgCi0gIC8vcmV0dXJuOwotICAgIGlmIChpc19kaXN0b3J0aW9uKQotICAgICAgICBjb3V0IDw8ICJEdW1waW5nIHBydW5lZCBkaXN0b3J0aW9uIHRhYmxlIChkKSB0byBmaWxlOiIgPDwgZmlsZW5hbWUgPDwnXG4nOwotICAgIGVsc2UgCi0gICAgICAgIGNvdXQgPDwgIkR1bXBpbmcgcHJ1bmVkIGFsaWdubWVudCB0YWJsZSAoYSkgdG8gZmlsZToiIDw8IGZpbGVuYW1lIDw8J1xuJzsKLSAgICAKLSAgICBvZnN0cmVhbSBvZihmaWxlbmFtZSk7Ci0gICAgZG91YmxlIHNzdW09MC4wOwotICAgIGZvcihXb3JkSW5kZXggbD0wOyBsIDwgTWF4U2VudExlbmd0aDsgbCsrKXsKLSAgICAgICAgZm9yKFdvcmRJbmRleCBtPTA7bTxNYXhTZW50TGVuZ3RoO20rKyl7Ci0gICAgICAgICAgICBpZiggQ29tcGFjdEFEVGFibGUgJiYgbCE9bSApCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgTD0oKENvbXBhY3RBRFRhYmxlJiZpc19kaXN0b3J0aW9uKT9NYXhTZW50TGVuZ3RoOihsKzEpKS0xOwotICAgICAgICAgICAgdW5zaWduZWQgaW50IE09KChDb21wYWN0QURUYWJsZSYmIWlzX2Rpc3RvcnRpb24pP01heFNlbnRMZW5ndGg6KG0rMSkpLTE7Ci0gICAgICAgICAgICBpZiggaXNfZGlzdG9ydGlvbj09MCApewotICAgICAgICAgICAgICAgIGZvcihXb3JkSW5kZXggaj0xO2o8PU07IGorKyl7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzdW09MC4wOwotICAgICAgICAgICAgICAgICAgICBmb3IoV29yZEluZGV4IGk9MDtpPD1MOyBpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgVkFMVFlQRSB4PWdldFZhbHVlKGksIGosIEwsIE0pOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4PlBST0JfU01PT1RIICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgPDwgaSA8PCAnICcgPDwgaiA8PCAnICcgPDwgTCA8PCAnICcgPDwgTSA8PCAnICcgPDwgeCA8PCAnXG4nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSs9eDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzc3VtKz1zdW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgZm9yKFdvcmRJbmRleCBpPTA7aTw9TDtpKyspewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3VtPTAuMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yKFdvcmRJbmRleCBqPTE7ajw9TTtqKyspewotICAgICAgICAgICAgICAgICAgICAgICAgVkFMVFlQRSB4PWdldFZhbHVlKGosIGksIEwsIE0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHg+UFJPQl9TTU9PVEggKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiA8PCBqIDw8ICcgJyA8PCBpIDw8ICcgJyA8PCBMIDw8ICcgJyA8PCBNIDw8ICcgJyA8PCB4IDw8ICdcbic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKz14OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNzdW0rPXN1bTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBWQUxUWVBFPgotdm9pZCBhbW9kZWw8VkFMVFlQRT46OnByaW50UmVhbFRhYmxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBjb25zdHsKLSAgLy8gcHJpbnQgYW1vZGVsIHRvIGZpbGUgd2l0aCB0aGUgbmFtZSBmaWxlbmFtZSAoaXQnbGwgYmUgY3JlYXRlZCBvciBvdmVyd3JpdHRlbiAKLSAgLy8gZm9ybWF0IDogZm9yIGEgdGFibGUgOiAKLSAgLy8gICAgICAgICAgICAgIGFqIGogbCBtICB2YWwgCi0gIC8vIHdoZXJlIGFqIGlzIHNvdXJjZSB3b3JkIHBvcywgaiB0YXJnZXQgd29yZCBwb3MsIGwgc291cmNlIHNlbnRlbmNlIGxlbmd0aCwgCi0gIC8vICAgICAgIG0gaXMgdGFyZ2V0IHNlbnRlbmNlIGxlbmd0aC4KLSAgLy8gICAgICAgICAgCi0gIC8vcmV0dXJuOwotICAgIGlmIChpc19kaXN0b3J0aW9uKQotICAgICAgICBjb3V0IDw8ICJEdW1waW5nIG5vdCBwcnVuZWQgZGlzdG9ydGlvbiB0YWJsZSAoZCkgdG8gZmlsZToiIDw8IGZpbGVuYW1lIDw8J1xuJzsKLSAgICBlbHNlIAotICAgICAgICBjb3V0IDw8ICJEdW1waW5nIG5vdCBwcnVuZWQgYWxpZ25tZW50IHRhYmxlIChhKSB0byBmaWxlOiIgPDwgZmlsZW5hbWUgPDwnXG4nOwotICAgIAotICAgIG9mc3RyZWFtIG9mKGZpbGVuYW1lKTsKLSAgICBmb3IoV29yZEluZGV4IGw9MDsgbCA8IE1heFNlbnRMZW5ndGg7IGwrKyl7Ci0gICAgICAgIGZvcihXb3JkSW5kZXggbT0wO208TWF4U2VudExlbmd0aDttKyspewotICAgICAgICAgICAgaWYoICBDb21wYWN0QURUYWJsZSAmJiBsIT1tICkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBMPSgoQ29tcGFjdEFEVGFibGUmJmlzX2Rpc3RvcnRpb24pP01heFNlbnRMZW5ndGg6KGwrMSkpLTE7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgTT0oKENvbXBhY3RBRFRhYmxlJiYhaXNfZGlzdG9ydGlvbik/TWF4U2VudExlbmd0aDoobSsxKSktMTsKLSAgICAgICAgICAgIGlmKCBpc19kaXN0b3J0aW9uPT0wICl7Ci0gICAgICAgICAgICAgICAgZm9yKFdvcmRJbmRleCBqPTE7ajw9TTsgaisrKXsKLSAgICAgICAgICAgICAgICAgICAgZm9yKFdvcmRJbmRleCBpPTA7aTw9TDsgaSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIFZBTFRZUEUgeD1nZXRWYWx1ZShpLCBqLCBMLCBNKTsgCi0JCQkJCQlpZiggeD5NSU5DT1VOVElOQ1JFQVNFICkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIDw8IGkgPDwgJyAnIDw8IGogPDwgJyAnIDw8IEwgPDwgJyAnIDw8IE0gPDwgJyAnIDw8IHggPDwgJ1xuJzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIGZvcihXb3JkSW5kZXggaT0wO2k8PUw7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgZm9yKFdvcmRJbmRleCBqPTE7ajw9TTtqKyspewotICAgICAgICAgICAgICAgICAgICAgICAgVkFMVFlQRSB4PWdldFZhbHVlKGosIGksIEwsIE0pOwotCQkJCQkJaWYoIHg+TUlOQ09VTlRJTkNSRUFTRSApCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiA8PCBqIDw8ICcgJyA8PCBpIDw8ICcgJyA8PCBMIDw8ICcgJyA8PCBNIDw8ICcgJyA8PCB4IDw8ICdcbic7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1leHRlcm4gc2hvcnQgTm9FbXB0eVdvcmQ7Ci0KLXRlbXBsYXRlIDxjbGFzcyBWQUxUWVBFPgotYm9vbCBhbW9kZWw8VkFMVFlQRT46OnJlYWRUYWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSl7Ci0gIC8qIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGEgdGFibGUgZnJvbSBhIGZpbGUuCi0gICAgIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybWF0OiAgYWogaiBsIG0gIHZhbAotICAgICB3aGVyZSBhaiBpcyB0aGUgc291cmNlIHdvcmQgcG9zaXRpb24sIGogdGhlIHRhcmdldCB3b3JkIHBvc2l0aW9uLCAKLSAgICAgbCB0aGUgc291cmNlIHNlbnRlbmNlIGxlbmd0aCwgYW5kIG0gdGhlIHRhcmdldCBzZW50ZW5jZSBsZW5ndGgKLSAgICAgCi0gICAgIFRoaXMgZnVuY3Rpb24gYWxzbyB3b3JrcyBmb3IgYSBkIHRhYmxlLCB3aGVyZSB0aGUgcG9zaXRpb25zCi0gICAgIG9mIGFqIGFuZCBpIGFyZSBzd2FwcGVkLiAgQm90aCB0aGUgYSBhbmQgZCB0YWJsZXMgYXJlIDQgZGltZW5zaW9uYWwKLSAgICAgaGFzaGVzOyB0aGlzIGZ1bmN0aW9uIHdpbGwgc2ltcGx5IHJlYWQgaW4gdGhlIGZvdXIgdmFsdWVzIGFuZCBrZWVwCi0gICAgIHRoZW0gaW4gdGhhdCBvcmRlciB3aGVuIGhhc2hpbmcgdGhlIGZpZnRoIHZhbHVlLgotICAgICBOQVMsIDcvMTEvOTkKLSAgKi8KLSAgICBpZnN0cmVhbSBpbmYoZmlsZW5hbWUpOwotICAgIGNvdXQgPDwgIlJlYWRpbmcgYS9kIHRhYmxlIGZyb20gIiA8PCBmaWxlbmFtZSA8PCAiXG4iOwotICAgIGlmKCFpbmYpewotICAgICAgICBjZXJyIDw8ICJcbkVSUk9SOiBDYW5ub3Qgb3BlbiAiIDw8IGZpbGVuYW1lPDwiXG4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFdvcmRJbmRleCB3LCB4LCBsLCBtOwotICAgIFZBTFRZUEUgcHJvYjsKLSAgICB3aGlsZShpbmYgPj4gdyA+PiB4ID4+IGwgPj4gbSA+PiBwcm9iICkKLSAgICAgICAgLy8gdGhlIE5VTEwgd29yZCBpcyBhZGRlZCB0byB0aGUgbGVuZ3RoCi0gICAgICAgIC8vIG9mIHRoZSBzZW50ZW5jZSBpbiB0aGUgdGFibGVzLCBidXQgZGlzY291bnQgaXQgd2hlbiB5b3Ugd3JpdGUgdGhlIHRhYmxlcy4gCi0gICAgICAgIHNldFZhbHVlKHcsIHgsIGwsIG0sIHByb2IpOwotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVkFMVFlQRT4KLWJvb2wgYW1vZGVsPFZBTFRZUEU+OjpyZWFkQXVnVGFibGUoY29uc3QgY2hhciAqZmlsZW5hbWUpewotICAvKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBhIHRhYmxlIGZyb20gYSBmaWxlLgotICAgICBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm1hdDogIGFqIGogbCBtICB2YWwKLSAgICAgd2hlcmUgYWogaXMgdGhlIHNvdXJjZSB3b3JkIHBvc2l0aW9uLCBqIHRoZSB0YXJnZXQgd29yZCBwb3NpdGlvbiwgCi0gICAgIGwgdGhlIHNvdXJjZSBzZW50ZW5jZSBsZW5ndGgsIGFuZCBtIHRoZSB0YXJnZXQgc2VudGVuY2UgbGVuZ3RoCi0gICAgIAotICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gd29ya3MgZm9yIGEgZCB0YWJsZSwgd2hlcmUgdGhlIHBvc2l0aW9ucwotICAgICBvZiBhaiBhbmQgaSBhcmUgc3dhcHBlZC4gIEJvdGggdGhlIGEgYW5kIGQgdGFibGVzIGFyZSA0IGRpbWVuc2lvbmFsCi0gICAgIGhhc2hlczsgdGhpcyBmdW5jdGlvbiB3aWxsIHNpbXBseSByZWFkIGluIHRoZSBmb3VyIHZhbHVlcyBhbmQga2VlcAotICAgICB0aGVtIGluIHRoYXQgb3JkZXIgd2hlbiBoYXNoaW5nIHRoZSBmaWZ0aCB2YWx1ZS4KLSAgICAgTkFTLCA3LzExLzk5Ci0gICovCi0gICAgaWZzdHJlYW0gaW5mKGZpbGVuYW1lKTsKLSAgICBjb3V0IDw8ICJSZWFkaW5nIGEvZCB0YWJsZSBmcm9tICIgPDwgZmlsZW5hbWUgPDwgIlxuIjsKLSAgICBpZighaW5mKXsKLSAgICAgICAgY2VyciA8PCAiXG5FUlJPUjogQ2Fubm90IG9wZW4gIiA8PCBmaWxlbmFtZTw8IlxuIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBXb3JkSW5kZXggdywgeCwgbCwgbTsKLSAgICBWQUxUWVBFIHByb2I7Ci0gICAgd2hpbGUoaW5mID4+IHcgPj4geCA+PiBsID4+IG0gPj4gcHJvYiApCi0gICAgICAgIC8vIHRoZSBOVUxMIHdvcmQgaXMgYWRkZWQgdG8gdGhlIGxlbmd0aAotICAgICAgICAvLyBvZiB0aGUgc2VudGVuY2UgaW4gdGhlIHRhYmxlcywgYnV0IGRpc2NvdW50IGl0IHdoZW4geW91IHdyaXRlIHRoZSB0YWJsZXMuIAotICAgICAgICBhZGRWYWx1ZSh3LCB4LCBsLCBtLCBwcm9iKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFZBTFRZUEU+Ci1ib29sIGFtb2RlbDxWQUxUWVBFPjo6bWVyZ2UoYW1vZGVsPFZBTFRZUEU+JiBhbSl7Ci0gICAgY291dCA8PCAic3RhcnQgbWVyZ2luZyAiIDw8IlxuIjsKLSAgICBmb3IoV29yZEluZGV4IGw9MDsgbCA8IE1heFNlbnRMZW5ndGg7IGwrKyl7Ci0gICAgICAgIGZvcihXb3JkSW5kZXggbT0wO208TWF4U2VudExlbmd0aDttKyspewotICAgICAgICAgICAgaWYoICBDb21wYWN0QURUYWJsZSAmJiBsIT1tICkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBMPSgoQ29tcGFjdEFEVGFibGUmJmlzX2Rpc3RvcnRpb24pP01heFNlbnRMZW5ndGg6KGwrMSkpLTE7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgTT0oKENvbXBhY3RBRFRhYmxlJiYhaXNfZGlzdG9ydGlvbik/TWF4U2VudExlbmd0aDoobSsxKSktMTsKLSAgICAgICAgICAgIGlmKCBpc19kaXN0b3J0aW9uPT0wICl7Ci0gICAgICAgICAgICAgICAgZm9yKFdvcmRJbmRleCBqPTE7ajw9TTsgaisrKXsKLSAgICAgICAgICAgICAgICAgICAgZm9yKFdvcmRJbmRleCBpPTA7aTw9TDsgaSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIFZBTFRZUEUgeD1hbS5nZXRWYWx1ZShpLCBqLCBMLCBNKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRWYWx1ZShpLGosTCxNLHgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgZm9yKFdvcmRJbmRleCBpPTA7aTw9TDtpKyspewotICAgICAgICAgICAgICAgICAgICBmb3IoV29yZEluZGV4IGo9MTtqPD1NO2orKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWQUxUWVBFIHg9YW0uZ2V0VmFsdWUoaiwgaSwgTCwgTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRWYWx1ZShqLGksTCxNLHgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi0KLXRlbXBsYXRlIGNsYXNzIGFtb2RlbDxDT1VOVD4gOyAKLS8vdGVtcGxhdGUgY2xhc3MgYW1vZGVsPFBST0I+IDsgCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9BVGFibGVzLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9BVGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjc3YjEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvQVRhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qCi0KLUVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIE1vZHVsZSA6QVRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBQcm90b3R5cGVzIEZpbGU6IEFUYWJsZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogT2JqZWN0aXZlOiBEZWZpbmVzIGNsYXNlcyBhbmQgbWV0aG9kcyBmb3IgaGFuZGxpbmcgSS9PIGZvciBkaXN0b3J0aW9uICAmICAqCi0gKiAgICAgICAgICAgIGFsaWdubWVudCB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfYXRhYmxlc19oCi0jZGVmaW5lIF9hdGFibGVzX2ggMQotCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlICJWZWN0b3IuaCIKLSNpbmNsdWRlIDx1dGlsaXR5PgotI2lmIF9fR05VQ19fPjIKLSNpbmNsdWRlIDxleHQvaGFzaF9tYXA+Ci11c2luZyBfX2dudV9jeHg6Omhhc2hfbWFwOwotI2Vsc2UKLSNpbmNsdWRlIDxoYXNoX21hcD4KLSNlbmRpZgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSAiQXJyYXk0LmgiCi0jaW5jbHVkZSAibXlhc3NlcnQuaCIKLSNpbmNsdWRlICJHbG9iYWxzLmgiCi0jaW5jbHVkZSAic3luY09iai5oIgotCi1leHRlcm4gYm9vbCBDb21wYWN0QURUYWJsZTsKLWV4dGVybiBmbG9hdCBhbW9kZWxfc21vb3RoX2ZhY3RvcjsKLWV4dGVybiBzaG9ydCBOb0VtcHR5V29yZDsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBDbGFzcyBEZWZpbnRpb25zIG9mIGFtb2RlbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ2xhc3MgTmFtZTogYW1vZGVsOgotICAgT2JqZWN0aXZlOiBUaGlzIGRlZmluZXMgdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmUgZm9yIGRpc3RvcnRpb250IHByb2IuCi0gICBhbmQgY291bnQgdGFibGVzLiBUaGV5IGFyZSBkZWZpbmVkIGFzIGEgaGFzaCB0YWJsZS4gRWFjaCBlbnRyeSBpbiB0aGUgaGFzaAotICAgdGFibGUgaXMgdGhlIHByb2JhYmlsaXR5IChkKGovbCxtLGkpLCB3aGVyZSBqIGlzIHdvcmQgdGFyZ2V0IHBvc2l0aW9uLCBpIGlzCi0gICBzb3VyY2Ugd29yZCBwb3NpdGlvbiBjb25uZWN0ZWQgdG8gaXQsIG0gaXMgdGFyZ2V0IHNlbnRlbmNlIGxlbmd0aCwgYW5kIGwgaXMKLSAgIHNvdXJjZSBzZW50ZW5jZSBsZW5ndGgpIG9yIGNvdW50IGNvbGxlY3RlZCBmb3IgaXQuIFRoZSAgcHJvYmFiaWxpdHkgYW5kIHRoZQotICAgY291bnQgYXJlIHJlcHJlc2VudGVkIGFzIGxvZyBpbnRlZ2VyIHByb2JhYmlsaXR5IGFzIAotICAgZGVmaW5lZCBieSB0aGUgY2xhc3MgTG9nUHJvYiAuICAKLQotICBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50cyBhIFRhYmxlcyAocHJvYmFiaWxpaXR5KSBhbmQgZCAoZGlzdG9ydGlvbikKLSAgdGFibGVzIGFuZCBhbHNvIHRoZWlyIGNvcnJlc3BvbmRpbmcgY291bnQgdGFibGVzIC4KLSAgCi0gICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWlubGluZSBpbnQgTWFicyhpbnQgYSl7Ci0gICAgaWYoYTwwKQotICAgICAgICByZXR1cm4gLWE7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFZBTFRZUEU+Ci1jbGFzcyBhbW9kZWx7Ci1wdWJsaWM6Ci0gICAgQXJyYXk0PFZBTFRZUEU+IGE7Ci0gICAgYm9vbCBpc19kaXN0b3J0aW9uIDsgCi0gICAgV29yZEluZGV4IE1heFNlbnRMZW5ndGg7Ci0gICAgYm9vbCBpZ25vcmVMLCBpZ25vcmVNOwotICAgIFZBTFRZUEUgZ2V0KFdvcmRJbmRleCBhaiwgV29yZEluZGV4IGosIFdvcmRJbmRleCBsLCBXb3JkSW5kZXggbSljb25zdHsKLSAgICAgICAgbWFzc2VydCggKCFpc19kaXN0b3J0aW9uKSB8fCBhajw9bSApO21hc3NlcnQoICghaXNfZGlzdG9ydGlvbikgfHwgajw9bCApO21hc3NlcnQoICghaXNfZGlzdG9ydGlvbikgfHwgYWohPTAgKTsKLSAgICAgICAgbWFzc2VydCggaXNfZGlzdG9ydGlvbiAgICB8fCBhajw9bCApO21hc3NlcnQoIGlzX2Rpc3RvcnRpb24gICAgfHwgajw9bSApO21hc3NlcnQoIChpc19kaXN0b3J0aW9uKSB8fCBqIT0wICk7Ci0gICAgICAgIG1hc3NlcnQoIGw8TWF4U2VudExlbmd0aCApO21hc3NlcnQoIG08TWF4U2VudExlbmd0aCApOwotICAgICAgICByZXR1cm4gYS5nZXQoYWosIGosIChDb21wYWN0QURUYWJsZSYmaXNfZGlzdG9ydGlvbik/TWF4U2VudExlbmd0aDoobCsxKSwoQ29tcGFjdEFEVGFibGUmJiFpc19kaXN0b3J0aW9uKT9NYXhTZW50TGVuZ3RoOihtKzEpKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIGZsb2F0IHNtb290aF9mYWN0b3I7Ci0gICAgYW1vZGVsKGJvb2wgZmxhZyA9IGZhbHNlKQotICAgICAgICA6IGEoTUFYX1NFTlRFTkNFX0xFTkdUSCsxLDAuMCksIGlzX2Rpc3RvcnRpb24oZmxhZyksIE1heFNlbnRMZW5ndGgoTUFYX1NFTlRFTkNFX0xFTkdUSCkKLSAgICB7bG9jayA9IG5ldyBNdXRleCgpO307IAotCi0JfmFtb2RlbCgpe2RlbGV0ZSBsb2NrO307Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgVkFMVFlQRSZnZXRSZWYoV29yZEluZGV4IGFqLCBXb3JkSW5kZXggaiwgV29yZEluZGV4IGwsIFdvcmRJbmRleCBtKXsKLSAgICAgICAgbWFzc2VydCggKCFpc19kaXN0b3J0aW9uKSB8fCBhajw9bSApO21hc3NlcnQoICghaXNfZGlzdG9ydGlvbikgfHwgajw9bCApOwotICAgICAgICBtYXNzZXJ0KCBpc19kaXN0b3J0aW9uICAgIHx8IGFqPD1sICk7bWFzc2VydCggaXNfZGlzdG9ydGlvbiAgICB8fCBqPD1tICk7bWFzc2VydCggKGlzX2Rpc3RvcnRpb24pIHx8IGohPTAgKTsKLSAgICAgICAgbWFzc2VydCggbDxNYXhTZW50TGVuZ3RoICk7bWFzc2VydCggbTxNYXhTZW50TGVuZ3RoICk7Ci0gICAgICAgIHJldHVybiBhKGFqLCBqLCAoQ29tcGFjdEFEVGFibGUmJmlzX2Rpc3RvcnRpb24pP01heFNlbnRMZW5ndGg6KGwrMSksKENvbXBhY3RBRFRhYmxlJiYhaXNfZGlzdG9ydGlvbik/TWF4U2VudExlbmd0aDoobSsxKSk7Ci0gICAgfQotcHVibGljOgotICAgIHZvaWQgc2V0VmFsdWUoV29yZEluZGV4IGFqLCBXb3JkSW5kZXggaiwgV29yZEluZGV4IGwsIFdvcmRJbmRleCBtLCBWQUxUWVBFIHZhbCkgewotICAgIAlsb2NrLT5sb2NrKCk7Ci0gICAgICAgIGdldFJlZihhaiwgaiwgbCwgbSk9dmFsOwotICAgICAgICBsb2NrLT51bmxvY2soKTsKLSAgICB9Ci0gICAgCi0gICAgTXV0ZXgqIGxvY2s7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgQnkgUWluCi0gICAgKi8KLSAgICB2b2lkIGFkZFZhbHVlKFdvcmRJbmRleCBhaiwgV29yZEluZGV4IGosIFdvcmRJbmRleCBsLCBXb3JkSW5kZXggbSwgVkFMVFlQRSB2YWwpIHsKLSAgICAJbG9jay0+bG9jaygpOwotICAgICAgICBnZXRSZWYoYWosIGosIGwsIG0pKz12YWw7Ci0gICAgICAgIGxvY2stPnVubG9jaygpOwotICAgIH0KLSAgICBib29sIG1lcmdlKGFtb2RlbDxWQUxUWVBFPiYgYW0pOwotICAgIFZBTFRZUEUgZ2V0VmFsdWUoV29yZEluZGV4IGFqLCBXb3JkSW5kZXggaiwgV29yZEluZGV4IGwsIFdvcmRJbmRleCBtKSBjb25zdHsKLSAgICAgICAgaWYoIGlzX2Rpc3RvcnRpb249PTAgKQotICAgICAgICAgICAgcmV0dXJuIG1heChkb3VibGUoUFJPQl9TTU9PVEgpLGFtb2RlbF9zbW9vdGhfZmFjdG9yLyhsKzEpKygxLjAtYW1vZGVsX3Ntb290aF9mYWN0b3IpKmdldChhaiwgaiwgbCwgbSkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbWF4KGRvdWJsZShQUk9CX1NNT09USCksYW1vZGVsX3Ntb290aF9mYWN0b3IvbSsoMS4wLWFtb2RlbF9zbW9vdGhfZmFjdG9yKSpnZXQoYWosIGosIGwsIG0pKTsJCi0gICAgfQotICAgIAotICAgIHZvaWQgcHJpbnRUYWJsZShjb25zdCBjaGFyKiBmaWxlbmFtZSljb25zdCA7IAotICAgIHZvaWQgcHJpbnRSZWFsVGFibGUoY29uc3QgY2hhciogZmlsZW5hbWUpY29uc3QgOyAKLSAgICB0ZW1wbGF0ZTxjbGFzcyBDT1VOVD4KLSAgICAgICAgdm9pZCBub3JtYWxpemUoYW1vZGVsPENPVU5UPiYgYVRhYmxlKWNvbnN0Ci0gICAgewotICAgICAgICBXb3JkSW5kZXggaSwgaiwgbCwgbSA7Ci0gICAgICAgIENPVU5UIHRvdGFsOwotICAgICAgICBpbnQgblBhcmFtPTA7Ci0gICAgICAgIGZvcihsPTA7bDxNYXhTZW50TGVuZ3RoO2wrKyl7Ci0gICAgICAgICAgICBmb3IobT0wO208TWF4U2VudExlbmd0aDttKyspewotICAgICAgICAgICAgICAgIGlmKCBDb21wYWN0QURUYWJsZSAmJiBsIT1tICkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEw9KChDb21wYWN0QURUYWJsZSYmaXNfZGlzdG9ydGlvbik/TWF4U2VudExlbmd0aDoobCsxKSktMTsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgTT0oKENvbXBhY3RBRFRhYmxlJiYhaXNfZGlzdG9ydGlvbik/TWF4U2VudExlbmd0aDoobSsxKSktMTsKLSAgICAgICAgICAgICAgICBpZiggaXNfZGlzdG9ydGlvbj09MCApewotICAgICAgICAgICAgICAgICAgICBmb3Ioaj0xO2o8PU07IGorKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbD0wLjA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoaT0wO2k8PUw7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCs9Z2V0KGksIGosIEwsIE0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRvdGFsICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDtpPD1MO2krKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVGFibGUuZ2V0UmVmKGksIGosIEwsIE0pPWdldChpLCBqLCBMLCBNKS90b3RhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzc2VydChhVGFibGUuZ2V0UmVmKGksaixMLE0pPD0xLjApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTm9FbXB0eVdvcmQmJmk9PTAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVRhYmxlLmdldFJlZihpLGosTCxNKT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wO2k8PUw7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsPTAuMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihqPTE7ajw9TTtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwrPWdldChqLCBpLCBMLCBNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0b3RhbCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGo9MTtqPD1NO2orKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFUYWJsZS5nZXRSZWYoaiwgaSwgTCwgTSk9YW1vZGVsX3Ntb290aF9mYWN0b3IvTSsoMS4wLWFtb2RlbF9zbW9vdGhfZmFjdG9yKSpnZXQoaiwgaSwgTCwgTSkvdG90YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNzZXJ0KGFUYWJsZS5nZXRSZWYoaixpLEwsTSk8PTEuMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBOb0VtcHR5V29yZCYmaT09MCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVGFibGUuZ2V0UmVmKGosaSxMLE0pPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvdXQgPDwgIkEvRCB0YWJsZSBjb250YWlucyAiIDw8IG5QYXJhbSA8PCAiIHBhcmFtZXRlcnMuXG4iOwotICAgIH0KLSAgICAKLSAgICBib29sIHJlYWRUYWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7IAotICAgIGJvb2wgcmVhZEF1Z1RhYmxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsgCi0gICAgdm9pZCBjbGVhcigpCi0gICAge2EuY2xlYXIoKTt9Ci19OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvZiBhbW9kZWwgQ2xhc3MgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvQWxpZ25UYWJsZXMuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvQWxpZ25UYWJsZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzM1Yjc3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0FsaWduVGFibGVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0KLUVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2luY2x1ZGUgIkFsaWduVGFibGVzLmgiCi0KLWJvb2wgYWxpZ25tb2RlbDo6aW5zZXJ0KFZlY3RvcjxXb3JkSW5kZXg+JiBhaiwgTG9nUHJvYiB2YWwpCi17Ci0gIGFsaWdubWVudF9oYXNoOjppdGVyYXRvciBpOwotICBpID0gYS5maW5kKGFqKTsKLSAgaWYoaSAhPSBhLmVuZCgpIHx8IHZhbCA8PSAwKQotICAgIHJldHVybiBmYWxzZSA7Ci0gIGEuaW5zZXJ0KHBhaXI8Y29uc3QgVmVjdG9yPFdvcmRJbmRleD4sIExvZ1Byb2I+KGFqLCB2YWwpKTsKLSAgcmV0dXJuIHRydWUgOwotfQotIAotCi1Mb2dQcm9iIGFsaWdubW9kZWw6OmdldFZhbHVlKFZlY3RvcjxXb3JkSW5kZXg+JiBhbGlnbikgY29uc3QKLXsKLSAgY29uc3QgTG9nUHJvYiB6ZXJvID0gMC4wIDsKLSAgYWxpZ25tZW50X2hhc2g6OmNvbnN0X2l0ZXJhdG9yIGk7Ci0gIGkgPSBhLmZpbmQoYWxpZ24pOwotICBpZihpID09IGEuZW5kKCkpCi0gICAgcmV0dXJuIHplcm87Ci0gIGVsc2UKLSAgICByZXR1cm4gKCppKS5zZWNvbmQ7Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9BbGlnblRhYmxlcy5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvQWxpZ25UYWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjYTdhNi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9BbGlnblRhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qDQotDQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbg0KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4NCi0NCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMg0KLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KLQ0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCANCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KLQ0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgDQotVVNBLg0KLQ0KLSovDQotI2lmbmRlZiBfYWxpZ250YWJsZXNfaA0KLSNkZWZpbmUgX2FsaWdudGFibGVzX2ggMQ0KLQ0KLSNpbmNsdWRlICJkZWZzLmgiDQotIA0KLQ0KLSNpbmNsdWRlIDxjYXNzZXJ0Pg0KLSANCi0jaW5jbHVkZSA8aW9zdHJlYW0+DQotI2luY2x1ZGUgPGFsZ29yaXRobT4NCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4NCi0jaW5jbHVkZSA8bWFwPg0KLSNpbmNsdWRlIDxzZXQ+DQotLy8jaW5jbHVkZSA8dmVjdG9yPg0KLSNpbmNsdWRlICJWZWN0b3IuaCINCi0jaW5jbHVkZSA8dXRpbGl0eT4NCi0jaWYgX19HTlVDX18+Mg0KLSNpbmNsdWRlIDxleHQvaGFzaF9tYXA+DQotdXNpbmcgX19nbnVfY3h4OjpoYXNoX21hcDsNCi0jZWxzZQ0KLSNpbmNsdWRlIDxoYXNoX21hcD4NCi0jZW5kaWYNCi0jaW5jbHVkZSA8bWF0aC5oPg0KLSNpbmNsdWRlIDxmc3RyZWFtPg0KLSNpbmNsdWRlICJ0cmFuc3BhaXJfbW9kZWwxLmgiDQotDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgRGVmaW50aW9ucyBmb3IgaGFzaG15YWxpZ25tZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgT2JqZWN0aXZlOiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGVmaW5lIGEgaGFzaCBtYXBwaW5nIGZ1bmN0aW9uIHRvIG1hcA0KLSAgIGFuIGFsaWdubWVudCAoZGVmaW5lZCBhcyBhIHZlY3RvciBvZiBpbnRlZ2VycykgaW50byBhIGhhc2gga2V5DQotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLWNsYXNzIGhhc2hteWFsaWdubWVudCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjwgVmVjdG9yPFdvcmRJbmRleD4sIHNpemVfdCA+DQotew0KLXB1YmxpYzoNCi0gIHNpemVfdCBvcGVyYXRvcigpIChjb25zdCBWZWN0b3I8V29yZEluZGV4PiYga2V5KSBjb25zdA0KLSAgICAvLyB0byBkZWZpbmUgdGhlIG1hcHBpbmcgZnVuY3Rpb24uIGl0IHRha2VzIGFuIGFsaWdubWVudCAoYSB2ZWN0b3Igb2YNCi0gICAgLy8gaW50ZWdlcnMpIGFuZCBpdCByZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgKGhhc2gga2V5KS4gDQotICAgIHsNCi0gICAgICBXb3JkSW5kZXggaiA7DQotICAgICAgc2l6ZV90IHMgIDsNCi0gICAgICBzaXplX3Qga2V5X3N1bSA9IDAgOw0KLSAgICAgIC8vICAgICAgbG9nbXNnIDw8ICJGb3IgYWxpZ25tZW50OiIgOw0KLSAgICAgIGZvciAoaiA9IDEgOyBqIDwga2V5LnNpemUoKSA7IGorKyl7DQotCS8vCWxvZ21zZyA8PCAiICIgPDwga2V5W2pdIDsNCi0Ja2V5X3N1bSArPSAoc2l6ZV90KSAoaW50KSBwb3coZG91YmxlKGtleVtqXSksIGRvdWJsZSgoaiAlIDYpKzEpKTsNCi0gICAgICB9DQotICAgICAgLy8gICAgICBsb2dtc2cgPDwgIiAsIEtleSB2YWx1ZSB3YXMgOiAiIDw8ICBrZXlfc3VtOw0KLSAgICAgIHMgPSBrZXlfc3VtICUgMTAwMDAwMCA7ICAgICAgDQotICAgICAgLy8gICAgICBsb2dtc2cgPDwgIiBoKGspID0gIiA8PCBzIDw8IGVuZGwgOw0KLSAgICAgIHJldHVybihzKTsNCi0gICAgfQ0KLSNpZmRlZiBXSU4zMg0KLSAgZW51bQ0KLSAgewkvLyBwYXJhbWV0ZXJzIGZvciBoYXNoIHRhYmxlDQotCSAgYnVja2V0X3NpemUgPSAxCQkvLyAwIDwgYnVja2V0X3NpemUNCi0gIH07DQotDQotICBib29sIG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yPFdvcmRJbmRleD4gdDEsIA0KLQkgIGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+IHQyKSBjb25zdA0KLSAge1dvcmRJbmRleCBqIDsNCi0gIGlmICh0MS5zaXplKCkgIT0gdDIuc2l6ZSgpKQ0KLQkgIHJldHVybihmYWxzZSk7DQotICBmb3IgKGogPSAxIDsgaiA8IHQxLnNpemUoKSA7IGorKykNCi0JICBpZiAodDFbal0gIT0gdDJbal0pDQotCQkgIHJldHVybihmYWxzZSk7DQotICByZXR1cm4odHJ1ZSk7DQotICB9DQotI2VuZGlmDQotfTsNCi0NCi0jaWZuZGVmIFdJTjMyDQotY2xhc3MgZXF1YWxfdG9fbXlhbGlnbm1lbnR7DQotICAvLyByZXR1cm5zIHRydWUgaWYgdHdvIGFsaWdubWVudHMgYXJlIHRoZSBzYW1lICh0d28gdmVjdG9ycyBoYXZlIHNhbWUgZW50aWVzKQ0KLXB1YmxpYzoNCi0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBWZWN0b3I8V29yZEluZGV4PiB0MSwgDQotCQkgIGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+IHQyKSBjb25zdA0KLSAgICB7V29yZEluZGV4IGogOw0KLSAgICBpZiAodDEuc2l6ZSgpICE9IHQyLnNpemUoKSkNCi0gICAgICByZXR1cm4oZmFsc2UpOw0KLSAgICBmb3IgKGogPSAxIDsgaiA8IHQxLnNpemUoKSA7IGorKykNCi0gICAgICBpZiAodDFbal0gIT0gdDJbal0pDQotCXJldHVybihmYWxzZSk7DQotICAgIHJldHVybih0cnVlKTsNCi0gICAgfQ0KLSAgICANCi19Ow0KLSNlbmRpZg0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0gRW5kIG9mIENsYXNzIERlZm5pdGlvbiBmb3IgaGFzaG15YWxpZ25tZW50IC0tLS0tLS0tLS0tLS0tKi8NCi0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgRGVmaW50aW9ucyBmb3IgYWxpZ25tb2RlbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSBDbGFzcyBOYW1lOiBhbGlnbm1vZGVsDQotIE9iamVjdGl2ZTogQWxpZ25tZW50cyBuZWlnaGJvcmhob29kcyAoY29sbGVjdGlvbiBvZiBhbGlnbm1lbnRzKSBhcmUgc3RvcmVkIGluDQotIGEgaGFzaCB0YWJsZSAoZm9yIGVhc3kgbG9va3VwKS4gRWFjaCBhbGlnbm1lbnQgdmVjdG9yIGlzIG1hcHBlZCBpbnRvIGEgaGFzaCANCi0ga2V5IHVzaW5nIHRoZSBvcGVyYXRvciBkZWZpbmVkIGFib3ZlLg0KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLWNsYXNzIGFsaWdubW9kZWx7DQotcHJpdmF0ZToNCi0jaWZkZWYgV0lOMzINCi0gIHR5cGVkZWYgaGFzaF9tYXA8VmVjdG9yPFdvcmRJbmRleD4sIExvZ1Byb2IsIGhhc2hteWFsaWdubWVudCA+IGFsaWdubWVudF9oYXNoOw0KLQ0KLSNlbHNlDQotICB0eXBlZGVmIGhhc2hfbWFwPFZlY3RvcjxXb3JkSW5kZXg+LCBMb2dQcm9iLCBoYXNobXlhbGlnbm1lbnQsIGVxdWFsX3RvX215YWxpZ25tZW50ID4gYWxpZ25tZW50X2hhc2g7DQotDQotI2VuZGlmDQotICAgIGFsaWdubWVudF9oYXNoIGE7DQotcHJpdmF0ZToNCi0gIC8vICB2b2lkIGVyYXNlKFZlY3RvcjxXb3JkSW5kZXg+Jik7DQotcHVibGljOg0KLQ0KLSAgLy8gbWV0aG9kczsNCi0NCi0gIGlubGluZSBhbGlnbm1lbnRfaGFzaDo6aXRlcmF0b3IgYmVnaW4odm9pZCl7cmV0dXJuIGEuYmVnaW4oKTt9IC8vIGJlZ2luaW5nIG9mIGhhc2gNCi0gIGlubGluZSBhbGlnbm1lbnRfaGFzaDo6aXRlcmF0b3IgZW5kKHZvaWQpe3JldHVybiBhLmVuZCgpO30gLy8gZW5kIG9mIGhhc2gNCi0gIGlubGluZSBjb25zdCBhbGlnbm1lbnRfaGFzaCYgZ2V0SGFzaCgpIGNvbnN0IHtyZXR1cm4gYTt9OyAvLyByZWZlcmVuY2UgdG8gaGFzaCB0YWJsZQ0KLSAgYm9vbCBpbnNlcnQoVmVjdG9yPFdvcmRJbmRleD4mLCBMb2dQcm9iIHZhbD0wLjApOyAvLyBhZGQgYSBhbGlnbm1uZXQNCi0gLy8gIHZvaWQgc2V0VmFsdWUoVmVjdG9yPFdvcmRJbmRleD4mLCBMb2dQcm9iIHZhbCk7IC8vIG5vdCBuZWVkZWQNCi0gIExvZ1Byb2IgZ2V0VmFsdWUoVmVjdG9yPFdvcmRJbmRleD4mKWNvbnN0OyAvLyByZXRyaWV2ZSBwcm9iLiBvZiBhbGlnbm1lbnQNCi0gIGlubGluZSB2b2lkIGNsZWFyKHZvaWQpeyBhLmNsZWFyKCk7fTsgLy8gY2xlYXIgaGFzaCB0YWJsZSANCi0gIC8vICB2b2lkIHByaW50VGFibGUoY29uc3QgY2hhciogZmlsZW5hbWUpOw0KLSAgaW5saW5lIHZvaWQgcmVzaXplKFdvcmRJbmRleCBuKSB7DQotI2lmbmRlZiBXSU4zMg0KLQkgIGEucmVzaXplKG4pOw0KLSNlbmRpZg0KLSAgfTsgLy8gcmVzaXplIHRhYmxlDQotDQotfTsNCi0NCi0vKiAtLS0tLS0tLS0tLS0tLSBFbmQgb2YgYWxpZ25tb2RlIENsYXNzIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2VuZGlmDQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvQXJyYXkuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0FycmF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTU4ZDQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvQXJyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI2lmbmRlZiBHSVpBX0FSUkFZX0hfREVGSU5FRAotI2RlZmluZSBHSVpBX0FSUkFZX0hfREVGSU5FRAotI2luY2x1ZGUgIlZlY3Rvci5oIgotI2RlZmluZSBBcnJheSBWZWN0b3IKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvQXJyYXkyLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9BcnJheTIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhMmQ5ZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9BcnJheTIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotCi0gRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotIFdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi0gVVNBLgotCi0gKi8KLS8qLS0KLSBBcnJheTI6IEltcGxlbWVudGF0aW9uIG9mIGEgdHdvZGltZW5zaW9uYWwgY2hlY2tlZCBhcnJheSBhbGxvd2luZyBmb3IKLSBhIHNwZWNpZmllZCB1bmRlcmxpZWluZyBvbmUtZGltZW5zaW9uYWwgZGF0YS1zdHJ1Y3R1cmUuCi0KLSBGcmFueiBKb3NlZiBPY2ggKDMwLzA3Lzk5KQotIC0tKi8KLSNpZm5kZWYgQ0xBU1NfQXJyYXkyX0RFRklORUQKLSNkZWZpbmUgQ0xBU1NfQXJyYXkyX0RFRklORUQKLQotI2luY2x1ZGUgIm15c3RsLmgiCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgWT12ZWN0b3I8VD4gPiBjbGFzcyBBcnJheTIgewotcHVibGljOgotCVkgcDsKLQkvLyAgc2hvcnQgaDEsIGgyOwotCXVuc2lnbmVkIGludCBoMSwgaDI7Ci1wdWJsaWM6Ci0JQXJyYXkyKHVuc2lnbmVkIGludCBfaDEsIHVuc2lnbmVkIGludCBfaDIpIDoKLQkJcChfaDEqX2gyKSwgaDEoX2gxKSwgaDIoX2gyKSB7Ci0JfQotCUFycmF5Mih1bnNpZ25lZCBpbnQgX2gxLCB1bnNpZ25lZCBpbnQgX2gyLCBjb25zdCBUJl9pbml0KSA6Ci0JCXAoX2gxKl9oMiwgX2luaXQpLCBoMShfaDEpLCBoMihfaDIpIHsKLQl9Ci0JQXJyYXkyKCkgOgotCQloMSgwKSwgaDIoMCkgewotCX0KLQlpbmxpbmUgVCAmb3BlcmF0b3IoKSh1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IGopIHsKLQkJYXNzZXJ0KGk8aDEpOwotCQlhc3NlcnQoajxoMik7Ci0JCXJldHVybiBwW2kqaDIral07Ci0JfQotCWlubGluZSBjb25zdCBUJm9wZXJhdG9yKCkodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBqKSBjb25zdCB7Ci0JCWFzc2VydChpPGgxKTsKLQkJYXNzZXJ0KGo8aDIpOwotCQlyZXR1cm4gcFtpKmgyK2pdOwotCX0KLQlpbmxpbmUgVCBnZXQodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBqKSB7Ci0JCWFzc2VydChpPGgxKTsKLQkJYXNzZXJ0KGo8aDIpOwotCQlyZXR1cm4gcFtpKmgyK2pdOwotCX0KLQlpbmxpbmUgdm9pZCBzZXQodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBqLCBUIHgpIHsKLQkJYXNzZXJ0KGk8aDEpOwotCQlhc3NlcnQoajxoMik7Ci0JCXBbaSpoMitqXT14OwotCX0KLQlpbmxpbmUgY29uc3QgVCBnZXQodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBqKSBjb25zdCB7Ci0JCWFzc2VydChpPGgxKTsKLQkJYXNzZXJ0KGo8aDIpOwotCQlyZXR1cm4gcFtpKmgyK2pdOwotCX0KLQlpbmxpbmUgdW5zaWduZWQgaW50IGdldExlbjEoKSBjb25zdCB7Ci0JCXJldHVybiBoMTsKLQl9Ci0JaW5saW5lIHVuc2lnbmVkIGludCBnZXRMZW4yKCkgY29uc3QgewotCQlyZXR1cm4gaDI7Ci0JfQotCi0JaW5saW5lIFQqYmVnaW4oKSB7Ci0JCWlmIChoMT09MHx8aDI9PTApCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuICYocFswXSk7Ci0JfQotCWlubGluZSBUKmVuZCgpIHsKLQkJaWYgKGgxPT0wfHxoMj09MCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gJihwWzBdKStwLnNpemUoKTsKLQl9Ci0KLQlpbmxpbmUgY29uc3QgVCpiZWdpbigpIGNvbnN0IHsKLQkJcmV0dXJuIHAuYmVnaW4oKTsKLQl9Ci0JaW5saW5lIGNvbnN0IFQqZW5kKCkgY29uc3QgewotCQlyZXR1cm4gcC5lbmQoKTsKLQl9Ci0KLQlmcmllbmQgb3N0cmVhbSZvcGVyYXRvcjw8KG9zdHJlYW0mb3V0LCBjb25zdCBBcnJheTI8VCwgWT4mYXIpIHsKLQkJZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPGFyLmdldExlbjEoKTsgaSsrKSB7Ci0JCQkvL291dCA8PCBpIDw8ICI6ICI7Ci0JCQlmb3IgKHVuc2lnbmVkIGludCBqPTA7IGo8YXIuZ2V0TGVuMigpOyBqKyspCi0JCQkJb3V0IDw8IGFyKGksIGopIDw8ICcgJzsKLQkJCW91dCA8PCAnXG4nOwotCQl9Ci0JCXJldHVybiBvdXQgPDwgZW5kbDsKLQl9Ci0JaW5saW5lIHZvaWQgcmVzaXplKHVuc2lnbmVkIGludCBhLCB1bnNpZ25lZCBpbnQgYikgewotCQlpZiAoICEoYT09aDEmJmI9PWgyKSkgewotCQkJaDE9YTsKLQkJCWgyPWI7Ci0JCQlwLnJlc2l6ZShoMSpoMik7Ci0JCX0KLQl9Ci0JaW5saW5lIHZvaWQgcmVzaXplKHVuc2lnbmVkIGludCBhLCB1bnNpZ25lZCBpbnQgYiwgY29uc3QgVCZ0KSB7Ci0JCWlmICggIShhPT1oMSYmYj09aDIpKSB7Ci0JCQloMT1hOwotCQkJaDI9YjsKLQkJCXAucmVzaXplKGgxKmgyKTsKLQkJCWZpbGwocC5iZWdpbigpLCBwLmVuZCgpLCB0KTsKLQkJfQotCX0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvQXJyYXk0LmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9BcnJheTQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1N2EyZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9BcnJheTQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2ggKFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0laQSsrICggZXh0ZW5zaW9uIG9mIEdJWkEgKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2lmbmRlZiBBbGlnbm1lbnRBcnJheTRfaF9ERUZJTkVECi0jZGVmaW5lIEFsaWdubWVudEFycmF5NF9oX0RFRklORUQKLQotI2luY2x1ZGUgIkFycmF5Mi5oIgotdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgQXJyYXk0Ci17Ci0gcHJpdmF0ZToKLSAgQXJyYXkyPCBBcnJheTI8VD4qID4gQTsKLSAgaW50IE07Ci0gIFQgaW5pdDsKLSBwdWJsaWM6Ci0gIEFycmF5NChpbnQgbSxjb25zdCBUJl9pbml0KQotICAgIDogQShtLG0sMCksTShtKSxpbml0KF9pbml0KSB7fQotICB+QXJyYXk0KCkKLSAgICB7Ci0gICAgICBmb3IoaW50IGw9MDtsPE07KytsKQotCWZvcihpbnQgbT0wO208TTsrK20pCi0JICBkZWxldGUgQShsLG0pOwotICAgIH0KLSAgY29uc3QgVCZvcGVyYXRvcigpKGludCBpLCBpbnQgaiwgaW50IGwsIGludCBtKWNvbnN0Ci0gICAgewotICAgICAgaWYoIEEobCxtKT09MCApCi0JcmV0dXJuIGluaXQ7Ci0gICAgICBlbHNlCi0JcmV0dXJuICgqQShsLG0pKShpLGopOwotICAgIH0KLSAgY29uc3QgVCZnZXQoaW50IGksIGludCBqLCBpbnQgbCwgaW50IG0pY29uc3QKLSAgICB7Ci0gICAgICBpZiggQShsLG0pPT0wICkKLQlyZXR1cm4gaW5pdDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gKCpBKGwsbSkpKGksaik7Ci0gICAgfQotICBUJm9wZXJhdG9yKCkoaW50IGksIGludCBqLCBpbnQgbCwgaW50IG0pCi0gICAgewotICAgICAgaWYoIEEobCxtKT09MCApCi0JewotCSAgQShsLG0pPW5ldyBBcnJheTI8VD4obWF4KGwrMSxtKzEpLG1heChsKzEsbSsxKSxpbml0KTsKLQl9Ci0gICAgICByZXR1cm4gKCpBKGwsbSkpKGksaik7Ci0gICAgfQotICB2b2lkIGNsZWFyKCkKLSAgICB7Ci0gICAgICBmb3IoaW50IGw9MDtsPE07KytsKQotCWZvcihpbnQgbT0wO208TTsrK20pCi0JICBpZiggQShsLG0pICkKLQkgICAgewotCSAgICAgIEFycmF5MjxUPiZhPSpBKGwsbSk7Ci0JICAgICAgZm9yKGludCBpPTA7aTw9bDsrK2kpCi0JCWZvcihpbnQgaj0wO2o8PW07KytqKQotCQkgIGEoaSxqKT0wLjA7Ci0JICAgIH0KLSAgICB9Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0NNYWtlTGlzdHMudHh0IGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NjMxMmIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotCi0jIFNldCBvdXRwdXQgZGlyZWN0b3J5Ci0KLUZJTkRfUEFDS0FHRShUaHJlYWRzKQotCi0KLVNFVChFWEVDVVRBQkxFX09VVFBVVF9QQVRIICR7UFJPSkVDVF9CSU5BUllfRElSfS9iaW4pCi1TRVQoTElCUkFSWV9PVVRQVVRfUEFUSCAke1BST0pFQ1RfQklOQVJZX0RJUn0vbGliKQotCi1BRERfREVGSU5JVElPTlMoIi1ETkRFQlVHIikKLUFERF9ERUZJTklUSU9OUygiLURXT1JESU5ERVhfV0lUSF80X0JZVEUiKQotQUREX0RFRklOSVRJT05TKCItREJJTkFSWV9TRUFSQ0hfRk9SX1RUQUJMRSIpCi1BRERfREVGSU5JVElPTlMoIi1EREVCVUciKQotSUYgKFdJTjMyKQotCi1FTFNFKCkKLUFERF9ERUZJTklUSU9OUygiLVduby1kZXByZWNhdGVkIikKLUFERF9ERUZJTklUSU9OUygiLVduby13cml0ZS1zdHJpbmdzIikKLUVORElGKCkKLQotU0VUKCBMSUJNR0laQV9TUkMKLSAgICBhbGlnbm1lbnQuY3BwIGFsaWdubWVudC5oCi0gICAgQWxpZ25UYWJsZXMuY3BwIEFsaWduVGFibGVzLmgKLSAgICBBcnJheTIuaCBBcnJheTQuaAotICAgIEFycmF5LmggQVRhYmxlcy5jcHAKLSAgICBBVGFibGVzLmggY21kLmMKLSAgICBjbWQuaCBjb2xsQ291bnRzLmNwcAotICAgIGNvbGxDb3VudHMuaCBjb21tb24uaAotICAgIEQ0VGFibGVzLmgKLSAgICBENVRhYmxlcy5oIGRlZnMuaAotICAgIERpY3Rpb25hcnkuY3BwIERpY3Rpb25hcnkuaAotICAgIGZpbGVfc3BlYy5oIEZsZXhBcnJheS5oCi0gICAgRm9yd2FyZEJhY2t3YXJkLmNwcCBGb3J3YXJkQmFja3dhcmQuaAotICAgIGdldFNlbnRlbmNlLmNwcCBnZXRTZW50ZW5jZS5oCi0gICAgR2xvYmFscy5oIGhtbS5jcHAKLSAgICBobW0uaCAKLSAgICBITU1UYWJsZXMuY3BwIEhNTVRhYmxlcy5oCi0gICAgbG9ncHJvYi5jcHAgbG9ncHJvYi5oCi0gICAgbW9kZWwxLmNwcAotICAgIG1vZGVsMS5oIG1vZGVsMi5jcHAKLSAgICBtb2RlbDIuaCBtb2RlbDJ0bzMuY3BwCi0gICAgbW9kZWwzNDUtcGVnLmNwcCBtb2RlbDMuY3BwCi0gICAgbW9kZWwzLmggbW9kZWwzX3ZpdGVyYmkuY3BwCi0gICAgbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwIE1vdmVTd2FwTWF0cml4LmNwcAotICAgIE1vdmVTd2FwTWF0cml4LmggbXlhc3NlcnQuY3BwCi0gICAgbXlhc3NlcnQuaCBteW1hdGguaAotICAgIG15c3RsLmggTlRhYmxlcy5jcHAKLSAgICBOVGFibGVzLmggUGFyYW1ldGVyLmNwcAotICAgIFBhcmFtZXRlci5oIHBhcnNlLmNwcAotICAgIFBlcnBsZXhpdHkuY3BwIFBlcnBsZXhpdHkuaAotICAgIFBvaW50ZXIuaAotICAgIHJlcG9ydHMuY3BwIFNldEFycmF5LmNwcAotICAgIFNldEFycmF5LmgKLSAgICBzeW5jT2JqLmggdHJhbnNwYWlyX21vZGVsMS5oCi0gICAgdHJhbnNwYWlyX21vZGVsMi5oIHRyYW5zcGFpcl9tb2RlbDMuY3BwCi0gICAgdHJhbnNwYWlyX21vZGVsMy5oIHRyYW5zcGFpcl9tb2RlbDQuY3BwCi0gICAgdHJhbnNwYWlyX21vZGVsNC5oIHRyYW5zcGFpcl9tb2RlbDUuY3BwCi0gICAgdHJhbnNwYWlyX21vZGVsNS5oIHRyYW5zcGFpcl9tb2RlbGhtbS5oCi0gICAgdHRhYmxlRGlmZi5ocHAgVFRhYmxlcy5jcHAKLSAgICBUVGFibGVzLmggdHlwZXMuaAotICAgIHV0aWxpdHkuY3BwIHV0aWxpdHkuaAotICAgIFZlY3Rvci5oIHZvY2FiLmNwcAotICAgIHZvY2FiLmggV29yZENsYXNzZXMuaAotKQotCi1BRERfTElCUkFSWShtZ2l6YV9saWIgU1RBVElDICR7TElCTUdJWkFfU1JDfSkKLVNFVF9UQVJHRVRfUFJPUEVSVElFUyhtZ2l6YV9saWIgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSAibWdpemEiKQotCi1JTkNMVURFX0RJUkVDVE9SSUVTKCAke1BST0pFQ1RfU09VUkNFX0RJUn0gKQotSUYgKFdJTjMyKQotCUlOQ0xVREVfRElSRUNUT1JJRVMoICR7UFJPSkVDVF9TT1VSQ0VfRElSfS93MzIgKQotCUxJTktfRElSRUNUT1JJRVMgKCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdzMyICkKLQlJRiggVVNFXzY0X0JJVCApCi0JCVNFVChDTUFLRV9USFJFQURfTElCU19JTklUIHB0aHJlYWQ2NCkKLQlFTFNFKCBVU0VfNjRfQklUICkKLQkJU0VUKENNQUtFX1RIUkVBRF9MSUJTX0lOSVQgcHRocmVhZCkKLQlFTkRJRiggICkKLQkKLQkKLUVORElGKCkJCi1JTkNMVURFX0RJUkVDVE9SSUVTKCAke1BST0pFQ1RfU09VUkNFX0RJUn0vc3JjLyApCi1MSU5LX0RJUkVDVE9SSUVTICggJHtMSUJSQVJZX09VVFBVVF9QQVRIfSApCi0KLVNFVCggTUdJWkFfU1JDIG1haW4uY3BwICkKLQotQUREX0VYRUNVVEFCTEUoIG1naXphICR7TUdJWkFfU1JDfSApCi0KLVRBUkdFVF9MSU5LX0xJQlJBUklFUyAoCi0gICAgbWdpemEKLSAgICBtZ2l6YV9saWIKLSAgICAke0Jvb3N0X0xJQlJBUklFU30KLSAgICAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9Ci0gICAgKQotCi0KLUFERF9FWEVDVVRBQkxFKHNudDJjb29jIHNudDJjb29jLmNwcCkKLUFERF9FWEVDVVRBQkxFKHNudDJjb29jcm1wIHNudDJjb29jLXJlZHVjZS1tZW0tcHJlcHJvY2Vzcy5jcHApCi1BRERfRVhFQ1VUQUJMRShzbnQycGxhaW4gc250MnBsYWluLmNwcCkKLUFERF9FWEVDVVRBQkxFKHBsYWluMnNudCBwbGFpbjJzbnQuY3BwKQotQUREX0VYRUNVVEFCTEUoc3ltYWwgc3ltYWwuY3BwIGNtZC5jKQotQUREX0VYRUNVVEFCTEUoaG1tbm9ybSBobW1ub3JtLmN4eCkKLUFERF9FWEVDVVRBQkxFKGQ0bm9ybSBkNG5vcm0uY3h4KQotVEFSR0VUX0xJTktfTElCUkFSSUVTICgKLSAgICBobW1ub3JtCi0gICAgbWdpemFfbGliCi0gICAgJHtCb29zdF9MSUJSQVJJRVN9Ci0gICAgJHtDTUFLRV9USFJFQURfTElCU19JTklUfQotICAgICkKLVRBUkdFVF9MSU5LX0xJQlJBUklFUyAoCi0gICAgZDRub3JtCi0gICAgbWdpemFfbGliCi0gICAgJHtCb29zdF9MSUJSQVJJRVN9Ci0gICAgJHtDTUFLRV9USFJFQURfTElCU19JTklUfQotICAgICkKLQotSU5TVEFMTChUQVJHRVRTIG1naXphX2xpYiBtZ2l6YSBzbnQyY29vYyBzbnQycGxhaW4gcGxhaW4yc250IHN5bWFsIGhtbW5vcm0gZDRub3JtIHNudDJjb29jcm1wCi0gICAgUlVOVElNRSBERVNUSU5BVElPTiBiaW4KLSAgICBMSUJSQVJZIERFU1RJTkFUSU9OIGxpYgotICAgIEFSQ0hJVkUgREVTVElOQVRJT04gbGliCi0gICAgKQotCi0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvRDRUYWJsZXMuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0Q0VGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNjBkYzguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvRDRUYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4NSArMCwwIEBACi0vKgotCi0gQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLSBUaGlzIGZpbGUgaXMgcGFydCBvZiBHSVpBKysgKCBleHRlbnNpb24gb2YgR0laQSApLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLSBVU0EuCi0KLSAqLwotI2lmbmRlZiBfZDR0YWJsZXNfaF9kZWZpbmUKLSNkZWZpbmUgX2Q0dGFibGVzX2hfZGVmaW5lCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgIldvcmRDbGFzc2VzLmgiCi0jaW5jbHVkZSAiR2xvYmFscy5oIgotI2luY2x1ZGUgIm15YXNzZXJ0LmgiCi0jaW5jbHVkZSAic3luY09iai5oIgotZXh0ZXJuIGZsb2F0IGQ0bW9kZWxzbW9vdGhfZmFjdG9yOwotCi1jbGFzcyBtNF9rZXkgewotcHVibGljOgotCWludCBkZXBzOwotCWludCBsOwotCWludCBtOwotCWludCBGOwotCWludCBFOwotCWludCBwcmV2ajsKLQlpbnQgdmFjYW5jaWVzMSwgdmFjYW5jaWVzMjsKLQltNF9rZXkoaW50IF9kZXBzLCBpbnQgX2wsIGludCBfbSwgaW50IF9GLCBpbnQgX0UsIGludCBfcHJldmosIGludCBfdjEsCi0JCQlpbnQgX3YyKSA6Ci0JCWRlcHMoX2RlcHMpLCBsKF9sKSwgbShfbSksIEYoX0YpLCBFKF9FKSwgcHJldmooX3ByZXZqKSwKLQkJCQl2YWNhbmNpZXMxKF92MSksIHZhY2FuY2llczIoX3YyKSB7Ci0JfQotCWZyaWVuZCBvc3RyZWFtJnByaW50MShvc3RyZWFtJm91dCwgY29uc3QgbTRfa2V5JngsIGNvbnN0IFdvcmRDbGFzc2VzJndjZSwKLQkJCWNvbnN0IFdvcmRDbGFzc2VzJndjZikgewotCQlpZiAoeC5kZXBzJkRFUF9NT0RFTF9sKQotCQkJb3V0IDw8ICJsOiAiIDw8IHgubDw8JyAnOwotCQlpZiAoeC5kZXBzJkRFUF9NT0RFTF9tKQotCQkJb3V0IDw8ICJtOiAiIDw8IHgubTw8JyAnOwotCQlpZiAoeC5kZXBzJkRFUF9NT0RFTF9GKQotCQkJb3V0IDw8ICJGOiAiIDw8IHdjZi5jbGFzc1N0cmluZyh4LkYpPDwgJyAnOwotCQlpZiAoeC5kZXBzJkRFUF9NT0RFTF9FKQotCQkJb3V0IDw8ICJFOiAiIDw8IHdjZS5jbGFzc1N0cmluZyh4LkUpPDwgJyAnOwotCQkvLyAgICAgIGlmKHguZGVwcyZERVBfTU9ERUxfcGopb3V0IDw8ICJqLTE6ICIgPDwgeC5wcmV2ajw8JyAnOwotCQlpZiAoeC52YWNhbmNpZXMxIT0tMSkKLQkJCW91dCA8PCAidjE6ICIgPDwgeC52YWNhbmNpZXMxIDw8ICcgJzsKLQkJaWYgKHgudmFjYW5jaWVzMiE9LTEpCi0JCQlvdXQgPDwgInYyOiAiIDw8IHgudmFjYW5jaWVzMiA8PCAnICc7Ci0JCXJldHVybiBvdXQgPDwgJ1xuJzsKLQl9Ci0KLQlmcmllbmQgb3N0cmVhbSZwcmludDFfbTUob3N0cmVhbSZvdXQsIGNvbnN0IG00X2tleSZ4LAotCQkJY29uc3QgV29yZENsYXNzZXMmd2NlLCBjb25zdCBXb3JkQ2xhc3NlcyZ3Y2YpIHsKLQkJb3V0IDw8ICgoeC5kZXBzJkRFUF9NT0RFTF9FKSA/IHdjZS5jbGFzc1N0cmluZyh4LkUpIDogc3RyaW5nKCIwIikpCi0JCQkJPDwgJyAnOwotCQlvdXQgPDwgKCh4LmRlcHMmREVQX01PREVMX0YpID8gd2NmLmNsYXNzU3RyaW5nKHguRikgOiBzdHJpbmcoIjAiKSkKLQkJCQk8PCAnICc7Ci0JCW91dCA8PCB4LnZhY2FuY2llczEgPDwgJyAnOwotCQlvdXQgPDwgeC52YWNhbmNpZXMyIDw8ICcgJzsKLQkJcmV0dXJuIG91dDsKLQl9Ci0KLQlmcmllbmQgb3N0cmVhbSZwcmludGIxKG9zdHJlYW0mb3V0LCBjb25zdCBtNF9rZXkmeCwgY29uc3QgV29yZENsYXNzZXMmd2NlLAotCQkJY29uc3QgV29yZENsYXNzZXMmd2NmKSB7Ci0JCWlmICh4LmRlcHMmREVQX01PREVMYl9sKQotCQkJb3V0IDw8ICJsOiAiIDw8IHgubDw8JyAnOwotCQlpZiAoeC5kZXBzJkRFUF9NT0RFTGJfbSkKLQkJCW91dCA8PCAibTogIiA8PCB4Lm08PCcgJzsKLQkJaWYgKHguZGVwcyZERVBfTU9ERUxiX0YpCi0JCQlvdXQgPDwgIkY6ICIgPDwgd2NmLmNsYXNzU3RyaW5nKHguRikgPDwgJyAnOwotCQlpZiAoeC5kZXBzJkRFUF9NT0RFTGJfRSkKLQkJCW91dCA8PCAiRTogIiA8PCB3Y2UuY2xhc3NTdHJpbmcoeC5FKSA8PCAnICc7Ci0JCWlmICh4LnZhY2FuY2llczEhPS0xKQotCQkJb3V0IDw8ICJ2MTogIiA8PCB4LnZhY2FuY2llczEgPDwgJyAnOwotCQlpZiAoeC52YWNhbmNpZXMyIT0tMSkKLQkJCW91dCA8PCAidjI6ICIgPDwgeC52YWNhbmNpZXMyIDw8ICcgJzsKLQkJcmV0dXJuIG91dCA8PCAnXG4nOwotCX0KLQlmcmllbmQgb3N0cmVhbSZwcmludGIxX201KG9zdHJlYW0mb3V0LCBjb25zdCBtNF9rZXkmeCwKLQkJCWNvbnN0IFdvcmRDbGFzc2VzJndjZikgewotCQlvdXQgPDwgIi0xICIgPDwgKCh4LmRlcHMmREVQX01PREVMX0YpID8gd2NmLmNsYXNzU3RyaW5nKHguRikKLQkJCQk6IHN0cmluZygiMCIpKTw8ICcgJzsKLQkJb3V0IDw8IHgudmFjYW5jaWVzMSA8PCAnICc7Ci0JCW91dCA8PCB4LnZhY2FuY2llczIgPDwgJyAnOwotCQlyZXR1cm4gb3V0OwotCX0KLX07Ci0KLWNsYXNzIGNvbXBhcmUxIHsKLXByaXZhdGU6Ci0JaW50IGRlcHM7Ci1wdWJsaWM6Ci0JY29tcGFyZTEoaW50IF9kZXBzKSA6Ci0JCWRlcHMoX2RlcHMpIHsKLQl9Ci0JYm9vbCBvcGVyYXRvcigpKGNvbnN0IG00X2tleSZhLCBjb25zdCBtNF9rZXkmYikgY29uc3QgewotCQlpZiAoZGVwcyZERVBfTU9ERUxfbCkgewotCQkJaWYgKGEubDxiLmwpCi0JCQkJcmV0dXJuIDE7Ci0JCQlpZiAoYi5sPGEubCkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoZGVwcyZERVBfTU9ERUxfbSkgewotCQkJaWYgKGEubTxiLm0pCi0JCQkJcmV0dXJuIDE7Ci0JCQlpZiAoYi5tPGEubSkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoZGVwcyZERVBfTU9ERUxfRikgewotCQkJaWYgKGEuRjxiLkYpCi0JCQkJcmV0dXJuIDE7Ci0JCQlpZiAoYi5GPGEuRikKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoZGVwcyZERVBfTU9ERUxfRSkgewotCQkJaWYgKGEuRTxiLkUpCi0JCQkJcmV0dXJuIDE7Ci0JCQlpZiAoYi5FPGEuRSkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQkvL2lmKGRlcHMmREVQX01PREVMX3BqKXtpZiggYS5wcmV2ajxiLnByZXZqIClyZXR1cm4gMTtpZiggYi5wcmV2ajxhLnByZXZqIClyZXR1cm4gMDt9Ci0JCWlmIChhLnZhY2FuY2llczE8Yi52YWNhbmNpZXMxKQotCQkJcmV0dXJuIDE7Ci0JCWlmIChiLnZhY2FuY2llczE8YS52YWNhbmNpZXMxKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChhLnZhY2FuY2llczI8Yi52YWNhbmNpZXMyKQotCQkJcmV0dXJuIDE7Ci0JCWlmIChiLnZhY2FuY2llczI8YS52YWNhbmNpZXMyKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAwOwotCX0KLX07Ci0KLWNsYXNzIGNvbXBhcmViMSB7Ci1wcml2YXRlOgotCWludCBkZXBzOwotcHVibGljOgotCWNvbXBhcmViMShpbnQgX2RlcHMpIDoKLQkJZGVwcyhfZGVwcykgewotCX0KLQlib29sIG9wZXJhdG9yKCkoY29uc3QgbTRfa2V5JmEsIGNvbnN0IG00X2tleSZiKSBjb25zdCB7Ci0JCWlmIChkZXBzJkRFUF9NT0RFTGJfbCkgewotCQkJaWYgKGEubDxiLmwpCi0JCQkJcmV0dXJuIDE7Ci0JCQlpZiAoYi5sPGEubCkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoZGVwcyZERVBfTU9ERUxiX20pIHsKLQkJCWlmIChhLm08Yi5tKQotCQkJCXJldHVybiAxOwotCQkJaWYgKGIubTxhLm0pCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKGRlcHMmREVQX01PREVMYl9GKSB7Ci0JCQlpZiAoYS5GPGIuRikKLQkJCQlyZXR1cm4gMTsKLQkJCWlmIChiLkY8YS5GKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChkZXBzJkRFUF9NT0RFTGJfRSkgewotCQkJaWYgKGEuRTxiLkUpCi0JCQkJcmV0dXJuIDE7Ci0JCQlpZiAoYi5FPGEuRSkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQkvL2lmKGRlcHMmREVQX01PREVMYl9wail7aWYoIGEucHJldko8Yi5wcmV2SiApcmV0dXJuIDE7aWYoIGIucHJldko8YS5wcmV2SiApcmV0dXJuIDA7fQotCQlpZiAoYS52YWNhbmNpZXMxPGIudmFjYW5jaWVzMSkKLQkJCXJldHVybiAxOwotCQlpZiAoYi52YWNhbmNpZXMxPGEudmFjYW5jaWVzMSkKLQkJCXJldHVybiAwOwotCQlpZiAoYS52YWNhbmNpZXMyPGIudmFjYW5jaWVzMikKLQkJCXJldHVybiAxOwotCQlpZiAoYi52YWNhbmNpZXMyPGEudmFjYW5jaWVzMikKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gMDsKLQl9Ci19OwotCi1pbmxpbmUgdm9pZCB0b2tlbml6ZShjb25zdCBzdHJpbmcmaW4sIFZlY3RvcjxzdHJpbmc+Jm91dCkgewotCXN0cmluZyBzOwotCWlzdHJzdHJlYW0gbChpbi5jX3N0cigpKTsKLQl3aGlsZSAobD4+cykKLQkJb3V0LnB1c2hfYmFjayhzKTsKLX0KLQotY2xhc3MgZDRtb2RlbCB7Ci1wdWJsaWM6Ci0JdHlwZWRlZiBWZWN0b3I8cGFpcjxDT1VOVCxQUk9CPiA+IFZwZmY7Ci0JbWFwPG00X2tleSxWcGZmLGNvbXBhcmUxID4gRDE7Ci0JbWFwPG00X2tleSxWcGZmLGNvbXBhcmViMT4gRGIxOwotCVBvc2l0aW9uSW5kZXggbXNsOwotCVdvcmRDbGFzc2VzKiBld29yZGNsYXNzZXM7Ci0JV29yZENsYXNzZXMqIGZ3b3JkY2xhc3NlczsKLQl0ZW1wbGF0ZTxjbGFzcyBNQVBQRVI+IHZvaWQgbWFrZVdvcmRDbGFzc2VzKGNvbnN0IE1BUFBFUiZtMSwKLQkJCWNvbnN0IE1BUFBFUiZtMiwgc3RyaW5nIGVmaWxlLCBzdHJpbmcgZmZpbGUsIGNvbnN0IHZjYkxpc3QmIGVsaXN0LAotCSAgICBjb25zdCB2Y2JMaXN0JiBmbGlzdCkgewotCQlpZnN0cmVhbSBlc3RybShlZmlsZS5jX3N0cigpKSwgZnN0cm0oZmZpbGUuY19zdHIoKSk7Ci0JCWlmICggIWVzdHJtKSB7Ci0JCQljZXJyIDw8ICJFUlJPUjogY2FuIG5vdCByZWFkICIgPDwgZWZpbGUgPDwgZW5kbDsKLQkJfSBlbHNlCi0JCQlld29yZGNsYXNzZXMtPnJlYWQoZXN0cm0sIG0xLGVsaXN0KTsKLQkJaWYgKCAhZnN0cm0pCi0JCQljZXJyIDw8ICJFUlJPUjogY2FuIG5vdCByZWFkICIgPDwgZmZpbGUgPDwgZW5kbDsKLQkJZWxzZQotCQkJZndvcmRjbGFzc2VzLT5yZWFkKGZzdHJtLCBtMixmbGlzdCk7Ci0JfQotCWQ0bW9kZWwoUG9zaXRpb25JbmRleCBfbXNsLCBXb3JkQ2xhc3NlcyYgZSwgV29yZENsYXNzZXMmIGYpIDoKLQkJRDEoY29tcGFyZTEoTTRfRGVwZW5kZW5jaWVzKSksIERiMShjb21wYXJlYjEoTTRfRGVwZW5kZW5jaWVzKSksCi0JCQkJbXNsKF9tc2wpLGV3b3JkY2xhc3NlcygmZSksZndvcmRjbGFzc2VzKCZmKSB7Ci0JfQotCQotcHJvdGVjdGVkOgotCWlubGluZSBDT1VOVCZnZXRDb3VudFJlZl9maXJzdChXb3JkSW5kZXggaiwgV29yZEluZGV4IGpfY3AsIGludCBFLCBpbnQgRiwgaW50IGwsCi0JCQlpbnQgbSkgewotCQlhc3NlcnQoaj49MSk7Ci0JCW00X2tleSBrZXkoTTRfRGVwZW5kZW5jaWVzLCBsLCBtLCBGLCBFLCBqX2NwLCAtMSwgLTEpOwotCQltYXA8bTRfa2V5LFZwZmYsY29tcGFyZTEgPjo6aXRlcmF0b3IgcD1EMS5maW5kKGtleSk7Ci0JCWlmIChwPT1EMS5lbmQoKSkKLQkJCXA9RDEuaW5zZXJ0KG1ha2VfcGFpcihrZXksVnBmZihtc2wqMisxLHBhaXI8Q09VTlQsUFJPQj4oMC4wLDAuMCkpKSkuZmlyc3Q7Ci0JCWFzc2VydChwIT1EMS5lbmQoKSk7Ci0JCXJldHVybiAocC0+c2Vjb25kKVtqLWpfY3ArbXNsXS5maXJzdDsKLQl9OwotCi0JaW5saW5lIENPVU5UJmdldENvdW50UmVmX2JpZ2dlcihXb3JkSW5kZXggaiwgV29yZEluZGV4IGpfcHJldiwgaW50IEUsIGludCBGLAotCQkJaW50IGwsIGludCBtKSB7Ci0JCWFzc2VydChqPj0xKTsKLQkJYXNzZXJ0KGpfcHJldj49MSk7Ci0JCW00X2tleSBrZXkoTTRfRGVwZW5kZW5jaWVzLCBsLCBtLCBGLCBFLCBqX3ByZXYsIC0xLCAtMSk7Ci0JCW1hcDxtNF9rZXksVnBmZixjb21wYXJlYjEgPjo6aXRlcmF0b3IgcD1EYjEuZmluZChrZXkpOwotCQlpZiAocD09RGIxLmVuZCgpKQotCQkJcD1EYjEuaW5zZXJ0KG1ha2VfcGFpcihrZXksVnBmZihtc2wqMisxLHBhaXI8Q09VTlQsUFJPQj4oMC4wLDAuMCkpKSkuZmlyc3Q7Ci0JCWFzc2VydChwIT1EYjEuZW5kKCkpOwotCQlyZXR1cm4gKHAtPnNlY29uZClbai1qX3ByZXYrbXNsXS5maXJzdDsKLQl9OwotCU11dGV4IGxvY2tfZixsb2NrX2I7Ci1wdWJsaWM6Ci0JaW5saW5lIHZvaWQgYXVnQ291bnRSZWZfZmlyc3QoV29yZEluZGV4IGosIFdvcmRJbmRleCBqX2NwLCBpbnQgRSwgaW50IEYsIGludCBsLAotCQkJaW50IG0sIGNvbnN0IENPVU5UJiB2KXsKLQkJbG9ja19mLmxvY2soKTsKLQkJZ2V0Q291bnRSZWZfZmlyc3QoaixqX2NwLEUsRixsLG0pKz12OwotCQlsb2NrX2YudW5sb2NrKCk7Ci0JfQotCQotCWlubGluZSB2b2lkIGF1Z0NvdW50UmVmX2JpZ2dlcihXb3JkSW5kZXggaiwgV29yZEluZGV4IGpfcHJldiwgaW50IEUsIGludCBGLAotCQkJCWludCBsLCBpbnQgbSwgY29uc3QgQ09VTlQmIHYpewotCQlsb2NrX2IubG9jaygpOwotCQlnZXRDb3VudFJlZl9iaWdnZXIoaixqX3ByZXYsRSxGLGwsbSkrPXY7Ci0JCWxvY2tfYi51bmxvY2soKTsKLQl9Ci0JCi0JCi0KLQl2b2lkIG1lcmdlKGQ0bW9kZWwgJmQpIHsKLQkJbWFwPG00X2tleSxWcGZmLGNvbXBhcmUxID46Oml0ZXJhdG9yIGl0OwotCQlmb3IgKGl0ID0gZC5EMS5iZWdpbigpOyBpdCE9ZC5EMS5lbmQoKTsgaXQrKykgewotCQkJbWFwPG00X2tleSxWcGZmLGNvbXBhcmUxID46Oml0ZXJhdG9yIHA9RDEuZmluZChpdC0+Zmlyc3QpOwotCQkJaWYgKHA9PUQxLmVuZCgpKQotCQkJCXA9RDEuaW5zZXJ0KG1ha2VfcGFpcihpdC0+Zmlyc3QsVnBmZihtc2wqMisxLHBhaXI8Q09VTlQsUFJPQj4oMC4wLDAuMCkpKSkuZmlyc3Q7Ci0JCQlpbnQgaTsKLQkJCWZvciAoaT0wOyBpPGl0LT5zZWNvbmQuc2l6ZSgpOyBpKyspIHsKLQkJCQlwLT5zZWNvbmRbaV0uc2Vjb25kKz1pdC0+c2Vjb25kW2ldLnNlY29uZDsKLQkJCX0KLQkJfQotI2lmZGVmIFdJTjMyCi0JCW1hcDxtNF9rZXksVnBmZixjb21wYXJlYjEgPjo6aXRlcmF0b3IgaXQxOwotCQlmb3IgKGl0MSA9IGQuRGIxLmJlZ2luKCk7IGl0MSE9ZC5EYjEuZW5kKCk7IGl0MSsrKSB7Ci0JCQltYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46Oml0ZXJhdG9yIHA9RGIxLmZpbmQoaXQtPmZpcnN0KTsKLQkJCWlmIChwPT1EYjEuZW5kKCkpCi0JCQkJcD1EYjEuaW5zZXJ0KG1ha2VfcGFpcihpdDEtPmZpcnN0LFZwZmYobXNsKjIrMSxwYWlyPENPVU5ULFBST0I+KDAuMCwwLjApKSkpLmZpcnN0OwotCQkJaW50IGk7Ci0JCQlmb3IgKGk9MDsgaTxpdC0+c2Vjb25kLnNpemUoKTsgaSsrKSB7Ci0JCQkJcC0+c2Vjb25kW2ldLnNlY29uZCs9aXQxLT5zZWNvbmRbaV0uc2Vjb25kOwotCQkJfQotCQl9Ci0jZWxzZQotCQlmb3IgKGl0ID0gZC5EYjEuYmVnaW4oKTsgaXQhPWQuRGIxLmVuZCgpOyBpdCsrKSB7Ci0JCQltYXA8bTRfa2V5LFZwZmYsY29tcGFyZTEgPjo6aXRlcmF0b3IgcD1EYjEuZmluZChpdC0+Zmlyc3QpOwotCQkJaWYgKHA9PURiMS5lbmQoKSkKLQkJCQlwPURiMS5pbnNlcnQobWFrZV9wYWlyKGl0LT5maXJzdCxWcGZmKG1zbCoyKzEscGFpcjxDT1VOVCxQUk9CPigwLjAsMC4wKSkpKS5maXJzdDsKLQkJCWludCBpOwotCQkJZm9yIChpPTA7IGk8aXQtPnNlY29uZC5zaXplKCk7IGkrKykgewotCQkJCXAtPnNlY29uZFtpXS5zZWNvbmQrPWl0LT5zZWNvbmRbaV0uc2Vjb25kOwotCQkJfQotCQl9Ci0jZW5kaWYKLQl9Ci0KLQlib29sIGF1Z0NvdW50KGNvbnN0IGNoYXIqIGZEMSwgY29uc3QgY2hhciogZkRiKSB7Ci0JCWlmc3RyZWFtIGlmc2QoZkQxKTsKLQkJaW50IGRlcHM7Ci0JCWludCBsOwotCQlpbnQgbTsKLQkJaW50IEY7Ci0JCWludCBFOwotCQlpbnQgcHJldmo7Ci0JCWludCB2YWNhbmNpZXMxLCB2YWNhbmNpZXMyOwotCQlpbnQgbGVuOwotCQlkb3VibGUgY291bnQ7Ci0JCWlmICghaWZzZCkgewotCQkJY2VyciA8PCAiRmFpbGVkIGluICIgPDwgZkQxIDw8IGVuZGw7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJewotCQkJd2hpbGUgKGlmc2QgPj4gZGVwcyA+PiBsID4+IG0gPj5GID4+IEUgPj4gcHJldmogPj4gdmFjYW5jaWVzMQotCQkJCQk+PnZhY2FuY2llczI+PmxlbikgewotCQkJCW00X2tleSBrZXkoTTRfRGVwZW5kZW5jaWVzLCBsLCBtLCBGLCBFLCBwcmV2aiwgdmFjYW5jaWVzMSwKLQkJCQkJCXZhY2FuY2llczIpOwotCQkJCW1hcDxtNF9rZXksVnBmZixjb21wYXJlMSA+OjppdGVyYXRvciBwPUQxLmZpbmQoa2V5KTsKLQkJCQlpZiAocD09RDEuZW5kKCkpCi0JCQkJCXA9RDEuaW5zZXJ0KG1ha2VfcGFpcihrZXksVnBmZihtc2wqMisxLHBhaXI8Q09VTlQsUFJPQj4oMC4wLDAuMCkpKSkuZmlyc3Q7Ci0JCQkJYXNzZXJ0KHAhPUQxLmVuZCgpKTsKLQkJCQlpbnQgaTsKLQkJCQlmb3IgKGk9MDsgaTxsZW47IGkrKykgewotCQkJCQlpZnNkID4+IGNvdW50OwotCQkJCQlwLT5zZWNvbmRbaV0uZmlyc3QrPWNvdW50OwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCWlmc3RyZWFtIGlmc2QxKGZEYik7Ci0JCWlmICghaWZzZDEpIHsKLQkJCWNlcnIgPDwgIkZhaWxlZCBpbiAiIDw8IGZEYiA8PCBlbmRsOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXsKLQkJCXdoaWxlIChpZnNkMSA+PiBkZXBzID4+IGwgPj4gbSA+PkYgPj4gRSA+PiBwcmV2aiA+PiB2YWNhbmNpZXMxCi0JCQkJCT4+dmFjYW5jaWVzMj4+bGVuKSB7Ci0JCQkJbTRfa2V5IGtleShNNF9EZXBlbmRlbmNpZXMsIGwsIG0sIEYsIEUsIHByZXZqLCB2YWNhbmNpZXMxLAotCQkJCQkJdmFjYW5jaWVzMik7Ci0JCQkJbWFwPG00X2tleSxWcGZmLGNvbXBhcmViMSA+OjppdGVyYXRvciBwPURiMS5maW5kKGtleSk7Ci0JCQkJaWYgKHA9PURiMS5lbmQoKSkKLQkJCQkJcD1EYjEuaW5zZXJ0KG1ha2VfcGFpcihrZXksVnBmZihtc2wqMisxLHBhaXI8Q09VTlQsUFJPQj4oMC4wLDAuMCkpKSkuZmlyc3Q7Ci0JCQkJYXNzZXJ0KHAhPUQxLmVuZCgpKTsKLQkJCQlpbnQgaTsKLQkJCQlmb3IgKGk9MDsgaTxsZW47IGkrKykgewotCQkJCQlpZnNkMSA+PiBjb3VudDsKLQkJCQkJcC0+c2Vjb25kW2ldLmZpcnN0Kz1jb3VudDsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgIGJvb2wgcmVhZFByb2JUYWJsZShjb25zdCBjaGFyKiBmRDEsIGNvbnN0IGNoYXIqIGZEYil7Ci0gICAgICAgIGlmc3RyZWFtIGlmc2QoZkQxKTsKLSAgICAgICAgaW50IGRlcHM7Ci0gICAgICAgIGludCBsOwotICAgICAgICBpbnQgbTsKLSAgICAgICAgaW50IEY7Ci0gICAgICAgIGludCBFOwotICAgICAgICBpbnQgcHJldmo7Ci0gICAgICAgIGludCB2YWNhbmNpZXMxLHZhY2FuY2llczI7Ci0gICAgICAgIGludCBsZW47Ci0gICAgICAgIGRvdWJsZSBjb3VudDsKLSAgICAgICAgaWYoIWlmc2QpewotICAgICAgICAgICAgY2VyciA8PCAiRmFpbGVkIGluICIgPDwgZkQxIDw8IGVuZGw7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUoaWZzZCA+PiBkZXBzID4+IGwgPj4gbSA+PkYgPj4gRSA+PiBwcmV2aiA+PiB2YWNhbmNpZXMxPj52YWNhbmNpZXMyPj5sZW4pewotICAgICAgICAgICAgICAgIG00X2tleSBrZXkoTTRfRGVwZW5kZW5jaWVzLGwsbSxGLEUscHJldmosdmFjYW5jaWVzMSx2YWNhbmNpZXMyKTsKLSAgICAgICAgICAgICAgICBtYXA8bTRfa2V5LFZwZmYsY29tcGFyZTEgPjo6aXRlcmF0b3IgcD1EMS5maW5kKGtleSk7Ci0gICAgICAgICAgICAgICAgaWYocD09RDEuZW5kKCkpcD1EMS5pbnNlcnQobWFrZV9wYWlyKGtleSxWcGZmKG1zbCoyKzEscGFpcjxDT1VOVCxQUk9CPigwLjAsMC4wKSkpKS5maXJzdDsKLSAgICAgICAgICAgICAgICBhc3NlcnQocCE9RDEuZW5kKCkpOwotICAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgIGZvcihpPTA7aTxsZW47aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgaWZzZCA+PiBjb3VudDsKLSAgICAgICAgICAgICAgICAgICAgcC0+c2Vjb25kW2ldLnNlY29uZD1jb3VudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWZzdHJlYW0gaWZzZDEoZkRiKTsKLSAgICAgICAgaWYoIWlmc2QxKXsKLSAgICAgICAgICAgIGNlcnIgPDwgIkZhaWxlZCBpbiAiIDw8IGZEYiA8PCBlbmRsOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlKGlmc2QxID4+IGRlcHMgPj4gbCA+PiBtID4+RiA+PiBFID4+IHByZXZqID4+IHZhY2FuY2llczE+PnZhY2FuY2llczI+Pmxlbil7Ci0gICAgICAgICAgICAgICAgbTRfa2V5IGtleShNNF9EZXBlbmRlbmNpZXMsbCxtLEYsRSxwcmV2aix2YWNhbmNpZXMxLHZhY2FuY2llczIpOwotICAgICAgICAgICAgICAgIG1hcDxtNF9rZXksVnBmZixjb21wYXJlYjEgPjo6aXRlcmF0b3IgcD1EYjEuZmluZChrZXkpOwotICAgICAgICAgICAgICAgIGlmKHA9PURiMS5lbmQoKSlwPURiMS5pbnNlcnQobWFrZV9wYWlyKGtleSxWcGZmKG1zbCoyKzEscGFpcjxDT1VOVCxQUk9CPigwLjAsMC4wKSkpKS5maXJzdDsKLSAgICAgICAgICAgICAgICBhc3NlcnQocCE9RDEuZW5kKCkpOwotICAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgIGZvcihpPTA7aTxsZW47aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgaWZzZDEgPj4gY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIHAtPnNlY29uZFtpXS5zZWNvbmQ9Y291bnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLQotCWJvb2wgcHJpbnRQcm9iVGFibGUoY29uc3QgY2hhciogZkQxLCBjb25zdCBjaGFyKiBmRGIpIHsKLQkJb2ZzdHJlYW0gb2ZzZChmRDEpOwotCQlpZiAoIW9mc2QuaXNfb3BlbigpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJewotCQkJbWFwPG00X2tleSxWcGZmLGNvbXBhcmUxID46Oml0ZXJhdG9yIGl0OwotCQkJZm9yIChpdCA9IEQxLmJlZ2luKCk7IGl0IT1EMS5lbmQoKTsgaXQrKykgewotCQkJCW9mc2QgPDwgaXQtPmZpcnN0LmRlcHMgPDwgIiAiIDw8IGl0LT5maXJzdC5sIDw8ICIgIgotCQkJCQkJPDwgaXQtPmZpcnN0Lm0gPDwgIiAiIDw8IGl0LT5maXJzdC5GIDw8ICIgIgotCQkJCQkJPDwgaXQtPmZpcnN0LkUgPDwgIiAiIDw8IGl0LT5maXJzdC5wcmV2aiA8PCAiICIKLQkJCQkJCTw8IGl0LT5maXJzdC52YWNhbmNpZXMxIDw8ICIgIiA8PCBpdC0+Zmlyc3QudmFjYW5jaWVzMgotCQkJCQkJPDwgIiAiIDw8IGl0LT5zZWNvbmQuc2l6ZSgpIDw8ICIgIjsKLQkJCQlpbnQgaTsKLQkJCQlmb3IgKGk9MDsgaTxpdC0+c2Vjb25kLnNpemUoKTsgaSsrKSB7Ci0JCQkJCW9mc2QgPDwgaXQtPnNlY29uZFtpXS5zZWNvbmQgPDwgIiAiOwotCQkJCX0KLQkJCQlvZnNkIDw8IGVuZGw7Ci0JCQl9Ci0KLQkJfQotCi0JCW9mc3RyZWFtIG9mc2RiKGZEYik7Ci0JCWlmICghb2ZzZGIuaXNfb3BlbigpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQltYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46Oml0ZXJhdG9yIGl0OwotCQlmb3IgKGl0ID0gRGIxLmJlZ2luKCk7IGl0IT1EYjEuZW5kKCk7IGl0KyspIHsKLQkJCW9mc2RiIDw8IGl0LT5maXJzdC5kZXBzIDw8ICIgIiA8PCBpdC0+Zmlyc3QubCA8PCAiICIgPDwgaXQtPmZpcnN0Lm0KLQkJCQkJPDwgIiAiIDw8IGl0LT5maXJzdC5GIDw8ICIgIiA8PCBpdC0+Zmlyc3QuRSA8PCAiICIKLQkJCQkJPDwgaXQtPmZpcnN0LnByZXZqIDw8ICIgIiA8PCBpdC0+Zmlyc3QudmFjYW5jaWVzMSA8PCAiICIKLQkJCQkJPDwgaXQtPmZpcnN0LnZhY2FuY2llczIgPDwgIiAiIDw8IGl0LT5zZWNvbmQuc2l6ZSgpPDwgZW5kbDsKLQkJCWludCBpOwotCQkJZm9yIChpPTA7IGk8aXQtPnNlY29uZC5zaXplKCk7IGkrKykgewotCQkJCW9mc2RiIDw8IGl0LT5zZWNvbmRbaV0uc2Vjb25kIDw8ICIgIjsKLQkJCX0KLQkJCW9mc2RiIDw8IGVuZGw7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgYm9vbCBkdW1wQ291bnQoY29uc3QgY2hhciogZkQxLCBjb25zdCBjaGFyKiBmRGIpewotICAgICAgICBvZnN0cmVhbSBvZnNkKGZEMSk7Ci0gICAgICAgIGlmKCFvZnNkLmlzX29wZW4oKSl7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgbWFwPG00X2tleSxWcGZmLGNvbXBhcmUxID46Oml0ZXJhdG9yIGl0OwotICAgICAgICAgICAgZm9yKGl0ID0gRDEuYmVnaW4oKTsgaXQhPUQxLmVuZCgpO2l0KyspewotICAgICAgICAgICAgICAgIG9mc2QgPDwgaXQtPmZpcnN0LmRlcHMgPDwgIiAiIAotICAgICAgICAgICAgICAgICAgPDwgaXQtPmZpcnN0LmwgPDwgIiAiIAotICAgICAgICAgICAgICAgICAgPDwgaXQtPmZpcnN0Lm0gPDwgIiAiCi0gICAgICAgICAgICAgICAgICA8PCBpdC0+Zmlyc3QuRiA8PCAiICIKLSAgICAgICAgICAgICAgICAgIDw8IGl0LT5maXJzdC5FIDw8ICIgIgotICAgICAgICAgICAgICAgICAgPDwgaXQtPmZpcnN0LnByZXZqIDw8ICIgIgotICAgICAgICAgICAgICAgICAgPDwgaXQtPmZpcnN0LnZhY2FuY2llczEgPDwgIiAiCi0gICAgICAgICAgICAgICAgICA8PCBpdC0+Zmlyc3QudmFjYW5jaWVzMiA8PCAiICIKLSAgICAgICAgICAgICAgICAgIDw8IGl0LT5zZWNvbmQuc2l6ZSgpIDw8ICIgIjsKLSAgICAgICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgICAgICBmb3IoaT0wO2k8aXQtPnNlY29uZC5zaXplKCk7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgb2ZzZCA8PCBpdC0+c2Vjb25kW2ldLmZpcnN0IDw8ICIgIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2ZzZCA8PCBlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG9mc3RyZWFtIG9mc2RiKGZEYik7Ci0gICAgICAgIGlmKCFvZnNkYi5pc19vcGVuKCkpewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBtYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46Oml0ZXJhdG9yIGl0OwotICAgICAgICBmb3IoaXQgPSBEYjEuYmVnaW4oKTsgaXQhPURiMS5lbmQoKTtpdCsrKXsKLSAgICAgICAgICAgIG9mc2RiIDw8IGl0LT5maXJzdC5kZXBzIDw8ICIgIiAKLSAgICAgICAgICAgICAgICAgIDw8IGl0LT5maXJzdC5sIDw8ICIgIiAKLSAgICAgICAgICAgICAgICAgIDw8IGl0LT5maXJzdC5tIDw8ICIgIgotICAgICAgICAgICAgICAgICAgPDwgaXQtPmZpcnN0LkYgPDwgIiAiCi0gICAgICAgICAgICAgICAgICA8PCBpdC0+Zmlyc3QuRSA8PCAiICIKLSAgICAgICAgICAgICAgICAgIDw8IGl0LT5maXJzdC5wcmV2aiA8PCAiICIKLSAgICAgICAgICAgICAgICAgIDw8IGl0LT5maXJzdC52YWNhbmNpZXMxIDw8ICIgIgotICAgICAgICAgICAgICAgICAgPDwgaXQtPmZpcnN0LnZhY2FuY2llczIgPDwgIiAiCi0gICAgICAgICAgICAgICAgICA8PCBpdC0+c2Vjb25kLnNpemUoKTw8IGVuZGw7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvcihpPTA7aTxpdC0+c2Vjb25kLnNpemUoKTtpKyspewotICAgICAgICAgICAgICAgIG9mc2RiIDw8IGl0LT5zZWNvbmRbaV0uZmlyc3QgPDwgIiAiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2ZzZGIgPDwgZW5kbDsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0JbWFwPG00X2tleSxWcGZmLGNvbXBhcmUxID46OmNvbnN0X2l0ZXJhdG9yIGdldFByb2JfZmlyc3RfaXRlcmF0b3IoaW50IEUsCi0JCQlpbnQgRiwgaW50IGwsIGludCBtKSBjb25zdCB7Ci0JCXJldHVybiBEMS5maW5kKG00X2tleShNNF9EZXBlbmRlbmNpZXMsIGwsIG0sIEYsIEUsIDAsIC0xLCAtMSkpOwotCX0KLQlQUk9CIGdldFByb2JfZmlyc3Rfd2l0aGl0ZXJhdG9yKFdvcmRJbmRleCBqLCBXb3JkSW5kZXggal9jcCwgaW50IG0sCi0JCQljb25zdCBtYXA8bTRfa2V5LFZwZmYsY29tcGFyZTEgPjo6Y29uc3RfaXRlcmF0b3ImIHApIGNvbnN0IHsKLQkJYXNzZXJ0KGo+PTEpOwotCQkvL2Fzc2VydChqX2NwPj0wKTsKLQkJYXNzZXJ0KGo8PW1zbCk7Ci0JCWFzc2VydChqX2NwPD1tc2wpOwotCQlpZiAocD09RDEuZW5kKCkpIHsKLQkJCXJldHVybiBQUk9CX1NNT09USDsKLQkJfSBlbHNlIHsKLQkJCW1hc3NlcnQoKHAtPnNlY29uZClbai1qX2NwK21zbF0uc2Vjb25kPD0xLjApOwotCQkJcmV0dXJuIG1heChQUk9CX1NNT09USCwgZDRtb2RlbHNtb290aF9mYWN0b3IvKDIqbS0xKSsoMQotCQkJCQktZDRtb2RlbHNtb290aF9mYWN0b3IpKihwLT5zZWNvbmQpW2otal9jcCttc2xdLnNlY29uZCk7Ci0JCX0KLQl9Ci0KLQlQUk9CIGdldFByb2JfZmlyc3QoV29yZEluZGV4IGosIFdvcmRJbmRleCBqX2NwLCBpbnQgRSwgaW50IEYsIGludCBsLCBpbnQgbSkgY29uc3QgewotCQlhc3NlcnQoaj49MSk7Ci0JCS8vYXNzZXJ0KGpfY3A+PTApOwotCQlhc3NlcnQoajw9bXNsKTsKLQkJYXNzZXJ0KGpfY3A8PW1zbCk7Ci0JCW00X2tleSBrZXkoTTRfRGVwZW5kZW5jaWVzLCBsLCBtLCBGLCBFLCBqX2NwLCAtMSwgLTEpOwotCQltYXA8bTRfa2V5LFZwZmYsY29tcGFyZTEgPjo6Y29uc3RfaXRlcmF0b3IgcD1EMS5maW5kKGtleSk7Ci0JCWlmIChwPT1EMS5lbmQoKSkgewotCQkJcmV0dXJuIFBST0JfU01PT1RIOwotCQl9IGVsc2UgewotCQkJbWFzc2VydCgocC0+c2Vjb25kKVtqLWpfY3ArbXNsXS5zZWNvbmQ8PTEuMCk7Ci0JCQlyZXR1cm4gbWF4KFBST0JfU01PT1RILCBkNG1vZGVsc21vb3RoX2ZhY3Rvci8oMiptLTEpKygxCi0JCQkJCS1kNG1vZGVsc21vb3RoX2ZhY3RvcikqKHAtPnNlY29uZClbai1qX2NwK21zbF0uc2Vjb25kKTsKLQkJfQotCX0KLQltYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46OmNvbnN0X2l0ZXJhdG9yIGdldFByb2JfYmlnZ2VyX2l0ZXJhdG9yKGludCBFLAotCQkJaW50IEYsIGludCBsLCBpbnQgbSkgY29uc3QgewotCQlyZXR1cm4gRGIxLmZpbmQobTRfa2V5KE00X0RlcGVuZGVuY2llcywgbCwgbSwgRiwgRSwgMCwgLTEsIC0xKSk7Ci0JfQotCVBST0IgZ2V0UHJvYl9iaWdnZXJfd2l0aGl0ZXJhdG9yKFdvcmRJbmRleCBqLCBXb3JkSW5kZXggal9wcmV2LCBpbnQgbSwKLQkJCWNvbnN0IG1hcDxtNF9rZXksVnBmZixjb21wYXJlYjEgPjo6Y29uc3RfaXRlcmF0b3ImcCkgY29uc3QgewotCQltYXNzZXJ0KGo+PTEpOwotCQltYXNzZXJ0KGpfcHJldj49MSk7Ci0JCW1hc3NlcnQoaj5qX3ByZXYpOwotCQltYXNzZXJ0KGo8PW1zbCk7Ci0JCW1hc3NlcnQoal9wcmV2PD1tc2wpOwotCQlpZiAocD09RGIxLmVuZCgpKSB7Ci0JCQlyZXR1cm4gUFJPQl9TTU9PVEg7Ci0JCX0gZWxzZSB7Ci0JCQltYXNzZXJ0KChwLT5zZWNvbmQpW2otal9wcmV2K21zbF0uc2Vjb25kPD0xLjAgKTsKLQkJCXJldHVybiBtYXgoUFJPQl9TTU9PVEgsIGQ0bW9kZWxzbW9vdGhfZmFjdG9yLyhtLTEpKygxCi0JCQkJCS1kNG1vZGVsc21vb3RoX2ZhY3RvcikqKHAtPnNlY29uZClbai1qX3ByZXYrbXNsXS5zZWNvbmQpOwotCQl9Ci0JfQotCi0JUFJPQiBnZXRQcm9iX2JpZ2dlcihXb3JkSW5kZXggaiwgV29yZEluZGV4IGpfcHJldiwgaW50IEUsIGludCBGLCBpbnQgbCwKLQkJCWludCBtKSBjb25zdCB7Ci0JCW1hc3NlcnQoaj49MSk7Ci0JCW1hc3NlcnQoal9wcmV2Pj0xKTsKLQkJbWFzc2VydChqPmpfcHJldik7Ci0JCW1hc3NlcnQoajw9bXNsKTsKLQkJbWFzc2VydChqX3ByZXY8PW1zbCk7Ci0JCW00X2tleSBrZXkoTTRfRGVwZW5kZW5jaWVzLCBsLCBtLCBGLCBFLCBqX3ByZXYsIC0xLCAtMSk7Ci0JCW1hcDxtNF9rZXksVnBmZixjb21wYXJlYjEgPjo6Y29uc3RfaXRlcmF0b3IgcD1EYjEuZmluZChrZXkpOwotCQlpZiAocD09RGIxLmVuZCgpKSB7Ci0JCQlyZXR1cm4gUFJPQl9TTU9PVEg7Ci0JCX0gZWxzZSB7Ci0JCQltYXNzZXJ0KChwLT5zZWNvbmQpW2otal9wcmV2K21zbF0uc2Vjb25kPD0xLjAgKTsKLQkJCXJldHVybiBtYXgoUFJPQl9TTU9PVEgsIGQ0bW9kZWxzbW9vdGhfZmFjdG9yLyhtLTEpKygxCi0JCQkJCS1kNG1vZGVsc21vb3RoX2ZhY3RvcikqKHAtPnNlY29uZClbai1qX3ByZXYrbXNsXS5zZWNvbmQpOwotCQl9Ci0JfQotCi0Jdm9pZCBub3JtYWxpemVUYWJsZSgpIHsKLQkJaW50IG5QYXJhbXM9MDsKLQkJZm9yIChtYXA8bTRfa2V5LFZwZmYsY29tcGFyZTEgPjo6aXRlcmF0b3IgaT1EMS5iZWdpbigpOyBpIT1EMS5lbmQoKTsgKytpKSB7Ci0JCQlWcGZmJmQxPWktPnNlY29uZDsKLQkJCWRvdWJsZSBzdW09MC4wOwotCQkJZm9yIChQb3NpdGlvbkluZGV4IGk9MDsgaTxkMS5zaXplKCk7IGkrKykKLQkJCQlzdW0rPWQxW2ldLmZpcnN0OwotCQkJZm9yIChQb3NpdGlvbkluZGV4IGk9MDsgaTxkMS5zaXplKCk7IGkrKykgewotCQkJCWQxW2ldLnNlY29uZD1zdW0gPyAoZDFbaV0uZmlyc3Qvc3VtKSA6ICgxLjAvZDEuc2l6ZSgpKTsKLQkJCQluUGFyYW1zKys7Ci0JCQl9Ci0JCX0KLQkJZm9yIChtYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46Oml0ZXJhdG9yIGk9RGIxLmJlZ2luKCk7IGkhPURiMS5lbmQoKTsgKytpKSB7Ci0JCQlWcGZmJmRiMT1pLT5zZWNvbmQ7Ci0JCQlkb3VibGUgc3VtPTAuMDsKLQkJCWZvciAoUG9zaXRpb25JbmRleCBpPTA7IGk8ZGIxLnNpemUoKTsgaSsrKQotCQkJCXN1bSs9ZGIxW2ldLmZpcnN0OwotCQkJZm9yIChQb3NpdGlvbkluZGV4IGk9MDsgaTxkYjEuc2l6ZSgpOyBpKyspIHsKLQkJCQlkYjFbaV0uc2Vjb25kPXN1bSA/IChkYjFbaV0uZmlyc3Qvc3VtKSA6ICgxLjAvZGIxLnNpemUoKSk7Ci0JCQkJblBhcmFtcysrOwotCQkJfQotCQl9Ci0JCWNvdXQgPDwgIkQ0IHRhYmxlIGNvbnRhaW5zICIgPDwgblBhcmFtcyA8PCAiIHBhcmFtZXRlcnMuXG4iOwotCX0KLQotCXZvaWQgY2xlYXIoKSB7Ci0JCWZvciAobWFwPG00X2tleSxWcGZmLGNvbXBhcmUxID46Oml0ZXJhdG9yIGk9RDEuYmVnaW4oKTsgaSE9RDEuZW5kKCk7ICsraSkgewotCQkJVnBmZiZkMT1pLT5zZWNvbmQ7Ci0JCQlmb3IgKFBvc2l0aW9uSW5kZXggaT0wOyBpPGQxLnNpemUoKTsgaSsrKQotCQkJCWQxW2ldLmZpcnN0PTAuMDsKLQkJfQotCQlmb3IgKG1hcDxtNF9rZXksVnBmZixjb21wYXJlYjEgPjo6aXRlcmF0b3IgaT1EYjEuYmVnaW4oKTsgaSE9RGIxLmVuZCgpOyArK2kpIHsKLQkJCVZwZmYmZGIxPWktPnNlY29uZDsKLQkJCWZvciAoUG9zaXRpb25JbmRleCBpPTA7IGk8ZGIxLnNpemUoKTsgaSsrKQotCQkJCWRiMVtpXS5maXJzdD0wLjA7Ci0JCX0KLQl9Ci0KLQkvKnZvaWQgcHJpbnRQcm9iVGFibGUoY29uc3QgY2hhcipmbmFtZTEsY29uc3QgY2hhcipmbmFtZTIpCi0JIHsKLQkgb2ZzdHJlYW0gb3V0KGZuYW1lMSk7Ci0JIGRvdWJsZSBzc3VtPTAuMDsKLQkgb3V0IDw8ICIjIFRyYW5zbGF0aW9uIHRhYmxlcyBmb3IgTW9kZWwgNCAuXG4iOwotCSBvdXQgPDwgIiMgVGFibGUgZm9yIGhlYWQgb2YgY2VwdC5cbiI7Ci0JIGZvcihtYXA8bTRfa2V5LFZwZmYsY29tcGFyZTEgPjo6Y29uc3RfaXRlcmF0b3IgaT1EMS5iZWdpbigpO2khPUQxLmVuZCgpOysraSl7Ci0JIGNvbnN0IFZwZmYmZDE9aS0+c2Vjb25kOwotCSBkb3VibGUgc3VtPTAuMDsKLQkgZm9yKFBvc2l0aW9uSW5kZXggaWk9MDtpaTxkMS5zaXplKCk7aWkrKylzdW0rPWQxW2lpXS5maXJzdDsKLQkgaWYgKCBzdW0gKXsKLQkgcHJpbnQxKG91dCxpLT5maXJzdCxld29yZGNsYXNzZXMsZndvcmRjbGFzc2VzKTsKLQkgb3V0IDw8ICJTVU06ICIgPDwgc3VtIDw8ICcgJzw8ICdcbic7Ci0JIGZvcih1bnNpZ25lZCBpaT0wO2lpPGQxLnNpemUoKTtpaSsrKQotCSBpZiggZDFbaWldLmZpcnN0ICkKLQkgb3V0IDw8IChpbnQpKGlpKS0oaW50KShtc2wpIDw8ICcgJyA8PCBkMVtpaV0uZmlyc3QgPDwgJ1xuJzsKLQkgb3V0IDw8IGVuZGw7Ci0JIH0KLQkgc3N1bSs9c3VtOwotCSB9Ci0JIG91dCA8PCAiIyBUYWJsZSBmb3Igbm9uLWhlYWQgb2YgY2VwdC5cbiI7Ci0JIGZvcihtYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46OmNvbnN0X2l0ZXJhdG9yIGk9RGIxLmJlZ2luKCk7aSE9RGIxLmVuZCgpOysraSkKLQkgewotCSBjb25zdCBWcGZmJmRiMT1pLT5zZWNvbmQ7Ci0JIGRvdWJsZSBzdW09MC4wOwotCSBmb3IoUG9zaXRpb25JbmRleCBpaT0wO2lpPGRiMS5zaXplKCk7KytpaSlzdW0rPWRiMVtpaV0uZmlyc3Q7Ci0JIGlmKCBzdW0gKXsKLQkgcHJpbnRiMShvdXQsaS0+Zmlyc3QsZXdvcmRjbGFzc2VzLGZ3b3JkY2xhc3Nlcyk7Ci0JIG91dCA8PCAiU1VNOiAiIDw8IHN1bSA8PCAnICc8PCdcbic7Ci0JIGZvcih1bnNpZ25lZCBpaT0wO2lpPGRiMS5zaXplKCk7aWkrKykKLQkgaWYoIGRiMVtpaV0uZmlyc3QgKQotCSB7Ci0JIG91dCA8PCAoaW50KShpaSktKGludCkobXNsKSA8PCAnICcgPDwgZGIxW2lpXS5maXJzdCA8PCAnXG4nOwotCSB9Ci0JIG91dCA8PCBlbmRsOwotCSB9Ci0JIHNzdW0rPXN1bTsKLQkgfQotCSBvdXQgPDwgZW5kbCA8PCAiRlVMTC1TVU06ICIgPDwgc3N1bSA8PCBlbmRsOwotCSBpZiggTTRfRGVwZW5kZW5jaWVzPT03NiApewotCSBvZnN0cmVhbSBvdXQyKGZuYW1lMik7Ci0JIGZvcihtYXA8bTRfa2V5LFZwZmYsY29tcGFyZTEgPjo6Y29uc3RfaXRlcmF0b3IgaT1EMS5iZWdpbigpO2khPUQxLmVuZCgpOysraSkKLQkgewotCSBjb25zdCBWcGZmJmQxPWktPnNlY29uZDsKLQkgZm9yKHVuc2lnbmVkIGlpPTA7aWk8ZDEuc2l6ZSgpO2lpKyspCi0JIGlmKCBkMVtpaV0uZmlyc3QgKQotCSBvdXQyIDw8IGV3b3JkY2xhc3Nlcy5jbGFzc1N0cmluZyhpLT5maXJzdC5FKSA8PCAnICcgPDwgZndvcmRjbGFzc2VzLmNsYXNzU3RyaW5nKGktPmZpcnN0LkYpIDw8ICcgJyA8PCAoaW50KShpaSktKGludCkobXNsKSA8PCAnICcgPDwgZDFbaWldLnNlY29uZCA8PCAnXG4nOwotCSB9Ci0JIGZvcihtYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46OmNvbnN0X2l0ZXJhdG9yIGk9RGIxLmJlZ2luKCk7aSE9RGIxLmVuZCgpOysraSkgewotCSBjb25zdCBWcGZmJmRiMT1pLT5zZWNvbmQ7Ci0JIGZvcih1bnNpZ25lZCBpaT0wO2lpPGRiMS5zaXplKCk7aWkrKykKLQkgaWYoIGRiMVtpaV0uZmlyc3QgKQotCSBvdXQyIDw8IC0xIDw8ICcgJyA8PCBmd29yZGNsYXNzZXMuY2xhc3NTdHJpbmcoaS0+Zmlyc3QuRikgPDwgJyAnIDw8IChpbnQpKGlpKS0oaW50KShtc2wpIDw8ICcgJyA8PCBkYjFbaWldLnNlY29uZCA8PCAnXG4nOwotCSB9Ci0JIH0KLQkgfSovCi0KLQlib29sIHJlYWRQcm9iVGFibGUoY29uc3QgY2hhciAqZm5hbWUpIHsKLQkJY2VyciA8PCAiUmVhZGluZyBENFRhYmxlcyBmcm9tICIgPDwgZm5hbWUgPDwgZW5kbDsKLQkJaWZzdHJlYW0gZmlsZShmbmFtZSk7Ci0JCXN0cmluZyBsaW5lOwotCQlkbyB7Ci0JCQlnZXRsaW5lKGZpbGUsIGxpbmUpOwotCQl9IHdoaWxlIChsaW5lLmxlbmd0aCgpJiZsaW5lWzBdPT0nIycpOwotCi0JCWRvIHsKLQkJCXdoaWxlIChsaW5lLmxlbmd0aCgpPT0wKQotCQkJCWdldGxpbmUoZmlsZSwgbGluZSk7Ci0JCQlpZiAobGluZVswXT09JyMnKQotCQkJCWJyZWFrOwotCQkJVmVjdG9yPHN0cmluZz4gbGluZXN0cjsKLQkJCXRva2VuaXplKGxpbmUsIGxpbmVzdHIpOwotCQkJbTRfa2V5IGsoTTRfRGVwZW5kZW5jaWVzLCAwLCAwLCAwLCAwLCAwLCAtMSwgLTEpOwotCQkJZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPGxpbmVzdHIuc2l6ZSgpOyBpKz0yKSB7Ci0JCQkJaWYgKGxpbmVzdHJbaV09PSJsOiIpIHsKLQkJCQkJay5sPWF0b2kobGluZXN0cltpKzFdLmNfc3RyKCkpOwotCQkJCQlpYXNzZXJ0KE00X0RlcGVuZGVuY2llcyZERVBfTU9ERUxfbCk7Ci0JCQkJfQotCQkJCWlmIChsaW5lc3RyW2ldPT0ibToiKSB7Ci0JCQkJCWsubT1hdG9pKGxpbmVzdHJbaSsxXS5jX3N0cigpKTsKLQkJCQkJaWFzc2VydChNNF9EZXBlbmRlbmNpZXMmREVQX01PREVMX20pOwotCQkJCX0KLQkJCQlpZiAobGluZXN0cltpXT09IkY6IikgewotCQkJCQlrLkY9KCpmd29yZGNsYXNzZXMpKGxpbmVzdHJbaSsxXSk7Ci0JCQkJCWlhc3NlcnQoTTRfRGVwZW5kZW5jaWVzJkRFUF9NT0RFTF9GKTsKLQkJCQl9Ci0JCQkJaWYgKGxpbmVzdHJbaV09PSJFOiIpIHsKLQkJCQkJay5FPSgqZXdvcmRjbGFzc2VzKShsaW5lc3RyW2krMV0pOwotCQkJCQlpYXNzZXJ0KE00X0RlcGVuZGVuY2llcyZERVBfTU9ERUxfRSk7Ci0JCQkJfQotCQkJCS8vaWYoIGxpbmVzdHJbaV09PSJqLTE6IiApe2sucHJldmo9YXRvaShsaW5lc3RyW2krMV0uY19zdHIoKSk7aWFzc2VydChNNF9EZXBlbmRlbmNpZXMmREVQX01PREVMX3BqKTt9Ci0JCQl9Ci0JCQlzdHJpbmcgc3RyOwotCQkJZG91YmxlIHN1bTsKLQkJCWZpbGUgPj4gc3RyID4+IHN1bTsKLQkJCWlhc3NlcnQoc3RyPT0iU1VNOiIpOwotCQkJaWYgKHN0ciE9IlNVTToiKQotCQkJCWNlcnIgPDwgIkVSUk9SOiBzdHJpbmcgaXMgIiA8PCBzdHIgPDwgIiBhbmQgbm90IHN1bSAiIDw8IGVuZGw7Ci0KLQkJCWRvIHsKLQkJCQlpbnQgdmFsdWU7Ci0JCQkJZG91YmxlIGNvdW50OwotCQkJCWdldGxpbmUoZmlsZSwgbGluZSk7Ci0JCQkJaXN0cnN0cmVhbSB0d29udW1iZXJzKGxpbmUuY19zdHIoKSk7Ci0JCQkJaWYgKHR3b251bWJlcnMgPj4gdmFsdWUgPj4gY291bnQpIHsKLQkJCQkJaWYgKEQxLmNvdW50KGspPT0wKQotCQkJCQkJRDEuaW5zZXJ0KG1ha2VfcGFpcihrLCBWcGZmKG1zbCoyKzEsIHBhaXI8Q09VTlQsIFBST0I+KAotCQkJCQkJCQkwLjAsIDAuMCkpKSk7Ci0JCQkJCUQxW2tdW3ZhbHVlK21zbF09bWFrZV9wYWlyKGNvdW50LCBjb3VudC9zdW0pOwotCQkJCX0KLQkJCX0gd2hpbGUgKGxpbmUubGVuZ3RoKCkpOwotCQl9IHdoaWxlIChmaWxlKTsKLQkJZG8gewotCQkJZ2V0bGluZShmaWxlLCBsaW5lKTsKLQkJfSB3aGlsZSAobGluZS5sZW5ndGgoKSYmbGluZVswXT09JyMnKTsKLQkJZG8gewotCQkJd2hpbGUgKGxpbmUubGVuZ3RoKCk9PTApCi0JCQkJZ2V0bGluZShmaWxlLCBsaW5lKTsKLQkJCWlmIChsaW5lWzBdPT0nIycpCi0JCQkJYnJlYWs7Ci0JCQlWZWN0b3I8c3RyaW5nPiBsaW5lc3RyOwotCQkJdG9rZW5pemUobGluZSwgbGluZXN0cik7Ci0JCQltNF9rZXkgayhNNF9EZXBlbmRlbmNpZXMsIDAsIDAsIDAsIDAsIDAsIC0xLCAtMSk7Ci0JCQlib29sIHN1bVJlYWQ9MDsKLQkJCWZvciAodW5zaWduZWQgaW50IGk9MDsgaTxsaW5lc3RyLnNpemUoKTsgaSs9MikgewotCQkJCWlmIChsaW5lc3RyW2ldPT0ibDoiKSB7Ci0JCQkJCWsubD1hdG9pKGxpbmVzdHJbaSsxXS5jX3N0cigpKTsKLQkJCQkJaWFzc2VydChNNF9EZXBlbmRlbmNpZXMmREVQX01PREVMYl9sKTsKLQkJCQl9IGVsc2UgaWYgKGxpbmVzdHJbaV09PSJtOiIpIHsKLQkJCQkJay5tPWF0b2kobGluZXN0cltpKzFdLmNfc3RyKCkpOwotCQkJCQlpYXNzZXJ0KE00X0RlcGVuZGVuY2llcyZERVBfTU9ERUxiX20pOwotCQkJCX0gZWxzZSBpZiAobGluZXN0cltpXT09IkY6IikgewotCQkJCQlrLkY9KCpmd29yZGNsYXNzZXMpKGxpbmVzdHJbaSsxXSk7Ci0JCQkJCWlhc3NlcnQoTTRfRGVwZW5kZW5jaWVzJkRFUF9NT0RFTGJfRik7Ci0JCQkJfSBlbHNlIGlmIChsaW5lc3RyW2ldPT0iRToiKSB7Ci0JCQkJCWsuRT0oKmV3b3JkY2xhc3NlcykobGluZXN0cltpKzFdKTsKLQkJCQkJaWFzc2VydChNNF9EZXBlbmRlbmNpZXMmREVQX01PREVMYl9FKTsKLQkJCQl9IGVsc2UgaWYgKGxpbmVzdHJbaV09PSJTVU06IikgewotCQkJCQljZXJyIDw8ICJXYXJuaW5nOiBvYnZpb3VzbHkgbm8gZGVwZW5kZW5jeS5cbiI7Ci0JCQkJCXN1bVJlYWQ9MTsKLQkJCQl9IGVsc2UgaWYgKGxpbmVzdHJbaV09PSJGVUxMLVNVTToiKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNlcnIgPDwgIkVSUk9SOiBlcnJvciBpbiByZWFkaW5nIGQ0IHRhYmxlczogIiA8PCBsaW5lc3RyW2ldCi0JCQkJCQkJPDwgJyAnIDw8IGxpbmVzdHJbaSsxXSA8PCBlbmRsOwotCQkJCX0KLQkJCX0KLQkJCXN0cmluZyBzdHI7Ci0JCQlkb3VibGUgc3VtOwotCQkJaWYgKHN1bVJlYWQ9PTApCi0JCQkJZmlsZSA+PiBzdHIgPj4gc3VtOwotCQkJZWxzZSB7Ci0JCQkJc3RyPWxpbmVzdHJbMF07Ci0JCQkJc3VtPWF0b2YobGluZXN0clsxXS5jX3N0cigpKTsKLQkJCX0KLQkJCWlmIChzdHIhPSJTVU06IikKLQkJCQljZXJyIDw8ICJFUlJPUjogc2hvdWxkIHJlYWQgU1VNIGJ1dCByZWFkICIgPDwgc3RyIDw8IGVuZGw7Ci0JCQlkbyB7Ci0JCQkJaW50IHZhbHVlOwotCQkJCWRvdWJsZSBjb3VudDsKLQkJCQlnZXRsaW5lKGZpbGUsIGxpbmUpOwotCQkJCWlzdHJzdHJlYW0gdHdvbnVtYmVycyhsaW5lLmNfc3RyKCkpOwotCQkJCWlmICh0d29udW1iZXJzID4+IHZhbHVlID4+IGNvdW50KSB7Ci0JCQkJCWlmIChEYjEuY291bnQoayk9PTApCi0JCQkJCQlEYjEuaW5zZXJ0KG1ha2VfcGFpcihrLCBWcGZmKG1zbCoyKzEsCi0JCQkJCQkJCXBhaXI8Q09VTlQsIFBST0I+KDAuMCwgMC4wKSkpKTsKLQkJCQkJRGIxW2tdW3ZhbHVlK21zbF09bWFrZV9wYWlyKGNvdW50LCBjb3VudC9zdW0pOwotCQkJCX0KLQkJCX0gd2hpbGUgKGZpbGUmJmxpbmUubGVuZ3RoKCkpOwotCQl9IHdoaWxlIChmaWxlKTsKLQkJcmV0dXJuIDE7Ci0JfQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ENVRhYmxlcy5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvRDVUYWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2OTNmMC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ENVRhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2ggKFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0laQSsrICggZXh0ZW5zaW9uIG9mIEdJWkEgKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2lmbmRlZiBfZDV0YWJsZXNfaF9kZWZpbmUKLSNkZWZpbmUgX2Q1dGFibGVzX2hfZGVmaW5lCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgIkQ0VGFibGVzLmgiCi0KLWV4dGVybiBmbG9hdCBkNW1vZGVsc21vb3RoX2NvdW50b2Zmc2V0OwotZXh0ZXJuIGZsb2F0IGQ1bW9kZWxzbW9vdGhfZmFjdG9yOwotCi0jZGVmaW5lIFVOU0VFTlBST0IgKDEuMC92YWNhbmNpZXNfdG90YWwpCi0KLWNsYXNzIGQ1bW9kZWwKLXsKLSBwcml2YXRlOgotICB0eXBlZGVmIFZlY3RvciA8IHBhaXIgPCBDT1VOVCxQUk9CID4gPlZwZmY7Ci0gIG1hcDwgbTRfa2V5LFZwZmYsY29tcGFyZTEgPiBEMTsKLSAgbWFwPCBtNF9rZXksVnBmZixjb21wYXJlYjEgPiBEYjE7Ci0gcHVibGljOgotICBkNG1vZGVsJmQ0bTsKLSAgV29yZENsYXNzZXMqIGV3b3JkY2xhc3NlczsKLSAgV29yZENsYXNzZXMqIGZ3b3JkY2xhc3NlczsKLSAgdGVtcGxhdGU8Y2xhc3MgTUFQUEVSPgotICB2b2lkIG1ha2VXb3JkQ2xhc3Nlcyhjb25zdCBNQVBQRVImbTEsY29uc3QgTUFQUEVSJm0yLHN0cmluZyBlZmlsZSxzdHJpbmcgZmZpbGUKLSAgICAgICwgY29uc3QgdmNiTGlzdCYgZWxpc3QsCi0JICAgIGNvbnN0IHZjYkxpc3QmIGZsaXN0KQotICAgIHsKLSAgICAgIGlmc3RyZWFtIGVzdHJtKGVmaWxlLmNfc3RyKCkpLGZzdHJtKGZmaWxlLmNfc3RyKCkpOwotICAgICAgaWYoICFlc3RybSApCi0JY2VyciA8PCAiRVJST1I6IGNhbiBub3QgcmVhZCBjbGFzc2VzIGZyb20gIiA8PCBlZmlsZSA8PCBlbmRsOwotICAgICAgZWxzZQotCWV3b3JkY2xhc3Nlcy0+cmVhZChlc3RybSxtMSxlbGlzdCk7Ci0gICAgICBpZiggIWZzdHJtICkKLQljZXJyIDw8ICJFUlJPUjogY2FuIG5vdCByZWFkIGNsYXNzZXMgZnJvbSAiIDw8IGZmaWxlIDw8IGVuZGw7Ci0gICAgICBlbHNlCi0JZndvcmRjbGFzc2VzLT5yZWFkKGZzdHJtLG0yLGZsaXN0KTsKLSAgICB9Ci0gIGQ1bW9kZWwgKGQ0bW9kZWwmX2Q0bSkKLSAgICA6RDEgKGNvbXBhcmUxKE01X0RlcGVuZGVuY2llcykpLCBEYjEgKGNvbXBhcmViMShNNV9EZXBlbmRlbmNpZXMpKSxkNG0oX2Q0bSksCi0JCWV3b3JkY2xhc3NlcyhfZDRtLmV3b3JkY2xhc3NlcyksZndvcmRjbGFzc2VzKF9kNG0uZndvcmRjbGFzc2VzKQotICAgIHt9Ci0gIENPVU5UICZnZXRDb3VudFJlZl9maXJzdCAoUG9zaXRpb25JbmRleCB2YWNhbmNpZXNfaiwKLQkJCSAgICBQb3NpdGlvbkluZGV4IHZhY2FuY2llc19qcCwgaW50IEYsCi0JCQkgICAgUG9zaXRpb25JbmRleCBsLCBQb3NpdGlvbkluZGV4IG0sCi0JCQkgICAgUG9zaXRpb25JbmRleCB2YWNhbmNpZXNfdG90YWwpCi0gIHsKLSAgICBtYXNzZXJ0KHZhY2FuY2llc19qPjApOwotICAgIG1hc3NlcnQodmFjYW5jaWVzX3RvdGFsPjApOwotICAgIC8vbWFzc2VydCh2YWNhbmNpZXNfanA8PXZhY2FuY2llc190b3RhbCk7Ci0gICAgbWFzc2VydCh2YWNhbmNpZXNfaiA8PXZhY2FuY2llc190b3RhbCk7Ci0gICAgbWFzc2VydCh2YWNhbmNpZXNfdG90YWw8PW0pOwotICAgIG00X2tleSBrZXkoTTVfRGVwZW5kZW5jaWVzLGwsbSxGLDAsMCx2YWNhbmNpZXNfanAsdmFjYW5jaWVzX3RvdGFsKTsKLSAgICBtYXA8bTRfa2V5LFZwZmYsY29tcGFyZTEgPjo6aXRlcmF0b3IgcD1EMS5maW5kKGtleSk7Ci0gICAgaWYocD09RDEuZW5kKCkpCi0gICAgICBwPUQxLmluc2VydChtYWtlX3BhaXIoa2V5LFZwZmYodmFjYW5jaWVzX3RvdGFsKzEsbWFrZV9wYWlyKDAsVU5TRUVOUFJPQikpKSkuZmlyc3Q7IC8vICEhISBjb25zdHJhaW4gbGVuZ3RoCi0gICAgbWFzc2VydChwIT1EMS5lbmQoKSk7Ci0gICAgcmV0dXJuIChwLT5zZWNvbmQpW3ZhY2FuY2llc19qXS5maXJzdDsKLSAgfQotICBDT1VOVCAmZ2V0Q291bnRSZWZfYmlnZ2VyIChQb3NpdGlvbkluZGV4IHZhY2FuY2llc19qLAotCQkJICAgICBQb3NpdGlvbkluZGV4IHZhY2FuY2llc19qcCwgaW50IEYsCi0JCQkgICAgIFBvc2l0aW9uSW5kZXggbCwgUG9zaXRpb25JbmRleCBtLAotCQkJICAgICBQb3NpdGlvbkluZGV4IHZhY2FuY2llc190b3RhbCkKLSAgewotICAgIG1hc3NlcnQodmFjYW5jaWVzX2o+MCk7Ci0gICAgbWFzc2VydCh2YWNhbmNpZXNfdG90YWw+MCk7Ci0gICAgbWFzc2VydCAodmFjYW5jaWVzX2pwIDw9IHZhY2FuY2llc19qKTsKLSAgICBtYXNzZXJ0ICh2YWNhbmNpZXNfai12YWNhbmNpZXNfanAgPD0gdmFjYW5jaWVzX3RvdGFsKTsKLSAgICBtNF9rZXkga2V5KE01X0RlcGVuZGVuY2llcyxsLG0sRiwwLDAsLTEsdmFjYW5jaWVzX3RvdGFsKTsKLSAgICBtYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46Oml0ZXJhdG9yIHA9RGIxLmZpbmQoa2V5KTsKLSAgICBpZihwPT1EYjEuZW5kKCkpCi0gICAgICBwPURiMS5pbnNlcnQobWFrZV9wYWlyKGtleSxWcGZmKHZhY2FuY2llc190b3RhbCsxLG1ha2VfcGFpcigwLFVOU0VFTlBST0IpKSkpLmZpcnN0OyAvLyAhISEgY29uc3RyYWluIGxlbmd0aAotICAgIG1hc3NlcnQocCE9RGIxLmVuZCgpKTsKLSAgICByZXR1cm4gKHAtPnNlY29uZClbdmFjYW5jaWVzX2ogLSB2YWNhbmNpZXNfanBdLmZpcnN0OwotICB9Ci0gIFBST0IgZ2V0UHJvYl9maXJzdCAoUG9zaXRpb25JbmRleCB2YWNhbmNpZXNfaiwgUG9zaXRpb25JbmRleCB2YWNhbmNpZXNfanAsCi0JCSAgICAgICBpbnQgRiwgUG9zaXRpb25JbmRleCBsLCBQb3NpdGlvbkluZGV4IG0sCi0JCSAgICAgICBQb3NpdGlvbkluZGV4IHZhY2FuY2llc190b3RhbCkgY29uc3QKLSAgewotICAgIG1hc3NlcnQodmFjYW5jaWVzX2o+MCk7Ci0gICAgbWFzc2VydCh2YWNhbmNpZXNfdG90YWw+MCk7Ci0gICAgLy9tYXNzZXJ0KHZhY2FuY2llc19qcDw9dmFjYW5jaWVzX3RvdGFsKTsKLSAgICBtYXNzZXJ0KHZhY2FuY2llc19qIDw9dmFjYW5jaWVzX3RvdGFsKTsKLSAgICBtYXNzZXJ0KHZhY2FuY2llc190b3RhbDw9bSk7Ci0gICAgbTRfa2V5IGtleShNNV9EZXBlbmRlbmNpZXMsbCxtLEYsMCwwLHZhY2FuY2llc19qcCx2YWNhbmNpZXNfdG90YWwpOwotICAgIG1hcDxtNF9rZXksVnBmZixjb21wYXJlMSA+Ojpjb25zdF9pdGVyYXRvciBwPUQxLmZpbmQoa2V5KTsKLSAgICBpZiggcD09RDEuZW5kKCkgKQotICAgICAgcmV0dXJuIFVOU0VFTlBST0I7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG1heChQUk9CX1NNT09USCxkNW1vZGVsc21vb3RoX2ZhY3Rvci8odmFjYW5jaWVzX3RvdGFsKSsoMS1kNW1vZGVsc21vb3RoX2ZhY3RvcikqKHAtPnNlY29uZClbdmFjYW5jaWVzX2pdLnNlY29uZCk7Ci0gIH0KLSAgUFJPQiBnZXRQcm9iX2JpZ2dlciAoUG9zaXRpb25JbmRleCB2YWNhbmNpZXNfaiwgUG9zaXRpb25JbmRleCB2YWNhbmNpZXNfanAsCi0JCQlpbnQgRiwgUG9zaXRpb25JbmRleCBsLCBQb3NpdGlvbkluZGV4IG0sCi0JCQlQb3NpdGlvbkluZGV4IHZhY2FuY2llc190b3RhbCkgY29uc3QKLSAgewotICAgIG1hc3NlcnQodmFjYW5jaWVzX2o+MCk7Ci0gICAgbWFzc2VydCh2YWNhbmNpZXNfdG90YWw+MCk7Ci0gICAgbWFzc2VydCAodmFjYW5jaWVzX2pwIDw9IHZhY2FuY2llc19qKTsKLSAgICBtYXNzZXJ0ICh2YWNhbmNpZXNfai12YWNhbmNpZXNfanAgPD0gdmFjYW5jaWVzX3RvdGFsKTsKLSAgICBtNF9rZXkga2V5KE01X0RlcGVuZGVuY2llcyxsLG0sRiwwLDAsLTEsdmFjYW5jaWVzX3RvdGFsKTsKLSAgICBtYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46OmNvbnN0X2l0ZXJhdG9yIHA9RGIxLmZpbmQoa2V5KTsKLSAgICBpZihwPT1EYjEuZW5kKCkpCi0gICAgICByZXR1cm4gVU5TRUVOUFJPQjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbWF4KFBST0JfU01PT1RILGQ1bW9kZWxzbW9vdGhfZmFjdG9yLyh2YWNhbmNpZXNfdG90YWwpKygxLWQ1bW9kZWxzbW9vdGhfZmFjdG9yKSoocC0+c2Vjb25kKVt2YWNhbmNpZXNfaiAtIHZhY2FuY2llc19qcF0uc2Vjb25kKTsKLSAgfQotICB2b2lkIG5vcm1hbGl6ZVRhYmxlICgpCi0gICAgewotICAgICAgaW50IG5QYXJhbXM9MDsKLSAgICAgIGZvcihtYXA8bTRfa2V5LFZwZmYsY29tcGFyZTEgPjo6aXRlcmF0b3IgaT1EMS5iZWdpbigpO2khPUQxLmVuZCgpOysraSkKLQl7Ci0JICBWcGZmJmQxPWktPnNlY29uZDsKLQkgIENPVU5UIHN1bT0wLjA7Ci0JICBmb3IoUG9zaXRpb25JbmRleCBpPTA7aTxkMS5zaXplKCk7aSsrKQotCSAgICBzdW0rPWQxW2ldLmZpcnN0K2Q1bW9kZWxzbW9vdGhfY291bnRvZmZzZXQ7Ci0JICBmb3IoUG9zaXRpb25JbmRleCBpPTA7aTxkMS5zaXplKCk7aSsrKQotCSAgICB7Ci0JICAgICAgZDFbaV0uc2Vjb25kPXN1bT8oKGQxW2ldLmZpcnN0K2Q1bW9kZWxzbW9vdGhfY291bnRvZmZzZXQpL3N1bSk6KDEuMC9kMS5zaXplKCkpOwotCSAgICAgIG5QYXJhbXMrKzsKLQkgICAgfQotCX0KLSAgICAgIGZvcihtYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46Oml0ZXJhdG9yIGk9RGIxLmJlZ2luKCk7aSE9RGIxLmVuZCgpOysraSkKLQl7Ci0JICBWcGZmJmRiMT1pLT5zZWNvbmQ7Ci0JICBkb3VibGUgc3VtPTAuMDsKLQkgIGZvcihQb3NpdGlvbkluZGV4IGk9MDtpPGRiMS5zaXplKCk7aSsrKQotCSAgICBzdW0rPWRiMVtpXS5maXJzdCtkNW1vZGVsc21vb3RoX2NvdW50b2Zmc2V0OwotCSAgZm9yKFBvc2l0aW9uSW5kZXggaT0wO2k8ZGIxLnNpemUoKTtpKyspCi0JICAgIHsKLQkgICAgICBkYjFbaV0uc2Vjb25kPXN1bT8oKGRiMVtpXS5maXJzdCtkNW1vZGVsc21vb3RoX2NvdW50b2Zmc2V0KS9zdW0pOigxLjAvZGIxLnNpemUoKSk7Ci0JICAgICAgblBhcmFtcysrOwotCSAgICB9Ci0JfQotICAgICAgY291dCA8PCAiRDUgdGFibGUgY29udGFpbnMgIiA8PCBuUGFyYW1zIDw8ICIgcGFyYW1ldGVycy5cbiI7Ci0gICAgfQotICAKLWZyaWVuZCBvc3RyZWFtJm9wZXJhdG9yPDwob3N0cmVhbSZvdXQsZDVtb2RlbCZkNW0pIHsgIAotICAgIG91dCA8PCAiIyBUcmFuc2xhdGlvbiB0YWJsZXMgZm9yIE1vZGVsIDUgLlxuIjsKLSAgICBvdXQgPDwgIiMgVGFibGUgZm9yIGhlYWQgb2YgY2VwdC5cbiI7Ci0gICAgZm9yKG1hcDxtNF9rZXksVnBmZixjb21wYXJlMSA+Ojpjb25zdF9pdGVyYXRvciBpPWQ1bS5EMS5iZWdpbigpO2khPWQ1bS5EMS5lbmQoKTsrK2kpewotICAgICAgICBjb25zdCBWcGZmJmQxPWktPnNlY29uZDsKLSAgICAgICAgQ09VTlQgc3VtPTAuMDsKLSAgICAgICAgZm9yKFBvc2l0aW9uSW5kZXggaWk9MDtpaTxkMS5zaXplKCk7aWkrKylzdW0rPWQxW2lpXS5maXJzdDsKLSAgICAgICAgaWYgKCBzdW0gKSB7Ci0gICAgICAgICAgICBmb3IodW5zaWduZWQgaWk9MDtpaTxkMS5zaXplKCk7aWkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludDFfbTUob3V0LGktPmZpcnN0LCpkNW0uZXdvcmRjbGFzc2VzLCpkNW0uZndvcmRjbGFzc2VzKTsKLSAgICAgICAgICAgICAgICBvdXQgPDwgKGludCkoaWkpIDw8ICcgJyA8PCBkMVtpaV0uc2Vjb25kICA8PCAnICcgPDwgZDFbaWldLmZpcnN0IDw8ICdcbic7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIiMgVGFibGUgZm9yIG5vbi1oZWFkIG9mIGNlcHQuXG4iOwotICAgIGZvcihtYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46OmNvbnN0X2l0ZXJhdG9yIGk9ZDVtLkRiMS5iZWdpbigpO2khPWQ1bS5EYjEuZW5kKCk7KytpKXsKLSAgICAgICAgY29uc3QgVnBmZiZkYjE9aS0+c2Vjb25kOwotICAgICAgICBkb3VibGUgc3VtPTAuMDsKLSAgICAgICAgZm9yKFBvc2l0aW9uSW5kZXggaWk9MDtpaTxkYjEuc2l6ZSgpOysraWkpc3VtKz1kYjFbaWldLmZpcnN0OwotICAgICAgICBpZiggc3VtICl7Ci0gICAgICAgICAgICBmb3IodW5zaWduZWQgaWk9MDtpaTxkYjEuc2l6ZSgpO2lpKyspewotICAgICAgICAgICAgICAgIHByaW50YjFfbTUob3V0LGktPmZpcnN0LCpkNW0uZndvcmRjbGFzc2VzKTsKLSAgICAgICAgICAgICAgICBvdXQgPDwgKGludCkoaWkpIDw8ICcgJyA8PCBkYjFbaWldLnNlY29uZCA8PCAnICcgPDwgZGIxW2lpXS5maXJzdCA8PCAnXG4nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG91dDsKLX0KLSAgdm9pZCByZWFkUHJvYlRhYmxlKGNvbnN0IGNoYXIqeCkKLSAgICB7Ci0gICAgICBpZnN0cmVhbSBmKHgpOwotICAgICAgc3RyaW5nIGw7Ci0gICAgICB3aGlsZShnZXRsaW5lKGYsbCkpCi0JewotCSAgaWYobC5sZW5ndGgoKSYmbFswXT09JyMnKQotCSAgICBjb250aW51ZTsKLQkgIGlzdHJzdHJlYW0gaXMobC5jX3N0cigpKTsKLQkgIHN0cmluZyBFLEY7Ci0JICBpbnQgdjEsdjIsaWk7Ci0JICBkb3VibGUgcHJvYixjb3VudDsKLQkgIGlmKGlzPj5FPj5GPj52MT4+djI+PmlpPj5wcm9iPj5jb3VudCkKLQkgICAgewotCSAgICAgIC8vY2VyciA8PCAiUmVhZDogIiA8PCBFIDw8ICIgIiA8PCBGIDw8ICIgIiA8PCB2MSA8PCAiICIgPDwgdjIgPDwgIiAiIDw8IHByb2I8PCBlbmRsOwotCSAgICAgIGlmKCBjb3VudD4wICkKLQkJaWYoIEU9PSItMSIpCi0JCSAgZ2V0Q291bnRSZWZfYmlnZ2VyKGlpLDAsKCpmd29yZGNsYXNzZXMpKEYpLDEwMDAsMTAwMCx2MikrPWNvdW50OwotCQllbHNlCi0JCSAgZ2V0Q291bnRSZWZfZmlyc3QoaWksdjEsKCpmd29yZGNsYXNzZXMpKEYpLDEwMDAsMTAwMCx2MikrPWNvdW50OwotCSAgICB9Ci0JfQotICAgICAgbm9ybWFsaXplVGFibGUoKTsKLSAgICAgIC8vb2ZzdHJlYW0gb2YoIk01RklMRSIpOwotICAgICAgLy9vZiA8PCAoKnRoaXMpOwotICAgIH0KLSAgdm9pZCBjbGVhcigpCi0gICAgewotICAgICAgZm9yKG1hcDxtNF9rZXksVnBmZixjb21wYXJlMSA+OjppdGVyYXRvciBpPUQxLmJlZ2luKCk7aSE9RDEuZW5kKCk7KytpKQotCXsKLQkgIFZwZmYmZDE9aS0+c2Vjb25kOwotCSAgZm9yKFBvc2l0aW9uSW5kZXggaT0wO2k8ZDEuc2l6ZSgpO2krKykKLQkgICAgZDFbaV0uZmlyc3Q9MC4wOwotCX0KLSAgICAgIGZvcihtYXA8bTRfa2V5LFZwZmYsY29tcGFyZWIxID46Oml0ZXJhdG9yIGk9RGIxLmJlZ2luKCk7aSE9RGIxLmVuZCgpOysraSkKLQl7Ci0JICBWcGZmJmRiMT1pLT5zZWNvbmQ7Ci0JICBmb3IoUG9zaXRpb25JbmRleCBpPTA7aTxkYjEuc2l6ZSgpO2krKykKLQkgICAgZGIxW2ldLmZpcnN0PTAuMDsKLQl9Ci0gICAgfQotfTsKLQotI2VuZGlmCi0KLQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9EaWN0aW9uYXJ5LmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0RpY3Rpb25hcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGQ5ZGMzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0RpY3Rpb25hcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0vKiBOb2FoIEEuIFNtaXRoCi0gICBEaWN0aW9uYXJ5IG9iamVjdCBmb3IgZGljdGlvbmFyeSBmaWx0ZXIgaW4gTW9kZWwgMSB0cmFpbmluZwotCi0gICBEaWN0aW9uYXJ5IGZpbGUgbXVzdCBiZSBpbiBvcmRlciAoc29ydGVkKSBieSBGb3JlaWduIHZvY2FiIGlkLCBidXQgRW5nbGlzaAotICAgdm9jYWIgaWRzIG1heSBiZSBpbiBhbnkgb3JkZXIuCi0KLSAgIDkgQXVndXN0IDE5OTkKLSovCi0KLSNpbmNsdWRlICJEaWN0aW9uYXJ5LmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLURpY3Rpb25hcnk6OkRpY3Rpb25hcnkoY29uc3QgY2hhciAqZmlsZW5hbWUpewotICBpZighc3RyY21wKGZpbGVuYW1lLCAiIikpewotICAgIGRlYWQgPSB0cnVlOwotICAgIHJldHVybjsKLSAgfQotICBkZWFkID0gZmFsc2U7Ci0gIGNvdXQgPDwgIlJlYWRpbmcgZGljdGlvbmFyeSBmcm9tOiAgIiA8PCBmaWxlbmFtZSA8PCAnXG4nOwotICBpZnN0cmVhbSBkRmlsZShmaWxlbmFtZSk7Ci0gIGlmKCFkRmlsZSl7Ci0gICAgY2VyciA8PCAiRVJST1I6IENhbid0IG9wZW4gZGljdGlvbmFyeTogIiA8PCBmaWxlbmFtZSA8PCAnXG4nOwotICAgIGV4aXQoMSk7Ci0gIH0KLQotICBjdXJyaW5kZXhtaW4gPSAwOwotICBjdXJyaW5kZXhtYXggPSAwOwotICBjdXJydmFsID0gMDsKLSAgaW50IHAsIHE7Ci0gIHdoaWxlKChkRmlsZSA+PiBwID4+IHEpKXsKLSAgICBwYWlyc1swXS5wdXNoX2JhY2socCk7Ci0gICAgcGFpcnNbMV0ucHVzaF9iYWNrKHEpOwotICB9Ci0gIGNvdXQgPDwgIkRpY3Rpb25hcnkgcmVhZDsgIiA8PCBwYWlyc1swXS5zaXplKCkgPDwgIiBwYWlycyBsb2FkZWQuIiA8PCAnXG4nOwotICBkRmlsZS5jbG9zZSgpOwotfQotCi0KLWJvb2wgRGljdGlvbmFyeTo6aW5kaWN0KGludCBwLCBpbnQgcSl7Ci0gIGlmKGRlYWQpIHJldHVybiBmYWxzZTsKLSAgaWYocCA9PSAwICYmIHEgPT0gMCkgcmV0dXJuIGZhbHNlOwotICBpZihjdXJydmFsID09IHApewotICAgIGZvcihpbnQgaSA9IGN1cnJpbmRleG1pbjsgaSA8PSBjdXJyaW5kZXhtYXg7IGkrKykKLSAgICAgIGlmKHBhaXJzWzFdW2ldID09IHEpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBlbHNlewotICAgIGludCBiZWdpbiA9IDAsIGVuZCA9IHBhaXJzWzBdLnNpemUoKSAtIDEsIG1pZGRsZSA9IDA7Ci0gICAgdW5zaWduZWQgaW50IHQ7Ci0gICAgYm9vbCByZXQgPSBmYWxzZTsKLSAgICB3aGlsZShiZWdpbiA8PSBlbmQpewotICAgICAgbWlkZGxlID0gYmVnaW4gKyAoKGVuZCAtIGJlZ2luKSA+PiAxKTsKLSAgICAgIGlmKHAgPCBwYWlyc1swXVttaWRkbGVdKSBlbmQgPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZihwID4gcGFpcnNbMF1bbWlkZGxlXSkgYmVnaW4gPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZXsKLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgdCA9IG1pZGRsZTsKLSAgICB3aGlsZShwYWlyc1swXVt0XSA9PSBwICkKLSAgICAgIGlmKHBhaXJzWzFdW3QtLV0gPT0gcSkgcmV0ID0gdHJ1ZTsKLSAgICBjdXJyaW5kZXhtaW4gPSB0ICsgMTsKLSAgICB0ID0gbWlkZGxlICsgMTsKLSAgICB3aGlsZShwYWlyc1swXVt0XSA9PSBwICYmIHQgPCBwYWlyc1swXS5zaXplKCkpCi0gICAgICBpZihwYWlyc1sxXVt0KytdID09IHEpIHJldCA9IHRydWU7Ci0gICAgY3VycmluZGV4bWF4ID0gdCAtIDE7Ci0gICAgY3VycnZhbCA9IHA7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfQotICAKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvRGljdGlvbmFyeS5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvRGljdGlvbmFyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTVjNzFlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0RpY3Rpb25hcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0KLUVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotLyogTm9haCBBLiBTbWl0aAotICAgRGljdGlvbmFyeSBvYmplY3QgZm9yIGRpY3Rpb25hcnkgZmlsdGVyIGluIE1vZGVsIDEgdHJhaW5pbmcKLQotICAgOSBBdWd1c3QgMTk5OQotKi8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0KLSNpbmNsdWRlICJWZWN0b3IuaCIKLQotI2lmbmRlZiBESUNUSU9OQVJZX0gKLSNkZWZpbmUgRElDVElPTkFSWV9ICi0KLWNsYXNzIERpY3Rpb25hcnl7Ci0gcHJpdmF0ZToKLSAgVmVjdG9yPGludD4gcGFpcnNbMl07Ci0gIGludCBjdXJydmFsOwotICBpbnQgY3VycmluZGV4bWluOwotICBpbnQgY3VycmluZGV4bWF4OwotICBib29sIGRlYWQ7Ci0gcHVibGljOgotICBEaWN0aW9uYXJ5KGNvbnN0IGNoYXIgKik7Ci0gIGJvb2wgaW5kaWN0KGludCwgaW50KTsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvRmxleEFycmF5LmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9GbGV4QXJyYXkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkNzNlZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9GbGV4QXJyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk4OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdJWkErKyAoIGV4dGVuc2lvbiBvZiBHSVpBICkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpZm5kZWYgQ0xBU1NfRmxleEFycmF5X2RlZmluZWQKLSNkZWZpbmUgQ0xBU1NfRmxleEFycmF5X2RlZmluZWQKLSNpbmNsdWRlICJBcnJheS5oIgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci10ZW1wbGF0ZTxjbGFzcyBUPgotY2xhc3MgRmxleEFycmF5Ci17Ci1wcml2YXRlOgotICBBcnJheTxUPiBwOwotICBpbnQgc3RhcnQsRW5kOwotcHVibGljOgotICBGbGV4QXJyYXkoaW50IF9zdGFydD0wLGludCBfZW5kPS0xKQotICAgIDogcChfZW5kLV9zdGFydCsxKSxzdGFydChfc3RhcnQpLEVuZChfZW5kKSB7fQotICBGbGV4QXJyYXkoaW50IF9zdGFydCxpbnQgX2VuZCxjb25zdCBUJmluaXQpCi0gICAgOiBwKF9lbmQtX3N0YXJ0KzEsaW5pdCksc3RhcnQoX3N0YXJ0KSxFbmQoX2VuZCkge30KLSAgVCZvcGVyYXRvcltdKGludCBpKQotICAgIHtyZXR1cm4gcFtpLXN0YXJ0XTt9Ci0gIGNvbnN0IFQmb3BlcmF0b3JbXShpbnQgaSljb25zdAotICAgIHtyZXR1cm4gcFtpLXN0YXJ0XTt9Ci0gIGludCBsb3coKWNvbnN0e3JldHVybiBzdGFydDt9Ci0gIGludCBoaWdoKCljb25zdHtyZXR1cm4gRW5kO30KLSNpZmRlZiBXSU4zMgotICBUKmJlZ2luKCl7cmV0dXJuIGNvbnN0X2Nhc3Q8ZG91YmxlKj4oJnBbMF0pO30KLSAgVCplbmQoKXtyZXR1cm4gY29uc3RfY2FzdDxkb3VibGUqPigmKHBbMF0pK3Auc2l6ZSgpKTt9Ci0jZWxzZQotICBUKmJlZ2luKCl7cmV0dXJuIGNvbnY8ZG91YmxlPihwLmJlZ2luKCkpO30KLSAgVCplbmQoKXtyZXR1cm4gY29udjxkb3VibGU+KHAuZW5kKCkpO30KLSNlbmRpZgotfTsKLQotdGVtcGxhdGU8Y2xhc3MgVD4KLWlubGluZSBvc3RyZWFtJm9wZXJhdG9yPDwob3N0cmVhbSZvdXQsY29uc3QgRmxleEFycmF5PFQ+JngpCi17Ci0gIGZvcihpbnQgaT14LmxvdygpO2k8PXguaGlnaCgpOysraSkKLSAgICBvdXQgPDwgaSA8PCAnOicgPDwgeFtpXSA8PCAnOycgPDwgJyAnOwotICByZXR1cm4gb3V0OwotfQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvRm9yd2FyZEJhY2t3YXJkLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0ZvcndhcmRCYWNrd2FyZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NzdkZDAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvRm9yd2FyZEJhY2t3YXJkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2ggKFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0laQSsrICggZXh0ZW5zaW9uIG9mIEdJWkEgKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2lmbmRlZiBOT19UUkFJTklORwotI2luY2x1ZGUgIkZvcndhcmRCYWNrd2FyZC5oIgotI2luY2x1ZGUgIkdsb2JhbHMuaCIKLSNpbmNsdWRlICJteWFzc2VydC5oIgotI2luY2x1ZGUgIkhNTVRhYmxlcy5oIgotI2luY2x1ZGUgIm15bWF0aC5oIgotCi0KLWRvdWJsZSBGb3J3YXJkQmFja3dhcmRUcmFpbmluZyhjb25zdCBITU1OZXR3b3JrJm5ldCxBcnJheTxkb3VibGU+JmcsQXJyYXk8QXJyYXkyPGRvdWJsZT4gPiZFKXsKLSAgY29uc3QgaW50IEk9bmV0LnNpemUxKCksSj1uZXQuc2l6ZTIoKSxOPUkqSjsKLSAgQXJyYXk8ZG91YmxlPiBhbHBoYShOLDApLGJldGEoTiwwKSxzdW0oSik7Ci0gIGZvcihpbnQgaT0wO2k8STtpKyspCi0gICAgYmV0YVtOLUkraV09bmV0LmdldEJldGFpbml0KGkpOwotI2lmZGVmIFdJTjMyCi0gIGRvdWJsZSAqIGN1cl9iZXRhPWNvbnN0X2Nhc3Q8ZG91YmxlKj4oJihiZXRhWzBdKSkrTi1JLTE7Ci0jZWxzZQotICBkb3VibGUgKiBjdXJfYmV0YT1jb252PGRvdWJsZT4oYmV0YS5iZWdpbigpKStOLUktMTsKLSNlbmRpZgotICBmb3IoaW50IGo9Si0yO2o+PTA7LS1qKQotICAgIGZvcihpbnQgdGk9SS0xO3RpPj0wOy0tdGksLS1jdXJfYmV0YSkgewotICAgICAgY29uc3QgZG91YmxlICpuZXh0X2JldGE9Y29udjxkb3VibGU+KGJldGEuYmVnaW4oKSkrKGorMSkqSTsKLSAgICAgIGNvbnN0IGRvdWJsZSAqYWxwcm9iPSZuZXQub3V0UHJvYihqLHRpLDApLCpuZXh0X25vZGU9Jm5ldC5ub2RlUHJvYigwLGorMSk7Ci0gICAgICBmb3IoaW50IG5pPTA7bmk8STsrK25pLChuZXh0X25vZGUrPUopKXsKLQltYXNzZXJ0KGN1cl9iZXRhPG5leHRfYmV0YSYmICZuZXQub3V0UHJvYihqLHRpLG5pKT09YWxwcm9iKTsKLQltYXNzZXJ0KG5leHRfbm9kZSA9PSAmbmV0Lm5vZGVQcm9iKG5pLGorMSkpOwotCS8qCWlmKCBWRVJCJiYoKm5leHRfYmV0YSkqKCphbHByb2IpKigqbmV4dF9ub2RlKSApCi0JICBjb3V0IDw8ICJCPSAiIDw8IChpbnQpKGN1cl9iZXRhLWJldGEuYmVnaW4oKSkgPDwgIiArPSAiIDw8ICgqbmV4dF9iZXRhKSA8PCAiKCIgCi0JICA8PCBuZXh0X2JldGEtYmV0YS5iZWdpbigpIDw8ICIpIGFscHJvYjoiIDw8ICgqYWxwcm9iKSA8PCAiICBsZXhwcm9iOiIgPDwgKCpuZXh0X25vZGUpIDw8IGVuZGw7Ki8KLQkoKmN1cl9iZXRhKSs9KCpuZXh0X2JldGErKykqKCphbHByb2IrKykqKCpuZXh0X25vZGUpOwotICAgICAgfQotICAgIH0KLSAgZm9yKGludCBpPTA7aTxJO2krKykgIAotICAgIGFscGhhW2ldPW5ldC5nZXRBbHBoYWluaXQoaSkqbmV0Lm5vZGVQcm9iKGksMCk7Ci0jaWZkZWYgV0lOMzIKLSAgZG91YmxlKiBjdXJfYWxwaGE9Y29uc3RfY2FzdDxkb3VibGUqPigmKGFscGhhWzBdKSkrSTsKLSAgY3VyX2JldGE9Y29uc3RfY2FzdDxkb3VibGUqPigmKGJldGFbMF0pKStJOwotI2Vsc2UKLSAgZG91YmxlKiBjdXJfYWxwaGE9Y29udjxkb3VibGU+KGFscGhhLmJlZ2luKCkpK0k7Ci0gIGN1cl9iZXRhPWNvbnY8ZG91YmxlPihiZXRhLmJlZ2luKCkpK0k7Ci0jZW5kaWYKLQotICBmb3IoaW50IGo9MTtqPEo7aisrKXsKLSAgICBBcnJheTI8ZG91YmxlPiZlPUVbIChFLnNpemUoKT09MSk/MDooai0xKSBdOwotICAgIGlmKCAoRS5zaXplKCkhPTEpIHx8IGo9PTEgKQotICAgICAgewotCWUucmVzaXplKEksSSk7Ci0JZmlsbChlLmJlZ2luKCksZS5lbmQoKSwwLjApOwotICAgICAgfQotICAgIAotICAgIGZvcihpbnQgdGk9MDt0aTxJOysrdGksKytjdXJfYWxwaGEsKytjdXJfYmV0YSkgewotICAgICAgY29uc3QgZG91YmxlICogcHJldl9hbHBoYT1jb252PGRvdWJsZT4oYWxwaGEuYmVnaW4oKSkrSSooai0xKTsKLSAgICAgIGRvdWJsZSAqY3VyX2U9ICZlKHRpLDApOwotICAgICAgZG91YmxlIHRoaXNfbm9kZT1uZXQubm9kZVByb2IodGksaik7Ci0gICAgICBjb25zdCBkb3VibGUqIGFscHJvYj0gJm5ldC5vdXRQcm9iKGotMSwwLHRpKTsKLSAgICAgIGZvcihpbnQgcGk9MDtwaTxJOysrcGksKytwcmV2X2FscGhhLChhbHByb2IrPUkpKXsKLQltYXNzZXJ0KHByZXZfYWxwaGE8Y3VyX2FscGhhJiYgJm5ldC5vdXRQcm9iKGotMSxwaSx0aSk9PWFscHJvYik7Ci0JbWFzc2VydCgmZSh0aSxwaSk9PWN1cl9lKTsKLQljb25zdCBkb3VibGUgYWxwaGFfaW5jcmVtZW50PSAqcHJldl9hbHBoYSooKmFscHJvYikqdGhpc19ub2RlOwotCSgqY3VyX2FscGhhKSs9YWxwaGFfaW5jcmVtZW50OwotCSgqY3VyX2UrKykrPWFscGhhX2luY3JlbWVudCooKmN1cl9iZXRhKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZy5yZXNpemUoTik7Ci0gIHRyYW5zZm9ybShhbHBoYS5iZWdpbigpLGFscGhhLmVuZCgpLGJldGEuYmVnaW4oKSxnLmJlZ2luKCksbXVsdGlwbGllczxkb3VibGU+KCkpOwotICBkb3VibGUgYnN1bT0wLGVzdW09MCxlc3VtMjsKLSAgZm9yKGludCBpPTA7aTxJO2krKykKLSAgICBic3VtKz1iZXRhW2ldKm5ldC5ub2RlUHJvYihpLDApKm5ldC5nZXRBbHBoYWluaXQoaSk7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaj0wO2o8KHVuc2lnbmVkIGludClFLnNpemUoKTtqKyspCi0gICAgewotICAgICAgQXJyYXkyPGRvdWJsZT4mZT1FW2pdOwotICAgICAgY29uc3QgZG91YmxlICplcGU9ZS5lbmQoKTsKLSAgICAgIGZvcihjb25zdCBkb3VibGUqZXA9ZS5iZWdpbigpO2VwIT1lcGU7KytlcCkKLQllc3VtKz0qZXA7Ci0gICAgfQotICBpZiggSj4xICkgCi0gICAgZXN1bTI9ZXN1bS8oSi0xKTsKLSAgZWxzZQotICAgIGVzdW0yPTAuMDsKLSAgaWYoIShlc3VtMj09MC4wfHxtZmFicyhlc3VtMi1ic3VtKS9ic3VtPDFlLTMqSSkpCi0gICAgY291dCA8PCAiRVJST1IyOiAiIDw8IGVzdW0yIDw8IiAiIDw8YnN1bSA8PCAiICIgPDwgZXN1bSA8PCBuZXQgPDwgZW5kbDsKLSNpZmRlZiBXSU4zMgotICBkb3VibGUgKiBzdW1wdHI9Y29uc3RfY2FzdDxkb3VibGUqPigmKHN1bVswXSkpOwotICBkb3VibGUqIGdlPWNvbnN0X2Nhc3Q8ZG91YmxlKj4oJihnWzBdKStnLnNpemUoKSk7Ci0gIGZvcihkb3VibGUqIGdwPWNvbnN0X2Nhc3Q8ZG91YmxlKj4oJihnWzBdKSk7Z3AhPWdlO2dwKz1JKQotICB7Ci0JICAqc3VtcHRyKys9bm9ybWFsaXplX2lmX3Bvc3NpYmxlKGdwLGdwK0kpOwotCSAgaWYoYnN1bSAmJiAhKG1mYWJzKCgqKHN1bXB0ci0xKS1ic3VtKS9ic3VtKTwxZS0zKkkpKQotCQkgIGNvdXQgPDwgIkVSUk9SOiAiIDw8ICooc3VtcHRyLTEpIDw8ICIgIiA8PCBic3VtIDw8ICIgIiA8PCBtZmFicygoKihzdW1wdHItMSktYnN1bSkvYnN1bSkgPDwgJyAnIDw8IEkgPDwgJyAnIDw8IEogPDwgZW5kbDsKLSAgfQotI2Vsc2UKLSAgZG91YmxlICogc3VtcHRyPWNvbnY8ZG91YmxlPihzdW0uYmVnaW4oKSk7Ci0gIGRvdWJsZSogZ2U9Y29udjxkb3VibGU+KGcuZW5kKCkpOwotICBmb3IoZG91YmxlKiBncD1jb252PGRvdWJsZT4oZy5iZWdpbigpKTtncCE9Z2U7Z3ArPUkpCi0gICAgewotICAgICAgKnN1bXB0cisrPW5vcm1hbGl6ZV9pZl9wb3NzaWJsZShncCxncCtJKTsKLSAgICAgIGlmKGJzdW0gJiYgIShtZmFicygoKihzdW1wdHItMSktYnN1bSkvYnN1bSk8MWUtMypJKSkKLQljb3V0IDw8ICJFUlJPUjogIiA8PCAqKHN1bXB0ci0xKSA8PCAiICIgPDwgYnN1bSA8PCAiICIgPDwgbWZhYnMoKCooc3VtcHRyLTEpLWJzdW0pL2JzdW0pIDw8ICcgJyA8PCBJIDw8ICcgJyA8PCBKIDw8IGVuZGw7Ci0gICAgfQotI2VuZGlmCi0gIGZvcih1bnNpZ25lZCBpbnQgaj0wO2o8KHVuc2lnbmVkIGludClFLnNpemUoKTtqKyspCi0gICAgewotICAgICAgQXJyYXkyPGRvdWJsZT4mZT1FW2pdOwotICAgICAgZG91YmxlKiBlcGU9ZS5lbmQoKTsKLSAgICAgIGlmKCBlc3VtICkKLQlmb3IoZG91YmxlKmVwPWUuYmVnaW4oKTtlcCE9ZXBlOysrZXApCi0JICAqZXAvPWVzdW07Ci0gICAgICBlbHNlCi0JZm9yKGRvdWJsZSplcD1lLmJlZ2luKCk7ZXAhPWVwZTsrK2VwKQotCSAgKmVwLz0xLjAvKG1heChJKkksSSpJKihKLTEpKSk7Ci0gICAgfQotICBpZiggc3VtLnNpemUoKSApCi0gICAgcmV0dXJuIHN1bVswXTsKLSAgZWxzZQotICAgIHJldHVybiAxLjA7Ci19Ci12b2lkIEhNTVZpdGVyYmkoY29uc3QgSE1NTmV0d29yayZuZXQsQXJyYXk8aW50PiZ2aXQpIHsKLSAgY29uc3QgaW50IEk9bmV0LnNpemUxKCksSj1uZXQuc2l6ZTIoKTsKLSAgdml0LnJlc2l6ZShKKTsKLSAgQXJyYXk8ZG91YmxlPmc7Ci0gIEFycmF5PEFycmF5Mjxkb3VibGU+ID5lKDEpOwotICBGb3J3YXJkQmFja3dhcmRUcmFpbmluZyhuZXQsZyxlKTsKLSAgZm9yKGludCBqPTA7ajxKO2orKykgewotI2lmZGVmIFdJTjMyCi0JICBkb3VibGUgKiBiZWdpbj1jb25zdF9jYXN0PGRvdWJsZSo+KCYoZ1swXSkpK0kqajsKLSNlbHNlCi0gICAgZG91YmxlICogYmVnaW49Y29udjxkb3VibGU+KGcuYmVnaW4oKSkrSSpqOwotI2VuZGlmCi0gICAgdml0W2pdPW1heF9lbGVtZW50KGJlZ2luLGJlZ2luK0kpLWJlZ2luOwotICB9Ci19Ci12b2lkIEhNTVZpdGVyYmkoY29uc3QgSE1NTmV0d29yayZuZXQsQXJyYXk8ZG91YmxlPiZnLEFycmF5PGludD4mdml0KSB7Ci0gIGNvbnN0IGludCBJPW5ldC5zaXplMSgpLEo9bmV0LnNpemUyKCk7Ci0gIHZpdC5yZXNpemUoSik7Ci0gIGZvcihpbnQgaj0wO2o8SjtqKyspIHsKLSNpZmRlZiBXSU4zMgotCWRvdWJsZSogYmVnaW49Y29uc3RfY2FzdDxkb3VibGUqPigmKGdbMF0pKStJKmo7Ci0jZWxzZQotICAgIGRvdWJsZSogYmVnaW49Y29udjxkb3VibGU+KGcuYmVnaW4oKSkrSSpqOwotI2VuZGlmCi0gICAgdml0W2pdPW1heF9lbGVtZW50KGJlZ2luLGJlZ2luK0kpLWJlZ2luOwotICB9Ci19Ci0KLWRvdWJsZSBITU1SZWFsVml0ZXJiaShjb25zdCBITU1OZXR3b3JrJm5ldCxBcnJheTxpbnQ+JnZpdGFyLGludCBwZWdpLGludCBwZWdqLGJvb2wgdmVyYm9zZSl7Ci0gIGNvbnN0IGludCBJPW5ldC5zaXplMSgpLEo9bmV0LnNpemUyKCksTj1JKko7Ci0gIEFycmF5PGRvdWJsZT4gYWxwaGEoTiwtMSk7Ci0gIEFycmF5PGRvdWJsZSo+IGJwKE4sKGRvdWJsZSopMCk7ICAKLSAgdml0YXIucmVzaXplKEopOwotICBpZiggSj09MCApCi0gICAgcmV0dXJuIDEuMDsKLSAgZm9yKGludCBpPTA7aTxJO2krKykKLSAgICB7Ci0gICAgICBhbHBoYVtpXT1uZXQuZ2V0QWxwaGFpbml0KGkpKm5ldC5ub2RlUHJvYihpLDApOwotICAgICAgaWYoIGk+SS8yICkgCi0JYWxwaGFbaV09MDsgLy8gb25seSBmaXJzdCBlbXB0eSB3b3JkIGNhbiBiZSBjaG9zZW4KLSAgICAgIGJwW2ldPTA7Ci0gICAgfQotI2lmZGVmIFdJTjMyCi0gIGRvdWJsZSAqY3VyX2FscGhhPWNvbnN0X2Nhc3Q8ZG91YmxlKj4oJmFscGhhWzBdKStJOwotICBkb3VibGUgKipjdXJfYnA9Y29uc3RfY2FzdDxkb3VibGUqKj4oJmJwWzBdKStJOwotI2Vsc2UKLSAgZG91YmxlICpjdXJfYWxwaGE9Y29udjxkb3VibGU+KGFscGhhLmJlZ2luKCkpK0k7Ci0gIGRvdWJsZSAqKmN1cl9icD1jb252PGRvdWJsZSo+KGJwLmJlZ2luKCkpK0k7Ci0jZW5kaWYKLSAgZm9yKGludCBqPTE7ajxKO2orKykKLSAgICB7Ci0gICAgICBpZiggcGVnaisxPT1qKQotCWZvcihpbnQgdGk9MDt0aTxJO3RpKyspCi0JICBpZiggKHBlZ2khPS0xJiZ0aSE9cGVnaSl8fChwZWdpPT0tMSYmdGk8SS8yKSApCi0JICAgIChjdXJfYWxwaGEtSSlbdGldPTAuMDsKLSAgICAgIGZvcihpbnQgdGk9MDt0aTxJOysrdGksKytjdXJfYWxwaGEsKytjdXJfYnApIHsKLSNpZmRlZiBXSU4zMgotCWRvdWJsZSogcHJldl9hbHBoYT1jb25zdF9jYXN0PGRvdWJsZSo+KCYoYWxwaGFbMF0pKStJKihqLTEpOwotI2Vsc2UKLQlkb3VibGUqIHByZXZfYWxwaGE9Y29udjxkb3VibGU+KGFscGhhLmJlZ2luKCkpK0kqKGotMSk7Ci0jZW5kaWYKLQlkb3VibGUgdGhpc19ub2RlPW5ldC5ub2RlUHJvYih0aSxqKTsKLQljb25zdCBkb3VibGUgKmFscHJvYj0gJm5ldC5vdXRQcm9iKGotMSwwLHRpKTsKLQlmb3IoaW50IHBpPTA7cGk8STsrK3BpLCsrcHJldl9hbHBoYSwoYWxwcm9iKz1JKSl7Ci0JICBtYXNzZXJ0KHByZXZfYWxwaGE8Y3VyX2FscGhhJiYgJm5ldC5vdXRQcm9iKGotMSxwaSx0aSk9PWFscHJvYik7Ci0JICBjb25zdCBkb3VibGUgYWxwaGFfaW5jcmVtZW50PSAqcHJldl9hbHBoYSooKmFscHJvYikqdGhpc19ub2RlOwotCSAgaWYoIGFscGhhX2luY3JlbWVudD4gKmN1cl9hbHBoYSApCi0JICAgIHsKLQkgICAgICAoKmN1cl9hbHBoYSk9YWxwaGFfaW5jcmVtZW50OwotCSAgICAgICgqY3VyX2JwKT1wcmV2X2FscGhhOwotCSAgICB9Ci0JfQotICAgICAgfQotICAgIH0KLSAgZm9yKGludCBpPTA7aTxJO2krKykKLSAgICBhbHBoYVtOLUkraV0qPW5ldC5nZXRCZXRhaW5pdChpKTsKLSAgaWYoIHBlZ2o9PUotMSkKLSAgICBmb3IoaW50IHRpPTA7dGk8STt0aSsrKQotICAgICAgaWYoIChwZWdpIT0tMSYmdGkhPXBlZ2kpfHwocGVnaT09LTEmJnRpPEkvMikgKQotCShhbHBoYSlbTi1JK3RpXT0wLjA7Ci0KLSAgaW50IGo9Si0xOwotI2lmZGVmIFdJTjMyCi0gIGN1cl9hbHBoYT1jb25zdF9jYXN0PGRvdWJsZSo+KCYoYWxwaGFbMF0pKStqKkk7Ci0jZWxzZQotICBjdXJfYWxwaGE9Y29udjxkb3VibGU+KGFscGhhLmJlZ2luKCkpK2oqSTsKLSNlbmRpZgotICB2aXRhcltKLTFdPW1heF9lbGVtZW50KGN1cl9hbHBoYSxjdXJfYWxwaGErSSktY3VyX2FscGhhOwotICBkb3VibGUgcmV0PSAqbWF4X2VsZW1lbnQoY3VyX2FscGhhLGN1cl9hbHBoYStJKTsKLSAgd2hpbGUoYnBbdml0YXJbal0raipJXSkKLSAgICB7Ci0gICAgICBjdXJfYWxwaGEtPUk7Ci0gICAgICB2aXRhcltqLTFdPWJwW3ZpdGFyW2pdK2oqSV0tY3VyX2FscGhhOwotICAgICAgbWFzc2VydCh2aXRhcltqLTFdPEkmJnZpdGFyW2otMV0+PTApOwotICAgICAgai0tOwotICAgIH0KLSAgbWFzc2VydChqPT0wKTsKLSAgaWYoIHZlcmJvc2UgKQotICAgIHsKLSAgICAgIGNvdXQgPDwgIlZFUkI6UEVHOiAiIDw8IHBlZ2kgPDwgJyAnIDw8IHBlZ2ogPDwgZW5kbDsKLSAgICAgIGZvcihpbnQgaj0wO2o8SjtqKyspCi0JY291dCA8PCAiTlAgIiA8PCBuZXQubm9kZVByb2Iodml0YXJbal0saikgPDwgJyAnIDw8ICJBUCAiIDw8ICgoaj09MCk/bmV0LmdldEFscGhhaW5pdCh2aXRhcltqXSk6bmV0Lm91dFByb2Ioai0xLHZpdGFyW2otMV0sdml0YXJbal0pKSA8PCAiIGo6IiA8PCBqIDw8ICIgaToiIDw8IHZpdGFyW2pdIDw8ICI7ICAiOwotICAgICAgY291dCA8PCBlbmRsOwotICAgIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotZG91YmxlIE1heGltdW1UcmFpbmluZyhjb25zdCBITU1OZXR3b3JrJm5ldCxBcnJheTxkb3VibGU+JmcsQXJyYXk8QXJyYXkyPGRvdWJsZT4gPiZFKXsKLSAgQXJyYXk8aW50PiB2aXRhcjsKLSAgZG91YmxlIHJldD1ITU1SZWFsVml0ZXJiaShuZXQsdml0YXIpOwotICBjb25zdCBpbnQgST1uZXQuc2l6ZTEoKSxKPW5ldC5zaXplMigpOwotICBpZiggRS5zaXplKCk9PTEgKQotICAgIHsKLSAgICAgIEFycmF5Mjxkb3VibGU+JmU9RVswXTsKLSAgICAgIGUucmVzaXplKEksSSk7Ci0gICAgICBnLnJlc2l6ZShJKkopOwotICAgICAgZmlsbChnLmJlZ2luKCksZy5lbmQoKSwwLjApOwotICAgICAgZmlsbChlLmJlZ2luKCksZS5lbmQoKSwwLjApOwotICAgICAgZm9yKGludCBpPTA7aTxKOysraSkKLQl7Ci0JICBnW2kqSSt2aXRhcltpXV09MS4wOwotCSAgaWYoIGk+MCApCi0JICAgIGUodml0YXJbaV0sdml0YXJbaS0xXSkrKzsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZy5yZXNpemUoSSpKKTsKLSAgICAgIGZpbGwoZy5iZWdpbigpLGcuZW5kKCksMC4wKTsKLSAgICAgIGZvcihpbnQgaT0wO2k8SjsrK2kpCi0JewotCSAgZ1tpKkkrdml0YXJbaV1dPTEuMDsKLQkgIGlmKCBpPjAgKQotCSAgICB7Ci0JICAgICAgQXJyYXkyPGRvdWJsZT4mZT1FW2ktMV07Ci0JICAgICAgZS5yZXNpemUoSSxJKTsKLQkgICAgICBmaWxsKGUuYmVnaW4oKSxlLmVuZCgpLDAuMCk7Ci0JICAgICAgZSh2aXRhcltpXSx2aXRhcltpLTFdKSsrOwotCSAgICB9Ci0JfQotICAgIH0gICAgCi0gIHJldHVybiByZXQ7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9Gb3J3YXJkQmFja3dhcmQuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0ZvcndhcmRCYWNrd2FyZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQ0OWQzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0ZvcndhcmRCYWNrd2FyZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdJWkErKyAoIGV4dGVuc2lvbiBvZiBHSVpBICkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpZm5kZWYgTk9fRU1fTUFSS09GX1pFVUdTX0RFRklORUQKLSNkZWZpbmUgTk9fRU1fTUFSS09GX1pFVUdTX0RFRklORUQKLSNpZm5kZWYgTk9fVFJBSU5JTkcKLSNpbmNsdWRlICJteWFzc2VydC5oIgotI2luY2x1ZGUgIkFycmF5LmgiCi0jaW5jbHVkZSAiQXJyYXkyLmgiCi0KLWNsYXNzIEhNTU5ldHdvcmsKLXsKLSBwdWJsaWM6Ci0gIGludCBhcyxiczsKLSAgQXJyYXkyPGRvdWJsZT4gbjsKLSAgQXJyYXk8QXJyYXkyPGRvdWJsZT4gPiBlOwotICBBcnJheTxkb3VibGU+IGFscGhhaW5pdDsKLSAgQXJyYXk8ZG91YmxlPiBiZXRhaW5pdDsKLSAgaW50IGFiOwotICBkb3VibGUgZmluYWxNdWx0aXBseTsKLSAgSE1NTmV0d29yayhpbnQgSSxpbnQgSikKLSAgICA6IGFzKEkpLGJzKEopLG4oYXMsYnMpLC8qZShhcyxhcywwLjApLCovZSgwKSxhbHBoYWluaXQoYXMsMS4wL2FzKSxiZXRhaW5pdChhcywxLjApLGFiKGFzKmJzKSxmaW5hbE11bHRpcGx5KDEuMCkKLSAgICB7fQotICBkb3VibGUgZ2V0QWxwaGFpbml0KGludCBpKWNvbnN0e3JldHVybiBhbHBoYWluaXRbaV07fQotICBkb3VibGUgZ2V0QmV0YWluaXQoaW50IGkpY29uc3R7cmV0dXJuIGJldGFpbml0W2ldO30KLSAgaW5saW5lIGludCBzaXplMSgpY29uc3R7cmV0dXJuIGFzO30KLSAgaW5saW5lIGludCBzaXplMigpY29uc3R7cmV0dXJuIGJzO30KLSAgaW5saW5lIGNvbnN0IGRvdWJsZSZub2RlUHJvYihpbnQgaSxpbnQgailjb25zdAotICAgIHtyZXR1cm4gbihpLGopO30KLSAgaW5saW5lIGNvbnN0IGRvdWJsZSZvdXRQcm9iKGludCBqLGludCBpMSxpbnQgaTIpY29uc3QKLSAgICB7LyptYXNzZXJ0KGVbbWluKGludChlLnNpemUoKSktMSxqKV0oaTEsaTIpICk7Ki8gcmV0dXJuIGVbbWluKGludChlLnNpemUoKSktMSxqKV0oaTEsaTIpO30KLSAgZnJpZW5kIG9zdHJlYW0mb3BlcmF0b3I8PChvc3RyZWFtJm91dCxjb25zdCBITU1OZXR3b3JrJngpCi0gICAgewotICAgICAgcmV0dXJuIG91dCA8PCJOOiBcbiI8PCB4Lm4gPDwgZW5kbCA8PCAiRTogXG4iIDw8IHguZSA8PCAiQTpcbiIgPDwgeC5hbHBoYWluaXQgPDwgIkI6XG4iIDw8IHguYmV0YWluaXQgPDwgZW5kbDsKLSAgICB9Ci19OwotZG91YmxlIEZvcndhcmRCYWNrd2FyZFRyYWluaW5nKGNvbnN0IEhNTU5ldHdvcmsmbWMsQXJyYXk8ZG91YmxlPiZnYW1tYSxBcnJheTxBcnJheTI8ZG91YmxlPiA+JmVwc2lsb24pOwotdm9pZCBITU1WaXRlcmJpKGNvbnN0IEhNTU5ldHdvcmsmbWMsQXJyYXk8aW50PiZ2aXQpOwotZG91YmxlIEhNTVJlYWxWaXRlcmJpKGNvbnN0IEhNTU5ldHdvcmsmbmV0LEFycmF5PGludD4mdml0LGludCBwZWdpPS0xLGludCBwZWdqPS0xLGJvb2wgdmVyYm9zZT0wKTsKLWRvdWJsZSBNYXhpbXVtVHJhaW5pbmcoY29uc3QgSE1NTmV0d29yayZuZXQsQXJyYXk8ZG91YmxlPiZnLEFycmF5PEFycmF5Mjxkb3VibGU+ID4mZSk7Ci12b2lkIEhNTVZpdGVyYmkoY29uc3QgSE1NTmV0d29yayZuZXQsQXJyYXk8ZG91YmxlPiZnLEFycmF5PGludD4mdml0KTsKLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9HbG9iYWxzLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9HbG9iYWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5M2ExMTcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvR2xvYmFscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0jaWZuZGVmIEdsb2JhbHNfYXNkZl9kZWZpbmVkCi0jZGVmaW5lIEdsb2JhbHNfYXNkZl9kZWZpbmVkCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN5bmNPYmouaD4KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAiVmVjdG9yLmgiCi0KLWV4dGVybiBmbG9hdCBQUk9CX1NNT09USCxNSU5DT1VOVElOQ1JFQVNFOwotZXh0ZXJuIGJvb2wgVmVyYm9zZSwgTG9nLCBQZWcsIFRyYW5zZmVyLCBUcmFuc2ZlcjJ0bzMsIHVzZURpY3QgOwotZXh0ZXJuIHN0cmluZyBQcmVmaXgsIExvZ0ZpbGVuYW1lLCBPUGF0aCwgCi0gIFNvdXJjZVZvY2FiRmlsZW5hbWUsIFRhcmdldFZvY2FiRmlsZW5hbWUsIENvcnB1c0ZpbGVuYW1lLCBUZXN0Q29ycHVzRmlsZW5hbWUsIAotICBTb3VyY2VWb2NhYkNsYXNzZXNGaWxlbmFtZSwgVGFyZ2V0Vm9jYWJDbGFzc2VzRmlsZW5hbWUsCi0gIHRfRmlsZW5hbWUsIGFfRmlsZW5hbWUsIHAwX0ZpbGVuYW1lLCBkX0ZpbGVuYW1lLCBuX0ZpbGVuYW1lLCBkaWN0aW9uYXJ5X0ZpbGVuYW1lOwotZXh0ZXJuIG9mc3RyZWFtIGxvZ21zZyA7Ci1leHRlcm4gTXV0ZXggbG9nbXNnX2xvY2s7Ci1leHRlcm4gZG91YmxlIE01UDAsUDAgOwotZXh0ZXJuIGJvb2wgTk9EVU1QUywgRkVXRFVNUFMgIDsKLWV4dGVybiBzdHJpbmcgVXNhZ2UgOwotZXh0ZXJuIHVuc2lnbmVkIGludCBNQVhfU0VOVEVOQ0VfTEVOR1RIIDsKLWV4dGVybiBpbnQgUGVnVW50aWw7Ci0KLWV4dGVybiBzaG9ydCBEZWZpY2llbnREaXN0b3J0aW9uRm9yRW1wdHlXb3JkOwotCi1leHRlcm4gaW50IE00X0RlcGVuZGVuY2llczsKLWV4dGVybiBpbnQgTTVfRGVwZW5kZW5jaWVzOwotCi1leHRlcm4gc2hvcnQgT3V0cHV0SW5BYWNoZW5Gb3JtYXQ7Ci0KLSNkZWZpbmUgREVQX01PREVMX2wgMQotI2RlZmluZSBERVBfTU9ERUxfbSAyCi0jZGVmaW5lIERFUF9NT0RFTF9GIDQKLSNkZWZpbmUgREVQX01PREVMX0UgOAotCi0jZGVmaW5lIERFUF9NT0RFTGJfbCAxNgotI2RlZmluZSBERVBfTU9ERUxiX20gMzIKLSNkZWZpbmUgREVQX01PREVMYl9GIDY0Ci0jZGVmaW5lIERFUF9NT0RFTGJfRSAxMjgKLQotI2RlZmluZSBERVBfU1VNIDI1NgotCi1jbGFzcyB2Y2JMaXN0OwotCi1leHRlcm4gdmNiTGlzdCAqZ2xvYmVUcmFpblZjYkxpc3QsICpnbG9iZlRyYWluVmNiTGlzdDsKLQotZXh0ZXJuIHNob3J0IFByZWRpY3Rpb25JbkFsaWdubWVudHM7Ci1leHRlcm4gc2hvcnQgU21vb3RoSE1NOwotI2RlZmluZSBWRVJCIFZlcmJvc2UKLQotZG91YmxlIEVycm9yc0luQWxpZ25tZW50KGNvbnN0IG1hcDwgcGFpcjxpbnQsaW50PixjaGFyID4mcmVmZXJlbmNlLGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JnRlc3QsaW50IGwsaW50Jm1pc3NpbmcsaW50JnRvb211Y2gsaW50JmV2ZW50c01pc3NpbmcsaW50JmV2ZW50c1Rvb211Y2gsaW50KTsKLWV4dGVybiBWZWN0b3I8bWFwPCBwYWlyPGludCxpbnQ+LGNoYXIgPiA+IFJlZmVyZW5jZUFsaWdubWVudDsKLXZvaWQgcHJpbnRHSVpBUGFycyhvc3RyZWFtJm91dCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvSE1NVGFibGVzLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0hNTVRhYmxlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZWM3NDEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvSE1NVGFibGVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU5OCArMCwwIEBACi0vKgotCi0gQ29weXJpZ2h0IChDKSAxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2ggKFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSkKLQotIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdJWkErKyAoIGV4dGVuc2lvbiBvZiBHSVpBICkuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotIFVTQS4KLQotICovCi0jaW5jbHVkZSAiSE1NVGFibGVzLmgiCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgIkdsb2JhbHMuaCIKLSNpbmNsdWRlICJQYXJhbWV0ZXIuaCIKLQotdGVtcGxhdGU8Y2xhc3MgQ0xTLCBjbGFzcyBNQVBQRVJDTEFTU1RPU1RSSU5HPiB2b2lkIEhNTVRhYmxlczxDTFMsCi0JCU1BUFBFUkNMQVNTVE9TVFJJTkc+Ojp3cml0ZUp1bXBzKG9zdHJlYW0mb3V0KSBjb25zdCB7Ci0JZG91YmxlIHNzdW09MC4wOwotCWZvciAodHlwZW5hbWUgbWFwPEFsRGVwczxDTFM+LEZsZXhBcnJheTxkb3VibGU+ID46OmNvbnN0X2l0ZXJhdG9yIGk9Ci0JCQlhbFByb2IuYmVnaW4oKTsgaSE9YWxQcm9iLmVuZCgpOyArK2kpIHsKLQkJZG91YmxlIHN1bT0wLjA7Ci0JCW91dCA8PCAiXG5cbkRpc3RyaWJ1dGlvbiBmb3I6ICI7Ci0JCXByaW50QWxEZXBzKG91dCwgaS0+Zmlyc3QsICptYXBwZXIxLCAqbWFwcGVyMik7Ci0JCW91dCA8PCAnICc7Ci0JCWZvciAoaW50IGE9aS0+c2Vjb25kLmxvdygpOyBhPD1pLT5zZWNvbmQuaGlnaCgpOyArK2EpCi0JCQlpZiAoaS0+c2Vjb25kW2FdKSB7Ci0JCQkJb3V0IDw8IGEgPDwgJzonIDw8IGktPnNlY29uZFthXSA8PCAnOycgPDwgJyAnOwotCQkJCXN1bSs9aS0+c2Vjb25kW2FdOwotCQkJfQotCQlvdXQgPDwgJ1xuJyA8PCAnXG4nOwotCQlvdXQgPDwgIlNVTTogIiA8PCBzdW0gPDwgJ1xuJzsKLQkJc3N1bSs9c3VtOwotCX0KLQlvdXQgPDwgIkZVTEwtU1VNOiAiIDw8IHNzdW0gPDwgJ1xuJzsKLX0KLXRlbXBsYXRlPGNsYXNzIENMUywgY2xhc3MgTUFQUEVSQ0xBU1NUT1NUUklORz4gdm9pZCBITU1UYWJsZXM8Q0xTLAotCQlNQVBQRVJDTEFTU1RPU1RSSU5HPjo6cmVhZEp1bXBzKGlzdHJlYW0mKSB7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBDTFMsIGNsYXNzIE1BUFBFUkNMQVNTVE9TVFJJTkc+IGRvdWJsZSBITU1UYWJsZXM8Q0xTLAotCQlNQVBQRVJDTEFTU1RPU1RSSU5HPjo6Z2V0QWxQcm9iKGludCBpc3RyaWNoLCBpbnQgaywgaW50IHNlbnRMZW5ndGgsCi0JCWludCBKLCBDTFMgdzEsIENMUyB3MiwgaW50IGosIGludCBpdGVyKSBjb25zdCB7Ci0JbWFzc2VydChrPHNlbnRMZW5ndGgmJms+PTApOwotCW1hc3NlcnQoaXN0cmljaDxzZW50TGVuZ3RoJiZpc3RyaWNoPj0tMSk7Ci0JaW50IHBvcz1pc3RyaWNoLWs7Ci0Jc3dpdGNoIChQcmVkaWN0aW9uSW5BbGlnbm1lbnRzKSB7Ci0JY2FzZSAwOgotCQlwb3M9aXN0cmljaC1rOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXBvcz1rOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXBvcz0oaypKLWoqc2VudExlbmd0aCk7Ci0JCWlmIChwb3M+MCkKLQkJCXBvcys9Si8yOwotCQllbHNlCi0JCQlwb3MtPUovMjsKLQkJcG9zLz1KOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlhYm9ydCgpOwotCX0KLQlsb2NrLT5sb2NrKCk7Ci0JdHlwZW5hbWUgbWFwPEFsRGVwczxDTFM+LEZsZXhBcnJheTxkb3VibGU+ID46OmNvbnN0X2l0ZXJhdG9yIHA9Ci0JCQlhbFByb2IuZmluZChBbERlcHM8Q0xTPihzZW50TGVuZ3RoLCBpc3RyaWNoLCBqLCB3MSwgdzIpKTsKLQlpZiAocCE9YWxQcm9iLmVuZCgpICkgewotCQlsb2NrLT51bmxvY2soKTsKLQkJcmV0dXJuIChwLT5zZWNvbmQpW3Bvc107Ci0JfSBlbHNlIHsKLQkJaWYgKGl0ZXI+MCYmaXRlcjw1MDAwKQotCQkJY291dCA8PCAiV0FSTklORzogTm90IGZvdW5kOiAiIDw8ICcgJyA8PCBKIDw8ICcgJyA8PCBzZW50TGVuZ3RoCi0JCQkJCTw8ICdcbic7OwotCQlsb2NrLT51bmxvY2soKTsKLQkJcmV0dXJuIDEuMC8oMipzZW50TGVuZ3RoLTEpOwotCX0KLQlsb2NrLT51bmxvY2soKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgQ0xTLCBjbGFzcyBNQVBQRVJDTEFTU1RPU1RSSU5HPiB2b2lkIEhNTVRhYmxlczxDTFMsCi0JCU1BUFBFUkNMQVNTVE9TVFJJTkc+OjphZGRBbENvdW50KGludCBpc3RyaWNoLCBpbnQgaywgaW50IHNlbnRMZW5ndGgsCi0JCWludCBKLCBDTFMgdzEsIENMUyB3MiwgaW50IGosIGRvdWJsZSB2YWx1ZSwgZG91YmxlIHZhbHVlUHJlZGljdGVkKSB7Ci0KLQotCWludCBwb3M9aXN0cmljaC1rOwotCXN3aXRjaCAoUHJlZGljdGlvbkluQWxpZ25tZW50cykgewotCWNhc2UgMDoKLQkJcG9zPWlzdHJpY2gtazsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlwb3M9azsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlwb3M9KGsqSi1qKnNlbnRMZW5ndGgpOwotCQlpZiAocG9zPjApCi0JCQlwb3MrPUovMjsKLQkJZWxzZQotCQkJcG9zLT1KLzI7Ci0JCXBvcy89SjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYWJvcnQoKTsKLQl9Ci0KLQotCUFsRGVwczxDTFM+IGRlcHMoQWxEZXBzPENMUz4oc2VudExlbmd0aCwgaXN0cmljaCwgaiwgdzEsIHcyKSk7Ci0KLQl7Ci0JCWxvY2stPmxvY2soKTsKLQkJdHlwZW5hbWUgbWFwPEFsRGVwczxDTFM+LEZsZXhBcnJheTxkb3VibGU+ID46Oml0ZXJhdG9yIHA9Ci0JCQkJYWxQcm9iLmZpbmQoZGVwcyk7Ci0JCWlmIChwPT1hbFByb2IuZW5kKCkgKSB7Ci0JCQlpZiAoIChDb21wYXJlQWxEZXBzJjEpPT0wKQotCQkJCXA9YWxQcm9iLmluc2VydChtYWtlX3BhaXIoZGVwcyxGbGV4QXJyYXk8ZG91YmxlPiAoLU1BWF9TRU5URU5DRV9MRU5HVEgsTUFYX1NFTlRFTkNFX0xFTkdUSCwwLjApKSkuZmlyc3Q7Ci0JCQllbHNlCi0JCQkJcD1hbFByb2IuaW5zZXJ0KG1ha2VfcGFpcihkZXBzLEZsZXhBcnJheTxkb3VibGU+ICgtc2VudExlbmd0aCxzZW50TGVuZ3RoLDAuMCkpKS5maXJzdDsKLQkJfQotCQlwLT5zZWNvbmRbcG9zXSs9dmFsdWU7Ci0JCWxvY2stPnVubG9jaygpOwotCX0KLQotCWlmICh2YWx1ZVByZWRpY3RlZCkgewotCQlsb2NrLT5sb2NrKCk7Ci0JCXR5cGVuYW1lIG1hcDxBbERlcHM8Q0xTPixGbGV4QXJyYXk8ZG91YmxlPiA+OjppdGVyYXRvciBwPQotCQkJCWFsUHJvYlByZWRpY3RlZC5maW5kKGRlcHMpOwotCQlpZiAocD09YWxQcm9iUHJlZGljdGVkLmVuZCgpICkgewotCQkJaWYgKCAoQ29tcGFyZUFsRGVwcyYxKT09MCkKLQkJCQlwCi0JCQkJCQk9YWxQcm9iUHJlZGljdGVkLmluc2VydChtYWtlX3BhaXIoZGVwcyxGbGV4QXJyYXk8ZG91YmxlPiAoLU1BWF9TRU5URU5DRV9MRU5HVEgsTUFYX1NFTlRFTkNFX0xFTkdUSCwwLjApKSkuZmlyc3Q7Ci0JCQllbHNlCi0JCQkJcD1hbFByb2JQcmVkaWN0ZWQuaW5zZXJ0KG1ha2VfcGFpcihkZXBzLEZsZXhBcnJheTxkb3VibGU+ICgtc2VudExlbmd0aCxzZW50TGVuZ3RoLDAuMCkpKS5maXJzdDsKLQkJfQotCQlwLT5zZWNvbmRbcG9zXSs9dmFsdWVQcmVkaWN0ZWQ7Ci0JCWxvY2stPnVubG9jaygpOwotCX0KLQkKLX0KLQotdGVtcGxhdGU8Y2xhc3MgQ0xTLCBjbGFzcyBNQVBQRVJDTEFTU1RPU1RSSU5HPiAKLWhtbWVudHJ5X3R5cGUmIEhNTVRhYmxlczxDTFMsTUFQUEVSQ0xBU1NUT1NUUklORz46OmRvR2V0QWxwaGFJbml0KGludCBJKQotewotCWFscGhhbG9jay0+bG9jaygpOwotCWlmKCAhaW5pdF9hbHBoYS5jb3VudChJKSApewotI2lmZGVmIFdJTjMyCi0JCWluaXRfYWxwaGFbSV09aG1tZW50cnlfdHlwZShBcnJheTxkb3VibGU+KEksMCksbmV3IE11dGV4KCkpOwotI2Vsc2UKLQkJaW5pdF9hbHBoYVtJXT1obW1lbnRyeV90eXBlKEFycmF5PGRvdWJsZT4oSSwwKSxNdXRleCgpKTsKLSNlbmRpZgotCX0KLQlobW1lbnRyeV90eXBlJiByZXQgID0gaW5pdF9hbHBoYVtJXTsKLQlhbHBoYWxvY2stPnVubG9jaygpOwotCXJldHVybiByZXQ7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBDTFMsIGNsYXNzIE1BUFBFUkNMQVNTVE9TVFJJTkc+IAotaG1tZW50cnlfdHlwZSYgSE1NVGFibGVzPENMUyxNQVBQRVJDTEFTU1RPU1RSSU5HPjo6ZG9HZXRCZXRhSW5pdChpbnQgSSkKLXsKLQliZXRhbG9jay0+bG9jaygpOwotCWlmKCAhaW5pdF9iZXRhLmNvdW50KEkpICl7Ci0jaWZkZWYgV0lOMzIKLQkJaW5pdF9iZXRhW0ldPWhtbWVudHJ5X3R5cGUoQXJyYXk8ZG91YmxlPihJLDApLG5ldyBNdXRleCgpKTsKLSNlbHNlCi0JCWluaXRfYmV0YVtJXT1wYWlyPEFycmF5PGRvdWJsZT4sTXV0ZXg+KEFycmF5PGRvdWJsZT4oSSwwKSxNdXRleCgpKTsKLSNlbmRpZgotCX0KLQlobW1lbnRyeV90eXBlJiByZXQgPSBpbml0X2JldGFbSV07Ci0JYmV0YWxvY2stPnVubG9jaygpOwotCXJldHVybiByZXQ7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIENMUywgY2xhc3MgTUFQUEVSQ0xBU1NUT1NUUklORz4gYm9vbCBITU1UYWJsZXM8Q0xTLAotCQlNQVBQRVJDTEFTU1RPU1RSSU5HPjo6Z2V0QWxwaGFJbml0KGludCBJLCBBcnJheTxkb3VibGU+JngpIGNvbnN0IHsKLQlhbHBoYWxvY2stPmxvY2soKTsKLQloYXNoX21hcDxpbnQsaG1tZW50cnlfdHlwZSA+Ojpjb25zdF9pdGVyYXRvciBpPWluaXRfYWxwaGEuZmluZChJKTsKLQlpZiAoaT09aW5pdF9hbHBoYS5lbmQoKSApewotCQlhbHBoYWxvY2stPnVubG9jaygpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCXg9aS0+c2Vjb25kLmZpcnN0OwotCQlhbHBoYWxvY2stPnVubG9jaygpOwotCQlmb3IgKHVuc2lnbmVkIGludCBqPXguc2l6ZSgpLzIrMTsgajx4LnNpemUoKTsgKytqKQotCQkJLy8gb25seSBmaXJzdCBlbXB0eSB3b3JkIGNhbiBiZSBjaG9zZW4KLQkJCXhbal09MDsKLQkJcmV0dXJuIDE7Ci0JfQotCWFscGhhbG9jay0+dW5sb2NrKCk7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBDTFMsIGNsYXNzIE1BUFBFUkNMQVNTVE9TVFJJTkc+IGJvb2wgSE1NVGFibGVzPENMUywKLQkJTUFQUEVSQ0xBU1NUT1NUUklORz46OmdldEJldGFJbml0KGludCBJLCBBcnJheTxkb3VibGU+JngpIGNvbnN0IHsKLQliZXRhbG9jay0+bG9jaygpOwotCWhhc2hfbWFwPGludCxobW1lbnRyeV90eXBlID46OmNvbnN0X2l0ZXJhdG9yIGk9aW5pdF9iZXRhLmZpbmQoSSk7Ci0JaWYgKGk9PWluaXRfYmV0YS5lbmQoKSApewotCQliZXRhbG9jay0+dW5sb2NrKCk7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJeD1pLT5zZWNvbmQuZmlyc3Q7Ci0JCWJldGFsb2NrLT51bmxvY2soKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWJldGFsb2NrLT51bmxvY2soKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQnkgRWR3YXJkIEdhbwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdGVtcGxhdGU8Y2xhc3MgQ0xTLCBjbGFzcyBNQVBQRVJDTEFTU1RPU1RSSU5HPiBib29sIEhNTVRhYmxlczxDTFMsCi0JCU1BUFBFUkNMQVNTVE9TVFJJTkc+Ojp3cml0ZUp1bXBzKGNvbnN0IGNoYXIqIGFscHJvYiwKLQkJY29uc3QgY2hhciogYWxwcmVkaWN0LCBjb25zdCBjaGFyKiBhbHBoYSwgY29uc3QgY2hhciogYmV0YSkgY29uc3QgewotCWlmIChhbHByb2IpIHsKLQkJb2ZzdHJlYW0gb2ZzKGFscHJvYik7Ci0JCWlmICghb2ZzLmlzX29wZW4oKSkgewotCQkJY2VyciA8PCAiQ2Fubm90IG9wZW4gZmlsZSBmb3IgSE1NIG91dHB1dCAiIDw8IGFscHJvYiA8PCBlbmRsOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNlcnIgPDwgIkR1bXBpbmcgSE1NIHRhYmxlIHRvICIgPDwgYWxwcm9iIDw8IGVuZGw7Ci0KLQkJZm9yICh0eXBlbmFtZSBtYXA8QWxEZXBzPENMUz4sRmxleEFycmF5PGRvdWJsZT4gPjo6Y29uc3RfaXRlcmF0b3IgaT0KLQkJCQlhbFByb2IuYmVnaW4oKTsgaSE9YWxQcm9iLmVuZCgpOyArK2kpIHsKLQkJCWRvdWJsZSBzdW09MC4wOwotCQkJb2ZzIDw8aS0+Zmlyc3QuZW5nbGlzaFNlbnRlbmNlTGVuZ3RoIDw8ICIgIgotCQkJCQk8PCBpLT5maXJzdC5jbGFzc1ByZXZpb3VzIDw8ICIgIiA8PCBpLT5maXJzdC5wcmV2aW91cwotCQkJCQk8PCAiICIgPDwgaS0+Zmlyc3QuaiA8PCAiICIgPDwgaS0+Zmlyc3QuQ2ogPDwiICIKLQkJCQkJPDwgaS0+c2Vjb25kLmxvdygpIDw8IiAiIDw8IGktPnNlY29uZC5oaWdoKCk8PCAiICI7Ci0JCQlmb3IgKGludCBhPWktPnNlY29uZC5sb3coKTsgYTw9aS0+c2Vjb25kLmhpZ2goKTsgKythKQotCQkJCWlmIChpLT5zZWNvbmRbYV0pIHsKLQkJCQkJb2ZzIDw8IGEgPDwgJyAnIDw8IGktPnNlY29uZFthXSA8PCAnICc7Ci0JCQkJCXN1bSs9aS0+c2Vjb25kW2FdOwotCQkJCX0KLQkJCW9mcyA8PCBlbmRsOwotCQl9Ci0JCW9mcy5jbG9zZSgpOwotCX0KLQlpZiAoYWxwcmVkaWN0KSB7Ci0JCW9mc3RyZWFtIG9mcyhhbHByZWRpY3QpOwotCQlpZiAoIW9mcy5pc19vcGVuKCkpIHsKLQkJCWNlcnIgPDwgIkNhbm5vdCBvcGVuIGZpbGUgZm9yIEhNTSBvdXRwdXQgIiA8PCBhbHByZWRpY3QgPDwgZW5kbDsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljZXJyIDw8ICJEdW1waW5nIEhNTSB0YWJsZSB0byAiIDw8IGFscHJlZGljdCA8PCBlbmRsOwotCQlmb3IgKHR5cGVuYW1lIG1hcDxBbERlcHM8Q0xTPixGbGV4QXJyYXk8ZG91YmxlPiA+Ojpjb25zdF9pdGVyYXRvciBpPQotCQkJCWFsUHJvYlByZWRpY3RlZC5iZWdpbigpOyBpIT1hbFByb2JQcmVkaWN0ZWQuZW5kKCk7ICsraSkgewotCQkJZG91YmxlIHN1bT0wLjA7Ci0JCQlvZnMgPDwgaS0+Zmlyc3QuZW5nbGlzaFNlbnRlbmNlTGVuZ3RoIDw8ICIgIgotCQkJCQk8PCBpLT5maXJzdC5jbGFzc1ByZXZpb3VzIDw8ICIgIiA8PCBpLT5maXJzdC5wcmV2aW91cwotCQkJCQk8PCAiICIgPDwgaS0+Zmlyc3QuaiA8PCAiICIgPDwgaS0+Zmlyc3QuQ2ogPDwiICIKLQkJCQkJPDwgaS0+c2Vjb25kLmxvdygpIDw8IiAiIDw8IGktPnNlY29uZC5oaWdoKCk8PCAiICI7Ci0JCQlmb3IgKGludCBhPWktPnNlY29uZC5sb3coKTsgYTw9aS0+c2Vjb25kLmhpZ2goKTsgKythKQotCQkJCWlmIChpLT5zZWNvbmRbYV0pIHsKLQkJCQkJb2ZzIDw8IGEgPDwgJyAnIDw8IGktPnNlY29uZFthXSA8PCAnICc7Ci0JCQkJCXN1bSs9aS0+c2Vjb25kW2FdOwotCQkJCX0KLQkJCW9mcyA8PCBlbmRsOwotCQl9Ci0JCW9mcy5jbG9zZSgpOwotCX0KLQlpZiAoYWxwaGEpIHsKLQkJb2ZzdHJlYW0gb2ZzKGFscGhhKTsKLQotCQlpZiAoIW9mcy5pc19vcGVuKCkpIHsKLQkJCWNlcnIgPDwgIkNhbm5vdCBvcGVuIGZpbGUgZm9yIEhNTSBvdXRwdXQgIiA8PCBhbHBoYSA8PCBlbmRsOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNlcnIgPDwgIkR1bXBpbmcgSE1NIHRhYmxlIHRvICIgPDwgYWxwaGEgPDwgZW5kbDsKLQkJZm9yICh0eXBlbmFtZSBoYXNoX21hcDxpbnQsaG1tZW50cnlfdHlwZT46OmNvbnN0X2l0ZXJhdG9yIGk9Ci0JCQkJaW5pdF9hbHBoYS5iZWdpbigpOyBpIT1pbml0X2FscGhhLmVuZCgpOyBpKyspIHsKLQkJCW9mcyA8PCBpLT5maXJzdCA8PCAiICIgPDwgaS0+c2Vjb25kLmZpcnN0LnNpemUoKSA8PCIgIjsKLQkJCWludCBqOwotCQkJZm9yIChqPTA7IGo8aS0+c2Vjb25kLmZpcnN0LnNpemUoKTsgaisrKSB7Ci0JCQkJb2ZzIDw8IGktPnNlY29uZC5maXJzdFtqXSA8PCAiICI7Ci0JCQl9Ci0JCQlvZnM8PGVuZGw7Ci0JCX0KLQkJb2ZzLmNsb3NlKCk7Ci0JfQotCWlmIChiZXRhKSB7Ci0JCW9mc3RyZWFtIG9mcyhiZXRhKTsKLQkJaWYgKCFvZnMuaXNfb3BlbigpKSB7Ci0JCQljZXJyIDw8ICJDYW5ub3Qgb3BlbiBmaWxlIGZvciBITU0gb3V0cHV0ICIgPDwgYmV0YSA8PCBlbmRsOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNlcnIgPDwgIkR1bXBpbmcgSE1NIHRhYmxlIHRvICIgPDwgYmV0YSA8PCBlbmRsOwotCQlmb3IgKHR5cGVuYW1lIGhhc2hfbWFwPGludCxobW1lbnRyeV90eXBlPjo6Y29uc3RfaXRlcmF0b3IgaT0KLQkJCQlpbml0X2JldGEuYmVnaW4oKTsgaSE9aW5pdF9iZXRhLmVuZCgpOyBpKyspIHsKLQkJCW9mcyA8PCBpLT5maXJzdCA8PCAiICIgPDwgaS0+c2Vjb25kLmZpcnN0LnNpemUoKSA8PCAiICI7Ci0JCQlpbnQgajsKLQkJCWZvciAoaj0wOyBqPGktPnNlY29uZC5maXJzdC5zaXplKCk7IGorKykgewotCQkJCW9mcyA8PCBpLT5zZWNvbmQuZmlyc3Rbal0gPDwgIiAiOwotCQkJfQotCQkJb2ZzIDw8IGVuZGw7Ci0JCX0KLQkJb2ZzLmNsb3NlKCk7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBDTFMsIGNsYXNzIE1BUFBFUkNMQVNTVE9TVFJJTkc+IGJvb2wgSE1NVGFibGVzPENMUywKLQkJTUFQUEVSQ0xBU1NUT1NUUklORz46OnJlYWRKdW1wcyhjb25zdCBjaGFyKiBhbHByb2IsCi0JCWNvbnN0IGNoYXIqIGFscHJlZGljdCwgY29uc3QgY2hhciogYWxwaGEsIGNvbnN0IGNoYXIqIGJldGEpIHsKLQlpZiAoYWxwcm9iKSB7Ci0JCWlmc3RyZWFtIGlmcyhhbHByb2IpOwotCQlpZiAoIWlmcy5pc19vcGVuKCkpIHsKLQkJCWNlcnIgPDwgIkNhbm5vdCBvcGVuIGZpbGUgZm9yIEhNTSBpbnB1dCAiIDw8IGFscHJvYiA8PCBlbmRsOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNlcnIgPDwgIlJlYWRpbmcgSE1NIHRhYmxlIGZyb20gIiA8PCBhbHByb2IgPDwgZW5kbDsKLQkJc3RyaW5nIHN0ckxpbmU9IiI7Ci0JCWJvb2wgZXhwZWN0X2RhdGEgPSBmYWxzZTsKLQkJd2hpbGUgKCFpZnMuZW9mKCkpIHsKLQkJCXN0ckxpbmUgPSAiIjsKLQkJCWdldGxpbmUoaWZzLCBzdHJMaW5lKTsKLQkJCWlmIChzdHJMaW5lLmxlbmd0aCgpKSB7Ci0JCQkJc3RyaW5nc3RyZWFtIHNzKHN0ckxpbmUuY19zdHIoKSk7Ci0JCQkJQWxEZXBzPENMUz4gZGVwOwotCQkJCWludCBsb3csIGhpZ2g7Ci0JCQkJc3MgPj4gZGVwLmVuZ2xpc2hTZW50ZW5jZUxlbmd0aCA+PiBkZXAuY2xhc3NQcmV2aW91cwotCQkJCQkJPj4gZGVwLnByZXZpb3VzID4+IGRlcC5qID4+IGRlcC5DaiA+PiBsb3cgPj4gaGlnaDsKLQkJCQl0eXBlbmFtZSBtYXA8QWxEZXBzPENMUz4sRmxleEFycmF5PGRvdWJsZT4gPjo6aXRlcmF0b3IgcD0KLQkJCQkJCWFsUHJvYi5maW5kKGRlcCk7Ci0JCQkJaWYgKHA9PWFsUHJvYi5lbmQoKSApIHsKLQkJCQkJcD1hbFByb2IuaW5zZXJ0KG1ha2VfcGFpcihkZXAsRmxleEFycmF5PGRvdWJsZT4gKGxvdyxoaWdoLDAuMCkpKS5maXJzdDsKLQkJCQl9Ci0JCQkJaW50IHBvczsKLQkJCQlkb3VibGUgdmFsOwotCQkJCXdoaWxlICghc3MuZW9mKCkpIHsKLQkJCQkJcG9zID0gbG93LTE7Ci0JCQkJCXZhbCA9IDA7Ci0JCQkJCXNzID4+IHBvcyA+PiB2YWw7Ci0JCQkJCWlmIChwb3M+bG93LTEpIHsKLQkJCQkJCXAtPnNlY29uZFtwb3NdKz12YWw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGFscHJlZGljdCkgewotCQlpZnN0cmVhbSBpZnMoYWxwcmVkaWN0KTsKLQkJaWYgKCFpZnMuaXNfb3BlbigpKSB7Ci0JCQljZXJyIDw8ICJDYW5ub3Qgb3BlbiBmaWxlIGZvciBITU0gaW5wdXQgIiA8PCBhbHByZWRpY3QgPDwgZW5kbDsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljZXJyIDw8ICJSZWFkaW5nIEhNTSB0YWJsZSBmcm9tICIgPDwgYWxwcmVkaWN0IDw8IGVuZGw7Ci0JCXN0cmluZyBzdHJMaW5lPSIiOwotCQlib29sIGV4cGVjdF9kYXRhID0gZmFsc2U7Ci0JCXdoaWxlICghaWZzLmVvZigpKSB7Ci0JCQlzdHJMaW5lID0gIiI7Ci0JCQlnZXRsaW5lKGlmcywgc3RyTGluZSk7Ci0JCQlpZiAoc3RyTGluZS5sZW5ndGgoKSkgewotCQkJCXN0cmluZ3N0cmVhbSBzcyhzdHJMaW5lLmNfc3RyKCkpOwotCQkJCUFsRGVwczxDTFM+IGRlcDsKLQkJCQlpbnQgbG93LCBoaWdoOwotCQkJCXNzID4+IGRlcC5lbmdsaXNoU2VudGVuY2VMZW5ndGggPj4gZGVwLmNsYXNzUHJldmlvdXMKLQkJCQkJCT4+IGRlcC5wcmV2aW91cyA+PiBkZXAuaiA+PiBkZXAuQ2ogPj4gbG93ID4+IGhpZ2g7Ci0JCQkJdHlwZW5hbWUgbWFwPEFsRGVwczxDTFM+LEZsZXhBcnJheTxkb3VibGU+ID46Oml0ZXJhdG9yIHA9Ci0JCQkJCQlhbFByb2JQcmVkaWN0ZWQuZmluZChkZXApOwotCQkJCWlmIChwPT1hbFByb2JQcmVkaWN0ZWQuZW5kKCkgKSB7Ci0JCQkJCXA9YWxQcm9iUHJlZGljdGVkLmluc2VydChtYWtlX3BhaXIoZGVwLEZsZXhBcnJheTxkb3VibGU+IChsb3csaGlnaCwwLjApKSkuZmlyc3Q7Ci0JCQkJfQotCQkJCWludCBwb3M7Ci0JCQkJZG91YmxlIHZhbDsKLQotCQkJCXdoaWxlICghc3MuZW9mKCkpIHsKLQkJCQkJcG9zID0gbG93LTE7Ci0JCQkJCXZhbCA9IDA7Ci0JCQkJCXNzID4+IHBvcyA+PiB2YWw7Ci0JCQkJCWlmIChwb3M+bG93LTEpIHsKLQkJCQkJCXAtPnNlY29uZFtwb3NdKz12YWw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoYWxwaGEpIHsKLQkJaWZzdHJlYW0gaWZzKGFscGhhKTsKLQotCQlpZiAoIWlmcy5pc19vcGVuKCkpIHsKLQkJCWNlcnIgPDwgIkNhbm5vdCBvcGVuIGZpbGUgZm9yIEhNTSBpbnB1dCAiIDw8IGFscGhhIDw8IGVuZGw7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJc3RyaW5nIHN0ckxpbmU9IiI7Ci0JCWJvb2wgZXhwZWN0X2RhdGEgPSBmYWxzZTsKLQkJd2hpbGUgKCFpZnMuZW9mKCkpIHsKLQkJCXN0ckxpbmUgPSAiIjsKLQkJCWdldGxpbmUoaWZzLCBzdHJMaW5lKTsKLQkJCWlmIChzdHJMaW5lLmxlbmd0aCgpKSB7Ci0JCQkJc3RyaW5nc3RyZWFtIHNzKHN0ckxpbmUuY19zdHIoKSk7Ci0JCQkJaW50IGlkID0gLTEsIHNpemUgPSAtMTsKLQkJCQlzcyA+PiBpZCA+PiBzaXplOwotCQkJCWlmIChpZDwwfHxzaXplPDB8fGlkIT1zaXplKSB7Ci0JCQkJCWNlcnIgPDwgIk1pc21hdGNoIGluIGFscGhhIGluaXQgdGFibGUhIiA8PCBlbmRsOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWhtbWVudHJ5X3R5cGUmYWxwID0gZG9HZXRBbHBoYUluaXQoaWQpOwotCQkJCUFycmF5PGRvdWJsZT4mIGdrID0gYWxwLmZpcnN0OwotCQkJCWludCBqOwotCQkJCWRvdWJsZSB2OwotI2lmZGVmIFdJTjMyCi0JCQkJYWxwLnNlY29uZC0+bG9jaygpOwotI2Vsc2UKLQkJCQlhbHAuc2Vjb25kLmxvY2soKTsKLSNlbmRpZgotCQkJCWZvciAoaj0wOyBqPGdrLnNpemUoKTsgaisrKSB7Ci0JCQkJCXNzID4+IHY7Ci0JCQkJCWdrW2pdKz12OwotCQkJCX0KLSNpZmRlZiBXSU4zMgotCQkJCWFscC5zZWNvbmQtPnVubG9jaygpOwotI2Vsc2UKLQkJCQlhbHAuc2Vjb25kLnVubG9jaygpOwotI2VuZGlmCi0KLQkJCX0KLQkJfQotCX0KLQotCWlmIChiZXRhKSB7Ci0JCWlmc3RyZWFtIGlmcyhiZXRhKTsKLQotCQlpZiAoIWlmcy5pc19vcGVuKCkpIHsKLQkJCWNlcnIgPDwgIkNhbm5vdCBvcGVuIGZpbGUgZm9yIEhNTSBpbnB1dCAiIDw8IGJldGEgPDwgZW5kbDsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlzdHJpbmcgc3RyTGluZT0iIjsKLQkJYm9vbCBleHBlY3RfZGF0YSA9IGZhbHNlOwotCQl3aGlsZSAoIWlmcy5lb2YoKSkgewotCQkJc3RyTGluZSA9ICIiOwotCQkJZ2V0bGluZShpZnMsIHN0ckxpbmUpOwotCQkJaWYgKHN0ckxpbmUubGVuZ3RoKCkpIHsKLQkJCQlzdHJpbmdzdHJlYW0gc3Moc3RyTGluZS5jX3N0cigpKTsKLQkJCQlpbnQgaWQgPSAtMSwgc2l6ZSA9IC0xOwotCQkJCXNzID4+IGlkID4+IHNpemU7Ci0JCQkJaWYgKGlkPDB8fHNpemU8MHx8aWQhPXNpemUpIHsKLQkJCQkJY2VyciA8PCAiTWlzbWF0Y2ggaW4gYWxwaGEgaW5pdCB0YWJsZSEiIDw8IGVuZGw7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaG1tZW50cnlfdHlwZSZiZXQxID0gZG9HZXRCZXRhSW5pdChpZCk7Ci0JCQkJQXJyYXk8ZG91YmxlPiZiZXQgPSBiZXQxLmZpcnN0OwotCQkJCQotCQkJCWludCBqOwotCQkJCWRvdWJsZSB2OwotI2lmZGVmIFdJTjMyCi0JCQkJYmV0MS5zZWNvbmQtPmxvY2soKTsKLSNlbHNlCi0JCQkJYmV0MS5zZWNvbmQubG9jaygpOwotI2VuZGlmCi0JCQkJZm9yIChqPTA7IGo8YmV0LnNpemUoKTsgaisrKSB7Ci0JCQkJCXNzID4+IHY7Ci0JCQkJCWJldFtqXSs9djsKLQkJCQl9Ci0jaWZkZWYgV0lOMzIKLQkJCQliZXQxLnNlY29uZC0+dW5sb2NrKCk7Ci0jZWxzZQotCQkJCWJldDEuc2Vjb25kLnVubG9jaygpOwotI2VuZGlmCi0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgQ0xTLCBjbGFzcyBNQVBQRVJDTEFTU1RPU1RSSU5HPiBib29sIEhNTVRhYmxlczxDTFMsCi0JCU1BUFBFUkNMQVNTVE9TVFJJTkc+OjptZXJnZShITU1UYWJsZXM8Q0xTLE1BUFBFUkNMQVNTVE9TVFJJTkc+ICYgaHQpIHsKLQotCWZvciAodHlwZW5hbWUgbWFwPEFsRGVwczxDTFM+LEZsZXhBcnJheTxkb3VibGU+ID46OmNvbnN0X2l0ZXJhdG9yIGk9Ci0JCQlodC5hbFByb2IuYmVnaW4oKTsgaSE9aHQuYWxQcm9iLmVuZCgpOyArK2kpIHsKLQkJdHlwZW5hbWUgbWFwPEFsRGVwczxDTFM+LEZsZXhBcnJheTxkb3VibGU+ID46Oml0ZXJhdG9yIHA9Ci0JCQkJYWxQcm9iLmZpbmQoaS0+Zmlyc3QpOwotCQlpZiAocD09YWxQcm9iLmVuZCgpICkgewotCQkJcD1hbFByb2IuaW5zZXJ0KG1ha2VfcGFpcihpLT5maXJzdCxGbGV4QXJyYXk8ZG91YmxlPiAoaS0+c2Vjb25kLmxvdygpLGktPnNlY29uZC5oaWdoKCksMC4wKSkpLmZpcnN0OwotCQl9Ci0JCWZvciAoaW50IGE9aS0+c2Vjb25kLmxvdygpOyBhPD1pLT5zZWNvbmQuaGlnaCgpOyArK2EpCi0JCQlpZiAoaS0+c2Vjb25kW2FdKSB7Ci0JCQkJcC0+c2Vjb25kW2FdICs9IGktPnNlY29uZFthXTsKLQkJCX0KLQotCX0KLQotCWZvciAodHlwZW5hbWUgbWFwPEFsRGVwczxDTFM+LEZsZXhBcnJheTxkb3VibGU+ID46OmNvbnN0X2l0ZXJhdG9yIGk9Ci0JCQlodC5hbFByb2JQcmVkaWN0ZWQuYmVnaW4oKTsgaSE9aHQuYWxQcm9iUHJlZGljdGVkLmVuZCgpOyArK2kpIHsKLQkJdHlwZW5hbWUgbWFwPEFsRGVwczxDTFM+LEZsZXhBcnJheTxkb3VibGU+ID46Oml0ZXJhdG9yIHA9Ci0JCQkJYWxQcm9iUHJlZGljdGVkLmZpbmQoaS0+Zmlyc3QpOwotCQlpZiAocD09YWxQcm9iUHJlZGljdGVkLmVuZCgpICkgewotCQkJcD1hbFByb2JQcmVkaWN0ZWQuaW5zZXJ0KG1ha2VfcGFpcihpLT5maXJzdCxGbGV4QXJyYXk8ZG91YmxlPiAoaS0+c2Vjb25kLmxvdygpLGktPnNlY29uZC5oaWdoKCksMC4wKSkpLmZpcnN0OwotCQl9Ci0JCWZvciAoaW50IGE9aS0+c2Vjb25kLmxvdygpOyBhPD1pLT5zZWNvbmQuaGlnaCgpOyArK2EpCi0JCQlpZiAoaS0+c2Vjb25kW2FdKSB7Ci0JCQkJcC0+c2Vjb25kW2FdICs9IGktPnNlY29uZFthXTsKLQkJCX0KLQotCX0KLQotCWZvciAodHlwZW5hbWUgaGFzaF9tYXA8aW50LGhtbWVudHJ5X3R5cGU+OjppdGVyYXRvciBpPQotCQkJaHQuaW5pdF9hbHBoYS5iZWdpbigpOyBpIT1odC5pbml0X2FscGhhLmVuZCgpOyBpKyspIHsKLQkJaG1tZW50cnlfdHlwZSYgYWxwID0gZG9HZXRBbHBoYUluaXQoaS0+Zmlyc3QpOwotCQlpbnQgajsKLQkJZG91YmxlIHY7Ci0JCWZvciAoaj0wOyBqPGFscC5maXJzdC5zaXplKCk7IGorKykgewotCQkJYWxwLmZpcnN0W2pdKz1pLT5zZWNvbmQuZmlyc3Rbal07Ci0JCX0KLQl9Ci0JZm9yICh0eXBlbmFtZSBoYXNoX21hcDxpbnQsaG1tZW50cnlfdHlwZT46Oml0ZXJhdG9yIGk9Ci0JCQlodC5pbml0X2JldGEuYmVnaW4oKTsgaSE9aHQuaW5pdF9iZXRhLmVuZCgpOyBpKyspIHsKLQkJaG1tZW50cnlfdHlwZSZhbHAgPSBkb0dldEJldGFJbml0KGktPmZpcnN0KTsKLQkJaW50IGo7Ci0JCWRvdWJsZSB2OwotCQlmb3IgKGo9MDsgajxhbHAuZmlyc3Quc2l6ZSgpOyBqKyspIHsKLQkJCWFscC5maXJzdFtqXSs9aS0+c2Vjb25kLmZpcnN0W2pdOwotCQl9Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXRlbXBsYXRlPGNsYXNzIENMUywgY2xhc3MgTUFQUEVSQ0xBU1NUT1NUUklORz4gSE1NVGFibGVzPENMUywKLQkJTUFQUEVSQ0xBU1NUT1NUUklORz46OkhNTVRhYmxlcyhkb3VibGUgX3Byb2JGb3JFbXB0eSwKLQkJY29uc3QgTUFQUEVSQ0xBU1NUT1NUUklORyZtMSwgY29uc3QgTUFQUEVSQ0xBU1NUT1NUUklORyZtMikgOgotCXByb2JhYmlsaXR5Rm9yRW1wdHkobWZhYnMoX3Byb2JGb3JFbXB0eSkpLAotCQkJdXBkYXRlUHJvYmFiaWxpdHlGb3JFbXB0eShfcHJvYkZvckVtcHR5PDAuMCksIG1hcHBlcjEoJm0xKSwKLQkJCW1hcHBlcjIoJm0yKSB7Ci0JbG9jayA9IG5ldyBNdXRleCgpOwotCWFscGhhbG9jayA9IG5ldyBNdXRleCgpOwotCWJldGFsb2NrID0gbmV3IE11dGV4KCk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIENMUywgY2xhc3MgTUFQUEVSQ0xBU1NUT1NUUklORz4gSE1NVGFibGVzPENMUywKLQkJTUFQUEVSQ0xBU1NUT1NUUklORz46OkhNTVRhYmxlcyhjb25zdCBITU1UYWJsZXMmIHJlZik6Ci1tYXBwZXIxKHJlZi5tYXBwZXIxKSwgbWFwcGVyMihyZWYubWFwcGVyMikKLXsKLQlwcm9iYWJpbGl0eUZvckVtcHR5PXJlZi5wcm9iYWJpbGl0eUZvckVtcHR5OwotCXVwZGF0ZVByb2JhYmlsaXR5Rm9yRW1wdHk9cmVmLnVwZGF0ZVByb2JhYmlsaXR5Rm9yRW1wdHk7Ci0JaW5pdF9hbHBoYT1yZWYuaW5pdF9hbHBoYTsKLQlpbml0X2JldGE9cmVmLmluaXRfYmV0YTsKLQlhbFByb2I9cmVmLmFsUHJvYjsKLQlhbFByb2JQcmVkaWN0ZWQ9cmVmLmFsUHJvYlByZWRpY3RlZDsKLQlnbG9iYWxDb3VudGVyPXJlZi5nbG9iYWxDb3VudGVyOwotCWRpdlN1bT1yZWYuZGl2U3VtOwotCXAwX2NvdW50PXJlZi5wMF9jb3VudDsKLQlucDBfY291bnQ9cmVmLm5wMF9jb3VudDsKLX0KLXRlbXBsYXRlPGNsYXNzIENMUywgY2xhc3MgTUFQUEVSQ0xBU1NUT1NUUklORz4gdm9pZCBITU1UYWJsZXM8Q0xTLAotCU1BUFBFUkNMQVNTVE9TVFJJTkc+OjpvcGVyYXRvcj0oY29uc3QgSE1NVGFibGVzJiByZWYpewotCXByb2JhYmlsaXR5Rm9yRW1wdHk9cmVmLnByb2JhYmlsaXR5Rm9yRW1wdHk7Ci0JdXBkYXRlUHJvYmFiaWxpdHlGb3JFbXB0eT1yZWYudXBkYXRlUHJvYmFiaWxpdHlGb3JFbXB0eTsKLQlpbml0X2FscGhhPXJlZi5pbml0X2FscGhhOwotCWluaXRfYmV0YT1yZWYuaW5pdF9iZXRhOwotCWFsUHJvYj1yZWYuYWxQcm9iOwotCWFsUHJvYlByZWRpY3RlZD1yZWYuYWxQcm9iUHJlZGljdGVkOwotCWdsb2JhbENvdW50ZXI9cmVmLmdsb2JhbENvdW50ZXI7Ci0JZGl2U3VtPXJlZi5kaXZTdW07Ci0JcDBfY291bnQ9cmVmLnAwX2NvdW50OwotCW5wMF9jb3VudD1yZWYubnAwX2NvdW50OwotfQotCi0KLXRlbXBsYXRlPGNsYXNzIENMUywgY2xhc3MgTUFQUEVSQ0xBU1NUT1NUUklORz4gSE1NVGFibGVzPENMUywKLQkJTUFQUEVSQ0xBU1NUT1NUUklORz46On5ITU1UYWJsZXMoKSB7Ci0jaWYgMAotCQkJZm9yICh0eXBlbmFtZSBoYXNoX21hcDxpbnQsaG1tZW50cnlfdHlwZT46Oml0ZXJhdG9yIGk9Ci0JCQkJaW5pdF9hbHBoYS5iZWdpbigpOyBpIT1pbml0X2FscGhhLmVuZCgpOyBpKyspIHsKLQkJCQkJaS0+c2Vjb25kLnNlY29uZC0+dW5sb2NrKCk7Ci0JCQl9Ci0JCQlmb3IgKHR5cGVuYW1lIGhhc2hfbWFwPGludCxobW1lbnRyeV90eXBlPjo6aXRlcmF0b3IgaT0KLQkJCQlpbml0X2JldGEuYmVnaW4oKTsgaSE9aW5pdF9iZXRhLmVuZCgpOyBpKyspIHsKLQkJCQkJaS0+c2Vjb25kLnNlY29uZC0+dW5sb2NrKCk7Ci0JCQl9Ci0KLQotCWRlbGV0ZSBsb2NrOwotCWRlbGV0ZSBhbHBoYWxvY2s7Ci0JZGVsZXRlIGJldGFsb2NrOwotCi0JCQlmb3IgKHR5cGVuYW1lIGhhc2hfbWFwPGludCxobW1lbnRyeV90eXBlPjo6aXRlcmF0b3IgaT0KLQkJCQlpbml0X2FscGhhLmJlZ2luKCk7IGkhPWluaXRfYWxwaGEuZW5kKCk7IGkrKykgewotCQkJCWRlbGV0ZSBpLT5zZWNvbmQuc2Vjb25kOwotCQkJfQotCQkJZm9yICh0eXBlbmFtZSBoYXNoX21hcDxpbnQsaG1tZW50cnlfdHlwZT46Oml0ZXJhdG9yIGk9Ci0JCQkJaW5pdF9iZXRhLmJlZ2luKCk7IGkhPWluaXRfYmV0YS5lbmQoKTsgaSsrKSB7Ci0JCQkJZGVsZXRlIGktPnNlY29uZC5zZWNvbmQ7Ci0JCQl9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL0hNTVRhYmxlcy5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvSE1NVGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGIxNzMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvSE1NVGFibGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdJWkErKyAoIGV4dGVuc2lvbiBvZiBHSVpBICkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpZm5kZWYgSE1NX1RBQkxFU19IX0FTREZfREVGSU5FRAotI2RlZmluZSBITU1fVEFCTEVTX0hfQVNERl9ERUZJTkVECi0jaW5jbHVkZSAiRmxleEFycmF5LmgiCi0KLSNpZiBfX0dOVUNfXz4yCi0jaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgotdXNpbmcgX19nbnVfY3h4OjpoYXNoX21hcDsKLSNlbHNlCi0jaW5jbHVkZSA8aGFzaF9tYXA+Ci0jZW5kaWYKLSNpbmNsdWRlICJBcnJheS5oIgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlICJteW1hdGguaCIKLSNpbmNsdWRlICJzeW5jT2JqLmgiCi0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1UIG5vcm1hbGl6ZV9pZl9wb3NzaWJsZShUKmEsVCpiKXsKLSAgICBUIHN1bT0wOwotICAgIGZvcihUKmk9YTtpIT1iOysraSkKLSAgICAgICAgc3VtKz0qaTsKLSAgICBpZiggc3VtICkKLSAgICAgICAgZm9yKFQqaT1hO2khPWI7KytpKQotICAgICAgICAqaS89c3VtOwotICAgIGVsc2UKLSAgICAgICAgZmlsbChhLGIsMS4wLyhiLWEpKTsKLSAgICByZXR1cm4gc3VtOwotfQotCi1leHRlcm4gc2hvcnQgQ29tcGFyZUFsRGVwczsKLXRlbXBsYXRlPGNsYXNzIENMUz4KLWNsYXNzIEFsRGVwc3sKLXB1YmxpYzoKLSAgICBpbnQgZW5nbGlzaFNlbnRlbmNlTGVuZ3RoOwotICAgIENMUyBjbGFzc1ByZXZpb3VzOwotICAgIGludCBwcmV2aW91czsKLSAgICBpbnQgajsKLSAgICBDTFMgQ2o7Ci0gICAgQWxEZXBzKCl7fTsKLSAgICBBbERlcHMoaW50IGwsaW50IHA9MCxpbnQgX2o9MCxDTFMgczE9MCxDTFMgX0NqPTApCi0gICAgICAgIDogZW5nbGlzaFNlbnRlbmNlTGVuZ3RoKGwpLGNsYXNzUHJldmlvdXMoczEpLHByZXZpb3VzKHApLGooX2opLENqKF9DaikKLSAgICB7fQotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBBbERlcHMmeCxjb25zdCBBbERlcHMmeSl7Ci0gICAgICAgIGlmKCAoQ29tcGFyZUFsRGVwcyYxKSAmJiB4LmVuZ2xpc2hTZW50ZW5jZUxlbmd0aDx5LmVuZ2xpc2hTZW50ZW5jZUxlbmd0aCApIHJldHVybiAxOwotICAgICAgICBpZiggKENvbXBhcmVBbERlcHMmMSkgJiYgeS5lbmdsaXNoU2VudGVuY2VMZW5ndGg8eC5lbmdsaXNoU2VudGVuY2VMZW5ndGggKSByZXR1cm4gMDsKLSAgICAgICAgaWYoIChDb21wYXJlQWxEZXBzJjIpICYmIHguY2xhc3NQcmV2aW91czx5LmNsYXNzUHJldmlvdXMgKSByZXR1cm4gMTsKLSAgICAgICAgaWYoIChDb21wYXJlQWxEZXBzJjIpICYmIHkuY2xhc3NQcmV2aW91czx4LmNsYXNzUHJldmlvdXMgKSByZXR1cm4gMDsKLSAgICAgICAgaWYoIChDb21wYXJlQWxEZXBzJjQpICYmIHgucHJldmlvdXM8eS5wcmV2aW91cyApIHJldHVybiAxOwotICAgICAgICBpZiggKENvbXBhcmVBbERlcHMmNCkgJiYgeS5wcmV2aW91czx4LnByZXZpb3VzICkgcmV0dXJuIDA7Ci0gICAgICAgIGlmKCAoQ29tcGFyZUFsRGVwcyY4KSAmJiB4Lmo8eS5qICkgcmV0dXJuIDE7Ci0gICAgICAgIGlmKCAoQ29tcGFyZUFsRGVwcyY4KSAmJiB5Lmo8eC5qICkgcmV0dXJuIDA7Ci0gICAgICAgIGlmKCAoQ29tcGFyZUFsRGVwcyYxNikgJiYgeC5Dajx5LkNqICkgcmV0dXJuIDE7Ci0gICAgICAgIGlmKCAoQ29tcGFyZUFsRGVwcyYxNikgJiYgeS5Dajx4LkNqICkgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFsRGVwcyZ4LGNvbnN0IEFsRGVwcyZ5KQotICAgIHsgcmV0dXJuICEoIHg8eSB8fCB5PHggKTsgIH0KLX07Ci0KLXRlbXBsYXRlPGNsYXNzIENMUz4KLWNsYXNzIEhhc2hfQWxEZXBzewotcHVibGljOgotICAgIHVuc2lnbmVkIAotICAgICAgICBpbnQgCi0gICAgICAgIG9wZXJhdG9yKCkKLSAgICAgICAgKGNvbnN0IEFsRGVwczxDTFM+JngpCi0gICAgICAgIGNvbnN0Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzaD0wOwotICAgICAgICBpZiggKENvbXBhcmVBbERlcHMmMSkgKSB7IGhhc2g9aGFzaCt4LmVuZ2xpc2hTZW50ZW5jZUxlbmd0aDtoYXNoKj0zMTt9Ci0gICAgICAgIGlmKCAoQ29tcGFyZUFsRGVwcyYyKSApIHsgaGFzaD1oYXNoK3guY2xhc3NQcmV2aW91cztoYXNoKj0zMTt9Ci0gICAgICAgIGlmKCAoQ29tcGFyZUFsRGVwcyY0KSApIHsgaGFzaD1oYXNoK3gucHJldmlvdXM7aGFzaCo9MzE7fQotICAgICAgICBpZiggKENvbXBhcmVBbERlcHMmOCkgKSB7IGhhc2g9aGFzaCt4Lmo7aGFzaCo9MzE7fQotICAgICAgICBpZiggKENvbXBhcmVBbERlcHMmMTYpICkgeyBoYXNoPWhhc2greC5DajtoYXNoKj0zMTt9Ci0gICAgICAgIHJldHVybiBoYXNoOwotICAgICAgCi0gICAgfQotfTsKLQotI2lmZGVmIFdJTjMyCi10eXBlZGVmIHBhaXI8QXJyYXk8ZG91YmxlPixNdXRleCo+IGhtbWVudHJ5X3R5cGU7Ci0jZWxzZQotdHlwZWRlZiBwYWlyPEFycmF5PGRvdWJsZT4sTXV0ZXg+IGhtbWVudHJ5X3R5cGU7Ci0jZW5kaWYKLQotdGVtcGxhdGU8Y2xhc3MgQ0xTLGNsYXNzIE1BUFBFUkNMQVNTVE9TVFJJTkc+Ci1jbGFzcyBITU1UYWJsZXMKLXsKLQlNdXRleCogbG9jazsKLQlNdXRleCogYWxwaGFsb2NrLCpiZXRhbG9jazsKLXB1YmxpYzoKLQotICAgIGRvdWJsZSBwcm9iYWJpbGl0eUZvckVtcHR5OyAgCi0gICAgYm9vbCB1cGRhdGVQcm9iYWJpbGl0eUZvckVtcHR5OwotICAgIGhhc2hfbWFwPGludCwgaG1tZW50cnlfdHlwZSA+IGluaXRfYWxwaGE7Ci0gICAgaGFzaF9tYXA8aW50LCBobW1lbnRyeV90eXBlID4gaW5pdF9iZXRhOwotICAgIG1hcDxBbERlcHM8Q0xTPixGbGV4QXJyYXk8ZG91YmxlPiA+IGFsUHJvYjsKLSAgICBtYXA8QWxEZXBzPENMUz4sRmxleEFycmF5PGRvdWJsZT4gPiBhbFByb2JQcmVkaWN0ZWQ7Ci0gICAgaW50IGdsb2JhbENvdW50ZXI7Ci0gICAgZG91YmxlIGRpdlN1bTsKLSAgICBkb3VibGUgcDBfY291bnQsbnAwX2NvdW50OwotICAgIGNvbnN0IE1BUFBFUkNMQVNTVE9TVFJJTkcqbWFwcGVyMTsKLSAgICBjb25zdCBNQVBQRVJDTEFTU1RPU1RSSU5HKm1hcHBlcjI7Ci1wdWJsaWM6Ci0gICAgYm9vbCBtZXJnZShITU1UYWJsZXM8Q0xTLE1BUFBFUkNMQVNTVE9TVFJJTkc+ICYgaHQpOwotICAgIGNvbnN0IEhNTVRhYmxlczxDTFMsTUFQUEVSQ0xBU1NUT1NUUklORz4qZ2V0VGhpcygpY29uc3Qge3JldHVybiB0aGlzO30KLSAgICBITU1UYWJsZXMoZG91YmxlIF9wcm9iRm9yRW1wdHksY29uc3QgTUFQUEVSQ0xBU1NUT1NUUklORyZtMSxjb25zdCBNQVBQRVJDTEFTU1RPU1RSSU5HJm0yKTsKLQlITU1UYWJsZXMoY29uc3QgSE1NVGFibGVzJiByZWYpOwotCXZvaWQgb3BlcmF0b3I9KGNvbnN0IEhNTVRhYmxlcyYgcmVmKTsKLSAgICB2aXJ0dWFsIH5ITU1UYWJsZXMoKTsKLSAgICB2aXJ0dWFsIGRvdWJsZSBnZXRBbFByb2IoaW50IGksaW50IGssaW50IHNlbnRMZW5ndGgsaW50IEosQ0xTIHcxLENMUyB3MixpbnQgaixpbnQgaXRlcj0wKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgd3JpdGVKdW1wcyhvc3RyZWFtJikgY29uc3Q7Ci0gICAgLyoqQnkgRWR3YXJkIEdhbywgd3JpdGUgb3V0IGFsbCB0aGluZ3MgbmVlZGVkIHRvIHJlYnVpbGQgdGhlIGNvdW50IHRhYmxlKi8KLSAgICB2aXJ0dWFsIGJvb2wgd3JpdGVKdW1wcyhjb25zdCBjaGFyKiBhbHByb2IsIGNvbnN0IGNoYXIqIGFscHJlZGljdCwgY29uc3QgY2hhciogYWxwaGEsIGNvbnN0IGNoYXIqIGJldGEgKWNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCByZWFkSnVtcHMoY29uc3QgY2hhciogYWxwcm9iLCBjb25zdCBjaGFyKiBhbHByZWRpY3QsIGNvbnN0IGNoYXIqIGFscGhhLCBjb25zdCBjaGFyKiBiZXRhICk7Ci0gICAgdm9pZCBhZGRBbENvdW50KGludCBpLGludCBrLGludCBzZW50TGVuZ3RoLGludCBKLENMUyB3MSxDTFMgdzIsaW50IGosZG91YmxlIHZhbHVlLGRvdWJsZSB2YWx1ZVByZWRpY3RlZCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlYWRKdW1wcyhpc3RyZWFtJik7Ci0gICAgdmlydHVhbCBib29sIGdldEFscGhhSW5pdChpbnQgSSxBcnJheTxkb3VibGU+JngpY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGdldEJldGFJbml0KGludCBJLEFycmF5PGRvdWJsZT4gJngpY29uc3Q7Ci0gICAgaG1tZW50cnlfdHlwZSAmZG9HZXRBbHBoYUluaXQoaW50IEkpOwotICAgIGhtbWVudHJ5X3R5cGUgJmRvR2V0QmV0YUluaXQoaW50IEkpOwotICAgIHZpcnR1YWwgZG91YmxlIGdldFByb2JhYmlsaXR5Rm9yRW1wdHkoKWNvbnN0Ci0gICAge3JldHVybiBwcm9iYWJpbGl0eUZvckVtcHR5O30gIAotICAgIHZvaWQgcGVyZm9ybUdJU0l0ZXJhdGlvbihjb25zdCBITU1UYWJsZXM8Q0xTLE1BUFBFUkNMQVNTVE9TVFJJTkc+Km9sZCl7Ci0gICAgICAgIGNvdXQgPDwgIk9MRFNJWkU6ICIgPDwgKG9sZD8ob2xkLT5hbFByb2Iuc2l6ZSgpKTowKSA8PCAiIE5FV1NJWkU6Ijw8IGFsUHJvYi5zaXplKCk8PCBlbmRsOwotICAgICAgICBmb3IodHlwZW5hbWUgbWFwPEFsRGVwczxDTFM+LEZsZXhBcnJheTxkb3VibGU+ID46Oml0ZXJhdG9yIGk9YWxQcm9iLmJlZ2luKCk7aSE9YWxQcm9iLmVuZCgpOysraSkJewotICAgICAgICAgICAgaWYoIGFsUHJvYlByZWRpY3RlZC5jb3VudChpLT5maXJzdCkpewotICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9pZl9wb3NzaWJsZShpLT5zZWNvbmQuYmVnaW4oKSxpLT5zZWNvbmQuZW5kKCkpOwotICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9pZl9wb3NzaWJsZShhbFByb2JQcmVkaWN0ZWRbaS0+Zmlyc3RdLmJlZ2luKCksYWxQcm9iUHJlZGljdGVkW2ktPmZpcnN0XS5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBqPWktPnNlY29uZC5sb3coKTtqPD1pLT5zZWNvbmQuaGlnaCgpOysrail7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBpLT5zZWNvbmRbal0gKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWxQcm9iUHJlZGljdGVkW2ktPmZpcnN0XVtqXT4wLjAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvcD0xLjA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG9sZCAmJiBvbGQtPmFsUHJvYi5jb3VudChpLT5maXJzdCkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcD0ob2xkLT5hbFByb2IuZmluZChpLT5maXJzdCktPnNlY29uZClbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jZXJyIDw8ICJHSVM6ICIgPDwgaiA8PCAnICcgPDwgIiBPTEQ6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICA8PCBvcCA8PCAiKnRydWU6IiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgPDwgaS0+c2Vjb25kW2pdIDw8ICIvcHJlZDoiIDw8IGFsUHJvYlByZWRpY3RlZFtpLT5maXJzdF1bal0gPDwgIiAtPiAiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktPnNlY29uZFtqXT0gb3AqKGktPnNlY29uZFtqXS9hbFByb2JQcmVkaWN0ZWRbaS0+Zmlyc3RdW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NlcnIgPDwgaS0+c2Vjb25kW2pdIDw8IGVuZGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjZXJyIDw8ICJFUlJPUjIgaW4gcGVyZm9ybUdJU2l0ZXJhdGlvbjogIiA8PCBpLT5zZWNvbmRbal0gPDwgZW5kbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjZXJyIDw8ICJFUlJPUiBpbiBwZXJmb3JtR0lTSXRlcmF0aW9uOiAiIDw8IGFsUHJvYlByZWRpY3RlZC5jb3VudChpLT5maXJzdCkgPDwgZW5kbDsKLSAgICAgICAgfQotICAgIH0KLX07Ci0KLXRlbXBsYXRlPGNsYXNzIENMUyxjbGFzcyBNQVBQRVJDTEFTU1RPU1RSSU5HPgotaW5saW5lIHZvaWQgcHJpbnRBbERlcHMob3N0cmVhbSZvdXQsY29uc3QgQWxEZXBzPENMUz4meCxjb25zdCBNQVBQRVJDTEFTU1RPU1RSSU5HJm1hcHBlcjEsY29uc3QgTUFQUEVSQ0xBU1NUT1NUUklORyZtYXBwZXIyKQotewotICBpZiggKENvbXBhcmVBbERlcHMmMSkgKSBvdXQgPDwgInNlbnRlbmNlTGVuZ3RoOiAiIDw8IHguZW5nbGlzaFNlbnRlbmNlTGVuZ3RoPDwgJyAnOwotICBpZiggKENvbXBhcmVBbERlcHMmMikgKSBvdXQgPDwgInByZXZpb3VzQ2xhc3M6ICIgPDwgbWFwcGVyMS5jbGFzc1N0cmluZyh4LmNsYXNzUHJldmlvdXMpIDw8ICcgJzsKLSAgaWYoIChDb21wYXJlQWxEZXBzJjQpICkgb3V0IDw8ICJwcmV2aW91c1Bvc2l0aW9uOiAiIDw8IHgucHJldmlvdXMgPDwgJyAnOwotICBpZiggKENvbXBhcmVBbERlcHMmOCkgKSBvdXQgPDwgIkZyZW5jaFBvc2l0aW9uOiAiIDw8IHguaiA8PCAnICc7Ci0gIGlmKCAoQ29tcGFyZUFsRGVwcyYxNikgKSBvdXQgPDwgIkZyZW5jaENsYXNzOiAiIDw8IG1hcHBlcjIuY2xhc3NTdHJpbmcoeC5DaikgPDwgJyAnOwotICAvL291dCA8PCAnXG4nOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL01ha2VmaWxlLmFtIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDY4OGUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCi0KLSMjIENyZWF0ZWQgYnkgQW5qdXRhCi0KLUlOQ0xVREVTID0gXAotCS1EUEFDS0FHRV9MT0NBTEVfRElSPVwiIiQocHJlZml4KS8kKERBVEFESVJOQU1FKS9sb2NhbGUiXCIgXAotCS1EUEFDS0FHRV9TUkNfRElSPVwiIiQoc3JjZGlyKSJcIiBcCi0JLURQQUNLQUdFX0RBVEFfRElSPVwiIiQoZGF0YWRpcikiXCIgCi0KLUFNX0NGTEFHUyA9XAotCSAtV2FsbFwKLQkgLWcKLQotYmluX1BST0dSQU1TID0gbWdpemEgXAotCXNudDJjb29jXAotCXNudDJwbGFpblwKLQlwbGFpbjJzbnQgXAotCXN5bWFsIFwKLQlobW1ub3JtIFwKLQlkNG5vcm0KLQotZDRub3JtX1NPVVJDRVMgPSBcCi0JZDRub3JtLmN4eAotCi1kNG5vcm1fTERBREQgPSBcCi0JLWxnaXphIFwKLQktbHB0aHJlYWQKLQotZDRub3JtX0xERkxBR1MgPSBcCi0JLUwuCi0KLWQ0bm9ybV9ERVBFTkRFTkNJRVMgPSBcCi0JbGliZ2l6YS5hCi0KLWQ0bm9ybV9DWFhGTEFHUyA9IFwKLQktTVQgXAotCS1NRCBcCi0JLU1QIFwKLQktTUYgXAotCS1PNgotCi1kNG5vcm1fQ1BQRkxBR1MgPSBcCi0JLUROREVCVUcgXAotCS1EV09SRElOREVYX1dJVEhfNF9CWVRFIFwKLQktREJJTkFSWV9TRUFSQ0hfRk9SX1RUQUJMRSBcCi0JLURERUJVRwotCi1obW1ub3JtX1NPVVJDRVMgPSBcCi0JaG1tbm9ybS5jeHgKLQotaG1tbm9ybV9MREFERCA9IFwKLQktbGdpemEgXAotCS1scHRocmVhZAotCi1obW1ub3JtX0xERkxBR1MgPSBcCi0JLUwuCi0KLWhtbW5vcm1fREVQRU5ERU5DSUVTID0gXAotCWxpYmdpemEuYQotCi1obW1ub3JtX0NYWEZMQUdTID0gXAotCS1NVCBcCi0JLU1EIFwKLQktTVAgXAotCS1NRiBcCi0JLU82Ci0KLWhtbW5vcm1fQ1BQRkxBR1MgPSBcCi0JLUROREVCVUcgXAotCS1EV09SRElOREVYX1dJVEhfNF9CWVRFIFwKLQktREJJTkFSWV9TRUFSQ0hfRk9SX1RUQUJMRSBcCi0JLURERUJVRwotCi1zeW1hbF9TT1VSQ0VTID0gXAotCWNtZC5jICBcCi0JY21kLmggIFwKLQlzeW1hbC5jcHAKLQotcGxhaW4yc250X1NPVVJDRVMgPSBcCi0JcGxhaW4yc250LmNwcAotCi1zbnQycGxhaW5fU09VUkNFUyA9IFwKLQlzbnQycGxhaW4uY3BwCi0KLXNudDJjb29jX1NPVVJDRVMgPSBcCi0Jc250MmNvb2MuY3BwCi0KLXNudDJjb29jX0NQUEZMQUdTID0gXAotCS1ETkRFQlVHIFwKLQktRFdPUkRJTkRFWF9XSVRIXzRfQllURSBcCi0JLURCSU5BUllfU0VBUkNIX0ZPUl9UVEFCTEUgXAotCS1EREVCVUcKLQotbWdpemFfU09VUkNFUyA9IFwKLQltYWluLmNwcAotCi1tZ2l6YV9ERVBFTkRFTkNJRVMgPSBcCi0JbGliZ2l6YS5hCi0KLW1naXphX0NYWEZMQUdTID0gXAotCS1NVCBcCi0JLU1EIFwKLQktTVAgXAotCS1NRiBcCi0JLU82Ci0KLW1naXphX0NQUEZMQUdTID0gXAotCS1ETkRFQlVHIFwKLQktRFdPUkRJTkRFWF9XSVRIXzRfQllURSBcCi0JLURCSU5BUllfU0VBUkNIX0ZPUl9UVEFCTEUgXAotCS1EREVCVUcKLQotbWdpemFfTERGTEFHUyA9IFwKLQktTC4KLQotbWdpemFfTERBREQgPSBcCi0JLWxnaXphIFwKLQktbHB0aHJlYWQKLQotbGliX0xJQlJBUklFUyA9IFwKLQlsaWJnaXphLmEKLQotbGliZ2l6YV9hX1NPVVJDRVMgPSBcCi0JYWxpZ25tZW50LmNwcFwKLQlhbGlnbm1lbnQuaCBcCi0JQWxpZ25UYWJsZXMuY3BwIFwKLQlBbGlnblRhYmxlcy5oIFwKLQlBcnJheS5oIFwKLQlBcnJheTIuaCBcCi0JQXJyYXk0LmggXAotCUFUYWJsZXMuY3BwIFwKLQlBVGFibGVzLmggXAotCWNvbGxDb3VudHMuY3BwIFwKLQljb2xsQ291bnRzLmggXAotCWNvbW1vbi5oIFwKLQlENFRhYmxlcy5oIFwKLQlENVRhYmxlcy5oIFwKLQlkZWZzLmggXAotCURpY3Rpb25hcnkuY3BwIFwKLQlEaWN0aW9uYXJ5LmggXAotCWZpbGVfc3BlYy5oIFwKLQlGbGV4QXJyYXkuaCBcCi0JRm9yd2FyZEJhY2t3YXJkLmNwcCBcCi0JRm9yd2FyZEJhY2t3YXJkLmggXAotCWdldFNlbnRlbmNlLmNwcCBcCi0JZ2V0U2VudGVuY2UuaCBcCi0JR2xvYmFscy5oIFwKLQlobW0uY3BwIFwKLQlobW0uaCBcCi0JSE1NVGFibGVzLmNwcCBcCi0JSE1NVGFibGVzLmggXAotCWxvZ3Byb2IuY3BwIFwKLQlsb2dwcm9iLmggXAotCW1vZGVsMS5jcHAgXAotCW1vZGVsMS5oIFwKLQltb2RlbDIuY3BwIFwKLQltb2RlbDIuaCBcCi0JbW9kZWwydG8zLmNwcCBcCi0JbW9kZWwzLmNwcCBcCi0JbW9kZWwzLmggXAotCW1vZGVsM192aXRlcmJpLmNwcCBcCi0JbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwIFwKLQltb2RlbDM0NS1wZWcuY3BwIFwKLQlNb3ZlU3dhcE1hdHJpeC5jcHAgXAotCU1vdmVTd2FwTWF0cml4LmggXAotCW15YXNzZXJ0LmNwcCBcCi0JbXlhc3NlcnQuaCBcCi0JbXltYXRoLmggXAotCW15c3RsLmggXAotCU5UYWJsZXMuY3BwIFwKLQlOVGFibGVzLmggXAotCVBhcmFtZXRlci5jcHAgXAotCVBhcmFtZXRlci5oIFwKLQlwYXJzZS5jcHAgXAotCVBlcnBsZXhpdHkuY3BwIFwKLQlQZXJwbGV4aXR5LmggXAotCVBvaW50ZXIuaCBcCi0JcmVwb3J0cy5jcHAgXAotCVNldEFycmF5LmNwcCBcCi0JU2V0QXJyYXkuaCBcCi0Jc3luY09iai5oIFwKLQl0cmFuc3BhaXJfbW9kZWwxLmggXAotCXRyYW5zcGFpcl9tb2RlbDIuaCBcCi0JdHJhbnNwYWlyX21vZGVsMy5jcHAgXAotCXRyYW5zcGFpcl9tb2RlbDMuaCBcCi0JdHJhbnNwYWlyX21vZGVsNC5jcHAgXAotCXRyYW5zcGFpcl9tb2RlbDQuaCBcCi0JdHJhbnNwYWlyX21vZGVsNS5jcHAgXAotCXRyYW5zcGFpcl9tb2RlbDUuaCBcCi0JdHJhbnNwYWlyX21vZGVsaG1tLmggXAotCXR0YWJsZURpZmYuaHBwIFwKLQlUVGFibGVzLmNwcCBcCi0JVFRhYmxlcy5oIFwKLQl0eXBlcy5oIFwKLQl1dGlsaXR5LmNwcCBcCi0JdXRpbGl0eS5oIFwKLQlWZWN0b3IuaCBcCi0Jdm9jYWIuY3BwIFwKLQl2b2NhYi5oIFwKLQlXb3JkQ2xhc3Nlcy5oCi0KLWxpYmdpemFfYV9DWFhGTEFHUyA9IFwKLQktTUQgXAotCS1NUCBcCi0JLU1GIFwKLQktTVQgXAotCS1PNgotCi1saWJnaXphX2FfQ1BQRkxBR1MgPSBcCi0JLUROREVCVUcgXAotCS1EV09SRElOREVYX1dJVEhfNF9CWVRFIFwKLQktREJJTkFSWV9TRUFSQ0hfRk9SX1RUQUJMRSBcCi0JLURERUJVRwotCi1TVUJESVJTID0gXAotCW1rY2xzCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL01ha2VmaWxlLmluIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOWYyNTkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNDA3ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAuMSBmcm9tIE1ha2VmaWxlLmFtLgotIyBAY29uZmlndXJlX2lucHV0QAotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1AU0VUX01BS0VACi0KLQotVlBBVEggPSBAc3JjZGlyQAotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJpbl9QUk9HUkFNUyA9IG1naXphJChFWEVFWFQpIHNudDJjb29jJChFWEVFWFQpIHNudDJwbGFpbiQoRVhFRVhUKSBcCi0JcGxhaW4yc250JChFWEVFWFQpIHN5bWFsJChFWEVFWFQpIGhtbW5vcm0kKEVYRUVYVCkgXAotCWQ0bm9ybSQoRVhFRVhUKQotc3ViZGlyID0gc3JjCi1ESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0KLWFtX192cGF0aF9hZGpfc2V0dXAgPSBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOwotYW1fX3ZwYXRoX2FkaiA9IGNhc2UgJCRwIGluIFwKLSAgICAkKHNyY2RpcikvKikgZj1gZWNobyAiJCRwIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAotICAgICopIGY9JCRwOzsgXAotICBlc2FjOwotYW1fX3N0cmlwX2RpciA9IGBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKLWFtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChsaWJkaXIpIiAiJChERVNURElSKSQoYmluZGlyKSIKLWxpYkxJQlJBUklFU19JTlNUQUxMID0gJChJTlNUQUxMX0RBVEEpCi1MSUJSQVJJRVMgPSAkKGxpYl9MSUJSQVJJRVMpCi1BUiA9IGFyCi1BUkZMQUdTID0gY3J1Ci1saWJnaXphX2FfQVIgPSAkKEFSKSAkKEFSRkxBR1MpCi1saWJnaXphX2FfTElCQUREID0KLWFtX2xpYmdpemFfYV9PQkpFQ1RTID0gbGliZ2l6YV9hLWFsaWdubWVudC4kKE9CSkVYVCkgXAotCWxpYmdpemFfYS1BbGlnblRhYmxlcy4kKE9CSkVYVCkgbGliZ2l6YV9hLUFUYWJsZXMuJChPQkpFWFQpIFwKLQlsaWJnaXphX2EtY29sbENvdW50cy4kKE9CSkVYVCkgbGliZ2l6YV9hLURpY3Rpb25hcnkuJChPQkpFWFQpIFwKLQlsaWJnaXphX2EtRm9yd2FyZEJhY2t3YXJkLiQoT0JKRVhUKSBcCi0JbGliZ2l6YV9hLWdldFNlbnRlbmNlLiQoT0JKRVhUKSBsaWJnaXphX2EtaG1tLiQoT0JKRVhUKSBcCi0JbGliZ2l6YV9hLUhNTVRhYmxlcy4kKE9CSkVYVCkgbGliZ2l6YV9hLWxvZ3Byb2IuJChPQkpFWFQpIFwKLQlsaWJnaXphX2EtbW9kZWwxLiQoT0JKRVhUKSBsaWJnaXphX2EtbW9kZWwyLiQoT0JKRVhUKSBcCi0JbGliZ2l6YV9hLW1vZGVsMnRvMy4kKE9CSkVYVCkgbGliZ2l6YV9hLW1vZGVsMy4kKE9CSkVYVCkgXAotCWxpYmdpemFfYS1tb2RlbDNfdml0ZXJiaS4kKE9CSkVYVCkgXAotCWxpYmdpemFfYS1tb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy4kKE9CSkVYVCkgXAotCWxpYmdpemFfYS1tb2RlbDM0NS1wZWcuJChPQkpFWFQpIFwKLQlsaWJnaXphX2EtTW92ZVN3YXBNYXRyaXguJChPQkpFWFQpIFwKLQlsaWJnaXphX2EtbXlhc3NlcnQuJChPQkpFWFQpIGxpYmdpemFfYS1OVGFibGVzLiQoT0JKRVhUKSBcCi0JbGliZ2l6YV9hLVBhcmFtZXRlci4kKE9CSkVYVCkgbGliZ2l6YV9hLXBhcnNlLiQoT0JKRVhUKSBcCi0JbGliZ2l6YV9hLVBlcnBsZXhpdHkuJChPQkpFWFQpIGxpYmdpemFfYS1yZXBvcnRzLiQoT0JKRVhUKSBcCi0JbGliZ2l6YV9hLVNldEFycmF5LiQoT0JKRVhUKSBcCi0JbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDMuJChPQkpFWFQpIFwKLQlsaWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNC4kKE9CSkVYVCkgXAotCWxpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw1LiQoT0JKRVhUKSBcCi0JbGliZ2l6YV9hLVRUYWJsZXMuJChPQkpFWFQpIGxpYmdpemFfYS11dGlsaXR5LiQoT0JKRVhUKSBcCi0JbGliZ2l6YV9hLXZvY2FiLiQoT0JKRVhUKQotbGliZ2l6YV9hX09CSkVDVFMgPSAkKGFtX2xpYmdpemFfYV9PQkpFQ1RTKQotYmluUFJPR1JBTVNfSU5TVEFMTCA9ICQoSU5TVEFMTF9QUk9HUkFNKQotUFJPR1JBTVMgPSAkKGJpbl9QUk9HUkFNUykKLWFtX2Q0bm9ybV9PQkpFQ1RTID0gZDRub3JtLWQ0bm9ybS4kKE9CSkVYVCkKLWQ0bm9ybV9PQkpFQ1RTID0gJChhbV9kNG5vcm1fT0JKRUNUUykKLWQ0bm9ybV9MSU5LID0gJChDWFhMRCkgJChkNG5vcm1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIFwKLQkkKGQ0bm9ybV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1hbV9obW1ub3JtX09CSkVDVFMgPSBobW1ub3JtLWhtbW5vcm0uJChPQkpFWFQpCi1obW1ub3JtX09CSkVDVFMgPSAkKGFtX2htbW5vcm1fT0JKRUNUUykKLWhtbW5vcm1fTElOSyA9ICQoQ1hYTEQpICQoaG1tbm9ybV9DWFhGTEFHUykgJChDWFhGTEFHUykgXAotCSQoaG1tbm9ybV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1hbV9tZ2l6YV9PQkpFQ1RTID0gbWdpemEtbWFpbi4kKE9CSkVYVCkKLW1naXphX09CSkVDVFMgPSAkKGFtX21naXphX09CSkVDVFMpCi1tZ2l6YV9MSU5LID0gJChDWFhMRCkgJChtZ2l6YV9DWFhGTEFHUykgJChDWFhGTEFHUykgJChtZ2l6YV9MREZMQUdTKSBcCi0JJChMREZMQUdTKSAtbyAkQAotYW1fcGxhaW4yc250X09CSkVDVFMgPSBwbGFpbjJzbnQuJChPQkpFWFQpCi1wbGFpbjJzbnRfT0JKRUNUUyA9ICQoYW1fcGxhaW4yc250X09CSkVDVFMpCi1wbGFpbjJzbnRfTERBREQgPSAkKExEQUREKQotYW1fc250MmNvb2NfT0JKRUNUUyA9IHNudDJjb29jLXNudDJjb29jLiQoT0JKRVhUKQotc250MmNvb2NfT0JKRUNUUyA9ICQoYW1fc250MmNvb2NfT0JKRUNUUykKLXNudDJjb29jX0xEQUREID0gJChMREFERCkKLWFtX3NudDJwbGFpbl9PQkpFQ1RTID0gc250MnBsYWluLiQoT0JKRVhUKQotc250MnBsYWluX09CSkVDVFMgPSAkKGFtX3NudDJwbGFpbl9PQkpFQ1RTKQotc250MnBsYWluX0xEQUREID0gJChMREFERCkKLWFtX3N5bWFsX09CSkVDVFMgPSBjbWQuJChPQkpFWFQpIHN5bWFsLiQoT0JKRVhUKQotc3ltYWxfT0JKRUNUUyA9ICQoYW1fc3ltYWxfT0JKRUNUUykKLXN5bWFsX0xEQUREID0gJChMREFERCkKLURFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpCi1kZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCi1hbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcwotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCi0JJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotQ1hYQ09NUElMRSA9ICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAotCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpCi1DWFhMRCA9ICQoQ1hYKQotQ1hYTElOSyA9ICQoQ1hYTEQpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSBcCi0JLW8gJEAKLVNPVVJDRVMgPSAkKGxpYmdpemFfYV9TT1VSQ0VTKSAkKGQ0bm9ybV9TT1VSQ0VTKSAkKGhtbW5vcm1fU09VUkNFUykgXAotCSQobWdpemFfU09VUkNFUykgJChwbGFpbjJzbnRfU09VUkNFUykgJChzbnQyY29vY19TT1VSQ0VTKSBcCi0JJChzbnQycGxhaW5fU09VUkNFUykgJChzeW1hbF9TT1VSQ0VTKQotRElTVF9TT1VSQ0VTID0gJChsaWJnaXphX2FfU09VUkNFUykgJChkNG5vcm1fU09VUkNFUykgXAotCSQoaG1tbm9ybV9TT1VSQ0VTKSAkKG1naXphX1NPVVJDRVMpICQocGxhaW4yc250X1NPVVJDRVMpIFwKLQkkKHNudDJjb29jX1NPVVJDRVMpICQoc250MnBsYWluX1NPVVJDRVMpICQoc3ltYWxfU09VUkNFUykKLVJFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi0JaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKLQlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKLQlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQotUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKLSAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVF9TVUJESVJTID0gJChTVUJESVJTKQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFXSyA9IEBBV0tACi1DQyA9IEBDQ0AKLUNDREVQTU9ERSA9IEBDQ0RFUE1PREVACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQID0gQENQUEAKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotQ1hYID0gQENYWEAKLUNYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKLUNYWEZMQUdTID0gQENYWEZMQUdTQAotQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKLURFRlMgPSBAREVGU0AKLURFUERJUiA9IEBERVBESVJACi1FQ0hPX0MgPSBARUNIT19DQAotRUNIT19OID0gQEVDSE9fTkAKLUVDSE9fVCA9IEBFQ0hPX1RACi1FR1JFUCA9IEBFR1JFUEAKLUVYRUVYVCA9IEBFWEVFWFRACi1HUkVQID0gQEdSRVBACi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQk9CSlMgPSBATElCT0JKU0AKLUxJQlMgPSBATElCU0AKLUxUTElCT0JKUyA9IEBMVExJQk9CSlNACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVJBTkxJQiA9IEBSQU5MSUJACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1RSSVAgPSBAU1RSSVBACi1WRVJTSU9OID0gQFZFUlNJT05ACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0NYWCA9IEBhY19jdF9DWFhACi1hbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKLWFtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACi1hbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAotYW1fX3RhciA9IEBhbV9fdGFyQAotYW1fX3VudGFyID0gQGFtX191bnRhckAKLWJpbmRpciA9IEBiaW5kaXJACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkZGlyID0gQGJ1aWxkZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACi1kb2NkaXIgPSBAZG9jZGlyQAotZHZpZGlyID0gQGR2aWRpckAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaHRtbGRpciA9IEBodG1sZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAotbGliZGlyID0gQGxpYmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWxvY2FsZWRpciA9IEBsb2NhbGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWtkaXJfcCA9IEBta2Rpcl9wQAotb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAotcGRmZGlyID0gQHBkZmRpckAKLXByZWZpeCA9IEBwcmVmaXhACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1wc2RpciA9IEBwc2RpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACi10b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotSU5DTFVERVMgPSBcCi0JLURQQUNLQUdFX0xPQ0FMRV9ESVI9XCIiJChwcmVmaXgpLyQoREFUQURJUk5BTUUpL2xvY2FsZSJcIiBcCi0JLURQQUNLQUdFX1NSQ19ESVI9XCIiJChzcmNkaXIpIlwiIFwKLQktRFBBQ0tBR0VfREFUQV9ESVI9XCIiJChkYXRhZGlyKSJcIiAKLQotQU1fQ0ZMQUdTID0gXAotCSAtV2FsbFwKLQkgLWcKLQotZDRub3JtX1NPVVJDRVMgPSBcCi0JZDRub3JtLmN4eAotCi1kNG5vcm1fTERBREQgPSBcCi0JLWxnaXphIFwKLQktbHB0aHJlYWQKLQotZDRub3JtX0xERkxBR1MgPSBcCi0JLUwuCi0KLWQ0bm9ybV9ERVBFTkRFTkNJRVMgPSBcCi0JbGliZ2l6YS5hCi0KLWQ0bm9ybV9DWFhGTEFHUyA9IFwKLQktTVQgXAotCS1NRCBcCi0JLU1QIFwKLQktTUYgXAotCS1PNgotCi1kNG5vcm1fQ1BQRkxBR1MgPSBcCi0JLUROREVCVUcgXAotCS1EV09SRElOREVYX1dJVEhfNF9CWVRFIFwKLQktREJJTkFSWV9TRUFSQ0hfRk9SX1RUQUJMRSBcCi0JLURERUJVRwotCi1obW1ub3JtX1NPVVJDRVMgPSBcCi0JaG1tbm9ybS5jeHgKLQotaG1tbm9ybV9MREFERCA9IFwKLQktbGdpemEgXAotCS1scHRocmVhZAotCi1obW1ub3JtX0xERkxBR1MgPSBcCi0JLUwuCi0KLWhtbW5vcm1fREVQRU5ERU5DSUVTID0gXAotCWxpYmdpemEuYQotCi1obW1ub3JtX0NYWEZMQUdTID0gXAotCS1NVCBcCi0JLU1EIFwKLQktTVAgXAotCS1NRiBcCi0JLU82Ci0KLWhtbW5vcm1fQ1BQRkxBR1MgPSBcCi0JLUROREVCVUcgXAotCS1EV09SRElOREVYX1dJVEhfNF9CWVRFIFwKLQktREJJTkFSWV9TRUFSQ0hfRk9SX1RUQUJMRSBcCi0JLURERUJVRwotCi1zeW1hbF9TT1VSQ0VTID0gXAotCWNtZC5jICBcCi0JY21kLmggIFwKLQlzeW1hbC5jcHAKLQotcGxhaW4yc250X1NPVVJDRVMgPSBcCi0JcGxhaW4yc250LmNwcAotCi1zbnQycGxhaW5fU09VUkNFUyA9IFwKLQlzbnQycGxhaW4uY3BwCi0KLXNudDJjb29jX1NPVVJDRVMgPSBcCi0Jc250MmNvb2MuY3BwCi0KLXNudDJjb29jX0NQUEZMQUdTID0gXAotCS1ETkRFQlVHIFwKLQktRFdPUkRJTkRFWF9XSVRIXzRfQllURSBcCi0JLURCSU5BUllfU0VBUkNIX0ZPUl9UVEFCTEUgXAotCS1EREVCVUcKLQotbWdpemFfU09VUkNFUyA9IFwKLQltYWluLmNwcAotCi1tZ2l6YV9ERVBFTkRFTkNJRVMgPSBcCi0JbGliZ2l6YS5hCi0KLW1naXphX0NYWEZMQUdTID0gXAotCS1NVCBcCi0JLU1EIFwKLQktTVAgXAotCS1NRiBcCi0JLU82Ci0KLW1naXphX0NQUEZMQUdTID0gXAotCS1ETkRFQlVHIFwKLQktRFdPUkRJTkRFWF9XSVRIXzRfQllURSBcCi0JLURCSU5BUllfU0VBUkNIX0ZPUl9UVEFCTEUgXAotCS1EREVCVUcKLQotbWdpemFfTERGTEFHUyA9IFwKLQktTC4KLQotbWdpemFfTERBREQgPSBcCi0JLWxnaXphIFwKLQktbHB0aHJlYWQKLQotbGliX0xJQlJBUklFUyA9IFwKLQlsaWJnaXphLmEKLQotbGliZ2l6YV9hX1NPVVJDRVMgPSBcCi0JYWxpZ25tZW50LmNwcFwKLQlhbGlnbm1lbnQuaCBcCi0JQWxpZ25UYWJsZXMuY3BwIFwKLQlBbGlnblRhYmxlcy5oIFwKLQlBcnJheS5oIFwKLQlBcnJheTIuaCBcCi0JQXJyYXk0LmggXAotCUFUYWJsZXMuY3BwIFwKLQlBVGFibGVzLmggXAotCWNvbGxDb3VudHMuY3BwIFwKLQljb2xsQ291bnRzLmggXAotCWNvbW1vbi5oIFwKLQlENFRhYmxlcy5oIFwKLQlENVRhYmxlcy5oIFwKLQlkZWZzLmggXAotCURpY3Rpb25hcnkuY3BwIFwKLQlEaWN0aW9uYXJ5LmggXAotCWZpbGVfc3BlYy5oIFwKLQlGbGV4QXJyYXkuaCBcCi0JRm9yd2FyZEJhY2t3YXJkLmNwcCBcCi0JRm9yd2FyZEJhY2t3YXJkLmggXAotCWdldFNlbnRlbmNlLmNwcCBcCi0JZ2V0U2VudGVuY2UuaCBcCi0JR2xvYmFscy5oIFwKLQlobW0uY3BwIFwKLQlobW0uaCBcCi0JSE1NVGFibGVzLmNwcCBcCi0JSE1NVGFibGVzLmggXAotCWxvZ3Byb2IuY3BwIFwKLQlsb2dwcm9iLmggXAotCW1vZGVsMS5jcHAgXAotCW1vZGVsMS5oIFwKLQltb2RlbDIuY3BwIFwKLQltb2RlbDIuaCBcCi0JbW9kZWwydG8zLmNwcCBcCi0JbW9kZWwzLmNwcCBcCi0JbW9kZWwzLmggXAotCW1vZGVsM192aXRlcmJpLmNwcCBcCi0JbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwIFwKLQltb2RlbDM0NS1wZWcuY3BwIFwKLQlNb3ZlU3dhcE1hdHJpeC5jcHAgXAotCU1vdmVTd2FwTWF0cml4LmggXAotCW15YXNzZXJ0LmNwcCBcCi0JbXlhc3NlcnQuaCBcCi0JbXltYXRoLmggXAotCW15c3RsLmggXAotCU5UYWJsZXMuY3BwIFwKLQlOVGFibGVzLmggXAotCVBhcmFtZXRlci5jcHAgXAotCVBhcmFtZXRlci5oIFwKLQlwYXJzZS5jcHAgXAotCVBlcnBsZXhpdHkuY3BwIFwKLQlQZXJwbGV4aXR5LmggXAotCVBvaW50ZXIuaCBcCi0JcmVwb3J0cy5jcHAgXAotCVNldEFycmF5LmNwcCBcCi0JU2V0QXJyYXkuaCBcCi0Jc3luY09iai5oIFwKLQl0cmFuc3BhaXJfbW9kZWwxLmggXAotCXRyYW5zcGFpcl9tb2RlbDIuaCBcCi0JdHJhbnNwYWlyX21vZGVsMy5jcHAgXAotCXRyYW5zcGFpcl9tb2RlbDMuaCBcCi0JdHJhbnNwYWlyX21vZGVsNC5jcHAgXAotCXRyYW5zcGFpcl9tb2RlbDQuaCBcCi0JdHJhbnNwYWlyX21vZGVsNS5jcHAgXAotCXRyYW5zcGFpcl9tb2RlbDUuaCBcCi0JdHJhbnNwYWlyX21vZGVsaG1tLmggXAotCXR0YWJsZURpZmYuaHBwIFwKLQlUVGFibGVzLmNwcCBcCi0JVFRhYmxlcy5oIFwKLQl0eXBlcy5oIFwKLQl1dGlsaXR5LmNwcCBcCi0JdXRpbGl0eS5oIFwKLQlWZWN0b3IuaCBcCi0Jdm9jYWIuY3BwIFwKLQl2b2NhYi5oIFwKLQlXb3JkQ2xhc3Nlcy5oCi0KLWxpYmdpemFfYV9DWFhGTEFHUyA9IFwKLQktTUQgXAotCS1NUCBcCi0JLU1GIFwKLQktTVQgXAotCS1PNgotCi1saWJnaXphX2FfQ1BQRkxBR1MgPSBcCi0JLUROREVCVUcgXAotCS1EV09SRElOREVYX1dJVEhfNF9CWVRFIFwKLQktREJJTkFSWV9TRUFSQ0hfRk9SX1RUQUJMRSBcCi0JLURERUJVRwotCi1TVUJESVJTID0gXAotCW1rY2xzCi0KLWFsbDogYWxsLXJlY3Vyc2l2ZQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5jcHAgLmN4eCAubyAub2JqCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAotCQkmJiBleGl0IDA7IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICBzcmMvTWFrZWZpbGUnOyBcCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWdudSAgc3JjL01ha2VmaWxlCi0uUFJFQ0lPVVM6IE1ha2VmaWxlCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQGNhc2UgJyQ/JyBpbiBcCi0JICAqY29uZmlnLnN0YXR1cyopIFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAotCSAgKikgXAotCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCi0JZXNhYzsKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi1pbnN0YWxsLWxpYkxJQlJBUklFUzogJChsaWJfTElCUkFSSUVTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCXRlc3QgLXogIiQobGliZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobGliZGlyKSIKLQlAbGlzdD0nJChsaWJfTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBmPSQoYW1fX3N0cmlwX2RpcikgXAotCSAgICBlY2hvICIgJChsaWJMSUJSQVJJRVNfSU5TVEFMTCkgJyQkcCcgJyQoREVTVERJUikkKGxpYmRpcikvJCRmJyI7IFwKLQkgICAgJChsaWJMSUJSQVJJRVNfSU5TVEFMTCkgIiQkcCIgIiQoREVTVERJUikkKGxpYmRpcikvJCRmIjsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGxpc3Q9JyQobGliX0xJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgcD0kKGFtX19zdHJpcF9kaXIpIFwKLQkgICAgZWNobyAiICQoUkFOTElCKSAnJChERVNURElSKSQobGliZGlyKS8kJHAnIjsgXAotCSAgICAkKFJBTkxJQikgIiQoREVTVERJUikkKGxpYmRpcikvJCRwIjsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotdW5pbnN0YWxsLWxpYkxJQlJBUklFUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKGxpYl9MSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBwPSQoYW1fX3N0cmlwX2RpcikgXAotCSAgZWNobyAiIHJtIC1mICckKERFU1RESVIpJChsaWJkaXIpLyQkcCciOyBcCi0JICBybSAtZiAiJChERVNURElSKSQobGliZGlyKS8kJHAiOyBcCi0JZG9uZQotCi1jbGVhbi1saWJMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobGliX0xJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xJQlJBUklFUykKLWxpYmdpemEuYTogJChsaWJnaXphX2FfT0JKRUNUUykgJChsaWJnaXphX2FfREVQRU5ERU5DSUVTKSAKLQktcm0gLWYgbGliZ2l6YS5hCi0JJChsaWJnaXphX2FfQVIpIGxpYmdpemEuYSAkKGxpYmdpemFfYV9PQkpFQ1RTKSAkKGxpYmdpemFfYV9MSUJBREQpCi0JJChSQU5MSUIpIGxpYmdpemEuYQotaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JdGVzdCAteiAiJChiaW5kaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChiaW5kaXIpIgotCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIHAxPWBlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCi0JICBpZiB0ZXN0IC1mICQkcCBcCi0JICA7IHRoZW4gXAotCSAgICBmPWBlY2hvICIkJHAxIiB8IHNlZCAncyxeLiovLCw7JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICAgZWNobyAiICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChiaW5QUk9HUkFNU19JTlNUQUxMKSAnJCRwJyAnJChERVNURElSKSQoYmluZGlyKS8kJGYnIjsgXAotCSAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChiaW5QUk9HUkFNU19JTlNUQUxMKSAiJCRwIiAiJChERVNURElSKSQoYmluZGlyKS8kJGYiIHx8IGV4aXQgMTsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotdW5pbnN0YWxsLWJpblBST0dSQU1TOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgZj1gZWNobyAiJCRwIiB8IHNlZCAncyxeLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWNobyAiIHJtIC1mICckKERFU1RESVIpJChiaW5kaXIpLyQkZiciOyBcCi0JICBybSAtZiAiJChERVNURElSKSQoYmluZGlyKS8kJGYiOyBcCi0JZG9uZQotCi1jbGVhbi1iaW5QUk9HUkFNUzoKLQktdGVzdCAteiAiJChiaW5fUFJPR1JBTVMpIiB8fCBybSAtZiAkKGJpbl9QUk9HUkFNUykKLWQ0bm9ybSQoRVhFRVhUKTogJChkNG5vcm1fT0JKRUNUUykgJChkNG5vcm1fREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgZDRub3JtJChFWEVFWFQpCi0JJChkNG5vcm1fTElOSykgJChkNG5vcm1fT0JKRUNUUykgJChkNG5vcm1fTERBREQpICQoTElCUykKLWhtbW5vcm0kKEVYRUVYVCk6ICQoaG1tbm9ybV9PQkpFQ1RTKSAkKGhtbW5vcm1fREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgaG1tbm9ybSQoRVhFRVhUKQotCSQoaG1tbm9ybV9MSU5LKSAkKGhtbW5vcm1fT0JKRUNUUykgJChobW1ub3JtX0xEQUREKSAkKExJQlMpCi1tZ2l6YSQoRVhFRVhUKTogJChtZ2l6YV9PQkpFQ1RTKSAkKG1naXphX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIG1naXphJChFWEVFWFQpCi0JJChtZ2l6YV9MSU5LKSAkKG1naXphX09CSkVDVFMpICQobWdpemFfTERBREQpICQoTElCUykKLXBsYWluMnNudCQoRVhFRVhUKTogJChwbGFpbjJzbnRfT0JKRUNUUykgJChwbGFpbjJzbnRfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgcGxhaW4yc250JChFWEVFWFQpCi0JJChDWFhMSU5LKSAkKHBsYWluMnNudF9PQkpFQ1RTKSAkKHBsYWluMnNudF9MREFERCkgJChMSUJTKQotc250MmNvb2MkKEVYRUVYVCk6ICQoc250MmNvb2NfT0JKRUNUUykgJChzbnQyY29vY19ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBzbnQyY29vYyQoRVhFRVhUKQotCSQoQ1hYTElOSykgJChzbnQyY29vY19PQkpFQ1RTKSAkKHNudDJjb29jX0xEQUREKSAkKExJQlMpCi1zbnQycGxhaW4kKEVYRUVYVCk6ICQoc250MnBsYWluX09CSkVDVFMpICQoc250MnBsYWluX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHNudDJwbGFpbiQoRVhFRVhUKQotCSQoQ1hYTElOSykgJChzbnQycGxhaW5fT0JKRUNUUykgJChzbnQycGxhaW5fTERBREQpICQoTElCUykKLXN5bWFsJChFWEVFWFQpOiAkKHN5bWFsX09CSkVDVFMpICQoc3ltYWxfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgc3ltYWwkKEVYRUVYVCkKLQkkKENYWExJTkspICQoc3ltYWxfT0JKRUNUUykgJChzeW1hbF9MREFERCkgJChMSUJTKQotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLiQoT0JKRVhUKQotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY21kLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kNG5vcm0tZDRub3JtLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9obW1ub3JtLWhtbW5vcm0uUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS1BVGFibGVzLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnaXphX2EtQWxpZ25UYWJsZXMuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS1EaWN0aW9uYXJ5LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnaXphX2EtRm9yd2FyZEJhY2t3YXJkLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnaXphX2EtSE1NVGFibGVzLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnaXphX2EtTW92ZVN3YXBNYXRyaXguUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS1OVGFibGVzLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnaXphX2EtUGFyYW1ldGVyLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnaXphX2EtUGVycGxleGl0eS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2l6YV9hLVNldEFycmF5LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnaXphX2EtVFRhYmxlcy5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2l6YV9hLWFsaWdubWVudC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2l6YV9hLWNvbGxDb3VudHMuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS1nZXRTZW50ZW5jZS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2l6YV9hLWhtbS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2l6YV9hLWxvZ3Byb2IuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDEuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDIuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDJ0bzMuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDMuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDM0NS1wZWcuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDNfdml0ZXJiaS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnaXphX2EtbXlhc3NlcnQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS1wYXJzZS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2l6YV9hLXJlcG9ydHMuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS10cmFuc3BhaXJfbW9kZWwzLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDUuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdpemFfYS11dGlsaXR5LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnaXphX2Etdm9jYWIuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21naXphLW1haW4uUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3BsYWluMnNudC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc250MmNvb2Mtc250MmNvb2MuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3NudDJwbGFpbi5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3ltYWwuUG9AYW1fX3F1b3RlQAotCi0uYy5vOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8Ci0KLS5jLm9iajoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKLQotLmNwcC5vOgotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWENPTVBJTEUpIC1jIC1vICRAICQ8Ci0KLS5jcHAub2JqOgotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYQ09NUElMRSkgLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi1saWJnaXphX2EtYWxpZ25tZW50Lm86IGFsaWdubWVudC5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1hbGlnbm1lbnQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLWFsaWdubWVudC5UcG8gLWMgLW8gbGliZ2l6YV9hLWFsaWdubWVudC5vIGB0ZXN0IC1mICdhbGlnbm1lbnQuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BhbGlnbm1lbnQuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS1hbGlnbm1lbnQuVHBvICQoREVQRElSKS9saWJnaXphX2EtYWxpZ25tZW50LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nYWxpZ25tZW50LmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtYWxpZ25tZW50Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtYWxpZ25tZW50Lm8gYHRlc3QgLWYgJ2FsaWdubWVudC5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGFsaWdubWVudC5jcHAKLQotbGliZ2l6YV9hLWFsaWdubWVudC5vYmo6IGFsaWdubWVudC5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1hbGlnbm1lbnQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtYWxpZ25tZW50LlRwbyAtYyAtbyBsaWJnaXphX2EtYWxpZ25tZW50Lm9iaiBgaWYgdGVzdCAtZiAnYWxpZ25tZW50LmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdhbGlnbm1lbnQuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9hbGlnbm1lbnQuY3BwJzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS1hbGlnbm1lbnQuVHBvICQoREVQRElSKS9saWJnaXphX2EtYWxpZ25tZW50LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nYWxpZ25tZW50LmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtYWxpZ25tZW50Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1hbGlnbm1lbnQub2JqIGBpZiB0ZXN0IC1mICdhbGlnbm1lbnQuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ2FsaWdubWVudC5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FsaWdubWVudC5jcHAnOyBmaWAKLQotbGliZ2l6YV9hLUFsaWduVGFibGVzLm86IEFsaWduVGFibGVzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLUFsaWduVGFibGVzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1BbGlnblRhYmxlcy5UcG8gLWMgLW8gbGliZ2l6YV9hLUFsaWduVGFibGVzLm8gYHRlc3QgLWYgJ0FsaWduVGFibGVzLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgQWxpZ25UYWJsZXMuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS1BbGlnblRhYmxlcy5UcG8gJChERVBESVIpL2xpYmdpemFfYS1BbGlnblRhYmxlcy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J0FsaWduVGFibGVzLmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtQWxpZ25UYWJsZXMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1BbGlnblRhYmxlcy5vIGB0ZXN0IC1mICdBbGlnblRhYmxlcy5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYEFsaWduVGFibGVzLmNwcAotCi1saWJnaXphX2EtQWxpZ25UYWJsZXMub2JqOiBBbGlnblRhYmxlcy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1BbGlnblRhYmxlcy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1BbGlnblRhYmxlcy5UcG8gLWMgLW8gbGliZ2l6YV9hLUFsaWduVGFibGVzLm9iaiBgaWYgdGVzdCAtZiAnQWxpZ25UYWJsZXMuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ0FsaWduVGFibGVzLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvQWxpZ25UYWJsZXMuY3BwJzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS1BbGlnblRhYmxlcy5UcG8gJChERVBESVIpL2xpYmdpemFfYS1BbGlnblRhYmxlcy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J0FsaWduVGFibGVzLmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtQWxpZ25UYWJsZXMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLUFsaWduVGFibGVzLm9iaiBgaWYgdGVzdCAtZiAnQWxpZ25UYWJsZXMuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ0FsaWduVGFibGVzLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvQWxpZ25UYWJsZXMuY3BwJzsgZmlgCi0KLWxpYmdpemFfYS1BVGFibGVzLm86IEFUYWJsZXMuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtQVRhYmxlcy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtQVRhYmxlcy5UcG8gLWMgLW8gbGliZ2l6YV9hLUFUYWJsZXMubyBgdGVzdCAtZiAnQVRhYmxlcy5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYEFUYWJsZXMuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS1BVGFibGVzLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLUFUYWJsZXMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdBVGFibGVzLmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtQVRhYmxlcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLUFUYWJsZXMubyBgdGVzdCAtZiAnQVRhYmxlcy5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYEFUYWJsZXMuY3BwCi0KLWxpYmdpemFfYS1BVGFibGVzLm9iajogQVRhYmxlcy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1BVGFibGVzLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLUFUYWJsZXMuVHBvIC1jIC1vIGxpYmdpemFfYS1BVGFibGVzLm9iaiBgaWYgdGVzdCAtZiAnQVRhYmxlcy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnQVRhYmxlcy5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL0FUYWJsZXMuY3BwJzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS1BVGFibGVzLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLUFUYWJsZXMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdBVGFibGVzLmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtQVRhYmxlcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtQVRhYmxlcy5vYmogYGlmIHRlc3QgLWYgJ0FUYWJsZXMuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ0FUYWJsZXMuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9BVGFibGVzLmNwcCc7IGZpYAotCi1saWJnaXphX2EtY29sbENvdW50cy5vOiBjb2xsQ291bnRzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLWNvbGxDb3VudHMubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLWNvbGxDb3VudHMuVHBvIC1jIC1vIGxpYmdpemFfYS1jb2xsQ291bnRzLm8gYHRlc3QgLWYgJ2NvbGxDb3VudHMuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb2xsQ291bnRzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtY29sbENvdW50cy5UcG8gJChERVBESVIpL2xpYmdpemFfYS1jb2xsQ291bnRzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nY29sbENvdW50cy5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLWNvbGxDb3VudHMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1jb2xsQ291bnRzLm8gYHRlc3QgLWYgJ2NvbGxDb3VudHMuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb2xsQ291bnRzLmNwcAotCi1saWJnaXphX2EtY29sbENvdW50cy5vYmo6IGNvbGxDb3VudHMuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtY29sbENvdW50cy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1jb2xsQ291bnRzLlRwbyAtYyAtbyBsaWJnaXphX2EtY29sbENvdW50cy5vYmogYGlmIHRlc3QgLWYgJ2NvbGxDb3VudHMuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbGxDb3VudHMuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb2xsQ291bnRzLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtY29sbENvdW50cy5UcG8gJChERVBESVIpL2xpYmdpemFfYS1jb2xsQ291bnRzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nY29sbENvdW50cy5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLWNvbGxDb3VudHMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLWNvbGxDb3VudHMub2JqIGBpZiB0ZXN0IC1mICdjb2xsQ291bnRzLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdjb2xsQ291bnRzLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29sbENvdW50cy5jcHAnOyBmaWAKLQotbGliZ2l6YV9hLURpY3Rpb25hcnkubzogRGljdGlvbmFyeS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1EaWN0aW9uYXJ5Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1EaWN0aW9uYXJ5LlRwbyAtYyAtbyBsaWJnaXphX2EtRGljdGlvbmFyeS5vIGB0ZXN0IC1mICdEaWN0aW9uYXJ5LmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgRGljdGlvbmFyeS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLURpY3Rpb25hcnkuVHBvICQoREVQRElSKS9saWJnaXphX2EtRGljdGlvbmFyeS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J0RpY3Rpb25hcnkuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1EaWN0aW9uYXJ5Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtRGljdGlvbmFyeS5vIGB0ZXN0IC1mICdEaWN0aW9uYXJ5LmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgRGljdGlvbmFyeS5jcHAKLQotbGliZ2l6YV9hLURpY3Rpb25hcnkub2JqOiBEaWN0aW9uYXJ5LmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLURpY3Rpb25hcnkub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtRGljdGlvbmFyeS5UcG8gLWMgLW8gbGliZ2l6YV9hLURpY3Rpb25hcnkub2JqIGBpZiB0ZXN0IC1mICdEaWN0aW9uYXJ5LmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdEaWN0aW9uYXJ5LmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvRGljdGlvbmFyeS5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLURpY3Rpb25hcnkuVHBvICQoREVQRElSKS9saWJnaXphX2EtRGljdGlvbmFyeS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J0RpY3Rpb25hcnkuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1EaWN0aW9uYXJ5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1EaWN0aW9uYXJ5Lm9iaiBgaWYgdGVzdCAtZiAnRGljdGlvbmFyeS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnRGljdGlvbmFyeS5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL0RpY3Rpb25hcnkuY3BwJzsgZmlgCi0KLWxpYmdpemFfYS1Gb3J3YXJkQmFja3dhcmQubzogRm9yd2FyZEJhY2t3YXJkLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLUZvcndhcmRCYWNrd2FyZC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtRm9yd2FyZEJhY2t3YXJkLlRwbyAtYyAtbyBsaWJnaXphX2EtRm9yd2FyZEJhY2t3YXJkLm8gYHRlc3QgLWYgJ0ZvcndhcmRCYWNrd2FyZC5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYEZvcndhcmRCYWNrd2FyZC5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLUZvcndhcmRCYWNrd2FyZC5UcG8gJChERVBESVIpL2xpYmdpemFfYS1Gb3J3YXJkQmFja3dhcmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdGb3J3YXJkQmFja3dhcmQuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1Gb3J3YXJkQmFja3dhcmQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1Gb3J3YXJkQmFja3dhcmQubyBgdGVzdCAtZiAnRm9yd2FyZEJhY2t3YXJkLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgRm9yd2FyZEJhY2t3YXJkLmNwcAotCi1saWJnaXphX2EtRm9yd2FyZEJhY2t3YXJkLm9iajogRm9yd2FyZEJhY2t3YXJkLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLUZvcndhcmRCYWNrd2FyZC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1Gb3J3YXJkQmFja3dhcmQuVHBvIC1jIC1vIGxpYmdpemFfYS1Gb3J3YXJkQmFja3dhcmQub2JqIGBpZiB0ZXN0IC1mICdGb3J3YXJkQmFja3dhcmQuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ0ZvcndhcmRCYWNrd2FyZC5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL0ZvcndhcmRCYWNrd2FyZC5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLUZvcndhcmRCYWNrd2FyZC5UcG8gJChERVBESVIpL2xpYmdpemFfYS1Gb3J3YXJkQmFja3dhcmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdGb3J3YXJkQmFja3dhcmQuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1Gb3J3YXJkQmFja3dhcmQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLUZvcndhcmRCYWNrd2FyZC5vYmogYGlmIHRlc3QgLWYgJ0ZvcndhcmRCYWNrd2FyZC5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnRm9yd2FyZEJhY2t3YXJkLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvRm9yd2FyZEJhY2t3YXJkLmNwcCc7IGZpYAotCi1saWJnaXphX2EtZ2V0U2VudGVuY2UubzogZ2V0U2VudGVuY2UuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtZ2V0U2VudGVuY2UubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLWdldFNlbnRlbmNlLlRwbyAtYyAtbyBsaWJnaXphX2EtZ2V0U2VudGVuY2UubyBgdGVzdCAtZiAnZ2V0U2VudGVuY2UuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BnZXRTZW50ZW5jZS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLWdldFNlbnRlbmNlLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLWdldFNlbnRlbmNlLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ2V0U2VudGVuY2UuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1nZXRTZW50ZW5jZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLWdldFNlbnRlbmNlLm8gYHRlc3QgLWYgJ2dldFNlbnRlbmNlLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgZ2V0U2VudGVuY2UuY3BwCi0KLWxpYmdpemFfYS1nZXRTZW50ZW5jZS5vYmo6IGdldFNlbnRlbmNlLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLWdldFNlbnRlbmNlLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLWdldFNlbnRlbmNlLlRwbyAtYyAtbyBsaWJnaXphX2EtZ2V0U2VudGVuY2Uub2JqIGBpZiB0ZXN0IC1mICdnZXRTZW50ZW5jZS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ2V0U2VudGVuY2UuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nZXRTZW50ZW5jZS5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLWdldFNlbnRlbmNlLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLWdldFNlbnRlbmNlLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ2V0U2VudGVuY2UuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1nZXRTZW50ZW5jZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtZ2V0U2VudGVuY2Uub2JqIGBpZiB0ZXN0IC1mICdnZXRTZW50ZW5jZS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ2V0U2VudGVuY2UuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nZXRTZW50ZW5jZS5jcHAnOyBmaWAKLQotbGliZ2l6YV9hLWhtbS5vOiBobW0uY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtaG1tLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1obW0uVHBvIC1jIC1vIGxpYmdpemFfYS1obW0ubyBgdGVzdCAtZiAnaG1tLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgaG1tLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtaG1tLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLWhtbS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2htbS5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLWhtbS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLWhtbS5vIGB0ZXN0IC1mICdobW0uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BobW0uY3BwCi0KLWxpYmdpemFfYS1obW0ub2JqOiBobW0uY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtaG1tLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLWhtbS5UcG8gLWMgLW8gbGliZ2l6YV9hLWhtbS5vYmogYGlmIHRlc3QgLWYgJ2htbS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaG1tLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvaG1tLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtaG1tLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLWhtbS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2htbS5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLWhtbS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtaG1tLm9iaiBgaWYgdGVzdCAtZiAnaG1tLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdobW0uY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9obW0uY3BwJzsgZmlgCi0KLWxpYmdpemFfYS1ITU1UYWJsZXMubzogSE1NVGFibGVzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLUhNTVRhYmxlcy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtSE1NVGFibGVzLlRwbyAtYyAtbyBsaWJnaXphX2EtSE1NVGFibGVzLm8gYHRlc3QgLWYgJ0hNTVRhYmxlcy5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYEhNTVRhYmxlcy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLUhNTVRhYmxlcy5UcG8gJChERVBESVIpL2xpYmdpemFfYS1ITU1UYWJsZXMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdITU1UYWJsZXMuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1ITU1UYWJsZXMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1ITU1UYWJsZXMubyBgdGVzdCAtZiAnSE1NVGFibGVzLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgSE1NVGFibGVzLmNwcAotCi1saWJnaXphX2EtSE1NVGFibGVzLm9iajogSE1NVGFibGVzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLUhNTVRhYmxlcy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1ITU1UYWJsZXMuVHBvIC1jIC1vIGxpYmdpemFfYS1ITU1UYWJsZXMub2JqIGBpZiB0ZXN0IC1mICdITU1UYWJsZXMuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ0hNTVRhYmxlcy5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL0hNTVRhYmxlcy5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLUhNTVRhYmxlcy5UcG8gJChERVBESVIpL2xpYmdpemFfYS1ITU1UYWJsZXMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdITU1UYWJsZXMuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1ITU1UYWJsZXMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLUhNTVRhYmxlcy5vYmogYGlmIHRlc3QgLWYgJ0hNTVRhYmxlcy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnSE1NVGFibGVzLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvSE1NVGFibGVzLmNwcCc7IGZpYAotCi1saWJnaXphX2EtbG9ncHJvYi5vOiBsb2dwcm9iLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLWxvZ3Byb2IubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLWxvZ3Byb2IuVHBvIC1jIC1vIGxpYmdpemFfYS1sb2dwcm9iLm8gYHRlc3QgLWYgJ2xvZ3Byb2IuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bsb2dwcm9iLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtbG9ncHJvYi5UcG8gJChERVBESVIpL2xpYmdpemFfYS1sb2dwcm9iLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nbG9ncHJvYi5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLWxvZ3Byb2IubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1sb2dwcm9iLm8gYHRlc3QgLWYgJ2xvZ3Byb2IuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bsb2dwcm9iLmNwcAotCi1saWJnaXphX2EtbG9ncHJvYi5vYmo6IGxvZ3Byb2IuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtbG9ncHJvYi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1sb2dwcm9iLlRwbyAtYyAtbyBsaWJnaXphX2EtbG9ncHJvYi5vYmogYGlmIHRlc3QgLWYgJ2xvZ3Byb2IuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ2xvZ3Byb2IuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9sb2dwcm9iLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtbG9ncHJvYi5UcG8gJChERVBESVIpL2xpYmdpemFfYS1sb2dwcm9iLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nbG9ncHJvYi5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLWxvZ3Byb2Iub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLWxvZ3Byb2Iub2JqIGBpZiB0ZXN0IC1mICdsb2dwcm9iLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdsb2dwcm9iLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbG9ncHJvYi5jcHAnOyBmaWAKLQotbGliZ2l6YV9hLW1vZGVsMS5vOiBtb2RlbDEuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtbW9kZWwxLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDEuVHBvIC1jIC1vIGxpYmdpemFfYS1tb2RlbDEubyBgdGVzdCAtZiAnbW9kZWwxLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgbW9kZWwxLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwxLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J21vZGVsMS5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLW1vZGVsMS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLW1vZGVsMS5vIGB0ZXN0IC1mICdtb2RlbDEuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2Btb2RlbDEuY3BwCi0KLWxpYmdpemFfYS1tb2RlbDEub2JqOiBtb2RlbDEuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtbW9kZWwxLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMS5UcG8gLWMgLW8gbGliZ2l6YV9hLW1vZGVsMS5vYmogYGlmIHRlc3QgLWYgJ21vZGVsMS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbW9kZWwxLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbW9kZWwxLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwxLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J21vZGVsMS5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLW1vZGVsMS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtbW9kZWwxLm9iaiBgaWYgdGVzdCAtZiAnbW9kZWwxLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdtb2RlbDEuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tb2RlbDEuY3BwJzsgZmlgCi0KLWxpYmdpemFfYS1tb2RlbDIubzogbW9kZWwyLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLW1vZGVsMi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwyLlRwbyAtYyAtbyBsaWJnaXphX2EtbW9kZWwyLm8gYHRlc3QgLWYgJ21vZGVsMi5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1vZGVsMi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMi5UcG8gJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdtb2RlbDIuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1tb2RlbDIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1tb2RlbDIubyBgdGVzdCAtZiAnbW9kZWwyLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgbW9kZWwyLmNwcAotCi1saWJnaXphX2EtbW9kZWwyLm9iajogbW9kZWwyLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLW1vZGVsMi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDIuVHBvIC1jIC1vIGxpYmdpemFfYS1tb2RlbDIub2JqIGBpZiB0ZXN0IC1mICdtb2RlbDIuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ21vZGVsMi5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21vZGVsMi5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMi5UcG8gJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdtb2RlbDIuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1tb2RlbDIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLW1vZGVsMi5vYmogYGlmIHRlc3QgLWYgJ21vZGVsMi5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbW9kZWwyLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbW9kZWwyLmNwcCc7IGZpYAotCi1saWJnaXphX2EtbW9kZWwydG8zLm86IG1vZGVsMnRvMy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1tb2RlbDJ0bzMubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMnRvMy5UcG8gLWMgLW8gbGliZ2l6YV9hLW1vZGVsMnRvMy5vIGB0ZXN0IC1mICdtb2RlbDJ0bzMuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2Btb2RlbDJ0bzMuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDJ0bzMuVHBvICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwydG8zLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nbW9kZWwydG8zLmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtbW9kZWwydG8zLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtbW9kZWwydG8zLm8gYHRlc3QgLWYgJ21vZGVsMnRvMy5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1vZGVsMnRvMy5jcHAKLQotbGliZ2l6YV9hLW1vZGVsMnRvMy5vYmo6IG1vZGVsMnRvMy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1tb2RlbDJ0bzMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwydG8zLlRwbyAtYyAtbyBsaWJnaXphX2EtbW9kZWwydG8zLm9iaiBgaWYgdGVzdCAtZiAnbW9kZWwydG8zLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdtb2RlbDJ0bzMuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tb2RlbDJ0bzMuY3BwJzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDJ0bzMuVHBvICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwydG8zLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nbW9kZWwydG8zLmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtbW9kZWwydG8zLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1tb2RlbDJ0bzMub2JqIGBpZiB0ZXN0IC1mICdtb2RlbDJ0bzMuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ21vZGVsMnRvMy5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21vZGVsMnRvMy5jcHAnOyBmaWAKLQotbGliZ2l6YV9hLW1vZGVsMy5vOiBtb2RlbDMuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtbW9kZWwzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDMuVHBvIC1jIC1vIGxpYmdpemFfYS1tb2RlbDMubyBgdGVzdCAtZiAnbW9kZWwzLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgbW9kZWwzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwzLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J21vZGVsMy5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLW1vZGVsMy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLW1vZGVsMy5vIGB0ZXN0IC1mICdtb2RlbDMuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2Btb2RlbDMuY3BwCi0KLWxpYmdpemFfYS1tb2RlbDMub2JqOiBtb2RlbDMuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtbW9kZWwzLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMy5UcG8gLWMgLW8gbGliZ2l6YV9hLW1vZGVsMy5vYmogYGlmIHRlc3QgLWYgJ21vZGVsMy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbW9kZWwzLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbW9kZWwzLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwzLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J21vZGVsMy5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLW1vZGVsMy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtbW9kZWwzLm9iaiBgaWYgdGVzdCAtZiAnbW9kZWwzLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdtb2RlbDMuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tb2RlbDMuY3BwJzsgZmlgCi0KLWxpYmdpemFfYS1tb2RlbDNfdml0ZXJiaS5vOiBtb2RlbDNfdml0ZXJiaS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1tb2RlbDNfdml0ZXJiaS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwzX3ZpdGVyYmkuVHBvIC1jIC1vIGxpYmdpemFfYS1tb2RlbDNfdml0ZXJiaS5vIGB0ZXN0IC1mICdtb2RlbDNfdml0ZXJiaS5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1vZGVsM192aXRlcmJpLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwzX3ZpdGVyYmkuVHBvICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwzX3ZpdGVyYmkuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdtb2RlbDNfdml0ZXJiaS5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtbW9kZWwzX3ZpdGVyYmkubyBgdGVzdCAtZiAnbW9kZWwzX3ZpdGVyYmkuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2Btb2RlbDNfdml0ZXJiaS5jcHAKLQotbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpLm9iajogbW9kZWwzX3ZpdGVyYmkuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtbW9kZWwzX3ZpdGVyYmkub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwzX3ZpdGVyYmkuVHBvIC1jIC1vIGxpYmdpemFfYS1tb2RlbDNfdml0ZXJiaS5vYmogYGlmIHRlc3QgLWYgJ21vZGVsM192aXRlcmJpLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdtb2RlbDNfdml0ZXJiaS5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21vZGVsM192aXRlcmJpLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwzX3ZpdGVyYmkuVHBvICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwzX3ZpdGVyYmkuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdtb2RlbDNfdml0ZXJiaS5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1tb2RlbDNfdml0ZXJiaS5vYmogYGlmIHRlc3QgLWYgJ21vZGVsM192aXRlcmJpLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdtb2RlbDNfdml0ZXJiaS5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21vZGVsM192aXRlcmJpLmNwcCc7IGZpYAotCi1saWJnaXphX2EtbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MubzogbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLlRwbyAtYyAtbyBsaWJnaXphX2EtbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MubyBgdGVzdCAtZiAnbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2Btb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1tb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLm8gYHRlc3QgLWYgJ21vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwCi0KLWxpYmdpemFfYS1tb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy5vYmo6IG1vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLlRwbyAtYyAtbyBsaWJnaXphX2EtbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3Mub2JqIGBpZiB0ZXN0IC1mICdtb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1tb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3Mub2JqIGBpZiB0ZXN0IC1mICdtb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy5jcHAnOyBmaWAKLQotbGliZ2l6YV9hLW1vZGVsMzQ1LXBlZy5vOiBtb2RlbDM0NS1wZWcuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtbW9kZWwzNDUtcGVnLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1tb2RlbDM0NS1wZWcuVHBvIC1jIC1vIGxpYmdpemFfYS1tb2RlbDM0NS1wZWcubyBgdGVzdCAtZiAnbW9kZWwzNDUtcGVnLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgbW9kZWwzNDUtcGVnLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwzNDUtcGVnLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMzQ1LXBlZy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J21vZGVsMzQ1LXBlZy5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLW1vZGVsMzQ1LXBlZy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLW1vZGVsMzQ1LXBlZy5vIGB0ZXN0IC1mICdtb2RlbDM0NS1wZWcuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2Btb2RlbDM0NS1wZWcuY3BwCi0KLWxpYmdpemFfYS1tb2RlbDM0NS1wZWcub2JqOiBtb2RlbDM0NS1wZWcuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtbW9kZWwzNDUtcGVnLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMzQ1LXBlZy5UcG8gLWMgLW8gbGliZ2l6YV9hLW1vZGVsMzQ1LXBlZy5vYmogYGlmIHRlc3QgLWYgJ21vZGVsMzQ1LXBlZy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbW9kZWwzNDUtcGVnLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbW9kZWwzNDUtcGVnLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtbW9kZWwzNDUtcGVnLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLW1vZGVsMzQ1LXBlZy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J21vZGVsMzQ1LXBlZy5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLW1vZGVsMzQ1LXBlZy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtbW9kZWwzNDUtcGVnLm9iaiBgaWYgdGVzdCAtZiAnbW9kZWwzNDUtcGVnLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdtb2RlbDM0NS1wZWcuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tb2RlbDM0NS1wZWcuY3BwJzsgZmlgCi0KLWxpYmdpemFfYS1Nb3ZlU3dhcE1hdHJpeC5vOiBNb3ZlU3dhcE1hdHJpeC5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1Nb3ZlU3dhcE1hdHJpeC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtTW92ZVN3YXBNYXRyaXguVHBvIC1jIC1vIGxpYmdpemFfYS1Nb3ZlU3dhcE1hdHJpeC5vIGB0ZXN0IC1mICdNb3ZlU3dhcE1hdHJpeC5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYE1vdmVTd2FwTWF0cml4LmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtTW92ZVN3YXBNYXRyaXguVHBvICQoREVQRElSKS9saWJnaXphX2EtTW92ZVN3YXBNYXRyaXguUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdNb3ZlU3dhcE1hdHJpeC5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLU1vdmVTd2FwTWF0cml4Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtTW92ZVN3YXBNYXRyaXgubyBgdGVzdCAtZiAnTW92ZVN3YXBNYXRyaXguY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BNb3ZlU3dhcE1hdHJpeC5jcHAKLQotbGliZ2l6YV9hLU1vdmVTd2FwTWF0cml4Lm9iajogTW92ZVN3YXBNYXRyaXguY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtTW92ZVN3YXBNYXRyaXgub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtTW92ZVN3YXBNYXRyaXguVHBvIC1jIC1vIGxpYmdpemFfYS1Nb3ZlU3dhcE1hdHJpeC5vYmogYGlmIHRlc3QgLWYgJ01vdmVTd2FwTWF0cml4LmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdNb3ZlU3dhcE1hdHJpeC5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL01vdmVTd2FwTWF0cml4LmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtTW92ZVN3YXBNYXRyaXguVHBvICQoREVQRElSKS9saWJnaXphX2EtTW92ZVN3YXBNYXRyaXguUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdNb3ZlU3dhcE1hdHJpeC5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLU1vdmVTd2FwTWF0cml4Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1Nb3ZlU3dhcE1hdHJpeC5vYmogYGlmIHRlc3QgLWYgJ01vdmVTd2FwTWF0cml4LmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdNb3ZlU3dhcE1hdHJpeC5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL01vdmVTd2FwTWF0cml4LmNwcCc7IGZpYAotCi1saWJnaXphX2EtbXlhc3NlcnQubzogbXlhc3NlcnQuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtbXlhc3NlcnQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLW15YXNzZXJ0LlRwbyAtYyAtbyBsaWJnaXphX2EtbXlhc3NlcnQubyBgdGVzdCAtZiAnbXlhc3NlcnQuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BteWFzc2VydC5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLW15YXNzZXJ0LlRwbyAkKERFUERJUikvbGliZ2l6YV9hLW15YXNzZXJ0LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nbXlhc3NlcnQuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1teWFzc2VydC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLW15YXNzZXJ0Lm8gYHRlc3QgLWYgJ215YXNzZXJ0LmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgbXlhc3NlcnQuY3BwCi0KLWxpYmdpemFfYS1teWFzc2VydC5vYmo6IG15YXNzZXJ0LmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLW15YXNzZXJ0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLW15YXNzZXJ0LlRwbyAtYyAtbyBsaWJnaXphX2EtbXlhc3NlcnQub2JqIGBpZiB0ZXN0IC1mICdteWFzc2VydC5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbXlhc3NlcnQuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9teWFzc2VydC5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLW15YXNzZXJ0LlRwbyAkKERFUERJUikvbGliZ2l6YV9hLW15YXNzZXJ0LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nbXlhc3NlcnQuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1teWFzc2VydC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtbXlhc3NlcnQub2JqIGBpZiB0ZXN0IC1mICdteWFzc2VydC5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbXlhc3NlcnQuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9teWFzc2VydC5jcHAnOyBmaWAKLQotbGliZ2l6YV9hLU5UYWJsZXMubzogTlRhYmxlcy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1OVGFibGVzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1OVGFibGVzLlRwbyAtYyAtbyBsaWJnaXphX2EtTlRhYmxlcy5vIGB0ZXN0IC1mICdOVGFibGVzLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgTlRhYmxlcy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLU5UYWJsZXMuVHBvICQoREVQRElSKS9saWJnaXphX2EtTlRhYmxlcy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J05UYWJsZXMuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1OVGFibGVzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtTlRhYmxlcy5vIGB0ZXN0IC1mICdOVGFibGVzLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgTlRhYmxlcy5jcHAKLQotbGliZ2l6YV9hLU5UYWJsZXMub2JqOiBOVGFibGVzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLU5UYWJsZXMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtTlRhYmxlcy5UcG8gLWMgLW8gbGliZ2l6YV9hLU5UYWJsZXMub2JqIGBpZiB0ZXN0IC1mICdOVGFibGVzLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdOVGFibGVzLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvTlRhYmxlcy5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLU5UYWJsZXMuVHBvICQoREVQRElSKS9saWJnaXphX2EtTlRhYmxlcy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J05UYWJsZXMuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1OVGFibGVzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1OVGFibGVzLm9iaiBgaWYgdGVzdCAtZiAnTlRhYmxlcy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnTlRhYmxlcy5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL05UYWJsZXMuY3BwJzsgZmlgCi0KLWxpYmdpemFfYS1QYXJhbWV0ZXIubzogUGFyYW1ldGVyLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLVBhcmFtZXRlci5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtUGFyYW1ldGVyLlRwbyAtYyAtbyBsaWJnaXphX2EtUGFyYW1ldGVyLm8gYHRlc3QgLWYgJ1BhcmFtZXRlci5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYFBhcmFtZXRlci5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLVBhcmFtZXRlci5UcG8gJChERVBESVIpL2xpYmdpemFfYS1QYXJhbWV0ZXIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdQYXJhbWV0ZXIuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1QYXJhbWV0ZXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1QYXJhbWV0ZXIubyBgdGVzdCAtZiAnUGFyYW1ldGVyLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgUGFyYW1ldGVyLmNwcAotCi1saWJnaXphX2EtUGFyYW1ldGVyLm9iajogUGFyYW1ldGVyLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLVBhcmFtZXRlci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1QYXJhbWV0ZXIuVHBvIC1jIC1vIGxpYmdpemFfYS1QYXJhbWV0ZXIub2JqIGBpZiB0ZXN0IC1mICdQYXJhbWV0ZXIuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ1BhcmFtZXRlci5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL1BhcmFtZXRlci5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLVBhcmFtZXRlci5UcG8gJChERVBESVIpL2xpYmdpemFfYS1QYXJhbWV0ZXIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdQYXJhbWV0ZXIuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1QYXJhbWV0ZXIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLVBhcmFtZXRlci5vYmogYGlmIHRlc3QgLWYgJ1BhcmFtZXRlci5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnUGFyYW1ldGVyLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvUGFyYW1ldGVyLmNwcCc7IGZpYAotCi1saWJnaXphX2EtcGFyc2UubzogcGFyc2UuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtcGFyc2UubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLXBhcnNlLlRwbyAtYyAtbyBsaWJnaXphX2EtcGFyc2UubyBgdGVzdCAtZiAncGFyc2UuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwYXJzZS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLXBhcnNlLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLXBhcnNlLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0ncGFyc2UuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1wYXJzZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLXBhcnNlLm8gYHRlc3QgLWYgJ3BhcnNlLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgcGFyc2UuY3BwCi0KLWxpYmdpemFfYS1wYXJzZS5vYmo6IHBhcnNlLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLXBhcnNlLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLXBhcnNlLlRwbyAtYyAtbyBsaWJnaXphX2EtcGFyc2Uub2JqIGBpZiB0ZXN0IC1mICdwYXJzZS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAncGFyc2UuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wYXJzZS5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLXBhcnNlLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLXBhcnNlLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0ncGFyc2UuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1wYXJzZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtcGFyc2Uub2JqIGBpZiB0ZXN0IC1mICdwYXJzZS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAncGFyc2UuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wYXJzZS5jcHAnOyBmaWAKLQotbGliZ2l6YV9hLVBlcnBsZXhpdHkubzogUGVycGxleGl0eS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1QZXJwbGV4aXR5Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1QZXJwbGV4aXR5LlRwbyAtYyAtbyBsaWJnaXphX2EtUGVycGxleGl0eS5vIGB0ZXN0IC1mICdQZXJwbGV4aXR5LmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgUGVycGxleGl0eS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLVBlcnBsZXhpdHkuVHBvICQoREVQRElSKS9saWJnaXphX2EtUGVycGxleGl0eS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J1BlcnBsZXhpdHkuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1QZXJwbGV4aXR5Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtUGVycGxleGl0eS5vIGB0ZXN0IC1mICdQZXJwbGV4aXR5LmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgUGVycGxleGl0eS5jcHAKLQotbGliZ2l6YV9hLVBlcnBsZXhpdHkub2JqOiBQZXJwbGV4aXR5LmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLVBlcnBsZXhpdHkub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtUGVycGxleGl0eS5UcG8gLWMgLW8gbGliZ2l6YV9hLVBlcnBsZXhpdHkub2JqIGBpZiB0ZXN0IC1mICdQZXJwbGV4aXR5LmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdQZXJwbGV4aXR5LmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvUGVycGxleGl0eS5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLVBlcnBsZXhpdHkuVHBvICQoREVQRElSKS9saWJnaXphX2EtUGVycGxleGl0eS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J1BlcnBsZXhpdHkuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1QZXJwbGV4aXR5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1QZXJwbGV4aXR5Lm9iaiBgaWYgdGVzdCAtZiAnUGVycGxleGl0eS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnUGVycGxleGl0eS5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL1BlcnBsZXhpdHkuY3BwJzsgZmlgCi0KLWxpYmdpemFfYS1yZXBvcnRzLm86IHJlcG9ydHMuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtcmVwb3J0cy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtcmVwb3J0cy5UcG8gLWMgLW8gbGliZ2l6YV9hLXJlcG9ydHMubyBgdGVzdCAtZiAncmVwb3J0cy5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJlcG9ydHMuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS1yZXBvcnRzLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLXJlcG9ydHMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdyZXBvcnRzLmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtcmVwb3J0cy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLXJlcG9ydHMubyBgdGVzdCAtZiAncmVwb3J0cy5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJlcG9ydHMuY3BwCi0KLWxpYmdpemFfYS1yZXBvcnRzLm9iajogcmVwb3J0cy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1yZXBvcnRzLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLXJlcG9ydHMuVHBvIC1jIC1vIGxpYmdpemFfYS1yZXBvcnRzLm9iaiBgaWYgdGVzdCAtZiAncmVwb3J0cy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAncmVwb3J0cy5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3JlcG9ydHMuY3BwJzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS1yZXBvcnRzLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLXJlcG9ydHMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdyZXBvcnRzLmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtcmVwb3J0cy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtcmVwb3J0cy5vYmogYGlmIHRlc3QgLWYgJ3JlcG9ydHMuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ3JlcG9ydHMuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9yZXBvcnRzLmNwcCc7IGZpYAotCi1saWJnaXphX2EtU2V0QXJyYXkubzogU2V0QXJyYXkuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtU2V0QXJyYXkubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLVNldEFycmF5LlRwbyAtYyAtbyBsaWJnaXphX2EtU2V0QXJyYXkubyBgdGVzdCAtZiAnU2V0QXJyYXkuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BTZXRBcnJheS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLVNldEFycmF5LlRwbyAkKERFUERJUikvbGliZ2l6YV9hLVNldEFycmF5LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nU2V0QXJyYXkuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1TZXRBcnJheS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLVNldEFycmF5Lm8gYHRlc3QgLWYgJ1NldEFycmF5LmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgU2V0QXJyYXkuY3BwCi0KLWxpYmdpemFfYS1TZXRBcnJheS5vYmo6IFNldEFycmF5LmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLVNldEFycmF5Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLVNldEFycmF5LlRwbyAtYyAtbyBsaWJnaXphX2EtU2V0QXJyYXkub2JqIGBpZiB0ZXN0IC1mICdTZXRBcnJheS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnU2V0QXJyYXkuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9TZXRBcnJheS5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLVNldEFycmF5LlRwbyAkKERFUERJUikvbGliZ2l6YV9hLVNldEFycmF5LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nU2V0QXJyYXkuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1TZXRBcnJheS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtU2V0QXJyYXkub2JqIGBpZiB0ZXN0IC1mICdTZXRBcnJheS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnU2V0QXJyYXkuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9TZXRBcnJheS5jcHAnOyBmaWAKLQotbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDMubzogdHJhbnNwYWlyX21vZGVsMy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS10cmFuc3BhaXJfbW9kZWwzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS10cmFuc3BhaXJfbW9kZWwzLlRwbyAtYyAtbyBsaWJnaXphX2EtdHJhbnNwYWlyX21vZGVsMy5vIGB0ZXN0IC1mICd0cmFuc3BhaXJfbW9kZWwzLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgdHJhbnNwYWlyX21vZGVsMy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDMuVHBvICQoREVQRElSKS9saWJnaXphX2EtdHJhbnNwYWlyX21vZGVsMy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J3RyYW5zcGFpcl9tb2RlbDMuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS10cmFuc3BhaXJfbW9kZWwzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtdHJhbnNwYWlyX21vZGVsMy5vIGB0ZXN0IC1mICd0cmFuc3BhaXJfbW9kZWwzLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgdHJhbnNwYWlyX21vZGVsMy5jcHAKLQotbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDMub2JqOiB0cmFuc3BhaXJfbW9kZWwzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtdHJhbnNwYWlyX21vZGVsMy5UcG8gLWMgLW8gbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDMub2JqIGBpZiB0ZXN0IC1mICd0cmFuc3BhaXJfbW9kZWwzLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICd0cmFuc3BhaXJfbW9kZWwzLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdHJhbnNwYWlyX21vZGVsMy5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDMuVHBvICQoREVQRElSKS9saWJnaXphX2EtdHJhbnNwYWlyX21vZGVsMy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J3RyYW5zcGFpcl9tb2RlbDMuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS10cmFuc3BhaXJfbW9kZWwzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS10cmFuc3BhaXJfbW9kZWwzLm9iaiBgaWYgdGVzdCAtZiAndHJhbnNwYWlyX21vZGVsMy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAndHJhbnNwYWlyX21vZGVsMy5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3RyYW5zcGFpcl9tb2RlbDMuY3BwJzsgZmlgCi0KLWxpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw0Lm86IHRyYW5zcGFpcl9tb2RlbDQuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNC5UcG8gLWMgLW8gbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDQubyBgdGVzdCAtZiAndHJhbnNwYWlyX21vZGVsNC5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRyYW5zcGFpcl9tb2RlbDQuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw0LlRwbyAkKERFUERJUikvbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSd0cmFuc3BhaXJfbW9kZWw0LmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDQubyBgdGVzdCAtZiAndHJhbnNwYWlyX21vZGVsNC5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRyYW5zcGFpcl9tb2RlbDQuY3BwCi0KLWxpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw0Lm9iajogdHJhbnNwYWlyX21vZGVsNC5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDQuVHBvIC1jIC1vIGxpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw0Lm9iaiBgaWYgdGVzdCAtZiAndHJhbnNwYWlyX21vZGVsNC5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAndHJhbnNwYWlyX21vZGVsNC5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3RyYW5zcGFpcl9tb2RlbDQuY3BwJzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw0LlRwbyAkKERFUERJUikvbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSd0cmFuc3BhaXJfbW9kZWw0LmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNC5vYmogYGlmIHRlc3QgLWYgJ3RyYW5zcGFpcl9tb2RlbDQuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RyYW5zcGFpcl9tb2RlbDQuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90cmFuc3BhaXJfbW9kZWw0LmNwcCc7IGZpYAotCi1saWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNS5vOiB0cmFuc3BhaXJfbW9kZWw1LmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDUubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDUuVHBvIC1jIC1vIGxpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw1Lm8gYHRlc3QgLWYgJ3RyYW5zcGFpcl9tb2RlbDUuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0cmFuc3BhaXJfbW9kZWw1LmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNS5UcG8gJChERVBESVIpL2xpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw1LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0ndHJhbnNwYWlyX21vZGVsNS5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw1Lm8gYHRlc3QgLWYgJ3RyYW5zcGFpcl9tb2RlbDUuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0cmFuc3BhaXJfbW9kZWw1LmNwcAotCi1saWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNS5vYmo6IHRyYW5zcGFpcl9tb2RlbDUuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw1LlRwbyAtYyAtbyBsaWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNS5vYmogYGlmIHRlc3QgLWYgJ3RyYW5zcGFpcl9tb2RlbDUuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RyYW5zcGFpcl9tb2RlbDUuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90cmFuc3BhaXJfbW9kZWw1LmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnaXphX2EtdHJhbnNwYWlyX21vZGVsNS5UcG8gJChERVBESVIpL2xpYmdpemFfYS10cmFuc3BhaXJfbW9kZWw1LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0ndHJhbnNwYWlyX21vZGVsNS5jcHAnIG9iamVjdD0nbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLXRyYW5zcGFpcl9tb2RlbDUub2JqIGBpZiB0ZXN0IC1mICd0cmFuc3BhaXJfbW9kZWw1LmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICd0cmFuc3BhaXJfbW9kZWw1LmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdHJhbnNwYWlyX21vZGVsNS5jcHAnOyBmaWAKLQotbGliZ2l6YV9hLVRUYWJsZXMubzogVFRhYmxlcy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS1UVGFibGVzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdpemFfYS1UVGFibGVzLlRwbyAtYyAtbyBsaWJnaXphX2EtVFRhYmxlcy5vIGB0ZXN0IC1mICdUVGFibGVzLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgVFRhYmxlcy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLVRUYWJsZXMuVHBvICQoREVQRElSKS9saWJnaXphX2EtVFRhYmxlcy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J1RUYWJsZXMuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1UVGFibGVzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtVFRhYmxlcy5vIGB0ZXN0IC1mICdUVGFibGVzLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgVFRhYmxlcy5jcHAKLQotbGliZ2l6YV9hLVRUYWJsZXMub2JqOiBUVGFibGVzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLVRUYWJsZXMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtVFRhYmxlcy5UcG8gLWMgLW8gbGliZ2l6YV9hLVRUYWJsZXMub2JqIGBpZiB0ZXN0IC1mICdUVGFibGVzLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdUVGFibGVzLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvVFRhYmxlcy5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLVRUYWJsZXMuVHBvICQoREVQRElSKS9saWJnaXphX2EtVFRhYmxlcy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J1RUYWJsZXMuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS1UVGFibGVzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGxpYmdpemFfYS1UVGFibGVzLm9iaiBgaWYgdGVzdCAtZiAnVFRhYmxlcy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnVFRhYmxlcy5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL1RUYWJsZXMuY3BwJzsgZmlgCi0KLWxpYmdpemFfYS11dGlsaXR5Lm86IHV0aWxpdHkuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2EtdXRpbGl0eS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnaXphX2EtdXRpbGl0eS5UcG8gLWMgLW8gbGliZ2l6YV9hLXV0aWxpdHkubyBgdGVzdCAtZiAndXRpbGl0eS5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHV0aWxpdHkuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS11dGlsaXR5LlRwbyAkKERFUERJUikvbGliZ2l6YV9hLXV0aWxpdHkuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSd1dGlsaXR5LmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtdXRpbGl0eS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLXV0aWxpdHkubyBgdGVzdCAtZiAndXRpbGl0eS5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHV0aWxpdHkuY3BwCi0KLWxpYmdpemFfYS11dGlsaXR5Lm9iajogdXRpbGl0eS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGxpYmdpemFfYS11dGlsaXR5Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLXV0aWxpdHkuVHBvIC1jIC1vIGxpYmdpemFfYS11dGlsaXR5Lm9iaiBgaWYgdGVzdCAtZiAndXRpbGl0eS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAndXRpbGl0eS5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3V0aWxpdHkuY3BwJzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdpemFfYS11dGlsaXR5LlRwbyAkKERFUERJUikvbGliZ2l6YV9hLXV0aWxpdHkuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSd1dGlsaXR5LmNwcCcgb2JqZWN0PSdsaWJnaXphX2EtdXRpbGl0eS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2EtdXRpbGl0eS5vYmogYGlmIHRlc3QgLWYgJ3V0aWxpdHkuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ3V0aWxpdHkuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91dGlsaXR5LmNwcCc7IGZpYAotCi1saWJnaXphX2Etdm9jYWIubzogdm9jYWIuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmdpemFfYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnaXphX2FfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBsaWJnaXphX2Etdm9jYWIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLXZvY2FiLlRwbyAtYyAtbyBsaWJnaXphX2Etdm9jYWIubyBgdGVzdCAtZiAndm9jYWIuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2B2b2NhYi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLXZvY2FiLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLXZvY2FiLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0ndm9jYWIuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS12b2NhYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZ2l6YV9hX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdpemFfYV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbGliZ2l6YV9hLXZvY2FiLm8gYHRlc3QgLWYgJ3ZvY2FiLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgdm9jYWIuY3BwCi0KLWxpYmdpemFfYS12b2NhYi5vYmo6IHZvY2FiLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbGliZ2l6YV9hLXZvY2FiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2l6YV9hLXZvY2FiLlRwbyAtYyAtbyBsaWJnaXphX2Etdm9jYWIub2JqIGBpZiB0ZXN0IC1mICd2b2NhYi5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAndm9jYWIuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS92b2NhYi5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2l6YV9hLXZvY2FiLlRwbyAkKERFUERJUikvbGliZ2l6YV9hLXZvY2FiLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0ndm9jYWIuY3BwJyBvYmplY3Q9J2xpYmdpemFfYS12b2NhYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJnaXphX2FfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2l6YV9hX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBsaWJnaXphX2Etdm9jYWIub2JqIGBpZiB0ZXN0IC1mICd2b2NhYi5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAndm9jYWIuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS92b2NhYi5jcHAnOyBmaWAKLQotZDRub3JtLWQ0bm9ybS5vOiBkNG5vcm0uY3h4Ci1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGQ0bm9ybV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkNG5vcm1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBkNG5vcm0tZDRub3JtLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2Q0bm9ybS1kNG5vcm0uVHBvIC1jIC1vIGQ0bm9ybS1kNG5vcm0ubyBgdGVzdCAtZiAnZDRub3JtLmN4eCcgfHwgZWNobyAnJChzcmNkaXIpLydgZDRub3JtLmN4eAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9kNG5vcm0tZDRub3JtLlRwbyAkKERFUERJUikvZDRub3JtLWQ0bm9ybS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2Q0bm9ybS5jeHgnIG9iamVjdD0nZDRub3JtLWQ0bm9ybS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZDRub3JtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGQ0bm9ybV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZDRub3JtLWQ0bm9ybS5vIGB0ZXN0IC1mICdkNG5vcm0uY3h4JyB8fCBlY2hvICckKHNyY2RpcikvJ2BkNG5vcm0uY3h4Ci0KLWQ0bm9ybS1kNG5vcm0ub2JqOiBkNG5vcm0uY3h4Ci1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGQ0bm9ybV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkNG5vcm1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBkNG5vcm0tZDRub3JtLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZDRub3JtLWQ0bm9ybS5UcG8gLWMgLW8gZDRub3JtLWQ0bm9ybS5vYmogYGlmIHRlc3QgLWYgJ2Q0bm9ybS5jeHgnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZDRub3JtLmN4eCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZDRub3JtLmN4eCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9kNG5vcm0tZDRub3JtLlRwbyAkKERFUERJUikvZDRub3JtLWQ0bm9ybS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2Q0bm9ybS5jeHgnIG9iamVjdD0nZDRub3JtLWQ0bm9ybS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkNG5vcm1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZDRub3JtX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBkNG5vcm0tZDRub3JtLm9iaiBgaWYgdGVzdCAtZiAnZDRub3JtLmN4eCc7IHRoZW4gJChDWUdQQVRIX1cpICdkNG5vcm0uY3h4JzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kNG5vcm0uY3h4JzsgZmlgCi0KLWhtbW5vcm0taG1tbm9ybS5vOiBobW1ub3JtLmN4eAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChobW1ub3JtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGhtbW5vcm1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBobW1ub3JtLWhtbW5vcm0ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvaG1tbm9ybS1obW1ub3JtLlRwbyAtYyAtbyBobW1ub3JtLWhtbW5vcm0ubyBgdGVzdCAtZiAnaG1tbm9ybS5jeHgnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGhtbW5vcm0uY3h4Ci1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2htbW5vcm0taG1tbm9ybS5UcG8gJChERVBESVIpL2htbW5vcm0taG1tbm9ybS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2htbW5vcm0uY3h4JyBvYmplY3Q9J2htbW5vcm0taG1tbm9ybS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoaG1tbm9ybV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChobW1ub3JtX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBobW1ub3JtLWhtbW5vcm0ubyBgdGVzdCAtZiAnaG1tbm9ybS5jeHgnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGhtbW5vcm0uY3h4Ci0KLWhtbW5vcm0taG1tbm9ybS5vYmo6IGhtbW5vcm0uY3h4Ci1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGhtbW5vcm1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaG1tbm9ybV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGhtbW5vcm0taG1tbm9ybS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2htbW5vcm0taG1tbm9ybS5UcG8gLWMgLW8gaG1tbm9ybS1obW1ub3JtLm9iaiBgaWYgdGVzdCAtZiAnaG1tbm9ybS5jeHgnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaG1tbm9ybS5jeHgnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2htbW5vcm0uY3h4JzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL2htbW5vcm0taG1tbm9ybS5UcG8gJChERVBESVIpL2htbW5vcm0taG1tbm9ybS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2htbW5vcm0uY3h4JyBvYmplY3Q9J2htbW5vcm0taG1tbm9ybS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChobW1ub3JtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGhtbW5vcm1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGhtbW5vcm0taG1tbm9ybS5vYmogYGlmIHRlc3QgLWYgJ2htbW5vcm0uY3h4JzsgdGhlbiAkKENZR1BBVEhfVykgJ2htbW5vcm0uY3h4JzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9obW1ub3JtLmN4eCc7IGZpYAotCi1tZ2l6YS1tYWluLm86IG1haW4uY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1naXphX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1naXphX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbWdpemEtbWFpbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9tZ2l6YS1tYWluLlRwbyAtYyAtbyBtZ2l6YS1tYWluLm8gYHRlc3QgLWYgJ21haW4uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtYWluLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9tZ2l6YS1tYWluLlRwbyAkKERFUERJUikvbWdpemEtbWFpbi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J21haW4uY3BwJyBvYmplY3Q9J21naXphLW1haW4ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1naXphX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1naXphX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBtZ2l6YS1tYWluLm8gYHRlc3QgLWYgJ21haW4uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtYWluLmNwcAotCi1tZ2l6YS1tYWluLm9iajogbWFpbi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobWdpemFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWdpemFfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBtZ2l6YS1tYWluLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbWdpemEtbWFpbi5UcG8gLWMgLW8gbWdpemEtbWFpbi5vYmogYGlmIHRlc3QgLWYgJ21haW4uY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ21haW4uY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tYWluLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9tZ2l6YS1tYWluLlRwbyAkKERFUERJUikvbWdpemEtbWFpbi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J21haW4uY3BwJyBvYmplY3Q9J21naXphLW1haW4ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobWdpemFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWdpemFfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1naXphLW1haW4ub2JqIGBpZiB0ZXN0IC1mICdtYWluLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdtYWluLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbWFpbi5jcHAnOyBmaWAKLQotc250MmNvb2Mtc250MmNvb2Mubzogc250MmNvb2MuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHNudDJjb29jX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgc250MmNvb2Mtc250MmNvb2MubyAtTUQgLU1QIC1NRiAkKERFUERJUikvc250MmNvb2Mtc250MmNvb2MuVHBvIC1jIC1vIHNudDJjb29jLXNudDJjb29jLm8gYHRlc3QgLWYgJ3NudDJjb29jLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgc250MmNvb2MuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL3NudDJjb29jLXNudDJjb29jLlRwbyAkKERFUERJUikvc250MmNvb2Mtc250MmNvb2MuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdzbnQyY29vYy5jcHAnIG9iamVjdD0nc250MmNvb2Mtc250MmNvb2MubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHNudDJjb29jX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBzbnQyY29vYy1zbnQyY29vYy5vIGB0ZXN0IC1mICdzbnQyY29vYy5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNudDJjb29jLmNwcAotCi1zbnQyY29vYy1zbnQyY29vYy5vYmo6IHNudDJjb29jLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzbnQyY29vY19DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHNudDJjb29jLXNudDJjb29jLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc250MmNvb2Mtc250MmNvb2MuVHBvIC1jIC1vIHNudDJjb29jLXNudDJjb29jLm9iaiBgaWYgdGVzdCAtZiAnc250MmNvb2MuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NudDJjb29jLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc250MmNvb2MuY3BwJzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL3NudDJjb29jLXNudDJjb29jLlRwbyAkKERFUERJUikvc250MmNvb2Mtc250MmNvb2MuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdzbnQyY29vYy5jcHAnIG9iamVjdD0nc250MmNvb2Mtc250MmNvb2Mub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc250MmNvb2NfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHNudDJjb29jLXNudDJjb29jLm9iaiBgaWYgdGVzdCAtZiAnc250MmNvb2MuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NudDJjb29jLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc250MmNvb2MuY3BwJzsgZmlgCi0KLS5jeHgubzoKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFhDT01QSUxFKSAtYyAtbyAkQCAkPAotCi0uY3h4Lm9iajoKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWENPTVBJTEUpIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLSQoUkVDVVJTSVZFX1RBUkdFVFMpOgotCUBmYWlsY29tPSdleGl0IDEnOyBcCi0JZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAotCSAgY2FzZSAkJGYgaW4gXAotCSAgICAqPSogfCAtLVsha10qKTs7IFwKLQkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLSQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgotCUBmYWlsY29tPSdleGl0IDEnOyBcCi0JZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAotCSAgY2FzZSAkJGYgaW4gXAotCSAgICAqPSogfCAtLVsha10qKTs7IFwKLQkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWRvdF9zZWVuPW5vOyBcCi0JY2FzZSAiJEAiIGluIFwKLQkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKLQkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKLQllc2FjOyBcCi0JcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAotCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgZmk7IFwKLQlkb25lOyBcCi0JcmV2PSIkJHJldiAuIjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICB8fCBldmFsICQkZmFpbGNvbTsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLWN0YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAotCWRvbmUKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW10cHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlta2lkIC1mSUQgJCR1bmlxdWUKLXRhZ3M6IFRBR1MKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9LjsgXAotCWVsc2UgXAotCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9OyBcCi0JZmk7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKLQkgICAgICB0YWdzPSIkJHRhZ3MgJCRpbmNsdWRlX29wdGlvbj0kJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogY3RhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdGFncyAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCi0JICAgIHx8ICQoTUtESVJfUCkgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICAgIGRpc3RkaXI9YCQoYW1fX2NkKSAkKGRpc3RkaXIpICYmIHB3ZGA7IFwKLQkgICAgdG9wX2Rpc3RkaXI9YCQoYW1fX2NkKSAkKHRvcF9kaXN0ZGlyKSAmJiBwd2RgOyBcCi0JICAgIChjZCAkJHN1YmRpciAmJiBcCi0JICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQkdG9wX2Rpc3RkaXIiIFwKLQkgICAgICAgIGRpc3RkaXI9IiQkZGlzdGRpci8kJHN1YmRpciIgXAotCQlhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBcCi0JCWFtX19za2lwX2xlbmd0aF9jaGVjaz06IFwKLQkgICAgICAgIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKExJQlJBUklFUykgJChQUk9HUkFNUykKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCWZvciBkaXIgaW4gIiQoREVTVERJUikkKGxpYmRpcikiICIkKERFU1RESVIpJChiaW5kaXIpIjsgZG8gXAotCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAotCWRvbmUKLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKLQkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotY2xlYW4tYW06IGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGliTElCUkFSSUVTIFwKLQltb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1yZWN1cnNpdmUKLQotZHZpLWFtOgotCi1odG1sOiBodG1sLXJlY3Vyc2l2ZQotCi1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtbGliTElCUkFSSUVTCi0KLWluc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1yZWN1cnNpdmUKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljCi0KLXBkZjogcGRmLXJlY3Vyc2l2ZQotCi1wZGYtYW06Ci0KLXBzOiBwcy1yZWN1cnNpdmUKLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1saWJMSUJSQVJJRVMKLQotLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGluc3RhbGwtYW0gXAotCWluc3RhbGwtc3RyaXAKLQotLlBIT05ZOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBcCi0JYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1iaW5QUk9HUkFNUyBcCi0JY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJMSUJSQVJJRVMgY3RhZ3MgY3RhZ3MtcmVjdXJzaXZlIFwKLQlkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLXRhZ3MgXAotCWRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgXAotCWluc3RhbGwtYW0gaW5zdGFsbC1iaW5QUk9HUkFNUyBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIFwKLQlpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIFwKLQlpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gXAotCWluc3RhbGwtbGliTElCUkFSSUVTIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIFwKLQlpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAotCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBpbnN0YWxsZGlycy1hbSBtYWludGFpbmVyLWNsZWFuIFwKLQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCi0JbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdGFncy1yZWN1cnNpdmUgXAotCXVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWJpblBST0dSQU1TIFwKLQl1bmluc3RhbGwtbGliTElCUkFSSUVTCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL01vdmVTd2FwTWF0cml4LmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL01vdmVTd2FwTWF0cml4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwYzNhMy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9Nb3ZlU3dhcE1hdHJpeC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdJWkErKyAoIGV4dGVuc2lvbiBvZiBHSVpBICkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpbmNsdWRlICJNb3ZlU3dhcE1hdHJpeC5oIgotCi10ZW1wbGF0ZTxjbGFzcyBUUkFOU1BBSVI+Ci1Nb3ZlU3dhcE1hdHJpeDxUUkFOU1BBSVI+OjpNb3ZlU3dhcE1hdHJpeChjb25zdCBUUkFOU1BBSVImX2VmLCBjb25zdCBhbGlnbm1lbnQmX2EpCi0gIDogYWxpZ25tZW50KF9hKSwgZWYoX2VmKSwgbChlZi5nZXRfbCgpKSwgbShlZi5nZXRfbSgpKSwgX2Ntb3ZlKGwrMSwgbSsxKSwgX2Nzd2FwKG0rMSwgbSsxKSwgCi0gIGRlbG1vdmUobCsxLCBtKzEsMCksZGVsc3dhcChtKzEsIG0rMSwwKSxjaGFuZ2VkKGwrMiwgMCksIGNoYW5nZWRDb3VudGVyKDEpLCAKLSAgbW9kZWxucihfZWYubW9kZWxucigpKSxsYXp5RXZhbHVhdGlvbigwKSxjZW50ZXJEZWxldGVkKDApCi17Ci0gIGRvdWJsZSB0aGlzVmFsdWU9ZWYuc2NvcmVPZkFsaWdubWVudEZvckNoYW5nZSgoKnRoaXMpKTsKLSAgaWYoIGxhenlFdmFsdWF0aW9uPT0wKQotICAgIGZvcihXb3JkSW5kZXggaj0xO2o8PW07aisrKXVwZGF0ZUooaiwgMCx0aGlzVmFsdWUpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUUkFOU1BBSVI+Ci12b2lkIE1vdmVTd2FwTWF0cml4PFRSQU5TUEFJUj46OnVwZGF0ZUooV29yZEluZGV4IGosIGJvb2wgdXNlQ2hhbmdlZCxkb3VibGUgdGhpc1ZhbHVlKQotewotICBtYXNzZXJ0KCBsYXp5RXZhbHVhdGlvbj09MCApOwotICBmb3IoV29yZEluZGV4IGk9MDtpPD1sO2krKykKLSAgICBpZiggKHVzZUNoYW5nZWQ9PTB8fGNoYW5nZWRbaV0hPWNoYW5nZWRDb3VudGVyKSApCi0gICAgICBpZiggZ2V0X2FsKGopIT1pICkgCi0JX2Ntb3ZlKGksIGopPWVmLnNjb3JlT2ZNb3ZlKCgqdGhpcyksIGksIGosdGhpc1ZhbHVlKTsKLSAgICAgIGVsc2UKLQlfY21vdmUoaSwgaik9MS4wOwotICBmb3IoV29yZEluZGV4IGoyPWorMTtqMjw9bTtqMisrKQotICAgIGlmKCBnZXRfYWwoaikhPWdldF9hbChqMikgKQotICAgICAgX2Nzd2FwKGosIGoyKT1lZi5zY29yZU9mU3dhcCgoKnRoaXMpLCBqLCBqMix0aGlzVmFsdWUpOwotICAgIGVsc2UKLSAgICAgIF9jc3dhcChqLCBqMik9MS4wOwotICBmb3IoV29yZEluZGV4IGoyPTE7ajI8ajtqMisrKQotICAgIGlmKCBnZXRfYWwoaikhPWdldF9hbChqMikgKQotICAgICAgX2Nzd2FwKGoyLCBqKT1lZi5zY29yZU9mU3dhcCgoKnRoaXMpLCBqMiwgaix0aGlzVmFsdWUpOwotICAgIGVsc2UKLSAgICAgIF9jc3dhcChqMiwgaik9MS4wOwotfQotdGVtcGxhdGU8Y2xhc3MgVFJBTlNQQUlSPgotdm9pZCBNb3ZlU3dhcE1hdHJpeDxUUkFOU1BBSVI+Ojp1cGRhdGVJKFdvcmRJbmRleCBpLGRvdWJsZSB0aGlzVmFsdWUpCi17Ci0gIG1hc3NlcnQoIGxhenlFdmFsdWF0aW9uPT0wKTsKLSAgZm9yKFdvcmRJbmRleCBqPTE7ajw9bTtqKyspCi0gICAgaWYoIGdldF9hbChqKSE9aSApCi0gICAgICBfY21vdmUoaSwgaik9ZWYuc2NvcmVPZk1vdmUoKCp0aGlzKSwgaSwgaix0aGlzVmFsdWUpOwotICAgIGVsc2UKLSAgICAgIF9jbW92ZShpLCBqKT0xLjA7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRSQU5TUEFJUj4KLXZvaWQgTW92ZVN3YXBNYXRyaXg8VFJBTlNQQUlSPjo6cHJpbnRXcm9uZ3MoKWNvbnN0ewotICBmb3IoV29yZEluZGV4IGk9MDtpPD1sO2krKykKLSAgICB7Ci0gICAgICBmb3IoV29yZEluZGV4IGo9MTtqPD1tO2orKykKLQlpZiggZ2V0X2FsKGopPT1pKQotCSAgY291dCA8PCAiQSI7Ci0JZWxzZQotCSAgewotCSAgICBMb2dQcm9iIHJlYWw9X2Ntb3ZlKGksIGopLCB3YW50ZWQ9ZWYuc2NvcmVPZk1vdmUoKCp0aGlzKSwgaSwgaik7Ci0JICAgIGlmKCBmYWJzKDEuMC1yZWFsL3dhbnRlZCk+MWUtMyApCi0JICAgICAgY291dCA8PCAnYic7Ci0JICAgIGVsc2UgaWYoZmFicygxLjAtcmVhbC93YW50ZWQpPjFlLTEwICkKLQkgICAgICBjb3V0IDw8ICdlJzsKLQkgICAgZWxzZSBpZihyZWFsIT13YW50ZWQpCi0JICAgICAgY291dCA8PCAnRSc7Ci0JICAgIGVsc2UKLQkgICAgICBjb3V0IDw8ICcgJzsKLQkgIH0KLSAgICAgIGNvdXQgPDwgZW5kbDsKLSAgICB9Ci0gIGNvdXQgPDwgZW5kbDsKLSAgZm9yKFdvcmRJbmRleCBqPTE7ajw9bTtqKyspCi0gICAgewotICAgICAgZm9yKFdvcmRJbmRleCBqMT0xO2oxPD1tO2oxKyspCi0JaWYoIGoxPmogKQotCSAgewotCSAgICBpZiggZ2V0X2FsKGopPT1nZXRfYWwoajEpICkKLQkgICAgICBjb3V0IDw8ICdBJzsKLQkgICAgZWxzZSAKLQkgICAgICBjb3V0IDw8IChfY3N3YXAoaiwgajEpPT1lZi5zY29yZU9mU3dhcCgoKnRoaXMpLCBqLCBqMSkpOwotCSAgfQotCWVsc2UKLQkgIGNvdXQgPDwgJyAnOwotICAgICAgY291dCA8PCBlbmRsOyAgCi0gICAgfQotICBtYXNzZXJ0KDApOwotfQotdGVtcGxhdGU8Y2xhc3MgVFJBTlNQQUlSPgotYm9vbCBNb3ZlU3dhcE1hdHJpeDxUUkFOU1BBSVI+Ojppc1JpZ2h0KCljb25zdHsKLSAgaWYoIGxhenlFdmFsdWF0aW9uICkgCi0gICAgcmV0dXJuIDE7Ci0gIGZvcihXb3JkSW5kZXggaT0wO2k8PWw7aSsrKQotICAgIGZvcihXb3JkSW5kZXggaj0xO2o8PW07aisrKQotICAgICAgaWYoIGdldF9hbChqKSE9aSAmJiAoIShkb3VibGVFcXVhbChfY21vdmUoaSwgaiksIGVmLnNjb3JlT2ZNb3ZlKCgqdGhpcyksIGksIGopKSkpICkKLQl7Ci0JICBjZXJyIDw8ICJESUZGOiAiIDw8IGkgPDwgIiAiIDw8IGogPDwgIiAiIDw8IF9jbW92ZShpLCBqKSA8PCAiICIgPDwgZWYuc2NvcmVPZk1vdmUoKCp0aGlzKSwgaSwgaikgPDwgZW5kbDsKLQkgIHJldHVybiAwOwotCX0KLSAgZm9yKFdvcmRJbmRleCBqPTE7ajw9bTtqKyspCi0gICAgZm9yKFdvcmRJbmRleCBqMT0xO2oxPD1tO2oxKyspCi0gICAgICBpZiggajE+aiYmZ2V0X2FsKGopIT1nZXRfYWwoajEpJiYoIWRvdWJsZUVxdWFsKF9jc3dhcChqLCBqMSksIGVmLnNjb3JlT2ZTd2FwKCgqdGhpcyksIGosIGoxKSkpICkKLQl7Ci0JICBjZXJyIDw8ICJESUZGRVJFTlQ6ICIgPDwgaiA8PCAiICIgPDwgajEgPDwgIiAiIDw8IF9jc3dhcChqLCBqMSkgPDwgIiAiIDw8IGVmLnNjb3JlT2ZTd2FwKCgqdGhpcyksIGosIGoxKSA8PCBlbmRsOwotCSAgcmV0dXJuIDA7Ci0JfQotICByZXR1cm4gMTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFJBTlNQQUlSPgotdm9pZCBNb3ZlU3dhcE1hdHJpeDxUUkFOU1BBSVI+Ojpkb01vdmUoV29yZEluZGV4IF9pLCBXb3JkSW5kZXggX2opCi17Ci0gIFdvcmRJbmRleCBvbGRfaT1nZXRfYWwoX2opOwotICBpZiggbGF6eUV2YWx1YXRpb24gKQotICAgIHNldChfaixfaSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIG1vZGVsbnI9PTV8fG1vZGVsbnI9PTYgKQotCXsKLQkgIHNldChfaiwgX2kpOwotCSAgZG91YmxlIHRoaXNWYWx1ZT1lZi5zY29yZU9mQWxpZ25tZW50Rm9yQ2hhbmdlKCgqdGhpcykpOwotCSAgZm9yKFdvcmRJbmRleCBqPTE7ajw9bTtqKyspdXBkYXRlSihqLCAwLHRoaXNWYWx1ZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoIG1vZGVsbnI9PTQgKQotCXsKLQkgIGNoYW5nZWRDb3VudGVyKys7Ci0JICBmb3IodW5zaWduZWQgaW50IGs9cHJldl9jZXB0KG9sZF9pKTtrPD1uZXh0X2NlcHQob2xkX2kpOysrayljaGFuZ2VkW2tdPWNoYW5nZWRDb3VudGVyOwotCSAgZm9yKHVuc2lnbmVkIGludCBrPXByZXZfY2VwdChfaSk7azw9bmV4dF9jZXB0KF9pKTsrK2spY2hhbmdlZFtrXT1jaGFuZ2VkQ291bnRlcjsKLQkgIHNldChfaiwgX2kpOwotCSAgZm9yKHVuc2lnbmVkIGludCBrPXByZXZfY2VwdChvbGRfaSk7azw9bmV4dF9jZXB0KG9sZF9pKTsrK2spY2hhbmdlZFtrXT1jaGFuZ2VkQ291bnRlcjsKLQkgIGZvcih1bnNpZ25lZCBpbnQgaz1wcmV2X2NlcHQoX2kpO2s8PW5leHRfY2VwdChfaSk7KytrKWNoYW5nZWRba109Y2hhbmdlZENvdW50ZXI7Ci0JICBkb3VibGUgdGhpc1ZhbHVlPWVmLnNjb3JlT2ZBbGlnbm1lbnRGb3JDaGFuZ2UoKCp0aGlzKSk7Ci0JICBmb3IodW5zaWduZWQgaW50IGk9MDtpPD1sO2krKykKLQkgICAgaWYoY2hhbmdlZFtpXT09Y2hhbmdlZENvdW50ZXIpCi0JICAgICAgdXBkYXRlSShpLHRoaXNWYWx1ZSk7Ci0JICBmb3IodW5zaWduZWQgaW50IGo9MTtqPD1tO2orKykKLQkgICAgaWYoIGNoYW5nZWRbZ2V0X2FsKGopXT09Y2hhbmdlZENvdW50ZXIgKQotCSAgICAgIHVwZGF0ZUooaiwgMSx0aGlzVmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc3NlcnQobW9kZWxucj09Myk7Ci0JICBzZXQoX2osIF9pKTsKLQkgIGNoYW5nZWRDb3VudGVyKys7Ci0JICBkb3VibGUgdGhpc1ZhbHVlPWVmLnNjb3JlT2ZBbGlnbm1lbnRGb3JDaGFuZ2UoKCp0aGlzKSk7Ci0JICB1cGRhdGVJKG9sZF9pLHRoaXNWYWx1ZSk7Ci0JICBjaGFuZ2VkW29sZF9pXT1jaGFuZ2VkQ291bnRlcjsKLQkgIHVwZGF0ZUkoX2ksdGhpc1ZhbHVlKTsKLQkgIGNoYW5nZWRbX2ldPWNoYW5nZWRDb3VudGVyOwotCSAgZm9yKFdvcmRJbmRleCBqPTE7ajw9bTtqKyspCi0JICAgIGlmKCBnZXRfYWwoaik9PV9pIHx8IGdldF9hbChqKT09b2xkX2kgKQotCSAgICAgIHVwZGF0ZUooaiwgMSx0aGlzVmFsdWUpOwotCX0KLSAgICB9Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUUkFOU1BBSVI+Ci12b2lkIE1vdmVTd2FwTWF0cml4PFRSQU5TUEFJUj46OmRvU3dhcChXb3JkSW5kZXggX2oxLCBXb3JkSW5kZXggX2oyKQotewotICBhc3NlcnQoIGNzd2FwKF9qMSwgX2oyKT4xICk7Ci0gIFdvcmRJbmRleCBpMT1nZXRfYWwoX2oxKSwgaTI9Z2V0X2FsKF9qMik7Ci0gIGlmKCBsYXp5RXZhbHVhdGlvbj09MSApCi0gICAgewotICAgICAgc2V0KF9qMSwgaTIpOwotICAgICAgc2V0KF9qMiwgaTEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICggbW9kZWxucj09NXx8bW9kZWxucj09NiApCi0JewotCSAgc2V0KF9qMSwgaTIpOwotCSAgc2V0KF9qMiwgaTEpOwotCSAgZG91YmxlIHRoaXNWYWx1ZT1lZi5zY29yZU9mQWxpZ25tZW50Rm9yQ2hhbmdlKCgqdGhpcykpOwotCSAgZm9yKFdvcmRJbmRleCBqPTE7ajw9bTtqKyspdXBkYXRlSihqLCAwLHRoaXNWYWx1ZSk7Ci0JfQotICAgICAgZWxzZSBpZiggbW9kZWxucj09NCApCi0JewotCSAgY2hhbmdlZENvdW50ZXIrKzsKLQkgIGZvcih1bnNpZ25lZCBpbnQgaz1wcmV2X2NlcHQoaTEpO2s8PW5leHRfY2VwdChpMSk7KytrKWNoYW5nZWRba109Y2hhbmdlZENvdW50ZXI7Ci0JICBmb3IodW5zaWduZWQgaW50IGs9cHJldl9jZXB0KGkyKTtrPD1uZXh0X2NlcHQoaTIpOysrayljaGFuZ2VkW2tdPWNoYW5nZWRDb3VudGVyOwotCSAgc2V0KF9qMSwgaTIpOwotCSAgc2V0KF9qMiwgaTEpOwotCSAgZG91YmxlIHRoaXNWYWx1ZT1lZi5zY29yZU9mQWxpZ25tZW50Rm9yQ2hhbmdlKCgqdGhpcykpOwotCSAgZm9yKHVuc2lnbmVkIGludCBpPTA7aTw9bDtpKyspCi0JICAgIGlmKGNoYW5nZWRbaV09PWNoYW5nZWRDb3VudGVyKQotCSAgICAgIHVwZGF0ZUkoaSx0aGlzVmFsdWUpOwotCSAgZm9yKHVuc2lnbmVkIGludCBqPTE7ajw9bTtqKyspCi0JICAgIGlmKCBjaGFuZ2VkW2dldF9hbChqKV09PWNoYW5nZWRDb3VudGVyICkKLQkgICAgICB1cGRhdGVKKGosIDEsdGhpc1ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNzZXJ0KG1vZGVsbnI9PTMpOwotCSAgc2V0KF9qMSwgaTIpOwotCSAgc2V0KF9qMiwgaTEpOwotCSAgY2hhbmdlZENvdW50ZXIrKzsKLQkgIGRvdWJsZSB0aGlzVmFsdWU9ZWYuc2NvcmVPZkFsaWdubWVudEZvckNoYW5nZSgoKnRoaXMpKTsKLQkgIHVwZGF0ZUkoaTEsdGhpc1ZhbHVlKTsKLQkgIGNoYW5nZWRbaTFdPWNoYW5nZWRDb3VudGVyOwotCSAgdXBkYXRlSShpMix0aGlzVmFsdWUpOwotCSAgY2hhbmdlZFtpMl09Y2hhbmdlZENvdW50ZXI7Ci0JICB1cGRhdGVKKF9qMSwgMSx0aGlzVmFsdWUpOwotCSAgdXBkYXRlSihfajIsIDEsdGhpc1ZhbHVlKTsKLQl9Ci0gICAgfQotfQotCi0jaW5jbHVkZSAidHJhbnNwYWlyX21vZGVsMy5oIgotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDQuaCIKLSNpbmNsdWRlICJ0cmFuc3BhaXJfbW9kZWw1LmgiCi0jaW5jbHVkZSAidHJhbnNwYWlyX21vZGVsaG1tLmgiCi10ZW1wbGF0ZSBjbGFzcyBNb3ZlU3dhcE1hdHJpeDx0cmFuc3BhaXJfbW9kZWwzPjsKLXRlbXBsYXRlIGNsYXNzIE1vdmVTd2FwTWF0cml4PHRyYW5zcGFpcl9tb2RlbDQ+OwotdGVtcGxhdGUgY2xhc3MgTW92ZVN3YXBNYXRyaXg8dHJhbnNwYWlyX21vZGVsNT47Ci10ZW1wbGF0ZSBjbGFzcyBNb3ZlU3dhcE1hdHJpeDx0cmFuc3BhaXJfbW9kZWxobW0+OwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvTW92ZVN3YXBNYXRyaXguaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL01vdmVTd2FwTWF0cml4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYmJmMTUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvTW92ZVN3YXBNYXRyaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLS8qLS0KLU1vdmVTd2FwTWF0cml4OiBFZmZpY2llbnQgcmVwcmVzZW50YXRpb24gZm9yIG1vdmluZyBhbmQgc3dhcHBpbmcKLWFyb3VuZCBpbiBJQk0zIHRyYWluaW5nLgotRnJhbnogSm9zZWYgT2NoICgzMC8wNy85OSkKLS0tKi8KLSNpZm5kZWYgbW92ZXN3YXAyX2Nvc3RzX2hfZGVmaW5lZAotI2RlZmluZSBtb3Zlc3dhcDJfY29zdHNfaF9kZWZpbmVkCi0jaW5jbHVkZSAiYWxpZ25tZW50LmgiCi0jaW5jbHVkZSAidHJhbnNwYWlyX21vZGVsMy5oIgotI2luY2x1ZGUgIm15YXNzZXJ0LmgiCi0KLWV4dGVybiBzaG9ydCBEb1ZpdGVyYmlUcmFpbmluZzsKLQotdGVtcGxhdGU8Y2xhc3MgVFJBTlNQQUlSPgotY2xhc3MgTW92ZVN3YXBNYXRyaXggOiBwdWJsaWMgYWxpZ25tZW50Ci17Ci0gcHJpdmF0ZToKLSAgY29uc3QgVFJBTlNQQUlSJmVmOwotICBjb25zdCBXb3JkSW5kZXggbCwgbTsKLSAgQXJyYXkyPExvZ1Byb2IsIFZlY3RvcjxMb2dQcm9iPiA+IF9jbW92ZSwgX2Nzd2FwOwotICBBcnJheTI8Y2hhcixWZWN0b3I8Y2hhcj4gPiBkZWxtb3ZlLGRlbHN3YXA7Ci0gIFZlY3RvcjxpbnQ+IGNoYW5nZWQ7Ci0gIGludCBjaGFuZ2VkQ291bnRlcjsKLSAgY29uc3QgaW50IG1vZGVsbnI7Ci0gIGJvb2wgbGF6eUV2YWx1YXRpb247Ci0gIGJvb2wgY2VudGVyRGVsZXRlZDsKLSBwdWJsaWM6Ci0gIGJvb2wgY2hlY2soKWNvbnN0Ci0gICAgewotCSAgcmV0dXJuIDE7Ci0gICAgfQotICBjb25zdCBUUkFOU1BBSVImZ2V0X2VmKCljb25zdAotICAgIHtyZXR1cm4gZWY7fQotICBib29sIGlzQ2VudGVyRGVsZXRlZCgpY29uc3QKLSAgICB7cmV0dXJuIGNlbnRlckRlbGV0ZWQ7fQotICBib29sIGlzTGF6eSgpY29uc3QKLSAgICB7cmV0dXJuIGxhenlFdmFsdWF0aW9uO30KLSAgTW92ZVN3YXBNYXRyaXgoY29uc3QgVFJBTlNQQUlSJl9lZiwgY29uc3QgYWxpZ25tZW50Jl9hKTsKLSAgdm9pZCB1cGRhdGVKKFdvcmRJbmRleCBqLCBib29sLGRvdWJsZSB0aGlzVmFsdWUpOwotICB2b2lkIHVwZGF0ZUkoV29yZEluZGV4IGksZG91YmxlIHRoaXNWYWx1ZSk7Ci0gIHZvaWQgZG9Nb3ZlKFdvcmRJbmRleCBfaSwgV29yZEluZGV4IF9qKTsKLSAgdm9pZCBkb1N3YXAoV29yZEluZGV4IF9qMSwgV29yZEluZGV4IF9qMik7Ci0gIHZvaWQgZGVsQ2VudGVyKCkKLSAgICB7Ci0gICAgICBjZW50ZXJEZWxldGVkPTE7Ci0gICAgfQotICB2b2lkIGRlbE1vdmUoV29yZEluZGV4IHgsIFdvcmRJbmRleCB5KQotICAgIHsKLSAgICAgIGRlbG1vdmUoeCx5KT0xOwotICAgIH0KLSAgdm9pZCBkZWxTd2FwKFdvcmRJbmRleCB4LCBXb3JkSW5kZXggeSkKLSAgICB7Ci0gICAgICBtYXNzZXJ0KHk+eCk7Ci0gICAgICBkZWxzd2FwKHgseSk9MTsKLSAgICAgIGRlbHN3YXAoeSx4KT0xOwotICAgIH0KLSAgYm9vbCBpc0RlbE1vdmUoV29yZEluZGV4IHgsIFdvcmRJbmRleCB5KWNvbnN0Ci0gICAgewotICAgICAgcmV0dXJuIERvVml0ZXJiaVRyYWluaW5nfHxkZWxtb3ZlKHgseSk7Ci0gICAgfQotICBib29sIGlzRGVsU3dhcChXb3JkSW5kZXggeCwgV29yZEluZGV4IHkpY29uc3QKLSAgICB7Ci0gICAgICBtYXNzZXJ0KHk+eCk7Ci0gICAgICByZXR1cm4gRG9WaXRlcmJpVHJhaW5pbmd8fGRlbHN3YXAoeCx5KTsKLSAgICB9Ci0gIExvZ1Byb2IgY21vdmUoV29yZEluZGV4IHgsIFdvcmRJbmRleCB5KWNvbnN0Ci0gICAgewotICAgICAgbWFzc2VydCggZ2V0X2FsKHkpIT14ICk7Ci0gICAgICBtYXNzZXJ0KCBkZWxtb3ZlKHgseSk9PTAgKTsKLSAgICAgIGlmKCBsYXp5RXZhbHVhdGlvbiApCi0JcmV0dXJuIGVmLnNjb3JlT2ZNb3ZlKCp0aGlzLHgseSk7Ci0gICAgICBlbHNlCi0JewotCSAgcmV0dXJuIF9jbW92ZSh4LCB5KTsKLQl9Ci0gICAgfQotICBMb2dQcm9iIGNzd2FwKFdvcmRJbmRleCB4LCBXb3JkSW5kZXggeSljb25zdAotICAgIHsKLSAgICAgIG1hc3NlcnQoeDx5KTsKLSAgICAgIG1hc3NlcnQoZGVsc3dhcCh4LHkpPT0wKTsKLSAgICAgIG1hc3NlcnQoZ2V0X2FsKHgpIT1nZXRfYWwoeSkpOwotICAgICAgaWYoIGxhenlFdmFsdWF0aW9uICkKLQlyZXR1cm4gZWYuc2NvcmVPZlN3YXAoKnRoaXMseCx5KTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtYXNzZXJ0KHk+eCk7Ci0JICByZXR1cm4gX2Nzd2FwKHgsIHkpOwotCX0KLSAgICB9Ci0gIHZvaWQgcHJpbnRXcm9uZ3MoKWNvbnN0OwotICBib29sIGlzUmlnaHQoKWNvbnN0OwotICBmcmllbmQgb3N0cmVhbSZvcGVyYXRvcjw8KG9zdHJlYW0mb3V0LCBjb25zdCBNb3ZlU3dhcE1hdHJpeDxUUkFOU1BBSVI+Jm0pCi0gICAge3JldHVybiBvdXQgPDwgKGFsaWdubWVudCltIDw8ICJcbkVGOlxuIjw8IG0uZWYgPDwgIlxuQ01PVkVcbiI8PG0uX2Ntb3ZlIDw8ICJcbkNTV0FQXG4iIDw8IG0uX2Nzd2FwIDw8IGVuZGw7fTsKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL05UYWJsZXMuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvTlRhYmxlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1Njc2ZDUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvTlRhYmxlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0jaW5jbHVkZSAiTlRhYmxlcy5oIgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgIlBhcmFtZXRlci5oIgotCi1HTE9CQUxfUEFSQU1FVEVSKGRvdWJsZSxOVGFibGVzRmFjdG9yR3JhcGhlbWVzLCJuU21vb3RoIiwic21vb3RoaW5nIGZvciBmZXJ0aWxpdHkgcGFyYW1ldGVycyAoZ29vZCB2YWx1ZTogNjQpOiB3ZWlnaHQgZm9yIHdvcmRsZW5ndGgtZGVwZW5kZW50IGZlcnRpbGl0eSBwYXJhbWV0ZXJzIixQQVJMRVZfU01PT1RILDY0LjApOwotR0xPQkFMX1BBUkFNRVRFUihkb3VibGUsTlRhYmxlc0ZhY3RvckdlbmVyYWwsIm5TbW9vdGhHZW5lcmFsIiwic21vb3RoaW5nIGZvciBmZXJ0aWxpdHkgcGFyYW1ldGVycyAoZGVmYXVsdDogMCk6IHdlaWdodCBmb3Igd29yZC1pbmRlcGVuZGVudCBmZXJ0aWxpdHkgcGFyYW1ldGVycyIsUEFSTEVWX1NNT09USCwwLjApOwotCi10ZW1wbGF0ZSA8Y2xhc3MgVkFMVFlQRT4KLXZvaWQgbm1vZGVsPFZBTFRZUEU+OjpwcmludE5UYWJsZShpbnQgbm9FVywgY29uc3QgY2hhciogZmlsZW5hbWUsIAotCQkJCSAgY29uc3QgVmVjdG9yPFdvcmRFbnRyeT4mIGV2bGlzdCwgCi0JCQkJICBib29sIGFjdHVhbCkgY29uc3QKLSAgICAgLy8gcHJpbnRzIHRoZSBmZXJ0aWxpdHkgdGFibGUgYnV0IHdpdGggYWN0dWFsIHNvdXJjY2Ugd29yZHMgKG5vdCB0aGVpciBpZCkKLXsKLSAgICBjZXJyIDw8ICJEdW1waW5nIG5UYWJsZSB0bzogIiA8PCBmaWxlbmFtZSA8PCAgJ1xuJzsgIAotICAgIG9mc3RyZWFtIG9mKGZpbGVuYW1lKTsKLSAgICBWQUxUWVBFIHAgOwotICAgIFdvcmRJbmRleCBrLCBpIDsKLSAgICBmb3IoaT0xOyBpbnQoaSkgPCBub0VXOyBpKyspewotICAgICAgICBpZiAoZXZsaXN0W2ldLmZyZXEgPiAwKXsKLSAgICAgICAgICAgIGlmIChhY3R1YWwpCi0gICAgICAgICAgICAgICAgb2YgPDwgZXZsaXN0W2ldLndvcmQgPDwgJyAnIDsKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgb2YgPDwgaSA8PCAnICcgOwotICAgICAgICAgICAgZm9yKCBrPTA7IGsgPCBNQVhfRkVSVElMSVRZOyBrKyspewotICAgICAgICAgICAgICAgIHAgPSBnZXRWYWx1ZShpLCBrKTsKLSAgICAgICAgICAgICAgICBpZiAocCA8PSBQUk9CX1NNT09USCkgCi0gICAgICAgICAgICAgICAgICAgIHAgPSAwOwotICAgICAgICAgICAgICAgIG9mIDw8IHAgPDwgJyAnOyAgICAgIAotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIG9mIDw8ICdcbic7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBWQUxUWVBFPgotdm9pZCBubW9kZWw8VkFMVFlQRT46OnByaW50UmVhbE5UYWJsZShpbnQgbm9FVywgY29uc3QgY2hhciogZmlsZW5hbWUsIAotCQkJCSAgY29uc3QgVmVjdG9yPFdvcmRFbnRyeT4mIGV2bGlzdCwgCi0JCQkJICBib29sIGFjdHVhbCkgY29uc3QKLSAgICAgLy8gcHJpbnRzIHRoZSBmZXJ0aWxpdHkgdGFibGUgYnV0IHdpdGggYWN0dWFsIHNvdXJjY2Ugd29yZHMgKG5vdCB0aGVpciBpZCkKLXsKLSAgICBjZXJyIDw8ICJEdW1waW5nIG5UYWJsZSB0bzogIiA8PCBmaWxlbmFtZSA8PCAgJ1xuJzsgIAotICAgIG9mc3RyZWFtIG9mKGZpbGVuYW1lKTsKLSAgICBWQUxUWVBFIHAgOwotICAgIFdvcmRJbmRleCBrLCBpIDsKLSAgICBmb3IoaT0xOyBpbnQoaSkgPCBub0VXOyBpKyspewotICAgICAgICBpZiAoZXZsaXN0W2ldLmZyZXEgPiAwKXsKLSAgICAgICAgICAgIGlmIChhY3R1YWwpCi0gICAgICAgICAgICAgICAgb2YgPDwgZXZsaXN0W2ldLndvcmQgPDwgJyAnIDsKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgb2YgPDwgaSA8PCAnICcgOwotICAgICAgICAgICAgZm9yKCBrPTA7IGsgPCBNQVhfRkVSVElMSVRZOyBrKyspewotICAgICAgICAgICAgICAgIHAgPSBnZXRWYWx1ZShpLCBrKTsKLS8vICAgICAgICAgICAgICAgIGlmIChwIDw9IFBST0JfU01PT1RIKSAKLS8vICAgICAgICAgICAgICAgICAgICBwID0gMDsKLSAgICAgICAgICAgICAgICBvZiA8PCBwIDw8ICcgJzsgICAgICAKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBvZiA8PCAnXG4nOwotICAgICAgICB9Ci0gICAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVkFMVFlQRT4KLWJvb2wgbm1vZGVsPFZBTFRZUEU+OjpyZWFkTlRhYmxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKXsKLSAgLyogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbiB0YWJsZSBmcm9tIGEgZmlsZS4KLSAgICAgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtYXQ6ICBzb3VyY2Vfd29yZF9pZCBwMCBwMSBwMiAuLi4gcG4KLSAgICAgVGhpcyBpcyB0aGUgaW52ZXJzZSBvcGVyYXRpb24gb2YgdGhlIHByaW50VGFibGUgZnVuY3Rpb24uCi0gICAgIE5BUywgNy8xMS85OQotICAqLwotICAgIGlmc3RyZWFtIGluZihmaWxlbmFtZSk7Ci0gICAgaWYoIWluZi5pc19vcGVuKCkpewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNlcnIgPDwgIlJlYWRpbmcgZmVydGlsaXR5IHRhYmxlIGZyb20gIiA8PCBmaWxlbmFtZSA8PCAiXG4iOwotICAgIGlmKCFpbmYpewotICAgICAgICBjZXJyIDw8ICJcbkVSUk9SOiBDYW5ub3Qgb3BlbiAiIDw8IGZpbGVuYW1lIDw8IlxuIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBWQUxUWVBFIHByb2I7Ci0gICAgV29yZEluZGV4IHRvaywgaTsKLSAgICBpbnQgbkZlcnQ9MDsKLSAgICB3aGlsZSghaW5mLmVvZigpKXsKLSAgICAgICAgbkZlcnQrKzsKLSAgICAgICAgaW5mID4+IHdzID4+IHRvazsKLSAgICAgICAgaWYgKHRvayA+IE1BWF9WT0NBQl9TSVpFKXsKLSAgICAgICAgICAgIGNlcnIgPDwgIk5UYWJsZXM6cmVhZE5UYWJsZSgpOiB1bnJlY29nbml6ZWQgdG9rZW4gaWQ6ICIgPDwgdG9rCi0gICAgICAgICAgICAgICAgPDwnXG4nOwotICAgICAgICAgICAgZXhpdCgtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgTUFYX0ZFUlRJTElUWTsgaSsrKXsKLSAgICAgICAgICAgIGluZiA+PiB3cyA+PiBwcm9iOwotICAgICAgICAgICAgZ2V0UmVmKHRvaywgaSk9cHJvYjsKLSAgICAgICAgfQotICAgIH0KLSAgICBjZXJyIDw8ICJSZWFkICIgPDwgbkZlcnQgPDwgIiBlbnRyaWVzIGluIGZlcnRpbGl0eSB0YWJsZS5cbiI7Ci0gICAgaW5mLmNsb3NlKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBWQUxUWVBFPgotYm9vbCBubW9kZWw8VkFMVFlQRT46Om1lcmdlKG5tb2RlbDxWQUxUWVBFPiYgbixpbnQgbm9FVywgY29uc3QgVmVjdG9yPFdvcmRFbnRyeT4mIGV2bGlzdCl7Ci0gIC8qIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIG4gdGFibGUgZnJvbSBhIGZpbGUuCi0gICAgIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybWF0OiAgc291cmNlX3dvcmRfaWQgcDAgcDEgcDIgLi4uIHBuCi0gICAgIFRoaXMgaXMgdGhlIGludmVyc2Ugb3BlcmF0aW9uIG9mIHRoZSBwcmludFRhYmxlIGZ1bmN0aW9uLgotICAgICBOQVMsIDcvMTEvOTkKLSAgKi8KLQotICAgIAotICAgIFZBTFRZUEUgcCA7Ci0gICAgV29yZEluZGV4IGssIGkgOwotICAgIGZvcihpPTE7IGludChpKSA8IG5vRVc7IGkrKyl7Ci0gICAgICAgIGlmIChldmxpc3RbaV0uZnJlcSA+IDApewotICAgICAgICAgICAgZm9yKCBrPTA7IGsgPCBNQVhfRkVSVElMSVRZOyBrKyspewotICAgICAgICAgICAgICAgIHAgPSBuLmdldFZhbHVlKGksIGspOwotICAgICAgICAgICAgICAgIGdldFJlZihpLGspKz1wOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFZBTFRZUEU+Ci1ib29sIG5tb2RlbDxWQUxUWVBFPjo6cmVhZEF1Z05UYWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSl7Ci0gIC8qIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIG4gdGFibGUgZnJvbSBhIGZpbGUuCi0gICAgIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybWF0OiAgc291cmNlX3dvcmRfaWQgcDAgcDEgcDIgLi4uIHBuCi0gICAgIFRoaXMgaXMgdGhlIGludmVyc2Ugb3BlcmF0aW9uIG9mIHRoZSBwcmludFRhYmxlIGZ1bmN0aW9uLgotICAgICBOQVMsIDcvMTEvOTkKLSAgKi8KLSAgICBpZnN0cmVhbSBpbmYoZmlsZW5hbWUpOwotICAgIGlmKCFpbmYuaXNfb3BlbigpKXsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjZXJyIDw8ICJSZWFkaW5nIGZlcnRpbGl0eSB0YWJsZSBmcm9tICIgPDwgZmlsZW5hbWUgPDwgIlxuIjsKLSAgICBpZighaW5mKXsKLSAgICAgICAgY2VyciA8PCAiXG5FUlJPUjogQ2Fubm90IG9wZW4gIiA8PCBmaWxlbmFtZSA8PCJcbiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgVkFMVFlQRSBwcm9iOwotICAgIFdvcmRJbmRleCB0b2ssIGk7Ci0gICAgaW50IG5GZXJ0PTA7Ci0gICAgd2hpbGUoIWluZi5lb2YoKSl7Ci0gICAgICAgIG5GZXJ0Kys7Ci0gICAgICAgIGluZiA+PiB3cyA+PiB0b2s7Ci0gICAgICAgIGlmICh0b2sgPiBNQVhfVk9DQUJfU0laRSl7Ci0gICAgICAgICAgICBjZXJyIDw8ICJOVGFibGVzOnJlYWROVGFibGUoKTogdW5yZWNvZ25pemVkIHRva2VuIGlkOiAiIDw8IHRvawotICAgICAgICAgICAgICAgIDw8J1xuJzsKLSAgICAgICAgICAgIGV4aXQoLTEpOwotICAgICAgICB9Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IE1BWF9GRVJUSUxJVFk7IGkrKyl7Ci0gICAgICAgICAgICBpbmYgPj4gd3MgPj4gcHJvYjsKLSAgICAgICAgICAgIGdldFJlZih0b2ssIGkpKz1wcm9iOwotICAgICAgICB9Ci0gICAgfQotICAgIGNlcnIgPDwgIlJlYWQgIiA8PCBuRmVydCA8PCAiIGVudHJpZXMgaW4gZmVydGlsaXR5IHRhYmxlLlxuIjsKLSAgICBpbmYuY2xvc2UoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgY2xhc3Mgbm1vZGVsPENPVU5UPjsKLS8vdGVtcGxhdGUgY2xhc3Mgbm1vZGVsPFBST0I+OwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvTlRhYmxlcy5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvTlRhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQxYjNkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL05UYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotCi0gRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotIFdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi0gVVNBLgotCi0gKi8KLSNpZm5kZWYgX250YWJsZXNfaAotI2RlZmluZSBfbnRhYmxlc19oIDEKLSNpbmNsdWRlICJBcnJheTIuaCIKLSNpbmNsdWRlICJWZWN0b3IuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAidm9jYWIuaCIKLSNpbmNsdWRlICJteWFzc2VydC5oIgotI2luY2x1ZGUgIkdsb2JhbHMuaCIKLSNpbmNsdWRlICJzeW5jT2JqLmgiCi0KLWV4dGVybiBkb3VibGUgTlRhYmxlc0ZhY3RvckdyYXBoZW1lcywgTlRhYmxlc0ZhY3RvckdlbmVyYWw7Ci0KLXRlbXBsYXRlPGNsYXNzIFZBTFRZUEU+IGNsYXNzIG5tb2RlbCB7Ci1wcml2YXRlOgotCUFycmF5MjxWQUxUWVBFLCBWZWN0b3I8VkFMVFlQRT4gPiBudGFiOwotcHVibGljOgotCW5tb2RlbChpbnQgbWF4dywgaW50IG1heG4pIDoKLQkJbnRhYihtYXh3LCBtYXhuLCAwLjApIHsKLQl9Ci0JVkFMVFlQRSBnZXRWYWx1ZShpbnQgdywgdW5zaWduZWQgaW50IG4pIGNvbnN0IHsKLQkJbWFzc2VydCh3IT0wKTsKLQkJaWYgKG4+PW50YWIuZ2V0TGVuMigpKQotCQkJcmV0dXJuIDAuMDsKLQkJZWxzZQotCQkJcmV0dXJuIG1heChudGFiKHcsIG4pLCBWQUxUWVBFKFBST0JfU01PT1RIKSk7Ci0JfQotcHJvdGVjdGVkOgotCWlubGluZSBWQUxUWVBFJmdldFJlZihpbnQgdywgaW50IG4pIHsKLQkJLy9tYXNzZXJ0KHchPTApOwotCQlyZXR1cm4gbnRhYih3LCBuKTsKLQl9OwotCU11dGV4IGxvY2s7Ci1wdWJsaWM6Ci0JaW5saW5lIHZvaWQgYWRkVmFsdWUoaW50IHcgLCBpbnQgbixjb25zdCBWQUxUWVBFJiB0KXtsb2NrLmxvY2soKTtudGFiKHcsbikrPXQ7bG9jay51bmxvY2soKTt9OwotcHVibGljOgotCXRlbXBsYXRlPGNsYXNzIENPVU5UPiB2b2lkIG5vcm1hbGl6ZShubW9kZWw8Q09VTlQ+JndyaXRlLAotCQkJY29uc3QgVmVjdG9yPFdvcmRFbnRyeT4qIF9ldmxpc3QpIGNvbnN0IHsKLQkJaW50IGgxPW50YWIuZ2V0TGVuMSgpLCBoMj1udGFiLmdldExlbjIoKTsKLQkJaW50IG5QYXJhbXM9MDsKLQkJaWYgKF9ldmxpc3QmJihOVGFibGVzRmFjdG9yR3JhcGhlbWVzfHxOVGFibGVzRmFjdG9yR2VuZXJhbCkpIHsKLQkJCXNpemVfdCBtYXhsZW49MDsKLQkJCWNvbnN0IFZlY3RvcjxXb3JkRW50cnk+JmV2bGlzdD0qX2V2bGlzdDsKLQkJCWZvciAodW5zaWduZWQgaW50IGk9MTsgaTxldmxpc3Quc2l6ZSgpOyBpKyspCi0JCQkJbWF4bGVuPW1heChtYXhsZW4sIGV2bGlzdFtpXS53b3JkLmxlbmd0aCgpKTsKLQkJCUFycmF5MjxDT1VOVCxWZWN0b3I8Q09VTlQ+ID4gY291bnRzKG1heGxlbisxLCBNQVhfRkVSVElMSVRZKzEsIDAuMCk7Ci0JCQlWZWN0b3I8Q09VTlQ+IG5wcm9iX2dlbmVyYWwoTUFYX0ZFUlRJTElUWSsxLDAuMCk7Ci0JCQlmb3IgKHVuc2lnbmVkIGludCBpPTE7IGk8bWluKCh1bnNpZ25lZCBpbnQpaDEsCi0JCQkJCSh1bnNpZ25lZCBpbnQpZXZsaXN0LnNpemUoKSk7IGkrKykgewotCQkJCWludCBsPWV2bGlzdFtpXS53b3JkLmxlbmd0aCgpOwotCQkJCWZvciAoaW50IGs9MDsgazxoMjsgaysrKSB7Ci0JCQkJCWNvdW50cyhsLCBrKSs9Z2V0VmFsdWUoaSwgayk7Ci0JCQkJCW5wcm9iX2dlbmVyYWxba10rPWdldFZhbHVlKGksIGspOwotCQkJCX0KLQkJCX0KLQkJCUNPVU5UIHN1bTI9MDsKLQkJCWZvciAodW5zaWduZWQgaW50IGk9MTsgaTxtYXhsZW4rMTsgaSsrKSB7Ci0JCQkJQ09VTlQgc3VtPTAuMDsKLQkJCQlmb3IgKGludCBrPTA7IGs8aDI7IGsrKykKLQkJCQkJc3VtKz1jb3VudHMoaSwgayk7Ci0JCQkJc3VtMis9c3VtOwotCQkJCWlmIChzdW0pIHsKLQkJCQkJZG91YmxlIGF2ZXJhZ2U9MC4wOwotCQkJCQkvL2NlcnIgPDwgImw6ICIgPDwgaSA8PCAiICIgPDwgc3VtIDw8ICIgIjsKLQkJCQkJZm9yIChpbnQgaz0wOyBrPGgyOyBrKyspIHsKLQkJCQkJCWNvdW50cyhpLCBrKS89c3VtOwotCQkJCQkJLy9jZXJyIDw8IGNvdW50cyhpLGspIDw8ICcgJzsKLQkJCQkJCWF2ZXJhZ2UrPWsqY291bnRzKGksIGspOwotCQkJCQl9Ci0JCQkJCS8vY2VyciA8PCAiYXZnOiAiIDw8IGF2ZXJhZ2UgPDwgZW5kbDsKLQkJCQkJLy9jZXJyIDw8ICdcbic7Ci0JCQkJfQotCQkJfQotCQkJZm9yICh1bnNpZ25lZCBpbnQgaz0wOyBrPG5wcm9iX2dlbmVyYWwuc2l6ZSgpOyBrKyspCi0JCQkJbnByb2JfZ2VuZXJhbFtrXS89c3VtMjsKLQotCQkJZm9yIChpbnQgaT0xOyBpPGgxOyBpKyspIHsKLQkJCQlpbnQgbD0tMTsKLQkJCQlpZiAoKHVuc2lnbmVkIGludClpPGV2bGlzdC5zaXplKCkpCi0JCQkJCWw9ZXZsaXN0W2ldLndvcmQubGVuZ3RoKCk7Ci0JCQkJQ09VTlQgc3VtPTAuMDsKLQkJCQlmb3IgKGludCBrPTA7IGs8aDI7IGsrKykKLQkJCQkJc3VtKz1nZXRWYWx1ZShpLCBrKSsoKGw9PS0xKSA/IDAuMCA6IChjb3VudHMobCwgaykKLQkJCQkJCQkqTlRhYmxlc0ZhY3RvckdyYXBoZW1lcykpICsgTlRhYmxlc0ZhY3RvckdlbmVyYWwKLQkJCQkJCQkqbnByb2JfZ2VuZXJhbFtrXTsKLQkJCQlhc3NlcnQoc3VtKTsKLQkJCQlmb3IgKGludCBrPTA7IGs8aDI7IGsrKykgewotCQkJCQl3cml0ZS5nZXRSZWYoaSwgayk9KGdldFZhbHVlKGksIGspKygobD09LTEpID8gMC4wCi0JCQkJCQkJOiAoY291bnRzKGwsIGspKk5UYWJsZXNGYWN0b3JHcmFwaGVtZXMpKSkvc3VtCi0JCQkJCQkJKyBOVGFibGVzRmFjdG9yR2VuZXJhbCpucHJvYl9nZW5lcmFsW2tdOwotCQkJCQluUGFyYW1zKys7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UKLQkJCWZvciAoaW50IGk9MTsgaTxoMTsgaSsrKSB7Ci0JCQkJQ09VTlQgc3VtPTAuMDsKLQkJCQlmb3IgKGludCBrPTA7IGs8aDI7IGsrKykKLQkJCQkJc3VtKz1nZXRWYWx1ZShpLCBrKTsKLQkJCQlhc3NlcnQoc3VtKTsKLQkJCQlmb3IgKGludCBrPTA7IGs8aDI7IGsrKykgewotCQkJCQl3cml0ZS5nZXRSZWYoaSwgayk9Z2V0VmFsdWUoaSwgaykvc3VtOwotCQkJCQluUGFyYW1zKys7Ci0JCQkJfQotCQkJfQotCQljZXJyIDw8ICJOVGFibGUgY29udGFpbnMgIiA8PCBuUGFyYW1zIDw8ICIgcGFyYW1ldGVyLlxuIjsKLQl9Ci0KLQlib29sIG1lcmdlKG5tb2RlbDxWQUxUWVBFPiYgbiwgaW50IG5vRVcsIGNvbnN0IFZlY3RvcjxXb3JkRW50cnk+JiBldmxpc3QpOwotCXZvaWQgY2xlYXIoKSB7Ci0JCWludCBoMT1udGFiLmdldExlbjEoKSwgaDI9bnRhYi5nZXRMZW4yKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxoMTsgaSsrKQotCQkJZm9yIChpbnQgaz0wOyBrPGgyOyBrKyspCi0JCQkJbnRhYihpLCBrKT0wOwotCX0KLQl2b2lkIHByaW50TlRhYmxlKGludCBub0VXLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLQkJCWNvbnN0IFZlY3RvcjxXb3JkRW50cnk+JiBldmxpc3QsIGJvb2wpIGNvbnN0OwotCXZvaWQgcHJpbnRSZWFsTlRhYmxlKGludCBub0VXLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLQkJCWNvbnN0IFZlY3RvcjxXb3JkRW50cnk+JiBldmxpc3QsIGJvb2wpIGNvbnN0OwotCWJvb2wgcmVhZEF1Z05UYWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0JYm9vbCByZWFkTlRhYmxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9QYXJhbWV0ZXIuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvUGFyYW1ldGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3NWVjNy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9QYXJhbWV0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2ggKFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0laQSsrICggZXh0ZW5zaW9uIG9mIEdJWkEgKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2luY2x1ZGUgIlBhcmFtZXRlci5oIgotI2luY2x1ZGUgImZzdHJlYW0iCi0jaWZuZGVmIFdJTjMyCi0jaW5jbHVkZSAidW5pc3RkLmgiCi0jZWxzZQotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2RlZmluZSBnZXRjd2QgX2dldGN3ZAotI2VuZGlmCi0jaW5jbHVkZSA8c3Ryc3RyZWFtPgotCi0KLWJvb2wgYWJzb2x1dGVQYXRoTmFtZXM9MDsKLXN0cmluZyBQYXJhbWV0ZXJQYXRoUHJlZml4OwotYm9vbCBQYXJhbWV0ZXJDaGFuZ2VkRmxhZz0wOwotCi1ib29sIHdyaXRlUGFyYW1ldGVycyhvZnN0cmVhbSZvZixjb25zdCBQYXJTZXQmcGFyc2V0LGludCBsZXZlbCkKLXsKLSAgaWYoIW9mKXJldHVybiAwOwotICBmb3IoUGFyU2V0Ojpjb25zdF9pdGVyYXRvciBpPXBhcnNldC5iZWdpbigpO2khPXBhcnNldC5lbmQoKTsrK2kpCi0gICAgewotICAgICAgaWYoKCgqaSktPmdldExldmVsKCk9PWxldmVsfHxsZXZlbD09LTEpJiYoKmkpLT5vbmx5Q29weT09MCkKLQl7Ci0JICBvc3Ryc3RyZWFtIG9zOwotCSAgKCppKS0+cHJpbnRWYWx1ZShvcyk7Ci0JICBvcyA8PCBlbmRzOwotCSAgc3RyaW5nIHMob3Muc3RyKCkpOwotCSAgb2YgPDwgKCppKS0+Z2V0U3RyaW5nKCkgPDwgIiAiOwotCSAgaWYoIGFic29sdXRlUGF0aE5hbWVzJiYoKmkpLT5pc0ZpbGVuYW1lKCkmJnMubGVuZ3RoKCkmJnNbMF0hPScvJyApCi0JICAgIHsKLQkgICAgICBjaGFyIHBhdGhbMTAyNF07Ci0JICAgICAgZ2V0Y3dkKHBhdGgsMTAyNCk7Ci0JICAgICAgb2YgPDwgcGF0aCA8PCAnLyc7Ci0JICAgIH0KLQkgIGlmKCBQYXJhbWV0ZXJQYXRoUHJlZml4Lmxlbmd0aCgpJiYoKmkpLT5pc0ZpbGVuYW1lKCkmJnMubGVuZ3RoKCkmJnNbMF0hPScvJyApCi0JICAgIG9mIDw8IFBhcmFtZXRlclBhdGhQcmVmaXggPDwgJy8nOyAKLQkgICgqaSktPnByaW50VmFsdWUob2YpOwotCSAgb2YgPDwgZW5kbDsKLQl9Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotYm9vbCByZWFkUGFyYW1ldGVycyhpZnN0cmVhbSZmLGNvbnN0IFBhclNldCZwYXJzZXQsaW50IHZlcmIsaW50IGxldmVsKQotewotICBzdHJpbmcgczsKLSAgaWYoIWYpcmV0dXJuIDA7Ci0gIHdoaWxlKGdldGxpbmUoZixzKSkKLSAgICB7Ci0gICAgICBpc3Ryc3RyZWFtIGVpbmdhYmUocy5jX3N0cigpKTsKLSAgICAgIHN0cmluZyBzMSxzMjsKLSAgICAgIGVpbmdhYmU+PnMxPj5zMjsKLSAgICAgIGlmKG1ha2VTZXRDb21tYW5kKHMxLHMyLHBhcnNldCx2ZXJiLGxldmVsKT09MCkKLQljZXJyIDw8ICJFUlJPUjogY291bGQgbm90IHNldDogKEMpICIgPDwgczEgPDwgIiAiIDw8IHMyIDw8IGVuZGw7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotIAotYm9vbCBtYWtlU2V0Q29tbWFuZChzdHJpbmcgX3MxLHN0cmluZyBzMixjb25zdCBQYXJTZXQmcGFyc2V0LGludCB2ZXJiLGludCBsZXZlbCkKLXsKLSAgUGFyUHRyIGFuZjsKLSAgaW50IGFuZnNldD0wOwotICBzdHJpbmcgczE9c2ltcGxlU3RyaW5nKF9zMSk7Ci0gIGZvcihQYXJTZXQ6OmNvbnN0X2l0ZXJhdG9yIGk9cGFyc2V0LmJlZ2luKCk7aSE9cGFyc2V0LmVuZCgpOysraSkKLSAgICB7Ci0gICAgICBpZiggKigqaSk9PXMxICkKLQl7Ci0JICBpZiggbGV2ZWw9PS0xIHx8IGxldmVsPT0oKmkpLT5nZXRMZXZlbCgpICkKLQkgICAgKCppKS0+c2V0UGFyYW1ldGVyKHMyLHZlcmIpOwotCSAgZWxzZSBpZih2ZXJiPjEpCi0JICAgIGNlcnIgPDwgIkVSUk9SOiBDb3VsZCBub3Qgc2V0OiAoQSkgIiA8PCBzMSA8PCAiICIgPDwgczIgPDwgIiAiIDw8IGxldmVsIDw8ICIgIiA8PCAoKmkpLT5nZXRMZXZlbCgpIDw8IGVuZGw7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlIGlmKCAoKmkpLT5nZXRTdHJpbmcoKS5zdWJzdHIoMCxzMS5sZW5ndGgoKSk9PXMxICkKLQl7Ci0JICBhbmY9KCppKTthbmZzZXQrKzsKLQl9Ci0gICAgfQotICBpZihhbmZzZXQ9PTEpCi0gICAgewotICAgICAgaWYoIGxldmVsPT0tMSB8fCBsZXZlbD09YW5mLT5nZXRMZXZlbCgpICkKLQlhbmYtPnNldFBhcmFtZXRlcihzMix2ZXJiKTsKLSAgICAgIGVsc2UgaWYoIHZlcmI+MSApCi0JY2VyciA8PCAiRVJST1I6IENvdWxkIG5vdCBzZXQ6IChCKSAiIDw8IHMxIDw8ICIgIiA8PCBzMiA8PCAiICIgPDwgbGV2ZWwgPDwgIiAiIDw8IGFuZi0+Z2V0TGV2ZWwoKSA8PCBlbmRsOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiggYW5mc2V0PjEgKQotICAgIGNlcnIgPDwgIkVSUk9SOiBhbWJpZ3VvdXMgcGFyYW1ldGVyICciIDw8IHMxIDw8ICInLlxuIjsKLSAgaWYoIGFuZnNldD09MCApCi0gICAgY2VyciA8PCAiRVJST1I6IHBhcmFtZXRlciAnIiA8PCBzMSA8PCAiJyBkb2VzIG5vdCBleGlzdC5cbiI7Ci0gIHJldHVybiAwOwotfQotCi1vc3RyZWFtJiBwcmludFBhcnMob3N0cmVhbSZvZixjb25zdCBQYXJTZXQmcGFyc2V0LGludCBsZXZlbCkKLXsKLSAgaWYoIW9mKXJldHVybiBvZjsKLSAgZm9yKFBhclNldDo6Y29uc3RfaXRlcmF0b3IgaT1wYXJzZXQuYmVnaW4oKTtpIT1wYXJzZXQuZW5kKCk7KytpKQotICAgIHsKLSAgICAgIGlmKCgoKmkpLT5nZXRMZXZlbCgpPT1sZXZlbHx8bGV2ZWw9PS0xKSYmKCppKS0+b25seUNvcHk9PTApCi0JewotCSAgKCppKS0+cHJpbnRBdChvZik7Ci0JICBvZiA8PCBlbmRsOwotCX0KLSAgICB9Ci0gIHJldHVybiBvZjsKLX0KLQotc3RyaW5nIHNpbXBsZVN0cmluZyhjb25zdCBzdHJpbmcgcykKLXsKLSAgc3RyaW5nIGs7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8cy5sZW5ndGgoKTsrK2kpCi0gICAgewotICAgICAgY2hhciBjWzJdOwotICAgICAgY1swXT10b2xvd2VyKHNbaV0pOwotICAgICAgY1sxXT0wOwotICAgICAgaWYoIChjWzBdPj0nYScmJmNbMF08PSd6Jyl8fChjWzBdPj0nMCcmJmNbMF08PSc5JykgKQotCWsgKz0gYzsKLSAgICB9Ci0gIHJldHVybiBrOwotfQotCi0KLVBhclNldCZnZXRHbG9iYWxQYXJTZXQoKQotewotICBzdGF0aWMgUGFyU2V0IHg7Ci0gIHJldHVybiB4OwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvUGFyYW1ldGVyLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9QYXJhbWV0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyYmZiYy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9QYXJhbWV0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdJWkErKyAoIGV4dGVuc2lvbiBvZiBHSVpBICkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpZm5kZWYgUEFSQU1FVEVSX0hfREVGSU5FRAotI2RlZmluZSBQQVJBTUVURVJfSF9ERUZJTkVECi0KLSNpbmNsdWRlICJteXN0bC5oIgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlICJQb2ludGVyLmgiCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgIkdsb2JhbHMuaCIKLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgV0lOMzIKLSNkZWZpbmUgc3RyY2FzZWNtcCBfc3RyY21waQotI2VuZGlmCi0KLWlubGluZSB1bnNpZ25lZCBpbnQgbUNvbnZlcnQoY29uc3Qgc3RyaW5nJnMsdW5zaWduZWQgaW50ICZpKQoteyAKLSAgaWYoIHN0cmNhc2VjbXAocy5jX3N0cigpLCJ5ZXMiKT09MCB8fCBzdHJjYXNlY21wKHMuY19zdHIoKSwieSIpPT0wIHx8IHN0cmNhc2VjbXAocy5jX3N0cigpLCJ0cnVlIik9PTAgfHwgc3RyY2FzZWNtcChzLmNfc3RyKCksInQiKT09MCApIHsgY2VyciA8PCAiVFJVRVxuIjtyZXR1cm4gaT0xOyB9Ci0gIGlmKCBzdHJjYXNlY21wKHMuY19zdHIoKSwibm8iKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksIm4iKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksImZhbHNlIik9PTAgfHwgIHN0cmNhc2VjbXAocy5jX3N0cigpLCJmIik9PTAgKSB7IGNlcnIgPDwgIkZBTFNFXG4iO3JldHVybiBpPTA7fQotICByZXR1cm4gaT1hdG9pKHMuY19zdHIoKSk7IAotfQotaW5saW5lIGludCBtQ29udmVydChjb25zdCBzdHJpbmcmcyxpbnQgJmkpeyAKLSAgaWYoIHN0cmNhc2VjbXAocy5jX3N0cigpLCJ5ZXMiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInkiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInRydWUiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInQiKT09MCApIHsgY2VyciA8PCAiVFJVRVxuIjtyZXR1cm4gaT0xO30KLSAgaWYoIHN0cmNhc2VjbXAocy5jX3N0cigpLCJubyIpPT0wIHx8ICBzdHJjYXNlY21wKHMuY19zdHIoKSwibiIpPT0wIHx8ICBzdHJjYXNlY21wKHMuY19zdHIoKSwiZmFsc2UiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksImYiKT09MCApIHsgY2VyciA8PCAiRkFMU0VcbiI7cmV0dXJuIGk9MDt9Ci0gIHJldHVybiBpPWF0b2kocy5jX3N0cigpKTsgCi19Ci1pbmxpbmUgZG91YmxlIG1Db252ZXJ0KGNvbnN0IHN0cmluZyZzLGRvdWJsZSAmZCkgeyByZXR1cm4gZD1hdG9mKHMuY19zdHIoKSk7IH0KLWlubGluZSBkb3VibGUgbUNvbnZlcnQoY29uc3Qgc3RyaW5nJnMsZmxvYXQgJmQpIHsgcmV0dXJuIGQ9YXRvZihzLmNfc3RyKCkpOyB9Ci1pbmxpbmUgc3RyaW5nIG1Db252ZXJ0KGNvbnN0IHN0cmluZyZzLHN0cmluZyZuKSB7IHJldHVybiBuPXM7IH0KLWlubGluZSBib29sIG1Db252ZXJ0KGNvbnN0IHN0cmluZyZzLGJvb2wmbikgeyAKLSAgaWYoIHN0cmNhc2VjbXAocy5jX3N0cigpLCJ5ZXMiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInkiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInRydWUiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInQiKT09MCApIHsgY2VyciA8PCAiVFJVRVxuIjtyZXR1cm4gbj0xO30KLSAgaWYoIHN0cmNhc2VjbXAocy5jX3N0cigpLCJubyIpPT0wIHx8ICBzdHJjYXNlY21wKHMuY19zdHIoKSwibiIpPT0wIHx8ICBzdHJjYXNlY21wKHMuY19zdHIoKSwiZmFsc2UiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksImYiKT09MCApIHsgY2VyciA8PCAiRkFMU0VcbiI7cmV0dXJuIG49MDt9Ci0gIHJldHVybiBuPWF0b2kocy5jX3N0cigpKTsgCi19Ci1pbmxpbmUgc2hvcnQgbUNvbnZlcnQoY29uc3Qgc3RyaW5nJnMsc2hvcnQmbikgeyAKLSAgaWYoIHN0cmNhc2VjbXAocy5jX3N0cigpLCJ5ZXMiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInkiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInRydWUiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInQiKT09MCApIHsgY2VyciA8PCAiVFJVRVxuIjtyZXR1cm4gbj0xO30KLSAgaWYoIHN0cmNhc2VjbXAocy5jX3N0cigpLCJubyIpPT0wIHx8ICBzdHJjYXNlY21wKHMuY19zdHIoKSwibiIpPT0wIHx8ICBzdHJjYXNlY21wKHMuY19zdHIoKSwiZmFsc2UiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksImYiKT09MCApIHsgY2VyciA8PCAiRkFMU0VcbiI7cmV0dXJuIG49MDt9Ci0gIHJldHVybiBuPWF0b2kocy5jX3N0cigpKTsgCi19Ci1pbmxpbmUgdW5zaWduZWQgc2hvcnQgbUNvbnZlcnQoY29uc3Qgc3RyaW5nJnMsdW5zaWduZWQgc2hvcnQmbikgeyAKLSAgaWYoIHN0cmNhc2VjbXAocy5jX3N0cigpLCJ5ZXMiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInkiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInRydWUiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksInQiKT09MCApIHsgY2VyciA8PCAiVFJVRVxuIjtyZXR1cm4gbj0xO30KLSAgaWYoIHN0cmNhc2VjbXAocy5jX3N0cigpLCJubyIpPT0wIHx8ICBzdHJjYXNlY21wKHMuY19zdHIoKSwibiIpPT0wIHx8ICBzdHJjYXNlY21wKHMuY19zdHIoKSwiZmFsc2UiKT09MCB8fCAgc3RyY2FzZWNtcChzLmNfc3RyKCksImYiKT09MCApIHsgY2VyciA8PCAiRkFMU0VcbiI7cmV0dXJuIG49MDt9Ci0gIHJldHVybiBuPWF0b2kocy5jX3N0cigpKTsgCi19Ci0KLXN0cmluZyBzaW1wbGVTdHJpbmcoY29uc3Qgc3RyaW5nIHMpOwotCi1pbmxpbmUgaW50IEhhc2hzdHJpbmcoY29uc3Qgc3RyaW5nJiBzKQotewotICBpbnQgc3VtPTA7Ci0gIHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaT1zLmJlZ2luKCksZW5kPXMuZW5kKCk7Ci0gIGZvcig7aSE9ZW5kO2krKylzdW09NSpzdW0rKCppKTsKLSAgcmV0dXJuIHN1bTsKLX0KLQotY2xhc3MgX1BhcmFtZXRlcgotewotIHByb3RlY3RlZDoKLSAgc3RyaW5nIG5hbWU7Ci0gIGJvb2wgKmlmQ2hhbmdlZDsKLSAgc3RyaW5nIGRlc2NyaXB0aW9uOwotICBpbnQgbGV2ZWw7Ci0gIGJvb2wgZmlsZW5hbWU7Ci0gcHVibGljOgotICBpbnQgb25seUNvcHk7Ci0gIF9QYXJhbWV0ZXIoc3RyaW5nIG4sYm9vbCZiLHN0cmluZyBkZXNjLGludCBfbGV2ZWwsYm9vbCBfb25seUNvcHkpCi0gICAgOiBuYW1lKHNpbXBsZVN0cmluZyhuKSksaWZDaGFuZ2VkKCZiKSxkZXNjcmlwdGlvbihkZXNjKSxsZXZlbChfbGV2ZWwpLGZpbGVuYW1lKDApLG9ubHlDb3B5KF9vbmx5Q29weSkge30KLSAgdmlydHVhbCB+X1BhcmFtZXRlcigpe307Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzdHJpbmcmcyljb25zdAotICAgIHsgcmV0dXJuIG5hbWU9PSBzaW1wbGVTdHJpbmcocyk7IH0KLSAgdm9pZCBzZXRDaGFuZ2VkKCkgCi0gICAgeyAqaWZDaGFuZ2VkPXRydWU7IH0KLSAgdmlydHVhbCBib29sIHNldFBhcmFtZXRlcihzdHJpbmcgczIsaW50KT0wOwotICB2aXJ0dWFsIG9zdHJlYW0mcHJpbnRBdChvc3RyZWFtJm91dCk9MDsKLSAgdmlydHVhbCBvc3RyZWFtJnByaW50VmFsdWUob3N0cmVhbSZvdXQpPTA7Ci0gIGNvbnN0IHN0cmluZyZnZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBuYW1lOyB9Ci0gIGludCBnZXRMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIGxldmVsO30KLSAgYm9vbCBpc0ZpbGVuYW1lKCkgeyByZXR1cm4gZmlsZW5hbWU7fQotICB2b2lkIHNldEZpbGVuYW1lKGJvb2wgeD0xKSB7IGZpbGVuYW1lPXg7fQotICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9QYXJhbWV0ZXImYSxjb25zdCBfUGFyYW1ldGVyJmIpCi0gICAgeyByZXR1cm4gYS5uYW1lPT1iLm5hbWU7IH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0IF9QYXJhbWV0ZXImYSxjb25zdCBfUGFyYW1ldGVyJmIpCi0gICAgeyByZXR1cm4gYS5uYW1lPGIubmFtZTsgfQotICBmcmllbmQgaW50IEhhc2goY29uc3QgX1BhcmFtZXRlciZhYWEpCi0gICAgeyByZXR1cm4gSGFzaHN0cmluZyhhYWEubmFtZSk7IH0KLSAgZnJpZW5kIG9zdHJlYW0mb3BlcmF0b3I8PChvc3RyZWFtJm91dCxjb25zdCBfUGFyYW1ldGVyJnApCi0gICAgeyByZXR1cm4gb3V0PDwiUGFyYW1ldGVyOiAiPDxwLm5hbWUgPDxlbmRsO30KLX07Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1jbGFzcyBQYXJhbWV0ZXIgOiBwdWJsaWMgX1BhcmFtZXRlcgotewotIHByaXZhdGU6Ci0gIFQqdDsKLSBwdWJsaWM6Ci0gIFBhcmFtZXRlcihzdHJpbmcgbixib29sJmIsc3RyaW5nIGRlc2MsVCZfdCxpbnQgbGV2ZWw9MCxib29sIG9ubHlDb3B5PTApCi0gICAgOiBfUGFyYW1ldGVyKG4sYixkZXNjLGxldmVsLG9ubHlDb3B5KSx0KCZfdCkge30KLSAgdmlydHVhbCB+UGFyYW1ldGVyKCl7fQotICB2aXJ0dWFsIGJvb2wgc2V0UGFyYW1ldGVyKHN0cmluZyBzMixpbnQgdmVyYikKLSAgICB7IAotICAgICAgVCB4OyAgCi0gICAgICBpZiggISgqdD09bUNvbnZlcnQoczIseCkpKQotCXsKLQkgIGJvb2wgcHJpbnRlZEZpcnN0PTA7Ci0JICBpZiggdmVyYj4xICkgCi0JICAgIHsKLQkgICAgICBjb3V0IDw8ICJQYXJhbWV0ZXIgJyI8PG5hbWUgPDwiJyBjaGFuZ2VkIGZyb20gJyI8PCp0PDwiJyB0byAnIjsKLQkgICAgICBwcmludGVkRmlyc3Q9MTsKLQkgICAgfQotCSAgbUNvbnZlcnQoczIsKnQpOwotCSAgaWYoIHByaW50ZWRGaXJzdCApIAotCSAgICBjb3V0IDw8ICp0IDw8IidcbiI7Ci0JICBzZXRDaGFuZ2VkKCk7Ci0JICByZXR1cm4gMTsKLQl9IAotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB2aXJ0dWFsIG9zdHJlYW0mcHJpbnRBdChvc3RyZWFtJm91dCkKLSAgICB7cmV0dXJuIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8ICp0IDw8ICIgICgiIDw8IGRlc2NyaXB0aW9uIDw8ICIpIjt9Ci0gIHZpcnR1YWwgb3N0cmVhbSZwcmludFZhbHVlKG9zdHJlYW0mb3V0KQotICAgIHtyZXR1cm4gb3V0IDw8ICp0O30KLX07Ci0KLXR5cGVkZWYgTVA8X1BhcmFtZXRlcj4gUGFyUHRyOwotCi1jbGFzcyBQYXJTZXQgOiBwdWJsaWMgc2V0PFBhclB0cj4KLXsKLSBwdWJsaWM6Ci0gIHZvaWQgaW5zZXJ0KGNvbnN0IFBhclB0ciZ4KQotICAgIHsKLSAgICAgIGlmKCBjb3VudCh4KSE9MCApCi0JY2VyciA8PCAiRVJST1I6IGVsZW1lbnQgIiA8PCB4LT5nZXRTdHJpbmcoKSA8PCAiIGFscmVhZHkgaW5zZXJ0ZWQuXG4iOwotICAgICAgc2V0PFBhclB0cj46Omluc2VydCh4KTsKLSAgICB9Ci19OwotCi1ib29sIG1ha2VTZXRDb21tYW5kKHN0cmluZyBzMSxzdHJpbmcgczIsY29uc3QgUGFyU2V0JnBhcnMsaW50IHZlcmI9MSxpbnQgbGV2ZWw9IC0xKTsKLW9zdHJlYW0mcHJpbnRQYXJzKG9zdHJlYW0mb3V0LGNvbnN0IFBhclNldCZwYXJzLGludCBsZXZlbD0tMSk7Ci1ib29sIHdyaXRlUGFyYW1ldGVycyhvZnN0cmVhbSZvZixjb25zdCBQYXJTZXQmcGFyc2V0LGludCBsZXZlbD0wKTsKLWJvb2wgcmVhZFBhcmFtZXRlcnMoaWZzdHJlYW0mZixjb25zdCBQYXJTZXQmcGFyc2V0LGludCB2ZXJiPTIsaW50IGxldmVsPTApOwotUGFyU2V0JmdldEdsb2JhbFBhclNldCgpOwotZXh0ZXJuIGJvb2wgUGFyYW1ldGVyQ2hhbmdlZEZsYWc7Ci10ZW1wbGF0ZTxjbGFzcyBUPmNvbnN0IFQmYWRkR2xvYmFsUGFyYW1ldGVyKGNvbnN0IGNoYXIgKm5hbWUsY29uc3QgY2hhciAqZGVzY3JpcHRpb24saW50IGxldmVsLFQqYWRyLGNvbnN0IFQmaW5pdCkKLXsKLSAgKmFkcj1pbml0OwotICBnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxUPihuYW1lLFBhcmFtZXRlckNoYW5nZWRGbGFnLGRlc2NyaXB0aW9uLCphZHIsbGV2ZWwpKTsKLSAgcmV0dXJuIGluaXQ7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUPmNvbnN0IFQmYWRkR2xvYmFsUGFyYW1ldGVyKGNvbnN0IGNoYXIgKm5hbWUsY29uc3QgY2hhciAqbmFtZTIsY29uc3QgY2hhciAqZGVzY3JpcHRpb24saW50IGxldmVsLFQqYWRyLGNvbnN0IFQmaW5pdCkKLXsKLSAgKmFkcj1pbml0OwotICBnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxUPihuYW1lLFBhcmFtZXRlckNoYW5nZWRGbGFnLGRlc2NyaXB0aW9uLCphZHIsbGV2ZWwpKTsKLSAgZ2V0R2xvYmFsUGFyU2V0KCkuaW5zZXJ0KG5ldyBQYXJhbWV0ZXI8VD4obmFtZTIsUGFyYW1ldGVyQ2hhbmdlZEZsYWcsZGVzY3JpcHRpb24sKmFkciwtMSkpOwotICByZXR1cm4gaW5pdDsKLX0KLXRlbXBsYXRlPGNsYXNzIFQ+Y29uc3QgVCZhZGRHbG9iYWxQYXJhbWV0ZXIoY29uc3QgY2hhciAqbmFtZSxjb25zdCBjaGFyICpuYW1lMixjb25zdCBjaGFyICpuYW1lMyxjb25zdCBjaGFyICpkZXNjcmlwdGlvbixpbnQgbGV2ZWwsVCphZHIsY29uc3QgVCZpbml0KQotewotICAqYWRyPWluaXQ7Ci0gIGdldEdsb2JhbFBhclNldCgpLmluc2VydChuZXcgUGFyYW1ldGVyPFQ+KG5hbWUsUGFyYW1ldGVyQ2hhbmdlZEZsYWcsZGVzY3JpcHRpb24sKmFkcixsZXZlbCkpOwotICBnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxUPihuYW1lMixQYXJhbWV0ZXJDaGFuZ2VkRmxhZyxkZXNjcmlwdGlvbiwqYWRyLC0xKSk7Ci0gIGdldEdsb2JhbFBhclNldCgpLmluc2VydChuZXcgUGFyYW1ldGVyPFQ+KG5hbWUzLFBhcmFtZXRlckNoYW5nZWRGbGFnLGRlc2NyaXB0aW9uLCphZHIsLTEpKTsKLSAgcmV0dXJuIGluaXQ7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUPmNvbnN0IFQmYWRkR2xvYmFsUGFyYW1ldGVyKGNvbnN0IGNoYXIgKm5hbWUsY29uc3QgY2hhciAqbmFtZTIsY29uc3QgY2hhciAqbmFtZTMsY29uc3QgY2hhciAqbmFtZTQsY29uc3QgY2hhciAqZGVzY3JpcHRpb24saW50IGxldmVsLFQqYWRyLGNvbnN0IFQmaW5pdCkKLXsKLSAgKmFkcj1pbml0OwotICBnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxUPihuYW1lLFBhcmFtZXRlckNoYW5nZWRGbGFnLGRlc2NyaXB0aW9uLCphZHIsbGV2ZWwpKTsKLSAgZ2V0R2xvYmFsUGFyU2V0KCkuaW5zZXJ0KG5ldyBQYXJhbWV0ZXI8VD4obmFtZTIsUGFyYW1ldGVyQ2hhbmdlZEZsYWcsZGVzY3JpcHRpb24sKmFkciwtMSkpOwotICBnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxUPihuYW1lMyxQYXJhbWV0ZXJDaGFuZ2VkRmxhZyxkZXNjcmlwdGlvbiwqYWRyLC0xKSk7Ci0gIGdldEdsb2JhbFBhclNldCgpLmluc2VydChuZXcgUGFyYW1ldGVyPFQ+KG5hbWU0LFBhcmFtZXRlckNoYW5nZWRGbGFnLGRlc2NyaXB0aW9uLCphZHIsLTEpKTsKLSAgcmV0dXJuIGluaXQ7Ci19Ci12b2lkIE1ha2VQYXJhbWV0ZXJPcHRpbWl6aW5nKGlzdHJlYW0mZmlsZSxzdHJpbmcgcmVzdWx0aW5nUGFyYW1ldGVycyk7Ci0KLSNkZWZpbmUgR0xPQkFMX1BBUkFNRVRFUihUWVAsVkFSTkFNRSxOQU1FLERFU0NSSVBUSU9OLExFVkVMLElOSVQpIFRZUCBWQVJOQU1FPWFkZEdsb2JhbFBhcmFtZXRlcjwgVFlQID4oTkFNRSxERVNDUklQVElPTixMRVZFTCwmVkFSTkFNRSxJTklUKTsKLSNkZWZpbmUgR0xPQkFMX1BBUkFNRVRFUjIoVFlQLFZBUk5BTUUsTkFNRSxOQU1FMixERVNDUklQVElPTixMRVZFTCxJTklUKSBUWVAgVkFSTkFNRT1hZGRHbG9iYWxQYXJhbWV0ZXI8IFRZUCA+KE5BTUUsTkFNRTIsREVTQ1JJUFRJT04sTEVWRUwsJlZBUk5BTUUsSU5JVCk7Ci0jZGVmaW5lIEdMT0JBTF9QQVJBTUVURVIzKFRZUCxWQVJOQU1FLE5BTUUsTkFNRTIsTkFNRTMsREVTQ1JJUFRJT04sTEVWRUwsSU5JVCkgVFlQIFZBUk5BTUU9YWRkR2xvYmFsUGFyYW1ldGVyPCBUWVAgPihOQU1FLE5BTUUyLE5BTUUzLERFU0NSSVBUSU9OLExFVkVMLCZWQVJOQU1FLElOSVQpOwotI2RlZmluZSBHTE9CQUxfUEFSQU1FVEVSNChUWVAsVkFSTkFNRSxOQU1FLE5BTUUyLE5BTUUzLE5BTUU0LERFU0NSSVBUSU9OLExFVkVMLElOSVQpIFRZUCBWQVJOQU1FPWFkZEdsb2JhbFBhcmFtZXRlcjwgVFlQID4oTkFNRSxOQU1FMixOQU1FMyxOQU1FNCxERVNDUklQVElPTixMRVZFTCwmVkFSTkFNRSxJTklUKTsKLQotdm9pZCBzZXRQYXJhbWV0ZXJMZXZlbE5hbWUodW5zaWduZWQgaW50IGksc3RyaW5nIHgpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL1BlcnBsZXhpdHkuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvUGVycGxleGl0eS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYTFmODEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvUGVycGxleGl0eS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLS8qIFBlcnBsZXhpdHkuY2MKLSAqID09PT09PT09PT09PT0KLSAqIE1pa2UgSmFociwgNy8yMS85OQotICogTWFjaGluZSBUcmFuc2xhdGlvbiBncm91cCwgV1M5OQotICogQ2VudGVyIGZvciBMYW5ndWFnZSBhbmQgU3BlZWNoIFByb2Nlc3NpbmcKLSAqIAotICogTGFzdCBNb2RpZmllZCBieTogWWFzZXIgQWwtT25haXphbiwgQXVndXN0IDE3LCAxOTk5Ci0gKgotICogU2ltcGxlIGNsYXNzIHVzZWQgdG8gY2FsY3VsYXRlIGNyb3NzIGVudHJvcHkgYW5kIHBlcnBsZXhpdHkKLSAqIG9mIG1vZGVscy4KLSAqLwotCi0jaW5jbHVkZSAiUGVycGxleGl0eS5oIgotCi12b2lkIFBlcnBsZXhpdHk6OnJlY29yZChzdHJpbmcgbW9kZWwpewotICBtdXRleC5sb2NrKCk7Ci0gIG1vZGVsaWQucHVzaF9iYWNrKG1vZGVsKTsKLSAgcGVycC5wdXNoX2JhY2socGVycGxleGl0eSgpKTsKLSAgY2UucHVzaF9iYWNrKGNyb3NzX2VudHJvcHkoKSk7Ci0gIG11dGV4LnVubG9jaygpOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvUGVycGxleGl0eS5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvUGVycGxleGl0eS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWNjODRmLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL1BlcnBsZXhpdHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLS8qIFBlcnBsZXhpdHkuaAotICogPT09PT09PT09PT09Ci0gKiBNaWtlIEphaHIsIDcvMTUvOTkKLSAqIE1hY2hpbmUgVHJhbnNsYXRpb24gZ3JvdXAsIFdTOTkKLSAqIENlbnRlciBmb3IgTGFuZ3VhZ2UgYW5kIFNwZWVjaCBQcm9jZXNzaW5nCi0gKiAKLSAqIExhc3QgTW9kaWZpZWQgYnk6IFlhc2VyIEFsLU9uYWl6YW4sIEF1Z3VzdCAxNywgMTk5OQotICoKLSAqIFNpbXBsZSBjbGFzcyB1c2VkIHRvIGNhbGN1bGF0ZSBjcm9zcyBlbnRyb3B5IGFuZCBwZXJwbGV4aXR5Ci0gKiBvZiBtb2RlbHMuCi0gKi8KLQotI2lmbmRlZiBfUEVSUExFWElUWV9ICi0jZGVmaW5lIF9QRVJQTEVYSVRZX0gKLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgIlZlY3Rvci5oIgotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJBcnJheTIuaCIKLSNpbmNsdWRlICJHbG9iYWxzLmgiCi0jaW5jbHVkZSAic3luY09iai5oIgotCi0jZGVmaW5lIENST1NTX0VOVFJPUFlfQkFTRSAyCi0KLWNsYXNzIFBlcnBsZXhpdHkgewotIHByaXZhdGU6Ci0gICAgZG91YmxlIHN1bTsKLSAgICBkb3VibGUgd2M7Ci0gICAgQXJyYXkyPGRvdWJsZSwgVmVjdG9yPGRvdWJsZT4gPiAqRV9NX0w7Ci0gICAgVmVjdG9yPHN0cmluZz4gbW9kZWxpZDsKLSAgICBWZWN0b3I8ZG91YmxlID4gcGVycDsKLSAgICBWZWN0b3I8ZG91YmxlID4gY2U7Ci0gICAgVmVjdG9yPHN0cmluZz4gbmFtZSA7Ci0JTXV0ZXggbXV0ZXg7Ci0gcHVibGljOgotCX5QZXJwbGV4aXR5KCkgeyBkZWxldGUgRV9NX0w7fQotCVBlcnBsZXhpdHkoKSB7Ci0JCUVfTV9MICA9IG5ldyBBcnJheTI8ZG91YmxlLCBWZWN0b3I8ZG91YmxlPiA+KE1BWF9TRU5URU5DRV9MRU5HVEgsTUFYX1NFTlRFTkNFX0xFTkdUSCk7Ci0JCXVuc2lnbmVkIGludCBsLCBtIDsKLQkJVmVjdG9yPGRvdWJsZT4gZmFjdChNQVhfU0VOVEVOQ0VfTEVOR1RILCAxLjApOwotCQlmb3IgKG0gPSAyIDsgbSA8IE1BWF9TRU5URU5DRV9MRU5HVEggOyBtKyspCi0JCQlmYWN0W21dID0gZmFjdFttLTFdICogbSA7Ci0JCWZvciAobSA9IDEgOyBtIDwgTUFYX1NFTlRFTkNFX0xFTkdUSCA7IG0rKykKLQkJCWZvciAobCA9IDEgOyBsIDwgTUFYX1NFTlRFTkNFX0xFTkdUSCA7IGwrKykgewotCQkJCSgqRV9NX0wpKGwsIG0pID0gbG9nIChwb3coKExBTUJEQSAqIGwpLCBkb3VibGUobSkpICogZXhwKC1MQU1CREEgKiBkb3VibGUobCkpIC8gCi0JCQkJCQkJCQkgIChmYWN0W21dKSkgOwotCQkJfQotCQlzdW0gPSAwIDsKLQkJd2MgPSAwOwotCQlwZXJwLmNsZWFyKCk7Ci0JCWNlLmNsZWFyKCk7Ci0JCW5hbWUuY2xlYXIoKTsKLQl9Ci0gICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7Ci0JICBtdXRleC5sb2NrKCk7Ci0gICAgICBzdW0gPSAwIDsKLSAgICAgIHdjID0gMCA7Ci0JICBtdXRleC51bmxvY2soKTsKLSAgICB9Ci0gICAgc2l6ZV90IHNpemUoKSBjb25zdCB7cmV0dXJuKG1pbihwZXJwLnNpemUoKSwgY2Uuc2l6ZSgpKSk7fQotCWlubGluZSB2b2lkIGFkZEZhY3Rvcihjb25zdCBkb3VibGUgcCwgY29uc3QgZG91YmxlIGNvdW50LCBjb25zdCBpbnQgbCwgCi0JCQkJCQkgIGNvbnN0IGludCBtLGJvb2wgd2l0aFBvaXNzb24pIHsKLQkJbXV0ZXgubG9jaygpOwotCQl3YyArPSBjb3VudCAqIG0gOyAvLyBudW1iZXIgb2YgZnJlbmNoIHdvcmRzIAotCQlzdW0gKz0gY291bnQgKiAoICh3aXRoUG9pc3Nvbj8oKCpFX01fTCkobCwgbSkpOjAuMCkgKyBwKSA7Ci0JCW11dGV4LnVubG9jaygpOwotCX0KLSAgICAKLQlpbmxpbmUgZG91YmxlIHBlcnBsZXhpdHkoKSBjb25zdCB7Ci0JCXJldHVybiBleHAoIC0xKnN1bSAvIHdjKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgZG91YmxlIGNyb3NzX2VudHJvcHkoKSBjb25zdCB7Ci0JCXJldHVybiAoLTEuMCpzdW0gLyAobG9nKGRvdWJsZShDUk9TU19FTlRST1BZX0JBU0UpKSAqIHdjKSk7IAotICAgIH0KLQotICAgIGlubGluZSBkb3VibGUgd29yZF9jb3VudCgpIGNvbnN0IHsKLQkJcmV0dXJuIHdjOwotICAgIH0KLSAgICAKLSAgICBpbmxpbmUgZG91YmxlIGdldFN1bSgpIGNvbnN0IHsKLQkJcmV0dXJuIHN1bSA7Ci0gICAgfQotCi0gICAgdm9pZCByZWNvcmQoc3RyaW5nIG1vZGVsKTsKLSAgICAKLSAgICBmcmllbmQgdm9pZCBnZW5lcmF0ZVBlcnBsZXhpdHlSZXBvcnQoY29uc3QgUGVycGxleGl0eSYsIGNvbnN0IFBlcnBsZXhpdHkmLCAKLQkJCQkJIGNvbnN0IFBlcnBsZXhpdHkmLCBjb25zdCBQZXJwbGV4aXR5JiwgCi0JCQkJCSBvc3RyZWFtJiwgaW50LCBpbnQsIGJvb2wpOyAKLX07Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9Qb2ludGVyLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9Qb2ludGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZGU2MGMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvUG9pbnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2ggKFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0laQSsrICggZXh0ZW5zaW9uIG9mIEdJWkEgKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2lmbmRlZiBIRUFERVJfUG9pbnRlcl9ERUZJTkVECi0jZGVmaW5lIEhFQURFUl9Qb2ludGVyX0RFRklORUQKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi10ZW1wbGF0ZTxjbGFzcyBUPgotY2xhc3MgU21hcnRQb2ludGVyCi17Ci0gcHJvdGVjdGVkOgotICBUKnA7Ci0gcHVibGljOgotICBTbWFydFBvaW50ZXIoVCpfcD0wKSAKLSAgICA6IHAoX3ApIHt9Ci0gIGlubGluZSBUJm9wZXJhdG9yKigpIGNvbnN0IAotICAgIHtyZXR1cm4gKnA7fQotICBpbmxpbmUgVCpvcGVyYXRvci0+KCkgY29uc3QgCi0gICAge3JldHVybiBwO30KLSAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCAKLSAgICB7cmV0dXJuIHAhPTA7fQotICBpbmxpbmUgVCpwdHIoKSBjb25zdAotICAgIHsgcmV0dXJuIHA7IH0KLX07Ci10ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgb3N0cmVhbSAmb3BlcmF0b3I8PChvc3RyZWFtJm91dCxjb25zdCBTbWFydFBvaW50ZXI8VD4mcykKLXtpZiggcy5wdHIoKSApcmV0dXJuIG91dCA8PCAqcztlbHNlIHJldHVybiBvdXQgPDwibnVsbHBvaW50ZXIiO30KLQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotY2xhc3MgU21hcnRQb2ludGVyQ29uc3QKLXsKLSBwcm90ZWN0ZWQ6Ci0gIGNvbnN0IFQqcDsKLSBwdWJsaWM6Ci0gIFNtYXJ0UG9pbnRlckNvbnN0KGNvbnN0IFQqX3A9MCkgCi0gICAgOiBwKF9wKSB7fQotICBpbmxpbmUgY29uc3QgVCZvcGVyYXRvciooKSBjb25zdCAKLSAgICB7cmV0dXJuICpwO30KLSAgaW5saW5lIGNvbnN0IFQqb3BlcmF0b3ItPigpIGNvbnN0IAotICAgIHtyZXR1cm4gcDt9Ci0gIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QKLSAgICB7cmV0dXJuIHAhPTA7fQotICBpbmxpbmUgY29uc3QgVCpwdHIoKSBjb25zdAotICAgIHsgcmV0dXJuIHA7IH0KLX07Ci10ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgb3N0cmVhbSAmb3BlcmF0b3I8PChvc3RyZWFtJm91dCxjb25zdCBTbWFydFBvaW50ZXJDb25zdDxUPiZzKQote2lmKCBzLnB0cigpIClyZXR1cm4gb3V0IDw8ICpzO2Vsc2UgcmV0dXJuIG91dCA8PCJudWxscG9pbnRlciI7fQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWNsYXNzIFVQIDogcHVibGljIFNtYXJ0UG9pbnRlcjxUPgotewotIHB1YmxpYzoKLSAgVVAoVCpfcD0wKSAKLSAgICA6IFNtYXJ0UG9pbnRlcjxUPihfcCkge30KLX07Ci10ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVQPFQ+JnMxLGNvbnN0IFVQPFQ+JnMyKQote3JldHVybiBzMS5wdHIoKT09czIucHRyKCk7fQotdGVtcGxhdGU8Y2xhc3MgVD4gIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBVUDxUPiZzMSxjb25zdCBVUDxUPiZzMikKLXtyZXR1cm4gczEucHRyKCkgPCBzMi5wdHIoKTt9Ci10ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgaW50IEhhc2goY29uc3QgVVA8VD4gJndwKQote2lmKHdwLnB0cigpKXJldHVybiBIYXNoKCp3cCk7ZWxzZSByZXR1cm4gMDt9Ci0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jbGFzcyBVUENvbnN0IDogcHVibGljIFNtYXJ0UG9pbnRlckNvbnN0PFQ+Ci17Ci0gcHVibGljOgotICBVUENvbnN0KGNvbnN0IFQqX3A9MCkgCi0gICAgOiBTbWFydFBvaW50ZXJDb25zdDxUPihfcCkge30KLX07Ci10ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVQQ29uc3Q8VD4mczEsY29uc3QgVVBDb25zdDxUPiZzMikKLXtyZXR1cm4gczEucHRyKCk9PXMyLnB0cigpO30KLXRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBVUENvbnN0PFQ+JnMxLGNvbnN0IFVQQ29uc3Q8VD4mczIpCi17cmV0dXJuIHMxLnB0cigpPHMyLnB0cigpO30KLXRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBpbnQgSGFzaChjb25zdCBVUENvbnN0PFQ+ICZ3cCkKLXtpZih3cC5wdHIoKSlyZXR1cm4gSGFzaCgqd3ApO2Vsc2UgcmV0dXJuIDA7fQotCi0JCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWNsYXNzIE1QIDogcHVibGljIFNtYXJ0UG9pbnRlcjxUPgotewotIHB1YmxpYzoKLSAgTVAoVCpfcD0wKSAKLSAgICA6IFNtYXJ0UG9pbnRlcjxUPihfcCkge30KLX07Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNUDxUPiZzMSxjb25zdCBNUDxUPiZzMikKLXthc3NlcnQoczEpO2Fzc2VydChzMik7cmV0dXJuICpzMT09KnMyO30KLXRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTVA8VD4mczEsY29uc3QgTVA8VD4mczIpCi17YXNzZXJ0KHMxKTthc3NlcnQoczIpO3JldHVybiAqczEgPCAqczI7fQotdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBpbnQgSGFzaChjb25zdCBNUDxUPiAmd3ApCi17aWYod3AucHRyKCkpcmV0dXJuIEhhc2goKndwKTtlbHNlIHJldHVybiAwO30KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWNsYXNzIE1QQ29uc3QgOiBwdWJsaWMgU21hcnRQb2ludGVyQ29uc3Q8VD4KLXsKLSBwdWJsaWM6Ci0gIE1QQ29uc3QoY29uc3QgVCpfcD0wKSAKLSAgICA6IFNtYXJ0UG9pbnRlckNvbnN0PFQ+KF9wKSB7fQotfTsKLXRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1QQ29uc3Q8VD4mczEsY29uc3QgTVBDb25zdDxUPiZzMikKLXthc3NlcnQoczEpO2Fzc2VydChzMik7cmV0dXJuICpzMT09ICpzMjt9Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE1QQ29uc3Q8VD4mczEsY29uc3QgTVBDb25zdDxUPiZzMikKLXthc3NlcnQoczEpO2Fzc2VydChzMik7cmV0dXJuICpzMSA8ICpzMjt9Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGludCBIYXNoKGNvbnN0IE1QQ29uc3Q8VD4gJndwKQote2lmKHdwLnB0cigpKXJldHVybiBIYXNoKCp3cCk7ZWxzZSByZXR1cm4gMDt9Ci0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+IAotY2xhc3MgREVMUCA6IHB1YmxpYyBTbWFydFBvaW50ZXI8VD4KLXsKLSBwcml2YXRlOgotICBERUxQKGNvbnN0IERFTFA8VD4meCk7Ci0gcHVibGljOgotICBjb25zdCBERUxQPFQ+Jm9wZXJhdG9yPShERUxQPFQ+JngpCi0gIHsKLSAgICBkZWxldGUgdGhpcy0+cDsKLSAgICB0aGlzLT5wPXgucDt4LnA9MDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB+REVMUCgpCi0gICAgeyBkZWxldGUgdGhpcy0+cDt0aGlzLT5wPTA7fQotICBERUxQKFQqX3A9MCkgCi0gICAgOiBTbWFydFBvaW50ZXI8VD4oX3ApIHt9Ci0gIHZvaWQgc2V0KFQqX3ApCi0gICAgewotICAgICAgZGVsZXRlIHRoaXMtPnA7Ci0gICAgICB0aGlzLT5wPV9wOwotICAgIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBERUxQPFQ+JnMxLGNvbnN0IERFTFA8VD4mczIpCi0gICAgewotICAgICAgcmV0dXJuICooczEucCk9PSAqKHMyLnApOwotICAgIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERFTFA8VD4mczEsY29uc3QgREVMUDxUPiZzMikKLSAgICB7Ci0gICAgICByZXR1cm4gKihzMS5wKSA8ICooczIucCk7Ci0gICAgfQotICBmcmllbmQgaW5saW5lIGludCBIYXNoKGNvbnN0IERFTFA8VD4gJndwKQotICAgIHsKLSAgICAgIGlmKHdwLnApCi0JcmV0dXJuIEhhc2goKndwLnApOwotICAgICAgZWxzZSAKLQlyZXR1cm4gMDsKLSAgICB9Ci19OwotI2VuZGlmCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL1NldEFycmF5LmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL1NldEFycmF5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxOTE4OC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9TZXRBcnJheS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQotLy8jaW5jbHVkZSAiU2V0QXJyYXkuaCIKLQotI2luY2x1ZGUgIlBhcmFtZXRlci5oIgotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9TZXRBcnJheS5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvU2V0QXJyYXkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0OTIzOS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9TZXRBcnJheS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi1BcnJheSBvZiBzZXQsIGZvciBmYXN0IGFjY2VzcyBvZiBkaWN0aW9uYXJ5LCBhbmQgbW9zdCBpbXBvcnRhbnQsCi1iZSB0aHJlYWRzYWZlCi0qLwotCi0KLSNpZm5kZWYgX19TRVRfQVJSQVlfSF9fCi0jZGVmaW5lIF9fU0VUX0FSUkFZX0hfXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAidm9jYWIuaCIgIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgInN5bmNPYmouaCIKLQotdGVtcGxhdGUgPGNsYXNzIENPVU5ULCBjbGFzcyBQUk9CPgotY2xhc3MgTHBQYWlyIHsKLXB1YmxpYzoKLSAgICBDT1VOVCBjb3VudCA7Ci0gICAgUFJPQiAgcHJvYiA7Ci1wdWJsaWM6IC8vIGNvbnN0cnVjdG9yIAotICAgIExwUGFpcigpOmNvdW50KDApLCBwcm9iKDApe30gOwotICAgIExwUGFpcihDT1VOVCBjLCBQUk9CIHApOmNvdW50KGMpLCBwcm9iKHApe307Ci19IDsKLQotCi0KLQotdGVtcGxhdGUgPGNsYXNzIENPVU5ULCBjbGFzcyBQUk9CPgotY2xhc3MgU2V0QXJyYXl7Ci1wdWJsaWM6Ci0gICAgICAgICB0eXBlZGVmIExwUGFpcjxDT1VOVCwgUFJPQj4gQ1BQYWlyOwotcHJvdGVjdGVkOgotICAgIAotICAgIC8qSW5mb3JtYXRpb24gc3RvcmVzIGhlcmUqLwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6bWFwPHNpemVfdCxDUFBhaXI+ID4gc3RvcmU7Ci0gICAgc3RkOjp2ZWN0b3I8TXV0ZXg+IG11dHM7Ci0gICAgc2l6ZV90IG5FbmdsaXNoV29yZDsKLSAgICBzaXplX3QgbkZyZW5jaFdvcmQ7Ci0gICAgdm9pZCBfaW5pdCgpewotICAgICAgICBzdG9yZS5yZXNpemUobkVuZ2xpc2hXb3JkKTsKLSAgICAgICAgbXV0cy5yZXNpemUobkZyZW5jaFdvcmQpOwotICAgIH0KLSAgICAKLXB1YmxpYzoKLSAgICAgICAKLSAgICAvKgotICAgICAgICBHZXQgcmVmZXJlbmNlLCBub3QgY3JlYXRpbmcKLSAgICAqLwotICAgIENQUGFpciogZmluZChzaXplX3QgZmksIHNpemVfdCBzaSl7Ci0gICAgICAgIC8qSEVSRTogbG9jaywgdW5sb2NrIGFmdGVyIHdlIGdldCB0aGUgcG9pbnRlciovCi0gICAgICAgIG11dHNbZmldLmxvY2soKTsKLSAgICAgICAgLyogU3luYy1lZCAqLwotICAgICAgICBzdGQ6Om1hcDxzaXplX3QsQ1BQYWlyPiYgdyA9IHN0b3JlW2ZpXTsKLSAgICAgICAgdHlwZW5hbWUgc3RkOjptYXA8c2l6ZV90LENQUGFpcj46Oml0ZXJhdG9yIGl0ID0gdy5maW5kKChzaXplX3Qpc2kpOwotICAgICAgICBDUFBhaXIqIHEgPSAoIGl0IT1zdG9yZVtmaV0uZW5kKCkgPyAmKGl0LT5zZWNvbmQpIDogMCk7Ci0vLyAgICAgICAgZm9yKGl0ID0gdy5iZWdpbigpOyBpdCE9dy5lbmQoKTtpdCsrKXsKLSAvLyAgICAgICAgICAgY291dCA8PCBpdC0+Zmlyc3QgPDwgZW5kbDsKLSAvLyAgICAgICB9Ci0gICAgICAgIC8qIEVuZCBTeW5jZWQqLwotICAgICAgICBtdXRzW2ZpXS51bmxvY2soKTsKLSAgICAgICAgcmV0dXJuIHE7Ci0gICAgfTsKLSAgICAKLSAgICAvKgotICAgICAgICBHZXQgcmVmZXJlbmNlLCBjcmVhdGluZyBpdAotICAgICovCi0gICAgaW5saW5lIENQUGFpciYgZmluZFJlZihzaXplX3QgZmksIHNpemVfdCBzaSl7Ci0gICAgICAgIHN0ZDo6bWFwPHNpemVfdCxDUFBhaXI+ICZ4ID0gc3RvcmVbZmldOwotICAgICAgICBtdXRzW2ZpXS5sb2NrKCk7Ci0gICAgICAgIC8qIFN5bmMtZWQgKi8KLSAgICAgICAgQ1BQYWlyJiByZWY9IHhbc2ldOwotICAgICAgICAvKiBFbmQgU3luY2VkICovCi0gICAgICAgIG11dHNbZmldLnVubG9jaygpOwotICAgIH07Ci0KLSAgICAKLSAgICB2b2lkIGluc2VydChzaXplX3QgZmksIHNpemVfdCBzaSwgQ09VTlQgY291bnQgPSAwLCBQUk9CIHByb2IgPSAwKXsKLSAgICAgICAgbXV0c1tmaV0ubG9jaygpOwotICAgICAgICAvKlN5Y2VkKi8KLSAgICAgICAgc3RkOjptYXA8c2l6ZV90LENQUGFpcj4gJnggPSBzdG9yZVtmaV07Ci0gICAgICAgIENQUGFpciYgdj0geFtzaV07Ci0gICAgICAgIHYuY291bnQgPSBjb3VudDsKLSAgICAgICAgdi5wcm9iID0gcHJvYjsKLSAgICAgICAgbXV0c1tmaV0udW5sb2NrKCk7Ci0gICAgfQotICAgIAotICAgIHZvaWQgaW5jQ291bnQoc2l6ZV90IGUsIHNpemVfdCBmLCBDT1VOVCBpbmMpIAotICAgICAgICAvLyBpbmNyZW1lbnRzIHRoZSBjb3VudCBvZiB0aGUgZ2l2ZW4gd29yZCBwYWlyLiBpZiB0aGUgcGFpciBkb2VzIG5vdCBleGlzdCwgCi0gICAgICAgIC8vIGl0IGNyZWF0ZXMgaXQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBpbmMgKXsKLSAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzaXplX3QsQ1BQYWlyPiAmeCA9IHN0b3JlW2VdOwotICAgICAgICAgICAgICAgIG11dHNbZV0ubG9jaygpOwotICAgICAgICAgICAgICAgIENQUGFpciYgcmVmPSB4W2ZdOwotICAgICAgICAgICAgICAgIHJlZi5jb3VudCArPSBpbmM7Ci0gICAgICAgICAgICAgICAgbXV0c1tlXS51bmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgUFJPQiBnZXRQcm9iKHNpemVfdCBlLCBzaXplX3QgZikgY29uc3QKLSAgICAgICAgLy8gcmVhZCBwcm9iYWJpbGl0eSB2YWx1ZSBmb3IgUChmai9laSkgZnJvbSB0aGUgaGFzaCB0YWJsZSAKLSAgICAvLyBpZiBwYWlyIGRvZXMgbm90IGV4aXN0LCByZXR1cm4gZmxvb3IgdmFsdWUgUFJPQl9TTU9PVEgKLSAgICB7Ci0gICAgICAgIG11dHNbZV0ubG9jaygpOwotICAgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxzaXplX3QsQ1BQYWlyID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RvcmVbZV0uZmluZChmKTsKLSAgICAgICAgUFJPQiBiOwotICAgICAgICBpZihpdCA9PSBzdG9yZVtlXS5lbmQoKSkgIAotICAgICAgICAgICAgYiA9IFBST0JfU01PT1RIOyAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYj1tYXgoKGl0LT5zZWNvbmQpLnByb2IsIFBST0JfU01PT1RIKTsKLSAgICAgICAgbXV0c1tlXS51bmxvY2soKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotICAgIAotICAgIENPVU5UIGdldENvdW50KHNpemVfdCBlLCBzaXplX3QgZikgY29uc3QKLSAgICAgICAgLyogcmVhZCBjb3VudCB2YWx1ZSBmb3IgZW50cnkgcGFpciAoZmovZWkpIGZyb20gdGhlIGhhc2ggdGFibGUgKi8KLSAgICB7Ci0gICAgICAgIG11dHNbZV0ubG9jaygpOwotICAgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxzaXplX3QsQ1BQYWlyID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RvcmVbZV0uZmluZChmKTsKLSAgICAgICAgQ09VTlQgYzsKLSAgICAgICAgaWYoaXQgPT0gc3RvcmVbZV0uZW5kKCkpICAKLSAgICAgICAgICAgIGMgPSAwOyAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYyA9ICgoKml0KS5zZWNvbmQpLmNvdW50OwotICAgICAgICBtdXRzW2VdLnVubG9jaygpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGVyYXNlKHNpemVfdCBlLCBzaXplX3QgZikKLSAgICAgICAgLy8gSW46IGEgc291cmNlIGFuZCBhIHRhcmdldCB0b2tlbiBpZHMuCi0gICAgICAgIC8vIHJlbW92ZXMgdGhlIGVudHJ5IHdpdGggdGhhdCBwYWlyIGZyb20gdGFibGUKLSAgICB7Ci0gICAgICAgIG11dHNbZV0ubG9jaygpOyAgIAotICAgICAgICBzdG9yZVtlXS5lcmFzZShmKTsKLSAgICAgICAgbXV0c1tlXS51bmxvY2soKTsKLSAgICB9OwotICAgIAotICAgIGlubGluZSB2b2lkIHNldE51bWJlck9mRW5saXNoKHNpemVfdCBlKXtuRW5nbGlzaFdvcmQ9ZTtfaW5pdCgpO307Ci0gICAgaW5saW5lIHZvaWQgc2V0TnVtYmVyT2ZGcmVuY2goc2l6ZV90IGYpe25GcmVuY2hXb3JkID0gZjt9OwotICAgIAotICAgIGNvbnN0IHN0ZDo6bWFwPHNpemVfdCxDUFBhaXI+JiBnZXRNYXAoc2l6ZV90IGkpIGNvbnN0ewotICAgICAgICByZXR1cm4gc3RvcmVbaV07Ci0gICAgfQotICAgIAotICAgIHN0ZDo6bWFwPHNpemVfdCxDUFBhaXI+JiBnZXRNYXAxKHNpemVfdCBpKXsKLSAgICAgICAgcmV0dXJuIHN0b3JlW2ldOwotICAgIH0KLSAgICAKLSAgICBTZXRBcnJheShzaXplX3QgZSwgc2l6ZV90IGYpOiBuRW5nbGlzaFdvcmQoZSksIG5GcmVuY2hXb3JkKGYpewotICAgICAgICBfaW5pdCgpOwotICAgIH0KLX07Ci0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL1RUYWJsZXMuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvVFRhYmxlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNGYzYjYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvVFRhYmxlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0gCi0qLwotI2luY2x1ZGUgIlRUYWJsZXMuaCIKLSNpbmNsdWRlICJQYXJhbWV0ZXIuaCIKLSNpbmNsdWRlPGlvc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0KLUdMT0JBTF9QQVJBTUVURVIoZmxvYXQsUFJPQl9DVVRPRkYsIlBST0IgQ1VUT0ZGIiwiUHJvYmFiaWxpdHkgY3V0b2ZmIHRocmVzaG9sZCBmb3IgbGV4aWNvbiBwcm9iYWJpbGl0aWVzIixQQVJMRVZfT1BUSEVVUiwxZS03KTsKLUdMT0JBTF9QQVJBTUVURVIyKGZsb2F0LCBDT1VOVElOQ1JFQVNFX0NVVE9GRiwiQ09VTlRJTkNSRUFTRSBDVVRPRkYiLCJjb3VudEN1dG9mZiIsIkNvdW50cyBpbmNyZW1lbnQgY3V0b2ZmIHRocmVzaG9sZCIsUEFSTEVWX09QVEhFVVIsMWUtNik7Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tIE1ldGhvZCBEZWZpbmlvdG5zIGZvciBDbGFzcyB0bW9kZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8vIFRvIG91dHB1dCB0byBTVERPVVQsIHN1Ym1pdCBmaWxlbmFtZSBhcyBOVUxMCi10ZW1wbGF0ZSA8Y2xhc3MgQ09VTlQsIGNsYXNzIFBST0I+Ci12b2lkIHRtb2RlbDxDT1VOVCwgUFJPQj46OnByaW50Q291bnRUYWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgCi0JCQkJCSBjb25zdCBWZWN0b3I8V29yZEVudHJ5PiYgZXZsaXN0LCAKLQkJCQkJIGNvbnN0IFZlY3RvcjxXb3JkRW50cnk+JiBmdmxpc3QsCi0JCQkJCSBjb25zdCBib29sIGFjdHVhbCkgY29uc3QKLXsKLQlvc3RyZWFtICp0b2Y7Ci0JCi0JaWYoZmlsZW5hbWUpCi0JCXRvZiA9IG5ldyBvZnN0cmVhbShmaWxlbmFtZSk7Ci0JZWxzZQotCQl0b2YgPSAmIGNvdXQ7Ci0JCi0Jb3N0cmVhbSAmb2YgPSAqdG9mOwotCS8qICBmb3IodW5zaWduZWQgaW50IGk9MDtpPGVzLnNpemUoKS0xOysraSkKLQlmb3IodW5zaWduZWQgaW50IGo9ZXNbaV07ajxlc1tpKzFdOysraikKLQl7Ci0JY29uc3QgQ1BQYWlyJng9ZnNbal0uc2Vjb25kOwotCVdvcmRJbmRleCBlPWksZj1mc1tqXS5maXJzdDsKLQlpZiggYWN0dWFsICkKLQlvZiA8PCBldmxpc3RbZV0ud29yZCA8PCAnICcgPDwgZnZsaXN0W2ZdLndvcmQgPDwgJyAnIDw8IHgucHJvYiA8PCAnXG4nOwotCWVsc2UKLQlvZiA8PCBlIDw8ICcgJyA8PCBmIDw8ICcgJyA8PCB4LnByb2IgPDwgJ1xuJzsKLQl9Ki8KLQlmb3IodW5zaWduZWQgaW50IGk9MDtpPGxleG1hdC5zaXplKCk7KytpKXsKLQkJaWYoIGxleG1hdFtpXSApewotCQkJZm9yKHVuc2lnbmVkIGludCBqPTA7ajxsZXhtYXRbaV0tPnNpemUoKTsrK2opCi0JCQl7ICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJY29uc3QgQ1BQYWlyJng9KCpsZXhtYXRbaV0pW2pdLnNlY29uZDsKLQkJCQlXb3JkSW5kZXggZT1pLGY9KCpsZXhtYXRbaV0pW2pdLmZpcnN0OwotCQkJCWlmKCB4LnByb2I+TUlOQ09VTlRJTkNSRUFTRSApewotCQkJCQlpZiggYWN0dWFsICl7Ci0JCQkJCQlvZiA8PCBldmxpc3RbZV0ud29yZCA8PCAnICcgPDwgZnZsaXN0W2ZdLndvcmQgPDwgJyAnIDw8IHguY291bnQgPDwgJ1xuJzsKLQkJCQkJfWVsc2V7Ci0JCQkJCQlvZiA8PCBlIDw8ICcgJyA8PCBmIDw8ICcgJyA8PCB4LmNvdW50IDw8ICdcbic7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JaWYoZmlsZW5hbWUpewotCQkoKG9mc3RyZWFtKil0b2YpLT5jbG9zZSgpOwotCQlkZWxldGUgdG9mOwotCX0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIENPVU5ULCBjbGFzcyBQUk9CPgotdm9pZCB0bW9kZWw8Q09VTlQsIFBST0I+OjpwcmludFByb2JUYWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgCi0JCQkJCSBjb25zdCBWZWN0b3I8V29yZEVudHJ5PiYgZXZsaXN0LCAKLQkJCQkJIGNvbnN0IFZlY3RvcjxXb3JkRW50cnk+JiBmdmxpc3QsCi0JCQkJCSBjb25zdCBib29sIGFjdHVhbCkgY29uc3QKLXsKLQlvZnN0cmVhbSBvZihmaWxlbmFtZSk7Ci0JLyogIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8ZXMuc2l6ZSgpLTE7KytpKQotCWZvcih1bnNpZ25lZCBpbnQgaj1lc1tpXTtqPGVzW2krMV07KytqKQotCXsKLQljb25zdCBDUFBhaXImeD1mc1tqXS5zZWNvbmQ7Ci0JV29yZEluZGV4IGU9aSxmPWZzW2pdLmZpcnN0OwotCWlmKCBhY3R1YWwgKQotCW9mIDw8IGV2bGlzdFtlXS53b3JkIDw8ICcgJyA8PCBmdmxpc3RbZl0ud29yZCA8PCAnICcgPDwgeC5wcm9iIDw8ICdcbic7Ci0JZWxzZQotCW9mIDw8IGUgPDwgJyAnIDw8IGYgPDwgJyAnIDw8IHgucHJvYiA8PCAnXG4nOwotCX0qLwotCWZvcih1bnNpZ25lZCBpbnQgaT0wO2k8bGV4bWF0LnNpemUoKTsrK2kpewotCQlpZiggbGV4bWF0W2ldICl7Ci0JCQlmb3IodW5zaWduZWQgaW50IGo9MDtqPGxleG1hdFtpXS0+c2l6ZSgpOysraikKLQkJCXsgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQljb25zdCBDUFBhaXImeD0oKmxleG1hdFtpXSlbal0uc2Vjb25kOwotCQkJCVdvcmRJbmRleCBlPWksZj0oKmxleG1hdFtpXSlbal0uZmlyc3Q7Ci0JCQkJaWYoIHgucHJvYj5QUk9CX1NNT09USCApewotCQkJCQlpZiggYWN0dWFsICl7Ci0JCQkJCQlvZiA8PCBldmxpc3RbZV0ud29yZCA8PCAnICcgPDwgZnZsaXN0W2ZdLndvcmQgPDwgJyAnIDw8IHgucHJvYiA8PCAnXG4nOwotCQkJCQl9ZWxzZXsKLQkJCQkJCW9mIDw8IGUgPDwgJyAnIDw8IGYgPDwgJyAnIDw8IHgucHJvYiA8PCAnXG4nOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgQ09VTlQsIGNsYXNzIFBST0I+Ci12b2lkIHRtb2RlbDxDT1VOVCwgUFJPQj46OnByaW50UHJvYlRhYmxlSW52ZXJzZShjb25zdCBjaGFyICosIAotCQkJCSAgIGNvbnN0IFZlY3RvcjxXb3JkRW50cnk+JiwgCi0JCQkJICAgY29uc3QgVmVjdG9yPFdvcmRFbnRyeT4mLCAKLQkJCQkgICBjb25zdCBkb3VibGUsIAotCQkJCSAgIGNvbnN0IGRvdWJsZSwgCi0JCQkJICAgY29uc3QgYm9vbCApIGNvbnN0Ci17Ci19Ci10ZW1wbGF0ZSA8Y2xhc3MgQ09VTlQsIGNsYXNzIFBST0I+Ci12b2lkIHRtb2RlbDxDT1VOVCwgUFJPQj46Om5vcm1hbGl6ZVRhYmxlKGNvbnN0IHZjYkxpc3QmLCBjb25zdCB2Y2JMaXN0JiwgaW50KQotewotICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8bGV4bWF0LnNpemUoKTsrK2kpewotICAgICAgICBkb3VibGUgYz0wLjA7Ci0gICAgICAgIGlmKCBsZXhtYXRbaV0gKXsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBsU2l6ZT1sZXhtYXRbaV0tPnNpemUoKTsKLSAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0wO2o8bFNpemU7KytqKQotICAgICAgICAgICAgICAgIGMrPSgqbGV4bWF0W2ldKVtqXS5zZWNvbmQuY291bnQ7Ci0gICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGo9MDtqPGxTaXplOysraikgIHsKLSAgICAgICAgICAgICAgICBpZiggYz09MCApCi0gICAgICAgICAgICAgICAgICAgICgqbGV4bWF0W2ldKVtqXS5zZWNvbmQucHJvYj0xLjAvKGxTaXplKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICgqbGV4bWF0W2ldKVtqXS5zZWNvbmQucHJvYj0oKmxleG1hdFtpXSlbal0uc2Vjb25kLmNvdW50L2M7Ci0gICAgICAgICAgICAgICAgKCpsZXhtYXRbaV0pW2pdLnNlY29uZC5jb3VudD0wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgQ09VTlQsIGNsYXNzIFBST0I+Ci1ib29sIHRtb2RlbDxDT1VOVCwgUFJPQj46OnJlYWRQcm9iVGFibGUoY29uc3QgY2hhciAqZmlsZW5hbWUpewotCS8qIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHQgdGFibGUgZnJvbSBhIGZpbGUuCi0JIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybWF0OiAgc291cmNlX3dvcmRfaWQgdGFyZ2V0X3dvcmRfaWQgcCh0YXJnZXRfd29yZHxzb3VyY2Vfd29yZCkKLQkgVGhpcyBpcyB0aGUgaW52ZXJzZSBvcGVyYXRpb24gb2YgdGhlIHByaW50VGFibGUgZnVuY3Rpb24uCi0JIE5BUywgNy8xMS85OQotCSAqLwotCWlmc3RyZWFtIGluZihmaWxlbmFtZSk7Ci0JY2VyciA8PCAiUmVhZGluZyB0IHByb2IuIHRhYmxlIGZyb20gIiA8PCBmaWxlbmFtZSA8PCAiXG4iOwotCWlmICghaW5mKSB7Ci0JCWNlcnIgPDwgIlxuRVJST1I6IENhbm5vdCBvcGVuICIgPDwgZmlsZW5hbWUgPDwgIlxuIjsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlXb3JkSW5kZXggc3JjX2lkLCB0cmdfaWQ7Ci0JUFJPQiBwcm9iOwotCWludCBuRW50cnk9MDsKLQl3aGlsZSAoaW5mID4+IHNyY19pZCA+PiB0cmdfaWQgPj4gcHJvYikgewotCQlpbnNlcnQoc3JjX2lkLCB0cmdfaWQsIDAuMCwgcHJvYik7Ci0JCW5FbnRyeSsrOwotCX0KLQljZXJyIDw8ICJSZWFkICIgPDwgbkVudHJ5IDw8ICIgZW50cmllcyBpbiBwcm9iLiB0YWJsZS5cbiI7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLQotCi10ZW1wbGF0ZSBjbGFzcyB0bW9kZWw8Q09VTlQsUFJPQj4gOyAKLQotLyogLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2YgTWV0aG9kIERlZmluaXRpb25zIG9mIGNsYXNzIHRtb2RlbCAtLS0tLS0tLS0tLS0tLS0qLwotCi0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvVFRhYmxlcy5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvVFRhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmJlNjUyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL1RUYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBNb2R1bGUgOiBUVGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogUHJvdG90eXBlcyBGaWxlOiBUVGFibGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogT2JqZWN0aXZlOiBEZWZpbmVzIGNsYXNlcyBhbmQgbWV0aG9kcyBmb3IgaGFuZGxpbmcgSS9PIGZvciBQcm9iYWJpbGl0eSAmICAqCi0gKiAgICAgICAgICAgIENvdW50IHRhYmxlcyBhbmQgYWxzbyBhbGlnbm1lbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfdHRhYmxlc19oCi0jZGVmaW5lIF90dGFibGVzX2ggMQotCi0KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAidm9jYWIuaCIgIAotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0gCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlICJWZWN0b3IuaCIKLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgInN5bmNPYmouaCIKLQotI2lmIF9fR05VQ19fPjIKLSNpbmNsdWRlIDxleHQvaGFzaF9tYXA+Ci11c2luZyBfX2dudV9jeHg6Omhhc2hfbWFwOwotI2Vsc2UKLSNpbmNsdWRlIDxoYXNoX21hcD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLQotI2luY2x1ZGUgIkdsb2JhbHMuaCIKLQotCi0vKiBUaGUgdGFibGVzIGRlZmluZWQgaW4gdGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSBkZWZpbmVkIGFzIGhhc2ggdGFibGVzLiBGb3IKLSAgIGV4YW1wbGUuIHRoZSB0LXRhYmxlIGlzIGEgaGFzaCBmdW5jdGlvbiBvZiBhIHdvcmQgcGFpcjsgYW4gYWxpZ25tZW50IGlzIAotICAgYSBoYXNoIGZ1bmN0aW9uIG9mIGEgdmVjdG9yIG9mIGludGVnZXIgbnVtYmVycyAoc2VudGVuY2UgcG9zaXRpb25zKSBhbmQgc28KLSAgIG9uICAgKi8KLQotCi0vKi0tLS0tLS0tLS0tIERlZm5pdGlvbiBvZiBIYXNoIEZ1bmN0aW9uIGZvciBjbGFzcyB0bW9kZWwgLS0tLS0tLSAtLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgcGFpcjxXb3JkSW5kZXgsIFdvcmRJbmRleD4gd29yZFBhaXJJZHM7Ci0KLQotCi1jbGFzcyBoYXNocGFpciA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjwgcGFpcjxXb3JkSW5kZXgsIFdvcmRJbmRleD4sIHNpemVfdCA+Ci17Ci1wdWJsaWM6Ci0gIHNpemVfdCBvcGVyYXRvcigpIChjb25zdCBwYWlyPFdvcmRJbmRleCwgV29yZEluZGV4PiYga2V5KSBjb25zdAotICAgIHsKLSAgICAgIHJldHVybiAoc2l6ZV90KSBNQVhfVyprZXkuZmlyc3QgKyBrZXkuc2Vjb25kOyAvKiBoYXNoIGZ1bmN0aW9uIGFuZCBpdCAKLQkJCQkJCSAgICAgICBpcyBndWFybnRlZWQgdG8gaGF2ZSAKLQkJCQkJCSAgICAgICB1bmlxdWUgaWQgZm9yIGVhY2ggCi0JCQkJCQkgICAgICAgdW5pcXVlIHBhaXIgKi8KLSAgICB9Ci0gICNpZmRlZiBXSU4zMgotICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpIChjb25zdCBwYWlyPFdvcmRJbmRleCwgV29yZEluZGV4PiYga2V5LCBjb25zdCBwYWlyPFdvcmRJbmRleCwgV29yZEluZGV4PiYga2V5Mil7Ci0JCSByZXR1cm4ga2V5LmZpcnN0PT1rZXkyLmZpcnN0ICYmIGtleS5zZWNvbmQ9PWtleTIuc2Vjb25kOwotCSB9Ci0JIGVudW0NCi0JIHsJLy8gcGFyYW1ldGVycyBmb3IgaGFzaCB0YWJsZQ0KLQkJIGJ1Y2tldF9zaXplID0gMQkJLy8gMCA8IGJ1Y2tldF9zaXplDQotCSB9OwotICAjZW5kaWYKLX07Ci0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgUHJvdG90eXBlIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgQ2xhc3MgTmFtZTogdG1vZGVsCi0gIE9iamVjdGl2ZTogVGhpcyBkZWZpbmVzIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXIgZm9yIHQgVGFibGVzIGFuZCB0IAotICBDb3VudCBUYWJsZXMuIFRoZXkgYXJlIGRlZmluZWQgYXMgYSBoYXNoIHRhYmxlLiBFYWNoIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlCi0gIGlzIHRoZSBwcm9iYWJpbGl0eSAoUChmai9laSkgKSBvciBjb3VudCBjb2xsZWN0ZWQgZm9yICggQyhmai9laSkpLiBUaGUgCi0gIHByb2JhYmlsaXR5IGFuZCB0aGUgY291bnQgYXJlIHJlcHJlc2VudGVkIGFzIGxvZyBpbnRlZ2VyIHByb2JhYmlsaXR5IGFzIAotICBkZWZpbmVkIGJ5IHRoZSBjbGFzcyBMb2dQcm9iIC4gIAotCi0gIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnRzIHQgVGFibGVzIChwcm9iYWJpbGlpdHkpIGFuZCBuIChmZXJ0aWxpdHkgCi0gIFRhYmxlcyBhbmQgYWxzbyB0aGVpciBjb3JyZXNwb25kaW5nIGNvdW50IHRhYmxlcyAuCi0gCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8vdHlwZWRlZiBmbG9hdCBDT1VOVCA7Ci0vL3R5cGVkZWYgTG9nUHJvYiBQUk9CIDsKLXRlbXBsYXRlIDxjbGFzcyBDT1VOVCwgY2xhc3MgUFJPQj4KLWNsYXNzIExwUGFpciB7Ci1wdWJsaWM6Ci0gICAgQ09VTlQgY291bnQgOwotICAgIFBST0IgIHByb2IgOwotcHVibGljOiAvLyBjb25zdHJ1Y3RvciAKLSAgICBMcFBhaXIoKTpjb3VudCgwKSwgcHJvYigwKXt9IDsKLSAgICBMcFBhaXIoQ09VTlQgYywgUFJPQiBwKTpjb3VudChjKSwgcHJvYihwKXt9OwotfSA7Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1UKm1iaW5hcnlfc2VhcmNoKFQqeCxUKnksdW5zaWduZWQgaW50IHZhbCkKLXsKLSAgaWYoIHkteD09MCApCi0gICAgcmV0dXJuIDA7Ci0gIGlmKCB4LT5maXJzdD09dmFsKQotICAgIHJldHVybiB4OwotICBpZiggeS14PDIgKQotICAgIHJldHVybiAwOwotICBUKm1pZD14Kyh5LXgpLzI7Ci0gIGlmKCB2YWwgPCBtaWQtPmZpcnN0ICkKLSAgICByZXR1cm4gbWJpbmFyeV9zZWFyY2goeCxtaWQsdmFsKTsKLSAgZWxzZQotICAgIHJldHVybiBtYmluYXJ5X3NlYXJjaChtaWQseSx2YWwpOwotICAKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLWNvbnN0IFQqbWJpbmFyeV9zZWFyY2goY29uc3QgVCp4LGNvbnN0IFQqeSx1bnNpZ25lZCBpbnQgdmFsKQotewotICBpZiggeS14PT0wICkKLSAgICByZXR1cm4gMDsKLSAgaWYoIHgtPmZpcnN0PT12YWwpCi0gICAgcmV0dXJuIHg7Ci0gIGlmKCB5LXg8MiApCi0gICAgcmV0dXJuIDA7Ci0gIGNvbnN0IFQqbWlkPXgrKHkteCkvMjsKLSAgaWYoIHZhbCA8IG1pZC0+Zmlyc3QgKQotICAgIHJldHVybiBtYmluYXJ5X3NlYXJjaCh4LG1pZCx2YWwpOwotICBlbHNlCi0gICAgcmV0dXJuIG1iaW5hcnlfc2VhcmNoKG1pZCx5LHZhbCk7Ci0gIAotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgQ09VTlQsIGNsYXNzIFBST0I+Ci1jbGFzcyB0bW9kZWx7Ci0JdHlwZWRlZiBMcFBhaXI8Q09VTlQsIFBST0I+IENQUGFpcjsKLXB1YmxpYzoKLQlib29sIHJlY29yZERpZmY7Ci0gICAgICAgIAotcHVibGljOgotCWludCBub0VuZ2xpc2hXb3JkczsgIC8vIHRvdGFsIG51bWJlciBvZiB1bmlxdWUgc291cmNlIHdvcmRzCi0JaW50IG5vRnJlbmNoV29yZHM7ICAgLy8gdG90YWwgbnVtYmVyIG9mIHVuaXF1ZSB0YXJnZXQgd29yZHMKLQkvL3ZlY3RvcjxwYWlyPHVuc2lnbmVkIGludCxDUFBhaXI+ID4gZnM7Ci0gICAgLy92ZWN0b3I8dW5zaWduZWQgaW50PiBlczsKLSAgICB2ZWN0b3I8IHZlY3RvcjxwYWlyPHVuc2lnbmVkIGludCxDUFBhaXI+ID4qID4gbGV4bWF0OwotCXZlY3RvcjwgTXV0ZXgqID4gbXV0ZXg7Ci0gICAgICAKLSAgICB2b2lkIGVyYXNlKFdvcmRJbmRleCBlLCBXb3JkSW5kZXggZil7Ci0JCUNQUGFpciAqcD1maW5kKGUsZik7Ci0JCWlmKHApCi0JCQkqcD1DUFBhaXIoMCwwKTsKLQl9OwotICAgICAgCi0gICAgQ1BQYWlyKmZpbmQoaW50IGUsaW50IGYpewotCQkvL3BhaXI8dW5zaWduZWQgaW50LENQUGFpcj4gKmJlPSYoZnNbMF0pK2VzW2VdOwotCQkvL3BhaXI8dW5zaWduZWQgaW50LENQUGFpcj4gKmVuPSYoZnNbMF0pK2VzW2UrMV07Ci0JCWlmKGU+PWxleG1hdC5zaXplKCl8fGxleG1hdFtlXT09TlVMTCl7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlwYWlyPHVuc2lnbmVkIGludCxDUFBhaXI+ICpiZT0mKCpsZXhtYXRbZV0pWzBdOwotCQlwYWlyPHVuc2lnbmVkIGludCxDUFBhaXI+ICplbj0mKCpsZXhtYXRbZV0pWzBdKygqbGV4bWF0W2VdKS5zaXplKCk7Ci0JCXBhaXI8dW5zaWduZWQgaW50LENQUGFpcj4gKng9IG1iaW5hcnlfc2VhcmNoKGJlLGVuLGYpOwotCQlpZiggeD09MCApewotCQkJLy9jZXJyIDw8ICJBOkRJRCBOT1QgRklORCBFTlRSWTogIiA8PCBlIDw8ICIgIiA8PCBmIDw8ICdcbic7Ci0JCQkvL2Fib3J0KCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gJih4LT5zZWNvbmQpOwotCX0KLSAgICAgIAotCWNvbnN0IENQUGFpcipmaW5kKGludCBlLGludCBmKWNvbnN0ewotCQlpZihlPj1sZXhtYXQuc2l6ZSgpfHxsZXhtYXRbZV09PU5VTEwpewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLSAgICAgICAgY29uc3QgcGFpcjx1bnNpZ25lZCBpbnQsQ1BQYWlyPiAqYmU9JigqbGV4bWF0W2VdKVswXTsKLQkJY29uc3QgcGFpcjx1bnNpZ25lZCBpbnQsQ1BQYWlyPiAqZW49JigqbGV4bWF0W2VdKVswXSsoKmxleG1hdFtlXSkuc2l6ZSgpOwotCQkvL2NvbnN0IHBhaXI8dW5zaWduZWQgaW50LENQUGFpcj4gKmJlPSYoZnNbMF0pK2VzW2VdOwotCQkvL2NvbnN0IHBhaXI8dW5zaWduZWQgaW50LENQUGFpcj4gKmVuPSYoZnNbMF0pK2VzW2UrMV07Ci0JCWNvbnN0IHBhaXI8dW5zaWduZWQgaW50LENQUGFpcj4gKng9IG1iaW5hcnlfc2VhcmNoKGJlLGVuLGYpOwotCQlpZiggeD09MCApewotCQkJLy9jZXJyIDw8ICJCOkRJRCBOT1QgRklORCBFTlRSWTogIiA8PCBlIDw8ICIgIiA8PCBmIDw8ICdcbic7Ci0JCQkvL2Fib3J0KCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotICAgICAgICAgICAgCi0JCXJldHVybiAmKHgtPnNlY29uZCk7Ci0JfQotcHVibGljOgotCXZvaWQgaW5zZXJ0KFdvcmRJbmRleCBlLCBXb3JkSW5kZXggZiwgQ09VTlQgY3ZhbD0wLjAsIFBST0IgcHZhbCA9IDAuMCl7Ci0JCUNQUGFpciogZm91bmQgPSBmaW5kKGUsZik7Ci0JCWlmKGZvdW5kKQotCQkJKmZvdW5kPUNQUGFpcihjdmFsLHB2YWwpOwotCX0KLSAgICAgIAotICAgIENQUGFpcipnZXRQdHIoaW50IGUsaW50IGYpe3JldHVybiBmaW5kKGUsZik7fQotCi0JdG1vZGVsKCl7fTsKLSAgICB0bW9kZWwoY29uc3Qgc3RyaW5nJmZuKQl7Ci0JCXJlY29yZERpZmYgPSBmYWxzZTsKLQkJaW50IGNvdW50PTAsY291bnQyPTA7Ci0JCWlmc3RyZWFtIGluZmlsZTIoZm4uY19zdHIoKSk7Ci0JCWNlcnIgPDwgIklucHV0ZmlsZSBpbiAiIDw8IGZuIDw8IGVuZGw7Ci0JCWludCBlLGYsb2xkZT0tMSxvbGRmPS0xOwotCQlwYWlyPHVuc2lnbmVkIGludCxDUFBhaXI+IGNwOwotCQl2ZWN0b3I8IHBhaXI8dW5zaWduZWQgaW50LENQUGFpcj4gPiBjcHM7Ci0JCXdoaWxlKGluZmlsZTI+PmU+PmYpewotCQkJY3AuZmlyc3Q9ZjsKLQkJCWFzc2VydChlPj1vbGRlKTsKLQkJCWFzc2VydChlPm9sZGUgfHxmPm9sZGYpOwotCQkJaWYoIGUhPW9sZGUmJm9sZGU+PTAgKXsKLQkJCQlpbnQgb2xkc2l6ZT1sZXhtYXQuc2l6ZSgpOwotCQkJCWxleG1hdC5yZXNpemUob2xkZSsxKTsKLQkJCQlmb3IodW5zaWduZWQgaW50IGk9b2xkc2l6ZTtpPGxleG1hdC5zaXplKCk7KytpKQotCQkJCQlsZXhtYXRbaV09MDsKLQkJCQlsZXhtYXRbb2xkZV09bmV3IHZlY3RvcjwgcGFpcjx1bnNpZ25lZCBpbnQsQ1BQYWlyPiA+IChjcHMpOwotCQkJCWNwcy5jbGVhcigpOwotCQkJCWlmKCAhKCgqbGV4bWF0W29sZGVdKS5zaXplKCk9PSgqbGV4bWF0W29sZGVdKS5jYXBhY2l0eSgpKSApCi0JCQkJCWNlcnIgPDwgImVSUk9SOiB3YXN0ZSBvZiBtZW1vcnk6ICIgPDwgKCpsZXhtYXRbb2xkZV0pLnNpemUoKSA8PCAiICIgPDwgKCpsZXhtYXRbb2xkZV0pLmNhcGFjaXR5KCkgPDwgZW5kbDsKLQkJCQljb3VudDIrPWxleG1hdFtvbGRlXS0+Y2FwYWNpdHkoKTsKLQkJCX0KLQkJCWNwcy5wdXNoX2JhY2soY3ApOwotCQkJb2xkZT1lOwotCQkJb2xkZj1mOwotCQkJY291bnQrKzsKLQkJfQotCQlsZXhtYXQucmVzaXplKG9sZGUrMSk7Ci0JCWxleG1hdFtvbGRlXT1uZXcgdmVjdG9yPCBwYWlyPHVuc2lnbmVkIGludCxDUFBhaXI+ID4gKGNwcyk7Ci0JCWNvdW50Mis9bGV4bWF0W29sZGVdLT5jYXBhY2l0eSgpOyAgICAgIAotCQljb3V0IDw8ICJUaGVyZSBhcmUgIiA8PCBjb3VudCA8PCAiICIgPDwgY291bnQyIDw8ICIgZW50cmllcyBpbiB0YWJsZSIgPDwgJ1xuJzsKLQkJbXV0ZXgucmVzaXplKGxleG1hdC5zaXplKCkpOwotCQlmb3IoaW50IF9pID0gMDsgX2k8IGxleG1hdC5zaXplKCk7X2krKyl7Ci0JCQltdXRleFtfaV0gPSBuZXcgTXV0ZXgoKTsKLQkJfQotCQkvKiBDcmVhdGUgbXV0ZXggKi8KLQl9Ci0KLQl+dG1vZGVsKCl7Ci0JCWZvcihpbnQgX2kgPSAwOyBfaTwgbGV4bWF0LnNpemUoKTtfaSsrKXsKLQkJCWRlbGV0ZSBtdXRleFtfaV07Ci0JCX0KLQotCX0KLQotCi0gIC8qICB0bW9kZWwoY29uc3Qgc3RyaW5nJmZuKQotICAgIHsKLSAgICAgIHNpemVfdCBjb3VudD0wOwotICAgICAgewotCWlmc3RyZWFtIGluZmlsZTEoZm4uY19zdHIoKSk7Ci0JaWYoICFpbmZpbGUxICkKLQkgIHsKLQkgICAgY2VyciA8PCAiRVJST1I6IGNhbid0IHJlYWQgY29vY3VycmVuY2UgZmlsZSAiIDw8IGZuIDw8ICdcbic7Ci0JICAgIGFib3J0KCk7Ci0JICB9Ci0JaW50IGUsZjsKLQl3aGlsZShpbmZpbGUxPj5lPj5mKQotCSAgY291bnQrKzsKLSAgICAgIH0KLSAgICAgIGNvdXQgPDwgIlRoZXJlIGFyZSAiIDw8IGNvdW50IDw8ICIgZW50cmllcyBpbiB0YWJsZSIgPDwgJ1xuJzsKLSAgICAgIGlmc3RyZWFtIGluZmlsZTIoZm4uY19zdHIoKSk7Ci0gICAgICBmcy5yZXNpemUoY291bnQpOwotICAgICAgaW50IGUsZixvbGRlPS0xLG9sZGY9LTE7Ci0gICAgICBwYWlyPHVuc2lnbmVkIGludCxDUFBhaXI+IGNwOwotICAgICAgY291bnQ9MDsKLSAgICAgIHdoaWxlKGluZmlsZTI+PmU+PmYpCi0JewotCSAgYXNzZXJ0KGU+PW9sZGUpOwotCSAgYXNzZXJ0KGU+b2xkZSB8fGY+b2xkZik7Ci0JICBpZiggZSE9b2xkZSApCi0JICAgIHsKLQkgICAgICBlcy5yZXNpemUoZSsxKTsKLQkgICAgICBmb3IodW5zaWduZWQgaW50IGk9b2xkZSsxO2ludChpKTw9ZTsrK2kpCi0JCWVzW2ldPWNvdW50OwotCSAgICB9Ci0JICBjcC5maXJzdD1mOwotCSAgYXNzZXJ0KGNvdW50PGZzLnNpemUoKSk7Ci0JICBmc1tjb3VudF09Y3A7Ci0JICAvL2ZzLnB1c2hfYmFjayhjcCk7Ci0JICBvbGRlPWU7Ci0JICBvbGRmPWY7Ci0JICBjb3VudCsrOwotCX0KLSAgICAgIGFzc2VydChjb3VudD09ZnMuc2l6ZSgpKTsKLSAgICAgIGVzLnB1c2hfYmFjayhmcy5zaXplKCkpOwotICAgICAgY291dCA8PCBmcy5zaXplKCkgPDwgIiAiIDw8IGNvdW50IDw8ICIgY29vY3VycmVuY2VzIHJlYWQiIDw8ICdcbic7Ci0gICAgICB9Ki8KLSAgCi0gICAgdm9pZCBpbmNDb3VudChXb3JkSW5kZXggZSwgV29yZEluZGV4IGYsIENPVU5UIGluYykgewotICAgICAgICBpZiggaW5jICl7Ci0gICAgICAgICAgICBDUFBhaXIgKnA9ZmluZChlLGYpOwotICAgICAgICAgICAgaWYoIHAgKXsKLQkJCQltdXRleFtlXS0+bG9jaygpOwotCQkJCXAtPmNvdW50ICs9IGluYyA7Ci0JCQkJbXV0ZXhbZV0tPnVubG9jaygpOwotCQkJfQotICAgICAgICB9Ci0gICAgfQotCi0JUFJPQiBnZXRQcm9iKFdvcmRJbmRleCBlLCBXb3JkSW5kZXggZikgY29uc3R7Ci0JCWNvbnN0IENQUGFpciAqcD1maW5kKGUsZik7Ci0gICAgICAgIGlmKCBwICkKLSAgICAgICAgICAgIHJldHVybiBtYXgocC0+cHJvYiwgUFJPQl9TTU9PVEgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gUFJPQl9TTU9PVEg7Ci0gICAgfQotCQotCUNPVU5UIGdldENvdW50KFdvcmRJbmRleCBlLCBXb3JkSW5kZXggZikgY29uc3QKLQl7Ci0JCWNvbnN0IENQUGFpciAqcD1maW5kKGUsZik7Ci0JCWlmKCBwICkKLQkJCXJldHVybiBwLT5jb3VudDsKLQkJZWxzZQotCQkJcmV0dXJuIDAuMDsKLSAgICB9Ci0KLSAgdm9pZCBwcmludFByb2JUYWJsZShjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgVmVjdG9yPFdvcmRFbnRyeT4mLCBjb25zdCBWZWN0b3I8V29yZEVudHJ5PiYsYm9vbCBhY3R1YWwpIGNvbnN0OwotICB2b2lkIHByaW50Q291bnRUYWJsZShjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgVmVjdG9yPFdvcmRFbnRyeT4mLCBjb25zdCBWZWN0b3I8V29yZEVudHJ5PiYsYm9vbCBhY3R1YWwpIGNvbnN0OwotICB2b2lkIHByaW50UHJvYlRhYmxlSW52ZXJzZShjb25zdCBjaGFyICpmaWxlbmFtZSwgCi0JCQkgICAgIGNvbnN0IFZlY3RvcjxXb3JkRW50cnk+JiBldmxpc3QsIAotCQkJICAgICBjb25zdCBWZWN0b3I8V29yZEVudHJ5PiYgZnZsaXN0LCAKLQkJCSAgICAgY29uc3QgZG91YmxlIGVUb3RhbCwgCi0JCQkgICAgIGNvbnN0IGRvdWJsZSBmVG90YWwsIAotCQkJICAgICBjb25zdCBib29sIGFjdHVhbCA9IGZhbHNlICkgY29uc3Q7Ci0gIHZvaWQgbm9ybWFsaXplVGFibGUoY29uc3QgdmNiTGlzdCZlbmdsLCBjb25zdCB2Y2JMaXN0JmZyZW5jaCwgaW50IGl0ZXI9Mik7Ci0gIGJvb2wgcmVhZFByb2JUYWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gIGJvb2wgcmVhZFN1YlNhbXBsZWRQcm9iVGFibGUoY29uc3QgY2hhciogZmlsZW5hbWUsIHN0ZDo6c2V0PFdvcmRJbmRleD4gJmUsIHN0ZDo6c2V0PFdvcmRJbmRleD4gJmYpOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9WZWN0b3IuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL1ZlY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDhmZDNlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL1ZlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qCi0KLUVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotLyotLQotVmVjdG9yOiBjaGVja2VkIHZlY3RvciBpbXBsZW1lbnRhdGlvbgotCi1GcmFueiBKb3NlZiBPY2ggKDMwLzA3Lzk5KQotLS0qLwotI2lmbmRlZiBBUlJBWV9IX0RFRklORUQKLSNkZWZpbmUgQVJSQVlfSF9ERUZJTkVECi0jaW5jbHVkZSAibXlzdGwuaCIKLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotCi0jaWZkZWYgTkRFQlVHCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jZGVmaW5lIFZlY3RvciB2ZWN0b3IKLXRlbXBsYXRlPGNsYXNzIFQ+IG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSZvLCBjb25zdCBWZWN0b3I8VD4mYSkKLXsKLSAgbyA8PCAiVmVjdG9yKCIgPDwgYS5zaXplKCkgPDwgIil7ICI7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaWlpPTA7aWlpPGEuc2l6ZSgpO2lpaSsrKQotICAgIG8gPDwgIiAiIDw8IGlpaTw8ICI6ICIgPDwgYVtpaWldPDwiIDsiOwotICByZXR1cm4gbyA8PCAifVxuIjsKLX0KLQotI2Vsc2UKLQotI2RlZmluZSBBUlJBWV9ERUJVRwotI2RlZmluZSBtZW1vX2RlbChhLCBiKQotI2RlZmluZSBtZW1vX25ldyhhKQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBWZWN0b3IKLXsKLXByaXZhdGU6Ci0JVCAqcDsgICAgICAgICAgICAgICAgICAJCi0JaW50IHJlYWxTaXplOyAKLQlpbnQgbWF4V3JpdHRlbjsKLQkKLQl2b2lkIGNvcHkoVCAqYSwgY29uc3QgVCAqYiwgaW50IG4pOwotCXZvaWQgY29weShUICphLCBUICpiLCBpbnQgbik7Ci0Jdm9pZCBfZXhwYW5kKCk7CQkKLXB1YmxpYzoKLSAgVmVjdG9yKCkgCi0gICAgOiBwKDApLCByZWFsU2l6ZSgwKSwgbWF4V3JpdHRlbigtMSkKLSAgICB7Ci0jaWZkZWYgVkVSWV9BUlJBWV9ERUJVRwotICAgICAgY291dCA8PCAiTUFLRSBBUlJBWTogIiA8PCB0aGlzPDwiICI8PCh2b2lkKilwIDw8ICdcbic7Ci0jZW5kaWYKLSAgICB9Ci0gIFZlY3Rvcihjb25zdCBWZWN0b3I8VD4gJngpCi0gICAgOiBwKG5ldyBUW3gubWF4V3JpdHRlbisxXSksIHJlYWxTaXplKHgubWF4V3JpdHRlbisxKSwgbWF4V3JpdHRlbih4Lm1heFdyaXR0ZW4pCi0gICAgewotICAgICAgbWVtb19uZXcocCk7Ci0gICAgICBjb3B5KHAsIHgucCwgcmVhbFNpemUpOwotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLSAgICAgIGNvdXQgPDwgIk1BS0UgQVJSQVkgY29weTogIiA8PCB0aGlzIDw8ICIgIiA8PCByZWFsU2l6ZSA8PCIgIjw8KHZvaWQqKXA8PCAnXG4nOwotI2VuZGlmCi0gICAgfQotICBleHBsaWNpdCBWZWN0b3IoaW50IG4pCi0gICAgOiBwKG5ldyBUW25dKSwgcmVhbFNpemUobiksIG1heFdyaXR0ZW4obi0xKQotICAgIHsKLSAgICAgIG1lbW9fbmV3KHApOwotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLSAgICAgIGNvdXQgPDwgIk1BS0UgQVJSQVkgd2l0aCBwYXJhbWV0ZXIgbjogIiA8PCB0aGlzIDw8ICIgIiA8PCByZWFsU2l6ZTw8IiAiPDwodm9pZCopcCA8PCAnXG4nOwotI2VuZGlmCQkJCi0gICAgfQotICBWZWN0b3IoaW50IG4sIGNvbnN0IFQmX2luaXQpCi0gICAgOiBwKG5ldyBUW25dKSwgcmVhbFNpemUobiksIG1heFdyaXR0ZW4obi0xKQotICAgIHsKLSAgICAgIG1lbW9fbmV3KHApOwotICAgICAgZm9yKGludCBpaWk9MDtpaWk8bjtpaWkrKylwW2lpaV09X2luaXQ7Ci0jaWZkZWYgVkVSWV9BUlJBWV9ERUJVRwotICAgICAgY291dCA8PCAiTUFLRSBBUlJBWSB3aXRoIHBhcmFtZXRlciBuIGFuZCBpbml0OiAiIDw8IHRoaXMgPDwgIiAiIDw8IHJlYWxTaXplPDwiICI8PCh2b2lkKilwIDw8ICdcbic7Ci0jZW5kaWYJCQkKLSAgICB9Ci0gIAotICB+VmVjdG9yKCkgCi0gICAgeyAKLSNpZmRlZiBWRVJZX0FSUkFZX0RFQlVHCi0gICAgICBjb3V0IDw8ICJGUkVFIEFSUkFZOiAiIDw8IHRoaXMgPDwgIiAiIDw8IHJlYWxTaXplPDwiICI8PCh2b2lkKilwIDw8ICdcbic7Ci0jZW5kaWYJCQkKLSAgICAgIGRlbGV0ZSBbXSBwOwotICAgICAgbWVtb19kZWwocCwgMSk7Ci0jaWZuZGVmIE5ERUJVRwotICAgICAgcD0wO3JlYWxTaXplPS0xO21heFdyaXR0ZW49LTE7Ci0jZW5kaWYKLSAgICB9Ci0gIAotICBWZWN0b3I8VD4mIG9wZXJhdG9yPShjb25zdCBWZWN0b3I8VD4meCkKLSAgICB7Ci0gICAgICBpZiggdGhpcyE9ICZ4ICkKLQl7Ci0jaWZkZWYgVkVSWV9BUlJBWV9ERUJVRwotCSAgY291dCA8PCAiRlJFRSBBUlJBWSBiZWNhdXNlIG9mIG9wZXJhdG9yPTogIiA8PCB0aGlzIDw8ICIgIiA8PCByZWFsU2l6ZTw8IiAiPDwodm9pZCopcCA8PCAnXG4nOwotI2VuZGlmCQotCSAgZGVsZXRlIFtdIHA7Ci0JICBtZW1vX2RlbChwLCAxKTsKLQkgIHJlYWxTaXplID0geC5tYXhXcml0dGVuKzE7Ci0JICBtYXhXcml0dGVuID0geC5tYXhXcml0dGVuOwotCSAgcCA9IG5ldyBUW3JlYWxTaXplXTsgCi0JICBtZW1vX25ldyhwKTsKLQkgIGNvcHkocCwgeC5wLCByZWFsU2l6ZSk7Ci0jaWZkZWYgVkVSWV9BUlJBWV9ERUJVRwotCSAgY291dCA8PCAiTkVXIEFSUkFZIGJlY2F1c2Ugb2Ygb3BlcmF0b3I9OiAiIDw8IHRoaXMgPDwgIiAiIDw8IHJlYWxTaXplPDwiICI8PCh2b2lkKilwIDw8ICdcbic7Ci0jZW5kaWYJCQkKLQl9Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAKLSAgVmVjdG9yPFQ+JiBvcGVyYXRvcj0oVmVjdG9yPFQ+JngpCi0gICAgewotICAgICAgaWYoIHRoaXMhPSAmeCApCi0JewotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLQkgIGNvdXQgPDwgIkZSRUUgQVJSQVkgYmVjYXVzZSBvZiBvcGVyYXRvcj06ICIgPDwgdGhpcyA8PCAiICIgPDwgcmVhbFNpemU8PCIgIjw8KHZvaWQqKXAgPDwgJ1xuJzsKLSNlbmRpZgkJCQotCSAgZGVsZXRlIFtdIHA7Ci0JICBtZW1vX2RlbChwLCAxKTsKLQkgIHJlYWxTaXplID0geC5tYXhXcml0dGVuKzE7Ci0JICBtYXhXcml0dGVuID0geC5tYXhXcml0dGVuOwotCSAgcCA9IG5ldyBUW3JlYWxTaXplXTsgCi0JICBtZW1vX25ldyhwKTsKLQkgIGNvcHkocCwgeC5wLCByZWFsU2l6ZSk7Ci0jaWZkZWYgVkVSWV9BUlJBWV9ERUJVRwotCSAgY291dCA8PCAiTkVXIEFSUkFZIGJlY2F1c2Ugb2Ygb3BlcmF0b3I9OiAiIDw8IHRoaXMgPDwgIiAiIDw8IHJlYWxTaXplPDwiICI8PCh2b2lkKilwIDw8ICdcbic7Ci0jZW5kaWYJCQkKLQl9Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAKLSAgdm9pZCBhbGxvd0FjY2VzcyhpbnQgbikgCi0gICAgeyAKLSAgICAgIHdoaWxlKCByZWFsU2l6ZTw9biApCi0JX2V4cGFuZCgpOyAKLSAgICAgIG1heFdyaXR0ZW49bWF4KG1heFdyaXR0ZW4sIG4pOwotICAgICAgYXNzZXJ0KCBtYXhXcml0dGVuPHJlYWxTaXplICk7Ci0gICAgfQotICB2b2lkIHJlc2l6ZShpbnQgbikKLSAgICB7Ci0gICAgICB3aGlsZSggcmVhbFNpemU8biApIAotCV9leHBhbmQoKTsgCi0gICAgICBtYXhXcml0dGVuPW4tMTsKLSAgICB9Ci0gIHZvaWQgY2xlYXIoKQotICAgIHsKLSAgICAgIHJlc2l6ZSgwKTsKLSAgICB9Ci0gIHZvaWQgcmVzZXJ2ZShpbnQgbikKLSAgICB7Ci0gICAgICBpbnQgbWF4T2xkPW1heFdyaXR0ZW47Ci0gICAgICByZXNpemUobik7Ci0gICAgICBtYXhXcml0dGVuPW1heE9sZDsKLSAgICB9Ci0gIHZvaWQgc29ydChpbnQgdW50aWw9LTEpCi0gICAgewotICAgICAgaWYoIHVudGlsPT0gLTEgKSB1bnRpbD1zaXplKCk7Ci0gICAgICBzdGQ6OnNvcnQocCwgcCt1bnRpbCk7Ci0gICAgfQotICB2b2lkIGludnNvcnQoaW50IHVudGlsPS0xKQotICAgIHsKLSAgICAgIGlmKCB1bnRpbD09IC0xICkgdW50aWw9c2l6ZSgpOwotICAgICAgc3RkOjpzb3J0KHAsIHArdW50aWwsIGdyZWF0ZXI8VD4oKSk7ICAgICAgCi0gICAgfQotICB2b2lkIGluaXQoaW50IG4sIGNvbnN0IFQmX2luaXQpCi0gICAgewotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLSAgICAgIGNvdXQgPDwgIkZSRUUgQVJSQVkgYmVjYXVzZSBvZiBpbml0OiAiIDw8IHRoaXMgPDwgIiAiIDw8IHJlYWxTaXplPDwiICI8PCh2b2lkKilwIDw8ICdcbic7Ci0jZW5kaWYJCQkKLSAgICAgIGRlbGV0ZSBbXXA7Ci0gICAgICBtZW1vX2RlbChwLCAxKTsKLSAgICAgIHA9bmV3IFRbbl07Ci0gICAgICBtZW1vX25ldyhwKTsKLSAgICAgIHJlYWxTaXplPW47Ci0gICAgICBtYXhXcml0dGVuPW4tMTsKLSAgICAgIGZvcihpbnQgaWlpPTA7aWlpPG47aWlpKyspcFtpaWldPV9pbml0OwotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLSAgICAgIGNvdXQgPDwgIk5FVyBBUlJBWSBiZWNhdXNlIG9mIGluaXQ6ICIgPDwgdGhpcyA8PCAiICIgPDwgcmVhbFNpemU8PCIgIjw8KHZvaWQqKXAgPDwgJ1xuJzsKLSNlbmRpZgkJCQotICAgIH0KLSAgaW5saW5lIHVuc2lnbmVkIGludCBzaXplKCkgY29uc3QKLSAgICB7YXNzZXJ0KCBtYXhXcml0dGVuPHJlYWxTaXplICk7Ci0gICAgcmV0dXJuIG1heFdyaXR0ZW4rMTt9Ci0gIGlubGluZSBpbnQgbG93KCkgY29uc3QKLSAgICB7IHJldHVybiAwOyB9Ci0gIGlubGluZSBpbnQgaGlnaCgpIGNvbnN0Ci0gICAgeyByZXR1cm4gbWF4V3JpdHRlbjsgfQotICBpbnQgZmluZE1heCgpIGNvbnN0OwotICBpbnQgZmluZE1pbigpIGNvbnN0OwotICB2b2lkIGVycm9yQWNjZXNzKGludCBuKSBjb25zdDsKLSAgaW5saW5lIFQqZ2V0UG9pbnRlclRvRGF0YSgpe3JldHVybiBwO30KLSAgaW5saW5lIFQqYmVnaW4oKXtyZXR1cm4gcDt9Ci0gIGlubGluZSBUKmVuZCgpe3JldHVybiBwK21heFdyaXR0ZW4rMTt9Ci0gIGlubGluZSBUJiBvcGVyYXRvcltdKGludCBuKQotICAgIHsgCi0jaWZuZGVmIE5ERUJVRwotICAgICAgaWYoIG48MCB8fCBuPm1heFdyaXR0ZW4gKQotCWVycm9yQWNjZXNzKG4pOwotI2VuZGlmCi0gICAgICByZXR1cm4gcFtuXTsKLSAgICB9Ci0gIGlubGluZSBjb25zdCBUJiBvcGVyYXRvcltdKGludCBuKSBjb25zdCAKLSAgICB7IAotI2lmbmRlZiBOREVCVUcKLSAgICAgIGlmKG48MCB8fCBuPm1heFdyaXR0ZW4gKQotCWVycm9yQWNjZXNzKG4pOwotI2VuZGlmCi0gICAgICByZXR1cm4gcFtuXTsgCi0gICAgfQotICBpbmxpbmUgY29uc3QgVCYgZ2V0KGludCBuKSBjb25zdCAKLSAgICB7IAotI2lmbmRlZiBOREVCVUcKLSAgICAgIGlmKG48MCB8fCBuPm1heFdyaXR0ZW4gKQotCWVycm9yQWNjZXNzKG4pOwotI2VuZGlmICAgICAgCi0gICAgICByZXR1cm4gcFtuXTsgCi0gICAgfQotICBjb25zdCBUJnRvcChpbnQgbj0wKSBjb25zdAotICAgIHtyZXR1cm4gKCp0aGlzKVttYXhXcml0dGVuLW5dO30KLSAgVCZ0b3AoaW50IG49MCkKLSAgICB7cmV0dXJuICgqdGhpcylbbWF4V3JpdHRlbi1uXTt9Ci0gIGNvbnN0IFQmYmFjayhpbnQgbj0wKSBjb25zdAotICAgIHtyZXR1cm4gKCp0aGlzKVttYXhXcml0dGVuLW5dO30KLSAgVCZiYWNrKGludCBuPTApCi0gICAge3JldHVybiAoKnRoaXMpW21heFdyaXR0ZW4tbl07fQotICBUJnB1c2hfYmFjayhjb25zdCBUJngpCi0gICAgeyAgICAgCi0gICAgICBhbGxvd0FjY2VzcyhtYXhXcml0dGVuKzEpOwotICAgICAgKCp0aGlzKVttYXhXcml0dGVuXT14OwotICAgICAgcmV0dXJuIHRvcCgpOwotICAgIH0KLSAgYm9vbCB3cml0ZVRvKG9zdHJlYW0mb3V0KSBjb25zdAotICAgIHsKLSAgICAgIG91dCA8PCAiVmVjdG9yICI7Ci0gICAgICBvdXQgPDwgc2l6ZSgpIDw8ICIgIjsKLSAgICAgIC8vb3V0IDw8IGEgPDwgJ1xuJzsKLSAgICAgIGZvcihpbnQgaXY9MDtpdjw9bWF4V3JpdHRlbjtpdisrKQotCXsKLQkgIHdyaXRlT2Iob3V0LCAoKnRoaXMpW2l2XSk7Ci0JICBvdXQgPDwgJ1xuJzsKLQl9Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGJvb2wgcmVhZEZyb20oaXN0cmVhbSZpbikKLSAgICB7Ci0gICAgICBzdHJpbmcgczsKLSAgICAgIGlmKCAhaW4gKQotCXsKLQkgIGNlcnIgPDwgIkVSUk9SKFZlY3Rvcik6IGZpbGUgY2Fubm90IGJlIG9wZW5lZC5cbiI7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBpbiA+PiBzOwotICAgICAgaWYoICEocz09IlZlY3RvciIpICkKLQl7Ci0JICBjZXJyIDw8ICJFUlJPUihWZWN0b3IpOiBWZWN0b3IhPSciPDxzPDwiJ1xuIjsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGludCBiaWdnZXN0OwotICAgICAgaW4gPj4gYmlnZ2VzdDsKLSAgICAgLy8gaW4gPj4gYTsKLSAgICAgIHJlc2l6ZShiaWdnZXN0KTsKLSAgICAgIGZvcihpbnQgaXY9MDtpdjxzaXplKCk7aXYrKykKLQl7Ci0JICByZWFkT2IoaW4sICgqdGhpcylbaXZdKTsKLQl9Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yPT0oY29uc3QgVmVjdG9yPFQ+ICZ4LCBjb25zdCBWZWN0b3I8VD4gJnkpCi17Ci0gIGlmKCAmeCA9PSAmeSApCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiggeS5zaXplKCkhPXguc2l6ZSgpICkKLQlyZXR1cm4gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IodW5zaWduZWQgaW50IGlpaT0wO2lpaTx4LnNpemUoKTtpaWkrKykKLQkgICAgaWYoICEoeFtpaWldPT15W2lpaV0pICkKLQkgICAgICByZXR1cm4gMDsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yIT0oY29uc3QgVmVjdG9yPFQ+ICZ4LCBjb25zdCBWZWN0b3I8VD4gJnkpCi17Ci0gIHJldHVybiAhKHg9PXkpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yPChjb25zdCBWZWN0b3I8VD4gJngsIGNvbnN0IFZlY3RvcjxUPiAmeSkKLXsKLSAgaWYoICZ4ID09ICZ5ICkKLSAgICByZXR1cm4gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmKCB5LnNpemUoKTx4LnNpemUoKSApCi0JcmV0dXJuICEoeTx4KTsKLSAgICAgIGZvcihpbnQgaWlpPTA7aWlpPHguc2l6ZSgpO2lpaSsrKQotCXsKLQkgIGFzc2VydCggaWlpIT15LnNpemUoKSApOwotCSAgaWYoIHhbaWlpXTx5W2lpaV0gKQotCSAgICByZXR1cm4gMTsKLQkgIGVsc2UgaWYoIHlbaWlpXTx4W2lpaV0gKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgICByZXR1cm4geC5zaXplKCkhPXkuc2l6ZSgpOy8vPz8KLSAgICB9Ci19Ci0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBWZWN0b3I8VD46OiBlcnJvckFjY2VzcyhpbnQgbikgY29uc3QKLXsKLSAgY2VyciAJPDwgIkVSUk9SOiBBY2Nlc3MgdG8gYXJyYXkgZWxlbWVudCAiIDw8IG4gCi0JPDwgIiAoIiA8PCBtYXhXcml0dGVuIDw8ICIsICIgPDwgcmVhbFNpemUgPDwgIiwgIiA8PCAodm9pZCopcCA8PCAiKVxuIjsKLSAgY291dCA8PCAgIkVSUk9SOiBBY2Nlc3MgdG8gYXJyYXkgZWxlbWVudCAiIDw8IG4gCi0gICAgICAgPDwgIiAoIiA8PCBtYXhXcml0dGVuIDw8ICIsICIgPDwgcmVhbFNpemUgPDwgIiwgIiA8PCAodm9pZCopcCA8PCAiKVxuIjsKLSAgYXNzZXJ0KDApOwotI2lmbmRlZiBERUJVRwotICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSZvLCBjb25zdCBWZWN0b3I8VD4mYSkKLXsKLSAgbyA8PCAiVmVjdG9yKCIgPDwgYS5zaXplKCkgPDwgIil7ICI7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaWlpPTA7aWlpPGEuc2l6ZSgpO2lpaSsrKQotICAgIG8gPDwgIiAiIDw8IGlpaTw8ICI6ICIgPDwgYVtpaWldPDwiIDsiOwotICByZXR1cm4gbyA8PCAifVxuIjsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJmluLCBWZWN0b3I8VD4mKQote3JldHVybiBpbjt9Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IGludCBIYXNoKGNvbnN0IFZlY3RvcjxUPiZhKQotewotICBpbnQgbj0wOwotICBmb3IoaW50IGlpaT0wO2lpaTxhLnNpemUoKTtpaWkrKykKLSAgICBuKz1IYXNoKGFbaWlpXSkqKGlpaSsxKTsKLSAgcmV0dXJuIG4rYS5zaXplKCkqNDc7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIFZlY3RvcjxUPjo6Y29weShUICphYSwgY29uc3QgVCAqYmIsIGludCBuKQotewotICBmb3IoaW50IGlpaT0wO2lpaTxuO2lpaSsrKQotICAgIGFhW2lpaV09YmJbaWlpXTsKLX0KLXRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgVmVjdG9yPFQ+Ojpjb3B5KFQgKmFhLCBUICpiYiwgaW50IG4pCi17Ci0gIGZvcihpbnQgaWlpPTA7aWlpPG47aWlpKyspCi0gICAgYWFbaWlpXT1iYltpaWldOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIFZlY3RvcjxUPjo6X2V4cGFuZCgpCi17Ci0jaWZkZWYgVkVSWV9BUlJBWV9ERUJVRwotICBjb3V0IDw8ICJGUkVFIEFSUkFZIGJlY2F1c2Ugb2YgX2V4cGFuZDogIiA8PCB0aGlzIDw8ICIgIiA8PCByZWFsU2l6ZTw8IiAiPDwodm9pZCopcCA8PCAnXG4nOwotI2VuZGlmCQkJCi0gIFQgKm9sZHA9cDsKLSAgaW50IG9sZHNpemU9cmVhbFNpemU7Ci0gIHJlYWxTaXplPXJlYWxTaXplKjIrMTsKLSAgcD1uZXcgVFtyZWFsU2l6ZV07Ci0gIG1lbW9fbmV3KHApOwotICBjb3B5KHAsIG9sZHAsIG9sZHNpemUpOwotICBkZWxldGUgW10gb2xkcDsKLSAgbWVtb19kZWwob2xkcCwgMSk7Ci0jaWZkZWYgVkVSWV9BUlJBWV9ERUJVRwotICBjb3V0IDw8ICJORVcgQVJSQVkgYmVjYXVzZSBvZiBfZXhwYW5kOiAiIDw8IHRoaXMgPDwgIiAiIDw8IHJlYWxTaXplPDwiICI8PCh2b2lkKilwIDw8ICdcbic7Ci0jZW5kaWYJCQkKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gaW50IFZlY3RvcjxUPjo6ZmluZE1heCgpIGNvbnN0Ci17Ci0gIGlmKCBzaXplKCk9PTAgKQotICAgIHJldHVybiAtMTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBtYXhQb3M9MDsKLSAgICAgIGZvcihpbnQgaWlpPTE7aWlpPHNpemUoKTtpaWkrKykKLQlpZiggKCp0aGlzKVttYXhQb3NdPCgqdGhpcylbaWlpXSApCi0JICBtYXhQb3M9aWlpOwotICAgICAgcmV0dXJuIG1heFBvczsKLSAgICB9Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUPiBpbnQgVmVjdG9yPFQ+OjpmaW5kTWluKCkgY29uc3QKLXsKLSAgaWYoIHNpemUoKT09MCApCi0gICAgcmV0dXJuIC0xOwotICBlbHNlCi0gICAgewotICAgICAgaW50IG1pblBvcz0wOwotICAgICAgZm9yKGludCBpaWk9MTtpaWk8c2l6ZSgpO2lpaSsrKQotCWlmKCAoKnRoaXMpW2lpaV08KCp0aGlzKVttaW5Qb3NdICkKLQkgIG1pblBvcz1paWk7Ci0gICAgICByZXR1cm4gbWluUG9zOwotICAgIH0KLX0KLQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvV29yZENsYXNzZXMuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL1dvcmRDbGFzc2VzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OTI1NTMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvV29yZENsYXNzZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdJWkErKyAoIGV4dGVuc2lvbiBvZiBHSVpBICkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpZm5kZWYgV29yZENsYXNzZXNfaF9ERUZJTkVECi0jZGVmaW5lIFdvcmRDbGFzc2VzX2hfREVGSU5FRAotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgInZvY2FiLmgiCi0KLWNsYXNzIFdvcmRDbGFzc2VzCi17Ci0gcHJpdmF0ZToKLSAgbWFwPHN0cmluZyxzdHJpbmc+IFN3MmM7Ci0gIG1hcDxzdHJpbmcsaW50PiBTYzJpbnQ7Ci0gIFZlY3RvcjxzdHJpbmc+IFNpbnQyYzsKLSAgVmVjdG9yPGludD4gdzJjOwotICB1bnNpZ25lZCBpbnQgY2xhc3NlczsKLSBwdWJsaWM6Ci0gIFdvcmRDbGFzc2VzKCkgCi0gICAgOiBjbGFzc2VzKDEpIAotICAgIHsKLSAgICAgIFNpbnQyYy5wdXNoX2JhY2soIjAiKTsKLSAgICAgIFNjMmludFsiMCJdPTA7Ci0gICAgfQotICB0ZW1wbGF0ZTxjbGFzcyBNQVBQRVI+IGJvb2wgcmVhZChpc3RyZWFtJmluLGNvbnN0IE1BUFBFUiZtLGNvbnN0IHZjYkxpc3QmIHZjYikKLSAgICB7Ci0gICAgICBzdHJpbmcgc2xpbmU7Ci0gICAgICBpbnQgbWF4d29yZD0wOwotCSAgaW50IHJlYWRXb3JkPTAsIHB1dFdvcmQ9MDsKLSAgICAgIHdoaWxlKGdldGxpbmUoaW4sc2xpbmUpKQotCSAgewotCQlyZWFkV29yZCArKzsKLQkgICAgc3RyaW5nIHdvcmQsd2NsYXNzOwotCSAgICBpc3Ryc3RyZWFtIGlsaW5lKHNsaW5lLmNfc3RyKCkpOwotCSAgICBpbGluZT4+d29yZD4+d2NsYXNzOwotCSAgICAKLSAgICAgICAgaWYoICFTYzJpbnQuY291bnQod2NsYXNzKSApCi0JICAgIHsKLQkgICAgICBTYzJpbnRbd2NsYXNzXT1jbGFzc2VzKys7Ci0JICAgICAgU2ludDJjLnB1c2hfYmFjayh3Y2xhc3MpOwotCSAgICAgIGFzc2VydChjbGFzc2VzPT1TaW50MmMuc2l6ZSgpKTsKLQkgICAgfQotCQlpZih2Y2IuaGFzX3dvcmQod29yZCkpewotCQkJbWF4d29yZD1tYXgobSh3b3JkKSxtYXh3b3JkKTsKLQkJCWFzc2VydChTdzJjLmNvdW50KHdvcmQpPT0wKTsKLQkJCVN3MmNbd29yZF09d2NsYXNzOwotCQkJcHV0V29yZCsrOwotCQl9Ci0JICB9Ci0gICAgICB3MmM9VmVjdG9yPGludD4obWF4d29yZCsxLDApOwotICAgICAgZm9yKG1hcDxzdHJpbmcsc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaT1TdzJjLmJlZ2luKCk7aSE9U3cyYy5lbmQoKTsrK2kpCi0JCQl3MmNbbShpLT5maXJzdCldPVNjMmludFtpLT5zZWNvbmRdOwotICAgICAgY291dCA8PCAiUmVhZCBjbGFzc2VzOiAjd29yZHM6ICIgPDwgbWF4d29yZCA8PCAiICIgPDwgIiAjY2xhc3NlczogIjw8IGNsYXNzZXMgPDxlbmRsOwotCSAgY291dCA8PCAiQWN0dWFsIG51bWJlciBvZiByZWFkIHdvcmRzOiAiIDw8IHJlYWRXb3JkIDw8ICIgc3RvcmVkIHdvcmRzOiAiIDw8IHB1dFdvcmQgPDwgZW5kbDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaW50IGdldENsYXNzKGludCB3KWNvbnN0Ci0gICAgewotICAgICAgaWYodz49MCYmaW50KHcpPGludCh3MmMuc2l6ZSgpKSApCi0JcmV0dXJuIHcyY1t3XTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGludCBvcGVyYXRvcigpKGNvbnN0IHN0cmluZyZ4KWNvbnN0Ci0gICAgewotICAgICAgaWYoIFNjMmludC5jb3VudCh4KSApCi0JcmV0dXJuIFNjMmludC5maW5kKHgpLT5zZWNvbmQ7Ci0gICAgICBlbHNlCi0JewotCSAgY2VyciA8PCAiV0FSTklORzogIGNsYXNzICIgPDwgeCA8PCAiIG5vdCBmb3VuZC5cbiI7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICBzdHJpbmcgY2xhc3NTdHJpbmcodW5zaWduZWQgaW50IGNuciljb25zdAotICAgIHsKLSAgICAgIGlmKCBjbnI8U2ludDJjLnNpemUoKSkKLQlyZXR1cm4gU2ludDJjW2Nucl07Ci0gICAgICBlbHNlCi0JcmV0dXJuIHN0cmluZygiMCIpOwotICAgIH0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvYWxpZ25tZW50LmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2FsaWdubWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YTJlNWMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvYWxpZ25tZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0KLUVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotLyotLQotYWxpZ25tZW50OiAnY2hlY2tlZCcgYWxpZ25tZW50IHJlcHJlc2VudGF0aW9uIHdpdGggYXV0b21hdGljIGNhbGN1bGF0aW9uCi0gICAgICAgICAgIG9mIGZlcnRpbGl0aWVzCi1GcmFueiBKb3NlZiBPY2ggKDMwLzA3Lzk5KQotLS0qLwotI2luY2x1ZGUgImFsaWdubWVudC5oIgotCi1vc3RyZWFtJm9wZXJhdG9yPDwob3N0cmVhbSZvdXQsIGNvbnN0IGFsaWdubWVudCZhKQotewotICBpbnQgbT1hLmEuc2l6ZSgpLTEsbD1hLmYuc2l6ZSgpLTE7Ci0gIG91dCA8PCAiQUwobDoiPDxsPDwiLG06Ijw8bTw8IikoYTogIjsKLSAgZm9yKGludCBqPTE7ajw9bTtqKyspb3V0IDw8IGEoaikgPDwgJyAnOwotICBvdXQgPDwgIikoZmVydDogIjsKLSAgZm9yKGludCBpPTA7aTw9bDtpKyspb3V0IDw8IGEuZmVydChpKSA8PCAnICc7Ci0gIHJldHVybiBvdXQgPDwgIikgIGM6Ijw8IlxuIjsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvYWxpZ25tZW50LmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9hbGlnbm1lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc3NzRjNi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9hbGlnbm1lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLS8qLS0KLWFsaWdubWVudDogJ2NoZWNrZWQnIGFsaWdubWVudCByZXByZXNlbnRhdGlvbiB3aXRoIGF1dG9tLiBjYWxjLiBvZiBmZXJ0aWxpdGllcwotRnJhbnogSm9zZWYgT2NoICgzMC8wNy85OSkKLS0tKi8KLSNpZm5kZWYgYWxpZ25tZW50X2hfZmpvX2RlZmluZWQKLSNkZWZpbmUgYWxpZ25tZW50X2hfZmpvX2RlZmluZWQKLSNpbmNsdWRlICJWZWN0b3IuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAibXlhc3NlcnQuaCIKLQotY2xhc3MgYWxfc3RydWN0Ci17Ci0gcHVibGljOgotICBhbF9zdHJ1Y3QoKQotICAgIDogcHJldigwKSxuZXh0KDApe30KLSAgUG9zaXRpb25JbmRleCBwcmV2LG5leHQ7Ci19OwotCi0KLWNsYXNzIGFsaWdubWVudAotewotIHByaXZhdGU6Ci0gIFZlY3RvcjxQb3NpdGlvbkluZGV4PiBhOwotICBWZWN0b3I8UG9zaXRpb25JbmRleD4gcG9zaXRpb25TdW0sZjsKLSBwdWJsaWM6Ci0gIFZlY3RvcjxQb3NpdGlvbkluZGV4PiBhbHNfaTsKLSAgVmVjdG9yPGFsX3N0cnVjdD4gIGFsc19qOwotICBQb3NpdGlvbkluZGV4IGwsbTsKLSAgYWxpZ25tZW50KCkKLSAgICB7fQotICBhbGlnbm1lbnQoUG9zaXRpb25JbmRleCBfbCwgUG9zaXRpb25JbmRleCBfbSkKLSAgICA6IGEoX20rMSwgKFBvc2l0aW9uSW5kZXgpMCksCi0gICAgcG9zaXRpb25TdW0oX2wrMSwgKFBvc2l0aW9uSW5kZXgpMCksIGYoX2wrMSwgKFBvc2l0aW9uSW5kZXgpMCksIGFsc19pKF9sKzEsMCksYWxzX2ooX20rMSksbChfbCksIG0oX20pCi0gICAgewotICAgICAgZlswXT1tOwotICAgICAgZm9yKFBvc2l0aW9uSW5kZXggaj0xO2o8PW07aisrKQotCXsKLQkgIGlmKCBqPjEgKQotCSAgICBhbHNfaltqXS5wcmV2PSBqLTE7Ci0JICBpZiggajxtICkKLQkgICAgYWxzX2pbal0ubmV4dD0gaisxOwotCX0KLSAgICAgIGFsc19pWzBdPTE7Ci0gICAgfQotICBQb3NpdGlvbkluZGV4IGdldF9sKCljb25zdAotICAgIHtyZXR1cm4gbDt9Ci0gIFBvc2l0aW9uSW5kZXggZ2V0X20oKWNvbnN0Ci0gICAge3JldHVybiBtO30KLSAgdm9pZCBkb01vdmUoaW50IGksaW50IGopCi0gICAgewotICAgICAgc2V0KGosaSk7Ci0gICAgfQotICB2b2lkIGRvU3dhcChpbnQgajEsaW50IGoyKQotICAgIHsKLSAgICAgIGludCBhajE9YVtqMV0sYWoyPWFbajJdOwotICAgICAgc2V0KGoxLGFqMik7Ci0gICAgICBzZXQoajIsYWoxKTsKLSAgICB9Ci0gIHZvaWQgc2V0KFBvc2l0aW9uSW5kZXggaiwgUG9zaXRpb25JbmRleCBhaikKLSAgICB7Ci0gICAgICBQb3NpdGlvbkluZGV4IG9sZF9haj1hW2pdOwotICAgICAgbWFzc2VydChqPGEuc2l6ZSgpKTttYXNzZXJ0KGFqPGYuc2l6ZSgpKTsKLSAgICAgIG1hc3NlcnQob2xkX2FqPGYuc2l6ZSgpKTttYXNzZXJ0KGZbb2xkX2FqXT4wKTsKLSAgICAgIG1hc3NlcnQoaj4wKTsKLSAgICAgIHBvc2l0aW9uU3VtW29sZF9hal0tPWo7Ci0gICAgICAvLyBhdXNmdWVnZW4KLSAgICAgIFBvc2l0aW9uSW5kZXggcHJldj1hbHNfaltqXS5wcmV2OwotICAgICAgUG9zaXRpb25JbmRleCBuZXh0PWFsc19qW2pdLm5leHQ7Ci0gICAgICBpZiggbmV4dCApCi0JYWxzX2pbbmV4dF0ucHJldj1wcmV2OwotICAgICAgaWYoIHByZXYgKQotCWFsc19qW3ByZXZdLm5leHQ9bmV4dDsKLSAgICAgIGVsc2UKLQlhbHNfaVtvbGRfYWpdPW5leHQ7Ci0gICAgICAKLSAgICAgIC8vIG5ldWUgUG9zaXRpb24gc3VjaGVuCi0gICAgICBQb3NpdGlvbkluZGV4IGxmZD1hbHNfaVthal0sbGxmZD0wOwotICAgICAgd2hpbGUoIGxmZCAmJiBsZmQ8aiApCi0JbGZkID0gYWxzX2pbbGxmZD1sZmRdLm5leHQ7Ci0KLSAgICAgIC8vIGVpbmZ1ZWdlbgotICAgICAgYWxzX2pbal0ucHJldj1sbGZkOwotICAgICAgYWxzX2pbal0ubmV4dD1sZmQ7Ci0gICAgICBpZiggbGxmZCApCi0JYWxzX2pbbGxmZF0ubmV4dD1qOwotICAgICAgZWxzZQotCWFsc19pW2FqXT1qOwotICAgICAgaWYoIGxmZCApCi0JYWxzX2pbbGZkXS5wcmV2PWo7Ci0KLSAgICAgIGZbb2xkX2FqXS0tOwotICAgICAgcG9zaXRpb25TdW1bYWpdKz1qOwotICAgICAgZlthal0rKzsKLSAgICAgIGFbal09YWo7Ci0gICAgfQotICBjb25zdCBWZWN0b3I8UG9zaXRpb25JbmRleD4mIGdldEFsaWdubWVudCgpIGNvbnN0IAotICAgIHtyZXR1cm4gYSA7fQotICBQb3NpdGlvbkluZGV4IGdldF9hbChQb3NpdGlvbkluZGV4IGopY29uc3QKLSAgICB7Ci0gICAgICBtYXNzZXJ0KGo8YS5zaXplKCkpOwotICAgICAgcmV0dXJuIGFbal07Ci0gICAgfQotICBQb3NpdGlvbkluZGV4IG9wZXJhdG9yKCkoUG9zaXRpb25JbmRleCBqKWNvbnN0Ci0gICAgewotICAgICAgbWFzc2VydChqPGEuc2l6ZSgpKTsKLSAgICAgIHJldHVybiBhW2pdOwotICAgIH0KLSAgUG9zaXRpb25JbmRleCBmZXJ0KFBvc2l0aW9uSW5kZXggaSljb25zdAotICAgIHsKLSAgICAgIG1hc3NlcnQoaTxmLnNpemUoKSk7Ci0gICAgICByZXR1cm4gZltpXTsKLSAgICB9Ci0gIFBvc2l0aW9uSW5kZXggZ2V0X2hlYWQoUG9zaXRpb25JbmRleCBpKWNvbnN0Ci0gICAgewotICAgICAgbWFzc2VydCggYWxzX2lbaV09PV9nZXRfaGVhZChpKSApOwotICAgICAgcmV0dXJuIGFsc19pW2ldOwotICAgIH0KLSAgUG9zaXRpb25JbmRleCBnZXRfY2VudGVyKFBvc2l0aW9uSW5kZXggaSljb25zdAotICAgIHsKLSAgICAgIGlmKCBpPT0wIClyZXR1cm4gMDsKLSAgICAgIG1hc3NlcnQoKChwb3NpdGlvblN1bVtpXStmW2ldLTEpL2ZbaV09PV9nZXRfY2VudGVyKGkpKSk7Ci0gICAgICByZXR1cm4gKHBvc2l0aW9uU3VtW2ldK2ZbaV0tMSkvZltpXTsKLSAgICB9Ci0gIFBvc2l0aW9uSW5kZXggX2dldF9oZWFkKFBvc2l0aW9uSW5kZXggaSljb25zdAotICAgIHsKLSAgICAgIGlmKCBmZXJ0KGkpPT0wIClyZXR1cm4gMDsKLSAgICAgIGZvcihQb3NpdGlvbkluZGV4IGo9MTtqPD1tO2orKykKLQlpZiggYVtqXT09aSApCi0JICByZXR1cm4gajsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgUG9zaXRpb25JbmRleCBfZ2V0X2NlbnRlcihQb3NpdGlvbkluZGV4IGkpY29uc3QKLSAgICB7Ci0gICAgICBpZiggaT09MCApcmV0dXJuIDA7Ci0gICAgICBtYXNzZXJ0KGZlcnQoaSkpOwotICAgICAgUG9zaXRpb25JbmRleCBzdW09MDsKLSAgICAgIGZvcihQb3NpdGlvbkluZGV4IGo9MTtqPD1tO2orKykKLQlpZiggYVtqXT09aSApCi0JICBzdW0rPWo7Ci0gICAgICByZXR1cm4gKHN1bStmZXJ0KGkpLTEpL2ZlcnQoaSk7Ci0gICAgfQotICBQb3NpdGlvbkluZGV4IHByZXZfY2VwdChQb3NpdGlvbkluZGV4IGkpY29uc3QKLSAgICB7Ci0gICAgICBpZiggaT09MCApcmV0dXJuIDA7Ci0gICAgICBQb3NpdGlvbkluZGV4IGs9aS0xOwotICAgICAgd2hpbGUoayYmZmVydChrKT09MCkKLQlrLS07Ci0gICAgICByZXR1cm4gazsKLSAgICB9Ci0gIFBvc2l0aW9uSW5kZXggbmV4dF9jZXB0KFBvc2l0aW9uSW5kZXggaSljb25zdAotICAgIHsKLSAgICAgIFBvc2l0aW9uSW5kZXggaz1pKzE7Ci0gICAgICB3aGlsZShrPGwrMSYmZmVydChrKT09MCkKLQlrKys7Ci0gICAgICByZXR1cm4gazsKLSAgICB9Ci0gIFBvc2l0aW9uSW5kZXggcHJldl9pbl9jZXB0KFBvc2l0aW9uSW5kZXggailjb25zdAotICAgIHsKLSAgICAgIC8vUG9zaXRpb25JbmRleCBrPWotMTsKLSAgICAgIC8vd2hpbGUoayYmYVtrXSE9YVtqXSkKLSAgICAgIC8vay0tOwotICAgICAgLy9hc3NlcnQoIGFsc19qW2pdLnByZXY9PWsgKTsKLSAgICAgIC8vYXNzZXJ0KGspOwotICAgICAgLy9yZXR1cm4gazsKLSAgICAgIG1hc3NlcnQoYWxzX2pbal0ucHJldj09MHx8YVthbHNfaltqXS5wcmV2XT09YVtqXSk7Ci0gICAgICByZXR1cm4gYWxzX2pbal0ucHJldjsKLSAgICB9Ci0gIGZyaWVuZCBvc3RyZWFtICZvcGVyYXRvcjw8KG9zdHJlYW0mb3V0LCBjb25zdCBhbGlnbm1lbnQmYSk7Ci0gIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgYWxpZ25tZW50JmEsIGNvbnN0IGFsaWdubWVudCZiKQotICAgIHsKLSAgICAgIG1hc3NlcnQoYS5hLnNpemUoKT09Yi5hLnNpemUoKSk7Ci0gICAgICBmb3IoUG9zaXRpb25JbmRleCBqPTE7ajw9YS5nZXRfbSgpO2orKykKLQlpZihhKGopIT1iKGopKQotCSAgcmV0dXJuIDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBhbGlnbm1lbnQmeCwgY29uc3QgYWxpZ25tZW50JnkpCi0gICAgewotICAgICAgbWFzc2VydCh4LmdldF9tKCk9PXkuZ2V0X20oKSk7Ci0gICAgICBmb3IoUG9zaXRpb25JbmRleCBqPTE7ajw9eC5nZXRfbSgpO2orKykKLQlpZiggeChqKTx5KGopICkgCi0JICByZXR1cm4gMTsKLQllbHNlIGlmKCB5KGopPHgoaikgKQotCSAgcmV0dXJuIDA7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGZyaWVuZCBpbnQgZGlmZmVyZW5jZXMoY29uc3QgYWxpZ25tZW50JngsIGNvbnN0IGFsaWdubWVudCZ5KXsKLSAgICBpbnQgY291bnQ9MDsKLSAgICBtYXNzZXJ0KHguZ2V0X20oKT09eS5nZXRfbSgpKTsKLSAgICBmb3IoUG9zaXRpb25JbmRleCBqPTE7ajw9eC5nZXRfbSgpO2orKykKLSAgICAgIGNvdW50ICs9ICh4KGopIT15KGopKTsKLSAgICByZXR1cm4gY291bnQ7Ci0gIH0KLSAgYm9vbCB2YWxpZCgpY29uc3QKLSAgICB7Ci0gICAgICBpZiggMipmWzBdPm0gKQotCXJldHVybiAwOwotICAgICAgZm9yKHVuc2lnbmVkIGludCBpPTE7aTw9bDtpKyspCi0JaWYoIGZbaV0+PU1BWF9GRVJUSUxJVFkgKQotCSAgcmV0dXJuIDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGZyaWVuZCBjbGFzcyB0cmFuc3BhaXJfbW9kZWw1OwotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvY21kLmMgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9jbWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzYjVhOS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9jbWQuYworKysgL2Rldi9udWxsCkBAIC0xLDY1NSArMCwwIEBACi0KLS8vICRJZDogY21kLmMgMTMwNyAyMDA3LTAzLTE0IDIyOjIyOjM2WiBoaWV1aG9hbmcxOTcyICQKLQotI2luY2x1ZGUJPHN0ZGlvLmg+Ci0jaW5jbHVkZQk8c3RkbGliLmg+Ci0jaW5jbHVkZQk8Y3R5cGUuaD4KLSNpbmNsdWRlCTxzdHJpbmcuaD4KLQotCi0jaW5jbHVkZQkiY21kLmgiCi0KLSNpZmRlZiBXSU4zMgotIwkJZGVmaW5lIHBvcGVuCV9wb3BlbgotIwkJZGVmaW5lIHBjbG9zZSBfcGNsb3NlCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZW5kaWYKLQotc3RhdGljIEVudW1fVAlCb29sRW51bVtdID0gewotCXsJIkZBTFNFIiwJMAl9LAotCXsJIlRSVUUiLAkJMQl9LAotCXsJMCwJCTAJfQotfTsKLQotI2lmZGVmCU5FRURTVFJEVVAKLWNoYXIJKnN0cmR1cCgpOwotI2VuZGlmCi0KLSNkZWZpbmUJRkFMU0UJMAotI2RlZmluZQlUUlVFCTEKLQotI2RlZmluZQlMSU5TSVoJCTEwMjQwCi0jZGVmaW5lCU1BWFBBUkFNCTI1NgotCi1zdGF0aWMgY2hhcgkqR2V0TGluZSgpLAotCQkqKnN0cjJhcnJheSgpOwotc3RhdGljIGludAlTY2FuKCksCi0JCVNldFBhcmFtKCksCi0JCVNldEVudW0oKSwKLQkJU2V0U3VicmFuZ2UoKSwKLQkJU2V0U3RyQXJyYXkoKSwKLQkJU2V0R3RlKCksCi0JCVNldEx0ZSgpLAotCQlDbWRFcnJvcigpLAotCQlFbnVtRXJyb3IoKSwKLQkJU3VicmFuZ2VFcnJvcigpLAotCQlHdGVFcnJvcigpLAotCQlMdGVFcnJvcigpLAotCQlQcmludFBhcmFtKCksCi0JCVByaW50RW51bSgpLAotCQlQcmludFN0ckFycmF5KCk7Ci0KLXN0YXRpYyBDbWRfVAljbWRzW01BWFBBUkFNKzFdOwotc3RhdGljIGNoYXIJKlNlcFN0cmluZyA9ICIgXHRcbiI7Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKQotI2luY2x1ZGUJPHN0ZGFyZy5oPgotaW50IERlY2xhcmVQYXJhbXMoY2hhciAqUGFyTmFtZSwgLi4uKQotI2Vsc2UKLSNpZmRlZiBXSU4zMgotaW50IERlY2xhcmVQYXJhbXMoY2hhciAqUGFyTmFtZSwgLi4uKQotI2Vsc2UKLSNpbmNsdWRlCTx2YXJhcmdzLmg+Ci1pbnQgRGVjbGFyZVBhcmFtcyhQYXJOYW1lLCB2YV9hbGlzdCkKLWNoYXIJKlBhck5hbWU7Ci12YV9kY2wKLSNlbmRpZgotI2VuZGlmCi17Ci0JdmFfbGlzdAkJYXJnczsKLQlzdGF0aWMgaW50CVBhcmFtTiA9IDA7Ci0JaW50CQlqLAotCQkJYzsKLQljaGFyCQkqczsKLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQgKFdJTjMyKQotCXZhX3N0YXJ0KGFyZ3MsIFBhck5hbWUpOwotI2Vsc2UKLQl2YV9zdGFydChhcmdzKTsKLSNlbmRpZgotCWZvcig7UGFyTmFtZTspIHsKLQkJaWYoUGFyYW1OPT1NQVhQQVJBTSkgewotCQkJZnByaW50ZihzdGRlcnIsICJUb28gbWFueSBwYXJhbWV0ZXJzICEhXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWZvcihqPTAsYz0xOyBqPFBhcmFtTiYmKGM9c3RyY21wKGNtZHNbal0uTmFtZSxQYXJOYW1lKSk8MDsgaisrKQotCQkJOwotCQlpZighYykgewotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIldhcm5pbmc6IHBhcmFtZXRlciBcIiVzXCIgZGVjbGFyZWQgdHdpY2UuXG4iLAotCQkJCVBhck5hbWUpOwotCQl9Ci0JCWZvcihjPVBhcmFtTjsgYz5qOyBjLS0pIHsKLQkJCWNtZHNbY10gPSBjbWRzW2MtMV07Ci0JCX0KLQkJY21kc1tqXS5OYW1lID0gUGFyTmFtZTsKLQkJY21kc1tqXS5UeXBlID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0JCWNtZHNbal0uVmFsID0gdmFfYXJnKGFyZ3MsIHZvaWQgKik7Ci0JCXN3aXRjaChjbWRzW2pdLlR5cGUpIHsKLQkJY2FzZSBDTURFTlVNVFlQRToJLyogZ2V0IHRoZSBwb2ludGVyIHRvIEVudW1fVCBzdHJ1Y3QgICovCi0JCQljbWRzW2pdLnAgPSB2YV9hcmcoYXJncywgdm9pZCAqKTsKLQkJCWJyZWFrOwotCQljYXNlIENNRFNVQlJBTkdFVFlQRToJLyogZ2V0IHRoZSB0d28gZXh0cmVtZXMJCSAgICAgKi8KLQkJCWNtZHNbal0ucCA9ICh2b2lkKikgY2FsbG9jKDIsIHNpemVvZihpbnQpKTsKLQkJCSgoaW50KiljbWRzW2pdLnApWzBdID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0JCQkoKGludCopY21kc1tqXS5wKVsxXSA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01ER1RFVFlQRToJLyogZ2V0IGxvd2VyIG9yIHVwcGVyIGJvdW5kCSAgICAgKi8KLQkJY2FzZSBDTURMVEVUWVBFOgotCQkJY21kc1tqXS5wID0gKHZvaWQqKSBjYWxsb2MoMSwgc2l6ZW9mKGludCkpOwotCQkJKChpbnQqKWNtZHNbal0ucClbMF0gPSB2YV9hcmcoYXJncywgaW50KTsKLQkJCWJyZWFrOwotCQljYXNlIENNRFNUUkFSUkFZVFlQRToJLyogZ2V0IHRoZSBzZXBhcmF0b3JzIHN0cmluZwkgICAgICovCi0JCQljbWRzW2pdLnAgPSAocz12YV9hcmcoYXJncywgY2hhciopKQotCQkJCSAgICA/ICh2b2lkKilzdHJkdXAocykgOiAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01EQk9PTFRZUEU6Ci0JCQljbWRzW2pdLlR5cGUgPSBDTURFTlVNVFlQRTsKLQkJCWNtZHNbal0ucCA9IEJvb2xFbnVtOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01ERE9VQkxFVFlQRToJLyogbm90aGluZyBlbHNlIGlzIG5lZWRlZAkgICAgICovCi0JCWNhc2UgQ01ESU5UVFlQRToKLQkJY2FzZSBDTURTVFJJTkdUWVBFOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyAlZCAlcyBcIiVzXCJcbiIsCi0JCQkJIkRlY2xhcmVQYXJhbSgpIiwgIlVua25vd24gVHlwZSIsCi0JCQkJY21kc1tqXS5UeXBlLCAiZm9yIHBhcmFtZXRlciIsIGNtZHNbal0uTmFtZSk7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCVBhcmFtTisrOwotCQlQYXJOYW1lID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7Ci0JfQotCWNtZHNbUGFyYW1OXS5OYW1lID0gTlVMTDsKLQl2YV9lbmQoYXJncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBHZXRQYXJhbXMobiwgYSwgQ21kRmlsZU5hbWUpCi1pbnQJKm47Ci1jaGFyCSoqKmE7Ci1jaGFyCSpDbWRGaWxlTmFtZTsKLXsKLQljaGFyCSpMaW5lLAotCQkqUHJvZ05hbWU7Ci0JaW50CWFyZ2MgPSAqbjsKLQljaGFyCSoqYXJndiA9ICphLAotCQkqczsKLQlGSUxFCSpmcDsKLQlpbnQJSXNQaXBlOwotCi0jaWZkZWYJTVNET1MKLSNkZWZpbmUJUEFUSFNFUCAnXFwnCi0JY2hhcgkqZG90ID0gTlVMTDsKLSNlbHNlCi0jZGVmaW5lCVBBVEhTRVAgJy8nCi0jZW5kaWYKLQotCWlmKCEoTGluZT1tYWxsb2MoTElOU0laKSkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJHZXRQYXJhbXMoKTogVW5hYmxlIHRvIGFsbG9jICVkIGJ5dGVzXG4iLAotCQkJTElOU0laKTsKLQkJZXhpdCgxKTsKLQl9Ci0JaWYoKFByb2dOYW1lPXN0cnJjaHIoKmFyZ3YsIFBBVEhTRVApKSkgewotCQkrK1Byb2dOYW1lOwotCX0gZWxzZSB7Ci0JCVByb2dOYW1lID0gKmFyZ3Y7Ci0JfQotI2lmZGVmCU1TRE9TCi0JaWYoZG90PXN0cmNocihQcm9nTmFtZSwgJy4nKSkgKmRvdCA9IDA7Ci0jZW5kaWYKLQktLWFyZ2M7Ci0JKythcmd2OwotCWZvcig7OykgewotCQlpZihhcmdjICYmIGFyZ3ZbMF1bMF09PSctJyAmJiBhcmd2WzBdWzFdPT0nPScpIHsKLQkJCUNtZEZpbGVOYW1lID0gYXJndlswXSsyOwotCQkJKythcmd2OwotCQkJLS1hcmdjOwotCQl9Ci0JCWlmKCFDbWRGaWxlTmFtZSkgewotCQkJYnJlYWs7Ci0JCX0KLQkJSXNQaXBlID0gIXN0cm5jbXAoQ21kRmlsZU5hbWUsICJAQCIsIDIpOwotCQlmcCA9IElzUGlwZQotCQkgICAgID8gcG9wZW4oQ21kRmlsZU5hbWUrMiwgInIiKQotCQkgICAgIDogc3RyY21wKENtZEZpbGVOYW1lLCAiLSIpCi0JCSAgICAgICA/IGZvcGVuKENtZEZpbGVOYW1lLCAiciIpCi0JCSAgICAgICA6IHN0ZGluOwotCQlpZighZnApIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gY29tbWFuZCBmaWxlICVzXG4iLAotCQkJCUNtZEZpbGVOYW1lKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJd2hpbGUoR2V0TGluZShmcCwgTElOU0laLCBMaW5lKSAmJiBzdHJjbXAoTGluZSwgIlxcRW5kIikpIHsKLQkJCWlmKFNjYW4oUHJvZ05hbWUsIGNtZHMsIExpbmUpKSB7Ci0JCQkJQ21kRXJyb3IoTGluZSk7Ci0JCQl9Ci0JCX0KLQkJaWYoZnAhPXN0ZGluKSB7Ci0JCQlpZihJc1BpcGUpIHBjbG9zZShmcCk7IGVsc2UgZmNsb3NlKGZwKTsKLQkJfQotCQlDbWRGaWxlTmFtZSA9IE5VTEw7Ci0JfQotCXdoaWxlKGFyZ2MgJiYgKiphcmd2PT0nLScgJiYgKHM9c3RyY2hyKCphcmd2LCAnPScpKSkgewotCQkqcyA9ICcgJzsKLQkJc3ByaW50ZihMaW5lLCAiJXMvJXMiLCBQcm9nTmFtZSwgKmFyZ3YrMSk7Ci0JCSpzID0gJz0nOwotCQlpZihTY2FuKFByb2dOYW1lLCBjbWRzLCBMaW5lKSkgQ21kRXJyb3IoKmFyZ3YpOwotCQktLWFyZ2M7Ci0JCSsrYXJndjsKLQl9Ci0JKm4gPSBhcmdjOwotCSphID0gYXJndjsKLSNpZmRlZiBNU0RPUwotCWlmKGRvdCkgKmRvdCA9ICcuJzsKLSNlbmRpZgotCWZyZWUoTGluZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBQcmludFBhcmFtcyhWYWxGbGFnLCBmcCkKLWludAlWYWxGbGFnOwotRklMRQkqZnA7Ci17Ci0JaW50CWk7Ci0KLQlmZmx1c2goZnApOwotCWlmKFZhbEZsYWcpIHsKLQkJZnByaW50ZihmcCwgIlBhcmFtZXRlcnMgVmFsdWVzOlxuIik7Ci0JfSBlbHNlIHsKLQkJZnByaW50ZihmcCwgIlBhcmFtZXRlcnM6XG4iKTsKLQl9Ci0JZm9yKGk9MDsgY21kc1tpXS5OYW1lOyBpKyspIFByaW50UGFyYW0oY21kcytpLCBWYWxGbGFnLCBmcCk7Ci0JZnByaW50ZihmcCwgIlxuIik7Ci0JZmZsdXNoKGZwKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IFNQcmludFBhcmFtcyhhLCBwZngpCi1jaGFyCSoqKmEsCi0JKnBmeDsKLXsKLQlpbnQJbCwKLQkJbjsKLQlDbWRfVAkqY21kOwotCi0JaWYoIXBmeCkgcGZ4PSIiOwotCWwgPSBzdHJsZW4ocGZ4KTsKLQlmb3Iobj0wLCBjbWQ9Y21kczsgY21kLT5OYW1lOyBjbWQrKykgbiArPSAhIWNtZC0+QXJnU3RyOwotCWFbMF0gPSBjYWxsb2Mobiwgc2l6ZW9mKGNoYXIqKSk7Ci0JZm9yKG49MCwgY21kPWNtZHM7IGNtZC0+TmFtZTsgY21kKyspIHsKLQkJaWYoIWNtZC0+QXJnU3RyKSBjb250aW51ZTsKLQkJYVswXVtuXSA9IG1hbGxvYyhzdHJsZW4oY21kLT5OYW1lKStzdHJsZW4oY21kLT5BcmdTdHIpK2wrMik7Ci0JCXNwcmludGYoYVswXVtuXSwgIiVzJXM9JXMiLCBwZngsIGNtZC0+TmFtZSwgY21kLT5BcmdTdHIpOwotCQkrK247Ci0JfQotCXJldHVybiBuOwotfQotCi1zdGF0aWMgaW50IENtZEVycm9yKG9wdCkKLWNoYXIJKm9wdDsKLXsKLQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgb3B0aW9uIFwiJXNcIlxuIiwgb3B0KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlRoaXMgcHJvZ3JhbSBleHBlY3RlcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4iKTsKLQlQcmludFBhcmFtcyhGQUxTRSwgc3RkZXJyKTsKLQlleGl0KDApOwotfQotCi1zdGF0aWMgaW50IFByaW50UGFyYW0oY21kLCBWYWxGbGFnLCBmcCkKLUNtZF9UCSpjbWQ7Ci1pbnQJVmFsRmxhZzsKLUZJTEUJKmZwOwotewotCWZwcmludGYoZnAsICIlNHMiLCAiIik7Ci0Jc3dpdGNoKGNtZC0+VHlwZSkgewotCWNhc2UgQ01ERE9VQkxFVFlQRToKLQkJZnByaW50ZihmcCwgIiVzIiwgY21kLT5OYW1lKTsKLQkJaWYoVmFsRmxhZykgZnByaW50ZihmcCwgIjogJTIyLjE1ZSIsICooZG91YmxlICopY21kLT5WYWwpOwotCQlmcHJpbnRmKGZwLCAiXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURFTlVNVFlQRToKLQkJUHJpbnRFbnVtKGNtZCwgVmFsRmxhZywgZnApOwotCQlicmVhazsKLQljYXNlIENNRElOVFRZUEU6Ci0JY2FzZSBDTURTVUJSQU5HRVRZUEU6Ci0JY2FzZSBDTURHVEVUWVBFOgotCWNhc2UgQ01ETFRFVFlQRToKLQkJZnByaW50ZihmcCwgIiVzIiwgY21kLT5OYW1lKTsKLQkJaWYoVmFsRmxhZykgZnByaW50ZihmcCwgIjogJWQiLCAqKGludCAqKWNtZC0+VmFsKTsKLQkJZnByaW50ZihmcCwgIlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgQ01EU1RSSU5HVFlQRToKLQkJZnByaW50ZihmcCwgIiVzIiwgY21kLT5OYW1lKTsKLQkJaWYoVmFsRmxhZykgewotCQkJaWYoKihjaGFyICoqKWNtZC0+VmFsKSB7Ci0JCQkJZnByaW50ZihmcCwgIjogXCIlc1wiIiwgKihjaGFyICoqKWNtZC0+VmFsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZnByaW50ZihmcCwgIjogJXMiLCAiTlVMTCIpOwotCQkJfQotCQl9Ci0JCWZwcmludGYoZnAsICJcbiIpOwotCQlicmVhazsKLQljYXNlIENNRFNUUkFSUkFZVFlQRToKLQkJUHJpbnRTdHJBcnJheShjbWQsIFZhbEZsYWcsIGZwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICIlczogJXMgJWQgJXMgXCIlc1wiXG4iLAotCQkJIlByaW50UGFyYW0iLAotCQkJIlVua25vd24gVHlwZSIsCi0JCQljbWQtPlR5cGUsCi0JCQkiZm9yIHBhcmFtZXRlciIsCi0JCQljbWQtPk5hbWUpOwotCQlleGl0KDEpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNoYXIgKkdldExpbmUoZnAsIG4sIExpbmUpCi1GSUxFCSpmcDsKLWludAluOwotY2hhcgkqTGluZTsKLXsKLQlpbnQJaiwKLQkJbCwKLQkJb2Zmcz0wOwotCi0JZm9yKDs7KSB7Ci0JCWlmKCFmZ2V0cyhMaW5lK29mZnMsIG4tb2ZmcywgZnApKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZihMaW5lW29mZnNdPT0nIycpIGNvbnRpbnVlOwotCQlsID0gc3RybGVuKExpbmUrb2ZmcyktMTsKLQkJTGluZVtvZmZzK2xdID0gMDsKLQkJZm9yKGo9b2ZmczsgTGluZVtqXSAmJiBpc3NwYWNlKExpbmVbal0pOyBqKyssIGwtLSkKLQkJCTsKLQkJaWYobDwxKSBjb250aW51ZTsKLQkJaWYoaiA+IG9mZnMpIHsKLQkJCWNoYXIJKnMgPSBMaW5lK29mZnMsCi0JCQkJKnEgPSBMaW5lK2o7Ci0KLQkJCXdoaWxlKCgqcysrPSpxKyspKQotCQkJCTsKLQkJfQotCQlpZihMaW5lW29mZnMrbC0xXT09J1xcJykgewotCQkJb2ZmcyArPSBsOwotCQkJTGluZVtvZmZzLTFdID0gJyAnOwotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIExpbmU7Ci19Ci0KLXN0YXRpYyBpbnQgU2NhbihQcm9nTmFtZSwgY21kcywgTGluZSkKLWNoYXIJKlByb2dOYW1lLAotCSpMaW5lOwotQ21kX1QJKmNtZHM7Ci17Ci0JY2hhcgkqcSwKLQkJKnA7Ci0JaW50CWksCi0JCWhsLAotCQlIYXNUb01hdGNoID0gRkFMU0UsCi0JCWMwLAotCQljOwotCi0JcCA9IExpbmUrc3Ryc3BuKExpbmUsIFNlcFN0cmluZyk7Ci0JaWYoIShobD1zdHJjc3BuKHAsIFNlcFN0cmluZykpKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZigocT1zdHJjaHIocCwgJy8nKSkgJiYgcS1wPGhsKSB7Ci0JCSpxID0gMDsKLQkJaWYoc3RyY21wKHAsIFByb2dOYW1lKSkgewotCQkJKnEgPSAnLyc7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkqcSA9ICcvJzsKLQkJSGFzVG9NYXRjaD1UUlVFOwotCQlwID0gcSsxOwotCX0KLQlpZighKGhsID0gc3RyY3NwbihwLCBTZXBTdHJpbmcpKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JYzAgPSBwW2hsXTsKLQlwW2hsXSA9IDA7Ci0JZm9yKGk9MCwgYz0xOyBjbWRzW2ldLk5hbWUmJihjPXN0cmNtcChjbWRzW2ldLk5hbWUsIHApKTwwOyBpKyspCi0JCTsKLQlwW2hsXSA9IGMwOwotCWlmKCFjKSByZXR1cm4gU2V0UGFyYW0oY21kcytpLCBwK2hsK3N0cnNwbihwK2hsLCBTZXBTdHJpbmcpKTsKLQlyZXR1cm4gSGFzVG9NYXRjaCAmJiBjOwotfQotCi1zdGF0aWMgaW50IFNldFBhcmFtKGNtZCwgcykKLUNtZF9UCSpjbWQ7Ci1jaGFyCSpzOwotewotCWlmKCEqcyAmJiBjbWQtPlR5cGUgIT0gQ01EU1RSSU5HVFlQRSkgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSJXQVJOSU5HOiBObyB2YWx1ZSBzcGVjaWZpZWQgZm9yIHBhcmFtZXRlciBcIiVzXCJcbiIsCi0JCQljbWQtPk5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc3dpdGNoKGNtZC0+VHlwZSkgewotCWNhc2UgQ01ERE9VQkxFVFlQRToKLQkJaWYoc3NjYW5mKHMsICIlbGYiLCAoZG91YmxlKiljbWQtPlZhbCkhPTEpIHsKLQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSJGbG9hdCB2YWx1ZSByZXF1aXJlZCBmb3IgcGFyYW1ldGVyIFwiJXNcIlxuIiwKLQkJCQljbWQtPk5hbWUpOwotCQkJZXhpdCgxKTsKLQkJfQotCQlicmVhazsKLQljYXNlIENNREVOVU1UWVBFOgotCQlTZXRFbnVtKGNtZCwgcyk7Ci0JCWJyZWFrOwotCWNhc2UgQ01ESU5UVFlQRToKLQkJaWYoc3NjYW5mKHMsICIlZCIsIChpbnQqKWNtZC0+VmFsKSE9MSkgewotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIkludGVnZXIgdmFsdWUgcmVxdWlyZWQgZm9yIHBhcmFtZXRlciBcIiVzXCJcbiIsCi0JCQkJY21kLT5OYW1lKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURTVFJJTkdUWVBFOgotCQkqKGNoYXIgKiopY21kLT5WYWwgPSAoc3RyY21wKHMsICI8TlVMTD4iKSAmJiBzdHJjbXAocywgIk5VTEwiKSkKLQkJCQkgICAgID8gc3RyZHVwKHMpCi0JCQkJICAgICA6IDA7Ci0JCWJyZWFrOwotCWNhc2UgQ01EU1RSQVJSQVlUWVBFOgotCQlTZXRTdHJBcnJheShjbWQsIHMpOwotCQlicmVhazsKLQljYXNlIENNREdURVRZUEU6Ci0JCVNldEd0ZShjbWQsIHMpOwotCQlicmVhazsKLQljYXNlIENNRExURVRZUEU6Ci0JCVNldEx0ZShjbWQsIHMpOwotCQlicmVhazsKLQljYXNlIENNRFNVQlJBTkdFVFlQRToKLQkJU2V0U3VicmFuZ2UoY21kLCBzKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICIlczogJXMgJWQgJXMgXCIlc1wiXG4iLAotCQkJIlNldFBhcmFtIiwKLQkJCSJVbmtub3duIFR5cGUiLAotCQkJY21kLT5UeXBlLAotCQkJImZvciBwYXJhbWV0ZXIiLAotCQkJY21kLT5OYW1lKTsKLQkJZXhpdCgxKTsKLQl9Ci0JY21kLT5BcmdTdHIgPSBzdHJkdXAocyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgU2V0RW51bShjbWQsIHMpCi1DbWRfVAkqY21kOwotY2hhcgkqczsKLXsKLQlFbnVtX1QJKmVuOwotCi0JZm9yKGVuPShFbnVtX1QgKiljbWQtPnA7IGVuLT5OYW1lOyBlbisrKSB7Ci0JCWlmKCplbi0+TmFtZSAmJiAhc3RyY21wKHMsIGVuLT5OYW1lKSkgewotCQkJKihpbnQgKikgY21kLT5WYWwgPSBlbi0+SWR4OwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIEVudW1FcnJvcihjbWQsIHMpOwotfQotCi1zdGF0aWMgaW50IFNldFN1YnJhbmdlKGNtZCwgcykKLUNtZF9UCSpjbWQ7Ci1jaGFyCSpzOwotewotCWludAluOwotCi0JaWYoc3NjYW5mKHMsICIlZCIsICZuKSE9MSkgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSJJbnRlZ2VyIHZhbHVlIHJlcXVpcmVkIGZvciBwYXJhbWV0ZXIgXCIlc1wiXG4iLAotCQkJY21kLT5OYW1lKTsKLQkJZXhpdCgxKTsKLQl9Ci0JaWYobiA8ICooaW50ICopY21kLT5wIHx8IG4gPiAqKChpbnQgKiljbWQtPnArMSkpIHsKLQkJcmV0dXJuIFN1YnJhbmdlRXJyb3IoY21kLCBuKTsKLQl9Ci0JKihpbnQgKiljbWQtPlZhbCA9IG47Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgU2V0R3RlKGNtZCwgcykKLUNtZF9UCSpjbWQ7Ci1jaGFyCSpzOwotewotCWludAluOwotCi0JaWYoc3NjYW5mKHMsICIlZCIsICZuKSE9MSkgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSJJbnRlZ2VyIHZhbHVlIHJlcXVpcmVkIGZvciBwYXJhbWV0ZXIgXCIlc1wiXG4iLAotCQkJY21kLT5OYW1lKTsKLQkJZXhpdCgxKTsKLQl9Ci0JaWYobjwqKGludCAqKWNtZC0+cCkgewotCQlyZXR1cm4gR3RlRXJyb3IoY21kLCBuKTsKLQl9Ci0JKihpbnQgKiljbWQtPlZhbCA9IG47Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgU2V0U3RyQXJyYXkoY21kLCBzKQotQ21kX1QJKmNtZDsKLWNoYXIJKnM7Ci17Ci0JKihjaGFyKioqKWNtZC0+VmFsID0gc3RyMmFycmF5KHMsIChjaGFyKiljbWQtPnApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IFNldEx0ZShjbWQsIHMpCi1DbWRfVAkqY21kOwotY2hhcgkqczsKLXsKLQlpbnQJbjsKLQotCWlmKHNzY2FuZihzLCAiJWQiLCAmbikhPTEpIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCQkiSW50ZWdlciB2YWx1ZSByZXF1aXJlZCBmb3IgcGFyYW1ldGVyIFwiJXNcIlxuIiwKLQkJCWNtZC0+TmFtZSk7Ci0JCWV4aXQoMSk7Ci0JfQotCWlmKG4gPiAqKGludCAqKWNtZC0+cCkgewotCQlyZXR1cm4gTHRlRXJyb3IoY21kLCBuKTsKLQl9Ci0JKihpbnQgKiljbWQtPlZhbCA9IG47Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgRW51bUVycm9yKGNtZCwgcykKLUNtZF9UCSpjbWQ7Ci1jaGFyCSpzOwotewotCUVudW1fVAkqZW47Ci0KLQlmcHJpbnRmKHN0ZGVyciwKLQkJIkludmFsaWQgdmFsdWUgXCIlc1wiIGZvciBwYXJhbWV0ZXIgXCIlc1wiXG4iLCBzLCBjbWQtPk5hbWUpOwotCWZwcmludGYoc3RkZXJyLCAiVmFsaWQgdmFsdWVzIGFyZTpcbiIpOwotCWZvcihlbj0oRW51bV9UICopY21kLT5wOyBlbi0+TmFtZTsgZW4rKykgewotCQlpZigqZW4tPk5hbWUpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiICAgICVzXG4iLCBlbi0+TmFtZSk7Ci0JCX0KLQl9Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCWV4aXQoMSk7Ci19Ci0KLXN0YXRpYyBpbnQgR3RlRXJyb3IoY21kLCBuKQotQ21kX1QJKmNtZDsKLWludAluOwotewotCWZwcmludGYoc3RkZXJyLAotCQkiVmFsdWUgJWQgb3V0IG9mIHJhbmdlIGZvciBwYXJhbWV0ZXIgXCIlc1wiXG4iLCBuLCBjbWQtPk5hbWUpOwotCWZwcmludGYoc3RkZXJyLCAiVmFsaWQgdmFsdWVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICAlZFxuIiwKLQkJKihpbnQgKiljbWQtPnApOwotCWV4aXQoMSk7Ci19Ci0KLXN0YXRpYyBpbnQgTHRlRXJyb3IoY21kLCBuKQotQ21kX1QJKmNtZDsKLWludAluOwotewotCWZwcmludGYoc3RkZXJyLAotCQkiVmFsdWUgJWQgb3V0IG9mIHJhbmdlIGZvciBwYXJhbWV0ZXIgXCIlc1wiXG4iLCBuLCBjbWQtPk5hbWUpOwotCWZwcmludGYoc3RkZXJyLCAiVmFsaWQgdmFsdWVzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICAlZFxuIiwKLQkJKihpbnQgKiljbWQtPnApOwotCWV4aXQoMSk7Ci19Ci0KLXN0YXRpYyBpbnQgU3VicmFuZ2VFcnJvcihjbWQsIG4pCi1DbWRfVAkqY21kOwotaW50CW47Ci17Ci0JZnByaW50ZihzdGRlcnIsCi0JCSJWYWx1ZSAlZCBvdXQgb2YgcmFuZ2UgZm9yIHBhcmFtZXRlciBcIiVzXCJcbiIsIG4sIGNtZC0+TmFtZSk7Ci0JZnByaW50ZihzdGRlcnIsICJWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAlZCB0byAlZFxuIiwKLQkJKihpbnQgKiljbWQtPnAsICooKGludCAqKWNtZC0+cCsxKSk7Ci0JZXhpdCgxKTsKLX0KLQotc3RhdGljIGludCBQcmludEVudW0oY21kLCBWYWxGbGFnLCBmcCkKLUNtZF9UCSpjbWQ7Ci1pbnQJVmFsRmxhZzsKLUZJTEUJKmZwOwotewotCUVudW1fVAkqZW47Ci0KLQlmcHJpbnRmKGZwLCAiJXMiLCBjbWQtPk5hbWUpOwotCWlmKFZhbEZsYWcpIHsKLQkJZm9yKGVuPShFbnVtX1QgKiljbWQtPnA7IGVuLT5OYW1lOyBlbisrKSB7Ci0JCQlpZigqZW4tPk5hbWUgJiYgZW4tPklkeD09KihpbnQgKiljbWQtPlZhbCkgewotCQkJCWZwcmludGYoZnAsICI6ICVzIiwgZW4tPk5hbWUpOwotCQkJfQotCQl9Ci0JfQotCWZwcmludGYoZnAsICJcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IFByaW50U3RyQXJyYXkoY21kLCBWYWxGbGFnLCBmcCkKLUNtZF9UCSpjbWQ7Ci1pbnQJVmFsRmxhZzsKLUZJTEUJKmZwOwotewotCWNoYXIJKmluZGVudCwKLQkJKipzID0gKihjaGFyKioqKWNtZC0+VmFsOwotCWludAlsID0gNCtzdHJsZW4oY21kLT5OYW1lKTsKLQotCWZwcmludGYoZnAsICIlcyIsIGNtZC0+TmFtZSk7Ci0JaW5kZW50ID0gbWFsbG9jKGwrMik7Ci0JbWVtc2V0KGluZGVudCwgJyAnLCBsKzEpOwotCWluZGVudFtsKzFdID0gMDsKLQlpZihWYWxGbGFnKSB7Ci0JCWZwcmludGYoZnAsICI6ICVzIiwgcyA/ICgqcyA/ICpzKysgOiAiTlVMTCIpIDogIiIpOwotCQlpZihzKSB3aGlsZSgqcykgewotCQkJZnByaW50ZihmcCwgIlxuJXMgJXMiLCBpbmRlbnQsICpzKyspOwotCQl9Ci0JfQotCWZyZWUoaW5kZW50KTsKLQlmcHJpbnRmKGZwLCAiXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNoYXIgKipzdHIyYXJyYXkocywgc2VwKQotY2hhcgkqcywKLQkqc2VwOwotewotCWNoYXIJKnAsCi0JCSoqYTsKLQlpbnQJbiA9IDAsCi0JCWw7Ci0KLQlpZighc2VwKSBzZXAgPSBTZXBTdHJpbmc7Ci0JcCA9IHMgKz0gc3Ryc3BuKHMsIHNlcCk7Ci0Jd2hpbGUoKnApIHsKLQkJcCArPSBzdHJjc3BuKHAsIHNlcCk7Ci0JCXAgKz0gc3Ryc3BuKHAsIHNlcCk7Ci0JCSsrbjsKLQl9Ci0JYSA9IGNhbGxvYyhuKzEsIHNpemVvZihjaGFyICopKTsKLQlwID0gczsKLQluID0gMDsKLQl3aGlsZSgqcCkgewotCQlsID0gc3RyY3NwbihwLCBzZXApOwotCQlhW25dID0gbWFsbG9jKGwrMSk7Ci0JCW1lbWNweShhW25dLCBwLCBsKTsKLQkJYVtuXVtsXSA9IDA7Ci0JCSsrbjsKLQkJcCArPSBsOwotCQlwICs9IHN0cnNwbihwLCBzZXApOwotCX0KLQlyZXR1cm4gYTsKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2NtZC5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvY21kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMzk3NTMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvY21kLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0KLS8vICRJZDogY21kLmggMTMwNyAyMDA3LTAzLTE0IDIyOjIyOjM2WiBoaWV1aG9hbmcxOTcyICQKLQotI2lmICFkZWZpbmVkKENNRF9IKQotCi0jZGVmaW5lCUNNRF9ICi0KLSNkZWZpbmUJQ01ERE9VQkxFVFlQRQkxCi0jZGVmaW5lCUNNREVOVU1UWVBFCTIKLSNkZWZpbmUJQ01ESU5UVFlQRQkzCi0jZGVmaW5lCUNNRFNUUklOR1RZUEUJNAotI2RlZmluZQlDTURTVUJSQU5HRVRZUEUJNQotI2RlZmluZQlDTURHVEVUWVBFCTYKLSNkZWZpbmUJQ01ETFRFVFlQRQk3Ci0jZGVmaW5lCUNNRFNUUkFSUkFZVFlQRQk4Ci0jZGVmaW5lCUNNREJPT0xUWVBFCTkKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIJKk5hbWU7Ci0JaW50CUlkeDsKLX0gRW51bV9UOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50CVR5cGU7Ci0JY2hhcgkqTmFtZSwKLQkJKkFyZ1N0cjsKLQl2b2lkCSpWYWwsCi0JCSpwOwotfSBDbWRfVDsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19TVERDX18pICB8fCBkZWZpbmVkKFdJTjMyKQotaW50IERlY2xhcmVQYXJhbXMoY2hhciAqLCAuLi4pOwotI2Vsc2UKLQotaW50IERlY2xhcmVQYXJhbXMoKTsKLSNlbmRpZgotCi1pbnQJR2V0UGFyYW1zKGludCAqbiwgY2hhciAqKiphLGNoYXIgKkNtZEZpbGVOYW1lKSwKLQlTUHJpbnRQYXJhbXMoKSwKLQlQcmludFBhcmFtcygpOwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNlbmRpZgotCi0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvY29sbENvdW50cy5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9jb2xsQ291bnRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4ZTkxNS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9jb2xsQ291bnRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKgotCi0gQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLSBUaGlzIGZpbGUgaXMgcGFydCBvZiBHSVpBKysgKCBleHRlbnNpb24gb2YgR0laQSApLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLSBVU0EuCi0KLSAqLwotI2luY2x1ZGUgImFsaWdubWVudC5oIgotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDMuaCIKLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSAiY29sbENvdW50cy5oIgotI2luY2x1ZGUgIk1vdmVTd2FwTWF0cml4LmgiCi0jaW5jbHVkZSAiRDVUYWJsZXMuaCIKLSNpbmNsdWRlICJ0cmFuc3BhaXJfbW9kZWw1LmgiCi0jaW5jbHVkZSAidHJhbnNwYWlyX21vZGVsaG1tLmgiCi0jaW5jbHVkZSAiUGFyYW1ldGVyLmgiCi0KLWV4dGVybiBmbG9hdCBDT1VOVElOQ1JFQVNFX0NVVE9GRl9BTDsKLS8vIHVuaWZpZXMgY29sbGVjdENvdW50c092ZXJBbGlnbm1lbnRzIGFuZCBmaW5kQWxpZ25tZW50TmVpZ2hib3Job29kIEZKTy0yMC8wNy85OQotdGVtcGxhdGU8Y2xhc3MgVFJBTlNQQUlSPiBpbnQgY29sbGVjdENvdW50c092ZXJOZWlnaGJvcmhvb2QoCi0JCWNvbnN0IE1vdmVTd2FwTWF0cml4PFRSQU5TUEFJUj4mbXNjLCBMb2dQcm9iIGFzY29yZSwKLQkJQXJyYXkyPExvZ1Byb2IsVmVjdG9yPExvZ1Byb2I+ID4mZHRjb3VudCwKLQkJQXJyYXkyPExvZ1Byb2IsVmVjdG9yPExvZ1Byb2I+ID4mbmNvdW50LCBMb2dQcm9iJnAxY291bnQsCi0JCUxvZ1Byb2ImcDBjb3VudCwgTG9nUHJvYiZ0b3RhbF9jb3VudCkgewotCWludCBuQWw9MDsKLQljb25zdCBQb3NpdGlvbkluZGV4IGw9bXNjLmdldF9sKCksIG09bXNjLmdldF9tKCk7Ci0JQXJyYXkyPExvZ1Byb2IsVmVjdG9yPExvZ1Byb2I+ID4gY21vdmUobCsxLCBtKzEpLCBjc3dhcChsKzEsIG0rMSk7Ci0JVmVjdG9yPExvZ1Byb2I+IG5lZ21vdmUobSsxKSxuZWdzd2FwKG0rMSkscGx1czFmZXJ0KGwrMSksbWludXMxZmVydChsKzEpOwotCUxvZ1Byb2IgdG90YWxfbW92ZSwgdG90YWxfc3dhcDsKLQlpZiAobXNjLmlzQ2VudGVyRGVsZXRlZCgpPT0wKSB7Ci0JCXRvdGFsX21vdmUrPWFzY29yZTsKLQkJbkFsKys7Ci0JfQotCWZvciAoUG9zaXRpb25JbmRleCBqPTE7IGo8PW07IGorKykgewotCQlmb3IgKFBvc2l0aW9uSW5kZXggaT0wOyBpPD1sOyBpKyspIHsKLQkJCWlmIChtc2MoaikhPWkgJiYgIW1zYy5pc0RlbE1vdmUoaSwgaikgKSB7Ci0JCQkJTG9nUHJvYiBuZXdzY29yZT1hc2NvcmUqbXNjLmNtb3ZlKGksIGopOwotCQkJCXRvdGFsX21vdmUrPW5ld3Njb3JlOwotCQkJCW5BbCsrOwotCQkJCWNtb3ZlKGksIGopKz1uZXdzY29yZTsKLQkJCQluZWdtb3ZlW2pdKz1uZXdzY29yZTsKLQkJCQlwbHVzMWZlcnRbaV0rPW5ld3Njb3JlOwotCQkJCW1pbnVzMWZlcnRbbXNjKGopXSs9bmV3c2NvcmU7Ci0JCQl9Ci0JCX0KLQl9Ci0JZm9yIChQb3NpdGlvbkluZGV4IGoxPTE7IGoxPD1tOyBqMSsrKSB7Ci0JCWZvciAoUG9zaXRpb25JbmRleCBqMj1qMSsxOyBqMjw9bTsgajIrKykgewotCQkJaWYgKG1zYyhqMSkhPW1zYyhqMikgJiYgIW1zYy5pc0RlbFN3YXAoajEsIGoyKSApIHsKLQkJCQlMb2dQcm9iIG5ld3Njb3JlPWFzY29yZSptc2MuY3N3YXAoajEsIGoyKTsKLQkJCQl0b3RhbF9zd2FwKz1uZXdzY29yZTsKLQkJCQluQWwrKzsKLQkJCQljc3dhcChtc2MoajEpLCBqMikrPW5ld3Njb3JlOwotCQkJCWNzd2FwKG1zYyhqMiksIGoxKSs9bmV3c2NvcmU7Ci0JCQkJbmVnc3dhcFtqMV0rPW5ld3Njb3JlOwotCQkJCW5lZ3N3YXBbajJdKz1uZXdzY29yZTsKLQkJCX0KLQkJfQotCX0KLQl0b3RhbF9jb3VudCs9dG90YWxfbW92ZSt0b3RhbF9zd2FwOwotCWZvciAoUG9zaXRpb25JbmRleCBqPTE7IGo8PW07IGorKykKLQkJZm9yIChQb3NpdGlvbkluZGV4IGk9MDsgaTw9bDsgaSsrKQotCQkJZHRjb3VudChpLCBqKSArPSAoKGk9PW1zYyhqKSkgPyAodG90YWxfY291bnQKLQkJCQkJLShuZWdtb3ZlW2pdK25lZ3N3YXBbal0pKSA6IChjc3dhcChpLCBqKStjbW92ZShpLCBqKSkpOwotCWZvciAoUG9zaXRpb25JbmRleCBpPTE7IGk8PWw7IGkrKykgewotCQlMb2dQcm9iIHRlbXA9bWludXMxZmVydFtpXStwbHVzMWZlcnRbaV07Ci0JCWlmIChtc2MuZmVydChpKTxNQVhfRkVSVElMSVRZKQotCQkJbmNvdW50KGksIG1zYy5mZXJ0KGkpKSs9dG90YWxfY291bnQtdGVtcDsKLQkJaWYgKG1zYy5mZXJ0KGkpPjAmJm1zYy5mZXJ0KGkpLTE8TUFYX0ZFUlRJTElUWSkKLQkJCW5jb3VudChpLCBtc2MuZmVydChpKS0xKSs9bWludXMxZmVydFtpXTsKLQkJZWxzZSBpZiAobWludXMxZmVydFtpXSE9MC4wKQotCQkJY2VyciA8PCAiRVJST1I6IE0xRmE6ICIgPDwgbWludXMxZmVydFtpXSA8PCAnICcgPDwgaSA8PCAnICcKLQkJCQkJPDwgbXNjLmZlcnQoaSk8PCBlbmRsOwotCQlpZiAobXNjLmZlcnQoaSkrMTxNQVhfRkVSVElMSVRZKQotCQkJbmNvdW50KGksIG1zYy5mZXJ0KGkpKzEpKz1wbHVzMWZlcnRbaV07Ci0JfQotCUxvZ1Byb2IgdGVtcD1taW51czFmZXJ0WzBdK3BsdXMxZmVydFswXTsKLQlwMWNvdW50ICs9ICh0b3RhbF9jb3VudC10ZW1wKSooTG9nUHJvYiltc2MuZmVydCgwKTsKLQlwMGNvdW50ICs9ICh0b3RhbF9jb3VudC10ZW1wKSooTG9nUHJvYikobS0yKm1zYy5mZXJ0KDApKTsKLQlpZiAobXNjLmZlcnQoMCk+MCkgewotCQlwMWNvdW50ICs9IChtaW51czFmZXJ0WzBdKSooTG9nUHJvYikobXNjLmZlcnQoMCktMSk7Ci0JCXAwY291bnQgKz0gKG1pbnVzMWZlcnRbMF0pKihMb2dQcm9iKShtLTIqKG1zYy5mZXJ0KDApLTEpKTsKLQl9IGVsc2UgaWYgKG1pbnVzMWZlcnRbMF0hPTAuMCkKLQkJY2VyciA8PCAiRVJST1I6IE0xRmI6ICIgPDwgbWludXMxZmVydFswXSA8PCBlbmRsOwotCWlmIChpbnQobSktMiooaW50KG1zYy5mZXJ0KDApKSsxKT49MCkgewotCQlwMWNvdW50ICs9IChwbHVzMWZlcnRbMF0pKihMb2dQcm9iKShtc2MuZmVydCgwKSsxKTsKLQkJcDBjb3VudCArPSAocGx1czFmZXJ0WzBdKSooTG9nUHJvYikobS0yKihtc2MuZmVydCgwKSsxKSk7Ci0JfQotCW1zYy5jaGVjaygpOwotCXJldHVybiBuQWw7Ci19Ci07Ci0KLXRlbXBsYXRlPGNsYXNzIFRSQU5TUEFJUj4gZG91YmxlIGNvbGxlY3RDb3VudHNPdmVyTmVpZ2hib3Job29kRm9yU29waGlzdGljYXRlZE1vZGVscygKLQkJY29uc3QgTW92ZVN3YXBNYXRyaXg8VFJBTlNQQUlSPiYsIExvZ1Byb2IsIHZvaWQqKSB7Ci0JcmV0dXJuIDAuMDsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFJBTlNQQUlSPiB2b2lkIF9jb2xsZWN0Q291bnRzT3Zlck5laWdoYm9yaG9vZEZvclNvcGhpc3RpY2F0ZWRNb2RlbHMoCi0JCWNvbnN0IE1vdmVTd2FwTWF0cml4PFRSQU5TUEFJUj4mTW1zYywgY29uc3QgYWxpZ25tZW50Jm1zYywKLQkJY29uc3QgVFJBTlNQQUlSJmVmLCBMb2dQcm9iIG5vcm1hbGl6ZWRfYXNjb3JlLCBkNG1vZGVsKmQ0VGFibGUpIHsKLQlNbXNjLmNoZWNrKCk7Ci0JY29uc3QgUG9zaXRpb25JbmRleCBtPW1zYy5nZXRfbSgpLCBsPW1zYy5nZXRfbCgpOwotCWZvciAoUG9zaXRpb25JbmRleCBqPTE7IGo8PW07ICsraikKLQkJaWYgKG1zYyhqKSE9MCkKLQkJCWlmIChtc2MuZ2V0X2hlYWQobXNjKGopKT09aikgewotCQkJCWludCBlcD1tc2MucHJldl9jZXB0KG1zYyhqKSk7Ci0JCQkJZDRUYWJsZS0+YXVnQ291bnRSZWZfZmlyc3QoaiwgbXNjLmdldF9jZW50ZXIoZXApLAotCQkJCQkJZDRUYWJsZS0+ZXdvcmRjbGFzc2VzLT5nZXRDbGFzcyhlZi5nZXRfZXMoZXApKSwKLQkJCQkJCWQ0VGFibGUtPmZ3b3JkY2xhc3Nlcy0+Z2V0Q2xhc3MoZWYuZ2V0X2ZzKGopKSwgbCwgbSxub3JtYWxpemVkX2FzY29yZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vbWFzc2VydCggJmQ0VGFibGUtPmdldENvdW50UmVmX2JpZ2dlcihqLG1zYy5wcmV2X2luX2NlcHQoaiksMCxkNFRhYmxlLT5md29yZGNsYXNzZXMuZ2V0Q2xhc3MoZWYuZ2V0X2ZzKGopKSxsLG0pID09IGVmLmdldENvdW50U2Vjb25kKGosbXNjLnByZXZfaW5fY2VwdChqKSApKTsKLQkJCQlkNFRhYmxlLT5hdWdDb3VudFJlZl9iaWdnZXIoaiwgbXNjLnByZXZfaW5fY2VwdChqKSwgMCwKLQkJCQkJCWQ0VGFibGUtPmZ3b3JkY2xhc3Nlcy0+Z2V0Q2xhc3MoZWYuZ2V0X2ZzKGopKSwgbCwgbSxub3JtYWxpemVkX2FzY29yZSk7Ci0JCQl9Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRSQU5TUEFJUj4gdm9pZCBfY29sbGVjdENvdW50c092ZXJOZWlnaGJvcmhvb2RGb3JTb3BoaXN0aWNhdGVkTW9kZWxzKAotCQljb25zdCBNb3ZlU3dhcE1hdHJpeDxUUkFOU1BBSVI+Jk1tc2MsIGNvbnN0IGFsaWdubWVudCZtc2MsCi0JCWNvbnN0IFRSQU5TUEFJUiZlZiwgTG9nUHJvYiBub3JtYWxpemVkX2FzY29yZSwgZDVtb2RlbCpkNVRhYmxlKSB7Ci0JTW1zYy5jaGVjaygpOwotCV9jb2xsZWN0Q291bnRzT3Zlck5laWdoYm9yaG9vZEZvclNvcGhpc3RpY2F0ZWRNb2RlbHMoTW1zYywgbXNjLCBlZiwKLQkJCW5vcm1hbGl6ZWRfYXNjb3JlLCAmZDVUYWJsZS0+ZDRtKTsKLQlNbXNjLmNoZWNrKCk7Ci0JY29uc3QgUG9zaXRpb25JbmRleCBtPW1zYy5nZXRfbSgpLCBsPW1zYy5nZXRfbCgpOwotCVBvc2l0aW9uSW5kZXggcHJldl9jZXB0PTA7Ci0JUG9zaXRpb25JbmRleCB2YWNfYWxsPW07Ci0JVmVjdG9yPGNoYXI+IHZhYyhtKzEsMCk7Ci0JZm9yIChQb3NpdGlvbkluZGV4IGk9MTsgaTw9bDsgaSsrKSB7Ci0JCVBvc2l0aW9uSW5kZXggY3VyX2o9bXNjLmFsc19pW2ldOwotCQlQb3NpdGlvbkluZGV4IHByZXZfaj0wOwotCQlQb3NpdGlvbkluZGV4IGs9MDsKLQkJaWYgKGN1cl9qKSB7IC8vIHByb2Nlc3MgZmlyc3Qgd29yZCBvZiBjZXB0Ci0JCQlrKys7Ci0JCQlkNVRhYmxlLT5nZXRDb3VudFJlZl9maXJzdCh2YWNhbmNpZXModmFjLCBjdXJfaiksIHZhY2FuY2llcyh2YWMsCi0JCQkJCW1zYy5nZXRfY2VudGVyKHByZXZfY2VwdCkpLAotCQkJCQlkNVRhYmxlLT5md29yZGNsYXNzZXMtPmdldENsYXNzKGVmLmdldF9mcyhjdXJfaikpLCBsLCBtLAotCQkJCQl2YWNfYWxsLW1zYy5mZXJ0KGkpK2spICs9bm9ybWFsaXplZF9hc2NvcmU7Ci0JCQl2YWNfYWxsLS07Ci0JCQlhc3NlcnQodmFjW2N1cl9qXT09MCk7Ci0JCQl2YWNbY3VyX2pdPTE7Ci0JCQlNbXNjLmNoZWNrKCk7Ci0JCQlwcmV2X2o9Y3VyX2o7Ci0JCQljdXJfaj1tc2MuYWxzX2pbY3VyX2pdLm5leHQ7Ci0JCX0KLQkJd2hpbGUgKGN1cl9qKSB7IC8vIHByb2Nlc3MgZm9sbG93aW5nIHdvcmRzIG9mIGNlcHQKLQkJCWsrKzsKLQkJCWludCB2cHJldj12YWNhbmNpZXModmFjLCBwcmV2X2opOwotCQkJZDVUYWJsZS0+Z2V0Q291bnRSZWZfYmlnZ2VyKHZhY2FuY2llcyh2YWMsIGN1cl9qKSwgdnByZXYsCi0JCQkJCWQ1VGFibGUtPmZ3b3JkY2xhc3Nlcy0+Z2V0Q2xhc3MoZWYuZ2V0X2ZzKGN1cl9qKSksIGwsIG0sCi0JCQkJCXZhY19hbGwtdnByZXYvKndhciB3ZWcqLy1tc2MuZmVydChpKStrKSs9bm9ybWFsaXplZF9hc2NvcmU7Ci0JCQl2YWNfYWxsLS07Ci0JCQl2YWNbY3VyX2pdPTE7Ci0JCQlNbXNjLmNoZWNrKCk7Ci0JCQlwcmV2X2o9Y3VyX2o7Ci0JCQljdXJfaj1tc2MuYWxzX2pbY3VyX2pdLm5leHQ7Ci0JCX0KLQkJYXNzZXJ0KGs9PW1zYy5mZXJ0KGkpKTsKLQkJaWYgKGspCi0JCQlwcmV2X2NlcHQ9aTsKLQl9Ci0JYXNzZXJ0KHZhY19hbGw9PW1zYy5mZXJ0KDApKTsKLX0KLQotZXh0ZXJuIGludCBOdW1iZXJPZkFsaWdubWVudHNJblNvcGhpc3RpY2F0ZWRDb3VudENvbGxlY3Rpb247Ci10ZW1wbGF0ZTxjbGFzcyBUUkFOU1BBSVIsIGNsYXNzIE1PREVMPiBkb3VibGUgY29sbGVjdENvdW50c092ZXJOZWlnaGJvcmhvb2RGb3JTb3BoaXN0aWNhdGVkTW9kZWxzKAotCQljb25zdCBNb3ZlU3dhcE1hdHJpeDxUUkFOU1BBSVI+Jm1zYywgTG9nUHJvYiBub3JtYWxpemVkX2FzY29yZSwKLQkJTU9ERUwqZDVUYWJsZSkgewotCWNvbnN0IFBvc2l0aW9uSW5kZXggbT1tc2MuZ2V0X20oKSwgbD1tc2MuZ2V0X2woKTsKLQlhbGlnbm1lbnQgeChtc2MpOwotCWRvdWJsZSBzdW09MDsKLQltc2MuY2hlY2soKTsKLQlpZiAoICFtc2MuaXNDZW50ZXJEZWxldGVkKCkgKSB7Ci0JCV9jb2xsZWN0Q291bnRzT3Zlck5laWdoYm9yaG9vZEZvclNvcGhpc3RpY2F0ZWRNb2RlbHM8VFJBTlNQQUlSPihtc2MsIHgsCi0JCQkJbXNjLmdldF9lZigpLCBub3JtYWxpemVkX2FzY29yZSwgZDVUYWJsZSk7Ci0JCU51bWJlck9mQWxpZ25tZW50c0luU29waGlzdGljYXRlZENvdW50Q29sbGVjdGlvbisrOwotCQlzdW0rPW5vcm1hbGl6ZWRfYXNjb3JlOwotCX0KLQltc2MuY2hlY2soKTsKLQlmb3IgKFdvcmRJbmRleCBqPTE7IGo8PW07IGorKykKLQkJZm9yIChXb3JkSW5kZXggaT0wOyBpPD1sOyBpKyspIHsKLQkJCVdvcmRJbmRleCBvbGQ9eChqKTsKLQkJCWlmIChpIT1vbGQmJiAhbXNjLmlzRGVsTW92ZShpLCBqKSApIHsKLQkJCQltc2MuY2hlY2soKTsKLQkJCQlkb3VibGUgYz1tc2MuY21vdmUoaSwgaikqbm9ybWFsaXplZF9hc2NvcmU7Ci0JCQkJaWYgKGMgPiBDT1VOVElOQ1JFQVNFX0NVVE9GRl9BTCkgewotCQkJCQl4LnNldChqLCBpKTsKLQkJCQkJX2NvbGxlY3RDb3VudHNPdmVyTmVpZ2hib3Job29kRm9yU29waGlzdGljYXRlZE1vZGVsczwKLQkJCQkJCQlUUkFOU1BBSVI+KG1zYywgeCwgbXNjLmdldF9lZigpLCBjLCBkNVRhYmxlKTsKLQkJCQkJTnVtYmVyT2ZBbGlnbm1lbnRzSW5Tb3BoaXN0aWNhdGVkQ291bnRDb2xsZWN0aW9uKys7Ci0JCQkJCXguc2V0KGosIG9sZCk7Ci0JCQkJCXN1bSs9YzsKLQkJCQl9Ci0JCQkJbXNjLmNoZWNrKCk7Ci0JCQl9Ci0JCX0KLQlmb3IgKFBvc2l0aW9uSW5kZXggajE9MTsgajE8PW07IGoxKyspIHsKLQkJZm9yIChQb3NpdGlvbkluZGV4IGoyPWoxKzE7IGoyPD1tOyBqMisrKSB7Ci0JCQlpZiAobXNjKGoxKSE9bXNjKGoyKSAmJiAhbXNjLmlzRGVsU3dhcChqMSwgajIpICkgewotCQkJCWRvdWJsZSBjPW1zYy5jc3dhcChqMSwgajIpKm5vcm1hbGl6ZWRfYXNjb3JlOwotCQkJCW1zYy5jaGVjaygpOwotCQkJCWlmIChjID4gQ09VTlRJTkNSRUFTRV9DVVRPRkZfQUwpIHsKLQkJCQkJaW50IG9sZDE9bXNjKGoxKSwgb2xkMj1tc2MoajIpOwotCQkJCQl4LnNldChqMSwgb2xkMik7Ci0JCQkJCXguc2V0KGoyLCBvbGQxKTsKLQkJCQkJX2NvbGxlY3RDb3VudHNPdmVyTmVpZ2hib3Job29kRm9yU29waGlzdGljYXRlZE1vZGVsczwKLQkJCQkJCQlUUkFOU1BBSVI+KG1zYywgeCwgbXNjLmdldF9lZigpLCBjLCBkNVRhYmxlKTsKLQkJCQkJTnVtYmVyT2ZBbGlnbm1lbnRzSW5Tb3BoaXN0aWNhdGVkQ291bnRDb2xsZWN0aW9uKys7Ci0JCQkJCXguc2V0KGoxLCBvbGQxKTsKLQkJCQkJeC5zZXQoajIsIG9sZDIpOwotCQkJCQlzdW0rPWM7Ci0JCQkJfQotCQkJCW1zYy5jaGVjaygpOwotCQkJfQotCQl9Ci0JfQotCW1zYy5jaGVjaygpOwotCXJldHVybiBzdW07Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRSQU5TUEFJUiwgY2xhc3MgTU9ERUw+IGludCBjb2xsZWN0Q291bnRzT3Zlck5laWdoYm9yaG9vZCgKLQkJY29uc3QgVmVjdG9yPHBhaXI8TW92ZVN3YXBNYXRyaXg8VFJBTlNQQUlSPiosTG9nUHJvYj4gPiZzbXNjLAotCQlWZWN0b3I8V29yZEluZGV4PiZlcywgVmVjdG9yPFdvcmRJbmRleD4mZnMsIHRtb2RlbDxDT1VOVCxQUk9CPiZ0VGFibGUsCi0JCWFtb2RlbDxDT1VOVD4mYUNvdW50VGFibGUsIGFtb2RlbDxDT1VOVD4mZENvdW50VGFibGUsCi0JCW5tb2RlbDxDT1VOVD4mbkNvdW50VGFibGUsIFN5bmNEb3VibGUmcDFjb3VudCwgU3luY0RvdWJsZSZwMGNvdW50LAotCQlMb2dQcm9iJl90b3RhbCwgZmxvYXQgY291bnQsIGJvb2wgYWRkQ291bnRzLCBNT0RFTCpkNFRhYmxlKSB7Ci0JaW50IG5BbD0wOwotCWNvbnN0IFBvc2l0aW9uSW5kZXggbD1lcy5zaXplKCktMSwgbT1mcy5zaXplKCktMTsKLQlBcnJheTI8TG9nUHJvYixWZWN0b3I8TG9nUHJvYj4gPiBkdGNvdW50KGwrMSwgbSsxKSwgbmNvdW50KGwrMSwKLQkJCU1BWF9GRVJUSUxJVFkrMSk7Ci0JTG9nUHJvYiBwMD0wLCBwMT0wLCBhbGxfdG90YWw9MDsKLQlmb3IgKHVuc2lnbmVkIGludCBpPTA7IGk8c21zYy5zaXplKCk7ICsraSkgewotCQlMb2dQcm9iIHRoaXNfdG90YWw9MDsKLQkJbkFsKz1jb2xsZWN0Q291bnRzT3Zlck5laWdoYm9yaG9vZCgqc21zY1tpXS5maXJzdCwgc21zY1tpXS5zZWNvbmQsCi0JCQkJZHRjb3VudCwgbmNvdW50LCBwMSwgcDAsIHRoaXNfdG90YWwpOwotCQlhbGxfdG90YWwrPXRoaXNfdG90YWw7Ci0JfQotCV90b3RhbD1hbGxfdG90YWw7Ci0JYWxsX3RvdGFsLz0oZG91YmxlKWNvdW50OwotCWRvdWJsZSBzdW0yPTA7Ci0JaWYgKGFkZENvdW50cyAmJiBkNFRhYmxlKSB7Ci0JCWZvciAodW5zaWduZWQgaW50IGk9MDsgaTxzbXNjLnNpemUoKTsgKytpKSB7Ci0JCQkvL2ZvcihXb3JkSW5kZXggaj0xO2o8PW07aisrKWZvcihXb3JkSW5kZXggaWk9MDtpaTw9bDtpaSsrKQotCQkJLy8gICgqc21zY1tpXS5maXJzdCkuY21vdmUoaWksaik7Ci0JCQlzdW0yKz1jb2xsZWN0Q291bnRzT3Zlck5laWdoYm9yaG9vZEZvclNvcGhpc3RpY2F0ZWRNb2RlbHMoCi0JCQkJCSpzbXNjW2ldLmZpcnN0LCBzbXNjW2ldLnNlY29uZC9hbGxfdG90YWwsIGQ0VGFibGUpOwotCQl9Ci0JCWlmICghKGZhYnMoY291bnQtc3VtMik8MC4wNSkpCi0JCQljZXJyIDw8ICJXQVJOSU5HOiBESUZGRVJFTlQgU1VNUzogKCIgPDwgY291bnQgPDwgIikgKCIgPDwgc3VtMgotCQkJCQk8PCAiKVxuIjsKLQl9Ci0KLQkvKioKLQkgTk9URSEgSEVSRSBJUyBUSEUgVVBEQVRFIFBST0NFU1PvvIEKLQkgKi8KLQlpZiAoYWRkQ291bnRzKSB7Ci0JCWZvciAoUG9zaXRpb25JbmRleCBpPTA7IGk8PWw7IGkrKykgewotCQkJZm9yIChQb3NpdGlvbkluZGV4IGo9MTsgajw9bTsgaisrKSB7Ci0JCQkJTG9nUHJvYiBpamFkZD1kdGNvdW50KGksIGopL2FsbF90b3RhbDsKLQkJCQlpZiAoaWphZGQ+Q09VTlRJTkNSRUFTRV9DVVRPRkZfQUwpIHsKLQkJCQkJdFRhYmxlLmluY0NvdW50KGVzW2ldLCBmc1tqXSwgaWphZGQpOwotCQkJCQlkQ291bnRUYWJsZS5hZGRWYWx1ZShqLCBpLCBsLCBtLCBpamFkZCk7Ci0JCQkJCWFDb3VudFRhYmxlLmFkZFZhbHVlKGksIGosIGwsIG0sIGlqYWRkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaT4wKQotCQkJCWZvciAoUG9zaXRpb25JbmRleCBuPTA7IG48TUFYX0ZFUlRJTElUWTsgbisrKQotCQkJCQluQ291bnRUYWJsZS5hZGRWYWx1ZShlc1tpXSwgbiwgbmNvdW50KGksIG4pL2FsbF90b3RhbCk7Ci0JCX0KLQkJcDBjb3VudCs9cDAvYWxsX3RvdGFsOwotCQlwMWNvdW50Kz1wMS9hbGxfdG90YWw7Ci0JfQotCXJldHVybiBuQWw7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2NvbGxDb3VudHMuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2NvbGxDb3VudHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwNTI5Yi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9jb2xsQ291bnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2ggKFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0laQSsrICggZXh0ZW5zaW9uIG9mIEdJWkEgKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2lmbmRlZiBjb2xsQ291bnRzX2hfZGVmaW5lZAotI2RlZmluZSBjb2xsQ291bnRzX2hfZGVmaW5lZAotI2luY2x1ZGUgImFsaWdubWVudC5oIgotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDMuaCIKLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSAiTW92ZVN3YXBNYXRyaXguaCIKLSNpbmNsdWRlICJENFRhYmxlcy5oIgotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDQuaCIKLQotY2xhc3MgT25lTW92ZVN3YXAKLXsKLSBwdWJsaWM6Ci0gIHNob3J0IHR5cGU7Ci0gIHNob3J0IGEsYjsKLSAgT25lTW92ZVN3YXAoc2hvcnQgX3R5cGUsc2hvcnQgX2Esc2hvcnQgX2IpCi0gICAgOiB0eXBlKF90eXBlKSxhKF9hKSxiKF9iKQotICAgIHt9Ci0gIE9uZU1vdmVTd2FwKCkKLSAgICA6IHR5cGUoMCl7fQotfTsKLQotaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE9uZU1vdmVTd2FwJmEsY29uc3QgT25lTW92ZVN3YXAmYikKLXsKLSAgaWYoYS50eXBlPGIudHlwZSlyZXR1cm4gMTsKLSAgZWxzZSBpZihiLnR5cGU8YS50eXBlKXJldHVybiAwOwotICBlbHNlIGlmKGEuYTxiLmEpcmV0dXJuIDE7Ci0gIGVsc2UgaWYoYi5hPGEuYSlyZXR1cm4gMDsKLSAgZWxzZSByZXR1cm4gYS5iPGIuYjsKLX0KLQotaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBPbmVNb3ZlU3dhcCZhLGNvbnN0IE9uZU1vdmVTd2FwJmIpCi17Ci0gIHJldHVybiBhLnR5cGU9PWIudHlwZSYmYS5hPT1iLmEmJmEuYj09Yi5iOwotfQotCi1pbmxpbmUgb3N0cmVhbSZvcGVyYXRvcjw8KG9zdHJlYW0mb3V0LGNvbnN0IE9uZU1vdmVTd2FwJm8pCi17Ci0gIHJldHVybiBvdXQgPDwgJygnIDw8IG8udHlwZSA8PCAiLCIgPDwgby5hIDw8ICIsIiA8PCBvLmIgPDwgIikiOwotfQotCi1pbmxpbmUgb3N0cmVhbSAmb3BlcmF0b3I8PChvc3RyZWFtICZvdXQsY29uc3Qgc2V0PE9uZU1vdmVTd2FwPiZzKQotewotICBmb3Ioc2V0PE9uZU1vdmVTd2FwPjo6Y29uc3RfaXRlcmF0b3IgaT1zLmJlZ2luKCk7aSE9cy5lbmQoKTsrK2kpCi0gICAgY291dCA8PCAqaSA8PCAnICc7Ci0gIHJldHVybiBvdXQ7Ci19Ci0KLWJvb2wgbWFrZU9uZU1vdmVTd2FwKGNvbnN0IGFsaWdubWVudCZhLGNvbnN0IGFsaWdubWVudCZiLHNldDxPbmVNb3ZlU3dhcD4mb21zKTsKLQotdGVtcGxhdGU8Y2xhc3MgVFJBTlNQQUlSLGNsYXNzIE1PREVMPgotaW50IGNvbGxlY3RDb3VudHNPdmVyTmVpZ2hib3Job29kKGNvbnN0IFZlY3RvcjxwYWlyPE1vdmVTd2FwTWF0cml4PFRSQU5TUEFJUj4qLExvZ1Byb2I+ID4mc21zYywKLQkJCQkgICBWZWN0b3I8V29yZEluZGV4PiZlcywKLQkJCQkgICBWZWN0b3I8V29yZEluZGV4PiZmcyx0bW9kZWw8Q09VTlQsUFJPQj4mdFRhYmxlLAotCQkJCSAgIGFtb2RlbDxDT1VOVD4mYUNvdW50VGFibGUsYW1vZGVsPENPVU5UPiZkQ291bnRUYWJsZSwKLQkJCQkgICBubW9kZWw8Q09VTlQ+Jm5Db3VudFRhYmxlLGRvdWJsZSZwMWNvdW50LGRvdWJsZSZwMGNvdW50LAotCQkJCSAgIExvZ1Byb2ImX3RvdGFsLGZsb2F0IGNvdW50LGJvb2wgYWRkQ291bnRzLE1PREVMKmQ0VGFibGU9MCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvY29tbW9uLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExYzFmMS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotLyohCi1UaGlzIGlzIGdsb2JhbCBkZWZpbml0aW9uIGZvciBhbGwgbWFpbiBmaWxlcyBvZiB0aGUgcHJvZ3JhbSBzZXQKLSovCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9kNG5vcm0uY3h4IGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvZDRub3JtLmN4eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5MGE2Mi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9kNG5vcm0uY3h4CisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vIEQ0IE5vcm1hbGl6YXRpb24gZXhlY3V0YWJsZQotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3Ryc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJobW0uaCIKLSNpbmNsdWRlICJENFRhYmxlcy5oIgotI2luY2x1ZGUgIlBhcmFtZXRlci5oIgotI2RlZmluZSBJVEVSX00yIDAKLSNkZWZpbmUgSVRFUl9NSCA1Ci1HTE9CQUxfUEFSQU1FVEVSMyhpbnQsTW9kZWwxX0l0ZXJhdGlvbnMsIk1vZGVsMV9JdGVyYXRpb25zIiwiTk8uIElURVJBVElPTlMgTU9ERUwgMSIsIm0xIiwibnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIE1vZGVsIDEiLFBBUkxFVl9JVEVSLDUpOwotR0xPQkFMX1BBUkFNRVRFUjMoaW50LE1vZGVsMl9JdGVyYXRpb25zLCJNb2RlbDJfSXRlcmF0aW9ucyIsIk5PLiBJVEVSQVRJT05TIE1PREVMIDIiLCJtMiIsIm51bWJlciBvZiBpdGVyYXRpb25zIGZvciBNb2RlbCAyIixQQVJMRVZfSVRFUixJVEVSX00yKTsKLUdMT0JBTF9QQVJBTUVURVIzKGludCxITU1fSXRlcmF0aW9ucywiSE1NX0l0ZXJhdGlvbnMiLCJtaCIsIm51bWJlciBvZiBpdGVyYXRpb25zIGZvciBITU0gYWxpZ25tZW50IG1vZGVsIiwibWgiLCBQQVJMRVZfSVRFUixJVEVSX01IKTsKLUdMT0JBTF9QQVJBTUVURVIzKGludCxNb2RlbDNfSXRlcmF0aW9ucywiTW9kZWwzX0l0ZXJhdGlvbnMiLCJOTy4gSVRFUkFUSU9OUyBNT0RFTCAzIiwibTMiLCJudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgTW9kZWwgMyIsUEFSTEVWX0lURVIsNSk7Ci1HTE9CQUxfUEFSQU1FVEVSMyhpbnQsTW9kZWw0X0l0ZXJhdGlvbnMsIk1vZGVsNF9JdGVyYXRpb25zIiwiTk8uIElURVJBVElPTlMgTU9ERUwgNCIsIm00IiwibnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIE1vZGVsIDQiLFBBUkxFVl9JVEVSLDUpOwotR0xPQkFMX1BBUkFNRVRFUjMoaW50LE1vZGVsNV9JdGVyYXRpb25zLCJNb2RlbDVfSXRlcmF0aW9ucyIsIk5PLiBJVEVSQVRJT05TIE1PREVMIDUiLCJtNSIsIm51bWJlciBvZiBpdGVyYXRpb25zIGZvciBNb2RlbCA1IixQQVJMRVZfSVRFUiwwKTsKLUdMT0JBTF9QQVJBTUVURVIzKGludCxNb2RlbDZfSXRlcmF0aW9ucywiTW9kZWw2X0l0ZXJhdGlvbnMiLCJOTy4gSVRFUkFUSU9OUyBNT0RFTCA2IiwibTYiLCJudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgTW9kZWwgNiIsUEFSTEVWX0lURVIsMCk7Ci0KLUdMT0JBTF9QQVJBTUVURVIoZmxvYXQsIFBST0JfU01PT1RILCJwcm9iU21vb3RoIiwicHJvYmFiaWxpdHkgc21vb3RoaW5nIChmbG9vcikgdmFsdWUgIixQQVJMRVZfT1BUSEVVUiwxZS03KTsKLUdMT0JBTF9QQVJBTUVURVIoZmxvYXQsIE1JTkNPVU5USU5DUkVBU0UsIm1pbkNvdW50SW5jcmVhc2UiLCJtaW5pbWFsIGNvdW50IGluY3JlYXNlIixQQVJMRVZfT1BUSEVVUiwxZS03KTsKLQotR0xPQkFMX1BBUkFNRVRFUjIoaW50LFRyYW5zZmVyX0R1bXBfRnJlcSwiVFJBTlNGRVIgRFVNUCBGUkVRVUVOQ1kiLCJ0MnRvMyIsIm91dHB1dDogZHVtcCBvZiB0cmFuc2ZlciBmcm9tIE1vZGVsIDIgdG8gMyIsUEFSTEVWX09VVFBVVCwwKTsKLUdMT0JBTF9QQVJBTUVURVIyKGJvb2wsVmVyYm9zZSwidmVyYm9zZSIsInYiLCIwOiBub3QgdmVyYm9zZTsgMTogdmVyYm9zZSIsUEFSTEVWX09VVFBVVCwwKTsKLUdMT0JBTF9QQVJBTUVURVIoYm9vbCxMb2csImxvZyIsIjA6IG5vIGxvZ2ZpbGU7IDE6IGxvZ2ZpbGUiLFBBUkxFVl9PVVRQVVQsMCk7Ci0KLUdMT0JBTF9QQVJBTUVURVIoZG91YmxlLFAwLCJwMCIsImZpeGVkIHZhbHVlIGZvciBwYXJhbWV0ZXIgcF8wIGluIElCTS0zLzQgKGlmIG5lZ2F0aXZlIHRoZW4gaXQgaXMgZGV0ZXJtaW5lZCBpbiB0cmFpbmluZykiLFBBUkxFVl9FTSwtMS4wKTsKLUdMT0JBTF9QQVJBTUVURVIoZG91YmxlLE01UDAsIm01cDAiLCJmaXhlZCB2YWx1ZSBmb3IgcGFyYW1ldGVyIHBfMCBpbiBJQk0tNSAoaWYgbmVnYXRpdmUgdGhlbiBpdCBpcyBkZXRlcm1pbmVkIGluIHRyYWluaW5nKSIsUEFSTEVWX0VNLC0xLjApOwotR0xPQkFMX1BBUkFNRVRFUjMoYm9vbCxQZWcsInBlZ2dpbmciLCJwIiwiRE8gUEVHR0lORz8gKFkvTikiLCIwOiBubyBwZWdnaW5nOyAxOiBkbyBwZWdnaW5nIixQQVJMRVZfRU0sMCk7Ci0KLUdMT0JBTF9QQVJBTUVURVIoc2hvcnQsT2xkQURCQUNLT0ZGLCJhZGJhY2tvZmYiLCIiLC0xLDApOwotR0xPQkFMX1BBUkFNRVRFUjIodW5zaWduZWQgaW50LE1BWF9TRU5URU5DRV9MRU5HVEgsIm1sIiwiTUFYIFNFTlRFTkNFIExFTkdUSCIsIm1heGltdW0gc2VudGVuY2UgbGVuZ3RoIiwwLE1BWF9TRU5URU5DRV9MRU5HVEhfQUxMT1dFRCk7Ci0KLUdMT0JBTF9QQVJBTUVURVIoc2hvcnQsIERlZmljaWVudERpc3RvcnRpb25Gb3JFbXB0eVdvcmQsIkRlZmljaWVudERpc3RvcnRpb25Gb3JFbXB0eVdvcmQiLCIwOiBJQk0tMy9JQk0tNCBhcyBkZXNjcmliZWQgaW4gKEJyb3duIGV0IGFsLiAxOTkzKTsgMTogZGlzdG9ydGlvbiBtb2RlbCBvZiBlbXB0eSB3b3JkIGlzIGRlZmljaWVudDsgMjogZGlzdG9yaXRvbiBtb2RlbCBvZiBlbXB0eSB3b3JkIGlzIGRlZmljaWVudCAoZGlmZmVyZW50bHkpOyBzZXR0aW5nIHRoaXMgcGFyYW1ldGVyIGFsc28gaGVscHMgdG8gYXZvaWQgdGhhdCBkdXJpbmcgSUJNLTMgYW5kIElCTS00IHRyYWluaW5nIHRvbyBtYW55IHdvcmRzIGFyZSBhbGlnbmVkIHdpdGggdGhlIGVtcHR5IHdvcmQiLFBBUkxFVl9NT0RFTFMsMCk7Ci0KLS8qKgotSGVyZSBhcmUgcGFyYW1ldGVycyB0byBzdXBwb3J0IExvYWQgbW9kZWxzIGFuZCBkdW1wIG1vZGVscwotKi8KLQotR0xPQkFMX1BBUkFNRVRFUihpbnQscmVzdGFydCwicmVzdGFydCIsIlJlc3RhcnQgdHJhaW5pbmcgZnJvbSBhIGxldmVsLDA6IE5vcm1hbCByZXN0YXJ0LCBmcm9tIG1vZGVsIDEsIDE6IE1vZGVsIDEsIDI6IE1vZGVsIDIgSW5pdCAoVXNpbmcgTW9kZWwgMSBtb2RlbCBpbnB1dCBhbmQgdHJhaW4gbW9kZWwgMiksIDM6IE1vZGVsIDIsICh1c2luZyBtb2RlbCAyIGlucHV0IGFuZCB0cmFpbiBtb2RlbCAyKSwgNCA6IEhNTSBJbml0IChVc2luZyBNb2RlbCAxIG1vZGVsIGFuZCB0cmFpbiBITU0pLCA1OiBITU0gKFVzaW5nIE1vZGVsIDIgbW9kZWwgYW5kIHRyYWluIEhNTSkgNiA6IEhNTSAoVXNpbmcgSE1NIE1vZGVsIGFuZCB0cmFpbiBITU0pLCA3OiBNb2RlbCAzIEluaXQgKFVzZSBITU0gbW9kZWwgYW5kIHRyYWluIG1vZGVsIDMpIDg6IE1vZGVsIDMgSW5pdCAoVXNlIE1vZGVsIDIgbW9kZWwgYW5kIHRyYWluIG1vZGVsIDMpIDk6IE1vZGVsIDMsIDEwOiBNb2RlbCA0IEluaXQgKFVzZSBNb2RlbCAzIG1vZGVsIGFuZCB0cmFpbiBNb2RlbCA0KSAxMTogTW9kZWwgNCBhbmQgb24sICIsUEFSTEVWX0lOUFVULDApOwotR0xPQkFMX1BBUkFNRVRFUihib29sLGR1bXBDb3VudCwiZHVtcGNvdW50IiwiV2hldGhlciB3ZSBhcmUgZ29pbmcgdG8gZHVtcCBjb3VudCAoaW4gYWRkaXRpb24gdG8pIGZpbmFsIG91dHB1dD8iLFBBUkxFVl9PVVRQVVQsZmFsc2UpOwotR0xPQkFMX1BBUkFNRVRFUihib29sLGR1bXBDb3VudFVzaW5nV29yZFN0cmluZywiZHVtcGNvdW50dXNpbmd3b3Jkc3RyaW5nIiwiSW4gY291bnQgdGFibGUsIHNob3VsZCBhY3R1YWwgd29yZCBhcHBlYXJzIG9yIGp1c3QgdGhlIGlkPyBkZWZhdWx0IGlzIGlkIixQQVJMRVZfT1VUUFVULGZhbHNlKTsKLS8vLyBFTkQKLXNob3J0IE91dHB1dEluQWFjaGVuRm9ybWF0PTA7Ci1ib29sIFRyYW5zZmVyPVRSQU5TRkVSOwotYm9vbCBUcmFuc2ZlcjJ0bzM9MDsKLXNob3J0IE5vRW1wdHlXb3JkPTA7Ci1ib29sIEZFV0RVTVBTPTA7Ci1HTE9CQUxfUEFSQU1FVEVSKGJvb2wsT05MWUFMRFVNUFMsIk9OTFlBTERVTVBTIiwiMTogZG8gbm90IHdyaXRlIGFueSBmaWxlcyIsUEFSTEVWX09VVFBVVCwwKTsKLUdMT0JBTF9QQVJBTUVURVIoc2hvcnQsTkNQVVMsIk5DUFVTIiwiTnVtYmVyIG9mIENQVVMiLFBBUkxFVl9FTSwyKTsKLUdMT0JBTF9QQVJBTUVURVIoc2hvcnQsQ29tcGFjdEFsaWdubWVudEZvcm1hdCwiQ29tcGFjdEFsaWdubWVudEZvcm1hdCIsIjA6IGRldGFpbGxlZCBhbGlnbm1lbnQgZm9ybWF0LCAxOiBjb21wYWN0IGFsaWdubWVudCBmb3JtYXQgIixQQVJMRVZfT1VUUFVULDApOwotR0xPQkFMX1BBUkFNRVRFUjIoYm9vbCxOT0RVTVBTLCJOT0RVTVBTIiwiTk8gRklMRSBEVU1QUz8gKFkvTikiLCIxOiBkbyBub3Qgd3JpdGUgYW55IGZpbGVzIixQQVJMRVZfT1VUUFVULDApOwotCi1HTE9CQUxfUEFSQU1FVEVSKFdvcmRJbmRleCwgTUFYX0ZFUlRJTElUWSwgIk1BWF9GRVJUSUxJVFkiLAotCQkibWF4aW1hbCBmZXJ0aWxpdHkgZm9yIGZlcnRpbGl0eSBtb2RlbHMiLCBQQVJMRVZfRU0sIDEwKTsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXN0cmluZyBQcmVmaXgsIExvZ0ZpbGVuYW1lLCBPUGF0aCwgVXNhZ2UsIFNvdXJjZVZvY2FiRmlsZW5hbWUsCi0JCVRhcmdldFZvY2FiRmlsZW5hbWUsIENvcnB1c0ZpbGVuYW1lLCBUZXN0Q29ycHVzRmlsZW5hbWUsIHRfRmlsZW5hbWUsCi0JCVNvdXJjZVZvY2FiQ2xhc3Nlc0ZpbGVuYW1lLCBUYXJnZXRWb2NhYkNsYXNzZXNGaWxlbmFtZSwKLQkJYV9GaWxlbmFtZSwgcDBfRmlsZW5hbWUsIGRfRmlsZW5hbWUsIG5fRmlsZW5hbWUsIGRpY3Rpb25hcnlfRmlsZW5hbWU7Ci0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSl7Ci0JaWYoYXJnYyA8IDUpewotCQljZXJyIDw8ICJVc2FnZTogIiA8PCBhcmd2WzBdIDw8ICIgIHZjYjEgdmNiMiBvdXRwdXRGaWxlIGJhc2VGaWxlIFthZGRpdGlvbmFsMSBdLi4uIiA8PCBlbmRsOwotCQlyZXR1cm4gMTsKLQl9Ci0JV29yZENsYXNzZXMgZXdjLGZ3YzsKLQlkNG1vZGVsIGQ0bShNQVhfU0VOVEVOQ0VfTEVOR1RILGV3Yyxmd2MpOwotCVZlY3RvcjxXb3JkRW50cnk+IGV2bGlzdCxmdmxpc3Q7Ci0JdmNiTGlzdCBlVHJhaW5WY2JMaXN0KGV2bGlzdCksIGZUcmFpblZjYkxpc3QoZnZsaXN0KTsKLQlUYXJnZXRWb2NhYkZpbGVuYW1lID0gYXJndlsyXTsKLQlTb3VyY2VWb2NhYkZpbGVuYW1lID0gYXJndlsxXTsKLQllVHJhaW5WY2JMaXN0LnNldE5hbWUoYXJndlsxXSk7Ci0JZlRyYWluVmNiTGlzdC5zZXROYW1lKGFyZ3ZbMl0pOwotCWVUcmFpblZjYkxpc3QucmVhZFZvY2FiTGlzdCgpOwotCWZUcmFpblZjYkxpc3QucmVhZFZvY2FiTGlzdCgpOwotCVNvdXJjZVZvY2FiQ2xhc3Nlc0ZpbGVuYW1lID0gYXJndlsxXTsKLQlUYXJnZXRWb2NhYkNsYXNzZXNGaWxlbmFtZSA9IGFyZ3ZbMl07Ci0JU291cmNlVm9jYWJDbGFzc2VzRmlsZW5hbWUgKz0gIi5jbGFzc2VzIjsKLQlUYXJnZXRWb2NhYkNsYXNzZXNGaWxlbmFtZSArPSAiLmNsYXNzZXMiOwotCWQ0bS5tYWtlV29yZENsYXNzZXMoZVRyYWluVmNiTGlzdCwgZlRyYWluVmNiTGlzdCwgU291cmNlVm9jYWJDbGFzc2VzRmlsZW5hbWUuY19zdHIoKSwgVGFyZ2V0Vm9jYWJDbGFzc2VzRmlsZW5hbWUuY19zdHIoKSxlVHJhaW5WY2JMaXN0LGZUcmFpblZjYkxpc3QpOwotCS8vIFN0YXJ0IGl0ZXJhdGlvbjoKLQlmb3IoaW50IGkgPTQ7IGk8IGFyZ2MgOyBpKyspewotCQlzdHJpbmcgbmFtZSA9IGFyZ3ZbaV07Ci0JCXN0cmluZyBuYW1lQSA9IG5hbWUgOwotCQlzdHJpbmcgbmFtZUIgPSBuYW1lICsgIi5iIjsKLQkJaWYoZDRtLmF1Z0NvdW50KG5hbWVBLmNfc3RyKCksbmFtZUIuY19zdHIoKSkpewotCQkJY2VyciA8PCAiTG9hZGluZyAoZDQpIHRhYmxlICIgPDwgbmFtZUEgPDwgIi8iIDw8IG5hbWVCICA8PCAiIE9LIiA8PCBlbmRsOwotCi0JCX1lbHNlewotCQkJY2VyciA8PCAiRVJST1IgTG9hZGluZyAoZCkgdGFibGUgIiA8PCBuYW1lQSA8PCAiICAiIDw8IG5hbWVCIDw8IGVuZGw7Ci0JCX0gICAKLQl9Ci0KLQlkNG0ubm9ybWFsaXplVGFibGUoKTsKLQlzdHJpbmcgRGlmZk9QYXRoID0gYXJndlszXTsKLQlzdHJpbmcgZGlmZjEgPSBEaWZmT1BhdGg7Ci0Jc3RyaW5nIGRpZmYyID0gRGlmZk9QYXRoKyIuYiI7Ci0JY2VyciA8PCAiT3V0cHV0aW5nIGQ0IHRhYmxlIHRvICIgPDwgZGlmZjEgPDwgIiAiIDw8IGRpZmYyOwotCWQ0bS5wcmludFByb2JUYWJsZShkaWZmMS5jX3N0cigpLGRpZmYyLmNfc3RyKCkpOwotCi0JCi19Ci0KLS8vIFNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgdG8gZ2V0IGl0IGNvbXBpbGUuLgotCi1vZnN0cmVhbSBsb2dtc2c7Ci1jb25zdCBzdHJpbmcgc3RyMk51bShpbnQgbikgewotCXN0cmluZyBudW1iZXIgPSAiIjsKLQlkbyB7Ci0JCW51bWJlci5pbnNlcnQoKHNpemVfdCkwLCAxLCAoY2hhcikobiAlIDEwICsgJzAnKSk7Ci0JfSB3aGlsZSAoKG4gLz0gMTApID4gMCk7Ci0JcmV0dXJuIChudW1iZXIpOwotfQotZG91YmxlIExBTUJEQT0xLjA5OwotCi1WZWN0b3I8bWFwPCBwYWlyPGludCxpbnQ+LGNoYXIgPiA+IFJlZmVyZW5jZUFsaWdubWVudDsKLQotZG91YmxlIEVycm9yc0luQWxpZ25tZW50KGNvbnN0IG1hcDwgcGFpcjxpbnQsaW50PixjaGFyID4mcmVmZXJlbmNlLAotCQljb25zdCBWZWN0b3I8V29yZEluZGV4PiZ0ZXN0LCBpbnQgbCwgaW50Jm1pc3NpbmcsIGludCZ0b29tdWNoLAotCQlpbnQmZXZlbnRzTWlzc2luZywgaW50JmV2ZW50c1Rvb211Y2gsIGludCBwYWlyX25vKXsKLQkJCXJldHVybiAwOwotCQl9Ci0KLXZvaWQgcHJpbnRHSVpBUGFycyhvc3RyZWFtJm91dCl7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2RlZnMuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2RlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0YWRkZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9kZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpZm5kZWYgX2RlZnNfaAotI2RlZmluZSBfZGVmc19oIDEKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi1jb25zdCBpbnQgVFJBTlNGRVJfU0lNUExFPTE7Ci1jb25zdCBpbnQgVFJBTlNGRVI9MDsKLQotY29uc3QgdW5zaWduZWQgaW50IE1BWF9TRU5URU5DRV9MRU5HVEhfQUxMT1dFRD0xMDE7Ci1jb25zdCBpbnQgVFJBSU5fQlVGRkVSX1NJWkU9IDUwMDAwOwotLy8jaWZkZWYgV09SRElOREVYX1dJVEhfNF9CWVRFCi10eXBlZGVmIHVuc2lnbmVkIGludCBXb3JkSW5kZXg7Ci1jb25zdCB1bnNpZ25lZCBpbnQgTUFYX1ZPQ0FCX1NJWkU9VUlOVF9NQVg7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBQb3NpdGlvbkluZGV4OwotLy8jZWxzZQotLy90eXBlZGVmIHVuc2lnbmVkIHNob3J0IFdvcmRJbmRleDsKLS8vY29uc3QgdW5zaWduZWQgaW50IE1BWF9WT0NBQl9TSVpFPVVTSFJUX01BWDsKLS8vdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBQb3NpdGlvbkluZGV4OwotLy8jZW5kaWYKLWV4dGVybiBXb3JkSW5kZXggTUFYX0ZFUlRJTElUWTsKLQotY29uc3QgaW50IE1BWF9XPTQ1Nzk3OTsKLWV4dGVybiBkb3VibGUgTEFNQkRBOyAvLyBMYW1iZGEgdGhhdCBpcyB1c2VkIHRvIHNjYWxlIGNyb3NzX2VudHJvcHkgZmFjdG9yCi0KLXR5cGVkZWYgZmxvYXQgUFJPQiA7Ci10eXBlZGVmIGZsb2F0IENPVU5UIDsKLSAKLWNsYXNzIExvZ1Byb2IgewotIHByaXZhdGU6Ci0gIGRvdWJsZSB4IDsKLSBwdWJsaWM6Ci0gIExvZ1Byb2IoKTp4KDApe30KLSAgTG9nUHJvYihkb3VibGUgeSk6eCh5KXt9Ci0gIExvZ1Byb2IoZmxvYXQgeSk6eCh5KXt9Ci0gIExvZ1Byb2IoaW50IHkpOngoeSl7fQotICBMb2dQcm9iKFdvcmRJbmRleCB5KTp4KHkpe30KLSAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3Qge3JldHVybiB4O30KLSAgTG9nUHJvYiBvcGVyYXRvciAqPSAoZG91YmxlIHkpIHsgeCAqPSB5IDsgcmV0dXJuICp0aGlzO30KLSAgTG9nUHJvYiBvcGVyYXRvciAqPSAoTG9nUHJvYiB5KSB7IHggKj0geS54IDsgcmV0dXJuICp0aGlzO30KLSAgTG9nUHJvYiBvcGVyYXRvciAvPSAoZG91YmxlIHkpIHsgeCAvPSB5IDsgcmV0dXJuICp0aGlzO30KLSAgTG9nUHJvYiBvcGVyYXRvciAvPSAoTG9nUHJvYiB5KSB7IHggLz0geS54IDsgcmV0dXJuICp0aGlzO30KLSAgTG9nUHJvYiBvcGVyYXRvciArPSAoZG91YmxlIHkpIHsgeCArPSB5IDsgcmV0dXJuICp0aGlzO30KLSAgTG9nUHJvYiBvcGVyYXRvciArPSAoTG9nUHJvYiB5KSB7IHggKz0geS54IDsgcmV0dXJuICp0aGlzO30KLX07Ci0KLWNvbnN0IGludCBQQVJMRVZfSVRFUj0xOwotY29uc3QgaW50IFBBUkxFVl9PUFRIRVVSPTI7Ci1jb25zdCBpbnQgUEFSTEVWX09VVFBVVD0zOwotY29uc3QgaW50IFBBUkxFVl9TTU9PVEg9NDsKLWNvbnN0IGludCBQQVJMRVZfRU09NTsKLWNvbnN0IGludCBQQVJMRVZfTU9ERUxTPTY7Ci1jb25zdCBpbnQgUEFSTEVWX1NQRUNJQUw9NzsKLWNvbnN0IGludCBQQVJMRVZfSU5QVVQ9ODsKLQotI2VuZGlmCi0gIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvZmlsZV9zcGVjLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9maWxlX3NwZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1YWE1Yi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9maWxlX3NwZWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0KLUVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2lmbmRlZiBGSUxFX1NQRUNfSAotI2RlZmluZSBGSUxFX1NQRUNfSAotCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZywgbG9jYWxseSBjYWxsZWQgZmlsZV9zcGVjLiBUaGlzCi0gICBzdHJpbmcgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGRhdGUgYW5kIHRpbWUgb2YgZXhlY3V0aW9uCi0gICBhbmQgdGhlIHVzZXIgd2hvIGlzIHBlcmZvcm1pbmcgdGhlIGV4ZWN1dGlvbiAqLwotLyogT3JpZ2luYWxseSBpbXBsZW1lbnRlZCBpbiBDIGJ5IFlhc2VyIEFsLU9uYWl6YW47IAotICAgZWRpdGlvbnMgZm9yIEMrKyBhbmQgZm9ybWF0dGluZyBieSBOb2FoIEEuIFNtaXRoLCA5IEp1bHkgMTk5OSAqLwotCi1jaGFyICpHZXRfRmlsZV9TcGVjICgpewotICBzdHJ1Y3QgdG0gKmxvY2FsOwotICB0aW1lX3QgdDsKLSAgY29uc3QgY2hhciAqdXNlcjsKLSAgY2hhciB0aW1lX3N0bXBbNTddOwotICBjaGFyICpmaWxlX3NwZWMgPSAwOwotICAKLSAgdCA9IHRpbWUoTlVMTCk7Ci0gIGxvY2FsID0gbG9jYWx0aW1lKCZ0KTsKLSAgCi0gIHNwcmludGYodGltZV9zdG1wLCAiJTAyZC0lMDJkLSUwMmQuJTAyZCUwMmQlMDJkLiIsIGxvY2FsLT50bV95ZWFyLCAKLQkgIChsb2NhbC0+dG1fbW9uICsgMSksIGxvY2FsLT50bV9tZGF5LCBsb2NhbC0+dG1faG91ciwgCi0JICBsb2NhbC0+dG1fbWluLCBsb2NhbC0+dG1fc2VjKTsKLSNpZmRlZiBXSU4zMgotICB1c2VyID0gIldJTlVTRVIiOwotI2Vsc2UKLSAgdXNlciA9IGdldGVudigiVVNFUiIpOwotI2VuZGlmCi0KLSAgZmlsZV9zcGVjID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpICogCi0JCQkgICAgIChzdHJsZW4odGltZV9zdG1wKSArIHN0cmxlbih1c2VyKSArIDEpKTsKLSAgZmlsZV9zcGVjWzBdID0gJ1wwJzsKLSAgc3RyY2F0KGZpbGVfc3BlYywgdGltZV9zdG1wKSA7Ci0gIHN0cmNhdChmaWxlX3NwZWMsIHVzZXIpOwotICByZXR1cm4gZmlsZV9zcGVjOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2dldFNlbnRlbmNlLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2dldFNlbnRlbmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxYWQ5ZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9nZXRTZW50ZW5jZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogTW9kdWxlIDogZ2V0U2VudGVjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIE1ldGhvZCBEZWZpbml0aW9ucyBGaWxlOiBnZXRTZW50ZW5jZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBPYmplY3RpdmU6IERlZmluZXMgY2xhc2VzIGFuZCBtZXRob2RzIGZvciBoYW5kbGluZyBJL08gZm9yIHRoZSBwYXJhbGxlbCAgICoKLSAqICAgICAgICAgICAgY29ycHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJnZXRTZW50ZW5jZS5oIgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0cnN0cmVhbT4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgIlBhcmFtZXRlci5oIgotI2luY2x1ZGUgImVycm5vLmgiCi0KLWludCBQcmludGVkVG9vTG9uZz0wOwotCi0vKiAtLS0tLS0tLS0tLS0tLSBNZXRob2QgRGVmbml0aW9ucyBmb3IgQ2xhc3Mgc2VudGVuY2VIYW5kbGVyIC0tLS0tLS0tLS0tLS0tLSovCi0KLUdMT0JBTF9QQVJBTUVURVIoZG91YmxlLE1hbmxleE1BWF9NVUxUSVBMSUNJVFksIm1hbmxleE1BWF9NVUxUSVBMSUNJVFkiLCIiLFBBUkxFVl9FTSwyMC4wKTsKLUdMT0JBTF9QQVJBTUVURVIoZG91YmxlLE1hbmxleGZhY3RvcjEsIm1hbmxleGZhY3RvcjEiLCIiLFBBUkxFVl9FTSwwLjApOwotR0xPQkFMX1BBUkFNRVRFUihkb3VibGUsTWFubGV4ZmFjdG9yMiwibWFubGV4ZmFjdG9yMiIsIiIsUEFSTEVWX0VNLDAuMCk7Ci0KLXNlbnRlbmNlSGFuZGxlcjo6c2VudGVuY2VIYW5kbGVyKGNvbnN0IGNoYXIqICBmaWxlbmFtZSwgdmNiTGlzdCogZWxpc3QsIAotCQkJCSB2Y2JMaXN0KiAgZmxpc3QpIDogcmVhbENvdW50KDApCi0gIC8vIFRoaXMgbWV0aG9kIGlzIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MsIGl0IGFsc28gaW50aXRpYWxpemVzIHRoZSAKLSAgLy8gc2VudGVuY2UgcGFpciBzZXF1ZW50aWFsIG51bWJlciAoY291bnQpIHRvIHplcm8uCi17Ci0gICAgcmVhZHNlbnRfbXV0ZXg9bmV3IGJvb3N0OjptdXRleCgpOwotICAgc2V0cHJvYl9tdXRleCA9IG5ldyBib29zdDo6bXV0ZXgoKTsKLQotICAgIHBvc2l0aW9uID0gMDsKLSAgICByZWFkZmxhZyA9IGZhbHNlIDsKLSAgICBhbGxJbk1lbW9yeSA9IGZhbHNlIDsKLSAgICBpbnB1dEZpbGVuYW1lID0gZmlsZW5hbWUgOwotICAgIGlucHV0RmlsZSA9IG5ldyBpZnN0cmVhbShmaWxlbmFtZSk7Ci0gICAgcGFpcl9ubyA9IDAgOwotICAgIGlmKCEoKmlucHV0RmlsZSkpewotICAgICAgICBjZXJyIDw8ICJcbkVSUk9SOihhKSBDYW5ub3Qgb3BlbiAiIDw8IGZpbGVuYW1lOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBjdXJyZW50U2VudGVuY2UgPSAwOwotICAgIHRvdGFsUGFpcnMxID0gMCA7Ci0gICAgdG90YWxQYWlyczIgPTA7Ci0gICAgcGFpcl9ubyA9IDAgOwotICAgIG5vU2VudEluQnVmZmVyID0gMCA7Ci0gICAgQnVmZmVyLmNsZWFyKCk7Ci0gICAgYm9vbCBpc05lZ2F0aXZlPTA7Ci0Jc3RkOjpzZXQ8V29yZEluZGV4PiBldm9jLGZ2b2M7Ci0JZXZvYy5pbnNlcnQoMCk7Ci0JZnZvYy5pbnNlcnQoMCk7Ci0gICAgaWYgKGVsaXN0ICYmIGZsaXN0KXsKLSAgICAgICAgY291dCA8PCAiQ2FsY3VsYXRpbmcgdm9jYWJ1bGFyeSBmcmVxdWVuY2llcyBmcm9tIGNvcnB1cyAiIDw8IGZpbGVuYW1lIDw8ICdcbic7Ci0gICAgICAgIHNlbnRQYWlyIHMgOwotICAgICAgICB3aGlsZSAoZ2V0TmV4dFNlbnRlbmNlKHMsIGVsaXN0LCBmbGlzdCkpCi0gICAgICAgIHsKLQkJCWZvcihpbnQgaSA9IDAgOyBpPCBzLmVTZW50LnNpemUoKSA7IGkrKyl7Ci0JCQkJZXZvYy5pbnNlcnQocy5lU2VudFtpXSk7Ci0JCQl9Ci0JCQlmb3IoaW50IGkgPSAwIDsgaTwgcy5mU2VudC5zaXplKCkgOyBpKyspewotCQkJCWZ2b2MuaW5zZXJ0KHMuZlNlbnRbaV0pOwotCQkJfQkJCQotICAgICAgICAgICAgdG90YWxQYWlyczErKzsKLSAgICAgICAgICAgIHRvdGFsUGFpcnMyKz1zLnJlYWxDb3VudDsgCi0gICAgICAgICAgICAvLyBOT1RFOiB0aGlzIHZhbHVlIG1pZ2h0IGNoYW5nZSBkdXJpbmcgdHJhaW5pbmcgCi0gICAgICAgICAgICAvLyBmb3Igd29yZHMgZnJvbSB0aGUgbWFudWFsIGRpY3Rpb25hcnksIHlldCB0aGlzIGlzIGlnbm9yZWQhCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBzLm5vT2NjPDAgKQotICAgICAgICAgICAgICAgIGlzTmVnYXRpdmU9MTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiggaXNOZWdhdGl2ZT09MSApCi0gICAgewotICAgICAgICBjZXJyIDw8ICJXQVJOSU5HOiBjb3JwdXMgY29udGFpbnMgbmVnYXRpdmUgb2NjdXJyZW5jeSBmcmVxdWVuY2llcyA9PiB0aGVzZSBhcmUgaW50ZXJwcmV0ZWQgYXMgZW50cmllcyBvZiBhIG1hbnVhbCBkaWN0aW9uYXJ5LlxuIjsKLSAgICAgICAgcmVhbENvdW50PW5ldyBWZWN0b3I8ZG91YmxlPih0b3RhbFBhaXJzMSwxLjApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJlYWxDb3VudD0wOwotCWVsaXN0LT5jb21wYWN0KGV2b2MpOwotCWZsaXN0LT5jb21wYWN0KGZ2b2MpOwotfQotCi1zZW50ZW5jZUhhbmRsZXI6OnNlbnRlbmNlSGFuZGxlcihjb25zdCBjaGFyKiAgZmlsZW5hbWUsIHZjYkxpc3QqIGVsaXN0LAotCQl2Y2JMaXN0KiAgZmxpc3Qsc3RkOjpzZXQ8V29yZEluZGV4PiYgZWFwcCwgc3RkOjpzZXQ8V29yZEluZGV4PiYgZmFwcCkgOiByZWFsQ291bnQoMCkKLQkJCQkgICAvLyBUaGlzIG1ldGhvZCBpcyB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNsYXNzLCBpdCBhbHNvIGludGl0aWFsaXplcyB0aGUgCi0JCQkJICAgLy8gc2VudGVuY2UgcGFpciBzZXF1ZW50aWFsIG51bWJlciAoY291bnQpIHRvIHoKLXsgCi0gICAgcmVhZHNlbnRfbXV0ZXg9bmV3IGJvb3N0OjptdXRleCgpOwotICAgIHNldHByb2JfbXV0ZXg9bmV3IGJvb3N0OjptdXRleCgpOwotICAgIHBvc2l0aW9uID0gMDsKLQlyZWFkZmxhZyA9IGZhbHNlIDsKLQlhbGxJbk1lbW9yeSA9IGZhbHNlIDsKLQlpbnB1dEZpbGVuYW1lID0gZmlsZW5hbWUgOwotCWlucHV0RmlsZSA9IG5ldyBpZnN0cmVhbShmaWxlbmFtZSk7Ci0JcGFpcl9ubyA9IDAgOwotCWlmKCEoKmlucHV0RmlsZSkpewotCQljZXJyIDw8ICJcbkVSUk9SOihhKSBDYW5ub3Qgb3BlbiAiIDw8IGZpbGVuYW1lOwotCQlleGl0KDEpOwotCX0KLQljdXJyZW50U2VudGVuY2UgPSAwOwotCXRvdGFsUGFpcnMxID0gMCA7Ci0JdG90YWxQYWlyczIgPTA7Ci0JcGFpcl9ubyA9IDAgOwotCW5vU2VudEluQnVmZmVyID0gMCA7Ci0JQnVmZmVyLmNsZWFyKCk7Ci0JYm9vbCBpc05lZ2F0aXZlPTA7Ci0JaWYgKGVsaXN0ICYmIGZsaXN0KXsKLQkJY291dCA8PCAiQ2FsY3VsYXRpbmcgdm9jYWJ1bGFyeSBmcmVxdWVuY2llcyBmcm9tIGNvcnB1cyAiIDw8IGZpbGVuYW1lIDw8ICdcbic7Ci0JCXNlbnRQYWlyIHMgOwotCQl3aGlsZSAoZ2V0TmV4dFNlbnRlbmNlKHMsIGVsaXN0LCBmbGlzdCkpCi0JCXsgCi0JCQlpbnQgazsKLQkJCWZvcihrPTA7azxzLmVTZW50LnNpemUoKTtrKyspewotCQkJCWVhcHAuaW5zZXJ0KHMuZVNlbnRba10pOwotCQkJfQotCQkJZm9yKGs9MDtrPHMuZlNlbnQuc2l6ZSgpO2srKyl7Ci0JCQkJZmFwcC5pbnNlcnQocy5mU2VudFtrXSk7Ci0JCQl9Ci0JCQl0b3RhbFBhaXJzMSsrOwotCQkJdG90YWxQYWlyczIrPXMucmVhbENvdW50OyAKLQkJCS8vIE5PVEU6IHRoaXMgdmFsdWUgbWlnaHQgY2hhbmdlIGR1cmluZyB0cmFpbmluZyAKLQkJCS8vIGZvciB3b3JkcyBmcm9tIHRoZSBtYW51YWwgZGljdGlvbmFyeSwgeWV0IHRoaXMgaXMgaWdub3JlZCEKLQkJCQotCQkJaWYoIHMubm9PY2M8MCApCi0JCQkJaXNOZWdhdGl2ZT0xOwotCQl9Ci0JfQotCWlmKCBpc05lZ2F0aXZlPT0xICkKLQl7IAotCQljZXJyIDw8ICJXQVJOSU5HOiBjb3JwdXMgY29udGFpbnMgbmVnYXRpdmUgb2NjdXJyZW5jeSBmcmVxdWVuY2llcyA9PiB0aGVzZSBhcmUgaW50ZXJwcmV0ZWQgYXMgZW50cmllcyBvZiBhIG1hbnVhbCBkaWN0aW9uYXJ5LlxuIjsgICAKLQkJcmVhbENvdW50PW5ldyBWZWN0b3I8ZG91YmxlPih0b3RhbFBhaXJzMSwxLjApOwotCX0KLQllbHNlCi0JCXJlYWxDb3VudD0wOwotfQotCi12b2lkIHNlbnRlbmNlSGFuZGxlcjo6cmV3aW5kKCkKLXsKLQlyZWFkc2VudF9tdXRleC0+bG9jaygpOwotICAgIHBvc2l0aW9uID0gMDsKLSAgICBjdXJyZW50U2VudGVuY2UgPSAwOwotICAgIHJlYWRmbGFnID0gZmFsc2UgOwotICAgIGlmICghYWxsSW5NZW1vcnkgfHwgCi0gICAgICAgICEoQnVmZmVyLnNpemUoKSA+PSAxICYmIEJ1ZmZlcltjdXJyZW50U2VudGVuY2VdLnNlbnRlbmNlTm8gPT0gMSkpewotICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGJ1ZmZlciBkb2Ugbm90IGFscmVhZHkgaGFzIHRoZSBmaXJzdCBjaHVuayBvZiBwYWlycyAKLSAgICAgICAgICAgIGlmIChCdWZmZXIuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgICBjZXJyIDw8ICcgJyA8PCAgQnVmZmVyW2N1cnJlbnRTZW50ZW5jZV0uc2VudGVuY2VObyA8PCAnXG4nOwotICAgICAgICAgICAgLy8gICAgdG90YWxQYWlycyA9IDAgOwotICAgICAgICAgICAgcGFpcl9ubyA9IDAgOwotICAgICAgICAgICAgbm9TZW50SW5CdWZmZXIgPSAwIDsKLSAgICAgICAgICAgIEJ1ZmZlci5jbGVhcigpOwotICAgICAgICB9Ci0gICAgaWYgKCFhbGxJbk1lbW9yeSl7Ci0gICAgICAgIGRlbGV0ZSBpbnB1dEZpbGU7Ci0gICAgICAgIGlucHV0RmlsZSA9IG5ldyBpZnN0cmVhbShpbnB1dEZpbGVuYW1lKTsKLSAgICAgICAgaWYoISgqaW5wdXRGaWxlKSl7Ci0gICAgICAgICAgICBjZXJyIDw8ICJcbkVSUk9SOihiKSBDYW5ub3Qgb3BlbiAiIDw8IGlucHV0RmlsZW5hbWUgPDwgIiAiIDw8IChpbnQpZXJybm87Ci0gICAgICAgIH0KLSAgICB9Ci0JIHJlYWRzZW50X211dGV4LT51bmxvY2soKTsKLX0KLQotICAKLWludCBzZW50ZW5jZUhhbmRsZXI6OmdldE5leHRTZW50ZW5jZShzZW50UGFpciYgc2VudCwgdmNiTGlzdCogZWxpc3QsIHZjYkxpc3QqIGZsaXN0KQotewotICAgIHJlYWRzZW50X211dGV4LT5sb2NrKCk7Ci0gICAgCi0gICAgZG97Ci0gICAgICAgIHNlbnRQYWlyIHMgOwotICAgICAgICBpZiAocmVhZGZsYWcpewotICAgICAgICAgICAgY2VyciA8PCAiQXR0ZW1wdGluZyB0byByZWFkIGZyb20gdGhlIGVuZCBvZiBjb3JwdXMsIHJld2luZGluZ1xuIjsKLSAgICAgICAgICAgIC8vcmV3aW5kKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAKLSAgICAgICAgaWYgKGN1cnJlbnRTZW50ZW5jZSA+PSBub1NlbnRJbkJ1ZmZlcil7Ci0gICAgICAgICAgICBpZiAoYWxsSW5NZW1vcnkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiBubyBtb3JlIHNlbnRlbmNlcyBpbiBidWZmZXIgKi8KLSAgICAgICAgICAgIG5vU2VudEluQnVmZmVyID0gMCA7Ci0gICAgICAgICAgICBjdXJyZW50U2VudGVuY2UgPSAwIDsKLSAgICAgICAgICAgIEJ1ZmZlci5jbGVhcigpOwotICAgICAgICAgICAgY291dCA8PCAiUmVhZGluZyBtb3JlIHNlbnRlbmNlIHBhaXJzIGludG8gbWVtb3J5IC4uLiBcbiI7Ci0gICAgICAgICAgICB3aGlsZSgobm9TZW50SW5CdWZmZXIgPCBUUkFJTl9CVUZGRVJfU0laRSkgJiYgcmVhZE5leHRTZW50ZW5jZShzKSl7Ci0gICAgICAgICAgICAgICAgaWYgKChzLmZTZW50LnNpemUoKS0xKSA+IChNQVhfRkVSVElMSVRZLTEpICogKHMuZVNlbnQuc2l6ZSgpLTEpKXsKLSAgICAgICAgICAgICAgICAgICAgY2VyciA8PCAiV0FSTklORzogVGhlIGZvbGxvd2luZyBzZW50ZW5jZSBwYWlyIGhhcyBzb3VyY2UvdGFyZ2V0IHNlbnRlbmNlIGxlbmd0aCByYXRpb24gbW9yZSB0aGFuXG4iPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgbWF4aW11bSBhbGxvd2VkIGxpbWl0IGZvciBhIHNvdXJjZSB3b3JkIGZlcnRpbGl0eVxuIjw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAiIHNvdXJjZSBsZW5ndGggPSAiIDw8IHMuZVNlbnQuc2l6ZSgpLTEgPDwgIiB0YXJnZXQgbGVuZ3RoID0gIiA8PCBzLmZTZW50LnNpemUoKS0xIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAiIHJhdGlvICIgPDwgZG91YmxlKHMuZlNlbnQuc2l6ZSgpLTEpLyAgKHMuZVNlbnQuc2l6ZSgpLTEpIDw8ICIgZmVyaWxpdHkgbGltaXQgOiAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICBNQVhfRkVSVElMSVRZLTEgPDwgJ1xuJzsKLSAgICAgICAgICAgICAgICAgICAgY2VyciA8PCAiU2hvcnRlbmluZyBzZW50ZW5jZSBcbiI7Ci0gICAgICAgICAgICAgICAgICAgIGNlcnIgPDwgczsKLSAgICAgICAgICAgICAgICAgICAgcy5lU2VudC5yZXNpemUobWluKHMuZVNlbnQuc2l6ZSgpLHMuZlNlbnQuc2l6ZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHMuZlNlbnQucmVzaXplKG1pbihzLmVTZW50LnNpemUoKSxzLmZTZW50LnNpemUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCdWZmZXIucHVzaF9iYWNrKHMpIDsKLSAgICAgICAgICAgICAgICBpZiAoZWxpc3QgJiYgZmxpc3QpewotICAgICAgICAgICAgICAgICAgICBpZiAoKCplbGlzdCkuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoV29yZEluZGV4IGk9IDAgOyBpIDwgcy5lU2VudC5zaXplKCkgOyBpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmVTZW50W2ldID49ICgqZWxpc3QpLnVuaXFUb2tlbnMoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBQcmludGVkVG9vTG9uZysrPDEwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnIgPDwgIkVSUk9SOiBzb3VyY2Ugd29yZCAiIDw8IHMuZVNlbnRbaV0gPDwgIiBpcyBub3QgaW4gdGhlIHZvY2FidWxhcnkgbGlzdCBcbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmVsaXN0KS5pbmNGcmVxKHMuZVNlbnRbaV0sIHMucmVhbENvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgqZmxpc3QpLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFdvcmRJbmRleCBqPSAxIDsgaiA8IHMuZlNlbnQuc2l6ZSgpIDsgaisrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5mU2VudFtqXSA+PSAoKmZsaXN0KS51bmlxVG9rZW5zKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJyIDw8ICJFUlJPUjogdGFyZ2V0IHdvcmQgIiA8PCBzLmZTZW50W2pdIDw8ICIgaXMgbm90IGluIHRoZSB2b2NhYnVsYXJ5IGxpc3QgXG4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmbGlzdCkuaW5jRnJlcShzLmZTZW50W2pdLCBzLnJlYWxDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5vU2VudEluQnVmZmVyKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW5wdXRGaWxlLT5lb2YoKSl7Ci0gICAgICAgICAgICAgICAgYWxsSW5NZW1vcnkgPSAoQnVmZmVyLnNpemUoKSA+PSAxICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcltjdXJyZW50U2VudGVuY2VdLnNlbnRlbmNlTm8gPT0gMSkgOwotICAgICAgICAgICAgICAgIGlmIChhbGxJbk1lbW9yeSkKLSAgICAgICAgICAgICAgICAgICAgY291dCA8PCAiQ29ycHVzIGZpdHMgaW4gbWVtb3J5LCBjb3JwdXMgaGFzOiAiIDw8IEJ1ZmZlci5zaXplKCkgPDwKLSAgICAgICAgICAgICAgICAgICAgIiBzZW50ZW5jZSBwYWlycy5cbiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYobm9TZW50SW5CdWZmZXIgPD0gMCApewotICAgICAgICAgICAgLy9jZXJyIDw8ICIjIHNlbnQgaW4gYnVmZmVyICIgPDwgbm9TZW50SW5CdWZmZXIgPDwgJ1xuJzsKLSAgICAgICAgICAgIHJlYWRmbGFnID0gdHJ1ZSA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzZW50ID0gQnVmZmVyW2N1cnJlbnRTZW50ZW5jZSsrXSA7Ci0gICAgICAgIHBvc2l0aW9uICsrOwotICAgICAgICBpZiggc2VudC5ub09jYzwwICYmIHJlYWxDb3VudCApewotICAgICAgICAgICAgaWYoIE1hbmxleGZhY3RvcjEgJiYgc2VudC5ub09jYz09LTEuMCApCi0gICAgICAgICAgICAgICAgc2VudC5yZWFsQ291bnQ9TWFubGV4ZmFjdG9yMTsKLSAgICAgICAgICAgIGVsc2UgaWYoIE1hbmxleGZhY3RvcjIgJiYgc2VudC5ub09jYz09LTIuMCApCi0gICAgICAgICAgICAgICAgc2VudC5yZWFsQ291bnQ9TWFubGV4ZmFjdG9yMjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZW50LnJlYWxDb3VudD0oKnJlYWxDb3VudClbc2VudC5nZXRTZW50ZW5jZU5vKCktMV07Ci0gICAgICAgIH0KLSAgICAgICAgcmVhZHNlbnRfbXV0ZXgtPnVubG9jaygpOwotICAgICAgICByZXR1cm4gcG9zaXRpb24gOwotICAgIH13aGlsZShmYWxzZSk7Ci0gICAgcmVhZHNlbnRfbXV0ZXgtPnVubG9jaygpOwotICAgIHJldHVybiAwOwotfQotYm9vbCBzZW50ZW5jZUhhbmRsZXI6OnJlYWROZXh0U2VudGVuY2Uoc2VudFBhaXImIHNlbnQpCi0gIC8qIFRoaXMgbWV0aG9kIHJlYWRzIGluIGEgbmV3IHBhaXIgb2Ygc2VudGVuY2VzLCBlYWNoIHBhaXIgaXMgcmVhZCBmcm9tIHRoZSAKLSAgICAgY29ycHVzIGZpbGUgYXMgbGluZSB0cmlwbGVzLiBUaGUgZmlyc3QgbGluZSB0aGUgbm8gb2YgdGltZXMgdGhpcyBsaW5lIAotICAgICBwYWlyIG9jY3VyZWQgaW4gdGhlIGNvcnB1cywgdGhlIHNlY29uZCBsaW5lIGlzIHRoZSBzb3VyY2Ugc2VudGVuY2UgYW5kIAotICAgICB0aGUgdGhpcmQgaXMgdGhlIHRhcmdldCBzZW50ZW5jZS4gVGhlIHNlbnRlbmNlcyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBzcGFjZQotICAgICBzZXBhcmF0ZWQgcG9zaXRpdmUgaW50ZWdlciB0b2tlbiBpZHMuICovCi17Ci0KLSAgc3RyaW5nIGxpbmU7Ci0gIGJvb2wgZmFpbChmYWxzZSkgOwotICAKLSAgc2VudC5jbGVhcigpOwotICB2ZWN0b3I8c3RyaW5nPiBzcGxpdHM7Ci0gIGlmIChnZXRsaW5lKCppbnB1dEZpbGUsIGxpbmUpKXsKLQotCSAgYm9vc3Q6OmFsZ29yaXRobTo6c3BsaXQoc3BsaXRzLGxpbmUsYm9vc3Q6OmFsZ29yaXRobTo6aXNfYW55X29mKCJ8IyoiKSk7Ci0KLQkgIGlmKHNwbGl0cy5zaXplKCkgPT0gMSB8fCBzcGxpdHMuc2l6ZSgpID09IDApewotCQkgIC8vIGNvbnRpbnVlLCBubyBwcm9ibGVtCi0JCSAgCi0JICB9ZWxzZSBpZihzcGxpdHMuc2l6ZSgpPT0zKXsKLQkJICBsaW5lID0gc3BsaXRzWzBdOwotCSAgfWVsc2V7Ci0JCSAgZmFpbCA9IHRydWU7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgCi0gICAgaXN0cnN0cmVhbSBidWZmZXIobGluZS5jX3N0cigpKTsKLSAgICBidWZmZXIgPj4gc2VudC5ub09jYzsKLSAgICBpZiggc2VudC5ub09jYzwwICkKLSAgICAgIHsKLQlpZiggcmVhbENvdW50ICkKLQkgIHsKLQkgICAgaWYoIE1hbmxleGZhY3RvcjEgJiYgc2VudC5ub09jYz09LTEuMCApCi0JICAgICAgc2VudC5yZWFsQ291bnQ9TWFubGV4ZmFjdG9yMTsKLQkgICAgZWxzZSBpZiggTWFubGV4ZmFjdG9yMiAmJiBzZW50Lm5vT2NjPT0tMi4wICkKLQkgICAgICBzZW50LnJlYWxDb3VudD1NYW5sZXhmYWN0b3IyOwotCSAgICBlbHNlCi0JICAgICAgewotCQlzZW50LnJlYWxDb3VudD0oKnJlYWxDb3VudClbcGFpcl9ub107Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIHNlbnQucmVhbENvdW50PTEuMDsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICBzZW50LnJlYWxDb3VudD1zZW50Lm5vT2NjOwotICB9Ci0gIGVsc2UgewotICAgIGZhaWwgPSB0cnVlIDs7Ci0gIH0KLSAgaWYgKHNwbGl0cy5zaXplKCk9PTMgfHwgZ2V0bGluZSgqaW5wdXRGaWxlLCBsaW5lKSl7Ci0JICBpZihzcGxpdHMuc2l6ZSgpPT0zKXsKLQkJICBsaW5lID0gc3BsaXRzWzFdOwotCSAgfQotICAgIGlzdHJzdHJlYW0gYnVmZmVyKGxpbmUuY19zdHIoKSk7Ci0gICAgV29yZEluZGV4IHc7ICAvLyB3IGlzIGEgbG9jYWwgdmFyaWFiZSBmb3IgdG9rZW4gaWQKLSAgICBzZW50LmVTZW50LnB1c2hfYmFjaygwKTsgLy8gZWFjaCBzb3VyY2Ugd29yZCBpcyBhc3N1bWVkIHRvIGhhdmUgMCA9PSAKLSAgICAvLyBhIG51bGwgd29yZCAoaWQgMCkgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBzZW50ZW5jZS4gCi0gICAgd2hpbGUoYnVmZmVyPj53KXsgLy8gcmVhZCBzb3VyY2Ugc2VudGVjZSAsIHdvcmQgYnkgd29yZCAuCi0gICAgICBpZiAoc2VudC5lU2VudC5zaXplKCkgPCBNQVhfU0VOVEVOQ0VfTEVOR1RIKQotCXNlbnQuZVNlbnQucHVzaF9iYWNrKHcpOwotICAgICAgZWxzZSB7Ci0JaWYoIFByaW50ZWRUb29Mb25nKys8MTAwKQotCSAgY2VyciA8PCAie1dBUk5JTkc6KGEpdHJ1bmNhdGVkIHNlbnRlbmNlICI8PHBhaXJfbm88PCJ9IjsKLQkvL2NlcnIgPDwgIkVSUk9SOiBnZXRTZW50ZW5jZS5jYzpnZXROZXh0U2VudGVuY2UoKTogc2VudGVuY2UgZXhjZWVkcyBwcmVzZXQgbGVuZ3RoIGxpbWl0IG9mIDogIiA8PCBNQVhfU0VOVEVOQ0VfTEVOR1RIIDw8ICdcbic7Ci0JLy9jZXJyIDw8ICJUaGUgZm9sbG93aW5nIHNlbnRlbmNlIHdpbGwgYmUgdHJ1bmNhdGVkXG4iIDw8IGxpbmU7Ci0JYnJlYWsgOwotICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBmYWlsID0gdHJ1ZSA7Ci0gIH0KLSAgaWYgKHNwbGl0cy5zaXplKCk9PTMgfHxnZXRsaW5lKCppbnB1dEZpbGUsIGxpbmUpKXsKLQkgIGlmKHNwbGl0cy5zaXplKCk9PTMpewotCQkgIGxpbmUgPSBzcGxpdHNbMl07Ci0JICB9Ci0gICAgaXN0cnN0cmVhbSBidWZmZXIobGluZS5jX3N0cigpKTsKLSAgICBXb3JkSW5kZXggdzsgIC8vIHcgaXMgYSBsb2NhbCB2YXJpYWJlIGZvciB0b2tlbiBpZAotICAgIHNlbnQuZlNlbnQucHVzaF9iYWNrKDApOyAvLzAgaXMgaW5zZXJ0ZWQgZm9yIHByb2dyYW0gdW5pZm9ybWl0eQotICAgIHdoaWxlKGJ1ZmZlcj4+dyl7IC8vIHJlYWQgdGFyZ2V0IHNlbnRlY2UgLCB3b3JkIGJ5IHdvcmQgLgotICAgICAgaWYgKHNlbnQuZlNlbnQuc2l6ZSgpIDwgTUFYX1NFTlRFTkNFX0xFTkdUSCkKLQlzZW50LmZTZW50LnB1c2hfYmFjayh3KTsKLSAgICAgIGVsc2UgewotCWlmKCBQcmludGVkVG9vTG9uZysrPDEwMCkKLQkgIGNlcnIgPDwgIntXQVJOSU5HOihiKXRydW5jYXRlZCBzZW50ZW5jZSAiPDxwYWlyX25vPDwifSI7Ci0JLy9jZXJyIDw8ICJFUlJPUjogZ2V0U2VudGVuY2UuY2M6Z2V0TmV4dFNlbnRlbmNlKCk6IHNlbnRlbmNlIGV4Y2VlZHMgcHJlc2V0IGxlbmd0aCBsaW1pdCBvZiA6ICIgPDwgTUFYX1NFTlRFTkNFX0xFTkdUSCA8PCAnXG4nOwotCS8vY2VyciA8PCAiVGhlIGZvbGxvd2luZyBzZW50ZW5jZSB3aWxsIGJlIHRydW5jYXRlZFxuIiA8PCBsaW5lOwotCWJyZWFrIDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZmFpbCA9IHRydWUgOwotICB9Ci0gIGlmIChmYWlsKXsKLSAgICBzZW50LmVTZW50LmNsZWFyKCk7Ci0gICAgc2VudC5mU2VudC5jbGVhcigpOwotICAgIHNlbnQuc2VudGVuY2VObyA9IDAgOwotICAgIHNlbnQubm9PY2MgPSAwIDsKLSAgICBzZW50LnJlYWxDb3VudD0wOwotICAgIHJldHVybihmYWxzZSk7Ci0gIH0gIAotICBpZiggc2VudC5lU2VudC5zaXplKCk9PTF8fHNlbnQuZlNlbnQuc2l6ZSgpPT0xICkKLSAgICBjZXJyIDw8ICJFUlJPUjogRm9yYmlkZGVuIHplcm8gc2VudGVuY2UgbGVuZ3RoICIgPDwgc2VudC5zZW50ZW5jZU5vIDw8IGVuZGw7Ci0gIHNlbnQuc2VudGVuY2VObyA9ICsrcGFpcl9ubzsKLSAgaWYocGFpcl9ubyAlIDEwMDAwMCA9PSAwKSAKLSAgICBjb3V0IDw8ICJbc2VudDoiIDw8IHNlbnQuc2VudGVuY2VObyAgPDwgIl0iPDwgJ1xuJzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWRvdWJsZSBvcHRpbWl6ZV9sYW1iZGEoVmVjdG9yPGRvdWJsZT4mdmQpCi17Ci0gIFZlY3Rvcjxkb3VibGU+IGw7Ci0gIGZvcihkb3VibGUgbGFtYmRhPTEuMDtsYW1iZGE8TWFubGV4TUFYX01VTFRJUExJQ0lUWTtsYW1iZGErPTAuMzMpCi0gICAgewotICAgICAgZG91YmxlIHByb2Q9MC4wOwotICAgICAgZm9yKHVuc2lnbmVkIGludCBpPTA7aTx2ZC5zaXplKCk7KytpKQotCXsKLQkgIHByb2QgKz0gdmRbaV0qZXhwKGxhbWJkYSp2ZFtpXSkvKGV4cChsYW1iZGEqdmRbaV0pLTEuMCk7Ci0JfQotICAgICAgbC5wdXNoX2JhY2soZmFicyhwcm9kLTEuMCkpOwotICAgIH0KLSAgZG91YmxlIGxhbT1kb3VibGUobWluX2VsZW1lbnQobC5iZWdpbigpLGwuZW5kKCkpLWwuYmVnaW4oKSkqMC4zMysxLjA7Ci0gIGlmKCBsYW08MS4wICkKLSAgICB7Ci0gICAgICBjZXJyIDw8ICJFUlJPUjogbGFtYmRhIGlzIHNtYWxsZXIgdGhhbiBvbmU6ICIgPDwgbGFtIDw8IGVuZGw7Ci0gICAgICBmb3IodW5zaWduZWQgaW50IGk9MDtpPHZkLnNpemUoKTsrK2kpCi0JY2VyciA8PCB2ZFtpXSA8PCAnICc7Ci0gICAgICBjZXJyIDw8IGVuZGw7Ci0gICAgfQotICByZXR1cm4gbGFtOwotfQotCi12b2lkIHNlbnRlbmNlSGFuZGxlcjo6c2V0UHJvYk9mU2VudGVuY2UoY29uc3Qgc2VudFBhaXImcyxkb3VibGUgZCkKLXsKLSAgICAKLSAgICBpZiggcmVhbENvdW50PT0wICkKLSAgICAgICAgcmV0dXJuOwotICAgIGVsc2V7Ci0gICAgICAgIHNldHByb2JfbXV0ZXgtPmxvY2soKTsKLSAgICAgICAgaWYoIHMubm9PY2M8PTAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgZWQ9ZXhwKGQpOwotICAgICAgICAgICAgaWYoIG9sZFBhaXJzLnNpemUoKT4wJiYob2xkUGFpcnMuYmFjaygpLmdldF9lU2VudCgpIT1zLmdldF9lU2VudCgpfHxvbGRQYWlycy5iYWNrKCkuZ2V0U2VudGVuY2VObygpPj1zLmdldFNlbnRlbmNlTm8oKSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvdWJsZSBsYW1iZGE9b3B0aW1pemVfbGFtYmRhKG9sZFByb2JzKTsKLSAgICAgICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGk9MDtpPG9sZFBhaXJzLnNpemUoKTsrK2kpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggb2xkUHJvYnNbaV08MWUtNSApCi0gICAgICAgICAgICAgICAgICAgICAgICAoKnJlYWxDb3VudClbb2xkUGFpcnNbaV0uZ2V0U2VudGVuY2VObygpLTFdPTEuMDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgKCpyZWFsQ291bnQpW29sZFBhaXJzW2ldLmdldFNlbnRlbmNlTm8oKS0xXT1sYW1iZGEqb2xkUHJvYnNbaV0vKDEtZXhwKC1sYW1iZGEqb2xkUHJvYnNbaV0pKTsJCSAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2xkUGFpcnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBvbGRQcm9icy5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2xkUGFpcnMucHVzaF9iYWNrKHMpOwotICAgICAgICAgICAgb2xkUHJvYnMucHVzaF9iYWNrKGVkKTsKLSAgICAgICAgfQotICAgICAgICBzZXRwcm9iX211dGV4LT51bmxvY2soKTsKLSAgICB9Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0gRW5kIG9mIE1ldGhvZCBEZWZpbml0aW9uIG9mIENsYXNzIHNlbnRlbmNlSGFuZGxlciAtLS0tLS0tLS0tKi8KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2dldFNlbnRlbmNlLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9nZXRTZW50ZW5jZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2Q0ZTUzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2dldFNlbnRlbmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogTW9kdWxlIDogZ2V0U2VudGVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFByb3RvdHlwZXMgRmlsZTogZ2V0U2VudGVuY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBPYmplY3RpdmU6IERlZmluZXMgY2xhc2VzIGFuZCBtZXRob2RzIGZvciBoYW5kbGluZyBJL08gZm9yIHRoZSBwYXJhbGxlbCAgICoKLSAqICAgICAgICAgICAgY29ycHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotCi0KLSNpZm5kZWYgX3NlbnRlbmNlSGFuZGxlcl9oCi0jZGVmaW5lIF9zZW50ZW5jZUhhbmRsZXJfaCAxCi0KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlICJWZWN0b3IuaCIKLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAidm9jYWIuaCIKLSNpbmNsdWRlICJHbG9iYWxzLmgiCi0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL211dGV4LmhwcD4KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgUHJvdG90eXBlIERlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotIENsYXNzIE5hbWU6IHNlbnRlbmNlSGFuZGxlZXIgCi0gT2JqZWN0aXZlOiBUaGlzIGNsYXNzIGlzIGRlZmluZWQgdG8gaGFuZGxlIHRyYWluaW5nIHNlbnRlY2UgcGFpcnMgZnJvbSB0aGUgCi0gcGFyYWxsZWwgY29ycHVzLiBFYWNoIHBhaXIgaGFzOiBhIHRhcmdldCBzZW50ZWNlLCBjYWxsZWQgaGVyZSBGcmVuY2g7IGEgCi0gc291cmNlIHNlbnRlY2UsIGNhbGxlZCBoZXJlIEVuZ2xpc2ggc2VudGVjZTsgYW5kIGFuIGludGVnZXIgbnVtYmVyIGRlbm90aW5nCi0gdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIHBhaXIgb2NjdXJlZCBpbiB0cmluaW5nIGNvcnB1cy4gQm90aCBzb3VyY2UgYW5kIAotIHRhcmdldCBzZW50ZWNlcyBhcmUgcmVwcmVzZW50ZWQgYXMgaW50ZWdlciB2ZWN0b3IgKHZhcmlhYmxlIHNpemUgYXJyYXlzKSwgCi0gZWFjaCBlbnRyeSBpcyBhIG51bWVyaWMgdmFsdWUgd2hpY2ggaXMgdGhlIHRva2VuIGlkIGZvciB0aGUgcGFydGljdWxhciB0b2tlbgotIGluIHRoZSBzZW50ZWNlLgotCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWNsYXNzIHNlbnRQYWlyewotIHB1YmxpYzoKLSAgaW50IHNlbnRlbmNlTm8gOwotICBmbG9hdCBub09jYzsKLSAgZmxvYXQgcmVhbENvdW50OwotICBWZWN0b3I8V29yZEluZGV4PiBlU2VudCA7Ci0gIFZlY3RvcjxXb3JkSW5kZXg+IGZTZW50OwotCi0gcHVibGljOgotICBzZW50UGFpcigpe307Ci0gIHZvaWQgY2xlYXIoKXsgZVNlbnQuY2xlYXIoKTsgZlNlbnQuY2xlYXIoKTsgbm9PY2M9MDsgcmVhbENvdW50PTA7IHNlbnRlbmNlTm89MDt9OwotICBjb25zdCBWZWN0b3I8V29yZEluZGV4PiZnZXRfZVNlbnQoKWNvbnN0Ci0gICAgeyByZXR1cm4gZVNlbnQ7IH0KLSAgY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mZ2V0X2ZTZW50KCljb25zdAotICAgIHsgcmV0dXJuIGZTZW50OyB9Ci0gIGludCBnZXRTZW50ZW5jZU5vKCljb25zdAotICAgIHsgcmV0dXJuIHNlbnRlbmNlTm87IH0KLSAgZG91YmxlIGdldENvdW50KCljb25zdAotICAgIHsgcmV0dXJuIHJlYWxDb3VudDsgfQotICAgIAotfTsKLQotaW5saW5lIG9zdHJlYW0mb3BlcmF0b3I8PChvc3RyZWFtJm9mLGNvbnN0IHNlbnRQYWlyJnMpCi17Ci0gIG9mIDw8ICJTZW50IE5vOiAiIDw8IHMuc2VudGVuY2VObyA8PCAiICwgTm8uIE9jY3VycmVuY2VzOiAiIDw8IHMubm9PY2MgPDwgJ1xuJzsKLSAgaWYoIHMubm9PY2MhPXMucmVhbENvdW50ICkKLSAgICBvZiA8PCAiIFVzZWQgTm8uIE9jY3VycmVuY2VzOiAiIDw8IHMucmVhbENvdW50IDw8ICdcbic7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmb3IoaT0wOyBpIDwgcy5lU2VudC5zaXplKCk7IGkrKykKLSAgICBvZiA8PCBzLmVTZW50W2ldIDw8ICcgJzsKLSAgb2YgPDwgICdcbic7Ci0gIGZvcihpPTE7IGkgPCBzLmZTZW50LnNpemUoKTsgaSsrKQotICAgIG9mIDw8IHMuZlNlbnRbaV0gPDwgJyAnOwotICBvZiA8PCAnXG4nOwotICByZXR1cm4gb2Y7Ci19Ci0KLS8qVGhyZWFkLXNhZmUgdmVyc2lvbiBvZiBzZW50ZW5jZSBoYW5kbGVyKi8KLWNsYXNzIHNlbnRlbmNlSGFuZGxlcnsKLXB1YmxpYzoKLSAgICBjb25zdCBjaGFyICogaW5wdXRGaWxlbmFtZTsgICAvLyBwYXJhbGxlbCBjb3JwdXMgZmlsZSBuYW1lLCBzaW1pbGFyIGZvciBhbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VudGVuY2UgcGFpciBvYmplY3RzCi0gICAgaWZzdHJlYW0gKmlucHV0RmlsZTsgICAgIC8vIHBhcmFsbGVsIGNvcnB1cyBmaWxlIGhhbmRsZXIKLSAgICBWZWN0b3I8c2VudFBhaXI+IEJ1ZmZlcjsKLSAgICBpbnQgbm9TZW50SW5CdWZmZXIgOwotICAgIGludCBjdXJyZW50U2VudGVuY2UgOwotICAgIGludCBwb3NpdGlvbjsgLypTZW50ZW5jZSBwb3NpdGlvbiAod2lsbCBiZSByZXR1cm5lZCkqLwotICAgIGludCB0b3RhbFBhaXJzMSA7Ci0gICAgZG91YmxlIHRvdGFsUGFpcnMyOwotICAgIGJvb2wgcmVhZGZsYWcgOyAvLyB0cnVlIGlmIHlvdSByZWFjaCB0aGUgZW5kIG9mIGZpbGUKLSAgICBib29sIGFsbEluTWVtb3J5IDsKLSAgICBpbnQgcGFpcl9ubyA7Ci0gICAgVmVjdG9yPGRvdWJsZT4gKnJlYWxDb3VudDsKLSAgCi0gICAgVmVjdG9yPHNlbnRQYWlyPiBvbGRQYWlyczsKLSAgICBWZWN0b3I8ZG91YmxlPiBvbGRQcm9iczsKLQlzZW50ZW5jZUhhbmRsZXIoKXtyZWFkc2VudF9tdXRleD1uZXcgYm9vc3Q6Om11dGV4KCk7c2V0cHJvYl9tdXRleD1uZXcgYm9vc3Q6Om11dGV4KCk7fTsKLSAgICBzZW50ZW5jZUhhbmRsZXIoY29uc3QgY2hhciogZmlsZW5hbWUsIHZjYkxpc3QqIGVsaXN0PTAsIHZjYkxpc3QqIGZsaXN0PTApOwotICAgIHNlbnRlbmNlSGFuZGxlcihjb25zdCBjaGFyKiBmaWxlbmFtZSwgdmNiTGlzdCogZWxpc3QsIHZjYkxpc3QqIGZsaXN0LHNldDxXb3JkSW5kZXg+JiBlYXBwLCBzZXQ8V29yZEluZGV4PiYgZmFwcCk7Ci0JfnNlbnRlbmNlSGFuZGxlcigpe2RlbGV0ZSByZWFkc2VudF9tdXRleDsgZGVsZXRlIHNldHByb2JfbXV0ZXg7fQotICAgIHZvaWQgcmV3aW5kKCk7Ci0gICAgaW50IGdldE5leHRTZW50ZW5jZShzZW50UGFpciYsIHZjYkxpc3QqID0gMCwgdmNiTGlzdCogPSAwKTsgIC8vIHdpbGwgYmUgZGVmaW5lZCBpbiB0aGUgZGVmaW5pdGlvbiBmaWxlLCB0aGlzCi0gICAgaW50IGdldFRvdGFsTm9QYWlyczEoKWNvbnN0IHtyZXR1cm4gdG90YWxQYWlyczE7fTsKLSAgICBkb3VibGUgZ2V0VG90YWxOb1BhaXJzMigpY29uc3Qge3JldHVybiB0b3RhbFBhaXJzMjt9OwotICAgIC8vIG1ldGhvZCB3aWxsIHJlYWQgdGhlIG5leHQgcGFpciBvZiBzZW50ZW5jZSBmcm9tIG1lbW9yeSBidWZmZXIKLSAgICB2b2lkIHNldFByb2JPZlNlbnRlbmNlKGNvbnN0IHNlbnRQYWlyJnMsZG91YmxlIGQpOwotcHJpdmF0ZTogICAgCi0JCi0gICAgYm9vc3Q6Om11dGV4KiByZWFkc2VudF9tdXRleDsgCi0gICAgYm9vc3Q6Om11dGV4KiBzZXRwcm9iX211dGV4OwotICAgIGJvb2wgcmVhZE5leHRTZW50ZW5jZShzZW50UGFpciYpOyAgLy8gd2lsbCBiZSBkZWZpbmVkIGluIHRoZSBkZWZpbml0aW9uIGZpbGUsIHRoaXMKLX07Ci0KLSNlbmRpZgotICAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2htbS5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9obW0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjEwNGEzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2htbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI1ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdJWkErKyAoIGV4dGVuc2lvbiBvZiBHSVpBICkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpbmNsdWRlICJobW0uaCIgCi0jaW5jbHVkZSAiR2xvYmFscy5oIgotI2luY2x1ZGUgInV0aWxpdHkuaCIKLSNpbmNsdWRlICJITU1UYWJsZXMuaCIgCi0jaW5jbHVkZSAiRm9yd2FyZEJhY2t3YXJkLmgiCi0jaW5jbHVkZSAiUGFyYW1ldGVyLmgiCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAic3luY09iai5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLSNkZWZpbmUgQ0xBU1NJRlkoaSxlbXB0eSxpYW5mKSBib29sIGVtcHR5PShpPj1sKTsgdW5zaWduZWQgaW50IGlhbmY9KGklbCk7Ci0jZGVmaW5lIENMQVNTSUZZMihpLGlhbmYpIHVuc2lnbmVkIGludCBpYW5mPShpJWwpOwotCi0KLXNob3J0IFByZWRpY3Rpb25JbkFsaWdubWVudHM9MDsKLXNob3J0IFVuaWZvcm1FbnRyeUV4aXQ9MzsKLXNob3J0IEhNTVRyYWluaW5nU3BlY2lhbEZsYWdzPTA7Ci0KLUdMT0JBTF9QQVJBTUVURVIyKGludCxNb2RlbEhfRHVtcF9GcmVxLAotICAgICAgICAgICAgICAgICJITU0gRFVNUCBGUkVRVUVOQ1kiLCJ0aCIsCi0gICAgICAgICAgICAgICAgImR1bXAgZnJlcXVlbmN5IG9mIEhNTSIsCi0gICAgICAgICAgICAgICAgUEFSTEVWX09VVFBVVCwwKTsKLQotR0xPQkFMX1BBUkFNRVRFUihzaG9ydCxDb21wYXJlQWxEZXBzLCJlbUFsaWdubWVudERlcGVuZGVuY2llcyIsCi0JCSAibGV4dHJhaW46IGRlcGVuZGVuY2llcyBpbiB0aGUgSE1NIGFsaWdubWVudCBtb2RlbC4gIgotCQkgIiAmMTogc2VudGVuY2UgbGVuZ3RoOyAmMjogcHJldmlvdXMgY2xhc3M7ICY0OiBwcmV2aW91cyBwb3NpdGlvbjsgIgotCQkgIiAmODogRnJlbmNoIHBvc2l0aW9uOyAmMTY6IEZyZW5jaCBjbGFzcyIKLQkJICxQQVJMRVZfTU9ERUxTLDIpOwotCi1HTE9CQUxfUEFSQU1FVEVSKGRvdWJsZSxHTE9CQUxQcm9iYWJpbGl0eUZvckVtcHR5LAotICAgICAgICAgICAgICAgICJlbVByb2JGb3JFbXB0eSIsImYtYi10cm46IHByb2JhYmlsaXR5IGZvciBlbXB0eSB3b3JkIiwKLSAgICAgICAgICAgICAgICBQQVJMRVZfTU9ERUxTLDAuNCk7Ci0KLUdMT0JBTF9QQVJBTUVURVIoc2hvcnQsU21vb3RoSE1NLCJlbVNtb290aEhNTSIsCi0JCSJmLWItdHJuOiBzbW9vdGggSE1NIG1vZGVsICYxOiBtb2RpZmllZCBjb3VudHM7ICYyOnBlcmZvcm0gc21vb3RoaW5nIHdpdGggLWVtQWxTbW9vdGgiLAotICAgICAgICBQQVJMRVZfU1BFQ0lBTCwyKTsKLQotR0xPQkFMX1BBUkFNRVRFUihkb3VibGUsSE1NQWxpZ25tZW50TW9kZWxTbW9vdGhGYWN0b3IsImVtQWxTbW9vdGgiLAotICAgICAgICAiZi1iLXRybjogc21vb3RoaW5nIGZhY3RvciBmb3IgSE1NIGFsaWdubWVudCBtb2RlbCAoY2FuIGJlIGlnbm9yZWQgYnkgLWVtU21vb3RoSE1NKSIsCi0gICAgICAgIFBBUkxFVl9TTU9PVEgsMC4yKTsKLQotCi0vKnRlbXBsYXRlPGNsYXNzIFQ+Ci12b2lkIHNtb290aF9zdGFuZGFyZChUKmEsVCpiLGRvdWJsZSBwKQotewotICBpbnQgbj1iLWE7Ci0gIGlmKCBuPT0wICkgCi0gICAgcmV0dXJuOwotICBkb3VibGUgcHA9cC9uOwotICBmb3IoVCppPWE7aSE9YjsrK2kpCi0gICAgKmkgPSAoMS4wLXApKigqaSkrcHA7Ci19Ki8KLQotCi1obW06OmhtbShtb2RlbDImbTIsV29yZENsYXNzZXMgJmUsIFdvcmRDbGFzc2VzJiBmKQotOiAgIGV3b3JkY2xhc3NlcyhlKSwgZndvcmRjbGFzc2VzKGYpLG1vZGVsMihtMiksY291bnRzKEdMT0JBTFByb2JhYmlsaXR5Rm9yRW1wdHksZXdvcmRjbGFzc2VzLGZ3b3JkY2xhc3NlcyksCi1wcm9icyhHTE9CQUxQcm9iYWJpbGl0eUZvckVtcHR5LGV3b3JkY2xhc3Nlcyxmd29yZGNsYXNzZXMpCi17ICAKLX0KLQotCi12b2lkIGhtbTo6aW5pdGlhbGl6ZV90YWJsZV91bmlmb3JtbHkoc2VudGVuY2VIYW5kbGVyJil7fQotCi1zdHJ1Y3QgaG1tX2VtX2xvb3BfdHsKLSAgICBobW0gKm07Ci0gICAgaW50IGRvbmU7Ci0gICAgaW50IHZhbGlkOwotICAgIHN0cmluZyBhbGlnbmZpbGU7Ci0gICAgaW50IGl0OwotICAgIGJvb2wgZHVtcF9maWxlczsKLQlib29sIHJlc3VtZTsKLSAgICBwdGhyZWFkX3QgdGhyZWFkOwotICAgIGhtbV9lbV9sb29wX3QoKTptKDApLGRvbmUoMCksdmFsaWQoMCl7fTsKLX07Ci0gICAgCi12b2lkKiBobW1fZXhlX2VtbG9vcCh2b2lkICphcmcpewotCWhtbV9lbV9sb29wX3QqIGVtID0oaG1tX2VtX2xvb3BfdCAqKSBhcmc7Ci0gICAgZW0tPm0tPmVtX3RocmVhZChlbS0+aXQsZW0tPmFsaWduZmlsZSxlbS0+ZHVtcF9maWxlcyxlbS0+cmVzdW1lKTsKLSAgICBlbS0+ZG9uZSA9IC0xOyAKLSAgICByZXR1cm4gYXJnOwotfSAKLQotdm9pZCBobW06OmVtX3RocmVhZChpbnQgaXQsc3RyaW5nIGFsaWduZmlsZSxib29sIGR1bXBfZmlsZXMsYm9vbCByZXN1bWUpewotCWVtX2xvb3AocGVycCwgc0hhbmRsZXIxLCAgZHVtcF9maWxlcyAsIGFsaWduZmlsZS5jX3N0cigpLCB0cmFpblZpdGVyYmlQZXJwLCBmYWxzZSxpdD09MSAmJiAoIXJlc3VtZSksaXQpOwotfQotZXh0ZXJuIHNob3J0IE5DUFVTOwotaW50IGhtbTo6ZW1fd2l0aF90cmlja3MoaW50IG5vSXRlcmF0aW9ucyxib29sIGR1bXBDb3VudCwgCi0JICAgIGNvbnN0IGNoYXIqIGR1bXBDb3VudE5hbWUsIGJvb2wgdXNlU3RyaW5nICxib29sIHJlc3VtZSl7Ci0gICAgZG91YmxlIG1pbkVycm9ycz0xLjA7aW50IG1pbkl0ZXI9MDsKLSAgICBzdHJpbmcgbW9kZWxOYW1lPSJIbW0iLHNob3J0TW9kZWxOYW1lPSJobW0iOwotICAgIGludCBkdW1wRnJlcT1Nb2RlbEhfRHVtcF9GcmVxOwotICAgIHRpbWVfdCBpdF9zdCwgc3QsIGl0X2ZuLCBmbjsKLSAgICBzdHJpbmcgdGZpbGUsIGFmaWxlLGFmaWxlaCwgbnVtYmVyLCBhbGlnbmZpbGUsIHRlc3RfYWxpZ25maWxlOwotICAgIGludCBwYWlyX25vID0gMDsKLSAgICBib29sIGR1bXBfZmlsZXMgPSBmYWxzZSA7Ci0gICAgb2ZzdHJlYW0gb2YyIDsKLSAgICBzdCA9IHRpbWUoTlVMTCkgOwotICAgIHNIYW5kbGVyMS5yZXdpbmQoKTsKLSAgICBjb3V0IDw8ICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7Ci0gICAgY291dCA8PCBtb2RlbE5hbWUgPDwgIiBUcmFpbmluZyBTdGFydGVkIGF0OiAiIDw8IG15X2N0aW1lKCZzdCk7Ci0gICAgdmVjdG9yPGhtbV9lbV9sb29wX3Q+IHRoOwotICAgIHRoLnJlc2l6ZShOQ1BVUyk7Ci0gICAgZm9yKGludCBpdD0xOyBpdCA8PSBub0l0ZXJhdGlvbnMgOyBpdCsrKXsKLSAgICAgICAgcGFpcl9ubyA9IDA7Ci0gICAgICAgIGl0X3N0ID0gdGltZShOVUxMKSA7Ci0gICAgICAgIGNvdXQgPDwgZW5kbCA8PCAiLS0tLS0tLS0tLS1cbiIgPDwgbW9kZWxOYW1lIDw8ICI6IEl0ZXJhdGlvbiAiIDw8IGl0IDw8ICdcbic7Ci0gICAgICAgIGR1bXBfZmlsZXMgPSAoZHVtcEZyZXEgIT0gMCkgJiYgKChpdCAlIGR1bXBGcmVxKSA9PSAwIHx8IGl0ID09IG5vSXRlcmF0aW9ucykgJiYgIU5PRFVNUFM7Ci0KLQkJY2VyciA8PCAiRHVtcCBmaWxlcyAiIDw8IGR1bXBfZmlsZXMgPDwgIiBpdCAiIDw8IGl0IDw8ICIgbm9JdGVyYXRpb25zICIgPDwgbm9JdGVyYXRpb25zIDw8ICIgZHVtcEZyZXEgIiA8PCBkdW1wRnJlcSA8PGVuZGw7Ci0gICAgICAgIC8vZHVtcF9maWxlcyA9IHRydWU7Ci0gICAgICAgIG51bWJlciA9ICIiOwotICAgICAgICBpbnQgbiA9IGl0OwotICAgICAgICBkb3sKLSAgICAgICAgICAgIG51bWJlci5pbnNlcnQoKHNpemVfdCkwLCAxLCAoY2hhcikobiAlIDEwICsgJzAnKSk7Ci0gICAgICAgIH0gd2hpbGUoKG4gLz0gMTApID4gMCk7Ci0gICAgICAgIHRmaWxlID0gUHJlZml4ICsgIi50IiArIHNob3J0TW9kZWxOYW1lICsgIi4iICsgbnVtYmVyIDsKLSAgICAgICAgYWZpbGUgPSBQcmVmaXggKyAiLmEiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgICAgIC8vIGFjZmlsZSA9IFByZWZpeCArICIuYWMiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgICAgICBhZmlsZWggPSBQcmVmaXggKyAiLmgiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgICAgICBhbGlnbmZpbGUgPSBQcmVmaXggKyAiLkEiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgICAgICB0ZXN0X2FsaWduZmlsZSA9IFByZWZpeCArICIudHN0LkEiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgICAgICBjb3VudHM9SE1NVGFibGVzPGludCxXb3JkQ2xhc3Nlcz4oR0xPQkFMUHJvYmFiaWxpdHlGb3JFbXB0eSxld29yZGNsYXNzZXMsZndvcmRjbGFzc2VzKTsKLSAgICAgICAgYUNvdW50VGFibGUuY2xlYXIoKTsKLSAgICAgICAgaW5pdEFMKCk7Ci0gICAgICAgIHNIYW5kbGVyMS5yZXdpbmQoKTsKLSAgICAgICAgaW50IGs7Ci0gICAgICAgIGNoYXIgbm9kZVsyXSA7Ci0gICAgICAgIG5vZGVbMV0gPSAnXDAnOwotICAgICAgICBmb3IgKGs9MSA7IGs8IE5DUFVTIDsgaysrKXsKLSAgICAgICAgCXRoW2tdLm0gPSB0aGlzOwotICAgICAgICAJdGhba10uZG9uZSA9IDA7Ci0gICAgICAgIAl0aFtrXS52YWxpZCA9IDA7Ci0gICAgICAgIAl0aFtrXS5pdCA9IGl0OwotCQkJdGhba10ucmVzdW1lID0gcmVzdW1lOwotICAgICAgICAJdGhba10uYWxpZ25maWxlID0gYWxpZ25maWxlICsgIi5wYXJ0IjsKLSAgICAgICAgCW5vZGVbMF0gPSAnMCcgKyBrOwotICAgICAgICAJdGhba10uYWxpZ25maWxlICs9IG5vZGU7Ci0gICAgICAgIAl0aFtrXS5kdW1wX2ZpbGVzID0gZHVtcF9maWxlczsKLSAgICAgICAgICAgIHRoW2tdLnZhbGlkID0gcHRocmVhZF9jcmVhdGUoJih0aFtrXS50aHJlYWQpLE5VTEwsaG1tX2V4ZV9lbWxvb3AsJih0aFtrXSkpOwotICAgICAgICAgICAgaWYodGhba10udmFsaWQpewotICAgICAgICAgICAgICAgIGNlcnIgPDwgIkVycm9yIHN0YXJ0aW5nIHRocmVhZCAiIDw8IGsgPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub2RlWzBdID0gJzAnOwotICAgICAgICBhbGlnbmZpbGUgKz0gIi5wYXJ0IjsKLSAgICAgICAgYWxpZ25maWxlICs9IG5vZGU7Ci0gICAgICAgIGVtX2xvb3AocGVycCwgc0hhbmRsZXIxLCAgZHVtcF9maWxlcyAsIGFsaWduZmlsZS5jX3N0cigpLCB0cmFpblZpdGVyYmlQZXJwLCBmYWxzZSxpdD09MSAmJiAoIXJlc3VtZSksaXQpOwotICAgICAgICBmb3IgKGs9MTtrPE5DUFVTO2srKyl7Ci0gICAgICAgICAgICBwdGhyZWFkX2pvaW4oKHRoW2tdLnRocmVhZCksTlVMTCk7Ci0gICAgICAgICAgICBjZXJyIDw8ICJUaHJlYWQgIiA8PCBrIDw8ICJkb25lIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIHBlcnAucmVjb3JkKCJITU0iKTsKLSAgICAgICAgdHJhaW5WaXRlcmJpUGVycC5yZWNvcmQoIkhNTSIpOwotICAgICAgICBlcnJvclJlcG9ydEFMKGNvdXQsIkhNTSIpOwotICAgICAgICAKLSAgICAgICAgc0hhbmRsZXIxLnJld2luZCgpOwotICAgICAgICBpZiggZXJyb3JzQUwoKTxtaW5FcnJvcnMgKXsKLSAgICAgICAgICAgIG1pbkVycm9ycz1lcnJvcnNBTCgpOwotICAgICAgICAgICAgbWluSXRlcj1pdDsKLSAgICAgICAgfQotICAgICAgICBpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpewotICAgICAgICAJdGVzdEhhbmRsZXItPnJld2luZCgpOwotICAgICAgICAgICAgZW1fbG9vcCgqdGVzdFBlcnAsICp0ZXN0SGFuZGxlciwgZHVtcF9maWxlcywgdGVzdF9hbGlnbmZpbGUuY19zdHIoKSwgKnRlc3RWaXRlcmJpUGVycCwgIHRydWUsaXQ9PTEgJiYgKCFyZXN1bWUpLGl0KTsKLSAgICAgICAgICAgIHRlc3RIYW5kbGVyLT5yZXdpbmQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHVtcF9maWxlcyYmT3V0cHV0SW5BYWNoZW5Gb3JtYXQ9PTEpCi0gICAgICAgICAgICB0VGFibGUucHJpbnRDb3VudFRhYmxlKHRmaWxlLmNfc3RyKCksRWxpc3QuZ2V0Vm9jYWJMaXN0KCksRmxpc3QuZ2V0Vm9jYWJMaXN0KCksMSk7Ci0KLQkJaWYoZHVtcENvdW50ICYmIGl0ID09IG5vSXRlcmF0aW9ucyl7Ci0JCQlzdHJpbmcgcmVhbFRhYmxlTmFtZSA9IGR1bXBDb3VudE5hbWU7Ci0JCQlyZWFsVGFibGVOYW1lICs9ICIudC5jb3VudCI7Ci0JCQl0VGFibGUucHJpbnRDb3VudFRhYmxlKHJlYWxUYWJsZU5hbWUuY19zdHIoKSxFbGlzdC5nZXRWb2NhYkxpc3QoKSxGbGlzdC5nZXRWb2NhYkxpc3QoKSx1c2VTdHJpbmcpOwotCQkJc3RyaW5nIHJlYWxBVGFibGVOYW1lID0gZHVtcENvdW50TmFtZTsKLQkJCXJlYWxBVGFibGVOYW1lICs9ICIuYS5jb3VudCI7Ci0JCQlhQ291bnRUYWJsZS5wcmludFJlYWxUYWJsZShyZWFsQVRhYmxlTmFtZS5jX3N0cigpKTsKLQkJCXN0cmluZyByZWFsSFRhYmxlTmFtZSA9IGR1bXBDb3VudE5hbWU7Ci0JCQlyZWFsSFRhYmxlTmFtZSArPSAiLmguY291bnQiOwotCQkJc3RyaW5nIGZuYW1lYWxwaGEgPSByZWFsSFRhYmxlTmFtZTsKLQkJCXN0cmluZyBmbmFtZWJldGEgPSByZWFsSFRhYmxlTmFtZTsKLQkJCWZuYW1lYWxwaGEgKz0gIi5hbHBoYSI7Ci0JCQlmbmFtZWJldGEgKz0gIi5iZXRhIjsKLQkJCWNvdW50cy53cml0ZUp1bXBzKHJlYWxIVGFibGVOYW1lLmNfc3RyKCksTlVMTCxmbmFtZWFscGhhLmNfc3RyKCksZm5hbWViZXRhLmNfc3RyKCkpOyAgICAgIAotCi0JCX0KLSAgICAgICAgdFRhYmxlLm5vcm1hbGl6ZVRhYmxlKEVsaXN0LCBGbGlzdCk7Ci0gICAgICAgIGFDb3VudFRhYmxlLm5vcm1hbGl6ZShhVGFibGUpOwotICAgICAgICBwcm9icz1jb3VudHM7Ci0gICAgICAgIGNvdXQgPDwgbW9kZWxOYW1lIDw8ICI6ICgiPDxpdDw8IikgVFJBSU4gQ1JPU1MtRU5UUk9QWSAiIDw8IHBlcnAuY3Jvc3NfZW50cm9weSgpCi0gICAgICAgICAgICA8PCAiIFBFUlBMRVhJVFkgIiA8PCBwZXJwLnBlcnBsZXhpdHkoKSA8PCAnXG4nOwotICAgICAgICBpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpCi0gICAgICAgICAgICBjb3V0IDw8IG1vZGVsTmFtZSA8PCAiOiAoIjw8aXQ8PCIpIFRFU1QgQ1JPU1MtRU5UUk9QWSAiIDw8ICgqdGVzdFBlcnApLmNyb3NzX2VudHJvcHkoKQotICAgICAgICAgICAgPDwgIiBQRVJQTEVYSVRZICIgPDwgKCp0ZXN0UGVycCkucGVycGxleGl0eSgpIAotICAgICAgICAgICAgPDwgJ1xuJzsKLSAgICAgICAgY291dCA8PCBtb2RlbE5hbWUgPDwgIjogKCI8PGl0PDwiKSBWSVRFUkJJIFRSQUlOIENST1NTLUVOVFJPUFkgIiA8PCB0cmFpblZpdGVyYmlQZXJwLmNyb3NzX2VudHJvcHkoKQotICAgICAgICAgICAgPDwgIiBQRVJQTEVYSVRZICIgPDwgdHJhaW5WaXRlcmJpUGVycC5wZXJwbGV4aXR5KCkgPDwgJ1xuJzsKLSAgICAgICAgaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotICAgICAgICAgICAgY291dCA8PCBtb2RlbE5hbWUgPDwgIjogKCI8PGl0PDwiKSBWSVRFUkJJIFRFU1QgQ1JPU1MtRU5UUk9QWSAiIDw8IHRlc3RWaXRlcmJpUGVycC0+Y3Jvc3NfZW50cm9weSgpCi0gICAgICAgICAgICA8PCAiIFBFUlBMRVhJVFkgIiA8PCB0ZXN0Vml0ZXJiaVBlcnAtPnBlcnBsZXhpdHkoKSAKLSAgICAgICAgICAgIDw8ICdcbic7Ci0gICAgICAgIGlmIChkdW1wX2ZpbGVzKXsKLSAgICAgICAgICAgIGlmKCBPdXRwdXRJbkFhY2hlbkZvcm1hdD09MCkKLSAgICAgICAgICAgICAgICB0VGFibGUucHJpbnRQcm9iVGFibGUodGZpbGUuY19zdHIoKSxFbGlzdC5nZXRWb2NhYkxpc3QoKSxGbGlzdC5nZXRWb2NhYkxpc3QoKSxPdXRwdXRJbkFhY2hlbkZvcm1hdCk7Ci0gICAgICAgICAgIC8vIG9mc3RyZWFtIGFmaWxlc3RyZWFtKGFmaWxlaC5jX3N0cigpKTsgICAgCi0JCQlzdHJpbmcgZm5hbWVhbHBoYSA9IGFmaWxlaDsKLQkJCXN0cmluZyBmbmFtZWJldGEgPSBhZmlsZWg7Ci0JCQlmbmFtZWFscGhhICs9ICIuYWxwaGEiOwotCQkJZm5hbWViZXRhICs9ICIuYmV0YSI7Ci0gICAgICAgICAgICBwcm9icy53cml0ZUp1bXBzKGFmaWxlaC5jX3N0cigpLE5VTEwsZm5hbWVhbHBoYS5jX3N0cigpLGZuYW1lYmV0YS5jX3N0cigpKTsKLS8vICAgICAgICAgICAgYUNvdW50VGFibGUucHJpbnRUYWJsZShhY2ZpbGUuY19zdHIoKSk7Ci0gICAgICAgICAgICBhVGFibGUucHJpbnRUYWJsZShhZmlsZS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICBpdF9mbiA9IHRpbWUoTlVMTCkgOwotICAgICAgICBjb3V0IDw8ICJcbiIgPDwgbW9kZWxOYW1lIDw8ICIgSXRlcmF0aW9uOiAiIDw8IGl0PDwgIiB0b29rOiAiIDw8Ci0gICAgICAgICAgICBkaWZmdGltZShpdF9mbiwgaXRfc3QpIDw8ICIgc2Vjb25kc1xuIjsKLSAgICB9IC8vIGVuZCBvZiBpdGVyYXRpb25zIAotICAgIGZuID0gdGltZShOVUxMKSA7Ci0gICAgY291dCA8PCBlbmRsIDw8ICJFbnRpcmUgIiA8PCBtb2RlbE5hbWUgPDwgIiBUcmFpbmluZyB0b29rOiAiIDw8IGRpZmZ0aW1lKGZuLCBzdCkgPDwgIiBzZWNvbmRzXG4iOwotICAgIC8vY291dCA8PCAidFRhYmxlIGNvbnRhaW5zICIgPDwgdFRhYmxlLmdldEhhc2goKS5idWNrZXRfY291bnQoKSAKLSAgICAvLyAgICAgPDwgIiBidWNrZXRzIGFuZCAgIiA8PCB0VGFibGUuZ2V0SGFzaCgpLnNpemUoKSA8PCAiIGVudHJpZXMuIiA7Ci0gICAgY291dCA8PCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKLSAgICByZXR1cm4gbWluSXRlcjsKLX0KLQotLyp0ZW1wbGF0ZTxjbGFzcyBUPgotVCBub3JtYWxpemVfaWZfcG9zc2libGVfd2l0aF9pbmNyZW1lbnQoVCphLFQqYixpbnQgaW5jcmVtZW50KQotewotICBUIHN1bT0wOwotICBmb3IoVCppPWE7aSE9YjtpKz1pbmNyZW1lbnQpCi0gICAgc3VtKz0qaTsKLSAgaWYoIHN1bSApCi0gICAgZm9yKFQqaT1hO2khPWI7aSs9aW5jcmVtZW50KQotICAgICAgKmkvPXN1bTsKLSAgZWxzZQotICAgIHsKLSAgICAgIFQgZmFjdG9yPWluY3JlbWVudC8oYi1hKTsKLSAgICAgIGZvcihUKmk9YTtpIT1iO2krPWluY3JlbWVudCkKLQkqaT1mYWN0b3I7Ci0gICAgfQotICByZXR1cm4gc3VtOwotfSovCi0KLXZvaWQgaG1tOjpsb2FkX3RhYmxlKGNvbnN0IGNoYXIqIGFuYW1lKXsKLSAgICBjb3V0IDw8ICJIbW06IGxvYWRpbmcgYSB0YWJsZSBub3QgaW1wbGVtZW50ZWQuXG4iOwotICAgIGFib3J0KCk7Ci0gICAgaWZzdHJlYW0gYW5hbWVmaWxlKGFuYW1lKTsKLSAgICBwcm9icy5yZWFkSnVtcHMoYW5hbWVmaWxlKTsKLX0KLQotSE1NTmV0d29yayAqaG1tOjptYWtlSE1NTmV0d29yayhjb25zdCBWZWN0b3I8V29yZEluZGV4PiYgZXMsY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mZnMsYm9vbCBkb0luaXQpY29uc3QKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSxqOwotICAgIHVuc2lnbmVkIGludCBsID0gZXMuc2l6ZSgpIC0gMTsKLSAgICB1bnNpZ25lZCBpbnQgbSA9IGZzLnNpemUoKSAtIDE7Ci0gICAgdW5zaWduZWQgaW50IEk9MipsLEo9bTsKLSAgICBpbnQgSUo9SSpKOwotICAgIGJvb2wgRGVwZW5kZW5jeU9mSj0oQ29tcGFyZUFsRGVwcyYoMTZ8OCkpfHwoUHJlZGljdGlvbkluQWxpZ25tZW50cz09Mik7Ci0gICAgYm9vbCBEZXBlbmRlbmN5T2ZQcmV2QUo9KENvbXBhcmVBbERlcHMmKDJ8NCkpfHwoUHJlZGljdGlvbkluQWxpZ25tZW50cz09MCk7Ci0gICAgSE1NTmV0d29yayAqbmV0ID0gbmV3IEhNTU5ldHdvcmsoSSxKKTsKLSAgICBmaWxsKG5ldC0+YWxwaGFpbml0LmJlZ2luKCksbmV0LT5hbHBoYWluaXQuZW5kKCksMC4wKTsKLSAgICBmaWxsKG5ldC0+YmV0YWluaXQuYmVnaW4oKSxuZXQtPmJldGFpbml0LmVuZCgpLDAuMCk7Ci0gICAgZm9yKGo9MTtqPD1tO2orKyl7Ci0gICAgICAgIGZvcihpPTE7aTw9bDtpKyspewotICAgICAgICAgICAvLyBjb3V0IDw8IGVzW2ldIDw8IiAiIDw8IGZzW2pdIDw8IiAiIDw8IHRUYWJsZS5nZXRQcm9iKGVzW2ldLCBmc1tqXSkgPDwgZW5kbDsKLSAgICAgICAgICAgIG5ldC0+bihpLTEsai0xKT10VGFibGUuZ2V0UHJvYihlc1tpXSwgZnNbal0pIDsKLSAgICAgICAgfQotICAgICAgICBkb3VibGUgZW1wdHlDb250cmlidXRpb249MDsgIAotICAgICAgICBlbXB0eUNvbnRyaWJ1dGlvbj10VGFibGUuZ2V0UHJvYihlc1swXSxmc1tqXSkgOwotICAgICAgICBmb3IoaT0xO2k8PWw7aSsrKQotICAgICAgICAgICAgbmV0LT5uKGkrbC0xLGotMSk9ZW1wdHlDb250cmlidXRpb247Ci0gICAgICAgIG5ldC0+ZmluYWxNdWx0aXBseSo9bWF4KG5vcm1hbGl6ZV9pZl9wb3NzaWJsZV93aXRoX2luY3JlbWVudCgmbmV0LT5uKDAsai0xKSwmbmV0LT5uKDAsai0xKStJSixKKSxkb3VibGUoMWUtMTIpKTsKLSAgICB9Ci0gICAgaWYoIERlcGVuZGVuY3lPZkogKQotICAgICAgICBuZXQtPmUucmVzaXplKG0tMSk7Ci0gICAgZWxzZQotICAgICAgICBuZXQtPmUucmVzaXplKEo+MSk7Ci0gICAgZm9yKGo9MDtqPG5ldC0+ZS5zaXplKCk7aisrKXsKLSAgICAgICAgaW50IGZyZW5jaENsYXNzPWZ3b3JkY2xhc3Nlcy5nZXRDbGFzcyhmc1sxK21pbihpbnQobSktMSxpbnQoaikrMSldKTsKLSAgICAgICAgbmV0LT5lW2pdLnJlc2l6ZShJLEksMCk7Ci0gICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaTE9MDtpMTxJOysraTEpIHsKLSAgICAgICAgICAgIEFycmF5PGRvdWJsZT4gYWwobCk7Ci0gICAgICAgICAgICBDTEFTU0lGWTIoaTEsaTFyZWFsKTsKLSAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaTI9MDtpMjxsO2kyKyspCi0gICAgICAgICAgICAgICAgYWxbaTJdPXByb2JzLmdldEFsUHJvYihpMXJlYWwsaTIsbCxtLGV3b3JkY2xhc3Nlcy5nZXRDbGFzcyhlc1sxK2kxcmVhbF0pLGZyZW5jaENsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaisxKTsKLSAgICAgICAgICAgIG5vcm1hbGl6ZV9pZl9wb3NzaWJsZShjb25zdF9jYXN0PGRvdWJsZSo+KCZhbFswXSksY29uc3RfY2FzdDxkb3VibGUqPigoJmFsWzBdKSthbC5zaXplKCkpKTsKLSAgICAgICAgICAgIGlmKCBTbW9vdGhITU0mMiApCi0gICAgICAgICAgICAgICAgc21vb3RoX3N0YW5kYXJkKGNvbnN0X2Nhc3Q8ZG91YmxlKj4oJmFsWzBdKSxjb25zdF9jYXN0PGRvdWJsZSo+KCgmYWxbMF0pK2FsLnNpemUoKSksSE1NQWxpZ25tZW50TW9kZWxTbW9vdGhGYWN0b3IpOwotICAgICAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpMj0wO2kyPEk7aTIrKykgewotICAgICAgICAgICAgICAgIENMQVNTSUZZKGkyLGVtcHR5X2kyLGkycmVhbCk7Ci0gICAgICAgICAgICAgICAgbmV0LT5lW2pdKGkxLGkyKQkgICAgPSBhbFtpMnJlYWxdOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBlbXB0eV9pMiApCi0gICAgICAgICAgICAgICAgICAgIGlmKGkxcmVhbCE9aTJyZWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXQtPmVbal0oaTEsaTIpPTA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZXsgICAKLSAgICAgICAgICAgICAgICAgICAgbmV0LT5lW2pdKGkxLGkyKT1kb0luaXQ/YWxbMF06KHByb2JzLmdldFByb2JhYmlsaXR5Rm9yRW1wdHkoKSk7IC8vIG1ha2UgZmlyc3QgSE1NIGl0ZXJhdGlvbiBsaWtlIElCTS0xCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vcm1hbGl6ZV9pZl9wb3NzaWJsZSgmbmV0LT5lW2pdKGkxLDApLCZuZXQtPmVbal0oaTEsMCkrSSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoIGRvSW5pdCApewotICAgICAgICBmb3IodW5zaWduZWQgaW50IGk9MDtpPEk7KytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXQtPmFscGhhaW5pdFtpXT1uZXQtPmJldGFpbml0W2ldPShpPEkvMik/MTooMi4wL0kpOwotICAgICAgICAgICAgbmV0LT5iZXRhaW5pdFtpXT0xLjA7Ci0gICAgICAgIH0KLSAgICB9ZWxzZXsKLSAgICAgICAgaWYoIERlcGVuZGVuY3lPZlByZXZBSj09MCApewotICAgICAgICAgICAgZm9yKGk9MDtpPEk7aSsrKXsKLSAgICAgICAgICAgICAgICBDTEFTU0lGWTIoaSxpcmVhbCk7Ci0gICAgICAgICAgICAgICAgbmV0LT5hbHBoYWluaXRbaV09cHJvYnMuZ2V0QWxQcm9iKC0xLGlyZWFsLGwsbSwwLGZ3b3JkY2xhc3Nlcy5nZXRDbGFzcyhmc1sxKzBdKSwwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBpZiggVW5pZm9ybUVudHJ5RXhpdCYyIClwcm9icy5nZXRCZXRhSW5pdChJLG5ldC0+YmV0YWluaXQpOwotICAgICAgICAgICAgaWYoIFVuaWZvcm1FbnRyeUV4aXQmMSApcHJvYnMuZ2V0QWxwaGFJbml0KEksbmV0LT5hbHBoYWluaXQpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1hc3NlcnQoIG5ldC0+YWxwaGFpbml0LnNpemUoKT09SSApO21hc3NlcnQoIG5ldC0+YmV0YWluaXQuc2l6ZSgpPT1JICk7Ci0gICAgbm9ybWFsaXplX2lmX3Bvc3NpYmxlKGNvbnN0X2Nhc3Q8ZG91YmxlKj4oJihuZXQtPmFscGhhaW5pdFswXSkpLGNvbnN0X2Nhc3Q8ZG91YmxlKj4oJihuZXQtPmFscGhhaW5pdFswXSkrbmV0LT5hbHBoYWluaXQuc2l6ZSgpKSk7Ci0gICAgbm9ybWFsaXplX2lmX3Bvc3NpYmxlKGNvbnN0X2Nhc3Q8ZG91YmxlKj4oJihuZXQtPmJldGFpbml0WzBdKSksY29uc3RfY2FzdDxkb3VibGUqPigmKG5ldC0+YmV0YWluaXRbMF0pK25ldC0+YmV0YWluaXQuc2l6ZSgpKSk7Ci0gICAgdHJhbnNmb3JtKG5ldC0+YmV0YWluaXQuYmVnaW4oKSxuZXQtPmJldGFpbml0LmVuZCgpLG5ldC0+YmV0YWluaXQuYmVnaW4oKSxiaW5kMXN0KG11bHRpcGxpZXM8ZG91YmxlPigpLDIqbCkpOwotICAgIHJldHVybiBuZXQ7Ci19Ci1leHRlcm4gZmxvYXQgTUlOQ09VTlRJTkNSRUFTRTsKLQotdm9pZCBobW06OmVtX2xvb3AoUGVycGxleGl0eSYgcGVycCwgc2VudGVuY2VIYW5kbGVyJiBzSGFuZGxlcjEsIAotCQkgIGJvb2wgZHVtcF9hbGlnbm1lbnQsIGNvbnN0IGNoYXIqIGFsaWduZmlsZSwgUGVycGxleGl0eSYgdml0ZXJiaV9wZXJwLCAKLQkJICAgICBib29sIHRlc3QsYm9vbCBkb0luaXQsaW50IAotKXsKLSAgICBXb3JkSW5kZXggaSwgaiwgbCwgbSA7Ci0gICAgZG91YmxlIGNyb3NzX2VudHJvcHk7Ci0gICAgaW50IHBhaXJfbm89MCA7Ci0gICAgcGVycC5jbGVhcigpOwotICAgIHZpdGVyYmlfcGVycC5jbGVhcigpOwotICAgIG9mc3RyZWFtIG9mMjsKLSAgICAvLyBmb3IgZWFjaCBzZW50ZW5jZSBwYWlyIGluIHRoZSBjb3JwdXMKLSAgICBpZiAoZHVtcF9hbGlnbm1lbnR8fEZFV0RVTVBTICkKLSAgICAgICAgb2YyLm9wZW4oYWxpZ25maWxlKTsKLSAgICBzZW50UGFpciBzZW50IDsKLSAgICAKLSAgICB3aGlsZShzSGFuZGxlcjEuZ2V0TmV4dFNlbnRlbmNlKHNlbnQpKXsKLSAgICAgICAgY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIGVzID0gc2VudC5nZXRfZVNlbnQoKTsvLyAjCi0gICAgICAgIGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JiBmcyA9IHNlbnQuZ2V0X2ZTZW50KCk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNvICA9IHNlbnQuZ2V0Q291bnQoKTsKLSAgICAgICAgbCA9IGVzLnNpemUoKSAtIDE7Ci0gICAgICAgIG0gPSBmcy5zaXplKCkgLSAxOwotICAgICAgICBjcm9zc19lbnRyb3B5ID0gbG9nKDEuMCk7Ci0gICAgICAgIFZlY3RvcjxXb3JkSW5kZXg+IHZpdGVyYmlfYWxpZ25tZW50KGZzLnNpemUoKSk7Ly8gIwotICAgICAgICAKLSAgICAgICAgdW5zaWduZWQgaW50IEk9MipsLEo9bTsKLSAgICAgICAgYm9vbCBEZXBlbmRlbmN5T2ZKPShDb21wYXJlQWxEZXBzJigxNnw4KSl8fChQcmVkaWN0aW9uSW5BbGlnbm1lbnRzPT0yKTsKLSAgICAgICAgYm9vbCBEZXBlbmRlbmN5T2ZQcmV2QUo9KENvbXBhcmVBbERlcHMmKDJ8NCkpfHwoUHJlZGljdGlvbkluQWxpZ25tZW50cz09MCk7Ci0gICAgICAgIEhNTU5ldHdvcmsgKm5ldD1tYWtlSE1NTmV0d29yayhlcyxmcyxkb0luaXQpOwotCQkKLSAgICAgICAgQXJyYXk8ZG91YmxlPiBnYW1tYTsKLSAgICAgICAgQXJyYXk8QXJyYXkyPGRvdWJsZT4gPiBlcHNpbG9uKERlcGVuZGVuY3lPZko/KG0tMSk6MSk7Ci0gICAgICAgIGRvdWJsZSB0cmFpblByb2I7Ci0gICAgICAgIHRyYWluUHJvYj1Gb3J3YXJkQmFja3dhcmRUcmFpbmluZygqbmV0LGdhbW1hLGVwc2lsb24pOwotCQkKLSAgICAgICAgaWYoICF0ZXN0ICl7Ci0KLSNpZmRlZiBXSU4zMgotCQkJZG91YmxlICpncD1jb25zdF9jYXN0PGRvdWJsZSo+KCYoZ2FtbWFbMF0pKTsKLSNlbHNlCi0gICAgICAgICAgICBkb3VibGUgKmdwPWNvbnY8ZG91YmxlPihnYW1tYS5iZWdpbigpKTsKLSNlbmRpZgotCQkJCi0gICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGkyPTA7aTI8SjtpMisrKQotCQkJCWZvcih1bnNpZ25lZCBpbnQgaTE9MDtpMTxJOysraTEsKytncCl7Ci0gICAgICAgICAgICAgICAgaWYoICpncD5NSU5DT1VOVElOQ1JFQVNFICkgewotICAgICAgICAgICAgICAgICAgICBDT1VOVCBhZGQ9ICpncCpzbzsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGkxPj1sICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0VGFibGUuaW5jQ291bnQoZXNbMF0sZnNbMStpMl0sYWRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFDb3VudFRhYmxlLmFkZFZhbHVlKDAsaTIrMSxsLG0sYWRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYUNvdW50VGFibGUuZ2V0UmVmKDAsaTIrMSxsLG0pKz1hZGQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0VGFibGUuaW5jQ291bnQoZXNbMStpMV0sZnNbMStpMl0sYWRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFDb3VudFRhYmxlLmFkZFZhbHVlKDEraTEsMStpMixsLG0sYWRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYUNvdW50VGFibGUuZ2V0UmVmKDEraTEsMStpMixsLG0pKz1hZGQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkb3VibGUgcDBjPTAuMCxucDBjPTAuMDsKLSAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgamo9MDtqajxlcHNpbG9uLnNpemUoKTtqaisrKXsKLSAgICAgICAgICAgICAgICBpbnQgZnJlbmNoQ2xhc3M9ZndvcmRjbGFzc2VzLmdldENsYXNzKGZzWzErbWluKGludChtKS0xLGludChqaikrMSldKTsKLSAgICAgICAgICAgICAgICBkb3VibGUgKmVwPWVwc2lsb25bampdLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgaWYoIGVwICl7Ci0gICAgICAgICAgICAgICAgICAgIC8vZm9yKGk9MDtpPEk7aSsrKQotICAgICAgICAgICAgICAgICAgICAvLyAgbm9ybWFsaXplX2lmX3Bvc3NpYmxlX3dpdGhfaW5jcmVtZW50KGVwK2ksZXAraStJKkksSSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vCQlmb3IoaT0wO2k8SSpJOysraSkKLSAgICAgICAgICAgICAgICAgICAgLy8gIGVwW2ldICo9IEk7Ci0gICAgICAgICAgICAgICAgICAgIC8vaWYoIERlcGVuZGVuY3lPZkogKQotICAgICAgICAgICAgICAgICAgICAvLyAgaWYoIEotMSApCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIGZvcihpPTA7aTxJKkk7KytpKQotICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGVwW2ldIC89IChKLTEpOwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgbXVsdD0xLjA7Ci0gICAgICAgICAgICAgICAgICAgIG11bHQqPWw7Ci0gICAgICAgICAgICAgICAgICAgIC8vaWYoIERlcGVuZGVuY3lPZkogJiYgSi0xKQotICAgICAgICAgICAgICAgICAgICAvLyAgbXVsdC89KEotMSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpPTA7aTxJO2krKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGlfYmVmPTA7aV9iZWY8STtpX2JlZisrLGVwKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMQVNTSUZZKGksaV9lbXB0eSxpcmVhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xBU1NJRlkyKGlfYmVmLGlfYmVmcmVhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlfZW1wdHkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMGMrPSplcCAqIG11bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLQkJCQkJCQkJaW50IHYgPSBld29yZGNsYXNzZXMuZ2V0Q2xhc3MoZXNbMStpX2JlZnJlYWxdKTsKLQkJCQkJCQkJLy9jZXJyIDw8IHYgPDwiICIgPDwgZXMuc2l6ZSgpIDw8ICIgIjw8IGlfYmVmcmVhbCA8PCBlbmRsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuYWRkQWxDb3VudChpX2JlZnJlYWwsaXJlYWwsbCxtLHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZW5jaENsYXNzICxqaisxLCplcCAqIG11bHQsMC4wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnAwYys9KmVwICogbXVsdDsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3NlcnQoICZlcHNpbG9uW2pqXShpLGlfYmVmKT09IGVwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotI2lmZGVmIFdJTjMyCi0JCQlkb3VibGUgKmdwMT1jb25zdF9jYXN0PGRvdWJsZSAqPigmKGdhbW1hWzBdKSksKmdwMj1jb25zdF9jYXN0PGRvdWJsZSo+KCYoZ2FtbWFbMF0pK2dhbW1hLnNpemUoKSktSTsKLSNlbHNlCi0gICAgICAgICAgICBkb3VibGUgKmdwMT1jb252PGRvdWJsZT4oZ2FtbWEuYmVnaW4oKSksKmdwMj1jb252PGRvdWJsZT4oZ2FtbWEuZW5kKCkpLUk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGhtbWVudHJ5X3R5cGUmYWkwPWNvdW50cy5kb0dldEFscGhhSW5pdChJKTsKLSAgICAgICAgICAgIEFycmF5PGRvdWJsZT4mYWkgPSBhaTAuZmlyc3Q7Ci0gICAgICAgICAgICBobW1lbnRyeV90eXBlJmJpMD1jb3VudHMuZG9HZXRCZXRhSW5pdChJKTsKLSAgICAgICAgICAgIEFycmF5PGRvdWJsZT4mYmkgPSBiaTAuZmlyc3Q7Ci0gICAgICAgICAgICBpbnQgZmlyc3RGcmVuY2hDbGFzcz0oZnMuc2l6ZSgpPjEpPyhmd29yZGNsYXNzZXMuZ2V0Q2xhc3MoZnNbMSswXSkpOjA7Ci0jaWZkZWYgV0lOMzIKLSAgICAgICAgICAgIGFpMC5zZWNvbmQtPmxvY2soKTsKLSNlbHNlCi0JCQlhaTAuc2Vjb25kLmxvY2soKTsKLSNlbmRpZgotICAgICAgICAgICAgZm9yKGk9MDtpPEk7aSsrLGdwMSsrKXsKLSAgICAgICAgICAgICAgICBDTEFTU0lGWShpLGlfZW1wdHksaXJlYWwpOwotICAgICAgICAgICAgICAgIGFpW2ldKz0gKmdwMTsKLSAgICAgICAgICAgICAgICAvL2JpW2ldKz0gKmdwMjsKLSAgICAgICAgICAgICAgICBpZiggRGVwZW5kZW5jeU9mUHJldkFKPT0wICl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBpX2VtcHR5ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHAwYys9KmdwMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5hZGRBbENvdW50KC0xLGlyZWFsLGwsbSwwLGZpcnN0RnJlbmNoQ2xhc3MsMCwqZ3AxLDAuMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBucDBjKz0qZ3AxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotI2lmZGVmIFdJTjMyCi0gICAgICAgICAgICBhaTAuc2Vjb25kLT51bmxvY2soKTsKLSAgICAgICAgICAgIGJpMC5zZWNvbmQtPmxvY2soKTsKLSNlbHNlCi0JCQlhaTAuc2Vjb25kLnVubG9jaygpOwotCQkJYmkwLnNlY29uZC5sb2NrKCk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgZm9yKGk9MDtpPEk7aSsrLGdwMisrKXsKLSAgICAgICAgICAgICAgICBDTEFTU0lGWShpLGlfZW1wdHksaXJlYWwpOwotICAgICAgICAgICAgICAgIGJpW2ldKz0gKmdwMjsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBXSU4zMiAgICAgICAgICAgIAotICAgICAgICAgICAgYmkwLnNlY29uZC0+dW5sb2NrKCk7Ci0jZWxzZSAgICAgICAgICAgIAotICAgICAgICAgICAgYmkwLnNlY29uZC51bmxvY2soKTsKLSNlbmRpZiAgICAgICAgICAgIAotCi0gICAgICAgICAgICBpZiggVmVyYm9zZSApCi0gICAgICAgICAgICAgICAgY291dCA8PCAibDogIiA8PCBsIDw8ICJtOiAiIDw8IG0gPDwgIiBwMGM6ICIgPDwgcDBjIDw8ICIgbnAwYzogIiA8PCBucDBjIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICBjcm9zc19lbnRyb3B5Kz1sb2cobWF4KHRyYWluUHJvYiwxZS0xMDApKStsb2cobWF4KG5ldC0+ZmluYWxNdWx0aXBseSwxZS0xMDApKTsKLSAgICAgICAgQXJyYXk8aW50PnZpdDsKLSAgICAgICAgZG91YmxlIHZpdGVyYmlfc2NvcmU9MS4wOwotICAgICAgICBpZiggKEhNTVRyYWluaW5nU3BlY2lhbEZsYWdzJjEpICkKLSAgICAgICAgICAgIEhNTVZpdGVyYmkoKm5ldCxnYW1tYSx2aXQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2aXRlcmJpX3Njb3JlPUhNTVJlYWxWaXRlcmJpKCpuZXQsdml0KTsKLSAgICAgICAgZm9yKGo9MTtqPD1tO2orKyl7Ci0gICAgICAgICAgICB2aXRlcmJpX2FsaWdubWVudFtqXT12aXRbai0xXSsxOwotICAgICAgICAgICAgaWYoIHZpdGVyYmlfYWxpZ25tZW50W2pdPmwpCi0gICAgICAgICAgICAgICAgdml0ZXJiaV9hbGlnbm1lbnRbal09MDsKLSAgICAgICAgfQotICAgICAgICBzSGFuZGxlcjEuc2V0UHJvYk9mU2VudGVuY2Uoc2VudCxjcm9zc19lbnRyb3B5KTsKLSAgICAgICAgcGVycC5hZGRGYWN0b3IoY3Jvc3NfZW50cm9weSwgc28sIGwsIG0sMSk7Ci0gICAgICAgIHZpdGVyYmlfcGVycC5hZGRGYWN0b3IobG9nKHZpdGVyYmlfc2NvcmUpK2xvZyhtYXgobmV0LT5maW5hbE11bHRpcGx5LDFlLTEwMCkpLCBzbywgbCwgbSwxKTsKLSAgICAgICAgaWYoIFZlcmJvc2UgKQotICAgICAgICAgICAgY291dCA8PCAiVml0ZXJiaS1wZXJwOiAiIDw8IGxvZyh2aXRlcmJpX3Njb3JlKSA8PCAnICcgPDwgbG9nKG1heChuZXQtPmZpbmFsTXVsdGlwbHksMWUtMTAwKSkgPDwgJyAnIDw8IHZpdGVyYmlfc2NvcmUgPDwgJyAnIDw8IG5ldC0+ZmluYWxNdWx0aXBseSA8PCAnICcgPDwgKm5ldCA8PCAiZ2FtbWE6ICIgPDwgZ2FtbWEgPDwgZW5kbDsKLQkJCQotICAgICAgICBkZWxldGUgbmV0O25ldD0wOwotICAgICAgICBpZiAoZHVtcF9hbGlnbm1lbnR8fChGRVdEVU1QUyYmc2VudC5nZXRTZW50ZW5jZU5vKCk8MTAwMCkgKQotICAgICAgICAgICAgcHJpbnRBbGlnblRvRmlsZShlcywgZnMsIEVsaXN0LmdldFZvY2FiTGlzdCgpLCBGbGlzdC5nZXRWb2NhYkxpc3QoKSwgb2YyLCB2aXRlcmJpX2FsaWdubWVudCwgc2VudC5nZXRTZW50ZW5jZU5vKCksIHZpdGVyYmlfc2NvcmUpOwotICAgICAgICBhZGRBTCh2aXRlcmJpX2FsaWdubWVudCxzZW50LmdldFNlbnRlbmNlTm8oKSxsKTsgICAgCi0JCQotICAgICAgICBwYWlyX25vKys7Ci0gICAgfSAvKiBvZiB3aGlsZSAqLwotICAgIAotfQotCi12b2lkIGhtbTo6Y2xlYXJDb3VudFRhYmxlKCl7Y291bnRzPUhNTVRhYmxlczxpbnQsV29yZENsYXNzZXM+KEdMT0JBTFByb2JhYmlsaXR5Rm9yRW1wdHksZXdvcmRjbGFzc2VzLGZ3b3JkY2xhc3Nlcyk7fQotCi0jaWYgMAotQ1RUYWJsZURpZmY8Q09VTlQsUFJPQj4qIGhtbTo6ZW1fbG9vcF8xKFBlcnBsZXhpdHkmIHBlcnAsIHNlbnRlbmNlSGFuZGxlciYgc0hhbmRsZXIxLCAKLQkJICBib29sIGR1bXBfYWxpZ25tZW50LCBjb25zdCBjaGFyKiBhbGlnbmZpbGUsIFBlcnBsZXhpdHkmIHZpdGVyYmlfcGVycCwgCi0JCSAgICAgYm9vbCB0ZXN0LGJvb2wgZG9Jbml0LGludCAKLSl7Ci0gICAgQ1RUYWJsZURpZmY8Q09VTlQsUFJPQj4gKmRpZmYgPSBuZXcgQ1RUYWJsZURpZmY8Q09VTlQsUFJPQj4oKTsKLSAgICAvL2RpZmYtPmluY0NvdW50KDEsMSwwKTsKLSAgICBXb3JkSW5kZXggaSwgaiwgbCwgbSA7Ci0gICAgZG91YmxlIGNyb3NzX2VudHJvcHk7Ci0gICAgaW50IHBhaXJfbm89MCA7Ci0gICAgcGVycC5jbGVhcigpOwotICAgIHZpdGVyYmlfcGVycC5jbGVhcigpOwotICAgIG9mc3RyZWFtIG9mMjsKLSAgICAvLyBmb3IgZWFjaCBzZW50ZW5jZSBwYWlyIGluIHRoZSBjb3JwdXMKLSAgICBpZiAoZHVtcF9hbGlnbm1lbnR8fEZFV0RVTVBTICkKLSAgICAgICAgb2YyLm9wZW4oYWxpZ25maWxlKTsKLSAgICBzZW50UGFpciBzZW50IDsKLSAgICBzSGFuZGxlcjEucmV3aW5kKCk7Ci0gICAgaW50IG5ubiA9IDA7Ci0gICAgd2hpbGUoc0hhbmRsZXIxLmdldE5leHRTZW50ZW5jZShzZW50KSl7Ci0JICAgIG5ubiArKzsKLQkgICAgY291dCA8PCBubm4gPDwgZW5kbDsKLQljb3V0IDw8IDEgPDwgZW5kbDsKLSAgICAgICAgY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIGVzID0gc2VudC5nZXRfZVNlbnQoKTsKLSAgICAgICAgY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIGZzID0gc2VudC5nZXRfZlNlbnQoKTsKLSAgICAgICAgY29uc3QgZmxvYXQgc28gID0gc2VudC5nZXRDb3VudCgpOwotICAgICAgICBsID0gZXMuc2l6ZSgpIC0gMTsKLSAgICAgICAgbSA9IGZzLnNpemUoKSAtIDE7Ci0gICAgICAgIGNyb3NzX2VudHJvcHkgPSBsb2coMS4wKTsKLSAgICAgICAgVmVjdG9yPFdvcmRJbmRleD4gdml0ZXJiaV9hbGlnbm1lbnQoZnMuc2l6ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGludCBJPTIqbCxKPW07Ci0gICAgICAgIGJvb2wgRGVwZW5kZW5jeU9mSj0oQ29tcGFyZUFsRGVwcyYoMTZ8OCkpfHwoUHJlZGljdGlvbkluQWxpZ25tZW50cz09Mik7Ci0gICAgICAgIGJvb2wgRGVwZW5kZW5jeU9mUHJldkFKPShDb21wYXJlQWxEZXBzJigyfDQpKXx8KFByZWRpY3Rpb25JbkFsaWdubWVudHM9PTApOwotCWNvdXQgPDwgMiA8PCBlbmRsOwotICAgICAgICBITU1OZXR3b3JrICpuZXQ9bWFrZUhNTU5ldHdvcmsoZXMsZnMsZG9Jbml0KTsKLSAgICAgICAgQXJyYXk8ZG91YmxlPiBnYW1tYTsKLSAgICAgICAgQXJyYXk8QXJyYXkyPGRvdWJsZT4gPiBlcHNpbG9uKERlcGVuZGVuY3lPZko/KG0tMSk6MSk7Ci0gICAgICAgIGRvdWJsZSB0cmFpblByb2I7Ci0JY291dCA8PCAyLjUgPDwgZW5kbDsKLSAgICAgICAgdHJhaW5Qcm9iPUZvcndhcmRCYWNrd2FyZFRyYWluaW5nKCpuZXQsZ2FtbWEsZXBzaWxvbik7Ci0JY291dCA8PCAzIDw8IGVuZGw7Ci0gICAgICAgIGlmKCAhdGVzdCApewotICAgICAgICAgICAgZG91YmxlICpncD1jb252PGRvdWJsZT4oZ2FtbWEuYmVnaW4oKSk7Ci0JICAgIGNvdXQgPDwgNCA8PCBlbmRsOwotICAgICAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpMj0wO2kyPEo7aTIrKylmb3IodW5zaWduZWQgaW50IGkxPTA7aTE8STsrK2kxLCsrZ3ApewotICAgICAgICAgICAgICAgIGlmKCAqZ3A+TUlOQ09VTlRJTkNSRUFTRSApIHsKLSAgICAgICAgICAgICAgICAgICAgQ09VTlQgYWRkPSAqZ3Aqc287Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBpMT49bCApewotICAgICAgICAgICAgICAgICAgICAgICAgZGlmZi0+aW5jQ291bnQoZXNbMF0sZnNbMStpMl0sYWRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vdFRhYmxlLmluY0NvdW50KGVzWzBdLGZzWzEraTJdLGFkZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhQ291bnRUYWJsZS5nZXRSZWYoMCxpMisxLGwsbSkrPWFkZDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlCXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYtPmluY0NvdW50KGVzWzEraTFdLGZzWzEraTJdLGFkZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3RUYWJsZS5pbmNDb3VudChlc1sxK2kxXSxmc1sxK2kyXSxhZGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYUNvdW50VGFibGUuZ2V0UmVmKDEraTEsMStpMixsLG0pKz1hZGQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JICAgIGNvdXQgPDwgNSA8PCBlbmRsOwotICAgICAgICAgICAgZG91YmxlIHAwYz0wLjAsbnAwYz0wLjA7Ci0gICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGpqPTA7amo8ZXBzaWxvbi5zaXplKCk7amorKyl7Ci0JCSAgIGlmIChubm49PTc3NzkpIGNvdXQgPDwgMSA8PCBlbmRsOwotICAgICAgICAgICAgICAgIGludCBmcmVuY2hDbGFzcz1md29yZGNsYXNzZXMuZ2V0Q2xhc3MoZnNbMSttaW4oaW50KG0pLTEsaW50KGpqKSsxKV0pOwotCQkgICBpZiAobm5uPT03Nzc5KSBjb3V0IDw8IDIgPDwgZW5kbDsKLSAgICAgICAgICAgICAgICBkb3VibGUgKmVwPWVwc2lsb25bampdLmJlZ2luKCk7Ci0JCWlmIChubm49PTc3NzkpIGNvdXQgPDwgMyA8PCBlbmRsOwotICAgICAgICAgICAgICAgIGlmKCBlcCApewotICAgICAgICAgICAgICAgICAgICAvL2ZvcihpPTA7aTxJO2krKykKLSAgICAgICAgICAgICAgICAgICAgLy8gIG5vcm1hbGl6ZV9pZl9wb3NzaWJsZV93aXRoX2luY3JlbWVudChlcCtpLGVwK2krSSpJLEkpOwotICAgICAgICAgICAgICAgICAgICAvLwkJZm9yKGk9MDtpPEkqSTsrK2kpCi0gICAgICAgICAgICAgICAgICAgIC8vICBlcFtpXSAqPSBJOwotICAgICAgICAgICAgICAgICAgICAvL2lmKCBEZXBlbmRlbmN5T2ZKICkKLSAgICAgICAgICAgICAgICAgICAgLy8gIGlmKCBKLTEgKQotICAgICAgICAgICAgICAgICAgICAvLyAgICBmb3IoaT0wO2k8SSpJOysraSkKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICBlcFtpXSAvPSAoSi0xKTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIG11bHQ9MS4wOwotICAgICAgICAgICAgICAgICAgICBtdWx0Kj1sOwotICAgICAgICAgICAgICAgICAgICAvL2lmKCBEZXBlbmRlbmN5T2ZKICYmIEotMSkKLSAgICAgICAgICAgICAgICAgICAgLy8gIG11bHQvPShKLTEpOwotCQkgICAgaWYgKG5ubj09Nzc3OSkgY291dCA8PCA0IDw8ICI6IiA8PCBJICA8PCBlbmRsOwotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wO2k8STtpKyspewotCQkJICAgIGlmIChubm49PTc3NzkpIGNvdXQgPDwgImk6IiA8PCBpIDw8IGVuZGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGlfYmVmPTA7aV9iZWY8STtpX2JlZisrLGVwKyspewotCQkJCWlmIChubm49PTc3NzkpIGNvdXQgPDwgIiAgIENMIDEiICAgPDwgZW5kbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEFTU0lGWShpLGlfZW1wdHksaXJlYWwpOwotCQlpZiAobm5uPT03Nzc5KSBjb3V0IDw8ICIgICBDTCAyIDogIiAgIDw8IGlfYmVmIDw8ICIgIiA8PCAgKHNpemVfdCllcCA8PCBlbmRsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMQVNTSUZZMihpX2JlZixpX2JlZnJlYWwpOwotCQkJICAgIGlmKChpKzEpKihpX2JlZisxKT5lcHNpbG9uW2pqXS5nZXRMZW4xKCkqZXBzaWxvbltqal0uZ2V0TGVuMigpKXsKLQkJCQkgICAgY29udGludWU7Ci0JCQkgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpX2VtcHR5ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDBjKz1lcHNpbG9uW2pqXShpLGlfYmVmKSptdWx0Oy8vIHAwYys9KmVwICogbXVsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotCQkJCWlmIChubm49PTc3NzkpIGNvdXQgPDwgIkVMU0UiIDw8IGVuZGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChubm49PTc3NzkpewotCQkJCQljb3V0IDw8IGlfYmVmcmVhbDw8IiAiIDw8aXJlYWw8PCIgIiA8PCBsPDwiICIgPDwgbTw8IiAiPDwgamo8PCIgIjw8ZXBzaWxvbi5zaXplKCk8PCAiICIgPDwgZXBzaWxvbltqal0uZ2V0TGVuMSgpIDw8IiAiIDw8IGVwc2lsb25bampdLmdldExlbjIoKTw8IGVuZGw7Ci0JCQkJCW5wMGMrPWVwc2lsb25bampdKGksaV9iZWYpKm11bHQ7Ci0JCQkJCWNvdXQgPDwiLi4uIjw8ZW5kbDsKLQkJCQkJY291dCA8PCIuLi4uLi4iPDxld29yZGNsYXNzZXMuZ2V0Q2xhc3MoZXNbMStpX2JlZnJlYWxdKSA8PCBlbmRsOwotCQkJCQljb3V0IDw8Ii4uLi4uLiI8PGVuZGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5hZGRBbENvdW50KGlfYmVmcmVhbCxpcmVhbCxsLG0sZXdvcmRjbGFzc2VzLmdldENsYXNzKGVzWzEraV9iZWZyZWFsXSksCi0JCQkJCQkgICAgICBmcmVuY2hDbGFzcyAsamorMSwwLDAuMCk7Ci0JCQkJICAgICAgbnAwYys9ZXBzaWxvbltqal0oaSxpX2JlZikqbXVsdDsKLQkJCQl9Ci0JCQkJZWxzZXsKLQkJCQkJY291bnRzLmFkZEFsQ291bnQoaV9iZWZyZWFsLGlyZWFsLGwsbSxld29yZGNsYXNzZXMuZ2V0Q2xhc3MoZXNbMStpX2JlZnJlYWxdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlbmNoQ2xhc3MgLGpqKzEsZXBzaWxvbltqal0oaSxpX2JlZikqbXVsdCwwLjApOwotCQkJCQlucDBjKz1lcHNpbG9uW2pqXShpLGlfYmVmKSptdWx0OyAKLQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJICAgIGlmIChubm49PTc3NzkpIGNvdXQgPDwgIkZJIiA8PCBlbmRsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3NlcnQoICZlcHNpbG9uW2pqXShpLGlfYmVmKT09IGVwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCQkgICAgaWYgKG5ubj09Nzc3OSkgY291dCA8PCA1IDw8IGVuZGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCS8vICAgIGNvdXQgPDwgNiA8PCBlbmRsOwotICAgICAgICAgICAgZG91YmxlICpncDE9Y29udjxkb3VibGU+KGdhbW1hLmJlZ2luKCkpLCpncDI9Y29udjxkb3VibGU+KGdhbW1hLmVuZCgpKS1JOwotICAgICAgICAgICAgQXJyYXk8ZG91YmxlPiZhaT1jb3VudHMuZG9HZXRBbHBoYUluaXQoSSk7LypJZiBpdCBpcyBub3QgZ2V0IHlldCwgaW5pdCBpdCwgYWxsIG9wZXJhdGlvbiBlbnZvbHZlZCBpcyBhZGQqLwotICAgICAgICAgICAgQXJyYXk8ZG91YmxlPiZiaT1jb3VudHMuZG9HZXRCZXRhSW5pdChJKTsKLSAgICAgICAgICAgIGludCBmaXJzdEZyZW5jaENsYXNzPShmcy5zaXplKCk+MSk/KGZ3b3JkY2xhc3Nlcy5nZXRDbGFzcyhmc1sxKzBdKSk6MDsKLSAgICAgICAgICAgIGZvcihpPTA7aTxJO2krKyxncDErKyxncDIrKyl7Ci0gICAgICAgICAgICAgICAgQ0xBU1NJRlkoaSxpX2VtcHR5LGlyZWFsKTsKLSAgICAgICAgICAgICAgICBhaVtpXSs9ICpncDE7Ci0gICAgICAgICAgICAgICAgYmlbaV0rPSAqZ3AyOwotICAgICAgICAgICAgICAgIGlmKCBEZXBlbmRlbmN5T2ZQcmV2QUo9PTAgKXsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGlfZW1wdHkgKQotICAgICAgICAgICAgICAgICAgICAgICAgcDBjKz0qZ3AxOwotICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmFkZEFsQ291bnQoLTEsaXJlYWwsbCxtLDAsZmlyc3RGcmVuY2hDbGFzcywwLCpncDEsMC4wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5wMGMrPSpncDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JICAvLyAgY291dCA8PCA3IDw8IGVuZGw7Ci0gICAgICAgICAgICBpZiggVmVyYm9zZSApCi0gICAgICAgICAgICAgICAgY291dCA8PCAibDogIiA8PCBsIDw8ICJtOiAiIDw8IG0gPDwgIiBwMGM6ICIgPDwgcDBjIDw8ICIgbnAwYzogIiA8PCBucDBjIDw8IGVuZGw7Ci0gICAgICAgIH0KLQkvL2NvdXQgPDwgOCA8PCBlbmRsOwotICAgICAgICBjcm9zc19lbnRyb3B5Kz1sb2cobWF4KHRyYWluUHJvYiwxZS0xMDApKStsb2cobWF4KG5ldC0+ZmluYWxNdWx0aXBseSwxZS0xMDApKTsKLSAgICAgICAgQXJyYXk8aW50PnZpdDsKLSAgICAgICAgZG91YmxlIHZpdGVyYmlfc2NvcmU9MS4wOwotCS8vY291dCA8PCA5IDw8IGVuZGw7Ci0gICAgICAgIGlmKCAoSE1NVHJhaW5pbmdTcGVjaWFsRmxhZ3MmMSkgKQotICAgICAgICAgICAgSE1NVml0ZXJiaSgqbmV0LGdhbW1hLHZpdCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZpdGVyYmlfc2NvcmU9SE1NUmVhbFZpdGVyYmkoKm5ldCx2aXQpOwotCS8vY291dCA8PCAxMCA8PCBlbmRsOwotICAgICAgICBmb3Ioaj0xO2o8PW07aisrKXsKLSAgICAgICAgICAgIHZpdGVyYmlfYWxpZ25tZW50W2pdPXZpdFtqLTFdKzE7Ci0gICAgICAgICAgICBpZiggdml0ZXJiaV9hbGlnbm1lbnRbal0+bCkKLSAgICAgICAgICAgICAgICB2aXRlcmJpX2FsaWdubWVudFtqXT0wOwotICAgICAgICB9Ci0JLy9jb3V0IDw8IDExIDw8IGVuZGw7Ci0gICAgICAgIHNIYW5kbGVyMS5zZXRQcm9iT2ZTZW50ZW5jZShzZW50LGNyb3NzX2VudHJvcHkpOwotCS8vY291dCA8PCAxMiA8PCBlbmRsOwotICAgICAgICBwZXJwLmFkZEZhY3Rvcihjcm9zc19lbnRyb3B5LCBzbywgbCwgbSwxKTsKLSAgICAgICAgdml0ZXJiaV9wZXJwLmFkZEZhY3Rvcihsb2codml0ZXJiaV9zY29yZSkrbG9nKG1heChuZXQtPmZpbmFsTXVsdGlwbHksMWUtMTAwKSksIHNvLCBsLCBtLDEpOwotICAgICAgICBpZiggVmVyYm9zZSApCi0gICAgICAgICAgICBjb3V0IDw8ICJWaXRlcmJpLXBlcnA6ICIgPDwgbG9nKHZpdGVyYmlfc2NvcmUpIDw8ICcgJyA8PCBsb2cobWF4KG5ldC0+ZmluYWxNdWx0aXBseSwxZS0xMDApKSA8PCAnICcgPDwgdml0ZXJiaV9zY29yZSA8PCAnICcgPDwgbmV0LT5maW5hbE11bHRpcGx5IDw8ICcgJyA8PCAqbmV0IDw8ICJnYW1tYTogIiA8PCBnYW1tYSA8PCBlbmRsOwotICAgICAgICBkZWxldGUgbmV0O25ldD0wOwotCS8vY291dCA8PCAxMyA8PCBlbmRsOwotICAgICAgICBpZiAoZHVtcF9hbGlnbm1lbnR8fChGRVdEVU1QUyYmc2VudC5nZXRTZW50ZW5jZU5vKCk8MTAwMCkgKQotICAgICAgICAgICAgcHJpbnRBbGlnblRvRmlsZShlcywgZnMsIEVsaXN0LmdldFZvY2FiTGlzdCgpLCBGbGlzdC5nZXRWb2NhYkxpc3QoKSwgb2YyLCB2aXRlcmJpX2FsaWdubWVudCwgc2VudC5nZXRTZW50ZW5jZU5vKCksIHZpdGVyYmlfc2NvcmUpOwotCS8vY291dCA8PCAxNCA8PCBlbmRsOwotICAgICAgICBhZGRBTCh2aXRlcmJpX2FsaWdubWVudCxzZW50LmdldFNlbnRlbmNlTm8oKSxsKTsgICAgCi0gICAgICAgIHBhaXJfbm8rKzsKLSAgICB9IC8qIG9mIHdoaWxlICovCi0gICAgc0hhbmRsZXIxLnJld2luZCgpOwotICAgIHBlcnAucmVjb3JkKCJITU0iKTsKLSAgICB2aXRlcmJpX3BlcnAucmVjb3JkKCJITU0iKTsKLSAgICBlcnJvclJlcG9ydEFMKGNvdXQsIkhNTSIpOwotICAgIHJldHVybiBkaWZmOwotfQotCi0jZW5kaWYKLU11dGV4IG11OwotCi0jaWYgMAotdm9pZCBobW06OmVtX2xvb3BfMihQZXJwbGV4aXR5JiBwZXJwLCBzZW50ZW5jZUhhbmRsZXImIHNIYW5kbGVyMSwgCi0JCSAgYm9vbCBkdW1wX2FsaWdubWVudCwgY29uc3QgY2hhciogYWxpZ25maWxlLCBQZXJwbGV4aXR5JiB2aXRlcmJpX3BlcnAsIAotCQkgICAgIGJvb2wgdGVzdCxib29sIGRvSW5pdCxpbnQgcGFydAotKXsKLSAgICBXb3JkSW5kZXggaSwgaiwgbCwgbSA7Ci0gICAgZG91YmxlIGNyb3NzX2VudHJvcHk7Ci0gICAgaW50IHBhaXJfbm89MCA7Ci0gICAgcGVycC5jbGVhcigpOwotICAgIHZpdGVyYmlfcGVycC5jbGVhcigpOwotICAgIG9mc3RyZWFtIG9mMjsKLSAgICAvLyBmb3IgZWFjaCBzZW50ZW5jZSBwYWlyIGluIHRoZSBjb3JwdXMKLSAgICBpZiAoZHVtcF9hbGlnbm1lbnR8fEZFV0RVTVBTICkKLSAgICAgICAgb2YyLm9wZW4oYWxpZ25maWxlKTsKLSAgICBzZW50UGFpciBzZW50IDsKLSAgICAvL3NIYW5kbGVyMS5yZXdpbmQoKTsKLSAgICBpbnQgbm5uID0gMDsKLSAgICB3aGlsZShzSGFuZGxlcjEuZ2V0TmV4dFNlbnRlbmNlKHNlbnQpKXsKLQkgICAgLy9ubm4gKys7Ci0JICAgIC8vY291dCA8PCBubm4gPDwgZW5kbDsKLSAgICAgICAgLy9jb3V0IDw8IDEgPDwgZW5kbDsKLSAgICAgICAgY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIGVzID0gc2VudC5nZXRfZVNlbnQoKTsKLSAgICAgICAgY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIGZzID0gc2VudC5nZXRfZlNlbnQoKTsKLSAgICAgICAgY29uc3QgZmxvYXQgc28gID0gc2VudC5nZXRDb3VudCgpOwotICAgICAgICBsID0gZXMuc2l6ZSgpIC0gMTsKLSAgICAgICAgbSA9IGZzLnNpemUoKSAtIDE7Ci0gICAgICAgIGNyb3NzX2VudHJvcHkgPSBsb2coMS4wKTsKLSAgICAgICAgVmVjdG9yPFdvcmRJbmRleD4gdml0ZXJiaV9hbGlnbm1lbnQoZnMuc2l6ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGludCBJPTIqbCxKPW07Ci0gICAgICAgIGJvb2wgRGVwZW5kZW5jeU9mSj0oQ29tcGFyZUFsRGVwcyYoMTZ8OCkpfHwoUHJlZGljdGlvbkluQWxpZ25tZW50cz09Mik7Ci0gICAgICAgIGJvb2wgRGVwZW5kZW5jeU9mUHJldkFKPShDb21wYXJlQWxEZXBzJigyfDQpKXx8KFByZWRpY3Rpb25JbkFsaWdubWVudHM9PTApOwotCi0gICAgICAgIEhNTU5ldHdvcmsgKm5ldD1tYWtlSE1NTmV0d29yayhlcyxmcyxkb0luaXQpOwotICAgICAgICBBcnJheTxkb3VibGU+IGdhbW1hOwotICAgICAgICBBcnJheTxBcnJheTI8ZG91YmxlPiA+IGVwc2lsb24oRGVwZW5kZW5jeU9mSj8obS0xKToxKTsKLSAgICAgICAgZG91YmxlIHRyYWluUHJvYjsKLSAgICAgICAgdHJhaW5Qcm9iPUZvcndhcmRCYWNrd2FyZFRyYWluaW5nKCpuZXQsZ2FtbWEsZXBzaWxvbik7Ci0gICAgICAgIGlmKCAhdGVzdCApewotICAgICAgICAgICAgZG91YmxlICpncD1jb252PGRvdWJsZT4oZ2FtbWEuYmVnaW4oKSk7Ci0gICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGkyPTA7aTI8SjtpMisrKWZvcih1bnNpZ25lZCBpbnQgaTE9MDtpMTxJOysraTEsKytncCl7Ci0gICAgICAgICAgICAgICAgaWYoICpncD5NSU5DT1VOVElOQ1JFQVNFICkgewotICAgICAgICAgICAgICAgICAgICBDT1VOVCBhZGQ9ICpncCpzbzsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGkxPj1sICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2RpZmYtPmluY0NvdW50KGVzWzBdLGZzWzEraTJdLGFkZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0VGFibGUuaW5jQ291bnQoZXNbMF0sZnNbMStpMl0sYWRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFDb3VudFRhYmxlLmdldFJlZigwLGkyKzEsbCxtKSs9YWRkOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UJewotICAgICAgICAgICAgICAgICAgICAgICAgLy9kaWZmLT5pbmNDb3VudChlc1sxK2kxXSxmc1sxK2kyXSxhZGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgdFRhYmxlLmluY0NvdW50KGVzWzEraTFdLGZzWzEraTJdLGFkZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhQ291bnRUYWJsZS5nZXRSZWYoMStpMSwxK2kyLGwsbSkrPWFkZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvdWJsZSBwMGM9MC4wLG5wMGM9MC4wOwotICAgICAgICAgICAgZm9yKHVuc2lnbmVkIGludCBqaj0wO2pqPGVwc2lsb24uc2l6ZSgpO2pqKyspewotICAgICAgICAgICAgICAgIGludCBmcmVuY2hDbGFzcz1md29yZGNsYXNzZXMuZ2V0Q2xhc3MoZnNbMSttaW4oaW50KG0pLTEsaW50KGpqKSsxKV0pOwotICAgICAgICAgICAgICAgIGRvdWJsZSAqZXA9ZXBzaWxvbltqal0uYmVnaW4oKTsKLSAgICAgICAgICAgICAgICBpZiggZXAgKXsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIG11bHQ9MS4wOwotICAgICAgICAgICAgICAgICAgICBtdWx0Kj1sOwotICAgICAgICAgICAgICAgICAgICAvL2lmKCBEZXBlbmRlbmN5T2ZKICYmIEotMSkKLSAgICAgICAgICAgICAgICAgICAgLy8gIG11bHQvPShKLTEpOwotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wO2k8STtpKyspewotCQkgICAgICAgICAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpX2JlZj0wO2lfYmVmPEk7aV9iZWYrKyxlcCsrKXsKLQkJICAgICAgICAgICAgICAgICAgICBDTEFTU0lGWShpLGlfZW1wdHksaXJlYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMQVNTSUZZMihpX2JlZixpX2JlZnJlYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpX2VtcHR5ICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAwYys9KmVwICogbXVsdDsKLQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJLy9tdS5sb2NrKCk7IAotCQkJCQkJCQkvL2NvdXQ8PCJcclAgIjw8cGFydDw8IiAiOwotCQkJCQkJCQkvL2NvdXQ8PGVwc2lsb24uc2l6ZSgpPDwiICI8PGpqPDwiICI7Ci0JCQkJCQkJCS8vY291dDw8ZXBzaWxvbltqal0uaDE8PCIgIiA8PCBlcHNpbG9uW2pqXS5oMjw8IiAiOwotCQkJCQkJCQkvL2NvdXQ8PGk8PCIgIjw8aV9iZWY8PCIgIjsKLQkJCQkJCQkJLy9jb3V0PDxJPDwiICI8PEo8PCIgICAgICAgICAgICAgIjsKLQkJCQkJCQkJCi0JCQkJCQkJCWNvdXQuZmx1c2goKTsKLQkJCQkJCQkJY291bnRzLmFkZEFsQ291bnQoaV9iZWZyZWFsLGlyZWFsLGwsbSxld29yZGNsYXNzZXMuZ2V0Q2xhc3MoZXNbMStpX2JlZnJlYWxdKSwKLQkJCQkJCQkJCQkJCSAgZnJlbmNoQ2xhc3MgLGpqKzEsKmVwICogbXVsdCwwLjApOwotCQkJCQkJCQlucDBjKz0qZXAgKiBtdWx0OyAKLQkJCQkJCQkJLy9tdS51bmxvY2soKTsKLQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzc2VydCggJmVwc2lsb25bampdKGksaV9iZWYpPT0gZXApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZG91YmxlICpncDE9Y29udjxkb3VibGU+KGdhbW1hLmJlZ2luKCkpLCpncDI9Y29udjxkb3VibGU+KGdhbW1hLmVuZCgpKS1JOwotICAgICAgICAgICAgQXJyYXk8ZG91YmxlPiZhaT1jb3VudHMuZG9HZXRBbHBoYUluaXQoSSk7LypJZiBpdCBpcyBub3QgZ2V0IHlldCwgaW5pdCBpdCwgYWxsIG9wZXJhdGlvbiBlbnZvbHZlZCBpcyBhZGQqLwotICAgICAgICAgICAgQXJyYXk8ZG91YmxlPiZiaT1jb3VudHMuZG9HZXRCZXRhSW5pdChJKTsKLSAgICAgICAgICAgIGludCBmaXJzdEZyZW5jaENsYXNzPShmcy5zaXplKCk+MSk/KGZ3b3JkY2xhc3Nlcy5nZXRDbGFzcyhmc1sxKzBdKSk6MDsKLSAgICAgICAgICAgIGZvcihpPTA7aTxJO2krKyxncDErKyxncDIrKyl7Ci0gICAgICAgICAgICAgICAgQ0xBU1NJRlkoaSxpX2VtcHR5LGlyZWFsKTsKLSAgICAgICAgICAgICAgICBhaVtpXSs9ICpncDE7Ci0gICAgICAgICAgICAgICAgYmlbaV0rPSAqZ3AyOwotICAgICAgICAgICAgICAgIGlmKCBEZXBlbmRlbmN5T2ZQcmV2QUo9PTAgKXsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGlfZW1wdHkgKQotICAgICAgICAgICAgICAgICAgICAgICAgcDBjKz0qZ3AxOwotICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmFkZEFsQ291bnQoLTEsaXJlYWwsbCxtLDAsZmlyc3RGcmVuY2hDbGFzcywwLCpncDEsMC4wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5wMGMrPSpncDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JICAvLyAgY291dCA8PCA3IDw8IGVuZGw7Ci0gICAgICAgICAgICBpZiggVmVyYm9zZSApCi0gICAgICAgICAgICAgICAgY291dCA8PCAibDogIiA8PCBsIDw8ICJtOiAiIDw8IG0gPDwgIiBwMGM6ICIgPDwgcDBjIDw8ICIgbnAwYzogIiA8PCBucDBjIDw8IGVuZGw7Ci0gICAgICAgIH0KLQkvL2NvdXQgPDwgOCA8PCBlbmRsOwotICAgICAgICBjcm9zc19lbnRyb3B5Kz1sb2cobWF4KHRyYWluUHJvYiwxZS0xMDApKStsb2cobWF4KG5ldC0+ZmluYWxNdWx0aXBseSwxZS0xMDApKTsKLSAgICAgICAgQXJyYXk8aW50PnZpdDsKLSAgICAgICAgZG91YmxlIHZpdGVyYmlfc2NvcmU9MS4wOwotCS8vY291dCA8PCA5IDw8IGVuZGw7Ci0gICAgICAgIGlmKCAoSE1NVHJhaW5pbmdTcGVjaWFsRmxhZ3MmMSkgKQotICAgICAgICAgICAgSE1NVml0ZXJiaSgqbmV0LGdhbW1hLHZpdCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZpdGVyYmlfc2NvcmU9SE1NUmVhbFZpdGVyYmkoKm5ldCx2aXQpOwotCS8vY291dCA8PCAxMCA8PCBlbmRsOwotICAgICAgICBmb3Ioaj0xO2o8PW07aisrKXsKLSAgICAgICAgICAgIHZpdGVyYmlfYWxpZ25tZW50W2pdPXZpdFtqLTFdKzE7Ci0gICAgICAgICAgICBpZiggdml0ZXJiaV9hbGlnbm1lbnRbal0+bCkKLSAgICAgICAgICAgICAgICB2aXRlcmJpX2FsaWdubWVudFtqXT0wOwotICAgICAgICB9Ci0JLy9jb3V0IDw8IDExIDw8IGVuZGw7Ci0gICAgICAgIHNIYW5kbGVyMS5zZXRQcm9iT2ZTZW50ZW5jZShzZW50LGNyb3NzX2VudHJvcHkpOwotCS8vY291dCA8PCAxMiA8PCBlbmRsOwotICAgICAgICBwZXJwLmFkZEZhY3Rvcihjcm9zc19lbnRyb3B5LCBzbywgbCwgbSwxKTsKLSAgICAgICAgdml0ZXJiaV9wZXJwLmFkZEZhY3Rvcihsb2codml0ZXJiaV9zY29yZSkrbG9nKG1heChuZXQtPmZpbmFsTXVsdGlwbHksMWUtMTAwKSksIHNvLCBsLCBtLDEpOwotICAgICAgICBpZiggVmVyYm9zZSApCi0gICAgICAgICAgICBjb3V0IDw8ICJWaXRlcmJpLXBlcnA6ICIgPDwgbG9nKHZpdGVyYmlfc2NvcmUpIDw8ICcgJyA8PCBsb2cobWF4KG5ldC0+ZmluYWxNdWx0aXBseSwxZS0xMDApKSA8PCAnICcgPDwgdml0ZXJiaV9zY29yZSA8PCAnICcgPDwgbmV0LT5maW5hbE11bHRpcGx5IDw8ICcgJyA8PCAqbmV0IDw8ICJnYW1tYTogIiA8PCBnYW1tYSA8PCBlbmRsOwotICAgICAgICBkZWxldGUgbmV0O25ldD0wOwotCS8vY291dCA8PCAxMyA8PCBlbmRsOwotICAgICAgICBpZiAoZHVtcF9hbGlnbm1lbnR8fChGRVdEVU1QUyYmc2VudC5nZXRTZW50ZW5jZU5vKCk8MTAwMCkgKQotICAgICAgICAgICAgcHJpbnRBbGlnblRvRmlsZShlcywgZnMsIEVsaXN0LmdldFZvY2FiTGlzdCgpLCBGbGlzdC5nZXRWb2NhYkxpc3QoKSwgb2YyLCB2aXRlcmJpX2FsaWdubWVudCwgc2VudC5nZXRTZW50ZW5jZU5vKCksIHZpdGVyYmlfc2NvcmUpOwotCS8vY291dCA8PCAxNCA8PCBlbmRsOwotICAgICAgICBhZGRBTCh2aXRlcmJpX2FsaWdubWVudCxzZW50LmdldFNlbnRlbmNlTm8oKSxsKTsgICAgCi0gICAgICAgIHBhaXJfbm8rKzsKLSAgICB9IC8qIG9mIHdoaWxlICovCi0gICAgCi0KLSAgICByZXR1cm4gOwotfQotCi0KLUNUVGFibGVEaWZmPENPVU5ULFBST0I+KiBobW06OmVtX29uZV9zdGVwKGludCBpdCl7Ci0gICAgZG91YmxlIG1pbkVycm9ycz0xLjA7aW50IG1pbkl0ZXI9MDsKLSAgICBzdHJpbmcgbW9kZWxOYW1lPSJIbW0iLHNob3J0TW9kZWxOYW1lPSJobW0iOwotICAgIGludCBkdW1wRnJlcT1Nb2RlbEhfRHVtcF9GcmVxOwotICAgIHRpbWVfdCBpdF9zdCwgc3QsIGl0X2ZuLCBmbjsKLSAgICBzdHJpbmcgdGZpbGUsIGFmaWxlLGFmaWxlaCwgbnVtYmVyLCBhbGlnbmZpbGUsIHRlc3RfYWxpZ25maWxlOwotICAgIGludCBwYWlyX25vID0gMDsKLSAgICBib29sIGR1bXBfZmlsZXMgPSBmYWxzZSA7Ci0gICAgb2ZzdHJlYW0gb2YyIDsKLSAgICBzdCA9IHRpbWUoTlVMTCkgOwotICAgIHNIYW5kbGVyMS5yZXdpbmQoKTsKLSAgICBjb3V0IDw8ICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7Ci0gICAgY291dCA8PCBtb2RlbE5hbWUgPDwgIiBUcmFpbmluZyBTdGFydGVkIGF0OiAiIDw8IG15X2N0aW1lKCZzdCk7Ci0gICAgcGFpcl9ubyA9IDA7Ci0gICAgCi0gICAgY291dCA8PCBlbmRsIDw8ICItLS0tLS0tLS0tLVxuIiA8PCBtb2RlbE5hbWUgPDwgIjogSXRlcmF0aW9uICIgPDwgaXQgPDwgJ1xuJzsKLSAgICBkdW1wX2ZpbGVzID0gdHJ1ZSA7Ly8oZHVtcEZyZXEgIT0gMCkgJiYgKChpdCAlIGR1bXBGcmVxKSA9PSAwKSAmJiAhTk9EVU1QUzsKLSAgICBudW1iZXIgPSAiIjsKLSAgICBpbnQgbiA9IGl0OwotICAgIGRvewotICAgICAgICBudW1iZXIuaW5zZXJ0KChzaXplX3QpMCwgMSwgKGNoYXIpKG4gJSAxMCArICcwJykpOwotICAgIH0gd2hpbGUoKG4gLz0gMTApID4gMCk7Ci0gICAgdGZpbGUgPSBQcmVmaXggKyAiLnQiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgIGFmaWxlID0gUHJlZml4ICsgIi5hIiArIHNob3J0TW9kZWxOYW1lICsgIi4iICsgbnVtYmVyIDsKLSAgICBhZmlsZWggPSBQcmVmaXggKyAiLmgiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgIGFsaWduZmlsZSA9IFByZWZpeCArICIuQUgiIDsKLSAgICB0ZXN0X2FsaWduZmlsZSA9IFByZWZpeCArICIudHN0LkEiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgIGNvdW50cz1ITU1UYWJsZXM8aW50LFdvcmRDbGFzc2VzPihHTE9CQUxQcm9iYWJpbGl0eUZvckVtcHR5LGV3b3JkY2xhc3Nlcyxmd29yZGNsYXNzZXMpOwotICAgIGFDb3VudFRhYmxlLmNsZWFyKCk7Ci0gICAgaW5pdEFMKCk7Ci0gICAgQ1RUYWJsZURpZmY8Q09VTlQsUFJPQj4qIGRpZmYgPWVtX2xvb3BfMShwZXJwLCBzSGFuZGxlcjEsICBkdW1wX2ZpbGVzICwgYWxpZ25maWxlLmNfc3RyKCksIHRyYWluVml0ZXJiaVBlcnAsIGZhbHNlLGl0PT0xLGl0KTsKLSAgICAKLSAgICBpZiggZXJyb3JzQUwoKTxtaW5FcnJvcnMgKXsKLSAgICAgICAgbWluRXJyb3JzPWVycm9yc0FMKCk7Ci0gICAgICAgIG1pbkl0ZXI9aXQ7Ci0gICAgfQotICAgIC8vICAgICAgICBpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpCi0vLyAgICAgICAgICAgIGVtX2xvb3AoKnRlc3RQZXJwLCAqdGVzdEhhbmRsZXIsIGR1bXBfZmlsZXMsIHRlc3RfYWxpZ25maWxlLmNfc3RyKCksICp0ZXN0Vml0ZXJiaVBlcnAsICB0cnVlLGl0PT0xLGl0KTsgCi0vLyAgICAgICAgaWYgKGR1bXBfZmlsZXMmJk91dHB1dEluQWFjaGVuRm9ybWF0PT0xKQotLy8gICAgICAgICAgICB0VGFibGUucHJpbnRDb3VudFRhYmxlKHRmaWxlLmNfc3RyKCksRWxpc3QuZ2V0Vm9jYWJMaXN0KCksRmxpc3QuZ2V0Vm9jYWJMaXN0KCksMSk7Ci0vLyAgICAgICAgdFRhYmxlLm5vcm1hbGl6ZVRhYmxlKEVsaXN0LCBGbGlzdCk7Ci0vLyAgICAgICAgYUNvdW50VGFibGUubm9ybWFsaXplKGFUYWJsZSk7Ci0vLyAgICAgICAgcHJvYnM9Y291bnRzOwotLy8gICAgICAgIGNvdXQgPDwgbW9kZWxOYW1lIDw8ICI6ICgiPDxpdDw8IikgVFJBSU4gQ1JPU1MtRU5UUk9QWSAiIDw8IHBlcnAuY3Jvc3NfZW50cm9weSgpCi0vLyAgICAgICAgICAgIDw8ICIgUEVSUExFWElUWSAiIDw8IHBlcnAucGVycGxleGl0eSgpIDw8ICdcbic7Ci0vLyAgICAgICAgaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotLy8gICAgICAgICAgICBjb3V0IDw8IG1vZGVsTmFtZSA8PCAiOiAoIjw8aXQ8PCIpIFRFU1QgQ1JPU1MtRU5UUk9QWSAiIDw8ICgqdGVzdFBlcnApLmNyb3NzX2VudHJvcHkoKQotLy8gICAgICAgICAgICA8PCAiIFBFUlBMRVhJVFkgIiA8PCAoKnRlc3RQZXJwKS5wZXJwbGV4aXR5KCkgCi0vLyAgICAgICAgICAgIDw8ICdcbic7Ci0vLyAgICAgICAgY291dCA8PCBtb2RlbE5hbWUgPDwgIjogKCI8PGl0PDwiKSBWSVRFUkJJIFRSQUlOIENST1NTLUVOVFJPUFkgIiA8PCB0cmFpblZpdGVyYmlQZXJwLmNyb3NzX2VudHJvcHkoKQotLy8gICAgICAgICAgICA8PCAiIFBFUlBMRVhJVFkgIiA8PCB0cmFpblZpdGVyYmlQZXJwLnBlcnBsZXhpdHkoKSA8PCAnXG4nOwotLy8gICAgICAgIGlmICh0ZXN0UGVycCAmJiB0ZXN0SGFuZGxlcikKLS8vICAgICAgICAgICAgY291dCA8PCBtb2RlbE5hbWUgPDwgIjogKCI8PGl0PDwiKSBWSVRFUkJJIFRFU1QgQ1JPU1MtRU5UUk9QWSAiIDw8IHRlc3RWaXRlcmJpUGVycC0+Y3Jvc3NfZW50cm9weSgpCi0vLyAgICAgICAgICAgIDw8ICIgUEVSUExFWElUWSAiIDw8IHRlc3RWaXRlcmJpUGVycC0+cGVycGxleGl0eSgpIAotLy8gICAgICAgICAgICA8PCAnXG4nOwotLy8gICAgICAgIGlmIChkdW1wX2ZpbGVzKXsKLS8vICAgICAgICAgICAgaWYoIE91dHB1dEluQWFjaGVuRm9ybWF0PT0wKQotLy8vICAgICAgICAgICAgICAgIHRUYWJsZS5wcmludFByb2JUYWJsZSh0ZmlsZS5jX3N0cigpLEVsaXN0LmdldFZvY2FiTGlzdCgpLEZsaXN0LmdldFZvY2FiTGlzdCgpLE91dHB1dEluQWFjaGVuRm9ybWF0KTsKLSAvLyAgICAgICAgICAgb2ZzdHJlYW0gYWZpbGVzdHJlYW0oYWZpbGVoLmNfc3RyKCkpOyAgICAgIAotIC8vICAgICAgICAgICBwcm9icy53cml0ZUp1bXBzKGFmaWxlc3RyZWFtKTsKLSAvLyAgICAgICAgICAgYUNvdW50VGFibGUucHJpbnRUYWJsZShhZmlsZS5jX3N0cigpKTsKLSAgICAgICAgCi0gICAgZm4gPSB0aW1lKE5VTEwpIDsKLSAgICBjb3V0IDw8IGVuZGwgPDwgIkVudGlyZSAiIDw8IG1vZGVsTmFtZSA8PCAiIFRyYWluaW5nIHRvb2s6ICIgPDwgZGlmZnRpbWUoZm4sIHN0KSA8PCAiIHNlY29uZHNcbiI7Ci0gICAgLy9jb3V0IDw8ICJ0VGFibGUgY29udGFpbnMgIiA8PCB0VGFibGUuZ2V0SGFzaCgpLmJ1Y2tldF9jb3VudCgpIAotICAgIC8vICAgICA8PCAiIGJ1Y2tldHMgYW5kICAiIDw8IHRUYWJsZS5nZXRIYXNoKCkuc2l6ZSgpIDw8ICIgZW50cmllcy4iIDsKLSAgICBjb3V0IDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwotICAgIHJldHVybiBkaWZmOwotfQotCi0KLXZvaWQgaG1tOjplbV9vbmVfc3RlcF8yKGludCBpdCxpbnQgcGFydCl7Ci0gICAgZG91YmxlIG1pbkVycm9ycz0xLjA7aW50IG1pbkl0ZXI9MDsKLSAgICBzdHJpbmcgbW9kZWxOYW1lPSJIbW0iLHNob3J0TW9kZWxOYW1lPSJobW0iOwotICAgIGludCBkdW1wRnJlcT1Nb2RlbEhfRHVtcF9GcmVxOwotICAgIHRpbWVfdCBpdF9zdCwgc3QsIGl0X2ZuLCBmbjsKLSAgICBzdHJpbmcgdGZpbGUsIGFmaWxlLGFmaWxlaCwgbnVtYmVyLCBhbGlnbmZpbGUsIHRlc3RfYWxpZ25maWxlOwotICAgIGludCBwYWlyX25vID0gMDsKLSAgICBib29sIGR1bXBfZmlsZXMgPSBmYWxzZSA7Ci0gICAgb2ZzdHJlYW0gb2YyIDsKLSAgICAKLSAgICBwYWlyX25vID0gMDsKLQotCi0gICAgZHVtcF9maWxlcyA9IHRydWUgOy8vKGR1bXBGcmVxICE9IDApICYmICgoaXQgJSBkdW1wRnJlcSkgPT0gMCkgJiYgIU5PRFVNUFM7Ci0gICAgbnVtYmVyID0gIiI7Ci0gICAgaW50IG4gPSBpdDsKLSAgICBkb3sKLSAgICAgICAgbnVtYmVyLmluc2VydCgoc2l6ZV90KTAsIDEsIChjaGFyKShuICUgMTAgKyAnMCcpKTsKLSAgICB9IHdoaWxlKChuIC89IDEwKSA+IDApOwotICAgIHRmaWxlID0gUHJlZml4ICsgIi50IiArIHNob3J0TW9kZWxOYW1lICsgIi4iICsgbnVtYmVyIDsKLSAgICBhZmlsZSA9IFByZWZpeCArICIuYSIgKyBzaG9ydE1vZGVsTmFtZSArICIuIiArIG51bWJlciA7Ci0gICAgYWZpbGVoID0gUHJlZml4ICsgIi5oIiArIHNob3J0TW9kZWxOYW1lICsgIi4iICsgbnVtYmVyIDsKLSAgICBhbGlnbmZpbGUgPSBQcmVmaXggKyAiLkFobW0uIiA7Ci0gICAgY2hhciB2WzJdOwotICAgIHZbMV0gPSAwOwotICAgIHZbMF0gPSAnMCcgKyBpdDsKLSAgICBhbGlnbmZpbGUgKz0gdjsKLSAgICBhbGlnbmZpbGUgKz0gIi5wYXJ0IjsKLSAgICB2WzBdID0gJzAnICsgcGFydDsKLSAgICBhbGlnbmZpbGUgKz0gdjsKLSAgICAKLSAgICBjb3VudHM9SE1NVGFibGVzPGludCxXb3JkQ2xhc3Nlcz4oR0xPQkFMUHJvYmFiaWxpdHlGb3JFbXB0eSxld29yZGNsYXNzZXMsZndvcmRjbGFzc2VzKTsKLSAgICBhQ291bnRUYWJsZS5jbGVhcigpOwotICAgIGluaXRBTCgpOwotICAgIGVtX2xvb3BfMihwZXJwLCBzSGFuZGxlcjEsICBkdW1wX2ZpbGVzICwgYWxpZ25maWxlLmNfc3RyKCksIHRyYWluVml0ZXJiaVBlcnAsIGZhbHNlLGl0PT0xLHBhcnQpOwotICAgIAotICAgIGlmKCBlcnJvcnNBTCgpPG1pbkVycm9ycyApewotICAgICAgICBtaW5FcnJvcnM9ZXJyb3JzQUwoKTsKLSAgICAgICAgbWluSXRlcj1pdDsKLSAgICB9Ci0gICAgcmV0dXJuIDsKLX0KLQotc3RydWN0IGhtbV9hbGlnbl9zdHJ1Y3R7Ci0gICAgaG1tICpoOwotICAgIGludCBwYXJ0OwotICAgIGludCBpdGVyOwotICAgIGludCB2YWxpZDsKLSAgICBwdGhyZWFkX3QgdGhyZWFkOwotICAgIGludCBkb25lOwotfTsKLQotdm9pZCogZW1fdGhyZWFkKHZvaWQgKmFyZyl7Ci0gICAgaG1tX2FsaWduX3N0cnVjdCAqIGhtID0gKGhtbV9hbGlnbl9zdHJ1Y3QqKSBhcmc7Ci0gICAgaG0tPmgtPmVtX29uZV9zdGVwXzIoaG0tPml0ZXIsaG0tPnBhcnQpOwotICAgIGhtLT5kb25lID0gMTsKLSAgICByZXR1cm4gaG07Ci19Ci0KLQotaW50IG11bHRpX3RocmVhZF9lbShpbnQgbm9JdGVyLCBpbnQgbm9UaHJlYWQsIGhtbSogYmFzZSl7Ci0gICAgLy8gRmlyc3QsIGRvIG9uZS1zdGVwIEVNCi0gICAgaW50IGk7Ci0gICAgaW50IGo7Ci0gICAgdGltZV90IGl0X3N0LCBzdCwgaXRfZm4sIGZuOwotICAgIGZuID0gdGltZShOVUxMKTsKLSAgICBpbnQgZHVtcEZyZXE9TW9kZWxIX0R1bXBfRnJlcTsKLSAgICBib29sIGR1bXBfZmlsZXMgPSBmYWxzZSA7Ci0gICAgc3RyaW5nIG1vZGVsTmFtZSA9ICJITU0iLHNob3J0TW9kZWxOYW1lPSJobW0iOwotICAgIHN0cmluZyB0ZmlsZSwgYWZpbGUsYWNmaWxlLGFmaWxlaCwgbnVtYmVyLCBhbGlnbmZpbGUsIHRlc3RfYWxpZ25maWxlOwotICAgIHZlY3RvcjxhbW9kZWw8Q09VTlQ+ID4gY291bnRzOwotICAgIHZlY3Rvcjxtb2RlbDIgKj4gbTI7Ci0gICAgY291bnRzLnJlc2l6ZShub1RocmVhZCk7Ci0gICAgbTIucmVzaXplKG5vVGhyZWFkKTsKLSAgICBmb3Ioaj0xO2o8bm9UaHJlYWQ7aisrKXsKLSAgICAgICAgbTJbal0gPSBuZXcgbW9kZWwyKCooKG1vZGVsMSopYmFzZSksYmFzZS0+YVRhYmxlLGNvdW50c1tqXSk7Ci0gICAgfQotICAgIHN0ICA9IHRpbWUoTlVMTCk7Ci0gICAgY291dCA8PCAiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwotICAgIGNvdXQgPDwgbW9kZWxOYW1lIDw8ICIgVHJhaW5pbmcgU3RhcnRlZCBhdDogIiA8PCBteV9jdGltZSgmc3QpOwotCi0gICAgZm9yKGk9MTtpPD1ub0l0ZXI7aSsrKXsKLSAgICAgICAgYmFzZS0+cGVycC5jbGVhcigpOwotICAgICAgICBiYXNlLT50cmFpblZpdGVyYmlQZXJwLmNsZWFyKCk7Ci0gICAgICAgIGlmIChiYXNlLT50ZXN0UGVycCAmJiBiYXNlLT50ZXN0SGFuZGxlcil7Ci0gICAgICAgICAgICBiYXNlLT50ZXN0SGFuZGxlci0+cmV3aW5kKCk7Ci0gICAgICAgICAgICBiYXNlLT50ZXN0UGVycC0+Y2xlYXIoKTsKLSAgICAgICAgICAgIGJhc2UtPnRlc3RWaXRlcmJpUGVycC0+Y2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaXRfc3QgPSB0aW1lKE5VTEwpIDsKLSAgICAgICAgCi0gICAgICAgIGNvdXQgPDwgZW5kbCA8PCAiLS0tLS0tLS0tLS1cbiIgPDwgbW9kZWxOYW1lIDw8ICI6IEl0ZXJhdGlvbiAiIDw8IGkgPDwgJ1xuJzsKLSAgICAgICAgZHVtcF9maWxlcyA9IChkdW1wRnJlcSAhPSAwKSAmJiAoKGkgJSBkdW1wRnJlcSkgPT0gMCkgJiYgIU5PRFVNUFM7Ci0gICAgICAgIGR1bXBfZmlsZXMgPSB0cnVlOwotICAgICAgICBzdHJpbmcgbnVtYmVyID0gIiI7Ci0gICAgICAgIGludCBuID0gaTsKLSAgICAgICAgZG97Ci0gICAgICAgICAgICBudW1iZXIuaW5zZXJ0KChzaXplX3QpMCwgMSwgKGNoYXIpKG4gJSAxMCArICcwJykpOwotICAgICAgICB9IHdoaWxlKChuIC89IDEwKSA+IDApOwotICAgICAgICB0ZmlsZSA9IFByZWZpeCArICIudCIgKyBzaG9ydE1vZGVsTmFtZSArICIuIiArIG51bWJlciA7Ci0gICAgICAgIGFmaWxlID0gUHJlZml4ICsgIi5hIiArIHNob3J0TW9kZWxOYW1lICsgIi4iICsgbnVtYmVyIDsKLSAgICAgICAgYWNmaWxlID0gUHJlZml4ICsgIi5hYyIgKyBzaG9ydE1vZGVsTmFtZSArICIuIiArIG51bWJlciA7Ci0gICAgICAgIGFmaWxlaCA9IFByZWZpeCArICIuaCIgKyBzaG9ydE1vZGVsTmFtZSArICIuIiArIG51bWJlciA7Ci0gICAgICAgIAotICAgICAgICBhbGlnbmZpbGUgPSBQcmVmaXggKyAiLkEiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgICAgICB0ZXN0X2FsaWduZmlsZSA9IFByZWZpeCArICIudHN0LkEiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgICAgICBiYXNlLT5pbml0QUwoKTsKLSAgICAgICAgLy8gZXhjZXB0IHRoZSBjdXJyZW50IHRocmVhZAotICAgICAgICB2ZWN0b3I8aG1tX2FsaWduX3N0cnVjdD4gYXJnczsKLSAgICAgICAgYmFzZS0+c0hhbmRsZXIxLnJld2luZCgpOwotICAgICAgICBhcmdzLnJlc2l6ZShub1RocmVhZCk7Ci0gICAgICAgIGZvcihqPTE7ajxub1RocmVhZDtqKyspewotICAgICAgICAgICAgYXJnc1tqXS5pdGVyID0gaTsKLSAgICAgICAgICAgIGFyZ3Nbal0ucGFydCA9IGo7Ci0gICAgICAgICAgICBhcmdzW2pdLmRvbmUgPSAwOwotICAgICAgICAgICAgY291bnRzW2pdLmNsZWFyKCk7Ci0gICAgICAgICAgICBhcmdzW2pdLmggPSBuZXcgaG1tKCptMltqXSxiYXNlLT5ld29yZGNsYXNzZXMsYmFzZS0+ZndvcmRjbGFzc2VzKTsKLSAgICAgICAgICAgIGFyZ3Nbal0uaC0+cHJvYnMgPSBiYXNlLT5wcm9iczsKLSAgICAgICAgICAgIGFyZ3Nbal0udmFsaWQgPSBwdGhyZWFkX2NyZWF0ZSgmKGFyZ3Nbal0udGhyZWFkKSxOVUxMLGVtX3RocmVhZCwmKGFyZ3Nbal0pKTsKLSAgICAgICAgICAgIGlmKGFyZ3Nbal0udmFsaWQpewotICAgICAgICAgICAgICAgIGNlcnIgPDwgIkVycm9yIHN0YXJ0aW5nIHRocmVhZCAiIDw8IGogPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBiYXNlLT5lbV9vbmVfc3RlcF8yKGksMCk7Ci0gICAgICAgIC8vb2ZzdHJlYW0gYWZpbGVzdHJlYW0oYWZpbGVoLmNfc3RyKCkpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgd2hpbGUoMSl7Ci0gICAgICAgICAgICBib29sIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChqPTE7ajxub1RocmVhZDtqKyspewotICAgICAgICAgICAgICAgIC8vcHRocmVhZF9qb2luKChhcmdzW2pdLnRocmVhZCksTlVMTCk7Ci0gICAgICAgICAgICAgICAgLy8gU3RhcnQgbm9ybWFsaXphdGlvbiBhcyBzb29uIGFzIHBvc3NpYmxlCi0gICAgICAgICAgICAgICAgaWYoYXJnc1tqXS5kb25lPT0xKXsKLSAgICAgICAgICAgICAgICAgICAgYXJnc1tqXS5kb25lID0gMjsKLSAgICAgICAgICAgICAgICAgICAgYmFzZS0+YUNvdW50VGFibGUubWVyZ2UoYXJnc1tqXS5oLT5hQ291bnRUYWJsZSk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvL2FmaWxlc3RyZWFtIDw8ICJCRUZPUkUgTUVSR0UiPDxlbmRsOwotICAgICAgICAgICAgICAgICAgICAvL2Jhc2UtPmNvdW50cy53cml0ZUp1bXBzKGFmaWxlc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgLy9hZmlsZXN0cmVhbSA8PCAiTUVSR0lORyI8PGVuZGw7Ci0gICAgICAgICAgICAgICAgICAgIC8vYXJnc1tqXS5oLT5jb3VudHMud3JpdGVKdW1wcyhhZmlsZXN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vYWZpbGVzdHJlYW0gPDwgIk1FUkdFRCI8PGVuZGw7IAotICAgICAgICAgICAgICAgICAgICBiYXNlLT5jb3VudHMubWVyZ2UoYXJnc1tqXS5oLT5jb3VudHMpOwotICAgICAgICAgICAgICAgICAgICAvL2Jhc2UtPmNvdW50cy53cml0ZUp1bXBzKGFmaWxlc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3Nbal0uaDsKLSAgICAgICAgICAgICAgICAgICAgYXJnc1tqXS5oID0gMDsKLSAgICAgICAgICAgICAgICB9ZWxzZSBpZihhcmdzW2pdLmRvbmU9PTIpewotICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nCi0gICAgICAgICAgICAgICAgfWVsc2UgaWYoYXJnc1tqXS5kb25lPT0wKXsKLSAgICAgICAgICAgICAgICAgICAgZG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGRvbmUpIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJhc2UtPnBlcnAucmVjb3JkKCJITU0iKTsKLSAgICAgICAgYmFzZS0+dHJhaW5WaXRlcmJpUGVycC5yZWNvcmQoIkhNTSIpOwotICAgICAgICBiYXNlLT5lcnJvclJlcG9ydEFMKGNvdXQsIkhNTSIpOwotICAgICAgICAKLSAgICAgICAgLy8gTm9ybWFsaXplCi0vLyAgICAgICAgY291dCA8PCIgV3JpdGluZyAiIDw8IGFmaWxlaCAgPDwiXG4iOwotICAgICAgICBiYXNlLT5wcm9icyA9IGJhc2UtPmNvdW50czsKLS8vICAgICAgICBjb3V0IDw8IiBXcml0aW5nICIgPDwgYWZpbGVoICA8PCJcbiI7Ci0vLyAgICAgICAgb2ZzdHJlYW0gYWZpbGVzdHJlYW0oYWZpbGVoLmNfc3RyKCkpOwotLy8gICAgICAgIGJhc2UtPnByb2JzLndyaXRlSnVtcHMoYWZpbGVzdHJlYW0pOwotICAgICAgICBiYXNlLT50VGFibGUubm9ybWFsaXplVGFibGUoYmFzZS0+RWxpc3QsIGJhc2UtPkZsaXN0KTsKLSAgICAgICAgYmFzZS0+YUNvdW50VGFibGUubm9ybWFsaXplKGJhc2UtPmFUYWJsZSk7Ci0gICAgICAgIGJhc2UtPmFDb3VudFRhYmxlLmNsZWFyKCk7IAotICAgICAgICBpZiAoYmFzZS0+dGVzdFBlcnAgJiYgYmFzZS0+dGVzdEhhbmRsZXIpCi0gICAgICAgICAgICBiYXNlLT5lbV9sb29wKCpiYXNlLT50ZXN0UGVycCwgKmJhc2UtPnRlc3RIYW5kbGVyLCBkdW1wX2ZpbGVzLCB0ZXN0X2FsaWduZmlsZS5jX3N0cigpLCAqYmFzZS0+dGVzdFZpdGVyYmlQZXJwLCAgdHJ1ZSxpPT0xLGkpOyAKLSAgICAgICAgaWYgKGR1bXBfZmlsZXMmJk91dHB1dEluQWFjaGVuRm9ybWF0PT0xKQotICAgICAgICAgICAgYmFzZS0+dFRhYmxlLnByaW50Q291bnRUYWJsZSh0ZmlsZS5jX3N0cigpLGJhc2UtPkVsaXN0LmdldFZvY2FiTGlzdCgpLGJhc2UtPkZsaXN0LmdldFZvY2FiTGlzdCgpLDEpOwotICAgICAgICBjb3V0IDw8IG1vZGVsTmFtZSA8PCAiOiAoIjw8aTw8IikgVFJBSU4gQ1JPU1MtRU5UUk9QWSAiIDw8IGJhc2UtPnBlcnAuY3Jvc3NfZW50cm9weSgpCi0gICAgICAgICAgICA8PCAiIFBFUlBMRVhJVFkgIiA8PCBiYXNlLT5wZXJwLnBlcnBsZXhpdHkoKSA8PCAnXG4nOwotICAgICAgICBpZiAoYmFzZS0+dGVzdFBlcnAgJiYgYmFzZS0+dGVzdEhhbmRsZXIpCi0gICAgICAgICAgICBjb3V0IDw8IG1vZGVsTmFtZSA8PCAiOiAoIjw8aTw8IikgVEVTVCBDUk9TUy1FTlRST1BZICIgPDwgYmFzZS0+dGVzdFBlcnAtPmNyb3NzX2VudHJvcHkoKQotICAgICAgICAgICAgPDwgIiBQRVJQTEVYSVRZICIgPDwgYmFzZS0+dGVzdFBlcnAtPnBlcnBsZXhpdHkoKSAKLSAgICAgICAgICAgIDw8ICdcbic7Ci0gICAgICAgIGNvdXQgPDwgbW9kZWxOYW1lIDw8ICI6ICgiPDxpPDwiKSBWSVRFUkJJIFRSQUlOIENST1NTLUVOVFJPUFkgIiA8PCBiYXNlLT50cmFpblZpdGVyYmlQZXJwLmNyb3NzX2VudHJvcHkoKQotICAgICAgICAgICAgPDwgIiBQRVJQTEVYSVRZICIgPDwgYmFzZS0+dHJhaW5WaXRlcmJpUGVycC5wZXJwbGV4aXR5KCkgPDwgJ1xuJzsKLSAgICAgICAgaWYgKGJhc2UtPnRlc3RQZXJwICYmIGJhc2UtPnRlc3RIYW5kbGVyKQotICAgICAgICAgICAgY291dCA8PCBtb2RlbE5hbWUgPDwgIjogKCI8PGk8PCIpIFZJVEVSQkkgVEVTVCBDUk9TUy1FTlRST1BZICIgPDwgYmFzZS0+dGVzdFZpdGVyYmlQZXJwLT5jcm9zc19lbnRyb3B5KCkKLSAgICAgICAgICAgIDw8ICIgUEVSUExFWElUWSAiIDw8IGJhc2UtPnRlc3RWaXRlcmJpUGVycC0+cGVycGxleGl0eSgpIAotICAgICAgICAgICAgPDwgJ1xuJzsKLSAgICAgICAgZHVtcF9maWxlcyA9IHRydWU7Ci0gICAgICAgIGlmIChkdW1wX2ZpbGVzKXsKLSAgICAgICAgICAgIGlmKCBPdXRwdXRJbkFhY2hlbkZvcm1hdD09MCkKLSAgICAgICAgICAgICAgICBiYXNlLT50VGFibGUucHJpbnRQcm9iVGFibGUodGZpbGUuY19zdHIoKSxiYXNlLT5FbGlzdC5nZXRWb2NhYkxpc3QoKSxiYXNlLT5GbGlzdC5nZXRWb2NhYkxpc3QoKSxPdXRwdXRJbkFhY2hlbkZvcm1hdCk7Ci0gICAgICAgICAgICBvZnN0cmVhbSBhZmlsZXN0cmVhbShhZmlsZWguY19zdHIoKSk7Ci0gICAgICAgICAgICBiYXNlLT5jb3VudHMud3JpdGVKdW1wcyhhZmlsZXN0cmVhbSk7Ci0gICAgICAgICAgICAvL2Jhc2UtPmNvdW50cy5jbGVhcigpOwotICAgICAgICAgICAgYmFzZS0+YUNvdW50VGFibGUucHJpbnRUYWJsZShhY2ZpbGUuY19zdHIoKSk7Ci0gICAgICAgICAgICBiYXNlLT5hVGFibGUucHJpbnRUYWJsZShhZmlsZS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICBpdF9mbiA9IHRpbWUoTlVMTCkgOwotICAgICAgICAKLSAgICAgICAgY291dCA8PCAiXG4iIDw8IG1vZGVsTmFtZSA8PCAiIEl0ZXJhdGlvbjogIiA8PCBpPDwgIiB0b29rOiAiIDw8Ci0gICAgICAgICAgICBkaWZmdGltZShpdF9mbiwgaXRfc3QpIDw8ICIgc2Vjb25kc1xuIjsKLSAgICAKLSAgICB9Ci0gICAgZm9yKGo9MTtqPG5vVGhyZWFkO2orKyl7Ci0gICAgICAgIGRlbGV0ZSBtMltqXTsKLSAgICB9Ci0gICAgY291dCA8PCBlbmRsIDw8ICJFbnRpcmUgIiA8PCBtb2RlbE5hbWUgPDwgIiBUcmFpbmluZyB0b29rOiAiIDw8IGRpZmZ0aW1lKGZuLCBzdCkgPDwgIiBzZWNvbmRzXG4iOwotICAgIHJldHVybiAxOwotfQotCi0KLQotI2VuZGlmCi0jaW5jbHVkZSAiSE1NVGFibGVzLmNwcCIKLXRlbXBsYXRlIGNsYXNzIEhNTVRhYmxlczxpbnQsV29yZENsYXNzZXM+OwotIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvaG1tLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9obW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxODE0NC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9obW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpZm5kZWYgX2htbV9oCi0jZGVmaW5lIF9obW1faCAxCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSAKLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgIlZlY3Rvci5oIgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpZiBfX0dOVUNfXz4yCi0jaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgotdXNpbmcgX19nbnVfY3h4OjpoYXNoX21hcDsKLSNlbHNlCi0jaW5jbHVkZSA8aGFzaF9tYXA+Ci0jZW5kaWYKLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJUVGFibGVzLmgiCi0jaW5jbHVkZSAiQVRhYmxlcy5oIiAKLSNpbmNsdWRlICJnZXRTZW50ZW5jZS5oIgotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJtb2RlbDIuaCIKLSNpbmNsdWRlICJQZXJwbGV4aXR5LmgiCi0jaW5jbHVkZSAidm9jYWIuaCIKLSNpbmNsdWRlICJXb3JkQ2xhc3Nlcy5oIgotI2luY2x1ZGUgIkhNTVRhYmxlcy5oIgotI2luY2x1ZGUgIkZvcndhcmRCYWNrd2FyZC5oIgotI2luY2x1ZGUgInR0YWJsZURpZmYuaHBwIgotCi1jbGFzcyBobW0gOiBwdWJsaWMgbW9kZWwyewotcHVibGljOgotICAgIFdvcmRDbGFzc2VzJiBld29yZGNsYXNzZXM7Ci0gICAgV29yZENsYXNzZXMmIGZ3b3JkY2xhc3NlczsKLXB1YmxpYzogICAgCi0gICAgSE1NVGFibGVzPGludCxXb3JkQ2xhc3Nlcz4gY291bnRzLHByb2JzOwotcHVibGljOgotICAgIHRlbXBsYXRlPGNsYXNzIE1BUFBFUj4KLSAgICB2b2lkIG1ha2VXb3JkQ2xhc3Nlcyhjb25zdCBNQVBQRVImbTEsY29uc3QgTUFQUEVSJm0yLHN0cmluZyBlZmlsZSxzdHJpbmcgZmZpbGUpewotICAgICAgICBpZnN0cmVhbSBlc3RybShlZmlsZS5jX3N0cigpKSxmc3RybShmZmlsZS5jX3N0cigpKTsKLSAgICAgICAgaWYoICFlc3RybSApIHsKLSAgICAgICAgICAgIGNlcnIgPDwgIkVSUk9SOiBjYW4gbm90IHJlYWQgIiA8PCBlZmlsZSA8PCBlbmRsOwotICAgICAgICB9ZWxzZQotICAgICAgICAgICAgZXdvcmRjbGFzc2VzLnJlYWQoZXN0cm0sbTEsRWxpc3QpOwotICAgICAgICBpZiggIWZzdHJtICkKLSAgICAgICAgICAgIGNlcnIgPDwgIkVSUk9SOiBjYW4gbm90IHJlYWQgIiA8PCBmZmlsZSA8PCBlbmRsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmd29yZGNsYXNzZXMucmVhZChmc3RybSxtMixGbGlzdCk7Ci0gICAgfQotICAgIGhtbShtb2RlbDImbTIsV29yZENsYXNzZXMgJmUsIFdvcmRDbGFzc2VzJiBmKTsKLSAgICB2b2lkIGluaXRpYWxpemVfdGFibGVfdW5pZm9ybWx5KHNlbnRlbmNlSGFuZGxlciYpOwotICAgIGludCBlbV93aXRoX3RyaWNrcyhpbnQgaXRlcmF0aW9ucywgYm9vbCBkdW1wQ291bnQgPSBmYWxzZSwgCi0JICAgIGNvbnN0IGNoYXIqIGR1bXBDb3VudE5hbWUgPSBOVUxMLCBib29sIHVzZVN0cmluZyA9IGZhbHNlLGJvb2wgcmVzdW1lPWZhbHNlKTsKLSAgICBDVFRhYmxlRGlmZjxDT1VOVCxQUk9CPiogZW1fb25lX3N0ZXAoaW50IGl0KTsKLSAgIC8vIHZvaWQgZW1fb25lX3N0ZXBfMihpbnQgaXQsaW50IHBhcnQpOwotICAgIHZvaWQgbG9hZF90YWJsZShjb25zdCBjaGFyKiBhbmFtZSk7Ci0KLSAgIC8vIHZvaWQgZW1fbG9vcChQZXJwbGV4aXR5JiBwZXJwLCBzZW50ZW5jZUhhbmRsZXImIHNIYW5kbGVyMSwgYm9vbCBkdW1wX2ZpbGVzLCAKLSAgICAgLy8gICAgICAgICAgICBjb25zdCBjaGFyKiBhbGlnbmZpbGUsIFBlcnBsZXhpdHkmLCBib29sIHRlc3QsYm9vbCBkb0luaXQsaW50IGl0ZXIpOwotICAgLyogQ1RUYWJsZURpZmY8Q09VTlQsUFJPQj4qIGVtX2xvb3BfMShQZXJwbGV4aXR5JiBwZXJwLCBzZW50ZW5jZUhhbmRsZXImIHNIYW5kbGVyMSwgYm9vbCBkdW1wX2ZpbGVzLCAKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWxpZ25maWxlLCBQZXJwbGV4aXR5JiwgYm9vbCB0ZXN0LGJvb2wgZG9Jbml0LGludCBpdGVyKTsqLwotICAgLyogdm9pZCBlbV9sb29wXzIoICAgIFBlcnBsZXhpdHkmIHBlcnAsIHNlbnRlbmNlSGFuZGxlciYgc0hhbmRsZXIxLCAKLQkJICBib29sIGR1bXBfYWxpZ25tZW50LCBjb25zdCBjaGFyKiBhbGlnbmZpbGUsIFBlcnBsZXhpdHkmIHZpdGVyYmlfcGVycCwgCi0JICAgICBib29sIHRlc3QsYm9vbCBkb0luaXQsaW50IHBhcnQpOyovCi0gICAgdm9pZCBlbV9sb29wKFBlcnBsZXhpdHkmIHBlcnAsIHNlbnRlbmNlSGFuZGxlciYgc0hhbmRsZXIxLCAKLSAgICAgICAgICAgICAgICAgYm9vbCBkdW1wX2FsaWdubWVudCwgY29uc3QgY2hhciogYWxpZ25maWxlLCBQZXJwbGV4aXR5JiB2aXRlcmJpX3BlcnAsIAotICAgICAgICAgICAgICAgICBib29sIHRlc3QsYm9vbCBkb0luaXQsaW50IAotICAgICAgICAgICAgICAgICApOwotICAgIHZvaWQgZW1fdGhyZWFkKGludCBpdCxzdHJpbmcgYWxpZ25maWxlLGJvb2wgZHVtcF9maWxlcyxib29sIHJlc3VtZT1mYWxzZSk7Ci0gICAgSE1NTmV0d29yayAqbWFrZUhNTU5ldHdvcmsoY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIGVzLGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JmZzLGJvb2wgZG9Jbml0KWNvbnN0OwotCXZvaWQgY2xlYXJDb3VudFRhYmxlKCk7Ci0gICAgZnJpZW5kIGNsYXNzIG1vZGVsMzsKLX07Ci0vL2ludCBtdWx0aV90aHJlYWRfZW0oaW50IG5vSXRlciwgaW50IG5vVGhyZWFkLCBobW0qIGJhc2UpOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvaG1tbm9ybS5jeHggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9obW1ub3JtLmN4eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0MzEwMi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9obW1ub3JtLmN4eAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLyBITU0gTm9ybWFsaXphdGlvbiBleGVjdXRhYmxlCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImhtbS5oIgotI2luY2x1ZGUgIlBhcmFtZXRlci5oIgotI2RlZmluZSBJVEVSX00yIDAKLSNkZWZpbmUgSVRFUl9NSCA1Ci1HTE9CQUxfUEFSQU1FVEVSMyhpbnQsTW9kZWwxX0l0ZXJhdGlvbnMsIk1vZGVsMV9JdGVyYXRpb25zIiwiTk8uIElURVJBVElPTlMgTU9ERUwgMSIsIm0xIiwibnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIE1vZGVsIDEiLFBBUkxFVl9JVEVSLDUpOwotR0xPQkFMX1BBUkFNRVRFUjMoaW50LE1vZGVsMl9JdGVyYXRpb25zLCJNb2RlbDJfSXRlcmF0aW9ucyIsIk5PLiBJVEVSQVRJT05TIE1PREVMIDIiLCJtMiIsIm51bWJlciBvZiBpdGVyYXRpb25zIGZvciBNb2RlbCAyIixQQVJMRVZfSVRFUixJVEVSX00yKTsKLUdMT0JBTF9QQVJBTUVURVIzKGludCxITU1fSXRlcmF0aW9ucywiSE1NX0l0ZXJhdGlvbnMiLCJtaCIsIm51bWJlciBvZiBpdGVyYXRpb25zIGZvciBITU0gYWxpZ25tZW50IG1vZGVsIiwibWgiLCBQQVJMRVZfSVRFUixJVEVSX01IKTsKLUdMT0JBTF9QQVJBTUVURVIzKGludCxNb2RlbDNfSXRlcmF0aW9ucywiTW9kZWwzX0l0ZXJhdGlvbnMiLCJOTy4gSVRFUkFUSU9OUyBNT0RFTCAzIiwibTMiLCJudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgTW9kZWwgMyIsUEFSTEVWX0lURVIsNSk7Ci1HTE9CQUxfUEFSQU1FVEVSMyhpbnQsTW9kZWw0X0l0ZXJhdGlvbnMsIk1vZGVsNF9JdGVyYXRpb25zIiwiTk8uIElURVJBVElPTlMgTU9ERUwgNCIsIm00IiwibnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIE1vZGVsIDQiLFBBUkxFVl9JVEVSLDUpOwotR0xPQkFMX1BBUkFNRVRFUjMoaW50LE1vZGVsNV9JdGVyYXRpb25zLCJNb2RlbDVfSXRlcmF0aW9ucyIsIk5PLiBJVEVSQVRJT05TIE1PREVMIDUiLCJtNSIsIm51bWJlciBvZiBpdGVyYXRpb25zIGZvciBNb2RlbCA1IixQQVJMRVZfSVRFUiwwKTsKLUdMT0JBTF9QQVJBTUVURVIzKGludCxNb2RlbDZfSXRlcmF0aW9ucywiTW9kZWw2X0l0ZXJhdGlvbnMiLCJOTy4gSVRFUkFUSU9OUyBNT0RFTCA2IiwibTYiLCJudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgTW9kZWwgNiIsUEFSTEVWX0lURVIsMCk7Ci0KLUdMT0JBTF9QQVJBTUVURVIoZmxvYXQsIFBST0JfU01PT1RILCJwcm9iU21vb3RoIiwicHJvYmFiaWxpdHkgc21vb3RoaW5nIChmbG9vcikgdmFsdWUgIixQQVJMRVZfT1BUSEVVUiwxZS03KTsKLUdMT0JBTF9QQVJBTUVURVIoZmxvYXQsIE1JTkNPVU5USU5DUkVBU0UsIm1pbkNvdW50SW5jcmVhc2UiLCJtaW5pbWFsIGNvdW50IGluY3JlYXNlIixQQVJMRVZfT1BUSEVVUiwxZS03KTsKLQotR0xPQkFMX1BBUkFNRVRFUjIoaW50LFRyYW5zZmVyX0R1bXBfRnJlcSwiVFJBTlNGRVIgRFVNUCBGUkVRVUVOQ1kiLCJ0MnRvMyIsIm91dHB1dDogZHVtcCBvZiB0cmFuc2ZlciBmcm9tIE1vZGVsIDIgdG8gMyIsUEFSTEVWX09VVFBVVCwwKTsKLUdMT0JBTF9QQVJBTUVURVIyKGJvb2wsVmVyYm9zZSwidmVyYm9zZSIsInYiLCIwOiBub3QgdmVyYm9zZTsgMTogdmVyYm9zZSIsUEFSTEVWX09VVFBVVCwwKTsKLUdMT0JBTF9QQVJBTUVURVIoYm9vbCxMb2csImxvZyIsIjA6IG5vIGxvZ2ZpbGU7IDE6IGxvZ2ZpbGUiLFBBUkxFVl9PVVRQVVQsMCk7Ci0KLUdMT0JBTF9QQVJBTUVURVIoZG91YmxlLFAwLCJwMCIsImZpeGVkIHZhbHVlIGZvciBwYXJhbWV0ZXIgcF8wIGluIElCTS0zLzQgKGlmIG5lZ2F0aXZlIHRoZW4gaXQgaXMgZGV0ZXJtaW5lZCBpbiB0cmFpbmluZykiLFBBUkxFVl9FTSwtMS4wKTsKLUdMT0JBTF9QQVJBTUVURVIoZG91YmxlLE01UDAsIm01cDAiLCJmaXhlZCB2YWx1ZSBmb3IgcGFyYW1ldGVyIHBfMCBpbiBJQk0tNSAoaWYgbmVnYXRpdmUgdGhlbiBpdCBpcyBkZXRlcm1pbmVkIGluIHRyYWluaW5nKSIsUEFSTEVWX0VNLC0xLjApOwotR0xPQkFMX1BBUkFNRVRFUjMoYm9vbCxQZWcsInBlZ2dpbmciLCJwIiwiRE8gUEVHR0lORz8gKFkvTikiLCIwOiBubyBwZWdnaW5nOyAxOiBkbyBwZWdnaW5nIixQQVJMRVZfRU0sMCk7Ci0KLUdMT0JBTF9QQVJBTUVURVIoc2hvcnQsT2xkQURCQUNLT0ZGLCJhZGJhY2tvZmYiLCIiLC0xLDApOwotR0xPQkFMX1BBUkFNRVRFUjIodW5zaWduZWQgaW50LE1BWF9TRU5URU5DRV9MRU5HVEgsIm1sIiwiTUFYIFNFTlRFTkNFIExFTkdUSCIsIm1heGltdW0gc2VudGVuY2UgbGVuZ3RoIiwwLE1BWF9TRU5URU5DRV9MRU5HVEhfQUxMT1dFRCk7Ci0KLUdMT0JBTF9QQVJBTUVURVIoc2hvcnQsIERlZmljaWVudERpc3RvcnRpb25Gb3JFbXB0eVdvcmQsIkRlZmljaWVudERpc3RvcnRpb25Gb3JFbXB0eVdvcmQiLCIwOiBJQk0tMy9JQk0tNCBhcyBkZXNjcmliZWQgaW4gKEJyb3duIGV0IGFsLiAxOTkzKTsgMTogZGlzdG9ydGlvbiBtb2RlbCBvZiBlbXB0eSB3b3JkIGlzIGRlZmljaWVudDsgMjogZGlzdG9yaXRvbiBtb2RlbCBvZiBlbXB0eSB3b3JkIGlzIGRlZmljaWVudCAoZGlmZmVyZW50bHkpOyBzZXR0aW5nIHRoaXMgcGFyYW1ldGVyIGFsc28gaGVscHMgdG8gYXZvaWQgdGhhdCBkdXJpbmcgSUJNLTMgYW5kIElCTS00IHRyYWluaW5nIHRvbyBtYW55IHdvcmRzIGFyZSBhbGlnbmVkIHdpdGggdGhlIGVtcHR5IHdvcmQiLFBBUkxFVl9NT0RFTFMsMCk7Ci0KLS8qKgotSGVyZSBhcmUgcGFyYW1ldGVycyB0byBzdXBwb3J0IExvYWQgbW9kZWxzIGFuZCBkdW1wIG1vZGVscwotKi8KLQotR0xPQkFMX1BBUkFNRVRFUihpbnQscmVzdGFydCwicmVzdGFydCIsIlJlc3RhcnQgdHJhaW5pbmcgZnJvbSBhIGxldmVsLDA6IE5vcm1hbCByZXN0YXJ0LCBmcm9tIG1vZGVsIDEsIDE6IE1vZGVsIDEsIDI6IE1vZGVsIDIgSW5pdCAoVXNpbmcgTW9kZWwgMSBtb2RlbCBpbnB1dCBhbmQgdHJhaW4gbW9kZWwgMiksIDM6IE1vZGVsIDIsICh1c2luZyBtb2RlbCAyIGlucHV0IGFuZCB0cmFpbiBtb2RlbCAyKSwgNCA6IEhNTSBJbml0IChVc2luZyBNb2RlbCAxIG1vZGVsIGFuZCB0cmFpbiBITU0pLCA1OiBITU0gKFVzaW5nIE1vZGVsIDIgbW9kZWwgYW5kIHRyYWluIEhNTSkgNiA6IEhNTSAoVXNpbmcgSE1NIE1vZGVsIGFuZCB0cmFpbiBITU0pLCA3OiBNb2RlbCAzIEluaXQgKFVzZSBITU0gbW9kZWwgYW5kIHRyYWluIG1vZGVsIDMpIDg6IE1vZGVsIDMgSW5pdCAoVXNlIE1vZGVsIDIgbW9kZWwgYW5kIHRyYWluIG1vZGVsIDMpIDk6IE1vZGVsIDMsIDEwOiBNb2RlbCA0IEluaXQgKFVzZSBNb2RlbCAzIG1vZGVsIGFuZCB0cmFpbiBNb2RlbCA0KSAxMTogTW9kZWwgNCBhbmQgb24sICIsUEFSTEVWX0lOUFVULDApOwotR0xPQkFMX1BBUkFNRVRFUihib29sLGR1bXBDb3VudCwiZHVtcGNvdW50IiwiV2hldGhlciB3ZSBhcmUgZ29pbmcgdG8gZHVtcCBjb3VudCAoaW4gYWRkaXRpb24gdG8pIGZpbmFsIG91dHB1dD8iLFBBUkxFVl9PVVRQVVQsZmFsc2UpOwotR0xPQkFMX1BBUkFNRVRFUihib29sLGR1bXBDb3VudFVzaW5nV29yZFN0cmluZywiZHVtcGNvdW50dXNpbmd3b3Jkc3RyaW5nIiwiSW4gY291bnQgdGFibGUsIHNob3VsZCBhY3R1YWwgd29yZCBhcHBlYXJzIG9yIGp1c3QgdGhlIGlkPyBkZWZhdWx0IGlzIGlkIixQQVJMRVZfT1VUUFVULGZhbHNlKTsKLS8vLyBFTkQKLXNob3J0IE91dHB1dEluQWFjaGVuRm9ybWF0PTA7Ci1ib29sIFRyYW5zZmVyPVRSQU5TRkVSOwotYm9vbCBUcmFuc2ZlcjJ0bzM9MDsKLXNob3J0IE5vRW1wdHlXb3JkPTA7Ci1ib29sIEZFV0RVTVBTPTA7Ci1HTE9CQUxfUEFSQU1FVEVSKGJvb2wsT05MWUFMRFVNUFMsIk9OTFlBTERVTVBTIiwiMTogZG8gbm90IHdyaXRlIGFueSBmaWxlcyIsUEFSTEVWX09VVFBVVCwwKTsKLUdMT0JBTF9QQVJBTUVURVIoc2hvcnQsTkNQVVMsIk5DUFVTIiwiTnVtYmVyIG9mIENQVVMiLFBBUkxFVl9FTSwyKTsKLUdMT0JBTF9QQVJBTUVURVIoc2hvcnQsQ29tcGFjdEFsaWdubWVudEZvcm1hdCwiQ29tcGFjdEFsaWdubWVudEZvcm1hdCIsIjA6IGRldGFpbGxlZCBhbGlnbm1lbnQgZm9ybWF0LCAxOiBjb21wYWN0IGFsaWdubWVudCBmb3JtYXQgIixQQVJMRVZfT1VUUFVULDApOwotR0xPQkFMX1BBUkFNRVRFUjIoYm9vbCxOT0RVTVBTLCJOT0RVTVBTIiwiTk8gRklMRSBEVU1QUz8gKFkvTikiLCIxOiBkbyBub3Qgd3JpdGUgYW55IGZpbGVzIixQQVJMRVZfT1VUUFVULDApOwotCi1HTE9CQUxfUEFSQU1FVEVSKFdvcmRJbmRleCwgTUFYX0ZFUlRJTElUWSwgIk1BWF9GRVJUSUxJVFkiLAotCQkibWF4aW1hbCBmZXJ0aWxpdHkgZm9yIGZlcnRpbGl0eSBtb2RlbHMiLCBQQVJMRVZfRU0sIDEwKTsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXN0cmluZyBQcmVmaXgsIExvZ0ZpbGVuYW1lLCBPUGF0aCwgVXNhZ2UsIFNvdXJjZVZvY2FiRmlsZW5hbWUsCi0JCVRhcmdldFZvY2FiRmlsZW5hbWUsIENvcnB1c0ZpbGVuYW1lLCBUZXN0Q29ycHVzRmlsZW5hbWUsIHRfRmlsZW5hbWUsCi0JCVNvdXJjZVZvY2FiQ2xhc3Nlc0ZpbGVuYW1lLCBUYXJnZXRWb2NhYkNsYXNzZXNGaWxlbmFtZSwKLQkJYV9GaWxlbmFtZSwgcDBfRmlsZW5hbWUsIGRfRmlsZW5hbWUsIG5fRmlsZW5hbWUsIGRpY3Rpb25hcnlfRmlsZW5hbWU7Ci0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSl7Ci0JaWYoYXJnYyA8IDUpewotCQljZXJyIDw8ICJVc2FnZTogIiA8PCBhcmd2WzBdIDw8ICIgdmNiMSB2Y2IyIG91dHB1dEZpbGUgYmFzZUZpbGUgW2FkZGl0aW9uYWwxIF0uLi4iIDw8IGVuZGw7Ci0JCXJldHVybiAxOwotCX0KLQlWZWN0b3I8V29yZEVudHJ5PiBldmxpc3QsZnZsaXN0OwotCXZjYkxpc3QgZVRyYWluVmNiTGlzdChldmxpc3QpLCBmVHJhaW5WY2JMaXN0KGZ2bGlzdCk7Ci0JVGFyZ2V0Vm9jYWJGaWxlbmFtZSA9IGFyZ3ZbMl07Ci0JU291cmNlVm9jYWJGaWxlbmFtZSA9IGFyZ3ZbMV07Ci0JZVRyYWluVmNiTGlzdC5zZXROYW1lKGFyZ3ZbMV0pOwotCWZUcmFpblZjYkxpc3Quc2V0TmFtZShhcmd2WzJdKTsKLQllVHJhaW5WY2JMaXN0LnJlYWRWb2NhYkxpc3QoKTsKLQlmVHJhaW5WY2JMaXN0LnJlYWRWb2NhYkxpc3QoKTsKLQlQZXJwbGV4aXR5IHRyYWluUGVycCwgdGVzdFBlcnAsIHRyYWluVml0ZXJiaVBlcnAsIHRlc3RWaXRlcmJpUGVycDsKLQl0bW9kZWw8ZmxvYXQsIGZsb2F0PiB0VGFibGU7Ci0Jc2VudGVuY2VIYW5kbGVyICpjb3JwdXMgPSBuZXcgc2VudGVuY2VIYW5kbGVyKCk7Ci0JCi0KLQltb2RlbDEgbTEoQ29ycHVzRmlsZW5hbWUuY19zdHIoKSwgZVRyYWluVmNiTGlzdCwgZlRyYWluVmNiTGlzdCwgdFRhYmxlLAotCQl0cmFpblBlcnAsICpjb3JwdXMsICZ0ZXN0UGVycCwgY29ycHVzLCB0cmFpblZpdGVyYmlQZXJwLAotCQkmdGVzdFZpdGVyYmlQZXJwKTsKLQlhbW9kZWw8ZmxvYXQ+IGFUYWJsZShmYWxzZSk7Ci0JYW1vZGVsPGZsb2F0PiBhQ291bnRUYWJsZShmYWxzZSk7Ci0JbW9kZWwyIG0yKG0xLCBhVGFibGUsIGFDb3VudFRhYmxlKTsKLQlXb3JkQ2xhc3NlcyBmcmVuY2gsZW5nbGlzaDsKLQlobW0gaChtMixlbmdsaXNoLGZyZW5jaCk7Ci0JU291cmNlVm9jYWJDbGFzc2VzRmlsZW5hbWUgPSBhcmd2WzFdOwotCVRhcmdldFZvY2FiQ2xhc3Nlc0ZpbGVuYW1lID0gYXJndlsyXTsKLQlTb3VyY2VWb2NhYkNsYXNzZXNGaWxlbmFtZSArPSAiLmNsYXNzZXMiOwotCVRhcmdldFZvY2FiQ2xhc3Nlc0ZpbGVuYW1lICs9ICIuY2xhc3NlcyI7Ci0JaC5tYWtlV29yZENsYXNzZXMobTEuRWxpc3QsIG0xLkZsaXN0LCBTb3VyY2VWb2NhYkNsYXNzZXNGaWxlbmFtZS5jX3N0cigpLCBUYXJnZXRWb2NhYkNsYXNzZXNGaWxlbmFtZS5jX3N0cigpKTsKLQlzdHJpbmcgYmFzZSA9IGFyZ3ZbNF07Ci0Jc3RyaW5nIGJhc2VBID0gYmFzZSsiLmFscGhhIjsKLQlzdHJpbmcgYmFzZUIgPSBiYXNlKyIuYmV0YSI7Ci0Jc3RyaW5nIG91dHB1dCA9IGFyZ3ZbM107Ci0Jc3RyaW5nIG91dHB1dEEgPSBvdXRwdXQrIi5hbHBoYSI7Ci0Jc3RyaW5nICBvdXRwdXRCID0gb3V0cHV0KyIuYmV0YSI7Ci0JaC5wcm9icy5yZWFkSnVtcHMoYmFzZS5jX3N0cigpLE5VTEwsYmFzZUEuY19zdHIoKSwgYmFzZUIuY19zdHIoKSk7Ci0JLy8gU3RhcnQgaXRlcmF0aW9uOgotCWZvcihpbnQgaSA9IDU7IGk8IGFyZ2MgOyBpKyspewotCQlzdHJpbmcgbmFtZSA9IGFyZ3ZbaV07Ci0JCXN0cmluZyBuYW1lQSA9IG5hbWUgKyAiLmFscGhhIjsKLQkJc3RyaW5nIG5hbWVCID0gbmFtZSArICIuYmV0YSI7Ci0JCWlmKGguY291bnRzLnJlYWRKdW1wcyhuYW1lLmNfc3RyKCksTlVMTCxuYW1lQS5jX3N0cigpLCBuYW1lQi5jX3N0cigpKSkKLQkJCWgucHJvYnMubWVyZ2UoaC5jb3VudHMpOwotCQllbHNlCi0JCQljZXJyIDw8ICJFcnJvciwgY2Fubm90IGxvYWQgbmFtZS5jX3N0cigpIjsKLQkJaC5jbGVhckNvdW50VGFibGUoKTsKLQl9Ci0JaC5wcm9icy53cml0ZUp1bXBzKG91dHB1dC5jX3N0cigpLE5VTEwsb3V0cHV0QS5jX3N0cigpLCBvdXRwdXRCLmNfc3RyKCkpOwotCWRlbGV0ZSBjb3JwdXM7Ci19Ci0KLS8vIFNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgdG8gZ2V0IGl0IGNvbXBpbGUuLgotCi1vZnN0cmVhbSBsb2dtc2c7Ci1jb25zdCBzdHJpbmcgc3RyMk51bShpbnQgbikgewotCXN0cmluZyBudW1iZXIgPSAiIjsKLQlkbyB7Ci0JCW51bWJlci5pbnNlcnQoKHNpemVfdCkwLCAxLCAoY2hhcikobiAlIDEwICsgJzAnKSk7Ci0JfSB3aGlsZSAoKG4gLz0gMTApID4gMCk7Ci0JcmV0dXJuIChudW1iZXIpOwotfQotZG91YmxlIExBTUJEQT0xLjA5OwotCi1WZWN0b3I8bWFwPCBwYWlyPGludCxpbnQ+LGNoYXIgPiA+IFJlZmVyZW5jZUFsaWdubWVudDsKLQotZG91YmxlIEVycm9yc0luQWxpZ25tZW50KGNvbnN0IG1hcDwgcGFpcjxpbnQsaW50PixjaGFyID4mcmVmZXJlbmNlLAotCQljb25zdCBWZWN0b3I8V29yZEluZGV4PiZ0ZXN0LCBpbnQgbCwgaW50Jm1pc3NpbmcsIGludCZ0b29tdWNoLAotCQlpbnQmZXZlbnRzTWlzc2luZywgaW50JmV2ZW50c1Rvb211Y2gsIGludCBwYWlyX25vKXsKLQkJCXJldHVybiAwOwotCQl9Ci0KLXZvaWQgcHJpbnRHSVpBUGFycyhvc3RyZWFtJm91dCl7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2xvZ3Byb2IuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbG9ncHJvYi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NDY0YTcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbG9ncHJvYi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLS8vICBSb3V0aW5lcyB0byBwZXJmb3JtIGludGVnZXIgZXhwb25lbnRpYWwgYXJpdGhtZXRpYy4KLS8vICBBIG51bWJlciB4IGlzIHJlcHJlc2VudGVkIGFzIG4sIHdoZXJlIHggPSBiKipuLgotLy8gIEl0IGlzIGFzc3VtZWQgdGhhdCBiID4gMSwgc29tZXRoaW5nIGxpa2UgYiA9IDEuMDAxOwotCi0jaW5jbHVkZSAibG9ncHJvYi5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci1kb3VibGUgKkxvZ1Byb2I6Om50b2YgID0gTlVMTDsgLy8gVGFibGVzIHdpbGwgYmUgaW5pdGlhbGl6ZWQKLWludCAgICpMb2dQcm9iOjphZGR0YmwgPSBOVUxMOyAvLyBpbiBJbml0aWFsaXplIGZ1bmN0aW9uLgotaW50ICAgKkxvZ1Byb2I6OnN1YnRibCA9IE5VTEw7IC8vCi0KLWNvbnN0IGludCAgICBMb2dQcm9iOjptYXhfMmJ5dGVfaW50ZWdlciA9ICAzMjc2NzsKLWNvbnN0IGludCAgICBMb2dQcm9iOjptaW5fMmJ5dGVfaW50ZWdlciA9IC0zMjc2ODsKLWNvbnN0IGRvdWJsZSBMb2dQcm9iOjpiICAgICAgPSAxLjAwMTsgICAvLyBhIGxvZ2FyaXRobSBiYXNpcwotY29uc3QgZG91YmxlIExvZ1Byb2I6OmxvZ2IyICA9IGxvZyhiKTsKLS8vY29uc3QgaW50ICAgIExvZ1Byb2I6Om5tYXggICA9IHJvdW5kKDc4LjBFMCAqIGxvZygxLjBFMSkgLyBsb2diMik7Ci1jb25zdCBpbnQgICAgTG9nUHJvYjo6bm1heCAgID0gcm91bmQoMzAwLjBFMCAqIGxvZygxLjBFMSkgLyBsb2diMik7Ci1jb25zdCBpbnQgICAgTG9nUHJvYjo6bm1pbiAgID0gLW5tYXg7Ci1jb25zdCBpbnQgICAgTG9nUHJvYjo6dGJsYm5kID0gcm91bmQobG9nKChiLTEuMEUwKS8yLjBFMCkvbG9nYjIpOwotY29uc3QgaW50ICAgIExvZ1Byb2I6Onplcm9uICA9IHJvdW5kKHBvdygoZG91YmxlKS0yLCAoZG91YmxlKTIzKSk7Ci1jb25zdCBpbnQgICAgTG9nUHJvYjo6b25lbiAgID0gMDsKLWNvbnN0IGludCAgICBMb2dQcm9iOjppbmZuICAgPSBvbmVuIC0gemVyb247Ci0KLWNvbnN0IGludCBMb2dQcm9iOjppbml0aWFsaXplZCA9IExvZ1Byb2I6OkluaXRpYWxpemUoKTsKLWNvbnN0IExvZ1Byb2IgTG9nUHJvYjo6emVybygwKTsKLWNvbnN0IExvZ1Byb2IgTG9nUHJvYjo6b25lKDEpOwotY29uc3QgTG9nUHJvYiBMb2dQcm9iOjptaW51czIoMWUtMik7Ci1jb25zdCBMb2dQcm9iIExvZ1Byb2I6Om1pbnVzNCgxZS00KTsKLWNvbnN0IExvZ1Byb2IgTG9nUHJvYjo6bWludXM2KDFlLTYpOwotY29uc3QgTG9nUHJvYiBMb2dQcm9iOjptaW51czgoMWUtOCk7Ci1jb25zdCBMb2dQcm9iIExvZ1Byb2I6Om1pbnVzMTAoMWUtMTApOwotY29uc3QgTG9nUHJvYiBMb2dQcm9iOjptaW51czEyKDFlLTEyKTsKLWNvbnN0IExvZ1Byb2IgTG9nUHJvYjo6bWludXMxNCgxZS0xNCk7Ci1jb25zdCBMb2dQcm9iIExvZ1Byb2I6Om1pbnVzMTYoMWUtMTYpOwotCi0vLyBzdGF0aWMgdGFibGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KLWludCBMb2dQcm9iOjpJbml0aWFsaXplKCkKLXsKLSAgaW50IG5ieXRlcyA9IHNpemVvZihkb3VibGUpKihubWF4LW5taW4rMSkgKyBzaXplb2YoaW50KSooMC10YmxibmQrMSk7Ci0gIHN0ZDo6Y2VyciA8PCBuYnl0ZXMgPDwgIiBieXRlcyB1c2VkIGZvciBMb2dQcm9iIHRhYmxlcyAoQysrIHZlcnNpb24pXG4iOwotICBudG9mICAgPSBuZXcgZG91YmxlW25tYXgtbm1pbisxXTsKLSAgYWRkdGJsID0gbmV3IGludFstdGJsYm5kKzFdOwotICBzdWJ0YmwgPSBuZXcgaW50Wy10YmxibmQrMV07Ci0KLSAgLy8gIGNoYXIgZmlsZW5hbWVbMjU3XTsKLSAgLy8gIHN0cmluZyBmaWxlbmFtZSA7Ci0gIC8vICBpZnN0cmVhbSBpZnM7Ci0gIC8vICBpZnMub3BlbihmaWxlbmFtZS5jX3N0cigpKTsKLSAgLy8gIGlmICghaWZzKQotICAvLyAgICB7Ci0gIGludCBpOwotICBzdGQ6OmNlcnIgPDwgIkJ1aWxkaW5nIGludGVnZXIgbG9ncyBjb252ZXJzaW9uIHRhYmxlc1xuIjsKLSAgbnRvZlswXSA9IDAgOwotICAKLSAgZm9yIChpPW5taW4rMTsgaTw9bm1heDsgKytpKSAKLSAgICB7Ci0gICAgICBkb3VibGUgeCA9IGk7Ci0gICAgICBudG9mW2ktbm1pbl0gPSBleHAoeCpsb2diMik7Ci0gICAgICAKLSAgICB9Ci0gIGZvciAoaT10YmxibmQ7IGk8PTA7ICsraSkgCi0gICAgewotICAgICAgZG91YmxlIHggPSAxLjAgKyBwb3coYiwgaSk7Ci0gICAgICBhZGR0YmxbaS10YmxibmRdID0gcm91bmQobG9nKHgpL2xvZ2IyKTsKLSAgICB9Ci0gIGRvdWJsZSBzcXJ0YiA9IGV4cCgwLjUqbG9nYjIpOwotICBmb3IgKGk9MDsgaTw9LXRibGJuZDsgKytpKSAKLSAgICB7Ci0gICAgICBkb3VibGUgeCA9IHNxcnRiICogcG93KGIsIGkpIC0gMS4wOwotICAgICAgc3VidGJsW2ldID0gcm91bmQobG9nKHgpL2xvZ2IyKTsKLSAgICB9Ci0gIC8vICAgICAgaWYgKHRvb2xzUm9vdCkKLSAgLy8JewotICAvLyAgICAgIG9mc3RyZWFtIG9mcyhmaWxlbmFtZS5jX3N0cigpKTsKLSAgLy8gICAgICBpZiAoIW9mcykKLSAgLy8JY2VyciA8PCAiQ291bGQgbm90IHdyaXRlIExvZ1Byb2IgZGF0YSB0byAiIDw8IGZpbGVuYW1lIDw8IGVuZGw7Ci0gIC8vICAgICAgZWxzZQotICAvLwl7Ci0gIC8vCSAgb2ZzLndyaXRlKChjb25zdCBjaGFyICopbnRvZiwgc2l6ZW9mKGRvdWJsZSkgKiAobm1heC1ubWluKzEpKTsKLSAgLy8JICBvZnMud3JpdGUoKGNvbnN0IGNoYXIgKilhZGR0YmwsIHNpemVvZihpbnQpICogKC10YmxibmQrMSkpOwotICAvLwkgIG9mcy53cml0ZSgoY29uc3QgY2hhciAqKXN1YnRibCwgc2l6ZW9mKGludCkgKiAoLXRibGJuZCsxKSk7Ci0gIC8vCX0KLSAgLy8gICAgfQotICAvLyAgICB9Ci0gIC8vICBlbHNlCi0gIC8vICAgIHsKLSAgLy8gICAgICBpZnMucmVhZCgoY2hhciAqKW50b2YsICAgc2l6ZW9mKGRvdWJsZSkgKiAobm1heCAtIG5taW4gKyAxKSk7Ci0gIC8vICAgICAgaWZzLnJlYWQoKGNoYXIgKilhZGR0YmwsIHNpemVvZihpbnQpICogKC10YmxibmQrMSkpOwotICAvLyAgICAgIGlmcy5yZWFkKChjaGFyICopc3VidGJsLCBzaXplb2YoaW50KSAqICgtdGJsYm5kKzEpKTsKLSAgLy8gICAgfQotICByZXR1cm4gMTsKLX0KLQotdm9pZCBMb2dQcm9iOjpGcmVlVGFibGVzKCkKLXsKLSAgIGRlbGV0ZSBbXSBhZGR0Ymw7Ci0gICBkZWxldGUgW10gc3VidGJsOwotICAgZGVsZXRlIFtdIG50b2Y7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgICAgICAgICAgIEFyaXRtZXRpYyBvcGVyYXRvcnMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotLy8gU3VidHJhY3QgdHdvIGxvZ2FyaXRobSBudW1iZXJzLiBVc2UgdGhlIGZvbGxvd2luZyBtZXRob2Q6Ci0vLyBiKipuIC0gYioqbSA9IGIqKm0oIGIqKihuLW0pIC0gMSApLCBhc3N1bWluZyBuID49IG0uIAotTG9nUHJvYiYgTG9nUHJvYjo6b3BlcmF0b3ItPShjb25zdCBMb2dQcm9iICZzdWJzKSAKLXsKLSAgaWYgKHN1YnMubG9nciA9PSB6ZXJvbikKLSAgICByZXR1cm4gKnRoaXM7Ci0gIGludCBhID0gbG9nciAtIHN1YnMubG9ncjsKLSAgaWYgKGEgPD0gMCkKLSAgICB7Ci0gICAgICBpZiAoYSA8IDApCi0JewotCSAgc3RkOjpjZXJyIDw8ICJXQVJOSU5HKGxvZ3Byb2IpOiBJbnZhbGlkIGFyZ3VtZW50cyB0byBuc3ViIiA8PCgqdGhpcyk8PCAiICIgPDwgc3VicyA8PCBzdGQ6OmVuZGw7Ci0JICAvL2Fib3J0KCk7Ci0JfQotICAgICAgbG9nciA9IHplcm9uOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgaWYgKGEgPiAtdGJsYm5kKQotICAgIHJldHVybiAqdGhpczsKLSAgbG9nciA9IHN1YnMubG9nciArIHN1YnRibFthXTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2xvZ3Byb2IuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL2xvZ3Byb2IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmYmI3Mi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9sb2dwcm9iLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0jaWZuZGVmIF9MT0dQUk9CX0gKLSNkZWZpbmUgX0xPR1BST0JfSAotCi0vLyBSb3V0aW5lcyB0byBwZXJmb3JtIGludGVnZXIgZXhwb25lbnRpYWwgYXJpdGhtZXRpYy4KLS8vIEEgbnVtYmVyIHggaXMgcmVwcmVzZW50ZWQgYXMgbiwgd2hlcmUgeCA9IGIqKm4KLS8vIEl0IGlzIGFzc3VtZWQgdGhhdCBiID4gMSwgc29tZXRoaW5nIGxpa2UgYiA9IDEuMDAxCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0vLyNkZWZpbmUgIE1BWChBLEIpICgoQSkgPiAoQikgPyAoQSkgOiAoQikpCi0vLyNkZWZpbmUgIE1JTihBLEIpICgoQSkgPiAoQikgPyAoQikgOiAoQSkpCi0KLSNpZmRlZiBXSU4zMgotI2RlZmluZSByb3VuZCh4KSBmbG9vcih4KzAuNSkKLSNlbmRpZgotY2xhc3MgTG9nUHJvYiB7Ci1wdWJsaWM6Ci0gIC8vIG1qIGZvciBjcm9zcyBlbnRyb3B5Ci0gIGRvdWJsZSBiYXNlMigpIGNvbnN0IHsKLSAgICByZXR1cm4gKGxvZ3IgKiBsb2diMiAvIGxvZygoZG91YmxlKTIpKTsKLSAgfQotICAKLSAgLy8gQ29uc3RydWN0b3JzCi0gIExvZ1Byb2IoKSA6IGxvZ3IoemVyb24pIHt9Ci0gIExvZ1Byb2IoY29uc3QgTG9nUHJvYiAmb2JqKSA6IGxvZ3Iob2JqLmxvZ3IpIHt9Ci0gIExvZ1Byb2IoZG91YmxlIHgpIDogbG9ncih4ID09IDAuMCA/IHplcm9uIDogcm91bmQobG9nKHgpL2xvZ2IyKSkge30KLSAgLy8gZGVzdHJ1Y3RvcgotICB+TG9nUHJvYigpIHt9ICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBkZXN0cnVjdG9yCi0KLSAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3QgICAgLy8gY29udmVydHMgbG9nciB0byAoZG91YmxlKSBiKipsb2dyCi0gICAgewotICAgICAgaWYgKGxvZ3IgPCBubWluKSByZXR1cm4gbnRvZlswXTsKLSAgICAgIGlmIChsb2dyID4gbm1heCkgcmV0dXJuIG50b2Zbbm1heC1ubWluXTsKLSAgICAgIHJldHVybiBudG9mW2xvZ3Itbm1pbl07Ci0gICAgfQotCi0gIExvZ1Byb2IgJm9wZXJhdG9yPShjb25zdCBMb2dQcm9iICZvYmopIHsgbG9nciA9IG9iai5sb2dyOyByZXR1cm4gKnRoaXM7IH0KLSAgaW50IG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuIGxvZ3IgPT0gemVyb247IH0KLSAgCi0gIC8vIGlvc3RyZWFtIGZyaWVuZCBzcGVjaWZpY2F0aW9ucwotICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IExvZ1Byb2IgJm9iaik7Ci0gIGZyaWVuZCBzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4oc3RkOjppc3RyZWFtJiBpcywgTG9nUHJvYiAmb2JqKTsKLSAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PD0oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgTG9nUHJvYiAmb2JqKTsKLSAgZnJpZW5kIHN0ZDo6aXN0cmVhbSYgb3BlcmF0b3I+Pj0oc3RkOjppc3RyZWFtJiBpcywgTG9nUHJvYiAmb2JqKTsKLQotICAvLyBhcml0aG1ldGljIG9wZXJhdG9ycyAKLSAgTG9nUHJvYiAmb3BlcmF0b3IrPShjb25zdCBMb2dQcm9iICZhZGQpICAgLy8gbG9ncjIgPSBsb2diICggYioqbG9ncjIgKyBiKipsb2dyMSApCi0gICAgLy8gQWRkIHR3byBudW1iZXJzIHJlcHJlc2VudGVkIGFzIGxvZ2FyaXRobXMuIFVzZSB0aGUgZm9sbG93aW5nIG1ldGhvZDoKLSAgICAvLyAgIGIqKm4gKyBiKiptID0gYioqbigxICsgYioqKG0tbikpLCBhc3N1bWluZyBuID49IG0uCi0gICAgewotICAgICAgaWYgKGFkZC5sb2dyID09IHplcm9uKQotCXJldHVybiAqdGhpczsKLSAgICAgIGlmIChsb2dyID09IHplcm9uKQotCXsKLQkgIGxvZ3IgPSBhZGQubG9ncjsKLQkgIHJldHVybiAqdGhpczsKLQl9Ci0gICAgICBpbnQgYSA9IGFkZC5sb2dyIC0gbG9ncjsKLSAgICAgIGlmIChhID4gMCkKLQl7Ci0JICBhID0gLWE7Ci0JICBsb2dyID0gYWRkLmxvZ3I7Ci0JfQotICAgICAgaWYgKGEgPCB0YmxibmQpCi0JcmV0dXJuICp0aGlzOwotICAgICAgbG9nciArPSBhZGR0YmxbYS10YmxibmRdOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICBMb2dQcm9iICZvcGVyYXRvci09KGNvbnN0IExvZ1Byb2IgJik7ICAgLy8gbG9ncjIgPSBsb2diICggYioqbG9ncjIgKyBiKipsb2dyMSApCi0gIExvZ1Byb2Igb3BlcmF0b3IqKGNvbnN0IExvZ1Byb2IgJm11bCkgY29uc3QgIC8vIGxvZ3IzID0gbG9ncjIgKyBsb2dyMQotICAgIHsKLSAgICAgIExvZ1Byb2IgcmVzdWx0OwkJLy8gc3RhcnQgb3V0IHdpdGggcmVzdWx0ID09IDAKLSAgICAgIGlmICgobG9nciAhPSB6ZXJvbikgJiYgKG11bC5sb2dyICE9IHplcm9uKSkKLQlyZXN1bHQubG9nciA9IHN0ZDo6bWF4KGxvZ3IrbXVsLmxvZ3IsIHplcm9uKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICBMb2dQcm9iIG9wZXJhdG9yKihkb3VibGUgeCkgY29uc3QgIC8vIGxvZ3IzID0gbG9ncjIgKyBsb2dyMQotICAgIHsKLSAgICAgIHJldHVybiAoKnRoaXMpKihMb2dQcm9iKXg7Ci0gICAgfQotICBMb2dQcm9iIG9wZXJhdG9yXihjb25zdCBpbnQgaSkgY29uc3QgIC8vIGxvZ3IyID0gbG9ncjEgKiBpCi0gICAgewotICAgICAgTG9nUHJvYiByZXN1bHQ7CQkvLyBzdGFydCBvdXQgd2l0aCByZXN1bHQgPT0gMAotICAgICAgLy8gICAgICBpZiAoKGxvZ3IgIT0gemVyb24pICYmIChtdWwubG9nciAhPSB6ZXJvbikpCi0gICAgICAJcmVzdWx0LmxvZ3IgPSBsb2dyICogaSA7Ci0JcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIExvZ1Byb2IgJm9wZXJhdG9yKj0oY29uc3QgTG9nUHJvYiAmbXVsKSAvLyBsb2dyMiArPSBsb2dyMQotICAgIHsgCi0gICAgICBpZiAoKGxvZ3IgPT0gemVyb24pIHx8IChtdWwubG9nciA9PSB6ZXJvbikpCi0JbG9nciA9IHplcm9uOwotICAgICAgZWxzZQotCWxvZ3IgPSBzdGQ6Om1heChsb2dyK211bC5sb2dyLCB6ZXJvbik7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICBMb2dQcm9iIG9wZXJhdG9yLyhjb25zdCBMb2dQcm9iICZkaXYpIGNvbnN0ICAvLyBsb2dyMyA9IGxvZ3IyIC1sb2dyMQotICAgIHsKLSAgICAgIExvZ1Byb2IgcmVzdWx0OwotICAgICAgaWYgKGxvZ3IgIT0gemVyb24pCi0JcmVzdWx0LmxvZ3IgPSBzdGQ6Om1heChsb2dyIC0gZGl2LmxvZ3IsIHplcm9uKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICBMb2dQcm9iICZvcGVyYXRvci89KGNvbnN0IExvZ1Byb2IgJmRpdikgLy8gbG9ncjIgLT0gbG9ncjEKLSAgICB7Ci0gICAgICBpZiAobG9nciAhPSB6ZXJvbikKLQlsb2dyID0gc3RkOjptYXgobG9nciAtIGRpdi5sb2dyLCB6ZXJvbik7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICBMb2dQcm9iIG9wZXJhdG9yKyhjb25zdCBMb2dQcm9iICZsKSBjb25zdCAvLyBsb2dyMyA9IGxvZ2IgKCBiKipsb2dyMiArIGIqKmxvZ3IxICkKLSAgICB7IExvZ1Byb2IgcmVzdWx0KCp0aGlzKTsgcmVzdWx0ICs9IGw7IHJldHVybiByZXN1bHQ7IH0KLSAgTG9nUHJvYiBvcGVyYXRvci0oY29uc3QgTG9nUHJvYiAmbCkgY29uc3QgLy8gbG9ncjMgPSBsb2diICggYioqbG9ncjIgLSBiKipsb2dyMSApCi0gICAgeyBMb2dQcm9iIHJlc3VsdCgqdGhpcyk7IHJlc3VsdCAtPSBsOyByZXR1cm4gcmVzdWx0OyB9Ci0gIExvZ1Byb2IgcG93ZXIoY29uc3QgaW50IG4pIGNvbnN0IC8vIGxvZ3IyID0gbG9ncjEgKiBpbnQKLSAgICB7IExvZ1Byb2IgcmVzdWx0KCp0aGlzKTsgcmVzdWx0LmxvZ3IgKj0gbjsgcmV0dXJuIHJlc3VsdDsgfQotICAKLSAgLy8gQ29uZGl0aW9uYWwgb3BlcmF0b3JzCi0gIGludCBvcGVyYXRvcjwoY29uc3QgTG9nUHJvYiAmb2JqKSAgY29uc3QgeyByZXR1cm4gbG9nciA8ICBvYmoubG9ncjsgfQotICBpbnQgb3BlcmF0b3I8PShjb25zdCBMb2dQcm9iICZvYmopIGNvbnN0IHsgcmV0dXJuIGxvZ3IgPD0gb2JqLmxvZ3I7IH0KLSAgaW50IG9wZXJhdG9yPihjb25zdCBMb2dQcm9iICZvYmopICBjb25zdCB7IHJldHVybiBsb2dyID4gIG9iai5sb2dyOyB9Ci0gIGludCBvcGVyYXRvcj49KGNvbnN0IExvZ1Byb2IgJm9iaikgY29uc3QgeyByZXR1cm4gbG9nciA+PSBvYmoubG9ncjsgfQotICBpbnQgb3BlcmF0b3I9PShjb25zdCBMb2dQcm9iICZvYmopIGNvbnN0IHsgcmV0dXJuIGxvZ3IgPT0gb2JqLmxvZ3I7IH0KLSAgaW50IG9wZXJhdG9yIT0oY29uc3QgTG9nUHJvYiAmb2JqKSBjb25zdCB7IHJldHVybiBsb2dyICE9IG9iai5sb2dyOyB9Ci0gIGludCBvcGVyYXRvcjwoZG91YmxlIGQpICBjb25zdCB7IHJldHVybiAoKGRvdWJsZSkqdGhpcykgPCBkOyAgfQotICBpbnQgb3BlcmF0b3I8PShkb3VibGUgZCkgY29uc3QgeyByZXR1cm4gKChkb3VibGUpKnRoaXMpIDw9IGQ7IH0KLSAgaW50IG9wZXJhdG9yPihkb3VibGUgZCkgIGNvbnN0IHsgcmV0dXJuICgoZG91YmxlKSp0aGlzKSA+ICBkOyB9Ci0gIGludCBvcGVyYXRvcj49KGRvdWJsZSBkKSBjb25zdCB7IHJldHVybiAoKGRvdWJsZSkqdGhpcykgPj0gZDsgfQotICBpbnQgb3BlcmF0b3I9PShkb3VibGUgZCkgY29uc3QgeyByZXR1cm4gKChkb3VibGUpKnRoaXMpID09IGQ7IH0KLSAgaW50IG9wZXJhdG9yIT0oZG91YmxlIGQpIGNvbnN0IHsgcmV0dXJuICgoZG91YmxlKSp0aGlzKSAhPSBkOyB9Ci0gIAotCi0gIExvZ1Byb2IgJlNldFplcm8oKSB7IGxvZ3IgPSB6ZXJvbjsgcmV0dXJuICp0aGlzOyB9IC8vIHJlcHJlc2VudGF0aW9uIG9mIDAsCi0gIExvZ1Byb2IgJlNldE9uZSgpIHsgbG9nciA9IG9uZW47IHJldHVybiAqdGhpczsgfSAgIC8vIDEsIGFuZAotICBMb2dQcm9iICZTZXRJbmYoKSB7IGxvZ3IgPSBpbmZuOyByZXR1cm4gKnRoaXM7IH0gICAvLyBpbmYgaW4gbG9nYXJpdGhtIGRvbWFpbiAKLQotcHJpdmF0ZToKLSAgaW50IGxvZ3I7CQkJLy8gYSByZXByZXNlbnRhdGlvbiBvZiBsb2dhcml0aG0KLSAgLy8gc3RhdGljIGNvbnN0YW50cwotICBzdGF0aWMgY29uc3QgIGludCAgICBpbml0aWFsaXplZDsgLy8gaW5pdGlhbGl6YXRpb24gZmxhZwotICBzdGF0aWMgY29uc3QgIGRvdWJsZSBiOwotICBzdGF0aWMgY29uc3QgIGRvdWJsZSBsb2diMjsKLSAgc3RhdGljIGNvbnN0ICBpbnQgICAgbm1pbiwgbm1heDsKLSAgc3RhdGljIGNvbnN0ICBpbnQgICAgdGJsYm5kOwotICBzdGF0aWMgY29uc3QgIGludCAgICB6ZXJvbiwgb25lbiwgaW5mbjsgIC8vIHplcm8sIG9uZSwgYW5kIGluZiBpbiBsb2cgZG9tYWluCi0gIHN0YXRpYyBjb25zdCAgaW50ICAgIG1heF8yYnl0ZV9pbnRlZ2VyLCBtaW5fMmJ5dGVfaW50ZWdlcjsKLSAgCi0gIC8vIEFyaXRobWV0aWMgY29tcHV0YXRpb24gVGFibGVzCi0gIHN0YXRpYyBkb3VibGUgKm50b2Y7Ci0gIHN0YXRpYyBpbnQgICAqYWRkdGJsOwotICBzdGF0aWMgaW50ICAgKnN1YnRibDsKLQotICBzdGF0aWMgaW50IEluaXRpYWxpemUoKTsKLQotcHVibGljOgotICBzdGF0aWMgdm9pZCBGcmVlVGFibGVzKCk7Ci0gIC8vIGNvbnN0YW50cyBmb3IgaW5pdGlhbGl6aW5nIExvZ1Byb2JzIHRvIDAgb3IgMQotICBzdGF0aWMgY29uc3QgTG9nUHJvYiB6ZXJvOwotICBzdGF0aWMgY29uc3QgTG9nUHJvYiBvbmU7Ci0gIHN0YXRpYyBjb25zdCBMb2dQcm9iIG1pbnVzMjsKLSAgc3RhdGljIGNvbnN0IExvZ1Byb2IgbWludXM0OwotICBzdGF0aWMgY29uc3QgTG9nUHJvYiBtaW51czY7Ci0gIHN0YXRpYyBjb25zdCBMb2dQcm9iIG1pbnVzODsKLSAgc3RhdGljIGNvbnN0IExvZ1Byb2IgbWludXMxMDsKLSAgc3RhdGljIGNvbnN0IExvZ1Byb2IgbWludXMxMjsKLSAgc3RhdGljIGNvbnN0IExvZ1Byb2IgbWludXMxNDsKLSAgc3RhdGljIGNvbnN0IExvZ1Byb2IgbWludXMxNjsKLX07Ci0KLS8vIGlvc3RyZWFtIGZyaWVuZCBvcGVyYXRvcnMKLWlubGluZSBzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgTG9nUHJvYiAmb2JqKQotewotICByZXR1cm4gb3MgPDwgKGRvdWJsZSkgb2JqOyAgICAgICAgIC8vIG91dHB1dCBpbiBsaW5lYXIgZG9tYWluLCBiKipsb2dyCi19Ci0KLWlubGluZSBzdGQ6OmlzdHJlYW0gJm9wZXJhdG9yPj4oc3RkOjppc3RyZWFtJiBpcywgTG9nUHJvYiAmb2JqKQotewotICBkb3VibGUgZDsKLSAgaXMgPj4gZDsKLSAgb2JqID0gZDsKLSAgcmV0dXJuIGlzOwotfQotCi1pbmxpbmUgc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8PShzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBMb2dQcm9iICZvYmopIC8vIHdyaXRlIGJpbmFyeQotewotICBvcy53cml0ZSgoY29uc3QgY2hhciAqKSZvYmoubG9nciwgc2l6ZW9mKG9iai5sb2dyKSk7Ci0gIHJldHVybiBvczsKLX0KLQotaW5saW5lIHN0ZDo6aXN0cmVhbSAmb3BlcmF0b3I+Pj0oc3RkOjppc3RyZWFtJiBpcywgTG9nUHJvYiAmb2JqKQotewotICBpcy5yZWFkKChjaGFyICopJm9iai5sb2dyLCBzaXplb2Yob2JqLmxvZ3IpKTsKLSAgcmV0dXJuIGlzOwotfQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWFpbi5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9tYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNhMjNjOS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9tYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNjIgKzAsMCBAQAotLyoKLQotIEVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLSBXcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotIFVTQS4KLQotICovCi0KLSNpbmNsdWRlIDxzdHJzdHJlYW0+Ci0jaW5jbHVkZSAiZ2V0U2VudGVuY2UuaCIKLSNpbmNsdWRlICJUVGFibGVzLmgiCi0jaW5jbHVkZSAibW9kZWwxLmgiCi0jaW5jbHVkZSAibW9kZWwyLmgiCi0jaW5jbHVkZSAibW9kZWwzLmgiCi0jaW5jbHVkZSAiaG1tLmgiCi0jaW5jbHVkZSAiZmlsZV9zcGVjLmgiCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgInZvY2FiLmgiCi0jaW5jbHVkZSAiUGVycGxleGl0eS5oIgotI2luY2x1ZGUgIkRpY3Rpb25hcnkuaCIKLSNpbmNsdWRlICJ1dGlsaXR5LmgiIAotI2luY2x1ZGUgIlBhcmFtZXRlci5oIgotI2luY2x1ZGUgIm15YXNzZXJ0LmgiCi0jaW5jbHVkZSAiRDRUYWJsZXMuaCIKLSNpbmNsdWRlICJENVRhYmxlcy5oIgotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDQuaCIKLSNpbmNsdWRlICJ0cmFuc3BhaXJfbW9kZWw1LmgiCi0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL3RocmVhZC5ocHA+Ci0KLSNkZWZpbmUgSVRFUl9NMiAwCi0jZGVmaW5lIElURVJfTUggNQotCi0vKioKLSBIZXJlIHdlIGNhbiBzZWUgdGhhdCBFdmVyeSBtb2RlbCBpcyBpdGVyYXRlZCBzZXZlcmFsIHRpbWVzLCBhbmQgd2UgZG8gbm90IG5lZWQgdG8gZG8gaXQgCi0gb24gYWxsIHRoZSBjb3Jwb3JhLCBpbnN0ZWFkIHdlIHdpbGwgb25seSBzdGFydCBhIGZldy4KLSAqLwotR0xPQkFMX1BBUkFNRVRFUjMoaW50LE1vZGVsMV9JdGVyYXRpb25zLCJNb2RlbDFfSXRlcmF0aW9ucyIsIk5PLiBJVEVSQVRJT05TIE1PREVMIDEiLCJtMSIsIm51bWJlciBvZiBpdGVyYXRpb25zIGZvciBNb2RlbCAxIixQQVJMRVZfSVRFUiw1KTsKLUdMT0JBTF9QQVJBTUVURVIzKGludCxNb2RlbDJfSXRlcmF0aW9ucywiTW9kZWwyX0l0ZXJhdGlvbnMiLCJOTy4gSVRFUkFUSU9OUyBNT0RFTCAyIiwibTIiLCJudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgTW9kZWwgMiIsUEFSTEVWX0lURVIsSVRFUl9NMik7Ci1HTE9CQUxfUEFSQU1FVEVSMyhpbnQsSE1NX0l0ZXJhdGlvbnMsIkhNTV9JdGVyYXRpb25zIiwibWgiLCJudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgSE1NIGFsaWdubWVudCBtb2RlbCIsIm1oIiwgUEFSTEVWX0lURVIsSVRFUl9NSCk7Ci1HTE9CQUxfUEFSQU1FVEVSMyhpbnQsTW9kZWwzX0l0ZXJhdGlvbnMsIk1vZGVsM19JdGVyYXRpb25zIiwiTk8uIElURVJBVElPTlMgTU9ERUwgMyIsIm0zIiwibnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIE1vZGVsIDMiLFBBUkxFVl9JVEVSLDUpOwotR0xPQkFMX1BBUkFNRVRFUjMoaW50LE1vZGVsNF9JdGVyYXRpb25zLCJNb2RlbDRfSXRlcmF0aW9ucyIsIk5PLiBJVEVSQVRJT05TIE1PREVMIDQiLCJtNCIsIm51bWJlciBvZiBpdGVyYXRpb25zIGZvciBNb2RlbCA0IixQQVJMRVZfSVRFUiw1KTsKLUdMT0JBTF9QQVJBTUVURVIzKGludCxNb2RlbDVfSXRlcmF0aW9ucywiTW9kZWw1X0l0ZXJhdGlvbnMiLCJOTy4gSVRFUkFUSU9OUyBNT0RFTCA1IiwibTUiLCJudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgTW9kZWwgNSIsUEFSTEVWX0lURVIsMCk7Ci1HTE9CQUxfUEFSQU1FVEVSMyhpbnQsTW9kZWw2X0l0ZXJhdGlvbnMsIk1vZGVsNl9JdGVyYXRpb25zIiwiTk8uIElURVJBVElPTlMgTU9ERUwgNiIsIm02IiwibnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIE1vZGVsIDYiLFBBUkxFVl9JVEVSLDApOwotCi1HTE9CQUxfUEFSQU1FVEVSKGZsb2F0LCBQUk9CX1NNT09USCwicHJvYlNtb290aCIsInByb2JhYmlsaXR5IHNtb290aGluZyAoZmxvb3IpIHZhbHVlICIsUEFSTEVWX09QVEhFVVIsMWUtNyk7Ci1HTE9CQUxfUEFSQU1FVEVSKGZsb2F0LCBNSU5DT1VOVElOQ1JFQVNFLCJtaW5Db3VudEluY3JlYXNlIiwibWluaW1hbCBjb3VudCBpbmNyZWFzZSIsUEFSTEVWX09QVEhFVVIsMWUtNyk7Ci0KLUdMT0JBTF9QQVJBTUVURVIyKGludCxUcmFuc2Zlcl9EdW1wX0ZyZXEsIlRSQU5TRkVSIERVTVAgRlJFUVVFTkNZIiwidDJ0bzMiLCJvdXRwdXQ6IGR1bXAgb2YgdHJhbnNmZXIgZnJvbSBNb2RlbCAyIHRvIDMiLFBBUkxFVl9PVVRQVVQsMCk7Ci1HTE9CQUxfUEFSQU1FVEVSMihib29sLFZlcmJvc2UsInZlcmJvc2UiLCJ2IiwiMDogbm90IHZlcmJvc2U7IDE6IHZlcmJvc2UiLFBBUkxFVl9PVVRQVVQsMCk7Ci1HTE9CQUxfUEFSQU1FVEVSKGJvb2wsTG9nLCJsb2ciLCIwOiBubyBsb2dmaWxlOyAxOiBsb2dmaWxlIixQQVJMRVZfT1VUUFVULDApOwotCi1HTE9CQUxfUEFSQU1FVEVSKGRvdWJsZSxQMCwicDAiLCJmaXhlZCB2YWx1ZSBmb3IgcGFyYW1ldGVyIHBfMCBpbiBJQk0tMy80IChpZiBuZWdhdGl2ZSB0aGVuIGl0IGlzIGRldGVybWluZWQgaW4gdHJhaW5pbmcpIixQQVJMRVZfRU0sLTEuMCk7Ci1HTE9CQUxfUEFSQU1FVEVSKGRvdWJsZSxNNVAwLCJtNXAwIiwiZml4ZWQgdmFsdWUgZm9yIHBhcmFtZXRlciBwXzAgaW4gSUJNLTUgKGlmIG5lZ2F0aXZlIHRoZW4gaXQgaXMgZGV0ZXJtaW5lZCBpbiB0cmFpbmluZykiLFBBUkxFVl9FTSwtMS4wKTsKLUdMT0JBTF9QQVJBTUVURVIzKGJvb2wsUGVnLCJwZWdnaW5nIiwicCIsIkRPIFBFR0dJTkc/IChZL04pIiwiMDogbm8gcGVnZ2luZzsgMTogZG8gcGVnZ2luZyIsUEFSTEVWX0VNLDApOwotCi1HTE9CQUxfUEFSQU1FVEVSKHNob3J0LE9sZEFEQkFDS09GRiwiYWRiYWNrb2ZmIiwiIiwtMSwwKTsKLUdMT0JBTF9QQVJBTUVURVIyKHVuc2lnbmVkIGludCxNQVhfU0VOVEVOQ0VfTEVOR1RILCJtbCIsIk1BWCBTRU5URU5DRSBMRU5HVEgiLCJtYXhpbXVtIHNlbnRlbmNlIGxlbmd0aCIsMCxNQVhfU0VOVEVOQ0VfTEVOR1RIX0FMTE9XRUQpOwotCi1HTE9CQUxfUEFSQU1FVEVSKHNob3J0LCBEZWZpY2llbnREaXN0b3J0aW9uRm9yRW1wdHlXb3JkLCJEZWZpY2llbnREaXN0b3J0aW9uRm9yRW1wdHlXb3JkIiwiMDogSUJNLTMvSUJNLTQgYXMgZGVzY3JpYmVkIGluIChCcm93biBldCBhbC4gMTk5Myk7IDE6IGRpc3RvcnRpb24gbW9kZWwgb2YgZW1wdHkgd29yZCBpcyBkZWZpY2llbnQ7IDI6IGRpc3Rvcml0b24gbW9kZWwgb2YgZW1wdHkgd29yZCBpcyBkZWZpY2llbnQgKGRpZmZlcmVudGx5KTsgc2V0dGluZyB0aGlzIHBhcmFtZXRlciBhbHNvIGhlbHBzIHRvIGF2b2lkIHRoYXQgZHVyaW5nIElCTS0zIGFuZCBJQk0tNCB0cmFpbmluZyB0b28gbWFueSB3b3JkcyBhcmUgYWxpZ25lZCB3aXRoIHRoZSBlbXB0eSB3b3JkIixQQVJMRVZfTU9ERUxTLDApOwotCi0vKioKLUhlcmUgYXJlIHBhcmFtZXRlcnMgdG8gc3VwcG9ydCBMb2FkIG1vZGVscyBhbmQgZHVtcCBtb2RlbHMKLSovCi0KLUdMT0JBTF9QQVJBTUVURVIoaW50LHJlc3RhcnQsInJlc3RhcnQiLCJSZXN0YXJ0IHRyYWluaW5nIGZyb20gYSBsZXZlbCwwOiBOb3JtYWwgcmVzdGFydCwgZnJvbSBtb2RlbCAxLCAxOiBNb2RlbCAxLCAyOiBNb2RlbCAyIEluaXQgKFVzaW5nIE1vZGVsIDEgbW9kZWwgaW5wdXQgYW5kIHRyYWluIG1vZGVsIDIpLCAzOiBNb2RlbCAyLCAodXNpbmcgbW9kZWwgMiBpbnB1dCBhbmQgdHJhaW4gbW9kZWwgMiksIDQgOiBITU0gSW5pdCAoVXNpbmcgTW9kZWwgMSBtb2RlbCBhbmQgdHJhaW4gSE1NKSwgNTogSE1NIChVc2luZyBNb2RlbCAyIG1vZGVsIGFuZCB0cmFpbiBITU0pIDYgOiBITU0gKFVzaW5nIEhNTSBNb2RlbCBhbmQgdHJhaW4gSE1NKSwgNzogTW9kZWwgMyBJbml0IChVc2UgSE1NIG1vZGVsIGFuZCB0cmFpbiBtb2RlbCAzKSA4OiBNb2RlbCAzIEluaXQgKFVzZSBNb2RlbCAyIG1vZGVsIGFuZCB0cmFpbiBtb2RlbCAzKSA5OiBNb2RlbCAzLCAxMDogTW9kZWwgNCBJbml0IChVc2UgTW9kZWwgMyBtb2RlbCBhbmQgdHJhaW4gTW9kZWwgNCkgMTE6IE1vZGVsIDQgYW5kIG9uLCAiLFBBUkxFVl9JTlBVVCwwKTsKLUdMT0JBTF9QQVJBTUVURVIoYm9vbCxkdW1wQ291bnQsImR1bXBjb3VudCIsIldoZXRoZXIgd2UgYXJlIGdvaW5nIHRvIGR1bXAgY291bnQgKGluIGFkZGl0aW9uIHRvKSBmaW5hbCBvdXRwdXQ/IixQQVJMRVZfT1VUUFVULGZhbHNlKTsKLUdMT0JBTF9QQVJBTUVURVIoYm9vbCxkdW1wQ291bnRVc2luZ1dvcmRTdHJpbmcsImR1bXBjb3VudHVzaW5nd29yZHN0cmluZyIsIkluIGNvdW50IHRhYmxlLCBzaG91bGQgYWN0dWFsIHdvcmQgYXBwZWFycyBvciBqdXN0IHRoZSBpZD8gZGVmYXVsdCBpcyBpZCIsUEFSTEVWX09VVFBVVCxmYWxzZSk7Ci0vLy8gRU5ECi1zaG9ydCBPdXRwdXRJbkFhY2hlbkZvcm1hdD0wOwotYm9vbCBUcmFuc2Zlcj1UUkFOU0ZFUjsKLWJvb2wgVHJhbnNmZXIydG8zPTA7Ci1zaG9ydCBOb0VtcHR5V29yZD0wOwotYm9vbCBGRVdEVU1QUz0wOwotR0xPQkFMX1BBUkFNRVRFUihib29sLE9OTFlBTERVTVBTLCJPTkxZQUxEVU1QUyIsIjE6IGRvIG5vdCB3cml0ZSBhbnkgZmlsZXMiLFBBUkxFVl9PVVRQVVQsMCk7Ci1HTE9CQUxfUEFSQU1FVEVSKHNob3J0LE5DUFVTLCJOQ1BVUyIsIk51bWJlciBvZiB0aHJlYWRzIHRvIGJlIGV4ZWN1dGVkLCB1c2UgMCBpZiB5b3UganVzdCB3YW50IGFsbCBDUFVzIHRvIGJlIHVzZWQiLFBBUkxFVl9FTSwwKTsKLUdMT0JBTF9QQVJBTUVURVIoc2hvcnQsQ29tcGFjdEFsaWdubWVudEZvcm1hdCwiQ29tcGFjdEFsaWdubWVudEZvcm1hdCIsIjA6IGRldGFpbGxlZCBhbGlnbm1lbnQgZm9ybWF0LCAxOiBjb21wYWN0IGFsaWdubWVudCBmb3JtYXQgIixQQVJMRVZfT1VUUFVULDApOwotR0xPQkFMX1BBUkFNRVRFUjIoYm9vbCxOT0RVTVBTLCJOT0RVTVBTIiwiTk8gRklMRSBEVU1QUz8gKFkvTikiLCIxOiBkbyBub3Qgd3JpdGUgYW55IGZpbGVzIixQQVJMRVZfT1VUUFVULDApOwotCi1HTE9CQUxfUEFSQU1FVEVSKFdvcmRJbmRleCwgTUFYX0ZFUlRJTElUWSwgIk1BWF9GRVJUSUxJVFkiLAotCQkibWF4aW1hbCBmZXJ0aWxpdHkgZm9yIGZlcnRpbGl0eSBtb2RlbHMiLCBQQVJMRVZfRU0sIDEwKTsKLQotVmVjdG9yPG1hcDwgcGFpcjxpbnQsaW50PixjaGFyID4gPiBSZWZlcmVuY2VBbGlnbm1lbnQ7Ci0KLWJvb2wgdXNlRGljdCA9IGZhbHNlOwotc3RyaW5nIENvb2N1cnJlbmNlRmlsZTsKLXN0cmluZyBQcmVmaXgsIExvZ0ZpbGVuYW1lLCBPUGF0aCwgVXNhZ2UsIFNvdXJjZVZvY2FiRmlsZW5hbWUsCi0JCVNvdXJjZVZvY2FiQ2xhc3Nlc0ZpbGVuYW1lKCIiKSwgVGFyZ2V0Vm9jYWJDbGFzc2VzRmlsZW5hbWUoIiIpLAotCQlUYXJnZXRWb2NhYkZpbGVuYW1lLCBDb3JwdXNGaWxlbmFtZSwgVGVzdENvcnB1c0ZpbGVuYW1lLCB0X0ZpbGVuYW1lLAotCQlhX0ZpbGVuYW1lLCBwMF9GaWxlbmFtZSwgZF9GaWxlbmFtZSwgbl9GaWxlbmFtZSwgZGljdGlvbmFyeV9GaWxlbmFtZTsKLQotCi0vLyBRSU46IFZhcmlhYmxlcyByZXF1aXJlZCBmb3IgcmVsb2FkaW5nIG1vZGVsIGFuZCBjb250aW51ZSB0cmFpbmluZwotCi1zdHJpbmcgcHJldl90LCBwcmV2X3AwLCBwcmV2X2EsIHByZXZfZCwgcHJldl9kNCxwcmV2X2Q0XzIsIHByZXZfaG1tLHByZXZfbjsKLQotLy8gUUlOOiBBbmQgYmVsb3cgYXJlIGZvciBjb3VudCBvdXRwdXRBbGlnbm1lbnQKLXN0cmluZyBjb3VudFByZWZpeDsKLQotTXV0ZXggbG9nbXNnX2xvY2s7Ci1vZnN0cmVhbSBsb2dtc2c7Ci1jb25zdCBzdHJpbmcgc3RyMk51bShpbnQgbikgewotCXN0cmluZyBudW1iZXIgPSAiIjsKLQlkbyB7Ci0JCW51bWJlci5pbnNlcnQoKHNpemVfdCkwLCAxLCAoY2hhcikobiAlIDEwICsgJzAnKSk7Ci0JfSB3aGlsZSAoKG4gLz0gMTApID4gMCk7Ci0JcmV0dXJuIChudW1iZXIpOwotfQotCi1kb3VibGUgTEFNQkRBPTEuMDk7Ci1zZW50ZW5jZUhhbmRsZXIgKnRlc3RDb3JwdXM9MCwgKmNvcnB1cz0wOwotUGVycGxleGl0eSB0cmFpblBlcnAsIHRlc3RQZXJwLCB0cmFpblZpdGVyYmlQZXJwLCB0ZXN0Vml0ZXJiaVBlcnA7Ci0KLXN0cmluZyBSZWFkVGFibGVQcmVmaXg7Ci0KLXZvaWQgcHJpbnRHSVpBUGFycyhvc3RyZWFtJm91dCkgewotCW91dCA8PCAiZ2VuZXJhbCBwYXJhbWV0ZXJzOlxuIgotCQkiLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKLQlwcmludFBhcnMob3V0LCBnZXRHbG9iYWxQYXJTZXQoKSwgMCk7Ci0Jb3V0IDw8ICdcbic7Ci0KLQlvdXQgPDwgIk5vLiBvZiBpdGVyYXRpb25zOlxuLSIKLQkJIi0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKLQlwcmludFBhcnMob3V0LCBnZXRHbG9iYWxQYXJTZXQoKSwgUEFSTEVWX0lURVIpOwotCW91dCA8PCAnXG4nOwotCi0Jb3V0Ci0JCQk8PCAicGFyYW1ldGVyIGZvciB2YXJpb3VzIGhldXJpc3RpY3MgaW4gR0laQSsrIGZvciBlZmZpY2llbnQgdHJhaW5pbmc6XG4iCi0JCQkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKLQlwcmludFBhcnMob3V0LCBnZXRHbG9iYWxQYXJTZXQoKSwgUEFSTEVWX09QVEhFVVIpOwotCW91dCA8PCAnXG4nOwotCi0Jb3V0IDw8ICJwYXJhbWV0ZXJzIGZvciBkZXNjcmliaW5nIHRoZSB0eXBlIGFuZCBhbW91bnQgb2Ygb3V0cHV0OlxuIgotCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7Ci0JcHJpbnRQYXJzKG91dCwgZ2V0R2xvYmFsUGFyU2V0KCksIFBBUkxFVl9PVVRQVVQpOwotCW91dCA8PCAnXG4nOwotCi0Jb3V0IDw8ICJwYXJhbWV0ZXJzIGRlc2NyaWJpbmcgaW5wdXQgZmlsZXM6XG4iCi0JCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOwotCXByaW50UGFycyhvdXQsIGdldEdsb2JhbFBhclNldCgpLCBQQVJMRVZfSU5QVVQpOwotCW91dCA8PCAnXG4nOwotCi0Jb3V0IDw8ICJzbW9vdGhpbmcgcGFyYW1ldGVyczpcbiIKLQkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKLQlwcmludFBhcnMob3V0LCBnZXRHbG9iYWxQYXJTZXQoKSwgUEFSTEVWX1NNT09USCk7Ci0Jb3V0IDw8ICdcbic7Ci0KLQlvdXQgPDwgInBhcmFtZXRlcnMgbW9kaWZ5aW5nIHRoZSBtb2RlbHM6XG4iCi0JCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKLQlwcmludFBhcnMob3V0LCBnZXRHbG9iYWxQYXJTZXQoKSwgUEFSTEVWX01PREVMUyk7Ci0Jb3V0IDw8ICdcbic7Ci0KLQlvdXQgPDwgInBhcmFtZXRlcnMgbW9kaWZ5aW5nIHRoZSBFTS1hbGdvcml0aG06XG4iCi0JCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKLQlwcmludFBhcnMob3V0LCBnZXRHbG9iYWxQYXJTZXQoKSwgUEFSTEVWX0VNKTsKLQlvdXQgPDwgJ1xuJzsKLX0KLQotY29uc3QgY2hhcipzdHJpcFBhdGgoY29uc3QgY2hhcipmdWxscGF0aCkKLS8vIHN0cmlwIHRoZSBwYXRoIGluZm8gZnJvbSB0aGUgZmlsZSBuYW1lIAotewotCWNvbnN0IGNoYXIgKnB0ciA9IGZ1bGxwYXRoICsgc3RybGVuKGZ1bGxwYXRoKSAtIDE7Ci0Jd2hpbGUgKHB0ciAmJiBwdHIgPiBmdWxscGF0aCAmJiAqcHRyICE9ICcvJykgewotCQlwdHItLTsKLQl9Ci0JaWYgKCAqcHRyPT0nLycpCi0JCXJldHVybiAocHRyKzEpOwotCWVsc2UKLQkJcmV0dXJuIHB0cjsKLX0KLQotdm9pZCBwcmludERlY29kZXJDb25maWdGaWxlKCkgewotCXN0cmluZyBkZWNvZGVyX2NvbmZpZ19maWxlID0gUHJlZml4ICsgIi5EZWNvZGVyLmNvbmZpZyI7Ci0JY2VyciA8PCAid3JpdGluZyBkZWNvZGVyIGNvbmZpZ3VyYXRpb24gZmlsZSB0byAiCi0JCQk8PCBkZWNvZGVyX2NvbmZpZ19maWxlLmNfc3RyKCkgPDwnXG4nOwotCW9mc3RyZWFtIGRlY29kZXIoZGVjb2Rlcl9jb25maWdfZmlsZS5jX3N0cigpKTsKLQlpZiAoIWRlY29kZXIpIHsKLQkJY2VyciA8PCAiXG5DYW5ub3Qgd3JpdGUgdG8gIiA8PCBkZWNvZGVyX2NvbmZpZ19maWxlIDw8J1xuJzsKLQkJZXhpdCgxKTsKLQl9Ci0JZGVjb2RlcgotCQkJPDwgIiMgVGVtcGxhdGUgZm9yIENvbmZpZ3VyYXRpb24gRmlsZSBmb3IgdGhlIFJld3JpdGUgRGVjb2RlclxuIyBTeW50YXg6XG4iCi0JCQk8PCAiIyAgICAgICAgIDxWYXJpYWJsZT4gPSA8dmFsdWU+XG4jICAgICAgICAgJyMnIGlzIHRoZSBjb21tZW50IGNoYXJhY3RlclxuIgotCQkJPDwgIiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCi0JCQk8PCAiIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKLQkJCTw8ICIjIExBTkdVQUdFIE1PREVMIEZJTEVcbiMgVGhlIGZ1bGwgcGF0aCBhbmQgZmlsZSBuYW1lIG9mIHRoZSBsYW5ndWFnZSBtb2RlbCBmaWxlOlxuIjsKLQlkZWNvZGVyIDw8ICJMYW5ndWFnZU1vZGVsRmlsZSA9XG4iOwotCi0JZGVjb2RlcgotCQkJPDwgIiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCi0JCQk8PCAiIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKLQkJCTw8ICIjIFRSQU5TTEFUSU9OIE1PREVMIEZJTEVTXG4jIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHRyYW5zbGF0aW9uIG1vZGVsIHRhYmxlcyBhcyBjcmVhdGVkXG4iCi0JCQk8PCAiIyBieSBHaXphIGFyZSBsb2NhdGVkOlxuI1xuIgotCQkJPDwgIiMgTm90ZXM6IC0gQWxsIHRyYW5zbGF0aW9uIG1vZGVsIFwic291cmNlXCIgZmlsZXMgYXJlIGFzc3VtZWQgdG8gYmUgaW5cbiIKLQkJCTw8ICIjICAgICAgICAgIFRNX1Jhd0RhdGFEaXIsIHRoZSBiaW5hcmllcyB3aWxsIGJlIHB1dCBpbiBUTV9CaW5EYXRhRGlyXG4iCi0JCQk8PCAiI1xuIyAgICAgICAgLSBBdHRlbnRpb246IFJFTEFUSVZFIFBBVEggTkFNRVMgRE8gTk9UIFdPUkshISFcbiIKLQkJCTw8ICIjXG4jICAgICAgICAtIEFic29sdXRlIHBhdGhzIChmaWxlIG5hbWUgc3RhcnRzIHdpdGggLykgd2lsbCBvdmVycmlkZVxuIgotCQkJPDwgIiMgICAgICAgICAgdGhlIGRlZmF1bHQgZGlyZWN0b3J5LlxuXG4iOwotCS8vIHN0cmlwIGZpbGUgcHJlZml4IGluZm8gYW5kIGxlYXZlIG9ubHkgdGhlIHBhdGggbmFtZSBpbiBQcmVmaXgKLQlzdHJpbmcgcGF0aCA9IFByZWZpeC5zdWJzdHIoMCwgUHJlZml4LmZpbmRfbGFzdF9vZigiLyIpKzEpOwotCWlmIChwYXRoPT0iIikKLQkJcGF0aD0iLiI7Ci0JZGVjb2RlciA8PCAiVE1fUmF3RGF0YURpciA9ICIgPDwgcGF0aCA8PCAnXG4nOwotCWRlY29kZXIgPDwgIlRNX0JpbkRhdGFEaXIgPSAiIDw8IHBhdGggPDwgJ1xuJyA8PCAnXG4nOwotCWRlY29kZXIgPDwgIiMgZmlsZSBuYW1lcyBvZiB0aGUgVE0gdGFibGVzXG4jIE5vdGVzOlxuIgotCQkJPDwgIiMgMS4gVFRhYmxlIGFuZCBJbnZlcnNUVGFibGUgYXJlIGV4cGVjdGVkIHRvIHVzZSB3b3JkIElEcyBub3RcbiIKLQkJCTw8ICIjICAgIHN0cmluZ3MgKEdpemEgcHJvZHVjZXMgYm90aCwgd2hlcmVieSB0aGUgKi5hY3R1YWwuKiBmaWxlc1xuIgotCQkJPDwgIiMgICAgdXNlIHN0cmluZ3MgYW5kIGFyZSBUSEUgV1JPTkcgQ0hPSUNFLlxuIgotCQkJPDwgIiMgMi4gRlplcm9Xb3Jkcywgb24gdGhlIG90aGVyIGhhbmQsIGlzIGEgc2ltcGxlIGxpc3Qgb2Ygc3RyaW5nc1xuIgotCQkJPDwgIiMgICAgd2l0aCBvbmUgd29yZCBwZXIgbGluZS4gVGhpcyBmaWxlIGlzIHR5cGljYWxseSBlZGl0ZWRcbiIKLQkJCTw8ICIjICAgIG1hbnVhbGx5LiBIb2VldmVyLCB0aGlzIG9uZSBsaXN0ZWQgaGVyZSBpcyBnZW5lcmF0ZWQgYnkgR0laQVxuXG4iOwotCi0JaW50IGxhc3Rtb2RlbDsKLQlpZiAoTW9kZWw1X0l0ZXJhdGlvbnM+MCkKLQkJbGFzdG1vZGVsID0gNTsKLQllbHNlIGlmIChNb2RlbDRfSXRlcmF0aW9ucz4wKQotCQlsYXN0bW9kZWwgPSA0OwotCWVsc2UgaWYgKE1vZGVsM19JdGVyYXRpb25zPjApCi0JCWxhc3Rtb2RlbCA9IDM7Ci0JZWxzZSBpZiAoTW9kZWwyX0l0ZXJhdGlvbnM+MCkKLQkJbGFzdG1vZGVsID0gMjsKLQllbHNlCi0JCWxhc3Rtb2RlbCA9IDE7Ci0Jc3RyaW5nIGxhc3RNb2RlbE5hbWUgPSBzdHIyTnVtKGxhc3Rtb2RlbCk7Ci0Jc3RyaW5nIHA9UHJlZml4ICsgIi50IiArIC8qbGFzdE1vZGVsTmFtZSovIjMiICsiLmZpbmFsIjsKLQlkZWNvZGVyIDw8ICJUVGFibGUgPSAiIDw8IHN0cmlwUGF0aChwLmNfc3RyKCkpIDw8ICdcbic7Ci0JcCA9IFByZWZpeCArICIudGkuZmluYWwiOwotCWRlY29kZXIgPDwgIkludmVyc2VUVGFibGUgPSAiIDw8IHN0cmlwUGF0aChwLmNfc3RyKCkpIDw8ICdcbic7Ci0JcD1QcmVmaXggKyAiLm4iICsgLypsYXN0TW9kZWxOYW1lKi8iMyIgKyAiLmZpbmFsIjsKLQlkZWNvZGVyIDw8ICJOVGFibGUgPSAiIDw8IHN0cmlwUGF0aChwLmNfc3RyKCkpIDw8ICdcbic7Ci0JcD1QcmVmaXggKyAiLmQiICsgLypsYXN0TW9kZWxOYW1lKi8iMyIgKyAiLmZpbmFsIjsKLQlkZWNvZGVyIDw8ICJEM1RhYmxlID0gIiA8PCBzdHJpcFBhdGgocC5jX3N0cigpKSA8PCAnXG4nOwotCXA9UHJlZml4ICsgIi5ENC5maW5hbCI7Ci0JZGVjb2RlciA8PCAiRDRUYWJsZSA9ICIgPDwgc3RyaXBQYXRoKHAuY19zdHIoKSkgPDwgJ1xuJzsKLQlwPVByZWZpeCArICIucDBfIisgLypsYXN0TW9kZWxOYW1lKi8iMyIgKyAiLmZpbmFsIjsKLQlkZWNvZGVyIDw8ICJQWmVybyA9ICIgPDwgc3RyaXBQYXRoKHAuY19zdHIoKSkgPDwgJ1xuJzsKLQlkZWNvZGVyIDw8ICJTb3VyY2UudmNiID0gIiA8PCBTb3VyY2VWb2NhYkZpbGVuYW1lIDw8ICdcbic7Ci0JZGVjb2RlciA8PCAiVGFyZ2V0LnZjYiA9ICIgPDwgVGFyZ2V0Vm9jYWJGaWxlbmFtZSA8PCAnXG4nOwotCS8vICBkZWNvZGVyIDw8ICJTb3VyY2UuY2xhc3NlcyA9ICIgPDwgU291cmNlVm9jYWJGaWxlbmFtZSArICIuY2xhc3NlcyIgPDwgJ1xuJzsKLQkvLyAgZGVjb2RlciA8PCAiVGFyZ2V0LmNsYXNzZXMgPSAiIDw8IFRhcmdldFZvY2FiRmlsZW5hbWUgKyAiLmNsYXNzZXMiIDw8J1xuJzsKLQlkZWNvZGVyIDw8ICJTb3VyY2UuY2xhc3NlcyA9ICIgPDwgU291cmNlVm9jYWJDbGFzc2VzRmlsZW5hbWUgPDwgJ1xuJzsKLQlkZWNvZGVyIDw8ICJUYXJnZXQuY2xhc3NlcyA9ICIgPDwgVGFyZ2V0Vm9jYWJDbGFzc2VzRmlsZW5hbWUgPDwnXG4nOwotCXA9UHJlZml4ICsgIi5mZTBfIisgLypsYXN0TW9kZWxOYW1lKi8iMyIgKyAiLmZpbmFsIjsKLQlkZWNvZGVyIDw8ICJGWmVyb1dvcmRzICAgICAgID0gIiA8PHN0cmlwUGF0aChwLmNfc3RyKCkpIDw8ICdcbic7Ci0KLQkvKiAgZGVjb2RlciA8PCAiIyBUcmFuc2xhdGlvbiBQYXJhbWV0ZXJzXG4iCi0JIDw8ICIjIE5vdGU6IFRyYW5zbGF0aW9uTW9kZWwgYW5kIExhbmd1YWdlTW9kZWxNb2RlIG11c3QgaGF2ZSBOVU1CRVJTIGFzXG4iCi0JIDw8ICIjIHZhbHVlcywgbm90IHdvcmRzXG4iCi0JIDw8ICIjIENPUlJFQ1Q6IExhbmd1YWdlTW9kZWxNb2RlID0gMlxuIgotCSA8PCAiIyBXUk9ORzogICBMYW5ndWFnZU1vZGVsTW9kZSA9IGJpZ3JhbXMgIyBXUk9ORywgV1JPTkcsIFdST05HISEhXG4iOwotCSBkZWNvZGVyIDw8ICJUTVdlaWdodCAgICAgICAgICA9IDAuNiAjIHdlaWdodCBvZiBUTSBmb3IgY2FsY3VsYXRpbmcgYWxpZ25tZW50IHByb2JhYmlsaXR5XG4iOwotCSBkZWNvZGVyIDw8ICJUcmFuc2xhdGlvbk1vZGVsICA9ICI8PGxhc3Rtb2RlbDw8IiAgICMgd2hpY2ggbW9kZWwgdG8gdXNlICgzIG9yIDQpXG4iOwotCSBkZWNvZGVyIDw8ICJMYW5ndWFnZU1vZGVsTW9kZSA9IDIgICAjICgyIChiaWdyYW1zKSBvciAzICh0cmlncmFtcylcblxuIjsKLQkgZGVjb2RlciA8PCAiIyBPdXRwdXQgT3B0aW9uc1xuIgotCSA8PCAiVGVsbFdoYXRZb3VBcmVEb2luZyA9IFRSVUUgIyBwcmludCBkaWFnbm9zdGljIG1lc3NhZ2VzIHRvIHN0ZGVyclxuIgotCSA8PCAiUHJpbnRPcmlnaW5hbCAgICAgICA9IFRSVUUgIyByZXBlYXQgb3JpZ2luYWwgc2VudGVuY2UgaW4gdGhlIG91dHB1dFxuIgotCSA8PCAiVG9wVHJhbnNsYXRpb25zICAgICA9IDMgICAgIyBudW1iZXIgb2YgbiBiZXN0IHRyYW5zbGF0aW9ucyB0byBiZSByZXR1cm5lZFxuIgotCSA8PCAiUHJpbnRQcm9iYWJpbGl0aWVzICA9IFRSVUUgIyBnaXZlIHRoZSBwcm9iYWJpbGl0aWVzIGZvciB0aGUgdHJhbnNsYXRpb25zXG5cbiI7Ci0JIAotCSBkZWNvZGVyIDw8ICIjIExPR0dJTkcgT1BUSU9OU1xuIgotCSA8PCAiTG9nRmlsZSA9IC0gIyBlbXB0eSBtZWFuczogbm8gbG9nLCBkYXNoIG1lYW5zOiBTVERPVVRcbiIKLQkgPDwgIkxvZ0xNID0gdHJ1ZSAjIGxvZyBsYW5ndWFnZSBtb2RlbCBsb29rdXBzXG4iCi0JIDw8ICJMb2dUTSA9IHRydWUgIyBsb2cgdHJhbnNsYXRpb24gbW9kZWwgbG9va3Vwc1xuIjsKLQkgKi8KLX0KLQotdm9pZCBwcmludEFsbFRhYmxlcyh2Y2JMaXN0JiBlVHJhaW5WY2JMaXN0LCB2Y2JMaXN0JiBlVGVzdFZjYkxpc3QsCi0JCXZjYkxpc3QmIGZUcmFpblZjYkxpc3QsIHZjYkxpc3QmIGZUZXN0VmNiTGlzdCwgbW9kZWwxJiBtMSkgewotCWNlcnIgPDwgIndyaXRpbmcgRmluYWwgdGFibGVzIHRvIERpc2sgXG4iOwotCXN0cmluZyB0X2ludl9maWxlID0gUHJlZml4ICsgIi50aS5maW5hbCI7Ci0JaWYgKCAhRkVXRFVNUFMpCi0JCW0xLmdldFRUYWJsZSgpLnByaW50UHJvYlRhYmxlSW52ZXJzZSh0X2ludl9maWxlLmNfc3RyKCksCi0JCQkJbTEuZ2V0RW5nbGlzaFZvY2FiTGlzdCgpLCBtMS5nZXRGcmVuY2hWb2NhYkxpc3QoKSwKLQkJCQltMS5nZXRFVG90YWxXQ291bnQoKSwgbTEuZ2V0RlRvdGFsV0NvdW50KCkpOwotCXRfaW52X2ZpbGUgPSBQcmVmaXggKyAiLmFjdHVhbC50aS5maW5hbCI7Ci0JaWYgKCAhRkVXRFVNUFMpCi0JCW0xLmdldFRUYWJsZSgpLnByaW50UHJvYlRhYmxlSW52ZXJzZSh0X2ludl9maWxlLmNfc3RyKCksCi0JCQkJZVRyYWluVmNiTGlzdC5nZXRWb2NhYkxpc3QoKSwgZlRyYWluVmNiTGlzdC5nZXRWb2NhYkxpc3QoKSwKLQkJCQltMS5nZXRFVG90YWxXQ291bnQoKSwgbTEuZ2V0RlRvdGFsV0NvdW50KCksIHRydWUpOwotCi0Jc3RyaW5nIHBlcnBfZmlsZW5hbWUgPSBQcmVmaXggKyAiLnBlcnAiOwotCW9mc3RyZWFtIG9mX3BlcnAocGVycF9maWxlbmFtZS5jX3N0cigpKTsKLQotCWNvdXQgPDwgIldyaXRpbmcgUEVSUExFWElUWSByZXBvcnQgdG86ICIgPDwgcGVycF9maWxlbmFtZSA8PCAnXG4nOwotCWlmICghb2ZfcGVycCkgewotCQljZXJyIDw8ICJcbkVSUk9SOiBDYW5ub3Qgd3JpdGUgdG8gIiA8PCBwZXJwX2ZpbGVuYW1lIDw8J1xuJzsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlpZiAodGVzdENvcnB1cykKLQkJZ2VuZXJhdGVQZXJwbGV4aXR5UmVwb3J0KHRyYWluUGVycCwgdGVzdFBlcnAsIHRyYWluVml0ZXJiaVBlcnAsCi0JCQkJdGVzdFZpdGVyYmlQZXJwLCBvZl9wZXJwLCAoKmNvcnB1cykuZ2V0VG90YWxOb1BhaXJzMSgpLCAoKnRlc3RDb3JwdXMpLmdldFRvdGFsTm9QYWlyczEoKSwgdHJ1ZSk7Ci0JZWxzZQotCQlnZW5lcmF0ZVBlcnBsZXhpdHlSZXBvcnQodHJhaW5QZXJwLCB0ZXN0UGVycCwgdHJhaW5WaXRlcmJpUGVycCwKLQkJCQl0ZXN0Vml0ZXJiaVBlcnAsIG9mX3BlcnAsICgqY29ycHVzKS5nZXRUb3RhbE5vUGFpcnMxKCksIDAsIHRydWUpOwotCi0Jc3RyaW5nIGVUcmFpblZjYkZpbGUgPSBQcmVmaXggKyAiLnRybi5zcmMudmNiIjsKLQlvZnN0cmVhbSBvZl9lVHJhaW5WY2IoZVRyYWluVmNiRmlsZS5jX3N0cigpKTsKLQljb3V0IDw8ICJXcml0aW5nIHNvdXJjZSB2b2NhYnVsYXJ5IGxpc3QgdG8gOiAiIDw8IGVUcmFpblZjYkZpbGUgPDwgJ1xuJzsKLQlpZiAoIW9mX2VUcmFpblZjYikgewotCQljZXJyIDw8ICJcbkVSUk9SOiBDYW5ub3Qgd3JpdGUgdG8gIiA8PCBlVHJhaW5WY2JGaWxlIDw8J1xuJzsKLQkJZXhpdCgxKTsKLQl9Ci0JZVRyYWluVmNiTGlzdC5wcmludFZvY2FiTGlzdChvZl9lVHJhaW5WY2IpIDsKLQotCXN0cmluZyBmVHJhaW5WY2JGaWxlID0gUHJlZml4ICsgIi50cm4udHJnLnZjYiI7Ci0Jb2ZzdHJlYW0gb2ZfZlRyYWluVmNiKGZUcmFpblZjYkZpbGUuY19zdHIoKSk7Ci0JY291dCA8PCAiV3JpdGluZyBzb3VyY2Ugdm9jYWJ1bGFyeSBsaXN0IHRvIDogIiA8PCBmVHJhaW5WY2JGaWxlIDw8ICdcbic7Ci0JaWYgKCFvZl9mVHJhaW5WY2IpIHsKLQkJY2VyciA8PCAiXG5FUlJPUjogQ2Fubm90IHdyaXRlIHRvICIgPDwgZlRyYWluVmNiRmlsZSA8PCdcbic7Ci0JCWV4aXQoMSk7Ci0JfQotCWZUcmFpblZjYkxpc3QucHJpbnRWb2NhYkxpc3Qob2ZfZlRyYWluVmNiKSA7Ci0KLQkvL3ByaW50IHRlc3Qgdm9jYWJ1bGFyeSBsaXN0IAotCi0Jc3RyaW5nIGVUZXN0VmNiRmlsZSA9IFByZWZpeCArICIudHN0LnNyYy52Y2IiOwotCW9mc3RyZWFtIG9mX2VUZXN0VmNiKGVUZXN0VmNiRmlsZS5jX3N0cigpKTsKLQljb3V0IDw8ICJXcml0aW5nIHNvdXJjZSB2b2NhYnVsYXJ5IGxpc3QgdG8gOiAiIDw8IGVUZXN0VmNiRmlsZSA8PCAnXG4nOwotCWlmICghb2ZfZVRlc3RWY2IpIHsKLQkJY2VyciA8PCAiXG5FUlJPUjogQ2Fubm90IHdyaXRlIHRvICIgPDwgZVRlc3RWY2JGaWxlIDw8J1xuJzsKLQkJZXhpdCgxKTsKLQl9Ci0JZVRlc3RWY2JMaXN0LnByaW50Vm9jYWJMaXN0KG9mX2VUZXN0VmNiKSA7Ci0KLQlzdHJpbmcgZlRlc3RWY2JGaWxlID0gUHJlZml4ICsgIi50c3QudHJnLnZjYiI7Ci0Jb2ZzdHJlYW0gb2ZfZlRlc3RWY2IoZlRlc3RWY2JGaWxlLmNfc3RyKCkpOwotCWNvdXQgPDwgIldyaXRpbmcgc291cmNlIHZvY2FidWxhcnkgbGlzdCB0byA6ICIgPDwgZlRlc3RWY2JGaWxlIDw8ICdcbic7Ci0JaWYgKCFvZl9mVGVzdFZjYikgewotCQljZXJyIDw8ICJcbkVSUk9SOiBDYW5ub3Qgd3JpdGUgdG8gIiA8PCBmVGVzdFZjYkZpbGUgPDwnXG4nOwotCQlleGl0KDEpOwotCX0KLQlmVGVzdFZjYkxpc3QucHJpbnRWb2NhYkxpc3Qob2ZfZlRlc3RWY2IpIDsKLQlwcmludERlY29kZXJDb25maWdGaWxlKCk7Ci0JaWYgKHRlc3RDb3JwdXMpCi0JCXByaW50T3ZlcmxhcFJlcG9ydChtMS5nZXRUVGFibGUoKSwgKnRlc3RDb3JwdXMsIGVUcmFpblZjYkxpc3QsCi0JCQkJZlRyYWluVmNiTGlzdCwgZVRlc3RWY2JMaXN0LCBmVGVzdFZjYkxpc3QpOwotCi19Ci0KLWJvb2wgcmVhZE5leHRTZW50KGlzdHJlYW0maXMsIG1hcDwgcGFpcjxpbnQsaW50PixjaGFyID4mcywgaW50Jm51bWJlcikgewotCXN0cmluZyB4OwotCWlmICggIShpcyA+PiB4KSkKLQkJcmV0dXJuIDA7Ci0JaWYgKHg9PSJTRU5UOiIpCi0JCWlzID4+IHg7Ci0JaW50IG49YXRvaSh4LmNfc3RyKCkpOwotCWlmIChudW1iZXI9PS0xKQotCQludW1iZXI9bjsKLQllbHNlIGlmIChudW1iZXIhPW4pIHsKLQkJY2VyciA8PCAiRVJST1I6IHJlYWROZXh0U2VudDogRElGRkVSRU5UIE5VTUJFUlM6ICIgPDwgbnVtYmVyIDw8ICIgIgotCQkJCTw8IG4gPDwgJ1xuJzsKLQkJcmV0dXJuIDA7Ci0JfQotCWludCBuUywgblAsIG5POwotCW5TPW5QPW5PPTA7Ci0Jd2hpbGUgKGlzID4+IHgpIHsKLQkJaWYgKHg9PSJTRU5UOiIpCi0JCQlyZXR1cm4gMTsKLQkJaW50IG4xLCBuMjsKLQkJaXMgPj4gbjEgPj4gbjI7Ci0JCW1hcDwgcGFpcjxpbnQsaW50PixjaGFyID46OmNvbnN0X2l0ZXJhdG9yIGk9cy5maW5kKHBhaXI8aW50LCBpbnQ+KG4xLAotCQkJCW4yKSk7Ci0JCWlmIChpPT1zLmVuZCgpfHxpLT5zZWNvbmQ9PSdQJykKLQkJCXNbcGFpcjxpbnQsaW50PihuMSxuMildPXhbMF07Ci0JCW1hc3NlcnQoeFswXT09J1MnfHx4WzBdPT0nUCcpOwotCQluUys9ICh4WzBdPT0nUycpOwotCQluUCs9ICh4WzBdPT0nUCcpOwotCQluTys9ICghKHhbMF09PSdTJ3x8eFswXT09J1AnKSk7Ci0JfQotCXJldHVybiAxOwotfQotCi1ib29sIGVtcHR5U2VudChtYXA8IHBhaXI8aW50LGludD4sY2hhciA+JngpIHsKLQl4ID0gbWFwPHBhaXI8aW50LGludD4sIGNoYXI+KCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUmVhZEFsaWdubWVudChjb25zdCBzdHJpbmcmeCwgVmVjdG9yPG1hcDwgcGFpcjxpbnQsaW50PixjaGFyID4gPiZhKSB7Ci0JaWZzdHJlYW0gaW5maWxlKHguY19zdHIoKSk7Ci0JYS5jbGVhcigpOwotCW1hcDwgcGFpcjxpbnQsaW50PixjaGFyID4gc2VudDsKLQlpbnQgbnVtYmVyPTA7Ci0Jd2hpbGUgKGVtcHR5U2VudChzZW50KSAmJiAocmVhZE5leHRTZW50KGluZmlsZSwgc2VudCwgbnVtYmVyKSkpIHsKLQkJaWYgKGludChhLnNpemUoKSkhPW51bWJlcikKLQkJCWNlcnIgPDwgIkVSUk9SOiBSZWFkQWxpZ25tZW50OiAiIDw8IGEuc2l6ZSgpIDw8ICIgIiA8PCBudW1iZXIKLQkJCQkJPDwgJ1xuJzsKLQkJYS5wdXNoX2JhY2soc2VudCk7Ci0JCW51bWJlcisrOwotCX0KLQljb3V0IDw8ICJSZWFkOiAiIDw8IGEuc2l6ZSgpIDw8ICIgc2VudGVuY2VzIGluIHJlZmVyZW5jZSBhbGlnbm1lbnQuIgotCQkJPDwgJ1xuJzsKLX0KLQotdm9pZCBpbml0R2xvYmFscyh2b2lkKSB7Ci0JY2VyciA8PCAiREVCVUc6IEVudGVyIjsKLQlOT0RVTVBTID0gZmFsc2U7Ci0JUHJlZml4ID0gR2V0X0ZpbGVfU3BlYygpOwotCWNlcnIgPDwgIkRFQlVHOiBQcmVmaXgiOwkKLQlMb2dGaWxlbmFtZT0gUHJlZml4ICsgIi5sb2ciOwotCWNlcnIgPDwgIkRFQlVHOiBMb2ciOwotCU1BWF9TRU5URU5DRV9MRU5HVEggPSBNQVhfU0VOVEVOQ0VfTEVOR1RIX0FMTE9XRUQ7Ci19Ci0KLXZvaWQgY29udmVydChjb25zdCBtYXA8IHBhaXI8aW50LGludD4sY2hhciA+JnJlZmVyZW5jZSwgYWxpZ25tZW50JngpIHsKLQlpbnQgbD14LmdldF9sKCk7Ci0JaW50IG09eC5nZXRfbSgpOwotCWZvciAobWFwPCBwYWlyPGludCxpbnQ+LGNoYXIgPjo6Y29uc3RfaXRlcmF0b3IgaT1yZWZlcmVuY2UuYmVnaW4oKTsgaQotCQkJIT1yZWZlcmVuY2UuZW5kKCk7ICsraSkgewotCQlpZiAoaS0+Zmlyc3QuZmlyc3QrMT5pbnQobSkpIHsKLQkJCWNlcnIgPDwgIkVSUk9SIG0gdG8gYmlnOiAiIDw8IGktPmZpcnN0LmZpcnN0IDw8ICIgIgotCQkJCQk8PCBpLT5maXJzdC5zZWNvbmQrMSA8PCAiICIgPDwgbCA8PCAiICIgPDwgbQotCQkJCQk8PCAiIGlzIHdyb25nLlxuIjsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChpLT5maXJzdC5zZWNvbmQrMT5pbnQobCkpIHsKLQkJCWNlcnIgPDwgIkVSUk9SIGwgdG8gYmlnOiAiIDw8IGktPmZpcnN0LmZpcnN0IDw8ICIgIgotCQkJCQk8PCBpLT5maXJzdC5zZWNvbmQrMSA8PCAiICIgPDwgbCA8PCAiICIgPDwgbQotCQkJCQk8PCAiIGlzIHdyb25nLlxuIjsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICh4KGktPmZpcnN0LmZpcnN0KzEpIT0wKQotCQkJY2VyciA8PCAiRVJST1I6IHBvc2l0aW9uICIgPDwgaS0+Zmlyc3QuZmlyc3QrMSA8PCAiIGFscmVhZHkgc2V0XG4iOwotCQl4LnNldChpLT5maXJzdC5maXJzdCsxLCBpLT5maXJzdC5zZWNvbmQrMSk7Ci0JfQotfQotCi1kb3VibGUgRXJyb3JzSW5BbGlnbm1lbnQoY29uc3QgbWFwPCBwYWlyPGludCxpbnQ+LGNoYXIgPiZyZWZlcmVuY2UsCi0JCWNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JnRlc3QsIGludCBsLCBpbnQmbWlzc2luZywgaW50JnRvb211Y2gsCi0JCWludCZldmVudHNNaXNzaW5nLCBpbnQmZXZlbnRzVG9vbXVjaCwgaW50IHBhaXJfbm8pIHsKLQlpbnQgZXJyPTA7Ci0JZm9yICh1bnNpZ25lZCBpbnQgaj0xOyBqPHRlc3Quc2l6ZSgpOyBqKyspIHsKLQkJaWYgKHRlc3Rbal0+MCkgewotCQkJbWFwPCBwYWlyPGludCxpbnQ+LGNoYXIgPjo6Y29uc3RfaXRlcmF0b3IgaT0KLQkJCQkJcmVmZXJlbmNlLmZpbmQobWFrZV9wYWlyKHRlc3Rbal0tMSwgai0xKSk7Ci0JCQlpZiAoaT09cmVmZXJlbmNlLmVuZCgpICkgewotCQkJCXRvb211Y2grKzsKLQkJCQllcnIrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCAhKGktPnNlY29uZD09J1MnIHx8IGktPnNlY29uZD09J1AnKSkgewotCQkJCQljZXJyIDw8ICJFUlJPUjogd3Jvbmcgc3ltYm9sIGluIHJlZmVyZW5jZSBhbGlnbm1lbnQgJyIKLQkJCQkJCQk8PCBpLT5zZWNvbmQgPDwgJyAnIDw8IGludChpLT5zZWNvbmQpIDw8ICIgbm86IiA8PCBwYWlyX25vPDwgIidcbiI7Ci0JCQkJfQotCQkJfQotCQkJZXZlbnRzVG9vbXVjaCsrOwotCQl9Ci0JfQotCWZvciAobWFwPCBwYWlyPGludCxpbnQ+LGNoYXIgPjo6Y29uc3RfaXRlcmF0b3IgaT1yZWZlcmVuY2UuYmVnaW4oKTsgaQotCQkJIT1yZWZlcmVuY2UuZW5kKCk7ICsraSkgewotCQlpZiAoaS0+c2Vjb25kPT0nUycpIHsKLQkJCXVuc2lnbmVkIGludCBKPWktPmZpcnN0LnNlY29uZCsxOwotCQkJdW5zaWduZWQgaW50IEk9aS0+Zmlyc3QuZmlyc3QrMTsKLQkJCWlmIChpbnQoSik+PWludCh0ZXN0LnNpemUoKSl8fGludChJKT5pbnQobCl8fGludChKKTwxfHxpbnQoSSk8MSkKLQkJCQljZXJyCi0JCQkJCQk8PCAiRVJST1I6IGFsaWdubWVudCBvdXRzaWRlIG9mIHJhbmdlIGluIHJlZmVyZW5jZSBhbGlnbm1lbnQiCi0JCQkJCQk8PCBKIDw8ICIgIiA8PCB0ZXN0LnNpemUoKSA8PCAiICgiIDw8IEkgPDwgIiAiIDw8IGwKLQkJCQkJCTw8ICIpIG5vOiIgPDwgcGFpcl9ubyA8PCAnXG4nOwotCQkJZWxzZSB7Ci0JCQkJaWYgKHRlc3RbSl0hPUkpIHsKLQkJCQkJbWlzc2luZysrOwotCQkJCQllcnIrKzsKLQkJCQl9Ci0JCQl9Ci0JCQlldmVudHNNaXNzaW5nKys7Ci0JCX0KLQl9Ci0JaWYgKFZlcmJvc2UpCi0JCWNvdXQgPDwgZXJyIDw8ICIgZXJyb3JzIGluIHNlbnRlbmNlXG4iOwotCWlmIChldmVudHNUb29tdWNoK2V2ZW50c01pc3NpbmcpCi0JCXJldHVybiAodG9vbXVjaCttaXNzaW5nKS8oZXZlbnRzVG9vbXVjaCtldmVudHNNaXNzaW5nKTsKLQllbHNlCi0JCXJldHVybiAxLjA7Ci19Ci0KLXZjYkxpc3QgKmdsb2JlVHJhaW5WY2JMaXN0LCAqZ2xvYmZUcmFpblZjYkxpc3Q7Ci0KLWRvdWJsZSBTdGFydFRyYWluaW5nKGludCZyZXN1bHQpIHsKLQlkb3VibGUgZXJyb3JzPTAuMDsKLQlWZWN0b3I8V29yZEVudHJ5PiBldmxpc3QsZnZsaXN0OwotCXZjYkxpc3QgZVRyYWluVmNiTGlzdChldmxpc3QpLCBmVHJhaW5WY2JMaXN0KGZ2bGlzdCk7Ci0JZ2xvYmVUcmFpblZjYkxpc3Q9JmVUcmFpblZjYkxpc3Q7Ci0JZ2xvYmZUcmFpblZjYkxpc3Q9JmZUcmFpblZjYkxpc3Q7Ci0KLQkvLyBXaGF0IGlzIGJlaW5nIGRvbmUgaGVyZT8KLQlzdHJpbmcgcmVwRmlsZW5hbWUgPSBQcmVmaXggKyAiLmdpemFjZmciOwotCW9mc3RyZWFtIG9mMihyZXBGaWxlbmFtZS5jX3N0cigpKTsKLQl3cml0ZVBhcmFtZXRlcnMob2YyLCBnZXRHbG9iYWxQYXJTZXQoKSwgLTEpIDsKLQkvLyBXcml0ZSBhbm90aGVyIGNvcHkgb2YgY29uZmlndXJlIGZpbGUKLQotCWNvdXQgPDwgInJlYWRpbmcgdm9jYWJ1bGFyeSBmaWxlcyBcbiI7Ci0JZVRyYWluVmNiTGlzdC5zZXROYW1lKFNvdXJjZVZvY2FiRmlsZW5hbWUuY19zdHIoKSk7Ci0JZlRyYWluVmNiTGlzdC5zZXROYW1lKFRhcmdldFZvY2FiRmlsZW5hbWUuY19zdHIoKSk7Ci0JZVRyYWluVmNiTGlzdC5yZWFkVm9jYWJMaXN0KCk7Ci0JZlRyYWluVmNiTGlzdC5yZWFkVm9jYWJMaXN0KCk7Ci0KLQkvLyBWb2NhYnVsYXJ5IGNhbiBiZSBvcHRpb25hbCA/IQotCi0JY291dCA8PCAiU291cmNlIHZvY2FidWxhcnkgbGlzdCBoYXMgIiA8PCBlVHJhaW5WY2JMaXN0LnVuaXFUb2tlbnMoKQotCQkJPDwgIiB1bmlxdWUgdG9rZW5zIFxuIjsKLQotCWNvdXQgPDwgIlRhcmdldCB2b2NhYnVsYXJ5IGxpc3QgaGFzICIgPDwgZlRyYWluVmNiTGlzdC51bmlxVG9rZW5zKCkKLQkJCTw8ICIgdW5pcXVlIHRva2VucyBcbiI7Ci0KLQkKLQotCWNvcnB1cyA9IG5ldyBzZW50ZW5jZUhhbmRsZXIoQ29ycHVzRmlsZW5hbWUuY19zdHIoKSwgJmVUcmFpblZjYkxpc3QsICZmVHJhaW5WY2JMaXN0KTsKLQl2Y2JMaXN0IGVUZXN0VmNiTGlzdChlVHJhaW5WY2JMaXN0KTsgLy8gQ29waWVkIGRpcmVjdGx5Ci0JdmNiTGlzdCBmVGVzdFZjYkxpc3QoZlRyYWluVmNiTGlzdCk7Ci0JLy8gVGhpcyBwb3J0aW9uIG9mIGNvZGUgc2hvdWxkIG5vdCBiZSBjb3BpZWQgdG8gbW9kZWwgb25lCi0JLy8gdHJhaW5pbmcKLQlpZiAoVGVzdENvcnB1c0ZpbGVuYW1lID09ICJOT05FIikKLQkJVGVzdENvcnB1c0ZpbGVuYW1lID0gIiI7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1PRFVMRV9URVNUX1NUQVJUIC8vLy8vLy8vLy8vLy8vLy8vLwotCWlmIChUZXN0Q29ycHVzRmlsZW5hbWUgIT0gIiIpIHsKLQkJY291dCA8PCAiVGVzdCBjb3JwdXMgd2lsbCBiZSByZWFkIGZyb206ICIgPDwgVGVzdENvcnB1c0ZpbGVuYW1lIDw8ICdcbic7Ci0KLQkJdGVzdENvcnB1cz0gbmV3IHNlbnRlbmNlSGFuZGxlcigKLQkJCQlUZXN0Q29ycHVzRmlsZW5hbWUuY19zdHIoKSwKLQkJCQkmZVRlc3RWY2JMaXN0LCAmZlRlc3RWY2JMaXN0KTsKLQotCQljb3V0IDw8ICIgVGVzdCB0b3RhbCAjIHNlbnRlbmNlIHBhaXJzIDogIiA8PCgqdGVzdENvcnB1cykuZ2V0VG90YWxOb1BhaXJzMSgpIDw8IiB3ZWlnaHRlZDoiIDw8KCp0ZXN0Q29ycHVzKS5nZXRUb3RhbE5vUGFpcnMyKCkgPDwnXG4nOwotCi0JCWNvdXQgPDwgIlNpemUgb2YgdGhlIHNvdXJjZSBwb3J0aW9uIG9mIHRlc3QgY29ycHVzOiAiCi0JCQkJPDwgZVRlc3RWY2JMaXN0LnRvdGFsVm9jYWIoKSA8PCAiIHRva2Vuc1xuIjsKLQkJY291dCA8PCAiU2l6ZSBvZiB0aGUgdGFyZ2V0IHBvcnRpb24gb2YgdGVzdCBjb3JwdXM6ICIKLQkJCQk8PCBmVGVzdFZjYkxpc3QudG90YWxWb2NhYigpIDw8ICIgdG9rZW5zIFxuIjsKLQkJY291dCA8PCAiSW4gc291cmNlIHBvcnRpb24gb2YgdGhlIHRlc3QgY29ycHVzLCBvbmx5ICIKLQkJCQk8PCBlVGVzdFZjYkxpc3QudW5pcVRva2Vuc0luQ29ycHVzKCkKLQkJCQk8PCAiIHVuaXF1ZSB0b2tlbnMgYXBwZWFyZWRcbiI7Ci0JCWNvdXQgPDwgIkluIHRhcmdldCBwb3J0aW9uIG9mIHRoZSB0ZXN0IGNvcnB1cywgb25seSAiCi0JCQkJPDwgZlRlc3RWY2JMaXN0LnVuaXFUb2tlbnNJbkNvcnB1cygpCi0JCQkJPDwgIiB1bmlxdWUgdG9rZW5zIGFwcGVhcmVkXG4iOwotCQljb3V0IDw8ICJyYXRpbyAodGFyZ2V0L3NvdXJjZSkgOiAiIDw8IGRvdWJsZShmVGVzdFZjYkxpc3QudG90YWxWb2NhYigpKSAvIGVUZXN0VmNiTGlzdC50b3RhbFZvY2FiKCkgPDwgJ1xuJzsKLQl9Ci0JY291dCA8PCAiIFRyYWluIHRvdGFsICMgc2VudGVuY2UgcGFpcnMgKHdlaWdodGVkKTogIgotCQkJPDwgY29ycHVzLT5nZXRUb3RhbE5vUGFpcnMyKCkgPDwgJ1xuJzsKLQljb3V0IDw8ICJTaXplIG9mIHNvdXJjZSBwb3J0aW9uIG9mIHRoZSB0cmFpbmluZyBjb3JwdXM6ICIKLQkJCTw8IGVUcmFpblZjYkxpc3QudG90YWxWb2NhYigpLWNvcnB1cy0+Z2V0VG90YWxOb1BhaXJzMigpCi0JCQk8PCAiIHRva2Vuc1xuIjsKLQljb3V0IDw8ICJTaXplIG9mIHRoZSB0YXJnZXQgcG9ydGlvbiBvZiB0aGUgdHJhaW5pbmcgY29ycHVzOiAiCi0JCQk8PCBmVHJhaW5WY2JMaXN0LnRvdGFsVm9jYWIoKSA8PCAiIHRva2VucyBcbiI7Ci0JY291dCA8PCAiSW4gc291cmNlIHBvcnRpb24gb2YgdGhlIHRyYWluaW5nIGNvcnB1cywgb25seSAiCi0JCQk8PCBlVHJhaW5WY2JMaXN0LnVuaXFUb2tlbnNJbkNvcnB1cygpCi0JCQk8PCAiIHVuaXF1ZSB0b2tlbnMgYXBwZWFyZWRcbiI7Ci0JY291dCA8PCAiSW4gdGFyZ2V0IHBvcnRpb24gb2YgdGhlIHRyYWluaW5nIGNvcnB1cywgb25seSAiCi0JCQk8PCBmVHJhaW5WY2JMaXN0LnVuaXFUb2tlbnNJbkNvcnB1cygpCi0JCQk8PCAiIHVuaXF1ZSB0b2tlbnMgYXBwZWFyZWRcbiI7Ci0JY291dCA8PCAibGFtYmRhIGZvciBQUCBjYWxjdWxhdGlvbiBpbiBJQk0tMSxJQk0tMixITU06PSAiIDw8IGRvdWJsZShmVHJhaW5WY2JMaXN0LnRvdGFsVm9jYWIoKSkgPDwgIi8oIiA8PCBlVHJhaW5WY2JMaXN0LnRvdGFsVm9jYWIoKSA8PCAiLSIKLQkJCTw8IGNvcnB1cy0+Z2V0VG90YWxOb1BhaXJzMigpIDw8ICIpPSI7Ci0JTEFNQkRBID0gZG91YmxlKGZUcmFpblZjYkxpc3QudG90YWxWb2NhYigpKQotCQkJLyAoZVRyYWluVmNiTGlzdC50b3RhbFZvY2FiKCktY29ycHVzLT5nZXRUb3RhbE5vUGFpcnMyKCkpOwotCWNvdXQgPDwgIj0gIiA8PCBMQU1CREEgPDwgJ1xuJzsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTU9EVUxFX1RFU1RfRklOSVNIIC8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gbG9hZCBkaWN0aW9uYXJ5Ci0JRGljdGlvbmFyeSAqZGljdGlvbmFyeTsKLQlpZiAodXNlRGljdCkKLQkJZGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KGRpY3Rpb25hcnlfRmlsZW5hbWUuY19zdHIoKSk7Ci0JZWxzZQotCQlkaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoIiIpOwotCi0JaW50IG1pbkl0ZXI9MDsKLQljZXJyIDw8ICJEaWN0aW9uYXJ5IExvYWRpbmcgY29tcGxldGUiIDw8IGVuZGw7Ci0KLQlpZiAoQ29vY3VycmVuY2VGaWxlLmxlbmd0aCgpPT0wKSB7Ci0JCWNlcnIgPDwgIkVSUk9SOiBOTyBDT09DVVJSRU5DRSBGSUxFIEdJVkVOIVxuIjsKLQkJYWJvcnQoKTsKLQl9Ci0KLQkvL2lmc3RyZWFtIGNvb2NzKENvb2N1cnJlbmNlRmlsZS5jX3N0cigpKTsKLQl0bW9kZWw8Q09VTlQsIFBST0I+IHRUYWJsZShDb29jdXJyZW5jZUZpbGUpOwotCWNlcnIgPDwgImNvb2MgZmlsZSBsb2FkaW5nIGNvbXBsZXRlZCIgPDwgZW5kbDsKLQkKLQotCS8vIE5lZWQgdG8gcnVsZSBvdXQgc29tZSBiYWQgbG9naWMKLQkKLQlpZihyZXN0YXJ0ID09IDEgJiYgTW9kZWwxX0l0ZXJhdGlvbnMgPT0gMCkgeyAvLyBSZXN0YXJ0IG9uIG1vZGVsIDEgYnV0IG5vdCB0cmFpbiBvbiBtb2RlbCBvbmUKLQkJY2VyciA8PCAiWW91IHNwZWNpZmllZCB0byBsb2FkIG1vZGVsIDEgYW5kIHRyYWluIG1vZGVsIDEgKHJlc3RhcnQgPT0gMSkgYnV0IHlvdSBzcGVjaWZpZWQgemVybyBNb2RlbCAxIGl0ZXJhdGlvbiwgcGxlYXNlIHJldmlzZSB5b3VyIHBhcmFtZXRlcnMiOwotCQlleGl0KDEpOwotCX0KLQlpZihyZXN0YXJ0ID09IDIgJiYgTW9kZWwyX0l0ZXJhdGlvbnMgPT0gMCkgeyAvLyBSZXN0YXJ0IG9uIG1vZGVsIDIgYnV0IG5vdCB0cmFpbiBvbiBtb2RlbCAyCi0JCWNlcnIgPDwgIllvdSBzcGVjaWZpZWQgdG8gbG9hZCBtb2RlbCAxIGFuZCB0cmFpbiBtb2RlbCAyIChyZXN0YXJ0ID09IDIpIGJ1dCB5b3Ugc3BlY2lmaWVkIHplcm8gTW9kZWwgMiBpdGVyYXRpb24sIHBsZWFzZSByZXZpc2UgeW91ciBwYXJhbWV0ZXJzIjsKLQkJZXhpdCgxKTsKLQl9Ci0JCi0JaWYocmVzdGFydCA9PSAzICYmIE1vZGVsMl9JdGVyYXRpb25zID09IDApIHsgLy8gUmVzdGFydCBvbiBtb2RlbCAyIGJ1dCBub3QgdHJhaW4gb24gbW9kZWwgMgotCQljZXJyIDw8ICJZb3Ugc3BlY2lmaWVkIHRvIGxvYWQgbW9kZWwgMiBhbmQgdHJhaW4gbW9kZWwgMiAocmVzdGFydCA9PSAzKSBidXQgeW91IHNwZWNpZmllZCB6ZXJvIE1vZGVsIDIgaXRlcmF0aW9uLCBwbGVhc2UgcmV2aXNlIHlvdXIgcGFyYW1ldGVycyI7Ci0JCWV4aXQoMSk7Ci0JfQotCQotCWlmKHJlc3RhcnQgPT0gNCAmJiBITU1fSXRlcmF0aW9ucyA9PSAwKSB7IC8vIFJlc3RhcnQgb24gbW9kZWwgMiBidXQgbm90IHRyYWluIG9uIG1vZGVsIDIKLQkJY2VyciA8PCAiWW91IHNwZWNpZmllZCB0byBsb2FkIG1vZGVsIDEgYW5kIHRyYWluIGhtbSAocmVzdGFydCA9PSA0KSBidXQgeW91IHNwZWNpZmllZCB6ZXJvIEhNTSBpdGVyYXRpb24sIHBsZWFzZSByZXZpc2UgeW91ciBwYXJhbWV0ZXJzIjsKLQkJZXhpdCgxKTsKLQl9CQotCi0JaWYocmVzdGFydCA9PSA1ICYmIEhNTV9JdGVyYXRpb25zID09IDApIHsgLy8gUmVzdGFydCBvbiBtb2RlbCAyIGJ1dCBub3QgdHJhaW4gb24gbW9kZWwgMgotCQljZXJyIDw8ICJZb3Ugc3BlY2lmaWVkIHRvIGxvYWQgbW9kZWwgMiBhbmQgdHJhaW4gaG1tIChyZXN0YXJ0ID09IDUpIGJ1dCB5b3Ugc3BlY2lmaWVkIHplcm8gSE1NIGl0ZXJhdGlvbiwgcGxlYXNlIHJldmlzZSB5b3VyIHBhcmFtZXRlcnMiOwotCQlleGl0KDEpOwotCX0KLQkKLQlpZihyZXN0YXJ0ID09IDYgJiYgSE1NX0l0ZXJhdGlvbnMgPT0gMCkgeyAvLyBSZXN0YXJ0IG9uIG1vZGVsIDIgYnV0IG5vdCB0cmFpbiBvbiBtb2RlbCAyCi0JCWNlcnIgPDwgIllvdSBzcGVjaWZpZWQgdG8gbG9hZCBITU0gYW5kIHRyYWluIGhtbSAocmVzdGFydCA9PSA2KSBidXQgeW91IHNwZWNpZmllZCB6ZXJvIEhNTSBpdGVyYXRpb24sIHBsZWFzZSByZXZpc2UgeW91ciBwYXJhbWV0ZXJzIjsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlpZihyZXN0YXJ0ID09IDcgJiYgTW9kZWwzX0l0ZXJhdGlvbnMgPT0gMCkgeyAvLyBSZXN0YXJ0IG9uIG1vZGVsIDMgYnV0IG5vdCB0cmFpbiBvbiBtb2RlbCAzCi0JCWNlcnIgPDwgIllvdSBzcGVjaWZpZWQgdG8gbG9hZCBITU0gYW5kIHRyYWluIG1vZGVsIDMgKHJlc3RhcnQgPT0gNykgYnV0IHlvdSBzcGVjaWZpZWQgemVybyBNb2RlbCAzIGl0ZXJhdGlvbiwgcGxlYXNlIHJldmlzZSB5b3VyIHBhcmFtZXRlcnMiOwotCQlleGl0KDEpOwotCX0KLQotCWlmKHJlc3RhcnQgPT0gOCAmJiBNb2RlbDNfSXRlcmF0aW9ucyA9PSAwKSB7IC8vIFJlc3RhcnQgb24gbW9kZWwgMyBidXQgbm90IHRyYWluIG9uIG1vZGVsIDMKLQkJY2VyciA8PCAiWW91IHNwZWNpZmllZCB0byBsb2FkIG1vZGVsIDIgYW5kIHRyYWluIG1vZGVsIDMgKHJlc3RhcnQgPT0gOCkgYnV0IHlvdSBzcGVjaWZpZWQgemVybyBNb2RlbCAzIGl0ZXJhdGlvbiwgcGxlYXNlIHJldmlzZSB5b3VyIHBhcmFtZXRlcnMiOwotCQlleGl0KDEpOwotCX0KLQotICAgIGlmKHJlc3RhcnQgPT0gOSAmJiBNb2RlbDNfSXRlcmF0aW9ucyA9PSAwKSB7IC8vIFJlc3RhcnQgb24gbW9kZWwgMyBidXQgbm90IHRyYWluIG9uIG1vZGVsIDMKLQkJY2VyciA8PCAiWW91IHNwZWNpZmllZCB0byBsb2FkIG1vZGVsIDMgYW5kIHRyYWluIG1vZGVsIDMgKHJlc3RhcnQgPT0gOSkgYnV0IHlvdSBzcGVjaWZpZWQgemVybyBNb2RlbCAzIGl0ZXJhdGlvbiwgcGxlYXNlIHJldmlzZSB5b3VyIHBhcmFtZXRlcnMiOwotCQlleGl0KDEpOwotCX0KLQotICAgIGlmKHJlc3RhcnQgPT0gMTAgJiYgTW9kZWw0X0l0ZXJhdGlvbnMgPT0gMCkgeyAvLyBSZXN0YXJ0IG9uIG1vZGVsIDMgYnV0IG5vdCB0cmFpbiBvbiBtb2RlbCAzCi0JCWNlcnIgPDwgIllvdSBzcGVjaWZpZWQgdG8gbG9hZCBtb2RlbCAzIGFuZCB0cmFpbiBtb2RlbCA0IChyZXN0YXJ0ID09IDEwKSBidXQgeW91IHNwZWNpZmllZCB6ZXJvIE1vZGVsIDQgaXRlcmF0aW9uLCBwbGVhc2UgcmV2aXNlIHlvdXIgcGFyYW1ldGVycyI7Ci0JCWV4aXQoMSk7Ci0JfQotCi0gICAgaWYocmVzdGFydCA9PSAxMSAmJiBNb2RlbDRfSXRlcmF0aW9ucyA9PSAwKSB7IC8vIFJlc3RhcnQgb24gbW9kZWwgMyBidXQgbm90IHRyYWluIG9uIG1vZGVsIDMKLQkJY2VyciA8PCAiWW91IHNwZWNpZmllZCB0byBsb2FkIG1vZGVsIDQgYW5kIHRyYWluIG1vZGVsIDQgKHJlc3RhcnQgPT0gMTApIGJ1dCB5b3Ugc3BlY2lmaWVkIHplcm8gTW9kZWwgNCBpdGVyYXRpb24sIHBsZWFzZSByZXZpc2UgeW91ciBwYXJhbWV0ZXJzIjsKLQkJZXhpdCgxKTsKLQl9Ci0JCi0JLy9RSU46IElmIHJlc3RhcnQgbGV2ZWwgaXMgbGFyZ2VyIHRoYW4gMCwgdGhlbiB3ZSBuZWVkIHRvIGxvYWQgCi0JaWYgKHJlc3RhcnQgPiAwKXsKLQkJY2VyciA8PCAiV2UgYXJlIGdvaW5nIHRvIGxvYWQgcHJldmlvdXMgbW9kZWwgIiA8PCBwcmV2X3QgPDwgZW5kbDsKLQkJaWYoIXRUYWJsZS5yZWFkUHJvYlRhYmxlKHByZXZfdC5jX3N0cigpKSl7Ci0JCQljZXJyIDw8ICJGYWlsZWQgcmVhZGluZyAiIDw8IHByZXZfdCA8PCBlbmRsOyAKLQkJCWV4aXQoMSk7Ci0JCX0KLQl9Ci0JCi0JCi0JCi0JY2VyciA8PCAiVFRhYmxlIGluaXRpYWxpemF0aW9uIE9LIiA8PCBlbmRsOwotCS8vIFRNb2RlbCBpcyBpbXBvcnRhbnQhIAotCW1vZGVsMSBtMShDb3JwdXNGaWxlbmFtZS5jX3N0cigpLCBlVHJhaW5WY2JMaXN0LCBmVHJhaW5WY2JMaXN0LCB0VGFibGUsCi0JCQl0cmFpblBlcnAsICpjb3JwdXMsICZ0ZXN0UGVycCwgdGVzdENvcnB1cywgdHJhaW5WaXRlcmJpUGVycCwKLQkJCSZ0ZXN0Vml0ZXJiaVBlcnApOwotCWNlcnIgPDwgIk1vZGVsIG9uZSBpbml0YWxpemF0aW9uIE9LIiA8PCBlbmRsOwotCWFtb2RlbDxQUk9CPiBhVGFibGUoZmFsc2UpOwotCQotCWlmIChyZXN0YXJ0ID4yICYmIHJlc3RhcnQgIT0gNCApeyAvLyAxIGlzIG1vZGVsIDEsIDIgaXMgbW9kZWwgMiBpbml0LCBib3RoIGp1c3QgbmVlZCB0LXRhYmxlLCA0IGlzIGRpcmVjdGx5IHRyYWluIEhNTSBmcm9tIG1vZGVsIG9uZQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2UgZG8gbm90IG5lZWQgYSBtb2RlbAotCQljZXJyIDw8ICJXZSBhcmUgZ29pbmcgdG8gbG9hZCBwcmV2aW91cyBtb2RlbCBmcm9tICIgPDwgcHJldl9hIDw8IGVuZGw7Ci0JCWlmKCFhVGFibGUucmVhZFRhYmxlKHByZXZfYS5jX3N0cigpKSl7Ci0JCQljZXJyIDw8ICJGYWlsZWQgcmVhZGluZyAiIDw8IHByZXZfYSA8PCBlbmRsOwotCQkJZXhpdCgxKTsKLQkJfQotCX0KLQkKLQlhbW9kZWw8Q09VTlQ+IGFDb3VudFRhYmxlKGZhbHNlKTsKLQltb2RlbDIgbTIobTEsIGFUYWJsZSwgYUNvdW50VGFibGUpOwotCVdvcmRDbGFzc2VzIGZyZW5jaCxlbmdsaXNoOwotCWhtbSBoKG0yLGVuZ2xpc2gsZnJlbmNoKTsKLQkKLQlib29sIGhtbXZhbGlkID0gZmFsc2U7Ci0KLQlpZiAocmVzdGFydCA9PSA2IHx8IHJlc3RhcnQgPT03KXsgIC8vIElmIHdlIHdhbnQgdG8gaW5pdGlhbGl6ZSBtb2RlbCAzIG9yIGNvbnRpbnVlIHRyYWluIGhtbSwgbmVlZCB0byByZWFkIGp1bXBzCi0JCXN0cmluZyBhbCA9IHByZXZfaG1tICsgIi5hbHBoYSI7Ci0JCXN0cmluZyBiZSA9IHByZXZfaG1tICsgIi5iZXRhIjsKLQkJY2VyciA8PCAiV2UgYXJlIGdvaW5nIHRvIGxvYWQgcHJldmlvdXMgKEhNTSkgbW9kZWwgZnJvbSAiIDw8IHByZXZfaG1tIDw8IiwiIDw8IGFsIDw8ICIsIiA8PCBiZSA8PCBlbmRsOwotCQlpZighaC5wcm9icy5yZWFkSnVtcHMocHJldl9obW0uY19zdHIoKSxOVUxMLGFsLmNfc3RyKCksYmUuY19zdHIoKSkpewotCQkJY2VyciA8PCAiRmFpbGVkIHJlYWRpbmciIDw8ICBwcmV2X2htbSA8PCIsIiA8PCBhbCA8PCAiLCIgPDwgYmUgPDwgZW5kbDsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJaG1tdmFsaWQgPSB0cnVlOwotCX1lbHNlIGlmIChyZXN0YXJ0ID4gNyl7Ci0JCWlmIChwcmV2X2htbS5sZW5ndGgoKSA+IDApewotCQkJc3RyaW5nIGFsID0gcHJldl9obW0gKyAiLmFscGhhIjsKLQkJCXN0cmluZyBiZSA9IHByZXZfaG1tICsgIi5iZXRhIjsKLQkJCWNlcnIgPDwgIldlIGFyZSBnb2luZyB0byBsb2FkIHByZXZpb3VzIChITU0pIG1vZGVsIGZyb20gIiA8PCBwcmV2X2htbSA8PCIsIiA8PCBhbCA8PCAiLCIgPDwgYmUgPDwgZW5kbDsKLQkJCWlmKCFoLnByb2JzLnJlYWRKdW1wcyhwcmV2X2htbS5jX3N0cigpLE5VTEwsYWwuY19zdHIoKSxiZS5jX3N0cigpKSl7Ci0JCQkJY2VyciA8PCAiRmFpbGVkIHJlYWRpbmciIDw8ICBwcmV2X2htbSA8PCIsIiA8PCBhbCA8PCAiLCIgPDwgYmUgPDwgZW5kbCA7Ci0JCQkJY2VyciA8PCAiQ29udGludWUgd2l0aG91dCBobW0iIDw8IGVuZGw7Ci0JCQkJaG1tdmFsaWQgPSBmYWxzZTsKLQkJCX1lbHNlCi0JCQkJaG1tdmFsaWQgPSB0cnVlOwotCQl9Ci0JfQotCW5tb2RlbDxQUk9CPiBuVGFibGUobTIuZ2V0Tm9FbmdsaXNoV29yZHMoKSsxLCBNQVhfRkVSVElMSVRZKTsKLQlhbW9kZWw8UFJPQj4gZFRhYmxlKHRydWUpOwotCQotCWlmKHJlc3RhcnQgPiA4KXsgLy8gOSwgMTAsIDExIHJlcXVpcmVzIG50YWJsZSBhbmQgZCB0YWJsZSwgCi0JCWNlcnIgPDwgIldlIGFyZSBnb2luZyB0byBsb2FkIHByZXZpb3VzIE4gbW9kZWwgZnJvbSAiIDw8IHByZXZfbiA8PCBlbmRsOwotCQlpZighblRhYmxlLnJlYWROVGFibGUocHJldl9uLmNfc3RyKCkpKXsKLQkJCWNlcnIgPDwgIkZhaWxlZCByZWFkaW5nICIgPDwgcHJldl9uIDw8IGVuZGw7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWNlcnIgPDwgIldlIGFyZSBnb2luZyB0byBsb2FkIHByZXZpb3VzIEQgbW9kZWwgZnJvbSAiIDw8IHByZXZfZCA8PCBlbmRsOwotCQlpZighZFRhYmxlLnJlYWRUYWJsZShwcmV2X2QuY19zdHIoKSkpewotCQkJY2VyciA8PCAiRmFpbGVkIHJlYWRpbmcgIiA8PCBwcmV2X2QgPDwgZW5kbDsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkKLQl9Ci0JCi0JCi0JCi0JbW9kZWwzIG0zKG0yLCBkVGFibGUsIG5UYWJsZSk7Ci0JaWYocmVzdGFydCA+IDgpewotCQlkb3VibGUgcDAscDE7Ci0JCWlmIChQMCE9LTEuMHx8cHJldl9wMC5sZW5ndGgoKT09MCkgewotCQkJcDAgPSBQMDsKLQkJCXAxID0gMS1QMDsKLQkJfWVsc2V7Ci0JCQljZXJyIDw8ICJXZSBhcmUgZ29pbmcgdG8gbG9hZCBwcmV2aW91cyBQMCBWYWx1ZSBtb2RlbCBmcm9tICIgPDwgcHJldl9wMCA8PCBlbmRsOwotCQkJaWZzdHJlYW0gaWZzKHByZXZfcDAuY19zdHIoKSk7Ci0JCQlpZnMgPj4gcDA7Ci0JCQlwMSA9IDEtcDA7Ci0JCX0KLQkJbTMucDAgPSBwMDsKLQkJbTMucDEgPSBwMTsKLQl9Ci0KLQkvLyBGb3IgbG9hZGluZyBkNCB0YWJsZSwgd2UgcG9zdHBvbmUgaXQgdG8gbW9kZWwgNCBpdGVyYXRpb25zIGluIHRoZSBsaW5lIG1hcmtlZCB3aXRoICNMT0FETTQjCi0JCi0JaWYgKFJlYWRUYWJsZVByZWZpeC5sZW5ndGgoKSApIHsKLQkJc3RyaW5nIG51bWJlciA9ICJmaW5hbCI7Ci0JCXN0cmluZyB0ZmlsZSwgYWZpbGVubmZpbGUsIGRmaWxlLCBkNGZpbGUsIHAwZmlsZSwgYWZpbGUsIG5maWxlOyAvL2Q1ZmlsZQotCQl0ZmlsZSA9IFJlYWRUYWJsZVByZWZpeCArICIudDMuIiArIG51bWJlcjsKLQkJYWZpbGUgPSBSZWFkVGFibGVQcmVmaXggKyAiLmEzLiIgKyBudW1iZXI7Ci0JCW5maWxlID0gUmVhZFRhYmxlUHJlZml4ICsgIi5uMy4iICsgbnVtYmVyOwotCQlkZmlsZSA9IFJlYWRUYWJsZVByZWZpeCArICIuZDMuIiArIG51bWJlcjsKLQkJZDRmaWxlID0gUmVhZFRhYmxlUHJlZml4ICsgIi5kNC4iICsgbnVtYmVyOwotCQkvL2Q1ZmlsZSA9IFJlYWRUYWJsZVByZWZpeCArICIuZDUuIiArIG51bWJlciA7Ci0JCXAwZmlsZSA9IFJlYWRUYWJsZVByZWZpeCArICIucDBfMy4iICsgbnVtYmVyOwotCQl0VGFibGUucmVhZFByb2JUYWJsZSh0ZmlsZS5jX3N0cigpKTsKLQkJYVRhYmxlLnJlYWRUYWJsZShhZmlsZS5jX3N0cigpKTsKLQkJbTMuZFRhYmxlLnJlYWRUYWJsZShkZmlsZS5jX3N0cigpKTsKLQkJbTMublRhYmxlLnJlYWROVGFibGUobmZpbGUuY19zdHIoKSk7Ci0JCXNlbnRQYWlyIHNlbnQ7Ci0JCWRvdWJsZSBwMDsKLQkJaWZzdHJlYW0gcDBmKHAwZmlsZS5jX3N0cigpKTsKLQkJcDBmID4+IHAwOwotCQlkNG1vZGVsIGQ0bShNQVhfU0VOVEVOQ0VfTEVOR1RILCoobmV3IFdvcmRDbGFzc2VzKCkpLCAqKG5ldyBXb3JkQ2xhc3NlcygpKSk7Ci0KLQkJLy9kNG0ucmVhZFByb2JUYWJsZShkNGZpbGUuY19zdHIoKSk7Ci0JCS8vZDVtb2RlbCBkNW0oZDRtKTsKLQkJLy9kNW0ubWFrZVdvcmRDbGFzc2VzKG0xLkVsaXN0LG0xLkZsaXN0LFNvdXJjZVZvY2FiRmlsZW5hbWUrIi5jbGFzc2VzIixUYXJnZXRWb2NhYkZpbGVuYW1lKyIuY2xhc3NlcyIpOwotCQkvL2Q1bS5yZWFkUHJvYlRhYmxlKGQ1ZmlsZS5jX3N0cigpKTsKLQkJbWFrZVNldENvbW1hbmQoIm1vZGVsNHNtb290aGZhY3RvciIsICIwLjAiLCBnZXRHbG9iYWxQYXJTZXQoKSwgMik7Ci0JCS8vbWFrZVNldENvbW1hbmQoIm1vZGVsNXNtb290aGZhY3RvciIsIjAuMCIsZ2V0R2xvYmFsUGFyU2V0KCksMik7Ci0JCWlmIChjb3JwdXN8fHRlc3RDb3JwdXMpIHsKLQkJCXNlbnRlbmNlSGFuZGxlciAqeD1jb3JwdXM7Ci0JCQlpZiAoeD09MCkKLQkJCQl4PXRlc3RDb3JwdXM7Ci0JCQljb3V0IDw8ICJUZXh0IGNvcnB1cyBleGlzdHMuXG4iOwotCQkJeC0+cmV3aW5kKCk7Ci0JCQl3aGlsZSAoeCYmeC0+Z2V0TmV4dFNlbnRlbmNlKHNlbnQpKSB7Ci0JCQkJVmVjdG9yPFdvcmRJbmRleD4mIGVzID0gc2VudC5lU2VudDsKLQkJCQlWZWN0b3I8V29yZEluZGV4PiYgZnMgPSBzZW50LmZTZW50OwotCQkJCWludCBsPWVzLnNpemUoKS0xOwotCQkJCWludCBtPWZzLnNpemUoKS0xOwotCQkJCXRyYW5zcGFpcl9tb2RlbDQgdG00KGVzLCBmcywgbTEudFRhYmxlLCBtMi5hVGFibGUsIG0zLmRUYWJsZSwKLQkJCQkJCW0zLm5UYWJsZSwgMS1wMCwgcDAsICZkNG0pOwotCQkJCWFsaWdubWVudCBhbChsLCBtKTsKLQkJCQljb3V0IDw8ICJJIHVzZSB0aGUgYWxpZ25tZW50ICIgPDwgc2VudC5zZW50ZW5jZU5vLTEgPDwgJ1xuJzsKLQkJCQkvL2NvbnZlcnQoUmVmZXJlbmNlQWxpZ25tZW50W3NlbnQuc2VudGVuY2VOby0xXSxhbCk7Ci0JCQkJdHJhbnNwYWlyX21vZGVsMyB0bTMoZXMsIGZzLCBtMS50VGFibGUsIG0yLmFUYWJsZSwgbTMuZFRhYmxlLAotCQkJCQkJbTMublRhYmxlLCAxLXAwLCBwMCwgMCk7Ci0JCQkJZG91YmxlIHA9dG0zLnByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKGFsLCAxKTsKLQkJCQljb3V0IDw8ICJTZW50ZW5jZSAiIDw8IHNlbnQuc2VudGVuY2VObyA8PCAiIGhhcyBJQk0tMyBwcm9iICIKLQkJCQkJCTw8IHAgPDwgJ1xuJzsKLQkJCQlwPXRtNC5wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShhbCwgMywgMSk7Ci0JCQkJY291dCA8PCAiU2VudGVuY2UgIiA8PCBzZW50LnNlbnRlbmNlTm8gPDwgIiBoYXMgSUJNLTQgcHJvYiAiCi0JCQkJCQk8PCBwIDw8ICdcbic7Ci0JCQkJLy90cmFuc3BhaXJfbW9kZWw1IHRtNShlcyxmcyxtMS50VGFibGUsbTIuYVRhYmxlLG0zLmRUYWJsZSxtMy5uVGFibGUsMS1wMCxwMCwmZDVtKTsKLQkJCQkvL3A9dG01LnByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKGFsLDMsMSk7Ci0JCQkJLy9jb3V0IDw8ICJTZW50ZW5jZSAiIDw8IHNlbnQuc2VudGVuY2VObyA8PCAiIGhhcyBJQk0tNSBwcm9iICIgPDwgcCA8PCAnXG4nOwotCQkJfQotCQl9IGVsc2UgewotCQkJY291dCA8PCAiTm8gY29ycHVzIGV4aXN0cy5cbiI7Ci0JCX0KLQl9IGVsc2UgewotCQkvLyBpbml0aWFsaXplIG1vZGVsMQotCQlib29sIHNlZWRNb2RlbDEgPSBmYWxzZTsKLQkJaWYgKE1vZGVsMV9JdGVyYXRpb25zID4gMCAmJiByZXN0YXJ0IDwgMikgewotCQkJaWYgKHRfRmlsZW5hbWUgIT0gIk5PTkUiICYmIHRfRmlsZW5hbWUgIT0gIiIpIHsKLQkJCQlzZWVkTW9kZWwxID0gdHJ1ZTsKLQkJCQltMS5sb2FkX3RhYmxlKHRfRmlsZW5hbWUuY19zdHIoKSk7Ci0JCQl9Ci0KLQkJCWlmKHJlc3RhcnQgPT0xKSBzZWVkTW9kZWwxID0gdHJ1ZTsKLQkJCWlmKE1vZGVsMl9JdGVyYXRpb25zID09IDAgJiYgSE1NX0l0ZXJhdGlvbnMgPT0gMCAmJiAKLQkJCSAgICBNb2RlbDNfSXRlcmF0aW9ucyA9PSAwICYmIE1vZGVsNF9JdGVyYXRpb25zID09IDAgJiYKLQkJCSAgICBNb2RlbDVfSXRlcmF0aW9ucyA9PSAwICYmIGR1bXBDb3VudCl7ICAvLyBPSyB3ZSBuZWVkIHRvIG91dHB1dCEKLQkJCQltaW5JdGVyPW0xLmVtX3dpdGhfdHJpY2tzKE1vZGVsMV9JdGVyYXRpb25zLCBzZWVkTW9kZWwxLAotCQkJCSAgICAqZGljdGlvbmFyeSwgdXNlRGljdCx0cnVlLAotCQkJCSAgICBjb3VudFByZWZpeC5sZW5ndGgoKSA9PSAwID8gIi4vIiA6IGNvdW50UHJlZml4LmNfc3RyKCksCi0JCQkJICAgIGR1bXBDb3VudFVzaW5nV29yZFN0cmluZwotCQkJCSAgICApOwkJCQkKLQkJCX1lbHNlewotCQkJCW1pbkl0ZXI9bTEuZW1fd2l0aF90cmlja3MoTW9kZWwxX0l0ZXJhdGlvbnMsIHRydWUsCi0JCQkJICAgICpkaWN0aW9uYXJ5LCB1c2VEaWN0KTsKLQkJCX0KLQotCQkJCi0JCQllcnJvcnM9bTEuZXJyb3JzQUwoKTsKLQkJfQotCQl7Ci0JCQlpZiAoTW9kZWwyX0l0ZXJhdGlvbnMgPiAwICYmIChyZXN0YXJ0IDwgMiB8fCByZXN0YXJ0ID09MiB8fCByZXN0YXJ0ID09IDMpKSB7Ci0JCQkJaWYocmVzdGFydCA9PSAyKSBtMi5pbml0aWFsaXplX3RhYmxlX3VuaWZvcm1seSgqY29ycHVzKTsKLQkJCQlpZihITU1fSXRlcmF0aW9ucyA9PSAwICYmIAotCQkJICAgIE1vZGVsM19JdGVyYXRpb25zID09IDAgJiYgTW9kZWw0X0l0ZXJhdGlvbnMgPT0gMCAmJgotCQkJICAgIE1vZGVsNV9JdGVyYXRpb25zID09IDAgJiYgZHVtcENvdW50KXsKLQkJCQkJbWluSXRlcj1tMi5lbV93aXRoX3RyaWNrcyhNb2RlbDJfSXRlcmF0aW9ucyx0cnVlLAotCQkJCSAgICBjb3VudFByZWZpeC5sZW5ndGgoKSA9PSAwID8gIi4vIiA6IGNvdW50UHJlZml4LmNfc3RyKCksCi0JCQkJICAgIGR1bXBDb3VudFVzaW5nV29yZFN0cmluZyk7Ci0JCQkJfWVsc2V7Ci0JCQkJCW1pbkl0ZXI9bTIuZW1fd2l0aF90cmlja3MoTW9kZWwyX0l0ZXJhdGlvbnMpOwotCQkJCX0KLQkJCQllcnJvcnM9bTIuZXJyb3JzQUwoKTsKLQkJCX0KLQkJCS8vY291dCA8PCB0VGFibGUuZ2V0UHJvYigyLCAyKSA8PCBlbmRsOwotCQkJCi0JCQkKLQkJCWlmIChITU1fSXRlcmF0aW9ucyA+IDAgJiYgKHJlc3RhcnQgPCAyIHx8IHJlc3RhcnQgPT0gNCB8fCByZXN0YXJ0ID09IDUgfHwgcmVzdGFydCA9PSA2KSkgewotCQkJCWNvdXQgPDwgIk5PVEU6IEkgYW0gZG9pbmcgaXRlcmF0aW9ucyB3aXRoIHRoZSBITU0gbW9kZWwhXG4iOwotCQkJCQotCQkJCWgubWFrZVdvcmRDbGFzc2VzKG0xLkVsaXN0LCBtMS5GbGlzdCwgU291cmNlVm9jYWJDbGFzc2VzRmlsZW5hbWUKLQkJCQkJCSwgVGFyZ2V0Vm9jYWJDbGFzc2VzRmlsZW5hbWUpOwotCQkJCWlmKHJlc3RhcnQgIT0gNikgaC5pbml0aWFsaXplX3RhYmxlX3VuaWZvcm1seSgqY29ycHVzKTsKLQkJCQkKLQkJCQlpZihNb2RlbDNfSXRlcmF0aW9ucyA9PSAwICYmIE1vZGVsNF9JdGVyYXRpb25zID09IDAgJiYKLQkJCSAgICAgICBNb2RlbDVfSXRlcmF0aW9ucyA9PSAwICYmIGR1bXBDb3VudCl7Ci0JCQkJCW1pbkl0ZXI9aC5lbV93aXRoX3RyaWNrcyhITU1fSXRlcmF0aW9ucyx0cnVlLAotCQkJCSAgICBjb3VudFByZWZpeC5sZW5ndGgoKSA9PSAwID8gTlVMTCA6IGNvdW50UHJlZml4LmNfc3RyKCksCi0JCQkJICAgIGR1bXBDb3VudFVzaW5nV29yZFN0cmluZywgcmVzdGFydCA9PSA2KTsKLQkJCQl9ZWxzZXsJCQkKLQkJCQkJbWluSXRlcj1oLmVtX3dpdGhfdHJpY2tzKEhNTV9JdGVyYXRpb25zLGZhbHNlLE5VTEwsZmFsc2UscmVzdGFydD09Nik7Ci0JCQkJfQotCQkJCS8vbXVsdGlfdGhyZWFkX2VtKEhNTV9JdGVyYXRpb25zLCBOQ1BVUywgJmgpOwotCQkJCWVycm9ycz1oLmVycm9yc0FMKCk7Ci0JCQl9Ci0JCQlpZiAoICgoVHJhbnNmZXIydG8zICYmIE1vZGVsMl9JdGVyYXRpb25zPjApfHwoSE1NX0l0ZXJhdGlvbnM9PTAmJk1vZGVsMl9JdGVyYXRpb25zPjApfHxyZXN0YXJ0PT04KSAmJiAocmVzdGFydCE9NyAmJiByZXN0YXJ0IDwgOSkpIHsKLQkJCQlpZiAoSE1NX0l0ZXJhdGlvbnM+MCkKLQkJCQkJY291dCA8PCAiV0FSTklORzogdHJhbnNmb3IgaXMgbm90IG5lZWRlZCwgYXMgcmVzdWx0cyAiCi0JCQkJCQkiYXJlIG92ZXJ3cml0dGVuIGJlaSB0cmFuc2ZlciBmcm9tIEhNTS5cbiI7Ci0JCQkJc3RyaW5nIHRlc3RfYWxpZ25maWxlID0gUHJlZml4ICsiLnRzdC5BMnRvMyI7Ci0JCQkJaWYgKHRlc3RDb3JwdXMpCi0JCQkJCW0yLmVtX2xvb3AodGVzdFBlcnAsICp0ZXN0Q29ycHVzLCBUcmFuc2Zlcl9EdW1wX0ZyZXE9PTEKLQkJCQkJCQkmJiFOT0RVTVBTLCB0ZXN0X2FsaWduZmlsZS5jX3N0cigpLAotCQkJCQkJCXRlc3RWaXRlcmJpUGVycCwgdHJ1ZSk7Ci0JCQkJaWYgKHRlc3RDb3JwdXMpCi0JCQkJCWNvdXQgPDwgIlxuVHJhbnNmZXI6IFRFU1QgQ1JPU1MtRU5UUk9QWSAiCi0JCQkJCQkJPDwgdGVzdFBlcnAuY3Jvc3NfZW50cm9weSgpIDw8ICIgUEVSUExFWElUWSAiCi0JCQkJCQkJPDwgdGVzdFBlcnAucGVycGxleGl0eSgpIDw8ICJcblxuIjsKLQkJCQlpZiAoVHJhbnNmZXIgPT0gVFJBTlNGRVJfU0lNUExFKQotCQkJCQltMy50cmFuc2ZlclNpbXBsZSgqY29ycHVzLCBUcmFuc2Zlcl9EdW1wX0ZyZXE9PTEmJiFOT0RVTVBTLAotCQkJCQkJCXRyYWluUGVycCwgdHJhaW5WaXRlcmJpUGVycCk7Ci0JCQkJZWxzZQotCQkJCQltMy50cmFuc2ZlcigqY29ycHVzLCBUcmFuc2Zlcl9EdW1wX0ZyZXE9PTEmJiFOT0RVTVBTLAotCQkJCQkJCXRyYWluUGVycCwgdHJhaW5WaXRlcmJpUGVycCk7Ci0JCQkJZXJyb3JzPW0zLmVycm9yc0FMKCk7Ci0JCQl9Ci0JCQlpZihyZXN0YXJ0ID49IDcgJiYgaG1tdmFsaWQpewotCQkJCWgubWFrZVdvcmRDbGFzc2VzKG0xLkVsaXN0LCBtMS5GbGlzdCwgU291cmNlVm9jYWJDbGFzc2VzRmlsZW5hbWUKLQkJCQkJCSwgVGFyZ2V0Vm9jYWJDbGFzc2VzRmlsZW5hbWUpOwotCQkJfQotCQkJaWYgKEhNTV9JdGVyYXRpb25zPjAgfHwgcmVzdGFydCA9PSA3KQotCQkJCW0zLnNldEhNTSgmaCk7Ci0JCQllbHNlIGlmIChyZXN0YXJ0ID4gNyAmJiBobW12YWxpZCl7Ci0JCQkJbTMuc2V0SE1NKCZoKTsKLQkJCX0KLQkJCQotCQkJaWYgKE1vZGVsM19JdGVyYXRpb25zID4gMCB8fCBNb2RlbDRfSXRlcmF0aW9ucyA+IDAKLQkJCQkJfHwgTW9kZWw1X0l0ZXJhdGlvbnMgfHwgTW9kZWw2X0l0ZXJhdGlvbnMpIHsKLQkJCQkJCQotCQkJCWlmKHJlc3RhcnQgPT0gMTEpeyAvLyBOZWVkIHRvIGxvYWQgbW9kZWwgNAotCQkJCSAgICBpZiAoTW9kZWw1X0l0ZXJhdGlvbnM9PTAgJiYgTW9kZWw2X0l0ZXJhdGlvbnM9PTAgJiYgZHVtcENvdW50KXsKLQkJCQkJCW1pbkl0ZXI9bTMudml0ZXJiaShNb2RlbDNfSXRlcmF0aW9ucyxNb2RlbDRfSXRlcmF0aW9ucyxNb2RlbDVfSXRlcmF0aW9ucyxNb2RlbDZfSXRlcmF0aW9ucyxwcmV2X2Q0LmNfc3RyKCkscHJldl9kNF8yLmNfc3RyKCkKLQkJCQkJCSx0cnVlLAotCQkJCQkJY291bnRQcmVmaXgubGVuZ3RoKCkgPT0gMCA/ICIuLyIgOiBjb3VudFByZWZpeC5jX3N0cigpLAotCQkJCQkJZHVtcENvdW50VXNpbmdXb3JkU3RyaW5nKTsgLy8gI0xPQURNNCMKLQkJCQkJfWVsc2V7Ci0JCQkJCQltaW5JdGVyPW0zLnZpdGVyYmkoTW9kZWwzX0l0ZXJhdGlvbnMsTW9kZWw0X0l0ZXJhdGlvbnMsTW9kZWw1X0l0ZXJhdGlvbnMsTW9kZWw2X0l0ZXJhdGlvbnMscHJldl9kNC5jX3N0cigpLHByZXZfZDRfMi5jX3N0cigpKTsKLQkJCQkJfQotCQkJCX1lbHNlewotCQkJCSAgICBpZiAoTW9kZWw1X0l0ZXJhdGlvbnM9PTAgJiYgTW9kZWw2X0l0ZXJhdGlvbnM9PTAgJiYgZHVtcENvdW50KXsKLQkJCQkJCW1pbkl0ZXI9bTMudml0ZXJiaShNb2RlbDNfSXRlcmF0aW9ucyxNb2RlbDRfSXRlcmF0aW9ucyxNb2RlbDVfSXRlcmF0aW9ucyxNb2RlbDZfSXRlcmF0aW9ucyxOVUxMLE5VTEwKLQkJCQkJCSx0cnVlLAotCQkJCQkJY291bnRQcmVmaXgubGVuZ3RoKCkgPT0gMCA/ICIuLyIgOiBjb3VudFByZWZpeC5jX3N0cigpLAotCQkJCQkJZHVtcENvdW50VXNpbmdXb3JkU3RyaW5nKTsgLy8gI0xPQURNNCMKLQkJCQkJfWVsc2V7Ci0JCQkJCQltaW5JdGVyPW0zLnZpdGVyYmkoTW9kZWwzX0l0ZXJhdGlvbnMsTW9kZWw0X0l0ZXJhdGlvbnMsTW9kZWw1X0l0ZXJhdGlvbnMsTW9kZWw2X0l0ZXJhdGlvbnMsTlVMTCxOVUxMKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvKm11bHRpX3RocmVhZF9tMzRfZW0obTMsIE5DUFVTLCBNb2RlbDNfSXRlcmF0aW9ucywKLQkJCQkJCU1vZGVsNF9JdGVyYXRpb25zKTsqLwotCQkJCWVycm9ycz1tMy5lcnJvcnNBTCgpOwotCQkJfQotCQkJaWYgKEZFV0RVTVBTfHwhTk9EVU1QUykgewotCQkJCXByaW50QWxsVGFibGVzKGVUcmFpblZjYkxpc3QsIGVUZXN0VmNiTGlzdCwgZlRyYWluVmNiTGlzdCwKLQkJCQkJCWZUZXN0VmNiTGlzdCwgbTEpOwotCQkJfQotCQl9Ci0JfQotCXJlc3VsdD1taW5JdGVyOwotCXJldHVybiBlcnJvcnM7Ci19Ci0KLS8qIQotIFN0YXJ0cyBoZXJlCi0gKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vICAgIFNldHVwIHBhcmFtZXRlcnMKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JY2VyciA8PCAiU3RhcnRpbmcgTUdJWkEgIiA8PCBlbmRsOwotCWdldEdsb2JhbFBhclNldCgpLmluc2VydChuZXcgUGFyYW1ldGVyPHN0cmluZz4oCi0JCQkiQ29vY3VycmVuY2VGaWxlIiwKLQkJCVBhcmFtZXRlckNoYW5nZWRGbGFnLAotCQkJIiIsCi0JCQlDb29jdXJyZW5jZUZpbGUsCi0JCQlQQVJMRVZfU1BFQ0lBTCkpOwotCWdldEdsb2JhbFBhclNldCgpLmluc2VydChuZXcgUGFyYW1ldGVyPHN0cmluZz4oCi0JCQkiUmVhZFRhYmxlUHJlZml4IiwKLQkJCVBhcmFtZXRlckNoYW5nZWRGbGFnLAotCQkJIm9wdGltaXplZCIsCi0JCQlSZWFkVGFibGVQcmVmaXgsLTEpKTsKLQotCWdldEdsb2JhbFBhclNldCgpLmluc2VydChuZXcgUGFyYW1ldGVyPHN0cmluZz4oIlMiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkic291cmNlIHZvY2FidWxhcnkgZmlsZSBuYW1lIiwKLQkJCVNvdXJjZVZvY2FiRmlsZW5hbWUsCi0JCQlQQVJMRVZfSU5QVVQpKTsKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIlNPVVJDRSBWT0NBQlVMQVJZIEZJTEUiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkic291cmNlIHZvY2FidWxhcnkgZmlsZSBuYW1lIiwKLQkJCVNvdXJjZVZvY2FiRmlsZW5hbWUsLTEpKTsKLQotCWdldEdsb2JhbFBhclNldCgpLmluc2VydChuZXcgUGFyYW1ldGVyPHN0cmluZz4oIlQiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkidGFyZ2V0IHZvY2FidWxhcnkgZmlsZSBuYW1lIiwKLQkJCVRhcmdldFZvY2FiRmlsZW5hbWUsCi0JCQlQQVJMRVZfSU5QVVQpKTsKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIlRBUkdFVCBWT0NBQlVMQVJZIEZJTEUiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkidGFyZ2V0IHZvY2FidWxhcnkgZmlsZSBuYW1lIiwKLQkJCVRhcmdldFZvY2FiRmlsZW5hbWUsLTEpKTsKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIlNvdXJjZSBWb2NhYnVsYXJ5IENsYXNzZXMiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkic291cmNlIHZvY2FidWxhcnkgY2xhc3NlcyBmaWxlIG5hbWUiLAotCQkJU291cmNlVm9jYWJDbGFzc2VzRmlsZW5hbWUsCi0JCQlQQVJMRVZfSU5QVVQpKTsKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIlRhcmdldCBWb2NhYnVsYXJ5IENsYXNzZXMiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkidGFyZ2V0IHZvY2FidWxhcnkgY2xhc3NlcyBmaWxlIG5hbWUiLAotCQkJVGFyZ2V0Vm9jYWJDbGFzc2VzRmlsZW5hbWUsCi0JCQlQQVJMRVZfSU5QVVQpKTsKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIkMiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkidHJhaW5pbmcgY29ycHVzIGZpbGUgbmFtZSIsCi0JCQlDb3JwdXNGaWxlbmFtZSxQQVJMRVZfSU5QVVQpKTsKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIkNPUlBVUyBGSUxFIiwKLQkJCVBhcmFtZXRlckNoYW5nZWRGbGFnLAotCQkJInRyYWluaW5nIGNvcnB1cyBmaWxlIG5hbWUiLAotCQkJQ29ycHVzRmlsZW5hbWUsLTEpKTsKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KCJUQyIsCi0JCQlQYXJhbWV0ZXJDaGFuZ2VkRmxhZywKLQkJCSJ0ZXN0IGNvcnB1cyBmaWxlIG5hbWUiLAotCQkJVGVzdENvcnB1c0ZpbGVuYW1lLAotCQkJUEFSTEVWX0lOUFVUKSk7Ci0KLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIlRFU1QgQ09SUFVTIEZJTEUiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkidGVzdCBjb3JwdXMgZmlsZSBuYW1lIiwKLQkJCVRlc3RDb3JwdXNGaWxlbmFtZSwtMSkpOwotCi0JZ2V0R2xvYmFsUGFyU2V0KCkuaW5zZXJ0KG5ldyBQYXJhbWV0ZXI8c3RyaW5nPigiZCIsCi0JCQlQYXJhbWV0ZXJDaGFuZ2VkRmxhZywKLQkJCSJkaWN0aW9uYXJ5IGZpbGUgbmFtZSIsCi0JCQlkaWN0aW9uYXJ5X0ZpbGVuYW1lLAotCQkJUEFSTEVWX0lOUFVUKSk7Ci0KLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIkRJQ1RJT05BUlkiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkiZGljdGlvbmFyeSBmaWxlIG5hbWUiLAotCQkJZGljdGlvbmFyeV9GaWxlbmFtZSwtMSkpOwotCi0JZ2V0R2xvYmFsUGFyU2V0KCkuaW5zZXJ0KG5ldyBQYXJhbWV0ZXI8c3RyaW5nPigibCIsCi0JCQlQYXJhbWV0ZXJDaGFuZ2VkRmxhZywKLQkJCSJsb2cgZmlsZSBuYW1lIiwKLQkJCUxvZ0ZpbGVuYW1lLFBBUkxFVl9PVVRQVVQpKTsKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIkxPRyBGSUxFIiwKLQkJCVBhcmFtZXRlckNoYW5nZWRGbGFnLAotCQkJImxvZyBmaWxlIG5hbWUiLAotCQkJTG9nRmlsZW5hbWUsLTEpKTsKLQotCWdldEdsb2JhbFBhclNldCgpLmluc2VydChuZXcgUGFyYW1ldGVyPHN0cmluZz4oIm8iLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkib3V0cHV0IGZpbGUgcHJlZml4IiwKLQkJCVByZWZpeCxQQVJMRVZfT1VUUFVUKSk7Ci0JZ2V0R2xvYmFsUGFyU2V0KCkuaW5zZXJ0KG5ldyBQYXJhbWV0ZXI8c3RyaW5nPigKLQkJCSJPVVRQVVQgRklMRSBQUkVGSVgiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkib3V0cHV0IGZpbGUgcHJlZml4IixQcmVmaXgsLTEpKTsKLQotCWdldEdsb2JhbFBhclNldCgpLmluc2VydChuZXcgUGFyYW1ldGVyPHN0cmluZz4oCi0JCQkiT1VUUFVUIFBBVEgiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkib3V0cHV0IHBhdGgiLAotCQkJT1BhdGgsUEFSTEVWX09VVFBVVCkpOwotCi0JZ2V0R2xvYmFsUGFyU2V0KCkuaW5zZXJ0KG5ldyBQYXJhbWV0ZXI8c3RyaW5nPigKLQkJCSJQcmV2aW91cyBUIiwKLQkJCVBhcmFtZXRlckNoYW5nZWRGbGFnLAotCQkJIlRoZSB0LXRhYmxlIG9mIHByZXZpb3VzIHN0ZXAiLAotCQkJcHJldl90LFBBUkxFVl9JTlBVVCkpOwkKLQkKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIlByZXZpb3VzIEEiLAotCQkJUGFyYW1ldGVyQ2hhbmdlZEZsYWcsCi0JCQkiVGhlIGEtdGFibGUgb2YgcHJldmlvdXMgc3RlcCIsCi0JCQlwcmV2X2EsUEFSTEVWX0lOUFVUKSk7CQotCQotCWdldEdsb2JhbFBhclNldCgpLmluc2VydChuZXcgUGFyYW1ldGVyPHN0cmluZz4oCi0JCQkiUHJldmlvdXMgRCIsCi0JCQlQYXJhbWV0ZXJDaGFuZ2VkRmxhZywKLQkJCSJUaGUgZC10YWJsZSBvZiBwcmV2aW91cyBzdGVwIiwKLQkJCXByZXZfZCxQQVJMRVZfSU5QVVQpKTsJCQotCi0JZ2V0R2xvYmFsUGFyU2V0KCkuaW5zZXJ0KG5ldyBQYXJhbWV0ZXI8c3RyaW5nPigKLQkJCSJQcmV2aW91cyBOIiwKLQkJCVBhcmFtZXRlckNoYW5nZWRGbGFnLAotCQkJIlRoZSBuLXRhYmxlIG9mIHByZXZpb3VzIHN0ZXAiLAotCQkJcHJldl9uLFBBUkxFVl9JTlBVVCkpOwkKLQkKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIlByZXZpb3VzIEQ0IiwKLQkJCVBhcmFtZXRlckNoYW5nZWRGbGFnLAotCQkJIlRoZSBkNC10YWJsZSBvZiBwcmV2aW91cyBzdGVwIiwKLQkJCXByZXZfZDQsUEFSTEVWX0lOUFVUKSk7CQkKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIlByZXZpb3VzIEQ0MiIsCi0JCQlQYXJhbWV0ZXJDaGFuZ2VkRmxhZywKLQkJCSJUaGUgZDQtdGFibGUgKDIpIG9mIHByZXZpb3VzIHN0ZXAiLAotCQkJcHJldl9kNF8yLFBBUkxFVl9JTlBVVCkpOwkJCQotCi0JZ2V0R2xvYmFsUGFyU2V0KCkuaW5zZXJ0KG5ldyBQYXJhbWV0ZXI8c3RyaW5nPigKLQkJCSJQcmV2aW91cyBQMCIsCi0JCQlQYXJhbWV0ZXJDaGFuZ2VkRmxhZywKLQkJCSJUaGUgUDAgcHJldmlvdXMgc3RlcCIsCi0JCQlwcmV2X3AwLFBBUkxFVl9JTlBVVCkpOwkKLQkKLQlnZXRHbG9iYWxQYXJTZXQoKS5pbnNlcnQobmV3IFBhcmFtZXRlcjxzdHJpbmc+KAotCQkJIlByZXZpb3VzIEhNTSIsCi0JCQlQYXJhbWV0ZXJDaGFuZ2VkRmxhZywKLQkJCSJUaGUgaG1tLXRhYmxlIG9mIHByZXZpb3VzIHN0ZXAiLAotCQkJcHJldl9obW0sUEFSTEVWX0lOUFVUKSk7CQotCi0JZ2V0R2xvYmFsUGFyU2V0KCkuaW5zZXJ0KG5ldyBQYXJhbWV0ZXI8c3RyaW5nPigKLQkJCSJDb3VudCBPdXRwdXQgUHJlZml4IiwKLQkJCVBhcmFtZXRlckNoYW5nZWRGbGFnLAotCQkJIlRoZSBwcmVmaXggZm9yIG91dHB1dCBjb3VudHMiLAotCQkJY291bnRQcmVmaXgsUEFSTEVWX09VVFBVVCkpOwkKLQkvLyBUaW1lcnMKLQl0aW1lX3Qgc3QxLCBmbjsKLQlzdDEgPSB0aW1lKE5VTEwpOyAvLyBzdGFydGluZyB0aW1lCi0KLQkvLyBQcm9ncmFtIE5hbWUKLQkKLQlzdHJpbmcgdGVtcChhcmd2WzBdKTsKLQlVc2FnZSA9IHRlbXAgKyAiIDxjb25maWdfZmlsZT4gW29wdGlvbnNdXG4iOwotCi0JLy8gQXQgbGVhc3QsIGNvbmZpZyBmaWxlIHNob3VsZCBiZSBwcm92aWRlZC4KLQlpZiAoYXJnYyA8IDIpIHsKLQkJcHJpbnRIZWxwKCk7Ci0JCWV4aXQoMSk7Ci0JfQotCWNlcnIgPDwgIkluaXRpYWxpemluZyBHbG9iYWwgUGFyYXMgIiA8PCBlbmRsOwotCS8vIAotCWluaXRHbG9iYWxzKCkgOwotCi0JY2VyciA8PCAiUGFyc2luZyBBcmd1bWVudHMgIiA8PCBlbmRsOwkKLQkvLyAKLQlwYXJzZUFyZ3VtZW50cyhhcmdjLCBhcmd2KTsKLQotCWlmIChTb3VyY2VWb2NhYkNsYXNzZXNGaWxlbmFtZT09IiIpIHsKLQkgIG1ha2VTZXRDb21tYW5kKCJzb3VyY2V2b2NhYnVsYXJ5Y2xhc3NlcyIsU291cmNlVm9jYWJGaWxlbmFtZSsiLmNsYXNzZXMiLGdldEdsb2JhbFBhclNldCgpLDIpOwotCX0KLQotCWlmIChUYXJnZXRWb2NhYkNsYXNzZXNGaWxlbmFtZT09IiIpIHsKLQkgIG1ha2VTZXRDb21tYW5kKCJ0YXJnZXR2b2NhYnVsYXJ5Y2xhc3NlcyIsVGFyZ2V0Vm9jYWJGaWxlbmFtZSsiLmNsYXNzZXMiLGdldEdsb2JhbFBhclNldCgpLDIpOwotCX0JCi0KLSAgICAvLyBEZXRlcm1pbmUgbnVtYmVyIG9mIHRocmVhZHMKLQotICAgIGlmKE5DUFVTID09IDApewotICAgICAgICBjZXJyIDw8ICJUcnlpbmcgdG8gZGV0ZWN0IG51bWJlciBvZiBDUFVTLi4uIjsKLSAgICAgICAgTkNQVVMgPSBib29zdDo6dGhyZWFkOjpoYXJkd2FyZV9jb25jdXJyZW5jeSgpOwotICAgICAgICBpZihOQ1BVUz09MCl7Ci0gICAgICAgICAgICBjZXJyIDw8ICJmYWlsZWQsIGRlZmF1bHQgdG8gMiB0aHJlYWRzIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICBOQ1BVUyA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAgIGNlcnIgPDwgTkNQVVMgPDwgc3RkOjplbmRsOwotICAgICAgICB9Ci0gICAgfQotCQotCWNlcnIgPDwgIk9wZW5pbmcgTG9nIEZpbGUgIiA8PCBlbmRsOwkKLQlpZiAoTG9nKSB7Ci0JCWxvZ21zZy5vcGVuKExvZ0ZpbGVuYW1lLmNfc3RyKCksIGlvczo6b3V0KTsKLQl9Ci0KLQljZXJyIDw8ICJQcmludGluZyBwYXJhbWV0ZXJzICIgPDwgZW5kbDsJCi0KLQlwcmludEdJWkFQYXJzKGNvdXQpOwotCi0JaW50IGE9LTE7Ci0KLQlkb3VibGUgZXJyb3JzPTAuMDsKLQotCWlmIChPbGRBREJBQ0tPRkYhPTApCi0JCWNlcnIKLQkJCQk8PCAiV0FSTklORzogUGFyYW1ldGVyIC1hZEJhY2tPZmYgZG9lcyBub3QgZXhpc3QgZnVydGhlcjsgdXNlIENvbXBhY3RBRFRhYmxlIGluc3RlYWQuXG4iOwotCi0JaWYgKE1BWF9TRU5URU5DRV9MRU5HVEggPiBNQVhfU0VOVEVOQ0VfTEVOR1RIX0FMTE9XRUQpCi0JCWNlcnIgPDwgIkVSUk9SOiBNQVhfU0VOVEVOQ0VfTEVOR1RIIGlzIHRvbyBiaWcgIiA8PCBNQVhfU0VOVEVOQ0VfTEVOR1RICi0JCQkJPDwgIiA+ICIgPDwgTUFYX1NFTlRFTkNFX0xFTkdUSF9BTExPV0VEIDw8ICdcbic7Ci0KLQkvLyBBY3R1YWxseSB3b3JkIGlzIGRvbmUgaGVyZQotCWVycm9ycz1TdGFydFRyYWluaW5nKGEpOwotCi0JZm4gPSB0aW1lKE5VTEwpOyAvLyBmaW5pc2ggdGltZQotCi0JY291dCA8PCAnXG4nIDw8ICJFbnRpcmUgVHJhaW5pbmcgdG9vazogIiA8PCBkaWZmdGltZShmbiwgc3QxKQotCQkJPDwgIiBzZWNvbmRzXG4iOwotCWNvdXQgPDwgIlByb2dyYW0gRmluaXNoZWQgYXQ6ICI8PCBteV9jdGltZSgmZm4pIDw8ICdcbic7Ci0JY291dCA8PCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvQXJyYXkuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0FycmF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDdmZDAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvQXJyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotI2lmbmRlZiBBUlJBWV9IX0RFRklORUQKLSNkZWZpbmUgQVJSQVlfSF9ERUZJTkVECi11c2luZyBuYW1lc3BhY2Ugc3RkOwotI2luY2x1ZGUgIm15YXNzZXJ0LmgiCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSAibXkuaCIKLQotI2RlZmluZSBBUlJBWV9ERUJVRwotCi0KLXRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEFycmF5Ci17Ci0gcHJpdmF0ZToKLSAgVCAqcDsgICAgICAgICAgICAgICAgICAJCi0gIGludCByZWFsU2l6ZTsKLSAgaW50IG1heFdyaXR0ZW47Ci0gIGNoYXIgYTsKLQotICB2b2lkIGNvcHkoVCAqYSxjb25zdCBUICpiLGludCBuKTsKLSAgdm9pZCBjb3B5KFQgKmEsVCAqYixpbnQgbik7Ci0gIHZvaWQgX2V4cGFuZCgpOwotCQkKLSBwdWJsaWM6Ci0gIEFycmF5KCkgCi0gICAgOiBwKDApLHJlYWxTaXplKDApLG1heFdyaXR0ZW4oLTEpICxhKDEpCi0gICAgewotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLSAgICAgIGNvdXQgPDwgIk1BS0UgQVJSQVk6ICIgPDwgdGhpczw8IiAiPDwodm9pZCopcCA8PCBlbmRsOwotI2VuZGlmCi0gICAgfQotICBBcnJheShjb25zdCBBcnJheTxUPiAmeCkKLSAgICA6IHAobmV3IFRbeC5tYXhXcml0dGVuKzFdKSxyZWFsU2l6ZSh4Lm1heFdyaXR0ZW4rMSksbWF4V3JpdHRlbih4Lm1heFdyaXR0ZW4pLGEoeC5hKQotICAgIHsKLSAgICAgIGNvcHkocCx4LnAscmVhbFNpemUpOwotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLSAgICAgIGNvdXQgPDwgIk1BS0UgQVJSQVkgY29weTogIiA8PCB0aGlzIDw8ICIgIiA8PCByZWFsU2l6ZSA8PCIgIjw8KHZvaWQqKXA8PCBlbmRsOwotI2VuZGlmCi0gICAgfQotICBleHBsaWNpdCBBcnJheShpbnQgbikKLSAgICA6IHAobmV3IFRbbl0pLHJlYWxTaXplKG4pLG1heFdyaXR0ZW4obi0xKSxhKDApCi0gICAgewotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLSAgICAgIGNvdXQgPDwgIk1BS0UgQVJSQVkgd2l0aCBwYXJhbWV0ZXIgbjogIiA8PCB0aGlzIDw8ICIgIiA8PCByZWFsU2l6ZTw8IiAiPDwodm9pZCopcCA8PCBlbmRsOwotI2VuZGlmCQkJCi0gICAgfQotICBBcnJheShpbnQgbixjb25zdCBUJl9pbml0LGludCBfYT0wKQotICAgIDogcChuZXcgVFtuXSkscmVhbFNpemUobiksbWF4V3JpdHRlbihuLTEpLGEoX2EpCi0gICAgewotICAgICAgZm9yKGludCBpaWk9MDtpaWk8bjtpaWkrKylwW2lpaV09X2luaXQ7Ci0jaWZkZWYgVkVSWV9BUlJBWV9ERUJVRwotICAgICAgY291dCA8PCAiTUFLRSBBUlJBWSB3aXRoIHBhcmFtZXRlciBuIGFuZCBpbml0OiAiIDw8IHRoaXMgPDwgIiAiIDw8IHJlYWxTaXplPDwiICI8PCh2b2lkKilwIDw8IGVuZGw7Ci0jZW5kaWYJCQkKLSAgICB9Ci0gIAotICB+QXJyYXkoKSAKLSAgICB7IAotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLSAgICAgIGNvdXQgPDwgIkZSRUUgQVJSQVk6ICIgPDwgdGhpcyA8PCAiICIgPDwgcmVhbFNpemU8PCIgIjw8KHZvaWQqKXAgPDwgZW5kbDsKLSNlbmRpZgkJCQotICAgICAgZGVsZXRlIFtdIHA7Ci0gICAgfQotICAKLSAgQXJyYXk8VD4mIG9wZXJhdG9yPShjb25zdCBBcnJheTxUPiZ4KQotICAgIHsKLSAgICAgIGlmKCB0aGlzIT0gJnggKQotCXsKLSNpZmRlZiBWRVJZX0FSUkFZX0RFQlVHCi0JICBjb3V0IDw8ICJGUkVFIEFSUkFZIGJlY2F1c2Ugb2Ygb3BlcmF0b3I9OiAiIDw8IHRoaXMgPDwgIiAiIDw8IHJlYWxTaXplPDwiICI8PCh2b2lkKilwIDw8IGVuZGw7Ci0jZW5kaWYJCQkKLQkgIAotCSAgZGVsZXRlIFtdIHA7Ci0JICByZWFsU2l6ZSA9IHgubWF4V3JpdHRlbisxOwotCSAgbWF4V3JpdHRlbiA9IHgubWF4V3JpdHRlbjsKLQkgIGEgPSB4LmE7Ci0JICBwID0gbmV3IFRbcmVhbFNpemVdOyAKLQkgIGNvcHkocCx4LnAscmVhbFNpemUpOwotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLQkgIGNvdXQgPDwgIk5FVyBBUlJBWSBiZWNhdXNlIG9mIG9wZXJhdG9yPTogIiA8PCB0aGlzIDw8ICIgIiA8PCByZWFsU2l6ZTw8IiAiPDwodm9pZCopcCA8PCBlbmRsOwotI2VuZGlmCQkJCi0JfQotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgCi0gIEFycmF5PFQ+JiBvcGVyYXRvcj0oQXJyYXk8VD4meCkKLSAgICB7Ci0gICAgICBpZiggdGhpcyE9ICZ4ICkKLQl7Ci0jaWZkZWYgVkVSWV9BUlJBWV9ERUJVRwotCSAgY291dCA8PCAiRlJFRSBBUlJBWSBiZWNhdXNlIG9mIG9wZXJhdG9yPTogIiA8PCB0aGlzIDw8ICIgIiA8PCByZWFsU2l6ZTw8IiAiPDwodm9pZCopcCA8PCBlbmRsOwotI2VuZGlmCQkJCi0JICBkZWxldGUgW10gcDsKLQkgIHJlYWxTaXplID0geC5tYXhXcml0dGVuKzE7Ci0JICBtYXhXcml0dGVuID0geC5tYXhXcml0dGVuOwotCSAgYSA9IHguYTsKLQkgIHAgPSBuZXcgVFtyZWFsU2l6ZV07IAotCSAgY29weShwLHgucCxyZWFsU2l6ZSk7Ci0jaWZkZWYgVkVSWV9BUlJBWV9ERUJVRwotCSAgY291dCA8PCAiTkVXIEFSUkFZIGJlY2F1c2Ugb2Ygb3BlcmF0b3I9OiAiIDw8IHRoaXMgPDwgIiAiIDw8IHJlYWxTaXplPDwiICI8PCh2b2lkKilwIDw8IGVuZGw7Ci0jZW5kaWYJCQkKLQl9Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAKLSAgdm9pZCBhbGxvd0FjY2VzcyhpbnQgbikgCi0gICAgeyAKLSAgICAgIHdoaWxlKCByZWFsU2l6ZTw9biApCi0JX2V4cGFuZCgpOyAKLSAgICAgIG1heFdyaXR0ZW49bWF4KG1heFdyaXR0ZW4sbik7Ci0gICAgICBtYXNzZXJ0KCBtYXhXcml0dGVuPHJlYWxTaXplICk7Ci0gICAgfQotICB2b2lkIHJlc2l6ZShpbnQgbikKLSAgICB7Ci0gICAgICB3aGlsZSggcmVhbFNpemU8biApIAotCV9leHBhbmQoKTsgCi0gICAgICBtYXhXcml0dGVuPW4tMTsKLSAgICB9Ci0gIHZvaWQgc29ydChpbnQgdW50aWw9LTEpCi0gICAgewotICAgICAgaWYoIHVudGlsPT0gLTEgKSB1bnRpbD1zaXplKCk7Ci0gICAgICBzdGQ6OnNvcnQocCxwK3VudGlsKTsKLSAgICB9Ci0gIHZvaWQgaW52c29ydChpbnQgdW50aWw9LTEpCi0gICAgewotICAgICAgaWYoIHVudGlsPT0gLTEgKSB1bnRpbD1zaXplKCk7Ci0gICAgICBzdGQ6OnNvcnQocCxwK3VudGlsLGdyZWF0ZXI8VD4oKSk7ICAgICAgCi0gICAgfQotICB2b2lkIGluaXQoaW50IG4sY29uc3QgVCZfaW5pdCxib29sIF9hPTApCi0gICAgewotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLSAgICAgIGNvdXQgPDwgIkZSRUUgQVJSQVkgYmVjYXVzZSBvZiBpbml0OiAiIDw8IHRoaXMgPDwgIiAiIDw8IHJlYWxTaXplPDwiICI8PCh2b2lkKilwIDw8IGVuZGw7Ci0jZW5kaWYJCQkKLSAgICAgIGRlbGV0ZSBbXXA7Ci0gICAgICBwPW5ldyBUW25dOwotICAgICAgcmVhbFNpemU9bjsKLSAgICAgIGE9X2E7Ci0gICAgICBtYXhXcml0dGVuPW4tMTsKLSAgICAgIGZvcihpbnQgaWlpPTA7aWlpPG47aWlpKyspcFtpaWldPV9pbml0OwotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLSAgICAgIGNvdXQgPDwgIk5FVyBBUlJBWSBiZWNhdXNlIG9mIGluaXQ6ICIgPDwgdGhpcyA8PCAiICIgPDwgcmVhbFNpemU8PCIgIjw8KHZvaWQqKXAgPDwgZW5kbDsKLSNlbmRpZgkJCQotICAgIH0KLSAgaW5saW5lIGludCBzaXplKCkgY29uc3QKLSAgICB7bWFzc2VydCggbWF4V3JpdHRlbjxyZWFsU2l6ZSApOwotICAgIHJldHVybiBtYXhXcml0dGVuKzE7fQotICBpbmxpbmUgaW50IGxvdygpIGNvbnN0Ci0gICAgeyByZXR1cm4gMDsgfQotICBpbmxpbmUgaW50IGhpZ2goKSBjb25zdAotICAgIHsgcmV0dXJuIG1heFdyaXR0ZW47IH0KLSAgaW5saW5lIGJvb2wgYXV0b2V4cGFuZCgpIGNvbnN0IAotICAgIHtyZXR1cm4gYTt9Ci0gIGlubGluZSB2b2lkIGF1dG9leHBhbmQoYm9vbCBhdXRvRXhwKSAKLSAgICB7YT1hdXRvRXhwO30KLSAgaW50IGZpbmRNYXgoKSBjb25zdDsKLSAgaW50IGZpbmRNaW4oKSBjb25zdDsKLSAgY29uc3Qgdm9pZCBlcnJvckFjY2VzcyhpbnQgbikgY29uc3Q7Ci0gIGlubGluZSBUKmdldFBvaW50ZXJUb0RhdGEoKXtyZXR1cm4gcDt9Ci0gIAotICBpbmxpbmUgVCYgb3BlcmF0b3JbXShpbnQgbikKLSAgICB7IAotICAgICAgaWYoIGEgJiYgbj09bWF4V3JpdHRlbisxICkKLQlhbGxvd0FjY2VzcyhuKTsKLSAgICAgIGlmKCBuPDAgfHwgbj5tYXhXcml0dGVuICkKLQllcnJvckFjY2VzcyhuKTsKLSAgICAgIHJldHVybiBwW25dOwotICAgIH0KLSAgaW5saW5lIGNvbnN0IFQmIG9wZXJhdG9yW10oaW50IG4pIGNvbnN0IAotICAgIHsgCi0gICAgICBpZihuPDAgfHwgbj5tYXhXcml0dGVuICkKLQllcnJvckFjY2VzcyhuKTsKLSAgICAgIHJldHVybiBwW25dOyAKLSAgICB9Ci0gIGNvbnN0IFQmdG9wKGludCBuPTApIGNvbnN0Ci0gICAge3JldHVybiAoKnRoaXMpW21heFdyaXR0ZW4tbl07fQotICBUJnRvcChpbnQgbj0wKQotICAgIHtyZXR1cm4gKCp0aGlzKVttYXhXcml0dGVuLW5dO30KLSAgVCZwdXNoKGNvbnN0IFQmeCkKLSAgICB7Ci0gICAgICAoKnRoaXMpW21heFdyaXR0ZW4rMV09eDsKLSAgICAgIHJldHVybiB0b3AoKTsKLSAgICB9Ci0gIGJvb2wgd3JpdGVUbyhvc3RyZWFtJm91dCkgY29uc3QKLSAgICB7Ci0gICAgICBvdXQgPDwgIkFycmF5ICI7Ci0gICAgICBvdXQgPDwgc2l6ZSgpIDw8ICIgIjsKLSAgICAgIG91dCA8PCBhIDw8IGVuZGw7Ci0gICAgICBmb3IoaW50IGl2PTA7aXY8PW1heFdyaXR0ZW47aXYrKykKLQl7Ci0JICB3cml0ZU9iKG91dCwoKnRoaXMpW2l2XSk7Ci0JICBvdXQgPDwgZW5kbDsKLQl9Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGJvb2wgcmVhZEZyb20oaXN0cmVhbSZpbikKLSAgICB7Ci0gICAgICBzdHJpbmcgczsKLSAgICAgIGlmKCAhaW4gKQotCXsKLQkgIGNlcnIgPDwgIkVSUk9SKEFycmF5KTogZmlsZSBjYW5ub3QgYmUgb3BlbmVkLlxuIjsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGluID4+IHM7Ci0gICAgICBpZiggIShzPT0iQXJyYXkiKSApCi0JewotCSAgY2VyciA8PCAiRVJST1IoQXJyYXkpOiBBcnJheSE9JyI8PHM8PCInXG4iOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaW50IGJpZ2dlc3Q7Ci0gICAgICBpbiA+PiBiaWdnZXN0OwotICAgICAgaW4gPj4gYTsKLSAgICAgIHJlc2l6ZShiaWdnZXN0KTsKLSAgICAgIGZvcihpbnQgaXY9MDtpdjxzaXplKCk7aXYrKykKLQl7Ci0JICByZWFkT2IoaW4sKCp0aGlzKVtpdl0pOwotCX0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLX07Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IGJvb2wgb3BlcmF0b3I9PShjb25zdCBBcnJheTxUPiAmeCwgY29uc3QgQXJyYXk8VD4gJnkpCi17Ci0gIGlmKCAmeCA9PSAmeSApCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiggeS5zaXplKCkhPXguc2l6ZSgpICkKLQlyZXR1cm4gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IoaW50IGlpaT0wO2lpaTx4LnNpemUoKTtpaWkrKykKLQkgICAgaWYoICEoeFtpaWldPT15W2lpaV0pICkKLQkgICAgICByZXR1cm4gMDsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IGJvb2wgb3BlcmF0b3I8KGNvbnN0IEFycmF5PFQ+ICZ4LCBjb25zdCBBcnJheTxUPiAmeSkKLXsKLSAgaWYoICZ4ID09ICZ5ICkKLSAgICByZXR1cm4gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmKCB5LnNpemUoKTx4LnNpemUoKSApCi0JcmV0dXJuICEoeTx4KTsKLSAgICAgIGZvcihpbnQgaWlpPTA7aWlpPHguc2l6ZSgpO2lpaSsrKQotCXsKLQkgIG1hc3NlcnQoIGlpaSE9eS5zaXplKCkgKTsKLQkgIGlmKCB4W2lpaV08eVtpaWldICkKLQkgICAgcmV0dXJuIDE7Ci0JICBlbHNlIGlmKCB5W2lpaV08eFtpaWldICkKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgICAgcmV0dXJuIHguc2l6ZSgpIT15LnNpemUoKTsKLSAgICB9Ci19Ci0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gY29uc3Qgdm9pZCBBcnJheTxUPjo6IGVycm9yQWNjZXNzKGludCBuKSBjb25zdAotewotICBjZXJyIAk8PCAiRVJST1I6IEFjY2VzcyB0byBhcnJheSBlbGVtZW50ICIgPDwgbiAKLQk8PCAiICgiIDw8IG1heFdyaXR0ZW4gPDwgIiwiIDw8IHJlYWxTaXplIDw8ICIsIiA8PCAodm9pZCopcCA8PCAiICIgPDwgYSA8PCAiKVxuIjsKLSAgY291dCA8PCAgIkVSUk9SOiBBY2Nlc3MgdG8gYXJyYXkgZWxlbWVudCAiIDw8IG4gCi0gICAgICAgPDwgIiAoIiA8PCBtYXhXcml0dGVuIDw8ICIsIiA8PCByZWFsU2l6ZSA8PCAiLCIgPDwgKHZvaWQqKXAgPDwgIiAgIiA8PCBhIDw8ICIpXG4iOwotICBtYXNzZXJ0KDApOwotI2lmbmRlZiBERUJVRwotICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSZvLGNvbnN0IEFycmF5PFQ+JmEpCi17Ci0gIG8gPDwgIkFycmF5KCIgPDwgYS5zaXplKCkgPDwgIiwiIDw8IGEuYXV0b2V4cGFuZCgpIDw8ICIpeyAiOwotICBmb3IoaW50IGlpaT0wO2lpaTxhLnNpemUoKTtpaWkrKykKLSAgICBvIDw8ICIgIiA8PCBpaWk8PCAiOiIgPDwgYVtpaWldPDwiOyI7Ci0gIHJldHVybiBvIDw8ICJ9XG4iOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0maW4sIEFycmF5PFQ+JikKLXtyZXR1cm4gaW47fQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBpbnQgSGFzaChjb25zdCBBcnJheTxUPiZhKQotewotICBpbnQgbj0wOwotICBmb3IoaW50IGlpaT0wO2lpaTxhLnNpemUoKTtpaWkrKykKLSAgICBuKz1IYXNoKGFbaWlpXSkqKGlpaSsxKTsKLSAgcmV0dXJuIG4rYS5zaXplKCkqNDc7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIEFycmF5PFQ+Ojpjb3B5KFQgKmFhLGNvbnN0IFQgKmJiLGludCBuKQotewotICBmb3IoaW50IGlpaT0wO2lpaTxuO2lpaSsrKQotICAgIGFhW2lpaV09YmJbaWlpXTsKLX0KLXRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgQXJyYXk8VD46OmNvcHkoVCAqYWEsVCAqYmIsaW50IG4pCi17Ci0gIGZvcihpbnQgaWlpPTA7aWlpPG47aWlpKyspCi0gICAgYWFbaWlpXT1iYltpaWldOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIEFycmF5PFQ+OjpfZXhwYW5kKCkKLXsKLSNpZmRlZiBWRVJZX0FSUkFZX0RFQlVHCi0gIGNvdXQgPDwgIkZSRUUgQVJSQVkgYmVjYXVzZSBvZiBfZXhwYW5kOiAiIDw8IHRoaXMgPDwgIiAiIDw8IHJlYWxTaXplPDwiICI8PCh2b2lkKilwIDw8IGVuZGw7Ci0jZW5kaWYJCQkKLSAgVCAqb2xkcD1wOwotICBpbnQgb2xkc2l6ZT1yZWFsU2l6ZTsKLSAgcmVhbFNpemU9cmVhbFNpemUqMisxOwotICBwPW5ldyBUW3JlYWxTaXplXTsKLSAgY29weShwLG9sZHAsb2xkc2l6ZSk7Ci0gIGRlbGV0ZSBbXSBvbGRwOwotI2lmZGVmIFZFUllfQVJSQVlfREVCVUcKLSAgY291dCA8PCAiTkVXIEFSUkFZIGJlY2F1c2Ugb2YgX2V4cGFuZDogIiA8PCB0aGlzIDw8ICIgIiA8PCByZWFsU2l6ZTw8IiAiPDwodm9pZCopcCA8PCBlbmRsOwotI2VuZGlmCQkJCi19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IGludCBBcnJheTxUPjo6ZmluZE1heCgpIGNvbnN0Ci17Ci0gIGlmKCBzaXplKCk9PTAgKQotICAgIHJldHVybiAtMTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBtYXhQb3M9MDsKLSAgICAgIGZvcihpbnQgaWlpPTE7aWlpPHNpemUoKTtpaWkrKykKLQlpZiggKCp0aGlzKVttYXhQb3NdPCgqdGhpcylbaWlpXSApCi0JICBtYXhQb3M9aWlpOwotICAgICAgcmV0dXJuIG1heFBvczsKLSAgICB9Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUPiBpbnQgQXJyYXk8VD46OmZpbmRNaW4oKSBjb25zdAotewotICBpZiggc2l6ZSgpPT0wICkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgbWluUG9zPTA7Ci0gICAgICBmb3IoaW50IGlpaT0xO2lpaTxzaXplKCk7aWlpKyspCi0JaWYoICgqdGhpcylbaWlpXTwoKnRoaXMpW21pblBvc10gKQotCSAgbWluUG9zPWlpaTsKLSAgICAgIHJldHVybiBtaW5Qb3M7Ci0gICAgfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0NNYWtlTGlzdHMudHh0IGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NGQ5MmEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0KLSMgU2V0IG91dHB1dCBkaXJlY3RvcnkKLQotRklORF9QQUNLQUdFKFRocmVhZHMpCi0KLQotU0VUKEVYRUNVVEFCTEVfT1VUUFVUX1BBVEggJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2JpbikKLVNFVChMSUJSQVJZX09VVFBVVF9QQVRIICR7UFJPSkVDVF9CSU5BUllfRElSfS9saWIpCi0KLUFERF9ERUZJTklUSU9OUygiLUROREVCVUciKQotSUYgKFdJTjMyKQotCi1FTFNFKCkKLUFERF9ERUZJTklUSU9OUygiLVduby1kZXByZWNhdGVkIikKLUFERF9ERUZJTklUSU9OUygiLVduby13cml0ZS1zdHJpbmdzIikKLUVORElGKCkKLQotU0VUKCBNS0NMU19TUkMKLSAgICBBcnJheS5oCi0gICAgRml4ZWRBcnJheS5oIAotICAgIEZsZXhBcnJheS5oIAotICAgIEdEQU9wdGltaXphdGlvbi5jcHAgCi0gICAgR0RBT3B0aW1pemF0aW9uLmggCi0gICAgZ2VuZXJhbC5jcHAgCi0gICAgZ2VuZXJhbC5oIAotICAgIEhDT3B0aW1pemF0aW9uLmNwcCAKLSAgICBIQ09wdGltaXphdGlvbi5oIAotICAgIEl0ZXJPcHRpbWl6YXRpb24uY3BwIAotICAgIEl0ZXJPcHRpbWl6YXRpb24uaCAKLSAgICBLYXRlZ1Byb2JsZW0uY3BwIAotICAgIEthdGVnUHJvYmxlbS5oIAotICAgIEthdGVnUHJvYmxlbUtCQy5jcHAgCi0gICAgS2F0ZWdQcm9ibGVtS0JDLmggCi0gICAgS2F0ZWdQcm9ibGVtVGVzdC5jcHAgCi0gICAgS2F0ZWdQcm9ibGVtVGVzdC5oIAotICAgIEthdGVnUHJvYmxlbVdCQy5jcHAgCi0gICAgS2F0ZWdQcm9ibGVtV0JDLmggCi0gICAgbWtjbHMuY3BwIAotICAgIG15LmggCi0gICAgbXlhc3NlcnQuaCAKLSAgICBteWxlZGEuaCAKLSAgICBNWU9wdGltaXphdGlvbi5jcHAgCi0gICAgTVlPcHRpbWl6YXRpb24uaCAKLSAgICBteXN0bC5oIAotICAgIE9wdGltaXphdGlvbi5jcHAgCi0gICAgT3B0aW1pemF0aW9uLmggCi0gICAgUHJvYmxlbS5jcHAgCi0gICAgUHJvYmxlbS5oIAotICAgIFByb2JsZW1UZXN0LmNwcCAKLSAgICBQcm9ibGVtVGVzdC5oIAotICAgIFJSVE9wdGltaXphdGlvbi5jcHAgCi0gICAgUlJUT3B0aW1pemF0aW9uLmggCi0gICAgU0FPcHRpbWl6YXRpb24uY3BwIAotICAgIFNBT3B0aW1pemF0aW9uLmggCi0gICAgU3RhdFZhci5jcHAgCi0gICAgU3RhdFZhci5oIAotICAgIFRBT3B0aW1pemF0aW9uLmNwcCAKLSAgICBUQU9wdGltaXphdGlvbi5oCi0KLSAgICApCi0KLUFERF9FWEVDVVRBQkxFKG1rY2xzICR7TUtDTFNfU1JDfSkKLUlOQ0xVREVfRElSRUNUT1JJRVMoICR7UFJPSkVDVF9TT1VSQ0VfRElSfSApCi1JTkNMVURFX0RJUkVDVE9SSUVTKCAke1BST0pFQ1RfU09VUkNFX0RJUn0vc3JjLyApCi1JTkNMVURFX0RJUkVDVE9SSUVTKCAke1BST0pFQ1RfU09VUkNFX0RJUn0vc3JjL21rY2xzICkKLUxJTktfRElSRUNUT1JJRVMgKCAke0xJQlJBUllfT1VUUFVUX1BBVEh9ICkKLQotCi1JTlNUQUxMKFRBUkdFVFMgbWtjbHMgCi0gICAgUlVOVElNRSBERVNUSU5BVElPTiBiaW4KLSAgICBMSUJSQVJZIERFU1RJTkFUSU9OIGxpYgotICAgIEFSQ0hJVkUgREVTVElOQVRJT04gbGliCi0gICAgKQotCi0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvRml4ZWRBcnJheS5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvRml4ZWRBcnJheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWRhMGIxLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0ZpeGVkQXJyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0jaWZuZGVmIEZJWEFSUkFZX0hfREVGSU5FRAotI2RlZmluZSBGSVhBUlJBWV9IX0RFRklORUQKLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLWJvb2wgd3JpdGVPYihvc3RyZWFtJm91dCxjb25zdCBUJmYpCi17IAotICBvdXQgPDwgZiA8PCAiICI7IAotICByZXR1cm4gMTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLWJvb2wgcmVhZE9iKGlzdHJlYW0maW4sVCZmKQoteyAKLSAgaW4gPj4gZjsKLSAgY2hhciBjOwotICBpbi5nZXQoYyk7Ci0gIG1hc3NlcnQoYz09JyAnKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1ib29sIHdyaXRlT2Iob3N0cmVhbSZvdXQsY29uc3Qgc3RyaW5nICZzLGNvbnN0IFQmZikKLXsgCi0gIG91dCA8PCBzIDw8ICIgIiA8PCBmIDw8ICIgIjsgCi0gIHJldHVybiAxOwotfQotdGVtcGxhdGU8Y2xhc3MgVD4KLWJvb2wgcmVhZE9iKGlzdHJlYW0maW4sY29uc3Qgc3RyaW5nJnMsVCZmKQoteyAKLSAgc3RyaW5nIHNzOwotICBpbiA+PiBzczsKLSAgaWYoIHMhPXNzICkKLSAgICB7Ci0gICAgICBjZXJyIDw8ICJFUlJPUjogcmVhZE9iIHNob3VsZCBiZSAnIiA8PCBzIDw8ICInIGFuZCBpcyAnIiA8PCBzcyA8PCAiJyIgPDwgZW5kbDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaW4gPj4gZjsgCi0gIGNoYXIgYzsKLSAgaW4uZ2V0KGMpOwotICBtYXNzZXJ0KGM9PScgJyk7Ci0gIHJldHVybiAxOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGaXhlZEFycmF5Ci17Ci0gcHJpdmF0ZTogIAotICB2b2lkIGNvcHkoVCAqYWEsY29uc3QgVCAqYmIsaW50IG5ubikKLSAgICB7Zm9yKGludCBpaWk9MDtpaWk8bm5uO2lpaSsrKWFhW2lpaV09YmJbaWlpXTt9Ci0gIAotIHB1YmxpYzoKLSAgVCAqcDsgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgaW50IHJlYWxTaXplOwotICBGaXhlZEFycmF5KCkgCi0gICAgOiBwKDApLHJlYWxTaXplKDApe30KLSAgRml4ZWRBcnJheShjb25zdCBGaXhlZEFycmF5PFQ+ICZ4KQotICAgIDogcChuZXcgVFt4LnJlYWxTaXplXSkscmVhbFNpemUoeC5yZWFsU2l6ZSkge2NvcHkocCx4LnAscmVhbFNpemUpO30KLSAgZXhwbGljaXQgRml4ZWRBcnJheShpbnQgbikKLSAgICA6IHAobmV3IFRbbl0pLHJlYWxTaXplKG4pe30KLSAgRml4ZWRBcnJheShpbnQgbixjb25zdCBUJl9pbml0KQotICAgIDogcChuZXcgVFtuXSkscmVhbFNpemUobil7Zm9yKGludCB6PTA7ejxuO3orKylwW3pdPV9pbml0O30KLSAgRml4ZWRBcnJheShjb25zdCBGaXhlZEFycmF5JmYsY29uc3QgVCZ0KQotICAgIDogcChuZXcgVFtmLnNpemUoKSsxXSkscmVhbFNpemUoZi5zaXplKCkrMSl7Zm9yKGludCB6PTA7ejxmLnNpemUoKTt6KyspcFt6XT1mW3pdO3BbZi5zaXplKCldPXQ7fQotICB+Rml4ZWRBcnJheSgpIAotICAgIHsgZGVsZXRlIFtdIHA7cD0wO3JlYWxTaXplPS0xO30KLSAgCi0gIEZpeGVkQXJyYXk8VD4mIG9wZXJhdG9yPShjb25zdCBGaXhlZEFycmF5PFQ+JngpCi0gICAgewotICAgICAgaWYoIHRoaXMhPSAmeCApCi0JewotCSAgZGVsZXRlIFtdIHA7Ci0JICByZWFsU2l6ZSA9IHgucmVhbFNpemU7Ci0JICBwID0gbmV3IFRbeC5yZWFsU2l6ZV07IAotCSAgY29weShwLHgucCxyZWFsU2l6ZSk7Ci0JfQotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgdm9pZCByZXNpemUoaW50IG4pCi0gICAgewotICAgICAgaWYoIG48PXJlYWxTaXplICkKLQlzaHJpbmsobik7Ci0gICAgICBlbHNlCi0JewotCSAgVCpucD1uZXcgVFtuXTsKLQkgIGNvcHkobnAscCxyZWFsU2l6ZSk7Ci0JICBkZWxldGUgW11wOwotCSAgcD1ucDsKLQkgIHJlYWxTaXplPW47Ci0JfQotICAgIH0KLSAgdm9pZCBzaHJpbmsoaW50IG4pCi0gICAgewotICAgICAgYXNzZXJ0KG48PXJlYWxTaXplKTsKLSAgICAgIHJlYWxTaXplPW47Ci0gICAgfQotICB2b2lkIGluaXQoaW50IG4sY29uc3QgVCZfaW5pdCkKLSAgICB7Ci0gICAgICBkZWxldGUgW11wOwotICAgICAgcD1uZXcgVFtuXTsKLSAgICAgIHJlYWxTaXplPW47Ci0gICAgICBmb3IoaW50IGw9MDtsPG47bCsrKXBbbF09X2luaXQ7Ci0gICAgfQotICBpbmxpbmUgY29uc3QgVCZ0b3AoaW50IG49MCkgY29uc3QKLSAgICB7cmV0dXJuICgqdGhpcylbcmVhbFNpemUtMS1uXTt9Ci0gIGlubGluZSBpbnQgc2l6ZSgpIGNvbnN0IAotICAgIHtyZXR1cm4gcmVhbFNpemU7fQotCi0gIGlubGluZSBUKmJlZ2luKCl7IHJldHVybiBwOyB9Ci0gIGlubGluZSBUKmVuZCgpeyByZXR1cm4gcCtyZWFsU2l6ZTsgfQotCi0gIGlubGluZSBjb25zdCBUKmJlZ2luKCljb25zdHsgcmV0dXJuIHA7IH0KLSAgaW5saW5lIGNvbnN0IFQqZW5kKCljb25zdHtyZXR1cm4gcCtyZWFsU2l6ZTt9Ci0KLSAgaW5saW5lIGludCBsb3coKSBjb25zdCAKLSAgICB7cmV0dXJuIDA7fQotICBpbmxpbmUgaW50IGhpZ2goKSBjb25zdCAKLSAgICB7cmV0dXJuIHJlYWxTaXplLTE7fQotICBjb25zdCB2b2lkIGVycm9yQWNjZXNzKGludCBuKSBjb25zdDsKLSAgCi0gIGlubGluZSBUJiBvcGVyYXRvcltdKGludCBuKQotICAgIHsgCi0gICAgICByZXR1cm4gcFtuXTsKLSAgICB9Ci0gIGlubGluZSBjb25zdCBUJiBvcGVyYXRvcltdKGludCBuKSBjb25zdCAKLSAgICB7IAotICAgICAgcmV0dXJuIHBbbl07IAotICAgIH0KLSAgYm9vbCB3cml0ZVRvKG9zdHJlYW0mb3V0KSBjb25zdAotICAgIHsKLSAgICAgIG91dCA8PCAiRml4ZWRBcnJheSAiOwotICAgICAgb3V0IDw8IHNpemUoKSA8PCAiICI7Ci0gICAgICBmb3IoaW50IGE9MDthPHNpemUoKTthKyspCi0JewotCSAgd3JpdGVPYihvdXQsKCp0aGlzKVthXSk7Ci0JICBvdXQgPDwgIiAiOwotCX0KLSAgICAgIG91dCA8PCBlbmRsOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBib29sIHJlYWRGcm9tKGlzdHJlYW0maW4pCi0gICAgewotICAgICAgc3RyaW5nIHM7Ci0gICAgICBpZiggIWluICkKLQl7Ci0JICBjZXJyIDw8ICJFUlJPUihGaXhlZEFycmF5KTogZmlsZSBjYW5ub3QgYmUgb3BlbmVkLlxuIjsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGluID4+IHM7Ci0gICAgICBpZiggIShzPT0iRml4ZWRBcnJheSIpICkKLQl7Ci0JICBjZXJyIDw8ICJFUlJPUihGaXhlZEFycmF5KTogRml4ZWRBcnJheSE9JyI8PHM8PCInXG4iOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaW50IGJpZ2dlc3Q7Ci0gICAgICBpbiA+PiBiaWdnZXN0OwotICAgICAgcmVzaXplKGJpZ2dlc3QpOwotICAgICAgZm9yKGludCBhPTA7YTxzaXplKCk7YSsrKQotCXJlYWRPYihpbiwoKnRoaXMpW2FdKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgdm9pZCBzb3J0KGludCB1bnRpbD0tMSkKLSAgICB7Ci0gICAgICBpZiggdW50aWw9PSAtMSApIHVudGlsPXNpemUoKTsKLSAgICAgIHN0ZDo6c29ydChwLHArdW50aWwpOwotICAgIH0KLSAgdm9pZCBpbnZzb3J0KGludCB1bnRpbD0tMSkKLSAgICB7Ci0gICAgICBpZiggdW50aWw9PSAtMSApIHVudGlsPXNpemUoKTsKLSAgICAgIHN0ZDo6c29ydChwLHArdW50aWwsZ3JlYXRlcjxUPigpKTsgICAgICAKLSAgICB9Ci0gIGludCBiaW5hcnlfbG9jYXRlKGNvbnN0IFQmdCkKLSAgICB7Ci0gICAgICBUKnBwb3M9c3RkOjpsb3dlcl9ib3VuZChwLHArc2l6ZSgpLHQpOwotICAgICAgaW50IHBvcz1wcG9zLXA7Ci0gICAgICBpZiggcG9zPj0tMSYmcG9zPHNpemUoKSApCi0JcmV0dXJuIHBvczsKLSAgICAgIGVsc2UKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBpbnQgYmluYXJ5X3NlYXJjaChjb25zdCBUJnQpCi0gICAgewotICAgICAgVCpwcG9zPXN0ZDo6bG93ZXJfYm91bmQocCxwK3NpemUoKSx0KTsKLSAgICAgIGludCBwb3M9cHBvcy1wOwotICAgICAgaWYoIHBvcz49MCYmcG9zPHNpemUoKSYmICpwcG9zPT10ICkKLQlyZXR1cm4gcG9zOwotICAgICAgZWxzZQotCXJldHVybiAtMTsKLSAgICB9Ci0gIHR5cGVkZWYgVCogaXRlcmF0b3I7Ci0gIHR5cGVkZWYgY29uc3QgVCogY29uc3RfaXRlcmF0b3I7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yPChjb25zdCBGaXhlZEFycmF5PFQ+ICZ4LCBjb25zdCBGaXhlZEFycmF5PFQ+ICZ5KQotewotICByZXR1cm4gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoeC5iZWdpbigpLHguZW5kKCkseS5iZWdpbigpLHkuZW5kKCkpOwotICAKLX0KLQotCi10ZW1wbGF0ZTxjbGFzcyBUPiAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZpeGVkQXJyYXk8VD4gJngsIGNvbnN0IEZpeGVkQXJyYXk8VD4gJnkpCi17Ci0gIGlmKCAmeCA9PSAmeSApcmV0dXJuIDE7Ci0gIGNvbnN0IGludCBzID0geC5zaXplKCk7Ci0gIGlmKCBzICE9eS5zaXplKCkgKXJldHVybiAwOwotICBmb3IoaW50IGlpaT0wO2lpaTxzO2lpaSsrKQotICAgIGlmKCAhKHgucFtpaWldPT15LnBbaWlpXSkgKQotICAgICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBpbnQgSGFzaChjb25zdCBGaXhlZEFycmF5PFQ+JmEpCi17Ci0gIGludCBuPTA7Ci0gIGNvbnN0IGludCBzPWEuc2l6ZSgpOwotICBmb3IoaW50IGlpaT0wO2lpaTxzO2lpaSsrKQotICAgIG49MTMqbitIYXNoKGEucFtpaWldKTsKLSAgcmV0dXJuIG47Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IGNvbnN0IHZvaWQgRml4ZWRBcnJheTxUPjo6IGVycm9yQWNjZXNzKGludCBuKSBjb25zdAotewotICBtYXNzZXJ0KDApOwotICBjZXJyIAk8PCAiRVJST1I6IEFjY2VzcyB0byBhcnJheSBlbGVtZW50ICIgPDwgbiAKLQk8PCAiICgiIDw8IHJlYWxTaXplIDw8ICIsIiA8PCAodm9pZCopcCA8PCAiKVxuIjsKLX0KLQkKLXRlbXBsYXRlPGNsYXNzIFQ+IG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSZvLGNvbnN0IEZpeGVkQXJyYXk8VD4mYSkKLXsKLSAgbyA8PCAiRml4ZWRBcnJheSgiIDw8IGEuc2l6ZSgpIDw8ICIpeyAiOwotICBmb3IoaW50IGlpaT0wO2lpaTxhLnNpemUoKTtpaWkrKykKLSAgICBvIDw8ICIgIiA8PCBpaWk8PCAiOiIgPDwgYVtpaWldPDwiOyI7Ci0gIHJldHVybiBvIDw8ICJ9XG4iOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0maW4sIEZpeGVkQXJyYXk8VD4mKQoteyByZXR1cm4gaW47fQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBGaXhlZEFycmF5PFQ+IG9wZXJhdG9yKyhjb25zdCBGaXhlZEFycmF5PFQ+JmEsY29uc3QgRml4ZWRBcnJheTxUPiZiKQotewotICBtYXNzZXJ0KGEuc2l6ZSgpPT1iLnNpemUoKSk7Ci0gIEZpeGVkQXJyYXk8VD4geChhLnNpemUoKSk7Ci0gIGZvcihpbnQgaWlpPTA7aWlpPGEuc2l6ZSgpO2lpaSsrKQotICAgIHhbaWlpXT1hW2lpaV0rYltpaWldOwotICByZXR1cm4geDsKLX0KLXRlbXBsYXRlPGNsYXNzIFQ+IEZpeGVkQXJyYXk8VD4gb3BlcmF0b3J8KGNvbnN0IEZpeGVkQXJyYXk8VD4mYWFhLGNvbnN0IEZpeGVkQXJyYXk8VD4mYmJiKQotewotICBpYXNzZXJ0KGFhYS5zaXplKCk9PWJiYi5zaXplKCkpOwotCi0gIEZpeGVkQXJyYXk8VD4geHh4KGFhYS5zaXplKCkpOwotICBmb3IoaW50IGlpaT0wO2lpaTxhYWEuc2l6ZSgpO2lpaSsrKQotICAgIHh4eC5wW2lpaV09YWFhLnBbaWlpXXx8YmJiLnBbaWlpXTsKLSAgcmV0dXJuIHh4eDsKLX0KLQotI2VuZGlmCi0KLQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9GbGV4QXJyYXkuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0ZsZXhBcnJheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGUzZTllLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0ZsZXhBcnJheS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLSNpZm5kZWYgQ0xBU1NfRmxleEFycmF5X2RlZmluZWQKLSNkZWZpbmUgQ0xBU1NfRmxleEFycmF5X2RlZmluZWQKLSNpbmNsdWRlICJGaXhlZEFycmF5LmgiCi0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1jbGFzcyBGbGV4QXJyYXkKLXsKLXByaXZhdGU6Ci0gIEZpeGVkQXJyYXk8VD4gcDsKLSAgaW50IHN0YXJ0LGVuZDsKLXB1YmxpYzoKLSAgRmxleEFycmF5KGludCBfc3RhcnQ9MCxpbnQgX2VuZD0tMSkKLSAgICA6IHAoX2VuZC1fc3RhcnQrMSksc3RhcnQoX3N0YXJ0KSxlbmQoX2VuZCkge30KLSAgVCZvcGVyYXRvcltdKGludCBpKQotICAgIHtyZXR1cm4gcFtpLXN0YXJ0XTt9Ci0gIGNvbnN0IFQmb3BlcmF0b3JbXShpbnQgaSljb25zdAotICAgIHtyZXR1cm5wW2ktc3RhcnRdO30KLSAgaW50IGxvdygpY29uc3R7cmV0dXJuIHN0YXJ0O30KLSAgaW50IGhpZ2goKWNvbnN0e3JldHVybiBlbmQ7fQotfTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0dEQU9wdGltaXphdGlvbi5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9HREFPcHRpbWl6YXRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWUyZmE3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0dEQU9wdGltaXphdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLQotI2luY2x1ZGUgIkdEQU9wdGltaXphdGlvbi5oIgotI2luY2x1ZGUgIlByb2JsZW1UZXN0LmgiCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNkZWZpbmUgR0RBT3B0aW1pemF0aW9uIEdEQU9wdGltaXphdGlvbgotI2RlZmluZSBJdGVyT3B0aW1pemF0aW9uIEl0ZXJPcHRpbWl6YXRpb24KLQotICAgICAKLSAgICAgCi1kb3VibGUgR0RBT3B0aW1pemF0aW9uOjpkZWZhdWx0VGVtcGVyYXR1cj0xZTEwMDsKLQotCi1kb3VibGUgR0RBT3B0aW1pemF0aW9uOjpkZWZhdWx0QWxwaGE9MC4wMDE7Ci0KLQotICAgICAKLUdEQU9wdGltaXphdGlvbjo6R0RBT3B0aW1pemF0aW9uKFByb2JsZW0gJnAsaW50IG0pIAotOiBJdGVyT3B0aW1pemF0aW9uKHAsbSkgLHRlbXBlcmF0dXIoZGVmYXVsdFRlbXBlcmF0dXIpLGFscGhhKGRlZmF1bHRBbHBoYSkKLXsKLX0KLQotICAgICAKLUdEQU9wdGltaXphdGlvbjo6R0RBT3B0aW1pemF0aW9uKFByb2JsZW0gJnAsZG91YmxlIHQsZG91YmxlIGEsaW50IG0pIAotOiBJdGVyT3B0aW1pemF0aW9uKHAsbSkgLHRlbXBlcmF0dXIodCkgLGFscGhhKGEpCi17Ci19Ci0KLSAgICAgCi1HREFPcHRpbWl6YXRpb246OkdEQU9wdGltaXphdGlvbihHREFPcHRpbWl6YXRpb24gJm8pCi06IEl0ZXJPcHRpbWl6YXRpb24obykKLXsKLSAgdGVtcGVyYXR1ciA9IG8udGVtcGVyYXR1cjsKLSAgYWxwaGEgICAgICA9IG8uYWxwaGE7Ci0gIGdkYUVuZEZsYWcgPSBvLmdkYUVuZEZsYWc7Ci19Ci0KLSAgICAgCi12b2lkIEdEQU9wdGltaXphdGlvbjo6ekluaXRpYWxpemUoKQotewotICBJdGVyT3B0aW1pemF0aW9uOjp6SW5pdGlhbGl6ZSgpOwotICBpZih0ZW1wZXJhdHVyPT0xZTEwMCkKLSAgICB7IAotICAgICAgZG91YmxlIHY9cHJvYmxlbS52YWx1ZSgpOyAKLSAgICAgIAotICAgICAgCi0gICAgICAKLSAgICAgIAotICAgICAgCi0gICAgICB0ZW1wZXJhdHVyPXY7Ci0gICAgCX0KLSAgYXNzZXJ0KGFscGhhPj0wKTsKLX0KLQotc2hvcnQgR0RBT3B0aW1pemF0aW9uOjphY2NlcHQoZG91YmxlIGRlbHRhKQotewotICBpZiggIGN1clZhbHVlICsgZGVsdGEgPCB0ZW1wZXJhdHVyICkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi12b2lkICBHREFPcHRpbWl6YXRpb246OmFia3VlaGxlbigpCi17Ci0gIGRvdWJsZSBuZXdUZW1wZXJhdHVyID0gIHRlbXBlcmF0dXIgLSBhbHBoYSoodGVtcGVyYXR1ciAtIGN1clZhbHVlKTsKLSAgaWYoIGZhYnModGVtcGVyYXR1ciAtIG5ld1RlbXBlcmF0dXIpPDFlLTMwICkgCi0gICAgZ2RhRW5kRmxhZz0xOwotICBlbHNlCi0gICAgZ2RhRW5kRmxhZz0wOwotICB0ZW1wZXJhdHVyID0gbmV3VGVtcGVyYXR1cjsKLX0KLQotc2hvcnQgR0RBT3B0aW1pemF0aW9uOjplbmQoKQotewotICByZXR1cm4gKCBlbmRGbGFnPjAgKSAmJiAoIGdkYUVuZEZsYWcgKTsKLX0KLQotdm9pZCBHREFPcHRpbWl6YXRpb246Om1ha2VHcmFwaE91dHB1dCgpCi17Ci0gIEl0ZXJPcHRpbWl6YXRpb246Om1ha2VHcmFwaE91dHB1dCgpOwotICAqR3JhcGhPdXRwdXQgPDwgdGVtcGVyYXR1ci1jdXJWYWx1ZTsKLX0KLQkKLQotCi0gICAgIAotZG91YmxlIEdEQU9wdGltaXphdGlvbjo6b3B0aW1pemVWYWx1ZShQcm9ibGVtICZwLGludCBwcm9QYXJhbWV0ZXIsaW50IG51bVBhcmFtZXRlcixpbnQgdHlwLAotCQkJIGludCBvcHRpbWllcnVuZ3NzY2hyaXR0ZSxpbnQgcHJpbnQpCi17Ci0gIGlmKHR5cCE9MSkKLSAgICB7Ci0gICAgICBjZXJyIDw8ICJFcnJvcjogd3JvbmcgcGFyYW1ldGVyLXR5cGUgaW4gR0RBT3B0aW1pemF0aW9uOjpvcHRpbWl6ZVZhbHVlICgiCi0JPDwgdHlwIDw8ICIpXG4iOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkb3VibGUgYmVzdFBhcj0tMSxiZXN0PTFlMTAwOwotICAgICAgZG91YmxlIG5vdzsKLSAgICAgIGlmKCBwcmludCApCi0JY291dCA8PCAiI0dEQS1vcHRpbWl6ZVZhbHVlczogIiA8PCBudW1QYXJhbWV0ZXI8PGVuZGw7Ci0KLSAgICAgIAotICAgICAgZGVmYXVsdFRlbXBlcmF0dXI9MWUxMDA7IAotCi0gICAgICBmb3IoaW50IGk9MDtpPD1udW1QYXJhbWV0ZXI7aSsrKQotCXsKLQkgIFN0YXRWYXIgZW5kLGxhdWZ6ZWl0LGluaXQ7Ci0JICBkZWZhdWx0QWxwaGEgPSBwb3cocG93KDIwMCwxLjAvbnVtUGFyYW1ldGVyKSxpKSowLjAwMjsKLQkgIHNvbHZlUHJvYmxlbSgwLHAscHJvUGFyYW1ldGVyLG9wdGltaWVydW5nc3NjaHJpdHRlLEdEQV9PUFQsbm93LGVuZCwKLQkJICAgICAgIGxhdWZ6ZWl0LGluaXQpOwotCSAgaWYoIGJlc3Q+bm93ICkKLQkgICAgewotCSAgICAgIGJlc3Q9bm93OwotCSAgICAgIGJlc3RQYXI9ZGVmYXVsdEFscGhhOwotCSAgICB9Ci0JICBpZiggcHJpbnQgKQotCSAgICB7Ci0JICAgICAgY291dCA8PCBkZWZhdWx0QWxwaGEgPDwiICI7Ci0JICAgICAgY291dCA8PCBlbmQuZ2V0TWVhbigpIDw8ICIgIiA8PCBlbmQucXVhbnRpbCgwLjIpIDw8ICIgIiAKLQkJPDwgZW5kLnF1YW50aWwoMC43OSkgPDwgIiAgIiA8PCBsYXVmemVpdC5nZXRNZWFuKCkgPDwgIiAiIAotCQk8PCBlbmQucXVhbnRpbCgwLjApIDw8ICIgIiA8PCBlbmQuZ2V0U2lnbWEoKSA8PCAiICIgCi0JCTw8IGVuZC5nZXRTaWdtYVNtYWxsZXIoKTw8ICIgIjw8IGVuZC5nZXRTaWdtYUJpZ2dlcigpPDwgZW5kbDsKLQkgICAgfQotCX0KLSAgICAgIGlmKCBwcmludCApCi0JY291dCA8PCAiI1BhcmFtZXRlciBNaXR0ZWx3ZXJ0IDAuMi1RdWFudGlsIDAuOC1RdWFudGlsIExhdWZ6ZWl0IgotCSAgICAgICAgIiBCZXN0ZXIgU2lnbWEgU2lnbWFTbWFsbGVyIFNpZ21hQmlnZ2VyXG4iOwotICAgICAgZGVmYXVsdEFscGhhPTAuMDM7Ci0gICAgICByZXR1cm4gYmVzdFBhcjsKLSAgICB9Ci0JcmV0dXJuIDFlMTAwOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9HREFPcHRpbWl6YXRpb24uaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0dEQU9wdGltaXphdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2JjZWMzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0dEQU9wdGltaXphdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLQotCi0KLSNpZm5kZWYgR0RBT1BUSU1JWkFUSU9OCi0jZGVmaW5lIEdEQU9QVElNSVpBVElPTgotI2luY2x1ZGUgIkl0ZXJPcHRpbWl6YXRpb24uaCIKLQotY2xhc3MgR0RBT3B0aW1pemF0aW9uIDogcHVibGljIEl0ZXJPcHRpbWl6YXRpb24KLXsKLSAgCi0gICBwcml2YXRlOgotICAgICBkb3VibGUgdGVtcGVyYXR1cjsgIAotICAgICBkb3VibGUgYWxwaGE7ICAgICAgIAotICAgICBzaG9ydCBnZGFFbmRGbGFnOyAKLSAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgIHByb3RlY3RlZDoKLSAgICAgIHZpcnR1YWwgdm9pZCB6SW5pdGlhbGl6ZSgpOwotICAgICAKLQotICAgICAgdmlydHVhbCBzaG9ydCBhY2NlcHQoZG91YmxlIGRlbHRhKTsgCi0gICAgIAotICAgICAKLSAgICAgIHZpcnR1YWwgdm9pZCAgYWJrdWVobGVuKCk7Ci0gICAgIAotCi0gICAgICB2aXJ0dWFsIHNob3J0IGVuZCgpOwotICAgICAKLQotICAgICAgdmlydHVhbCB2b2lkIG1ha2VHcmFwaE91dHB1dCgpOwotICAgICAKLQotICAgcHVibGljOgotICAgICAgR0RBT3B0aW1pemF0aW9uKFByb2JsZW0gJnAsZG91YmxlIHRlbXBlcmF0dXIsZG91YmxlIGFscGhhLAotICAgICBpbnQgbWF4SXRlcj0tMSk7Ci0gICAgIAotCi0gICAgICBHREFPcHRpbWl6YXRpb24oUHJvYmxlbSAmcCxpbnQgbWF4SXRlcj0tMSk7Ci0gICAgIAotCi0gICAgICBHREFPcHRpbWl6YXRpb24oR0RBT3B0aW1pemF0aW9uICZvKTsKLSAgICAgCi0KLSAgICAgIHN0YXRpYyBkb3VibGUgb3B0aW1pemVWYWx1ZShQcm9ibGVtICZwLGludCBwcm9QYXJhbWV0ZXIsCi0gICAgIGludCBudW1QYXJhbWV0ZXIsaW50IHR5cCxpbnQgc2Nocml0dGU9IC0xLGludCB2ZXJib3NlPTEpOwotICAgICAKLQotICAgICAKLSAgICAgc3RhdGljIGRvdWJsZSBkZWZhdWx0VGVtcGVyYXR1cjsgCi0gICAgIHN0YXRpYyBkb3VibGUgZGVmYXVsdEFscGhhOyAgICAgIAotCi19OwotI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvSENPcHRpbWl6YXRpb24uY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvSENPcHRpbWl6YXRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZhNzI5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0hDT3B0aW1pemF0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0KLSNpbmNsdWRlICJIQ09wdGltaXphdGlvbi5oIgotCi1IQ09wdGltaXphdGlvbjo6SENPcHRpbWl6YXRpb24oUHJvYmxlbSAmcCxpbnQgbSkgCi06IEl0ZXJPcHRpbWl6YXRpb24ocCxtKSAKLXsKLSAgaWYoIG1heFN0ZXA8PTAgKQotICAgIG1heFN0ZXA9KGludCkocHJvYmxlbS5leHBlY3RlZE51bWJlck9mSXRlcmF0aW9ucygpKTsKLX0KLUhDT3B0aW1pemF0aW9uOjpIQ09wdGltaXphdGlvbihIQ09wdGltaXphdGlvbiAmbykKLTogSXRlck9wdGltaXphdGlvbihvKQotewotfQotCi0KLXNob3J0IEhDT3B0aW1pemF0aW9uOjphY2NlcHQoZG91YmxlIGRlbHRhKQotewotICBpZiggZGVsdGEgPCAwICkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotc2hvcnQgSENPcHRpbWl6YXRpb246OmVuZCgpIAoteyAKLSAgcmV0dXJuIGVuZEZsYWc+MDsgCi19Ci12b2lkIEhDT3B0aW1pemF0aW9uOjphYmt1ZWhsZW4oKQotewotfQotCi0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvSENPcHRpbWl6YXRpb24uaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0hDT3B0aW1pemF0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMTQ3YjIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvSENPcHRpbWl6YXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0KLQotCi0jaWZuZGVmIEhDT1BUSU1JWkFUSU9OCi0jZGVmaW5lIEhDT1BUSU1JWkFUSU9OCi0jaW5jbHVkZSAiSXRlck9wdGltaXphdGlvbi5oIgotCi1jbGFzcyBIQ09wdGltaXphdGlvbiA6IHB1YmxpYyBJdGVyT3B0aW1pemF0aW9uCi17Ci0gIAotICAgcHJvdGVjdGVkOgotICAgICAgdmlydHVhbCBzaG9ydCBhY2NlcHQoZG91YmxlIGRlbHRhKTsgCi0gICAgIAotCi0gICAgICB2aXJ0dWFsIHZvaWQgIGFia3VlaGxlbigpOwotICAgICAKLQotICAgICAgdmlydHVhbCBzaG9ydCBlbmQoKTsKLSAgICAgCi0KLSAgIHB1YmxpYzoKLSAgICAgIEhDT3B0aW1pemF0aW9uKFByb2JsZW0gJnAsaW50IG1heEl0ZXI9LTEpOwotICAgICAKLQotICAgICAgSENPcHRpbWl6YXRpb24oSENPcHRpbWl6YXRpb24gJm8pOwotICAgICAKLQotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvSXRlck9wdGltaXphdGlvbi5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9JdGVyT3B0aW1pemF0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4Y2IxZi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9JdGVyT3B0aW1pemF0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotI2luY2x1ZGUgIkl0ZXJPcHRpbWl6YXRpb24uaCIKLSNpbmNsdWRlICJQcm9ibGVtVGVzdC5oIgotCi1vc3RyZWFtICpHcmFwaE91dHB1dDsgCi0KLQotICAKLUl0ZXJPcHRpbWl6YXRpb246Okl0ZXJPcHRpbWl6YXRpb24oUHJvYmxlbSYgcCxpbnQgbSkgCi0gIDogbWF4Tm9uQmV0dGVySXRlcmF0aW9ucygwKSxwcm9ibGVtKHApLG1heFN0ZXAobSksaW5pdGlhbGlzaWVydCgwKQotewotfQotCi0KLQotSXRlck9wdGltaXphdGlvbjo6SXRlck9wdGltaXphdGlvbihJdGVyT3B0aW1pemF0aW9uJiBvKSA6IE9wdGltaXphdGlvbigpLHByb2JsZW0oby5wcm9ibGVtKQotewotICBtYXhOb25CZXR0ZXJJdGVyYXRpb25zPW8ubWF4Tm9uQmV0dGVySXRlcmF0aW9uczsKLSAgY3VyVmFsdWUgPSBvLmN1clZhbHVlOwotICBiZXN0U3RlcCA9IG8uYmVzdFN0ZXA7Ci0gIGJlc3RWYWx1ZSA9IG8uYmVzdFZhbHVlOwotICBtYXhTdGVwID0gby5tYXhTdGVwOwotICBpbml0aWFsaXNpZXJ0ID0gby5pbml0aWFsaXNpZXJ0OwotICBlbmRGbGFnID0gby5lbmRGbGFnOwotICBlbmRGbGFnMiA9IG8uZW5kRmxhZzI7Ci19Ci0KLQotICAgICAKLWRvdWJsZSBJdGVyT3B0aW1pemF0aW9uOjptaW5pbWl6ZShpbnQgc3RlcHMpCi17Ci0gIGlmKCAhaW5pdGlhbGlzaWVydCApCi0gICAgekluaXRpYWxpemUoKTsKLSAgCi0gIGlmKCBzdGVwcz09MCApCi0gICAgcmV0dXJuIGN1clZhbHVlOwotICAKLSAgaW50IHQ9MDsKLSAgaW50IGV2ZXJ5PShzdGVwczwwKT8xMDAwMDooc3RlcHMvMTAwMCsxKTsKLSAgCi0gIGRvCi0gICAgewotICAgICAgY3VyU3RlcCsrOyAKLSAgICAgIHQrKzsKLSAgICAgIGlmKHZlcmJvc2VNb2RlJiYoY3VyU3RlcCUxMDAwPT0wKSkKLQl7Ci0JICBpZihzdGVwcz4wKQotCSAgICBjb3V0IDw8ICJQcm9jZXNzZWQ6ICIgPDwgMTAwLjAqKGN1clN0ZXAvKGRvdWJsZSltYXgobWF4U3RlcCwxKSkgPDwgIiBwZXJjZW50LiAoSXRlck9wdGltaXphdGlvbiBydW4pICIgCi0JCSA8PCBjdXJWYWx1ZSA8PCAiIG1heDoiIDw8IG1heFN0ZXAgPDwgIiAiIDw8IHN0ZXBzIDw8ICIgICAgICAgICAgICBcciI7Ci0JICBlbHNlCi0JICAgIGNvdXQgPDwgIkluIHN0ZXA6IiA8PCBjdXJTdGVwIDw8ICIgY3VycmVudFZhbHVlOiAiIDw8IGN1clZhbHVlIAotCQkgPDwgIiBiZXN0VmFsdWU6ICIgPDwgYmVzdFZhbHVlLWN1clZhbHVlIDw8ICIgIiA8PCBjdXJTdGVwLWJlc3RTdGVwIDw8ICIuICAgICAgICAgICBcciI7Ci0JICBjb3V0LmZsdXNoKCk7Ci0JfQotICAgICAgCi0gICAgICAKLSAgICAgIFByb2JsZW1DaGFuZ2UgKmNoYW5nZT0gJihwcm9ibGVtLmNoYW5nZSgpKTsKLSAgICAgIAotICAgICAgCi0gICAgICBkb3VibGUgZGVsdGE9cHJvYmxlbS52YWx1ZUNoYW5nZSgqY2hhbmdlKTsKLSAgICAgIAotICAgICAgCi0gICAgICBhYmt1ZWhsZW4oKTsKLSAgICAgIAotICAgICAgCi0gICAgICBpZiggYWNjZXB0KGRlbHRhKSApCi0JewotCSAgCi0JICBwcm9ibGVtLmRvQ2hhbmdlKCpjaGFuZ2UpOwotCSAgCi0JICAKLQkgIGN1clZhbHVlKz1kZWx0YTsKLQkgIAotCSAgCi0JICBpZiggY3VyVmFsdWU8YmVzdFZhbHVlLTFlLTEwICkKLQkgICAgewotCSAgICAgIGJlc3RWYWx1ZT1jdXJWYWx1ZTsKLQkgICAgICBiZXN0U3RlcD1jdXJTdGVwOwotCSAgICAgIGVuZEZsYWcyPWVuZEZsYWc9MDsKLQkgICAgfQotCSAgCi0JICBpZiggdmVyYm9zZU1vZGU+MSApCi0JICAgIGNvdXQ8PCJpbiBzdGVwOiAiPDxjdXJTdGVwPDwiIGFjY2VwdGVkIHdpdGggOiAiPDxkZWx0YTw8ZW5kbDsKLQl9Ci0gICAgICAKLSAgICAgIGlmKGN1clN0ZXAgLSBiZXN0U3RlcD5tYXhOb25CZXR0ZXJJdGVyYXRpb25zICYmIG1heE5vbkJldHRlckl0ZXJhdGlvbnM+MCkKLQllbmRGbGFnPTE7Ci0gICAgICBpZihjdXJTdGVwIC0gYmVzdFN0ZXA+MiptYXhOb25CZXR0ZXJJdGVyYXRpb25zICYmIG1heE5vbkJldHRlckl0ZXJhdGlvbnM+MCkKLQllbmRGbGFnMj0xOwotICAgICAgCi0gICAgICAKLSAgICAgIAotICAgICAgaWYoIEdyYXBoT3V0cHV0JiYoKGN1clN0ZXAlZXZlcnkpPT0wKSApCi0JewotCSAgbWFrZUdyYXBoT3V0cHV0KCk7Ci0JICAqR3JhcGhPdXRwdXQ8PCIgIjw8ZGVsdGE8PGVuZGw7Ci0JfQotICAgICAgCi0gICAgICBkZWxldGUgY2hhbmdlOwotICAgIH0gd2hpbGUoIHQhPXN0ZXBzICYmICghZW5kKCkpICYmICghcHJvYmxlbS5lbmRDcml0ZXJpb24oKSkgKTsKLSAgCi0gIGlmKCBHcmFwaE91dHB1dCkKLSAgICB7Ci0gICAgICBtYWtlR3JhcGhPdXRwdXQoKTsKLSAgICAgICpHcmFwaE91dHB1dDw8ZW5kbDsKLSAgICB9Ci0gIHJldHVybiBjdXJWYWx1ZTsKLX0KLQotCi12b2lkIEl0ZXJPcHRpbWl6YXRpb246OnpJbml0aWFsaXplKCkgCi17Ci0gIGluaXRpYWxpc2llcnQ9MTsKLSAgYmVzdFZhbHVlPWN1clZhbHVlPXByb2JsZW0udmFsdWUoKTsKLSAgbWF4Tm9uQmV0dGVySXRlcmF0aW9ucz1wcm9ibGVtLm1heE5vbkJldHRlckl0ZXJhdGlvbnMoKTsKLSAgYmVzdFN0ZXA9Y3VyU3RlcD0wOwotICBlbmRGbGFnMj1lbmRGbGFnPTA7Ci19Ci0KLQotdm9pZCBJdGVyT3B0aW1pemF0aW9uOjptYWtlR3JhcGhPdXRwdXQoKQotewotICAKLSAgKkdyYXBoT3V0cHV0IDw8IGN1clN0ZXAgPDwgIiAiIDw8Y3VyVmFsdWUgPDwgIiAiOwotfQotCi0KLWRvdWJsZSBJdGVyT3B0aW1pemF0aW9uT3B0aW1pemVQYXJhbWV0ZXIoUHJvYmxlbSAmcCwKLQkJCQkJIGRvdWJsZSAmcGFyYW1ldGVyLGRvdWJsZSBtaW4sZG91YmxlIG1heCwKLQkJCQkJIGludCBuUnVuLGludCBuUGFyLGludCB2ZXJmYWhyZW4sCi0JCQkJCSBkb3VibGUgJmJ2KQotewotICBpZiggblBhcjw9MCApCi0gICAgcmV0dXJuIChtYXgrbWluKS8yOwotICAKLSAgU3RhdFZhciBlbmQxLHRpbWUxLGluaXQxOwotICBTdGF0VmFyIGVuZDIsdGltZTIsaW5pdDI7Ci0gIGRvdWJsZSBtZWFuMSxtZWFuMjsKLSAgZG91YmxlIHBhcjEscGFyMjsKLQotICBwYXJhbWV0ZXIgPSBwYXIxID0gbWluICsgKG1heC1taW4pLzM7Ci0gIHNvbHZlUHJvYmxlbSgwLHAsblJ1biwtMSx2ZXJmYWhyZW4sbWVhbjEsZW5kMSx0aW1lMSxpbml0MSk7Ci0gIGNvdXQgPDwgcGFyYW1ldGVyIDw8ICIgIiA8PCBtZWFuMSA8PCAiICIgPDwgZW5kMS5xdWFudGlsKDAuMCkgPDwgIiAiIDw8IGVuZDEucXVhbnRpbCgxLjApIDw8IGVuZGw7Ci0KLSAgcGFyYW1ldGVyID0gcGFyMiA9IG1pbiArIDIqKG1heC1taW4pLzM7Ci0gIHNvbHZlUHJvYmxlbSgwLHAsblJ1biwtMSx2ZXJmYWhyZW4sbWVhbjIsZW5kMix0aW1lMixpbml0Mik7Ci0gIGNvdXQgPDwgcGFyYW1ldGVyIDw8ICIgIiA8PCBtZWFuMiA8PCAiICIgPDwgZW5kMi5xdWFudGlsKDAuMCkgPDwgIiAiIDw8IGVuZDIucXVhbnRpbCgxLjApIDw8IGVuZGw7Ci0gIAotICBkb3VibGUgYmVzdFBhcixiZXN0VmFsOwotICBpZihtZWFuMTxtZWFuMikKLSAgICB7Ci0gICAgICBiZXN0VmFsID0gbWVhbjE7Ci0gICAgICBiZXN0UGFyPUl0ZXJPcHRpbWl6YXRpb25PcHRpbWl6ZVBhcmFtZXRlcihwLHBhcmFtZXRlcixtaW4sbWluKzIqKG1heC1taW4pLzMsblJ1bixuUGFyLTIsdmVyZmFocmVuLGJlc3RWYWwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJlc3RWYWwgPSBtZWFuMjsKLSAgICAgIGJlc3RQYXI9SXRlck9wdGltaXphdGlvbk9wdGltaXplUGFyYW1ldGVyKHAscGFyYW1ldGVyLG1pbisobWF4LW1pbikvMyxtYXgsblJ1bixuUGFyLTIsdmVyZmFocmVuLGJlc3RWYWwpOwotICAgIH0KLSAgaWYoIG1lYW4xPGJlc3RWYWwmJm1lYW4xPD1tZWFuMiApCi0gICAgewotICAgICAgYnYgPSBtZWFuMTsKLSAgICAgIHJldHVybiBwYXIxOwotICAgIH0KLSAgZWxzZSBpZihtZWFuMjxiZXN0VmFsICYmIG1lYW4yPD1tZWFuMSkKLSAgICB7Ci0gICAgICBidiA9IG1lYW4yOwotICAgICAgcmV0dXJuIHBhcjI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnYgPSBiZXN0VmFsOwotICAgICAgcmV0dXJuIGJlc3RQYXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvSXRlck9wdGltaXphdGlvbi5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvSXRlck9wdGltaXphdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTM5YjU1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0l0ZXJPcHRpbWl6YXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0KLQotCi0jaWZuZGVmIElURVJPUFRJTUlaQVRJT04KLSNkZWZpbmUgSVRFUk9QVElNSVpBVElPTgotCi0jaW5jbHVkZSAiT3B0aW1pemF0aW9uLmgiCi0KLQotCi0KLQotI2RlZmluZSBBTlpfVkVSU0NITEVDSFRFUlVOR0VOIDUwMCAKLQotZXh0ZXJuIG9zdHJlYW0gKkdyYXBoT3V0cHV0OyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLWNsYXNzIEl0ZXJPcHRpbWl6YXRpb24gOiBwdWJsaWMgT3B0aW1pemF0aW9uCi0JewotICAKLQotICAgcHJpdmF0ZTogICAKLSAgICAgaW50IG1heE5vbkJldHRlckl0ZXJhdGlvbnM7IAotICAgICAKLQotICAgcHJvdGVjdGVkOgotICAgICBQcm9ibGVtICZwcm9ibGVtOyAgCi0gICAgIGludCBjdXJTdGVwOwkKLSAgICAgZG91YmxlIGN1clZhbHVlOwkKLSAgICAgaW50IGJlc3RTdGVwOyAgICAgIAotICAgICBkb3VibGUgYmVzdFZhbHVlOwkKLSAgICAgaW50IG1heFN0ZXA7ICAgICAgIAotICAgICBpbnQgaW5pdGlhbGlzaWVydDsgCi0gICAgIHNob3J0IGVuZEZsYWc7ICAgICAKLSAgICAgc2hvcnQgZW5kRmxhZzI7ICAgICAKLSAgICAgICAKLSAgICAgICAKLQotCi0gICAgICB2aXJ0dWFsIHZvaWQgbWFrZUdyYXBoT3V0cHV0KCk7Ci0gICAgIAotCi0gICAgICB2aXJ0dWFsIHNob3J0IGVuZCgpPTA7Ci0gICAgIAotCi0gICAgICB2aXJ0dWFsIHZvaWQgIGFia3VlaGxlbigpPTA7Ci0gICAgIAotCi0gICAgICB2aXJ0dWFsIHNob3J0IGFjY2VwdChkb3VibGUgZGVsdGEpPTA7Ci0gICAgIAotCi0gICAgICB2aXJ0dWFsIHZvaWQgekluaXRpYWxpemUoKTsKLSAgICAgCi0KLSAgIHB1YmxpYzoKLSAgICAgIEl0ZXJPcHRpbWl6YXRpb24oUHJvYmxlbSAmcCxpbnQgbWF4SXRlcj0tMSk7Ci0gICAgIAotCi0gICAgICBJdGVyT3B0aW1pemF0aW9uKEl0ZXJPcHRpbWl6YXRpb24gJm8pOwotICAgICAKLQotICAgICAgdmlydHVhbCBkb3VibGUgbWluaW1pemUoaW50IHN0ZXBzPS0xKTsKLSAgICAgCi0KLSAgICAgIGlubGluZSBpbnQgZ2V0Q3VyU3RlcCgpOwotICAgICAKLQotICAgICAgaW5saW5lIGRvdWJsZSBnZXRDdXJyZW50VmFsdWUoKTsgCi0gICAgIAotCi0gICAgICBpbmxpbmUgY29uc3QgUHJvYmxlbSYgZ2V0UHJvYmxlbSgpOyAKLSAgICAgCi0KLX07Ci0KLWRvdWJsZSBJdGVyT3B0aW1pemF0aW9uT3B0aW1pemVQYXJhbWV0ZXIoUHJvYmxlbSAmcCwKLQkJCSAgICAgZG91YmxlICZwYXJhbWV0ZXIsZG91YmxlIG1pbixkb3VibGUgbWF4LAotCQkJICAgICBpbnQgblJ1bixpbnQgblBhcixpbnQgdmVyZmFocmVuLGRvdWJsZSAmYnYpOwotCi1pbmxpbmUgaW50IEl0ZXJPcHRpbWl6YXRpb246OmdldEN1clN0ZXAoKSAKLXsgCi0gIHJldHVybiBjdXJTdGVwOwotfTsKLWlubGluZSBkb3VibGUgSXRlck9wdGltaXphdGlvbjo6Z2V0Q3VycmVudFZhbHVlKCkgCi17IAotICByZXR1cm4gY3VyVmFsdWU7IAotfTsgCi1pbmxpbmUgY29uc3QgUHJvYmxlbSYgSXRlck9wdGltaXphdGlvbjo6Z2V0UHJvYmxlbSgpIAoteyAKLSAgcmV0dXJuIHByb2JsZW07IAotfTsgCi0KLSNlbmRpZgotCi0KLQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9LYXRlZ1Byb2JsZW0uY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvS2F0ZWdQcm9ibGVtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxOGZiNi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9LYXRlZ1Byb2JsZW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMSArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiS2F0ZWdQcm9ibGVtLmgiCi0jaW5jbHVkZSAiS2F0ZWdQcm9ibGVtVGVzdC5oIgotCi0jaW5jbHVkZSAiUHJvYmxlbVRlc3QuaCIKLQotZXh0ZXJuIGRvdWJsZSBTaWdtYVZlcmZhZWxzY2h1bmc7Ci0KLWRvdWJsZSBoX3RhYmxlW01BWF9IX1RBQkxFXSxsX3RhYmxlW01BWF9IX1RBQkxFXSxobXlfdGFibGVbTUFYX0hfVEFCTEVdLGhteV9zaWdtYTsgCi0KLWRvdWJsZSBMV1JXX0Zha3Rvcj0wLjU7IAotCi1zdGF0aWMgaW50IGludGNvbXBhcmUoY29uc3Qgdm9pZCAqcCxjb25zdCB2b2lkICpqKQotewotICByZXR1cm4gKihpbnQgKilwIC0gKihpbnQgKilqOwotfQotCi1LYXRlZ1Byb2JsZW06OkthdGVnUHJvYmxlbShpbnQgYXcsaW50IG1hayxpbnQgX2luaXRpYWxpc2llcnVuZyxpbnQgX2F1c3dlcnR1bmcsCi0JICAgaW50IF9uYWNoYmFyc2NoYWZ0LGludCBtaW5kZXN0QW56YWhsKSAKLTogUHJvYmxlbShtYWssYXcsX2luaXRpYWxpc2llcnVuZyxfYXVzd2VydHVuZyxfbmFjaGJhcnNjaGFmdCksCi0gIHNpZ21hVmVyZmFlbHNjaHVuZyhTaWdtYVZlcmZhZWxzY2h1bmcpLGthdFdhc0VtcHR5KDApLG53ZyhtYWsrMiksbmd3KG1haysyKSxfa2F0T2ZXb3JkKGF3LC0xKSx3b3JkcygwKSxrYXRzKDApLAotICB3b3JkRnJlcShhdyxtaW5kZXN0QW56YWhsKSxrYXRGcmVxKG1haysyLChfYXVzd2VydHVuZz09Q1JJVEVSSU9OX01ZKT9TaWdtYVZlcmZhZWxzY2h1bmc6MC4wKSwKLSAgaW5pdExpa2UoYXcsLTEpCi0gIAotewotICBpZiggYXVzd2VydHVuZyA9PSBDUklURVJJT05fTVkgKQotICAgIGNvdXQgPDwgIlNpZ21hLVZlcmZhZWxzY2h1bmc6ICIgPDwgc2lnbWFWZXJmYWVsc2NodW5nIDw8IGVuZGw7Ci0gIF9tYXhDb21wPWF3OwotICBfbWF4Q29tcFZhbD1tYWs7Ci0gIG1hc3NlcnQoa2F0RnJlcS5uS2F0cz4wKTsKLSAgbWFzc2VydChtYWs8PWF3KTsKLQotICAKLSAgZm9yKGludCBpPTE7aTxNQVhfSF9UQUJMRTtpKyspCi0gICAgewotICAgICAgaF90YWJsZVtpXT1pKmxvZygoZG91YmxlKShpKSk7Ci0gICAgICBsX3RhYmxlW2ldPWxvZygoZG91YmxlKShpKSk7Ci0gICAgICBobXlfdGFibGVbaV09aSpsb2codmVyZmFlbHNjaGUoaSxzaWdtYVZlcmZhZWxzY2h1bmcpKTsKLSAgICB9Ci0gIGhteV9zaWdtYT1zaWdtYVZlcmZhZWxzY2h1bmc7Ci0gIGxfdGFibGVbMF09aF90YWJsZVswXT0wOwotCi0gIGlmKCBrYXR3YWhsKCk9PUtfQkVTVCApIAotICAgIF9tYXhDb21wVmFsPTE7ICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIAotfQotCi1LYXRlZ1Byb2JsZW06On5LYXRlZ1Byb2JsZW0oKQotCi17Ci0gIGRlbGV0ZSB3b3JkczsKLSAgZGVsZXRlIGthdHM7Ci19Ci0KLXZvaWQgS2F0ZWdQcm9ibGVtOjpfaW5pdGlhbGl6ZShpbnQgaW5pdFR5cCkKLXsKLSAgX2luaXRpYWxpemUoaW5pdFR5cCwtMSk7Ci19Ci0KLXZvaWQgS2F0ZWdQcm9ibGVtOjpfaW5pdGlhbGl6ZShpbnQgaW5pdFR5cCxpbnQgc3BlY2lhbEZpeGVkV29yZCkKLSAgCi17Ci0gIG1hc3NlcnQod29yZEZyZXEuZmlsbGVkKTsKLSAgaW5pdGlhbGlzaWVydW5nID0gaW5pdFR5cDsgCi0gCWludCBpOwotICAKLSAgZm9yKGk9MDtpPGthdEZyZXEubkthdHM7aSsrKSAgIAotICAgIGZvcihpbnQgaj0wO2o8a2F0RnJlcS5uS2F0cztqKyspCi0gICAgICBrYXRGcmVxLnNldE4oaSxqLDApOwotCi0gIAotICAKLSAgCi0gIGZvcihpPTA7aTx3b3JkRnJlcS5uV29yZHM7aSsrKQotICAgIHsKLSAgICAgIHNldEthdE9mV29yZChpLC0xKTsKLSAgICAgIGlmKCBzdHJjbXAoZ2V0U3RyaW5nKGkpLCIkIik9PTB8fHN0cmNtcChnZXRTdHJpbmcoaSksIjEkIik9PTB8fHN0cmNtcChnZXRTdHJpbmcoaSksIjIkIik9PTB8fHN0cmNtcChnZXRTdHJpbmcoaSksIjMkIik9PTB8fHN0cmNtcChnZXRTdHJpbmcoaSksIjQkIik9PTAgKQotCXdvcmRGcmVxLnNldERvbGxhcihpKTsKLSAgICB9Ci0gIHdvcmRGcmVxLmluaXQoc3BlY2lhbEZpeGVkV29yZCk7IAotICAKLSAgCi0gIAotICAKLSAgX21heENvbXA9d29yZEZyZXEublRyYW5zcFdvcmRzOwotICAKLSAgc3dpdGNoKGluaXRUeXApCi0gICAgewotICAgIGNhc2UgSU5JVF9PVEhFUjoKLSAgICAgIAotICAgICAgaWYodmVyYm9zZU1vZGU+Miljb3V0IDw8ICJLYXRlZ1Byb2JsZW06Ol9pbml0aWFsaXplKElOSVRfT1RIRVIpXG4iOwotICAgICAgZm9yKGk9MDtpPHdvcmRGcmVxLm5Xb3JkcztpKyspCi0JZmFzdFB1dFdvcmQoaSxpbml0TGlrZVtpXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElOSVRfUkFOOgotICAgICAgCi0gICAgICBpZih2ZXJib3NlTW9kZT4yKWNvdXQgPDwgIkthdGVnUHJvYmxlbTo6X2luaXRpYWxpemUoSU5JVF9SQU4pXG4iOwotICAgICAgZm9yKGk9MDtpPHdvcmRGcmVxLm5Xb3JkcztpKyspCi0JewotCSAgaWYoIHdvcmRGcmVxLm1pbkluZGV4W2ldPjAgJiYgd29yZEZyZXEubWF4SW5kZXhbaV0+MCApCi0JICAgIGZhc3RQdXRXb3JkKGksd29yZEZyZXEubWluSW5kZXhbaV0rcmFuZG9tSW50KHdvcmRGcmVxLm1heEluZGV4W2ldLXdvcmRGcmVxLm1pbkluZGV4W2ldKzEpKTsKLQkgIGVsc2UKLQkgICAgZmFzdFB1dFdvcmQoaSwyK3JhbmRvbUludChrYXRGcmVxLm5LYXRzLTIpKTsKLQl9Ci0gICAgICAKLSAgICAgIAotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTklUX0FJTzoKLSAgICAgIAotICAgICAgaWYodmVyYm9zZU1vZGU+Miljb3V0IDw8ICJLYXRlZ1Byb2JsZW06Ol9pbml0aWFsaXplKElOSVRfQUlPKVxuIjsKLSAgICAgIGZvcihpPTA7aTx3b3JkRnJlcS5uV29yZHM7aSsrKQotCWZhc3RQdXRXb3JkKGksMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElOSVRfRlJFUToKLSAgICAgIAotICAgICAgaWYodmVyYm9zZU1vZGU+Miljb3V0IDw8ICJLYXRlZ1Byb2JsZW06Ol9pbml0aWFsaXplKElOSVRfRlJFUSlcbiI7Ci0gICAgICBmb3IoaT0wO2k8d29yZEZyZXEubldvcmRzO2krKykKLQl7Ci0JICBpbnQgdG89aSsyOwotCSAgaWYoIHRvPj1rYXRGcmVxLm5LYXRzICkKLQkgICAgdG89a2F0RnJlcS5uS2F0cy0xOwotCSAgZmFzdFB1dFdvcmQoKCood29yZEZyZXEuYWJzdGVpZ2VuZCkpW2ldLHRvKTsKLQl9Ci0gICAgICBjdXJDb21wPWthdEZyZXEubkthdHMtMjsgCi0gICAgICBicmVhazsKLSAgICBjYXNlIElOSVRfTFdSVzoKLSAgICAgIAotICAgICAgewotCUFycmF5PGludD4gbWFya0xpc3Qod29yZEZyZXEubldvcmRzLDEpOwotCWludCB0bz0yOwotCWludCBpPTA7Ci0JaWYodmVyYm9zZU1vZGU+Miljb3V0IDw8ICJLYXRlZ1Byb2JsZW06Ol9pbml0aWFsaXplKElOSVRfTFdSVylcbiI7Ci0JZm9yKHRvPTI7dG88a2F0RnJlcS5uS2F0cypMV1JXX0Zha3Rvcjt0bysrKQotCSAgewotCSAgICBpbnQgdz0oKih3b3JkRnJlcS5hYnN0ZWlnZW5kKSlbdG8tMl07Ci0JICAgIGZhc3RQdXRXb3JkKHcsdG8pOwotCSAgICBtYXJrTGlzdFt3XT0wOwotCSAgfQotCXdoaWxlKHRvPGthdEZyZXEubkthdHMtMSAmJiBpPHdvcmRGcmVxLm5Xb3JkcykKLQkgIHsKLQkgICAgaW50IHRvRmlsbGVkPTA7Ci0JICAgIGludCB3b3JkPSgqKHdvcmRGcmVxLmFic3RlaWdlbmQpKVtpXTsKLQkgICAgaWYoaSUyKQotCSAgICAgIHsKLQkJTWFueUZyZXEgJmFmdGVyPXdvcmRGcmVxLmFmdGVyW3dvcmRdOwotCQlmb3IoaW50IGo9MDtqPGFmdGVyLnNpemUoKTtqKyspCi0JCSAgewotCQkgICAgaW50IHc9YWZ0ZXJbal0udzsKLQkJICAgIGlmKCBtYXJrTGlzdFt3XSApCi0JCSAgICAgIGZhc3RQdXRXb3JkKHcsdG8pLHRvRmlsbGVkKys7Ci0JCSAgICBtYXJrTGlzdFt3XT0wOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UgCi0JICAgICAgewotCQlNYW55RnJlcSAmYmVmb3JlPXdvcmRGcmVxLmJlZm9yZVt3b3JkXTsKLQkJZm9yKGludCBqPTA7ajxiZWZvcmUuc2l6ZSgpO2orKykKLQkJICB7Ci0JCSAgICBpbnQgdz1iZWZvcmVbal0udzsKLQkJICAgIGlmKCBtYXJrTGlzdFt3XSApCi0JCSAgICAgIGZhc3RQdXRXb3JkKHcsdG8pLHRvRmlsbGVkKys7Ci0JCSAgICBtYXJrTGlzdFt3XT0wOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGkrKzsKLQkgICAgaWYoIHRvRmlsbGVkPjAgKQotCSAgICAgIHRvKys7Ci0JICB9Ci0JZm9yKGk9MDtpPHdvcmRGcmVxLm5Xb3JkcztpKyspCi0JICBpZihtYXJrTGlzdFtpXSkKLQkgICAgZmFzdFB1dFdvcmQoaSxrYXRGcmVxLm5LYXRzLTEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGNlcnIgPDwgIldyb25nIF9pbml0aWFsaXplIGluIEthdGVnUHJvYmxlbTogIiA8PCBpbml0VHlwIDw8IGVuZGw7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLQotICAKLSAgCi0gIGZvcihpbnQgd29yZD0wO3dvcmQ8d29yZEZyZXEubldvcmRzO3dvcmQrKykKLSAgICB7Ci0gICAgICBBcnJheTxPbmVGcmVxPiYgYWZ0PXdvcmRGcmVxLmFmdGVyW3dvcmRdOwotICAgICAgCi0gICAgICBpbnQgbkFmdD1hZnQuc2l6ZSgpOwotICAgICAgCi0gICAgICBmb3IoaT0wO2k8bkFmdDtpKyspCi0Ja2F0RnJlcS5hZGROKGthdE9mV29yZCh3b3JkKSxrYXRPZldvcmQoYWZ0W2ldLncpLGFmdFtpXS5uKTsKLSAgICB9Ci0KLSAgaWYodmVyYm9zZU1vZGU+MikKLSAgICB7Ci0gICAgICBjb3V0IDw8ICJcbkluaXRpYWxpemF0aW9uIG9mIEthdGVnUHJvYmxlbToiOwotICAgICAgZHVtcE9uKGNvdXQpOwotICAgIH0KLX0KLQotZG91YmxlIEthdGVnUHJvYmxlbTo6dmFsdWVDaGFuZ2UoUHJvYmxlbUNoYW5nZSZjKQotICAKLXsKLSAgbnVtYmVyT2ZQYXJ0RXZhbHVhdGlvbnMrKzsKLSAgS2F0ZWdQcm9ibGVtQ2hhbmdlICZrPSooS2F0ZWdQcm9ibGVtQ2hhbmdlICopJmM7Ci0gIGZpbGxOV0coay53b3JkKTsgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcmV0dXJuIF92YWx1ZUNoYW5nZShrKTsgCi19Ci0KLQotUHJvYmxlbSAqS2F0ZWdQcm9ibGVtOjptYWtlRXF1YWxQcm9ibGVtKCkKLSAgCi17Ci0gIEthdGVnUHJvYmxlbSpwID0gbmV3IEthdGVnUHJvYmxlbSh3b3JkRnJlcS5uV29yZHMsa2F0RnJlcS5uS2F0cy0yLGluaXRpYWxpc2llcnVuZywKLSAgICAgICAgICAgICAgICAgICAgYXVzd2VydHVuZyxuYWNoYmFyc2NoYWZ0KTsKLSAgS2F0ZWdQcm9ibGVtV0JDICZ3PXAtPndvcmRGcmVxOwotICBmb3IoaW50IHg9MDt4PHdvcmRGcmVxLm5Xb3Jkczt4KyspCi0gICAgewotICAgICAgdy5zZXRBZnRlcldvcmRzKHgsd29yZEZyZXEuYWZ0ZXJbeF0uc2l6ZSgpKTsKLSAgICAgIHcuc2V0QmVmb3JlV29yZHMoeCx3b3JkRnJlcS5iZWZvcmVbeF0uc2l6ZSgpKTsKLSAgICB9Ci0JaW50IGk7Ci0gIGZvcihpPTA7aTx3b3JkRnJlcS5uV29yZHM7aSsrKQotICAgIHsKLSAgICAgIGZvcihpbnQgaj0wO2o8d29yZEZyZXEuYWZ0ZXJbaV0uc2l6ZSgpO2orKykKLQl3LnNldEZyZXEoaSx3b3JkRnJlcS5hZnRlcltpXVtqXS53LHdvcmRGcmVxLmFmdGVyW2ldW2pdLm4pOwotICAgIH0gIAotICB3LnRlc3RGdWxsKCk7Ci0gIHcubWluZGVzdEFuemFobCA9IHdvcmRGcmVxLm1pbmRlc3RBbnphaGw7Ci0gIGlmKHdvcmRzKQotICAgIHAtPndvcmRzID0gbmV3IGxlZGFfYXJyYXk8c3RyaW5nPigqd29yZHMpOwotICBmb3IoaT0wO2k8d29yZEZyZXEubldvcmRzO2krKykKLSAgICB7Ci0gICAgICBwLT5zZXRLYXRPZldvcmQoaSxrYXRPZldvcmQoaSkpOwotICAgICAgcC0+aW5pdExpa2VbaV09aW5pdExpa2VbaV07Ci0gICAgfQotICBwLT5zZXRWYWx1ZXNGcm9tKHRoaXMpOwotICByZXR1cm4gcDsKLX0KLQotZG91YmxlIEthdGVnUHJvYmxlbTo6bmljZXZhbHVlKGRvdWJsZSB2YWwpCi0gIAotewotICBkb3VibGUgdjsKLSAgaWYoIHZhbCE9MWUxMDApCi0gICAgdj12YWw7Ci0gIGVsc2UKLSAgICB2PXZhbHVlKCk7Ci0gIGRvdWJsZSBoPXdvcmRGcmVxLmdldF9oX29mX3dvcmRzKCk7Ci0gIGRvdWJsZSBuPXdvcmRGcmVxLm51bWJlck9mV29yZHMoKTsKLSAgZG91YmxlIGs9MDsKLSAgaWYoYXVzd2VydHVuZyA9PSBDUklURVJJT05fTVkpCi0gICAgaz1rYXRGcmVxLm15Q3JpdGVyaW9uVGVybSgpOwotICByZXR1cm4gZXhwKCh2K2gtaykvbik7Ci19Ci0KLXZvaWQgS2F0ZWdQcm9ibGVtOjptYWtlS2F0cygpCi0gIAotewotICBpZihrYXRzKWRlbGV0ZSBrYXRzOwotICBrYXRzID0gbmV3IGxlZGFfYXJyYXk8aW50U2V0PihrYXRGcmVxLm5LYXRzKTsKLSAgZm9yKGludCBpPTA7aTx3b3JkRnJlcS5uV29yZHM7aSsrKQotICAgICgqa2F0cylba2F0T2ZXb3JkKGkpXS5pbnNlcnQoaSk7Ci19Ci0KLXZvaWQgS2F0ZWdQcm9ibGVtOjpkdW1wSW5mb3Mob3N0cmVhbSAmc3RybSkKLSAgCi17Ci0gIHN0cm0gPDwgIjtLYXRlZ1Byb2JsZW06IjsKLSAgc3RybSA8PCAiY2F0czogIiA8PCBrYXRGcmVxLm5LYXRzLTIgPDwgIiAgIHdvcmRzOiAiIDw8IHdvcmRGcmVxLm5Xb3JkcyAKLSAgICA8PCBlbmRsOwotfQotCi12b2lkIEthdGVnUHJvYmxlbTo6ZHVtcE9uKG9zdHJlYW0gJnN0cm0pCi0gIAotewotICB3cml0ZUNsYXNzZXMoX2thdE9mV29yZCwqdGhpcyxzdHJtKTsKLSAgaWYoUHJpbnRCZXN0VG8yKQotICAgIHsKLSAgICAgIGR1bXBJbmZvcygqUHJpbnRCZXN0VG8yKTsKLSAgICAgIG1ha2VLYXRzKCk7Ci0gICAgICBpZigga2F0cz09MCApCi0JewotCSAgaWYoIHdvcmRzPT0wICkKLQkgICAgewotCSAgICAgIGZvcihpbnQgaT0wO2k8d29yZEZyZXEubldvcmRzO2krKykKLQkJewotCQkgICpQcmludEJlc3RUbzIgPDwgaSA8PCAiOiIgPDwga2F0T2ZXb3JkKGkpIDw8ICIgIjsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmb3IoaW50IGk9MDtpPHdvcmRGcmVxLm5Xb3JkcztpKyspCi0JCQkqUHJpbnRCZXN0VG8yIDw8ICgqd29yZHMpW2ldIDw8ICI6IiA8PCBrYXRPZldvcmQoaSkgPDwgIiAiOwotCSAgICB9ICAgICAgCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBhbnprYXQ9MDsKLQkgIGZvcihpbnQgaT0wO2k8a2F0RnJlcS5uS2F0cztpKyspCi0JICAgIHsKLQkgICAgICBpbnQgcHJpbnRlZD0wOwotCSAgICAgICpQcmludEJlc3RUbzIgIDw8IGkgPDwgIjoiOwotCSAgICAgIGxlZGFfc2V0PGludD4mdGhlU2V0ID0gKCprYXRzKVtpXTsKLQkgICAgICBpZiggd29yZHM9PTAgKQotCQl7Ci0JCSAgaW50IG5yPTA7Ci0JCSAgZm9yYWxsX3NldChsZWRhX3NldDxpbnQ+LG5yLHRoZVNldCkKLQkJICAgIHsKLQkJICAgICAgKlByaW50QmVzdFRvMiA8PCBuciA8PCAiLCAiOwotCQkgICAgICBwcmludGVkPTE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnQgbnI9MDsKLQkJICBmb3JhbGxfc2V0KGxlZGFfc2V0PGludD4sbnIsdGhlU2V0KQotCQkgICAgewotCQkgICAgICAqUHJpbnRCZXN0VG8yIDw8ICgqd29yZHMpW25yXTw8ICIsIjsgCi0JCSAgICAgIHByaW50ZWQ9MTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmKHByaW50ZWQ9PTEpYW56a2F0Kys7Ci0JICAgICAgKlByaW50QmVzdFRvMiA8PCBlbmRsOwotCSAgICB9Ci0JICAqUHJpbnRCZXN0VG8yIDw8ICI7SSBoYXZlICIgPDwgYW56a2F0IDw8ICIgY2F0ZWdvcmllcyB1c2VkLlxuIjsKLQl9Ci0gICAgICAqUHJpbnRCZXN0VG8yIDw8IGVuZGw7Ci0gICAgICBQcm9ibGVtOjpkdW1wT24oKlByaW50QmVzdFRvMik7Ci0gICAgfQotfQotCi0KLQotCi0KLQotY29uc3QgY2hhciAqS2F0ZWdQcm9ibGVtOjpnZXRTdHJpbmcoaW50IGkpCi0gIAotewotICBpZih3b3Jkcz09MCkKLSAgICByZXR1cm4gIjw+IjsKLSAgZWxzZQotICAgIHJldHVybiAoKCp3b3JkcylbaV0pLmNfc3RyKCk7Ci19Ci0KLXN0cmluZyBLYXRlZ1Byb2JsZW06OmdldFRoZVN0cmluZyhpbnQgaSkKLXsKLSAgcmV0dXJuICgqd29yZHMpW2ldOwotfQotCi1pbnQgS2F0ZWdQcm9ibGVtOjptYXhOb25CZXR0ZXJJdGVyYXRpb25zKCkKLSAgCi17Ci0gIGlmKGthdHdhaGwoKT09S19CRVNUKQotICAgIHJldHVybiB3b3JkRnJlcS5uVHJhbnNwV29yZHM7Ci0gIGVsc2UKLSAgICByZXR1cm4ga2F0RnJlcS5uS2F0cyp3b3JkRnJlcS5uVHJhbnNwV29yZHM7Ci19Ci0KLWludCBLYXRlZ1Byb2JsZW06OmV4cGVjdGVkTnVtYmVyT2ZJdGVyYXRpb25zKCkKLQotewotICAKLSAgaWYoa2F0d2FobCgpPT1LX0JFU1QpCi0gICAgcmV0dXJuIDEwKndvcmRGcmVxLm5UcmFuc3BXb3JkczsKLSAgZWxzZQotICAgIHJldHVybiAxMyprYXRGcmVxLm5LYXRzKndvcmRGcmVxLm5UcmFuc3BXb3JkczsKLX0KLQotdm9pZCBLYXRlZ1Byb2JsZW06Om1ha2VUaXRsZShjaGFyIHhbNTEyXSkKLSAgCi17Ci0gIGNoYXIgKnd3OwotICBjaGFyICprdzsKLSAgY2hhciAqaW47Ci0gIHN3aXRjaCh3b3J0d2FobCgpKQotICAgIHsKLSAgICBjYXNlIFdfUkFOOgotICAgICAgd3c9Inp1ZmFlbGxpZyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdfREVUX0RFQ1I6Ci0gICAgICB3dz0iYWJzdGVpZ2VuZCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdfREVUX0lOQ1I6Ci0gICAgICB3dz0iYXVmc3RlaWdlbmQiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGNlcnIgPDwgIkVycm9yOiB1bmtub3duIHdvcmQgc2VsZWN0aW9uXG4iOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIHN3aXRjaChrYXR3YWhsKCkpCi0gICAgewotICAgIGNhc2UgS19ERVQ6Ci0gICAgICBrdz0icm90aWVyZW5kIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgS19SQU46Ci0gICAgICBrdz0ienVmYWVsbGlnIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgS19CRVNUOgotICAgICAga3c9ImJlc3QgICAgICI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgY291dCA8PCAiRXJyb3I6IHVua25vd24gY2FnZWdvcnkgc2VsZWN0aW9uXG4iOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIHN3aXRjaChpbml0aWFsaXNpZXJ1bmcpCi0gICAgewotICAgIGNhc2UgSU5JVF9SQU46Ci0gICAgICBpbj0ienVmYWVsbGlnICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElOSVRfQUlPOgotICAgICAgaW49ImFsbC1pbi1vbmUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTklUX0xXUlc6Ci0gICAgICBpbj0ibHdydyAgICAgICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElOSVRfRlJFUToKLSAgICAgIGluPSJmcmVxICAgICAgIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU5JVF9PVEhFUjoKLSAgICAgIGluPSJvdGhlciAgICAgIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBjb3V0IDw8ICJFcnJvcjogdW5rbm93biBpbml0aWFsaXphdGlvblxuIjsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICBzcHJpbnRmKHgsIihjOiVkLHc6JWQoJWQpLHd3OiVzLGt3OiVzLGluOiVzKSIsa2F0RnJlcS5uS2F0cyx3b3JkRnJlcS5uV29yZHMsCi0JICB3b3JkRnJlcS5uVHJhbnNwV29yZHMsd3csa3csaW4pOwotfQotCi0gIAotICAKLSAgCi1pbnQgS2F0ZWdQcm9ibGVtOjpfY2hhbmdlKFByb2JsZW1DaGFuZ2UgKipwKQotICAKLXsKLSAgKnA9MDsKLSAgaW50IHdvcmQ9Y3VyRGltZW5zaW9uKCk7Ci0gIHN3aXRjaCggd29ydHdhaGwoKSApCi0gICAgewotICAgIGNhc2UgV19SQU46IAotICAgICAgd29yZD0oKih3b3JkRnJlcS5hYnN0ZWlnZW5kKSlbcmFuZG9tSW50KHdvcmRGcmVxLm5UcmFuc3BXb3JkcyldOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXX0RFVF9ERUNSOiAKLSAgICAgIHdvcmQ9KCood29yZEZyZXEuYWJzdGVpZ2VuZCkpW3dvcmRdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXX0RFVF9JTkNSOiAKLSAgICAgIHdvcmQ9KCood29yZEZyZXEuYWJzdGVpZ2VuZCkpW3dvcmRGcmVxLm5UcmFuc3BXb3Jkcy13b3JkLTFdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGNlcnIgPDwgIkVycm9yOiBVbmtub3duIHdvcmQgc2VsZWN0aW9uXG4iOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgaW50IGthdD1jdXJEaW1lbnNpb25WYWwoKSsyOyAKLSAgc3dpdGNoKCBrYXR3YWhsKCkgKQotICAgIHsKLSAgICBjYXNlIEtfUkFOOiAKLSAgICAgIGthdD1yYW5kb21JbnQoa2F0RnJlcS5uS2F0cy0yKSsyOwotICAgICAgCi0gICAgY2FzZSBLX0RFVDogCi0gICAgICAKLSAgICAgIAotICAgICAgaWYoIGthdD09a2F0T2ZXb3JkKHdvcmQpfHwoa2F0V2FzRW1wdHkmJmthdEZyZXEubjEoa2F0KT09MCkgKQotCXJldHVybiAwOyAgCi0gICAgICBlbHNlIGlmKCB3b3JkRnJlcS5taW5JbmRleFt3b3JkXT4wICYmIHdvcmRGcmVxLm1heEluZGV4W3dvcmRdPjAgJiYgKGthdDx3b3JkRnJlcS5taW5JbmRleFt3b3JkXXx8a2F0PndvcmRGcmVxLm1heEluZGV4W3dvcmRdKSkKLQl7Ci0JICAKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBLYXRlZ1Byb2JsZW1DaGFuZ2UgKmMgPSBuZXcgS2F0ZWdQcm9ibGVtQ2hhbmdlOwotCSAgYy0+dG9LYXQ9a2F0OwotCSAgYy0+d29yZD13b3JkOwotCSAgYy0+ZnJvbUthdD1rYXRPZldvcmQoYy0+d29yZCk7Ci0JICBtYXNzZXJ0KCBjLT50b0thdCA8IGthdEZyZXEubkthdHMgKTsKLQkgIG1hc3NlcnQoIGMtPmZyb21LYXQgPCBrYXRGcmVxLm5LYXRzICk7Ci0JICBtYXNzZXJ0KCBjLT53b3JkIDwgd29yZEZyZXEubldvcmRzICk7Ci0JICBtYXNzZXJ0KCBjLT50b0thdCE9MCAgICYmIGMtPnRvS2F0IT0xICk7Ci0JICBtYXNzZXJ0KCBjLT5mcm9tS2F0IT0wICYmIGMtPmZyb21LYXQhPTEgKTsKLQkgIGlmKGthdEZyZXEubjEoa2F0KT09MCkgCi0JICAgIGthdFdhc0VtcHR5PTE7ICAgICAgIAotCSAgKnA9YzsKLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgS19CRVNUOiAKLSAgICAgIHsKLQlmaWxsTldHKHdvcmQpOwotCWRvdWJsZSBzbWFsbGVzdD0xZTEwMDsKLQlLYXRlZ1Byb2JsZW1DaGFuZ2UgJnNtYWxsZXN0Q2hhbmdlID0gKm5ldyBLYXRlZ1Byb2JsZW1DaGFuZ2U7Ci0Jc2hvcnQgd2l0aEVtcHR5PTA7Ci0JCi0JCi0JaW50IHN0YXJ0S2F0PTI7Ci0JaW50IGVuZEthdD1rYXRGcmVxLm5LYXRzOwotCWlmKCB3b3JkRnJlcS5taW5JbmRleFt3b3JkXT4wJiZ3b3JkRnJlcS5tYXhJbmRleFt3b3JkXT4wICkKLQkgIHsKLQkgICAgc3RhcnRLYXQgPSBtYXgoMix3b3JkRnJlcS5taW5JbmRleFt3b3JkXSk7Ci0JICAgIGVuZEthdCA9IG1pbihrYXRGcmVxLm5LYXRzLHdvcmRGcmVxLm1heEluZGV4W3dvcmRdKzEpOwotCSAgfQotCWZvcihrYXQ9c3RhcnRLYXQ7a2F0PGVuZEthdDtrYXQrKykKLQkgIHsKLQkgICAgaWYoIGthdCE9a2F0T2ZXb3JkKHdvcmQpICYmICh3aXRoRW1wdHk9PTAgfHwga2F0RnJlcS5uMShrYXQpIAotCQkJCQkgfHwga2F0RnJlcS5uMihrYXQpKSApCi0JICAgICAgewotCQlLYXRlZ1Byb2JsZW1DaGFuZ2UgYzsKLQkJYy50b0thdD1rYXQ7Ci0JCWMud29yZD13b3JkOwotCQljLmZyb21LYXQ9a2F0T2ZXb3JkKHdvcmQpOwotCQlkb3VibGUgbj1fdmFsdWVDaGFuZ2UoYyk7Ci0JCWlmKG48c21hbGxlc3QpCi0JCSAgewotCQkgICAgc21hbGxlc3Q9bjsKLQkJICAgIHNtYWxsZXN0Q2hhbmdlPWM7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgaWYoIGthdEZyZXEubjEoa2F0KT09MCAmJiBrYXRGcmVxLm4yKGthdCk9PTAgKQotCSAgICAgIHdpdGhFbXB0eT0xOwotCSAgfQotCW1hc3NlcnQoc21hbGxlc3QhPTFlMTAwKTsKLQkqcD0gJnNtYWxsZXN0Q2hhbmdlOwotCXJldHVybiAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGNlcnIgPDwgIkVycm9yOiBVbmtub3duIGNhdGVnb3J5IHNlbGVjdGlvblxuIjsKLSAgICAgIGV4aXQoMSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLXZvaWQgS2F0ZWdQcm9ibGVtOjpfZG9DaGFuZ2UoUHJvYmxlbUNoYW5nZSAmYykKLSAgCi17Ci0gIEthdGVnUHJvYmxlbUNoYW5nZSAmaz0qKEthdGVnUHJvYmxlbUNoYW5nZSAqKSZjOwotICBwdXRXb3JkKGsud29yZCxrLnRvS2F0KTsKLSAgCi19Ci0KLXZvaWQgS2F0ZWdQcm9ibGVtOjpfdW5kb0NoYW5nZShQcm9ibGVtQ2hhbmdlICZjKQotICAKLXsKLSAgS2F0ZWdQcm9ibGVtQ2hhbmdlICZrPSooS2F0ZWdQcm9ibGVtQ2hhbmdlICopJmM7Ci0gIHB1dFdvcmQoay53b3JkLGsuZnJvbUthdCk7Ci0gIAotfQotCi12b2lkIEthdGVnUHJvYmxlbTo6aW5jcmVtZW50RGlyZWN0aW9uKCkKLSAgCi17Ci0gIFByb2JsZW06OmluY3JlbWVudERpcmVjdGlvbigpOwotICBrYXRXYXNFbXB0eT0wOyAKLSAgbWFzc2VydCggX21heENvbXA9PXdvcmRGcmVxLm5UcmFuc3BXb3JkcyApOwotfQotCi1kb3VibGUgS2F0ZWdQcm9ibGVtOjpfdmFsdWUoKQotICAKLXsKLSAgCi0gIHJldHVybiBrYXRGcmVxLmZ1bGxCZXdlcnR1bmcoYXVzd2VydHVuZyk7Ci19Ci0KLQotZG91YmxlIG1rYXRfaF9mdWxsKGludCBuLGRvdWJsZSB0ZikKLXsKLSAgCi0gIAotICBpZiggdGY+MCApCi0gICAgcmV0dXJuIG4qbG9nKHRmKTsKLSAgZWxzZSAKLSAgICByZXR1cm4gMC4wOwotfQotCi1kb3VibGUgbWthdF9oX3BhcnQoaW50IG4sZG91YmxlIGNmKQotewotICAKLSAgCi0gIGlmKCBjZj4wLjAgKQotICAgIHJldHVybiBuKmxvZyhjZik7Ci0gIGVsc2UKLSAgICByZXR1cm4gMC4wOwotfQotCi1kb3VibGUgS2F0ZWdQcm9ibGVtOjprYXRfaF9mdWxsKGludCBuKQotewotICByZXR1cm4gbWthdF9oX2Z1bGwobix2ZXJmYWVsc2NoZShuLHNpZ21hVmVyZmFlbHNjaHVuZykpOwotfQotZG91YmxlIEthdGVnUHJvYmxlbTo6a2F0X2hfZnVsbChkb3VibGUgbikKLXsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIG1rYXRfaF9mdWxsKChpbnQpbix2ZXJmYWVsc2NoZShuLHNpZ21hVmVyZmFlbHNjaHVuZykpOwotfQotCi1kb3VibGUgS2F0ZWdQcm9ibGVtOjprYXRfaF9wYXJ0KGludCBuKQotewotICByZXR1cm4gbWthdF9oX3BhcnQobix2ZXJmYWVsc2NoZShuLHNpZ21hVmVyZmFlbHNjaHVuZykpOwotfQotZG91YmxlIEthdGVnUHJvYmxlbTo6a2F0X2hfcGFydChkb3VibGUgbikKLXsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIG1rYXRfaF9wYXJ0KChpbnQpbix2ZXJmYWVsc2NoZShuLHNpZ21hVmVyZmFlbHNjaHVuZykpOwotfQotCi0gIAotICAKLSAgCi1kb3VibGUgS2F0ZWdQcm9ibGVtOjpubW9fbXkoaW50IGksaW50IGopCi0gIAotewotICBGcmVxVHlwZSBuPW5zdHJpY2goaSxqKSxrPWthdEZyZXEubihpLGopOwotICByZXR1cm4ga2F0X2hfZnVsbChuK2spLWthdF9oX2Z1bGwoayk7Ci19Ci1kb3VibGUgS2F0ZWdQcm9ibGVtOjpubW8oaW50IGksaW50IGopCi0gIAotewotICBGcmVxVHlwZSBuPW5zdHJpY2goaSxqKSxrPWthdEZyZXEubihpLGopOwotICByZXR1cm4ga2F0X2gobitrKS1rYXRfaChrKTsKLX0KLWRvdWJsZSBLYXRlZ1Byb2JsZW06Om5tb19sbyhpbnQgaSxpbnQgaixpbnQgJmUwLGludCAmZTEpCi0gIAotewotICBGcmVxVHlwZSBraWo9a2F0RnJlcS5uKGksaik7Ci0gIEZyZXFUeXBlIG5paj1uc3RyaWNoKGksaikra2lqOwotICBpZigga2lqIT1uaWopCi0gICAgewotICAgICAgaWYoIG5paj09MCApCi0JZTArKzsKLSAgICAgIGVsc2UgaWYobmlqPT0xKQotCWUxKys7Ci0gICAgICBpZigga2lqPT0wICkKLQllMC0tOwotICAgICAgZWxzZSBpZihraWo9PTEpCi0JZTEtLTsKLSAgICB9Ci0gIHJldHVybiBuaWoqa2F0X21sb2cobmlqLTEtcmhvTG8pLWtpaiprYXRfbWxvZyhraWotMS1yaG9Mbyk7Ci19Ci0KLQotZG91YmxlIEthdGVnUHJvYmxlbTo6X3ZhbHVlQ2hhbmdlKEthdGVnUHJvYmxlbUNoYW5nZSAmaykKLSAgCi17Ci0gIGRvdWJsZSB2PTA7Ci0gIGludCBpPTA7Ci0gIAotICB1cnNwcnVuZz1rLmZyb21LYXQ7Ci0gIHppZWw9ay50b0thdDsKLQotICBpZiggYXVzd2VydHVuZz09Q1JJVEVSSU9OX0xPICkKLSAgICB7Ci0gICAgICBpbnQgZTBhPWthdEZyZXEuZXRhMCxlMWE9a2F0RnJlcS5ldGExOwotICAgICAgdi09bm1vX2xvKHVyc3BydW5nLHVyc3BydW5nLGUwYSxlMWEpK25tb19sbyh6aWVsLHppZWwsZTBhLGUxYSkKLQkrbm1vX2xvKHVyc3BydW5nLHppZWwsZTBhLGUxYSkrbm1vX2xvKHppZWwsdXJzcHJ1bmcsZTBhLGUxYSk7Ci0gICAgICBpPTA7Ci0gICAgICB3aGlsZShpPG53Zy5hbnpOb3QwKQotCXsKLQkgIGludCBjbD1ud2cubm90MFtpXTsKLQkgIGlmKCBjbCE9IHVyc3BydW5nICYmIGNsIT16aWVsICkKLQkgICAgdiAtPSBubW9fbG8odXJzcHJ1bmcsY2wsZTBhLGUxYSkrbm1vX2xvKHppZWwsY2wsZTBhLGUxYSk7Ci0JICBpKys7Ci0JfQotICAgICAgaT0wOwotICAgICAgd2hpbGUoaTxuZ3cuYW56Tm90MCkKLQl7Ci0JICBpbnQgY2w9bmd3Lm5vdDBbaV07Ci0JICBpZiggY2whPSB1cnNwcnVuZyAmJiBjbCE9emllbCApCi0JICAgIHYgLT0gbm1vX2xvKGNsLHVyc3BydW5nLGUwYSxlMWEpK25tb19sbyhjbCx6aWVsLGUwYSxlMWEpOwotCSAgaSsrOwotCX0KLSAgICAgIAotICAgICAgdis9a2F0X2hsbyhrYXRGcmVxLm4xKHVyc3BydW5nKS13b3JkRnJlcS5uMShrLndvcmQpKQotCS1rYXRfaGxvKGthdEZyZXEubjEodXJzcHJ1bmcpKQotCStrYXRfaGxvKGthdEZyZXEubjIodXJzcHJ1bmcpLXdvcmRGcmVxLm4yKGsud29yZCkpCi0JLWthdF9obG8oa2F0RnJlcS5uMih1cnNwcnVuZykpCi0gICAgICAgICtrYXRfaGxvKGthdEZyZXEubjEoemllbCkrd29yZEZyZXEubjEoay53b3JkKSkKLQkta2F0X2hsbyhrYXRGcmVxLm4xKHppZWwpKQotCStrYXRfaGxvKGthdEZyZXEubjIoemllbCkrd29yZEZyZXEubjIoay53b3JkKSkKLQkta2F0X2hsbyhrYXRGcmVxLm4yKHppZWwpKTsKLQotICAgICAgaW50IG9sZDA9a2F0RnJlcS5jMV8wKmthdEZyZXEubkthdHMra2F0RnJlcS5jMl8wKmthdEZyZXEubkthdHMKLQkgICAgICAta2F0RnJlcS5jMV8wKmthdEZyZXEuYzJfMDsKLSAgICAgIGludCBuYzFfMD1rYXRGcmVxLmMxXzAsbmMyXzA9a2F0RnJlcS5jMl8wOwotICAgICAgaWYoIHdvcmRGcmVxLm4xKGsud29yZCk+MCAmJiBrYXRGcmVxLm4xKHVyc3BydW5nKT09d29yZEZyZXEubjEoay53b3JkKSApIAotCW5jMV8wKys7Ci0gICAgICBpZiggd29yZEZyZXEubjIoay53b3JkKT4wICYmIGthdEZyZXEubjIodXJzcHJ1bmcpPT13b3JkRnJlcS5uMihrLndvcmQpICkgCi0JbmMyXzArKzsKLSAgICAgIGlmKCB3b3JkRnJlcS5uMShrLndvcmQpPjAgJiYga2F0RnJlcS5uMSh6aWVsKT09MCApIG5jMV8wLS07Ci0gICAgICBpZiggd29yZEZyZXEubjIoay53b3JkKT4wICYmIGthdEZyZXEubjIoemllbCk9PTAgKSBuYzJfMC0tOwotICAgICAgaW50IG5ldzA9bmMxXzAqa2F0RnJlcS5uS2F0cytuYzJfMCprYXRGcmVxLm5LYXRzLW5jMV8wKm5jMl8wOwotICAgICAgdi09a2F0X2V0YUZrdChlMGEsZTFhLG5ldzAsa2F0RnJlcS5uS2F0cykKLQkta2F0X2V0YUZrdChrYXRGcmVxLmV0YTAsa2F0RnJlcS5ldGExLG9sZDAsa2F0RnJlcS5uS2F0cyk7Ci0gICAgICB2YXNzZXJ0KE5VTExGTE9BVChQcm9ibGVtOjp2YWx1ZUNoYW5nZShrKS12KSk7Ci0gICAgfQotICBlbHNlIGlmKGF1c3dlcnR1bmc9PUNSSVRFUklPTl9NTCkKLSAgICB7Ci0gICAgICB2LT1ubW8odXJzcHJ1bmcsdXJzcHJ1bmcpK25tbyh6aWVsLHppZWwpCi0JK25tbyh1cnNwcnVuZyx6aWVsKStubW8oemllbCx1cnNwcnVuZyk7Ci0gICAgICBpPTA7Ci0gICAgICB3aGlsZShpPG53Zy5hbnpOb3QwKQotCXsKLQkgIGludCBjbD1ud2cubm90MFtpXTsKLQkgIGlmKCBjbCE9IHVyc3BydW5nICYmIGNsIT16aWVsICkKLQkgICAgICB2IC09IG5tbyh1cnNwcnVuZyxjbCkrbm1vKHppZWwsY2wpOwotCSAgaSsrOwotCX0KLSAgICAgIGk9MDsKLSAgICAgIHdoaWxlKGk8bmd3LmFuek5vdDApCi0JewotCSAgaW50IGNsPW5ndy5ub3QwW2ldOwotCSAgaWYoIGNsIT0gdXJzcHJ1bmcgJiYgY2whPXppZWwgKQotCSAgICB2IC09IG5tbyhjbCx1cnNwcnVuZykrbm1vKGNsLHppZWwpOwotCSAgaSsrOwotCX0KLSAgICAgIHYrPWthdF9oKGthdEZyZXEubjEodXJzcHJ1bmcpLXdvcmRGcmVxLm4xKGsud29yZCkpCi0JLWthdF9oKGthdEZyZXEubjEodXJzcHJ1bmcpKQotICAgICAgICAra2F0X2goa2F0RnJlcS5uMih1cnNwcnVuZyktd29yZEZyZXEubjIoay53b3JkKSkKLQkta2F0X2goa2F0RnJlcS5uMih1cnNwcnVuZykpCi0JK2thdF9oKGthdEZyZXEubjEoemllbCkrd29yZEZyZXEubjEoay53b3JkKSkKLSAgICAgICAgLWthdF9oKGthdEZyZXEubjEoemllbCkpCi0JK2thdF9oKGthdEZyZXEubjIoemllbCkrd29yZEZyZXEubjIoay53b3JkKSkKLSAgICAgICAgLWthdF9oKGthdEZyZXEubjIoemllbCkpOwotICAgIH0KLSAgZWxzZSBpZiggYXVzd2VydHVuZz09Q1JJVEVSSU9OX01ZICkKLSAgICB7Ci0gICAgICB2LT1ubW9fbXkodXJzcHJ1bmcsdXJzcHJ1bmcpK25tb19teSh6aWVsLHppZWwpCi0JK25tb19teSh1cnNwcnVuZyx6aWVsKStubW9fbXkoemllbCx1cnNwcnVuZyk7Ci0gICAgICBpPTA7Ci0gICAgICB3aGlsZShpPG53Zy5hbnpOb3QwKQotCXsKLQkgIGludCBjbD1ud2cubm90MFtpXTsKLQkgIGlmKCBjbCE9IHVyc3BydW5nICYmIGNsIT16aWVsICkKLQkgICAgICB2IC09IG5tb19teSh1cnNwcnVuZyxjbCkrbm1vX215KHppZWwsY2wpOwotCSAgaSsrOwotCX0KLSAgICAgIGk9MDsKLSAgICAgIHdoaWxlKGk8bmd3LmFuek5vdDApCi0JewotCSAgaW50IGNsPW5ndy5ub3QwW2ldOwotCSAgaWYoIGNsIT0gdXJzcHJ1bmcgJiYgY2whPXppZWwgKQotCSAgICB2IC09IG5tb19teShjbCx1cnNwcnVuZykrbm1vX215KGNsLHppZWwpOwotCSAgaSsrOwotCX0KLSAgICAgIHYrPWthdF9oX3BhcnQoa2F0RnJlcS5uMSh1cnNwcnVuZyktd29yZEZyZXEubjEoay53b3JkKSkKLQkta2F0X2hfcGFydChrYXRGcmVxLm4xKHVyc3BydW5nKSkKLSAgICAgICAgK2thdF9oX3BhcnQoa2F0RnJlcS5uMih1cnNwcnVuZyktd29yZEZyZXEubjIoay53b3JkKSkKLQkta2F0X2hfcGFydChrYXRGcmVxLm4yKHVyc3BydW5nKSkKLQkra2F0X2hfcGFydChrYXRGcmVxLm4xKHppZWwpK3dvcmRGcmVxLm4xKGsud29yZCkpCi0gICAgICAgIC1rYXRfaF9wYXJ0KGthdEZyZXEubjEoemllbCkpCi0JK2thdF9oX3BhcnQoa2F0RnJlcS5uMih6aWVsKSt3b3JkRnJlcS5uMihrLndvcmQpKQotICAgICAgICAta2F0X2hfcGFydChrYXRGcmVxLm4yKHppZWwpKTsKLSAgICAgIGRvdWJsZSBiaXNoWnVzYXR6ID0ga2F0RnJlcS5teUNyaXRlcmlvblRlcm0oKTsKLSAgICAgIF9kb0NoYW5nZShrKTsKLSAgICAgIGRvdWJsZSBuZXVadXNhdHogPSBrYXRGcmVxLm15Q3JpdGVyaW9uVGVybSgpOwotICAgICAgX3VuZG9DaGFuZ2Uoayk7Ci0gICAgICBpZih2ZXJib3NlTW9kZT4yKQotCWNvdXQgPDwgIlpVU0FUWjogIiA8PCBiaXNoWnVzYXR6IDw8ICIgIiA8PCBuZXVadXNhdHogPDwgIiAiIDw8bmV1WnVzYXR6LWJpc2hadXNhdHo8PCIgICIgPDwgdiA8PCAgZW5kbDsKLSAgICAgIHYrPW5ldVp1c2F0ei1iaXNoWnVzYXR6OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNlcnIgPDwgIkZhdGFsIGVycm9yOiBVbmtub3duIGNyaXRlcmlvbjogJyI8PGF1c3dlcnR1bmc8PCInXG4iOwotICAgIH0KLSAgdmFzc2VydCggTlVMTEZMT0FUKFByb2JsZW06OnZhbHVlQ2hhbmdlKGspLXYpICk7Ci0gIHJldHVybiB2OwotfQotCi0KLXZvaWQgS2F0ZWdQcm9ibGVtOjpmaWxsTldHKGludCB3KQotICAKLXsKLSAgaWYobndnV29yZD09dykKLSAgICByZXR1cm47IAotICBlbHNlCi0gICAgewotICAgICAgQXJyYXk8T25lRnJlcT4gJmFmdGVyPXdvcmRGcmVxLmFmdGVyW3ddOwotICAgICAgaW50IHNpemU9YWZ0ZXIuc2l6ZSgpLGk7Ci0gICAgICBud3c9MDsKLSAgICAgIG53Zy5pbml0KCk7Ci0gICAgICBmb3IoaT0wO2k8c2l6ZTtpKyspCi0JewotCSAgbndnLmFkZEZyZXEoa2F0T2ZXb3JkKGFmdGVyW2ldLncpLGFmdGVyW2ldLm4pOwotCSAgaWYoYWZ0ZXJbaV0udz09dykKLQkgICAgbnd3PWFmdGVyW2ldLm47Ci0JfQotCi0gICAgICBBcnJheTxPbmVGcmVxPiAmYmVmb3JlPXdvcmRGcmVxLmJlZm9yZVt3XTsKLSAgICAgIHNpemU9YmVmb3JlLnNpemUoKTsKLSAgICAgIG5ndy5pbml0KCk7Ci0gICAgICBmb3IoaT0wO2k8c2l6ZTtpKyspCi0Jbmd3LmFkZEZyZXEoa2F0T2ZXb3JkKGJlZm9yZVtpXS53KSxiZWZvcmVbaV0ubik7Ci0gICAgICBud2dXb3JkPXc7Ci0gICAgfQotfQotCi12b2lkIEthdGVnUHJvYmxlbTo6dm5zdHJpY2goaW50IGksaW50IGopCi0gIAotewotICBjb3V0IDw8ICIuKSAiIDw8IGthdEZyZXEubihpLGopIDw8ICIgIjsKLSAgaWYoIGk9PXVyc3BydW5nICkKLSAgICBjb3V0IDw8ICJhKSAiPDwtbndnLmdldEZyZXEoaikgPDwgIiAiOwotICBpZiggaT09emllbCApCi0gICAgY291dCA8PCAiYikgIiA8PG53Zy5nZXRGcmVxKGopIDw8ICIgIjsKLSAgCi0gIGlmKCBqPT11cnNwcnVuZyApCi0gICAgY291dCA8PCAiYykgIiA8PC1uZ3cuZ2V0RnJlcShpKSA8PCAiICI7Ci0gIGlmKCBqPT16aWVsICkKLSAgICBjb3V0IDw8ICJkKSAiIDw8K25ndy5nZXRGcmVxKGkpIDw8ICIgIiA7Ci0gIAotICBpZiggaT09dXJzcHJ1bmcgJiYgaj09dXJzcHJ1bmcgKQotICAgIGNvdXQgPDwgImUpICIgPDwrbnd3IDw8ICIgIjsKLSAgaWYoIGk9PXppZWwgJiYgaj09emllbCApCi0gICAgY291dCA8PCAiZikgIiA8PCtud3cgPDwgIiAiIDsKLSAgaWYoIGk9PXVyc3BydW5nICYmIGo9PXppZWwgKQotICAgIGNvdXQgPDwgImcpICIgPDwtbnd3IDw8ICIgIjsKLSAgaWYoIGk9PXppZWwgJiYgaj09dXJzcHJ1bmcgKQotICAgIGNvdXQgPDwgImgpICIgPDwtbnd3IDw8ICIgIjsKLX0KLQotCi0KLQotCi12b2lkIEthdGVnUHJvYmxlbTo6ZmFzdFB1dFdvcmQoaW50IHdvcmQsaW50IHRvS2F0KQotICAKLXsKLSAgbWFzc2VydCh0b0thdD49MCAmJiB0b0thdDxrYXRGcmVxLm5LYXRzKTsKLSAgCi0gIAotICAKLSAgaWYoIHdvcmRGcmVxLmZpeGVkV29yZFt3b3JkXT49MCApCi0gICAgdG9LYXQ9d29yZEZyZXEuZml4ZWRXb3JkW3dvcmRdOyAKLSAgbWFzc2VydChrYXRPZldvcmQod29yZCk9PS0xKTsKLSAgc2V0S2F0T2ZXb3JkKHdvcmQsdG9LYXQpOwotfQotCi12b2lkIEthdGVnUHJvYmxlbTo6Zml4SW5pdExpa2UoKQotewotICBpbnQgZml4ZWQ9MCxmaXhlZDI9MDsKLSAgb3Zlcl9hcnIoaW5pdExpa2UsaSkKLSAgICBpZihpbml0TGlrZVtpXT49MCApCi0gICAgICB7Ci0JZml4ZWQrKzsKLQlpZiggaW5pdExpa2VbaV0+PXdvcmRGcmVxLm1pbkluZGV4W2ldIHx8IGluaXRMaWtlW2ldPT0xICkKLQkgIHdvcmRGcmVxLmZpeGVkV29yZFtpXT1pbml0TGlrZVtpXTsKLQllbHNlCi0JICB7Ci0JICAgIHdvcmRGcmVxLmZpeGVkV29yZFtpXT13b3JkRnJlcS5taW5JbmRleFtpXStpbml0TGlrZVtpXS0yOwotCSAgICBmaXhlZDIrKzsKLQkgIH0KLQlpbml0TGlrZVtpXT0tMTsKLSAgICAgIH0KLSAgY291dCA8PCAiRml4ZWQgZnJvbSBmaWxlIGFyZTogIiA8PCBmaXhlZCA8PCAiICIgPDwgZml4ZWQyIDw8ICIgd29yZHMuXG4iOwotfQotCi12b2lkIEthdGVnUHJvYmxlbTo6cHV0V29yZChpbnQgd29yZCxpbnQgdG9LYXQpCi0gIAotewotICBtYXNzZXJ0KHRvS2F0IT0wKTttYXNzZXJ0KHRvS2F0IT0xKTsKLSAgbWFzc2VydCh3b3JkPHdvcmRGcmVxLm5Xb3Jkcyk7Ci0gIG1hc3NlcnQodG9LYXQ8a2F0RnJlcS5uS2F0cyk7Ci0gIG1hc3NlcnQod29yZEZyZXEuZml4ZWRXb3JkW3dvcmRdPDApOwotICBpbnQgaz1rYXRPZldvcmQod29yZCk7Ci0gIG1hc3NlcnQoayE9MCYmayE9MSk7Ci0gIEFycmF5PE9uZUZyZXE+JiBhZnQ9d29yZEZyZXEuYWZ0ZXJbd29yZF07Ci0gIEFycmF5PE9uZUZyZXE+JiBiZWY9d29yZEZyZXEuYmVmb3JlW3dvcmRdOwotICBpbnQgbkFmdD1hZnQuc2l6ZSgpOwotICBpbnQgbkJlZj1iZWYuc2l6ZSgpOwotICBpbnQgaTsKLSAgaWYodmVyYm9zZU1vZGU+NCkKLSAgICBjb3V0IDw8ICJwdXRXb3JkKCIgPDwgd29yZCA8PCAiLCIgPDwgdG9LYXQgPDwgIikiIDw8IGsgPDwgIiBuQWZ0IiAKLSAgICAgIDw8IG5BZnQgPDwgIiBuQmVmIiA8PCBuQmVmIDw8ICIgayIgPDwgayA8PCAiXG4iOwotCi0gIG1hc3NlcnQoIGshPS0xICk7ICAKLSAgbWFzc2VydCggayE9dG9LYXQgKTsKLQotICBmb3IoaT0wO2k8bkFmdDtpKyspCi0gICAgewotICAgICAga2F0RnJlcS5hZGROKGssa2F0T2ZXb3JkKGFmdFtpXS53KSwtYWZ0W2ldLm4pOwotICAgICAgaWYodmVyYm9zZU1vZGU+NCkKLQljb3V0IDw8IGsgPDwgIiAiIDw8IGthdE9mV29yZChhZnRbaV0udykgPDwgIiAiIDw8IC1hZnRbaV0ubiA8PCBlbmRsOwotICAgIH0KLSAgZm9yKGk9MDtpPG5CZWY7aSsrKQotICAgIGlmKCBiZWZbaV0udyE9d29yZCApIAotICAgICAgewotCWthdEZyZXEuYWRkTihrYXRPZldvcmQoYmVmW2ldLncpLGssLWJlZltpXS5uKTsKLQlpZih2ZXJib3NlTW9kZT40KQotCSAgY291dCA8PCBrYXRPZldvcmQoYmVmW2ldLncpIDw8ICIgIiA8PCBrIDw8ICIgIiA8PCAtYmVmW2ldLm4gPDwgZW5kbDsKLSAgICAgIH0KLQkgIAotICBzZXRLYXRPZldvcmQod29yZCx0b0thdCk7Ci0KLSAgZm9yKGk9MDtpPG5BZnQ7aSsrKQotICAgIGthdEZyZXEuYWRkTih0b0thdCxrYXRPZldvcmQoYWZ0W2ldLncpLGFmdFtpXS5uKTsKLSAgZm9yKGk9MDtpPG5CZWY7aSsrKQotICAgIGlmKCBiZWZbaV0udyE9d29yZCApIAotICAgICAga2F0RnJlcS5hZGROKGthdE9mV29yZChiZWZbaV0udyksdG9LYXQsYmVmW2ldLm4pOwotCi19Ci0KLQotCi0gIAotICAKLSAgCi0KLQotCi0KLXN0YXRpYyBLYXRlZ1Byb2JsZW1DaGFuZ2UgdGhlT25lS2F0ZWdQcm9ibGVtQ2hhbmdlOyAKLXN0YXRpYyBpbnQgYW56S2F0ZWdQcm9ibGVtQ2hhbmdlPTA7Ci0KLXZvaWQgKkthdGVnUHJvYmxlbUNoYW5nZTo6b3BlcmF0b3IgbmV3KHNpemVfdCBzaXplKQoteyAKLSAgYW56S2F0ZWdQcm9ibGVtQ2hhbmdlKys7Ci0gIG1hc3NlcnQoYW56S2F0ZWdQcm9ibGVtQ2hhbmdlPjApOwotICBtYXNzZXJ0KGFuekthdGVnUHJvYmxlbUNoYW5nZTwyKTsKLSAgaWYoIGFuekthdGVnUHJvYmxlbUNoYW5nZT09MSApCi0gICAgcmV0dXJuICZ0aGVPbmVLYXRlZ1Byb2JsZW1DaGFuZ2U7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiggdmVyYm9zZU1vZGU+MSApCi0JY291dCA8PCAiZ2VuZXJhdGUgaW5zdGFuY2Ugb2YgS2F0ZWdQcm9ibGVtQ2hhbmdlOiAiIDw8IHNpemUgCi0JICA8PCAiICIgPDwgYW56S2F0ZWdQcm9ibGVtQ2hhbmdlPDwgIGVuZGw7Ci0gICAgICByZXR1cm4gbWFsbG9jKHNpemUpOyAKLSAgICB9Ci19Ci12b2lkIEthdGVnUHJvYmxlbUNoYW5nZTo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKnB0cixzaXplX3QgCi0pCi17IG1hc3NlcnQoc2l6ZT09c2l6ZW9mKEthdGVnUHJvYmxlbUNoYW5nZSkpOwotICBhbnpLYXRlZ1Byb2JsZW1DaGFuZ2UtLTsKLSAgaWYoIHB0ciE9ICZ0aGVPbmVLYXRlZ1Byb2JsZW1DaGFuZ2UpCi0gICAgZnJlZShwdHIpOwotfQotCi0KLQotICAKLSAgCi0gIAotCi0KLQotCi0KLQotTldHOjpOV0coaW50IG4pIDogZnJlcShuLDApLHRpbWVPZkZyZXEobiwwKSxub3QwKG4pLHdvcmQoLTEpCi17Ci0gIG1hc3NlcnQobj4wKTsKLSAgY3VyVGltZT0xOwotICBpbml0KCk7Ci19Ci0KLXZvaWQgTldHOjppbml0KCkKLXsKLSAgY3VyVGltZSsrOwotICBhbnpOb3QwPTA7Ci19Ci0KLXZvaWQgTldHOjpzb3J0KCkKLXsKLSAgcXNvcnQobm90MC5nZXRQb2ludGVyVG9EYXRhKCksYW56Tm90MCxzaXplb2YoaW50KSxpbnRjb21wYXJlKTsKLSAgbWFzc2VydChhbnpOb3QwPD1ub3QwLnNpemUoKSk7Ci19Ci0KLQotaW50IEthdGVnUHJvYmxlbTo6bWF4RGltZW5zaW9uKCkKLXsKLSAgcmV0dXJuIF9tYXhDb21wOwotfQotCi1pbnQgS2F0ZWdQcm9ibGVtOjptYXhEaW1lbnNpb25WYWwoKQotewotICByZXR1cm4gX21heENvbXBWYWw7Ci19Ci0JCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9LYXRlZ1Byb2JsZW0uaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0thdGVnUHJvYmxlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWE1YTQ2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0thdGVnUHJvYmxlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0KLQotCi0jaWZuZGVmIEtBVEVHX09QVF9ICi0jZGVmaW5lIEtBVEVHX09QVF9ICi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiUHJvYmxlbS5oIgotCi1leHRlcm4gZG91YmxlIHJob0xvOyAKLQotdHlwZWRlZiBpbnQgS2F0ZWdvcnk7ICAgICAgICAKLXR5cGVkZWYgaW50IFdvcmQ7Ci0KLQotCi0jaWZkZWYgRlJFUVRZUEVfRE9VQkxFCi10eXBlZGVmIGRvdWJsZSBGcmVxVHlwZTsKLSNlbHNlCi10eXBlZGVmIGludCBGcmVxVHlwZTsKLSNlbmRpZgotCi0KLSNpbmNsdWRlICJLYXRlZ1Byb2JsZW1XQkMuaCIgCi0KLQotI2luY2x1ZGUgIkthdGVnUHJvYmxlbUtCQy5oIiAKLQotCi1lbnVtIHsgCi0gIElOSVRfUkFOPTEsCi0gIElOSVRfQUlPPTIsCi0gIElOSVRfTFdSVz0zLAotICBJTklUX0ZSRVE9NCwKLSAgSU5JVF9PVEhFUj01Ci0gICAgIH07Ci0KLQotZW51bSB7IAotICBXX1JBTj0oOHwxNiksCi0gIFdfREVUX0RFQ1I9KDE2KSwKLSAgV19ERVRfSU5DUiA9KDMyKQotfTsKLSNkZWZpbmUgQ0hPT1NFX1dPUkQgKDh8MTZ8MzIpCi0KLQotZW51bSB7Ci0gIEtfREVUPSg2NCksCi0gIEtfUkFOPSgxMjgpLAotICBLX0JFU1Q9KDY0fDEyOCkKLX07Ci0jZGVmaW5lIENIT09TRV9LQVQgKDY0fDEyOCkKLQotCi1lbnVtIHsKLSAgQ1JJVEVSSU9OX01MPTAsCi0gIENSSVRFUklPTl9MTz0xLAotICBDUklURVJJT05fTVk9MgotfTsKLQotCi0KLWNsYXNzIE5XRwotewotIHByaXZhdGU6Ci0gIEFycmF5PEZyZXFUeXBlPiBmcmVxOyAgICAgICAKLQotICBBcnJheTxpbnQ+IHRpbWVPZkZyZXE7IAotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJIAotCi0gIGludCBjdXJUaW1lOyAgICAgICAgICAgCi0gcHVibGljOgotICBOV0coaW50IG4pOyAgICAgICAgICAgIAotICB2b2lkIGluaXQoKTsgICAgICAgICAgIAotCi0gIGludCBhbnpOb3QwOyAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgQXJyYXk8aW50PiBub3QwOyAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgaW50IHdvcmQ7ICAgICAgICAgIAotCi0gIGlubGluZSB2b2lkIGFkZEZyZXEoaW50IEMsRnJlcVR5cGUgbik7IAotCi0gIHZvaWQgc29ydCgpOyAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gIEZyZXFUeXBlIGdldEZyZXEoaW50IGkpICAgICAKLSAgICB7Ci0gICAgICBpZiggdGltZU9mRnJlcVtpXT09Y3VyVGltZSApCi0JcmV0dXJuIGZyZXFbaV07Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0gICAgfTsKLX07Ci0KLWlubGluZSB2b2lkIE5XRzo6YWRkRnJlcShpbnQgZyxGcmVxVHlwZSBuKQotewotICBpZih0aW1lT2ZGcmVxW2ddPT1jdXJUaW1lKQotICAgIGZyZXFbZ10rPW47Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0aW1lT2ZGcmVxW2ddPWN1clRpbWU7Ci0gICAgICBmcmVxW2ddPW47Ci0gICAgICBub3QwW2Fuek5vdDArK109ZzsKLSAgICB9Ci19Ci0KLQotCi1zdHJ1Y3QgS2F0ZWdQcm9ibGVtQ2hhbmdlIDogcHVibGljIFByb2JsZW1DaGFuZ2UKLXsKLSAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplKTsKLSAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcHRyLHNpemVfdCBzaXplKTsKLQotICBpbnQgd29yZDsgICAgIAotICBpbnQgdG9LYXQ7ICAgIAotICBpbnQgZnJvbUthdDsgIAotfTsKLQotY2xhc3MgS2F0ZWdQcm9ibGVtIDogcHVibGljIFByb2JsZW0KLXsKLSBwcml2YXRlOgotICBkb3VibGUga2F0X2hfZnVsbChpbnQgbik7Ci0gIGRvdWJsZSBrYXRfaF9mdWxsKGRvdWJsZSBuKTsKLSAgZG91YmxlIGthdF9oX3BhcnQoaW50IG4pOwotICBkb3VibGUga2F0X2hfcGFydChkb3VibGUgbik7Ci0gIGRvdWJsZSBzaWdtYVZlcmZhZWxzY2h1bmc7Ci0gIHNob3J0IGthdFdhc0VtcHR5OwotICAgICAgICAgICAgICAgICAgICAKLQkJICAgIAotCi0gIGludCBud2dXb3JkOwotICAgICAgICAgICAgICAKLSAgTldHIG53ZzsgCi0gIE5XRyBuZ3c7IAotICBGcmVxVHlwZSBud3c7IAotCi0gIGludCB1cnNwcnVuZyx6aWVsOyAgICAKLSAKLSAgQXJyYXk8aW50PiBfa2F0T2ZXb3JkOyAKLQotICBpbnQgX21heENvbXAsX21heENvbXBWYWw7Ci0KLSAgIGRvdWJsZSBubW9fbXkoaW50IGksaW50IGopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGRvdWJsZSBubW8oaW50IGksaW50IGopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIAotCi0gIGRvdWJsZSBubW9fbG8oaW50IGksaW50IGosaW50ICZlMCxpbnQgJmUxKTsgCi0gIAotCi0gICB2b2lkIHB1dFdvcmQoaW50IHdvcmQsaW50IHRvKTsKLSAgCi0KLSAgIHZvaWQgZmFzdFB1dFdvcmQoaW50IHdvcmQsaW50IHRvKTsKLSAgCi0KLSAgIHZvaWQgc2V0S2F0T2ZXb3JkKGludCB3LGludCBrKQotewotICBpZiggISh3b3JkRnJlcS5maXhlZFdvcmRbd109PWt8fHdvcmRGcmVxLmZpeGVkV29yZFt3XT09LTF8fGs9PS0xKSApCi0gICAgewotICAgICAgY291dCA8PCAibWtjbHM6OnNldEthdE9mV29yZDo6RVJST1I6ICIgPDwgdyA8PCAiICIgPDwgayA8PCAiICIgPDwgd29yZEZyZXEuZml4ZWRXb3JkW3ddIDw8ICIgIiA8PCAoKndvcmRzKVt3XSA8PCBlbmRsOwotICAgIH0KLSAgX2thdE9mV29yZFt3XT1rOwotICBud2dXb3JkPS0xOwotfTsKLSAgCi0KLSAgIHZvaWQgZmlsbE5XRyhpbnQgdyk7Ci0gIAotCi0gICBpbmxpbmUgRnJlcVR5cGUgbnN0cmljaChpbnQgaSxpbnQgaik7Ci0gIAotCi0gICB2b2lkIHZuc3RyaWNoKGludCBpLGludCBqKTsKLSAgCi0KLQotIHByb3RlY3RlZDoKLSAgIHZpcnR1YWwgaW50IF9jaGFuZ2UoUHJvYmxlbUNoYW5nZSAqKnApOwotICAKLQotICAgdmlydHVhbCB2b2lkIF9kb0NoYW5nZShQcm9ibGVtQ2hhbmdlICZjKTsKLSAgCi0KLSAgIHZpcnR1YWwgdm9pZCBfdW5kb0NoYW5nZShQcm9ibGVtQ2hhbmdlICZjKTsKLSAgCi0KLSAgIHZpcnR1YWwgZG91YmxlIF92YWx1ZSgpOwotICAKLQotICAgZG91YmxlIF92YWx1ZUNoYW5nZShLYXRlZ1Byb2JsZW1DaGFuZ2UgJmspOwotICAKLQotICAgdmlydHVhbCB2b2lkIGluY3JlbWVudERpcmVjdGlvbigpOwotICAKLQotICAgdmlydHVhbCBpbnQgbWF4RGltZW5zaW9uVmFsKHZvaWQpIDsKLSAgCi0KLSAgIHZpcnR1YWwgaW50IG1heERpbWVuc2lvbih2b2lkKSA7Ci0gIAotICAKLXB1YmxpYzoKLSAgbGVkYV9hcnJheTxzdHJpbmc+ICp3b3JkczsKLXR5cGVkZWYgbGVkYV9zZXQ8aW50PiBpbnRTZXQ7Ci0KLWxlZGFfYXJyYXk8aW50U2V0PiAqa2F0czsKLQkKLSAgS2F0ZWdQcm9ibGVtV0JDIHdvcmRGcmVxOyAgIAotICBLYXRlZ1Byb2JsZW1LQkMga2F0RnJlcTsgICAgCi0KLSAgQXJyYXk8aW50PiBpbml0TGlrZTsgCi0gIAotICAgS2F0ZWdQcm9ibGVtKGludCBhdyxpbnQgbWFrLGludCBfaW5pdGlhbGlzaWVydW5nLGludCBfYXVzd2VydHVuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfbmFjaGJhcnNjaGFmdCxpbnQgbWludz0wKTsKLSAgCi0KLSAgdmlydHVhbCB+S2F0ZWdQcm9ibGVtKCk7Ci0gIAotCi0gICB2aXJ0dWFsIHZvaWQgX2luaXRpYWxpemUoaW50IGluaXRUeXApOwotICAgdmlydHVhbCB2b2lkIF9pbml0aWFsaXplKGludCBpbml0VHlwLGludCBzcGVjaWFsRml4ZWRXb3JkKTsKLSAgCi0KLSAgIHZpcnR1YWwgZG91YmxlIHZhbHVlQ2hhbmdlKFByb2JsZW1DaGFuZ2UmYyk7Ci0gIAotCi0gICB2aXJ0dWFsIFByb2JsZW0gKm1ha2VFcXVhbFByb2JsZW0oKTsKLSAgCi0KLSAgIHZpcnR1YWwgZG91YmxlIG5pY2V2YWx1ZShkb3VibGUgdmFsdWU9MWUxMDApOwotICAKLQotICAgdm9pZCBtYWtlS2F0cygpOwotICAKLQotICAgdmlydHVhbCB2b2lkIGR1bXBPbihvc3RyZWFtICZzdHJtKTsKLSAgCi0KLSAgIHZpcnR1YWwgdm9pZCBkdW1wSW5mb3Mob3N0cmVhbSAmc3RybSk7Ci0gIAotCi0gIAotICAKLSAgCi0gICBpbmxpbmUgdm9pZCBrYXR3YWhsKGludCBrKTsKLSAgCi0KLSAgIGlubGluZSB2b2lkIHdvcnR3YWhsKGludCB3KTsKLSAgCi0KLSAgCi0gIAotICAKLSAgIGlubGluZSBpbnQga2F0T2ZXb3JkKGludCB3KTsKLSAgCi0KLSAgIGlubGluZSBzaG9ydCB3b3J0d2FobCgpOwotICAKLQotICAgaW5saW5lIHNob3J0IGthdHdhaGwoKSA7Ci0gIAotCi0gICB2aXJ0dWFsIGludCBtYXhOb25CZXR0ZXJJdGVyYXRpb25zKCk7Ci0gIAotCi0gICB2aXJ0dWFsIGludCBleHBlY3RlZE51bWJlck9mSXRlcmF0aW9ucygpOwotICAKLQotICAgY29uc3QgY2hhciAqZ2V0U3RyaW5nKGludCBpKTsKLSAgIHN0cmluZyBnZXRUaGVTdHJpbmcoaW50IGkpOwotICAKLQotIHZvaWQgbWFrZVRpdGxlKGNoYXIgeFs1MTJdKTsKLQotCi0gdm9pZCBmaXhJbml0TGlrZSgpOwotCi19OwotCi1pbmxpbmUgaW50IEthdGVnUHJvYmxlbTo6a2F0T2ZXb3JkKGludCB3KXtyZXR1cm4gX2thdE9mV29yZFt3XTt9OwotaW5saW5lIHNob3J0IEthdGVnUHJvYmxlbTo6d29ydHdhaGwoKXtyZXR1cm4gbmFjaGJhcnNjaGFmdCZDSE9PU0VfV09SRDt9OwotaW5saW5lIHNob3J0IEthdGVnUHJvYmxlbTo6a2F0d2FobCgpIHtyZXR1cm4gbmFjaGJhcnNjaGFmdCZDSE9PU0VfS0FUO307Ci0KLWlubGluZSB2b2lkIEthdGVnUHJvYmxlbTo6a2F0d2FobChpbnQgaykgCi0gICAgeyAKLSAgICAgIG5hY2hiYXJzY2hhZnQgPSAobmFjaGJhcnNjaGFmdCYofkNIT09TRV9LQVQpKSB8IGs7IAotICAgICAgaWYoaz09S19CRVNUKQotCV9tYXhDb21wVmFsPTE7Ci0gICAgICBlbHNlCi0JX21heENvbXBWYWw9a2F0RnJlcS5uS2F0cy0yOwotICAgIH07Ci0KLWlubGluZSB2b2lkIEthdGVnUHJvYmxlbTo6d29ydHdhaGwoaW50IHcpIAotICAgIHsgCi0gICAgICBuYWNoYmFyc2NoYWZ0ID0gKG5hY2hiYXJzY2hhZnQmKH5DSE9PU0VfV09SRCkpIHwgdzsKLSAgICB9OwotCi0KLQotaW5saW5lIEZyZXFUeXBlIEthdGVnUHJvYmxlbTo6bnN0cmljaChpbnQgaSxpbnQgaikKLXsKLSAgRnJlcVR5cGUgbj0wOwotCi0gIGlmKCBpPT11cnNwcnVuZyApCi0gICAgbi09bndnLmdldEZyZXEoaik7IAotICBpZiggaT09emllbCApCi0gICAgbis9bndnLmdldEZyZXEoaik7Ci0KLSAgaWYoIGo9PXVyc3BydW5nICkKLSAgICBuLT1uZ3cuZ2V0RnJlcShpKTsKLSAgaWYoIGo9PXppZWwgKQotICAgIG4rPW5ndy5nZXRGcmVxKGkpOwotCi0gIGlmKCBpPT11cnNwcnVuZyAmJiBqPT11cnNwcnVuZyApCi0gICAgbis9bnd3OwotICBpZiggaT09emllbCAmJiBqPT16aWVsICkKLSAgICBuKz1ud3c7Ci0KLSAgaWYoIGk9PXVyc3BydW5nICYmIGo9PXppZWwgKQotICAgIG4tPW53dzsKLSAgaWYoIGk9PXppZWwgJiYgaj09dXJzcHJ1bmcgKQotICAgIG4tPW53dzsKLSAgCi0gIHJldHVybiBuOwotfQotCi0KLQotCi0KLSNkZWZpbmUgTUFYX0hfVEFCTEUgNDAwMCAKLWV4dGVybiBkb3VibGUgaF90YWJsZVtdLGxfdGFibGVbXSxobXlfdGFibGVbXSxobXlfc2lnbWE7Ci0KLSAKLWlubGluZSBkb3VibGUga2F0X21sb2coZG91YmxlIHgpCi17Ci0gIGlmKHg8PTFlLTkpCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gbG9nKHgpOwotfQotCi0gCi1pbmxpbmUgZG91YmxlIGthdF9tbG9nKGludCBzKQotewotICBpZihzPD0wKQotICAgIHJldHVybiAwOwotICBlbHNlIGlmKCBzPE1BWF9IX1RBQkxFICkKLSAgICB7Ci0gICAgICBtYXNzZXJ0KCBzPT0wIHx8IGxfdGFibGVbc109PWxvZyhzKSApOwotICAgICAgcmV0dXJuIGxfdGFibGVbc107Ci0gICAgfQotICBlbHNlIAotICAgIHJldHVybiBsb2coKGRvdWJsZSkocykpOwotfQotCi0KLSAKLWlubGluZSBkb3VibGUga2F0X2hsbyhpbnQgbikKLXsKLSAgcmV0dXJuIG4qa2F0X21sb2cobi0xKTsKLX0KLSAKLWlubGluZSBkb3VibGUga2F0X2hsbyhkb3VibGUgbikKLXsKLSAgcmV0dXJuIG4qa2F0X21sb2cobi0xKTsKLX0KLQotIAotaW5saW5lIGRvdWJsZSBrYXRfaChpbnQgbikKLXsKLSAgbWFzc2VydChuPj0tMSk7Ci0gIGlmKG48PTApCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICBpZihuPE1BWF9IX1RBQkxFKQotICAgICAgewotCW1hc3NlcnQobj09MHx8ZmFicyhoX3RhYmxlW25dLW4qbG9nKChkb3VibGUpbikpPDFlLTgpOwotCXJldHVybiBoX3RhYmxlW25dOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBuKmxvZygoZG91YmxlKShuKSk7Ci19Ci1pbmxpbmUgZG91YmxlIGthdF9oKGRvdWJsZSBuKQotewotICBpZihuPD0xZS05KQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIG4qbG9nKG4pOwotfQotCi0gCi1pbmxpbmUgZG91YmxlIGthdF9ldGFGa3QoaW50IF9lMCxpbnQgZTEsaW50IGltbWVyMCxpbnQgY2F0cykKLXsKLSAgaW50IGUwICAgID0gX2UwIC0gaW1tZXIwOwotICBpbnQgZVBsdXMgPSBjYXRzKmNhdHMgLSBfZTA7Ci0gIGlmKGNhdHMqY2F0cy1lMD4xKQotICAgIHJldHVybiBlMSpsb2coIChlUGx1cy0xLjApLyhlMCsxLjApKnJob0xvICk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotZG91YmxlIG1rYXRfaF9mdWxsKGludCBuLGRvdWJsZSB0Zik7Ci1kb3VibGUgbWthdF9oX3BhcnQoaW50IG4sZG91YmxlIGNmKTsKLQotaW50IEhhc2goY29uc3Qgc3RyaW5nJiBzKTsKLQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvS2F0ZWdQcm9ibGVtS0JDLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0thdGVnUHJvYmxlbUtCQy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTEwZDkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvS2F0ZWdQcm9ibGVtS0JDLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgIkthdGVnUHJvYmxlbS5oIgotCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDxib29zdFxtYXRoXHNwZWNpYWxfZnVuY3Rpb25zXGVyZi5ocHA+IAotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjptYXRoOwotI2VuZGlmCi0KLQotZG91YmxlIHJob0xvPTAuNzU7IAotI2RlZmluZSBNQVhfVkVSRkFFTFNDSFVORyA1MDAwCi1kb3VibGUgdmVyZlRhYltNQVhfVkVSRkFFTFNDSFVOR10sdmVyZlRhYlNpZ21hPS0xLjA7Ci1kb3VibGUgdmVyZmFlbHNjaGUoaW50IGEsZG91YmxlIGIpCi17Ci0gIAotICBpZiggYT49MCYmdmVyZlRhYlNpZ21hPT1iJiZhPE1BWF9WRVJGQUVMU0NIVU5HICkKLSAgICB7Ci0JCQotICAgICAgbWFzc2VydCh2ZXJmVGFiW2FdPT0gYiooZXJmKDEwMDAwLjApIC0gZXJmKGEvYikpLzIrYSk7Ci0gICAgICByZXR1cm4gdmVyZlRhYlthXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkb3VibGUgeCA9IGIqKGVyZigxMDAwMC4wKSAtIGVyZihhL2IpKS8yK2E7Ci0gICAgICByZXR1cm4geDsKLSAgICB9Ci19Ci1kb3VibGUgdmVyZmFlbHNjaGUoZG91YmxlLGRvdWJsZSBiKQotewotICBhYm9ydCgpOwotICByZXR1cm4gYjsKLX0KLQotS2F0ZWdQcm9ibGVtS0JDOjpLYXRlZ1Byb2JsZW1LQkMoaW50IHMsZG91YmxlIHN2KSA6IAotICBfbihzKSxfbjEocywwKSxfbjIocywwKSxzaWdtYVZlcmZhZWxzY2h1bmcoc3YpLHdpdGhWZXJmYWVsc2NodW5nKHN2IT0wLjApLAotICBfbnZlcmYocyksX24xdmVyZihzLDAuMCksX24ydmVyZihzLDAuMCksX25Xb3JkcygwKSwKLSAgZXRhMChzKnMpLGV0YTEoMCksYzFfMChzKSxjMl8wKHMpLAotICBfYmlncmFtVmVyZlN1bSgwLjApLF91bmlncmFtVmVyZlN1bTEoMC4wKSxfdW5pZ3JhbVZlcmZTdW0yKDAuMCksbkthdHMocykKLSAgCi17IAotICB2ZXJmSW5pdDA9MC4wOwotICBpbnQgaTsKLSAgaWYoIHdpdGhWZXJmYWVsc2NodW5nICkKLSAgICB7Ci0gICAgICB2ZXJmSW5pdDA9dmVyZmFlbHNjaGUoMCxzdik7Ci0gICAgICBjb3V0IDw8ICJWRVJGQUVMU0NIVU5HIHdpcmQgbWl0Z2VmdWVocnQgPT4gTEFOR1NBTUVSISEhXG4iOwotICAgIH0KLSAgZm9yKGk9MDtpPHM7aSsrKQotICAgIHsKLSAgICAgIF9uW2ldLmluaXQocywwKTsKLSAgICAgIF9udmVyZltpXS5pbml0KHMsdmVyZkluaXQwKTsKLSAgICAgIF9uMXZlcmZbaV09X24ydmVyZltpXT12ZXJmSW5pdDA7Ci0gICAgICBfYmlncmFtVmVyZlN1bSs9dmVyZkluaXQwKnM7Ci0gICAgICBfdW5pZ3JhbVZlcmZTdW0xKz12ZXJmSW5pdDA7Ci0gICAgICBfdW5pZ3JhbVZlcmZTdW0yKz12ZXJmSW5pdDA7Ci0gICAgfQotICBpZiggd2l0aFZlcmZhZWxzY2h1bmcgKQotICAgIHsKLSAgICAgIGNvdXQgPDwgIlZFUkZBRUxTQ0hVTkcgIiA8PCBfYmlncmFtVmVyZlN1bSA8PCAiICIgPDwgX3VuaWdyYW1WZXJmU3VtMSA8PCAiICIgPDwgX3VuaWdyYW1WZXJmU3VtMiA8PCBlbmRsOwotICAgIH0KLSAgdmVyZlRhYlNpZ21hPXNpZ21hVmVyZmFlbHNjaHVuZzsKLSAgCi0gIAotICAKLX0KLQotdm9pZCBLYXRlZ1Byb2JsZW1LQkM6OnNldE4oaW50IHcxLGludCB3MiwgRnJlcVR5cGUgbikKLSAgCi17Ci0gIGFkZE4odzEsdzIsLV9uW3cxXVt3Ml0pOwotICBhZGROKHcxLHcyLG4pOwotfQotICAKLQotZG91YmxlIEthdGVnUHJvYmxlbUtCQzo6ZnVsbEJld2VydHVuZyhpbnQgYXVzd2VydHVuZykKLXsKLSAgCi0gIGRvdWJsZSBiZXdlcnR1bmc9MDsKLSAgaW50IGMxLGMyOwotICAKLQotICBzd2l0Y2goIGF1c3dlcnR1bmcgKQotICAgIHsKLSAgICBjYXNlIENSSVRFUklPTl9NTDoKLSAgICAgIGZvcihjMT0wO2MxPG5LYXRzO2MxKyspCi0JewotCSAgZm9yKGMyPTA7YzI8bkthdHM7YzIrKykKLQkgICAgYmV3ZXJ0dW5nLT1rYXRfaChfbltjMV1bYzJdKTsKLQkgIGJld2VydHVuZys9a2F0X2goX24xW2MxXSkra2F0X2goX24yW2MxXSk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDUklURVJJT05fTVk6Ci0gICAgICB7Ci0gICAgICBmb3IoYzE9MDtjMTxuS2F0cztjMSsrKQotCXsKLQkgIGZvcihjMj0wO2MyPG5LYXRzO2MyKyspCi0JICAgIGJld2VydHVuZy09bWthdF9oX2Z1bGwoKGludCluKGMxLGMyKSxudmVyZihjMSxjMikpOwotCSAgYmV3ZXJ0dW5nKz1ta2F0X2hfcGFydCgoaW50KShuMShjMSkpLG4xdmVyZihjMSkpK21rYXRfaF9wYXJ0KChpbnQpKG4yKGMxKSksbjJ2ZXJmKGMxKSk7Ci0JfQotICAgICAgZG91YmxlIHUxPV91bmlncmFtVmVyZlN1bTEtdmVyZkluaXQwKmMxXzA7Ci0gICAgICBkb3VibGUgdTI9X3VuaWdyYW1WZXJmU3VtMi12ZXJmSW5pdDAqYzJfMDsKLSAgICAgIGRvdWJsZSBiPV9iaWdyYW1WZXJmU3VtLXZlcmZJbml0MCooYzFfMCpuS2F0cytjMl8wKm5LYXRzLWMxXzAqYzJfMCk7Ci0gICAgICBpZiggdmVyYm9zZU1vZGU+MSApCi0JewotCSAgY291dCA8PCAiQ1JJVEVSSU9OX01ZOiAiIDw8IGJld2VydHVuZyA8PCBlbmRsOwotCSAgY291dCA8PCAiVTE6Ijw8X3VuaWdyYW1WZXJmU3VtMSA8PCAiIG46Ijw8dTE8PCAiICIgCi0JICAgICAgIDw8ICJVMjoiPDxfdW5pZ3JhbVZlcmZTdW0yIDw8ICIgbjoiPDx1Mjw8ICIgIiAKLQkgICAgICAgPDwgIlUzOiI8PF9iaWdyYW1WZXJmU3VtICAgPDwgIiBuOiI8PGI8PCBlbmRsOwotCX0KLSAgICAgIGlmKGI+MC4wMDAwMDEpCi0JewotCSAgCi0JICAKLQkgIGlmKHZlcmJvc2VNb2RlPjEgKQotCSAgICBjb3V0IDw8ICAiICBORVU6ICIgPDxfbldvcmRzKmxvZyggdTEgKiB1MiAvIGIgKSA8PCBlbmRsOwotCSAgYmV3ZXJ0dW5nIC09IF9uV29yZHMqbG9nKCB1MSAqIHUyIC8gYiApOwotCSAgaWYodmVyYm9zZU1vZGU+MSkKLQkgICAgY291dCA8PCAiU0NITFVTU0JFV0VSVFVORzogIiA8PCBiZXdlcnR1bmcgPDwgZW5kbDsKLQl9Ci0gICAgICBlbHNlCi0JY291dCA8PCAiQiB6dSBrbGVpbiAiIDw8IGIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ1JJVEVSSU9OX0xPOgotICAgICAgZm9yKGMxPTA7YzE8bkthdHM7YzErKykKLQl7Ci0JICBmb3IoYzI9MDtjMjxuS2F0cztjMisrKQotCSAgICBiZXdlcnR1bmctPV9uW2MxXVtjMl0qa2F0X21sb2coX25bYzFdW2MyXS0xLXJob0xvKTsKLQkgIGJld2VydHVuZys9X24xW2MxXSprYXRfbWxvZyhfbjFbYzFdLTEpK19uMltjMV0qa2F0X21sb2coX24yW2MxXS0xKTsKLQl9Ci0gICAgICBiZXdlcnR1bmctPWthdF9ldGFGa3QoZXRhMCxldGExLChjMV8wKm5LYXRzK2MyXzAqbkthdHMtYzFfMCpjMl8wKSxuS2F0cyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgY2VyciA8PCAiRXJyb3I6IHdyb25nIGNyaXRlcmlvbiAiIDw8IGF1c3dlcnR1bmcgPDwgZW5kbDsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICByZXR1cm4gYmV3ZXJ0dW5nOwotfQotCi1kb3VibGUgS2F0ZWdQcm9ibGVtS0JDOjpteUNyaXRlcmlvblRlcm0oKQotewotICBpYXNzZXJ0KCB3aXRoVmVyZmFlbHNjaHVuZyApOwotICBkb3VibGUgcjsKLSAgICAgIGRvdWJsZSB1MT1fdW5pZ3JhbVZlcmZTdW0xLXZlcmZJbml0MCpjMV8wOwotICAgICAgZG91YmxlIHUyPV91bmlncmFtVmVyZlN1bTItdmVyZkluaXQwKmMyXzA7Ci0gICAgICBkb3VibGUgYj1fYmlncmFtVmVyZlN1bS12ZXJmSW5pdDAqKGMxXzAqbkthdHMrYzJfMCpuS2F0cy1jMV8wKmMyXzApOwotICAKLSAgCi0gIGlmKCB2ZXJib3NlTW9kZT4xICkKLSAgICB7Ci0gICAgICBjb3V0IDw8ICJud29yZHMgZGl2aXNvcjoiPDxfbldvcmRzIDw8ICIgIiA8PCB1MSAqIHUyIC8gYiA8PCBlbmRsOwotICAgICAgY291dCA8PCAiZXJnZWJuaXM6ICAgICAgIjw8X25Xb3Jkcypsb2coIHUxICogdTIgLyBiICkgPDwgZW5kbDsKLSAgICAgIGNvdXQgPDwgIjA6ICAgICAgICAgICAgICI8PGMxXzAgPDwgZW5kbDsKLSAgICB9Ci0gIHIgICAgICAgPSBfbldvcmRzKmxvZyggdTEgKiB1MiAvIGIgKTsKLSAgCi0gIHJldHVybiAtcjsKLX0KLQotCi0KLQotZG91YmxlIEthdGVnUHJvYmxlbUtCQzo6YmlncmFtVmVyZlN1bSgpCi17Ci0gIGRvdWJsZSBzdW09MDsKLSAgZm9yKGludCBjMT0wO2MxPG5LYXRzO2MxKyspCi0gICAgZm9yKGludCBjMj0wO2MyPG5LYXRzO2MyKyspCi0gICAgICBzdW0rPW52ZXJmKGMxLGMyKTsKLSAgY291dCA8PCAiQklHUkFNVkVSRlNVTTogIiA8PCBzdW0gPDwgZW5kbDsKLSAgcmV0dXJuIHN1bTsKLX0KLQotZG91YmxlIEthdGVnUHJvYmxlbUtCQzo6dW5pZ3JhbVZlcmZTdW0xKCkKLXsKLSAgZG91YmxlIHN1bT0wOwotICBmb3IoaW50IGMxPTA7YzE8bkthdHM7YzErKykKLSAgICBzdW0rPW4xdmVyZihjMSk7Ci0gIGNvdXQgPDwgIlVOSUdSQU1WRVJGU1VNMTogIiA8PCBzdW0gPDwgZW5kbDsKLSAgcmV0dXJuIHN1bTsKLX0KLQotZG91YmxlIEthdGVnUHJvYmxlbUtCQzo6dW5pZ3JhbVZlcmZTdW0yKCkKLXsKLSAgZG91YmxlIHN1bT0wOwotICBmb3IoaW50IGMxPTA7YzE8bkthdHM7YzErKykKLSAgICBzdW0rPW4ydmVyZihjMSk7Ci0gIGNvdXQgPDwgIlVOSUdSQU1WRVJGU1VNMjogIiA8PCBzdW0gPDwgZW5kbDsKLSByZXR1cm4gc3VtOwotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0thdGVnUHJvYmxlbUtCQy5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvS2F0ZWdQcm9ibGVtS0JDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYWM2MmEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvS2F0ZWdQcm9ibGVtS0JDLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLQotCi0KLQotI2lmbmRlZiBLQVRFR1BST0JMRU1LQkNfSAotI2RlZmluZSBLQVRFR1BST0JMRU1LQkNfSAotCi10eXBlZGVmIEFycmF5PEZyZXFUeXBlPiBGcmVxQXJyYXk7Ci10eXBlZGVmIEFycmF5PGRvdWJsZT4gRnJlcUFycmF5UmVhbDsKLQotCi1kb3VibGUgdmVyZmFlbHNjaGUoaW50IGEsZG91YmxlIGIpOwotZG91YmxlIHZlcmZhZWxzY2hlKGRvdWJsZSBhLGRvdWJsZSBiKTsKLQotY2xhc3MgS2F0ZWdQcm9ibGVtS0JDCi0KLQotewotIGZyaWVuZCBjbGFzcyBLYXRlZ1Byb2JsZW07Ci0KLSBwcml2YXRlOgotICBBcnJheTxGcmVxQXJyYXk+IF9uOyAKLSAgQXJyYXk8RnJlcVR5cGU+IF9uMTsgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gIEFycmF5PEZyZXFUeXBlPiBfbjI7ICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIAotCQkJCi0gIGRvdWJsZSBzaWdtYVZlcmZhZWxzY2h1bmc7Ci0gIHNob3J0IHdpdGhWZXJmYWVsc2NodW5nOwotCi0gIEFycmF5PEZyZXFBcnJheVJlYWw+IF9udmVyZjsKLSAgQXJyYXk8ZG91YmxlPiBfbjF2ZXJmOwotICBBcnJheTxkb3VibGU+IF9uMnZlcmY7Ci0gIEZyZXFUeXBlIF9uV29yZHM7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGludCBldGEwOyAgICAgICAgICAgIAotICBpbnQgZXRhMTsgICAgICAgICAgICAKLSAgaW50IGMxXzA7ICAgICAgICAgICAgCi0gIGludCBjMl8wOyAgICAgICAgICAgIAotICBkb3VibGUgX2JpZ3JhbVZlcmZTdW07Ci0gIGRvdWJsZSBfdW5pZ3JhbVZlcmZTdW0xOwotICBkb3VibGUgX3VuaWdyYW1WZXJmU3VtMjsKLSAgZG91YmxlIHZlcmZJbml0MDsKLQotIHB1YmxpYzoKLSAgaW50IG5LYXRzOyAgICAgICAgICAgCi0KLSAgS2F0ZWdQcm9ibGVtS0JDKGludCBuS2F0cyxkb3VibGUgc3YpOwotICAKLQotICBkb3VibGUgZnVsbEJld2VydHVuZyhpbnQgYXVzd2VydHVuZyk7Ci0gIAotCi0gIEZyZXFUeXBlIG4oaW50IHcxLGludCB3MikgeyByZXR1cm4gX25bdzFdW3cyXTsgfTsKLSAgCi0KLSAgRnJlcVR5cGUgbjEoaW50IHcpIHsgcmV0dXJuIF9uMVt3XTt9OwotICAKLQotICBGcmVxVHlwZSBuMihpbnQgdykgeyByZXR1cm4gX24yW3ddO307Ci0gIAotICAKLSAgZG91YmxlIGJpZ3JhbVZlcmZTdW0oKTsKLSAgZG91YmxlIHVuaWdyYW1WZXJmU3VtMSgpOwotICBkb3VibGUgdW5pZ3JhbVZlcmZTdW0yKCk7Ci0KLSAgZG91YmxlIG52ZXJmKGludCB3MSxpbnQgdzIpIHsgcmV0dXJuIF9udmVyZlt3MV1bdzJdOyB9Ci0gIAotICBkb3VibGUgbjF2ZXJmKGludCB3KSB7IHJldHVybiBfbjF2ZXJmW3ddOyB9OwotCi0gIGRvdWJsZSBuMnZlcmYoaW50IHcpIHsgcmV0dXJuIF9uMnZlcmZbd107IH07Ci0KLSAgaW5saW5lIHZvaWQgYWRkTihpbnQgdzEsaW50IHcyLCBGcmVxVHlwZSBuKTsKLSAgCi0KLSAgdm9pZCBzZXROKGludCB3MSxpbnQgdzIsIEZyZXFUeXBlIG4pOyAgCi0gIAotICAKLSAgZG91YmxlIG15Q3JpdGVyaW9uVGVybSgpOwotCi19OwotCi1pbmxpbmUgdm9pZCBLYXRlZ1Byb2JsZW1LQkM6OmFkZE4oaW50IHcxLGludCB3MiwgRnJlcVR5cGUgbikgICAgCi17Ci0gIGlmKG4hPTApCi0gICAgewotICAgICAgRnJlcVR5cGUgJnM9IF9uW3cxXVt3Ml07Ci0gICAgICBpZihzPT0wKQotCWV0YTAtLTsKLSAgICAgIGVsc2UgaWYocz09MSkKLQlldGExLS07Ci0gICAgICBpZihfbjFbdzFdPT0wKQotCWMxXzAtLTsKLSAgICAgIGlmKF9uMlt3Ml09PTApCi0JYzJfMC0tOwotICAgICAgCi0gICAgICBpZih3aXRoVmVyZmFlbHNjaHVuZykKLQl7Ci0JICBkb3VibGUgdmVyZk9sZD12ZXJmYWVsc2NoZShzLHNpZ21hVmVyZmFlbHNjaHVuZyk7Ci0JICBkb3VibGUgdmVyZk5ldz12ZXJmYWVsc2NoZShzK24sc2lnbWFWZXJmYWVsc2NodW5nKTsKLQkgIGRvdWJsZSB2ZXJmT2xkMT12ZXJmYWVsc2NoZShfbjFbdzFdLHNpZ21hVmVyZmFlbHNjaHVuZyk7Ci0JICBhc3NlcnQodmVyZk9sZDE9PV9uMXZlcmZbdzFdKTsKLQkgIGRvdWJsZSB2ZXJmTmV3MT12ZXJmYWVsc2NoZShfbjFbdzFdK24sc2lnbWFWZXJmYWVsc2NodW5nKTsKLQkgIGRvdWJsZSB2ZXJmT2xkMj12ZXJmYWVsc2NoZShfbjJbdzJdLHNpZ21hVmVyZmFlbHNjaHVuZyk7Ci0JICBhc3NlcnQodmVyZk9sZDI9PV9uMnZlcmZbdzJdKTsKLQkgIGRvdWJsZSB2ZXJmTmV3Mj12ZXJmYWVsc2NoZShfbjJbdzJdK24sc2lnbWFWZXJmYWVsc2NodW5nKTsKLQkgIF9uMXZlcmZbdzFdPXZlcmZOZXcxOwotCSAgX3VuaWdyYW1WZXJmU3VtMSs9dmVyZk5ldzEtdmVyZk9sZDE7Ci0JICBfbjJ2ZXJmW3cyXT12ZXJmTmV3MjsKLQkgIF91bmlncmFtVmVyZlN1bTIrPXZlcmZOZXcyLXZlcmZPbGQyOwotCSAgX252ZXJmW3cxXVt3Ml09dmVyZk5ldzsKLQkgIF9iaWdyYW1WZXJmU3VtKz12ZXJmTmV3LXZlcmZPbGQ7Ci0JICBfbldvcmRzKz1uOwotCX0KLSAgICAgIHMrPW47X24xW3cxXSs9bjtfbjJbdzJdKz1uOyAKLQotICAgICAgYXNzZXJ0KF9uW3cxXVt3Ml0+PTApOwotICAgICAgYXNzZXJ0KF9uMVt3MV0+PTApOwotICAgICAgYXNzZXJ0KF9uMlt3Ml0+PTApOwotICAgICAgCi0gICAgICBpZihzPT0wKQotCWV0YTArKzsKLSAgICAgIGVsc2UgaWYocz09MSkgCi0JZXRhMSsrOwotICAgICAgaWYoX24xW3cxXT09MCkKLQljMV8wKys7Ci0gICAgICBpZihfbjJbdzJdPT0wKQotCWMyXzArKzsKLSAgICB9Ci19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9LYXRlZ1Byb2JsZW1UZXN0LmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0thdGVnUHJvYmxlbVRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc2Y2U1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0thdGVnUHJvYmxlbVRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzAwICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0KLSNpbmNsdWRlICJLYXRlZ1Byb2JsZW1UZXN0LmgiCi0KLSNpbmNsdWRlICJQcm9ibGVtVGVzdC5oIgotI2luY2x1ZGUgIkhDT3B0aW1pemF0aW9uLmgiCi0jaW5jbHVkZSAiVEFPcHRpbWl6YXRpb24uaCIKLSNpbmNsdWRlICJSUlRPcHRpbWl6YXRpb24uaCIKLSNpbmNsdWRlICJHREFPcHRpbWl6YXRpb24uaCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHN0cnN0cmVhbT4KLQotdHlwZWRlZiBwYWlyPHN0cmluZyxzdHJpbmc+IFBTUzsKLQotI2RlZmluZSBORVdfU0VOVEVOQ0VfRU5EICJta2Nscy1tYXBwZWQtZG9sbGFyLXN5bWJvbC0kIgotCi0jaWZkZWYgTmVYVAotY2hhciAqc3RyZHVwKGNoYXIgKmEpCi17Ci0gIGNoYXIgKnAgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oYSkrMSk7Ci0gIHN0cmNweShwLGEpOwotICByZXR1cm4gcDsKLX0KLQotI2VuZGlmCi0KLQotdm9pZCB3cml0ZUNsYXNzZXMoQXJyYXk8S2F0ZWdvcnk+ICZrYXRPZldvcmQsS2F0ZWdQcm9ibGVtICZwcm9ibGVtLG9zdHJlYW0gJnRvKQotewkgICAgCi0gIGZvcihpbnQgaT0wO2k8a2F0T2ZXb3JkLnNpemUoKTtpKyspCi0gICAgewotICAgICAgaWYoIHN0cmNtcChwcm9ibGVtLmdldFN0cmluZyhpKSwiJCIpICkKLQlpZiggc3RyY21wKHByb2JsZW0uZ2V0U3RyaW5nKGkpLCJta2Nscy1tYXBwZWQtZG9sbGFyLXN5bWJvbC0kIik9PTAgKQotCSAgdG8gPDwgIiQiIDw8ICJcdCIgPDwga2F0T2ZXb3JkW2ldIDw8IGVuZGw7Ci0JZWxzZQotCSAgdG8gPDwgcHJvYmxlbS5nZXRTdHJpbmcoaSkgPDwgIlx0IiA8PCBrYXRPZldvcmRbaV0gPDwgZW5kbDsKLSAgICB9Ci19Ci0KLQotdm9pZCBteXNwbGl0KGNvbnN0IHN0cmluZyAmcyxzdHJpbmcgJnMxLHN0cmluZyAmczIpCi17Ci0gIHVuc2lnbmVkIGludCBpPTA7Ci0gIGZvcig7aTxzLmxlbmd0aCgpO2krKylpZiggc1tpXT09JyAnIHx8IHNbaV09PSdcdCcgfHwgc1tpXT09JyAnKWJyZWFrOwotICBzMT1zLnN1YnN0cigwLGkpOwotICBmb3IoO2k8cy5sZW5ndGgoKTtpKyspaWYoICEoc1tpXT09JyAnIHx8IHNbaV09PSdcdCcgfHwgc1tpXT09JyAnKSApYnJlYWs7ICAKLSAgczI9cy5zdWJzdHIoaSxzLmxlbmd0aCgpLWkpOwotICAKLSAgaWFzc2VydChzMS5zaXplKCkpOwotICBpYXNzZXJ0KHMyLnNpemUoKSk7Ci19Ci0KLQotCi1pbnQgZnJvbUNhdEZpbGUoS2F0ZWdQcm9ibGVtICpwLGNvbnN0IGNoYXIgKmZuYW1lLGJvb2wgdmVyYikKLXsKLSAgbGVkYV9oX2FycmF5PHN0cmluZyxpbnQ+IHRyYW5zbGF0aW9uKC0xKTsKLSAgaW50IG1heENhdD0yOwotICBpZnN0cmVhbSBpbihmbmFtZSk7Ci0gIGlmKCFpbikKLSAgICB7Ci0gICAgICBjZXJyIDw8ICJFcnJvcjogRmlsZSAnIiA8PCBmbmFtZSA8PCAiJyBjYW5ub3QgYmUgb3BlbmVkLlxuIjsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICBmb3IoaW50IGk9MDtpPHAtPndvcmRGcmVxLm5Xb3JkcztpKyspCi0gICAgKHAtPmluaXRMaWtlKVtpXT0gLTE7Ci0gIAotICAKLSAgdHJhbnNsYXRpb25bIjEiXT0xOwotICB0cmFuc2xhdGlvblsiMCJdPTA7Ci0KLSAgCi0gIHN0cmluZyBzOwotICB3aGlsZSggZ2V0bGluZShpbixzKSApIAotICAgIHsKLSAgICAgIHN0cmluZyBzdHIsY2F0ZWc7Ci0gICAgICBteXNwbGl0KHMsc3RyLGNhdGVnKTsKLSAgICAgIGludCBpPXAtPndvcmRzLT5iaW5hcnlfbG9jYXRlKHN0cik7Ci0gICAgICBpZihpPj0wICYmICgqKHAtPndvcmRzKSlbaV09PXN0ciApCi0JewotCSAgCi0JICBpZiggdHJhbnNsYXRpb25bY2F0ZWddPT0tMSApCi0JICAgIHRyYW5zbGF0aW9uW2NhdGVnXT1tYXhDYXQrKzsKLQkgIGludCBjYXQ9dHJhbnNsYXRpb25bY2F0ZWddOwotCSAgaWYoIChwLT5pbml0TGlrZSlbaV0hPSAtMSApCi0JICAgIGNlcnIgPDwgIldhcm5pbmc6IFdvcmQgJyIgPDwgKCgqKHAtPndvcmRzKSlbaV0pPDwgIicgaXMgYWxyZWFkeSBpbiBhIGNhdGVnb3J5LlxuIjsKLQkgIChwLT5pbml0TGlrZSlbaV09Y2F0OwotCX0KLSAgICAgIGVsc2UKLQljZXJyIDw8ICJXYXJuaW5nOiBXb3JkICciIDw8IHN0ciA8PCAiJyAiIDw8IGkgPDwgIiBpcyBub3QgaW4gdHJhaW5pbmcgY29ycHVzLlxuIjsKLSAgICB9Ci0gIAotICBpZiggdmVyYm9zZU1vZGUgKQotICAgIGNvdXQgPDwgIldlIGhhdmUgIiA8PCBtYXhDYXQgPDwgIiByZWFkIG5vbi1lbXB0eSBjYXRlZ29yaWVzIiAKLSAgICAgICIgKHdpdGggd29yZHMgZnJvbSB0aGUgY29ycHVzKS5cbiI7Ci0gIAotICBpZihtYXhDYXQ+cC0+a2F0RnJlcS5uS2F0cykKLSAgICB7Ci0gICAgICBjZXJyIDw8ICJFcnJvcjogTm90IGVub3VnaCBjYXRlZ29yaWVzIHJlc2VydmVkIChvbmx5ICIgCi0JICAgPDwgcC0+a2F0RnJlcS5uS2F0cyA8PCAiLCBidXQgaSBuZWVkICIgPDwgbWF4Q2F0IDw8ICIpLlxuIjsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAKLSAgCi0gIGludCBpPXAtPndvcmRzLT5iaW5hcnlfbG9jYXRlKCIkIik7Ci0gIGlmKCBpPj0wICYmICAoKihwLT53b3JkcykpW2ldPT0iJCIgKQotICAgIChwLT5pbml0TGlrZSlbaV09MDsKLSAgZWxzZQotICAgIGlmKCB2ZXJib3NlTW9kZSApCi0gICAgICBjZXJyIDw8ICJXYXJuaW5nOiBObyAnJCcgaW4gdm9jYWJ1bGFyeSFcbiI7Ci0gIAotICAKLSAgaW50IGVycm9ycz0wOwotICBmb3IoaT0wO2k8cC0+d29yZEZyZXEubldvcmRzO2krKykKLSAgICBpZigocC0+aW5pdExpa2UpW2ldPT0gLTEgKQotICAgICAgewotCWlmKCB2ZXJiICkgY2VyciA8PCAiRXJyb3I6IEkgZG9uJ3Qga25vdyB0aGUgY2F0ZWdvcnkgb2Ygd29yZCAiIDw8IGkgCi0JICAgICA8PCAiICgiIDw8ICgqKHAtPndvcmRzKSlbaV0gPDwgIikgIiA8PCAiLlxuIjsKLQllcnJvcnM9MTsKLSAgICAgIH0KLSAgcmV0dXJuIGVycm9yczsKLX0KLQotCi0KLUthdGVnUHJvYmxlbSAqbWFrZUthdGVnUHJvYmxlbShjb25zdCBsZWRhX2hfYXJyYXk8UFNTLEZyZXFUeXBlPiZjVGJsLGNvbnN0IGxlZGFfc2V0PHN0cmluZz4mc2V0Vm9rYWJ1bGFyLCBpbnQgbWF4Q2xhc3MsaW50IGluaXRpYWxpc2llcnVuZywKLQkJCSBpbnQgYXVzd2VydHVuZyxpbnQgbmFjaGJhcnNjaGFmdCxpbnQgbWluV29yZEZyZXF1ZW5jeSkKLXsKLSAgCi0gIGludCBud3JkPTA7Ci0gIGxlZGFfYXJyYXk8c3RyaW5nPiZzVm9rID0gKm5ldyBsZWRhX2FycmF5PHN0cmluZz4oc2V0Vm9rYWJ1bGFyLnNpemUoKSk7Ci0gIHN0cmluZyBzOwotICB1bnNpZ25lZCBpbnQgY3RyPTA7Ci0gIGZvcmFsbF9zZXQobGVkYV9zZXQ8c3RyaW5nPixzLHNldFZva2FidWxhcikKLSAgICB7Ci0gICAgICBpZiggdmVyYm9zZU1vZGU+MiApCi0JY291dCA8PCAibWtjbHM6V29ydCAiIDw8IGN0ciA8PCAiICIgPDwgcyA8PCBlbmRsOwotICAgICAgc1Zva1tjdHIrK109czsKLSAgICB9Ci0gIGZvcih1bnNpZ25lZCBpbnQgej0wO3o8Y3RyLTE7eisrKQotICAgIGlhc3NlcnQoIHNWb2tbel08c1Zva1t6KzFdICk7Ci0gIHNWb2suc29ydCgpOwotCi0gIGlmKCB2ZXJib3NlTW9kZT4yICkKLSAgICBjb3V0IDw8ICIqKioqKlZvY2FidWxhcnk6ICIgPDwgc1ZvazsKLSAgCi0gIHVuc2lnbmVkIGludCB2b2tTaXplPXNWb2suc2l6ZSgpOwotICBtYXNzZXJ0KHZva1NpemU9PWN0cik7IG1hc3NlcnQodm9rU2l6ZT09c2V0Vm9rYWJ1bGFyLnNpemUoKSk7Ci0gIGlmKHZlcmJvc2VNb2RlKQotICAgIHtjb3V0IDw8ICJTaXplIG9mIHZvY2FidWxhcnk6ICIgPDwgdm9rU2l6ZSA8PCAiXG4iO2NvdXQuZmx1c2goKTt9Ci0gIAotICBLYXRlZ1Byb2JsZW0gKmsgPSBuZXcgS2F0ZWdQcm9ibGVtKHZva1NpemUsbWF4Q2xhc3MsaW5pdGlhbGlzaWVydW5nLAotCQkJCSAgICAgYXVzd2VydHVuZyxuYWNoYmFyc2NoYWZ0LG1pbldvcmRGcmVxdWVuY3kpOwotICBLYXRlZ1Byb2JsZW1XQkMgJnc9ay0+d29yZEZyZXE7Ci0gIGstPndvcmRzPSZzVm9rOwotICAKLSAgQXJyYXk8aW50PiBhZnRlcih2b2tTaXplLDApOwotICBBcnJheTxpbnQ+IGJlZm9yZSh2b2tTaXplLDApOwotICAKLSAgCi0gIG53cmQ9MDsKLSAgewotICAgIFBTUyBzOwotICAgIGZvcmFsbF9kZWZpbmVkX2gyKFBTUyxGcmVxVHlwZSxzLGNUYmwpCi0gICAgICB7Ci0JY29uc3Qgc3RyaW5nJnNzMT1zLmZpcnN0OwotCWNvbnN0IHN0cmluZyZzczI9cy5zZWNvbmQ7Ci0JaWYoIHNzMi5sZW5ndGgoKSYmKHNzMSE9IiQiIHx8IHNzMiE9IiQiKSApCi0JICB7Ci0JICAgIGludCBpMT1zVm9rLmJpbmFyeV9zZWFyY2goc3MxKTsKLQkgICAgaW50IGkyPXNWb2suYmluYXJ5X3NlYXJjaChzczIpOwotCSAgICBpYXNzZXJ0KCBzVm9rW2kxXSA9PSBzczEgKTtpYXNzZXJ0KCBzVm9rW2kyXSA9PSBzczIgKTsKLQkgICAgYWZ0ZXJbaTFdKys7Ci0JICAgIGJlZm9yZVtpMl0rKzsKLQkgIH0KLQlpZiggdmVyYm9zZU1vZGUmJigobndyZCsrKSUxMDAwMD09MCkgKSAKLQkgIHtjb3V0PDwiU3RhdGlzdGlrZW4tMSAiIDw8IG53cmQ8PCAiLiAgICAgIFxyIjtjb3V0LmZsdXNoKCk7fQotICAgICAgfQotICB9Ci0gIAotICBmb3IodW5zaWduZWQgaW50IGk9MDtpPHZva1NpemU7aSsrKQotICAgIHsKLSAgICAgIHcuc2V0QWZ0ZXJXb3JkcyhpLGFmdGVyW2ldKTsKLSAgICAgIHcuc2V0QmVmb3JlV29yZHMoaSxiZWZvcmVbaV0pOwotICAgIH0KLSAgCi0gIAotICB7Ci0gICAgbndyZD0wOwotICAgIFBTUyBzOwotICAgIGZvcmFsbF9kZWZpbmVkX2gyKFBTUyxGcmVxVHlwZSxzLGNUYmwpCi0gICAgICB7Ci0JY29uc3Qgc3RyaW5nJnNzMT1zLmZpcnN0OwotCWNvbnN0IHN0cmluZyZzczI9cy5zZWNvbmQ7Ci0JRnJlcVR5cGUgcD1jVGJsW3NdOwotCWlmKCBzczIubGVuZ3RoKCkmJihzczEhPSIkIiB8fCBzczIhPSIkIikgKQotCSAgewotCSAgICBpbnQgaTE9c1Zvay5iaW5hcnlfc2VhcmNoKHNzMSk7Ci0JICAgIGludCBpMj1zVm9rLmJpbmFyeV9zZWFyY2goc3MyKTsKLQkgICAgaWFzc2VydCggc1Zva1tpMV0gPT0gc3MxICk7aWFzc2VydCggc1Zva1tpMl0gPT0gc3MyICk7Ci0JICAgIHcuc2V0RnJlcShpMSxpMixwKTsKLQkgICAgaWYoIHZlcmJvc2VNb2RlPjIgKQotCSAgICAgIGNvdXQgPDwgIkJJR1JBTU0tSEFFVUY6ICIgPDwgc3MxIDw8ICI6IiA8PCBpMSA8PCAiICAgIiAKLQkJICAgPDwgc3MyIDw8ICI6IiA8PCBpMiA8PCAiICAgIiA8PCBwIDw8IGVuZGw7Ci0JICB9Ci0gCWlmKCB2ZXJib3NlTW9kZSYmKChud3JkKyspJTEwMDAwPT0wKSApIAotCSAge2NvdXQ8PCJTdGF0aXN0aWtlbi0yICIgPDxud3JkPDwgIi4gICAgXHIiO2NvdXQuZmx1c2goKTt9Ci0gICAgIH0KLSAgfQotICAKLSAgdy50ZXN0RnVsbCgpOwotICBpZih2ZXJib3NlTW9kZSl7Y291dCA8PCAiRGF0ZW5pbnRlZ3JpdGFldCBnZXRlc3RldC5cbiI7Y291dC5mbHVzaCgpO30KLSAgcmV0dXJuIGs7Ci19Ci0KLUthdGVnUHJvYmxlbSAqZnJvbU5nckZpbGUoY29uc3QgY2hhciAqc3RyLGludCBtYXhDbGFzcyxpbnQgaW5pdGlhbGlzaWVydW5nLAotCQkJIGludCBhdXN3ZXJ0dW5nLGludCBuYWNoYmFyc2NoYWZ0LGludCBtaW5Xb3JkRnJlcXVlbmN5KQotewotICBpZnN0cmVhbSBmaWxlKHN0cik7Ci0gIGlmKCFmaWxlKXJldHVybiAwOwotICBsZWRhX3NldDxzdHJpbmc+IHNldFZva2FidWxhcjsKLSAgbGVkYV9oX2FycmF5PFBTUyxGcmVxVHlwZT4gY1RibDsKLSAgZG91YmxlIGM9MDsKLSAgaWYoIHZlcmJvc2VNb2RlICljb3V0IDw8ICJOR1JGSUxFOiAiIDw8IHN0ciA8PCBlbmRsOwotICBzdHJpbmcgczEsczI7Ci0gIHdoaWxlKGZpbGUgPj4gYyA+PiBzMSA+PiBzMikKLSAgICB7Ci0gICAgICBpZiggczEubGVuZ3RoKCk9PTB8fHMyLmxlbmd0aCgpPT0wICkKLQl7Ci0JICBjZXJyIDw8ICJFUlJPUjogc3RyaW5ncyBhcmUgemVybzogIiA8PCBzMS5sZW5ndGgoKSA8PCIgIiA8PCBzMSA8PCIgIiA8PCBzMi5sZW5ndGgoKTw8IiAiIDw8IHMyIDw8IGVuZGw7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBpZiggYz09MCApCi0JewotCSAgY2VyciA8PCAiQ291bnQgaXN0IDAgIiA8PCBzMSA8PCAiICIgPDwgczIgPDwgZW5kbDsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGNUYmxbcGFpcjxzdHJpbmcsc3RyaW5nPihzMSxzMildPShGcmVxVHlwZSljOwotICAgICAgc2V0Vm9rYWJ1bGFyLmluc2VydChzMSk7Ci0gICAgICBzZXRWb2thYnVsYXIuaW5zZXJ0KHMyKTsKLSAgICAgIGlmKCB2ZXJib3NlTW9kZT4xICkKLQljb3V0IDw8ICJSOiAiIDw8IHMxIDw8ICIgIiA8PCBzMiA8PCAiICIgPDwgYyA8PCBlbmRsOwotICAgICAgYz0wOwotICAgIH0KLSAgCi0gIHJldHVybiBtYWtlS2F0ZWdQcm9ibGVtKGNUYmwsc2V0Vm9rYWJ1bGFyLG1heENsYXNzLGluaXRpYWxpc2llcnVuZyxhdXN3ZXJ0dW5nLG5hY2hiYXJzY2hhZnQsbWluV29yZEZyZXF1ZW5jeSk7Ci19Ci0KLQotCi0JCi0KLQkKLQotCi1LYXRlZ1Byb2JsZW0gKmZyb21LTW9kZWwoY29uc3QgY2hhciAqc3RyLGludCBtYXhDbGFzcyxpbnQgaW5pdGlhbGlzaWVydW5nLAotCQkJIGludCBhdXN3ZXJ0dW5nLGludCBuYWNoYmFyc2NoYWZ0LGludCBtaW5Xb3JkRnJlcXVlbmN5KQotewotICBzdHJpbmcgb2xkVGV4dCx0ZXh0LGxpbmU7Ci0gIGlmc3RyZWFtIGYoc3RyKTsKLSAgaWYoICFmICkKLSAgICB7Ci0gICAgICBjZXJyIDw8ICJFUlJPUjogY2FuIG5vdCBvcGVuIGZpbGUgIiA8PCBzdHIgPDwgIi5cbiI7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIAotICBsZWRhX3NldDxzdHJpbmc+IHNldFZva2FidWxhcjsKLSAgbGVkYV9oX2FycmF5PFBTUyxGcmVxVHlwZT4gY1RibCgwKTsKLSAgb2xkVGV4dD0iJCI7Ci0gIHdoaWxlKDEpCi0gICAgewotICAgICAgZ2V0bGluZShmLGxpbmUpOwotICAgICAgaWYoZi5mYWlsKCkgJiYgIWYuYmFkKCkgJiYgIWYuZW9mKCkpCi0JewotCSAgY2VyciA8PCAiV0FSTklORzogc3RyYW5nZSBjaGFyYWN0ZXJzIGluIHN0cmVhbSAoZ2V0bGluZSkgIiA8PCBlbmRsO2YuY2xlYXIoKTsKLQl9Ci0gICAgICBpZighZilicmVhazsKLSAgICAgIAotICAgICAgaXN0cnN0cmVhbSBmMihsaW5lLmNfc3RyKCkpOwotICAgICAgd2hpbGUoIDEgKQotCXsKLQkgIGYyID4+IHRleHQ7Ci0JICBpZihmMi5mYWlsKCkgJiYgIWYyLmJhZCgpICYmICFmMi5lb2YoKSkKLQkgICAgewotCSAgICAgIGNlcnIgPDwgIldBUk5JTkc6IHN0cmFuZ2UgY2hhcmFjdGVycyBpbiBzdHJlYW0gKD4+KSAhXG4iOwotCSAgICAgIGYyLmNsZWFyKGlvczo6ZmFpbGJpdCk7Ci0JICAgIH0KLQkgIGlmKCFmMil7YnJlYWs7fQotCSAgCi0JICAgIAotCSAgICAKLQkgICAgCi0JICAgIAotCSAgICAKLQkgIGlmKCB0ZXh0ID09ICIkIiApCi0JICAgIHRleHQgPSAibWtjbHMtbWFwcGVkLWRvbGxhci1zeW1ib2wtJCI7Ci0JICBpZiggIXNldFZva2FidWxhci5tZW1iZXIodGV4dCkgKXNldFZva2FidWxhci5pbnNlcnQodGV4dCk7Ci0JICBjVGJsW3BhaXI8c3RyaW5nLHN0cmluZz4ob2xkVGV4dCx0ZXh0KV0rKzsKLQkgIG9sZFRleHQ9dGV4dDsKLQl9Ci0gICAgICB0ZXh0PSIkIjsKLSAgICAgIGlmKCAhc2V0Vm9rYWJ1bGFyLm1lbWJlcih0ZXh0KSApc2V0Vm9rYWJ1bGFyLmluc2VydCh0ZXh0KTsKLSAgICAgIGNUYmxbcGFpcjxzdHJpbmcsc3RyaW5nPihvbGRUZXh0LHRleHQpXSsrOwotICAgICAgb2xkVGV4dD10ZXh0OwotICAgIH0KLSAgcmV0dXJuIG1ha2VLYXRlZ1Byb2JsZW0oY1RibCxzZXRWb2thYnVsYXIsbWF4Q2xhc3MsaW5pdGlhbGlzaWVydW5nLGF1c3dlcnR1bmcsbmFjaGJhcnNjaGFmdCxtaW5Xb3JkRnJlcXVlbmN5KTsKLX0KLSAKLQotCi0KLQotdm9pZCBLYXRlZ1Byb2JsZW1TZXRQYXJhbWV0ZXJzKEthdGVnUHJvYmxlbSAmcCkKLXsKLSAgaWYoIHAua2F0d2FobCgpPT1LX0JFU1QgKQotICAgIHsKLSAgICAgIFRBT3B0aW1pemF0aW9uOjpkZWZhdWx0QW5uUmF0ZT0wLjc7Ci0gICAgICBSUlRPcHRpbWl6YXRpb246OmRlZmF1bHRBbm5SYXRlPTAuOTU7Ci0gICAgICBHREFPcHRpbWl6YXRpb246OmRlZmF1bHRBbHBoYT0wLjA1OwotICAgICAgaWYoIHZlcmJvc2VNb2RlICkKLQljb3V0IDw8ICJQYXJhbWV0ZXItc2V0dGluZyBsaWtlIFctREVULUJFU1RcbiI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgVEFPcHRpbWl6YXRpb246OmRlZmF1bHRBbm5SYXRlPTAuNDsKLSAgICAgIFJSVE9wdGltaXphdGlvbjo6ZGVmYXVsdEFublJhdGU9MC42OwotICAgICAgR0RBT3B0aW1pemF0aW9uOjpkZWZhdWx0QWxwaGE9MC4wMTI1OwotICAgICAgaWYoIHZlcmJvc2VNb2RlICkKLQljb3V0IDw8ICJQYXJhbWV0ZXItc2V0dGluZyBsaWtlIFctREVULURFVFxuIjsKLSAgICB9Ci19Ci0KLQotCi0KLUthdGVnUHJvYmxlbSAmbWFrUmFuZG9tKGludCBBTlpfV09SRCxpbnQgQU5aX0NMUyxpbnQgaW5pdFZhbHVlLAotCQkJaW50IGF1c3dlcnR1bmcsaW50IG5hY2hiYXJzY2hhZnQsZmxvYXQgcmVsSW5pdCkKLXsKLSAgS2F0ZWdQcm9ibGVtICZrPQotICAgICpuZXcgS2F0ZWdQcm9ibGVtKEFOWl9XT1JELEFOWl9DTFMsaW5pdFZhbHVlLGF1c3dlcnR1bmcsbmFjaGJhcnNjaGFmdCk7Ci0gIEthdGVnUHJvYmxlbVdCQyAmdz1rLndvcmRGcmVxOwotICBBcnJheTxpbnQ+IGFmdGVyKEFOWl9XT1JELDApOwotICBBcnJheTxpbnQ+IGJlZm9yZShBTlpfV09SRCwwKTsKLSAgQXJyYXk8RnJlcUFycmF5PiB0d29EKEFOWl9XT1JEKTsKLQlpbnQgaTsKLSAgZm9yKGk9MDtpPEFOWl9XT1JEO2krKykgdHdvRFtpXS5pbml0KEFOWl9XT1JELDApOyAKLSAgCi0gIGZvcihpPTA7aTxBTlpfV09SRDtpKyspCi0gICAgewotICAgICAgbWFzc2VydChhZnRlcltpXT09MCk7Ci0gICAgICBtYXNzZXJ0KGJlZm9yZVtpXT09MCk7Ci0gICAgICBmb3IoaW50IGo9MDtqPEFOWl9XT1JEO2orKykKLQl7Ci0JICBtYXNzZXJ0KHR3b0RbaV1bal09PTApOwotCX0KLSAgICB9Ci0gIGZvcihpPTA7aTxBTlpfV09SRCpBTlpfV09SRCpyZWxJbml0O2krKykKLSAgICB7Ci0gICAgICBpbnQgeD1yYW5kb21JbnQoQU5aX1dPUkQpOwotICAgICAgaW50IHk9cmFuZG9tSW50KEFOWl9XT1JEKTsKLSAgICAgIGlmKHR3b0RbeF1beV09PTApCi0JewotCSAgYWZ0ZXJbeF0rKzsKLQkgIGJlZm9yZVt5XSsrOwotCX0KLSAgICAgIHR3b0RbeF1beV0rPXJhbmRvbUludCgxMCkrMTsKLSAgICB9Ci0gIGZvcihpPTA7aTxBTlpfV09SRDtpKyspCi0gICAgewotICAgICAgdy5zZXRBZnRlcldvcmRzKGksYWZ0ZXJbaV0pOwotICAgICAgdy5zZXRCZWZvcmVXb3JkcyhpLGJlZm9yZVtpXSk7Ci0gICAgfQotICAKLSAgZm9yKGk9MDtpPEFOWl9XT1JEO2krKykKLSAgICB7Ci0gICAgICBmb3IoaW50IGo9MDtqPEFOWl9XT1JEO2orKykKLQlpZiggdHdvRFtpXVtqXSApCi0JICAgIHcuc2V0RnJlcShpLGosdHdvRFtpXVtqXSk7Ci0gICAgfQotICB3LnRlc3RGdWxsKCk7Ci0gIHJldHVybiBrOwotfQotCi0KLQotCi1jaGFyICptYWtlVGl0bGUoS2F0ZWdQcm9ibGVtICZwcm9ibGVtLGludCB2ZXJmYWhyZW4pCi17Ci0gIGNoYXIgeFsxMDI0XTsKLSAgc3dpdGNoKHZlcmZhaHJlbikKLSAgICB7Ci0gICAgY2FzZSBIQ19PUFQ6Ci0gICAgICBzdHJjcHkoeCwiSEMgICAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0FfT1BUOgotICAgICAgc3RyY3B5KHgsIlNBICAgICAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFfT1BUOgotICAgICAgc3RyY3B5KHgsIlRBICAgICAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR0RBX09QVDoKLSAgICAgIHN0cmNweSh4LCJHREEgICAgIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJSVF9PUFQ6Ci0gICAgICBzdHJjcHkoeCwiUlJUICAgICIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBwcm9ibGVtLm1ha2VUaXRsZSh4K3N0cmxlbih4KSk7Ci0gIHJldHVybiBzdHJkdXAoeCk7Ci19Ci0KLQotCi0KLSNkZWZpbmUgTUFYX01VTFRJUExFIDEwICAKLQotQXJyYXk8S2F0ZWdQcm9ibGVtICo+ICZfaXpyT3B0aW1pemF0aW9uKEFycmF5PEthdGVnUHJvYmxlbSAqPiAmcHJvYnMsCi1pbnQgYW56cHJvYixkb3VibGUgdGltZUZvck9uZVJlZCxkb3VibGUgbWF4Q2xvY2ssQXJyYXk8S2F0ZWdvcnk+ICZrYXRPZldvcmQsCi1pbnQgYW56SXRlcixpbnQgdmVyZmFocmVuKQotewotICBtYXNzZXJ0KGFuenByb2I+MSk7Ci0gIG1hc3NlcnQocHJvYnNbMF0tPndvcmRGcmVxLm1pbmRlc3RBbnphaGw8PTEpOwotICBLYXRlZ1Byb2JsZW0gKnAwPXByb2JzWzBdOwotCi0gIGludCBuV29yZHM9cDAtPndvcmRGcmVxLm5Xb3JkczsKLSAgaW50IG5LYXRzPXAwLT5rYXRGcmVxLm5LYXRzOwotICBpbnQgbWluaW11bU51bWJlck9mV29yZHMgPSBtYXgoMSxpbnQobldvcmRzKjAuOTUpKTsKLQotICBpbnQgaW5kZXhPZkR1cmNoc2Nobml0dDsKLSAgQXJyYXk8aW50PiBuZXdXb3JkcyhuV29yZHMpOwotICBpbnQgdXNlQW56cHJvYj1hbnpwcm9iOwotICBkbwotICAgIHsKLSAgICAgIGludCB3LGs7Ci0gICAgICBpbmRleE9mRHVyY2hzY2huaXR0PTA7Ci0gICAgICBmb3Iodz0wO3c8bldvcmRzO3crKykKLQluZXdXb3Jkc1t3XT0tMTsKLSAgICAgIGZvcihrPTA7azx1c2VBbnpwcm9iO2srKykKLQl7Ci0JICBtYXNzZXJ0KHByb2JzW2tdLT53b3JkRnJlcS5uV29yZHM9PW5Xb3Jkcyk7Ci0JICBwcm9ic1trXS0+bWFrZUthdHMoKTsKLQl9Ci0gICAgICAKLSAgICAgIGZvcih3PTA7dzxuV29yZHM7dysrKQotCXsKLQkgIGlmKCBuZXdXb3Jkc1t3XT09LTEgKQotCSAgICB7Ci0JICAgICAgCi0JICAgICAgCi0JICAgICAgCi0JICAgICAgbGVkYV9zZXQ8aW50PiBkdXJjaHNjaG5pdHQ9KCpwMC0+a2F0cylbcDAtPmthdE9mV29yZCh3KV07Ci0JICAgICAgZm9yKGs9MTtrPHVzZUFuenByb2I7aysrKQotCSAgICAgIGR1cmNoc2Nobml0dCA9IGR1cmNoc2Nobml0dCAmICgqcHJvYnNba10tPmthdHMpW3Byb2JzW2tdLT5rYXRPZldvcmQodyldOwotCSAgICAgIAotCSAgICAgIAotCSAgICAgIGludCBfYW56SW5EdXJjaHNjaG5pdHQ9MDsKLQkgICAgICBpbnQgbnI9MDsKLQkgICAgICBmb3JhbGxfc2V0KGxlZGFfc2V0PGludD4sbnIsZHVyY2hzY2huaXR0KQotCQl7Ci0JCSAgX2FuekluRHVyY2hzY2huaXR0Kys7Ci0JCSAgbmV3V29yZHNbbnJdPWluZGV4T2ZEdXJjaHNjaG5pdHQ7Ci0JCX0KLQkgICAgICBpZiggdmVyYm9zZU1vZGUgJiYgX2FuekluRHVyY2hzY2huaXR0PjEgJiYgYW56SXRlcj09MCApCi0JCXsKLQkJICBjb3V0IDw8ICItICgiOwotCQkgICAgZm9yYWxsX3NldChsZWRhX3NldDxpbnQ+LG5yLGR1cmNoc2Nobml0dCkKLQkJICAgIHsKLQkJICAgICAgY291dCA8PCBwMC0+Z2V0U3RyaW5nKG5yKTsKLQkJICAgICAgaWYoIHAwLT53b3JkRnJlcS5uMShucik9PTEgKQotCQkJY291dCA8PCAiKiAiOwotCQkgICAgICBlbHNlCi0JCQljb3V0IDw8ICIgIjsKLQkJICAgIH0KLQkJICBjb3V0IDw8ICIpXG4iOwotCQl9Ci0JICAgICAgCi0JICAgICAgCi0JICAgICAgCi0JICAgICAgCi0JICAgICAgZm9yKGs9MDtrPHVzZUFuenByb2I7aysrKQotCQl7Ci0JCSAgZHVyY2hzY2huaXR0ID0gZHVyY2hzY2huaXR0IC0gKCpwcm9ic1trXS0+a2F0cylbcHJvYnNba10tPmthdE9mV29yZCh3KV07Ci0JCX0KLQkgICAgICBpbmRleE9mRHVyY2hzY2huaXR0Kys7Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICBpZihpbmRleE9mRHVyY2hzY2huaXR0Pj1taW5pbXVtTnVtYmVyT2ZXb3JkcykKLQl7Ci0JICBpZih1c2VBbnpwcm9iPT0xKQotCSAgICB7Ci0JICAgICAgY291dCA8PCAidXNlQW56UHJvYj09MSA9PiBteXN0ZXJpb3VzLlxuIjsKLQkgICAgICBicmVhazsJCi0JICAgIH0KLQkgIHVzZUFuenByb2ItLTsKLQl9Ci0gICAgfQotICB3aGlsZShpbmRleE9mRHVyY2hzY2huaXR0Pj1taW5pbXVtTnVtYmVyT2ZXb3Jkcyk7Ci0gIAotICAKLSAgQXJyYXk8S2F0ZWdQcm9ibGVtICo+ICZuZXU9Km5ldyBBcnJheTxLYXRlZ1Byb2JsZW0gKj4oTUFYX01VTFRJUExFKmFuenByb2IsKEthdGVnUHJvYmxlbSAqKTApOwotICBxc29ydChwcm9icy5nZXRQb2ludGVyVG9EYXRhKCksdXNlQW56cHJvYixzaXplb2YoS2F0ZWdQcm9ibGVtICopLGNvbXBhcmVQcm9ibGVtKTsKLSAgbWFzc2VydCh1c2VBbnpwcm9iPD1wcm9icy5zaXplKCkpOwotICBkb3VibGUgc3RhcnRUaW1lPWNsb2NrU2VjKCk7Ci0gIGludCBpLCBudW1iZXJPZk5ldzsKLSAgZm9yKG51bWJlck9mTmV3PTA7IChjbG9ja1NlYygpLXN0YXJ0VGltZTx0aW1lRm9yT25lUmVkKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobnVtYmVyT2ZOZXcgPCBhbnpwcm9iKSA7IG51bWJlck9mTmV3KyspCi0gICAgewotICAgICAgaW50IHc7Ci0gICAgICBpZiggbnVtYmVyT2ZOZXc9PWFuenByb2IqTUFYX01VTFRJUExFLTEgKQotCWJyZWFrOwotICAgICAgS2F0ZWdQcm9ibGVtICpwIAotCT0gbmV1W251bWJlck9mTmV3XSAKLQkgID0gbmV3IEthdGVnUHJvYmxlbShpbmRleE9mRHVyY2hzY2huaXR0LG5LYXRzLTIsCi0JCSAgICAgICAgICBwMC0+aW5pdGlhbGlzaWVydW5nLHAwLT5hdXN3ZXJ0dW5nLHAwLT5uYWNoYmFyc2NoYWZ0KTsKLQotICAgICAgZm9yKHc9MDt3PGluZGV4T2ZEdXJjaHNjaG5pdHQ7dysrKQotCXsKLQkgIHAtPndvcmRGcmVxLnNldEFmdGVyV29yZHModyw1KTsKLQkgIHAtPndvcmRGcmVxLnNldEJlZm9yZVdvcmRzKHcsNSk7Ci0JfQotICAgICAgZm9yKHc9MDt3PG5Xb3Jkczt3KyspCi0JewotCSAgQXJyYXk8T25lRnJlcT4gJmFmdGVyPXAwLT53b3JkRnJlcS5hZnRlclt3XTsKLQkgIGludCBzaXplPWFmdGVyLnNpemUoKTsKLQkgIGZvcihpPTA7aTxzaXplO2krKykKLQkgICAgcC0+d29yZEZyZXEuYWRkRnJlcShuZXdXb3Jkc1t3XSxuZXdXb3Jkc1thZnRlcltpXS53XSxhZnRlcltpXS5uKTsKLQl9Ci0gICAgICBwLT53b3JkRnJlcS50ZXN0RnVsbCgxKTsKLSAgICAgIAotICAgICAgCi0gICAgICAKLSAgICAgIAotICAgICAgCi0gICAgICAKLSAgICAgIHAtPndvcmRGcmVxLnNldF9oX29mX3dvcmRzKHAwLT53b3JkRnJlcS5nZXRfaF9vZl93b3JkcygpKTsKLSAgICAgIGRvdWJsZSB3MT0wLjAsdzI9MC4wOwotICAgICAgaWYobnVtYmVyT2ZOZXc8dXNlQW56cHJvYikKLQl7Ci0JICAKLQkgIGZvcihpPTA7aTxuV29yZHM7aSsrKQotCSAgICAocC0+aW5pdExpa2UpW25ld1dvcmRzW2ldXT1wcm9ic1tudW1iZXJPZk5ld10tPmthdE9mV29yZChpKTsKLQkgIHAtPl9pbml0aWFsaXplKDUpOwotCSAgSENPcHRpbWl6YXRpb24gaGMoKnAsLTEpOwotCSAgaWYodmVyYm9zZU1vZGUpCi0JICAgIHsKLQkgICAgICB3MT1wLT5uaWNldmFsdWUoKTsKLQkgICAgICBjb3V0IDw8ICJmcm9tIG9sZCBjYXRlZ29yeSBzeXN0ZW06IiA8PCB3MSA8PCBlbmRsOwotCSAgICB9Ci0JICBoYy5taW5pbWl6ZSgtMSk7Ci0JICBpZih2ZXJib3NlTW9kZSkKLQkgICAgewotCSAgICAgIHcyPXAtPm5pY2V2YWx1ZSgpOwotCSAgICAgIGlmKHcyPHcxKQotCQljb3V0IDw8ICJpbXByb3ZlbWVudDogIiA8PCB3MS13MiA8PCBlbmRsOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAtPl9pbml0aWFsaXplKDEpOwotCSAgZG91YmxlIG1lYW47Ci0JICBTdGF0VmFyIGVuZCxsYXVmemVpdCxzdGFydDsKLQkgIHNvbHZlUHJvYmxlbSgwLCpwLDEsLTEsdmVyZmFocmVuLG1lYW4sZW5kLGxhdWZ6ZWl0LHN0YXJ0KTsKLQkgIHcyPXAtPnZhbHVlKCk7Ci0JICBpZih2ZXJib3NlTW9kZSkKLQkgICAgICBjb3V0IDw8ICJuZXcgY2F0ZWdvcnkgc3lzdGVtOiAiIDw8IHcyIDw8ICIgKCIgPDwgcC0+bmljZXZhbHVlKCkgCi0JCTw8ICIpIFplaXQ6ICIgPDwgY2xvY2tTZWMoKSA8PCAiXG4iOwotCX0KLSAgICB9Ci0JaW50IHA7Ci0gIGZvcihwPTA7cDxwcm9icy5zaXplKCk7cCsrKQotICAgIHsKLSAgICAgIGlmKCBwcm9ic1twXSApCi0JZGVsZXRlIHByb2JzW3BdOwotICAgIH0KLSAgcXNvcnQobmV1LmdldFBvaW50ZXJUb0RhdGEoKSxudW1iZXJPZk5ldyxzaXplb2YoUHJvYmxlbSAqKSxjb21wYXJlUHJvYmxlbSk7Ci0gIG1hc3NlcnQobnVtYmVyT2ZOZXc8PW5ldS5zaXplKCkpOwotICBpZiggdmVyYm9zZU1vZGUgKQotICAgIGNvdXQgPDwgIkl0ZXJpZXJ0ZSBadXN0YW5kc3JhdW0tUmVkdWt0aW9uOiAiIDw8IGluZGV4T2ZEdXJjaHNjaG5pdHQgCi0gICAgICA8PCAiIHdvcmRzLiBjb3N0czogIiA8PCBuZXVbMF0tPnZhbHVlKCkgPDwgIiAiIAotICAgICAgPDwgbmV1WzBdLT5uaWNldmFsdWUoKSA8PCAiICgiIDw8IG51bWJlck9mTmV3LWFuenByb2IgPDwgIikiIDw8ICJ0aW1lOiAiIAotICAgICAgPDwgY2xvY2tTZWMoKSA8PCBlbmRsOwotICBpZiggaW5kZXhPZkR1cmNoc2Nobml0dDw9bkthdHMgCi0gICAgICB8fCAoY2xvY2tTZWMoKT5tYXhDbG9jayYmbWF4Q2xvY2spICkKLSAgICB7Ci0gICAgICBpZiggY2xvY2tTZWMoKT5tYXhDbG9jayYmbWF4Q2xvY2sgKQotCWNvdXQgPDwgIlNUT1AgKHRpbWUgbGltaXQ6ICIgPDwgKGNsb2NrU2VjKCktbWF4Q2xvY2spIDw8ICIgcylcbiI7Ci0gICAgICBmb3IoaT0wO2k8bldvcmRzO2krKykKLQlrYXRPZldvcmRbaV09bmV1WzBdLT5rYXRPZldvcmQobmV3V29yZHNbaV0pOwotICAgICAgcmV0dXJuIG5ldTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBBcnJheTxLYXRlZ29yeT4gJm5ld0thdE9mV29yZD0KLSAgICAgICAqKG5ldyBBcnJheTxLYXRlZ29yeT4obmV1WzBdLT53b3JkRnJlcS5uV29yZHMsLTEpKTsKLSAgICAgIEFycmF5PEthdGVnUHJvYmxlbSAqPiAmZXJnPV9penJPcHRpbWl6YXRpb24obmV1LGFuenByb2IsdGltZUZvck9uZVJlZCwKLQkJCQkJCSAgbWF4Q2xvY2ssbmV3S2F0T2ZXb3JkLAotCQkJCQkJICBhbnpJdGVyKzEsdmVyZmFocmVuKTsKLSAgICAgIGZvcihpPTA7aTxuV29yZHM7aSsrKQotCWthdE9mV29yZFtpXT1uZXdLYXRPZldvcmRbbmV3V29yZHNbaV1dOwotICAgICAgcmV0dXJuIGVyZzsKLSAgICB9Ci19Ci0KLQotCi0KLUthdGVnUHJvYmxlbSAqaXpyT3B0aW1pemF0aW9uKEthdGVnUHJvYmxlbSAmcCxpbnQgbWluTixpbnQgZmlyc3ROLAotCQkJICAgICAgZG91YmxlIGNsb2NrRm9yT25lUmVkLGRvdWJsZSBtYXhDbG9jayxpbnQgdmVyZmFocmVuKQotewotICBBcnJheTxLYXRlZ29yeT4ga2F0T2ZXb3JkKHAud29yZEZyZXEubldvcmRzLC0xKTsKLSAgaW50IHN0YXJ0TjsKLSAgaWYoIGNsb2NrRm9yT25lUmVkPD0wICkKLSAgICBzdGFydE49Zmlyc3ROOwotICBlbHNlCi0gICAgc3RhcnROPTEwMDA7Ci0gIEFycmF5PEthdGVnUHJvYmxlbSAqPiBwcm9icyhzdGFydE4pOwotICBkb3VibGUgdmFsMT0wLjAsdmFsMj0wLjA7Ci0gIGRvdWJsZSBlbmRUaW1lPS0xOwotCi0gIGRvdWJsZSBzdGFydFRpbWU9Y2xvY2tTZWMoKTsKLSAgaW50IGk7Ci0gIGZvcihpPTA7aTxzdGFydE47aSsrKQotICAgIHsKLSAgICAgIFN0YXRWYXIgZW5kLGxhdWZ6ZWl0LHN0YXJ0OwotICAgICAgZG91YmxlIG1lYW47Ci0gICAgICBwcm9ic1tpXSA9IChLYXRlZ1Byb2JsZW0gKikoKEthdGVnUHJvYmxlbSAqKXAubWFrZUVxdWFsUHJvYmxlbSgpKTsKLSAgICAgIHNvbHZlUHJvYmxlbSgwLCoocHJvYnNbaV0pLDEsLTEsdmVyZmFocmVuLG1lYW4sZW5kLGxhdWZ6ZWl0LHN0YXJ0KTsKLSAgICAgIGlmKCBpPT1taW5OLTEgKQotCWVuZFRpbWUgPSBjbG9ja1NlYygpOwotICAgICAgaWYoIGk+PWZpcnN0Ti0xICYmIChzdGFydFRpbWUrY2xvY2tGb3JPbmVSZWQ+Y2xvY2tTZWMoKSB8fCBpPT05OTkpICkKLQlicmVhazsKLSAgICB9Ci0gIGlmKCBlbmRUaW1lPDAgKQotICAgIGVuZFRpbWU9Y2xvY2tTZWMoKTsKLSAgbWFzc2VydChpPj1maXJzdE4pOwotCi0gIHFzb3J0KHByb2JzLmdldFBvaW50ZXJUb0RhdGEoKSxpLHNpemVvZihLYXRlZ1Byb2JsZW0gKiksY29tcGFyZVByb2JsZW0pOwotICBtYXNzZXJ0KGk8PXByb2JzLnNpemUoKSk7Ci0gIGlmKCBjbG9ja0Zvck9uZVJlZDw9MCApCi0gICAgewotICAgICAgY2xvY2tGb3JPbmVSZWQ9ZW5kVGltZS1zdGFydFRpbWU7Ci0gICAgICBpZiggdmVyYm9zZU1vZGUgKQotCWNvdXQgPDwgInRpbWUgZm9yIG9uZSByZWR1Y3Rpb246ICIgPDwgY2xvY2tGb3JPbmVSZWQgPDwgZW5kbDsKLSAgICB9Ci0gIF9penJPcHRpbWl6YXRpb24ocHJvYnMsbWluTixjbG9ja0Zvck9uZVJlZCxtYXhDbG9jayxrYXRPZldvcmQsMCx2ZXJmYWhyZW4pOwotICAKLSAgS2F0ZWdQcm9ibGVtICpuPShLYXRlZ1Byb2JsZW0gKikocC5tYWtlRXF1YWxQcm9ibGVtKCkpOwotICBuLT5pbml0TGlrZT0ga2F0T2ZXb3JkOwotICBuLT5faW5pdGlhbGl6ZSg1KTsKLSAgaWYoIHZlcmJvc2VNb2RlICkKLSAgICB2YWwxPW4tPnZhbHVlKCk7Ci0gIEhDT3B0aW1pemF0aW9uIGhjKCpuLC0xKTsKLSAgaGMubWluaW1pemUoLTEpOwotICB2YWwyPW4tPnZhbHVlKCk7Ci0gIGlmKCB2ZXJib3NlTW9kZSApCi0gICAgY291dCA8PCAibGFzdCBpbXByb3ZlbWVudDogIiA8PCB2YWwyLXZhbDEgPDwgIlxuIjsKLSAgY291dCA8PCAiZmluYWwgY29zdHM6ICIgPDwgdmFsMiA8PCAiICIgPDwgbi0+bmljZXZhbHVlKCkgPDwgZW5kbDsKLSAgaWYoUHJpbnRCZXN0VG8pCi0gICAgbi0+ZHVtcE9uKCpQcmludEJlc3RUbyk7Ci0gIHJldHVybiBuOwotfQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0thdGVnUHJvYmxlbVRlc3QuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0thdGVnUHJvYmxlbVRlc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2N2I3ZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9LYXRlZ1Byb2JsZW1UZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0KLQotCi0jaW5jbHVkZSAiS2F0ZWdQcm9ibGVtLmgiCi0KLQotS2F0ZWdQcm9ibGVtICZtYWtSYW5kb20oaW50IEFOWl9XT1JELGludCBBTlpfQ0xTLGludCBpbml0aWFsaXNpZXJ1bmcsCi0JCQlpbnQgYXVzd2VydHVuZyxpbnQgbmFjaGJhcnNjaGFmdCxmbG9hdCByZWxJbml0PTAuMSk7Ci0KLQotCi1LYXRlZ1Byb2JsZW0gKmZyb21LTW9kZWwoY29uc3QgY2hhciAqc3RyLGludCBtYXhDbGFzcyxpbnQgaW5pdGlhbGlzaWVydW5nLAotCQkJIGludCBhdXN3ZXJ0dW5nLGludCBuYWNoYmFyc2NoYWZ0LGludCBtaW5Xb3JkRnJlcXVlbmN5KTsKLQotCi1LYXRlZ1Byb2JsZW0gKmZyb21OZ3JGaWxlKGNvbnN0IGNoYXIgKnN0cixpbnQgbWF4Q2xhc3MsaW50IGluaXRpYWxpc2llcnVuZywKLQkJCSBpbnQgYXVzd2VydHVuZyxpbnQgbmFjaGJhcnNjaGFmdCxpbnQgbWluV29yZEZyZXF1ZW5jeSk7Ci0KLXZvaWQgd3JpdGVDbGFzc2VzKEFycmF5PEthdGVnb3J5PiAma2F0T2ZXb3JkLEthdGVnUHJvYmxlbSAmcHJvYmxlbSxvc3RyZWFtICZ0byk7Ci0KLQotCi1pbnQgZnJvbUNhdEZpbGUoS2F0ZWdQcm9ibGVtICpwLGNvbnN0IGNoYXIgKnMsYm9vbCB2ZXJiPTEpOwotCi0KLQotS2F0ZWdQcm9ibGVtICppenJPcHRpbWl6YXRpb24oS2F0ZWdQcm9ibGVtICZwLGludCBtaW5OLGludCBmaXJzdE4sCi1kb3VibGUgY2xvY2tGb3JPbmVSZWQsZG91YmxlIG1heENsb2NrLGludCB2ZXJmYWhyZW4pOwotCi0KLQotdm9pZCBLYXRlZ1Byb2JsZW1TZXRQYXJhbWV0ZXJzKEthdGVnUHJvYmxlbSAmcCk7Ci0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvS2F0ZWdQcm9ibGVtV0JDLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0thdGVnUHJvYmxlbVdCQy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMGQ0MzkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvS2F0ZWdQcm9ibGVtV0JDLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiS2F0ZWdQcm9ibGVtLmgiCi0KLXN0YXRpYyBpbnQgb25lRnJlcUNvbXBhcmVTdGVpZ2VuZChjb25zdCB2b2lkICpwLGNvbnN0IHZvaWQgKmopCi17Ci0jaWZkZWYgRlJFUVRZUEVfRE9VQkxFCi0gIGlmKCAoKChPbmVGcmVxICopcCktPm4gPCAoKE9uZUZyZXEgKilqKS0+bikgKQotICAgIHJldHVybiAtMTsKLSAgaWYoICgoKE9uZUZyZXEgKilwKS0+biA+ICgoT25lRnJlcSAqKWopLT5uKSApCi0gICAgcmV0dXJuICsxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci0jZWxzZQotICByZXR1cm4gKChPbmVGcmVxICopcCktPm4gLSAoKE9uZUZyZXEgKilqKS0+bjsKLSNlbmRpZgotfQotc3RhdGljIGludCBvbmVGcmVxQ29tcGFyZUZhbGxlbmQoY29uc3Qgdm9pZCAqcCxjb25zdCB2b2lkICpqKQotewotI2lmZGVmIEZSRVFUWVBFX0RPVUJMRQotICBpZiggKCgoT25lRnJlcSAqKXApLT5uID4gKChPbmVGcmVxICopaiktPm4pICkKLSAgICByZXR1cm4gLTE7Ci0gIGlmKCAoKChPbmVGcmVxICopcCktPm4gPCAoKE9uZUZyZXEgKilqKS0+bikgKQotICAgIHJldHVybiArMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotI2Vsc2UKLSAgcmV0dXJuIC0oKE9uZUZyZXEgKilwKS0+biArICgoT25lRnJlcSAqKWopLT5uOwotI2VuZGlmCi19Ci0KLQotS2F0ZWdQcm9ibGVtV0JDOjpLYXRlZ1Byb2JsZW1XQkMoaW50IG4saW50IG1pbncpIAotOiBfbjEobiwwKSxfbjIobiwwKSx3aXRoX2hfb2Zfd29yZHMoMCksYWZ0ZXJGaWxsZWQobiwwKSxiZWZvcmVGaWxsZWQobiwwKSxmaWxsZWQoMCksZml4ZWRXb3JkKG4sLTEpLGFic3RlaWdlbmQoMCksbldvcmRzKG4pLG5UcmFuc3BXb3JkcygwKSwKLSAgbWluZGVzdEFuemFobChtaW53KSxhZnRlcihuKSxiZWZvcmUobiksbWluSW5kZXgobiwtMSksbWF4SW5kZXgobiwtMSkKLSAgCi17Ci19Ci0KLUthdGVnUHJvYmxlbVdCQzo6fkthdGVnUHJvYmxlbVdCQygpCi0gIAotewotICBtYXNzZXJ0KCBhZnRlci5zaXplKCk9PW5Xb3Jkcyk7Ci0gIGlmKCBhYnN0ZWlnZW5kICkKLSAgICBkZWxldGUgYWJzdGVpZ2VuZDsKLX0KLQotdm9pZCBLYXRlZ1Byb2JsZW1XQkM6OmluaXQoaW50IHNwZWNpYWxGaXhlZFdvcmQpCi17Ci0gIAotICBuVHJhbnNwV29yZHM9MDsKLSAgaW50IGk7Ci0gIGZvcihpPTA7aTxfbjEuc2l6ZSgpO2krKykKLSAgICB7Ci0gICAgICBpZiggKF9uMVtpXTxtaW5kZXN0QW56YWhsICYmIF9uMltpXTxtaW5kZXN0QW56YWhsICYmIG1pbkluZGV4W2ldPD0xKSB8fGk9PXNwZWNpYWxGaXhlZFdvcmQgKQotCXsKLQkgIAotCSAgaWYoISggZml4ZWRXb3JkW2ldPT0xIHx8IGZpeGVkV29yZFtpXT09IC0xKSkKLQkgICAgY2VyciA8PCAibWtjbHM6S2F0ZWdQcm9ibGVtV0JDOjppbml0OjpFUlJPUjogIiA8PCBpIDw8ICIgIiA8PCBmaXhlZFdvcmRbaV0gPDwgZW5kbDsKLQkgIGZpeGVkV29yZFtpXT0xOwotCX0KLSAgICAgIGVsc2UgaWYoZml4ZWRXb3JkW2ldPDApCi0JblRyYW5zcFdvcmRzKys7Ci0gICAgfQotICBpZiggYWJzdGVpZ2VuZD09MCApCi0gICAgYWJzdGVpZ2VuZD0gJihnZXRTb3J0ZWRMaXN0KDApKTsKLSAgCi0gIAotICAKLSAgCi0gIAotICBpZih2ZXJib3NlTW9kZSAmJiBuVHJhbnNwV29yZHMhPV9uMS5zaXplKCktMSApCi0gICAgY291dCA8PCAiRXMgc2luZDogIiA8PG5UcmFuc3BXb3Jkczw8IiB0cmFuc3BvcnRpZXJiYXIuXG4iOwotfQotCi12b2lkIEthdGVnUHJvYmxlbVdCQzo6c2V0X2hfb2Zfd29yZHMoZG91YmxlIHMpCi0gIAotewotICB3aXRoX2hfb2Zfd29yZHM9MTsKLSAgaF9vZl93b3JkcyA9IC1zOwotfQotCi1kb3VibGUgS2F0ZWdQcm9ibGVtV0JDOjpnZXRfaF9vZl93b3JkcygpCi0gIAotewotICBpZiggd2l0aF9oX29mX3dvcmRzICkKLSAgICByZXR1cm4gLWhfb2Zfd29yZHM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoX29mX3dvcmRzPTA7Ci0gICAgICBmb3IoaW50IGk9MDtpPG5Xb3JkcztpKyspCi0JaF9vZl93b3Jkcys9MC41KihrYXRfaChfbjJbaV0pK2thdF9oKF9uMVtpXSkpOwotICAgICAgd2l0aF9oX29mX3dvcmRzPTE7Ci0gICAgICByZXR1cm4gLWhfb2Zfd29yZHM7Ci0gICAgfQotfQotCi0KLXZvaWQgS2F0ZWdQcm9ibGVtV0JDOjpzZXRBZnRlcldvcmRzKGludCB3LGludCBhbnphaGwpIAotICAKLXsgCi0gIE9uZUZyZXEgbzsKLSAgby53PS0xOwotICBvLm49MDsKLSAgYWZ0ZXJGaWxsZWRbd109MDsgCi0gIGFmdGVyW3ddLmluaXQoYW56YWhsLG8sMSk7Ci19Ci12b2lkIEthdGVnUHJvYmxlbVdCQzo6c2V0QmVmb3JlV29yZHMoaW50IHcsaW50IGFuemFobCkgCi0gIAoteyAKLSAgT25lRnJlcSBvOwotICBvLnc9LTE7Ci0gIG8ubj0wOwotICBiZWZvcmVGaWxsZWRbd109MDsKLSAgYmVmb3JlW3ddLmluaXQoYW56YWhsLG8sMSk7IAotfQotCi0KLXZvaWQgS2F0ZWdQcm9ibGVtV0JDOjpzZXRGcmVxKGludCB3MSxpbnQgdzIsRnJlcVR5cGUgYW56YWhsKSAKLSAgCi17Ci0gIE9uZUZyZXEgbzsKLSAgby5uPWFuemFobDsKLQotICBvLnc9dzI7Ci0gIGFmdGVyW3cxXVthZnRlckZpbGxlZFt3MV0rK109bzsKLSAgX24xW3cxXSs9YW56YWhsOwotICBvLnc9dzE7Ci0gIGJlZm9yZVt3Ml1bYmVmb3JlRmlsbGVkW3cyXSsrXT1vOwotICBfbjJbdzJdKz1hbnphaGw7Ci19Ci0KLXZvaWQgS2F0ZWdQcm9ibGVtV0JDOjphZGRGcmVxKGludCB3MSxpbnQgdzIsRnJlcVR5cGUgYW56YWhsKSAKLSAgCi17Ci0gIE9uZUZyZXEgbzsKLSAgby5uPWFuemFobDsKLSAgaW50IHBvcz0tMSxpOwotICBmb3IoaT0wO2k8YWZ0ZXJGaWxsZWRbdzFdO2krKykKLSAgICBpZihhZnRlclt3MV1baV0udz09dzIpCi0gICAgICBwb3M9aTsKLQotICBpZihwb3M9PS0xKQotICAgIHsKLSAgICAgIG8udz13MjsKLSAgICAgIGFmdGVyW3cxXVthZnRlckZpbGxlZFt3MV0rK109bzsKLSAgICB9Ci0gIGVsc2UKLSAgICAgIGFmdGVyW3cxXVtwb3NdLm4rPWFuemFobDsKLSAgX24xW3cxXSs9YW56YWhsOwotCi0gIHBvcz0tMTsKLSAgZm9yKGk9MDtpPGJlZm9yZUZpbGxlZFt3Ml07aSsrKQotICAgIGlmKGJlZm9yZVt3Ml1baV0udz09dzEpCi0gICAgICBwb3M9aTsKLSAgaWYocG9zPT0tMSkKLSAgICB7Ci0gICAgICBvLnc9dzE7Ci0gICAgICBiZWZvcmVbdzJdW2JlZm9yZUZpbGxlZFt3Ml0rK109bzsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZWZvcmVbdzJdW3Bvc10ubis9YW56YWhsOwotICBfbjJbdzJdKz1hbnphaGw7Ci19Ci0KLQotc2hvcnQgS2F0ZWdQcm9ibGVtV0JDOjp0ZXN0RnVsbChpbnQgZG9JdCkKLSAgCi17Ci0gIGludCBlbmFOb209MDsKLSAgaW50IGFmdGVyRmlsbGVkU3VtPTAsYmVmb3JlRmlsbGVkU3VtPTA7Ci0gIGludCByZXQ9MSxpOwotICBmb3IoaT0wO2k8bldvcmRzO2krKykKLSAgICB7Ci0gICAgICBpZiggbjEoaSk9PTEgJiYgbjIoaSk9PTEgKQotCWVuYU5vbSsrOwotICAgICAgYWZ0ZXJGaWxsZWRTdW0rPWFmdGVyRmlsbGVkW2ldOwotICAgICAgYmVmb3JlRmlsbGVkU3VtKz1iZWZvcmVGaWxsZWRbaV07Ci0gICAgICBpZihhZnRlckZpbGxlZFtpXSE9YWZ0ZXJbaV0uc2l6ZSgpKQotCXsKLQkgIHJldD0wOwotCSAgaWYoIGRvSXQgKQotCSAgICBhZnRlcltpXS5yZXNpemUoYWZ0ZXJGaWxsZWRbaV0pOwotCX0KLSAgICAgIGlmKGJlZm9yZUZpbGxlZFtpXSE9YmVmb3JlW2ldLnNpemUoKSkKLQl7Ci0JICByZXQ9MDsKLQkgIGlmKCBkb0l0ICkKLQkgICAgYmVmb3JlW2ldLnJlc2l6ZShiZWZvcmVGaWxsZWRbaV0pOwotCX0KLSAgICAgIAotICAgIH0KLSAgaWYoIHJldD09MCAmJiAhZG9JdCApCi0gICAgewotICAgICAgY2VyciA8PCAiRXJyb3I6IFVuZmlsbGVkIHdvcmQgYmlncmFtIHN0YXRpc3RpY3MuXG4iOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmaWxsZWQ9MTsKLSAgaWYoIHZlcmJvc2VNb2RlPjEgKQotICAgIHsKLSAgICAgIGNvdXQgPDwgIk1FQU4ofEwodyl8K3xSKHcpfCk9IiA8PCAoYmVmb3JlRmlsbGVkU3VtLyhmbG9hdCluV29yZHMpCi0JKyhhZnRlckZpbGxlZFN1bS8oZmxvYXQpbldvcmRzKSA8PCBlbmRsOwotICAgICAgY291dCA8PCAiSGFwYXNsZWdvbWVuYTogIiA8PCBlbmFOb20gPDwgZW5kbDsKLSAgICB9Ci0gIGludCBzeW1tZXRyaXNjaD0xOwotICBmb3IoaT0wO2k8bldvcmRzO2krKykKLSAgICB7Ci0JCWludCBqOwotICAgICAgbWFzc2VydChiZWZvcmVbaV0uc2l6ZSgpPT1iZWZvcmVGaWxsZWRbaV0pOwotICAgICAgbWFzc2VydCggYWZ0ZXJbaV0uc2l6ZSgpPT0gYWZ0ZXJGaWxsZWRbaV0pOwotICAgICAgRnJlcVR5cGUgc3VtPTA7Ci0gICAgICBmb3Ioaj0wO2o8YWZ0ZXJbaV0uc2l6ZSgpO2orKykKLQlzdW0rPWFmdGVyW2ldW2pdLm47Ci0gICAgICBtYXNzZXJ0KCBzdW09PV9uMVtpXSApOwotICAgICAgc3VtPTA7Ci0gICAgICBmb3Ioaj0wO2o8YmVmb3JlW2ldLnNpemUoKTtqKyspCi0Jc3VtKz1iZWZvcmVbaV1bal0ubjsKLSAgICAgIG1hc3NlcnQoc3VtPT1fbjJbaV0pOwotICAgICAgaWYoX24xW2ldIT1fbjJbaV0pCi0JewotCSAgc3ltbWV0cmlzY2g9MDsKLQkgIGlmKCB2ZXJib3NlTW9kZT4xICkKLQkgICAgY291dCA8PCAiQXN5bW1ldHJpZTogIiA8PCBpIDw8ICIgIiA8PCBfbjFbaV0gPDwgIiAiIDw8IF9uMltpXSA8PCBlbmRsOwotCX0KLSAgICAgIAotICAgIH0KLSAgaWYodmVyYm9zZU1vZGUgJiYgc3ltbWV0cmlzY2g9PTApCi0gICAgY291dCA8PCAiV2FybmluZzogd29yZCBiaWdyYW0gc3RhdGlzdGljIGlzIG5vdCBzeW1tZXRyaWMgIiAKLSAgICAgICAgICAgICIodGhpcyBpcyBwb3NzaWJseSBhbiBlcnJvcilcbiI7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLUFycmF5PFdvcmQ+ICZLYXRlZ1Byb2JsZW1XQkM6OmdldFNvcnRlZExpc3QoaW50IHN0ZWlnZW5kKQotICAKLXsKLSAgaW50IHNpej1fbjIuc2l6ZSgpLGk7Ci0gIG1hc3NlcnQoZmlsbGVkKTsKLSAgQXJyYXk8V29yZD4gJnNvcnRlZExpc3QgPSpuZXcgQXJyYXk8V29yZD4oc2l6KTsKLSAgQXJyYXk8T25lRnJlcT4gbGlzdChzaXopOwotICBpbnQgcG9zPTA7Ci0gIGZvcihpPTA7aTxzaXo7aSsrKQotICAgIHsKLSAgICAgIGlmKCBmaXhlZFdvcmRbaV08MCApCi0JewotCSAgbGlzdFtwb3NdLnc9aTsKLQkgIGxpc3RbcG9zXS5uPV9uMVtpXTsKLQkgIHBvcysrOwotCX0KLSAgICB9Ci0gIGludCBhbnpGcmVlPXBvczsKLSAgZm9yKGk9MDtpPHNpejtpKyspCi0gICAgewotICAgICAgaWYoIGZpeGVkV29yZFtpXT49MCApCi0JewotCSAgbGlzdFtwb3NdLnc9aTsKLQkgIGxpc3RbcG9zXS5uPV9uMVtpXTsKLQkgIHBvcysrOwotCX0KLSAgICB9Ci0gIG1hc3NlcnQocG9zPT1zaXopOwotICBpZihzdGVpZ2VuZCApCi0gICAgcXNvcnQobGlzdC5nZXRQb2ludGVyVG9EYXRhKCksYW56RnJlZSxzaXplb2YoT25lRnJlcSksb25lRnJlcUNvbXBhcmVTdGVpZ2VuZCk7Ci0gIGVsc2UKLSAgICBxc29ydChsaXN0LmdldFBvaW50ZXJUb0RhdGEoKSxhbnpGcmVlLHNpemVvZihPbmVGcmVxKSxvbmVGcmVxQ29tcGFyZUZhbGxlbmQpOwotICBtYXNzZXJ0KCBhbnpGcmVlPD1saXN0LnNpemUoKSApOwotCi0gIGZvcihpPTA7aTxzaXo7aSsrKQotICAgIHsKLSAgICAgIHNvcnRlZExpc3RbaV09bGlzdFtpXS53OwotICAgICAgbWFzc2VydChzdGVpZ2VuZCB8fCBpPT0wIHx8IGk+PWFuekZyZWUgfHwgbGlzdFtpLTFdLm4+PWxpc3RbaV0ubiApOwotICAgICAgbWFzc2VydCgoIXN0ZWlnZW5kKSB8fCBpPT0wIHx8IGk+PWFuekZyZWUgfHwgbGlzdFtpLTFdLm48PWxpc3RbaV0ubiApOwotICAgIH0KLSAgcmV0dXJuIHNvcnRlZExpc3Q7Ci19Ci0KLUZyZXFUeXBlIEthdGVnUHJvYmxlbVdCQzo6bnVtYmVyT2ZXb3JkcygpCi0gIAotewotICBGcmVxVHlwZSBuMT0wLG4yPTA7Ci0gIGZvcihpbnQgaT0wO2k8X24xLnNpemUoKTtpKyspCi0gICAgewotICAgICAgbjErPV9uMVtpXTsKLSAgICAgIG4yKz1fbjJbaV07Ci0gICAgfQotICAjaWZuZGVmIEZSRVFUWVBFX0RPVUJMRQotICBtYXNzZXJ0KG4xPT1uMik7Ci0gICNlbmRpZgotICByZXR1cm4gbjE7Ci19Ci0KLXZvaWQgS2F0ZWdQcm9ibGVtV0JDOjpzZXREb2xsYXIoaW50IG4pCi0gIAotewotICBpZiggZml4ZWRXb3JkW25dPDAgKQotICAgIG5UcmFuc3BXb3Jkcy0tOwotICBmaXhlZFdvcmRbbl09MDsKLX0KLQotdm9pZCBLYXRlZ1Byb2JsZW1XQkM6OmluaXRpYWxpemVJbmRleChjb25zdCBsZWRhX2FycmF5PHN0cmluZz4md29yZHMsY2hhciBmaXJzdENoYXIsaW50IHVudGVuLGludCBvYmVuLGJvb2wgbm9IYXBhcykKLXsKLSAgaW50IG49MDsKLSAgaW50IGk7Ci0gIG1hc3NlcnQoLTE8dW50ZW4pO21hc3NlcnQodW50ZW48b2Jlbik7Ci0gIGlmKCB2ZXJib3NlTW9kZSApCi0gICAgY291dCA8PCAiSW5pdGlhbGl6ZUluZGV4OiAiIDw8IGZpcnN0Q2hhciA8PCAiIHU6IiA8PCB1bnRlbiA8PCAiIG86IiA8PCBvYmVuIDw8ICIgIiA8PCBub0hhcGFzIDw8IGVuZGw7Ci0gIG92ZXJfYXJyYXkod29yZHMsaSkKLSAgICB7Ci0gICAgICBpZiggd29yZHNbaV1bMF09PWZpcnN0Q2hhciAmJiAobm9IYXBhcyB8fCAoKHNob3J0KShuMShpKSswLjAwMDEpKT49bWluZGVzdEFuemFobCB8fCAoKHNob3J0KShuMihpKSswLjAwMDEpKT49bWluZGVzdEFuemFobCkgKQotCXsKLQkgIG1pbkluZGV4W2ldPXVudGVuOwotCSAgbWF4SW5kZXhbaV09b2JlbjsKLQkgIG4rKzsgIAotCX0KLSAgICB9Ci0gIGlmKCB2ZXJib3NlTW9kZSApCi0gICAgY291dCA8PCAiSW5pdGlhbGl6ZUluZGV4IGdlZnVuZGVuIGZ1ZXIgIiA8PCBuIDw8ICIgV29lcnRlci5cbiI7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL0thdGVnUHJvYmxlbVdCQy5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvS2F0ZWdQcm9ibGVtV0JDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzk5ZTUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvS2F0ZWdQcm9ibGVtV0JDLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLQotCi0KLQotI2lmbmRlZiBLQVRFR1BST0JMRU1XQkNfSAotI2RlZmluZSBLQVRFR1BST0JMRU1XQkNfSAotCi1zdHJ1Y3QgT25lRnJlcQotewotICBpbnQgdzsgCi0gIEZyZXFUeXBlIG47IAotfTsKLQotdHlwZWRlZiBBcnJheTxPbmVGcmVxPiBNYW55RnJlcTsKLQotY2xhc3MgS2F0ZWdQcm9ibGVtV0JDCi0KLXsKLQotICBmcmllbmQgY2xhc3MgS2F0ZWdQcm9ibGVtOwotCi0gcHJpdmF0ZToKLSAgQXJyYXk8RnJlcVR5cGU+IF9uMTsgCi0gICAgICAgICAgICAgICAgICAKLSAgQXJyYXk8RnJlcVR5cGU+IF9uMjsgCi0gICAgICAgICAgICAgICAgICAKLQotICBkb3VibGUgaF9vZl93b3JkczsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgCi0gIHNob3J0IHdpdGhfaF9vZl93b3JkczsgCi0KLSAgQXJyYXk8aW50PiBhZnRlckZpbGxlZDsgCi0gIEFycmF5PGludD4gYmVmb3JlRmlsbGVkOwotCi0gIEFycmF5PGludD4gJmdldFNvcnRlZExpc3QoaW50IHN0ZWlnZW5kKTsgCi0gIAotCi0gcHJvdGVjdGVkOgotICBLYXRlZ1Byb2JsZW1XQkMoaW50IG4saW50IG1pbncpOwotICAKLQotICB+S2F0ZWdQcm9ibGVtV0JDKCk7Ci0gIAotCi0gIHNob3J0IGZpbGxlZDsgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBBcnJheTxpbnQ+IGZpeGVkV29yZDsgCi0gIEFycmF5PGludD4gKmFic3RlaWdlbmQ7IAotCi0gIHZvaWQgaW5pdChpbnQgc3BlY2lhbEZpeGVkV29yZD0tMSk7Ci0gIAotCi0gcHVibGljOgotICBpbnQgbldvcmRzOyAgICAgICAgICAgICAKLSAgaW50IG5UcmFuc3BXb3JkczsgICAgICAgCi0gIHNob3J0IG1pbmRlc3RBbnphaGw7ICAgIAotICBBcnJheTxNYW55RnJlcT4gYWZ0ZXI7ICAKLSAgQXJyYXk8TWFueUZyZXE+IGJlZm9yZTsgCi0gIEFycmF5PGludD4gbWluSW5kZXg7IAotICBBcnJheTxpbnQ+IG1heEluZGV4OyAKLSAgCi0KLSAgCi0gIHZvaWQgc2V0QWZ0ZXJXb3JkcyhpbnQgdyxpbnQgYW56YWhsKTsKLSAgCi0KLSAgdm9pZCBzZXRCZWZvcmVXb3JkcyhpbnQgdyxpbnQgYW56YWhsKTsKLSAgCi0KLSAgdm9pZCBzZXRGcmVxKGludCB3MSxpbnQgdzIsIEZyZXFUeXBlIGFuemFobCk7Ci0gIAotCi0gIHZvaWQgYWRkRnJlcShpbnQgdzEsaW50IHcyLEZyZXFUeXBlIGFuemFobCk7Ci0gIAotCi0gIHZvaWQgc2V0RG9sbGFyKGludCBuKTsKLSAgCi0KLSAgaW50IGZpeGVkKGludCB3KQotICAgIHsKLSAgICAgIHJldHVybiBmaXhlZFdvcmRbd107Ci0gICAgfQotCi0gIEZyZXFUeXBlIG4xKGludCB3KSB7IHJldHVybiBfbjFbd107fTsKLSAgCi0KLSAgRnJlcVR5cGUgbjIoaW50IHcpIHsgcmV0dXJuIF9uMlt3XTt9OwotICAKLQotICBGcmVxVHlwZSBudW1iZXJPZldvcmRzKCk7Ci0gIAotCi0gIHNob3J0IHRlc3RGdWxsKGludCBkb0l0PTApOwotICAKLQotICBkb3VibGUgZ2V0X2hfb2Zfd29yZHMoKTsKLSAgCi0KLSAgdm9pZCBzZXRfaF9vZl93b3Jkcyhkb3VibGUgcyk7Ci0gIAotCi0gIHZvaWQgaW5pdGlhbGl6ZUluZGV4KGNvbnN0IGxlZGFfYXJyYXk8c3RyaW5nPiZ3b3JkcyxjaGFyIGZpcnN0Q2hhcixpbnQgbWluLGludCBtYXgsYm9vbCBub0hhcGFzKTsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvTVNCT3B0aW1pemF0aW9uLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL01TQk9wdGltaXphdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Nzg4MjYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvTVNCT3B0aW1pemF0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0jaW5jbHVkZSAiTVNCT3B0aW1pemF0aW9uLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiUHJvYmxlbVRlc3QuaCIKLQotI2lmZGVmIF9fR05VQ19fCi10ZW1wbGF0ZSBjbGFzcyBBcnJheTxkb3VibGU+OwotdGVtcGxhdGUgY2xhc3MgQXJyYXk8UHJvYkFuZE9wdD47Ci0jZW5kaWYKLQotc3RydWN0IGRvdWJsZUludCB7IGRvdWJsZSBhOyBpbnQgaTsgfTsKLXN0YXRpYyBpbnQgZG91YmxlaW50Y29tcGFyZShjb25zdCB2b2lkICpwLGNvbnN0IHZvaWQgKmopCi17Ci0gIGlmKCgoc3RydWN0IGRvdWJsZUludCAqKXApLT5hIDwgKChkb3VibGVJbnQgKilqKS0+YSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYoKChzdHJ1Y3QgZG91YmxlSW50ICopcCktPmEgPT0gKChkb3VibGVJbnQgKilqKS0+YSkKLSAgICByZXR1cm4gMDsKLSAgZWxzZQotICAgIHJldHVybiAxOwotfQotCi0gICAgIAotTVNCT3B0aW1pemF0aW9uOjpNU0JPcHRpbWl6YXRpb24oUHJvYmxlbSAmcCxpbnQgdmVyZixpbnQgYW56LEFycmF5PGRvdWJsZT4gJnBvcyxBcnJheTxkb3VibGU+ICZwb3IpIAotOiBQb3BPcHRpbWl6YXRpb24ocCx2ZXJmLGFueiksCi1wZXJjZW50T2ZTdGVwcyhwb3MpLHBlcmNlbnRPZlJ1bihwb3IpLG5hY2hNaW5pbWllcnVuZygwKQotewotfQotCi0gICAgIAotdm9pZCBNU0JPcHRpbWl6YXRpb246OnpJbml0aWFsaXplKCkKLXsKLSAgUG9wT3B0aW1pemF0aW9uOjp6SW5pdGlhbGl6ZSgpOwotCi0gIGludCBpdGVyYXRpb25zc2Nocml0dGU7Ci0gIGRvdWJsZSBtZWFuOwotICBTdGF0VmFyIGVuZCxsYXVmemVpdCxzdGFydDsgIAotICB6dWZhbGxTZWVkKCk7IAotCi0gIAotICAKLSAgCi0gIHNvbHZlUHJvYmxlbShQcm9ibGVtVGVzdFZlcmJvc2VNb2RlLCpvcmlnaW5hbFByb2JsZW0sMiwtMSx2ZXJmYWhyZW4sbWVhbiwKLQkgICAgICAgZW5kLGxhdWZ6ZWl0LHN0YXJ0LDAsJml0ZXJhdGlvbnNzY2hyaXR0ZSk7Ci0gIGV4cGVjdGVkU3RlcHM9KGludCkoaXRlcmF0aW9uc3NjaHJpdHRlKTsKLQotICBpZih2ZXJib3NlTW9kZSkKLSAgICBjb3V0IDw8ICJNU0I6bWVhbiBudW1iZXIgb2Ygc3RlcHMgZm9yIG9uZSBydW46ICIgPDwgZXhwZWN0ZWRTdGVwcyA8PCBlbmRsOwotfQotCQotICAgICAKLWRvdWJsZSBNU0JPcHRpbWl6YXRpb246Om1pbmltaXplKGludCkKLXsKLSAgaWYoIGluaXRpYWxpc2llcnQ9PTAgKQotICAgIHpJbml0aWFsaXplKCk7Ci0KLSAgaW50IGk7Ci0gIGludCBhbno9c2l6ZSgpOwotICBpbnQgbnVtcHJvYmxlbXM9YW56OwotCi0gIGlmKCB2ZXJib3NlTW9kZSApCi0gICAgeyAKLSAgICAgIGRvdWJsZSB1c2VkU3RlcHM9MDsKLSAgICAgIGZvcihpPTA7aTxwZXJjZW50T2ZTdGVwcy5zaXplKCk7aSsrKQotCXsKLQkgIHVzZWRTdGVwcys9ZXhwZWN0ZWRTdGVwcyoocGVyY2VudE9mU3RlcHNbaV0tCi0JCQkJICAgIChpPT0wPzA6cGVyY2VudE9mU3RlcHNbaS0xXSkpKm51bXByb2JsZW1zOwotCSAgbnVtcHJvYmxlbXM9KGludCkoY2VpbChhbnoqKDEuMC1wZXJjZW50T2ZSdW5baV0pKSk7Ci0JICBpZiggbnVtcHJvYmxlbXM8MSApbnVtcHJvYmxlbXM9MTsKLQl9Ci0gICAgICB1c2VkU3RlcHMrPWV4cGVjdGVkU3RlcHMqCi0JKDEuMC1wZXJjZW50T2ZTdGVwc1twZXJjZW50T2ZTdGVwcy5zaXplKCktMV0pKm51bXByb2JsZW1zOwotICAgICAgY291dCA8PCAiTVNCOiBzcGVlZCBmYWN0b3I6ICIgCi0JICAgPDwgKGRvdWJsZSl1c2VkU3RlcHMvKGV4cGVjdGVkU3RlcHMqc2l6ZSgpKSA8PCBlbmRsOwotICAgICAgbnVtcHJvYmxlbXM9YW56PXNpemUoKTsKLSAgICB9Ci0KLSAgZm9yKGk9MDtpPHBlcmNlbnRPZlN0ZXBzLnNpemUoKTtpKyspCi0gICAgewotICAgICAgCi0gICAgICBpbnQgc3RlcHM9KGludCkoZXhwZWN0ZWRTdGVwcyoocGVyY2VudE9mU3RlcHNbaV0tCi0JCQkJICAgICAoaT09MD8wOnBlcmNlbnRPZlN0ZXBzW2ktMV0pKSk7Ci0KLSAgICAgIAotICAgICAgZm9yKGludCBhPTA7YTxudW1wcm9ibGVtczthKyspCi0JewotCSAgCi0JICBkb3VibGUgdjsKLQkgIHY9IG9wdGltaXphdGlvbihhKS0+bWluaW1pemUoc3RlcHMpOwotCSAgaWYodmVyYm9zZU1vZGUpY291dCA8PCAiTVNCOiIgPDwgaSA8PCAiICIgPDwgYSA8PCAiOiIgPDwgdiA8PCBlbmRsOwotCX0KLQotICAgICAgc29ydCgpOyAKLQotICAgICAgaWYodmVyYm9zZU1vZGUpCi0JY291dCA8PCAiTVNCOiBiZXN0OiIgPDwgcHJvYmxlbSgwKS0+dmFsdWUoKSAKLQkgICAgIDw8ICIgICAgd29yc3Q6IiA8PCBwcm9ibGVtKG51bXByb2JsZW1zLTEpLT52YWx1ZSgpIDw8IGVuZGw7Ci0KLSAgICAgIAotICAgICAgbnVtcHJvYmxlbXM9KGludCkoYW56KigxLjAtcGVyY2VudE9mUnVuW2ldKSk7Ci0gICAgICBpZiggbnVtcHJvYmxlbXM8MSApCi0JbnVtcHJvYmxlbXM9MTsKLSAgICAgIGlmKHZlcmJvc2VNb2RlKQotCWNvdXQgPDwgIk1TQjogbm93IGkgaGF2ZSA6ICIgPDwgbnVtcHJvYmxlbXMgPDwgIiBQcm9ibGVtJ3MuIiA8PCBlbmRsOwotICAgICAgaWYobnVtcHJvYmxlbXM9PTEpCi0JYnJlYWs7Ci0gICAgfQotICBhc3NlcnQoIG51bXByb2JsZW1zPjAgKTsKLQotICAKLSAgZm9yKGludCBhPTA7YTxudW1wcm9ibGVtczthKyspCi0gICAgb3B0aW1pemF0aW9uKGEpLT5taW5pbWl6ZSgtMSk7Ci0gIHNvcnQoKTsKLQotICBkb3VibGUgZXJnZWJuaXNXZXJ0ID0gcHJvYmxlbSgwKS0+dmFsdWUoKTsKLSAgY291dCA8PCAiTVNCOiB2YWx1ZToiIDw8IGVyZ2VibmlzV2VydCA8PCAiIChuaWNldmFsdWU6IiAKLSAgICA8PCBwcm9ibGVtKDApLT5uaWNldmFsdWUoKSA8PCAiKVxuIjsKLSAgbmFjaE1pbmltaWVydW5nPTE7Ci0gIHJldHVybiBlcmdlYm5pc1dlcnQ7Ci19Ci0KLQotICAgICAKLXZvaWQgTVNCT3B0aW1pemF0aW9uOjpvcHRpbWl6ZVZhbHVlcyhQcm9ibGVtICZwLGludCB2ZXJmYWhyZW4pCi17Ci0JaW50IGk7Ci0gIHN0cnVjdCBkb3VibGVJbnQgcmlbMjBdOwotICBkb3VibGUgbWVhbjsKLSAgU3RhdFZhciBlbmQsbGF1ZnplaXQsc3RhcnQ7ICAKLSAgc29sdmVQcm9ibGVtKFByb2JsZW1UZXN0VmVyYm9zZU1vZGUscCw1LC0xLHZlcmZhaHJlbixtZWFuLGVuZCxsYXVmemVpdCxzdGFydCk7Ci0gIGRvdWJsZSBmaXZlUGVyY2VudFN0ZXBzPShpbnQpKGxhdWZ6ZWl0LmdldE1lYW4oKS8yMC4wKTsKLSAgZG91YmxlIHF1YWxpdGFldFsyMF1bMjBdOwotICBmb3IoaT0wO2k8MjA7aSsrKQotICAgIHsKLSAgICAgIE9wdGltaXphdGlvbiAqbz0oT3B0aW1pemF0aW9uICopZ2VuSXRlck9wdGltaXplcih2ZXJmYWhyZW4scCwtMSk7Ci0gICAgICBmb3IoaW50IGE9MDthPDIwO2ErKykKLQl7Ci0JICBxdWFsaXRhZXRbaV1bYV09by0+bWluaW1pemUoKGludClmaXZlUGVyY2VudFN0ZXBzKTsKLQkgIGNvdXQgPDwgcXVhbGl0YWV0W2ldW2FdIDw8ICIgIjsKLQl9Ci0gICAgICByaVtpXS5hPW8tPm1pbmltaXplKC0xKTsKLSAgICAgIHJpW2ldLmk9aTsKLSAgICAgIGNvdXQgPDwgcmlbaV0uYSA8PCBlbmRsOwotICAgICAgZGVsZXRlIG87Ci0gICAgfQotICBxc29ydChyaSwyMCxzaXplb2Yoc3RydWN0IGRvdWJsZUludCksZG91YmxlaW50Y29tcGFyZSk7Ci0KLSAgY291dCA8PCAiI0Jlc2NobmVpZHVuZ3NtYXRyaXgsIHdlbGNoZSBkaWUgZHJlaSBiZXN0ZW4gTGFldWZlIGVyaGFlbHQ6ICI7Ci0gIGZvcihpPTA7aTwyMDtpKyspCi0gICAgewotCQlpbnQgYTsKLSAgICAgIHN0cnVjdCBkb3VibGVJbnQgdlsyMF07Ci0gICAgICBmb3IoYT0wO2E8MjA7YSsrKQotCXsgdlthXS5pPWE7dlthXS5hPXF1YWxpdGFldFthXVtpXTt9Ci0gICAgICBxc29ydCh2LDIwLHNpemVvZihzdHJ1Y3QgZG91YmxlSW50KSxkb3VibGVpbnRjb21wYXJlKTsKLSAgICAgIGludCBucj0wOwotICAgICAgZm9yKGE9MDthPDIwO2ErKykKLQlpZiggdlthXS5pPT1yaVswXS5pIHx8IHZbYV0uaT09cmlbMV0uaSB8fCB2W2FdLmk9PXJpWzJdLmkgKQotCSAgbnI9YTsKLSAgICAgIGZsb2F0IHBlcmNlbnQ9KDEuMC1uci8yMC4wKSoxMDAuMDsKLSAgICAgIGlmKG5yPT0yKQotCXBlcmNlbnQ9MTAwLjA7Ci0gICAgICBjb3V0IDw8ICIjICIgPDwgaSA8PCAiICIgPDwgKGkvMjAuMCkqMTAwIDw8ICIlICAgICIgPDwgcGVyY2VudCA8PCAiJVxuIjsKLSAgICB9Ci0gIGNvdXQgPDwgIiNCZXNjaG5laWR1bmdzbWF0cml4LCB3ZWxjaGUgZGllIHp3ZWkgYmVzdGVuIExhZXVmZSBlcmhhZWx0OiAiOwotICBmb3IoaT0wO2k8MjA7aSsrKQotICAgIHsKLQkJaW50IGE7Ci0gICAgICBzdHJ1Y3QgZG91YmxlSW50IHZbMjBdOwotICAgICAgZm9yKGE9MDthPDIwO2ErKykKLQl7IHZbYV0uaT1hO3ZbYV0uYT1xdWFsaXRhZXRbYV1baV07fQotICAgICAgcXNvcnQodiwyMCxzaXplb2Yoc3RydWN0IGRvdWJsZUludCksZG91YmxlaW50Y29tcGFyZSk7Ci0gICAgICBpbnQgbnI9MDsKLSAgICAgIGZvcihhPTA7YTwyMDthKyspCi0JaWYoIHZbYV0uaT09cmlbMF0uaSB8fCB2W2FdLmk9PXJpWzFdLmkgKQotCSAgbnI9YTsKLSAgICAgIGZsb2F0IHBlcmNlbnQ9KDEuMC1uci8yMC4wKSoxMDAuMDsKLSAgICAgIGlmKG5yPT0xKQotCXBlcmNlbnQ9MTAwLjA7Ci0gICAgICBjb3V0IDw8ICIjICIgPDwgaSA8PCAiICIgPDwgKGkvMjAuMCkqMTAwIDw8ICIlICAgICIgPDwgcGVyY2VudCA8PCAiJVxuIjsKLSAgICB9Ci0gIGNvdXQgPDwgIiNCZXNjaG5laWR1bmdzbWF0cml4LCB3ZWxjaGUgZGVuIGJlc3RlbiBMYXVmIGVyaGFlbHQ6ICI7Ci0gIGZvcihpPTA7aTwyMDtpKyspCi0gICAge2ludCBhOwotICAgICAgc3RydWN0IGRvdWJsZUludCB2WzIwXTsKLSAgICAgIGZvcihhPTA7YTwyMDthKyspCi0JeyB2W2FdLmk9YTt2W2FdLmE9cXVhbGl0YWV0W2FdW2ldO30KLSAgICAgIHFzb3J0KHYsMjAsc2l6ZW9mKHN0cnVjdCBkb3VibGVJbnQpLGRvdWJsZWludGNvbXBhcmUpOwotICAgICAgaW50IG5yPTA7Ci0gICAgICBmb3IoYT0wO2E8MjA7YSsrKQotCWlmKCB2W2FdLmk9PXJpWzBdLmkgKQotCSAgbnI9YTsKLSAgICAgIGZsb2F0IHBlcmNlbnQ9KDEuMC1uci8yMC4wKSoxMDAuMDsKLSAgICAgIGlmKG5yPT0wKQotCXBlcmNlbnQ9MTAwLjA7Ci0gICAgICBjb3V0IDw8ICIjICIgPDwgaSA8PCAiICIgPDwgKGkvMjAuMCkqMTAwIDw8ICIlICAgICIgPDwgcGVyY2VudCA8PCAiJVxuIjsKLSAgICB9Ci19Ci0KLSAgICAgCi1Qcm9ibGVtJiBNU0JPcHRpbWl6YXRpb246OmJlc3RQcm9ibGVtKCkKLXsKLSAgYXNzZXJ0KG5hY2hNaW5pbWllcnVuZz09MSk7Ci0gIHJldHVybiAqKHByb2JsZW0oMCkpOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvTVNCT3B0aW1pemF0aW9uLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9NU0JPcHRpbWl6YXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzMGM5OC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9NU0JPcHRpbWl6YXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0KLQotCi0KLSNpZm5kZWYgTVNCT1BUSU1JWkFUSU9OCi0jZGVmaW5lIE1TQk9QVElNSVpBVElPTiAKLQotI2luY2x1ZGUgIlBvcE9wdGltaXphdGlvbi5oIgotCi1jbGFzcyBNU0JPcHRpbWl6YXRpb24gOiBwdWJsaWMgUG9wT3B0aW1pemF0aW9uCi0JewotCi0gICBwcm90ZWN0ZWQ6Ci0gICAgIAotICAgICBBcnJheTxkb3VibGU+IHBlcmNlbnRPZlN0ZXBzOyAKLSAgICAgQXJyYXk8ZG91YmxlPiBwZXJjZW50T2ZSdW47Ci0KLSAgICAgaW50IGV4cGVjdGVkU3RlcHM7ICAgICAKLSAgICAgc2hvcnQgbmFjaE1pbmltaWVydW5nOyAKLSAgICAgCi0gICAgICB2aXJ0dWFsIHZvaWQgekluaXRpYWxpemUoKTsKLSAgICAgCi0KLSAgIHB1YmxpYzoKLSAgICAgIE1TQk9wdGltaXphdGlvbihQcm9ibGVtICZzLGludCB2ZXJmLGludCBhbnosQXJyYXk8ZG91YmxlPiAmcG9zLAotCQkJCSBBcnJheTxkb3VibGU+ICZwb3IpOwotICAgICAKLQotICAgICB2aXJ0dWFsIH5NU0JPcHRpbWl6YXRpb24oKXt9Ci0KLSAgICAgIHZpcnR1YWwgZG91YmxlIG1pbmltaXplKGludCBzdGVwcz0tMSk7Ci0gICAgIAotCi0gICAgICBzdGF0aWMgdm9pZCBvcHRpbWl6ZVZhbHVlcyhQcm9ibGVtICZwLGludCB2ZXJmYWhyZW4pOwotICAgICAKLQotICAgICAgUHJvYmxlbSYgYmVzdFByb2JsZW0oKTsKLSAgICAgCi0KLX07Ci0jZW5kaWYKLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9NWU9wdGltaXphdGlvbi5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9NWU9wdGltaXphdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDlkMzEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvTVlPcHRpbWl6YXRpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLQotI2luY2x1ZGUgIk1ZT3B0aW1pemF0aW9uLmgiCi0KLU1ZT3B0aW1pemF0aW9uOjpNWU9wdGltaXphdGlvbihQcm9ibGVtICZwLGludCBtKSAKLTogSXRlck9wdGltaXphdGlvbihwLG0pLGFjY2VwdEZsYWdzTnVtYmVyKDApLGFjY2VwdGlvbnMoMCksdG90YWwoMCkKLXsKLX0KLU1ZT3B0aW1pemF0aW9uOjpNWU9wdGltaXphdGlvbihNWU9wdGltaXphdGlvbiAmbykKLTogSXRlck9wdGltaXphdGlvbihvKSxhY2NlcHRGbGFnc051bWJlcigwKSxhY2NlcHRpb25zKDApLHRvdGFsKDApCi17Ci19Ci1zaG9ydCBNWU9wdGltaXphdGlvbjo6YWNjZXB0KGRvdWJsZSBkZWx0YSkKLQl7Ci0JaW50IGRvSXQ7Ci0JaW50IHZlcmJlc3NlcnVuZyA9IGRlbHRhPDA7Ci0gIAlpZiggZGVsdGEgPCAwICkKLSAgICAJZG9JdD0xOwotICAJZWxzZQotICAgIAl7Ci0JCWlmKHRvdGFsPj1OVU1CRVJfT0ZfQUNDRVBUSU9OUykKLQkJCXsKLQkJIAlkb3VibGUgcHJvYiA9IGFjY2VwdGlvbnMvKGZsb2F0KShOVU1CRVJfT0ZfQUNDRVBUSU9OUyk7Ci0JCQlkb3VibGUgenVmID0genVmYWxsMDEoKTsKLQkJCQotCQkJZG9JdD16dWY8cHJvYjsKLQkJCX0KLQkJZWxzZQotCQkJZG9JdD0wOwotCQl9Ci0JaWYoIHRvdGFsPj1OVU1CRVJfT0ZfQUNDRVBUSU9OUyApCi0JCXsgCi0JCWlmKCBhY2NlcHRGbGFnc1thY2NlcHRGbGFnc051bWJlcl0gKQotCQkJYWNjZXB0aW9ucy0tOwotCQl9Ci0JYWNjZXB0RmxhZ3NbYWNjZXB0RmxhZ3NOdW1iZXJdPXZlcmJlc3NlcnVuZzsKLQlpZiggdmVyYmVzc2VydW5nICkKLQkJYWNjZXB0aW9ucysrOwotCXRvdGFsKys7Ci0JYWNjZXB0RmxhZ3NOdW1iZXIrKzsKLQlpZihhY2NlcHRGbGFnc051bWJlcj49TlVNQkVSX09GX0FDQ0VQVElPTlMpCi0JCWFjY2VwdEZsYWdzTnVtYmVyPTA7Ci0JcmV0dXJuIGRvSXQ7Ci0JfQotCQotc2hvcnQgTVlPcHRpbWl6YXRpb246OmVuZCgpIAotCXsgCi0gCXJldHVybiBlbmRGbGFnPjAgJiYgdG90YWw+TlVNQkVSX09GX0FDQ0VQVElPTlMgJiYgYWNjZXB0aW9ucz09MDsgCi0JfQotdm9pZCBNWU9wdGltaXphdGlvbjo6YWJrdWVobGVuKCkKLQl7Ci0JfQotCi0KLSAgICAgCi12b2lkIE1ZT3B0aW1pemF0aW9uOjptYWtlR3JhcGhPdXRwdXQoKQotewotICBJdGVyT3B0aW1pemF0aW9uOjptYWtlR3JhcGhPdXRwdXQoKTsKLSAgKkdyYXBoT3V0cHV0IDw8IGFjY2VwdGlvbnM7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL01ZT3B0aW1pemF0aW9uLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9NWU9wdGltaXphdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmNhNzBjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL01ZT3B0aW1pemF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0KLQotI2lmbmRlZiBNWU9QVElNSVpBVElPTgotI2RlZmluZSBNWU9QVElNSVpBVElPTgotI2luY2x1ZGUgIkl0ZXJPcHRpbWl6YXRpb24uaCIKLQotI2RlZmluZSBOVU1CRVJfT0ZfQUNDRVBUSU9OUyAxMDAKLQotY2xhc3MgTVlPcHRpbWl6YXRpb246IHB1YmxpYyBJdGVyT3B0aW1pemF0aW9uIHsKLSAgCi0gICBwcm90ZWN0ZWQ6Ci0gICAgICB2aXJ0dWFsIHNob3J0IGFjY2VwdChkb3VibGUgZGVsdGEpOyAKLSAgICAgCi0KLSAgICAgIHZpcnR1YWwgdm9pZCAgYWJrdWVobGVuKCk7Ci0gICAgIAotCi0gICAgICB2aXJ0dWFsIHNob3J0IGVuZCgpOwotICAgICAKLQotICAgcHVibGljOgotICAgICAgTVlPcHRpbWl6YXRpb24oUHJvYmxlbSAmcCxpbnQgbWF4SXRlcj0tMSk7Ci0gICAgIAotCi0gICAgICBNWU9wdGltaXphdGlvbihNWU9wdGltaXphdGlvbiAmbyk7Ci0gICAgIAotCi0JaW50IGFjY2VwdEZsYWdzW05VTUJFUl9PRl9BQ0NFUFRJT05TXSxhY2NlcHRGbGFnc051bWJlcjsKLQlpbnQgYWNjZXB0aW9ucyx0b3RhbDsKLQotCXZvaWQgbWFrZUdyYXBoT3V0cHV0KCk7Ci0JCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL01ha2VmaWxlLmFtIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NGU2MzAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0KLWJpbl9QUk9HUkFNUyA9IFwKLQlta2NscwotCi1ta2Nsc19TT1VSQ0VTID0gXAotCUFycmF5LmhcCi0JRml4ZWRBcnJheS5oIFwKLQlGbGV4QXJyYXkuaCBcCi0JR0RBT3B0aW1pemF0aW9uLmNwcCBcCi0JR0RBT3B0aW1pemF0aW9uLmggXAotCWdlbmVyYWwuY3BwIFwKLQlnZW5lcmFsLmggXAotCUhDT3B0aW1pemF0aW9uLmNwcCBcCi0JSENPcHRpbWl6YXRpb24uaCBcCi0JSXRlck9wdGltaXphdGlvbi5jcHAgXAotCUl0ZXJPcHRpbWl6YXRpb24uaCBcCi0JS2F0ZWdQcm9ibGVtLmNwcCBcCi0JS2F0ZWdQcm9ibGVtLmggXAotCUthdGVnUHJvYmxlbUtCQy5jcHAgXAotCUthdGVnUHJvYmxlbUtCQy5oIFwKLQlLYXRlZ1Byb2JsZW1UZXN0LmNwcCBcCi0JS2F0ZWdQcm9ibGVtVGVzdC5oIFwKLQlLYXRlZ1Byb2JsZW1XQkMuY3BwIFwKLQlLYXRlZ1Byb2JsZW1XQkMuaCBcCi0JTWFrZWZpbGUuYW0gXAotCU1ha2VmaWxlLmFtLmJhayBcCi0JbWtjbHMuY3BwIFwKLQlteS5oIFwKLQlteWFzc2VydC5oIFwKLQlteWxlZGEuaCBcCi0JTVlPcHRpbWl6YXRpb24uY3BwIFwKLQlNWU9wdGltaXphdGlvbi5oIFwKLQlteXN0bC5oIFwKLQlPcHRpbWl6YXRpb24uY3BwIFwKLQlPcHRpbWl6YXRpb24uaCBcCi0JUHJvYmxlbS5jcHAgXAotCVByb2JsZW0uaCBcCi0JUHJvYmxlbVRlc3QuY3BwIFwKLQlQcm9ibGVtVGVzdC5oIFwKLQlSUlRPcHRpbWl6YXRpb24uY3BwIFwKLQlSUlRPcHRpbWl6YXRpb24uaCBcCi0JU0FPcHRpbWl6YXRpb24uY3BwIFwKLQlTQU9wdGltaXphdGlvbi5oIFwKLQlTdGF0VmFyLmNwcCBcCi0JU3RhdFZhci5oIFwKLQlUQU9wdGltaXphdGlvbi5jcHAgXAotCVRBT3B0aW1pemF0aW9uLmgKLQotbWtjbHNfQ1hYRkxBR1MgPSBcCi0JLUROREVCVUcKLQotIyMgRmlsZSBjcmVhdGVkIGJ5IHRoZSBnbm9tZS1idWlsZCB0b29scwotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9NYWtlZmlsZS5pbiBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDhiMmYyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzI5ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAuMSBmcm9tIE1ha2VmaWxlLmFtLgotIyBAY29uZmlndXJlX2lucHV0QAotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1AU0VUX01BS0VACi0KLVZQQVRIID0gQHNyY2RpckAKLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1hbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCi1pbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAotaW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYwotaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCi1JTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQotdHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1iaW5fUFJPR1JBTVMgPSBta2NscyQoRVhFRVhUKQotc3ViZGlyID0gc3JjL21rY2xzCi1ESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0KLWFtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChiaW5kaXIpIgotYmluUFJPR1JBTVNfSU5TVEFMTCA9ICQoSU5TVEFMTF9QUk9HUkFNKQotUFJPR1JBTVMgPSAkKGJpbl9QUk9HUkFNUykKLWFtX21rY2xzX09CSkVDVFMgPSBta2Nscy1HREFPcHRpbWl6YXRpb24uJChPQkpFWFQpIFwKLQlta2Nscy1nZW5lcmFsLiQoT0JKRVhUKSBta2Nscy1IQ09wdGltaXphdGlvbi4kKE9CSkVYVCkgXAotCW1rY2xzLUl0ZXJPcHRpbWl6YXRpb24uJChPQkpFWFQpIG1rY2xzLUthdGVnUHJvYmxlbS4kKE9CSkVYVCkgXAotCW1rY2xzLUthdGVnUHJvYmxlbUtCQy4kKE9CSkVYVCkgXAotCW1rY2xzLUthdGVnUHJvYmxlbVRlc3QuJChPQkpFWFQpIFwKLQlta2Nscy1LYXRlZ1Byb2JsZW1XQkMuJChPQkpFWFQpIG1rY2xzLW1rY2xzLiQoT0JKRVhUKSBcCi0JbWtjbHMtTVlPcHRpbWl6YXRpb24uJChPQkpFWFQpIG1rY2xzLU9wdGltaXphdGlvbi4kKE9CSkVYVCkgXAotCW1rY2xzLVByb2JsZW0uJChPQkpFWFQpIG1rY2xzLVByb2JsZW1UZXN0LiQoT0JKRVhUKSBcCi0JbWtjbHMtUlJUT3B0aW1pemF0aW9uLiQoT0JKRVhUKSBta2Nscy1TQU9wdGltaXphdGlvbi4kKE9CSkVYVCkgXAotCW1rY2xzLVN0YXRWYXIuJChPQkpFWFQpIG1rY2xzLVRBT3B0aW1pemF0aW9uLiQoT0JKRVhUKQotbWtjbHNfT0JKRUNUUyA9ICQoYW1fbWtjbHNfT0JKRUNUUykKLW1rY2xzX0xEQUREID0gJChMREFERCkKLW1rY2xzX0xJTksgPSAkKENYWExEKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAkKEFNX0xERkxBR1MpIFwKLQkkKExERkxBR1MpIC1vICRACi1ERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKQotZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAotYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKLUNYWENPTVBJTEUgPSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKLQkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKQotQ1hYTEQgPSAkKENYWCkKLUNYWExJTksgPSAkKENYWExEKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAkKEFNX0xERkxBR1MpICQoTERGTEFHUykgXAotCS1vICRACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKLQkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1TT1VSQ0VTID0gJChta2Nsc19TT1VSQ0VTKQotRElTVF9TT1VSQ0VTID0gJChta2Nsc19TT1VSQ0VTKQotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFXSyA9IEBBV0tACi1DQyA9IEBDQ0AKLUNDREVQTU9ERSA9IEBDQ0RFUE1PREVACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQID0gQENQUEAKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotQ1hYID0gQENYWEAKLUNYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKLUNYWEZMQUdTID0gQENYWEZMQUdTQAotQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKLURFRlMgPSBAREVGU0AKLURFUERJUiA9IEBERVBESVJACi1FQ0hPX0MgPSBARUNIT19DQAotRUNIT19OID0gQEVDSE9fTkAKLUVDSE9fVCA9IEBFQ0hPX1RACi1FR1JFUCA9IEBFR1JFUEAKLUVYRUVYVCA9IEBFWEVFWFRACi1HUkVQID0gQEdSRVBACi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQk9CSlMgPSBATElCT0JKU0AKLUxJQlMgPSBATElCU0AKLUxUTElCT0JKUyA9IEBMVExJQk9CSlNACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVJBTkxJQiA9IEBSQU5MSUJACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1RSSVAgPSBAU1RSSVBACi1WRVJTSU9OID0gQFZFUlNJT05ACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0NYWCA9IEBhY19jdF9DWFhACi1hbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKLWFtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACi1hbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAotYW1fX3RhciA9IEBhbV9fdGFyQAotYW1fX3VudGFyID0gQGFtX191bnRhckAKLWJpbmRpciA9IEBiaW5kaXJACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkZGlyID0gQGJ1aWxkZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACi1kb2NkaXIgPSBAZG9jZGlyQAotZHZpZGlyID0gQGR2aWRpckAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaHRtbGRpciA9IEBodG1sZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAotbGliZGlyID0gQGxpYmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWxvY2FsZWRpciA9IEBsb2NhbGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWtkaXJfcCA9IEBta2Rpcl9wQAotb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAotcGRmZGlyID0gQHBkZmRpckAKLXByZWZpeCA9IEBwcmVmaXhACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1wc2RpciA9IEBwc2RpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACi10b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotbWtjbHNfU09VUkNFUyA9IFwKLQlBcnJheS5oXAotCUZpeGVkQXJyYXkuaCBcCi0JRmxleEFycmF5LmggXAotCUdEQU9wdGltaXphdGlvbi5jcHAgXAotCUdEQU9wdGltaXphdGlvbi5oIFwKLQlnZW5lcmFsLmNwcCBcCi0JZ2VuZXJhbC5oIFwKLQlIQ09wdGltaXphdGlvbi5jcHAgXAotCUhDT3B0aW1pemF0aW9uLmggXAotCUl0ZXJPcHRpbWl6YXRpb24uY3BwIFwKLQlJdGVyT3B0aW1pemF0aW9uLmggXAotCUthdGVnUHJvYmxlbS5jcHAgXAotCUthdGVnUHJvYmxlbS5oIFwKLQlLYXRlZ1Byb2JsZW1LQkMuY3BwIFwKLQlLYXRlZ1Byb2JsZW1LQkMuaCBcCi0JS2F0ZWdQcm9ibGVtVGVzdC5jcHAgXAotCUthdGVnUHJvYmxlbVRlc3QuaCBcCi0JS2F0ZWdQcm9ibGVtV0JDLmNwcCBcCi0JS2F0ZWdQcm9ibGVtV0JDLmggXAotCU1ha2VmaWxlLmFtIFwKLQlNYWtlZmlsZS5hbS5iYWsgXAotCW1rY2xzLmNwcCBcCi0JbXkuaCBcCi0JbXlhc3NlcnQuaCBcCi0JbXlsZWRhLmggXAotCU1ZT3B0aW1pemF0aW9uLmNwcCBcCi0JTVlPcHRpbWl6YXRpb24uaCBcCi0JbXlzdGwuaCBcCi0JT3B0aW1pemF0aW9uLmNwcCBcCi0JT3B0aW1pemF0aW9uLmggXAotCVByb2JsZW0uY3BwIFwKLQlQcm9ibGVtLmggXAotCVByb2JsZW1UZXN0LmNwcCBcCi0JUHJvYmxlbVRlc3QuaCBcCi0JUlJUT3B0aW1pemF0aW9uLmNwcCBcCi0JUlJUT3B0aW1pemF0aW9uLmggXAotCVNBT3B0aW1pemF0aW9uLmNwcCBcCi0JU0FPcHRpbWl6YXRpb24uaCBcCi0JU3RhdFZhci5jcHAgXAotCVN0YXRWYXIuaCBcCi0JVEFPcHRpbWl6YXRpb24uY3BwIFwKLQlUQU9wdGltaXphdGlvbi5oCi0KLW1rY2xzX0NYWEZMQUdTID0gXAotCS1ETkRFQlVHCi0KLWFsbDogYWxsLWFtCi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmNwcCAubyAub2JqCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAotCQkmJiBleGl0IDA7IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICBzcmMvbWtjbHMvTWFrZWZpbGUnOyBcCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWdudSAgc3JjL21rY2xzL01ha2VmaWxlCi0uUFJFQ0lPVVM6IE1ha2VmaWxlCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQGNhc2UgJyQ/JyBpbiBcCi0JICAqY29uZmlnLnN0YXR1cyopIFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAotCSAgKikgXAotCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCi0JZXNhYzsKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi1pbnN0YWxsLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKGJpbmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGJpbmRpcikiCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgcDE9YGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKLQkgIGlmIHRlc3QgLWYgJCRwIFwKLQkgIDsgdGhlbiBcCi0JICAgIGY9YGVjaG8gIiQkcDEiIHwgc2VkICdzLF4uKi8sLDskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKGJpblBST0dSQU1TX0lOU1RBTEwpICckJHAnICckKERFU1RESVIpJChiaW5kaXIpLyQkZiciOyBcCi0JICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKGJpblBST0dSQU1TX0lOU1RBTEwpICIkJHAiICIkKERFU1RESVIpJChiaW5kaXIpLyQkZiIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtYmluUFJPR1JBTVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBmPWBlY2hvICIkJHAiIHwgc2VkICdzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlY2hvICIgcm0gLWYgJyQoREVTVERJUikkKGJpbmRpcikvJCRmJyI7IFwKLQkgIHJtIC1mICIkKERFU1RESVIpJChiaW5kaXIpLyQkZiI7IFwKLQlkb25lCi0KLWNsZWFuLWJpblBST0dSQU1TOgotCS10ZXN0IC16ICIkKGJpbl9QUk9HUkFNUykiIHx8IHJtIC1mICQoYmluX1BST0dSQU1TKQotbWtjbHMkKEVYRUVYVCk6ICQobWtjbHNfT0JKRUNUUykgJChta2Nsc19ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBta2NscyQoRVhFRVhUKQotCSQobWtjbHNfTElOSykgJChta2Nsc19PQkpFQ1RTKSAkKG1rY2xzX0xEQUREKSAkKExJQlMpCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ta2Nscy1HREFPcHRpbWl6YXRpb24uUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21rY2xzLUhDT3B0aW1pemF0aW9uLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ta2Nscy1JdGVyT3B0aW1pemF0aW9uLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW0uUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21rY2xzLUthdGVnUHJvYmxlbUtCQy5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtVGVzdC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtV0JDLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ta2Nscy1NWU9wdGltaXphdGlvbi5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWtjbHMtT3B0aW1pemF0aW9uLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ta2Nscy1Qcm9ibGVtLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ta2Nscy1Qcm9ibGVtVGVzdC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWtjbHMtUlJUT3B0aW1pemF0aW9uLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ta2Nscy1TQU9wdGltaXphdGlvbi5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWtjbHMtU3RhdFZhci5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWtjbHMtVEFPcHRpbWl6YXRpb24uUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21rY2xzLWdlbmVyYWwuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21rY2xzLW1rY2xzLlBvQGFtX19xdW90ZUAKLQotLmNwcC5vOgotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWENPTVBJTEUpIC1jIC1vICRAICQ8Ci0KLS5jcHAub2JqOgotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYQ09NUElMRSkgLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi1ta2Nscy1HREFPcHRpbWl6YXRpb24ubzogR0RBT3B0aW1pemF0aW9uLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIG1rY2xzLUdEQU9wdGltaXphdGlvbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1HREFPcHRpbWl6YXRpb24uVHBvIC1jIC1vIG1rY2xzLUdEQU9wdGltaXphdGlvbi5vIGB0ZXN0IC1mICdHREFPcHRpbWl6YXRpb24uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BHREFPcHRpbWl6YXRpb24uY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL21rY2xzLUdEQU9wdGltaXphdGlvbi5UcG8gJChERVBESVIpL21rY2xzLUdEQU9wdGltaXphdGlvbi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J0dEQU9wdGltaXphdGlvbi5jcHAnIG9iamVjdD0nbWtjbHMtR0RBT3B0aW1pemF0aW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtR0RBT3B0aW1pemF0aW9uLm8gYHRlc3QgLWYgJ0dEQU9wdGltaXphdGlvbi5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYEdEQU9wdGltaXphdGlvbi5jcHAKLQotbWtjbHMtR0RBT3B0aW1pemF0aW9uLm9iajogR0RBT3B0aW1pemF0aW9uLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIG1rY2xzLUdEQU9wdGltaXphdGlvbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL21rY2xzLUdEQU9wdGltaXphdGlvbi5UcG8gLWMgLW8gbWtjbHMtR0RBT3B0aW1pemF0aW9uLm9iaiBgaWYgdGVzdCAtZiAnR0RBT3B0aW1pemF0aW9uLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdHREFPcHRpbWl6YXRpb24uY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9HREFPcHRpbWl6YXRpb24uY3BwJzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL21rY2xzLUdEQU9wdGltaXphdGlvbi5UcG8gJChERVBESVIpL21rY2xzLUdEQU9wdGltaXphdGlvbi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J0dEQU9wdGltaXphdGlvbi5jcHAnIG9iamVjdD0nbWtjbHMtR0RBT3B0aW1pemF0aW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBta2Nscy1HREFPcHRpbWl6YXRpb24ub2JqIGBpZiB0ZXN0IC1mICdHREFPcHRpbWl6YXRpb24uY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ0dEQU9wdGltaXphdGlvbi5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL0dEQU9wdGltaXphdGlvbi5jcHAnOyBmaWAKLQotbWtjbHMtZ2VuZXJhbC5vOiBnZW5lcmFsLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIG1rY2xzLWdlbmVyYWwubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbWtjbHMtZ2VuZXJhbC5UcG8gLWMgLW8gbWtjbHMtZ2VuZXJhbC5vIGB0ZXN0IC1mICdnZW5lcmFsLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgZ2VuZXJhbC5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbWtjbHMtZ2VuZXJhbC5UcG8gJChERVBESVIpL21rY2xzLWdlbmVyYWwuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnZW5lcmFsLmNwcCcgb2JqZWN0PSdta2Nscy1nZW5lcmFsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtZ2VuZXJhbC5vIGB0ZXN0IC1mICdnZW5lcmFsLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgZ2VuZXJhbC5jcHAKLQotbWtjbHMtZ2VuZXJhbC5vYmo6IGdlbmVyYWwuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbWtjbHMtZ2VuZXJhbC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL21rY2xzLWdlbmVyYWwuVHBvIC1jIC1vIG1rY2xzLWdlbmVyYWwub2JqIGBpZiB0ZXN0IC1mICdnZW5lcmFsLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdnZW5lcmFsLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ2VuZXJhbC5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbWtjbHMtZ2VuZXJhbC5UcG8gJChERVBESVIpL21rY2xzLWdlbmVyYWwuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnZW5lcmFsLmNwcCcgb2JqZWN0PSdta2Nscy1nZW5lcmFsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBta2Nscy1nZW5lcmFsLm9iaiBgaWYgdGVzdCAtZiAnZ2VuZXJhbC5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ2VuZXJhbC5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dlbmVyYWwuY3BwJzsgZmlgCi0KLW1rY2xzLUhDT3B0aW1pemF0aW9uLm86IEhDT3B0aW1pemF0aW9uLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIG1rY2xzLUhDT3B0aW1pemF0aW9uLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL21rY2xzLUhDT3B0aW1pemF0aW9uLlRwbyAtYyAtbyBta2Nscy1IQ09wdGltaXphdGlvbi5vIGB0ZXN0IC1mICdIQ09wdGltaXphdGlvbi5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYEhDT3B0aW1pemF0aW9uLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1IQ09wdGltaXphdGlvbi5UcG8gJChERVBESVIpL21rY2xzLUhDT3B0aW1pemF0aW9uLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nSENPcHRpbWl6YXRpb24uY3BwJyBvYmplY3Q9J21rY2xzLUhDT3B0aW1pemF0aW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtSENPcHRpbWl6YXRpb24ubyBgdGVzdCAtZiAnSENPcHRpbWl6YXRpb24uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BIQ09wdGltaXphdGlvbi5jcHAKLQotbWtjbHMtSENPcHRpbWl6YXRpb24ub2JqOiBIQ09wdGltaXphdGlvbi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1IQ09wdGltaXphdGlvbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL21rY2xzLUhDT3B0aW1pemF0aW9uLlRwbyAtYyAtbyBta2Nscy1IQ09wdGltaXphdGlvbi5vYmogYGlmIHRlc3QgLWYgJ0hDT3B0aW1pemF0aW9uLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdIQ09wdGltaXphdGlvbi5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL0hDT3B0aW1pemF0aW9uLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1IQ09wdGltaXphdGlvbi5UcG8gJChERVBESVIpL21rY2xzLUhDT3B0aW1pemF0aW9uLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nSENPcHRpbWl6YXRpb24uY3BwJyBvYmplY3Q9J21rY2xzLUhDT3B0aW1pemF0aW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBta2Nscy1IQ09wdGltaXphdGlvbi5vYmogYGlmIHRlc3QgLWYgJ0hDT3B0aW1pemF0aW9uLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdIQ09wdGltaXphdGlvbi5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL0hDT3B0aW1pemF0aW9uLmNwcCc7IGZpYAotCi1ta2Nscy1JdGVyT3B0aW1pemF0aW9uLm86IEl0ZXJPcHRpbWl6YXRpb24uY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbWtjbHMtSXRlck9wdGltaXphdGlvbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1JdGVyT3B0aW1pemF0aW9uLlRwbyAtYyAtbyBta2Nscy1JdGVyT3B0aW1pemF0aW9uLm8gYHRlc3QgLWYgJ0l0ZXJPcHRpbWl6YXRpb24uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BJdGVyT3B0aW1pemF0aW9uLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1JdGVyT3B0aW1pemF0aW9uLlRwbyAkKERFUERJUikvbWtjbHMtSXRlck9wdGltaXphdGlvbi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J0l0ZXJPcHRpbWl6YXRpb24uY3BwJyBvYmplY3Q9J21rY2xzLUl0ZXJPcHRpbWl6YXRpb24ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBta2Nscy1JdGVyT3B0aW1pemF0aW9uLm8gYHRlc3QgLWYgJ0l0ZXJPcHRpbWl6YXRpb24uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BJdGVyT3B0aW1pemF0aW9uLmNwcAotCi1ta2Nscy1JdGVyT3B0aW1pemF0aW9uLm9iajogSXRlck9wdGltaXphdGlvbi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1JdGVyT3B0aW1pemF0aW9uLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbWtjbHMtSXRlck9wdGltaXphdGlvbi5UcG8gLWMgLW8gbWtjbHMtSXRlck9wdGltaXphdGlvbi5vYmogYGlmIHRlc3QgLWYgJ0l0ZXJPcHRpbWl6YXRpb24uY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ0l0ZXJPcHRpbWl6YXRpb24uY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9JdGVyT3B0aW1pemF0aW9uLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1JdGVyT3B0aW1pemF0aW9uLlRwbyAkKERFUERJUikvbWtjbHMtSXRlck9wdGltaXphdGlvbi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J0l0ZXJPcHRpbWl6YXRpb24uY3BwJyBvYmplY3Q9J21rY2xzLUl0ZXJPcHRpbWl6YXRpb24ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLUl0ZXJPcHRpbWl6YXRpb24ub2JqIGBpZiB0ZXN0IC1mICdJdGVyT3B0aW1pemF0aW9uLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdJdGVyT3B0aW1pemF0aW9uLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvSXRlck9wdGltaXphdGlvbi5jcHAnOyBmaWAKLQotbWtjbHMtS2F0ZWdQcm9ibGVtLm86IEthdGVnUHJvYmxlbS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1LYXRlZ1Byb2JsZW0ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtLlRwbyAtYyAtbyBta2Nscy1LYXRlZ1Byb2JsZW0ubyBgdGVzdCAtZiAnS2F0ZWdQcm9ibGVtLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgS2F0ZWdQcm9ibGVtLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW0uVHBvICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW0uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdLYXRlZ1Byb2JsZW0uY3BwJyBvYmplY3Q9J21rY2xzLUthdGVnUHJvYmxlbS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLUthdGVnUHJvYmxlbS5vIGB0ZXN0IC1mICdLYXRlZ1Byb2JsZW0uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BLYXRlZ1Byb2JsZW0uY3BwCi0KLW1rY2xzLUthdGVnUHJvYmxlbS5vYmo6IEthdGVnUHJvYmxlbS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1LYXRlZ1Byb2JsZW0ub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW0uVHBvIC1jIC1vIG1rY2xzLUthdGVnUHJvYmxlbS5vYmogYGlmIHRlc3QgLWYgJ0thdGVnUHJvYmxlbS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnS2F0ZWdQcm9ibGVtLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvS2F0ZWdQcm9ibGVtLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW0uVHBvICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW0uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdLYXRlZ1Byb2JsZW0uY3BwJyBvYmplY3Q9J21rY2xzLUthdGVnUHJvYmxlbS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtS2F0ZWdQcm9ibGVtLm9iaiBgaWYgdGVzdCAtZiAnS2F0ZWdQcm9ibGVtLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdLYXRlZ1Byb2JsZW0uY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9LYXRlZ1Byb2JsZW0uY3BwJzsgZmlgCi0KLW1rY2xzLUthdGVnUHJvYmxlbUtCQy5vOiBLYXRlZ1Byb2JsZW1LQkMuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbWtjbHMtS2F0ZWdQcm9ibGVtS0JDLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL21rY2xzLUthdGVnUHJvYmxlbUtCQy5UcG8gLWMgLW8gbWtjbHMtS2F0ZWdQcm9ibGVtS0JDLm8gYHRlc3QgLWYgJ0thdGVnUHJvYmxlbUtCQy5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYEthdGVnUHJvYmxlbUtCQy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtS0JDLlRwbyAkKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtS0JDLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nS2F0ZWdQcm9ibGVtS0JDLmNwcCcgb2JqZWN0PSdta2Nscy1LYXRlZ1Byb2JsZW1LQkMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBta2Nscy1LYXRlZ1Byb2JsZW1LQkMubyBgdGVzdCAtZiAnS2F0ZWdQcm9ibGVtS0JDLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgS2F0ZWdQcm9ibGVtS0JDLmNwcAotCi1ta2Nscy1LYXRlZ1Byb2JsZW1LQkMub2JqOiBLYXRlZ1Byb2JsZW1LQkMuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbWtjbHMtS2F0ZWdQcm9ibGVtS0JDLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtS0JDLlRwbyAtYyAtbyBta2Nscy1LYXRlZ1Byb2JsZW1LQkMub2JqIGBpZiB0ZXN0IC1mICdLYXRlZ1Byb2JsZW1LQkMuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ0thdGVnUHJvYmxlbUtCQy5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL0thdGVnUHJvYmxlbUtCQy5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtS0JDLlRwbyAkKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtS0JDLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nS2F0ZWdQcm9ibGVtS0JDLmNwcCcgb2JqZWN0PSdta2Nscy1LYXRlZ1Byb2JsZW1LQkMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLUthdGVnUHJvYmxlbUtCQy5vYmogYGlmIHRlc3QgLWYgJ0thdGVnUHJvYmxlbUtCQy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnS2F0ZWdQcm9ibGVtS0JDLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvS2F0ZWdQcm9ibGVtS0JDLmNwcCc7IGZpYAotCi1ta2Nscy1LYXRlZ1Byb2JsZW1UZXN0Lm86IEthdGVnUHJvYmxlbVRlc3QuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbWtjbHMtS2F0ZWdQcm9ibGVtVGVzdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW1UZXN0LlRwbyAtYyAtbyBta2Nscy1LYXRlZ1Byb2JsZW1UZXN0Lm8gYHRlc3QgLWYgJ0thdGVnUHJvYmxlbVRlc3QuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BLYXRlZ1Byb2JsZW1UZXN0LmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW1UZXN0LlRwbyAkKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtVGVzdC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J0thdGVnUHJvYmxlbVRlc3QuY3BwJyBvYmplY3Q9J21rY2xzLUthdGVnUHJvYmxlbVRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBta2Nscy1LYXRlZ1Byb2JsZW1UZXN0Lm8gYHRlc3QgLWYgJ0thdGVnUHJvYmxlbVRlc3QuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BLYXRlZ1Byb2JsZW1UZXN0LmNwcAotCi1ta2Nscy1LYXRlZ1Byb2JsZW1UZXN0Lm9iajogS2F0ZWdQcm9ibGVtVGVzdC5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1LYXRlZ1Byb2JsZW1UZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtVGVzdC5UcG8gLWMgLW8gbWtjbHMtS2F0ZWdQcm9ibGVtVGVzdC5vYmogYGlmIHRlc3QgLWYgJ0thdGVnUHJvYmxlbVRlc3QuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ0thdGVnUHJvYmxlbVRlc3QuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9LYXRlZ1Byb2JsZW1UZXN0LmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW1UZXN0LlRwbyAkKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtVGVzdC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J0thdGVnUHJvYmxlbVRlc3QuY3BwJyBvYmplY3Q9J21rY2xzLUthdGVnUHJvYmxlbVRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLUthdGVnUHJvYmxlbVRlc3Qub2JqIGBpZiB0ZXN0IC1mICdLYXRlZ1Byb2JsZW1UZXN0LmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdLYXRlZ1Byb2JsZW1UZXN0LmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvS2F0ZWdQcm9ibGVtVGVzdC5jcHAnOyBmaWAKLQotbWtjbHMtS2F0ZWdQcm9ibGVtV0JDLm86IEthdGVnUHJvYmxlbVdCQy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1LYXRlZ1Byb2JsZW1XQkMubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbWtjbHMtS2F0ZWdQcm9ibGVtV0JDLlRwbyAtYyAtbyBta2Nscy1LYXRlZ1Byb2JsZW1XQkMubyBgdGVzdCAtZiAnS2F0ZWdQcm9ibGVtV0JDLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgS2F0ZWdQcm9ibGVtV0JDLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW1XQkMuVHBvICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW1XQkMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdLYXRlZ1Byb2JsZW1XQkMuY3BwJyBvYmplY3Q9J21rY2xzLUthdGVnUHJvYmxlbVdCQy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLUthdGVnUHJvYmxlbVdCQy5vIGB0ZXN0IC1mICdLYXRlZ1Byb2JsZW1XQkMuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BLYXRlZ1Byb2JsZW1XQkMuY3BwCi0KLW1rY2xzLUthdGVnUHJvYmxlbVdCQy5vYmo6IEthdGVnUHJvYmxlbVdCQy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1LYXRlZ1Byb2JsZW1XQkMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW1XQkMuVHBvIC1jIC1vIG1rY2xzLUthdGVnUHJvYmxlbVdCQy5vYmogYGlmIHRlc3QgLWYgJ0thdGVnUHJvYmxlbVdCQy5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnS2F0ZWdQcm9ibGVtV0JDLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvS2F0ZWdQcm9ibGVtV0JDLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW1XQkMuVHBvICQoREVQRElSKS9ta2Nscy1LYXRlZ1Byb2JsZW1XQkMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdLYXRlZ1Byb2JsZW1XQkMuY3BwJyBvYmplY3Q9J21rY2xzLUthdGVnUHJvYmxlbVdCQy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtS2F0ZWdQcm9ibGVtV0JDLm9iaiBgaWYgdGVzdCAtZiAnS2F0ZWdQcm9ibGVtV0JDLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdLYXRlZ1Byb2JsZW1XQkMuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9LYXRlZ1Byb2JsZW1XQkMuY3BwJzsgZmlgCi0KLW1rY2xzLW1rY2xzLm86IG1rY2xzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIG1rY2xzLW1rY2xzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL21rY2xzLW1rY2xzLlRwbyAtYyAtbyBta2Nscy1ta2Nscy5vIGB0ZXN0IC1mICdta2Nscy5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1rY2xzLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1ta2Nscy5UcG8gJChERVBESVIpL21rY2xzLW1rY2xzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nbWtjbHMuY3BwJyBvYmplY3Q9J21rY2xzLW1rY2xzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtbWtjbHMubyBgdGVzdCAtZiAnbWtjbHMuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bta2Nscy5jcHAKLQotbWtjbHMtbWtjbHMub2JqOiBta2Nscy5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1ta2Nscy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL21rY2xzLW1rY2xzLlRwbyAtYyAtbyBta2Nscy1ta2Nscy5vYmogYGlmIHRlc3QgLWYgJ21rY2xzLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdta2Nscy5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21rY2xzLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1ta2Nscy5UcG8gJChERVBESVIpL21rY2xzLW1rY2xzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nbWtjbHMuY3BwJyBvYmplY3Q9J21rY2xzLW1rY2xzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBta2Nscy1ta2Nscy5vYmogYGlmIHRlc3QgLWYgJ21rY2xzLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdta2Nscy5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21rY2xzLmNwcCc7IGZpYAotCi1ta2Nscy1NWU9wdGltaXphdGlvbi5vOiBNWU9wdGltaXphdGlvbi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1NWU9wdGltaXphdGlvbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1NWU9wdGltaXphdGlvbi5UcG8gLWMgLW8gbWtjbHMtTVlPcHRpbWl6YXRpb24ubyBgdGVzdCAtZiAnTVlPcHRpbWl6YXRpb24uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BNWU9wdGltaXphdGlvbi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbWtjbHMtTVlPcHRpbWl6YXRpb24uVHBvICQoREVQRElSKS9ta2Nscy1NWU9wdGltaXphdGlvbi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J01ZT3B0aW1pemF0aW9uLmNwcCcgb2JqZWN0PSdta2Nscy1NWU9wdGltaXphdGlvbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLU1ZT3B0aW1pemF0aW9uLm8gYHRlc3QgLWYgJ01ZT3B0aW1pemF0aW9uLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgTVlPcHRpbWl6YXRpb24uY3BwCi0KLW1rY2xzLU1ZT3B0aW1pemF0aW9uLm9iajogTVlPcHRpbWl6YXRpb24uY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbWtjbHMtTVlPcHRpbWl6YXRpb24ub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1NWU9wdGltaXphdGlvbi5UcG8gLWMgLW8gbWtjbHMtTVlPcHRpbWl6YXRpb24ub2JqIGBpZiB0ZXN0IC1mICdNWU9wdGltaXphdGlvbi5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnTVlPcHRpbWl6YXRpb24uY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9NWU9wdGltaXphdGlvbi5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbWtjbHMtTVlPcHRpbWl6YXRpb24uVHBvICQoREVQRElSKS9ta2Nscy1NWU9wdGltaXphdGlvbi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J01ZT3B0aW1pemF0aW9uLmNwcCcgb2JqZWN0PSdta2Nscy1NWU9wdGltaXphdGlvbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtTVlPcHRpbWl6YXRpb24ub2JqIGBpZiB0ZXN0IC1mICdNWU9wdGltaXphdGlvbi5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnTVlPcHRpbWl6YXRpb24uY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9NWU9wdGltaXphdGlvbi5jcHAnOyBmaWAKLQotbWtjbHMtT3B0aW1pemF0aW9uLm86IE9wdGltaXphdGlvbi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1PcHRpbWl6YXRpb24ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbWtjbHMtT3B0aW1pemF0aW9uLlRwbyAtYyAtbyBta2Nscy1PcHRpbWl6YXRpb24ubyBgdGVzdCAtZiAnT3B0aW1pemF0aW9uLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgT3B0aW1pemF0aW9uLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1PcHRpbWl6YXRpb24uVHBvICQoREVQRElSKS9ta2Nscy1PcHRpbWl6YXRpb24uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdPcHRpbWl6YXRpb24uY3BwJyBvYmplY3Q9J21rY2xzLU9wdGltaXphdGlvbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLU9wdGltaXphdGlvbi5vIGB0ZXN0IC1mICdPcHRpbWl6YXRpb24uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BPcHRpbWl6YXRpb24uY3BwCi0KLW1rY2xzLU9wdGltaXphdGlvbi5vYmo6IE9wdGltaXphdGlvbi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1PcHRpbWl6YXRpb24ub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1PcHRpbWl6YXRpb24uVHBvIC1jIC1vIG1rY2xzLU9wdGltaXphdGlvbi5vYmogYGlmIHRlc3QgLWYgJ09wdGltaXphdGlvbi5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnT3B0aW1pemF0aW9uLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvT3B0aW1pemF0aW9uLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1PcHRpbWl6YXRpb24uVHBvICQoREVQRElSKS9ta2Nscy1PcHRpbWl6YXRpb24uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdPcHRpbWl6YXRpb24uY3BwJyBvYmplY3Q9J21rY2xzLU9wdGltaXphdGlvbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtT3B0aW1pemF0aW9uLm9iaiBgaWYgdGVzdCAtZiAnT3B0aW1pemF0aW9uLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdPcHRpbWl6YXRpb24uY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9PcHRpbWl6YXRpb24uY3BwJzsgZmlgCi0KLW1rY2xzLVByb2JsZW0ubzogUHJvYmxlbS5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1Qcm9ibGVtLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL21rY2xzLVByb2JsZW0uVHBvIC1jIC1vIG1rY2xzLVByb2JsZW0ubyBgdGVzdCAtZiAnUHJvYmxlbS5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYFByb2JsZW0uY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL21rY2xzLVByb2JsZW0uVHBvICQoREVQRElSKS9ta2Nscy1Qcm9ibGVtLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nUHJvYmxlbS5jcHAnIG9iamVjdD0nbWtjbHMtUHJvYmxlbS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLVByb2JsZW0ubyBgdGVzdCAtZiAnUHJvYmxlbS5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYFByb2JsZW0uY3BwCi0KLW1rY2xzLVByb2JsZW0ub2JqOiBQcm9ibGVtLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIG1rY2xzLVByb2JsZW0ub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1Qcm9ibGVtLlRwbyAtYyAtbyBta2Nscy1Qcm9ibGVtLm9iaiBgaWYgdGVzdCAtZiAnUHJvYmxlbS5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnUHJvYmxlbS5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL1Byb2JsZW0uY3BwJzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL21rY2xzLVByb2JsZW0uVHBvICQoREVQRElSKS9ta2Nscy1Qcm9ibGVtLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nUHJvYmxlbS5jcHAnIG9iamVjdD0nbWtjbHMtUHJvYmxlbS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtUHJvYmxlbS5vYmogYGlmIHRlc3QgLWYgJ1Byb2JsZW0uY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ1Byb2JsZW0uY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9Qcm9ibGVtLmNwcCc7IGZpYAotCi1ta2Nscy1Qcm9ibGVtVGVzdC5vOiBQcm9ibGVtVGVzdC5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1Qcm9ibGVtVGVzdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1Qcm9ibGVtVGVzdC5UcG8gLWMgLW8gbWtjbHMtUHJvYmxlbVRlc3QubyBgdGVzdCAtZiAnUHJvYmxlbVRlc3QuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BQcm9ibGVtVGVzdC5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbWtjbHMtUHJvYmxlbVRlc3QuVHBvICQoREVQRElSKS9ta2Nscy1Qcm9ibGVtVGVzdC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J1Byb2JsZW1UZXN0LmNwcCcgb2JqZWN0PSdta2Nscy1Qcm9ibGVtVGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLVByb2JsZW1UZXN0Lm8gYHRlc3QgLWYgJ1Byb2JsZW1UZXN0LmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgUHJvYmxlbVRlc3QuY3BwCi0KLW1rY2xzLVByb2JsZW1UZXN0Lm9iajogUHJvYmxlbVRlc3QuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbWtjbHMtUHJvYmxlbVRlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1Qcm9ibGVtVGVzdC5UcG8gLWMgLW8gbWtjbHMtUHJvYmxlbVRlc3Qub2JqIGBpZiB0ZXN0IC1mICdQcm9ibGVtVGVzdC5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnUHJvYmxlbVRlc3QuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9Qcm9ibGVtVGVzdC5jcHAnOyBmaWAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAltdiAtZiAkKERFUERJUikvbWtjbHMtUHJvYmxlbVRlc3QuVHBvICQoREVQRElSKS9ta2Nscy1Qcm9ibGVtVGVzdC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J1Byb2JsZW1UZXN0LmNwcCcgb2JqZWN0PSdta2Nscy1Qcm9ibGVtVGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtUHJvYmxlbVRlc3Qub2JqIGBpZiB0ZXN0IC1mICdQcm9ibGVtVGVzdC5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnUHJvYmxlbVRlc3QuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9Qcm9ibGVtVGVzdC5jcHAnOyBmaWAKLQotbWtjbHMtUlJUT3B0aW1pemF0aW9uLm86IFJSVE9wdGltaXphdGlvbi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1SUlRPcHRpbWl6YXRpb24ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbWtjbHMtUlJUT3B0aW1pemF0aW9uLlRwbyAtYyAtbyBta2Nscy1SUlRPcHRpbWl6YXRpb24ubyBgdGVzdCAtZiAnUlJUT3B0aW1pemF0aW9uLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgUlJUT3B0aW1pemF0aW9uLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1SUlRPcHRpbWl6YXRpb24uVHBvICQoREVQRElSKS9ta2Nscy1SUlRPcHRpbWl6YXRpb24uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdSUlRPcHRpbWl6YXRpb24uY3BwJyBvYmplY3Q9J21rY2xzLVJSVE9wdGltaXphdGlvbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLVJSVE9wdGltaXphdGlvbi5vIGB0ZXN0IC1mICdSUlRPcHRpbWl6YXRpb24uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BSUlRPcHRpbWl6YXRpb24uY3BwCi0KLW1rY2xzLVJSVE9wdGltaXphdGlvbi5vYmo6IFJSVE9wdGltaXphdGlvbi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1SUlRPcHRpbWl6YXRpb24ub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1SUlRPcHRpbWl6YXRpb24uVHBvIC1jIC1vIG1rY2xzLVJSVE9wdGltaXphdGlvbi5vYmogYGlmIHRlc3QgLWYgJ1JSVE9wdGltaXphdGlvbi5jcHAnOyB0aGVuICQoQ1lHUEFUSF9XKSAnUlJUT3B0aW1pemF0aW9uLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvUlJUT3B0aW1pemF0aW9uLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1SUlRPcHRpbWl6YXRpb24uVHBvICQoREVQRElSKS9ta2Nscy1SUlRPcHRpbWl6YXRpb24uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdSUlRPcHRpbWl6YXRpb24uY3BwJyBvYmplY3Q9J21rY2xzLVJSVE9wdGltaXphdGlvbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtUlJUT3B0aW1pemF0aW9uLm9iaiBgaWYgdGVzdCAtZiAnUlJUT3B0aW1pemF0aW9uLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdSUlRPcHRpbWl6YXRpb24uY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9SUlRPcHRpbWl6YXRpb24uY3BwJzsgZmlgCi0KLW1rY2xzLVNBT3B0aW1pemF0aW9uLm86IFNBT3B0aW1pemF0aW9uLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIG1rY2xzLVNBT3B0aW1pemF0aW9uLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL21rY2xzLVNBT3B0aW1pemF0aW9uLlRwbyAtYyAtbyBta2Nscy1TQU9wdGltaXphdGlvbi5vIGB0ZXN0IC1mICdTQU9wdGltaXphdGlvbi5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYFNBT3B0aW1pemF0aW9uLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1TQU9wdGltaXphdGlvbi5UcG8gJChERVBESVIpL21rY2xzLVNBT3B0aW1pemF0aW9uLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nU0FPcHRpbWl6YXRpb24uY3BwJyBvYmplY3Q9J21rY2xzLVNBT3B0aW1pemF0aW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWtjbHMtU0FPcHRpbWl6YXRpb24ubyBgdGVzdCAtZiAnU0FPcHRpbWl6YXRpb24uY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BTQU9wdGltaXphdGlvbi5jcHAKLQotbWtjbHMtU0FPcHRpbWl6YXRpb24ub2JqOiBTQU9wdGltaXphdGlvbi5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1TQU9wdGltaXphdGlvbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL21rY2xzLVNBT3B0aW1pemF0aW9uLlRwbyAtYyAtbyBta2Nscy1TQU9wdGltaXphdGlvbi5vYmogYGlmIHRlc3QgLWYgJ1NBT3B0aW1pemF0aW9uLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdTQU9wdGltaXphdGlvbi5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL1NBT3B0aW1pemF0aW9uLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1TQU9wdGltaXphdGlvbi5UcG8gJChERVBESVIpL21rY2xzLVNBT3B0aW1pemF0aW9uLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nU0FPcHRpbWl6YXRpb24uY3BwJyBvYmplY3Q9J21rY2xzLVNBT3B0aW1pemF0aW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBta2Nscy1TQU9wdGltaXphdGlvbi5vYmogYGlmIHRlc3QgLWYgJ1NBT3B0aW1pemF0aW9uLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdTQU9wdGltaXphdGlvbi5jcHAnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL1NBT3B0aW1pemF0aW9uLmNwcCc7IGZpYAotCi1ta2Nscy1TdGF0VmFyLm86IFN0YXRWYXIuY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbWtjbHMtU3RhdFZhci5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ta2Nscy1TdGF0VmFyLlRwbyAtYyAtbyBta2Nscy1TdGF0VmFyLm8gYHRlc3QgLWYgJ1N0YXRWYXIuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BTdGF0VmFyLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1TdGF0VmFyLlRwbyAkKERFUERJUikvbWtjbHMtU3RhdFZhci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J1N0YXRWYXIuY3BwJyBvYmplY3Q9J21rY2xzLVN0YXRWYXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBta2Nscy1TdGF0VmFyLm8gYHRlc3QgLWYgJ1N0YXRWYXIuY3BwJyB8fCBlY2hvICckKHNyY2RpcikvJ2BTdGF0VmFyLmNwcAotCi1ta2Nscy1TdGF0VmFyLm9iajogU3RhdFZhci5jcHAKLUBhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBta2Nscy1TdGF0VmFyLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbWtjbHMtU3RhdFZhci5UcG8gLWMgLW8gbWtjbHMtU3RhdFZhci5vYmogYGlmIHRlc3QgLWYgJ1N0YXRWYXIuY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ1N0YXRWYXIuY3BwJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9TdGF0VmFyLmNwcCc7IGZpYAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACW12IC1mICQoREVQRElSKS9ta2Nscy1TdGF0VmFyLlRwbyAkKERFUERJUikvbWtjbHMtU3RhdFZhci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J1N0YXRWYXIuY3BwJyBvYmplY3Q9J21rY2xzLVN0YXRWYXIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLVN0YXRWYXIub2JqIGBpZiB0ZXN0IC1mICdTdGF0VmFyLmNwcCc7IHRoZW4gJChDWUdQQVRIX1cpICdTdGF0VmFyLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvU3RhdFZhci5jcHAnOyBmaWAKLQotbWtjbHMtVEFPcHRpbWl6YXRpb24ubzogVEFPcHRpbWl6YXRpb24uY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbWtjbHMtVEFPcHRpbWl6YXRpb24ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbWtjbHMtVEFPcHRpbWl6YXRpb24uVHBvIC1jIC1vIG1rY2xzLVRBT3B0aW1pemF0aW9uLm8gYHRlc3QgLWYgJ1RBT3B0aW1pemF0aW9uLmNwcCcgfHwgZWNobyAnJChzcmNkaXIpLydgVEFPcHRpbWl6YXRpb24uY3BwCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL21rY2xzLVRBT3B0aW1pemF0aW9uLlRwbyAkKERFUERJUikvbWtjbHMtVEFPcHRpbWl6YXRpb24uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdUQU9wdGltaXphdGlvbi5jcHAnIG9iamVjdD0nbWtjbHMtVEFPcHRpbWl6YXRpb24ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1rY2xzX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBta2Nscy1UQU9wdGltaXphdGlvbi5vIGB0ZXN0IC1mICdUQU9wdGltaXphdGlvbi5jcHAnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYFRBT3B0aW1pemF0aW9uLmNwcAotCi1ta2Nscy1UQU9wdGltaXphdGlvbi5vYmo6IFRBT3B0aW1pemF0aW9uLmNwcAotQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChta2Nsc19DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIG1rY2xzLVRBT3B0aW1pemF0aW9uLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbWtjbHMtVEFPcHRpbWl6YXRpb24uVHBvIC1jIC1vIG1rY2xzLVRBT3B0aW1pemF0aW9uLm9iaiBgaWYgdGVzdCAtZiAnVEFPcHRpbWl6YXRpb24uY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ1RBT3B0aW1pemF0aW9uLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvVEFPcHRpbWl6YXRpb24uY3BwJzsgZmlgCi1AYW1fX2Zhc3RkZXBDWFhfVFJVRUAJbXYgLWYgJChERVBESVIpL21rY2xzLVRBT3B0aW1pemF0aW9uLlRwbyAkKERFUERJUikvbWtjbHMtVEFPcHRpbWl6YXRpb24uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdUQU9wdGltaXphdGlvbi5jcHAnIG9iamVjdD0nbWtjbHMtVEFPcHRpbWl6YXRpb24ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWtjbHNfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG1rY2xzLVRBT3B0aW1pemF0aW9uLm9iaiBgaWYgdGVzdCAtZiAnVEFPcHRpbWl6YXRpb24uY3BwJzsgdGhlbiAkKENZR1BBVEhfVykgJ1RBT3B0aW1pemF0aW9uLmNwcCc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvVEFPcHRpbWl6YXRpb24uY3BwJzsgZmlgCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtdHB5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiBUQUdTCi0KLVRBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICQkdGFncyAkJHVuaXF1ZTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAotCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAotCSAgICAgJCR0YWdzICQkdW5pcXVlCi0KLUdUQUdTOgotCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCi0JICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKLQkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCi0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1jaGVjay1hbTogYWxsLWFtCi1jaGVjazogY2hlY2stYW0KLWFsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykKLWluc3RhbGxkaXJzOgotCWZvciBkaXIgaW4gIiQoREVTVERJUikkKGJpbmRpcikiOyBkbyBcCi0JICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCi0JZG9uZQotaW5zdGFsbDogaW5zdGFsbC1hbQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKLQkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLWNsZWFuOiBjbGVhbi1hbQotCi1jbGVhbi1hbTogY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLWRpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAotCWRpc3RjbGVhbi10YWdzCi0KLWR2aTogZHZpLWFtCi0KLWR2aS1hbToKLQotaHRtbDogaHRtbC1hbQotCi1pbmZvOiBpbmZvLWFtCi0KLWluZm8tYW06Ci0KLWluc3RhbGwtZGF0YS1hbToKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUwotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCi0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KLQotbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1wZGY6IHBkZi1hbQotCi1wZGYtYW06Ci0KLXBzOiBwcy1hbQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMKLQotLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAotCi0uUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tYmluUFJPR1JBTVMgXAotCWNsZWFuLWdlbmVyaWMgY3RhZ3MgZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIFwKLQlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBcCi0JaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtYmluUFJPR1JBTVMgXAotCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAotCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCi0JaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBcCi0JaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgXAotCWluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCi0JbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAotCW1vc3RseWNsZWFuLWdlbmVyaWMgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCBcCi0JdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1iaW5QUk9HUkFNUwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9PcHRpbWl6YXRpb24uY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvT3B0aW1pemF0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlMDZkZi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9PcHRpbWl6YXRpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLQotI2luY2x1ZGUgIk9wdGltaXphdGlvbi5oIgotCi1PcHRpbWl6YXRpb246On5PcHRpbWl6YXRpb24oKSB7fQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9PcHRpbWl6YXRpb24uaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL09wdGltaXphdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzQzNDI3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL09wdGltaXphdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLQotCi0KLQotI2lmbmRlZiBPUFRJTUlaQVRJT04KLSNkZWZpbmUgT1BUSU1JWkFUSU9OCi0KLSNpbmNsdWRlICJQcm9ibGVtLmgiCi0jaW5jbHVkZSAiZ2VuZXJhbC5oIgotCi1jbGFzcyBPcHRpbWl6YXRpb24gCi17Ci0gIAotcHVibGljOgotCi0gICAgICB2aXJ0dWFsIGRvdWJsZSBtaW5pbWl6ZShpbnQgc3RlcHMpPTA7Ci0gICAgICB2aXJ0dWFsIH5PcHRpbWl6YXRpb24oKTsKLSAgICAgCi19OwotI2VuZGlmCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1BvcE9wdGltaXphdGlvbi5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9Qb3BPcHRpbWl6YXRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTY1YTJjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1BvcE9wdGltaXphdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLQotI2luY2x1ZGUgIlBvcE9wdGltaXphdGlvbi5oIgotI2luY2x1ZGUgIlByb2JsZW1UZXN0LmgiCi0KLQotaW50IGNvbXBhcmVQcm9iQW5kT3B0KGNvbnN0IHZvaWQgKnAsY29uc3Qgdm9pZCAqaikKLXsKLSAgZG91YmxlIGE9KChQcm9iQW5kT3B0ICopcCktPnByb2ItPnZhbHVlKCk7Ci0gIGRvdWJsZSBiPSgoUHJvYkFuZE9wdCAqKWopLT5wcm9iLT52YWx1ZSgpOwotICBpZihhPT1iKQotICAgIHJldHVybiAwOwotICBpZihhPGIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlCi0gICAgcmV0dXJuICsxOwotfQotYm9vbCBvcGVyYXRvcjwoY29uc3QgUHJvYkFuZE9wdCZhLCBjb25zdCBQcm9iQW5kT3B0JmIpCi0JewotCXJldHVybiBhLnByb2ItPnZhbHVlKCk8Yi5wcm9iLT52YWx1ZSgpOwotCX0KLWJvb2wgb3BlcmF0b3I9PShjb25zdCBQcm9iQW5kT3B0JmEsIGNvbnN0IFByb2JBbmRPcHQmYikKLQl7Ci0JcmV0dXJuIGEucHJvYi0+dmFsdWUoKT09Yi5wcm9iLT52YWx1ZSgpOwotCX0KLQotb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJm8gLCBjb25zdCBQcm9iQW5kT3B0Jil7cmV0dXJuIG87fQotaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJmkgLCBQcm9iQW5kT3B0Jil7cmV0dXJuIGk7fQotCi0KLSAgICAgIAotUG9wT3B0aW1pemF0aW9uOjpQb3BPcHRpbWl6YXRpb24oUHJvYmxlbSAmcCxpbnQgdmVyZixpbnQgYW56KSAKLTogcHJvYmFuZG9wdChhbnopLGluaXRpYWxpc2llcnQoMCksdmVyZmFocmVuKHZlcmYpCi17Ci0gIG9yaWdpbmFsUHJvYmxlbSA9ICZwOwotfQotCi0gICAgIAotaW50IFBvcE9wdGltaXphdGlvbjo6c2l6ZSgpCi17Ci0gIHJldHVybiBwcm9iYW5kb3B0LnNpemUoKTsKLX0KLQotUHJvYmxlbSAqUG9wT3B0aW1pemF0aW9uOjpwcm9ibGVtKGludCBpKQotewotICBhc3NlcnQoaW5pdGlhbGlzaWVydCk7Ci0gIHJldHVybiBwcm9iYW5kb3B0W2ldLnByb2I7Ci19Ci0KLU9wdGltaXphdGlvbiAqUG9wT3B0aW1pemF0aW9uOjpvcHRpbWl6YXRpb24oaW50IGkpCi17Ci0gIGFzc2VydChpbml0aWFsaXNpZXJ0KTsKLSAgcmV0dXJuIHByb2JhbmRvcHRbaV0ub3B0OwotfQotCi12b2lkIFBvcE9wdGltaXphdGlvbjo6ekluaXRpYWxpemUoKQotewotCWludCBpOwotICB6dWZhbGxTZWVkKCk7Ci0gIGZvcihpPTA7aTxzaXplKCk7aSsrKQotICAgIHsKLSAgICAgIHByb2JhbmRvcHRbaV0ucHJvYj1vcmlnaW5hbFByb2JsZW0tPm1ha2VFcXVhbFByb2JsZW0oKTsKLSAgICAgIHByb2JhbmRvcHRbaV0ucHJvYi0+aW5pdGlhbGl6ZSgpOwotICAgIH0KLQotICB6dWZhbGxTZWVkKCk7Ci0gIGZvcihpPTA7aTxzaXplKCk7aSsrKQotICAgIHByb2JhbmRvcHRbaV0ub3B0PShPcHRpbWl6YXRpb24gKilnZW5JdGVyT3B0aW1pemVyKHZlcmZhaHJlbiwKLQkJCQkJCSAgICAqKHByb2JhbmRvcHRbaV0ucHJvYiksLTEpOwotCi0gIGluaXRpYWxpc2llcnQ9MTsKLX0KLQotICAgIAotdm9pZCBQb3BPcHRpbWl6YXRpb246OnNvcnQoKQotewotICBhc3NlcnQoaW5pdGlhbGlzaWVydCk7Ci0gIAotICBwcm9iYW5kb3B0LnNvcnQoc2l6ZSgpKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvUG9wT3B0aW1pemF0aW9uLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9Qb3BPcHRpbWl6YXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4ZDRhMi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9Qb3BPcHRpbWl6YXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0KLQotCi0KLSNpZm5kZWYgUE9QVUxBVElPTk9QVElNSVpBVElPTgotI2RlZmluZSBQT1BVTEFUSU9OT1BUSU1JWkFUSU9OCi0KLSNpbmNsdWRlICJPcHRpbWl6YXRpb24uaCIKLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIE9wdGltaXphdGlvbiAqb3B0OwotICBQcm9ibGVtICpwcm9iOwotfSBQcm9iQW5kT3B0OwotCi1ib29sIG9wZXJhdG9yPChjb25zdCBQcm9iQW5kT3B0JmEsIGNvbnN0IFByb2JBbmRPcHQmYik7Ci1ib29sIG9wZXJhdG9yPT0oY29uc3QgUHJvYkFuZE9wdCZhLCBjb25zdCBQcm9iQW5kT3B0JmIpOwotb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiAsIGNvbnN0IFByb2JBbmRPcHQmYik7Ci1pc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mICwgUHJvYkFuZE9wdCZiKTsKLQotaW5saW5lIERFRklORV9TVEFOREFSRF9DT01QQVJFKFByb2JBbmRPcHQpOwotCi1pbnQgY29tcGFyZVByb2JBbmRPcHQoY29uc3Qgdm9pZCAqcCxjb25zdCB2b2lkICpqKTsKLQotY2xhc3MgUG9wT3B0aW1pemF0aW9uIDogcHVibGljIE9wdGltaXphdGlvbiB7Ci0KLQotICAgcHJpdmF0ZToKLSAgICAgQXJyYXk8UHJvYkFuZE9wdD4gcHJvYmFuZG9wdDsgCi0gICAgICAgCi0gICBwcm90ZWN0ZWQ6Ci0gICAgIGludCBpbml0aWFsaXNpZXJ0OyAgICAgICAgICAKLSAgICAgUHJvYmxlbSAqb3JpZ2luYWxQcm9ibGVtOyAgIAotCQkJCQkJCQkJCQkgICAgIAotCQkJCQkJCQkJCQkgICAgIAotCQkJCQkJCQkJCQkgICAgIGludCB2ZXJmYWhyZW47ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICB2aXJ0dWFsIHZvaWQgekluaXRpYWxpemUoKTsKLSAgICAgCi0KLSAgIHB1YmxpYzoKLSAgICAgIFBvcE9wdGltaXphdGlvbihQcm9ibGVtICZzLGludCB2ZXJmLGludCBhbnopOwotICAgICAKLSAgICAgCi0gICAgIHZpcnR1YWwgflBvcE9wdGltaXphdGlvbigpIHt9Ci0KLSAgICAgIGludCBzaXplKCk7Ci0gICAgIAotICAgICAKLSAgICAgIHZvaWQgc29ydCgpOwotICAgICAKLQotICAgICAgdmlydHVhbCBQcm9ibGVtJiBiZXN0UHJvYmxlbSgpPTA7Ci0gICAgIAotCi0gICAgICBQcm9ibGVtICpwcm9ibGVtKGludCBpKTsKLSAgICAgCi0KLSAgICAgIE9wdGltaXphdGlvbiAqb3B0aW1pemF0aW9uKGludCBpKTsKLSAgICAgCi0KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1Byb2JsZW0uY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvUHJvYmxlbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMTI2YzguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvUHJvYmxlbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLSNpbmNsdWRlICJQcm9ibGVtLmgiCi0jaW5jbHVkZSAiT3B0aW1pemF0aW9uLmgiCi0KLVByb2JsZW06On5Qcm9ibGVtKCkge30KLQotUHJvYmxlbTo6UHJvYmxlbShpbnQgbWF4LGludCBhbnosaW50IF9pbml0aWFsaXNpZXJ1bmcsaW50IF9hdXN3ZXJ0dW5nLAotCSAgIGludCBfbmFjaGJhcnNjaGFmdCkKLTogaW5pdGlhbGl6ZWQoMCksY3VyQ29tcFZhbCgwKSxjdXJDb21wQ2hhbmdlKDApLG1heENvbXBWYWwobWF4KSxtYXhDb21wKGFueiksY3VyQ29tcCgwKSwKLSAgaW5pdGlhbGlzaWVydW5nKF9pbml0aWFsaXNpZXJ1bmcpLGF1c3dlcnR1bmcoX2F1c3dlcnR1bmcpLG5hY2hiYXJzY2hhZnQoX25hY2hiYXJzY2hhZnQpLAotICBudW1iZXJPZkZ1bGxFdmFsdWF0aW9ucygwKSxudW1iZXJPZlBhcnRFdmFsdWF0aW9ucygwKSxudW1iZXJPZkRvQ2hhbmdlKDApCi17IAotICBpZiggdmVyYm9zZU1vZGU+MSApCi0gICAgY291dCA8PCAiSW5pdGlhbGl6YXRpb24gb2YgUHJvYmxlbTogIiA8PCBtYXhDb21wIDw8ICIgIiA8PCBtYXhDb21wVmFsIAotICAgICAgPDwgIGVuZGw7Ci19Ci0KLXZvaWQgUHJvYmxlbTo6aW5pdGlhbGl6ZShpbnQgaSkKLXsKLSAgY3VyQ29tcD1jdXJDb21wVmFsPWN1ckNvbXBDaGFuZ2U9MDsKLSAgbnVtYmVyT2ZGdWxsRXZhbHVhdGlvbnM9bnVtYmVyT2ZQYXJ0RXZhbHVhdGlvbnM9bnVtYmVyT2ZEb0NoYW5nZT0wOwotICBpbml0aWFsaXplZD0xOwotICBpZiggaT09IC0yMyApCi0gICAgX2luaXRpYWxpemUoaW5pdGlhbGlzaWVydW5nKTsKLSAgZWxzZQotICAgIF9pbml0aWFsaXplKGkpOwotICBtYXhDb21wPW1heERpbWVuc2lvbigpOwotICBtYXhDb21wVmFsPW1heERpbWVuc2lvblZhbCgpOwotfQotCi12b2lkIFByb2JsZW06OmRvQ2hhbmdlKFByb2JsZW1DaGFuZ2UgJmMpCi17Ci0gIGFzc2VydCAoaW5pdGlhbGl6ZWQpOwotICBjdXJDb21wQ2hhbmdlPTE7Ci0gIF9kb0NoYW5nZShjKTsKLSAgbnVtYmVyT2ZEb0NoYW5nZSsrOwkKLX0KLQotdm9pZCBQcm9ibGVtOjppbmNyZW1lbnREaXJlY3Rpb24oKQotewotICBpZiggbWF4Q29tcFZhbD09Y3VyQ29tcFZhbCApCi0gICAgY3VyQ29tcFZhbD0wOwotICBjdXJDb21wQ2hhbmdlPTA7Ci0gIGN1ckNvbXA9KGN1ckNvbXArMSklbWF4Q29tcDsKLX0KLQotUHJvYmxlbUNoYW5nZSYgUHJvYmxlbTo6Y2hhbmdlKCkKLXsKLSAgYXNzZXJ0KCBpbml0aWFsaXplZCApOwotICBhc3NlcnQoIG1heENvbXBWYWw+PWN1ckNvbXBWYWwpOwotCi0gIGlmKCBjdXJDb21wQ2hhbmdlfHxtYXhDb21wVmFsPT1jdXJDb21wVmFsICkKLSAgICBpbmNyZW1lbnREaXJlY3Rpb24oKTsKLQotICBQcm9ibGVtQ2hhbmdlICpwOwotICBpbnQgY2hhbmdlRm91bmQ9X2NoYW5nZSgmcCk7IAotICBjdXJDb21wVmFsKys7Ci0gIGlmKCBjaGFuZ2VGb3VuZD09MCApCi0gICAgcmV0dXJuIGNoYW5nZSgpOyAgCi0gIGVsc2UKLSAgICByZXR1cm4gKnA7Ci19Ci1kb3VibGUgUHJvYmxlbTo6dmFsdWUoKQotewotICBudW1iZXJPZkZ1bGxFdmFsdWF0aW9ucysrOwotICBpZiggIWluaXRpYWxpemVkICkKLSAgICBpbml0aWFsaXplKCk7Ci0gIHJldHVybiBfdmFsdWUoKTsKLX0KLQotZG91YmxlIFByb2JsZW06OnZhbHVlQ2hhbmdlKFByb2JsZW1DaGFuZ2UgJngpCi17Ci0gIG51bWJlck9mUGFydEV2YWx1YXRpb25zKys7Ci0gIGFzc2VydCggaW5pdGlhbGl6ZWQgKTsKLSAgZG91YmxlIGN1cnJlbnRWYWx1ZT12YWx1ZSgpOwotICBfZG9DaGFuZ2UoeCk7bnVtYmVyT2ZEb0NoYW5nZSsrOwotICBkb3VibGUgbmV3VmFsdWU9dmFsdWUoKTsKLSAgX3VuZG9DaGFuZ2UoeCk7bnVtYmVyT2ZEb0NoYW5nZSsrOwotICBhc3NlcnQoIGN1cnJlbnRWYWx1ZT09dmFsdWUoKSApOwotICByZXR1cm4gbmV3VmFsdWUtY3VycmVudFZhbHVlOwotfQotCi12b2lkIFByb2JsZW06OmR1bXBPbihvc3RyZWFtICZzdHJtKQotewotICBhc3NlcnQoIGluaXRpYWxpemVkICk7Ci0gIHN0cm0gPDwgIlByb2JsZW0oIiA8PCBpbml0aWFsaXNpZXJ1bmcgPDwgIiwiIDw8IGF1c3dlcnR1bmcgPDwgIiwiIAotICAgIDw8IG5hY2hiYXJzY2hhZnQgPDwgIilcbiI7Ci0gIHN0cm0gPDwgIiAgICAgICN2YWx1ZTogIiA8PCBudW1iZXJPZkZ1bGxFdmFsdWF0aW9ucyA8PCBlbmRsOwotICBzdHJtIDw8ICIjdmFsdWVDaGFuZ2U6ICIgPDwgbnVtYmVyT2ZQYXJ0RXZhbHVhdGlvbnMgPDwgZW5kbDsKLSAgc3RybSA8PCAiICAgI2RvQ2hhbmdlOiAiIDw8IG51bWJlck9mRG9DaGFuZ2UgPDwgZW5kbDsKLX0KLQotU3RhdFZhciYgUHJvYmxlbTo6ZGV2aWF0aW9uU3RhdFZhcihPcHRpbWl6YXRpb24gJnMsaW50IGFueikKLXsKLSAgYXNzZXJ0KCBpbml0aWFsaXplZCApOwotICBTdGF0VmFyICZ2PSpuZXcgU3RhdFZhcjsKLSAgZG91YmxlIGN1cj12YWx1ZSgpOwotICBpbnQgaG93T2Z0ZW49MDsKLSAgd2hpbGUoIHYuZ2V0TnVtKCk8YW56ICkKLSAgICB7Ci0gICAgICBpZiggaG93T2Z0ZW4rKz41MDAwMCApCi0JYnJlYWs7Ci0gICAgICBkb3VibGUgbmV1ZXI9cy5taW5pbWl6ZSgxKTsKLSAgICAgIGlmKCBuZXVlcj5jdXIgKSAKLQl2LmFkZFZhbHVlKG5ldWVyLWN1cik7Ci0gICAgICBjdXI9bmV1ZXI7Ci0gICAgICB2YXNzZXJ0KE5VTExGTE9BVChjdXItdmFsdWUoKSkpOwotICAgIH0KLSAgcmV0dXJuIHY7Ci19Ci0KLXZvaWQgUHJvYmxlbTo6ZHVtcEluZm9zKG9zdHJlYW0gJnN0cm0pCi17Ci0Jc3RybSA8PCAiUHJvYmxlbTogIiA8PCBlbmRsOwotICBhc3NlcnQoIGluaXRpYWxpemVkICk7Ci19Ci0KLQotZG91YmxlIFByb2JsZW06Om5pY2V2YWx1ZShkb3VibGUpIAoteyAKLSAgcmV0dXJuIHZhbHVlKCk7IAotfQotCi1pbnQgUHJvYmxlbTo6bWF4RGltZW5zaW9uVmFsKHZvaWQpIHtyZXR1cm4gLTE7fQotaW50IFByb2JsZW06Om1heERpbWVuc2lvbih2b2lkKSB7cmV0dXJuIC0xO30KLQotUHJvYmxlbUNoYW5nZTo6flByb2JsZW1DaGFuZ2UoKQotCXsKLQl9Ci0JCi1Qcm9ibGVtQ2hhbmdlOjpQcm9ibGVtQ2hhbmdlKCkKLQl7Ci0JfQotCi12b2lkIFByb2JsZW06OnNldFZhbHVlc0Zyb20oUHJvYmxlbSAqcCkKLXsKLSAgbnVtYmVyT2ZGdWxsRXZhbHVhdGlvbnM9cC0+bnVtYmVyT2ZGdWxsRXZhbHVhdGlvbnM7Ci0gIG51bWJlck9mUGFydEV2YWx1YXRpb25zPXAtPm51bWJlck9mUGFydEV2YWx1YXRpb25zOwotICBudW1iZXJPZkRvQ2hhbmdlPXAtPm51bWJlck9mRG9DaGFuZ2U7Ci0gIGluaXRpYWxpemVkPXAtPmluaXRpYWxpemVkOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvUHJvYmxlbS5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvUHJvYmxlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzczOTBlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1Byb2JsZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0KLQotCi0jaWZuZGVmIFBST0JMRU1DSEFOR0UKLSNkZWZpbmUgUFJPQkxFTUNIQU5HRSAKLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJnZW5lcmFsLmgiCi0jaW5jbHVkZSAiU3RhdFZhci5oIgotCi1jbGFzcyBPcHRpbWl6YXRpb247Ci0KLWNsYXNzIFByb2JsZW1DaGFuZ2UKLQotewotCXB1YmxpYzoKLQl2aXJ0dWFsIH5Qcm9ibGVtQ2hhbmdlKCk7Ci0JUHJvYmxlbUNoYW5nZSgpOwotfTsKLQotY2xhc3MgUHJvYmxlbSB7Ci0KLSBwcml2YXRlOgotICBzaG9ydCBpbml0aWFsaXplZDsgCi0gIGludCBjdXJDb21wVmFsOyAgICAgICAgCi0gIHNob3J0IGN1ckNvbXBDaGFuZ2U7ICAgCi0gIGludCBtYXhDb21wVmFsOyAgICAgICAgCi0gIGludCBtYXhDb21wOyAgICAgICAgICAgCi0KLSAgCi0gcHJvdGVjdGVkOgotICBpbnQgY3VyQ29tcDsgICAgICAgICAgIAotCi0gdm9pZCBzZXRWYWx1ZXNGcm9tKFByb2JsZW0gKnApOwotCi0gICB2aXJ0dWFsIGludCBtYXhEaW1lbnNpb25WYWwodm9pZCkgOwotICAKLQotICAgdmlydHVhbCBpbnQgbWF4RGltZW5zaW9uKHZvaWQpIDsKLSAgCi0gIAotICAgaW5saW5lIGludCBjdXJEaW1lbnNpb24odm9pZCkgeyBhc3NlcnQobWF4Q29tcCE9LTEpO3JldHVybiBjdXJDb21wO30KLSAgCi0KLSAgIGlubGluZSBpbnQgY3VyRGltZW5zaW9uVmFsKHZvaWQpIHsgYXNzZXJ0KG1heENvbXAhPS0xKTtyZXR1cm4gY3VyQ29tcFZhbDt9Ci0gIAotCi0KLSAgIHZpcnR1YWwgdm9pZCAgX2RvQ2hhbmdlKFByb2JsZW1DaGFuZ2UgJmMpPTA7Ci0gIAotCi0gICB2aXJ0dWFsIGludCAgIF9jaGFuZ2UoUHJvYmxlbUNoYW5nZSAqKnApPTA7Ci0gIAotCi0gICB2aXJ0dWFsIHZvaWQgIF91bmRvQ2hhbmdlKFByb2JsZW1DaGFuZ2UgJmMpPTA7Ci0gIAotCi0gICB2aXJ0dWFsIHZvaWQgIF9pbml0aWFsaXplKGludCBpbml0aWFsaXNpZXJ1bmcpPTA7Ci0gIAotCi0gICB2aXJ0dWFsIGRvdWJsZSAgX3ZhbHVlKCk9MDsKLSAgCi0KLSBwdWJsaWM6Ci0gICBQcm9ibGVtKGludCBtYXhDb21wVmFsPS0xLGludCBtYXhDb21wPS0xLGludCBfaW5pdGlhbGlzaWVydW5nPTAsCi0JCSAgICAgIGludCBfYXVzd2VydHVuZz0wLGludCBfbmFjaGJhcnNjaGFmdD0wKTsgCi0KLSAgIHZpcnR1YWwgflByb2JsZW0oKTsKLSAgCi0gIAotICAgdm9pZCBkb0NoYW5nZShQcm9ibGVtQ2hhbmdlICZjKTsKLSAgCi0KLSAgIFByb2JsZW1DaGFuZ2UmIGNoYW5nZSgpOwkJCQotICAKLQotICAgdmlydHVhbCBkb3VibGUgIHZhbHVlKCk7Ci0gIAotCi0gICB2aXJ0dWFsIGRvdWJsZSAgdmFsdWVDaGFuZ2UoUHJvYmxlbUNoYW5nZSAmYyk7Ci0gIAotCi0gICB2aXJ0dWFsIHZvaWQgIGluaXRpYWxpemUoaW50IGE9IC0yMyk7Ci0gIAotCi0gICBpbmxpbmUgdmlydHVhbCBzaG9ydCBlbmRDcml0ZXJpb24oKTsJCi0gIAotCi0gICB2aXJ0dWFsIGludCAgIG1heE5vbkJldHRlckl0ZXJhdGlvbnMoKT0wOwotICAKLQotICAgdmlydHVhbCBpbnQgICBleHBlY3RlZE51bWJlck9mSXRlcmF0aW9ucygpPTA7Ci0gIAotCi0gICB2aXJ0dWFsIHZvaWQgZHVtcE9uKG9zdHJlYW0gJnN0cm0pOwotICAKLQotICAgdmlydHVhbCB2b2lkIGR1bXBJbmZvcyhvc3RyZWFtICZzdHJtKTsKLSAgCi0KLSAgIHZpcnR1YWwgUHJvYmxlbSAqbWFrZUVxdWFsUHJvYmxlbSgpPTA7Ci0gIAotCi0gICB2aXJ0dWFsIGRvdWJsZSBuaWNldmFsdWUoZG91YmxlIHZvcmhlcj0xZTEwMCk7Ci0gIAotCi0gICB2aXJ0dWFsIFN0YXRWYXImIGRldmlhdGlvblN0YXRWYXIoT3B0aW1pemF0aW9uICZzLGludCBhbnopOwotICAKLQotICAgdmlydHVhbCB2b2lkIGluY3JlbWVudERpcmVjdGlvbigpOwotICAKLQotICAKLSAgCi0gIAotICBpbnQgaW5pdGlhbGlzaWVydW5nOwotICBpbnQgYXVzd2VydHVuZzsKLSAgaW50IG5hY2hiYXJzY2hhZnQ7Ci0gIAotICBpbnQgbnVtYmVyT2ZGdWxsRXZhbHVhdGlvbnM7IAotICBpbnQgbnVtYmVyT2ZQYXJ0RXZhbHVhdGlvbnM7IAotICBpbnQgbnVtYmVyT2ZEb0NoYW5nZTsgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gCi19OwotCi1pbmxpbmUgc2hvcnQgUHJvYmxlbTo6ZW5kQ3JpdGVyaW9uKCkKLXsgCi0gIHJldHVybiAwOwotfTsJCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9Qcm9ibGVtVGVzdC5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9Qcm9ibGVtVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZmVhN2EuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvUHJvYmxlbVRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0KLSNpbmNsdWRlICJQcm9ibGVtVGVzdC5oIgotI2luY2x1ZGUgIkhDT3B0aW1pemF0aW9uLmgiCi0jaW5jbHVkZSAiUlJUT3B0aW1pemF0aW9uLmgiCi0jaW5jbHVkZSAiU0FPcHRpbWl6YXRpb24uaCIKLSNpbmNsdWRlICJUQU9wdGltaXphdGlvbi5oIgotI2luY2x1ZGUgIkdEQU9wdGltaXphdGlvbi5oIgotI2luY2x1ZGUgIk1ZT3B0aW1pemF0aW9uLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJnZW5lcmFsLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLXNob3J0IFByb2JsZW1UZXN0VmVyYm9zZU1vZGU9MTsKLW9mc3RyZWFtICpQcmludEJlc3RUbz0wLCpQcmludEJlc3RUbzI9MDsKLQotCi1pbnQgY29tcGFyZVByb2JsZW0oY29uc3Qgdm9pZCAqcCxjb25zdCB2b2lkICpqKQotewotICBkb3VibGUgYT0oKihQcm9ibGVtICoqKXApLT52YWx1ZSgpOwotICBkb3VibGUgYj0oKihQcm9ibGVtICoqKWopLT52YWx1ZSgpOwotICBpZihhPT1iKQotICAgIHJldHVybiAwOwotICBpZihhPGIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlCi0gICAgcmV0dXJuICsxOwotfQotCi0KLUl0ZXJPcHRpbWl6YXRpb24gKmdlbkl0ZXJPcHRpbWl6ZXIoaW50IHZlcmZhaHJlbixQcm9ibGVtICZwcm9ibGVtLGludCBtYXhJdGVyKQotewotICBJdGVyT3B0aW1pemF0aW9uICpvcHQ7Ci0gIHN3aXRjaCh2ZXJmYWhyZW4pCi0gICAgewotICAgIGNhc2UgSENfT1BUOgotICAgICAgb3B0ID0gbmV3IEhDT3B0aW1pemF0aW9uKHByb2JsZW0sbWF4SXRlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdEQV9PUFQ6Ci0gICAgICBvcHQgPSBuZXcgR0RBT3B0aW1pemF0aW9uKHByb2JsZW0sbWF4SXRlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNBX09QVDoKLSAgICAgIG9wdCA9IG5ldyBTQU9wdGltaXphdGlvbihwcm9ibGVtLG1heEl0ZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQV9PUFQ6Ci0gICAgICBvcHQgPSBuZXcgVEFPcHRpbWl6YXRpb24ocHJvYmxlbSxtYXhJdGVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUlJUX09QVDoKLSAgICAgIG9wdCA9IG5ldyBSUlRPcHRpbWl6YXRpb24ocHJvYmxlbSxtYXhJdGVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTVlfT1BUOgotICAgICAgb3B0ID0gbmV3IE1ZT3B0aW1pemF0aW9uKHByb2JsZW0sbWF4SXRlcik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBwcm9ibGVtLmluaXRpYWxpemUoKTsgCi0gIHJldHVybiBvcHQ7Ci19Ci0KLQotZG91YmxlIHNvbHZlUHJvYmxlbShpbnQgdmVyYm9zZSxQcm9ibGVtICZwcm9ibGVtLGludCB2ZXJzdWNoZSwKLQkJICBpbnQgb3B0aW1pZXJ1bmdzc2Nocml0dGUsaW50IHZlcmZhaHJlbixkb3VibGUgJm1lYW4sCi0JCSAgU3RhdFZhciAmZW5kTmljZSxTdGF0VmFyICZhdXN3ZXJ0dW5nZW4sU3RhdFZhciAmc3RhcnROaWNlLAotCQkgIGRvdWJsZSBtYXhDbG9jayxpbnQgKml0ZXJhdGlvbnNzY2hyaXR0ZSkKLXsKLSAgZG91YmxlIHNtYWxsZXN0Vj0xZTEwMDsKLSAgUHJvYmxlbSAqYmVzdFA9MDsKLSAgU3RhdFZhciBzdGFydCxlbmQ7Ci0gIFN0YXRWYXIgZGF1ZXI7Ci0gIFN0YXRWYXIgaXRlcnNjaHJpdHRlOwotCi0gIGZvcihpbnQgaT0wO2k8dmVyc3VjaGU7aSsrKQotICAgIHsKLSAgICAgIGlmKHZlcmJvc2U+MikKLQl7Ci0JICBjb3V0IDw8ICIgICAgICAgICAgICAgICAgICAiIDw8IGkgPDwgIiBvZiAiIDw8IHZlcnN1Y2hlIDw8ICIuXG4iOwotCSAgY291dC5mbHVzaCgpOwotCX0KLSAgICAgIGRvdWJsZSB2b3JoZXI9Y2xvY2tTZWMoKTsKLQotICAgICAgSXRlck9wdGltaXphdGlvbiAqb3B0PWdlbkl0ZXJPcHRpbWl6ZXIodmVyZmFocmVuLHByb2JsZW0sCi0JCQkJCSAgICAgb3B0aW1pZXJ1bmdzc2Nocml0dGUpOwotICAgICAgcHJvYmxlbS5udW1iZXJPZlBhcnRFdmFsdWF0aW9ucz0wOwotCi0gICAgICBzdGFydE5pY2UuYWRkVmFsdWUocHJvYmxlbS5uaWNldmFsdWUoKSk7Ci0gICAgICBzdGFydC5hZGRWYWx1ZShwcm9ibGVtLnZhbHVlKCkpOwotICAgICAgCi0gICAgICBkb3VibGUgdj1vcHQtPm1pbmltaXplKG9wdGltaWVydW5nc3NjaHJpdHRlKTsKLQotCWlmKCBwcm9ibGVtLm51bWJlck9mUGFydEV2YWx1YXRpb25zPT0wKQotICAgICAgYXVzd2VydHVuZ2VuLmFkZFZhbHVlKG9wdC0+Z2V0Q3VyU3RlcCgpKTsKLQllbHNlCi0gICAgICBhdXN3ZXJ0dW5nZW4uYWRkVmFsdWUocHJvYmxlbS5udW1iZXJPZlBhcnRFdmFsdWF0aW9ucyk7Ci0gICAgICBpdGVyc2Nocml0dGUuYWRkVmFsdWUob3B0LT5nZXRDdXJTdGVwKCkpOwotCi0gICAgICBlbmROaWNlLmFkZFZhbHVlKHByb2JsZW0ubmljZXZhbHVlKCkpOwotICAgICAgZW5kLmFkZFZhbHVlKHByb2JsZW0udmFsdWUoKSk7Ci0gICAgICBkYXVlci5hZGRWYWx1ZShjbG9ja1NlYygpLXZvcmhlcik7Ci0gICAgICBpZiggdmVyYm9zZT4yICkKLQl7Ci0JICBjb3V0IDw8IGkgPDwgIi4gIiA8PCB2IDw8ICI6ICI7Ci0JICBwcm9ibGVtLmR1bXBPbihjb3V0KTsKLQl9Ci0gICAgICBkZWxldGUgb3B0OwotICAgICAgaWYoIHY8c21hbGxlc3RWICYmIHZlcmJvc2U+MSApCi0JewotCSAgYmVzdFA9cHJvYmxlbS5tYWtlRXF1YWxQcm9ibGVtKCk7Ci0JICBzbWFsbGVzdFY9djsKLQl9Ci0gICAgICBpZiggdmVyYm9zZT4yICkKLQljb3V0IDw8ICIgIHRpbWU6ICIgPDwgY2xvY2tTZWMoKSA8PCAiIGJlc3Q6IiA8PCBlbmROaWNlLnF1YW50aWwoMCkgCi0JICA8PCAiIHRoaXM6IiA8PCBwcm9ibGVtLm5pY2V2YWx1ZSgpIDw8IGVuZGw7Ci0gICAgICBpZiggbWF4Q2xvY2sgJiYgY2xvY2tTZWMoKT5tYXhDbG9jayApCi0JewotCSAgaWYodmVyYm9zZSkKLQkgICAgY291dCA8PCAiU3RvcCBiZWNhdXNlIG9mIHRpbWUgbGltaXQgKCAiIDw8IChjbG9ja1NlYygpLW1heENsb2NrKSAKLQkgICAgICA8PCAiIFNla3VuZGVuKVxuIjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIAotICBpZih2ZXJib3NlKQotICAgIHsKLSAgICAgIGNvdXQgPDwgIlxuKioqKiogIiA8PCBzdGFydC5nZXROdW0oKSA8PCAiIHJ1bnMuIChhbGdvcml0aG06IjsKLSAgICAgIHN3aXRjaCh2ZXJmYWhyZW4pCi0JewotCWNhc2UgSENfT1BUOgotCSAgY291dCA8PCAiSEMiOwotCSAgYnJlYWs7Ci0JY2FzZSBSUlRfT1BUOgotCSAgY291dCA8PCAiUlJUIjsKLQkgIGJyZWFrOwotCWNhc2UgR0RBX09QVDoKLQkgIGNvdXQgPDwgIkdEQSI7Ci0JICBicmVhazsKLQljYXNlIFRBX09QVDoKLQkgIGNvdXQgPDwgIlRBIjsKLQkgIGJyZWFrOwotCWNhc2UgU0FfT1BUOgotCSAgY291dCA8PCAiU0EiOwotCSAgYnJlYWs7Ci0JY2FzZSBNWV9PUFQ6Ci0JICBjb3V0IDw8ICJNWSI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgY291dCA8PCAiIXVua25vd24hIjsKLQl9Ci0gICAgICBjb3V0IDw8ICIpKioqKipcbiI7Ci0gICAgICBwcm9ibGVtLmR1bXBJbmZvcyhjb3V0KTsKLSAgICAgIGNvdXQgPDwgZW5kbDsKLSAgICAgIGNvdXQgPDwgInN0YXJ0LWNvc3RzOiAiOyBzdGFydC5kdW1wT24oY291dCk7IGNvdXQgPDwgZW5kbDsKLSAgICAgIGNvdXQgPDwgIiAgZW5kLWNvc3RzOiAiOyBlbmQuZHVtcE9uKGNvdXQpOyBjb3V0IDw8IGVuZGw7Ci0gICAgICBjb3V0IDw8ICIgICBzdGFydC1wcDogIjsgc3RhcnROaWNlLmR1bXBPbihjb3V0KTsgY291dCA8PCBlbmRsOwotICAgICAgY291dCA8PCAiICAgICBlbmQtcHA6ICI7IGVuZE5pY2UuZHVtcE9uKGNvdXQpOyBjb3V0IDw8IGVuZGw7Ci0gICAgICBjb3V0IDw8ICIgaXRlcmF0aW9uczogIjsgYXVzd2VydHVuZ2VuLmR1bXBPbihjb3V0KTsgY291dCA8PCBlbmRsOwotICAgICAgY291dCA8PCAiICAgICAgIHRpbWU6ICI7IGRhdWVyLmR1bXBPbihjb3V0KTsKLSAgICAgIGNvdXQgPDwgZW5kbDsKLSAgICB9Ci0gIGlmKCBiZXN0UCApCi0gICAgewotICAgICAgaWYoUHJpbnRCZXN0VG8pCi0JYmVzdFAtPmR1bXBPbigqUHJpbnRCZXN0VG8pOwotICAgICAgZWxzZQotCWJlc3RQLT5kdW1wT24oY291dCk7Ci0gICAgICBkZWxldGUgYmVzdFA7Ci0gICAgfQotICBtZWFuID0gZW5kLmdldE1lYW4oKTsKLSAgaWYoIGl0ZXJhdGlvbnNzY2hyaXR0ZSApCi0gICAgKml0ZXJhdGlvbnNzY2hyaXR0ZT0oaW50KShpdGVyc2Nocml0dGUuZ2V0TWVhbigpKTsKLSAgcmV0dXJuIGVuZC5nZXRTbWFsbGVzdCgpOwotfQotCi0KLQotdm9pZCBtdWx0aVNvbHZlUHJvYmxlbShQcm9ibGVtICZwcm9ibGVtLGludCB2ZXJzdWNoZSxpbnQgbWF4U2Vjb25kcykKLXsKLQlpbnQgaTsKLSAgaW50IG1heExhZXVmZTsKLSAgZG91YmxlIHJEdW1teTsKLSAgU3RhdFZhciBlbmRbTUFYX09QVF9OUl0sYXVzd2VydHVuZ2VuW01BWF9PUFRfTlJdLHN0YXJ0W01BWF9PUFRfTlJdOwotICBkb3VibGUgbWF4Q2xvY2s9Y2xvY2tTZWMoKSttYXhTZWNvbmRzOwotICBpZihtYXhTZWNvbmRzPD0wKW1heENsb2NrPTA7Ci0gIHNvbHZlUHJvYmxlbShQcm9ibGVtVGVzdFZlcmJvc2VNb2RlLHByb2JsZW0sdmVyc3VjaGUsLTEsSENfT1BULHJEdW1teSwKLQkgICAgICAgZW5kW0hDX09QVF0sYXVzd2VydHVuZ2VuW0hDX09QVF0sc3RhcnRbSENfT1BUXSxtYXhDbG9jayk7Ci0gIG1heExhZXVmZT0oaW50KShhdXN3ZXJ0dW5nZW5bSENfT1BUXS5nZXRNZWFuKCkqNSk7Ci0gIGZvcihpPTA7aTxNQVhfT1BUX05SO2krKykKLSAgICB7Ci0gICAgICBpZiggaT09SENfT1BUICkKLQljb250aW51ZTsKLSAgICAgIGRvdWJsZSBtYXhDbG9jaz1jbG9ja1NlYygpK21heFNlY29uZHM7Ci0gICAgICBpZihtYXhTZWNvbmRzPD0wKW1heENsb2NrPTA7Ci0gICAgICBzb2x2ZVByb2JsZW0oUHJvYmxlbVRlc3RWZXJib3NlTW9kZSxwcm9ibGVtLHZlcnN1Y2hlLCAtMSxpLHJEdW1teSxlbmRbaV0sCi0JCSAgIGF1c3dlcnR1bmdlbltpXSxzdGFydFtpXSxtYXhDbG9jayk7Ci0gICAgfQotICBlbmRbSENfT1BUXS50aXRsZSA9ICIgIEhDIjsKLSAgZW5kW1NBX09QVF0udGl0bGUgPSAgICIgIFNBIjsKLSAgZW5kW0dEQV9PUFRdLnRpdGxlID0gICIgR0RBIjsKLSAgZW5kW1JSVF9PUFRdLnRpdGxlID0gICIgUlJUIjsKLSAgZW5kW1RBX09QVF0udGl0bGUgPSAgICIgIFRBIjsKLSAgZW5kW01ZX09QVF0udGl0bGUgPSAgICIgIE1ZIjsKLQotICAgIGZvcihpPTA7aTxNQVhfT1BUX05SO2krKykgCi0gICAgZW5kW2ldLnF1YW50aWwoMC41KTsKLQotICBjb3V0IDw8ICJtZWFuOiBcbiI7Ci0gIGNvbXBhcmVTdGF0VmFyUXVhbnRpbD0tMTsKLSAgcXNvcnQoZW5kLE1BWF9PUFRfTlIsc2l6ZW9mKFN0YXRWYXIpLGNvbXBhcmVTdGF0VmFyKTsKLSAgZm9yKGk9MDtpPE1BWF9PUFRfTlI7aSsrKQotICAgIGNvdXQgPDwgZW5kW2ldLnRpdGxlIDw8ICIgIiA8PCBlbmRbaV0uZ2V0TWVhbigpIDw8IGVuZGw7Ci0KLSAgY291dCA8PCAiXG5iZXN0OiBcbiI7Ci0gIGNvbXBhcmVTdGF0VmFyUXVhbnRpbD0wOwotICBxc29ydChlbmQsTUFYX09QVF9OUixzaXplb2YoU3RhdFZhciksY29tcGFyZVN0YXRWYXIpOwotICBmb3IoaT0wO2k8TUFYX09QVF9OUjtpKyspCi0gICAgY291dCA8PCBlbmRbaV0udGl0bGUgPDwgIiAiIDw8IGVuZFtpXS5xdWFudGlsKGNvbXBhcmVTdGF0VmFyUXVhbnRpbCkgCi0gICAgICA8PCBlbmRsOwotCi0gIGNvdXQgPDwgIlxuMjAlLXF1YW50aWw6IFxuIjsKLSAgY29tcGFyZVN0YXRWYXJRdWFudGlsPTAuMjsKLSAgcXNvcnQoZW5kLE1BWF9PUFRfTlIsc2l6ZW9mKFN0YXRWYXIpLGNvbXBhcmVTdGF0VmFyKTsKLSAgZm9yKGk9MDtpPE1BWF9PUFRfTlI7aSsrKQotICAgIGNvdXQgPDwgZW5kW2ldLnRpdGxlIDw8ICIgIiA8PCBlbmRbaV0ucXVhbnRpbChjb21wYXJlU3RhdFZhclF1YW50aWwpIAotICAgICAgPDwgZW5kbDsKLX0KLQotCi12b2lkIG1ldGFPcHRpbWl6YXRpb24oUHJvYmxlbSAmdHAsaW50IG5MYWV1ZmUsaW50IG5QYXJzKQotewotICBkb3VibGUgYmVzdFBhcixiZXN0VmFsdWU7Ci0KLSAgYmVzdFBhcj1JdGVyT3B0aW1pemF0aW9uT3B0aW1pemVQYXJhbWV0ZXIodHAsVEFPcHRpbWl6YXRpb246OmRlZmF1bHRBbm5SYXRlLDAuMCwxLjAsbkxhZXVmZSxuUGFycyxUQV9PUFQsYmVzdFZhbHVlKTsKLSAgY291dCA8PCAiI1RBKGRlZmF1bHRBbm5SYXRlKSBCRVNULVBBUjogIiA8PCBiZXN0UGFyIDw8ICIgICBCRVNULVZBTDogIiA8PCBiZXN0VmFsdWUgPDwgZW5kbDsKLSAgYmVzdFBhcj1JdGVyT3B0aW1pemF0aW9uT3B0aW1pemVQYXJhbWV0ZXIodHAsUlJUT3B0aW1pemF0aW9uOjpkZWZhdWx0QW5uUmF0ZSwwLjAsMS4wLG5MYWV1ZmUsblBhcnMsUlJUX09QVCxiZXN0VmFsdWUpOwotICBjb3V0IDw8ICIjUlJUKGRlZmF1bHRBbm5SYXRlKSBCRVNULVBBUjogIiA8PCBiZXN0UGFyIDw8ICIgICBCRVNULVZBTDogIiA8PCBiZXN0VmFsdWUgPDwgZW5kbDsKLSAgYmVzdFBhcj1JdGVyT3B0aW1pemF0aW9uT3B0aW1pemVQYXJhbWV0ZXIodHAsR0RBT3B0aW1pemF0aW9uOjpkZWZhdWx0QWxwaGEsMC4wLDAuMDEsbkxhZXVmZSxuUGFycyxHREFfT1BULGJlc3RWYWx1ZSk7Ci0gIGNvdXQgPDwgIiNHREEoZGVmYXVsdEFscGhhKSBCRVNULVBBUjogIiA8PCBiZXN0UGFyIDw8ICIgICBCRVNULVZBTDogIiA8PCBiZXN0VmFsdWUgPDwgZW5kbDsKLSAgYmVzdFBhcj1JdGVyT3B0aW1pemF0aW9uT3B0aW1pemVQYXJhbWV0ZXIodHAsU0FPcHRpbWl6YXRpb246OmRlZmF1bHRFbmRBbm5SYXRlLDAuMCwxLjAsbkxhZXVmZSxuUGFycyxTQV9PUFQsYmVzdFZhbHVlKTsKLSAgY291dCA8PCAiI1NBKGRlZmF1bHRFbmRBbm5SYXRlKSBCRVNULVBBUjogIiA8PCBiZXN0UGFyIDw8ICIgICBCRVNULVZBTDogIiA8PCBiZXN0VmFsdWUgPDwgZW5kbDsKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1Byb2JsZW1UZXN0LmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9Qcm9ibGVtVGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQ4YmRhLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1Byb2JsZW1UZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0KLQotCi0jaWZuZGVmIFBST0JMRU1URVNUX0gKLSNkZWZpbmUgUFJPQkxFTVRFU1RfSAotCi0jaW5jbHVkZSAiUHJvYmxlbS5oIgotI2luY2x1ZGUgIlN0YXRWYXIuaCIKLSNpbmNsdWRlIDxmc3RyZWFtPgotCi0KLWVudW0ge1RBX09QVCwgSENfT1BULCBTQV9PUFQsUlJUX09QVCxHREFfT1BULE1BWF9PUFRfTlIsTVlfT1BUIH07Ci0KLWNsYXNzIEl0ZXJPcHRpbWl6YXRpb247Ci0KLWV4dGVybiBzaG9ydCBQcm9ibGVtVGVzdFZlcmJvc2VNb2RlOwotCi1leHRlcm4gb2ZzdHJlYW0gKlByaW50QmVzdFRvLCpQcmludEJlc3RUbzI7Ci0KLWRvdWJsZSBzb2x2ZVByb2JsZW0oaW50IHZlcmJvc2UsUHJvYmxlbSAmcHJvYmxlbSxpbnQgdmVyc3VjaGUsCi1pbnQgb3B0aW1pZXJ1bmdzc2Nocml0dGUsaW50IHZlcmZhaHJlbixkb3VibGUgJm1lYW4sU3RhdFZhciAmZW5kVmFsdWUsCi1TdGF0VmFyICZsYXVmemVpdCxTdGF0VmFyICZpbml0VmFsdWUsZG91YmxlIG1heFNlYz0gMCxpbnQgKml0ZXJhdGlvbnNzY2hyaXR0ZT0wKTsKLQotCi0KLWludCBjb21wYXJlUHJvYmxlbShjb25zdCB2b2lkICpwLGNvbnN0IHZvaWQgKmopOwotCi0KLQotdm9pZCBtdWx0aVNvbHZlUHJvYmxlbShQcm9ibGVtICZwcm9ibGVtLGludCB2ZXJzdWNoZSxpbnQgbWF4U2Vjb25kcyk7Ci0KLQotCi1JdGVyT3B0aW1pemF0aW9uICpnZW5JdGVyT3B0aW1pemVyKGludCB2ZXJmYWhyZW4sUHJvYmxlbSAmcHJvYmxlbSxpbnQgbWF4SXRlcik7Ci0KLQotdm9pZCBtZXRhT3B0aW1pemF0aW9uKFByb2JsZW0gJnAsaW50IG5MYWV1ZmUsaW50IG5QYXJzKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9SUlRPcHRpbWl6YXRpb24uY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvUlJUT3B0aW1pemF0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVlMjEyMi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9SUlRPcHRpbWl6YXRpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0KLSNpbmNsdWRlICJSUlRPcHRpbWl6YXRpb24uaCIKLSNpbmNsdWRlICJQcm9ibGVtVGVzdC5oIgotCi1kb3VibGUgUlJUT3B0aW1pemF0aW9uOjpkZWZhdWx0QW5uUmF0ZT0wLjY7Ci1kb3VibGUgUlJUT3B0aW1pemF0aW9uOjpkZWZhdWx0TXVsdGlwbGU9Mi4wOwotCi0KLSAgICAgCi1SUlRPcHRpbWl6YXRpb246OlJSVE9wdGltaXphdGlvbihQcm9ibGVtICZwLGRvdWJsZSB0LGRvdWJsZSBkdCxpbnQgbSkgCi06IEl0ZXJPcHRpbWl6YXRpb24ocCxtKSxkZXZpYXRpb24odCksZGVsdGFEZXZpYXRpb24oZHQpCi17ICAKLSAgYXNzZXJ0KGRldmlhdGlvbj49MCk7Ci19Ci0KLQotICAgICAKLVJSVE9wdGltaXphdGlvbjo6IFJSVE9wdGltaXphdGlvbihQcm9ibGVtICZwLGludCBtKSAKLTogSXRlck9wdGltaXphdGlvbihwLG0pLGRldmlhdGlvbigtMSksZGVsdGFEZXZpYXRpb24oMCkKLXsKLX0KLQotCi0gICAgIAotUlJUT3B0aW1pemF0aW9uOjpSUlRPcHRpbWl6YXRpb24oUlJUT3B0aW1pemF0aW9uICZvKQotOiBJdGVyT3B0aW1pemF0aW9uKG8pCi17Ci0gIGRldmlhdGlvbiAgICAgPSBvLmRldmlhdGlvbjsKLSAgZGVsdGFEZXZpYXRpb249IG8uZGVsdGFEZXZpYXRpb247Ci0gIHJlY29yZCAgICAgICAgPSBvLnJlY29yZDsKLX0KLQotCi0gICAgIAotdm9pZCBSUlRPcHRpbWl6YXRpb246OnpJbml0aWFsaXplKCkKLXsKLSAgSXRlck9wdGltaXphdGlvbjo6ekluaXRpYWxpemUoKTsKLSAgaWYoIGRldmlhdGlvbjwwICkKLSAgICB7IAotICAgICAgCi0KLSAgICAgIGludCBuOwotICAgICAgCi0gICAgICBTdGF0VmFyICZ2PXByb2JsZW0uZGV2aWF0aW9uU3RhdFZhcigqdGhpcyxBTlpfVkVSU0NITEVDSFRFUlVOR0VOKTsgCi0KLSAgICAgIGlmKCBtYXhTdGVwPjAgKSAKLQluPShpbnQpKG1heFN0ZXAqNC4wLzUuMCk7ICAgIAotICAgICAgZWxzZSAgICAgICAgICAgIAotCW1heFN0ZXA9bj0oaW50KShwcm9ibGVtLmV4cGVjdGVkTnVtYmVyT2ZJdGVyYXRpb25zKCkqZGVmYXVsdE11bHRpcGxlKTsKLSAKLSAgICAgIGRldmlhdGlvbiAgICAgID0gdi5xdWFudGlsKGRlZmF1bHRBbm5SYXRlKTsKLSAgICAgIGRlbHRhRGV2aWF0aW9uID0gZGV2aWF0aW9uLyhmbG9hdCluOwotCi0gICAgICBpZiggdmVyYm9zZU1vZGU+MCApCi0JY291dCA8PCAiI0FsZ29yaXRobTogUmVjb3JkLVRvLVJlY29yZC1UcmF2ZWw6IChhbmZBbm5SYXRlPSIKLQkgIDw8IGRlZmF1bHRBbm5SYXRlIDw8ICIsVD0iIDw8IGRldmlhdGlvbiA8PCAiLGRlbHRhVD0iIAotCSAgPDwgZGVsdGFEZXZpYXRpb24gPDwgIilcbiI7Ci0KLSAgICAgIGN1clN0ZXA9MDsKLSAgICAgIGVuZEZsYWc9MDsKLSAgICAgIGRlbGV0ZSAmdjsKLSAgICAgIHByb2JsZW0uaW5pdGlhbGl6ZSgpOwotICAgICAgSXRlck9wdGltaXphdGlvbjo6ekluaXRpYWxpemUoKTsKLSAgICB9Ci0gIHJlY29yZD1wcm9ibGVtLnZhbHVlKCk7Ci0gIGFzc2VydChkZXZpYXRpb24+PTApOwotfQotCi1zaG9ydCBSUlRPcHRpbWl6YXRpb246OmVuZCgpCi17Ci0gIHJldHVybiAoIGVuZEZsYWc+MCAmJiBkZXZpYXRpb249PTAuMCApOwotfQotdm9pZCAgUlJUT3B0aW1pemF0aW9uOjphYmt1ZWhsZW4oKQotewotICBpZiggZGV2aWF0aW9uPj0wICkKLSAgICB7Ci0gICAgICBkZXZpYXRpb24gLT0gZGVsdGFEZXZpYXRpb247Ci0gICAgICBpZihkZXZpYXRpb248MCkKLQlkZXZpYXRpb249MDsKLSAgICB9Ci19Ci1zaG9ydCBSUlRPcHRpbWl6YXRpb246OmFjY2VwdChkb3VibGUgZGVsdGEpCi17Ci0gIGlmKCBkZXZpYXRpb248MCApCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiggIGRlbHRhICsgY3VyVmFsdWUgLSBkZXZpYXRpb24gPCByZWNvcmQgKQotCXsKLQkgIGlmKCBkZWx0YSArIGN1clZhbHVlIDwgcmVjb3JkICkKLQkgICAgcmVjb3JkID0gZGVsdGErY3VyVmFsdWU7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0gICAgfQotfQotCi12b2lkIFJSVE9wdGltaXphdGlvbjo6bWFrZUdyYXBoT3V0cHV0KCkKLXsKLSAgSXRlck9wdGltaXphdGlvbjo6bWFrZUdyYXBoT3V0cHV0KCk7Ci0gICpHcmFwaE91dHB1dCA8PCBkZXZpYXRpb247Ci19Ci0KLQotCi0gICAgIAotZG91YmxlIFJSVE9wdGltaXphdGlvbjo6b3B0aW1pemVWYWx1ZShQcm9ibGVtICZwLGludCBwcm9QYXJhbWV0ZXIsaW50IG51bVBhcmFtZXRlcixpbnQgdHlwLAotCQkJIGludCBvcHRpbWllcnVuZ3NzY2hyaXR0ZSxpbnQgcHJpbnQpCi17Ci0gIHN3aXRjaCh0eXApCi0gICAgewotICAgIGNhc2UgMTogCi0gICAgICB7Ci0JZG91YmxlIGJlc3RQYXI9LTEsYmVzdD0xZTEwMDsKLQlpZiggcHJpbnQgKQotCSAgY291dCA8PCAiI1JSVC1vcHRpbWl6ZVZhbHVlczogUXVhbnRpbDogIiA8PCBudW1QYXJhbWV0ZXIgPDwgZW5kbDsKLQlmb3IoaW50IGk9MDtpPD1udW1QYXJhbWV0ZXI7aSsrKQotCSAgewotCSAgICBTdGF0VmFyIGVuZCxsYXVmemVpdCxpbml0OwotCSAgICBkb3VibGUgbm93OwotCSAgICBpZihpPT0wKSBkZWZhdWx0QW5uUmF0ZT0wLjI7Ci0JICAgIGVsc2UgZGVmYXVsdEFublJhdGUgPSAwLjMrKGZsb2F0KSgwLjYqaSkvbnVtUGFyYW1ldGVyOwotCSAgICBzb2x2ZVByb2JsZW0oMCxwLHByb1BhcmFtZXRlcixvcHRpbWllcnVuZ3NzY2hyaXR0ZSxSUlRfT1BULG5vdywKLQkJCSBlbmQsbGF1ZnplaXQsaW5pdCk7Ci0JICAgIGlmKCBiZXN0Pm5vdyApCi0JICAgICAgewotCQliZXN0PW5vdzsKLQkJYmVzdFBhcj1kZWZhdWx0QW5uUmF0ZTsKLQkgICAgICB9Ci0JICAgIGlmKCBwcmludCApCi0JICAgICAgewotCQljb3V0IDw8IGRlZmF1bHRBbm5SYXRlIDw8ICIgIjsKLQkJY291dCA8PCBlbmQuZ2V0TWVhbigpIDw8ICIgIiA8PCBlbmQucXVhbnRpbCgwLjIpIDw8ICIgIiAKLQkJICA8PCBlbmQucXVhbnRpbCgwLjc5KSA8PCAiICAiIDw8IGxhdWZ6ZWl0LmdldE1lYW4oKSA8PCAiICIgCi0JCSAgPDwgZW5kLnF1YW50aWwoMC4wKSA8PCAiICIgPDwgZW5kLmdldFNpZ21hKCkgPDwgIiAiIAotCQkgIDw8IGVuZC5nZXRTaWdtYVNtYWxsZXIoKSA8PCAiICIgPDwgZW5kLmdldFNpZ21hQmlnZ2VyKCkgCi0JCSAgPDwgIiAiIDw8IG5vdyA8PCBlbmRsOwotCSAgICAgIH0KLQkgIH0KLQlpZiggcHJpbnQgKQotCSAgY291dCA8PCAiI1BhcmFtZXRlciBNaXR0ZWx3ZXJ0IDAuMi1RdWFudGlsIDAuOC1RdWFudGlsIExhdWZ6ZWl0ICIKLQkgICAgICAgICAgIkJlc3RlciBTaWdtYSBTaWdtYVNtYWxsZXIgU2lnbWFCaWdnZXJcbiI7Ci0JZGVmYXVsdEFublJhdGU9MC44OwotCXJldHVybiBiZXN0UGFyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMDogCi0gICAgICB7Ci0JZG91YmxlIGk7Ci0JZG91YmxlIGJlc3RQYXI9LTEsYmVzdD0xZTEwMDsKLQlTdGF0VmFyIGVuZCxsYXVmemVpdCxpbml0OwotCQotCWlmKCBwcmludCApCi0JICBjb3V0IDw8ICIjUlJULW9wdGltaXplVmFsdWVzOiBkZWZhdWx0TXVsdGlwbGUiIDw8IDggPDwgZW5kbDsgICAgCi0JZm9yKGk9MC41O2k8PTEwO2krPTEuNSkKLQkgIHsKLQkgICAgZG91YmxlIG5vdzsKLQkgICAgZGVmYXVsdE11bHRpcGxlID0gaTsKLQkgICAgc29sdmVQcm9ibGVtKDAscCxwcm9QYXJhbWV0ZXIsb3B0aW1pZXJ1bmdzc2Nocml0dGUsUlJUX09QVCxub3csCi0JCQkgZW5kLGxhdWZ6ZWl0LGluaXQpOwotCSAgICBpZiggYmVzdD5ub3cgKQotCSAgICAgIHsKLQkJYmVzdD1ub3c7Ci0JCWJlc3RQYXI9ZGVmYXVsdE11bHRpcGxlOwotCSAgICAgIH0KLQkgICAgaWYoIHByaW50ICkKLQkgICAgICB7Ci0JCWNvdXQgPDwgZGVmYXVsdE11bHRpcGxlIDw8ICIgIjsKLQkJY291dCA8PCBlbmQuZ2V0TWVhbigpIDw8ICIgIiA8PCBlbmQucXVhbnRpbCgwLjIpIDw8ICIgIiAKLQkJICA8PCBlbmQucXVhbnRpbCgwLjc5KSA8PCAiICAiIDw8IGxhdWZ6ZWl0LmdldE1lYW4oKSA8PCAiICIgCi0JCSAgPDwgZW5kLnF1YW50aWwoMC4wKSA8PCAiICIgPDwgZW5kLmdldFNpZ21hKCkgPDwgIiAiIAotCQkgIDw8IGVuZC5nZXRTaWdtYVNtYWxsZXIoKSA8PCAiICIgPDwgZW5kLmdldFNpZ21hQmlnZ2VyKCkgCi0JCSAgPDwgIiAiIDw8IG5vdyA8PCBlbmRsOwotCSAgICAgIH0KLQkgIH0KLQlpZiggcHJpbnQgKQotCSAgY291dCA8PCAiI1BhcmFtZXRlciBNaXR0ZWx3ZXJ0IDAuMi1RdWFudGlsIDAuOC1RdWFudGlsIExhdWZ6ZWl0ICIKLQkgICAgICAgICAgIkJlc3RlciBTaWdtYSBTaWdtYVNtYWxsZXIgU2lnbWFCaWdnZXJcbiI7Ci0JZGVmYXVsdE11bHRpcGxlPTIuMDsKLQlyZXR1cm4gYmVzdFBhcjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBjZXJyIDw8ICJFcnJvcjogd3JvbmcgcGFyYW1ldGVyLXR5cGUgaW4gUlJUT3B0aW1pemF0aW9uOjpvcHRpbWl6ZVZhbHVlICgiCi0JPDwgdHlwIDw8ICIpXG4iOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0JcmV0dXJuIDFlMTAwOwotfQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1JSVE9wdGltaXphdGlvbi5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvUlJUT3B0aW1pemF0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZWM2ZTIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvUlJUT3B0aW1pemF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0KLQotCi0jaWZuZGVmIFJSVE9QVElNSVpBVElPTgotI2RlZmluZSBSUlRPUFRJTUlaQVRJT04KLSNpbmNsdWRlICJJdGVyT3B0aW1pemF0aW9uLmgiCi0KLWNsYXNzIFJSVE9wdGltaXphdGlvbiA6IHB1YmxpYyBJdGVyT3B0aW1pemF0aW9uIHsKLSAgCi0KLSAgIHByaXZhdGU6Ci0gICAgIGRvdWJsZSBkZXZpYXRpb247ICAgICAgIAotICAgICBkb3VibGUgZGVsdGFEZXZpYXRpb247ICAKLSAgICAgZG91YmxlIHJlY29yZDsgICAgICAgICAgCi0KLSAgIHByb3RlY3RlZDoKLSAgICAgIHZpcnR1YWwgdm9pZCB6SW5pdGlhbGl6ZSgpOwotICAgICAKLQotICAgICAgdmlydHVhbCBzaG9ydCBhY2NlcHQoZG91YmxlIGRlbHRhKTsgCi0gICAgIAotICAgICAKLSAgICAgIHZpcnR1YWwgdm9pZCAgYWJrdWVobGVuKCk7Ci0gICAgIAotCi0gICAgICB2aXJ0dWFsIHNob3J0IGVuZCgpOwotICAgICAKLQotICAgICAgdmlydHVhbCB2b2lkIG1ha2VHcmFwaE91dHB1dCgpOwotICAgICAKLQotICAgcHVibGljOgotICAgICAgUlJUT3B0aW1pemF0aW9uKFByb2JsZW0gJnAsZG91YmxlIHRlbXBlcmF0dXIsCi0gICAgIGRvdWJsZSBkZWx0YVRlbXBlcmF0dXIsaW50IG1heEl0ZXI9LTEpOwotICAgICAKLQotICAgICAgUlJUT3B0aW1pemF0aW9uKFByb2JsZW0gJnAsaW50IG1heEl0ZXI9LTEpOwotICAgICAKLQotICAgICAgUlJUT3B0aW1pemF0aW9uKFJSVE9wdGltaXphdGlvbiAmbyk7Ci0gICAgIAotCi0gICAgICBzdGF0aWMgZG91YmxlIG9wdGltaXplVmFsdWUoUHJvYmxlbSAmcCxpbnQgcHJvUGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgIGludCBudW1QYXJhbWV0ZXIsaW50IHR5cCxpbnQgc2Nocml0dGU9IC0xLGludCB2ZXJib3NlPTEpOwotICAgICAKLQotICAgICBzdGF0aWMgZG91YmxlIGRlZmF1bHRBbm5SYXRlOyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgIHN0YXRpYyBkb3VibGUgZGVmYXVsdE11bHRpcGxlOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvU0FPcHRpbWl6YXRpb24uY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvU0FPcHRpbWl6YXRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWU1ODlhLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1NBT3B0aW1pemF0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICJTQU9wdGltaXphdGlvbi5oIgotCi0jaW5jbHVkZSAiUHJvYmxlbVRlc3QuaCIKLQotI2RlZmluZSBBTFBIQSAwLjk1IAotCi1kb3VibGUgU0FPcHRpbWl6YXRpb246OmRlZmF1bHRBbmZBbm5SYXRlPTAuOTsKLWRvdWJsZSBTQU9wdGltaXphdGlvbjo6ZGVmYXVsdEVuZEFublJhdGU9MWUtOTsKLWRvdWJsZSBTQU9wdGltaXphdGlvbjo6ZGVmYXVsdE11bHRpcGxlPTIuMDsKLQotCi0gICAgIAotU0FPcHRpbWl6YXRpb246OlNBT3B0aW1pemF0aW9uKFByb2JsZW0gJnAsaW50IG0pCi06IEl0ZXJPcHRpbWl6YXRpb24ocCxtKSwgdGVtcGVyYXR1cigtMSkKLXsKLX0KLQotCi0KLSAgICAgCi1TQU9wdGltaXphdGlvbjo6U0FPcHRpbWl6YXRpb24oUHJvYmxlbSAmcCxkb3VibGUgdCxkb3VibGUgYSxpbnQgcyxpbnQgbSkgCi06IEl0ZXJPcHRpbWl6YXRpb24ocCxtKSx0ZW1wZXJhdHVyKHQpLCBhbHBoYShhKSxzY2hyaXR0emFobChzKQotewotICBhc3NlcnQoYWxwaGE8MSk7Ci0gIGFzc2VydChzY2hyaXR0emFobD4wKTsKLSAgYXNzZXJ0KHQ+MCk7Ci19Ci0KLSAgICAgCi1TQU9wdGltaXphdGlvbjo6U0FPcHRpbWl6YXRpb24oU0FPcHRpbWl6YXRpb24gJm8pCi06IEl0ZXJPcHRpbWl6YXRpb24obykKLXsKLSAgdGVtcGVyYXR1ciA9IG8udGVtcGVyYXR1cjsKLSAgZW5kVGVtcGVyYXR1ciA9IG8uZW5kVGVtcGVyYXR1cjsKLSAgYWxwaGEgPSBvLmFscGhhOwotICBzY2hyaXR0emFobCA9IG8uc2Nocml0dHphaGw7Ci0gIHN0ZXBzRm9yQWJrdWVobHVuZyA9IG8uc3RlcHNGb3JBYmt1ZWhsdW5nOwotfQotCi0gICAgIAotdm9pZCBTQU9wdGltaXphdGlvbjo6ekluaXRpYWxpemUoKQotewotICBJdGVyT3B0aW1pemF0aW9uOjp6SW5pdGlhbGl6ZSgpOwotICBpZiggdGVtcGVyYXR1cjwwKQotICAgIHsgCi0gICAgICAKLQotICAgICAgCi0gICAgICBTdGF0VmFyICZ2PXByb2JsZW0uZGV2aWF0aW9uU3RhdFZhcigqdGhpcyxBTlpfVkVSU0NITEVDSFRFUlVOR0VOKTsgCi0KLSAgICAgIGlmKCBtYXhTdGVwPjAgKQotCXN0ZXBzRm9yQWJrdWVobHVuZz0oaW50KShtYXhTdGVwKjQuMC81LjApOyAKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIAotCW1heFN0ZXA9c3RlcHNGb3JBYmt1ZWhsdW5nPShpbnQpKHByb2JsZW0uZXhwZWN0ZWROdW1iZXJPZkl0ZXJhdGlvbnMoKSoKLQkJCQkgZGVmYXVsdE11bHRpcGxlKTsKLSAgICAgIAotICAgICAgdGVtcGVyYXR1ciAgICA9IHYuZ2V0TWVhbigpL2xvZygxL2RlZmF1bHRBbmZBbm5SYXRlKTsKLSAgICAgIGVuZFRlbXBlcmF0dXIgPSB2LmdldE1lYW4oKS9sb2coMS9kZWZhdWx0RW5kQW5uUmF0ZSk7Ci0gICAgICBzY2hyaXR0emFobCA9IChpbnQpKHN0ZXBzRm9yQWJrdWVobHVuZy8obG9nKGVuZFRlbXBlcmF0dXIvdGVtcGVyYXR1cikvCi0JCQkJCSAgICAgIGxvZyhBTFBIQSkpKTsKLSAgICAgIGlmKHNjaHJpdHR6YWhsPT0wKXNjaHJpdHR6YWhsPTE7Ci0gICAgICBhbHBoYSAgICAgICA9IEFMUEhBOwotICAgICAgCi0gICAgICBpZiggdmVyYm9zZU1vZGUgKQotCWNvdXQgPDwgIiNBbGdvcml0aG06IFNpbXVsYXRlZCBBbm5lYWxpbmcoYW5mQW5uUmF0ZT0iIAotCSAgPDwgZGVmYXVsdEFuZkFublJhdGUgPDwiLChlbmRBbm5SYXRlPSIgPDwgZGVmYXVsdEVuZEFublJhdGUgCi0JICA8PCAiLFQwPSIgPDwgdGVtcGVyYXR1cjw8ICIsVGU9IiA8PCBlbmRUZW1wZXJhdHVyPDwgIixzY2hyaXR0emFobD0iIAotICAgICAgICAgIDw8IHNjaHJpdHR6YWhsPDwgIixzdGVwc0ZvckFia3VlaGx1bmc9IiA8PCBzdGVwc0ZvckFia3VlaGx1bmcgCi0JICA8PCAiKVxuIjsKLSAgICAgIGN1clN0ZXA9MDsKLSAgICAgIGVuZEZsYWc9MDsKLSAgICAgIGRlbGV0ZSAmdjsKLSAgICAgIHByb2JsZW0uaW5pdGlhbGl6ZSgpOwotICAgICAgSXRlck9wdGltaXphdGlvbjo6ekluaXRpYWxpemUoKTsKLSAgICB9Ci19Ci0KLXNob3J0IFNBT3B0aW1pemF0aW9uOjplbmQoKQotewotICBpZiggdGVtcGVyYXR1cj5lbmRUZW1wZXJhdHVyICkKLSAgICBiZXN0U3RlcCA9IGN1clN0ZXA7Ci0gIGlmKCBlbmRGbGFnPjAgJiYgIHRlbXBlcmF0dXI8ZW5kVGVtcGVyYXR1cikKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotdm9pZCAgU0FPcHRpbWl6YXRpb246OmFia3VlaGxlbigpCi17Ci0gIGlmKHRlbXBlcmF0dXI+PTApCi0gICAgewotICAgICAgaWYoIGN1clN0ZXAlc2Nocml0dHphaGwgPT0gMCApCi0JdGVtcGVyYXR1cj10ZW1wZXJhdHVyICogYWxwaGE7Ci0gICAgICBpZiggY3VyU3RlcD4gc3RlcHNGb3JBYmt1ZWhsdW5nKQotCXRlbXBlcmF0dXIgPSAwOwotICAgIH0KLX0KLXNob3J0IFNBT3B0aW1pemF0aW9uOjphY2NlcHQoZG91YmxlIGRlbHRhKQotewotICBpZiggdGVtcGVyYXR1cjwwICkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmKCBkZWx0YSA+IDAgKQotCXsKLQkgIGlmKCB0ZW1wZXJhdHVyPT0wICkKLQkgICAgcmV0dXJuIDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBkb3VibGUgej16dWZhbGwwMSgpOwotCSAgICAgIGFzc2VydCh6IT0wLjApOwotCQkgIGlmKHo9PTAuMCkKLQkJICAJeis9MWUtMjA7Ci0JICAgICAgZG91YmxlIGU9ZXhwKC1kZWx0YS90ZW1wZXJhdHVyKTsKLQkgICAgICAKLQkgICAgICAKLQkgICAgICAKLQkgICAgICByZXR1cm4geiswLjAwMDAwMDAwMDAwMTw9ZTsgCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotfQotCi12b2lkIFNBT3B0aW1pemF0aW9uOjptYWtlR3JhcGhPdXRwdXQoKQotewotICBJdGVyT3B0aW1pemF0aW9uOjptYWtlR3JhcGhPdXRwdXQoKTsKLSAgKkdyYXBoT3V0cHV0IDw8IHRlbXBlcmF0dXI7Ci19Ci0KLQotCi0gICAgIAotZG91YmxlIFNBT3B0aW1pemF0aW9uOjpvcHRpbWl6ZVZhbHVlKFByb2JsZW0gJnAsaW50IHByb1BhcmFtZXRlcixpbnQgbnVtUGFyYW1ldGVyLAotCQkJIGludCB0eXAsaW50IG9wdGltaWVydW5nc3NjaHJpdHRlLGludCBwcmludCkKLXsKLSAgc3dpdGNoKHR5cCkKLSAgICB7Ci0gICAgY2FzZSAxOiAKLSAgICAgIHsKLQlkb3VibGUgYmVzdFBhcj0tMSxiZXN0PTFlMTAwOwotCWRvdWJsZSBub3c7Ci0JaWYoIHByaW50ICkKLQljb3V0IDw8ICIjU0Etb3B0aW1pemVWYWx1ZXM6IGRlZmF1bHRBbmZBbm5SYXRlIiA8PCBlbmRsOwotCWZvcihpbnQgaT0wO2k8bnVtUGFyYW1ldGVyO2krKykKLQkgIHsKLQkgICAgU3RhdFZhciBlbmQsbGF1ZnplaXQsaW5pdDsKLQkgICAgZGVmYXVsdEFuZkFublJhdGU9MC4xICsgKDEuMC9udW1QYXJhbWV0ZXIpKmk7Ci0JICAgIHNvbHZlUHJvYmxlbSgwLHAscHJvUGFyYW1ldGVyLG9wdGltaWVydW5nc3NjaHJpdHRlLFNBX09QVCxub3csCi0JCQkgZW5kLGxhdWZ6ZWl0LGluaXQpOwotCSAgICBpZiggYmVzdD5ub3cgKQotCSAgICAgIHsKLQkJYmVzdD1ub3c7Ci0JCWJlc3RQYXI9ZGVmYXVsdEFuZkFublJhdGU7Ci0JICAgICAgfQotCSAgICBpZiggcHJpbnQgKQotCSAgICAgIHsKLQkJY291dCA8PCBkZWZhdWx0QW5mQW5uUmF0ZSA8PCAiICI7Ci0JCWNvdXQgPDwgZW5kLmdldE1lYW4oKSA8PCAiICIgPDwgZW5kLnF1YW50aWwoMC4yKSA8PCAiICIgCi0JCSAgPDwgZW5kLnF1YW50aWwoMC43OSkgPDwgIiAgIiA8PCBsYXVmemVpdC5nZXRNZWFuKCkgPDwgIiAiIAotCQkgIDw8IGVuZC5xdWFudGlsKDAuMCkgPDwgIiAiIDw8IGVuZC5nZXRTaWdtYSgpIDw8ICIgIiAKLQkJICA8PCBlbmQuZ2V0U2lnbWFTbWFsbGVyKCkgPDwgIiAiIDw8IGVuZC5nZXRTaWdtYUJpZ2dlcigpIAotCQkgIDw8ICIgIiA8PCBub3cgPDwgZW5kbDsKLQkgICAgICB9Ci0JICB9Ci0JaWYoIHByaW50ICkKLQkgIGNvdXQgPDwgIiNQYXJhbWV0ZXIgTWl0dGVsd2VydCAwLjItUXVhbnRpbCAwLjgtUXVhbnRpbCBMYXVmemVpdCAiCi0JICAgICAgICAgICJCZXN0ZXIgU2lnbWEgU2lnbWFTbWFsbGVyIFNpZ21hQmlnZ2VyXG4iOwotCWRlZmF1bHRBbmZBbm5SYXRlPTAuOTsKLQlyZXR1cm4gYmVzdFBhcjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjogCi0gICAgICB7Ci0JZG91YmxlIGJlc3RQYXI9LTEsYmVzdD0xZTEwMDsKLQlkb3VibGUgbm93OwotCWlmKCBwcmludCApCi0JICBjb3V0IDw8ICIjT3B0aW1pZXJ1bmcgdm9uIFNBOiBkZWZhdWx0RW5kQW5uUmF0ZSIgPDwgZW5kbDsKLQlmb3IoaW50IGk9MTtpPD1udW1QYXJhbWV0ZXI7aSsrKQotCSAgewotCSAgICBTdGF0VmFyIGVuZCxsYXVmemVpdCxpbml0OwotCSAgICBkZWZhdWx0RW5kQW5uUmF0ZT0xLyhwb3coMTAuMCxpKSk7Ci0JICAgIHNvbHZlUHJvYmxlbSgwLHAscHJvUGFyYW1ldGVyLG9wdGltaWVydW5nc3NjaHJpdHRlLFNBX09QVCxub3csZW5kLAotCQkJIGxhdWZ6ZWl0LGluaXQpOwotCSAgICBpZiggYmVzdD5ub3cgKQotCSAgICAgIHsKLQkJYmVzdD1ub3c7Ci0JCWJlc3RQYXI9ZGVmYXVsdEVuZEFublJhdGU7Ci0JICAgICAgfQotCSAgICBpZiggcHJpbnQgKQotCSAgICAgIHsKLQkJY291dCA8PCBkZWZhdWx0RW5kQW5uUmF0ZSA8PCAiICI7Ci0JCWNvdXQgPDwgZW5kLmdldE1lYW4oKSA8PCAiICIgPDwgZW5kLnF1YW50aWwoMC4yKSA8PCAiICIgCi0JCSAgPDwgZW5kLnF1YW50aWwoMC43OSkgPDwgIiAgIiA8PCBsYXVmemVpdC5nZXRNZWFuKCkgPDwgIiAiIAotCQkgIDw8IGVuZC5xdWFudGlsKDAuMCkgPDwgIiAiIDw8IGVuZC5nZXRTaWdtYSgpIDw8ICIgIiAKLQkJICA8PCBlbmQuZ2V0U2lnbWFTbWFsbGVyKCkgPDwgIiAiIDw8IGVuZC5nZXRTaWdtYUJpZ2dlcigpIAotCQkgIDw8ICIgIiA8PCBub3cgPDwgZW5kbDsKLQkgICAgICB9Ci0JICB9Ci0JaWYoIHByaW50ICkKLQkgIGNvdXQgPDwgIiNQYXJhbWV0ZXIgTWl0dGVsd2VydCAwLjItUXVhbnRpbCAwLjgtUXVhbnRpbCBMYXVmemVpdCAiCi0JICAgICAgICAgICJCZXN0ZXIgU2lnbWEgU2lnbWFTbWFsbGVyIFNpZ21hQmlnZ2VyXG4iOwotCWRlZmF1bHRFbmRBbm5SYXRlPTEvMTAwMDAuMDsKLQlyZXR1cm4gYmVzdFBhcjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTA6IAotICAgICAgewotCWRvdWJsZSBiZXN0UGFyPS0xLGJlc3Q9MWUxMDA7Ci0JCi0JaWYoIHByaW50ICkKLQkgIGNvdXQgPDwgIiNTQS1vcHRpbWl6ZVZhbHVlczogZGVmYXVsdE11bHRpcGxlICIgPDwgOCA8PCBlbmRsOwotCWZvcihpbnQgaT0xO2k8PTY7aSsrKQotCSAgewotCSAgICBTdGF0VmFyIGVuZCxsYXVmemVpdCxpbml0OwotCSAgICBkb3VibGUgbm93OwotCSAgICBkZWZhdWx0TXVsdGlwbGUgPSBpOwotCSAgICBzb2x2ZVByb2JsZW0oMCxwLHByb1BhcmFtZXRlcixvcHRpbWllcnVuZ3NzY2hyaXR0ZSxTQV9PUFQsbm93LGVuZCwKLQkJCSBsYXVmemVpdCxpbml0KTsKLQkgICAgaWYoIGJlc3Q+bm93ICkKLQkgICAgICB7Ci0JCWJlc3Q9bm93OwotCQliZXN0UGFyPWRlZmF1bHRNdWx0aXBsZTsKLQkgICAgICB9Ci0JICAgIGlmKCBwcmludCApCi0JICAgICAgewotCQljb3V0IDw8IGRlZmF1bHRNdWx0aXBsZSA8PCAiICI7Ci0JCWNvdXQgPDwgZW5kLmdldE1lYW4oKSA8PCAiICIgPDwgZW5kLnF1YW50aWwoMC4yKSA8PCAiICIgCi0JCSAgPDwgZW5kLnF1YW50aWwoMC43OSkgPDwgIiAgIiA8PCBsYXVmemVpdC5nZXRNZWFuKCkgPDwgIiAiIAotCQkgIDw8IGVuZC5xdWFudGlsKDAuMCkgPDwgIiAiIDw8IGVuZC5nZXRTaWdtYSgpIDw8ICIgIiAKLQkJICA8PCBlbmQuZ2V0U2lnbWFTbWFsbGVyKCkgPDwgIiAiIDw8IGVuZC5nZXRTaWdtYUJpZ2dlcigpIAotCQkgIDw8ICIgIiA8PCBub3cgPDwgZW5kbDsKLQkgICAgICB9Ci0JICB9Ci0JaWYoIHByaW50ICkKLQkgIGNvdXQgPDwgIiNQYXJhbWV0ZXIgTWl0dGVsd2VydCAwLjItUXVhbnRpbCAwLjgtUXVhbnRpbCBMYXVmemVpdCAiCi0JICAgICAgICAgICJCZXN0ZXIgU2lnbWEgU2lnbWFTbWFsbGVyIFNpZ21hQmlnZ2VyXG4iOwotCWRlZmF1bHRNdWx0aXBsZT0yLjA7Ci0JcmV0dXJuIGJlc3RQYXI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgY2VyciA8PCAiRXJyb3I6IHdyb25nIHBhcmFtZXRlci10eXBlIGluIFNBT3B0aW1pemF0aW9uOjpvcHRpbWl6ZVZhbHVlICgiCi0JICAgPDwgdHlwIDw8ICIpXG4iOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0JcmV0dXJuIDFlMTAwOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvU0FPcHRpbWl6YXRpb24uaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1NBT3B0aW1pemF0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YzUyOGIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvU0FPcHRpbWl6YXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0KLQotCi0KLSNpZm5kZWYgU0FPUFRJTUlaQVRJT04KLSNkZWZpbmUgU0FPUFRJTUlaQVRJT04KLSNpbmNsdWRlICJJdGVyT3B0aW1pemF0aW9uLmgiCi0KLWNsYXNzIFNBT3B0aW1pemF0aW9uIDogcHVibGljIEl0ZXJPcHRpbWl6YXRpb24KLQl7Ci0gIAotCi0gICBwcml2YXRlOgotICAgICBkb3VibGUgdGVtcGVyYXR1cjsgICAgICAgCi0gICAgIGRvdWJsZSBlbmRUZW1wZXJhdHVyOyAgICAKLSAgICAgZG91YmxlIGFscGhhOyAgICAgICAgICAgIAotICAgICBpbnQgIHNjaHJpdHR6YWhsOyAgICAgIAotICAgICBpbnQgIHN0ZXBzRm9yQWJrdWVobHVuZzsKLQotICAgcHJvdGVjdGVkOgotICAgICAgdmlydHVhbCB2b2lkIHpJbml0aWFsaXplKCk7IAotICAgICAKLQotICAgICAgdmlydHVhbCBzaG9ydCBhY2NlcHQoZG91YmxlIGRlbHRhKTsgCi0gICAgIAotICAgICAKLSAgICAgIHZpcnR1YWwgdm9pZCAgYWJrdWVobGVuKCk7Ci0gICAgIAotCi0gICAgICB2aXJ0dWFsIHNob3J0IGVuZCgpOwotICAgICAKLQotICAgICAgdmlydHVhbCB2b2lkIG1ha2VHcmFwaE91dHB1dCgpOwotICAgICAKLQotICAgcHVibGljOgotICAgICAgU0FPcHRpbWl6YXRpb24oUHJvYmxlbSAmcCxkb3VibGUgdGVtcGVyYXR1cixkb3VibGUgYWxwaGEsCi0JCQkJaW50IHNjaHJpdHR6YWhsLGludCBtYXhJdGVyPS0xKTsKLSAgICAgCi0KLSAgICAgIFNBT3B0aW1pemF0aW9uKFByb2JsZW0gJnAsaW50IG1heEl0ZXI9LTEpOwotICAgICAKLQotICAgICAgU0FPcHRpbWl6YXRpb24oU0FPcHRpbWl6YXRpb24gJm8pOwotICAgICAKLQotICAgICAgc3RhdGljIGRvdWJsZSBvcHRpbWl6ZVZhbHVlKFByb2JsZW0gJnAsaW50IHByb1BhcmFtZXRlciwKLQkJCQkgICAgICBpbnQgbnVtUGFyYW1ldGVyLGludCB0eXAsCi0JCQkJICAgICAgaW50IHNjaHJpdHRlPSAtMSxpbnQgdmVyYm9zZT0xKTsKLSAgICAgCi0KLSAgICAgc3RhdGljIGRvdWJsZSBkZWZhdWx0QW5mQW5uUmF0ZTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgc3RhdGljIGRvdWJsZSBkZWZhdWx0RW5kQW5uUmF0ZTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgc3RhdGljIGRvdWJsZSBkZWZhdWx0TXVsdGlwbGU7ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotfTsgICAgIAotI2VuZGlmICAgICAKLSAgICAgCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9TdGF0VmFyLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1N0YXRWYXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmQ3NmNkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1N0YXRWYXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0jaW5jbHVkZSAiU3RhdFZhci5oIgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1kb3VibGUgY29tcGFyZVN0YXRWYXJRdWFudGlsPS0xOyAKLQotU3RhdFY6On5TdGF0VigpIHt9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLWludCBkb3VibGVjb21wYXJlKGNvbnN0IHZvaWQgKnAsY29uc3Qgdm9pZCAqaikKLXsKLSAgaWYoICooZG91YmxlICopcCA9PSAqKGRvdWJsZSAqKWopCi0gICAgcmV0dXJuIDA7Ci0gIGlmKCAqKGRvdWJsZSAqKXAtICooZG91YmxlICopajwwICkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IGNvbXBhcmVTdGF0VmFyKGNvbnN0IHZvaWQgKnAsY29uc3Qgdm9pZCAqaikKLXsKLSAgZG91YmxlIGE7Ci0gIGRvdWJsZSBiOwotICBpZihjb21wYXJlU3RhdFZhclF1YW50aWw+PTApCi0gICAgewotICAgICAgYT0oKFN0YXRWYXIgKilwKS0+cXVhbnRpbChjb21wYXJlU3RhdFZhclF1YW50aWwpOwotICAgICAgYj0oKFN0YXRWYXIgKilqKS0+cXVhbnRpbChjb21wYXJlU3RhdFZhclF1YW50aWwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGE9KChTdGF0VmFyICopcCktPmdldE1lYW4oKTsKLSAgICAgIGI9KChTdGF0VmFyICopaiktPmdldE1lYW4oKTsKLSAgICB9Ci0gIGlmKGE9PWIpCi0gICAgcmV0dXJuIDA7Ci0gIGlmKGE8YikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UKLSAgICByZXR1cm4gKzE7Ci19Ci0KLQotZG91YmxlIFN0YXRWYXI6OmdldFNpZ21hU21hbGxlcigpCi17Ci0gIGRvdWJsZSBzcz0wOwotICBpbnQgbnM9MDsKLSAgZm9yKGludCBpPTA7aTxuO2krKykKLSAgICB7Ci0gICAgICBpZiggdmFsdWVzW2ldPGdldE1lYW4oKSApCi0JewotCSAgc3MrPSh2YWx1ZXNbaV0tZ2V0TWVhbigpKSoodmFsdWVzW2ldLWdldE1lYW4oKSk7Ci0JICBucysrOwotCX0KLSAgICB9Ci0gIGlmKCBzcy9ucz4wICkKLSAgICByZXR1cm4gc3FydChzcy9ucyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLWRvdWJsZSBTdGF0VmFyOjpnZXRTaWdtYUJpZ2dlcigpCi17Ci0gIGRvdWJsZSBzcz0wOwotICBpbnQgbnM9MDsKLSAgZm9yKGludCBpPTA7aTxuO2krKykKLSAgICBpZiggdmFsdWVzW2ldPmdldE1lYW4oKSApCi0gICAgICB7Ci0Jc3MrPSh2YWx1ZXNbaV0tZ2V0TWVhbigpKSoodmFsdWVzW2ldLWdldE1lYW4oKSk7Ci0JbnMrKzsKLSAgICAgIH0KLSAgaWYoIHNzL25zPjAgKQotICAgIHJldHVybiBzcXJ0KHNzL25zKTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0KLSAgCi12b2lkIFN0YXRWOjpkdW1wT24ob3N0cmVhbSAmc3RybSkKLXsKLSAgc3RybSA8PCAiTUVBTjogIiA8PCBnZXRNZWFuKCkgPDwgIiAoIiA8PCBzbWFsbGVzdCA8PCAiLSIgPDwgYmlnZ2VzdCAKLSAgICA8PCAiKSAgU0lHTUE6IiA8PCBnZXRTaWdtYSgpPDwgIiAgICI7Ci19Ci0KLQotICAKLWRvdWJsZSBTdGF0VmFyOjpxdWFudGlsKGRvdWJsZSBwZXJjZW50KQotewotICBpbnQgaW5kZXg9KGludCkobipwZXJjZW50KTsKLSAgaWYoaW5kZXg9PW4pCi0gICAgaW5kZXg9bi0xOwotICBhc3NlcnQoaW5kZXg+PTAmJmluZGV4PG4pOwotICBpZihzb3J0ZWRGbGFnPT0wKQotICAgIHsKLSAgICAgIHFzb3J0KHZhbHVlcy5nZXRQb2ludGVyVG9EYXRhKCksbixzaXplb2YoZG91YmxlKSxkb3VibGVjb21wYXJlKTsKLSAgICAgIGFzc2VydChuPD12YWx1ZXMuc2l6ZSgpKTsKLSAgICAgIHNvcnRlZEZsYWc9MTsKLSAgICB9Ci0gIGlmKGluZGV4PDApCi0gICAgewotICAgICAgY2VyciA8PCAiV0FSTklORzogU3RhdFZhci5jY1xuIjsKLSAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIHZhbHVlc1tpbmRleF07Ci19Ci0KLSAgCi12b2lkIFN0YXRWYXI6OnByaW50VmFsdWVzKG9zdHJlYW0gJnN0cm0pCi17Ci0gIHFzb3J0KHZhbHVlcy5nZXRQb2ludGVyVG9EYXRhKCksbixzaXplb2YoZG91YmxlKSxkb3VibGVjb21wYXJlKTsKLSAgYXNzZXJ0KG48PXZhbHVlcy5zaXplKCkpOwotICBmb3IoaW50IGk9MDtpPG47aSsrKQotICAgIHN0cm0gPDwgaS8oZG91YmxlKW4gPDwgIiAiIDw8IHZhbHVlc1tpXSA8PCBlbmRsOwotICByZXR1cm47Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9TdGF0VmFyLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9TdGF0VmFyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjFlMTkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvU3RhdFZhci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0jaWZuZGVmIFNUQVRWQVJfSAotI2RlZmluZSBTVEFUVkFSX0gKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgIkFycmF5LmgiCi0jaW5jbHVkZSAibXlzdGwuaCIKLSNpbmNsdWRlICJteWxlZGEuaCIKLSNpbmNsdWRlIDxjbWF0aD4KLQotCi1leHRlcm4gZG91YmxlIGNvbXBhcmVTdGF0VmFyUXVhbnRpbDsKLWludCBjb21wYXJlU3RhdFZhcihjb25zdCB2b2lkICpwLGNvbnN0IHZvaWQgKmopOwotCi1jbGFzcyBTdGF0VgotICAKLXsKLSBwcm90ZWN0ZWQ6Ci0gIGludCBuOyAgICAgICAgICAgICAgICAgICAgCi0gIGRvdWJsZSBzdW07ICAgICAgICAgICAgICAgCi0gIGRvdWJsZSBzcXVhcmVTdW07ICAgICAgICAgCi0gIGRvdWJsZSBzbWFsbGVzdCxiaWdnZXN0OyAgCi0KLSBwdWJsaWM6Ci0gIGNvbnN0IGNoYXIgKnRpdGxlOyAgICAgCi0gIFN0YXRWKCkgOiBuKDApLHN1bSgwKSxzcXVhcmVTdW0oMCksc21hbGxlc3QoMWUxMDApLGJpZ2dlc3QoLTFlMTAwKSx0aXRsZSgiIikge30KLSAgdmlydHVhbCB+U3RhdFYoKTsKLSAgCi0KLSAgdmlydHVhbCB2b2lkIGFkZFZhbHVlKGRvdWJsZSBhKQotICAgIHsKLSAgICAgIG4rKzsKLSAgICAgIHN1bSs9YTsKLSAgICAgIHNxdWFyZVN1bSs9YSphOwotICAgICAgaWYoc21hbGxlc3Q+YSkKLQlzbWFsbGVzdD1hOwotICAgICAgaWYoYmlnZ2VzdDxhKQotCWJpZ2dlc3Q9YTsKLSAgICAgIAotICAgIH0KLSAgCi0KLSAgZG91YmxlIGdldE1lYW4oKQotICAgIHsgcmV0dXJuIHN1bS9uOyB9Ci0gIAotCi0gIGRvdWJsZSBnZXRTaWdtYSgpCi0gICAgewotICAgICAgaWYoc3F1YXJlU3VtL24gLSBnZXRNZWFuKCkqZ2V0TWVhbigpPD0wKQotCXJldHVybiAwLjA7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHNxcnQoc3F1YXJlU3VtL24gLSBnZXRNZWFuKCkqZ2V0TWVhbigpKTsKLSAgICB9Ci0KLSAgCi0KLSAgZG91YmxlIGdldEJpZ2dlc3QoKQotICAgIHsgcmV0dXJuIGJpZ2dlc3Q7IH0KLSAgCi0KLSAgZG91YmxlIGdldFNtYWxsZXN0KCkKLSAgICB7IHJldHVybiBzbWFsbGVzdDsgfQotICAKLQotICBpbnQgZ2V0TnVtKCkKLSAgICB7IHJldHVybiBuOyB9Ci0gIAotCi0gIHZvaWQgZHVtcE9uKG9zdHJlYW0gJnN0cm0pOwotICAKLQotfTsKLQotY2xhc3MgU3RhdFZhciA6IHB1YmxpYyBTdGF0VgotewotIHByaXZhdGU6Ci0gIEFycmF5PGRvdWJsZT4gdmFsdWVzOyAgICAKLSAgc2hvcnQgc29ydGVkRmxhZzsgICAgICAgCi0gcHVibGljOgotICBTdGF0VmFyKCkgCi0gICAgOiB2YWx1ZXMoMTAsMC4wLDEpLHNvcnRlZEZsYWcoMCkge30KLSAgdmlydHVhbCB+U3RhdFZhcigpe30KLSAgZG91YmxlIHF1YW50aWwoZG91YmxlIHBlcmNlbnQ9MC41KTsKLSAgCi0gIAotICBpbmxpbmUgZG91YmxlIHZhbHVlKGludCBpKQotICAgIHtyZXR1cm4gdmFsdWVzW2ldO30KLSAgCi0KLSAgdm9pZCBwcmludFZhbHVlcyhvc3RyZWFtICZzdHJtKTsKLSAgCi0KLSAgdmlydHVhbCB2b2lkIGFkZFZhbHVlKGRvdWJsZSBhKQotICAgIHsgIAotICAgICAgc29ydGVkRmxhZz0wOwotICAgICAgdmFsdWVzW25dPWE7Ci0gICAgICBTdGF0Vjo6YWRkVmFsdWUoYSk7Ci0gICAgfQotICAKLSAgZG91YmxlIGdldFNpZ21hU21hbGxlcigpOwotICAKLQotICBkb3VibGUgZ2V0U2lnbWFCaWdnZXIoKTsKLSAgCi0KLX07Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9UQU9wdGltaXphdGlvbi5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9UQU9wdGltaXphdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NGZmNjIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvVEFPcHRpbWl6YXRpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0KLSNpbmNsdWRlICJUQU9wdGltaXphdGlvbi5oIgotI2luY2x1ZGUgIlByb2JsZW1UZXN0LmgiCi0KLQotZG91YmxlIFRBT3B0aW1pemF0aW9uOjpkZWZhdWx0QW5uUmF0ZT0wLjQ7Ci1kb3VibGUgVEFPcHRpbWl6YXRpb246OmRlZmF1bHRNdWx0aXBsZT0yLjA7Ci0KLSAgICAgCi1UQU9wdGltaXphdGlvbjo6VEFPcHRpbWl6YXRpb24oUHJvYmxlbSAmcCxkb3VibGUgdCxkb3VibGUgZCxpbnQgbSkgCi06IEl0ZXJPcHRpbWl6YXRpb24ocCxtKSAsIHRlbXBlcmF0dXIodCkgLCBkZWx0YVRlbXBlcmF0dXIoZCkKLXsKLSAgYXNzZXJ0KHQ+MCAmJiBkPjApOwotfQotCi0KLSAgICAgCi1UQU9wdGltaXphdGlvbjo6VEFPcHRpbWl6YXRpb24oUHJvYmxlbSZwLGludCBtKQotOiBJdGVyT3B0aW1pemF0aW9uKHAsbSksIHRlbXBlcmF0dXIoLTEpCi17Ci19Ci0KLQotICAgICAKLVRBT3B0aW1pemF0aW9uOjpUQU9wdGltaXphdGlvbihUQU9wdGltaXphdGlvbiAmbykKLTogSXRlck9wdGltaXphdGlvbihvKQotewotICB0ZW1wZXJhdHVyPSBvLnRlbXBlcmF0dXI7Ci0gIGRlbHRhVGVtcGVyYXR1cj0gby5kZWx0YVRlbXBlcmF0dXI7Ci19Ci0KLQotCi0gICAgIAotdm9pZCBUQU9wdGltaXphdGlvbjo6ekluaXRpYWxpemUoKQotewotICBJdGVyT3B0aW1pemF0aW9uOjp6SW5pdGlhbGl6ZSgpOwotICBpZiggdGVtcGVyYXR1cjwwKQotICAgIHsgCi0gICAgICAKLSAgICAgIAotICAgICAgaW50IG47Ci0gICAgICAKLSAgICAgIFN0YXRWYXIgJnY9cHJvYmxlbS5kZXZpYXRpb25TdGF0VmFyKCp0aGlzLEFOWl9WRVJTQ0hMRUNIVEVSVU5HRU4pOyAKLQotICAgICAgaWYobWF4U3RlcD4wKSAKLQluPShpbnQpKG1heFN0ZXAqNC4wLzUuMCk7ICAgIAotICAgICAgZWxzZSAgICAgICAgICAgIAotCW1heFN0ZXA9bj0oaW50KShwcm9ibGVtLmV4cGVjdGVkTnVtYmVyT2ZJdGVyYXRpb25zKCkqZGVmYXVsdE11bHRpcGxlKTsKLSAgICAgIAotICAgICAgdGVtcGVyYXR1ciAgICAgID0gdi5xdWFudGlsKGRlZmF1bHRBbm5SYXRlKTsKLSAgICAgIGRlbHRhVGVtcGVyYXR1ciA9IHRlbXBlcmF0dXIvbjsKLSAgCi0gICAgICBpZiggdmVyYm9zZU1vZGU+MCApCi0JY291dCA8PCAiI1RBOiAoYW5mQW5uUmF0ZT0iIAotCSAgPDwgZGVmYXVsdEFublJhdGUgPDwgIixUPSIgPDwgdGVtcGVyYXR1ciA8PCAiLGRlbHRhVD0iIAotCSAgPDwgZGVsdGFUZW1wZXJhdHVyIDw8ICIpXG4iOwotICAgICAgY3VyU3RlcD0wOwotICAgICAgZW5kRmxhZz0wOwotICAgICAgZGVsZXRlICZ2OwotICAgIH0KLX0KLQotCi1zaG9ydCBUQU9wdGltaXphdGlvbjo6ZW5kKCkKLXsKLSAgCi0gIAotICBpZiggdGVtcGVyYXR1cj4wICkKLSAgICB7Ci0gICAgICBlbmRGbGFnPTA7Ci0gICAgICBiZXN0U3RlcD1jdXJTdGVwOwotICAgIH0KLSAgcmV0dXJuIGVuZEZsYWc+MDsKLX0KLQotc2hvcnQgVEFPcHRpbWl6YXRpb246OmFjY2VwdChkb3VibGUgZGVsdGEpCi17Ci0gIGlmKCB0ZW1wZXJhdHVyPDAgKSAKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgICAgaWYoIGRlbHRhIDwgdGVtcGVyYXR1ciApCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgVEFPcHRpbWl6YXRpb246OmFia3VlaGxlbigpCi17Ci0gIGlmKCB0ZW1wZXJhdHVyPj0wICkKLSAgICB0ZW1wZXJhdHVyPSh0ZW1wZXJhdHVyLWRlbHRhVGVtcGVyYXR1cj4wKT8odGVtcGVyYXR1ci1kZWx0YVRlbXBlcmF0dXIpOjA7Ci19Ci0KLXZvaWQgVEFPcHRpbWl6YXRpb246Om1ha2VHcmFwaE91dHB1dCgpCi17Ci0gIEl0ZXJPcHRpbWl6YXRpb246Om1ha2VHcmFwaE91dHB1dCgpOwotICAqR3JhcGhPdXRwdXQgPDwgdGVtcGVyYXR1cjsKLX0KLQotCi0KLSAgICAgCi1kb3VibGUgVEFPcHRpbWl6YXRpb246Om9wdGltaXplVmFsdWUoUHJvYmxlbSAmcCxpbnQgcHJvUGFyYW1ldGVyLGludCBudW1QYXJhbWV0ZXIsaW50IHR5cCwKLQkJCSBpbnQgb3B0aW1pZXJ1bmdzc2Nocml0dGUsaW50IHByaW50KQotewotICBzd2l0Y2godHlwKQotICAgIHsKLSAgICBjYXNlIDE6IAotICAgICAgewotCWRvdWJsZSBiZXN0UGFyPS0xLGJlc3Q9MWUxMDA7Ci0JaWYocHJpbnQpY291dCA8PCAiI1RBLW9wdGltaXplVmFsdWVzOiAiIDw8IG51bVBhcmFtZXRlciA8PCBlbmRsOwotCWZvcihpbnQgaT0wO2k8PW51bVBhcmFtZXRlcjtpKyspCi0JICB7Ci0JICAgIFN0YXRWYXIgZW5kLGxhdWZ6ZWl0LGluaXQ7Ci0JICAgIGRvdWJsZSBub3c7Ci0JICAgIGRlZmF1bHRBbm5SYXRlID0gKGZsb2F0KShpKS9udW1QYXJhbWV0ZXI7Ci0JICAgIHNvbHZlUHJvYmxlbSgwLHAscHJvUGFyYW1ldGVyLG9wdGltaWVydW5nc3NjaHJpdHRlLFRBX09QVCxub3csZW5kLAotCQkJIGxhdWZ6ZWl0LGluaXQpOwotCSAgICBpZiggYmVzdD5ub3cgKQotCSAgICAgIHsKLQkJYmVzdD1ub3c7Ci0JCWJlc3RQYXI9ZGVmYXVsdEFublJhdGU7Ci0JICAgICAgfQotCSAgICBpZiggcHJpbnQpCi0JICAgICAgewotCQljb3V0IDw8IGRlZmF1bHRBbm5SYXRlIDw8ICIgIjsKLQkJY291dCA8PCBlbmQuZ2V0TWVhbigpIDw8ICIgIiA8PCBlbmQucXVhbnRpbCgwLjIpIDw8ICIgIiAKLQkJICA8PCBlbmQucXVhbnRpbCgwLjc5KSA8PCAiICAiIDw8IGxhdWZ6ZWl0LmdldE1lYW4oKSA8PCAiICIgCi0JCSAgPDwgZW5kLnF1YW50aWwoMC4wKSA8PCAiICIgPDwgZW5kLmdldFNpZ21hKCkgPDwgIiAiIAotCQkgIDw8IGVuZC5nZXRTaWdtYVNtYWxsZXIoKSA8PCAiICIgPDwgZW5kLmdldFNpZ21hQmlnZ2VyKCkgCi0JCSAgPDwgIiAiIDw8IG5vdyA8PCBlbmRsOwotCSAgICAgIH0KLQkgIH0KLQlpZiggcHJpbnQgKQotCSAgY291dCA8PCAiI01pdHRlbHdlcnQgMC4yLVF1YW50aWwgMC44LVF1YW50aWwgTGF1ZnplaXQgQmVzdGVyIgotCSAgICAgICAgICAiIFNpZ21hIFNpZ21hU21hbGxlciBTaWdtYUJpZ2dlclxuIjsKLQlkZWZhdWx0QW5uUmF0ZT0wLjU7Ci0JcmV0dXJuIGJlc3RQYXI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEwOiAKLSAgICAgIHsKLQlkb3VibGUgYmVzdFBhcj0tMSxiZXN0PTFlMTAwOwotCWlmKCBwcmludCApCi0JICBjb3V0IDw8ICIjVEEtb3B0aW1pemVWYWx1ZXM6IGRlZmF1bHRNdWx0aXBsZSAiIDw8IDEwIDw8IGVuZGw7ICAKLQlmb3IoaW50IGk9MTtpPD02O2krKykKLQkgIHsKLQkgICAgU3RhdFZhciBlbmQsbGF1ZnplaXQsaW5pdDsKLQkgICAgZG91YmxlIG5vdzsKLQkgICAgZGVmYXVsdE11bHRpcGxlID0gaTsKLQkgICAgc29sdmVQcm9ibGVtKDAscCxwcm9QYXJhbWV0ZXIsb3B0aW1pZXJ1bmdzc2Nocml0dGUsVEFfT1BULG5vdywKLQkJCSBlbmQsbGF1ZnplaXQsaW5pdCk7Ci0JICAgIGlmKCBiZXN0Pm5vdyApCi0JICAgICAgewotCQliZXN0PW5vdzsKLQkJYmVzdFBhcj1kZWZhdWx0TXVsdGlwbGU7Ci0JICAgICAgfQotCSAgICBpZiggcHJpbnQgKQotCSAgICAgIHsKLQkJY291dCA8PCBkZWZhdWx0TXVsdGlwbGUgPDwgIiAiOwotCQljb3V0IDw8IGVuZC5nZXRNZWFuKCkgPDwgIiAiIDw8IGVuZC5xdWFudGlsKDAuMikgPDwgIiAiIAotCQkgIDw8IGVuZC5xdWFudGlsKDAuNzkpIDw8ICIgICIgPDwgbGF1ZnplaXQuZ2V0TWVhbigpIDw8ICIgIiAKLQkJICA8PCBlbmQucXVhbnRpbCgwLjApIDw8ICIgIiA8PCBlbmQuZ2V0U2lnbWEoKSA8PCAiICIgCi0JCSAgPDwgZW5kLmdldFNpZ21hU21hbGxlcigpIDw8ICIgIiA8PCBlbmQuZ2V0U2lnbWFCaWdnZXIoKSAKLQkJICA8PCAiICIgPDwgbm93IDw8IGVuZGw7Ci0JICAgICAgfQotCSAgfQotCWlmKCBwcmludCApCi0JICBjb3V0IDw8ICIjTWl0dGVsd2VydCAwLjItUXVhbnRpbCAwLjgtUXVhbnRpbCBMYXVmemVpdCBCZXN0ZXIgU2lnbWEgIgotICAgICAgICAgICAgICAgICAgIiBTaWdtYVNtYWxsZXIgU2lnbWFCaWdnZXJcbiI7Ci0JZGVmYXVsdE11bHRpcGxlPTIuMDsKLQlyZXR1cm4gYmVzdFBhcjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBjZXJyIDw8ICJFcnJvcjogd3JvbmcgcGFyYW1ldGVyLXR5cGUgaW4gVEFPcHRpbWl6YXRpb246Om9wdGltaXplVmFsdWUgKCIKLQkgICA8PCB0eXAgPDwgIilcbiI7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLSAgcmV0dXJuIDFlMTAwOwotfQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1RBT3B0aW1pemF0aW9uLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9UQU9wdGltaXphdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzgyMzA2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL1RBT3B0aW1pemF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotCi0KLQotCi0jaWZuZGVmIFRBT1BUSU1JWkFUSU9OCi0jZGVmaW5lIFRBT1BUSU1JWkFUSU9OCi0KLSNpbmNsdWRlICJJdGVyT3B0aW1pemF0aW9uLmgiCi0KLWNsYXNzIFRBT3B0aW1pemF0aW9uIDogcHVibGljIEl0ZXJPcHRpbWl6YXRpb24gewotICAKLQotICAgcHJpdmF0ZToKLSAgICAgZG91YmxlIHRlbXBlcmF0dXI7ICAgICAgIAotICAgICBkb3VibGUgZGVsdGFUZW1wZXJhdHVyOyAgCi0KLSAgIHByb3RlY3RlZDoKLSAgICAgIHZpcnR1YWwgdm9pZCB6SW5pdGlhbGl6ZSgpOwotICAgICAKLQotICAgICAgdmlydHVhbCBzaG9ydCBhY2NlcHQoZG91YmxlIGRlbHRhKTsgCi0gICAgIAotCi0gICAgICB2aXJ0dWFsIHZvaWQgIGFia3VlaGxlbigpOwotICAgICAKLQotICAgICAgdmlydHVhbCBzaG9ydCBlbmQoKTsKLSAgICAgCi0KLSAgICAgIHZpcnR1YWwgdm9pZCBtYWtlR3JhcGhPdXRwdXQoKTsKLSAgICAgCi0KLSAgIHB1YmxpYzoKLSAgICAgIFRBT3B0aW1pemF0aW9uKFByb2JsZW0gJnAsZG91YmxlIHRlbXBlcmF0dXIsCi0gICAgIGRvdWJsZSBkZWx0YVRlbXBlcmF0dXIsaW50IG1heEl0ZXI9LTEpOwotICAgICAKLQotICAgICAgVEFPcHRpbWl6YXRpb24oUHJvYmxlbSAmcCxpbnQgbWF4SXRlcj0tMSk7Ci0gICAgIAotCi0gICAgICBUQU9wdGltaXphdGlvbihUQU9wdGltaXphdGlvbiAmbyk7Ci0gICAgIAotCi0gICAgICBzdGF0aWMgZG91YmxlIG9wdGltaXplVmFsdWUoUHJvYmxlbSAmcCxpbnQgcHJvUGFyYW1ldGVyLAotICAgICBpbnQgbnVtUGFyYW1ldGVyLGludCB0eXAsaW50IHNjaHJpdHRlPSAtMSxpbnQgdmVyYm9zZT0xKTsKLSAgICAgCi0KLSAgICAgc3RhdGljIGRvdWJsZSBkZWZhdWx0QW5uUmF0ZTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgc3RhdGljIGRvdWJsZSBkZWZhdWx0TXVsdGlwbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL2dlbmVyYWwuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvZ2VuZXJhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiM2YyN2QuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvZ2VuZXJhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLQotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotCi1leHRlcm4gIkMiIHsKLQotI2lmbmRlZiBXSU4zMgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZWxzZQotI2RlZmluZSBzcmFuZDQ4IHNyYW5kCi0jZGVmaW5lIGRyYW5kNDgoKSAocmFuZCgpL1JBTkRfTUFYKQotI2VuZGlmCi0gIAotfQotCi0jaW5jbHVkZSAiZ2VuZXJhbC5oIgotCi1leHRlcm4gIkMiIHsKLSNpZm5kZWYgX19saW51eF9fCi1pbnQgZ2V0cnVzYWdlKGludCB3aG8sIHN0cnVjdCBydXNhZ2UgKnJ1c2FnZSk7Ci0jZW5kaWYKLX07Ci1pbnQgdmVyYm9zZU1vZGU9MDsKLQotI2lmZGVmIGFOZVhUCi0jZGVmaW5lIE5PX1RFTVBMQVRFUwotI2VuZGlmCi0KLQotdm9pZCBteWVycm9yKGludCBsaW5lLGNvbnN0IGNoYXIgKmZpbGUsY29uc3QgY2hhciAqZXhwcmVzc2lvbikKLXsKLSAgY2VyciA8PCAiKGdlbmVyYWwuaCk6QXNzZXJ0aW9uIGZhaWxlZDogJyIgPDwgZXhwcmVzc2lvbiA8PCAgIicgOjo6IGIgIiAKLSAgICA8PCBmaWxlIDw8ICI6IiA8PCBsaW5lIDw8IGVuZGw7Ci19Ci0KLQotdm9pZCBpbXllcnJvcihpbnQgbGluZSxjb25zdCBjaGFyICpmaWxlLGNvbnN0IGNoYXIgKmV4cHJlc3Npb24pCi17Ci0gIGNlcnIgPDwgIkVycm9yOiAnIiA8PCBleHByZXNzaW9uIDw8ICAiJyA6OjogaW4gU291cmNlICIgPDwgZmlsZSAKLSAgICA8PCAiOiIgPDwgbGluZSA8PCBlbmRsOwotICAjaWZuZGVmIERFQlVHCi0gIAotICAjZW5kaWYKLX0KLQotCi0KLXZvaWQgenVmYWxsU2VlZChpbnQgeikKLXsKLSNpZmRlZiBOZVhUCi0gIHNyYW5kb20oeik7Ci0jZWxzZQotICBzcmFuZDQ4KHopOwotI2VuZGlmCi19Ci0KLQotCi1kb3VibGUgenVmYWxsMDEoKQotewotI2lmZGVmIE5lWFQKLSAgcmV0dXJuIChkb3VibGUpKHJhbmRvbSgpJTY1NTM2KS82NTUzNi4wOwotI2Vsc2UKLSAgcmV0dXJuIGRyYW5kNDgoKTsKLSNlbmRpZgotfQotCi0KLQotZG91YmxlIHp1ZmFsbChkb3VibGUgbWluLGRvdWJsZSBtYXgpCi17Ci0gIGRvdWJsZSB6PXp1ZmFsbDAxKCkqKG1heC1taW4pK21pbjsKLSAgYXNzZXJ0KHo+PW1pbiYmejxtYXgpOwotICByZXR1cm4gejsKLX0KLQotCi0KLWludCByYW5kb21JbnQoaW50IGV4Y2x1c2l2ZSkKLXsKLSAgaW50IGk9KGludCl6dWZhbGwoMCxleGNsdXNpdmUpOwotICBhc3NlcnQoaT49MCk7Ci0gIGFzc2VydChpPGV4Y2x1c2l2ZSk7Ci0gIHJldHVybiBpOwotfQotCi1kb3VibGUgY2xvY2tTZWMoKQotewotI2lmZGVmIFdJTjMyCi0JcmV0dXJuIDA7Ci0jZWxzZQotI2lmZGVmIGxpbnV4Ci0gIGVudW0gX19ydXNhZ2Vfd2hvIHdobz1SVVNBR0VfU0VMRjsKLSNlbHNlCi0gIGludCB3aG89UlVTQUdFX1NFTEY7Ci0jZW5kaWYKLSAgc3RydWN0IHJ1c2FnZSBydXNhZ2U7Ci0gIGdldHJ1c2FnZSh3aG8sICZydXNhZ2UpOwotICByZXR1cm4gcnVzYWdlLnJ1X3V0aW1lLnR2X3NlYytydXNhZ2UucnVfdXRpbWUudHZfdXNlYy8xMDAwMDAwLjA7Ci0jZW5kaWYgIAotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvZ2VuZXJhbC5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvZ2VuZXJhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGI0OGFhLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL2dlbmVyYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0KLQotCi0KLQotI2lmbmRlZiBHRU5FUkFMX0hFQURFUgotI2RlZmluZSBHRU5FUkFMX0hFQURFUgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaWZkZWYgTmVYVAotI2luY2x1ZGUgPG1pbm1heC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLQotCi0jZGVmaW5lIE5VTExGTE9BVCh4KQkoIGZhYnMoeCk8PTAuMDAwMDAwMSApCi0jZGVmaW5lIEVRVUFMRkxPQVQoeCx5KQkoIGZhYnMoeC15KTwoZmFicyh4KStmYWJzKHkpKS8xMDAwMDAwMC4wICkKLQotCi0KLQotI2RlZmluZSBURVNUX1JBTkRPTV9TRUVEIDUzMjU2NzQ4NyAKLQotZG91YmxlIHp1ZmFsbDAxKCk7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotZG91YmxlIHp1ZmFsbChkb3VibGUgbWluLGRvdWJsZSBtYXgpOyAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLWludCByYW5kb21JbnQoaW50IGV4Y2x1c2l2ZSk7ICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi12b2lkIHp1ZmFsbFNlZWQoaW50IHogPVRFU1RfUkFORE9NX1NFRUQpOyAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotI2luY2x1ZGUgIm15YXNzZXJ0LmgiCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlICJBcnJheS5oIgotCi0KLQotCi0KLQotZG91YmxlIGNsb2NrU2VjKCk7IAotCi1leHRlcm4gaW50IHZlcmJvc2VNb2RlOwotCi0KLQotaW5saW5lIHN0cmluZyBvcGVyYXRvciYoY29uc3Qgc3RyaW5nJmEsY29uc3Qgc3RyaW5nJmIpCi17Ci0gIHN0cmluZyBjKGEpOwotICBjKz1iOwotICByZXR1cm4gYzsKLX0KLQotCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9ta2Nscy5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9ta2Nscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYmY2OTUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvbWtjbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotI2lmZGVmIFdJTjMyCi0jZGVmaW5lIHN0cmNhc2VjbXAgc3RyY21waQotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiZ2VuZXJhbC5oIgotCi0jaW5jbHVkZSAiS2F0ZWdQcm9ibGVtLmgiCi0jaW5jbHVkZSAiS2F0ZWdQcm9ibGVtVGVzdC5oIgotCi0jaW5jbHVkZSAiUHJvYmxlbVRlc3QuaCIKLSNpbmNsdWRlICJUQU9wdGltaXphdGlvbi5oIgotI2luY2x1ZGUgIkdEQU9wdGltaXphdGlvbi5oIgotI2luY2x1ZGUgIlJSVE9wdGltaXphdGlvbi5oIgotI2luY2x1ZGUgIlNBT3B0aW1pemF0aW9uLmgiCi0jaW5jbHVkZSAiSENPcHRpbWl6YXRpb24uaCIKLQotCi1kb3VibGUgU2lnbWFWZXJmYWVsc2NodW5nPTUuMDsKLWludCBPbmVXaXRoSGFwYXM9MTsKLWNoYXIgKmhhcGF4SW5pdE5hbWU9MDsKLQotCi0KLQotIAotc3RhdGljIGludCBuTGFldWZlPTEsbkxhZXVmZVJlZHVjZT0zOyAKLQotICAKLXN0YXRpYyBpbnQgb3B0aW1pemVQYXJhbWV0ZXJBbnphaGw9MTA7Ci0KLSAKLXN0YXRpYyBpbnQgSXRlck9wdFZlcmY9VEFfT1BUOwotCi0gCi1zdGF0aWMgaW50IE1heEl0ZXJPcHRTdGVwcz0gLTE7Ci0KLSAKLXN0YXRpYyBpbnQgTWF4U2Vjcz0wOwotCi0KLQotCi0gCi1zdGF0aWMgaW50IEluaXRWYWx1ZT1JTklUX1JBTjsKLQotIAotc3RhdGljIGludCBDcml0ZXJpb249Q1JJVEVSSU9OX01MOwotCi0gCi1zdGF0aWMgaW50IFd3YWhsPVdfREVUX0RFQ1I7Ci0KLSAKLXN0YXRpYyBpbnQgS3dhaGw9S19CRVNUOwotCi0gCi1zdGF0aWMgaW50IE51bWJlckNhdGVnb3JpZXM9MTAwOwotCi0gCi1zdGF0aWMgaW50IE1pbldvcmRGcmVxdWVuY3k9MDsKLQotIAotc3RhdGljIGludCBJdGVyT3B0U2V0PTA7Ci0KLSAKLXN0YXRpYyBLYXRlZ1Byb2JsZW0gKnAgPSAwOwotCi0gCi1jaGFyIGtvcnB1c05hbWVbMTAyNF09InRyYWluIjsKLWludCBrb3JwdXNJc1RleHQ9MTsKLQotCi1jaGFyICpGaWxlRm9yT3RoZXI9MDsKLQotdm9pZCBwcmludFVzYWdlKGludCByKQotewotICBjb3V0IDw8IAotICAgICJta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlczogVXNhZ2U6IFxuIgotICAgICIgbWtjbHMgWy1ubnVtXSBbLXB0cmFpbl0gWy1WZmlsZV0gb3B0XG4iCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgIi1WIG91dHB1dCBjbGFzc2VzIChEZWZhdWx0OiBubyBmaWxlKVxuIgotICAgIAotICAgIAotICAgICItbiBudW1iZXIgb2Ygb3B0aW1pemF0aW9uIHJ1bnMgKERlZmF1bHQ6IDEpOyBsYXJnZXIgbnVtYmVyID0+IGJldHRlciByZXN1bHRzXG4iCi0gICAgCi0gICAgIi1wIGZpbGVuYW1lIG9mIHRyYWluaW5nIGNvcnB1cyAoRGVmYXVsdDogJ3RyYWluJylcbiIKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAiRXhhbXBsZTpcbiIKLSAgICAiIG1rY2xzIC1jODAgLW4xMCAtcGluIC1Wb3V0IG9wdFxuIgotICAgICIgKGdlbmVyYXRlcyA4MCBjbGFzc2VzIGZvciB0aGUgY29ycHVzICdpbicgYW5kIHdyaXRlcyB0aGUgY2xhc3NlcyBpbiAnb3V0JylcbiIKLSAgICAiTGl0ZXJhdHVyZTogXG4iCi0gICAgIiBGcmFueiBKb3NlZiBPY2g6ILtNYXhpbXVtLUxpa2VsaWhvb2QtU2No5HR6dW5nIHZvbiBXb3J0a2F0ZWdvcmllbiBtaXQgVmVyZmFocmVuXG4iCi0gICAgIiBkZXIga29tYmluYXRvcmlzY2hlbiBPcHRpbWllcnVuZz9TdHVkaWVuYXJiZWl0LCBVbml2ZXJzaXTkdCBFcmxhbmdlbi1O/HJuYmVyZyxcbiIKLSAgICAiIEdlcm1hbnksMTk5NS4gXG4iOwotICBleGl0KHIpOwotfQotCi0KLQotCi0KLQotCi12b2lkIG1ha2VJdGVyT3B0KCkKLXsKLSAgZG91YmxlIG1heFRpbWU9Y2xvY2tTZWMoKStNYXhTZWNzOwotICBpZihNYXhTZWNzPT0wKW1heFRpbWU9MDsKLSAgZG91YmxlIG1lYW47Ci0gIFN0YXRWYXIgZW5kLGxhdWZ6ZWl0LGluaXQ7Ci0gIHNvbHZlUHJvYmxlbSgxKyhQcmludEJlc3RUbyE9MCksKnAsbkxhZXVmZSxNYXhJdGVyT3B0U3RlcHMsSXRlck9wdFZlcmYsCi0JICAgICAgIG1lYW4sZW5kLGxhdWZ6ZWl0LGluaXQsbWF4VGltZSk7Ci0gIGlmKCB2ZXJib3NlTW9kZT4xICkKLSAgICBwLT5kdW1wT24oY291dCk7Ci19Ci0KLQotCi12b2lkIG1ha2VJenJPcHQoKQotewotICBkb3VibGUgbWF4VGltZT1jbG9ja1NlYygpK01heFNlY3M7Ci0gIGlmKE1heFNlY3M9PTApbWF4VGltZT0wOwotICBpenJPcHRpbWl6YXRpb24oKnAsbkxhZXVmZVJlZHVjZSxuTGFldWZlUmVkdWNlLDAsbWF4VGltZSxJdGVyT3B0VmVyZik7Ci19Ci0KLQotCi1pbnQgbWFrZU1ldGFPcHQoaW50IGFyZ2MsY2hhciAqKmFyZ3YpCi17Ci0gIGludCByZXQ9MDsKLQotICBpZihhcmdjPT00IHx8IGFyZ2M9PTMpCi0gICAgewotICAgICAgaW50IHR5cD0wOwotICAgICAgaWYoIGFyZ2M9PTQgKQotCXsKLQkgIHNzY2FuZihhcmd2WzNdLCIlZCIsJnR5cCk7Ci0JICBhc3NlcnQodHlwPjAgJiYgdHlwPD0xMSApOwotCX0KLSAgICAgIGlmKCBpc2RpZ2l0KGFyZ3ZbMl1bMF0pICkKLQl7Ci0JICBpbnQgYTsKLQkgIHNzY2FuZihhcmd2WzJdLCIlZCIsJmEpOwotCSAgc3dpdGNoKGEpCi0JICAgIHsKLQkgICAgY2FzZSAxOiAKLQkgICAgICBTQU9wdGltaXphdGlvbjo6b3B0aW1pemVWYWx1ZSgqcCxuTGFldWZlLAotCQkJCQkgICAgb3B0aW1pemVQYXJhbWV0ZXJBbnphaGwsMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjogCi0JICAgICAgU0FPcHRpbWl6YXRpb246Om9wdGltaXplVmFsdWUoKnAsbkxhZXVmZSwKLQkJCQkJICAgIG9wdGltaXplUGFyYW1ldGVyQW56YWhsLDIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDM6IAotCSAgICAgIFNBT3B0aW1pemF0aW9uOjpvcHRpbWl6ZVZhbHVlKCpwLG5MYWV1ZmUsCi0JCQkJCSAgICBvcHRpbWl6ZVBhcmFtZXRlckFuemFobCwxMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNDogCi0JICAgICAgVEFPcHRpbWl6YXRpb246Om9wdGltaXplVmFsdWUoKnAsbkxhZXVmZSwKLQkJCQkJICAgIG9wdGltaXplUGFyYW1ldGVyQW56YWhsLDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDU6IAotCSAgICAgIFRBT3B0aW1pemF0aW9uOjpvcHRpbWl6ZVZhbHVlKCpwLG5MYWV1ZmUsCi0JCQkJCSAgICBvcHRpbWl6ZVBhcmFtZXRlckFuemFobCwxMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNjogCi0JICAgICAgUlJUT3B0aW1pemF0aW9uOjpvcHRpbWl6ZVZhbHVlKCpwLG5MYWV1ZmUsCi0JCQkJCSAgICAgb3B0aW1pemVQYXJhbWV0ZXJBbnphaGwsMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNzogCi0JICAgICAgUlJUT3B0aW1pemF0aW9uOjpvcHRpbWl6ZVZhbHVlKCpwLG5MYWV1ZmUsCi0JCQkJCSAgICAgb3B0aW1pemVQYXJhbWV0ZXJBbnphaGwsMTApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDg6IAotCSAgICAgIEdEQU9wdGltaXphdGlvbjo6b3B0aW1pemVWYWx1ZSgqcCxuTGFldWZlLAotCQkJCQkgICAgIG9wdGltaXplUGFyYW1ldGVyQW56YWhsLDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGNlcnIgPDwgIkVycm9yOiBXcm9uZyBudW1iZXIgb2YgcGFyYW1ldGVyICgiIDw8IGFyZ3ZbMl0gCi0JCTw8ICIpLlxuIjsKLQkgICAgICBwcmludFVzYWdlKDEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmKHN0cmNhc2VjbXAoYXJndlsyXSwiZ2RhIik9PTApCi0JICAgIHsKLQkgICAgICBHREFPcHRpbWl6YXRpb246Om9wdGltaXplVmFsdWUoKnAsbkxhZXVmZSwKLQkJCQkJICAgICBvcHRpbWl6ZVBhcmFtZXRlckFuemFobCx0eXApOwotCSAgICB9Ci0JICBlbHNlIGlmKHN0cmNhc2VjbXAoYXJndlsyXSwidGEiKT09MCkKLQkgICAgewotCSAgICAgIFRBT3B0aW1pemF0aW9uOjpvcHRpbWl6ZVZhbHVlKCpwLG5MYWV1ZmUsCi0JCQkJCSAgICBvcHRpbWl6ZVBhcmFtZXRlckFuemFobCx0eXApOwotCSAgICB9Ci0JICBlbHNlIGlmKHN0cmNhc2VjbXAoYXJndlsyXSwicnJ0Iik9PTApCi0JICAgIHsKLQkgICAgICBSUlRPcHRpbWl6YXRpb246Om9wdGltaXplVmFsdWUoKnAsbkxhZXVmZSwKLQkJCQkJICAgICBvcHRpbWl6ZVBhcmFtZXRlckFuemFobCx0eXApOwotCSAgICB9Ci0JICBlbHNlIGlmKHN0cmNhc2VjbXAoYXJndlsyXSwic2EiKT09MCkKLQkgICAgewotCSAgICAgIFNBT3B0aW1pemF0aW9uOjpvcHRpbWl6ZVZhbHVlKCpwLG5MYWV1ZmUsCi0JCQkJCSAgICBvcHRpbWl6ZVBhcmFtZXRlckFuemFobCx0eXApOwotCSAgICB9Ci0JICAKLQkgIAotCSAgCi0JICAKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNlcnIgPDwgIkVycm9yOiB1bmtub3duIGFsZ29yaXRobSIgPDwgYXJndlsyXSA8PCBlbmRsOyAKLQkgICAgICBwcmludFVzYWdlKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNlcnIgPDwgIkVycm9yOiB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzOiAiIDw8IGFyZ2MgPDwgZW5kbDsKLSAgICAgIHByaW50VXNhZ2UoMSk7Ci0gICAgfQotICByZXR1cm4gcmV0OwotfQotCi0KLQotCi0KLQotCi0KLQotCi12b2lkIHNldFZlcmZhaHJlbihjaGFyICpwKQotewotICBpZihzdHJjYXNlY21wKHAsInJydCIpPT0wICkKLSAgICBJdGVyT3B0VmVyZj1SUlRfT1BUOwotICBlbHNlIGlmKHN0cmNhc2VjbXAocCwidGEiKT09MCkKLSAgICBJdGVyT3B0VmVyZj1UQV9PUFQ7Ci0gIGVsc2UgaWYoc3RyY2FzZWNtcChwLCJnZGEiKT09MCkKLSAgICBJdGVyT3B0VmVyZj1HREFfT1BUOwotICBlbHNlIGlmKHN0cmNhc2VjbXAocCwic2EiKT09MCkKLSAgICBJdGVyT3B0VmVyZj1TQV9PUFQ7Ci0gIGVsc2UgaWYoc3RyY2FzZWNtcChwLCJoYyIpPT0wKQotICAgIEl0ZXJPcHRWZXJmPUhDX09QVDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNlcnIgPDwgIkVycm9yOiBVbmtub3duIGl0ZXJhdGl2LW9wdGltaXppbmcgYWxnb3JpdGhtICciIDw8IHAgPDwgIicuXG4iOwotICAgICAgcHJpbnRVc2FnZSgxKTsKLSAgICB9Ci19Ci0KLQotCi12b2lkIHNldEluaXRWYWx1ZShjaGFyICppdixjaGFyICpmaWxlRm9yT3RoZXIpCi17Ci0gIGlmKHN0cmNhc2VjbXAoaXYsInJhbiIpPT0wICkKLSAgICBJbml0VmFsdWU9SU5JVF9SQU47Ci0gIGVsc2UgaWYoc3RyY2FzZWNtcChpdiwiYWlvIik9PTApCi0gICAgSW5pdFZhbHVlPUlOSVRfQUlPOwotICBlbHNlIGlmKHN0cmNhc2VjbXAoaXYsImdkYSIpPT0wKQotICAgIEluaXRWYWx1ZT1JTklUX0xXUlc7Ci0gIGVsc2UgaWYoc3RyY2FzZWNtcChpdiwiZnJlcSIpPT0wKQotICAgIEluaXRWYWx1ZT1JTklUX0ZSRVE7Ci0gIGVsc2UgaWYoc3RyY2FzZWNtcChpdiwib3RoZXIiKT09MCkKLSAgICB7Ci0gICAgICBJbml0VmFsdWU9SU5JVF9PVEhFUjsKLSAgICAgIEZpbGVGb3JPdGhlcj1zdHJkdXAoZmlsZUZvck90aGVyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjZXJyIDw8ICJFcnJvcjogVW5rbm93biBpbml0aWFsaXphdGlvbiAnIiA8PCBwIDw8ICInLlxuIjs7Ci0gICAgICBwcmludFVzYWdlKDEpOwotICAgIH0KLX0KLQotCi12b2lkIHNldFd3YWhsKGNvbnN0IGNoYXIgKnd3KQotewotICBpZihzdHJjYXNlY21wKHd3LCJyYW4iKT09MCApCi0gICAgV3dhaGw9V19SQU47Ci0gIGVsc2UgaWYoc3RyY2FzZWNtcCh3dywiZGV0Iik9PTApCi0gICAgV3dhaGw9V19ERVRfREVDUjsKLSAgZWxzZSBpZihzdHJjYXNlY21wKHd3LCJpbmNyIik9PTApCi0gICAgV3dhaGw9V19ERVRfSU5DUjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNlcnIgPDwgIkVycm9yOiBVbmtub3duIHdvcmQtc2VsZWN0aW9uICciIDw8IHd3IDw8ICInLlxuIjs7Ci0gICAgICBwcmludFVzYWdlKDEpOwotICAgIH0KLX0KLQotCi12b2lkIHNldEt3YWhsKGNvbnN0IGNoYXIgKmt3KQotewotICBpZiggc3RyY2FzZWNtcChrdywiZGV0Iik9PTAgKQotICAgIEt3YWhsPUtfREVUOwotICBlbHNlIGlmKHN0cmNhc2VjbXAoa3csInJhbiIpPT0wICkKLSAgICBLd2FobD1LX1JBTjsKLSAgZWxzZSBpZihzdHJjYXNlY21wKGt3LCJiZXN0Iik9PTApCi0gICAgS3dhaGw9S19CRVNUOwotICBlbHNlCi0gICAgewotICAgICAgY2VyciA8PCAiRXJyb3I6IFVua25vd24gY2F0ZWdvcnktc2VsZWN0aW9uICciIDw8IGt3IDw8ICInLlxuIjsKLSAgICAgIHByaW50VXNhZ2UoMSk7Ci0gICAgfQotfQotCi0KLXZvaWQgc2V0UGFyYW1ldGVyKGNvbnN0IGNoYXIgKm5yMSxjb25zdCBjaGFyICpucjIpCi17Ci0gIGludCBuMTsKLSAgZmxvYXQgbjI7Ci0gIHNzY2FuZihucjEsIiVkIiwmbjEpOwotICBzc2NhbmYobnIyLCIlZiIsJm4yKTsKLSAgSXRlck9wdFNldD0xOwotICBzd2l0Y2gobjEpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIFNBT3B0aW1pemF0aW9uOjpkZWZhdWx0QW5mQW5uUmF0ZT1uMjsKLSAgICAgIGlmKHZlcmJvc2VNb2RlKWNvdXQgPDwgIlBhcmFtZXRlciBnYW1tYV8wIChTQSkgc2V0IHRvICIgCi0JPDwgU0FPcHRpbWl6YXRpb246OmRlZmF1bHRBbmZBbm5SYXRlIDw8IGVuZGw7Ci0gICAgICBpYXNzZXJ0KDA8PVNBT3B0aW1pemF0aW9uOjpkZWZhdWx0QW5mQW5uUmF0ZSYmIAotCSAgICAgIFNBT3B0aW1pemF0aW9uOjpkZWZhdWx0QW5mQW5uUmF0ZTw9MSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBTQU9wdGltaXphdGlvbjo6ZGVmYXVsdEVuZEFublJhdGU9bjI7Ci0gICAgICBpZih2ZXJib3NlTW9kZSljb3V0IDw8ICJQYXJhbWV0ZXIgZ2FtbWFfZSAoU0EpIHNldCB0byAiIAotCTw8IFNBT3B0aW1pemF0aW9uOjpkZWZhdWx0RW5kQW5uUmF0ZSA8PCBlbmRsOwotICAgICAgaWFzc2VydCgwPD1TQU9wdGltaXphdGlvbjo6ZGVmYXVsdEVuZEFublJhdGUKLQkgICAgICAmJlNBT3B0aW1pemF0aW9uOjpkZWZhdWx0RW5kQW5uUmF0ZTw9MSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBTQU9wdGltaXphdGlvbjo6ZGVmYXVsdE11bHRpcGxlPW4yOwotICAgICAgaWYodmVyYm9zZU1vZGUpY291dCA8PCAiUGFyYW1ldGVyIG51X2UgKFNBKSBzZXQgdG8gIiAKLQk8PCBTQU9wdGltaXphdGlvbjo6ZGVmYXVsdE11bHRpcGxlIDw8IGVuZGw7Ci0gICAgICBpYXNzZXJ0KCBTQU9wdGltaXphdGlvbjo6ZGVmYXVsdE11bHRpcGxlPjAgKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIFRBT3B0aW1pemF0aW9uOjpkZWZhdWx0QW5uUmF0ZT1uMjsKLSAgICAgIGlmKHZlcmJvc2VNb2RlKWNvdXQgPDwgIlBhcmFtZXRlciBnYW1tYV97VEF9IHNldCB0byAiIAotCTw8IFRBT3B0aW1pemF0aW9uOjpkZWZhdWx0QW5uUmF0ZSA8PCBlbmRsOwotICAgICAgaWFzc2VydCgwPD1UQU9wdGltaXphdGlvbjo6ZGVmYXVsdEFublJhdGUgCi0JICAgICAgJiZUQU9wdGltaXphdGlvbjo6ZGVmYXVsdEFublJhdGU8PTEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgVEFPcHRpbWl6YXRpb246OmRlZmF1bHRNdWx0aXBsZT1uMjsKLSAgICAgIGlmKHZlcmJvc2VNb2RlKWNvdXQgPDwgIlBhcmFtZXRlciBudV97VEF9IHNldCB0byAiIAotCTw8IFRBT3B0aW1pemF0aW9uOjpkZWZhdWx0TXVsdGlwbGUgPDwgZW5kbDsKLSAgICAgIGlhc3NlcnQoIFRBT3B0aW1pemF0aW9uOjpkZWZhdWx0TXVsdGlwbGU+MCApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgICAgUlJUT3B0aW1pemF0aW9uOjpkZWZhdWx0QW5uUmF0ZT1uMjsKLSAgICAgIGlmKHZlcmJvc2VNb2RlKWNvdXQgPDwgIlBhcmFtZXRlciBnYW1tYV97UlJUfSBzZXQgdG8gIiAKLQk8PCBSUlRPcHRpbWl6YXRpb246OmRlZmF1bHRBbm5SYXRlIDw8IGVuZGw7Ci0gICAgICBpYXNzZXJ0KDA8PVJSVE9wdGltaXphdGlvbjo6ZGVmYXVsdEFublJhdGUgCi0JICAgICAgJiYgUlJUT3B0aW1pemF0aW9uOjpkZWZhdWx0QW5uUmF0ZTw9MSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDc6Ci0gICAgICBSUlRPcHRpbWl6YXRpb246OmRlZmF1bHRNdWx0aXBsZT1uMjsKLSAgICAgIGlmKHZlcmJvc2VNb2RlKWNvdXQgPDwgIlBhcmFtZXRlciBudV97UlJUfSBzZXQgdG8gIiAKLQk8PCBSUlRPcHRpbWl6YXRpb246OmRlZmF1bHRNdWx0aXBsZSA8PCBlbmRsOwotICAgICAgaWFzc2VydCggUlJUT3B0aW1pemF0aW9uOjpkZWZhdWx0TXVsdGlwbGU+MCApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgR0RBT3B0aW1pemF0aW9uOjpkZWZhdWx0QWxwaGE9bjI7Ci0gICAgICBpZih2ZXJib3NlTW9kZSljb3V0IDw8ICJQYXJhbWV0ZXIgYWxwaGEgc2V0IHRvICIgCi0JPDwgR0RBT3B0aW1pemF0aW9uOjpkZWZhdWx0QWxwaGEgPDwgZW5kbDsKLSAgICAgIGlhc3NlcnQoMDw9R0RBT3B0aW1pemF0aW9uOjpkZWZhdWx0QWxwaGEgCi0JICAgICAgJiYgR0RBT3B0aW1pemF0aW9uOjpkZWZhdWx0QWxwaGE8MSApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGNlcnIgPDwgIkVycm9yOiBXcm9uZyBwYXJhbWV0ZXIgbnVtYmVyICIgPDwgbnIxIDw8ICIgIiA8PCBuMSA8PCBlbmRsOwotICAgICAgcHJpbnRVc2FnZSgxKTsKLSAgICB9Ci19Ci0KLQotCi12b2lkIHNldEtvcnB1c05hbWUoY29uc3QgY2hhciAqcykKLXsKLSAgc3RyY3B5KGtvcnB1c05hbWUscyk7Ci19Ci0KLXZvaWQgc2V0SGFwYXhJbml0TmFtZShjb25zdCBjaGFyICpzKQotewotICBoYXBheEluaXROYW1lPXN0cmR1cChzKTsKLX0KLQotdm9pZCBzZXRLb3JwdXMoKQotewotICBpZigga29ycHVzSXNUZXh0ICkKLSAgICB7Ci0gICAgICBpZiggKHA9ZnJvbUtNb2RlbChrb3JwdXNOYW1lLE51bWJlckNhdGVnb3JpZXMsSW5pdFZhbHVlLENyaXRlcmlvbixXd2FobHxLd2FobCwKLQkJCU1pbldvcmRGcmVxdWVuY3kpKT09MCkKLQl7Ci0JICBjZXJyIDw8ICJFcnJvcjogQ291bGQgbm90IHJlYWQgdGhlIGZpbGUgJyIgPDwga29ycHVzTmFtZSA8PCAiJy5cbiI7Ci0JICBwcmludFVzYWdlKDEpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiggKHA9ZnJvbU5nckZpbGUoa29ycHVzTmFtZSxOdW1iZXJDYXRlZ29yaWVzLEluaXRWYWx1ZSxDcml0ZXJpb24sV3dhaGx8S3dhaGwsCi0JCQkgTWluV29yZEZyZXF1ZW5jeSkpPT0wKQotCXsKLQkgIGNlcnIgPDwgIkVycm9yOiBDb3VsZCBub3QgcmVhZCB0aGUgZmlsZSAnIiA8PCBrb3JwdXNOYW1lIDw8ICInLlxuIjsKLQkgIHByaW50VXNhZ2UoMSk7Ci0JfQotICAgICAgcC0+d29yZEZyZXEuaW5pdGlhbGl6ZUluZGV4KCoocC0+d29yZHMpLCcxJywyLDErTnVtYmVyQ2F0ZWdvcmllcy8yLCFPbmVXaXRoSGFwYXMpOwotICAgICAgcC0+d29yZEZyZXEuaW5pdGlhbGl6ZUluZGV4KCoocC0+d29yZHMpLCcyJywyK051bWJlckNhdGVnb3JpZXMvMiwxK051bWJlckNhdGVnb3JpZXMsT25lV2l0aEhhcGFzKTsKLSAgICB9Ci0gIGlmKCBJdGVyT3B0U2V0PT0wICkgCQkJCQotICAgIEthdGVnUHJvYmxlbVNldFBhcmFtZXRlcnMoKnApOyAJCi19Ci0KLQotCi0KLQotCi1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKLXsKLSAgZG91YmxlIHN0YXJ0VGltZT1jbG9ja1NlYygpOwotICB6dWZhbGxTZWVkKCk7Ci0gIHdoaWxlKCBhcmdjPjEgJiYgYXJndlsxXVswXT09Jy0nICkKLSAgICB7Ci0gICAgICAKLSAgICAgIHN3aXRjaChhcmd2WzFdWzFdKQotCXsKLQljYXNlICd2JzogCi0JICBzc2NhbmYoYXJndlsxXSsyLCIlZCIsJnZlcmJvc2VNb2RlKTsKLQkgIGlhc3NlcnQodmVyYm9zZU1vZGU+PTApOwotCSAgYnJlYWs7Ci0JY2FzZSAnTyc6Ci0JICBzc2NhbmYoYXJndlsxXSsyLCIlZCIsJk9uZVdpdGhIYXBhcyk7Ci0JICBjb3V0IDw8ICJPbmVXaXRoSGFwYXM6ICIgPDwgT25lV2l0aEhhcGFzIDw8IGVuZGw7Ci0JICBicmVhazsKLQljYXNlICduJzogCi0JICBzc2NhbmYoYXJndlsxXSsyLCIlZCIsJm5MYWV1ZmUpOwotCSAgbkxhZXVmZVJlZHVjZT1uTGFldWZlOwotCSAgaWFzc2VydCggbkxhZXVmZT49MSApOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6IAotCSAgQ3JpdGVyaW9uPTE7Ci0JICBpZiggYXJndlsxXVsyXSApCi0JICAgIHsKLQkgICAgICBzc2NhbmYoYXJndlsxXSsyLCIlbGYiLCZyaG9Mbyk7Ci0JICAgICAgaWYoIHZlcmJvc2VNb2RlICkKLQkJY291dCA8PCAiUGFyYW1ldGVyIHJobyAoZm9yIExPKSBzZXQgdG8iIDw8IHJob0xvIDw8ICIuXG4iOwotCSAgICAgIGlhc3NlcnQoMDw9cmhvTG8gJiYgcmhvTG88PTEpOwotCSAgICB9Ci0JICBpZiggdmVyYm9zZU1vZGUgKQotCSAgICBjb3V0IDw8ICJDcml0ZXJpb24gTE8gdXNlZC5cbiI7Ci0JICBicmVhazsKLQljYXNlICd5JzoKLQkgIENyaXRlcmlvbj0yOwotCSAgaWYoIGFyZ3ZbMV1bMl0gKQotCSAgICB7Ci0JICAgICAgc3NjYW5mKGFyZ3ZbMV0rMiwiJWxmIiwmU2lnbWFWZXJmYWVsc2NodW5nKTsKLQkgICAgICBpZiggdmVyYm9zZU1vZGUgKQotCQljb3V0IDw8ICJQYXJhbWV0ZXIgcmhvIChmb3IgTE8pIHNldCB0byIgPDwgU2lnbWFWZXJmYWVsc2NodW5nIDw8ICIuXG4iOwotCSAgICAgIGlhc3NlcnQoMDxTaWdtYVZlcmZhZWxzY2h1bmcpOwotCSAgICB9Ci0JICBpZiggdmVyYm9zZU1vZGUgKQotCSAgICBjb3V0IDw8ICJNeSBzcGVjaWFsIGNyaXRlcmlvbiB1c2VkLlxuIjsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOiAKLQkgIHNldEtvcnB1c05hbWUoYXJndlsxXSsyKTsKLQkgIGFzc2VydChhcmd2WzJdJiZhcmd2WzJdWzBdIT0nLScgfHwgYXJndlsyXVswXSE9J2knKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1AnOgotCSAgc2V0S29ycHVzTmFtZShhcmd2WzFdKzIpOwotCSAga29ycHVzSXNUZXh0PTA7Ci0JICBhc3NlcnQoYXJndlsyXSYmYXJndlsyXVswXSE9Jy0nIHx8IGFyZ3ZbMl1bMF0hPSdpJyk7Ci0JICBicmVhazsJCQotCWNhc2UgJ2knOiAKLQkgIHNldEluaXRWYWx1ZShhcmd2WzFdKzIsYXJndlsyXSk7Ci0JICBpZiggSW5pdFZhbHVlPT1JTklUX09USEVSICkKLQkgICAgYXJndisrLGFyZ2MtLTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgc2V0SGFwYXhJbml0TmFtZShhcmd2WzFdKzIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnayc6IAotCSAgc2V0S3dhaGwoYXJndlsxXSsyKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3cnOiAKLQkgIHNldFd3YWhsKGFyZ3ZbMV0rMik7Ci0JICBicmVhazsKLQljYXNlICdjJzogCi0JICBzc2NhbmYoYXJndlsxXSsyLCIlZCIsJk51bWJlckNhdGVnb3JpZXMpOwotCSAgaWFzc2VydChOdW1iZXJDYXRlZ29yaWVzPj0yKTsKLQkgIGJyZWFrOwotCWNhc2UgJ20nOiAKLQkgIHNzY2FuZihhcmd2WzFdKzIsIiVkIiwmTWluV29yZEZyZXF1ZW5jeSk7Ci0JICBicmVhazsKLQljYXNlICdlJzogCi0JICBzZXRQYXJhbWV0ZXIoYXJndlsxXSsyLGFyZ3ZbMl0pOwotCSAgYXJndisrLGFyZ2MtLTsKLQkgIGJyZWFrOwotCWNhc2UgJ2EnOiAKLQkgIHNldFZlcmZhaHJlbihhcmd2WzFdKzIpOwotCSAgYnJlYWs7Ci0JY2FzZSAncic6IAotCSAgewotCSAgICBpbnQgczsKLQkgICAgc3NjYW5mKGFyZ3ZbMV0rMiwiJWQiLCZzKTsKLQkgICAgenVmYWxsU2VlZChzKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ1YnOiAKLQkgIGlmKGFyZ3ZbMV1bMl0pCi0JICAgIHsKLQkgICAgICBjaGFyIHN0clsxMDI0XTsKLQkgICAgICBzdHJjcHkoc3RyLGFyZ3ZbMV0rMik7Ci0JICAgICAgUHJpbnRCZXN0VG89bmV3IG9mc3RyZWFtKHN0cik7Ci0JICAgICAgc3RyY2F0KHN0ciwiLmNhdHMiKTsKLQkgICAgICBQcmludEJlc3RUbzI9bmV3IG9mc3RyZWFtKHN0cik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgY291dCA8PCAiQVVTR0FCRSBhdWYgY291dFxuIjsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOiAKLQkgIHNzY2FuZihhcmd2WzFdKzIsIiVkIiwmTWF4SXRlck9wdFN0ZXBzKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOiAKLQkgIHNzY2FuZihhcmd2WzFdKzIsIiVkIiwmTWF4U2Vjcyk7Ci0JICBicmVhazsKLQljYXNlICdOJzogCi0JICBzc2NhbmYoYXJndlsxXSsyLCIlZCIsJm9wdGltaXplUGFyYW1ldGVyQW56YWhsKTsgCi0JICBicmVhazsKLQljYXNlICdvJzogCi0JICBHcmFwaE91dHB1dCA9IG5ldyBvZnN0cmVhbShhcmd2WzFdKzIpOwotCSAgaWYoIEdyYXBoT3V0cHV0PT0wICkKLQkgICAgY2VyciA8PCAiV2FybmluZzogT3BlbiBmYWlsZWQgZm9yIGZpbGUgJyIgPDwgYXJndlsxXSsyIDw8ICInLlxuIjsKLQkgIGJyZWFrOwotICAgIAlkZWZhdWx0OgotCSAgY2VyciA8PCAiRmVobGVyaGFmdGUgT3B0aW9uOiAiIDw8IGFyZ3ZbMV0gPDwgZW5kbDsKLQkgIHByaW50VXNhZ2UoMSk7Ci0JfQotICAgICAgYXJndisrOwotICAgICAgYXJnYy0tOwotICAgIH0KLQotICAKLSAgc2V0S29ycHVzKCk7Ci0gIGlmKCBGaWxlRm9yT3RoZXIgKQotICAgIHsKLSAgICAgIGZyb21DYXRGaWxlKHAsRmlsZUZvck90aGVyKTsKLSAgICAgIHAtPmluaXRpYWxpc2llcnVuZz1Jbml0VmFsdWU7Ci0gICAgICBwLT5faW5pdGlhbGl6ZShJbml0VmFsdWUpOwotICAgIH0KLSAgCi0gIGlmKCBoYXBheEluaXROYW1lICkKLSAgICB7Ci0gICAgICBmcm9tQ2F0RmlsZShwLGhhcGF4SW5pdE5hbWUsMCk7Ci0gICAgICBwLT5maXhJbml0TGlrZSgpOwotICAgIH0KLQotICBkb3VibGUgc3RhcnQyVGltZT1jbG9ja1NlYygpOyAKLQotICBpZihhcmdjPj0yICYmIHN0cmNhc2VjbXAoYXJndlsxXSwib3B0Iik9PTAgKQotICAgIG1ha2VJdGVyT3B0KCk7Ci0gIGVsc2UgaWYoYXJnYz49MiAmJiBzdHJjYXNlY21wKGFyZ3ZbMV0sIm1ldGEtb3B0Iik9PTApCi0gICAgbWFrZU1ldGFPcHQoYXJnYyxhcmd2KTsKLSAgZWxzZSBpZihhcmdjPj0yICYmIHN0cmNhc2VjbXAoYXJndlsxXSwiaXpyLW9wdCIpPT0wKQotICAgIG1ha2VJenJPcHQoKTsKLSAgCi0gIAotICBlbHNlCi0gICAgewotICAgICAgbWFrZUl0ZXJPcHQoKTsKLSAgICB9Ci0KLSAgaWYoIHZlcmJvc2VNb2RlICkKLSAgICB7Ci0gICAgICBjb3V0IDw8ICIgICAgZnVsbC10aW1lOiAiIDw8IGNsb2NrU2VjKCktc3RhcnRUaW1lIDw8IGVuZGw7Ci0gICAgICBjb3V0IDw8ICJvcHRpbWl6ZS10aW1lOiAiIDw8IGNsb2NrU2VjKCktc3RhcnQyVGltZSA8PCBlbmRsOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL215LmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9teS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA2NjU3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL215LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotI2lmbmRlZiBIRUFERVJfbXlfREVGSU5FRAotI2RlZmluZSBIRUFERVJfbXlfREVGSU5FRAotCi0jZGVmaW5lIG92ZXJfYXJyYXkoYSxpKSBmb3IoaT0oYSkubG93KCk7aTw9KGEpLmhpZ2goKTtpKyspCi0jZGVmaW5lIGJhY2t3YXJkc19hcnJheShhLGkpIGZvcihpPShhKS5oaWdoKCk7aT49KGEpLmxvdygpO2ktLSkKLSNkZWZpbmUgb3Zlcl9hcnIoYSxpKSBmb3IoaW50IGk9KGEpLmxvdygpO2k8PShhKS5oaWdoKCk7aSsrKQotI2RlZmluZSBvdmVyX2Fyck1BWChhLGksbWF4KSBmb3IoaW50IGk9KGEpLmxvdygpO2k8PW1pbigoYSkuaGlnaCgpLG1heC0xKTtpKyspCi0jZGVmaW5lIGJhY2t3YXJkc19hcnIoYSxpKSBmb3IoaW50IGk9KGEpLmhpZ2goKTtpPj0oYSkubG93KCk7aS0tKQotCi1leHRlcm4gZG91YmxlIG4xbXVsdCxuMm11bHQsbjNtdWx0OwotCi1pbmxpbmUgZG91YmxlIHJlYWxQcm9iKGludCBuMSxpbnQgbjIpCi17Ci0gIG1hc3NlcnQobjE8PW4yKTsKLSAgaWFzc2VydChuMT49MCYmbjI+MCk7Ci0gIGlmKG4yPT0wKW4yPTE7Ci0gIHJldHVybiAoKGRvdWJsZSluMSkvKGRvdWJsZSluMjsKLX0KLQotaW5saW5lIGRvdWJsZSB2ZXJmUHJvYihpbnQgbjEsaW50IG4yKQotewotICBkb3VibGUgcHJvYiA9IHJlYWxQcm9iKG4xLG4yKTsKLSAgaWYoIG4xPT0xIClyZXR1cm4gcHJvYipuMW11bHQ7Ci0gIGVsc2UgaWYoIG4xPT0yIClyZXR1cm4gcHJvYipuMm11bHQ7Ci0gIGVsc2UgaWYoIG4xPT0zIClyZXR1cm4gcHJvYipuM211bHQ7Ci0gIGVsc2UgcmV0dXJuIHByb2I7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvbXlhc3NlcnQuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL215YXNzZXJ0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhODZmZmIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvbXlhc3NlcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0jaWZuZGVmIE1ZX0FTU0VSVF9ERUZJTkVECi0jZGVmaW5lIE1ZX0FTU0VSVF9ERUZJTkVECi12b2lkIG15ZXJyb3IoaW50IGxpbmUsY29uc3QgY2hhciAqZmlsZSxjb25zdCBjaGFyICpleHByZXNzaW9uKTsKLXZvaWQgaW15ZXJyb3IoaW50IGxpbmUsY29uc3QgY2hhciAqZmlsZSxjb25zdCBjaGFyICpleHByZXNzaW9uKTsKLQotI2RlZmluZSBpYXNzZXJ0KGV4cHJlc3Npb24pIGRvIHtpZiAoIShleHByZXNzaW9uKSkge2lteWVycm9yKF9fTElORV9fLF9fRklMRV9fLCNleHByZXNzaW9uKTt9fSB3aGlsZSAoMCkKLQotI2RlZmluZSBtYXNzZXJ0KGV4cHIpIGRvIHt9IHdoaWxlKDApCi0KLSNkZWZpbmUgdmFzc2VydChleHByKSBkbyB7fSB3aGlsZSgwKQotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNlbmRpZgotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21rY2xzL215bGVkYS5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvbXlsZWRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNWY4NDYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvbXlsZWRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAotCi1ta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLQotCi0KLSNpZm5kZWYgbXlsZWRhX0hFQURFUl9kZWZpbmVkCi0jZGVmaW5lIG15bGVkYV9IRUFERVJfZGVmaW5lZAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLSNpbmNsdWRlICJteWFzc2VydC5oIgotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZTxsaXN0PgotI2VuZGlmCi0KLQotI2lmIGRlZmluZWQoVVNFX0xFREFfYXJyYXkpfHxkZWZpbmVkKFVTRV9MRURBKQotI2luY2x1ZGUgPExFREEvYXJyYXkuaD4KLSNlbHNlCi0KLSNpbmNsdWRlICJGaXhlZEFycmF5LmgiCi0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1jbGFzcyBsZWRhX2FycmF5IDogcHVibGljIEZpeGVkQXJyYXk8VD4KLXsKLXB1YmxpYzoKLSAgbGVkYV9hcnJheSgpIHt9Ci0gIGxlZGFfYXJyYXkoaW50IG4pIDogRml4ZWRBcnJheTxUPihuKSB7fQotfTsKLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkKFVTRV9MRURBX3NldCl8fGRlZmluZWQoVVNFX0xFREEpCi0jaW5jbHVkZSA8TEVEQS9zZXQuaD4KLSNkZWZpbmUgZm9yYWxsX3NldChhLGIsYykgZm9yYWxsKGIsYykKLSNlbHNlCi0jaW5jbHVkZSA8c2V0PgotdGVtcGxhdGU8Y2xhc3MgVD4KLWNsYXNzIGxlZGFfc2V0IDogcHVibGljIHNldDxUPgotewotcHVibGljOgotICBib29sIG1lbWJlcihjb25zdCBUJm0pIGNvbnN0Ci0gICAgeyByZXR1cm4gdGhpcy0+Y291bnQobSkhPTA7IH0KLSAgdm9pZCBkZWwoY29uc3QgVCZtKQotICAgIHsgdGhpcy0+ZXJhc2UobSk7IH0KLX07Ci0jZGVmaW5lIGZvcmFsbF9zZXQoYSxiLGMpIGZvcihhOjppdGVyYXRvciBfX2lfXz1jLmJlZ2luKCk7X19pX18hPWMuZW5kKCkmJigoYj0qX19pX18pLDEpOysrX19pX18pCi10ZW1wbGF0ZTxjbGFzcyBUPgotbGVkYV9zZXQ8VD4gb3BlcmF0b3ImKGNvbnN0IGxlZGFfc2V0PFQ+JmEsY29uc3QgbGVkYV9zZXQ8VD4mYikKLXsKLSAgbGVkYV9zZXQ8VD5jOwotCi0jaWZkZWYgV0lOMzIKLSAgc3RkOjpsaXN0PFQ+IGxzdDsKLSAgc2V0X2ludGVyc2VjdGlvbihhLmJlZ2luKCksYS5lbmQoKSxiLmJlZ2luKCksYi5lbmQoKSxsc3QuYmVnaW4oKSk7Ci0gIGZvcihzdGQ6Omxpc3Q8VD46Oml0ZXJhdG9yIGl0ID0gbHN0LmJlZ2luKCkgO2l0IT1sc3QuZW5kKCk7aXQrKyl7Ci0JICBjLmluc2VydCgqaXQpOwotICB9Ci0jZWxzZQotICBpbnNlcnRfaXRlcmF0b3I8c2V0PFQ+ID4gaXRlcihjLGMuYmVnaW4oKSk7Ci0gIHNldF9pbnRlcnNlY3Rpb24oYS5iZWdpbigpLGEuZW5kKCksYi5iZWdpbigpLGIuZW5kKCksaXRlcik7Ci0jZW5kaWYKLSAgcmV0dXJuIGM7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUPgotbGVkYV9zZXQ8VD4gb3BlcmF0b3ItKGNvbnN0IGxlZGFfc2V0PFQ+JmEsY29uc3QgbGVkYV9zZXQ8VD4mYikKLXsKLQotICBsZWRhX3NldDxUPmM7Ci0gIAotICAKLSNpZmRlZiBXSU4zMgotICBzdGQ6Omxpc3Q8VD4gbHN0OwotICBzZXRfZGlmZmVyZW5jZShhLmJlZ2luKCksYS5lbmQoKSxiLmJlZ2luKCksYi5lbmQoKSxsc3QuYmVnaW4oKSk7Ci0gIGZvcihzdGQ6Omxpc3Q8VD46Oml0ZXJhdG9yIGl0ID0gbHN0LmJlZ2luKCkgO2l0IT1sc3QuZW5kKCk7aXQrKyl7Ci0JICBjLmluc2VydCgqaXQpOwotICB9Ci0jZWxzZQotICBpbnNlcnRfaXRlcmF0b3I8c2V0PFQ+ID4gaXRlcihjLGMuYmVnaW4oKSk7Ci0gIHNldF9kaWZmZXJlbmNlKGEuYmVnaW4oKSxhLmVuZCgpLGIuYmVnaW4oKSxiLmVuZCgpLGl0ZXIpOwotI2VuZGlmCi0gIHJldHVybiBjOwotfQotCi0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZChVU0VfTEVEQV9kX2FycmF5KXx8ZGVmaW5lZChVU0VfTEVEQSkKLSNpbmNsdWRlIDxMRURBL2RfYXJyYXkuaD4KLSNkZWZpbmUgZm9yYWxsX2RlZmluZWRfZChhLGIsYyxkKSBmb3JhbGxfZGVmaW5lZChjLGQpCi0jZGVmaW5lIGZvcmFsbF9kKGEsYixjLGQpIGZvcmFsbChjLGQpCi0jZWxzZQotI2luY2x1ZGUgPG1hcD4KLXRlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQj4KLWNsYXNzIGxlZGFfZF9hcnJheSA6IHB1YmxpYyBtYXA8QSxCPgotewotcHJpdmF0ZToKLSAgQiBpbml0OwotcHVibGljOgotICBib29sIGRlZmluZWQoY29uc3QgQSZhKSBjb25zdAotICAgIHsgcmV0dXJuIGZpbmQoYSkhPXRoaXMtPmVuZCgpOyB9Ci0gIGNvbnN0IEImb3BlcmF0b3JbXShjb25zdCBBJmEpY29uc3QKLSAgICB7IAotICAgICAgdHlwZW5hbWUgbWFwPEEsQj46OmNvbnN0X2l0ZXJhdG9yIHBvcz1maW5kKGEpOwotICAgICAgaWFzc2VydChwb3MhPXRoaXMtPmVuZCgpKTsKLSAgICAgIGlmKCBwb3M9PXRoaXMtPmVuZCgpICkKLQlyZXR1cm4gaW5pdDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gcG9zLT5zZWNvbmQ7Ci0gICAgfQotICBCJm9wZXJhdG9yW10oY29uc3QgQSZhKQotICAgIHsgCi0gICAgICB0eXBlbmFtZSBtYXA8QSxCPjo6aXRlcmF0b3IgcG9zPWZpbmQoYSk7Ci0gICAgICBpZiggcG9zPT10aGlzLT5lbmQoKSApCi0JewotCSAgaW5zZXJ0KG1hcDxBLEI+Ojp2YWx1ZV90eXBlKGEsaW5pdCkpOwotCSAgcG9zPWZpbmQoYSk7Ci0JICBpYXNzZXJ0KHBvcyE9dGhpcy0+ZW5kKCkpOwotCX0KLSAgICAgIHJldHVybiBwb3MtPnNlY29uZDsKLSAgICB9Ci19OwotCi0jZGVmaW5lIGZvcmFsbF9kZWZpbmVkX2QoYSxiLGMsZCkgZm9yKHR5cGVuYW1lIGxlZGFfZF9hcnJheTxhLGI+Ojpjb25zdF9pdGVyYXRvciBfX2lpX189KGQpLmJlZ2luKCk7X19paV9fIT0oZCkuZW5kKCkmJigoYz1fX2lpX18tPmZpcnN0KSwxKSA7KytfX2lpX18pCi0jZGVmaW5lIGZvcmFsbF9kKGEsYixjLGQpICAgICAgICAgZm9yKHR5cGVuYW1lIGxlZGFfZF9hcnJheTxhLGI+Ojpjb25zdF9pdGVyYXRvciBfX2lpX189KGQpLmJlZ2luKCk7X19paV9fIT0oZCkuZW5kKCkmJigoYz1fX2lpX18tPnNlY29uZCksMSk7KytfX2lpX18pCi0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZChVU0VfTEVEQV9oX2FycmF5KXx8ZGVmaW5lZChVU0VfTEVEQSkKLSNpbmNsdWRlIDxMRURBL2hfYXJyYXkuaD4KLSNkZWZpbmUgZm9yYWxsX2RlZmluZWRfaChhLGIsYyxkKSBmb3JhbGxfZGVmaW5lZChjLGQpCi0jZGVmaW5lIGZvcmFsbF9oKGEsYixjLGQpIGZvcmFsbChjLGQpCi0jZWxzZQotCi1kb3VibGUgdXNlZF90aW1lKCk7Ci0jaWYgMAotCi0jaW5jbHVkZSAibXlfaGFzaG1hcC5oIgotI2RlZmluZSBsZWRhX2hfYXJyYXkgbXlfaGFzaG1hcAotCi0jZWxzZQotCi10ZW1wbGF0ZTxjbGFzcyBUICxjbGFzcyBfUHIgPSBsZXNzPFQ+ID4KLWNsYXNzIG15X2hhc2gKLXsKLXB1YmxpYzoKLSAgaW50IG9wZXJhdG9yKCkoY29uc3QgVCZ0KWNvbnN0IHtyZXR1cm4gSGFzaCh0KTt9Ci0jaWZkZWYgV0lOMzIKLSAgZW51bQotICB7CS8vIHBhcmFtZXRlcnMgZm9yIGhhc2ggdGFibGUKLQkgIGJ1Y2tldF9zaXplID0gMQkJLy8gMCA8IGJ1Y2tldF9zaXplCi0gIH07Ci0gIG15X2hhc2goKQotCSAgOiBjb21wKCkKLSAgewkvLyBjb25zdHJ1Y3Qgd2l0aCBkZWZhdWx0IGNvbXBhcmF0b3IKLSAgfQotCi0gIG15X2hhc2goX1ByIF9QcmVkKQotCSAgOiBjb21wKF9QcmVkKQotICB7CS8vIGNvbnN0cnVjdCB3aXRoIF9QcmVkIGNvbXBhcmF0b3IKLSAgfQotcHJvdGVjdGVkOgotICBfUHIgY29tcDsKLXB1YmxpYzoKLSAgaW50IG9wZXJhdG9yKCkoY29uc3QgVCZ0ICwgY29uc3QgVCZ0MSljb25zdCB7cmV0dXJuIGNvbXAodCx0MSk7fQotI2VuZGlmCi19OwotCi1pbmxpbmUgaW50IEhhc2goaW50IHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfQotI2RlZmluZSBNWV9IQVNIX0JBU0UgaGFzaF9tYXA8QSxCLG15X2hhc2g8QT4gPgotI2lmIF9fR05VQ19fPjIgCi0jaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgotdXNpbmcgX19nbnVfY3h4OjpoYXNoX21hcDsKLXVzaW5nIF9fZ251X2N4eDo6aGFzaDsKLSNlbHNlCi0jaW5jbHVkZSA8aGFzaF9tYXA+Ci0jZW5kaWYKLXRlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQj4KLWNsYXNzIGxlZGFfaF9hcnJheSA6IHB1YmxpYyBNWV9IQVNIX0JBU0UKLXsKLXByaXZhdGU6Ci0gIEIgaW5pdDsKLXB1YmxpYzoKLSAgbGVkYV9oX2FycmF5KCkge30KLSAgbGVkYV9oX2FycmF5KGNvbnN0IEImX2luaXQpCi0gICAgOiBNWV9IQVNIX0JBU0UoKSxpbml0KF9pbml0KSB7fQotICBib29sIGRlZmluZWQoY29uc3QgQSZhKSBjb25zdAotICAgIHsgcmV0dXJuIGZpbmQoYSkhPXRoaXMtPmVuZCgpOyB9Ci0gIGNvbnN0IEImb3BlcmF0b3JbXShjb25zdCBBJmEpY29uc3QKLSAgeyAKLQkgIHR5cGVuYW1lIE1ZX0hBU0hfQkFTRTo6Y29uc3RfaXRlcmF0b3IgcG9zPXRoaXMtPmZpbmQoYSk7Ci0KLQkgIGlmKCBwb3M9PXRoaXMtPmVuZCgpICkKLQkJICByZXR1cm4gaW5pdDsKLQkgIGVsc2UKLQkJICByZXR1cm4gcG9zLT5zZWNvbmQ7Ci0gIH0KLSAgQiZvcGVyYXRvcltdKGNvbnN0IEEmYSkKLSAgeyAKLQkgIHR5cGVuYW1lIE1ZX0hBU0hfQkFTRTo6aXRlcmF0b3IgcG9zPXRoaXMtPmZpbmQoYSk7Ci0JICBpZiggcG9zPT10aGlzLT5lbmQoKSApCi0JICB7Ci0JCSAgdGhpcy0+aW5zZXJ0KHR5cGVuYW1lIE1ZX0hBU0hfQkFTRTo6dmFsdWVfdHlwZShhLGluaXQpKTsKLQkJICBwb3M9dGhpcy0+ZmluZChhKTsKLQkJICBpYXNzZXJ0KHBvcyE9dGhpcy0+ZW5kKCkpOwotCSAgfQotCSAgcmV0dXJuIHBvcy0+c2Vjb25kOwotICB9Ci19OwotCi0jZGVmaW5lIGZvcmFsbF9kZWZpbmVkX2goYSxiLGMsZCkgZm9yKHR5cGVuYW1lIGxlZGFfaF9hcnJheTxhLGI+Ojpjb25zdF9pdGVyYXRvciBfX2pqX189KGQpLmJlZ2luKCk7X19qal9fIT0oZCkuZW5kKCkmJigoYz1fX2pqX18tPmZpcnN0KSwxKTsgKytfX2pqX18pCi0jZGVmaW5lIGZvcmFsbF9kZWZpbmVkX2gyKGEsYixjLGQpIGZvcihsZWRhX2hfYXJyYXk8YSxiPjo6Y29uc3RfaXRlcmF0b3IgX19qal9fPShkKS5iZWdpbigpO19fampfXyE9KGQpLmVuZCgpJiYoKGM9X19qal9fLT5maXJzdCksMSk7ICsrX19qal9fKQotI2RlZmluZSBmb3JhbGxfaChhLGIsYyxkKSAgICAgICAgIGZvcih0eXBlbmFtZSBsZWRhX2hfYXJyYXk8YSxiPjo6Y29uc3RfaXRlcmF0b3IgX19qampfXz0oZCkuYmVnaW4oKTtfX2pqal9fIT0oZCkuZW5kKCkmJigoYz1fX2pqal9fLT5zZWNvbmQpLDEpOysrX19qampfXykKLQotI2VuZGlmCi0KLSNlbmRpZgotCi0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gaW50IGNvbXBhcmUoY29uc3QgVCZhLGNvbnN0IFQmYikKLXtpZihhPT1iKXJldHVybiAwOyBlbHNlIGlmKGE8YikgcmV0dXJuIC0xOyBlbHNlIHJldHVybiAxO30KLQotdGVtcGxhdGU8Y2xhc3MgVCxjbGFzcyBVPgotb3N0cmVhbSAmIG9wZXJhdG9yPDwob3N0cmVhbSZvdXQsY29uc3QgbGVkYV9oX2FycmF5PFQsVT4mdykKLXsKLSAgVCB0OwotICBib29sIG1ha2VObD0wOwotICBvdXQgPDwgImhfYXJyYXl7IjsKLSAgZm9yYWxsX2RlZmluZWRfaChULFUsdCx3KQotICAgIHsKLSAgICAgIGlmKCBtYWtlTmwgKQotCW91dCA8PCAiXG4gICAgICAgIjsKLSAgICAgIG91dCA8PCAiRUw6IiA8PCB0IDw8ICIgSU5IOiIgPDwgd1t0XSA8PCAiLiI7Ci0gICAgICBtYWtlTmw9MTsKLSAgICB9Ci0gIHJldHVybiBvdXQgPDwgIn1cbiI7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBULGNsYXNzIFU+Ci1vc3RyZWFtICYgb3BlcmF0b3I8PChvc3RyZWFtJm91dCxjb25zdCBsZWRhX2RfYXJyYXk8VCxVPiZ3KQotewotICBUIHQ7Ci0gIGJvb2wgbWFrZU5sPTA7Ci0gIG91dCA8PCAiaF9hcnJheXsiOwotICBmb3JhbGxfZGVmaW5lZF9oKFQsVSx0LHcpCi0gICAgewotICAgICAgaWYoIG1ha2VObCApCi0Jb3V0IDw8ICJcbiAgICAgICAiOwotICAgICAgb3V0IDw8ICJFTDoiIDw8IHQgPDwgIiBJTkg6IiA8PCB3W3RdIDw8ICIuIjsKLSAgICAgIG1ha2VObD0xOwotICAgIH0KLSAgcmV0dXJuIG91dCA8PCAifVxuIjsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLW9zdHJlYW0mcHJpbnRTZXQob3N0cmVhbSZvdXQsY29uc3QgbGVkYV9zZXQ8VD4mcykKLXsKLSAgYm9vbCBmaXJzdD0xOwotICBUIHQ7Ci0gIG91dCA8PCAieyI7Ci0gIGZvcmFsbF9zZXQodHlwZW5hbWUgc2V0PFQ+LHQscykKLSAgICB7Ci0gICAgICBpZiggZmlyc3Q9PTAgKQotCW91dCA8PCAiLCAiOwotICAgICAgb3V0IDw8IHQ7Ci0gICAgICBmaXJzdD0wOwotICAgIH0KLSAgcmV0dXJuIG91dCA8PCAifVxuIjsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVCxjbGFzcyBVPgotaXN0cmVhbSAmIG9wZXJhdG9yPj4oaXN0cmVhbSZpbixsZWRhX2hfYXJyYXk8VCxVPiYpCi17Ci0gIHJldHVybiBpbjsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCPgotYm9vbCBvcGVyYXRvcj09KGNvbnN0IGxlZGFfaF9hcnJheTxBLEI+JnAxLGNvbnN0IGxlZGFfaF9hcnJheTxBLEI+JnAyKQotewotICBBIHY7Ci0gIGZvcmFsbF9kZWZpbmVkX2goQSxCLHYscDEpCi0gICAgaWYoICEoIHAxW3ZdPT1wMlt2XSkgKSByZXR1cm4gMDsKLSAgZm9yYWxsX2RlZmluZWRfaChBLEIsdixwMikKLSAgICBpZiggISggcDFbdl09PXAyW3ZdKSApIHJldHVybiAwOwotICByZXR1cm4gMTsgCi19Ci10ZW1wbGF0ZTxjbGFzcyBBLGNsYXNzIEI+Ci1ib29sIG9wZXJhdG9yPT0oY29uc3QgbGVkYV9kX2FycmF5PEEsQj4mcDEsY29uc3QgbGVkYV9kX2FycmF5PEEsQj4mcDIpCi17Ci0gIEEgdjsKLSAgZm9yYWxsX2RlZmluZWRfZChBLEIsdixwMSkKLSAgICBpZiggISggcDFbdl09PXAyW3ZdKSApIHJldHVybiAwOwotICBmb3JhbGxfZGVmaW5lZF9kKEEsQix2LHAyKQotICAgIGlmKCAhKCBwMVt2XT09cDJbdl0pICkgcmV0dXJuIDA7Ci0gIHJldHVybiAxOyAKLX0KLQotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9teXN0bC5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbWtjbHMvbXlzdGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkYTg4ZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9ta2Nscy9teXN0bC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0jaWZuZGVmIE1ZX1NUTF9IX0RFRklORUQKLSNkZWZpbmUgTVlfU1RMX0hfREVGSU5FRAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2lmIF9fR05VQ19fPjIgCi0jaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgotdXNpbmcgX19nbnVfY3h4OjpoYXNoX21hcDsKLXVzaW5nIF9fZ251X2N4eDo6aGFzaDsKLSNlbHNlCi0jaW5jbHVkZSA8aGFzaF9tYXA+Ci0jZW5kaWYKLSNpbmNsdWRlIDxjbWF0aD4KLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotI2RlZmluZSBvdmVyX3N0cmluZyhhLGkpIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8YS5sZW5ndGgoKTtpKyspCi0KLWlubGluZSBpbnQgSGFzaChjb25zdCBzdHJpbmcmIHMpCi17Ci0gIGludCBzdW09MDsKLSAgc3RyaW5nOjpjb25zdF9pdGVyYXRvciBpPXMuYmVnaW4oKSxlbmQ9cy5lbmQoKTsKLSAgZm9yKDtpIT1lbmQ7aSsrKXN1bT01KnN1bSsoKmkpOwotICByZXR1cm4gc3VtOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBWPiBpbnQgSGFzaChjb25zdCBwYWlyPFYsVj4mYSkgCi17IHJldHVybiBIYXNoKGEuZmlyc3QpKzQqSGFzaChhLnNlY29uZCk7IH0KLQotdGVtcGxhdGU8Y2xhc3MgVDEsY2xhc3MgVDI+Ci1pc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0gJmluLHBhaXI8VDEsVDI+ICZpcikKLXsKLSBjaGFyIGM7Ci0gCi0gZG8gaW4uZ2V0KGMpOyB3aGlsZSAoaW4gJiYgaXNzcGFjZShjKSk7Ci0gCi0gaWYgKCFpbikgcmV0dXJuIGluOwotIAotIGlmIChjICE9ICcoJykgaW4ucHV0YmFjayhjKTsKLSAKLSBpbiA+PiBpci5maXJzdDsKLSAKLSBkbyBpbi5nZXQoYyk7IHdoaWxlIChpc3NwYWNlKGMpKTsKLSBpZiAoYyAhPSAnLCcpIGluLnB1dGJhY2soYyk7Ci0gCi0gaW4gPj4gaXIuc2Vjb25kOyAKLSAKLSBkbyBpbi5nZXQoYyk7IHdoaWxlIChjID09ICcgJyk7Ci0gaWYgKGMgIT0gJyknKSBpbi5wdXRiYWNrKGMpOwotIAotIHJldHVybiBpbjsgCi19Ci0KLXRlbXBsYXRlPGNsYXNzIFQxLGNsYXNzIFQyPgotb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtICZvdXQsY29uc3QgcGFpcjxUMSxUMj4gJmlyKQoteyAKLSAgb3V0IDw8ICIoIiA8PCBpci5maXJzdCA8PCAiLCIgPDwgaXIuc2Vjb25kIDw8ICIpIjsKLSAgcmV0dXJuIG91dDsKLX0gCi0KLXZvaWQgcHJpbnRTcGFjZXMob3N0cmVhbSZvdXQsaW50IG4pOwotdm9pZCBteXNwbGl0KGNvbnN0IHN0cmluZyAmcyxzdHJpbmcgJnMxLHN0cmluZyAmczIpOwotc3RyaW5nIHVudGlsQ2hhcihjb25zdCBzdHJpbmcmcyxjaGFyIGMpOwotCi10ZW1wbGF0ZTxjbGFzcyBBLGNsYXNzIEIsY2xhc3MgQz4KLWNsYXNzIHRyaQotewotcHVibGljOgotICBBIGE7Ci0gIEIgYjsKLSAgQyBjOwotICB0cmkoKXt9OwotICB0cmkoY29uc3QgQSZfYSxjb25zdCBCJl9iLGNvbnN0IEMmX2MpCi0gICAgOiBhKF9hKSxiKF9iKSxjKF9jKSB7fQotfTsKLXRlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQixjbGFzcyBDPgotYm9vbCBvcGVyYXRvcj09KGNvbnN0IHRyaTxBLEIsQz4meCxjb25zdCB0cmk8QSxCLEM+JnkpCi17IHJldHVybiB4LmE9PXkuYSYmeC5iPT15LmImJnguYz09eS5jO30KLQotdGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCLGNsYXNzIEM+Ci1ib29sIG9wZXJhdG9yPChjb25zdCB0cmk8QSxCLEM+JngsY29uc3QgdHJpPEEsQixDPiZ5KQotewotICBpZih4LmE8eS5hKQotICAgIHJldHVybiAxOwotICBpZih5LmE8eC5hKQotICAgIHJldHVybiAwOwotCi0gIGlmKHguYjx5LmIpCi0gICAgcmV0dXJuIDE7Ci0gIGlmKHkuYjx4LmIpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYoeC5jPHkuYykKLSAgICByZXR1cm4gMTsKLSAgaWYoeS5jPHguYykKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbW9kZWwxLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21vZGVsMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMjg2OWYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbW9kZWwxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpbmNsdWRlICJtb2RlbDEuaCIKLSNpbmNsdWRlICJHbG9iYWxzLmgiCi0jaW5jbHVkZSAidXRpbGl0eS5oIgotI2luY2x1ZGUgIlBhcmFtZXRlci5oIgotCi1leHRlcm4gc2hvcnQgTm9FbXB0eVdvcmQ7Ci1leHRlcm4gaW50IFZlcmJvc2VTZW50ZW5jZTsKLQotZXh0ZXJuIHNob3J0IE5DUFVTOwotCi1HTE9CQUxfUEFSQU1FVEVSMihpbnQsTW9kZWwxX0R1bXBfRnJlcSwiTU9ERUwgMSBEVU1QIEZSRVFVRU5DWSIsInQxIiwiZHVtcCBmcmVxdWVuY3kgb2YgTW9kZWwgMSIsUEFSTEVWX09VVFBVVCwwKTsKLWludCBOdW1iZXJPZlZBTElhbGlnbm1lbnRzPTEwMDsKLQotbW9kZWwxOjptb2RlbDEoY29uc3QgY2hhciogZWZuYW1lLCB2Y2JMaXN0JiBldmNibGlzdCwgdmNiTGlzdCYgZnZjYmxpc3QsdG1vZGVsPENPVU5ULCBQUk9CPiZfdFRhYmxlLFBlcnBsZXhpdHkmIF9wZXJwLAotCSAgICAgIHNlbnRlbmNlSGFuZGxlciYgX3NIYW5kbGVyMSwKLQkgICAgICBQZXJwbGV4aXR5KiBfdGVzdFBlcnAsCi0JICAgICAgc2VudGVuY2VIYW5kbGVyKiBfdGVzdEhhbmRsZXIsCi0JICAgICAgUGVycGxleGl0eSYgX3RyYWluVml0ZXJiaVBlcnAsCi0JICAgICAgUGVycGxleGl0eSogX3Rlc3RWaXRlcmJpUGVycCk6Ci0gIHJlcG9ydF9pbmZvKF9wZXJwLF9zSGFuZGxlcjEsX3Rlc3RQZXJwLF90ZXN0SGFuZGxlcixfdHJhaW5WaXRlcmJpUGVycCxfdGVzdFZpdGVyYmlQZXJwKSwKLSAgZWZGaWxlbmFtZShlZm5hbWUpLCBFbGlzdChldmNibGlzdCksIEZsaXN0KGZ2Y2JsaXN0KSwgCi0gIGVUb3RhbFdDb3VudChFbGlzdC50b3RhbFZvY2FiKCkpLCBmVG90YWxXQ291bnQoRmxpc3QudG90YWxWb2NhYigpKSwgCi0gIG5vRW5nbGlzaFdvcmRzKEVsaXN0LnNpemUoKSksIG5vRnJlbmNoV29yZHMoRmxpc3Quc2l6ZSgpKSwgdFRhYmxlKF90VGFibGUpLAotICBldmxpc3QoRWxpc3QuZ2V0Vm9jYWJMaXN0KCkpLCBmdmxpc3QoRmxpc3QuZ2V0Vm9jYWJMaXN0KCkpCi17fQotCi1tb2RlbDE6Om1vZGVsMSAoY29uc3QgbW9kZWwxJiBtMSwgaW50IF90aHJlYWRJRCk6Ci1yZXBvcnRfaW5mbyhtMSksZWZGaWxlbmFtZShtMS5lZkZpbGVuYW1lKSwKLUVsaXN0KG0xLkVsaXN0KSxGbGlzdChtMS5GbGlzdCksZVRvdGFsV0NvdW50KG0xLmVUb3RhbFdDb3VudCksZlRvdGFsV0NvdW50KG0xLmZUb3RhbFdDb3VudCksCi1ub0VuZ2xpc2hXb3JkcyhtMS5ub0VuZ2xpc2hXb3Jkcyksbm9GcmVuY2hXb3JkcyhtMS5ub0ZyZW5jaFdvcmRzKSx0VGFibGUobTEudFRhYmxlKSwKLWV2bGlzdChtMS5ldmxpc3QpLGZ2bGlzdChtMS5mdmxpc3QpCi17fQotCi12b2lkIG1vZGVsMTo6aW5pdGlhbGl6ZV90YWJsZV91bmlmb3JtbHkoc2VudGVuY2VIYW5kbGVyJiBzSGFuZGxlcjEpewotICBXb3JkSW5kZXggaSwgajsKLQotICBjb3V0IDw8ICJJbml0aWFsaXplIHRUYWJsZVxuIjsKLQotICBzZW50UGFpciBzZW50IDsKLSAgc0hhbmRsZXIxLnJld2luZCgpOwotICB3aGlsZShzSGFuZGxlcjEuZ2V0TmV4dFNlbnRlbmNlKHNlbnQpKXsKLSAgICBWZWN0b3I8V29yZEluZGV4PiYgZXMgPSBzZW50LmVTZW50OwotICAgIFZlY3RvcjxXb3JkSW5kZXg+JiBmcyA9IHNlbnQuZlNlbnQ7Ci0gICAgUFJPQiB1bmlmb3JtID0gMS4wL2VzLnNpemUoKSA7Ci0gICAgZm9yKCBpPTA7IGkgPCBlcy5zaXplKCk7IGkrKykKLSAgICAgICAgICBmb3Ioaj0xOyBqIDwgZnMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgdFRhYmxlLmluc2VydChlc1tpXSxmc1tqXSwwLHVuaWZvcm0pOwotICB9Ci19Ci0KLXN0cnVjdCBlbV9sb29wX3R7Ci0gICAgbW9kZWwxICptMTsKLSAgICBpbnQgaXQ7Ci0gICAgaW50IG50aHJlYWQ7Ci0gICAgRGljdGlvbmFyeSAqZGljdDsKLSAgICBib29sIHVzZURpY3Q7Ci0gICAgaW50IHJlc3VsdDsKLSAgICBwdGhyZWFkX3QgdGhyZWFkOwotICAgIGludCB2YWxpZCA7Ci19OwotICAgIAotdm9pZCogZXhlX2VtbG9vcCh2b2lkICphcmcpewotICAgIGVtX2xvb3BfdCogZW0gPShlbV9sb29wX3QgKikgYXJnOwotICAgIGVtLT5yZXN1bHQgPSBlbS0+bTEtPmVtX3RocmVhZChlbS0+aXQsZW0tPm50aHJlYWQsKmVtLT5kaWN0LGVtLT51c2VEaWN0KTsKLSAgICByZXR1cm4gYXJnOwotfQotCi1pbnQgbW9kZWwxOjplbV90aHJlYWQoaW50IG5vSXRlcmF0aW9ucywgaW50IG50aHJlYWQsIC8qUGVycGxleGl0eSYgcGVycCwgc2VudGVuY2VIYW5kbGVyJiBzSGFuZGxlcjEsICovCi0JCQkgICAgIERpY3Rpb25hcnkmIGRpY3Rpb25hcnksIGJvb2wgdXNlRGljdCAvKlBlcnBsZXhpdHkqIHRlc3RQZXJwLCBzZW50ZW5jZUhhbmRsZXIqIHRlc3RIYW5kbGVyLCAKLQkJCQkJCQkJCQkgICAgIFBlcnBsZXhpdHkmIHRyYWluVml0ZXJiaVBlcnAsIFBlcnBsZXhpdHkqIHRlc3RWaXRlcmJpUGVycCAqLyApCi17Ci0gICAgZG91YmxlIG1pbkVycm9ycz0xLjA7aW50IG1pbkl0ZXI9MDsKLSAgICBzdHJpbmcgbW9kZWxOYW1lPSJNb2RlbDEiLHNob3J0TW9kZWxOYW1lPSIxIjsKLSAgICBjaGFyIGJbMl07Ci0gICAgYlsxXSA9ICdcMCc7Ci0gICAgYlswXSA9ICcwJyArIG50aHJlYWQ7Ci0gICAgdGltZV90IHN0LCBpdF9zdCwgZm4sIGl0X2ZuOwotICAgIHN0cmluZyB0ZmlsZSwgbnVtYmVyLCBhbGlnbmZpbGUsIHRlc3RfYWxpZ25maWxlOwotICAgIGludCBwYWlyX25vOwotICAgIGJvb2wgZHVtcF9maWxlcyA9IGZhbHNlIDsKLSAgICBjb3V0IDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwotICAgIGNvdXQgPDwgbW9kZWxOYW1lIDw8ICIgVHJhaW5pbmcgU3RhcnRlZCBhdDogIjw8IG15X2N0aW1lKCZzdCkgPDwgIlxuIjsgIAotICAgIGludCBpdCA9IG5vSXRlcmF0aW9uczsKLSAgICBwYWlyX25vID0gMCA7Ci0gICAgaXRfc3QgPSB0aW1lKE5VTEwpOwotICAgIGNvdXQgPDwgICItLS0tLS0tLS0tLVxuIiA8PCBtb2RlbE5hbWUgPDwgIjogSXRlcmF0aW9uICIgPDwgaXQgPDwgJ1xuJzsKLSAgICBkdW1wX2ZpbGVzID0gKE1vZGVsMV9EdW1wX0ZyZXEgIT0gMCkgJiYgICgoaXQgJSBNb2RlbDFfRHVtcF9GcmVxKSAgPT0gMCB8fCBub0l0ZXJhdGlvbnMgPT0gaXQpICYmICFOT0RVTVBTIDsKLS8vICAgIGR1bXBfZmlsZXMgPSB0cnVlOwotICAgIG51bWJlciA9ICIiOwotICAgIGludCBuID0gaXQ7Ci0gICAgZG97Ci0gICAgICAgIG51bWJlci5pbnNlcnQoKHNpemVfdCkwLCAxLCAoY2hhcikobiAlIDEwICsgJzAnKSk7Ci0gICAgfSB3aGlsZSgobiAvPSAxMCkgPiAwKTsKLSAgICBhbGlnbmZpbGUgPSBQcmVmaXggKyAiLkEiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgKyAiLnBhcnQiIDsKLSAgICBhbGlnbmZpbGUgPSBhbGlnbmZpbGUgKyBiOwotCi0gICAgZW1fbG9vcChpdCxwZXJwLCBzSGFuZGxlcjEsIGZhbHNlLCBkdW1wX2ZpbGVzLCBhbGlnbmZpbGUuY19zdHIoKSwgZGljdGlvbmFyeSwgdXNlRGljdCwgdHJhaW5WaXRlcmJpUGVycCk7IAotICAgIHJldHVybiBtaW5JdGVyOwotfQotCi1pbnQgbW9kZWwxOjplbV93aXRoX3RyaWNrcyhpbnQgbm9JdGVyYXRpb25zLCAvKlBlcnBsZXhpdHkmIHBlcnAsIHNlbnRlbmNlSGFuZGxlciYgc0hhbmRsZXIxLCAqLwotCQkJICAgIGJvb2wgc2VlZE1vZGVsMSwgRGljdGlvbmFyeSYgZGljdGlvbmFyeSwgYm9vbCB1c2VEaWN0IC8qUGVycGxleGl0eSogdGVzdFBlcnAsIHNlbnRlbmNlSGFuZGxlciogdGVzdEhhbmRsZXIsIAotCQkJCQkJCQkJCSAgICAgUGVycGxleGl0eSYgdHJhaW5WaXRlcmJpUGVycCwgUGVycGxleGl0eSogdGVzdFZpdGVyYmlQZXJwICovIAotLCBib29sIGR1bXBDb3VudCAsICBjb25zdCBjaGFyKiBkdW1wQ291bnROYW1lLCBib29sIHVzZVN0cmluZykgIC8vIElmIHNwZWNpZmllZCwgdGhlbiB3aWxsIGR1bXAgZmlsZXMgYmVmb3JlIGxhc3QgaXRlcmF0aW9uCi17Ci0gICAgZG91YmxlIG1pbkVycm9ycz0xLjA7aW50IG1pbkl0ZXI9MDsKLSAgICBzdHJpbmcgbW9kZWxOYW1lPSJNb2RlbDEiLHNob3J0TW9kZWxOYW1lPSIxIjsKLSAgICB0aW1lX3Qgc3QsIGl0X3N0LCBmbiwgaXRfZm47Ci0gICAgc3RyaW5nIHRmaWxlLCBudW1iZXIsIGFsaWduZmlsZSwgdGVzdF9hbGlnbmZpbGU7Ci0gICAgaW50IHBhaXJfbm87Ci0gICAgYm9vbCBkdW1wX2ZpbGVzID0gZmFsc2UgOwotICAgIHN0ID0gdGltZShOVUxMKTsKLSAgICBzSGFuZGxlcjEucmV3aW5kKCk7Ci0gICAgY291dCA8PCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKLSAgICBjb3V0IDw8IG1vZGVsTmFtZSA8PCAiIFRyYWluaW5nIFN0YXJ0ZWQgYXQ6ICI8PCBteV9jdGltZSgmc3QpIDw8ICJcbiI7ICAKLSAgICBmb3IoaW50IGl0ID0gMTsgaXQgPD0gbm9JdGVyYXRpb25zOyBpdCsrKXsKLSAgICAgICAgcGFpcl9ubyA9IDAgOwotICAgICAgICBpdF9zdCA9IHRpbWUoTlVMTCk7Ci0gICAgICAgIGNvdXQgPDwgICItLS0tLS0tLS0tLVxuIiA8PCBtb2RlbE5hbWUgPDwgIjogSXRlcmF0aW9uICIgPDwgaXQgPDwgJ1xuJzsKLSAgICAgICAgZHVtcF9maWxlcyA9IChNb2RlbDFfRHVtcF9GcmVxICE9IDApICYmICAoKGl0ICUgTW9kZWwxX0R1bXBfRnJlcSkgID09IDAgfHwgaXQgPT0gbm9JdGVyYXRpb25zKSAmJiAhTk9EVU1QUyA7Ci0JLy9kdW1wX2ZpbGVzID0gdHJ1ZTsKLSAgICAgICAgbnVtYmVyID0gIiI7Ci0gICAgICAgIGludCBuID0gaXQ7Ci0gICAgICAgIGRvewotICAgICAgICAgICAgbnVtYmVyLmluc2VydCgoc2l6ZV90KTAsIDEsIChjaGFyKShuICUgMTAgKyAnMCcpKTsKLSAgICAgICAgfSB3aGlsZSgobiAvPSAxMCkgPiAwKTsKLSAgICAgICAgdGZpbGUgPSBQcmVmaXggKyAiLnQiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgICAgICBhbGlnbmZpbGUgPSBQcmVmaXggKyAiLkEiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIrIi5wYXJ0MCIgOwotICAgICAgICB0ZXN0X2FsaWduZmlsZSA9IFByZWZpeCArIi50c3QuQSIgKyBzaG9ydE1vZGVsTmFtZSArICIuIiArIG51bWJlciA7Ci0gICAgICAgIGluaXRBTCgpOwotICAgICAgICB0aHJlYWRJRCA9IDA7Ci0gICAgICAgIGludCB0aDsKLSAgICAgICAgdmVjdG9yPGVtX2xvb3BfdD4gdGhzOwotICAgICAgICB0aHMucmVzaXplKE5DUFVTKTsKLSAgICAgICAgc0hhbmRsZXIxLnJld2luZCgpOwotICAgICAgICBmb3IgKHRoPTE7dGg8TkNQVVM7dGgrKyl7Ci0gICAgICAgICAgICB0aHNbdGhdLm0xPXRoaXM7Ci0gICAgICAgICAgICB0aHNbdGhdLml0ID0gaXQ7Ci0gICAgICAgICAgICB0aHNbdGhdLm50aHJlYWQgPSB0aDsKLSAgICAgICAgICAgIHRoc1t0aF0uZGljdCA9ICYgZGljdGlvbmFyeTsKLSAgICAgICAgICAgIHRoc1t0aF0udXNlRGljdCA9IHVzZURpY3Q7Ci0gICAgICAgICAgICB0aHNbdGhdLnJlc3VsdCA9IDA7Ci0gICAgICAgICAgICB0aHNbdGhdLnZhbGlkID0gcHRocmVhZF9jcmVhdGUoJih0aHNbdGhdLnRocmVhZCksTlVMTCxleGVfZW1sb29wLCYodGhzW3RoXSkpOwotICAgICAgICAgICAgaWYodGhzW3RoXS52YWxpZCl7Ci0gICAgICAgICAgICAgICAgY2VyciA8PCAiRXJyb3Igc3RhcnRpbmcgdGhyZWFkICIgPDwgdGggPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbV9sb29wKGl0LHBlcnAsIHNIYW5kbGVyMSwgc2VlZE1vZGVsMSwgZHVtcF9maWxlcywgYWxpZ25maWxlLmNfc3RyKCksIGRpY3Rpb25hcnksIHVzZURpY3QsIHRyYWluVml0ZXJiaVBlcnApOyAKLSAgICAgICAgcGVycC5yZWNvcmQoIk1vZGVsMSIpOwotICAgICAgICB0cmFpblZpdGVyYmlQZXJwLnJlY29yZCgiTW9kZWwxIik7Ci0gICAgICAgIGVycm9yUmVwb3J0QUwoY291dCwgIklCTS0xIik7Ci0gICAgICAgIAotICAgICAgICBjZXJyIDw8ICJNYWluIHRocmVhZCBkb25lLCB3YWl0aW5nIiA8PCBlbmRsOzsKLSAgICAgICAgZm9yICh0aD0xO3RoPE5DUFVTO3RoKyspewotICAgICAgICAgICAgcHRocmVhZF9qb2luKCh0aHNbdGhdLnRocmVhZCksTlVMTCk7Ci0gICAgICAgICAgICBjZXJyIDw8ICJUaHJlYWQgIiA8PCB0aCA8PCAiZG9uZSIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpIC8vIGNhbGN1bGF0ZSB0ZXN0IHBlcnBsZXhpdHkKLSAgICAgICAgICAgIGVtX2xvb3AoaXQsKnRlc3RQZXJwLCAqdGVzdEhhbmRsZXIsIHNlZWRNb2RlbDEsIGR1bXBfZmlsZXMsIHRlc3RfYWxpZ25maWxlLmNfc3RyKCksIGRpY3Rpb25hcnksIHVzZURpY3QsICp0ZXN0Vml0ZXJiaVBlcnAsIHRydWUpOyAKLSAgICAgICAgaWYoIGVycm9yc0FMKCk8bWluRXJyb3JzICkgewotICAgICAgICAgICAgbWluRXJyb3JzPWVycm9yc0FMKCk7Ci0gICAgICAgICAgICBtaW5JdGVyPWl0OwotICAgICAgICB9Ci0gICAgICAgIC8vaWYgKGR1bXBfZmlsZXMpewotICAgICAgICAvLyAgICBpZiggT3V0cHV0SW5BYWNoZW5Gb3JtYXQ9PTEgKQotICAgICAgICAvLyAgICAgICAgdFRhYmxlLnByaW50Q291bnRUYWJsZSh0ZmlsZS5jX3N0cigpLEVsaXN0LmdldFZvY2FiTGlzdCgpLEZsaXN0LmdldFZvY2FiTGlzdCgpLDEpOwotICAgICAgICAvL30KLSAgICAgICAgY2VyciA8PCAiTm9ybWFsaXppbmcgVCAiIDw8IGVuZGw7Ci0KLQkJLyoqCi0JCSBJZiBhc2tlZCBmb3IgZHVtcGluZyBjb3VudCB0YWJsZSwganVzdCBkdW1wIGl0LgotCQkgKi8KLQkJaWYoZHVtcENvdW50ICYmIGl0ID09IG5vSXRlcmF0aW9ucyl7Ci0JCQlzdHJpbmcgcmVhbFRhYmxlTmFtZSA9IGR1bXBDb3VudE5hbWU7Ci0JCQlyZWFsVGFibGVOYW1lICs9ICIudC5jb3VudCI7Ci0JCQl0VGFibGUucHJpbnRDb3VudFRhYmxlKHJlYWxUYWJsZU5hbWUuY19zdHIoKSxFbGlzdC5nZXRWb2NhYkxpc3QoKSxGbGlzdC5nZXRWb2NhYkxpc3QoKSx1c2VTdHJpbmcpOwotCQl9Ci0JCQotICAgICAgICB0VGFibGUubm9ybWFsaXplVGFibGUoRWxpc3QsIEZsaXN0KTsKLSAgICAgICAgLy9jb3V0IDw8IHRUYWJsZS5nZXRQcm9iKDIsMikgPDwgZW5kbDsKLSAgICAgICAgY2VyciA8PCAiIERPTkUgTm9ybWFsaXppbmcgIiA8PCBlbmRsOwotICAgICAgICBjb3V0IDw8IG1vZGVsTmFtZSA8PCAiOiAoIjw8aXQ8PCIpIFRSQUlOIENST1NTLUVOVFJPUFkgIiA8PCBwZXJwLmNyb3NzX2VudHJvcHkoKQotICAgICAgICAgICAgPDwgIiBQRVJQTEVYSVRZICIgPDwgcGVycC5wZXJwbGV4aXR5KCkgPDwgJ1xuJzsKLSAgICAgICAgaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotICAgICAgICAgICAgY291dCA8PCBtb2RlbE5hbWUgPDwgIjogKCI8PGl0PDwiKSBURVNUIENST1NTLUVOVFJPUFkgIiA8PCAoKnRlc3RQZXJwKS5jcm9zc19lbnRyb3B5KCkKLSAgICAgICAgICAgIDw8ICIgUEVSUExFWElUWSAiIDw8ICgqdGVzdFBlcnApLnBlcnBsZXhpdHkoKSAKLSAgICAgICAgICAgIDw8ICdcbic7Ci0gICAgICAgIGNvdXQgPDwgbW9kZWxOYW1lIDw8ICI6ICgiPDxpdDw8IikgVklURVJCSSBUUkFJTiBDUk9TUy1FTlRST1BZICIgPDwgdHJhaW5WaXRlcmJpUGVycC5jcm9zc19lbnRyb3B5KCkKLSAgICAgICAgICAgIDw8ICIgUEVSUExFWElUWSAiIDw8IHRyYWluVml0ZXJiaVBlcnAucGVycGxleGl0eSgpIDw8ICdcbic7Ci0gICAgICAgIGlmICh0ZXN0UGVycCAmJiB0ZXN0SGFuZGxlcikKLSAgICAgICAgICAgIGNvdXQgPDwgbW9kZWxOYW1lIDw8ICI6ICgiPDwKLSAgICAgICAgICAgIGl0PDwiKSBWSVRFUkJJIFRFU1QgQ1JPU1MtRU5UUk9QWSAiIAotICAgICAgICAgICAgPDwgKCp0ZXN0Vml0ZXJiaVBlcnApLmNyb3NzX2VudHJvcHkoKQotICAgICAgICAgICAgPDwgIiBQRVJQTEVYSVRZICIgPDwgKCp0ZXN0Vml0ZXJiaVBlcnApLnBlcnBsZXhpdHkoKSAKLSAgICAgICAgICAgIDw8ICdcbic7Ci0gICAgICAgIGlmIChkdW1wX2ZpbGVzKXsKLSAgICAgICAgICAgIGlmKCBPdXRwdXRJbkFhY2hlbkZvcm1hdD09MCApCi0gICAgICAgICAgICAgICAgdFRhYmxlLnByaW50UHJvYlRhYmxlKHRmaWxlLmNfc3RyKCksRWxpc3QuZ2V0Vm9jYWJMaXN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsaXN0LmdldFZvY2FiTGlzdCgpLE91dHB1dEluQWFjaGVuRm9ybWF0KTsKLSAgICAgICAgfQotICAgICAgICBpdF9mbiA9IHRpbWUoTlVMTCk7Ci0gICAgICAgIGNvdXQgPDwgIk1vZGVsIDEgSXRlcmF0aW9uOiAiIDw8IGl0PDwgIiB0b29rOiAiIDw8IGRpZmZ0aW1lKGl0X2ZuLCBpdF9zdCkgPDwgIiBzZWNvbmRzXG4iOwotICAgICAgICAKLSAgICAgICAgCi0gICAgfQotICAgIGZuID0gdGltZShOVUxMKSA7Ci0gICAgY291dCA8PCAgIkVudGlyZSAiIDw8IG1vZGVsTmFtZSA8PCAiIFRyYWluaW5nIHRvb2s6ICIgPDwgZGlmZnRpbWUoZm4sIHN0KSA8PCAiIHNlY29uZHNcbiI7Ci0gICAgcmV0dXJuIG1pbkl0ZXI7Ci19Ci0KLWJvb2wgbW9kZWwxOjpsb2FkX3RhYmxlKGNvbnN0IGNoYXIqIHRuYW1lKXsKLSAgLyogVGhpcyBmdW5jdGlvbiBsb2FkcyB0aGUgdCB0YWJsZSBmcm9tIHRoZSBnaXZlbiBmaWxlOyB1c2UgaXQKLSAgICAgd2hlbiB5b3Ugd2FudCB0byBsb2FkIHJlc3VsdHMgZnJvbSBwcmV2aW91cyB0IHRyYWluaW5nCi0gICAgIHdpdGhvdXQgZG9pbmcgYW55IG5ldyB0cmFpbmluZy4KLSAgICAgTkFTLCA3LzExLzk5Ci0gICovCi0gICAgY291dCA8PCAiTW9kZWwxOiBsb2FkaW5nIHQgdGFibGUgXG4iIDsKLSAgICByZXR1cm4gdFRhYmxlLnJlYWRQcm9iVGFibGUodG5hbWUpOwotfQotCi0gIAotZXh0ZXJuIGZsb2F0IE1JTkNPVU5USU5DUkVBU0U7Ci12b2lkIG1vZGVsMTo6ZW1fbG9vcChpbnQgaXQsUGVycGxleGl0eSYgcGVycCwgc2VudGVuY2VIYW5kbGVyJiBzSGFuZGxlcjEsIGJvb2wgc2VlZE1vZGVsMSwgCi0JCSAgICAgYm9vbCBkdW1wX2FsaWdubWVudCwgY29uc3QgY2hhciogYWxpZ25maWxlLCBEaWN0aW9uYXJ5JiBkaWN0LCBib29sIHVzZURpY3QsIFBlcnBsZXhpdHkmIHZpdGVyYmlfcGVycCwgYm9vbCB0ZXN0KQotewotICAgIFdvcmRJbmRleCBpLCBqLCBsLCBtIDsKLSAgICBkb3VibGUgY3Jvc3NfZW50cm9weTsKLSAgICBpbnQgcGFpcl9ubz0wIDsKLSAgICBwZXJwLmNsZWFyKCk7Ci0gICAgdml0ZXJiaV9wZXJwLmNsZWFyKCk7Ci0gICAgb2ZzdHJlYW0gb2YyOwotICAgIC8vIGZvciBlYWNoIHNlbnRlbmNlIHBhaXIgaW4gdGhlIGNvcnB1cwotICAgIGlmIChkdW1wX2FsaWdubWVudHx8RkVXRFVNUFMpCi0gICAgICAgIG9mMi5vcGVuKGFsaWduZmlsZSk7Ci0gICAgUFJPQiB1bmlmb3JtID0gMS4wL25vRnJlbmNoV29yZHMgOwotICAgIHNlbnRQYWlyIHNlbnQgOwotICAgIAotICAgIHdoaWxlKHNIYW5kbGVyMS5nZXROZXh0U2VudGVuY2Uoc2VudCkpewotICAgICAgICBWZWN0b3I8V29yZEluZGV4PiYgZXMgPSBzZW50LmVTZW50OwotICAgICAgICBWZWN0b3I8V29yZEluZGV4PiYgZnMgPSBzZW50LmZTZW50OwotICAgICAgICBjb25zdCBmbG9hdCBzbyAgPSBzZW50LmdldENvdW50KCk7Ci0gICAgICAgIGwgPSBlcy5zaXplKCkgLSAxOwotICAgICAgICBtID0gZnMuc2l6ZSgpIC0gMTsKLSAgICAgICAgY3Jvc3NfZW50cm9weSA9IGxvZygxLjApOwotICAgICAgICBWZWN0b3I8V29yZEluZGV4PiB2aXRlcmJpX2FsaWdubWVudChmcy5zaXplKCkpOwotICAgICAgICBkb3VibGUgdml0ZXJiaV9zY29yZSA9IDEgOwotICAgICAgICAKLSNpZmRlZiBXSU4zMgotCQlib29sICplaW5kaWN0ID0gbmV3IGJvb2xbbCArIDFdOwotCQlib29sICpmaW5kaWN0ID0gbmV3IGJvb2xbbSArIDFdOwotCQlib29sICoqaW5kaWN0ICA9IG5ldyBib29sKlttICsgMV07Ci0JCWZvcihpbnQgX2kgPSAwOyBfaSA8IG0rMTsgX2krKykKLQkJCWluZGljdFtfaV0gPSBuZXcgYm9vbFtsICsgMV07Ci0jZWxzZQotICAgICAgICBib29sIGVpbmRpY3RbbCArIDFdOwotICAgICAgICBib29sIGZpbmRpY3RbbSArIDFdOwotICAgICAgICBib29sIGluZGljdFttICsgMV1bbCArIDFdOwotI2VuZGlmCi0gICAgICAgIGlmKGl0ID09IDEgJiYgdXNlRGljdCl7Ci0gICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGR1bW15ID0gMDsgZHVtbXkgPD0gbDsgZHVtbXkrKykgZWluZGljdFtkdW1teV0gPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgZHVtbXkgPSAwOyBkdW1teSA8PSBtOyBkdW1teSsrKXsKLSAgICAgICAgICAgICAgICBmaW5kaWN0W2R1bW15XSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgZHVtbXkyID0gMDsgZHVtbXkyIDw9IGw7IGR1bW15MisrKSAKLSAgICAgICAgICAgICAgICAgICAgaW5kaWN0W2R1bW15XVtkdW1teTJdID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaiA9IDA7IGogPD0gbTsgaisrKQotICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8PSBsOyBpKyspCi0gICAgICAgICAgICAgICAgaWYoZGljdC5pbmRpY3QoZnNbal0sIGVzW2ldKSl7Ci0gICAgICAgICAgICAgICAgICAgIGVpbmRpY3RbaV0gPSBmaW5kaWN0W2pdID0gaW5kaWN0W2pdW2ldID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvcihqPTE7IGogPD0gbTsgaisrKXsKLSAgICAgICAgICAgIC8vIGVudHJpZXMgIHRoYXQgbWFwIGZzIHRvIGFsbCBwb3NzaWJsZSBlaSBpbiB0aGlzIHNlbnRlbmNlLgotICAgICAgICAgICAgVmVjdG9yPExwUGFpcjxDT1VOVCxQUk9CPiAqPiBzUHRyQ2FjaGUoZXMuc2l6ZSgpLDApOyAvLyBjYWNoZSBwb2ludGVycyB0byB0YWJsZSAKLSAgICAgICAgICAgIExwUGFpcjxDT1VOVCxQUk9CPiAqKnNQdHJDYWNoZVB0cjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUFJPQiBkZW5vbSA9IDAuMDsKLSAgICAgICAgICAgIFdvcmRJbmRleCBiZXN0X2kgPSAwIDsgLy8gaSBmb3Igd2hpY2ggZmogaXMgYmVzdCBtYXBlZCB0byBlaQotICAgICAgICAgICAgUFJPQiB3b3JkX2Jlc3Rfc2NvcmUgPSAwIDsgIC8vIHNjb3JlIGZvciB0aGUgYmVzdCBtYXBwaW5nIG9mIGZqCi0gICAgICAgICAgICBpZiAoaXQgPT0gMSAmJiAhc2VlZE1vZGVsMSl7Ci0gICAgICAgICAgICAgICAgZGVub20gPSB1bmlmb3JtICAqIGVzLnNpemUoKSA7Ci0gICAgICAgICAgICAgICAgd29yZF9iZXN0X3Njb3JlID0gdW5pZm9ybSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgIGZvcigoaT0wKSwoc1B0ckNhY2hlUHRyPSZzUHRyQ2FjaGVbMF0pOyBpIDw9IGw7IGkrKyxzUHRyQ2FjaGVQdHIrKyl7Ci0gICAgICAgICAgICAgICAgICAgIFBST0IgZSgwLjApIDsKLSAgICAgICAgICAgICAgICAgICAgKCpzUHRyQ2FjaGVQdHIpID0gdFRhYmxlLmdldFB0cihlc1tpXSwgZnNbal0pIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgqc1B0ckNhY2hlUHRyKSAhPSAwICYmICgqKCgqc1B0ckNhY2hlUHRyKSkpLnByb2IgPiBQUk9CX1NNT09USCkgCi0gICAgICAgICAgICAgICAgICAgICAgICBlID0gKCooKCpzUHRyQ2FjaGVQdHIpKSkucHJvYjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBlID0gUFJPQl9TTU9PVEggOwotICAgICAgICAgICAgICAgICAgICBkZW5vbSArPSBlICA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlID4gd29yZF9iZXN0X3Njb3JlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRfYmVzdF9zY29yZSA9IGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9pID0gaSA7Ci0gICAgICAgICAgICAgICAgICAgIH0JCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgdml0ZXJiaV9hbGlnbm1lbnRbal0gPSBiZXN0X2kgOwotICAgICAgICAgICAgdml0ZXJiaV9zY29yZSAqPSB3b3JkX2Jlc3Rfc2NvcmUgOyAvLy8gZGVub20gOwotICAgICAgICAgICAgaWYgKGRlbm9tID09IDApewotICAgICAgICAgICAgICAgIGlmICh0ZXN0KQotICAgICAgICAgICAgICAgICAgICBjZXJyIDw8ICJXQVJOSU5HOiBkZW5vbSBpcyB6ZXJvIChURVNUKVxuIjsKLSAgICAgICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgICAgICBjZXJyIDw8ICJXQVJOSU5HOiBkZW5vbSBpcyB6ZXJvIChUUkFJTilcbiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjcm9zc19lbnRyb3B5ICs9IGxvZyhkZW5vbSkgOwotICAgICAgICAgICAgaWYgKCF0ZXN0KXsKLSAgICAgICAgICAgICAgICBpZihkZW5vbSA+IDApewkgIAotICAgICAgICAgICAgICAgICAgICBDT1VOVCB2YWwgPSBDT1VOVChzbykgLyAoQ09VTlQpIGRvdWJsZShkZW5vbSkgOwotICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGlmIGxvb3AgaW1wbGVtZW50cyBhIGNvbnN0cmFpbnQgb24gY291bnRpbmc6Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50KGVzW2ldLCBmc1tqXSkgaXMgaW1wbGVtZW50ZWQgaWYgYW5kIG9ubHkgaWYKLSAgICAgICAgICAgICAgICAgICAgZXNbaV0gYW5kIGZzW2pdIG9jY3VyIHRvZ2V0aGVyIGluIHRoZSBkaWN0aW9uYXJ5LCAKLSAgICAgICAgICAgICAgICAgICAgT1IKLSAgICAgICAgICAgICAgICAgICAgZXNbaV0gZG9lcyBub3Qgb2NjdXIgaW4gdGhlIGRpY3Rpb25hcnkgd2l0aCBhbnkgZnNbeF0gYW5kCi0gICAgICAgICAgICAgICAgICAgIGZzW2pdIGRvZXMgbm90IG9jY3VyIGluIHRoZSBkaWN0aW9uYXJ5IHdpdGggYW55IGVzW3ldCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmKGl0ID09IDEgJiYgdXNlRGljdCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoKGk9MCksKHNQdHJDYWNoZVB0cj0mc1B0ckNhY2hlWzBdKTsgaSA8PSBsOyBpKyssc1B0ckNhY2hlUHRyKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZGljdFtqXVtpXSB8fCAoIWZpbmRpY3Rbal0gJiYgIWVpbmRpY3RbaV0pKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQiBlKDAuMCkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgPT0gMSAmJiAhc2VlZE1vZGVsMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAgdW5pZm9ybSAgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoKnNQdHJDYWNoZVB0cikgIT0gMCAmJiAgKCooKCpzUHRyQ2FjaGVQdHIpKSkucHJvYiA+IFBST0JfU01PT1RIKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAoKigoKnNQdHJDYWNoZVB0cikpKS5wcm9iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGUgPSBQUk9CX1NNT09USCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPVU5UIHg9ZSp2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoaXQ9PTEgJiYgIXNlZWRNb2RlbDEpfHx4Pk1JTkNPVU5USU5DUkVBU0UgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBpZiAoKCpzUHRyQ2FjaGVQdHIpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKigoKnNQdHJDYWNoZVB0cikpKS5jb3VudCArPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIAkgICAgICAqLwotCQkJCQkJCQkJdFRhYmxlLmluY0NvdW50KGVzW2ldLCBmc1tqXSwgeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBlbmQgb2YgaWYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIGZvciBpICovCi0gICAgICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIGl0ID09IDEgKi8KLSAgICAgICAgICAgICAgICAgICAgLy8gT2xkIGNvZGU6Ci0gICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoKGk9MCksKHNQdHJDYWNoZVB0cj0mc1B0ckNhY2hlWzBdKTsgaSA8PSBsOyBpKyssc1B0ckNhY2hlUHRyKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yKGk9MDsgaSA8PSBsOyBpKyspIHsJICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0IgZSgwLjApIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgPT0gMSAmJiAhc2VlZE1vZGVsMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9ICB1bmlmb3JtICA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKCpzUHRyQ2FjaGVQdHIpICE9IDAgJiYgICgqKCgqc1B0ckNhY2hlUHRyKSkpLnByb2IgPiBQUk9CX1NNT09USCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAoKigoKnNQdHJDYWNoZVB0cikpKS5wcm9iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZSA9IFBST0JfU01PT1RIIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmKCAhKGk9PTApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvdXQgPDwgIkNPVU5UKGUpOiAiIDw8IGUgPDwgIiAiIDw8IE1JTkNPVU5USU5DUkVBU0UgPDwgZW5kbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1VOVCB4PWUqdmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwYWlyX25vPT1WZXJib3NlU2VudGVuY2UgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3V0IDw8IGkgPDwgIigiIDw8IGV2bGlzdFtlc1tpXV0ud29yZCA8PCAiKSwiIDw8IGogPDwgIigiIDw8IGZ2bGlzdFtmc1tqXV0ud29yZCA8PCAiKT0iIDw8IHggPDwgZW5kbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKGl0PT0xICYmICFzZWVkTW9kZWwxKXx8eD5NSU5DT1VOVElOQ1JFQVNFICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaWYoIE5vRW1wdHlXb3JkPT0wIHx8IGkhPTAgKQotCQkJCQkJCQlpZiAoKCpzUHRyQ2FjaGVQdHIpICE9IDApIAotCQkJCQkJCQkoKigoKnNQdHJDYWNoZVB0cikpKS5jb3VudCArPSB4OwotCQkJCQkJCWVsc2UgKi8JICAgICAgCi0JCQkJCQkJCS8vY2VyciA8PCBpIDw8ICIgIiA8PCBqIDw8ICIgKCspICIgPDwgZW5kbDsKLQkJCQkJCQkJLy9jZXJyLmZsdXNoKCk7Ci0JCQkJCQkJCS8vY2VyciA8PCBlc1tpXSA8PCAiICIgPDwgZnNbal0gPDwgIiAoPSkgIjw8IGVuZGw7Ci0JCQkJCQkJCS8vY2Vyci5mbHVzaCgpOwotCQkJCQkJCQl0VGFibGUuaW5jQ291bnQoZXNbaV0sIGZzW2pdLCB4KTsKLQkJCQkJCQkJLy9jZXJyIDw8IGVzW2ldIDw8ICIgIiA8PCBmc1tqXSA8PCAiICgtKSAiPDwgZW5kbDsKLQkJCQkJCQkJLy9jZXJyLmZsdXNoKCk7Ci0JCQkJCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBlbmQgb2YgZm9yIGkgKi8KLSAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgb2YgZWxzZQotICAgICAgICAgICAgICAgIH0gLy8gZW5kIG9mIGlmIChkZW5vbSA+IDApCi0gICAgICAgICAgICB9Ly8gaWYgKCF0ZXN0KQotICAgICAgICB9IC8vIGVuZCBvZiBmb3IgKGopIDsKLSAgICAgICAgc0hhbmRsZXIxLnNldFByb2JPZlNlbnRlbmNlKHNlbnQsY3Jvc3NfZW50cm9weSk7Ci0gICAgICAgIC8vY2VyciA8PCBzZW50IDw8ICJDRTogIiA8PCBjcm9zc19lbnRyb3B5IDw8ICIgIiA8PCBzbyA8PCBlbmRsOwotICAgICAgICBwZXJwLmFkZEZhY3Rvcihjcm9zc19lbnRyb3B5LW0qbG9nKGwrMS4wKSwgc28sIGwsIG0sMSk7Ci0gICAgICAgIHZpdGVyYmlfcGVycC5hZGRGYWN0b3IobG9nKHZpdGVyYmlfc2NvcmUpLW0qbG9nKGwrMS4wKSwgc28sIGwsIG0sMSk7Ci0gICAgICAgIGlmIChkdW1wX2FsaWdubWVudHx8KEZFV0RVTVBTJiZzZW50LnNlbnRlbmNlTm88MTAwMCkpCi0gICAgICAgICAgICBwcmludEFsaWduVG9GaWxlKGVzLCBmcywgZXZsaXN0LCBmdmxpc3QsIG9mMiwgdml0ZXJiaV9hbGlnbm1lbnQsIHNlbnQuc2VudGVuY2VObywgdml0ZXJiaV9zY29yZSk7Ci0gICAgICAgIGFkZEFMKHZpdGVyYmlfYWxpZ25tZW50LHNlbnQuc2VudGVuY2VObyxsKTsKLSAgICAgICAgcGFpcl9ubysrOwotI2lmZGVmIFdJTjMyCi0JCWRlbGV0ZVtdIGVpbmRpY3Q7Ci0JCWRlbGV0ZVtdIGZpbmRpY3Q7CQkKLQkJZm9yKGludCBfaSA9IDA7IF9pIDwgbSsxOyBfaSsrKQotCQkJZGVsZXRlW10gaW5kaWN0W19pXTsKLQkJZGVsZXRlW10gaW5kaWN0OwotI2VuZGlmCi0gICAgfSAvKiBvZiB3aGlsZSAqLwotfQotCi1DVFRhYmxlRGlmZjxDT1VOVCxQUk9CPiogbW9kZWwxOjpvbmVfc3RlcF9lbShpbnQgaXQsIGJvb2wgc2VlZE1vZGVsMSwgCi0gICAgRGljdGlvbmFyeSYgZGljdGlvbmFyeSwgYm9vbCB1c2VEaWN0KXsKLSAgICAgICAgQ1RUYWJsZURpZmY8Q09VTlQsUFJPQj4gKmRpZmYgPSBuZXcgQ1RUYWJsZURpZmY8Q09VTlQsUFJPQj4oKTsKLSAgICAgICAgZG91YmxlIG1pbkVycm9ycz0xLjA7aW50IG1pbkl0ZXI9MDsKLSAgICAgICAgc3RyaW5nIG1vZGVsTmFtZT0iTW9kZWwxIixzaG9ydE1vZGVsTmFtZT0iMSI7Ci0gICAgICAgIHRpbWVfdCBzdCwgaXRfc3QsIGZuLCBpdF9mbjsKLSAgICAgICAgc3RyaW5nIHRmaWxlLCBudW1iZXIsIGFsaWduZmlsZSwgdGVzdF9hbGlnbmZpbGU7Ci0gICAgICAgIGludCBwYWlyX25vOwotICAgICAgICBib29sIGR1bXBfZmlsZXMgPSBmYWxzZSA7Ci0gICAgICAgIHN0ID0gdGltZShOVUxMKTsKLSAgICAgICAgc0hhbmRsZXIxLnJld2luZCgpOwotICAgICAgICBjb3V0IDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwotICAgICAgICBjb3V0IDw8IG1vZGVsTmFtZSA8PCAiIFRyYWluaW5nIFN0YXJ0ZWQgYXQ6ICI8PCBteV9jdGltZSgmc3QpIDw8ICJcbiI7ICAKLSAgICAgICAgcGFpcl9ubyA9IDAgOwotICAgICAgICBpdF9zdCA9IHRpbWUoTlVMTCk7Ci0gICAgICAgIGNvdXQgPDwgICItLS0tLS0tLS0tLVxuIiA8PCBtb2RlbE5hbWUgPDwgIjogSXRlcmF0aW9uICIgPDwgaXQgPDwgJ1xuJzsKLSAgICAgICAgZHVtcF9maWxlcyA9IChNb2RlbDFfRHVtcF9GcmVxICE9IDApICYmICAoKGl0ICUgTW9kZWwxX0R1bXBfRnJlcSkgID09IDApICYmICFOT0RVTVBTIDsKLSAgICAgICAgbnVtYmVyID0gIiI7Ci0gICAgICAgIGludCBuID0gaXQ7Ci0gICAgICAgIGRvewotICAgICAgICAgICAgbnVtYmVyLmluc2VydCgoc2l6ZV90KTAsIDEsIChjaGFyKShuICUgMTAgKyAnMCcpKTsKLSAgICAgICAgfSB3aGlsZSgobiAvPSAxMCkgPiAwKTsKLSAgICAgICAgdGZpbGUgPSBQcmVmaXggKyAiLnQiICsgc2hvcnRNb2RlbE5hbWUgKyAiLiIgKyBudW1iZXIgOwotICAgICAgICBhbGlnbmZpbGUgPSBQcmVmaXggKyAiLkExIiA7Ci0gICAgICAgIHRlc3RfYWxpZ25maWxlID0gUHJlZml4ICsiLnRzdC5BIiArIHNob3J0TW9kZWxOYW1lICsgIi4iICsgbnVtYmVyIDsKLSAgICAgICAgaW5pdEFMKCk7Ci0gICAgICAgIGVtX2xvb3BfMShkaWZmLGl0LHBlcnAsIHNIYW5kbGVyMSwgc2VlZE1vZGVsMSwgCi0gICAgICAgICAgICAgICAgICBkdW1wX2ZpbGVzLCBhbGlnbmZpbGUuY19zdHIoKSwgZGljdGlvbmFyeSwgdXNlRGljdCwgdHJhaW5WaXRlcmJpUGVycCk7IAotICAgICAgICAvL2lmICh0ZXN0UGVycCAmJiB0ZXN0SGFuZGxlcikgLy8gY2FsY3VsYXRlIHRlc3QgcGVycGxleGl0eQotICAgICAgICAvLyAgICBlbV9sb29wKGl0LCp0ZXN0UGVycCwgKnRlc3RIYW5kbGVyLCBzZWVkTW9kZWwxLCBkdW1wX2ZpbGVzLCB0ZXN0X2FsaWduZmlsZS5jX3N0cigpLCBkaWN0aW9uYXJ5LCB1c2VEaWN0LCAqdGVzdFZpdGVyYmlQZXJwLCB0cnVlKTsgCi0gICAgICAgIGlmKCBlcnJvcnNBTCgpPG1pbkVycm9ycyApewotICAgICAgICAgICAgbWluRXJyb3JzPWVycm9yc0FMKCk7Ci0gICAgICAgICAgICBtaW5JdGVyPWl0OwotICAgICAgICB9Ci0gICAgICAgIGZuID0gdGltZShOVUxMKSA7Ci0gICAgICAgIGNvdXQgPDwgICJQYXJ0aWFsICIgPDwgbW9kZWxOYW1lIDw8ICIgVHJhaW5pbmcgdG9vazogIiA8PCBkaWZmdGltZShmbiwgaXRfc3QpIDw8ICIgc2Vjb25kc1xuIjsKLSAgICAgICAgcmV0dXJuIGRpZmY7ICAgICAgICAKLSAgICB9Ci0KLSAgICB2b2lkIG1vZGVsMTo6Y29tYmluZV9vbmUoQ1RUYWJsZURpZmY8Q09VTlQsUFJPQj4qIGNiKXsKLSAgICAgICAgY2ItPkF1Z21lbnRUVGFibGUodFRhYmxlKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBtb2RlbDE6OnJlY29tYmluZSgpewotICAgICAgICB0VGFibGUubm9ybWFsaXplVGFibGUoRWxpc3QsIEZsaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzYXZlX3RhYmxlKGNvbnN0IGNoYXIqIHRuYW1lKXsKLS8qICAgICAgICAgaWYgKGR1bXBfZmlsZXMpewotICogICAgICAgICAgICAgaWYoIE91dHB1dEluQWFjaGVuRm9ybWF0PT0wICkKLSAqICAgICAgICAgICAgICAgICB0VGFibGUucHJpbnRQcm9iVGFibGUodGZpbGUuY19zdHIoKSxFbGlzdC5nZXRWb2NhYkxpc3QoKSxGbGlzdC5nZXRWb2NhYkxpc3QoKSxPdXRwdXRJbkFhY2hlbkZvcm1hdCk7Ci0gKi8KLQotICAgIH0KLQotICAgICAgICAKLXZvaWQgbW9kZWwxOjplbV9sb29wXzEoQ1RUYWJsZURpZmY8Q09VTlQsUFJPQj4gKmRpZmYsaW50IGl0LFBlcnBsZXhpdHkmIHBlcnAsIHNlbnRlbmNlSGFuZGxlciYgc0hhbmRsZXIxLCBib29sIHNlZWRNb2RlbDEsIAotICAgIGJvb2wgZHVtcF9hbGlnbm1lbnQsIGNvbnN0IGNoYXIqIGFsaWduZmlsZSwgRGljdGlvbmFyeSYgZGljdCwgYm9vbCB1c2VEaWN0LCBQZXJwbGV4aXR5JiB2aXRlcmJpX3BlcnAsIGJvb2wgdGVzdCkgICAgewotICAgICAgICBXb3JkSW5kZXggaSwgaiwgbCwgbSA7Ci0gICAgICAgIGRvdWJsZSBjcm9zc19lbnRyb3B5OwotICAgICAgICBpbnQgcGFpcl9ubz0wIDsKLSAgICAgICAgcGVycC5jbGVhcigpOwotICAgICAgICB2aXRlcmJpX3BlcnAuY2xlYXIoKTsKLSAgICAgICAgb2ZzdHJlYW0gb2YyOwotICAgICAgICAvLyBmb3IgZWFjaCBzZW50ZW5jZSBwYWlyIGluIHRoZSBjb3JwdXMKLSAgICAgICAgaWYgKGR1bXBfYWxpZ25tZW50fHxGRVdEVU1QUykKLSAgICAgICAgICAgIG9mMi5vcGVuKGFsaWduZmlsZSk7Ci0gICAgICAgIFBST0IgdW5pZm9ybSA9IDEuMC9ub0ZyZW5jaFdvcmRzIDsKLSAgICAgICAgc2VudFBhaXIgc2VudCA7Ci0gICAgICAgIHNIYW5kbGVyMS5yZXdpbmQoKTsKLSAgICAgICAgd2hpbGUoc0hhbmRsZXIxLmdldE5leHRTZW50ZW5jZShzZW50KSl7Ci0gICAgICAgICAgICBWZWN0b3I8V29yZEluZGV4PiYgZXMgPSBzZW50LmVTZW50OwotICAgICAgICAgICAgVmVjdG9yPFdvcmRJbmRleD4mIGZzID0gc2VudC5mU2VudDsKLSAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNvICA9IHNlbnQuZ2V0Q291bnQoKTsKLSAgICAgICAgICAgIGwgPSBlcy5zaXplKCkgLSAxOwotICAgICAgICAgICAgbSA9IGZzLnNpemUoKSAtIDE7Ci0gICAgICAgICAgICBjcm9zc19lbnRyb3B5ID0gbG9nKDEuMCk7Ci0gICAgICAgICAgICBWZWN0b3I8V29yZEluZGV4PiB2aXRlcmJpX2FsaWdubWVudChmcy5zaXplKCkpOwotICAgICAgICAgICAgZG91YmxlIHZpdGVyYmlfc2NvcmUgPSAxIDsKLQotI2lmZGVmIFdJTjMyCi0JCQlib29sICplaW5kaWN0ID0gbmV3IGJvb2xbbCArIDFdOwotCQkJYm9vbCAqZmluZGljdCA9IG5ldyBib29sW20gKyAxXTsKLQkJCWJvb2wgKippbmRpY3QgID0gbmV3IGJvb2wqW20gKyAxXTsKLQkJCWZvcihpbnQgX2kgPSAwOyBfaSA8IG0rMTsgX2krKykKLQkJCQlpbmRpY3RbX2ldID0gbmV3IGJvb2xbbCArIDFdOwotI2Vsc2UKLQkJCWJvb2wgZWluZGljdFtsICsgMV07Ci0JCQlib29sIGZpbmRpY3RbbSArIDFdOwotCQkJYm9vbCBpbmRpY3RbbSArIDFdW2wgKyAxXTsKLSNlbmRpZgotICAgICAgICAgICAgaWYoaXQgPT0gMSAmJiB1c2VEaWN0KXsKLSAgICAgICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGR1bW15ID0gMDsgZHVtbXkgPD0gbDsgZHVtbXkrKykgZWluZGljdFtkdW1teV0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGR1bW15ID0gMDsgZHVtbXkgPD0gbTsgZHVtbXkrKyl7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRpY3RbZHVtbXldID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgZHVtbXkyID0gMDsgZHVtbXkyIDw9IGw7IGR1bW15MisrKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGljdFtkdW1teV1bZHVtbXkyXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPD0gbTsgaisrKQotICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPD0gbDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBpZihkaWN0LmluZGljdChmc1tqXSwgZXNbaV0pKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVpbmRpY3RbaV0gPSBmaW5kaWN0W2pdID0gaW5kaWN0W2pdW2ldID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3Ioaj0xOyBqIDw9IG07IGorKyl7Ci0gICAgICAgICAgICAgICAgLy8gZW50cmllcyAgdGhhdCBtYXAgZnMgdG8gYWxsIHBvc3NpYmxlIGVpIGluIHRoaXMgc2VudGVuY2UuCi0gICAgICAgICAgICAgICAgVmVjdG9yPExwUGFpcjxDT1VOVCxQUk9CPiAqPiBzUHRyQ2FjaGUoZXMuc2l6ZSgpLDApOyAvLyBjYWNoZSBwb2ludGVycyB0byB0YWJsZSAKLSAgICAgICAgICAgICAgICAvL1ZlY3RvcjxDT1VOVCAqPiBzUHRyQ2FjaGVEaWYoZXMuc2l6ZSgpLDApOyAvLyBjYWNoZSBwb2ludGVycyB0byB0YWJsZSAKLSAgICAgICAgICAgICAgICBMcFBhaXI8Q09VTlQsUFJPQj4gKipzUHRyQ2FjaGVQdHI7Ci0gICAgICAgICAgICAgICAgLy9DT1VOVCAqKnNQdHJDYWNoZVB0ckRpZjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBQUk9CIGRlbm9tID0gMC4wOwotICAgICAgICAgICAgICAgIFdvcmRJbmRleCBiZXN0X2kgPSAwIDsgLy8gaSBmb3Igd2hpY2ggZmogaXMgYmVzdCBtYXBlZCB0byBlaQotICAgICAgICAgICAgICAgIFBST0Igd29yZF9iZXN0X3Njb3JlID0gMCA7ICAvLyBzY29yZSBmb3IgdGhlIGJlc3QgbWFwcGluZyBvZiBmagotICAgICAgICAgICAgICAgIGlmIChpdCA9PSAxICYmICFzZWVkTW9kZWwxKXsKLSAgICAgICAgICAgICAgICAgICAgZGVub20gPSB1bmlmb3JtICAqIGVzLnNpemUoKSA7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRfYmVzdF9zY29yZSA9IHVuaWZvcm0gOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKChpPTApLChzUHRyQ2FjaGVQdHI9JnNQdHJDYWNoZVswXSk7IGkgPD0gbDsgaSsrLHNQdHJDYWNoZVB0cisrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBST0IgZSgwLjApIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqc1B0ckNhY2hlUHRyKSA9IHRUYWJsZS5nZXRQdHIoZXNbaV0sIGZzW2pdKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLygqc1B0ckNhY2hlUHRyRGlmKSA9IGRpZmYtPkdldFB0cihlc1tpXSwgZnNbal0pIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKnNQdHJDYWNoZVB0cikgIT0gMCAmJiAoKigoKnNQdHJDYWNoZVB0cikpKS5wcm9iID4gUFJPQl9TTU9PVEgpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAoKigoKnNQdHJDYWNoZVB0cikpKS5wcm9iOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBlID0gUFJPQl9TTU9PVEggOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVub20gKz0gZSAgOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPiB3b3JkX2Jlc3Rfc2NvcmUpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRfYmVzdF9zY29yZSA9IGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfaSA9IGkgOwotICAgICAgICAgICAgICAgICAgICAgICAgfQkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2aXRlcmJpX2FsaWdubWVudFtqXSA9IGJlc3RfaSA7Ci0gICAgICAgICAgICAgICAgdml0ZXJiaV9zY29yZSAqPSB3b3JkX2Jlc3Rfc2NvcmUgOyAvLy8gZGVub20gOwotICAgICAgICAgICAgICAgIGlmIChkZW5vbSA9PSAwKXsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICBjZXJyIDw8ICJXQVJOSU5HOiBkZW5vbSBpcyB6ZXJvIChURVNUKVxuIjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNlcnIgPDwgIldBUk5JTkc6IGRlbm9tIGlzIHplcm8gKFRSQUlOKVxuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3Jvc3NfZW50cm9weSArPSBsb2coZGVub20pIDsKLSAgICAgICAgICAgICAgICBpZiAoIXRlc3QpewotICAgICAgICAgICAgICAgICAgICBpZihkZW5vbSA+IDApewkgIAotICAgICAgICAgICAgICAgICAgICAgICAgQ09VTlQgdmFsID0gQ09VTlQoc28pIC8gKENPVU5UKSBkb3VibGUoZGVub20pIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgaWYgbG9vcCBpbXBsZW1lbnRzIGEgY29uc3RyYWludCBvbiBjb3VudGluZzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50KGVzW2ldLCBmc1tqXSkgaXMgaW1wbGVtZW50ZWQgaWYgYW5kIG9ubHkgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzW2ldIGFuZCBmc1tqXSBvY2N1ciB0b2dldGhlciBpbiB0aGUgZGljdGlvbmFyeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBPUgotICAgICAgICAgICAgICAgICAgICAgICAgZXNbaV0gZG9lcyBub3Qgb2NjdXIgaW4gdGhlIGRpY3Rpb25hcnkgd2l0aCBhbnkgZnNbeF0gYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBmc1tqXSBkb2VzIG5vdCBvY2N1ciBpbiB0aGUgZGljdGlvbmFyeSB3aXRoIGFueSBlc1t5XQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ID09IDEgJiYgdXNlRGljdCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKChpPTApLChzUHRyQ2FjaGVQdHI9JnNQdHJDYWNoZVswXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPD0gbDsgaSsrLHNQdHJDYWNoZVB0cisrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5kaWN0W2pdW2ldIHx8ICghZmluZGljdFtqXSAmJiAhZWluZGljdFtpXSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQiBlKDAuMCkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ID09IDEgJiYgIXNlZWRNb2RlbDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9ICB1bmlmb3JtICA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoKnNQdHJDYWNoZVB0cikgIT0gMCAmJiAgKCooKCpzUHRyQ2FjaGVQdHIpKSkucHJvYiA+IFBST0JfU01PT1RIKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gKCooKCpzUHRyQ2FjaGVQdHIpKSkucHJvYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZSA9IFBST0JfU01PT1RIIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPVU5UIHg9ZSp2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaXQ9PTF8fHg+TUlOQ09VTlRJTkNSRUFTRSApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaWYgKCgqc1B0ckNhY2hlUHRyKSAhPSAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKCpzUHRyQ2FjaGVQdHIpKSkuY291bnQgKz0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRUYWJsZS5pbmNDb3VudChlc1tpXSwgZnNbal0sIHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYtPmluY0NvdW50KGVzW2ldLCBmc1tqXSwgeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIGlmICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBlbmQgb2YgZm9yIGkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIGl0ID09IDEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9sZCBjb2RlOgotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoKGk9MCksKHNQdHJDYWNoZVB0cj0mc1B0ckNhY2hlWzBdKTsgaSA8PSBsOyBpKyssc1B0ckNhY2hlUHRyKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvcihpPTA7IGkgPD0gbDsgaSsrKSB7CSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQiBlKDAuMCkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgPT0gMSAmJiAhc2VlZE1vZGVsMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAgdW5pZm9ybSAgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoKnNQdHJDYWNoZVB0cikgIT0gMCAmJiAgKCooKCpzUHRyQ2FjaGVQdHIpKSkucHJvYiA+IFBST0JfU01PT1RIKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAoKigoKnNQdHJDYWNoZVB0cikpKS5wcm9iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGUgPSBQUk9CX1NNT09USCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoICEoaT09MCkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvdXQgPDwgIkNPVU5UKGUpOiAiIDw8IGUgPDwgIiAiIDw8IE1JTkNPVU5USU5DUkVBU0UgPDwgZW5kbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09VTlQgeD1lKnZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBhaXJfbm89PVZlcmJvc2VTZW50ZW5jZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3V0IDw8IGkgPDwgIigiIDw8IGV2bGlzdFtlc1tpXV0ud29yZCA8PCAiKSwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIDw8ICIoIiA8PCBmdmxpc3RbZnNbal1dLndvcmQgPDwgIik9IiA8PCB4IDw8IGVuZGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpdD09MXx8eD5NSU5DT1VOVElOQ1JFQVNFICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBOb0VtcHR5V29yZD09MCB8fCAoIE5vRW1wdHlXb3JkPT0wIHx8IGkhPTAgKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAoKCpzUHRyQ2FjaGVQdHIpICE9IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKigoKnNQdHJDYWNoZVB0cikpKS5jb3VudCArPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSAJICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFRhYmxlLmluY0NvdW50KGVzW2ldLCBmc1tqXSwgeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZi0+aW5jQ291bnQoZXNbaV0sIGZzW2pdLCB4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBmb3IgaSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgb2YgZWxzZQotICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBvZiBpZiAoZGVub20gPiAwKQotICAgICAgICAgICAgICAgIH0vLyBpZiAoIXRlc3QpCi0gICAgICAgICAgICB9IC8vIGVuZCBvZiBmb3IgKGopIDsKLSAgICAgICAgICAgIHNIYW5kbGVyMS5zZXRQcm9iT2ZTZW50ZW5jZShzZW50LGNyb3NzX2VudHJvcHkpOwotICAgICAgICAgICAgLy9jZXJyIDw8IHNlbnQgPDwgIkNFOiAiIDw8IGNyb3NzX2VudHJvcHkgPDwgIiAiIDw8IHNvIDw8IGVuZGw7Ci0gICAgICAgICAgICBwZXJwLmFkZEZhY3Rvcihjcm9zc19lbnRyb3B5LW0qbG9nKGwrMS4wKSwgc28sIGwsIG0sMSk7Ci0gICAgICAgICAgICB2aXRlcmJpX3BlcnAuYWRkRmFjdG9yKGxvZyh2aXRlcmJpX3Njb3JlKS1tKmxvZyhsKzEuMCksIHNvLCBsLCBtLDEpOwotICAgICAgICAgICAgaWYgKGR1bXBfYWxpZ25tZW50fHwoRkVXRFVNUFMmJnNlbnQuc2VudGVuY2VObzwxMDAwKSkKLSAgICAgICAgICAgICAgICBwcmludEFsaWduVG9GaWxlKGVzLCBmcywgZXZsaXN0LCBmdmxpc3QsIG9mMiwgdml0ZXJiaV9hbGlnbm1lbnQsIHNlbnQuc2VudGVuY2VObywgdml0ZXJiaV9zY29yZSk7Ci0gICAgICAgICAgICBhZGRBTCh2aXRlcmJpX2FsaWdubWVudCxzZW50LnNlbnRlbmNlTm8sbCk7Ci0gICAgICAgICAgICBwYWlyX25vKys7Ci0jaWZkZWYgV0lOMzIKLQkJCWRlbGV0ZVtdIGVpbmRpY3Q7Ci0JCQlkZWxldGVbXSBmaW5kaWN0OwkJCi0JCQlmb3IoaW50IF9pID0gMDsgX2kgPCBtKzE7IF9pKyspCi0JCQkJZGVsZXRlW10gaW5kaWN0W19pXTsKLQkJCWRlbGV0ZVtdIGluZGljdDsKLSNlbmRpZgotICAgICAgICB9IC8qIG9mIHdoaWxlICovCi0gICAgICAgIHNIYW5kbGVyMS5yZXdpbmQoKTsKLSAgICAgICAgcGVycC5yZWNvcmQoIk1vZGVsMSIpOwotICAgICAgICB2aXRlcmJpX3BlcnAucmVjb3JkKCJNb2RlbDEiKTsKLSAgICAgICAgZXJyb3JSZXBvcnRBTChjb3V0LCAiSUJNLTEiKTsKLQotICAgIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21vZGVsMS5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbW9kZWwxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZGMxZTMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbW9kZWwxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0jaWZuZGVmIF9tb2RlbDFfaAotI2RlZmluZSBfbW9kZWwxX2ggMQotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0gCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3Ryc3RyZWFtPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaWYgX19HTlVDX18+MgotI2luY2x1ZGUgPGV4dC9oYXNoX21hcD4KLXVzaW5nIF9fZ251X2N4eDo6aGFzaF9tYXA7Ci0jZWxzZQotI2luY2x1ZGUgPGhhc2hfbWFwPgotI2VuZGlmCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJWZWN0b3IuaCIKLSNpbmNsdWRlICJ2b2NhYi5oIgotI2luY2x1ZGUgIlRUYWJsZXMuaCIKLSNpbmNsdWRlICJnZXRTZW50ZW5jZS5oIgotI2luY2x1ZGUgIlBlcnBsZXhpdHkuaCIKLSNpbmNsdWRlICJ2b2NhYi5oIgotI2luY2x1ZGUgIkRpY3Rpb25hcnkuaCIKLSNpbmNsdWRlICJ0dGFibGVEaWZmLmhwcCIKLSNpbmNsdWRlICJzeW5jT2JqLmgiCi0KLWV4dGVybiBpbnQgTnVtYmVyT2ZWQUxJYWxpZ25tZW50czsKLQotY2xhc3MgcmVwb3J0X2luZm97Ci0gcHVibGljOgotCU11dGV4IGFsTG9jazsKLSAgUGVycGxleGl0eSYgcGVycDsKLSAgc2VudGVuY2VIYW5kbGVyJiBzSGFuZGxlcjE7Ci0gIFBlcnBsZXhpdHkqIHRlc3RQZXJwOwotICBzZW50ZW5jZUhhbmRsZXIqIHRlc3RIYW5kbGVyOwotICBQZXJwbGV4aXR5JiB0cmFpblZpdGVyYmlQZXJwOyAKLSAgUGVycGxleGl0eSogdGVzdFZpdGVyYmlQZXJwOwotICByZXBvcnRfaW5mbyhQZXJwbGV4aXR5JiBfcGVycCwKLQkgICAgICBzZW50ZW5jZUhhbmRsZXImIF9zSGFuZGxlcjEsCi0JICAgICAgUGVycGxleGl0eSogX3Rlc3RQZXJwLAotCSAgICAgIHNlbnRlbmNlSGFuZGxlciogX3Rlc3RIYW5kbGVyLAotCSAgICAgIFBlcnBsZXhpdHkmIF90cmFpblZpdGVyYmlQZXJwLAotCSAgICAgIFBlcnBsZXhpdHkqIF90ZXN0Vml0ZXJiaVBlcnApCi0gICAgOiBwZXJwKF9wZXJwKSxzSGFuZGxlcjEoX3NIYW5kbGVyMSksdGVzdFBlcnAoX3Rlc3RQZXJwKSx0ZXN0SGFuZGxlcihfdGVzdEhhbmRsZXIpLHRyYWluVml0ZXJiaVBlcnAoX3RyYWluVml0ZXJiaVBlcnApLHRlc3RWaXRlcmJpUGVycChfdGVzdFZpdGVyYmlQZXJwKQotICAgIHt9Ci0gICAgCi0gICAgcmVwb3J0X2luZm8oY29uc3QgcmVwb3J0X2luZm8gJiBycCk6Ci0gICAgICAgIHBlcnAocnAucGVycCksc0hhbmRsZXIxKHJwLnNIYW5kbGVyMSksIHRlc3RQZXJwKHJwLnRlc3RQZXJwKSwKLSAgICAgICAgdHJhaW5WaXRlcmJpUGVycChycC50cmFpblZpdGVyYmlQZXJwKSwgdGVzdFZpdGVyYmlQZXJwKHJwLnRlc3RWaXRlcmJpUGVycCksCi0gICAgICAgIHRlc3RIYW5kbGVyKHJwLnRlc3RIYW5kbGVyKQotICAgIHt9Ci19OwotCi0KLWNsYXNzIG1vZGVsMSA6IHB1YmxpYyByZXBvcnRfaW5mb3sKLXB1YmxpYzoKLSAgICBzdHJpbmcgZWZGaWxlbmFtZTsKLSAgICB2Y2JMaXN0JiAgRWxpc3QgOwotICAgIHZjYkxpc3QmICBGbGlzdCA7Ci0gICAgZG91YmxlIGVUb3RhbFdDb3VudCA7IC8vIHNpemUgb2Ygc291cmNlIGNvcHVzIGluIG51bWJlciBvZiB3b3JkcwotICAgIGRvdWJsZSBmVG90YWxXQ291bnQgOyAvLyBzaXplIG9mIHRhcmdldCBjb3JwdXMgaW4gbnVtYmVyIG9mIHdvcmRzIAotICAgIGludCBub0VuZ2xpc2hXb3JkczsKLSAgICBpbnQgbm9GcmVuY2hXb3JkczsKLSAgICB0bW9kZWw8Q09VTlQsIFBST0I+JnRUYWJsZTsKLSAgICBWZWN0b3I8V29yZEVudHJ5PiYgZXZsaXN0IDsKLSAgICBWZWN0b3I8V29yZEVudHJ5PiYgZnZsaXN0IDsKLSAgICBpbnQgdGhyZWFkSUQ7Ci1wdWJsaWM6Ci0gICAgaW50IEFMbWlzc2luZyxBTHRvb211Y2gsQUxldmVudHNNaXNzaW5nLEFMZXZlbnRzVG9vbXVjaDsKLSAgICBpbnQgQUxtaXNzaW5nVkFMSSxBTHRvb211Y2hWQUxJLEFMZXZlbnRzTWlzc2luZ1ZBTEksQUxldmVudHNUb29tdWNoVkFMSTsKLSAgICBpbnQgQUxtaXNzaW5nVEVTVCxBTHRvb211Y2hURVNULEFMZXZlbnRzTWlzc2luZ1RFU1QsQUxldmVudHNUb29tdWNoVEVTVDsKLSAgICBtb2RlbDEgKGNvbnN0IGNoYXIqIGVmbmFtZSwgdmNiTGlzdCYgZXZjYmxpc3QsIHZjYkxpc3QmIGZ2Y2JsaXN0LHRtb2RlbDxDT1VOVCwgUFJPQj4mX3RUYWJsZSxQZXJwbGV4aXR5JiBfcGVycCwKLQkgICAgc2VudGVuY2VIYW5kbGVyJiBfc0hhbmRsZXIxLAotCSAgICBQZXJwbGV4aXR5KiBfdGVzdFBlcnAsCi0JICAgIHNlbnRlbmNlSGFuZGxlciogX3Rlc3RIYW5kbGVyLAotCSAgICBQZXJwbGV4aXR5JiBfdHJhaW5WaXRlcmJpUGVycCwKLQkgICAgUGVycGxleGl0eSogX3Rlc3RWaXRlcmJpUGVycCk7Ci0gICAgCi0gICAgbW9kZWwxIChjb25zdCBtb2RlbDEmIG0xLCBpbnQgX3RocmVhZElEPTApOwotICAgIHZvaWQgaW5pdGlhbGl6ZV90YWJsZV91bmlmb3JtbHkoc2VudGVuY2VIYW5kbGVyJiBzSGFuZGxlcjEpOwotICAgIAotICAgIGludCBlbV93aXRoX3RyaWNrcyhpbnQgbm9JdGVyYXRpb25zLCAKLSAgICAgICAgYm9vbCBzZWVkTW9kZWwxLCBEaWN0aW9uYXJ5JiBkaWN0aW9uYXJ5LCBib29sIHVzZURpY3QsIGJvb2wgZHVtcENvdW50ID0gZmFsc2UsIAotCSAgICBjb25zdCBjaGFyKiBkdW1wQ291bnROYW1lID0gTlVMTCwgYm9vbCB1c2VTdHJpbmcgPSBmYWxzZSk7Ci0gICAgaW50IGVtX3RocmVhZChpbnQgbm9JdGVyYXRpb25zLCBpbnQgdGhyZWFkLERpY3Rpb25hcnkmIGRpY3Rpb25hcnksIGJvb2wgdXNlRGljdCk7Ci0gICAgYm9vbCBsb2FkX3RhYmxlKGNvbnN0IGNoYXIqIHRuYW1lKTsKLSAgICB2b2lkIHJlYWRWb2NhYkZpbGUoY29uc3QgY2hhciogZm5hbWUsIFZlY3RvcjxXb3JkRW50cnk+JiB2bGlzdCwgaW50JiB2c2l6ZSwgCi0gICAgaW50JiB0b3RhbCk7Ci0gICAgaW5saW5lIFZlY3RvcjxXb3JkRW50cnk+JiBnZXRFbmdsaXNoVm9jYWJMaXN0KHZvaWQpY29uc3Qge3JldHVybiBFbGlzdC5nZXRWb2NhYkxpc3QoKTt9OwotICAgIGlubGluZSBWZWN0b3I8V29yZEVudHJ5PiYgZ2V0RnJlbmNoVm9jYWJMaXN0KHZvaWQpY29uc3QgIHtyZXR1cm4gRmxpc3QuZ2V0Vm9jYWJMaXN0KCk7fTsKLSAgICBpbmxpbmUgZG91YmxlIGdldEVUb3RhbFdDb3VudCh2b2lkKSBjb25zdCB7cmV0dXJuIGVUb3RhbFdDb3VudDt9OwotICAgIGlubGluZSBkb3VibGUgZ2V0RlRvdGFsV0NvdW50KHZvaWQpIGNvbnN0IHtyZXR1cm4gZlRvdGFsV0NvdW50O307Ci0gICAgaW5saW5lIGludCBnZXROb0VuZ2xpc2hXb3Jkcyh2b2lkKSBjb25zdCAge3JldHVybiBub0VuZ2xpc2hXb3Jkczt9OwotICAgIGlubGluZSBpbnQgZ2V0Tm9GcmVuY2hXb3Jkcyh2b2lkKSAgY29uc3Qge3JldHVybiBub0ZyZW5jaFdvcmRzO307Ci0gICAgaW5saW5lIHRtb2RlbDxDT1VOVCwgUFJPQj4mIGdldFRUYWJsZSh2b2lkKSB7cmV0dXJuIHRUYWJsZTt9OwotICAgIGlubGluZSBzdHJpbmcmIGdldEVGRmlsZW5hbWUodm9pZCkge3JldHVybiBlZkZpbGVuYW1lO307Ci0gICAgICAgIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQWRkZWQgYnkgUWluIEdhbyBUbyBFbmFibGUgUGFyYWxsZWwgVHJhaW5pbmcKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIENUVGFibGVEaWZmPENPVU5ULFBST0I+KiBvbmVfc3RlcF9lbShpbnQgaXQgLGJvb2wgc2VlZE1vZGVsMSwgRGljdGlvbmFyeSYgZGljdGlvbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VEaWN0KTsKLSAgICAKLSAgICB2b2lkIHJlY29tYmluZSgpOwotICAgIAotICAgIHZvaWQgY29tYmluZV9vbmUoQ1RUYWJsZURpZmY8Q09VTlQsUFJPQj4qIGNiKTsKLSAgICAKLSAgICB2b2lkIHNhdmVfdGFibGUoY29uc3QgY2hhciogdG5hbWUpOwotICAgIAotICAgIAotICAgIAotICAgIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICBFTkQgT0YgUUlOIEdBTydzIENPREUKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXByaXZhdGU6Ci0gICAgdm9pZCBlbV9sb29wKGludCBpdCxQZXJwbGV4aXR5JiBwZXJwLCBzZW50ZW5jZUhhbmRsZXImIHNIYW5kbGVyMSwgYm9vbCBzZWVkTW9kZWwxLCBib29sICwgY29uc3QgY2hhciosIERpY3Rpb25hcnkmIGRpY3Rpb25hcnksIGJvb2wgdXNlRGljdCwgCi0JICAgICAgIFBlcnBsZXhpdHkmIHZpdGVyYmlwZXJwLCBib29sPWZhbHNlKTsKLSAgICB2b2lkIGVtX2xvb3BfMShDVFRhYmxlRGlmZjxDT1VOVCxQUk9CPiAqZGlmZixpbnQgaXQsUGVycGxleGl0eSYgcGVycCwgc2VudGVuY2VIYW5kbGVyJiBzSGFuZGxlcjEsIGJvb2wgc2VlZE1vZGVsMSwgYm9vbCAsIGNvbnN0IGNoYXIqLCBEaWN0aW9uYXJ5JiBkaWN0aW9uYXJ5LCBib29sIHVzZURpY3QsIAotCSAgICAgICBQZXJwbGV4aXR5JiB2aXRlcmJpcGVycCwgYm9vbD1mYWxzZSk7Ci0gICAgZnJpZW5kIGNsYXNzIG1vZGVsMjsKLSAgICBmcmllbmQgY2xhc3MgaG1tOwotcHVibGljOgotICAgIHZvaWQgYWRkQUwoY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIHZpdGVyYmlfYWxpZ25tZW50LGludCBwYWlyX25vLGludCBsKXsKLSAgICAgICAgYWxMb2NrLmxvY2soKTsKLSAgICAgICAgaWYoIHBhaXJfbm88PWludChSZWZlcmVuY2VBbGlnbm1lbnQuc2l6ZSgpKSApewotICAgICAgICAgICAgLy9jZXJyIDw8ICJBTDogIiA8PCB2aXRlcmJpX2FsaWdubWVudCA8PCAiICIgPDwgcGFpcl9ubyA8PCBlbmRsOwotICAgICAgICAgICAgRXJyb3JzSW5BbGlnbm1lbnQoUmVmZXJlbmNlQWxpZ25tZW50W3BhaXJfbm8tMV0sdml0ZXJiaV9hbGlnbm1lbnQsbCxBTG1pc3NpbmcsQUx0b29tdWNoLEFMZXZlbnRzTWlzc2luZyxBTGV2ZW50c1Rvb211Y2gscGFpcl9ubyk7Ci0gICAgICAgICAgICBpZiggcGFpcl9ubzw9TnVtYmVyT2ZWQUxJYWxpZ25tZW50cyApewotICAgICAgICAgICAgICAgIEVycm9yc0luQWxpZ25tZW50KFJlZmVyZW5jZUFsaWdubWVudFtwYWlyX25vLTFdLHZpdGVyYmlfYWxpZ25tZW50LGwsQUxtaXNzaW5nVkFMSSxBTHRvb211Y2hWQUxJLEFMZXZlbnRzTWlzc2luZ1ZBTEksQUxldmVudHNUb29tdWNoVkFMSSxwYWlyX25vKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCBwYWlyX25vPk51bWJlck9mVkFMSWFsaWdubWVudHMgKXsKLSAgICAgICAgICAgICAgICBFcnJvcnNJbkFsaWdubWVudChSZWZlcmVuY2VBbGlnbm1lbnRbcGFpcl9uby0xXSx2aXRlcmJpX2FsaWdubWVudCxsLEFMbWlzc2luZ1RFU1QsQUx0b29tdWNoVEVTVCxBTGV2ZW50c01pc3NpbmdURVNULEFMZXZlbnRzVG9vbXVjaFRFU1QscGFpcl9ubyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYWxMb2NrLnVubG9jaygpOwotICAgIH0KLSAgICB2b2lkIGluaXRBTCgpe0FMbWlzc2luZ1ZBTEk9QUx0b29tdWNoVkFMST1BTGV2ZW50c01pc3NpbmdWQUxJPUFMZXZlbnRzVG9vbXVjaFZBTEk9QUxtaXNzaW5nVEVTVD1BTHRvb211Y2hURVNUPUFMZXZlbnRzTWlzc2luZ1RFU1Q9QUxldmVudHNUb29tdWNoVEVTVD1BTG1pc3Npbmc9QUx0b29tdWNoPUFMZXZlbnRzTWlzc2luZz1BTGV2ZW50c1Rvb211Y2g9MDt9Ci0gICAgZG91YmxlIGVycm9yc0FMKCljb25zdHsKLSAgICAgICAgaWYoIEFMZXZlbnRzTWlzc2luZ1ZBTEkrQUxldmVudHNUb29tdWNoVkFMSSApewotICAgICAgICAgICAgcmV0dXJuIChBTG1pc3NpbmdWQUxJK0FMdG9vbXVjaFZBTEkpL2RvdWJsZShBTGV2ZW50c01pc3NpbmdWQUxJK0FMZXZlbnRzVG9vbXVjaFZBTEkpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHJldHVybiAwLjA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBlcnJvclJlcG9ydEFMKG9zdHJlYW0mb3V0LHN0cmluZyBtKWNvbnN0ewotICAgICAgICBpZiggQUxldmVudHNNaXNzaW5nK0FMZXZlbnRzVG9vbXVjaCApewotICAgICAgICAgICAgb3V0IDw8ICJhbGlnbm1lbnRFcnJvcnMgKCIgPDwgbSA8PCAiKTogIiAKLSAgICAgICAgICAgIDw8IDEwMC4wKihBTG1pc3NpbmcrQUx0b29tdWNoKS9kb3VibGUoQUxldmVudHNNaXNzaW5nK0FMZXZlbnRzVG9vbXVjaCkgCi0gICAgICAgICAgICA8PCAiIHJlY2FsbDogIiA8PCAxMDAuMCooMS4wLUFMbWlzc2luZy9kb3VibGUoQUxldmVudHNNaXNzaW5nKSkKLSAgICAgICAgICAgIDw8ICIgcHJlY2lzaW9uOiAiIDw8IDEwMC4wKigxLjAtQUx0b29tdWNoL2RvdWJsZShBTGV2ZW50c1Rvb211Y2gpKQotICAgICAgICAgICAgPDwgIiAobWlzc2luZzoiIDw8IEFMbWlzc2luZyA8PCAiLyIgPDwgQUxldmVudHNNaXNzaW5nIDw8ICIgIiA8PCBBTHRvb211Y2ggCi0gICAgICAgICAgICA8PCAiICIgPDwgQUxldmVudHNUb29tdWNoIDw8ICIpXG4iOwotICAgICAgICB9Ci0gICAgICAgIGlmKCBBTGV2ZW50c01pc3NpbmdWQUxJK0FMZXZlbnRzVG9vbXVjaFZBTEkgKXsKLSAgICAgICAgICAgIG91dCA8PCAiYWxpZ25tZW50RXJyb3JzIFZBTEkgKCIgPDwgbSA8PCAiKTogIiAKLSAgICAgICAgICAgIDw8IDEwMC4wKihBTG1pc3NpbmdWQUxJK0FMdG9vbXVjaFZBTEkpL2RvdWJsZShBTGV2ZW50c01pc3NpbmdWQUxJK0FMZXZlbnRzVG9vbXVjaFZBTEkpIAotICAgICAgICAgICAgPDwgIiByZWNhbGw6ICIgPDwgMTAwLjAqKDEuMC1BTG1pc3NpbmdWQUxJL2RvdWJsZShBTGV2ZW50c01pc3NpbmdWQUxJKSkKLSAgICAgICAgICAgIDw8ICIgcHJlY2lzaW9uOiAiIDw8IDEwMC4wKigxLjAtQUx0b29tdWNoVkFMSS9kb3VibGUoQUxldmVudHNUb29tdWNoVkFMSSkpCi0gICAgICAgICAgICA8PCAiIChtaXNzaW5nOiIgPDwgQUxtaXNzaW5nVkFMSSA8PCAiLyIgPDwgQUxldmVudHNNaXNzaW5nVkFMSSA8PCAiICIgPDwgQUx0b29tdWNoVkFMSSAKLSAgICAgICAgICAgIDw8ICIgIiA8PCBBTGV2ZW50c1Rvb211Y2hWQUxJIDw8ICIpXG4iOwotICAgICAgICB9Ci0gICAgICAgIGlmKCBBTGV2ZW50c01pc3NpbmdURVNUK0FMZXZlbnRzVG9vbXVjaFRFU1QgKXsKLSAgICAgICAgICAgIG91dCA8PCAiYWxpZ25tZW50RXJyb3JzIFRFU1QoIiA8PCBtIDw8ICIpOiAiIAotICAgICAgICAgICAgPDwgMTAwLjAqKEFMbWlzc2luZ1RFU1QrQUx0b29tdWNoVEVTVCkvZG91YmxlKEFMZXZlbnRzTWlzc2luZ1RFU1QrQUxldmVudHNUb29tdWNoVEVTVCkgCi0gICAgICAgICAgICA8PCAiIHJlY2FsbDogIiA8PCAxMDAuMCooMS4wLUFMbWlzc2luZ1RFU1QvZG91YmxlKEFMZXZlbnRzTWlzc2luZ1RFU1QpKSAKLSAgICAgICAgICAgIDw8ICIgcHJlY2lzaW9uOiAiIDw8IDEwMC4wKigxLjAtQUx0b29tdWNoVEVTVC9kb3VibGUoQUxldmVudHNUb29tdWNoVEVTVCkpCi0gICAgICAgICAgICA8PCAiIChtaXNzaW5nOiIgPDwgQUxtaXNzaW5nVEVTVCA8PCAiLyIgPDwgQUxldmVudHNNaXNzaW5nVEVTVCA8PCAiICIgPDwgQUx0b29tdWNoVEVTVCAKLSAgICAgICAgICAgIDw8ICIgIiA8PCBBTGV2ZW50c1Rvb211Y2hURVNUIDw8ICIpXG4iOwotICAgICAgICB9Ci0gICAgfQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9tb2RlbDIuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbW9kZWwyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkZGU3Ny4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9tb2RlbDIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qCi0KLUVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2luY2x1ZGUgIm1vZGVsMi5oIgotI2luY2x1ZGUgIkdsb2JhbHMuaCIKLSNpbmNsdWRlICJ1dGlsaXR5LmgiCi0jaW5jbHVkZSAiUGFyYW1ldGVyLmgiCi0jaW5jbHVkZSAiZGVmcy5oIgotCi1leHRlcm4gc2hvcnQgTm9FbXB0eVdvcmQ7Ci0KLQotR0xPQkFMX1BBUkFNRVRFUjIoaW50LE1vZGVsMl9EdW1wX0ZyZXEsIk1PREVMIDIgRFVNUCBGUkVRVUVOQ1kiLCJ0MiIsImR1bXAgZnJlcXVlbmN5IG9mIE1vZGVsIDIiLFBBUkxFVl9PVVRQVVQsMCk7Ci0KLW1vZGVsMjo6bW9kZWwyKG1vZGVsMSYgbSxhbW9kZWw8UFJPQj4mX2FUYWJsZSxhbW9kZWw8Q09VTlQ+Jl9hQ291bnRUYWJsZSk6IAotICBtb2RlbDEobSksYVRhYmxlKF9hVGFibGUpLGFDb3VudFRhYmxlKF9hQ291bnRUYWJsZSkKLXsgIH0KLQotdm9pZCBtb2RlbDI6OmluaXRpYWxpemVfdGFibGVfdW5pZm9ybWx5KHNlbnRlbmNlSGFuZGxlciYgc0hhbmRsZXIxKXsKLSAgICAvLyBpbml0aWFsaXplIHRoZSBhVGFibGUgdW5pZm9ybWx5IChydW4gdGhpcyBiZWZvcmUgcnVubmluZyBlbV93aXRoX3RyaWNrcykKLSAgICBpbnQgbj0wOwotICAgIHNlbnRQYWlyIHNlbnQgOwotICAgIHNIYW5kbGVyMS5yZXdpbmQoKTsKLSAgICB3aGlsZShzSGFuZGxlcjEuZ2V0TmV4dFNlbnRlbmNlKHNlbnQpKXsKLSAgICAgICAgVmVjdG9yPFdvcmRJbmRleD4mIGVzID0gc2VudC5lU2VudDsKLSAgICAgICAgVmVjdG9yPFdvcmRJbmRleD4mIGZzID0gc2VudC5mU2VudDsKLSAgICAgICAgV29yZEluZGV4IGwgPSBlcy5zaXplKCkgLSAxOwotICAgICAgICBXb3JkSW5kZXggbSA9IGZzLnNpemUoKSAtIDE7Ci0gICAgICAgIG4rKzsKLSAgICAgICAgaWYoMTw9bSYmYVRhYmxlLmdldFZhbHVlKGwsbSxsLG0pPD1QUk9CX1NNT09USCl7Ci0gICAgICAgICAgICBQUk9CIHVuaWZvcm1fdmFsID0gMS4wIC8gKGwrMSkgOwotICAgICAgICAgICAgZm9yKFdvcmRJbmRleCBqPTE7IGogPD0gbTsgaisrKQotICAgICAgICAgICAgICAgIGZvcihXb3JkSW5kZXggaT0wOyBpIDw9IGw7IGkrKykKLSAgICAgICAgICAgICAgICBhVGFibGUuc2V0VmFsdWUoaSxqLCBsLCBtLCB1bmlmb3JtX3ZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWludCBtb2RlbDI6OmVtX3dpdGhfdHJpY2tzKGludCBub0l0ZXJhdGlvbnMsYm9vbCBkdW1wQ291bnQsIAotCSAgICBjb25zdCBjaGFyKiBkdW1wQ291bnROYW1lLCBib29sIHVzZVN0cmluZyl7Ci0gICAgZG91YmxlIG1pbkVycm9ycz0xLjA7aW50IG1pbkl0ZXI9MDsKLSAgICBzdHJpbmcgbW9kZWxOYW1lPSJNb2RlbDIiLHNob3J0TW9kZWxOYW1lPSIyIjsKLSAgICB0aW1lX3QgaXRfc3QsIHN0LCBpdF9mbiwgZm47Ci0gICAgc3RyaW5nIHRmaWxlLCBhZmlsZSwgbnVtYmVyLCBhbGlnbmZpbGUsIHRlc3RfYWxpZ25maWxlOwotICAgIGludCBwYWlyX25vID0gMDsKLSAgICBib29sIGR1bXBfZmlsZXMgPSBmYWxzZSA7Ci0gICAgb2ZzdHJlYW0gb2YyIDsKLSAgICBzdCA9IHRpbWUoTlVMTCkgOwotICAgIHNIYW5kbGVyMS5yZXdpbmQoKTsKLSAgICBjb3V0IDw8ICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7Ci0gICAgY291dCA8PCBtb2RlbE5hbWUgPDwgIiBUcmFpbmluZyBTdGFydGVkIGF0OiAiIDw8IG15X2N0aW1lKCZzdCkgPDwgIiBpdGVyOiAiIDw8IG5vSXRlcmF0aW9ucyA8PCAiXG4iOwotICAgIGZvcihpbnQgaXQ9MTsgaXQgPD0gbm9JdGVyYXRpb25zIDsgaXQrKyl7Ci0gICAgICAgIHBhaXJfbm8gPSAwOwotICAgICAgICBpdF9zdCA9IHRpbWUoTlVMTCkgOwotICAgICAgICBjb3V0IDw8IGVuZGwgPDwgIi0tLS0tLS0tLS0tXG4iIDw8IG1vZGVsTmFtZSA8PCAiOiBJdGVyYXRpb24gIiA8PCBpdCA8PCAnXG4nOwotICAgICAgICBkdW1wX2ZpbGVzID0gKE1vZGVsMl9EdW1wX0ZyZXEgIT0gMCkgJiYgKChpdCAlIE1vZGVsMl9EdW1wX0ZyZXEpID09IDApICYmICFOT0RVTVBTOwotICAgICAgICBudW1iZXIgPSAiIjsKLSAgICAgICAgaW50IG4gPSBpdDsKLSAgICAgICAgZG97Ci0gICAgICAgICAgICBudW1iZXIuaW5zZXJ0KChzaXplX3QpMCwgMSwgKGNoYXIpKG4gJSAxMCArICcwJykpOwotICAgICAgICB9IHdoaWxlKChuIC89IDEwKSA+IDApOwotICAgICAgICB0ZmlsZSA9IFByZWZpeCArICIudCIgKyBzaG9ydE1vZGVsTmFtZSArICIuIiArIG51bWJlciA7Ci0gICAgICAgIGFmaWxlID0gUHJlZml4ICsgIi5hIiArIHNob3J0TW9kZWxOYW1lICsgIi4iICsgbnVtYmVyIDsKLSAgICAgICAgYWxpZ25maWxlID0gUHJlZml4ICsgIi5BIiArIHNob3J0TW9kZWxOYW1lICsgIi4iICsgbnVtYmVyIDsKLSAgICAgICAgdGVzdF9hbGlnbmZpbGUgPSBQcmVmaXggKyAiLnRzdC5BIiArIHNob3J0TW9kZWxOYW1lICsgIi4iICsgbnVtYmVyIDsKLSAgICAgICAgYUNvdW50VGFibGUuY2xlYXIoKTsKLSAgICAgICAgaW5pdEFMKCk7Ci0gICAgICAgIGVtX2xvb3AocGVycCwgc0hhbmRsZXIxLCBkdW1wX2ZpbGVzLCBhbGlnbmZpbGUuY19zdHIoKSwgdHJhaW5WaXRlcmJpUGVycCwgZmFsc2UpOwotICAgICAgICBpZiggZXJyb3JzQUwoKTxtaW5FcnJvcnMgKXsKLSAgICAgICAgICAgIG1pbkVycm9ycz1lcnJvcnNBTCgpOwotICAgICAgICAgICAgbWluSXRlcj1pdDsKLSAgICAgICAgfQotICAgICAgICBpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpCi0gICAgICAgICAgICBlbV9sb29wKCp0ZXN0UGVycCwgKnRlc3RIYW5kbGVyLCBkdW1wX2ZpbGVzLCB0ZXN0X2FsaWduZmlsZS5jX3N0cigpLCAqdGVzdFZpdGVyYmlQZXJwLCB0cnVlKTsgCi0gICAgICAgIGlmIChkdW1wX2ZpbGVzJiZPdXRwdXRJbkFhY2hlbkZvcm1hdD09MSkKLSAgICAgICAgICAgIHRUYWJsZS5wcmludENvdW50VGFibGUodGZpbGUuY19zdHIoKSxFbGlzdC5nZXRWb2NhYkxpc3QoKSxGbGlzdC5nZXRWb2NhYkxpc3QoKSwxKTsKLQotCQlpZihkdW1wQ291bnQgJiYgaXQgPT0gbm9JdGVyYXRpb25zKXsKLQkJCXN0cmluZyByZWFsVGFibGVOYW1lID0gZHVtcENvdW50TmFtZTsKLQkJCXJlYWxUYWJsZU5hbWUgKz0gIi50LmNvdW50IjsKLQkJCXRUYWJsZS5wcmludENvdW50VGFibGUocmVhbFRhYmxlTmFtZS5jX3N0cigpLEVsaXN0LmdldFZvY2FiTGlzdCgpLEZsaXN0LmdldFZvY2FiTGlzdCgpLHVzZVN0cmluZyk7Ci0JCQlzdHJpbmcgcmVhbEFUYWJsZU5hbWUgPSBkdW1wQ291bnROYW1lOwotCQkJcmVhbEFUYWJsZU5hbWUgKz0gIi5hLmNvdW50IjsKLQkJCWFDb3VudFRhYmxlLnByaW50UmVhbFRhYmxlKHJlYWxBVGFibGVOYW1lLmNfc3RyKCkpOwotCQl9Ci0gICAgICAgIHRUYWJsZS5ub3JtYWxpemVUYWJsZShFbGlzdCwgRmxpc3QpOwotICAgICAgICBhQ291bnRUYWJsZS5ub3JtYWxpemUoYVRhYmxlKTsKLSAgICAgICAgY291dCA8PCBtb2RlbE5hbWUgPDwgIjogKCI8PGl0PDwiKSBUUkFJTiBDUk9TUy1FTlRST1BZICIgPDwgcGVycC5jcm9zc19lbnRyb3B5KCkKLSAgICAgICAgICAgIDw8ICIgUEVSUExFWElUWSAiIDw8IHBlcnAucGVycGxleGl0eSgpIDw8ICdcbic7Ci0gICAgICAgIGlmICh0ZXN0UGVycCAmJiB0ZXN0SGFuZGxlcikKLSAgICAgICAgICAgIGNvdXQgPDwgbW9kZWxOYW1lIDw8ICI6ICgiPDxpdDw8IikgVEVTVCBDUk9TUy1FTlRST1BZICIgPDwgKCp0ZXN0UGVycCkuY3Jvc3NfZW50cm9weSgpCi0gICAgICAgICAgICA8PCAiIFBFUlBMRVhJVFkgIiA8PCAoKnRlc3RQZXJwKS5wZXJwbGV4aXR5KCkgCi0gICAgICAgICAgICA8PCAnXG4nOwotICAgICAgICBjb3V0IDw8IG1vZGVsTmFtZSA8PCAiOiAoIjw8aXQ8PCIpIFZJVEVSQkkgVFJBSU4gQ1JPU1MtRU5UUk9QWSAiIDw8IHRyYWluVml0ZXJiaVBlcnAuY3Jvc3NfZW50cm9weSgpCi0gICAgICAgICAgICA8PCAiIFBFUlBMRVhJVFkgIiA8PCB0cmFpblZpdGVyYmlQZXJwLnBlcnBsZXhpdHkoKSA8PCAnXG4nOwotICAgICAgICBpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpCi0gICAgICAgICAgICBjb3V0IDw8IG1vZGVsTmFtZSA8PCAiOiAoIjw8aXQ8PCIpIFZJVEVSQkkgVEVTVCBDUk9TUy1FTlRST1BZICIgPDwgdGVzdFZpdGVyYmlQZXJwLT5jcm9zc19lbnRyb3B5KCkKLSAgICAgICAgICAgIDw8ICIgUEVSUExFWElUWSAiIDw8IHRlc3RWaXRlcmJpUGVycC0+cGVycGxleGl0eSgpIAotICAgICAgICAgICAgPDwgJ1xuJzsKLSAgICAgICAgaWYgKGR1bXBfZmlsZXMpIHsKLSAgICAgICAgICAgIGlmKE91dHB1dEluQWFjaGVuRm9ybWF0PT0wKQotICAgICAgICAgICAgICAgIHRUYWJsZS5wcmludFByb2JUYWJsZSh0ZmlsZS5jX3N0cigpLEVsaXN0LmdldFZvY2FiTGlzdCgpLEZsaXN0LmdldFZvY2FiTGlzdCgpLE91dHB1dEluQWFjaGVuRm9ybWF0KTsKLSAgICAgICAgICAgIGFDb3VudFRhYmxlLnByaW50VGFibGUoYWZpbGUuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaXRfZm4gPSB0aW1lKE5VTEwpIDsKLSAgICAgICAgY291dCA8PCBtb2RlbE5hbWUgPDwgIiBJdGVyYXRpb246ICIgPDwgaXQ8PCAiIHRvb2s6ICIgPDwgZGlmZnRpbWUoaXRfZm4sIGl0X3N0KSA8PCAiIHNlY29uZHNcbiI7Ci0gICAgfSAvLyBlbmQgb2YgaXRlcmF0aW9ucyAKLSAgICBhQ291bnRUYWJsZS5jbGVhcigpOwotICAgIGZuID0gdGltZShOVUxMKSA7Ci0gICAgY291dCA8PCBlbmRsIDw8ICJFbnRpcmUgIiA8PCBtb2RlbE5hbWUgPDwgIiBUcmFpbmluZyB0b29rOiAiIDw8IGRpZmZ0aW1lKGZuLCBzdCkgPDwgIiBzZWNvbmRzXG4iOwotICAgIC8vICBjb3V0IDw8ICJ0VGFibGUgY29udGFpbnMgIiA8PCB0VGFibGUuZ2V0SGFzaCgpLmJ1Y2tldF9jb3VudCgpIAotICAgIC8vICAgICA8PCAiIGJ1Y2tldHMgYW5kICAiIDw8IHRUYWJsZS5nZXRIYXNoKCkuc2l6ZSgpIDw8ICIgZW50cmllcy4iIDsKLSAgICBjb3V0IDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwotICAgIHJldHVybiBtaW5JdGVyOwotfQotCi12b2lkIG1vZGVsMjo6bG9hZF90YWJsZShjb25zdCBjaGFyKiBhbmFtZSl7Ci0gIC8qIFRoaXMgZnVuY3Rpb24gbG9hZHMgdGhlIGEgdGFibGUgZnJvbSB0aGUgZ2l2ZW4gZmlsZTsgdXNlIGl0Ci0gICAgIHdoZW4geW91IHdhbnQgdG8gbG9hZCByZXN1bHRzIGZyb20gcHJldmlvdXMgYSB0cmFpbmluZyB3aXRob3V0Ci0gICAgIGRvaW5nIGFueSBuZXcgdHJhaW5pbmcuCi0gICAgIE5BUywgNy8xMS85OQotICAqLwotICAgIGNvdXQgPDwgIk1vZGVsMjogbG9hZGluZyBhIHRhYmxlIFxuIjsKLSAgICBhVGFibGUucmVhZFRhYmxlKGFuYW1lKTsKLX0KLQotCi12b2lkIG1vZGVsMjo6ZW1fbG9vcChQZXJwbGV4aXR5JiBwZXJwLCBzZW50ZW5jZUhhbmRsZXImIHNIYW5kbGVyMSwgCi0JCSAgICAgYm9vbCBkdW1wX2FsaWdubWVudCwgY29uc3QgY2hhciogYWxpZ25maWxlLCBQZXJwbGV4aXR5JiB2aXRlcmJpX3BlcnAsIAotCQkgICAgIGJvb2wgdGVzdCkKLXsKLSAgICBtYXNzZXJ0KCBhVGFibGUuaXNfZGlzdG9ydGlvbj09MCApOwotICAgIG1hc3NlcnQoIGFDb3VudFRhYmxlLmlzX2Rpc3RvcnRpb249PTAgKTsKLSAgICBXb3JkSW5kZXggaSwgaiwgbCwgbSA7Ci0gICAgZG91YmxlIGNyb3NzX2VudHJvcHk7Ci0gICAgaW50IHBhaXJfbm89MCA7Ci0gICAgcGVycC5jbGVhcigpOwotICAgIHZpdGVyYmlfcGVycC5jbGVhcigpOwotICAgIG9mc3RyZWFtIG9mMjsKLSAgICAvLyBmb3IgZWFjaCBzZW50ZW5jZSBwYWlyIGluIHRoZSBjb3JwdXMKLSAgICBpZiAoZHVtcF9hbGlnbm1lbnR8fEZFV0RVTVBTICkKLSAgICAgICAgb2YyLm9wZW4oYWxpZ25maWxlKTsKLSAgICBzZW50UGFpciBzZW50IDsKLSAgICAKLSAgICB2ZWN0b3I8ZG91YmxlPiBmZXJ0cyhldmxpc3Quc2l6ZSgpKTsKLSAgICAKLSAgICBzSGFuZGxlcjEucmV3aW5kKCk7Ci0gICAgd2hpbGUoc0hhbmRsZXIxLmdldE5leHRTZW50ZW5jZShzZW50KSl7Ci0gICAgICAgIFZlY3RvcjxXb3JkSW5kZXg+JiBlcyA9IHNlbnQuZVNlbnQ7Ci0gICAgICAgIFZlY3RvcjxXb3JkSW5kZXg+JiBmcyA9IHNlbnQuZlNlbnQ7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNvICA9IHNlbnQuZ2V0Q291bnQoKTsKLSAgICAgICAgbCA9IGVzLnNpemUoKSAtIDE7Ci0gICAgICAgIG0gPSBmcy5zaXplKCkgLSAxOwotICAgICAgICBjcm9zc19lbnRyb3B5ID0gbG9nKDEuMCk7Ci0gICAgICAgIFZlY3RvcjxXb3JkSW5kZXg+IHZpdGVyYmlfYWxpZ25tZW50KGZzLnNpemUoKSk7Ci0gICAgICAgIGRvdWJsZSB2aXRlcmJpX3Njb3JlID0gMTsKLSAgICAgICAgZm9yKGo9MTsgaiA8PSBtOyBqKyspewotICAgICAgICAgICAgVmVjdG9yPExwUGFpcjxDT1VOVCxQUk9CPiAqPiBzUHRyQ2FjaGUoZXMuc2l6ZSgpLDApOyAvLyBjYWNoZSBwb2ludGVycyB0byB0YWJsZSAKLSAgICAgICAgICAgIC8vIGVudHJpZXMgIHRoYXQgbWFwIGZzIHRvIGFsbCBwb3NzaWJsZSBlaSBpbiB0aGlzIHNlbnRlbmNlLgotICAgICAgICAgICAgUFJPQiBkZW5vbSA9IDAuMDsKLSAgICAgICAgICAgIFBST0IgZSA9IDAuMCwgd29yZF9iZXN0X3Njb3JlID0gMDsKLSAgICAgICAgICAgIFdvcmRJbmRleCBiZXN0X2kgPSAwIDsgLy8gaSBmb3Igd2hpY2ggZmogaXMgYmVzdCBtYXBlZCB0byBlaQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8PSBsOyBpKyspewotICAgICAgICAgICAgICAgIHNQdHJDYWNoZVtpXSA9IHRUYWJsZS5nZXRQdHIoZXNbaV0sIGZzW2pdKSA7Ci0gICAgICAgICAgICAgICAgaWYgKHNQdHJDYWNoZVtpXSAhPSAwICYmKCooc1B0ckNhY2hlW2ldKSkucHJvYiA+IFBST0JfU01PT1RIICkgCi0gICAgICAgICAgICAgICAgICAgIGUgPSAoKihzUHRyQ2FjaGVbaV0pKS5wcm9iICogYVRhYmxlLmdldFZhbHVlKGksaiwgbCwgbSkgOwotICAgICAgICAgICAgICAgIGVsc2UgZSA9IFBST0JfU01PT1RIICogYVRhYmxlLmdldFZhbHVlKGksaiwgbCwgbSk7Ci0gICAgICAgICAgICAgICAgZGVub20gKz0gZSA7Ci0gICAgICAgICAgICAgICAgaWYgKGUgPiB3b3JkX2Jlc3Rfc2NvcmUpewotICAgICAgICAgICAgICAgICAgICB3b3JkX2Jlc3Rfc2NvcmUgPSBlIDsKLSAgICAgICAgICAgICAgICAgICAgYmVzdF9pID0gaSA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdml0ZXJiaV9hbGlnbm1lbnRbal0gPSBiZXN0X2kgOwotICAgICAgICAgICAgdml0ZXJiaV9zY29yZSAqPSB3b3JkX2Jlc3Rfc2NvcmU7IC8vL2Rlbm9tIDsKLSAgICAgICAgICAgIGNyb3NzX2VudHJvcHkgKz0gbG9nKGRlbm9tKSA7Ci0gICAgICAgICAgICBpZiAoZGVub20gPT0gMCl7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3QpCi0gICAgICAgICAgICAgICAgICAgIGNlcnIgPDwgIldBUk5JTkc6IGRlbm9tIGlzIHplcm8gKFRFU1QpXG4iOwotICAgICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgICAgIGNlcnIgPDwgIldBUk5JTkc6IGRlbm9tIGlzIHplcm8gKFRSQUlOKVxuIjsKLSAgICAgICAgICAgIH0gICAgICAKLSAgICAgICAgICAgIGlmICghdGVzdCl7Ci0gICAgICAgICAgICAgICAgaWYoZGVub20gPiAwKXsJICAKLSAgICAgICAgICAgICAgICAgICAgQ09VTlQgdmFsID0gQ09VTlQoc28pIC8gKENPVU5UKSBkb3VibGUoZGVub20pIDsKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBpPTA7IGkgPD0gbDsgaSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBST0IgZSgwLjApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNQdHJDYWNoZVtpXSAhPSAwICYmICAoKihzUHRyQ2FjaGVbaV0pKS5wcm9iID4gUFJPQl9TTU9PVEgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9ICgqKHNQdHJDYWNoZVtpXSkpLnByb2IgOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBlID0gUFJPQl9TTU9PVEggIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGUgKj0gYVRhYmxlLmdldFZhbHVlKGksaiwgbCwgbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT1VOVCB0ZW1wID0gQ09VTlQoZSkgKiB2YWwgOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE5vRW1wdHlXb3JkPT0wIHx8IGkhPTAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzUHRyQ2FjaGVbaV0gIT0gMCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKHNQdHJDYWNoZVtpXSkpLmNvdW50ICs9IHRlbXAgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCSAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0VGFibGUuaW5jQ291bnQoZXNbaV0sIGZzW2pdLCB0ZW1wKTsJICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgYUNvdW50VGFibGUuYWRkVmFsdWUoaSxqLCBsLCBtLHRlbXApIDsgCi0gICAgICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIGZvciBpICovCi0gICAgICAgICAgICAgICAgfSAvLyBlbmQgb2YgaWYgKGRlbm9tID4gMCkKLSAgICAgICAgICAgIH0vLyBpZiAoIXRlc3QpCi0gICAgICAgIH0gLy8gZW5kIG9mIGZvciAoaikgOwotICAgICAgICBzSGFuZGxlcjEuc2V0UHJvYk9mU2VudGVuY2Uoc2VudCxjcm9zc19lbnRyb3B5KTsKLSAgICAgICAgcGVycC5hZGRGYWN0b3IoY3Jvc3NfZW50cm9weSwgc28sIGwsIG0sMSk7Ci0gICAgICAgIHZpdGVyYmlfcGVycC5hZGRGYWN0b3IobG9nKHZpdGVyYmlfc2NvcmUpLCBzbywgbCwgbSwxKTsKLSAgICAgICAgaWYgKGR1bXBfYWxpZ25tZW50fHwoRkVXRFVNUFMmJnNlbnQuc2VudGVuY2VObzwxMDAwKSApCi0gICAgICAgICAgICBwcmludEFsaWduVG9GaWxlKGVzLCBmcywgRWxpc3QuZ2V0Vm9jYWJMaXN0KCksIEZsaXN0LmdldFZvY2FiTGlzdCgpLCBvZjIsIHZpdGVyYmlfYWxpZ25tZW50LCBzZW50LnNlbnRlbmNlTm8sIHZpdGVyYmlfc2NvcmUpOwotICAgICAgICBhZGRBTCh2aXRlcmJpX2FsaWdubWVudCxzZW50LnNlbnRlbmNlTm8sbCk7Ci0gICAgICAgIHBhaXJfbm8rKzsKLSAgICB9IC8qIG9mIHdoaWxlICovCi0gICAgc0hhbmRsZXIxLnJld2luZCgpOwotICAgIHBlcnAucmVjb3JkKCJNb2RlbDIiKTsKLSAgICB2aXRlcmJpX3BlcnAucmVjb3JkKCJNb2RlbDIiKTsKLSAgICBlcnJvclJlcG9ydEFMKGNvdXQsIklCTS0yIik7Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbW9kZWwyLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9tb2RlbDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4ZTk5My4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9tb2RlbDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0KLUVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2lmbmRlZiBfbW9kZWwyX2gKLSNkZWZpbmUgX21vZGVsMl9oIDEKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotIAotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSAiVmVjdG9yLmgiCi0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2lmIF9fR05VQ19fPjIKLSNpbmNsdWRlIDxleHQvaGFzaF9tYXA+Ci11c2luZyBfX2dudV9jeHg6Omhhc2hfbWFwOwotI2Vsc2UKLSNpbmNsdWRlIDxoYXNoX21hcD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiVFRhYmxlcy5oIgotI2luY2x1ZGUgIkFUYWJsZXMuaCIgCi0jaW5jbHVkZSAiZ2V0U2VudGVuY2UuaCIKLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAibW9kZWwxLmgiCi0jaW5jbHVkZSAiUGVycGxleGl0eS5oIgotI2luY2x1ZGUgInZvY2FiLmgiCi0KLWNsYXNzIG1vZGVsMiA6IHB1YmxpYyBtb2RlbDF7Ci1wdWJsaWM6Ci0gICAgYW1vZGVsPFBST0I+JmFUYWJsZTsKLSAgICBhbW9kZWw8Q09VTlQ+JmFDb3VudFRhYmxlOwotcHVibGljOgotICAgIG1vZGVsMihtb2RlbDEmIG0xLGFtb2RlbDxQUk9CPiYsYW1vZGVsPENPVU5UPiYpOwotICAgIHZvaWQgaW5pdGlhbGl6ZV90YWJsZV91bmlmb3JtbHkoc2VudGVuY2VIYW5kbGVyJik7Ci0gICAgaW50IGVtX3dpdGhfdHJpY2tzKGludCBpdGVyYXRpb25zLGJvb2wgZHVtcENvdW50ID0gZmFsc2UsIAotCSAgICBjb25zdCBjaGFyKiBkdW1wQ291bnROYW1lID0gTlVMTCwgYm9vbCB1c2VTdHJpbmcgPSBmYWxzZSk7Ci0gICAgdm9pZCBsb2FkX3RhYmxlKGNvbnN0IGNoYXIqIGFuYW1lKTsKLSAgICBpbmxpbmUgYW1vZGVsPFBST0I+JiBnZXRBVGFibGUodm9pZCkge3JldHVybiBhVGFibGU7fTsKLSAgICBpbmxpbmUgYW1vZGVsPENPVU5UPiYgZ2V0QUNvdW50VGFibGUodm9pZCkge3JldHVybiBhQ291bnRUYWJsZTt9OwotICAgIHZvaWQgZW1fbG9vcChQZXJwbGV4aXR5JiBwZXJwLHNlbnRlbmNlSGFuZGxlciYgc0hhbmRsZXIxLCBib29sIGR1bXBfZmlsZXMsY29uc3QgY2hhciogYWxpZ25maWxlLCBQZXJwbGV4aXR5JiwgYm9vbCB0ZXN0KTsKLSAgICBmcmllbmQgY2xhc3MgbW9kZWwzOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9tb2RlbDJ0bzMuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbW9kZWwydG8zLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2ZDcyOS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9tb2RlbDJ0bzMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qCi0KLUVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2luY2x1ZGUgIm1vZGVsMy5oIgotI2luY2x1ZGUgInV0aWxpdHkuaCIKLSNpbmNsdWRlICJHbG9iYWxzLmgiCi0KLSNkZWZpbmUgX01BWF9GRVJUSUxJVFkgMTAKLQotZG91YmxlIGdldF9zdW1fb2ZfcGFydGl0aW9ucyhpbnQgbiwgaW50IHNvdXJjZV9wb3MsIGRvdWJsZSBhbHBoYVtfTUFYX0ZFUlRJTElUWV1bTUFYX1NFTlRFTkNFX0xFTkdUSF9BTExPV0VEXSkKLXsKLSAgaW50IGRvbmUsIGluaXQgOwotICBkb3VibGUgc3VtID0gMCwgcHJvZCA7Ci0gIGludCBzLCB3LCB1LCB2OwotICBXb3JkSW5kZXggaywgazEsIGkgOwotICBXb3JkSW5kZXggbnVtX3BhcnRzID0gMCAgOwotICBpbnQgdG90YWxfcGFydGl0aW9uc19jb25zaWRlcmVkID0gMDsKLQotICBpbnQgcGFydFtfTUFYX0ZFUlRJTElUWV0sIG11bHRbX01BWF9GRVJUSUxJVFldOwotCi0gIGRvbmUgPSBmYWxzZSA7Ci0gIGluaXQgPSB0cnVlIDsgICAgCi0gIGZvciAoaSA9IDAgOyBpIDwgX01BWF9GRVJUSUxJVFkgOyBpKyspewotICAgIHBhcnRbaV0gPSBtdWx0W2ldID0gMCA7Ci0gIH0KLSAgCi0gIC8vcHJpbnRmKCJFbnRlcmluZyBnZXQgc3VtIG9mIHBhcnRpdGlvbnNcbiIpOwotICB3aGlsZSghIGRvbmUpewotICAgIHRvdGFsX3BhcnRpdGlvbnNfY29uc2lkZXJlZCsrOwotICAgIGlmIChpbml0KXsKLSAgICAgIHBhcnRbMV0gPSBuIDsKLSAgICAgIG11bHRbMV0gPSAxIDsKLSAgICAgIG51bV9wYXJ0cyA9IDEgIDsgIAotICAgICAgaW5pdCA9IGZhbHNlIDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpZiAoKHBhcnRbbnVtX3BhcnRzXSA+IDEpIHx8IChudW1fcGFydHMgPiAxKSl7Ci0JaWYgKHBhcnRbbnVtX3BhcnRzXSA9PSAxKXsKLQkgIHMgPSBwYXJ0W251bV9wYXJ0cy0xXSArIG11bHRbbnVtX3BhcnRzXTsKLQkgIGsgPSBudW1fcGFydHMgLSAxOwotCX0KLQllbHNlIHsKLQkgIHMgPSBwYXJ0W251bV9wYXJ0c107Ci0JICBrID0gbnVtX3BhcnRzIDsKLQl9Ci0JdyA9IHBhcnRba10gLSAxIDsKLQl1ID0gcyAvIHcgOwotCXYgPSBzICUgdyA7Ci0JbXVsdFtrXSAtPSAxIDsKLQlpZiAobXVsdFtrXSA9PSAwKQotCSAgazEgPSBrIDsKLQllbHNlIGsxID0gayArIDEgOwotCW11bHRbazFdID0gdSA7Ci0JcGFydFtrMV0gPSB3IDsKLQlpZiAodiA9PSAwKXsKLQkgIG51bV9wYXJ0cyA9IGsxIDsKLQl9Ci0JZWxzZSB7Ci0JICBtdWx0W2sxKzFdID0gMSA7Ci0JICBwYXJ0W2sxKzFdID0gdiA7Ci0JICBudW1fcGFydHMgPSBrMSArIDE7Ci0JfQotICAgICAgfSAvKiBvZiBpZiBudW1fcGFydHMgPiAxIHx8IHBhcnRbbnVtX3BhcnRzXSA+IDEgKi8gICAgCi0gICAgICBlbHNlIHsKLQlkb25lID0gdHJ1ZSA7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIG9mIGVsc2Ugb2YgaWYoaW5pdCkgKi8KLSAgICBpZiAoIWRvbmUpewotICAgICAgcHJvZCA9IDEuMCA7Ci0gICAgICBpZiAobiAhPSAwKQotCWZvciAoaSA9IDEgOyBpIDw9IG51bV9wYXJ0cyA7IGkrKyl7Ci0JICBwcm9kICo9IHBvdyhhbHBoYVtwYXJ0W2ldXVtzb3VyY2VfcG9zXSwgbXVsdFtpXSkgLyBmYWN0b3JpYWwobXVsdFtpXSkgOwotCX0KLSAgICAgIHN1bSArPSBwcm9kIDsKLSAgICB9Ci0gIH0gLyogb2Ygd2hpbGUgKi8gIAotICBpZiAoc3VtIDwgMCkgc3VtID0gMCA7Ci0gIHJldHVybihzdW0pIDsKLX0KLQotdm9pZCBtb2RlbDM6OmVzdGltYXRlX3RfYV9kKHNlbnRlbmNlSGFuZGxlciYgc0hhbmRsZXIxLCBQZXJwbGV4aXR5JiBwZXJwLCBQZXJwbGV4aXR5JiB0cmFpblZQZXJwLCAKLQkJCSAgICBib29sIHNpbXBsZSwgYm9vbCBkdW1wX2ZpbGVzLGJvb2wgdXBkYXRlVCkgCi17Ci0gIHN0cmluZyB0ZmlsZSwgbmZpbGUsIGRmaWxlLCBwMGZpbGUsIGFmaWxlLCBhbGlnbmZpbGU7Ci0gIFdvcmRJbmRleCBpLCBqLCBsLCBtLCBtYXhfZmVydGlsaXR5X2hlcmUsIGsgOwotICBQUk9CIHZhbCwgdGVtcF9tdWx0W01BWF9TRU5URU5DRV9MRU5HVEhfQUxMT1dFRF1bTUFYX1NFTlRFTkNFX0xFTkdUSF9BTExPV0VEXTsKLSAgZG91YmxlIGNyb3NzX2VudHJvcHk7Ci0gIGRvdWJsZSBiZXRhLCBzdW0sIAotICAgICAgYWxwaGFbX01BWF9GRVJUSUxJVFldW01BWF9TRU5URU5DRV9MRU5HVEhfQUxMT1dFRF07Ci0gIGRvdWJsZSB0b3RhbCwgdGVtcCwgciA7Ci0KLSAgZENvdW50VGFibGUuY2xlYXIoKTsKLSAgYUNvdW50VGFibGUuY2xlYXIoKTsKLSAgaW5pdEFMKCk7Ci0gIG5Db3VudFRhYmxlLmNsZWFyKCkgOwotICBpZiAoc2ltcGxlKQotICAgIG5UYWJsZS5jbGVhcigpOwotICBwZXJwLmNsZWFyKCkgOwotICB0cmFpblZQZXJwLmNsZWFyKCkgOwotICBvZnN0cmVhbSBvZjI7Ci0gIGlmIChkdW1wX2ZpbGVzKXsKLSAgICBhbGlnbmZpbGUgPSBQcmVmaXggKyIuQTJ0bzMiOwotICAgIG9mMi5vcGVuKGFsaWduZmlsZS5jX3N0cigpKTsKLSAgfQotICBpZiAoc2ltcGxlKSBjZXJyIDw8IlVzaW5nIHNpbXBsZSBlc3RpbWF0aW9uIGZvciBmZXJ0aWx0aWVzXG4iOwotICBzSGFuZGxlcjEucmV3aW5kKCkgOwotICBzZW50UGFpciBzZW50IDsKLSAgd2hpbGUoc0hhbmRsZXIxLmdldE5leHRTZW50ZW5jZShzZW50KSl7Ci0gICAgVmVjdG9yPFdvcmRJbmRleD4mIGVzID0gc2VudC5lU2VudDsKLSAgICBWZWN0b3I8V29yZEluZGV4PiYgZnMgPSBzZW50LmZTZW50OwotICAgIGNvbnN0IGZsb2F0IGNvdW50ICA9IHNlbnQuZ2V0Q291bnQoKTsKLSAgICBWZWN0b3I8V29yZEluZGV4PiB2aXRlcmJpX2FsaWdubWVudChmcy5zaXplKCkpOwotICAgIGwgPSBlcy5zaXplKCkgLSAxOwotICAgIG0gPSBmcy5zaXplKCkgLSAxOwotICAgIGNyb3NzX2VudHJvcHkgPSBsb2coMS4wKTsgCi0gICAgZG91YmxlIHZpdGVyYmlfc2NvcmUgPSAxIDsKLSAgICBQUk9CIHdvcmRfYmVzdF9zY29yZSA7ICAvLyBzY29yZSBmb3IgdGhlIGJlc3QgbWFwcGluZyBvZiBmagotICAgIGZvcihqID0gMSA7IGogPD0gbSA7IGorKyl7Ci0gICAgICB3b3JkX2Jlc3Rfc2NvcmUgPSAwIDsgIC8vIHNjb3JlIGZvciB0aGUgYmVzdCBtYXBwaW5nIG9mIGZqCQotICAgICAgVmVjdG9yPExwUGFpcjxDT1VOVCxQUk9CPiAqPiBzUHRyQ2FjaGUoZXMuc2l6ZSgpLDApOwotICAgICAgdG90YWwgPSAwIDsKLSAgICAgIFdvcmRJbmRleCBiZXN0X2kgPSAwIDsKLSAgICAgIGZvcihpID0gMDsgaSA8PSBsIDsgaSsrKXsKLQlzUHRyQ2FjaGVbaV0gPSB0VGFibGUuZ2V0UHRyKGVzW2ldLCBmc1tqXSkgOwotCWlmIChzUHRyQ2FjaGVbaV0gIT0gMCAmJiAgKCooc1B0ckNhY2hlW2ldKSkucHJvYiA+IFBST0JfU01PT1RIKSAvLyBpZiB2YWxpZCBwb2ludGVyCi0JICB0ZW1wX211bHRbaV1bal09ICgqKHNQdHJDYWNoZVtpXSkpLnByb2IgKiBhVGFibGUuZ2V0VmFsdWUoaSwgaiwgbCwgbSkgOwotCWVsc2UgCi0JICB0ZW1wX211bHRbaV1bal0gPSBQUk9CX1NNT09USCAqICBhVGFibGUuZ2V0VmFsdWUoaSwgaiwgbCwgbSkgOwotCXRvdGFsICs9IHRlbXBfbXVsdFtpXVtqXSA7Ci0JaWYgKHRlbXBfbXVsdFtpXVtqXSA+IHdvcmRfYmVzdF9zY29yZSl7Ci0JICAgIHdvcmRfYmVzdF9zY29yZSA9IHRlbXBfbXVsdFtpXVtqXSA7Ci0JICAgIGJlc3RfaSA9IGkgOwotCSAgfQotICAgICAgfSAvLyBlbmQgb2YgZm9yIChpKSAKLSAgICAgIHZpdGVyYmlfYWxpZ25tZW50W2pdID0gYmVzdF9pIDsKLSAgICAgIHZpdGVyYmlfc2NvcmUgKj0gd29yZF9iZXN0X3Njb3JlIDsgLy8vIHRvdGFsIDsKLSAgICAgIGNyb3NzX2VudHJvcHkgKz0gbG9nKHRvdGFsKSA7IAotICAgICAgaWYgKHRvdGFsID09IDApewotCSAgY2VyciA8PCAiV0FSTklORzogdG90YWwgaXMgemVybyAoVFJBSU4pXG4iOwotCSAgdml0ZXJiaV9zY29yZSA9IDAgOwotICAgICAgfQotICAgICAgaWYgKHRvdGFsID4gMCl7Ci0JZm9yKGkgPSAwOyBpIDw9IGwgOyBpKyspewotCSAgdGVtcF9tdWx0W2ldW2pdIC89IHRvdGFsIDsKLQkgIGlmICh0ZW1wX211bHRbaV1bal0gPT0gMSkgLy8gc21vb3RoIHRvIHByZXZlbnQgdW5kZXJmbG93Ci0JICAgIHRlbXBfbXVsdFtpXVtqXSA9IDAuOTkgOwotCSAgZWxzZSAgaWYgKHRlbXBfbXVsdFtpXVtqXSA9PSAwKQotCSAgICB0ZW1wX211bHRbaV1bal0gPSBQUk9CX1NNT09USCA7Ci0JIHZhbCA9IHRlbXBfbXVsdFtpXVtqXSAqIFBST0IoY291bnQpIDsKLQkgIGlmICggdmFsID4gUFJPQl9TTU9PVEgpIHsKLQkgICAgaWYoIHVwZGF0ZVQgKQotCSAgICAgIHsKLQkJaWYgKHNQdHJDYWNoZVtpXSAhPSAwKSAKLQkJICAoKihzUHRyQ2FjaGVbaV0pKS5jb3VudCArPSB2YWwgOwotCQllbHNlCi0JCSAgdFRhYmxlLmluY0NvdW50KGVzW2ldLCBmc1tqXSwgdmFsKTsKLQkgICAgICB9Ci0JICAgIGFDb3VudFRhYmxlLmFkZFZhbHVlKGksIGosIGwsIG0sdmFsKTsKLQkgICAgaWYgKDAgIT0gaSkKLQkgICAgICBkQ291bnRUYWJsZS5hZGRWYWx1ZShqLCBpLCBsLCBtLHZhbCk7Ci0JICB9Ci0JfSAvLyBmb3IgKGkgPSAuLikKLSAgICAgIH0gLy8gZm9yIChpZiB0b3RhbCAuLi4pCi0gICAgfSAvLyBlbmQgb2YgZm9yIChqICAuLi4pCi0gICAgaWYgKGR1bXBfZmlsZXMpCi0gICAgICBwcmludEFsaWduVG9GaWxlKGVzLCBmcywgRWxpc3QuZ2V0Vm9jYWJMaXN0KCksIEZsaXN0LmdldFZvY2FiTGlzdCgpLCBvZjIsIHZpdGVyYmlfYWxpZ25tZW50LCBzZW50LnNlbnRlbmNlTm8sIHZpdGVyYmlfc2NvcmUpOwotICAgIGFkZEFMKHZpdGVyYmlfYWxpZ25tZW50LHNlbnQuc2VudGVuY2VObyxsKTsKLSAgICBpZiAoIXNpbXBsZSl7Ci0gICAgICBtYXhfZmVydGlsaXR5X2hlcmUgPSBtaW4oV29yZEluZGV4KG0rMSksIE1BWF9GRVJUSUxJVFkpOwotICAgICAgZm9yIChpID0gMTsgaSA8PSBsIDsgaSsrKSB7IAotCWZvciAoIGsgPSAxOyBrIDwgbWF4X2ZlcnRpbGl0eV9oZXJlOyBrKyspewotCSAgYmV0YSA9IDAgOwotCSAgYWxwaGFba11baV0gPSAwIDsKLQkgIGZvciAoaiA9IDEgOyBqIDw9IG0gOyBqKyspewotCSAgICB0ZW1wID0gIHRlbXBfbXVsdFtpXVtqXTsJICAgIAkgICAKLQkgICAgaWYgKHRlbXAgPiAwLjk1KSB0ZW1wID0gMC45NTsgLy8gc21vb3RoIHRvIHByZXZlbnQgdW5kZXIvb3ZlciBmbG93Ci0JICAgIGVsc2UgaWYgKHRlbXAgPCAwLjA1KSB0ZW1wID0gMC4wNTsKLQkgICAgYmV0YSArPSBwb3codGVtcC8oMS4wLXRlbXApLCAoZG91YmxlKSBrKTsKLQkgIH0KLQlhbHBoYVtrXVtpXSA9IGJldGEgKiBwb3coKGRvdWJsZSkgLTEsIChkb3VibGUpIChrKzEpKSAvIChkb3VibGUpIGsgOwotCX0KLSAgICAgIH0KLSAgICAgIGZvciAoaSA9IDE7IGkgPD0gbCA7IGkrKyl7IAotCXIgPSAxOwotCWZvciAoaiA9IDEgOyBqIDw9IG0gOyBqKyspCi0JICByICo9ICgxIC0gdGVtcF9tdWx0W2ldW2pdKTsgCi0JZm9yIChrID0gMCAgOyBrIDwgIG1heF9mZXJ0aWxpdHlfaGVyZSA7IGsrKyl7Ci0JICBzdW0gPSBnZXRfc3VtX29mX3BhcnRpdGlvbnMoaywgaSwgYWxwaGEpOwotCSAgdGVtcCA9IHIgKiBzdW0gKiBjb3VudDsKLQkgIG5Db3VudFRhYmxlLmFkZFZhbHVlKGVzW2ldLCBrLHRlbXApOwkgIAotCX0gLy8gZW5kIG9mIGZvciAoayAuLikKLSAgICAgIH0gLy8gZW5kIG9mIGZvciAoaSA9PSAuLikKLSAgICB9IC8vIGVuZCBvZiAgaWYgKCFzaW1wbGUpCi0gICAgcGVycC5hZGRGYWN0b3IoY3Jvc3NfZW50cm9weSwgY291bnQsIGwsIG0sMSk7Ci0gICAgdHJhaW5WUGVycC5hZGRGYWN0b3IobG9nKHZpdGVyYmlfc2NvcmUpLCBjb3VudCwgbCwgbSwxKTsKLSAgfSAvLyBlbmQgb2Ygd2hpbGUgCi0gIHNIYW5kbGVyMS5yZXdpbmQoKTsKLSAgY2VyciA8PCAiTm9ybWFsaXppbmcgdCwgYSwgZCwgbiBjb3VudCB0YWJsZXMgbm93IC4uLiAiIDsKLSAgaWYoIGR1bXBfZmlsZXMgJiYgT3V0cHV0SW5BYWNoZW5Gb3JtYXQ9PTEgKQotICAgIHsKLSAgICAgIHRmaWxlID0gUHJlZml4ICsgIi50MnRvMyIgOwotICAgICAgdFRhYmxlLnByaW50Q291bnRUYWJsZSh0ZmlsZS5jX3N0cigpLEVsaXN0LmdldFZvY2FiTGlzdCgpLEZsaXN0LmdldFZvY2FiTGlzdCgpLDEpOwotICAgIH0KLSAgaWYoIHVwZGF0ZVQgKQotICAgIHRUYWJsZS5ub3JtYWxpemVUYWJsZShFbGlzdCwgRmxpc3QpOwotICBhQ291bnRUYWJsZS5ub3JtYWxpemUoYVRhYmxlKTsKLSAgZENvdW50VGFibGUubm9ybWFsaXplKGRUYWJsZSk7Ci0gIGlmICghc2ltcGxlKQotICAgIG5Db3VudFRhYmxlLm5vcm1hbGl6ZShuVGFibGUsJkVsaXN0LmdldFZvY2FiTGlzdCgpKTsKLSAgZWxzZSB7Ci0gICAgZm9yIChpID0gMCA7IGk8IEVsaXN0LnVuaXFUb2tlbnMoKSA7IGkrKyl7Ci0gICAgICBpZiAoMCA8IE1BWF9GRVJUSUxJVFkpewotCW5UYWJsZS5hZGRWYWx1ZShpLDAsUFJPQigwLjIpKTsKLQlpZiAoMSA8IE1BWF9GRVJUSUxJVFkpewotCSAgblRhYmxlLmFkZFZhbHVlKGksMSxQUk9CKDAuNjUpKTsKLQkgIGlmICgyIDwgTUFYX0ZFUlRJTElUWSl7Ci0JICAgIG5UYWJsZS5hZGRWYWx1ZShpLDIsUFJPQigwLjEpKTsKLQkgIGlmICgzIDwgTUFYX0ZFUlRJTElUWSkKLQkgICAgblRhYmxlLmFkZFZhbHVlKGksMyxQUk9CKDAuMDQpKTsKLQkgIFBST0IgdmFsID0gMC4wMS8oTUFYX0ZFUlRJTElUWS00KTsKLQkgIGZvciAoayA9IDQgOyBrIDwgTUFYX0ZFUlRJTElUWSA7IGsrKykKLQkgICAgblRhYmxlLmFkZFZhbHVlKGksIGssdmFsKTsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgfQotICB9IC8vIGVuZCBvZiBlbHNlICghc2ltcGxlKSAKLSAgcDAgPSAwLjk1OwotICBwMSA9IDAuMDU7Ci0gIGlmIChkdW1wX2ZpbGVzKXsKLSAgICB0ZmlsZSA9IFByZWZpeCArICIudDJ0bzMiIDsKLSAgICBhZmlsZSA9IFByZWZpeCArICIuYTJ0bzMiIDsKLSAgICBuZmlsZSA9IFByZWZpeCArICIubjJ0bzMiIDsKLSAgICBkZmlsZSA9IFByZWZpeCArICIuZDJ0bzMiIDsKLSAgICBwMGZpbGUgPSBQcmVmaXggKyAiLnAwXzJ0bzMiIDsKLSAgICAKLSAgICBpZiggT3V0cHV0SW5BYWNoZW5Gb3JtYXQ9PTAgKQotICAgICAgdFRhYmxlLnByaW50UHJvYlRhYmxlKHRmaWxlLmNfc3RyKCksRWxpc3QuZ2V0Vm9jYWJMaXN0KCksRmxpc3QuZ2V0Vm9jYWJMaXN0KCksT3V0cHV0SW5BYWNoZW5Gb3JtYXQpOwotICAgIGFUYWJsZS5wcmludFRhYmxlKGFmaWxlLmNfc3RyKCkpOwotICAgIGRUYWJsZS5wcmludFRhYmxlKGRmaWxlLmNfc3RyKCkpOwotICAgIG5Db3VudFRhYmxlLnByaW50TlRhYmxlKEVsaXN0LnVuaXFUb2tlbnMoKSwgbmZpbGUuY19zdHIoKSwgRWxpc3QuZ2V0Vm9jYWJMaXN0KCksT3V0cHV0SW5BYWNoZW5Gb3JtYXQpOwotICAgIG9mc3RyZWFtIG9mKHAwZmlsZS5jX3N0cigpKTsKLSAgICBvZiA8PCBwMDsKLSAgICBvZi5jbG9zZSgpOwotICB9Ci0gIGVycm9yUmVwb3J0QUwoY2VyciwiSUJNLTIiKTsKLSAgaWYoc2ltcGxlKQotICAgIHsKLSAgICAgIHBlcnAucmVjb3JkKCJUMlRvMyIpOwotICAgICAgdHJhaW5WUGVycC5yZWNvcmQoIlQyVG8zIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcGVycC5yZWNvcmQoIlNUMlRvMyIpOwotICAgICAgdHJhaW5WUGVycC5yZWNvcmQoIlNUMlRvMyIpOwotICAgIH0KLX0KLQotdm9pZCBtb2RlbDM6OnRyYW5zZmVyU2ltcGxlKC8qbW9kZWwxJiBtMSwgbW9kZWwyJiBtMiwgKi8gc2VudGVuY2VIYW5kbGVyJiBzSGFuZGxlcjEsIAotCQkJICAgIGJvb2wgZHVtcF9maWxlcywgUGVycGxleGl0eSYgcGVycCwgUGVycGxleGl0eSYgdHJhaW5WUGVycCxib29sIHVwZGF0ZVQpCi17Ci0gIC8qIAotICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHNpbXBsZSBNb2RlbCAyIC0+IE1vZGVsIDMgdHJhbnNmZXIuCi0gICAgIEl0IHNldHMgdmFsdWVzIGZvciBuIGFuZCBwIHdpdGhvdXQgY29uc2lkZXJpbmcgTW9kZWwgMidzIGlkZWFzLgotICAgICBJdCBzZXRzIGQgdmFsdWVzIGJhc2VkIG9uIGEuCi0gICovCi0gIHRpbWVfdCBzdCwgZm47Ci0gIC8vIGp1c3QgaW5oZXJpdCB0aGVzZSBmcm9tIHRoZSBwcmV2aW91cyBtb2RlbHMsIHRvIGF2b2lkIGRhdGEgZHVwbGljYXRpb24KLSAKLSAgc3QgPSB0aW1lKE5VTEwpOwotICBjZXJyIDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwotICBjZXJyIDw8ICJcblRyYW5zZmVyIHN0YXJ0ZWQgYXQ6ICI8PCBteV9jdGltZSgmc3QpIDw8ICdcbic7ICAKLSAgCi0gIGNlcnIgPDwgIlNpbXBsZSB0cmFuZmVyIG9mIE1vZGVsMiAtLT4gTW9kZWwzIChpLmUuIGVzdGltYXRpbmcgaW5pdGlhbCBwYXJhbWV0ZXJzIG9mIE1vZGVsMyBmcm9tIE1vZGVsMiB0YWJsZXMpXG4iOwotICAKLSAgZXN0aW1hdGVfdF9hX2Qoc0hhbmRsZXIxLCBwZXJwLCB0cmFpblZQZXJwLCB0cnVlLCBkdW1wX2ZpbGVzLHVwZGF0ZVQpIDsKLSAgZm4gPSB0aW1lKE5VTEwpIDsKLSAgY2VyciA8PCAiXG5UcmFuc2ZlcjogVFJBSU4gQ1JPU1MtRU5UUk9QWSAiIDw8IHBlcnAuY3Jvc3NfZW50cm9weSgpCi0gICAgICAgPDwgIiBQRVJQTEVYSVRZICIgPDwgcGVycC5wZXJwbGV4aXR5KCkgPDwgJ1xuJzsKLSAgY2VyciA8PCAiXG5UcmFuc2ZlciB0b29rOiAiIDw8IGRpZmZ0aW1lKGZuLCBzdCkgPDwgIiBzZWNvbmRzXG4iOwotICBjZXJyIDw8ICJcblRyYW5zZmVyIEZpbmlzaGVkIGF0OiAiPDwgbXlfY3RpbWUoJmZuKSA8PCAnXG4nOyAgCi0gIGNlcnIgPDwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7Ci0gIAotfQotCi0KLXZvaWQgbW9kZWwzOjp0cmFuc2ZlcihzZW50ZW5jZUhhbmRsZXImIHNIYW5kbGVyMSxib29sIGR1bXBfZmlsZXMsIFBlcnBsZXhpdHkmIHBlcnAsIFBlcnBsZXhpdHkmIHRyYWluVlBlcnAsYm9vbCB1cGRhdGVUKQotewotICBpZiAoVHJhbnNmZXIgPT0gVFJBTlNGRVJfU0lNUExFKQotICAgIHRyYW5zZmVyU2ltcGxlKHNIYW5kbGVyMSxkdW1wX2ZpbGVzLHBlcnAsIHRyYWluVlBlcnAsdXBkYXRlVCk7Ci0gIHsKLSAgICB0aW1lX3Qgc3QsIGZuIDsKLSAgICAKLSAgICBzdCA9IHRpbWUoTlVMTCk7Ci0gICAgY2VyciA8PCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKLSAgICBjZXJyIDw8ICJcblRyYW5zZmVyIHN0YXJ0ZWQgYXQ6ICI8PCBteV9jdGltZSgmc3QpIDw8ICdcbic7ICAKLSAgICBjZXJyIDw8ICJUcmFuc2ZlcmluZyBNb2RlbDIgLS0+IE1vZGVsMyAoaS5lLiBlc3RpbWF0aW5nIGluaXRpYWwgcGFyYW1ldGVycyBvZiBNb2RlbDMgZnJvbSBNb2RlbDIgdGFibGVzKVxuIjsKLSAgICAKLSAgICBwMV9jb3VudCA9IHAwX2NvdW50ID0gMCA7Ci0gICAgCi0gICAgZXN0aW1hdGVfdF9hX2Qoc0hhbmRsZXIxLCBwZXJwLCB0cmFpblZQZXJwLCBmYWxzZSwgZHVtcF9maWxlcyx1cGRhdGVUKTsKLSAgICAKLSAgICAKLSAgICAKLSAgICAvKiBCZWxvdyBpcyBhIG1hZGUtdXAgc3RhYiBhdCB0cmFuc2ZlcnJpbmcgdCAmIGEgcHJvYnMgdG8gcDAvcDEuCi0gICAgICAgKE1ldGhvZCBub3QgZG9jdW1lbnRlZCBpbiBJQk0gcGFwZXIpLgotICAgICAgIEl0IHNlZW1zIHRvIGdpdmUgcDAgPSAuOTYsIHdoaWNoIG1heSBiZSByaWdodCBmb3IgTW9kZWwgMiwgb3IgbWF5IG5vdC4KLSAgICAgICBJJ20gY29tbWVudGluZyBpdCBvdXQgZm9yIG5vdyBhbmQgaGFyZHdpcmluZyBwMCA9IC45MCBhcyBhYm92ZS4gLUtldmluCi0gICAgICAgCi0gICAgICAgLy8gY29tcHV0ZSBwMCwgcDEgY291bnRzCi0gICAgICAgVmVjdG9yPExvZ1Byb2I+IG5tKEVsaXN0LnVuaXFUb2tlbnMoKSwwLjApOwotICAgICAgIAotICAgICAgIGZvcihpPTA7IGkgPCBFbGlzdC51bmlxVG9rZW5zKCk7IGkrKyl7Ci0gICAgICAgZm9yKGs9MTsgayA8IE1BWF9GRVJUSUxJVFk7IGsrKyl7Ci0gICAgICAgbm1baV0gKz0gblRhYmxlLmdldFZhbHVlKGksIGspICogKExvZ1Byb2IpIGs7Ci0gICAgICAgfQotICAgICAgIH0KLSAgICAgICAKLSAgICAgICBMb2dQcm9iIG1wcmltZTsKLSAgICAgICAvLyAgc2VudGVuY2VIYW5kbGVyIHNIYW5kbGVyMShlZkZpbGVuYW1lLmNfc3RyKCkpOwotICAgICAgIC8vICBzZW50UGFpciBzZW50IDsKLSAgICAgICAKLSAgICAgICB3aGlsZShzSGFuZGxlcjEuZ2V0TmV4dFNlbnRlbmNlKHNlbnQpKXsKLSAgICAgICBWZWN0b3I8V29yZEluZGV4PiYgZXMgPSBzZW50LmVTZW50OwotICAgICAgIFZlY3RvcjxXb3JkSW5kZXg+JiBmcyA9IHNlbnQuZlNlbnQ7Ci0gICAgICAgY29uc3QgZmxvYXQgY291bnQgID0gc2VudC5ub09jY3VycmVuY2VzOwotICAgICAgIAotICAgICAgIGwgPSBlcy5zaXplKCkgLSAxOwotICAgICAgIG0gPSBmcy5zaXplKCkgLSAxOwotICAgICAgIG1wcmltZSA9IDAgOwotICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbCA7IGkrKyl7Ci0gICAgICAgbXByaW1lICs9ICBubVtlc1tpXV0gOwotICAgICAgIH0KLSAgICAgICBtcHJpbWUgPSBMb2dQcm9iKChpbnQoKGRvdWJsZSkgbXByaW1lICsgMC41KSkpOyAgLy8gcm91bmQgbXByaW1lIHRvIG5lYXJlc3QgaW50ZWdlciAKLSAgICAgICBpZiAoKG1wcmltZSA8IG0pICYmICgyICogbXByaW1lID49IG0pKSB7Ci0gICAgICAgLy8gICAgICBjZXJyIDw8ICJ1cGRhdGluZyBib3RoIHAwX2NvdW50IGFuZCBwMV9jb3VudCwgbXByaW1lOiAiIDw8IG1wcmltZSA8PCAKLSAgICAgICAvLwkibSA9ICIgPDwgbSA8PCAiXG4iOwotICAgICAgIHAxX2NvdW50ICs9ICAobSAtIChkb3VibGUpIG1wcmltZSkgICogY291bnQgOwotICAgICAgIHAwX2NvdW50ICs9ICAoMiAqIChkb3VibGUpIG1wcmltZSAtIG0pICAqIGNvdW50IDsKLSAgICAgICAvLyAgY2VyciA8PCAicDBfY291bnQgPSAiPDxwMF9jb3VudCA8PCAiICwgcDFfY291bnQgPSAiIDw8IHAxX2NvdW50IDw8IGVuZGwgOwotICAgICAgIH0KLSAgICAgICBlbHNlIHsKLSAgICAgICAvLyAgICAgIHAxX2NvdW50ICs9IDAgOwotICAgICAgIC8vICAgICAgY2VyciA8PCAidXBkYXRpbmcgb25seSBwMF9jb3VudCwgbXByaW1lOiAiIDw8IG1wcmltZSA8PCAKLSAgICAgICAvLwkibSA9ICIgPDwgbSA8PCAiXG4iOwotICAgICAgIHAwX2NvdW50ICs9ICBkb3VibGUobSAgKiBjb3VudCkgOwotICAgICAgIC8vICBjZXJyIDw8ICJwMF9jb3VudCA9ICI8PHAwX2NvdW50IDw8ICIgLCBwMV9jb3VudCA9ICIgPDwgcDFfY291bnQgPDwgZW5kbCA7Ci0gICAgICAgfQotICAgICAgIH0KLSAgICAgICAKLSAgICAgICAvLyBub3JtYWxpemUgcDEsIHAwIAotICAgICAgIAotICAgICAgIGNlcnIgPDwgInAwX2NvdW50ID0gIjw8cDBfY291bnQgPDwgIiAsIHAxX2NvdW50ID0gIiA8PCBwMV9jb3VudCA8PCBlbmRsIDsKLSAgICAgICBwMSA9IHAxX2NvdW50IC8gKHAxX2NvdW50ICsgcDBfY291bnQgKSA7Ci0gICAgICAgcDAgPSAxIC0gcDE7Ci0gICAgICAgY2VyciA8PCAicDAgPSAiPDxwMCA8PCAiICwgcDEgPSAiIDw8IHAxIDw8IGVuZGwgOwotICAgICAgIC8vIFNtb290aCBwMCBwcm9iYWJpbGl0eSB0byBhdm9pZCBnZXR0aW5nIHplcm8gcHJvYmFiaWxpdHkuCi0gICAgICAgaWYgKDAgPT0gcDApewotICAgICAgIHAwID0gKExvZ1Byb2IpIFNNT09USF9USFJFU0hPTEQgOwotICAgICAgIHAxID0gcDEgLSAoTG9nUHJvYikgU01PT1RIX1RIUkVTSE9MRCA7Ci0gICAgICAgfQotICAgICAgIGlmICgwID09IHAxKXsKLSAgICAgICBwMSA9IChMb2dQcm9iKSBTTU9PVEhfVEhSRVNIT0xEIDsKLSAgICAgICBwMCA9IHAwIC0gKExvZ1Byb2IpIFNNT09USF9USFJFU0hPTEQgOwotICAgICAgIH0KLSAgICAqLwotICAgIAotICAgIGZuID0gdGltZShOVUxMKSA7Ci0gICAgY2VyciA8PCAiXG5UcmFuc2ZlcjogVFJBSU4gQ1JPU1MtRU5UUk9QWSAiIDw8IHBlcnAuY3Jvc3NfZW50cm9weSgpCi0JIDw8ICIgUEVSUExFWElUWSAiIDw8IHBlcnAucGVycGxleGl0eSgpIDw8ICdcbic7Ci0gICAgLy8gICAgY2VyciA8PCAidFRhYmxlIGNvbnRhaW5zICIgPDwgdFRhYmxlLmdldEhhc2goKS5idWNrZXRfY291bnQoKSAKLSAgICAvLwkgPDwgIiBidWNrZXRzIGFuZCAgIiA8PCB0VGFibGUuZ2V0SGFzaCgpLnNpemUoKSA8PCAiIGVudHJpZXMuIiA7Ci0gICAgY2VyciA8PCAiXG5UcmFuc2ZlciB0b29rOiAiIDw8IGRpZmZ0aW1lKGZuLCBzdCkgPDwgIiBzZWNvbmRzXG4iOwotICAgIGNlcnIgPDwgIlxuVHJhbnNmZXIgRmluaXNoZWQgYXQ6ICI8PCBteV9jdGltZSgmZm4pIDw8IGVuZGw7ICAKLSAgICBjZXJyIDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwotICAgIAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21vZGVsMy5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9tb2RlbDMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzNjNzAxLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21vZGVsMy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcwICswLDAgQEAKLS8qCi0KLSBFR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi0gV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLSBVU0EuCi0KLSAqLwotI2luY2x1ZGUgIm1vZGVsMy5oIgotI2luY2x1ZGUgImNvbGxDb3VudHMuaCIKLSNpbmNsdWRlICJHbG9iYWxzLmgiCi0jaW5jbHVkZSAidXRpbGl0eS5oIgotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDUuaCIKLSNpbmNsdWRlICJ0cmFuc3BhaXJfbW9kZWxobW0uaCIKLSNpbmNsdWRlICJQYXJhbWV0ZXIuaCIKLQotI2RlZmluZSBUUklDS1lfSUJNM19UUkFJTklORwotCi1HTE9CQUxfUEFSQU1FVEVSKGludCxNNF9EZXBlbmRlbmNpZXMsImRlcG00IiwiZF97PTF9OiAmMTpsLCAmMjptLCAmNDpGLCAmODpFLCBkX3s+MX0mMTY6bCwgJjMyOm0sICY2NDpGLCAmMTI4OkUiLFBBUkxFVl9NT0RFTFMsNzYpCi07Ci1HTE9CQUxfUEFSQU1FVEVSKGludCxNNV9EZXBlbmRlbmNpZXMsImRlcG01IiwiZF97PTF9OiAmMTpsLCAmMjptLCAmNDpGLCAmODpFLCBkX3s+MX0mMTY6bCwgJjMyOm0sICY2NDpGLCAmMTI4OkUiLFBBUkxFVl9NT0RFTFMsNjgpCi07Ci1HTE9CQUxfUEFSQU1FVEVSNChpbnQsTW9kZWwzX0R1bXBfRnJlcSwiTU9ERUwgMzQ1IERVTVAgRlJFUVVFTkNZIiwiTU9ERUwgMyBEVU1QIEZSRVFVRU5DWSIsInQzIiwidDM0NSIsImR1bXAgZnJlcXVlbmN5IG9mIE1vZGVsIDMvNC81IixQQVJMRVZfT1VUUFVULDApCi07Ci0KLS8qbW9kZWwzOjptb2RlbDMobW9kZWwyJiBtMikgOgotIG1vZGVsMihtMiksZFRhYmxlKCBhbW9kZWw8UFJPQj4odHJ1ZSkpLCBkQ291bnRUYWJsZSh0cnVlKSwKLSBuVGFibGUoIG5tb2RlbDxQUk9CPihtMi5nZXROb0VuZ2xpc2hXb3JkcygpKzEsIE1BWF9GRVJUSUxJVFkpKSwKLSBuQ291bnRUYWJsZShtMi5nZXROb0VuZ2xpc2hXb3JkcygpKzEsIE1BWF9GRVJUSUxJVFkpLGgoMCkKLSB7fSovCi0KLWV4dGVybiBpbnQgVHJhbnNmZXJfRHVtcF9GcmVxOwotCi1tb2RlbDM6Om1vZGVsMyhtb2RlbDImIG0yLCBhbW9kZWw8UFJPQj4mIGQsIG5tb2RlbDxQUk9CPiYgbikgOgotCW1vZGVsMihtMiksIGRUYWJsZShkKSwgZENvdW50VGFibGUodHJ1ZSksIG5UYWJsZShuKSwvL20yLmdldE5vRW5nbGlzaFdvcmRzKCkrMSwgTUFYX0ZFUlRJTElUWSksIAotCQkJbkNvdW50VGFibGUobTIuZ2V0Tm9FbmdsaXNoV29yZHMoKSsxLCBNQVhfRkVSVElMSVRZKSwgaCgwKSB7Ci0JCQkJZXdvcmRjbGFzc2VzID0gZndvcmRjbGFzc2VzID0gTlVMTDsKLX0KLQotbW9kZWwzOjptb2RlbDMobW9kZWwzJiBtMywgYW1vZGVsPFBST0I+JiBkLCBubW9kZWw8UFJPQj4mIG4sIGFtb2RlbDxDT1VOVD4mIGEpIDoKLQltb2RlbDIoKigmbTMpLCBtMy5hVGFibGUsIGEpLCBkVGFibGUoZCksIGRDb3VudFRhYmxlKHRydWUpLCBuVGFibGUobiksLy9tMi5nZXROb0VuZ2xpc2hXb3JkcygpKzEsIE1BWF9GRVJUSUxJVFkpLCAKLQkJCW5Db3VudFRhYmxlKG0zLmdldE5vRW5nbGlzaFdvcmRzKCkrMSwgTUFYX0ZFUlRJTElUWSksIGgoMCkgewotCWV3b3JkY2xhc3NlcyA9IGZ3b3JkY2xhc3NlcyA9IE5VTEw7Ci19Ci0KLXZvaWQgbW9kZWwzOjpsb2FkX3RhYmxlcyhjb25zdCBjaGFyICpuZmlsZSwgY29uc3QgY2hhciAqZGZpbGUsCi0JCWNvbnN0IGNoYXIgKnAwZmlsZSkgewotCWNvdXQgPDwgIk1vZGVsMzogbG9hZGluZyBuLCBkLCBwMCB0YWJsZXMgXG4iOwotCi0JblRhYmxlLnJlYWROVGFibGUobmZpbGUpOwotCWRUYWJsZS5yZWFkVGFibGUoZGZpbGUpOwotCWlmc3RyZWFtIGluZihwMGZpbGUpOwotCWlmICggIWluZikKLQkJY2VyciA8PCAiQ2FuIG5vdCBvcGVuOiAiIDw8IHAwZmlsZSA8PCAnXG4nOwotCWVsc2UgewotCQljb3V0IDw8ICJSZWFkaW5nIHAwIHZhbHVlIGZyb20gIiA8PCBwMGZpbGUgPDwgIlxuIjsKLQkJaW5mID4+IHAwOwotCQlpbmYuY2xvc2UoKTsKLQkJcDEgPSAxIC0gcDA7Ci0JfQotCWNvdXQgPDwgInAwIGlzOiAiIDw8IHAwIDw8ICIgcDE6IiA8PCBwMSA8PCAnXG4nOwotfQotCi1tb2RlbDM6On5tb2RlbDMoKSB7Ci0JZFRhYmxlLmNsZWFyKCk7Ci0JZENvdW50VGFibGUuY2xlYXIoKTsKLQluVGFibGUuY2xlYXIoKTsKLQluQ291bnRUYWJsZS5jbGVhcigpOwotCWlmKGg9PU5VTEwgJiYgZXdvcmRjbGFzc2VzIT1OVUxMICYmIGZ3b3JkY2xhc3NlcyE9TlVMTCl7Ci0JCWRlbGV0ZSBld29yZGNsYXNzZXM7Ci0JCWRlbGV0ZSBmd29yZGNsYXNzZXM7Ci0JfQotfQotCi12b2lkIG1vZGVsMzo6ZW0oaW50IG5vSXRlcmF0aW9ucywgc2VudGVuY2VIYW5kbGVyJiBzSGFuZGxlcjEpIHsKLQotCUxvZ1Byb2IgYWxsX3Byb2IsIGFwcm9iLCB0ZW1wOwotCVdvcmRJbmRleCBpLCBqLCBsLCBtOwotCXRpbWVfdCBpdF9zdCwgc3QsIGl0X2ZuLCBmbjsKLQlzdHJpbmcgdGZpbGUsIGRmaWxlLCBuZmlsZSwgcDBmaWxlLCBhZmlsZSwgbnVtYmVyOwotCi0Jc3QgPSB0aW1lKE5VTEwpIDsKLQljb3V0IDw8ICJcbiIgPDwgIlN0YXJ0aW5nIE1vZGVsMzogIFRyYWluaW5nIjsKLQkvLyAgc2VudGVuY2VIYW5kbGVyIHNIYW5kbGVyMShlZkZpbGVuYW1lLmNfc3RyKCkpOwotCXNIYW5kbGVyMS5yZXdpbmQoKTsKLQlmb3IgKGludCBpdD0xOyBpdCA8PSBub0l0ZXJhdGlvbnM7IGl0KyspIHsKLQkJaXRfc3QgPSB0aW1lKE5VTEwpIDsKLQkJY291dCA8PCAiXG4iIDw8ICJNb2RlbDM6IEl0ZXJhdGlvbiAiIDw8IGl0OwotCi0JCS8vIHNldCB1cCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHdoZXJlIHRoZSB0YWJsZXMgd2lsbCBiZSBwcmludGVkIAotCQlpbnQgbiA9IGl0OwotCQludW1iZXIgPSAiIjsKLQkJZG8gewotCQkJLy9taiBjaGFuZ2VkIG5leHQgbGluZQotCQkJbnVtYmVyLmluc2VydCgoc2l6ZV90KSAwLCAxLCAoY2hhcikobiAlIDEwICsgJzAnKSk7Ci0JCX0gd2hpbGUgKChuIC89IDEwKSA+IDApOwotCQl0ZmlsZSA9IFByZWZpeCArICIudDMuIiArIG51bWJlcjsKLQkJYWZpbGUgPSBQcmVmaXggKyAiLmEzLiIgKyBudW1iZXI7Ci0JCW5maWxlID0gUHJlZml4ICsgIi5uMy4iICsgbnVtYmVyOwotCQlkZmlsZSA9IFByZWZpeCArICIuZDMuIiArIG51bWJlcjsKLQkJcDBmaWxlID0gUHJlZml4ICsgIi5wMF8zLiIgKyBudW1iZXI7Ci0JCS8vICAgIHRDb3VudFRhYmxlLmNsZWFyKCk7Ci0JCWRDb3VudFRhYmxlLmNsZWFyKCk7Ci0JCW5Db3VudFRhYmxlLmNsZWFyKCk7Ci0JCXAwX2NvdW50ID0gMC4wOwotCQlwMV9jb3VudCA9IDAuMDsKLQkJYWxsX3Byb2IgPSAwOwotCQlzZW50UGFpciBzZW50OwotCQl3aGlsZSAoc0hhbmRsZXIxLmdldE5leHRTZW50ZW5jZShzZW50KSkgewotCQkJVmVjdG9yPFdvcmRJbmRleD4mIGVzID0gc2VudC5lU2VudDsKLQkJCVZlY3RvcjxXb3JkSW5kZXg+JiBmcyA9IHNlbnQuZlNlbnQ7Ci0JCQljb25zdCBmbG9hdCBjb3VudCA9IHNlbnQuZ2V0Q291bnQoKTsKLQkJCWlmICgoc2VudC5zZW50ZW5jZU5vICUgMTAwMCkgPT0gMCkKLQkJCQljb3V0IDw8c2VudC5zZW50ZW5jZU5vIDw8ICdcbic7Ci0JCQlWZWN0b3I8V29yZEluZGV4PiBBKGZzLnNpemUoKSwvKi0xKi8wKTsKLQkJCVZlY3RvcjxXb3JkSW5kZXg+IEZlcnQoZXMuc2l6ZSgpLDApOwotCQkJTG9nUHJvYiBsY291bnQ9KExvZ1Byb2IpY291bnQ7Ci0JCQlsID0gZXMuc2l6ZSgpLTE7Ci0JCQltID0gZnMuc2l6ZSgpLTE7Ci0JCQlXb3JkSW5kZXggeCwgeTsKLQkJCWFsbF9wcm9iID0gcHJvYl9vZl90YXJnZXRfZ2l2ZW5fc291cmNlKHRUYWJsZSwgZnMsIGVzKTsKLQkJCWlmIChhbGxfcHJvYiA9PSAwKQotCQkJCWNvdXQgPDwgIlxuIiA8PCJhbGxfcHJvYiA9IDAiOwotCi0JCQlmb3IgKHggPSAwOyB4IDwgcG93KGwrMS4wLCBkb3VibGUobSkpIDsgeCsrKSB7IC8vIEZvciBhbGwgcG9zc2libGUgYWxpZ25tZXRzIEEKLQkJCQl5ID0geDsKLQkJCQlmb3IgKGogPSAxOyBqIDw9IG07IGorKykgewotCQkJCQlBW2pdID0geSAlIChsKzEpOwotCQkJCQl5IC89IChsKzEpOwotCQkJCX0KLQkJCQlmb3IgKGkgPSAwOyBpIDw9IGw7IGkrKykKLQkJCQkJRmVydFtpXSA9IDA7Ci0JCQkJZm9yIChqID0gMTsgaiA8PSBtOyBqKyspCi0JCQkJCUZlcnRbQVtqXV0rKzsKLQkJCQlpZiAoMiAqIEZlcnRbMF0gPD0gbSkgeyAvKiBjb25zaWRlciBhbGlnbm1lbnRzIHRoYXQgaGFzIEZlcnRbMF0gbGVzcyB0aGFuCi0JCQkJIGhhbGYgdGhlIG51bWJlciBvZiB3b3JkcyBpbiBGcmVuY2ggc2VudGVuY2UgKi8KLQkJCQkJYXByb2IgPSBwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShBLCBGZXJ0LAotCQkJCQkJCXRUYWJsZSwgZnMsIGVzKTsKLQkJCQkJdGVtcCA9IGFwcm9iL2FsbF9wcm9iOwotCQkJCQlMb2dQcm9iIHRlbXBsY291bnQgPSB0ZW1wKmxjb3VudDsKLQotCQkJCQlmb3IgKGogPSAxOyBqIDw9IG07IGorKykgewotCQkJCQkJdFRhYmxlLmluY0NvdW50KGVzW0Fbal1dLCBmc1tqXSwgdGVtcGxjb3VudCk7Ci0JCQkJCQlpZiAoMCAhPSBBW2pdKQotCQkJCQkJCWRDb3VudFRhYmxlLmFkZFZhbHVlKGosIEFbal0sIGwsIG0sIHRlbXBsY291bnQpOwotCQkJCQl9Ci0JCQkJCWZvciAoaSA9IDA7IGkgPD0gbDsgaSsrKSB7Ci0JCQkJCQluQ291bnRUYWJsZS5hZGRWYWx1ZShlc1tpXSwgRmVydFtpXSwgdGVtcGxjb3VudCk7Ci0JCQkJCQkvL2NvdXQgPDwgIkFGVEVSIElOQzI6ICIgPDwgdGVtcGxjb3VudCA8PCAiICIgPDwgbkNvdW50VGFibGUuZ2V0UmVmKGVzW2ldLCBGZXJ0W2ldKSA8PCAnXG4nOwotCQkJCQl9Ci0JCQkJCXAxX2NvdW50ICs9IGRvdWJsZSh0ZW1wKSAqIChGZXJ0WzBdICogY291bnQpOwotCQkJCQlwMF9jb3VudCArPSBkb3VibGUodGVtcCkgKiAoKG0gLSAyICogRmVydFswXSkgKiBjb3VudCk7Ci0JCQkJfQotCQkJfSAvKiBvZiBsb29waW5nIG92ZXIgYWxsIGFsaWdubWVudHMgKi8KLQkJfSAvKiBvZiBzZW50ZW5jZSBwYWlyIEUsIEYgKi8KLQkJc0hhbmRsZXIxLnJld2luZCgpOwotCi0JCS8vIG5vcm1hbGl6ZSB0YWJsZXMKLQkJaWYgKE91dHB1dEluQWFjaGVuRm9ybWF0PT0xKQotCQkJdFRhYmxlLnByaW50Q291bnRUYWJsZSh0ZmlsZS5jX3N0cigpLCBFbGlzdC5nZXRWb2NhYkxpc3QoKSwKLQkJCQkJRmxpc3QuZ2V0Vm9jYWJMaXN0KCksIDEpOwotCQl0VGFibGUubm9ybWFsaXplVGFibGUoRWxpc3QsIEZsaXN0KTsKLQkJYUNvdW50VGFibGUubm9ybWFsaXplKGFUYWJsZSk7Ci0JCWRDb3VudFRhYmxlLm5vcm1hbGl6ZShkVGFibGUpOwotCQluQ291bnRUYWJsZS5ub3JtYWxpemUoblRhYmxlLCAmRWxpc3QuZ2V0Vm9jYWJMaXN0KCkpOwotCi0JCS8vIG5vcm1hbGl6ZSBwMSAmIHAwIAotCi0JCWlmIChwMV9jb3VudCArIHAwX2NvdW50ICE9IDApIHsKLQkJCXAxID0gcDFfY291bnQgLyAocDFfY291bnQgKyBwMF9jb3VudCApOwotCQkJcDAgPSAxIC0gcDE7Ci0JCX0gZWxzZSB7Ci0JCQlwMSA9IHAwID0gMDsKLQkJfQotCQkvLyBwcmludCB0YWJsZXMgCi0JCWlmIChPdXRwdXRJbkFhY2hlbkZvcm1hdD09MCkKLQkJCXRUYWJsZS5wcmludFByb2JUYWJsZSh0ZmlsZS5jX3N0cigpLCBFbGlzdC5nZXRWb2NhYkxpc3QoKSwKLQkJCQkJRmxpc3QuZ2V0Vm9jYWJMaXN0KCksIE91dHB1dEluQWFjaGVuRm9ybWF0KTsKLQkJZFRhYmxlLnByaW50VGFibGUoZGZpbGUuY19zdHIoKSk7Ci0JCW5UYWJsZS5wcmludE5UYWJsZShFbGlzdC51bmlxVG9rZW5zKCksIG5maWxlLmNfc3RyKCksCi0JCQkJRWxpc3QuZ2V0Vm9jYWJMaXN0KCksIE91dHB1dEluQWFjaGVuRm9ybWF0KTsKLQkJb2ZzdHJlYW0gb2YocDBmaWxlLmNfc3RyKCkpOwotCQlvZiA8PCBwMDsKLQkJb2YuY2xvc2UoKTsKLQkJaXRfZm4gPSB0aW1lKE5VTEwpIDsKLQkJY291dCA8PCAiXG4iIDw8ICJNb2RlbDMgSXRlcmF0aW9uICI8PGl0PDwiIHRvb2s6ICIgPDwgZGlmZnRpbWUoaXRfZm4sCi0JCQkJaXRfc3QpIDw8ICIgc2Vjb25kc1xuIjsKLQotCX0gLyogb2YgaXRlcmF0aW9ucyAqLwotCWZuID0gdGltZShOVUxMKSA7Ci0JY291dCA8PCAiXG4iIDw8ICJFbnRpcmUgTW9kZWwzIFRyYWluaW5nIHRvb2s6ICIgPDwgZGlmZnRpbWUoZm4sIHN0KQotCQkJPDwgIiBzZWNvbmRzXG4iOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gdm9pZCBzaW1wbGVNb2RlbDNUZXN0KCkKLSB7Ci0gUG9zaXRpb25JbmRleCBsPTY7Ci0gUG9zaXRpb25JbmRleCBtPTg7Ci0gYWxpZ25tZW50IGFsKGwsbSk7Ci0gYWwuc2V0KDEsMSk7Ci0gYWwuc2V0KDIsMik7Ci0gYWwuc2V0KDMsMyk7Ci0gYWwuc2V0KDQsMik7Ci0gYWwuc2V0KDUsMCk7Ci0gYWwuc2V0KDYsNik7Ci0gYWwuc2V0KDcsMyk7Ci0gYWwuc2V0KDgsNCk7Ci0gY291dCA8PCBhbDsKLSBQb3NpdGlvbkluZGV4IHByZXZfY2VwdD0wOwotIFBvc2l0aW9uSW5kZXggdmFjX2FsbD1tOwotIFZlY3RvcjxjaGFyPiB2YWMobSsxLDApOwotIGZvcihQb3NpdGlvbkluZGV4IGk9MTtpPD1sO2krKykKLSB7Ci0gUG9zaXRpb25JbmRleCBjdXJfaj1hbC5hbHNfaVtpXTsgCi0gY291dCA8PCAiTE9PUDogIiA8PCBpIDw8ICIgIiA8PCBjdXJfaiA8PCAnXG4nOwotIFBvc2l0aW9uSW5kZXggcHJldl9qPTA7Ci0gUG9zaXRpb25JbmRleCBrPTA7Ci0gaWYoY3VyX2opIHsgLy8gcHJvY2VzcyBmaXJzdCB3b3JkIG9mIGNlcHQKLSBrKys7Ci0gdmFjX2FsbC0tOwotIGFzc2VydCh2YWNbY3VyX2pdPT0wKTsKLSB2YWNbY3VyX2pdPTE7Ci0gZm9yKHVuc2lnbmVkIGludCBxPTA7cTx2YWMuc2l6ZSgpO3ErKyljb3V0IDw8ICh2YWNbcV0/JzEnOicwJykgPDwgJyAnOwotIGNvdXQgPDwgJ1xuJzsJICAgICAgIAotIGNvdXQgPDwgaSA8PCAiICIgPDwgY3VyX2ogPDwgIjogZDEoIiA8PCB2YWNhbmNpZXModmFjLGN1cl9qKSA8PCAifCIgPDwgdmFjYW5jaWVzKHZhYyxhbC5nZXRfY2VudGVyKHByZXZfY2VwdCkpIDw8ICIsIiA8PCB2YWNfYWxsIDw8ICIrIiA8PCAtYWwuZmVydChpKTw8ICIrIiA8PCArayA8PCAiKVxuIiA8PCAnXG4nOwotIHByZXZfaj1jdXJfajsKLSBjdXJfaj1hbC5hbHNfaltjdXJfal0ubmV4dDsKLSB9IAotIHdoaWxlKGN1cl9qKSB7IC8vIHByb2Nlc3MgZm9sbG93aW5nIHdvcmRzIG9mIGNlcHQKLSBrKys7Ci0gdmFjX2FsbC0tOwotIHZhY1tjdXJfal09MTsKLSBpbnQgdnByZXY9dmFjYW5jaWVzKHZhYyxwcmV2X2opOwotIGNvdXQgPDwgIlBSRVY6ICIgPDwgcHJldl9qIDw8ICdcbic7Ci0gZm9yKHVuc2lnbmVkIGludCBxPTA7cTx2YWMuc2l6ZSgpO3ErKyljb3V0IDw8ICh2YWNbcV0/JzEnOicwJykgPDwgJyAnOwotIGNvdXQgPDwgJ1xuJzsJICAgICAgIAotIGNvdXQgPDwgaSA8PCAiICIgPDwgY3VyX2ogPDwgIjogZD4xKCIgPDwgdmFjYW5jaWVzKHZhYyxjdXJfaikgPDwgIi0iIDw8IHZwcmV2IDw8ICJ8IiA8PCB2YWNfYWxsPDwgIisiIDw8IC1hbC5mZXJ0KGkpPDwgIisiIDw8ICtrIDw8ICIpXG4iIDw8ICdcbic7Ci0gcHJldl9qPWN1cl9qOwotIGN1cl9qPWFsLmFsc19qW2N1cl9qXS5uZXh0OwotIH0KLSBhc3NlcnQoaz09YWwuZmVydChpKSk7Ci0gaWYoIGsgKQotIHByZXZfY2VwdD1pOwotIH0KLSBhc3NlcnQodmFjX2FsbD09YWwuZmVydCgwKSk7Ci0gfQotICovCi0KLWV4dGVybiBzaG9ydCBEb1ZpdGVyYmlUcmFpbmluZzsKLQotc3RydWN0IG0zX2VtX2xvb3BfdCB7Ci0JbW9kZWwzICptOwotCWludCBkb25lOwotCWludCB2YWxpZDsKLQlzdHJpbmcgYWxpZ25maWxlOwotCXN0cmluZyBtb2RlbE5hbWU7Ci0JaW50IGl0OwotCWJvb2wgZHVtcF9maWxlczsKLQljaGFyIHRvTW9kZWwsIGZyb21Nb2RlbDsKLQlwdGhyZWFkX3QgdGhyZWFkOwotCWQ0bW9kZWwqIGQ0OwotCWQ1bW9kZWwqIGQ1OwotCWJvb2wgZmluYWw7Ci0JbTNfZW1fbG9vcF90KCkgOgotCQltKDApLCBkb25lKDApLCB2YWxpZCgwKSxkNCgwKSxkNSgwKSB7Ci0JfQotCTsKLX07Ci0KLXZvaWQqIG0zX2V4ZV9lbWxvb3Aodm9pZCAqYXJnKSB7Ci0JbTNfZW1fbG9vcF90KiBlbSA9KG0zX2VtX2xvb3BfdCAqKSBhcmc7Ci0JZW0tPm0tPnZpdGVyYmlfdGhyZWFkKGVtLT5pdCwgZW0tPmFsaWduZmlsZSwgZW0tPmR1bXBfZmlsZXMsICooZW0tPmQ0KSwqKGVtLT5kNSksZW0tPmZpbmFsLGVtLT5mcm9tTW9kZWwsZW0tPnRvTW9kZWwsZW0tPm1vZGVsTmFtZSk7Ci0JZW0tPmRvbmUgPSAtMTsKLQlyZXR1cm4gYXJnOwotfQotCi12b2lkIG1vZGVsMzo6dml0ZXJiaV90aHJlYWQoaW50IGl0LCBzdHJpbmcgYWxpZ25maWxlLCBib29sIGR1bXBfZmlsZXMsZDRtb2RlbCYgZDRtLGQ1bW9kZWwmIGQ1bSxib29sIGZpbmFsLGNoYXIgZnJvbU1vZGVsLGNoYXIgdG9Nb2RlbCxzdHJpbmcmIG1vZGVsTmFtZSkgewotI2RlZmluZSBUUkFJTl9BUkdTIHBlcnAsICAgICAgdHJhaW5WaXRlcmJpUGVycCwgc0hhbmRsZXIxLCAgICBkdW1wX2ZpbGVzLCBhbGlnbmZpbGUuY19zdHIoKSwgICAgIHRydWUsICBtb2RlbE5hbWUsZmluYWwKLQlzd2l0Y2ggKHRvTW9kZWwpIHsKLQljYXNlICczJzp7Ci0JCXN3aXRjaCAoZnJvbU1vZGVsKSB7Ci0JCWNhc2UgJ0gnOgotCQkJdml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPHRyYW5zcGFpcl9tb2RlbGhtbSwgY29uc3QgaG1tPihUUkFJTl9BUkdTLGgsKHZvaWQqKTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgJzMnOgotCQkJdml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPHRyYW5zcGFpcl9tb2RlbDM+KCBUUkFJTl9BUkdTLCAodm9pZCopMCwodm9pZCopMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWFib3J0KCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgJzQnOiB7Ci0JCXN3aXRjaCAoZnJvbU1vZGVsKSB7Ci0JCWNhc2UgJ0gnOgotCQkJdml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPHRyYW5zcGFpcl9tb2RlbGhtbSwgY29uc3QgaG1tLCBkNG1vZGVsPihUUkFJTl9BUkdTLGgsJmQ0bSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnMyc6Ci0JCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsMywgdm9pZCwgZDRtb2RlbD4oVFJBSU5fQVJHUywgKHZvaWQqKTAsJmQ0bSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnNCc6Ci0JCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsNCwgZDRtb2RlbCwgZDRtb2RlbD4oVFJBSU5fQVJHUyAsICZkNG0sJmQ0bSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWFib3J0KCk7Ci0JCX0KLQl9Ci0JCWJyZWFrOwotCWNhc2UgJzUnOiB7Ci0JCXN3aXRjaCAoZnJvbU1vZGVsKSB7Ci0JCWNhc2UgJ0gnOgotCQkJdml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPHRyYW5zcGFpcl9tb2RlbGhtbSwgY29uc3QgaG1tLCBkNW1vZGVsPihUUkFJTl9BUkdTLGgsJmQ1bSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnMyc6Ci0JCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsMywgdm9pZCwgZDVtb2RlbD4oVFJBSU5fQVJHUywgKHZvaWQqKTAsJmQ1bSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnNCc6Ci0JCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsNCwgZDRtb2RlbCwgZDVtb2RlbD4oVFJBSU5fQVJHUywgJmQ0bSwmZDVtKTsKLQkJCWJyZWFrOwotCQljYXNlICc1JzoKLQkJCXZpdGVyYmlfbG9vcF93aXRoX3RyaWNrczx0cmFuc3BhaXJfbW9kZWw1LCBkNW1vZGVsLCBkNW1vZGVsPihUUkFJTl9BUkdTLCAmZDVtLCZkNW0pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlhYm9ydCgpOwotCQl9Ci0JfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlhYm9ydCgpOwotCX0KLQotfQotZXh0ZXJuIHNob3J0IE5DUFVTOwotCi1pbnQgbW9kZWwzOjp2aXRlcmJpKGludCBub0l0ZXJhdGlvbnNNb2RlbDMsIGludCBub0l0ZXJhdGlvbnNNb2RlbDQsCi0JCWludCBub0l0ZXJhdGlvbnNNb2RlbDUsIGludCBub0l0ZXJhdGlvbnNNb2RlbDYsIGNvbnN0IGNoYXIqIHByZXZfZDQsY29uc3QgY2hhciogcHJldl9kNF8yLGJvb2wgZHVtcENvdW50LCAKLSAgICBjb25zdCBjaGFyKiBkdW1wQ291bnROYW1lLCBib29sIHVzZVN0cmluZykgewotCWRvdWJsZSBtaW5FcnJvcnM9MS4wOwotCWludCBtaW5JdGVyPTA7Ci0JaWYoZXdvcmRjbGFzc2VzPT1OVUxMKQotCQlld29yZGNsYXNzZXMgPSBuZXcgV29yZENsYXNzZXM7Ci0JaWYoZndvcmRjbGFzc2VzPT1OVUxMKQotCQlmd29yZGNsYXNzZXMgPSBuZXcgV29yZENsYXNzZXM7CQkKLQlkNG1vZGVsIGQ0bShNQVhfU0VOVEVOQ0VfTEVOR1RILCpld29yZGNsYXNzZXMsKmZ3b3JkY2xhc3Nlcyk7Ci0JaWYocHJldl9kNCl7Ci0JCXN0cmluZyBwcmV2aW91c19kNG1vZGVsID0gcHJldl9kNDsKLQotICAgICAgICBzdHJpbmcgcHJldmlvdXNfZDRtb2RlbF8xID0gIHByZXZfZDRfMjsJCQotCQljZXJyIDw8ICJXZSBhcmUgZ29pbmcgdG8gcmVhZCBkNCB0YWJsZSBmcm9tICIgPDwgcHJldmlvdXNfZDRtb2RlbCA8PCAiLCIgPDwgcHJldmlvdXNfZDRtb2RlbF8xICA8PCBlbmRsOwotCQlkNG0ucmVhZFByb2JUYWJsZShwcmV2aW91c19kNG1vZGVsLmNfc3RyKCkscHJldmlvdXNfZDRtb2RlbF8xLmNfc3RyKCkpOwotCX0KLQlpZihoPT1OVUxMKQotCWQ0bS5tYWtlV29yZENsYXNzZXMoRWxpc3QsIEZsaXN0LCBTb3VyY2VWb2NhYkNsYXNzZXNGaWxlbmFtZSwKLQkJCVRhcmdldFZvY2FiQ2xhc3Nlc0ZpbGVuYW1lLEVsaXN0LEZsaXN0KTsKLQkKLQlkNW1vZGVsIGQ1bShkNG0pOwotCS8vZDVtLm1ha2VXb3JkQ2xhc3NlcyhFbGlzdCwgRmxpc3QsIFNvdXJjZVZvY2FiRmlsZW5hbWUrIi5jbGFzc2VzIiwKLQkvLwkJVGFyZ2V0Vm9jYWJGaWxlbmFtZSsiLmNsYXNzZXMiKTsKLQl0aW1lX3QgaXRfc3QsIHN0LCBpdF9mbiwgZm47Ci0JYm9vbCBkdW1wX2ZpbGVzID0gZmFsc2U7Ci0Jc3RyaW5nIHRmaWxlLCB0ZmlsZV9hY3R1YWwsIGRmaWxlLCBhZmlsZSwgbmZpbGUsIG5maWxlX2FjdHVhbCwgcDBmaWxlLAotCQkJYWxpZ25maWxlLCBudW1iZXIsIHRlc3RfYWxpZ25maWxlLCBkNGZpbGUsIGQ1ZmlsZSwgemVyb0ZlcnRGaWxlOwotCXN0ID0gdGltZShOVUxMKTsKLQlzSGFuZGxlcjEucmV3aW5kKCk7Ci0JaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotCQkoKnRlc3RIYW5kbGVyKS5yZXdpbmQoKTsKLQlzdHJpbmcgdHJhaW5pbmdTdHJpbmc7Ci0JCi0JdHJhaW5pbmdTdHJpbmcrPShwcmV2X2Q0ID8gJzQnIDogKGggPyAnSCcgOiAnMycpKTsKLQlmb3IgKGludCBpPTA7IGk8bm9JdGVyYXRpb25zTW9kZWwzOyArK2kpCi0JCXRyYWluaW5nU3RyaW5nKz0nMyc7Ci0JZm9yIChpbnQgaT0wOyBpPG5vSXRlcmF0aW9uc01vZGVsNDsgKytpKQotCQl0cmFpbmluZ1N0cmluZys9JzQnOwotCWZvciAoaW50IGk9MDsgaTxub0l0ZXJhdGlvbnNNb2RlbDU7ICsraSkKLQkJdHJhaW5pbmdTdHJpbmcrPSc1JzsKLQlmb3IgKGludCBpPTA7IGk8bm9JdGVyYXRpb25zTW9kZWw2OyArK2kpCi0JCXRyYWluaW5nU3RyaW5nKz0nNic7Ci0JY291dCA8PCAiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwotCWNvdXQgPDwgIlN0YXJ0aW5nICI8PHRyYWluaW5nU3RyaW5nPDwiOiAgVml0ZXJiaSBUcmFpbmluZyI7Ci0JY291dCA8PCAiXG4gIjw8dHJhaW5pbmdTdHJpbmc8PCIgVHJhaW5pbmcgU3RhcnRlZCBhdDogIjw8IG15X2N0aW1lKCZzdCkKLQkJCTw8ICdcbic7Ci0JCi0JCi0gICAgdmVjdG9yPG0zX2VtX2xvb3BfdD4gdGg7Ci0gICAgdGgucmVzaXplKE5DUFVTKTsKLSAgICAKLSAgICBpbnQgazsKLSAgICAKLSAgICBmb3IoayA9IDE7IGs8IE5DUFVTOyBrKyspewotICAgIAl0aFtrXS5tID0gdGhpczsKLSAgICAJdGhba10uZDQgPSAmZDRtOwotICAgIAl0aFtrXS5kNSA9ICZkNW07Ci0gICAgfQotICAgIAotCWZvciAodW5zaWduZWQgaW50IGl0PTE7IGl0IDwgdHJhaW5pbmdTdHJpbmcubGVuZ3RoKCk7IGl0KyspIHsKLQkJYm9vbCBmaW5hbD0wOwotCQlpZiAoaXQ9PXRyYWluaW5nU3RyaW5nLmxlbmd0aCgpLTEpCi0JCQlmaW5hbD0xOwotCQlzdHJpbmcgbW9kZWxOYW1lOwotCQljaGFyIGZyb21Nb2RlbD10cmFpbmluZ1N0cmluZ1tpdC0xXSwgdG9Nb2RlbD10cmFpbmluZ1N0cmluZ1tpdF07Ci0JCWlmIChmcm9tTW9kZWw9PXRvTW9kZWwpCi0JCQltb2RlbE5hbWU9c3RyaW5nKCJNb2RlbCIpK2Zyb21Nb2RlbDsKLQkJZWxzZQotCQkJbW9kZWxOYW1lPXN0cmluZygiVCIpK2Zyb21Nb2RlbCsiVG8iK3RvTW9kZWw7Ci0JCWl0X3N0ID0gdGltZShOVUxMKTsKLQkJY291dCA8PCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjw8bW9kZWxOYW1lPDwiOiBJdGVyYXRpb24gIiA8PCBpdAotCQkJCTw8J1xuJzsKLQkJZHVtcF9maWxlcyA9IChmaW5hbCB8fCAoKE1vZGVsM19EdW1wX0ZyZXEgIT0gMCkgJiYgKChpdAotCQkJCSUgTW9kZWwzX0R1bXBfRnJlcSkgPT0gMCkpKSAmJiAhTk9EVU1QUzsKLQkJc3RyaW5nIGQ0ZmlsZTI7Ci0JCXsKLQkJCS8vIHNldCB1cCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHdoZXJlIHRoZSB0YWJsZXMgd2lsbCBiZSBwcmludGVkIAotCQkJaW50IG4gPSBpdDsKLQkJCW51bWJlciA9ICIiOwotCQkJZG8gewotCQkJCS8vbWogY2hhbmdlZCBuZXh0IGxpbmUKLQkJCQludW1iZXIuaW5zZXJ0KChzaXplX3QpIDAsIDEsIChjaGFyKShuICUgMTAgKyAnMCcpKTsKLQkJCX0gd2hpbGUgKChuIC89IDEwKSA+IDApOwotCQkJaWYgKGZpbmFsKQotCQkJCW51bWJlcj0iZmluYWwiOwotCQkJdGZpbGUgPSBQcmVmaXggKyAiLnQzLiIgKyBudW1iZXI7Ci0JCQl0ZmlsZV9hY3R1YWwgPSBQcmVmaXggKyAiLmFjdHVhbC50My4iICsgbnVtYmVyOwotCQkJYWZpbGUgPSBQcmVmaXggKyAiLmEzLiIgKyBudW1iZXI7Ci0JCQluZmlsZSA9IFByZWZpeCArICIubjMuIiArIG51bWJlcjsKLQkJCW5maWxlX2FjdHVhbCA9IFByZWZpeCArICIuYWN0dWFsLm4zLiIgKyBudW1iZXI7Ci0JCQlkZmlsZSA9IFByZWZpeCArICIuZDMuIiArIG51bWJlcjsKLQkJCWQ0ZmlsZSA9IFByZWZpeCArICIuZDQuIiArIG51bWJlcjsKLQkJCWQ0ZmlsZTIgPSBQcmVmaXggKyAiLkQ0LiIgKyBudW1iZXI7Ci0JCQlkNWZpbGUgPSBQcmVmaXggKyAiLmQ1LiIgKyBudW1iZXI7Ci0JCQlhbGlnbmZpbGUgPSBQcmVmaXggKyAiLkEzLiIgKyBudW1iZXI7Ci0JCQl0ZXN0X2FsaWduZmlsZSA9IFByZWZpeCArICIudHN0LkEzLiIgKyBudW1iZXI7Ci0JCQlwMGZpbGUgPSBQcmVmaXggKyAiLnAwXzMuIiArIG51bWJlcjsKLQkJfQotCQkvLyBjbGVhciBjb3VudCB0YWJsZXMgCi0JCS8vICAgIHRDb3VudFRhYmxlLmNsZWFyKCk7Ci0JCWRDb3VudFRhYmxlLmNsZWFyKCk7Ci0JCWFDb3VudFRhYmxlLmNsZWFyKCk7Ci0JCWluaXRBTCgpOwotCQluQ291bnRUYWJsZS5jbGVhcigpOwotCQlkNG0uY2xlYXIoKTsKLQkJcDBfY291bnQgPSBwMV9jb3VudCA9IDA7Ci0JCS8vZHVtcF9maWxlcz10cnVlOwotCQkgCi0JCXNIYW5kbGVyMS5yZXdpbmQoKTsKLQkJaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotCQkJKCp0ZXN0SGFuZGxlcikucmV3aW5kKCk7Ci0JCQotICAgICAgICBjaGFyIG5vZGVbMl0gOwotICAgICAgICBub2RlWzFdID0gJ1wwJzsKLSAgICAgICAgZm9yIChrPTEgOyBrPCBOQ1BVUyA7IGsrKyl7Ci0gICAgICAgIAl0aFtrXS5tID0gdGhpczsKLSAgICAgICAgCXRoW2tdLmRvbmUgPSAwOwotICAgICAgICAJdGhba10udmFsaWQgPSAwOwotICAgICAgICAJdGhba10uaXQgPSBpdDsKLSAgICAgICAgCXRoW2tdLmZpbmFsID0gZmluYWw7Ci0gICAgICAgIAl0aFtrXS5hbGlnbmZpbGUgPSBhbGlnbmZpbGUgKyAiLnBhcnQiOwotICAgICAgICAJbm9kZVswXSA9ICcwJyArIGs7Ci0gICAgICAgIAl0aFtrXS5hbGlnbmZpbGUgKz0gbm9kZTsKLSAgICAgICAgCXRoW2tdLmR1bXBfZmlsZXMgPSBkdW1wX2ZpbGVzOwotICAgICAgICAJdGhba10uZnJvbU1vZGVsID0gZnJvbU1vZGVsOwotICAgICAgICAJdGhba10udG9Nb2RlbCA9IHRvTW9kZWw7Ci0gICAgICAgIAl0aFtrXS5tb2RlbE5hbWUgPSBtb2RlbE5hbWU7Ci0gICAgICAgICAgICB0aFtrXS52YWxpZCA9IHB0aHJlYWRfY3JlYXRlKCYodGhba10udGhyZWFkKSxOVUxMLG0zX2V4ZV9lbWxvb3AsJih0aFtrXSkpOwotICAgICAgICAgICAgaWYodGhba10udmFsaWQpewotICAgICAgICAgICAgICAgIGNlcnIgPDwgIkVycm9yIHN0YXJ0aW5nIHRocmVhZCAiIDw8IGsgPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub2RlWzBdID0gJzAnOwotICAgICAgICBhbGlnbmZpbGUgPSBhbGlnbmZpbGUgKyAiLnBhcnQiOwotICAgICAgICBhbGlnbmZpbGUgKz0gbm9kZTsKLQkJCi0jaWZkZWYgVFJJQ0tZX0lCTTNfVFJBSU5JTkcKLQotI2RlZmluZSBUUkFJTl9BUkdTIHBlcnAsICAgICAgdHJhaW5WaXRlcmJpUGVycCwgc0hhbmRsZXIxLCAgICBkdW1wX2ZpbGVzLCBhbGlnbmZpbGUuY19zdHIoKSwgICAgIHRydWUsICBtb2RlbE5hbWUsZmluYWwKLSNkZWZpbmUgVEVTVF9BUkdTICAqdGVzdFBlcnAsICp0ZXN0Vml0ZXJiaVBlcnAsICp0ZXN0SGFuZGxlciwgZHVtcF9maWxlcywgdGVzdF9hbGlnbmZpbGUuY19zdHIoKSxmYWxzZSwgbW9kZWxOYW1lLGZpbmFsCi0JCXN3aXRjaCAodG9Nb2RlbCkgewotCQljYXNlICczJzoKLQkJCXN3aXRjaCAoZnJvbU1vZGVsKSB7Ci0JCQljYXNlICdIJzoKLQkJCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsaG1tLCBjb25zdCBobW0+KFRSQUlOX0FSR1MsaCwodm9pZCopMCk7Ci0JCQkJaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotCQkJCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsaG1tLCBjb25zdCBobW0+KFRFU1RfQVJHUywgaCwodm9pZCopMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICczJzoKLQkJCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsMz4oIFRSQUlOX0FSR1MsICh2b2lkKikwLCh2b2lkKikwKTsKLQkJCQlpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpCi0JCQkJCXZpdGVyYmlfbG9vcF93aXRoX3RyaWNrczx0cmFuc3BhaXJfbW9kZWwzPiggVEVTVF9BUkdTLCAodm9pZCopMCwodm9pZCopMCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWFib3J0KCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnNCc6IHsKLQkJCXN3aXRjaCAoZnJvbU1vZGVsKSB7Ci0JCQljYXNlICdIJzoKLQkJCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsaG1tLCBjb25zdCBobW0sIGQ0bW9kZWw+KFRSQUlOX0FSR1MsaCwmZDRtKTsKLQkJCQlpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpCi0JCQkJCXZpdGVyYmlfbG9vcF93aXRoX3RyaWNrczx0cmFuc3BhaXJfbW9kZWxobW0sIGNvbnN0IGhtbSwKLQkJCQkJCQlkNG1vZGVsPihURVNUX0FSR1MsIGgsJmQ0bSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICczJzoKLQkJCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsMywgdm9pZCwgZDRtb2RlbD4oVFJBSU5fQVJHUywgKHZvaWQqKTAsJmQ0bSk7Ci0JCQkJaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotCQkJCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsMywgdm9pZCwgZDRtb2RlbD4oIFRFU1RfQVJHUyAsICh2b2lkKikwLCZkNG0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnNCc6Ci0JCQkJdml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPHRyYW5zcGFpcl9tb2RlbDQsIGQ0bW9kZWwsIGQ0bW9kZWw+KFRSQUlOX0FSR1MgLCAmZDRtLCZkNG0pOwotCQkJCWlmICh0ZXN0UGVycCAmJiB0ZXN0SGFuZGxlcikKLQkJCQkJdml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPHRyYW5zcGFpcl9tb2RlbDQsIGQ0bW9kZWwsIGQ0bW9kZWw+KCBURVNUX0FSR1MsICZkNG0sJmQ0bSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWFib3J0KCk7Ci0JCQl9Ci0JCQlpZihkdW1wQ291bnQgJiYgaXQgPT0gdHJhaW5pbmdTdHJpbmcubGVuZ3RoKCktMSl7Ci0JCQkJc3RyaW5nIHJlYWxENFRhYmxlTmFtZSA9IGR1bXBDb3VudE5hbWU7Ci0JCQkJcmVhbEQ0VGFibGVOYW1lICs9ICIuZDQuY291bnQiOwotCQkJCXN0cmluZyByZWFsRDRiVGFibGVOYW1lID0gcmVhbEQ0VGFibGVOYW1lKyIuYiI7Ci0JCQkJaWYoIWQ0bS5kdW1wQ291bnQocmVhbEQ0VGFibGVOYW1lLmNfc3RyKCkscmVhbEQ0YlRhYmxlTmFtZS5jX3N0cigpKSkgCi0JCQkJCWNlcnIgPDwiRXJyb3Igd3JpdGluZyBjb3VudCBmaWxlIHRvIiA8PCByZWFsRDRUYWJsZU5hbWUgPDwgZW5kbDsKLQkJCX0JCQkKLQkJCWQ0bS5ub3JtYWxpemVUYWJsZSgpOwotCQkJaWYgKGR1bXBfZmlsZXMpCi0JCQkJZDRtLnByaW50UHJvYlRhYmxlKGQ0ZmlsZS5jX3N0cigpLCBkNGZpbGUyLmNfc3RyKCkpOwotCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnNSc6IHsKLQkJCXN3aXRjaCAoZnJvbU1vZGVsKSB7Ci0JCQljYXNlICdIJzoKLQkJCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsaG1tLCBjb25zdCBobW0sIGQ1bW9kZWw+KFRSQUlOX0FSR1MsaCwmZDVtKTsKLQkJCQlpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpCi0JCQkJCXZpdGVyYmlfbG9vcF93aXRoX3RyaWNrczx0cmFuc3BhaXJfbW9kZWxobW0sIGNvbnN0IGhtbSwKLQkJCQkJCQlkNW1vZGVsPihURVNUX0FSR1MsIGgsJmQ1bSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICczJzoKLQkJCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsMywgdm9pZCwgZDVtb2RlbD4oVFJBSU5fQVJHUywgKHZvaWQqKTAsJmQ1bSk7Ci0JCQkJaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotCQkJCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsMywgdm9pZCwgZDVtb2RlbD4oIFRFU1RfQVJHUyAsICh2b2lkKikwLCZkNW0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnNCc6Ci0JCQkJdml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPHRyYW5zcGFpcl9tb2RlbDQsIGQ0bW9kZWwsIGQ1bW9kZWw+KFRSQUlOX0FSR1MsICZkNG0sJmQ1bSk7Ci0JCQkJaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotCQkJCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsNCwgZDRtb2RlbCwgZDVtb2RlbD4oIFRFU1RfQVJHUywgJmQ0bSwmZDVtKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJzUnOgotCQkJCXZpdGVyYmlfbG9vcF93aXRoX3RyaWNrczx0cmFuc3BhaXJfbW9kZWw1LCBkNW1vZGVsLCBkNW1vZGVsPihUUkFJTl9BUkdTLCAmZDVtLCZkNW0pOwotCQkJCWlmICh0ZXN0UGVycCAmJiB0ZXN0SGFuZGxlcikKLQkJCQkJdml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPHRyYW5zcGFpcl9tb2RlbDUsIGQ1bW9kZWwsIGQ1bW9kZWw+KCBURVNUX0FSR1MsICZkNW0sJmQ1bSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWFib3J0KCk7Ci0JCQl9Ci0JCQlpZihkdW1wQ291bnQgJiYgaXQgPT0gdHJhaW5pbmdTdHJpbmcubGVuZ3RoKCktMSl7Ci0JCQkJc3RyaW5nIHJlYWxENFRhYmxlTmFtZSA9IGR1bXBDb3VudE5hbWU7Ci0JCQkJcmVhbEQ0VGFibGVOYW1lICs9ICIuZDQiOwotCQkJCXN0cmluZyByZWFsRDRiVGFibGVOYW1lID0gcmVhbEQ0VGFibGVOYW1lKyIuYiI7Ci0JCQkJaWYoIWQ1bS5kNG0uZHVtcENvdW50KHJlYWxENFRhYmxlTmFtZS5jX3N0cigpLHJlYWxENGJUYWJsZU5hbWUuY19zdHIoKSkpIAotCQkJCQljZXJyIDw8IkVycm9yIHdyaXRpbmcgY291bnQgZmlsZSB0byIgPDwgcmVhbEQ0VGFibGVOYW1lIDw8IGVuZGw7Ci0JCQl9Ci0JCQlkNW0uZDRtLm5vcm1hbGl6ZVRhYmxlKCk7Ci0JCQlpZiAoZHVtcF9maWxlcykKLQkJCQlkNW0uZDRtLnByaW50UHJvYlRhYmxlKGQ0ZmlsZS5jX3N0cigpLCBkNGZpbGUyLmNfc3RyKCkpOwotCQkJZDVtLm5vcm1hbGl6ZVRhYmxlKCk7Ci0JCQlpZiAoZHVtcF9maWxlcykgewotCQkJCW9mc3RyZWFtIGQ1b3V0cHV0KGQ1ZmlsZS5jX3N0cigpKTsKLQkJCQlkNW91dHB1dCA8PCBkNW07Ci0JCQl9Ci0JCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYWJvcnQoKTsKLQkJfQotCi0jZWxzZQotCQl2aXRlcmJpX2xvb3AocGVycCwgdHJhaW5WaXRlcmJpUGVycCwgc0hhbmRsZXIxLCBkdW1wX2ZpbGVzLAotCQkJCWFsaWduZmlsZS5jX3N0cigpLCB0cnVlLCBtb2RlbCk7Ci0JCWlmICh0ZXN0UGVycCAmJiB0ZXN0SGFuZGxlcikKLQkJdml0ZXJiaV9sb29wKCp0ZXN0UGVycCwgKnRlc3RWaXRlcmJpUGVycCwgKnRlc3RIYW5kbGVyLAotCQkJCWR1bXBfZmlsZXMsIHRlc3RfYWxpZ25maWxlLmNfc3RyKCksIGZhbHNlLCBtb2RlbCk7Ci0jZW5kaWYJCi0JICAgICAgICBmb3IgKGs9MTtrPE5DUFVTO2srKyl7Ci0JCQlwdGhyZWFkX2pvaW4oKHRoW2tdLnRocmVhZCksTlVMTCk7Ci0JCQljZXJyIDw8ICJUaHJlYWQgIiA8PCBrIDw8ICJkb25lIiA8PCBlbmRsOwotCQl9Ci0JCWlmIChlcnJvcnNBTCgpPG1pbkVycm9ycykgewotCQkJbWluRXJyb3JzPWVycm9yc0FMKCk7Ci0JCQltaW5JdGVyPWl0OwotCQl9Ci0JCS8vIG5vdyBub3JtYWxpemUgY291bnQgdGFibGVzIAotLy8JCWR1bXBfZmlsZXMgPSB0cnVlOwotCQlpZiAoZHVtcF9maWxlcyYmT3V0cHV0SW5BYWNoZW5Gb3JtYXQ9PTEpCi0JCQl0VGFibGUucHJpbnRDb3VudFRhYmxlKHRmaWxlLmNfc3RyKCksIEVsaXN0LmdldFZvY2FiTGlzdCgpLAotCQkJCQlGbGlzdC5nZXRWb2NhYkxpc3QoKSwgMSk7Ci0gICAgICAgICAgICAgICAgcGVycC5yZWNvcmQobW9kZWxOYW1lKTsKLQkJZXJyb3JSZXBvcnRBTChjZXJyLCBtb2RlbE5hbWUpOwotCQl0cmFpblZpdGVyYmlQZXJwLnJlY29yZChtb2RlbE5hbWUpOwotCi0JCWlmKGR1bXBDb3VudCAmJiBpdCA9PSB0cmFpbmluZ1N0cmluZy5sZW5ndGgoKS0xKXsKLQkJCXN0cmluZyByZWFsVGFibGVOYW1lID0gZHVtcENvdW50TmFtZTsKLQkJCXJlYWxUYWJsZU5hbWUgKz0gIi50LmNvdW50IjsKLQkJCXRUYWJsZS5wcmludENvdW50VGFibGUocmVhbFRhYmxlTmFtZS5jX3N0cigpLEVsaXN0LmdldFZvY2FiTGlzdCgpLEZsaXN0LmdldFZvY2FiTGlzdCgpLHVzZVN0cmluZyk7Ci0JCQlzdHJpbmcgcmVhbEFUYWJsZU5hbWUgPSBkdW1wQ291bnROYW1lOwotCQkJcmVhbEFUYWJsZU5hbWUgKz0gIi5hLmNvdW50IjsKLQkJCWFDb3VudFRhYmxlLnByaW50UmVhbFRhYmxlKHJlYWxBVGFibGVOYW1lLmNfc3RyKCkpOwotCQkJc3RyaW5nIHJlYWxEVGFibGVOYW1lID0gZHVtcENvdW50TmFtZTsKLQkJCXJlYWxEVGFibGVOYW1lICs9ICIuZC5jb3VudCI7Ci0JCQlkQ291bnRUYWJsZS5wcmludFJlYWxUYWJsZShyZWFsRFRhYmxlTmFtZS5jX3N0cigpKTsKLQkJCXN0cmluZyByZWFsTlRhYmxlTmFtZSA9IGR1bXBDb3VudE5hbWU7Ci0JCQlyZWFsTlRhYmxlTmFtZSArPSAiLm4uY291bnQiOwotCQkJbkNvdW50VGFibGUucHJpbnRSZWFsTlRhYmxlKEVsaXN0LnVuaXFUb2tlbnMoKSxyZWFsTlRhYmxlTmFtZS5jX3N0cigpLEVsaXN0LmdldFZvY2FiTGlzdCgpLHVzZVN0cmluZyk7Ci0JCX0KLQkJCi0JCXRUYWJsZS5ub3JtYWxpemVUYWJsZShFbGlzdCwgRmxpc3QpOwotCQlhQ291bnRUYWJsZS5ub3JtYWxpemUoYVRhYmxlKTsKLQkJZENvdW50VGFibGUubm9ybWFsaXplKGRUYWJsZSk7Ci0JCW5Db3VudFRhYmxlLm5vcm1hbGl6ZShuVGFibGUsICZFbGlzdC5nZXRWb2NhYkxpc3QoKSk7Ci0JCXNIYW5kbGVyMS5yZXdpbmQoKTsKLQkJLy90ZXN0SGFuZGxlci0+cmV3aW5kKCk7Ci0JCS8vICAgIGNvdXQgPDwgInRUYWJsZSBjb250YWlucyAiIDw8IAotCQkvLyAgICAgIHRUYWJsZS5nZXRIYXNoKCkuYnVja2V0X2NvdW50KCkgPDwgIiBidWNrZXRzIGFuZCAiPDwKLQkJLy90VGFibGUuZ2V0SGFzaCgpLnNpemUoKSA8PCAiIGVudHJpZXMuXG4iOwotCi0JCS8vIG5vcm1hbGl6ZSBwMSAmIHAwIAotCi0JCWNvdXQgPDwgInAwX2NvdW50IGlzICIgPDwgcDBfY291bnQgPDwgIiBhbmQgcDEgaXMgIiA8PCBwMV9jb3VudCA8PCAiOyAiOwotCQlpZiAoUDAhPS0xLjApIHsKLQkJCXAwID0gUDA7Ci0JCQlwMSA9IDEtUDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocDFfY291bnQgKyBwMF9jb3VudCAhPSAwKSB7Ci0JCQkJcDEgPSBwMV9jb3VudCAvIChwMV9jb3VudCArIHAwX2NvdW50ICk7Ci0JCQkJcDAgPSAxIC0gcDE7Ci0JCQl9IGVsc2UgewotCQkJCXAxID0gcDAgPSAwOwotCQkJCWNlcnIgPDwgIkVSUk9SOiBwMF9jb3VudCtwMV9jb3VudCBpcyB6ZXJvISEhXG4iOwotCQkJfQotCQl9Ci0KLQkJY291dCA8PCAicDAgaXMgIiA8PCBwMCA8PCAiIHAxOiAiIDw8IHAxIDw8ICdcbic7Ci0KLQkJY291dCA8PCBtb2RlbE5hbWU8PCI6IFRSQUlOIENST1NTLUVOVFJPUFkgIiA8PCBwZXJwLmNyb3NzX2VudHJvcHkoKQotCQkJCTw8ICIgUEVSUExFWElUWSAiIDw8IHBlcnAucGVycGxleGl0eSgpIDw8ICdcbic7Ci0JCWlmICh0ZXN0UGVycCAmJiB0ZXN0SGFuZGxlcikKLQkJCWNvdXQgPDwgbW9kZWxOYW1lIDw8ICI6KCI8PGl0PDwiIFRFU1QgQ1JPU1MtRU5UUk9QWSAiIDw8ICgqdGVzdFBlcnApLmNyb3NzX2VudHJvcHkoKSA8PCAiIFBFUlBMRVhJVFkgIiA8PCAoKnRlc3RQZXJwKS5wZXJwbGV4aXR5KCkgPDwgIiBzdW06ICIgPDwgKCp0ZXN0UGVycCkuZ2V0U3VtKCk8PCAiIHdjOiAiIDw8ICgqdGVzdFBlcnApLndvcmRfY291bnQoKSA8PCAnXG4nOwotCQljb3V0IDw8IG1vZGVsTmFtZSA8PCAiOiAoIjw8aXQ8PCIpIFRSQUlOIFZJVEVSQkkgQ1JPU1MtRU5UUk9QWSAiCi0JCQkJPDwgdHJhaW5WaXRlcmJpUGVycC5jcm9zc19lbnRyb3B5KCkgPDwgIiBQRVJQTEVYSVRZICIKLQkJCQk8PCB0cmFpblZpdGVyYmlQZXJwLnBlcnBsZXhpdHkoKSA8PCAnXG4nOwotCQlpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpCi0JCQljb3V0IDw8IG1vZGVsTmFtZSA8PCAiOiAgKCI8PGl0PDwiKVRFU1QgVklURVJCSSBDUk9TUy1FTlRST1BZICIKLQkJCQkJPDwgKCp0ZXN0Vml0ZXJiaVBlcnApLmNyb3NzX2VudHJvcHkoKSA8PCAiIFBFUlBMRVhJVFkgIgotCQkJCQk8PCAoKnRlc3RWaXRlcmJpUGVycCkucGVycGxleGl0eSgpIDw8ICIgU3VtOiAiIDw8ICgqdGVzdFZpdGVyYmlQZXJwKS5nZXRTdW0oKSA8PCAiIHdjOiAiIDw8ICgqdGVzdFZpdGVyYmlQZXJwKS53b3JkX2NvdW50KCkgPDwgJ1xuJzsKLQkJLy9kdW1wX2ZpbGVzID0gdHJ1ZTsKLQkJaWYgKGR1bXBfZmlsZXMpIHsKLQkJCWlmIChPdXRwdXRJbkFhY2hlbkZvcm1hdD09MCkKLQkJCQl0VGFibGUucHJpbnRQcm9iVGFibGUodGZpbGUuY19zdHIoKSwgRWxpc3QuZ2V0Vm9jYWJMaXN0KCksCi0JCQkJCQlGbGlzdC5nZXRWb2NhYkxpc3QoKSwgT3V0cHV0SW5BYWNoZW5Gb3JtYXQpOwotCQkJYVRhYmxlLnByaW50VGFibGUoYWZpbGUuY19zdHIoKSk7Ci0JCQlkVGFibGUucHJpbnRUYWJsZShkZmlsZS5jX3N0cigpKTsKLQkJCW5UYWJsZS5wcmludE5UYWJsZShFbGlzdC51bmlxVG9rZW5zKCksIG5maWxlLmNfc3RyKCksCi0JCQkJCUVsaXN0LmdldFZvY2FiTGlzdCgpLCBPdXRwdXRJbkFhY2hlbkZvcm1hdCk7Ci0JCQlvZnN0cmVhbSBvZihwMGZpbGUuY19zdHIoKSk7Ci0JCQlvZiA8PCBwMDsKLQkJCW9mLmNsb3NlKCk7Ci0JCX0KLQkJaXRfZm4gPSB0aW1lKE5VTEwpIDsKLQkJY291dCA8PCAiXG4iIDw8IG1vZGVsTmFtZSA8PCAiIFZpdGVyYmkgSXRlcmF0aW9uIDogIjw8aXQ8PCAiIHRvb2s6ICIKLQkJCQk8PCBkaWZmdGltZShpdF9mbiwgaXRfc3QpIDw8ICIgc2Vjb25kc1xuIjsKLQl9IC8qIG9mIGl0ZXJhdGlvbnMgKi8KLQlmbiA9IHRpbWUoTlVMTCk7Ci0JY291dCA8PCB0cmFpbmluZ1N0cmluZyA8PCIgVHJhaW5pbmcgRmluaXNoZWQgYXQ6ICIgPDwgbXlfY3RpbWUoJmZuKSA8PCAiXG4iOwotCWNvdXQgPDwgIlxuIiA8PCAiRW50aXJlIFZpdGVyYmkgIjw8dHJhaW5pbmdTdHJpbmc8PCIgVHJhaW5pbmcgdG9vazogIgotCQkJPDwgZGlmZnRpbWUoZm4sIHN0KSA8PCAiIHNlY29uZHNcbiI7Ci0JY291dCA8PCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKLQlpZiAobm9JdGVyYXRpb25zTW9kZWw0fHxub0l0ZXJhdGlvbnNNb2RlbDUpCi0JCW1pbkl0ZXItPW5vSXRlcmF0aW9uc01vZGVsMzsKLQlpZiAobm9JdGVyYXRpb25zTW9kZWw1KQotCQltaW5JdGVyLT1ub0l0ZXJhdGlvbnNNb2RlbDQ7Ci0JcmV0dXJuIG1pbkl0ZXI7Ci19Ci0KLWludCBtb2RlbDM6OnZpdGVyYmlfaHRvMygpIHsKLQotCWRvdWJsZSBtaW5FcnJvcnM9MS4wOwotCWludCBtaW5JdGVyPTA7Ci0JdGltZV90IGl0X3N0LCBzdCwgaXRfZm4sIGZuOwotCWJvb2wgZHVtcF9maWxlcyA9IGZhbHNlOwotCXN0cmluZyB0ZmlsZSwgdGZpbGVfYWN0dWFsLCBkZmlsZSwgYWZpbGUsIG5maWxlLCBuZmlsZV9hY3R1YWwsIHAwZmlsZSwKLQkJCWFsaWduZmlsZSwgbnVtYmVyLCB0ZXN0X2FsaWduZmlsZSwgZDRmaWxlLCBkNWZpbGUsIHplcm9GZXJ0RmlsZTsKLQlzdCA9IHRpbWUoTlVMTCk7Ci0JY291dCA8PCAiU3RhcnRpbmcgSE1NIFRvIE1vZGVsIDMgVml0ZXJiaSBUcmFpbmluZyI7Ci0JY291dCA8PCAiXG4gaHRvMyBUcmFpbmluZyBTdGFydGVkIGF0OiAiPDwgbXlfY3RpbWUoJnN0KSA8PCAnXG4nOwotCXN0cmluZyBtb2RlbE5hbWU9IkgyMyI7Ci0JLy9jb3V0IDw8IlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iPDxtb2RlbE5hbWU8PCI6IEl0ZXJhdGlvbiAiIDw8IGl0PDwnXG4nOwotCWludCBpdCA9IDE7Ci0JYm9vbCBmaW5hbCA9ZmFsc2U7Ci0JLy8vdW1wX2ZpbGVzID0gdHJ1ZTsKLQlkdW1wX2ZpbGVzID0gKGZpbmFsIHx8ICgoTW9kZWwzX0R1bXBfRnJlcSAhPSAwKSAmJiAoKGl0ICUgTW9kZWwzX0R1bXBfRnJlcSkKLQkJCT09IDApKSkgJiYgIU5PRFVNUFM7Ci0Jc3RyaW5nIGQ0ZmlsZTI7Ci0JewotCQkvLyBzZXQgdXAgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB3aGVyZSB0aGUgdGFibGVzIHdpbGwgYmUgcHJpbnRlZCAKLQkJaW50IG4gPSBpdDsKLQkJbnVtYmVyID0gIiI7Ci0JCWRvIHsKLQkJCS8vbWogY2hhbmdlZCBuZXh0IGxpbmUKLQkJCW51bWJlci5pbnNlcnQoKHNpemVfdCkgMCwgMSwgKGNoYXIpKG4gJSAxMCArICcwJykpOwotCQl9IHdoaWxlICgobiAvPSAxMCkgPiAwKTsKLQkJaWYgKGZpbmFsKQotCQkJbnVtYmVyPSJmaW5hbCI7Ci0JCXRmaWxlID0gUHJlZml4ICsgIi50My4iICsgbnVtYmVyOwotCQl0ZmlsZV9hY3R1YWwgPSBQcmVmaXggKyAiLmFjdHVhbC50My4iICsgbnVtYmVyOwotCQlhZmlsZSA9IFByZWZpeCArICIuYTMuIiArIG51bWJlcjsKLQkJbmZpbGUgPSBQcmVmaXggKyAiLm4zLiIgKyBudW1iZXI7Ci0JCW5maWxlX2FjdHVhbCA9IFByZWZpeCArICIuYWN0dWFsLm4zLiIgKyBudW1iZXI7Ci0JCWRmaWxlID0gUHJlZml4ICsgIi5kMy4iICsgbnVtYmVyOwotCQlkNGZpbGUgPSBQcmVmaXggKyAiLmQ0LiIgKyBudW1iZXI7Ci0JCWQ0ZmlsZTIgPSBQcmVmaXggKyAiLkQ0LiIgKyBudW1iZXI7Ci0JCWQ1ZmlsZSA9IFByZWZpeCArICIuZDUuIiArIG51bWJlcjsKLQkJYWxpZ25maWxlID0gUHJlZml4ICsgIi5BSDNfIjsKLQkJY2hhciBfcFsyXTsKLQkJX3BbMV0gPSAwOwotCQlfcFswXSA9IGl0ZXIgKyAnMCc7Ci0JCWFsaWduZmlsZSArPSBfcDsKLQkJYWxpZ25maWxlICs9ICIucGFydCI7Ci0JCV9wWzFdID0gMDsKLQkJX3BbMF0gPSBwYXJ0ICsgJzAnOwotCQlhbGlnbmZpbGUgKz0gX3A7Ci0JCXRlc3RfYWxpZ25maWxlID0gUHJlZml4ICsgIi50c3QuQTMuIiArIG51bWJlcjsKLQkJdGVzdF9hbGlnbmZpbGUgPSBQcmVmaXggKyAiLnRzdC5BMy4iICsgbnVtYmVyOwotCQlwMGZpbGUgPSBQcmVmaXggKyAiLnAwXzMuIiArIG51bWJlcjsKLQl9Ci0JLy8gY2xlYXIgY291bnQgdGFibGVzIAotCS8vICAgIHRDb3VudFRhYmxlLmNsZWFyKCk7Ci0JZENvdW50VGFibGUuY2xlYXIoKTsKLQlhQ291bnRUYWJsZS5jbGVhcigpOwotCWluaXRBTCgpOwotCW5Db3VudFRhYmxlLmNsZWFyKCk7Ci0JcDBfY291bnQgPSBwMV9jb3VudCA9IDA7Ci0KLSNpZmRlZiBUUklDS1lfSUJNM19UUkFJTklORwotCi0jZGVmaW5lIFRSQUlOX0FSR1MgcGVycCwgICAgICB0cmFpblZpdGVyYmlQZXJwLCBzSGFuZGxlcjEsICAgIHRydWUsIGFsaWduZmlsZS5jX3N0cigpLCAgICAgdHJ1ZSwgIG1vZGVsTmFtZSxmaW5hbAotI2RlZmluZSBURVNUX0FSR1MgICp0ZXN0UGVycCwgKnRlc3RWaXRlcmJpUGVycCwgKnRlc3RIYW5kbGVyLCBkdW1wX2ZpbGVzLCB0ZXN0X2FsaWduZmlsZS5jX3N0cigpLGZhbHNlLCBtb2RlbE5hbWUsZmluYWwKLQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsaG1tLCBjb25zdCBobW0+KFRSQUlOX0FSR1MsaCwodm9pZCopMCk7Ci0JaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsaG1tLCBjb25zdCBobW0+KFRFU1RfQVJHUywgaCwodm9pZCopMCk7Ci0KLSNlbHNlCi0Jdml0ZXJiaV9sb29wKHBlcnAsIHRyYWluVml0ZXJiaVBlcnAsIHNIYW5kbGVyMSwgZHVtcF9maWxlcywKLQkJCWFsaWduZmlsZS5jX3N0cigpLCB0cnVlLCBtb2RlbCk7Ci0JaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotCXZpdGVyYmlfbG9vcCgqdGVzdFBlcnAsICp0ZXN0Vml0ZXJiaVBlcnAsICp0ZXN0SGFuZGxlciwKLQkJCWR1bXBfZmlsZXMsIHRlc3RfYWxpZ25maWxlLmNfc3RyKCksIGZhbHNlLCBtb2RlbCk7Ci0jZW5kaWYJCi0JaWYgKGVycm9yc0FMKCk8bWluRXJyb3JzKSB7Ci0JCW1pbkVycm9ycz1lcnJvcnNBTCgpOwotCQltaW5JdGVyPWl0OwotCX0KLQlyZXR1cm4gbWluSXRlcjsKLX0KLQotaW50IG1vZGVsMzo6dml0ZXJiaV8zdG8zKCkgewotCWJvb2wgZmluYWwgPSBmYWxzZTsKLQlkb3VibGUgbWluRXJyb3JzPTEuMDsKLQlpbnQgbWluSXRlcj0wOwotCXRpbWVfdCBpdF9zdCwgc3QsIGl0X2ZuLCBmbjsKLQlib29sIGR1bXBfZmlsZXMgPSBmYWxzZTsKLQlzdHJpbmcgdGZpbGUsIHRmaWxlX2FjdHVhbCwgZGZpbGUsIGFmaWxlLCBuZmlsZSwgbmZpbGVfYWN0dWFsLCBwMGZpbGUsCi0JCQlhbGlnbmZpbGUsIG51bWJlciwgdGVzdF9hbGlnbmZpbGUsIGQ0ZmlsZSwgZDVmaWxlLCB6ZXJvRmVydEZpbGU7Ci0Jc3QgPSB0aW1lKE5VTEwpOwotCWNvdXQgPDwgIlN0YXJ0aW5nIEhNTSBUbyBNb2RlbCAzIFZpdGVyYmkgVHJhaW5pbmciOwotCWNvdXQgPDwgIlxuIGh0bzMgVHJhaW5pbmcgU3RhcnRlZCBhdDogIjw8IG15X2N0aW1lKCZzdCkgPDwgJ1xuJzsKLQlzdHJpbmcgbW9kZWxOYW1lPSJIMjMiOwotCWludCBpdCA9IDE7Ci0KLQkvLyBjb3V0IDw8IlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iPDxtb2RlbE5hbWU8PCI6IEl0ZXJhdGlvbiAiIDw8IGl0PDwnXG4nOwotCi0JZHVtcF9maWxlcyA9IChmaW5hbCB8fCAoKE1vZGVsM19EdW1wX0ZyZXEgIT0gMCkgJiYgKChpdCAlIE1vZGVsM19EdW1wX0ZyZXEpCi0JCQk9PSAwKSkpICYmICFOT0RVTVBTOwotCWR1bXBfZmlsZXMgPSB0cnVlOwotCXN0cmluZyBkNGZpbGUyOwotCXsKLQkJLy8gc2V0IHVwIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgd2hlcmUgdGhlIHRhYmxlcyB3aWxsIGJlIHByaW50ZWQgCi0JCWludCBuID0gaXQ7Ci0JCW51bWJlciA9ICIiOwotCQlkbyB7Ci0JCQkvL21qIGNoYW5nZWQgbmV4dCBsaW5lCi0JCQludW1iZXIuaW5zZXJ0KChzaXplX3QpIDAsIDEsIChjaGFyKShuICUgMTAgKyAnMCcpKTsKLQkJfSB3aGlsZSAoKG4gLz0gMTApID4gMCk7Ci0JCWlmIChmaW5hbCkKLQkJCW51bWJlcj0iZmluYWwiOwotCQl0ZmlsZSA9IFByZWZpeCArICIudDMuIiArIG51bWJlcjsKLQkJdGZpbGVfYWN0dWFsID0gUHJlZml4ICsgIi5hY3R1YWwudDMuIiArIG51bWJlcjsKLQkJYWZpbGUgPSBQcmVmaXggKyAiLmEzLiIgKyBudW1iZXI7Ci0JCW5maWxlID0gUHJlZml4ICsgIi5uMy4iICsgbnVtYmVyOwotCQluZmlsZV9hY3R1YWwgPSBQcmVmaXggKyAiLmFjdHVhbC5uMy4iICsgbnVtYmVyOwotCQlkZmlsZSA9IFByZWZpeCArICIuZDMuIiArIG51bWJlcjsKLQkJZDRmaWxlID0gUHJlZml4ICsgIi5kNC4iICsgbnVtYmVyOwotCQlkNGZpbGUyID0gUHJlZml4ICsgIi5ENC4iICsgbnVtYmVyOwotCQlkNWZpbGUgPSBQcmVmaXggKyAiLmQ1LiIgKyBudW1iZXI7Ci0JCWFsaWduZmlsZSA9IFByZWZpeCArICIuQTNfIjsKLQkJY2hhciBfcFsyXTsKLQkJX3BbMV0gPSAwOwotCQlfcFswXSA9IGl0ZXIgKyAnMCc7Ci0JCWFsaWduZmlsZSArPSBfcDsKLQkJYWxpZ25maWxlICs9ICIucGFydCI7Ci0JCV9wWzFdID0gMDsKLQkJX3BbMF0gPSBwYXJ0ICsgJzAnOwotCQlhbGlnbmZpbGUgKz0gX3A7Ci0JCXRlc3RfYWxpZ25maWxlID0gUHJlZml4ICsgIi50c3QuQTMuIiArIG51bWJlcjsKLQkJcDBmaWxlID0gUHJlZml4ICsgIi5wMF8zLiIgKyBudW1iZXI7Ci0JfQotCS8vIGNsZWFyIGNvdW50IHRhYmxlcyAKLQkvLyAgICB0Q291bnRUYWJsZS5jbGVhcigpOwotCWRDb3VudFRhYmxlLmNsZWFyKCk7Ci0JYUNvdW50VGFibGUuY2xlYXIoKTsKLQlpbml0QUwoKTsKLQluQ291bnRUYWJsZS5jbGVhcigpOwotCXAwX2NvdW50ID0gcDFfY291bnQgPSAwOwotCi0jaWZkZWYgVFJJQ0tZX0lCTTNfVFJBSU5JTkcKLQotI2RlZmluZSBUUkFJTl9BUkdTIHBlcnAsICAgICAgdHJhaW5WaXRlcmJpUGVycCwgc0hhbmRsZXIxLCAgICB0cnVlLCBhbGlnbmZpbGUuY19zdHIoKSwgICAgIHRydWUsICBtb2RlbE5hbWUsZmluYWwKLSNkZWZpbmUgVEVTVF9BUkdTICAqdGVzdFBlcnAsICp0ZXN0Vml0ZXJiaVBlcnAsICp0ZXN0SGFuZGxlciwgZHVtcF9maWxlcywgdGVzdF9hbGlnbmZpbGUuY19zdHIoKSxmYWxzZSwgbW9kZWxOYW1lLGZpbmFsCi0Jdml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPHRyYW5zcGFpcl9tb2RlbDM+KCBUUkFJTl9BUkdTLCAodm9pZCopMCwodm9pZCopMCk7Ci0JaWYgKHRlc3RQZXJwICYmIHRlc3RIYW5kbGVyKQotCQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsMz4oIFRFU1RfQVJHUywgKHZvaWQqKTAsKHZvaWQqKTApOwotCi0jZWxzZQotCXZpdGVyYmlfbG9vcChwZXJwLCB0cmFpblZpdGVyYmlQZXJwLCBzSGFuZGxlcjEsIGR1bXBfZmlsZXMsCi0JCQlhbGlnbmZpbGUuY19zdHIoKSwgdHJ1ZSwgbW9kZWwpOwotCWlmICh0ZXN0UGVycCAmJiB0ZXN0SGFuZGxlcikKLQl2aXRlcmJpX2xvb3AoKnRlc3RQZXJwLCAqdGVzdFZpdGVyYmlQZXJwLCAqdGVzdEhhbmRsZXIsCi0JCQlkdW1wX2ZpbGVzLCB0ZXN0X2FsaWduZmlsZS5jX3N0cigpLCBmYWxzZSwgbW9kZWwpOwotI2VuZGlmCQotCWlmIChlcnJvcnNBTCgpPG1pbkVycm9ycykgewotCQltaW5FcnJvcnM9ZXJyb3JzQUwoKTsKLQkJbWluSXRlcj1pdDsKLQl9Ci0JcmV0dXJuIG1pbkl0ZXI7Ci19Ci0KLWQ0bW9kZWwqIG1vZGVsMzo6dml0ZXJiaV8zdG80KCkgewotCWRvdWJsZSBtaW5FcnJvcnM9MS4wOwotCWludCBtaW5JdGVyPTA7Ci0JdGltZV90IGl0X3N0LCBzdCwgaXRfZm4sIGZuOwotCWJvb2wgZmluYWwgPSBmYWxzZTsKLQlib29sIGR1bXBfZmlsZXMgPSBmYWxzZTsKLQlpZihld29yZGNsYXNzZXM9PU5VTEwpCi0JCWV3b3JkY2xhc3NlcyA9IG5ldyBXb3JkQ2xhc3NlczsKLQlpZihmd29yZGNsYXNzZXM9PU5VTEwpCi0JCWZ3b3JkY2xhc3NlcyA9IG5ldyBXb3JkQ2xhc3NlczsJCQotCQotCWQ0bW9kZWwgKmRtMSA9IG5ldyBkNG1vZGVsKE1BWF9TRU5URU5DRV9MRU5HVEgsKmV3b3JkY2xhc3NlcywqZndvcmRjbGFzc2VzKTsKLQlkNG1vZGVsJiBkNG0gPSAqZG0xOwotCS8vZDRtLm1ha2VXb3JkQ2xhc3NlcyhFbGlzdCwgRmxpc3QsIFNvdXJjZVZvY2FiRmlsZW5hbWUrIi5jbGFzc2VzIiwKLQkvLwkJVGFyZ2V0Vm9jYWJGaWxlbmFtZSsiLmNsYXNzZXMiKTsKLQotCXN0cmluZyB0ZmlsZSwgdGZpbGVfYWN0dWFsLCBkZmlsZSwgYWZpbGUsIG5maWxlLCBuZmlsZV9hY3R1YWwsIHAwZmlsZSwKLQkJCWFsaWduZmlsZSwgbnVtYmVyLCB0ZXN0X2FsaWduZmlsZSwgZDRmaWxlLCBkNWZpbGUsIHplcm9GZXJ0RmlsZTsKLQlzdCA9IHRpbWUoTlVMTCk7Ci0JY291dCA8PCAiU3RhcnRpbmcgTW9kZWwgMyBUbyBNb2RlbCA0IFZpdGVyYmkgVHJhaW5pbmciOwotCWNvdXQgPDwgIlxuIGh0bzMgVHJhaW5pbmcgU3RhcnRlZCBhdDogIjw8IG15X2N0aW1lKCZzdCkgPDwgJ1xuJzsKLQlzdHJpbmcgbW9kZWxOYW1lPSIzNCI7Ci0JaW50IGl0ID0gMTsKLQkvL2NvdXQgPDwiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI8PG1vZGVsTmFtZTw8IjogSXRlcmF0aW9uICIgPDwgaXQ8PCdcbic7Ci0KLQlkdW1wX2ZpbGVzID0gKGZpbmFsIHx8ICgoTW9kZWwzX0R1bXBfRnJlcSAhPSAwKSAmJiAoKGl0ICUgTW9kZWwzX0R1bXBfRnJlcSkKLQkJCT09IDApKSkgJiYgIU5PRFVNUFM7Ci0JZHVtcF9maWxlcyA9IHRydWU7Ci0Jc3RyaW5nIGQ0ZmlsZTI7Ci0JewotCQkvLyBzZXQgdXAgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB3aGVyZSB0aGUgdGFibGVzIHdpbGwgYmUgcHJpbnRlZCAKLQkJaW50IG4gPSBpdDsKLQkJbnVtYmVyID0gIiI7Ci0JCWRvIHsKLQkJCS8vbWogY2hhbmdlZCBuZXh0IGxpbmUKLQkJCW51bWJlci5pbnNlcnQoKHNpemVfdCkgMCwgMSwgKGNoYXIpKG4gJSAxMCArICcwJykpOwotCQl9IHdoaWxlICgobiAvPSAxMCkgPiAwKTsKLQkJaWYgKGZpbmFsKQotCQkJbnVtYmVyPSJmaW5hbCI7Ci0JCXRmaWxlID0gUHJlZml4ICsgIi50My4iICsgbnVtYmVyOwotCQl0ZmlsZV9hY3R1YWwgPSBQcmVmaXggKyAiLmFjdHVhbC50My4iICsgbnVtYmVyOwotCQlhZmlsZSA9IFByZWZpeCArICIuYTMuIiArIG51bWJlcjsKLQkJbmZpbGUgPSBQcmVmaXggKyAiLm4zLiIgKyBudW1iZXI7Ci0JCW5maWxlX2FjdHVhbCA9IFByZWZpeCArICIuYWN0dWFsLm4zLiIgKyBudW1iZXI7Ci0JCWRmaWxlID0gUHJlZml4ICsgIi5kMy4iICsgbnVtYmVyOwotCQlkNGZpbGUgPSBQcmVmaXggKyAiLmQ0LiIgKyBudW1iZXI7Ci0JCWQ0ZmlsZTIgPSBQcmVmaXggKyAiLkQ0LiIgKyBudW1iZXI7Ci0JCWQ1ZmlsZSA9IFByZWZpeCArICIuZDUuIiArIG51bWJlcjsKLQkJYWxpZ25maWxlID0gUHJlZml4ICsgIi5BMzRfIjsKLQkJY2hhciBfcFsyXTsKLQkJX3BbMV0gPSAwOwotCQlfcFswXSA9IGl0ZXIgKyAnMCc7Ci0JCWFsaWduZmlsZSArPSBfcDsKLQkJYWxpZ25maWxlICs9ICIucGFydCI7Ci0JCV9wWzFdID0gMDsKLQkJX3BbMF0gPSBwYXJ0ICsgJzAnOwotCQlhbGlnbmZpbGUgKz0gX3A7Ci0JCXRlc3RfYWxpZ25maWxlID0gUHJlZml4ICsgIi50c3QuQTMuIiArIG51bWJlcjsKLQkJcDBmaWxlID0gUHJlZml4ICsgIi5wMF8zLiIgKyBudW1iZXI7Ci0JfQotCS8vIGNsZWFyIGNvdW50IHRhYmxlcyAKLQkvLyAgICB0Q291bnRUYWJsZS5jbGVhcigpOwotCWRDb3VudFRhYmxlLmNsZWFyKCk7Ci0JYUNvdW50VGFibGUuY2xlYXIoKTsKLQlpbml0QUwoKTsKLQluQ291bnRUYWJsZS5jbGVhcigpOwotCXAwX2NvdW50ID0gcDFfY291bnQgPSAwOwotCi0jaWZkZWYgVFJJQ0tZX0lCTTNfVFJBSU5JTkcKLQotI2RlZmluZSBUUkFJTl9BUkdTIHBlcnAsICAgICAgdHJhaW5WaXRlcmJpUGVycCwgc0hhbmRsZXIxLCAgICB0cnVlLCBhbGlnbmZpbGUuY19zdHIoKSwgICAgIHRydWUsICBtb2RlbE5hbWUsZmluYWwKLSNkZWZpbmUgVEVTVF9BUkdTICAqdGVzdFBlcnAsICp0ZXN0Vml0ZXJiaVBlcnAsICp0ZXN0SGFuZGxlciwgZHVtcF9maWxlcywgdGVzdF9hbGlnbmZpbGUuY19zdHIoKSxmYWxzZSwgbW9kZWxOYW1lLGZpbmFsCi0Jdml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPHRyYW5zcGFpcl9tb2RlbDMsIHZvaWQsIGQ0bW9kZWw+KFRSQUlOX0FSR1MsICh2b2lkKikwLCZkNG0pOwotCWlmICh0ZXN0UGVycCAmJiB0ZXN0SGFuZGxlcikKLQkJdml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPHRyYW5zcGFpcl9tb2RlbDMsIHZvaWQsIGQ0bW9kZWw+KCBURVNUX0FSR1MgLCAodm9pZCopMCwmZDRtKTsKLQotI2Vsc2UKLQl2aXRlcmJpX2xvb3AocGVycCwgdHJhaW5WaXRlcmJpUGVycCwgc0hhbmRsZXIxLCBkdW1wX2ZpbGVzLAotCQkJYWxpZ25maWxlLmNfc3RyKCksIHRydWUsIG1vZGVsKTsKLQlpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpCi0Jdml0ZXJiaV9sb29wKCp0ZXN0UGVycCwgKnRlc3RWaXRlcmJpUGVycCwgKnRlc3RIYW5kbGVyLAotCQkJZHVtcF9maWxlcywgdGVzdF9hbGlnbmZpbGUuY19zdHIoKSwgZmFsc2UsIG1vZGVsKTsKLSNlbmRpZgkKLQlpZiAoZXJyb3JzQUwoKTxtaW5FcnJvcnMpIHsKLQkJbWluRXJyb3JzPWVycm9yc0FMKCk7Ci0JCW1pbkl0ZXI9aXQ7Ci0JfQotCXJldHVybiBkbTE7Ci19Ci0KLWludCBtb2RlbDM6OnZpdGVyYmlfNHRvNChkNG1vZGVsJiBkNG0pIHsKLQlkb3VibGUgbWluRXJyb3JzPTEuMDsKLQlpbnQgbWluSXRlcj0wOwotCWJvb2wgZHVtcF9maWxlcyA9IGZhbHNlOwotCi0JLy9kNG1vZGVsIGQ0bShNQVhfU0VOVEVOQ0VfTEVOR1RIKTsKLQkvL2Q0bS5tYWtlV29yZENsYXNzZXMoRWxpc3QsIEZsaXN0LCBTb3VyY2VWb2NhYkZpbGVuYW1lKyIuY2xhc3NlcyIsCi0JLy8JCVRhcmdldFZvY2FiRmlsZW5hbWUrIi5jbGFzc2VzIik7Ci0KLQlzdHJpbmcgdGZpbGUsIHRmaWxlX2FjdHVhbCwgZGZpbGUsIGFmaWxlLCBuZmlsZSwgbmZpbGVfYWN0dWFsLCBwMGZpbGUsCi0JCQlhbGlnbmZpbGUsIG51bWJlciwgdGVzdF9hbGlnbmZpbGUsIGQ0ZmlsZSwgZDVmaWxlLCB6ZXJvRmVydEZpbGU7Ci0KLQljb3V0IDw8ICJTdGFydGluZyBNb2RlbDQgVG8gTW9kZWwgNCBWaXRlcmJpIFRyYWluaW5nIjsKLQlpbnQgaXQgPSAxOwotCWJvb2wgZmluYWwgPSBmYWxzZTsKLQlkdW1wX2ZpbGVzID0gKGZpbmFsIHx8ICgoTW9kZWwzX0R1bXBfRnJlcSAhPSAwKSAmJiAoKGl0ICUgTW9kZWwzX0R1bXBfRnJlcSkKLQkJCT09IDApKSkgJiYgIU5PRFVNUFM7Ci0JZHVtcF9maWxlcyA9IHRydWU7Ci0KLQlzdHJpbmcgbW9kZWxOYW1lPSJIMjMiOwotCS8vY291dCA8PCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjw8bW9kZWxOYW1lPDwiOiBJdGVyYXRpb24gIiA8PCBpdDw8J1xuJzsKLQlzdHJpbmcgZDRmaWxlMjsKLQl7Ci0JCS8vIHNldCB1cCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHdoZXJlIHRoZSB0YWJsZXMgd2lsbCBiZSBwcmludGVkIAotCQlpbnQgbiA9IGl0OwotCQludW1iZXIgPSAiIjsKLQkJZG8gewotCQkJLy9taiBjaGFuZ2VkIG5leHQgbGluZQotCQkJbnVtYmVyLmluc2VydCgoc2l6ZV90KSAwLCAxLCAoY2hhcikobiAlIDEwICsgJzAnKSk7Ci0JCX0gd2hpbGUgKChuIC89IDEwKSA+IDApOwotCQl0ZmlsZSA9IFByZWZpeCArICIudDMuIiArIG51bWJlcjsKLQkJdGZpbGVfYWN0dWFsID0gUHJlZml4ICsgIi5hY3R1YWwudDMuIiArIG51bWJlcjsKLQkJYWZpbGUgPSBQcmVmaXggKyAiLmEzLiIgKyBudW1iZXI7Ci0JCW5maWxlID0gUHJlZml4ICsgIi5uMy4iICsgbnVtYmVyOwotCQluZmlsZV9hY3R1YWwgPSBQcmVmaXggKyAiLmFjdHVhbC5uMy4iICsgbnVtYmVyOwotCQlkZmlsZSA9IFByZWZpeCArICIuZDMuIiArIG51bWJlcjsKLQkJZDRmaWxlID0gUHJlZml4ICsgIi5kNC4iICsgbnVtYmVyOwotCQlkNGZpbGUyID0gUHJlZml4ICsgIi5ENC4iICsgbnVtYmVyOwotCQlkNWZpbGUgPSBQcmVmaXggKyAiLmQ1LiIgKyBudW1iZXI7Ci0JCWFsaWduZmlsZSA9IFByZWZpeCArICIuQTRfIjsKLQkJY2hhciBfcFsyXTsKLQkJX3BbMV0gPSAwOwotCQlfcFswXSA9IGl0ZXIgKyAnMCc7Ci0JCWFsaWduZmlsZSArPSBfcDsKLQkJYWxpZ25maWxlICs9ICIucGFydCI7Ci0JCV9wWzFdID0gMDsKLQkJX3BbMF0gPSBwYXJ0ICsgJzAnOwotCQlhbGlnbmZpbGUgKz0gX3A7Ci0JCXRlc3RfYWxpZ25maWxlID0gUHJlZml4ICsgIi50c3QuQTMuIiArIG51bWJlcjsKLQkJcDBmaWxlID0gUHJlZml4ICsgIi5wMF8zLiIgKyBudW1iZXI7Ci0JfQotCS8vIGNsZWFyIGNvdW50IHRhYmxlcyAKLQkvLyAgICB0Q291bnRUYWJsZS5jbGVhcigpOwotCWRDb3VudFRhYmxlLmNsZWFyKCk7Ci0JYUNvdW50VGFibGUuY2xlYXIoKTsKLQlpbml0QUwoKTsKLQluQ291bnRUYWJsZS5jbGVhcigpOwotCXAwX2NvdW50ID0gcDFfY291bnQgPSAwOwotCi0jaWZkZWYgVFJJQ0tZX0lCTTNfVFJBSU5JTkcKLQotI2RlZmluZSBUUkFJTl9BUkdTIHBlcnAsICAgICAgdHJhaW5WaXRlcmJpUGVycCwgc0hhbmRsZXIxLCAgICB0cnVlLCBhbGlnbmZpbGUuY19zdHIoKSwgICAgIHRydWUsICBtb2RlbE5hbWUsZmluYWwKLSNkZWZpbmUgVEVTVF9BUkdTICAqdGVzdFBlcnAsICp0ZXN0Vml0ZXJiaVBlcnAsICp0ZXN0SGFuZGxlciwgZHVtcF9maWxlcywgdGVzdF9hbGlnbmZpbGUuY19zdHIoKSxmYWxzZSwgbW9kZWxOYW1lLGZpbmFsCi0KLQl2aXRlcmJpX2xvb3Bfd2l0aF90cmlja3M8dHJhbnNwYWlyX21vZGVsNCwgZDRtb2RlbCwgZDRtb2RlbD4oVFJBSU5fQVJHUyAsICZkNG0sJmQ0bSk7Ci0KLQlpZiAodGVzdFBlcnAgJiYgdGVzdEhhbmRsZXIpCi0JCXZpdGVyYmlfbG9vcF93aXRoX3RyaWNrczx0cmFuc3BhaXJfbW9kZWw0LCBkNG1vZGVsLCBkNG1vZGVsPiggVEVTVF9BUkdTLCAmZDRtLCZkNG0pOwotCi0jZWxzZQotCXZpdGVyYmlfbG9vcChwZXJwLCB0cmFpblZpdGVyYmlQZXJwLCBzSGFuZGxlcjEsIGR1bXBfZmlsZXMsCi0JCQlhbGlnbmZpbGUuY19zdHIoKSwgdHJ1ZSwgbW9kZWwpOwotCWlmICh0ZXN0UGVycCAmJiB0ZXN0SGFuZGxlcikKLQl2aXRlcmJpX2xvb3AoKnRlc3RQZXJwLCAqdGVzdFZpdGVyYmlQZXJwLCAqdGVzdEhhbmRsZXIsCi0JCQlkdW1wX2ZpbGVzLCB0ZXN0X2FsaWduZmlsZS5jX3N0cigpLCBmYWxzZSwgbW9kZWwpOwotI2VuZGlmCQotCWlmIChlcnJvcnNBTCgpPG1pbkVycm9ycykgewotCQltaW5FcnJvcnM9ZXJyb3JzQUwoKTsKLQkJbWluSXRlcj1pdDsKLQl9Ci0JcmV0dXJuIG1pbkl0ZXI7Ci19Ci0KLXN0cnVjdCBtb2RlbDNfYWxpZ25fc3RydWN0IHsKLQltb2RlbDMgKm07Ci0JaW50IHBhcnQ7Ci0JaW50IGl0ZXI7Ci0JaW50IHZhbGlkOwotCXB0aHJlYWRfdCB0aHJlYWQ7Ci0JaW50IGRvbmU7Ci0JZDRtb2RlbCAqZDQ7Ci0JaW50IHJlc3VsdDsKLQltb2RlbDNfYWxpZ25fc3RydWN0KCkgOgotCQltKE5VTEwpLCBwYXJ0KDApLCBpdGVyKDApLCB2YWxpZCgwKSwgZG9uZSgwKSwgZDQoTlVMTCkgewotCX0KLQotfTsKLQotdm9pZCogZW1fdGhyZWFkX2gyMyh2b2lkICphcmcpIHsKLQltb2RlbDNfYWxpZ25fc3RydWN0ICogbTMgPSAobW9kZWwzX2FsaWduX3N0cnVjdCopIGFyZzsKLQltMy0+bS0+aW5pdEFMKCk7Ci0JbTMtPnJlc3VsdCA9IG0zLT5tLT52aXRlcmJpX2h0bzMoKTsKLQltMy0+ZG9uZSA9IDE7Ci0JcmV0dXJuIG0zOwotfQotCi12b2lkKiBlbV90aHJlYWRfMzIzKHZvaWQgKmFyZykgewotCW1vZGVsM19hbGlnbl9zdHJ1Y3QgKiBtMyA9IChtb2RlbDNfYWxpZ25fc3RydWN0KikgYXJnOwotCW0zLT5tLT5pbml0QUwoKTsKLQltMy0+cmVzdWx0ID0gbTMtPm0tPnZpdGVyYmlfM3RvMygpOwotCW0zLT5kb25lID0gMTsKLQlyZXR1cm4gbTM7Ci19Ci0KLXZvaWQqIGVtX3RocmVhZF8zMjQodm9pZCAqYXJnKSB7Ci0JbW9kZWwzX2FsaWduX3N0cnVjdCAqIG0zID0gKG1vZGVsM19hbGlnbl9zdHJ1Y3QqKSBhcmc7Ci0JbTMtPm0tPmluaXRBTCgpOwotCW0zLT5kNCA9IG0zLT5tLT52aXRlcmJpXzN0bzQoKTsKLQltMy0+ZG9uZSA9IDE7Ci0JcmV0dXJuIG0zOwotfQotCi12b2lkKiBlbV90aHJlYWRfNDI0KHZvaWQgKmFyZykgewotCW1vZGVsM19hbGlnbl9zdHJ1Y3QgKiBtMyA9IChtb2RlbDNfYWxpZ25fc3RydWN0KikgYXJnOwotCW0zLT5tLT5pbml0QUwoKTsKLQltMy0+cmVzdWx0ID0gbTMtPm0tPnZpdGVyYmlfNHRvNCgqKG0zLT5kNCkpOwotCW0zLT5kb25lID0gMTsKLQlyZXR1cm4gbTM7Ci19Ci0KLXZvaWQgbXVsdGlfdGhyZWFkX20zNF9lbShtb2RlbDMmIG0zLCBpbnQgbmNwdSwgaW50IE1vZGVsM19JdGVyYXRpb25zLAotCQlpbnQgTW9kZWw0X0l0ZXJhdGlvbnMpIHsKLQlzdHJpbmcgdGZpbGUsIHRmaWxlX2FjdHVhbCwgZGZpbGUsIGFmaWxlLCBuZmlsZSwgbmZpbGVfYWN0dWFsLCBwMGZpbGUsCi0JCQlhbGlnbmZpbGUsIG51bWJlciwgdGVzdF9hbGlnbmZpbGUsIGQ0ZmlsZSwgZDVmaWxlLCB6ZXJvRmVydEZpbGU7Ci0JdmVjdG9yPG1vZGVsM19hbGlnbl9zdHJ1Y3Q+IHRocmVhZHM7Ci0JYm9vbCBkdW1wX2ZpbGVzID0gZmFsc2U7Ci0JdGhyZWFkcy5yZXNpemUobmNwdSk7Ci0JdGltZV90IGl0X3N0LCBzdCwgaXRfZm4sIGZuOwotCWludCBpLCBqOwotCWludCBIID0gMDsKLQlpbnQgVDQgPSBNb2RlbDNfSXRlcmF0aW9uczsKLQluY3B1PTE7Ci0JdmVjdG9yPGFtb2RlbDxDT1VOVD4gPiBjb3VudHM7Ci0JY291bnRzLnJlc2l6ZShuY3B1KTsKLQltMy5wYXJ0PTA7Ci0JZm9yIChpPTE7IGk8bmNwdTsgaSsrKSB7Ci0JCXRocmVhZHNbaV0ubSA9IG5ldyBtb2RlbDMobTMsbTMuZFRhYmxlLG0zLm5UYWJsZSxjb3VudHNbaV0pOwotCQl0aHJlYWRzW2ldLm0tPnNldEhNTShtMy5oKTsKLQkJdGhyZWFkc1tpXS5tLT5wYXJ0ID0gaTsKLQl9Ci0JZDRtb2RlbCAqZDRtPSBOVUxMOwotCXN0ID0gdGltZShOVUxMKTsKLQotCXN0cmluZyB0cmFpbmluZ1N0cmluZzsKLQl0cmFpbmluZ1N0cmluZys9KG0zLmggPyAnSCcgOiAnMycpOwotCWZvciAoaW50IGk9MDsgaTxNb2RlbDNfSXRlcmF0aW9uczsgKytpKQotCQl0cmFpbmluZ1N0cmluZys9JzMnOwotCWZvciAoaW50IGk9MDsgaTxNb2RlbDRfSXRlcmF0aW9uczsgKytpKQotCQl0cmFpbmluZ1N0cmluZys9JzQnOwotCWNvdXQgPDwgIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKLQljb3V0IDw8ICJTdGFydGluZyAiPDx0cmFpbmluZ1N0cmluZzw8IjogIFZpdGVyYmkgVHJhaW5pbmciOwotCWNvdXQgPDwgIlxuICI8PHRyYWluaW5nU3RyaW5nPDwiIFRyYWluaW5nIFN0YXJ0ZWQgYXQ6ICI8PCBteV9jdGltZSgmc3QpCi0JCQk8PCAnXG4nOwotCi0JZm9yIChpPTA7IGk8TW9kZWwzX0l0ZXJhdGlvbnMrTW9kZWw0X0l0ZXJhdGlvbnM7IGkrKykgewotCQltMy5wZXJwLmNsZWFyKCk7Ci0JCW0zLnRyYWluVml0ZXJiaVBlcnAuY2xlYXIoKTsKLQkJbTMuaXRlciA9IGk7Ci0JCWJvb2wgZmluYWwgPSAoaT09TW9kZWwzX0l0ZXJhdGlvbnMtMSB8fCBpID09IE1vZGVsNF9JdGVyYXRpb25zCi0JCQkJK01vZGVsM19JdGVyYXRpb25zLTEpOwotCQlkdW1wX2ZpbGVzID0gKGZpbmFsIHx8ICgoTW9kZWwzX0R1bXBfRnJlcSAhPSAwKSAmJiAoKGkKLQkJCQklIE1vZGVsM19EdW1wX0ZyZXEpID09IDApKSkgJiYgIU5PRFVNUFM7Ci0JCW0zLnNIYW5kbGVyMS5yZXdpbmQoKTsKLQkJbTMucGVycC5jbGVhcigpIDsgLy8gY2xlYXJzIGNyb3NzX2VudHJvcCAmIHBlcnBsZXhpdHkgCi0JCW0zLnRyYWluVml0ZXJiaVBlcnAuY2xlYXIoKSA7IC8vIGNsZWFycyBjcm9zc19lbnRyb3AgJiBwZXJwbGV4aXR5IAotCQlzdHJpbmcgbW9kZWxOYW1lOwotCQlpdF9zdCA9IHRpbWUoTlVMTCk7Ci0JCWR1bXBfZmlsZXMgPSAoZmluYWwgfHwgKChNb2RlbDNfRHVtcF9GcmVxICE9IDApICYmICgoaQotCQkJCSUgTW9kZWwzX0R1bXBfRnJlcSkgPT0gMCkpKSAmJiAhTk9EVU1QUzsKLQkJc3RyaW5nIGQ0ZmlsZTI7Ci0JCXsKLQkJCS8vIHNldCB1cCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHdoZXJlIHRoZSB0YWJsZXMgd2lsbCBiZSBwcmludGVkIAotCQkJaW50IG4gPSBpOwotCQkJbnVtYmVyID0gIiI7Ci0JCQlkbyB7Ci0JCQkJLy9taiBjaGFuZ2VkIG5leHQgbGluZQotCQkJCW51bWJlci5pbnNlcnQoKHNpemVfdCkgMCwgMSwgKGNoYXIpKG4gJSAxMCArICcwJykpOwotCQkJfSB3aGlsZSAoKG4gLz0gMTApID4gMCk7Ci0JCQlpZiAoZmluYWwpCi0JCQkJbnVtYmVyPSJmaW5hbCI7Ci0JCQl0ZmlsZSA9IFByZWZpeCArICIudDMuIiArIG51bWJlcjsKLQkJCXRmaWxlX2FjdHVhbCA9IFByZWZpeCArICIuYWN0dWFsLnQzLiIgKyBudW1iZXI7Ci0JCQlhZmlsZSA9IFByZWZpeCArICIuYTMuIiArIG51bWJlcjsKLQkJCW5maWxlID0gUHJlZml4ICsgIi5uMy4iICsgbnVtYmVyOwotCQkJbmZpbGVfYWN0dWFsID0gUHJlZml4ICsgIi5hY3R1YWwubjMuIiArIG51bWJlcjsKLQkJCWRmaWxlID0gUHJlZml4ICsgIi5kMy4iICsgbnVtYmVyOwotCQkJZDRmaWxlID0gUHJlZml4ICsgIi5kNC4iICsgbnVtYmVyOwotCQkJZDRmaWxlMiA9IFByZWZpeCArICIuRDQuIiArIG51bWJlcjsKLQkJCWQ1ZmlsZSA9IFByZWZpeCArICIuZDUuIiArIG51bWJlcjsKLQkJCWFsaWduZmlsZSA9IFByZWZpeCArICIuQTMuIiArIG51bWJlcjsKLQkJCXRlc3RfYWxpZ25maWxlID0gUHJlZml4ICsgIi50c3QuQTMuIiArIG51bWJlcjsKLQkJCXAwZmlsZSA9IFByZWZpeCArICIucDBfMy4iICsgbnVtYmVyOwotCQl9Ci0JCWlmIChtMy50ZXN0UGVycCAmJiBtMy50ZXN0SGFuZGxlcikgewotCQkJbTMudGVzdEhhbmRsZXItPnJld2luZCgpOwotCQkJbTMudGVzdFBlcnAtPmNsZWFyKCk7Ci0JCQltMy50ZXN0Vml0ZXJiaVBlcnAtPmNsZWFyKCk7Ci0JCX0KLQotCQlmb3IgKGo9MTsgajxuY3B1OyBqKyspIHsKLQkJCXRocmVhZHNbal0ubS0+cDAgPSBtMy5wMDsKLQkJCXRocmVhZHNbal0ubS0+cDEgPSBtMy5wMTsKLQkJCXRocmVhZHNbal0ubS0+cDBfY291bnQgPSAwOwotCQkJdGhyZWFkc1tqXS5tLT5wMV9jb3VudCA9IDA7Ci0JCQl0aHJlYWRzW2pdLm0tPm5Db3VudFRhYmxlLmNsZWFyKCk7Ci0JCQl0aHJlYWRzW2pdLm0tPmRDb3VudFRhYmxlLmNsZWFyKCk7Ci0JCQl0aHJlYWRzW2pdLm0tPmFDb3VudFRhYmxlLmNsZWFyKCk7Ci0JCQl0aHJlYWRzW2pdLm0tPml0ZXIgPSBpOwotCQkJaWYgKHRocmVhZHNbal0uZDQpIHsKLQkJCQkqKHRocmVhZHNbal0uZDQpID0gKmQ0bTsKLQkJCQl0aHJlYWRzW2pdLmQ0LT5jbGVhcigpOwotCQkJfQotCQl9Ci0JCWlmIChpPT0wKSB7IC8vIEgyMwotCQkJZm9yIChqPTE7IGo8bmNwdTsgaisrKSB7Ci0JCQkJdGhyZWFkc1tqXS52YWxpZCA9IHB0aHJlYWRfY3JlYXRlKCYodGhyZWFkc1tqXS50aHJlYWQpLCBOVUxMLAotCQkJCQkJZW1fdGhyZWFkX2gyMywgJih0aHJlYWRzW2pdKSk7Ci0JCQkJaWYgKHRocmVhZHNbal0udmFsaWQpIHsKLQkJCQkJY2VyciA8PCAiRXJyb3IgU3RhcnRpbmcgVGhyZWFkICIgPDwgaiA8PCBlbmRsOwotCQkJCX0KLQkJCX0KLQkJCW1vZGVsTmFtZSA9ICJIVE8zIjsKLQkJCW0zLnZpdGVyYmlfaHRvMygpOwotCQkJd2hpbGUgKDEpIHsKLQkJCQlib29sIGRvbmUgPSB0cnVlOwotCQkJCWZvciAoaj0xOyBqPG5jcHU7IGorKykgewotCQkJCQkvL3B0aHJlYWRfam9pbigoYXJnc1tqXS50aHJlYWQpLE5VTEwpOwotCQkJCQkvLyBTdGFydCBub3JtYWxpemF0aW9uIGFzIHNvb24gYXMgcG9zc2libGUKLQkJCQkJaWYgKHRocmVhZHNbal0uZG9uZT09MSkgewotCQkJCQkJdGhyZWFkc1tqXS5kb25lID0gMjsKLQkJCQkJCW0zLmFDb3VudFRhYmxlLm1lcmdlKHRocmVhZHNbal0ubS0+YUNvdW50VGFibGUpOwotCQkJCQkJbTMuZENvdW50VGFibGUubWVyZ2UodGhyZWFkc1tqXS5tLT5kQ291bnRUYWJsZSk7Ci0JCQkJCQltMy5uQ291bnRUYWJsZS5tZXJnZSh0aHJlYWRzW2pdLm0tPm5Db3VudFRhYmxlLAotCQkJCQkJCQltMy5FbGlzdC51bmlxVG9rZW5zKCksIG0zLkVsaXN0LmdldFZvY2FiTGlzdCgpKTsKLQkJCQkJCW0zLnAwX2NvdW50ICs9IHRocmVhZHNbal0ubS0+cDBfY291bnQ7Ci0JCQkJCQltMy5wMV9jb3VudCArPSB0aHJlYWRzW2pdLm0tPnAxX2NvdW50OwotCQkJCQl9IGVsc2UgaWYgKHRocmVhZHNbal0uZG9uZT09MikgewotCQkJCQkJLy8gTm90aGluZwotCQkJCQl9IGVsc2UgaWYgKHRocmVhZHNbal0uZG9uZT09MCkgewotCQkJCQkJZG9uZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkb25lKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIGlmIChpPjAgJiYgaTwgTW9kZWwzX0l0ZXJhdGlvbnMpIHsKLQkJCW1vZGVsTmFtZSA9ICIzVE8zIjsKLQkJCWZvciAoaj0xOyBqPG5jcHU7IGorKykgewotCQkJCXRocmVhZHNbal0udmFsaWQgPSBwdGhyZWFkX2NyZWF0ZSgmKHRocmVhZHNbal0udGhyZWFkKSwgTlVMTCwKLQkJCQkJCWVtX3RocmVhZF8zMjMsICYodGhyZWFkc1tqXSkpOwotCQkJCWlmICh0aHJlYWRzW2pdLnZhbGlkKSB7Ci0JCQkJCWNlcnIgPDwgIkVycm9yIFN0YXJ0aW5nIFRocmVhZCAiIDw8IGogPDwgZW5kbDsKLQkJCQl9Ci0JCQl9Ci0JCQltMy52aXRlcmJpXzN0bzMoKTsKLQkJCXdoaWxlICgxKSB7Ci0JCQkJYm9vbCBkb25lID0gdHJ1ZTsKLQkJCQlmb3IgKGo9MTsgajxuY3B1OyBqKyspIHsKLQkJCQkJLy9wdGhyZWFkX2pvaW4oKGFyZ3Nbal0udGhyZWFkKSxOVUxMKTsKLQkJCQkJLy8gU3RhcnQgbm9ybWFsaXphdGlvbiBhcyBzb29uIGFzIHBvc3NpYmxlCi0JCQkJCWlmICh0aHJlYWRzW2pdLmRvbmU9PTEpIHsKLQkJCQkJCXRocmVhZHNbal0uZG9uZSA9IDI7Ci0JCQkJCQltMy5hQ291bnRUYWJsZS5tZXJnZSh0aHJlYWRzW2pdLm0tPmFDb3VudFRhYmxlKTsKLQkJCQkJCW0zLmRDb3VudFRhYmxlLm1lcmdlKHRocmVhZHNbal0ubS0+ZENvdW50VGFibGUpOwotCQkJCQkJbTMubkNvdW50VGFibGUubWVyZ2UodGhyZWFkc1tqXS5tLT5uQ291bnRUYWJsZSwKLQkJCQkJCQkJbTMuRWxpc3QudW5pcVRva2VucygpLCBtMy5FbGlzdC5nZXRWb2NhYkxpc3QoKSk7Ci0JCQkJCQltMy5wMF9jb3VudCArPSB0aHJlYWRzW2pdLm0tPnAwX2NvdW50OwotCQkJCQkJbTMucDFfY291bnQgKz0gdGhyZWFkc1tqXS5tLT5wMV9jb3VudDsKLQkJCQkJfSBlbHNlIGlmICh0aHJlYWRzW2pdLmRvbmU9PTIpIHsKLQkJCQkJCS8vIE5vdGhpbmcKLQkJCQkJfSBlbHNlIGlmICh0aHJlYWRzW2pdLmRvbmU9PTApIHsKLQkJCQkJCWRvbmUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZG9uZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaT09TW9kZWwzX0l0ZXJhdGlvbnMpIHsKLQkJCW1vZGVsTmFtZSA9ICIzVE80IjsKLQkJCWZvciAoaj0xOyBqPG5jcHU7IGorKykgewotCQkJCXRocmVhZHNbal0udmFsaWQgPSBwdGhyZWFkX2NyZWF0ZSgmKHRocmVhZHNbal0udGhyZWFkKSwgTlVMTCwKLQkJCQkJCWVtX3RocmVhZF8zMjQsICYodGhyZWFkc1tqXSkpOwotCQkJCWlmICh0aHJlYWRzW2pdLnZhbGlkKSB7Ci0JCQkJCWNlcnIgPDwgIkVycm9yIFN0YXJ0aW5nIFRocmVhZCAiIDw8IGogPDwgZW5kbDsKLQkJCQl9Ci0JCQl9Ci0JCQlkNG0gPSBtMy52aXRlcmJpXzN0bzQoKTsKLQkJCXdoaWxlICgxKSB7Ci0JCQkJYm9vbCBkb25lID0gdHJ1ZTsKLQkJCQlmb3IgKGo9MTsgajxuY3B1OyBqKyspIHsKLQkJCQkJLy9wdGhyZWFkX2pvaW4oKGFyZ3Nbal0udGhyZWFkKSxOVUxMKTsKLQkJCQkJLy8gU3RhcnQgbm9ybWFsaXphdGlvbiBhcyBzb29uIGFzIHBvc3NpYmxlCi0JCQkJCWlmICh0aHJlYWRzW2pdLmRvbmU9PTEpIHsKLQkJCQkJCXRocmVhZHNbal0uZG9uZSA9IDI7Ci0JCQkJCQltMy5hQ291bnRUYWJsZS5tZXJnZSh0aHJlYWRzW2pdLm0tPmFDb3VudFRhYmxlKTsKLQkJCQkJCW0zLmRDb3VudFRhYmxlLm1lcmdlKHRocmVhZHNbal0ubS0+ZENvdW50VGFibGUpOwotCQkJCQkJbTMubkNvdW50VGFibGUubWVyZ2UodGhyZWFkc1tqXS5tLT5uQ291bnRUYWJsZSwKLQkJCQkJCQkJbTMuRWxpc3QudW5pcVRva2VucygpLCBtMy5FbGlzdC5nZXRWb2NhYkxpc3QoKSk7Ci0JCQkJCQltMy5wMF9jb3VudCArPSB0aHJlYWRzW2pdLm0tPnAwX2NvdW50OwotCQkJCQkJbTMucDFfY291bnQgKz0gdGhyZWFkc1tqXS5tLT5wMV9jb3VudDsKLQkJCQkJCWQ0bS0+bWVyZ2UoKnRocmVhZHNbal0uZDQpOwotCQkJCQl9IGVsc2UgaWYgKHRocmVhZHNbal0uZG9uZT09MikgewotCQkJCQkJLy8gTm90aGluZwotCQkJCQl9IGVsc2UgaWYgKHRocmVhZHNbal0uZG9uZT09MCkgewotCQkJCQkJZG9uZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkb25lKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIGlmIChpPk1vZGVsM19JdGVyYXRpb25zKSB7Ci0JCQltb2RlbE5hbWUgPSAiNFRPNCI7Ci0JCQlmb3IgKGo9MTsgajxuY3B1OyBqKyspIHsKLQkJCQl0aHJlYWRzW2pdLnZhbGlkID0gcHRocmVhZF9jcmVhdGUoJih0aHJlYWRzW2pdLnRocmVhZCksIE5VTEwsCi0JCQkJCQllbV90aHJlYWRfNDI0LCAmKHRocmVhZHNbal0pKTsKLQkJCQlpZiAodGhyZWFkc1tqXS52YWxpZCkgewotCQkJCQljZXJyIDw8ICJFcnJvciBTdGFydGluZyBUaHJlYWQgIiA8PCBqIDw8IGVuZGw7Ci0JCQkJfQotCQkJfQotCQkJbTMudml0ZXJiaV80dG80KCpkNG0pOwotCQkJd2hpbGUgKDEpIHsKLQkJCQlib29sIGRvbmUgPSB0cnVlOwotCQkJCWZvciAoaj0xOyBqPG5jcHU7IGorKykgewotCQkJCQkvL3B0aHJlYWRfam9pbigoYXJnc1tqXS50aHJlYWQpLE5VTEwpOwotCQkJCQkvLyBTdGFydCBub3JtYWxpemF0aW9uIGFzIHNvb24gYXMgcG9zc2libGUKLQkJCQkJaWYgKHRocmVhZHNbal0uZG9uZT09MSkgewotCQkJCQkJdGhyZWFkc1tqXS5kb25lID0gMjsKLQkJCQkJCW0zLmFDb3VudFRhYmxlLm1lcmdlKHRocmVhZHNbal0ubS0+YUNvdW50VGFibGUpOwotCQkJCQkJbTMuZENvdW50VGFibGUubWVyZ2UodGhyZWFkc1tqXS5tLT5kQ291bnRUYWJsZSk7Ci0JCQkJCQltMy5uQ291bnRUYWJsZS5tZXJnZSh0aHJlYWRzW2pdLm0tPm5Db3VudFRhYmxlLAotCQkJCQkJCQltMy5FbGlzdC51bmlxVG9rZW5zKCksIG0zLkVsaXN0LmdldFZvY2FiTGlzdCgpKTsKLQkJCQkJCW0zLnAwX2NvdW50ICs9IHRocmVhZHNbal0ubS0+cDBfY291bnQ7Ci0JCQkJCQltMy5wMV9jb3VudCArPSB0aHJlYWRzW2pdLm0tPnAxX2NvdW50OwotCQkJCQkJZDRtLT5tZXJnZSgqKHRocmVhZHNbal0uZDQpKTsKLQkJCQkJfSBlbHNlIGlmICh0aHJlYWRzW2pdLmRvbmU9PTIpIHsKLQkJCQkJCS8vIE5vdGhpbmcKLQkJCQkJfSBlbHNlIGlmICh0aHJlYWRzW2pdLmRvbmU9PTApIHsKLQkJCQkJCWRvbmUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZG9uZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJbTMucGVycC5yZWNvcmQobW9kZWxOYW1lKTsKLQkJbTMuZXJyb3JSZXBvcnRBTChjZXJyLCBtb2RlbE5hbWUpOwotCQltMy50cmFpblZpdGVyYmlQZXJwLnJlY29yZChtb2RlbE5hbWUpOwotCi0JCW0zLnRUYWJsZS5ub3JtYWxpemVUYWJsZShtMy5FbGlzdCwgbTMuRmxpc3QpOwotCQltMy5hQ291bnRUYWJsZS5ub3JtYWxpemUobTMuYVRhYmxlKTsKLQkJbTMuYUNvdW50VGFibGUuY2xlYXIoKTsKLQkJbTMuZENvdW50VGFibGUubm9ybWFsaXplKG0zLmRUYWJsZSk7Ci0JCW0zLmRDb3VudFRhYmxlLmNsZWFyKCk7Ci0JCW0zLm5Db3VudFRhYmxlLm5vcm1hbGl6ZShtMy5uVGFibGUsICYobTMuRWxpc3QuZ2V0Vm9jYWJMaXN0KCkpKTsKLQkJbTMubkNvdW50VGFibGUuY2xlYXIoKTsKLQkJY291dCA8PCAicDBfY291bnQgaXMgIiA8PCBtMy5wMF9jb3VudCA8PCAiIGFuZCBwMSBpcyAiIDw8IG0zLnAxX2NvdW50Ci0JCQkJPDwgIjsgIjsKLQkJaWYgKFAwIT0tMS4wKSB7Ci0JCQltMy5wMCA9IFAwOwotCQkJbTMucDEgPSAxLVAwOwotCQl9IGVsc2UgewotCQkJaWYgKG0zLnAxX2NvdW50ICsgbTMucDBfY291bnQgIT0gMCkgewotCQkJCW0zLnAxID0gbTMucDFfY291bnQgLyAobTMucDFfY291bnQgKyBtMy5wMF9jb3VudCApOwotCQkJCW0zLnAwID0gMSAtIG0zLnAxOwotCQkJfSBlbHNlIHsKLQkJCQltMy5wMSA9IG0zLnAwID0gMDsKLQkJCQljZXJyIDw8ICJFUlJPUjogcDBfY291bnQrcDFfY291bnQgaXMgemVybyEhIVxuIjsKLQkJCX0KLQkJfQotCQltMy5wMF9jb3VudCA9IG0zLnAxX2NvdW50ID0gMDsKLQkJY291dCA8PCAicDAgaXMgIiA8PCBtMy5wMCA8PCAiIHAxOiAiIDw8IG0zLnAxIDw8ICdcbic7Ci0JCWlmIChkNG0pIHsKLQkJCWQ0bS0+bm9ybWFsaXplVGFibGUoKTsKLQkJCWQ0bS0+Y2xlYXIoKTsKLQkJfQotCi0JCWNvdXQgPDwgbW9kZWxOYW1lPDwiOiBUUkFJTiBDUk9TUy1FTlRST1BZICIgPDwgbTMucGVycC5jcm9zc19lbnRyb3B5KCkKLQkJCQk8PCAiIFBFUlBMRVhJVFkgIiA8PCBtMy5wZXJwLnBlcnBsZXhpdHkoKSA8PCAnXG4nOwotCQlpZiAobTMudGVzdFBlcnAgJiYgbTMudGVzdEhhbmRsZXIpCi0JCQljb3V0IDw8IG1vZGVsTmFtZSA8PCAiOigiPDxpPDwiIFRFU1QgQ1JPU1MtRU5UUk9QWSAiCi0JCQkJCTw8IG0zLnRlc3RQZXJwLT5jcm9zc19lbnRyb3B5KCkgPDwgIiBQRVJQTEVYSVRZICIKLQkJCQkJPDwgbTMudGVzdFBlcnAtPnBlcnBsZXhpdHkoKSA8PCAiIHN1bTogIgotCQkJCQk8PCBtMy50ZXN0UGVycC0+Z2V0U3VtKCk8PCAiIHdjOiAiCi0JCQkJCTw8IG0zLnRlc3RQZXJwLT53b3JkX2NvdW50KCkgPDwgJ1xuJzsKLQkJY291dCA8PCBtb2RlbE5hbWUgPDwgIjogKCI8PGk8PCIpIFRSQUlOIFZJVEVSQkkgQ1JPU1MtRU5UUk9QWSAiCi0JCQkJPDwgbTMudHJhaW5WaXRlcmJpUGVycC5jcm9zc19lbnRyb3B5KCkgPDwgIiBQRVJQTEVYSVRZICIKLQkJCQk8PCBtMy50cmFpblZpdGVyYmlQZXJwLnBlcnBsZXhpdHkoKSA8PCAnXG4nOwotCQlib29sIGR1bXBfZmlsZXMgPSB0cnVlOwotCQlpZiAoZHVtcF9maWxlcykgewotCQkJaWYgKE91dHB1dEluQWFjaGVuRm9ybWF0PT0wKQotCQkJCW0zLnRUYWJsZS5wcmludFByb2JUYWJsZSh0ZmlsZS5jX3N0cigpLAotCQkJCQkJbTMuRWxpc3QuZ2V0Vm9jYWJMaXN0KCksIG0zLkZsaXN0LmdldFZvY2FiTGlzdCgpLAotCQkJCQkJT3V0cHV0SW5BYWNoZW5Gb3JtYXQpOwotCQkJbTMuYVRhYmxlLnByaW50VGFibGUoYWZpbGUuY19zdHIoKSk7Ci0JCQltMy5kVGFibGUucHJpbnRUYWJsZShkZmlsZS5jX3N0cigpKTsKLQkJCW0zLm5UYWJsZS5wcmludE5UYWJsZShtMy5FbGlzdC51bmlxVG9rZW5zKCksIG5maWxlLmNfc3RyKCksCi0JCQkJCW0zLkVsaXN0LmdldFZvY2FiTGlzdCgpLCBPdXRwdXRJbkFhY2hlbkZvcm1hdCk7Ci0JCQlvZnN0cmVhbSBvZihwMGZpbGUuY19zdHIoKSk7Ci0JCQlvZiA8PCBtMy5wMDsKLQkJCW9mLmNsb3NlKCk7Ci0JCX0KLQkJaXRfZm4gPSB0aW1lKE5VTEwpOwotCQljb3V0IDw8ICJcbiIgPDwgbW9kZWxOYW1lIDw8ICIgVml0ZXJiaSBJdGVyYXRpb24gOiAiPDxpPDwgIiB0b29rOiAiCi0JCQkJPDwgZGlmZnRpbWUoaXRfZm4sIGl0X3N0KSA8PCAiIHNlY29uZHNcbiI7Ci0JfQotCWZuID0gdGltZShOVUxMKTsKLQljb3V0IDw8IHRyYWluaW5nU3RyaW5nIDw8IiBUcmFpbmluZyBGaW5pc2hlZCBhdDogIiA8PCBteV9jdGltZSgmZm4pIDw8ICJcbiI7Ci0JY291dCA8PCAiXG4iIDw8ICJFbnRpcmUgVml0ZXJiaSAiPDx0cmFpbmluZ1N0cmluZzw8IiBUcmFpbmluZyB0b29rOiAiCi0JCQk8PCBkaWZmdGltZShmbiwgc3QpIDw8ICIgc2Vjb25kc1xuIjsKLQljb3V0IDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwotCi19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21vZGVsMy5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbW9kZWwzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTdkMjguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbW9kZWwzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLQotIEVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLSBXcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotIFVTQS4KLQotICovCi0jaWZuZGVmIF9tb2RlbDNfaAotI2RlZmluZSBfbW9kZWwzX2ggMQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSAiVmVjdG9yLmgiCi0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpZiBfX0dOVUNfXz4yCi0jaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgotdXNpbmcgX19nbnVfY3h4OjpoYXNoX21hcDsKLSNlbHNlCi0jaW5jbHVkZSA8aGFzaF9tYXA+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJNb3ZlU3dhcE1hdHJpeC5oIgotI2luY2x1ZGUgIlRUYWJsZXMuaCIKLSNpbmNsdWRlICJBVGFibGVzLmgiCi0jaW5jbHVkZSAiTlRhYmxlcy5oIgotI2luY2x1ZGUgImdldFNlbnRlbmNlLmgiCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgIm1vZGVsMi5oIgotI2luY2x1ZGUgIlBlcnBsZXhpdHkuaCIKLSNpbmNsdWRlICJ0cmFuc3BhaXJfbW9kZWwzLmgiCi0jaW5jbHVkZSAidHJhbnNwYWlyX21vZGVsaG1tLmgiCi0jaW5jbHVkZSAiYWxpZ25tZW50LmgiCi0jaW5jbHVkZSAidm9jYWIuaCIKLSNpbmNsdWRlICJENFRhYmxlcy5oIgotI2luY2x1ZGUgIkQ1VGFibGVzLmgiCi0jaW5jbHVkZSAiQWxpZ25UYWJsZXMuaCIKLSNpbmNsdWRlICJzeW5jT2JqLmgiCi1jbGFzcyBtb2RlbDMgOiBwdWJsaWMgbW9kZWwyIHsKLQlNdXRleCBwbG9jazsKLXB1YmxpYzoKLQlhbW9kZWw8UFJPQj4mIGRUYWJsZTsKLQlhbW9kZWw8Q09VTlQ+IGRDb3VudFRhYmxlOwotCi0JUFJPQiBwMCwgcDE7Ci0JU3luY0RvdWJsZSBwMF9jb3VudCwgcDFfY291bnQ7Ci0KLQlubW9kZWw8UFJPQj4mIG5UYWJsZTsKLQlubW9kZWw8Q09VTlQ+IG5Db3VudFRhYmxlOwotCWhtbSpoOwotCWludCBwYXJ0OwotCWludCBpdGVyOwotCi1wcml2YXRlOgotCVdvcmRDbGFzc2VzKiBld29yZGNsYXNzZXM7Ci0gICAgV29yZENsYXNzZXMqIGZ3b3JkY2xhc3NlczsJCi1wdWJsaWM6Ci0KLQltb2RlbDMobW9kZWwyJiBtMik7Ci0Jdm9pZCBzZXRITU0oaG1tKl9oKSB7Ci0JCWV3b3JkY2xhc3NlcyA9ICYoX2gtPmV3b3JkY2xhc3Nlcyk7Ci0JCWZ3b3JkY2xhc3NlcyA9ICYoX2gtPmZ3b3JkY2xhc3Nlcyk7Ci0JCWg9X2g7Ci0JfQotCW1vZGVsMyhtb2RlbDImIG0yLCBhbW9kZWw8UFJPQj4mIGQsIG5tb2RlbDxQUk9CPiYgbik7Ci0JbW9kZWwzKG1vZGVsMyYgbTMsIGFtb2RlbDxQUk9CPiYgZCwgbm1vZGVsPFBST0I+JiBuLCBhbW9kZWw8Q09VTlQ+Jik7Ci0Jfm1vZGVsMygpOwotCS8vIG1ldGhvZHMKLQl2b2lkIHRyYW5zZmVyKHNlbnRlbmNlSGFuZGxlciYsIGJvb2wsIFBlcnBsZXhpdHkmLCBQZXJwbGV4aXR5JiwKLQkJCWJvb2wgdXBkYXRlVD0xKTsKLQl2b2lkIHRyYW5zZmVyU2ltcGxlKHNlbnRlbmNlSGFuZGxlciYsIGJvb2wsIFBlcnBsZXhpdHkmLCBQZXJwbGV4aXR5JiwKLQkJCWJvb2wgdXBkYXRlVD0xKTsKLQl2b2lkIGxvYWRfdGFibGVzKGNvbnN0IGNoYXIgKm5maWxlLCBjb25zdCBjaGFyICpkZmlsZSwgY29uc3QgY2hhciAqcDBmaWxlKTsKLQotCXZvaWQgZW0oaW50LCBzZW50ZW5jZUhhbmRsZXImKTsKLQlpbnQgdml0ZXJiaShpbnQsIGludCwgaW50LCBpbnQsY29uc3QgY2hhciogcHJldl9kNCA9IE5VTEwsY29uc3QgY2hhciogcHJldl9kNF8yPU5VTEwsYm9vbCBkdW1wQ291bnQgPSBmYWxzZSwgCi0JICAgIGNvbnN0IGNoYXIqIGR1bXBDb3VudE5hbWUgPSBOVUxMLCBib29sIHVzZVN0cmluZyA9IGZhbHNlKTsKLQlpbnQgdml0ZXJiaV9odG8zKCk7Ci0JZDRtb2RlbCogdml0ZXJiaV8zdG80KCk7Ci0JaW50IHZpdGVyYmlfM3RvMygpOwotCWludCB2aXRlcmJpXzR0bzQoZDRtb2RlbCYgZDRtKTsKLQl2b2lkIHZpdGVyYmlfdGhyZWFkKGludCBpdCwgc3RyaW5nIGFsaWduZmlsZSwgYm9vbCBkdW1wX2ZpbGVzLGQ0bW9kZWwmIGQ0bSxkNW1vZGVsJiBkNW0sYm9vbCBmaW5hbCxjaGFyIGZyb21Nb2RlbCxjaGFyIHRvTW9kZWwsc3RyaW5nJiBtb2RlbE5hbWUpOwotcHJpdmF0ZToKLQkKLQkKLQlMb2dQcm9iIHByb2Jfb2Zfc3BlY2lhbChWZWN0b3I8V29yZEluZGV4PiYsIFZlY3RvcjxXb3JkSW5kZXg+JiwKLQkJCXRtb2RlbDxDT1VOVCwgUFJPQj4mLCBWZWN0b3I8V29yZEluZGV4PiYsIFZlY3RvcjxXb3JkSW5kZXg+Jik7Ci0KLQlMb2dQcm9iIHByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKFZlY3RvcjxXb3JkSW5kZXg+JiwKLQkJCVZlY3RvcjxXb3JkSW5kZXg+JiwgdG1vZGVsPENPVU5ULCBQUk9CPiYsIFZlY3RvcjxXb3JkSW5kZXg+JiwKLQkJCVZlY3RvcjxXb3JkSW5kZXg+Jik7Ci0JTG9nUHJvYiBwcm9iX29mX3RhcmdldF9naXZlbl9zb3VyY2UodG1vZGVsPENPVU5ULCBQUk9CPiYsCi0JCQlWZWN0b3I8V29yZEluZGV4PiYsIFZlY3RvcjxXb3JkSW5kZXg+Jik7Ci0KLQlMb2dQcm9iIHNjb3JlT2ZNb3ZlKFZlY3RvcjxXb3JkSW5kZXg+JiwgVmVjdG9yPFdvcmRJbmRleD4mLAotCQkJVmVjdG9yPFdvcmRJbmRleD4mLCBWZWN0b3I8V29yZEluZGV4PiYsIHRtb2RlbDxDT1VOVCwgUFJPQj4mLAotCQkJV29yZEluZGV4LCBXb3JkSW5kZXgpOwotCi0JTG9nUHJvYiBzY29yZU9mU3dhcChWZWN0b3I8V29yZEluZGV4PiYsIFZlY3RvcjxXb3JkSW5kZXg+JiwKLQkJCVZlY3RvcjxXb3JkSW5kZXg+JiwgdG1vZGVsPENPVU5ULCBQUk9CPiYsIGludCwgaW50KTsKLQotCXZvaWQgaGlsbENsaW1iKFZlY3RvcjxXb3JkSW5kZXg+JiwgVmVjdG9yPFdvcmRJbmRleD4mLCBWZWN0b3I8V29yZEluZGV4PiYsCi0JCQlWZWN0b3I8V29yZEluZGV4PiYsIExvZ1Byb2ImLCB0bW9kZWw8Q09VTlQsIFBST0I+JiwgaW50LCBpbnQpOwotCi0Jdm9pZCBmaW5kQmVzdEFsaWdubWVudChWZWN0b3I8V29yZEluZGV4PiYsIFZlY3RvcjxXb3JkSW5kZXg+JiwKLQkJCVZlY3RvcjxXb3JkSW5kZXg+JiwgVmVjdG9yPFdvcmRJbmRleD4mLCBMb2dQcm9iJiwgaW50LCBpbnQpOwotCi0Jdm9pZCBmaW5kQWxpZ25tZW50c05laWdoYm9yaG9vZChWZWN0b3I8V29yZEluZGV4PiYsIFZlY3RvcjxXb3JkSW5kZXg+JiwKLQkJCUxvZ1Byb2ImYWxpZ25fdG90YWxfY291bnQsIGFsaWdubW9kZWwmbmVpZ2hib3Job29kLCBpbnQsIGludCk7Ci0Jdm9pZCBjb2xsZWN0Q291bnRzT3ZlckFsaWduZW1lbnQoY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIGVzLAotCQkJY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIGZzLCBjb25zdCBWZWN0b3I8V29yZEluZGV4PiYsIExvZ1Byb2IsCi0JCQlmbG9hdCBjb3VudCk7Ci0JTG9nUHJvYiB2aXRlcmJpX21vZGVsMihjb25zdCB0cmFuc3BhaXJfbW9kZWwzJmVmLCBhbGlnbm1lbnQmb3V0cHV0LAotCQkJaW50IHBhaXJfbm8sIGludCBpX3BlZyA9IC0xLCBpbnQgal9wZWcgPSAtMSkgY29uc3Q7Ci0JTG9nUHJvYiBfdml0ZXJiaV9tb2RlbDIoY29uc3QgdHJhbnNwYWlyX21vZGVsMiZlZiwgYWxpZ25tZW50Jm91dHB1dCwKLQkJCWludCBpX3BlZyA9IC0xLCBpbnQgal9wZWcgPSAtMSkgY29uc3Q7Ci0JTG9nUHJvYiB2aXRlcmJpX21vZGVsMihjb25zdCB0cmFuc3BhaXJfbW9kZWxobW0mZWYsIGFsaWdubWVudCZvdXRwdXQsCi0JCQlpbnQgcGFpcl9ubywgaW50IGlfcGVnID0gLTEsIGludCBqX3BlZyA9IC0xKSBjb25zdDsKLQotcHJpdmF0ZToKLQl2b2lkIGVzdGltYXRlX3RfYV9kKHNlbnRlbmNlSGFuZGxlciYgc0hhbmRsZXIxLCBQZXJwbGV4aXR5JiBwZXJwLCBQZXJwbGV4aXR5JiBwZXJwMSwKLQkJIGJvb2wgc2ltcGxlLCBib29sIGR1bXBfZmlsZXMsIGJvb2wgdXBkYXRlVCk7Ci0Jdm9pZCB2aXRlcmJpX2xvb3AoUGVycGxleGl0eSYsIFBlcnBsZXhpdHkmLCBzZW50ZW5jZUhhbmRsZXImLCBib29sLAotCQkJY29uc3QgY2hhciosIGJvb2wsIHN0cmluZyBtb2RlbCk7Ci0KLQl0ZW1wbGF0ZTxjbGFzcyBNT0RFTF9UWVBFLCBjbGFzcyBBLCBjbGFzcyBCPiB2b2lkIHZpdGVyYmlfbG9vcF93aXRoX3RyaWNrcygKLQkJCVBlcnBsZXhpdHkmLCBQZXJwbGV4aXR5Jiwgc2VudGVuY2VIYW5kbGVyJiwgYm9vbCwgY29uc3QgY2hhciosCi0JCQlib29sLCBzdHJpbmcgbW9kZWwsIGJvb2wgZmluYWwsIEEqZDRtLCBCKmQ1bSk7Ci0KLX07Ci0KLXZvaWQgbXVsdGlfdGhyZWFkX20zNF9lbShtb2RlbDMmIG0zLCBpbnQgbmNwdSwgaW50IE1vZGVsM19JdGVyYXRpb25zLAotCQlpbnQgTW9kZWw0X0l0ZXJhdGlvbnMpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21vZGVsMzQ1LXBlZy5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9tb2RlbDM0NS1wZWcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzFiZGU2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21vZGVsMzQ1LXBlZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaCAoUldUSCBBYWNoZW4gLSBMZWhyc3R1aGwgZnVlciBJbmZvcm1hdGlrIFZJKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHSVpBKysgKCBleHRlbnNpb24gb2YgR0laQSApLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0jaW5jbHVkZSAibW9kZWwzLmgiCi0jaW5jbHVkZSAiY29sbENvdW50cy5oIgotCi1ib29sIG1ha2VPbmVNb3ZlU3dhcChjb25zdCBhbGlnbm1lbnQmeCxjb25zdCBhbGlnbm1lbnQmeSxzZXQ8T25lTW92ZVN3YXA+JnNvbXMpCi17Ci0gIE9uZU1vdmVTd2FwIG9tczsKLSAgb21zLnR5cGU9MDsKLSAgaW50IGNvdW50PTA7Ci0gIFZlY3RvcjxpbnQ+IHBvc2l0aW9ucyg0KTsKLSAgYXNzZXJ0KHguZ2V0X20oKT09eS5nZXRfbSgpKTsKLSAgZm9yKFBvc2l0aW9uSW5kZXggaj0xO2o8PXguZ2V0X20oKTtqKyspCi0gICAgaWYoeChqKSE9eShqKSkKLSAgICAgIHsKLQlpZihjb3VudD09NCkKLQkgIHJldHVybiAwOwotCXBvc2l0aW9uc1tjb3VudF09ajsKLQljb3VudCsrOwotICAgICAgfQotICBhc3NlcnQoY291bnQ+MCk7Ci0gIGlmKGNvdW50PT0xKQotICAgIHsKLSAgICAgIG9tcy50eXBlPTE7Ci0gICAgICBvbXMuYT1wb3NpdGlvbnNbMF07Ci0gICAgICBvbXMuYj15KHBvc2l0aW9uc1swXSk7Ci0gICAgICBzb21zLmluc2VydChvbXMpOwotICAgICAgZm9yKHVuc2lnbmVkIGludCBqPTE7ajw9eC5nZXRfbSgpOysraikKLQl7Ci0JICBpZiggaW50KGopIT1wb3NpdGlvbnNbMF0mJnkoaik9PXkocG9zaXRpb25zWzBdKSkKLQkgICAgewotCSAgICAgIG9tcy50eXBlPTM7Ci0JICAgICAgb21zLmE9ajsKLQkgICAgICBvbXMuYj14KHBvc2l0aW9uc1swXSk7Ci0JICAgICAgc29tcy5pbnNlcnQob21zKTsKLQkgICAgfQotCX0KLSAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0xO2o8PXguZ2V0X20oKTsrK2opCi0JewotCSAgaWYoIGludChqKSE9cG9zaXRpb25zWzBdJiZ4KGopPT14KHBvc2l0aW9uc1swXSkpCi0JICAgIHsKLQkgICAgICBvbXMudHlwZT0yOwotCSAgICAgIG9tcy5hPXBvc2l0aW9uc1swXTsKLQkgICAgICBvbXMuYj1qOwotCSAgICAgIGlmKCBvbXMuYjxvbXMuYSlzd2FwKG9tcy5iLG9tcy5hKTsKLQkgICAgICBzb21zLmluc2VydChvbXMpOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlIGlmKGNvdW50PT0yKQotICAgIHsKLSAgICAgIGlmKHgocG9zaXRpb25zWzBdKT09eShwb3NpdGlvbnNbMV0pICYmIHgocG9zaXRpb25zWzFdKT09eShwb3NpdGlvbnNbMF0pKQotCXsKLQkgIG9tcy50eXBlPTQ7Ci0JICBvbXMuYT1wb3NpdGlvbnNbMF07Ci0JICBvbXMuYj1wb3NpdGlvbnNbMV07Ci0JICBzb21zLmluc2VydChvbXMpOwotCSAgZm9yKHVuc2lnbmVkIGludCBqPTE7ajw9eC5nZXRfbSgpOysraikKLQkgICAgewotCSAgICAgIGlmKCBpbnQoaikhPXBvc2l0aW9uc1swXSYmeShqKT09eShwb3NpdGlvbnNbMF0pKQotCQl7Ci0JCSAgb21zLnR5cGU9MjtvbXMuYT1qO29tcy5iPXBvc2l0aW9uc1sxXTtpZiggb21zLmI8b21zLmEpc3dhcChvbXMuYixvbXMuYSk7c29tcy5pbnNlcnQob21zKTsKLQkJfQotCSAgICAgIGlmKCBpbnQoaikhPXBvc2l0aW9uc1sxXSYmeShqKT09eShwb3NpdGlvbnNbMV0pKQotCQl7Ci0JCSAgb21zLnR5cGU9MjtvbXMuYT1qO29tcy5iPXBvc2l0aW9uc1swXTtpZiggb21zLmI8b21zLmEpc3dhcChvbXMuYixvbXMuYSk7c29tcy5pbnNlcnQob21zKTsKLQkJfQotCSAgICB9IAotCX0KLSAgICAgIGVsc2UgaWYoeChwb3NpdGlvbnNbMF0pPT15KHBvc2l0aW9uc1sxXSkgKQotCXsKLQkgIG9tcy50eXBlPTM7Ci0JICBvbXMuYT1wb3NpdGlvbnNbMF07Ci0JICBvbXMuYj14KHBvc2l0aW9uc1sxXSk7Ci0JICBzb21zLmluc2VydChvbXMpOwotCSAgb21zLnR5cGU9MjsKLQkgIG9tcy5hPXBvc2l0aW9uc1swXTsKLQkgIG9tcy5iPXBvc2l0aW9uc1sxXTsKLQkgIHNvbXMuaW5zZXJ0KG9tcyk7CSAgCi0JfQotICAgICAgZWxzZSBpZiggeChwb3NpdGlvbnNbMV0pPT15KHBvc2l0aW9uc1swXSkgKQotCXsKLQkgIG9tcy50eXBlPTM7Ci0JICBvbXMuYT1wb3NpdGlvbnNbMV07Ci0JICBvbXMuYj14KHBvc2l0aW9uc1swXSk7Ci0JICBzb21zLmluc2VydChvbXMpOwotCSAgb21zLnR5cGU9MjsKLQkgIG9tcy5hPXBvc2l0aW9uc1swXTsKLQkgIG9tcy5iPXBvc2l0aW9uc1sxXTsKLQkgIHNvbXMuaW5zZXJ0KG9tcyk7CSAgCi0JfQotICAgICAgb21zLnR5cGU9MzsKLSAgICAgIG9tcy5hPXBvc2l0aW9uc1swXTsKLSAgICAgIG9tcy5iPXgocG9zaXRpb25zWzBdKTsKLSAgICAgIHNvbXMuaW5zZXJ0KG9tcyk7Ci0gICAgICBvbXMuYT1wb3NpdGlvbnNbMV07Ci0gICAgICBvbXMuYj14KHBvc2l0aW9uc1sxXSk7Ci0gICAgICBzb21zLmluc2VydChvbXMpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlIGlmKCBjb3VudD09MyApCi0gICAgeyAvLyB0aHJlZSBkaWZmZXJlbmNlcyBhbmQgdGhyZWUgZGlmZmVyZW50IG51bWJlcnMKLSAgICAgIFZlY3RvcjxpbnQ+IHh4KDMpLHl5KDMpOwotICAgICAgeHhbMF09eChwb3NpdGlvbnNbMF0pO3h4WzFdPXgocG9zaXRpb25zWzFdKTt4eFsyXT14KHBvc2l0aW9uc1syXSk7Ci0gICAgICB5eVswXT15KHBvc2l0aW9uc1swXSk7eXlbMV09eShwb3NpdGlvbnNbMV0pO3l5WzJdPXkocG9zaXRpb25zWzJdKTsKLSAgICAgIHNvcnQoeHguYmVnaW4oKSx4eC5lbmQoKSk7Ci0gICAgICBzb3J0KHl5LmJlZ2luKCkseXkuZW5kKCkpOwotICAgICAgaWYoeHg9PXl5KQotCXsKLQkgIG9tcy50eXBlPTI7b21zLmE9cG9zaXRpb25zWzBdO29tcy5iPXBvc2l0aW9uc1sxXTtzb21zLmluc2VydChvbXMpOwotCSAgb21zLnR5cGU9MjtvbXMuYT1wb3NpdGlvbnNbMF07b21zLmI9cG9zaXRpb25zWzJdO3NvbXMuaW5zZXJ0KG9tcyk7Ci0JICBvbXMudHlwZT0yO29tcy5hPXBvc2l0aW9uc1sxXTtvbXMuYj1wb3NpdGlvbnNbMl07c29tcy5pbnNlcnQob21zKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLy9jb3V0IDw8ICJIRVJFLlxuIjsKLQkgIGlmKCB4KHBvc2l0aW9uc1swXSk9PXkocG9zaXRpb25zWzFdKSYmeChwb3NpdGlvbnNbMV0pPT15KHBvc2l0aW9uc1swXSkgKQotCSAgICB7IAotCSAgICAgIG9tcy50eXBlPTI7b21zLmE9cG9zaXRpb25zWzBdO29tcy5iPXBvc2l0aW9uc1sxXTsKLQkgICAgICBpZiggb21zLmI8b21zLmEpIHN3YXAob21zLmIsb21zLmEpOwotCSAgICAgIHNvbXMuaW5zZXJ0KG9tcyk7Ci0JICAgICAgb21zLnR5cGU9MztvbXMuYT1wb3NpdGlvbnNbMl07b21zLmI9eChwb3NpdGlvbnNbMl0pO3NvbXMuaW5zZXJ0KG9tcyk7Ci0JICAgIH0KLQkgIGlmKCB4KHBvc2l0aW9uc1syXSk9PXkocG9zaXRpb25zWzFdKSYmeChwb3NpdGlvbnNbMV0pPT15KHBvc2l0aW9uc1syXSkgKQotCSAgICB7IAotCSAgICAgIG9tcy50eXBlPTI7b21zLmE9cG9zaXRpb25zWzJdO29tcy5iPXBvc2l0aW9uc1sxXTsKLQkgICAgICBpZiggb21zLmI8b21zLmEpIHN3YXAob21zLmIsb21zLmEpOwotCSAgICAgIHNvbXMuaW5zZXJ0KG9tcyk7Ci0JICAgICAgb21zLnR5cGU9MztvbXMuYT1wb3NpdGlvbnNbMF07b21zLmI9eChwb3NpdGlvbnNbMF0pO3NvbXMuaW5zZXJ0KG9tcyk7Ci0JICAgIH0KLQkgIGlmKCB4KHBvc2l0aW9uc1swXSk9PXkocG9zaXRpb25zWzJdKSYmeChwb3NpdGlvbnNbMl0pPT15KHBvc2l0aW9uc1swXSkgKQotCSAgICB7IAotCSAgICAgIG9tcy50eXBlPTI7b21zLmE9cG9zaXRpb25zWzBdO29tcy5iPXBvc2l0aW9uc1syXTsKLQkgICAgICBpZiggb21zLmI8b21zLmEpIHN3YXAob21zLmIsb21zLmEpOwotCSAgICAgIHNvbXMuaW5zZXJ0KG9tcyk7Ci0JICAgICAgb21zLnR5cGU9MztvbXMuYT1wb3NpdGlvbnNbMV07b21zLmI9eChwb3NpdGlvbnNbMV0pO3NvbXMuaW5zZXJ0KG9tcyk7Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UgaWYoY291bnQ9PTQpCi0gICAgewotICAgICBWZWN0b3I8aW50PiB4eCg0KSx5eSg0KTsKLSAgICAgZm9yKGludCBpPTA7aTw0OysraSkKLSAgICAgICB7Ci0JIHh4W2ldPXgocG9zaXRpb25zW2ldKTsKLQkgeXlbaV09eShwb3NpdGlvbnNbaV0pOwotICAgICAgIH0KLSAgICAgIHNvcnQoeHguYmVnaW4oKSx4eC5lbmQoKSk7Ci0gICAgICBzb3J0KHl5LmJlZ2luKCkseXkuZW5kKCkpOwotICAgICAgaWYoeHg9PXl5KQotCXsKLQkgIG9tcy50eXBlPTI7Ci0JICBmb3IoaW50IGoxPTA7ajE8NDtqMSsrKQotCSAgICBmb3IoaW50IGoyPWoxKzE7ajI8NDtqMisrKQotCSAgICAgIHsKLQkJaWYoeChwb3NpdGlvbnNbajFdKSE9eChwb3NpdGlvbnNbajJdKSYmCi0JCSAgIHgocG9zaXRpb25zW2oxXSk9PXkocG9zaXRpb25zW2oyXSkmJgotCQkgICB4KHBvc2l0aW9uc1tqMl0pPT15KHBvc2l0aW9uc1tqMV0pKQotCQkgIHsKLQkJICAgIG9tcy50eXBlPTI7b21zLmE9cG9zaXRpb25zW2oxXTtvbXMuYj1wb3NpdGlvbnNbajJdOwotCQkgICAgc29tcy5pbnNlcnQob21zKTsKLQkJICB9Ci0JICAgICAgfQotCX0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbW9kZWwzX3ZpdGVyYmkuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbW9kZWwzX3ZpdGVyYmkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk4MTE2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21vZGVsM192aXRlcmJpLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2NiArMCwwIEBACi0vKgotCi0gRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotIFdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi0gVVNBLgotCi0gKi8KLSNpbmNsdWRlICJtb2RlbDMuaCIKLSNpbmNsdWRlICJ1dGlsaXR5LmgiCi0jaW5jbHVkZSAiR2xvYmFscy5oIgotI2luY2x1ZGUgIkFsaWduVGFibGVzLmgiCi0jaWZkZWYgV0lOMzIKLXR5cGVkZWYgaGFzaF9tYXA8VmVjdG9yPFdvcmRJbmRleD4sIExvZ1Byb2IsIGhhc2hteWFsaWdubWVudCA+IGFsaWdubWVudF9oYXNoOwotI2Vsc2UKLXR5cGVkZWYgaGFzaF9tYXA8VmVjdG9yPFdvcmRJbmRleD4sIExvZ1Byb2IsIGhhc2hteWFsaWdubWVudCwgZXF1YWxfdG9fbXlhbGlnbm1lbnQgPiBhbGlnbm1lbnRfaGFzaDsKLQotI2VuZGlmCi0KLUxvZ1Byb2IgbW9kZWwzOjpwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShWZWN0b3I8V29yZEluZGV4PiYgQSwKLQkJVmVjdG9yPFdvcmRJbmRleD4mIEZlcnQsIHRtb2RlbDxDT1VOVCwgUFJPQj4mIHRUYWJsZSwKLQkJVmVjdG9yPFdvcmRJbmRleD4mIGZzLCBWZWN0b3I8V29yZEluZGV4PiYgZXMpIHsKLQlMb2dQcm9iIHRvdGFsID0gMS4wOwotCUxvZ1Byb2IgdGVtcCA9IDAuMDsKLQljb25zdCBMb2dQcm9iIHplcm8gPSAwLjA7Ci0JV29yZEluZGV4IGwgPSBlcy5zaXplKCktMSwgbSA9IGZzLnNpemUoKS0xOwotCVdvcmRJbmRleCBpLCBqOwotCi0JdG90YWwgKj0gcG93KGRvdWJsZSgxLXAxKSwgbS0yLjAgKiBGZXJ0WzBdKSAqIHBvdyhkb3VibGUocDEpLCBkb3VibGUoRmVydFswXSkpOwotCWlmICh0b3RhbCA9PSAwKQotCQlyZXR1cm4gKHplcm8pOwotCWZvciAoaSA9IDE7IGkgPD0gRmVydFswXTsgaSsrKSB7IC8vIGxvb3AgY2FjdWxhdGVzIG0tZmVydFswXSBjaG9vc2UgZmVydFswXQotCQl0b3RhbCAqPSBkb3VibGUobSAtIEZlcnRbMF0gLSBpICsgMSkgLyBpOwotCQlpZiAodG90YWwgPT0gMCkKLQkJCXJldHVybiAoemVybyk7Ci0JfQotCWZvciAoaSA9IDE7IGkgPD0gbDsgaSsrKSB7IC8vIHRoaXMgbG9vcCBjYWxjdWxhdGVzIGZlcnRpbGl0aWVzIHRlcm0KLQkJdG90YWwgKj0gZG91YmxlKG5UYWJsZS5nZXRWYWx1ZShlc1tpXSwgRmVydFtpXSkpICogKExvZ1Byb2IpIGZhY3RvcmlhbChGZXJ0W2ldKTsKLQkJaWYgKHRvdGFsID09IDApCi0JCQlyZXR1cm4gKHplcm8pOwotCX0KLQlmb3IgKGogPSAxOyBqIDw9IG07IGorKykgewotCQkvLyAgICB0ZW1wID0gdFRhYmxlLmdldFZhbHVlKGVzW0Fbal1dLCBmc1tqXSkgOwotCQl0ZW1wID0gZG91YmxlKHRUYWJsZS5nZXRQcm9iKGVzW0Fbal1dLCBmc1tqXSkpOwotCQl0b3RhbCAqPSB0ZW1wOwotCQlpZiAoMCAhPSBBW2pdKQotCQkJdG90YWwgKj0gZG91YmxlKGRUYWJsZS5nZXRWYWx1ZShqLCBBW2pdLCBsLCBtKSk7Ci0JCWlmICh0b3RhbCA9PSAwKQotCQkJcmV0dXJuICh6ZXJvKTsKLQl9Ci0JcmV0dXJuICh0b3RhbCk7Ci19Ci0KLUxvZ1Byb2IgbW9kZWwzOjpwcm9iX29mX3RhcmdldF9naXZlbl9zb3VyY2UodG1vZGVsPENPVU5ULCBQUk9CPiYgdFRhYmxlLAotCQlWZWN0b3I8V29yZEluZGV4PiYgZnMsIFZlY3RvcjxXb3JkSW5kZXg+JiBlcykgewotCi0JV29yZEluZGV4IHgsIHk7Ci0JTG9nUHJvYiB0b3RhbCA9IDA7Ci0JLy8gIFdvcmRJbmRleCBsID0gZXMuc2l6ZSgpLCBtID0gZnMuc2l6ZSgpOwotCVdvcmRJbmRleCBsID0gZXMuc2l6ZSgpLTEsIG0gPSBmcy5zaXplKCktMTsKLQlWZWN0b3I8V29yZEluZGV4PiBBKGZzLnNpemUoKSwvKi0xKi8wKTsKLQlWZWN0b3I8V29yZEluZGV4PiBGZXJ0KGVzLnNpemUoKSwwKTsKLQlXb3JkSW5kZXggaSwgajsKLQotCWZvciAoeCA9IDA7IHggPCBwb3cobCsxLjAsIGRvdWJsZShtKSkgOyB4KyspIHsgLy8gRm9yIGFsbCBwb3NzaWJsZSBhbGlnbm1ldHMgQQotCQl5ID0geDsKLQkJLy8gICAgZm9yIChqID0gMSA7IGogPCBtIDsgaisrKXsKLQkJZm9yIChqID0gMTsgaiA8PSBtOyBqKyspIHsKLQkJCUFbal0gPSB5ICUgKGwrMSk7Ci0JCQl5IC89IChsKzEpOwotCQl9Ci0JCS8vICAgIGZvcihpID0gMCA7IGkgPCBsIDsgaSsrKQotCQlmb3IgKGkgPSAwOyBpIDw9IGw7IGkrKykKLQkJCUZlcnRbaV0gPSAwOwotCQkvLyAgICBmb3IgKGogPSAxIDsgaiA8IG0gOyBqKyspCi0JCWZvciAoaiA9IDE7IGogPD0gbTsgaisrKQotCQkJRmVydFtBW2pdXSsrOwotCQkvLyAgICBpZiAoMiAqIEZlcnRbMF0gPCBtKXsgCi0JCWlmICgyICogRmVydFswXSA8PSBtKSB7IC8qIGNvbnNpZGVyIGFsaWdubWVudHMgdGhhdCBoYXMgRmVydFswXSBsZXNzIHRoYW4KLQkJIGhhbGYgdGhlIGxlbmd0aCBvZiBmcmVuY2ggc2VudGVuY2UgICovCi0JCQl0b3RhbCArPSBwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShBLCBGZXJ0LCB0VGFibGUsCi0JCQkJCWZzLCBlcyk7Ci0JCX0KLQl9Ci0JcmV0dXJuICh0b3RhbCk7Ci19Ci0KLUxvZ1Byb2IgbW9kZWwzOjpzY29yZU9mTW92ZShWZWN0b3I8V29yZEluZGV4PiYgZXMsIFZlY3RvcjxXb3JkSW5kZXg+JiBmcywKLQkJVmVjdG9yPFdvcmRJbmRleD4mIEEsIFZlY3RvcjxXb3JkSW5kZXg+JiBGZXJ0LAotCQl0bW9kZWw8Q09VTlQsIFBST0I+JiB0VGFibGUsIFdvcmRJbmRleCBqLCBXb3JkSW5kZXggaSkKLS8vIHJldHVybnMgdGhlIHNjYWxpbmcgZmFjdG9yIG9mIHRoZSBvcmlnaW5hbCBzY29yZSBpZiBBW2pdIGlzIGxpbmtlZCB0bwotLy8gaSwgbm8gY2hhbmdlIGlzIHJlYWxseSBtYWRlIHRvIEEKLS8vIGJ1dCB0aGUgc2NvcmUgaXMgY2FsY3VsYXRlZCBpZiB0aGUgbW92ZSBpcyB0byBiZSB0YWtlbiAoaS5lLiAKLS8vIG5vIHNpZGUgZWZmZWN0cyBvbiBBbGlnbm1lbnQgQSBub3IgaXRzIEZlcnRpbGl0eSBGZXJ0Ci0vLyBJZiB0aGUgdmFsdWUgb2YgdGhlIHNjYWxpbmcgZmFjdG9yIGlzOgotLy8gICAgMTogdGhlbiB0aGUgc2NvcmUgb2YgdGhlIG5ldyBhbGlnbm1lbnQgaWYgdGhlIG1vdmUgaXMgdGFrZW4gd2lsbAotLy8gICAgICAgbm90IGNoYW5nZS4KLS8vICAgIDAuNTogdGhlIG5ldyBzY29yZSBpcyBoYWxmIHRoZSBzY29yZSBvZiB0aGUgb3JpZ2luYWwgYWxpZ25tZW50LgotLy8gICAgMi4wOiB0aGUgbmV3IHNjb3JlIHdpbGwgYmUgdHdpY2UgYXMgbXVjaC4KLS8vCi17Ci0JLy8gIExvZ1Byb2Igc2NvcmU7Ci0JTG9nUHJvYiBjaGFuZ2U7Ci0JV29yZEluZGV4IG0sIGw7Ci0KLQltID0gZnMuc2l6ZSgpIC0gMTsKLQlsID0gZXMuc2l6ZSgpIC0gMTsKLQotCWlmIChBW2pdID09IGkpCi0JCS8vICAgIHJldHVybihvcmlnaW5hbF9zY29yZSk7Ci0JCXJldHVybiAoMSk7Ci0JZWxzZSBpZiAoQVtqXSA9PSAwKSB7IC8vIGEgbW92ZSBmcm9tIHBvc2l0aW9uIHplcm8gdG8gc29tZXRoaW5nIGVsc2UKLQkJY2hhbmdlID0gZG91YmxlKHAwKnAwKS9wMSAqIChkb3VibGUoKEZlcnRbMF0qKG0tRmVydFswXSsxKSkpIC8gKChtLTIqRmVydFswXSsxKSoobS0yKkZlcnRbMF0KLQkJCQkrMikpKSAqIChGZXJ0W2ldKzEpICogZG91YmxlKG5UYWJsZS5nZXRWYWx1ZShlc1tpXSwgRmVydFtpXSsxKSkgLyBkb3VibGUoblRhYmxlLmdldFZhbHVlKGVzW2ldLCBGZXJ0W2ldKSkgKiBkb3VibGUodFRhYmxlLmdldFByb2IoZXNbaV0sIGZzW2pdKSkgLyBkb3VibGUodFRhYmxlLmdldFByb2IoZXNbQVtqXV0sIGZzW2pdKSkgKiBkb3VibGUoZFRhYmxlLmdldFZhbHVlKGosIGksIGwsIG0pKTsKLQl9IGVsc2UgaWYgKGkgPT0gMCkgeyAvLyBhIG1vdmUgdG8gcG9zaXRpb24gemVybwotCQljaGFuZ2U9ICgoZG91YmxlKHAxKSAvIChwMCpwMCkpICogKGRvdWJsZSgobS0yKkZlcnRbMF0pKihtLTIqRmVydFswXS0xKSkvKChGZXJ0WzBdKzEpKihtLUZlcnRbMF0pKSkgKiAoZG91YmxlKDEpL0ZlcnRbQVtqXV0pICogZG91YmxlKG5UYWJsZS5nZXRWYWx1ZShlc1tBW2pdXSwgRmVydFtBW2pdXS0xKSkgLyBkb3VibGUoblRhYmxlLmdldFZhbHVlKGVzW0Fbal1dLCBGZXJ0W0Fbal1dKSkqIGRvdWJsZSh0VGFibGUuZ2V0UHJvYihlc1tpXSwgZnNbal0pKSAvIGRvdWJsZSh0VGFibGUuZ2V0UHJvYihlc1tBW2pdXSwgZnNbal0pKSAqIDEuMCAvIGRvdWJsZShkVGFibGUuZ2V0VmFsdWUoaiwgQVtqXSwgbCwgbSkpKTsKLQl9IGVsc2UgeyAvLyBhIG1vdmUgdGhhdCBkb2VzIG5vdCBpbnZvbHZlIHBvc2l0aW9uIHplcm8KLQkJY2hhbmdlID0gKChkb3VibGUoRmVydFtpXSsxKS9GZXJ0W0Fbal1dKSAqIGRvdWJsZShuVGFibGUuZ2V0VmFsdWUoZXNbQVtqXV0sIEZlcnRbQVtqXV0tMSkpIC8gZG91YmxlKG5UYWJsZS5nZXRWYWx1ZShlc1tBW2pdXSwgRmVydFtBW2pdXSkpICogZG91YmxlKG5UYWJsZS5nZXRWYWx1ZShlc1tpXSwgRmVydFtpXSsxKSkgLyBkb3VibGUoblRhYmxlLmdldFZhbHVlKGVzW2ldLCBGZXJ0W2ldKSkgKiBkb3VibGUodFRhYmxlLmdldFByb2IoZXNbaV0sIGZzW2pdKSkvIGRvdWJsZSh0VGFibGUuZ2V0UHJvYihlc1tBW2pdXSwgZnNbal0pKSAqIGRvdWJsZShkVGFibGUuZ2V0VmFsdWUoaiwgaSwgbCwgbSkpLyBkb3VibGUoZFRhYmxlLmdldFZhbHVlKGosIEFbal0sIGwsIG0pKSk7Ci0JfQotCXJldHVybiAoY2hhbmdlKTsKLX0KLQotTG9nUHJvYiBtb2RlbDM6OnNjb3JlT2ZTd2FwKFZlY3RvcjxXb3JkSW5kZXg+JiBlcywgVmVjdG9yPFdvcmRJbmRleD4mIGZzLAotCQlWZWN0b3I8V29yZEluZGV4PiYgQSwgdG1vZGVsPENPVU5ULCBQUk9CPiYgdFRhYmxlLCBpbnQgajEsIGludCBqMikKLS8vIHJldHVybnMgdGhlIHNjYWxpbmcgZmFjdG9yIG9mIHRoZSBvcmlnaW5hbCBzY29yZSBpZiB0aGUgc3dhcCB0byAKLS8vIHRha2UgcGxhY2UsIAotLy8gTm8gc2lkZSBlZmZlY3RzIGhlcmUgKG5vbmUgb2YgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIGlzIGNoYW5nZWQhCi0vLyAoaS5lLiB0aGUgYWxpZ25tZW50IEEgaXMgbm90IHJlYWxseSBjaGFuZ2VkKQotLy8gSWYgdGhlIHZhbHVlIG9mIHRoZSBzY2FsaW5nIGZhY3RvciBpczoKLS8vICAgIDE6IHRoZW4gdGhlIHNjb3JlIG9mIHRoZSBuZXcgYWxpZ25tZW50IGlmIHRoZSBtb3ZlIGlzIHRha2VuIHdpbGwKLS8vICAgICAgIG5vdCBjaGFuZ2UuCi0vLyAgICAwLjU6IHRoZSBuZXcgc2NvcmUgaXMgaGFsZiB0aGUgc2NvcmUgb2YgdGhlIG9yaWdpbmFsIGFsaWdubWVudC4KLS8vICAgIDIuMDogdGhlIG5ldyBzY29yZSB3aWxsIGJlIHR3aWNlIGFzIG11Y2guCi0vLwotewotCUxvZ1Byb2Igc2NvcmU7Ci0JV29yZEluZGV4IGkxLCBpMiwgbSwgbDsKLQotCW0gPSBmcy5zaXplKCkgLSAxOwotCWwgPSBlcy5zaXplKCkgLSAxOwotCWlmIChqMSA9PSBqMiB8fCBBW2oxXSA9PSBBW2oyXSkgLy8gaWYgc3dhcHBpbmcgc2FtZSBwb3NpdGlvbiByZXR1cm4gcmF0aW8gMQotCQlyZXR1cm4gKDEpOwotCWVsc2UgewotCQlpMSA9IEFbajFdOwotCQlpMiA9IEFbajJdOwotCQlzY29yZSA9IGRvdWJsZSh0VGFibGUuZ2V0UHJvYihlc1tpMl0sIGZzW2oxXSkpL2RvdWJsZSh0VGFibGUuZ2V0UHJvYihlc1tpMV0sIGZzW2oxXSkpICogZG91YmxlKHRUYWJsZS5nZXRQcm9iKGVzW2kxXSwgZnNbajJdKSkvZG91YmxlKHRUYWJsZS5nZXRQcm9iKGVzW2kyXSwgZnNbajJdKSk7Ci0JCWlmIChpMSAhPSAwKSB7Ci0JCQlzY29yZSAqPSBkb3VibGUoZFRhYmxlLmdldFZhbHVlKGoyLCBpMSwgbCwgbSkpL2RvdWJsZShkVGFibGUuZ2V0VmFsdWUoajEsIGkxLCBsLCBtKSk7Ci0JCX0KLQkJaWYgKGkyICE9IDApIHsKLQkJCXNjb3JlICo9IGRvdWJsZShkVGFibGUuZ2V0VmFsdWUoajEsIGkyLCBsLCBtKSkvZG91YmxlKGRUYWJsZS5nZXRWYWx1ZShqMiwgaTIsIGwsIG0pKTsKLQkJfQotCQlyZXR1cm4gKHNjb3JlKTsKLQl9Ci19Ci0KLXZvaWQgbW9kZWwzOjpoaWxsQ2xpbWIoVmVjdG9yPFdvcmRJbmRleD4mIGVzLCBWZWN0b3I8V29yZEluZGV4PiYgZnMsCi0JCVZlY3RvcjxXb3JkSW5kZXg+JiBBLCBWZWN0b3I8V29yZEluZGV4PiYgRmVydCwgTG9nUHJvYiYgYmVzdF9zY29yZSwKLQkJdG1vZGVsPENPVU5ULCBQUk9CPiYgdFRhYmxlLCBpbnQgPSAtMSwgaW50IGpfcGVnID0gLTEpCi0vLyBIaWxsIGNsaW1iaW5nIGdpdmVuIGFsaWdubWVudCBBICAuCi0vLyBBbGlnbm1lbnQgQSB3aWxsIGJlIHVwZGF0ZWQgYW5kIGFsc28gYmVzdF9zY29yZQotLy8gaWYgbm8gcGVnZ2luZyBpcyBuZWVkZWQgaV9wZWcgPT0gLTEsIGFuZCBqX3BlZyA9PSAtMQotewotCVdvcmRJbmRleCBpLCBqLCBsLCBtLCBqMSwgb2xkX2k7Ci0JTG9nUHJvYiBjaGFuZ2U7Ci0JYm9vbCBsb2NhbF9taW5pbWE7Ci0JaW50IGxldmVsID0gMDsKLQlMb2dQcm9iIGJlc3RfY2hhbmdlX3NvX2ZhciwgYmVzdF9jaGFuZ2U7Ci0JVmVjdG9yPFdvcmRJbmRleD4gQV9zb19mYXI7Ci0JVmVjdG9yPFdvcmRJbmRleD4gRmVydF9zb19mYXI7Ci0KLQlsID0gZXMuc2l6ZSgpIC0gMTsKLQltID0gZnMuc2l6ZSgpIC0gMTsKLQliZXN0X2NoYW5nZSA9IDE7IC8vIG92ZXJhbGwgc2NhbGluZyBmYWN0b3IgKGkuZS4gZnJvbSB0aGUgYmVnaW5pbmcgb2YgY2xpbWIKLQlkbyB7Ci0JCWJlc3RfY2hhbmdlX3NvX2ZhciA9IDE7IC8vIGJlc3Qgc2NhbGluZyBmYWN0b3Igb2YgdGhpcyBsZXZlbCBvZiBoaWxsIGNsaW1iCi0JCWxvY2FsX21pbmltYSA9IHRydWU7Ci0JCWZvciAoaiA9IDE7IGogPD0gbTsgaisrKSB7Ci0JCQlpZiAoaW50KGopICE9IGpfcGVnKSB7IC8vIG1ha2Ugc3VyZSBub3QgdG8gY2hhbmdlIHRoZSBwZWdnZWQgbGluawotCQkJCWZvciAoajEgPSBqICsgMTsgajEgPD0gbTsgajErKykgewotCQkJCQkvLyBmb3IgYWxsIHBvc3NpYmxlIHN3YXBzCi0JCQkJCS8vIG1ha2Ugc3VyZSB5b3UgYXJlIG5vdCBzd2FwcGluZyBhdCBzYW1lIHBvc2l0aW9uCi0JCQkJCWlmICgoQVtqXSAhPSBBW2oxXSkgJiYgKGludChqMSkgIT0gal9wZWcpKSB7Ci0JCQkJCQkvLwkgICAgY2hhbmdlID0gc2NvcmVPZlN3YXAoZXMsIGZzLCBBLCBiZXN0X3Njb3JlLCB0VGFibGUsIGosIGoxKTsKLQkJCQkJCWNoYW5nZSA9IHNjb3JlT2ZTd2FwKGVzLCBmcywgQSwgdFRhYmxlLCBqLCBqMSk7Ci0JCQkJCQlpZiAoY2hhbmdlID4gYmVzdF9jaGFuZ2Vfc29fZmFyKSB7IC8vIGlmIGJldHRlciBhbGlnbm1lbnQgZm91bmQsIGtlZXAgaXQKLQkJCQkJCQlsb2NhbF9taW5pbWEgPSBmYWxzZTsKLQkJCQkJCQliZXN0X2NoYW5nZV9zb19mYXIgPSBjaGFuZ2U7Ci0JCQkJCQkJQV9zb19mYXIgPSBBOwotCQkJCQkJCUZlcnRfc29fZmFyID0gRmVydDsKLQkJCQkJCQlvbGRfaSA9IEFfc29fZmFyW2pdOwotCQkJCQkJCUFfc29fZmFyW2pdID0gQV9zb19mYXJbajFdOwotCQkJCQkJCUFfc29fZmFyW2oxXSA9IG9sZF9pOwotCQkJCQkJfSAvLyBlbmQgb2YgaWYgKGNoYW5nZSA+IGJlc3RfY2hhbmdlX3NvX2ZhcikgCi0JCQkJCX0gLy8gZW5kIG9mIGlmIChBW2pdICE9IEFbajFdICAuLikKLQkJCQl9IC8vIG9mIGZvciAoajEgPSBqKzEgIC4uLi4pCi0JCQkJLy8gICAgICBmb3IgKGkgPSAwIDsgaSA8IGwgOyBpKyspeyAvLyBhbGwgcG9zc2libGUgbW92ZXMKLQkJCQlmb3IgKGkgPSAwOyBpIDw9IGw7IGkrKykgeyAvLyBhbGwgcG9zc2libGUgbW92ZXMKLQkJCQkJaWYgKGkgIT0gQVtqXSkgeyAvLyBtYWtlIHN1cmUgbm90IHRvIG1vdmUgdG8gc2FtZSBwb3NpdGlvbgotCQkJCQkJaWYgKGkgIT0gMCB8fCAobSA+PSAyICogKEZlcnRbMF0rMSkpKSB7IC8vIGlmIG1vdmluZyB0byBOVUxMIHdvcmQgCi0JCQkJCQkJLy8gKHBvcyAwKSwgbWFrZSBzdXJlIG5vdCB0byB2aW9sYXRlIHRoZSBmZXJ0aWxpdHkgcmVzdHJpY3Rpb24KLQkJCQkJCQkvLyBpLmUuIE5VTEwgY2FuIG5vdCB0YWtlIG1vcmUgdGhhbiBoYWxmIHRoZSB0YXJnZXQgd29yZHMgCi0JCQkJCQkJLy8JICAgICAgY2hhbmdlID0gc2NvcmVPZk1vdmUoZXMsIGZzLCBBLCBGZXJ0LCBiZXN0X3Njb3JlLCB0VGFibGUsIGosIGkpOwotCQkJCQkJCWNoYW5nZSA9IHNjb3JlT2ZNb3ZlKGVzLCBmcywgQSwgRmVydCwgdFRhYmxlLCBqLCBpKTsKLQkJCQkJCQlpZiAoY2hhbmdlID4gYmVzdF9jaGFuZ2Vfc29fZmFyKSB7IC8vIGlmIGJldHRlciBhbGlnbm1lbnQgZm91bmQsIGtlZXAgaXQKLQkJCQkJCQkJYmVzdF9jaGFuZ2Vfc29fZmFyID0gY2hhbmdlOwotCQkJCQkJCQlsb2NhbF9taW5pbWEgPSBmYWxzZTsKLQkJCQkJCQkJQV9zb19mYXIgPSBBOwotCQkJCQkJCQlGZXJ0X3NvX2ZhciA9IEZlcnQ7Ci0JCQkJCQkJCW9sZF9pID0gQV9zb19mYXJbal07Ci0JCQkJCQkJCUFfc29fZmFyW2pdID0gaTsKLQkJCQkJCQkJRmVydF9zb19mYXJbb2xkX2ldLS07Ci0JCQkJCQkJCUZlcnRfc29fZmFyW2ldKys7Ci0JCQkJCQkJfSAvLyBlbmQgb2YgaWYgKGNoYW5nZSA+IGJlc3RfY2hhbmdlX3NvX2ZhcikKLQkJCQkJCX0gLy8gZW5kIG9mIGlmICgoaSE9MCkgLi4uCi0JCQkJCX0gLy8gZW5kIG9mIGlmIChpICE9IEFbal0gKQotCQkJCX0gLy8gZW5kIG9mIGZvciAoaSA9IDAgOyAgLi4uLikKLQkJCX0gLy8gZW5kIG9mIGlmKGogIT0gal9wZWcpICAgICAgCi0JCX0gLy8gZW5kIG9mIGZvciAoaiA9IDEgOyAuLi4pCi0JCWxldmVsKys7Ci0JCWlmICghbG9jYWxfbWluaW1hKSB7Ci0JCQlpZiAoYmVzdF9jaGFuZ2Vfc29fZmFyID4gMSkgeyAvLyBpZiBjdXJyZW50IGNoYWdlIGlzIGltcHJvdmluZyAKLQkJCQlBID0gQV9zb19mYXI7Ci0JCQkJRmVydCA9IEZlcnRfc29fZmFyOwotCQkJCWJlc3RfY2hhbmdlICo9IGJlc3RfY2hhbmdlX3NvX2ZhcjsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9jYWxfbWluaW1hID0gdHJ1ZTsKLQkJCX0KLQkJfSAvLyBlbmQgb2YgaWYoIWxvY2FsX21pbmltYSkKLQkJaWYgKGxldmVsPiAxNSkKLQkJCWNlcnIgPDwgIi4iOwotCX0gd2hpbGUgKGxvY2FsX21pbmltYSA9PSBmYWxzZSk7Ci0JaWYgKGxldmVsID4gMTUpCi0JCWNlcnIgPDwgIlxuSGlsbCBDbGltYiBMZXZlbDogIiA8PCBsZXZlbCA8PCAiIHNjb3JlOiBzY2FsaW5nIG9sZDogIgotCQkJCTw8KGJlc3Rfc2NvcmUqYmVzdF9jaGFuZ2UpOwotCWJlc3Rfc2NvcmUgPSBwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShBLCBGZXJ0LCB0VGFibGUsIGZzLAotCQkJZXMpOwotCWlmIChsZXZlbD4xNSkKLQkJY2VyciA8PCAiIHVzaW5nIG5ldyBjYWxjOiAiIDw8IGJlc3Rfc2NvcmUgPDwgJ1xuJzsKLX0KLQotdm9pZCBtb2RlbDM6OmZpbmRCZXN0QWxpZ25tZW50KFZlY3RvcjxXb3JkSW5kZXg+JiBlcywgVmVjdG9yPFdvcmRJbmRleD4mIGZzLAotCQlWZWN0b3I8V29yZEluZGV4PiYgQSwgVmVjdG9yPFdvcmRJbmRleD4mIEZlcnQsIExvZ1Byb2ImIGJlc3Rfc2NvcmUsCi0JCS8qdG1vZGVsPENPVU5ULCBQUk9CPiYgdFRhYmxlLCAKLQkJIGFtb2RlbDxQUk9CPiYgYVRhYmxlLCAqLwotCQlpbnQgaV9wZWcgPSAtMSwgaW50IGpfcGVnID0gLTEpCi0vLyBUaGlzIGZpbmRzIHRoZSBiZXN0IE1vZGVsMiBhbGlnbm1lbnQgKGkuZS4gbm8gZmVydGlsaXRpZXMgc3R1ZmYpIGluIEEKLS8vIGZvciB0aGUgZ2l2ZW4gc2VudGVuY2UgcGFpci4gSXRzIHNjb3JlIGlzIHJldHVybmVkIGluIEEuIEl0cyBmZXJ0aWxpdHkKLS8vIGluZm8gaW4gRmVydC4gCi0vLyBpZiBqX3BlZyA9PSAtMSAmJiBpX3BlZyA9PSAtMSB0aGVuIE5vIHBlZ2dpbmcgaXMgcGVyZm9ybWVkLgotewotCVdvcmRJbmRleCBpLCBqLCBsLCBtLCBiZXN0X2k9MDsKLQlMb2dQcm9iIHRlbXAsIHNjb3JlLCBzczsKLQotCWwgPSBlcy5zaXplKCkgLSAxOwotCW0gPSBmcy5zaXplKCkgLSAxOwotCWZvciAoaT0wOyBpIDw9IGw7IGkrKykKLQkJRmVydFtpXSA9IDA7Ci0Jc3MgPSAxOwotCWlmICgoal9wZWcgIT0gLTEpICYmIChpX3BlZyAhPSAtMSkpIHsgLy8gIGlmIHlvdSdyZSBkb2luZyBwZWdnaW5nCi0JCUFbal9wZWddID0gaV9wZWc7Ci0JCUZlcnRbaV9wZWddID0gMTsKLQkJc3MgKj0gZG91YmxlKHRUYWJsZS5nZXRQcm9iKGVzW2lfcGVnXSwgZnNbal9wZWddKSkgKiBkb3VibGUoYVRhYmxlLmdldFZhbHVlKGlfcGVnLCBqX3BlZywgbCwgbSkpOwotCX0KLQlmb3IgKGogPSAxOyBqIDw9IG07IGorKykgewotCQlpZiAoaW50KGopICE9IGpfcGVnKSB7Ci0JCQlzY29yZSA9IDA7Ci0JCQlmb3IgKGkgPSAwOyBpIDw9IGw7IGkrKykgewotCQkJCS8vIGZpcnN0IG1ha2Ugc3VyZSB0aGF0IGNvbm5lY3RpbmcgdGFyZ2V0IHdvcmQgYXQgcG9zIGogdG8gc291cmNlIHdvcmQgCi0JCQkJLy8gYXQgIHBvcyBpIHdpbGwgbm90IGxlYWQgdG8gYSB2aW9sYXRpb24gb24gRmVydGlsaXR5IHJlc3RyaWN0aW9ucyAKLQkJCQkvLyAoZS5nLiBtYXhpbXVtIGZlcnRpbGl0eSBmb3IgYSB3b3JkLCBtYXggZmVydGlsaXR5IGZvciBOVUxMIHdvcmQsIGV0YykKLQkJCQlpZiAoKEZlcnRbaV0rMSA8IE1BWF9GRVJUSUxJVFkpICYmICgoaSA9PSAwICYmIChtID49IDIqKEZlcnRbMF0KLQkJCQkJCSsxKSkpIHx8IChpICE9IDApKSkgewotCQkJCQl0ZW1wID0gZG91YmxlKHRUYWJsZS5nZXRQcm9iKGVzW2ldLCBmc1tqXSkpICogZG91YmxlKGFUYWJsZS5nZXRWYWx1ZShpLCBqLCBsLCBtKSk7Ci0JCQkJCWlmICh0ZW1wID4gc2NvcmUpIHsKLQkJCQkJCWJlc3RfaSA9IGk7Ci0JCQkJCQlzY29yZSA9IHRlbXA7Ci0JCQkJCX0gLy8gZW5kIG9mIGlmICh0ZW1wID4gc2NvcmUpCi0JCQkJfSAvLyBlbmQgb2YgaWYgKCgoaSA9PSAwIC4uLikKLQkJCX0gLy8gZW5kIG9mIGZvciAoaT0gMCAuLi4pCi0JCQlpZiAoc2NvcmUgPT0gMCkgewotCQkJCWNlcnIgPDwgIldBUk5JTkc6IEluIHNlYXJjaGluZyBmb3IgbW9kZWwyIGJlc3QgYWxpZ25tZW50XG4gIjsKLQkJCQljZXJyIDw8ICJOb3RoaW5nIHdhcyBzZXQgZm9yIHRhcmdldCB0b2tlbiAiIDw8IGZzW2pdCi0JCQkJCQk8PCAiYXQgcG9zaXRpb24gajogIiA8PCBqIDw8ICJcbiI7Ci0JCQkJZm9yIChpID0gMDsgaSA8PSBsOyBpKyspIHsKLQkJCQkJY2VyciA8PCAiaTogIiA8PCBpIDw8ICJ0dGFibGUoIjw8ZXNbaV08PCIsICI8PGZzW2pdPDwiKSA9ICIKLQkJCQkJCQk8PCB0VGFibGUuZ2V0UHJvYihlc1tpXSwgZnNbal0pIDw8ICIgYXRhYmxlKCIgPDwgaQotCQkJCQkJCTw8IiwgIjw8ajw8IiwgIjw8IGw8PCIsICI8PG08PCIpID0gIgotCQkJCQkJCTw8IGFUYWJsZS5nZXRWYWx1ZShpLCBqLCBsLCBtKSA8PCAiIHByb2R1Y3QgIgotCQkJCQkJCTw8IGRvdWJsZSh0VGFibGUuZ2V0UHJvYihlc1tpXSwgZnNbal0pKSAqIGRvdWJsZShhVGFibGUuZ2V0VmFsdWUoaSwgaiwgbCwgbSkpIDw8ICdcbic7Ci0JCQkJCWlmICgoRmVydFtpXSsxIDwgTUFYX0ZFUlRJTElUWSkgJiYgKChpID09IDAgJiYgKG0gPj0gMgotCQkJCQkJCSooRmVydFswXSsxKSkpIHx8IChpICE9IDApKSkKLQkJCQkJCWNlcnIgPDwiUGFzc2VkIGZlcnRpbGl0eSBjb25kaXRpb24gXG4iOwotCQkJCQllbHNlCi0JCQkJCQljZXJyIDw8IkZhaWxlZCBmZXJ0aWxpdHkgY29uZGl0aW9uIFxuIjsKLQkJCQl9Ci0KLQkJCX0gLy8gZW5kIG9mIGlmIChzY29yZSA9PSAwKQotCQkJZWxzZSB7Ci0JCQkJRmVydFtiZXN0X2ldKys7Ci0JCQkJQVtqXSA9IGJlc3RfaTsKLQkJCX0KLQkJCXNzICo9IHNjb3JlOwotCQl9IC8vIGVuZCBvZiBpZiAoaiAhPSBqX3BlZykKLQl9IC8vIGVuZCBvZiBmb3IgKGogPT0gMSA7ICAuLi4pCi0JaWYgKHNzIDw9IDApIHsKLQkJY2VycgotCQkJCTw8ICJXQVJOSU5HOiBNb2RlbDIgdml0ZXJiaSBhbGlnbm1lbnQgaGFzIHplcm8gc2NvcmUgZm9yIHNlbnRlbmNlIHBhaXI6XG4iOwotCQlwcmludFNlbnRlbmNlUGFpcihlcywgZnMsIGNlcnIpOwotCX0KLQliZXN0X3Njb3JlID0gcHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoQSwgRmVydCwgdFRhYmxlLCBmcywKLQkJCWVzKTsKLX0KLQotdm9pZCBtb2RlbDM6OmNvbGxlY3RDb3VudHNPdmVyQWxpZ25lbWVudChjb25zdCBWZWN0b3I8V29yZEluZGV4PiYgZXMsCi0JCWNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JiBmcywgY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIEEsIExvZ1Byb2Igc2NvcmUsCi0JCWZsb2F0IGNvdW50KSB7Ci0JV29yZEluZGV4IGosIGksIGwsIG07Ci0JVmVjdG9yPFdvcmRJbmRleD4gRmVydChlcy5zaXplKCksMCk7Ci0JbCA9IGVzLnNpemUoKSAtIDE7Ci0JbSA9IGZzLnNpemUoKSAtIDE7Ci0Jc2NvcmUgKj0gTG9nUHJvYihjb3VudCk7Ci0JQ09VTlQgdGVtcCA9IENPVU5UKHNjb3JlKSA7Ci0JZm9yIChpPTA7IGkgPD0gbDsgaSsrKQotCQlGZXJ0W2ldID0gMDsKLQlmb3IgKGogPSAxOyBqIDw9IG07IGorKykgewotCQlGZXJ0W0Fbal1dKys7Ci0JCXRUYWJsZS5pbmNDb3VudChlc1tBW2pdXSwgZnNbal0sIHRlbXApOwotCQkvLyAgICB0Q291bnRUYWJsZS5nZXRSZWYoZXNbQVtqXV0sIGZzW2pdKSs9c2NvcmU7Ci0JCWlmIChBW2pdKQotCQkJZENvdW50VGFibGUuYWRkVmFsdWUoaiwgQVtqXSwgbCwgbSwgdGVtcCk7Ci0JCWFDb3VudFRhYmxlLmFkZFZhbHVlKEFbal0sIGosIGwsIG0sIHRlbXApOwotCX0KLQlmb3IgKGkgPSAwOyBpIDw9IGw7IGkrKykKLQkJbkNvdW50VGFibGUuYWRkVmFsdWUoZXNbaV0sIEZlcnRbaV0sIHRlbXApOwotCS8vICBwMV9jb3VudCArPSBzY29yZSAqIChMb2dQcm9iKSAoRmVydFswXSkgOwotCS8vICBwMF9jb3VudCArPSBzY29yZSAqIChMb2dQcm9iKSAoKG0gLSAyICogRmVydFswXSkpIDsKLQlwMV9jb3VudCArPSB0ZW1wICogKEZlcnRbMF0pOwotCXAwX2NvdW50ICs9IHRlbXAgKiAoKG0gLSAyICogRmVydFswXSkpOwotfQotCi12b2lkIG1vZGVsMzo6ZmluZEFsaWdubWVudHNOZWlnaGJvcmhvb2QoVmVjdG9yPFdvcmRJbmRleD4mIGVzLAotCQlWZWN0b3I8V29yZEluZGV4PiYgZnMsIExvZ1Byb2ImYWxpZ25fdG90YWxfY291bnQsCi0JCWFsaWdubW9kZWwmbmVpZ2hib3Job29kLCBpbnQgaV9wZWcgPSAtMSwgaW50IGpfcGVnID0gLTEpCi0vLyBGaW5kaW5nIHRoZSBOZWlnYm9yaG9vZCBvZiBhIGJlc3Qgdml0ZXJiaSBhbGlnbm1lbnQgYWZ0ZXIgaGlsbCBjbGltYmluZwotLy8gaWYgKGlfcGVnID09IC0xIGFuZCBqX3BlZyA9PSAtMSwgdGhlbiAgTm8gUGVnZ2luZyBpcyBkb25lLgotewotCUxvZ1Byb2IgYmVzdF9zY29yZSwgc2NvcmU7Ci0JV29yZEluZGV4IGksIGosIGwsIG0sIG9sZF9pLCBqMTsKLQlWZWN0b3I8V29yZEluZGV4PiBBKGZzLnNpemUoKSwwKTsKLQlWZWN0b3I8V29yZEluZGV4PiBGZXJ0KGVzLnNpemUoKSwwKTsKLQl0aW1lX3QgaXRfc3Q7Ci0KLQliZXN0X3Njb3JlID0gMDsKLQlsID0gZXMuc2l6ZSgpIC0gMTsKLQltID0gZnMuc2l6ZSgpIC0gMTsKLQlmaW5kQmVzdEFsaWdubWVudChlcywgZnMsIEEsIEZlcnQsIGJlc3Rfc2NvcmUsIC8qdFRhYmxlLCBhVGFibGUsKi9pX3BlZywKLQkJCWpfcGVnKTsKLQlpZiAoYmVzdF9zY29yZSA9PSAwKSB7Ci0JCWNlcnIKLQkJCQk8PCAiV0FSTklORzogdml0ZXJiaSBhbGlnbm1lbnQgc2NvcmUgaXMgemVybyBmb3IgdGhlIGZvbGxvd2luZyBwYWlyXG4iOwotCQlwcmludFNlbnRlbmNlUGFpcihlcywgZnMsIGNlcnIpOwotCX0KLQloaWxsQ2xpbWIoZXMsIGZzLCBBLCBGZXJ0LCBiZXN0X3Njb3JlLCB0VGFibGUsIGlfcGVnLCBqX3BlZyk7Ci0JaWYgKGJlc3Rfc2NvcmUgPD0gMCkgewotCQljZXJyCi0JCQkJPDwgIldBUk5JTkc6IEhpbGwgQ2xpbWJpbmcgeWllbGRlZCBhIHplcm8gc2NvcmUgdml0ZXJiaSBhbGlnbm1lbnQgZm9yIHRoZSBmb2xsb3dpbmcgcGFpcjpcbiI7Ci0JCXByaW50U2VudGVuY2VQYWlyKGVzLCBmcywgY2Vycik7Ci0JfSBlbHNlIHsgLy8gYmVzdF9zY29yZSA+IDAKLQkJLy8gICAgICBpZiAoMiAqIEZlcnRbMF0gPCBtICl7IAotCQlpZiAoMipGZXJ0WzBdIDw9IG0pIHsKLQkJCS8qIGNvbnNpZGVyIGFsaWdubWVudHMgdGhhdCBoYXMgRmVydFswXSBsZXNzIHRoYW4KLQkJCSBoYWxmIHRoZSBudW1iZXIgb2Ygd29yZHMgaW4gRnJlbmNoIHNlbnRlbmNlICovCi0JCQlpZiAobmVpZ2hib3Job29kLmluc2VydChBLCBiZXN0X3Njb3JlKSkgewotCQkJCWFsaWduX3RvdGFsX2NvdW50ICs9IGJlc3Rfc2NvcmU7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGVsc2UgcGFydCBpcyBhZGRlZCBmb3IgZGVidWdnaW5nIC8gWWFzZXIKLQkJCWNlcnIKLQkJCQkJPDwgIldBUk5JTkc6QmVzdCBBbGlnbm1lbnQgZm91bmQgdmlvbGF0ZXMgRmVydGlsaXR5IHJlcXVpcmVtbmV0cyAhIVxuIjsKLQkJCWZvciAoaSA9IDA7IGkgPD0gbDsgaSsrKQotCQkJCWNlcnIgPDwgIkZlcnRbIjw8aTw8Il0gPSAiPDwgRmVydFtpXSA8PCAiXG4iOwotCQkJZm9yIChqID0gMTsgaiA8PSBtOyBqKyspIHsKLQkJCQljZXJyIDw8ICJBWyI8PGo8PCJdID0gIjw8IEFbal0gPDwiXG4iOwotCQkJfQotCQkJY2VyciA8PCAiQ29uZGl0aW9uIHZpb2xhdGVkIDogMiAqIEZlcnRbMF0gPD0gbSAiIDw8IDIqRmVydFswXSA8PCI/IgotCQkJCQk8PCBtIDw8ICJcbiI7Ci0JCX0gLy8gZW5kIG9mIGFkZGVkIGNvZGUgZm9yIGRlYnVnZ2luZyAvLyBZYXNlcgotCQlpdF9zdCA9IHRpbWUoTlVMTCkgOwotCi0JCS8vIE5vdyBmaW5kIGFkZCBhbGwgbmVpZ2hib3JzIG9mIHRoZSBiZXN0IGFsaWdubWV0IHRvIHRoZSAgY29sbGVjdGlvbgotCQlmb3IgKGogPSAxOyBqIDw9IG07IGorKykgewotCQkJZm9yIChqMSA9IGogKyAxOyBqMSA8PSBtOyBqMSsrKSB7IC8vIGFsbCBwb3NzaWJsZSBzd2FwcwotCQkJCWlmIChBW2pdICE9IEFbajFdKSB7Ly8gbWFrZSBzdXJlIHlvdSBhcmUgbm90IHN3YXBwaW5nIGF0IHNhbWUgcG9zaXRpb24KLQkJCQkJLy8JICAgIHNjb3JlID0gYmVzdF9zY29yZSAqIHNjb3JlT2ZTd2FwKGVzLCBmcywgQSwgYmVzdF9zY29yZSwgdFRhYmxlLCBqLCBqMSk7Ci0JCQkJCXNjb3JlID0gYmVzdF9zY29yZSAqIHNjb3JlT2ZTd2FwKGVzLCBmcywgQSwgdFRhYmxlLCBqLCBqMSk7Ci0JCQkJCS8vIEFERCAgQSBhbmQgaXRzIHNjb3JlIHRvIGxpc3Qgb2YgYWxpZy4gdG8gY29sbGVjdCBjb3VudHMgb3ZlcgotCQkJCQlpZiAoMiAqIEZlcnRbMF0gPD0gbSAmJiBzY29yZSA+IDApIHsKLQkJCQkJCS8qIGNvbnNpZGVyIGFsaWdubWVudHMgdGhhdCBoYXMgRmVydFswXSBsZXNzIHRoYW4KLQkJCQkJCSBoYWxmIHRoZSBudW1iZXIgb2Ygd29yZHMgaW4gRnJlbmNoIHNlbnRlbmNlICovCi0JCQkJCQlvbGRfaSA9IEFbal07Ci0JCQkJCQlBW2pdID0gQVtqMV07Ci0JCQkJCQlBW2oxXSA9IG9sZF9pOwotCQkJCQkJaWYgKG5laWdoYm9yaG9vZC5pbnNlcnQoQSwgc2NvcmUpKSB7Ci0JCQkJCQkJYWxpZ25fdG90YWxfY291bnQgKz0gc2NvcmU7Ci0JCQkJCQl9Ci0JCQkJCQkvLyByZXN0b3JlIG9yaWdpbmFsIGFsaWdubWVudCAKLQkJCQkJCW9sZF9pID0gQVtqXTsKLQkJCQkJCUFbal0gPSBBW2oxXTsKLQkJCQkJCUFbajFdID0gb2xkX2k7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGkgPSAwOyBpIDw9IGw7IGkrKykgeyAvLyBhbGwgcG9zc2libGUgbW92ZXMKLQkJCQlpZiAoaSAhPSBBW2pdKSB7IC8vIG1ha2Ugc3VyZSBub3QgdG8gbW92ZSB0byBzYW1lIHBvc2l0aW9uCi0JCQkJCWlmICgoRmVydFtpXSsxIDwgTUFYX0ZFUlRJTElUWSkgJiYgKChpID09IDAgJiYgKG0gPj0gMgotCQkJCQkJCSooRmVydFswXSsxKSkpIHx8IChpICE9IDApKSkgewotCQkJCQkJLy8gY29uc2lkZXIgbGVnYWwgYWxpZ25tZW50cyBvbmx5Ci0JCQkJCQlzY29yZSA9IGJlc3Rfc2NvcmUgKiBzY29yZU9mTW92ZShlcywgZnMsIEEsIEZlcnQsCi0JCQkJCQkJCXRUYWJsZSwgaiwgaSk7Ci0JCQkJCQkvLyBBREQgIEEgYW5kIGl0cyBzY29yZSB0byBsaXN0IG9mIGFsaWcuIHRvIGNvbGxlY3QgY291bnRzIG92ZXIKLQkJCQkJCWlmIChzY29yZSA+IDApIHsKLQkJCQkJCQlvbGRfaSA9IEFbal07Ci0JCQkJCQkJQVtqXSA9IGk7Ci0JCQkJCQkJRmVydFtvbGRfaV0tLTsKLQkJCQkJCQlGZXJ0W2ldKys7Ci0JCQkJCQkJLy8gYWRkIHRvIGxpc3Qgb2YgYWxpZ25lbXRzIGhlcmUgICoqKioqKioqKioqKioqKioqKgotCQkJCQkJCWlmIChuZWlnaGJvcmhvb2QuaW5zZXJ0KEEsIHNjb3JlKSkgewotCQkJCQkJCQlhbGlnbl90b3RhbF9jb3VudCArPSBzY29yZTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gbm93IHJlc290cmUgYWxpZ25tZW50IGFuZCBmZXJ0aWxpdGllcyB0byBwcmV2aW91ZCB2YWx1ZXMKLQkJCQkJCQlBW2pdID0gb2xkX2k7Ci0JCQkJCQkJRmVydFtvbGRfaV0rKzsKLQkJCQkJCQlGZXJ0W2ldLS07Ci0JCQkJCQl9IC8vIGVuZCBvZiBpZiAoc2NvcmUgPiAwKQotCQkJCQl9IC8vIGVuZCBvZiBpZiAoaSA9PSAwIC4uLikgCi0JCQkJfSAvLyBlbmQgb2YgaWYgKGkgIT0gQVtqXSkKLQkJCX0vLyBlbmQgb2YgZm9yKGkgPSAwIDsgLi4uKQotCQl9Ly8gZW5kIG9mIGZvciAoaiA9IDEgOyAuLi4pCi0JfSAvLyBvZiBlbHNlIGJlc3Rfc2NvcmUgPD0gMCAgCi19Ci0KLXZvaWQgbW9kZWwzOjp2aXRlcmJpX2xvb3AoUGVycGxleGl0eSYgcGVycCwgUGVycGxleGl0eSYgdml0ZXJiaVBlcnAsCi0JCXNlbnRlbmNlSGFuZGxlciYgc0hhbmRsZXIxLCBib29sIGR1bXBfZmlsZXMsIGNvbnN0IGNoYXIqIGFsaWduZmlsZSwKLQkJYm9vbCBjb2xsZWN0X2NvdW50cywgc3RyaW5nIG1vZGVsKSB7Ci0JV29yZEluZGV4IGksIGosIGwsIG07Ci0Jb2ZzdHJlYW0gb2YyOwotCWludCBwYWlyX25vOwotCUxvZ1Byb2IgdGVtcDsKLQotCWlmIChkdW1wX2ZpbGVzKQotCQlvZjIub3BlbihhbGlnbmZpbGUpOwotCXBhaXJfbm8gPSAwOyAvLyBzZW50ZW5jZSBwYWlyIG51bWJlciAKLQkvLyBmb3IgZWFjaCBzZW50ZW5jZSBwYWlyIGluIHRoZSBjb3JwdXMKLQlwZXJwLmNsZWFyKCkgOyAvLyBjbGVhcnMgY3Jvc3NfZW50cm9wICYgcGVycGxleGl0eSAKLQl2aXRlcmJpUGVycC5jbGVhcigpOwotCXNlbnRQYWlyIHNlbnQ7Ci0Jd2hpbGUgKHNIYW5kbGVyMS5nZXROZXh0U2VudGVuY2Uoc2VudCkpIHsKLQkJVmVjdG9yPFdvcmRJbmRleD4mIGVzID0gc2VudC5lU2VudDsKLQkJVmVjdG9yPFdvcmRJbmRleD4mIGZzID0gc2VudC5mU2VudDsKLQkJY29uc3QgZmxvYXQgY291bnQgPSBzZW50LmdldENvdW50KCk7Ci0JCWlmICgoc2VudC5zZW50ZW5jZU5vICUgMTAwMCkgPT0gMCkKLQkJCWNlcnIgPDxzZW50LnNlbnRlbmNlTm8gPDwgJ1xuJzsKLQkJdGltZV90IHNlbnRfcyA9IHRpbWUoTlVMTCkgOwotCQlwYWlyX25vKys7Ci0JCWwgPSBlcy5zaXplKCkgLSAxOwotCQltID0gZnMuc2l6ZSgpIC0gMTsKLQotCQlMb2dQcm9iIGFsaWduX3RvdGFsX2NvdW50PTA7Ci0JCS8vICAgICAgTG9nUHJvYiBiZXN0X3Njb3JlOwotCi0JCVZlY3RvcjxXb3JkSW5kZXg+IHZpdGVyYmlfYWxpZ25tZW50OwotCQlMb2dQcm9iIHZpdGVyYmlfc2NvcmU7Ci0JCWFsaWdubW9kZWwgbmVpZ2hib3Job29kOwotCQluZWlnaGJvcmhvb2QuY2xlYXIoKTsKLQkJYWxpZ25fdG90YWxfY291bnQgPSAwOwotCQlmaW5kQWxpZ25tZW50c05laWdoYm9yaG9vZCgKLQkJCQkvKnRUYWJsZSwgYVRhYmxlLCovLypwMV9jb3VudCwgcDBfY291bnQsKi9lcywgZnMsCi0JCQkJYWxpZ25fdG90YWxfY291bnQsIG5laWdoYm9yaG9vZCkgOwotCQlpZiAoUGVnKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDw9IGw7IGkrKykKLQkJCQlmb3IgKGogPSAxOyBqIDw9IG07IGorKykgewotCQkJCQlpZiAoICh0VGFibGUuZ2V0UHJvYihlc1tpXSwgZnNbal0pID4gUFJPQl9TTU9PVEgpCi0JCQkJCQkJJiYgKGFUYWJsZS5nZXRWYWx1ZShpLCBqLCBsLCBtKSA+IFBST0JfU01PT1RIKQotCQkJCQkJCSYmIChkVGFibGUuZ2V0VmFsdWUoaiwgaSwgbCwgbSkgPiBQUk9CX1NNT09USCkpCi0JCQkJCQlmaW5kQWxpZ25tZW50c05laWdoYm9yaG9vZCgvKnRUYWJsZSwgYVRhYmxlLCovLypwMV9jb3VudCwgCi0JCQkJCQkgcDBfY291bnQsICovZXMsIGZzLCBhbGlnbl90b3RhbF9jb3VudCwgbmVpZ2hib3Job29kLCBpLAotCQkJCQkJCQlqKTsKLQkJCQl9Ci0JCX0KLQkJLy8gIE5vdyBDb2xsZWN0IGNvdW50cyBvdmVyIHNhdmVkIG5laWdoYm9yaG9vZHMKLQkJdml0ZXJiaV9zY29yZSA9IDA7Ci0JCWlmIChWZXJib3NlKQotCQkJY2VyciA8PCAiXG5Db2xsZWN0aW5nIGNvdW50cyBvdmVyIGZvdW5kIGFsaWdubWVudHMsIHRvdGFsIHByb2I6ICIKLQkJCQkJPDwgYWxpZ25fdG90YWxfY291bnQgPDwgIlxuIjsKLQkJYWxpZ25tZW50X2hhc2g6Oml0ZXJhdG9yCWFsaWduOwotCQlpbnQgYWNvdW50ID0gMDsKLQkJaWYgKGFsaWduX3RvdGFsX2NvdW50ID09IDApIHsKLQkJCWNlcnIgPDwgIiBXQVJOSU5JRzogRm9yIHRoZSBmb2xsb3dpbmcgc2VudGVuY2UgcGFpciA6IFxuIjsKLQkJCXByaW50U2VudGVuY2VQYWlyKGVzLCBmcywgY2Vycik7Ci0JCQljZXJyIDw8ICJUaGUgY29sbGVjdGlvbiBvZiBhbGlnbm1lbnRzIGZvdW5kIGhhdmUgMCBwcm9iYWJpbGl0eSEhXG4iOwotCQkJY2VyciA8PCAiTm8gY291bnRzIHdpbGwgYmUgY29sbGVjdGVkIG9mIGl0IFxuIjsKLQkJfSBlbHNlIHsKLQkJCWlmIChjb2xsZWN0X2NvdW50cykgewotCQkJCWZvciAoYWxpZ24gPSBuZWlnaGJvcmhvb2QuYmVnaW4oKTsgYWxpZ24gIT0gbmVpZ2hib3Job29kLmVuZCgpOyBhbGlnbisrKSB7Ci0JCQkJCXRlbXAgPSAoKmFsaWduKS5zZWNvbmQvYWxpZ25fdG90YWxfY291bnQ7Ci0JCQkJCWNvbGxlY3RDb3VudHNPdmVyQWxpZ25lbWVudCgvKnRUYWJsZSwgYUNvdW50VGFibGUsICovZXMsCi0JCQkJCQkJZnMsIC8qcDFfY291bnQsIAotCQkJCQkJCSBwMF9jb3VudCAsKi8oKCphbGlnbikuZmlyc3QpLCB0ZW1wLCBjb3VudCk7Ci0JCQkJCWFjb3VudCsrOwotCQkJCQlpZiAodml0ZXJiaV9zY29yZSA8IHRlbXApIHsKLQkJCQkJCXZpdGVyYmlfYWxpZ25tZW50ID0gKCgqYWxpZ24pLmZpcnN0KTsKLQkJCQkJCXZpdGVyYmlfc2NvcmUgPSB0ZW1wOwotCQkJCQl9Ci0JCQkJfQotCQkJfSAvLyBlbmQgb2YgaWYgKGNvbGxlY3RfY291bnRzKQotCQkJcGVycC5hZGRGYWN0b3IobG9nKGRvdWJsZShhbGlnbl90b3RhbF9jb3VudCkpLCBjb3VudCwgbCwgbSwgMCk7Ci0JCQl2aXRlcmJpUGVycC5hZGRGYWN0b3IobG9nKGRvdWJsZSh2aXRlcmJpX3Njb3JlKSksIGNvdW50LCBsLCBtLCAwKTsKLQotCQkJaWYgKFZlcmJvc2UpIHsKLQkJCQljZXJyIDw8ICJDb2xsZWN0ZWQgY291bnRzIG92ZXIgIjw8YWNvdW50IDw8IiAob2YgIiA8PCBwb3coCi0JCQkJCQlkb3VibGUobSksIGRvdWJsZShsKzEpKSA8PCIpIGRpZmZlcm5ldCBhbGlnbm1lbnRzXG4iOwotCQkJCWNlcnIgPDwgIkJ1Y2tldCBjb3VudCBvZiBhbGlnbm1lbnRzIGhhc2g6ICIKLQkJCQkJCTw8IG5laWdoYm9yaG9vZC5nZXRIYXNoKCkuYnVja2V0X2NvdW50KCk8PCAiLCBzaXplICIKLQkJCQkJCTw8IG5laWdoYm9yaG9vZC5nZXRIYXNoKCkuc2l6ZSgpIDw8ICJcbiI7Ci0JCQl9Ci0JCX0gLy8gZW5kIG9mIGVsc2UgCi0JCS8vIHdyaXRlIGJlc3QgYWxpZ25tZW50ICh2aXRlcmJpKSBmb3IgdGhpcyBzZW50ZW5jZSBwYWlyIHRvIGFsaWdubWVudCBmaWxlIAotCQlpZiAoY29sbGVjdF9jb3VudHMpIHsKLQkJCWlmICh2aXRlcmJpX3Njb3JlIDw9IDApIHsKLQkJCQljZXJyIDw8ICJWaXRlcmJpIEFsaWdubWVudCBmb3IgdGhpcyBwYWlyIGhhdmUgc2NvcmUgemVybyEhXG4iOwotCQkJCW9mMiA8PCAiXG5cbiI7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkdW1wX2ZpbGVzKQotCQkJCQlwcmludEFsaWduVG9GaWxlKGVzLCBmcywgRWxpc3QuZ2V0Vm9jYWJMaXN0KCksCi0JCQkJCQkJRmxpc3QuZ2V0Vm9jYWJMaXN0KCksIG9mMiwgdml0ZXJiaV9hbGlnbm1lbnQsCi0JCQkJCQkJcGFpcl9ubywgdml0ZXJiaV9zY29yZSk7Ci0JCQkJYWRkQUwodml0ZXJiaV9hbGlnbm1lbnQsIHNlbnQuc2VudGVuY2VObywgbCk7Ci0JCQl9Ci0JCX0gLy8gZW5kIG9mIGlmIChjb2xsZWN0X2NvdW50cykgCi0JCWRvdWJsZSBwZXJpb2QgPSBkaWZmdGltZSh0aW1lKE5VTEwpLCBzZW50X3MpOwotCQlpZiAoVmVyYm9zZSkKLQkJCWNlcnIgPDwgInByb2Nlc3NpbmcgdGhpcyBzZW50ZW5jZSBwYWlyIHRvb2sgOiAiIDw8IHBlcmlvZAotCQkJCQk8PCAiIHNlY29uZHNcbiI7Ci0KLQl9IC8qIG9mIHNlbnRlbmNlIHBhaXIgRSwgRiAqLwotCXNIYW5kbGVyMS5yZXdpbmQoKTsKLQllcnJvclJlcG9ydEFMKGNlcnIsIG1vZGVsKTsKLQlwZXJwLnJlY29yZChtb2RlbCk7Ci0Jdml0ZXJiaVBlcnAucmVjb3JkKG1vZGVsKTsKLQlpZiAoZHVtcF9maWxlcykKLQkJb2YyLmNsb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL21vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAzNDUzMy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9tb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NjUgKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0jaW5jbHVkZSAibXlzdGwuaCIKLSNpbmNsdWRlICJtb2RlbDMuaCIKLSNpbmNsdWRlICJjb2xsQ291bnRzLmgiCi0jaW5jbHVkZSAidXRpbGl0eS5oIgotI2luY2x1ZGUgIkdsb2JhbHMuaCIKLSNpbmNsdWRlICJENVRhYmxlcy5oIgotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDUuaCIKLSNpbmNsdWRlICJ0cmFuc3BhaXJfbW9kZWxobW0uaCIKLSNpbmNsdWRlICJteWFzc2VydC5oIgotI2luY2x1ZGUgIlBhcmFtZXRlci5oIgotCi1HTE9CQUxfUEFSQU1FVEVSKGZsb2F0LFByaW50TiwibmJlc3RhbGlnbm1lbnRzIiwiZm9yIHByaW50aW5nIHRoZSBuIGJlc3QgYWxpZ25tZW50cyIsUEFSTEVWX09VVFBVVCwwKTsKLQotY29uc3Qgc2hvcnQgTG9nSGlsbENsaW1iPTAsTG9nUGVnPTA7Ci1jb25zdCBzaG9ydCBVc2VITU1WaXRlcmJpQWxpZ25tZW50SWZQb3NzaWJsZT0xOwotc2hvcnQgRG9WaXRlcmJpVHJhaW5pbmc9MDsKLQotR0xPQkFMX1BBUkFNRVRFUihpbnQsVmVyYm9zZVNlbnRlbmNlLCJWZXJib3NlU2VudGVuY2UiLCJudW1iZXIgb2Ygc2VudGVuY2UgZm9yIHdoaWNoIGEgbG90IG9mIGluZm9ybWF0aW9uIHNob3VsZCBiZSBwcmludGVkIChuZWdhdGl2ZTogbm8gb3V0cHV0KSIsUEFSTEVWX09VVFBVVCwtMTApOwotR0xPQkFMX1BBUkFNRVRFUihkb3VibGUsUEVHR0VEX0NVVE9GRiwiUEVHR0VEX0NVVE9GRiIsInJlbGF0aXZlIGN1dG9mZiBwcm9iYWJpbGl0eSBmb3IgYWxpZ25tZW50LWNlbnRlcnMgaW4gcGVnZ2luZyIsUEFSTEVWX09QVEhFVVIsM2UtMik7Ci1HTE9CQUxfUEFSQU1FVEVSMihmbG9hdCwgQ09VTlRJTkNSRUFTRV9DVVRPRkZfQUwsIkNPVU5USU5DUkVBU0UgQ1VUT0ZGIEFMIiwiY291bnRDdXRvZmZBbCIsIkNvdW50cyBpbmNyZW1lbnQgY3V0b2ZmIHRocmVzaG9sZCBmb3IgYWxpZ25tZW50cyBpbiB0cmFpbmluZyBvZiBmZXJ0aWxpdHkgbW9kZWxzIixQQVJMRVZfT1BUSEVVUiwxZS01KTsKLQotLy9pbnQgU2VudE5yOwotYm9vbCBVc2VMaW5rQ2FjaGU9MTsgICAgLy8vIG9wdGltaXphdGlvbiBmb3IgcGVnZ2luZwotaW50IE51bWJlck9mQWxpZ25tZW50c0luU29waGlzdGljYXRlZENvdW50Q29sbGVjdGlvbjsKLQotZXh0ZXJuIGJvb2wgT05MWUFMRFVNUFM7Ci0KLWludCBQcmludEhpbGxDbGltYldhcm5pbmc9MDsKLWludCBQcmludFplcm9TY29yZVdhcm5pbmc9MDsKLQotCi1Mb2dQcm9iIG1vZGVsMzo6dml0ZXJiaV9tb2RlbDIoY29uc3QgdHJhbnNwYWlyX21vZGVsaG1tJmVmLCBhbGlnbm1lbnQmb3V0cHV0LCBpbnQgCi0jaWZkZWYgU1RPUkVfSE1NX0FMSUdOTUVOVFMKLXBhaXJfbm8KLSNlbmRpZgotLCBpbnQgaV9wZWcgLCBpbnQgal9wZWcgKWNvbnN0Ci17Ci0gICAgc3RhdGljIFZlY3RvcjxwYWlyPGFsaWdubWVudCxMb2dQcm9iPiA+IHZpdGVyYmlzOwotICAgIFZlY3RvcjxpbnQ+dml0OwotICAgIGludCBtPWVmLmdldF9tKCk7Ci0gICAgaW50IGw9ZWYuZ2V0X2woKTsKLSAgICBkb3VibGUgcmV0PTAuMDsKLSAgICAvLyNkZWZpbmUgU1RPUkVfSE1NX0FMSUdOTUVOVFMKLSNpZmRlZiBTVE9SRV9ITU1fQUxJR05NRU5UUwotICAgIGlmKCBpX3BlZz09LTEgJiYgal9wZWc9PS0xICYmIHZpdGVyYmlzLnNpemUoKT5wYWlyX25vICl7Ci0gICAgICAgIG91dHB1dD12aXRlcmJpc1twYWlyX25vXS5maXJzdDsKLSAgICAgICAgcmV0PXZpdGVyYmlzW3BhaXJfbm9dLnNlY29uZDsKLSAgICAgICAgbWFzc2VydCggcmV0PT1ITU1SZWFsVml0ZXJiaSgqZWYubmV0LHZpdCxpX3BlZy0xLGpfcGVnLTEpKmVmLm5ldC0+ZmluYWxNdWx0aXBseSApOwotICAgIH0gZWxzZXsKLSAgICAgICAgcmV0PUhNTVJlYWxWaXRlcmJpKCplZi5uZXQsdml0LGlfcGVnLTEsal9wZWctMSkqZWYubmV0LT5maW5hbE11bHRpcGx5OwotICAgICAgICBmb3IoaW50IGo9MTtqPD1tO2orKyl7Ci0gICAgICAgICAgICBpZiggdml0W2otMV0rMT5sICkKLSAgICAgICAgICAgICAgICBvdXRwdXQuc2V0KGosMCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgb3V0cHV0LnNldChqLHZpdFtqLTFdKzEpOwotICAgICAgICAgICAgbWFzc2VydCggKGo9PWpfcGVnJiZpbnQob3V0cHV0KGopKT09aV9wZWcpIHx8IGpfcGVnIT1qKTsKLSAgICAgICAgfQotICAgICAgICBpZiggaV9wZWc9PS0xICYmIGpfcGVnPT0tMSApewotICAgICAgICAgICAgaWFzc2VydCh2aXRlcmJpcy5zaXplKCk9PXBhaXJfbm8pOwotICAgICAgICAgICAgdml0ZXJiaXMucHVzaF9iYWNrKG1ha2VfcGFpcihvdXRwdXQscmV0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0jZWxzZQotICAgIHJldD1ITU1SZWFsVml0ZXJiaSgqZWYubmV0LHZpdCxpX3BlZy0xLGpfcGVnLTEpKmVmLm5ldC0+ZmluYWxNdWx0aXBseTsKLSAgICBmb3IoaW50IGo9MTtqPD1tO2orKyl7Ci0gICAgICAgIGlmKCB2aXRbai0xXSsxPmwgKQotICAgICAgICAgICAgb3V0cHV0LnNldChqLDApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvdXRwdXQuc2V0KGosdml0W2otMV0rMSk7Ci0gICAgICAgIG1hc3NlcnQoIChqPT1qX3BlZyYmaW50KG91dHB1dChqKSk9PWlfcGVnKSB8fCBqX3BlZyE9aik7Ci0gICAgfQotI2VuZGlmCi0gICAgbWFzc2VydCggal9wZWc9PS0xIHx8IGludChvdXRwdXQoal9wZWcpKT09aV9wZWcgKTsKLSAgICBpZiggal9wZWchPS0xICkKLSAgICAgICAgbWFzc2VydChpbnQob3V0cHV0KGpfcGVnKSk9PWlfcGVnKTsKLSAgICBpZiggb3V0cHV0LnZhbGlkKCkgKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIGVsc2V7Ci0gICAgICAgIHJldHVybiBfdml0ZXJiaV9tb2RlbDIoZWYsb3V0cHV0LGlfcGVnLGpfcGVnKTsKLSAgICB9Ci19Ci0KLUxvZ1Byb2IgbW9kZWwzOjpfdml0ZXJiaV9tb2RlbDIoY29uc3QgdHJhbnNwYWlyX21vZGVsMiZlZiwgYWxpZ25tZW50Jm91dHB1dCwgaW50IGlfcGVnLCBpbnQgal9wZWcpY29uc3R7Ci0gICAgV29yZEluZGV4IGJlc3RfaT0wOwotICAgIExvZ1Byb2Igc3M9MTsKLSAgICBQb3NpdGlvbkluZGV4IGwgPSBlZi5nZXRfbCgpLCBtPWVmLmdldF9tKCk7Ci0gICAgVmVjdG9yPFdvcmRJbmRleD4gRmVydChsKzEsIChXb3JkSW5kZXgpMCk7Ci0gICAgaWYgKChqX3BlZyAhPSAtMSkgJiYgKGlfcGVnICE9IC0xKSl7Ci0gICAgICAgIG91dHB1dC5zZXQoal9wZWcsIGlfcGVnKTsKLSAgICAgICAgc3MgKj0gZWYuZ2V0X3QoaV9wZWcsIGpfcGVnKSAqIGVmLmdldF9hKGlfcGVnLCBqX3BlZyk7Ci0gICAgICAgIGlmKCBzcz09MCApCi0gICAgICAgICAgICBjZXJyIDw8ICJXQVJOSU5HOiBhbHJlYWR5IHN0YXJ0aW5nIGlzIHplcm86ICIgPDwgZWYuZ2V0X3QoaV9wZWcsIGpfcGVnKSA8PCAiICIgPDwgZWYuZ2V0X2EoaV9wZWcsIGpfcGVnKSA8PCAnXG4nOwotICAgIH1lbHNlCi0gICAgICAgIHNzPTE7Ci0gICAgZm9yIChQb3NpdGlvbkluZGV4IGogPSAxIDsgaiA8PSBtIDsgaisrKWlmIChpbnQoaikgIT0gal9wZWcpewotICAgICAgICBMb2dQcm9iIHNjb3JlID0gMCA7Ci0gICAgICAgIGZvciAoUG9zaXRpb25JbmRleCBpID0gMCA7IGkgPD0gbCA7IGkrKyl7Ci0gICAgICAgICAgICBpZiggRmVydFtpXSsxPE1BWF9GRVJUSUxJVFkgJiYgKGkgIT0gMCB8fCAgbT49KDIgKiAoRmVydFswXSArIDEpKSkpewotICAgICAgICAgICAgICAgIExvZ1Byb2IgdGVtcCA9IGVmLmdldF90KGksIGopICogZWYuZ2V0X2EoaSwgaik7Ci0gICAgICAgICAgICAgICAgaWYgKHRlbXAgPiBzY29yZSApewotICAgICAgICAgICAgICAgICAgICBiZXN0X2kgPSBpIDsKLSAgICAgICAgICAgICAgICAgICAgc2NvcmUgPSB0ZW1wIDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IAotICAgICAgICB9Ci0gICAgICAgIGlmIChzY29yZSA9PSAwKXsKLSAgICAgICAgICAgIGNlcnIgPDwgIldBUk5JTkc6IEluIHNlYXJjaGluZyBmb3IgbW9kZWwyIGJlc3QgYWxpZ25tZW50XG4iOwotICAgICAgICAgICAgY2VyciA8PCAiTm90aGluZyB3YXMgc2V0IGZvciB0YXJnZXQgdG9rZW4gYXQgcG9zaXRpb24gajogIiA8PCBqIDw8ICJcbiI7Ci0gICAgICAgICAgICBmb3IgKFBvc2l0aW9uSW5kZXggaSA9IDAgOyBpIDw9IGwgOyBpKyspewotICAgICAgICAgICAgICAgIGNlcnIgPDwgImk6ICIgPDwgaSA8PCAidHRhYmxlKCI8PGk8PCIsICI8PGo8PCIpID0gIiA8PAotICAgICAgICAgICAgICAgICAgICBlZi5nZXRfdChpLCBqKSA8PCAiIGF0YWJsZSgiIDw8IGk8PCIsICI8PGo8PCIsICI8PAotICAgICAgICAgICAgICAgICAgICBsPDwiLCAiPDxtPDwiKSA9ICI8PCBlZi5nZXRfYShpLCBqKSA8PCAiIHByb2R1Y3QgIiA8PAotICAgICAgICAgICAgICAgICAgICBlZi5nZXRfdChpLCBqKSAqIGVmLmdldF9hKGksIGopIDsKLSAgICAgICAgICAgICAgICBpZiAoKEZlcnRbaV0rMSA8IE1BWF9GRVJUSUxJVFkpICYmICgoaSA9PSAwICYmICAobSA+PSAyKihGZXJ0WzBdKzEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaSAhPSAwKSkpCi0gICAgICAgICAgICAgICAgICAgIGNlcnIgPDwiUGFzc2VkIGZlcnRpbGl0eSBjb25kaXRpb24gXG4iOwotICAgICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgICAgIGNlcnIgPDwiRmFpbGVkIGZlcnRpbGl0eSBjb25kaXRpb24gXG4iOwotICAgICAgICAgICAgfQkgICAgCi0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgb3V0cHV0LnNldChqLCBiZXN0X2kpOwotICAgICAgICAgICAgRmVydFtiZXN0X2ldKys7Ci0gICAgICAgIH0KLSAgICAgICAgc3MgKj0gc2NvcmU7Ci0gICAgfSAKLSAgICBpZiAoc3MgPD0gMCl7Ci0gICAgICAgIC8vY2VyciA8PCBlZjsKLSAgICAgICAgY2VyciA8PCAiV0FSTklORzogTW9kZWwyIHZpdGVyYmkgYWxpZ25tZW50IGhhcyB6ZXJvIHNjb3JlLlxuIiA7Ci0gICAgICAgIGNlcnIgPDwgIkhlcmUgYXJlIHRoZSBkaWZmZXJlbnQgZWxlbWVudHMgdGhhdCBtYWRlIHRoaXMgYWxpZ25tZW50IHByb2JhYmlsaXR5IHplcm8gXG4iOwotICAgICAgICBjZXJyIDw8ICJTb3VyY2UgbGVuZ3RoICIgPDwgbCA8PCAiIHRhcmdldCBsZW5ndGggIiA8PCBtIDw8ICdcbic7Ci0gICAgICAgIExvZ1Byb2IgZ2c9MSA7IC8vIGZvciBkZWJ1Z2dpbmcgb25seSAuLi4uLiAKLSAgICAgICAgZm9yIChQb3NpdGlvbkluZGV4IGogPSAxIDsgaiA8PSBtIDsgaisrKWlmIChpbnQoaikgIT0gal9wZWcpewotICAgICAgICAgICAgTG9nUHJvYiBzY29yZSA9IDAgOwotICAgICAgICAgICAgTG9nUHJvYiBhID0gMCwgdCA9MCA7Ci0gICAgICAgICAgICBmb3IgKFBvc2l0aW9uSW5kZXggaSA9IDAgOyBpIDw9IGwgOyBpKyspewotICAgICAgICAgICAgICAgIC8vCWlmKCBEZWJ1Z19GZXJ0W2ldKzE8TUFYX0ZFUlRJTElUWSAmJiAoaSAhPSAwIHx8ICBtPj0oMiAqIChEZWJ1Z19GZXJ0WzBdICsgMSkpKSl7Ci0gICAgICAgICAgICAgICAgTG9nUHJvYiB0ZW1wID0gZWYuZ2V0X3QoaSwgaikgKiBlZi5nZXRfYShpLCBqKTsKLSAgICAgICAgICAgICAgICBpZiAodGVtcCA+IHNjb3JlICl7Ci0gICAgICAgICAgICAgICAgICAgIHNjb3JlID0gdGVtcCA7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RfaSA9IGkgOwotICAgICAgICAgICAgICAgICAgICBhID0gZWYuZ2V0X2EoaSwgaik7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSAgZWYuZ2V0X3QoaSwgaikgOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdnICo9IHNjb3JlIDsKLSAgICAgICAgICAgIGNlcnIgPDwgImJlc3Q6IGZzWyIgPDwgaiA8PCAiXSAiPDwgaiA8PCIgIDogZXNbIiA8PCBiZXN0X2kgPDwgIl0gIiA8PAotICAgICAgICAgICAgICAgIGJlc3RfaSA8PCAiICwgIGE6ICIgPDwgZWYuZ2V0X2EoYmVzdF9pLCBqKSA8PCAiIHQ6ICIgPDwgdCA8PCAiIHNjb3JlICIgPDwgc2NvcmUgPDwgIiAgcHJvZHVjdCA6ICIgPDwgZ2cgPDwgIiBzcyAiIDw8Ci0gICAgICAgICAgICAgICAgc3MgPDwgJ1xuJzsKLSAgICAgICAgfQotICAgICAgICBmb3IoUG9zaXRpb25JbmRleCBpID0gMCA7IGkgPD0gbCA7IGkrKykKLSAgICAgICAgICAgIGNlcnIgPDwgIkZlcnRbIjw8aTw8Il0gc2VsZWN0ZWQgIiA8PCBGZXJ0W2ldIDw8ICdcbic7Ci0gICAgfQotICAgIG1hc3NlcnQob3V0cHV0LnZhbGlkKCkpOwotICAgIHJldHVybiBzczsKLX0KLUxvZ1Byb2IgbW9kZWwzOjp2aXRlcmJpX21vZGVsMihjb25zdCB0cmFuc3BhaXJfbW9kZWwzJmVmLCBhbGlnbm1lbnQmb3V0cHV0LCBpbnQgcGFpcl9ubyxpbnQgaV9wZWcgLCBpbnQgal9wZWcgKWNvbnN0Ci17Ci0gICAgaWYoIGgmJlVzZUhNTVZpdGVyYmlBbGlnbm1lbnRJZlBvc3NpYmxlICl7Ci0gICAgICAgIHRyYW5zcGFpcl9tb2RlbGhtbSBlZmhtbShlZi5FLGVmLkYsdFRhYmxlLGFUYWJsZSxkVGFibGUsblRhYmxlLDAuMCwwLjAsaCk7Ci0gICAgICAgIExvZ1Byb2IgcmV0PXZpdGVyYmlfbW9kZWwyKGVmaG1tLG91dHB1dCxwYWlyX25vLGlfcGVnLGpfcGVnKTsKLSAgICAgICAgbWFzc2VydChvdXRwdXQudmFsaWQoKSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIHJldHVybiBfdml0ZXJiaV9tb2RlbDIoZWYsb3V0cHV0LGlfcGVnLGpfcGVnKTsKLX0KLQotLy9pbnQgSGlsbENsaW1iaW5nU3RlcHM9MDsKLQotdGVtcGxhdGU8Y2xhc3MgVFJBTlNQQUlSPgotTG9nUHJvYiBncmVlZHlDbGltYl9XaXRoSUJNM1Njb3JpbmcoTW92ZVN3YXBNYXRyaXg8VFJBTlNQQUlSPiZtc2MyLGludCYgSGlsbENsaW1iaW5nU3RlcHMsaW50IGpfcGVnPS0xKQotewotICBQb3NpdGlvbkluZGV4IGwgPSBtc2MyLmdldF9sKCksIG09bXNjMi5nZXRfbSgpOwotICBpbnQgY2hhbmdlZD0wOwotICBpbnQgaXRlcj0wOwotICBib29sIGhlcmVWRVJCPTA7Ci0gIGRvCi0gICAgewotICAgICAgTW92ZVN3YXBNYXRyaXg8dHlwZW5hbWUgVFJBTlNQQUlSOjpzaW1wbGVyX3RyYW5zcGFpcl9tb2RlbD4gbXNjX0lCTTMobXNjMi5nZXRfZWYoKSxhbGlnbm1lbnQobXNjMikpOwotICAgICAgdmVjdG9yPHBhaXI8ZG91YmxlLE9uZU1vdmVTd2FwPiA+IG1zdmVjOwotICAgICAgZm9yIChQb3NpdGlvbkluZGV4IGogPSAxIDsgaiA8PSBtIDsgaisrKWlmIChpbnQoaikgIT0gal9wZWcpCi0JewotCSAgV29yZEluZGV4IGFqPW1zYzIoaik7Ci0JICBmb3IgKFBvc2l0aW9uSW5kZXggajEgPSBqICsgMSA7IGoxIDw9IG07IGoxKyspCi0JICAgIGlmKChhaiAhPSBtc2MyKGoxKSkgJiYgKGludChqMSkgIT0gal9wZWcpKQotCSAgICAgIG1zdmVjLnB1c2hfYmFjayhwYWlyPGRvdWJsZSxPbmVNb3ZlU3dhcD4oLW1zY19JQk0zLmNzd2FwKGosajEpLE9uZU1vdmVTd2FwKDEsaixqMSkpKTsKLQkgIGZvciAoUG9zaXRpb25JbmRleCBpID0gMCA7IGkgPD0gbCA7IGkrKykKLQkgICAgaWYoaSAhPSBhaiAmJihpICE9IDAgfHwgKG0gPj0gMiAqIChtc2MyLmZlcnQoMCkrMSkpKSAgJiYgbXNjMi5mZXJ0KGkpKzE8TUFYX0ZFUlRJTElUWSkKLQkgICAgICBtc3ZlYy5wdXNoX2JhY2socGFpcjxkb3VibGUsT25lTW92ZVN3YXA+KC1tc2NfSUJNMy5jbW92ZShpLGopLE9uZU1vdmVTd2FwKDIsaSxqKSkpOwotCX0KLSAgICAgIHNvcnQobXN2ZWMuYmVnaW4oKSxtc3ZlYy5lbmQoKSk7Ci0gICAgICBIaWxsQ2xpbWJpbmdTdGVwcysrOwotICAgICAgaW50IGl1c2VkPS0xOwotICAgICAgY2hhbmdlZD0wOwotICAgICAgZm9yKHVuc2lnbmVkIGludCBpPTA7aTxtc3ZlYy5zaXplKCkmJmNoYW5nZWQ9PTA7KytpKQotCXsKLQkgIExvZ1Byb2IgY3N0czsKLQkgIGNvbnN0IE9uZU1vdmVTd2FwICZvbXM9bXN2ZWNbaV0uc2Vjb25kOwotCSAgaWYoIG9tcy50eXBlPT0xJiYoY3N0cz1tc2MyLmNzd2FwKG9tcy5hLG9tcy5iKSk+MS4wMDAxICkKLQkgICAgewotCSAgICAgIGlmKCBoZXJlVkVSQj09MSApCi0JCWNlcnIgPDwgIlNXQVA6ICIgPDwgY3N0cyA8PCAnXG4nOwotCSAgICAgIG1zYzIuZG9Td2FwKG9tcy5hLG9tcy5iKTsKLQkgICAgICBjaGFuZ2VkPTE7Ci0JICAgICAgaXVzZWQ9aTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYoIG9tcy50eXBlPT0yJiYoY3N0cz1tc2MyLmNtb3ZlKG9tcy5hLG9tcy5iKSk+MS4wMDAxICkKLQkgICAgewotCSAgICAgIGlmKCBoZXJlVkVSQj09MSApCi0JCWNlcnIgPDwgIk1PVkU6ICIgPDwgY3N0cyA8PCAnXG4nOwotCSAgICAgIG1zYzIuZG9Nb3ZlKG9tcy5hLG9tcy5iKTsKLQkgICAgICBjaGFuZ2VkPTE7Ci0JICAgICAgaXVzZWQ9aTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmKCArK2l0ZXI+MzAgKQotCXsKLQkgIC8vbXNjMi5lZi52ZXJib3NlVFA9MTsKLQkgIGhlcmVWRVJCPTE7Ci0JICBjZXJyIDw8ICJFUlJPUjogbW9yZSB0aGFuIDMwIGl0ZXJhdGlvbnMgaW4gaGlsbC1jbGltYmluZzogIiA8PCBpdXNlZCAKLQkgICAgICAgPDwgIiBpbXByb3ZlbWVudDogIiA8PCBtc3ZlY1tpdXNlZF0uZmlyc3QgPDwgIiB2YWx1ZToiIDw8IG1zdmVjW2l1c2VkXS5zZWNvbmQgCi0JICAgICAgIDw8ICdcbicgPDwgbXNjMiA8PCAnXG4nOwotCSAgZm9yKGludCBhPTA7YTwyMDsrK2EpCi0JICAgIGNvdXQgPDwgYSA8PCAnICcgPDwgbXN2ZWNbYV0uZmlyc3QgPDwgJyAnIDw8IG1zdmVjW2FdLnNlY29uZCA8PCAnXG4nOwotCSAgLy9jZXJyIDw8IG1zdmVjIDw8ICdcbic7Ci0JfQotICAgICAgaWYoIGl0ZXI+NTAgKQotCWJyZWFrOwotICAgIH0gd2hpbGUoY2hhbmdlZCk7Ci0gIHJldHVybiBtc2MyLmdldF9lZigpLnByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKG1zYzIpOyAgCi19Ci0KLXRlbXBsYXRlPGNsYXNzIFRSQU5TUEFJUj4KLUxvZ1Byb2IgZ3JlZWR5Q2xpbWIoTW92ZVN3YXBNYXRyaXg8VFJBTlNQQUlSPiZtc2MyLCBpbnQmIEhpbGxDbGltYmluZ1N0ZXBzLCBpbnQgal9wZWcgPSAtMSkKLXsKLSAgaWYoIG1zYzIuZ2V0X2VmKCkuZ3JlZWR5SGlsbENsaW1iaW5nKCk9PTEgKQotICAgIHJldHVybiBncmVlZHlDbGltYl9XaXRoSUJNM1Njb3JpbmcobXNjMixIaWxsQ2xpbWJpbmdTdGVwcyxqX3BlZyk7Ci0gIFBvc2l0aW9uSW5kZXggbCA9IG1zYzIuZ2V0X2woKSwgbT1tc2MyLmdldF9tKCk7Ci0gIGludCBjaGFuZ2VkPTA7Ci0gIGRvIAotICAgIHsKLSAgICAgIEhpbGxDbGltYmluZ1N0ZXBzKys7Ci0gICAgICBjaGFuZ2VkPTA7Ci0gICAgICBmb3IgKFBvc2l0aW9uSW5kZXggaiA9IDEgOyBqIDw9IG0gOyBqKyspaWYgKGludChqKSAhPSBqX3BlZykKLQl7Ci0JICBXb3JkSW5kZXggYWo9bXNjMihqKTsKLQkgIGZvciAoUG9zaXRpb25JbmRleCBqMSA9IGogKyAxIDsgajEgPD0gbTsgajErKylpZigoYWogIT0gbXNjMihqMSkpICYmIChpbnQoajEpICE9IGpfcGVnKSYmbXNjMi5jc3dhcChqLCBqMSkgPiAxLjApCi0JICAgIG1zYzIuZG9Td2FwKGosIGoxKSwgY2hhbmdlZD0xOwotCSAgZm9yIChQb3NpdGlvbkluZGV4IGkgPSAwIDsgaSA8PSBsIDsgaSsrKWlmKGkgIT0gYWogJiYoaSAhPSAwIHx8IChtID49IDIgKiAobXNjMi5mZXJ0KDApKzEpKSkgICYmIG1zYzIuZmVydChpKSsxPE1BWF9GRVJUSUxJVFkgJiYgbXNjMi5jbW92ZShpLCBqKT4xLjApCi0JICAgIG1zYzIuZG9Nb3ZlKGksIGopLCBjaGFuZ2VkPTE7Ci0JfQotICAgIH0gd2hpbGUgKGNoYW5nZWQpOwotICByZXR1cm4gbXNjMi5nZXRfZWYoKS5wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShtc2MyKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFJBTlNQQUlSPgotTG9nUHJvYiBoaWxsQ2xpbWJfc3RkKE1vdmVTd2FwTWF0cml4PFRSQU5TUEFJUj4mbXNjMiwgaW50ICZIaWxsQ2xpbWJpbmdTdGVwcyxpbnQ9IC0xLGludCBqX3BlZyA9IC0xKQotewotICBpZiggbXNjMi5pc0xhenkoKSApCi0gICAgcmV0dXJuIGdyZWVkeUNsaW1iX1dpdGhJQk0zU2NvcmluZyhtc2MyLEhpbGxDbGltYmluZ1N0ZXBzLGpfcGVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBpZiggTG9nSGlsbENsaW1iPjEgKQotICAgIGNvdXQgPDwgbXNjMiA8PCAnXG4nOwotICBQb3NpdGlvbkluZGV4IGwgPSBtc2MyLmdldF9sKCksIG09bXNjMi5nZXRfbSgpOwotICBpbnQgY2hhbmdlcz0wOwotICBpbnQgYmVzdF9jaGFuZ2VfdHlwZT0tMSwgYmVzdF9jaGFuZ2VfdjE9LTEsIGJlc3RfY2hhbmdlX3YyPS0xOwotICBkbyAKLSAgICB7Ci0gICAgICBIaWxsQ2xpbWJpbmdTdGVwcysrOwotICAgICAgTG9nUHJvYiBiZXN0X2NoYW5nZV9zb19mYXIgPSAxLjAwMDAxIDsgIAotICAgICAgYmVzdF9jaGFuZ2VfdHlwZT0wOwotICAgICAgZm9yIChQb3NpdGlvbkluZGV4IGogPSAxIDsgaiA8PSBtIDsgaisrKWlmIChpbnQoaikgIT0gal9wZWcpCi0JewotCSAgV29yZEluZGV4IGFqPW1zYzIoaik7Ci0JICBmb3IgKFBvc2l0aW9uSW5kZXggajEgPSBqICsgMSA7IGoxIDw9IG07IGoxKyspaWYoKGFqICE9IG1zYzIoajEpKSAmJiAoaW50KGoxKSAhPSBqX3BlZykpCi0JICAgIHsKLQkgICAgICBMb2dQcm9iIGNoYW5nZSA9IG1zYzIuY3N3YXAoaiwgajEpOwotCSAgICAgIGlmIChjaGFuZ2UgPiBiZXN0X2NoYW5nZV9zb19mYXIpCi0JCXsKLQkJICBiZXN0X2NoYW5nZV9zb19mYXIgPSBjaGFuZ2UgOwotCQkgIGJlc3RfY2hhbmdlX3R5cGU9MTsKLQkJICBiZXN0X2NoYW5nZV92MT1qOwotCQkgIGJlc3RfY2hhbmdlX3YyPWoxOwotCQkgIGlmKCBMb2dIaWxsQ2xpbWIgKQotCQkgICAgY2VyciA8PCAiQ0xJTUI6ICIgPDwgYmVzdF9jaGFuZ2VfdHlwZSA8PCAiICIgPDwgYmVzdF9jaGFuZ2VfdjEgPDwgIiAiIDw8IGJlc3RfY2hhbmdlX3YyIDw8ICIgIiA8PCBiZXN0X2NoYW5nZV9zb19mYXIgPDwgbXNjMiA8PCAnXG4nOwotCQkgIG1hc3NlcnQobXNjMi5nZXRfZWYoKS5pc1N1Yk9wdGltYWwoKT09MSk7Ci0JCX0gCi0JICAgIH0gCi0JICBmb3IgKFBvc2l0aW9uSW5kZXggaSA9IDAgOyBpIDw9IGwgOyBpKyspaWYoaSAhPSBhaiAmJihpICE9IDAgfHwgKG0gPj0gMiAqIChtc2MyLmZlcnQoMCkrMSkpKSAmJiBtc2MyLmZlcnQoaSkrMTxNQVhfRkVSVElMSVRZKQotCSAgICB7Ci0JICAgICAgTG9nUHJvYiBjaGFuZ2UgPSBtc2MyLmNtb3ZlKGksIGopOwotCSAgICAgIGlmIChjaGFuZ2UgPiBiZXN0X2NoYW5nZV9zb19mYXIpCi0JCXsgCi0JCSAgYmVzdF9jaGFuZ2Vfc29fZmFyID0gY2hhbmdlIDsKLQkJICBiZXN0X2NoYW5nZV90eXBlPTI7Ci0JCSAgYmVzdF9jaGFuZ2VfdjE9ajsKLQkJICBiZXN0X2NoYW5nZV92Mj1pOwotCQkgIGlmKCBMb2dIaWxsQ2xpbWIgKQotCQkgICAgY2VyciA8PCAiQ0xJTUI6ICIgPDwgYmVzdF9jaGFuZ2VfdHlwZSA8PCAiICIgPDwgYmVzdF9jaGFuZ2VfdjEgPDwgIiAiIDw8IGJlc3RfY2hhbmdlX3YyIDw8ICIgIiA8PCBiZXN0X2NoYW5nZV9zb19mYXIgPDwgbXNjMiA8PCAnXG4nOwotCQkgIG1hc3NlcnQobXNjMi5nZXRfZWYoKS5pc1N1Yk9wdGltYWwoKT09MSk7Ci0JCX0gCi0JICAgIH0KLQl9Ci0gICAgICBpZiAoYmVzdF9jaGFuZ2VfdHlwZT09MSkKLQl7Ci0JICBtc2MyLmRvU3dhcChiZXN0X2NoYW5nZV92MSwgYmVzdF9jaGFuZ2VfdjIpOwotCSAgaWYoIExvZ0hpbGxDbGltYiApCi0JICAgIGNlcnIgPDwgIlNXLUNMSU1CLURPTkU6ICIgPDwgal9wZWcgPDwgbXNjMiA8PCAnXG4nOwotCX0KLSAgICAgIGlmIChiZXN0X2NoYW5nZV90eXBlPT0yKQotCXsKLQkgIG1zYzIuZG9Nb3ZlKGJlc3RfY2hhbmdlX3YyLCBiZXN0X2NoYW5nZV92MSk7Ci0JICBpZiggTG9nSGlsbENsaW1iICkKLQkgICAgY2VyciA8PCAiTU8tQ0xJTUItRE9ORTogIiA8PCBqX3BlZyA8PCBtc2MyIDw8ICdcbic7Ci0JfQotICAgICAgY2hhbmdlcysrOwotICAgICAgaWYoIGNoYW5nZXM+NDAgKQotCXsKLQkgIGlmKCBQcmludEhpbGxDbGltYldhcm5pbmcrKzwxMDAwICkKLQkgICAgY2VyciA8PCAiV0FSTklORzogYWxyZWFkeSAiIDw8IGNoYW5nZXMgPDwgIiBpdGVyYXRpb25zIGluIGhpbGxjbGltYjogIiA8PCBiZXN0X2NoYW5nZV9zb19mYXIgPDwgIiAiIDw8IGJlc3RfY2hhbmdlX3R5cGUgPDwgIiAiIDw8IGJlc3RfY2hhbmdlX3YxIDw8ICIgIiA8PCBiZXN0X2NoYW5nZV92MiA8PCAnXG4nOwotCSAgZWxzZSBpZiAoUHJpbnRIaWxsQ2xpbWJXYXJuaW5nPT0xMDAwKQotCSAgICBjZXJyIDw8ICJFUlJPUjogdG9vIG1hbnkgaGlsbCBjbGltYmluZyB3YXJuaW5ncyA9PiBJIGRvIG5vdCBwcmludCBtb3JlLlxuIjsKLQl9Ci0gICAgICBpZihjaGFuZ2VzPjYwICkKLQl7Ci0JICBjZXJyIDw8IG1zYzIgPDwgJ1xuJzsKLQkgIGJyZWFrOwotCX0KLSAgICB9IHdoaWxlIChiZXN0X2NoYW5nZV90eXBlKTsKLSAgcmV0dXJuIG1zYzIuZ2V0X2VmKCkucHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UobXNjMik7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIE1PREVMX1RZUEU+Ci1ib29sIGV4dGVuZENlbnRlckxpc3QoVmVjdG9yPHBhaXI8TW92ZVN3YXBNYXRyaXg8TU9ERUxfVFlQRT4qLExvZ1Byb2I+ID4mc2V0T2ZHb29kQ2VudGVycyxNb3ZlU3dhcE1hdHJpeDxNT0RFTF9UWVBFPiAqbXNjLGRvdWJsZSBwZWdnZWRBbGlnbm1lbnRTY29yZSkKLXsKLSAgdW5zaWduZWQgaW50IGw9bXNjLT5nZXRfZWYoKS5nZXRfbCgpOwotICBzZXQ8T25lTW92ZVN3YXA+IGFscmVhZHlDb3ZlcmVkOwotICBmb3IodW5zaWduZWQgaW50IG5yPTA7bnI8c2V0T2ZHb29kQ2VudGVycy5zaXplKCk7bnIrKykKLSAgICBtYWtlT25lTW92ZVN3YXAoKnNldE9mR29vZENlbnRlcnNbbnJdLmZpcnN0LCptc2MsYWxyZWFkeUNvdmVyZWQpOwotICBmb3Ioc2V0PE9uZU1vdmVTd2FwPjo6Y29uc3RfaXRlcmF0b3IgaT1hbHJlYWR5Q292ZXJlZC5iZWdpbigpO2khPWFscmVhZHlDb3ZlcmVkLmVuZCgpOysraSkKLSAgICB7Ci0gICAgICBpZiggaS0+dHlwZT09MXx8aS0+dHlwZT09NCkKLQltc2MtPmRlbENlbnRlcigpOwotICAgICAgaWYoIGktPnR5cGU9PTEgKQotCXsKLQkgIGZvcih1bnNpZ25lZCBpbnQgaWk9MDtpaTw9bDsrK2lpKQotCSAgICBpZiggKCptc2MpKGktPmEpIT1paSApCi0JICAgICAgbXNjLT5kZWxNb3ZlKGlpLGktPmEpOwotCX0KLSAgICAgIGVsc2UgaWYoIGktPnR5cGU9PTJ8fGktPnR5cGU9PTQgKQotCSAgbXNjLT5kZWxTd2FwKGktPmEsaS0+Yik7Ci0gICAgICBlbHNlIGlmKCBpLT50eXBlPT0zICkKLQkgIG1zYy0+ZGVsTW92ZShpLT5iLGktPmEpOwotICAgICAgZWxzZSBhYm9ydCgpOwotICAgIH0gICAKLSAgc2V0T2ZHb29kQ2VudGVycy5wdXNoX2JhY2sobWFrZV9wYWlyKG1zYyxwZWdnZWRBbGlnbm1lbnRTY29yZSkpOwotICByZXR1cm4gMTsKLX0KLQotYm9vbCBPbGRMb2c9MDsKLXNob3J0IE9sZExvZ1BlZz0wLE9sZExvZ0hpbGxDbGltYj0wOwotY2xhc3MgQWxzCi17Ci1wdWJsaWM6Ci0gIGludCBzLGEsYjsKLSAgZG91YmxlIHY7Ci0gIEFscyhpbnQgX3MsaW50IF9hLGludCBfYixkb3VibGUgX3YpCi0gICAgOiBzKF9zKSxhKF9hKSxiKF9iKSx2KF92KSB7fQotfTsKLQotaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEFscyZ4LGNvbnN0IEFscyZ5KQote3JldHVybiB4LnY+eS52O30KLQotdGVtcGxhdGU8Y2xhc3MgTU9ERUxfVFlQRSwgY2xhc3MgQURESVRJT05BTF9NT0RFTF9EQVRBX0lOLGNsYXNzIEFERElUSU9OQUxfTU9ERUxfREFUQV9PVVQ+Ci12b2lkIG1vZGVsMzo6dml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzKFBlcnBsZXhpdHkmIHBlcnAsIFBlcnBsZXhpdHkmIHZpdGVyYmlQZXJwLCBzZW50ZW5jZUhhbmRsZXImIHNIYW5kbGVyMSwgCi0JCQkJICAgICAgYm9vbCBkdW1wX2ZpbGVzLCBjb25zdCBjaGFyKiBhbGlnbmZpbGUsIAotCQkJCSAgICAgIGJvb2wgY29sbGVjdF9jb3VudHMsIHN0cmluZyBtb2RlbCwgYm9vbCBmaW5hbCwKLQkJCQkgICAgICBBRERJVElPTkFMX01PREVMX0RBVEFfSU4qZG1faW4sCi0JCQkJICAgICAgQURESVRJT05BTF9NT0RFTF9EQVRBX09VVCpkbV9vdXQpewotICAgIG9mc3RyZWFtICp3cml0ZU5CZXN0RXJyb3JzRmlsZT0wOwotICAgIGlmKCAoZHVtcF9maWxlc3x8RkVXRFVNUFMpJiZQcmludE4mJlJlZmVyZW5jZUFsaWdubWVudC5zaXplKCk+MCApIHsKLSAgICAgICAgc3RyaW5nIHg9YWxpZ25maWxlK3N0cmluZygiTkJFU1QiKTsKLSAgICAgICAgd3JpdGVOQmVzdEVycm9yc0ZpbGU9IG5ldyBvZnN0cmVhbSh4LmNfc3RyKCkpOwotICAgIH0KLSAgICBvZnN0cmVhbSAqb2YzPTA7Ci0gICAgUG9zaXRpb25JbmRleCBpLCBqLCBsLCBtIDsKLSAgICBvZnN0cmVhbSBvZjI7Ci0gICAgaW50IHBhaXJfbm87Ci0gICAgaW50IEhpbGxDbGltYmluZ1N0ZXBzPTA7Ci0gICAgTnVtYmVyT2ZBbGlnbm1lbnRzSW5Tb3BoaXN0aWNhdGVkQ291bnRDb2xsZWN0aW9uPTA7Ci0gICAgaWYgKGR1bXBfZmlsZXN8fEZFV0RVTVBTfHwoZmluYWwmJihPTkxZQUxEVU1QUykpICl7Ci0gICAgICAgIG9mMi5vcGVuKGFsaWduZmlsZSk7Ci0gICAgICAgIGlmKG9mMi5pc19vcGVuKCkpewotICAgICAgICAgICAgY291dCA8PCAiSSB3aWxsIHdyaXRlIGFsaWdubWVudCB0byAiIDw8IGFsaWduZmlsZSA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgfQotLyogIGlmKCFvZjIuaXNfb3BlbigpKXsKLSAgICAgICAgY2VyciA8PCAiSSBkb24ndCBrbm93IHdoeSB5b3UgZG8gbm90IGxldCBtZSBkdW1wIGZpbGUgIiA8PCBhbGlnbmZpbGUgPDwgZW5kbDsKLSAgICB9Ki8KLSAgICBpZiggZHVtcF9maWxlcyYmUHJpbnROJiZmaW5hbCApewotICAgICAgICBzdHJpbmcgeD1hbGlnbmZpbGUrc3RyaW5nKCJOQkVTVCIpOwotICAgICAgICBvZjM9IG5ldyBvZnN0cmVhbSh4LmNfc3RyKCkpOwotICAgIH0KLSAgICBwYWlyX25vID0gMCA7IC8vIHNlbnRlbmNlIHBhaXIgbnVtYmVyIAotICAgIC8vIGZvciBlYWNoIHNlbnRlbmNlIHBhaXIgaW4gdGhlIGNvcnB1cwotICAgIHBlcnAuY2xlYXIoKSA7IC8vIGNsZWFycyBjcm9zc19lbnRyb3AgJiBwZXJwbGV4aXR5IAotICAgIHZpdGVyYmlQZXJwLmNsZWFyKCkgOyAvLyBjbGVhcnMgY3Jvc3NfZW50cm9wICYgcGVycGxleGl0eSAKLSAgICBzZW50UGFpciBzZW50IDsKLSAgICBpbnQgTkNlbnRlcj0wLE5IaWxsQ2xpbWJlZD0wLE5BbGlnbm1lbnQ9MCxOVG90YWw9MCxOQmV0dGVyQnlQZWdnaW5nPTA7Ci0gICAgd2hpbGUoc0hhbmRsZXIxLmdldE5leHRTZW50ZW5jZShzZW50KSl7Ci0gICAgICAgIGlmKCBzZW50LmVTZW50LnNpemUoKT09MXx8c2VudC5mU2VudC5zaXplKCk9PTEgKQotICAgICAgICAgICAgY29udGludWU7Ci0vLyAgICAgICAgU2VudE5yPXNlbnQuc2VudGVuY2VObzsKLSAgICAgICAgVmVjdG9yPFdvcmRJbmRleD4mIGVzID0gc2VudC5lU2VudDsKLSAgICAgICAgVmVjdG9yPFdvcmRJbmRleD4mIGZzID0gc2VudC5mU2VudDsKLSAgICAgICAgY29uc3QgZmxvYXQgY291bnQgID0gc2VudC5nZXRDb3VudCgpOyAgICAKLSAgICAgICAgaWYgKChzZW50LnNlbnRlbmNlTm8gJSAxMDAwMCkgPT0gMCkKLSAgICAgICAgICAgIGNlcnIgPDxzZW50LnNlbnRlbmNlTm8gPDwgJ1xuJzsgCi0gICAgICAgIHRpbWVfdCBzZW50X3MgPSB0aW1lKE5VTEwpIDsKLSAgICAgICAgcGFpcl9ubysrIDsKLSAgICAgICAgbCA9IGVzLnNpemUoKSAtIDEgOwotICAgICAgICBtID0gZnMuc2l6ZSgpIC0gMSA7Ci0gICAgICAgIAotICAgICAgICBMb2dQcm9iIGFsaWduX3RvdGFsX2NvdW50PTA7Ci0gICAgICAgIGFsaWdubWVudCB2aXRlcmJpMmFsaWdubWVudChsLG0pOwotICAgICAgICBNT0RFTF9UWVBFIGVmKGVzLGZzLHRUYWJsZSxhVGFibGUsZFRhYmxlLG5UYWJsZSxwMSxwMCxkbV9pbik7Ci0gICAgICAgIHZpdGVyYmlfbW9kZWwyKGVmLHZpdGVyYmkyYWxpZ25tZW50LHBhaXJfbm8tMSk7Ci0gICAgICAgIFZlY3RvcjxwYWlyPE1vdmVTd2FwTWF0cml4PE1PREVMX1RZUEU+KixMb2dQcm9iPiA+c2V0T2ZHb29kQ2VudGVycygxKTsKLSAgICAgICAgc2V0PGFsaWdubWVudD4gYWxpZ25tZW50czsKLSAgICAgICAgTW92ZVN3YXBNYXRyaXg8TU9ERUxfVFlQRT4gKmJlc3QgPSAoc2V0T2ZHb29kQ2VudGVyc1swXS5maXJzdCAgPSBuZXcgTW92ZVN3YXBNYXRyaXg8TU9ERUxfVFlQRT4oZWYsIHZpdGVyYmkyYWxpZ25tZW50KSk7Ci0gICAgICAgIE1vdmVTd2FwTWF0cml4PE1PREVMX1RZUEU+IF92aXRlcmJpKCpiZXN0KSwgKnZpdGVyYmk9Jl92aXRlcmJpOyAvLyBwbGVhc2UsIGRvbid0IGRlbGV0ZSB0aGlzIGxpbmUgKEZKTykKLSAgICAgICAgaWYoIGVmLmlzU3ViT3B0aW1hbCgpICkKLSAgICAgICAgICAgIHNldE9mR29vZENlbnRlcnNbMF0uc2Vjb25kID0gaGlsbENsaW1iX3N0ZCgqYmVzdCxIaWxsQ2xpbWJpbmdTdGVwcyk7Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgICBzZXRPZkdvb2RDZW50ZXJzWzBdLnNlY29uZCA9IGJlc3QtPmdldF9lZigpLnByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKCpiZXN0KTsKLSAgICAgICAgICAgIGlmKCBzZXRPZkdvb2RDZW50ZXJzWzBdLnNlY29uZD09MCApewotICAgICAgICAgICAgICAgIGNlcnIgPDwgIlBST0JMRU06IGFsaWdubWVudCBpcyAwLlxuIjsKLSAgICAgICAgICAgICAgICBiZXN0LT5nZXRfZWYoKS5wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZSgqYmVzdCwxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgYmVzdEFsaWdubWVudD0wOwotCi0gICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8c2V0T2ZHb29kQ2VudGVycy5zaXplKCk7KytpKQotICAgICAgICAgICAgc2V0T2ZHb29kQ2VudGVyc1tpXS5maXJzdC0+Y2hlY2soKTsKLSAgICAgICAgYWxpZ25tZW50cy5pbnNlcnQoKmJlc3QpOyAKLSAgICAgICAgaWYgKHNldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uc2Vjb25kIDw9IDApewotICAgICAgICAgICAgaWYoIFByaW50WmVyb1Njb3JlV2FybmluZysrPDEwMCApewotICAgICAgICAgICAgICAgIGNlcnIgPDwgIldBUk5JTkc6IEhpbGwgQ2xpbWJpbmcgeWllbGRlZCBhIHplcm8gc2NvcmUgdml0ZXJiaSBhbGlnbm1lbnQgZm9yIHRoZSBmb2xsb3dpbmcgcGFpcjpcbiI7Ci0gICAgICAgICAgICAgICAgY2VyciA8PCBhbGlnbm1lbnQoKnNldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uZmlyc3QpIDsKLSAgICAgICAgICAgICAgICBwcmludFNlbnRlbmNlUGFpcihlcywgZnMsIGNlcnIpOyAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihQcmludFplcm9TY29yZVdhcm5pbmc9PTEwMCkgewotICAgICAgICAgICAgICAgIGNlcnIgPDwgIkVSUk9SOiB0b28gbWFueSB6ZXJvIHNjb3JlIHdhcm5pbmdzID0+IG5vIGFkZGl0aW9uYWwgb25lIHdpbGwgYmUgcHJpbnRlZFxuIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uc2Vjb25kPTFlLTMwMDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBuSGlsbENsaW1iZWQ9MSxuQWxpZ25tZW50PTE7Ci0gICAgICAgIGJvb2wgZmxhZ0JldHRlckJ5UGVnZ2luZz0wOwotICAgICAgICBpZiAoIFBlZyApewotICAgICAgICAgICAgY29uc3QgTW92ZVN3YXBNYXRyaXg8TU9ERUxfVFlQRT4gKnVzZU1hdHJpeD12aXRlcmJpOyAgLy8gaXQgaXMgZmFzdGVyIHVzaW5nICdiZXN0JywgLi4uIChGSk8pCi0gICAgICAgICAgICBBcnJheTI8c2hvcnQsIHZlY3RvcjxzaG9ydD4gPiBsaW5rQ2FjaGUobCsxLCBtKzEsIGZhbHNlKTsKLSAgICAgICAgICAgIGlmKFVzZUxpbmtDYWNoZSlmb3IodW5zaWduZWQgaW50IGo9MTtqPD1tO2orKylsaW5rQ2FjaGUoKCp1c2VNYXRyaXgpKGopLCBqKT0xOwotICAgICAgICAgICAgZm9yKFBvc2l0aW9uSW5kZXggaj0xO2o8PW07aisrKWZvcihQb3NpdGlvbkluZGV4IGk9MDtpPD1sO2krKyl7Ci0gICAgICAgICAgICAgICAgbkFsaWdubWVudCsrOwotICAgICAgICAgICAgICAgIGlmKCBpIT0oKnVzZU1hdHJpeCkoaikgJiYgKFVzZUxpbmtDYWNoZT09MHx8bGlua0NhY2hlKGksaik9PTApICYmIAotICAgICAgICAgICAgICAgICAgIGVmLmdldF90KGksaik+ZWYuZ2V0X3QoKCp1c2VNYXRyaXgpKGopLGopKlBFR0dFRF9DVVRPRkYgJiYgCi0gICAgICAgICAgICAgICAgICAgKGkgIT0gMCB8fCAobSA+PSAyICogKHVzZU1hdHJpeC0+ZmVydCgwKSsxKSkpKXsKLSAgICAgICAgICAgICAgICAgICAgTW92ZVN3YXBNYXRyaXg8TU9ERUxfVFlQRT4gKkJFU1RQRUdHRUQ9MDsKLSAgICAgICAgICAgICAgICAgICAgTG9nUHJvYiBwZWdnZWRBbGlnbm1lbnRTY29yZTsKLSAgICAgICAgICAgICAgICAgICAgbkhpbGxDbGltYmVkKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBlZi5pc1N1Yk9wdGltYWwoKSApewotICAgICAgICAgICAgICAgICAgICAgICAgQkVTVFBFR0dFRCA9IG5ldyBNb3ZlU3dhcE1hdHJpeDxNT0RFTF9UWVBFPigqdXNlTWF0cml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJFU1RQRUdHRUQtPmRvTW92ZShpLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlZ2dlZEFsaWdubWVudFNjb3JlPSBoaWxsQ2xpbWJfc3RkKCpCRVNUUEVHR0VELEhpbGxDbGltYmluZ1N0ZXBzLCBpLGopOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCBwZWdBbGlnbm1lbnQobCxtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlZ2dlZEFsaWdubWVudFNjb3JlPXZpdGVyYmlfbW9kZWwyKGVmLHBlZ0FsaWdubWVudCxwYWlyX25vLTEsaSxqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJFU1RQRUdHRUQgPSBuZXcgTW92ZVN3YXBNYXRyaXg8TU9ERUxfVFlQRT4oZWYscGVnQWxpZ25tZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hc3NlcnQoIHBlZ0FsaWdubWVudChqKT09aSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKFVzZUxpbmtDYWNoZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0xO2o8PW07aisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtDYWNoZSgoKkJFU1RQRUdHRUQpKGopLCBqKT0xOwkJICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBlZ2dlZEFsaWdubWVudFNjb3JlPnNldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uc2Vjb25kKihMb2dQcm9iKVBFR0dFRF9DVVRPRkYgJiYgYWxpZ25tZW50cy5jb3VudCgqQkVTVFBFR0dFRCk9PTAgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV4dGVuZENlbnRlckxpc3Qoc2V0T2ZHb29kQ2VudGVycyxCRVNUUEVHR0VELHBlZ2dlZEFsaWdubWVudFNjb3JlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50cy5pbnNlcnQoKkJFU1RQRUdHRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwZWdnZWRBbGlnbm1lbnRTY29yZT4xLjAwMDAxKnNldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uc2Vjb25kICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBMb2dQZWcgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnIgPDwgImZvdW5kIGJldHRlciBhbGlnbm1lbnQgYnkgcGVnZ2luZyAiIDw8IHBhaXJfbm8gPDwgIiAiIDw8IHBlZ2dlZEFsaWdubWVudFNjb3JlL3NldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uc2Vjb25kIDw8ICdcbic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJyIDw8ICJORVcgQkVTVDogIiA8PCBhbGlnbm1lbnQoKkJFU1RQRUdHRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VyciA8PCAiT0xEICAgICA6ICIgPDwgYWxpZ25tZW50KCpzZXRPZkdvb2RDZW50ZXJzW2Jlc3RBbGlnbm1lbnRdLmZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnQmV0dGVyQnlQZWdnaW5nPTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RBbGlnbm1lbnQ9YWxpZ25tZW50cy5zaXplKCktMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIGRpZmZlcmVuY2VzKCpCRVNUUEVHR0VELCAqYmVzdCkhPTAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJFU1RQRUdHRUQ9MDsJCSAgIAotICAgICAgICAgICAgICAgICAgICB9ZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIEJFU1RQRUdHRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IC8vIGVuZCBvZiBpZihQZWcpCi0gICAgICAgIE5CZXR0ZXJCeVBlZ2dpbmcrPWZsYWdCZXR0ZXJCeVBlZ2dpbmc7Ci0gICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8c2V0T2ZHb29kQ2VudGVycy5zaXplKCk7KytpKQotICAgICAgICAgICAgc2V0T2ZHb29kQ2VudGVyc1tpXS5maXJzdC0+Y2hlY2soKTsKLSAgICAgICAgaWYoIExvZ1BlZz4xICkKLSAgICAgICAgICAgIGNvdXQgPDwgIlBFR0dFRDogIiA8PCBzZXRPZkdvb2RDZW50ZXJzLnNpemUoKSA8PCAiIEhJTExDTElNQkVEOiIgPDwgbkhpbGxDbGltYmVkIDw8ICIgVE9UQUw6IiA8PCBuQWxpZ25tZW50IDw8ICIgYWxpZ25tZW50cy4iIDw8ICdcbic7Ci0gICAgICAgIGludCBhbFRvdGFsPWNvbGxlY3RDb3VudHNPdmVyTmVpZ2hib3Job29kKHNldE9mR29vZENlbnRlcnMsZXMsIGZzLCB0VGFibGUsIGFDb3VudFRhYmxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZENvdW50VGFibGUsIG5Db3VudFRhYmxlLCBwMV9jb3VudCwgcDBfY291bnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbl90b3RhbF9jb3VudCwgY291bnQsIGNvbGxlY3RfY291bnRzLCBkbV9vdXQpOwotICAgICAgICBpZiggTG9nUGVnPjEgKXsKLSAgICAgICAgICAgIGNvdXQgPDwgIkFMTDogIiA8PCBhbFRvdGFsIDw8ICIgZnJvbSAiIDw8IHBvdyhmbG9hdChsKzEpLGZsb2F0KG0pKSA8PCAnXG4nOwotICAgICAgICAgICAgbWFzc2VydChhbFRvdGFsPD1wb3coZG91YmxlKGwrMSksZG91YmxlKG0pKSk7Ci0gICAgICAgIH0KLSAgICAgICAgTkNlbnRlcis9c2V0T2ZHb29kQ2VudGVycy5zaXplKCk7TkhpbGxDbGltYmVkKz1uSGlsbENsaW1iZWQ7TkFsaWdubWVudCs9bkFsaWdubWVudDtOVG90YWwrPWFsVG90YWw7Ci0gICAgICAgIHBlcnAuYWRkRmFjdG9yKGxvZyhkb3VibGUoYWxpZ25fdG90YWxfY291bnQpKSwgY291bnQsIGwsIG0sMCk7Ci0gICAgICAgIHZpdGVyYmlQZXJwLmFkZEZhY3Rvcihsb2coZG91YmxlKHNldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uc2Vjb25kKSksIGNvdW50LCBsLCBtLDApOwotICAgICAgICBtYXNzZXJ0KGxvZyhkb3VibGUoc2V0T2ZHb29kQ2VudGVyc1tiZXN0QWxpZ25tZW50XS5zZWNvbmQpKSA8PSBsb2coZG91YmxlKGFsaWduX3RvdGFsX2NvdW50KSkpOwotICAgICAgICBpZiAoZHVtcF9maWxlc3x8KEZFV0RVTVBTJiZzZW50LnNlbnRlbmNlTm88MTAwMCl8fChmaW5hbCYmKE9OTFlBTERVTVBTKSkgKQotICAgICAgICAgICAgcHJpbnRBbGlnblRvRmlsZShlcywgZnMsIEVsaXN0LmdldFZvY2FiTGlzdCgpLCBGbGlzdC5nZXRWb2NhYkxpc3QoKSwgb2YyLCAoc2V0T2ZHb29kQ2VudGVyc1tiZXN0QWxpZ25tZW50XS5maXJzdCktPmdldEFsaWdubWVudCgpLCBzZW50LnNlbnRlbmNlTm8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRPZkdvb2RDZW50ZXJzW2Jlc3RBbGlnbm1lbnRdLnNlY29uZCk7Ci0gICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8c2V0T2ZHb29kQ2VudGVycy5zaXplKCk7KytpKQotICAgICAgICAgICAgc2V0T2ZHb29kQ2VudGVyc1tpXS5maXJzdC0+Y2hlY2soKTsKLSAgICAgICAgaWYoIG9mM3x8KHdyaXRlTkJlc3RFcnJvcnNGaWxlJiZwYWlyX25vPGludChSZWZlcmVuY2VBbGlnbm1lbnQuc2l6ZSgpKSkgKXsKLSAgICAgICAgICAgIHZlY3RvcjxBbHM+IGFsczsKLSAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgcz0wO3M8c2V0T2ZHb29kQ2VudGVycy5zaXplKCk7KytzKXsKLSAgICAgICAgICAgICAgICBjb25zdCBNb3ZlU3dhcE1hdHJpeDxNT0RFTF9UWVBFPiZtc2M9ICpzZXRPZkdvb2RDZW50ZXJzW3NdLmZpcnN0OwotICAgICAgICAgICAgICAgIG1zYy5jaGVjaygpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBub3JtYWxpemVkX2FzY29yZT1zZXRPZkdvb2RDZW50ZXJzW3NdLnNlY29uZDsKLSAgICAgICAgICAgICAgICBpZiggIW1zYy5pc0NlbnRlckRlbGV0ZWQoKSApCi0gICAgICAgICAgICAgICAgICAgIGFscy5wdXNoX2JhY2soIEFscyhzLDAsMCxub3JtYWxpemVkX2FzY29yZSkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoV29yZEluZGV4IGo9MTtqPD1tO2orKykKLSAgICAgICAgICAgICAgICAgICAgZm9yKFdvcmRJbmRleCBpPTA7aTw9bDtpKyspCi0gICAgICAgICAgICAgICAgICAgIGlmKCBpIT1tc2MoaikmJiAhbXNjLmlzRGVsTW92ZShpLGopICkKLSAgICAgICAgICAgICAgICAgICAgYWxzLnB1c2hfYmFjayggQWxzKHMsaSxqLG1zYy5jbW92ZShpLGopKm5vcm1hbGl6ZWRfYXNjb3JlKSk7Ci0gICAgICAgICAgICAgICAgZm9yKFBvc2l0aW9uSW5kZXggajE9MTtqMTw9bTtqMSsrKQotICAgICAgICAgICAgICAgICAgICBmb3IoUG9zaXRpb25JbmRleCBqMj1qMSsxO2oyPD1tO2oyKyspCi0gICAgICAgICAgICAgICAgICAgIGlmKCBtc2MoajEpIT1tc2MoajIpICYmICFtc2MuaXNEZWxTd2FwKGoxLGoyKSApCi0gICAgICAgICAgICAgICAgICAgIGFscy5wdXNoX2JhY2soIEFscyhzLC1qMSwtajIsbXNjLmNzd2FwKGoxLGoyKSpub3JtYWxpemVkX2FzY29yZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc29ydChhbHMuYmVnaW4oKSxhbHMuZW5kKCkpOwotICAgICAgICAgICAgZG91YmxlIHN1bT0wLHN1bTI9MDsKLSAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8YWxzLnNpemUoKTsrK2kpCi0gICAgICAgICAgICAgICAgc3VtKz1hbHNbaV0udjsKLSAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8bWluKCh1bnNpZ25lZCBpbnQpYWxzLnNpemUoKSwodW5zaWduZWQgaW50KVByaW50Tik7KytpKXsKLSAgICAgICAgICAgICAgICBhbGlnbm1lbnQgeD0qc2V0T2ZHb29kQ2VudGVyc1thbHNbaV0uc10uZmlyc3Q7Ci0gICAgICAgICAgICAgICAgaWYoICEoYWxzW2ldLmE9PTAgJiYgYWxzW2ldLmI9PTApICl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBhbHNbaV0uYTw9MCYmYWxzW2ldLmI8PTAgKQotICAgICAgICAgICAgICAgICAgICAgICAgeC5kb1N3YXAoLWFsc1tpXS5hLC1hbHNbaV0uYik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHguZG9Nb3ZlKGFsc1tpXS5hLGFsc1tpXS5iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIG9mMyYmaTxQcmludE4gKQotICAgICAgICAgICAgICAgICAgICBwcmludEFsaWduVG9GaWxlKGVzLCBmcywgRWxpc3QuZ2V0Vm9jYWJMaXN0KCksIEZsaXN0LmdldFZvY2FiTGlzdCgpLCpvZjMseC5nZXRBbGlnbm1lbnQoKSwgc2VudC5zZW50ZW5jZU5vLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHNbaV0udi9zdW0qY291bnQpOwotICAgICAgICAgICAgICAgIHN1bTIrPWFsc1tpXS52OwotICAgICAgICAgICAgICAgIGlmKCB3cml0ZU5CZXN0RXJyb3JzRmlsZSApewotICAgICAgICAgICAgICAgICAgICBpZiggcGFpcl9ubzxpbnQoUmVmZXJlbmNlQWxpZ25tZW50LnNpemUoKSkgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBBTG1pc3Npbmc9MCxBTHRvb211Y2g9MCxBTGV2ZW50c01pc3Npbmc9MCxBTGV2ZW50c1Rvb211Y2g9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjxkb3VibGU+IHNjb3JlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yc0luQWxpZ25tZW50KFJlZmVyZW5jZUFsaWdubWVudFtwYWlyX25vLTFdLHguZ2V0QWxpZ25tZW50KCksbCxBTG1pc3NpbmcsQUx0b29tdWNoLEFMZXZlbnRzTWlzc2luZyxBTGV2ZW50c1Rvb211Y2gscGFpcl9ubyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlZi5jb21wdXRlU2NvcmVzKHgsc2NvcmVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICp3cml0ZU5CZXN0RXJyb3JzRmlsZSA8PCBBTG1pc3NpbmcrQUx0b29tdWNoIDw8ICcgJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8c2NvcmVzLnNpemUoKTsrK2kpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKndyaXRlTkJlc3RFcnJvcnNGaWxlIDw8ICgoc2NvcmVzW2ldPjAuMCk/KC1sb2coc2NvcmVzW2ldKSk6MS4wZTYpIDw8ICcgJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICp3cml0ZU5CZXN0RXJyb3JzRmlsZSA8PCAnXG4nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIHdyaXRlTkJlc3RFcnJvcnNGaWxlICkKLSAgICAgICAgICAgICAgICAqd3JpdGVOQmVzdEVycm9yc0ZpbGUgPDwgJ1xuJzsKLSAgICAgICAgfQotICAgICAgICBhZGRBTCgoc2V0T2ZHb29kQ2VudGVyc1tiZXN0QWxpZ25tZW50XS5maXJzdCktPmdldEFsaWdubWVudCgpLHNlbnQuc2VudGVuY2VObyxsKTsKLSAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpPTA7aTxzZXRPZkdvb2RDZW50ZXJzLnNpemUoKTtpKyspCi0gICAgICAgICAgICBkZWxldGUgc2V0T2ZHb29kQ2VudGVyc1tpXS5maXJzdDsKLSAgICAgICAgZG91YmxlIHBlcmlvZCA9IGRpZmZ0aW1lKHRpbWUoTlVMTCksIHNlbnRfcyk7Ci0gICAgICAgIGlmIChWZXJib3NlKQotICAgICAgICAgICAgY2VyciA8PCAicHJvY2Vzc2luZyB0aGlzIHNlbnRlbmNlIHBhaXIgdG9vayA6ICIgPDwgcGVyaW9kCi0gICAgICAgICAgICA8PCAiIHNlY29uZHNcbiI7Ci0gICAgICAgIAotICAgIH0gLyogb2Ygc2VudGVuY2UgcGFpciBFLCBGICovCi0gICAgLy9zSGFuZGxlcjEucmV3aW5kKCk7Ci0gICAgaWYgKGR1bXBfZmlsZXN8fEZFV0RVTVBTfHwoZmluYWwmJihPTkxZQUxEVU1QUykpICkKLSAgICAgICAgb2YyLmNsb3NlKCk7Ci0gICAgZGVsZXRlIG9mMzsKLSAgICBkZWxldGUgd3JpdGVOQmVzdEVycm9yc0ZpbGU7Ci0gICAgZG91YmxlIEZTZW50PXBhaXJfbm87Ci0gICAgY291dCA8PCAiI2NlbnRlcnMocHJlL2hpbGxjbGltYmVkL3JlYWwpOiAiIDw8IE5BbGlnbm1lbnQvRlNlbnQgPDwgIiAiIDw8IE5IaWxsQ2xpbWJlZC9GU2VudCA8PCAiICIgPDwgTkNlbnRlci9GU2VudCA8PCAiICAjYWw6ICIgPDwgTlRvdGFsL0ZTZW50IDw8ICIgI2Fsc29waGlzdGljYXRlZGNvdW50Y29sbGVjdGlvbjogIiA8PCAgIE51bWJlck9mQWxpZ25tZW50c0luU29waGlzdGljYXRlZENvdW50Q29sbGVjdGlvbi9GU2VudCA8PCAiICNoY3N0ZXBzOiAiIDw8IEhpbGxDbGltYmluZ1N0ZXBzL0ZTZW50IDw8ICdcbic7Ci0gICAgY291dCA8PCAiI3BlZ2dpbmdJbXByb3ZlbWVudHM6ICIgPDwgTkJldHRlckJ5UGVnZ2luZy9GU2VudCA8PCAnXG4nOwotfQotCi0vKlBlcmZvcm0gb25seSBvbmUgc3RlcCBvZiB2aXRlcmJpIGFsaWdubWVudCovCi0jaWYgMAotdGVtcGxhdGU8Y2xhc3MgTU9ERUxfVFlQRSwgY2xhc3MgQURESVRJT05BTF9NT0RFTF9EQVRBX0lOLGNsYXNzIEFERElUSU9OQUxfTU9ERUxfREFUQV9PVVQ+Ci12b2lkIG1vZGVsMzo6dml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzXzEoUGVycGxleGl0eSYgcGVycCwgUGVycGxleGl0eSYgdml0ZXJiaVBlcnAsIHNlbnRlbmNlSGFuZGxlciYgc0hhbmRsZXIxLCAKLQkJCQkgICAgICBib29sIGR1bXBfZmlsZXMsIGNvbnN0IGNoYXIqIGFsaWduZmlsZSwgCi0JCQkJICAgICAgYm9vbCBjb2xsZWN0X2NvdW50cywgc3RyaW5nIG1vZGVsLCBib29sIGZpbmFsLAotCQkJCSAgICAgIEFERElUSU9OQUxfTU9ERUxfREFUQV9JTipkbV9pbiwKLQkJCQkgICAgICBBRERJVElPTkFMX01PREVMX0RBVEFfT1VUKmRtX291dCl7Ci0gICAgb2ZzdHJlYW0gKndyaXRlTkJlc3RFcnJvcnNGaWxlPTA7Ci0gICAgaWYoIChkdW1wX2ZpbGVzfHxGRVdEVU1QUykmJlByaW50TiYmUmVmZXJlbmNlQWxpZ25tZW50LnNpemUoKT4wICkgewotICAgICAgICBzdHJpbmcgeD1hbGlnbmZpbGUrc3RyaW5nKCJOQkVTVCIpOwotICAgICAgICB3cml0ZU5CZXN0RXJyb3JzRmlsZT0gbmV3IG9mc3RyZWFtKHguY19zdHIoKSk7Ci0gICAgfQotICAgIG9mc3RyZWFtICpvZjM9MDsKLSAgICBvZnN0cmVhbSBvZjI7Ci0gICAgaW50IHBhaXJfbm87Ci0gICAgSGlsbENsaW1iaW5nU3RlcHM9MDsKLSAgICBOdW1iZXJPZkFsaWdubWVudHNJblNvcGhpc3RpY2F0ZWRDb3VudENvbGxlY3Rpb249MDsKLSAgICBpZiAoZHVtcF9maWxlc3x8RkVXRFVNUFN8fChmaW5hbCYmKE9OTFlBTERVTVBTKSkgKQotICAgICAgICBvZjIub3BlbihhbGlnbmZpbGUpOwotICAgIGlmKCBkdW1wX2ZpbGVzJiZQcmludE4mJmZpbmFsICl7Ci0gICAgICAgIHN0cmluZyB4PWFsaWduZmlsZStzdHJpbmcoIk5CRVNUIik7Ci0gICAgICAgIG9mMz0gbmV3IG9mc3RyZWFtKHguY19zdHIoKSk7Ci0gICAgfQotICAgIHBhaXJfbm8gPSAwIDsgLy8gc2VudGVuY2UgcGFpciBudW1iZXIgCi0gICAgLy8gZm9yIGVhY2ggc2VudGVuY2UgcGFpciBpbiB0aGUgY29ycHVzCi0gICAgcGVycC5jbGVhcigpIDsgLy8gY2xlYXJzIGNyb3NzX2VudHJvcCAmIHBlcnBsZXhpdHkgCi0gICAgdml0ZXJiaVBlcnAuY2xlYXIoKSA7IC8vIGNsZWFycyBjcm9zc19lbnRyb3AgJiBwZXJwbGV4aXR5IAotICAgIHNlbnRQYWlyIHNlbnQgOwotICAgIGludCBOQ2VudGVyPTAsTkhpbGxDbGltYmVkPTAsTkFsaWdubWVudD0wLE5Ub3RhbD0wLE5CZXR0ZXJCeVBlZ2dpbmc9MDsKLSAgICB3aGlsZShzSGFuZGxlcjEuZ2V0TmV4dFNlbnRlbmNlKHNlbnQpKXsKLSAgICAgICAgaWYoIHNlbnQuZVNlbnQuc2l6ZSgpPT0xfHxzZW50LmZTZW50LnNpemUoKT09MSApCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgU2VudE5yPXNlbnQuc2VudGVuY2VObzsKLSAgICAgICAgVmVjdG9yPFdvcmRJbmRleD4mIGVzID0gc2VudC5lU2VudDsKLSAgICAgICAgVmVjdG9yPFdvcmRJbmRleD4mIGZzID0gc2VudC5mU2VudDsKLSAgICAgICAgY29uc3QgZmxvYXQgY291bnQgID0gc2VudC5nZXRDb3VudCgpOyAgICAKLSAgICAgICAgaWYgKChzZW50LnNlbnRlbmNlTm8gJSAxMDAwMCkgPT0gMCkKLSAgICAgICAgICAgIGNlcnIgPDxzZW50LnNlbnRlbmNlTm8gPDwgJ1xuJzsgCi0gICAgICAgIHRpbWVfdCBzZW50X3MgPSB0aW1lKE5VTEwpIDsKLSAgICAgICAgcGFpcl9ubysrIDsKLSAgICAgICAgbCA9IGVzLnNpemUoKSAtIDEgOwotICAgICAgICBtID0gZnMuc2l6ZSgpIC0gMSA7Ci0gICAgICAgIGlmIChMb2cpewotICAgICAgICAgICAgbG9nbXNnIDw8ICJQcm9jZXNzaW5nIHNlbnRlbmNlIHBhaXI6XG5cdCI7Ci0gICAgICAgICAgICBwcmludFNlbnRlbmNlUGFpcihlcywgZnMsIGxvZ21zZyk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwIDsgaSA8PSBsIDsgaSsrKQotICAgICAgICAgICAgICAgIGxvZ21zZyA8PCBFbGlzdC5nZXRWb2NhYkxpc3QoKVtlc1tpXV0ud29yZCA8PCAiICI7Ci0gICAgICAgICAgICBsb2dtc2cgPDwgIlxuXHQiOwotICAgICAgICAgICAgZm9yIChqID0gMSA7IGogPD0gbSA7IGorKykKLSAgICAgICAgICAgICAgICBsb2dtc2cgPDwgRmxpc3QuZ2V0Vm9jYWJMaXN0KClbZnNbal1dLndvcmQgPDwgIiAiOwotICAgICAgICAgICAgbG9nbXNnIDw8ICJcbiI7Ci0gICAgICAgIH0gCi0gICAgICAgIAotICAgICAgICBMb2dQcm9iIGFsaWduX3RvdGFsX2NvdW50PTA7Ci0gICAgICAgIGFsaWdubWVudCB2aXRlcmJpMmFsaWdubWVudChsLG0pOwotICAgICAgICBNT0RFTF9UWVBFIGVmKGVzLGZzLHRUYWJsZSxhVGFibGUsZFRhYmxlLG5UYWJsZSxwMSxwMCxkbV9pbik7Ci0gICAgICAgIHZpdGVyYmlfbW9kZWwyKGVmLHZpdGVyYmkyYWxpZ25tZW50LHBhaXJfbm8tMSk7Ci0gICAgICAgIFZlY3RvcjxwYWlyPE1vdmVTd2FwTWF0cml4PE1PREVMX1RZUEU+KixMb2dQcm9iPiA+c2V0T2ZHb29kQ2VudGVycygxKTsKLSAgICAgICAgc2V0PGFsaWdubWVudD4gYWxpZ25tZW50czsKLSAgICAgICAgTW92ZVN3YXBNYXRyaXg8TU9ERUxfVFlQRT4gKmJlc3QgPSAoc2V0T2ZHb29kQ2VudGVyc1swXS5maXJzdCAgPSBuZXcgTW92ZVN3YXBNYXRyaXg8TU9ERUxfVFlQRT4oZWYsIHZpdGVyYmkyYWxpZ25tZW50KSk7Ci0gICAgICAgIE1vdmVTd2FwTWF0cml4PE1PREVMX1RZUEU+IF92aXRlcmJpKCpiZXN0KSwgKnZpdGVyYmk9Jl92aXRlcmJpOyAvLyBwbGVhc2UsIGRvbid0IGRlbGV0ZSB0aGlzIGxpbmUgKEZKTykKLSAgICAgICAgaWYgKExvZykKLSAgICAgICAgICAgIGxvZ21zZyA8PCAiVklURVJCSTogIiA8PCBhbGlnbm1lbnQoX3ZpdGVyYmkpOwotICAgICAgICBpZiggZWYuaXNTdWJPcHRpbWFsKCkgKQotICAgICAgICAgICAgc2V0T2ZHb29kQ2VudGVyc1swXS5zZWNvbmQgPSBoaWxsQ2xpbWJfc3RkKCpiZXN0KTsKLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAgIHNldE9mR29vZENlbnRlcnNbMF0uc2Vjb25kID0gYmVzdC0+Z2V0X2VmKCkucHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoKmJlc3QpOwotICAgICAgICAgICAgaWYoIHNldE9mR29vZENlbnRlcnNbMF0uc2Vjb25kPT0wICl7Ci0gICAgICAgICAgICAgICAgY2VyciA8PCAiUFJPQkxFTTogYWxpZ25tZW50IGlzIDAuXG4iOwotICAgICAgICAgICAgICAgIGJlc3QtPmdldF9lZigpLnByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKCpiZXN0LDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBiZXN0QWxpZ25tZW50PTA7Ci0KLSAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpPTA7aTxzZXRPZkdvb2RDZW50ZXJzLnNpemUoKTsrK2kpCi0gICAgICAgICAgICBzZXRPZkdvb2RDZW50ZXJzW2ldLmZpcnN0LT5jaGVjaygpOwotICAgICAgICBhbGlnbm1lbnRzLmluc2VydCgqYmVzdCk7IAotICAgICAgICBpZiAoc2V0T2ZHb29kQ2VudGVyc1tiZXN0QWxpZ25tZW50XS5zZWNvbmQgPD0gMCl7Ci0gICAgICAgICAgICBpZiggUHJpbnRaZXJvU2NvcmVXYXJuaW5nKys8MTAwICl7Ci0gICAgICAgICAgICAgICAgY2VyciA8PCAiV0FSTklORzogSGlsbCBDbGltYmluZyB5aWVsZGVkIGEgemVybyBzY29yZSB2aXRlcmJpIGFsaWdubWVudCBmb3IgdGhlIGZvbGxvd2luZyBwYWlyOlxuIjsKLSAgICAgICAgICAgICAgICBjZXJyIDw8IGFsaWdubWVudCgqc2V0T2ZHb29kQ2VudGVyc1tiZXN0QWxpZ25tZW50XS5maXJzdCkgOwotICAgICAgICAgICAgICAgIHByaW50U2VudGVuY2VQYWlyKGVzLCBmcywgY2Vycik7ICAgICAgCi0gICAgICAgICAgICAgICAgaWYoTG9nKXsKLSAgICAgICAgICAgICAgICAgICAgbG9nbXNnIDw8ICJXQVJOSU5HOiBIaWxsIENsaW1iaW5nIHlpZWxkZWQgYSB6ZXJvIHNjb3JlIHZpdGVyYmkgYWxpZ25tZW50IGZvciB0aGUgZm9sbG93aW5nIHBhaXI6XG4iOwotICAgICAgICAgICAgICAgICAgICBwcmludFNlbnRlbmNlUGFpcihlcywgZnMsIGxvZ21zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihQcmludFplcm9TY29yZVdhcm5pbmc9PTEwMCkgewotICAgICAgICAgICAgICAgIGNlcnIgPDwgIkVSUk9SOiB0b28gbWFueSB6ZXJvIHNjb3JlIHdhcm5pbmdzID0+IG5vIGFkZGl0aW9uYWwgb25lIHdpbGwgYmUgcHJpbnRlZFxuIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uc2Vjb25kPTFlLTMwMDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBuSGlsbENsaW1iZWQ9MSxuQWxpZ25tZW50PTE7Ci0gICAgICAgIGJvb2wgZmxhZ0JldHRlckJ5UGVnZ2luZz0wOwotICAgICAgICBpZiAoIFBlZyApewotICAgICAgICAgICAgY29uc3QgTW92ZVN3YXBNYXRyaXg8TU9ERUxfVFlQRT4gKnVzZU1hdHJpeD12aXRlcmJpOyAgLy8gaXQgaXMgZmFzdGVyIHVzaW5nICdiZXN0JywgLi4uIChGSk8pCi0gICAgICAgICAgICBBcnJheTI8c2hvcnQsIHZlY3RvcjxzaG9ydD4gPiBsaW5rQ2FjaGUobCsxLCBtKzEsIGZhbHNlKTsKLSAgICAgICAgICAgIGlmKFVzZUxpbmtDYWNoZSlmb3IodW5zaWduZWQgaW50IGo9MTtqPD1tO2orKylsaW5rQ2FjaGUoKCp1c2VNYXRyaXgpKGopLCBqKT0xOwotICAgICAgICAgICAgZm9yKFBvc2l0aW9uSW5kZXggaj0xO2o8PW07aisrKWZvcihQb3NpdGlvbkluZGV4IGk9MDtpPD1sO2krKyl7Ci0gICAgICAgICAgICAgICAgbkFsaWdubWVudCsrOwotICAgICAgICAgICAgICAgIGlmKCBpIT0oKnVzZU1hdHJpeCkoaikgJiYgKFVzZUxpbmtDYWNoZT09MHx8bGlua0NhY2hlKGksaik9PTApICYmIAotICAgICAgICAgICAgICAgICAgIGVmLmdldF90KGksaik+ZWYuZ2V0X3QoKCp1c2VNYXRyaXgpKGopLGopKlBFR0dFRF9DVVRPRkYgJiYgCi0gICAgICAgICAgICAgICAgICAgKGkgIT0gMCB8fCAobSA+PSAyICogKHVzZU1hdHJpeC0+ZmVydCgwKSsxKSkpKXsKLSAgICAgICAgICAgICAgICAgICAgTW92ZVN3YXBNYXRyaXg8TU9ERUxfVFlQRT4gKkJFU1RQRUdHRUQ9MDsKLSAgICAgICAgICAgICAgICAgICAgTG9nUHJvYiBwZWdnZWRBbGlnbm1lbnRTY29yZTsKLSAgICAgICAgICAgICAgICAgICAgbkhpbGxDbGltYmVkKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBlZi5pc1N1Yk9wdGltYWwoKSApewotICAgICAgICAgICAgICAgICAgICAgICAgQkVTVFBFR0dFRCA9IG5ldyBNb3ZlU3dhcE1hdHJpeDxNT0RFTF9UWVBFPigqdXNlTWF0cml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJFU1RQRUdHRUQtPmRvTW92ZShpLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlZ2dlZEFsaWdubWVudFNjb3JlPSBoaWxsQ2xpbWJfc3RkKCpCRVNUUEVHR0VELCBpLGopOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCBwZWdBbGlnbm1lbnQobCxtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlZ2dlZEFsaWdubWVudFNjb3JlPXZpdGVyYmlfbW9kZWwyKGVmLHBlZ0FsaWdubWVudCxwYWlyX25vLTEsaSxqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJFU1RQRUdHRUQgPSBuZXcgTW92ZVN3YXBNYXRyaXg8TU9ERUxfVFlQRT4oZWYscGVnQWxpZ25tZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hc3NlcnQoIHBlZ0FsaWdubWVudChqKT09aSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKFVzZUxpbmtDYWNoZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0xO2o8PW07aisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtDYWNoZSgoKkJFU1RQRUdHRUQpKGopLCBqKT0xOwkJICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBlZ2dlZEFsaWdubWVudFNjb3JlPnNldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uc2Vjb25kKihMb2dQcm9iKVBFR0dFRF9DVVRPRkYgJiYgYWxpZ25tZW50cy5jb3VudCgqQkVTVFBFR0dFRCk9PTAgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV4dGVuZENlbnRlckxpc3Qoc2V0T2ZHb29kQ2VudGVycyxCRVNUUEVHR0VELHBlZ2dlZEFsaWdubWVudFNjb3JlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50cy5pbnNlcnQoKkJFU1RQRUdHRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwZWdnZWRBbGlnbm1lbnRTY29yZT4xLjAwMDAxKnNldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uc2Vjb25kICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBMb2dQZWcgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnIgPDwgImZvdW5kIGJldHRlciBhbGlnbm1lbnQgYnkgcGVnZ2luZyAiIDw8IHBhaXJfbm8gPDwgIiAiIDw8IHBlZ2dlZEFsaWdubWVudFNjb3JlL3NldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uc2Vjb25kIDw8ICdcbic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJyIDw8ICJORVcgQkVTVDogIiA8PCBhbGlnbm1lbnQoKkJFU1RQRUdHRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VyciA8PCAiT0xEICAgICA6ICIgPDwgYWxpZ25tZW50KCpzZXRPZkdvb2RDZW50ZXJzW2Jlc3RBbGlnbm1lbnRdLmZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnQmV0dGVyQnlQZWdnaW5nPTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RBbGlnbm1lbnQ9YWxpZ25tZW50cy5zaXplKCktMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIGRpZmZlcmVuY2VzKCpCRVNUUEVHR0VELCAqYmVzdCkhPTAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJFU1RQRUdHRUQ9MDsJCSAgIAotICAgICAgICAgICAgICAgICAgICB9ZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIEJFU1RQRUdHRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IC8vIGVuZCBvZiBpZihQZWcpCi0gICAgICAgIE5CZXR0ZXJCeVBlZ2dpbmcrPWZsYWdCZXR0ZXJCeVBlZ2dpbmc7Ci0gICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8c2V0T2ZHb29kQ2VudGVycy5zaXplKCk7KytpKQotICAgICAgICAgICAgc2V0T2ZHb29kQ2VudGVyc1tpXS5maXJzdC0+Y2hlY2soKTsKLSAgICAgICAgaWYoIExvZ1BlZz4xICkKLSAgICAgICAgICAgIGNvdXQgPDwgIlBFR0dFRDogIiA8PCBzZXRPZkdvb2RDZW50ZXJzLnNpemUoKSA8PCAiIEhJTExDTElNQkVEOiIgPDwgbkhpbGxDbGltYmVkIDw8ICIgVE9UQUw6IiA8PCBuQWxpZ25tZW50IDw8ICIgYWxpZ25tZW50cy4iIDw8ICdcbic7Ci0gICAgICAgIGludCBhbFRvdGFsPWNvbGxlY3RDb3VudHNPdmVyTmVpZ2hib3Job29kKHNldE9mR29vZENlbnRlcnMsZXMsIGZzLCB0VGFibGUsIGFDb3VudFRhYmxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZENvdW50VGFibGUsIG5Db3VudFRhYmxlLCBwMV9jb3VudCwgcDBfY291bnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbl90b3RhbF9jb3VudCwgY291bnQsIGNvbGxlY3RfY291bnRzLCBkbV9vdXQpOwotICAgICAgICBpZiggTG9nUGVnPjEgKXsKLSAgICAgICAgICAgIGNvdXQgPDwgIkFMTDogIiA8PCBhbFRvdGFsIDw8ICIgZnJvbSAiIDw8IHBvdyhmbG9hdChsKzEpLGZsb2F0KG0pKSA8PCAnXG4nOwotICAgICAgICAgICAgbWFzc2VydChhbFRvdGFsPD1wb3coZG91YmxlKGwrMSksZG91YmxlKG0pKSk7Ci0gICAgICAgIH0KLSAgICAgICAgTkNlbnRlcis9c2V0T2ZHb29kQ2VudGVycy5zaXplKCk7TkhpbGxDbGltYmVkKz1uSGlsbENsaW1iZWQ7TkFsaWdubWVudCs9bkFsaWdubWVudDtOVG90YWwrPWFsVG90YWw7Ci0gICAgICAgIHBlcnAuYWRkRmFjdG9yKGxvZyhkb3VibGUoYWxpZ25fdG90YWxfY291bnQpKSwgY291bnQsIGwsIG0sMCk7Ci0gICAgICAgIHZpdGVyYmlQZXJwLmFkZEZhY3Rvcihsb2coZG91YmxlKHNldE9mR29vZENlbnRlcnNbYmVzdEFsaWdubWVudF0uc2Vjb25kKSksIGNvdW50LCBsLCBtLDApOwotICAgICAgICBtYXNzZXJ0KGxvZyhkb3VibGUoc2V0T2ZHb29kQ2VudGVyc1tiZXN0QWxpZ25tZW50XS5zZWNvbmQpKSA8PSBsb2coZG91YmxlKGFsaWduX3RvdGFsX2NvdW50KSkpOwotICAgICAgICBpZiAoZHVtcF9maWxlc3x8KEZFV0RVTVBTJiZzZW50LnNlbnRlbmNlTm88MTAwMCl8fChmaW5hbCYmKE9OTFlBTERVTVBTKSkgKQotICAgICAgICAgICAgcHJpbnRBbGlnblRvRmlsZShlcywgZnMsIEVsaXN0LmdldFZvY2FiTGlzdCgpLCBGbGlzdC5nZXRWb2NhYkxpc3QoKSwgb2YyLCAoc2V0T2ZHb29kQ2VudGVyc1tiZXN0QWxpZ25tZW50XS5maXJzdCktPmdldEFsaWdubWVudCgpLCBzZW50LnNlbnRlbmNlTm8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRPZkdvb2RDZW50ZXJzW2Jlc3RBbGlnbm1lbnRdLnNlY29uZCk7Ci0gICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8c2V0T2ZHb29kQ2VudGVycy5zaXplKCk7KytpKQotICAgICAgICAgICAgc2V0T2ZHb29kQ2VudGVyc1tpXS5maXJzdC0+Y2hlY2soKTsKLSAgICAgICAgaWYoIG9mM3x8KHdyaXRlTkJlc3RFcnJvcnNGaWxlJiZwYWlyX25vPGludChSZWZlcmVuY2VBbGlnbm1lbnQuc2l6ZSgpKSkgKXsKLSAgICAgICAgICAgIHZlY3RvcjxBbHM+IGFsczsKLSAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgcz0wO3M8c2V0T2ZHb29kQ2VudGVycy5zaXplKCk7KytzKXsKLSAgICAgICAgICAgICAgICBjb25zdCBNb3ZlU3dhcE1hdHJpeDxNT0RFTF9UWVBFPiZtc2M9ICpzZXRPZkdvb2RDZW50ZXJzW3NdLmZpcnN0OwotICAgICAgICAgICAgICAgIG1zYy5jaGVjaygpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBub3JtYWxpemVkX2FzY29yZT1zZXRPZkdvb2RDZW50ZXJzW3NdLnNlY29uZDsKLSAgICAgICAgICAgICAgICBpZiggIW1zYy5pc0NlbnRlckRlbGV0ZWQoKSApCi0gICAgICAgICAgICAgICAgICAgIGFscy5wdXNoX2JhY2soIEFscyhzLDAsMCxub3JtYWxpemVkX2FzY29yZSkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoV29yZEluZGV4IGo9MTtqPD1tO2orKykKLSAgICAgICAgICAgICAgICAgICAgZm9yKFdvcmRJbmRleCBpPTA7aTw9bDtpKyspCi0gICAgICAgICAgICAgICAgICAgIGlmKCBpIT1tc2MoaikmJiAhbXNjLmlzRGVsTW92ZShpLGopICkKLSAgICAgICAgICAgICAgICAgICAgYWxzLnB1c2hfYmFjayggQWxzKHMsaSxqLG1zYy5jbW92ZShpLGopKm5vcm1hbGl6ZWRfYXNjb3JlKSk7Ci0gICAgICAgICAgICAgICAgZm9yKFBvc2l0aW9uSW5kZXggajE9MTtqMTw9bTtqMSsrKQotICAgICAgICAgICAgICAgICAgICBmb3IoUG9zaXRpb25JbmRleCBqMj1qMSsxO2oyPD1tO2oyKyspCi0gICAgICAgICAgICAgICAgICAgIGlmKCBtc2MoajEpIT1tc2MoajIpICYmICFtc2MuaXNEZWxTd2FwKGoxLGoyKSApCi0gICAgICAgICAgICAgICAgICAgIGFscy5wdXNoX2JhY2soIEFscyhzLC1qMSwtajIsbXNjLmNzd2FwKGoxLGoyKSpub3JtYWxpemVkX2FzY29yZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc29ydChhbHMuYmVnaW4oKSxhbHMuZW5kKCkpOwotICAgICAgICAgICAgZG91YmxlIHN1bT0wLHN1bTI9MDsKLSAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8YWxzLnNpemUoKTsrK2kpCi0gICAgICAgICAgICAgICAgc3VtKz1hbHNbaV0udjsKLSAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8bWluKCh1bnNpZ25lZCBpbnQpYWxzLnNpemUoKSwodW5zaWduZWQgaW50KVByaW50Tik7KytpKXsKLSAgICAgICAgICAgICAgICBhbGlnbm1lbnQgeD0qc2V0T2ZHb29kQ2VudGVyc1thbHNbaV0uc10uZmlyc3Q7Ci0gICAgICAgICAgICAgICAgaWYoICEoYWxzW2ldLmE9PTAgJiYgYWxzW2ldLmI9PTApICl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBhbHNbaV0uYTw9MCYmYWxzW2ldLmI8PTAgKQotICAgICAgICAgICAgICAgICAgICAgICAgeC5kb1N3YXAoLWFsc1tpXS5hLC1hbHNbaV0uYik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHguZG9Nb3ZlKGFsc1tpXS5hLGFsc1tpXS5iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIG9mMyYmaTxQcmludE4gKQotICAgICAgICAgICAgICAgICAgICBwcmludEFsaWduVG9GaWxlKGVzLCBmcywgRWxpc3QuZ2V0Vm9jYWJMaXN0KCksIEZsaXN0LmdldFZvY2FiTGlzdCgpLCpvZjMseC5nZXRBbGlnbm1lbnQoKSwgc2VudC5zZW50ZW5jZU5vLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHNbaV0udi9zdW0qY291bnQpOwotICAgICAgICAgICAgICAgIHN1bTIrPWFsc1tpXS52OwotICAgICAgICAgICAgICAgIGlmKCB3cml0ZU5CZXN0RXJyb3JzRmlsZSApewotICAgICAgICAgICAgICAgICAgICBpZiggcGFpcl9ubzxpbnQoUmVmZXJlbmNlQWxpZ25tZW50LnNpemUoKSkgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBBTG1pc3Npbmc9MCxBTHRvb211Y2g9MCxBTGV2ZW50c01pc3Npbmc9MCxBTGV2ZW50c1Rvb211Y2g9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjxkb3VibGU+IHNjb3JlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yc0luQWxpZ25tZW50KFJlZmVyZW5jZUFsaWdubWVudFtwYWlyX25vLTFdLHguZ2V0QWxpZ25tZW50KCksbCxBTG1pc3NpbmcsQUx0b29tdWNoLEFMZXZlbnRzTWlzc2luZyxBTGV2ZW50c1Rvb211Y2gscGFpcl9ubyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlZi5jb21wdXRlU2NvcmVzKHgsc2NvcmVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICp3cml0ZU5CZXN0RXJyb3JzRmlsZSA8PCBBTG1pc3NpbmcrQUx0b29tdWNoIDw8ICcgJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8c2NvcmVzLnNpemUoKTsrK2kpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKndyaXRlTkJlc3RFcnJvcnNGaWxlIDw8ICgoc2NvcmVzW2ldPjAuMCk/KC1sb2coc2NvcmVzW2ldKSk6MS4wZTYpIDw8ICcgJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICp3cml0ZU5CZXN0RXJyb3JzRmlsZSA8PCAnXG4nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIHdyaXRlTkJlc3RFcnJvcnNGaWxlICkKLSAgICAgICAgICAgICAgICAqd3JpdGVOQmVzdEVycm9yc0ZpbGUgPDwgJ1xuJzsKLSAgICAgICAgfQotICAgICAgICBhZGRBTCgoc2V0T2ZHb29kQ2VudGVyc1tiZXN0QWxpZ25tZW50XS5maXJzdCktPmdldEFsaWdubWVudCgpLHNlbnQuc2VudGVuY2VObyxsKTsKLSAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpPTA7aTxzZXRPZkdvb2RDZW50ZXJzLnNpemUoKTtpKyspCi0gICAgICAgICAgICBkZWxldGUgc2V0T2ZHb29kQ2VudGVyc1tpXS5maXJzdDsKLSAgICAgICAgZG91YmxlIHBlcmlvZCA9IGRpZmZ0aW1lKHRpbWUoTlVMTCksIHNlbnRfcyk7Ci0gICAgICAgIGlmIChWZXJib3NlKQotICAgICAgICAgICAgY2VyciA8PCAicHJvY2Vzc2luZyB0aGlzIHNlbnRlbmNlIHBhaXIgdG9vayA6ICIgPDwgcGVyaW9kCi0gICAgICAgICAgICA8PCAiIHNlY29uZHNcbiI7Ci0gICAgICAgIAotICAgIH0gLyogb2Ygc2VudGVuY2UgcGFpciBFLCBGICovCi0gICAgLy9zSGFuZGxlcjEucmV3aW5kKCk7Ci0gICAgaWYgKGR1bXBfZmlsZXN8fEZFV0RVTVBTfHwoZmluYWwmJihPTkxZQUxEVU1QUykpICkKLSAgICAgICAgb2YyLmNsb3NlKCk7Ci0gICAgZGVsZXRlIG9mMzsKLSAgICBkZWxldGUgd3JpdGVOQmVzdEVycm9yc0ZpbGU7Ci0gICAgZG91YmxlIEZTZW50PXBhaXJfbm87Ci0gICAgY291dCA8PCAiI2NlbnRlcnMocHJlL2hpbGxjbGltYmVkL3JlYWwpOiAiIDw8IE5BbGlnbm1lbnQvRlNlbnQgPDwgIiAiIDw8IE5IaWxsQ2xpbWJlZC9GU2VudCA8PCAiICIgPDwgTkNlbnRlci9GU2VudCA8PCAiICAjYWw6ICIgPDwgTlRvdGFsL0ZTZW50IDw8ICIgI2Fsc29waGlzdGljYXRlZGNvdW50Y29sbGVjdGlvbjogIiA8PCAgIE51bWJlck9mQWxpZ25tZW50c0luU29waGlzdGljYXRlZENvdW50Q29sbGVjdGlvbi9GU2VudCA8PCAiICNoY3N0ZXBzOiAiIDw8IEhpbGxDbGltYmluZ1N0ZXBzL0ZTZW50IDw8ICdcbic7Ci0gICAgY291dCA8PCAiI3BlZ2dpbmdJbXByb3ZlbWVudHM6ICIgPDwgTkJldHRlckJ5UGVnZ2luZy9GU2VudCA8PCAnXG4nOwotfQotI2VuZGlmCi0KLQotCi0jaW5jbHVkZSAiY29sbENvdW50cy5jcHAiCi0jZGVmaW5lIElOU1RBTlRJQVRFKEEsQixDKSB0ZW1wbGF0ZSBcCi12b2lkIG1vZGVsMzo6dml0ZXJiaV9sb29wX3dpdGhfdHJpY2tzPEEsQixDPihQZXJwbGV4aXR5JiBwZXJwLCBQZXJwbGV4aXR5JiB2aXRlcmJpUGVycCwgc2VudGVuY2VIYW5kbGVyJiBzSGFuZGxlcjEsICBcCi0JCQkJCSAgICAgYm9vbCBkdW1wX2ZpbGVzLCBjb25zdCBjaGFyKiBhbGlnbmZpbGUsYm9vbCBjb2xsZWN0X2NvdW50cywgc3RyaW5nLCBib29sIGZpbmFsLFwKLQkJCQkJICAgICBCKmQ0bSxDKmQ1bSk7Ci0KLUlOU1RBTlRJQVRFKHRyYW5zcGFpcl9tb2RlbDMsIHZvaWQsIHZvaWQpOwotSU5TVEFOVElBVEUodHJhbnNwYWlyX21vZGVsaG1tLCBjb25zdCBobW0sIHZvaWQpOwotSU5TVEFOVElBVEUodHJhbnNwYWlyX21vZGVsaG1tLCBjb25zdCBobW0sIGQ0bW9kZWwpOwotSU5TVEFOVElBVEUodHJhbnNwYWlyX21vZGVsaG1tLCBjb25zdCBobW0sIGQ1bW9kZWwpOwotSU5TVEFOVElBVEUodHJhbnNwYWlyX21vZGVsMywgdm9pZCxkNG1vZGVsKTsKLUlOU1RBTlRJQVRFKHRyYW5zcGFpcl9tb2RlbDMsIHZvaWQsZDVtb2RlbCk7Ci1JTlNUQU5USUFURSh0cmFuc3BhaXJfbW9kZWw0LCBkNG1vZGVsLGQ0bW9kZWwpOwotSU5TVEFOVElBVEUodHJhbnNwYWlyX21vZGVsNCwgZDRtb2RlbCxkNW1vZGVsKTsKLUlOU1RBTlRJQVRFKHRyYW5zcGFpcl9tb2RlbDUsIGQ1bW9kZWwsZDVtb2RlbCk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9teWFzc2VydC5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9teWFzc2VydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDliZTguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbXlhc3NlcnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2luY2x1ZGUgIm15c3RsLmgiCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAibXlhc3NlcnQuaCIKLQotI2lmbmRlZiBTVEFOREFSRF9BU1NFUlQKLXZvaWQgbXllcnJvcihpbnQgbGluZSxjb25zdCBjaGFyICpmaWxlLGNvbnN0IGNoYXIgKmV4cHJlc3Npb24pCi17Ci0gIGNlcnIgPDwgIihnZW5lcmFsLmgpOkFzc2VydGlvbiBmYWlsZWQ6ICciIDw8IGV4cHJlc3Npb24gPDwgICInIDo6OiBiICIgCi0gICAgPDwgZmlsZSA8PCAiOiIgPDwgbGluZSA8PCBlbmRsOwotICBjb3V0IDw8ICIoZ2VuZXJhbC5oKTpBc3NlcnRpb24gZmFpbGVkOiAnIiA8PCBleHByZXNzaW9uIDw8ICAiJyA6OjogYiAiIAotICAgIDw8IGZpbGUgPDwgIjoiIDw8IGxpbmUgPDwgZW5kbDsKLX0KLXZvaWQgaW15ZXJyb3IoaW50IGxpbmUsY29uc3QgY2hhciAqZmlsZSxjb25zdCBjaGFyICpleHByZXNzaW9uKQotewotICBjZXJyIDw8ICJFcnJvcjogJyIgPDwgZXhwcmVzc2lvbiA8PCAgIicgOjo6IGluIFNvdXJjZSAiIDw8IGZpbGUgCi0gICAgPDwgIjoiIDw8IGxpbmUgPDwgZW5kbDsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL215YXNzZXJ0LmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9teWFzc2VydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ4ZmRkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL215YXNzZXJ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaWZuZGVmIE1ZX0FTU0VSVF9ERUZJTkVECi0jZGVmaW5lIE1ZX0FTU0VSVF9ERUZJTkVECi12b2lkIG15ZXJyb3IoaW50IGxpbmUsY29uc3QgY2hhciAqZmlsZSxjb25zdCBjaGFyICpleHByZXNzaW9uKTsKLXZvaWQgaW15ZXJyb3IoaW50IGxpbmUsY29uc3QgY2hhciAqZmlsZSxjb25zdCBjaGFyICpleHByZXNzaW9uKTsKLQotI2RlZmluZSBpYXNzZXJ0KGV4cHJlc3Npb24pIGRvIHtpZiAoIShleHByZXNzaW9uKSkge2lteWVycm9yKF9fTElORV9fLF9fRklMRV9fLCNleHByZXNzaW9uKTt9fSB3aGlsZSAoMCkKLQotIwotI2RlZmluZSBtYXNzZXJ0KGV4cHIpIGRvIHt9IHdoaWxlKDApCi0KLSNkZWZpbmUgdmFzc2VydChleHByKSBkbyB7fSB3aGlsZSgwKQotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLQotI2VuZGlmCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvbXltYXRoLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9teW1hdGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhZDkyNi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9teW1hdGguaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogQ29weXJpZ2h0IDE5OTggKGMpIGJ5IFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSAqLwotLyogRnJhbnogSm9zZWYgT2NoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotI2lmbmRlZiBIRUFERVJfTVlNQVRIX0RFRklORUQKLSNkZWZpbmUgSEVBREVSX01ZTUFUSF9ERUZJTkVECi1pbmxpbmUgZG91YmxlIG1mYWJzKGRvdWJsZSB4KXtyZXR1cm4gKHg8MCk/KC14KTp4O30KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL215c3RsLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9teXN0bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWZhNzc4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL215c3RsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogQ29weXJpZ2h0IDE5OTggKGMpIGJ5IFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSAqLwotLyogRnJhbnogSm9zZWYgT2NoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotI2lmbmRlZiBNWV9TVExfSF9ERUZJTkVECi0jZGVmaW5lIE1ZX1NUTF9IX0RFRklORUQKLQotI2luY2x1ZGUgPHN0cmluZz4KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0jaWZkZWYgVVNFX1NUTFBPUlQKLSNpZmRlZiBfX1NUTF9ERUJVRwotdXNpbmcgbmFtZXNwYWNlIF9TVExEOwotI2Vsc2UKLXVzaW5nIG5hbWVzcGFjZSBfU1RMOwotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgIm15YXNzZXJ0LmgiCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaWYgX19HTlVDX18+MgotI2luY2x1ZGUgPGV4dC9oYXNoX21hcD4KLXVzaW5nIF9fZ251X2N4eDo6aGFzaF9tYXA7Ci0jZWxzZQotI2luY2x1ZGUgPGhhc2hfbWFwPgotI2VuZGlmCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAibXltYXRoLmgiCi0jaW5jbHVkZSAiQXJyYXkyLmgiCi0KLSNkZWZpbmUgb3Zlcl9zdHJpbmcoYSxpKSBmb3IodW5zaWduZWQgaW50IGk9MDtpPGEubGVuZ3RoKCk7aSsrKQotI2RlZmluZSBvdmVyX2FycmF5KGEsaSkgZm9yKGk9KGEpLmxvdygpO2k8PShhKS5oaWdoKCk7aSsrKQotI2RlZmluZSBiYWNrd2FyZHNfYXJyYXkoYSxpKSBmb3IoaT0oYSkuaGlnaCgpO2k+PShhKS5sb3coKTtpLS0pCi0jZGVmaW5lIG92ZXJfYXJyKGEsaSkgZm9yKGludCBpPShhKS5sb3coKTtpPD0oYSkuaGlnaCgpO2krKykKLSNkZWZpbmUgb3Zlcl9hcnJNQVgoYSxpLG1heCkgZm9yKGludCBpPShhKS5sb3coKTtpPD1taW4oKGEpLmhpZ2goKSxtYXgtMSk7aSsrKQotI2RlZmluZSBiYWNrd2FyZHNfYXJyKGEsaSkgZm9yKGludCBpPShhKS5oaWdoKCk7aT49KGEpLmxvdygpO2ktLSkKLQotZXh0ZXJuIGRvdWJsZSBuMW11bHQsbjJtdWx0LG4zbXVsdDsKLQotaW5saW5lIGRvdWJsZSByZWFsUHJvYihpbnQgbjEsaW50IG4yKQotewotICBtYXNzZXJ0KG4xPD1uMik7Ci0gIGlhc3NlcnQobjE+PTAmJm4yPjApOwotICBpZihuMj09MCluMj0xOwotICByZXR1cm4gKChkb3VibGUpbjEpLyhkb3VibGUpbjI7Ci19Ci0KLWlubGluZSBkb3VibGUgdmVyZlByb2IoaW50IG4xLGludCBuMikKLXsKLSAgZG91YmxlIHByb2IgPSByZWFsUHJvYihuMSxuMik7Ci0gIGlmKCBuMT09MSApcmV0dXJuIHByb2IqbjFtdWx0OwotICBlbHNlIGlmKCBuMT09MiApcmV0dXJuIHByb2IqbjJtdWx0OwotICBlbHNlIGlmKCBuMT09MyApcmV0dXJuIHByb2IqbjNtdWx0OwotICBlbHNlIAotICByZXR1cm4gcHJvYjsKLX0KLQotaW5saW5lIGJvb2wgcHJlZml4KGNvbnN0IHN0cmluZyZ4LGNvbnN0IHN0cmluZyZ5KQotewotICBpZih5LnNpemUoKT54LnNpemUoKSApCi0gICAgcmV0dXJuIDA7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8eS5zaXplKCk7KytpKQotICAgIGlmKCB5W2ldIT14W2ldICkKLSAgICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotCi0vKnRlbXBsYXRlPGNsYXNzIFQ+Ci1pbnQgbGV2KGNvbnN0IFQmczEsY29uc3QgVCZzMikKLXsKLSAgQXJyYXkyPGludCx2ZWN0b3I8aW50PiA+IGEoczEuc2l6ZSgpKzEsczIuc2l6ZSgpKzEsMTAwMCk7Ci0gIEFycmF5MjxwYWlyPGludCxpbnQ+LHZlY3RvcjxwYWlyPGludCxpbnQ+ID4gPiBiYWNrKHMxLnNpemUoKSsxLHMyLnNpemUoKSsxLHBhaXI8aW50LGludD4oMCwwKSk7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8PXMxLnNpemUoKTtpKyspCi0gICAgZm9yKHVuc2lnbmVkIGludCBqPTA7ajw9czIuc2l6ZSgpO2orKykKLSAgICAgIHsKLQlpZiggaT09MCYmaj09MCApCi0JICBhKGksaik9MDsKLQllbHNlCi0JICB7Ci0JICAgIGludCBhREVMPTEwMCxhSU5TPTEwMCxhU1VCPTEwMDsKLQkgICAgaWYoaT4wKQotCSAgICAgIGFERUw9YShpLTEsaikrMTsKLQkgICAgaWYoaj4wKQotCSAgICAgIGFJTlM9YShpLGotMSkrMTsKLQkgICAgaWYoaT4wJiZqPjApCi0JICAgICAgYVNVQj1hKGktMSxqLTEpKyAhKHMxW2ktMV09PXMyW2otMV0pOwotCSAgICBpZiggYVNVQjw9YURFTCAmJiBhU1VCPD1hSU5TICkKLQkgICAgICB7Ci0JCWEoaSxqKT1hU1VCOwotCQliYWNrKGksaik9cGFpcjxpbnQsaW50PihpLTEsai0xKTsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYoIGFERUw8PWFTVUIgJiYgYURFTDw9YUlOUyApCi0JICAgICAgewotCQlhKGksaik9YURFTDsKLQkJYmFjayhpLGopPXBhaXI8aW50LGludD4oaS0xLGopOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYShpLGopPWFJTlM7Ci0JCWJhY2soaSxqKT1wYWlyPGludCxpbnQ+KGksai0xKTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gIHJldHVybiBhKHMxLnNpemUoKSxzMi5zaXplKCkpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotZmxvYXQgcmVsX2xldihjb25zdCBUJnMxLGNvbnN0IFQmczIpCi17Ci0gIGlmKCBzMS5zaXplKCk9PTAgKQotICAgIHJldHVybiBzMi5zaXplKCk9PTA7Ci0gIGVsc2UKLSAgICByZXR1cm4gbWluKDEuMCxsZXYoczEsczIpLyhkb3VibGUpczEuc2l6ZSgpKTsKLX0qLwotCi10ZW1wbGF0ZTxjbGFzcyBWPiBpbnQgSGFzaChjb25zdCBwYWlyPFYsVj4mYSkgCi17IHJldHVybiBIYXNoKGEuZmlyc3QpKzEzMDAxKkhhc2goYS5zZWNvbmQpOyB9Ci0KLXRlbXBsYXRlPGNsYXNzIFQxLGNsYXNzIFQyPgotb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtICZvdXQsY29uc3QgcGFpcjxUMSxUMj4gJmlyKQoteyAKLSAgb3V0IDw8ICIoIiA8PCBpci5maXJzdCA8PCAiLCIgPDwgaXIuc2Vjb25kIDw8ICIpIjsKLSAgcmV0dXJuIG91dDsKLX0gCi0KLWlubGluZSBpbnQgSGFzaChjb25zdCBzdHJpbmcmIHMpCi17Ci0gIGludCBzdW09MDsKLSAgc3RyaW5nOjpjb25zdF9pdGVyYXRvciBpPXMuYmVnaW4oKSxlbmQ9cy5lbmQoKTsKLSAgZm9yKDtpIT1lbmQ7aSsrKXN1bT01KnN1bSsoKmkpOwotICByZXR1cm4gc3VtOwotfQotdGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCLGNsYXNzIEM+Ci1jbGFzcyB0cmkKLXsKLXB1YmxpYzoKLSAgQSBhOwotICBCIGI7Ci0gIEMgYzsKLSAgdHJpKCl7fTsKLSAgdHJpKGNvbnN0IEEmX2EsY29uc3QgQiZfYixjb25zdCBDJl9jKQotICAgIDogYShfYSksYihfYiksYyhfYykge30KLX07Ci10ZW1wbGF0ZTxjbGFzcyBBLGNsYXNzIEIsY2xhc3MgQz4KLWJvb2wgb3BlcmF0b3I9PShjb25zdCB0cmk8QSxCLEM+JngsY29uc3QgdHJpPEEsQixDPiZ5KQoteyByZXR1cm4geC5hPT15LmEmJnguYj09eS5iJiZ4LmM9PXkuYzt9Ci0KLXRlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQixjbGFzcyBDPgotYm9vbCBvcGVyYXRvcjwoY29uc3QgdHJpPEEsQixDPiZ4LGNvbnN0IHRyaTxBLEIsQz4meSkKLXsKLSAgaWYoeC5hPHkuYSlyZXR1cm4gMTsKLSAgaWYoeS5hPHguYSlyZXR1cm4gMDsKLSAgaWYoeC5iPHkuYilyZXR1cm4gMTsKLSAgaWYoeS5iPHguYilyZXR1cm4gMDsKLSAgaWYoeC5jPHkuYylyZXR1cm4gMTsKLSAgaWYoeS5jPHguYylyZXR1cm4gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLWRvdWJsZSB1c2VkX3RpbWUoKTsKLQotCi10ZW1wbGF0ZTxjbGFzcyBUICxjbGFzcyBfUHIgPSBsZXNzPFQ+ID4KLWNsYXNzIG15X2hhc2gKLXsKLXB1YmxpYzoKLQlpbnQgb3BlcmF0b3IoKShjb25zdCBUJnQpY29uc3Qge3JldHVybiBIYXNoKHQpO30KLSNpZmRlZiBXSU4zMgotCWVudW0NCi0JewkvLyBwYXJhbWV0ZXJzIGZvciBoYXNoIHRhYmxlDQotCQlidWNrZXRfc2l6ZSA9IDEJCS8vIDAgPCBidWNrZXRfc2l6ZQ0KLQl9OwotCW15X2hhc2goKQ0KLQkJOiBjb21wKCkNCi0JewkvLyBjb25zdHJ1Y3Qgd2l0aCBkZWZhdWx0IGNvbXBhcmF0b3INCi0JfQ0KLQ0KLQlteV9oYXNoKF9QciBfUHJlZCkNCi0JCTogY29tcChfUHJlZCkNCi0JewkvLyBjb25zdHJ1Y3Qgd2l0aCBfUHJlZCBjb21wYXJhdG9yDQotCX0KLXByb3RlY3RlZDoNCi0JX1ByIGNvbXA7Ci1wdWJsaWM6Ci0JaW50IG9wZXJhdG9yKCkoY29uc3QgVCZ0ICwgY29uc3QgVCZ0MSljb25zdCB7cmV0dXJuIGNvbXAodCx0MSk7fQotI2VuZGlmCi19OwotCi1pbmxpbmUgaW50IEhhc2goaW50IHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfQotI2RlZmluZSBNWV9IQVNIX0JBU0UgaGFzaF9tYXA8QSxCLG15X2hhc2g8QT4gPgotCi10ZW1wbGF0ZTxjbGFzcyBBLGNsYXNzIEI+Ci1jbGFzcyBsZWRhX2hfYXJyYXkgOiBwdWJsaWMgTVlfSEFTSF9CQVNFCi17Ci1wcml2YXRlOgotICBCIGluaXQ7Ci1wdWJsaWM6Ci0gIGxlZGFfaF9hcnJheSgpIDogTVlfSEFTSF9CQVNFKCkge30KLSAgbGVkYV9oX2FycmF5KGNvbnN0IEImX2luaXQpCi0gICAgOiBNWV9IQVNIX0JBU0UoKSxpbml0KF9pbml0KSB7fQotICBib29sIGRlZmluZWQoY29uc3QgQSZhKSBjb25zdAotICAgIHsgcmV0dXJuIGZpbmQoYSkhPXRoaXMtPmVuZCgpOyB9Ci0gIGNvbnN0IEImb3BlcmF0b3JbXShjb25zdCBBJmEpY29uc3QKLSAgICB7IAotICAgICAgdHlwZW5hbWUgTVlfSEFTSF9CQVNFOjpjb25zdF9pdGVyYXRvciBwb3M9ZmluZChhKTsKLSAgICAgIGlmKCBwb3M9PXRoaXMtPmVuZCgpICkKLQlyZXR1cm4gaW5pdDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gcG9zLT5zZWNvbmQ7Ci0gICAgfQotICBCJm9wZXJhdG9yW10oY29uc3QgQSZhKQotICAgIHsgCi0gICAgICB0eXBlbmFtZSBNWV9IQVNIX0JBU0U6Oml0ZXJhdG9yIHBvcz1maW5kKGEpOwotICAgICAgaWYoIHBvcz09dGhpcy0+ZW5kKCkgKQotCXsKLQkgIGluc2VydChNWV9IQVNIX0JBU0U6OnZhbHVlX3R5cGUoYSxpbml0KSk7Ci0JICBwb3M9ZmluZChhKTsKLQkgIGlhc3NlcnQocG9zIT10aGlzLT5lbmQoKSk7Ci0JfQotICAgICAgcmV0dXJuIHBvcy0+c2Vjb25kOwotICAgIH0KLSAgY29uc3QgQiZpbml0VmFsdWUoKWNvbnN0Ci0gICAge3JldHVybiBpbml0O30KLX07Ci0KLSNkZWZpbmUgZm9yYWxsX2RlZmluZWRfaChhLGIsYyxkKSBmb3IodHlwZW5hbWUgbGVkYV9oX2FycmF5PGEsYj46OmNvbnN0X2l0ZXJhdG9yIF9fampfXz0oZCkuYmVnaW4oKTtfX2pqX18hPShkKS5lbmQoKSYmKChjPV9fampfXy0+Zmlyc3QpLDEpOyArK19fampfXykKLXRlbXBsYXRlPGNsYXNzIFQsY2xhc3MgVT4KLW9zdHJlYW0gJiBvcGVyYXRvcjw8KG9zdHJlYW0mb3V0LGNvbnN0IGxlZGFfaF9hcnJheTxULFU+JncpCi17Ci0gIFQgdDsKLSAgYm9vbCBtYWtlTmw9MDsKLSAgb3V0IDw8ICJoX2FycmF5eyI7Ci0gIGZvcmFsbF9kZWZpbmVkX2goVCxVLHQsdykKLSAgICB7Ci0gICAgICBpZiggbWFrZU5sICkKLQlvdXQgPDwgIlxuICAgICAgICI7Ci0gICAgICBvdXQgPDwgIkVMOiIgPDwgdCA8PCAiIElOSDoiIDw8IHdbdF0gPDwgIi4iOwotICAgICAgbWFrZU5sPTE7Ci0gICAgfQotICByZXR1cm4gb3V0IDw8ICJ9XG4iOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBULGNsYXNzIFU+Ci1pc3RyZWFtICYgb3BlcmF0b3I+Pihpc3RyZWFtJmluLGxlZGFfaF9hcnJheTxULFU+JikKLXsKLSAgcmV0dXJuIGluOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBBLGNsYXNzIEI+Ci1ib29sIG9wZXJhdG9yPT0oY29uc3QgbGVkYV9oX2FycmF5PEEsQj4mcDEsY29uc3QgbGVkYV9oX2FycmF5PEEsQj4mcDIpCi17Ci0gIEEgdjsKLSAgZm9yYWxsX2RlZmluZWRfaChBLEIsdixwMSkKLSAgICBpZiggISggcDFbdl09PXAyW3ZdKSApIHJldHVybiAwOwotICBmb3JhbGxfZGVmaW5lZF9oKEEsQix2LHAyKQotICAgIGlmKCAhKCBwMVt2XT09cDJbdl0pICkgcmV0dXJuIDA7Ci0gIHJldHVybiAxOyAKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLWludCBjb3VudF9lbGVtZW50cyhUIGEsVCBiKQotewotICBpbnQgYz0wOwotICB3aGlsZShhIT1iKQotICAgIHsKLSAgICAgIGErKzsKLSAgICAgIGMrKzsKLSAgICB9Ci0gIHJldHVybiBjOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotVCBub3JtYWxpemVfaWZfcG9zc2libGVfd2l0aF9pbmNyZW1lbnQoVCphLFQqYixpbnQgaW5jcmVtZW50KQotewotICBUIHN1bT0wOwotICBmb3IoVCppPWE7aSE9YjtpKz1pbmNyZW1lbnQpCi0gICAgc3VtKz0qaTsKLSAgaWYoIHN1bSApCi0gICAgZm9yKFQqaT1hO2khPWI7aSs9aW5jcmVtZW50KQotICAgICAgKmkvPXN1bTsKLSAgZWxzZQotICAgIHsKLSAgICAgIFQgZmFjdG9yPWluY3JlbWVudC8oYi1hKTsKLSAgICAgIGZvcihUKmk9YTtpIT1iO2krPWluY3JlbWVudCkKLQkqaT1mYWN0b3I7Ci0gICAgfQotICByZXR1cm4gc3VtOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotaW5saW5lIGludCBtX2NvbXBfM3dheShUIGEsVCBiLGludCBuKQotewotICBpbnQgX249MDsKLSAgd2hpbGUoKF9uKys8bikgJiYgYSAmJiBiKQotICAgIHsKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUgJmFhPSphOwotICAgICAgY29uc3QgdHlwZW5hbWUgVDo6dmFsdWVfdHlwZSAmYmI9KmI7Ci0gICAgICBpZiggYWE8YmIgKXJldHVybiAxOwotICAgICAgaWYoIGJiPGFhIClyZXR1cm4gLTE7Ci0gICAgICArK2E7Ci0gICAgICArK2I7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXZvaWQgc21vb3RoX3N0YW5kYXJkKFQqYSxUKmIsZG91YmxlIHApCi17Ci0gIGludCBuPWItYTsKLSAgaWYoIG49PTAgKSAKLSAgICByZXR1cm47Ci0gIGRvdWJsZSBwcD1wL247Ci0gIGZvcihUKmk9YTtpIT1iOysraSkKLSAgICAqaSA9ICgxLjAtcCkqKCppKStwcDsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLWNvbnN0IFQgKmNvbnYodHlwZW5hbWUgdmVjdG9yPFQ+Ojpjb25zdF9pdGVyYXRvciBpKQotewotICByZXR1cm4gJigqaSk7Ci19Ci0jaWYgX19HTlVDX18+MgotdGVtcGxhdGU8Y2xhc3MgVD4KLVQgKmNvbnYodHlwZW5hbWUgdmVjdG9yPFQ+OjppdGVyYXRvciBpKQotewotICByZXR1cm4gJigqaSk7Ci19Ci0jZW5kaWYKLQotLyp0ZW1wbGF0ZTxjbGFzcyBUPgotY29uc3QgVCAqY29udihjb25zdCBUKngpCi17Ci0gIHJldHVybiB4OwotfSovCi10ZW1wbGF0ZTxjbGFzcyBUPgotVCAqY29udihUKngpCi17Ci0gIHJldHVybiB4OwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3BhcnNlLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3BhcnNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlYjU3MC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9wYXJzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLS8qIEZKTyAwMS8yMDAxOiBjb21wbGV0ZWx5IHJlb3JnYW5pemVkIHBhcmFtZXRlciBwcm9jZXNzaW5nICovCi0KLSNpbmNsdWRlIDxzdHJzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgInV0aWxpdHkuaCIKLSNpbmNsdWRlICJHbG9iYWxzLmgiCi0jaW5jbHVkZSAiRDRUYWJsZXMuaCIKLSNpbmNsdWRlICJENVRhYmxlcy5oIgotI2luY2x1ZGUgIkFUYWJsZXMuaCIKLSNpbmNsdWRlICJQYXJhbWV0ZXIuaCIKLQotZXh0ZXJuIGJvb2wgT05MWUFMRFVNUFM7Ci0KLXZvaWQgcGFyc2VDb25maWdGaWxlIChjaGFyICogZm5hbWUgKQotICAvLyBUaGlzIGZ1bmN0aW9ucyByZWFkcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHRvIHNldCB1cCBzb21lIHJ1bi10aW1lCi0gIC8vIHBhcmFtZXRlcnMuIFRoZSBwYXJhbWV0ZXJzIGFyZSBnbG9iYWwgdmFyaWFibGVzIHRoYXQgYXJlIGRlZmluZWQgaW4gCi0gIC8vIG1haW4uY2MgYW5kIHVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlIGluIHRoZSBwcm9ncmFtCi0gIC8vIFRoZSBmb3JtYXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjYW4gYmUgZXhwbGFpbmVkIGluIHRoZSBmb2xsb3dpbmcgd2F5Ci0gIC8vIEZPUk1BVDoKLSAgLy8gdGhlIGNoYXJhY3RlciAnXG4nIHNlcGFyYXRlcyBsaW5lcyAuLgotICAvLyBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggIi8vIiAoc2tpcHBpbmcgb3ZlciB3aGl0ZSBzcGFjZXMgYXJlIGNvbnNpZGVyZWQgCi0gIC8vIGFzIGNvbW1lbnRzIGFuZCB3aWxsIGJlIGlnbm9yZWQuCi0gIC8vIEFueSBvdGhlciBsaW5lIGlzIGNvbnNpZGVyZWQgYXMgYW4gYXR0cmlidXRlIHNldHRpbmcgaW5zdHJ1Y3Rpb24gYW5kIGl0IAotICAvLyBpcyBkaXZpZGVkIGludG8gaGF2ZXMgKHNlcGFyYXRlZCBieSBhIGNvbG9uICI6IikuIFRoZSBmaXJzdCBoYWxmIGlzIHRoZQotICAvLyBhdHRyaWJ1dGUgdmFsdWUgd2hpY2ggY29uc2lzdHMgb2YgdGhlIGNvbmNhdGVuYXRpb24gb2YgYWxsIG5vbi13aGl0ZSBzcGFjZQotICAvLyB0b2tlbnMgYmVmb3JlIHRoZSBjb2xvbi4gVGhlc2UgdG9rZW5zIHdpbGwgaGF2ZSBzcGFjZXMgZXNlcGFyYXRpbmcgdGhlbS4KLSAgLy8gVGhlIGF0dHJpYnV0ZSB2bHVlIGlzIHRoZSBmaXJzdCB0b2tlbiBhZnRlciB0aGUgY29sb24gKGFueSB0aGluZyBhZnRlciAKLSAgLy8gaXQgd2lsbCBiZSBpZ25vcmVkIDsKLSAgLy8gRm9yIGV4YW1wbGUgOgotICAvLyBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGhhcyB0aGUgZm9sbG93aW5nIGVudHJ5OgotICAvLwotICAvLyBOTy4gICBJVEVSQVRJT05TICAgTU9ERUwgMiA6CTEwCi0gIC8vCi0gIC8vIHRoZW4gdGhlIGF0dHJpYnV0ZSBpcyAiTk8uIElURVJBVElPTlMgTU9ERUwgMiIgLCBhbmQgdGhlIGF0dHJpYnV0ZSB2YWx1ZQotICAvLyBpcyAiMTAiICAodGhlc2UgZG8gbm90IGluY2x1ZGUgdGhlIHF1b3RhdGlvbiBtYXJrcykuCi0KLXsKLQotICBzdHJpbmcgbGluZSwgd29yZCwgYXR0cmliLCBhdHRyaWJ2YWwgOwotICBpZnN0cmVhbSBDb25maWdfRmlsZShmbmFtZSk7Ci0gIGlmKCFDb25maWdfRmlsZSl7Ci0gICAgY2VyciA8PCAiRVJST1I6ICBDYW5ub3Qgb3BlbiBjb25maWd1cmF0aW9uIGZpbGUgIiA8PCBmbmFtZSA8PCAiIVxuIiA7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi0gIGNvdXQgPDwgIlRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgZnJvbSB0aGUgY29uZmlnIGZpbGUgYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgYW55IGNvbW1hbmQgbGluZSBvcHRpb25zLlxuIjsKLSAgCi0gIHdoaWxlKGdldGxpbmUoQ29uZmlnX0ZpbGUsIGxpbmUpKXsKLQotICAgIGlzdHJzdHJlYW0gYnVmZmVyKGxpbmUuY19zdHIoKSk7Ci0gICAgd29yZCA9IGF0dHJpYiA9IGF0dHJpYnZhbCA9ICIiIDsKLSAgICBidWZmZXIgPj4gd29yZCAgOwotICAgIGlmICh3b3JkICE9ICIvLyIpeyAvLyBpZiBsaW5lIGRvZXMgbm90IHN0YXJ0IHdpdGggIi8vIiAoaS5lLiBub3QgYSBjb21tZW50KQotICAgICAgYXR0cmliID0gd29yZCA7Ci0gICAgICB3aGlsZSgoYnVmZmVyID4+IHdvcmQpICYmICh3b3JkICE9ICI6IikpewotCWF0dHJpYiArPSAiICIgKyB3b3JkIDsKLSAgICAgIH0gICAgICAKLSAgICAgIGlmKCEoYnVmZmVyID4+IGF0dHJpYnZhbCkpCi0JewotCSAgaXN0cnN0cmVhbSBidWZmZXIyKGxpbmUuY19zdHIoKSk7Ci0JICBidWZmZXIyPj5hdHRyaWI7Ci0JICBidWZmZXIyPj5hdHRyaWJ2YWw7Ci0JfQotCi0gICAgICAvLyBUaGlzIyBpcyB3aGVyZSAoMSkgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBkZWZpbmVkIGFuZAotICAgICAgLy8gICAgICAgICAgICAgICAoMikgcGFyc2luZyBvZiBpdHMgYXR0cmlidXRlcyBvY2N1cnMuCi0gICAgICAKLSAgICAgIGlmKGF0dHJpYiA9PSAidCBGSUxFIil7Ci0JdF9GaWxlbmFtZSA9IGF0dHJpYnZhbDsKLQljb3V0IDw8ICJcdHQgZmlsZTogICIgPDwgdF9GaWxlbmFtZSA8PCAnXG4nOwotICAgICAgfQotICAgICAgZWxzZSBpZihhdHRyaWIgPT0gICJhIEZJTEUiKXsKLQlhX0ZpbGVuYW1lID0gYXR0cmlidmFsOwotCWNvdXQgPDwgIlx0YSBmaWxlOiAgIiA8PCBhX0ZpbGVuYW1lIDw8ICdcbic7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKGF0dHJpYiA9PSAiZCBGSUxFIil7Ci0JZF9GaWxlbmFtZSA9IGF0dHJpYnZhbDsKLQljb3V0IDw8ICJcdGQgZmlsZTogICIgPDwgZF9GaWxlbmFtZSA8PCAnXG4nOwotICAgICAgfQotICAgICAgZWxzZSBpZihhdHRyaWIgPT0gIm4gRklMRSIpewotCW5fRmlsZW5hbWUgPSBhdHRyaWJ2YWw7Ci0JY291dCA8PCAiXHRuIGZpbGU6ICAiIDw8IG5fRmlsZW5hbWUgPDwgJ1xuJzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoYXR0cmliID09ICJwMCBGSUxFIil7Ci0JcDBfRmlsZW5hbWUgPSBhdHRyaWJ2YWw7Ci0JY291dCA8PCAiXHRwMCBmaWxlOiAgIiA8PCBwMF9GaWxlbmFtZSA8PCAnXG4nOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGxpbmUgPT0gIiIpe30KLSAgICAgIGVsc2UgaWYoICAhbWFrZVNldENvbW1hbmQoYXR0cmliLGF0dHJpYnZhbCxnZXRHbG9iYWxQYXJTZXQoKSwyKSApCi0JY2VyciA8PCAiRVJST1I6IFVucmVjb2duaXplZCBhdHRyaWJ1dGUgOiIgPDwgYXR0cmliIDw8ICdcbic7Ci0gICAgfQotICB9Ci19Ci0KLQotdm9pZCBwYXJzZUFyZ3VtZW50cyhpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBpbnQgYXJnID0gMTsKLSAgICAKLSAgICBpZighc3RyY21wKGFyZ3ZbMV0sICItLWgiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSl7Ci0gICAgICAgIHByaW50SGVscCgpOwotICAgICAgICBleGl0KDApOwotICAgIH0KLSAgICBpZiggYXJndlsxXVswXT09Jy0nICkKLSAgICAgICAgYXJnPTA7Ci0gICAgZWxzZQotICAgICAgICBwYXJzZUNvbmZpZ0ZpbGUoYXJndlsxXSk7Ci0gICAgd2hpbGUoKythcmc8YXJnYyl7Ci0gICAgICAgIGlmKCBzdHJsZW4oYXJndlthcmddKT4yICYmIGFyZ3ZbYXJnXVswXT09Jy0nICYmIGFyZ3ZbYXJnXVsxXT09Jy0nICkgewotICAgICAgICAgICAgaWYoICFtYWtlU2V0Q29tbWFuZChhcmd2W2FyZ10rMSwiMSIsZ2V0R2xvYmFsUGFyU2V0KCksMikpCi0gICAgICAgICAgICAgICAgY2VyciA8PCAiV0FSTklORzogaWdub3JpbmcgdW5yZWNvZ25pemVkIG9wdGlvbjogICI8PCBhcmd2W2FyZ10gPDwgJ1xuJyA7ICAKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBhcmcrMTxhcmdjICYmICFtYWtlU2V0Q29tbWFuZChhcmd2W2FyZ10sYXJndlthcmcrMV0sZ2V0R2xvYmFsUGFyU2V0KCksMikpCi0gICAgICAgICAgICBjZXJyIDw8ICJXQVJOSU5HOiBpZ25vcmluZyB1bnJlY29nbml6ZWQgb3B0aW9uOiAgIjw8IGFyZ3ZbYXJnXSA8PCAnXG4nIDsgIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFyZysrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKCBPUGF0aC5sZW5ndGgoKSApCi0gICAgICAgIE9QYXRoKz0iLyI7Ci0gICAgUHJlZml4ID0gKE9QYXRoICsgUHJlZml4KTsKLSAgICBMb2dGaWxlbmFtZSA9IChPUGF0aCArIExvZ0ZpbGVuYW1lKTsKLSAgICBwcmludEdJWkFQYXJzKGNvdXQpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9wbGFpbjJzbnQuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvcGxhaW4yc250LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhZTA2Ni4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9wbGFpbjJzbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3Ryc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1pbnQgbWFpbihpbnQgYXJnYyxjaGFyKiphcmd2KQotewotICBzdHJpbmcgc250MSgiIiksIHNudDIoIiIpLCB2Y2IxKCIiKSwgdmNiMigiIik7Ci0gIHZlY3Rvcjxkb3VibGU+d2VpZ2h0czsKLSAgdmVjdG9yPHN0cmluZz5maWxlbmFtZXM7Ci0gIGZvcihpbnQgaT0xO2k8YXJnYzsrK2kpCi0gICAgaWYoc3RyaW5nKGFyZ3ZbaV0pPT0iLXdlaWdodCIpCi0gICAgICB3ZWlnaHRzLnB1c2hfYmFjayhhdG9mKGFyZ3ZbKytpXSkpOwotICAgIGVsc2UgaWYoc3RyaW5nKGFyZ3ZbaV0pPT0iLXNudDEiKQotICAgICAgc250MT1hcmd2WysraV07Ci0gICAgZWxzZSBpZihzdHJpbmcoYXJndltpXSk9PSItc250MiIpCi0gICAgICBzbnQyPWFyZ3ZbKytpXTsKLSAgICBlbHNlIGlmKHN0cmluZyhhcmd2W2ldKT09Ii12Y2IxIikKLSAgICAgIHZjYjE9YXJndlsrK2ldOwotICAgIGVsc2UgaWYoc3RyaW5nKGFyZ3ZbaV0pPT0iLXZjYjIiKQotICAgICAgdmNiMj1hcmd2WysraV07Ci0gICAgZWxzZQotICAgICAgZmlsZW5hbWVzLnB1c2hfYmFjayhhcmd2W2ldKTsKLSAgCi0gIGlmKChmaWxlbmFtZXMuc2l6ZSgpJTIpPT0xfHxmaWxlbmFtZXMuc2l6ZSgpPT0wICkKLSAgICB7Ci0gICAgICBjZXJyIDw8IGFyZ3ZbMF0gPDwgIiB0eHQxIHR4dDIgW3R4dDMgdHh0NCAtd2VpZ2h0IHcgLXZjYjEgb3V0cHV0MS52Y2IgLXZjYjIgb3V0cHV0Mi52Y2IgLXNudDEgb3V0cHV0MV9vdXRwdXQyLnNudCAtc250MiBvdXRwdXQyX291dHB1dDEuc250XVxuIjsKLSAgICAgIGNlcnIgPDwgIiBDb252ZXJ0cyBwbGFpbiB0ZXh0IGludG8gR0laQSsrIHNudC1mb3JtYXQuXG4iOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIHN0cmluZyBsaW5lMSxsaW5lMix3b3JkOwotICBtYXA8c3RyaW5nLGludD4gdjEsdjI7Ci0gIG1hcDxzdHJpbmcsaW50PiBpZDEsaWQyOwotICB2ZWN0b3I8c3RyaW5nPiBpaWQxKDIpLGlpZDIoMik7Ci0gIAotICBzdHJpbmcgdzEoZmlsZW5hbWVzWzBdKTsKLSAgc3RyaW5nIHcyKGZpbGVuYW1lc1sxXSk7Ci0gIAotICBpZiggdzEubGVuZ3RoKCk+NCYmdzIubGVuZ3RoKCk+NCYmKCh3MS5zdWJzdHIodzEubGVuZ3RoKCktNCx3MS5sZW5ndGgoKSk9PSIudG9rIiAmJiB3Mi5zdWJzdHIodzIubGVuZ3RoKCktNCx3Mi5sZW5ndGgoKSk9PSIudG9rIiApfHwKLQkJCQkgICAgICh3MS5zdWJzdHIodzEubGVuZ3RoKCktNCx3MS5sZW5ndGgoKSk9PSIudHh0IiAmJiB3Mi5zdWJzdHIodzIubGVuZ3RoKCktNCx3Mi5sZW5ndGgoKSk9PSIudHh0IiApICkpCi0gICAgewotICAgICAgdzE9dzEuc3Vic3RyKDAsdzEubGVuZ3RoKCktNCk7Ci0gICAgICB3Mj13Mi5zdWJzdHIoMCx3Mi5sZW5ndGgoKS00KTsKLSAgICAgIGNlcnIgPDwgIncxOiI8PCB3MSA8PCAiIHcyOiIgPDwgdzIgPDwgZW5kbDsKLSAgICB9IAotCi0gIHN0cmluZyB2b2NhYjEodzEpLHZvY2FiMih3Mik7Ci0gIHVuc2lnbmVkIGludCBzbGFzaHBvcz12b2NhYjEucmZpbmQoJy8nKSsxOwotI2lmZGVmIFdJTjMyCi0gIGlmKHNsYXNocG9zPT0wKSBzbGFzaHBvcz12b2NhYjEucmZpbmQoJ1xcJykrMTsKLSNlbmRpZgotICBpZiggc2xhc2hwb3M+PXZvY2FiMS5sZW5ndGgoKSApIHNsYXNocG9zPTA7Ci0gIHN0cmluZyB2b2NhYjF4KHZvY2FiMS5zdWJzdHIoc2xhc2hwb3Msdm9jYWIxLmxlbmd0aCgpKSk7Ci0gIGNvdXQgPDwgdm9jYWIxIDw8ICIgLT4gIiA8PCB2b2NhYjF4IDw8IGVuZGw7Ci0gIHNsYXNocG9zPXZvY2FiMi5yZmluZCgnLycpKzE7Ci0jaWZkZWYgV0lOMzIKLSAgaWYoc2xhc2hwb3M9PTApIHNsYXNocG9zPXZvY2FiMS5yZmluZCgnXFwnKSsxOwotI2VuZGlmCi0gIGlmKCBzbGFzaHBvcz49dm9jYWIyLmxlbmd0aCgpICkgc2xhc2hwb3M9MDsKLSAgc3RyaW5nIHZvY2FiMngodm9jYWIyLnN1YnN0cihzbGFzaHBvcyx2b2NhYjIubGVuZ3RoKCkpKTsKLSAgY291dCA8PCB2b2NhYjIgPDwgIiAtPiAiIDw8IHZvY2FiMnggPDwgZW5kbDsKLSAgaWYgKHNudDE9PSIiKSB7Ci0gICAgc250MT12b2NhYjErIl8iK3ZvY2FiMngrc3RyaW5nKCIuc250Iik7Ci0gIH0KLSAgaWYgKHNudDI9PSIiKSB7Ci0gICAgc250Mj12b2NhYjIrIl8iK3ZvY2FiMXgrc3RyaW5nKCIuc250Iik7Ci0gIH0KLSAgaWYgKHZjYjE9PSIiKSB7Ci0gICAgdm9jYWIxKz1zdHJpbmcoIi52Y2IiKTsKLSAgfSBlbHNlIHsKLSAgICB2b2NhYjE9dmNiMTsKLSAgfQotICBpZiAodmNiMj09IiIpIHsKLSAgICB2b2NhYjIrPXN0cmluZygiLnZjYiIpOwotICB9IGVsc2UgewotICAgIHZvY2FiMj12Y2IyOwotICB9Ci0KLSAgb2ZzdHJlYW0gb3ZvY2FiMSh2b2NhYjEuY19zdHIoKSksb3ZvY2FiMih2b2NhYjIuY19zdHIoKSksb3NudDEoc250MS5jX3N0cigpKSxvc250MihzbnQyLmNfc3RyKCkpOwotICBmb3IodW5zaWduZWQgaW50IGk9MDtpPGZpbGVuYW1lcy5zaXplKCk7aSs9MikKLSAgICB7Ci0gICAgICBpZnN0cmVhbSBpMShmaWxlbmFtZXNbaV0uY19zdHIoKSksaTIoZmlsZW5hbWVzW2krMV0uY19zdHIoKSk7Ci0gICAgICBpZighaTEpY2VyciA8PCAiV0FSTklORzogIiA8PCBmaWxlbmFtZXNbaV0gPDwgIiBjYW5ub3QgYmUgcmVhZC5cbiI7Ci0gICAgICBpZighaTIpY2VyciA8PCAiV0FSTklORzogIiA8PCBmaWxlbmFtZXNbaSsxXSA8PCAiIGNhbm5vdCBiZSByZWFkLlxuIjsKLSAgICAgIHdoaWxlKGdldGxpbmUoaTEsbGluZTEpICYmIGdldGxpbmUoaTIsbGluZTIpICkKLQl7Ci0JICB2ZWN0b3I8c3RyaW5nPiB0MSx0MjsKLQkgIGlzdHJzdHJlYW0gaWkxKGxpbmUxLmNfc3RyKCkpOwotCSAgd2hpbGUoaWkxPj53b3JkKQotCSAgICB7Ci0JICAgICAgdDEucHVzaF9iYWNrKHdvcmQpOwotCSAgICAgIHYxW3dvcmRdKys7Ci0JICAgICAgaWYoIGlkMS5maW5kKHdvcmQpPT1pZDEuZW5kKCkgKQotCQl7Ci0JCSAgaWlkMS5wdXNoX2JhY2sod29yZCk7Ci0JCSAgaWQxW3dvcmRdPWlpZDEuc2l6ZSgpLTE7Ci0JCX0KLQkgICAgfQotCSAgaXN0cnN0cmVhbSBpaTIobGluZTIuY19zdHIoKSk7Ci0JICB3aGlsZShpaTI+PndvcmQpCi0JICAgIHsKLQkgICAgICB0Mi5wdXNoX2JhY2sod29yZCk7Ci0JICAgICAgdjJbd29yZF0rKzsKLQkgICAgICBpZiggaWQyLmZpbmQod29yZCk9PWlkMi5lbmQoKSApCi0JCXsKLQkJICBpaWQyLnB1c2hfYmFjayh3b3JkKTsKLQkJICBpZDJbd29yZF09aWlkMi5zaXplKCktMTsKLQkJfQotCSAgICB9Ci0JICBkb3VibGUgdz0xLjA7Ci0JICBpZiggaS8yPHdlaWdodHMuc2l6ZSgpICkKLQkgICAgdz13ZWlnaHRzW2kvMl07Ci0JICBpZiggdDEuc2l6ZSgpJiZ0Mi5zaXplKCkgKQotCSAgICB7Ci0JICAgICAgb3NudDEgPDwgdyA8PCAiXG4iOwotCSAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0wO2o8dDEuc2l6ZSgpOysrailvc250MSA8PCBpZDFbdDFbal1dIDw8ICcgJzsKLQkgICAgICBvc250MSA8PCAnXG4nOwotCSAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0wO2o8dDIuc2l6ZSgpOysrailvc250MSA8PCBpZDJbdDJbal1dIDw8ICcgJzsKLQkgICAgICBvc250MSA8PCAnXG4nOwotCi0JICAgICAgb3NudDIgPDwgdyA8PCAiXG4iOwotCSAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0wO2o8dDIuc2l6ZSgpOysrailvc250MiA8PCBpZDJbdDJbal1dIDw8ICcgJzsKLQkgICAgICBvc250MiA8PCAnXG4nOwotCSAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0wO2o8dDEuc2l6ZSgpOysrailvc250MiA8PCBpZDFbdDFbal1dIDw8ICcgJzsKLQkgICAgICBvc250MiA8PCAnXG4nOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGNlcnIgPDwgIldBUk5JTkc6IGZpbHRlcmVkIG91dCBlbXB0eSBzZW50ZW5jZSAoc291cmNlOiAiIDw8IGZpbGVuYW1lc1tpXSA8PCAiICIgPDwgdDEuc2l6ZSgpIDw8Ci0JICAgICAgIiB0YXJnZXQ6ICIgPDwgZmlsZW5hbWVzW2krMV0gPDwgIiAiIDw8IHQyLnNpemUoKSA8PCAiKS5cbiI7Ci0JfQotICAgIH0KLSAgCi0gIGZvcih1bnNpZ25lZCBpbnQgaT0yO2k8aWlkMS5zaXplKCk7KytpKQotICAgIG92b2NhYjEgPDwgaSA8PCAnICcgPDwgaWlkMVtpXSA8PCAnICcgPDwgdjFbaWlkMVtpXV0gPDwgJ1xuJzsKLSAgZm9yKHVuc2lnbmVkIGludCBpPTI7aTxpaWQyLnNpemUoKTsrK2kpCi0gICAgb3ZvY2FiMiA8PCBpIDw8ICcgJyA8PCBpaWQyW2ldIDw8ICcgJyA8PCB2MltpaWQyW2ldXSA8PCAnXG4nOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvcmVwb3J0cy5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9yZXBvcnRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1ODczYS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9yZXBvcnRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpbmNsdWRlIDxzdHJzdHJlYW0+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAidm9jYWIuaCIgCi0jaW5jbHVkZSAiUGVycGxleGl0eS5oIgotI2luY2x1ZGUgImdldFNlbnRlbmNlLmgiCi0jaW5jbHVkZSAiVFRhYmxlcy5oIgotI2luY2x1ZGUgIkdsb2JhbHMuaCIKLSNpbmNsdWRlICJQYXJhbWV0ZXIuaCIKLQotdm9pZCBwcmludEhlbHAodm9pZCkKLXsKLSAgY2VyciA8PCAiVXNhZ2U6XG5cbiIgPDwgVXNhZ2UgPDwgJ1xuJzsKLSAgY2VyciA8PCAiT3B0aW9ucyAodGhlc2Ugb3ZlcnJpZGUgcGFyYW1ldGVycyBzZXQgaW4gdGhlIGNvbmZpZyBmaWxlKTpcblxuIjsKLSAgY2VyciA8PCAiXHQtLXYgXHRcdCBwcmludCB2ZXJib3NlIG1lc3NhZ2UsIFdhcm5pbmcgdGhpcyBpcyBub3QgdmVyeSBkZXNjcmlwdGl2ZSBhbmQgbm90IHN5c3RlbWF0aWMuXG4iOwotICBjZXJyIDw8ICJcdC0tTk9EVU1QUyBcdCBEbyBub3Qgd3JpdGUgYW55IGZpbGVzIHRvIGRpc2sgKFRoaXMgd2lsbCBvdmVyIHdyaXRlIGR1bXAgZnJlcXVlbmN5IG9wdGlvbnMpLlxuIjsKLSAgY2VyciA8PCAiXHQtLWhbZWxwXVx0XHRwcmludCB0aGlzIGhlbHBcbiI7Ci0gIGNlcnIgPDwgIlx0LS1wXHRcdFVzZSBwZWdnaW5nIHdoZW4gZ2VuZXJhdGluZyBhbGlnbm1lbnRzIGZvciBNb2RlbDMgdHJhaW5pbmcuICAoRGVmYXVsdCBOTyBQRUdHSU5HKVxuIjsKLSAgY2VyciA8PCAiXHQtLXN0XHRcdHRvIHVzZSBhIGZpeGVkIGRpdHJpYnV0aW9uIGZvciB0aGUgZmVydGlsaXR5IHBhcmFtZXRlcnMgd2hlbiB0cmFuZmVyaW5nIGZyb20gbW9kZWwgMiB0byBtb2RlbCAzIChEZWZhdWx0IGNvbXBsaWNhdGVkIGVzdGltYXRpb24pXG4iOwotICBwcmludEdJWkFQYXJzKGNvdXQpOwotfQotCi0KLXZvaWQgZ2VuZXJhdGVQZXJwbGV4aXR5UmVwb3J0KGNvbnN0IFBlcnBsZXhpdHkmIHRyYWlucGVycCwgCi0JCQkgICAgICBjb25zdCBQZXJwbGV4aXR5JiB0ZXN0cGVycCwgCi0JCQkgICAgICBjb25zdCBQZXJwbGV4aXR5JiB0cmFpblZwZXJwLCAKLQkJCSAgICAgIGNvbnN0IFBlcnBsZXhpdHkmIHRlc3RWcGVycCwgCi0JCQkgICAgICBvc3RyZWFtJiBvZiwgaW50IHRyYWluc2l6ZSwgaW50IHRlc3RzaXplLCAKLQkJCSAgICAgIGJvb2wpCi17Ci0gIHVuc2lnbmVkIGludCBpLCBtOwotICB1bnNpZ25lZCBpbnQgbTEgPSBtYXgodHJhaW5wZXJwLnNpemUoKSwgdGVzdHBlcnAuc2l6ZSgpKTsKLSAgdW5zaWduZWQgaW50IG0yID0gbWF4KHRyYWluVnBlcnAuc2l6ZSgpLCB0ZXN0VnBlcnAuc2l6ZSgpKTsKLSAgbSA9IG1heChtMSxtMik7Ci0gIG9mIDw8ICIjdHJuc3pcdHRzdHN6XHRpdGVyXHRtb2RlbFx0dHJuLXBwXHRcdHRlc3QtcHBcdFx0dHJuLXZpdC1wcFx0XHR0c3Qtdml0LXBwXG4iOwotICBmb3IgKGkgPSAwIDsgaSA8bSA7IGkrKyl7Ci0gICAgb2YgPDwgdHJhaW5zaXplIDw8ICdcdCcgPDwgdGVzdHNpemUgPDwgJ1x0JyA8PCBpPDwgJ1x0JyA8PCB0cmFpbnBlcnAubW9kZWxpZFtpXSA8PCAnXHQnOwotICAgIGlmIChpIDwgdHJhaW5wZXJwLnBlcnAuc2l6ZSgpKQotICAgICAgb2YgPDwgdHJhaW5wZXJwLnBlcnBbaV0gPDwgIlx0XHQiIDsKLSAgICBlbHNlIAotICAgICAgb2YgPDwgIk4vQVx0XHQiOwotICAgIGlmIChpPHRlc3RwZXJwLnBlcnAuc2l6ZSgpKQotICAgICAgb2YgPDwgdGVzdHBlcnAucGVycFtpXSA8PCAiXHRcdCIgOwotICAgIGVsc2UgCi0gICAgICBvZiA8PCAiTi9BXHRcdCI7Ci0gICAgaWYgKGkgPCB0cmFpblZwZXJwLnBlcnAuc2l6ZSgpKQotICAgICAgb2YgPDwgdHJhaW5WcGVycC5wZXJwW2ldIDw8ICJcdFx0IiA7Ci0gICAgZWxzZSAKLSAgICAgIG9mIDw8ICJOL0FcdCI7Ci0gICAgaWYgKGk8IHRlc3RWcGVycC5wZXJwLnNpemUoKSkKLSAgICAgIG9mIDw8IHRlc3RWcGVycC5wZXJwW2ldIDw8ICdcbicgOwotICAgIGVsc2UgCi0gICAgICBvZiA8PCAiTi9BXG4iOwotICB9Ci19Ci0KLXZvaWQgIHByaW50U2VudGVuY2VQYWlyKFZlY3RvcjxXb3JkSW5kZXg+JiBlcywgCi0JCQlWZWN0b3I8V29yZEluZGV4PiYgZnMsIAotCQkJb3N0cmVhbSYgb2YpCi0gIAotICAvLyBqdXN0IHdyaXRlcyBhIHNlbnRlY2UgcGFpciB0byB0aGUgZ2l2ZSBvdXRwdXQgc3RyZWFtLCBvbmUgc2VudGVuY2UgcGFpciBsaW5lCi0gIC8vIGl0IHdyaXRlcyB0b2tlbiBpZHMgbm90IGFjdHVhbCB0b2tlbnMuCi17Ci0gIFdvcmRJbmRleCBpLCBqLCBsLCBtOwotICBsID0gZXMuc2l6ZSgpIC0gMTsKLSAgbSA9IGZzLnNpemUoKSAtIDE7Ci0gIG9mIDw8ICJTb3VyY2Ugc2VudGVuY2UgbGVuZ3RoIDogIiA8PCBsIDw8ICIgLCB0YXJnZXQgOiAiIDw8IG0gPDwgIlxuIjsgCi0gIGZvciAoaSA9IDEgOyBpIDw9IGwgOyBpKyspCi0gICAgb2YgPDwgZXNbaV0gPDwgJyAnOwotICBvZiA8PCAiXG4iOwotICBmb3IgKGogPSAxIDsgaiA8PSBtIDsgaisrKQotICAgIG9mIDw8IGZzW2pdIDw8ICcgJzsKLSAgb2YgPDwgIlxuIjsKLQotfQotCi1leHRlcm4gc2hvcnQgQ29tcGFjdEFsaWdubWVudEZvcm1hdDsKLXZvaWQgcHJpbnRBbGlnblRvRmlsZShjb25zdCBWZWN0b3I8V29yZEluZGV4PiYgZXMsIAotCQkgICAgICBjb25zdCBWZWN0b3I8V29yZEluZGV4PiYgZnMsIAotCQkgICAgICBjb25zdCBWZWN0b3I8V29yZEVudHJ5PiYgZXZsaXN0LCAKLQkJICAgICAgY29uc3QgVmVjdG9yPFdvcmRFbnRyeT4mIGZ2bGlzdCwgCi0JCSAgICAgIG9zdHJlYW0mIG9mMiwgCi0JCSAgICAgIGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JiB2aXRlcmJpX2FsaWdubWVudCwgCi0JCSAgICAgIGludCBwYWlyX25vLCBkb3VibGUgYWxpZ25tZW50X3Njb3JlKQotICAgICAKLSAgICAgLy8gcHJpbnRzIHRoZSBnaXZlbiBhbGlnbm1lbnQgdG8gYWxpZ25tZW50cyBmaWxlIChnaXZlbiBpdCBzdHJlYW0gcG9pbnRlcikKLSAgICAgLy8gaW4gYSBmb3JtYXQgcmVjb2duaXphYmxlIGJ5IHRoZSBkcmF3LWFsaWdubWVudCB0b29sIC4uLiB3aGljaCBpcyBvZiB0aGUKLSAgICAgLy8gZXhhbXBsZSAoZWFjaCBsaW5lIHRyaXBsZSBpcyBvbmUgc2VudGVuY2UgcGFpcik6IAotICAgICAvLyAgICMgc2VudGVuY2UgY2FwdGlvbiAKLSAgICAgLy8gICB0YXJnZXRfd29yZF8xIHRhcmdldF93b3JkXzIgIC4uLi4uIHRhcmdldF93b3JkX20KLSAgICAgLy8gICBzb3VyY2Vfd29yZF8xICh7IHggeSB6IH0pIHNvdXJjZV93b3JkXzIgKHsgfSkgIC4uIHNvdXJjZV93b3JkX24gKHt3fSkKLSAgICAgLy8gd2hlcmUgeCwgeSwgeiwgYW5kIHcgYXJlIHBvc2l0aW9ucyBvZiB0YXJnZXQgd29yZHMgdGhhdCBlYWNoIHNvdXJjZSB3b3JkCi0gICAgIC8vIGlzIGNvbm5lY3RlZCB0by4KLQotewotICBXb3JkSW5kZXggbCwgbTsKLSAgVmVjdG9yPFZlY3RvcjxXb3JkSW5kZXg+ID4gdHJhbnNsYXRpb25zKGVzLnNpemUoKSk7IC8vIGVhY2ggZW5nbGlzaCB3b3JkcyBoYXMgYSB2ZWN0b3IgCi0gIC8vIG9mIHplcm8gb3IgbW9yZSB0cmFuc2xhdGlvbnMgLgotICBsID0gZXMuc2l6ZSgpIC0gMTsKLSAgbSA9IGZzLnNpemUoKSAtIDE7Ci0gIGlmKCBDb21wYWN0QWxpZ25tZW50Rm9ybWF0ICkKLSAgICB7Ci0gICAgICBmb3IgKFdvcmRJbmRleCBqID0gMSA7IGogPD0gbSA7IGorKykKLQlpZiggdml0ZXJiaV9hbGlnbm1lbnRbal0gKQotCSAgb2YyIDw8IHZpdGVyYmlfYWxpZ25tZW50W2pdLTEgPDwgJyAnIDw8IGotMSA8PCAnICc7Ci0gICAgICBvZjIgPDwgJ1xuJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvZjIgPDwgIiMgU2VudGVuY2UgcGFpciAoIiA8PCBwYWlyX25vIDw8Iikgc291cmNlIGxlbmd0aCAiIDw8IGwgPDwgIiB0YXJnZXQgbGVuZ3RoICI8PCBtIDw8IAotCSIgYWxpZ25tZW50IHNjb3JlIDogIjw8IGFsaWdubWVudF9zY29yZSA8PCAnXG4nOwotICAgICAgZm9yIChXb3JkSW5kZXggaiA9IDEgOyBqIDw9IG0gOyBqKyspewotCW9mMiA8PCBmdmxpc3RbZnNbal1dLndvcmQgPDwgIiAiIDsKLQl0cmFuc2xhdGlvbnNbdml0ZXJiaV9hbGlnbm1lbnRbal1dLnB1c2hfYmFjayhqKTsKLSAgICAgIH0KLSAgICAgIG9mMiA8PCAnXG4nOwotICAgICAgCi0gICAgICBmb3IgKFdvcmRJbmRleCBpID0gMCAgOyBpIDw9IGwgOyBpKyspewotCW9mMiA8PCBldmxpc3RbZXNbaV1dLndvcmQgPDwgIiAoeyAiIDsKLQlmb3IgKFdvcmRJbmRleCBqID0gMCA7IGogPCB0cmFuc2xhdGlvbnNbaV0uc2l6ZSgpIDsgaisrKQotCSAgb2YyIDw8IHRyYW5zbGF0aW9uc1tpXVtqXSA8PCAiICIgOwotCW9mMiA8PCAifSkgIjsKLSAgICAgIH0KLSAgICAgIG9mMiA8PCAnXG4nOwotICAgIH0KLX0KLQotCi12b2lkIHByaW50T3ZlcmxhcFJlcG9ydChjb25zdCB0bW9kZWw8Q09VTlQsIFBST0I+JiB0VGFibGUsIAotCQkJc2VudGVuY2VIYW5kbGVyJiB0ZXN0SGFuZGxlciwgIHZjYkxpc3QmIHRyYWluRUxpc3QsIAotCQkJdmNiTGlzdCYgdHJhaW5GTGlzdCwgdmNiTGlzdCYgdGVzdEVMaXN0LCB2Y2JMaXN0JiB0ZXN0Rkxpc3QpCi17Ci0gIHNldDxwYWlyPFdvcmRJbmRleCwgV29yZEluZGV4PiA+IHRlc3RDb29jdXIgOwotICBzZW50UGFpciBzIDsKLSAgLyogIHN0cmluZyB1bnNlZW5Db29jdXJGaWxlID0gUHJlZml4ICsgIi50c3QudW5zZWVuLmNvb2MiIDsKLSAgICAgIG9mc3RyZWFtIG9mX3Vuc2VlbkNvb2N1cih1bnNlZW5Db29jdXJGaWxlLmNfc3RyKCkpOwotICAgICAgCi0gICAgICBzdHJpbmcgc2VlbkNvb2N1ckZpbGUgPSBQcmVmaXggKyAiLnRzdC5zZWVuLmNvb2MiIDsKLSAgICAgIG9mc3RyZWFtIG9mX3NlZW5Db29jdXIoc2VlbkNvb2N1ckZpbGUuY19zdHIoKSk7Ci0gICovICAKLSAgdGVzdEhhbmRsZXIucmV3aW5kKCk7Ci0gIGludCBzZWVuX2Nvb2N1ciA9IDAsIHVuc2Vlbl9jb29jdXIgPSAwLCBzcmNVbmsgPSAwLCB0cmdVbmsgPSAwIDsKLSAgd2hpbGUodGVzdEhhbmRsZXIuZ2V0TmV4dFNlbnRlbmNlKHMpKXsgICAgCi0gICAgZm9yIChXb3JkSW5kZXggaSA9IDEgOyBpIDwgcy5lU2VudC5zaXplKCkgOyBpKyspCi0gICAgICBmb3IgKFdvcmRJbmRleCBqID0gMSA7IGogPCBzLmZTZW50LnNpemUoKSA7IGorKykJCi0JdGVzdENvb2N1ci5pbnNlcnQocGFpcjxXb3JkSW5kZXgsIFdvcmRJbmRleD4gKHMuZVNlbnRbaV0sIHMuZlNlbnRbal0pKSA7Ci0gIH0KLSAgc2V0PHBhaXI8V29yZEluZGV4LCBXb3JkSW5kZXg+ID46OmNvbnN0X2l0ZXJhdG9yIGkgOwotICBmb3IgKGkgPSB0ZXN0Q29vY3VyLmJlZ2luKCkgOyBpICE9IHRlc3RDb29jdXIuZW5kKCkgOyArK2kpewotICAgIGlmICh0VGFibGUuZ2V0UHJvYigoKmkpLmZpcnN0LCAoKmkpLnNlY29uZCkgPiBQUk9CX1NNT09USCl7Ci0gICAgICBzZWVuX2Nvb2N1ciArKyA7Ci0gICAgICAvLyAgICAgIG9mX3NlZW5Db29jdXIgPDwgKCppKS5maXJzdCA8PCAnICcgPDwgKCppKS5zZWNvbmQgPDwgJ1xuJzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB1bnNlZW5fY29vY3VyKys7Ci0gICAgICAvLyAgICAgIG9mX3Vuc2VlbkNvb2N1ciA8PCAoKmkpLmZpcnN0IDw8ICcgJyA8PCAoKmkpLnNlY29uZCA8PCAnXG4nOwotICAgIH0KLSAgfQotICAKLSAgc3RyaW5nIHRyZ1Vua0ZpbGUgPSBQcmVmaXggKyAiLnRzdC50cmcudW5rIiA7Ci0gIG9mc3RyZWFtIG9mX3RyZ1Vuayh0cmdVbmtGaWxlLmNfc3RyKCkpOwotCi0gIGZvciAoV29yZEluZGV4IGkgPSAwIDsgaSA8ICB0ZXN0Rkxpc3QuZ2V0Vm9jYWJMaXN0KCkuc2l6ZSgpICYmIGkgPCB0ZXN0Rkxpc3QudW5pcVRva2VucygpO2krKykKLSAgICBpZiAodGVzdEZMaXN0LmdldFZvY2FiTGlzdCgpW2ldLmZyZXEgPiAwICYmIHRyYWluRkxpc3QuZ2V0Vm9jYWJMaXN0KClbaV0uZnJlcSA8PSAwKXsKLSAgICAgIG9mX3RyZ1VuayA8PCBpIDw8ICcgJyA8PCB0ZXN0Rkxpc3QuZ2V0Vm9jYWJMaXN0KClbaV0ud29yZCA8PCAnICcgPDwgdGVzdEZMaXN0LmdldFZvY2FiTGlzdCgpW2ldLmZyZXEKLQkJPDwgJ1xuJzsKLSAgICAgIHRyZ1VuaysrIDsKLSAgICB9Ci0gIHN0cmluZyBzcmNVbmtGaWxlID0gUHJlZml4ICsgIi50c3Quc3JjLnVuayIgOwotICBvZnN0cmVhbSBvZl9zcmNVbmsoc3JjVW5rRmlsZS5jX3N0cigpKTsKLQotICBmb3IgKFdvcmRJbmRleCBqID0gMCA7IGogPCAgdGVzdEVMaXN0LmdldFZvY2FiTGlzdCgpLnNpemUoKSAmJiBqIDwgdGVzdEVMaXN0LnVuaXFUb2tlbnMoKTtqKyspCi0gICAgaWYgKHRlc3RFTGlzdC5nZXRWb2NhYkxpc3QoKVtqXS5mcmVxID4gMCAmJiB0cmFpbkVMaXN0LmdldFZvY2FiTGlzdCgpW2pdLmZyZXEgPD0gMCl7Ci0gICAgICBzcmNVbmsrKyA7Ci0gICAgICBvZl9zcmNVbmsgPDwgaiA8PCAnICcgPDwgdGVzdEVMaXN0LmdldFZvY2FiTGlzdCgpW2pdLndvcmQgPDwgJyAnIDw8IHRlc3RFTGlzdC5nZXRWb2NhYkxpc3QoKVtqXS5mcmVxCi0JCTw8ICdcbic7Ci0gICAgfQotICBzdHJpbmcgc3VtbWFyeUZpbGUgPSBQcmVmaXggKyAiLnRzdC5zdGF0cyIgOyAgCi0gIG9mc3RyZWFtIG9mX3N1bW1hcnkoc3VtbWFyeUZpbGUuY19zdHIoKSk7Ci0gIG9mX3N1bW1hcnkgPDwgIlx0XHQgU1RBVElTVElDUyBBQk9VVCBURVNUIENPUlBVU1xuXG4iOwotICBvZl9zdW1tYXJ5IDw8ICJzb3VyY2UgdW5pcXVlIHRva2VuczogIiA8PCAgdGVzdEVMaXN0LnVuaXFUb2tlbnMoKSA8PCAnXG4nOwotICBvZl9zdW1tYXJ5IDw8ICJ0YXJnZXQgdW5pcXVlIHRva2VuczogIiA8PCAgdGVzdEZMaXN0LnVuaXFUb2tlbnMoKSA8PCAnXG4nOwotICBvZl9zdW1tYXJ5IDw8ICJ1bmlxdWUgdW5zZWVuIHNvdXJjZSB0b2tlbnM6ICIgPDwgc3JjVW5rIDw8ICdcbic7Ci0gIG9mX3N1bW1hcnkgPDwgInVuaXF1ZSB1bnNlZW4gdGFyZ2V0IHRva2VuczogIiA8PCB0cmdVbmsgPDwgJ1xuJzsKLSAgb2Zfc3VtbWFyeSA8PCAiY29vY2N1cnJlbmNlcyBub3QgZm91bmQgaW4gdGhlIGZpbmFsIHQgdGFibGU6ICIgPDwgdW5zZWVuX2Nvb2N1ciA8PCAnXG4nOwotICBvZl9zdW1tYXJ5IDw8ICJjb29jY3VycmVuY2VzIGZvdW5kIGluIHRoZSBmaW5hbCB0IHRhYmxlOiAiIDw8IHNlZW5fY29vY3VyIDw8ICdcbic7Ci0gIAotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9zbnQyY29vYy1yZWR1Y2UtbWVtLXByZXByb2Nlc3MuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvc250MmNvb2MtcmVkdWNlLW1lbS1wcmVwcm9jZXNzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwOWE3ZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9zbnQyY29vYy1yZWR1Y2UtbWVtLXByZXByb2Nlc3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzdHJzdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi12b2lkIHJlYWRWb2MoaXN0cmVhbSZpbixtYXA8c3RyaW5nLHN0cmluZz4mdm9jKQotewotICAgIHN0cmluZyBsaW5lLHMxLHMyOwotICAgIHZvY1siMSJdPSJVTksiOwotICAgIGlmKCAhaW4gKWNlcnIgPDwiVm9jYWJ1bGFyeSBkb2VzIG5vdCBleGlzdC5cbiI7Ci0gICAgd2hpbGUoZ2V0bGluZShpbixsaW5lKSkKLSAgICB7Ci0gICAgICAgIGlzdHJzdHJlYW0gZWluZ2FiZShsaW5lLmNfc3RyKCkpOwotICAgICAgICBpZiggIShlaW5nYWJlPj5zMT4+czIpKQotICAgICAgICAgICAgY2VyciA8PCAiRVJST1IgaW4gdm9jYWJ1bGFyeSAnIiA8PCBsaW5lIDw8ICInXG4iOwotICAgICAgICB2b2NbczFdPXMyOwotICAgIH0KLX0KLQotaW50IG1heEVsZW1zPTA7Ci1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKLXsKLSAgICBpZiggYXJnYyE9NCYmYXJnYyE9NSApCi0gICAgewotICAgICAgICBjZXJyIDw8ICJVc2FnZTogIiA8PCBhcmd2WzBdIDw8ICIgb3V0cHV0IHZjYjEgdmNiMiBzbnQxMiBcbiI7Ci0gICAgICAgIGNlcnIgPDwgIkNvbnZlcnRzIEdJWkErKyBzbnQtZm9ybWF0IGludG8gcGxhaW4gdGV4dC5cbiI7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGJvb2wgY291bnRzPTA7Ci0gICAgaWYoIGFyZ2M9PTYgKQotICAgIHsKLSAgICAgICAgaWYoc3RyaW5nKGFyZ3ZbNF0pIT0iLWNvdW50cyIpCi0gICAgICAgICAgICBjZXJyIDw8ICJFUlJPUjogd3Jvbmcgb3B0aW9uICIgPDwgYXJndls1XSA8PCBlbmRsOwotICAgICAgICBjb3VudHM9MTsKLSAgICAgICAgbWF4RWxlbXM9MTAwMDAwMDA7Ci0gICAgfQotICAgIGlmc3RyZWFtIHYxKGFyZ3ZbMV0pLHYyKGFyZ3ZbMl0pLHQoYXJndlszXSk7Ci0gICAgbWFwPHN0cmluZyxzdHJpbmc+dm9jMSx2b2MyOwotICAgIHJlYWRWb2ModjEsdm9jMSk7Ci0gICAgcmVhZFZvYyh2Mix2b2MyKTsKLSAgICBzdHJpbmcgbGluZTEsbGluZTIsbGluZTM7Ci0gICAgaW50IG5MaW5lPTA7Ci0gICAgaW50IHRvdGFsRWxlbXM9MDsKLSAgICB3aGlsZShnZXRsaW5lKHQsbGluZTEpJiZnZXRsaW5lKHQsbGluZTIpJiZnZXRsaW5lKHQsbGluZTMpKQotICAgIHsKLSAgICAgICAgaXN0cnN0cmVhbSBlaW5nYWJlMShsaW5lMS5jX3N0cigpKSxlaW5nYWJlMihsaW5lMi5jX3N0cigpKSxlaW5nYWJlMyhsaW5lMy5jX3N0cigpKTsKLSAgICAgICAgZG91YmxlIGNvdW50OwotICAgICAgICBzdHJpbmcgd29yZDsKLSAgICAgICAgZWluZ2FiZTE+PmNvdW50OwotICAgICAgICB2ZWN0b3I8aW50PmwxLGwyOwotICAgICAgICB3aGlsZShlaW5nYWJlMj4+d29yZCkKLSAgICAgICAgICAgIGwxLnB1c2hfYmFjayhhdG9pKHdvcmQuY19zdHIoKSkpOwotICAgICAgICB3aGlsZShlaW5nYWJlMz4+d29yZCkKLSAgICAgICAgICAgIGwyLnB1c2hfYmFjayhhdG9pKHdvcmQuY19zdHIoKSkpOwotICAgICAgICBpZiggKCgrK25MaW5lKSUxMDAwKT09MCApCi0gICAgICAgICAgICBjZXJyIDw8ICJsaW5lICIgPDwgbkxpbmUgPDwgJ1xuJzsKLSAgICAgICAgZm9yKHVuc2lnbmVkIGludCBqPTA7IGo8bDIuc2l6ZSgpOyArK2opCi0gICAgICAgIHsKLSAgICAgICAgCQljb3V0IDw8IDAgPDwgIiAiIDw8IGwyW2pdIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpPTA7IGk8bDEuc2l6ZSgpOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0wOyBqPGwyLnNpemUoKTsgKytqKQotICAgICAgICAgICAgewotICAgICAgICAgICAgCQljb3V0IDw8IGwxW2ldIDw8ICIgIiA8PCBsMltqXSA8PCBlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGNlcnIgPDwgIkVORC5cbiI7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvc250MmNvb2MuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvc250MmNvb2MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWIyYWFmLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3NudDJjb29jLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHN0cnN0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLXZvaWQgcmVhZFZvYyhpc3RyZWFtJmluLG1hcDxzdHJpbmcsc3RyaW5nPiZ2b2MpCi17Ci0gIHN0cmluZyBsaW5lLHMxLHMyOyAKLSAgdm9jWyIxIl09IlVOSyI7Ci0gIGlmKCAhaW4gKWNlcnIgPDwiVm9jYWJ1bGFyeSBkb2VzIG5vdCBleGlzdC5cbiI7Ci0gIHdoaWxlKGdldGxpbmUoaW4sbGluZSkpCi0gICAgewotICAgICAgaXN0cnN0cmVhbSBlaW5nYWJlKGxpbmUuY19zdHIoKSk7IAotICAgICAgaWYoICEoZWluZ2FiZT4+czE+PnMyKSkKLQljZXJyIDw8ICJFUlJPUiBpbiB2b2NhYnVsYXJ5ICciIDw8IGxpbmUgPDwgIidcbiI7Ci0gICAgICB2b2NbczFdPXMyOwotICAgIH0KLX0KLQotaW50IG1heEVsZW1zPTA7Ci1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKLXsKLSAgaWYoIGFyZ2MhPTUmJmFyZ2MhPTYgKQotICAgIHsKLSAgICAgIGNlcnIgPDwgIlVzYWdlOiAiIDw8IGFyZ3ZbMF0gPDwgIiBvdXRwdXQgdmNiMSB2Y2IyIHNudDEyIFxuIjsKLSAgICAgIGNlcnIgPDwgIkNvbnZlcnRzIEdJWkErKyBzbnQtZm9ybWF0IGludG8gcGxhaW4gdGV4dC5cbiI7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLSAgYm9vbCBjb3VudHM9MDsKLSAgaWYoIGFyZ2M9PTYgKQotICAgIHsKLSAgICAgIGlmKHN0cmluZyhhcmd2WzVdKSE9Ii1jb3VudHMiKQotCWNlcnIgPDwgIkVSUk9SOiB3cm9uZyBvcHRpb24gIiA8PCBhcmd2WzZdIDw8IGVuZGw7Ci0gICAgICBjb3VudHM9MTsKLQltYXhFbGVtcz0xMDAwMDAwMDsKLSAgICB9Ci0gIGlmc3RyZWFtIHYxKGFyZ3ZbMl0pLHYyKGFyZ3ZbM10pLHQoYXJndls0XSk7Ci0gIG9mc3RyZWFtIG91KGFyZ3ZbMV0pOwotICBtYXA8c3RyaW5nLHN0cmluZz52b2MxLHZvYzI7Ci0gIHJlYWRWb2ModjEsdm9jMSk7Ci0gIHJlYWRWb2ModjIsdm9jMik7Ci0gIHN0cmluZyBsaW5lMSxsaW5lMixsaW5lMzsKLSAgdmVjdG9yPG1hcDxpbnQsaW50PiA+IHZzaSh2b2MxLnNpemUoKSsxMDAwKTsKLSAgaW50IG5MaW5lPTA7Ci0gIGludCB0b3RhbEVsZW1zPTA7Ci0gIHdoaWxlKGdldGxpbmUodCxsaW5lMSkmJmdldGxpbmUodCxsaW5lMikmJmdldGxpbmUodCxsaW5lMykpCi0gICAgewotICAgICAgaXN0cnN0cmVhbSBlaW5nYWJlMShsaW5lMS5jX3N0cigpKSxlaW5nYWJlMihsaW5lMi5jX3N0cigpKSxlaW5nYWJlMyhsaW5lMy5jX3N0cigpKTsKLSAgICAgIGRvdWJsZSBjb3VudDsKLSAgICAgIHN0cmluZyB3b3JkOwotICAgICAgZWluZ2FiZTE+PmNvdW50OwotICAgICAgdmVjdG9yPGludD5sMSxsMjsKLSAgICAgIHdoaWxlKGVpbmdhYmUyPj53b3JkKQotCWwxLnB1c2hfYmFjayhhdG9pKHdvcmQuY19zdHIoKSkpOwotICAgICAgd2hpbGUoZWluZ2FiZTM+PndvcmQpCi0JbDIucHVzaF9iYWNrKGF0b2kod29yZC5jX3N0cigpKSk7Ci0gICAgICBpZiggKCgrK25MaW5lKSUxMDAwKT09MCApCi0JY2VyciA8PCAibGluZSAiIDw8IG5MaW5lIDw8ICdcbic7IAotICAgICAgdG90YWxFbGVtcy09dnNpWzBdLnNpemUoKTsKLSAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0wO2o8bDIuc2l6ZSgpOysraikKLQl2c2lbMF1bbDJbal1dKys7Ci0gICAgICB0b3RhbEVsZW1zKz12c2lbMF0uc2l6ZSgpOwotICAgICAgZm9yKHVuc2lnbmVkIGludCBpPTA7aTxsMS5zaXplKCk7KytpKQotCXsKLQkgIGlmKCBsMVtpXT49aW50KHZzaS5zaXplKCkpICkKLQkgICAgewotCSAgICAgIGNlcnIgPDwgIkkgaGF2ZSB0byByZXNpemU6ICIgPDwgbDFbaV0gPDwgZW5kbDsKLQkgICAgICB2c2kucmVzaXplKGwxW2ldKzEpOwotCSAgICB9Ci0JICBtYXA8aW50LGludD4mdGhlc2V0PXZzaVtsMVtpXV07Ci0JICB0b3RhbEVsZW1zLT10aGVzZXQuc2l6ZSgpOwotCSAgZm9yKHVuc2lnbmVkIGludCBqPTA7ajxsMi5zaXplKCk7KytqKQotCSAgICB0aGVzZXRbbDJbal1dKys7Ci0JICB0b3RhbEVsZW1zKz10aGVzZXQuc2l6ZSgpOwotCX0KLSAgICAgIGlmKCB0b3RhbEVsZW1zPm1heEVsZW1zJiZtYXhFbGVtcyApCi0JewotCSAgY2VyciA8PCAiSU5GTzogcHJpbnQgb3V0ICIgPDwgdG90YWxFbGVtcyA8PCAiIGVudHJpZXMuXG4iOwotCSAgZm9yKHVuc2lnbmVkIGludCBpPTA7aTx2c2kuc2l6ZSgpOysraSkKLQkgICAgZm9yKG1hcDxpbnQsaW50Pjo6Y29uc3RfaXRlcmF0b3Igaj12c2lbaV0uYmVnaW4oKTtqIT12c2lbaV0uZW5kKCk7KytqKQotCSAgICAgIHsKLQkJaWYoY291bnRzPT0xICkKLQkJICBvdSA8PCBqLT5zZWNvbmQgPDwgIiAiIDw8IGkgPDwgIiAiIDw8IGotPmZpcnN0IDw8ICdcbic7Ci0JCWVsc2UKLQkJICBvdSA8PCBpIDw8ICIgIiA8PCBqLT5maXJzdCA8PCAnXG4nOwotCSAgICAgIH0KLQkgIHRvdGFsRWxlbXM9MDsKLQkgIHZzaS5jbGVhcigpOwotCSAgdnNpLnJlc2l6ZSh2b2MxLnNpemUoKSsxMDAwKTsKLQl9Ci0gICAgfQotICBjZXJyIDw8ICJFTkQuXG4iOwotICBmb3IodW5zaWduZWQgaW50IGk9MDtpPHZzaS5zaXplKCk7KytpKQotICAgIGZvcihtYXA8aW50LGludD46OmNvbnN0X2l0ZXJhdG9yIGo9dnNpW2ldLmJlZ2luKCk7aiE9dnNpW2ldLmVuZCgpOysraikKLSAgICAgIHsKLQlpZihjb3VudHM9PTEgKQotCSAgb3UgPDwgai0+c2Vjb25kIDw8ICIgIiA8PCBpIDw8ICIgIiA8PCBqLT5maXJzdCA8PCAnXG4nOwotCWVsc2UKLQkgIG91IDw8IGkgPDwgIiAiIDw8IGotPmZpcnN0IDw8ICdcbic7Ci0gICAgICB9Ci0gICBvdS5mbHVzaCgpOwotICAgb3UuY2xvc2UoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvc250MnBsYWluLmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3NudDJwbGFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZGFjYmUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvc250MnBsYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3Ryc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLXZvaWQgcmVhZFZvYyhpc3RyZWFtJmluLG1hcDxzdHJpbmcsc3RyaW5nPiZ2b2MpCi17Ci0gIHN0cmluZyBsaW5lLHMxLHMyOyAKLSAgdm9jWyIxIl09IlVOSyI7Ci0gIGlmKCAhaW4gKWNlcnIgPDwiVm9jYWJ1bGFyeSBkb2VzIG5vdCBleGlzdC5cbiI7Ci0gIHdoaWxlKGdldGxpbmUoaW4sbGluZSkpCi0gICAgewotICAgICAgaXN0cnN0cmVhbSBlaW5nYWJlKGxpbmUuY19zdHIoKSk7IAotICAgICAgaWYoICEoZWluZ2FiZT4+czE+PnMyKSkKLQljZXJyIDw8ICJFUlJPUiBpbiB2b2NhYnVsYXJ5ICciIDw8IGxpbmUgPDwgIidcbiI7Ci0gICAgICB2b2NbczFdPXMyOwotICAgIH0KLX0KLQotaW50IG1haW4oaW50IGFyZ2MsY2hhciAqKmFyZ3YpCi17Ci0gIGlmKCBhcmdjIT01JiZhcmdjIT02ICkKLSAgICB7Ci0gICAgICBjZXJyIDw8ICJVc2FnZTogIiA8PCBhcmd2WzBdIDw8ICIgdmNiMSB2Y2IyIHNudDEyIG91dHB1dF9wcmVmaXggWyAtY291bnRzIF1cbiI7Ci0gICAgICBjZXJyIDw8ICJDb252ZXJ0cyBHSVpBKysgc250LWZvcm1hdCBpbnRvIHBsYWluIHRleHQuXG4iOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIGJvb2wgY291bnRzPTA7Ci0gIGlmKCBhcmdjPT02ICkKLSAgICB7Ci0gICAgICBpZihzdHJpbmcoYXJndls1XSkhPSItY291bnRzIikKLQljZXJyIDw8ICJFUlJPUjogd3Jvbmcgb3B0aW9uICIgPDwgYXJndls1XSA8PCBlbmRsOwotICAgICAgY291bnRzPTE7Ci0gICAgfQotICBpZnN0cmVhbSB2MShhcmd2WzFdKSx2Mihhcmd2WzJdKSx0KGFyZ3ZbM10pOwotICBzdHJpbmcgcHJlZml4KGFyZ3ZbNF0pOwotICBzdHJpbmcgb3V0ZmlsMT1wcmVmaXgrIjEudHh0IjsKLSAgc3RyaW5nIG91dGZpbDI9cHJlZml4KyIyLnR4dCI7Ci0gIG9mc3RyZWFtIG91dDEob3V0ZmlsMS5jX3N0cigpKTsKLSAgb2ZzdHJlYW0gb3V0MihvdXRmaWwyLmNfc3RyKCkpOwotICBtYXA8c3RyaW5nLHN0cmluZz52b2MxLHZvYzI7Ci0gIHJlYWRWb2ModjEsdm9jMSk7Ci0gIHJlYWRWb2ModjIsdm9jMik7Ci0gIGludCBzb3VyY2U9MCx0YXJnZXQ9MDsKLSAgc3RyaW5nIGxpbmUxLGxpbmUyLGxpbmUzOwotICBpbnQgcHJpbnRlZD0wOwotICB3aGlsZShnZXRsaW5lKHQsbGluZTEpJiZnZXRsaW5lKHQsbGluZTIpJiZnZXRsaW5lKHQsbGluZTMpKQotICAgIHsKLSAgICAgIGlzdHJzdHJlYW0gZWluZ2FiZTEobGluZTEuY19zdHIoKSksZWluZ2FiZTIobGluZTIuY19zdHIoKSksZWluZ2FiZTMobGluZTMuY19zdHIoKSk7Ci0gICAgICBkb3VibGUgY291bnQ7Ci0gICAgICBzdHJpbmcgd29yZDsKLSAgICAgIGVpbmdhYmUxPj5jb3VudDsKLSAgICAgIHZlY3RvcjxzdHJpbmc+bDEsbDI7Ci0gICAgICB3aGlsZShlaW5nYWJlMj4+d29yZCkKLQlsMS5wdXNoX2JhY2sod29yZCk7Ci0gICAgICB3aGlsZShlaW5nYWJlMz4+d29yZCkKLQlsMi5wdXNoX2JhY2sod29yZCk7Ci0gICAgICBpZiggY291bnRzICkgCi0JY291dCA8PCBjb3VudCA8PCAnXG4nOwotICAgICAgZm9yKHVuc2lnbmVkIGludCBwPTA7cDxsMS5zaXplKCk7cCsrKQotCXsKLQkgIGlmKHZvYzEuY291bnQobDFbcF0pPT0wKQotCSAgICB7Ci0JICAgICAgaWYoIHByaW50ZWQrKz09MCkKLQkJY2VyciA8PCAiRVJST1I6IHNvdXJjZSB2b2NhYnVsYXJ5IGVudHJ5ICIgPDwgbDFbcF0gPDwgIiB1bmtub3duLlxuIjsKLQkgICAgICBvdXQxIDw8IGwxW3BdPDwnICc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgb3V0MSA8PCB2b2MxW2wxW3BdXSA8PCAnICc7Ci0JICBzb3VyY2UrKzsKLQl9Ci0gICAgICBmb3IodW5zaWduZWQgaW50IHA9MDtwPGwyLnNpemUoKTtwKyspCi0JewotCSAgaWYodm9jMi5jb3VudChsMltwXSk9PTApCi0JICAgIHsKLQkgICAgICBpZiggcHJpbnRlZCsrID09MCkKLQkJY2VyciA8PCAiRVJST1I6IHRhcmdldCB2b2NhYnVsYXJ5IGVudHJ5ICIgPDwgbDJbcF0gPDwgIiB1bmtub3duLlxuIjsKLQkgICAgICBvdXQyIDw8bDJbcF08PCcgJzsKLQkgICAgfQotCSAgb3V0MiA8PCB2b2MyW2wyW3BdXSA8PCAnICc7Ci0JICB0YXJnZXQrKzsKLQl9Ci0gICAgICBvdXQxPDwnXG4nOwotICAgICAgb3V0Mjw8J1xuJzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9zeW1hbC5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy9zeW1hbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Njc4NTkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvc3ltYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8vICRJZDogc3ltYWwuY3BwIDE5MDUgMjAwOC0xMC0xNiAyMToxNDozOFogcGhrb2VobiAkCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSAiY21kLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLSNkZWZpbmUgTUFYX1dPUkQgMTAwMCAgLy9tYXhpbXVtIGxlbmd0aHNvdXJjZS90YXJnZXQgc3RyaW5ncyAKLSNkZWZpbmUgTUFYX00gMjAwICAgICAvL21heGltdW0gbGVuZ3RoIG9mIHNvdXJjZSBzdHJpbmdzCi0jZGVmaW5lIE1BWF9OIDIwMCAgICAgLy9tYXhpbXVtIGxlbmd0aCBvZiB0YXJnZXQgc3RyaW5ncyAKLQotI2RlZmluZSBVTklPTiAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIElOVEVSU0VDVCAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgR1JPVyAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTUkNUT1RHVCAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFRHVFRPU1JDICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgQk9PTF9ZRVMgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBCT09MX05PICAgICAgICAgICAgICAgICAgICAwCi0KLSNkZWZpbmUgRU5EX0VOVU0gICAgeyAgIChjaGFyKikwLCAgMCB9Ci0KLXN0YXRpYyBFbnVtX1QgQWxpZ25FbnVtIFtdID0gewoteyAgICAidW5pb24iLCAgICAgICAgICAgICAgICAgICAgICAgIFVOSU9OIH0sIAoteyAgICAidSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU9OIH0sIAoteyAgICAiaW50ZXJzZWN0IiwgICAgICAgICAgICAgICAgICAgIElOVEVSU0VDVH0sCi17ICAgICJpIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJTRUNUfSwKLXsgICAgImdyb3ciLCAgICAgICAgICAgICAgICAgICAgICAgICBHUk9XIH0sIAoteyAgICAiZyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdST1cgfSwgCi17ICAgICJzcmN0b3RndCIsICAgICAgICAgICAgICAgICAgICAgU1JDVE9UR1QgfSwKLXsgICAgInMydCIsICAgICAgICAgICAgICAgICAgICAgICAgICBTUkNUT1RHVCB9LAoteyAgICAidGd0dG9zcmMiLCAgICAgICAgICAgICAgICAgICAgIFRHVFRPU1JDIH0sCi17ICAgICJ0MnMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgVEdUVE9TUkMgfSwKLSAgRU5EX0VOVU0KLX07Ci0KLXN0YXRpYyBFbnVtX1QgQm9vbEVudW0gW10gPSB7Ci0gICB7ICAgICJ0cnVlIiwgICAgICAgIEJPT0xfWUVTIH0sIAotICAgeyAgICAieWVzIiwgICAgICAgICBCT09MX1lFUyB9LCAKLSAgIHsgICAgInkiLCAgICAgICAgICAgQk9PTF9ZRVMgfSwgICAgCi0gICB7ICAgICJmYWxzZSIsICAgICAgIEJPT0xfTk8gfSwgCi0gICB7ICAgICJubyIsICAgICAgICAgIEJPT0xfTk8gfSwgCi0gICB7ICAgICJuIiwgICAgICAgICAgIEJPT0xfTk8gfSwgCi0gICBFTkRfRU5VTQotfTsKLQotCi0KLS8vIGdsb2JhbCB2YXJpYWJsZXMgYW5kIGNvbnN0YW50cwotCi1pbnQqIGZhOyAvL2NvdW50ZXJzIG9mIGNvdmVyZWQgZm9yZWlnbiBwb3NpdGlvbnMKLWludCogZWE7IC8vY291bnRlcnMgb2YgY292ZXJlZCBlbmdsaXNoIHBvc2l0aW9ucwotaW50KiogQTsgLy9hbGlnbm1lbnQgbWF0cml4IHdpdGggaW5mb3JtYXRpb24gc3ltbWV0cmljL2RpcmVjdC9pbnZlcnNlIGFsaWdubWVudHMKLQotaW50IHZlcmJvc2U9MDsKLQotLy9yZWFkIGFuIGFsaWdubWVudCBwYWlyIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gCi0KLWludCBsYyA9IDA7Ci0KLWludCBnZXRhbHMoZnN0cmVhbSYgaW5wLGludCYgbSwgaW50ICphLGludCYgbiwgaW50ICpiLG9zdHJlYW0mIG91dCkKLXsKLSAgY2hhciB3W01BWF9XT1JEXSwgZHVtbXlbMTBdOwotICBzdHJpbmcgdGd0c2VudDsKLSAgaW50IGksaixmcmVxOwotICBpZiAoaW5wID4+IGZyZXEpewotICAgICsrbGM7Ci0gICAgLy90YXJnZXQgc2VudGVuY2UKLSAgICBpbnAgPj4gbjsgYXNzZXJ0KG48TUFYX04pOwotICAgIGZvciAoaT0xO2k8PW47aSsrKXsgCi0gICAgICBpbnAgPj4gc2V0dyhNQVhfV09SRCkgPj4gdzsKLSAgICAgIGlmIChzdHJsZW4odyk+PU1BWF9XT1JELTEpIHsKLSAgICAgICAgY2VyciA8PCBsYyA8PCAiOiB0YXJnZXQgbGVuPSIgPDwgc3RybGVuKHcpIDw8ICIgaXMgbm90IGxlc3MgdGhhbiBNQVhfV09SRC0xPSIgCi0gICAgICAgICAgICAgPDwgTUFYX1dPUkQtMSA8PCBlbmRsOwotICAgICAgICBhc3NlcnQoc3RybGVuKHcpPE1BWF9XT1JELTEpOwotICAgICAgfQotCSAgdGd0c2VudCs9dzsKLQkgIHRndHNlbnQrPSIgIjsKLSAgICB9Ci0gICAgCi0gICAgaW5wID4+IGR1bW15OyAvLyMgc2VwYXJhdG9yCi0gICAgLy8gaW52ZXJzZSBhbGlnbm1lbnQKLSAgICBmb3IgKGk9MTtpPD1uO2krKykgaW5wID4+IGJbaV07Ci0KLSAgICAvL3NvdXJjZSBzZW50ZW5jZQotICAgIGlucCA+PiBtOyBhc3NlcnQobTxNQVhfTSk7Ci0gICAgZm9yIChqPTE7ajw9bTtqKyspewotICAgICAgaW5wID4+IHNldHcoTUFYX1dPUkQpID4+IHc7Ci0gICAgICBpZiAoc3RybGVuKHcpPj1NQVhfV09SRC0xKSB7Ci0gICAgICAgIGNlcnIgPDwgbGMgPDwgIjogc291cmNlIGxlbj0iIDw8IHN0cmxlbih3KSA8PCAiIGlzIG5vdCBsZXNzIHRoYW4gTUFYX1dPUkQtMT0iIAotICAgICAgICAgICAgIDw8IE1BWF9XT1JELTEgPDwgZW5kbDsKLSAgICAgICAgYXNzZXJ0KHN0cmxlbih3KTxNQVhfV09SRC0xKTsKLSAgICAgIH0KLQkgIG91dCA8PCB3IDw8ICIgIjsKLSAgICB9Ci0Jb3V0IDw8ICJ7IyN9ICIgPDwgdGd0c2VudCA8PCAieyMjfSAiOwotCQotICAgIAotICAgIGlucCA+PiBkdW1teTsgLy8jIHNlcGFyYXRvcgotCi0gICAgLy8gZGlyZWN0IGFsaWdubWVudAotICAgIGZvciAoaj0xO2o8PW07aisrKSB7Ci0gICAgICBpbnAgPj4gYVtqXTsKLSAgICAgIGFzc2VydCgwPD1hW2pdICYmIGFbal08PW4pOwotICAgIH0KLQotICAgIC8vY2hlY2sgaW52ZXJzZSBhbGlnbmVtbnQKLSAgICBmb3IgKGk9MTtpPD1uO2krKykKLSAgICAgIGFzc2VydCgwPD1iW2ldICYmIGJbaV08PW0pOwotICAgIAotICAgIHJldHVybiAxOwotCi0gIH0KLSAgZWxzZQotICAgIHJldHVybiAwOwotfTsKLQotCi0vL2NvbXB1dGUgdW5pb24gYWxpZ25tZW50Ci1pbnQgcHJ1bmlvbmFsaWdubWVudChmc3RyZWFtJiBvdXQsaW50IG0saW50ICphLGludCBuLGludCogYil7Ci0gIAotICBvc3RyaW5nc3RyZWFtIHNvdXQ7Ci0gIAotICBmb3IgKGludCBqPTE7ajw9bTtqKyspCi0gICAgaWYgKGFbal0pIAotICAgICAgc291dCA8PCBqLTEgPDwgIi0iIDw8IGFbal0tMSA8PCAiICI7Ci0KLSAgZm9yIChpbnQgaT0xO2k8PW47aSsrKQotICAgIGlmIChiW2ldICYmIGFbYltpXV0hPWkpCi0gICAgICBzb3V0IDw8IGJbaV0tMSA8PCAgIi0iIDw8IGktMSA8PCAiICI7Ci0KLSAgLy9maXggdGhlIGxhc3QgIiAiCi0gIHN0cmluZyBzdHIgPSBzb3V0LnN0cigpOwotICBpZiAoc3RyLmxlbmd0aCgpID09IDApCi0gICAgc3RyID0gIlxuIjsKLSAgZWxzZQotICAgIHN0ci5yZXBsYWNlKHN0ci5sZW5ndGgoKS0xLDEsIlxuIik7Ci0KLSAgb3V0IDw8IHN0cjsKLSAgICAgICAgIG91dC5mbHVzaCgpOwotIAotCXJldHVybiAxOwotfQotCi0KLS8vQ29tcHV0ZSBpbnRlcnNlY3Rpb24gYWxpZ25tZW50Ci0KLWludCBwcmludGVyc2VjdChmc3RyZWFtJiBvdXQsaW50IG0saW50ICphLGludCBuLGludCogYil7Ci0KLSAgb3N0cmluZ3N0cmVhbSBzb3V0OwotCi0gIGZvciAoaW50IGo9MTtqPD1tO2orKykKLSAgICBpZiAoYVtqXSAmJiBiW2Fbal1dPT1qKQotICAgICAgc291dCA8PCBqLTEgPDwgIi0iIDw8IGFbal0tMSA8PCAiICI7Ci0KLSAgLy9maXggdGhlIGxhc3QgIiAiCi0gIHN0cmluZyBzdHIgPSBzb3V0LnN0cigpOwotICBpZiAoc3RyLmxlbmd0aCgpID09IDApCi0gICAgc3RyID0gIlxuIjsKLSAgZWxzZQotICAgIHN0ci5yZXBsYWNlKHN0ci5sZW5ndGgoKS0xLDEsIlxuIik7Ci0KLSAgb3V0IDw8IHN0cjsKLSAgICAgICAgIG91dC5mbHVzaCgpOwotCi0gICAgICAgIHJldHVybiAxOwotfQotCi0vL0NvbXB1dGUgdGFyZ2V0LXRvLXNvdXJjZSBhbGlnbm1lbnQKLQotaW50IHByaW50dGd0dG9zcmMoZnN0cmVhbSYgb3V0LGludCBtLGludCAqYSxpbnQgbixpbnQqIGIpewotICAKLSAgb3N0cmluZ3N0cmVhbSBzb3V0OwotCi0gIGZvciAoaW50IGk9MTtpPD1uO2krKykKLSAgICBpZiAoYltpXSkKLSAgICAgICAgc291dCA8PCBiW2ldLTEgPDwgIi0iIDw8IGktMSA8PCAiICI7Ci0KLSAgLy9maXggdGhlIGxhc3QgIiAiCi0gIHN0cmluZyBzdHIgPSBzb3V0LnN0cigpOwotICBpZiAoc3RyLmxlbmd0aCgpID09IDApCi0gICAgc3RyID0gIlxuIjsKLSAgZWxzZQotICAgIHN0ci5yZXBsYWNlKHN0ci5sZW5ndGgoKS0xLDEsIlxuIik7Ci0KLSAgb3V0IDw8IHN0cjsKLSAgICAgICAgIG91dC5mbHVzaCgpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8vQ29tcHV0ZSBzb3VyY2UtdG8tdGFyZ2V0IGFsaWdubWVudAotCi1pbnQgcHJpbnRzcmN0b3RndChmc3RyZWFtJiBvdXQsaW50IG0saW50ICphLGludCBuLGludCogYil7Ci0KLSAgb3N0cmluZ3N0cmVhbSBzb3V0OwotCi0gIGZvciAoaW50IGo9MTtqPD1tO2orKykKLSAgICBpZiAoYVtqXSkKLSAgICAgICAgc291dCA8PCBqLTEgPDwgIi0iIDw8IGFbal0tMSA8PCAiICI7Ci0KLSAgLy9maXggdGhlIGxhc3QgIiAiCi0gIHN0cmluZyBzdHIgPSBzb3V0LnN0cigpOwotICBpZiAoc3RyLmxlbmd0aCgpID09IDApCi0gICAgc3RyID0gIlxuIjsKLSAgZWxzZQotICAgIHN0ci5yZXBsYWNlKHN0ci5sZW5ndGgoKS0xLDEsIlxuIik7Ci0KLSAgb3V0IDw8IHN0cjsKLSAgICAgICAgIG91dC5mbHVzaCgpOwotCi0gICAgICAgIHJldHVybiAxOwotfQotCi0vL0NvbXB1dGUgR3JvdyBEaWFnb25hbCBBbGlnbm1lbnQKLS8vTmljZSBwcm9wZXJ0eTogeW91IHdpbGwgbmV2ZXIgaW50cm9kdWNlIG1vcmUgcG9pbnRzCi0vL3RoYW4gdGhlIHVuaW9uYWxpZ25tZW50IGFsaWduZW10LiBIZW5jZSwgeW91IHdpbGwgYWx3YXlzIGJlIGFibGUKLS8vdG8gcmVwcmVzZW50IHRoZSBncm93IGFsaWdubWVudCBhcyB0aGUgdW5pb25hbGlnbm1lbnQgb2YgYQotLy9kaXJlY3RlZCBhbmQgaW52ZXJ0ZWQgYWxpZ25tZW50Ci0KLWludCBwcmludGdyb3coZnN0cmVhbSYgb3V0LGludCBtLGludCAqYSxpbnQgbixpbnQqIGIsIGJvb2wgZGlhZ29uYWw9ZmFsc2UsYm9vbCBmaW5hbD1mYWxzZSxib29sIGJvdGh1bmNvdmVyZWQ9ZmFsc2UpewotICAgCi0gICBvc3RyaW5nc3RyZWFtIHNvdXQ7Ci0gICAKLSAgIHZlY3RvciA8cGFpciA8aW50LGludD4gPiBuZWlnaGJvcnM7IC8vbmVpZ2hib3JzCi0gICAKLSAgIHBhaXIgPGludCxpbnQ+IGVudHJ5OwotICAgCi0gICBuZWlnaGJvcnMucHVzaF9iYWNrKG1ha2VfcGFpcigtMSwtMCkpOwotICAgbmVpZ2hib3JzLnB1c2hfYmFjayhtYWtlX3BhaXIoMCwtMSkpOwotICAgbmVpZ2hib3JzLnB1c2hfYmFjayhtYWtlX3BhaXIoMSwwKSk7Ci0gICBuZWlnaGJvcnMucHVzaF9iYWNrKG1ha2VfcGFpcigwLDEpKTsKLSAgIAotICAgCi0gICBpZiAoZGlhZ29uYWwpewotICAgICAgbmVpZ2hib3JzLnB1c2hfYmFjayhtYWtlX3BhaXIoLTEsLTEpKTsKLSAgICAgIG5laWdoYm9ycy5wdXNoX2JhY2sobWFrZV9wYWlyKC0xLDEpKTsKLSAgICAgIG5laWdoYm9ycy5wdXNoX2JhY2sobWFrZV9wYWlyKDEsLTEpKTsKLSAgICAgIG5laWdoYm9ycy5wdXNoX2JhY2sobWFrZV9wYWlyKDEsMSkpOyAgICAKLSAgIH0KLSAgIAotICAgCi0gICBpbnQgaSxqLG87Ci0gICAKLSAgIAotICAgLy9jb3ZlcmVkIGZvcmVpZ24gYW5kIGVuZ2xpc2ggcG9zaXRpb25zIAotICAgCi0gICAgbWVtc2V0KGZhLDAsKG0rMSkqc2l6ZW9mKGludCkpOwotICAgIG1lbXNldChlYSwwLChuKzEpKnNpemVvZihpbnQpKTsKLSAgIAotICAgLy9tYXRyaXggdG8gcXVpY2tseSBjaGVjayBpZiBvbmUgcG9pbnQgaXMgaW4gdGhlIHN5bW1ldHJpYwotICAgLy9hbGlnbm1lbnQgKHZhbHVlPTIpLCBkaXJlY3QgYWxpZ25tZW50ICg9MSkgYW5kIGludmVyc2UgYWxpZ25tZW50ICAgCi0gCi0gICBmb3IgKGludCBpPTE7aTw9bjtpKyspIG1lbXNldChBW2ldLDAsKG0rMSkqc2l6ZW9mKGludCkpOwotICAgCi0gICBzZXQgPHBhaXIgPGludCxpbnQ+ID4gY3VycmVudHBvaW50czsgLy9zeW1tZXRyaWMgYWxpZ25tZW50Ci0gICBzZXQgPHBhaXIgPGludCxpbnQ+ID4gdW5pb25hbGlnbm1lbnQ7IC8vdW5pb24gYWxpZ25tZW50Ci0gICAKLSAgIHBhaXIgPGludCxpbnQ+IHBvaW50OyAvL3ZhcmlhYmxlIHRvIHN0b3JlIHBvaW50cwotICAgc2V0PHBhaXIgPGludCxpbnQ+ID46OmNvbnN0X2l0ZXJhdG9yIGs7IC8vaXRlcmF0b3Igb3ZlciBzZXRzCi0gICAKLSAgIC8vZmlsbCBpbiB0aGUgYWxpZ25tZW50cwotICAgZm9yIChqPTE7ajw9bTtqKyspewotICAgICAgaWYgKGFbal0pewotICAgICAgICAgdW5pb25hbGlnbm1lbnQuaW5zZXJ0KG1ha2VfcGFpcihhW2pdLGopKTsKLSAgICAgICAgIGlmIChiW2Fbal1dPT1qKXsgCi0gICAgICAgICAgICBmYVtqXT0xO2VhW2Fbal1dPTE7Ci0gICAgICAgICAgICBBW2Fbal1dW2pdPTI7ICAgCi0gICAgICAgICAgICBjdXJyZW50cG9pbnRzLmluc2VydChtYWtlX3BhaXIoYVtqXSxqKSk7Ci0gICAgICAgICB9ICAgICAgICAgCi0gICAgICAgICBlbHNlIAotICAgICAgICAgICAgQVthW2pdXVtqXT0tMTsKLSAgICAgIH0KLSAgIH0KLSAgIAotICAgZm9yIChpPTE7aTw9bjtpKyspIAotICAgICAgaWYgKGJbaV0gJiYgYVtiW2ldXSE9aSl7IC8vbm90IGludGVyc2VjdGlvbgotICAgICAgICAgdW5pb25hbGlnbm1lbnQuaW5zZXJ0KG1ha2VfcGFpcihpLGJbaV0pKTsgCi0gICAgICAgICBBW2ldW2JbaV1dPTE7Ci0gICAgICB9IAotICAgICAgICAgCi0gICAgICAgICAgICAgCi0gICBpbnQgYWRkZWQ9MTsKLSAgIAotICAgd2hpbGUgKGFkZGVkKXsKLSAgICAgIGFkZGVkPTA7Ci0gICAgICAvLy9zY2FuIHRoZSBjdXJyZW50IGFsaWdubWVudAotICAgICAgZm9yIChrPWN1cnJlbnRwb2ludHMuYmVnaW4oKTtrIT1jdXJyZW50cG9pbnRzLmVuZCgpO2srKyl7Ci0gICAgICAgICAvL2NvdXQgPDwgInsiPDwgKGstPnNlY29uZCktMSA8PCAiLSIgPDwgKGstPmZpcnN0KS0xIDw8ICJ9IjsKLSAgICAgICAgIGZvciAobz0wO288bmVpZ2hib3JzLnNpemUoKTtvKyspewotICAgICAgICAgICAgLy9jb3V0IDw8ICJnbyBvdmVyIGNoZWNrIGFsbCBuZWlnaGJvcnNcbiI7Ci0gICAgICAgICAgICBwb2ludC5maXJzdD1rLT5maXJzdCtuZWlnaGJvcnNbb10uZmlyc3Q7ICAgICAgCi0gICAgICAgICAgICBwb2ludC5zZWNvbmQ9ay0+c2Vjb25kK25laWdoYm9yc1tvXS5zZWNvbmQ7IAotICAgICAgICAgICAgLy9jb3V0IDw8IHBvaW50LnNlY29uZC0xIDw8ICIgIiA8PCBwb2ludC5maXJzdC0xIDw8ICJcbiI7Ci0gICAgICAgICAgICAvL2NoZWNrIGlmIG5laWdoYm9yIGlzIGluc2lkZSAnbWF0cml4JwotICAgICAgICAgICAgaWYgKHBvaW50LmZpcnN0PjAgJiYgcG9pbnQuZmlyc3QgPD1uICYmIHBvaW50LnNlY29uZD4wICYmIHBvaW50LnNlY29uZDw9bSkKLSAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgbmVpZ2hib3IgaXMgaW4gdGhlIHVuaW9uYWxpZ25tZW50IGFsaWdubWVudAotICAgICAgICAgICAgICAgaWYgKGJbcG9pbnQuZmlyc3RdPT1wb2ludC5zZWNvbmQgfHwgYVtwb2ludC5zZWNvbmRdPT1wb2ludC5maXJzdCl7Ci0gICAgICAgICAgICAgICAgICAvL2NvdXQgPDwgIkluIHVuaW9uYWxpZ25tZW50ICI7Y291dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiBpdCBjb25uZWN0cyBhdCBsZWFzdCBvbmUgdW5jb3ZlcmVkIHdvcmQKLSAgICAgICAgICAgICAgICAgIGlmICghKGVhW3BvaW50LmZpcnN0XSAmJiBmYVtwb2ludC5zZWNvbmRdKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIC8vaW5zZXJ0IHBvaW50IGluIGN1cnJlbnRwb2ludHMhCi0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50cG9pbnRzLmluc2VydChwb2ludCk7Ci0gICAgICAgICAgICAgICAgICAgICBBW3BvaW50LmZpcnN0XVtwb2ludC5zZWNvbmRdPTI7Ci0gICAgICAgICAgICAgICAgICAgICBlYVtwb2ludC5maXJzdF09MTsgZmFbcG9pbnQuc2Vjb25kXT0xOwotICAgICAgICAgICAgICAgICAgICAgYWRkZWQ9MTsKLSAgICAgICAgICAgICAgICAgICAgIC8vY291dCA8PCAiYWRkZWQgZ3JvdzogIiA8PCBwb2ludC5zZWNvbmQtMSA8PCAiLSIgPDwgcG9pbnQuZmlyc3QtMSA8PCAiXG4iO2NvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLSAgICAgIAotICAgICAgaWYgKGZpbmFsKXsKLSAgICAgICAgIGZvciAoaz11bmlvbmFsaWdubWVudC5iZWdpbigpO2shPXVuaW9uYWxpZ25tZW50LmVuZCgpO2srKykKLSAgICAgICAgICAgIGlmIChBW2stPmZpcnN0XVtrLT5zZWNvbmRdPT0xKQotICAgICAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAgICAgICAgcG9pbnQuZmlyc3Q9ay0+Zmlyc3Q7cG9pbnQuc2Vjb25kPWstPnNlY29uZDsKLSAgICAgICAgICAgICAgIC8vb25lIG9mIHRoZSB0d28gd29yZHMgaXMgbm90IGNvdmVyZWQgeWV0Ci0gICAgICAgICAgICAgICAvL2NvdXQgPDwgInsiIDw8IHBvaW50LnNlY29uZC0xIDw8ICItIiA8PCBwb2ludC5maXJzdC0xIDw8ICJ9ICI7Ci0gICAgICAgICAgICAgICBpZiAoKGJvdGh1bmNvdmVyZWQgJiYgICFlYVtwb2ludC5maXJzdF0gJiYgIWZhW3BvaW50LnNlY29uZF0pIHx8Ci0gICAgICAgICAgICAgICAgICAoIWJvdGh1bmNvdmVyZWQgJiYgIShlYVtwb2ludC5maXJzdF0gJiYgZmFbcG9pbnQuc2Vjb25kXSkpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy9hZGQgaXQhCi0gICAgICAgICAgICAgICAgICBjdXJyZW50cG9pbnRzLmluc2VydChwb2ludCk7Ci0gICAgICAgICAgICAgICAgICBBW3BvaW50LmZpcnN0XVtwb2ludC5zZWNvbmRdPTI7Ci0gICAgICAgICAgICAgICAgICAvL2tlZXAgdHJhY2sgb2YgbmV3IGNvdmVyZWQgcG9zaXRpb25zICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgZWFbcG9pbnQuZmlyc3RdPTE7ZmFbcG9pbnQuc2Vjb25kXT0xOwotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAvL2FkZGVkPTE7Ci0gICAgICAgICAgICAgICAgICAvL2NvdXQgPDwgImFkZGVkIGZpbmFsOiAiIDw8IHBvaW50LnNlY29uZC0xIDw8ICItIiA8PCBwb2ludC5maXJzdC0xIDw8ICJcbiI7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIGZvciAoaz11bmlvbmFsaWdubWVudC5iZWdpbigpO2shPXVuaW9uYWxpZ25tZW50LmVuZCgpO2srKykKLSAgICAgICAgICAgICAgICAgIGlmIChBW2stPmZpcnN0XVtrLT5zZWNvbmRdPT0tMSkKLSAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIHBvaW50LmZpcnN0PWstPmZpcnN0O3BvaW50LnNlY29uZD1rLT5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAvL29uZSBvZiB0aGUgdHdvIHdvcmRzIGlzIG5vdCBjb3ZlcmVkIHlldAotICAgICAgICAgICAgICAgICAgICAgLy9jb3V0IDw8ICJ7IiA8PCBwb2ludC5zZWNvbmQtMSA8PCAiLSIgPDwgcG9pbnQuZmlyc3QtMSA8PCAifSAiOwotICAgICAgICAgICAgICAgICAgICAgaWYgKChib3RodW5jb3ZlcmVkICYmICAhZWFbcG9pbnQuZmlyc3RdICYmICFmYVtwb2ludC5zZWNvbmRdKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICghYm90aHVuY292ZXJlZCAmJiAhKGVhW3BvaW50LmZpcnN0XSAmJiBmYVtwb2ludC5zZWNvbmRdKSkpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2FkZCBpdCEKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRwb2ludHMuaW5zZXJ0KHBvaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFbcG9pbnQuZmlyc3RdW3BvaW50LnNlY29uZF09MjsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8va2VlcCB0cmFjayBvZiBuZXcgY292ZXJlZCBwb3NpdGlvbnMgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBlYVtwb2ludC5maXJzdF09MTtmYVtwb2ludC5zZWNvbmRdPTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYWRkZWQ9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vY291dCA8PCAiYWRkZWQgZmluYWw6ICIgPDwgcG9pbnQuc2Vjb25kLTEgPDwgIi0iIDw8IHBvaW50LmZpcnN0LTEgPDwgIlxuIjsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICAgICAgIAotICAgICAgICAgICAgIAotICAgICAgICAgZm9yIChrPWN1cnJlbnRwb2ludHMuYmVnaW4oKTtrIT1jdXJyZW50cG9pbnRzLmVuZCgpO2srKykKLSAgICAgICAgICAgIHNvdXQgPDwgay0+c2Vjb25kLTEgPDwgIi0iIDw8IGstPmZpcnN0LTEgPDwgIiAiOwotICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIC8vZml4IHRoZSBsYXN0ICIgIgotICAgICAgICAgc3RyaW5nIHN0ciA9IHNvdXQuc3RyKCk7ICAKLQkgaWYgKHN0ci5sZW5ndGgoKSA9PSAwKQotCSAgIHN0ciA9ICJcbiI7Ci0JIGVsc2UKLQkgICBzdHIucmVwbGFjZShzdHIubGVuZ3RoKCktMSwxLCJcbiIpOwotICAgICAgICAgCi0gICAgICAgICBvdXQgPDwgc3RyOwotICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgIAotICAgICAgICAgcmV0dXJuIDE7Ci19Ci0KLQotCi0vL01haW4gZmlsZSBoZXJlCi0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KXsKLQkKLWludCBhbGlnbm1lbnQ9MDsgICAKLWNoYXIqIGlucHV0PSIvZGV2L3N0ZGluIjsKLWNoYXIqIG91dHB1dD0iL2Rldi9zdGRvdXQiOwotaW50IGRpYWdvbmFsPWZhbHNlOwotaW50IGZpbmFsPWZhbHNlOwotaW50IGJvdGh1bmNvdmVyZWQ9ZmFsc2U7Ci0KLQkKLQlEZWNsYXJlUGFyYW1zKCJhIiwgQ01ERU5VTVRZUEUsICAmYWxpZ25tZW50LCBBbGlnbkVudW0sCi0gICAgICAgICAgICAgICAgICJhbGlnbm1lbnQiLCBDTURFTlVNVFlQRSwgICZhbGlnbm1lbnQsIEFsaWduRW51bSwKLSAgICAgICAgICAgICAgICAgImQiLCBDTURFTlVNVFlQRSwgICZkaWFnb25hbCwgQm9vbEVudW0sCi0gICAgICAgICAgICAgICAgICJkaWFnb25hbCIsIENNREVOVU1UWVBFLCAgJmRpYWdvbmFsLCBCb29sRW51bSwKLSAgICAgICAgICAgICAgICAgImYiLCBDTURFTlVNVFlQRSwgICZmaW5hbCwgQm9vbEVudW0sCi0gICAgICAgICAgICAgICAgICJmaW5hbCIsIENNREVOVU1UWVBFLCAgJmZpbmFsLCBCb29sRW51bSwKLSAgICAgICAgICAgICAgICAgImIiLCBDTURFTlVNVFlQRSwgICZib3RodW5jb3ZlcmVkLCBCb29sRW51bSwgIAotICAgICAgICAgICAgICAgICAiYm90aCIsIENNREVOVU1UWVBFLCAgJmJvdGh1bmNvdmVyZWQsIEJvb2xFbnVtLCAgCi0gICAgICAgICAgICAgICAgICJpIiwgQ01EU1RSSU5HVFlQRSwgJmlucHV0LAotICAgICAgICAgICAgICAgICAibyIsIENNRFNUUklOR1RZUEUsICZvdXRwdXQsCi0gICAgICAgICAgICAgICAgICJ2IiwgQ01ERU5VTVRZUEUsICAmdmVyYm9zZSwgQm9vbEVudW0sCi0gICAgICAgICAgICAgICAgICJ2ZXJib3NlIiwgQ01ERU5VTVRZUEUsICAmdmVyYm9zZSwgQm9vbEVudW0sCi0KLSAgICAgICAgICAgICAgICAgKGNoYXIgKilOVUxMKTsKLSAgCi0JR2V0UGFyYW1zKCZhcmdjLCAmYXJndiwgKGNoYXIqKSBOVUxMKTsKLSAgIAotICAgaWYgKGFsaWdubWVudD09MCl7Ci0gICAgICBjZXJyIDw8ICJ1c2FnZTogc3ltYWwgWy1pPTxpbnB1dGZpbGU+XSBbLW89PG91dHB1dGZpbGU+XSAtYT1bdXxpfGddIC1kPVt5ZXN8bm9dIC1iPVt5ZXN8bm9dIC1mPVt5ZXN8bm9dIFxuIgotICAgICAgPDwgIklucHV0IGZpbGUgb3Igc3RkIG11c3QgYmUgaW4gLmJhbCBmb3JtYXQgKHNlZSBzY3JpcHQgZ2l6YTJiYWwucGwpLlxuIjsKLSAgICAgICAgIAotICAgICAgZXhpdCgxKTsKLSAgICAgICAgCi0gICB9Ci0KLQlmc3RyZWFtIGlucChpbnB1dCxpb3M6OmluKTsKLSAgIGZzdHJlYW0gb3V0KG91dHB1dCxpb3M6Om91dCk7Ci0KLQlpZiAoIWlucC5pc19vcGVuKCkpewotCQljZXJyIDw8ICJjYW5ub3Qgb3BlbiAiIDw8IGlucHV0IDw8ICJcbiI7Ci0JCWV4aXQoMSk7Ci0JfQotICAgCi0gICBpZiAoIW91dC5pc19vcGVuKCkpewotCQljZXJyIDw8ICJjYW5ub3Qgb3BlbiAiIDw8IG91dHB1dCA8PCAiXG4iOwotCQlleGl0KDEpOwotCX0KLSAgIAotCi0gIGludCBhW01BWF9NXSxiW01BWF9OXSxtLG47Ci0gIGZhPW5ldyBpbnRbTUFYX00rMV07Ci0gIGVhPW5ldyBpbnRbTUFYX04rMV07Ci0gCi0gICAgICAKLSAgaW50IHNlbnRzID0gMDsKLSAgQT1uZXcgaW50ICpbTUFYX04rMV07IAotICBmb3IgKGludCBpPTE7aTw9TUFYX047aSsrKSBBW2ldPW5ldyBpbnRbTUFYX00rMV07Ci0gICAgICAKLQlzd2l0Y2ggKGFsaWdubWVudCl7Ci0JCWNhc2UgVU5JT046Ci0gICAgICAgICBjZXJyIDw8ICJzeW1hbDogY29tcHV0aW5nIHVuaW9uIGFsaWdubWVudFxuIjsKLQkJCXdoaWxlKGdldGFscyhpbnAsbSxhLG4sYixvdXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHBydW5pb25hbGlnbm1lbnQob3V0LG0sYSxuLGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50cysrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2VyciA8PCAiU2VudHM6ICIgPDwgc2VudHMgPDwgZW5kbDsKLQkJCWJyZWFrOwotCQljYXNlIElOVEVSU0VDVDoKLSAgICAgICAgICBjZXJyIDw8ICJzeW1hbDogY29tcHV0aW5nIGludGVyc2VjdCBhbGlnbm1lbnRcbiI7Ci0JCQl3aGlsZShnZXRhbHMoaW5wLG0sYSxuLGIsb3V0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGVyc2VjdChvdXQsbSxhLG4sYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjZXJyIDw8ICJTZW50czogIiA8PCBzZW50cyA8PCBlbmRsOwotCQkJYnJlYWs7Ci0gICAgICBjYXNlIEdST1c6Ci0gICAgIGNlcnIgPDwgInN5bWFsOiBjb21wdXRpbmcgZ3JvdyBhbGlnbm1lbnQ6IGRpYWdvbmFsICgiCi0gICAgICAgICA8PCBkaWFnb25hbCA8PCAiKSBmaW5hbCAoIjw8IGZpbmFsIDw8ICIpIiAKLSAgICAgICAgIDw8ICAiYm90aC11bmNvdmVyZWQgKCIgPDwgYm90aHVuY292ZXJlZCA8PCIpXG4iOyAKLSAgICAgICAgIAotICAgICAgICAgd2hpbGUoZ2V0YWxzKGlucCxtLGEsbixiLG91dCkpIAotICAgICAgICAgICAgICAgcHJpbnRncm93KG91dCxtLGEsbixiLGRpYWdvbmFsLGZpbmFsLGJvdGh1bmNvdmVyZWQpOwotICAgICAgICAgCi0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVEdUVE9TUkM6Ci0gICAgICAgIGNlcnIgPDwgInN5bWFsOiBjb21wdXRpbmcgdGFyZ2V0LXRvLXNvdXJjZSBhbGlnbm1lbnRcbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICB3aGlsZShnZXRhbHMoaW5wLG0sYSxuLGIsb3V0KSl7IAotICAgICAgICAgICAgICAgICAgcHJpbnR0Z3R0b3NyYyhvdXQsbSxhLG4sYik7Ci0gICAgICAgICAgICAgICAgICBzZW50cysrOyAgICAgICAgICAgCi0gICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICBjZXJyIDw8ICJTZW50czogIiA8PCBzZW50cyA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgY2FzZSBTUkNUT1RHVDoKLSAgICAgICAgY2VyciA8PCAic3ltYWw6IGNvbXB1dGluZyBzb3VyY2UtdG8tdGFyZ2V0IGFsaWdubWVudFxuIjsKLSAgICAgICAgIAotICAgICAgICAgd2hpbGUoZ2V0YWxzKGlucCxtLGEsbixiLG91dCkpewotICAgICAgICAgICAgICAgICAgcHJpbnRzcmN0b3RndChvdXQsbSxhLG4sYik7Ci0gICAgICAgICAgICAgICAgICBzZW50cysrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgY2VyciA8PCAiU2VudHM6ICIgPDwgc2VudHMgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJCWV4aXQoMSk7Ci0JfQotICAgCi0gICBkZWxldGUgW10gZmE7IGRlbGV0ZSBbXSBlYTsgCi0gICBmb3IgKGludCBpPTE7aTw9TUFYX047aSsrKSBkZWxldGUgW10gQVtpXTsKLSAgIGRlbGV0ZSBbXSBBOwotICAgCi0gICBleGl0KDApOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvc3luY09iai5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvc3luY09iai5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmFmOTQ2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3N5bmNPYmouaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSNpZm5kZWYgX19TWU5DX09CSl9IX18KLSNkZWZpbmUgX19TWU5DX09CSl9IX18KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDxib29zdC90aHJlYWQvbXV0ZXguaHBwPgotY2xhc3MgTXV0ZXh7Ci0gICAgcHJpdmF0ZToKLSAgICAgICBtdXRhYmxlIGJvb3N0OjptdXRleCogbXlfbXV0ZXg7Ci0JICAgTXV0ZXgoY29uc3QgTXV0ZXgmKXsKLQkJIAotCSAgIH0KLSAgICBwdWJsaWM6Ci0gICAgICAgIE11dGV4KCl7Ci0JCQlteV9tdXRleCA9IG5ldyBib29zdDo6bXV0ZXgoKTsKLQkJfTsKLSAgICAgICAgfk11dGV4KCl7ZGVsZXRlIG15X211dGV4O215X211dGV4ID0gMDt9Ci0KLQkJaW5saW5lIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE11dGV4JiByZWYpe30KLQotICAgIHB1YmxpYzoKLSAgICAgICAgaW5saW5lIHZvaWQgbG9jaygpIGNvbnN0e215X211dGV4LT5sb2NrKCk7fTsKLSAgICAgICAgaW5saW5lIHZvaWQgdW5sb2NrKCkgY29uc3R7bXlfbXV0ZXgtPnVubG9jaygpO307Ci19OwotCi0jZWxzZQotCi1jbGFzcyBNdXRleHsKLXByaXZhdGU6Ci0JbXV0YWJsZSBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Ci0KLXB1YmxpYzoKLQlNdXRleCgpewotCQlwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LE5VTEwpOwotCX07Ci0Jfk11dGV4KCl7cHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleCk7fQotCi1wdWJsaWM6Ci0JaW5saW5lIHZvaWQgbG9jaygpIGNvbnN0e3B0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpO307Ci0JaW5saW5lIHZvaWQgdW5sb2NrKCkgY29uc3R7cHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTt9OwotfTsKLQotI2VuZGlmCi1jbGFzcyBTeW5jRG91YmxlewotcHJpdmF0ZToKLQlkb3VibGUgaTsKLQlNdXRleCBtOwotcHVibGljOgotCVN5bmNEb3VibGUoZG91YmxlIGQpIHtpPWQ7fTsKLQlTeW5jRG91YmxlKCkge2k9MDt9OwotCS8vaW5saW5lIG9wZXJhdG9yIGNvbnN0IGRvdWJsZSgpY29uc3R7cmV0dXJuIGk7fQotCWlubGluZSBib29sIG9wZXJhdG9yID09KGNvbnN0IGRvdWJsZSYgcikgY29uc3R7cmV0dXJuIGkgPT0gcjt9OwotCWlubGluZSB2b2lkIG9wZXJhdG9yICs9KGNvbnN0IGRvdWJsZSYgcikge20ubG9jaygpO2kgKz0gcjttLnVubG9jaygpO307Ci0JaW5saW5lIHZvaWQgb3BlcmF0b3IgKz0oY29uc3QgU3luY0RvdWJsZSYgcikge20ubG9jaygpO2kgKz0gci5pO20udW5sb2NrKCk7fTsKLQlpbmxpbmUgdm9pZCBvcGVyYXRvciAtPShjb25zdCBkb3VibGUmIHIpIHttLmxvY2soKTtpIC09IHI7bS51bmxvY2soKTt9OwotCWlubGluZSB2b2lkIG9wZXJhdG9yICo9KGNvbnN0IGRvdWJsZSYgcikge20ubG9jaygpO2kgKj0gcjttLnVubG9jaygpO307Ci0JaW5saW5lIHZvaWQgb3BlcmF0b3IgLz0oY29uc3QgZG91YmxlJiByKSB7bS5sb2NrKCk7aSAvPSByO20udW5sb2NrKCk7fTsKLQlpbmxpbmUgZG91YmxlIG9wZXJhdG9yID0oY29uc3QgZG91YmxlJiByKSB7bS5sb2NrKCk7aSA9IHI7bS51bmxvY2soKTtyZXR1cm4gaTt9OwotCWlubGluZSBkb3VibGUgb3BlcmF0b3IgPShjb25zdCBpbnQmIHIpIHttLmxvY2soKTtpID0gcjttLnVubG9jaygpO3JldHVybiBpO307Ci0JaW5saW5lIHZvaWQgb3BlcmF0b3IgKysoKSB7bS5sb2NrKCk7aSsrO20udW5sb2NrKCk7fTsKLQlpbmxpbmUgZG91YmxlIG9wZXJhdG9yICsoY29uc3QgU3luY0RvdWJsZSYgcil7cmV0dXJuIHIuaStpO307Ci0JaW5saW5lIGRvdWJsZSBvcGVyYXRvciAvKGNvbnN0IFN5bmNEb3VibGUmIHIpe3JldHVybiBpL3IuaTt9OwotCS8vaW5saW5lIHZvaWQgb3BlcmF0b3IgLS0oKSB7bS5sb2NrKCk7aS0tO20udW5sb2NrKCk7fTsKLQkvL2lubGluZSBjb25zdCBpc3RyZWFtJiBvcGVyYXRvcjw8KGNvbnN0IGlzdHJlYW0mIHApY29uc3R7cDw8aTtyZXR1cm4gcDt9OwotCWZyaWVuZCAgb3N0cmVhbSYgb3BlcmF0b3I8PCggb3N0cmVhbSYgcCxjb25zdCBTeW5jRG91YmxlJiBkKTsKLX07Ci0KLWlubGluZSBvc3RyZWFtJiBvcGVyYXRvcjw8KCBvc3RyZWFtJiBwLCBjb25zdCBTeW5jRG91YmxlJiBkKXtwPDxkLmk7cmV0dXJuIHA7fTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy90cmFuc3BhaXJfbW9kZWwxLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy90cmFuc3BhaXJfbW9kZWwxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZDc4NzUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvdHJhbnNwYWlyX21vZGVsMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2ggKFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0laQSsrICggZXh0ZW5zaW9uIG9mIEdJWkEgKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2lmbmRlZiB0cmFuc3BhaXJfbW9kZWwxX2hfZmpvX2RlZmluZWQKLSNkZWZpbmUgdHJhbnNwYWlyX21vZGVsMV9oX2Zqb19kZWZpbmVkCi0vLyNpbmNsdWRlICJsb2dwcm9iLmgiCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgIkFycmF5Mi5oIgotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJWZWN0b3IuaCIKLSNpbmNsdWRlICJOVGFibGVzLmgiCi0jaW5jbHVkZSAiQVRhYmxlcy5oIgotI2luY2x1ZGUgIlRUYWJsZXMuaCIKLSNpbmNsdWRlICJhbGlnbm1lbnQuaCIKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgIkFycmF5Mi5oIgotI2luY2x1ZGUgIm15c3RsLmgiCi0KLWNsYXNzIHRyYW5zcGFpcl9tb2RlbDEgCi17Ci0gcHVibGljOgotICBib29sIHZlcmJvc2VUUDsKLSAgQXJyYXkyPFBST0IsIFZlY3RvcjxQUk9CPiA+IHQ7Ci0gIFdvcmRJbmRleCBsLCBtOwotICBWZWN0b3I8V29yZEluZGV4PiBFLEY7Ci0gIHZvaWQgc2V0TW9kZShib29sKQotICAgIHt9Ci0gIHRyYW5zcGFpcl9tb2RlbDEoY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mZXMsIGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JmZzLCBjb25zdCB0bW9kZWw8Q09VTlQsIFBST0I+JnRUYWJsZSkKLSAgICA6IHZlcmJvc2VUUCgwKSx0KGVzLnNpemUoKSwgZnMuc2l6ZSgpKSxsKGVzLnNpemUoKS0xKSwgbShmcy5zaXplKCktMSksRShlcyksRihmcykKLSAgICB7Ci0gICAgICBXb3JkSW5kZXggbD1lcy5zaXplKCktMSxtPWZzLnNpemUoKS0xOwotICAgICAgZm9yKFdvcmRJbmRleCBpPTA7aTw9bDtpKyspCi0JZm9yKFdvcmRJbmRleCBqPTE7ajw9bTtqKyspCi0JICB7Ci0JICAgIHQoaSwgaik9dFRhYmxlLmdldFByb2IoZXNbaV0sIGZzW2pdKTsKLQkgICAgaWYoICEodChpLGopPj1QUk9CX1NNT09USCkgKQotCSAgICAgIGNlcnIgPDwgIkVSUk9SIElOIFBST0JBQklMSVRZOiAiIDw8IHQoaSxqKSA8PCAiICIgPDwgUFJPQl9TTU9PVEggPDwgZW5kbDsKLQkgIH0KLSAgICB9Ci0gIC8qICB0cmFuc3BhaXJfbW9kZWwxKGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JmVzLCBjb25zdCBWZWN0b3I8V29yZEluZGV4PiZmcykKLSAgICA6IHZlcmJvc2VUUCgwKSx0KGVzLnNpemUoKSwgZnMuc2l6ZSgpKSxsKGVzLnNpemUoKS0xKSwgbShmcy5zaXplKCktMSksRShlcyksRihmcykKLSAgICB7Ci0gICAgICBXb3JkSW5kZXggbD1lcy5zaXplKCktMSxtPWZzLnNpemUoKS0xOwotICAgICAgZm9yKFdvcmRJbmRleCBpPTA7aTw9bDtpKyspCi0JZm9yKFdvcmRJbmRleCBqPTE7ajw9bTtqKyspCi0JICB7Ci0JICAgIGNvbnN0IHN0cmluZyZlc3RyPWdsb2JlVHJhaW5WY2JMaXN0LT5nZXRWb2NhYkxpc3QoKVtlc1tpXV0ud29yZDsKLQkgICAgY29uc3Qgc3RyaW5nJmZzdHI9Z2xvYmZUcmFpblZjYkxpc3QtPmdldFZvY2FiTGlzdCgpW2ZzW2pdXS53b3JkOwotCSAgICBpZiggbGV2KGVzdHIsZnN0cik9PTAgKQotCSAgICAgIHQoaSxqKT0xLjA7Ci0JICAgIGVsc2UKLQkgICAgICB0KGksaik9MS8xMDAuMDsKLQkgICAgbWFzc2VydCggdChpLGopPj1QUk9CX1NNT09USCApOwotCSAgfQotfSovCi0gIFdvcmRJbmRleCBnZXRfbCgpY29uc3QKLSAgICB7cmV0dXJuIGw7fQotICBXb3JkSW5kZXggZ2V0X20oKWNvbnN0Ci0gICAge3JldHVybiBtO30KLSAgY29uc3QgUFJPQiZnZXRfdChXb3JkSW5kZXggaSwgV29yZEluZGV4IGopY29uc3QKLSAgICB7bWFzc2VydCggdChpLGopPj1QUk9CX1NNT09USCk7Ci0gICAgcmV0dXJuIHQoaSwgaik7fQotICBXb3JkSW5kZXggZ2V0X2VzKGludCBpKWNvbnN0IHtyZXR1cm4gRVtpXTt9Ci0gIFdvcmRJbmRleCBnZXRfZnMoaW50IGopY29uc3Qge3JldHVybiBGW2pdO30KLSAgYm9vbCBncmVlZHlIaWxsQ2xpbWJpbmcoKWNvbnN0Ci0gICAge3JldHVybiAwO30KLSAgdm9pZCBjb21wdXRlU2NvcmVzKGNvbnN0IGFsaWdubWVudCYsdmVjdG9yPGRvdWJsZT4mKWNvbnN0Ci0gICAge30KLSAgTG9nUHJvYiBzY29yZU9mTW92ZShjb25zdCBhbGlnbm1lbnQmYSwgV29yZEluZGV4IG5ld19pLCBXb3JkSW5kZXggaixkb3VibGU9LTEuMCljb25zdAotICAgIHsKLSAgICAgIGludCBvbGRfaT1hKGopOwotICAgICAgcmV0dXJuICh0KG5ld19pLCBqKSAvdChvbGRfaSwgaikpOwotICAgIH0KLSAgTG9nUHJvYiBzY29yZU9mU3dhcChjb25zdCBhbGlnbm1lbnQmYSwgV29yZEluZGV4IGoxLCBXb3JkSW5kZXggajIsZG91YmxlPS0xLjApY29uc3QgCi0gICAgewotICAgICAgV29yZEluZGV4IGkxPWEoajEpLCBpMj1hKGoyKTsKLSAgICAgIHJldHVybiAodChpMiwgajEpL3QoaTEsIGoxKSkqKHQoaTEsIGoyKS90KGkyLCBqMikpOwotICAgIH0KLSAgTG9nUHJvYiBwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShjb25zdCBhbGlnbm1lbnQmYWwpY29uc3QKLSAgICB7Ci0gICAgICBMb2dQcm9iIHByb2I9MS4wOwotICAgICAgaW50IGxwMT1hbC5nZXRfbCgpKzE7Ci0gICAgICBmb3IodW5zaWduZWQgaW50IGo9MTtqPD1hbC5nZXRfbSgpOysraikKLQlwcm9iKj10KGFsKGopLGopL2xwMTsKLSAgICAgIHJldHVybiBwcm9iOwotICAgIH0KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDIuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNkNTNlMy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy90cmFuc3BhaXJfbW9kZWwyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdJWkErKyAoIGV4dGVuc2lvbiBvZiBHSVpBICkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpZm5kZWYgdHJhbnNwYWlyX21vZGVsMl9kZWZpbmVkX2gKLSNkZWZpbmUgdHJhbnNwYWlyX21vZGVsMl9kZWZpbmVkX2gKLQotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJWZWN0b3IuaCIKLSNpbmNsdWRlICJOVGFibGVzLmgiCi0jaW5jbHVkZSAiQVRhYmxlcy5oIgotI2luY2x1ZGUgIlRUYWJsZXMuaCIKLSNpbmNsdWRlICJhbGlnbm1lbnQuaCIKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAidHJhbnNwYWlyX21vZGVsMS5oIgotCi0KLWNsYXNzIHRyYW5zcGFpcl9tb2RlbDIgOiBwdWJsaWMgdHJhbnNwYWlyX21vZGVsMQotewotIHByb3RlY3RlZDoKLSAgQXJyYXkyPFBST0IsIFZlY3RvcjxQUk9CPiA+IGE7Ci0gcHVibGljOgotICB0cmFuc3BhaXJfbW9kZWwyKGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JmVzLCBjb25zdCBWZWN0b3I8V29yZEluZGV4PiZmcywgY29uc3QgdG1vZGVsPENPVU5ULCBQUk9CPiZ0VGFibGUsIAotCQkgICBjb25zdCBhbW9kZWw8UFJPQj4mYVRhYmxlKQotICAgIDogdHJhbnNwYWlyX21vZGVsMShlcyxmcyx0VGFibGUpLGEoZXMuc2l6ZSgpLGZzLnNpemUoKSkKLSAgICB7Ci0gICAgICBmb3IoV29yZEluZGV4IGk9MDtpPD1sO2krKykKLQlmb3IoV29yZEluZGV4IGo9MTtqPD1tO2orKykKLQkgIGEoaSwgaik9YVRhYmxlLmdldFZhbHVlKGksIGosIGwsIG0pOwotICAgIH0KLSAgY29uc3QgUFJPQiZnZXRfYShXb3JkSW5kZXggaSwgV29yZEluZGV4IGopY29uc3QKLSAgICB7cmV0dXJuIGEoaSwgaik7fQotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvdHJhbnNwYWlyX21vZGVsMy5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy90cmFuc3BhaXJfbW9kZWwzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiNGM1NC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy90cmFuc3BhaXJfbW9kZWwzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLS8qLS0KLXRyYW5zcGFpcl9tb2RlbDM6IHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNsYXRpb24gcGFpciBmb3IgbW9kZWwzIHRyYWluaW5nCi1hbGxvd2luZyBmb3IgZmFzdCBhY2Nlc3MgKGVzcC4gdG8gdCB0YWJsZSkuCi0KLUZyYW56IEpvc2VmIE9jaCAoMzAvMDcvOTkpCi0tLSovCi0jaW5jbHVkZSAidHJhbnNwYWlyX21vZGVsMy5oIgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotdHJhbnNwYWlyX21vZGVsMzo6dHJhbnNwYWlyX21vZGVsMyhjb25zdCBWZWN0b3I8V29yZEluZGV4PiZlcywgY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mZnMsIHRtb2RlbDxDT1VOVCwgUFJPQj4mdFRhYmxlLCBhbW9kZWw8UFJPQj4mYVRhYmxlLCBhbW9kZWw8UFJPQj4mZFRhYmxlLCBubW9kZWw8UFJPQj4mblRhYmxlLCBkb3VibGUgX3AxLCBkb3VibGUgX3AwLCB2b2lkKikKLSAgOiB0cmFuc3BhaXJfbW9kZWwyKGVzLGZzLHRUYWJsZSxhVGFibGUpLGQoZXMuc2l6ZSgpLCBmcy5zaXplKCkpLG4oZXMuc2l6ZSgpLCBNQVhfRkVSVElMSVRZKzEpLCBwMChfcDApLCBwMShfcDEpCi17IAotICBXb3JkSW5kZXggbD1lcy5zaXplKCktMSxtPWZzLnNpemUoKS0xOwotICBmb3IoV29yZEluZGV4IGk9MDtpPD1sO2krKykKLSAgICB7Ci0gICAgICBmb3IoV29yZEluZGV4IGo9MTtqPD1tO2orKykKLQlkKGksIGopPWRUYWJsZS5nZXRWYWx1ZShqLCBpLCBsLCBtKTsKLSAgICAgIGlmKCBpPjAgKQotCXsKLQkgIGZvcihXb3JkSW5kZXggZj0wO2Y8TUFYX0ZFUlRJTElUWTtmKyspCi0JICAgIG4oaSwgZik9blRhYmxlLmdldFZhbHVlKGVzW2ldLCBmKTsKLQkgIG4oaSxNQVhfRkVSVElMSVRZKT1QUk9CX1NNT09USDsKLQl9Ci0gICAgfQotfQotCi1Mb2dQcm9iIHRyYW5zcGFpcl9tb2RlbDM6OnNjb3JlT2ZNb3ZlKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggbmV3X2ksIFdvcmRJbmRleCBqLCBkb3VibGUsYm9vbCBmb3JNb2RlbDMpY29uc3QKLXsKLSAgTG9nUHJvYiBjaGFuZ2U7Ci0gIGNvbnN0IFdvcmRJbmRleCBvbGRfaT1hKGopOwotICBXb3JkSW5kZXggZjA9YS5mZXJ0KDApOwotICBpZiAob2xkX2kgPT0gbmV3X2kpCi0gICAgY2hhbmdlPTEuMDsKLSAgZWxzZSBpZiAob2xkX2kgPT0gMCkKLSAgICBjaGFuZ2U9KChkb3VibGUpcDAqcDAvcDEpICoKLSAgICAgICgoIChEZWZpY2llbnREaXN0b3J0aW9uRm9yRW1wdHlXb3JkPyhtYXgoMixpbnQobSkpL0RlZmljaWVudERpc3RvcnRpb25Gb3JFbXB0eVdvcmQpOmYwKSoobS1mMCsxLjApKSAvICgobS0yKmYwKzEpKihtLTIqZjArMi4wKSkpICoKLSAgICAgICgoUFJPQikoZm9yTW9kZWwzPyhhLmZlcnQobmV3X2kpKzEuMCk6MS4wKSkgKgotICAgICAgKGdldF9mZXJ0aWxpdHkobmV3X2ksIGEuZmVydChuZXdfaSkrMSkgLyBnZXRfZmVydGlsaXR5KG5ld19pLCBhLmZlcnQobmV3X2kpKSkqCi0gICAgICAodChuZXdfaSwgaikvdChvbGRfaSwgaikpKgotICAgICAgKGZvck1vZGVsMz9kKG5ld19pLCBqKToxLjApOwotICBlbHNlIGlmIChuZXdfaSA9PSAwKQotICAgIGNoYW5nZT0oZG91YmxlKHAxKSAvIChwMCpwMCkpICoKLSAgICAgIChkb3VibGUoKG0tMipmMCkqKG0tMipmMC0xKSkvKCAoRGVmaWNpZW50RGlzdG9ydGlvbkZvckVtcHR5V29yZD8obWF4KDIsaW50KG0pKS9EZWZpY2llbnREaXN0b3J0aW9uRm9yRW1wdHlXb3JkKTooMStmMCkpKihtLWYwKSkpICoKLSAgICAgIChmb3JNb2RlbDM/KDEuMC9hLmZlcnQob2xkX2kpKToxLjApICoKLSAgICAgIChnZXRfZmVydGlsaXR5KG9sZF9pLCBhLmZlcnQob2xkX2kpLTEpIC9nZXRfZmVydGlsaXR5KG9sZF9pLCBhLmZlcnQob2xkX2kpKSkqCi0gICAgICAodChuZXdfaSwgaikgL3Qob2xkX2ksIGopKSAqCi0gICAgICAoZm9yTW9kZWwzPygxLjAgLyBkKG9sZF9pLCBqKSk6MS4wKTsKLSAgZWxzZQotICAgIGNoYW5nZT0oZm9yTW9kZWwzPygoYS5mZXJ0KG5ld19pKSsxLjApL2EuZmVydChvbGRfaSkpOjEuMCkgKgotICAgICAgKGdldF9mZXJ0aWxpdHkob2xkX2ksYS5mZXJ0KG9sZF9pKS0xKSAvIGdldF9mZXJ0aWxpdHkob2xkX2ksYS5mZXJ0KG9sZF9pKSkpICoKLSAgICAgIChnZXRfZmVydGlsaXR5KG5ld19pLGEuZmVydChuZXdfaSkrMSkgL2dldF9mZXJ0aWxpdHkobmV3X2ksYS5mZXJ0KG5ld19pKSkpICoKLSAgICAgICh0KG5ld19pLGopL3Qob2xkX2ksaikpICoKLSAgICAgIChmb3JNb2RlbDM/KGQobmV3X2ksaikvZChvbGRfaSxqKSk6MS4wKTsKLSAgcmV0dXJuIGNoYW5nZTsKLX0KLQotTG9nUHJvYiB0cmFuc3BhaXJfbW9kZWwzOjpzY29yZU9mU3dhcChjb25zdCBhbGlnbm1lbnQmYSwgV29yZEluZGV4IGoxLCBXb3JkSW5kZXggajIsIGRvdWJsZSxib29sIGZvck1vZGVsMyljb25zdCAKLXsKLSAgUFJPQiBzY29yZT0xOwotICBhc3NlcnQoajE8ajIpOwotICBXb3JkSW5kZXggaTE9YShqMSksIGkyPWEoajIpOwotICBpZiAoaTEhPWkyKSAKLSAgICB7Ci0gICAgICBzY29yZT0odChpMiwgajEpL3QoaTEsIGoxKSkqKHQoaTEsIGoyKS90KGkyLCBqMikpOwotICAgICAgaWYoIGZvck1vZGVsMyApCi0JewotCSAgaWYgKGkxKQotCSAgICBzY29yZSAqPSBkKGkxLCBqMikvZChpMSwgajEpOwotCSAgaWYgKGkyKQotCSAgICBzY29yZSAqPSBkKGkyLCBqMSkvZChpMiwgajIpOyAgICAKLQl9Ci0gICAgfQotICByZXR1cm4gc2NvcmU7Ci19Ci0KLW9zdHJlYW0mb3BlcmF0b3I8PChvc3RyZWFtJm91dCwgY29uc3QgdHJhbnNwYWlyX21vZGVsMyZtKQotewotICBmb3IoV29yZEluZGV4IGk9MDtpPD1tLmdldF9sKCk7aSsrKQotICAgIHsKLSAgICAgIG91dCA8PCAiRUYtSToiPDxpPDwnICc7Ci0gICAgICBmb3IoV29yZEluZGV4IGo9MTtqPD1tLmdldF9tKCk7aisrKQotCW91dCA8PCAiKCI8PG0udChpLGopPDwiLCI8PG0uZChpLGopPDwiKSI7Ci0gICAgICBmb3IoV29yZEluZGV4IGo9MTtqPE1BWF9GRVJUSUxJVFk7aisrKQotCWlmKCBpPjAgKQotCSAgb3V0IDw8ICIoZmVydDoiPDxtLmdldF9mZXJ0aWxpdHkoaSxqKTw8IikiOwotICAgICAgb3V0IDw8ICdcbic7Ci0gICAgfQotICBvdXQgPDwgIlQ6IiA8PCBtLnQgPDwgIkQ6IiA8PCBtLmQgPDwgIkE6IiA8PCBtLmEgIDw8ICJOOiIgPDwgbS5uIDw8IG0ucDAgPDwgbS5wMSA8PCAnXG4nOwotICByZXR1cm4gb3V0OwotfQotCi1Mb2dQcm9iIHRyYW5zcGFpcl9tb2RlbDM6Ol9zY29yZU9mTW92ZShjb25zdCBhbGlnbm1lbnQmYSwgV29yZEluZGV4IG5ld19pLCBXb3JkSW5kZXggaixkb3VibGUpY29uc3QKLXsKLSAgYWxpZ25tZW50IGIoYSk7Ci0gIGIuc2V0KGosIG5ld19pKTsKLSAgTG9nUHJvYiBhX3Byb2I9cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYSk7Ci0gIExvZ1Byb2IgYl9wcm9iPXByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKGIpOwotICBpZiggYV9wcm9iICkKLSAgICByZXR1cm4gYl9wcm9iL2FfcHJvYjsKLSAgZWxzZSBpZiggYl9wcm9iICkKLSAgICByZXR1cm4gMWUyMDsKLSAgZWxzZQotICAgIHJldHVybiAxLjA7Ci19Ci0KLUxvZ1Byb2IgdHJhbnNwYWlyX21vZGVsMzo6X3Njb3JlT2ZTd2FwKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggajEsIFdvcmRJbmRleCBqMixkb3VibGUgdGhpc1ZhbHVlKWNvbnN0Ci17Ci0gIGFsaWdubWVudCBiKGEpOwotICBiLnNldChqMSwgYShqMikpOwotICBiLnNldChqMiwgYShqMSkpOwotICBMb2dQcm9iIGFfcHJvYj10aGlzVmFsdWU7Ci0gIGlmKCBhX3Byb2I8MC4wICkKLSAgICBhX3Byb2I9cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYSk7Ci0gIG1hc3NlcnQoYV9wcm9iPT1wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShhKSk7Ci0gIExvZ1Byb2IgYl9wcm9iPXByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKGIpOwotICBpZiggYV9wcm9iICkKLSAgICByZXR1cm4gYl9wcm9iL2FfcHJvYjsKLSAgZWxzZSBpZiggYl9wcm9iICkKLSAgICByZXR1cm4gMWUyMDsKLSAgZWxzZQotICAgIHJldHVybiAxLjA7Ci19Ci0KLUxvZ1Byb2IgdHJhbnNwYWlyX21vZGVsMzo6cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoY29uc3QgYWxpZ25tZW50JmFsLGJvb2wgdmVyYiljb25zdAotewotICBMb2dQcm9iIHRvdGFsID0gMS4wIDsKLSAgc3RhdGljIGNvbnN0IExvZ1Byb2IgemVybyA9IDFFLTI5OSA7IAotICB0b3RhbCAqPSBwb3coZG91YmxlKDEtcDEpLCBtLTIuMCAqIGFsLmZlcnQoMCkpICogcG93KGRvdWJsZShwMSksIGRvdWJsZShhbC5mZXJ0KDApKSk7Ci0gIGlmKCB2ZXJiKSBjZXJyIDw8ICJJQk0tMzogKDEtcDEpXihtLTIgZjApKnAxXmYwOiAiIDw8IHRvdGFsIDw8ICdcbic7Ci0gIGZvciAoV29yZEluZGV4IGkgPSAxIDsgaSA8PSBhbC5mZXJ0KDApIDsgaSsrKQotICAgIHRvdGFsICo9IGRvdWJsZShtIC0gYWwuZmVydCgwKSAtIGkgKyAxKSAvIChkb3VibGUoRGVmaWNpZW50RGlzdG9ydGlvbkZvckVtcHR5V29yZD8obWF4KDIsaW50KG0pKS9EZWZpY2llbnREaXN0b3J0aW9uRm9yRW1wdHlXb3JkKTppKSkgOwotICBpZiggdmVyYikgY2VyciA8PCAiSUJNLTM6ICtOVUxMOmJpbm9taWFsK2Rpc3RvcnRpb24gIiA8PCB0b3RhbCA8PCAnXG4nOwotICBmb3IgKFdvcmRJbmRleCBpID0gMSA7IGkgPD0gbCA7IGkrKykKLSAgICB7Ci0gICAgICB0b3RhbCAqPSBnZXRfZmVydGlsaXR5KGksIGFsLmZlcnQoaSkpICogKExvZ1Byb2IpIGZhY3RvcmlhbChhbC5mZXJ0KGkpKTsKLSAgICAgIGlmKCB2ZXJiKSBjZXJyIDw8ICJJQk0tMzogZmVydGlsaXR5IG9mICIgPDwgaSA8PCAiIHdpdGggZmFjdG9yaWFsICIgPDwgZ2V0X2ZlcnRpbGl0eShpLCBhbC5mZXJ0KGkpKSAqIChMb2dQcm9iKSBmYWN0b3JpYWwoYWwuZmVydChpKSkgPDwgIiAtPiAiIDw8IHRvdGFsIDw8ICdcbic7Ci0gICAgfQotICBmb3IgKFdvcmRJbmRleCBqID0gMSA7IGogPD0gbSA7IGorKykKLSAgICB7Ci0gICAgICB0b3RhbCo9IGdldF90KGFsKGopLCBqKSA7Ci0gICAgICBtYXNzZXJ0KCBnZXRfdChhbChqKSwgaik+PVBST0JfU01PT1RIICk7Ci0gICAgICBpZiggdmVyYikgY2VyciA8PCAiSUJNLTM6IHQgb2YgIiA8PCBqIDw8ICIgIiA8PCBhbChqKSA8PCAiOiAiIDw8IGdldF90KGFsKGopLCBqKSAgPDwgIiAtPiAiIDw8IHRvdGFsIDw8ICdcbic7Ci0gICAgICBpZiAoYWwoaikpCi0JewotCSAgdG90YWwgKj0gZ2V0X2QoYWwoaiksIGopOwotCSAgaWYoIHZlcmIpIGNlcnIgPDwgIklCTS0zOiBkIG9mICIgPDwgaiA8PCAiOiAiIDw8IGdldF9kKGFsKGopLCBqKSAgPDwgIiAtPiAiIDw8IHRvdGFsIDw8ICdcbic7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRvdGFsP3RvdGFsOnplcm87Ci19Ci0KLQotdm9pZCB0cmFuc3BhaXJfbW9kZWwzOjpjb21wdXRlU2NvcmVzKGNvbnN0IGFsaWdubWVudCZhbCx2ZWN0b3I8ZG91YmxlPiZkKWNvbnN0Ci17Ci0gIExvZ1Byb2IgdG90YWwxID0gMS4wLHRvdGFsMj0xLjAsdG90YWwzPTEuMCx0b3RhbDQ9MS4wIDsKLSAgdG90YWwxICo9IHBvdyhkb3VibGUoMS1wMSksIG0tMi4wICogYWwuZmVydCgwKSkgKiBwb3coZG91YmxlKHAxKSwgZG91YmxlKGFsLmZlcnQoMCkpKTsKLSAgZm9yIChXb3JkSW5kZXggaSA9IDEgOyBpIDw9IGFsLmZlcnQoMCkgOyBpKyspCi0gICAgdG90YWwxICo9IGRvdWJsZShtIC0gYWwuZmVydCgwKSAtIGkgKyAxKSAvIChkb3VibGUoRGVmaWNpZW50RGlzdG9ydGlvbkZvckVtcHR5V29yZD8obWF4KDIsaW50KG0pKS9EZWZpY2llbnREaXN0b3J0aW9uRm9yRW1wdHlXb3JkKTppKSkgOwotICBmb3IgKFdvcmRJbmRleCBpID0gMSA7IGkgPD0gbCA7IGkrKykKLSAgICB7Ci0gICAgICB0b3RhbDIgKj0gZ2V0X2ZlcnRpbGl0eShpLCBhbC5mZXJ0KGkpKSAqIChMb2dQcm9iKSBmYWN0b3JpYWwoYWwuZmVydChpKSk7Ci0gICAgfQotICBmb3IgKFdvcmRJbmRleCBqID0gMSA7IGogPD0gbSA7IGorKykKLSAgICB7Ci0gICAgICB0b3RhbDMqPSBnZXRfdChhbChqKSwgaikgOwotICAgICAgbWFzc2VydCggZ2V0X3QoYWwoaiksIGopPj1QUk9CX1NNT09USCApOwotICAgICAgaWYgKGFsKGopKQotCXsKLQkgIHRvdGFsNCAqPSBnZXRfZChhbChqKSwgaik7Ci0JfQotICAgIH0KLSAgZC5wdXNoX2JhY2sodG90YWwxKTsvLzUKLSAgZC5wdXNoX2JhY2sodG90YWwyKTsvLzYKLSAgZC5wdXNoX2JhY2sodG90YWwzKTsvLzcKLSAgZC5wdXNoX2JhY2sodG90YWw0KTsvLzgKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDMuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhNDNkYi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy90cmFuc3BhaXJfbW9kZWwzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLS8qLS0KLXRyYW5zcGFpcl9tb2RlbDM6IHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNsYXRpb24gcGFpciBmb3IgbW9kZWwzIHRyYWluaW5nCi1hbGxvd2luZyBmb3IgZmFzdCBhY2Nlc3MgKGVzcC4gdG8gdCB0YWJsZSkuCi0KLUZyYW56IEpvc2VmIE9jaCAoMzAvMDcvOTkpCi0tLSovCi0jaWZuZGVmIHRyYW5zcGFpcl9tb2RlbDNfaF9mam9fZGVmaW5lZAotI2RlZmluZSB0cmFuc3BhaXJfbW9kZWwzX2hfZmpvX2RlZmluZWQKLSNpbmNsdWRlICJBcnJheTIuaCIKLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAiVmVjdG9yLmgiCi0jaW5jbHVkZSAiTlRhYmxlcy5oIgotI2luY2x1ZGUgIkFUYWJsZXMuaCIKLSNpbmNsdWRlICJUVGFibGVzLmgiCi0jaW5jbHVkZSAiYWxpZ25tZW50LmgiCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDIuaCIKLQotZXh0ZXJuIGRvdWJsZSBmYWN0b3JpYWwoaW50IG4pOwotaW5saW5lIGJvb2wgZG91YmxlRXF1YWwoY29uc3QgZG91YmxlIGEsIGNvbnN0IGRvdWJsZSBiKQotewotICBpZiggYT09YiApCi0gICAgcmV0dXJuIDEuMDsKLSAgYm9vbCBibD1mYWJzKDEuMC1hL2IpPDFlLTEwOwotICBpZiggYmwgKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgewotICAgICAgY2VyciA8PCAiRElGRkVSRU5UOiAiIDw8IGEgPDwgIiAiIDw8IGIgPDwgIiAiIDw8IGEvYiA8PCAiICIgPDwgMS4wLWEvYiA8PCBlbmRsOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0KLWNsYXNzIHRyYW5zcGFpcl9tb2RlbDMgOiBwdWJsaWMgdHJhbnNwYWlyX21vZGVsMgotewotIHByb3RlY3RlZDoKLSAgQXJyYXkyPFBST0IsIFZlY3RvcjxQUk9CPiA+IGQsIG47Ci0gIFBST0IgcDAsIHAxOwotIHB1YmxpYzoKLSAgdHlwZWRlZiB0cmFuc3BhaXJfbW9kZWwzIHNpbXBsZXJfdHJhbnNwYWlyX21vZGVsOwotICB0cmFuc3BhaXJfbW9kZWwzKGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JmVzLCBjb25zdCBWZWN0b3I8V29yZEluZGV4PiZmcywgdG1vZGVsPENPVU5ULCBQUk9CPiZ0VGFibGUsIAotCQkgICBhbW9kZWw8UFJPQj4mYVRhYmxlLCBhbW9kZWw8UFJPQj4mZFRhYmxlLCBubW9kZWw8UFJPQj4mblRhYmxlLCAKLQkJICAgZG91YmxlIF9wMSwgZG91YmxlIF9wMCwgdm9pZCp4PTApOwotICBjb25zdCBQUk9CJmdldF9kKFdvcmRJbmRleCBpLCBXb3JkSW5kZXggailjb25zdAotICAgIHtyZXR1cm4gZChpLCBqKTt9Ci0gIGNvbnN0IFBST0ImZ2V0X2EoV29yZEluZGV4IGksIFdvcmRJbmRleCBqKWNvbnN0Ci0gICAge3JldHVybiBhKGksIGopO30KLSAgY29uc3QgUFJPQiZnZXRfZmVydGlsaXR5KFdvcmRJbmRleCBpLCBXb3JkSW5kZXggZiljb25zdAotICAgIHttYXNzZXJ0KGk+MCk7cmV0dXJuIChmPj1NQVhfRkVSVElMSVRZKT9uKGksIE1BWF9GRVJUSUxJVFkpOm4oaSwgZik7fQotICBpbnQgbW9kZWxucigpY29uc3R7cmV0dXJuIDM7fQotICBMb2dQcm9iIHNjb3JlT2ZBbGlnbm1lbnRGb3JDaGFuZ2UoY29uc3QgYWxpZ25tZW50Jiljb25zdAotICAgIHtyZXR1cm4gLTEuMDsgfSAgCi0gIExvZ1Byb2Igc2NvcmVPZk1vdmUoY29uc3QgYWxpZ25tZW50JmEsIFdvcmRJbmRleCBuZXdfaSwgV29yZEluZGV4IGosIGRvdWJsZSB0aGlzVmFsdWU9LTEuMCxib29sIHdpdGhEaXN0b3J0aW9ucz0xKWNvbnN0OwotICBMb2dQcm9iIHNjb3JlT2ZTd2FwKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggajEsIFdvcmRJbmRleCBqMiwgZG91YmxlIHRoaXNWYWx1ZT0tMS4wLGJvb2wgd2l0aERpc3RvcnRpb25zPTEpY29uc3QgOwotICBMb2dQcm9iIF9zY29yZU9mTW92ZShjb25zdCBhbGlnbm1lbnQmYSwgV29yZEluZGV4IG5ld19pLCBXb3JkSW5kZXggaixkb3VibGUgdGhpc1ZhbHVlPS0xLjApY29uc3Q7Ci0gIExvZ1Byb2IgX3Njb3JlT2ZTd2FwKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggajEsIFdvcmRJbmRleCBqMixkb3VibGUgdGhpc1ZhbHVlPS0xLjApY29uc3Q7Ci0gIGZyaWVuZCBvc3RyZWFtJm9wZXJhdG9yPDwob3N0cmVhbSZvdXQsIGNvbnN0IHRyYW5zcGFpcl9tb2RlbDMmbSk7Ci0gIExvZ1Byb2IgcHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoY29uc3QgYWxpZ25tZW50JmFsLGJvb2wgdmVyYj0wKWNvbnN0OwotICBib29sIGlzU3ViT3B0aW1hbCgpY29uc3R7cmV0dXJuIDE7fQotICB2b2lkIGNvbXB1dGVTY29yZXMoY29uc3QgYWxpZ25tZW50JmFsLHZlY3Rvcjxkb3VibGU+JmQpY29uc3Q7Ci19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy90cmFuc3BhaXJfbW9kZWw0LmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmMyNjY2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2ggKFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0laQSsrICggZXh0ZW5zaW9uIG9mIEdJWkEgKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDQuaCIKLSNpbmNsdWRlICJQYXJhbWV0ZXIuaCIKLQotR0xPQkFMX1BBUkFNRVRFUihmbG9hdCxkNG1vZGVsc21vb3RoX2ZhY3RvciwibW9kZWw0U21vb3RoRmFjdG9yIiwic21vb3RpbmcgcGFyYW1ldGVyIGZvciBhbGlnbm1lbnQgcHJvYmFiaWxpdGllcyBpbiBNb2RlbCA0IixQQVJMRVZfU01PT1RILDAuMik7Ci0KLUxvZ1Byb2IgdHJhbnNwYWlyX21vZGVsNDo6X3Njb3JlT2ZNb3ZlKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggbmV3X2ksIFdvcmRJbmRleCBqLGRvdWJsZSljb25zdAotewotICBMb2dQcm9iIGFfcHJvYj1wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShhKTsKLSAgYWxpZ25tZW50IGIoYSk7Ci0gIGIuc2V0KGosIG5ld19pKTsKLSAgTG9nUHJvYiBiX3Byb2I9cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYik7Ci0gIGlmKCBhX3Byb2IgKQotICAgIHJldHVybiBiX3Byb2IvYV9wcm9iOwotICBlbHNlIGlmKCBiX3Byb2IgKQotICAgIHJldHVybiAxZTIwOwotICBlbHNlCi0gICAgcmV0dXJuIDEuMDsKLX0KLUxvZ1Byb2IgdHJhbnNwYWlyX21vZGVsNDo6X3Njb3JlT2ZTd2FwKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggajEsIFdvcmRJbmRleCBqMixkb3VibGUpY29uc3QgCi17Ci0gIExvZ1Byb2IgYV9wcm9iPXByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKGEpOwotICBhbGlnbm1lbnQgYihhKTsKLSAgYi5zZXQoajEsIGEoajIpKTsKLSAgYi5zZXQoajIsIGEoajEpKTsKLSAgTG9nUHJvYiBiX3Byb2I9cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYik7Ci0gIGlmKCBhX3Byb2IgKQotICAgIHJldHVybiBiX3Byb2IvYV9wcm9iOwotICBlbHNlIGlmKCBiX3Byb2IgKQotICAgIHJldHVybiAxZTIwOwotICBlbHNlCi0gICAgcmV0dXJuIDEuMDsKLX0KLS8vaW5jcmVhc2luZyBlZmZpY2llbmN5OiBubyBjb3B5IG9mIGFsaWdubWVudCAoY2FsYy4gZXZlcnl0aGluZyBpbmNyZW1lbnRhbGx5KQotTG9nUHJvYiB0cmFuc3BhaXJfbW9kZWw0OjpzY29yZU9mTW92ZShjb25zdCBhbGlnbm1lbnQmYSwgV29yZEluZGV4IG5ld19pLCBXb3JkSW5kZXggaixkb3VibGUgdGhpc1ZhbHVlKWNvbnN0Ci17Ci0gIGlmKCBhKGopPT1uZXdfaSApCi0gICAgcmV0dXJuIDEuMDsKLSAgTG9nUHJvYiBjaGFuZ2U9dHJhbnNwYWlyX21vZGVsMzo6c2NvcmVPZk1vdmUoYSxuZXdfaSxqLC0xLjAsMCk7Ci0gIExvZ1Byb2IgYV9wcm9iPXRoaXNWYWx1ZTsKLSAgaWYoYV9wcm9iPDAuMCApCi0gICAgYV9wcm9iPXByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKGEsMik7Ci0gIG1hc3NlcnQoYV9wcm9iPT1wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShhLDIpKTsKLSAgV29yZEluZGV4IG9sZF9pPWEoaik7Ci0gIC8vYWxpZ25tZW50IGIoYSk7Ci0gIGNvbnN0X2Nhc3Q8YWxpZ25tZW50Jj4oYSkuc2V0KGosbmV3X2kpOwotICBMb2dQcm9iIGJfcHJvYj1wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShhLDIpOwotICBjb25zdF9jYXN0PGFsaWdubWVudCY+KGEpLnNldChqLG9sZF9pKTsKLSAgY2hhbmdlKj1iX3Byb2IvYV9wcm9iOwotICByZXR1cm4gY2hhbmdlOwotfQotLy9pbmNyZWFzaW5nIGVmZmljaWVuY3k6IG5vIGNvcHkgb2YgYWxpZ25tZW50IChjYWxjLiBldmVyeXRoaW5nIGluY3JlbWVudGFsbHkpCi1Mb2dQcm9iIHRyYW5zcGFpcl9tb2RlbDQ6OnNjb3JlT2ZTd2FwKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggajEsIFdvcmRJbmRleCBqMixkb3VibGUgdGhpc1ZhbHVlKWNvbnN0IAotewotICBXb3JkSW5kZXggYWoxPWEoajEpLGFqMj1hKGoyKTsKLSAgaWYoIGFqMT09YWoyICkKLSAgICByZXR1cm4gMS4wOwotICBMb2dQcm9iIGNoYW5nZT10cmFuc3BhaXJfbW9kZWwzOjpzY29yZU9mU3dhcChhLGoxLGoyLC0xLjAsMCk7Ci0gIExvZ1Byb2IgYV9wcm9iPXRoaXNWYWx1ZTsKLSAgaWYoIGFfcHJvYjwwLjAgKQotICAgIGFfcHJvYj1wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShhLDIpOwotICBtYXNzZXJ0KGFfcHJvYj09cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYSwyKSk7Ci0KLSAgLy9hbGlnbm1lbnQgYihhKTsKLSAgY29uc3RfY2FzdDxhbGlnbm1lbnQmPihhKS5zZXQoajEsYWoyKTsKLSAgY29uc3RfY2FzdDxhbGlnbm1lbnQmPihhKS5zZXQoajIsYWoxKTsKLSAgTG9nUHJvYiBiX3Byb2I9cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYSwyKTsKLSAgY29uc3RfY2FzdDxhbGlnbm1lbnQmPihhKS5zZXQoajEsYWoxKTsKLSAgY29uc3RfY2FzdDxhbGlnbm1lbnQmPihhKS5zZXQoajIsYWoyKTsKLQotICBpZiggdmVyYm9zZVRQICkKLSAgICBjZXJyIDw8ICJzY29yZU9mU3dhcDogIiA8PCBjaGFuZ2UgPDwgJyAnIDw8IGFfcHJvYiA8PCAnICcgPDwgYl9wcm9iIDw8ICcgJyA8PCBlbmRsOwotICBjaGFuZ2UqPWJfcHJvYi9hX3Byb2I7Ci0gIGlmKCB2ZXJib3NlVFAgKQotICAgIGNlcnIgPDwgInJlc3VsdGluZzogIiA8PCBjaGFuZ2UgPDwgIiBzaG91bGQgYmUgIiA8PCBfc2NvcmVPZlN3YXAoYSxqMSxqMikgPDwgZW5kbDsKLSAgcmV0dXJuIGNoYW5nZTsKLX0KLQotTG9nUHJvYiB0cmFuc3BhaXJfbW9kZWw0Ojpwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZV8xKGNvbnN0IGFsaWdubWVudCZhbCxib29sIHZlcmIpY29uc3QKLXsKLSAgTG9nUHJvYiB0b3RhbCA9IDEuMCA7Ci0gIHRvdGFsICo9IHBvdyhkb3VibGUoMS1wMSksIG0tMi4wICogYWwuZmVydCgwKSkgKiBwb3coZG91YmxlKHAxKSwgZG91YmxlKGFsLmZlcnQoMCkpKTsKLSAgaWYoIHZlcmIpIGNlcnIgPDwgIklCTS00OiAoMS1wMSleKG0tMiBmMCkqcDFeZjA6ICIgPDwgdG90YWwgPDwgZW5kbDsKLSAgZm9yIChXb3JkSW5kZXggaSA9IDEgOyBpIDw9IGFsLmZlcnQoMCkgOyBpKyspCi0gICAgdG90YWwgKj0gZG91YmxlKG0gLSBhbC5mZXJ0KDApIC0gaSArIDEpIC8gKGRvdWJsZShEZWZpY2llbnREaXN0b3J0aW9uRm9yRW1wdHlXb3JkPyhtYXgoMixpbnQobSkpL0RlZmljaWVudERpc3RvcnRpb25Gb3JFbXB0eVdvcmQpOmkpKSA7Ci0gIGlmKCB2ZXJiKSBjZXJyIDw8ICJJQk0tNDogK05VTEw6Ymlub21pYWwrZGlzdG9ydGlvbiAiIDw8IHRvdGFsIDw8IGVuZGw7Ci0gIGZvciAoV29yZEluZGV4IGkgPSAxIDsgaSA8PSBsIDsgaSsrKQotICAgIHsKLSAgICAgIHRvdGFsICo9IGdldF9mZXJ0aWxpdHkoaSwgYWwuZmVydChpKSk7Ly8gKiAoTG9nUHJvYikgZmFjdG9yaWFsKGFsLmZlcnQoaSkpOwotICAgICAgaWYoIHZlcmIpIGNlcnIgPDwgIklCTS00OiBmZXJ0aWxpdHkgb2YgIiA8PCBpIDw8ICIgIiA8PCBnZXRfZmVydGlsaXR5KGksIGFsLmZlcnQoaSkpIDw8ICIgLT4gIiA8PCB0b3RhbCA8PCBlbmRsOwotICAgIH0KLSAgZm9yIChXb3JkSW5kZXggaiA9IDEgOyBqIDw9IG0gOyBqKyspCi0gICAgewotICAgICAgdG90YWwqPSBnZXRfdChhbChqKSwgaikgOwotICAgICAgaWYoIHZlcmIpIGNlcnIgPDwgIklCTS00OiB0IG9mIGo6IiA8PCBqIDw8ICIgaToiIDw8IGFsKGopIDw8ICI6ICIgPDwgZ2V0X3QoYWwoaiksIGopICA8PCAiIC0+ICIgPDwgdG90YWwgPDwgZW5kbDsKLSAgICB9Ci0gIHJldHVybiB0b3RhbDsKLX0KLQotTG9nUHJvYiB0cmFuc3BhaXJfbW9kZWw0Ojpwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShjb25zdCBhbGlnbm1lbnQmYWwsIHNob3J0IGRpc3RvcnRpb25UeXBlLGJvb2wgdmVyYiljb25zdAotewotICBMb2dQcm9iIHRvdGFsID0gMS4wIDsKLSAgc3RhdGljIGNvbnN0IExvZ1Byb2IgYWxtb3N0WmVybyA9IDFFLTI5OSA7IAotICBpZiggZGlzdG9ydGlvblR5cGUmMSApCi0gICAgewotICAgICAgdG90YWwgKj0gcHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2VfMShhbCx2ZXJiKTsKLSAgICB9Ci0gIGlmKCBkaXN0b3J0aW9uVHlwZSYyICkKLSAgICB7Ci0gICAgICBmb3IoV29yZEluZGV4IGo9MTtqPD1tO2orKykKLQlpZiggYWwoaikgKQotCSAgaWYoIGFsLmdldF9oZWFkKGFsKGopKT09aikKLQkgICAgewotCSAgICAgIGludCBlcD1hbC5wcmV2X2NlcHQoYWwoaikpOwotCSAgICAgIGZsb2F0IHgyPXByb2JGaXJzdFtlcF0oaixhbC5nZXRfY2VudGVyKGVwKSk7Ci0JICAgICAgbWFzc2VydCh4Mjw9MS4wKTsKLQkgICAgICB0b3RhbCo9eDI7Ci0JICAgICAgaWYoIHZlcmIpIGNlcnIgPDwgIklCTS00OiBkPTEgb2YgIiA8PCBqIDw8ICI6ICIgPDwgeDIgIDw8ICIgLT4gIiA8PCB0b3RhbCA8PCBlbmRsOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmbG9hdCB4Mj1wcm9iU2Vjb25kKGosYWwucHJldl9pbl9jZXB0KGopKTsKLQkgICAgICBtYXNzZXJ0KHgyPD0xLjApOwotCSAgICAgIHRvdGFsKj14MjsKLQkgICAgICBpZiggdmVyYikgY2VyciA8PCAiSUJNLTQ6IGQ+MSBvZiAiIDw8IGogPDwgIjogIiA8PCB4MiAgPDwgIiAtPiAiIDw8IHRvdGFsIDw8IGVuZGw7Ci0JICAgIH0KLSAgICB9Ci0gIHJldHVybiB0b3RhbD90b3RhbDphbG1vc3RaZXJvOwotfQotCi12b2lkIHRyYW5zcGFpcl9tb2RlbDQ6OmNvbXB1dGVTY29yZXMoY29uc3QgYWxpZ25tZW50JmFsLHZlY3Rvcjxkb3VibGU+JmQpY29uc3QKLXsKLSAgTG9nUHJvYiB0b3RhbDEgPSAxLjAsdG90YWwyPTEuMCx0b3RhbDM9MS4wLHRvdGFsND0xLjAgOwotICB0b3RhbDEgKj0gcG93KGRvdWJsZSgxLXAxKSwgbS0yLjAgKiBhbC5mZXJ0KDApKSAqIHBvdyhkb3VibGUocDEpLCBkb3VibGUoYWwuZmVydCgwKSkpOwotICBmb3IgKFdvcmRJbmRleCBpID0gMSA7IGkgPD0gYWwuZmVydCgwKSA7IGkrKykKLSAgICB0b3RhbDEgKj0gZG91YmxlKG0gLSBhbC5mZXJ0KDApIC0gaSArIDEpIC8gKGRvdWJsZShEZWZpY2llbnREaXN0b3J0aW9uRm9yRW1wdHlXb3JkPyhtYXgoMixpbnQobSkpL0RlZmljaWVudERpc3RvcnRpb25Gb3JFbXB0eVdvcmQpOmkpKSA7Ci0gIGZvciAoV29yZEluZGV4IGkgPSAxIDsgaSA8PSBsIDsgaSsrKQotICAgIHRvdGFsMiAqPSBnZXRfZmVydGlsaXR5KGksIGFsLmZlcnQoaSkpOy8vICogKExvZ1Byb2IpIGZhY3RvcmlhbChhbC5mZXJ0KGkpKTsKLSAgZm9yIChXb3JkSW5kZXggaiA9IDEgOyBqIDw9IG0gOyBqKyspCi0gICAgdG90YWwzKj0gZ2V0X3QoYWwoaiksIGopIDsKLSAgZm9yKFdvcmRJbmRleCBqPTE7ajw9bTtqKyspCi0gICAgaWYoIGFsKGopICkKLSAgICAgIGlmKCBhbC5nZXRfaGVhZChhbChqKSk9PWopCi0JewotCSAgaW50IGVwPWFsLnByZXZfY2VwdChhbChqKSk7Ci0JICBmbG9hdCB4Mj1wcm9iRmlyc3RbZXBdKGosYWwuZ2V0X2NlbnRlcihlcCkpOwotCSAgdG90YWw0Kj14MjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZmxvYXQgeDI9cHJvYlNlY29uZChqLGFsLnByZXZfaW5fY2VwdChqKSk7Ci0JICB0b3RhbDQqPXgyOwotCX0KLSAgZC5wdXNoX2JhY2sodG90YWwxKTsvLzkKLSAgZC5wdXNoX2JhY2sodG90YWwyKTsvLzEwCi0gIGQucHVzaF9iYWNrKHRvdGFsMyk7Ly8xMQotICBkLnB1c2hfYmFjayh0b3RhbDQpOy8vMTIKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDQuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlMTg1My4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy90cmFuc3BhaXJfbW9kZWw0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdJWkErKyAoIGV4dGVuc2lvbiBvZiBHSVpBICkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpZm5kZWYgdHJhbnNwYWlyX21vZGVsNF9oX2Zqb19kZWZpbmVkCi0jZGVmaW5lIHRyYW5zcGFpcl9tb2RlbDRfaF9mam9fZGVmaW5lZAotI2luY2x1ZGUgIkFycmF5Mi5oIgotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJWZWN0b3IuaCIKLSNpbmNsdWRlICJOVGFibGVzLmgiCi0jaW5jbHVkZSAiQVRhYmxlcy5oIgotI2luY2x1ZGUgIlRUYWJsZXMuaCIKLSNpbmNsdWRlICJhbGlnbm1lbnQuaCIKLSNpbmNsdWRlICJENFRhYmxlcy5oIgotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDMuaCIKLQotZXh0ZXJuIGRvdWJsZSBmYWN0b3JpYWwoaW50IG4pOwotCi1jbGFzcyB0cmFuc3BhaXJfbW9kZWw0IDogcHVibGljIHRyYW5zcGFpcl9tb2RlbDMKLXsKLSBwcml2YXRlOgotICBkNG1vZGVsJmQ0bTsKLSAgQXJyYXkyPGRvdWJsZT4gcHJvYlNlY29uZDsKLSAgVmVjdG9yPEFycmF5Mjxkb3VibGU+ID4gcHJvYkZpcnN0OwotIHB1YmxpYzoKLSAgdHlwZWRlZiB0cmFuc3BhaXJfbW9kZWwzIHNpbXBsZXJfdHJhbnNwYWlyX21vZGVsOwotICB0cmFuc3BhaXJfbW9kZWw0KGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JmVzLCBjb25zdCBWZWN0b3I8V29yZEluZGV4PiZmcywgdG1vZGVsPENPVU5ULCBQUk9CPiZ0VGFibGUsIGFtb2RlbDxQUk9CPiZhVGFibGUsIGFtb2RlbDxQUk9CPiZkVGFibGUsIG5tb2RlbDxQUk9CPiZuVGFibGUsIGRvdWJsZSBfcDEsIGRvdWJsZSBfcDAsZDRtb2RlbCpfZDRtKSAKLSAgICA6IHRyYW5zcGFpcl9tb2RlbDMoZXMsIGZzLCB0VGFibGUsIGFUYWJsZSwgZFRhYmxlLCBuVGFibGUsIF9wMSwgX3AwKSwgCi0gICAgZDRtKCpfZDRtKSxwcm9iU2Vjb25kKG0rMSxtKzEsMC4wKSxwcm9iRmlyc3QobCsxKQotICAgIHsKLSAgICAgIGZvcih1bnNpZ25lZCBpbnQgajE9MTtqMTw9bTsrK2oxKQotCWZvcih1bnNpZ25lZCBpbnQgajI9MTtqMjxqMTsrK2oyKQotCSAgewotCSAgICBwcm9iU2Vjb25kKGoxLGoyKT1kNG0uZ2V0UHJvYl9iaWdnZXIoajEsajIsMCxkNG0uZndvcmRjbGFzc2VzLT5nZXRDbGFzcyhnZXRfZnMoajEpKSxsLG0pOwotCSAgfQotICAgICAgZm9yKHVuc2lnbmVkIGludCBpPTA7aTw9bDsrK2kpCi0JewotCSAgQXJyYXkyPGRvdWJsZT4gJnBmPXByb2JGaXJzdFtpXT1BcnJheTI8ZG91YmxlPihtKzEsbSsxLDAuMCk7Ci0JICBmb3IodW5zaWduZWQgaW50IGoxPTE7ajE8PW07KytqMSkKLQkgICAgewotCSAgICAgIG1hcDxtNF9rZXksZDRtb2RlbDo6VnBmZixjb21wYXJlMSA+Ojpjb25zdF9pdGVyYXRvciBjaT1kNG0uZ2V0UHJvYl9maXJzdF9pdGVyYXRvcihkNG0uZXdvcmRjbGFzc2VzLT5nZXRDbGFzcyhnZXRfZXMoaSkpLGQ0bS5md29yZGNsYXNzZXMtPmdldENsYXNzKGdldF9mcyhqMSkpLGwsbSk7Ci0JICAgICAgZm9yKHVuc2lnbmVkIGludCBqMj0wO2oyPD1tOysrajIpCi0JCXsKLQkJICBwZihqMSxqMik9ZDRtLmdldFByb2JfZmlyc3Rfd2l0aGl0ZXJhdG9yKGoxLGoyLG0sY2kpOwotCQkgIG1hc3NlcnQocGYoajEsajIpPT1kNG0uZ2V0UHJvYl9maXJzdChqMSxqMixkNG0uZXdvcmRjbGFzc2VzLT5nZXRDbGFzcyhnZXRfZXMoaSkpLGQ0bS5md29yZGNsYXNzZXMtPmdldENsYXNzKGdldF9mcyhqMSkpLGwsbSkpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBMb2dQcm9iIHByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlXzEoY29uc3QgYWxpZ25tZW50JmFsLGJvb2wgdmVyYiljb25zdDsKLSAgTG9nUHJvYiBzY29yZU9mQWxpZ25tZW50Rm9yQ2hhbmdlKGNvbnN0IGFsaWdubWVudCZhKWNvbnN0Ci0gICAge3JldHVybiBwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShhLDIpOyB9ICAKLSAgTG9nUHJvYiBzY29yZU9mTW92ZShjb25zdCBhbGlnbm1lbnQmYSwgV29yZEluZGV4IG5ld19pLCBXb3JkSW5kZXggaixkb3VibGUgdGhpc1ZhbHVlPS0xLjApY29uc3Q7Ci0gIExvZ1Byb2Igc2NvcmVPZlN3YXAoY29uc3QgYWxpZ25tZW50JmEsIFdvcmRJbmRleCBqMSwgV29yZEluZGV4IGoyLGRvdWJsZSB0aGlzVmFsdWU9LTEuMCljb25zdCA7Ci0gIExvZ1Byb2IgX3Njb3JlT2ZNb3ZlKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggbmV3X2ksIFdvcmRJbmRleCBqLGRvdWJsZSB0aGlzVmFsdWU9LTEuMCljb25zdDsKLSAgTG9nUHJvYiBfc2NvcmVPZlN3YXAoY29uc3QgYWxpZ25tZW50JmEsIFdvcmRJbmRleCBqMSwgV29yZEluZGV4IGoyLGRvdWJsZSB0aGlzVmFsdWU9LTEuMCljb25zdCA7Ci0gIGludCBtb2RlbG5yKCljb25zdHtyZXR1cm4gNDt9Ci0gIExvZ1Byb2IgcHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoY29uc3QgYWxpZ25tZW50JmFsLCBzaG9ydCBkaXN0b3J0aW9uVHlwZT0zLGJvb2wgdmVyYj0wKWNvbnN0OwotICB2b2lkIGNvbXB1dGVTY29yZXMoY29uc3QgYWxpZ25tZW50JmFsLHZlY3Rvcjxkb3VibGU+JmQpY29uc3Q7Ci19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy90cmFuc3BhaXJfbW9kZWw1LmNwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjIxMjA2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2ggKFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0laQSsrICggZXh0ZW5zaW9uIG9mIEdJWkEgKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDUuaCIKLSNpbmNsdWRlICJQYXJhbWV0ZXIuaCIKLQotaW50IG01c2NvcmVmb3VuZD0wLG01c2NvcmVub3Rmb3VuZD0wOwotCi1HTE9CQUxfUEFSQU1FVEVSKGZsb2F0LGQ1bW9kZWxzbW9vdGhfZmFjdG9yLCJtb2RlbDVTbW9vdGhGYWN0b3IiLCJzbW9vdGluZyBwYXJhbWV0ZXIgZm9yIGRpc3RvcnRpb24gcHJvYmFiaWxpdGllcyBpbiBNb2RlbCA1IChsaW5lYXIgaW50ZXJwb2xhdGlvbiB3aXRoIGNvbnN0YW50KSIsUEFSTEVWX1NNT09USCwwLjEpOwotZmxvYXQgZDVtb2RlbHNtb290aF9jb3VudG9mZnNldD0wLjA7Ci0KLUxvZ1Byb2IgdHJhbnNwYWlyX21vZGVsNTo6X3Njb3JlT2ZNb3ZlKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggbmV3X2ksIFdvcmRJbmRleCBqLGRvdWJsZSljb25zdAotewotICBpZiggZG9Nb2RlbDRTY29yaW5nICkKLSAgICByZXR1cm4gdHJhbnNwYWlyX21vZGVsNDo6X3Njb3JlT2ZNb3ZlKGEsbmV3X2ksaik7Ci0gIGFsaWdubWVudCBiKGEpOwotICBiLnNldChqLCBuZXdfaSk7Ci0gIExvZ1Byb2IgYV9wcm9iPXByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKGEpOwotICBMb2dQcm9iIGJfcHJvYj1wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShiKTsKLSAgaWYoIGFfcHJvYiApCi0gICAgcmV0dXJuIGJfcHJvYi9hX3Byb2I7Ci0gIGVsc2UgaWYoIGJfcHJvYiApCi0gICAgcmV0dXJuIDFlMjA7Ci0gIGVsc2UKLSAgICByZXR1cm4gMS4wOwotfQotTG9nUHJvYiB0cmFuc3BhaXJfbW9kZWw1Ojpfc2NvcmVPZlN3YXAoY29uc3QgYWxpZ25tZW50JmEsIFdvcmRJbmRleCBqMSwgV29yZEluZGV4IGoyLGRvdWJsZSB0aGlzVmFsdWUpY29uc3QgCi17Ci0gIGlmKCBkb01vZGVsNFNjb3JpbmcgKQotICAgIHJldHVybiB0cmFuc3BhaXJfbW9kZWw0Ojpfc2NvcmVPZlN3YXAoYSxqMSxqMix0aGlzVmFsdWUpOwotICBhbGlnbm1lbnQgYihhKTsKLSAgYi5zZXQoajEsIGEoajIpKTsKLSAgYi5zZXQoajIsIGEoajEpKTsKLSAgTG9nUHJvYiBhX3Byb2I9cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYSk7Ci0gIExvZ1Byb2IgYl9wcm9iPXByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKGIpOwotICBhc3NlcnQoYV9wcm9iKTsKLSAgYXNzZXJ0KGJfcHJvYik7Ci0gIGlmKCBhX3Byb2IgKQotICAgIHJldHVybiBiX3Byb2IvYV9wcm9iOwotICBlbHNlIGlmKCBiX3Byb2IgKQotICAgIHJldHVybiAxZTIwOwotICBlbHNlCi0gICAgcmV0dXJuIDEuMDsKLX0KLQotLy9pbmNyZWFzaW5nIGVmZmljaWVuY3k6IG5vIGNvcHkgb2YgYWxpZ25tZW50IChjYWxjLiBldmVyeXRoaW5nIGluY3JlbWVudGFsbHkpCi1Mb2dQcm9iIHRyYW5zcGFpcl9tb2RlbDU6OnNjb3JlT2ZNb3ZlKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggbmV3X2ksIFdvcmRJbmRleCBqLGRvdWJsZSB0aGlzVmFsdWUpY29uc3QKLXsKLSAgaWYoIGRvTW9kZWw0U2NvcmluZyApCi0gICAgcmV0dXJuIHRyYW5zcGFpcl9tb2RlbDQ6OnNjb3JlT2ZNb3ZlKGEsbmV3X2ksaix0aGlzVmFsdWUpOwotICBhbGlnbm1lbnQgYihhKTsKLSAgYi5zZXQoaixuZXdfaSk7Ci0gIAotICBMb2dQcm9iIGNoYW5nZTsKLSAgY29uc3QgV29yZEluZGV4IG9sZF9pPWEoaik7Ci0gIFdvcmRJbmRleCBmMD1hLmZlcnQoMCk7Ci0gIGlmIChvbGRfaSA9PSBuZXdfaSkKLSAgICBjaGFuZ2U9MS4wOwotICBlbHNlIGlmIChvbGRfaSA9PSAwKQotICAgIGNoYW5nZT0oKGRvdWJsZSlwMCpwMC9wMSkgKgotICAgICAgKChmMCoobS1mMCsxLjApKSAvICgobS0yKmYwKzEpKihtLTIqZjArMi4wKSkpICoKLSAgICAgICgoUFJPQikoMS4wKSkgKgotICAgICAgKGdldF9mZXJ0aWxpdHkobmV3X2ksIGEuZmVydChuZXdfaSkrMSkgLyBnZXRfZmVydGlsaXR5KG5ld19pLCBhLmZlcnQobmV3X2kpKSkqCi0gICAgICAodChuZXdfaSwgaikvdChvbGRfaSwgaikpKgotICAgICAgMS4wOwotICBlbHNlIGlmIChuZXdfaSA9PSAwKQotICAgIGNoYW5nZT0oZG91YmxlKHAxKSAvIChwMCpwMCkpICoKLSAgICAgIChkb3VibGUoKG0tMipmMCkqKG0tMipmMC0xKSkvKCgxK2YwKSoobS1mMCkpKSAqCi0gICAgICAoMS4wKSAqCi0gICAgICAoZ2V0X2ZlcnRpbGl0eShvbGRfaSwgYS5mZXJ0KG9sZF9pKS0xKSAvZ2V0X2ZlcnRpbGl0eShvbGRfaSwgYS5mZXJ0KG9sZF9pKSkpKgotICAgICAgKHQobmV3X2ksIGopIC90KG9sZF9pLCBqKSkgKgotICAgICAgKDEuMCk7Ci0gIGVsc2UKLSAgICBjaGFuZ2U9KDEuMCkgKgotICAgICAgKGdldF9mZXJ0aWxpdHkob2xkX2ksYS5mZXJ0KG9sZF9pKS0xKSAvIGdldF9mZXJ0aWxpdHkob2xkX2ksYS5mZXJ0KG9sZF9pKSkpICoKLSAgICAgIChnZXRfZmVydGlsaXR5KG5ld19pLGEuZmVydChuZXdfaSkrMSkgL2dldF9mZXJ0aWxpdHkobmV3X2ksYS5mZXJ0KG5ld19pKSkpICoKLSAgICAgICh0KG5ld19pLGopL3Qob2xkX2ksaikpICoKLSAgICAgICgxLjApOwotICBMb2dQcm9iIGFfcHJvYj10aGlzVmFsdWU7Ci0gIGlmKCBhX3Byb2I8MC4wICkKLSAgICBhX3Byb2I9cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYSwyKTsKLSAgbWFzc2VydChhX3Byb2I9PXByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKGEsMikpOwotICAKLSAgTG9nUHJvYiBiX3Byb2I9cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYiwyKTsKLSAgY2hhbmdlKj1iX3Byb2IvYV9wcm9iOwotICByZXR1cm4gY2hhbmdlOwotfQotTG9nUHJvYiB0cmFuc3BhaXJfbW9kZWw1OjpzY29yZU9mU3dhcChjb25zdCBhbGlnbm1lbnQmYSwgV29yZEluZGV4IGoxLCBXb3JkSW5kZXggajIsZG91YmxlIHRoaXNWYWx1ZSljb25zdCAKLXsKLSAgaWYoIGRvTW9kZWw0U2NvcmluZyApCi0gICAgcmV0dXJuIHRyYW5zcGFpcl9tb2RlbDQ6OnNjb3JlT2ZTd2FwKGEsajEsajIsdGhpc1ZhbHVlKTsKLSAgYWxpZ25tZW50IGIoYSk7Ci0gIGIuc2V0KGoxLGEoajIpKTsKLSAgYi5zZXQoajIsYShqMSkpOwotICBMb2dQcm9iIGNoYW5nZT10cmFuc3BhaXJfbW9kZWwzOjpzY29yZU9mU3dhcChhLGoxLGoyLC0xLjAsMCk7Ci0gIExvZ1Byb2IgYV9wcm9iPXRoaXNWYWx1ZTsKLSAgaWYoIGFfcHJvYjwwLjAgKQotICAgIGFfcHJvYj1wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShhLDIpOwotICBtYXNzZXJ0KGFfcHJvYj09cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYSwyKSk7Ci0gIExvZ1Byb2IgYl9wcm9iPXByb2Jfb2ZfdGFyZ2V0X2FuZF9hbGlnbm1lbnRfZ2l2ZW5fc291cmNlKGIsMik7Ci0gIGNoYW5nZSo9Yl9wcm9iL2FfcHJvYjsKLSAgcmV0dXJuIGNoYW5nZTsKLX0KLQotTG9nUHJvYiB0cmFuc3BhaXJfbW9kZWw1Ojpwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShjb25zdCBhbGlnbm1lbnQmYWwsIHNob3J0IGRpc3RvcnRpb25UeXBlLGJvb2wgdmVyYiljb25zdAotewotICBpZiggZG9Nb2RlbDRTY29yaW5nICkKLSAgICByZXR1cm4gdHJhbnNwYWlyX21vZGVsNDo6cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYWwsZGlzdG9ydGlvblR5cGUpOwotICBMb2dQcm9iIHRvdGFsID0gMS4wIDsKLSAgc3RhdGljIGNvbnN0IExvZ1Byb2IgYWxtb3N0WmVybyA9IDFFLTI5OSA7IAotICBkb3VibGUgeDI7Ci0gIGlmKCBkaXN0b3J0aW9uVHlwZSYxICkKLSAgICB7Ci0gICAgICB0b3RhbCAqPSBwb3coZG91YmxlKDEtcDEpLCBtLTIuMCAqIGFsLmZlcnQoMCkpICogcG93KGRvdWJsZShwMSksIGRvdWJsZShhbC5mZXJ0KDApKSk7Ci0gICAgICBpZiggdmVyYikgY2VyciA8PCAiSUJNLTU6ICgxLXAxKV4obS0yIGYwKSpwMV5mMDogIiA8PCB0b3RhbCA8PCBlbmRsOwotICAgICAgZm9yIChXb3JkSW5kZXggaSA9IDEgOyBpIDw9IGFsLmZlcnQoMCkgOyBpKyspCi0JdG90YWwgKj0gZG91YmxlKG0gLSBhbC5mZXJ0KDApIC0gaSArIDEpIC8gaSA7IC8vIElCTS01IGlzIG5vdCBkZWZpY2llbnQhCi0gICAgICBpZiggdmVyYikgY2VyciA8PCAiSUJNLTU6ICtOVUxMOmJpbm9taWFsK2Rpc3RvcnRpb24gIiA8PCB0b3RhbCA8PCBlbmRsOwotICAgICAgZm9yIChXb3JkSW5kZXggaSA9IDEgOyBpIDw9IGwgOyBpKyspCi0JewotCSAgdG90YWwgKj0gZ2V0X2ZlcnRpbGl0eShpLCBhbC5mZXJ0KGkpKTsKLQkgIGlmKCB2ZXJiKSBjZXJyIDw8ICJJQk0tNTogZmVydGlsaXR5IG9mICIgPDwgaSA8PCAiICIgPDwgZ2V0X2ZlcnRpbGl0eShpLCBhbC5mZXJ0KGkpKSA8PCAiIC0+ICIgPDwgdG90YWwgPDwgZW5kbDsKLQl9Ci0gICAgICBmb3IgKFdvcmRJbmRleCBqID0gMSA7IGogPD0gbSA7IGorKykKLQl7Ci0JICB0b3RhbCo9IGdldF90KGFsKGopLCBqKSA7Ci0JICBpZiggdmVyYikgY2VyciA8PCAiSUJNLTU6IHQgb2YgajoiIDw8IGogPDwgIiBpOiIgPDwgYWwoaikgPDwgIjogIiA8PCBnZXRfdChhbChqKSwgaikgIDw8ICIgLT4gIiA8PCB0b3RhbCA8PCBlbmRsOwotCX0KLSAgICB9Ci0gIGlmKCBkaXN0b3J0aW9uVHlwZSYyICkKLSAgICB7Ci0gICAgICBQb3NpdGlvbkluZGV4IHByZXZfY2VwdD0wOwotICAgICAgUG9zaXRpb25JbmRleCB2YWNfYWxsPW07Ci0gICAgICBWZWN0b3I8Y2hhcj4gdmFjKG0rMSwwKTsKLSAgICAgIGZvcihXb3JkSW5kZXggaT0xO2k8PWw7aSsrKQotCXsKLQkgIFBvc2l0aW9uSW5kZXggY3VyX2o9YWwuYWxzX2lbaV07IAotCSAgUG9zaXRpb25JbmRleCBwcmV2X2o9MDsKLQkgIFBvc2l0aW9uSW5kZXggaz0wOwotCSAgaWYoY3VyX2opIHsgLy8gcHJvY2VzcyBmaXJzdCB3b3JkIG9mIGNlcHQKLQkgICAgaysrOwotCSAgICAvLyBwcmV2aW91cyBwb3NpdGlvbgotCSAgICB0b3RhbCo9ICh4Mj1kNW0uZ2V0UHJvYl9maXJzdCh2YWNhbmNpZXModmFjLGN1cl9qKSx2YWNhbmNpZXModmFjLGFsLmdldF9jZW50ZXIocHJldl9jZXB0KSksZDVtLmZ3b3JkY2xhc3Nlcy0+Z2V0Q2xhc3MoZ2V0X2ZzKGN1cl9qKSksbCxtLHZhY19hbGwtYWwuZmVydChpKStrKSk7Ci0JICAgIAotCSAgICB2YWNfYWxsLS07Ci0JICAgIGFzc2VydCh2YWNbY3VyX2pdPT0wKTsKLQkgICAgdmFjW2N1cl9qXT0xOwotCSAgICAKLQkgICAgaWYoIHZlcmIpIGNlcnIgPDwgIklCTS01OiBkPTEgb2YgIiA8PCBjdXJfaiA8PCAiOiAiIDw8IHgyICA8PCAiIC0+ICIgPDwgdG90YWwgPDwgZW5kbDsKLQkgICAgcHJldl9qPWN1cl9qOwotCSAgICBjdXJfaj1hbC5hbHNfaltjdXJfal0ubmV4dDsKLQkgIH0KLQkgIHdoaWxlKGN1cl9qKSB7IC8vIHByb2Nlc3MgZm9sbG93aW5nIHdvcmRzIG9mIGNlcHQKLQkgICAgaysrOwotCSAgICAvLyBwcmV2aW91cyBwb3NpdGlvbgotCSAgICBpbnQgdnByZXY9dmFjYW5jaWVzKHZhYyxwcmV2X2opOwotCSAgICB0b3RhbCo9ICh4Mj1kNW0uZ2V0UHJvYl9iaWdnZXIodmFjYW5jaWVzKHZhYyxjdXJfaiksdnByZXYsZDVtLmZ3b3JkY2xhc3Nlcy0+Z2V0Q2xhc3MoZ2V0X2ZzKGN1cl9qKSksbCxtLHZhY19hbGwtdnByZXYvKndhciB3ZWcqLy1hbC5mZXJ0KGkpK2spKTsKLQkgICAgCi0JICAgIAotCSAgICB2YWNfYWxsLS07Ci0JICAgIHZhY1tjdXJfal09MTsKLQkgICAgCi0JICAgIAotCSAgICBpZiggdmVyYikgY2VyciA8PCAiSUJNLTU6IGQ+MSBvZiAiIDw8IGN1cl9qIDw8ICI6ICIgPDwgeDIgIDw8ICIgLT4gIiA8PCB0b3RhbCA8PCBlbmRsOwotCSAgICBwcmV2X2o9Y3VyX2o7Ci0JICAgIGN1cl9qPWFsLmFsc19qW2N1cl9qXS5uZXh0OwotCSAgfQotCSAgYXNzZXJ0KGs9PWFsLmZlcnQoaSkpOwotCSAgaWYoIGsgKQotCSAgICBwcmV2X2NlcHQ9aTsKLQl9Ci0gICAgICBhc3NlcnQodmFjX2FsbD09YWwuZmVydCgwKSk7Ci0gICAgfQotICB0b3RhbCA9IHRvdGFsP3RvdGFsOmFsbW9zdFplcm87Ci0gIHJldHVybiB0b3RhbDsKLX0KLQotCi12b2lkIHRyYW5zcGFpcl9tb2RlbDU6OmNvbXB1dGVTY29yZXMoY29uc3QgYWxpZ25tZW50JmFsLHZlY3Rvcjxkb3VibGU+JmQpY29uc3QKLXsKLSAgTG9nUHJvYiB0b3RhbDEgPSAxLjAsdG90YWwyPTEuMCx0b3RhbDM9MS4wLHRvdGFsND0xLjAgOwotICB0b3RhbDEgKj0gcG93KGRvdWJsZSgxLXAxKSwgbS0yLjAgKiBhbC5mZXJ0KDApKSAqIHBvdyhkb3VibGUocDEpLCBkb3VibGUoYWwuZmVydCgwKSkpOwotICBmb3IgKFdvcmRJbmRleCBpID0gMSA7IGkgPD0gYWwuZmVydCgwKSA7IGkrKykKLSAgICB0b3RhbDEgKj0gZG91YmxlKG0gLSBhbC5mZXJ0KDApIC0gaSArIDEpIC8gaSA7IC8vIElCTS01IGlzIG5vdCBkZWZpY2llbnQhCi0gIGZvciAoV29yZEluZGV4IGkgPSAxIDsgaSA8PSBsIDsgaSsrKQotICAgIHRvdGFsMiAqPSBnZXRfZmVydGlsaXR5KGksIGFsLmZlcnQoaSkpOwotICBmb3IgKFdvcmRJbmRleCBqID0gMSA7IGogPD0gbSA7IGorKykKLSAgICB0b3RhbDMqPSBnZXRfdChhbChqKSwgaikgOwotICBQb3NpdGlvbkluZGV4IHByZXZfY2VwdD0wOwotICBQb3NpdGlvbkluZGV4IHZhY19hbGw9bTsKLSAgVmVjdG9yPGNoYXI+IHZhYyhtKzEsMCk7Ci0gIGZvcihXb3JkSW5kZXggaT0xO2k8PWw7aSsrKQotICAgIHsKLSAgICAgIFBvc2l0aW9uSW5kZXggY3VyX2o9YWwuYWxzX2lbaV07IAotICAgICAgUG9zaXRpb25JbmRleCBwcmV2X2o9MDsKLSAgICAgIFBvc2l0aW9uSW5kZXggaz0wOwotICAgICAgaWYoY3VyX2opIHsgLy8gcHJvY2VzcyBmaXJzdCB3b3JkIG9mIGNlcHQKLQlrKys7Ci0JdG90YWw0Kj1kNW0uZ2V0UHJvYl9maXJzdCh2YWNhbmNpZXModmFjLGN1cl9qKSx2YWNhbmNpZXModmFjLGFsLmdldF9jZW50ZXIocHJldl9jZXB0KSksZDVtLmZ3b3JkY2xhc3Nlcy0+Z2V0Q2xhc3MoZ2V0X2ZzKGN1cl9qKSksbCxtLHZhY19hbGwtYWwuZmVydChpKStrKTsKLQl2YWNfYWxsLS07Ci0JYXNzZXJ0KHZhY1tjdXJfal09PTApOwotCXZhY1tjdXJfal09MTsKLQlwcmV2X2o9Y3VyX2o7Ci0JY3VyX2o9YWwuYWxzX2pbY3VyX2pdLm5leHQ7Ci0gICAgICB9Ci0gICAgICB3aGlsZShjdXJfaikgeyAvLyBwcm9jZXNzIGZvbGxvd2luZyB3b3JkcyBvZiBjZXB0Ci0JaysrOwotCWludCB2cHJldj12YWNhbmNpZXModmFjLHByZXZfaik7Ci0JdG90YWw0Kj1kNW0uZ2V0UHJvYl9iaWdnZXIodmFjYW5jaWVzKHZhYyxjdXJfaiksdnByZXYsZDVtLmZ3b3JkY2xhc3Nlcy0+Z2V0Q2xhc3MoZ2V0X2ZzKGN1cl9qKSksbCxtLHZhY19hbGwtdnByZXYvKndhciB3ZWcqLy1hbC5mZXJ0KGkpK2spOwotCXZhY19hbGwtLTsKLQl2YWNbY3VyX2pdPTE7Ci0JcHJldl9qPWN1cl9qOwotCWN1cl9qPWFsLmFsc19qW2N1cl9qXS5uZXh0OwotICAgICAgfQotICAgICAgYXNzZXJ0KGs9PWFsLmZlcnQoaSkpOwotICAgICAgaWYoIGsgKQotCXByZXZfY2VwdD1pOwotICAgIH0KLSAgYXNzZXJ0KHZhY19hbGw9PWFsLmZlcnQoMCkpOwotICBkLnB1c2hfYmFjayh0b3RhbDEpOy8vMTMKLSAgZC5wdXNoX2JhY2sodG90YWwyKTsvLzE0Ci0gIGQucHVzaF9iYWNrKHRvdGFsMyk7Ly8xNQotICBkLnB1c2hfYmFjayh0b3RhbDQpOy8vMTYKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDUuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjZjQ5ZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy90cmFuc3BhaXJfbW9kZWw1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoIChSV1RIIEFhY2hlbiAtIExlaHJzdHVobCBmdWVyIEluZm9ybWF0aWsgVkkpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdJWkErKyAoIGV4dGVuc2lvbiBvZiBHSVpBICkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpZm5kZWYgdHJhbnNwYWlyX21vZGVsNV9oX2Zqb19kZWZpbmVkCi0jZGVmaW5lIHRyYW5zcGFpcl9tb2RlbDVfaF9mam9fZGVmaW5lZAotI2luY2x1ZGUgIkFycmF5Mi5oIgotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJWZWN0b3IuaCIKLSNpbmNsdWRlICJOVGFibGVzLmgiCi0jaW5jbHVkZSAiQVRhYmxlcy5oIgotI2luY2x1ZGUgIlRUYWJsZXMuaCIKLSNpbmNsdWRlICJhbGlnbm1lbnQuaCIKLSNpbmNsdWRlICJENVRhYmxlcy5oIgotI2luY2x1ZGUgInRyYW5zcGFpcl9tb2RlbDQuaCIKLQotZXh0ZXJuIGRvdWJsZSBmYWN0b3JpYWwoaW50IG4pOwotCi1pbmxpbmUgaW50IHZhY2FuY2llcyhjb25zdCBWZWN0b3I8Y2hhcj4mdmFjLGludCB1KQotewotICBpbnQgbj0wOwotICBjb25zdCBjaGFyICppPSYodmFjWzBdKSsxOwotICBjb25zdCBjaGFyICplbmQ9Jih2YWNbMF0pK3UrMTsKLSAgd2hpbGUoaTxlbmQpCi0gICAgbis9ICgoKmkrKyk9PTApOwotICByZXR1cm4gbjsKLX0KLQotY2xhc3MgdHJhbnNwYWlyX21vZGVsNSA6IHB1YmxpYyB0cmFuc3BhaXJfbW9kZWw0Ci17Ci0gcHJpdmF0ZToKLSAgY29uc3QgZDVtb2RlbCZkNW07Ci0gIGJvb2wgZG9Nb2RlbDRTY29yaW5nOwotIHB1YmxpYzoKLSAgdHlwZWRlZiB0cmFuc3BhaXJfbW9kZWwzIHNpbXBsZXJfdHJhbnNwYWlyX21vZGVsOwotICBtdXRhYmxlIG1hcDxWZWN0b3I8UG9zaXRpb25JbmRleD4sTG9nUHJvYj4gc2NvcmVzWzRdOwotICB0cmFuc3BhaXJfbW9kZWw1KGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JmVzLCBjb25zdCBWZWN0b3I8V29yZEluZGV4PiZmcywgdG1vZGVsPENPVU5ULCBQUk9CPiZ0VGFibGUsIAotCQkgICBhbW9kZWw8UFJPQj4mYVRhYmxlLCBhbW9kZWw8UFJPQj4mZFRhYmxlLCBubW9kZWw8UFJPQj4mblRhYmxlLCBkb3VibGUgX3AxLCBkb3VibGUgX3AwLCAKLQkJICAgY29uc3QgZDVtb2RlbCpfZDVtKSAKLSAgICA6IHRyYW5zcGFpcl9tb2RlbDQoZXMsIGZzLCB0VGFibGUsIGFUYWJsZSwgZFRhYmxlLCBuVGFibGUsIF9wMSwgX3AwLCZfZDVtLT5kNG0pLGQ1bSgqX2Q1bSksZG9Nb2RlbDRTY29yaW5nKDApIHt9Ci0gIExvZ1Byb2Igc2NvcmVPZkFsaWdubWVudEZvckNoYW5nZShjb25zdCBhbGlnbm1lbnQmYSljb25zdAotICAgIHsKLSAgICAgIGlmKCBkb01vZGVsNFNjb3JpbmcgKQotCXJldHVybiB0cmFuc3BhaXJfbW9kZWw0Ojpwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShhLDIpOyAKLSAgICAgIGVsc2UKLQlyZXR1cm4gcHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYSwyKTsgCi0gICAgfQotICBMb2dQcm9iIHNjb3JlT2ZNb3ZlKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggbmV3X2ksIFdvcmRJbmRleCBqLGRvdWJsZSB0aGlzVmFsdWU9LTEuMCljb25zdDsKLSAgTG9nUHJvYiBzY29yZU9mU3dhcChjb25zdCBhbGlnbm1lbnQmYSwgV29yZEluZGV4IGoxLCBXb3JkSW5kZXggajIsZG91YmxlIHRoaXNWYWx1ZT0tMS4wKWNvbnN0IDsKLSAgTG9nUHJvYiBfc2NvcmVPZk1vdmUoY29uc3QgYWxpZ25tZW50JmEsIFdvcmRJbmRleCBuZXdfaSwgV29yZEluZGV4IGosZG91YmxlIHRoaXNWYWx1ZT0tMS4wKWNvbnN0OwotICBMb2dQcm9iIF9zY29yZU9mU3dhcChjb25zdCBhbGlnbm1lbnQmYSwgV29yZEluZGV4IGoxLCBXb3JkSW5kZXggajIsZG91YmxlIHRoaXNWYWx1ZT0tMS4wKWNvbnN0IDsKLSAgaW50IG1vZGVsbnIoKWNvbnN0e3JldHVybiA1O30KLSAgTG9nUHJvYiBwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShjb25zdCBhbGlnbm1lbnQmYWwsIHNob3J0IGRpc3RvcnRpb25UeXBlPTMsYm9vbCB2ZXJiPTApY29uc3Q7Ci0gIHZvaWQgY29tcHV0ZVNjb3Jlcyhjb25zdCBhbGlnbm1lbnQmYWwsdmVjdG9yPGRvdWJsZT4mZCljb25zdDsKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3RyYW5zcGFpcl9tb2RlbGhtbS5oIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvdHJhbnNwYWlyX21vZGVsaG1tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzg5MTMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvdHJhbnNwYWlyX21vZGVsaG1tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaCAoUldUSCBBYWNoZW4gLSBMZWhyc3R1aGwgZnVlciBJbmZvcm1hdGlrIFZJKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHSVpBKysgKCBleHRlbnNpb24gb2YgR0laQSApLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0jaWZuZGVmIHRyYW5zcGFpcl9tb2RlbGhtbV9oX2Zqb19kZWZpbmVkCi0jZGVmaW5lIHRyYW5zcGFpcl9tb2RlbGhtbV9oX2Zqb19kZWZpbmVkCi0jaW5jbHVkZSAiQXJyYXkyLmgiCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgIlZlY3Rvci5oIgotI2luY2x1ZGUgIk5UYWJsZXMuaCIKLSNpbmNsdWRlICJBVGFibGVzLmgiCi0jaW5jbHVkZSAiVFRhYmxlcy5oIgotI2luY2x1ZGUgImFsaWdubWVudC5oIgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJ0cmFuc3BhaXJfbW9kZWwyLmgiCi0jaW5jbHVkZSAiRm9yd2FyZEJhY2t3YXJkLmgiCi0jaW5jbHVkZSAiaG1tLmgiCi0KLWNsYXNzIHRyYW5zcGFpcl9tb2RlbGhtbSA6IHB1YmxpYyB0cmFuc3BhaXJfbW9kZWwyCi17Ci0gcHVibGljOgotIHR5cGVkZWYgdHJhbnNwYWlyX21vZGVsaG1tIHNpbXBsZXJfdHJhbnNwYWlyX21vZGVsOyAgICAgICAgICAgCi0gIEhNTU5ldHdvcmsqbmV0OwotICB0cmFuc3BhaXJfbW9kZWxobW0oY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mZXMsIGNvbnN0IFZlY3RvcjxXb3JkSW5kZXg+JmZzLCBjb25zdCB0bW9kZWw8Q09VTlQsIFBST0I+JnRUYWJsZSwgCi0JCSAgIGNvbnN0IGFtb2RlbDxQUk9CPiZhVGFibGUsY29uc3QgYW1vZGVsPFBST0I+Jixjb25zdCBubW9kZWw8UFJPQj4mLCAKLQkJICAgZG91YmxlLCBkb3VibGUsY29uc3QgaG1tKmgpCi0gICAgOiB0cmFuc3BhaXJfbW9kZWwyKGVzLGZzLHRUYWJsZSxhVGFibGUpLG5ldChoLT5tYWtlSE1NTmV0d29yayhlcyxmcywwKSkKLSAgICB7fQotICAgfnRyYW5zcGFpcl9tb2RlbGhtbSgpIHsgZGVsZXRlIG5ldDsgfQotICBpbnQgbW9kZWxucigpY29uc3R7cmV0dXJuIDY7fQotICBMb2dQcm9iIHNjb3JlT2ZNb3ZlKGNvbnN0IGFsaWdubWVudCZhLCBXb3JkSW5kZXggX25ld19pLCBXb3JkSW5kZXggaixkb3VibGU9LTEuMCljb25zdAotICAgIHsKLSAgICAgIGludCBuZXdfaT1fbmV3X2k7Ci0gICAgICBMb2dQcm9iIGNoYW5nZT0xLjA7Ci0gICAgICBpbnQgb2xkX2k9YShqKTsKLSAgICAgIGlmIChvbGRfaSA9PSBuZXdfaSkKLQljaGFuZ2U9MS4wOwotICAgICAgZWxzZQotCXsKLQkgIGludCB0aGVKPWotMTsKLQkgIG9sZF9pLS07Ci0JICBuZXdfaS0tOwotCSAgaW50IGpqPWotMTsKLQkgIHdoaWxlKGpqPjAmJmEoamopPT0wKQotCSAgICBqai0tOwotCSAgaW50IHRoZUlQcmV2PSAoamo+MCk/KGEoamopLTEpOjA7Ci0JICBpZiggaj4xJiZhKGotMSk9PTAgKQotCSAgICB0aGVJUHJldis9bDsKLQkgIGlmKCBvbGRfaT09LTEgKXtvbGRfaSA9IHRoZUlQcmV2O2lmKG9sZF9pPGludChsKSlvbGRfaSs9bDt9Ci0JICBpZiggbmV3X2k9PS0xICl7bmV3X2kgPSB0aGVJUHJldjtpZihuZXdfaTxpbnQobCkpbmV3X2krPWw7fQotCSAgaW50IHRoZUlQcmV2T2xkPXRoZUlQcmV2LHRoZUlQcmV2TmV3PXRoZUlQcmV2OwotCSAgaWYoIHRoZUo9PTAgKQotCSAgICB7Ci0JICAgICAgY2hhbmdlKj1uZXQtPmdldEFscGhhaW5pdChuZXdfaSkvbmV0LT5nZXRBbHBoYWluaXQob2xkX2kpOwotCSAgICB9Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaWYoIG5ld19pIT1vbGRfaSApCi0JCXsKLQkJICBjaGFuZ2UqPW5ldC0+bm9kZVByb2IobmV3X2ksdGhlSikvbmV0LT5ub2RlUHJvYihvbGRfaSx0aGVKKTsKLQkJfQotCSAgICAgIGlmKCB0aGVKPjApCi0JCWNoYW5nZSo9bmV0LT5vdXRQcm9iKHRoZUosdGhlSVByZXZOZXcsbmV3X2kpL25ldC0+b3V0UHJvYih0aGVKLHRoZUlQcmV2T2xkLG9sZF9pKTsKLQkgICAgICB0aGVJUHJldk9sZD1vbGRfaTsKLQkgICAgICB0aGVJUHJldk5ldz1uZXdfaTsKLQkgICAgICB0aGVKKys7Ci0JICAgICAgaWYoIHRoZUo8aW50KG0pICYmIGEodGhlSisxKT09MCApCi0JCXsKLQkJICBpZiggbmV3X2k8aW50KGwpKSBuZXdfaSs9bDsKLQkJICBpZiggb2xkX2k8aW50KGwpKSBvbGRfaSs9bDsKLQkJfQotCSAgICB9IHdoaWxlKCB0aGVKPGludChtKSAmJiBhKHRoZUorMSk9PTAgKTsKLQkgIGlmKHRoZUo9PWludChtKSkKLQkgICAgewotCSAgICAgIGNoYW5nZSo9bmV0LT5nZXRCZXRhaW5pdChuZXdfaSkvbmV0LT5nZXRCZXRhaW5pdChvbGRfaSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5ld19pPWEodGhlSisxKS0xOwotCSAgICAgIGlmKCBuZXdfaT09LTEpCi0JCW5ld19pPXRoZUlQcmV2TmV3OwotCSAgICAgIGNoYW5nZSo9bmV0LT5vdXRQcm9iKHRoZUosdGhlSVByZXZOZXcsbmV3X2kpL25ldC0+b3V0UHJvYih0aGVKLHRoZUlQcmV2T2xkLG5ld19pKTsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgfQotICBMb2dQcm9iIHNjb3JlT2ZBbGlnbm1lbnRGb3JDaGFuZ2UoY29uc3QgYWxpZ25tZW50Jiljb25zdAotICAgIHtyZXR1cm4gLTEuMDsgfSAgCi0gIExvZ1Byb2Igc2NvcmVPZlN3YXAoY29uc3QgYWxpZ25tZW50JmEsIFdvcmRJbmRleCBqMSwgV29yZEluZGV4IGoyLGRvdWJsZT0tMS4wKWNvbnN0IAotICAgIHsKLSAgICAgIHJldHVybiBfc2NvcmVPZlN3YXAoYSxqMSxqMik7Ci0gICAgfQotICBMb2dQcm9iIF9zY29yZU9mTW92ZShjb25zdCBhbGlnbm1lbnQmYSwgV29yZEluZGV4IG5ld19pLCBXb3JkSW5kZXggaixkb3VibGU9LTEuMCljb25zdAotICAgIHsKLSAgICAgIGFsaWdubWVudCBiKGEpOwotICAgICAgYi5zZXQoaiwgbmV3X2kpOwotICAgICAgTG9nUHJvYiBhX3Byb2I9cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYSk7Ci0gICAgICBMb2dQcm9iIGJfcHJvYj1wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShiKTsKLSAgICAgIGlmKCBhX3Byb2IgKQotCXJldHVybiBiX3Byb2IvYV9wcm9iOwotICAgICAgZWxzZSBpZiggYl9wcm9iICkKLQlyZXR1cm4gMWUyMDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMS4wOwotICAgIH0KLSAgTG9nUHJvYiBfc2NvcmVPZlN3YXAoY29uc3QgYWxpZ25tZW50JmEsIFdvcmRJbmRleCBqMSwgV29yZEluZGV4IGoyLGRvdWJsZT0tMS4wKWNvbnN0Ci0gICAgewotICAgICAgV29yZEluZGV4IGFqMT1hKGoxKSxhajI9YShqMik7Ci0gICAgICBpZiggYWoxPT1hajIgKQotCXJldHVybiAxLjA7Ci0gICAgICBMb2dQcm9iIGFfcHJvYj1wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShhKTsKLQotICAgICAgLyphbGlnbm1lbnQgYihhKTsKLSAgICAgIGIuc2V0KGoxLCBhKGoyKSk7Ci0gICAgICBiLnNldChqMiwgYShqMSkpOwotICAgICAgTG9nUHJvYiBiX3Byb2I9cHJvYl9vZl90YXJnZXRfYW5kX2FsaWdubWVudF9naXZlbl9zb3VyY2UoYik7Ki8KLQotICAgICAgY29uc3RfY2FzdDxhbGlnbm1lbnQmPihhKS5zZXQoajEsYWoyKTsKLSAgICAgIGNvbnN0X2Nhc3Q8YWxpZ25tZW50Jj4oYSkuc2V0KGoyLGFqMSk7Ci0gICAgICBMb2dQcm9iIGJfcHJvYj1wcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShhKTsKLSAgICAgIGNvbnN0X2Nhc3Q8YWxpZ25tZW50Jj4oYSkuc2V0KGoxLGFqMSk7Ci0gICAgICBjb25zdF9jYXN0PGFsaWdubWVudCY+KGEpLnNldChqMixhajIpOwotCi0gICAgICBpZiggYV9wcm9iICkKLQlyZXR1cm4gYl9wcm9iL2FfcHJvYjsKLSAgICAgIGVsc2UgaWYoIGJfcHJvYiApCi0JcmV0dXJuIDFlMjA7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDEuMDsKLSAgICB9Ci0gIGlubGluZSBmcmllbmQgb3N0cmVhbSZvcGVyYXRvcjw8KG9zdHJlYW0mb3V0LCBjb25zdCB0cmFuc3BhaXJfbW9kZWxobW0mKQotICAgIHsKLSAgICAgIHJldHVybiBvdXQgPDwgIk5PLU9VVFBVVCBmb3IgdHJhbnNwYWlyX21vZGVsaG1tXG4iOwotICAgIH0KLSAgTG9nUHJvYiBwcm9iX29mX3RhcmdldF9hbmRfYWxpZ25tZW50X2dpdmVuX3NvdXJjZShjb25zdCBhbGlnbm1lbnQmYWwsYm9vbCB2ZXJib3NlPTApY29uc3QKLSAgICB7Ci0gICAgICBkb3VibGUgcHJvYj0xLjA7Ci0gICAgICBpbnQgdGhlSVByZXY9MDsKLSAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0xO2o8PW07aisrKQotCXsKLQkgIGludCB0aGVKPWotMTsKLQkgIGludCB0aGVJPWFsKGopLTE7Ci0JICBpZiggdGhlST09LTEgKQotCSAgICB0aGVJPSh0aGVJUHJldiVsKStsOwotCSAgcHJvYio9bmV0LT5ub2RlUHJvYih0aGVJLHRoZUopOwotCSAgaWYoIHZlcmJvc2UgKQotCSAgICBjb3V0IDw8ICJOUCAiIDw8IG5ldC0+bm9kZVByb2IodGhlSSx0aGVKKSA8PCAnICc7Ci0JICBpZiggaj09MSApCi0JICAgIHsKLQkgICAgICBwcm9iKj1uZXQtPmdldEFscGhhaW5pdCh0aGVJKTsKLQkgICAgICBpZiggdmVyYm9zZSApCi0JCWNvdXQgPDwgIkFQMCAiIDw8IG5ldC0+Z2V0QWxwaGFpbml0KHRoZUkpIDw8ICcgJzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHJvYio9bmV0LT5vdXRQcm9iKHRoZUosdGhlSVByZXYsdGhlSSk7Ci0JICAgICAgaWYoIHZlcmJvc2UgKQotCQljb3V0IDw8ICJBUDEgIiA8PCBuZXQtPm91dFByb2IodGhlSix0aGVJUHJldix0aGVJKSA8PCAnICc7Ci0JICAgIH0KLQkgIHRoZUlQcmV2PXRoZUk7Ci0JICBpZiggaj09bSApCi0JICAgIHsKLQkgICAgICBwcm9iKj1uZXQtPmdldEJldGFpbml0KHRoZUkpOwotCSAgICAgIGlmKCB2ZXJib3NlICkKLQkJY291dCA8PCAiQVAyICIgPDwgbmV0LT5nZXRCZXRhaW5pdCh0aGVJKSA8PCAnICc7Ci0JICAgIH0KLQkgIGlmKCB2ZXJib3NlICkKLQkgICAgY291dCA8PCAiajoiPDx0aGVKPDwiIGk6Ijw8dGhlSSA8PCAiOyAgIjsKLQl9Ci0gICAgICBpZiggdmVyYm9zZSApCi0JY291dCA8PCAnXG4nOwotICAgICAgcmV0dXJuIHByb2IqbmV0LT5maW5hbE11bHRpcGx5OwotICAgIH0KLSAgdm9pZCBjb21wdXRlU2NvcmVzKGNvbnN0IGFsaWdubWVudCZhbCx2ZWN0b3I8ZG91YmxlPiZkKWNvbnN0Ci0gICAgewotICAgICAgZG91YmxlIHByb2IxPTEuMCxwcm9iMj0xLjA7Ci0gICAgICBpbnQgdGhlSVByZXY9MDsKLSAgICAgIGZvcih1bnNpZ25lZCBpbnQgaj0xO2o8PW07aisrKQotCXsKLQkgIGludCB0aGVKPWotMTsKLQkgIGludCB0aGVJPWFsKGopLTE7Ci0JICBpZiggdGhlST09LTEgKQotCSAgICB0aGVJPSh0aGVJUHJldiVsKStsOwotCSAgcHJvYjEqPW5ldC0+bm9kZVByb2IodGhlSSx0aGVKKTsKLQkgIGlmKCBqPT0xICkKLQkgICAgewotCSAgICAgIHByb2IyKj1uZXQtPmdldEFscGhhaW5pdCh0aGVJKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHJvYjIqPW5ldC0+b3V0UHJvYih0aGVKLHRoZUlQcmV2LHRoZUkpOwotCSAgICB9Ci0JICB0aGVJUHJldj10aGVJOwotCSAgaWYoIGo9PW0gKQotCSAgICB7Ci0JICAgICAgcHJvYjIqPW5ldC0+Z2V0QmV0YWluaXQodGhlSSk7Ci0JICAgIH0KLQl9Ci0gICAgICBkLnB1c2hfYmFjayhwcm9iMSk7Ci0gICAgICBkLnB1c2hfYmFjayhwcm9iMik7Ci0gICAgfQotCi0gIGJvb2wgaXNTdWJPcHRpbWFsKCljb25zdHtyZXR1cm4gMDt9Ci19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy90dGFibGVEaWZmLmhwcCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3R0YWJsZURpZmYuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODBjYWRkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3R0YWJsZURpZmYuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qIC0qLSBNb2RlOiBDOyBpbmRlbnQtdGFicy1tb2RlOiB0OyBjLWJhc2ljLW9mZnNldDogNDsgdGFiLXdpZHRoOiA0IC0qLSAqLwotLyoKLSAqIG5ld2dpemEKLSAqIENvcHlyaWdodCAoQykgUWluIEdhbyAyMDA3IDxxaW5nQGNzLmNtdS5lZHU+Ci0gKiAKLSAqIG5ld2dpemEgaXMgZnJlZSBzb2Z0d2FyZS4KLSAqIAotICogWW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAotICogbmV3Z2l6YSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggbmV3Z2l6YS4gIElmIG5vdCwgd3JpdGUgdG86Ci0gKiAJVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIAk1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCi0gKiAJQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLQotI2lmbmRlZiBfVFRBQkxFRElGRl9IUFBfCi0jZGVmaW5lIF9UVEFCTEVESUZGX0hQUF8KLSNpbmNsdWRlICJUVGFibGVzLmgiCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAidHlwZXMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLSNpZmRlZiBXSU4zMgotCQl0eXBlZGVmIGhhc2hfbWFwPHdvcmRQYWlySWRzLCBDT1VOVCwgaGFzaHBhaXI+IHdvcmRwYWlyX2hhc2g7Ci0jZWxzZQotCQl0eXBlZGVmIGhhc2hfbWFwPHdvcmRQYWlySWRzLCBDT1VOVCwgaGFzaHBhaXIsIGVxdWFsX3RvPHdvcmRQYWlySWRzPiA+IHdvcmRwYWlyX2hhc2g7Ci0jZW5kaWYKLS8qIQotVGhpcyBjbGFzcyBpcyBtZWFudCB0byBjcmVhdGUgYSBkaWZmZXJlbmNlIGZpbGUgaW4gb3JkZXIgdG8gbWFrZQotR0laQSBwYXJhbGVsbC4KLSovCi10ZW1wbGF0ZSA8Y2xhc3MgQ09VTlQsY2xhc3MgUFJPQj4KLWNsYXNzIENUVGFibGVEaWZmewotcHJpdmF0ZToKLQkJSU5UMzIgbm9FbmdsaXNoV29yZHM7ICAvLyB0b3RhbCBudW1iZXIgb2YgdW5pcXVlIHNvdXJjZSB3b3JkcwotCQlJTlQzMiBub0ZyZW5jaFdvcmRzOyAgIC8vIHRvdGFsIG51bWJlciBvZiB1bmlxdWUgdGFyZ2V0IHdvcmRzCi0JCS8qIQotCQlTdG9yZSBvbmx5IHRoZSBjb3VudGluZyovCQotCQl3b3JkcGFpcl9oYXNoIGVmOwotCi1wdWJsaWM6Ci0JCUlOVDMyIFNhdmVUb0ZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUpewotCQkJb2ZzdHJlYW0gb2ZzKGZpbGVuYW1lKTsKLQkJCWlmKCFvZnMuaXNfb3BlbigpKXsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9ZWxzZXsKLQkJCQl3b3JkcGFpcl9oYXNoOjppdGVyYXRvciBpdDsKLQkJCQlmb3IoIGl0ID0gZWYuYmVnaW4oKSA7IGl0ICE9IGVmLmVuZCgpOyBpdCsrKXsKLQkJCQkJb2ZzIDw8IGl0LT5maXJzdC5maXJzdCA8PCAiICIgPDwgaXQtPmZpcnN0LnNlY29uZCA8PCAiICIKLQkJCQkJCTw8IGl0LT5zZWNvbmQgPDwgc3RkOjplbmRsOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBTVUNDRVNTOwotCQl9Ci0JCi0JCUlOVDMyIExvYWRGcm9tRmlsZShjb25zdCBjaGFyKiBmaWxlbmFtZSl7Ci0JCQllZi5jbGVhcigpOwotCQkJaWZzdHJlYW0gaWZzKGZpbGVuYW1lKTsKLQkJCWlmKCFpZnMuaXNfb3BlbigpKXsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlzdHJpbmcgc2xpbmU7Ci0JCQl3aGlsZSghaWZzLmVvZigpKXsKLQkJCQlzbGluZSA9ICIiOwotCQkJCXN0ZDo6Z2V0bGluZShpZnMsc2xpbmUpOwotCQkJCWlmKHNsaW5lLmxlbmd0aCgpKXsKLQkJCQkJLy9jb3V0IDw8IHNsaW5lIDw8IGVuZGw7Ci0JCQkJCXN0cmluZ3N0cmVhbSBzcyhzbGluZS5jX3N0cigpKTsKLQkJCQkJV29yZEluZGV4IHdlPS0xLHdmPS0xOwotCQkJCQlDT1VOVCBjdD0tMSA7Ci0JCQkJCXNzID4+IHdlID4+IHdmID4+IGN0OwotCQkJCQlpZih3ZT09LTF8fHdmPT0tMXx8Y3Q9PS0xKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWVmW3dvcmRQYWlySWRzKHdlLHdmKV0gPSBjdDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gU1VDQ0VTUzsKLQkJfQotCQotCQlDT1VOVCAqIEdldFB0cihXb3JkSW5kZXggZSwgV29yZEluZGV4IGYpewotCQkJLy8gbG9vayB1cCB0aGlzIHBhaXIgYW5kIHJldHVybiBpdHMgcG9zaXRpb24KLQkJCXdvcmRwYWlyX2hhc2g6Oml0ZXJhdG9yIGkgPSBlZi5maW5kKHdvcmRQYWlySWRzKGUsIGYpKTsgCi0JCQlpZihpICE9IGVmLmVuZCgpKSAgLy8gaWYgaXQgZXhpc3RzLCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgotCQkJCXJldHVybigmKCgqaSkuc2Vjb25kKSk7Ci0JCQllbHNlIHJldHVybigwKSA7IC8vIGVsc2UgcmV0dXJuIE5VTEwgcG9pbnRlcgotCQl9Ci0JCi0JCXZvaWQgaW5jQ291bnQoV29yZEluZGV4IGUsIFdvcmRJbmRleCBmLCBDT1VOVCBpbmMpIAotCQkvLyBpbmNyZW1lbnRzIHRoZSBjb3VudCBvZiB0aGUgZ2l2ZW4gd29yZCBwYWlyLiBpZiB0aGUgcGFpciBkb2VzIG5vdCBleGlzdCwgCi0JCS8vIGl0IGNyZWF0ZXMgaXQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuCi0JCXsKLQkJCWlmKCBpbmMgKQotCQkJCWVmW3dvcmRQYWlySWRzKGUsIGYpXSArPSBpbmMgOwotCQl9Ci0JCi0JCUlOVDMyIEF1Z21lbnRUVGFibGUodG1vZGVsPENPVU5ULFBST0I+JiB0dGFibGUpewotCQkJd29yZHBhaXJfaGFzaDo6aXRlcmF0b3IgaXQ7Ci0JCQlmb3IoIGl0ID0gZWYuYmVnaW4oKSA7IGl0ICE9IGVmLmVuZCgpOyBpdCsrKXsKLQkJCQl0dGFibGUuaW5jQ291bnQoaXQtPmZpcnN0LmZpcnN0LGl0LT5maXJzdC5zZWNvbmQsaXQtPnNlY29uZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU1VDQ0VTUzsKLQkJfQotCQotcHJvdGVjdGVkOgotCi19OwotCi0jZW5kaWYgLy8gX1RUQUJMRURJRkZfSFBQXwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvdHlwZXMuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmRiOTYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIQotQSBzZXQgb2YgZGVmaW5pdGlvbiBvZiB0eXBlcywgd2hlbiBwb3J0IHRvIFg2NCwgc29tZXRoaW5nIHNob3VsZAotYmUgY2hhbmdlZC4KLSovCi0KLQotdHlwZWRlZiBpbnQgSU5UMzI7Ci10eXBlZGVmIGZsb2F0IEZMT0FUMzI7Ci10eXBlZGVmIGRvdWJsZSBGTE9BVDY0OwotCi0jZGVmaW5lIFNVQ0NFU1MgMCAKLSNkZWZpbmUgSVNfU1VDQ0VTUyh4KSAoeD09MCkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3V0aWxpdHkuY3BwIGIvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvdXRpbGl0eS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjQ3ODMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvdXRpbGl0eS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgIm15bWF0aC5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1kb3VibGUgZmFjdG9yaWFsKGludCBuKQotewotICBkb3VibGUgIGY9MTsKLSAgZm9yKGludCBpPTI7IGkgPD0gbjsgaSsrKQotICAgIGYgKj0gaTsKLSAgcmV0dXJuIGY7Ci19Ci0jaWZkZWYgV0lOMzIKLXN0cmluZyBteV9jdGltZShjb25zdCB0aW1lX3QqIHQpewotCWNoYXIgYnVmZmVyWzI1Nl07Ci0JY3RpbWVfcyhidWZmZXIsMjU2LHQpOwotCXJldHVybiBidWZmZXI7Ci19Ci0jZWxzZQotCi1zdHJpbmcgbXlfY3RpbWUoY29uc3QgdGltZV90KiB0KXsKLQlyZXR1cm4gY3RpbWUodCk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3V0aWxpdHkuaCBiL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3V0aWxpdHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2Y2RlZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy91dGlsaXR5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotCi1FR1lQVCBUb29sa2l0IGZvciBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uCi1Xcml0dGVuIGJ5IFlhc2VyIEFsLU9uYWl6YW4sIEphbiBDdXJpbiwgTWljaGFlbCBKYWhyLCBLZXZpbiBLbmlnaHQsIEpvaG4gTGFmZmVydHksIERhbiBNZWxhbWVkLCBEYXZpZCBQdXJkeSwgRnJhbnogT2NoLCBOb2FoIFNtaXRoLCBhbmQgRGF2aWQgWWFyb3dza3kuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKLVVTQS4KLQotKi8KLSNpZm5kZWYgdXRpbGl0eV9oCi0jZGVmaW5lIHV0aWxpdHlfaAotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlICJQZXJwbGV4aXR5LmgiCi0jaW5jbHVkZSAiVmVjdG9yLmgiCi0jaW5jbHVkZSAiVFRhYmxlcy5oIgotI2luY2x1ZGUgImdldFNlbnRlbmNlLmgiCi0jaW5jbHVkZSAidm9jYWIuaCIKLQotZXh0ZXJuIHZvaWQgcHJpbnRIZWxwKHZvaWQpOwotZXh0ZXJuIHZvaWQgcGFyc2VDb25maWdGaWxlIChjaGFyICogZm5hbWUgKTsKLWV4dGVybiB2b2lkIHBhcnNlQXJndW1lbnRzKGludCBhcmdjLCBjaGFyICphcmd2W10pOwotZXh0ZXJuIHZvaWQgZ2VuZXJhdGVQZXJwbGV4aXR5UmVwb3J0KGNvbnN0IFBlcnBsZXhpdHkmIHRyYWlucGVycCwgCi0JCQkJICAgICBjb25zdCBQZXJwbGV4aXR5JiB0ZXN0cGVycCwgCi0JCQkJICAgICBjb25zdCBQZXJwbGV4aXR5JiB0cmFpblZwZXJwLCAKLQkJCQkgICAgIGNvbnN0IFBlcnBsZXhpdHkmIHRlc3RWcGVycCwgCi0JCQkJICAgICBvc3RyZWFtJiBvZiwgaW50IHRyYWluc2l6ZSwgCi0JCQkJICAgICBpbnQgdGVzdHNpemUsIHVuc2lnbmVkIGludCBsYXN0LCBib29sKTsKLQotZXh0ZXJuIHZvaWQgIHByaW50U2VudGVuY2VQYWlyKFZlY3RvcjxXb3JkSW5kZXg+JiBlcywgVmVjdG9yPFdvcmRJbmRleD4mIGZzLCBvc3RyZWFtJiBvZik7Ci0gICAgIAotZXh0ZXJuIHZvaWQgcHJpbnRPdmVybGFwUmVwb3J0KGNvbnN0IHRtb2RlbDxDT1VOVCwgUFJPQj4mIHRUYWJsZSwKLQkJCSAgICAgICBzZW50ZW5jZUhhbmRsZXImIHRlc3RIYW5kbGVyLCB2Y2JMaXN0JiB0cmFpbkVMaXN0LCAKLQkJCSAgICAgICB2Y2JMaXN0JiB0cmFpbkZMaXN0LCB2Y2JMaXN0JiB0ZXN0RUxpc3QsIHZjYkxpc3QmIHRlc3RGTGlzdCk7Ci0KLWV4dGVybiB2b2lkIHByaW50QWxpZ25Ub0ZpbGUoY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIGVzLCAgY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIGZzLCAKLQkJCSAgICAgY29uc3QgVmVjdG9yPFdvcmRFbnRyeT4mIGV2bGlzdCwgY29uc3QgVmVjdG9yPFdvcmRFbnRyeT4mIGZ2bGlzdCwgCi0JCQkgICAgIG9zdHJlYW0mIG9mMiwgY29uc3QgVmVjdG9yPFdvcmRJbmRleD4mIHZpdGVyYmlfYWxpZ25tZW50LCBpbnQgcGFpcl9ubywgCi0JCQkgICAgIGRvdWJsZSB2aXRlcmJpX3Njb3JlKTsKLQotZXh0ZXJuIGRvdWJsZSBmYWN0b3JpYWwoaW50KSA7Ci0KLXN0cmluZyBteV9jdGltZShjb25zdCB0aW1lX3QqIHQpOwotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy92b2NhYi5jcHAgYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy92b2NhYi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmYxM2EuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9NR0laQS9zcmMvdm9jYWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0KLUVHWVBUIFRvb2xraXQgZm9yIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24KLVdyaXR0ZW4gYnkgWWFzZXIgQWwtT25haXphbiwgSmFuIEN1cmluLCBNaWNoYWVsIEphaHIsIEtldmluIEtuaWdodCwgSm9obiBMYWZmZXJ0eSwgRGFuIE1lbGFtZWQsIERhdmlkIFB1cmR5LCBGcmFueiBPY2gsIE5vYWggU21pdGgsIGFuZCBEYXZpZCBZYXJvd3NreS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotI2luY2x1ZGUgInZvY2FiLmgiIAotCi12b2lkIHZjYkxpc3Q6OnJlYWRWb2NhYkxpc3QoKQotICAgICAvLyByZWFkcyBhIHZvY2FidWxhcnkgZmlsZSBmcm9tIGZuYW1lLiBJdCBleHBlY3RzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotICAgICAvLyAKLSAgICAgLy8gdG9rZW5faWQgdG9rZW5fc3RyaW5nIGZyZXF1ZW5jeQotewotCi0gIGludCBmcmVxPTA7Ci0gIFdvcmRJbmRleCB3b3JkX2lkIDsKLSAgV29yZEVudHJ5IGVudHJ5KCJOVUxMIiwwKSA7Ci0KLSAgc3RyaW5nIGxpbmUsIHdvcmQgOwotICBjZXJyIDw8ICJSZWFkaW5nIHZvY2FidWxhcnkgZmlsZSBmcm9tOiIgPDwgZm5hbWUgPDwgIlxuIjsgICAgCi0gIC8vICB0b3RhbCA9IDAgOwotICBpZnN0cmVhbSBpZnMoZm5hbWUpOwotCi0gIGlmKCFpZnMpewotICAgIGNlcnIgPDwgICJcbkNhbm5vdCBvcGVuIHZvY2FidWxhcnkgZmlsZSAiIDw8IGZuYW1lIDw8ICJmaWxlIjsKLSAgICBleGl0KDEpOwotICB9Ci0gIHNpemVfdCBzbGluZSA9IDA7Ci0gIHdoaWxlKGdldGxpbmUoaWZzLCBsaW5lKSl7Ci0JICBzbGluZSArKzsKLSAgfQotCi0gIGlmcy5jbG9zZSgpOwotCi0gIGlmc3RyZWFtIHZGaWxlKGZuYW1lKTsKLSAgaWYoIXZGaWxlKXsKLSAgICBjZXJyIDw8ICAiXG5DYW5ub3Qgb3BlbiB2b2NhYnVsYXJ5IGZpbGUgIiA8PCBmbmFtZSA8PCAiZmlsZSI7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi0gIGxpc3QucmVzZXJ2ZShzbGluZSsxMDApOyAvLyBSZXNlcnZlIHNwYWNlIHRvIHByZXZlbnQgcmUtYWxsb2NhdGluZwotICAKLSAgbGlzdC5wdXNoX2JhY2soZW50cnkpOwotICBzMmlbZW50cnkud29yZF09bGlzdC5zaXplKCktMTsKLQotICB3aGlsZShnZXRsaW5lKHZGaWxlLCBsaW5lKSl7Ci0gICAgaXN0cnN0cmVhbSBidWZmZXIobGluZS5jX3N0cigpKTsKLSAgICBpZighKGJ1ZmZlciA+PiB3b3JkX2lkID4+IHdvcmQgPj4gZnJlcSkpCi0gICAgICBjZXJyIDw8ICJFUlJPUjogcmVhZGluZyB2b2NhYnVsYXJ5OyAiIDw8IHdvcmRfaWQgPDwgJyAnIDw8IHdvcmQgPDwgJyAnIDw8IGZyZXEgPDwgZW5kbDsKLSAgICBpZiAod29yZF9pZCA9PSAwKXsKLSAgICAgIGNlcnIgPDwgIkVSUk9SOiBUT0tFTiBJRCAwIGlzIHJlc2VydmVkIGZvciBzcGVjaWFsIHRva2VuIE5VTEwsIGluIGxpbmU6IFxuIjw8IGxpbmU8PCJcbiIgOwotICAgICAgZXhpdCgtMSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHdvcmRfaWQgPj0gTUFYX1ZPQ0FCX1NJWkUpewotICAgICAgY2VyciA8PCAiRVJST1I6IFRPS0VOIElEIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIHZvY2FidWxhcnkgc2l6ZSAiCi0JICAgPDwgTUFYX1ZPQ0FCX1NJWkUgPDwgIiBpbiBsaW5lIDpcbiI8PCBsaW5lIDw8IlxuIiA7Ci0gICAgICBleGl0KC0xKTsKLSAgICB9CQotICAgIGVsc2UgaWYgKGZyZXEgPCAwKXsKLSAgICAgIGNlcnIgPDwgIkVSUk9SOiBmcmVxdWVuY3kgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGluIGxpbmUgOlxuIgotCSAgIDw8IGxpbmUgPDwiXG4iOwotICAgICAgZXhpdCgtMSk7Ci0gICAgfQotICAgIGVsc2UgaWYod29yZF9pZCA+PSBsaXN0LnNpemUoKSl7Ci0gICAgICBsaXN0LnJlc2l6ZSh3b3JkX2lkKzEpOwotICAgICAgbGlzdFt3b3JkX2lkXS53b3JkID0gd29yZCA7Ci0gICAgICBzMmlbd29yZF09d29yZF9pZDsKLSAgICAgIGxpc3Rbd29yZF9pZF0uZnJlcSA9IDAgOwotICAgICAgbm9VbmlxdWVUb2tlbnMgPSB3b3JkX2lkICsgMSA7Ci0gICAgICAvLyAgICAgIG5vVW5pcXVlVG9rZW5zKysgOwotICAgICAgLy8gICAgICB0b3RhbCArPSBmcmVxIDsKLSAgICB9ICAgICAgCi0gICAgZWxzZSBpZihsaXN0W3dvcmRfaWRdLndvcmQgIT0gIlwwIil7Ci0gICAgICBjZXJyIDw8ICJFUlJPUjogVE9LRU4gSUQgbXVzdCBiZSB1bmlxdWUgZm9yIGVhY2ggdG9rZW4sIGluIGxpbmUgOlxuIgotCSAgIDw8IGxpbmUgPDwiXG4iOwotICAgICAgY2VyciA8PCAiVE9LRU4gSUQgIiA8PCB3b3JkX2lkIDw8ICIgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZCB0bzogIiA8PAotCWxpc3Rbd29yZF9pZF0ud29yZCA8PCAiXG4iOwotICAgICAgZXhpdCgtMSk7Ci0gICAgfQotICAgIGVsc2UgeyAvLyBsaW5lICBoYXMgdmFsaWQgaW5mb3JtYXRpb24KLSAgICAgIGxpc3Rbd29yZF9pZF0ud29yZCA9IHdvcmQgOwotICAgICAgczJpW3dvcmRdPXdvcmRfaWQ7Ci0gICAgICBsaXN0W3dvcmRfaWRdLmZyZXEgPSAwIDsKLSAgICAgIC8vICAgICAgbm9VbmlxdWVUb2tlbnMrKyA7Ci0gICAgICBub1VuaXF1ZVRva2VucyAgPSB3b3JkX2lkICsgMSA7Ci0gICAgICAvLyAgICAgIHRvdGFsICs9IGZyZXEgOwotICAgIH0KLSAgfSAvLyBlbmQgb2Ygd2hpbGUKLX0KLQotCi12b2lkIHZjYkxpc3Q6OmNvbXBhY3QoY29uc3Qgc3RkOjpzZXQ8V29yZEluZGV4PiYgZXZvYyl7Ci0JaW50IGRlbCA9IDA7Ci0JZm9yKGludCBpPTA7IGk8IGxpc3Quc2l6ZSgpIDsgaSsrKXsKLQkJaWYoZXZvYy5maW5kKGkpPT1ldm9jLmVuZCgpKXsgLy8gTm90IGFwcGVhciBpbiBjb3JwdXMKLQkJCXMyaS5lcmFzZShsaXN0W2ldLndvcmQpOwotCQkJbGlzdFtpXS53b3JkID0gIiI7Ci0JCQlkZWwrKzsKLQkJfQotCX0KLQljZXJyIDw8ICJDb21wYWN0ZWQgVm9jYWJ1bGFyeSwgZWxpbWluYXRlZCAiIDw8IGRlbCA8PCAiIGVudHJpZXMgIiAKLQkJPDwgczJpLnNpemUoKSA8PCAiIHJlbWFpbnMgIiA8PCBlbmRsOwotfQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3ZvY2FiLmggYi9zY3JpcHRzL3RyYWluaW5nL01HSVpBL3NyYy92b2NhYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmY1ZGU3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvTUdJWkEvc3JjL3ZvY2FiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLQotRUdZUFQgVG9vbGtpdCBmb3IgU3RhdGlzdGljYWwgTWFjaGluZSBUcmFuc2xhdGlvbgotV3JpdHRlbiBieSBZYXNlciBBbC1PbmFpemFuLCBKYW4gQ3VyaW4sIE1pY2hhZWwgSmFociwgS2V2aW4gS25pZ2h0LCBKb2huIExhZmZlcnR5LCBEYW4gTWVsYW1lZCwgRGF2aWQgUHVyZHksIEZyYW56IE9jaCwgTm9haCBTbWl0aCwgYW5kIERhdmlkIFlhcm93c2t5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0jaWZuZGVmIF92b2NhYl9oCi0jZGVmaW5lIF92b2NhYl9oIDEKLQotI2luY2x1ZGUgImRlZnMuaCIgCi0jaW5jbHVkZSAiVmVjdG9yLmgiIAotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzdHJzdHJlYW0+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLQotY2xhc3MgV29yZEVudHJ5IHsKLSBwdWJsaWM6Ci0gIHN0cmluZyB3b3JkIDsKLSAgZG91YmxlIGZyZXEgOwotICBXb3JkRW50cnkoKTp3b3JkKCJcMCIpLCBmcmVxKDApe307Ci0gIFdvcmRFbnRyeShzdHJpbmcgdywgaW50IGYpOndvcmQodyksIGZyZXEoZil7fTsKLX07Ci0KLWNsYXNzIHZjYkxpc3R7Ci0gcHJpdmF0ZToKLSAgVmVjdG9yPFdvcmRFbnRyeT4mIGxpc3QgOwotICBtYXA8c3RyaW5nLGludD4gczJpOwotICBkb3VibGUgdG90YWw7Ci0gIFdvcmRJbmRleCBub1VuaXF1ZVRva2VucyA7Ci0gIFdvcmRJbmRleCBub1VuaXF1ZVRva2Vuc0luQ29ycHVzIDsKLSAgY29uc3QgY2hhciogZm5hbWUgOwotIHB1YmxpYzoKLSAgdmNiTGlzdChWZWN0b3I8V29yZEVudHJ5PiYgdmNiLGNvbnN0IGNoYXIqIGY9MCk6bGlzdCh2Y2IpLCB0b3RhbCgwKSwgbm9VbmlxdWVUb2tlbnMoMCksIG5vVW5pcXVlVG9rZW5zSW5Db3JwdXMoMCksIGZuYW1lKGYpe307Ci0gIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyKmYpCi0gICAgeyBmbmFtZT1mOyB9Ci0gIHZjYkxpc3QoY29uc3QgdmNiTGlzdCYgYSk6bGlzdChhLmxpc3QpLCB0b3RhbChhLnRvdGFsKSwgbm9VbmlxdWVUb2tlbnMoYS5ub1VuaXF1ZVRva2VucyksIG5vVW5pcXVlVG9rZW5zSW5Db3JwdXMoMCksIGZuYW1lKGEuZm5hbWUpe307Ci0gIHZvaWQgY29tcGFjdChjb25zdCBzdGQ6OnNldDxXb3JkSW5kZXg+JiBldm9jKTsJCQotICBpbmxpbmUgV29yZEluZGV4IHNpemUoKWNvbnN0IHtyZXR1cm4gKGxpc3Quc2l6ZSgpKTt9OwotICBpbmxpbmUgV29yZEluZGV4IHVuaXFUb2tlbnMoKWNvbnN0IHtyZXR1cm4gbm9VbmlxdWVUb2tlbnM7fTsKLSAgaW5saW5lIFdvcmRJbmRleCB1bmlxVG9rZW5zSW5Db3JwdXMoKWNvbnN0IHtyZXR1cm4gbm9VbmlxdWVUb2tlbnNJbkNvcnB1czt9OwotICBpbmxpbmUgZG91YmxlIHRvdGFsVm9jYWIoKSBjb25zdCB7cmV0dXJuIHRvdGFsO307Ci0gIGlubGluZSBWZWN0b3I8V29yZEVudHJ5PiYgZ2V0Vm9jYWJMaXN0KCkgeyByZXR1cm4obGlzdCk7fTsgCi0gIGlubGluZSBjb25zdCBWZWN0b3I8V29yZEVudHJ5PiYgZ2V0Vm9jYWJMaXN0KCljb25zdCB7IHJldHVybihsaXN0KTt9OyAKLSAgdm9pZCByZWFkVm9jYWJMaXN0KCk7Ci0gIHZvaWQgaW5jRnJlcShXb3JkSW5kZXggaWQgLCBkb3VibGUgZil7Ci0gICAgaWYoaWQgPCBsaXN0LnNpemUoKSl7Ci0gICAgICBpZiAobGlzdFtpZF0uZnJlcSA9PSAwKQotCW5vVW5pcXVlVG9rZW5zSW5Db3JwdXMrKzsKLSAgICAgIGxpc3RbaWRdLmZyZXEgKz0gZiA7Ci0gICAgICB0b3RhbCArPSBmIDsKLSAgICB9Ci0gIH07Ci0gIHZvaWQgY2xlYXJBbGxGcmVxKCl7Ci0gICAgZm9yIChXb3JkSW5kZXggaWQgPSAwIDsgaWQgPCBsaXN0LnNpemUoKSA7IGlkKyspCi0gICAgICBsaXN0W2lkXS5mcmVxID0gMCA7Ci0gICAgdG90YWwgPSAwIDsKLSAgICBub1VuaXF1ZVRva2Vuc0luQ29ycHVzID0gMCA7Ci0gIH07Ci0KLSAgY29uc3QgYm9vbCBoYXNfd29yZChjb25zdCBzdHJpbmcmIHgpIGNvbnN0ewotCSAgbWFwPHN0cmluZyxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpPXMyaS5maW5kKHgpOwotCSAgcmV0dXJuIGkhPXMyaS5lbmQoKTsKLSAgfQotICBpbnQgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcmeCljb25zdAotICAgIHsKLSAgICAgIG1hcDxzdHJpbmcsaW50Pjo6Y29uc3RfaXRlcmF0b3IgaT1zMmkuZmluZCh4KTsKLSAgICAgIGlmKCBpIT1zMmkuZW5kKCkgKQotCXJldHVybiBpLT5zZWNvbmQ7Ci0gICAgICBlbHNlCi0JewotCSAgY2VyciA8PCAiRVJST1I6IG5vIHdvcmQgaW5kZXggZm9yICciPDx4PDwiJ1xuIjsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gIGNvbnN0IHN0cmluZyBvcGVyYXRvcigpKFdvcmRJbmRleCBpZCkgY29uc3QgeyAvLyBZYXNlciAtIDIwMDAtMTItMTMKLSAgICBpZiAoaWQgPCBsaXN0LnNpemUoKSkKLSAgICAgIHJldHVybiBsaXN0W2lkXS53b3JkIDsKLSAgICBlbHNlIHJldHVybiAwIDsKLSAgfQotICBjb25zdCBzdHJpbmcgb3BlcmF0b3JbXShXb3JkSW5kZXggaWQpIGNvbnN0IHsgLy8gWWFzZXIgLSAyMDAwLTEyLTEzCi0gICAgaWYgKGlkIDwgbGlzdC5zaXplKCkpCi0gICAgICByZXR1cm4gbGlzdFtpZF0ud29yZCA7Ci0gICAgZWxzZSByZXR1cm4gMCA7Ci0gIH0KLSAgdm9pZCBwcmludFZvY2FiTGlzdChvc3RyZWFtJiBvZil7Ci0gICAgZm9yIChXb3JkSW5kZXggaSA9IDEgOyBpIDwgbGlzdC5zaXplKCkgOyBpKyspewotICAgICAgaWYgKGxpc3RbaV0ud29yZCAhPSAiIiAmJiBsaXN0W2ldLmZyZXEgPiAwKQotCW9mIDw8IGkgPDwgJyAnIDw8IGxpc3RbaV0ud29yZCA8PCAnICcgPDwgbGlzdFtpXS5mcmVxIDw8ICdcbic7Ci0gICAgfQotICB9Ci0gIAotfTsKLSNlbmRpZiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbXlzdGwuaCBiL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbXlzdGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNmU0MS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL215c3RsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogQ29weXJpZ2h0IDE5OTggKGMpIGJ5IFJXVEggQWFjaGVuIC0gTGVocnN0dWhsIGZ1ZXIgSW5mb3JtYXRpayBWSSAqLwotLyogRnJhbnogSm9zZWYgT2NoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotI2lmbmRlZiBNWV9TVExfSF9ERUZJTkVECi0jZGVmaW5lIE1ZX1NUTF9IX0RFRklORUQKLQotI2luY2x1ZGUgPHN0cmluZz4KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0jaWZkZWYgVVNFX1NUTFBPUlQKLSNpZmRlZiBfX1NUTF9ERUJVRwotdXNpbmcgbmFtZXNwYWNlIF9TVExEOwotI2Vsc2UKLXVzaW5nIG5hbWVzcGFjZSBfU1RMOwotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgIm15YXNzZXJ0LmgiCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpZiBfX0dOVUNfXz09MgotI2luY2x1ZGUgPGhhc2hfbWFwPgotI2Vsc2lmIF9fR05VQ19fPT0zCi0jaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgotdXNpbmcgX19nbnVfY3h4OjpoYXNoX21hcDsKLSNlbHNlCi0jaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9tYXA+Ci0jZGVmaW5lIGhhc2hfbWFwIHVub3JkZXJlZF9tYXAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ6OnRyMTsKLSNlbmRpZgotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgIm15bWF0aC5oIgotI2luY2x1ZGUgIkFycmF5Mi5oIgotCi0jZGVmaW5lIG92ZXJfc3RyaW5nKGEsaSkgZm9yKHVuc2lnbmVkIGludCBpPTA7aTxhLmxlbmd0aCgpO2krKykKLSNkZWZpbmUgb3Zlcl9hcnJheShhLGkpIGZvcihpPShhKS5sb3coKTtpPD0oYSkuaGlnaCgpO2krKykKLSNkZWZpbmUgYmFja3dhcmRzX2FycmF5KGEsaSkgZm9yKGk9KGEpLmhpZ2goKTtpPj0oYSkubG93KCk7aS0tKQotI2RlZmluZSBvdmVyX2FycihhLGkpIGZvcihpbnQgaT0oYSkubG93KCk7aTw9KGEpLmhpZ2goKTtpKyspCi0jZGVmaW5lIG92ZXJfYXJyTUFYKGEsaSxtYXgpIGZvcihpbnQgaT0oYSkubG93KCk7aTw9bWluKChhKS5oaWdoKCksbWF4LTEpO2krKykKLSNkZWZpbmUgYmFja3dhcmRzX2FycihhLGkpIGZvcihpbnQgaT0oYSkuaGlnaCgpO2k+PShhKS5sb3coKTtpLS0pCi0KLWV4dGVybiBkb3VibGUgbjFtdWx0LG4ybXVsdCxuM211bHQ7Ci0KLWlubGluZSBkb3VibGUgcmVhbFByb2IoaW50IG4xLGludCBuMikKLXsKLSAgbWFzc2VydChuMTw9bjIpOwotICBpYXNzZXJ0KG4xPj0wJiZuMj4wKTsKLSAgaWYobjI9PTApbjI9MTsKLSAgcmV0dXJuICgoZG91YmxlKW4xKS8oZG91YmxlKW4yOwotfQotCi1pbmxpbmUgZG91YmxlIHZlcmZQcm9iKGludCBuMSxpbnQgbjIpCi17Ci0gIGRvdWJsZSBwcm9iID0gcmVhbFByb2IobjEsbjIpOwotICBpZiggbjE9PTEgKXJldHVybiBwcm9iKm4xbXVsdDsKLSAgZWxzZSBpZiggbjE9PTIgKXJldHVybiBwcm9iKm4ybXVsdDsKLSAgZWxzZSBpZiggbjE9PTMgKXJldHVybiBwcm9iKm4zbXVsdDsKLSAgZWxzZSAKLSAgcmV0dXJuIHByb2I7Ci19Ci0KLWlubGluZSBib29sIHByZWZpeChjb25zdCBzdHJpbmcmeCxjb25zdCBzdHJpbmcmeSkKLXsKLSAgaWYoeS5zaXplKCk+eC5zaXplKCkgKQotICAgIHJldHVybiAwOwotICBmb3IodW5zaWduZWQgaW50IGk9MDtpPHkuc2l6ZSgpOysraSkKLSAgICBpZiggeVtpXSE9eFtpXSApCi0gICAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyp0ZW1wbGF0ZTxjbGFzcyBUPgotaW50IGxldihjb25zdCBUJnMxLGNvbnN0IFQmczIpCi17Ci0gIEFycmF5MjxpbnQsdmVjdG9yPGludD4gPiBhKHMxLnNpemUoKSsxLHMyLnNpemUoKSsxLDEwMDApOwotICBBcnJheTI8cGFpcjxpbnQsaW50Pix2ZWN0b3I8cGFpcjxpbnQsaW50PiA+ID4gYmFjayhzMS5zaXplKCkrMSxzMi5zaXplKCkrMSxwYWlyPGludCxpbnQ+KDAsMCkpOwotICBmb3IodW5zaWduZWQgaW50IGk9MDtpPD1zMS5zaXplKCk7aSsrKQotICAgIGZvcih1bnNpZ25lZCBpbnQgaj0wO2o8PXMyLnNpemUoKTtqKyspCi0gICAgICB7Ci0JaWYoIGk9PTAmJmo9PTAgKQotCSAgYShpLGopPTA7Ci0JZWxzZQotCSAgewotCSAgICBpbnQgYURFTD0xMDAsYUlOUz0xMDAsYVNVQj0xMDA7Ci0JICAgIGlmKGk+MCkKLQkgICAgICBhREVMPWEoaS0xLGopKzE7Ci0JICAgIGlmKGo+MCkKLQkgICAgICBhSU5TPWEoaSxqLTEpKzE7Ci0JICAgIGlmKGk+MCYmaj4wKQotCSAgICAgIGFTVUI9YShpLTEsai0xKSsgIShzMVtpLTFdPT1zMltqLTFdKTsKLQkgICAgaWYoIGFTVUI8PWFERUwgJiYgYVNVQjw9YUlOUyApCi0JICAgICAgewotCQlhKGksaik9YVNVQjsKLQkJYmFjayhpLGopPXBhaXI8aW50LGludD4oaS0xLGotMSk7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmKCBhREVMPD1hU1VCICYmIGFERUw8PWFJTlMgKQotCSAgICAgIHsKLQkJYShpLGopPWFERUw7Ci0JCWJhY2soaSxqKT1wYWlyPGludCxpbnQ+KGktMSxqKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWEoaSxqKT1hSU5TOwotCQliYWNrKGksaik9cGFpcjxpbnQsaW50PihpLGotMSk7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICByZXR1cm4gYShzMS5zaXplKCksczIuc2l6ZSgpKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLWZsb2F0IHJlbF9sZXYoY29uc3QgVCZzMSxjb25zdCBUJnMyKQotewotICBpZiggczEuc2l6ZSgpPT0wICkKLSAgICByZXR1cm4gczIuc2l6ZSgpPT0wOwotICBlbHNlCi0gICAgcmV0dXJuIG1pbigxLjAsbGV2KHMxLHMyKS8oZG91YmxlKXMxLnNpemUoKSk7Ci19Ki8KLQotdGVtcGxhdGU8Y2xhc3MgVj4gaW50IEhhc2goY29uc3QgcGFpcjxWLFY+JmEpIAoteyByZXR1cm4gSGFzaChhLmZpcnN0KSsxMzAwMSpIYXNoKGEuc2Vjb25kKTsgfQotCi10ZW1wbGF0ZTxjbGFzcyBUMSxjbGFzcyBUMj4KLW9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSAmb3V0LGNvbnN0IHBhaXI8VDEsVDI+ICZpcikKLXsgCi0gIG91dCA8PCAiKCIgPDwgaXIuZmlyc3QgPDwgIiwiIDw8IGlyLnNlY29uZCA8PCAiKSI7Ci0gIHJldHVybiBvdXQ7Ci19IAotCi1pbmxpbmUgaW50IEhhc2goY29uc3Qgc3RyaW5nJiBzKQotewotICBpbnQgc3VtPTA7Ci0gIHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaT1zLmJlZ2luKCksZW5kPXMuZW5kKCk7Ci0gIGZvcig7aSE9ZW5kO2krKylzdW09NSpzdW0rKCppKTsKLSAgcmV0dXJuIHN1bTsKLX0KLXRlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQixjbGFzcyBDPgotY2xhc3MgdHJpCi17Ci1wdWJsaWM6Ci0gIEEgYTsKLSAgQiBiOwotICBDIGM7Ci0gIHRyaSgpe307Ci0gIHRyaShjb25zdCBBJl9hLGNvbnN0IEImX2IsY29uc3QgQyZfYykKLSAgICA6IGEoX2EpLGIoX2IpLGMoX2MpIHt9Ci19OwotdGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCLGNsYXNzIEM+Ci1ib29sIG9wZXJhdG9yPT0oY29uc3QgdHJpPEEsQixDPiZ4LGNvbnN0IHRyaTxBLEIsQz4meSkKLXsgcmV0dXJuIHguYT09eS5hJiZ4LmI9PXkuYiYmeC5jPT15LmM7fQotCi10ZW1wbGF0ZTxjbGFzcyBBLGNsYXNzIEIsY2xhc3MgQz4KLWJvb2wgb3BlcmF0b3I8KGNvbnN0IHRyaTxBLEIsQz4meCxjb25zdCB0cmk8QSxCLEM+JnkpCi17Ci0gIGlmKHguYTx5LmEpcmV0dXJuIDE7Ci0gIGlmKHkuYTx4LmEpcmV0dXJuIDA7Ci0gIGlmKHguYjx5LmIpcmV0dXJuIDE7Ci0gIGlmKHkuYjx4LmIpcmV0dXJuIDA7Ci0gIGlmKHguYzx5LmMpcmV0dXJuIDE7Ci0gIGlmKHkuYzx4LmMpcmV0dXJuIDA7Ci0gIHJldHVybiAwOwotfQotCi1kb3VibGUgdXNlZF90aW1lKCk7Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1jbGFzcyBteV9oYXNoCi17Ci1wdWJsaWM6Ci0gIGludCBvcGVyYXRvcigpKGNvbnN0IFQmdCljb25zdCB7cmV0dXJuIEhhc2godCk7fQotfTsKLQotaW5saW5lIGludCBIYXNoKGludCB2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0KLSNkZWZpbmUgTVlfSEFTSF9CQVNFIGhhc2hfbWFwPEEsQixteV9oYXNoPEE+ID4KLQotdGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCPgotY2xhc3MgbGVkYV9oX2FycmF5IDogcHVibGljIE1ZX0hBU0hfQkFTRQotewotcHJpdmF0ZToKLSAgQiBpbml0OwotcHVibGljOgotICBsZWRhX2hfYXJyYXkoKSA6IE1ZX0hBU0hfQkFTRSgpIHt9Ci0gIGxlZGFfaF9hcnJheShjb25zdCBCJl9pbml0KQotICAgIDogTVlfSEFTSF9CQVNFKCksaW5pdChfaW5pdCkge30KLSAgYm9vbCBkZWZpbmVkKGNvbnN0IEEmYSkgY29uc3QKLSAgICB7IHJldHVybiBmaW5kKGEpIT10aGlzLT5lbmQoKTsgfQotICBjb25zdCBCJm9wZXJhdG9yW10oY29uc3QgQSZhKWNvbnN0Ci0gICAgeyAKLSAgICAgIHR5cGVuYW1lIE1ZX0hBU0hfQkFTRTo6Y29uc3RfaXRlcmF0b3IgcG9zPWZpbmQoYSk7Ci0gICAgICBpZiggcG9zPT10aGlzLT5lbmQoKSApCi0JcmV0dXJuIGluaXQ7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHBvcy0+c2Vjb25kOwotICAgIH0KLSAgQiZvcGVyYXRvcltdKGNvbnN0IEEmYSkKLSAgICB7IAotICAgICAgdHlwZW5hbWUgTVlfSEFTSF9CQVNFOjppdGVyYXRvciBwb3M9ZmluZChhKTsKLSAgICAgIGlmKCBwb3M9PXRoaXMtPmVuZCgpICkKLQl7Ci0JICBpbnNlcnQoTVlfSEFTSF9CQVNFOjp2YWx1ZV90eXBlKGEsaW5pdCkpOwotCSAgcG9zPWZpbmQoYSk7Ci0JICBpYXNzZXJ0KHBvcyE9dGhpcy0+ZW5kKCkpOwotCX0KLSAgICAgIHJldHVybiBwb3MtPnNlY29uZDsKLSAgICB9Ci0gIGNvbnN0IEImaW5pdFZhbHVlKCljb25zdAotICAgIHtyZXR1cm4gaW5pdDt9Ci19OwotCi0jZGVmaW5lIGZvcmFsbF9kZWZpbmVkX2goYSxiLGMsZCkgZm9yKHR5cGVuYW1lIGxlZGFfaF9hcnJheTxhLGI+Ojpjb25zdF9pdGVyYXRvciBfX2pqX189KGQpLmJlZ2luKCk7X19qal9fIT0oZCkuZW5kKCkmJigoYz1fX2pqX18tPmZpcnN0KSwxKTsgKytfX2pqX18pCi10ZW1wbGF0ZTxjbGFzcyBULGNsYXNzIFU+Ci1vc3RyZWFtICYgb3BlcmF0b3I8PChvc3RyZWFtJm91dCxjb25zdCBsZWRhX2hfYXJyYXk8VCxVPiZ3KQotewotICBUIHQ7Ci0gIGJvb2wgbWFrZU5sPTA7Ci0gIG91dCA8PCAiaF9hcnJheXsiOwotICBmb3JhbGxfZGVmaW5lZF9oKFQsVSx0LHcpCi0gICAgewotICAgICAgaWYoIG1ha2VObCApCi0Jb3V0IDw8ICJcbiAgICAgICAiOwotICAgICAgb3V0IDw8ICJFTDoiIDw8IHQgPDwgIiBJTkg6IiA8PCB3W3RdIDw8ICIuIjsKLSAgICAgIG1ha2VObD0xOwotICAgIH0KLSAgcmV0dXJuIG91dCA8PCAifVxuIjsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVCxjbGFzcyBVPgotaXN0cmVhbSAmIG9wZXJhdG9yPj4oaXN0cmVhbSZpbixsZWRhX2hfYXJyYXk8VCxVPiYpCi17Ci0gIHJldHVybiBpbjsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCPgotYm9vbCBvcGVyYXRvcj09KGNvbnN0IGxlZGFfaF9hcnJheTxBLEI+JnAxLGNvbnN0IGxlZGFfaF9hcnJheTxBLEI+JnAyKQotewotICBBIHY7Ci0gIGZvcmFsbF9kZWZpbmVkX2goQSxCLHYscDEpCi0gICAgaWYoICEoIHAxW3ZdPT1wMlt2XSkgKSByZXR1cm4gMDsKLSAgZm9yYWxsX2RlZmluZWRfaChBLEIsdixwMikKLSAgICBpZiggISggcDFbdl09PXAyW3ZdKSApIHJldHVybiAwOwotICByZXR1cm4gMTsgCi19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1pbnQgY291bnRfZWxlbWVudHMoVCBhLFQgYikKLXsKLSAgaW50IGM9MDsKLSAgd2hpbGUoYSE9YikKLSAgICB7Ci0gICAgICBhKys7Ci0gICAgICBjKys7Ci0gICAgfQotICByZXR1cm4gYzsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLVQgbm9ybWFsaXplX2lmX3Bvc3NpYmxlX3dpdGhfaW5jcmVtZW50KFQqYSxUKmIsaW50IGluY3JlbWVudCkKLXsKLSAgVCBzdW09MDsKLSAgZm9yKFQqaT1hO2khPWI7aSs9aW5jcmVtZW50KQotICAgIHN1bSs9Kmk7Ci0gIGlmKCBzdW0gKQotICAgIGZvcihUKmk9YTtpIT1iO2krPWluY3JlbWVudCkKLSAgICAgICppLz1zdW07Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBUIGZhY3Rvcj1pbmNyZW1lbnQvKGItYSk7Ci0gICAgICBmb3IoVCppPWE7aSE9YjtpKz1pbmNyZW1lbnQpCi0JKmk9ZmFjdG9yOwotICAgIH0KLSAgcmV0dXJuIHN1bTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLWlubGluZSBpbnQgbV9jb21wXzN3YXkoVCBhLFQgYixpbnQgbikKLXsKLSAgaW50IF9uPTA7Ci0gIHdoaWxlKChfbisrPG4pICYmIGEgJiYgYikKLSAgICB7Ci0gICAgICBjb25zdCB0eXBlbmFtZSBUOjp2YWx1ZV90eXBlICZhYT0qYTsKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUgJmJiPSpiOwotICAgICAgaWYoIGFhPGJiIClyZXR1cm4gMTsKLSAgICAgIGlmKCBiYjxhYSApcmV0dXJuIC0xOwotICAgICAgKythOwotICAgICAgKytiOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci12b2lkIHNtb290aF9zdGFuZGFyZChUKmEsVCpiLGRvdWJsZSBwKQotewotICBpbnQgbj1iLWE7Ci0gIGlmKCBuPT0wICkgCi0gICAgcmV0dXJuOwotICBkb3VibGUgcHA9cC9uOwotICBmb3IoVCppPWE7aSE9YjsrK2kpCi0gICAgKmkgPSAoMS4wLXApKigqaSkrcHA7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1jb25zdCBUICpjb252KHR5cGVuYW1lIHZlY3RvcjxUPjo6Y29uc3RfaXRlcmF0b3IgaSkKLXsKLSAgcmV0dXJuICYoKmkpOwotfQotI2lmIF9fR05VQ19fPjIKLXRlbXBsYXRlPGNsYXNzIFQ+Ci1UICpjb252KHR5cGVuYW1lIHZlY3RvcjxUPjo6aXRlcmF0b3IgaSkKLXsKLSAgcmV0dXJuICYoKmkpOwotfQotI2VuZGlmCi0KLS8qdGVtcGxhdGU8Y2xhc3MgVD4KLWNvbnN0IFQgKmNvbnYoY29uc3QgVCp4KQotewotICByZXR1cm4geDsKLX0qLwotdGVtcGxhdGU8Y2xhc3MgVD4KLVQgKmNvbnYoVCp4KQotewotICByZXR1cm4geDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvbXlsZWRhLmggYi9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvbXlsZWRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMDkxYzkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL215bGVkYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxICBGcmFueiBKb3NlZiBPY2gKLQotbWtjbHMgLSBhIHByb2dyYW0gZm9yIG1ha2luZyB3b3JkIGNsYXNzZXMgLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgCi1VU0EuCi0KLSovCi0KLQotCi0jaWZuZGVmIG15bGVkYV9IRUFERVJfZGVmaW5lZAotI2RlZmluZSBteWxlZGFfSEVBREVSX2RlZmluZWQKLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgIm15YXNzZXJ0LmgiCi0jaW5jbHVkZSAiRml4ZWRBcnJheS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotdGVtcGxhdGU8Y2xhc3MgVD4KLWNsYXNzIGxlZGFfYXJyYXkgOiBwdWJsaWMgRml4ZWRBcnJheTxUPgotewotcHVibGljOgotICBsZWRhX2FycmF5KCkge30KLSAgbGVkYV9hcnJheShpbnQgbikgOiBGaXhlZEFycmF5PFQ+KG4pIHt9Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBUPgotY2xhc3MgbGVkYV9zZXQgOiBwdWJsaWMgc2V0PFQ+Ci17Ci1wdWJsaWM6Ci0gIGJvb2wgbWVtYmVyKGNvbnN0IFQmbSkgY29uc3QKLSAgICB7IHJldHVybiB0aGlzLT5jb3VudChtKSE9MDsgfQotICB2b2lkIGRlbChjb25zdCBUJm0pCi0gICAgeyB0aGlzLT5lcmFzZShtKTsgfQotfTsKLSNkZWZpbmUgZm9yYWxsX3NldChhLGIsYykgZm9yKGE6Oml0ZXJhdG9yIF9faV9fPWMuYmVnaW4oKTtfX2lfXyE9Yy5lbmQoKSYmKChiPSpfX2lfXyksMSk7KytfX2lfXykKLXRlbXBsYXRlPGNsYXNzIFQ+Ci1sZWRhX3NldDxUPiBvcGVyYXRvciYoY29uc3QgbGVkYV9zZXQ8VD4mYSxjb25zdCBsZWRhX3NldDxUPiZiKQotewotICBsZWRhX3NldDxUPmM7Ci0gIGluc2VydF9pdGVyYXRvcjxzZXQ8VD4gPiBpdGVyKGMsYy5iZWdpbigpKTsKLSAgc2V0X2ludGVyc2VjdGlvbihhLmJlZ2luKCksYS5lbmQoKSxiLmJlZ2luKCksYi5lbmQoKSxpdGVyKTsKLSAgcmV0dXJuIGM7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUPgotbGVkYV9zZXQ8VD4gb3BlcmF0b3ItKGNvbnN0IGxlZGFfc2V0PFQ+JmEsY29uc3QgbGVkYV9zZXQ8VD4mYikKLXsKLSAgbGVkYV9zZXQ8VD5jOwotICBpbnNlcnRfaXRlcmF0b3I8c2V0PFQ+ID4gaXRlcihjLGMuYmVnaW4oKSk7Ci0gIHNldF9kaWZmZXJlbmNlKGEuYmVnaW4oKSxhLmVuZCgpLGIuYmVnaW4oKSxiLmVuZCgpLGl0ZXIpOwotICByZXR1cm4gYzsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCPgotY2xhc3MgbGVkYV9kX2FycmF5IDogcHVibGljIG1hcDxBLEI+Ci17Ci1wcml2YXRlOgotICBCIGluaXQ7Ci1wdWJsaWM6Ci0gIGJvb2wgZGVmaW5lZChjb25zdCBBJmEpIGNvbnN0Ci0gICAgeyByZXR1cm4gZmluZChhKSE9dGhpcy0+ZW5kKCk7IH0KLSAgY29uc3QgQiZvcGVyYXRvcltdKGNvbnN0IEEmYSljb25zdAotICAgIHsgCi0gICAgICB0eXBlbmFtZSBtYXA8QSxCPjo6Y29uc3RfaXRlcmF0b3IgcG9zPWZpbmQoYSk7Ci0gICAgICBpYXNzZXJ0KHBvcyE9dGhpcy0+ZW5kKCkpOwotICAgICAgaWYoIHBvcz09dGhpcy0+ZW5kKCkgKQotCXJldHVybiBpbml0OwotICAgICAgZWxzZQotCXJldHVybiBwb3MtPnNlY29uZDsKLSAgICB9Ci0gIEImb3BlcmF0b3JbXShjb25zdCBBJmEpCi0gICAgeyAKLSAgICAgIHR5cGVuYW1lIG1hcDxBLEI+OjppdGVyYXRvciBwb3M9ZmluZChhKTsKLSAgICAgIGlmKCBwb3M9PXRoaXMtPmVuZCgpICkKLQl7Ci0JICBpbnNlcnQobWFwPEEsQj46OnZhbHVlX3R5cGUoYSxpbml0KSk7Ci0JICBwb3M9ZmluZChhKTsKLQkgIGlhc3NlcnQocG9zIT10aGlzLT5lbmQoKSk7Ci0JfQotICAgICAgcmV0dXJuIHBvcy0+c2Vjb25kOwotICAgIH0KLX07Ci0KLSNkZWZpbmUgZm9yYWxsX2RlZmluZWRfZChhLGIsYyxkKSBmb3IodHlwZW5hbWUgbGVkYV9kX2FycmF5PGEsYj46OmNvbnN0X2l0ZXJhdG9yIF9faWlfXz0oZCkuYmVnaW4oKTtfX2lpX18hPShkKS5lbmQoKSYmKChjPV9faWlfXy0+Zmlyc3QpLDEpIDsrK19faWlfXykKLSNkZWZpbmUgZm9yYWxsX2QoYSxiLGMsZCkgICAgICAgICBmb3IodHlwZW5hbWUgbGVkYV9kX2FycmF5PGEsYj46OmNvbnN0X2l0ZXJhdG9yIF9faWlfXz0oZCkuYmVnaW4oKTtfX2lpX18hPShkKS5lbmQoKSYmKChjPV9faWlfXy0+c2Vjb25kKSwxKTsrK19faWlfXykKLQotZG91YmxlIHVzZWRfdGltZSgpOwotCi10ZW1wbGF0ZTxjbGFzcyBUPgotY2xhc3MgbXlfaGFzaAotewotcHVibGljOgotICBpbnQgb3BlcmF0b3IoKShjb25zdCBUJnQpY29uc3Qge3JldHVybiBIYXNoKHQpO30KLX07Ci0KLWlubGluZSBpbnQgSGFzaChpbnQgdmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9Ci0jZGVmaW5lIE1ZX0hBU0hfQkFTRSBzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDxBLEI+Ci0KLXRlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQj4KLWNsYXNzIGxlZGFfaF9hcnJheSA6IHB1YmxpYyBNWV9IQVNIX0JBU0UKLXsKLXByaXZhdGU6Ci0gIEIgaW5pdDsKLXB1YmxpYzoKLSAgbGVkYV9oX2FycmF5KCkge30KLSAgbGVkYV9oX2FycmF5KGNvbnN0IEImX2luaXQpCi0gICAgOiBNWV9IQVNIX0JBU0UoKSxpbml0KF9pbml0KSB7fQotICBib29sIGRlZmluZWQoY29uc3QgQSZhKSBjb25zdAotICAgIHsgcmV0dXJuIGZpbmQoYSkhPXRoaXMtPmVuZCgpOyB9Ci0gIGNvbnN0IEImb3BlcmF0b3JbXShjb25zdCBBJmEpY29uc3QKLSAgICB7IAotICAgICAgdHlwZW5hbWUgTVlfSEFTSF9CQVNFOjpjb25zdF9pdGVyYXRvciBwb3M9dGhpcy0+ZmluZChhKTsKLSAgICAgIAotICAgICAgaWYoIHBvcz09dGhpcy0+ZW5kKCkgKQotCXJldHVybiBpbml0OwotICAgICAgZWxzZQotCXJldHVybiBwb3MtPnNlY29uZDsKLSAgICB9Ci0gIEImb3BlcmF0b3JbXShjb25zdCBBJmEpCi0gICAgeyAKLSAgICAgIHR5cGVuYW1lIE1ZX0hBU0hfQkFTRTo6aXRlcmF0b3IgcG9zPXRoaXMtPmZpbmQoYSk7Ci0gICAgICBpZiggcG9zPT10aGlzLT5lbmQoKSApCi0JewotCSAgdGhpcy0+aW5zZXJ0KHR5cGVuYW1lIE1ZX0hBU0hfQkFTRTo6dmFsdWVfdHlwZShhLGluaXQpKTsKLQkgIHBvcz10aGlzLT5maW5kKGEpOwotCSAgaWFzc2VydChwb3MhPXRoaXMtPmVuZCgpKTsKLQl9Ci0gICAgICByZXR1cm4gcG9zLT5zZWNvbmQ7Ci0gICAgfQotfTsKLQotI2RlZmluZSBmb3JhbGxfZGVmaW5lZF9oKGEsYixjLGQpIGZvcih0eXBlbmFtZSBsZWRhX2hfYXJyYXk8YSxiPjo6Y29uc3RfaXRlcmF0b3IgX19qal9fPShkKS5iZWdpbigpO19fampfXyE9KGQpLmVuZCgpJiYoKGM9X19qal9fLT5maXJzdCksMSk7ICsrX19qal9fKQotI2RlZmluZSBmb3JhbGxfZGVmaW5lZF9oMihhLGIsYyxkKSBmb3IobGVkYV9oX2FycmF5PGEsYj46OmNvbnN0X2l0ZXJhdG9yIF9fampfXz0oZCkuYmVnaW4oKTtfX2pqX18hPShkKS5lbmQoKSYmKChjPV9fampfXy0+Zmlyc3QpLDEpOyArK19fampfXykKLSNkZWZpbmUgZm9yYWxsX2goYSxiLGMsZCkgICAgICAgICBmb3IodHlwZW5hbWUgbGVkYV9oX2FycmF5PGEsYj46OmNvbnN0X2l0ZXJhdG9yIF9fampqX189KGQpLmJlZ2luKCk7X19qampfXyE9KGQpLmVuZCgpJiYoKGM9X19qampfXy0+c2Vjb25kKSwxKTsrK19fampqX18pCi0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gaW50IGNvbXBhcmUoY29uc3QgVCZhLGNvbnN0IFQmYikKLXtpZihhPT1iKXJldHVybiAwOyBlbHNlIGlmKGE8YikgcmV0dXJuIC0xOyBlbHNlIHJldHVybiAxO30KLQotdGVtcGxhdGU8Y2xhc3MgVCxjbGFzcyBVPgotb3N0cmVhbSAmIG9wZXJhdG9yPDwob3N0cmVhbSZvdXQsY29uc3QgbGVkYV9oX2FycmF5PFQsVT4mdykKLXsKLSAgVCB0OwotICBib29sIG1ha2VObD0wOwotICBvdXQgPDwgImhfYXJyYXl7IjsKLSAgZm9yYWxsX2RlZmluZWRfaChULFUsdCx3KQotICAgIHsKLSAgICAgIGlmKCBtYWtlTmwgKQotCW91dCA8PCAiXG4gICAgICAgIjsKLSAgICAgIG91dCA8PCAiRUw6IiA8PCB0IDw8ICIgSU5IOiIgPDwgd1t0XSA8PCAiLiI7Ci0gICAgICBtYWtlTmw9MTsKLSAgICB9Ci0gIHJldHVybiBvdXQgPDwgIn1cbiI7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBULGNsYXNzIFU+Ci1vc3RyZWFtICYgb3BlcmF0b3I8PChvc3RyZWFtJm91dCxjb25zdCBsZWRhX2RfYXJyYXk8VCxVPiZ3KQotewotICBUIHQ7Ci0gIGJvb2wgbWFrZU5sPTA7Ci0gIG91dCA8PCAiaF9hcnJheXsiOwotICBmb3JhbGxfZGVmaW5lZF9oKFQsVSx0LHcpCi0gICAgewotICAgICAgaWYoIG1ha2VObCApCi0Jb3V0IDw8ICJcbiAgICAgICAiOwotICAgICAgb3V0IDw8ICJFTDoiIDw8IHQgPDwgIiBJTkg6IiA8PCB3W3RdIDw8ICIuIjsKLSAgICAgIG1ha2VObD0xOwotICAgIH0KLSAgcmV0dXJuIG91dCA8PCAifVxuIjsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLW9zdHJlYW0mcHJpbnRTZXQob3N0cmVhbSZvdXQsY29uc3QgbGVkYV9zZXQ8VD4mcykKLXsKLSAgYm9vbCBmaXJzdD0xOwotICBUIHQ7Ci0gIG91dCA8PCAieyI7Ci0gIGZvcmFsbF9zZXQodHlwZW5hbWUgc2V0PFQ+LHQscykKLSAgICB7Ci0gICAgICBpZiggZmlyc3Q9PTAgKQotCW91dCA8PCAiLCAiOwotICAgICAgb3V0IDw8IHQ7Ci0gICAgICBmaXJzdD0wOwotICAgIH0KLSAgcmV0dXJuIG91dCA8PCAifVxuIjsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVCxjbGFzcyBVPgotaXN0cmVhbSAmIG9wZXJhdG9yPj4oaXN0cmVhbSZpbixsZWRhX2hfYXJyYXk8VCxVPiYpCi17Ci0gIHJldHVybiBpbjsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCPgotYm9vbCBvcGVyYXRvcj09KGNvbnN0IGxlZGFfaF9hcnJheTxBLEI+JnAxLGNvbnN0IGxlZGFfaF9hcnJheTxBLEI+JnAyKQotewotICBBIHY7Ci0gIGZvcmFsbF9kZWZpbmVkX2goQSxCLHYscDEpCi0gICAgaWYoICEoIHAxW3ZdPT1wMlt2XSkgKSByZXR1cm4gMDsKLSAgZm9yYWxsX2RlZmluZWRfaChBLEIsdixwMikKLSAgICBpZiggISggcDFbdl09PXAyW3ZdKSApIHJldHVybiAwOwotICByZXR1cm4gMTsgCi19Ci10ZW1wbGF0ZTxjbGFzcyBBLGNsYXNzIEI+Ci1ib29sIG9wZXJhdG9yPT0oY29uc3QgbGVkYV9kX2FycmF5PEEsQj4mcDEsY29uc3QgbGVkYV9kX2FycmF5PEEsQj4mcDIpCi17Ci0gIEEgdjsKLSAgZm9yYWxsX2RlZmluZWRfZChBLEIsdixwMSkKLSAgICBpZiggISggcDFbdl09PXAyW3ZdKSApIHJldHVybiAwOwotICBmb3JhbGxfZGVmaW5lZF9kKEEsQix2LHAyKQotICAgIGlmKCAhKCBwMVt2XT09cDJbdl0pICkgcmV0dXJuIDA7Ci0gIHJldHVybiAxOyAKLX0KLQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL215c3RsLmggYi9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvbXlzdGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViMzExZi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvbXlzdGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSAgRnJhbnogSm9zZWYgT2NoCi0KLW1rY2xzIC0gYSBwcm9ncmFtIGZvciBtYWtpbmcgd29yZCBjbGFzc2VzIC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi1vZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIAotVVNBLgotCi0qLwotCi0KLQotI2lmbmRlZiBNWV9TVExfSF9ERUZJTkVECi0jZGVmaW5lIE1ZX1NUTF9IX0RFRklORUQKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx0cjEvdW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlIDxjbWF0aD4KLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotbmFtZXNwYWNlIHN0ZCB7Ci0gbmFtZXNwYWNlIHRyMSB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBWPgotICBzdHJ1Y3QgaGFzaDxwYWlyPFQsIFY+ID4gewotICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBoYXNoX2NvbWJpbmUoc3RkOjpzaXplX3QgJiBzZWVkLCBjb25zdCBUICYgdikgewotICAgICAgIGhhc2g8VD4gaGFzaGVyOwotICAgICAgIHNlZWQgXj0gaGFzaGVyKHYpICsgMHg5ZTM3NzliOSArIChzZWVkIDw8IDYpICsgKHNlZWQgPj4gMik7Ci0gICAgfQotCi0gICAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPFQsIFY+JiB4KSBjb25zdCB7Ci0gICAgICBzaXplX3QgaCA9IDA7Ci0gICAgICBoYXNoX2NvbWJpbmUoaCwgeC5maXJzdCk7Ci0gICAgICBoYXNoX2NvbWJpbmUoaCwgeC5zZWNvbmQpOwotICAgICAgcmV0dXJuIGg7Ci0gICAgfQotICB9OwotIH0KLX0KLQotI2RlZmluZSBvdmVyX3N0cmluZyhhLGkpIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8YS5sZW5ndGgoKTtpKyspCi0KLXRlbXBsYXRlPGNsYXNzIFQxLGNsYXNzIFQyPgotaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtICZpbixwYWlyPFQxLFQyPiAmaXIpCi17Ci0gY2hhciBjOwotIGRvIGluLmdldChjKTsgd2hpbGUgKGluICYmIGlzc3BhY2UoYykpOwotIGlmICghaW4pIHJldHVybiBpbjsKLSBpZiAoYyAhPSAnKCcpIGluLnB1dGJhY2soYyk7Ci0gaW4gPj4gaXIuZmlyc3Q7Ci0gZG8gaW4uZ2V0KGMpOyB3aGlsZSAoaXNzcGFjZShjKSk7Ci0gaWYgKGMgIT0gJywnKSBpbi5wdXRiYWNrKGMpOwotIGluID4+IGlyLnNlY29uZDsgCi0gZG8gaW4uZ2V0KGMpOyB3aGlsZSAoYyA9PSAnICcpOwotIGlmIChjICE9ICcpJykgaW4ucHV0YmFjayhjKTsKLSByZXR1cm4gaW47IAotfQotCi10ZW1wbGF0ZTxjbGFzcyBUMSxjbGFzcyBUMj4KLW9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSAmb3V0LGNvbnN0IHBhaXI8VDEsVDI+ICZpcikKLXsgCi0gIG91dCA8PCAiKCIgPDwgaXIuZmlyc3QgPDwgIiwiIDw8IGlyLnNlY29uZCA8PCAiKSI7Ci0gIHJldHVybiBvdXQ7Ci19IAotCi12b2lkIHByaW50U3BhY2VzKG9zdHJlYW0mb3V0LGludCBuKTsKLXZvaWQgbXlzcGxpdChjb25zdCBzdHJpbmcgJnMsc3RyaW5nICZzMSxzdHJpbmcgJnMyKTsKLXN0cmluZyB1bnRpbENoYXIoY29uc3Qgc3RyaW5nJnMsY2hhciBjKTsKLQotdGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCLGNsYXNzIEM+Ci1jbGFzcyB0cmkKLXsKLXB1YmxpYzoKLSAgQSBhOwotICBCIGI7Ci0gIEMgYzsKLSAgdHJpKCl7fTsKLSAgdHJpKGNvbnN0IEEmX2EsY29uc3QgQiZfYixjb25zdCBDJl9jKQotICAgIDogYShfYSksYihfYiksYyhfYykge30KLX07Ci10ZW1wbGF0ZTxjbGFzcyBBLGNsYXNzIEIsY2xhc3MgQz4KLWJvb2wgb3BlcmF0b3I9PShjb25zdCB0cmk8QSxCLEM+JngsY29uc3QgdHJpPEEsQixDPiZ5KQoteyByZXR1cm4geC5hPT15LmEmJnguYj09eS5iJiZ4LmM9PXkuYzt9Ci0KLXRlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQixjbGFzcyBDPgotYm9vbCBvcGVyYXRvcjwoY29uc3QgdHJpPEEsQixDPiZ4LGNvbnN0IHRyaTxBLEIsQz4meSkKLXsKLSAgaWYoeC5hPHkuYSkKLSAgICByZXR1cm4gMTsKLSAgaWYoeS5hPHguYSkKLSAgICByZXR1cm4gMDsKLQotICBpZih4LmI8eS5iKQotICAgIHJldHVybiAxOwotICBpZih5LmI8eC5iKQotICAgIHJldHVybiAwOwotCi0gIGlmKHguYzx5LmMpCi0gICAgcmV0dXJuIDE7Ci0gIGlmKHkuYzx4LmMpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvbm9ybWFsaXplLXB1bmN0dWF0aW9uLnBsIGIvc2NyaXB0cy90cmFpbmluZy9ub3JtYWxpemUtcHVuY3R1YXRpb24ucGwKaW5kZXggZjM3ZTU4Ni4uOGYzZjA4MiAxMDA3NTUKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9ub3JtYWxpemUtcHVuY3R1YXRpb24ucGwKKysrIGIvc2NyaXB0cy90cmFpbmluZy9ub3JtYWxpemUtcHVuY3R1YXRpb24ucGwKQEAgLTcsNiArNyw3IEBACiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogdXNlIHV0Zjg7Cit1c2UgdjUuMTI7CiAKIGJpbm1vZGUoU1RESU4sICI6dXRmOCIpOwogYmlubW9kZShTVERPVVQsICI6dXRmOCIpOwpAQCAtNzgsNyArNzksNyBAQAogICAgIHMvKFwuKylcIihccypbXjxdKS9cIiQxJDIvZzsgIyBkb24ndCBmaXggcGVyaW9kIGF0IGVuZCBvZiBzZW50ZW5jZQogICB9CiAKLSAgcHJpbnQgU1RERVJSICRfIGlmIC/vu78vOworIyAgcHJpbnQgU1RERVJSICJCQUQgTElORSAod2l0aCA8ZmVmZj4pOiAkXyIgaWYgL++7vy87CiAKICAgaWYgKCRsYW5ndWFnZSBlcSAiZGUiIHx8ICRsYW5ndWFnZSBlcSAiZXMiIHx8ICRsYW5ndWFnZSBlcSAiY3oiIHx8ICRsYW5ndWFnZSBlcSAiY3MiIHx8ICRsYW5ndWFnZSBlcSAiZnIiKSB7CiAgICAgcy8oXGQpXHhBMChcZCkvJDEsJDIvZzsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvcGFyYWxpZ24ucGwgYi9zY3JpcHRzL3RyYWluaW5nL3BhcmFsaWduLnBsCmluZGV4IGQxOThiNTQuLmQ1MTU5YTcgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvcGFyYWxpZ24ucGwKKysrIGIvc2NyaXB0cy90cmFpbmluZy9wYXJhbGlnbi5wbApAQCAtMjQsNiArMjQsOCBAQAogICAkYXJnc3tsYyAka2V5fSA9ICR2YWx1ZTsKIH0KIAorbXkgJGFsaWduZXJfY29uZiA9ICRhcmdze2NvbmZ9IHx8ICIkSk9TSFVBL3NjcmlwdHMvdHJhaW5pbmcvdGVtcGxhdGVzL2FsaWdubWVudC93b3JkLWFsaWduLmNvbmYiOworCiBteSAkY2FjaGVwaXBlID0gbmV3IENhY2hlUGlwZSgpOwogJGNhY2hlcGlwZS0+b21pdF9jbWQoKTsKIApAQCAtMzksNyArNDEsNyBAQAogICBpZiAoJGFyZ3N7YWxpZ25lcn0gZXEgImdpemEiKSB7CiAgICAgcnVuX2dpemEoJGNodW5rZGlyLCAkY2h1bmtubywgJGFyZ3N7bnVtX3RocmVhZHN9ID4gMSk7CiAgIH0gZWxzaWYgKCRhcmdze2FsaWduZXJ9IGVxICJiZXJrZWxleSIpIHsKLSAgICBydW5fYmVya2VsZXlfYWxpZ25lcigkY2h1bmtkaXIsICRjaHVua25vKTsKKyAgICBydW5fYmVya2VsZXlfYWxpZ25lcigkY2h1bmtkaXIsICRjaHVua25vLCAkYWxpZ25lcl9jb25mKTsKICAgfSBlbHNpZiAoJGFyZ3N7YWxpZ25lcn0gZXEgImphY2FuYSIpIHsKICAgICBydW5famFjYW5hX2FsaWduZXIoJGNodW5rZGlyLCAkY2h1bmtubyk7CiAgIH0KQEAgLTU5LDEwICs2MSwxMCBAQAogfQogCiBzdWIgcnVuX2JlcmtlbGV5X2FsaWduZXIgewotICBteSAoJGNodW5rZGlyLCRjaHVua25vKSA9IEBfOworICBteSAoJGNodW5rZGlyLCAkY2h1bmtubywgJGFsaWduZXJfY29uZikgPSBAXzsKIAogICAjIGNvcHkgYW5kIG1vZGlmeSB0aGUgY29uZmlnIGZpbGUKLSAgb3BlbiBGUk9NLCAiJEpPU0hVQS9zY3JpcHRzL3RyYWluaW5nL3RlbXBsYXRlcy9hbGlnbm1lbnQvd29yZC1hbGlnbi5jb25mIiBvciBkaWUgImNhbid0IHJlYWQgYmVya2VsZXkgYWxpZ25tZW50IHRlbXBsYXRlIjsKKyAgb3BlbiBGUk9NLCAkYWxpZ25lcl9jb25mIG9yIGRpZSAiY2FuJ3QgcmVhZCBiZXJrZWxleSBhbGlnbm1lbnQgdGVtcGxhdGUiOwogICBvcGVuIFRPLCAiPiIsICJhbGlnbm1lbnRzLyRjaHVua25vL3dvcmQtYWxpZ24uY29uZiIgb3IgZGllICJjYW4ndCB3cml0ZSB0byAnYWxpZ25tZW50cy8kY2h1bmtuby93b3JkLWFsaWduLmNvbmYnIjsKICAgd2hpbGUgKDxGUk9NPikgewogICAgIHMvPFNPVVJDRT4vJGFyZ3N7c291cmNlfS4kY2h1bmtuby9nOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9wYXN0ZSBiL3NjcmlwdHMvdHJhaW5pbmcvcGFzdGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGE2ZjliZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvdHJhaW5pbmcvcGFzdGUKQEAgLTAsMCArMSwyNyBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMgIlNhZmUiIHZlcnNpb24gb2YgcGFzdGUgdGhhdCBkaWVzIGlmIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIEZpbGVIYW5kbGU7Cit1c2UgTGlzdDo6VXRpbCBxdy9zdW0gcmVkdWNlLzsKKworYmlubW9kZSBTVERJTiwgJzp1dGY4JzsKK2Jpbm1vZGUgU1RET1VULCAnOnV0ZjgnOworCitteSBAZmggPSBtYXAgeyBuZXcgRmlsZUhhbmRsZSgkXywgIjwgOmVuY29kaW5nKFVURi04KSIpIH0gQEFSR1Y7CisKK2ZvciAoOzspIHsKKyAgbXkgQGxpbmVzID0gbWFwIHsgJF8tPmdldGxpbmUgfSBAZmg7CisgIAorICBteSAkbnVtX2RvbmUgPSBncmVwIHsgISBkZWZpbmVkICRfIH0gQGxpbmVzOworICBpZiAoJG51bV9kb25lID4gMCBhbmQgJG51bV9kb25lIDwgQGxpbmVzKSB7CisgICAgcHJpbnQgU1RERVJSICIqIEZBVEFMISB1bmVxdWFsIGZpbGUgbGVuZ3Rocy5cbiI7CisgICAgZXhpdCAxOworICB9CisgIGxhc3QgaWYgJG51bV9kb25lID09IEBsaW5lczsKKworICBjaG9tcChAbGluZXMpOworICBwcmludCBqb2luKCJcdCIsIEBsaW5lcykgLiAkLzsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvcGVubi10cmVlYmFuay10b2tlbml6ZXIucGVybCBiL3NjcmlwdHMvdHJhaW5pbmcvcGVubi10cmVlYmFuay10b2tlbml6ZXIucGVybAppbmRleCBjYTQ5NzYzLi4yYjIxNjVlIDEwMDc1NQotLS0gYS9zY3JpcHRzL3RyYWluaW5nL3Blbm4tdHJlZWJhbmstdG9rZW5pemVyLnBlcmwKKysrIGIvc2NyaXB0cy90cmFpbmluZy9wZW5uLXRyZWViYW5rLXRva2VuaXplci5wZXJsCkBAIC02LDE4ICs2LDE1IEBACiBiaW5tb2RlKFNURElOLCAiOmVuY29kaW5nKHV0ZjgpIik7CiBiaW5tb2RlKFNURE9VVCwgIjplbmNvZGluZyh1dGY4KSIpOwogCi11c2UgRmluZEJpbiBxdygkQmluKTsKIHVzZSBzdHJpY3Q7Ci0jdXNlIFRpbWU6OkhpUmVzOwogCi1teSAkbXlkaXIgPSAiJEJpbi9ub25icmVha2luZ19wcmVmaXhlcyI7CitteSAkbXlkaXIgPSAiJEVOVntKT1NIVUF9L3NjcmlwdHMvdHJhaW5pbmcvbm9uYnJlYWtpbmdfcHJlZml4ZXMiOwogCiBteSAlTk9OQlJFQUtJTkdfUFJFRklYID0gKCk7CiBteSAkbGFuZ3VhZ2UgPSAiZW4iOwotbXkgJFFVSUVUID0gMDsKK215ICRRVUlFVCA9IDE7CiBteSAkSEVMUCA9IDA7CiAKLQogbXkgJHVzZV9wZW5uX3RyZWViYW5rX3Rva2VuaXphdGlvbiA9IDE7CiAKICNteSAkc3RhcnQgPSBbIFRpbWU6OkhpUmVzOjpnZXR0aW1lb2ZkYXkoICkgXTsKQEAgLTI1LDcgKzIyLDcgQEAKIHdoaWxlIChAQVJHVikgewogCSRfID0gc2hpZnQ7CiAJL14tbCQvICYmICgkbGFuZ3VhZ2UgPSBzaGlmdCwgbmV4dCk7Ci0JL14tcSQvICYmICgkUVVJRVQgPSAxLCBuZXh0KTsKKwkvXi12JC8gJiYgKCRRVUlFVCA9IDAsIG5leHQpOwogCS9eLWgkLyAmJiAoJEhFTFAgPSAxLCBuZXh0KTsKIH0KIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9waXBlbGluZS5wbCBiL3NjcmlwdHMvdHJhaW5pbmcvcGlwZWxpbmUucGwKaW5kZXggYWU0MjUzMi4uOTJkZGJiNSAxMDA3NTUKLS0tIGEvc2NyaXB0cy90cmFpbmluZy9waXBlbGluZS5wbAorKysgYi9zY3JpcHRzL3RyYWluaW5nL3BpcGVsaW5lLnBsCkBAIC0zOSwxNCArMzksMTQgQEAKIAogbXkgJEhBRE9PUCA9ICRFTlZ7SEFET09QfTsKIG15ICRNT1NFUyA9ICRFTlZ7TU9TRVN9OwotZGVsZXRlICRFTlZ7R1JFUF9PUFRJT05TfTsKLQorbXkgJE1FVEVPUiA9ICRFTlZ7TUVURU9SfTsKIG15ICRUSFJBWCA9ICIkSk9TSFVBL3RocmF4IjsKK2RlbGV0ZSAkRU5We0dSRVBfT1BUSU9OU307CiAKIGRpZSBub3RfZGVmaW5lZCgiSkFWQV9IT01FIikgdW5sZXNzIGV4aXN0cyAkRU5We0pBVkFfSE9NRX07CiAKIG15IChAQ09SUE9SQSwkVFVORSwkVEVTVCwkQUxJR05NRU5ULCRTT1VSQ0UsJFRBUkdFVCxATE1GSUxFUywkR1JBTU1BUl9GSUxFLCRHTFVFX0dSQU1NQVJfRklMRSwkX1RVTkVfR1JBTU1BUl9GSUxFLCRfVEVTVF9HUkFNTUFSX0ZJTEUsJFRIUkFYX0NPTkZfRklMRSwgJF9KT1NIVUFfQ09ORklHLCAkX0pPU0hVQV9BUkdTKTsKLW15ICRGSVJTVF9TVEVQID0gIkZJUlNUIjsKK215ICRGSVJTVF9TVEVQID0gIlNVQlNBTVBMRSI7CiBteSAkTEFTVF9TVEVQICA9ICJMQVNUIjsKIG15ICRMTUZJTFRFUiA9ICIkRU5We0hPTUV9L2NvZGUvZmlsdGVyL2ZpbHRlciI7CiAKQEAgLTc3LDcgKzc3LDcgQEAKIG15ICRCVU5ETEVSID0gIiRKT1NIVUEvc2NyaXB0cy9zdXBwb3J0L3J1bl9idW5kbGVyLnB5IjsKIG15ICRTVEFSVERJUjsKIG15ICRSVU5ESVIgPSAkU1RBUlRESVIgPSBnZXRjd2QoKTsKLW15ICRHUkFNTUFSX1RZUEUgPSAiaGllcm8iOyAgIyBvciAiaXRnIiBvciAic2FtdCIgb3IgImdoa20iIG9yICJwaHJhc2UiIG9yICJwaHJhc2FsIgorbXkgJEdSQU1NQVJfVFlQRSA9IHVuZGVmOyAjIGhpZXJvLCBpdGcsIHNhbXQsIGdoa20sIHBocmFzZSwgb3IgbW9zZXMKIG15ICRTRUFSQ0hfQUxHT1JJVEhNID0gImNreSI7ICMgb3IgInN0YWNrIiAoZm9yIHBocmFzZS1iYXNlZCkKIAogIyBXaGljaCBHSEtNIGV4dHJhY3RvciB0byB1c2UgKCJnYWxsZXkiIG9yICJtb3NlcyIpCkBAIC05Miw2ICs5Miw5IEBACiAjIGd6aXAtYXdhcmUgY2F0CiBteSAkQ0FUID0gIiRTQ1JJUFRESVIvdHJhaW5pbmcvc2NhdCI7CiAKKyMgY3VzdG9tIHZlcnNpb24gb2YgcGFzdGUgdGhhdCBkaWVzIG9uIHVuZXF1YWwgZmlsZSBsZW5ndGhzCitteSAkUEFTVEUgPSAiJFNDUklQVERJUi90cmFpbmluZy9wYXN0ZSI7CisKICMgd2hlcmUgcHJvY2Vzc2VkIGRhdGEgZmlsZXMgYXJlIHN0b3JlZAogbXkgJERBVEFfRElSID0gImRhdGEiOwogCkBAIC0xMDAsNiArMTAzLDcgQEAKIAogIyBXaGljaCBhbGlnbmVyIHRvIHVzZS4gVGhlIG9wdGlvbnMgYXJlICJnaXphIiBvciAiYmVya2VsZXkiLgogbXkgJEFMSUdORVIgPSAiZ2l6YSI7ICMgImJlcmtlbGV5IiBvciAiZ2l6YSIgb3IgImphY2FuYSIKK215ICRBTElHTkVSX0NPTkYgPSAiJEpPU0hVQS9zY3JpcHRzL3RyYWluaW5nL3RlbXBsYXRlcy9hbGlnbm1lbnQvd29yZC1hbGlnbi5jb25mIjsKIAogIyBGaWx0ZXIgcnVsZXMgdG8gdGhlIGZvbGxvd2luZyBtYXhpbXVtIHNjb3BlIChIb3BraW5zICYgTGFuZ21lYWQsIDIwMTEpLgogbXkgJFNDT1BFID0gMzsKQEAgLTE2NiwxOSArMTcwLDE5IEBACiBteSAkRE9fQlVJTERfQ0xBU1NfTE0gPSAwOwogbXkgJENMQVNTX0xNX0NPUlBVUyA9IHVuZGVmOwogbXkgJENMQVNTX01BUCA9IHVuZGVmOwotbXkgJENMQVNTX0xNX09SREVSID0gOTsKK215ICRDTEFTU19MTV9PUkRFUiA9IDU7CiAKICMgd2hldGhlciB0byB0b2tlbml6ZSBhbmQgbG93ZXJjYXNlIHRyYWluaW5nLCB0dW5pbmcsIGFuZCB0ZXN0IGRhdGEKIG15ICRET19QUkVQQVJFX0NPUlBPUkEgPSAxOwogCi0jIGhvdyBtYW55IG9wdGltaXplciBydW5zIHRvIHBlcmZvcm0KLW15ICRPUFRJTUlaRVJfUlVOUyA9IDE7CisjIGNvbXB1dGUgdGhlIG50aCBvcHRpbWl6ZXIgcnVuCitteSAkT1BUSU1JWkVSX1JVTiA9IDE7CiAKICMgd2hhdCB0byB1c2UgdG8gY3JlYXRlIGxhbmd1YWdlIG1vZGVscyAoImJlcmtlbGV5bG0iIG9yICJzcmlsbSIpCiBteSAkTE1fR0VOID0gImtlbmxtIjsKIG15ICRMTV9PUFRJT05TID0gIiI7CiAKLW15IEBTVEVQUyA9IHF3W0ZJUlNUIFNVQlNBTVBMRSBBTElHTiBQQVJTRSBUSFJBWCBHUkFNTUFSIFBIUkFTRSBUVU5FIE1FUlQgUFJPIFRFU1QgTEFTVF07CitteSBAU1RFUFMgPSBxd1tGSVJTVCBTVUJTQU1QTEUgQUxJR04gUEFSU0UgVEhSQVggTU9ERUwgR1JBTU1BUiBQSFJBU0UgVFVORSBNRVJUIFBSTyBURVNUIExBU1RdOwogbXkgJVNURVBTID0gbWFwIHsgJFNURVBTWyRfXSA9PiAkXyArIDEgfSAoMC4uJCNTVEVQUyk7CiAKICMgTWV0aG9kcyB0byB1c2UgZm9yIG1lcmdpbmcgYWxpZ25tZW50cyAoc2VlIEtvZWhuIGV0IGFsLiwgMjAwMykuCkBAIC0xODksNyArMTkzLDExIEBACiBteSAkTUVSR0VfTE1TID0gMDsKIAogIyBXaGljaCB0dW5lciB0byB1c2UgYnkgZGVmYXVsdAotbXkgJFRVTkVSID0gIm1lcnQiOyAgIyBvciBwcm8sIG1pcmEsIG9yIGtibWlyYSAodGhlIGxhdHRlciBjYWxsaW5nIG91dCB0byBNb3NlcykKK215IEBUVU5FUlMgPSAoIm1lcnQiLCAicHJvIiwgIm1pcmEiLCAiYWRhZ3JhZCIsICJrYm1pcmEiKTsKK215ICRUVU5FUiA9ICJtZXJ0IjsKKworIyBUaGUgbWV0cmljIHRvIHVwZGF0ZSB0bworbXkgJE1FVFJJQyA9ICJCTEVVIDQgY2xvc2VzdCI7CiAKICMgVGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG9mIHRoZSBtaXJhIHRvIHJ1bgogbXkgJFRVTkVSX0lURVJBVElPTlMgPSAxNTsKQEAgLTIyMSw2ICsyMjksNyBAQAogICAiYWxpZ25lcj1zIiAgICAgICAgID0+IFwkQUxJR05FUiwKICAgImFsaWdubWVudD1zIiAgICAgID0+IFwkQUxJR05NRU5ULAogICAiYWxpZ25lci1tZW09cyIgICAgID0+IFwkQUxJR05FUl9NRU0sCisgICJhbGlnbmVyLWNvbmY9cyIgICA9PiBcJEFMSUdORVJfQ09ORiwKICAgImdpemEtbWVyZ2U9cyIgICAgICA9PiBcJEdJWkFfTUVSR0UsCiAgICJzb3VyY2U9cyIgICAgICAgICAgPT4gXCRTT1VSQ0UsCiAgICJ0YXJnZXQ9cyIgICAgICAgICA9PiBcJFRBUkdFVCwKQEAgLTIzOSw3ICsyNDgsNyBAQAogICAidHVuZS1ncmFtbWFyPXMiICAgID0+IFwkX1RVTkVfR1JBTU1BUl9GSUxFLAogICAidGVzdC1ncmFtbWFyPXMiICAgID0+IFwkX1RFU1RfR1JBTU1BUl9GSUxFLAogICAiZ3JhbW1hcj1zIiAgICAgICAgPT4gXCRHUkFNTUFSX0ZJTEUsCi0gICJnbHVlLWdyYW1tYXI9cyIgICAgID0+IFwkR0xVRV9HUkFNTUFSX0ZJTEUsCisgICJtb2RlbD1zIiAgICAgICAgICA9PiBcJEdSQU1NQVJfRklMRSwKICAgIm1heHNwYW49aSIgICAgICAgICA9PiBcJE1BWFNQQU4sCiAgICJtYnIhIiAgICAgICAgICAgICAgPT4gXCRET19NQlIsCiAgICJ0eXBlPXMiICAgICAgICAgICA9PiBcJEdSQU1NQVJfVFlQRSwKQEAgLTI1MCw2ICsyNTksNyBAQAogICAibWF4bGVuLXRlc3Q9aSIgICAgICAgID0+IFwkTUFYTEVOX1RFU1QsCiAgICJ0b2tlbml6ZXItc291cmNlPXMiICAgICAgPT4gXCRUT0tFTklaRVJfU09VUkNFLAogICAidG9rZW5pemVyLXRhcmdldD1zIiAgICAgID0+IFwkVE9LRU5JWkVSX1RBUkdFVCwKKyAgIm5vcm1hbGl6ZXI9cyIgICAgICA9PiBcJE5PUk1BTElaRVIsCiAgICJqb3NodWEtY29uZmlnPXMiICAgPT4gXCRfSk9TSFVBX0NPTkZJRywKICAgImpvc2h1YS1hcmdzPXMiICAgICAgPT4gXCRfSk9TSFVBX0FSR1MsCiAgICJqb3NodWEtbWVtPXMiICAgICAgPT4gXCRKT1NIVUFfTUVNLApAQCAtMjYxLDYgKzI3MSw3IEBACiAgICJ0dW5lcj1zIiAgICAgICAgICAgPT4gXCRUVU5FUiwKICAgInR1bmVyLW1lbT1zIiAgICAgICA9PiBcJFRVTkVSX01FTSwKICAgInR1bmVyLWl0ZXJhdGlvbnM9aSIgPT4gXCRUVU5FUl9JVEVSQVRJT05TLAorICAidHVuZXItbWV0cmljPXMiICAgID0+IFwkTUVUUklDLAogICAidGhyYXg9cyIgICAgICAgICAgID0+IFwkVEhSQVgsCiAgICJ0aHJheC1jb25mPXMiICAgICAgPT4gXCRUSFJBWF9DT05GX0ZJTEUsCiAgICJqb2JzPWkiICAgICAgICAgICAgPT4gXCROVU1fSk9CUywKQEAgLTI4MSw2ICsyOTIsNyBAQAogICAiY2xhc3MtbG0hIiAgICAgPT4gXCRET19CVUlMRF9DTEFTU19MTSwKICAgImNsYXNzLWxtLWNvcnB1cz1zIiAgID0+IFwkQ0xBU1NfTE1fQ09SUFVTLAogICAiY2xhc3MtbWFwPXMiICAgICA9PiBcJENMQVNTX01BUCwKKyAgIm9wdGltaXplci1ydW49aSIgPT4gXCRPUFRJTUlaRVJfUlVOLAogKTsKIAogaWYgKCEgJHJldHZhbCkgewpAQCAtMjk0LDggKzMwNiw3IEBACiAKIG15ICRET0lOR19MQVRUSUNFUyA9IDA7CiAKLSMgUHJlcGVuZCBhIHNwYWNlIHRvIHRoZSBhcmd1bWVudHMgbGlzdCBpZiBpdCdzIG5vbi1lbXB0eSBhbmQgZG9lc24ndCBhbHJlYWR5IGhhdmUgdGhlIHNwYWNlLgotbXkgJEpPU0hVQV9BUkdTID0gJF9KT1NIVUFfQVJHUzsKK215ICRKT1NIVUFfQVJHUyA9IChkZWZpbmVkICRfSk9TSFVBX0FSR1MpID8gJF9KT1NIVUFfQVJHUyA6ICIiOwogCiBteSAlREFUQV9ESVJTID0gKAogICB0cmFpbiA9PiBnZXRfYWJzb2x1dGVfcGF0aCgiJFJVTkRJUi8kREFUQV9ESVIvdHJhaW4iKSwKQEAgLTMwMyw2ICszMTQsMTEgQEAKICAgdGVzdCAgPT4gZ2V0X2Fic29sdXRlX3BhdGgoIiRSVU5ESVIvJERBVEFfRElSL3Rlc3QiKSwKICk7CiAKK2lmICghIC14ICROT1JNQUxJWkVSKSB7CisgIHByaW50ICIqIEZBVEFMOiBjb3VsZG4ndCBmaW5kIG5vcm1hbGl6ZXIgJyROT1JNQUxJWkVSJ1xuIjsKKyAgZXhpdCAxOworfQorCiAjIGNhcGl0YWxpemUgdGhlc2UgdG8gb2Zmc2V0IGEgY29tbW9uIGVycm9yOgogJEZJUlNUX1NURVAgPSB1YygkRklSU1RfU1RFUCk7CiAkTEFTVF9TVEVQICA9IHVjKCRMQVNUX1NURVApOwpAQCAtMzY0LDEwICszODAsMTYgQEAKICAgfQogfQogCitteSBAR1JBTU1BUl9UWVBFUyA9IHF3L2hpZXJvIHNhbXQgZ2hrbSBwaHJhc2UgbW9zZXMvOworaWYgKCEgZGVmaW5lZCAkR1JBTU1BUl9UWVBFIG9yICEgaW4oJEdSQU1NQVJfVFlQRSxcQEdSQU1NQVJfVFlQRVMpKSB7CisgIHByaW50ICIqIEZBVEFMOiBZb3UgbXVzdCBkZWZpbmUgLS10eXBlICgiIC4gam9pbigifCIsIEBHUkFNTUFSX1RZUEVTKSAuICIpXG4iOworICBleGl0IDQ3OworfQorCiAjIGNhc2Utbm9ybWFsaXplIHRoaXMKICRHUkFNTUFSX1RZUEUgPSBsYyAkR1JBTU1BUl9UWVBFOwogCi1pZiAoJEdSQU1NQVJfVFlQRSBlcSAicGhyYXNlIikgeworaWYgKCRHUkFNTUFSX1RZUEUgZXEgInBocmFzZSIgb3IgJEdSQU1NQVJfVFlQRSBlcSAibW9zZXMiKSB7CiAgICRTRUFSQ0hfQUxHT1JJVEhNID0gInN0YWNrIjsKICAgJE1BWFNQQU4gPSAwOwogfQpAQCAtNTAzLDEzICs1MjUsMTMgQEAKICAgZXhpdCAxOwogfQogCi1pZiAoJEdSQU1NQVJfVFlQRSBlcSAicGhyYXNlIiBhbmQgISBkZWZpbmVkICRNT1NFUykgewotICBwcmludCAiKiBGQVRBTDogYnVpbGRpbmcgcGhyYXNlLWJhc2VkIG1vZGVscyAoLS10eXBlIHBocmFzZSkgcmVxdWlyZXMgc2V0dGluZyB0aGUgTU9TRVMgZW52aXJvbm1lbnQgdmFyaWFibGVcbiI7CitpZiAoJEdSQU1NQVJfVFlQRSBlcSAibW9zZXMiIGFuZCAhIGRlZmluZWQgJE1PU0VTKSB7CisgIHByaW50ICIqIEZBVEFMOiBidWlsZGluZyBNb3NlcyBwaHJhc2UtYmFzZWQgbW9kZWxzICgtLXR5cGUgbW9zZXMpIHJlcXVpcmVzIHNldHRpbmcgdGhlIE1PU0VTIGVudmlyb25tZW50IHZhcmlhYmxlXG4iOwogICBleGl0IDE7CiB9CiAKLWlmICgkVFVORVIgbmUgIm1lcnQiIGFuZCAkVFVORVIgbmUgInptZXJ0IiBhbmQgJFRVTkVSIG5lICJtaXJhIiBhbmQgJFRVTkVSIG5lICJsb2NhbC1taXJhIiBhbmQgJFRVTkVSIG5lICJwcm8iIGFuZCAkVFVORVIgbmUgImtibWlyYSIpIHsKLSAgcHJpbnQgIiogRkFUQUw6IC0tdHVuZXIgbXVzdCBiZSBvbmUgb2YgJ1t6XW1lcnQnLCAncHJvJywgJ1tsb2NhbF0tbWlyYScsIG9yICdrYm1pcmEnLlxuIjsKK2lmICghIGluKCRUVU5FUiwgXEBUVU5FUlMpKSB7CisgIHByaW50ICIqIEZBVEFMOiAtLXR1bmVyIG11c3QgYmUgb25lIG9mICIgLiBqb2luKCIsICIsIEBUVU5FUlMpIC4gJC87CiAgIGV4aXQgMTsKIH0KIApAQCAtNTM2LDcgKzU1OCw3IEBACiAjIyBEZXBlbmRlbnQgdmFyaWFibGUgc2V0dGluZyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLW15ICRPT1YgPSAoJEdSQU1NQVJfVFlQRSBlcSAiaGllcm8iIG9yICRHUkFNTUFSX1RZUEUgZXEgIml0ZyIgb3IgJEdSQU1NQVJfVFlQRSBlcSAicGhyYXNlIikgPyAiWCIgOiAiT09WIjsKK215ICRPT1YgPSAoJEdSQU1NQVJfVFlQRSBlcSAiaGllcm8iIG9yICRHUkFNTUFSX1RZUEUgZXEgIml0ZyIgb3IgJEdSQU1NQVJfVFlQRSBlcSAicGhyYXNlIiBvciAkR1JBTU1BUl9UWVBFIGVxICJtb3NlcyIpID8gIlgiIDogIk9PViI7CiAKICMgVGhlIHBocmFzYWwgc3lzdGVtIHNob3VsZCB1c2UgdGhlIElURyBncmFtbWFyLCBhbGxvd2luZyBmb3IgbGltaXRlZCBkaXN0b3J0aW9uCiBpZiAoJEdSQU1NQVJfVFlQRSBlcSAicGhyYXNhbCIpIHsKQEAgLTU5MCwzMyArNjEyLDI1IEBACiAgIH0KIH0KIAotaWYgKCRGSVJTVF9TVEVQIG5lICJGSVJTVCIpIHsKLSAgaWYgKEBDT1JQT1JBID4gMSkgewotCQlwcmludCAiKiBGQVRBTDogeW91IGNhbid0IHNraXAgc3RlcHMgaWYgeW91IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSAtLWNvcnB1c1xuIjsKLQkJZXhpdCgxKTsKLSAgfQotCi0gIGlmIChldmFsIHsgZ290byAkRklSU1RfU1RFUCB9KSB7Ci0JCXByaW50ICIqIFNraXBwaW5nIHRvIHN0ZXAgJEZJUlNUX1NURVBcbiI7Ci0JCWdvdG8gJEZJUlNUX1NURVA7Ci0gIH0gZWxzZSB7Ci0JCXByaW50ICIqIE5vIHN1Y2ggc3RlcCAkRklSU1RfU1RFUFxuIjsKLQkJZXhpdCAxOwotICB9Ci19CisjIFJlY29yZCB0aGUgcHJlcHJvY2Vzc2luZyBzY3JpcHRzIHRoYXQgd2VyZSB1c2VkCitta2Rpcigic2NyaXB0cyIpIHVubGVzcyAtZSAic2NyaXB0cyI7Cit1bmxpbmsgInNjcmlwdHMvbm9ybWFsaXplLiRTT1VSQ0UiOwordW5saW5rICJzY3JpcHRzL25vcm1hbGl6ZS4kVEFSR0VUIjsKK3N5bWxpbmsgJE5PUk1BTElaRVIsICJzY3JpcHRzL25vcm1hbGl6ZS4kU09VUkNFIjsKK3N5bWxpbmsgJE5PUk1BTElaRVIsICJzY3JpcHRzL25vcm1hbGl6ZS4kVEFSR0VUIjsKK3N5bWxpbmsgJFRPS0VOSVpFUl9TT1VSQ0UsICJzY3JpcHRzL3Rva2VuaXplLiRTT1VSQ0UiOworc3ltbGluayAkVE9LRU5JWkVSX1RBUkdFVCwgInNjcmlwdHMvdG9rZW5pemUuJFRBUkdFVCI7CiAKICMjIFNURVAgMTogZmlsdGVyIGFuZCBwcmVwcm9jZXNzIGNvcnBvcmEgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUZJUlNUOgotICAgIDsKIAotaWYgKGRlZmluZWQgJEFMSUdOTUVOVCkgeworaWYgKGRlZmluZWQgJEFMSUdOTUVOVCBhbmQgJFNURVBTeyRGSVJTVF9TVEVQfSA8ICRTVEVQU3tBTElHTn0pIHsKICAgcHJpbnQgIiogRkFUQUw6IGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBwcm92aWRlIGFuIGFsaWdubWVudCBhbmQgdGhlbiBkb1xuIjsKICAgcHJpbnQgIiAgdG9rZW5pemF0aW9uLiAgRWl0aGVyIHJlbW92ZSAtLWFsaWdubWVudCBvciBzcGVjaWZ5IGEgZmlyc3Qgc3RlcFxuIjsKICAgcHJpbnQgIiAgb2YgVGhyYXggKC0tZmlyc3Qtc3RlcCBUSFJBWClcbiI7CiAgIGV4aXQgMTsKIH0KIAotaWYgKEBDT1JQT1JBID09IDApIHsKK2lmIChAQ09SUE9SQSA9PSAwIGFuZCAkU1RFUFN7JEZJUlNUX1NURVB9IDwgJFNURVBTe1RVTkV9KSB7CiAgIHByaW50ICIqIEZBVEFMOiBuZWVkIGF0IGxlYXN0IG9uZSB0cmFpbmluZyBjb3JwdXMgKC0tY29ycHVzKVxuIjsKICAgZXhpdCAxOwogfQpAQCAtNjI1LDExICs2MzksOSBAQAogbXkgJVBSRVBQRUQgPSAoCiAgIFRSQUlOID0+IDAsCiAgIFRVTkUgPT4gMCwKLSAgVEVTVCA9PiAwCi0JCSk7CisgIFRFU1QgPT4gMCk7CiAKLQotaWYgKCRET19QUkVQQVJFX0NPUlBPUkEpIHsKK2lmIChAQ09SUE9SQSA+IDAgJiYgJERPX1BSRVBBUkVfQ09SUE9SQSkgewogICBteSAkcHJlZml4ZXMgPSBwcmVwYXJlX2RhdGEoInRyYWluIixcQENPUlBPUkEsJE1BWExFTik7CiAKICAgIyB1c2VkIGZvciBwYXJzaW5nCkBAIC02NjQsNyArNjc2LDE0IEBACiAgICRQUkVQUEVEe1RFU1R9ID0gMTsKIH0KIAotbWF5YmVfcXVpdCgiRklSU1QiKTsKKyMjIFVzZSBvZiBHT1RPIGNvbnNpZGVyZWQgdmVyeSB1c2VmdWwKK2lmIChldmFsIHsgZ290byAkRklSU1RfU1RFUCB9KSB7CisgIHByaW50ICIqIFNraXBwaW5nIHRvIHN0ZXAgJEZJUlNUX1NURVBcbiI7CisgIGdvdG8gJEZJUlNUX1NURVA7Cit9IGVsc2UgeworICBwcmludCAiKiBObyBzdWNoIHN0ZXAgJEZJUlNUX1NURVBcbiI7CisgIGV4aXQgMTsKK30KIAogIyMgU1VCU0FNUExFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCkBAIC02NzIsMzIgKzY5MSwzMiBAQAogICAgIDsKIAogIyBzdWJzYW1wbGUKLQkJaWYgKCRET19TVUJTQU1QTEUpIHsKLQkJCW1rZGlyKCIkREFUQV9ESVJTe3RyYWlufS9zdWJzYW1wbGVkIikgdW5sZXNzIC1kICIkREFUQV9ESVJTe3RyYWlufS9zdWJzYW1wbGVkIjsKK2lmICgkRE9fU1VCU0FNUExFKSB7CisgIG1rZGlyKCIkREFUQV9ESVJTe3RyYWlufS9zdWJzYW1wbGVkIikgdW5sZXNzIC1kICIkREFUQV9ESVJTe3RyYWlufS9zdWJzYW1wbGVkIjsKIAotCQkJJGNhY2hlcGlwZS0+Y21kKCJzdWJzYW1wbGUtbWFuaWZlc3QiLAotCQkJCQkJCQkJCQkiZWNobyBjb3JwdXMgPiAkREFUQV9ESVJTe3RyYWlufS9zdWJzYW1wbGVkL21hbmlmZXN0IiwKLQkJCQkJCQkJCQkJIiREQVRBX0RJUlN7dHJhaW59L3N1YnNhbXBsZWQvbWFuaWZlc3QiKTsKKyAgJGNhY2hlcGlwZS0+Y21kKCJzdWJzYW1wbGUtbWFuaWZlc3QiLAorICAgICAgICAgICAgICAgICAgImVjaG8gY29ycHVzID4gJERBVEFfRElSU3t0cmFpbn0vc3Vic2FtcGxlZC9tYW5pZmVzdCIsCisgICAgICAgICAgICAgICAgICAiJERBVEFfRElSU3t0cmFpbn0vc3Vic2FtcGxlZC9tYW5pZmVzdCIpOwogCi0JCQkkY2FjaGVwaXBlLT5jbWQoInN1YnNhbXBsZS10ZXN0ZGF0YSIsCi0JCQkJCQkJCQkJCSJjYXQgJFRVTkV7c291cmNlfSAkVEVTVHtzb3VyY2V9ID4gJERBVEFfRElSU3t0cmFpbn0vc3Vic2FtcGxlZC90ZXN0LWRhdGEiLAotCQkJCQkJCQkJCQkkVFVORXtzb3VyY2V9LAotCQkJCQkJCQkJCQkkVEVTVHtzb3VyY2V9LAotCQkJCQkJCQkJCQkiJERBVEFfRElSU3t0cmFpbn0vc3Vic2FtcGxlZC90ZXN0LWRhdGEiKTsKKyAgJGNhY2hlcGlwZS0+Y21kKCJzdWJzYW1wbGUtdGVzdGRhdGEiLAorICAgICAgICAgICAgICAgICAgImNhdCAkVFVORXtzb3VyY2V9ICRURVNUe3NvdXJjZX0gPiAkREFUQV9ESVJTe3RyYWlufS9zdWJzYW1wbGVkL3Rlc3QtZGF0YSIsCisgICAgICAgICAgICAgICAgICAkVFVORXtzb3VyY2V9LAorICAgICAgICAgICAgICAgICAgJFRFU1R7c291cmNlfSwKKyAgICAgICAgICAgICAgICAgICIkREFUQV9ESVJTe3RyYWlufS9zdWJzYW1wbGVkL3Rlc3QtZGF0YSIpOwogCi0JCQkkY2FjaGVwaXBlLT5jbWQoInN1YnNhbXBsZSIsCi0JCQkJCQkJCQkJCSJqYXZhIC1YbXg0ZyAtRGZpbGUuZW5jb2Rpbmc9dXRmOCAtY3AgJEpPU0hVQS9iaW46JEpPU0hVQS9saWIvY29tbW9ucy1jbGktMi4wLVNOQVBTSE9ULmphciBqb3NodWEuc3Vic2FtcGxlLlN1YnNhbXBsZXIgLWUgJFRBUkdFVCAtZiAkU09VUkNFIC1lcGF0aCAkREFUQV9ESVJTe3RyYWlufS8gLWZwYXRoICREQVRBX0RJUlN7dHJhaW59LyAtb3V0cHV0ICREQVRBX0RJUlN7dHJhaW59L3N1YnNhbXBsZWQvc3Vic2FtcGxlZC4kTUFYTEVOIC1yYXRpbyAxLjA0IC10ZXN0ICREQVRBX0RJUlN7dHJhaW59L3N1YnNhbXBsZWQvdGVzdC1kYXRhIC10cmFpbmluZyAkREFUQV9ESVJTe3RyYWlufS9zdWJzYW1wbGVkL21hbmlmZXN0IiwKLQkJCQkJCQkJCQkJIiREQVRBX0RJUlN7dHJhaW59L3N1YnNhbXBsZWQvbWFuaWZlc3QiLAotCQkJCQkJCQkJCQkiJERBVEFfRElSU3t0cmFpbn0vc3Vic2FtcGxlZC90ZXN0LWRhdGEiLAotCQkJCQkJCQkJCQkkVFJBSU57c291cmNlfSwKLQkJCQkJCQkJCQkJJFRSQUlOe3RhcmdldH0sCi0JCQkJCQkJCQkJCSIkREFUQV9ESVJTe3RyYWlufS9zdWJzYW1wbGVkL3N1YnNhbXBsZWQuJE1BWExFTi4kVEFSR0VUIiwKLQkJCQkJCQkJCQkJIiREQVRBX0RJUlN7dHJhaW59L3N1YnNhbXBsZWQvc3Vic2FtcGxlZC4kTUFYTEVOLiRTT1VSQ0UiKTsKKyAgJGNhY2hlcGlwZS0+Y21kKCJzdWJzYW1wbGUiLAorICAgICAgICAgICAgICAgICAgImphdmEgLVhteDRnIC1EZmlsZS5lbmNvZGluZz11dGY4IC1jcCAkSk9TSFVBL2JpbjokSk9TSFVBL2xpYi9jb21tb25zLWNsaS0yLjAtU05BUFNIT1QuamFyIGpvc2h1YS5zdWJzYW1wbGUuU3Vic2FtcGxlciAtZSAkVEFSR0VUIC1mICRTT1VSQ0UgLWVwYXRoICREQVRBX0RJUlN7dHJhaW59LyAtZnBhdGggJERBVEFfRElSU3t0cmFpbn0vIC1vdXRwdXQgJERBVEFfRElSU3t0cmFpbn0vc3Vic2FtcGxlZC9zdWJzYW1wbGVkLiRNQVhMRU4gLXJhdGlvIDEuMDQgLXRlc3QgJERBVEFfRElSU3t0cmFpbn0vc3Vic2FtcGxlZC90ZXN0LWRhdGEgLXRyYWluaW5nICREQVRBX0RJUlN7dHJhaW59L3N1YnNhbXBsZWQvbWFuaWZlc3QiLAorICAgICAgICAgICAgICAgICAgIiREQVRBX0RJUlN7dHJhaW59L3N1YnNhbXBsZWQvbWFuaWZlc3QiLAorICAgICAgICAgICAgICAgICAgIiREQVRBX0RJUlN7dHJhaW59L3N1YnNhbXBsZWQvdGVzdC1kYXRhIiwKKyAgICAgICAgICAgICAgICAgICRUUkFJTntzb3VyY2V9LAorICAgICAgICAgICAgICAgICAgJFRSQUlOe3RhcmdldH0sCisgICAgICAgICAgICAgICAgICAiJERBVEFfRElSU3t0cmFpbn0vc3Vic2FtcGxlZC9zdWJzYW1wbGVkLiRNQVhMRU4uJFRBUkdFVCIsCisgICAgICAgICAgICAgICAgICAiJERBVEFfRElSU3t0cmFpbn0vc3Vic2FtcGxlZC9zdWJzYW1wbGVkLiRNQVhMRU4uJFNPVVJDRSIpOwogCi0JCQkjIHJld3JpdGUgdGhlIHN5bWxpbmtzIHRvIHBvaW50IHRvIHRoZSBzdWJzYW1wbGVkIGNvcnB1cwotCQkJZm9yZWFjaCBteSAkbGFuZyAoJFRBUkdFVCwkU09VUkNFKSB7Ci0JCQkJc3lzdGVtKCJsbiAtc2Ygc3Vic2FtcGxlZC9zdWJzYW1wbGVkLiRNQVhMRU4uJGxhbmcgJERBVEFfRElSU3t0cmFpbn0vY29ycHVzLiRsYW5nIik7Ci0JCQl9CisgICMgcmV3cml0ZSB0aGUgc3ltbGlua3MgdG8gcG9pbnQgdG8gdGhlIHN1YnNhbXBsZWQgY29ycHVzCisgIGZvcmVhY2ggbXkgJGxhbmcgKCRUQVJHRVQsJFNPVVJDRSkgeworICAgIHN5c3RlbSgibG4gLXNmIHN1YnNhbXBsZWQvc3Vic2FtcGxlZC4kTUFYTEVOLiRsYW5nICREQVRBX0RJUlN7dHJhaW59L2NvcnB1cy4kbGFuZyIpOworICB9CiB9CiAKIG1heWJlX3F1aXQoIlNVQlNBTVBMRSIpOwpAQCAtNzg1LDcgKzgwNCw4IEBACiAgIG15ICRhbGlnbmVyX2NtZCA9ICgKICAgICAiJFNDUklQVERJUi90cmFpbmluZy9wYXJhbGlnbi5wbCAiCiAgICAgLiAiIC1hbGlnbmVyICRBTElHTkVSIgotICAgIC4gIiAtbnVtX3RocmVhZHMgMSIKKyAgICAuICIgLWNvbmYgJEFMSUdORVJfQ09ORiIKKyAgICAuICIgLW51bV90aHJlYWRzIDIiCiAgICAgLiAiIC1naXphX21lcmdlICRHSVpBX01FUkdFIgogICAgIC4gIiAtYWxpZ25lcl9tZW0gJEFMSUdORVJfTUVNIgogICAgIC4gIiAtc291cmNlICRTT1VSQ0UiCkBAIC04MTUsNyArODM1LDYgQEAKICAgd2hpbGUgKEBjaGlsZHJlbikgewogICAgIG15ICRvbGRfY2hpbGQgPSBzaGlmdCBAY2hpbGRyZW47CiAgICAgd2FpdHBpZCggJG9sZF9jaGlsZCwgMCApOwotICAgIHByaW50ICJjaGlsZCBmaW5pc2hlZFxuIjsKIAogICAgIGlmICgkbmV4dF9jaHVuayA8ICRsYXN0Y2h1bmsgKyAxKSB7CiAgICAgICBteSAkbmV3X2NoaWxkID0gZm9yaygpOwpAQCAtODYyLDggKzg4MSw4IEBACiAKICMgUGFyc2luZyBvbmx5IGhhcHBlbnMgZm9yIFNBTVQgZ3JhbW1hcnMuCiAKLWlmICgkRklSU1RfU1RFUCBlcSAiUEFSU0UiIGFuZCAoJEdSQU1NQVJfVFlQRSBlcSAiaGllcm8iIG9yICRHUkFNTUFSX1RZUEUgZXEgInBocmFzYWwiIG9yICRHUkFNTUFSX1RZUEUgZXEgInBocmFzZSIpKSB7Ci0gIHByaW50IFNUREVSUiAiKiBGQVRBTDogcGFyc2luZyBkb2Vzbid0IGFwcGx5IHRvIGhpZXJvIGdyYW1tYXJzOyBZb3UgbmVlZCB0byBhZGQgJy0tdHlwZSBzYW10fGdoa20nXG4iOworaWYgKCRGSVJTVF9TVEVQIGVxICJQQVJTRSIgYW5kICgkR1JBTU1BUl9UWVBFIGVxICJoaWVybyIgb3IgJEdSQU1NQVJfVFlQRSBlcSAicGhyYXNhbCIgb3IgJEdSQU1NQVJfVFlQRSBlcSAicGhyYXNlIiBvciAkR1JBTU1BUl9UWVBFIGVxICJtb3NlcyIpKSB7CisgIHByaW50IFNUREVSUiAiKiBGQVRBTDogcGFyc2luZyBvbmx5IGFwcGxpZXMgdG8gR0hLTSBhbmQgU0FNVCBncmFtbWFyczsgeW91IG5lZWQgdG8gYWRkICctLXR5cGUgc2FtdHxnaGttJ1xuIjsKICAgZXhpdDsKIH0KIApAQCAtOTE5LDYgKzkzOCw4IEBACiAKICMjIFRIUkFYICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAorTU9ERUw6CisgICAgOwogR1JBTU1BUjoKICAgICA7CiBUSFJBWDoKQEAgLTk3NiwxNyArOTk3LDE4IEBACiAgIGV4aXQoMSk7CiB9CiAKLSMgTG9vayBmb3IgYSBwcmUtZXhpc3RpbmcgZ3JhbW1hciwgc2luY2UgYnVpbGRpbmcgaXQgaXMgZXhwZW5zaXZlLCBhbmQgc29tZXRoaW5nIHdlIHdhbnQgdG8KLSMgYXZvaWQgaWYgdGhpcyBpcyBhIHJlcnVuCisKKyMgU2luY2UgdGhpcyBpcyBhbiBleHBlbnNpdmUgc3RlcCwgd2Ugc2hvcnQtY2lyY3VpdCBpdCBpZiB0aGUgZ3JhbW1hciBmaWxlIGlzIHByZXNlbnQuICBJJ20gbm90CisjIHN1cmUgdGhhdCB0aGlzIGlzIHRoZSByaWdodCBiZWhhdmlvci4KIGlmICgtZSAiZ3JhbW1hci5neiIgJiYgISAteiAiZ3JhbW1hci5neiIpIHsKICAgY2hvbXAobXkgJGlzX2VtcHR5ID0gYGd6aXAgLWNkIGdyYW1tYXIuZ3ogfCBoZWFkIHwgd2MgLWxgKTsKICAgJEdSQU1NQVJfRklMRSA9ICJncmFtbWFyLmd6IiB1bmxlc3MgKCRpc19lbXB0eSA9PSAwKTsKIH0KIAotIyBJZiB0aGUgZ3JhbW1hciBmaWxlIHdhc24ndCBzcGVjaWZpZWQKKyMgSWYgdGhlIGdyYW1tYXIgZmlsZSB3YXNuJ3Qgc3BlY2lmaWVkLCBvciBmb3VuZCwgd2UgbmVlZCB0byBidWlsZCBpdCEKIGlmICghIGRlZmluZWQgJEdSQU1NQVJfRklMRSkgewogCi0gIG15ICR0YXJnZXRfZmlsZSA9ICgkR1JBTU1BUl9UWVBFIGVxICJoaWVybyIgb3IgJEdSQU1NQVJfVFlQRSBlcSAicGhyYXNhbCIgb3IgJEdSQU1NQVJfVFlQRSBlcSAicGhyYXNlIikgPyAkVFJBSU57dGFyZ2V0fSA6ICRUUkFJTntwYXJzZWR9OworICBteSAkdGFyZ2V0X2ZpbGUgPSAoJEdSQU1NQVJfVFlQRSBlcSAiZ2hrbSIgb3IgJEdSQU1NQVJfVFlQRSBlcSAic2FtdCIpID8gJFRSQUlOe3BhcnNlZH0gOiAkVFJBSU57dGFyZ2V0fTsKIAogICBpZiAoJEdSQU1NQVJfVFlQRSBlcSAiZ2hrbSIpIHsKICAgICBpZiAoJEdIS01fRVhUUkFDVE9SIGVxICJnYWxsZXkiKSB7CkBAIC0xMDM3LDcgKzEwNTksNyBAQAogCiAgICAgJEdSQU1NQVJfRklMRSA9ICJncmFtbWFyLmd6IjsKIAotICB9IGVsc2lmICgkR1JBTU1BUl9UWVBFIGVxICJwaHJhc2UiKSB7CisgIH0gZWxzaWYgKCRHUkFNTUFSX1RZUEUgZXEgIm1vc2VzIikgewogCiAgICAgbWtkaXIoIm1vZGVsIikgdW5sZXNzIC1kICJtb2RlbCI7CiAKQEAgLTEwNzEsMjMgKzEwOTMsMjAgQEAKICAgICAkY2FjaGVwaXBlLT5jbWQoImJ1aWxkLXR0YWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICIkTU9TRVMvc2NyaXB0cy90cmFpbmluZy90cmFpbi1tb2RlbC5wZXJsIC1tZ2l6YSAtbWdpemEtY3B1cyAkTlVNX1RIUkVBRFMgLWRvbnQtemlwIC1maXJzdC1zdGVwIDYgLWxhc3Qtc3RlcCA2IC1leHRlcm5hbC1iaW4tZGlyICRNT1NFUy9iaW4gLWYgJFNPVVJDRSAtZSAkVEFSR0VUIC1hbGlnbm1lbnQgZ3Jvdy1kaWFnLWZpbmFsLWFuZCAtbWF4LXBocmFzZS1sZW5ndGggJE1BWF9QSFJBU0VfTEVOIC1zY29yZS1vcHRpb25zICctLUdvb2RUdXJpbmcnIC1wYXJhbGxlbCAtZXh0cmFjdC1maWxlIG1vZGVsL2V4dHJhY3QgLWxleGljYWwtZmlsZSBtb2RlbC9sZXggLXBocmFzZS10cmFuc2xhdGlvbi10YWJsZSBtb2RlbC9waHJhc2UtdGFibGUiLAogICAgICAgICAgICAgICAgICAgICAibW9kZWwvbGV4LmUyZiIsCi0gICAgICAgICAgICAgICAgICAgICJtb2RlbC9leHRyYWN0LnNvcnRlZC5neiIKKyAgICAgICAgICAgICAgICAgICAgIm1vZGVsL2V4dHJhY3Quc29ydGVkLmd6IiwKKyAgICAgICAgICAgICAgICAgICAgIm1vZGVsL3BocmFzZS10YWJsZS5neiIsCiAgICAgICAgICk7CiAKICAgICAkR1JBTU1BUl9GSUxFID0gIm1vZGVsL3BocmFzZS10YWJsZS5neiI7CiAKLSAgfSBlbHNpZiAoJEdSQU1NQVJfVFlQRSBlcSAic2FtdCIgb3IgJEdSQU1NQVJfVFlQRSBlcSAiaGllcm8iKSB7Ci0KLSAgICAjIFNpbmNlIHRoaXMgaXMgYW4gZXhwZW5zaXZlIHN0ZXAsIHdlIHNob3J0LWNpcmN1aXQgaXQgaWYgdGhlIGdyYW1tYXIgZmlsZSBpcyBwcmVzZW50LiAgSSdtIG5vdAotICAgICMgc3VyZSB0aGF0IHRoaXMgaXMgdGhlIHJpZ2h0IGJlaGF2aW9yLgorICB9IGVsc2lmICgkR1JBTU1BUl9UWVBFIGVxICJzYW10IiBvciAkR1JBTU1BUl9UWVBFIGVxICJoaWVybyIgb3IgJEdSQU1NQVJfVFlQRSBlcSAicGhyYXNlIikgewogCiAgICAgIyBjcmVhdGUgdGhlIGlucHV0IGZpbGUKICAgICAkY2FjaGVwaXBlLT5jbWQoInRocmF4LWlucHV0LWZpbGUiLAotICAgICAgICAgICAgICAgICAgICAicGFzdGUgJFRSQUlOe3NvdXJjZX0gJHRhcmdldF9maWxlICRBTElHTk1FTlQgfCBwZXJsIC1wZSAncy9cXHQvIHx8fCAvZycgfCBncmVwIC12ICcoKScgfCBncmVwIC12ICd8fHwgXFwrXCQnID4gJERBVEFfRElSU3t0cmFpbn0vdGhyYXgtaW5wdXQtZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICIkUEFTVEUgJFRSQUlOe3NvdXJjZX0gJHRhcmdldF9maWxlICRBTElHTk1FTlQgfCBwZXJsIC1wZSAncy9cXHQvIHx8fCAvZycgfCBncmVwIC12ICcoKScgfCBncmVwIC12ICd8fHwgXFwrXCQnID4gJERBVEFfRElSU3t0cmFpbn0vdGhyYXgtaW5wdXQtZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICRUUkFJTntzb3VyY2V9LCAkdGFyZ2V0X2ZpbGUsICRBTElHTk1FTlQsCiAgICAgICAgICAgICAgICAgICAgICIkREFUQV9ESVJTe3RyYWlufS90aHJheC1pbnB1dC1maWxlIik7CiAKLQogICAgICMgUm9sbG91dCB0aGUgaGFkb29wIGNsdXN0ZXIgaWYgbmVlZGVkLiAgVGhpcyBjYXVzZXMgJEhBRE9PUCB0byBiZSBkZWZpbmVkIChwb2ludGluZyB0byB0aGUKICAgICAjIHVucm9sbGVkIGRpcmVjdG9yeSkuCiAgICAgc3RhcnRfaGFkb29wX2NsdXN0ZXIoKSB1bmxlc3MgZGVmaW5lZCAkSEFET09QOwpAQCAtMTA5NSw3ICsxMTE0LDcgQEAKICAgICAjIHB1dCB0aGUgaGFkb29wIGZpbGVzIGluIHBsYWNlCiAgICAgbXkgJFRIUkFYRElSOwogICAgIG15ICR0aHJheF9pbnB1dDsKLSAgICBpZiAoJEhBRE9PUCBlcSAiaGFkb29wIikgeworICAgIGlmICghIGRlZmluZWQgJEhBRE9PUCBvciAkSEFET09QIGVxICIiKSB7CiAgICAgICAkVEhSQVhESVIgPSAidGhyYXgiOwogCiAgICAgICAkdGhyYXhfaW5wdXQgPSAiJERBVEFfRElSU3t0cmFpbn0vdGhyYXgtaW5wdXQtZmlsZSIKQEAgLTExMTksOCArMTEzOCw3IEBACiAgICAgc3lzdGVtKCJtdiAkdGhyYXhfZmlsZS50bXAgJHRocmF4X2ZpbGUiKTsKIAogICAgICRjYWNoZXBpcGUtPmNtZCgidGhyYXgtcnVuIiwKLSAgICAgICAgICAgICAgICAgICAgIiRIQURPT1AvYmluL2hhZG9vcCBqYXIgJFRIUkFYL2Jpbi90aHJheC5qYXIgLUQgbWFwcmVkLmNoaWxkLmphdmEub3B0cz0nLVhteCRIQURPT1BfTUVNJyAkdGhyYXhfZmlsZSAkVEhSQVhESVIgPiB0aHJheC5sb2cgMj4mMTsgcm0gLWYgZ3JhbW1hciBncmFtbWFyLmd6OyAkSEFET09QL2Jpbi9oYWRvb3AgZnMgLWdldG1lcmdlICRUSFJBWERJUi9maW5hbC8gZ3JhbW1hci5neiIsCi0jICAgICAgICAgICAgICAgICAgICAiJEhBRE9PUC9iaW4vaGFkb29wIGphciAkVEhSQVgvYmluL3RocmF4LmphciAtRCBtYXByZWQuY2hpbGQuamF2YS5vcHRzPSctWG14JEhBRE9PUF9NRU0nICR0aHJheF9maWxlICRUSFJBWERJUiA+IHRocmF4LmxvZyAyPiYxOyBybSAtZiBncmFtbWFyIGdyYW1tYXIuZ3o7ICRIQURPT1AvYmluL2hhZG9vcCBmcyAtZ2V0bWVyZ2UgJFRIUkFYRElSL2ZpbmFsLyBncmFtbWFyLmd6OyAkSEFET09QL2Jpbi9oYWRvb3AgZnMgLXJtciAkVEhSQVhESVIiLAorICAgICAgICAgICAgICAgICAgICAiJEhBRE9PUC9iaW4vaGFkb29wIGphciAkVEhSQVgvYmluL3RocmF4LmphciAtRCBtYXByZWQuY2hpbGQuamF2YS5vcHRzPSctWG14JEhBRE9PUF9NRU0nIC1EIGhhZG9vcC50bXAuZGlyPSRUTVBESVIgJHRocmF4X2ZpbGUgJFRIUkFYRElSID4gdGhyYXgubG9nIDI+JjE7IHJtIC1mIGdyYW1tYXIgZ3JhbW1hci5nejsgJEhBRE9PUC9iaW4vaGFkb29wIGZzIC1nZXRtZXJnZSAkVEhSQVhESVIvZmluYWwvIGdyYW1tYXIuZ3oiLCAjOyAkSEFET09QL2Jpbi9oYWRvb3AgZnMgLXJtIC1yICRUSFJBWERJUiIsCiAgICAgICAgICAgICAgICAgICAgICIkREFUQV9ESVJTe3RyYWlufS90aHJheC1pbnB1dC1maWxlIiwKICAgICAgICAgICAgICAgICAgICAgJHRocmF4X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICJncmFtbWFyLmd6Iik7CkBAIC0xMTI5LDE0ICsxMTQ3LDE0IEBACiAgICAgc3RvcF9oYWRvb3BfY2x1c3RlcigpIGlmICRIQURPT1AgZXEgImhhZG9vcCI7CiAKICAgICAjIGNhY2hlIHRoZSB0aHJheC1wcmVwIHN0ZXAsIHdoaWNoIGRlcGVuZHMgb24gZ3JhbW1hci5negotICAgIGlmICgkSEFET09QIG5lICJoYWRvb3AiKSB7Ci0gICAgICAkY2FjaGVwaXBlLT5jbWQoInRocmF4LXByZXAiLCAiLS1jYWNoZS1vbmx5Iik7Ci0gICAgfQorIyAgICBpZiAoJEhBRE9PUCBuZSAiaGFkb29wIikgeworIyAgICAgICRjYWNoZXBpcGUtPmNtZCgidGhyYXgtcHJlcCIsICItLWNhY2hlLW9ubHkiKTsKKyMgICAgfQogCiAgICAgIyBjbGVhbiB1cAogICAgICMgVE9ETzogY2xlYW4gdXAgcmVhbCBoYWRvb3AgY2x1c3RlcnMgdG9vCiAgICAgIyBpZiAoJEhBRE9PUCBlcSAiaGFkb29wIikgewotICAgICMgICBzeXN0ZW0oInJtIC1yZiAkVEhSQVhESVIgaGFkb29wIGhhZG9vcC0wLjIwLjIiKTsKKyAgICAjICAgc3lzdGVtKCJybSAtcmYgJFRIUkFYRElSIGhhZG9vcCBoYWRvb3AtMi41LjIiKTsKICAgICAjIH0KIAogICAgICRHUkFNTUFSX0ZJTEUgPSAiZ3JhbW1hci5neiI7CkBAIC0xMTY2LDYgKzExODQsMjkgQEAKICAgJFBSRVBQRUR7VFVORX0gPSAxOwogfQogCisKKyMgZmlndXJlIG91dCBob3cgbWFueSByZWZlcmVuY2VzIHRoZXJlIGFyZQorbXkgJG51bXJlZnMgPSBnZXRfbnVtcmVmcygkVFVORXt0YXJnZXR9KTsKKworIyBtYWtlIHN1cmUgdGhlIGRldiBzb3VyY2UgZXhpc3QKK2lmICghIC1lICRUVU5Fe3NvdXJjZX0pIHsKKyAgcHJpbnQgU1RERVJSICIqIEZBVEFMOiBjb3VsZG4ndCBmaW5lIHR1bmluZyBzb3VyY2UgZmlsZSAnJFRVTkV7c291cmNlfSdcbiI7CisgIGV4aXQgMTsKK30KK2lmICgkbnVtcmVmcyA+IDEpIHsKKyAgZm9yIG15ICRpICgwLi4kbnVtcmVmcy0xKSB7CisJCWlmICghIC1lICIkVFVORXt0YXJnZXR9LiRpIikgeworCQkJcHJpbnQgU1RERVJSICIqIEZBVEFMOiBjb3VsZG4ndCBmaW5kIHR1bmluZyByZWZlcmVuY2UgZmlsZSAnJFRVTkV7dGFyZ2V0fS4kaSdcbiI7CisJCQlleGl0IDE7CisJCX0KKyAgfQorfSBlbHNlIHsKKyAgaWYgKCEgLWUgJFRVTkV7dGFyZ2V0fSkgeworCQlwcmludCBTVERFUlIgIiogRkFUQUw6IGNvdWxkbid0IGZpbmQgdHVuaW5nIHJlZmVyZW5jZSBmaWxlICckVFVORXt0YXJnZXR9J1xuIjsKKwkJZXhpdCAxOworICB9Cit9CisKIHN1YiBjb21waWxlX2xtKCQpIHsKICAgbXkgJGxtZmlsZSA9IHNoaWZ0OwogICBpZiAoJExNX1RZUEUgZXEgImtlbmxtIikgewpAQCAtMTI4Miw3ICsxMzIzLDcgQEAKICAgbXkgJG1lbSA9IHVjICRCVUlMRExNX01FTTsKICAgbXkgJGNsYXNzX2xtZmlsZSA9ICJjbGFzc19sbS5neiI7CiAgICRjYWNoZXBpcGUtPmNtZCgiY2xhc3NsbSIsCi0gICAgICAgICAgICAgICAgICAiJEpPU0hVQS9iaW4vbG1wbHogLW8gOSAtVCAkVE1QRElSIC1TICRtZW0gLS1kaXNjb3VudF9mYWxsYmFjaz0wLjUgMSAxLjUgLS12ZXJib3NlX2hlYWRlciAtLXRleHQgJENMQVNTX0xNX0NPUlBVUyAkTE1fT1BUSU9OUyB8IGd6aXAgLTluID4gJGNsYXNzX2xtZmlsZSIsCisgICAgICAgICAgICAgICAgICAiJEpPU0hVQS9iaW4vbG1wbHogLW8gJENMQVNTX0xNX09SREVSIC1UICRUTVBESVIgLVMgJG1lbSAtLWRpc2NvdW50X2ZhbGxiYWNrPTAuNSAxIDEuNSAtLXZlcmJvc2VfaGVhZGVyIC0tdGV4dCAkQ0xBU1NfTE1fQ09SUFVTICRMTV9PUFRJT05TIHwgZ3ppcCAtOW4gPiAkY2xhc3NfbG1maWxlIiwKICAgICAgICAgICAgICAgICAgICIkQ0xBU1NfTE1fQ09SUFVTIiwKICAgICAgICAgICAgICAgICAgICRjbGFzc19sbWZpbGUpOwogfQpAQCAtMTMxNyw0OSArMTM1OCwyOSBAQAogCiBzeXN0ZW0oIm1rZGlyIC1wICREQVRBX0RJUlN7dHVuZX0iKSB1bmxlc3MgLWQgJERBVEFfRElSU3t0dW5lfTsKIAotIyBmaWd1cmUgb3V0IGhvdyBtYW55IHJlZmVyZW5jZXMgdGhlcmUgYXJlCi1teSAkbnVtcmVmcyA9IGdldF9udW1yZWZzKCRUVU5Fe3RhcmdldH0pOwotCi0jIG1ha2Ugc3VyZSB0aGUgZGV2IHNvdXJjZSBleGlzdAotaWYgKCEgLWUgJFRVTkV7c291cmNlfSkgewotICBwcmludCBTVERFUlIgIiogRkFUQUw6IGNvdWxkbid0IGZpbmUgdHVuaW5nIHNvdXJjZSBmaWxlICckVFVORXtzb3VyY2V9J1xuIjsKLSAgZXhpdCAxOwotfQotaWYgKCRudW1yZWZzID4gMSkgewotICBmb3IgbXkgJGkgKDAuLiRudW1yZWZzLTEpIHsKLQkJaWYgKCEgLWUgIiRUVU5Fe3RhcmdldH0uJGkiKSB7Ci0JCQlwcmludCBTVERFUlIgIiogRkFUQUw6IGNvdWxkbid0IGZpbmQgdHVuaW5nIHJlZmVyZW5jZSBmaWxlICckVFVORXt0YXJnZXR9LiRpJ1xuIjsKLQkJCWV4aXQgMTsKLQkJfQotICB9Ci19IGVsc2UgewotICBpZiAoISAtZSAkVFVORXt0YXJnZXR9KSB7Ci0JCXByaW50IFNUREVSUiAiKiBGQVRBTDogY291bGRuJ3QgZmluZCB0dW5pbmcgcmVmZXJlbmNlIGZpbGUgJyRUVU5Fe3RhcmdldH0nXG4iOwotCQlleGl0IDE7Ci0gIH0KLX0KLQogIyBTZXQgJFRVTkVfR1JBTU1BUiB0byBhIHNwZWNpZmljYWxseS1wYXNzZWQgdHVuaW5nIGdyYW1tYXIgb3IgdGhlCiAjIG1haW4gZGVmYXVsdCBncmFtbWFyLiBUaGVuIHVwZGF0ZSBpdCBpZiBmaWx0ZXJpbmcgd2FzIHJlcXVlc3RlZCBhbmQKICMgaXMgcG9zc2libGUuCiBteSAkVFVORV9HUkFNTUFSID0gJF9UVU5FX0dSQU1NQVJfRklMRSB8fCAkR1JBTU1BUl9GSUxFOwotaWYgKCRET19GSUxURVJfVE0gYW5kIGRlZmluZWQgJFRVTkVfR1JBTU1BUiBhbmQgISAkRE9JTkdfTEFUVElDRVMgYW5kICEgZGVmaW5lZCAkX1RVTkVfR1JBTU1BUl9GSUxFKSB7CitpZiAoJERPX0ZJTFRFUl9UTSBhbmQgZGVmaW5lZCAkR1JBTU1BUl9GSUxFIGFuZCAhICRET0lOR19MQVRUSUNFUyBhbmQgISBkZWZpbmVkICRfVFVORV9HUkFNTUFSX0ZJTEUpIHsKICAgJFRVTkVfR1JBTU1BUiA9ICIkREFUQV9ESVJTe3R1bmV9L2dyYW1tYXIuZmlsdGVyZWQuZ3oiOwogCi0gICRjYWNoZXBpcGUtPmNtZCgiZmlsdGVyLXR1bmUiLAotCQkJCQkJCQkJIiRTQ1JJUFRESVIvc3VwcG9ydC9maWx0ZXJfZ3JhbW1hci5zaCAtZyAkR1JBTU1BUl9GSUxFICRGSUxURVJJTkcgLXYgJFRVTkV7c291cmNlfSB8ICRTQ1JJUFRESVIvdHJhaW5pbmcvZmlsdGVyLXJ1bGVzLnBsIC1idXMkU0NPUEUgfCBnemlwIC05biA+ICRUVU5FX0dSQU1NQVIiLAotCQkJCQkJCQkJJEdSQU1NQVJfRklMRSwKLQkJCQkJCQkJCSRUVU5Fe3NvdXJjZX0sCi0JCQkJCQkJCQkkVFVORV9HUkFNTUFSKTsKKyAgaWYgKCRPUFRJTUlaRVJfUlVOID09IDEgYW5kICEgaXNfcGFja2VkKCRUVU5FX0dSQU1NQVIpKSB7CisgICAgJGNhY2hlcGlwZS0+Y21kKCJmaWx0ZXItdHVuZSIsCisgICAgICAgICAgICAgICAgICAgICIkU0NSSVBURElSL3N1cHBvcnQvZmlsdGVyX2dyYW1tYXIuc2ggLWcgJEdSQU1NQVJfRklMRSAkRklMVEVSSU5HIC12ICRUVU5Fe3NvdXJjZX0gfCAkU0NSSVBURElSL3RyYWluaW5nL2ZpbHRlci1ydWxlcy5wbCAtYnVzJFNDT1BFIHwgZ3ppcCAtOW4gPiAkVFVORV9HUkFNTUFSIiwKKyAgICAgICAgICAgICAgICAgICAgJEdSQU1NQVJfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgJFRVTkV7c291cmNlfSwKKyAgICAgICAgICAgICAgICAgICAgIiREQVRBX0RJUlN7dHVuZX0vZ3JhbW1hci5maWx0ZXJlZC5neiIpOworICB9CiB9CiAKICMgQ3JlYXRlIHRoZSBnbHVlIGdyYW1tYXJzLiBUaGlzIGlzIGRvbmUgYnkgbG9va2luZyBhdCBhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIGdyYW1tYXIgZmlsZSBhbmQKICMgY3JlYXRpbmcgYWxsIHRoZSBuZWVkZWQgcnVsZXMuIFRoaXMgaXMgb25seSBkb25lIGlmIHRoZXJlIGlzIGEgJFRVTkVfR1JBTU1BUiBkZWZpbmVkICh3aGljaAogIyBjYW4gYmUgc2tpcHBlZCBpZiB3ZSBza2lwIHN0cmFpZ2h0IHRvIHRoZSB0dW5pbmcgc3RlcCkuCi1pZiAoZGVmaW5lZCAkVFVORV9HUkFNTUFSIGFuZCAkR1JBTU1BUl9UWVBFIG5lICJwaHJhc2UiKSB7CitpZiAoJE9QVElNSVpFUl9SVU4gPT0gMSBhbmQgZGVmaW5lZCAkVFVORV9HUkFNTUFSIGFuZCAkR1JBTU1BUl9UWVBFIG5lICJwaHJhc2UiIGFuZCAkR1JBTU1BUl9UWVBFIG5lICJtb3NlcyIpIHsKICAgaWYgKCEgZGVmaW5lZCAkR0xVRV9HUkFNTUFSX0ZJTEUpIHsKICAgICAkY2FjaGVwaXBlLT5jbWQoImdsdWUtdHVuZSIsCi0gICAgICAgICAgICAgICAgICAgICJqYXZhIC1YbXgyZyAtY3AgJEpPU0hVQS9saWIvKjokVEhSQVgvYmluL3RocmF4LmphciBlZHUuamh1LnRocmF4LnV0aWwuQ3JlYXRlR2x1ZUdyYW1tYXIgJFRVTkVfR1JBTU1BUiA+ICREQVRBX0RJUlN7dHVuZX0vZ3JhbW1hci5nbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgImphdmEgLVhteDJnIC1jcCAkSk9TSFVBL2xpYi9hcmdzNGotMi4wLjI5LmphcjokSk9TSFVBL2NsYXNzIGpvc2h1YS5kZWNvZGVyLmZmLnRtLkNyZWF0ZUdsdWVHcmFtbWFyIC1nICRUVU5FX0dSQU1NQVIgPiAkREFUQV9ESVJTe3R1bmV9L2dyYW1tYXIuZ2x1ZSIsCiAgICAgICAgICAgICAgICAgICAgIGdldF9maWxlX2Zyb21fZ3JhbW1hcigkVFVORV9HUkFNTUFSKSwKICAgICAgICAgICAgICAgICAgICAgIiREQVRBX0RJUlN7dHVuZX0vZ3JhbW1hci5nbHVlIik7CiAgICAgJEdMVUVfR1JBTU1BUl9GSUxFID0gIiREQVRBX0RJUlN7dHVuZX0vZ3JhbW1hci5nbHVlIjsKQEAgLTEzOTIsOCArMTQxMywxMCBAQAogCiBpZiAoJERPSU5HX0xBVFRJQ0VTKSB7CiAgIHB1c2goQGZlYXR1cmVfZnVuY3Rpb25zLCAiU291cmNlUGF0aCIpOworCisgICR3ZWlnaHRzdHIgLj0gIlNvdXJjZVBhdGggMS4wICI7CiB9Ci1pZiAoJEdSQU1NQVJfVFlQRSBlcSAicGhyYXNlIikgeworaWYgKCRHUkFNTUFSX1RZUEUgZXEgInBocmFzZSIgb3IgJEdSQU1NQVJfVFlQRSBlcSAibW9zZXMiKSB7CiAgIHB1c2goQGZlYXR1cmVfZnVuY3Rpb25zLCAiRGlzdG9ydGlvbiIpOwogICBwdXNoKEBmZWF0dXJlX2Z1bmN0aW9ucywgIlBocmFzZVBlbmFsdHkiKTsKIApAQCAtMTQxMiwxNCArMTQzNSwxNCBAQAogICB9CiAKICAgIyBHbHVlIGdyYW1tYXJzIGFyZSBvbmx5IG5lZWRlZCBmb3IgaGllcmFyY2hpY2FsIG1vZGVscwotICBpZiAoJEdSQU1NQVJfVFlQRSBuZSAicGhyYXNlIikgeworICBpZiAoJEdSQU1NQVJfVFlQRSBuZSAicGhyYXNlIiBhbmQgJEdSQU1NQVJfVFlQRSBuZSAibW9zZXMiKSB7CiAgICAgIyBHbHVlIGdyYW1tYXIKICAgICAkd2VpZ2h0c3RyIC49ICJ0bV8ke0dMVUVfT1dORVJ9XzAgMSAiOwogICB9CiB9CiAKIG15ICR0bV90eXBlID0gJEdSQU1NQVJfVFlQRTsKLWlmICgkR1JBTU1BUl9UWVBFIGVxICJwaHJhc2UiKSB7CitpZiAoJEdSQU1NQVJfVFlQRSBlcSAibW9zZXMiKSB7CiAgICR0bV90eXBlID0gIm1vc2VzIjsKIH0KIApAQCAtMTQzMiwxMSArMTQ1NSwyMiBAQAogICByZXR1cm4gJGZpbGU7CiB9CiAKLW15ICR0dW5lZGlyID0gIiRSVU5ESVIvdHVuZSI7CisjIFRoZSBmaXJzdCB0dW5pbmcgcnVuIGlzIGp1c3QgYSBzeW1saW5rIHRvIHRoZSB0dW5lLyBkaXJlY3RvcnkgKGZvciBiYWNrd2FyZCBjb21wYXQuKQorIyBTdWJzZXF1ZW50IHJ1bnMgYXJlIHVuZGVyIHRoZWlyIHJ1biBudW1iZXIKK215ICR0dW5lZGlyOworaWYgKCRPUFRJTUlaRVJfUlVOID09IDEpIHsKKyAgJHR1bmVkaXIgPSAiJFJVTkRJUi90dW5lIjsKKyAgc3lzdGVtKCJta2RpciAtcCAkdHVuZWRpciIpIHVubGVzcyAtZCAkdHVuZWRpcjsKKyAgc3ltbGluayAiJFJVTkRJUi90dW5lIiwgIiRSVU5ESVIvdHVuZS8xIjsKK30gZWxzZSB7CisgICR0dW5lZGlyID0gIiRSVU5ESVIvdHVuZS8kT1BUSU1JWkVSX1JVTiI7CisgIHN5c3RlbSgibWtkaXIgLXAgJHR1bmVkaXIiKSB1bmxlc3MgLWQgJHR1bmVkaXI7Cit9CisKIHN5c3RlbSgibWtkaXIgLXAgJHR1bmVkaXIiKSB1bmxlc3MgLWQgJHR1bmVkaXI7CiAKICMgQnVpbGQgdGhlIGZpbHRlcmVkIHR1bmluZyBtb2RlbAotbXkgJHR1bmVtb2RlbGRpciA9ICIkdHVuZWRpci9tb2RlbCI7CitteSAkdHVuZW1vZGVsZGlyID0gIiRSVU5ESVIvdHVuZS9tb2RlbCI7CiAKICMgV2UgYnVpbGQgdXAgdGhpcyBzdHJpbmcgd2l0aCBUTXMgdG8gc3Vic3RpdHV0ZSBpbiwgaWYgYW55IGFyZSBwcm92aWRlZAogbXkgJHRtX3N3aXRjaCA9ICIiOwpAQCAtMTQ0NywxOSArMTQ4MSwyMiBAQAogICAkdG1fY29weV9jb25maWdfYXJncyA9ICIgLXRtMC90eXBlICR0bV90eXBlIC10bTAvb3duZXIgJHtUTV9PV05FUn0gLXRtMC9tYXhzcGFuICRNQVhTUEFOIjsKIH0KICMgSWYgd2Ugc3BlY2lmaWVkIGEgbmV3IGdsdWUgZ3JhbW1hciwgcHV0IHRoYXQgaW4KLWlmIChkZWZpbmVkICRHTFVFX0dSQU1NQVJfRklMRSkgewotICAkdG1fc3dpdGNoIC49ICIgLS10bSAkR0xVRV9HUkFNTUFSX0ZJTEUiOwotICAkdG1fY29weV9jb25maWdfYXJncyAuPSAiIC10bTEvb3duZXIgJHtHTFVFX09XTkVSfSI7Ci19IGVsc2UgeworaWYgKCRHUkFNTUFSX1RZUEUgZXEgInBocmFzZSIgb3IgJEdSQU1NQVJfVFlQRSBlcSAibW9zZXMiKSB7CiAgICMgaWYgdGhlcmUgaXMgbm8gZ2x1ZSBncmFtbWFyLCByZW1vdmUgaXQgZnJvbSB0aGUgY29uZmlnIHRlbXBsYXRlCiAgICR0bV9jb3B5X2NvbmZpZ19hcmdzIC49ICIgLXRtMSBERUxFVEUiOworfSBlbHNpZiAoZGVmaW5lZCAkR0xVRV9HUkFNTUFSX0ZJTEUpIHsKKyAgJHRtX3N3aXRjaCAuPSAiIC0tdG0gJEdMVUVfR1JBTU1BUl9GSUxFIjsKKyAgJHRtX2NvcHlfY29uZmlnX2FyZ3MgLj0gIiAtdG0xL293bmVyICR7R0xVRV9PV05FUn0iOwogfQogCiAjIE5vdyBidWlsZCB0aGUgYnVuZGxlCi0kY2FjaGVwaXBlLT5jbWQoInR1bmUtYnVuZGxlIiwKLSAgICAgICAgICAgICAgICAiJEJVTkRMRVIgLS1mb3JjZSAtLXN5bWxpbmsgLS1hYnNvbHV0ZSAtLXZlcmJvc2UgJEpPU0hVQV9DT05GSUcgJHR1bmVtb2RlbGRpciAtLWNvcHktY29uZmlnLW9wdGlvbnMgJy10b3AtbiAkTkJFU1QgLW91dHB1dC1mb3JtYXQgXCIlaSB8fHwgJXMgfHx8ICVmIHx8fCAlY1wiIC1tYXJrLW9vdnMgZmFsc2UgLXNlYXJjaCAkU0VBUkNIX0FMR09SSVRITSAtd2VpZ2h0cyBcIiR3ZWlnaHRzdHJcIiAkZmVhdHVyZV9mdW5jdGlvbnMgJHt0bV9jb3B5X2NvbmZpZ19hcmdzfScgJHt0bV9zd2l0Y2h9IiwKLSAgICAgICAgICAgICAgICAkSk9TSFVBX0NPTkZJRywKLSAgICAgICAgICAgICAgICBnZXRfZmlsZV9mcm9tX2dyYW1tYXIoJFRVTkVfR1JBTU1BUikgfHwgJEpPU0hVQV9DT05GSUcsKTsKK2lmICgkT1BUSU1JWkVSX1JVTiA9PSAxKSB7CisgICRjYWNoZXBpcGUtPmNtZCgidHVuZS1idW5kbGUiLAorICAgICAgICAgICAgICAgICAgIiRCVU5ETEVSIC0tZm9yY2UgLS1zeW1saW5rIC0tYWJzb2x1dGUgLS12ZXJib3NlIC1UICRUTVBESVIgJEpPU0hVQV9DT05GSUcgJHR1bmVtb2RlbGRpciAtLWNvcHktY29uZmlnLW9wdGlvbnMgJy10b3AtbiAkTkJFU1QgLW91dHB1dC1mb3JtYXQgXCIlaSB8fHwgJXMgfHx8ICVmIHx8fCAlY1wiIC1tYXJrLW9vdnMgZmFsc2UgLXNlYXJjaCAkU0VBUkNIX0FMR09SSVRITSAtd2VpZ2h0cyBcIiR3ZWlnaHRzdHJcIiAkZmVhdHVyZV9mdW5jdGlvbnMgJHt0bV9jb3B5X2NvbmZpZ19hcmdzfScgJHt0bV9zd2l0Y2h9IiwKKyAgICAgICAgICAgICAgICAgICRKT1NIVUFfQ09ORklHLAorICAgICAgICAgICAgICAgICAgZ2V0X2ZpbGVfZnJvbV9ncmFtbWFyKCRUVU5FX0dSQU1NQVIpIHx8ICRKT1NIVUFfQ09ORklHLAorICAgICAgICAgICAgICAgICAgIiR0dW5lbW9kZWxkaXIvcnVuLWpvc2h1YS5zaCIpOworfQogCiAjIFVwZGF0ZSB0aGUgdHVuZSBncmFtbWFyIHRvIGl0cyBuZXcgbG9jYXRpb24gaW4gdGhlIGJ1bmRsZQogaWYgKGRlZmluZWQgJFRVTkVfR1JBTU1BUikgewpAQCAtMTQ3NSwzNiArMTUxMiw0NCBAQAogICB9CiB9CiAKLSMgVXBkYXRlIHRoZSBjb25maWcgZmlsZSBsb2NhdGlvbgotJEpPU0hVQV9DT05GSUcgPSAiJHR1bmVkaXIvbW9kZWwvam9zaHVhLmNvbmZpZyI7CisjIENvcHkgdGhlIGdlbmVyYXRlZCBjb25maWcgdG8gdGhlIHR1bmVkaXIsIGFuZCB1cGRhdGUgdGhlIGNvbmZpZyBmaWxlIGxvY2F0aW9uCitzeXN0ZW0oImNwICR0dW5lbW9kZWxkaXIvam9zaHVhLmNvbmZpZyAkdHVuZWRpci9qb3NodWEuY29uZmlnIik7CiskSk9TSFVBX0NPTkZJRyA9ICIkdHVuZWRpci9qb3NodWEuY29uZmlnIjsKIAogIyBXcml0ZSB0aGUgZGVjb2RlciBydW4gY29tbWFuZC4gVGhlIGRlY29kZXIgd2lsbCB1c2UgdGhlIGNvbmZpZyBmaWxlIGluIHRoZSBidW5kbGVkCiAjIGRpcmVjdG9yeSwgY29udGludWFsbHkgdXBkYXRpbmcgaXQuCisKKyMgSWYgd2UncmUgZGVjb2RpbmcgYSBsYXR0aWNlLCBhbHNvIG91dHB1dCB0aGUgc291cmNlIHNpZGUgcGF0aCB3ZSBjaG9zZQorJEpPU0hVQV9BUkdTID0gIiI7CitpZiAoJERPSU5HX0xBVFRJQ0VTKSB7CisgICRKT1NIVUFfQVJHUyAuPSAiIC1tYXhsZW4gMCAtbGF0dGljZS1kZWNvZGluZyI7Cit9CiAkSk9TSFVBX0FSR1MgLj0gIiAtb3V0cHV0LWZvcm1hdCBcIiVpIHx8fCAlcyB8fHwgJWYgfHx8ICVjXCIiOworJEpPU0hVQV9BUkdTIC49ICIgJF9KT1NIVUFfQVJHUyIgaWYgZGVmaW5lZCAkX0pPU0hVQV9BUkdTOwogCiBvcGVuIERFQ19DTUQsICI+JHR1bmVkaXIvZGVjb2Rlcl9jb21tYW5kIjsKLXByaW50IERFQ19DTUQgImNhdCAkVFVORXtzb3VyY2V9IHwgJHR1bmVkaXIvbW9kZWwvcnVuLWpvc2h1YS5zaCAtbSAkSk9TSFVBX01FTSAtY29uZmlnICRKT1NIVUFfQ09ORklHIC10aHJlYWRzICROVU1fVEhSRUFEUyAkSk9TSFVBX0FSR1MgPiAkdHVuZWRpci9vdXRwdXQubmJlc3QgMj4gJHR1bmVkaXIvam9zaHVhLmxvZ1xuIjsKK3ByaW50IERFQ19DTUQgImNhdCAkVFVORXtzb3VyY2V9IHwgJHR1bmVtb2RlbGRpci9ydW4tam9zaHVhLnNoIC1tICRKT1NIVUFfTUVNIC1jb25maWcgJEpPU0hVQV9DT05GSUcgLXRocmVhZHMgJE5VTV9USFJFQURTICRKT1NIVUFfQVJHUyA+ICR0dW5lZGlyL291dHB1dC5uYmVzdCAyPiAkdHVuZWRpci9qb3NodWEubG9nXG4iOwogY2xvc2UoREVDX0NNRCk7CiBjaG1vZCgwNzU1LCIkdHVuZWRpci9kZWNvZGVyX2NvbW1hbmQiKTsKIAogIyB0dW5lCi1pZiAoJFRVTkVSIGVxICJtZXJ0IiBvciAkVFVORVIgZXEgInptZXJ0IiBvciAkVFVORVIgZXEgInBybyIgb3IgJFRVTkVSIGVxICJtaXJhIiBvciAkVFVORVIgZXEgImxvY2FsLW1pcmEiKSB7Ci0gICRjYWNoZXBpcGUtPmNtZCgkVFVORVIsCi0gICAgICAgICAgICAgICAgICAiJFNDUklQVERJUi90cmFpbmluZy9ydW5fdHVuZXIucHkgJFRVTkV7c291cmNlfSAkVFVORXt0YXJnZXR9IC0tdHVuZWRpciAkdHVuZWRpciAtLXR1bmVyICRUVU5FUiAtLWRlY29kZXItY29uZmlnICRKT1NIVUFfQ09ORklHIC0taXRlcmF0aW9ucyAkVFVORVJfSVRFUkFUSU9OUyIsCitpZiAoJFRVTkVSIG5lICJrYm1pcmEiKSB7CisgICRjYWNoZXBpcGUtPmNtZCgiJHtUVU5FUn0tJHtPUFRJTUlaRVJfUlVOfSIsCisgICAgICAgICAgICAgICAgICAiJFNDUklQVERJUi90cmFpbmluZy9ydW5fdHVuZXIucHkgJFRVTkV7c291cmNlfSAkVFVORXt0YXJnZXR9IC0tdHVuZWRpciAkdHVuZWRpciAtLXR1bmVyICRUVU5FUiAtLWRlY29kZXIgJHR1bmVkaXIvZGVjb2Rlcl9jb21tYW5kIC0tZGVjb2Rlci1jb25maWcgJEpPU0hVQV9DT05GSUcgLS1kZWNvZGVyLW91dHB1dC1maWxlICR0dW5lZGlyL291dHB1dC5uYmVzdCAtLWRlY29kZXItbG9nLWZpbGUgJHR1bmVkaXIvam9zaHVhLmxvZyAtLWl0ZXJhdGlvbnMgJFRVTkVSX0lURVJBVElPTlMgLS1tZXRyaWMgJyRNRVRSSUMnIiwKICAgICAgICAgICAgICAgICAgICRUVU5Fe3NvdXJjZX0sCiAgICAgICAgICAgICAgICAgICAkSk9TSFVBX0NPTkZJRywKICAgICAgICAgICAgICAgICAgIGdldF9maWxlX2Zyb21fZ3JhbW1hcigkVFVORV9HUkFNTUFSKSB8fCAkSk9TSFVBX0NPTkZJRywKICAgICAgICAgICAgICAgICAgICIkdHVuZWRpci9qb3NodWEuY29uZmlnLmZpbmFsIik7CiAKLX0gZWxzaWYgKCRUVU5FUiBlcSAia2JtaXJhIikgeyAjIE1vc2VzJyBiYXRjaCBNSVJBCit9IGVsc2UgeyAjIE1vc2VzJyBiYXRjaCBrYm1pcmEKICAgbXkgJHJlZnNfcGF0aCA9ICRUVU5Fe3RhcmdldH07CiAgICRyZWZzX3BhdGggLj0gIi4iIGlmIChnZXRfbnVtcmVmcygkVFVORXt0YXJnZXR9KSA+IDEpOwogCiAgIG15ICRleHRyYV9hcmdzID0gJEpPU0hVQV9BUkdTOwogICAkZXh0cmFfYXJncyA9fiBzLyIvXFwiL2c7Ci0gICRjYWNoZXBpcGUtPmNtZCgibWlyYSIsCi0gICAgICAgICAgICAgICAgICAiJFNDUklQVERJUi90cmFpbmluZy9taXJhL3J1bi1taXJhLnBsIC0tbWVydGRpciAkTU9TRVMvYmluIC0tcm9vdGRpciAkTU9TRVMvc2NyaXB0cyAtLWJhdGNoLW1pcmEgLS13b3JraW5nLWRpciAkdHVuZWRpciAtLW1heGltdW0taXRlcmF0aW9ucyAkVFVORVJfSVRFUkFUSU9OUyAtLW5iZXN0ICROQkVTVCAtLW5vLWZpbHRlci1waHJhc2UtdGFibGUgLS1kZWNvZGVyLWZsYWdzIFwiLW0gJEpPU0hVQV9NRU0gLXRocmVhZHMgJE5VTV9USFJFQURTIC1tb3NlcyAkZXh0cmFfYXJnc1wiICRUVU5Fe3NvdXJjZX0gJHJlZnNfcGF0aCAkdHVuZWRpci9tb2RlbC9ydW4tam9zaHVhLnNoICR0dW5lZGlyL21vZGVsL2pvc2h1YS5jb25maWcgPiAkdHVuZWRpci9taXJhLmxvZyAyPiYxIiwKLSAgICAgICAgICAgICAgICAgIGdldF9maWxlX2Zyb21fZ3JhbW1hcigkVFVORV9HUkFNTUFSKSwKKyAgJGNhY2hlcGlwZS0+Y21kKCJrYm1pcmEtJHtPUFRJTUlaRVJfUlVOfSIsCisgICAgICAgICAgICAgICAgICAiJFNDUklQVERJUi90cmFpbmluZy9taXJhL3J1bi1taXJhLnBsIC0tbWVydGRpciAkTU9TRVMvYmluIC0tcm9vdGRpciAkTU9TRVMvc2NyaXB0cyAtLWJhdGNoLW1pcmEgLS13b3JraW5nLWRpciAkdHVuZWRpciAtLW1heGltdW0taXRlcmF0aW9ucyAkVFVORVJfSVRFUkFUSU9OUyAtLW5iZXN0ICROQkVTVCAtLW5vLWZpbHRlci1waHJhc2UtdGFibGUgLS1kZWNvZGVyLWZsYWdzIFwiLW0gJEpPU0hVQV9NRU0gLXRocmVhZHMgJE5VTV9USFJFQURTIC1tb3NlcyAkZXh0cmFfYXJnc1wiICRUVU5Fe3NvdXJjZX0gJHJlZnNfcGF0aCAkdHVuZW1vZGVsZGlyL3J1bi1qb3NodWEuc2ggJEpPU0hVQV9DT05GSUcgPiAkdHVuZWRpci9taXJhLmxvZyAyPiYxIiwKKyAgICAgICAgICAgICAgICAgIGdldF9maWxlX2Zyb21fZ3JhbW1hcigkVFVORV9HUkFNTUFSKSB8fCAkSk9TSFVBX0NPTkZJRywKICAgICAgICAgICAgICAgICAgICRUVU5Fe3NvdXJjZX0sCiAgICAgICAgICAgICAgICAgICAiJHR1bmVkaXIvam9zaHVhLmNvbmZpZy5maW5hbCIpOwogfQpAQCAtMTUxMiwxMCArMTU1Nyw3IEBACiAkSk9TSFVBX0NPTkZJRyA9ICIkdHVuZWRpci9qb3NodWEuY29uZmlnLmZpbmFsIjsKIAogIyBHbyB0byB0aGUgbmV4dCB0dW5pbmcgcnVuIGlmIHR1bmluZyBpcyB0aGUgbGFzdCBzdGVwLgotaWYgKCRMQVNUX1NURVAgZXEgIlRVTkUiKSB7Ci0gIG5leHQ7Ci19Ci0KK21heWJlX3F1aXQoIlRVTkUiKTsKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIFRFU1RJTkcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xNTI1LDcgKzE1NjcsNyBAQAogICAgIDsKIAogIyBwcmVwYXJlIHRoZSB0ZXN0aW5nIGRhdGEKLWlmICghICRQUkVQUEVEe1RFU1R9IGFuZCAkRE9fUFJFUEFSRV9DT1JQT1JBKSB7CitpZiAoISAkUFJFUFBFRHtURVNUfSBhbmQgJERPX1BSRVBBUkVfQ09SUE9SQSBhbmQgJE9QVElNSVpFUl9SVU4gPT0gMSkgewogICBteSAkcHJlZml4ZXMgPSBwcmVwYXJlX2RhdGEoInRlc3QiLFskVEVTVF0sJE1BWExFTl9URVNUKTsKICAgJFRFU1R7c291cmNlfSA9ICIkREFUQV9ESVJTe3Rlc3R9LyRwcmVmaXhlcy0+e2xvd2VyY2FzZWR9LiRTT1VSQ0UiOwogICAkVEVTVHt0YXJnZXR9ID0gIiREQVRBX0RJUlN7dGVzdH0vJHByZWZpeGVzLT57bG93ZXJjYXNlZH0uJFRBUkdFVCI7CkBAIC0xNTM3LDI2ICsxNTc5LDI2IEBACiAjIERlZmluZSB0aGUgdGVzdCBncmFtbWFyLCBpZiBpdCB3YXMgcHJvdmlkZWQKIG15ICRURVNUX0dSQU1NQVIgPSAkX1RFU1RfR1JBTU1BUl9GSUxFIHx8ICRHUkFNTUFSX0ZJTEU7CiAKLSMgTm93IGZpbHRlciwgaWYgaXRzIGRlZmluZWQgYW5kIHNob3VsZCBiZSBkb25lCi1pZiAoJERPX0ZJTFRFUl9UTSBhbmQgZGVmaW5lZCAkVEVTVF9HUkFNTUFSIGFuZCAhICRET0lOR19MQVRUSUNFUyBhbmQgISBkZWZpbmVkICRfVEVTVF9HUkFNTUFSX0ZJTEUpIHsKLSAgJFRFU1RfR1JBTU1BUiA9ICIkREFUQV9ESVJTe3Rlc3R9L2dyYW1tYXIuZmlsdGVyZWQuZ3oiOwotICAKLSAgJGNhY2hlcGlwZS0+Y21kKCJmaWx0ZXItdGVzdCIsCi0gICAgICAgICAgICAgICAgICAiJFNDUklQVERJUi9zdXBwb3J0L2ZpbHRlcl9ncmFtbWFyLnNoIC1nICRHUkFNTUFSX0ZJTEUgJEZJTFRFUklORyAtdiAkVEVTVHtzb3VyY2V9IHwgJFNDUklQVERJUi90cmFpbmluZy9maWx0ZXItcnVsZXMucGwgLWJ1cyRTQ09QRSB8IGd6aXAgLTluID4gJFRFU1RfR1JBTU1BUiIsCi0gICAgICAgICAgICAgICAgICAkR1JBTU1BUl9GSUxFLAotICAgICAgICAgICAgICAgICAgJFRFU1R7c291cmNlfSwKLSAgICAgICAgICAgICAgICAgICRURVNUX0dSQU1NQVIpOworaWYgKCRET19GSUxURVJfVE0gYW5kIGRlZmluZWQgJEdSQU1NQVJfRklMRSBhbmQgISAkRE9JTkdfTEFUVElDRVMgYW5kICEgZGVmaW5lZCAkX1RFU1RfR1JBTU1BUl9GSUxFKSB7CisgICMgT24gdGhlIGZpcnN0IHRlc3QgcnVuLCB3ZSB0YWtlIHNvbWUgcGFpbnMgdG8gcHJlcGFyZSBhbmQgcGFjayB0aGUgbW9kZWwsIHdoaWNoIHdvbid0IGhhdmUKKyAgIyB0byBiZSBkb25lIGZvciBzdWJzZXF1ZW50IHJ1bnMKKyAgaWYgKCRPUFRJTUlaRVJfUlVOID09IDEgYW5kICEgaXNfcGFja2VkKCRURVNUX0dSQU1NQVIpKSB7CisgICAgJFRFU1RfR1JBTU1BUiA9ICIkREFUQV9ESVJTe3Rlc3R9L2dyYW1tYXIuZmlsdGVyZWQuZ3oiOworCisgICAgJGNhY2hlcGlwZS0+Y21kKCJmaWx0ZXItdGVzdCIsCisgICAgICAgICAgICAgICAgICAgICIkU0NSSVBURElSL3N1cHBvcnQvZmlsdGVyX2dyYW1tYXIuc2ggLWcgJEdSQU1NQVJfRklMRSAkRklMVEVSSU5HIC12ICRURVNUe3NvdXJjZX0gfCAkU0NSSVBURElSL3RyYWluaW5nL2ZpbHRlci1ydWxlcy5wbCAtYnVzJFNDT1BFIHwgZ3ppcCAtOW4gPiAkVEVTVF9HUkFNTUFSIiwKKyAgICAgICAgICAgICAgICAgICAgJEdSQU1NQVJfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgJFRFU1R7c291cmNlfSwKKyAgICAgICAgICAgICAgICAgICAgIiREQVRBX0RJUlN7dGVzdH0vZ3JhbW1hci5maWx0ZXJlZC5neiIpOworICB9CiB9CiAKLW15ICR0ZXN0ZGlyID0gIiRSVU5ESVIvdGVzdCI7Ci0KLSMgQ3JlYXRlIGFuZCB1cGRhdGUgdGhlIGdsdWUgZmlsZSwgaWYgdGhlIHRlc3QgZ3JhbW1hciB3YXMgcHJvdmlkZWQgKGlmIG5vdCwgd2UgYXNzdW1lIHRoZXNlCi0jIGFyZSBpbiB0aGUgJEpPU0hVQV9DT05GSUcpCi1pZiAoZGVmaW5lZCAkVEVTVF9HUkFNTUFSIGFuZCAkR1JBTU1BUl9UWVBFIG5lICJwaHJhc2UiKSB7CisjIENyZWF0ZSB0aGUgZ2x1ZSBncmFtbWFyCitpZiAoJE9QVElNSVpFUl9SVU4gPT0gMSBhbmQgZGVmaW5lZCAkVEVTVF9HUkFNTUFSIGFuZCAkR1JBTU1BUl9UWVBFIG5lICJwaHJhc2UiIGFuZCAkR1JBTU1BUl9UWVBFIG5lICJtb3NlcyIpIHsKICAgaWYgKCEgZGVmaW5lZCAkR0xVRV9HUkFNTUFSX0ZJTEUpIHsKICAgICAkY2FjaGVwaXBlLT5jbWQoImdsdWUtdGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICJqYXZhIC1YbXgxZyAtY3AgJEpPU0hVQS9saWIvKjokVEhSQVgvYmluL3RocmF4LmphciBlZHUuamh1LnRocmF4LnV0aWwuQ3JlYXRlR2x1ZUdyYW1tYXIgJFRFU1RfR1JBTU1BUiA+ICREQVRBX0RJUlN7dGVzdH0vZ3JhbW1hci5nbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgJFRFU1RfR1JBTU1BUiwKKyAgICAgICAgICAgICAgICAgICAgImphdmEgLVhteDJnIC1jcCAkSk9TSFVBL2xpYi9hcmdzNGotMi4wLjI5LmphcjokSk9TSFVBL2NsYXNzIGpvc2h1YS5kZWNvZGVyLmZmLnRtLkNyZWF0ZUdsdWVHcmFtbWFyIC1nICRURVNUX0dSQU1NQVIgPiAkREFUQV9ESVJTe3Rlc3R9L2dyYW1tYXIuZ2x1ZSIsCisgICAgICAgICAgICAgICAgICAgIGdldF9maWxlX2Zyb21fZ3JhbW1hcigkVEVTVF9HUkFNTUFSKSwKICAgICAgICAgICAgICAgICAgICAgIiREQVRBX0RJUlN7dGVzdH0vZ3JhbW1hci5nbHVlIik7CiAgICAgJEdMVUVfR1JBTU1BUl9GSUxFID0gIiREQVRBX0RJUlN7dGVzdH0vZ3JhbW1hci5nbHVlIjsKICAgICAKQEAgLTE1NzEsNDUgKzE2MTMsNzAgQEAKICAgfQogfQogCisjIENyZWF0ZSB0aGUgdGVzdCBkaXJlY3RvcnkKK215ICR0ZXN0ZGlyOworaWYgKCRPUFRJTUlaRVJfUlVOID09IDEpIHsKKyAgJHRlc3RkaXIgPSAiJFJVTkRJUi90ZXN0IjsKKyAgc3lzdGVtKCJta2RpciAtcCAkdGVzdGRpciIpIHVubGVzcyAtZCAkdGVzdGRpcjsKKyAgc3ltbGluaygiJFJVTkRJUi90ZXN0IiwgIiRSVU5ESVIvdGVzdC8xIik7Cit9IGVsc2UgeworICAkdGVzdGRpciA9ICIkUlVORElSL3Rlc3QvJE9QVElNSVpFUl9SVU4iOworICBzeXN0ZW0oIm1rZGlyIC1wICR0ZXN0ZGlyIikgdW5sZXNzIC1kICR0ZXN0ZGlyOworfQorCiAkdG1fc3dpdGNoID0gIiI7CiAkdG1fY29weV9jb25maWdfYXJncyA9ICIiOwotaWYgKGRlZmluZWQgJFRFU1RfR1JBTU1BUikgewotICAkdG1fc3dpdGNoIC49ICgkRE9fUEFDS19HUkFNTUFSUykgPyAiLS1wYWNrLXRtIiA6ICItLXRtIjsKLSAgJHRtX3N3aXRjaCAuPSAiICRURVNUX0dSQU1NQVIiOworaWYgKCRET19QQUNLX0dSQU1NQVJTKSB7CisgIG15ICRwYWNrZWRfZGlyID0gIiREQVRBX0RJUlN7dGVzdH0vZ3JhbW1hci5wYWNrZWQiOworICBpZiAoJE9QVElNSVpFUl9SVU4gPT0gMSBhbmQgISBpc19wYWNrZWQoJFRFU1RfR1JBTU1BUikpIHsKKyAgICAkY2FjaGVwaXBlLT5jbWQoInRlc3QtcGFjayIsCisgICAgICAgICAgICAgICAgICAgICIkU0NSSVBURElSL3N1cHBvcnQvZ3JhbW1hci1wYWNrZXIucGwgLVQgJFRNUERJUiAtbSAkUEFDS0VSX01FTSAtZyAkVEVTVF9HUkFNTUFSIC1vICRwYWNrZWRfZGlyIiwKKyAgICAgICAgICAgICAgICAgICAgJFRFU1RfR1JBTU1BUiwKKyAgICAgICAgICAgICAgICAgICAgIiRwYWNrZWRfZGlyL3ZvY2FidWxhcnkiLAorICAgICAgICAgICAgICAgICAgICAiJHBhY2tlZF9kaXIvZW5jb2RpbmciLAorICAgICAgICAgICAgICAgICAgICAiJHBhY2tlZF9kaXIvc2xpY2VfMDAwMDAuc291cmNlIik7CisgIH0KKyAgJFRFU1RfR1JBTU1BUiA9ICRwYWNrZWRfZGlyOworCisgICR0bV9zd2l0Y2ggLj0gIiAtLXBhY2stdG0gJFRFU1RfR1JBTU1BUiI7Cit9IGVsc2UgeworICAkdG1fc3dpdGNoIC49ICIgLS10bSAkVEVTVF9HUkFNTUFSIjsKIH0KKworIyBBZGQgaW4gdGhlIGdsdWUgZ3JhbW1hcgogaWYgKGRlZmluZWQgJEdMVUVfR1JBTU1BUl9GSUxFKSB7CiAgICR0bV9zd2l0Y2ggLj0gIiAtLXRtICRHTFVFX0dSQU1NQVJfRklMRSI7CiB9CiAKLSMgQnVpbGQgdGhlIGZpbHRlcmVkIHRlc3RpbmcgbW9kZWwKLSRjYWNoZXBpcGUtPmNtZCgidGVzdC1idW5kbGUiLAotICAgICAgICAgICAgICAgICIkQlVORExFUiAtLWZvcmNlIC0tc3ltbGluayAtLXZlcmJvc2UgJEpPU0hVQV9DT05GSUcgdGVzdC9tb2RlbCAtLWNvcHktY29uZmlnLW9wdGlvbnMgJy10b3AtbiAkTkJFU1QgLW91dHB1dC1mb3JtYXQgXCIlaSB8fHwgJXMgfHx8ICVmIHx8fCAlY1wiIC1tYXJrLW9vdnMgZmFsc2UnICR7dG1fc3dpdGNofSIsCisjIEJ1aWxkIHRoZSB0ZXN0IG1vZGVsCitteSAkdGVzdG1vZGVsZGlyID0gIiRSVU5ESVIvdGVzdC8kT1BUSU1JWkVSX1JVTi9tb2RlbCI7CiskY2FjaGVwaXBlLT5jbWQoInRlc3QtYnVuZGxlLSR7T1BUSU1JWkVSX1JVTn0iLAorICAgICAgICAgICAgICAgICIkQlVORExFUiAtLWZvcmNlIC0tc3ltbGluayAtLWFic29sdXRlIC0tdmVyYm9zZSAtVCAkVE1QRElSICRKT1NIVUFfQ09ORklHICR0ZXN0bW9kZWxkaXIgLS1jb3B5LWNvbmZpZy1vcHRpb25zICctdG9wLW4gJE5CRVNUIC1wb3AtbGltaXQgNTAwMCAtb3V0cHV0LWZvcm1hdCBcIiVpIHx8fCAlcyB8fHwgJWYgfHx8ICVjXCIgLW1hcmstb292cyBmYWxzZScgJHt0bV9zd2l0Y2h9IiwKICAgICAgICAgICAgICAgICAkSk9TSFVBX0NPTkZJRywKICAgICAgICAgICAgICAgICBnZXRfZmlsZV9mcm9tX2dyYW1tYXIoJFRFU1RfR1JBTU1BUikgfHwgJEpPU0hVQV9DT05GSUcsCi0gICAgICAgICAgICAgICAgIiR0ZXN0ZGlyL21vZGVsL2pvc2h1YS5jb25maWciKTsKKyAgICAgICAgICAgICAgICAiJHRlc3Rtb2RlbGRpci9qb3NodWEuY29uZmlnIik7CiAKIGlmIChkZWZpbmVkICRURVNUX0dSQU1NQVIpIHsKICAgIyBVcGRhdGUgdGhlIHRlc3QgZ3JhbW1hciAoaWYgZGVmaW5lZCkgdG8gaXRzIG5ldyBwYXRoCiAgIG15ICRiYXNlbmFtZSA9IGJhc2VuYW1lKCRURVNUX0dSQU1NQVIpOwotICBpZiAoLWUgIiR0ZXN0ZGlyL21vZGVsLyRiYXNlbmFtZSIpIHsKLSAgICAkVEVTVF9HUkFNTUFSID0gIiR0ZXN0ZGlyL21vZGVsLyRiYXNlbmFtZSI7Ci0gIH0gZWxzaWYgKC1lICIkdGVzdGRpci9tb2RlbC8kYmFzZW5hbWUucGFja2VkIikgewotICAgICRURVNUX0dSQU1NQVIgPSAiJHRlc3RkaXIvbW9kZWwvJGJhc2VuYW1lLnBhY2tlZCI7CisgIGlmICgtZSAiJHRlc3Rtb2RlbGRpci8kYmFzZW5hbWUiKSB7CisgICAgJFRFU1RfR1JBTU1BUiA9ICIkdGVzdG1vZGVsZGlyLyRiYXNlbmFtZSI7CisgIH0gZWxzaWYgKC1lICIkdGVzdG1vZGVsZGlyLyRiYXNlbmFtZS5wYWNrZWQiKSB7CisgICAgJFRFU1RfR1JBTU1BUiA9ICIkdGVzdG1vZGVsZGlyLyRiYXNlbmFtZS5wYWNrZWQiOwogICB9IGVsc2UgewogICAgIHByaW50IFNUREVSUiAiKiBGQVRBTDogdGVzdCBtb2RlbCBidW5kbGluZyBkaWRuJ3QgcHJvZHVjZSBhIGdyYW1tYXI/IjsKICAgICBleGl0IDE7CiAgIH0KIH0KIAotbXkgJHRlc3RydW4gPSBnZXRfYWJzb2x1dGVfcGF0aCgidGVzdCIsICRSVU5ESVIpOwotbXkgJGJlc3RvdXRwdXQgPSAiJHRlc3RydW4vb3V0cHV0IjsKLW15ICRuYmVzdG91dHB1dCA9ICIkdGVzdHJ1bi9vdXRwdXQubmJlc3QiOworbXkgJGJlc3RvdXRwdXQgPSAiJHRlc3RkaXIvb3V0cHV0IjsKK215ICRuYmVzdG91dHB1dCA9ICIkdGVzdGRpci9vdXRwdXQubmJlc3QiOwogbXkgJG91dHB1dDsKIAogIyBJZiB3ZSdyZSBkZWNvZGluZyBhIGxhdHRpY2UsIGFsc28gb3V0cHV0IHRoZSBzb3VyY2Ugc2lkZSBwYXRoIHdlIGNob3NlCi0kSk9TSFVBX0FSR1MgPSAkX0pPU0hVQV9BUkdTOworJEpPU0hVQV9BUkdTID0gIiI7CiBpZiAoJERPSU5HX0xBVFRJQ0VTKSB7Ci0gICRKT1NIVUFfQVJHUyAuPSAiIC1tYXhsZW4gMCAtb3V0cHV0LWZvcm1hdCBcIiVpIHx8fCAlcyB8fHwgJWUgfHx8ICVmIHx8fCAlY1wiIjsKKyAgJEpPU0hVQV9BUkdTIC49ICIgLW1heGxlbiAwIC1sYXR0aWNlLWRlY29kaW5nIC1vdXRwdXQtZm9ybWF0IFwiJWkgfHx8ICVzIHx8fCAlZSB8fHwgJWYgfHx8ICVjXCIiOwogfQogCiBpZiAoJERPX01CUikgewpAQCAtMTYxOSwyMSArMTY4NiwyMiBAQAogICAkSk9TSFVBX0FSR1MgLj0gIiAtdG9wLW4gMCAtb3V0cHV0LWZvcm1hdCAlcyI7CiAgICRvdXRwdXQgPSAkYmVzdG91dHB1dDsKIH0KKyRKT1NIVUFfQVJHUyAuPSAiICRfSk9TSFVBX0FSR1MiIGlmIGRlZmluZWQgJF9KT1NIVUFfQVJHUzsKIAogIyBXcml0ZSB0aGUgZGVjb2RlciBydW4gY29tbWFuZAotb3BlbiBERUNfQ01ELCAiPiR0ZXN0cnVuL2RlY29kZXJfY29tbWFuZCI7Ci1wcmludCBERUNfQ01EICJjYXQgJFRFU1R7c291cmNlfSB8ICR0ZXN0cnVuL21vZGVsL3J1bi1qb3NodWEuc2ggLW0gJEpPU0hVQV9NRU0gLXRocmVhZHMgJE5VTV9USFJFQURTICRKT1NIVUFfQVJHUyA+ICRvdXRwdXQgMj4gJHRlc3RydW4vam9zaHVhLmxvZ1xuIjsKK29wZW4gREVDX0NNRCwgIj4kdGVzdGRpci9kZWNvZGVyX2NvbW1hbmQiOworcHJpbnQgREVDX0NNRCAiY2F0ICRURVNUe3NvdXJjZX0gfCAkdGVzdG1vZGVsZGlyL3J1bi1qb3NodWEuc2ggLW0gJEpPU0hVQV9NRU0gLXRocmVhZHMgJE5VTV9USFJFQURTICRKT1NIVUFfQVJHUyA+ICRvdXRwdXQgMj4gJHRlc3RkaXIvam9zaHVhLmxvZ1xuIjsKIGNsb3NlKERFQ19DTUQpOwotY2htb2QoMDc1NSwiJHRlc3RydW4vZGVjb2Rlcl9jb21tYW5kIik7CitjaG1vZCgwNzU1LCIkdGVzdGRpci9kZWNvZGVyX2NvbW1hbmQiKTsKIAogIyBEZWNvZGUuICRvdXRwdXQgaGVyZSBpcyBlaXRoZXIgJG5iZXN0b3V0cHV0IChpZiBkb2luZyBNQlIgZGVjb2RpbmcsIGluIHdoaWNoIGNhc2Ugd2UnbGwKICMgbmVlZCB0aGUgbi1iZXN0IG91dHB1dCkgb3IgJGJlc3RvdXRwdXQgKHdoaWNoIG9ubHkgb3V0cHV0cyB0aGUgaHlwb3RoZXNpcyBidXQgaXMgdG9ucyBmYXN0ZXIpCi0kY2FjaGVwaXBlLT5jbWQoInRlc3QtZGVjb2RlIiwKLSAgICAgICAgICAgICAgICAiJHRlc3RydW4vZGVjb2Rlcl9jb21tYW5kIiwKKyRjYWNoZXBpcGUtPmNtZCgidGVzdC1kZWNvZGUtJHtPUFRJTUlaRVJfUlVOfSIsCisgICAgICAgICAgICAgICAgIiR0ZXN0ZGlyL2RlY29kZXJfY29tbWFuZCIsCiAgICAgICAgICAgICAgICAgJFRFU1R7c291cmNlfSwKLSAgICAgICAgICAgICAgICAiJHRlc3RydW4vZGVjb2Rlcl9jb21tYW5kIiwKLSAgICAgICAgICAgICAgICAiJHRlc3RydW4vbW9kZWwvam9zaHVhLmNvbmZpZyIsCi0gICAgICAgICAgICAgICAgZ2V0X2ZpbGVfZnJvbV9ncmFtbWFyKCRURVNUX0dSQU1NQVIpIHx8ICIkdGVzdHJ1bi9tb2RlbC9qb3NodWEuY29uZmlnIiwKKyAgICAgICAgICAgICAgICAiJHRlc3RkaXIvZGVjb2Rlcl9jb21tYW5kIiwKKyAgICAgICAgICAgICAgICAiJHRlc3Rtb2RlbGRpci9qb3NodWEuY29uZmlnIiwKKyAgICAgICAgICAgICAgICBnZXRfZmlsZV9mcm9tX2dyYW1tYXIoJFRFU1RfR1JBTU1BUikgfHwgIiR0ZXN0bW9kZWxkaXIvam9zaHVhLmNvbmZpZyIsCiAgICAgICAgICAgICAgICAgJG91dHB1dCk7CiAKICMgJGNhY2hlcGlwZS0+Y21kKCJyZW1vdmUtb292IiwKQEAgLTE2NDMsNDYgKzE3MTEsNTQgQEAKIAogIyBFeHRyYWN0IHRoZSAxLWJlc3Qgb3V0cHV0IGZyb20gdGhlIG4tYmVzdCBmaWxlIGlmIHRoZSBuLWJlc3QgZmlsZSBhbG9uZSB3YXMgb3V0cHV0CiBpZiAoJERPX01CUikgewotICAkY2FjaGVwaXBlLT5jbWQoInRlc3QtZXh0cmFjdC1vbmViZXN0IiwKKyAgJGNhY2hlcGlwZS0+Y21kKCJ0ZXN0LWV4dHJhY3Qtb25lYmVzdC0ke09QVElNSVpFUl9SVU59IiwKICAgICAgICAgICAgICAgICAgICJqYXZhIC1YbXg1MDBtIC1jcCAkSk9TSFVBL2NsYXNzIC1EZmlsZS5lbmNvZGluZz11dGY4IGpvc2h1YS51dGlsLkV4dHJhY3RUb3BDYW5kICRuYmVzdG91dHB1dCAkYmVzdG91dHB1dCIsCiAgICAgICAgICAgICAgICAgICAkbmJlc3RvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAkYmVzdG91dHB1dCk7CiB9ICAKIAogIyBOb3cgY29tcHV0ZSB0aGUgQkxFVSBzY29yZSBvbiB0aGUgMS1iZXN0IG91dHB1dAotJGNhY2hlcGlwZS0+Y21kKCJ0ZXN0LWJsZXUiLAotICAgICAgICAgICAgICAgICIkSk9TSFVBL2Jpbi9ibGV1ICRvdXRwdXQgJFRFU1R7dGFyZ2V0fSA+ICR0ZXN0cnVuL2JsZXUiLAorJGNhY2hlcGlwZS0+Y21kKCJ0ZXN0LWJsZXUtJHtPUFRJTUlaRVJfUlVOfSIsCisgICAgICAgICAgICAgICAgIiRKT1NIVUEvYmluL2JsZXUgJG91dHB1dCAkVEVTVHt0YXJnZXR9ID4gJHRlc3RkaXIvYmxldSIsCiAgICAgICAgICAgICAgICAgJGJlc3RvdXRwdXQsCi0gICAgICAgICAgICAgICAgIiR0ZXN0cnVuL2JsZXUiKTsKKyAgICAgICAgICAgICAgICAiJHRlc3RkaXIvYmxldSIpOwogCiAjIFVwZGF0ZSB0aGUgQkxFVSBzdW1tYXJ5LgotY29tcHV0ZV9ibGV1X3N1bW1hcnkoIiR0ZXN0cnVuL2JsZXUiLCAiJHRlc3RydW4vZmluYWwtYmxldSIpOworY29tcHV0ZV9ibGV1X3N1bW1hcnkoInRlc3QvKi9ibGV1IiwgInRlc3QvZmluYWwtYmxldSIpOworCitpZiAoZGVmaW5lZCAkTUVURU9SKSB7CisgICRjYWNoZXBpcGUtPmNtZCgidGVzdC1tZXRlb3ItJHtPUFRJTUlaRVJfUlVOfSIsCisgICAgICAgICAgICAgICAgICAiJEpPU0hVQS9iaW4vbWV0ZW9yICRvdXRwdXQgJFRFU1R7dGFyZ2V0fSAkVEFSR0VUID4gJHRlc3RkaXIvbWV0ZW9yIiwKKyAgICAgICAgICAgICAgICAgICRiZXN0b3V0cHV0LAorICAgICAgICAgICAgICAgICAgIiR0ZXN0ZGlyL21ldGVvciIpOworICBjb21wdXRlX21ldGVvcl9zdW1tYXJ5KCJ0ZXN0LyovbWV0ZW9yIiwgInRlc3QvZmluYWwtbWV0ZW9yIik7Cit9CiAKIGlmICgkRE9fTUJSKSB7CiAgIG15ICRudW1saW5lcyA9IGBjYXQgJFRFU1R7c291cmNlfSB8IHdjIC1sYDsKICAgJG51bWxpbmVzLS07Ci0gIG15ICRtYnJfb3V0cHV0ID0gIiR0ZXN0cnVuL291dHB1dC5tYnIiOworICBteSAkbWJyX291dHB1dCA9ICIkdGVzdGRpci9vdXRwdXQubWJyIjsKIAotICAkY2FjaGVwaXBlLT5jbWQoInRlc3Qtb25lYmVzdC1wYXJtYnIiLCAKKyAgJGNhY2hlcGlwZS0+Y21kKCJ0ZXN0LW9uZWJlc3QtcGFybWJyLSR7T1BUSU1JWkVSX1JVTn0iLCAKICAgICAgICAgICAgICAgICAgICJjYXQgJG5iZXN0b3V0cHV0IHwgamF2YSAtWG14MTcwMG0gLWNwICRKT1NIVUEvY2xhc3MgLURmaWxlLmVuY29kaW5nPXV0Zjggam9zaHVhLmRlY29kZXIuTmJlc3RNaW5SaXNrUmVyYW5rZXIgZmFsc2UgMSAkTlVNX1RIUkVBRFMgPiAkbWJyX291dHB1dCIsCiAgICAgICAgICAgICAgICAgICAkbmJlc3RvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAkbWJyX291dHB1dCk7CiAKLSAgJGNhY2hlcGlwZS0+Y21kKCJ0ZXN0LWJsZXUtbWJyIiwKLSAgICAgICAgICAgICAgICAgICIkSk9TSFVBL2Jpbi9ibGV1IG91dHB1dCAkVEVTVHt0YXJnZXR9ICRudW1yZWZzID4gJHRlc3RydW4vYmxldS5tYnIiLAorICAkY2FjaGVwaXBlLT5jbWQoInRlc3QtYmxldS1tYnItJHtPUFRJTUlaRVJfUlVOfSIsCisgICAgICAgICAgICAgICAgICAiJEpPU0hVQS9iaW4vYmxldSBvdXRwdXQgJFRFU1R7dGFyZ2V0fSAkbnVtcmVmcyA+ICR0ZXN0ZGlyL2JsZXUubWJyIiwKICAgICAgICAgICAgICAgICAgICRtYnJfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgIiR0ZXN0cnVuL2JsZXUubWJyIik7CisgICAgICAgICAgICAgICAgICAiJHRlc3RkaXIvYmxldS5tYnIiKTsKIAotICBjb21wdXRlX2JsZXVfc3VtbWFyeSgiJHRlc3RydW4vYmxldS5tYnIiLCAiJHRlc3RydW4vZmluYWwtYmxldS1tYnIiKTsKKyAgY29tcHV0ZV9ibGV1X3N1bW1hcnkoInRlc3QvKi9ibGV1Lm1iciIsICJ0ZXN0L2ZpbmFsLWJsZXUtbWJyIik7CiB9CiAKLWNvbXB1dGVfdGltZV9zdW1tYXJ5KCIkdGVzdHJ1bi9qb3NodWEubG9nIiwgIiR0ZXN0cnVuL2ZpbmFsLXRpbWVzIik7Citjb21wdXRlX3RpbWVfc3VtbWFyeSgidGVzdC8qL2pvc2h1YS5sb2ciLCAidGVzdC9maW5hbC10aW1lcyIpOwogCiAjIE5vdyBkbyB0aGUgYW5hbHlzaXMKIGlmICgkRE9JTkdfTEFUVElDRVMpIHsKICAgIyBleHRyYWN0IHRoZSBzb3VyY2UKLSAgbXkgJHNvdXJjZSA9ICIkdGVzdHJ1bi90ZXN0LmxhdHRpY2UtcGF0aC50eHQiOwotICAkY2FjaGVwaXBlLT5jbWQoInRlc3QtbGF0dGljZS1leHRyYWN0LXNvdXJjZSIsCisgIG15ICRzb3VyY2UgPSAiJHRlc3RkaXIvdGVzdC5sYXR0aWNlLXBhdGgudHh0IjsKKyAgJGNhY2hlcGlwZS0+Y21kKCJ0ZXN0LWxhdHRpY2UtZXh0cmFjdC1zb3VyY2UtJHtPUFRJTUlaRVJfUlVOfSIsCiAgICAgICAgICAgICAgICAgICAiJEpPU0hVQS9iaW4vZXh0cmFjdC0xYmVzdCAkbmJlc3RvdXRwdXQgMiB8IHBlcmwgLXBlICdzLzxzPiAvLycgPiAkc291cmNlIiwKICAgICAgICAgICAgICAgICAgICRuYmVzdG91dHB1dCwgJHNvdXJjZSk7CiAKQEAgLTE3NDUsOSArMTgyMSwxNiBAQAogCiAgIG15ICRpbmZpbGVzID0gIGpvaW4oIiAiLCBAaW5maWxlcyk7CiAgIG15ICRvdXRmaWxlcyA9IGpvaW4oIiAiLCBAb3V0ZmlsZXMpOwotICAkY2FjaGVwaXBlLT5jbWQoIiRsYWJlbC1jb3B5LWFuZC1maWx0ZXIiLAotICAgICAgICAgICAgICAgICAgInBhc3RlICRpbmZpbGVzIHwgJFNDUklQVERJUi90cmFpbmluZy9maWx0ZXItZW1wdHktbGluZXMucGwgfCAkU0NSSVBURElSL3RyYWluaW5nL3NwbGl0MmZpbGVzLnBsICRvdXRmaWxlcyIsCi0gICAgICAgICAgICAgICAgICBAaW5kZXBzLCBAb3V0ZmlsZXMpOworICAjIG9ubHkgc2tpcCBibGFuayBsaW5lcyBmb3IgdHJhaW5pbmcgZGF0YQorICBpZiAoJGxhYmVsIGVxICJ0cmFpbiIpIHsKKyAgICAkY2FjaGVwaXBlLT5jbWQoIiRsYWJlbC1jb3B5LWFuZC1maWx0ZXIiLAorICAgICAgICAgICAgICAgICAgICAiJFBBU1RFICRpbmZpbGVzIHwgJFNDUklQVERJUi90cmFpbmluZy9maWx0ZXItZW1wdHktbGluZXMucGwgfCAkU0NSSVBURElSL3RyYWluaW5nL3NwbGl0MmZpbGVzLnBsICRvdXRmaWxlcyIsCisgICAgICAgICAgICAgICAgICAgIEBpbmRlcHMsIEBvdXRmaWxlcyk7CisgIH0gZWxzZSB7CisgICAgJGNhY2hlcGlwZS0+Y21kKCIkbGFiZWwtY29weS1hbmQtZmlsdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgIiRQQVNURSAkaW5maWxlcyB8ICRTQ1JJUFRESVIvdHJhaW5pbmcvc3BsaXQyZmlsZXMucGwgJG91dGZpbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgQGluZGVwcywgQG91dGZpbGVzKTsKKyAgfQogICAjIERvbmUgY29uY2F0ZW5hdGluZyBhbmQgZmlsdGVyaW5nIGZpbGVzCiAKICAgbXkgJHByZWZpeCA9ICIkbGFiZWwiOwpAQCAtMTc4Nyw3ICsxODcwLDcgQEAKIAogCQkjIHRyaW0gdHJhaW5pbmcgZGF0YQogCQkkY2FjaGVwaXBlLT5jbWQoIiRsYWJlbC10cmltIiwKLQkJCQkJCQkJCQkicGFzdGUgJGluZmlsZWxpc3QgfCAkU0NSSVBURElSL3RyYWluaW5nL3RyaW1fcGFyYWxsZWxfY29ycHVzLnBsICRtYXhsZW4gfCAkU0NSSVBURElSL3RyYWluaW5nL3NwbGl0MmZpbGVzLnBsICRvdXRmaWxlbGlzdCIsCisJCQkJCQkJCQkJIiRQQVNURSAkaW5maWxlbGlzdCB8ICRTQ1JJUFRESVIvdHJhaW5pbmcvdHJpbV9wYXJhbGxlbF9jb3JwdXMucGwgJG1heGxlbiB8ICRTQ1JJUFRESVIvdHJhaW5pbmcvc3BsaXQyZmlsZXMucGwgJG91dGZpbGVsaXN0IiwKICAgICAgICAgICAgICAgICAgICAgQGluZmlsZXMsCiAgICAgICAgICAgICAgICAgICAgIEBvdXRmaWxlcyk7CiAJCSRwcmVmaXggLj0gIi4kbWF4bGVuIjsKQEAgLTE4ODksOSArMTk3Miw5IEBACiAgICMgaWYgaXQncyBub3QgYWxyZWFkeSB1bnBhY2tlZCwgdW5wYWNrIGl0CiAgIGlmICghIC1kICJoYWRvb3AiKSB7CiAKLSAgICBteSAkaGFkb29wX3RtcF9kaXIgPSB0ZW1wZGlyKCJoYWRvb3AtMC4yMC4yLlhYWFgiLCBESVIgPT4gJFRNUERJUiwgQ0xFQU5VUCA9PiAxKTsKLQkJc3lzdGVtKCJ0YXIgeHpmICRKT1NIVUEvbGliL2hhZG9vcC0wLjIwLjIudGFyLmd6IC1DICRoYWRvb3BfdG1wX2RpciIpOwotCQlzeXN0ZW0oImxuIC1zZiAkaGFkb29wX3RtcF9kaXIvaGFkb29wLTAuMjAuMiBoYWRvb3AiKTsKKyAgICBteSAkaGFkb29wX3RtcF9kaXIgPSB0ZW1wZGlyKCJoYWRvb3AtWFhYWCIsIERJUiA9PiAkVE1QRElSLCBDTEVBTlVQID0+IDApOworCQlzeXN0ZW0oInRhciB4emYgJEpPU0hVQS9saWIvaGFkb29wLTIuNS4yLnRhci5neiAtQyAkaGFkb29wX3RtcF9kaXIiKTsKKwkJc3lzdGVtKCJsbiAtc2YgJGhhZG9vcF90bXBfZGlyL2hhZG9vcC0yLjUuMiBoYWRvb3AiKTsKICAgICBpZiAoZGVmaW5lZCAkSEFET09QX0NPTkYpIHsKICAgICAgIHByaW50IFNUREVSUiAiQ29weWluZyBIQURPT1BfQ09ORigkSEFET09QX0NPTkYpIHRvIGhhZG9vcC9jb25mL2NvcmUtc2l0ZS54bWxcbiI7CiAgICAgICBzeXN0ZW0oImNwICRIQURPT1BfQ09ORiBoYWRvb3AvY29uZi9jb3JlLXNpdGUueG1sIik7CkBAIC0xOTA4LDEwICsxOTkxLDEwIEBACiAgIH0KIH0KIAotc3ViIHRlYXJkb3duX2hhZG9vcF9jbHVzdGVyIHsKLSAgc3RvcF9oYWRvb3BfY2x1c3RlcigpOwotICBzeXN0ZW0oInJtIC1mIGhhZG9vcCIpOwotfQorI3N1YiB0ZWFyZG93bl9oYWRvb3BfY2x1c3RlciB7CisjICBzdG9wX2hhZG9vcF9jbHVzdGVyKCk7CisjICBzeXN0ZW0oInJtIC1mIGhhZG9vcCIpOworI30KIAogc3ViIGlzX2xhdHRpY2UgewogICBteSAkZmlsZSA9IHNoaWZ0OwpAQCAtMTkyNyw2ICsyMDEwLDEyIEBACiAgIH0KIH0KIAorIyBTZXQgbWVtYmVyc2hpcDogaXMgdmFsdWUgaW4gYXJyYXk/CitzdWIgaW4geworICBteSAoJHZhbHVlLCAkYXJyYXkpID0gQF87CisgIHJldHVybiBncmVwKCAvXiR2YWx1ZSQvLCBAJGFycmF5ICk7Cit9CisKICMgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIG5hbWVzIG9mIGFsbCB0aGUgZmVhdHVyZXMgaW4gdGhlIGdyYW1tYXIuIERlbnNlIGZlYXR1cmVzCiAjIGFyZSBuYW1lZCB3aXRoIGNvbnNlY3V0aXZlIGludGVnZXJzIHN0YXJ0aW5nIGF0IDAsIHdoaWxlIHNwYXJzZSBmZWF0dXJlcyBjYW4gaGF2ZSBhbnkgbmFtZS4KICMgVG8gZ2V0IHRoZSBmZWF0dXJlIG5hbWVzIGZyb20gYW4gdW5wYWNrZWQgZ3JhbW1hciwgd2UgaGF2ZSB0byByZWFkIHRocm91Z2ggdGhlIHdob2xlIGdyYW1tYXIsCkBAIC0yMDAxLDEyICsyMDkwLDMyIEBACiAKICAgbXkgJHJlZmVyZW5jZXMgPSBqb2luKCIgLXIgIiwgQHJlZmVyZW5jZXMpOwogCi0gICRjYWNoZXBpcGUtPmNtZCgiYW5hbHl6ZS10ZXN0IiwKKyAgJGNhY2hlcGlwZS0+Y21kKCJhbmFseXplLXRlc3QtJHtPUFRJTUlaRVJfUlVOfSIsCiAgICAgICAgICAgICAgICAgICAiJFNDUklQVERJUi9hbmFseXNpcy9zZW50ZW5jZS1ieS1zZW50ZW5jZS5wbCAtcyAkc291cmNlIC1yICRyZWZlcmVuY2VzICRvdXRwdXQgPiAkZGlyL2FuYWx5c2lzL3NlbnRlbmNlLWJ5LXNlbnRlbmNlLmh0bWwiLAogICAgICAgICAgICAgICAgICAgJG91dHB1dCwKICAgICAgICAgICAgICAgICAgICIkZGlyL2FuYWx5c2lzL3NlbnRlbmNlLWJ5LXNlbnRlbmNlLmh0bWwiKTsKIH0KIAorc3ViIGNvbXB1dGVfbWV0ZW9yX3N1bW1hcnkgeworICBteSAoJGZpbGVwYXR0ZXJuLCAkb3V0cHV0ZmlsZSkgPSBAXzsKKworICAjIEF2ZXJhZ2UgdGhlIHJ1bnMsIHJlcG9ydCByZXN1bHQKKyAgbXkgQHNjb3JlczsKKyAgbXkgJG51bXJlY3MgPSAwOworICBvcGVuIENNRCwgImdyZXAgJ15GaW5hbCBzY29yZScgJGZpbGVwYXR0ZXJuIHwiOworICBteSBARiA9IHNwbGl0KCcgJywgPENNRD4pOworICBjbG9zZShDTUQpOworICBwdXNoKEBzY29yZXMsIDEuMCAqICRGWy0xXSk7CisKKyAgaWYgKHNjYWxhciBAc2NvcmVzKSB7CisgICAgbXkgJGZpbmFsX3Njb3JlID0gc3VtKEBzY29yZXMpIC8gKHNjYWxhciBAc2NvcmVzKTsKKworICAgIG9wZW4gU1VNTUFSWSwgIj4kb3V0cHV0ZmlsZSIgb3IgZGllICJDYW4ndCB3cml0ZSB0byAkb3V0cHV0ZmlsZSI7CisgICAgcHJpbnRmKFNVTU1BUlkgIiVzIC8gJWQgPSAlLjRmXG4iLCBqb2luKCIgKyAiLCBAc2NvcmVzKSwgc2NhbGFyIEBzY29yZXMsICRmaW5hbF9zY29yZSk7CisgICAgY2xvc2UoU1VNTUFSWSk7CisgIH0KK30KKwogc3ViIGNvbXB1dGVfYmxldV9zdW1tYXJ5IHsKICAgbXkgKCRmaWxlcGF0dGVybiwgJG91dHB1dGZpbGUpID0gQF87CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvcHJlcHJvY2Vzcy5zaCBiL3NjcmlwdHMvdHJhaW5pbmcvcHJlcHJvY2Vzcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OWU0MzM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy90cmFpbmluZy9wcmVwcm9jZXNzLnNoCkBAIC0wLDAgKzEsOSBAQAorIyEvYmluL2Jhc2gKKworIyBTdHJpbmdzIHRvZ2V0aGVyIHRoZSBwcmVwcm9jZXNzaW5nIHNjcmlwdHMKKworc2V0IC11CisKK2xhbmc9JDEKKworJEpPU0hVQS9zY3JpcHRzL3RyYWluaW5nL25vcm1hbGl6ZS1wdW5jdHVhdGlvbi5wbCAkbGFuZyB8ICRKT1NIVUEvc2NyaXB0cy90cmFpbmluZy9wZW5uLXRyZWViYW5rLXRva2VuaXplci5wZXJsIC1sICRsYW5nIHwgJEpPU0hVQS9zY3JpcHRzL2xvd2VyY2FzZS5wZXJsCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL3J1bl90dW5lci5weSBiL3NjcmlwdHMvdHJhaW5pbmcvcnVuX3R1bmVyLnB5CmluZGV4IDczOTZiZDYuLmRkMWMwODYgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvcnVuX3R1bmVyLnB5CisrKyBiL3NjcmlwdHMvdHJhaW5pbmcvcnVuX3R1bmVyLnB5CkBAIC00NCw3ICs0NCw3IEBACiAtciAgICAgICA8UkVGPgogLXJwcyAgICAgPE5VTVJFRlM+ICAgICAgICAgICAgICAgICAgICMgcmVmZXJlbmNlcyBwZXIgc2VudGVuY2UKIC1wICAgICAgIDxUVU5FRElSPi9wYXJhbXMudHh0ICAgICAgICAjIHBhcmFtZXRlciBmaWxlCi0tbSAgICAgICBCTEVVIDQgY2xvc2VzdCAgICAgICAgICAgICAgIyBldmFsdWF0aW9uIG1ldHJpYyBhbmQgaXRzIG9wdGlvbnMKKy1tICAgICAgIDxNRVRSSUM+ICAgICAgICAgICAgICAgICAgICAjIGV2YWx1YXRpb24gbWV0cmljIGFuZCBpdHMgb3B0aW9ucwogLW1heEl0ICAgPElURVJBVElPTlM+ICAgICAgICAgICAgICAgICMgbWF4aW11bSBNRVJUIGl0ZXJhdGlvbnMKIC1pcGkgICAgIDIwICAgICAgICAgICAgICAgICAgICAgICAgICAjIG51bWJlciBvZiBpbnRlcm1lZGlhdGUgaW5pdGlhbCBwb2ludHMgcGVyIGl0ZXJhdGlvbgogLWNtZCAgICAgPERFQ09ERVJfQ09NTUFORD4gICAgICAgICAgICMgZmlsZSBjb250YWluaW5nIGNvbW1hbmRzIHRvIHJ1biBkZWNvZGVyCkBAIC02NSw3ICs2NSw3IEBACiAtcAkgPFRVTkVESVI+L3BhcmFtcy50eHQKIAogI21ldHJpYyBzZXR0aW5nOgotLW0JIEJMRVUgNCBjbG9zZXN0CistbQkgPE1FVFJJQz4KICMtbQkgVEVSIG5vY2FzZSBwdW5jIDUgNSBqb3NodWEvem1lcnQvdGVyY29tLTAuNy4yNS90ZXJjb20uNy4yNS5qYXIgMQogIy1tCSBURVItQkxFVSBub2Nhc2UgcHVuYyAyMCA1MCAgam9zaHVhL3ptZXJ0L3RlcmNvbS0wLjcuMjUvdGVyY29tLjcuMjUuamFyIDEgNCBjbG9zZXN0CiAjLW0JIE1FVEVPUiBlbiBub3JtX3llcyBrZWVwUHVuYyAyICAjb2xkIG1ldGVvciBpbnRlcmZhY2UgICNaLU1FUlQgTWV0ZW9yIGludGVyZmFjZShub3Qgd29ya2luZykKQEAgLTEzMCw3ICsxMzAsNyBAQAogLXAgPFRVTkVESVI+L3BhcmFtcy50eHQKIAogI21ldHJpYyBzZXR0aW5nOgotLW0gICAgICAgQkxFVSA0IGNsb3Nlc3QKKy1tICAgICAgIDxNRVRSSUM+CiAjLW0gICAgICBURVIgbm9jYXNlIHB1bmMgNSA1IGpvc2h1YS96bWVydC90ZXJjb20tMC43LjI1L3RlcmNvbS43LjI1LmphciAxCiAjLW0gICAgICBURVItQkxFVSBub2Nhc2UgcHVuYyAyMCA1MCAgam9zaHVhL3ptZXJ0L3RlcmNvbS0wLjcuMjUvdGVyY29tLjcuMjUuamFyIDEgNCBjbG9zZXN0CiAjLW0gICAgICBNRVRFT1IgZW4gbm9ybV95ZXMga2VlcFB1bmMgMiAgI29sZCBtZXRlb3IgaW50ZXJmYWNlICAjWi1NRVJUIE1ldGVvciBpbnRlcmZhY2Uobm90IHdvcmtpbmcpCkBAIC0xOTQsMTMgKzE5NCw5MyBAQAogLXJ1blBlcmNlcCAwCiAiIiIKIAorQURBR1JBRF9DT05GSUdfVEVNUExBVEUgPSAiIiIjIyMgUGFydCAxOiBwYXJhbWV0ZXJzIHNpbWlsYXIgdG8gWi1NRVJUCisjIHRhcmdldCBzZW50ZW5jZXMgZmlsZSBuYW1lIChpbiB0aGlzIGNhc2UsIGZpbGUgbmFtZSBwcmVmaXgpCistcgkgPFJFRj4KKworIyByZWZlcmVuY2VzIHBlciBzZW50ZW5jZQorLXJwcyAgICAgPE5VTVJFRlM+CisKKyMgcGFyYW1ldGVyIGZpbGUKKy1wCSA8VFVORURJUj4vcGFyYW1zLnR4dAorCisjbWV0cmljIHNldHRpbmc6CistbQkgPE1FVFJJQz4KKyMtbQkgVEVSIG5vY2FzZSBwdW5jIDUgNSBqb3NodWEvem1lcnQvdGVyY29tLTAuNy4yNS90ZXJjb20uNy4yNS5qYXIgMQorIy1tCSBURVItQkxFVSBub2Nhc2UgcHVuYyAyMCA1MCAgam9zaHVhL3ptZXJ0L3RlcmNvbS0wLjcuMjUvdGVyY29tLjcuMjUuamFyIDEgNCBjbG9zZXN0CisjLW0JIE1FVEVPUiBlbiBub3JtX3llcyBrZWVwUHVuYyAyICAjb2xkIG1ldGVvciBpbnRlcmZhY2UgICNaLU1FUlQgTWV0ZW9yIGludGVyZmFjZShub3Qgd29ya2luZykKKyMtbQkgTWV0ZW9yIGVuIGxvd2VyY2FzZSAnMC41IDEuMCAwLjUgMC41JyAnZXhhY3Qgc3RlbSBzeW5vbnltIHBhcmFwaHJhc2UnICcxLjAgMC41IDAuNSAwLjUnICNDTVUgbWV0ZW9yIGludGVyZmFjZQorCisjIG1heGltdW0gaXRlcmF0aW9ucworLW1heEl0CSA8SVRFUkFUSU9OUz4KKworIyBmaWxlIGNvbnRhaW5pbmcgY29tbWFuZHMgdG8gcnVuIGRlY29kZXIKKy1jbWQJIDxERUNPREVSX0NPTU1BTkQ+CisKKyMgZmlsZSBwcm9kY3VlZCBieSBkZWNvZGVyCistZGVjT3V0CSA8REVDT0RFUl9PVVRQVVQ+CisKKyMgZGVjb2RlciBjb25maWcgZmlsZQorLWRjZmcJIDxERUNPREVSX0NPTkZJRz4KKworIyBzaXplIG9mIE4tYmVzdCBsaXN0CistTgkgMzAwCisKKyMgdmVyYm9zaXR5IGxldmVsICgwLTI7IGhpZ2hlciB2YWx1ZSA9PiBtb3JlIHZlcmJvc2UpCistdgkgMQorCisjIyMgUEFSVCAyOiBBZGFHcmFkIHBhcmFtZXRlcnMKKyNvcmFjbGUgc2VsZWN0aW9uIG1ldGhvZDoKKyMxOiAiaG9wZSIoZGVmYXVsdCkKKyMyOiBiZXN0IG1ldHJpYyBzY29yZShleDogbWF4IEJMRVUpCistb3JhY2xlU2VsZWN0aW9uIDEgCisKKyNwcmVkaWN0aW9uIHNlbGVjdGlvbiBtZXRob2Q6CisjMTogImZlYXIiKGRlZmF1bHQpCisjMjogbWF4IG1vZGVsIHNjb3JlCisjMzogd29yc3QgbWV0cmljIHNjb3JlKGV4OiBtaW4gQkxFVSkKKy1wcmVkaWN0aW9uU2VsZWN0aW9uIDEKKworI3NodWZmbGUgdGhlIHRyYWluaW5nIHNhbXBsZXM/IChkZWZhdWx0OjEpCistbmVlZFNodWZmbGUgMQorCisjYXZlcmFnZSB0aGUgd2VpZ2h0cyBhZnRlciBlYWNoIGVwb2NoPyAoZGVmYXVsdDoxKQorLW5lZWRBdmcgMQorCisjcmV0dXJuIHRoZSBiZXN0IHdlaWdodHMgZHVyaW5nIHR1bmluZz8gKGRlZmF1bHQ6MSkKKy1yZXR1cm5CZXN0IDEKKworI3doZW4gdXNlIEJMRVUvVEVSLUJMRVUgYXMgbWV0cmljLCB1c2UgdGhlIHBzZXVkbyBjb3JwdXMgdG8gY29tcHV0ZSBCTEVVPyAoZGVmYXVsdDoxKQorLXVzZVBzZXVkb0NvcnB1cyAxCisKKyNjb3JwdXMgZGVjYXkgY29lZmZpY2llbnQgKG9ubHkgdmFsaWQgd2hlbiBwc2V1ZG8gY29ycHVzIGlzIHVzZWQgZm9yIEJMRVUsIGRlZmF1bHQ6MC45OSkKKy1jb3JwdXNEZWNheSAwLjk5CisKKyNzY2FsZSB0aGUgbW9kZWwgc2NvcmUoaW4gb3JkZXIgdG8gbWFrZSBpdCBjb21wYXJhYmxlIHRvIHRoZSBtZXRyaWMgc2NvcmUpPyhkZWZhdWx0OjEpCistbmVlZFNjYWxpbmcgMQorCisjb3B0aW9ucyBmb3Igc2NhbGluZyAob25seSB2YWxpZCB3aGVuIC1uZWVkU2NhbGluZz0xKQorLXNjb3JlUmF0aW8gNQkjc2NhbGUgdGhlIG1vZGVsIHNjb3JlIHNvIHRoYXQgYWJzKG1vZGVsX3Njb3JlL21ldHJpY19zY29yZSkgXGFwcHJveCBzY29yZVJhdGlvIChkZWZhdWx0OjUpCisKKyNyZWd1bGFyemF0aW9uICgwOiBubyByZWcgMTogbDEtcmVnOyAyOiBsMi1yZWcuIERlZmF1bHQ6IDIpCistcmVndWxhcml6YXRpb24gMgorCisjcmVndWxhcml6YXRpb24gY29lZmZpY2llbnQKKy1sYW1iZGEgMC4xCisKKyNzdGVwIHNpemUgY29lZmZpY2llbnQKKy1ldGEgMC4xCisKKyNtaW5pLWJhdGNoIHNpemUgKGRlZmF1bHQ6IDEwKQorLWJhdGNoU2l6ZSAxMAorIiIiCisKIFBBUkFNU19URU1QTEFURSA9ICIiIjxQQVJBTVM+CiBXb3JkUGVuYWx0eSAgICAgICAgfHx8IC0yLjg0NDgxNCAgT3B0ICAtSW5mICArSW5mICAtNSAgIDAKIE9PVlBlbmFsdHkgICAgICAgICB8fHwgMSAgICAgICAgICBGaXggICAgIDAgICAgIDAgICAwICAgMAogbm9ybWFsaXphdGlvbiA9IGFic3ZhbCAxIGxtXzAKICIiIgogCi0KIGRlZiB3cml0ZV90ZW1wbGF0ZSh0ZW1wbGF0ZSwgcGF0aCwgbG9va3VwKToKICAgICAiIiJXcml0ZXMgYSB0ZW1wbGF0ZSBmaWxlLCBzdWJzdGl0dXRpbmcgdmFyaWFibGVzIG9mIHRoZSBmb3JtIDxOQU1FPiBmb3IgdmFsdWVzIGZvdW5kCiAgICAgaW4gdGhlICdsb29rdXAnIGhhc2guCkBAIC0yNDgsMTYgKzMyOCwxNiBAQAogICAgIHJldHVybiAob3duZXIsIG1heHNwYW4sIHBhdGgpCiAKIAotZGVmIGdldF9mZWF0dXJlcyhncmFtbWFyX3BhdGgpOgotICAgICIiIk9wZW5zIHRoZSBncmFtbWFyIGF0IGdyYW1tYXJfcGF0aCBhbmQgcmV0dXJucyB0aGUgbGlzdCBvZiBmZWF0dXJlcy4gV29ya3MgZm9yCi0gICAgYm90aCBwYWNrZWQgZ3JhbW1hcnMgYW5kIHVucGFja2VkIGdyYW1tYXJzLiBGb3IgcGFja2VkIGdyYW1tYXJzLCB0aGUgZmVhdHVyZSBsaXN0Ci0gICAgaXMgY29tcGxldGUsIGJ1dCBmb3IgdW5wYWNrZWQgb25lcywgb25seSB0aGUgZmVhdHVyZXMgZm91bmQgb24gdGhlIGZpcnN0IGxpbmUgYXJlCi0gICAgcmV0dXJuZWQuIERlbnNlIGZlYXR1cmVzICh1bmxhYmVsZWQgb25lcykgYXJlIHJldHVybmVkIGFzIHNlcXVlbnRpYWwgbnVtYmVycwotICAgIHN0YXJ0aW5nIGF0IDAuIiIiCitkZWYgZ2V0X2ZlYXR1cmVzKGNvbmZpZ19maWxlKToKKyAgICAiIiJRdWVyaWVzIHRoZSBkZWNvZGVyIGZvciBhbGwgZGVuc2UgZmVhdHVyZXMgdGhhdCB3aWxsIGJlIGZpcmVkIGJ5IHRoZSBmZWF0dXJlCisgICAgZnVuY3Rpb25zIGFjdGl2YXRlZCBpbiB0aGUgY29uZmlnIGZpbGUiIiIKIAotICAgIGZlYXR1cmVzID0gY2hlY2tfb3V0cHV0KCIlcy9zY3JpcHRzL3RyYWluaW5nL2dldF9ncmFtbWFyX2ZlYXR1cmVzLnBsICVzIiAlIChKT1NIVUEsIGdyYW1tYXJfcGF0aCksIHNoZWxsPVRydWUpCi0gICAgcmV0dXJuIGZlYXR1cmVzLnN0cmlwKCkuc3BsaXQoJ1xuJykKLQorICAgIG91dHB1dCA9IGNoZWNrX291dHB1dCgiJXMvYmluL2pvc2h1YS1kZWNvZGVyIC1jICVzIC1zaG93LXdlaWdodHMgLXYgMCIgJSAoSk9TSFVBLCBjb25maWdfZmlsZSksIHNoZWxsPVRydWUpCisgICAgZmVhdHVyZXMgPSBbXQorICAgIGZvciBpbmRleCwgaXRlbSBpbiBlbnVtZXJhdGUob3V0cHV0LnNwbGl0KCdcbicpKToKKyAgICAgICAgaWYgaXRlbSAhPSAiIjoKKyAgICAgICAgICAgIGZlYXR1cmVzLmFwcGVuZCh0dXBsZShpdGVtLnNwbGl0KCkpKQorICAgIHJldHVybiBmZWF0dXJlcwogCiBkZWYgZ2V0X251bV9yZWZzKHByZWZpeCk6CiAgICAgIiIiRGV0ZXJtaW5lcyBob3cgbWFueSByZWZlcmVuY2VzIHRoZXJlIGFyZS4iIiIKQEAgLTI3NiwxMyArMzU2LDEzIEBACiAgICAgCiAKIGRlZiBzYWZlX3N5bWxpbmsodG9fcGF0aCwgZnJvbV9wYXRoKToKLSAgICBpZiAob3MucGF0aC5pc2ZpbGUoZnJvbV9wYXRoKSk6CisgICAgaWYgb3MucGF0aC5pc2ZpbGUoZnJvbV9wYXRoKSBvciBvcy5wYXRoLmlzbGluayhmcm9tX3BhdGgpOgogICAgICAgICBvcy51bmxpbmsoZnJvbV9wYXRoKQogCiAgICAgb3Muc3ltbGluayh0b19wYXRoLCBmcm9tX3BhdGgpCiAKIAotZGVmIHNldHVwX2NvbmZpZ3ModGVtcGxhdGUsIHRlbXBsYXRlX2Rlc3QsIHRhcmdldCwgbnVtX3JlZnMsIHR1bmVkaXIsIGNvbW1hbmQsIGNvbmZpZywgb3V0cHV0LCBpdGVyYXRpb25zKToKK2RlZiBzZXR1cF9jb25maWdzKHRlbXBsYXRlLCB0ZW1wbGF0ZV9kZXN0LCB0YXJnZXQsIG51bV9yZWZzLCB0dW5lZGlyLCBjb21tYW5kLCBjb25maWcsIG91dHB1dCwgbWV0cmljLCBpdGVyYXRpb25zKToKICAgICAiIiJXcml0ZXMgdGhlIGNvbmZpZyBmaWxlcyBmb3IgYm90aCBaLU1FUlQgYW5kIFBSTyAod2hpY2ggcnVuIG9uIHRoZSBzYW1lIGNvZGViYXNlKS4KICAgICBCb3RoIG9mIHRoZW0gd3JpdGUgdGhlIGZpbGUgInBhcmFtcy50eHQiLCBidXQgdGhleSB1c2UgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgY29uZmlnIGZpbGUsCiAgICAgc28gdGhhdCBpcyBhIHBhcmFtZXRlci4iIiIKQEAgLTI5MSwzNyArMzcxLDIwIEBACiAgICAgICAgICAgICAgICAgICAgeyAnUkVGJzogdGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgJ05VTVJFRlMnOiBudW1fcmVmcywKICAgICAgICAgICAgICAgICAgICAgICdUVU5FRElSJzogdHVuZWRpciwKKyAgICAgICAgICAgICAgICAgICAgICdNRVRSSUMnOiBtZXRyaWMsCiAgICAgICAgICAgICAgICAgICAgICAnSVRFUkFUSU9OUyc6IGBpdGVyYXRpb25zYCwKICAgICAgICAgICAgICAgICAgICAgICdERUNPREVSX0NPTU1BTkQnOiBjb21tYW5kLAogICAgICAgICAgICAgICAgICAgICAgJ0RFQ09ERVJfQ09ORklHJzogY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgJ0RFQ09ERVJfT1VUUFVUJzogb3V0cHV0IH0pCiAKLSAgICAjIFBhcnNlIHRoZSBjb25maWcgZmlsZSwgbG9va2luZyBmb3IgdG1zLCBsbXMsIGFuZCBmZWF0dXJlCi0gICAgIyBmdW5jdGlvbnMgZm9yIHdoaWNoIHdlIG5lZWQgdG8gcHJvdmlkZSBpbml0aWFsIHdlaWdodHMKKyAgICAjIFF1ZXJ5IHRoZSBkZWNvZGVyIGZvciB0aGUgbGlzdCBvZiBkZW5zZSBwYXJhbWV0ZXJzLiBUaGVzZSBuZWVkIHRvIGJlIGxpc3RlZCBpbiB0aGUKKyAgICAjIGNvbmZpZyBmaWxlIG9yIE1FUlQgd2lsbCBub3Qga25vdyBhYm91dCB0aGVtLCBkZXNwaXRlIHRoZW0gYmVpbmcgbGlzdGVkIGluIHBhcmFtcy50eHQuCiAgICAgcGFyYW1zID0gW10KLSAgICBsbV9pID0gMAotICAgIGZvciBsaW5lIGluIG9wZW4oY29uZmlnKToKLSAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCd0bSA9Jyk6Ci0gICAgICAgICAgICBvd25lciwgc3BhbiwgcGF0aCA9IHBhcnNlX3RtX2xpbmUobGluZSkKLQotICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aCk6Ci0gICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoY29uZmlnKSwgcGF0aCkKLQotICAgICAgICAgICAgZm9yIGYgaW4gZ2V0X2ZlYXR1cmVzKHBhdGgpOgotICAgICAgICAgICAgICAgIGlmIHJlLm1hdGNoKHInXlxkKyQnLCBmKToKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgndG1fJXNfJXMgfHx8IDEuMCBPcHQgLUluZiArSW5mIC0xICsxJyAlIChvd25lciwgZikpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgnJXMgfHx8IDAuMCBPcHQgLUluZiArSW5mIC0xICsxJyAlIChmKSkKLQotICAgICAgICBlbGlmIGxpbmUuc3RhcnRzd2l0aCgnZmVhdHVyZS1mdW5jdGlvbicpOgotICAgICAgICAgICAgaWYgJ0xhbmd1YWdlTW9kZWwnIGluIGxpbmU6Ci0gICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgnbG1fJWQgfHx8IDEuMCBPcHQgMC4xICtJbmYgKzAuNSArMS41JyAlIChsbV9pKSkKLSAgICAgICAgICAgICAgICBsbV9pICs9IDEKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgZmYgPSBsaW5lLnN0cmlwKCkuc3BsaXQoJyAnLCAyKVsyXQotICAgICAgICAgICAgICAgIGlmIGZmIGluIFsnU291cmNlUGF0aCcsICdQaHJhc2VQZW5hbHR5JywgJ0Rpc3RvcnRpb24nXToKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgnJXMgfHx8IDEuMCBPcHQgLUluZiArSW5mIC0xICsxJyAlIChmZikpCi0gICAgICAgICAgICAgICAgICAgIAorICAgIGZvciBmZWF0dXJlLHdlaWdodCBpbiBnZXRfZmVhdHVyZXMoY29uZmlnKToKKyAgICAgICAgaWYgZmVhdHVyZS5zdGFydHN3aXRoKCdsbV8nKToKKyAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoJyVzIHx8fCAlcyBPcHQgMC4xICtJbmYgKzAuNSArMS41JyAlIChmZWF0dXJlLCB3ZWlnaHQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgnJXMgfHx8ICVzIE9wdCAtSW5mICtJbmYgLTEgKzEnICUgKGZlYXR1cmUsIHdlaWdodCkpCiAgICAgcGFyYW1zdHIgPSAnXG4nLmpvaW4ocGFyYW1zKQogICAgIHdyaXRlX3RlbXBsYXRlKFBBUkFNU19URU1QTEFURSwgJyVzL3BhcmFtcy50eHQnICUgKHR1bmVkaXIpLAogICAgICAgICAgICAgICAgICAgIHsgJ1JFRic6IHRhcmdldCwKQEAgLTMzMSwxMSArMzk0LDExIEBACiAKIAogZGVmIHJ1bl96bWVydCh0dW5lZGlyLCBzb3VyY2UsIHRhcmdldCwgY29tbWFuZCwgY29uZmlnLCBvdXRwdXQsIG9wdHMpOgotICAgICIiIlJ1bnMgWi1NRVJUIGFmdGVyIHNldHRpbmcgdXAgYWxsIGl0cyBjcmF6eSBmaWxlIHJlcXVpcmVtZW50cy4iIiIKKyAgICAiIiJSdW5zIFotTUVSVCBhZnRlciBzZXR0aW5nIHVwIGFsbCBpdHMgZmlsZSByZXF1aXJlbWVudHMuIiIiCiAKICAgICBzZXR1cF9jb25maWdzKFpNRVJUX0NPTkZJR19URU1QTEFURSwgJyVzL21lcnQuY29uZmlnJyAlICh0dW5lZGlyKSwKICAgICAgICAgICAgICAgICAgIHRhcmdldCwgZ2V0X251bV9yZWZzKHRhcmdldCksIHR1bmVkaXIsIGNvbW1hbmQsIGNvbmZpZywgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgb3B0cy5pdGVyYXRpb25zIG9yIDEwKQorICAgICAgICAgICAgICAgICAgb3B0cy5tZXRyaWMsIG9wdHMuaXRlcmF0aW9ucyBvciAxMCkKIAogICAgIHR1bmVyX21lbSA9ICc0ZycKICAgICBjYWxsKCJqYXZhIC1kNjQgLVhteCVzIC1jcCAlcy9jbGFzcyBqb3NodWEuem1lcnQuWk1FUlQgLW1heE1lbSA0MDAwICVzL21lcnQuY29uZmlnID4gJXMvbWVydC5sb2cgMj4mMSIgJSAodHVuZXJfbWVtLCBKT1NIVUEsIHR1bmVkaXIsIHR1bmVkaXIpLCBzaGVsbD1UcnVlKQpAQCAtMzQ1LDExICs0MDgsMTEgQEAKICAgICAKIAogZGVmIHJ1bl9wcm8odHVuZWRpciwgc291cmNlLCB0YXJnZXQsIGNvbW1hbmQsIGNvbmZpZywgb3V0cHV0LCBvcHRzKToKLSAgICAiIiJSdW5zIFBSTyBhZnRlciBzZXR0aW5nIHVwIGFsbCBpdHMgY3JhenkgZmlsZSByZXF1aXJlbWVudHMuIiIiCisgICAgIiIiUnVucyBQUk8gYWZ0ZXIgc2V0dGluZyB1cCBhbGwgaXRzIGZpbGUgcmVxdWlyZW1lbnRzLiIiIgogCiAgICAgc2V0dXBfY29uZmlncyhQUk9fQ09ORklHX1RFTVBMQVRFLCAnJXMvcHJvLmNvbmZpZycgJSAodHVuZWRpciksCiAgICAgICAgICAgICAgICAgICB0YXJnZXQsIGdldF9udW1fcmVmcyh0YXJnZXQpLCB0dW5lZGlyLCBjb21tYW5kLCBjb25maWcsIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgIG9wdHMuaXRlcmF0aW9ucyBvciAzMCkKKyAgICAgICAgICAgICAgICAgIG9wdHMubWV0cmljLCBvcHRzLml0ZXJhdGlvbnMgb3IgMzApCiAKICAgICB0dW5lcl9tZW0gPSAnNGcnCiAgICAgY2FsbCgiamF2YSAtZDY0IC1YbXglcyAtY3AgJXMvY2xhc3Mgam9zaHVhLnByby5QUk8gJXMvcHJvLmNvbmZpZyA+ICVzL3Byby5sb2cgMj4mMSIgJSAodHVuZXJfbWVtLCBKT1NIVUEsIHR1bmVkaXIsIHR1bmVkaXIpLCBzaGVsbD1UcnVlKQpAQCAtMzU5LDExICs0MjIsMTEgQEAKIAogCiBkZWYgcnVuX21pcmEodHVuZWRpciwgc291cmNlLCB0YXJnZXQsIGNvbW1hbmQsIGNvbmZpZywgb3V0cHV0LCBvcHRzKToKLSAgICAiIiJSdW5zIE1JUkEgYWZ0ZXIgc2V0dGluZyB1cCBhbGwgaXRzIGNyYXp5IGZpbGUgcmVxdWlyZW1lbnRzLiIiIgorICAgICIiIlJ1bnMgTUlSQSBhZnRlciBzZXR0aW5nIHVwIGFsbCBpdHMgZmlsZSByZXF1aXJlbWVudHMuIiIiCiAKICAgICBzZXR1cF9jb25maWdzKE1JUkFfQ09ORklHX1RFTVBMQVRFLCAnJXMvbWlyYS5jb25maWcnICUgKHR1bmVkaXIpLAogICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBnZXRfbnVtX3JlZnModGFyZ2V0KSwgdHVuZWRpciwgY29tbWFuZCwgY29uZmlnLCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICBvcHRzLml0ZXJhdGlvbnMgb3IgNSkKKyAgICAgICAgICAgICAgICAgIG9wdHMubWV0cmljLCBvcHRzLml0ZXJhdGlvbnMgb3IgNSkKIAogICAgIHR1bmVyX21lbSA9ICc0ZycKICAgICBjYWxsKCJqYXZhIC1kNjQgLVhteCVzIC1jcCAlcy9jbGFzcyBqb3NodWEubWlyYS5NSVJBICVzL21pcmEuY29uZmlnID4gJXMvbWlyYS5sb2cgMj4mMSIgJSAodHVuZXJfbWVtLCBKT1NIVUEsIHR1bmVkaXIsIHR1bmVkaXIpLCBzaGVsbD1UcnVlKQpAQCAtMzcxLDcgKzQzNCwxOSBAQAogICAgIHNhZmVfc3ltbGluayhvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGNvbmZpZyksJ2pvc2h1YS5jb25maWcuTUlSQS5maW5hbCcpLAogICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4odHVuZWRpciwgJ2pvc2h1YS5jb25maWcuZmluYWwnKSkKIAotICAgIAorZGVmIHJ1bl9hZGFncmFkKHR1bmVkaXIsIHNvdXJjZSwgdGFyZ2V0LCBjb21tYW5kLCBjb25maWcsIG91dHB1dCwgb3B0cyk6CisgICAgIiIiUnVucyBBREFHUkFEIGFmdGVyIHNldHRpbmcgdXAgYWxsIGl0cyBmaWxlIHJlcXVpcmVtZW50cy4iIiIKKworICAgIHNldHVwX2NvbmZpZ3MoQURBR1JBRF9DT05GSUdfVEVNUExBVEUsICclcy9hZGFncmFkLmNvbmZpZycgJSAodHVuZWRpciksCisgICAgICAgICAgICAgICAgICB0YXJnZXQsIGdldF9udW1fcmVmcyh0YXJnZXQpLCB0dW5lZGlyLCBjb21tYW5kLCBjb25maWcsIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgIG9wdHMubWV0cmljLCBvcHRzLml0ZXJhdGlvbnMgb3IgMTApCisKKyAgICB0dW5lcl9tZW0gPSAnNGcnCisgICAgY2FsbCgiamF2YSAtZDY0IC1YbXglcyAtY3AgJXMvY2xhc3Mgam9zaHVhLmFkYWdyYWQuQWRhR3JhZCAlcy9hZGFncmFkLmNvbmZpZyA+ICVzL2FkYWdyYWQubG9nIDI+JjEiICUgKHR1bmVyX21lbSwgSk9TSFVBLCB0dW5lZGlyLCB0dW5lZGlyKSwgc2hlbGw9VHJ1ZSkKKworICAgIHNhZmVfc3ltbGluayhvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGNvbmZpZyksJ2pvc2h1YS5jb25maWcuQURBR1JBRC5maW5hbCcpLAorICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4odHVuZWRpciwgJ2pvc2h1YS5jb25maWcuZmluYWwnKSkKKwogZGVmIGVycm9yX3F1aXQobWVzc2FnZSk6CiAgICAgbG9nZ2luZy5lcnJvcihtZXNzYWdlKQogICAgIHN5cy5leGl0KDIpCkBAIC0zOTcsNyArNDcyLDcgQEAKICAgICAgICAgaGVscD0ncGF0aCB0byB0dW5pbmcgZGlyZWN0b3J5JykKICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAnLS10dW5lcicsIGRlZmF1bHQ9J3ptZXJ0JywKLSAgICAgICAgaGVscD0nd2hpY2ggdHVuZXIgdG8gdXNlOiB6bWVydCwgcHJvLCBvciBtaXJhJykKKyAgICAgICAgaGVscD0nd2hpY2ggdHVuZXIgdG8gdXNlOiB6bWVydCwgcHJvLCBtaXJhLCBvciBhZGFncmFkJykKICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAnLS1kZWNvZGVyJywgZGVmYXVsdD0ndHVuZS9kZWNvZGVyX2NvbW1hbmQnLAogICAgICAgICBoZWxwPSdUaGUgcGF0aCB0byB0aGUgZGVjb2RlciBvciB3cmFwcGVyIHNjcmlwdC4gVGhpcyBzY3JpcHQgaXMgcmVzcG9uc2libGUgZm9yICcKQEAgLTQyMCw2ICs0OTUsOSBAQAogICAgICAgICAnLWknLCAnLS1pdGVyYXRpb25zJywgdHlwZT1pbnQsIAogICAgICAgICBoZWxwPSd0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBydW4gdGhlIHR1bmVyIGZvcicpCiAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy1tJywgJy0tbWV0cmljJywgZGVmYXVsdD0nQkxFVSA0IGNsb3Nlc3QnLAorICAgICAgICBoZWxwPSd0aGUgbWV0cmljIHRvIG9wdGltaXplJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAnLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgaGVscD0ncHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcycKICAgICApCkBAIC00NDcsNiArNTI1LDkgQEAKICAgICBlbGlmICdtaXJhJyBpbiBvcHRzLnR1bmVyOgogICAgICAgICBydW5fbWlyYShvcHRzLnR1bmVkaXIsIG9wdHMuc291cmNlLCBvcHRzLnRhcmdldCwgb3B0cy5kZWNvZGVyLCBvcHRzLmRlY29kZXJfY29uZmlnLCBvcHRzLmRlY29kZXJfb3V0cHV0X2ZpbGUsIG9wdHMpCiAKKyAgICBlbGlmICdhZGFncmFkJyBpbiBvcHRzLnR1bmVyOgorICAgICAgICBydW5fYWRhZ3JhZChvcHRzLnR1bmVkaXIsIG9wdHMuc291cmNlLCBvcHRzLnRhcmdldCwgb3B0cy5kZWNvZGVyLCBvcHRzLmRlY29kZXJfY29uZmlnLCBvcHRzLmRlY29kZXJfb3V0cHV0X2ZpbGUsIG9wdHMpCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdHJ5OgogICAgICAgICBhc3NlcnQgSk9TSFVBCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL3N1bW1hcml6ZS5wbCBiL3NjcmlwdHMvdHJhaW5pbmcvc3VtbWFyaXplLnBsCmluZGV4IDNiNDRlMDkuLmY3ZmY2ZmUgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdHJhaW5pbmcvc3VtbWFyaXplLnBsCisrKyBiL3NjcmlwdHMvdHJhaW5pbmcvc3VtbWFyaXplLnBsCkBAIC0zLDI0ICszLDI4IEBACiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCi1vcGVuZGlyIERJUiwgIi4iIG9yIGRpZTsKK215ICRiYXNlZGlyID0gc2hpZnQoQEFSR1YpIHx8ICIuIjsKKworb3BlbmRpciBESVIsICRiYXNlZGlyIG9yIGRpZTsKIG15IEBkaXJzID0gc29ydCB7ICRhIDw9PiAkYiB9IGdyZXAgL15cZFtcZFwuXSokLywgcmVhZGRpciBESVI7CiBjbG9zZWRpciBESVI7CiAKIGZvcmVhY2ggbXkgJGRpciAoQGRpcnMpIHsKLSAgY2hvbXAobXkgJHJlYWRtZSA9IGBjYXQgJGRpci9SRUFETUVgKTsKLSAgbXkgJGJsZXUgPSBnZXRfYmxldSgiJGRpci90ZXN0L2ZpbmFsLWJsZXUiKTsKLSAgbXkgJHRpbWUgPSBnZXRfdGltZSgiJGRpci90ZXN0L2ZpbmFsLXRpbWVzIik7CisgIGNob21wKG15ICRyZWFkbWUgPSBgW1sgLWUgIiRiYXNlZGlyLyRkaXIvUkVBRE1FIiBdXSAmJiBjYXQgJGJhc2VkaXIvJGRpci9SRUFETUVgKTsKKyAgbXkgJGJsZXUgPSBnZXRfc2NvcmVzKCIkYmFzZWRpci8kZGlyL3Rlc3QvZmluYWwtYmxldSIsIDEwMC4wKTsKKyAgbXkgJG1ldGVvciA9IGdldF9zY29yZXMoIiRiYXNlZGlyLyRkaXIvdGVzdC9maW5hbC1tZXRlb3IiLCAxMDAuMCk7CisgIG15ICR0aW1lID0gZ2V0X3RpbWUoIiRiYXNlZGlyLyRkaXIvdGVzdC9maW5hbC10aW1lcyIpOwogICAjIG15ICRtYnIgPSAgZ2V0X2JsZXUoIiRkaXIvdGVzdC9maW5hbC1ibGV1LW1iciIpOwogCiAgIG15ICRkaXJzdHJpbmcgPSBkaXJzdHJpbmcoJGRpcik7CiAKICAgIyBwcmludCAiJGRpcnN0cmluZ1x0JGJsZXVcdCRtYnJcdCRyZWFkbWVcbiI7Ci0gIHByaW50ICIkZGlyc3RyaW5nXHQkYmxldVx0JHRpbWVcdCRyZWFkbWVcbiI7CisgIHByaW50ICIkZGlyc3RyaW5nXHQkYmxldVx0JG1ldGVvclx0JHRpbWVcdCRyZWFkbWVcbiI7CiB9CiAKLXN1YiBnZXRfYmxldSB7Ci0gIG15ICgkZmlsZSkgPSBAXzsKK3N1YiBnZXRfc2NvcmVzIHsKKyAgbXkgKCRmaWxlLCAkZmFjdG9yKSA9IEBfOworICAkZmFjdG9yID0gMS4wIHVubGVzcyAkZmFjdG9yOwogCiAgIG15ICRzY29yZSA9IDAuMDsKICAgbXkgJG51bV9zY29yZXMgPSAwOwpAQCAtMzIsOSArMzYsMTEgQEAKICAgICAgICRudW1fc2NvcmVzKysgaWYgJHRva2VuIGVxICIrIjsKICAgICB9CiAKLSAgICAkc2NvcmUgPSAkdG9rZW5zWy0xXSAqIDEwMDsKKyAgICAkc2NvcmUgPSAkdG9rZW5zWy0xXSAqICRmYWN0b3I7CiAgIH0KIAorICAkc2NvcmUgLz0gJGZhY3RvciBpZiAkc2NvcmUgPiAkZmFjdG9yOworCiAgIHJldHVybiBzcHJpbnRmKCIlNS4yZiIsICRzY29yZSkgLiAiKCRudW1fc2NvcmVzKSI7CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvdGVtcGxhdGVzL3RocmF4LXBocmFzZS5jb25mIGIvc2NyaXB0cy90cmFpbmluZy90ZW1wbGF0ZXMvdGhyYXgtcGhyYXNlLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwYzc2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvdHJhaW5pbmcvdGVtcGxhdGVzL3RocmF4LXBocmFzZS5jb25mCkBAIC0wLDAgKzEsODAgQEAKKyMgdGhpcyBpcyBhbiBleGFtcGxlIFRocmF4IGNvbmZpZ3VyYXRpb24gZmlsZQorIyA8LSB0aGlzIHN5bWJvbCBpbmRpY2F0ZXMgYSBjb21tZW50CisjIGVhY2ggbGluZSBzaG91bGQgYmUgYSBrZXktdmFsdWUgcGFpciBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZQorCisjIyMKKyMjIyBHUkFNTUFSIE9QVElPTlMKKyMjIworCitncmFtbWFyICAgICBoaWVybyAgICMgb3Igc2FtdAorcmV2ZXJzZSAgICAgZmFsc2UKK3NvdXJjZS1pcy1wYXJzZWQgICAgZmFsc2UKK3RhcmdldC1pcy1wYXJzZWQgICAgZmFsc2UKKyMgZGVmYXVsdC1udCAgICBYICAgIyBYIGlzIHRoZSBkZWZhdWx0IGFueXdheQorCittaW4tcnVsZS1jb3VudCAxCisKKyMgdGhlIG51bWJlciBvZiByZWR1Y2VycworcmVkdWNlcnMgMTYKKworIyBub3Qgb25seSBkbyB0aGVzZSBuZXh0IHNpeCBvcHRpb25zIGhhdmUgdGhlIHN1Z2dlc3RlZCB2YWx1ZXMgYXMgZ2l2ZW4KKyMgaW4gQ2hpYW5nJ3MgIkhpZXJhcmNoaWNhbCBQaHJhc2UtYmFzZWQgVHJhbnNsYXRpb24iIChDTCksIHRoZXkgYXJlIGFsc28KKyMgVGhyYXgncyBkZWZhdWx0IHZhbHVlcyEgWW91IGNvdWxkIGNvbW1lbnQgdGhlbSBvdXQgYW5kIHRoZSByZXN1bHRpbmcgZ3JhbW1hcgorIyB3b3VsZCBiZSBpZGVudGljYWwuCisKKyMgbWF4aW11bSBsZW5ndGggb2YgaW5pdGlhbCBwaHJhc2UgcGFpcnMKK2luaXRpYWwtcGhyYXNlLWxlbmd0aCAgIDEwCitsZXgtc291cmNlLXdvcmRzICAgICAgICAxMAorbGV4LXRhcmdldC13b3JkcyAgICAgICAgMTAKKworIyBtYXhpbXVtIG51bWJlciBvZiBOVHMgaW4gYSBydWxlCithcml0eSAgICAgICAgICAgICAgICAgICAwCisKKyMgbWluaW11bSBudW1iZXIgb2YgYWxpZ25lZCB0ZXJtaW5hbHMgaW4gYSBydWxlCitsZXhpY2FsaXR5ICAgICAgICAgICAgICAxICAgCisKKyMgYWxsb3cgYWRqYWNlbnQgbm9udGVybWluYWxzIG9uIHNvdXJjZSBzaWRlCithZGphY2VudC1udHMgICAgZmFsc2UgICAKKworIyBhbGxvdyB1bmFsaWduZWQgd29yZHMgYXQgYm91bmRhcmllcyBvZiBwaHJhc2VzCitsb29zZSAgICAgICAgICAgdHJ1ZQorCithbGxvdy1hYnN0cmFjdC1ydWxlcyAgICBmYWxzZQorYWxsb3ctbm9ubGV4aWNhbC14ICAgICAgZmFsc2UKK2FsbG93LWZ1bGwtc2VudGVuY2UtcnVsZXMgICBmYWxzZQorCitub25sZXgtc291cmNlLWxlbmd0aCAgICA1Citub25sZXgtdGFyZ2V0LWxlbmd0aCAgICA1Citub25sZXgtc291cmNlLXdvcmRzICAgICA1Citub25sZXgtdGFyZ2V0LXdvcmRzICAgICA1CisKK2FsbG93LWRvdWJsZS1wbHVzICAgIGZhbHNlCisKK3J1bGUtc3Bhbi1saW1pdCAgICAgICAgIDEyCisKK3BocmFzZS1wZW5hbHR5ICAyLjcxOAorCisjIGEgd2hpdGVzcGFjZSBzZXBlcmF0ZWQgbGlzdCBvZiBmZWF0dXJlcworIyBpbiB0aGlzIGV4YW1wbGUsIHRoZSBmZWF0dXJlcyBhcmUgcGhyYXNlIHRyYW5zbGF0aW9uIHByb2JhYmlsaXR5LAorIyBsZXhpY2FsIHByb2JhYmlsaXR5LCBhbmQgcGhyYXNlIHBlbmFsdHkKKyMgZmVhdHVyZXMgICAgICAgIHBocmFzZS1wZW5hbHR5IGUyZnBocmFzZSBmMmVwaHJhc2UgbGV4cHJvYiBsZXhpY2FsIGFic3RyYWN0IGFkamFjZW50IHgtcnVsZSBzb3VyY2UtdGVybWluYWxzLXdpdGhvdXQtdGFyZ2V0IHRhcmdldC10ZXJtaW5hbHMtd2l0aG91dC1zb3VyY2UgbW9ub3RvbmljIGdsdWUtcnVsZSByYXJpdHkgdGFyZ2V0LXdvcmQtY291bnQgdW5hbGlnbmVkLWNvdW50CitmZWF0dXJlcyAgICAgICAgZV9naXZlbl9mX3BocmFzZSBmX2dpdmVuX2VfcGhyYXNlIGVfZ2l2ZW5fZl9sZXggZl9naXZlbl9lX2xleCByYXJpdHkgcGhyYXNlLXBlbmFsdHkgYWxpZ25tZW50CisKKyMgdGhlIG9ubHkgb3B0aW9uIGFuZCBkZWZhdWx0IGxhdGVyIHdlIHdpbGwgd2FudCB0byBhZGQgZm9ybWF0cyBmb3Igb3RoZXIgZGVjb2RlcnMgc3VjaCBhcyBtb3NlcyBhbmQKKyMgY2RlYywgaWYgdGhleSB1c2Ugb3RoZXIgZm9ybWF0cworb3V0cHV0LWZvcm1hdCAgIGpvc2h1YSAgCisKKyMgbGFiZWwgZmVhdHVyZSBzY29yZXM/IGVhY2ggc2NvcmUgd2lsbCBiZSBvdXRwdXQgYXMgbmFtZT1zY29yZQorbGFiZWwtZmVhdHVyZS1zY29yZXMgZmFsc2UKKworYW1hem9uLXdvcmsgczM6Ly9lZHUuamh1LmNzLmpvbm55L3dtdDExL2ZyLWVuL2hpZXJvCithbWF6b24tamFyICBzMzovL2VkdS5qaHUuY3Muam9ubnkvdGhyYXguamFyCithbWF6b24tbnVtLWluc3RhbmNlcyAgICAxNQorCittYXgtc3BsaXQtc2l6ZSAgODM4ODYwOAorCisjIHRoZSBmb3JtYXQgc2hvdWxkIGJlOgorIyBmb3JlaWduIHNlbnRlbmNlIHx8fCBlbmdsaXNoIHNlbnRlbmNlIHx8fCBhbGlnbm1lbnQKKyMgd2hlcmUgdGhlIGVuZ2xpc2ggaXMgZWl0aGVyIHBhcnNlZCBvciBub3QgZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IHdhbnQKKyMgU0FNVCBvciB5b3Ugd2FudCBIaWVyby4KKyNpbnB1dC1maWxlICBzMzovL2VkdS5qaHUuY3Muam9ubnkvd210MTEvY29ycHVzLmZyLWVuCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0FUYWJsZXMuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL0FUYWJsZXMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0FUYWJsZXMuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvQVRhYmxlcy5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvQVRhYmxlcy5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL0FUYWJsZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9BVGFibGVzLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9BVGFibGVzLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvQWxpZ25UYWJsZXMuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL0FsaWduVGFibGVzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9BbGlnblRhYmxlcy5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9BbGlnblRhYmxlcy5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvQWxpZ25UYWJsZXMuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9BbGlnblRhYmxlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0FsaWduVGFibGVzLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9BbGlnblRhYmxlcy5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0FycmF5LmggYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvQXJyYXkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9BcnJheS5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvQXJyYXkuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9BcnJheTIuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9BcnJheTIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9BcnJheTIuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL0FycmF5Mi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0FycmF5NC5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL0FycmF5NC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0FycmF5NC5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvQXJyYXk0LmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvRDRUYWJsZXMuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9ENFRhYmxlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0Q0VGFibGVzLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9ENFRhYmxlcy5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0Q1VGFibGVzLmggYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvRDVUYWJsZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9ENVRhYmxlcy5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvRDVUYWJsZXMuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9EaWN0aW9uYXJ5LmNwcCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9EaWN0aW9uYXJ5LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9EaWN0aW9uYXJ5LmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL0RpY3Rpb25hcnkuY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0RpY3Rpb25hcnkuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9EaWN0aW9uYXJ5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvRGljdGlvbmFyeS5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvRGljdGlvbmFyeS5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0ZsZXhBcnJheS5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL0ZsZXhBcnJheS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0ZsZXhBcnJheS5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvRmxleEFycmF5LmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvRm9yd2FyZEJhY2t3YXJkLmNwcCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9Gb3J3YXJkQmFja3dhcmQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0ZvcndhcmRCYWNrd2FyZC5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9Gb3J3YXJkQmFja3dhcmQuY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0ZvcndhcmRCYWNrd2FyZC5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL0ZvcndhcmRCYWNrd2FyZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0ZvcndhcmRCYWNrd2FyZC5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvRm9yd2FyZEJhY2t3YXJkLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvR05VLkdQTCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9HTlUuR1BMCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0dOVS5HUEwKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9HTlUuR1BMCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0dsb2JhbHMuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9HbG9iYWxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvR2xvYmFscy5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvR2xvYmFscy5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0hNTVRhYmxlcy5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvSE1NVGFibGVzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9ITU1UYWJsZXMuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvSE1NVGFibGVzLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9ITU1UYWJsZXMuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9ITU1UYWJsZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9ITU1UYWJsZXMuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL0hNTVRhYmxlcy5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL0xJQ0VOU0UgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvTElDRU5TRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9MSUNFTlNFCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvTElDRU5TRQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9NYWtlZmlsZSBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9NYWtlZmlsZQpyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL01ha2VmaWxlCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL01ha2VmaWxlLmRlZmluaXRpb25zIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL01ha2VmaWxlLmRlZmluaXRpb25zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL01ha2VmaWxlLmRlZmluaXRpb25zCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvTWFrZWZpbGUuZGVmaW5pdGlvbnMKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvTWFrZWZpbGUuc3JjIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL01ha2VmaWxlLnNyYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9NYWtlZmlsZS5zcmMKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9NYWtlZmlsZS5zcmMKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvTW92ZVN3YXBNYXRyaXguY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL01vdmVTd2FwTWF0cml4LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9Nb3ZlU3dhcE1hdHJpeC5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9Nb3ZlU3dhcE1hdHJpeC5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvTW92ZVN3YXBNYXRyaXguaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9Nb3ZlU3dhcE1hdHJpeC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL01vdmVTd2FwTWF0cml4LmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9Nb3ZlU3dhcE1hdHJpeC5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL05UYWJsZXMuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL05UYWJsZXMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL05UYWJsZXMuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvTlRhYmxlcy5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvTlRhYmxlcy5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL05UYWJsZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9OVGFibGVzLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9OVGFibGVzLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvUGFyYW1ldGVyLmNwcCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9QYXJhbWV0ZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL1BhcmFtZXRlci5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9QYXJhbWV0ZXIuY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL1BhcmFtZXRlci5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL1BhcmFtZXRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL1BhcmFtZXRlci5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvUGFyYW1ldGVyLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvUGVycGxleGl0eS5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvUGVycGxleGl0eS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvUGVycGxleGl0eS5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9QZXJwbGV4aXR5LmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9QZXJwbGV4aXR5LmggYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvUGVycGxleGl0eS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL1BlcnBsZXhpdHkuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL1BlcnBsZXhpdHkuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9Qb2ludGVyLmggYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvUG9pbnRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL1BvaW50ZXIuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL1BvaW50ZXIuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9SRUFETUUgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvUkVBRE1FCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL1JFQURNRQpyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL1JFQURNRQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9UVGFibGVzLmNwcCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9UVGFibGVzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9UVGFibGVzLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL1RUYWJsZXMuY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL1RUYWJsZXMuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9UVGFibGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvVFRhYmxlcy5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvVFRhYmxlcy5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL1ZlY3Rvci5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL1ZlY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL1ZlY3Rvci5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvVmVjdG9yLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvV29yZENsYXNzZXMuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9Xb3JkQ2xhc3Nlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL1dvcmRDbGFzc2VzLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9Xb3JkQ2xhc3Nlcy5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL2FsaWdubWVudC5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvYWxpZ25tZW50LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9hbGlnbm1lbnQuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvYWxpZ25tZW50LmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9hbGlnbm1lbnQuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9hbGlnbm1lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9hbGlnbm1lbnQuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL2FsaWdubWVudC5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL2NvbGxDb3VudHMuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL2NvbGxDb3VudHMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL2NvbGxDb3VudHMuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvY29sbENvdW50cy5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvY29sbENvdW50cy5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL2NvbGxDb3VudHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9jb2xsQ291bnRzLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9jb2xsQ291bnRzLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvZGVmcy5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL2RlZnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9kZWZzLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9kZWZzLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvZGVwZW5kZW5jaWVzIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL2RlcGVuZGVuY2llcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9kZXBlbmRlbmNpZXMKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9kZXBlbmRlbmNpZXMKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvZmlsZV9zcGVjLmggYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvZmlsZV9zcGVjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvZmlsZV9zcGVjLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9maWxlX3NwZWMuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9nZXRTZW50ZW5jZS5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvZ2V0U2VudGVuY2UuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL2dldFNlbnRlbmNlLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL2dldFNlbnRlbmNlLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9nZXRTZW50ZW5jZS5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL2dldFNlbnRlbmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvZ2V0U2VudGVuY2UuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL2dldFNlbnRlbmNlLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvaG1tLmNwcCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9obW0uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL2htbS5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9obW0uY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL2htbS5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL2htbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL2htbS5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvaG1tLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbG9ncHJvYi5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvbG9ncHJvYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbG9ncHJvYi5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9sb2dwcm9iLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9sb2dwcm9iLmggYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvbG9ncHJvYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL2xvZ3Byb2IuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL2xvZ3Byb2IuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tYWluLmNwcCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9tYWluLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tYWluLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL21haW4uY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL21vZGVsMS5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwxLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDEuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwxLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDEuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDEuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL21vZGVsMS5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL21vZGVsMi5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDIuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwyLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDIuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDIuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL21vZGVsMi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL21vZGVsMnRvMy5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwydG8zLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDJ0bzMuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwydG8zLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDMuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL21vZGVsMy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwzLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL21vZGVsMy5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwzLmggYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwzLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDMuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDM0NS1wZWcuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL21vZGVsMzQ1LXBlZy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwzNDUtcGVnLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL21vZGVsMzQ1LXBlZy5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwzX3ZpdGVyYmkuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL21vZGVsM192aXRlcmJpLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDNfdml0ZXJiaS5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDNfdml0ZXJiaS5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbW9kZWwzX3ZpdGVyYmlfd2l0aF90cmlja3MuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL21vZGVsM192aXRlcmJpX3dpdGhfdHJpY2tzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9tb2RlbDNfdml0ZXJiaV93aXRoX3RyaWNrcy5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbXlhc3NlcnQuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL215YXNzZXJ0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9teWFzc2VydC5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9teWFzc2VydC5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvbXlhc3NlcnQuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9teWFzc2VydC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL215YXNzZXJ0LmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9teWFzc2VydC5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL215bWF0aC5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL215bWF0aC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL215bWF0aC5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvbXltYXRoLmgKZGlmZiAtLWdpdCBhL3NyYy9naXphLXBwL0dJWkErKy12Mi9teXN0bC5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL215c3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0NmUxMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9naXphLXBwL0dJWkErKy12Mi9teXN0bC5oCkBAIC0wLDAgKzEsMzIxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBDb3B5cmlnaHQgMTk5OCAoYykgYnkgUldUSCBBYWNoZW4gLSBMZWhyc3R1aGwgZnVlciBJbmZvcm1hdGlrIFZJICovCisvKiBGcmFueiBKb3NlZiBPY2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZuZGVmIE1ZX1NUTF9IX0RFRklORUQKKyNkZWZpbmUgTVlfU1RMX0hfREVGSU5FRAorCisjaW5jbHVkZSA8c3RyaW5nPgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNpZmRlZiBVU0VfU1RMUE9SVAorI2lmZGVmIF9fU1RMX0RFQlVHCit1c2luZyBuYW1lc3BhY2UgX1NUTEQ7CisjZWxzZQordXNpbmcgbmFtZXNwYWNlIF9TVEw7CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAibXlhc3NlcnQuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjZGVmaW5lIGhhc2hfbWFwIHVub3JkZXJlZF9tYXAKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlICJteW1hdGguaCIKKyNpbmNsdWRlICJBcnJheTIuaCIKKworI2RlZmluZSBvdmVyX3N0cmluZyhhLGkpIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8YS5sZW5ndGgoKTtpKyspCisjZGVmaW5lIG92ZXJfYXJyYXkoYSxpKSBmb3IoaT0oYSkubG93KCk7aTw9KGEpLmhpZ2goKTtpKyspCisjZGVmaW5lIGJhY2t3YXJkc19hcnJheShhLGkpIGZvcihpPShhKS5oaWdoKCk7aT49KGEpLmxvdygpO2ktLSkKKyNkZWZpbmUgb3Zlcl9hcnIoYSxpKSBmb3IoaW50IGk9KGEpLmxvdygpO2k8PShhKS5oaWdoKCk7aSsrKQorI2RlZmluZSBvdmVyX2Fyck1BWChhLGksbWF4KSBmb3IoaW50IGk9KGEpLmxvdygpO2k8PW1pbigoYSkuaGlnaCgpLG1heC0xKTtpKyspCisjZGVmaW5lIGJhY2t3YXJkc19hcnIoYSxpKSBmb3IoaW50IGk9KGEpLmhpZ2goKTtpPj0oYSkubG93KCk7aS0tKQorCitleHRlcm4gZG91YmxlIG4xbXVsdCxuMm11bHQsbjNtdWx0OworCitpbmxpbmUgZG91YmxlIHJlYWxQcm9iKGludCBuMSxpbnQgbjIpCit7CisgIG1hc3NlcnQobjE8PW4yKTsKKyAgaWFzc2VydChuMT49MCYmbjI+MCk7CisgIGlmKG4yPT0wKW4yPTE7CisgIHJldHVybiAoKGRvdWJsZSluMSkvKGRvdWJsZSluMjsKK30KKworaW5saW5lIGRvdWJsZSB2ZXJmUHJvYihpbnQgbjEsaW50IG4yKQoreworICBkb3VibGUgcHJvYiA9IHJlYWxQcm9iKG4xLG4yKTsKKyAgaWYoIG4xPT0xIClyZXR1cm4gcHJvYipuMW11bHQ7CisgIGVsc2UgaWYoIG4xPT0yIClyZXR1cm4gcHJvYipuMm11bHQ7CisgIGVsc2UgaWYoIG4xPT0zIClyZXR1cm4gcHJvYipuM211bHQ7CisgIGVsc2UgCisgIHJldHVybiBwcm9iOworfQorCitpbmxpbmUgYm9vbCBwcmVmaXgoY29uc3Qgc3RyaW5nJngsY29uc3Qgc3RyaW5nJnkpCit7CisgIGlmKHkuc2l6ZSgpPnguc2l6ZSgpICkKKyAgICByZXR1cm4gMDsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTA7aTx5LnNpemUoKTsrK2kpCisgICAgaWYoIHlbaV0hPXhbaV0gKQorICAgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisKKy8qdGVtcGxhdGU8Y2xhc3MgVD4KK2ludCBsZXYoY29uc3QgVCZzMSxjb25zdCBUJnMyKQoreworICBBcnJheTI8aW50LHZlY3RvcjxpbnQ+ID4gYShzMS5zaXplKCkrMSxzMi5zaXplKCkrMSwxMDAwKTsKKyAgQXJyYXkyPHBhaXI8aW50LGludD4sdmVjdG9yPHBhaXI8aW50LGludD4gPiA+IGJhY2soczEuc2l6ZSgpKzEsczIuc2l6ZSgpKzEscGFpcjxpbnQsaW50PigwLDApKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTA7aTw9czEuc2l6ZSgpO2krKykKKyAgICBmb3IodW5zaWduZWQgaW50IGo9MDtqPD1zMi5zaXplKCk7aisrKQorICAgICAgeworCWlmKCBpPT0wJiZqPT0wICkKKwkgIGEoaSxqKT0wOworCWVsc2UKKwkgIHsKKwkgICAgaW50IGFERUw9MTAwLGFJTlM9MTAwLGFTVUI9MTAwOworCSAgICBpZihpPjApCisJICAgICAgYURFTD1hKGktMSxqKSsxOworCSAgICBpZihqPjApCisJICAgICAgYUlOUz1hKGksai0xKSsxOworCSAgICBpZihpPjAmJmo+MCkKKwkgICAgICBhU1VCPWEoaS0xLGotMSkrICEoczFbaS0xXT09czJbai0xXSk7CisJICAgIGlmKCBhU1VCPD1hREVMICYmIGFTVUI8PWFJTlMgKQorCSAgICAgIHsKKwkJYShpLGopPWFTVUI7CisJCWJhY2soaSxqKT1wYWlyPGludCxpbnQ+KGktMSxqLTEpOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiggYURFTDw9YVNVQiAmJiBhREVMPD1hSU5TICkKKwkgICAgICB7CisJCWEoaSxqKT1hREVMOworCQliYWNrKGksaik9cGFpcjxpbnQsaW50PihpLTEsaik7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlhKGksaik9YUlOUzsKKwkJYmFjayhpLGopPXBhaXI8aW50LGludD4oaSxqLTEpOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgcmV0dXJuIGEoczEuc2l6ZSgpLHMyLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitmbG9hdCByZWxfbGV2KGNvbnN0IFQmczEsY29uc3QgVCZzMikKK3sKKyAgaWYoIHMxLnNpemUoKT09MCApCisgICAgcmV0dXJuIHMyLnNpemUoKT09MDsKKyAgZWxzZQorICAgIHJldHVybiBtaW4oMS4wLGxldihzMSxzMikvKGRvdWJsZSlzMS5zaXplKCkpOworfSovCisKK3RlbXBsYXRlPGNsYXNzIFY+IGludCBIYXNoKGNvbnN0IHBhaXI8VixWPiZhKSAKK3sgcmV0dXJuIEhhc2goYS5maXJzdCkrMTMwMDEqSGFzaChhLnNlY29uZCk7IH0KKwordGVtcGxhdGU8Y2xhc3MgVDEsY2xhc3MgVDI+Citvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0gJm91dCxjb25zdCBwYWlyPFQxLFQyPiAmaXIpCit7IAorICBvdXQgPDwgIigiIDw8IGlyLmZpcnN0IDw8ICIsIiA8PCBpci5zZWNvbmQgPDwgIikiOworICByZXR1cm4gb3V0OworfSAKKworaW5saW5lIGludCBIYXNoKGNvbnN0IHN0cmluZyYgcykKK3sKKyAgaW50IHN1bT0wOworICBzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGk9cy5iZWdpbigpLGVuZD1zLmVuZCgpOworICBmb3IoO2khPWVuZDtpKyspc3VtPTUqc3VtKygqaSk7CisgIHJldHVybiBzdW07Cit9Cit0ZW1wbGF0ZTxjbGFzcyBBLGNsYXNzIEIsY2xhc3MgQz4KK2NsYXNzIHRyaQoreworcHVibGljOgorICBBIGE7CisgIEIgYjsKKyAgQyBjOworICB0cmkoKXt9OworICB0cmkoY29uc3QgQSZfYSxjb25zdCBCJl9iLGNvbnN0IEMmX2MpCisgICAgOiBhKF9hKSxiKF9iKSxjKF9jKSB7fQorfTsKK3RlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQixjbGFzcyBDPgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IHRyaTxBLEIsQz4meCxjb25zdCB0cmk8QSxCLEM+JnkpCit7IHJldHVybiB4LmE9PXkuYSYmeC5iPT15LmImJnguYz09eS5jO30KKwordGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCLGNsYXNzIEM+Citib29sIG9wZXJhdG9yPChjb25zdCB0cmk8QSxCLEM+JngsY29uc3QgdHJpPEEsQixDPiZ5KQoreworICBpZih4LmE8eS5hKXJldHVybiAxOworICBpZih5LmE8eC5hKXJldHVybiAwOworICBpZih4LmI8eS5iKXJldHVybiAxOworICBpZih5LmI8eC5iKXJldHVybiAwOworICBpZih4LmM8eS5jKXJldHVybiAxOworICBpZih5LmM8eC5jKXJldHVybiAwOworICByZXR1cm4gMDsKK30KKworZG91YmxlIHVzZWRfdGltZSgpOworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgbXlfaGFzaAoreworcHVibGljOgorICBpbnQgb3BlcmF0b3IoKShjb25zdCBUJnQpY29uc3Qge3JldHVybiBIYXNoKHQpO30KK307CisKK2lubGluZSBpbnQgSGFzaChpbnQgdmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9CisjZGVmaW5lIE1ZX0hBU0hfQkFTRSBoYXNoX21hcDxBLEIsbXlfaGFzaDxBPiA+CisKK3RlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQj4KK2NsYXNzIGxlZGFfaF9hcnJheSA6IHB1YmxpYyBNWV9IQVNIX0JBU0UKK3sKK3ByaXZhdGU6CisgIEIgaW5pdDsKK3B1YmxpYzoKKyAgbGVkYV9oX2FycmF5KCkgOiBNWV9IQVNIX0JBU0UoKSB7fQorICBsZWRhX2hfYXJyYXkoY29uc3QgQiZfaW5pdCkKKyAgICA6IE1ZX0hBU0hfQkFTRSgpLGluaXQoX2luaXQpIHt9CisgIGJvb2wgZGVmaW5lZChjb25zdCBBJmEpIGNvbnN0CisgICAgeyByZXR1cm4gZmluZChhKSE9dGhpcy0+ZW5kKCk7IH0KKyAgY29uc3QgQiZvcGVyYXRvcltdKGNvbnN0IEEmYSljb25zdAorICAgIHsgCisgICAgICB0eXBlbmFtZSBNWV9IQVNIX0JBU0U6OmNvbnN0X2l0ZXJhdG9yIHBvcz1maW5kKGEpOworICAgICAgaWYoIHBvcz09dGhpcy0+ZW5kKCkgKQorCXJldHVybiBpbml0OworICAgICAgZWxzZQorCXJldHVybiBwb3MtPnNlY29uZDsKKyAgICB9CisgIEImb3BlcmF0b3JbXShjb25zdCBBJmEpCisgICAgeyAKKyAgICAgIHR5cGVuYW1lIE1ZX0hBU0hfQkFTRTo6aXRlcmF0b3IgcG9zPWZpbmQoYSk7CisgICAgICBpZiggcG9zPT10aGlzLT5lbmQoKSApCisJeworCSAgaW5zZXJ0KE1ZX0hBU0hfQkFTRTo6dmFsdWVfdHlwZShhLGluaXQpKTsKKwkgIHBvcz1maW5kKGEpOworCSAgaWFzc2VydChwb3MhPXRoaXMtPmVuZCgpKTsKKwl9CisgICAgICByZXR1cm4gcG9zLT5zZWNvbmQ7CisgICAgfQorICBjb25zdCBCJmluaXRWYWx1ZSgpY29uc3QKKyAgICB7cmV0dXJuIGluaXQ7fQorfTsKKworI2RlZmluZSBmb3JhbGxfZGVmaW5lZF9oKGEsYixjLGQpIGZvcih0eXBlbmFtZSBsZWRhX2hfYXJyYXk8YSxiPjo6Y29uc3RfaXRlcmF0b3IgX19qal9fPShkKS5iZWdpbigpO19fampfXyE9KGQpLmVuZCgpJiYoKGM9X19qal9fLT5maXJzdCksMSk7ICsrX19qal9fKQordGVtcGxhdGU8Y2xhc3MgVCxjbGFzcyBVPgorb3N0cmVhbSAmIG9wZXJhdG9yPDwob3N0cmVhbSZvdXQsY29uc3QgbGVkYV9oX2FycmF5PFQsVT4mdykKK3sKKyAgVCB0OworICBib29sIG1ha2VObD0wOworICBvdXQgPDwgImhfYXJyYXl7IjsKKyAgZm9yYWxsX2RlZmluZWRfaChULFUsdCx3KQorICAgIHsKKyAgICAgIGlmKCBtYWtlTmwgKQorCW91dCA8PCAiXG4gICAgICAgIjsKKyAgICAgIG91dCA8PCAiRUw6IiA8PCB0IDw8ICIgSU5IOiIgPDwgd1t0XSA8PCAiLiI7CisgICAgICBtYWtlTmw9MTsKKyAgICB9CisgIHJldHVybiBvdXQgPDwgIn1cbiI7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsY2xhc3MgVT4KK2lzdHJlYW0gJiBvcGVyYXRvcj4+KGlzdHJlYW0maW4sbGVkYV9oX2FycmF5PFQsVT4mKQoreworICByZXR1cm4gaW47Cit9CisKK3RlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQj4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBsZWRhX2hfYXJyYXk8QSxCPiZwMSxjb25zdCBsZWRhX2hfYXJyYXk8QSxCPiZwMikKK3sKKyAgQSB2OworICBmb3JhbGxfZGVmaW5lZF9oKEEsQix2LHAxKQorICAgIGlmKCAhKCBwMVt2XT09cDJbdl0pICkgcmV0dXJuIDA7CisgIGZvcmFsbF9kZWZpbmVkX2goQSxCLHYscDIpCisgICAgaWYoICEoIHAxW3ZdPT1wMlt2XSkgKSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7IAorfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgoraW50IGNvdW50X2VsZW1lbnRzKFQgYSxUIGIpCit7CisgIGludCBjPTA7CisgIHdoaWxlKGEhPWIpCisgICAgeworICAgICAgYSsrOworICAgICAgYysrOworICAgIH0KKyAgcmV0dXJuIGM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitUIG5vcm1hbGl6ZV9pZl9wb3NzaWJsZV93aXRoX2luY3JlbWVudChUKmEsVCpiLGludCBpbmNyZW1lbnQpCit7CisgIFQgc3VtPTA7CisgIGZvcihUKmk9YTtpIT1iO2krPWluY3JlbWVudCkKKyAgICBzdW0rPSppOworICBpZiggc3VtICkKKyAgICBmb3IoVCppPWE7aSE9YjtpKz1pbmNyZW1lbnQpCisgICAgICAqaS89c3VtOworICBlbHNlCisgICAgeworICAgICAgVCBmYWN0b3I9aW5jcmVtZW50LyhiLWEpOworICAgICAgZm9yKFQqaT1hO2khPWI7aSs9aW5jcmVtZW50KQorCSppPWZhY3RvcjsKKyAgICB9CisgIHJldHVybiBzdW07Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitpbmxpbmUgaW50IG1fY29tcF8zd2F5KFQgYSxUIGIsaW50IG4pCit7CisgIGludCBfbj0wOworICB3aGlsZSgoX24rKzxuKSAmJiBhICYmIGIpCisgICAgeworICAgICAgY29uc3QgdHlwZW5hbWUgVDo6dmFsdWVfdHlwZSAmYWE9KmE7CisgICAgICBjb25zdCB0eXBlbmFtZSBUOjp2YWx1ZV90eXBlICZiYj0qYjsKKyAgICAgIGlmKCBhYTxiYiApcmV0dXJuIDE7CisgICAgICBpZiggYmI8YWEgKXJldHVybiAtMTsKKyAgICAgICsrYTsKKyAgICAgICsrYjsKKyAgICB9CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgordm9pZCBzbW9vdGhfc3RhbmRhcmQoVCphLFQqYixkb3VibGUgcCkKK3sKKyAgaW50IG49Yi1hOworICBpZiggbj09MCApIAorICAgIHJldHVybjsKKyAgZG91YmxlIHBwPXAvbjsKKyAgZm9yKFQqaT1hO2khPWI7KytpKQorICAgICppID0gKDEuMC1wKSooKmkpK3BwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY29uc3QgVCAqY29udih0eXBlbmFtZSB2ZWN0b3I8VD46OmNvbnN0X2l0ZXJhdG9yIGkpCit7CisgIHJldHVybiAmKCppKTsKK30KKyNpZiBfX0dOVUNfXz4yCit0ZW1wbGF0ZTxjbGFzcyBUPgorVCAqY29udih0eXBlbmFtZSB2ZWN0b3I8VD46Oml0ZXJhdG9yIGkpCit7CisgIHJldHVybiAmKCppKTsKK30KKyNlbmRpZgorCisvKnRlbXBsYXRlPGNsYXNzIFQ+Citjb25zdCBUICpjb252KGNvbnN0IFQqeCkKK3sKKyAgcmV0dXJuIHg7Cit9Ki8KK3RlbXBsYXRlPGNsYXNzIFQ+CitUICpjb252KFQqeCkKK3sKKyAgcmV0dXJuIHg7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9wYXJzZS5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvcGFyc2UuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3BhcnNlLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL3BhcnNlLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9wbGFpbjJzbnQuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL3BsYWluMnNudC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvcGxhaW4yc250LmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL3BsYWluMnNudC5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvcmVwb3J0cy5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvcmVwb3J0cy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvcmVwb3J0cy5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi9yZXBvcnRzLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9zbWFsbF9zbnQyY29vYy5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvc21hbGxfc250MmNvb2MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3NtYWxsX3NudDJjb29jLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL3NtYWxsX3NudDJjb29jLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9zbnQyY29vYy5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvc250MmNvb2MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3NudDJjb29jLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL3NudDJjb29jLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi9zbnQycGxhaW4uY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL3NudDJwbGFpbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvc250MnBsYWluLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL3NudDJwbGFpbi5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvdHJhaW5HSVpBKysuc2ggYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvdHJhaW5HSVpBKysuc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvdHJhaW5HSVpBKysuc2gKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi90cmFpbkdJWkErKy5zaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWwxLmggYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvdHJhbnNwYWlyX21vZGVsMS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDEuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDEuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWwyLmggYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvdHJhbnNwYWlyX21vZGVsMi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDIuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDIuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWwzLmNwcCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWwzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWwzLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDMuY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDMuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWwzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvdHJhbnNwYWlyX21vZGVsMy5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvdHJhbnNwYWlyX21vZGVsMy5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDQuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDQuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvdHJhbnNwYWlyX21vZGVsNC5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvdHJhbnNwYWlyX21vZGVsNC5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWw0LmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWw0LmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvdHJhbnNwYWlyX21vZGVsNS5jcHAgYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvdHJhbnNwYWlyX21vZGVsNS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvdHJhbnNwYWlyX21vZGVsNS5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWw1LmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWw1LmggYi9zcmMvZ2l6YS1wcC9HSVpBKystdjIvdHJhbnNwYWlyX21vZGVsNS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDUuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbDUuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWxobW0uaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWxobW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi90cmFuc3BhaXJfbW9kZWxobW0uaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvR0laQSsrLXYyL3RyYW5zcGFpcl9tb2RlbGhtbS5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3V0aWxpdHkuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL3V0aWxpdHkuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3V0aWxpdHkuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9HSVpBKystdjIvdXRpbGl0eS5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvdXRpbGl0eS5oIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL3V0aWxpdHkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi91dGlsaXR5LmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi91dGlsaXR5LmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvdm9jYWIuY3BwIGIvc3JjL2dpemEtcHAvR0laQSsrLXYyL3ZvY2FiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL0dJWkErKy12Mi92b2NhYi5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi92b2NhYi5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9HSVpBKystdjIvdm9jYWIuaCBiL3NyYy9naXphLXBwL0dJWkErKy12Mi92b2NhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvR0laQSsrLXYyL3ZvY2FiLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL0dJWkErKy12Mi92b2NhYi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvTWFrZWZpbGUgYi9zcmMvZ2l6YS1wcC9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL01ha2VmaWxlCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL1JFQURNRSBiL3NyYy9naXphLXBwL1JFQURNRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL1JFQURNRQpyZW5hbWUgdG8gc3JjL2dpemEtcHAvUkVBRE1FCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvQXJyYXkuaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL0FycmF5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9BcnJheS5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9BcnJheS5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvRml4ZWRBcnJheS5oIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvRml4ZWRBcnJheS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvRml4ZWRBcnJheS5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9GaXhlZEFycmF5LmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9GbGV4QXJyYXkuaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL0ZsZXhBcnJheS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvRmxleEFycmF5LmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL21rY2xzLXYyL0ZsZXhBcnJheS5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvR0RBT3B0aW1pemF0aW9uLmNwcCBiL3NyYy9naXphLXBwL21rY2xzLXYyL0dEQU9wdGltaXphdGlvbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9HREFPcHRpbWl6YXRpb24uY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9HREFPcHRpbWl6YXRpb24uY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvR0RBT3B0aW1pemF0aW9uLmggYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9HREFPcHRpbWl6YXRpb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL0dEQU9wdGltaXphdGlvbi5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9HREFPcHRpbWl6YXRpb24uaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL0dOVS5HUEwgYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9HTlUuR1BMCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvR05VLkdQTApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvR05VLkdQTApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL0hDT3B0aW1pemF0aW9uLmNwcCBiL3NyYy9naXphLXBwL21rY2xzLXYyL0hDT3B0aW1pemF0aW9uLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL0hDT3B0aW1pemF0aW9uLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvSENPcHRpbWl6YXRpb24uY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvSENPcHRpbWl6YXRpb24uaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL0hDT3B0aW1pemF0aW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9IQ09wdGltaXphdGlvbi5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9IQ09wdGltaXphdGlvbi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvSXRlck9wdGltaXphdGlvbi5jcHAgYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9JdGVyT3B0aW1pemF0aW9uLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL0l0ZXJPcHRpbWl6YXRpb24uY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9JdGVyT3B0aW1pemF0aW9uLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL0l0ZXJPcHRpbWl6YXRpb24uaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL0l0ZXJPcHRpbWl6YXRpb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL0l0ZXJPcHRpbWl6YXRpb24uaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvSXRlck9wdGltaXphdGlvbi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtLmNwcCBiL3NyYy9naXphLXBwL21rY2xzLXYyL0thdGVnUHJvYmxlbS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9LYXRlZ1Byb2JsZW0uY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9LYXRlZ1Byb2JsZW0uY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtLmggYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9LYXRlZ1Byb2JsZW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL0thdGVnUHJvYmxlbS5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9LYXRlZ1Byb2JsZW0uaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL0thdGVnUHJvYmxlbUtCQy5jcHAgYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9LYXRlZ1Byb2JsZW1LQkMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtS0JDLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtS0JDLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL0thdGVnUHJvYmxlbUtCQy5oIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtS0JDLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9LYXRlZ1Byb2JsZW1LQkMuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtS0JDLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9LYXRlZ1Byb2JsZW1UZXN0LmNwcCBiL3NyYy9naXphLXBwL21rY2xzLXYyL0thdGVnUHJvYmxlbVRlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtVGVzdC5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL21rY2xzLXYyL0thdGVnUHJvYmxlbVRlc3QuY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtVGVzdC5oIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtVGVzdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtVGVzdC5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9LYXRlZ1Byb2JsZW1UZXN0LmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9LYXRlZ1Byb2JsZW1XQkMuY3BwIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtV0JDLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL0thdGVnUHJvYmxlbVdCQy5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL21rY2xzLXYyL0thdGVnUHJvYmxlbVdCQy5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9LYXRlZ1Byb2JsZW1XQkMuaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL0thdGVnUHJvYmxlbVdCQy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvS2F0ZWdQcm9ibGVtV0JDLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL21rY2xzLXYyL0thdGVnUHJvYmxlbVdCQy5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvTElDRU5TRSBiL3NyYy9naXphLXBwL21rY2xzLXYyL0xJQ0VOU0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9MSUNFTlNFCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9MSUNFTlNFCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvTVNCT3B0aW1pemF0aW9uLmNwcCBiL3NyYy9naXphLXBwL21rY2xzLXYyL01TQk9wdGltaXphdGlvbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9NU0JPcHRpbWl6YXRpb24uY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9NU0JPcHRpbWl6YXRpb24uY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvTVNCT3B0aW1pemF0aW9uLmggYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9NU0JPcHRpbWl6YXRpb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL01TQk9wdGltaXphdGlvbi5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9NU0JPcHRpbWl6YXRpb24uaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL01ZT3B0aW1pemF0aW9uLmNwcCBiL3NyYy9naXphLXBwL21rY2xzLXYyL01ZT3B0aW1pemF0aW9uLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL01ZT3B0aW1pemF0aW9uLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvTVlPcHRpbWl6YXRpb24uY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvTVlPcHRpbWl6YXRpb24uaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL01ZT3B0aW1pemF0aW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9NWU9wdGltaXphdGlvbi5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9NWU9wdGltaXphdGlvbi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvTWFrZWZpbGUgYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL01ha2VmaWxlCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL09wdGltaXphdGlvbi5jcHAgYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9PcHRpbWl6YXRpb24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvT3B0aW1pemF0aW9uLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvT3B0aW1pemF0aW9uLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL09wdGltaXphdGlvbi5oIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvT3B0aW1pemF0aW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9PcHRpbWl6YXRpb24uaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvT3B0aW1pemF0aW9uLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9Qb3BPcHRpbWl6YXRpb24uY3BwIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvUG9wT3B0aW1pemF0aW9uLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL1BvcE9wdGltaXphdGlvbi5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL21rY2xzLXYyL1BvcE9wdGltaXphdGlvbi5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9Qb3BPcHRpbWl6YXRpb24uaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL1BvcE9wdGltaXphdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvUG9wT3B0aW1pemF0aW9uLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL21rY2xzLXYyL1BvcE9wdGltaXphdGlvbi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvUHJvYmxlbS5jcHAgYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9Qcm9ibGVtLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL1Byb2JsZW0uY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9Qcm9ibGVtLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL1Byb2JsZW0uaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL1Byb2JsZW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL1Byb2JsZW0uaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvUHJvYmxlbS5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvUHJvYmxlbVRlc3QuY3BwIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvUHJvYmxlbVRlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvUHJvYmxlbVRlc3QuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9Qcm9ibGVtVGVzdC5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9Qcm9ibGVtVGVzdC5oIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvUHJvYmxlbVRlc3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL1Byb2JsZW1UZXN0LmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL21rY2xzLXYyL1Byb2JsZW1UZXN0LmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9SRUFETUUgYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9SRUFETUUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9SRUFETUUKcmVuYW1lIHRvIHNyYy9naXphLXBwL21rY2xzLXYyL1JFQURNRQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL1JSVE9wdGltaXphdGlvbi5jcHAgYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9SUlRPcHRpbWl6YXRpb24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvUlJUT3B0aW1pemF0aW9uLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvUlJUT3B0aW1pemF0aW9uLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL1JSVE9wdGltaXphdGlvbi5oIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvUlJUT3B0aW1pemF0aW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9SUlRPcHRpbWl6YXRpb24uaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvUlJUT3B0aW1pemF0aW9uLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9TQU9wdGltaXphdGlvbi5jcHAgYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9TQU9wdGltaXphdGlvbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9TQU9wdGltaXphdGlvbi5jcHAKcmVuYW1lIHRvIHNyYy9naXphLXBwL21rY2xzLXYyL1NBT3B0aW1pemF0aW9uLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL1NBT3B0aW1pemF0aW9uLmggYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9TQU9wdGltaXphdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvU0FPcHRpbWl6YXRpb24uaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvU0FPcHRpbWl6YXRpb24uaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL1N0YXRWYXIuY3BwIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvU3RhdFZhci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9TdGF0VmFyLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvU3RhdFZhci5jcHAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9TdGF0VmFyLmggYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9TdGF0VmFyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9TdGF0VmFyLmgKcmVuYW1lIHRvIHNyYy9naXphLXBwL21rY2xzLXYyL1N0YXRWYXIuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL1RBT3B0aW1pemF0aW9uLmNwcCBiL3NyYy9naXphLXBwL21rY2xzLXYyL1RBT3B0aW1pemF0aW9uLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL1RBT3B0aW1pemF0aW9uLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvVEFPcHRpbWl6YXRpb24uY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvVEFPcHRpbWl6YXRpb24uaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL1RBT3B0aW1pemF0aW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9UQU9wdGltaXphdGlvbi5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9UQU9wdGltaXphdGlvbi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvZ2VuZXJhbC5jcHAgYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9nZW5lcmFsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL2dlbmVyYWwuY3BwCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9nZW5lcmFsLmNwcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL2dlbmVyYWwuaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL2dlbmVyYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL2dlbmVyYWwuaApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvZ2VuZXJhbC5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvbWFrZVBhY2thZ2Uuc2ggYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9tYWtlUGFja2FnZS5zaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL21ha2VQYWNrYWdlLnNoCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9tYWtlUGFja2FnZS5zaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL21rY2xzLmNwcCBiL3NyYy9naXphLXBwL21rY2xzLXYyL21rY2xzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9naXphLXBwL21rY2xzLXYyL21rY2xzLmNwcApyZW5hbWUgdG8gc3JjL2dpemEtcHAvbWtjbHMtdjIvbWtjbHMuY3BwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvbXkuaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL215LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9teS5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9teS5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL2dpemEtcHAvbWtjbHMtdjIvbXlhc3NlcnQuaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL215YXNzZXJ0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvZ2l6YS1wcC9ta2Nscy12Mi9teWFzc2VydC5oCnJlbmFtZSB0byBzcmMvZ2l6YS1wcC9ta2Nscy12Mi9teWFzc2VydC5oCmRpZmYgLS1naXQgYS9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9teWxlZGEuaCBiL3NyYy9naXphLXBwL21rY2xzLXYyL215bGVkYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZjM4NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9teWxlZGEuaApAQCAtMCwwICsxLDIzMiBAQAorLyoKKworQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAorCitta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKK1VTQS4KKworKi8KKworCisKKyNpZm5kZWYgbXlsZWRhX0hFQURFUl9kZWZpbmVkCisjZGVmaW5lIG15bGVkYV9IRUFERVJfZGVmaW5lZAorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlICJteWFzc2VydC5oIgorI2luY2x1ZGUgIkZpeGVkQXJyYXkuaCIKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjbGFzcyBsZWRhX2FycmF5IDogcHVibGljIEZpeGVkQXJyYXk8VD4KK3sKK3B1YmxpYzoKKyAgbGVkYV9hcnJheSgpIHt9CisgIGxlZGFfYXJyYXkoaW50IG4pIDogRml4ZWRBcnJheTxUPihuKSB7fQorfTsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIGxlZGFfc2V0IDogcHVibGljIHNldDxUPgoreworcHVibGljOgorICBib29sIG1lbWJlcihjb25zdCBUJm0pIGNvbnN0CisgICAgeyByZXR1cm4gdGhpcy0+Y291bnQobSkhPTA7IH0KKyAgdm9pZCBkZWwoY29uc3QgVCZtKQorICAgIHsgdGhpcy0+ZXJhc2UobSk7IH0KK307CisjZGVmaW5lIGZvcmFsbF9zZXQoYSxiLGMpIGZvcihhOjppdGVyYXRvciBfX2lfXz1jLmJlZ2luKCk7X19pX18hPWMuZW5kKCkmJigoYj0qX19pX18pLDEpOysrX19pX18pCit0ZW1wbGF0ZTxjbGFzcyBUPgorbGVkYV9zZXQ8VD4gb3BlcmF0b3ImKGNvbnN0IGxlZGFfc2V0PFQ+JmEsY29uc3QgbGVkYV9zZXQ8VD4mYikKK3sKKyAgbGVkYV9zZXQ8VD5jOworICBpbnNlcnRfaXRlcmF0b3I8c2V0PFQ+ID4gaXRlcihjLGMuYmVnaW4oKSk7CisgIHNldF9pbnRlcnNlY3Rpb24oYS5iZWdpbigpLGEuZW5kKCksYi5iZWdpbigpLGIuZW5kKCksaXRlcik7CisgIHJldHVybiBjOworfQordGVtcGxhdGU8Y2xhc3MgVD4KK2xlZGFfc2V0PFQ+IG9wZXJhdG9yLShjb25zdCBsZWRhX3NldDxUPiZhLGNvbnN0IGxlZGFfc2V0PFQ+JmIpCit7CisgIGxlZGFfc2V0PFQ+YzsKKyAgaW5zZXJ0X2l0ZXJhdG9yPHNldDxUPiA+IGl0ZXIoYyxjLmJlZ2luKCkpOworICBzZXRfZGlmZmVyZW5jZShhLmJlZ2luKCksYS5lbmQoKSxiLmJlZ2luKCksYi5lbmQoKSxpdGVyKTsKKyAgcmV0dXJuIGM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQj4KK2NsYXNzIGxlZGFfZF9hcnJheSA6IHB1YmxpYyBtYXA8QSxCPgoreworcHJpdmF0ZToKKyAgQiBpbml0OworcHVibGljOgorICBib29sIGRlZmluZWQoY29uc3QgQSZhKSBjb25zdAorICAgIHsgcmV0dXJuIGZpbmQoYSkhPXRoaXMtPmVuZCgpOyB9CisgIGNvbnN0IEImb3BlcmF0b3JbXShjb25zdCBBJmEpY29uc3QKKyAgICB7IAorICAgICAgdHlwZW5hbWUgbWFwPEEsQj46OmNvbnN0X2l0ZXJhdG9yIHBvcz1maW5kKGEpOworICAgICAgaWFzc2VydChwb3MhPXRoaXMtPmVuZCgpKTsKKyAgICAgIGlmKCBwb3M9PXRoaXMtPmVuZCgpICkKKwlyZXR1cm4gaW5pdDsKKyAgICAgIGVsc2UKKwlyZXR1cm4gcG9zLT5zZWNvbmQ7CisgICAgfQorICBCJm9wZXJhdG9yW10oY29uc3QgQSZhKQorICAgIHsgCisgICAgICB0eXBlbmFtZSBtYXA8QSxCPjo6aXRlcmF0b3IgcG9zPWZpbmQoYSk7CisgICAgICBpZiggcG9zPT10aGlzLT5lbmQoKSApCisJeworCSAgaW5zZXJ0KG1hcDxBLEI+Ojp2YWx1ZV90eXBlKGEsaW5pdCkpOworCSAgcG9zPWZpbmQoYSk7CisJICBpYXNzZXJ0KHBvcyE9dGhpcy0+ZW5kKCkpOworCX0KKyAgICAgIHJldHVybiBwb3MtPnNlY29uZDsKKyAgICB9Cit9OworCisjZGVmaW5lIGZvcmFsbF9kZWZpbmVkX2QoYSxiLGMsZCkgZm9yKHR5cGVuYW1lIGxlZGFfZF9hcnJheTxhLGI+Ojpjb25zdF9pdGVyYXRvciBfX2lpX189KGQpLmJlZ2luKCk7X19paV9fIT0oZCkuZW5kKCkmJigoYz1fX2lpX18tPmZpcnN0KSwxKSA7KytfX2lpX18pCisjZGVmaW5lIGZvcmFsbF9kKGEsYixjLGQpICAgICAgICAgZm9yKHR5cGVuYW1lIGxlZGFfZF9hcnJheTxhLGI+Ojpjb25zdF9pdGVyYXRvciBfX2lpX189KGQpLmJlZ2luKCk7X19paV9fIT0oZCkuZW5kKCkmJigoYz1fX2lpX18tPnNlY29uZCksMSk7KytfX2lpX18pCisKK2RvdWJsZSB1c2VkX3RpbWUoKTsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIG15X2hhc2gKK3sKK3B1YmxpYzoKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVCZ0KWNvbnN0IHtyZXR1cm4gSGFzaCh0KTt9Cit9OworCitpbmxpbmUgaW50IEhhc2goaW50IHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfQorI2RlZmluZSBNWV9IQVNIX0JBU0Ugc3RkOjp1bm9yZGVyZWRfbWFwPEEsQj4KKwordGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCPgorY2xhc3MgbGVkYV9oX2FycmF5IDogcHVibGljIE1ZX0hBU0hfQkFTRQoreworcHJpdmF0ZToKKyAgQiBpbml0OworcHVibGljOgorICBsZWRhX2hfYXJyYXkoKSB7fQorICBsZWRhX2hfYXJyYXkoY29uc3QgQiZfaW5pdCkKKyAgICA6IE1ZX0hBU0hfQkFTRSgpLGluaXQoX2luaXQpIHt9CisgIGJvb2wgZGVmaW5lZChjb25zdCBBJmEpIGNvbnN0CisgICAgeyByZXR1cm4gZmluZChhKSE9dGhpcy0+ZW5kKCk7IH0KKyAgY29uc3QgQiZvcGVyYXRvcltdKGNvbnN0IEEmYSljb25zdAorICAgIHsgCisgICAgICB0eXBlbmFtZSBNWV9IQVNIX0JBU0U6OmNvbnN0X2l0ZXJhdG9yIHBvcz10aGlzLT5maW5kKGEpOworICAgICAgCisgICAgICBpZiggcG9zPT10aGlzLT5lbmQoKSApCisJcmV0dXJuIGluaXQ7CisgICAgICBlbHNlCisJcmV0dXJuIHBvcy0+c2Vjb25kOworICAgIH0KKyAgQiZvcGVyYXRvcltdKGNvbnN0IEEmYSkKKyAgICB7IAorICAgICAgdHlwZW5hbWUgTVlfSEFTSF9CQVNFOjppdGVyYXRvciBwb3M9dGhpcy0+ZmluZChhKTsKKyAgICAgIGlmKCBwb3M9PXRoaXMtPmVuZCgpICkKKwl7CisJICB0aGlzLT5pbnNlcnQodHlwZW5hbWUgTVlfSEFTSF9CQVNFOjp2YWx1ZV90eXBlKGEsaW5pdCkpOworCSAgcG9zPXRoaXMtPmZpbmQoYSk7CisJICBpYXNzZXJ0KHBvcyE9dGhpcy0+ZW5kKCkpOworCX0KKyAgICAgIHJldHVybiBwb3MtPnNlY29uZDsKKyAgICB9Cit9OworCisjZGVmaW5lIGZvcmFsbF9kZWZpbmVkX2goYSxiLGMsZCkgZm9yKHR5cGVuYW1lIGxlZGFfaF9hcnJheTxhLGI+Ojpjb25zdF9pdGVyYXRvciBfX2pqX189KGQpLmJlZ2luKCk7X19qal9fIT0oZCkuZW5kKCkmJigoYz1fX2pqX18tPmZpcnN0KSwxKTsgKytfX2pqX18pCisjZGVmaW5lIGZvcmFsbF9kZWZpbmVkX2gyKGEsYixjLGQpIGZvcihsZWRhX2hfYXJyYXk8YSxiPjo6Y29uc3RfaXRlcmF0b3IgX19qal9fPShkKS5iZWdpbigpO19fampfXyE9KGQpLmVuZCgpJiYoKGM9X19qal9fLT5maXJzdCksMSk7ICsrX19qal9fKQorI2RlZmluZSBmb3JhbGxfaChhLGIsYyxkKSAgICAgICAgIGZvcih0eXBlbmFtZSBsZWRhX2hfYXJyYXk8YSxiPjo6Y29uc3RfaXRlcmF0b3IgX19qampfXz0oZCkuYmVnaW4oKTtfX2pqal9fIT0oZCkuZW5kKCkmJigoYz1fX2pqal9fLT5zZWNvbmQpLDEpOysrX19qampfXykKKworCit0ZW1wbGF0ZTxjbGFzcyBUPiBpbnQgY29tcGFyZShjb25zdCBUJmEsY29uc3QgVCZiKQore2lmKGE9PWIpcmV0dXJuIDA7IGVsc2UgaWYoYTxiKSByZXR1cm4gLTE7IGVsc2UgcmV0dXJuIDE7fQorCit0ZW1wbGF0ZTxjbGFzcyBULGNsYXNzIFU+Citvc3RyZWFtICYgb3BlcmF0b3I8PChvc3RyZWFtJm91dCxjb25zdCBsZWRhX2hfYXJyYXk8VCxVPiZ3KQoreworICBUIHQ7CisgIGJvb2wgbWFrZU5sPTA7CisgIG91dCA8PCAiaF9hcnJheXsiOworICBmb3JhbGxfZGVmaW5lZF9oKFQsVSx0LHcpCisgICAgeworICAgICAgaWYoIG1ha2VObCApCisJb3V0IDw8ICJcbiAgICAgICAiOworICAgICAgb3V0IDw8ICJFTDoiIDw8IHQgPDwgIiBJTkg6IiA8PCB3W3RdIDw8ICIuIjsKKyAgICAgIG1ha2VObD0xOworICAgIH0KKyAgcmV0dXJuIG91dCA8PCAifVxuIjsKK30KK3RlbXBsYXRlPGNsYXNzIFQsY2xhc3MgVT4KK29zdHJlYW0gJiBvcGVyYXRvcjw8KG9zdHJlYW0mb3V0LGNvbnN0IGxlZGFfZF9hcnJheTxULFU+JncpCit7CisgIFQgdDsKKyAgYm9vbCBtYWtlTmw9MDsKKyAgb3V0IDw8ICJoX2FycmF5eyI7CisgIGZvcmFsbF9kZWZpbmVkX2goVCxVLHQsdykKKyAgICB7CisgICAgICBpZiggbWFrZU5sICkKKwlvdXQgPDwgIlxuICAgICAgICI7CisgICAgICBvdXQgPDwgIkVMOiIgPDwgdCA8PCAiIElOSDoiIDw8IHdbdF0gPDwgIi4iOworICAgICAgbWFrZU5sPTE7CisgICAgfQorICByZXR1cm4gb3V0IDw8ICJ9XG4iOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorb3N0cmVhbSZwcmludFNldChvc3RyZWFtJm91dCxjb25zdCBsZWRhX3NldDxUPiZzKQoreworICBib29sIGZpcnN0PTE7CisgIFQgdDsKKyAgb3V0IDw8ICJ7IjsKKyAgZm9yYWxsX3NldCh0eXBlbmFtZSBzZXQ8VD4sdCxzKQorICAgIHsKKyAgICAgIGlmKCBmaXJzdD09MCApCisJb3V0IDw8ICIsICI7CisgICAgICBvdXQgPDwgdDsKKyAgICAgIGZpcnN0PTA7CisgICAgfQorICByZXR1cm4gb3V0IDw8ICJ9XG4iOworfQorCit0ZW1wbGF0ZTxjbGFzcyBULGNsYXNzIFU+Citpc3RyZWFtICYgb3BlcmF0b3I+Pihpc3RyZWFtJmluLGxlZGFfaF9hcnJheTxULFU+JikKK3sKKyAgcmV0dXJuIGluOworfQorCit0ZW1wbGF0ZTxjbGFzcyBBLGNsYXNzIEI+Citib29sIG9wZXJhdG9yPT0oY29uc3QgbGVkYV9oX2FycmF5PEEsQj4mcDEsY29uc3QgbGVkYV9oX2FycmF5PEEsQj4mcDIpCit7CisgIEEgdjsKKyAgZm9yYWxsX2RlZmluZWRfaChBLEIsdixwMSkKKyAgICBpZiggISggcDFbdl09PXAyW3ZdKSApIHJldHVybiAwOworICBmb3JhbGxfZGVmaW5lZF9oKEEsQix2LHAyKQorICAgIGlmKCAhKCBwMVt2XT09cDJbdl0pICkgcmV0dXJuIDA7CisgIHJldHVybiAxOyAKK30KK3RlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQj4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBsZWRhX2RfYXJyYXk8QSxCPiZwMSxjb25zdCBsZWRhX2RfYXJyYXk8QSxCPiZwMikKK3sKKyAgQSB2OworICBmb3JhbGxfZGVmaW5lZF9kKEEsQix2LHAxKQorICAgIGlmKCAhKCBwMVt2XT09cDJbdl0pICkgcmV0dXJuIDA7CisgIGZvcmFsbF9kZWZpbmVkX2QoQSxCLHYscDIpCisgICAgaWYoICEoIHAxW3ZdPT1wMlt2XSkgKSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7IAorfQorCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvZ2l6YS1wcC9ta2Nscy12Mi9teXN0bC5oIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvbXlzdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWY3OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dpemEtcHAvbWtjbHMtdjIvbXlzdGwuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKworQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEgIEZyYW56IEpvc2VmIE9jaAorCitta2NscyAtIGEgcHJvZ3JhbSBmb3IgbWFraW5nIHdvcmQgY2xhc3NlcyAuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCAKK1VTQS4KKworKi8KKworCisKKyNpZm5kZWYgTVlfU1RMX0hfREVGSU5FRAorI2RlZmluZSBNWV9TVExfSF9ERUZJTkVECisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDxjbWF0aD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIHN0ZCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBWPgorICBzdHJ1Y3QgaGFzaDxwYWlyPFQsIFY+ID4geworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBoYXNoX2NvbWJpbmUoc3RkOjpzaXplX3QgJiBzZWVkLCBjb25zdCBUICYgdikgeworICAgICAgIGhhc2g8VD4gaGFzaGVyOworICAgICAgIHNlZWQgXj0gaGFzaGVyKHYpICsgMHg5ZTM3NzliOSArIChzZWVkIDw8IDYpICsgKHNlZWQgPj4gMik7CisgICAgfQorCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPFQsIFY+JiB4KSBjb25zdCB7CisgICAgICBzaXplX3QgaCA9IDA7CisgICAgICBoYXNoX2NvbWJpbmUoaCwgeC5maXJzdCk7CisgICAgICBoYXNoX2NvbWJpbmUoaCwgeC5zZWNvbmQpOworICAgICAgcmV0dXJuIGg7CisgICAgfQorICB9OworfQorCisjZGVmaW5lIG92ZXJfc3RyaW5nKGEsaSkgZm9yKHVuc2lnbmVkIGludCBpPTA7aTxhLmxlbmd0aCgpO2krKykKKwordGVtcGxhdGU8Y2xhc3MgVDEsY2xhc3MgVDI+Citpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0gJmluLHBhaXI8VDEsVDI+ICZpcikKK3sKKyBjaGFyIGM7CisgZG8gaW4uZ2V0KGMpOyB3aGlsZSAoaW4gJiYgaXNzcGFjZShjKSk7CisgaWYgKCFpbikgcmV0dXJuIGluOworIGlmIChjICE9ICcoJykgaW4ucHV0YmFjayhjKTsKKyBpbiA+PiBpci5maXJzdDsKKyBkbyBpbi5nZXQoYyk7IHdoaWxlIChpc3NwYWNlKGMpKTsKKyBpZiAoYyAhPSAnLCcpIGluLnB1dGJhY2soYyk7CisgaW4gPj4gaXIuc2Vjb25kOyAKKyBkbyBpbi5nZXQoYyk7IHdoaWxlIChjID09ICcgJyk7CisgaWYgKGMgIT0gJyknKSBpbi5wdXRiYWNrKGMpOworIHJldHVybiBpbjsgCit9CisKK3RlbXBsYXRlPGNsYXNzIFQxLGNsYXNzIFQyPgorb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtICZvdXQsY29uc3QgcGFpcjxUMSxUMj4gJmlyKQoreyAKKyAgb3V0IDw8ICIoIiA8PCBpci5maXJzdCA8PCAiLCIgPDwgaXIuc2Vjb25kIDw8ICIpIjsKKyAgcmV0dXJuIG91dDsKK30gCisKK3ZvaWQgcHJpbnRTcGFjZXMob3N0cmVhbSZvdXQsaW50IG4pOwordm9pZCBteXNwbGl0KGNvbnN0IHN0cmluZyAmcyxzdHJpbmcgJnMxLHN0cmluZyAmczIpOworc3RyaW5nIHVudGlsQ2hhcihjb25zdCBzdHJpbmcmcyxjaGFyIGMpOworCit0ZW1wbGF0ZTxjbGFzcyBBLGNsYXNzIEIsY2xhc3MgQz4KK2NsYXNzIHRyaQoreworcHVibGljOgorICBBIGE7CisgIEIgYjsKKyAgQyBjOworICB0cmkoKXt9OworICB0cmkoY29uc3QgQSZfYSxjb25zdCBCJl9iLGNvbnN0IEMmX2MpCisgICAgOiBhKF9hKSxiKF9iKSxjKF9jKSB7fQorfTsKK3RlbXBsYXRlPGNsYXNzIEEsY2xhc3MgQixjbGFzcyBDPgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IHRyaTxBLEIsQz4meCxjb25zdCB0cmk8QSxCLEM+JnkpCit7IHJldHVybiB4LmE9PXkuYSYmeC5iPT15LmImJnguYz09eS5jO30KKwordGVtcGxhdGU8Y2xhc3MgQSxjbGFzcyBCLGNsYXNzIEM+Citib29sIG9wZXJhdG9yPChjb25zdCB0cmk8QSxCLEM+JngsY29uc3QgdHJpPEEsQixDPiZ5KQoreworICBpZih4LmE8eS5hKQorICAgIHJldHVybiAxOworICBpZih5LmE8eC5hKQorICAgIHJldHVybiAwOworCisgIGlmKHguYjx5LmIpCisgICAgcmV0dXJuIDE7CisgIGlmKHkuYjx4LmIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYoeC5jPHkuYykKKyAgICByZXR1cm4gMTsKKyAgaWYoeS5jPHguYykKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9hZGFncmFkL0FkYUdyYWQuamF2YSBiL3NyYy9qb3NodWEvYWRhZ3JhZC9BZGFHcmFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjA2YWJkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qb3NodWEvYWRhZ3JhZC9BZGFHcmFkLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKK3BhY2thZ2Ugam9zaHVhLmFkYWdyYWQ7CisKK2ltcG9ydCBqb3NodWEuZGVjb2Rlci5Kb3NodWFDb25maWd1cmF0aW9uOworaW1wb3J0IGpvc2h1YS51dGlsLkZpbGVVdGlsaXR5OworaW1wb3J0IGpvc2h1YS51dGlsLlN0cmVhbUdvYmJsZXI7CisKK3B1YmxpYyBjbGFzcyBBZGFHcmFkIHsKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSm9zaHVhQ29uZmlndXJhdGlvbiBqb3NodWFDb25maWd1cmF0aW9uID0gbmV3IEpvc2h1YUNvbmZpZ3VyYXRpb24oKTsKKyAgICBib29sZWFuIGV4dGVybmFsID0gZmFsc2U7IC8vIHNob3VsZCBlYWNoIEFkYUdyYWQgaXRlcmF0aW9uIGJlIGxhdW5jaGVkIGV4dGVybmFsbHk/CisKKyAgICBpZiAoYXJncy5sZW5ndGggPT0gMSkgeworICAgICAgaWYgKGFyZ3NbMF0uZXF1YWxzKCItaCIpKSB7CisgICAgICAgIHByaW50QWRhR3JhZFVzYWdlKGFyZ3MubGVuZ3RoLCB0cnVlKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoMik7CisgICAgICB9IGVsc2UgeworICAgICAgICBleHRlcm5hbCA9IGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykgeworICAgICAgZXh0ZXJuYWwgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBwcmludEFkYUdyYWRVc2FnZShhcmdzLmxlbmd0aCwgZmFsc2UpOworICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorCisgICAgaWYgKCFleHRlcm5hbCkgeworICAgICAgQWRhR3JhZENvcmUgbXlBZGFHcmFkID0gbmV3IEFkYUdyYWRDb3JlKGFyZ3NbMF0sIGpvc2h1YUNvbmZpZ3VyYXRpb24pOworICAgICAgbXlBZGFHcmFkLnJ1bl9BZGFHcmFkKCk7IC8vIG9wdGltaXplIGxhbWJkYVtdCisgICAgICBteUFkYUdyYWQuZmluaXNoKCk7CisgICAgfSBlbHNlIHsKKworICAgICAgaW50IG1heE1lbSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSk7CisgICAgICBTdHJpbmcgY29uZmlnRmlsZU5hbWUgPSBhcmdzWzJdOworICAgICAgU3RyaW5nIHN0YXRlRmlsZU5hbWUgPSBGaWxlVXRpbGl0eS5kaXJuYW1lKGNvbmZpZ0ZpbGVOYW1lKSArICIvQWRhR3JhZC50ZW1wLnN0YXRlIjsKKyAgICAgIFN0cmluZyBjcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7CisgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKKyAgICAgIGludCBpdGVyYXRpb24gPSAwOworCisgICAgICB3aGlsZSAoIWRvbmUpIHsKKyAgICAgICAgKytpdGVyYXRpb247CisgICAgICAgIFJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKKyAgICAgICAgUHJvY2VzcyBwID0KKyAgICAgICAgICAgIHJ0LmV4ZWMoImphdmEgLVhteCIgKyBtYXhNZW0gKyAibSAtY3AgIiArIGNwICsgIiBqb3NodWEuYWRhZ3JhZC5BZGFHcmFkQ29yZSAiICsgY29uZmlnRmlsZU5hbWUKKyAgICAgICAgICAgICAgICArICIgIiArIHN0YXRlRmlsZU5hbWUgKyAiICIgKyBpdGVyYXRpb24pOworICAgICAgICAvKgorICAgICAgICAgKiBCdWZmZXJlZFJlYWRlciBicl9pID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwLmdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgICogQnVmZmVyZWRSZWFkZXIgYnJfZSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocC5nZXRFcnJvclN0cmVhbSgpKSk7CisgICAgICAgICAqIFN0cmluZyBkdW1teV9saW5lID0gbnVsbDsgd2hpbGUgKChkdW1teV9saW5lID0gYnJfaS5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihkdW1teV9saW5lKTsgfSB3aGlsZSAoKGR1bW15X2xpbmUgPSBicl9lLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKGR1bW15X2xpbmUpOyB9CisgICAgICAgICAqLworICAgICAgICBTdHJlYW1Hb2JibGVyIGVycm9yR29iYmxlciA9IG5ldyBTdHJlYW1Hb2JibGVyKHAuZ2V0RXJyb3JTdHJlYW0oKSwgMSk7CisgICAgICAgIFN0cmVhbUdvYmJsZXIgb3V0cHV0R29iYmxlciA9IG5ldyBTdHJlYW1Hb2JibGVyKHAuZ2V0SW5wdXRTdHJlYW0oKSwgMSk7CisKKyAgICAgICAgZXJyb3JHb2JibGVyLnN0YXJ0KCk7CisgICAgICAgIG91dHB1dEdvYmJsZXIuc3RhcnQoKTsKKworICAgICAgICBpbnQgc3RhdHVzID0gcC53YWl0Rm9yKCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSA5MCkgeworICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSA5MSkgeworICAgICAgICAgIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkYUdyYWQgZXhpdGluZyBwcmVtYXR1cmVseSAoQWRhR3JhZENvcmUgcmV0dXJuZWQgIiArIHN0YXR1cyArICIpLi4uIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBTeXN0ZW0uZXhpdCgwKTsKKworICB9IC8vIG1haW4oU3RyaW5nW10gYXJncykKKworICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRBZGFHcmFkVXNhZ2UoaW50IGFyZ3NMZW4sIGJvb2xlYW4gZGV0YWlsZWQpIHsKKyAgICBpZiAoIWRldGFpbGVkKSB7CisgICAgICBwcmludGxuKCJPb3BzLCB5b3UgcHJvdmlkZWQgIiArIGFyZ3NMZW4gKyAiIGFyZ3MhIik7CisgICAgICBwcmludGxuKCIiKTsKKyAgICAgIHByaW50bG4oIlVzYWdlOiIpOworICAgICAgcHJpbnRsbigiICAgICAgICAgICBBZGFHcmFkIC1tYXhNZW0gbWF4TWVtb3J5SW5NQiBBZGFHcmFkX2NvbmZpZ0ZpbGUiKTsKKyAgICAgIHByaW50bG4oIiIpOworICAgICAgcHJpbnRsbigiV2hlcmUgLW1heE1lbSBzcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSAoaW4gTUIpIEFkYUdyYWQgaXMiKTsKKyAgICAgIHByaW50bG4oImFsbG93ZWQgdG8gdXNlIHdoZW4gcGVyZm9ybWluZyBpdHMgY2FsY3VsYXRpb25zIChubyBtZW1yb3kgaXMgbmVlZGVkIHdoaWxlIik7CisgICAgICBwcmludGxuKCJ0aGUgZGVjb2RlciBpcyBydW5uaW5nKSwiKTsKKyAgICAgIHByaW50bG4oImFuZCB0aGUgY29uZmlnIGZpbGUgY29udGFpbnMgYW55IHN1YnNldCBvZiBBZGFHcmFkJ3MgMjAtc29tZSBwYXJhbWV0ZXJzLCIpOworICAgICAgcHJpbnRsbigib25lIHBlciBsaW5lLiAgUnVuICAgQWRhR3JhZCAtaCAgIGZvciBtb3JlIGRldGFpbHMgb24gdGhvc2UgcGFyYW1ldGVycy4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRsbigiVXNhZ2U6Iik7CisgICAgICBwcmludGxuKCIgICAgICAgICAgIEFkYUdyYWQgLW1heE1lbSBtYXhNZW1vcnlJbk1CIEFkYUdyYWRfY29uZmlnRmlsZSIpOworICAgICAgcHJpbnRsbigiIik7CisgICAgICBwcmludGxuKCJXaGVyZSAtbWF4TWVtIHNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IChpbiBNQikgQWRhR3JhZCBpcyIpOworICAgICAgcHJpbnRsbigiYWxsb3dlZCB0byB1c2Ugd2hlbiBwZXJmb3JtaW5nIGl0cyBjYWxjdWxhdGlvbnMgKG5vIG1lbXJveSBpcyBuZWVkZWQgd2hpbGUiKTsKKyAgICAgIHByaW50bG4oInRoZSBkZWNvZGVyIGlzIHJ1bm5pbmcpLCIpOworICAgICAgcHJpbnRsbigiYW5kIHRoZSBjb25maWcgZmlsZSBjb250YWlucyBhbnkgc3Vic2V0IG9mIEFkYUdyYWQncyAyMC1zb21lIHBhcmFtZXRlcnMsIik7CisgICAgICBwcmludGxuKCJvbmUgcGVyIGxpbmUuICBUaG9zZSBwYXJhbWV0ZXJzLCBhbmQgdGhlaXIgZGVmYXVsdCB2YWx1ZXMsIGFyZToiKTsKKyAgICAgIHByaW50bG4oIiIpOworICAgICAgcHJpbnRsbigiUmVsZXZhbnQgZmlsZXM6Iik7CisgICAgICBwcmludGxuKCIgIC1kaXIgZGlyUHJlZml4OiB3b3JraW5nIGRpcmVjdG9yeVxuICAgIFtbZGVmYXVsdDogbnVsbCBzdHJpbmcgKGkuZS4gdGhleSBhcmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KV1dIik7CisgICAgICBwcmludGxuKCIgIC1zIHNvdXJjZUZpbGU6IHNvdXJjZSBzZW50ZW5jZXMgKGZvcmVpZ24gc2VudGVuY2VzKSBvZiB0aGUgQWRhR3JhZCBkYXRhc2V0XG4gICAgW1tkZWZhdWx0OiBudWxsIHN0cmluZyAoaS5lLiBmaWxlIG5hbWUgaXMgbm90IG5lZWRlZCBieSBBZGFHcmFkKV1dIik7CisgICAgICBwcmludGxuKCIgIC1yIHJlZkZpbGU6IHRhcmdldCBzZW50ZW5jZXMgKHJlZmVyZW5jZSB0cmFuc2xhdGlvbnMpIG9mIHRoZSBBZGFHcmFkIGRhdGFzZXRcbiAgICBbW2RlZmF1bHQ6IHJlZmVyZW5jZS50eHRdXSIpOworICAgICAgcHJpbnRsbigiICAtcnBzIHJlZnNQZXJTZW46IG51bWJlciBvZiByZWZlcmVuY2UgdHJhbnNsYXRpb25zIHBlciBzZW50ZW5jZVxuICAgIFtbZGVmYXVsdDogMV1dIik7CisgICAgICAvL3ByaW50bG4oIiAgLXR4dE5ybSB0ZXh0Tm9ybU1ldGhvZDogaG93IHNob3VsZCB0ZXh0IGJlIG5vcm1hbGl6ZWQ/XG4gICAgICAgKDApIGRvbid0IG5vcm1hbGl6ZSB0ZXh0LFxuICAgIG9yICgxKSBcIk5JU1Qtc3R5bGVcIiwgYW5kIGFsc28gcmVqb2luICdyZSwgKidzLCBuJ3QsIGV0YyxcbiAgICBvciAoMikgYXBwbHkgMSBhbmQgYWxzbyByZWpvaW4gZGFzaGVzIGJldHdlZW4gbGV0dGVycyxcbiAgICBvciAoMykgYXBwbHkgMSBhbmQgYWxzbyBkcm9wIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLFxuICAgIG9yICg0KSBhcHBseSAxKzIrM1xuICAgIFtbZGVmYXVsdDogMV1dIik7CisgICAgICBwcmludGxuKCIgIC1wIHBhcmFtc0ZpbGU6IGZpbGUgY29udGFpbmluZyBwYXJhbWV0ZXIgbmFtZXMsIGluaXRpYWwgdmFsdWVzLCBhbmQgcmFuZ2VzXG4gICAgW1tkZWZhdWx0OiBwYXJhbXMudHh0XV0iKTsKKyAgICAgIC8vcHJpbnRsbigiICAtZG9jSW5mbyBkb2N1bWVudEluZm9GaWxlOiBmaWxlIGluZm9ybWluZyBBZGFHcmFkIHdoaWNoIGRvY3VtZW50IGVhY2hcbiAgICBzZW50ZW5jZSBiZWxvbmdzIHRvXG4gICAgW1tkZWZhdWx0OiBudWxsIHN0cmluZyAoaS5lLiBhbGwgc2VudGVuY2VzIGFyZSBpbiBvbmUgJ2RvY3VtZW50JyldXSIpOworICAgICAgcHJpbnRsbigiICAtZmluIGZpbmFsTGFtYmRhOiBmaWxlIG5hbWUgZm9yIGZpbmFsIGxhbWJkYVtdIHZhbHVlc1xuICAgIFtbZGVmYXVsdDogbnVsbCBzdHJpbmcgKGkuZS4gbm8gc3VjaCBmaWxlIHdpbGwgYmUgY3JlYXRlZCldXSIpOworICAgICAgcHJpbnRsbigiIik7CisgICAgICBwcmludGxuKCJBZGFHcmFkIHNwZWNzOiIpOworICAgICAgcHJpbnRsbigiICAtbSBtZXRyaWNOYW1lIG1ldHJpYyBvcHRpb25zOiBuYW1lIG9mIGV2YWx1YXRpb24gbWV0cmljIGFuZCBpdHMgb3B0aW9uc1xuICAgIFtbZGVmYXVsdDogQkxFVSA0IGNsb3Nlc3RdXSIpOworICAgICAgcHJpbnRsbigiICAtbWF4SXQgbWF4QWRhR3JhZEl0czogbWF4aW11bSBudW1iZXIgb2YgQWRhR3JhZCBpdGVyYXRpb25zXG4gICAgW1tkZWZhdWx0OiAyMF1dIik7CisgICAgICBwcmludGxuKCIgIC1wcmV2SXQgcHJldkFkYUdyYWRJdHM6IG1heGltdW0gbnVtYmVyIG9mIHByZXZpb3VzIEFkYUdyYWQgaXRlcmF0aW9ucyB0b1xuICAgIGNvbnN0cnVjdCBjYW5kaWRhdGUgc2V0cyBmcm9tXG4gICAgW1tkZWZhdWx0OiAyMF1dIik7CisgICAgICBwcmludGxuKCIgIC1taW5JdCBtaW5BZGFHcmFkSXRzOiBudW1iZXIgb2YgaXRlcmF0aW9ucyBiZWZvcmUgY29uc2lkZXJpbmcgYW4gZWFybHkgZXhpdFxuICAgIFtbZGVmYXVsdDogNV1dIik7CisgICAgICBwcmludGxuKCIgIC1zdG9wSXQgc3RvcE1pbkl0czogc29tZSBlYXJseSBzdG9wcGluZyBjcml0ZXJpb24gbXVzdCBiZSBzYXRpc2ZpZWQgaW5cbiAgICBzdG9wTWluSXRzICpjb25zZWN1dGl2ZSogaXRlcmF0aW9ucyBiZWZvcmUgYW4gZWFybHkgZXhpdFxuICAgIFtbZGVmYXVsdDogM11dIik7CisgICAgICBwcmludGxuKCIgIC1zdG9wU2lnIHNpZ1ZhbHVlOiBlYXJseSBBZGFHcmFkIGV4aXQgaWYgbm8gd2VpZ2h0IGNoYW5nZXMgYnkgbW9yZSB0aGFuIHNpZ1ZhbHVlXG4gICAgW1tkZWZhdWx0OiAtMSAoaS5lLiB0aGlzIGNyaXRlcmlvbiBpcyBuZXZlciBpbnZlc3RpZ2F0ZWQpXV0iKTsKKyAgICAgIC8vcHJpbnRsbigiICAtdGhyQ250IHRocmVhZENvdW50OiBudW1iZXIgb2YgdGhyZWFkcyB0byBydW4gaW4gcGFyYWxsZWwgd2hlbiBvcHRpbWl6aW5nXG4gICAgW1tkZWZhdWx0OiAxXV0iKTsKKyAgICAgIHByaW50bG4oIiAgLXNhdmUgc2F2ZUludGVyOiBzYXZlIGludGVybWVkaWF0ZSBjZmcgZmlsZXMgKDEpIG9yIGRlY29kZXIgb3V0cHV0cyAoMilcbiAgICBvciBib3RoICgzKSBvciBuZWl0aGVyICgwKVxuICAgIFtbZGVmYXVsdDogM11dIik7CisgICAgICBwcmludGxuKCIgIC1jb21wcmVzcyBjb21wcmVzc0ZpbGVzOiBzaG91bGQgQWRhR3JhZCBjb21wcmVzcyB0aGUgZmlsZXMgaXQgcHJvZHVjZXMgKDEpXG4gICAgb3Igbm90ICgwKVxuICAgIFtbZGVmYXVsdDogMF1dIik7CisgICAgICAvL3ByaW50bG4oIiAgLWlwaSBpbml0c1Blckl0OiBudW1iZXIgb2YgaW50ZXJtZWRpYXRlIGluaXRpYWwgcG9pbnRzIHBlciBpdGVyYXRpb25cbiAgICBbW2RlZmF1bHQ6IDIwXV0iKTsKKyAgICAgIC8vcHJpbnRsbigiICAtb3BpIG9uY2VQZXJJdDogbW9kaWZ5IGEgcGFyYW1ldGVyIG9ubHkgb25jZSBwZXIgaXRlcmF0aW9uICgxKSBvciBub3QgKDApXG4gICAgW1tkZWZhdWx0OiAwXV0iKTsKKyAgICAgIC8vcHJpbnRsbigiICAtcmFuZCByYW5kSW5pdDogY2hvb3NlIGluaXRpYWwgcG9pbnQgcmFuZG9tbHkgKDEpIG9yIGZyb20gcGFyYW1zRmlsZSAoMClcbiAgICBbW2RlZmF1bHQ6IDBdXSIpOworICAgICAgLy9wcmludGxuKCIgIC1zZWVkIHNlZWQ6IHNlZWQgdXNlZCB0byBpbml0aWFsaXplIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yXG4gICAgW1tkZWZhdWx0OiB0aW1lIChpLmUuIHZhbHVlIHJldHVybmVkIGJ5IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpXV0iKTsKKyAgICAgIC8vIHByaW50bG4oIiAgLXVkIHVzZURpc2s6IHJlbGlhbmNlIG9uIGRpc2sgKDAtMjsgaGlnaGVyIHZhbHVlID0+IG1vcmUgcmVsaWFuY2UpXG4gICAgW1tkZWZhdWx0OiAyXV0iKTsKKyAgICAgIHByaW50bG4oIiIpOworICAgICAgcHJpbnRsbigiRGVjb2RlciBzcGVjczoiKTsKKyAgICAgIHByaW50bG4oIiAgLWNtZCBjb21tYW5kRmlsZTogbmFtZSBvZiBmaWxlIGNvbnRhaW5pbmcgY29tbWFuZHMgdG8gcnVuIHRoZSBkZWNvZGVyXG4gICAgW1tkZWZhdWx0OiBudWxsIHN0cmluZyAoaS5lLiBkZWNvZGVyIGlzIGEgSm9zaHVhRGVjb2RlciBvYmplY3QpXV0iKTsKKyAgICAgIHByaW50bG4oIiAgLXBhc3NJdCBwYXNzSXRlcmF0aW9uVG9EZWNvZGVyOiBzaG91bGQgaXRlcmF0aW9uIG51bWJlciBiZSBwYXNzZWRcbiAgICB0byBjb21tYW5kIGZpbGUgKDEpIG9yIG5vdCAoMClcbiAgICBbW2RlZmF1bHQ6IDBdXSIpOworICAgICAgcHJpbnRsbigiICAtZGVjT3V0IGRlY29kZXJPdXRGaWxlOiBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSBwcm9kdWNlZCBieSB0aGUgZGVjb2RlclxuICAgIFtbZGVmYXVsdDogb3V0cHV0Lm5iZXN0XV0iKTsKKyAgICAgIHByaW50bG4oIiAgLWRlY0V4aXQgdmFsaWRFeGl0OiB2YWx1ZSByZXR1cm5lZCBieSBkZWNvZGVyIHRvIGluZGljYXRlIHN1Y2Nlc3NcbiAgICBbW2RlZmF1bHQ6IDBdXSIpOworICAgICAgcHJpbnRsbigiICAtZGNmZyBkZWNDb25maWdGaWxlOiBuYW1lIG9mIGRlY29kZXIgY29uZmlnIGZpbGVcbiAgICBbW2RlZmF1bHQ6IGRlY19jZmcudHh0XV0iKTsKKyAgICAgIHByaW50bG4oIiAgLU4gTjogc2l6ZSBvZiBOLWJlc3QgbGlzdCAocGVyIHNlbnRlbmNlKSBnZW5lcmF0ZWQgaW4gZWFjaCBBZGFHcmFkIGl0ZXJhdGlvblxuICAgIFtbZGVmYXVsdDogMTAwXV0iKTsKKyAgICAgIHByaW50bG4oIiIpOworICAgICAgcHJpbnRsbigiT3V0cHV0IHNwZWNzOiIpOworICAgICAgcHJpbnRsbigiICAtdiB2ZXJib3NpdHk6IEFkYUdyYWQgdmVyYm9zaXR5IGxldmVsICgwLTI7IGhpZ2hlciB2YWx1ZSA9PiBtb3JlIHZlcmJvc2UpXG4gICAgW1tkZWZhdWx0OiAxXV0iKTsKKyAgICAgIHByaW50bG4oIiAgLWRlY1YgZGVjVmVyYm9zaXR5OiBzaG91bGQgZGVjb2RlciBvdXRwdXQgYmUgcHJpbnRlZCAoMSkgb3IgaWdub3JlZCAoMClcbiAgICBbW2RlZmF1bHQ6IDBdXSIpOworICAgICAgcHJpbnRsbigiIik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludGxuKE9iamVjdCBvYmopIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4ob2JqKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2FkYWdyYWQvQWRhR3JhZENvcmUuamF2YSBiL3NyYy9qb3NodWEvYWRhZ3JhZC9BZGFHcmFkQ29yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZhMTZiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvam9zaHVhL2FkYWdyYWQvQWRhR3JhZENvcmUuamF2YQpAQCAtMCwwICsxLDMxOTUgQEAKK3BhY2thZ2Ugam9zaHVhLmFkYWdyYWQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqb3NodWEuZGVjb2Rlci5EZWNvZGVyOworaW1wb3J0IGpvc2h1YS5kZWNvZGVyLkpvc2h1YUNvbmZpZ3VyYXRpb247CitpbXBvcnQgam9zaHVhLm1ldHJpY3MuRXZhbHVhdGlvbk1ldHJpYzsKK2ltcG9ydCBqb3NodWEudXRpbC5TdHJlYW1Hb2JibGVyOworaW1wb3J0IGpvc2h1YS5jb3JwdXMuVm9jYWJ1bGFyeTsKKworLyoqCisgKiBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBZdWFuIENhbywgd2hvIGNvcGllZCB0aGUgTUVSVCBjb2RlIHRvIHByb2R1Y2UgdGhpcyBmaWxlLgorICovCisKK3B1YmxpYyBjbGFzcyBBZGFHcmFkQ29yZSB7CisgIHByaXZhdGUgZmluYWwgSm9zaHVhQ29uZmlndXJhdGlvbiBqb3NodWFDb25maWd1cmF0aW9uOworICBwcml2YXRlIFRyZWVTZXQ8SW50ZWdlcj5bXSBpbmRpY2VzT2ZJbnRlcmVzdF9hbGw7CisKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRGVjaW1hbEZvcm1hdCBmNCA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjIyMwLjAwMDAiKTsKKyAgcHJpdmF0ZSBmaW5hbCBSdW50aW1lIG15UnVudGltZSA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIGRvdWJsZSBOZWdJbmYgPSAoLTEuMCAvIDAuMCk7CisgIHByaXZhdGUgZmluYWwgc3RhdGljIGRvdWJsZSBQb3NJbmYgPSAoKzEuMCAvIDAuMCk7CisgIHByaXZhdGUgZmluYWwgc3RhdGljIGRvdWJsZSBlcHNpbG9uID0gMS4wIC8gMTAwMDAwMDsKKworICBwcml2YXRlIGludCBwcm9ncmVzczsKKworICBwcml2YXRlIGludCB2ZXJib3NpdHk7IC8vIGFueXRoaW5nIG9mIHByaW9yaXR5IDw9IHZlcmJvc2l0eSB3aWxsIGJlIHByaW50ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAobG93ZXIgdmFsdWUgZm9yIHByaW9yaXR5IG1lYW5zIG1vcmUgaW1wb3J0YW50KQorCisgIHByaXZhdGUgUmFuZG9tIHJhbmRHZW47CisgIHByaXZhdGUgaW50IGdlbmVyYXRlZFJhbmRzOworCisgIHByaXZhdGUgaW50IG51bVNlbnRlbmNlczsKKyAgLy8gbnVtYmVyIG9mIHNlbnRlbmNlcyBpbiB0aGUgZGV2IHNldAorICAvLyAoYWthIHRoZSAiTUVSVCB0cmFpbmluZyIgc2V0KQorCisgIHByaXZhdGUgaW50IG51bURvY3VtZW50czsKKyAgLy8gbnVtYmVyIG9mIGRvY3VtZW50cyBpbiB0aGUgZGV2IHNldAorICAvLyB0aGlzIHNob3VsZCBiZSAxLCB1bmxlc3MgZG9pbmcgZG9jLWxldmVsIG9wdGltaXphdGlvbgorCisgIHByaXZhdGUgaW50W10gZG9jT2ZTZW50ZW5jZTsKKyAgLy8gZG9jT2ZTZW50ZW5jZVtpXSBzdG9yZXMgd2hpY2ggZG9jdW1lbnQgY29udGFpbnMgdGhlIGkndGggc2VudGVuY2UuCisgIC8vIGRvY09mU2VudGVuY2UgaXMgMC1pbmRleGVkLCBhcyBhcmUgdGhlIGRvY3VtZW50cyAoaS5lLiBmaXJzdCBkb2MgaXMgaW5kZXhlZCAwKQorCisgIHByaXZhdGUgaW50W10gZG9jU3Vic2V0SW5mbzsKKyAgLy8gc3RvcmVzIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB3aGljaCBzdWJzZXQgb2YgdGhlIGRvY3VtZW50cyBhcmUgZXZhbHVhdGVkCisgIC8vIFswXTogbWV0aG9kICgwLTYpCisgIC8vIFsxXTogZmlyc3QgKDEtaW5kZXhlZCkKKyAgLy8gWzJdOiBsYXN0ICgxLWluZGV4ZWQpCisgIC8vIFszXTogc2l6ZQorICAvLyBbNF06IGNlbnRlcgorICAvLyBbNV06IGFyZzEKKyAgLy8gWzZdOiBhcmcyCisgIC8vIFsxLTZdIGFyZSAwIGZvciBtZXRob2QgMCwgWzZdIGlzIDAgZm9yIG1ldGhvZHMgMS00IGFzIHdlbGwKKyAgLy8gb25seSBbMV0gYW5kIFsyXSBhcmUgbmVlZGVkIGZvciBvcHRpbWl6YXRpb24uIFRoZSByZXN0IGFyZSBvbmx5IG5lZWRlZCBmb3IgYW4gb3V0cHV0IG1lc3NhZ2UuCisKKyAgcHJpdmF0ZSBpbnQgcmVmc1BlclNlbjsKKyAgLy8gbnVtYmVyIG9mIHJlZmVyZW5jZSB0cmFuc2xhdGlvbnMgcGVyIHNlbnRlbmNlCisKKyAgcHJpdmF0ZSBpbnQgdGV4dE5vcm1NZXRob2Q7CisgIC8vIDA6IG5vIG5vcm1hbGl6YXRpb24sIDE6ICJOSVNULXN0eWxlIiB0b2tlbml6YXRpb24sIGFuZCBhbHNvIHJlam9pbiAnbSwgJ3JlLCAqJ3MsICd2ZSwgJ2xsLCAnZCwKKyAgLy8gYW5kIG4ndCwKKyAgLy8gMjogYXBwbHkgMSBhbmQgYWxzbyByZWpvaW4gZGFzaGVzIGJldHdlZW4gbGV0dGVycywgMzogYXBwbHkgMSBhbmQgYWxzbyBkcm9wIG5vbi1BU0NJSQorICAvLyBjaGFyYWN0ZXJzCisgIC8vIDQ6IGFwcGx5IDErMiszCisKKyAgcHJpdmF0ZSBpbnQgbnVtUGFyYW1zOworICAvLyB0b3RhbCBudW1iZXIgb2YgZmlyaW5nIGZlYXR1cmVzCisgIC8vIHRoaXMgbnVtYmVyIG1heSBpbmNyZWFzZSBvdmVydGltZSBhcyBuZXcgbi1iZXN0IGxpc3RzIGFyZSBkZWNvZGVkCisgIC8vIGluaXRpYWxseSBpdCBpcyBlcXVhbCB0byB0aGUgIyBvZiBwYXJhbXMgaW4gdGhlIHBhcmFtZXRlciBjb25maWcgZmlsZQorICBwcml2YXRlIGludCBudW1QYXJhbXNPbGQ7CisgIC8vIG51bWJlciBvZiBmZWF0dXJlcyBiZWZvcmUgb2JzZXJ2aW5nIHRoZSBuZXcgZmVhdHVyZXMgZmlyZWQgaW4gdGhlIGN1cnJlbnQgaXRlcmF0aW9uCisKKyAgcHJpdmF0ZSBkb3VibGVbXSBub3JtYWxpemF0aW9uT3B0aW9uczsKKyAgLy8gSG93IHNob3VsZCBhIGxhbWJkYVtdIHZlY3RvciBiZSBub3JtYWxpemVkIChiZWZvcmUgZGVjb2RpbmcpPworICAvLyBuT1swXSA9IDA6IG5vIG5vcm1hbGl6YXRpb24KKyAgLy8gbk9bMF0gPSAxOiBzY2FsZSBzbyB0aGF0IHBhcmFtZXRlciBuT1syXSBoYXMgYWJzb2x1dGUgdmFsdWUgbk9bMV0KKyAgLy8gbk9bMF0gPSAyOiBzY2FsZSBzbyB0aGF0IHRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIGlzIG5PWzFdCisgIC8vIG5PWzBdID0gMzogc2NhbGUgc28gdGhhdCB0aGUgbWluaW11bSBhYnNvbHV0ZSB2YWx1ZSBpcyBuT1sxXQorICAvLyBuT1swXSA9IDQ6IHNjYWxlIHNvIHRoYXQgdGhlIEwtbk9bMV0gbm9ybSBlcXVhbHMgbk9bMl0KKworICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworICAvKiBOT1RFOiBpbmRleGluZyBzdGFydHMgYXQgMSBpbiB0aGUgZm9sbG93aW5nIGZldyBhcnJheXM6ICovCisgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyAgLy8gcHJpdmF0ZSBkb3VibGVbXSBsYW1iZGE7CisgIHByaXZhdGUgQXJyYXlMaXN0PERvdWJsZT4gbGFtYmRhID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisgIC8vIHRoZSBjdXJyZW50IHdlaWdodCB2ZWN0b3IuIE5PVEU6IGluZGV4aW5nIHN0YXJ0cyBhdCAxLgorICBwcml2YXRlIEFycmF5TGlzdDxEb3VibGU+IGJlc3RMYW1iZGEgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKyAgLy8gdGhlIGJlc3Qgd2VpZ2h0IHZlY3RvciBhY3Jvc3MgYWxsIGl0ZXJhdGlvbnMKKworICBwcml2YXRlIGJvb2xlYW5bXSBpc09wdGltaXphYmxlOworICAvLyBpc09wdGltaXphYmxlW2NdID0gdHJ1ZSBpZmYgbGFtYmRhW2NdIHNob3VsZCBiZSBvcHRpbWl6ZWQKKworICBwcml2YXRlIGRvdWJsZVtdIG1pblJhbmRWYWx1ZTsKKyAgcHJpdmF0ZSBkb3VibGVbXSBtYXhSYW5kVmFsdWU7CisgIC8vIHdoZW4gY2hvb3NpbmcgYSByYW5kb20gdmFsdWUgZm9yIHRoZSBsYW1iZGFbY10gcGFyYW1ldGVyLCBpdCB3aWxsIGJlCisgIC8vIGNob3NlbiBmcm9tIHRoZSBbbWluUmFuZFZhbHVlW2NdLG1heFJhbmRWYWx1ZVtjXV0gcmFuZ2UuCisgIC8vICgqKSBtaW5SYW5kVmFsdWUgYW5kIG1heFJhbmRWYWx1ZSBtdXN0IGJlIHJlYWwgdmFsdWVzLCBidXQgbm90IC1JbmYgb3IgK0luZgorCisgIHByaXZhdGUgZG91YmxlW10gZGVmYXVsdExhbWJkYTsKKyAgLy8gImRlZmF1bHQiIHBhcmFtZXRlciB2YWx1ZXM7IHNpbXBseSB0aGUgdmFsdWVzIHJlYWQgaW4gdGhlIHBhcmFtZXRlciBmaWxlCisgIC8vIFVTRUQgRk9SIE5PTi1PUFRJTUlaQUJMRSAoRklYRUQpIEZFQVRVUkVTCisKKyAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworICBwcml2YXRlIERlY29kZXIgbXlEZWNvZGVyOworICAvLyBDT01NRU5UIE9VVCBpZiBkZWNvZGVyIGlzIG5vdCBKb3NodWEKKworICBwcml2YXRlIFN0cmluZyBkZWNvZGVyQ29tbWFuZDsKKyAgLy8gdGhlIGNvbW1hbmQgdGhhdCBydW5zIHRoZSBkZWNvZGVyOyByZWFkIGZyb20gZGVjb2RlckNvbW1hbmRGaWxlTmFtZQorCisgIHByaXZhdGUgaW50IGRlY1ZlcmJvc2l0eTsKKyAgLy8gdmVyYm9zaXR5IGxldmVsIGZvciBkZWNvZGVyIG91dHB1dC4gSWYgMCwgZGVjb2RlciBvdXRwdXQgaXMgaWdub3JlZC4KKyAgLy8gSWYgMSwgZGVjb2RlciBvdXRwdXQgaXMgcHJpbnRlZC4KKworICBwcml2YXRlIGludCB2YWxpZERlY29kZXJFeGl0VmFsdWU7CisgIC8vIHJldHVybiB2YWx1ZSBmcm9tIHJ1bm5pbmcgdGhlIGRlY29kZXIgY29tbWFuZCB0aGF0IGluZGljYXRlcyBzdWNjZXNzCisKKyAgcHJpdmF0ZSBpbnQgbnVtT3B0VGhyZWFkczsKKyAgLy8gbnVtYmVyIG9mIHRocmVhZHMgdG8gcnVuIHRoaW5ncyBpbiBwYXJhbGxlbAorCisgIHByaXZhdGUgaW50IHNhdmVJbnRlckZpbGVzOworICAvLyAwOiBub3RoaW5nLCAxOiBvbmx5IGNvbmZpZ3MsIDI6IG9ubHkgbi1iZXN0cywgMzogYm90aCBjb25maWdzIGFuZCBuLWJlc3RzCisKKyAgcHJpdmF0ZSBpbnQgY29tcHJlc3NGaWxlczsKKyAgLy8gc2hvdWxkIEFkYUdyYWQgZ3ppcCB0aGUgbGFyZ2UgZmlsZXM/IElmIDAsIG5vIGNvbXByZXNzaW9uIHRha2VzIHBsYWNlLgorICAvLyBJZiAxLCBjb21wcmVzc2lvbiBpcyBwZXJmb3JtZWQgb246IGRlY29kZXIgb3V0cHV0IGZpbGVzLCB0ZW1wIHNlbnRzIGZpbGVzLAorICAvLyBhbmQgdGVtcCBmZWF0cyBmaWxlcy4KKworICBwcml2YXRlIGludCBzaXplT2ZOQmVzdDsKKyAgLy8gc2l6ZSBvZiBOLWJlc3QgbGlzdCBnZW5lcmF0ZWQgYnkgZGVjb2RlciBhdCBlYWNoIGl0ZXJhdGlvbgorICAvLyAoYWthIHNpbXBseSBOLCBidXQgTiBpcyBhIGJhZCB2YXJpYWJsZSBuYW1lKQorCisgIHByaXZhdGUgbG9uZyBzZWVkOworICAvLyBzZWVkIHVzZWQgdG8gY3JlYXRlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycworCisgIHByaXZhdGUgYm9vbGVhbiByYW5kSW5pdDsKKyAgLy8gaWYgdHJ1ZSwgcGFyYW1ldGVycyBhcmUgaW5pdGlhbGl6ZWQgcmFuZG9tbHkuIElmIGZhbHNlLCBwYXJhbWV0ZXJzCisgIC8vIGFyZSBpbml0aWFsaXplZCB1c2luZyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIgZmlsZS4KKworICBwcml2YXRlIGludCBtYXhNRVJUSXRlcmF0aW9ucywgbWluTUVSVEl0ZXJhdGlvbnMsIHByZXZNRVJUSXRlcmF0aW9uczsKKyAgLy8gbWF4OiBtYXhpbXVtIG51bWJlciBvZiBNRVJUIGl0ZXJhdGlvbnMKKyAgLy8gbWluOiBtaW5pbXVtIG51bWJlciBvZiBNRVJUIGl0ZXJhdGlvbnMgYmVmb3JlIGFuIGVhcmx5IE1FUlQgZXhpdAorICAvLyBwcmV2OiBudW1iZXIgb2YgcHJldmlvdXMgTUVSVCBpdGVyYXRpb25zIGZyb20gd2hpY2ggdG8gY29uc2lkZXIgY2FuZGlkYXRlcyAoaW4gYWRkaXRpb24gdG8KKyAgLy8gdGhlIGNhbmRpZGF0ZXMgZnJvbSB0aGUgY3VycmVudCBpdGVyYXRpb24pCisKKyAgcHJpdmF0ZSBkb3VibGUgc3RvcFNpZ1ZhbHVlOworICAvLyBlYXJseSBNRVJUIGV4aXQgaWYgbm8gd2VpZ2h0IGNoYW5nZXMgYnkgbW9yZSB0aGFuIHN0b3BTaWdWYWx1ZQorICAvLyAoYnV0IHNlZSBtaW5NRVJUSXRlcmF0aW9ucyBhYm92ZSBhbmQgc3RvcE1pbkl0cyBiZWxvdykKKworICBwcml2YXRlIGludCBzdG9wTWluSXRzOworICAvLyBzb21lIGVhcmx5IHN0b3BwaW5nIGNyaXRlcmlvbiBtdXN0IGJlIHNhdGlzZmllZCBpbiBzdG9wTWluSXRzICpjb25zZWN1dGl2ZSogaXRlcmF0aW9ucworICAvLyBiZWZvcmUgYW4gZWFybHkgZXhpdCAoYnV0IHNlZSBtaW5NRVJUSXRlcmF0aW9ucyBhYm92ZSkKKworICBwcml2YXRlIGJvb2xlYW4gb25lTW9kaWZpY2F0aW9uUGVySXRlcmF0aW9uOworICAvLyBpZiB0cnVlLCBlYWNoIE1FUlQgaXRlcmF0aW9uIHBlcmZvcm1zIGF0IG1vc3Qgb25lIHBhcmFtZXRlciBtb2RpZmljYXRpb24uCisgIC8vIElmIGZhbHNlLCBhIG5ldyBNRVJUIGl0ZXJhdGlvbiBzdGFydHMgKGkuZS4gYSBuZXcgTi1iZXN0IGxpc3QgaXMKKyAgLy8gZ2VuZXJhdGVkKSBvbmx5IGFmdGVyIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gcmVhY2hlcyBhIGxvY2FsIG1heGltdW0uCisKKyAgcHJpdmF0ZSBTdHJpbmcgbWV0cmljTmFtZTsKKyAgLy8gbmFtZSBvZiBldmFsdWF0aW9uIG1ldHJpYyBvcHRpbWl6ZWQgYnkgTUVSVAorCisgIHByaXZhdGUgU3RyaW5nIG1ldHJpY05hbWVfZGlzcGxheTsKKyAgLy8gbmFtZSBvZiBldmFsdWF0aW9uIG1ldHJpYyBvcHRpbWl6ZWQgYnkgTUVSVCwgcG9zc2libHkgd2l0aCAiZG9jLWxldmVsICIgcHJlZml4ZWQKKworICBwcml2YXRlIFN0cmluZ1tdIG1ldHJpY09wdGlvbnM7CisgIC8vIG9wdGlvbnMgZm9yIHRoZSBldmFsdWF0aW9uIG1ldHJpYyAoZS5nLiBmb3IgQkxFVSwgbWF4R3JhbUxlbmd0aCBhbmQgZWZmTGVuZ3RoTWV0aG9kKQorCisgIHByaXZhdGUgRXZhbHVhdGlvbk1ldHJpYyBldmFsTWV0cmljOworICAvLyB0aGUgZXZhbHVhdGlvbiBtZXRyaWMgdXNlZCBieSBNRVJUCisKKyAgcHJpdmF0ZSBpbnQgc3VmZlN0YXRzQ291bnQ7CisgIC8vIG51bWJlciBvZiBzdWZmaWNpZW50IHN0YXRpc3RpY3MgZm9yIHRoZSBldmFsdWF0aW9uIG1ldHJpYworCisgIHByaXZhdGUgU3RyaW5nIHRtcERpclByZWZpeDsKKyAgLy8gcHJlZml4IGZvciB0aGUgQWRhR3JhZC50ZW1wLiogZmlsZXMKKworICBwcml2YXRlIGJvb2xlYW4gcGFzc0l0ZXJhdGlvblRvRGVjb2RlcjsKKyAgLy8gc2hvdWxkIHRoZSBpdGVyYXRpb24gbnVtYmVyIGJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBkZWNvZGVyQ29tbWFuZEZpbGVOYW1lPworCisgIC8vIHVzZWQgYnkgYWRhZ3JhZAorICBwcml2YXRlIGJvb2xlYW4gbmVlZFNodWZmbGUgPSB0cnVlOyAvLyBzaHVmZmxlIHRoZSB0cmFpbmluZyBzZW50ZW5jZXMgb3Igbm90CisgIHByaXZhdGUgYm9vbGVhbiBuZWVkQXZnID0gdHJ1ZTsgLy8gYXZlcmFnZSB0aGUgd2VpaGd0cyBvciBub3Q/CisgIHByaXZhdGUgYm9vbGVhbiB1c2VQc2V1ZG9CbGV1ID0gdHJ1ZTsgLy8gbmVlZCB0byB1c2UgcHNldWRvIGNvcnB1cyB0byBjb21wdXRlIGJsZXU/CisgIHByaXZhdGUgYm9vbGVhbiByZXR1cm5CZXN0ID0gdHJ1ZTsgLy8gcmV0dXJuIHRoZSBiZXN0IHdlaWdodCBkdXJpbmcgdHVuaW5nCisgIHByaXZhdGUgYm9vbGVhbiBuZWVkU2NhbGUgPSB0cnVlOyAvLyBuZWVkIHNjYWxpbmc/CisgIHByaXZhdGUgU3RyaW5nIHRyYWluaW5nTW9kZTsKKyAgcHJpdmF0ZSBpbnQgb3JhU2VsZWN0TW9kZSA9IDE7CisgIHByaXZhdGUgaW50IHByZWRTZWxlY3RNb2RlID0gMTsKKyAgcHJpdmF0ZSBpbnQgYWRhZ3JhZEl0ZXIgPSAxOworICBwcml2YXRlIGludCByZWd1bGFyaXphdGlvbiA9IDI7CisgIHByaXZhdGUgaW50IGJhdGNoU2l6ZSA9IDE7CisgIHByaXZhdGUgZG91YmxlIGV0YTsKKyAgcHJpdmF0ZSBkb3VibGUgbGFtOworICBwcml2YXRlIGRvdWJsZSBSID0gMC45OTsgLy8gY29ycHVzIGRlY2F5IHdoZW4gcHNldWRvIGNvcnB1cyBpcyB1c2VkIGZvciBibGV1IGNvbXB1dGF0aW9uCisgIC8vIHByaXZhdGUgZG91YmxlIHNlbnRGb3JTY2FsZSA9IDAuMTU7IC8vcGVyY2VudGFnZSBvZiBzZW50ZW5jZXMgZm9yIHNjYWxlIGZhY3RvciBlc3RpbWF0aW9uCisgIHByaXZhdGUgZG91YmxlIHNjb3JlUmF0aW8gPSA1LjA7IC8vIHNjbGFsZSBzbyB0aGF0IG1vZGVsX3Njb3JlL21ldHJpY19zY29yZSA9IHNjb3JlcmF0aW8KKyAgcHJpdmF0ZSBkb3VibGUgcHJldk1ldHJpY1Njb3JlID0gMDsgLy8gZmluYWwgbWV0cmljIHNjb3JlIG9mIHRoZSBwcmV2aW91cyBpdGVyYXRpb24sIHVzZWQgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHJldHVybkJlc3QgPSB0cnVlCisKKyAgcHJpdmF0ZSBTdHJpbmcgZGlyUHJlZml4OyAvLyB3aGVyZSBhcmUgYWxsIHRoZXNlIGZpbGVzIGxvY2F0ZWQ/CisgIHByaXZhdGUgU3RyaW5nIHBhcmFtc0ZpbGVOYW1lLCBkb2NJbmZvRmlsZU5hbWUsIGZpbmFsTGFtYmRhRmlsZU5hbWU7CisgIHByaXZhdGUgU3RyaW5nIHNvdXJjZUZpbGVOYW1lLCByZWZGaWxlTmFtZSwgZGVjb2Rlck91dEZpbGVOYW1lOworICBwcml2YXRlIFN0cmluZyBkZWNvZGVyQ29uZmlnRmlsZU5hbWUsIGRlY29kZXJDb21tYW5kRmlsZU5hbWU7CisgIHByaXZhdGUgU3RyaW5nIGZha2VGaWxlTmFtZVRlbXBsYXRlLCBmYWtlRmlsZU5hbWVQcmVmaXgsIGZha2VGaWxlTmFtZVN1ZmZpeDsKKworICAvLyBlLmcuIG91dHB1dC5pdFsxLXhdLnNvbWVPbGRSdW4gd291bGQgYmUgc3BlY2lmaWVkIGFzOgorICAvLyBvdXRwdXQuaXQ/LnNvbWVPbGRSdW4KKyAgLy8gYW5kIHdlJ2QgaGF2ZSBwcmVmaXggPSAib3V0cHV0Lml0IiBhbmQgc3VmZml4ID0gIi5zYW1lT2xkUnVuIgorCisgIC8vIHByaXZhdGUgaW50IHVzZURpc2s7CisKKyAgcHVibGljIEFkYUdyYWRDb3JlKEpvc2h1YUNvbmZpZ3VyYXRpb24gam9zaHVhQ29uZmlndXJhdGlvbikgeworICAgIHRoaXMuam9zaHVhQ29uZmlndXJhdGlvbiA9IGpvc2h1YUNvbmZpZ3VyYXRpb247CisgIH0KKworICBwdWJsaWMgQWRhR3JhZENvcmUoU3RyaW5nW10gYXJncywgSm9zaHVhQ29uZmlndXJhdGlvbiBqb3NodWFDb25maWd1cmF0aW9uKSB7CisgICAgdGhpcy5qb3NodWFDb25maWd1cmF0aW9uID0gam9zaHVhQ29uZmlndXJhdGlvbjsKKyAgICBFdmFsdWF0aW9uTWV0cmljLnNldF9rbm93bk1ldHJpY3MoKTsKKyAgICBwcm9jZXNzQXJnc0FycmF5KGFyZ3MpOworICAgIGluaXRpYWxpemUoMCk7CisgIH0KKworICBwdWJsaWMgQWRhR3JhZENvcmUoU3RyaW5nIGNvbmZpZ0ZpbGVOYW1lLCBKb3NodWFDb25maWd1cmF0aW9uIGpvc2h1YUNvbmZpZ3VyYXRpb24pIHsKKyAgICB0aGlzLmpvc2h1YUNvbmZpZ3VyYXRpb24gPSBqb3NodWFDb25maWd1cmF0aW9uOworICAgIEV2YWx1YXRpb25NZXRyaWMuc2V0X2tub3duTWV0cmljcygpOworICAgIHByb2Nlc3NBcmdzQXJyYXkoY2ZnRmlsZVRvQXJnc0FycmF5KGNvbmZpZ0ZpbGVOYW1lKSk7CisgICAgaW5pdGlhbGl6ZSgwKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKGludCByYW5kc1RvU2tpcCkgeworICAgIHByaW50bG4oIk5lZ0luZjogIiArIE5lZ0luZiArICIsIFBvc0luZjogIiArIFBvc0luZiArICIsIGVwc2lsb246ICIgKyBlcHNpbG9uLCA0KTsKKworICAgIHJhbmRHZW4gPSBuZXcgUmFuZG9tKHNlZWQpOworICAgIGZvciAoaW50IHIgPSAxOyByIDw9IHJhbmRzVG9Ta2lwOyArK3IpIHsKKyAgICAgIHJhbmRHZW4ubmV4dERvdWJsZSgpOworICAgIH0KKyAgICBnZW5lcmF0ZWRSYW5kcyA9IHJhbmRzVG9Ta2lwOworCisgICAgaWYgKHJhbmRzVG9Ta2lwID09IDApIHsKKyAgICAgIHByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLCAxKTsKKyAgICAgIHByaW50bG4oIkluaXRpYWxpemluZy4uLiIsIDEpOworICAgICAgcHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIsIDEpOworICAgICAgcHJpbnRsbigiIiwgMSk7CisKKyAgICAgIHByaW50bG4oIlJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluaXRpYWxpemVkIHVzaW5nIHNlZWQ6ICIgKyBzZWVkLCAxKTsKKyAgICAgIHByaW50bG4oIiIsIDEpOworICAgIH0KKworICAgIC8vIGNvdW50IHRoZSB0b3RhbCBudW0gb2Ygc2VudGVuY2VzIHRvIGJlIGRlY29kZWQsIHJlZmZpbGVuYW1lIGlzIHRoZSBjb21iaW5lZCByZWZlcmVuY2UgZmlsZQorICAgIC8vIG5hbWUoYXV0byBnZW5lcmF0ZWQpCisgICAgbnVtU2VudGVuY2VzID0gY291bnRMaW5lcyhyZWZGaWxlTmFtZSkgLyByZWZzUGVyU2VuOworCisgICAgLy8gPz8KKyAgICBwcm9jZXNzRG9jSW5mbygpOworICAgIC8vIHNldHMgbnVtRG9jdW1lbnRzIGFuZCBkb2NPZlNlbnRlbmNlW10KKworICAgIGlmIChudW1Eb2N1bWVudHMgPiAxKQorICAgICAgbWV0cmljTmFtZV9kaXNwbGF5ID0gImRvYy1sZXZlbCAiICsgbWV0cmljTmFtZTsKKworICAgIC8vID8/CisgICAgc2V0X2RvY1N1YnNldEluZm8oZG9jU3Vic2V0SW5mbyk7CisKKyAgICAvLyBjb3VudCB0aGUgbnVtYmVyIG9mIGluaXRpYWwgZmVhdHVyZXMKKyAgICBudW1QYXJhbXMgPSBjb3VudE5vbkVtcHR5TGluZXMocGFyYW1zRmlsZU5hbWUpIC0gMTsKKyAgICBudW1QYXJhbXNPbGQgPSBudW1QYXJhbXM7CisKKyAgICAvLyByZWFkIHBhcmFtZXRlciBjb25maWcgZmlsZQorICAgIHRyeSB7CisgICAgICAvLyByZWFkIGRlbnNlIHBhcmFtZXRlciBuYW1lcworICAgICAgQnVmZmVyZWRSZWFkZXIgaW5GaWxlX25hbWVzID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHBhcmFtc0ZpbGVOYW1lKSk7CisKKyAgICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IG51bVBhcmFtczsgKytjKSB7CisgICAgICAgIFN0cmluZyBsaW5lID0gIiI7CisgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwgJiYgbGluZS5sZW5ndGgoKSA9PSAwKSB7IC8vIHNraXAgZW1wdHkgbGluZXMKKyAgICAgICAgICBsaW5lID0gaW5GaWxlX25hbWVzLnJlYWRMaW5lKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzYXZlIGZlYXR1cmUgbmFtZXMKKyAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IChsaW5lLnN1YnN0cmluZygwLCBsaW5lLmluZGV4T2YoInx8fCIpKSkudHJpbSgpOworICAgICAgICBWb2NhYnVsYXJ5LmlkKHBhcmFtTmFtZSk7CisgICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJWT0NBQiglcykgPSAlZCIsIHBhcmFtTmFtZSwgaWQpKTsKKyAgICAgIH0KKworICAgICAgaW5GaWxlX25hbWVzLmNsb3NlKCk7CisgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGluIEFkYUdyYWRDb3JlLmluaXRpYWxpemUoaW50KTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIFN5c3RlbS5leGl0KDk5OTAxKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPRXhjZXB0aW9uIGluIEFkYUdyYWRDb3JlLmluaXRpYWxpemUoaW50KTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIFN5c3RlbS5leGl0KDk5OTAyKTsKKyAgICB9CisKKyAgICAvLyB0aGUgcGFyYW1ldGVyIGZpbGUgY29udGFpbnMgb25lIGxpbmUgcGVyIHBhcmFtZXRlcgorICAgIC8vIGFuZCBvbmUgbGluZSBmb3IgdGhlIG5vcm1hbGl6YXRpb24gbWV0aG9kCisgICAgLy8gaW5kZXhpbmcgc3RhcnRzIGF0IDEgaW4gdGhlc2UgYXJyYXlzCisgICAgZm9yIChpbnQgcCA9IDA7IHAgPD0gbnVtUGFyYW1zOyArK3ApCisgICAgICBsYW1iZGEuYWRkKG5ldyBEb3VibGUoMCkpOworICAgIGJlc3RMYW1iZGEuYWRkKG5ldyBEb3VibGUoMCkpOworICAgIC8vIHdoeSBvbmx5IGxhbWJkYSBpcyBhIGxpc3Q/IGJlY2F1c2UgdGhlIHNpemUgb2YgbGFtYmRhCisgICAgLy8gbWF5IGluY3JlYXNlIG92ZXIgdGltZSwgYnV0IG90aGVyIGFycmF5cyBhcmUgc3BlY2lmaWVkIGluCisgICAgLy8gdGhlIHBhcmFtIGNvbmZpZyBmaWxlLCBvbmx5IHVzZWQgZm9yIGluaXRpYWxpemF0aW9uCisgICAgaXNPcHRpbWl6YWJsZSA9IG5ldyBib29sZWFuWzEgKyBudW1QYXJhbXNdOworICAgIG1pblJhbmRWYWx1ZSA9IG5ldyBkb3VibGVbMSArIG51bVBhcmFtc107CisgICAgbWF4UmFuZFZhbHVlID0gbmV3IGRvdWJsZVsxICsgbnVtUGFyYW1zXTsKKyAgICBkZWZhdWx0TGFtYmRhID0gbmV3IGRvdWJsZVsxICsgbnVtUGFyYW1zXTsKKyAgICBub3JtYWxpemF0aW9uT3B0aW9ucyA9IG5ldyBkb3VibGVbM107CisKKyAgICAvLyByZWFkIGluaXRpYWwgcGFyYW0gdmFsdWVzCisgICAgcHJvY2Vzc1BhcmFtRmlsZSgpOworICAgIC8vIHNldHMgdGhlIGFycmF5cyBkZWNsYXJlZCBqdXN0IGFib3ZlCisKKyAgICAvLyBTZW50ZW5jZUluZm8uY3JlYXRlVigpOyAvLyB1bmNvbW1lbnQgT05MWSBJRiB1c2luZyB2b2NhYnVsYXJ5IGltcGxlbWVudGF0aW9uIG9mIFNlbnRlbmNlSW5mbworCisgICAgU3RyaW5nW11bXSByZWZTZW50ZW5jZXMgPSBuZXcgU3RyaW5nW251bVNlbnRlbmNlc11bcmVmc1BlclNlbl07CisKKyAgICB0cnkgeworCisgICAgICAvLyByZWFkIGluIHJlZmVyZW5jZSBzZW50ZW5jZXMKKyAgICAgIElucHV0U3RyZWFtIGluU3RyZWFtX3JlZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKHJlZkZpbGVOYW1lKSk7CisgICAgICBCdWZmZXJlZFJlYWRlciBpbkZpbGVfcmVmcyA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5TdHJlYW1fcmVmcywgInV0ZjgiKSk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2VudGVuY2VzOyArK2kpIHsKKyAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCByZWZzUGVyU2VuOyArK3IpIHsKKyAgICAgICAgICAvLyByZWFkIHRoZSBydGggcmVmZXJlbmNlIHRyYW5zbGF0aW9uIGZvciB0aGUgaXRoIHNlbnRlbmNlCisgICAgICAgICAgcmVmU2VudGVuY2VzW2ldW3JdID0gaW5GaWxlX3JlZnMucmVhZExpbmUoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbkZpbGVfcmVmcy5jbG9zZSgpOworCisgICAgICAvLyBub3JtYWxpemUgcmVmZXJlbmNlIHNlbnRlbmNlcworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TZW50ZW5jZXM7ICsraSkgeworICAgICAgICBmb3IgKGludCByID0gMDsgciA8IHJlZnNQZXJTZW47ICsrcikgeworICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcnRoIHJlZmVyZW5jZSB0cmFuc2xhdGlvbiBmb3IgdGhlIGl0aCBzZW50ZW5jZQorICAgICAgICAgIHJlZlNlbnRlbmNlc1tpXVtyXSA9IG5vcm1hbGl6ZShyZWZTZW50ZW5jZXNbaV1bcl0sIHRleHROb3JtTWV0aG9kKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyByZWFkIGluIGRlY29kZXIgY29tbWFuZCwgaWYgYW55CisgICAgICBkZWNvZGVyQ29tbWFuZCA9IG51bGw7CisgICAgICBpZiAoZGVjb2RlckNvbW1hbmRGaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChmaWxlRXhpc3RzKGRlY29kZXJDb21tYW5kRmlsZU5hbWUpKSB7CisgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5GaWxlX2NvbW0gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZGVjb2RlckNvbW1hbmRGaWxlTmFtZSkpOworICAgICAgICAgIGRlY29kZXJDb21tYW5kID0gaW5GaWxlX2NvbW0ucmVhZExpbmUoKTsgLy8gUkVBRCBJTiBERUNPREUgQ09NTUFORAorICAgICAgICAgIGluRmlsZV9jb21tLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGaWxlTm90Rm91bmRFeGNlcHRpb24gaW4gQWRhR3JhZENvcmUuaW5pdGlhbGl6ZShpbnQpOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgU3lzdGVtLmV4aXQoOTk5MDEpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU9FeGNlcHRpb24gaW4gQWRhR3JhZENvcmUuaW5pdGlhbGl6ZShpbnQpOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgU3lzdGVtLmV4aXQoOTk5MDIpOworICAgIH0KKworICAgIC8vIHNldCBzdGF0aWMgZGF0YSBtZW1iZXJzIGZvciB0aGUgRXZhbHVhdGlvbk1ldHJpYyBjbGFzcworICAgIEV2YWx1YXRpb25NZXRyaWMuc2V0X251bVNlbnRlbmNlcyhudW1TZW50ZW5jZXMpOworICAgIEV2YWx1YXRpb25NZXRyaWMuc2V0X251bURvY3VtZW50cyhudW1Eb2N1bWVudHMpOworICAgIEV2YWx1YXRpb25NZXRyaWMuc2V0X3JlZnNQZXJTZW4ocmVmc1BlclNlbik7CisgICAgRXZhbHVhdGlvbk1ldHJpYy5zZXRfcmVmU2VudGVuY2VzKHJlZlNlbnRlbmNlcyk7CisgICAgRXZhbHVhdGlvbk1ldHJpYy5zZXRfdG1wRGlyUHJlZml4KHRtcERpclByZWZpeCk7CisKKyAgICBldmFsTWV0cmljID0gRXZhbHVhdGlvbk1ldHJpYy5nZXRNZXRyaWMobWV0cmljTmFtZSwgbWV0cmljT3B0aW9ucyk7CisgICAgLy8gdXNlZCBvbmx5IGlmIHJldHVybkJlc3QgPSB0cnVlCisgICAgcHJldk1ldHJpY1Njb3JlID0gZXZhbE1ldHJpYy5nZXRUb0JlTWluaW1pemVkKCkgPyBQb3NJbmYgOiBOZWdJbmY7CisKKyAgICAvLyBsZW5ndGggb2Ygc3VmZmljaWVudCBzdGF0aXN0aWNzCisgICAgLy8gZm9yIGJsZXU6IHN1ZmZzdGF0c2NvdW50PTggKDIqbmdyYW0rMikKKyAgICBzdWZmU3RhdHNDb3VudCA9IGV2YWxNZXRyaWMuZ2V0X3N1ZmZTdGF0c0NvdW50KCk7CisKKyAgICAvLyBzZXQgc3RhdGljIGRhdGEgbWVtYmVycyBmb3IgdGhlIEludGVybWVkaWF0ZU9wdGltaXplciBjbGFzcworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlT3B0aW1pemVyLnNldF9NRVJUcGFyYW1zKG51bVNlbnRlbmNlcywgbnVtRG9jdW1lbnRzLCBkb2NPZlNlbnRlbmNlLAorICAgICAqIGRvY1N1YnNldEluZm8sIG51bVBhcmFtcywgbm9ybWFsaXphdGlvbk9wdGlvbnMsIGlzT3B0aW1pemFibGUgb25lTW9kaWZpY2F0aW9uUGVySXRlcmF0aW9uLAorICAgICAqIGV2YWxNZXRyaWMsIHRtcERpclByZWZpeCwgdmVyYm9zaXR5KTsKKyAgICAgKi8KKworICAgIC8vIHByaW50IGluZm8KKyAgICBpZiAocmFuZHNUb1NraXAgPT0gMCkgeyAvLyBpLmUuIGZpcnN0IGl0ZXJhdGlvbgorICAgICAgcHJpbnRsbigiTnVtYmVyIG9mIHNlbnRlbmNlczogIiArIG51bVNlbnRlbmNlcywgMSk7CisgICAgICBwcmludGxuKCJOdW1iZXIgb2YgZG9jdW1lbnRzOiAiICsgbnVtRG9jdW1lbnRzLCAxKTsKKyAgICAgIHByaW50bG4oIk9wdGltaXppbmcgIiArIG1ldHJpY05hbWVfZGlzcGxheSwgMSk7CisKKyAgICAgIC8qCisgICAgICAgKiBwcmludCgiZG9jU3Vic2V0SW5mbzogeyIsIDEpOyBmb3IgKGludCBmID0gMDsgZiA8IDY7ICsrZikgcHJpbnQoZG9jU3Vic2V0SW5mb1tmXSArICIsICIsCisgICAgICAgKiAxKTsgcHJpbnRsbihkb2NTdWJzZXRJbmZvWzZdICsgIn0iLCAxKTsKKyAgICAgICAqLworCisgICAgICBwcmludGxuKCJOdW1iZXIgb2YgaW5pdGlhbCBmZWF0dXJlczogIiArIG51bVBhcmFtcywgMSk7CisgICAgICBwcmludCgiSW5pdGlhbCBmZWF0dXJlIG5hbWVzOiB7IiwgMSk7CisKKyAgICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IG51bVBhcmFtczsgKytjKQorICAgICAgICBwcmludCgiXCIiICsgVm9jYWJ1bGFyeS53b3JkKGMpICsgIlwiIiwgMSk7CisgICAgICBwcmludGxuKCJ9IiwgMSk7CisgICAgICBwcmludGxuKCIiLCAxKTsKKworICAgICAgLy8gVE9ETyBqdXN0IHByaW50IHRoZSBjb3JyZWN0IGluZm8KKyAgICAgIHByaW50bG4oImMgICAgRGVmYXVsdCB2YWx1ZVx0T3B0aW1pemFibGU/XHRSYW5kLiB2YWwuIHJhbmdlIiwgMSk7CisKKyAgICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IG51bVBhcmFtczsgKytjKSB7CisgICAgICAgIHByaW50KGMgKyAiICAgICAiICsgZjQuZm9ybWF0KGxhbWJkYS5nZXQoYykuZG91YmxlVmFsdWUoKSkgKyAiXHRcdCIsIDEpOworCisgICAgICAgIGlmICghaXNPcHRpbWl6YWJsZVtjXSkgeworICAgICAgICAgIHByaW50bG4oIiBObyIsIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50KCIgWWVzXHRcdCIsIDEpOworICAgICAgICAgIHByaW50KCIgWyIgKyBtaW5SYW5kVmFsdWVbY10gKyAiLCIgKyBtYXhSYW5kVmFsdWVbY10gKyAiXSIsIDEpOworICAgICAgICAgIHByaW50bG4oIiIsIDEpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHByaW50bG4oIiIsIDEpOworICAgICAgcHJpbnQoIldlaWdodCB2ZWN0b3Igbm9ybWFsaXphdGlvbiBtZXRob2Q6ICIsIDEpOworICAgICAgaWYgKG5vcm1hbGl6YXRpb25PcHRpb25zWzBdID09IDApIHsKKyAgICAgICAgcHJpbnRsbigibm9uZS4iLCAxKTsKKyAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvbk9wdGlvbnNbMF0gPT0gMSkgeworICAgICAgICBwcmludGxuKAorICAgICAgICAgICAgIndlaWdodHMgd2lsbCBiZSBzY2FsZWQgc28gdGhhdCB0aGUgXCIiCisgICAgICAgICAgICAgICAgKyBWb2NhYnVsYXJ5LndvcmQoKGludCkgbm9ybWFsaXphdGlvbk9wdGlvbnNbMl0pCisgICAgICAgICAgICAgICAgKyAiXCIgd2VpZ2h0IGhhcyBhbiBhYnNvbHV0ZSB2YWx1ZSBvZiAiICsgbm9ybWFsaXphdGlvbk9wdGlvbnNbMV0gKyAiLiIsIDEpOworICAgICAgfSBlbHNlIGlmIChub3JtYWxpemF0aW9uT3B0aW9uc1swXSA9PSAyKSB7CisgICAgICAgIHByaW50bG4oIndlaWdodHMgd2lsbCBiZSBzY2FsZWQgc28gdGhhdCB0aGUgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSBpcyAiCisgICAgICAgICAgICArIG5vcm1hbGl6YXRpb25PcHRpb25zWzFdICsgIi4iLCAxKTsKKyAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvbk9wdGlvbnNbMF0gPT0gMykgeworICAgICAgICBwcmludGxuKCJ3ZWlnaHRzIHdpbGwgYmUgc2NhbGVkIHNvIHRoYXQgdGhlIG1pbmltdW0gYWJzb2x1dGUgdmFsdWUgaXMgIgorICAgICAgICAgICAgKyBub3JtYWxpemF0aW9uT3B0aW9uc1sxXSArICIuIiwgMSk7CisgICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6YXRpb25PcHRpb25zWzBdID09IDQpIHsKKyAgICAgICAgcHJpbnRsbigid2VpZ2h0cyB3aWxsIGJlIHNjYWxlZCBzbyB0aGF0IHRoZSBMLSIgKyBub3JtYWxpemF0aW9uT3B0aW9uc1sxXSArICIgbm9ybSBpcyAiCisgICAgICAgICAgICArIG5vcm1hbGl6YXRpb25PcHRpb25zWzJdICsgIi4iLCAxKTsKKyAgICAgIH0KKworICAgICAgcHJpbnRsbigiIiwgMSk7CisKKyAgICAgIHByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLCAxKTsKKyAgICAgIHByaW50bG4oIiIsIDEpOworCisgICAgICAvLyByZW5hbWUgb3JpZ2luYWwgY29uZmlnIGZpbGUgc28gaXQgZG9lc24ndCBnZXQgb3ZlcndyaXR0ZW4KKyAgICAgIC8vIChvcmlnaW5hbCBuYW1lIHdpbGwgYmUgcmVzdG9yZWQgaW4gZmluaXNoKCkpCisgICAgICByZW5hbWVGaWxlKGRlY29kZXJDb25maWdGaWxlTmFtZSwgZGVjb2RlckNvbmZpZ0ZpbGVOYW1lICsgIi5BZGFHcmFkLm9yaWciKTsKKyAgICB9IC8vIGlmIChyYW5kc1RvU2tpcCA9PSAwKQorCisgICAgLy8gYnkgZGVmYXVsdCwgbG9hZCBqb3NodWEgZGVjb2RlcgorICAgIGlmIChkZWNvZGVyQ29tbWFuZCA9PSBudWxsICYmIGZha2VGaWxlTmFtZVRlbXBsYXRlID09IG51bGwpIHsKKyAgICAgIHByaW50bG4oIkxvYWRpbmcgSm9zaHVhIGRlY29kZXIuLi4iLCAxKTsKKyAgICAgIG15RGVjb2RlciA9IG5ldyBEZWNvZGVyKGpvc2h1YUNvbmZpZ3VyYXRpb24sIGRlY29kZXJDb25maWdGaWxlTmFtZSArICIuQWRhR3JhZC5vcmlnIik7CisgICAgICBwcmludGxuKCIuLi5maW5pc2hlZCBsb2FkaW5nIEAgIiArIChuZXcgRGF0ZSgpKSwgMSk7CisgICAgICBwcmludGxuKCIiKTsKKyAgICB9IGVsc2UgeworICAgICAgbXlEZWNvZGVyID0gbnVsbDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBUcmVlU2V0PEludGVnZXI+W10gdGVtcF9UU0EgPSBuZXcgVHJlZVNldFtudW1TZW50ZW5jZXNdOworICAgIGluZGljZXNPZkludGVyZXN0X2FsbCA9IHRlbXBfVFNBOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TZW50ZW5jZXM7ICsraSkgeworICAgICAgaW5kaWNlc09mSW50ZXJlc3RfYWxsW2ldID0gbmV3IFRyZWVTZXQ8SW50ZWdlcj4oKTsKKyAgICB9CisgIH0gLy8gdm9pZCBpbml0aWFsaXplKC4uLikKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHVibGljIHZvaWQgcnVuX0FkYUdyYWQoKSB7CisgICAgcnVuX0FkYUdyYWQobWluTUVSVEl0ZXJhdGlvbnMsIG1heE1FUlRJdGVyYXRpb25zLCBwcmV2TUVSVEl0ZXJhdGlvbnMpOworICB9CisKKyAgcHVibGljIHZvaWQgcnVuX0FkYUdyYWQoaW50IG1pbkl0cywgaW50IG1heEl0cywgaW50IHByZXZJdHMpIHsKKyAgICAvLyBGSVJTVCwgQ0xFQU4gQUxMIFBSRVZJT1VTIFRFTVAgRklMRVMKKyAgICBTdHJpbmcgZGlyOworICAgIGludCBrID0gdG1wRGlyUHJlZml4Lmxhc3RJbmRleE9mKCIvIik7CisgICAgaWYgKGsgPj0gMCkgeworICAgICAgZGlyID0gdG1wRGlyUHJlZml4LnN1YnN0cmluZygwLCBrICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRpciA9ICIuLyI7CisgICAgfQorICAgIFN0cmluZyBmaWxlczsKKyAgICBGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGRpcik7CisKKyAgICBpZiAoZm9sZGVyLmV4aXN0cygpKSB7CisgICAgICBGaWxlW10gbGlzdE9mRmlsZXMgPSBmb2xkZXIubGlzdEZpbGVzKCk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdE9mRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKGxpc3RPZkZpbGVzW2ldLmlzRmlsZSgpKSB7CisgICAgICAgICAgZmlsZXMgPSBsaXN0T2ZGaWxlc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgaWYgKGZpbGVzLnN0YXJ0c1dpdGgoIkFkYUdyYWQudGVtcCIpKSB7CisgICAgICAgICAgICBkZWxldGVGaWxlKGZpbGVzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiwgMSk7CisgICAgcHJpbnRsbigiQWRhR3JhZCBydW4gc3RhcnRlZCBAICIgKyAobmV3IERhdGUoKSksIDEpOworICAgIC8vIHByaW50TWVtb3J5VXNhZ2UoKTsKKyAgICBwcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiwgMSk7CisgICAgcHJpbnRsbigiIiwgMSk7CisKKyAgICAvLyBpZiBubyBkZWZhdWx0IGxhbWJkYSBpcyBwcm92aWRlZAorICAgIGlmIChyYW5kSW5pdCkgeworICAgICAgcHJpbnRsbigiSW5pdGlhbGl6aW5nIGxhbWJkYVtdIHJhbmRvbWx5LiIsIDEpOworICAgICAgLy8gaW5pdGlhbGl6ZSBvcHRpbWl6YWJsZSBwYXJhbWV0ZXJzIHJhbmRvbWx5IChzYW1wbGluZyB1bmlmb3JtbHkgZnJvbQorICAgICAgLy8gdGhhdCBwYXJhbWV0ZXIncyByYW5kb20gdmFsdWUgcmFuZ2UpCisgICAgICBsYW1iZGEgPSByYW5kb21MYW1iZGEoKTsKKyAgICB9CisKKyAgICBwcmludGxuKCJJbml0aWFsIGxhbWJkYVtdOiAiICsgbGFtYmRhVG9TdHJpbmcobGFtYmRhKSwgMSk7CisgICAgcHJpbnRsbigiIiwgMSk7CisKKyAgICBpbnRbXSBtYXhJbmRleCA9IG5ldyBpbnRbbnVtU2VudGVuY2VzXTsKKworICAgIC8vIEhhc2hNYXA8SW50ZWdlcixpbnRbXT5bXSBzdWZmU3RhdHNfYXJyYXkgPSBuZXcgSGFzaE1hcFtudW1TZW50ZW5jZXNdOworICAgIC8vIHN1ZmZTdGF0c19hcnJheVtpXSBtYXBzIGNhbmRpZGF0ZXMgb2YgaW50ZXJlc3QgZm9yIHNlbnRlbmNlIGkgdG8gYW4gYXJyYXkKKyAgICAvLyBzdG9yaW5nIHRoZSBzdWZmaWNpZW50IHN0YXRpc3RpY3MgZm9yIHRoYXQgY2FuZGlkYXRlCisKKyAgICBpbnQgZWFybHlTdG9wID0gMDsKKyAgICAvLyBudW1iZXIgb2YgY29uc2VjdXRpdmUgaXRlcmF0aW9uIGFuIGVhcmx5IHN0b3BwaW5nIGNyaXRlcmlvbiB3YXMgc2F0aXNmaWVkCisKKyAgICBmb3IgKGludCBpdGVyYXRpb24gPSAxOzsgKytpdGVyYXRpb24pIHsKKworICAgICAgLy8gd2hhdCBkb2VzICJBIiBjb250YWluPworICAgICAgLy8gcmV0QVswXTogRklOQUxfc2NvcmUKKyAgICAgIC8vIHJldEFbMV06IGVhcmx5U3RvcAorICAgICAgLy8gcmV0QVsyXTogc2hvdWxkIHRoaXMgYmUgdGhlIGxhc3QgaXRlcmF0aW9uPworICAgICAgZG91YmxlW10gQSA9IHJ1bl9zaW5nbGVfaXRlcmF0aW9uKGl0ZXJhdGlvbiwgbWluSXRzLCBtYXhJdHMsIHByZXZJdHMsIGVhcmx5U3RvcCwgbWF4SW5kZXgpOworICAgICAgaWYgKEEgIT0gbnVsbCkgeworICAgICAgICBlYXJseVN0b3AgPSAoaW50KSBBWzFdOworICAgICAgICBpZiAoQVsyXSA9PSAxKQorICAgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9IC8vIGZvciAoaXRlcmF0aW9uKQorCisgICAgcHJpbnRsbigiIiwgMSk7CisKKyAgICBwcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiwgMSk7CisgICAgcHJpbnRsbigiQWRhR3JhZCBydW4gZW5kZWQgQCAiICsgKG5ldyBEYXRlKCkpLCAxKTsKKyAgICAvLyBwcmludE1lbW9yeVVzYWdlKCk7CisgICAgcHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIsIDEpOworICAgIHByaW50bG4oIiIsIDEpOworICAgIGlmICghcmV0dXJuQmVzdCkKKyAgICAgIHByaW50bG4oIkZJTkFMIGxhbWJkYTogIiArIGxhbWJkYVRvU3RyaW5nKGxhbWJkYSksIDEpOworICAgIC8vICsgIiAoIiArIG1ldHJpY05hbWVfZGlzcGxheSArICI6ICIgKyBGSU5BTF9zY29yZSArICIpIiwxKTsKKyAgICBlbHNlCisgICAgICBwcmludGxuKCJCRVNUIGxhbWJkYTogIiArIGxhbWJkYVRvU3RyaW5nKGxhbWJkYSksIDEpOworCisgICAgLy8gZGVsZXRlIGludGVybWVkaWF0ZSAudGVtcC4qLml0KiBkZWNvZGVyIG91dHB1dCBmaWxlcworICAgIGZvciAoaW50IGl0ZXJhdGlvbiA9IDE7IGl0ZXJhdGlvbiA8PSBtYXhJdHM7ICsraXRlcmF0aW9uKSB7CisgICAgICBpZiAoY29tcHJlc3NGaWxlcyA9PSAxKSB7CisgICAgICAgIGRlbGV0ZUZpbGUodG1wRGlyUHJlZml4ICsgInRlbXAuc2VudHMuaXQiICsgaXRlcmF0aW9uICsgIi5neiIpOworICAgICAgICBkZWxldGVGaWxlKHRtcERpclByZWZpeCArICJ0ZW1wLmZlYXRzLml0IiArIGl0ZXJhdGlvbiArICIuZ3oiKTsKKyAgICAgICAgaWYgKGZpbGVFeGlzdHModG1wRGlyUHJlZml4ICsgInRlbXAuc3RhdHMuaXQiICsgaXRlcmF0aW9uICsgIi5jb3B5Lmd6IikpIHsKKyAgICAgICAgICBkZWxldGVGaWxlKHRtcERpclByZWZpeCArICJ0ZW1wLnN0YXRzLml0IiArIGl0ZXJhdGlvbiArICIuY29weS5neiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlbGV0ZUZpbGUodG1wRGlyUHJlZml4ICsgInRlbXAuc3RhdHMuaXQiICsgaXRlcmF0aW9uICsgIi5neiIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBkZWxldGVGaWxlKHRtcERpclByZWZpeCArICJ0ZW1wLnNlbnRzLml0IiArIGl0ZXJhdGlvbik7CisgICAgICAgIGRlbGV0ZUZpbGUodG1wRGlyUHJlZml4ICsgInRlbXAuZmVhdHMuaXQiICsgaXRlcmF0aW9uKTsKKyAgICAgICAgaWYgKGZpbGVFeGlzdHModG1wRGlyUHJlZml4ICsgInRlbXAuc3RhdHMuaXQiICsgaXRlcmF0aW9uICsgIi5jb3B5IikpIHsKKyAgICAgICAgICBkZWxldGVGaWxlKHRtcERpclByZWZpeCArICJ0ZW1wLnN0YXRzLml0IiArIGl0ZXJhdGlvbiArICIuY29weSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlbGV0ZUZpbGUodG1wRGlyUHJlZml4ICsgInRlbXAuc3RhdHMuaXQiICsgaXRlcmF0aW9uKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSAvLyB2b2lkIHJ1bl9BZGFHcmFkKGludCBtYXhJdHMpCisKKyAgLy8gdGhpcyBpcyB0aGUga2V5IGZ1bmN0aW9uIQorICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIGRvdWJsZVtdIHJ1bl9zaW5nbGVfaXRlcmF0aW9uKGludCBpdGVyYXRpb24sIGludCBtaW5JdHMsIGludCBtYXhJdHMsIGludCBwcmV2SXRzLAorICAgICAgaW50IGVhcmx5U3RvcCwgaW50W10gbWF4SW5kZXgpIHsKKyAgICBkb3VibGUgRklOQUxfc2NvcmUgPSAwOworCisgICAgZG91YmxlW10gcmV0QSA9IG5ldyBkb3VibGVbM107CisgICAgLy8gcmV0QVswXTogRklOQUxfc2NvcmUKKyAgICAvLyByZXRBWzFdOiBlYXJseVN0b3AKKyAgICAvLyByZXRBWzJdOiBzaG91bGQgdGhpcyBiZSB0aGUgbGFzdCBpdGVyYXRpb24/CisKKyAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKKyAgICByZXRBWzJdID0gMTsgLy8gd2lsbCBvbmx5IGJlIG1hZGUgMCBpZiB3ZSBkb24ndCBicmVhayBmcm9tIHRoZSBmb2xsb3dpbmcgbG9vcAorCisgICAgLy8gc2F2ZSBmZWF0cyBhbmQgc3RhdHMgZm9yIGFsbCBjYW5kaWRhdGVzKG9sZCAmIG5ldykKKyAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPltdIGZlYXRfaGFzaCA9IG5ldyBIYXNoTWFwW251bVNlbnRlbmNlc107CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TZW50ZW5jZXM7IGkrKykKKyAgICAgIGZlYXRfaGFzaFtpXSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz5bXSBzdGF0c19oYXNoID0gbmV3IEhhc2hNYXBbbnVtU2VudGVuY2VzXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNlbnRlbmNlczsgaSsrKQorICAgICAgc3RhdHNfaGFzaFtpXSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgd2hpbGUgKCFkb25lKSB7IC8vIE5PVEU6IHRoaXMgImxvb3AiIHdpbGwgb25seSBiZSBjYXJyaWVkIG91dCBvbmNlCisgICAgICBwcmludGxuKCItLS0gU3RhcnRpbmcgQWRhR3JhZCBpdGVyYXRpb24gIyIgKyBpdGVyYXRpb24gKyAiIEAgIiArIChuZXcgRGF0ZSgpKSArICIgLS0tIiwgMSk7CisKKyAgICAgIC8vIHByaW50TWVtb3J5VXNhZ2UoKTsKKworICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgIC8vIENSRUFURSBERUNPREVSIENPTkZJRyBGSUxFIC8vCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICBjcmVhdGVDb25maWdGaWxlKGxhbWJkYSwgZGVjb2RlckNvbmZpZ0ZpbGVOYW1lLCBkZWNvZGVyQ29uZmlnRmlsZU5hbWUgKyAiLkFkYUdyYWQub3JpZyIpOworICAgICAgLy8gaS5lLiB1c2UgdGhlIG9yaWdpbmFsIGNvbmZpZyBmaWxlIGFzIGEgdGVtcGxhdGUKKworICAgICAgLyoqKioqKioqKioqKioqKi8KKyAgICAgIC8vIFJVTiBERUNPREVSIC8vCisgICAgICAvKioqKioqKioqKioqKioqLworCisgICAgICBpZiAoaXRlcmF0aW9uID09IDEpIHsKKyAgICAgICAgcHJpbnRsbigiRGVjb2RpbmcgdXNpbmcgaW5pdGlhbCB3ZWlnaHQgdmVjdG9yICIgKyBsYW1iZGFUb1N0cmluZyhsYW1iZGEpLCAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50bG4oIlJlZGVjb2RpbmcgdXNpbmcgd2VpZ2h0IHZlY3RvciAiICsgbGFtYmRhVG9TdHJpbmcobGFtYmRhKSwgMSk7CisgICAgICB9CisKKyAgICAgIC8vIGdlbmVyYXRlIHRoZSBuLWJlc3QgZmlsZSBhZnRlciBkZWNvZGluZworICAgICAgU3RyaW5nW10gZGVjUnVuUmVzdWx0ID0gcnVuX2RlY29kZXIoaXRlcmF0aW9uKTsgLy8gaXRlcmF0aW9uIHBhc3NlZCBpbiBjYXNlIGZha2UgZGVjb2RlciB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSB1c2VkCisgICAgICAvLyBbMF0gbmFtZSBvZiBmaWxlIHRvIGJlIHByb2Nlc3NlZAorICAgICAgLy8gWzFdIGluZGljYXRlcyBob3cgdGhlIG91dHB1dCBmaWxlIHdhcyBvYnRhaW5lZDoKKyAgICAgIC8vIDE6IGV4dGVybmFsIGRlY29kZXIKKyAgICAgIC8vIDI6IGZha2UgZGVjb2RlcgorICAgICAgLy8gMzogaW50ZXJuYWwgZGVjb2RlcgorCisgICAgICBpZiAoIWRlY1J1blJlc3VsdFsxXS5lcXVhbHMoIjIiKSkgeworICAgICAgICBwcmludGxuKCIuLi5maW5pc2hlZCBkZWNvZGluZyBAICIgKyAobmV3IERhdGUoKSksIDEpOworICAgICAgfQorCisgICAgICBjaGVja0ZpbGUoZGVjUnVuUmVzdWx0WzBdKTsKKworICAgICAgLyoqKioqKioqKioqKiogRU5EIE9GIERFQ09ESU5HICoqKioqKioqKioqKioqLworCisgICAgICBwcmludGxuKCJQcm9kdWNpbmcgdGVtcCBmaWxlcyBmb3IgaXRlcmF0aW9uICIgKyBpdGVyYXRpb24sIDMpOworCisgICAgICBwcm9kdWNlVGVtcEZpbGVzKGRlY1J1blJlc3VsdFswXSwgaXRlcmF0aW9uKTsKKworICAgICAgLy8gc2F2ZSBpbnRlcm1lZGlkYXRlIG91dHB1dCBmaWxlcworICAgICAgLy8gc2F2ZSBqb3NodWEuY29uZmlnLmFkYWdyYWQuaXQqCisgICAgICBpZiAoc2F2ZUludGVyRmlsZXMgPT0gMSB8fCBzYXZlSW50ZXJGaWxlcyA9PSAzKSB7IC8vIG1ha2UgY29weSBvZiBpbnRlcm1lZGlhdGUgY29uZmlnIGZpbGUKKyAgICAgICAgaWYgKCFjb3B5RmlsZShkZWNvZGVyQ29uZmlnRmlsZU5hbWUsIGRlY29kZXJDb25maWdGaWxlTmFtZSArICIuQWRhR3JhZC5pdCIgKyBpdGVyYXRpb24pKSB7CisgICAgICAgICAgcHJpbnRsbigiV2FybmluZzogYXR0ZW1wdCB0byBtYWtlIGNvcHkgb2YgZGVjb2RlciBjb25maWcgZmlsZSAodG8gY3JlYXRlIgorICAgICAgICAgICAgICArIGRlY29kZXJDb25maWdGaWxlTmFtZSArICIuQWRhR3JhZC5pdCIgKyBpdGVyYXRpb24gKyAiKSB3YXMgdW5zdWNjZXNzZnVsISIsIDEpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIHNhdmUgb3V0cHV0Lm5lc3QuQWRhR3JhZC5pdCoKKyAgICAgIGlmIChzYXZlSW50ZXJGaWxlcyA9PSAyIHx8IHNhdmVJbnRlckZpbGVzID09IDMpIHsgLy8gbWFrZSBjb3B5IG9mIGludGVybWVkaWF0ZSBkZWNvZGVyIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlLi4uCisKKyAgICAgICAgaWYgKCFkZWNSdW5SZXN1bHRbMV0uZXF1YWxzKCIyIikpIHsgLy8gLi4uYnV0IG9ubHkgaWYgbm8gZmFrZSBkZWNvZGVyCisgICAgICAgICAgaWYgKCFkZWNSdW5SZXN1bHRbMF0uZW5kc1dpdGgoIi5neiIpKSB7CisgICAgICAgICAgICBpZiAoIWNvcHlGaWxlKGRlY1J1blJlc3VsdFswXSwgZGVjUnVuUmVzdWx0WzBdICsgIi5BZGFHcmFkLml0IiArIGl0ZXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgcHJpbnRsbigiV2FybmluZzogYXR0ZW1wdCB0byBtYWtlIGNvcHkgb2YgZGVjb2RlciBvdXRwdXQgZmlsZSAodG8gY3JlYXRlIgorICAgICAgICAgICAgICAgICAgKyBkZWNSdW5SZXN1bHRbMF0gKyAiLkFkYUdyYWQuaXQiICsgaXRlcmF0aW9uICsgIikgd2FzIHVuc3VjY2Vzc2Z1bCEiLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGRlY1J1blJlc3VsdFswXS5zdWJzdHJpbmcoMCwgZGVjUnVuUmVzdWx0WzBdLmxlbmd0aCgpIC0gMyk7CisgICAgICAgICAgICBpZiAoIWNvcHlGaWxlKHByZWZpeCArICIuZ3oiLCBwcmVmaXggKyAiLkFkYUdyYWQuaXQiICsgaXRlcmF0aW9uICsgIi5neiIpKSB7CisgICAgICAgICAgICAgIHByaW50bG4oIldhcm5pbmc6IGF0dGVtcHQgdG8gbWFrZSBjb3B5IG9mIGRlY29kZXIgb3V0cHV0IGZpbGUgKHRvIGNyZWF0ZSIgKyBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICsgIi5BZGFHcmFkLml0IiArIGl0ZXJhdGlvbiArICIuZ3oiICsgIikgd2FzIHVuc3VjY2Vzc2Z1bCEiLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoY29tcHJlc3NGaWxlcyA9PSAxICYmICFkZWNSdW5SZXN1bHRbMF0uZW5kc1dpdGgoIi5neiIpKSB7CisgICAgICAgICAgICBnemlwRmlsZShkZWNSdW5SZXN1bHRbMF0gKyAiLkFkYUdyYWQuaXQiICsgaXRlcmF0aW9uKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gLy8gaWYgKCFmYWtlKQorICAgICAgfQorCisgICAgICAvLyAtLS0tLS0tLS0tLS0tIGVuZCBvZiBzYXZpbmcgLmFkYWdyYWQuaXQqIGZpbGVzIC0tLS0tLS0tLS0tLS0tLQorCisgICAgICBpbnRbXSBjYW5kQ291bnQgPSBuZXcgaW50W251bVNlbnRlbmNlc107CisgICAgICBpbnRbXSBsYXN0VXNlZEluZGV4ID0gbmV3IGludFtudW1TZW50ZW5jZXNdOworCisgICAgICBDb25jdXJyZW50SGFzaE1hcDxJbnRlZ2VyLCBpbnRbXT5bXSBzdWZmU3RhdHNfYXJyYXkgPSBuZXcgQ29uY3VycmVudEhhc2hNYXBbbnVtU2VudGVuY2VzXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2VudGVuY2VzOyArK2kpIHsKKyAgICAgICAgY2FuZENvdW50W2ldID0gMDsKKyAgICAgICAgbGFzdFVzZWRJbmRleFtpXSA9IC0xOworICAgICAgICAvLyBzdWZmU3RhdHNfYXJyYXlbaV0uY2xlYXIoKTsKKyAgICAgICAgc3VmZlN0YXRzX2FycmF5W2ldID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPEludGVnZXIsIGludFtdPigpOworICAgICAgfQorCisgICAgICAvLyBpbml0TGFtYmRhWzBdIGlzIG5vdCB1c2VkIQorICAgICAgZG91YmxlW10gaW5pdGlhbExhbWJkYSA9IG5ldyBkb3VibGVbMSArIG51bVBhcmFtc107CisgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBudW1QYXJhbXM7ICsraSkKKyAgICAgICAgaW5pdGlhbExhbWJkYVtpXSA9IGxhbWJkYS5nZXQoaSk7CisKKyAgICAgIC8vIHRoZSAic2NvcmUiIGluIGluaXRpYWxTY29yZSByZWZlcnMgdG8gdGhhdAorICAgICAgLy8gYXNzaWduZWQgYnkgdGhlIGV2YWx1YXRpb24gbWV0cmljKQorCisgICAgICAvLyB5b3UgbWF5IGNvbnNpZGVyIGFsbCBjYW5kaWRhdGVzIGZyb20gaXRlciAxLCBvciBmcm9tIGl0ZXIgKGl0ZXJhdGlvbi1wcmV2SXRzKSB0byBjdXJyZW50CisgICAgICAvLyBpdGVyYXRpb24KKyAgICAgIGludCBmaXJzdEl0ID0gTWF0aC5tYXgoMSwgaXRlcmF0aW9uIC0gcHJldkl0cyk7CisgICAgICAvLyBpLmUuIG9ubHkgcHJvY2VzcyBjYW5kaWRhdGVzIGZyb20gdGhlIGN1cnJlbnQgaXRlcmF0aW9uIGFuZCBjYW5kaWRhdGVzCisgICAgICAvLyBmcm9tIHVwIHRvIHByZXZJdHMgcHJldmlvdXMgaXRlcmF0aW9ucy4KKyAgICAgIHByaW50bG4oIlJlYWRpbmcgY2FuZGlkYXRlIHRyYW5zbGF0aW9ucyBmcm9tIGl0ZXJhdGlvbnMgIiArIGZpcnN0SXQgKyAiLSIgKyBpdGVyYXRpb24sIDEpOworICAgICAgcHJpbnRsbigiKGFuZCBjb21wdXRpbmcgIiArIG1ldHJpY05hbWUKKyAgICAgICAgICArICIgc3VmZmljaWVudCBzdGF0aXN0aWNzIGZvciBwcmV2aW91c2x5IHVuc2VlbiBjYW5kaWRhdGVzKSIsIDEpOworICAgICAgcHJpbnQoIiAgUHJvZ3Jlc3M6ICIpOworCisgICAgICBpbnRbXSBuZXdDYW5kaWRhdGVzQWRkZWQgPSBuZXcgaW50WzEgKyBpdGVyYXRpb25dOworICAgICAgZm9yIChpbnQgaXQgPSAxOyBpdCA8PSBpdGVyYXRpb247ICsraXQpCisgICAgICAgIG5ld0NhbmRpZGF0ZXNBZGRlZFtpdF0gPSAwOworCisgICAgICB0cnkgeworICAgICAgICAvLyByZWFkIHRlbXAgZmlsZXMgZnJvbSBhbGwgcGFzdCBpdGVyYXRpb25zCisgICAgICAgIC8vIDMgdHlwZXMgb2YgdGVtcCBmaWxlczoKKyAgICAgICAgLy8gMS4gb3V0cHV0IGh5cG8gYXQgaXRlciBpCisgICAgICAgIC8vIDIuIGZlYXR1cmUgdmFsdWUgb2YgZWFjaCBoeXBvIGF0IGl0ZXIgaQorICAgICAgICAvLyAzLiBzdWZmIHN0YXRzIG9mIGVhY2ggaHlwbyBhdCBpdGVyIGkKKworICAgICAgICAvLyBlYWNoIGluRmlsZSBjb3JyZXNwb25kcyB0byB0aGUgb3V0cHV0IG9mIGFuIGl0ZXJhdGlvbgorICAgICAgICAvLyAoaW5kZXggMCBpcyBub3QgdXNlZDsgbm8gY29ycmVzcG9uZGluZyBpbmRleCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uKQorICAgICAgICBCdWZmZXJlZFJlYWRlcltdIGluRmlsZV9zZW50cyA9IG5ldyBCdWZmZXJlZFJlYWRlcltpdGVyYXRpb25dOworICAgICAgICBCdWZmZXJlZFJlYWRlcltdIGluRmlsZV9mZWF0cyA9IG5ldyBCdWZmZXJlZFJlYWRlcltpdGVyYXRpb25dOworICAgICAgICBCdWZmZXJlZFJlYWRlcltdIGluRmlsZV9zdGF0cyA9IG5ldyBCdWZmZXJlZFJlYWRlcltpdGVyYXRpb25dOworCisgICAgICAgIC8vIHRlbXAgZmlsZShhcnJheSkgZnJvbSBwcmV2aW91cyBpdGVyYXRpb25zCisgICAgICAgIGZvciAoaW50IGl0ID0gZmlyc3RJdDsgaXQgPCBpdGVyYXRpb247ICsraXQpIHsKKyAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbV9zZW50cywgaW5TdHJlYW1fZmVhdHMsIGluU3RyZWFtX3N0YXRzOworICAgICAgICAgIGlmIChjb21wcmVzc0ZpbGVzID09IDApIHsKKyAgICAgICAgICAgIGluU3RyZWFtX3NlbnRzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0bXBEaXJQcmVmaXggKyAidGVtcC5zZW50cy5pdCIgKyBpdCk7CisgICAgICAgICAgICBpblN0cmVhbV9mZWF0cyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRGlyUHJlZml4ICsgInRlbXAuZmVhdHMuaXQiICsgaXQpOworICAgICAgICAgICAgaW5TdHJlYW1fc3RhdHMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcERpclByZWZpeCArICJ0ZW1wLnN0YXRzLml0IiArIGl0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5TdHJlYW1fc2VudHMgPSBuZXcgR1pJUElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRGlyUHJlZml4ICsgInRlbXAuc2VudHMuaXQiCisgICAgICAgICAgICAgICAgKyBpdCArICIuZ3oiKSk7CisgICAgICAgICAgICBpblN0cmVhbV9mZWF0cyA9IG5ldyBHWklQSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSh0bXBEaXJQcmVmaXggKyAidGVtcC5mZWF0cy5pdCIKKyAgICAgICAgICAgICAgICArIGl0ICsgIi5neiIpKTsKKyAgICAgICAgICAgIGluU3RyZWFtX3N0YXRzID0gbmV3IEdaSVBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHRtcERpclByZWZpeCArICJ0ZW1wLnN0YXRzLml0IgorICAgICAgICAgICAgICAgICsgaXQgKyAiLmd6IikpOworICAgICAgICAgIH0KKworICAgICAgICAgIGluRmlsZV9zZW50c1tpdF0gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluU3RyZWFtX3NlbnRzLCAidXRmOCIpKTsKKyAgICAgICAgICBpbkZpbGVfZmVhdHNbaXRdID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpblN0cmVhbV9mZWF0cywgInV0ZjgiKSk7CisgICAgICAgICAgaW5GaWxlX3N0YXRzW2l0XSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5TdHJlYW1fc3RhdHMsICJ1dGY4IikpOworICAgICAgICB9CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5TdHJlYW1fc2VudHNDdXJySXQsIGluU3RyZWFtX2ZlYXRzQ3Vyckl0LCBpblN0cmVhbV9zdGF0c0N1cnJJdDsKKyAgICAgICAgLy8gdGVtcCBmaWxlIGZvciBjdXJyZW50IGl0ZXJhdGlvbiEKKyAgICAgICAgaWYgKGNvbXByZXNzRmlsZXMgPT0gMCkgeworICAgICAgICAgIGluU3RyZWFtX3NlbnRzQ3Vyckl0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0bXBEaXJQcmVmaXggKyAidGVtcC5zZW50cy5pdCIgKyBpdGVyYXRpb24pOworICAgICAgICAgIGluU3RyZWFtX2ZlYXRzQ3Vyckl0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0bXBEaXJQcmVmaXggKyAidGVtcC5mZWF0cy5pdCIgKyBpdGVyYXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluU3RyZWFtX3NlbnRzQ3Vyckl0ID0gbmV3IEdaSVBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHRtcERpclByZWZpeAorICAgICAgICAgICAgICArICJ0ZW1wLnNlbnRzLml0IiArIGl0ZXJhdGlvbiArICIuZ3oiKSk7CisgICAgICAgICAgaW5TdHJlYW1fZmVhdHNDdXJySXQgPSBuZXcgR1pJUElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRGlyUHJlZml4CisgICAgICAgICAgICAgICsgInRlbXAuZmVhdHMuaXQiICsgaXRlcmF0aW9uICsgIi5neiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluRmlsZV9zZW50c0N1cnJJdCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCisgICAgICAgICAgICBpblN0cmVhbV9zZW50c0N1cnJJdCwgInV0ZjgiKSk7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluRmlsZV9mZWF0c0N1cnJJdCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCisgICAgICAgICAgICBpblN0cmVhbV9mZWF0c0N1cnJJdCwgInV0ZjgiKSk7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5GaWxlX3N0YXRzQ3Vyckl0ID0gbnVsbDsgLy8gd2lsbCBvbmx5IGJlIHVzZWQgaWYgc3RhdHNDdXJySXRfZXhpc3RzIGJlbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHNldCB0byB0cnVlCisgICAgICAgIFByaW50V3JpdGVyIG91dEZpbGVfc3RhdHNDdXJySXQgPSBudWxsOyAvLyB3aWxsIG9ubHkgYmUgdXNlZCBpZiBzdGF0c0N1cnJJdF9leGlzdHMgYmVsb3cgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZQorCisgICAgICAgIC8vIGp1c3QgdG8gY2hlY2sgaWYgdGVtcC5zdGF0Lml0Lml0ZXJhdGlvbiBleGlzdHMKKyAgICAgICAgYm9vbGVhbiBzdGF0c0N1cnJJdF9leGlzdHMgPSBmYWxzZTsKKworICAgICAgICBpZiAoZmlsZUV4aXN0cyh0bXBEaXJQcmVmaXggKyAidGVtcC5zdGF0cy5pdCIgKyBpdGVyYXRpb24pKSB7CisgICAgICAgICAgaW5TdHJlYW1fc3RhdHNDdXJySXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcERpclByZWZpeCArICJ0ZW1wLnN0YXRzLml0IiArIGl0ZXJhdGlvbik7CisgICAgICAgICAgaW5GaWxlX3N0YXRzQ3Vyckl0ID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpblN0cmVhbV9zdGF0c0N1cnJJdCwKKyAgICAgICAgICAgICAgInV0ZjgiKSk7CisgICAgICAgICAgc3RhdHNDdXJySXRfZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICBjb3B5RmlsZSh0bXBEaXJQcmVmaXggKyAidGVtcC5zdGF0cy5pdCIgKyBpdGVyYXRpb24sIHRtcERpclByZWZpeCArICJ0ZW1wLnN0YXRzLml0IgorICAgICAgICAgICAgICArIGl0ZXJhdGlvbiArICIuY29weSIpOworICAgICAgICB9IGVsc2UgaWYgKGZpbGVFeGlzdHModG1wRGlyUHJlZml4ICsgInRlbXAuc3RhdHMuaXQiICsgaXRlcmF0aW9uICsgIi5neiIpKSB7CisgICAgICAgICAgaW5TdHJlYW1fc3RhdHNDdXJySXQgPSBuZXcgR1pJUElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRGlyUHJlZml4CisgICAgICAgICAgICAgICsgInRlbXAuc3RhdHMuaXQiICsgaXRlcmF0aW9uICsgIi5neiIpKTsKKyAgICAgICAgICBpbkZpbGVfc3RhdHNDdXJySXQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluU3RyZWFtX3N0YXRzQ3Vyckl0LAorICAgICAgICAgICAgICAidXRmOCIpKTsKKyAgICAgICAgICBzdGF0c0N1cnJJdF9leGlzdHMgPSB0cnVlOworICAgICAgICAgIGNvcHlGaWxlKHRtcERpclByZWZpeCArICJ0ZW1wLnN0YXRzLml0IiArIGl0ZXJhdGlvbiArICIuZ3oiLCB0bXBEaXJQcmVmaXgKKyAgICAgICAgICAgICAgKyAidGVtcC5zdGF0cy5pdCIgKyBpdGVyYXRpb24gKyAiLmNvcHkuZ3oiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXRGaWxlX3N0YXRzQ3Vyckl0ID0gbmV3IFByaW50V3JpdGVyKHRtcERpclByZWZpeCArICJ0ZW1wLnN0YXRzLml0IiArIGl0ZXJhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBvdXRwdXQgdGhlIDRedGggdGVtcCBmaWxlOiAqLnRlbXAuc3RhdHMubWVyZ2VkCisgICAgICAgIFByaW50V3JpdGVyIG91dEZpbGVfc3RhdHNNZXJnZWQgPSBuZXcgUHJpbnRXcml0ZXIodG1wRGlyUHJlZml4ICsgInRlbXAuc3RhdHMubWVyZ2VkIik7CisgICAgICAgIC8vIHdyaXRlIHN1ZmZpY2llbnQgc3RhdGlzdGljcyBmcm9tIGFsbCB0aGUgc2VudGVuY2VzCisgICAgICAgIC8vIGZyb20gdGhlIG91dHB1dCBmaWxlcyBpbnRvIGEgc2luZ2xlIGZpbGUKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0RmlsZV9zdGF0c01lcmdlZEtub3duID0gbmV3IFByaW50V3JpdGVyKHRtcERpclByZWZpeAorICAgICAgICAgICAgKyAidGVtcC5zdGF0cy5tZXJnZWRLbm93biIpOworICAgICAgICAvLyB3cml0ZSBzdWZmaWNpZW50IHN0YXRpc3RpY3MgZnJvbSBhbGwgdGhlIHNlbnRlbmNlcworICAgICAgICAvLyBmcm9tIHRoZSBvdXRwdXQgZmlsZXMgaW50byBhIHNpbmdsZSBmaWxlCisKKyAgICAgICAgLy8gb3V0cHV0IHRoZSA1XnRoIDZedGggdGVtcCBmaWxlLCBidXQgd2lsbCBiZSBkZWxldGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uCisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtX3Vua25vd25DYW5kcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcERpclByZWZpeAorICAgICAgICAgICAgKyAidGVtcC5jdXJySXQudW5rbm93bkNhbmRzIiwgZmFsc2UpOworICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0U3RyZWFtV3JpdGVyX3Vua25vd25DYW5kcyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisgICAgICAgICAgICBvdXRTdHJlYW1fdW5rbm93bkNhbmRzLCAidXRmOCIpOworICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXRGaWxlX3Vua25vd25DYW5kcyA9IG5ldyBCdWZmZXJlZFdyaXRlcihvdXRTdHJlYW1Xcml0ZXJfdW5rbm93bkNhbmRzKTsKKworICAgICAgICBQcmludFdyaXRlciBvdXRGaWxlX3Vua25vd25JbmRpY2VzID0gbmV3IFByaW50V3JpdGVyKHRtcERpclByZWZpeAorICAgICAgICAgICAgKyAidGVtcC5jdXJySXQudW5rbm93bkluZGljZXMiKTsKKworICAgICAgICBTdHJpbmcgc2VudHNfc3RyLCBmZWF0c19zdHIsIHN0YXRzX3N0cjsKKworICAgICAgICAvLyBCVUc6IHRoaXMgYXNzdW1lcyBhIGNhbmRpZGF0ZSBzdHJpbmcgY2Fubm90IGJlIHByb2R1Y2VkIGZvciB0d28KKyAgICAgICAgLy8gZGlmZmVyZW50IHNvdXJjZSBzZW50ZW5jZXMsIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSB0cnVlCisgICAgICAgIC8vIChJdCdzIG5vdCBhY3R1YWxseSBhIGJ1ZywgYnV0IG9ubHkgYmVjYXVzZSBleGlzdGluZ0NhbmRTdGF0cyBnZXRzCisgICAgICAgIC8vIGNsZWFyZWQgYmVmb3JlIG1vdmluZyB0byB0aGUgbmV4dCBzb3VyY2Ugc2VudGVuY2UuKQorICAgICAgICAvLyBGSVg6IHNob3VsZCBiZSBtYWRlIGFuIGFycmF5LCBpbmRleGVkIGJ5IGkKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZXhpc3RpbmdDYW5kU3RhdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgLy8gVkVSWSBJTVBPUlRBTlQ6CisgICAgICAgIC8vIEEgQ0FORElEQVRFIFggTUFZIEFQUEVBUkVEIElOIElURVIgMSwgSVRFUiAzCisgICAgICAgIC8vIEJVVCBJRiBUSEUgVVNFUiBTUEVDSUZJRUQgVE8gQ09OU0lERVIgSVRFUkFUSU9OUyBGUk9NIE9OTFkgSVRFUiAyLCBUSEVOCisgICAgICAgIC8vIFggSVMgTk9UIEEgIlJFUEVBVEVEIiBDQU5ESURBVEUgSU4gSVRFUiAzLiBUSEVSRUZPUkUgV0UgV0FOVCBUTyBLRUVQIFRIRQorICAgICAgICAvLyBTVUZGIFNUQVRTIEZPUiBFQUNIIENBTkRJREFURShUTyBTQVZFIENPTVBVVEFUSU9OIElOIFRIRSBGVVRVUkUpCisKKyAgICAgICAgLy8gU3RvcmVzIHByZWNhbGN1bGF0ZWQgc3VmZmljaWVudCBzdGF0aXN0aWNzIGZvciBjYW5kaWRhdGVzLCBpbiBjYXNlCisgICAgICAgIC8vIHRoZSBzYW1lIGNhbmRpZGF0ZSBpcyBzZWVuIGFnYWluLiAoU1Mgc3RvcmVkIGFzIGEgU3RyaW5nLikKKyAgICAgICAgLy8gUTogV2h5IGRvIHdlIGNhcmU/IElmIHdlIHNlZSB0aGUgc2FtZSBjYW5kaWRhdGUgYWdhaW4sIGFyZW4ndCB3ZSBnb2luZworICAgICAgICAvLyB0byBpZ25vcmUgaXQ/IFNvLCB3aHkgZG8gd2UgY2FyZSBhYm91dCB0aGUgU1Mgb2YgdGhpcyByZXBlYXQgY2FuZGlkYXRlPworICAgICAgICAvLyBBOiBBICJyZXBlYXQiIGNhbmRpZGF0ZSBtYXkgbm90IGJlIGEgcmVwZWF0IGNhbmRpZGF0ZSBpbiBsYXRlcgorICAgICAgICAvLyBpdGVyYXRpb25zIGlmIHRoZSB1c2VyIHNwZWNpZmllcyBhIHZhbHVlIGZvciBwcmV2TUVSVEl0ZXJhdGlvbnMKKyAgICAgICAgLy8gdGhhdCBjYXVzZXMgTUVSVCB0byBza2lwIGNhbmRpZGF0ZXMgZnJvbSBlYXJseSBpdGVyYXRpb25zLgorCisgICAgICAgIGRvdWJsZVtdIGN1cnJGZWF0VmFsID0gbmV3IGRvdWJsZVsxICsgbnVtUGFyYW1zXTsKKyAgICAgICAgU3RyaW5nW10gZmVhdFZhbF9zdHI7CisKKyAgICAgICAgaW50IHRvdGFsQ2FuZGlkYXRlQ291bnQgPSAwOworCisgICAgICAgIC8vIG5ldyBjYW5kaWRhdGUgc2l6ZSBmb3IgZWFjaCBzZW50ZW5jZQorICAgICAgICBpbnRbXSBzaXplVW5rbm93bl9jdXJySXQgPSBuZXcgaW50W251bVNlbnRlbmNlc107CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TZW50ZW5jZXM7ICsraSkgeworICAgICAgICAgIC8vIHByb2Nlc3MgY2FuZGlkYXRlcyBmcm9tIHByZXZpb3VzIGl0ZXJhdGlvbnMKKyAgICAgICAgICAvLyBsb3cgZWZmaWNpZW5jeT8gZm9yIGVhY2ggaXRlcmF0aW9uLCBpdCByZWFkcyBpbiBhbGwgcHJldmlvdXMgaXRlcmF0aW9uIG91dHB1dHMKKyAgICAgICAgICAvLyB0aGVyZWZvcmUgYSBsb3Qgb2Ygb3ZlcmxhcHBpbmcgam9icworICAgICAgICAgIC8vIHRoaXMgaXMgYW4gZWFzeSBpbXBsZW1lbnRhdGlvbiB0byBkZWFsIHdpdGggdGhlIHNpdHVhdGlvbiBpbiB3aGljaCB1c2VyIG9ubHkgc3BlY2lmaWVkCisgICAgICAgICAgLy8gInByZXZpdCIgYW5kIGhvcGVzIHRvIGNvbnNpZGVyIG9ubHkgdGhlIHByZXZpb3VzIHByZXZpdAorICAgICAgICAgIC8vIGl0ZXJhdGlvbnMsIHRoZW4gZm9yIGVhY2ggaXRlcmF0aW9uIHRoZSBleGlzdGluZyBjYW5kYWRpdGVzIHdpbGwgYmUgZGlmZmVyZW50CisgICAgICAgICAgZm9yIChpbnQgaXQgPSBmaXJzdEl0OyBpdCA8IGl0ZXJhdGlvbjsgKytpdCkgeworICAgICAgICAgICAgLy8gV2h5IHVwIHRvIGJ1dCAqZXhjbHVkaW5nKiBpdGVyYXRpb24/CisgICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBsYXN0IGl0ZXJhdGlvbiBpcyBoYW5kbGVkIGEgbGl0dGxlIGRpZmZlcmVudGx5LCBzaW5jZQorICAgICAgICAgICAgLy8gdGhlIFNTIG11c3QgYmUgY2FsY3VsYXRlZCAoYW5kIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgY3JlYXRlZCksCisgICAgICAgICAgICAvLyB3aGljaCBpcyBub3QgdHJ1ZSBmb3IgcHJldmlvdXMgaXRlcmF0aW9ucy4KKworICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPD0gc2l6ZU9mTkJlc3Q7ICsrbikgeworICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgaW4gYWxsIHRlbXAgZmlsZXMsICJ8fHx8fHwiIGlzIGEgc2VwYXJhdG9yIGJldHdlZW4gMiBuLWJlc3QgbGlzdHMKKworICAgICAgICAgICAgICAvLyBXaHkgdXAgdG8gYW5kICppbmNsdWRpbmcqIHNpemVPZk5CZXN0PworICAgICAgICAgICAgICAvLyBTbyB0aGF0IGl0IHdvdWxkIHJlYWQgdGhlICJ8fHx8fHwiIHNlcGFyYXRvciBldmVuIGlmIHRoZXJlIGlzCisgICAgICAgICAgICAgIC8vIGEgY29tcGxldGUgbGlzdCBvZiBzaXplT2ZOQmVzdCBjYW5kaWRhdGVzLgorCisgICAgICAgICAgICAgIC8vIGZvciB0aGUgbnRoIGNhbmRpZGF0ZSBmb3IgdGhlIGl0aCBzZW50ZW5jZSwgcmVhZCB0aGUgc2VudGVuY2UsIGZlYXR1cmUgdmFsdWVzLAorICAgICAgICAgICAgICAvLyBhbmQgc3VmZmljaWVudCBzdGF0aXN0aWNzIGZyb20gdGhlIHZhcmlvdXMgdGVtcCBmaWxlcworCisgICAgICAgICAgICAgIC8vIHJlYWQgb25lIGxpbmUgb2YgdGVtcC5zZW50LCB0ZW1wLmZlYXQsIHRlbXAuc3RhdHMgZnJvbSBpdGVyYXRpb24gaXQKKyAgICAgICAgICAgICAgc2VudHNfc3RyID0gaW5GaWxlX3NlbnRzW2l0XS5yZWFkTGluZSgpOworICAgICAgICAgICAgICBmZWF0c19zdHIgPSBpbkZpbGVfZmVhdHNbaXRdLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgIHN0YXRzX3N0ciA9IGluRmlsZV9zdGF0c1tpdF0ucmVhZExpbmUoKTsKKworICAgICAgICAgICAgICBpZiAoc2VudHNfc3RyLmVxdWFscygifHx8fHx8IikpIHsKKyAgICAgICAgICAgICAgICBuID0gc2l6ZU9mTkJlc3QgKyAxOyAvLyBtb3ZlIG9uIHRvIHRoZSBuZXh0IG4tYmVzdCBsaXN0CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nQ2FuZFN0YXRzLmNvbnRhaW5zS2V5KHNlbnRzX3N0cikpIC8vIGlmIHRoaXMgY2FuZGlkYXRlIGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRGaWxlX3N0YXRzTWVyZ2VkS25vd24ucHJpbnRsbihzdGF0c19zdHIpOworCisgICAgICAgICAgICAgICAgLy8gc2F2ZSBmZWF0cyAmIHN0YXRzCisgICAgICAgICAgICAgICAgZmVhdF9oYXNoW2ldLnB1dChzZW50c19zdHIsIGZlYXRzX3N0cik7CisgICAgICAgICAgICAgICAgc3RhdHNfaGFzaFtpXS5wdXQoc2VudHNfc3RyLCBzdGF0c19zdHIpOworCisgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBmZWF0dXJlIHZhbHVlCisgICAgICAgICAgICAgICAgZmVhdFZhbF9zdHIgPSBmZWF0c19zdHIuc3BsaXQoIlxccysiKTsKKworICAgICAgICAgICAgICAgIGlmIChmZWF0c19zdHIuaW5kZXhPZignPScpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmZWF0dXJlUGFpciA6IGZlYXRWYWxfc3RyKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhaXIgPSBmZWF0dXJlUGFpci5zcGxpdCgiPSIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhaXJbMF07CisgICAgICAgICAgICAgICAgICAgIERvdWJsZSB2YWx1ZSA9IERvdWJsZS5wYXJzZURvdWJsZShwYWlyWzFdKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXhpc3RpbmdDYW5kU3RhdHMucHV0KHNlbnRzX3N0ciwgc3RhdHNfc3RyKTsKKyAgICAgICAgICAgICAgICBjYW5kQ291bnRbaV0gKz0gMTsKKyAgICAgICAgICAgICAgICBuZXdDYW5kaWRhdGVzQWRkZWRbaXRdICs9IDE7CisKKyAgICAgICAgICAgICAgfSAvLyBpZiB1bnNlZW4gY2FuZGlkYXRlCisgICAgICAgICAgICB9IC8vIGZvciAobikKKyAgICAgICAgICB9IC8vIGZvciAoaXQpCisKKyAgICAgICAgICBvdXRGaWxlX3N0YXRzTWVyZ2VkS25vd24ucHJpbnRsbigifHx8fHx8Iik7CisKKyAgICAgICAgICAvLyAtLS0tLS0tLS0tIGVuZCBvZiBwcm9jZXNzaW5nIHByZXZpb3VzIGl0ZXJhdGlvbnMgLS0tLS0tLS0tLQorICAgICAgICAgIC8vIC0tLS0tLS0tLS0gbm93IHN0YXJ0IHByb2Nlc3NpbmcgbmV3IGNhbmRpZGF0ZXMgLS0tLS0tLS0tLQorCisgICAgICAgICAgLy8gbm93IHByb2Nlc3MgdGhlIGNhbmRpZGF0ZXMgb2YgdGhlIGN1cnJlbnQgaXRlcmF0aW9uCisgICAgICAgICAgLy8gbm93IGRldGVybWluZSB0aGUgbmV3IGNhbmRpZGF0ZXMgb2YgdGhlIGN1cnJlbnQgaXRlcmF0aW9uCisKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIHJlbWVtYmVyOiBCdWZmZXJlZFJlYWRlciBpbkZpbGVfc2VudHNDdXJySXQgQnVmZmVyZWRSZWFkZXIgaW5GaWxlX2ZlYXRzQ3Vyckl0CisgICAgICAgICAgICogUHJpbnRXcml0ZXIgb3V0RmlsZV9zdGF0c0N1cnJJdAorICAgICAgICAgICAqLworCisgICAgICAgICAgU3RyaW5nW10gc2VudHNDdXJySXRfY3VyclNyY1NlbnQgPSBuZXcgU3RyaW5nW3NpemVPZk5CZXN0ICsgMV07CisKKyAgICAgICAgICBWZWN0b3I8U3RyaW5nPiB1bmtub3duQ2FuZHNfViA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICAgIC8vIHdoaWNoIGNhbmRpZGF0ZXMgKG9mIHRoZSBpJ3RoIHNvdXJjZSBzZW50ZW5jZSkgaGF2ZSBub3QgYmVlbiBzZWVuIGJlZm9yZQorICAgICAgICAgIC8vIHRoaXMgaXRlcmF0aW9uPworCisgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPD0gc2l6ZU9mTkJlc3Q7ICsrbikgeworICAgICAgICAgICAgLy8gV2h5IHVwIHRvIGFuZCAqaW5jbHVkaW5nKiBzaXplT2ZOQmVzdD8KKyAgICAgICAgICAgIC8vIFNvIHRoYXQgaXQgd291bGQgcmVhZCB0aGUgInx8fHx8fCIgc2VwYXJhdG9yIGV2ZW4gaWYgdGhlcmUgaXMKKyAgICAgICAgICAgIC8vIGEgY29tcGxldGUgbGlzdCBvZiBzaXplT2ZOQmVzdCBjYW5kaWRhdGVzLgorCisgICAgICAgICAgICAvLyBmb3IgdGhlIG50aCBjYW5kaWRhdGUgZm9yIHRoZSBpdGggc2VudGVuY2UsIHJlYWQgdGhlIHNlbnRlbmNlLAorICAgICAgICAgICAgLy8gYW5kIHN0b3JlIGl0IGluIHRoZSBzZW50c0N1cnJJdF9jdXJyU3JjU2VudCBhcnJheQorCisgICAgICAgICAgICBzZW50c19zdHIgPSBpbkZpbGVfc2VudHNDdXJySXQucmVhZExpbmUoKTsgLy8gcmVhZCBvbmUgY2FuZGlkYXRlIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24KKyAgICAgICAgICAgIHNlbnRzQ3Vyckl0X2N1cnJTcmNTZW50W25dID0gc2VudHNfc3RyOyAvLyBOb3RlOiBwb3NzaWJseSAifHx8fHx8IgorCisgICAgICAgICAgICBpZiAoc2VudHNfc3RyLmVxdWFscygifHx8fHx8IikpIHsKKyAgICAgICAgICAgICAgbiA9IHNpemVPZk5CZXN0ICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nQ2FuZFN0YXRzLmNvbnRhaW5zS2V5KHNlbnRzX3N0cikpIHsKKyAgICAgICAgICAgICAgdW5rbm93bkNhbmRzX1YuYWRkKHNlbnRzX3N0cik7IC8vIE5FVyBDQU5ESURBVEUgRlJPTSBUSElTIElURVJBVElPTgorICAgICAgICAgICAgICB3cml0ZUxpbmUoc2VudHNfc3RyLCBvdXRGaWxlX3Vua25vd25DYW5kcyk7CisgICAgICAgICAgICAgIG91dEZpbGVfdW5rbm93bkluZGljZXMucHJpbnRsbihpKTsgLy8gSU5ERVggT0YgVEhFIE5FVyBDQU5ESURBVEVTCisgICAgICAgICAgICAgIG5ld0NhbmRpZGF0ZXNBZGRlZFtpdGVyYXRpb25dICs9IDE7CisgICAgICAgICAgICAgIGV4aXN0aW5nQ2FuZFN0YXRzLnB1dChzZW50c19zdHIsICJVIik7IC8vIGkuZS4gdW5rbm93bgorICAgICAgICAgICAgICAvLyB3ZSBhZGQgc2VudHNfc3RyIHRvIGF2b2lkIGR1cGxpY2F0ZSBlbnRyaWVzIGluIHVua25vd25DYW5kc19WCisgICAgICAgICAgICB9CisgICAgICAgICAgfSAvLyBmb3IgKG4pCisKKyAgICAgICAgICAvLyBvbmx5IGNvbXB1dGUgc3VmZiBzdGF0cyBmb3IgbmV3IGNhbmRpZGF0ZXMKKyAgICAgICAgICAvLyBub3cgdW5rbm93bkNhbmRzX1YgaGFzIHRoZSBjYW5kaWRhdGVzIGZvciB3aGljaCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZQorICAgICAgICAgIC8vIHN1ZmZpY2llbnQgc3RhdGlzdGljcyAoZm9yIHRoZSBpJ3RoIHNvdXJjZSBzZW50ZW5jZSkKKyAgICAgICAgICBpbnQgc2l6ZVVua25vd24gPSB1bmtub3duQ2FuZHNfVi5zaXplKCk7CisgICAgICAgICAgc2l6ZVVua25vd25fY3Vyckl0W2ldID0gc2l6ZVVua25vd247CisKKyAgICAgICAgICBleGlzdGluZ0NhbmRTdGF0cy5jbGVhcigpOworCisgICAgICAgIH0gLy8gZm9yIChpKSBlYWNoIHNlbnRlbmNlCisKKyAgICAgICAgLy8gLS0tLS0tLS0tLSBlbmQgb2YgbWVyZ2luZyBjYW5kaWRhdGVzIHN0YXRzIGZyb20gcHJldmlvdXMgaXRlcmF0aW9ucworICAgICAgICAvLyBhbmQgZmluZGluZyBuZXcgY2FuZGlkYXRlcyAtLS0tLS0tLS0tLS0KKworICAgICAgICAvKgorICAgICAgICAgKiBpbnRbXVtdIG5ld1N1ZmZTdGF0cyA9IG51bGw7IGlmICghc3RhdHNDdXJySXRfZXhpc3RzICYmIHNpemVVbmtub3duID4gMCkgeyBuZXdTdWZmU3RhdHMgPQorICAgICAgICAgKiBldmFsTWV0cmljLnN1ZmZTdGF0cyh1bmtub3duQ2FuZHMsIGluZGljZXMpOyB9CisgICAgICAgICAqLworCisgICAgICAgIG91dEZpbGVfc3RhdHNNZXJnZWRLbm93bi5jbG9zZSgpOworICAgICAgICBvdXRGaWxlX3Vua25vd25DYW5kcy5jbG9zZSgpOworICAgICAgICBvdXRGaWxlX3Vua25vd25JbmRpY2VzLmNsb3NlKCk7CisKKyAgICAgICAgLy8gd2FudCB0byByZS1vcGVuIGFsbCB0ZW1wIGZpbGVzIGFuZCBzdGFydCBmcm9tIHNjcmF0Y2ggYWdhaW4/CisgICAgICAgIGZvciAoaW50IGl0ID0gZmlyc3RJdDsgaXQgPCBpdGVyYXRpb247ICsraXQpIC8vIHByZXZpb3VzIGl0ZXJhdGlvbnMgdGVtcCBmaWxlcworICAgICAgICB7CisgICAgICAgICAgaW5GaWxlX3NlbnRzW2l0XS5jbG9zZSgpOworICAgICAgICAgIGluRmlsZV9zdGF0c1tpdF0uY2xvc2UoKTsKKworICAgICAgICAgIElucHV0U3RyZWFtIGluU3RyZWFtX3NlbnRzLCBpblN0cmVhbV9zdGF0czsKKyAgICAgICAgICBpZiAoY29tcHJlc3NGaWxlcyA9PSAwKSB7CisgICAgICAgICAgICBpblN0cmVhbV9zZW50cyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRGlyUHJlZml4ICsgInRlbXAuc2VudHMuaXQiICsgaXQpOworICAgICAgICAgICAgaW5TdHJlYW1fc3RhdHMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcERpclByZWZpeCArICJ0ZW1wLnN0YXRzLml0IiArIGl0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5TdHJlYW1fc2VudHMgPSBuZXcgR1pJUElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRGlyUHJlZml4ICsgInRlbXAuc2VudHMuaXQiCisgICAgICAgICAgICAgICAgKyBpdCArICIuZ3oiKSk7CisgICAgICAgICAgICBpblN0cmVhbV9zdGF0cyA9IG5ldyBHWklQSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSh0bXBEaXJQcmVmaXggKyAidGVtcC5zdGF0cy5pdCIKKyAgICAgICAgICAgICAgICArIGl0ICsgIi5neiIpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbkZpbGVfc2VudHNbaXRdID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpblN0cmVhbV9zZW50cywgInV0ZjgiKSk7CisgICAgICAgICAgaW5GaWxlX3N0YXRzW2l0XSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5TdHJlYW1fc3RhdHMsICJ1dGY4IikpOworICAgICAgICB9CisKKyAgICAgICAgaW5GaWxlX3NlbnRzQ3Vyckl0LmNsb3NlKCk7CisgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uIHRlbXAgZmlsZXMKKyAgICAgICAgaWYgKGNvbXByZXNzRmlsZXMgPT0gMCkgeworICAgICAgICAgIGluU3RyZWFtX3NlbnRzQ3Vyckl0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0bXBEaXJQcmVmaXggKyAidGVtcC5zZW50cy5pdCIgKyBpdGVyYXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluU3RyZWFtX3NlbnRzQ3Vyckl0ID0gbmV3IEdaSVBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHRtcERpclByZWZpeAorICAgICAgICAgICAgICArICJ0ZW1wLnNlbnRzLml0IiArIGl0ZXJhdGlvbiArICIuZ3oiKSk7CisgICAgICAgIH0KKyAgICAgICAgaW5GaWxlX3NlbnRzQ3Vyckl0ID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpblN0cmVhbV9zZW50c0N1cnJJdCwgInV0ZjgiKSk7CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIFNTIGZvciB1bnNlZW4gY2FuZGlkYXRlcyBhbmQgd3JpdGUgdGhlbSB0byBmaWxlCisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbV9zdGF0c0N1cnJJdF91bmtub3duID0gbnVsbDsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5GaWxlX3N0YXRzQ3Vyckl0X3Vua25vd24gPSBudWxsOworCisgICAgICAgIGlmICghc3RhdHNDdXJySXRfZXhpc3RzICYmIG5ld0NhbmRpZGF0ZXNBZGRlZFtpdGVyYXRpb25dID4gMCkgeworICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsZS4uLgorICAgICAgICAgIGV2YWxNZXRyaWMuY3JlYXRlU3VmZlN0YXRzRmlsZSh0bXBEaXJQcmVmaXggKyAidGVtcC5jdXJySXQudW5rbm93bkNhbmRzIiwgdG1wRGlyUHJlZml4CisgICAgICAgICAgICAgICsgInRlbXAuY3Vyckl0LnVua25vd25JbmRpY2VzIiwgdG1wRGlyUHJlZml4ICsgInRlbXAuc3RhdHMudW5rbm93biIsIHNpemVPZk5CZXN0KTsKKworICAgICAgICAgIC8vIC4uLmFuZCBvcGVuIGl0CisgICAgICAgICAgaW5TdHJlYW1fc3RhdHNDdXJySXRfdW5rbm93biA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRGlyUHJlZml4ICsgInRlbXAuc3RhdHMudW5rbm93biIpOworICAgICAgICAgIGluRmlsZV9zdGF0c0N1cnJJdF91bmtub3duID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgICAgaW5TdHJlYW1fc3RhdHNDdXJySXRfdW5rbm93biwgInV0ZjgiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcGVuIG1lcmdlZEtub3duIGZpbGUKKyAgICAgICAgLy8gbmV3bHkgY3JlYXRlZCBieSB0aGUgYmlnIGxvb3AgYWJvdmUKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluc3RyZWFtX3N0YXRzTWVyZ2VkS25vd24gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcERpclByZWZpeAorICAgICAgICAgICAgKyAidGVtcC5zdGF0cy5tZXJnZWRLbm93biIpOworICAgICAgICBCdWZmZXJlZFJlYWRlciBpbkZpbGVfc3RhdHNNZXJnZWRLbm93biA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCisgICAgICAgICAgICBpbnN0cmVhbV9zdGF0c01lcmdlZEtub3duLCAidXRmOCIpKTsKKworICAgICAgICAvLyBudW0gb2YgZmVhdHVyZXMgYmVmb3JlIG9ic2VydmluZyBuZXcgZmlyaW5nIGZlYXR1cmVzIGZyb20gdGhpcyBpdGVyYXRpb24KKyAgICAgICAgbnVtUGFyYW1zT2xkID0gbnVtUGFyYW1zOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2VudGVuY2VzOyArK2kpIHsKKyAgICAgICAgICAvLyByZXByb2Nlc3MgY2FuZGlkYXRlcyBmcm9tIHByZXZpb3VzIGl0ZXJhdGlvbnMKKyAgICAgICAgICBmb3IgKGludCBpdCA9IGZpcnN0SXQ7IGl0IDwgaXRlcmF0aW9uOyArK2l0KSB7CisgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8PSBzaXplT2ZOQmVzdDsgKytuKSB7CisgICAgICAgICAgICAgIHNlbnRzX3N0ciA9IGluRmlsZV9zZW50c1tpdF0ucmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgc3RhdHNfc3RyID0gaW5GaWxlX3N0YXRzW2l0XS5yZWFkTGluZSgpOworCisgICAgICAgICAgICAgIGlmIChzZW50c19zdHIuZXF1YWxzKCJ8fHx8fHwiKSkgeworICAgICAgICAgICAgICAgIG4gPSBzaXplT2ZOQmVzdCArIDE7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nQ2FuZFN0YXRzLmNvbnRhaW5zS2V5KHNlbnRzX3N0cikpIHsKKyAgICAgICAgICAgICAgICBleGlzdGluZ0NhbmRTdGF0cy5wdXQoc2VudHNfc3RyLCBzdGF0c19zdHIpOworICAgICAgICAgICAgICB9IC8vIGlmIHVuc2VlbiBjYW5kaWRhdGUKKyAgICAgICAgICAgIH0gLy8gZm9yIChuKQorICAgICAgICAgIH0gLy8gZm9yIChpdCkKKworICAgICAgICAgIC8vIGNvcHkgcmVsZXZhbnQgcG9ydGlvbiBmcm9tIG1lcmdlZEtub3duIHRvIHRoZSBtZXJnZWQgZmlsZQorICAgICAgICAgIFN0cmluZyBsaW5lX21lcmdlZEtub3duID0gaW5GaWxlX3N0YXRzTWVyZ2VkS25vd24ucmVhZExpbmUoKTsKKyAgICAgICAgICB3aGlsZSAoIWxpbmVfbWVyZ2VkS25vd24uZXF1YWxzKCJ8fHx8fHwiKSkgeworICAgICAgICAgICAgb3V0RmlsZV9zdGF0c01lcmdlZC5wcmludGxuKGxpbmVfbWVyZ2VkS25vd24pOworICAgICAgICAgICAgbGluZV9tZXJnZWRLbm93biA9IGluRmlsZV9zdGF0c01lcmdlZEtub3duLnJlYWRMaW5lKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW50W10gc3RhdHMgPSBuZXcgaW50W3N1ZmZTdGF0c0NvdW50XTsKKworICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDw9IHNpemVPZk5CZXN0OyArK24pIHsKKyAgICAgICAgICAgIHNlbnRzX3N0ciA9IGluRmlsZV9zZW50c0N1cnJJdC5yZWFkTGluZSgpOworICAgICAgICAgICAgZmVhdHNfc3RyID0gaW5GaWxlX2ZlYXRzQ3Vyckl0LnJlYWRMaW5lKCk7CisKKyAgICAgICAgICAgIGlmIChzZW50c19zdHIuZXF1YWxzKCJ8fHx8fHwiKSkgeworICAgICAgICAgICAgICBuID0gc2l6ZU9mTkJlc3QgKyAxOworICAgICAgICAgICAgfSBlbHNlIGlmICghZXhpc3RpbmdDYW5kU3RhdHMuY29udGFpbnNLZXkoc2VudHNfc3RyKSkgeworCisgICAgICAgICAgICAgIGlmICghc3RhdHNDdXJySXRfZXhpc3RzKSB7CisgICAgICAgICAgICAgICAgc3RhdHNfc3RyID0gaW5GaWxlX3N0YXRzQ3Vyckl0X3Vua25vd24ucmVhZExpbmUoKTsKKworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRlbXBfc3RhdHMgPSBzdGF0c19zdHIuc3BsaXQoIlxccysiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBzID0gMDsgcyA8IHN1ZmZTdGF0c0NvdW50OyArK3MpIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRzW3NdID0gSW50ZWdlci5wYXJzZUludCh0ZW1wX3N0YXRzW3NdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvdXRGaWxlX3N0YXRzQ3Vyckl0LnByaW50bG4oc3RhdHNfc3RyKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0c19zdHIgPSBpbkZpbGVfc3RhdHNDdXJySXQucmVhZExpbmUoKTsKKworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRlbXBfc3RhdHMgPSBzdGF0c19zdHIuc3BsaXQoIlxccysiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBzID0gMDsgcyA8IHN1ZmZTdGF0c0NvdW50OyArK3MpIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRzW3NdID0gSW50ZWdlci5wYXJzZUludCh0ZW1wX3N0YXRzW3NdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBvdXRGaWxlX3N0YXRzTWVyZ2VkLnByaW50bG4oc3RhdHNfc3RyKTsKKworICAgICAgICAgICAgICAvLyBzYXZlIGZlYXRzICYgc3RhdHMKKyAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKHNlbnRzX3N0cisiICIrZmVhdHNfc3RyKTsKKworICAgICAgICAgICAgICBmZWF0X2hhc2hbaV0ucHV0KHNlbnRzX3N0ciwgZmVhdHNfc3RyKTsKKyAgICAgICAgICAgICAgc3RhdHNfaGFzaFtpXS5wdXQoc2VudHNfc3RyLCBzdGF0c19zdHIpOworCisgICAgICAgICAgICAgIGZlYXRWYWxfc3RyID0gZmVhdHNfc3RyLnNwbGl0KCJcXHMrIik7CisKKyAgICAgICAgICAgICAgaWYgKGZlYXRzX3N0ci5pbmRleE9mKCc9JykgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmZWF0dXJlUGFpciA6IGZlYXRWYWxfc3RyKSB7CisgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYWlyID0gZmVhdHVyZVBhaXIuc3BsaXQoIj0iKTsKKyAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFpclswXTsKKyAgICAgICAgICAgICAgICAgIERvdWJsZSB2YWx1ZSA9IERvdWJsZS5wYXJzZURvdWJsZShwYWlyWzFdKTsKKyAgICAgICAgICAgICAgICAgIGludCBmZWF0SWQgPSBWb2NhYnVsYXJ5LmlkKG5hbWUpOworCisgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGlkZW50aWZ5IG5ld2x5IGZpcmVkIGZlYXRzIGhlcmUKKyAgICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSBjdXJyRmVhdFZhbCBpcyBub3QgZ2l2ZW4gdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgbmV3IGZlYXQsIHNpbmNlIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodCBpcworICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYXMgemVybyBhbnl3YXkKKyAgICAgICAgICAgICAgICAgIGlmIChmZWF0SWQgPiBudW1QYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKytudW1QYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIGxhbWJkYS5hZGQobmV3IERvdWJsZSgwKSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGV4aXN0aW5nQ2FuZFN0YXRzLnB1dChzZW50c19zdHIsIHN0YXRzX3N0cik7CisgICAgICAgICAgICAgIGNhbmRDb3VudFtpXSArPSAxOworCisgICAgICAgICAgICAgIC8vIG5ld0NhbmRpZGF0ZXNBZGRlZFtpdGVyYXRpb25dICs9IDE7CisgICAgICAgICAgICAgIC8vIG1vdmVkIHRvIGNvZGUgYWJvdmUgZGV0ZWN0aW5nIG5ldyBjYW5kaWRhdGVzCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoc3RhdHNDdXJySXRfZXhpc3RzKQorICAgICAgICAgICAgICAgIGluRmlsZV9zdGF0c0N1cnJJdC5yZWFkTGluZSgpOworICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB3cml0ZSBTUyB0byBvdXRGaWxlX3N0YXRzQ3Vyckl0CisgICAgICAgICAgICAgICAgc3RhdHNfc3RyID0gZXhpc3RpbmdDYW5kU3RhdHMuZ2V0KHNlbnRzX3N0cik7CisgICAgICAgICAgICAgICAgb3V0RmlsZV9zdGF0c0N1cnJJdC5wcmludGxuKHN0YXRzX3N0cik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIH0gLy8gZm9yIChuKQorCisgICAgICAgICAgLy8gbm93IGQgPSBzaXplVW5rbm93bl9jdXJySXRbaV0gLSAxCisKKyAgICAgICAgICBpZiAoc3RhdHNDdXJySXRfZXhpc3RzKQorICAgICAgICAgICAgaW5GaWxlX3N0YXRzQ3Vyckl0LnJlYWRMaW5lKCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0RmlsZV9zdGF0c0N1cnJJdC5wcmludGxuKCJ8fHx8fHwiKTsKKworICAgICAgICAgIGV4aXN0aW5nQ2FuZFN0YXRzLmNsZWFyKCk7CisgICAgICAgICAgdG90YWxDYW5kaWRhdGVDb3VudCArPSBjYW5kQ291bnRbaV07CisKKyAgICAgICAgICAvLyBvdXRwdXQgc2VudGVuY2UgcHJvZ3Jlc3MKKyAgICAgICAgICBpZiAoKGkgKyAxKSAlIDUwMCA9PSAwKSB7CisgICAgICAgICAgICBwcmludCgoaSArIDEpICsgIlxuIiArICIgICAgICAgICAgICAiLCAxKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKChpICsgMSkgJSAxMDAgPT0gMCkgeworICAgICAgICAgICAgcHJpbnQoIisiLCAxKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKChpICsgMSkgJSAyNSA9PSAwKSB7CisgICAgICAgICAgICBwcmludCgiLiIsIDEpOworICAgICAgICAgIH0KKworICAgICAgICB9IC8vIGZvciAoaSkKKworICAgICAgICBpbkZpbGVfc3RhdHNNZXJnZWRLbm93bi5jbG9zZSgpOworICAgICAgICBvdXRGaWxlX3N0YXRzTWVyZ2VkLmNsb3NlKCk7CisKKyAgICAgICAgLy8gZm9yIHRlc3RpbmcKKyAgICAgICAgLyoKKyAgICAgICAgICogaW50IHRvdGFsX3NlbnQgPSAwOyBmb3IoIGludCBpPTA7IGk8bnVtU2VudGVuY2VzOyBpKysgKSB7CisgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihmZWF0X2hhc2hbaV0uc2l6ZSgpKyIgIitjYW5kQ291bnRbaV0pOyB0b3RhbF9zZW50ICs9CisgICAgICAgICAqIGZlYXRfaGFzaFtpXS5zaXplKCk7IGZlYXRfaGFzaFtpXS5jbGVhcigpOyB9CisgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLXRvdGFsIHNlbnQ6ICIrdG90YWxfc2VudCk7IHRvdGFsX3NlbnQgPSAwOyBmb3IoIGludAorICAgICAgICAgKiBpPTA7IGk8bnVtU2VudGVuY2VzOyBpKysgKSB7IFN5c3RlbS5vdXQucHJpbnRsbihzdGF0c19oYXNoW2ldLnNpemUoKSsiICIrY2FuZENvdW50W2ldKTsKKyAgICAgICAgICogdG90YWxfc2VudCArPSBzdGF0c19oYXNoW2ldLnNpemUoKTsgc3RhdHNfaGFzaFtpXS5jbGVhcigpOyB9CisgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKip0b3RhbCBzZW50OiAiK3RvdGFsX3NlbnQpOworICAgICAgICAgKi8KKworICAgICAgICBwcmludGxuKCIiLCAxKTsgLy8gZmluaXNoIHByb2dyZXNzIGxpbmUKKworICAgICAgICBmb3IgKGludCBpdCA9IGZpcnN0SXQ7IGl0IDwgaXRlcmF0aW9uOyArK2l0KSB7CisgICAgICAgICAgaW5GaWxlX3NlbnRzW2l0XS5jbG9zZSgpOworICAgICAgICAgIGluRmlsZV9mZWF0c1tpdF0uY2xvc2UoKTsKKyAgICAgICAgICBpbkZpbGVfc3RhdHNbaXRdLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBpbkZpbGVfc2VudHNDdXJySXQuY2xvc2UoKTsKKyAgICAgICAgaW5GaWxlX2ZlYXRzQ3Vyckl0LmNsb3NlKCk7CisgICAgICAgIGlmIChzdGF0c0N1cnJJdF9leGlzdHMpCisgICAgICAgICAgaW5GaWxlX3N0YXRzQ3Vyckl0LmNsb3NlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBvdXRGaWxlX3N0YXRzQ3Vyckl0LmNsb3NlKCk7CisKKyAgICAgICAgaWYgKGNvbXByZXNzRmlsZXMgPT0gMSAmJiAhc3RhdHNDdXJySXRfZXhpc3RzKSB7CisgICAgICAgICAgZ3ppcEZpbGUodG1wRGlyUHJlZml4ICsgInRlbXAuc3RhdHMuaXQiICsgaXRlcmF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNsZWFyIHRlbXAgZmlsZXMKKyAgICAgICAgZGVsZXRlRmlsZSh0bXBEaXJQcmVmaXggKyAidGVtcC5jdXJySXQudW5rbm93bkNhbmRzIik7CisgICAgICAgIGRlbGV0ZUZpbGUodG1wRGlyUHJlZml4ICsgInRlbXAuY3Vyckl0LnVua25vd25JbmRpY2VzIik7CisgICAgICAgIGRlbGV0ZUZpbGUodG1wRGlyUHJlZml4ICsgInRlbXAuc3RhdHMudW5rbm93biIpOworICAgICAgICBkZWxldGVGaWxlKHRtcERpclByZWZpeCArICJ0ZW1wLnN0YXRzLm1lcmdlZEtub3duIik7CisKKyAgICAgICAgLy8gY2xlYW51cE1lbW9yeSgpOworCisgICAgICAgIHByaW50bG4oIlByb2Nlc3NlZCAiICsgdG90YWxDYW5kaWRhdGVDb3VudCArICIgZGlzdGluY3QgY2FuZGlkYXRlcyAiICsgIihhYm91dCAiCisgICAgICAgICAgICArIHRvdGFsQ2FuZGlkYXRlQ291bnQgLyBudW1TZW50ZW5jZXMgKyAiIHBlciBzZW50ZW5jZSk6IiwgMSk7CisgICAgICAgIGZvciAoaW50IGl0ID0gZmlyc3RJdDsgaXQgPD0gaXRlcmF0aW9uOyArK2l0KSB7CisgICAgICAgICAgcHJpbnRsbigibmV3Q2FuZGlkYXRlc0FkZGVkW2l0PSIgKyBpdCArICJdID0gIiArIG5ld0NhbmRpZGF0ZXNBZGRlZFtpdF0gKyAiIChhYm91dCAiCisgICAgICAgICAgICAgICsgbmV3Q2FuZGlkYXRlc0FkZGVkW2l0XSAvIG51bVNlbnRlbmNlcyArICIgcGVyIHNlbnRlbmNlKSIsIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRsbigiIiwgMSk7CisKKyAgICAgICAgcHJpbnRsbigiTnVtYmVyIG9mIGZlYXR1cmVzIG9ic2VydmVkIHNvIGZhcjogIiArIG51bVBhcmFtcyk7CisgICAgICAgIHByaW50bG4oIiIsIDEpOworCisgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpbiBBZGFHcmFkQ29yZS5ydW5fc2luZ2xlX2l0ZXJhdGlvbig2KTogIgorICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIFN5c3RlbS5leGl0KDk5OTAxKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJT0V4Y2VwdGlvbiBpbiBBZGFHcmFkQ29yZS5ydW5fc2luZ2xlX2l0ZXJhdGlvbig2KTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoOTk5MDIpOworICAgICAgfQorCisgICAgICAvLyBuLWJlc3QgbGlzdCBjb252ZXJnZXMKKyAgICAgIGlmIChuZXdDYW5kaWRhdGVzQWRkZWRbaXRlcmF0aW9uXSA9PSAwKSB7CisgICAgICAgIGlmICghb25lTW9kaWZpY2F0aW9uUGVySXRlcmF0aW9uKSB7CisgICAgICAgICAgcHJpbnRsbigiTm8gbmV3IGNhbmRpZGF0ZXMgYWRkZWQgaW4gdGhpcyBpdGVyYXRpb247IGV4aXRpbmcgQWRhR3JhZC4iLCAxKTsKKyAgICAgICAgICBwcmludGxuKCIiLCAxKTsKKyAgICAgICAgICBwcmludGxuKCItLS0gIEFkYUdyYWQgaXRlcmF0aW9uICMiICsgaXRlcmF0aW9uICsgIiBlbmRpbmcgQCAiICsgKG5ldyBEYXRlKCkpICsgIiAgLS0tIiwgMSk7CisgICAgICAgICAgcHJpbnRsbigiIiwgMSk7CisgICAgICAgICAgZGVsZXRlRmlsZSh0bXBEaXJQcmVmaXggKyAidGVtcC5zdGF0cy5tZXJnZWQiKTsKKworICAgICAgICAgIGlmIChyZXR1cm5CZXN0KSB7CisgICAgICAgICAgICAvLyBub3RlIHRoYXQgYmVzdExhbWJkYS5zaXplKCkgPD0gbGFtYmRhLnNpemUoKQorICAgICAgICAgICAgZm9yIChpbnQgcCA9IDE7IHAgPCBiZXN0TGFtYmRhLnNpemUoKTsgKytwKQorICAgICAgICAgICAgICBsYW1iZGEuc2V0KHAsIGJlc3RMYW1iZGEuZ2V0KHApKTsKKyAgICAgICAgICAgIC8vIGFuZCBzZXQgdGhlIHJlc3Qgb2YgbGFtYmRhIHRvIGJlIDAKKyAgICAgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgbGFtYmRhLnNpemUoKSAtIGJlc3RMYW1iZGEuc2l6ZSgpOyArK3ApCisgICAgICAgICAgICAgIGxhbWJkYS5zZXQocCArIGJlc3RMYW1iZGEuc2l6ZSgpLCBuZXcgRG91YmxlKDApKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gdGhpcyBtZWFucyB0aGF0IHRoZSBvbGQgdmFsdWVzIHNob3VsZCBiZSBrZXB0IGJ5IHRoZSBjYWxsZXIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGxuKCJOb3RlOiBObyBuZXcgY2FuZGlkYXRlcyBhZGRlZCBpbiB0aGlzIGl0ZXJhdGlvbi4iLCAxKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioqKioqKioqKioqKiBzdGFydCBvcHRpbWl6YXRpb24gKioqKioqKioqKioqKiovCisKKyAgICAgIC8qCisgICAgICAgKiBmb3IoIGludCB2PTE7IHY8aW5pdGlhbExhbWJkYVsxXS5sZW5ndGg7IHYrKyApIFN5c3RlbS5vdXQucHJpbnQoaW5pdGlhbExhbWJkYVsxXVt2XSsiICIpOworICAgICAgICogU3lzdGVtLmV4aXQoMCk7CisgICAgICAgKi8KKworICAgICAgT3B0aW1pemVyLnNlbnROdW0gPSBudW1TZW50ZW5jZXM7IC8vIHRvdGFsIG51bWJlciBvZiB0cmFpbmluZyBzZW50ZW5jZXMKKyAgICAgIE9wdGltaXplci5uZWVkU2h1ZmZsZSA9IG5lZWRTaHVmZmxlOworICAgICAgT3B0aW1pemVyLmFkYWdyYWRJdGVyID0gYWRhZ3JhZEl0ZXI7CisgICAgICBPcHRpbWl6ZXIub3JhU2VsZWN0TW9kZSA9IG9yYVNlbGVjdE1vZGU7CisgICAgICBPcHRpbWl6ZXIucHJlZFNlbGVjdE1vZGUgPSBwcmVkU2VsZWN0TW9kZTsKKyAgICAgIE9wdGltaXplci5uZWVkQXZnID0gbmVlZEF2ZzsKKyAgICAgIC8vIE9wdGltaXplci5zZW50Rm9yU2NhbGUgPSBzZW50Rm9yU2NhbGU7CisgICAgICBPcHRpbWl6ZXIuc2NvcmVSYXRpbyA9IHNjb3JlUmF0aW87CisgICAgICBPcHRpbWl6ZXIuZXZhbE1ldHJpYyA9IGV2YWxNZXRyaWM7CisgICAgICBPcHRpbWl6ZXIubm9ybWFsaXphdGlvbk9wdGlvbnMgPSBub3JtYWxpemF0aW9uT3B0aW9uczsKKyAgICAgIE9wdGltaXplci5uZWVkU2NhbGUgPSBuZWVkU2NhbGU7CisgICAgICBPcHRpbWl6ZXIucmVndWxhcml6YXRpb24gPSByZWd1bGFyaXphdGlvbjsKKyAgICAgIE9wdGltaXplci5iYXRjaFNpemUgPSBiYXRjaFNpemU7CisgICAgICBPcHRpbWl6ZXIuZXRhID0gZXRhOworICAgICAgT3B0aW1pemVyLmxhbSA9IGxhbTsKKworICAgICAgLy8gaWYgbmVlZCB0byB1c2UgYmxldSBzdGF0cyBoaXN0b3J5CisgICAgICBpZiAoaXRlcmF0aW9uID09IDEpIHsKKyAgICAgICAgaWYgKGV2YWxNZXRyaWMuZ2V0X21ldHJpY05hbWUoKS5lcXVhbHMoIkJMRVUiKSAmJiB1c2VQc2V1ZG9CbGV1KSB7CisgICAgICAgICAgT3B0aW1pemVyLmluaXRCbGV1SGlzdG9yeShudW1TZW50ZW5jZXMsIGV2YWxNZXRyaWMuZ2V0X3N1ZmZTdGF0c0NvdW50KCkpOworICAgICAgICAgIE9wdGltaXplci51c2VQc2V1ZG9CbGV1ID0gdXNlUHNldWRvQmxldTsKKyAgICAgICAgICBPcHRpbWl6ZXIuUiA9IFI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV2YWxNZXRyaWMuZ2V0X21ldHJpY05hbWUoKS5lcXVhbHMoIlRFUi1CTEVVIikgJiYgdXNlUHNldWRvQmxldSkgeworICAgICAgICAgIE9wdGltaXplci5pbml0QmxldUhpc3RvcnkobnVtU2VudGVuY2VzLCBldmFsTWV0cmljLmdldF9zdWZmU3RhdHNDb3VudCgpIC0gMik7IC8vIFN0YXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBURVI9MgorICAgICAgICAgIE9wdGltaXplci51c2VQc2V1ZG9CbGV1ID0gdXNlUHNldWRvQmxldTsKKyAgICAgICAgICBPcHRpbWl6ZXIuUiA9IFI7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgVmVjdG9yPFN0cmluZz4gb3V0cHV0ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisKKyAgICAgIC8vIG5vdGU6IGluaXRpYWxMYW1iZGFbXSBoYXMgbGVuZ3RoID0gbnVtUGFyYW1zT2xkCisgICAgICAvLyBhdWdtZW50ZWQgd2l0aCBuZXcgZmVhdHVyZSB3ZWlnaHRzLCBpbml0aWFsIHZhbHVlcyBhcmUgMAorICAgICAgZG91YmxlW10gaW5pdGlhbExhbWJkYU5ldyA9IG5ldyBkb3VibGVbMSArIG51bVBhcmFtc107CisgICAgICBTeXN0ZW0uYXJyYXljb3B5KGluaXRpYWxMYW1iZGEsIDEsIGluaXRpYWxMYW1iZGFOZXcsIDEsIG51bVBhcmFtc09sZCk7CisKKyAgICAgIC8vIGZpbmFsTGFtYmRhW10gaGFzIGxlbmd0aCA9IG51bVBhcmFtcyAoY29uc2lkZXJpbmcgbmV3IGZlYXR1cmVzKQorICAgICAgZG91YmxlW10gZmluYWxMYW1iZGEgPSBuZXcgZG91YmxlWzEgKyBudW1QYXJhbXNdOworCisgICAgICBPcHRpbWl6ZXIgb3B0ID0gbmV3IE9wdGltaXplcihvdXRwdXQsIGlzT3B0aW1pemFibGUsIGluaXRpYWxMYW1iZGFOZXcsIGZlYXRfaGFzaCwgc3RhdHNfaGFzaCk7CisgICAgICBmaW5hbExhbWJkYSA9IG9wdC5ydW5PcHRpbWl6ZXIoKTsKKworICAgICAgaWYgKHJldHVybkJlc3QpIHsKKyAgICAgICAgZG91YmxlIG1ldHJpY1Njb3JlID0gb3B0LmdldE1ldHJpY1Njb3JlKCk7CisgICAgICAgIGlmICghZXZhbE1ldHJpYy5nZXRUb0JlTWluaW1pemVkKCkpIHsKKyAgICAgICAgICBpZiAobWV0cmljU2NvcmUgPiBwcmV2TWV0cmljU2NvcmUpIHsKKyAgICAgICAgICAgIHByZXZNZXRyaWNTY29yZSA9IG1ldHJpY1Njb3JlOworICAgICAgICAgICAgZm9yIChpbnQgcCA9IDE7IHAgPCBiZXN0TGFtYmRhLnNpemUoKTsgKytwKQorICAgICAgICAgICAgICBiZXN0TGFtYmRhLnNldChwLCBmaW5hbExhbWJkYVtwXSk7CisgICAgICAgICAgICBpZiAoMSArIG51bVBhcmFtcyA+IGJlc3RMYW1iZGEuc2l6ZSgpKSB7CisgICAgICAgICAgICAgIGZvciAoaW50IHAgPSBiZXN0TGFtYmRhLnNpemUoKTsgcCA8PSBudW1QYXJhbXM7ICsrcCkKKyAgICAgICAgICAgICAgICBiZXN0TGFtYmRhLmFkZChwLCBmaW5hbExhbWJkYVtwXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChtZXRyaWNTY29yZSA8IHByZXZNZXRyaWNTY29yZSkgeworICAgICAgICAgICAgcHJldk1ldHJpY1Njb3JlID0gbWV0cmljU2NvcmU7CisgICAgICAgICAgICBmb3IgKGludCBwID0gMTsgcCA8IGJlc3RMYW1iZGEuc2l6ZSgpOyArK3ApCisgICAgICAgICAgICAgIGJlc3RMYW1iZGEuc2V0KHAsIGZpbmFsTGFtYmRhW3BdKTsKKyAgICAgICAgICAgIGlmICgxICsgbnVtUGFyYW1zID4gYmVzdExhbWJkYS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgZm9yIChpbnQgcCA9IGJlc3RMYW1iZGEuc2l6ZSgpOyBwIDw9IG51bVBhcmFtczsgKytwKQorICAgICAgICAgICAgICAgIGJlc3RMYW1iZGEuYWRkKHAsIGZpbmFsTGFtYmRhW3BdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKGZpbmFsTGFtYmRhLmxlbmd0aCk7CisgICAgICAvLyBmb3IoIGludCBpPTA7IGk8ZmluYWxMYW1iZGEubGVuZ3RoLTE7IGkrKyApCisgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oZmluYWxMYW1iZGFbaSsxXSk7CisKKyAgICAgIC8qKioqKioqKioqKioqIGVuZCBvcHRpbWl6YXRpb24gKioqKioqKioqKioqKiovCisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0LnNpemUoKTsgaSsrKQorICAgICAgICBwcmludGxuKG91dHB1dC5nZXQoaSkpOworCisgICAgICAvLyBjaGVjayBpZiBhbnkgcGFyYW1ldGVyIGhhcyBiZWVuIHVwZGF0ZWQKKyAgICAgIGJvb2xlYW4gYW55UGFyYW1DaGFuZ2VkID0gZmFsc2U7CisgICAgICBib29sZWFuIGFueVBhcmFtQ2hhbmdlZFNpZ25pZmljYW50bHkgPSBmYWxzZTsKKworICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gbnVtUGFyYW1zOyArK2MpIHsKKyAgICAgICAgaWYgKGZpbmFsTGFtYmRhW2NdICE9IGxhbWJkYS5nZXQoYykpIHsKKyAgICAgICAgICBhbnlQYXJhbUNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChNYXRoLmFicyhmaW5hbExhbWJkYVtjXSAtIGxhbWJkYS5nZXQoYykpID4gc3RvcFNpZ1ZhbHVlKSB7CisgICAgICAgICAgYW55UGFyYW1DaGFuZ2VkU2lnbmlmaWNhbnRseSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gU3lzdGVtLmFycmF5Y29weShmaW5hbExhbWJkYSwxLGxhbWJkYSwxLG51bVBhcmFtcyk7CisKKyAgICAgIHByaW50bG4oIi0tLSAgQWRhR3JhZCBpdGVyYXRpb24gIyIgKyBpdGVyYXRpb24gKyAiIGVuZGluZyBAICIgKyAobmV3IERhdGUoKSkgKyAiICAtLS0iLCAxKTsKKyAgICAgIHByaW50bG4oIiIsIDEpOworCisgICAgICBpZiAoIWFueVBhcmFtQ2hhbmdlZCkgeworICAgICAgICBwcmludGxuKCJObyBwYXJhbWV0ZXIgdmFsdWUgY2hhbmdlZCBpbiB0aGlzIGl0ZXJhdGlvbjsgZXhpdGluZyBBZGFHcmFkLiIsIDEpOworICAgICAgICBwcmludGxuKCIiLCAxKTsKKyAgICAgICAgYnJlYWs7IC8vIGV4aXQgZm9yIChpdGVyYXRpb24pIGxvb3AgcHJlZW1wdGl2ZWx5CisgICAgICB9CisKKyAgICAgIC8vIHdhcyBhbiBlYXJseSBzdG9wcGluZyBjcml0ZXJpb24gc2F0aXNmaWVkPworICAgICAgYm9vbGVhbiBjcml0U2F0aXNmaWVkID0gZmFsc2U7CisgICAgICBpZiAoIWFueVBhcmFtQ2hhbmdlZFNpZ25pZmljYW50bHkgJiYgc3RvcFNpZ1ZhbHVlID49IDApIHsKKyAgICAgICAgcHJpbnRsbigiTm90ZTogTm8gcGFyYW1ldGVyIHZhbHVlIGNoYW5nZWQgc2lnbmlmaWNhbnRseSAiICsgIihpLmUuIGJ5IG1vcmUgdGhhbiAiCisgICAgICAgICAgICArIHN0b3BTaWdWYWx1ZSArICIpIGluIHRoaXMgaXRlcmF0aW9uLiIsIDEpOworICAgICAgICBjcml0U2F0aXNmaWVkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGNyaXRTYXRpc2ZpZWQpIHsKKyAgICAgICAgKytlYXJseVN0b3A7CisgICAgICAgIHByaW50bG4oIiIsIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZWFybHlTdG9wID0gMDsKKyAgICAgIH0KKworICAgICAgLy8gaWYgbWluIG51bWJlciBvZiBpdGVyYXRpb25zIGV4ZWN1dGVkLCBpbnZlc3RpZ2F0ZSBpZiBlYXJseSBleGl0IHNob3VsZCBoYXBwZW4KKyAgICAgIGlmIChpdGVyYXRpb24gPj0gbWluSXRzICYmIGVhcmx5U3RvcCA+PSBzdG9wTWluSXRzKSB7CisgICAgICAgIHByaW50bG4oIlNvbWUgZWFybHkgc3RvcHBpbmcgY3JpdGVyaWEgaGFzIGJlZW4gb2JzZXJ2ZWQgIiArICJpbiAiICsgc3RvcE1pbkl0cworICAgICAgICAgICAgKyAiIGNvbnNlY3V0aXZlIGl0ZXJhdGlvbnM7IGV4aXRpbmcgQWRhR3JhZC4iLCAxKTsKKyAgICAgICAgcHJpbnRsbigiIiwgMSk7CisKKyAgICAgICAgaWYgKHJldHVybkJlc3QpIHsKKyAgICAgICAgICBmb3IgKGludCBmID0gMTsgZiA8PSBiZXN0TGFtYmRhLnNpemUoKSAtIDE7ICsrZikKKyAgICAgICAgICAgIGxhbWJkYS5zZXQoZiwgYmVzdExhbWJkYS5nZXQoZikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaW50IGYgPSAxOyBmIDw9IG51bVBhcmFtczsgKytmKQorICAgICAgICAgICAgbGFtYmRhLnNldChmLCBmaW5hbExhbWJkYVtmXSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsgLy8gZXhpdCBmb3IgKGl0ZXJhdGlvbikgbG9vcCBwcmVlbXB0aXZlbHkKKyAgICAgIH0KKworICAgICAgLy8gaWYgbWF4IG51bWJlciBvZiBpdGVyYXRpb25zIGV4ZWN1dGVkLCBleGl0CisgICAgICBpZiAoaXRlcmF0aW9uID49IG1heEl0cykgeworICAgICAgICBwcmludGxuKCJNYXhpbXVtIG51bWJlciBvZiBBZGFHcmFkIGl0ZXJhdGlvbnMgcmVhY2hlZDsgZXhpdGluZyBBZGFHcmFkLiIsIDEpOworICAgICAgICBwcmludGxuKCIiLCAxKTsKKworICAgICAgICBpZiAocmV0dXJuQmVzdCkgeworICAgICAgICAgIGZvciAoaW50IGYgPSAxOyBmIDw9IGJlc3RMYW1iZGEuc2l6ZSgpIC0gMTsgKytmKQorICAgICAgICAgICAgbGFtYmRhLnNldChmLCBiZXN0TGFtYmRhLmdldChmKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpbnQgZiA9IDE7IGYgPD0gbnVtUGFyYW1zOyArK2YpCisgICAgICAgICAgICBsYW1iZGEuc2V0KGYsIGZpbmFsTGFtYmRhW2ZdKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOyAvLyBleGl0IGZvciAoaXRlcmF0aW9uKSBsb29wCisgICAgICB9CisKKyAgICAgIC8vIHVzZSB0aGUgbmV3IHd0IHZlY3RvciB0byBkZWNvZGUgdGhlIG5leHQgaXRlcmF0aW9uCisgICAgICAvLyAoaW50ZXJwb2xhdGlvbiB3aXRoIHByZXZpb3VzIHd0IHZlY3RvcikKKyAgICAgIGRvdWJsZSBpbnRlckNvZWYgPSAxLjA7IC8vIG5vIGludGVycG9sYXRpb24gZm9yIG5vdworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtUGFyYW1zOyBpKyspCisgICAgICAgIGxhbWJkYS5zZXQoaSwgaW50ZXJDb2VmICogZmluYWxMYW1iZGFbaV0gKyAoMSAtIGludGVyQ29lZikgKiBsYW1iZGEuZ2V0KGkpLmRvdWJsZVZhbHVlKCkpOworCisgICAgICBwcmludGxuKCJOZXh0IGl0ZXJhdGlvbiB3aWxsIGRlY29kZSB3aXRoIGxhbWJkYTogIiArIGxhbWJkYVRvU3RyaW5nKGxhbWJkYSksIDEpOworICAgICAgcHJpbnRsbigiIiwgMSk7CisKKyAgICAgIC8vIHByaW50TWVtb3J5VXNhZ2UoKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2VudGVuY2VzOyArK2kpIHsKKyAgICAgICAgc3VmZlN0YXRzX2FycmF5W2ldLmNsZWFyKCk7CisgICAgICB9CisgICAgICAvLyBjbGVhbnVwTWVtb3J5KCk7CisgICAgICAvLyBwcmludGxuKCIiLDIpOworCisgICAgICByZXRBWzJdID0gMDsgLy8gaS5lLiB0aGlzIHNob3VsZCBOT1QgYmUgdGhlIGxhc3QgaXRlcmF0aW9uCisgICAgICBkb25lID0gdHJ1ZTsKKworICAgIH0gLy8gd2hpbGUgKCFkb25lKSAvLyBOT1RFOiB0aGlzICJsb29wIiB3aWxsIG9ubHkgYmUgY2FycmllZCBvdXQgb25jZQorCisgICAgLy8gZGVsZXRlIC50ZW1wLnN0YXRzLm1lcmdlZCBmaWxlLCBzaW5jZSBpdCBpcyBub3QgbmVlZGVkIGluIHRoZSBuZXh0CisgICAgLy8gaXRlcmF0aW9uIChpdCB3aWxsIGJlIHJlY3JlYXRlZCBmcm9tIHNjcmF0Y2gpCisgICAgZGVsZXRlRmlsZSh0bXBEaXJQcmVmaXggKyAidGVtcC5zdGF0cy5tZXJnZWQiKTsKKworICAgIHJldEFbMF0gPSBGSU5BTF9zY29yZTsKKyAgICByZXRBWzFdID0gZWFybHlTdG9wOworICAgIHJldHVybiByZXRBOworCisgIH0gLy8gcnVuX3NpbmdsZV9pdGVyYXRpb24KKworICBwcml2YXRlIFN0cmluZyBsYW1iZGFUb1N0cmluZyhBcnJheUxpc3Q8RG91YmxlPiBsYW1iZGFBKSB7CisgICAgU3RyaW5nIHJldFN0ciA9ICJ7IjsKKyAgICBpbnQgZmVhdFRvUHJpbnQgPSBudW1QYXJhbXMgPiAxNSA/IDE1IDogbnVtUGFyYW1zOworICAgIC8vIHByaW50IGF0IG1vc3QgdGhlIGZpcnN0IDE1IGZlYXR1cmVzCisKKyAgICByZXRTdHIgKz0gIihsaXN0aW5nIHRoZSBmaXJzdCAiICsgZmVhdFRvUHJpbnQgKyAiIGxhbWJkYXMpIjsKKyAgICBmb3IgKGludCBjID0gMTsgYyA8PSBmZWF0VG9QcmludCAtIDE7ICsrYykgeworICAgICAgcmV0U3RyICs9ICIiICsgU3RyaW5nLmZvcm1hdCgiJS40ZiIsIGxhbWJkYUEuZ2V0KGMpLmRvdWJsZVZhbHVlKCkpICsgIiwgIjsKKyAgICB9CisgICAgcmV0U3RyICs9ICIiICsgU3RyaW5nLmZvcm1hdCgiJS40ZiIsIGxhbWJkYUEuZ2V0KG51bVBhcmFtcykuZG91YmxlVmFsdWUoKSkgKyAifSI7CisKKyAgICByZXR1cm4gcmV0U3RyOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmdbXSBydW5fZGVjb2RlcihpbnQgaXRlcmF0aW9uKSB7CisgICAgU3RyaW5nW10gcmV0U0EgPSBuZXcgU3RyaW5nWzJdOworCisgICAgLy8gcmV0c2Egc2F2ZXMgdGhlIG91dHB1dCBmaWxlIG5hbWUobmJlc3QtZmlsZSkKKyAgICAvLyBhbmQgdGhlIGRlY29kZXIgdHlwZQorCisgICAgLy8gWzBdIG5hbWUgb2YgZmlsZSB0byBiZSBwcm9jZXNzZWQKKyAgICAvLyBbMV0gaW5kaWNhdGVzIGhvdyB0aGUgb3V0cHV0IGZpbGUgd2FzIG9idGFpbmVkOgorICAgIC8vIDE6IGV4dGVybmFsIGRlY29kZXIKKyAgICAvLyAyOiBmYWtlIGRlY29kZXIKKyAgICAvLyAzOiBpbnRlcm5hbCBkZWNvZGVyCisKKyAgICAvLyB1c2UgZmFrZSBkZWNvZGVyCisgICAgaWYgKGZha2VGaWxlTmFtZVRlbXBsYXRlICE9IG51bGwKKyAgICAgICAgJiYgZmlsZUV4aXN0cyhmYWtlRmlsZU5hbWVQcmVmaXggKyBpdGVyYXRpb24gKyBmYWtlRmlsZU5hbWVTdWZmaXgpKSB7CisgICAgICBTdHJpbmcgZmFrZUZpbGVOYW1lID0gZmFrZUZpbGVOYW1lUHJlZml4ICsgaXRlcmF0aW9uICsgZmFrZUZpbGVOYW1lU3VmZml4OworICAgICAgcHJpbnRsbigiTm90IHJ1bm5pbmcgZGVjb2RlcjsgdXNpbmcgIiArIGZha2VGaWxlTmFtZSArICIgaW5zdGVhZC4iLCAxKTsKKyAgICAgIC8qCisgICAgICAgKiBpZiAoZmFrZUZpbGVOYW1lLmVuZHNXaXRoKCIuZ3oiKSkgeyBjb3B5RmlsZShmYWtlRmlsZU5hbWUsZGVjb2Rlck91dEZpbGVOYW1lKyIuZ3oiKTsKKyAgICAgICAqIGd1bnppcEZpbGUoZGVjb2Rlck91dEZpbGVOYW1lKyIuZ3oiKTsgfSBlbHNlIHsgY29weUZpbGUoZmFrZUZpbGVOYW1lLGRlY29kZXJPdXRGaWxlTmFtZSk7IH0KKyAgICAgICAqLworICAgICAgcmV0U0FbMF0gPSBmYWtlRmlsZU5hbWU7CisgICAgICByZXRTQVsxXSA9ICIyIjsKKworICAgIH0gZWxzZSB7CisgICAgICBwcmludGxuKCJSdW5uaW5nIGV4dGVybmFsIGRlY29kZXIuLi4iLCAxKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gY21kID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGNtZC5hZGQoZGVjb2RlckNvbW1hbmRGaWxlTmFtZSk7CisKKyAgICAgICAgaWYgKHBhc3NJdGVyYXRpb25Ub0RlY29kZXIpCisgICAgICAgICAgY21kLmFkZChJbnRlZ2VyLnRvU3RyaW5nKGl0ZXJhdGlvbikpOworCisgICAgICAgIFByb2Nlc3NCdWlsZGVyIHBiID0gbmV3IFByb2Nlc3NCdWlsZGVyKGNtZCk7CisgICAgICAgIC8vIHRoaXMgbWVyZ2VzIHRoZSBlcnJvciBhbmQgb3V0cHV0IHN0cmVhbXMgb2YgdGhlIHN1YnByb2Nlc3MKKyAgICAgICAgcGIucmVkaXJlY3RFcnJvclN0cmVhbSh0cnVlKTsKKyAgICAgICAgUHJvY2VzcyBwID0gcGIuc3RhcnQoKTsKKworICAgICAgICAvLyBjYXB0dXJlIHRoZSBzdWItY29tbWFuZCdzIG91dHB1dAorICAgICAgICBuZXcgU3RyZWFtR29iYmxlcihwLmdldElucHV0U3RyZWFtKCksIGRlY1ZlcmJvc2l0eSkuc3RhcnQoKTsKKworICAgICAgICBpbnQgZGVjU3RhdHVzID0gcC53YWl0Rm9yKCk7CisgICAgICAgIGlmIChkZWNTdGF0dXMgIT0gdmFsaWREZWNvZGVyRXhpdFZhbHVlKSB7CisgICAgICAgICAgcHJpbnRsbigiQ2FsbCB0byBkZWNvZGVyIHJldHVybmVkICIgKyBkZWNTdGF0dXMgKyAiOyB3YXMgZXhwZWN0aW5nICIKKyAgICAgICAgICAgICAgKyB2YWxpZERlY29kZXJFeGl0VmFsdWUgKyAiLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDMwKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPRXhjZXB0aW9uIGluIEFkYUdyYWRDb3JlLnJ1bl9kZWNvZGVyKGludCk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIFN5c3RlbS5leGl0KDk5OTAyKTsKKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpbiBBZGFHcmFkQ29yZS5ydW5fZGVjb2RlcihpbnQpOiAiCisgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoOTk5MDMpOworICAgICAgfQorCisgICAgICByZXRTQVswXSA9IGRlY29kZXJPdXRGaWxlTmFtZTsKKyAgICAgIHJldFNBWzFdID0gIjEiOworCisgICAgfQorCisgICAgcmV0dXJuIHJldFNBOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHByb2R1Y2VUZW1wRmlsZXMoU3RyaW5nIG5iZXN0RmlsZU5hbWUsIGludCBpdGVyYXRpb24pIHsKKyAgICB0cnkgeworICAgICAgU3RyaW5nIHNlbnRzRmlsZU5hbWUgPSB0bXBEaXJQcmVmaXggKyAidGVtcC5zZW50cy5pdCIgKyBpdGVyYXRpb247CisgICAgICBTdHJpbmcgZmVhdHNGaWxlTmFtZSA9IHRtcERpclByZWZpeCArICJ0ZW1wLmZlYXRzLml0IiArIGl0ZXJhdGlvbjsKKworICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW1fc2VudHMgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzZW50c0ZpbGVOYW1lLCBmYWxzZSk7CisgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0U3RyZWFtV3JpdGVyX3NlbnRzID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRTdHJlYW1fc2VudHMsICJ1dGY4Iik7CisgICAgICBCdWZmZXJlZFdyaXRlciBvdXRGaWxlX3NlbnRzID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG91dFN0cmVhbVdyaXRlcl9zZW50cyk7CisKKyAgICAgIFByaW50V3JpdGVyIG91dEZpbGVfZmVhdHMgPSBuZXcgUHJpbnRXcml0ZXIoZmVhdHNGaWxlTmFtZSk7CisKKyAgICAgIElucHV0U3RyZWFtIGluU3RyZWFtX25iZXN0ID0gbnVsbDsKKyAgICAgIGlmIChuYmVzdEZpbGVOYW1lLmVuZHNXaXRoKCIuZ3oiKSkgeworICAgICAgICBpblN0cmVhbV9uYmVzdCA9IG5ldyBHWklQSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShuYmVzdEZpbGVOYW1lKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpblN0cmVhbV9uYmVzdCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmJlc3RGaWxlTmFtZSk7CisgICAgICB9CisgICAgICBCdWZmZXJlZFJlYWRlciBpbkZpbGVfbmJlc3QgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKGluU3RyZWFtX25iZXN0LCAidXRmOCIpKTsKKworICAgICAgU3RyaW5nIGxpbmU7IC8vICwgcHJldkxpbmU7CisgICAgICBTdHJpbmcgY2FuZGlkYXRlX3N0ciA9ICIiOworICAgICAgU3RyaW5nIGZlYXRzX3N0ciA9ICIiOworCisgICAgICBpbnQgaSA9IDA7CisgICAgICBpbnQgbiA9IDA7CisgICAgICBsaW5lID0gaW5GaWxlX25iZXN0LnJlYWRMaW5lKCk7CisKKyAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBsaW5lIGZvcm1hdDoKKyAgICAgICAgICogCisgICAgICAgICAqIGkgfHx8IHdvcmRzIG9mIGNhbmRpZGF0ZSB0cmFuc2xhdGlvbiAuIHx8fCBmZWF0LTFfdmFsIGZlYXQtMl92YWwgLi4uIGZlYXQtbnVtUGFyYW1zX3ZhbAorICAgICAgICAgKiAuKgorICAgICAgICAgKi8KKworICAgICAgICAvLyBpbiBhIHdlbGwgZm9ybWVkIGZpbGUsIHdlJ2QgZmluZCB0aGUgbnRoIGNhbmRpZGF0ZSBmb3IgdGhlIGl0aCBzZW50ZW5jZQorCisgICAgICAgIGludCByZWFkX2kgPSBJbnRlZ2VyLnBhcnNlSW50KChsaW5lLnN1YnN0cmluZygwLCBsaW5lLmluZGV4T2YoInx8fCIpKSkudHJpbSgpKTsKKworICAgICAgICBpZiAocmVhZF9pICE9IGkpIHsKKyAgICAgICAgICB3cml0ZUxpbmUoInx8fHx8fCIsIG91dEZpbGVfc2VudHMpOworICAgICAgICAgIG91dEZpbGVfZmVhdHMucHJpbnRsbigifHx8fHx8Iik7CisgICAgICAgICAgbiA9IDA7CisgICAgICAgICAgKytpOworICAgICAgICB9CisKKyAgICAgICAgbGluZSA9IChsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoInx8fCIpICsgMykpLnRyaW0oKTsgLy8gZ2V0IHJpZCBvZiBpbml0aWFsIHRleHQKKworICAgICAgICBjYW5kaWRhdGVfc3RyID0gKGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZigifHx8IikpKS50cmltKCk7CisgICAgICAgIGZlYXRzX3N0ciA9IChsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoInx8fCIpICsgMykpLnRyaW0oKTsKKyAgICAgICAgLy8gZ2V0IHJpZCBvZiBjYW5kaWRhdGUgc3RyaW5nCisKKyAgICAgICAgaW50IGp1bmtfaSA9IGZlYXRzX3N0ci5pbmRleE9mKCJ8fHwiKTsKKyAgICAgICAgaWYgKGp1bmtfaSA+PSAwKSB7CisgICAgICAgICAgZmVhdHNfc3RyID0gKGZlYXRzX3N0ci5zdWJzdHJpbmcoMCwganVua19pKSkudHJpbSgpOworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVMaW5lKG5vcm1hbGl6ZShjYW5kaWRhdGVfc3RyLCB0ZXh0Tm9ybU1ldGhvZCksIG91dEZpbGVfc2VudHMpOworICAgICAgICBvdXRGaWxlX2ZlYXRzLnByaW50bG4oZmVhdHNfc3RyKTsKKworICAgICAgICArK247CisgICAgICAgIGlmIChuID09IHNpemVPZk5CZXN0KSB7CisgICAgICAgICAgd3JpdGVMaW5lKCJ8fHx8fHwiLCBvdXRGaWxlX3NlbnRzKTsKKyAgICAgICAgICBvdXRGaWxlX2ZlYXRzLnByaW50bG4oInx8fHx8fCIpOworICAgICAgICAgIG4gPSAwOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmUgPSBpbkZpbGVfbmJlc3QucmVhZExpbmUoKTsKKyAgICAgIH0KKworICAgICAgaWYgKGkgIT0gbnVtU2VudGVuY2VzKSB7IC8vIGxhc3Qgc2VudGVuY2UgaGFkIHRvbyBmZXcgY2FuZGlkYXRlcworICAgICAgICB3cml0ZUxpbmUoInx8fHx8fCIsIG91dEZpbGVfc2VudHMpOworICAgICAgICBvdXRGaWxlX2ZlYXRzLnByaW50bG4oInx8fHx8fCIpOworICAgICAgfQorCisgICAgICBpbkZpbGVfbmJlc3QuY2xvc2UoKTsKKyAgICAgIG91dEZpbGVfc2VudHMuY2xvc2UoKTsKKyAgICAgIG91dEZpbGVfZmVhdHMuY2xvc2UoKTsKKworICAgICAgaWYgKGNvbXByZXNzRmlsZXMgPT0gMSkgeworICAgICAgICBnemlwRmlsZShzZW50c0ZpbGVOYW1lKTsKKyAgICAgICAgZ3ppcEZpbGUoZmVhdHNGaWxlTmFtZSk7CisgICAgICB9CisKKyAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGaWxlTm90Rm91bmRFeGNlcHRpb24gaW4gQWRhR3JhZENvcmUucHJvZHVjZVRlbXBGaWxlcyhpbnQpOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICBTeXN0ZW0uZXhpdCg5OTkwMSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJT0V4Y2VwdGlvbiBpbiBBZGFHcmFkQ29yZS5wcm9kdWNlVGVtcEZpbGVzKGludCk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICBTeXN0ZW0uZXhpdCg5OTkwMik7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHZvaWQgY3JlYXRlQ29uZmlnRmlsZShBcnJheUxpc3Q8RG91YmxlPiBwYXJhbXMsIFN0cmluZyBjZmdGaWxlTmFtZSwKKyAgICAgIFN0cmluZyB0ZW1wbGF0ZUZpbGVOYW1lKSB7CisgICAgdHJ5IHsKKyAgICAgIC8vIGkuZS4gY3JlYXRlIGNmZ0ZpbGVOYW1lLCB3aGljaCBpcyBzaW1pbGFyIHRvIHRlbXBsYXRlRmlsZU5hbWUsIGJ1dCB3aXRoCisgICAgICAvLyBwYXJhbXNbXSBhcyBwYXJhbWV0ZXIgdmFsdWVzCisKKyAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluRmlsZSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcih0ZW1wbGF0ZUZpbGVOYW1lKSk7CisgICAgICBQcmludFdyaXRlciBvdXRGaWxlID0gbmV3IFByaW50V3JpdGVyKGNmZ0ZpbGVOYW1lKTsKKworICAgICAgQnVmZmVyZWRSZWFkZXIgaW5GZWF0RGVmRmlsZSA9IG51bGw7CisgICAgICBQcmludFdyaXRlciBvdXRGZWF0RGVmRmlsZSA9IG51bGw7CisgICAgICBpbnQgb3JpZ0ZlYXROdW0gPSAwOyAvLyBmZWF0IG51bSBpbiB0aGUgdGVtcGxhdGUgZmlsZQorCisgICAgICBTdHJpbmcgbGluZSA9IGluRmlsZS5yZWFkTGluZSgpOworICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgeworICAgICAgICBpbnQgY19tYXRjaCA9IC0xOworICAgICAgICBmb3IgKGludCBjID0gMTsgYyA8PSBudW1QYXJhbXM7ICsrYykgeworICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoVm9jYWJ1bGFyeS53b3JkKGMpICsgIiAiKSkgeworICAgICAgICAgICAgY19tYXRjaCA9IGM7CisgICAgICAgICAgICArK29yaWdGZWF0TnVtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNfbWF0Y2ggPT0gLTEpIHsKKyAgICAgICAgICBvdXRGaWxlLnByaW50bG4obGluZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKE1hdGguYWJzKHBhcmFtcy5nZXQoY19tYXRjaCkuZG91YmxlVmFsdWUoKSkgPiAxZS0yMCkKKyAgICAgICAgICAgIG91dEZpbGUucHJpbnRsbihWb2NhYnVsYXJ5LndvcmQoY19tYXRjaCkgKyAiICIgKyBwYXJhbXMuZ2V0KGNfbWF0Y2gpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmUgPSBpbkZpbGUucmVhZExpbmUoKTsKKyAgICAgIH0KKworICAgICAgLy8gbm93IGFwcGVuZCB3ZWlnaHRzIG9mIG5ldyBmZWF0dXJlcworICAgICAgZm9yIChpbnQgYyA9IG9yaWdGZWF0TnVtICsgMTsgYyA8PSBudW1QYXJhbXM7ICsrYykgeworICAgICAgICBpZiAoTWF0aC5hYnMocGFyYW1zLmdldChjKS5kb3VibGVWYWx1ZSgpKSA+IDFlLTIwKQorICAgICAgICAgIG91dEZpbGUucHJpbnRsbihWb2NhYnVsYXJ5LndvcmQoYykgKyAiICIgKyBwYXJhbXMuZ2V0KGMpKTsKKyAgICAgIH0KKworICAgICAgaW5GaWxlLmNsb3NlKCk7CisgICAgICBvdXRGaWxlLmNsb3NlKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJT0V4Y2VwdGlvbiBpbiBBZGFHcmFkQ29yZS5jcmVhdGVDb25maWdGaWxlKGRvdWJsZVtdLFN0cmluZyxTdHJpbmcpOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICBTeXN0ZW0uZXhpdCg5OTkwMik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYXJhbUZpbGUoKSB7CisgICAgLy8gcHJvY2VzcyBwYXJhbWV0ZXIgZmlsZQorICAgIFNjYW5uZXIgaW5GaWxlX2luaXQgPSBudWxsOworICAgIHRyeSB7CisgICAgICBpbkZpbGVfaW5pdCA9IG5ldyBTY2FubmVyKG5ldyBGaWxlUmVhZGVyKHBhcmFtc0ZpbGVOYW1lKSk7CisgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGluIEFkYUdyYWRDb3JlLnByb2Nlc3NQYXJhbUZpbGUoKTogIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgU3lzdGVtLmV4aXQoOTk5MDEpOworICAgIH0KKworICAgIFN0cmluZyBkdW1teSA9ICIiOworCisgICAgLy8gaW5pdGlhbGl6ZSBsYW1iZGFbXSBhbmQgb3RoZXIgcmVsYXRlZCBhcnJheXMKKyAgICBmb3IgKGludCBjID0gMTsgYyA8PSBudW1QYXJhbXM7ICsrYykgeworICAgICAgLy8gc2tpcCBwYXJhbWV0ZXIgbmFtZQorICAgICAgd2hpbGUgKCFkdW1teS5lcXVhbHMoInx8fCIpKSB7CisgICAgICAgIGR1bW15ID0gaW5GaWxlX2luaXQubmV4dCgpOworICAgICAgfQorCisgICAgICAvLyByZWFkIGRlZmF1bHQgdmFsdWUKKyAgICAgIGxhbWJkYS5zZXQoYywgaW5GaWxlX2luaXQubmV4dERvdWJsZSgpKTsKKyAgICAgIGRlZmF1bHRMYW1iZGFbY10gPSBsYW1iZGEuZ2V0KGMpLmRvdWJsZVZhbHVlKCk7CisKKyAgICAgIC8vIHJlYWQgaXNPcHRpbWl6YWJsZQorICAgICAgZHVtbXkgPSBpbkZpbGVfaW5pdC5uZXh0KCk7CisgICAgICBpZiAoZHVtbXkuZXF1YWxzKCJPcHQiKSkgeworICAgICAgICBpc09wdGltaXphYmxlW2NdID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoZHVtbXkuZXF1YWxzKCJGaXgiKSkgeworICAgICAgICBpc09wdGltaXphYmxlW2NdID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGxuKCJVbmtub3duIGlzT3B0aW1pemFibGUgc3RyaW5nICIgKyBkdW1teSArICIgKG11c3QgYmUgZWl0aGVyIE9wdCBvciBGaXgpIik7CisgICAgICAgIFN5c3RlbS5leGl0KDIxKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFpc09wdGltaXphYmxlW2NdKSB7IC8vIHNraXAgbmV4dCB0d28gdmFsdWVzCisgICAgICAgIGR1bW15ID0gaW5GaWxlX2luaXQubmV4dCgpOworICAgICAgICBkdW1teSA9IGluRmlsZV9pbml0Lm5leHQoKTsKKyAgICAgICAgZHVtbXkgPSBpbkZpbGVfaW5pdC5uZXh0KCk7CisgICAgICAgIGR1bW15ID0gaW5GaWxlX2luaXQubmV4dCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdGhlIG5leHQgdHdvIHZhbHVlcyBhcmUgbm90IHVzZWQsIG9ubHkgdG8gYmUgY29uc2lzdGVudCB3aXRoIFpNRVJUJ3MgcGFyYW1zIGZpbGUgZm9ybWF0CisgICAgICAgIGR1bW15ID0gaW5GaWxlX2luaXQubmV4dCgpOworICAgICAgICBkdW1teSA9IGluRmlsZV9pbml0Lm5leHQoKTsKKyAgICAgICAgLy8gc2V0IG1pblJhbmRWYWx1ZVtjXSBhbmQgbWF4UmFuZFZhbHVlW2NdIChyYW5nZSBmb3IgcmFuZG9tIHZhbHVlcykKKyAgICAgICAgZHVtbXkgPSBpbkZpbGVfaW5pdC5uZXh0KCk7CisgICAgICAgIGlmIChkdW1teS5lcXVhbHMoIi1JbmYiKSB8fCBkdW1teS5lcXVhbHMoIitJbmYiKSkgeworICAgICAgICAgIHByaW50bG4oIm1pblJhbmRWYWx1ZVsiICsgYyArICJdIGNhbm5vdCBiZSAtSW5mIG9yICtJbmYhIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMjEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1pblJhbmRWYWx1ZVtjXSA9IERvdWJsZS5wYXJzZURvdWJsZShkdW1teSk7CisgICAgICAgIH0KKworICAgICAgICBkdW1teSA9IGluRmlsZV9pbml0Lm5leHQoKTsKKyAgICAgICAgaWYgKGR1bW15LmVxdWFscygiLUluZiIpIHx8IGR1bW15LmVxdWFscygiK0luZiIpKSB7CisgICAgICAgICAgcHJpbnRsbigibWF4UmFuZFZhbHVlWyIgKyBjICsgIl0gY2Fubm90IGJlIC1JbmYgb3IgK0luZiEiKTsKKyAgICAgICAgICBTeXN0ZW0uZXhpdCgyMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWF4UmFuZFZhbHVlW2NdID0gRG91YmxlLnBhcnNlRG91YmxlKGR1bW15KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGZvciBpbGxvZ2ljYWwgdmFsdWVzCisgICAgICAgIGlmIChtaW5SYW5kVmFsdWVbY10gPiBtYXhSYW5kVmFsdWVbY10pIHsKKyAgICAgICAgICBwcmludGxuKCJtaW5SYW5kVmFsdWVbIiArIGMgKyAiXT0iICsgbWluUmFuZFZhbHVlW2NdICsgIiA+ICIgKyBtYXhSYW5kVmFsdWVbY10KKyAgICAgICAgICAgICAgKyAiPW1heFJhbmRWYWx1ZVsiICsgYyArICJdISIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDIxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGZvciBvZGQgdmFsdWVzCisgICAgICAgIGlmIChtaW5SYW5kVmFsdWVbY10gPT0gbWF4UmFuZFZhbHVlW2NdKSB7CisgICAgICAgICAgcHJpbnRsbigiV2FybmluZzogbGFtYmRhWyIgKyBjICsgIl0gaGFzICIgKyAibWluUmFuZFZhbHVlID0gbWF4UmFuZFZhbHVlID0gIgorICAgICAgICAgICAgICArIG1pblJhbmRWYWx1ZVtjXSArICIuIiwgMSk7CisgICAgICAgIH0KKyAgICAgIH0gLy8gaWYgKCFpc09wdGltaXphYmxlW2NdKQorCisgICAgICAvKgorICAgICAgICogcHJlY2lzaW9uW2NdID0gaW5GaWxlX2luaXQubmV4dERvdWJsZSgpOyBpZiAocHJlY2lzaW9uW2NdIDwgMCkgeyBwcmludGxuKCJwcmVjaXNpb25bIiArIGMgKworICAgICAgICogIl09IiArIHByZWNpc2lvbltjXSArICIgPCAwISAgTXVzdCBiZSBub24tbmVnYXRpdmUuIik7IFN5c3RlbS5leGl0KDIxKTsgfQorICAgICAgICovCisKKyAgICB9CisKKyAgICAvLyBzZXQgbm9ybWFsaXphdGlvbk9wdGlvbnNbXQorICAgIFN0cmluZyBvcmlnTGluZSA9ICIiOworICAgIHdoaWxlIChvcmlnTGluZSAhPSBudWxsICYmIG9yaWdMaW5lLmxlbmd0aCgpID09IDApIHsKKyAgICAgIG9yaWdMaW5lID0gaW5GaWxlX2luaXQubmV4dExpbmUoKTsKKyAgICB9CisKKyAgICAvLyBIb3cgc2hvdWxkIGEgbGFtYmRhW10gdmVjdG9yIGJlIG5vcm1hbGl6ZWQgKGJlZm9yZSBkZWNvZGluZyk/CisgICAgLy8gbk9bMF0gPSAwOiBubyBub3JtYWxpemF0aW9uCisgICAgLy8gbk9bMF0gPSAxOiBzY2FsZSBzbyB0aGF0IHBhcmFtZXRlciBuT1syXSBoYXMgYWJzb2x1dGUgdmFsdWUgbk9bMV0KKyAgICAvLyBuT1swXSA9IDI6IHNjYWxlIHNvIHRoYXQgdGhlIG1heGltdW0gYWJzb2x1dGUgdmFsdWUgaXMgbk9bMV0KKyAgICAvLyBuT1swXSA9IDM6IHNjYWxlIHNvIHRoYXQgdGhlIG1pbmltdW0gYWJzb2x1dGUgdmFsdWUgaXMgbk9bMV0KKyAgICAvLyBuT1swXSA9IDQ6IHNjYWxlIHNvIHRoYXQgdGhlIEwtbk9bMV0gbm9ybSBlcXVhbHMgbk9bMl0KKworICAgIC8vIG5vcm1hbGl6YXRpb24gPSBub25lCisgICAgLy8gbm9ybWFsaXphdGlvbiA9IGFic3ZhbCAxIGxtCisgICAgLy8gbm9ybWFsaXphdGlvbiA9IG1heGFic3ZhbCAxCisgICAgLy8gbm9ybWFsaXphdGlvbiA9IG1pbmFic3ZhbCAxCisgICAgLy8gbm9ybWFsaXphdGlvbiA9IExOb3JtIDIgMQorCisgICAgZHVtbXkgPSAob3JpZ0xpbmUuc3Vic3RyaW5nKG9yaWdMaW5lLmluZGV4T2YoIj0iKSArIDEpKS50cmltKCk7CisgICAgU3RyaW5nW10gZHVtbXlBID0gZHVtbXkuc3BsaXQoIlxccysiKTsKKworICAgIGlmIChkdW1teUFbMF0uZXF1YWxzKCJub25lIikpIHsKKyAgICAgIG5vcm1hbGl6YXRpb25PcHRpb25zWzBdID0gMDsKKyAgICB9IGVsc2UgaWYgKGR1bW15QVswXS5lcXVhbHMoImFic3ZhbCIpKSB7CisgICAgICBub3JtYWxpemF0aW9uT3B0aW9uc1swXSA9IDE7CisgICAgICBub3JtYWxpemF0aW9uT3B0aW9uc1sxXSA9IERvdWJsZS5wYXJzZURvdWJsZShkdW1teUFbMV0pOworICAgICAgU3RyaW5nIHBOYW1lID0gZHVtbXlBWzJdOworICAgICAgZm9yIChpbnQgaSA9IDM7IGkgPCBkdW1teUEubGVuZ3RoOyArK2kpIHsgLy8gaW4gY2FzZSBwYXJhbWV0ZXIgbmFtZSBoYXMgbXVsdGlwbGUgd29yZHMKKyAgICAgICAgcE5hbWUgPSBwTmFtZSArICIgIiArIGR1bW15QVtpXTsKKyAgICAgIH0KKyAgICAgIG5vcm1hbGl6YXRpb25PcHRpb25zWzJdID0gVm9jYWJ1bGFyeS5pZChwTmFtZSk7CisKKyAgICAgIGlmIChub3JtYWxpemF0aW9uT3B0aW9uc1sxXSA8PSAwKSB7CisgICAgICAgIHByaW50bG4oIlZhbHVlIGZvciB0aGUgYWJzdmFsIG5vcm1hbGl6YXRpb24gbWV0aG9kIG11c3QgYmUgcG9zaXRpdmUuIik7CisgICAgICAgIFN5c3RlbS5leGl0KDIxKTsKKyAgICAgIH0KKyAgICAgIGlmIChub3JtYWxpemF0aW9uT3B0aW9uc1syXSA9PSAwKSB7CisgICAgICAgIHByaW50bG4oIlVucmVjb2duaXplZCBmZWF0dXJlIG5hbWUgIiArIG5vcm1hbGl6YXRpb25PcHRpb25zWzJdCisgICAgICAgICAgICArICIgZm9yIGFic3ZhbCBub3JtYWxpemF0aW9uIG1ldGhvZC4iLCAxKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoMjEpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZHVtbXlBWzBdLmVxdWFscygibWF4YWJzdmFsIikpIHsKKyAgICAgIG5vcm1hbGl6YXRpb25PcHRpb25zWzBdID0gMjsKKyAgICAgIG5vcm1hbGl6YXRpb25PcHRpb25zWzFdID0gRG91YmxlLnBhcnNlRG91YmxlKGR1bW15QVsxXSk7CisgICAgICBpZiAobm9ybWFsaXphdGlvbk9wdGlvbnNbMV0gPD0gMCkgeworICAgICAgICBwcmludGxuKCJWYWx1ZSBmb3IgdGhlIG1heGFic3ZhbCBub3JtYWxpemF0aW9uIG1ldGhvZCBtdXN0IGJlIHBvc2l0aXZlLiIpOworICAgICAgICBTeXN0ZW0uZXhpdCgyMSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChkdW1teUFbMF0uZXF1YWxzKCJtaW5hYnN2YWwiKSkgeworICAgICAgbm9ybWFsaXphdGlvbk9wdGlvbnNbMF0gPSAzOworICAgICAgbm9ybWFsaXphdGlvbk9wdGlvbnNbMV0gPSBEb3VibGUucGFyc2VEb3VibGUoZHVtbXlBWzFdKTsKKyAgICAgIGlmIChub3JtYWxpemF0aW9uT3B0aW9uc1sxXSA8PSAwKSB7CisgICAgICAgIHByaW50bG4oIlZhbHVlIGZvciB0aGUgbWluYWJzdmFsIG5vcm1hbGl6YXRpb24gbWV0aG9kIG11c3QgYmUgcG9zaXRpdmUuIik7CisgICAgICAgIFN5c3RlbS5leGl0KDIxKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGR1bW15QVswXS5lcXVhbHMoIkxOb3JtIikpIHsKKyAgICAgIG5vcm1hbGl6YXRpb25PcHRpb25zWzBdID0gNDsKKyAgICAgIG5vcm1hbGl6YXRpb25PcHRpb25zWzFdID0gRG91YmxlLnBhcnNlRG91YmxlKGR1bW15QVsxXSk7CisgICAgICBub3JtYWxpemF0aW9uT3B0aW9uc1syXSA9IERvdWJsZS5wYXJzZURvdWJsZShkdW1teUFbMl0pOworICAgICAgaWYgKG5vcm1hbGl6YXRpb25PcHRpb25zWzFdIDw9IDAgfHwgbm9ybWFsaXphdGlvbk9wdGlvbnNbMl0gPD0gMCkgeworICAgICAgICBwcmludGxuKCJCb3RoIHZhbHVlcyBmb3IgdGhlIExOb3JtIG5vcm1hbGl6YXRpb24gbWV0aG9kIG11c3QgYmUgcG9zaXRpdmUuIik7CisgICAgICAgIFN5c3RlbS5leGl0KDIxKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRsbigiVW5yZWNvZ25pemVkIG5vcm1hbGl6YXRpb24gbWV0aG9kICIgKyBkdW1teUFbMF0gKyAiOyAiCisgICAgICAgICAgKyAibXVzdCBiZSBvbmUgb2Ygbm9uZSwgYWJzdmFsLCBtYXhhYnN2YWwsIGFuZCBMTm9ybS4iKTsKKyAgICAgIFN5c3RlbS5leGl0KDIxKTsKKyAgICB9IC8vIGlmIChkdW1teUFbMF0pCisKKyAgICBpbkZpbGVfaW5pdC5jbG9zZSgpOworICB9IC8vIHByb2Nlc3NQYXJhbUZpbGUoKQorCisgIHByaXZhdGUgdm9pZCBwcm9jZXNzRG9jSW5mbygpIHsKKyAgICAvLyBzZXRzIG51bURvY3VtZW50cyBhbmQgZG9jT2ZTZW50ZW5jZVtdCisgICAgZG9jT2ZTZW50ZW5jZSA9IG5ldyBpbnRbbnVtU2VudGVuY2VzXTsKKworICAgIGlmIChkb2NJbmZvRmlsZU5hbWUgPT0gbnVsbCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TZW50ZW5jZXM7ICsraSkKKyAgICAgICAgZG9jT2ZTZW50ZW5jZVtpXSA9IDA7CisgICAgICBudW1Eb2N1bWVudHMgPSAxOworICAgIH0gZWxzZSB7CisKKyAgICAgIHRyeSB7CisKKyAgICAgICAgLy8gNCBwb3NzaWJsZSBmb3JtYXRzOgorICAgICAgICAvLyAxKSBMaXN0IG9mIG51bWJlcnMsIG9uZSBwZXIgZG9jdW1lbnQsIGluZGljYXRpbmcgIyBzZW50ZW5jZXMgaW4gZWFjaCBkb2N1bWVudC4KKyAgICAgICAgLy8gMikgTGlzdCBvZiAiZG9jTmFtZSBzaXplIiBwYWlycywgb25lIHBlciBkb2N1bWVudCwgaW5kaWNhdGluZyBuYW1lIG9mIGRvY3VtZW50IGFuZCAjCisgICAgICAgIC8vIHNlbnRlbmNlcy4KKyAgICAgICAgLy8gMykgTGlzdCBvZiBkb2NOYW1lJ3MsIG9uZSBwZXIgc2VudGVuY2UsIGluZGljYXRpbmcgd2hpY2ggZG91bWVudCBlYWNoIHNlbnRlbmNlIGJlbG9uZ3MKKyAgICAgICAgLy8gdG8uCisgICAgICAgIC8vIDQpIExpc3Qgb2YgZG9jTmFtZV9udW1iZXIncywgb25lIHBlciBzZW50ZW5jZSwgaW5kaWNhdGluZyB3aGljaCBkb3VtZW50IGVhY2ggc2VudGVuY2UKKyAgICAgICAgLy8gYmVsb25ncyB0bywKKyAgICAgICAgLy8gYW5kIGl0cyBvcmRlciBpbiB0aGF0IGRvY3VtZW50LiAoY2FuIGFsc28gdXNlICctJyBpbnN0ZWFkIG9mICdfJykKKworICAgICAgICBpbnQgZG9jSW5mb1NpemUgPSBjb3VudE5vbkVtcHR5TGluZXMoZG9jSW5mb0ZpbGVOYW1lKTsKKworICAgICAgICBpZiAoZG9jSW5mb1NpemUgPCBudW1TZW50ZW5jZXMpIHsgLy8gZm9ybWF0ICMxIG9yICMyCisgICAgICAgICAgbnVtRG9jdW1lbnRzID0gZG9jSW5mb1NpemU7CisgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5GaWxlID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGRvY0luZm9GaWxlTmFtZSkpOworICAgICAgICAgIFN0cmluZyBsaW5lID0gaW5GaWxlLnJlYWRMaW5lKCk7CisgICAgICAgICAgYm9vbGVhbiBmb3JtYXQxID0gKCEobGluZS5jb250YWlucygiICIpKSk7CisKKyAgICAgICAgICBmb3IgKGludCBkb2MgPSAwOyBkb2MgPCBudW1Eb2N1bWVudHM7ICsrZG9jKSB7CisKKyAgICAgICAgICAgIGlmIChkb2MgIT0gMCkKKyAgICAgICAgICAgICAgbGluZSA9IGluRmlsZS5yZWFkTGluZSgpOworCisgICAgICAgICAgICBpbnQgZG9jU2l6ZSA9IDA7CisgICAgICAgICAgICBpZiAoZm9ybWF0MSkgeworICAgICAgICAgICAgICBkb2NTaXplID0gSW50ZWdlci5wYXJzZUludChsaW5lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGRvY1NpemUgPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUuc3BsaXQoIlxccysiKVsxXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaW50IGkyID0gMTsgaTIgPD0gZG9jU2l6ZTsgKytpMikgeworICAgICAgICAgICAgICBkb2NPZlNlbnRlbmNlW2ldID0gZG9jOworICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBub3cgaSA9PSBudW1TZW50ZW5jZXMKKworICAgICAgICAgIGluRmlsZS5jbG9zZSgpOworCisgICAgICAgIH0gZWxzZSBpZiAoZG9jSW5mb1NpemUgPT0gbnVtU2VudGVuY2VzKSB7IC8vIGZvcm1hdCAjMyBvciAjNAorCisgICAgICAgICAgYm9vbGVhbiBmb3JtYXQzID0gZmFsc2U7CisKKyAgICAgICAgICBIYXNoU2V0PFN0cmluZz4gc2VlblN0cmluZ3MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5GaWxlID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGRvY0luZm9GaWxlTmFtZSkpOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2VudGVuY2VzOyArK2kpIHsKKyAgICAgICAgICAgIC8vIHNldCBmb3JtYXQzID0gdHJ1ZSBpZiBhIGR1cGxpY2F0ZSBpcyBmb3VuZAorICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBpbkZpbGUucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGlmIChzZWVuU3RyaW5ncy5jb250YWlucyhsaW5lKSkKKyAgICAgICAgICAgICAgZm9ybWF0MyA9IHRydWU7CisgICAgICAgICAgICBzZWVuU3RyaW5ncy5hZGQobGluZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW5GaWxlLmNsb3NlKCk7CisKKyAgICAgICAgICBIYXNoU2V0PFN0cmluZz4gc2VlbkRvY05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBkb2NPcmRlciA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgICAvLyBtYXBzIGEgZG9jdW1lbnQgbmFtZSB0byB0aGUgb3JkZXIgKDAtaW5kZXhlZCkgaW4gd2hpY2ggaXQgd2FzIHNlZW4KKworICAgICAgICAgIGluRmlsZSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihkb2NJbmZvRmlsZU5hbWUpKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNlbnRlbmNlczsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGluRmlsZS5yZWFkTGluZSgpOworCisgICAgICAgICAgICBTdHJpbmcgZG9jTmFtZSA9ICIiOworICAgICAgICAgICAgaWYgKGZvcm1hdDMpIHsKKyAgICAgICAgICAgICAgZG9jTmFtZSA9IGxpbmU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpbnQgc2VwX2kgPSBNYXRoLm1heChsaW5lLmxhc3RJbmRleE9mKCdfJyksIGxpbmUubGFzdEluZGV4T2YoJy0nKSk7CisgICAgICAgICAgICAgIGRvY05hbWUgPSBsaW5lLnN1YnN0cmluZygwLCBzZXBfaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghc2VlbkRvY05hbWVzLmNvbnRhaW5zKGRvY05hbWUpKSB7CisgICAgICAgICAgICAgIHNlZW5Eb2NOYW1lcy5hZGQoZG9jTmFtZSk7CisgICAgICAgICAgICAgIGRvY09yZGVyLnB1dChkb2NOYW1lLCBzZWVuRG9jTmFtZXMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBkb2NPcmRlcl9pID0gZG9jT3JkZXIuZ2V0KGRvY05hbWUpOworCisgICAgICAgICAgICBkb2NPZlNlbnRlbmNlW2ldID0gZG9jT3JkZXJfaTsKKworICAgICAgICAgIH0KKworICAgICAgICAgIGluRmlsZS5jbG9zZSgpOworCisgICAgICAgICAgbnVtRG9jdW1lbnRzID0gc2VlbkRvY05hbWVzLnNpemUoKTsKKworICAgICAgICB9IGVsc2UgeyAvLyBiYWRseSBmb3JtYXR0ZWQKKworICAgICAgICB9CisKKyAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGluIEFkYUdyYWRDb3JlLnByb2Nlc3NEb2NJbmZvKCk6ICIKKyAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBTeXN0ZW0uZXhpdCg5OTkwMSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU9FeGNlcHRpb24gaW4gQWRhR3JhZENvcmUucHJvY2Vzc0RvY0luZm8oKTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoOTk5MDIpOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGNvcHlGaWxlKFN0cmluZyBvcmlnRmlsZU5hbWUsIFN0cmluZyBuZXdGaWxlTmFtZSkgeworICAgIHRyeSB7CisgICAgICBGaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKG9yaWdGaWxlTmFtZSk7CisgICAgICBGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShuZXdGaWxlTmFtZSk7CisKKyAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpOworICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOworCisgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICBpbnQgbGVuOworICAgICAgd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZmZlcikpID4gMCkgeworICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBsZW4pOworICAgICAgfQorICAgICAgaW4uY2xvc2UoKTsKKyAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAvKgorICAgICAgICogSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKG9yaWdGaWxlTmFtZSkpOyBCdWZmZXJlZFJlYWRlciBpbkZpbGUgPQorICAgICAgICogbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpblN0cmVhbSwgInV0ZjgiKSk7CisgICAgICAgKiAKKyAgICAgICAqIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3RmlsZU5hbWUsIGZhbHNlKTsgT3V0cHV0U3RyZWFtV3JpdGVyCisgICAgICAgKiBvdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dFN0cmVhbSwgInV0ZjgiKTsgQnVmZmVyZWRXcml0ZXIgb3V0RmlsZSA9IG5ldworICAgICAgICogQnVmZmVyZWRXcml0ZXIob3V0U3RyZWFtV3JpdGVyKTsKKyAgICAgICAqIAorICAgICAgICogU3RyaW5nIGxpbmU7IHdoaWxlKGluRmlsZS5yZWFkeSgpKSB7IGxpbmUgPSBpbkZpbGUucmVhZExpbmUoKTsgd3JpdGVMaW5lKGxpbmUsIG91dEZpbGUpOyB9CisgICAgICAgKiAKKyAgICAgICAqIGluRmlsZS5jbG9zZSgpOyBvdXRGaWxlLmNsb3NlKCk7CisgICAgICAgKi8KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpbiBBZGFHcmFkQ29yZS5jb3B5RmlsZShTdHJpbmcsU3RyaW5nKTogIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU9FeGNlcHRpb24gaW4gQWRhR3JhZENvcmUuY29weUZpbGUoU3RyaW5nLFN0cmluZyk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlbmFtZUZpbGUoU3RyaW5nIG9yaWdGaWxlTmFtZSwgU3RyaW5nIG5ld0ZpbGVOYW1lKSB7CisgICAgaWYgKGZpbGVFeGlzdHMob3JpZ0ZpbGVOYW1lKSkgeworICAgICAgZGVsZXRlRmlsZShuZXdGaWxlTmFtZSk7CisgICAgICBGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShvcmlnRmlsZU5hbWUpOworICAgICAgRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUobmV3RmlsZU5hbWUpOworICAgICAgaWYgKCFvbGRGaWxlLnJlbmFtZVRvKG5ld0ZpbGUpKSB7CisgICAgICAgIHByaW50bG4oIldhcm5pbmc6IGF0dGVtcHQgdG8gcmVuYW1lICIgKyBvcmlnRmlsZU5hbWUgKyAiIHRvICIgKyBuZXdGaWxlTmFtZQorICAgICAgICAgICAgKyAiIHdhcyB1bnN1Y2Nlc3NmdWwhIiwgMSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50bG4oIldhcm5pbmc6IGZpbGUgIiArIG9yaWdGaWxlTmFtZSArICIgZG9lcyBub3QgZXhpc3QhIChpbiBBZGFHcmFkQ29yZS5yZW5hbWVGaWxlKSIsIDEpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBkZWxldGVGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgIGlmIChmaWxlRXhpc3RzKGZpbGVOYW1lKSkgeworICAgICAgRmlsZSBmZCA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKyAgICAgIGlmICghZmQuZGVsZXRlKCkpIHsKKyAgICAgICAgcHJpbnRsbigiV2FybmluZzogYXR0ZW1wdCB0byBkZWxldGUgIiArIGZpbGVOYW1lICsgIiB3YXMgdW5zdWNjZXNzZnVsISIsIDEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZUxpbmUoU3RyaW5nIGxpbmUsIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZXIud3JpdGUobGluZSwgMCwgbGluZS5sZW5ndGgoKSk7CisgICAgd3JpdGVyLm5ld0xpbmUoKTsKKyAgICB3cml0ZXIuZmx1c2goKTsKKyAgfQorCisgIC8vIG5lZWQgdG8gcmUtd3JpdGUgdG8gaGFuZGxlIGRpZmZlcmVudCBmb3JtcyBvZiBsYW1iZGEKKyAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgIGlmIChteURlY29kZXIgIT0gbnVsbCkgeworICAgICAgbXlEZWNvZGVyLmNsZWFuVXAoKTsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgY29uZmlnIGZpbGUgd2l0aCBmaW5hbCB2YWx1ZXMKKyAgICBjcmVhdGVDb25maWdGaWxlKGxhbWJkYSwgZGVjb2RlckNvbmZpZ0ZpbGVOYW1lICsgIi5BZGFHcmFkLmZpbmFsIiwgZGVjb2RlckNvbmZpZ0ZpbGVOYW1lCisgICAgICAgICsgIi5BZGFHcmFkLm9yaWciKTsKKworICAgIC8vIGRlbGV0ZSBjdXJyZW50IGRlY29kZXIgY29uZmlnIGZpbGUgYW5kIGRlY29kZXIgb3V0cHV0CisgICAgZGVsZXRlRmlsZShkZWNvZGVyQ29uZmlnRmlsZU5hbWUpOworICAgIGRlbGV0ZUZpbGUoZGVjb2Rlck91dEZpbGVOYW1lKTsKKworICAgIC8vIHJlc3RvcmUgb3JpZ2luYWwgbmFtZSBmb3IgY29uZmlnIGZpbGUgKG5hbWUgd2FzIGNoYW5nZWQKKyAgICAvLyBpbiBpbml0aWFsaXplKCkgc28gaXQgZG9lc24ndCBnZXQgb3ZlcndyaXR0ZW4pCisgICAgcmVuYW1lRmlsZShkZWNvZGVyQ29uZmlnRmlsZU5hbWUgKyAiLkFkYUdyYWQub3JpZyIsIGRlY29kZXJDb25maWdGaWxlTmFtZSk7CisKKyAgICBpZiAoZmluYWxMYW1iZGFGaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBQcmludFdyaXRlciBvdXRGaWxlX2xhbWJkYXMgPSBuZXcgUHJpbnRXcml0ZXIoZmluYWxMYW1iZGFGaWxlTmFtZSk7CisgICAgICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IG51bVBhcmFtczsgKytjKSB7CisgICAgICAgICAgb3V0RmlsZV9sYW1iZGFzLnByaW50bG4oVm9jYWJ1bGFyeS53b3JkKGMpICsgIiB8fHwgIiArIGxhbWJkYS5nZXQoYykuZG91YmxlVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0RmlsZV9sYW1iZGFzLmNsb3NlKCk7CisKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJT0V4Y2VwdGlvbiBpbiBBZGFHcmFkQ29yZS5maW5pc2goKTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoOTk5MDIpOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmdbXSBjZmdGaWxlVG9BcmdzQXJyYXkoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgY2hlY2tGaWxlKGZpbGVOYW1lKTsKKworICAgIFZlY3RvcjxTdHJpbmc+IGFyZ3NWZWN0b3IgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKworICAgIEJ1ZmZlcmVkUmVhZGVyIGluRmlsZSA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGluRmlsZSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlTmFtZSkpOworICAgICAgU3RyaW5nIGxpbmUsIG9yaWdMaW5lOworICAgICAgZG8geworICAgICAgICBsaW5lID0gaW5GaWxlLnJlYWRMaW5lKCk7CisgICAgICAgIG9yaWdMaW5lID0gbGluZTsgLy8gZm9yIGVycm9yIHJlcG9ydGluZyBwdXJwb3NlcworCisgICAgICAgIGlmIChsaW5lICE9IG51bGwgJiYgbGluZS5sZW5ndGgoKSA+IDAgJiYgbGluZS5jaGFyQXQoMCkgIT0gJyMnKSB7CisKKyAgICAgICAgICBpZiAobGluZS5pbmRleE9mKCIjIikgIT0gLTEpIHsgLy8gZGlzY2FyZCBjb21tZW50CisgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5pbmRleE9mKCIjIikpOworICAgICAgICAgIH0KKworICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKKworICAgICAgICAgIC8vIG5vdyBsaW5lIHNob3VsZCBsb29rIGxpa2UgIi14eHggWFhYIgorCisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBPQlNPTEVURSBNT0RJRklDQVRJT04gLy9TUEVDSUFMIEhBTkRMSU5HIEZPUiBBZGFHcmFkIENMQVNTSUZJRVIgUEFSQU1FVEVSUyBTdHJpbmdbXQorICAgICAgICAgICAqIHBhcmFtQSA9IGxpbmUuc3BsaXQoIlxccysiKTsKKyAgICAgICAgICAgKiAKKyAgICAgICAgICAgKiBpZiggcGFyYW1BWzBdLmVxdWFscygiLWNsYXNzaWZpZXJQYXJhbXMiKSApIHsgU3RyaW5nIGNsYXNzaWZpZXJQYXJhbSA9ICIiOyBmb3IoaW50IHA9MTsKKyAgICAgICAgICAgKiBwPD1wYXJhbUEubGVuZ3RoLTE7IHArKykgY2xhc3NpZmllclBhcmFtICs9IHBhcmFtQVtwXSsiICI7CisgICAgICAgICAgICogCisgICAgICAgICAgICogaWYocGFyYW1BLmxlbmd0aD49MikgeyBTdHJpbmdbXSB0bXBQYXJhbUEgPSBuZXcgU3RyaW5nWzJdOyB0bXBQYXJhbUFbMF0gPSBwYXJhbUFbMF07CisgICAgICAgICAgICogdG1wUGFyYW1BWzFdID0gY2xhc3NpZmllclBhcmFtOyBwYXJhbUEgPSB0bXBQYXJhbUE7IH0gZWxzZSB7CisgICAgICAgICAgICogcHJpbnRsbigiTWFsZm9ybWVkIGxpbmUgaW4gY29uZmlnIGZpbGU6Iik7IHByaW50bG4ob3JpZ0xpbmUpOyBTeXN0ZW0uZXhpdCg3MCk7IH0gfS8vRU5ECisgICAgICAgICAgICogTU9ESUZJQ0FUSU9OCisgICAgICAgICAgICovCisKKyAgICAgICAgICAvLyBjbXUgbW9kaWZpY2F0aW9uKGZyb20gbWV0ZW9yIGZvciB6bWVydCkKKyAgICAgICAgICAvLyBQYXJzZSBhcmdzCisgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYXJnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYXJnID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICBib29sZWFuIHF1b3RlZCA9IGZhbHNlOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsaW5lLmNoYXJBdChpKSkpIHsKKyAgICAgICAgICAgICAgaWYgKHF1b3RlZCkKKyAgICAgICAgICAgICAgICBhcmcuYXBwZW5kKGxpbmUuY2hhckF0KGkpKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGFyZ0xpc3QuYWRkKGFyZy50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBhcmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuY2hhckF0KGkpID09ICdcJycpIHsKKyAgICAgICAgICAgICAgaWYgKHF1b3RlZCkgeworICAgICAgICAgICAgICAgIGFyZ0xpc3QuYWRkKGFyZy50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBhcmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHF1b3RlZCA9ICFxdW90ZWQ7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgYXJnLmFwcGVuZChsaW5lLmNoYXJBdChpKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChhcmcubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgYXJnTGlzdC5hZGQoYXJnLnRvU3RyaW5nKCkpOworICAgICAgICAgIC8vIENyZWF0ZSBwYXJhbUEKKyAgICAgICAgICBTdHJpbmdbXSBwYXJhbUEgPSBuZXcgU3RyaW5nW2FyZ0xpc3Quc2l6ZSgpXTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtQS5sZW5ndGg7IHBhcmFtQVtpXSA9IGFyZ0xpc3QuZ2V0KGkrKykpCisgICAgICAgICAgICA7CisgICAgICAgICAgLy8gRU5EIENNVSBNT0RJRklDQVRJT04KKworICAgICAgICAgIGlmIChwYXJhbUEubGVuZ3RoID09IDIgJiYgcGFyYW1BWzBdLmNoYXJBdCgwKSA9PSAnLScpIHsKKyAgICAgICAgICAgIGFyZ3NWZWN0b3IuYWRkKHBhcmFtQVswXSk7CisgICAgICAgICAgICBhcmdzVmVjdG9yLmFkZChwYXJhbUFbMV0pOworICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1BLmxlbmd0aCA+IDIgJiYgKHBhcmFtQVswXS5lcXVhbHMoIi1tIikgfHwgcGFyYW1BWzBdLmVxdWFscygiLWRvY1NldCIpKSkgeworICAgICAgICAgICAgLy8gLW0gKG1ldHJpY05hbWUpLCAtZG9jU2V0IGFyZSBhbGxvd2VkIHRvIGhhdmUgZXh0cmEgb3B0aW5vcworICAgICAgICAgICAgZm9yIChpbnQgb3B0ID0gMDsgb3B0IDwgcGFyYW1BLmxlbmd0aDsgKytvcHQpIHsKKyAgICAgICAgICAgICAgYXJnc1ZlY3Rvci5hZGQocGFyYW1BW29wdF0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGxuKCJNYWxmb3JtZWQgbGluZSBpbiBjb25maWcgZmlsZToiKTsKKyAgICAgICAgICAgIHByaW50bG4ob3JpZ0xpbmUpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoNzApOworICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICB9IHdoaWxlIChsaW5lICE9IG51bGwpOworCisgICAgICBpbkZpbGUuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgcHJpbnRsbigiQWRhR3JhZCBjb25maWd1cmF0aW9uIGZpbGUgIiArIGZpbGVOYW1lICsgIiB3YXMgbm90IGZvdW5kISIpOworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGaWxlTm90Rm91bmRFeGNlcHRpb24gaW4gQWRhR3JhZENvcmUuY2ZnRmlsZVRvQXJnc0FycmF5KFN0cmluZyk6ICIKKyAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIFN5c3RlbS5leGl0KDk5OTAxKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBTeXN0ZW0uZXJyCisgICAgICAgICAgLnByaW50bG4oIklPRXhjZXB0aW9uIGluIEFkYUdyYWRDb3JlLmNmZ0ZpbGVUb0FyZ3NBcnJheShTdHJpbmcpOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgU3lzdGVtLmV4aXQoOTk5MDIpOworICAgIH0KKworICAgIFN0cmluZ1tdIGFyZ3NBcnJheSA9IG5ldyBTdHJpbmdbYXJnc1ZlY3Rvci5zaXplKCldOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzVmVjdG9yLnNpemUoKTsgKytpKSB7CisgICAgICBhcmdzQXJyYXlbaV0gPSBhcmdzVmVjdG9yLmVsZW1lbnRBdChpKTsKKyAgICB9CisKKyAgICByZXR1cm4gYXJnc0FycmF5OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NBcmdzQXJyYXkoU3RyaW5nW10gYXJncykgeworICAgIHByb2Nlc3NBcmdzQXJyYXkoYXJncywgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHJvY2Vzc0FyZ3NBcnJheShTdHJpbmdbXSBhcmdzLCBib29sZWFuIGZpcnN0VGltZSkgeworICAgIC8qIHNldCBkZWZhdWx0IHZhbHVlcyAqLworICAgIC8vIFJlbGV2YW50IGZpbGVzCisgICAgZGlyUHJlZml4ID0gbnVsbDsKKyAgICBzb3VyY2VGaWxlTmFtZSA9IG51bGw7CisgICAgcmVmRmlsZU5hbWUgPSAicmVmZXJlbmNlLnR4dCI7CisgICAgcmVmc1BlclNlbiA9IDE7CisgICAgdGV4dE5vcm1NZXRob2QgPSAxOworICAgIHBhcmFtc0ZpbGVOYW1lID0gInBhcmFtcy50eHQiOworICAgIGRvY0luZm9GaWxlTmFtZSA9IG51bGw7CisgICAgZmluYWxMYW1iZGFGaWxlTmFtZSA9IG51bGw7CisgICAgLy8gTUVSVCBzcGVjcworICAgIG1ldHJpY05hbWUgPSAiQkxFVSI7CisgICAgbWV0cmljTmFtZV9kaXNwbGF5ID0gbWV0cmljTmFtZTsKKyAgICBtZXRyaWNPcHRpb25zID0gbmV3IFN0cmluZ1syXTsKKyAgICBtZXRyaWNPcHRpb25zWzBdID0gIjQiOworICAgIG1ldHJpY09wdGlvbnNbMV0gPSAiY2xvc2VzdCI7CisgICAgZG9jU3Vic2V0SW5mbyA9IG5ldyBpbnRbN107CisgICAgZG9jU3Vic2V0SW5mb1swXSA9IDA7CisgICAgbWF4TUVSVEl0ZXJhdGlvbnMgPSAyMDsKKyAgICBwcmV2TUVSVEl0ZXJhdGlvbnMgPSAyMDsKKyAgICBtaW5NRVJUSXRlcmF0aW9ucyA9IDU7CisgICAgc3RvcE1pbkl0cyA9IDM7CisgICAgc3RvcFNpZ1ZhbHVlID0gLTE7CisgICAgLy8KKyAgICAvLyAvKiBwb3NzaWJseSBvdGhlciBlYXJseSBzdG9wcGluZyBjcml0ZXJpYSBoZXJlICovCisgICAgLy8KKyAgICBudW1PcHRUaHJlYWRzID0gMTsKKyAgICBzYXZlSW50ZXJGaWxlcyA9IDM7CisgICAgY29tcHJlc3NGaWxlcyA9IDA7CisgICAgb25lTW9kaWZpY2F0aW9uUGVySXRlcmF0aW9uID0gZmFsc2U7CisgICAgcmFuZEluaXQgPSBmYWxzZTsKKyAgICBzZWVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgLy8gdXNlRGlzayA9IDI7CisgICAgLy8gRGVjb2RlciBzcGVjcworICAgIGRlY29kZXJDb21tYW5kRmlsZU5hbWUgPSBudWxsOworICAgIHBhc3NJdGVyYXRpb25Ub0RlY29kZXIgPSBmYWxzZTsKKyAgICBkZWNvZGVyT3V0RmlsZU5hbWUgPSAib3V0cHV0Lm5iZXN0IjsKKyAgICB2YWxpZERlY29kZXJFeGl0VmFsdWUgPSAwOworICAgIGRlY29kZXJDb25maWdGaWxlTmFtZSA9ICJkZWNfY2ZnLnR4dCI7CisgICAgc2l6ZU9mTkJlc3QgPSAxMDA7CisgICAgZmFrZUZpbGVOYW1lVGVtcGxhdGUgPSBudWxsOworICAgIGZha2VGaWxlTmFtZVByZWZpeCA9IG51bGw7CisgICAgZmFrZUZpbGVOYW1lU3VmZml4ID0gbnVsbDsKKyAgICAvLyBPdXRwdXQgc3BlY3MKKyAgICB2ZXJib3NpdHkgPSAxOworICAgIGRlY1ZlcmJvc2l0eSA9IDA7CisKKyAgICBpbnQgaSA9IDA7CisKKyAgICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7CisgICAgICBTdHJpbmcgb3B0aW9uID0gYXJnc1tpXTsKKyAgICAgIC8vIFJlbGV2YW50IGZpbGVzCisgICAgICBpZiAob3B0aW9uLmVxdWFscygiLWRpciIpKSB7CisgICAgICAgIGRpclByZWZpeCA9IGFyZ3NbaSArIDFdOworICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItcyIpKSB7CisgICAgICAgIHNvdXJjZUZpbGVOYW1lID0gYXJnc1tpICsgMV07CisgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1yIikpIHsKKyAgICAgICAgcmVmRmlsZU5hbWUgPSBhcmdzW2kgKyAxXTsKKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXJwcyIpKSB7CisgICAgICAgIHJlZnNQZXJTZW4gPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKHJlZnNQZXJTZW4gPCAxKSB7CisgICAgICAgICAgcHJpbnRsbigicmVmc1BlclNlbiBtdXN0IGJlIHBvc2l0aXZlLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItdHh0TnJtIikpIHsKKyAgICAgICAgdGV4dE5vcm1NZXRob2QgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKHRleHROb3JtTWV0aG9kIDwgMCB8fCB0ZXh0Tm9ybU1ldGhvZCA+IDQpIHsKKyAgICAgICAgICBwcmludGxuKCJ0ZXh0Tm9ybU1ldGhvZCBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCA0Iik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMTApOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1wIikpIHsKKyAgICAgICAgcGFyYW1zRmlsZU5hbWUgPSBhcmdzW2kgKyAxXTsKKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWRvY0luZm8iKSkgeworICAgICAgICBkb2NJbmZvRmlsZU5hbWUgPSBhcmdzW2kgKyAxXTsKKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWZpbiIpKSB7CisgICAgICAgIGZpbmFsTGFtYmRhRmlsZU5hbWUgPSBhcmdzW2kgKyAxXTsKKyAgICAgICAgLy8gTUVSVCBzcGVjcworICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbSIpKSB7CisgICAgICAgIG1ldHJpY05hbWUgPSBhcmdzW2kgKyAxXTsKKyAgICAgICAgbWV0cmljTmFtZV9kaXNwbGF5ID0gbWV0cmljTmFtZTsKKyAgICAgICAgaWYgKEV2YWx1YXRpb25NZXRyaWMua25vd25NZXRyaWNOYW1lKG1ldHJpY05hbWUpKSB7CisgICAgICAgICAgaW50IG9wdGlvbkNvdW50ID0gRXZhbHVhdGlvbk1ldHJpYy5tZXRyaWNPcHRpb25Db3VudChtZXRyaWNOYW1lKTsKKyAgICAgICAgICBtZXRyaWNPcHRpb25zID0gbmV3IFN0cmluZ1tvcHRpb25Db3VudF07CisgICAgICAgICAgZm9yIChpbnQgb3B0ID0gMDsgb3B0IDwgb3B0aW9uQ291bnQ7ICsrb3B0KSB7CisgICAgICAgICAgICBtZXRyaWNPcHRpb25zW29wdF0gPSBhcmdzW2kgKyBvcHQgKyAyXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaSArPSBvcHRpb25Db3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGxuKCJVbmtub3duIG1ldHJpYyBuYW1lICIgKyBtZXRyaWNOYW1lICsgIi4iKTsKKyAgICAgICAgICBTeXN0ZW0uZXhpdCgxMCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWRvY1NldCIpKSB7CisgICAgICAgIFN0cmluZyBtZXRob2QgPSBhcmdzW2kgKyAxXTsKKworICAgICAgICBpZiAobWV0aG9kLmVxdWFscygiYWxsIikpIHsKKyAgICAgICAgICBkb2NTdWJzZXRJbmZvWzBdID0gMDsKKyAgICAgICAgICBpICs9IDA7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmVxdWFscygiYm90dG9tIikpIHsKKyAgICAgICAgICBTdHJpbmcgYSA9IGFyZ3NbaSArIDJdOworICAgICAgICAgIGlmIChhLmVuZHNXaXRoKCJkIikpIHsKKyAgICAgICAgICAgIGRvY1N1YnNldEluZm9bMF0gPSAxOworICAgICAgICAgICAgYSA9IGEuc3Vic3RyaW5nKDAsIGEuaW5kZXhPZigiZCIpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9jU3Vic2V0SW5mb1swXSA9IDI7CisgICAgICAgICAgICBhID0gYS5zdWJzdHJpbmcoMCwgYS5pbmRleE9mKCIlIikpOworICAgICAgICAgIH0KKyAgICAgICAgICBkb2NTdWJzZXRJbmZvWzVdID0gSW50ZWdlci5wYXJzZUludChhKTsKKyAgICAgICAgICBpICs9IDE7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmVxdWFscygidG9wIikpIHsKKyAgICAgICAgICBTdHJpbmcgYSA9IGFyZ3NbaSArIDJdOworICAgICAgICAgIGlmIChhLmVuZHNXaXRoKCJkIikpIHsKKyAgICAgICAgICAgIGRvY1N1YnNldEluZm9bMF0gPSAzOworICAgICAgICAgICAgYSA9IGEuc3Vic3RyaW5nKDAsIGEuaW5kZXhPZigiZCIpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9jU3Vic2V0SW5mb1swXSA9IDQ7CisgICAgICAgICAgICBhID0gYS5zdWJzdHJpbmcoMCwgYS5pbmRleE9mKCIlIikpOworICAgICAgICAgIH0KKyAgICAgICAgICBkb2NTdWJzZXRJbmZvWzVdID0gSW50ZWdlci5wYXJzZUludChhKTsKKyAgICAgICAgICBpICs9IDE7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmVxdWFscygid2luZG93IikpIHsKKyAgICAgICAgICBTdHJpbmcgYTEgPSBhcmdzW2kgKyAyXTsKKyAgICAgICAgICBhMSA9IGExLnN1YnN0cmluZygwLCBhMS5pbmRleE9mKCJkIikpOyAvLyBzaXplIG9mIHdpbmRvdworICAgICAgICAgIFN0cmluZyBhMiA9IGFyZ3NbaSArIDRdOworICAgICAgICAgIGlmIChhMi5pbmRleE9mKCJwIikgPiAwKSB7CisgICAgICAgICAgICBkb2NTdWJzZXRJbmZvWzBdID0gNTsKKyAgICAgICAgICAgIGEyID0gYTIuc3Vic3RyaW5nKDAsIGEyLmluZGV4T2YoInAiKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvY1N1YnNldEluZm9bMF0gPSA2OworICAgICAgICAgICAgYTIgPSBhMi5zdWJzdHJpbmcoMCwgYTIuaW5kZXhPZigiciIpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZG9jU3Vic2V0SW5mb1s1XSA9IEludGVnZXIucGFyc2VJbnQoYTEpOworICAgICAgICAgIGRvY1N1YnNldEluZm9bNl0gPSBJbnRlZ2VyLnBhcnNlSW50KGEyKTsKKyAgICAgICAgICBpICs9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRsbigiVW5rbm93biBkb2NTZXQgbWV0aG9kICIgKyBtZXRob2QgKyAiLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbWF4SXQiKSkgeworICAgICAgICBtYXhNRVJUSXRlcmF0aW9ucyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgICBpZiAobWF4TUVSVEl0ZXJhdGlvbnMgPCAxKSB7CisgICAgICAgICAgcHJpbnRsbigibWF4SXQgbXVzdCBiZSBwb3NpdGl2ZS4iKTsKKyAgICAgICAgICBTeXN0ZW0uZXhpdCgxMCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLW1pbkl0IikpIHsKKyAgICAgICAgbWluTUVSVEl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKG1pbk1FUlRJdGVyYXRpb25zIDwgMSkgeworICAgICAgICAgIHByaW50bG4oIm1pbkl0IG11c3QgYmUgcG9zaXRpdmUuIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMTApOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1wcmV2SXQiKSkgeworICAgICAgICBwcmV2TUVSVEl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKHByZXZNRVJUSXRlcmF0aW9ucyA8IDApIHsKKyAgICAgICAgICBwcmludGxuKCJwcmV2SXQgbXVzdCBiZSBub24tbmVnYXRpdmUuIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMTApOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1zdG9wSXQiKSkgeworICAgICAgICBzdG9wTWluSXRzID0gSW50ZWdlci5wYXJzZUludChhcmdzW2kgKyAxXSk7CisgICAgICAgIGlmIChzdG9wTWluSXRzIDwgMSkgeworICAgICAgICAgIHByaW50bG4oInN0b3BJdHMgbXVzdCBiZSBwb3NpdGl2ZS4iKTsKKyAgICAgICAgICBTeXN0ZW0uZXhpdCgxMCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXN0b3BTaWciKSkgeworICAgICAgICBzdG9wU2lnVmFsdWUgPSBEb3VibGUucGFyc2VEb3VibGUoYXJnc1tpICsgMV0pOworICAgICAgfQorICAgICAgLy8KKyAgICAgIC8vIC8qIHBvc3NpYmx5IG90aGVyIGVhcmx5IHN0b3BwaW5nIGNyaXRlcmlhIGhlcmUgKi8KKyAgICAgIC8vCisgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItdGhyQ250IikpIHsKKyAgICAgICAgbnVtT3B0VGhyZWFkcyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgICBpZiAobnVtT3B0VGhyZWFkcyA8IDEpIHsKKyAgICAgICAgICBwcmludGxuKCJ0aHJlYWRDb3VudCBtdXN0IGJlIHBvc2l0aXZlLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItc2F2ZSIpKSB7CisgICAgICAgIHNhdmVJbnRlckZpbGVzID0gSW50ZWdlci5wYXJzZUludChhcmdzW2kgKyAxXSk7CisgICAgICAgIGlmIChzYXZlSW50ZXJGaWxlcyA8IDAgfHwgc2F2ZUludGVyRmlsZXMgPiAzKSB7CisgICAgICAgICAgcHJpbnRsbigic2F2ZSBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCAzIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMTApOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1jb21wcmVzcyIpKSB7CisgICAgICAgIGNvbXByZXNzRmlsZXMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKGNvbXByZXNzRmlsZXMgPCAwIHx8IGNvbXByZXNzRmlsZXMgPiAxKSB7CisgICAgICAgICAgcHJpbnRsbigiY29tcHJlc3NGaWxlcyBzaG91bGQgYmUgZWl0aGVyIDAgb3IgMSIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItb3BpIikpIHsKKyAgICAgICAgaW50IG9waSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgICBpZiAob3BpID09IDEpIHsKKyAgICAgICAgICBvbmVNb2RpZmljYXRpb25QZXJJdGVyYXRpb24gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKG9waSA9PSAwKSB7CisgICAgICAgICAgb25lTW9kaWZpY2F0aW9uUGVySXRlcmF0aW9uID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRsbigib25jZVBlckl0IG11c3QgYmUgZWl0aGVyIDAgb3IgMS4iKTsKKyAgICAgICAgICBTeXN0ZW0uZXhpdCgxMCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXJhbmQiKSkgeworICAgICAgICBpbnQgcmFuZCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgICBpZiAocmFuZCA9PSAxKSB7CisgICAgICAgICAgcmFuZEluaXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHJhbmQgPT0gMCkgeworICAgICAgICAgIHJhbmRJbml0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRsbigicmFuZEluaXQgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItc2VlZCIpKSB7CisgICAgICAgIGlmIChhcmdzW2kgKyAxXS5lcXVhbHMoInRpbWUiKSkgeworICAgICAgICAgIHNlZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWVkID0gTG9uZy5wYXJzZUxvbmcoYXJnc1tpICsgMV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKgorICAgICAgICogZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXVkIikpIHsgdXNlRGlzayA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpKzFdKTsgaWYgKHVzZURpc2sgPCAwIHx8CisgICAgICAgKiB1c2VEaXNrID4gMikgeyBwcmludGxuKCJ1c2VEaXNrIHNob3VsZCBiZSBiZXR3ZWVuIDAgYW5kIDIiKTsgU3lzdGVtLmV4aXQoMTApOyB9IH0KKyAgICAgICAqLworCisgICAgICAvLyBmb3IgYWRhZ3JhZDoKKyAgICAgIGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1uZWVkU2h1ZmZsZSIpKSB7CisgICAgICAgIGludCBzaHVmZmxlID0gSW50ZWdlci5wYXJzZUludChhcmdzW2kgKyAxXSk7CisgICAgICAgIGlmIChzaHVmZmxlID09IDEpCisgICAgICAgICAgbmVlZFNodWZmbGUgPSB0cnVlOworICAgICAgICBlbHNlIGlmIChzaHVmZmxlID09IDApCisgICAgICAgICAgbmVlZFNodWZmbGUgPSBmYWxzZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcHJpbnRsbigiLW5lZWRTaHVmZmxlIG11c3QgYmUgZWl0aGVyIDAgb3IgMS4iKTsKKyAgICAgICAgICBTeXN0ZW0uZXhpdCgxMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIGF2ZXJhZ2Ugd2VpZ2h0cyBhZnRlciBlYWNoIGVwb2NoIG9yIG5vdAorICAgICAgZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLW5lZWRBdmciKSkgeworICAgICAgICBpbnQgYXZnID0gSW50ZWdlci5wYXJzZUludChhcmdzW2kgKyAxXSk7CisgICAgICAgIGlmIChhdmcgPT0gMSkKKyAgICAgICAgICBuZWVkQXZnID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoYXZnID09IDApCisgICAgICAgICAgbmVlZEF2ZyA9IGZhbHNlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBwcmludGxuKCItbmVlZEF2ZyBtdXN0IGJlIGVpdGhlciAwIG9yIDEuIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMTApOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyByZXR1cm4gdGhlIGJlc3Qgd2VpZ2h0IGR1cmluZyB0dW5pbmcgb3Igbm90CisgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItcmV0dXJuQmVzdCIpKSB7CisgICAgICAgIGludCByZXRCZXN0ID0gSW50ZWdlci5wYXJzZUludChhcmdzW2kgKyAxXSk7CisgICAgICAgIGlmIChyZXRCZXN0ID09IDEpCisgICAgICAgICAgcmV0dXJuQmVzdCA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKHJldEJlc3QgPT0gMCkKKyAgICAgICAgICByZXR1cm5CZXN0ID0gZmFsc2U7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHByaW50bG4oIi1yZXR1cm5CZXN0IG11c3QgYmUgZWl0aGVyIDAgb3IgMS4iKTsKKyAgICAgICAgICBTeXN0ZW0uZXhpdCgxMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIG1pbmktYmF0Y2ggc2l6ZQorICAgICAgZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWJhdGNoU2l6ZSIpKSB7CisgICAgICAgIGJhdGNoU2l6ZSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgfQorICAgICAgLy8gcmVndWxhcml6YXRpb246IGwxIG9yIGwyCisgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItcmVndWxhcml6YXRpb24iKSkgeworICAgICAgICByZWd1bGFyaXphdGlvbiA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgfQorICAgICAgLy8gc3RlcCBzaXplIGNvZWZmaWNpZW50CisgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItZXRhIikpIHsKKyAgICAgICAgZXRhID0gRG91YmxlLnBhcnNlRG91YmxlKGFyZ3NbaSArIDFdKTsKKyAgICAgIH0KKyAgICAgIC8vIHJlZ3VsYXJpemF0aW9uIGNvZWZmaWNpZW50CisgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbGFtYmRhIikpIHsKKyAgICAgICAgbGFtID0gRG91YmxlLnBhcnNlRG91YmxlKGFyZ3NbaSArIDFdKTsKKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXJlZ3VsYXJpemF0aW9uIikpIHsKKyAgICAgICAgcmVndWxhcml6YXRpb24gPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgIH0KKyAgICAgIC8vIG9yYWNsZSBzZWxlY3Rpb24gbW9kZQorICAgICAgZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLW9yYWNsZVNlbGVjdGlvbiIpKSB7CisgICAgICAgIG9yYVNlbGVjdE1vZGUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgIH0KKyAgICAgIC8vIHByZWRpY3Rpb24gc2VsZWN0aW9uIG1vZGUKKyAgICAgIGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1wcmVkaWN0aW9uU2VsZWN0aW9uIikpIHsKKyAgICAgICAgcHJlZFNlbGVjdE1vZGUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgIH0KKyAgICAgIC8vIEFkYUdyYWQgaW50ZXJuYWwgaXRlcmF0aW9ucworICAgICAgZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWFkYWdyYWRJdGVyIikpIHsKKyAgICAgICAgYWRhZ3JhZEl0ZXIgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgIH0KKyAgICAgIC8vIGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1zZW50Rm9yU2NhbGluZyIpKSB7CisgICAgICAvLyBzZW50Rm9yU2NhbGUgPSBEb3VibGUucGFyc2VEb3VibGUoYXJnc1tpICsgMV0pOworICAgICAgLy8gaWYoc2VudEZvclNjYWxlPjEgfHwgc2VudEZvclNjYWxlPDApIHsKKyAgICAgIC8vIHByaW50bG4oIi1zZW50Rm9yU2NhbGluZyBtdXN0IGJlIGluIFswLDFdIik7CisgICAgICAvLyBTeXN0ZW0uZXhpdCgxMCk7CisgICAgICAvLyB9CisgICAgICAvLyB9CisgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItc2NvcmVSYXRpbyIpKSB7CisgICAgICAgIHNjb3JlUmF0aW8gPSBEb3VibGUucGFyc2VEb3VibGUoYXJnc1tpICsgMV0pOworICAgICAgICBpZiAoc2NvcmVSYXRpbyA8PSAwKSB7CisgICAgICAgICAgcHJpbnRsbigiLXNjb3JlUmF0aW8gbXVzdCBiZSBwb3NpdGl2ZSIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbmVlZFNjYWxpbmciKSkgeworICAgICAgICBpbnQgc2NhbGUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKHNjYWxlID09IDEpCisgICAgICAgICAgbmVlZFNjYWxlID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoc2NhbGUgPT0gMCkKKyAgICAgICAgICBuZWVkU2NhbGUgPSBmYWxzZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcHJpbnRsbigiLW5lZWRTY2FsaW5nIG11c3QgYmUgZWl0aGVyIDAgb3IgMS4iKTsKKyAgICAgICAgICBTeXN0ZW0uZXhpdCgxMCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXVzZVBzZXVkb0NvcnB1cyIpKSB7CisgICAgICAgIGludCB1c2UgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKHVzZSA9PSAxKQorICAgICAgICAgIHVzZVBzZXVkb0JsZXUgPSB0cnVlOworICAgICAgICBlbHNlIGlmICh1c2UgPT0gMCkKKyAgICAgICAgICB1c2VQc2V1ZG9CbGV1ID0gZmFsc2U7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHByaW50bG4oIi11c2VQc2V1ZG9Db3JwdXMgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItY29ycHVzRGVjYXkiKSkgeworICAgICAgICBSID0gRG91YmxlLnBhcnNlRG91YmxlKGFyZ3NbaSArIDFdKTsKKyAgICAgIH0KKworICAgICAgLy8gRGVjb2RlciBzcGVjcworICAgICAgZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWNtZCIpKSB7CisgICAgICAgIGRlY29kZXJDb21tYW5kRmlsZU5hbWUgPSBhcmdzW2kgKyAxXTsKKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXBhc3NJdCIpKSB7CisgICAgICAgIGludCB2YWwgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gMSkgeworICAgICAgICAgIHByaW50bG4oInBhc3NJdGVyYXRpb25Ub0RlY29kZXIgc2hvdWxkIGJlIGVpdGhlciAwIG9yIDEiKTsKKyAgICAgICAgICBTeXN0ZW0uZXhpdCgxMCk7CisgICAgICAgIH0KKyAgICAgICAgcGFzc0l0ZXJhdGlvblRvRGVjb2RlciA9ICh2YWwgPT0gMSkgPyB0cnVlIDogZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1kZWNPdXQiKSkgeworICAgICAgICBkZWNvZGVyT3V0RmlsZU5hbWUgPSBhcmdzW2kgKyAxXTsKKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWRlY0V4aXQiKSkgeworICAgICAgICB2YWxpZERlY29kZXJFeGl0VmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWRjZmciKSkgeworICAgICAgICBkZWNvZGVyQ29uZmlnRmlsZU5hbWUgPSBhcmdzW2kgKyAxXTsKKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLU4iKSkgeworICAgICAgICBzaXplT2ZOQmVzdCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgICBpZiAoc2l6ZU9mTkJlc3QgPCAxKSB7CisgICAgICAgICAgcHJpbnRsbigiTiBtdXN0IGJlIHBvc2l0aXZlLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gT3V0cHV0IHNwZWNzCisgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItdiIpKSB7CisgICAgICAgIHZlcmJvc2l0eSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgICBpZiAodmVyYm9zaXR5IDwgMCB8fCB2ZXJib3NpdHkgPiA0KSB7CisgICAgICAgICAgcHJpbnRsbigidmVyYm9zaXR5IHNob3VsZCBiZSBiZXR3ZWVuIDAgYW5kIDQiKTsKKyAgICAgICAgICBTeXN0ZW0uZXhpdCgxMCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWRlY1YiKSkgeworICAgICAgICBkZWNWZXJib3NpdHkgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKGRlY1ZlcmJvc2l0eSA8IDAgfHwgZGVjVmVyYm9zaXR5ID4gMSkgeworICAgICAgICAgIHByaW50bG4oImRlY1ZlcmJvc2l0eSBzaG91bGQgYmUgZWl0aGVyIDAgb3IgMSIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItZmFrZSIpKSB7CisgICAgICAgIGZha2VGaWxlTmFtZVRlbXBsYXRlID0gYXJnc1tpICsgMV07CisgICAgICAgIGludCBRTV9pID0gZmFrZUZpbGVOYW1lVGVtcGxhdGUuaW5kZXhPZigiPyIpOworICAgICAgICBpZiAoUU1faSA8PSAwKSB7CisgICAgICAgICAgcHJpbnRsbigiZmFrZUZpbGVOYW1lVGVtcGxhdGUgbXVzdCBjb250YWluICc/JyB0byBpbmRpY2F0ZSBwb3NpdGlvbiBvZiBpdGVyYXRpb24gbnVtYmVyIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMTApOworICAgICAgICB9CisgICAgICAgIGZha2VGaWxlTmFtZVByZWZpeCA9IGZha2VGaWxlTmFtZVRlbXBsYXRlLnN1YnN0cmluZygwLCBRTV9pKTsKKyAgICAgICAgZmFrZUZpbGVOYW1lU3VmZml4ID0gZmFrZUZpbGVOYW1lVGVtcGxhdGUuc3Vic3RyaW5nKFFNX2kgKyAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50bG4oIlVua25vd24gb3B0aW9uICIgKyBvcHRpb24pOworICAgICAgICBTeXN0ZW0uZXhpdCgxMCk7CisgICAgICB9CisKKyAgICAgIGkgKz0gMjsKKworICAgIH0gLy8gd2hpbGUgKGkpCisKKyAgICBpZiAobWF4TUVSVEl0ZXJhdGlvbnMgPCBtaW5NRVJUSXRlcmF0aW9ucykgeworCisgICAgICBpZiAoZmlyc3RUaW1lKQorICAgICAgICBwcmludGxuKCJXYXJuaW5nOiBtYXhNRVJUSXRzIGlzIHNtYWxsZXIgdGhhbiBtaW5NRVJUSXRzOyAiICsgImRlY3JlYXNpbmcgbWluTUVSVEl0cyBmcm9tICIKKyAgICAgICAgICAgICsgbWluTUVSVEl0ZXJhdGlvbnMgKyAiIHRvIG1heE1FUlRJdHMgIiArICIoaS5lLiAiICsgbWF4TUVSVEl0ZXJhdGlvbnMgKyAiKS4iLCAxKTsKKworICAgICAgbWluTUVSVEl0ZXJhdGlvbnMgPSBtYXhNRVJUSXRlcmF0aW9uczsKKyAgICB9CisKKyAgICBpZiAoZGlyUHJlZml4ICE9IG51bGwpIHsgLy8gYXBwZW5kIGRpclByZWZpeCB0byBmaWxlIG5hbWVzCisgICAgICByZWZGaWxlTmFtZSA9IGZ1bGxQYXRoKGRpclByZWZpeCwgcmVmRmlsZU5hbWUpOworICAgICAgZGVjb2Rlck91dEZpbGVOYW1lID0gZnVsbFBhdGgoZGlyUHJlZml4LCBkZWNvZGVyT3V0RmlsZU5hbWUpOworICAgICAgcGFyYW1zRmlsZU5hbWUgPSBmdWxsUGF0aChkaXJQcmVmaXgsIHBhcmFtc0ZpbGVOYW1lKTsKKyAgICAgIGRlY29kZXJDb25maWdGaWxlTmFtZSA9IGZ1bGxQYXRoKGRpclByZWZpeCwgZGVjb2RlckNvbmZpZ0ZpbGVOYW1lKTsKKworICAgICAgaWYgKHNvdXJjZUZpbGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgc291cmNlRmlsZU5hbWUgPSBmdWxsUGF0aChkaXJQcmVmaXgsIHNvdXJjZUZpbGVOYW1lKTsKKyAgICAgIH0KKyAgICAgIGlmIChkb2NJbmZvRmlsZU5hbWUgIT0gbnVsbCkgeworICAgICAgICBkb2NJbmZvRmlsZU5hbWUgPSBmdWxsUGF0aChkaXJQcmVmaXgsIGRvY0luZm9GaWxlTmFtZSk7CisgICAgICB9CisgICAgICBpZiAoZmluYWxMYW1iZGFGaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgIGZpbmFsTGFtYmRhRmlsZU5hbWUgPSBmdWxsUGF0aChkaXJQcmVmaXgsIGZpbmFsTGFtYmRhRmlsZU5hbWUpOworICAgICAgfQorICAgICAgaWYgKGRlY29kZXJDb21tYW5kRmlsZU5hbWUgIT0gbnVsbCkgeworICAgICAgICBkZWNvZGVyQ29tbWFuZEZpbGVOYW1lID0gZnVsbFBhdGgoZGlyUHJlZml4LCBkZWNvZGVyQ29tbWFuZEZpbGVOYW1lKTsKKyAgICAgIH0KKyAgICAgIGlmIChmYWtlRmlsZU5hbWVQcmVmaXggIT0gbnVsbCkgeworICAgICAgICBmYWtlRmlsZU5hbWVQcmVmaXggPSBmdWxsUGF0aChkaXJQcmVmaXgsIGZha2VGaWxlTmFtZVByZWZpeCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogbWFrZSB0aGlzIGFuIGFyZ3VtZW50CisgICAgLy8gVE9ETzogYWxzbyB1c2UgdGhpcyBmb3IgdGhlIHN0YXRlIGZpbGU/IGNvdWxkIGJlIHRyaWNreSwgc2luY2UgdGhhdCBmaWxlIGlzIGNyZWF0ZWQgYnkKKyAgICAvLyBaTUVSVC5qYXZhCisgICAgLy8gVE9ETzogY2hhbmdlIG5hbWUgZnJvbSB0bXBEaXJQcmVmaXggdG8gdG1wRmlsZVByZWZpeD8KKyAgICBpbnQgayA9IGRlY29kZXJPdXRGaWxlTmFtZS5sYXN0SW5kZXhPZigiLyIpOworICAgIGlmIChrID49IDApIHsKKyAgICAgIHRtcERpclByZWZpeCA9IGRlY29kZXJPdXRGaWxlTmFtZS5zdWJzdHJpbmcoMCwgayArIDEpICsgIkFkYUdyYWQuIjsKKyAgICB9IGVsc2UgeworICAgICAgdG1wRGlyUHJlZml4ID0gIkFkYUdyYWQuIjsKKyAgICB9CisgICAgcHJpbnRsbigidG1wRGlyUHJlZml4OiAiICsgdG1wRGlyUHJlZml4KTsKKworICAgIGNoZWNrRmlsZShwYXJhbXNGaWxlTmFtZSk7CisgICAgY2hlY2tGaWxlKGRlY29kZXJDb25maWdGaWxlTmFtZSk7CisKKyAgICBib29sZWFuIGNhblJ1bkNvbW1hbmQgPSBmaWxlRXhpc3RzKGRlY29kZXJDb21tYW5kRmlsZU5hbWUpOworICAgIGlmIChkZWNvZGVyQ29tbWFuZEZpbGVOYW1lICE9IG51bGwgJiYgIWNhblJ1bkNvbW1hbmQpIHsKKyAgICAgIC8vIGkuZS4gYSBkZWNvZGVyIGNvbW1hbmQgZmlsZSB3YXMgc3BlY2lmaWVkLCBidXQgaXQgd2FzIG5vdCBmb3VuZAorICAgICAgaWYgKGZpcnN0VGltZSkKKyAgICAgICAgcHJpbnRsbigiV2FybmluZzogc3BlY2lmaWVkIGRlY29kZXIgY29tbWFuZCBmaWxlICIgKyBkZWNvZGVyQ29tbWFuZEZpbGVOYW1lCisgICAgICAgICAgICArICIgd2FzIG5vdCBmb3VuZC4iLCAxKTsKKyAgICB9CisgICAgYm9vbGVhbiBjYW5SdW5Kb3NodWEgPSBmaWxlRXhpc3RzKHNvdXJjZUZpbGVOYW1lKTsKKyAgICBpZiAoc291cmNlRmlsZU5hbWUgIT0gbnVsbCAmJiAhY2FuUnVuSm9zaHVhKSB7CisgICAgICAvLyBpLmUuIGEgc291cmNlIGZpbGUgd2FzIHNwZWNpZmllZCwgYnV0IGl0IHdhcyBub3QgZm91bmQKKyAgICAgIGlmIChmaXJzdFRpbWUpCisgICAgICAgIHByaW50bG4oIldhcm5pbmc6IHNwZWNpZmllZCBzb3VyY2UgZmlsZSAiICsgc291cmNlRmlsZU5hbWUgKyAiIHdhcyBub3QgZm91bmQuIiwgMSk7CisgICAgfQorICAgIGJvb2xlYW4gY2FuUnVuRmFrZSA9IChmYWtlRmlsZU5hbWVUZW1wbGF0ZSAhPSBudWxsKTsKKworICAgIGlmICghY2FuUnVuQ29tbWFuZCAmJiAhY2FuUnVuSm9zaHVhKSB7IC8vIGNhbiBvbmx5IHJ1biBmYWtlIGRlY29kZXIKKworICAgICAgaWYgKCFjYW5SdW5GYWtlKSB7CisgICAgICAgIHByaW50bG4oIkFkYUdyYWQgY2Fubm90IGRlY29kZTsgbXVzdCBwcm92aWRlIG9uZSBvZjogY29tbWFuZCBmaWxlIChmb3IgZXh0ZXJuYWwgZGVjb2RlciksIik7CisgICAgICAgIHByaW50bG4oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZSAoZm9yIEpvc2h1YSBkZWNvZGVyKSwiKTsKKyAgICAgICAgcHJpbnRsbigiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHByZWZpeCBmb3IgZXhpc3Rpbmcgb3V0cHV0IGZpbGVzIChmb3IgZmFrZSBkZWNvZGVyKS4iKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoMTIpOworICAgICAgfQorCisgICAgICBpbnQgbGFzdEdvb2RJdCA9IDA7CisgICAgICBmb3IgKGludCBpdCA9IDE7IGl0IDw9IG1heE1FUlRJdGVyYXRpb25zOyArK2l0KSB7CisgICAgICAgIGlmIChmaWxlRXhpc3RzKGZha2VGaWxlTmFtZVByZWZpeCArIGl0ICsgZmFrZUZpbGVOYW1lU3VmZml4KSkgeworICAgICAgICAgIGxhc3RHb29kSXQgPSBpdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsgLy8gZnJvbSBmb3IgKGl0KSBsb29wCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGxhc3RHb29kSXQgPT0gMCkgeworICAgICAgICBwcmludGxuKCJGYWtlIGRlY29kZXIgY2Fubm90IGZpbmQgZmlyc3Qgb3V0cHV0IGZpbGUgIgorICAgICAgICAgICAgKyAoZmFrZUZpbGVOYW1lUHJlZml4ICsgMSArIGZha2VGaWxlTmFtZVN1ZmZpeCkpOworICAgICAgICBTeXN0ZW0uZXhpdCgxMyk7CisgICAgICB9IGVsc2UgaWYgKGxhc3RHb29kSXQgPCBtYXhNRVJUSXRlcmF0aW9ucykgeworICAgICAgICBpZiAoZmlyc3RUaW1lKQorICAgICAgICAgIHByaW50bG4oIldhcm5pbmc6IGNhbiBvbmx5IHJ1biBmYWtlIGRlY29kZXI7IGV4aXN0aW5nIG91dHB1dCBmaWxlcyAiCisgICAgICAgICAgICAgICsgImFyZSBvbmx5IGF2YWlsYWJsZSBmb3IgdGhlIGZpcnN0ICIgKyBsYXN0R29vZEl0ICsgIiBpdGVyYXRpb24ocykuIiwgMSk7CisgICAgICB9CisKKyAgICB9CisKKyAgICBpZiAocmVmc1BlclNlbiA+IDEpIHsKKyAgICAgIC8vIHRoZSBwcm92aWRlZCByZWZGaWxlTmFtZSBtaWdodCBiZSBhIHByZWZpeAorICAgICAgRmlsZSBkdW1teSA9IG5ldyBGaWxlKHJlZkZpbGVOYW1lKTsKKyAgICAgIGlmICghZHVtbXkuZXhpc3RzKCkpIHsKKyAgICAgICAgcmVmRmlsZU5hbWUgPSBjcmVhdGVVbmlmaWVkUmVmRmlsZShyZWZGaWxlTmFtZSwgcmVmc1BlclNlbik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNoZWNrRmlsZShyZWZGaWxlTmFtZSk7CisgICAgfQorCisgICAgaWYgKGZpcnN0VGltZSkgeworICAgICAgcHJpbnRsbigiUHJvY2Vzc2VkIHRoZSBmb2xsb3dpbmcgYXJncyBhcnJheToiLCAxKTsKKyAgICAgIHByaW50KCIgICIsIDEpOworICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgcHJpbnQoYXJnc1tpXSArICIgIiwgMSk7CisgICAgICB9CisgICAgICBwcmludGxuKCIiLCAxKTsKKyAgICAgIHByaW50bG4oIiIsIDEpOworICAgIH0KKworICB9IC8vIHByb2Nlc3NBcmdzKFN0cmluZ1tdIGFyZ3MpCisKKyAgcHJpdmF0ZSB2b2lkIHNldF9kb2NTdWJzZXRJbmZvKGludFtdIGluZm8pIHsKKworICAgIC8qCisgICAgICogMTogLWRvY1NldCBib3R0b20gOGQgMjogLWRvY1NldCBib3R0b20gMjUlIHRoZSBib3R0b20gY2VpbCgwLjIwKm51bURvY3MpIGRvY3VtZW50cyAzOiAtZG9jU2V0CisgICAgICogdG9wIDhkIDQ6IC1kb2NTZXQgdG9wIDI1JSB0aGUgdG9wIGNlaWwoMC4yMCpudW1Eb2NzKSBkb2N1bWVudHMKKyAgICAgKiAKKyAgICAgKiA1OiAtZG9jU2V0IHdpbmRvdyAxMWQgYXJvdW5kIDkwcGVyY2VudGlsZSAxMSBkb2NzIGNlbnRlcmVkIGFyb3VuZCA4MHRoIHBlcmNlbnRpbGUgKGNvbXBsYWluCisgICAgICogaWYgbm90IGVub3VnaCBkb2NzOyBkb24ndCBhZGp1c3QpIDY6IC1kb2NTZXQgd2luZG93IDExZCBhcm91bmQgNDByYW5rIDExIGRvY3MgY2VudGVyZWQgYXJvdW5kCisgICAgICogZG9jIHJhbmtlZCA1MCAoY29tcGxhaW4gaWYgbm90IGVub3VnaCBkb2NzOyBkb24ndCBhZGp1c3QpCisgICAgICogCisgICAgICogCisgICAgICogWzBdOiBtZXRob2QgKDAtNikgWzFdOiBmaXJzdCAoMS1pbmRleGVkKSBbMl06IGxhc3QgKDEtaW5kZXhlZCkgWzNdOiBzaXplIFs0XTogY2VudGVyIFs1XToKKyAgICAgKiBhcmcxICgtMSBmb3IgbWV0aG9kIDApIFs2XTogYXJnMiAoLTEgZm9yIG1ldGhvZHMgMC00KQorICAgICAqLworICAgIGlmIChpbmZvWzBdID09IDApIHsgLy8gYWxsCisgICAgICBpbmZvWzFdID0gMTsKKyAgICAgIGluZm9bMl0gPSBudW1Eb2N1bWVudHM7CisgICAgICBpbmZvWzNdID0gbnVtRG9jdW1lbnRzOworICAgICAgaW5mb1s0XSA9IChpbmZvWzFdICsgaW5mb1syXSkgLyAyOworICAgIH0KKyAgICBpZiAoaW5mb1swXSA9PSAxKSB7IC8vIGJvdHRvbSBkCisgICAgICBpbmZvWzNdID0gaW5mb1s1XTsKKyAgICAgIGluZm9bMl0gPSBudW1Eb2N1bWVudHM7CisgICAgICBpbmZvWzFdID0gbnVtRG9jdW1lbnRzIC0gaW5mb1szXSArIDE7CisgICAgICBpbmZvWzRdID0gKGluZm9bMV0gKyBpbmZvWzJdKSAvIDI7CisgICAgfQorICAgIGlmIChpbmZvWzBdID09IDIpIHsgLy8gYm90dG9tIHAKKyAgICAgIGluZm9bM10gPSAoaW50KSAoTWF0aC5jZWlsKChpbmZvWzVdIC8gMTAwLjApICogbnVtRG9jdW1lbnRzKSk7CisgICAgICBpbmZvWzJdID0gbnVtRG9jdW1lbnRzOworICAgICAgaW5mb1sxXSA9IG51bURvY3VtZW50cyAtIGluZm9bM10gKyAxOworICAgICAgaW5mb1s0XSA9IChpbmZvWzFdICsgaW5mb1syXSkgLyAyOworICAgIH0KKyAgICBpZiAoaW5mb1swXSA9PSAzKSB7IC8vIHRvcCBkCisgICAgICBpbmZvWzNdID0gaW5mb1s1XTsKKyAgICAgIGluZm9bMV0gPSAxOworICAgICAgaW5mb1syXSA9IGluZm9bM107CisgICAgICBpbmZvWzRdID0gKGluZm9bMV0gKyBpbmZvWzJdKSAvIDI7CisgICAgfQorICAgIGlmIChpbmZvWzBdID09IDQpIHsgLy8gdG9wIHAKKyAgICAgIGluZm9bM10gPSAoaW50KSAoTWF0aC5jZWlsKChpbmZvWzVdIC8gMTAwLjApICogbnVtRG9jdW1lbnRzKSk7CisgICAgICBpbmZvWzFdID0gMTsKKyAgICAgIGluZm9bMl0gPSBpbmZvWzNdOworICAgICAgaW5mb1s0XSA9IChpbmZvWzFdICsgaW5mb1syXSkgLyAyOworICAgIH0KKyAgICBpZiAoaW5mb1swXSA9PSA1KSB7IC8vIHdpbmRvdyBhcm91bmQgcGVyY2VudGlsZQorICAgICAgaW5mb1szXSA9IGluZm9bNV07CisgICAgICBpbmZvWzRdID0gKGludCkgKE1hdGguZmxvb3IoKGluZm9bNl0gLyAxMDAuMCkgKiBudW1Eb2N1bWVudHMpKTsKKyAgICAgIGluZm9bMV0gPSBpbmZvWzRdIC0gKChpbmZvWzNdIC0gMSkgLyAyKTsKKyAgICAgIGluZm9bMl0gPSBpbmZvWzRdICsgKChpbmZvWzNdIC0gMSkgLyAyKTsKKyAgICB9CisgICAgaWYgKGluZm9bMF0gPT0gNikgeyAvLyB3aW5kb3cgYXJvdW5kIHJhbmsKKyAgICAgIGluZm9bM10gPSBpbmZvWzVdOworICAgICAgaW5mb1s0XSA9IGluZm9bNl07CisgICAgICBpbmZvWzFdID0gaW5mb1s0XSAtICgoaW5mb1szXSAtIDEpIC8gMik7CisgICAgICBpbmZvWzJdID0gaW5mb1s0XSArICgoaW5mb1szXSAtIDEpIC8gMik7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHZvaWQgY2hlY2tGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgIGlmICghZmlsZUV4aXN0cyhmaWxlTmFtZSkpIHsKKyAgICAgIHByaW50bG4oIlRoZSBmaWxlICIgKyBmaWxlTmFtZSArICIgd2FzIG5vdCBmb3VuZCEiKTsKKyAgICAgIFN5c3RlbS5leGl0KDQwKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gZmlsZUV4aXN0cyhTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICBpZiAoZmlsZU5hbWUgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBGaWxlIGNoZWNrZXIgPSBuZXcgRmlsZShmaWxlTmFtZSk7CisgICAgcmV0dXJuIGNoZWNrZXIuZXhpc3RzKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ3ppcEZpbGUoU3RyaW5nIGlucHV0RmlsZU5hbWUpIHsKKyAgICBnemlwRmlsZShpbnB1dEZpbGVOYW1lLCBpbnB1dEZpbGVOYW1lICsgIi5neiIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGd6aXBGaWxlKFN0cmluZyBpbnB1dEZpbGVOYW1lLCBTdHJpbmcgZ3ppcHBlZEZpbGVOYW1lKSB7CisgICAgLy8gTk9URTogdGhpcyB3aWxsIGRlbGV0ZSB0aGUgb3JpZ2luYWwgZmlsZQorCisgICAgdHJ5IHsKKyAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlTmFtZSk7CisgICAgICBHWklQT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGd6aXBwZWRGaWxlTmFtZSkpOworCisgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICBpbnQgbGVuOworICAgICAgd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZmZlcikpID4gMCkgeworICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBsZW4pOworICAgICAgfQorCisgICAgICBpbi5jbG9zZSgpOworICAgICAgb3V0LmZpbmlzaCgpOworICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgIGRlbGV0ZUZpbGUoaW5wdXRGaWxlTmFtZSk7CisKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPRXhjZXB0aW9uIGluIEFkYUdyYWRDb3JlLmd6aXBGaWxlKFN0cmluZyxTdHJpbmcpOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgU3lzdGVtLmV4aXQoOTk5MDIpOworICAgIH0KKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICBwcml2YXRlIHZvaWQgZ3VuemlwRmlsZShTdHJpbmcgZ3ppcHBlZEZpbGVOYW1lKSB7CisgICAgaWYgKGd6aXBwZWRGaWxlTmFtZS5lbmRzV2l0aCgiLmd6IikpIHsKKyAgICAgIGd1bnppcEZpbGUoZ3ppcHBlZEZpbGVOYW1lLCBnemlwcGVkRmlsZU5hbWUuc3Vic3RyaW5nKDAsIGd6aXBwZWRGaWxlTmFtZS5sZW5ndGgoKSAtIDMpKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3VuemlwRmlsZShnemlwcGVkRmlsZU5hbWUsIGd6aXBwZWRGaWxlTmFtZSArICIuZGVjIik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGd1bnppcEZpbGUoU3RyaW5nIGd6aXBwZWRGaWxlTmFtZSwgU3RyaW5nIG91dHB1dEZpbGVOYW1lKSB7CisgICAgLy8gTk9URTogdGhpcyB3aWxsIGRlbGV0ZSB0aGUgb3JpZ2luYWwgZmlsZQorCisgICAgdHJ5IHsKKyAgICAgIEdaSVBJbnB1dFN0cmVhbSBpbiA9IG5ldyBHWklQSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShnemlwcGVkRmlsZU5hbWUpKTsKKyAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZU5hbWUpOworCisgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICBpbnQgbGVuOworICAgICAgd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZmZlcikpID4gMCkgeworICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBsZW4pOworICAgICAgfQorCisgICAgICBpbi5jbG9zZSgpOworICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgIGRlbGV0ZUZpbGUoZ3ppcHBlZEZpbGVOYW1lKTsKKworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU9FeGNlcHRpb24gaW4gQWRhR3JhZENvcmUuZ3VuemlwRmlsZShTdHJpbmcsU3RyaW5nKTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIFN5c3RlbS5leGl0KDk5OTAyKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFN0cmluZyBjcmVhdGVVbmlmaWVkUmVmRmlsZShTdHJpbmcgcHJlZml4LCBpbnQgbnVtRmlsZXMpIHsKKyAgICBpZiAobnVtRmlsZXMgPCAyKSB7CisgICAgICBwcmludGxuKCJXYXJuaW5nOiBjcmVhdGVVbmlmaWVkUmVmRmlsZSBjYWxsZWQgd2l0aCBudW1GaWxlcyA9ICIgKyBudW1GaWxlcyArICI7ICIKKyAgICAgICAgICArICJkb2luZyBub3RoaW5nLiIsIDEpOworICAgICAgcmV0dXJuIHByZWZpeDsKKyAgICB9IGVsc2UgeworICAgICAgRmlsZSBjaGVja2VyOworICAgICAgY2hlY2tlciA9IG5ldyBGaWxlKHByZWZpeCArICIxIik7CisKKyAgICAgIGlmICghY2hlY2tlci5leGlzdHMoKSkgeworICAgICAgICBjaGVja2VyID0gbmV3IEZpbGUocHJlZml4ICsgIi4xIik7CisgICAgICAgIGlmICghY2hlY2tlci5leGlzdHMoKSkgeworICAgICAgICAgIHByaW50bG4oIkNhbid0IGZpbmQgcmVmZXJlbmNlIGZpbGVzLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDUwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmVmaXggPSBwcmVmaXggKyAiLiI7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgU3RyaW5nIG91dEZpbGVOYW1lOworICAgICAgaWYgKHByZWZpeC5lbmRzV2l0aCgiLiIpKSB7CisgICAgICAgIG91dEZpbGVOYW1lID0gcHJlZml4ICsgImFsbCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXRGaWxlTmFtZSA9IHByZWZpeCArICIuYWxsIjsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0RmlsZSA9IG5ldyBQcmludFdyaXRlcihvdXRGaWxlTmFtZSk7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXJbXSBpbkZpbGUgPSBuZXcgQnVmZmVyZWRSZWFkZXJbbnVtRmlsZXNdOworCisgICAgICAgIGludCBuZXh0SW5kZXg7CisgICAgICAgIGNoZWNrZXIgPSBuZXcgRmlsZShwcmVmaXggKyAiMCIpOworICAgICAgICBpZiAoY2hlY2tlci5leGlzdHMoKSkgeworICAgICAgICAgIG5leHRJbmRleCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmV4dEluZGV4ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbGluZUNvdW50ID0gY291bnRMaW5lcyhwcmVmaXggKyBuZXh0SW5kZXgpOworCisgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgbnVtRmlsZXM7ICsrcikgeworICAgICAgICAgIGlmIChjb3VudExpbmVzKHByZWZpeCArIG5leHRJbmRleCkgIT0gbGluZUNvdW50KSB7CisgICAgICAgICAgICBwcmludGxuKCJMaW5lIGNvdW50IG1pc21hdGNoIGluICIgKyAocHJlZml4ICsgbmV4dEluZGV4KSArICIuIik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCg2MCk7CisgICAgICAgICAgfQorICAgICAgICAgIElucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShwcmVmaXggKyBuZXh0SW5kZXgpKTsKKyAgICAgICAgICBpbkZpbGVbcl0gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluU3RyZWFtLCAidXRmOCIpKTsKKyAgICAgICAgICArK25leHRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBsaW5lOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZUNvdW50OyArK2kpIHsKKyAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IG51bUZpbGVzOyArK3IpIHsKKyAgICAgICAgICAgIGxpbmUgPSBpbkZpbGVbcl0ucmVhZExpbmUoKTsKKyAgICAgICAgICAgIG91dEZpbGUucHJpbnRsbihsaW5lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRGaWxlLmNsb3NlKCk7CisKKyAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBudW1GaWxlczsgKytyKSB7CisgICAgICAgICAgaW5GaWxlW3JdLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIFN5c3RlbS5lcnIKKyAgICAgICAgICAgIC5wcmludGxuKCJGaWxlTm90Rm91bmRFeGNlcHRpb24gaW4gQWRhR3JhZENvcmUuY3JlYXRlVW5pZmllZFJlZkZpbGUoU3RyaW5nLGludCk6ICIKKyAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoOTk5MDEpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPRXhjZXB0aW9uIGluIEFkYUdyYWRDb3JlLmNyZWF0ZVVuaWZpZWRSZWZGaWxlKFN0cmluZyxpbnQpOiAiCisgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoOTk5MDIpOworICAgICAgfQorCisgICAgICByZXR1cm4gb3V0RmlsZU5hbWU7CisKKyAgICB9CisKKyAgfSAvLyBjcmVhdGVVbmlmaWVkUmVmRmlsZShTdHJpbmcgcHJlZml4LCBpbnQgbnVtRmlsZXMpCisKKyAgcHJpdmF0ZSBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBzdHIsIGludCBub3JtTWV0aG9kKSB7CisgICAgaWYgKG5vcm1NZXRob2QgPT0gMCkKKyAgICAgIHJldHVybiBzdHI7CisKKyAgICAvLyByZXBsYWNlIEhUTUwvU0dNTAorICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKCImcXVvdDsiLCAiXCIiKTsKKyAgICBzdHIgPSBzdHIucmVwbGFjZUFsbCgiJmFtcDsiLCAiJiIpOworICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKCImbHQ7IiwgIjwiKTsKKyAgICBzdHIgPSBzdHIucmVwbGFjZUFsbCgiJmd0OyIsICI+Iik7CisgICAgc3RyID0gc3RyLnJlcGxhY2VBbGwoIiZhcG9zOyIsICInIik7CisKKyAgICAvLyBzcGxpdCBvbiB0aGVzZSBjaGFyYWN0ZXJzOgorICAgIC8vICEgIiAjICQgJSAmICggKSAqICsgLyA6IDsgPCA9ID4gPyBAIFsgXCBdIF4gXyBgIHsgfCB9IH4KKyAgICAvLyBpLmUuIEFTQ0lJIDMzLTEyNiwgZXhjZXB0IGFscGhhbnVtZXJpYywgYW5kIGV4Y2VwdCAiLCIgIi0iICIuIiAiJyIKKworICAgIC8vICEgIiMgJCUmICggKSAqICsvOjs8PT4gP0AgWyBcIF0gXl9gIHsgfCB9fgorICAgIFN0cmluZyBzcGxpdF9vbiA9ICIhXCIjXFwkJSZcXChcXClcXCpcXCsvOjs8PT5cXD9AXFxbXFxcXFxcXVxcXl9gXFx7XFx8XFx9fiI7CisKKyAgICAvLyBwcmludGxuKCJzcGxpdF9vbjogIiArIHNwbGl0X29uKTsKKworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc3BsaXRfb24ubGVuZ3RoKCk7ICsraykgeworICAgICAgLy8gZm9yIGVhY2ggc3BsaXQgY2hhcmFjdGVyLCByZXByb2Nlc3MgdGhlIHN0cmluZworICAgICAgU3RyaW5nIHJlZ2V4ID0gIiIgKyBzcGxpdF9vbi5jaGFyQXQoayk7CisgICAgICBpZiAocmVnZXguZXF1YWxzKCJcXCIpKSB7CisgICAgICAgICsrazsKKyAgICAgICAgcmVnZXggKz0gc3BsaXRfb24uY2hhckF0KGspOworICAgICAgfQorICAgICAgc3RyID0gc3RyLnJlcGxhY2VBbGwocmVnZXgsICIgIiArIHJlZ2V4ICsgIiAiKTsKKyAgICB9CisKKyAgICAvLyBzcGxpdCBvbiAiLiIgYW5kICIsIiBhbmQgIi0iLCBjb25kaXRpb25lZCBvbiBwcm9wZXIgY29udGV4dAorCisgICAgc3RyID0gIiAiICsgc3RyICsgIiAiOworICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKCJcXHMrIiwgIiAiKTsKKworICAgIFRyZWVTZXQ8SW50ZWdlcj4gc3BsaXRJbmRpY2VzID0gbmV3IFRyZWVTZXQ8SW50ZWdlcj4oKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOworICAgICAgaWYgKGNoID09ICcuJyB8fCBjaCA9PSAnLCcpIHsKKyAgICAgICAgLy8gc3BsaXQgaWYgZWl0aGVyIG9mIHRoZSBwcmV2aW91cyBvciBuZXh0IGNoYXJhY3RlcnMgaXMgYSBub24tZGlnaXQKKyAgICAgICAgY2hhciBwcmV2X2NoID0gc3RyLmNoYXJBdChpIC0gMSk7CisgICAgICAgIGNoYXIgbmV4dF9jaCA9IHN0ci5jaGFyQXQoaSArIDEpOworICAgICAgICBpZiAocHJldl9jaCA8ICcwJyB8fCBwcmV2X2NoID4gJzknIHx8IG5leHRfY2ggPCAnMCcgfHwgbmV4dF9jaCA+ICc5JykgeworICAgICAgICAgIHNwbGl0SW5kaWNlcy5hZGQoaSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgIC8vIHNwbGl0IGlmIHByZWNlZGVkIGJ5IGEgZGlnaXQKKyAgICAgICAgY2hhciBwcmV2X2NoID0gc3RyLmNoYXJBdChpIC0gMSk7CisgICAgICAgIGlmIChwcmV2X2NoID49ICcwJyAmJiBwcmV2X2NoIDw9ICc5JykgeworICAgICAgICAgIHNwbGl0SW5kaWNlcy5hZGQoaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmcgc3RyMCA9IHN0cjsKKyAgICBzdHIgPSAiIjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyMC5sZW5ndGgoKTsgKytpKSB7CisgICAgICBpZiAoc3BsaXRJbmRpY2VzLmNvbnRhaW5zKGkpKSB7CisgICAgICAgIHN0ciArPSAiICIgKyBzdHIwLmNoYXJBdChpKSArICIgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ciArPSBzdHIwLmNoYXJBdChpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZWpvaW4gaSdtLCB3ZSdyZSwgKidzLCB3b24ndCwgZG9uJ3QsIGV0YworCisgICAgc3RyID0gIiAiICsgc3RyICsgIiAiOworICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKCJcXHMrIiwgIiAiKTsKKworICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKCIgaSAnbSAiLCAiIGknbSAiKTsKKyAgICBzdHIgPSBzdHIucmVwbGFjZUFsbCgiIHdlICdyZSAiLCAiIHdlJ3JlICIpOworICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKCIgJ3MgIiwgIidzICIpOworICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKCIgJ3ZlICIsICIndmUgIik7CisgICAgc3RyID0gc3RyLnJlcGxhY2VBbGwoIiAnbGwgIiwgIidsbCAiKTsKKyAgICBzdHIgPSBzdHIucmVwbGFjZUFsbCgiICdkICIsICInZCAiKTsKKyAgICBzdHIgPSBzdHIucmVwbGFjZUFsbCgiIG4ndCAiLCAibid0ICIpOworCisgICAgLy8gcmVtb3ZlIHNwYWNlcyBhcm91bmQgZGFzaGVzCisgICAgaWYgKG5vcm1NZXRob2QgPT0gMiB8fCBub3JtTWV0aG9kID09IDQpIHsKKworICAgICAgVHJlZVNldDxJbnRlZ2VyPiBza2lwSW5kaWNlcyA9IG5ldyBUcmVlU2V0PEludGVnZXI+KCk7CisgICAgICBzdHIgPSAiICIgKyBzdHIgKyAiICI7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAvLyByZWpvaW4gaWYgc3Vycm91bmRlZCBieSBzcGFjZXMsIGFuZCB0aGVuIGxldHRlcnMKKyAgICAgICAgICBpZiAoc3RyLmNoYXJBdChpIC0gMSkgPT0gJyAnICYmIHN0ci5jaGFyQXQoaSArIDEpID09ICcgJykgeworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcihzdHIuY2hhckF0KGkgLSAyKSkgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyKHN0ci5jaGFyQXQoaSArIDIpKSkgeworICAgICAgICAgICAgICBza2lwSW5kaWNlcy5hZGQoaSAtIDEpOworICAgICAgICAgICAgICBza2lwSW5kaWNlcy5hZGQoaSArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBzdHIwID0gc3RyOworICAgICAgc3RyID0gIiI7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyMC5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIGlmICghc2tpcEluZGljZXMuY29udGFpbnMoaSkpIHsKKyAgICAgICAgICBzdHIgKz0gc3RyMC5jaGFyQXQoaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkcm9wIG5vbi1BU0NJSSBjaGFyYWN0ZXJzCisgICAgaWYgKG5vcm1NZXRob2QgPT0gMyB8fCBub3JtTWV0aG9kID09IDQpIHsKKworICAgICAgc3RyMCA9IHN0cjsKKyAgICAgIHN0ciA9ICIiOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cjAubGVuZ3RoKCk7ICsraSkgeworICAgICAgICBjaGFyIGNoID0gc3RyMC5jaGFyQXQoaSk7CisgICAgICAgIGlmIChjaCA8PSAxMjcpIHsgLy8gaS5lLiBpZiBBU0NJSQorICAgICAgICAgIHN0ciArPSBjaDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKCJcXHMrIiwgIiAiKTsKKworICAgIHN0ciA9IHN0ci50cmltKCk7CisKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgcHJpdmF0ZSBpbnQgY291bnRMaW5lcyhTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICBpbnQgY291bnQgPSAwOworCisgICAgdHJ5IHsKKyAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluRmlsZSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlTmFtZSkpOworCisgICAgICBTdHJpbmcgbGluZTsKKyAgICAgIGRvIHsKKyAgICAgICAgbGluZSA9IGluRmlsZS5yZWFkTGluZSgpOworICAgICAgICBpZiAobGluZSAhPSBudWxsKQorICAgICAgICAgICsrY291bnQ7CisgICAgICB9IHdoaWxlIChsaW5lICE9IG51bGwpOworCisgICAgICBpbkZpbGUuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPRXhjZXB0aW9uIGluIEFkYUdyYWRDb3JlLmNvdW50TGluZXMoU3RyaW5nKTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIFN5c3RlbS5leGl0KDk5OTAyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7CisgIH0KKworICBwcml2YXRlIGludCBjb3VudE5vbkVtcHR5TGluZXMoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgaW50IGNvdW50ID0gMDsKKworICAgIHRyeSB7CisgICAgICBCdWZmZXJlZFJlYWRlciBpbkZpbGUgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZU5hbWUpKTsKKworICAgICAgU3RyaW5nIGxpbmU7CisgICAgICBkbyB7CisgICAgICAgIGxpbmUgPSBpbkZpbGUucmVhZExpbmUoKTsKKyAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCAmJiBsaW5lLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICArK2NvdW50OworICAgICAgfSB3aGlsZSAobGluZSAhPSBudWxsKTsKKworICAgICAgaW5GaWxlLmNsb3NlKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgU3lzdGVtLmVycgorICAgICAgICAgIC5wcmludGxuKCJJT0V4Y2VwdGlvbiBpbiBBZGFHcmFkQ29yZS5jb3VudE5vbkVtcHR5TGluZXMoU3RyaW5nKTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIFN5c3RlbS5leGl0KDk5OTAyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBmdWxsUGF0aChTdHJpbmcgZGlyLCBTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICBGaWxlIGR1bW15RmlsZSA9IG5ldyBGaWxlKGRpciwgZmlsZU5hbWUpOworICAgIHJldHVybiBkdW1teUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgcHJpdmF0ZSB2b2lkIGNsZWFudXBNZW1vcnkoKSB7CisgICAgY2xlYW51cE1lbW9yeSgxMDAsIGZhbHNlKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICBwcml2YXRlIHZvaWQgY2xlYW51cE1lbW9yeVNpbGVudGx5KCkgeworICAgIGNsZWFudXBNZW1vcnkoMTAwLCB0cnVlKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJzdGF0aWMtYWNjZXNzIikKKyAgcHJpdmF0ZSB2b2lkIGNsZWFudXBNZW1vcnkoaW50IHJlcHMsIGJvb2xlYW4gc2lsZW50KSB7CisgICAgaW50IGJ5dGVzUGVyTUIgPSAxMDI0ICogMTAyNDsKKworICAgIGxvbmcgdG90YWxNZW1CZWZvcmUgPSBteVJ1bnRpbWUudG90YWxNZW1vcnkoKTsKKyAgICBsb25nIGZyZWVNZW1CZWZvcmUgPSBteVJ1bnRpbWUuZnJlZU1lbW9yeSgpOworICAgIGxvbmcgdXNlZE1lbUJlZm9yZSA9IHRvdGFsTWVtQmVmb3JlIC0gZnJlZU1lbUJlZm9yZTsKKworICAgIGxvbmcgdXNlZEN1cnIgPSB1c2VkTWVtQmVmb3JlOworICAgIGxvbmcgdXNlZFByZXYgPSB1c2VkQ3VycjsKKworICAgIC8vIHBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uIHJlcGVhdGVkbHksIHVudGlsIHRoZXJlIGlzIG5vIGRlY3JlYXNlIGluCisgICAgLy8gdGhlIGFtb3VudCBvZiB1c2VkIG1lbW9yeQorICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IHJlcHM7ICsraSkgeworICAgICAgbXlSdW50aW1lLnJ1bkZpbmFsaXphdGlvbigpOworICAgICAgbXlSdW50aW1lLmdjKCk7CisgICAgICAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkueWllbGQoKTsKKworICAgICAgdXNlZFByZXYgPSB1c2VkQ3VycjsKKyAgICAgIHVzZWRDdXJyID0gbXlSdW50aW1lLnRvdGFsTWVtb3J5KCkgLSBteVJ1bnRpbWUuZnJlZU1lbW9yeSgpOworCisgICAgICBpZiAodXNlZEN1cnIgPT0gdXNlZFByZXYpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghc2lsZW50KSB7CisgICAgICBsb25nIHRvdGFsTWVtQWZ0ZXIgPSBteVJ1bnRpbWUudG90YWxNZW1vcnkoKTsKKyAgICAgIGxvbmcgZnJlZU1lbUFmdGVyID0gbXlSdW50aW1lLmZyZWVNZW1vcnkoKTsKKyAgICAgIGxvbmcgdXNlZE1lbUFmdGVyID0gdG90YWxNZW1BZnRlciAtIGZyZWVNZW1BZnRlcjsKKworICAgICAgcHJpbnRsbigiR0M6IGRfdXNlZCA9ICIgKyAoKHVzZWRNZW1BZnRlciAtIHVzZWRNZW1CZWZvcmUpIC8gYnl0ZXNQZXJNQikgKyAiIE1CICIKKyAgICAgICAgICArICIoZF90b3QgPSAiICsgKCh0b3RhbE1lbUFmdGVyIC0gdG90YWxNZW1CZWZvcmUpIC8gYnl0ZXNQZXJNQikgKyAiIE1CKS4iLCAyKTsKKyAgICB9CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgcHJpdmF0ZSB2b2lkIHByaW50TWVtb3J5VXNhZ2UoKSB7CisgICAgaW50IGJ5dGVzUGVyTUIgPSAxMDI0ICogMTAyNDsKKyAgICBsb25nIHRvdGFsTWVtID0gbXlSdW50aW1lLnRvdGFsTWVtb3J5KCk7CisgICAgbG9uZyBmcmVlTWVtID0gbXlSdW50aW1lLmZyZWVNZW1vcnkoKTsKKyAgICBsb25nIHVzZWRNZW0gPSB0b3RhbE1lbSAtIGZyZWVNZW07CisKKyAgICBwcmludGxuKCJBbGxvY2F0ZWQgbWVtb3J5OiAiICsgKHRvdGFsTWVtIC8gYnl0ZXNQZXJNQikgKyAiIE1CICIgKyAiKG9mIHdoaWNoICIKKyAgICAgICAgKyAodXNlZE1lbSAvIGJ5dGVzUGVyTUIpICsgIiBNQiBpcyBiZWluZyB1c2VkKS4iLCAyKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcmludGxuKE9iamVjdCBvYmosIGludCBwcmlvcml0eSkgeworICAgIGlmIChwcmlvcml0eSA8PSB2ZXJib3NpdHkpCisgICAgICBwcmludGxuKG9iaik7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHJpbnQoT2JqZWN0IG9iaiwgaW50IHByaW9yaXR5KSB7CisgICAgaWYgKHByaW9yaXR5IDw9IHZlcmJvc2l0eSkKKyAgICAgIHByaW50KG9iaik7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHJpbnRsbihPYmplY3Qgb2JqKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKG9iaik7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHJpbnQoT2JqZWN0IG9iaikgeworICAgIFN5c3RlbS5vdXQucHJpbnQob2JqKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICBwcml2YXRlIHZvaWQgc2hvd1Byb2dyZXNzKCkgeworICAgICsrcHJvZ3Jlc3M7CisgICAgaWYgKHByb2dyZXNzICUgMTAwMDAwID09IDApCisgICAgICBwcmludCgiLiIsIDIpOworICB9CisKKyAgcHJpdmF0ZSBBcnJheUxpc3Q8RG91YmxlPiByYW5kb21MYW1iZGEoKSB7CisgICAgQXJyYXlMaXN0PERvdWJsZT4gcmV0TGFtYmRhID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KDEgKyBudW1QYXJhbXMpOworCisgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gbnVtUGFyYW1zOyArK2MpIHsKKyAgICAgIGlmIChpc09wdGltaXphYmxlW2NdKSB7CisgICAgICAgIGRvdWJsZSByYW5kVmFsID0gcmFuZEdlbi5uZXh0RG91YmxlKCk7IC8vIG51bWJlciBpbiBbMC4wLDEuMF0KKyAgICAgICAgKytnZW5lcmF0ZWRSYW5kczsKKyAgICAgICAgcmFuZFZhbCA9IHJhbmRWYWwgKiAobWF4UmFuZFZhbHVlW2NdIC0gbWluUmFuZFZhbHVlW2NdKTsgLy8gbnVtYmVyIGluIFswLjAsbWF4LW1pbl0KKyAgICAgICAgcmFuZFZhbCA9IG1pblJhbmRWYWx1ZVtjXSArIHJhbmRWYWw7IC8vIG51bWJlciBpbiBbbWluLG1heF0KKyAgICAgICAgcmV0TGFtYmRhLnNldChjLCByYW5kVmFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldExhbWJkYS5zZXQoYywgZGVmYXVsdExhbWJkYVtjXSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldExhbWJkYTsKKyAgfQorCisgIHByaXZhdGUgZG91YmxlW10gcmFuZG9tUGVydHVyYmF0aW9uKGRvdWJsZVtdIG9yaWdMYW1iZGEsIGludCBpLCBkb3VibGUgbWV0aG9kLCBkb3VibGUgcGFyYW0sCisgICAgICBkb3VibGUgbXVsdCkgeworICAgIGRvdWJsZSBzaWdtYSA9IDAuMDsKKyAgICBpZiAobWV0aG9kID09IDEpIHsKKyAgICAgIHNpZ21hID0gMS4wIC8gTWF0aC5wb3coaSwgcGFyYW0pOworICAgIH0gZWxzZSBpZiAobWV0aG9kID09IDIpIHsKKyAgICAgIHNpZ21hID0gTWF0aC5leHAoLXBhcmFtICogaSk7CisgICAgfSBlbHNlIGlmIChtZXRob2QgPT0gMykgeworICAgICAgc2lnbWEgPSBNYXRoLm1heCgwLjAsIDEuMCAtIChpIC8gcGFyYW0pKTsKKyAgICB9CisKKyAgICBzaWdtYSA9IG11bHQgKiBzaWdtYTsKKworICAgIGRvdWJsZVtdIHJldExhbWJkYSA9IG5ldyBkb3VibGVbMSArIG51bVBhcmFtc107CisKKyAgICBmb3IgKGludCBjID0gMTsgYyA8PSBudW1QYXJhbXM7ICsrYykgeworICAgICAgaWYgKGlzT3B0aW1pemFibGVbY10pIHsKKyAgICAgICAgZG91YmxlIHJhbmRWYWwgPSAyICogcmFuZEdlbi5uZXh0RG91YmxlKCkgLSAxLjA7IC8vIG51bWJlciBpbiBbLTEuMCwxLjBdCisgICAgICAgICsrZ2VuZXJhdGVkUmFuZHM7CisgICAgICAgIHJhbmRWYWwgPSByYW5kVmFsICogc2lnbWE7IC8vIG51bWJlciBpbiBbLXNpZ21hLHNpZ21hXQorICAgICAgICByYW5kVmFsID0gcmFuZFZhbCAqIG9yaWdMYW1iZGFbY107IC8vIG51bWJlciBpbiBbLXNpZ21hKm9yaWdbY10sc2lnbWEqb3JpZ1tjXV0KKyAgICAgICAgcmFuZFZhbCA9IHJhbmRWYWwgKyBvcmlnTGFtYmRhW2NdOyAvLyBudW1iZXIgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbb3JpZ1tjXS1zaWdtYSpvcmlnW2NdLG9yaWdbY10rc2lnbWEqb3JpZ1tjXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA9IFtvcmlnW2NdKigxLXNpZ21hKSxvcmlnW2NdKigxK3NpZ21hKV0KKyAgICAgICAgcmV0TGFtYmRhW2NdID0gcmFuZFZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldExhbWJkYVtjXSA9IG9yaWdMYW1iZGFbY107CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldExhbWJkYTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICBwcml2YXRlIEhhc2hTZXQ8SW50ZWdlcj4gaW5kaWNlc1RvRGlzY2FyZChkb3VibGVbXSBzbG9wZSwgZG91YmxlW10gb2Zmc2V0KSB7CisgICAgLy8gc29tZSBsaW5lcyBjYW4gYmUgZWxpbWluYXRlZDogdGhlIG9uZXMgdGhhdCBoYXZlIGEgbG93ZXIgb2Zmc2V0CisgICAgLy8gdGhhbiBzb21lIG90aGVyIGxpbmUgd2l0aCB0aGUgc2FtZSBzbG9wZS4KKyAgICAvLyBUaGF0IGlzLCBmb3IgYW55IGsxIGFuZCBrMjoKKyAgICAvLyBpZiBzbG9wZVtrMV0gPSBzbG9wZVtrMl0gYW5kIG9mZnNldFtrMV0gPiBvZmZzZXRbazJdLAorICAgIC8vIHRoZW4gazIgY2FuIGJlIGVsaW1pbmF0ZWQuCisgICAgLy8gKFRoaXMgaXMgYWN0dWFsbHkgaW1wb3J0YW50IHRvIGRvIGFzIGl0IGVsaW1pbmF0ZXMgYSBidWcuKQorICAgIC8vIHByaW50KCJkaXNjYXJkaW5nOiAiLDQpOworCisgICAgaW50IG51bUNhbmRpZGF0ZXMgPSBzbG9wZS5sZW5ndGg7CisgICAgSGFzaFNldDxJbnRlZ2VyPiBkaXNjYXJkZWRJbmRpY2VzID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKyAgICBIYXNoTWFwPERvdWJsZSwgSW50ZWdlcj4gaW5kaWNlc09mU2xvcGVzID0gbmV3IEhhc2hNYXA8RG91YmxlLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgc2xvcGUgdG8gaW5kZXggb2YgYmVzdCBjYW5kaWRhdGUgdGhhdCBoYXMgdGhhdCBzbG9wZS4KKyAgICAvLyAoImJlc3QiIGFzIGluIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdCBvZmZzZXQpCisKKyAgICBmb3IgKGludCBrMSA9IDA7IGsxIDwgbnVtQ2FuZGlkYXRlczsgKytrMSkgeworICAgICAgZG91YmxlIGN1cnJTbG9wZSA9IHNsb3BlW2sxXTsKKyAgICAgIGlmICghaW5kaWNlc09mU2xvcGVzLmNvbnRhaW5zS2V5KGN1cnJTbG9wZSkpIHsKKyAgICAgICAgaW5kaWNlc09mU2xvcGVzLnB1dChjdXJyU2xvcGUsIGsxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBleGlzdGluZ0luZGV4ID0gaW5kaWNlc09mU2xvcGVzLmdldChjdXJyU2xvcGUpOworICAgICAgICBpZiAob2Zmc2V0W2V4aXN0aW5nSW5kZXhdID4gb2Zmc2V0W2sxXSkgeworICAgICAgICAgIGRpc2NhcmRlZEluZGljZXMuYWRkKGsxKTsKKyAgICAgICAgICAvLyBwcmludChrMSArICIgIiw0KTsKKyAgICAgICAgfSBlbHNlIGlmIChvZmZzZXRbazFdID4gb2Zmc2V0W2V4aXN0aW5nSW5kZXhdKSB7CisgICAgICAgICAgaW5kaWNlc09mU2xvcGVzLnB1dChjdXJyU2xvcGUsIGsxKTsKKyAgICAgICAgICBkaXNjYXJkZWRJbmRpY2VzLmFkZChleGlzdGluZ0luZGV4KTsKKyAgICAgICAgICAvLyBwcmludChleGlzdGluZ0luZGV4ICsgIiAiLDQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gb2xkIHdheSBvZiBkb2luZyBpdDsgdGFrZXMgcXVhZHJhdGljIHRpbWUgKHZzLiBsaW5lYXIgdGltZSBhYm92ZSkKKyAgICAvKgorICAgICAqIGZvciAoaW50IGsxID0gMDsgazEgPCBudW1DYW5kaWRhdGVzOyArK2sxKSB7IGZvciAoaW50IGsyID0gMDsgazIgPCBudW1DYW5kaWRhdGVzOyArK2syKSB7IGlmCisgICAgICogKGsxICE9IGsyICYmIHNsb3BlW2sxXSA9PSBzbG9wZVtrMl0gJiYgb2Zmc2V0W2sxXSA+IG9mZnNldFtrMl0pIHsgZGlzY2FyZGVkSW5kaWNlcy5hZGQoazIpOworICAgICAqIC8vIHByaW50KGsyICsgIiAiLDQpOyB9IH0gfQorICAgICAqLworCisgICAgLy8gcHJpbnRsbigiIiw0KTsKKyAgICByZXR1cm4gZGlzY2FyZGVkSW5kaWNlczsKKyAgfSAvLyBpbmRpY2VzVG9EaXNjYXJkKGRvdWJsZVtdIHNsb3BlLCBkb3VibGVbXSBvZmZzZXQpCit9CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2FkYWdyYWQvT3B0aW1pemVyLmphdmEgYi9zcmMvam9zaHVhL2FkYWdyYWQvT3B0aW1pemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTI3MGUxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qb3NodWEvYWRhZ3JhZC9PcHRpbWl6ZXIuamF2YQpAQCAtMCwwICsxLDcxMCBAQAorcGFja2FnZSBqb3NodWEuYWRhZ3JhZDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CisKK2ltcG9ydCBqb3NodWEuY29ycHVzLlZvY2FidWxhcnk7CitpbXBvcnQgam9zaHVhLm1ldHJpY3MuRXZhbHVhdGlvbk1ldHJpYzsKKworLy8gdGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBBZGFHcmFkIGFsZ29yaXRobQorcHVibGljIGNsYXNzIE9wdGltaXplciB7CisgICAgcHVibGljIE9wdGltaXplcihWZWN0b3I8U3RyaW5nPl9vdXRwdXQsIGJvb2xlYW5bXSBfaXNPcHRpbWl6YWJsZSwgZG91YmxlW10gX2luaXRpYWxMYW1iZGEsCisgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPltdIF9mZWF0X2hhc2gsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+W10gX3N0YXRzX2hhc2gpIHsKKyAgICBvdXRwdXQgPSBfb3V0cHV0OyAvLyAobm90IHVzZWQgZm9yIG5vdykKKyAgICBpc09wdGltaXphYmxlID0gX2lzT3B0aW1pemFibGU7CisgICAgaW5pdGlhbExhbWJkYSA9IF9pbml0aWFsTGFtYmRhOyAvLyBpbml0aWFsIHdlaWdodHMgYXJyYXkKKyAgICBwYXJhbURpbSA9IGluaXRpYWxMYW1iZGEubGVuZ3RoIC0gMTsgICAgCisgICAgaW5pdGlhbExhbWJkYSA9IF9pbml0aWFsTGFtYmRhOworICAgIGZlYXRfaGFzaCA9IF9mZWF0X2hhc2g7IC8vIGZlYXR1cmUgaGFzaCB0YWJsZQorICAgIHN0YXRzX2hhc2ggPSBfc3RhdHNfaGFzaDsgLy8gc3VmZi4gc3RhdHMgaGFzaCB0YWJsZQorICAgIGZpbmFsTGFtYmRhID0gbmV3IGRvdWJsZVtpbml0aWFsTGFtYmRhLmxlbmd0aF07CisgICAgZm9yKGludCBpID0gMDsgaSA8IGZpbmFsTGFtYmRhLmxlbmd0aDsgaSsrKQorICAgICAgZmluYWxMYW1iZGFbaV0gPSBpbml0aWFsTGFtYmRhW2ldOworICB9CisKKyAgLy9ydW4gQWRhR3JhZCBmb3Igb25lIGVwb2NoCisgIHB1YmxpYyBkb3VibGVbXSBydW5PcHRpbWl6ZXIoKSB7CisgICAgICBMaXN0PEludGVnZXI+IHNlbnRzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBzZW50TnVtOyArK2kgKQorCSAgc2VudHMuYWRkKGkpOworICAgICAgZG91YmxlW10gYXZnTGFtYmRhID0gbmV3IGRvdWJsZVtpbml0aWFsTGFtYmRhLmxlbmd0aF07IC8vb25seSBuZWVkZWQgaWYgYXZlcmFnaW5nIGlzIHJlcXVpcmVkCisgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGluaXRpYWxMYW1iZGEubGVuZ3RoOyArK2kgKQorCSAgYXZnTGFtYmRhW2ldID0gMDsKKyAgICAgIGZvciAoIGludCBpdGVyID0gMDsgaXRlciA8IGFkYWdyYWRJdGVyOyArK2l0ZXIgKSB7CisJICBTeXN0ZW0uYXJyYXljb3B5KGZpbmFsTGFtYmRhLCAxLCBpbml0aWFsTGFtYmRhLCAxLCBwYXJhbURpbSk7CisgICAgCSAgaWYobmVlZFNodWZmbGUpCisJICAgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShzZW50cyk7CisgICAgCisJICBkb3VibGUgb3JhTWV0cmljLCBvcmFTY29yZSwgcHJlZE1ldHJpYywgcHJlZFNjb3JlOworCSAgZG91YmxlW10gb3JhUHJlZFNjb3JlID0gbmV3IGRvdWJsZVs0XTsKKwkgIGRvdWJsZSBsb3NzID0gMDsKKwkgIGRvdWJsZSBkaWZmID0gMDsKKwkgIGRvdWJsZSBzdW1NZXRyaWNTY29yZSA9IDA7CisJICBkb3VibGUgc3VtTW9kZWxTY29yZSA9IDA7CisJICBTdHJpbmcgb3JhRmVhdCA9ICIiOworCSAgU3RyaW5nIHByZWRGZWF0ID0gIiI7CisJICBTdHJpbmdbXSBvcmFQcmVkRmVhdCA9IG5ldyBTdHJpbmdbMl07CisJICBTdHJpbmdbXSB2ZWNPcmFGZWF0OworCSAgU3RyaW5nW10gdmVjUHJlZEZlYXQ7CisJICBTdHJpbmdbXSBmZWF0SW5mbzsKKwkgIGludCB0aGlzQmF0Y2hTaXplID0gMDsKKwkgIGludCBudW1CYXRjaCA9IDA7CisJICBpbnQgbnVtVXBkYXRlID0gMDsKKwkgIEl0ZXJhdG9yIGl0OworCSAgSW50ZWdlciBkaWZmRmVhdElkOworCisJICAvL3VwZGF0ZSB3ZWlnaHRzCisJICBJbnRlZ2VyIHM7CisJICBpbnQgc2VudENvdW50ID0gMDsKKwkgIGRvdWJsZSBwcmV2TGFtYmRhID0gMDsKKwkgIGRvdWJsZSBkaWZmRmVhdFZhbCA9IDA7CisJICBkb3VibGUgb2xkVmFsID0gMDsKKwkgIGRvdWJsZSBnZFN0ZXAgPSAwOworCSAgZG91YmxlIEhpaSA9IDA7CisJICBkb3VibGUgZ3JhZGlpU3F1YXJlID0gMDsKKwkgIGludCBsYXN0VXBkYXRlVGltZSA9IDA7CisJICBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+IGxhc3RVcGRhdGUgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOworCSAgSGFzaE1hcDxJbnRlZ2VyLCBEb3VibGU+IGxhc3RWYWwgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBEb3VibGU+KCk7CisJICBIYXNoTWFwPEludGVnZXIsIERvdWJsZT4gSCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIERvdWJsZT4oKTsKKwkgIHdoaWxlKCBzZW50Q291bnQgPCBzZW50TnVtICkgeworCSAgICAgIGxvc3MgPSAwOworCSAgICAgIHRoaXNCYXRjaFNpemUgPSBiYXRjaFNpemU7CisJICAgICAgKytudW1CYXRjaDsKKwkgICAgICBIYXNoTWFwPEludGVnZXIsIERvdWJsZT4gZmVhdERpZmYgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBEb3VibGU+KCk7CisJICAgICAgZm9yKGludCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiICkgeworCQkgIC8vZmluZCBvdXQgb3JhY2xlIGFuZCBwcmVkaWN0aW9uCisJCSAgcyA9IHNlbnRzLmdldChzZW50Q291bnQpOworCQkgIGZpbmRPcmFQcmVkKHMsIG9yYVByZWRTY29yZSwgb3JhUHJlZEZlYXQsIGZpbmFsTGFtYmRhLCBmZWF0U2NhbGUpOworICAgICAgCisJCSAgLy90aGUgbW9kZWwgc2NvcmVzIGhlcmUgYXJlIGFscmVhZHkgc2NhbGVkIGluIGZpbmRPcmFQcmVkCisJCSAgb3JhTWV0cmljID0gb3JhUHJlZFNjb3JlWzBdOworCQkgIG9yYVNjb3JlID0gb3JhUHJlZFNjb3JlWzFdOworCQkgIHByZWRNZXRyaWMgPSBvcmFQcmVkU2NvcmVbMl07CisJCSAgcHJlZFNjb3JlID0gb3JhUHJlZFNjb3JlWzNdOworCQkgIG9yYUZlYXQgPSBvcmFQcmVkRmVhdFswXTsKKwkJICBwcmVkRmVhdCA9IG9yYVByZWRGZWF0WzFdOworICAgICAgCisJCSAgLy91cGRhdGUgdGhlIHNjYWxlCisJCSAgaWYobmVlZFNjYWxlKSB7IC8vb3RoZXJ3aXNlIGZlYXRzY2FsZSByZW1haW5zIDEuMAorCQkgICAgICBzdW1NZXRyaWNTY29yZSArPSBNYXRoLmFicyhvcmFNZXRyaWMgKyBwcmVkTWV0cmljKTsKKwkJICAgICAgLy9yZXN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCBzY29yZQorCQkgICAgICBzdW1Nb2RlbFNjb3JlICs9IE1hdGguYWJzKG9yYVNjb3JlICsgcHJlZFNjb3JlKSAvIGZlYXRTY2FsZTsKKyAgICAgICAgCisJCSAgICAgIGlmKHN1bU1vZGVsU2NvcmUvc3VtTWV0cmljU2NvcmUgPiBzY29yZVJhdGlvKQorCQkJICBmZWF0U2NhbGUgPSBzdW1NZXRyaWNTY29yZS9zdW1Nb2RlbFNjb3JlOworCQkgIH0KKwkJICAvLyBwcm9jZXNzZWRTZW50Kys7CisgICAgICAKKwkJICB2ZWNPcmFGZWF0ID0gb3JhRmVhdC5zcGxpdCgiXFxzKyIpOworCQkgIHZlY1ByZWRGZWF0ID0gcHJlZEZlYXQuc3BsaXQoIlxccysiKTsKKworCQkgIC8vYWNjdW11bGF0ZSBkaWZmZXJlbmNlIGZlYXR1cmUgdmVjdG9yCisJCSAgaWYgKCBiID09IDAgKSB7CisJCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVjT3JhRmVhdC5sZW5ndGg7IGkrKykgeworCQkJICBmZWF0SW5mbyA9IHZlY09yYUZlYXRbaV0uc3BsaXQoIj0iKTsKKwkJCSAgZGlmZkZlYXRJZCA9IEludGVnZXIucGFyc2VJbnQoZmVhdEluZm9bMF0pOworCQkJICBmZWF0RGlmZi5wdXQoZGlmZkZlYXRJZCwgRG91YmxlLnBhcnNlRG91YmxlKGZlYXRJbmZvWzFdKSk7CisJCSAgICAgIH0KKwkJICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWNQcmVkRmVhdC5sZW5ndGg7IGkrKykgeworCQkJICBmZWF0SW5mbyA9IHZlY1ByZWRGZWF0W2ldLnNwbGl0KCI9Iik7CisJCQkgIGRpZmZGZWF0SWQgPSBJbnRlZ2VyLnBhcnNlSW50KGZlYXRJbmZvWzBdKTsKKwkJCSAgaWYgKGZlYXREaWZmLmNvbnRhaW5zS2V5KGRpZmZGZWF0SWQpKSB7IC8vb3ZlcmxhcHBpbmcgZmVhdHVyZXMKKwkJCSAgICAgIGRpZmYgPSBmZWF0RGlmZi5nZXQoZGlmZkZlYXRJZCktRG91YmxlLnBhcnNlRG91YmxlKGZlYXRJbmZvWzFdKTsKKwkJCSAgICAgIGlmICggTWF0aC5hYnMoZGlmZikgPiAxZS0yMCApCisJCQkJICBmZWF0RGlmZi5wdXQoZGlmZkZlYXRJZCwgZGlmZik7CisJCQkgICAgICBlbHNlCisJCQkJICBmZWF0RGlmZi5yZW1vdmUoZGlmZkZlYXRJZCk7CisJCQkgIH0KKwkJCSAgZWxzZSAvL2ZlYXR1cmVzIG9ubHkgZmlyaW5nIGluIHRoZSAybmQgZmVhdHVyZSB2ZWN0b3IKKwkJCSAgICAgIGZlYXREaWZmLnB1dChkaWZmRmVhdElkLCAtMS4wKkRvdWJsZS5wYXJzZURvdWJsZShmZWF0SW5mb1sxXSkpOworCQkgICAgICB9CisJCSAgfSBlbHNlIHsKKwkJICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWNPcmFGZWF0Lmxlbmd0aDsgaSsrKSB7CisJCQkgIGZlYXRJbmZvID0gdmVjT3JhRmVhdFtpXS5zcGxpdCgiPSIpOworCQkJICBkaWZmRmVhdElkID0gSW50ZWdlci5wYXJzZUludChmZWF0SW5mb1swXSk7CisJCQkgIGlmIChmZWF0RGlmZi5jb250YWluc0tleShkaWZmRmVhdElkKSkgeyAvL292ZXJsYXBwaW5nIGZlYXR1cmVzCisJCQkgICAgICBkaWZmID0gZmVhdERpZmYuZ2V0KGRpZmZGZWF0SWQpK0RvdWJsZS5wYXJzZURvdWJsZShmZWF0SW5mb1sxXSk7CisJCQkgICAgICBpZiAoIE1hdGguYWJzKGRpZmYpID4gMWUtMjAgKQorCQkJCSAgZmVhdERpZmYucHV0KGRpZmZGZWF0SWQsIGRpZmYpOworCQkJICAgICAgZWxzZQorCQkJCSAgZmVhdERpZmYucmVtb3ZlKGRpZmZGZWF0SWQpOworCQkJICB9CisJCQkgIGVsc2UgLy9mZWF0dXJlcyBvbmx5IGZpcmluZyBpbiB0aGUgbmV3IG9yYWNsZSBmZWF0dXJlIHZlY3RvcgorCQkJICAgICAgZmVhdERpZmYucHV0KGRpZmZGZWF0SWQsIERvdWJsZS5wYXJzZURvdWJsZShmZWF0SW5mb1sxXSkpOworCQkgICAgICB9CisJCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVjUHJlZEZlYXQubGVuZ3RoOyBpKyspIHsKKwkJCSAgZmVhdEluZm8gPSB2ZWNQcmVkRmVhdFtpXS5zcGxpdCgiPSIpOworCQkJICBkaWZmRmVhdElkID0gSW50ZWdlci5wYXJzZUludChmZWF0SW5mb1swXSk7CisJCQkgIGlmIChmZWF0RGlmZi5jb250YWluc0tleShkaWZmRmVhdElkKSkgeyAvL292ZXJsYXBwaW5nIGZlYXR1cmVzCisJCQkgICAgICBkaWZmID0gZmVhdERpZmYuZ2V0KGRpZmZGZWF0SWQpLURvdWJsZS5wYXJzZURvdWJsZShmZWF0SW5mb1sxXSk7CisJCQkgICAgICBpZiAoIE1hdGguYWJzKGRpZmYpID4gMWUtMjAgKQorCQkJCSAgZmVhdERpZmYucHV0KGRpZmZGZWF0SWQsIGRpZmYpOworCQkJICAgICAgZWxzZQorCQkJCSAgZmVhdERpZmYucmVtb3ZlKGRpZmZGZWF0SWQpOworCQkJICB9CisJCQkgIGVsc2UgLy9mZWF0dXJlcyBvbmx5IGZpcmluZyBpbiB0aGUgbmV3IHByZWRpY3Rpb24gZmVhdHVyZSB2ZWN0b3IKKwkJCSAgICAgIGZlYXREaWZmLnB1dChkaWZmRmVhdElkLCAtMS4wKkRvdWJsZS5wYXJzZURvdWJsZShmZWF0SW5mb1sxXSkpOworCQkgICAgICB9CisJCSAgfQorCisJCSAgLy9yZW1lbWJlciB0aGUgbW9kZWwgc2NvcmVzIGhlcmUgYXJlIGFscmVhZHkgc2NhbGVkCisJCSAgZG91YmxlIHNpbmdsZUxvc3MgPSBldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSA/CisJCSAgICAgIChwcmVkTWV0cmljLW9yYU1ldHJpYykgLSAob3JhU2NvcmUtcHJlZFNjb3JlKS9mZWF0U2NhbGU6IAorCQkgICAgICAob3JhTWV0cmljLXByZWRNZXRyaWMpIC0gKG9yYVNjb3JlLXByZWRTY29yZSkvZmVhdFNjYWxlOworCQkgIGlmKHNpbmdsZUxvc3MgPiAwKQorCQkgICAgICBsb3NzICs9IHNpbmdsZUxvc3M7CisJCSAgKytzZW50Q291bnQ7CisJCSAgaWYoIHNlbnRDb3VudCA+PSBzZW50TnVtICkgeworCQkgICAgICB0aGlzQmF0Y2hTaXplID0gYiArIDE7CisJCSAgICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9IC8vZm9yKGludCBiIDogYmF0Y2hTaXplKQorCisJICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuXG4iK3NlbnRDb3VudCsiOiIpOworCisJICAgICAgaWYoIGxvc3MgPiAwICkgeworCSAgICAgIC8vaWYodHJ1ZSkgeworCQkgICsrbnVtVXBkYXRlOworCQkgIC8vdXBkYXRlIHdlaWdodHMgKHNlZSBEdWNoaScxMSwgRXEuMjMuIEZvciBsMS1yZWcsIHVzZSBsYXp5IHVwZGF0ZSkKKwkJICBTZXQ8SW50ZWdlcj4gZGlmZkZlYXRTZXQgPSBmZWF0RGlmZi5rZXlTZXQoKTsKKwkJICBpdCA9IGRpZmZGZWF0U2V0Lml0ZXJhdG9yKCk7CisJCSAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7IC8vbm90ZSB0aGVzZSBhcmUgYWxsIG5vbi16ZXJvIGdyYWRpZW50cyEKKwkJICAgICAgZGlmZkZlYXRJZCA9IChJbnRlZ2VyKWl0Lm5leHQoKTsKKwkJICAgICAgZGlmZkZlYXRWYWwgPSAtMS4wICogZmVhdERpZmYuZ2V0KGRpZmZGZWF0SWQpOyAvL2dyYWRpZW50CisJCSAgICAgIGlmKCByZWd1bGFyaXphdGlvbiA+IDAgKSB7CisJCQkgIGxhc3RVcGRhdGVUaW1lID0KKwkJCSAgICAgIGxhc3RVcGRhdGUuZ2V0KGRpZmZGZWF0SWQpID09IG51bGwgPyAwIDogbGFzdFVwZGF0ZS5nZXQoZGlmZkZlYXRJZCk7CisJCQkgIGlmKCBsYXN0VXBkYXRlVGltZSA8IG51bVVwZGF0ZSAtIDEgKSB7CisJCQkgICAgICAvL2hhdmVuJ3QgYmVlbiB1cGRhdGVkIChncmFkaWVudD0wKSBmb3IgYXQgbGVhc3QgMiBzdGVwcworCQkJICAgICAgLy9sYXp5IGNvbXB1dGUgcHJldkxhbWJkYSBub3cKKwkJCSAgICAgIG9sZFZhbCA9CisJCQkJICBsYXN0VmFsLmdldChkaWZmRmVhdElkKSA9PSBudWxsID8gaW5pdGlhbExhbWJkYVtkaWZmRmVhdElkXSA6IGxhc3RWYWwuZ2V0KGRpZmZGZWF0SWQpOworCQkJICAgICAgSGlpID0KKwkJCQkgIEguZ2V0KGRpZmZGZWF0SWQpID09IG51bGwgPyAwIDogSC5nZXQoZGlmZkZlYXRJZCk7CisJCQkgICAgICBpZihNYXRoLmFicyhIaWkpID4gMWUtMjApIHsKKwkJCQkgIGlmKCByZWd1bGFyaXphdGlvbiA9PSAxICkKKwkJCQkgICAgICBwcmV2TGFtYmRhID0KKwkJCQkJICBNYXRoLnNpZ251bShvbGRWYWwpICogY2xpcCggTWF0aC5hYnMob2xkVmFsKSAtIGxhbSAqIGV0YSAqIChudW1CYXRjaCAtIDEgLSBsYXN0VXBkYXRlVGltZSkgLyBIaWkgKTsKKwkJCQkgIGVsc2UgaWYoIHJlZ3VsYXJpemF0aW9uID09IDIgKSB7CisJCQkJICAgICAgcHJldkxhbWJkYSA9CisJCQkJCSAgTWF0aC5wb3coIEhpaS8obGFtK0hpaSksIChudW1VcGRhdGUgLSAxIC0gbGFzdFVwZGF0ZVRpbWUpICkgKiBvbGRWYWw7CisJCQkJICAgICAgaWYobmVlZEF2ZykgeyAvL2ZpbGwgdGhlIGdhcCBkdWUgdG8gbGF6eSB1cGRhdGUKKwkJCQkJICBkb3VibGUgcHJldkxhbWJkYUNvcHkgPSBwcmV2TGFtYmRhOworCQkJCQkgIGRvdWJsZSBzY2FsZSA9IEhpaS8obGFtK0hpaSk7CisJCQkJCSAgZm9yKCBpbnQgdCA9IDA7IHQgPCBudW1VcGRhdGUgLSAxIC0gbGFzdFVwZGF0ZVRpbWU7ICsrdCApIHsKKwkJCQkJICAgICAgYXZnTGFtYmRhW2RpZmZGZWF0SWRdICs9IHByZXZMYW1iZGFDb3B5OworCQkJCQkgICAgICBwcmV2TGFtYmRhQ29weSAvPSBzY2FsZTsKKwkJCQkJICB9CisJCQkJICAgICAgfQorCQkJCSAgfQorCQkJICAgICAgfSBlbHNlIHsKKwkJCQkgIGlmKCByZWd1bGFyaXphdGlvbiA9PSAxICkKKwkJCQkgICAgICBwcmV2TGFtYmRhID0gMDsKKwkJCQkgIGVsc2UgaWYoIHJlZ3VsYXJpemF0aW9uID09IDIgKQorCQkJCSAgICAgIHByZXZMYW1iZGEgPSBvbGRWYWw7CisJCQkgICAgICB9CisJCQkgIH0gZWxzZSAvL2p1c3QgdXBkYXRlZCBhdCBsYXN0IHRpbWUgc3RlcCBvciBqdXN0IHN0YXJ0ZWQKKwkJCSAgICAgIHByZXZMYW1iZGEgPSBmaW5hbExhbWJkYVtkaWZmRmVhdElkXTsKKwkJCSAgaWYoSC5nZXQoZGlmZkZlYXRJZCkgIT0gbnVsbCkgeworCQkJICAgICAgZ3JhZGlpU3F1YXJlID0gSC5nZXQoZGlmZkZlYXRJZCk7CisJCQkgICAgICBncmFkaWlTcXVhcmUgKj0gZ3JhZGlpU3F1YXJlOworCQkJICAgICAgZ3JhZGlpU3F1YXJlICs9IGRpZmZGZWF0VmFsICogZGlmZkZlYXRWYWw7CisJCQkgICAgICBIaWkgPSBNYXRoLnNxcnQoZ3JhZGlpU3F1YXJlKTsKKwkJCSAgfSBlbHNlCisJCQkgICAgICBIaWkgPSBNYXRoLmFicyhkaWZmRmVhdFZhbCk7CisJCQkgIEgucHV0KGRpZmZGZWF0SWQsIEhpaSk7CisJCQkgIC8vdXBkYXRlIHRoZSB3ZWlnaHQKKwkJCSAgaWYoIHJlZ3VsYXJpemF0aW9uID09IDEgKSB7CisJCQkgICAgICBnZFN0ZXAgPSBwcmV2TGFtYmRhIC0gZXRhICogZGlmZkZlYXRWYWwgLyBIaWk7CisJCQkgICAgICBmaW5hbExhbWJkYVtkaWZmRmVhdElkXSA9IE1hdGguc2lnbnVtKGdkU3RlcCkgKiBjbGlwKCBNYXRoLmFicyhnZFN0ZXApIC0gbGFtICogZXRhIC8gSGlpICk7CisJCQkgIH0gZWxzZSBpZihyZWd1bGFyaXphdGlvbiA9PSAyICkgeworCQkJICAgICAgZmluYWxMYW1iZGFbZGlmZkZlYXRJZF0gPSAoSGlpICogcHJldkxhbWJkYSAtIGV0YSAqIGRpZmZGZWF0VmFsKSAvIChsYW0gKyBIaWkpOworCQkJICAgICAgaWYobmVlZEF2ZykKKwkJCQkgIGF2Z0xhbWJkYVtkaWZmRmVhdElkXSArPSBmaW5hbExhbWJkYVtkaWZmRmVhdElkXTsKKwkJCSAgfQorCQkJICBsYXN0VXBkYXRlLnB1dChkaWZmRmVhdElkLCBudW1VcGRhdGUpOworCQkJICBsYXN0VmFsLnB1dChkaWZmRmVhdElkLCBmaW5hbExhbWJkYVtkaWZmRmVhdElkXSk7CisJCSAgICAgIH0gZWxzZSB7IC8vaWYgbm8gcmVndWxhcml6YXRpb24KKwkJCSAgaWYoSC5nZXQoZGlmZkZlYXRJZCkgIT0gbnVsbCkgeworCQkJICAgICAgZ3JhZGlpU3F1YXJlID0gSC5nZXQoZGlmZkZlYXRJZCk7CisJCQkgICAgICBncmFkaWlTcXVhcmUgKj0gZ3JhZGlpU3F1YXJlOworCQkJICAgICAgZ3JhZGlpU3F1YXJlICs9IGRpZmZGZWF0VmFsICogZGlmZkZlYXRWYWw7CisJCQkgICAgICBIaWkgPSBNYXRoLnNxcnQoZ3JhZGlpU3F1YXJlKTsKKwkJCSAgfSBlbHNlCisJCQkgICAgICBIaWkgPSBNYXRoLmFicyhkaWZmRmVhdFZhbCk7CisJCQkgIEgucHV0KGRpZmZGZWF0SWQsIEhpaSk7CisJCQkgIGZpbmFsTGFtYmRhW2RpZmZGZWF0SWRdID0gZmluYWxMYW1iZGFbZGlmZkZlYXRJZF0gLSBldGEgKiBkaWZmRmVhdFZhbCAvIEhpaTsKKwkJCSAgaWYobmVlZEF2ZykKKwkJCSAgICAgIGF2Z0xhbWJkYVtkaWZmRmVhdElkXSArPSBmaW5hbExhbWJkYVtkaWZmRmVhdElkXTsKKwkJICAgICAgfQorCQkgIH0gLy93aGlsZShpdC5oYXNOZXh0KCkpCisJICAgICAgfSAvL2lmKGxvc3MgPiAwKQorCSAgICAgIGVsc2UgeyAvL25vIGxvc3MsIHRoZXJlZm9yZSB0aGUgd2VpZ2h0IHVwZGF0ZSBpcyBza2lwcGVkCisJCSAgLy9ob3dldmVyLCB0aGUgYXZnIHdlaWdodHMgc3RpbGwgbmVlZCB0byBiZSBhY2N1bXVsYXRlZAorCQkgIGlmKCByZWd1bGFyaXphdGlvbiA9PSAwICkgeworCQkgICAgICBmb3IoIGludCBpID0gMTsgaSA8IGZpbmFsTGFtYmRhLmxlbmd0aDsgKytpICkKKwkJCSAgYXZnTGFtYmRhW2ldICs9IGZpbmFsTGFtYmRhW2ldOworCQkgIH0gZWxzZSBpZiggcmVndWxhcml6YXRpb24gPT0gMiApIHsKKwkJICAgICAgaWYobmVlZEF2ZykgeworCQkJICAvL2R1ZSB0byBsYXp5IHVwZGF0ZSwgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhY3R1YWwKKwkJCSAgLy93ZWlnaHQgdmVjdG9yIGF0IHRoaXMgcG9pbnQgZmlyc3QuLi4KKwkJCSAgZm9yKCBpbnQgaSA9IDE7IGkgPCBmaW5hbExhbWJkYS5sZW5ndGg7ICsraSApIHsKKwkJCSAgICAgIGlmKCBsYXN0VXBkYXRlLmdldChpKSAhPSBudWxsICkgeworCQkJICAgICAgCSAgaWYoIGxhc3RVcGRhdGUuZ2V0KGkpIDwgbnVtVXBkYXRlICkgeworCQkJICAgICAgCSAgICAgIG9sZFZhbCA9IGxhc3RWYWwuZ2V0KGkpOworCQkJICAgICAgCSAgICAgIEhpaSA9IEguZ2V0KGkpOworCQkJICAgICAgCSAgICAgIC8vbGF6eSBjb21wdXRlCisJCQkgICAgICAJICAgICAgYXZnTGFtYmRhW2ldICs9CisJCQkJCSAgTWF0aC5wb3coIEhpaS8obGFtK0hpaSksIChudW1VcGRhdGUgLSBsYXN0VXBkYXRlLmdldChpKSkgKSAqIG9sZFZhbDsKKwkJCSAgICAgIAkgIH0gZWxzZQorCQkJICAgICAgCSAgICAgIGF2Z0xhbWJkYVtpXSArPSBmaW5hbExhbWJkYVtpXTsKKwkJCSAgICAgIH0KKwkJCSAgICAgIGF2Z0xhbWJkYVtpXSArPSBmaW5hbExhbWJkYVtpXTsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgfQorCSAgICAgIH0KKwkgIH0gLy93aGlsZSggc2VudENvdW50IDwgc2VudE51bSApCisJICBpZiggcmVndWxhcml6YXRpb24gPiAwICkgeworCSAgICAgIGZvciggaW50IGkgPSAxOyBpIDwgZmluYWxMYW1iZGEubGVuZ3RoOyArK2kgKSB7CisJCSAgLy9ub3cgbGF6eSBjb21wdXRlIHRob3NlIHdlaWdodHMgdGhhdCBoYXZlbid0IGJlZW4gdGFrZW4gY2FyZSBvZgorCQkgIGlmKCBsYXN0VXBkYXRlLmdldChpKSA9PSBudWxsICkKKwkJICAgICAgZmluYWxMYW1iZGFbaV0gPSAwOworCQkgIGVsc2UgaWYoIGxhc3RVcGRhdGUuZ2V0KGkpIDwgbnVtVXBkYXRlICkgeworCQkgICAgICBvbGRWYWwgPSBsYXN0VmFsLmdldChpKTsKKwkJICAgICAgSGlpID0gSC5nZXQoaSk7CisJCSAgICAgIGlmKCByZWd1bGFyaXphdGlvbiA9PSAxICkKKwkJICAJICBmaW5hbExhbWJkYVtpXSA9CisJCSAgCSAgICAgIE1hdGguc2lnbnVtKG9sZFZhbCkgKiBjbGlwKCBNYXRoLmFicyhvbGRWYWwpIC0gbGFtICogZXRhICogKG51bVVwZGF0ZSAtIGxhc3RVcGRhdGUuZ2V0KGkpKSAvIEhpaSApOworCQkgICAgICBlbHNlIGlmKCByZWd1bGFyaXphdGlvbiA9PSAyICkgeworCQkgIAkgIGZpbmFsTGFtYmRhW2ldID0gCisJCSAgCSAgICAgIE1hdGgucG93KCBIaWkvKGxhbStIaWkpLCAobnVtVXBkYXRlIC0gbGFzdFVwZGF0ZS5nZXQoaSkpICkgKiBvbGRWYWw7CisJCSAgCSAgaWYobmVlZEF2ZykgeyAvL2ZpbGwgdGhlIGdhcCBkdWUgdG8gbGF6eSB1cGRhdGUKKwkJICAJICAgICAgZG91YmxlIHByZXZMYW1iZGFDb3B5ID0gZmluYWxMYW1iZGFbaV07CisJCSAgCSAgICAgIGRvdWJsZSBzY2FsZSA9IEhpaS8obGFtK0hpaSk7CisJCSAgCSAgICAgIGZvciggaW50IHQgPSAwOyB0IDwgbnVtVXBkYXRlIC0gbGFzdFVwZGF0ZS5nZXQoaSk7ICsrdCApIHsKKwkJICAJCSAgYXZnTGFtYmRhW2ldICs9IHByZXZMYW1iZGFDb3B5OworCQkgIAkJICBwcmV2TGFtYmRhQ29weSAvPSBzY2FsZTsKKwkJICAJICAgICAgfQorCQkgIAkgIH0KKwkJICAgICAgfQorCQkgIH0KKwkJICBpZiggcmVndWxhcml6YXRpb24gPT0gMiAmJiBuZWVkQXZnICkgeworCQkgICAgICBpZiggaXRlciA9PSBhZGFncmFkSXRlciAtIDEgKQorCQkJICBmaW5hbExhbWJkYVtpXSA9IGF2Z0xhbWJkYVtpXSAvICggbnVtQmF0Y2ggKiBhZGFncmFkSXRlciApOworCQkgIH0KKwkgICAgICB9CisJICB9IGVsc2UgeyAvL2lmIG5vIHJlZ3VsYXJpemF0aW9uCisJICAgICAgaWYoIGl0ZXIgPT0gYWRhZ3JhZEl0ZXIgLSAxICYmIG5lZWRBdmcgKSB7CisJCSAgZm9yKCBpbnQgaSA9IDE7IGkgPCBmaW5hbExhbWJkYS5sZW5ndGg7ICsraSApCisJCSAgICAgIGZpbmFsTGFtYmRhW2ldID0gYXZnTGFtYmRhW2ldIC8gKCBudW1CYXRjaCAqIGFkYWdyYWRJdGVyICk7CisJICAgICAgfQorCSAgfQorCisJICBkb3VibGUgaW5pdE1ldHJpY1Njb3JlOworCSAgaWYgKGl0ZXIgPT0gMCkgeworCSAgICAgIGluaXRNZXRyaWNTY29yZSA9IGNvbXB1dGVDb3JwdXNNZXRyaWNTY29yZShpbml0aWFsTGFtYmRhKTsKKwkgICAgICBmaW5hbE1ldHJpY1Njb3JlID0gY29tcHV0ZUNvcnB1c01ldHJpY1Njb3JlKGZpbmFsTGFtYmRhKTsKKwkgIH0gZWxzZSAgeworCSAgICAgIGluaXRNZXRyaWNTY29yZSA9IGZpbmFsTWV0cmljU2NvcmU7CisJICAgICAgZmluYWxNZXRyaWNTY29yZSA9IGNvbXB1dGVDb3JwdXNNZXRyaWNTY29yZShmaW5hbExhbWJkYSk7CisJICB9CisJICAvLyBwcmVwYXJlIHRoZSBwcmludGluZyBpbmZvCisJICBTdHJpbmcgcmVzdWx0ID0gIiBJbml0aWFsICIKKwkgICAgICArIGV2YWxNZXRyaWMuZ2V0X21ldHJpY05hbWUoKSArICI9IiArIFN0cmluZy5mb3JtYXQoIiUuNGYiLCBpbml0TWV0cmljU2NvcmUpICsgIiBGaW5hbCAiCisJICAgICAgKyBldmFsTWV0cmljLmdldF9tZXRyaWNOYW1lKCkgKyAiPSIgKyBTdHJpbmcuZm9ybWF0KCIlLjRmIiwgZmluYWxNZXRyaWNTY29yZSk7CisJICAvL3ByaW50IGxhbWJkYSBpbmZvCisJICAvLyBpbnQgbnVtUGFyYW1Ub1ByaW50ID0gMDsKKwkgIC8vIG51bVBhcmFtVG9QcmludCA9IHBhcmFtRGltID4gMTAgPyAxMCA6IHBhcmFtRGltOyAvLyBob3cgbWFueSBwYXJhbWV0ZXJzCisJICAvLyAvLyB0byBwcmludAorCSAgLy8gcmVzdWx0ID0gcGFyYW1EaW0gPiAxMCA/ICJGaW5hbCBsYW1iZGEgKGZpcnN0IDEwKTogeyIgOiAiRmluYWwgbGFtYmRhOiB7IjsKKyAgICAKKwkgIC8vIGZvciAoaW50IGkgPSAxOyBpIDw9IG51bVBhcmFtVG9QcmludDsgKytpKQorCSAgLy8gICAgIHJlc3VsdCArPSBTdHJpbmcuZm9ybWF0KCIlLjRmIiwgZmluYWxMYW1iZGFbaV0pICsgIiAiOworCisJICBvdXRwdXQuYWRkKHJlc3VsdCk7CisgICAgICB9IC8vZm9yICggaW50IGl0ZXIgPSAwOyBpdGVyIDwgYWRhZ3JhZEl0ZXI7ICsraXRlciApIHsKKworICAgICAgLy9ub24tb3B0aW1pemFibGUgd2VpZ2h0cyBzaG91bGQgcmVtYWluIHVuY2hhbmdlZAorICAgICAgQXJyYXlMaXN0PERvdWJsZT4gY3BGaXhXdCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworICAgICAgZm9yICggaW50IGkgPSAxOyBpIDwgaXNPcHRpbWl6YWJsZS5sZW5ndGg7ICsraSApIHsKKwkgIGlmICggISBpc09wdGltaXphYmxlW2ldICkKKwkgICAgICBjcEZpeFd0LmFkZChmaW5hbExhbWJkYVtpXSk7CisgICAgICB9CisgICAgICBub3JtYWxpemVMYW1iZGEoZmluYWxMYW1iZGEpOworICAgICAgaW50IGNvdW50Tm9uT3B0ID0gMDsKKyAgICAgIGZvciAoIGludCBpID0gMTsgaSA8IGlzT3B0aW1pemFibGUubGVuZ3RoOyArK2kgKSB7CisJICBpZiAoICEgaXNPcHRpbWl6YWJsZVtpXSApIHsKKwkgICAgICBmaW5hbExhbWJkYVtpXSA9IGNwRml4V3QuZ2V0KGNvdW50Tm9uT3B0KTsKKwkgICAgICArK2NvdW50Tm9uT3B0OworCSAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZpbmFsTGFtYmRhOworICB9CisKKyAgcHJpdmF0ZSBkb3VibGUgY2xpcChkb3VibGUgeCkgeworICAgICAgcmV0dXJuIHggPiAwID8geCA6IDA7CisgIH0KKworICBwdWJsaWMgZG91YmxlIGNvbXB1dGVDb3JwdXNNZXRyaWNTY29yZShkb3VibGVbXSBmaW5hbExhbWJkYSkgeworICAgIGludCBzdWZmU3RhdHNDb3VudCA9IGV2YWxNZXRyaWMuZ2V0X3N1ZmZTdGF0c0NvdW50KCk7CisgICAgZG91YmxlIG1vZGVsU2NvcmU7CisgICAgZG91YmxlIG1heE1vZGVsU2NvcmU7CisgICAgU2V0PFN0cmluZz4gY2FuZFNldDsKKyAgICBTdHJpbmcgY2FuZFN0cjsKKyAgICBTdHJpbmdbXSBmZWF0X3N0cjsKKyAgICBTdHJpbmdbXSB0bXBTdGF0c1ZhbCA9IG5ldyBTdHJpbmdbc3VmZlN0YXRzQ291bnRdOworICAgIGludFtdIGNvcnB1c1N0YXRzVmFsID0gbmV3IGludFtzdWZmU3RhdHNDb3VudF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmU3RhdHNDb3VudDsgaSsrKQorICAgICAgY29ycHVzU3RhdHNWYWxbaV0gPSAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZW50TnVtOyBpKyspIHsKKyAgICAgIGNhbmRTZXQgPSBmZWF0X2hhc2hbaV0ua2V5U2V0KCk7CisKKyAgICAgIC8vIGZpbmQgb3V0IHRoZSAxLWJlc3QgY2FuZGlkYXRlIGZvciBlYWNoIHNlbnRlbmNlCisgICAgICAvLyB0aGlzIGRlcGVuZHMgb24gdGhlIHRyYWluaW5nIG1vZGUKKyAgICAgIG1heE1vZGVsU2NvcmUgPSBOZWdJbmY7CisgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY2FuZFNldC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgIG1vZGVsU2NvcmUgPSAwLjA7CisgICAgICAgIGNhbmRTdHIgPSBpdC5uZXh0KCkudG9TdHJpbmcoKTsKKworICAgICAgICBmZWF0X3N0ciA9IGZlYXRfaGFzaFtpXS5nZXQoY2FuZFN0cikuc3BsaXQoIlxccysiKTsKKworCVN0cmluZ1tdIGZlYXRfaW5mbzsKKworCWZvciAoaW50IGYgPSAwOyBmIDwgZmVhdF9zdHIubGVuZ3RoOyBmKyspIHsKKwkgICAgZmVhdF9pbmZvID0gZmVhdF9zdHJbZl0uc3BsaXQoIj0iKTsKKwkgICAgbW9kZWxTY29yZSArPQorCQlEb3VibGUucGFyc2VEb3VibGUoZmVhdF9pbmZvWzFdKSAqIGZpbmFsTGFtYmRhW1ZvY2FidWxhcnkuaWQoZmVhdF9pbmZvWzBdKV07CisJfQorCisgICAgICAgIGlmIChtYXhNb2RlbFNjb3JlIDwgbW9kZWxTY29yZSkgeworICAgICAgICAgIG1heE1vZGVsU2NvcmUgPSBtb2RlbFNjb3JlOworICAgICAgICAgIHRtcFN0YXRzVmFsID0gc3RhdHNfaGFzaFtpXS5nZXQoY2FuZFN0cikuc3BsaXQoIlxccysiKTsgLy8gc2F2ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1ZmYgc3RhdHMKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN1ZmZTdGF0c0NvdW50OyBqKyspCisgICAgICAgIGNvcnB1c1N0YXRzVmFsW2pdICs9IEludGVnZXIucGFyc2VJbnQodG1wU3RhdHNWYWxbal0pOyAvLyBhY2N1bXVsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JwdXMtbGV2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VmZiBzdGF0cworICAgIH0gLy8gZm9yKCBpbnQgaT0wOyBpPHNlbnROdW07IGkrKyApCisKKyAgICByZXR1cm4gZXZhbE1ldHJpYy5zY29yZShjb3JwdXNTdGF0c1ZhbCk7CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBmaW5kT3JhUHJlZChpbnQgc2VudElkLCBkb3VibGVbXSBvcmFQcmVkU2NvcmUsIFN0cmluZ1tdIG9yYVByZWRGZWF0LCBkb3VibGVbXSBsYW1iZGEsIGRvdWJsZSBmZWF0U2NhbGUpCisgIHsKKyAgICBkb3VibGUgb3JhTWV0cmljPTAsIG9yYVNjb3JlPTAsIHByZWRNZXRyaWM9MCwgcHJlZFNjb3JlPTA7CisgICAgU3RyaW5nIG9yYUZlYXQ9IiIsIHByZWRGZWF0PSIiOworICAgIGRvdWJsZSBjYW5kTWV0cmljID0gMCwgY2FuZFNjb3JlID0gMDsgLy9tZXRyaWMgYW5kIG1vZGVsIHNjb3JlcyBmb3IgZWFjaCBjYW5kCisgICAgU2V0PFN0cmluZz4gY2FuZFNldCA9IHN0YXRzX2hhc2hbc2VudElkXS5rZXlTZXQoKTsKKyAgICBTdHJpbmcgY2FuZCA9ICIiOworICAgIFN0cmluZyBmZWF0cyA9ICIiOworICAgIFN0cmluZyBvcmFDYW5kID0gIiI7IC8vb25seSB1c2VkIHdoZW4gQkxFVS9URVItQkxFVSBpcyB1c2VkIGFzIG1ldHJpYworICAgIFN0cmluZ1tdIGZlYXRTdHI7CisgICAgU3RyaW5nW10gZmVhdEluZm87CisgICAgCisgICAgaW50IGFjdHVhbEZlYXRJZDsKKyAgICBkb3VibGUgYmVzdE9yYVNjb3JlOworICAgIGRvdWJsZSB3b3JzdFByZWRTY29yZTsKKyAgICAKKyAgICBpZihvcmFTZWxlY3RNb2RlPT0xKQorICAgICAgYmVzdE9yYVNjb3JlID0gTmVnSW5mOyAvL2xhcmdlciBzY29yZSB3aWxsIGJlIHNlbGVjdGVkCisgICAgZWxzZSB7CisgICAgICBpZihldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSkKKyAgICAgICAgYmVzdE9yYVNjb3JlID0gUG9zSW5mOyAvL3NtYWxsZXIgc2NvcmUgd2lsbCBiZSBzZWxlY3RlZAorICAgICAgZWxzZQorICAgICAgICBiZXN0T3JhU2NvcmUgPSBOZWdJbmY7CisgICAgfQorICAgIAorICAgIGlmKHByZWRTZWxlY3RNb2RlPT0xIHx8IHByZWRTZWxlY3RNb2RlPT0yKQorICAgICAgd29yc3RQcmVkU2NvcmUgPSBOZWdJbmY7IC8vbGFyZ2VyIHNjb3JlIHdpbGwgYmUgc2VsZWN0ZWQKKyAgICBlbHNlIHsKKyAgICAgIGlmKGV2YWxNZXRyaWMuZ2V0VG9CZU1pbmltaXplZCgpKQorICAgICAgICB3b3JzdFByZWRTY29yZSA9IE5lZ0luZjsgLy9sYXJnZXIgc2NvcmUgd2lsbCBiZSBzZWxlY3RlZAorICAgICAgZWxzZQorICAgICAgICB3b3JzdFByZWRTY29yZSA9IFBvc0luZjsKKyAgICB9CisgICAgCisgICAgZm9yIChJdGVyYXRvciBpdCA9IGNhbmRTZXQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgY2FuZCA9IGl0Lm5leHQoKS50b1N0cmluZygpOworICAgICAgY2FuZE1ldHJpYyA9IGNvbXB1dGVTZW50TWV0cmljKHNlbnRJZCwgY2FuZCk7IC8vY29tcHV0ZSBtZXRyaWMgc2NvcmUKKworICAgICAgLy9zdGFydCB0byBjb21wdXRlIG1vZGVsIHNjb3JlCisgICAgICBjYW5kU2NvcmUgPSAwOworICAgICAgZmVhdFN0ciA9IGZlYXRfaGFzaFtzZW50SWRdLmdldChjYW5kKS5zcGxpdCgiXFxzKyIpOworICAgICAgZmVhdHMgPSAiIjsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0U3RyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgZmVhdEluZm8gPSBmZWF0U3RyW2ldLnNwbGl0KCI9Iik7CisJICBhY3R1YWxGZWF0SWQgPSBWb2NhYnVsYXJ5LmlkKGZlYXRJbmZvWzBdKTsKKwkgIGNhbmRTY29yZSArPSBEb3VibGUucGFyc2VEb3VibGUoZmVhdEluZm9bMV0pICogbGFtYmRhW2FjdHVhbEZlYXRJZF07CisJICBpZiAoIChhY3R1YWxGZWF0SWQgPCBpc09wdGltaXphYmxlLmxlbmd0aCAmJiBpc09wdGltaXphYmxlW2FjdHVhbEZlYXRJZF0pIHx8CisJICAgICAgIGFjdHVhbEZlYXRJZCA+PSBpc09wdGltaXphYmxlLmxlbmd0aCApCisJICAgICAgZmVhdHMgKz0gYWN0dWFsRmVhdElkICsgIj0iICsgRG91YmxlLnBhcnNlRG91YmxlKGZlYXRJbmZvWzFdKSArICIgIjsKKyAgICAgIH0KKyAgICAgIAorICAgICAgY2FuZFNjb3JlICo9IGZlYXRTY2FsZTsgIC8vc2NhbGUgdGhlIG1vZGVsIHNjb3JlCisgICAgICAKKyAgICAgIC8vaXMgdGhpcyBjYW5kIG9yYWNsZT8KKyAgICAgIGlmKG9yYVNlbGVjdE1vZGUgPT0gMSkgey8vImhvcGUiLCBiPTEsIHI9MQorICAgICAgICBpZihldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSkgey8vaWYgdGhlIHNtYWxsZXIgdGhlIG1ldHJpYyBzY29yZSwgdGhlIGJldHRlcgorICAgICAgICAgIGlmKCBiZXN0T3JhU2NvcmU8PShjYW5kU2NvcmUtY2FuZE1ldHJpYykgKSB7CisgICAgICAgICAgICBiZXN0T3JhU2NvcmUgPSBjYW5kU2NvcmUtY2FuZE1ldHJpYzsKKyAgICAgICAgICAgIG9yYU1ldHJpYyA9IGNhbmRNZXRyaWM7CisgICAgICAgICAgICBvcmFTY29yZSA9IGNhbmRTY29yZTsKKyAgICAgICAgICAgIG9yYUZlYXQgPSBmZWF0czsKKyAgICAgICAgICAgIG9yYUNhbmQgPSBjYW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiggYmVzdE9yYVNjb3JlPD0oY2FuZFNjb3JlK2NhbmRNZXRyaWMpICkgeworICAgICAgICAgICAgYmVzdE9yYVNjb3JlID0gY2FuZFNjb3JlK2NhbmRNZXRyaWM7CisgICAgICAgICAgICBvcmFNZXRyaWMgPSBjYW5kTWV0cmljOworICAgICAgICAgICAgb3JhU2NvcmUgPSBjYW5kU2NvcmU7CisgICAgICAgICAgICBvcmFGZWF0ID0gZmVhdHM7CisgICAgICAgICAgICBvcmFDYW5kID0gY2FuZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2Ugey8vYmVzdCBtZXRyaWMgc2NvcmUoZXg6IG1heCBCTEVVKSwgYj0xLCByPTAKKyAgICAgICAgaWYoZXZhbE1ldHJpYy5nZXRUb0JlTWluaW1pemVkKCkpIHsvL2lmIHRoZSBzbWFsbGVyIHRoZSBtZXRyaWMgc2NvcmUsIHRoZSBiZXR0ZXIKKyAgICAgICAgICBpZiggYmVzdE9yYVNjb3JlPj1jYW5kTWV0cmljICkgeworICAgICAgICAgICAgYmVzdE9yYVNjb3JlID0gY2FuZE1ldHJpYzsKKyAgICAgICAgICAgIG9yYU1ldHJpYyA9IGNhbmRNZXRyaWM7CisgICAgICAgICAgICBvcmFTY29yZSA9IGNhbmRTY29yZTsKKyAgICAgICAgICAgIG9yYUZlYXQgPSBmZWF0czsKKyAgICAgICAgICAgIG9yYUNhbmQgPSBjYW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiggYmVzdE9yYVNjb3JlPD1jYW5kTWV0cmljICkgeworICAgICAgICAgICAgYmVzdE9yYVNjb3JlID0gY2FuZE1ldHJpYzsKKyAgICAgICAgICAgIG9yYU1ldHJpYyA9IGNhbmRNZXRyaWM7CisgICAgICAgICAgICBvcmFTY29yZSA9IGNhbmRTY29yZTsKKyAgICAgICAgICAgIG9yYUZlYXQgPSBmZWF0czsKKyAgICAgICAgICAgIG9yYUNhbmQgPSBjYW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICAvL2lzIHRoaXMgY2FuZCBwcmVkaWN0aW9uPworICAgICAgaWYocHJlZFNlbGVjdE1vZGUgPT0gMSkgey8vImZlYXIiCisgICAgICAgIGlmKGV2YWxNZXRyaWMuZ2V0VG9CZU1pbmltaXplZCgpKSB7Ly9pZiB0aGUgc21hbGxlciB0aGUgbWV0cmljIHNjb3JlLCB0aGUgYmV0dGVyCisgICAgICAgICAgaWYoIHdvcnN0UHJlZFNjb3JlPD0oY2FuZFNjb3JlK2NhbmRNZXRyaWMpICkgeworICAgICAgICAgICAgd29yc3RQcmVkU2NvcmUgPSBjYW5kU2NvcmUrY2FuZE1ldHJpYzsKKyAgICAgICAgICAgIHByZWRNZXRyaWMgPSBjYW5kTWV0cmljOworICAgICAgICAgICAgcHJlZFNjb3JlID0gY2FuZFNjb3JlOworICAgICAgICAgICAgcHJlZEZlYXQgPSBmZWF0czsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYoIHdvcnN0UHJlZFNjb3JlPD0oY2FuZFNjb3JlLWNhbmRNZXRyaWMpICkgeworICAgICAgICAgICAgd29yc3RQcmVkU2NvcmUgPSBjYW5kU2NvcmUtY2FuZE1ldHJpYzsKKyAgICAgICAgICAgIHByZWRNZXRyaWMgPSBjYW5kTWV0cmljOworICAgICAgICAgICAgcHJlZFNjb3JlID0gY2FuZFNjb3JlOworICAgICAgICAgICAgcHJlZEZlYXQgPSBmZWF0czsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYocHJlZFNlbGVjdE1vZGUgPT0gMikgey8vbW9kZWwgcHJlZGljdGlvbihtYXggbW9kZWwgc2NvcmUpCisgICAgICAgIGlmKCB3b3JzdFByZWRTY29yZTw9Y2FuZFNjb3JlICkgeworICAgICAgICAgIHdvcnN0UHJlZFNjb3JlID0gY2FuZFNjb3JlOworICAgICAgICAgIHByZWRNZXRyaWMgPSBjYW5kTWV0cmljOyAKKyAgICAgICAgICBwcmVkU2NvcmUgPSBjYW5kU2NvcmU7CisgICAgICAgICAgcHJlZEZlYXQgPSBmZWF0czsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7Ly93b3JzdCBtZXRyaWMgc2NvcmUoZXg6IG1pbiBCTEVVKQorICAgICAgICBpZihldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSkgey8vaWYgdGhlIHNtYWxsZXIgdGhlIG1ldHJpYyBzY29yZSwgdGhlIGJldHRlcgorICAgICAgICAgIGlmKCB3b3JzdFByZWRTY29yZTw9Y2FuZE1ldHJpYyApIHsKKyAgICAgICAgICAgIHdvcnN0UHJlZFNjb3JlID0gY2FuZE1ldHJpYzsKKyAgICAgICAgICAgIHByZWRNZXRyaWMgPSBjYW5kTWV0cmljOworICAgICAgICAgICAgcHJlZFNjb3JlID0gY2FuZFNjb3JlOworICAgICAgICAgICAgcHJlZEZlYXQgPSBmZWF0czsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYoIHdvcnN0UHJlZFNjb3JlPj1jYW5kTWV0cmljICkgeworICAgICAgICAgICAgd29yc3RQcmVkU2NvcmUgPSBjYW5kTWV0cmljOworICAgICAgICAgICAgcHJlZE1ldHJpYyA9IGNhbmRNZXRyaWM7CisgICAgICAgICAgICBwcmVkU2NvcmUgPSBjYW5kU2NvcmU7CisgICAgICAgICAgICBwcmVkRmVhdCA9IGZlYXRzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSAKKyAgICB9CisgICAgCisgICAgb3JhUHJlZFNjb3JlWzBdID0gb3JhTWV0cmljOworICAgIG9yYVByZWRTY29yZVsxXSA9IG9yYVNjb3JlOworICAgIG9yYVByZWRTY29yZVsyXSA9IHByZWRNZXRyaWM7CisgICAgb3JhUHJlZFNjb3JlWzNdID0gcHJlZFNjb3JlOworICAgIG9yYVByZWRGZWF0WzBdID0gb3JhRmVhdDsKKyAgICBvcmFQcmVkRmVhdFsxXSA9IHByZWRGZWF0OworICAgIAorICAgIC8vdXBkYXRlIHRoZSBCTEVVIG1ldHJpYyBzdGF0aXN0aWNzIGlmIHBzZXVkbyBjb3JwdXMgaXMgdXNlZCB0byBjb21wdXRlIEJMRVUvVEVSLUJMRVUKKyAgICBpZihldmFsTWV0cmljLmdldF9tZXRyaWNOYW1lKCkuZXF1YWxzKCJCTEVVIikgJiYgdXNlUHNldWRvQmxldSApIHsKKyAgICAgIFN0cmluZyBzdGF0U3RyaW5nOworICAgICAgU3RyaW5nW10gc3RhdFZhbF9zdHI7CisgICAgICBzdGF0U3RyaW5nID0gc3RhdHNfaGFzaFtzZW50SWRdLmdldChvcmFDYW5kKTsKKyAgICAgIHN0YXRWYWxfc3RyID0gc3RhdFN0cmluZy5zcGxpdCgiXFxzKyIpOworCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV2YWxNZXRyaWMuZ2V0X3N1ZmZTdGF0c0NvdW50KCk7IGorKykKKyAgICAgICAgYmxldUhpc3Rvcnlbc2VudElkXVtqXSA9IFIqYmxldUhpc3Rvcnlbc2VudElkXVtqXStJbnRlZ2VyLnBhcnNlSW50KHN0YXRWYWxfc3RyW2pdKTsKKyAgICB9CisgICAgCisgICAgaWYoZXZhbE1ldHJpYy5nZXRfbWV0cmljTmFtZSgpLmVxdWFscygiVEVSLUJMRVUiKSAmJiB1c2VQc2V1ZG9CbGV1ICkgeworICAgICAgU3RyaW5nIHN0YXRTdHJpbmc7CisgICAgICBTdHJpbmdbXSBzdGF0VmFsX3N0cjsKKyAgICAgIHN0YXRTdHJpbmcgPSBzdGF0c19oYXNoW3NlbnRJZF0uZ2V0KG9yYUNhbmQpOworICAgICAgc3RhdFZhbF9zdHIgPSBzdGF0U3RyaW5nLnNwbGl0KCJcXHMrIik7CisKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXZhbE1ldHJpYy5nZXRfc3VmZlN0YXRzQ291bnQoKS0yOyBqKyspCisgICAgICAgIGJsZXVIaXN0b3J5W3NlbnRJZF1bal0gPSBSKmJsZXVIaXN0b3J5W3NlbnRJZF1bal0rSW50ZWdlci5wYXJzZUludChzdGF0VmFsX3N0cltqKzJdKTsgLy90aGUgZmlyc3QgMiBzdGF0cyBhcmUgVEVSIHN0YXRzCisgICAgfQorICB9CisgIAorICAvLyBjb21wdXRlICpzZW50ZW5jZS1sZXZlbCogbWV0cmljIHNjb3JlIGZvciBjYW5kCisgIHByaXZhdGUgZG91YmxlIGNvbXB1dGVTZW50TWV0cmljKGludCBzZW50SWQsIFN0cmluZyBjYW5kKSB7CisgICAgU3RyaW5nIHN0YXRTdHJpbmc7CisgICAgU3RyaW5nW10gc3RhdFZhbF9zdHI7CisgICAgaW50W10gc3RhdFZhbCA9IG5ldyBpbnRbZXZhbE1ldHJpYy5nZXRfc3VmZlN0YXRzQ291bnQoKV07CisKKyAgICBzdGF0U3RyaW5nID0gc3RhdHNfaGFzaFtzZW50SWRdLmdldChjYW5kKTsKKyAgICBzdGF0VmFsX3N0ciA9IHN0YXRTdHJpbmcuc3BsaXQoIlxccysiKTsKKworICAgIGlmKGV2YWxNZXRyaWMuZ2V0X21ldHJpY05hbWUoKS5lcXVhbHMoIkJMRVUiKSAmJiB1c2VQc2V1ZG9CbGV1KSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV2YWxNZXRyaWMuZ2V0X3N1ZmZTdGF0c0NvdW50KCk7IGorKykKKyAgICAgICAgc3RhdFZhbFtqXSA9IChpbnQpIChJbnRlZ2VyLnBhcnNlSW50KHN0YXRWYWxfc3RyW2pdKSArIGJsZXVIaXN0b3J5W3NlbnRJZF1bal0pOworICAgIH0gZWxzZSBpZihldmFsTWV0cmljLmdldF9tZXRyaWNOYW1lKCkuZXF1YWxzKCJURVItQkxFVSIpICYmIHVzZVBzZXVkb0JsZXUpIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXZhbE1ldHJpYy5nZXRfc3VmZlN0YXRzQ291bnQoKS0yOyBqKyspCisgICAgICAgIHN0YXRWYWxbaisyXSA9IChpbnQpKEludGVnZXIucGFyc2VJbnQoc3RhdFZhbF9zdHJbaisyXSkgKyBibGV1SGlzdG9yeVtzZW50SWRdW2pdKTsgLy9vbmx5IG1vZGlmeSB0aGUgQkxFVSBzdGF0cyBwYXJ0KFRFUiBoYXMgMiBzdGF0cykKKyAgICB9IGVsc2UgeyAvL2luIGFsbCBvdGhlciBzaXR1YXRpb25zLCB1c2Ugbm9ybWFsIHN0YXRzCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV2YWxNZXRyaWMuZ2V0X3N1ZmZTdGF0c0NvdW50KCk7IGorKykKKyAgICAgICAgc3RhdFZhbFtqXSA9IEludGVnZXIucGFyc2VJbnQoc3RhdFZhbF9zdHJbal0pOworICAgIH0KKworICAgIHJldHVybiBldmFsTWV0cmljLnNjb3JlKHN0YXRWYWwpOworICB9CisKKyAgLy8gZnJvbSBaTUVSVAorICBwcml2YXRlIHZvaWQgbm9ybWFsaXplTGFtYmRhKGRvdWJsZVtdIG9yaWdMYW1iZGEpIHsKKyAgICAvLyBwcml2YXRlIFN0cmluZ1tdIG5vcm1hbGl6YXRpb25PcHRpb25zOworICAgIC8vIEhvdyBzaG91bGQgYSBsYW1iZGFbXSB2ZWN0b3IgYmUgbm9ybWFsaXplZCAoYmVmb3JlIGRlY29kaW5nKT8KKyAgICAvLyBuT1swXSA9IDA6IG5vIG5vcm1hbGl6YXRpb24KKyAgICAvLyBuT1swXSA9IDE6IHNjYWxlIHNvIHRoYXQgcGFyYW1ldGVyIG5PWzJdIGhhcyBhYnNvbHV0ZSB2YWx1ZSBuT1sxXQorICAgIC8vIG5PWzBdID0gMjogc2NhbGUgc28gdGhhdCB0aGUgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSBpcyBuT1sxXQorICAgIC8vIG5PWzBdID0gMzogc2NhbGUgc28gdGhhdCB0aGUgbWluaW11bSBhYnNvbHV0ZSB2YWx1ZSBpcyBuT1sxXQorICAgIC8vIG5PWzBdID0gNDogc2NhbGUgc28gdGhhdCB0aGUgTC1uT1sxXSBub3JtIGVxdWFscyBuT1syXQorCisgICAgaW50IG5vcm1hbGl6YXRpb25NZXRob2QgPSAoaW50KSBub3JtYWxpemF0aW9uT3B0aW9uc1swXTsKKyAgICBkb3VibGUgc2NhbGluZ0ZhY3RvciA9IDEuMDsKKyAgICBpZiAobm9ybWFsaXphdGlvbk1ldGhvZCA9PSAwKSB7CisgICAgICBzY2FsaW5nRmFjdG9yID0gMS4wOworICAgIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvbk1ldGhvZCA9PSAxKSB7CisgICAgICBpbnQgYyA9IChpbnQpIG5vcm1hbGl6YXRpb25PcHRpb25zWzJdOworICAgICAgc2NhbGluZ0ZhY3RvciA9IG5vcm1hbGl6YXRpb25PcHRpb25zWzFdIC8gTWF0aC5hYnMob3JpZ0xhbWJkYVtjXSk7CisgICAgfSBlbHNlIGlmIChub3JtYWxpemF0aW9uTWV0aG9kID09IDIpIHsKKyAgICAgIGRvdWJsZSBtYXhBYnNWYWwgPSAtMTsKKyAgICAgIGludCBtYXhBYnNWYWxfYyA9IDA7CisgICAgICBmb3IgKGludCBjID0gMTsgYyA8PSBwYXJhbURpbTsgKytjKSB7CisgICAgICAgIGlmIChNYXRoLmFicyhvcmlnTGFtYmRhW2NdKSA+IG1heEFic1ZhbCkgeworICAgICAgICAgIG1heEFic1ZhbCA9IE1hdGguYWJzKG9yaWdMYW1iZGFbY10pOworICAgICAgICAgIG1heEFic1ZhbF9jID0gYzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc2NhbGluZ0ZhY3RvciA9IG5vcm1hbGl6YXRpb25PcHRpb25zWzFdIC8gTWF0aC5hYnMob3JpZ0xhbWJkYVttYXhBYnNWYWxfY10pOworCisgICAgfSBlbHNlIGlmIChub3JtYWxpemF0aW9uTWV0aG9kID09IDMpIHsKKyAgICAgIGRvdWJsZSBtaW5BYnNWYWwgPSBQb3NJbmY7CisgICAgICBpbnQgbWluQWJzVmFsX2MgPSAwOworCisgICAgICBmb3IgKGludCBjID0gMTsgYyA8PSBwYXJhbURpbTsgKytjKSB7CisgICAgICAgIGlmIChNYXRoLmFicyhvcmlnTGFtYmRhW2NdKSA8IG1pbkFic1ZhbCkgeworICAgICAgICAgIG1pbkFic1ZhbCA9IE1hdGguYWJzKG9yaWdMYW1iZGFbY10pOworICAgICAgICAgIG1pbkFic1ZhbF9jID0gYzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc2NhbGluZ0ZhY3RvciA9IG5vcm1hbGl6YXRpb25PcHRpb25zWzFdIC8gTWF0aC5hYnMob3JpZ0xhbWJkYVttaW5BYnNWYWxfY10pOworCisgICAgfSBlbHNlIGlmIChub3JtYWxpemF0aW9uTWV0aG9kID09IDQpIHsKKyAgICAgIGRvdWJsZSBwb3cgPSBub3JtYWxpemF0aW9uT3B0aW9uc1sxXTsKKyAgICAgIGRvdWJsZSBub3JtID0gTF9ub3JtKG9yaWdMYW1iZGEsIHBvdyk7CisgICAgICBzY2FsaW5nRmFjdG9yID0gbm9ybWFsaXphdGlvbk9wdGlvbnNbMl0gLyBub3JtOworICAgIH0KKworICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IHBhcmFtRGltOyArK2MpIHsKKyAgICAgIG9yaWdMYW1iZGFbY10gKj0gc2NhbGluZ0ZhY3RvcjsKKyAgICB9CisgIH0KKworICAvLyBmcm9tIFpNRVJUCisgIHByaXZhdGUgZG91YmxlIExfbm9ybShkb3VibGVbXSBBLCBkb3VibGUgcG93KSB7CisgICAgLy8gY2FsY3VsYXRlcyB0aGUgTC1wb3cgbm9ybSBvZiBBW10KKyAgICAvLyBOT1RFOiB0aGlzIGNhbGN1bGF0aW9uIGlnbm9yZXMgQVswXQorICAgIGRvdWJsZSBzdW0gPSAwLjA7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBBLmxlbmd0aDsgKytpKQorICAgICAgc3VtICs9IE1hdGgucG93KE1hdGguYWJzKEFbaV0pLCBwb3cpOworCisgICAgcmV0dXJuIE1hdGgucG93KHN1bSwgMSAvIHBvdyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRTY2FsZSgpCisgIHsKKyAgICByZXR1cm4gZmVhdFNjYWxlOworICB9CisgIAorICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEJsZXVIaXN0b3J5KGludCBzZW50TnVtLCBpbnQgc3RhdENvdW50KQorICB7CisgICAgYmxldUhpc3RvcnkgPSBuZXcgZG91YmxlW3NlbnROdW1dW3N0YXRDb3VudF07CisgICAgZm9yKGludCBpPTA7IGk8c2VudE51bTsgaSsrKSB7CisgICAgICBmb3IoaW50IGo9MDsgajxzdGF0Q291bnQ7IGorKykgeworICAgICAgICBibGV1SGlzdG9yeVtpXVtqXSA9IDAuMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgZG91YmxlIGdldE1ldHJpY1Njb3JlKCkKKyAgeworICAgICAgcmV0dXJuIGZpbmFsTWV0cmljU2NvcmU7CisgIH0KKyAgCisgIHByaXZhdGUgVmVjdG9yPFN0cmluZz4gb3V0cHV0OworICBwcml2YXRlIGRvdWJsZVtdIGluaXRpYWxMYW1iZGE7CisgIHByaXZhdGUgZG91YmxlW10gZmluYWxMYW1iZGE7CisgIHByaXZhdGUgZG91YmxlIGZpbmFsTWV0cmljU2NvcmU7CisgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz5bXSBmZWF0X2hhc2g7CisgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz5bXSBzdGF0c19oYXNoOworICBwcml2YXRlIGludCBwYXJhbURpbTsKKyAgcHJpdmF0ZSBib29sZWFuW10gaXNPcHRpbWl6YWJsZTsKKyAgcHVibGljIHN0YXRpYyBpbnQgc2VudE51bTsKKyAgcHVibGljIHN0YXRpYyBpbnQgYWRhZ3JhZEl0ZXI7IC8vQWRhR3JhZCBpbnRlcm5hbCBpdGVyYXRpb25zCisgIHB1YmxpYyBzdGF0aWMgaW50IG9yYVNlbGVjdE1vZGU7CisgIHB1YmxpYyBzdGF0aWMgaW50IHByZWRTZWxlY3RNb2RlOworICBwdWJsaWMgc3RhdGljIGludCBiYXRjaFNpemU7CisgIHB1YmxpYyBzdGF0aWMgaW50IHJlZ3VsYXJpemF0aW9uOworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZFNodWZmbGU7CisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZWVkU2NhbGU7CisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHNjb3JlUmF0aW87CisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZWVkQXZnOworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlUHNldWRvQmxldTsKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgZmVhdFNjYWxlID0gMS4wOyAvL3NjYWxlIHRoZSBmZWF0dXJlcyBpbiBvcmRlciB0byBtYWtlIHRoZSBtb2RlbCBzY29yZSBjb21wYXJhYmxlIHdpdGggbWV0cmljIHNjb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlcyBpbiBlYWNoIGVwb2NoIGlmIG5lY2Vzc2FyeQorICBwdWJsaWMgc3RhdGljIGRvdWJsZSBldGE7CisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGxhbTsKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgUjsgLy9jb3JwdXMgZGVjYXkodXNlZCBvbmx5IHdoZW4gcHNldWRvIGNvcnB1cyBpcyB1c2VkIHRvIGNvbXB1dGUgQkxFVSkgCisgIHB1YmxpYyBzdGF0aWMgRXZhbHVhdGlvbk1ldHJpYyBldmFsTWV0cmljOworICBwdWJsaWMgc3RhdGljIGRvdWJsZVtdIG5vcm1hbGl6YXRpb25PcHRpb25zOworICBwdWJsaWMgc3RhdGljIGRvdWJsZVtdW10gYmxldUhpc3Rvcnk7CisgIAorICBwcml2YXRlIGZpbmFsIHN0YXRpYyBkb3VibGUgTmVnSW5mID0gKC0xLjAgLyAwLjApOworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBkb3VibGUgUG9zSW5mID0gKCsxLjAgLyAwLjApOworfQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9jb3JwdXMvVm9jYWJ1bGFyeS5qYXZhIGIvc3JjL2pvc2h1YS9jb3JwdXMvVm9jYWJ1bGFyeS5qYXZhCmluZGV4IGYwNTI2YzguLjVkZmU2NTcgMTAwNjQ0Ci0tLSBhL3NyYy9qb3NodWEvY29ycHVzL1ZvY2FidWxhcnkuamF2YQorKysgYi9zcmMvam9zaHVhL2NvcnB1cy9Wb2NhYnVsYXJ5LmphdmEKQEAgLTEsNSArMSw3IEBACiBwYWNrYWdlIGpvc2h1YS5jb3JwdXM7CiAKK2ltcG9ydCBzdGF0aWMgam9zaHVhLnV0aWwuRm9ybWF0VXRpbHMuaXNOb250ZXJtaW5hbDsKKwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwpAQCAtOCw0OCArMTAsNDAgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKIAogaW1wb3J0IGpvc2h1YS5kZWNvZGVyLkRlY29kZXI7CiBpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYubG0uTkdyYW1MYW5ndWFnZU1vZGVsOwogaW1wb3J0IGpvc2h1YS51dGlsLkZvcm1hdFV0aWxzOwotaW1wb3J0IGpvc2h1YS51dGlsLk11cm11ckhhc2g7CiAKIC8qKgotICogU3RhdGljIHNpbmd1bGFyIHZvY2FidWxhcnkgY2xhc3MuIFN1cHBvcnRzIHZvY2FidWxhcnkgZnJlZXppbmcgYW5kIChkZS0pc2VyaWFsaXphdGlvbiBpbnRvIGEKLSAqIHZvY2FidWxhcnkgZmlsZS4KKyAqIFN0YXRpYyBzaW5ndWxhciB2b2NhYnVsYXJ5IGNsYXNzLgorICogU3VwcG9ydHMgKGRlLSlzZXJpYWxpemF0aW9uIGludG8gYSB2b2NhYnVsYXJ5IGZpbGUuCiAgKiAKICAqIEBhdXRob3IgSnVyaSBHYW5pdGtldml0Y2gKICAqLwogCiBwdWJsaWMgY2xhc3MgVm9jYWJ1bGFyeSB7CiAKLSAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PE5HcmFtTGFuZ3VhZ2VNb2RlbD4gbG1zOworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBBcnJheUxpc3Q8TkdyYW1MYW5ndWFnZU1vZGVsPiBsbXMgPSBuZXcgQXJyYXlMaXN0PE5HcmFtTGFuZ3VhZ2VNb2RlbD4oKTsKIAotICBwcml2YXRlIHN0YXRpYyBUcmVlTWFwPExvbmcsIEludGVnZXI+IGhhc2hUb0lkOwotICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8U3RyaW5nPiBpZFRvU3RyaW5nOwotICBwcml2YXRlIHN0YXRpYyBUcmVlTWFwPExvbmcsIFN0cmluZz4gaGFzaFRvU3RyaW5nOworICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gaWRUb1N0cmluZzsKKyAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW50ZWdlcj4gc3RyaW5nVG9JZDsKKyAgCisgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIExpc3Q8SW50ZWdlcj4gbm9uVGVybWluYWxJbmRpY2VzOwogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgbG9jayA9IG5ldyBJbnRlZ2VyKDApOwogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTktOT1dOX0lEOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9XT1JEOworICBzdGF0aWMgZmluYWwgaW50IFVOS05PV05fSUQgPSAwOworICBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fV09SRCA9ICI8dW5rPiI7CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfU1lNID0gIjxzPiI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1BfU1lNID0gIjwvcz4iOwogICAKICAgc3RhdGljIHsKLQotICAgIFVOS05PV05fSUQgPSAwOwotICAgIFVOS05PV05fV09SRCA9ICI8dW5rPiI7Ci0KLSAgICBsbXMgPSBuZXcgQXJyYXlMaXN0PE5HcmFtTGFuZ3VhZ2VNb2RlbD4oKTsKLQogICAgIGNsZWFyKCk7CiAgIH0KIApAQCAtNzMsOSArNjcsOCBAQAogICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB2b2NhYnVsYXJ5IHdhcyByZWFkIHdpdGhvdXQgbWlzbWF0Y2hlcyBvciBjb2xsaXNpb25zLgogICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVhZChTdHJpbmcgZmlsZV9uYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVhZChmaW5hbCBGaWxlIHZvY2FiX2ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICBGaWxlIHZvY2FiX2ZpbGUgPSBuZXcgRmlsZShmaWxlX25hbWUpOwogICAgICAgRGF0YUlucHV0U3RyZWFtIHZvY2FiX3N0cmVhbSA9CiAgICAgICAgICAgbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHZvY2FiX2ZpbGUpKSk7CiAgICAgICBpbnQgc2l6ZSA9IHZvY2FiX3N0cmVhbS5yZWFkSW50KCk7CkBAIC0xMDksNDIgKzEwMiwyMiBAQAogICAgIH0KICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBmcmVlemUoKSB7Ci0gICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICBpbnQgY3VycmVudF9pZCA9IDE7Ci0KLSAgICAgIFRyZWVNYXA8TG9uZywgSW50ZWdlcj4gaGFzaF90b19pZCA9IG5ldyBUcmVlTWFwPExvbmcsIEludGVnZXI+KCk7Ci0gICAgICBBcnJheUxpc3Q8U3RyaW5nPiBpZF90b19zdHJpbmcgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oaWRUb1N0cmluZy5zaXplKCkgKyAxKTsKLSAgICAgIGlkX3RvX3N0cmluZy5hZGQoVU5LTk9XTl9JRCwgVU5LTk9XTl9XT1JEKTsKLQotICAgICAgTWFwLkVudHJ5PExvbmcsIEludGVnZXI+IHdhbGtlciA9IGhhc2hUb0lkLmZpcnN0RW50cnkoKTsKLSAgICAgIHdoaWxlICh3YWxrZXIgIT0gbnVsbCkgewotICAgICAgICBTdHJpbmcgd29yZCA9IGhhc2hUb1N0cmluZy5nZXQod2Fsa2VyLmdldEtleSgpKTsKLSAgICAgICAgaGFzaF90b19pZC5wdXQod2Fsa2VyLmdldEtleSgpLCAod2Fsa2VyLmdldFZhbHVlKCkgPCAwID8gLWN1cnJlbnRfaWQgOiBjdXJyZW50X2lkKSk7Ci0gICAgICAgIGlkX3RvX3N0cmluZy5hZGQoY3VycmVudF9pZCwgd29yZCk7Ci0gICAgICAgIGN1cnJlbnRfaWQrKzsKLSAgICAgICAgd2Fsa2VyID0gaGFzaFRvSWQuaGlnaGVyRW50cnkod2Fsa2VyLmdldEtleSgpKTsKLSAgICAgIH0KLSAgICAgIGlkVG9TdHJpbmcgPSBpZF90b19zdHJpbmc7Ci0gICAgICBoYXNoVG9JZCA9IGhhc2hfdG9faWQ7Ci0gICAgfQotICB9Ci0KKyAgLyoqCisgICAqIEdldCB0aGUgaWQgb2YgdGhlIHRva2VuIGlmIGl0IGFscmVhZHkgZXhpc3RzLCBuZXcgaWQgaXMgY3JlYXRlZCBvdGhlcndpc2UuCisgICAqIAorICAgKiBUT0RPOiBjdXJyZW50bHkgbG9ja3MgZm9yIGV2ZXJ5IGNhbGwuCisgICAqIFNlcGFyYXRlIGNvbnN0YW50IChmcm96ZW4pIGlkcyBmcm9tIGNoYW5naW5nIChlLmcuIE9PVikgaWRzLgorICAgKiBDb25zdGFudCBpZHMgY291bGQgYmUgaW1tdXRhYmxlIC0+IG5vIGxvY2tpbmcuCisgICAqIEFsdGVybmF0aXZlbHk6IGNvdWxkIHdlIHVzZSBDb25jdXJyZW50SGFzaE1hcCB0byBub3QgaGF2ZSB0byBsb2NrIGlmIGFjdHVhbGx5IGNvbnRhaW5zIGl0IGFuZCBvbmx5IGxvY2sgZm9yIG1vZGlmaWNhdGlvbnM/IAorICAgKi8KICAgcHVibGljIHN0YXRpYyBpbnQgaWQoU3RyaW5nIHRva2VuKSB7CiAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICBsb25nIGhhc2ggPSAwOwotICAgICAgdHJ5IHsKLSAgICAgICAgaGFzaCA9IE11cm11ckhhc2guaGFzaDY0KHRva2VuKTsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgICAgU3RyaW5nIGhhc2hfd29yZCA9IGhhc2hUb1N0cmluZy5nZXQoaGFzaCk7Ci0gICAgICBpZiAoaGFzaF93b3JkICE9IG51bGwpIHsKLSAgICAgICAgaWYgKCF0b2tlbi5lcXVhbHMoaGFzaF93b3JkKSkgewotICAgICAgICAgIERlY29kZXIuTE9HKDEsIFN0cmluZy5mb3JtYXQoIk11cm11ckhhc2ggZm9yIHRoZSBmb2xsb3dpbmcgc3ltYm9scyBjb2xsaWRlczogJyVzJywgJyVzJyIsIGhhc2hfd29yZCwgdG9rZW4pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFzaFRvSWQuZ2V0KGhhc2gpOworICAgICAgaWYgKHN0cmluZ1RvSWQuY29udGFpbnNLZXkodG9rZW4pKSB7CisgICAgICAgIHJldHVybiBzdHJpbmdUb0lkLmdldCh0b2tlbik7CiAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobm9uVGVybWluYWxJbmRpY2VzICE9IG51bGwgJiYgbnQodG9rZW4pKSB7CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQWZ0ZXIgdGhlIG5vbnRlcm1pbmFsIGluZGljZXMgaGF2ZSBiZWVuIHNldCBieSBjYWxsaW5nIGdldE5vbnRlcm1pbmFsSW5kaWNlcyB5b3UgY2FuJ3QgY2FsbCBpZCBvbiBuZXcgbm9udGVybWluYWxzIGFueW1vcmUuIik7CisgICAgICAgIH0KICAgICAgICAgaW50IGlkID0gaWRUb1N0cmluZy5zaXplKCkgKiAobnQodG9rZW4pID8gLTEgOiAxKTsKIAogICAgICAgICAvLyByZWdpc3RlciB0aGlzICh0b2tlbixpZCkgbWFwcGluZyB3aXRoIGVhY2ggbGFuZ3VhZ2UKQEAgLTE1NCw4ICsxMjcsNyBAQAogICAgICAgICAgIGxtLnJlZ2lzdGVyV29yZCh0b2tlbiwgTWF0aC5hYnMoaWQpKTsKIAogICAgICAgICBpZFRvU3RyaW5nLmFkZCh0b2tlbik7Ci0gICAgICAgIGhhc2hUb1N0cmluZy5wdXQoaGFzaCwgdG9rZW4pOwotICAgICAgICBoYXNoVG9JZC5wdXQoaGFzaCwgaWQpOworICAgICAgICBzdHJpbmdUb0lkLnB1dCh0b2tlbiwgaWQpOwogICAgICAgICByZXR1cm4gaWQ7CiAgICAgICB9CiAgICAgfQpAQCAtMTgwLDggKzE1MiwxMCBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBTdHJpbmcgd29yZChpbnQgaWQpIHsKLSAgICBpZCA9IE1hdGguYWJzKGlkKTsKLSAgICByZXR1cm4gaWRUb1N0cmluZy5nZXQoaWQpOworICAgIHN5bmNocm9uaXplZCAobG9jaykgeworICAgICAgaWQgPSBNYXRoLmFicyhpZCk7CisgICAgICByZXR1cm4gaWRUb1N0cmluZy5nZXQoaWQpOworICAgIH0KICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdvcmRzKGludFtdIGlkcykgewpAQCAtMTk5LDI3ICsxNzMsMzUgQEAKICAgICByZXR1cm4gc2IuZGVsZXRlQ2hhckF0KHNiLmxlbmd0aCgpIC0gMSkudG9TdHJpbmcoKTsKICAgfQogICAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vbnRlcm1pbmFsKFN0cmluZyB3b3JkKSB7Ci0gICAgcmV0dXJuICh3b3JkLnN1YnN0cmluZygwLDEpLmVxdWFscygiWyIpICYmICh3b3JkLnN1YnN0cmluZyh3b3JkLmxlbmd0aCgpIC0gMSx3b3JkLmxlbmd0aCgpKS5lcXVhbHMoIl0iKSkpOwotICB9Ci0gIAogICAvKioKLSAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGluZGljZXMgY29ycmVzcG9uZGluZyB0byBOb250ZXJtaW5hbHMgaW4gdGhlIFZvY2FidWxhcnkKLSAgICogQHJldHVybgorICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgKHBvc2l0aXZlKSBpbmRpY2VzCisgICAqIGNvcnJlc3BvbmRpbmcgdG8gTm9udGVybWluYWxzIGluIHRoZSBWb2NhYnVsYXJ5LgogICAgKi8KICAgcHVibGljIHN0YXRpYyBMaXN0PEludGVnZXI+IGdldE5vbnRlcm1pbmFsSW5kaWNlcygpCiAgIHsKLSAgICBMaXN0PEludGVnZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgaWRUb1N0cmluZy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgd29yZCA9IGlkVG9TdHJpbmcuZ2V0KGkpOwotICAgICAgaWYoaXNOb250ZXJtaW5hbCh3b3JkKSl7ICAKLSAgICAgICAgcmVzdWx0LmFkZChpKTsKKyAgICBpZiAobm9uVGVybWluYWxJbmRpY2VzID09IG51bGwpIHsKKyAgICAgIHN5bmNocm9uaXplZCAobG9jaykgeworICAgICAgICBpZiAobm9uVGVybWluYWxJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICBub25UZXJtaW5hbEluZGljZXMgPSBmaW5kTm9uVGVybWluYWxJbmRpY2VzKCk7CisgICAgICAgIH0KICAgICAgIH0KLSAgICB9IAotICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiBub25UZXJtaW5hbEluZGljZXM7CiAgIH0KLSAgCisKKyAgLyoqCisgICAqIEl0ZXJhdGVzIG92ZXIgdGhlIFZvY2FidWxhcnkgYW5kIGZpbmRzIGFsbCBub24gdGVybWluYWwgaW5kaWNlcy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIExpc3Q8SW50ZWdlcj4gZmluZE5vblRlcm1pbmFsSW5kaWNlcygpIHsKKyAgICBMaXN0PEludGVnZXI+IG5vblRlcm1pbmFsSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgaWRUb1N0cmluZy5zaXplKCk7IGkrKykgeworICAgICAgZmluYWwgU3RyaW5nIHdvcmQgPSBpZFRvU3RyaW5nLmdldChpKTsKKyAgICAgIGlmKGlzTm9udGVybWluYWwod29yZCkpeworICAgICAgICBub25UZXJtaW5hbEluZGljZXMuYWRkKGkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbm9uVGVybWluYWxJbmRpY2VzOworICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VW5rbm93bklkKCkgewogICAgIHJldHVybiBVTktOT1dOX0lEOwpAQCAtMjUzLDU5ICsyMzUsMjAgQEAKICAgICByZXR1cm4gRm9ybWF0VXRpbHMuZ2V0Tm9udGVybWluYWxJbmRleCh3b3JkKGlkKSk7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFyKCkgewotICAgIGhhc2hUb0lkID0gbmV3IFRyZWVNYXA8TG9uZywgSW50ZWdlcj4oKTsKLSAgICBoYXNoVG9TdHJpbmcgPSBuZXcgVHJlZU1hcDxMb25nLCBTdHJpbmc+KCk7Ci0gICAgaWRUb1N0cmluZyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgaWRUb1N0cmluZy5hZGQoVU5LTk9XTl9JRCwgVU5LTk9XTl9XT1JEKTsKLSAgfQotCiAgIC8qKgotICAgKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgYSBxdWVyeSBoYXMgYmVlbiBtYWRlIGZvciBhIHN5bWJvbCB0aGF0IGlzIG5vdCBrbm93bi4KLSAgICogCi0gICAqIEBhdXRob3IgTGFuZSBTY2h3YXJ0egorICAgKiBDbGVhcnMgdGhlIHZvY2FidWxhcnkgYW5kIGluaXRpYWxpemVzIGl0IHdpdGggYW4gdW5rbm93biB3b3JkLgorICAgKiBSZWdpc3RlcmVkIGxhbmd1YWdlIG1vZGVscyBhcmUgbGVmdCB1bmNoYW5nZWQuCiAgICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFVua25vd25TeW1ib2xFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKCkgeworICAgIHN5bmNocm9uaXplZCAobG9jaykgeworICAgICAgbm9uVGVybWluYWxJbmRpY2VzID0gbnVsbDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gaW5kaWNhdGluZyB0aGF0IHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllciBjYW5ub3QgYmUgZm91bmQgaW4gdGhlCi0gICAgICogc3ltYm9sIHRhYmxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCBJbnRlZ2VyIGlkZW50aWZpZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgVW5rbm93blN5bWJvbEV4Y2VwdGlvbihpbnQgaWQpIHsKLSAgICAgIHN1cGVyKCJJZGVudGlmaWVyICIgKyBpZCArICIgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBzeW1ib2wgdGFibGUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIHNwZWNpZmllZCBzeW1ib2wgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBzeW1ib2wKLSAgICAgKiB0YWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3ltYm9sIFN0cmluZyBzeW1ib2wKLSAgICAgKi8KLSAgICBwdWJsaWMgVW5rbm93blN5bWJvbEV4Y2VwdGlvbihTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICBzdXBlcigiU3ltYm9sICIgKyBzeW1ib2wgKyAiIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgc3ltYm9sIHRhYmxlIik7CisgICAgICBpZFRvU3RyaW5nID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICBzdHJpbmdUb0lkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOyAgICAgIAorICAKKyAgICAgIGlkVG9TdHJpbmcuYWRkKFVOS05PV05fSUQsIFVOS05PV05fV09SRCk7CisgICAgICBzdHJpbmdUb0lkLnB1dChVTktOT1dOX1dPUkQsIFVOS05PV05fSUQpOwogICAgIH0KICAgfQotCi0gIC8qKgotICAgKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgd29yZCBoYXNoaW5nIGhhcyBwcm9kdWNlZCBhIGNvbGxpc2lvbi4KLSAgICogCi0gICAqIEBhdXRob3IgSnVyaSBHYW5pdGtldml0Y2gKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGFzaENvbGxpc2lvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgSGFzaENvbGxpc2lvbkV4Y2VwdGlvbihTdHJpbmcgZmlyc3QsIFN0cmluZyBzZWNvbmQpIHsKLSAgICAgIHN1cGVyKCJNdXJtdXJIYXNoIGZvciB0aGUgZm9sbG93aW5nIHN5bWJvbHMgY29sbGlkZXM6ICciICsgZmlyc3QgKyAiJywgJyIgKyBzZWNvbmQgKyAiJyIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiB3b3JkSXRlcmF0b3IoKSB7Ci0gICAgcmV0dXJuIGlkVG9TdHJpbmcuaXRlcmF0b3IoKTsKLSAgfQorICAKIH0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9BcmdzUGFyc2VyLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvQXJnc1BhcnNlci5qYXZhCmluZGV4IDI3MDAzMGQuLjIzMWY1YTEgMTAwNjQ0Ci0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9BcmdzUGFyc2VyLmphdmEKKysrIGIvc3JjL2pvc2h1YS9kZWNvZGVyL0FyZ3NQYXJzZXIuamF2YQpAQCAtNSw2ICs1LDggQEAKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CiAKK2ltcG9ydCBqb3NodWEudXRpbC5pby5MaW5lUmVhZGVyOworCiAvKioKICAqIEBhdXRob3Igb3JsdWtlCiAgKiAKQEAgLTE4LDggKzIwLDkgQEAKICAgICogZXhlY3V0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgogICAgKiAKICAgICogQHBhcmFtIGFyZ3MKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAKICAgICovCi0gIHB1YmxpYyBBcmdzUGFyc2VyKFN0cmluZ1tdIGFyZ3MsIEpvc2h1YUNvbmZpZ3VyYXRpb24gam9zaHVhQ29uZmlndXJhdGlvbikgeworICBwdWJsaWMgQXJnc1BhcnNlcihTdHJpbmdbXSBhcmdzLCBKb3NodWFDb25maWd1cmF0aW9uIGpvc2h1YUNvbmZpZ3VyYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKICAgICAvKgogICAgICAqIExvb2sgZm9yIGEgdmVyYm9zZSBmbGFnLCAtdi4KQEAgLTM1LDcgKzM4LDEwIEBACiAgICAgICAgIH0KICAgICAgIAogICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi12ZXJzaW9uIikpIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBKb3NodWEgbWFjaGluZSB0cmFuc2xhdG9yLCB2ZXJzaW9uIDYuMCAoZ2l0OiAiKTsKKyAgICAgICAgICBMaW5lUmVhZGVyIHJlYWRlciA9IG5ldyBMaW5lUmVhZGVyKFN0cmluZy5mb3JtYXQoIiVzL1ZFUlNJT04iLCBTeXN0ZW0uZ2V0ZW52KCJKT1NIVUEiKSkpOworICAgICAgICAgIHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gcmVhZGVyLnJlYWRMaW5lKCkuc3BsaXQoIlxccysiKVsyXTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiVGhlIEpvc2h1YSBtYWNoaW5lIHRyYW5zbGF0b3IsIHZlcnNpb24gJXMiLCB2ZXJzaW9uKSk7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJqb3NodWEtZGVjb2Rlci5vcmciKTsKICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL0RlY29kZXIuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9EZWNvZGVyLmphdmEKaW5kZXggZjQ4OWE3Ny4uY2FhMzI1OCAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL0RlY29kZXIuamF2YQorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvRGVjb2Rlci5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiBpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYudG0uR3JhbW1hcjsKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi50bS5oYXNoX2Jhc2VkLk1lbW9yeUJhc2VkQmF0Y2hHcmFtbWFyOwogaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLnRtLnBhY2tlZC5QYWNrZWRHcmFtbWFyOwotaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmh5cGVyZ3JhcGguSHlwZXJHcmFwaDsKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5pby5UcmFuc2xhdGlvblJlcXVlc3Q7CiBpbXBvcnQgam9zaHVhLmRlY29kZXIucGhyYXNlLlBocmFzZVRhYmxlOwogaW1wb3J0IGpvc2h1YS5kZWNvZGVyLnNlZ21lbnRfZmlsZS5TZW50ZW5jZTsKQEAgLTYzLDE2ICs2Miw2IEBACiAgIHByaXZhdGUgTGlzdDxHcmFtbWFyPiBncmFtbWFyczsKICAgcHJpdmF0ZSBBcnJheUxpc3Q8RmVhdHVyZUZ1bmN0aW9uPiBmZWF0dXJlRnVuY3Rpb25zOwogCi0gIC8qCi0gICAqIEEgc29ydGVkIGxpc3Qgb2YgdGhlIGZlYXR1cmUgbmFtZXMgKHNvIHRoZXkgY2FuIGJlIG91dHB1dCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlYWQgaW4pCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxTdHJpbmc+IGZlYXR1cmVfbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgCi0gIC8qCi0gICAqIEp1c3QgdGhlIGRlbnNlIGZlYXR1cmVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBBcnJheUxpc3Q8U3RyaW5nPiBkZW5zZV9mZWF0dXJlX25hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KICAgLyogVGhlIGZlYXR1cmUgd2VpZ2h0cy4gKi8KICAgcHVibGljIHN0YXRpYyBGZWF0dXJlVmVjdG9yIHdlaWdodHM7CiAKQEAgLTM2Myw5ICszNTIsNyBAQAogICAgKi8KICAgcHJpdmF0ZSBTdHJpbmcgbW9zZXNpemUoU3RyaW5nIGZlYXR1cmUpIHsKICAgICBpZiAoam9zaHVhQ29uZmlndXJhdGlvbi5tb3NlcykgewotICAgICAgaWYgKGZlYXR1cmUuZXF1YWxzKCJPT1ZQZW5hbHR5IikpCi0gICAgICAgIHJldHVybiAiT09WX1BlbmFsdHkiOwotICAgICAgZWxzZSBpZiAoZmVhdHVyZS5zdGFydHNXaXRoKCJ0bV8iKSB8fCBmZWF0dXJlLnN0YXJ0c1dpdGgoImxtXyIpKQorICAgICAgaWYgKGZlYXR1cmUuc3RhcnRzV2l0aCgidG1fIikgfHwgZmVhdHVyZS5zdGFydHNXaXRoKCJsbV8iKSkKICAgICAgICAgcmV0dXJuIGZlYXR1cmUucmVwbGFjZSgiXyIsICItIik7CiAgICAgfQogICAgIApAQCAtNDIwLDI5ICs0MDcsMTEgQEAKICAgICAgICAgICBTeXN0ZW0uZXhpdCgxNyk7CiAgICAgICAgIH0KIAotICAgICAgICAvKiBXZWlnaHRzIGNvdWxkIGJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpZiBvdmVycmlkZGVuIGZyb20gdGhlIGNvbW1hbmQgbGluZSAqLwotICAgICAgICBpZiAoISB3ZWlnaHRzLmNvbnRhaW5zS2V5KHBhaXJbMF0pKSB7Ci0gICAgICAgICAgZmVhdHVyZV9uYW1lcy5hZGQocGFpclswXSk7Ci0gICAgICAgICAgaWYgKEZlYXR1cmVWZWN0b3IuaXNEZW5zZShwYWlyWzBdKSkKLSAgICAgICAgICAgIGRlbnNlX2ZlYXR1cmVfbmFtZXMuYWRkKHBhaXJbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgd2VpZ2h0cy5wdXQocGFpclswXSwgRmxvYXQucGFyc2VGbG9hdChwYWlyWzFdKSk7CisgICAgICAgIHdlaWdodHMuc2V0KHBhaXJbMF0sIEZsb2F0LnBhcnNlRmxvYXQocGFpclsxXSkpOwogICAgICAgfQogCi0gICAgICAvLyBUaGlzIGlzIG1vc3RseSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNb3NlcyB0dW5pbmcgc2NyaXB0Ci0gICAgICBpZiAoam9zaHVhQ29uZmlndXJhdGlvbi5zaG93X3dlaWdodHNfYW5kX3F1aXQpIHsKLSAgICAgICAgZm9yIChTdHJpbmcga2V5IDogRGVjb2Rlci5kZW5zZV9mZWF0dXJlX25hbWVzKSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVzPSAlLjVmIiwgbW9zZXNpemUoa2V5KSwgd2VpZ2h0cy5nZXQoa2V5KSkpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgfQotCi0gICAgICBpZiAoIXdlaWdodHMuY29udGFpbnNLZXkoIkJMRVUiKSkKLSAgICAgICAgRGVjb2Rlci53ZWlnaHRzLnB1dCgiQkxFVSIsIDAuMGYpOwotCi0gICAgICBEZWNvZGVyLkxPRygxLCBTdHJpbmcuZm9ybWF0KCJSZWFkICVkIHNwYXJzZSBhbmQgJWQgZGVuc2Ugd2VpZ2h0cyIsIHdlaWdodHMuc2l6ZSgpCi0gICAgICAgICAgLSBkZW5zZV9mZWF0dXJlX25hbWVzLnNpemUoKSwgZGVuc2VfZmVhdHVyZV9uYW1lcy5zaXplKCkpKTsKKyAgICAgIERlY29kZXIuTE9HKDEsIFN0cmluZy5mb3JtYXQoIlJlYWQgJWQgd2VpZ2h0cyAoJWQgb2YgdGhlbSBkZW5zZSkiLCB3ZWlnaHRzLnNpemUoKSwKKyAgICAgICAgICB3ZWlnaHRzLkRFTlNFX0ZFQVRVUkVfTkFNRVMuc2l6ZSgpKSk7CiAKICAgICAgIC8vIERvIHRoaXMgYmVmb3JlIGxvYWRpbmcgdGhlIGdyYW1tYXJzIGFuZCB0aGUgTE0uCiAgICAgICB0aGlzLmZlYXR1cmVGdW5jdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEZlYXR1cmVGdW5jdGlvbj4oKTsKQEAgLTQ1Nyw2ICs0MjYsMTggQEAKICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZlYXR1cmVzOiByZXF1aXJlcyB0aGF0IExNIG1vZGVsIGhhcyBiZWVuIGluaXRpYWxpemVkLgogICAgICAgdGhpcy5pbml0aWFsaXplRmVhdHVyZUZ1bmN0aW9ucygpOwogCisgICAgICAvLyBUaGlzIGlzIG1vc3RseSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNb3NlcyB0dW5pbmcgc2NyaXB0CisgICAgICBpZiAoam9zaHVhQ29uZmlndXJhdGlvbi5zaG93X3dlaWdodHNfYW5kX3F1aXQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWlnaHRzLkRFTlNFX0ZFQVRVUkVfTkFNRVMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSA9IHdlaWdodHMuREVOU0VfRkVBVFVSRV9OQU1FUy5nZXQoaSk7CisgICAgICAgICAgaWYgKGpvc2h1YUNvbmZpZ3VyYXRpb24ubW9zZXMpIAorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVzPSAlLjVmIiwgbW9zZXNpemUobmFtZSksIHdlaWdodHMuZ2V0RGVuc2UoaSkpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiJXMgJS41ZiIsIG5hbWUsIHdlaWdodHMuZ2V0RGVuc2UoaSkpKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgIH0KKyAgICAgIAogICAgICAgLy8gU29ydCB0aGUgVE0gZ3JhbW1hcnMgKG5lZWRlZCB0byBkbyBjdWJlIHBydW5pbmcpCiAgICAgICBpZiAoam9zaHVhQ29uZmlndXJhdGlvbi5hbW9ydGl6ZWRfc29ydGluZykgewogICAgICAgICBEZWNvZGVyLkxPRygxLCAiR3JhbW1hciBzb3J0aW5nIGhhcHBlbmluZyBsYXppbHkgb24tZGVtYW5kLiIpOwpAQCAtNDk1LDYgKzQ3Niw5IEBACiAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVHJhbnNsYXRpb25HcmFtbWFycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgCiAgICAgaWYgKGpvc2h1YUNvbmZpZ3VyYXRpb24udG1zLnNpemUoKSA+IDApIHsKKyAgICAgIAorICAgICAgLy8gY29sbGVjdCBwYWNrZWRHcmFtbWFycyB0byBjaGVjayBpZiB0aGV5IHVzZSBhIHNoYXJlZCB2b2NhYnVsYXJ5CisgICAgICBmaW5hbCBMaXN0PFBhY2tlZEdyYW1tYXI+IHBhY2tlZF9ncmFtbWFycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgICAvLyB0bSA9IHt0aHJheC9oaWVybyxwYWNrZWQsc2FtdCxtb3Nlc30gT1dORVIgTElNSVQgRklMRQogICAgICAgZm9yIChTdHJpbmcgdG1MaW5lIDogam9zaHVhQ29uZmlndXJhdGlvbi50bXMpIHsKQEAgLTUwOCwxMCArNDkyLDEyIEBACiAgICAgICAgIFN0cmluZyBwYXRoID0gcGFyc2VkQXJncy5nZXQoInBhdGgiKTsKIAogICAgICAgICBHcmFtbWFyIGdyYW1tYXIgPSBudWxsOwotICAgICAgICBpZiAoISB0eXBlLmVxdWFscygibW9zZXMiKSkgeworICAgICAgICBpZiAoISB0eXBlLmVxdWFscygibW9zZXMiKSAmJiAhIHR5cGUuZXF1YWxzKCJwaHJhc2UiKSkgewogICAgICAgICAgIGlmIChuZXcgRmlsZShwYXRoKS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBncmFtbWFyID0gbmV3IFBhY2tlZEdyYW1tYXIocGF0aCwgc3Bhbl9saW1pdCwgb3duZXIsIHR5cGUsIGpvc2h1YUNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgICBQYWNrZWRHcmFtbWFyIHBhY2tlZF9ncmFtbWFyID0gbmV3IFBhY2tlZEdyYW1tYXIocGF0aCwgc3Bhbl9saW1pdCwgb3duZXIsIHR5cGUsIGpvc2h1YUNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgICBwYWNrZWRfZ3JhbW1hcnMuYWRkKHBhY2tlZF9ncmFtbWFyKTsKKyAgICAgICAgICAgICAgZ3JhbW1hciA9IHBhY2tlZF9ncmFtbWFyOwogICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKFN0cmluZy5mb3JtYXQoIkNvdWxkbid0IGxvYWQgcGFja2VkIGdyYW1tYXIgZnJvbSAnJXMnIiwgcGF0aCkpOwogICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlBlcmhhcHMgaXQgZG9lc24ndCBleGlzdCwgb3IgaXQgbWF5IGJlIGFuIG9sZCBwYWNrZWQgZmlsZSBmb3JtYXQuIik7CkBAIC01MzAsMTEgKzUxNiwxNCBAQAogICAgICAgICAgICAgICA6IC0xOwogCiAgICAgICAgICAgam9zaHVhQ29uZmlndXJhdGlvbi5zZWFyY2hfYWxnb3JpdGhtID0gInN0YWNrIjsKLSAgICAgICAgICBncmFtbWFyID0gbmV3IFBocmFzZVRhYmxlKHBhdGgsIG93bmVyLCBqb3NodWFDb25maWd1cmF0aW9uLCBtYXhTb3VyY2VMZW4pOworICAgICAgICAgIGdyYW1tYXIgPSBuZXcgUGhyYXNlVGFibGUocGF0aCwgb3duZXIsIHR5cGUsIGpvc2h1YUNvbmZpZ3VyYXRpb24sIG1heFNvdXJjZUxlbik7CiAgICAgICAgIH0KIAogICAgICAgICB0aGlzLmdyYW1tYXJzLmFkZChncmFtbWFyKTsKICAgICAgIH0KKworICAgICAgY2hlY2tTaGFyZWRWb2NhYnVsYXJ5Q2hlY2tzdW1zRm9yUGFja2VkR3JhbW1hcnMocGFja2VkX2dyYW1tYXJzKTsKKwogICAgIH0gZWxzZSB7CiAgICAgICBEZWNvZGVyLkxPRygxLCAiKiBXQVJOSU5HOiBubyBncmFtbWFycyBzdXBwbGllZCEgIFN1cHBseWluZyBkdW1teSBnbHVlIGdyYW1tYXIuIik7CiAgICAgICBNZW1vcnlCYXNlZEJhdGNoR3JhbW1hciBnbHVlR3JhbW1hciA9IG5ldyBNZW1vcnlCYXNlZEJhdGNoR3JhbW1hcigiZ2x1ZSIsIGpvc2h1YUNvbmZpZ3VyYXRpb24pOwpAQCAtNTQyLDcgKzUzMSw3IEBACiAgICAgICBnbHVlR3JhbW1hci5hZGRHbHVlUnVsZXMoZmVhdHVyZUZ1bmN0aW9ucyk7CiAgICAgICB0aGlzLmdyYW1tYXJzLmFkZChnbHVlR3JhbW1hcik7CiAgICAgfQotCisgICAgCiAgICAgLyogTm93IGNyZWF0ZSBhIGZlYXR1cmUgZnVuY3Rpb24gZm9yIGVhY2ggb3duZXIgKi8KICAgICBIYXNoU2V0PFN0cmluZz4gb3duZXJzU2VlbiA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKIApAQCAtNTUwLDcgKzUzOSw3IEBACiAgICAgICBTdHJpbmcgb3duZXIgPSBWb2NhYnVsYXJ5LndvcmQoZ3JhbW1hci5nZXRPd25lcigpKTsKICAgICAgIGlmICghIG93bmVyc1NlZW4uY29udGFpbnMob3duZXIpKSB7CiAgICAgICAgIHRoaXMuZmVhdHVyZUZ1bmN0aW9ucy5hZGQobmV3IFBocmFzZU1vZGVsKHdlaWdodHMsIG5ldyBTdHJpbmdbXSB7ICJ0bSIsICItb3duZXIiLCBvd25lciB9LAotICAgICAgICAgICAgam9zaHVhQ29uZmlndXJhdGlvbikpOworICAgICAgICAgICAgam9zaHVhQ29uZmlndXJhdGlvbiwgZ3JhbW1hcikpOwogICAgICAgICBvd25lcnNTZWVuLmFkZChvd25lcik7CiAgICAgICB9CiAgICAgfQpAQCAtNTU4LDYgKzU0NywyNiBAQAogICAgIERlY29kZXIuTE9HKDEsIFN0cmluZy5mb3JtYXQoIk1lbW9yeSB1c2VkICUuMWYgTUIiLAogICAgICAgICAoKFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkgLSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkpIC8gMTAwMDAwMC4wKSkpOwogICB9CisgIAorICAvKioKKyAgICogQ2hlY2tzIGlmIG11bHRpcGxlIHBhY2tlZEdyYW1tYXJzIGhhdmUgdGhlIHNhbWUgdm9jYWJ1bGFyeSBieSBjb21wYXJpbmcgdGhlaXIgdm9jYWJ1bGFyeSBmaWxlIGNoZWNrc3Vtcy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tTaGFyZWRWb2NhYnVsYXJ5Q2hlY2tzdW1zRm9yUGFja2VkR3JhbW1hcnMoZmluYWwgTGlzdDxQYWNrZWRHcmFtbWFyPiBwYWNrZWRfZ3JhbW1hcnMpIHsKKyAgICBTdHJpbmcgcHJldmlvdXNfY2hlY2tzdW0gPSAiIjsKKyAgICBmb3IgKFBhY2tlZEdyYW1tYXIgZ3JhbW1hciA6IHBhY2tlZF9ncmFtbWFycykgeworICAgICAgZmluYWwgU3RyaW5nIGNoZWNrc3VtID0gZ3JhbW1hci5jb21wdXRlVm9jYWJ1bGFyeUNoZWNrc3VtKCk7CisgICAgICBpZiAocHJldmlvdXNfY2hlY2tzdW0uaXNFbXB0eSgpKSB7CisgICAgICAgIHByZXZpb3VzX2NoZWNrc3VtID0gY2hlY2tzdW07CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWNoZWNrc3VtLmVxdWFscyhwcmV2aW91c19jaGVja3N1bSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIlRyeWluZyB0byBsb2FkIG11bHRpcGxlIHBhY2tlZCBncmFtbWFycyB3aXRoIGRpZmZlcmVudCB2b2NhYnVsYXJpZXMhIiArCisgICAgICAgICAgICAgICJIYXZlIHlvdSBwYWNrZWQgdGhlbSBqb2ludGx5PyIpOworICAgICAgICB9CisgICAgICAgIHByZXZpb3VzX2NoZWNrc3VtID0gY2hlY2tzdW07CisgICAgICB9CisgICAgfQorICB9CiAKICAgLyoKICAgICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgd2VpZ2h0cyBmb3IgdGhlIG1vZGVsLiBGZWF0dXJlIG5hbWVzIGFuZCB0aGVpciB3ZWlnaHRzIGFyZSBsaXN0ZWQgb25lCkBAIC01OTAsMTEgKzU5OSw3IEBACiAgICAgICAgICAgZmVhdHVyZSA9IGRlbW9zZXMoZmVhdHVyZSk7CiAgICAgICAgIH0KIAotICAgICAgICB3ZWlnaHRzLnB1dChmZWF0dXJlLCB2YWx1ZSk7Ci0gICAgICAgIGZlYXR1cmVfbmFtZXMuYWRkKGZlYXR1cmUpOwotICAgICAgICBpZiAoRmVhdHVyZVZlY3Rvci5pc0RlbnNlKGZlYXR1cmUpKQotICAgICAgICAgIGRlbnNlX2ZlYXR1cmVfbmFtZXMuYWRkKGZlYXR1cmUpOwotCisgICAgICAgIHdlaWdodHMuaW5jcmVtZW50KGZlYXR1cmUsIHZhbHVlKTsKICAgICAgIH0KICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gaW9lKSB7CiAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiogRkFUQUw6IENhbid0IGZpbmQgd2VpZ2h0cy1maWxlICciICsgZmlsZU5hbWUgKyAiJyIpOwpAQCAtNjU2LDcgKzY2MSwxMCBAQAogCiAgICAgZm9yIChGZWF0dXJlRnVuY3Rpb24gZmVhdHVyZSA6IGZlYXR1cmVGdW5jdGlvbnMpIHsKICAgICAgIERlY29kZXIuTE9HKDEsIFN0cmluZy5mb3JtYXQoIkZFQVRVUkU6ICVzIiwgZmVhdHVyZS5sb2dTdHJpbmcoKSkpOworICAgICAgCiAgICAgfQorCisgICAgd2VpZ2h0cy5yZWdpc3RlckRlbnNlRmVhdHVyZXMoZmVhdHVyZUZ1bmN0aW9ucyk7CiAgIH0KIAogICAvKioKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9Kb3NodWFDb25maWd1cmF0aW9uLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvSm9zaHVhQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IGZlM2UxNDIuLmRkOThlZmEgMTAwNjQ0Ci0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9Kb3NodWFDb25maWd1cmF0aW9uLmphdmEKKysrIGIvc3JjL2pvc2h1YS9kZWNvZGVyL0pvc2h1YUNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMSw1ICsxLDggQEAKIHBhY2thZ2Ugam9zaHVhLmRlY29kZXI7CiAKK2ltcG9ydCBzdGF0aWMgam9zaHVhLnV0aWwuRm9ybWF0VXRpbHMuY2xlYW5Ob25UZXJtaW5hbDsKK2ltcG9ydCBzdGF0aWMgam9zaHVhLnV0aWwuRm9ybWF0VXRpbHMubWFya3VwOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNDM4LDExICs0NDEsMTEgQEAKICAgICAgICAgICAgIGxhdHRpY2VfZGVjb2RpbmcgPSB0cnVlOwogCiAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXIuZXF1YWxzKG5vcm1hbGl6ZV9rZXkoImRlZmF1bHQtbm9uLXRlcm1pbmFsIikpKSB7Ci0gICAgICAgICAgICBkZWZhdWx0X25vbl90ZXJtaW5hbCA9IFN0cmluZy5mb3JtYXQoIlslc10iLCBGb3JtYXRVdGlscy5jbGVhbk5vbnRlcm1pbmFsKGZkc1sxXS50cmltKCkpKTsKKyAgICAgICAgICAgIGRlZmF1bHRfbm9uX3Rlcm1pbmFsID0gbWFya3VwKGNsZWFuTm9uVGVybWluYWwoZmRzWzFdLnRyaW0oKSkpOwogICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdChTdHJpbmcuZm9ybWF0KCJkZWZhdWx0X25vbl90ZXJtaW5hbDogJXMiLCBkZWZhdWx0X25vbl90ZXJtaW5hbCkpOwogCiAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXIuZXF1YWxzKG5vcm1hbGl6ZV9rZXkoImdvYWwtc3ltYm9sIikpKSB7Ci0gICAgICAgICAgICBnb2FsX3N5bWJvbCA9IFN0cmluZy5mb3JtYXQoIlslc10iLCBGb3JtYXRVdGlscy5jbGVhbk5vbnRlcm1pbmFsKGZkc1sxXS50cmltKCkpKTsKKyAgICAgICAgICAgIGdvYWxfc3ltYm9sID0gbWFya3VwKGNsZWFuTm9uVGVybWluYWwoZmRzWzFdLnRyaW0oKSkpOwogICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgiZ29hbFN5bWJvbDogIiArIGdvYWxfc3ltYm9sKTsKIAogICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyLmVxdWFscyhub3JtYWxpemVfa2V5KCJ3ZWlnaHRzLWZpbGUiKSkpIHsKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9UcmFuc2xhdGlvbi5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL1RyYW5zbGF0aW9uLmphdmEKaW5kZXggMzU1ZTkxMS4uNDI3ZTNkOSAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL1RyYW5zbGF0aW9uLmphdmEKKysrIGIvc3JjL2pvc2h1YS9kZWNvZGVyL1RyYW5zbGF0aW9uLmphdmEKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogICAgICAgICAvLyBXZSBtdXN0IHB1dCB0aGlzIHdlaWdodCBhcyB6ZXJvLCBvdGhlcndpc2Ugd2UgZ2V0IGFuIGVycm9yIHdoZW4gd2UgdHJ5IHRvIHJldHJpZXZlIGl0CiAgICAgICAgIC8vIHdpdGhvdXQgY2hlY2tpbmcKLSAgICAgICAgRGVjb2Rlci53ZWlnaHRzLnB1dCgiQkxFVSIsIDApOworICAgICAgICBEZWNvZGVyLndlaWdodHMuaW5jcmVtZW50KCJCTEVVIiwgMCk7CiAKICAgICAgICAgU3RyaW5nIGJlc3QgPSBWaXRlcmJpRXh0cmFjdG9yLmV4dHJhY3RWaXRlcmJpU3RyaW5nKGh5cGVyZ3JhcGguZ29hbE5vZGUpLnRyaW0oKTsKICAgICAgICAgYmVzdCA9IGJlc3Quc3Vic3RyaW5nKGJlc3QuaW5kZXhPZignICcpICsgMSwgYmVzdC5sYXN0SW5kZXhPZignICcpKTsKQEAgLTc0LDEwICs3NCwxMCBAQAogICAgICAgICAgIGtCZXN0RXh0cmFjdG9yLmxhenlLQmVzdEV4dHJhY3RPbkhHKGh5cGVyZ3JhcGgsIGpvc2h1YUNvbmZpZ3VyYXRpb24udG9wTiwgb3V0KTsKIAogICAgICAgICAgIGlmIChqb3NodWFDb25maWd1cmF0aW9uLnJlc2NvcmVGb3Jlc3QpIHsKLSAgICAgICAgICAgIERlY29kZXIud2VpZ2h0cy5wdXQoIkJMRVUiLCBqb3NodWFDb25maWd1cmF0aW9uLnJlc2NvcmVGb3Jlc3RXZWlnaHQpOworICAgICAgICAgICAgRGVjb2Rlci53ZWlnaHRzLmluY3JlbWVudCgiQkxFVSIsIGpvc2h1YUNvbmZpZ3VyYXRpb24ucmVzY29yZUZvcmVzdFdlaWdodCk7CiAgICAgICAgICAgICBrQmVzdEV4dHJhY3Rvci5sYXp5S0Jlc3RFeHRyYWN0T25IRyhoeXBlcmdyYXBoLCBqb3NodWFDb25maWd1cmF0aW9uLnRvcE4sIG91dCk7CiAKLSAgICAgICAgICAgIERlY29kZXIud2VpZ2h0cy5wdXQoIkJMRVUiLCAtam9zaHVhQ29uZmlndXJhdGlvbi5yZXNjb3JlRm9yZXN0V2VpZ2h0KTsKKyAgICAgICAgICAgIERlY29kZXIud2VpZ2h0cy5pbmNyZW1lbnQoIkJMRVUiLCAtam9zaHVhQ29uZmlndXJhdGlvbi5yZXNjb3JlRm9yZXN0V2VpZ2h0KTsKICAgICAgICAgICAgIGtCZXN0RXh0cmFjdG9yLmxhenlLQmVzdEV4dHJhY3RPbkhHKGh5cGVyZ3JhcGgsIGpvc2h1YUNvbmZpZ3VyYXRpb24udG9wTiwgb3V0KTsKICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9jaGFydF9wYXJzZXIvQ2hhcnQuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9jaGFydF9wYXJzZXIvQ2hhcnQuamF2YQppbmRleCA3NjliNzQxLi5kMjNkNGVlIDEwMDY0NAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvY2hhcnRfcGFyc2VyL0NoYXJ0LmphdmEKKysrIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2NoYXJ0X3BhcnNlci9DaGFydC5qYXZhCkBAIC0xMzQsNyArMTM0LDYgQEAKICAgICB0aGlzLmRvdGNoYXJ0cyA9IG5ldyBEb3RDaGFydFt0aGlzLmdyYW1tYXJzLmxlbmd0aF07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmdyYW1tYXJzLmxlbmd0aDsgaSsrKQogICAgICAgdGhpcy5kb3RjaGFydHNbaV0gPSBuZXcgRG90Q2hhcnQodGhpcy5pbnB1dExhdHRpY2UsIHRoaXMuZ3JhbW1hcnNbaV0sIHRoaXMsCi0gICAgICAgICAgTm9udGVybWluYWxNYXRjaGVyLmNyZWF0ZU5vbnRlcm1pbmFsTWF0Y2hlcihjb25maWcyKSwKICAgICAgICAgICB0aGlzLmdyYW1tYXJzW2ldLmlzUmVnZXhwR3JhbW1hcigpKTsKIAogICAgIC8vIEJlZ2luIHRvIGRvIGluaXRpYWxpemF0aW9uIHdvcmsKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9jaGFydF9wYXJzZXIvQ29tcHV0ZU5vZGVSZXN1bHQuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9jaGFydF9wYXJzZXIvQ29tcHV0ZU5vZGVSZXN1bHQuamF2YQppbmRleCA2ZmQyOTRjLi5kZGY4NThlIDEwMDY0NAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvY2hhcnRfcGFyc2VyL0NvbXB1dGVOb2RlUmVzdWx0LmphdmEKKysrIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2NoYXJ0X3BhcnNlci9Db21wdXRlTm9kZVJlc3VsdC5qYXZhCkBAIC05MCw4ICs5MCw4IEBACiAgICAgICAKICAgICAgIGlmIChEZWNvZGVyLlZFUkJPU0UgPj0gNCkKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKFN0cmluZy5mb3JtYXQoIi0+IEZFQVRVUkUgJXMgPSAlLjNmICogJS4zZiA9ICUuM2YiLCAKLSAgICAgICAgICAgIGZlYXR1cmUuZ2V0TmFtZSgpLCBhY2MuZ2V0U2NvcmUoKSAvIERlY29kZXIud2VpZ2h0cy5nZXQoZmVhdHVyZS5nZXROYW1lKCkpLAotICAgICAgICAgICAgRGVjb2Rlci53ZWlnaHRzLmdldChmZWF0dXJlLmdldE5hbWUoKSksIGFjYy5nZXRTY29yZSgpKSk7CisgICAgICAgICAgICBmZWF0dXJlLmdldE5hbWUoKSwgYWNjLmdldFNjb3JlKCkgLyBEZWNvZGVyLndlaWdodHMuZ2V0U3BhcnNlKGZlYXR1cmUuZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgIERlY29kZXIud2VpZ2h0cy5nZXRTcGFyc2UoZmVhdHVyZS5nZXROYW1lKCkpLCBhY2MuZ2V0U2NvcmUoKSkpOwogCiAgICAgICBpZiAoZmVhdHVyZS5pc1N0YXRlZnVsKCkpIHsKICAgICAgICAgZnV0dXJlQ29zdEVzdGltYXRlICs9IGZlYXR1cmUuZXN0aW1hdGVGdXR1cmVDb3N0KHJ1bGUsIG5ld1N0YXRlLCBzZW50ZW5jZSk7CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvY2hhcnRfcGFyc2VyL0RvdENoYXJ0LmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvY2hhcnRfcGFyc2VyL0RvdENoYXJ0LmphdmEKaW5kZXggM2NhZjM1Mi4uYzA4Y2YzNyAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2NoYXJ0X3BhcnNlci9Eb3RDaGFydC5qYXZhCisrKyBiL3NyYy9qb3NodWEvZGVjb2Rlci9jaGFydF9wYXJzZXIvRG90Q2hhcnQuamF2YQpAQCAtNzQsMTIgKzc0LDYgQEAKIAogICAvKiBJZiBlbmFibGVkLCBydWxlIHRlcm1pbmFscyBhcmUgdHJlYXRlZCBhcyByZWd1bGFyIGV4cHJlc3Npb25zLiAqLwogICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVnZXhwTWF0Y2hpbmc7Ci0gIC8qCi0gICAqIG5vblRlcm1pbmFsTWF0Y2hlciBkZXRlcm1pbmVzIHRoZSBiZWhhdmlvciBvZiBub250ZXJtaW5hbCBtYXRjaGluZzogc3RyaWN0IG9yIHNvZnQtc3ludGFjdGljCi0gICAqIG1hdGNoaW5nCi0gICAqLwotICBwcml2YXRlIGZpbmFsIE5vbnRlcm1pbmFsTWF0Y2hlciBub25UZXJtaW5hbE1hdGNoZXI7Ci0KIAogICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgLy8gU3RhdGljIGZpZWxkcwpAQCAtMTA2LDggKzEwMCw3IEBACiAKIAogCi0gIHB1YmxpYyBEb3RDaGFydChMYXR0aWNlPFRva2VuPiBpbnB1dCwgR3JhbW1hciBncmFtbWFyLCBDaGFydCBjaGFydCwKLSAgICAgIE5vbnRlcm1pbmFsTWF0Y2hlciBub25UZXJtaW5hbE1hdGNoZXIsIGJvb2xlYW4gcmVnRXhwTWF0Y2hpbmcpIHsKKyAgcHVibGljIERvdENoYXJ0KExhdHRpY2U8VG9rZW4+IGlucHV0LCBHcmFtbWFyIGdyYW1tYXIsIENoYXJ0IGNoYXJ0LCBib29sZWFuIHJlZ0V4cE1hdGNoaW5nKSB7CiAKICAgICB0aGlzLmRvdENoYXJ0ID0gY2hhcnQ7CiAgICAgdGhpcy5wR3JhbW1hciA9IGdyYW1tYXI7CkBAIC0xMTUsNyArMTA4LDYgQEAKICAgICB0aGlzLnNlbnRMZW4gPSBpbnB1dC5zaXplKCk7CiAKICAgICB0aGlzLmRvdGNlbGxzID0gbmV3IENoYXJ0U3BhbjxEb3RDZWxsPihzZW50TGVuLCBudWxsKTsKLSAgICB0aGlzLm5vblRlcm1pbmFsTWF0Y2hlciA9IG5vblRlcm1pbmFsTWF0Y2hlcjsKICAgICB0aGlzLnJlZ2V4cE1hdGNoaW5nID0gcmVnRXhwTWF0Y2hpbmc7CiAKICAgICBzZWVkKCk7CkBAIC0yNjksMTcgKzI2MSwxMSBAQAogICAgICAgICAgKiB1bmRvY3VtZW50ZWQgZmVhdHVyZSB0aGF0IGludHJvZHVjZXMgYSBjb21wbGV4aXR5LCBpbiB0aGF0IHRoZSBuZXh0ICJ3b3JkIiBpbiB0aGUgZ3JhbW1hcgogICAgICAgICAgKiBydWxlIG1pZ2h0IG1hdGNoIG1vcmUgdGhhbiBvbmUgb3V0Z29pbmcgYXJjIGluIHRoZSBncmFtbWFyIHRyaWUuCiAgICAgICAgICAqLwotICAgICAgICBMaXN0PFRyaWU+IGNoaWxkX3Rub2RlcyA9IG5vblRlcm1pbmFsTWF0Y2hlci5wcm9kdWNlTWF0Y2hpbmdDaGlsZFROb2Rlc05vbnRlcm1pbmFsTGV2ZWwoCi0gICAgICAgICAgICBkb3ROb2RlLCBzdXBlck5vZGUpOwotCi0gICAgICAgIGlmICghY2hpbGRfdG5vZGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgIGZvciAoVHJpZSBjaGlsZF90bm9kZSA6IGNoaWxkX3Rub2RlcykgewotICAgICAgICAgICAgaWYgKGNoaWxkX3Rub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgaWYgKCghc2tpcFVuYXJ5KSB8fCAoY2hpbGRfdG5vZGUuaGFzRXh0ZW5zaW9ucygpKSkgewotICAgICAgICAgICAgICAgIGFkZERvdEl0ZW0oY2hpbGRfdG5vZGUsIGksIGosIGRvdE5vZGUuZ2V0QW50U3VwZXJOb2RlcygpLCBzdXBlck5vZGUsIGRvdE5vZGUKLSAgICAgICAgICAgICAgICAgICAgLmdldFNvdXJjZVBhdGgoKS5leHRlbmROb25UZXJtaW5hbCgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBUcmllIGNoaWxkX25vZGUgPSBkb3ROb2RlLmdldFRyaWVOb2RlKCkubWF0Y2goc3VwZXJOb2RlLmxocyk7CisgICAgICAgIGlmIChjaGlsZF9ub2RlICE9IG51bGwpIHsKKyAgICAgICAgICBpZiAoKCFza2lwVW5hcnkpIHx8IChjaGlsZF9ub2RlLmhhc0V4dGVuc2lvbnMoKSkpIHsKKyAgICAgICAgICAgIGFkZERvdEl0ZW0oY2hpbGRfbm9kZSwgaSwgaiwgZG90Tm9kZS5nZXRBbnRTdXBlck5vZGVzKCksIHN1cGVyTm9kZSwgZG90Tm9kZQorICAgICAgICAgICAgICAgIC5nZXRTb3VyY2VQYXRoKCkuZXh0ZW5kTm9uVGVybWluYWwoKSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvY2hhcnRfcGFyc2VyL05vbnRlcm1pbmFsTWF0Y2hlci5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2NoYXJ0X3BhcnNlci9Ob250ZXJtaW5hbE1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2N2ZjOS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvY2hhcnRfcGFyc2VyL05vbnRlcm1pbmFsTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLXBhY2thZ2Ugam9zaHVhLmRlY29kZXIuY2hhcnRfcGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqb3NodWEuY29ycHVzLlZvY2FidWxhcnk7Ci1pbXBvcnQgam9zaHVhLmRlY29kZXIuSm9zaHVhQ29uZmlndXJhdGlvbjsKLWltcG9ydCBqb3NodWEuZGVjb2Rlci5jaGFydF9wYXJzZXIuRG90Q2hhcnQuRG90Tm9kZTsKLWltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi50bS5UcmllOwotaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLnRtLnBhY2tlZC5QYWNrZWRHcmFtbWFyLlBhY2tlZFJvb3Q7Ci1pbXBvcnQgam9zaHVhLmRlY29kZXIuZmYudG0ucGFja2VkLlBhY2tlZEdyYW1tYXIuUGFja2VkU2xpY2UuUGFja2VkVHJpZTsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGFuZCBpdHMgaW1wbGVtZW50YXRpb25zIHNlcnZlIHRvIHJlZmluZSB0aGUgYmVoYXZpb3Igb2YgRG90Q2hhcnQgdXNpbmcKLSAqIHN0cmF0ZWd5LiBCYXNpY2FsbHkgdGhlcmUgYXJlIGRpZmZlcmVudCB3YXlzIHRoYXQgbm9udGVybWluYWxzIG9mIHJ1bGVzIGNhbiBiZSBtYXRjaGVkLCBlaXRoZXIKLSAqIHN0cmljdCwgb3Igc29mdCBzeW50YWN0aWMgKG5vbnRlcm1pbmFscyBjYW4gYWxsIG1hdGNoIGVhY2ggb3RoZXIpLiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEKLSAqIG1ldGhvZCB0aGF0IHByb2R1Y2UgbWF0Y2hpbmcgbm9kZXMgZm9yIHRoZSBub250ZXJtaW5hbCBsZXZlbC4gVGhlIGludGVyZmFjZSBpcyB0aGVuIGltcGxlbWVudGVkCi0gKiBpbiBkaWZmZXJlbnQgY2xhc3NlcyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBtYXRjaGluZyAoY3VycmVudGx5IGp1c3Qgc3RyaWN0IG9yCi0gKiBzb2Z0LXN5bnRhY3RpYykKLSAqIAotICogVGhlIGZhY3RvcnkgbWV0aG9kIHByb2R1Y2VzIGRpZmZlcmVudCBmbGF2b3JzIG9mIE5vbnRlcm1pbmFsTWF0Y2hlciBjb3JyZXNwb25kaW5nIHRvIHN0cmljdAotICogKGJhc2ljKSBtYXRjaGluZywgUmVndWxhciBFeHByZXNzaW9uIG1hdGNoaW5nIGFuZCBzb2Z0IHN5bnRhY3RpYyBtYXRjaGluZy4gTm90aWNlIHRoYXQgcmVndWxhcgotICogZXhwcmVzc2lvbiBtYXRjaGluZyBhbmQgc29mdCBjb25zdHJhaW50IG1hdGNoaW5nIGNhbiBpbiBmYWN0IGJlIGNvbWJpbmVkLCBnZXR0aW5nIHRoZSAnbG9vc2VzdCcKLSAqIHdheSBvZiBtYXRjaGluZyBwb3NzaWJsZS4KLSAqIAotICogQGF1dGhvciBHaWRlb24gTWFpbGxldHRlIGRlIEJ1eSBXZW5uaWdlciA8Z2VtZGJ3IEFUIGdtYWlsIERPVCBjb20+Ci0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vbnRlcm1pbmFsTWF0Y2hlciB7Ci0KLSAgLyoqCi0gICAqIEhvdyBtdWNoIG5vbnRlcm1pbmFscyB0aGVyZSBtYXkgYmUgbWF4aW1hbCB0byB1c2UgdGFyZ2V0ZWQgcXVlcnlpbmcgcmF0aGVyIHRoYW4gbWF0Y2hpbmcgdG8KLSAgICogZmluZCB0aGUgYWx0ZXJuYXRlIG5vbnRlcm1pbmFscyBmcm9tIHRoZSBjaGlsZHJlbiB0YWJsZSB3aGVuIGRvaW5nIHNvZnQgc3ludGFjdGljIHRyYW5zbGF0aW9uLgotICAgKiBOb3RlIHRoYXQgdGhlcmUgaXMgYSB0cmFkZW9mZiBoZXJlOiBsb29waW5nIG92ZXIgYWxsIGNoaWxkcmVuIGFuZCBtYXRjaGluZyBpcyByYXRoZXIgaXMKLSAgICogZXhwZW5zaXZlIGlmIHRoZXJlIGFyZSBtYW55IGNoaWxkcmVuLCB3aGljaCBpcyB0eXBpY2FsbHkgdGhlIGNhc2UgZm9yIGJpZyBncmFtbWFycyBhcyB0aGVyZSBhcmUKLSAgICogbWFueSBwb3NzaWJsZSB3b3JkcyBhdCBlYWNoIGxldmVsIGluIHRoZSBUcmllLiBUYXJnZXRlZCBxdWVyeWluZyBpcyBvbmx5IGNoZWFwIHByb3ZpZGVkIHRoZQotICAgKiBudW1iZXIgb2Ygbm9udGVybWluYWxzIGlzIHNtYWxsLCBvdGhlcndpc2UgaXQgbWF5IGluIGZhY3QgYmVjb21lIG1vcmUgZXhwZW5zaXZlIHRoYW4ganVzdAotICAgKiBsb29waW5nIGFuZCBtYXRjaGluZy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVE9UQUxfTk9OX1RFUk1JTkFMU19GT1JfVEFSR0VURURfUVVFUllJTkcgPSAxMDAwOwotCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc09PVkxhYmVsT3JHb2FsTGFiZWwoU3RyaW5nIGxhYmVsLAotICAgICAgSm9zaHVhQ29uZmlndXJhdGlvbiBqb3NodWFDb25maWd1cmF0aW9uKSB7Ci0gICAgcmV0dXJuIChsYWJlbC5lcXVhbHMoam9zaHVhQ29uZmlndXJhdGlvbi5kZWZhdWx0X25vbl90ZXJtaW5hbCkgfHwgbGFiZWwKLSAgICAgICAgLmVxdWFscyhqb3NodWFDb25maWd1cmF0aW9uLmdvYWxfc3ltYm9sKSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHVzZVRhcmdldGRRdWVyeWluZyhMaXN0PEludGVnZXI+IG5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YpIHsKLSAgICBpZiAobm9udGVybWluYWxJbmRpY2VzRXhjZXB0Rm9yR29hbEFuZE9PVi5zaXplKCkgPD0gTUFYX1RPVEFMX05PTl9URVJNSU5BTFNfRk9SX1RBUkdFVEVEX1FVRVJZSU5HKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIGFsbCBpbmRpY2VzIGNvcnJlc3BvbmRpbmcgdG8gTm9udGVybWluYWxzIGluIHRoZSBWb2NhYnVsYXJ5Ci0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpc3Q8SW50ZWdlcj4gZ2V0QWxsTm9udGVybWluYWxJbmRpY2VzRXhjZXB0Rm9yR29hbEFuZE9PVigKLSAgICAgIEpvc2h1YUNvbmZpZ3VyYXRpb24gam9zaHVhQ29uZmlndXJhdGlvbikgewotICAgIExpc3Q8SW50ZWdlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotICAgIExpc3Q8SW50ZWdlcj4gbm9udGVybWluYWxJbmRpY2VzID0gVm9jYWJ1bGFyeS5nZXROb250ZXJtaW5hbEluZGljZXMoKTsKLSAgICBmb3IgKEludGVnZXIgbm9udGVybWluYWxJbmRleCA6IG5vbnRlcm1pbmFsSW5kaWNlcykgewotICAgICAgaWYgKCFpc09PVkxhYmVsT3JHb2FsTGFiZWwoVm9jYWJ1bGFyeS53b3JkKG5vbnRlcm1pbmFsSW5kZXgpLCBqb3NodWFDb25maWd1cmF0aW9uKSkgewotICAgICAgICByZXN1bHQuYWRkKG5vbnRlcm1pbmFsSW5kZXgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBOb250ZXJtaW5hbE1hdGNoZXIgY3JlYXRlTm9udGVybWluYWxNYXRjaGVyKEpvc2h1YUNvbmZpZ3VyYXRpb24gam9zaHVhQ29uZmlndXJhdGlvbikgewotICAgIExpc3Q8SW50ZWdlcj4gYWxsTm9udGVybWluYWxJbmRpY2VzRXhjZXB0Rm9yR29hbEFuZE9PViA9IGdldEFsbE5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1Yoam9zaHVhQ29uZmlndXJhdGlvbik7Ci0KLSAgICBpZiAoYWxsTm9udGVybWluYWxJbmRpY2VzRXhjZXB0Rm9yR29hbEFuZE9PVi5pc0VtcHR5KCkpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJFcnJvcjogTm9udGVybWluYWxNYXRjaGVyRmFjdG9yeS4gY3JlYXRlTm9udGVybWluYWxNYXRjaGVyIC0gIGVtcHR5IG5vbnRlcm1pbmFsIGluZGljZXMgdGFibGUiKTsKLSAgICB9Ci0KLSAgICBpZiAoam9zaHVhQ29uZmlndXJhdGlvbi5mdXp6eV9tYXRjaGluZykgewotICAgICAgcmV0dXJuIG5ldyBTdGFuZGFyZE5vbnRlcm1pbmFsTWF0Y2hlclNvZnRDb25zdHJhaW50cyhqb3NodWFDb25maWd1cmF0aW9uLAotICAgICAgICAgIGFsbE5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YsCi0gICAgICAgICAgdXNlVGFyZ2V0ZFF1ZXJ5aW5nKGFsbE5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YpKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG5ldyBTdGFuZGFyZE5vbnRlcm1pbmFsTWF0Y2hlclN0cmljdChqb3NodWFDb25maWd1cmF0aW9uLAotICAgICAgICAgIGFsbE5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YsCi0gICAgICAgICAgdXNlVGFyZ2V0ZFF1ZXJ5aW5nKGFsbE5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBBIGxpc3Qgb2Ygbm9uVGVybWluYWxJbmRpY2VzLCB0byBiZSB1c2VkIGZvciBmYXN0ZXIgcmV0cmlldmFsIG9mCi0gIC8vIE5vbnRlcm1pbmFscyBpbgotICAvLyBzb2Z0IHN5bnRhY3RpYyBtYXRjaGluZwotICBwcml2YXRlIGZpbmFsIExpc3Q8SW50ZWdlcj4gbm9udGVybWluYWxJbmRpY2VzRXhjZXB0Rm9yR29hbEFuZE9PVjsKLQotICBwcm90ZWN0ZWQgZmluYWwgSm9zaHVhQ29uZmlndXJhdGlvbiBqb3NodWFDb25maWd1cmF0aW9uOwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlVGFyZ2V0UXVlcnlpbmdUb0NvbGxlY3RBbHRlcm5hdGVOb250ZXJtaW5hbHM7Ci0KLSAgcHJvdGVjdGVkIE5vbnRlcm1pbmFsTWF0Y2hlcihKb3NodWFDb25maWd1cmF0aW9uIGpvc2h1YUNvbmZpZ3VyYXRpb24sCi0gICAgICBMaXN0PEludGVnZXI+IG5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YsCi0gICAgICBib29sZWFuIHVzZVRhcmdldFF1ZXJ5aW5nVG9Db2xsZWN0QWx0ZXJuYXRlTm9udGVybWluYWxzKSB7Ci0gICAgdGhpcy5qb3NodWFDb25maWd1cmF0aW9uID0gam9zaHVhQ29uZmlndXJhdGlvbjsKLSAgICB0aGlzLm5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YgPSBub250ZXJtaW5hbEluZGljZXNFeGNlcHRGb3JHb2FsQW5kT09WOwotICAgIHRoaXMudXNlVGFyZ2V0UXVlcnlpbmdUb0NvbGxlY3RBbHRlcm5hdGVOb250ZXJtaW5hbHMgPSB1c2VUYXJnZXRRdWVyeWluZ1RvQ29sbGVjdEFsdGVybmF0ZU5vbnRlcm1pbmFsczsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBtZXRob2QgdXNlZCB0byBnZXQgdGhlIG1hdGNoaW5nIGNoaWxkIG5vZGVzIGZvciB0aGUgbm9udGVybWluYWwgbGV2ZWwKLSAgICogCi0gICAqIEBwYXJhbSBkb3ROb2RlCi0gICAqIEBwYXJhbSBzdXBlck5vZGUKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IExpc3Q8VHJpZT4gcHJvZHVjZU1hdGNoaW5nQ2hpbGRUTm9kZXNOb250ZXJtaW5hbExldmVsKERvdE5vZGUgZG90Tm9kZSwKLSAgICAgIFN1cGVyTm9kZSBzdXBlck5vZGUpOwotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb250ZXJtaW5hbChpbnQgd29yZEluZGV4KSB7Ci0gICAgcmV0dXJuIHdvcmRJbmRleCA8IDA7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgZmluZHMgTm9udGVybWluYWwgZW50cmllcyBmcm9tIHRoZSBjaGlsZHJlbiBpbiB0aGUgQ2hpbGRyZW4gSGFzaE1hcCB1c2luZyBhCi0gICAqIHRhcmdldGVkIHF1ZXJ5aW5nIHN0cmF0ZWd5LCBiYXNlZCBvbiBrbm93bGVkZ2Ugb2Ygd2hhdCB0aGUgTm9udGVybWluYWxzIGFyZS4gU3RvcmluZyB0aGUKLSAgICogTm9udGVybWluYWxzIGFuZCBUZXJtaW5hbHMgaW4gdGhlIFRyaWUgc2VwYXJhdGVseSB3b3VsZCBiZSBhbiBldmVuIHNtYXJ0ZXIgc3RyYXRlZ3kgcGVyaGFwcywKLSAgICogYnV0IHJlcXVpcmVzIGEgbW9yZSB0aG9yb3VnaCByZWZhY3RvcmluZyBvZiB0aGUgY29kZQotICAgKiAKLSAgICogQHBhcmFtIGNoaWxkcmVuVGJsCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByaXZhdGUgTGlzdDxUcmllPiBnZXROb25UZXJtaW5hbHNMaXN0RnJvbUNoaWxkcmVuQnlUYXJnZXRlZFF1ZXJ5aW5nKAotICAgICAgSGFzaE1hcDxJbnRlZ2VyLCA/IGV4dGVuZHMgVHJpZT4gY2hpbGRyZW5UYmwpIHsKLSAgICBMaXN0PFRyaWU+IHRyaWVMaXN0ID0gbmV3IEFycmF5TGlzdDxUcmllPigpOwotCi0gICAgaWYgKGNoaWxkcmVuVGJsICE9IG51bGwpIHsKLSAgICAgIC8vIGdldCBhbGwgdGhlIGV4dGVuc2lvbnMsIG1hcCB0byBzdHJpbmcsIGNoZWNrIGZvciAqLCBidWlsZCByZWdleHAKLQotICAgICAgZm9yIChJbnRlZ2VyIGluZGV4IDogdGhpcy5ub250ZXJtaW5hbEluZGljZXNFeGNlcHRGb3JHb2FsQW5kT09WKSB7Ci0KLSAgICAgICAgaW50IG5vbnRlcm1pbmFsSW5kZXhUcmllRm9ybWF0ID0gLWluZGV4OwotICAgICAgICBpZiAoY2hpbGRyZW5UYmwuY29udGFpbnNLZXkobm9udGVybWluYWxJbmRleFRyaWVGb3JtYXQpKSB7Ci0gICAgICAgICAgdHJpZUxpc3QuYWRkKGNoaWxkcmVuVGJsLmdldChub250ZXJtaW5hbEluZGV4VHJpZUZvcm1hdCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cmllTGlzdDsKLQotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0PFRyaWU+IGdldE5vblRlcm1pbmFsc0xpc3RGcm9tQ2hpbGRyZW5CeVRyaWVFbnVtZXJhdGlvbihUcmllIHRyaWUsIGludCB3b3JkSUQpIHsKLSAgICBIYXNoTWFwPEludGVnZXIsID8gZXh0ZW5kcyBUcmllPiBjaGlsZHJlblRibCA9IHRyaWUuZ2V0Q2hpbGRyZW4oKTsKLSAgICBMaXN0PFRyaWU+IHRyaWVMaXN0ID0gbmV3IEFycmF5TGlzdDxUcmllPigpOwotCi0gICAgSXRlcmF0b3I8SW50ZWdlcj4gbm9udGVybWluYWxJdGVyYXRvciA9IHRyaWUuZ2V0Tm9udGVybWluYWxFeHRlbnNpb25JdGVyYXRvcigpOwotICAgIHdoaWxlIChub250ZXJtaW5hbEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgdHJpZUxpc3QuYWRkKGNoaWxkcmVuVGJsLmdldChub250ZXJtaW5hbEl0ZXJhdG9yLm5leHQoKSkpOwotICAgIH0KLQotICAgIHJldHVybiB0cmllTGlzdDsKLQotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzUGFja2VkVHJpZVR5cGUoVHJpZSB0cmllKSB7Ci0gICAgcmV0dXJuICh0cmllIGluc3RhbmNlb2YgUGFja2VkVHJpZSkgfHwgKHRyaWUgaW5zdGFuY2VvZiBQYWNrZWRSb290KTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0PFRyaWU+IG1hdGNoQWxsRXF1YWxPckJvdGhOb25UZXJtaW5hbEFuZE5vdEdvYWxPck9PVihEb3ROb2RlIGRvdE5vZGUsIGludCB3b3JkSUQpIHsKLQotICAgIC8vIGxvZ2dlci5pbmZvKCJ3b3JkSUQ6ICIgKyB3b3JkSUQgKyAiIFZvY2FidWxhcnkud29yZChNYXRoLmFicyh3b3JkSUQpKSAiCi0gICAgLy8gKyBWb2NhYnVsYXJ5LndvcmQoTWF0aC5hYnMod29yZElEKSkpOwotCi0gICAgaWYgKCFpc05vbnRlcm1pbmFsKHdvcmRJRCkpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciA6IGV4cGV4dGVkIG5vbnRlcm1pbmFsLCBidXQgZGlkIG5vdCBnZXQgaXQgIgotICAgICAgICAgICsgImluIG1hdGNoQWxsRXF1YWxPckJvdGhOb25UZXJtaW5hbEFuZE5vdEdvYWxPck9PVihEb3ROb2RlIGRvdE5vZGUsIGludCB3b3JkSUQpIik7Ci0gICAgfQotCi0gICAgLy8gV2hlbiB3ZSBoYXZlIGEgcGFja2VkIFRyaWUgb3IgdGhlIGJvb2xlYW4gdXNlVGFyZ2V0UXVlcnlpbmdUb0NvbGxlY3RBbHRlcm5hdGVOb250ZXJtaW5hbHMKLSAgICAvLyBpcyBzZXQgdG8gZmFsc2UsIHdlIHdpbGwgdXMgdGhlIFRyaWUgY2hpbGRyZW4gZW51bWVyYXRpb24gdG8gcmV0cmlldmUgbm9udGVybWluYWxzCi0gICAgLy8gZm9yIHBhY2tlZCB0cmllcyB0aGlzIGlzIGVmZmljaWVudAotICAgIGlmIChpc1BhY2tlZFRyaWVUeXBlKGRvdE5vZGUuZ2V0VHJpZU5vZGUoKSkKLSAgICAgICAgfHwgKCF1c2VUYXJnZXRRdWVyeWluZ1RvQ29sbGVjdEFsdGVybmF0ZU5vbnRlcm1pbmFscykpIHsKLSAgICAgIHJldHVybiBnZXROb25UZXJtaW5hbHNMaXN0RnJvbUNoaWxkcmVuQnlUcmllRW51bWVyYXRpb24oZG90Tm9kZS5nZXRUcmllTm9kZSgpLCB3b3JkSUQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBIYXNoTWFwPEludGVnZXIsID8gZXh0ZW5kcyBUcmllPiBjaGlsZHJlblRibCA9IGRvdE5vZGUuZ2V0VHJpZU5vZGUoKS5nZXRDaGlsZHJlbigpOwotICAgICAgcmV0dXJuIGdldE5vblRlcm1pbmFsc0xpc3RGcm9tQ2hpbGRyZW5CeVRhcmdldGVkUXVlcnlpbmcoY2hpbGRyZW5UYmwpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdDxUcmllPiBwcm9kdWNlU3RhbmRhcmRNYXRjaGluZ0NoaWxkVE5vZGVzTm9udGVybWluYWxMZXZlbChEb3ROb2RlIGRvdE5vZGUsCi0gICAgICBTdXBlck5vZGUgc3VwZXJOb2RlKSB7Ci0gICAgVHJpZSBjaGlsZF9ub2RlID0gZG90Tm9kZS5nZXRUcmllTm9kZSgpLm1hdGNoKHN1cGVyTm9kZS5saHMpOwotICAgIExpc3Q8VHJpZT4gY2hpbGRfdG5vZGVzID0gQXJyYXlzLmFzTGlzdChjaGlsZF9ub2RlKTsKLSAgICByZXR1cm4gY2hpbGRfdG5vZGVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBTdGFuZGFyZE5vbnRlcm1pbmFsTWF0Y2hlciBleHRlbmRzIE5vbnRlcm1pbmFsTWF0Y2hlciB7Ci0KLSAgICBwcm90ZWN0ZWQgU3RhbmRhcmROb250ZXJtaW5hbE1hdGNoZXIoSm9zaHVhQ29uZmlndXJhdGlvbiBqb3NodWFDb25maWd1cmF0aW9uLAotICAgICAgICBMaXN0PEludGVnZXI+IG5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YsCi0gICAgICAgIGJvb2xlYW4gdXNlVGFyZ2V0UXVlcnlpbmdUb0NvbGxlY3RBbHRlcm5hdGVOb250ZXJtaW5hbHMpIHsKLSAgICAgIHN1cGVyKGpvc2h1YUNvbmZpZ3VyYXRpb24sIG5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YsCi0gICAgICAgICAgdXNlVGFyZ2V0UXVlcnlpbmdUb0NvbGxlY3RBbHRlcm5hdGVOb250ZXJtaW5hbHMpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU3RhbmRhcmROb250ZXJtaW5hbE1hdGNoZXJTdHJpY3QgZXh0ZW5kcyBTdGFuZGFyZE5vbnRlcm1pbmFsTWF0Y2hlciB7Ci0KLSAgICBwcm90ZWN0ZWQgU3RhbmRhcmROb250ZXJtaW5hbE1hdGNoZXJTdHJpY3QoSm9zaHVhQ29uZmlndXJhdGlvbiBqb3NodWFDb25maWd1cmF0aW9uLAotICAgICAgICBMaXN0PEludGVnZXI+IG5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YsCi0gICAgICAgIGJvb2xlYW4gdXNlVGFyZ2V0UXVlcnlpbmdUb0NvbGxlY3RBbHRlcm5hdGVOb250ZXJtaW5hbHMpIHsKLSAgICAgIHN1cGVyKGpvc2h1YUNvbmZpZ3VyYXRpb24sIG5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YsCi0gICAgICAgICAgdXNlVGFyZ2V0UXVlcnlpbmdUb0NvbGxlY3RBbHRlcm5hdGVOb250ZXJtaW5hbHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFRyaWU+IHByb2R1Y2VNYXRjaGluZ0NoaWxkVE5vZGVzTm9udGVybWluYWxMZXZlbChEb3ROb2RlIGRvdE5vZGUsCi0gICAgICAgIFN1cGVyTm9kZSBzdXBlck5vZGUpIHsKLSAgICAgIHJldHVybiBwcm9kdWNlU3RhbmRhcmRNYXRjaGluZ0NoaWxkVE5vZGVzTm9udGVybWluYWxMZXZlbChkb3ROb2RlLCBzdXBlck5vZGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU3RhbmRhcmROb250ZXJtaW5hbE1hdGNoZXJTb2Z0Q29uc3RyYWludHMgZXh0ZW5kcwotICAgICAgU3RhbmRhcmROb250ZXJtaW5hbE1hdGNoZXIgewotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGpvc2h1YUNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RhbmRhcmROb250ZXJtaW5hbE1hdGNoZXJTb2Z0Q29uc3RyYWludHMoSm9zaHVhQ29uZmlndXJhdGlvbiBqb3NodWFDb25maWd1cmF0aW9uLAotICAgICAgICBMaXN0PEludGVnZXI+IG5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YsCi0gICAgICAgIGJvb2xlYW4gdXNlVGFyZ2V0UXVlcnlpbmdUb0NvbGxlY3RBbHRlcm5hdGVOb250ZXJtaW5hbHMpIHsKLSAgICAgIHN1cGVyKGpvc2h1YUNvbmZpZ3VyYXRpb24sIG5vbnRlcm1pbmFsSW5kaWNlc0V4Y2VwdEZvckdvYWxBbmRPT1YsCi0gICAgICAgICAgdXNlVGFyZ2V0UXVlcnlpbmdUb0NvbGxlY3RBbHRlcm5hdGVOb250ZXJtaW5hbHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcGVyZm9ybSBzdHJpY3QgbWF0Y2hpbmcgaWYgdGhlIHRhcmdldCBub2RlIHN1cGVyTm9kZSBpcyBhIEdvYWwgU3ltYm9sLgotICAgICAqIE90aGVyd2lzZSBpdCB3aWxsIGNhbGwgYSBtZXRob2QgdGhhdCBwcm9kdWNlcyBhbGwgYXZhaWxhYmxlIHN1YnN0aXR1dGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvCi0gICAgICogTm9udGVybWluYWxzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkb3ROb2RlCi0gICAgICogQHBhcmFtIHN1cGVyTm9kZQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFRyaWU+IHByb2R1Y2VNYXRjaGluZ0NoaWxkVE5vZGVzTm9udGVybWluYWxMZXZlbChEb3ROb2RlIGRvdE5vZGUsCi0gICAgICAgIFN1cGVyTm9kZSBzdXBlck5vZGUpIHsKLQotICAgICAgLy8gV2UgZG8gbm90IGFsbG93IHN1YnN0aXR1dGlvbiBvZiBvdGhlciB0aGluZ3MgZm9yIEdPQUwgbGFiZWxzIG9yIE9PVgotICAgICAgLy8gc3ltYm9scwotICAgICAgaWYgKGlzT09WTGFiZWxPckdvYWxMYWJlbChWb2NhYnVsYXJ5LndvcmQoc3VwZXJOb2RlLmxocyksIGpvc2h1YUNvbmZpZ3VyYXRpb24pKSB7Ci0gICAgICAgIC8vIGxvZ2dlci5pbmZvKCJCTEFBIC0gVm9jYWJ1bGFyeS53b3JkKHN1cGVyTm9kZS5saHMpIiArCi0gICAgICAgIC8vIFZvY2FidWxhcnkud29yZChzdXBlck5vZGUubGhzKSk7Ci0gICAgICAgIFRyaWUgY2hpbGRfbm9kZSA9IGRvdE5vZGUuZ2V0VHJpZU5vZGUoKS5tYXRjaChzdXBlck5vZGUubGhzKTsKLSAgICAgICAgLy8gbG9nZ2VyLmluZm8oImNoaWxkX25vZGUudG9TdHJpbmcoKSIgKyBjaGlsZF9ub2RlKTsKLSAgICAgICAgTGlzdDxUcmllPiBjaGlsZF90bm9kZXMgPSBBcnJheXMuYXNMaXN0KGNoaWxkX25vZGUpOwotICAgICAgICByZXR1cm4gY2hpbGRfdG5vZGVzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbG9nZ2VyLmluZm8oIlZvY2FidWxhcnkud29yZChzdXBlck5vZGUubGhzKTogIiArCi0gICAgICAgIC8vIFZvY2FidWxhcnkud29yZChzdXBlck5vZGUubGhzKSk7Ci0gICAgICAgIHJldHVybiBtYXRjaEFsbEVxdWFsT3JCb3RoTm9uVGVybWluYWxBbmROb3RHb2FsT3JPT1YoZG90Tm9kZSwgc3VwZXJOb2RlLmxocyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvQXJpdHlQaHJhc2VQZW5hbHR5LmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvQXJpdHlQaHJhc2VQZW5hbHR5LmphdmEKaW5kZXggN2UzMjBhMi4uZDljOTNjYiAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL0FyaXR5UGhyYXNlUGVuYWx0eS5qYXZhCisrKyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9Bcml0eVBocmFzZVBlbmFsdHkuamF2YQpAQCAtMzEsOSArMzEsNiBAQAogICAgIHRoaXMub3duZXIgPSBWb2NhYnVsYXJ5LmlkKHBhcnNlZEFyZ3MuZ2V0KCJvd25lciIpKTsKICAgICB0aGlzLm1pbkFyaXR5ID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRBcmdzLmdldCgibWluLWFyaXR5IikpOwogICAgIHRoaXMubWF4QXJpdHkgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZEFyZ3MuZ2V0KCJtYXgtYXJpdHkiKSk7Ci0KLSAgICBpZiAoIXdlaWdodHMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIldBUk5JTkc6IG5vIHdlaWdodCBmb3VuZCBmb3IgZmVhdHVyZSAnIiArIG5hbWUgKyAiJyIpOwogICB9CiAKICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvRmVhdHVyZUZ1bmN0aW9uLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvRmVhdHVyZUZ1bmN0aW9uLmphdmEKaW5kZXggZDM5Y2NlNi4uYTA4ZWFkMiAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL0ZlYXR1cmVGdW5jdGlvbi5qYXZhCisrKyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9GZWF0dXJlRnVuY3Rpb24uamF2YQpAQCAtMSw1ICsxLDYgQEAKIHBhY2thZ2Ugam9zaHVhLmRlY29kZXIuZmY7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwpAQCAtNTMsNiArNTQsMTcgQEAKICAgICogbmFtZXMsIGZvciB0ZW1wbGF0ZXMgdGhhdCBkZWZpbmUgbXVsdGlwbGUgZmVhdHVyZXMuCiAgICAqLwogICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBudWxsOworICAKKyAgLyoKKyAgICogVGhlIGxpc3Qgb2YgZmVhdHVyZXMgZWFjaCBmdW5jdGlvbiBjYW4gY29udHJpYnV0ZSwgYWxvbmcgd2l0aCB0aGUgZGVuc2UgZmVhdHVyZSBJRHMuCisgICAqLworICBwcm90ZWN0ZWQgU3RyaW5nW10gZGVuc2VGZWF0dXJlTmFtZXMgPSBudWxsOworICBwcm90ZWN0ZWQgaW50W10gZGVuc2VGZWF0dXJlSURzID0gbnVsbDsKKworICAvKgorICAgKiBUaGUgZmlyc3QgZGVuc2UgZmVhdHVyZSBpbmRleAorICAgKi8KKyAgcHJvdGVjdGVkIGludCBkZW5zZUZlYXR1cmVJbmRleCA9IC0xOyAKIAogICAvLyBUaGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmZWF0dXJlLCBhbmQgdGhlIGhhc2ggZm9yIHRoZSBwYXJzZWQgYXJncwogICBwcm90ZWN0ZWQgU3RyaW5nW10gYXJnczsKQEAgLTcwLDcgKzgyLDcgQEAKICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgIHJldHVybiBuYW1lOwogICB9Ci0KKyAgCiAgIC8vIFdoZXRoZXIgdGhlIGZlYXR1cmUgaGFzIHN0YXRlLgogICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1N0YXRlZnVsKCk7CiAKQEAgLTgyLDEwICs5NCwyMiBAQAogCiAgICAgdGhpcy5wYXJzZWRBcmdzID0gRmVhdHVyZUZ1bmN0aW9uLnBhcnNlQXJncyhhcmdzKTsKICAgfQorICAKKyAgLyoqCisgICAqIEFueSBmZWF0dXJlIGZ1bmN0aW9uIGNhbiB1c2UgdGhpcyB0byByZXBvcnQgZGVuc2UgZmVhdHVyZXMgbmFtZXMgdG8gdGhlIG1hc3RlciBjb2RlLiBUaGUgCisgICAqIHBhcmFtZXRlciB0ZWxscyB0aGUgZmVhdHVyZSBmdW5jdGlvbiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGF2YWlsYWJsZSBkZW5zZSBmZWF0dXJlIElEOyB0aGUgZmVhdHVyZQorICAgKiBmdW5jdGlvbiB3aWxsIHRoZW4gdXNlIElEcyAoaWQuLmlkK25hbWVzLnNpemUoKS0xKS4KKyAgICogCisgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIGZpcnN0IGRlbnNlIGZlYXR1cmUgaWQgdG8gdXNlCisgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRlbnNlIGZlYXR1cmUgbmFtZXMKKyAgICovCisgIHB1YmxpYyBBcnJheUxpc3Q8U3RyaW5nPiByZXBvcnREZW5zZUZlYXR1cmVzKGludCBpZCkgeworICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgfQogCiAgIHB1YmxpYyBTdHJpbmcgbG9nU3RyaW5nKCkgewogICAgIHRyeSB7Ci0gICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMgKHdlaWdodCAlLjNmKSIsIG5hbWUsIHdlaWdodHMuZ2V0KG5hbWUpKTsKKyAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcyAod2VpZ2h0ICUuM2YpIiwgbmFtZSwgd2VpZ2h0cy5nZXRTcGFyc2UobmFtZSkpOwogICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewogICAgICAgcmV0dXJuIG5hbWU7CiAgICAgfQpAQCAtMjcwLDYgKzI5NCw3IEBACiAKICAgcHVibGljIGludGVyZmFjZSBBY2N1bXVsYXRvciB7CiAgICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSk7CisgICAgcHVibGljIHZvaWQgYWRkKGludCBpZCwgZmxvYXQgdmFsdWUpOwogICB9CiAKICAgcHVibGljIGNsYXNzIFNjb3JlQWNjdW11bGF0b3IgaW1wbGVtZW50cyBBY2N1bXVsYXRvciB7CkBAIC0yNzksMTAgKzMwNCwxNCBAQAogICAgICAgdGhpcy5zY29yZSA9IDAuMGY7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotICAgICAgaWYgKHdlaWdodHMuY29udGFpbnNLZXkobmFtZSkpIHsKLSAgICAgICAgc2NvcmUgKz0gdmFsdWUgKiB3ZWlnaHRzLmdldChuYW1lKTsKLSAgICAgIH0KKyAgICAgIHNjb3JlICs9IHZhbHVlICogd2VpZ2h0cy5nZXRTcGFyc2UobmFtZSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaWQsIGZsb2F0IHZhbHVlKSB7CisgICAgICBzY29yZSArPSB2YWx1ZSAqIHdlaWdodHMuZ2V0RGVuc2UoaWQpOwogICAgIH0KIAogICAgIHB1YmxpYyBmbG9hdCBnZXRTY29yZSgpIHsKQEAgLTI5NywxMiArMzI2LDE0IEBACiAgICAgICB0aGlzLmZlYXR1cmVzID0gbmV3IEZlYXR1cmVWZWN0b3IoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0gICAgICBpZiAoZmVhdHVyZXMuY29udGFpbnNLZXkobmFtZSkpIHsKLSAgICAgICAgZmVhdHVyZXMucHV0KG5hbWUsIGZlYXR1cmVzLmdldChuYW1lKSArIHZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZlYXR1cmVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICB9CisgICAgICBmZWF0dXJlcy5pbmNyZW1lbnQobmFtZSwgdmFsdWUpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGlkLCBmbG9hdCB2YWx1ZSkgeworICAgICAgZmVhdHVyZXMuaW5jcmVtZW50KGlkLCAgdmFsdWUpOwogICAgIH0KIAogICAgIHB1YmxpYyBGZWF0dXJlVmVjdG9yIGdldEZlYXR1cmVzKCkgewpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL0ZlYXR1cmVWZWN0b3IuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9GZWF0dXJlVmVjdG9yLmphdmEKaW5kZXggZDY0MzE1OS4uOWFkMzQzNiAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL0ZlYXR1cmVWZWN0b3IuamF2YQorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvRmVhdHVyZVZlY3Rvci5qYXZhCkBAIC0xLDcgKzEsNSBAQAogcGFja2FnZSBqb3NodWEuZGVjb2Rlci5mZjsKIAotaW1wb3J0IGpvc2h1YS5kZWNvZGVyLkRlY29kZXI7Ci0KIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTEzLDE5ICsxMSwzOCBAQAogICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBzcGFyc2UgZmVhdHVyZSB2ZWN0b3IsIHVzaW5nIGZvciByZXByZXNlbnRpbmcgYm90aCB3ZWlnaHRzIGFuZCBmZWF0dXJlCiAgKiB2YWx1ZXMuCiAgKiAKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBob2xkIGJvdGggdGhlIGRlY29kZXIgd2VpZ2h0cyBhbmQgdGhlIGZlYXR1cmUgdmFsdWVzIGFjY3VtdWxhdGVkIGFjcm9zcworICogZWFjaCBlZGdlLiBXaGVuIGZlYXR1cmVzIGFyZSByZWFkIGluIHVwb24gZGVjb2RlciBzdGFydHVwLCB0aGV5IGFsbCBzdGFydCBvdXQgYXMgc3BhcnNlIGZlYXR1cmVzCisgKiBhbmQgYXJlIHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZS4gQWZ0ZXIgdGhlIGZlYXR1cmUgZnVuY3Rpb25zIGhhdmUgYmVlbiBsb2FkZWQsIHRoZSBkZWNvZGVyCisgKiBxdWVyaWVzIGVhY2ggb2YgdGhlbSBmb3IgdGhlaXIgc3BhcnNlIGZlYXR1cmVzIHZpYSB7QGxpbmsgcmVnaXN0ZXJEZW5zZUZlYXR1cmVzfS4gVGhvc2UgZmVhdHVyZXMKKyAqIHJldHVybmVkIGJ5IGVhY2ggZGVjb2RlciBhcmUgdGhlbiAqcmVtb3ZlZCogZnJvbSB0aGUgc3BhcnNlIGZlYXR1cmUgaGFzaCBhbmQgcGxhY2VkIGluIHRoZSBkZW5zZQorICogZmVhdHVyZSBhcnJheS4gVGhlcmVmb3JlLCB3aGVuIGEgZmVhdHVyZSByZWdpc3RlcnMgYSBkZW5zZSBmZWF0dXJlLCBpdCBzaG91bGQgdGFrZSBjYXJlIHRvCisgKiBxdWVyeSBlaXRoZXIge0BsaW5rIGdldERlbnNlKCl9IG9yIHtAbGluayBnZXRTcGFyc2V9IHdoZW4gYXNraW5nIGZvciB0aGUgZmVhdHVyZSB2YWx1ZXMgbGF0ZXIgb24uIAorICogCiAgKiBAYXV0aG9yIE1hdHQgUG9zdCA8cG9zdEBjcy5qaHUuZWR1PgogICovCiAKIHB1YmxpYyBjbGFzcyBGZWF0dXJlVmVjdG9yIHsKLSAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgRmxvYXQ+IGZlYXR1cmVzOworICAvKgorICAgKiBBIGxpc3Qgb2YgdGhlIGRlbnNlIGZlYXR1cmUgbmFtZXMuIEluY3JlYXNlZCB2aWEgY2FsbHMgdG8gcmVnaXN0ZXJEZW5zZUZlYXR1cmVzKCkKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0PFN0cmluZz4gREVOU0VfRkVBVFVSRV9OQU1FUyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgIC8qCisgICAqIFRoZSB2YWx1ZXMgb2YgZWFjaCBvZiB0aGUgZGVuc2UgZmVhdHVyZXMsIGRlZmF1bHRpbmcgdG8gMC4KKyAgICovCisgIHByaXZhdGUgQXJyYXlMaXN0PEZsb2F0PiBkZW5zZUZlYXR1cmVzID0gbnVsbDsKKworICAvKgorICAgKiBWYWx1ZSBvZiBzcGFyc2UgZmVhdHVyZXMuCisgICAqLworICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBGbG9hdD4gc3BhcnNlRmVhdHVyZXM7CiAKICAgcHVibGljIEZlYXR1cmVWZWN0b3IoKSB7Ci0gICAgZmVhdHVyZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEZsb2F0PigpOwotICB9Ci0KLSAgcHVibGljIEZlYXR1cmVWZWN0b3IoU3RyaW5nIGZlYXR1cmUsIGZsb2F0IHZhbHVlKSB7Ci0gICAgZmVhdHVyZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEZsb2F0PigpOwotICAgIGZlYXR1cmVzLnB1dChmZWF0dXJlLCB2YWx1ZSk7CisgICAgc3BhcnNlRmVhdHVyZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEZsb2F0PigpOworICAgIGRlbnNlRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEZsb2F0PihERU5TRV9GRUFUVVJFX05BTUVTLnNpemUoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZW5zZUZlYXR1cmVzLnNpemUoKTsgaSsrKQorICAgICAgZGVuc2VGZWF0dXJlcy5zZXQoaSwgMC4wZik7CiAgIH0KIAogICAvKioKQEAgLTQ5LDYgKzY2LDggQEAKICAgICovCiAgIHB1YmxpYyBGZWF0dXJlVmVjdG9yKFN0cmluZyBmZWF0dXJlU3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7CiAKKy8vICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJGRUFUVVJFU19PRiglcywgJXMpIiwgZmVhdHVyZVN0cmluZywgcHJlZml4KSk7CisgICAgCiAgICAgLyoKICAgICAgKiBSZWFkIHRocm91Z2ggdGhlIGZlYXR1cmVzIG9uIHRoaXMgcnVsZSwgYWRkaW5nIHRoZW0gdG8gdGhlIGZlYXR1cmUgdmVjdG9yLiBVbmxhYmVsZWQgZmVhdHVyZXMKICAgICAgKiBhcmUgY29udmVydGVkIHRvIGEgY2Fub25pY2FsIGZvcm0uCkBAIC01NiwzOCArNzUsOTAgQEAKICAgICAgKiBOb3RlIHRoYXQgaXQncyBiYWQgZm9ybSB0byBtaXggdW5sYWJlbGVkIGZlYXR1cmVzIGFuZCB0aGUgbmFtZWQgZmVhdHVyZSBpbmRleCB0aGV5IGFyZSBtYXBwZWQKICAgICAgKiB0bywgYnV0IHdlIGFyZSBiZWluZyBsaWJlcmFsIGluIHdoYXQgd2UgYWNjZXB0LgogICAgICAqIAotICAgICAqIElNUE9SVEFOVDogTm90ZSB0aGF0LCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgc2lnbiBpcyByZXZlcnNlZCBvbiBhbGwgc2NvcmVzLgorICAgICAqIElNUE9SVEFOVDogTm90ZSB0aGF0LCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgc2lnbiBpcyByZXZlcnNlZCBvbiBhbGwgKmRlbnNlKiBzY29yZXMuCiAgICAgICogVGhpcyBpcyB0aGUgc291cmNlIG9mICpubyBlbmQqIG9mIGNvbmZ1c2lvbiBhbmQgc2hvdWxkIGJlIGRvbmUgYXdheSB3aXRoLgogICAgICAqLwotICAgIGZlYXR1cmVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGbG9hdD4oKTsKKyAgICBzcGFyc2VGZWF0dXJlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRmxvYXQ+KCk7CisgICAgZGVuc2VGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RmxvYXQ+KERFTlNFX0ZFQVRVUkVfTkFNRVMuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbnNlRmVhdHVyZXMuc2l6ZSgpOyBpKyspCisgICAgICBkZW5zZUZlYXR1cmVzLnNldChpLCAwLjBmKTsKKyAgICAKICAgICBpbnQgZGVuc2VGZWF0dXJlSW5kZXggPSAwOwogCiAgICAgaWYgKCFmZWF0dXJlU3RyaW5nLnRyaW0oKS5lcXVhbHMoIiIpKSB7CiAgICAgICBmb3IgKFN0cmluZyB0b2tlbiA6IGZlYXR1cmVTdHJpbmcuc3BsaXQoIlxccysiKSkgewogICAgICAgICBpZiAodG9rZW4uaW5kZXhPZignPScpID09IC0xKSB7Ci0gICAgICAgICAgZmVhdHVyZXMucHV0KFN0cmluZy5mb3JtYXQoIiVzJWQiLCBwcmVmaXgsIGRlbnNlRmVhdHVyZUluZGV4KSwgLUZsb2F0LnBhcnNlRmxvYXQodG9rZW4pKTsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIElmIHdlIGVuY291bnRlciBhbiB1bmxhYmVsZWQgZmVhdHVyZSwgaXQgaXMgdGhlIG5leHQgZGVuc2UgZmVhdHVyZQorICAgICAgICAgICAqLworICAgICAgICAgIHdoaWxlIChkZW5zZUZlYXR1cmVzLnNpemUoKSA8PSBkZW5zZUZlYXR1cmVJbmRleCkKKyAgICAgICAgICAgIGRlbnNlRmVhdHVyZXMuYWRkKDAuMGYpOworICAgICAgICAgIGRlbnNlRmVhdHVyZXMuc2V0KGRlbnNlRmVhdHVyZUluZGV4LCAtRmxvYXQucGFyc2VGbG9hdCh0b2tlbikpOwogICAgICAgICAgIGRlbnNlRmVhdHVyZUluZGV4Kys7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBMYWJlbGVkIGZlYXR1cmVzIGFyZSBvZiB0d28gdHlwZXM6IGlmIHRoZXkgc3RhcnQgd2l0aCB0aGUgcHJlZml4LCB0aGV5IGFyZSBhY3R1YWxseQorICAgICAgICAgICAqIGRlbnNlIGZlYXR1cmUgaW4gZGlzZ3Vpc2U7IG90aGVyd2lzZSwgdGhleSBhcmUgcHJvcGVyIHNwYXJzZSBmZWF0dXJlcy4KKyAgICAgICAgICAgKi8KICAgICAgICAgICBpbnQgc3BsaXRQb2ludCA9IHRva2VuLmluZGV4T2YoJz0nKTsKLSAgICAgICAgICBmZWF0dXJlcy5wdXQodG9rZW4uc3Vic3RyaW5nKDAsIHNwbGl0UG9pbnQpLAotICAgICAgICAgICAgICBGbG9hdC5wYXJzZUZsb2F0KHRva2VuLnN1YnN0cmluZyhzcGxpdFBvaW50ICsgMSkpKTsKKyAgICAgICAgICBpZiAodG9rZW4uc3RhcnRzV2l0aChwcmVmaXgpKSB7CisvLyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIgIFBSRUZJWD0lcyAnJXMnLnN1YnN0cmluZyglZCwlZCkgPSAlcyIsIHByZWZpeCwgdG9rZW4sIHByZWZpeC5sZW5ndGgoKSwgc3BsaXRQb2ludCwKKy8vICAgICAgICAgICAgICAgIHRva2VuLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCksIHNwbGl0UG9pbnQpKSk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCksIHNwbGl0UG9pbnQpKTsKKyAgICAgICAgICAgIHdoaWxlIChkZW5zZUZlYXR1cmVzLnNpemUoKSA8PSBpbmRleCkKKyAgICAgICAgICAgICAgZGVuc2VGZWF0dXJlcy5hZGQoMC4wZik7CisgICAgICAgICAgICBkZW5zZUZlYXR1cmVzLnNldChpbmRleCwgMS4wZiAqIEZsb2F0LnBhcnNlRmxvYXQodG9rZW4uc3Vic3RyaW5nKHNwbGl0UG9pbnQgKyAxKSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcGFyc2VGZWF0dXJlcy5wdXQodG9rZW4uc3Vic3RyaW5nKDAsIHNwbGl0UG9pbnQpLAorICAgICAgICAgICAgICAgIEZsb2F0LnBhcnNlRmxvYXQodG9rZW4uc3Vic3RyaW5nKHNwbGl0UG9pbnQgKyAxKSkpOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQorICAKKyAgLyoqCisgICAqIFJlZ2lzdGVyIG9uZSBvciBtb3JlIGRlbnNlIGZlYXR1cmVzIHdpdGggdGhlIGdsb2JhbCB3ZWlnaHQgdmVjdG9yLiBUaGlzIGFzc3VtZXMgdGhlbSBnbG9iYWwKKyAgICogSURzLCBhbmQgdGhlbiByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZmVhdHVyZSAoZnJvbSB3aGljaCB0aGUgY2FsbGluZyBmZWF0dXJlIGZ1bmN0aW9uCisgICAqIGNhbiBpbmZlciB0aGVtIGFsbCkuIFRoaXMgKm11c3QqIGJlIGNhbGxlZCBieSBldmVyeSBmZWF0dXJlIGZ1bmN0aW9uIHdpc2hpbmcgdG8gcmVnaXN0ZXIKKyAgICogZGVuc2UgZmVhdHVyZXMhCisgICAqIAorICAgKiBAcGFyYW0gbmFtZXMKKyAgICogQHJldHVybgorICAgKi8KKyAgcHVibGljIHZvaWQgcmVnaXN0ZXJEZW5zZUZlYXR1cmVzKEFycmF5TGlzdDxGZWF0dXJlRnVuY3Rpb24+IGZlYXR1cmVGdW5jdGlvbnMpIHsKKyAgICBmb3IgKEZlYXR1cmVGdW5jdGlvbiBmZWF0dXJlOiBmZWF0dXJlRnVuY3Rpb25zKSB7CisgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcyA9IGZlYXR1cmUucmVwb3J0RGVuc2VGZWF0dXJlcyhkZW5zZUZlYXR1cmVzLnNpemUoKSk7CisgICAgICBmb3IgKFN0cmluZyBuYW1lOiBuYW1lcykgeworICAgICAgICBERU5TRV9GRUFUVVJFX05BTUVTLmFkZChuYW1lKTsKKyAgICAgICAgZGVuc2VGZWF0dXJlcy5hZGQoZ2V0U3BhcnNlKG5hbWUpKTsKKyAgICAgICAgc3BhcnNlRmVhdHVyZXMucmVtb3ZlKG5hbWUpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIEFycmF5TGlzdDxGbG9hdD4gZ2V0RGVuc2VGZWF0dXJlcygpIHsKKyAgICByZXR1cm4gZGVuc2VGZWF0dXJlczsKKyAgfQorICAKKyAgcHVibGljIEhhc2hNYXA8U3RyaW5nLEZsb2F0PiBnZXRTcGFyc2VGZWF0dXJlcygpIHsKKyAgICByZXR1cm4gc3BhcnNlRmVhdHVyZXM7CisgIH0KIAogICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0KCkgewotICAgIHJldHVybiBmZWF0dXJlcy5rZXlTZXQoKTsKKyAgICByZXR1cm4gc3BhcnNlRmVhdHVyZXMua2V5U2V0KCk7CiAgIH0KIAogICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgcmV0dXJuIGZlYXR1cmVzLnNpemUoKTsKKyAgICByZXR1cm4gc3BhcnNlRmVhdHVyZXMuc2l6ZSgpICsgZGVuc2VGZWF0dXJlcy5zaXplKCk7CiAgIH0KIAogICBwdWJsaWMgRmVhdHVyZVZlY3RvciBjbG9uZSgpIHsKICAgICBGZWF0dXJlVmVjdG9yIG5ld09uZSA9IG5ldyBGZWF0dXJlVmVjdG9yKCk7Ci0gICAgZm9yIChTdHJpbmcga2V5IDogdGhpcy5mZWF0dXJlcy5rZXlTZXQoKSkKLSAgICAgIG5ld09uZS5wdXQoa2V5LCB0aGlzLmZlYXR1cmVzLmdldChrZXkpKTsKKyAgICBmb3IgKFN0cmluZyBrZXkgOiB0aGlzLnNwYXJzZUZlYXR1cmVzLmtleVNldCgpKQorICAgICAgbmV3T25lLnNldChrZXksIHRoaXMuc3BhcnNlRmVhdHVyZXMuZ2V0KGtleSkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVuc2VGZWF0dXJlcy5zaXplKCk7IGkrKykKKyAgICAgIG5ld09uZS5zZXQoaSwgZGVuc2VGZWF0dXJlcy5nZXQoaSkpOwogICAgIHJldHVybiBuZXdPbmU7CiAgIH0KIApAQCAtOTcsOSArMTY4LDEyIEBACiAgICAqIGEgdmFsdWUgb2YgMC4wZiBiZWZvcmUgc3VidHJhY3Rpb24uCiAgICAqLwogICBwdWJsaWMgdm9pZCBzdWJ0cmFjdChGZWF0dXJlVmVjdG9yIG90aGVyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZW5zZUZlYXR1cmVzLnNpemUoKTsgaSsrKQorICAgICAgZGVuc2VGZWF0dXJlcy5zZXQoaSwgZGVuc2VGZWF0dXJlcy5nZXQoaSkgLSBvdGhlci5nZXREZW5zZShpKSk7CisgICAgCiAgICAgZm9yIChTdHJpbmcga2V5IDogb3RoZXIua2V5U2V0KCkpIHsKLSAgICAgIGZsb2F0IG9sZFZhbHVlID0gKGZlYXR1cmVzLmNvbnRhaW5zS2V5KGtleSkpID8gZmVhdHVyZXMuZ2V0KGtleSkgOiAwLjBmOwotICAgICAgZmVhdHVyZXMucHV0KGtleSwgb2xkVmFsdWUgLSBvdGhlci5nZXQoa2V5KSk7CisgICAgICBmbG9hdCBvbGRWYWx1ZSA9IChzcGFyc2VGZWF0dXJlcy5jb250YWluc0tleShrZXkpKSA/IHNwYXJzZUZlYXR1cmVzLmdldChrZXkpIDogMC4wZjsKKyAgICAgIHNwYXJzZUZlYXR1cmVzLnB1dChrZXksIG9sZFZhbHVlIC0gb3RoZXIuZ2V0U3BhcnNlKGtleSkpOwogICAgIH0KICAgfQogCkBAIC0xMDgsNDQgKzE4Miw3MCBAQAogICAgKiBiZXR3ZWVuIHRoZSB0d28gYmVpbmcgc3VtbWVkLgogICAgKi8KICAgcHVibGljIHZvaWQgYWRkKEZlYXR1cmVWZWN0b3Igb3RoZXIpIHsKKyAgICB3aGlsZSAoZGVuc2VGZWF0dXJlcy5zaXplKCkgPCBvdGhlci5kZW5zZUZlYXR1cmVzLnNpemUoKSkKKyAgICAgIGRlbnNlRmVhdHVyZXMuYWRkKDAuMGYpOworICAgIAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXIuZGVuc2VGZWF0dXJlcy5zaXplKCk7IGkrKykKKyAgICAgIGluY3JlbWVudChpLCBvdGhlci5nZXREZW5zZShpKSk7CisgICAgCiAgICAgZm9yIChTdHJpbmcga2V5IDogb3RoZXIua2V5U2V0KCkpIHsKLSAgICAgIGlmICghZmVhdHVyZXMuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgZmVhdHVyZXMucHV0KGtleSwgb3RoZXIuZ2V0KGtleSkpOworICAgICAgaWYgKCFzcGFyc2VGZWF0dXJlcy5jb250YWluc0tleShrZXkpKQorICAgICAgICBzcGFyc2VGZWF0dXJlcy5wdXQoa2V5LCBvdGhlci5nZXRTcGFyc2Uoa2V5KSk7CiAgICAgICBlbHNlCi0gICAgICAgIGZlYXR1cmVzLnB1dChrZXksIGZlYXR1cmVzLmdldChrZXkpICsgb3RoZXIuZ2V0KGtleSkpOworICAgICAgICBzcGFyc2VGZWF0dXJlcy5wdXQoa2V5LCBzcGFyc2VGZWF0dXJlcy5nZXQoa2V5KSArIG90aGVyLmdldFNwYXJzZShrZXkpKTsKICAgICB9CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShmaW5hbCBTdHJpbmcgZmVhdHVyZSkgewotICAgIHJldHVybiBmZWF0dXJlcy5jb250YWluc0tleShmZWF0dXJlKTsKLSAgfQotCiAgIC8qKgotICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSB3ZWlnaHQgb2YgYSBmZWF0dXJlIGlmIGl0IGV4aXN0cyBhbmQgb3RoZXJ3aXNlIHRocm93cyBhIHJ1bnRpbWUgZXJyb3IuCi0gICAqIEl0IGlzIHRoZSBkdXR5IG9mIHRoZSBwcm9ncmFtbWVyIHRvIGNoZWNrIHVzaW5nIHRoZSBtZXRob2QgY29udGFpbnNLZXkgaWYgYSBmZWF0dXJlIHdpdGggYQotICAgKiBjZXJ0YWluIG5hbWUgZXhpc3RzLiBQcmV2aW91c2x5IHRoaXMgbWV0aG9kIHdvdWxkIHJldHVybiAwIGlmIHRoZSBrZXkgZGlkIG5vdCBleGlzdHMsIGJ1dCB0aGlzCi0gICAqIGxlYWQgdG8gYnVncyBpbiBvdGhlciBwYXJ0cyBvZiB0aGUgY29kZSBiZWNhdXNlIEZlYXR1cmUgTmFtZXMgYXJlIG9mdGVuIHNwZWNpZmllZCBpbiBjYXBpdGFscwotICAgKiBidXQgdGhlbiBsb3dlcmNhc2VkLCBidXQgaW4gdXNpbmcgdGhlIGdldCBtZXRob2QgdGhlIGxvd2VyY2FzZSBmb3JtIGlzIG5vdCB1c2VkIGNvbnNpc3RlbnRseS4KLSAgICogSXQgaXMgdGhlcmVmb3JlIGdvb2QgZGVmZW5zaXZlIHByb2dyYW1taW5nIHRvIGp1c3QgdGhyb3cgYW4gZXJyb3Igd2hlbiBzb21lb25lIHRyaWVzIHRvIGdldCBhCi0gICAqIGZlYXR1cmUgdGhhdCBkb2VzIG5vdCBleGlzdCAtIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGVsaW1pbmF0ZSBzdWNoIGhhcmQgdG8gZGVidWcgZXJyb3JzLiBUaGlzCi0gICAqIGlzIHdoYXQgaXMgbm93IGltcGxlbWVudGVkLgorICAgKiBSZXR1cm4gdGhlIHdlaWdodCBvZiBhIHNwYXJzZSBmZWF0dXJlLCBpbmRleGVkIGJ5IGl0cyBuYW1lLgogICAgKiAKICAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHRoZSBzcGFyc2UgZmVhdHVyZSdzIHdlaWdodCwgb3IgMCBpZiBub3QgZm91bmQuCiAgICAqLwotICBwdWJsaWMgZmxvYXQgZ2V0KFN0cmluZyBmZWF0dXJlKSB7Ci0gICAgaWYgKGZlYXR1cmVzLmNvbnRhaW5zS2V5KGZlYXR1cmUpKQotICAgICAgcmV0dXJuIGZlYXR1cmVzLmdldChmZWF0dXJlKTsKLQorICBwdWJsaWMgZmxvYXQgZ2V0U3BhcnNlKFN0cmluZyBmZWF0dXJlKSB7CisgICAgaWYgKHNwYXJzZUZlYXR1cmVzLmNvbnRhaW5zS2V5KGZlYXR1cmUpKQorICAgICAgcmV0dXJuIHNwYXJzZUZlYXR1cmVzLmdldChmZWF0dXJlKTsKKyAgICByZXR1cm4gMC4wZjsKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gaGFzVmFsdWUoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gc3BhcnNlRmVhdHVyZXMuY29udGFpbnNLZXkobmFtZSk7CisgIH0KKyAgCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIHdlaWdodCBvZiBhIGRlbnNlIGZlYXR1cmUsIGluZGV4ZWQgYnkgaXRzIGZlYXR1cmUgaW5kZXguCisgICAqIAorICAgKiBAcGFyYW0gaWQKKyAgICogQHJldHVybiB0aGUgZGVuc2UgZmVhdHVyZSdzIHZhbHVlLCBvciAwIGlmIG5vdCBmb3VuZC4KKyAgICovCisgIHB1YmxpYyBmbG9hdCBnZXREZW5zZShpbnQgaWQpIHsKKyAgICBpZiAoaWQgPCBkZW5zZUZlYXR1cmVzLnNpemUoKSkKKyAgICAgIHJldHVybiBkZW5zZUZlYXR1cmVzLmdldChpZCk7CiAgICAgcmV0dXJuIDAuMGY7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGZlYXR1cmUsIGZsb2F0IHZhbHVlKSB7Ci0gICAgZmVhdHVyZXMucHV0KGZlYXR1cmUsIHZhbHVlKTsKKyAgcHVibGljIHZvaWQgaW5jcmVtZW50KFN0cmluZyBmZWF0dXJlLCBmbG9hdCB2YWx1ZSkgeworICAgIHNwYXJzZUZlYXR1cmVzLnB1dChmZWF0dXJlLCBnZXRTcGFyc2UoZmVhdHVyZSkgKyB2YWx1ZSk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGluY3JlbWVudChpbnQgaWQsIGZsb2F0IHZhbHVlKSB7CisgICAgd2hpbGUgKGlkID49IGRlbnNlRmVhdHVyZXMuc2l6ZSgpKQorICAgICAgZGVuc2VGZWF0dXJlcy5hZGQoMC4wZik7CisgICAgZGVuc2VGZWF0dXJlcy5zZXQoaWQsIGdldERlbnNlKGlkKSArIHZhbHVlKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgc2V0KFN0cmluZyBmZWF0dXJlLCBmbG9hdCB2YWx1ZSkgeworICAgIHNwYXJzZUZlYXR1cmVzLnB1dChmZWF0dXJlLCB2YWx1ZSk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHNldChpbnQgaWQsIGZsb2F0IHZhbHVlKSB7CisgICAgd2hpbGUgKGlkID49IGRlbnNlRmVhdHVyZXMuc2l6ZSgpKQorICAgICAgZGVuc2VGZWF0dXJlcy5hZGQoMC4wZik7CisgICAgZGVuc2VGZWF0dXJlcy5zZXQoaWQsIHZhbHVlKTsKICAgfQogCiAgIHB1YmxpYyBNYXA8U3RyaW5nLCBGbG9hdD4gZ2V0TWFwKCkgewotICAgIHJldHVybiBmZWF0dXJlczsKKyAgICByZXR1cm4gc3BhcnNlRmVhdHVyZXM7CiAgIH0KIAogICAvKioKQEAgLTE1MywxNiArMjUzLDE4IEBACiAgICAqLwogICBwdWJsaWMgZmxvYXQgaW5uZXJQcm9kdWN0KEZlYXR1cmVWZWN0b3Igb3RoZXIpIHsKICAgICBmbG9hdCBjb3N0ID0gMC4wZjsKLSAgICBmb3IgKFN0cmluZyBrZXkgOiBmZWF0dXJlcy5rZXlTZXQoKSkKLSAgICAgIGlmIChvdGhlci5jb250YWluc0tleShrZXkpKQotICAgICAgICBjb3N0ICs9IGZlYXR1cmVzLmdldChrZXkpICogb3RoZXIuZ2V0KGtleSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBERU5TRV9GRUFUVVJFX05BTUVTLnNpemUoKTsgaSsrKQorICAgICAgY29zdCArPSBnZXREZW5zZShpKSAqIG90aGVyLmdldERlbnNlKGkpOworICAgIAorICAgIGZvciAoU3RyaW5nIGtleSA6IHNwYXJzZUZlYXR1cmVzLmtleVNldCgpKQorICAgICAgY29zdCArPSBzcGFyc2VGZWF0dXJlcy5nZXQoa2V5KSAqIG90aGVyLmdldFNwYXJzZShrZXkpOwogCiAgICAgcmV0dXJuIGNvc3Q7CiAgIH0KIAogICBwdWJsaWMgdm9pZCB0aW1lcyhmbG9hdCB2YWx1ZSkgewotICAgIGZvciAoU3RyaW5nIGtleSA6IGZlYXR1cmVzLmtleVNldCgpKQotICAgICAgZmVhdHVyZXMucHV0KGtleSwgZmVhdHVyZXMuZ2V0KGtleSkgKiB2YWx1ZSk7CisgICAgZm9yIChTdHJpbmcga2V5IDogc3BhcnNlRmVhdHVyZXMua2V5U2V0KCkpCisgICAgICBzcGFyc2VGZWF0dXJlcy5wdXQoa2V5LCBzcGFyc2VGZWF0dXJlcy5nZXQoa2V5KSAqIHZhbHVlKTsKICAgfQogCiAgIC8qKioKQEAgLTE3NSwxOCArMjc3LDE3IEBACiAgICAgSGFzaFNldDxTdHJpbmc+IHByaW50ZWRfa2V5cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKICAgICAKICAgICAvLyBGaXJzdCBwcmludCBhbGwgdGhlIGRlbnNlIGZlYXR1cmUgbmFtZXMgaW4gb3JkZXIKLSAgICBmb3IgKFN0cmluZyBrZXk6IERlY29kZXIuZGVuc2VfZmVhdHVyZV9uYW1lcykgewotICAgICAgZmxvYXQgdmFsdWUgPSBmZWF0dXJlcy5jb250YWluc0tleShrZXkpID8gZmVhdHVyZXMuZ2V0KGtleSkgOiAwLjBmOwotICAgICAgb3V0cHV0U3RyaW5nICs9IFN0cmluZy5mb3JtYXQoIiVzPSUuM2YgIiwga2V5LnJlcGxhY2VBbGwoIl8iLCAiLSIpLCB2YWx1ZSk7Ci0gICAgICBwcmludGVkX2tleXMuYWRkKGtleSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBERU5TRV9GRUFUVVJFX05BTUVTLnNpemUoKTsgaSsrKSB7CisgICAgICBvdXRwdXRTdHJpbmcgKz0gU3RyaW5nLmZvcm1hdCgiJXM9JS4zZiAiLCBERU5TRV9GRUFUVVJFX05BTUVTLmdldChpKS5yZXBsYWNlQWxsKCJfIiwgIi0iKSwgZGVuc2VGZWF0dXJlcy5nZXQoaSkpOworICAgICAgcHJpbnRlZF9rZXlzLmFkZChERU5TRV9GRUFUVVJFX05BTUVTLmdldChpKSk7CiAgICAgfQogICAgIAogICAgIC8vIE5vdyBwcmludCB0aGUgc3BhcnNlIGZlYXR1cmVzCi0gICAgQXJyYXlMaXN0PFN0cmluZz4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihmZWF0dXJlcy5rZXlTZXQoKSk7CisgICAgQXJyYXlMaXN0PFN0cmluZz4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihzcGFyc2VGZWF0dXJlcy5rZXlTZXQoKSk7CiAgICAgQ29sbGVjdGlvbnMuc29ydChrZXlzKTsKICAgICBmb3IgKFN0cmluZyBrZXk6IGtleXMpIHsKICAgICAgIGlmICghIHByaW50ZWRfa2V5cy5jb250YWlucyhrZXkpKSB7Ci0gICAgICAgIGZsb2F0IHZhbHVlID0gZmVhdHVyZXMuZ2V0KGtleSk7CisgICAgICAgIGZsb2F0IHZhbHVlID0gc3BhcnNlRmVhdHVyZXMuZ2V0KGtleSk7CiAgICAgICAgIGlmIChrZXkuZXF1YWxzKCJPT1ZQZW5hbHR5IikpCiAgICAgICAgICAgLy8gZm9yY2UgbW9zZXMgdG8gc2VlIGl0IGFzIHNwYXJzZQogICAgICAgICAgIGtleSA9ICJPT1ZfUGVuYWx0eSI7CkBAIC0yMDcsMjQgKzMwOCwxOCBAQAogICAgIEhhc2hTZXQ8U3RyaW5nPiBwcmludGVkX2tleXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAgICAgCiAgICAgLy8gRmlyc3QgcHJpbnQgYWxsIHRoZSBkZW5zZSBmZWF0dXJlIG5hbWVzIGluIG9yZGVyCi0gICAgZm9yIChTdHJpbmcga2V5OiBEZWNvZGVyLmRlbnNlX2ZlYXR1cmVfbmFtZXMpIHsKLSAgICAgIGZsb2F0IHZhbHVlID0gZmVhdHVyZXMuY29udGFpbnNLZXkoa2V5KSA/IGZlYXR1cmVzLmdldChrZXkpIDogMC4wZjsKLSAgICAgIG91dHB1dFN0cmluZyArPSBTdHJpbmcuZm9ybWF0KCIlcz0lLjNmICIsIGtleSwgdmFsdWUpOwotICAgICAgcHJpbnRlZF9rZXlzLmFkZChrZXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREVOU0VfRkVBVFVSRV9OQU1FUy5zaXplKCk7IGkrKykgeworICAgICAgb3V0cHV0U3RyaW5nICs9IFN0cmluZy5mb3JtYXQoIiVzPSUuM2YgIiwgREVOU0VfRkVBVFVSRV9OQU1FUy5nZXQoaSksIGdldERlbnNlKGkpKTsKKyAgICAgIHByaW50ZWRfa2V5cy5hZGQoREVOU0VfRkVBVFVSRV9OQU1FUy5nZXQoaSkpOwogICAgIH0KICAgICAKICAgICAvLyBOb3cgcHJpbnQgdGhlIHJlc3Qgb2YgdGhlIGZlYXR1cmVzCi0gICAgQXJyYXlMaXN0PFN0cmluZz4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihmZWF0dXJlcy5rZXlTZXQoKSk7CisgICAgQXJyYXlMaXN0PFN0cmluZz4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihzcGFyc2VGZWF0dXJlcy5rZXlTZXQoKSk7CiAgICAgQ29sbGVjdGlvbnMuc29ydChrZXlzKTsKICAgICBmb3IgKFN0cmluZyBrZXk6IGtleXMpCiAgICAgICBpZiAoISBwcmludGVkX2tleXMuY29udGFpbnMoa2V5KSkKLSAgICAgICAgb3V0cHV0U3RyaW5nICs9IFN0cmluZy5mb3JtYXQoIiVzPSUuM2YgIiwga2V5LCBmZWF0dXJlcy5nZXQoa2V5KSk7CisgICAgICAgIG91dHB1dFN0cmluZyArPSBTdHJpbmcuZm9ybWF0KCIlcz0lLjNmICIsIGtleSwgc3BhcnNlRmVhdHVyZXMuZ2V0KGtleSkpOwogCiAgICAgcmV0dXJuIG91dHB1dFN0cmluZy50cmltKCk7CiAgIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZW5zZShTdHJpbmcgZmVhdHVyZSkgewotICAgIHJldHVybiBmZWF0dXJlLnN0YXJ0c1dpdGgoInRtXyIpIHx8IGZlYXR1cmUuc3RhcnRzV2l0aCgibG1fIikgfHwgZmVhdHVyZS5lcXVhbHMoIldvcmRQZW5hbHR5IikKLSAgICAgICAgfHwgZmVhdHVyZS5lcXVhbHMoIkRpc3RvcnRpb24iKSB8fCBmZWF0dXJlLmVxdWFscygiUGhyYXNlUGVuYWx0eSIpOwotICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvT09WUGVuYWx0eS5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL09PVlBlbmFsdHkuamF2YQppbmRleCA5YzgwODI5Li4yN2M0NzVmIDEwMDY0NAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvT09WUGVuYWx0eS5qYXZhCisrKyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9PT1ZQZW5hbHR5LmphdmEKQEAgLTEsNSArMSw2IEBACiBwYWNrYWdlIGpvc2h1YS5kZWNvZGVyLmZmOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtMzksNiArNDAsMTUgQEAKICAgICAgIGZvciAoT09WSXRlbSBpdGVtOiBjb25maWcub292TGlzdCkgCiAgICAgICAgIG9vdldlaWdodHMucHV0KFZvY2FidWxhcnkuaWQoaXRlbS5sYWJlbCksIGl0ZW0ud2VpZ2h0KTsKICAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBBcnJheUxpc3Q8U3RyaW5nPiByZXBvcnREZW5zZUZlYXR1cmVzKGludCBpbmRleCkgeworICAgIGRlbnNlRmVhdHVyZUluZGV4ID0gaW5kZXg7CisgICAgCisgICAgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBuYW1lcy5hZGQobmFtZSk7CisgICAgcmV0dXJuIG5hbWVzOworICB9CiAKICAgLyoqCiAgICAqIE9PViBydWxlcyBjb3ZlciBleGFjdGx5IG9uZSB3b3JkLCBhbmQgc3VjaCBydWxlcyBiZWxvbmcgdG8gYSBncmFtbWFyIHdob3NlIG93bmVyIGlzICJvb3YiLiBFYWNoCkBAIC01MCw3ICs2MCw4IEBACiAgICAgICBTZW50ZW5jZSBzZW50ZW5jZSwgQWNjdW11bGF0b3IgYWNjKSB7CiAgICAgCiAgICAgaWYgKHJ1bGUgIT0gbnVsbCAmJiB0aGlzLm93bmVySUQgPT0gcnVsZS5nZXRPd25lcigpKSB7Ci0gICAgICBhY2MuYWRkKG5hbWUsIGdldFZhbHVlKHJ1bGUuZ2V0TEhTKCkpKTsKKy8vICAgICAgYWNjLmFkZChuYW1lLCBnZXRWYWx1ZShydWxlLmdldExIUygpKSk7CisgICAgICBhY2MuYWRkKGRlbnNlRmVhdHVyZUluZGV4LCBnZXRWYWx1ZShydWxlLmdldExIUygpKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIG51bGw7CkBAIC02Niw3ICs3Nyw3IEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgZmxvYXQgZXN0aW1hdGVDb3N0KFJ1bGUgcnVsZSwgU2VudGVuY2Ugc2VudGVuY2UpIHsKICAgICBpZiAocnVsZSAhPSBudWxsICYmIHRoaXMub3duZXJJRCA9PSBydWxlLmdldE93bmVyKCkpCi0gICAgICByZXR1cm4gd2VpZ2h0cy5nZXQobmFtZSkgKiBnZXRWYWx1ZShydWxlLmdldExIUygpKTsKKyAgICAgIHJldHVybiB3ZWlnaHRzLmdldERlbnNlKGRlbnNlRmVhdHVyZUluZGV4KSAqIGdldFZhbHVlKHJ1bGUuZ2V0TEhTKCkpOwogICAgIHJldHVybiAwLjBmOwogICB9CiAgIApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL1BocmFzZU1vZGVsLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvUGhyYXNlTW9kZWwuamF2YQppbmRleCBhNjRiMzhkLi43MmUyYzJjIDEwMDY0NAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvUGhyYXNlTW9kZWwuamF2YQorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvUGhyYXNlTW9kZWwuamF2YQpAQCAtMSwxMSArMSwxMyBAQAogcGFja2FnZSBqb3NodWEuZGVjb2Rlci5mZjsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBqb3NodWEuY29ycHVzLlZvY2FidWxhcnk7CiBpbXBvcnQgam9zaHVhLmRlY29kZXIuSm9zaHVhQ29uZmlndXJhdGlvbjsKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5jaGFydF9wYXJzZXIuU291cmNlUGF0aDsKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi5zdGF0ZV9tYWludGVuYW5jZS5EUFN0YXRlOworaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLnRtLkdyYW1tYXI7CiBpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYudG0uUnVsZTsKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5oeXBlcmdyYXBoLkhHTm9kZTsKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5zZWdtZW50X2ZpbGUuU2VudGVuY2U7CkBAIC0yNSw1NSArMjcsNTYgQEAKIAogICAvKiBUaGUgb3duZXIgb2YgdGhlIGdyYW1tYXIuICovCiAgIHByaXZhdGUgaW50IG93bmVySUQ7Ci0gIAorICBwcml2YXRlIFN0cmluZyBvd25lcjsKKwogICBwcml2YXRlIGZsb2F0W10gcGhyYXNlX3dlaWdodHMgPSBudWxsOwogCi0gIHB1YmxpYyBQaHJhc2VNb2RlbChGZWF0dXJlVmVjdG9yIHdlaWdodHMsIFN0cmluZ1tdIGFyZ3MsIEpvc2h1YUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgIHB1YmxpYyBQaHJhc2VNb2RlbChGZWF0dXJlVmVjdG9yIHdlaWdodHMsIFN0cmluZ1tdIGFyZ3MsIEpvc2h1YUNvbmZpZ3VyYXRpb24gY29uZmlnLCBHcmFtbWFyIGcpIHsKICAgICBzdXBlcih3ZWlnaHRzLCAidG1fIiwgYXJncywgY29uZmlnKTsKIAogICAgIFN0cmluZyBvd25lciA9IHBhcnNlZEFyZ3MuZ2V0KCJvd25lciIpOwogICAgIHRoaXMubmFtZSA9IFN0cmluZy5mb3JtYXQoInRtXyVzIiwgb3duZXIpOwogCiAgICAgLyoKLSAgICAgKiBUaGlzIGlzIGFuIGVmZmljaWVuY3kgaGFjazsgd2UgY2FjaGUgdGhlIGZ1bGwgZG90IHByb2R1Y3Qgb2YgdGhlIHdlaWdodHMgd2l0aCB0aGUgZGVuc2UKLSAgICAgKiBmZWF0dXJlcywgc3RvcmluZyB0aGVtIGFzIGEgdmFsdWUgdW5kZXIgdGhlIG5hbWUgInRtX09XTkVSIi4gVGhlcmUgd29uJ3QgYmUgYSB3ZWlnaHQgZm9yCi0gICAgICogdGhhdCwgc28gd2UgYWRkIGEgd2VpZ2h0IHRvIHRoZSB3ZWlnaHRzIHZlY3Rvci4gVGhpcyB3ZWlnaHQgd2lsbCBuZXZlciBiZSBvdXRwdXQgYmVjYXVzZSB3aGVuCi0gICAgICogdGhlIGstYmVzdCBsaXN0IGlzIHJldHJpZXZlZCBhbmQgdGhlIGFjdHVhbCBmZWF0dXJlIHZhbHVlcyBhc2tlZCBmb3IsIHRoZSBhY2N1bXVsYXRvciB3aWxsCi0gICAgICogZmV0Y2ggdGhlIGZpbmUtZ3JhaW5lZCBkZW5zZSBmZWF0dXJlcy4KKyAgICAgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBmZWF0dXJlcyBieSBxdWVyeWluZyB0aGUgZXhhbXBsZSBncmFtbWFyIHRoYXQgd2FzIHBhc3NlZCBpbi4KICAgICAgKi8KLSAgICBpZiAod2VpZ2h0cy5jb250YWluc0tleShuYW1lKSkgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgIiogRkFUQUw6IFlvdXIgd2VpZ2h0cyBmaWxlIGNvbnRhaW5zIGFuIGVudHJ5IGZvciAnJXMnLCBzaG91bGRuJ3QiLCBuYW1lKSk7Ci0gICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICB9Ci0gICAgd2VpZ2h0cy5wdXQobmFtZSwgMS4wZik7Ci0gICAgCi0gICAgaW50IG51bV9mZWF0dXJlcyA9IDA7Ci0gICAgd2hpbGUgKHdlaWdodHMuY29udGFpbnNLZXkoU3RyaW5nLmZvcm1hdCgidG1fJXNfJWQiLCBvd25lciwgbnVtX2ZlYXR1cmVzKSkpCi0gICAgICBudW1fZmVhdHVyZXMrKzsKKyAgICBwaHJhc2Vfd2VpZ2h0cyA9IG5ldyBmbG9hdFtnLmdldE51bURlbnNlRmVhdHVyZXMoKV07CisvLyAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiR09UICVkIEZFQVRVUkVTIEZPUiAlcyIsIGcuZ2V0TnVtRGVuc2VGZWF0dXJlcygpLCBvd25lcikpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhyYXNlX3dlaWdodHMubGVuZ3RoOyBpKyspCisgICAgICBwaHJhc2Vfd2VpZ2h0c1tpXSA9IHdlaWdodHMuZ2V0U3BhcnNlKFN0cmluZy5mb3JtYXQoInRtXyVzXyVkIiwgb3duZXIsIGkpKTsKIAotICAgIHBocmFzZV93ZWlnaHRzID0gbmV3IGZsb2F0W251bV9mZWF0dXJlc107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZmVhdHVyZXM7IGkrKykKLSAgICAgIHBocmFzZV93ZWlnaHRzW2ldID0gd2VpZ2h0cy5nZXQoU3RyaW5nLmZvcm1hdCgidG1fJXNfJWQiLCBvd25lciwgaSkpOwotICAgICAgICAKICAgICAvLyBTdG9yZSB0aGUgb3duZXIuCisgICAgdGhpcy5vd25lciA9IG93bmVyOwogICAgIHRoaXMub3duZXJJRCA9IFZvY2FidWxhcnkuaWQob3duZXIpOwogICB9CiAKICAgLyoqCi0gICAqIEVzdGltYXRlcyB0aGUgY29zdCBvZiBhcHBseWluZyB0aGlzIHJ1bGUsIHdoaWNoIGlzIGp1c3QgdGhlIHNjb3JlIG9mIHRoZSBwcmVjb21wdXRhYmxlCi0gICAqIGZlYXR1cmUgZnVuY3Rpb25zLgorICAgKiBKdXN0IHJlZ2lzdGVyIGEgc2luZ2xlIHdlaWdodCwgdG1fT1dORVIsIGFuZCB1c2UgdGhhdCB0byBzZXQgaXRzIHByZWNvbXB1dGVkIGNvc3QKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgQXJyYXlMaXN0PFN0cmluZz4gcmVwb3J0RGVuc2VGZWF0dXJlcyhpbnQgaW5kZXgpIHsKKyAgICBkZW5zZUZlYXR1cmVJbmRleCA9IGluZGV4OworCisgICAgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBocmFzZV93ZWlnaHRzLmxlbmd0aDsgaSsrKQorICAgICAgbmFtZXMuYWRkKFN0cmluZy5mb3JtYXQoInRtXyVzXyVkIiwgb3duZXIsIGkpKTsKKyAgICByZXR1cm4gbmFtZXM7CisgIH0KKworICAvKioKKyAgICogRXN0aW1hdGVzIHRoZSBjb3N0IG9mIGFwcGx5aW5nIHRoaXMgcnVsZSwgd2hpY2ggaXMganVzdCB0aGUgc2NvcmUgb2YgdGhlIHByZWNvbXB1dGFibGUgZmVhdHVyZQorICAgKiBmdW5jdGlvbnMuCiAgICAqLwogICBAT3ZlcnJpZGUKICAgcHVibGljIGZsb2F0IGVzdGltYXRlQ29zdChmaW5hbCBSdWxlIHJ1bGUsIFNlbnRlbmNlIHNlbnRlbmNlKSB7Ci0gICAgCisKICAgICBpZiAocnVsZSAhPSBudWxsICYmIHJ1bGUuZ2V0T3duZXIoKSA9PSBvd25lcklEKSB7CiAgICAgICBpZiAocnVsZS5nZXRQcmVjb21wdXRhYmxlQ29zdCgpIDw9IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZKQogICAgICAgICBydWxlLnNldFByZWNvbXB1dGFibGVDb3N0KHBocmFzZV93ZWlnaHRzLCB3ZWlnaHRzKTsKLSAgICAgICAgCisKICAgICAgIHJldHVybiBydWxlLmdldFByZWNvbXB1dGFibGVDb3N0KCk7CiAgICAgfQotICAgIAorCiAgICAgcmV0dXJuIDAuMGY7CiAgIH0KIApAQCAtOTAsMTcgKzkzLDE5IEBACiAgICAgICAgKiBhZGQgZWFjaCBmZWF0dXJlLCBidXQgcmF0aGVyIGNvbXB1dGUgdGhlIGlubmVyIHByb2R1Y3QgYW5kIGFkZCAqdGhhdCouIFRoaXMgaXMgdG90YWxseQogICAgICAgICogY2hlYXRpbmc7IHRoZSBBY2N1bXVsYXRvciBpcyBzdXBwb3NlZCB0byBiZSBhIGdlbmVyaWMgb2JqZWN0LiBCdXQgd2l0aG91dCB0aGlzIGNoZWF0CiAgICAgICAgKi8KLSAgICAgIGlmIChhY2MgaW5zdGFuY2VvZiBTY29yZUFjY3VtdWxhdG9yKSB7Ci0gICAgICAgIGlmIChydWxlLmdldFByZWNvbXB1dGFibGVDb3N0KCkgPD0gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkpIHsKLS8vICAgICAgICAgIGZsb2F0IHNjb3JlID0gcnVsZS5nZXRGZWF0dXJlVmVjdG9yKCkuaW5uZXJQcm9kdWN0KHdlaWdodHMpOwotICAgICAgICAgIHJ1bGUuc2V0UHJlY29tcHV0YWJsZUNvc3QocGhyYXNlX3dlaWdodHMsIHdlaWdodHMpOwotICAgICAgICB9Ci0gICAgICAgIGFjYy5hZGQobmFtZSwgcnVsZS5nZXRQcmVjb21wdXRhYmxlQ29zdCgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEZlYXR1cmVWZWN0b3IgZmVhdHVyZXMgPSBydWxlLmdldEZlYXR1cmVWZWN0b3IoKTsKLSAgICAgICAgZm9yIChTdHJpbmcga2V5IDogZmVhdHVyZXMua2V5U2V0KCkpCi0gICAgICAgICAgYWNjLmFkZChrZXksIGZlYXR1cmVzLmdldChrZXkpKTsKKyAgICAgIGlmIChydWxlLmdldFByZWNvbXB1dGFibGVDb3N0KCkgPD0gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkpIHsKKyAgICAgICAgLy8gZmxvYXQgc2NvcmUgPSBydWxlLmdldEZlYXR1cmVWZWN0b3IoKS5pbm5lclByb2R1Y3Qod2VpZ2h0cyk7CisgICAgICAgIHJ1bGUuc2V0UHJlY29tcHV0YWJsZUNvc3QocGhyYXNlX3dlaWdodHMsIHdlaWdodHMpOwogICAgICAgfQorICAgICAgCisvLyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJSVUxFID0gJXMgLyAlZiIsIHJ1bGUuZ2V0RW5nbGlzaFdvcmRzKCksIHJ1bGUuZ2V0UHJlY29tcHV0YWJsZUNvc3QoKSkpOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBwaHJhc2Vfd2VpZ2h0cy5sZW5ndGg7IGsrKykgeworLy8gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJrID0gJWQsIGRlbnNlRmVhdHVyZUluZGV4ID0gJWQsIG93bmVyID0gJXMsIG93bmVySUQgPSAlZCIsIGssIGRlbnNlRmVhdHVyZUluZGV4LCBvd25lciwgb3duZXJJRCkpOworICAgICAgICBhY2MuYWRkKGsgKyBkZW5zZUZlYXR1cmVJbmRleCwgcnVsZS5nZXREZW5zZUZlYXR1cmUoaykpOworICAgICAgfQorICAgICAgCisgICAgICBmb3IgKFN0cmluZyBrZXk6IHJ1bGUuZ2V0RmVhdHVyZVZlY3RvcigpLmtleVNldCgpKQorICAgICAgICBhY2MuYWRkKGtleSwgcnVsZS5nZXRGZWF0dXJlVmVjdG9yKCkuZ2V0U3BhcnNlKGtleSkpOwogICAgIH0KIAogICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL1BocmFzZVBlbmFsdHkuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9QaHJhc2VQZW5hbHR5LmphdmEKaW5kZXggOTA2MjJlNi4uMzNlZTE1NCAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL1BocmFzZVBlbmFsdHkuamF2YQorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvUGhyYXNlUGVuYWx0eS5qYXZhCkBAIC0xLDUgKzEsNiBAQAogcGFja2FnZSBqb3NodWEuZGVjb2Rlci5mZjsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CQogCiBpbXBvcnQgam9zaHVhLmNvcnB1cy5Wb2NhYnVsYXJ5OwpAQCAtMjQsMTIgKzI1LDEwIEBACiBwdWJsaWMgY2xhc3MgUGhyYXNlUGVuYWx0eSBleHRlbmRzIFN0YXRlbGVzc0ZGIHsKIAogICBwcml2YXRlIGludCBvd25lciA9IDA7Ci0gIHByaXZhdGUgZmxvYXQgd2VpZ2h0ID0gMC4wZjsKICAgcHJpdmF0ZSBmbG9hdCB2YWx1ZSA9IDEuMGY7CiAgIAogICBwdWJsaWMgUGhyYXNlUGVuYWx0eShGZWF0dXJlVmVjdG9yIHdlaWdodHMsIFN0cmluZ1tdIGFyZ3MsIEpvc2h1YUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgc3VwZXIod2VpZ2h0cywgIlBocmFzZVBlbmFsdHkiLCBhcmdzLCBjb25maWcpOwotICAgIHRoaXMud2VpZ2h0ID0gd2VpZ2h0cy5nZXQobmFtZSk7CiAgICAgaWYgKHBhcnNlZEFyZ3MuY29udGFpbnNLZXkoIm93bmVyIikpCiAgICAgICB0aGlzLm93bmVyID0gVm9jYWJ1bGFyeS5pZChwYXJzZWRBcmdzLmdldCgib3duZXIiKSk7CiAgICAgZWxzZSAvLyBkZWZhdWx0CkBAIC00MiwxMCArNDEsMTggQEAKIAogICAgIGlmIChydWxlICE9IG51bGwgJiYgcnVsZSAhPSBIeXBvdGhlc2lzLkJFR0lOX1JVTEUgJiYgcnVsZSAhPSBIeXBvdGhlc2lzLkVORF9SVUxFIAogICAgICAgICAmJiAob3duZXIgPT0gMCB8fCBydWxlLmdldE93bmVyKCkgPT0gb3duZXIpKQotICAgICAgYWNjLmFkZChuYW1lLCB2YWx1ZSk7CisgICAgICBhY2MuYWRkKGRlbnNlRmVhdHVyZUluZGV4LCB2YWx1ZSk7CiAKICAgICByZXR1cm4gbnVsbDsKICAgfQorICAgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIEFycmF5TGlzdDxTdHJpbmc+IHJlcG9ydERlbnNlRmVhdHVyZXMoaW50IGluZGV4KSB7CisgICAgZGVuc2VGZWF0dXJlSW5kZXggPSBpbmRleDsKKyAgICBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIG5hbWVzLmFkZChuYW1lKTsKKyAgICByZXR1cm4gbmFtZXM7CisgIH0KICAgCiAgIC8qKgogICAgKiBSZXR1cm5zIHRoZSAqd2VpZ2h0ZWQqIGVzdGltYXRlLgpAQCAtNTUsNyArNjIsNyBAQAogICBwdWJsaWMgZmxvYXQgZXN0aW1hdGVDb3N0KFJ1bGUgcnVsZSwgU2VudGVuY2Ugc2VudGVuY2UpIHsKICAgICBpZiAocnVsZSAhPSBudWxsICYmIHJ1bGUgIT0gSHlwb3RoZXNpcy5CRUdJTl9SVUxFICYmIHJ1bGUgIT0gSHlwb3RoZXNpcy5FTkRfUlVMRSAKICAgICAgICAgJiYgKG93bmVyID09IDAgfHwgcnVsZS5nZXRPd25lcigpID09IG93bmVyKSkKLSAgICAgIHJldHVybiB3ZWlnaHQgKiB2YWx1ZTsKKyAgICAgIHJldHVybiB3ZWlnaHRzLmdldERlbnNlKGRlbnNlRmVhdHVyZUluZGV4KSAqIHZhbHVlOwogICAgIHJldHVybiAwLjBmOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvUnVsZUNvdW50QmluLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvUnVsZUNvdW50QmluLmphdmEKaW5kZXggYzUwYWEyNS4uNTAxZTlkZSAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL1J1bGVDb3VudEJpbi5qYXZhCisrKyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9SdWxlQ291bnRCaW4uamF2YQpAQCAtMzAsNyArMzAsNyBAQAogICAgIGlmIChydWxlLmdldE93bmVyKCkgIT0gVm9jYWJ1bGFyeS5pZCgicHQiKSkKICAgICAgIHJldHVybiBudWxsOwogICAgIAotICAgIGZsb2F0IHJhcml0eVBlbmFsdHkgPSAtcnVsZS5nZXRGZWF0dXJlVmVjdG9yKCkuZ2V0KFN0cmluZy5mb3JtYXQoInRtX3B0XyVkIiwgZmllbGQpKTsKKyAgICBmbG9hdCByYXJpdHlQZW5hbHR5ID0gLXJ1bGUuZ2V0RmVhdHVyZVZlY3RvcigpLmdldFNwYXJzZShTdHJpbmcuZm9ybWF0KCJ0bV9wdF8lZCIsIGZpZWxkKSk7CiAgICAgaW50IGNvdW50ID0gKGludCkgKDEuMCAtIE1hdGgubG9nKHJhcml0eVBlbmFsdHkpKTsKIAogICAgIFN0cmluZyBmZWF0dXJlID0gIlJ1bGVDb3VudEJpbl9pbmYiOwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL1NvdXJjZVBhdGhGRi5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL1NvdXJjZVBhdGhGRi5qYXZhCmluZGV4IDQxNzJhNDYuLjU3NDE0Y2QgMTAwNjQ0Ci0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9Tb3VyY2VQYXRoRkYuamF2YQorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvU291cmNlUGF0aEZGLmphdmEKQEAgLTEsNSArMSw2IEBACiBwYWNrYWdlIGpvc2h1YS5kZWNvZGVyLmZmOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IGpvc2h1YS5kZWNvZGVyLkpvc2h1YUNvbmZpZ3VyYXRpb247CkBAIC0yNCwxMiArMjUsMjEgQEAKICAgcHVibGljIFNvdXJjZVBhdGhGRihGZWF0dXJlVmVjdG9yIHdlaWdodHMsIFN0cmluZ1tdIGFyZ3MsIEpvc2h1YUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgc3VwZXIod2VpZ2h0cywgIlNvdXJjZVBhdGgiLCBhcmdzLCBjb25maWcpOwogICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBBcnJheUxpc3Q8U3RyaW5nPiByZXBvcnREZW5zZUZlYXR1cmVzKGludCBpbmRleCkgeworICAgIGRlbnNlRmVhdHVyZUluZGV4ID0gaW5kZXg7CisgICAgCisgICAgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBuYW1lcy5hZGQobmFtZSk7CisgICAgcmV0dXJuIG5hbWVzOworICB9CiAgIAogICBAT3ZlcnJpZGUKICAgcHVibGljIERQU3RhdGUgY29tcHV0ZShSdWxlIHJ1bGUsIExpc3Q8SEdOb2RlPiB0YWlsTm9kZXMsIGludCBpLCBpbnQgaiwgU291cmNlUGF0aCBzb3VyY2VQYXRoLAogICAgICAgU2VudGVuY2Ugc2VudGVuY2UsIEFjY3VtdWxhdG9yIGFjYykgewogCi0gICAgYWNjLmFkZChuYW1lLCAgc291cmNlUGF0aC5nZXRQYXRoQ29zdCgpKTsKKyAgICBhY2MuYWRkKGRlbnNlRmVhdHVyZUluZGV4LCAgc291cmNlUGF0aC5nZXRQYXRoQ29zdCgpKTsKICAgICByZXR1cm4gbnVsbDsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL1RhcmdldEJpZ3JhbS5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL1RhcmdldEJpZ3JhbS5qYXZhCmluZGV4IDI5ZGM5OTIuLjFiODQyYWMgMTAwNjQ0Ci0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9UYXJnZXRCaWdyYW0uamF2YQorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvVGFyZ2V0QmlncmFtLmphdmEKQEAgLTc2LDggKzc2LDggQEAKICAgICAgIH0KIAogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiKiBGQVRBTDogY291bGRuJ3QgbG9hZCBUYXJnZXRCaWdyYW0gdm9jYWJ1bGFyeSAnJXMnIiwgZmlsZW5hbWUpKTsKKyAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvV29yZFBlbmFsdHkuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9Xb3JkUGVuYWx0eS5qYXZhCmluZGV4IDYyMTA1ZTguLmU3Mzk5MWIgMTAwNjQ0Ci0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9Xb3JkUGVuYWx0eS5qYXZhCisrKyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9Xb3JkUGVuYWx0eS5qYXZhCkBAIC0xLDUgKzEsNiBAQAogcGFja2FnZSBqb3NodWEuZGVjb2Rlci5mZjsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5Kb3NodWFDb25maWd1cmF0aW9uOwpAQCAtMjEsNyArMjIsNyBAQAogCiAgIHB1YmxpYyBXb3JkUGVuYWx0eShmaW5hbCBGZWF0dXJlVmVjdG9yIHdlaWdodHMsIFN0cmluZ1tdIGFyZ3MsIEpvc2h1YUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgc3VwZXIod2VpZ2h0cywgIldvcmRQZW5hbHR5IiwgYXJncywgY29uZmlnKTsKLSAgICAKKwogICAgIGlmIChwYXJzZWRBcmdzLmNvbnRhaW5zS2V5KCJ2YWx1ZSIpKQogICAgICAgT01FR0EgPSBGbG9hdC5wYXJzZUZsb2F0KHBhcnNlZEFyZ3MuZ2V0KCJ2YWx1ZSIpKTsKICAgfQpAQCAtMjksMTcgKzMwLDMxIEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgRFBTdGF0ZSBjb21wdXRlKFJ1bGUgcnVsZSwgTGlzdDxIR05vZGU+IHRhaWxOb2RlcywgaW50IGksIGludCBqLCBTb3VyY2VQYXRoIHNvdXJjZVBhdGgsCiAgICAgICBTZW50ZW5jZSBzZW50ZW5jZSwgQWNjdW11bGF0b3IgYWNjKSB7Ci0gICAgCi0gICAgaWYgKHJ1bGUgIT0gbnVsbCAmJiBydWxlICE9IEh5cG90aGVzaXMuQkVHSU5fUlVMRSAmJiBydWxlICE9IEh5cG90aGVzaXMuRU5EX1JVTEUpCi0gICAgICBhY2MuYWRkKG5hbWUsIE9NRUdBICogKHJ1bGUuZ2V0RW5nbGlzaCgpLmxlbmd0aCAtIHJ1bGUuZ2V0QXJpdHkoKSkpOwogCisgICAgaWYgKHJ1bGUgIT0gbnVsbCkgeworICAgICAgLy8gVE9ETzogdGhpcyBpcyBhbiBpbmVmZmljaWVudCB3YXkgdG8gZG8gdGhpcy4gRmluZCBhIGJldHRlciB3YXkgdG8gbm90IGFwcGx5IHRoaXMgcnVsZQorICAgICAgLy8gdG8gc3RhcnQgYW5kIHN0b3AgZ2x1ZSBydWxlcyB3aGVuIHBocmFzZS1iYXNlZCBkZWNvZGluZy4KKyAgICAgIGlmIChjb25maWcuc2VhcmNoX2FsZ29yaXRobS5lcXVhbHMoImNreSIpIAorICAgICAgICAgIHx8IChydWxlICE9IEh5cG90aGVzaXMuQkVHSU5fUlVMRSAmJiBydWxlICE9IEh5cG90aGVzaXMuRU5EX1JVTEUpKQorICAgICAgICAvLyBhY2MuYWRkKG5hbWUsIE9NRUdBICogKHJ1bGUuZ2V0RW5nbGlzaCgpLmxlbmd0aCAtIHJ1bGUuZ2V0QXJpdHkoKSkpOworICAgICAgICBhY2MuYWRkKGRlbnNlRmVhdHVyZUluZGV4LCBPTUVHQSAqIChydWxlLmdldEVuZ2xpc2goKS5sZW5ndGggLSBydWxlLmdldEFyaXR5KCkpKTsKKyAgICB9CisgICAgICAKICAgICByZXR1cm4gbnVsbDsKICAgfQotICAKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEFycmF5TGlzdDxTdHJpbmc+IHJlcG9ydERlbnNlRmVhdHVyZXMoaW50IGluZGV4KSB7CisgICAgZGVuc2VGZWF0dXJlSW5kZXggPSBpbmRleDsKKyAgICBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIG5hbWVzLmFkZChuYW1lKTsKKyAgICByZXR1cm4gbmFtZXM7CisgIH0KKwogICBAT3ZlcnJpZGUKICAgcHVibGljIGZsb2F0IGVzdGltYXRlQ29zdChSdWxlIHJ1bGUsIFNlbnRlbmNlIHNlbnRlbmNlKSB7CiAgICAgaWYgKHJ1bGUgIT0gbnVsbCkKLSAgICAgIHJldHVybiB3ZWlnaHRzLmdldChuYW1lKSAqIE9NRUdBICogKHJ1bGUuZ2V0RW5nbGlzaCgpLmxlbmd0aCAtIHJ1bGUuZ2V0QXJpdHkoKSk7CisgICAgICByZXR1cm4gd2VpZ2h0cy5nZXREZW5zZShkZW5zZUZlYXR1cmVJbmRleCkgKiBPTUVHQSAqIChydWxlLmdldEVuZ2xpc2goKS5sZW5ndGggLSBydWxlLmdldEFyaXR5KCkpOwogICAgIHJldHVybiAwLjBmOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0vS2VuTE0uamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9LZW5MTS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMDJlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0vS2VuTE0uamF2YQpAQCAtMCwwICsxLDE3MyBAQAorcGFja2FnZSBqb3NodWEuZGVjb2Rlci5mZi5sbTsKKworaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLmxtLk5HcmFtTGFuZ3VhZ2VNb2RlbDsKK2ltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi5zdGF0ZV9tYWludGVuYW5jZS5LZW5MTVN0YXRlOworCisvKioKKyAqIEpOSSB3cmFwcGVyIGZvciBLZW5MTS4gVGhpcyB2ZXJzaW9uIG9mIEtlbkxNIHN1cHBvcnRzIHR3byB1c2UgY2FzZXMsIGltcGxlbWVudGVkIGJ5IHRoZSBzZXBhcmF0ZQorICogZmVhdHVyZSBmdW5jdGlvbnMgS2VuTE1GRiBhbmQgTGFuZ3VhZ2VNb2RlbEZGLiBLZW5MTUZGIHVzZXMgdGhlIFJ1bGVTY29yZSgpIGludGVyZmFjZSBpbgorICogbG0vbGVmdC5oaCwgcmV0dXJuaW5nIGEgc3RhdGUgcG9pbnRlciByZXByZXNlbnRpbmcgdGhlIEtlbkxNIHN0YXRlLCB3aGlsZSBMYW5nYXVnZU1vZGVsRkYgaGFuZGxlcworICogc3RhdGUgYnkgaXRzZWxmIGFuZCBqdXN0IHBhc3NlcyBpbiB0aGUgbmdyYW1zIGZvciBzY29yaW5nLgorICogCisgKiBAYXV0aG9yIEtlbm5ldGggSGVhZmllbGQKKyAqIEBhdXRob3IgTWF0dCBQb3N0IDxwb3N0QGNzLmpodS5lZHU+CisgKi8KKworcHVibGljIGNsYXNzIEtlbkxNIGltcGxlbWVudHMgTkdyYW1MYW5ndWFnZU1vZGVsLCBDb21wYXJhYmxlPEtlbkxNPiB7CisKKyAgc3RhdGljIHsKKyAgICB0cnkgeworICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJrZW4iKTsKKyAgICB9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiogRkFUQUw6IENhbid0IGZpbmQgbGlia2VuLnNvIChsaWJrZW4uZHlsaWIgb24gT1MgWCkgaW4gJEpPU0hVQS9saWIiKTsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiKiAgICAgICAgVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSBLZW5MTSBsaWJyYXJ5IGRpZG4ndCBjb21waWxlLiIpOworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIqICAgICAgICBNYWtlIHN1cmUgdGhhdCBCT09TVF9ST09UIGlzIHNldCB0byB0aGUgcm9vdCBvZiB5b3VyIGJvb3N0Iik7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiogICAgICAgIGluc3RhbGxhdGlvbiAoaXQncyBub3QgL29wdC9sb2NhbC8sIHRoZSBkZWZhdWx0KSwgY2hhbmdlIHRvIik7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiogICAgICAgICRKT1NIVUEsIGFuZCB0eXBlICdhbnQga2VubG0nLiBJZiBwcm9ibGVtcyBwZXJzaXN0LCBzZWUgdGhlIik7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiogICAgICAgIHdlYnNpdGUgKGpvc2h1YS1kZWNvZGVyLm9yZykuIik7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIGxvbmcgcG9pbnRlcjsKKworICAvLyB0aGlzIGlzIHJlYWQgZnJvbSB0aGUgY29uZmlnIGZpbGUsIHVzZWQgdG8gc2V0IG1heGltdW0gb3JkZXIKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbmdyYW1PcmRlcjsKKyAgLy8gaW5mZXJyZWQgZnJvbSBtb2RlbCBmaWxlIChtYXkgYmUgbGFyZ2VyIHRoYW4gbmdyYW1PcmRlcikKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgTjsKKyAgLy8gd2hldGhlciBsZWZ0LXN0YXRlIG1pbmltaXphdGlvbiB3YXMgcmVxdWVzdGVkCisgIHByaXZhdGUgYm9vbGVhbiBtaW5pbWl6aW5nOworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIG5hdGl2ZSBsb25nIGNvbnN0cnVjdChTdHJpbmcgZmlsZV9uYW1lKTsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBkZXN0cm95KGxvbmcgcHRyKTsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBuYXRpdmUgaW50IG9yZGVyKGxvbmcgcHRyKTsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiByZWdpc3RlcldvcmQobG9uZyBwdHIsIFN0cmluZyB3b3JkLCBpbnQgaWQpOworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIG5hdGl2ZSBmbG9hdCBwcm9iKGxvbmcgcHRyLCBpbnQgd29yZHNbXSk7CisKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbmF0aXZlIFN0YXRlUHJvYlBhaXIgcHJvYlJ1bGUobG9uZyBwdHIsIGxvbmcgcG9vbCwgbG9uZyB3b3Jkc1tdKTsKKyAgCisgIHByaXZhdGUgZmluYWwgc3RhdGljIG5hdGl2ZSBmbG9hdCBlc3RpbWF0ZVJ1bGUobG9uZyBwdHIsIGxvbmcgd29yZHNbXSk7CisKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbmF0aXZlIGZsb2F0IHByb2JTdHJpbmcobG9uZyBwdHIsIGludCB3b3Jkc1tdLCBpbnQgc3RhcnQpOworCisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIGxvbmcgY3JlYXRlUG9vbCgpOworICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSB2b2lkIGRlc3Ryb3lQb29sKGxvbmcgcG9pbnRlcik7CisKKyAgcHVibGljIEtlbkxNKGludCBvcmRlciwgU3RyaW5nIGZpbGVfbmFtZSkgeworICAgIG5ncmFtT3JkZXIgPSBvcmRlcjsKKworICAgIHBvaW50ZXIgPSBjb25zdHJ1Y3QoZmlsZV9uYW1lKTsKKyAgICBOID0gb3JkZXIocG9pbnRlcik7CisgIH0KKworICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgIGRlc3Ryb3kocG9pbnRlcik7CisgIH0KKworICBwdWJsaWMgaW50IGdldE9yZGVyKCkgeworICAgIHJldHVybiBuZ3JhbU9yZGVyOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXJXb3JkKFN0cmluZyB3b3JkLCBpbnQgaWQpIHsKKyAgICByZXR1cm4gcmVnaXN0ZXJXb3JkKHBvaW50ZXIsIHdvcmQsIGlkKTsKKyAgfQorCisgIHB1YmxpYyBmbG9hdCBwcm9iKGludCB3b3Jkc1tdKSB7CisgICAgcmV0dXJuIHByb2IocG9pbnRlciwgd29yZHMpOworICB9CisKKyAgLy8gQXBwYXJlbnRseSBaaGlmZWkgc3RhcnRzIHNvbWUgYXJyYXkgaW5kaWNlcyBhdCAxLiBDaGFuZ2UgdG8gMC1pbmRleGluZy4KKyAgcHVibGljIGZsb2F0IHByb2JTdHJpbmcoaW50IHdvcmRzW10sIGludCBzdGFydCkgeworICAgIHJldHVybiBwcm9iU3RyaW5nKHBvaW50ZXIsIHdvcmRzLCBzdGFydCAtIDEpOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGJyaWRnZSB0byB0aGUgaW50ZXJmYWNlIGluIGtlbmxtL2xtL2xlZnQuaGgsIHdoaWNoIGhhcyBLZW5MTSBzY29yZSB0aGUKKyAgICogd2hvbGUgcnVsZS4gSXQgdGFrZXMgYSBsaXN0IG9mIHdvcmRzIGFuZCBzdGF0ZXMgcmV0cmlldmVkIGZyb20gdGFpbCBub2RlcyAobm9udGVybWluYWxzIGluIHRoZQorICAgKiBydWxlKS4gTm9udGVybWluYWxzIGhhdmUgYSBuZWdhdGl2ZSB2YWx1ZSBzbyBLZW5MTSBjYW4gZGlzdGluZ3Vpc2ggdGhlbS4gVGhlIHNlbnRlbmNlIG51bWJlciBpcworICAgKiBuZWVkZWQgc28gS2VuTE0ga25vd3Mgd2hpY2ggbWVtb3J5IHBvb2wgdG8gdXNlLiBXaGVuIGZpbmlzaGVkLCBpdCByZXR1cm5zIHRoZSB1cGRhdGVkIEtlbkxNCisgICAqIHN0YXRlIGFuZCB0aGUgTE0gcHJvYmFiaWxpdHkgaW5jdXJyZWQgYWxvbmcgdGhpcyBydWxlLgorICAgKiAKKyAgICogQHBhcmFtIHdvcmRzCisgICAqIEBwYXJhbSBzZW50SWQKKyAgICogQHJldHVybgorICAgKi8KKyAgcHVibGljIFN0YXRlUHJvYlBhaXIgcHJvYlJ1bGUobG9uZ1tdIHdvcmRzLCBsb25nIHBvb2xQb2ludGVyKSB7CisKKyAgICBTdGF0ZVByb2JQYWlyIHBhaXIgPSBudWxsOworICAgIHRyeSB7CisgICAgICBwYWlyID0gcHJvYlJ1bGUocG9pbnRlciwgcG9vbFBvaW50ZXIsIHdvcmRzKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorCisgICAgcmV0dXJuIHBhaXI7CisgIH0KKworICAvKioKKyAgICogUHVibGljIGZhY2luZyBmdW5jdGlvbiB0aGF0IGVzdGltYXRlcyB0aGUgY29zdCBvZiBhIHJ1bGUsIHdoaWNoIHZhbHVlIGlzIHVzZWQgZm9yIHNvcnRpbmcKKyAgICogcnVsZXMgZHVyaW5nIGN1YmUgcHJ1bmluZy4KKyAgICogCisgICAqIEBwYXJhbSB3b3JkcworICAgKiBAcmV0dXJuIHRoZSBlc3RpbWF0ZWQgY29zdCBvZiB0aGUgcnVsZSAodGhlIChwYXJ0aWFsKSBuLWdyYW0gcHJvYmFiaWxpdGllcyBvZiBhbGwgd29yZHMgaW4gdGhlIHJ1bGUpCisgICAqLworICBwdWJsaWMgZmxvYXQgZXN0aW1hdGVSdWxlKGxvbmdbXSB3b3JkcykgeworICAgIGZsb2F0IGVzdGltYXRlID0gMC4wZjsKKyAgICB0cnkgeworICAgICAgZXN0aW1hdGUgPSBlc3RpbWF0ZVJ1bGUocG9pbnRlciwgd29yZHMpOworICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGVzdGltYXRlOworICB9CisKKworICAvKioKKyAgICogSW5uZXIgY2xhc3MgdXNlZCB0byBob2xkIHRoZSByZXN1bHRzIHJldHVybmVkIGZyb20gS2VuTE0gd2l0aCBsZWZ0LXN0YXRlIG1pbmltaXphdGlvbi4gTm90ZQorICAgKiB0aGF0IGlubmVyIGNsYXNzZXMgaGF2ZSB0byBiZSBzdGF0aWMgdG8gYmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBKTkkhCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0YXRlUHJvYlBhaXIgeworICAgIHB1YmxpYyBLZW5MTVN0YXRlIHN0YXRlID0gbnVsbDsKKyAgICBwdWJsaWMgZmxvYXQgcHJvYiA9IDAuMGY7CisKKyAgICBwdWJsaWMgU3RhdGVQcm9iUGFpcihsb25nIHN0YXRlLCBmbG9hdCBwcm9iKSB7CisgICAgICB0aGlzLnN0YXRlID0gbmV3IEtlbkxNU3RhdGUoc3RhdGUpOworICAgICAgdGhpcy5wcm9iID0gcHJvYjsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBjb21wYXJlVG8oS2VuTE0gb3RoZXIpIHsKKyAgICBpZiAodGhpcyA9PSBvdGhlcikKKyAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qKgorICAgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgaWYgS2VuTE0gaXMgaW52b2tlZCB1bmRlciBMYW5ndWFnZU1vZGVsRkYgaW5zdGVhZCBvZiBLZW5MTUZGLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBmbG9hdCBzZW50ZW5jZUxvZ1Byb2JhYmlsaXR5KGludFtdIHNlbnRlbmNlLCBpbnQgb3JkZXIsIGludCBzdGFydEluZGV4KSB7CisgICAgcmV0dXJuIHByb2JTdHJpbmcoc2VudGVuY2UsIHN0YXJ0SW5kZXgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBmbG9hdCBuZ3JhbUxvZ1Byb2JhYmlsaXR5KGludFtdIG5ncmFtLCBpbnQgb3JkZXIpIHsKKyAgICBpZiAob3JkZXIgIT0gTiAmJiBvcmRlciAhPSBuZ3JhbS5sZW5ndGgpCisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTG93ZXIgb3JkZXIgbm90IHN1cHBvcnRlZC4iKTsKKyAgICByZXR1cm4gcHJvYihuZ3JhbSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZsb2F0IG5ncmFtTG9nUHJvYmFiaWxpdHkoaW50W10gbmdyYW0pIHsKKyAgICByZXR1cm4gcHJvYihuZ3JhbSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9MYW5ndWFnZU1vZGVsRkYuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9MYW5ndWFnZU1vZGVsRkYuamF2YQppbmRleCBjYjAxMzY3Li43NWVlZGVmIDEwMDY0NAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0vTGFuZ3VhZ2VNb2RlbEZGLmphdmEKKysrIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL0xhbmd1YWdlTW9kZWxGRi5qYXZhCkBAIC0xLDkgKzEsNSBAQAogcGFja2FnZSBqb3NodWEuZGVjb2Rlci5mZi5sbTsKIAotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtMTgsNyArMTQsNyBAQAogaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLkZlYXR1cmVWZWN0b3I7CiBpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYuU3RhdGVmdWxGRjsKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi5sbS5iZXJrZWxleV9sbS5MTUdyYW1tYXJCZXJrZWxleTsKLWltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi5sbS5rZW5sbS5qbmkuS2VuTE07CitpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYubG0uS2VuTE07CiBpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYuc3RhdGVfbWFpbnRlbmFuY2UuRFBTdGF0ZTsKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi5zdGF0ZV9tYWludGVuYW5jZS5OZ3JhbURQU3RhdGU7CiBpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYudG0uUnVsZTsKQEAgLTY1LDcgKzYxLDcgQEAKICAgICovCiAgIHByb3RlY3RlZCBmaW5hbCBpbnQgbmdyYW1PcmRlcjsKIAotICAvKioKKyAgLyoKICAgICogV2UgY2FjaGUgdGhlIHdlaWdodCBvZiB0aGUgZmVhdHVyZSBzaW5jZSB0aGVyZSBpcyBvbmx5IG9uZS4KICAgICovCiAgIHByb3RlY3RlZCBmbG9hdCB3ZWlnaHQ7CkBAIC0xMDIsMTUgKzk4LDE2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWQoU3RyaW5nIGZpbGVfbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAotICAgICAgRmlsZSBjbGFzc19maWxlID0gbmV3IEZpbGUoZmlsZV9uYW1lKTsKLSAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGNsYXNzX2ZpbGUpKTsKLSAgICAgIFN0cmluZyBsaW5lOwotCi0gICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICBpbnQgbGluZW5vID0gMDsKKyAgICAgIGZvciAoU3RyaW5nIGxpbmU6IG5ldyBqb3NodWEudXRpbC5pby5MaW5lUmVhZGVyKGZpbGVfbmFtZSwgZmFsc2UpKSB7CisgICAgICAgIGxpbmVubysrOwogICAgICAgICBTdHJpbmdbXSBsaW5lQ29tcCA9IGxpbmUudHJpbSgpLnNwbGl0KCJcXHMrIik7Ci0gICAgICAgIHRoaXMuY2xhc3NNYXAucHV0KFZvY2FidWxhcnkuaWQobGluZUNvbXBbMF0pLCBJbnRlZ2VyLnBhcnNlSW50KGxpbmVDb21wWzFdKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdGhpcy5jbGFzc01hcC5wdXQoVm9jYWJ1bGFyeS5pZChsaW5lQ29tcFswXSksIEludGVnZXIucGFyc2VJbnQobGluZUNvbXBbMV0pKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKFN0cmluZy5mb3JtYXQoIiogV0FSTklORzogYmFkIHZvY2FiIGxpbmUgIyVkICclcyciLCBsaW5lbm8sIGxpbmUpKTsKKyAgICAgICAgfQogICAgICAgfQotICAgICAgYnIuY2xvc2UoKTsKICAgICB9CiAKICAgfQpAQCAtMTIxLDYgKzExOCw3IEBACiAgICAgdGhpcy50eXBlID0gcGFyc2VkQXJncy5nZXQoImxtX3R5cGUiKTsKICAgICB0aGlzLm5ncmFtT3JkZXIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZEFyZ3MuZ2V0KCJsbV9vcmRlciIpKTsgCiAgICAgdGhpcy5wYXRoID0gcGFyc2VkQXJncy5nZXQoImxtX2ZpbGUiKTsKKyAgICAKICAgICBpZiAocGFyc2VkQXJncy5jb250YWluc0tleSgiY2xhc3NfbWFwIikpCiAgICAgICB0cnkgewogICAgICAgICB0aGlzLmlzQ2xhc3NMTSA9IHRydWU7CkBAIC0xMzAsMTAgKzEyOCwyMCBAQAogICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgfQogCi0gICAgdGhpcy53ZWlnaHQgPSB3ZWlnaHRzLmdldChuYW1lKTsKKyAgICAvLyBUaGUgZGVuc2UgZmVhdHVyZSBpbml0aWFsaXphdGlvbiBoYXNuJ3QgaGFwcGVuZWQgeWV0LCBzbyB3ZSBoYXZlIHRvIHJldHJpZXZlIHRoaXMgYXMgc3BhcnNlCisgICAgdGhpcy53ZWlnaHQgPSB3ZWlnaHRzLmdldFNwYXJzZShuYW1lKTsKICAgICAKICAgICBpbml0aWFsaXplTE0oKTsKICAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBBcnJheUxpc3Q8U3RyaW5nPiByZXBvcnREZW5zZUZlYXR1cmVzKGludCBpbmRleCkgeworICAgIGRlbnNlRmVhdHVyZUluZGV4ID0gaW5kZXg7CisgICAgCisgICAgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBuYW1lcy5hZGQobmFtZSk7CisgICAgcmV0dXJuIG5hbWVzOworICB9CiAKICAgLyoqCiAgICAqIEluaXRpYWxpemVzIHRoZSB1bmRlcmx5aW5nIGxhbmd1YWdlIG1vZGVsLgpAQCAtNDA2LDcgKzQxNCw4IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgYWNjLmFkZChuYW1lLCB0cmFuc2l0aW9uTG9nUCk7CisvLyAgICBhY2MuYWRkKG5hbWUsIHRyYW5zaXRpb25Mb2dQKTsKKyAgICBhY2MuYWRkKGRlbnNlRmVhdHVyZUluZGV4LCB0cmFuc2l0aW9uTG9nUCk7CiAKICAgICBpZiAobGVmdF9jb250ZXh0ICE9IG51bGwpIHsKICAgICAgIHJldHVybiBuZXcgTmdyYW1EUFN0YXRlKGxlZnRfY29udGV4dCwgQXJyYXlzLmNvcHlPZlJhbmdlKGN1cnJlbnQsIGNjb3VudCAtIHRoaXMubmdyYW1PcmRlcgpAQCAtNDQ4LDcgKzQ1Nyw4IEBACiAgICAgfQogCiAgICAgLy8gVGVsbCB0aGUgYWNjdW11bGF0b3IKLSAgICBhY2MuYWRkKG5hbWUsIHJlcyk7CisvLyAgICBhY2MuYWRkKG5hbWUsIHJlcyk7CisgICAgYWNjLmFkZChkZW5zZUZlYXR1cmVJbmRleCwgcmVzKTsKIAogICAgIC8vIFN0YXRlIGlzIHRoZSBzYW1lCiAgICAgcmV0dXJuIG5ldyBOZ3JhbURQU3RhdGUobGVmdENvbnRleHQsIHJpZ2h0Q29udGV4dCk7CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0vU3RhdGVNaW5pbWl6aW5nTGFuZ3VhZ2VNb2RlbC5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL1N0YXRlTWluaW1pemluZ0xhbmd1YWdlTW9kZWwuamF2YQppbmRleCBiMGQ5NDRjLi5lNmEzNDBlIDEwMDY0NAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0vU3RhdGVNaW5pbWl6aW5nTGFuZ3VhZ2VNb2RlbC5qYXZhCisrKyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9TdGF0ZU1pbmltaXppbmdMYW5ndWFnZU1vZGVsLmphdmEKQEAgLTEsNSArMSw2IEBACiBwYWNrYWdlIGpvc2h1YS5kZWNvZGVyLmZmLmxtOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIApAQCAtNyw4ICs4LDggQEAKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5Kb3NodWFDb25maWd1cmF0aW9uOwogaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmNoYXJ0X3BhcnNlci5Tb3VyY2VQYXRoOwogaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLkZlYXR1cmVWZWN0b3I7Ci1pbXBvcnQgam9zaHVhLmRlY29kZXIuZmYubG0ua2VubG0uam5pLktlbkxNOwotaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLmxtLmtlbmxtLmpuaS5LZW5MTS5TdGF0ZVByb2JQYWlyOworaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLmxtLktlbkxNOworaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLmxtLktlbkxNLlN0YXRlUHJvYlBhaXI7CiBpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYuc3RhdGVfbWFpbnRlbmFuY2UuRFBTdGF0ZTsKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi5zdGF0ZV9tYWludGVuYW5jZS5LZW5MTVN0YXRlOwogaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLnRtLlJ1bGU7CkBAIC0zNSw2ICszNiwxNSBAQAogICAgICAgU3lzdGVtLmV4aXQoLTEpOwogICAgIH0KICAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBBcnJheUxpc3Q8U3RyaW5nPiByZXBvcnREZW5zZUZlYXR1cmVzKGludCBpbmRleCkgeworICAgIGRlbnNlRmVhdHVyZUluZGV4ID0gaW5kZXg7CisgICAgCisgICAgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBuYW1lcy5hZGQobmFtZSk7CisgICAgcmV0dXJuIG5hbWVzOworICB9CiAKICAgLyoqCiAgICAqIEluaXRpYWxpemVzIHRoZSB1bmRlcmx5aW5nIGxhbmd1YWdlIG1vZGVsLgpAQCAtMTI1LDcgKzEzNSw4IEBACiAgICAgU3RhdGVQcm9iUGFpciBwYWlyID0gKChLZW5MTSkgbGFuZ3VhZ2VNb2RlbCkucHJvYlJ1bGUod29yZHMsIHBvb2xNYXAuZ2V0KHNlbnRJRCkpOwogCiAgICAgLy8gUmVjb3JkIHRoZSBwcm9iCi0gICAgYWNjLmFkZChuYW1lLCBwYWlyLnByb2IpOworLy8gICAgYWNjLmFkZChuYW1lLCBwYWlyLnByb2IpOworICAgIGFjYy5hZGQoZGVuc2VGZWF0dXJlSW5kZXgsIHBhaXIucHJvYik7CiAKICAgICAvLyBSZXR1cm4gdGhlIHN0YXRlCiAgICAgcmV0dXJuIHBhaXIuc3RhdGU7CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0vYmVya2VsZXlfbG0vTE1HcmFtbWFyQmVya2VsZXkuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9iZXJrZWxleV9sbS9MTUdyYW1tYXJCZXJrZWxleS5qYXZhCmluZGV4IDFmZDA2YWEuLjZjOWJhZTQgMTAwNjQ0Ci0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9iZXJrZWxleV9sbS9MTUdyYW1tYXJCZXJrZWxleS5qYXZhCisrKyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9iZXJrZWxleV9sbS9MTUdyYW1tYXJCZXJrZWxleS5qYXZhCkBAIC0yMyw4ICsyMyw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBMTUdyYW1tYXJCZXJrZWxleSBleHRlbmRzIERlZmF1bHROR3JhbUxhbmd1YWdlTW9kZWwgewogCi0KLQogICBwcml2YXRlIEFycmF5RW5jb2RlZE5ncmFtTGFuZ3VhZ2VNb2RlbDxTdHJpbmc+IGxtOwogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKExNR3JhbW1hckJlcmtlbGV5LmNsYXNzLmdldE5hbWUoKSk7CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vTElDRU5TRSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTI1NTZlLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotTW9zdCBvZiB0aGUgY29kZSBoZXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBMR1BMLiAgVGhlcmUgYXJlIGV4Y2VwdGlvbnMgdGhhdAotaGF2ZSB0aGVpciBvd24gbGljZW5zZXMsIGxpc3RlZCBiZWxvdy4gIFNlZSBjb21tZW50cyBpbiB0aG9zZSBmaWxlcyBmb3IgbW9yZQotZGV0YWlscy4gIAotCi11dGlsL211cm11cl9oYXNoLmNjCi11dGlsL3N0cmluZ19waWVjZS5oaCBhbmQgdXRpbC9zdHJpbmdfcGllY2UuY2MKLXV0aWwvZG91YmxlLWNvbnZlcnNpb24vTElDRU5TRSBjb3ZlcnMgdXRpbC9kb3VibGUtY29udmVyc2lvbiBleGNlcHQgSmFtZmlsZQotdXRpbC9maWxlLmNjIGNvbnRhaW5zIGEgbW9kaWZpZWQgaW1wbGVtZW50YXRpb24gb2YgbWtzdGVtcCB1bmRlciB0aGUgTEdQTAotamFtLWZpbGVzL0xJQ0VOU0VfMV8wLnR4dCBjb3ZlcnMgamFtLWZpbGVzIGV4Y2VwdCBKYW1yb290Ci0KLUZvciB0aGUgcmVzdDoKLQotICAgIEtlbkxNIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBLZW5MTSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCBBdmVudWUgY29kZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9NYWtlZmlsZSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjMzhjMy4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1hbGw6IGJ1aWxkX2JpbmFyeSBuZ3JhbV9xdWVyeSBpbnN0YWxsCi0KLUNDID0gZysrCi0KLSMgVGhlIG1heCBvcmRlciBmb3IgdGhlIExNLCB0aGlzIHdhcyBpbmNyZWFzZWQgdG8gaW5jb3Jwb3JhdGUgQ2xhc3MgTE0gKDlncmFtcykKLU1BWF9PUkRFUiA9IDkKLQotIyBTZXQgdG8gdGhlIGxvY2F0aW9uIG9mIHlvdXIgYm9vc3QgbGlicmFyaWVzIChvbmx5IHNldCBpZiBub3QgaW4gdGhlIGVudmlyb25tZW50KQotQk9PU1RfUk9PVCA/PSAvb3B0L2xvY2FsCi0KLSMgU2hvdWxkIGJlIHNldCB0byBibGFuayBvciAiLW10IiwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IGhhdmUgdGhlIGJvb3N0IG11bHRpdGhyZWFkZWQKLSMgbGlicmFyaWVzIGluc3RhbGxlZAotI0JPT1NUX01UID0gLW10Ci0KLUNPUkUgPSBsbS9iaGlrc2hhLm8gbG0vYmluYXJ5X2Zvcm1hdC5vIGxtL2NvbmZpZy5vIGxtL2xtX2V4Y2VwdGlvbi5vIGxtL21vZGVsLm8gbG0vcXVhbnRpemUubyBsbS9yZWFkX2FycGEubyBsbS9zZWFyY2hfaGFzaGVkLm8gbG0vc2VhcmNoX3RyaWUubyBsbS9zaXplcy5vIGxtL3RyaWUubyBsbS90cmllX3NvcnQubyBsbS92YWx1ZV9idWlsZC5vIGxtL3ZpcnR1YWxfaW50ZXJmYWNlLm8gbG0vdm9jYWIubyB1dGlsL2JpdF9wYWNraW5nLm8gdXRpbC9lcnNhdHpfcHJvZ3Jlc3MubyB1dGlsL2V4Y2VwdGlvbi5vIHV0aWwvZmlsZS5vIHV0aWwvZmlsZV9waWVjZS5vIHV0aWwvbW1hcC5vIHV0aWwvbXVybXVyX2hhc2gubyB1dGlsL3Bvb2wubyB1dGlsL3JlYWRfY29tcHJlc3NlZC5vIHV0aWwvc2NvcGVkLm8gdXRpbC91c2FnZS5vIHV0aWwvZG91YmxlLWNvbnZlcnNpb24vYmlnbnVtLm8gdXRpbC9kb3VibGUtY29udmVyc2lvbi9iaWdudW0tZHRvYS5vIHV0aWwvZG91YmxlLWNvbnZlcnNpb24vY2FjaGVkLXBvd2Vycy5vIHV0aWwvZG91YmxlLWNvbnZlcnNpb24vZGl5LWZwLm8gdXRpbC9kb3VibGUtY29udmVyc2lvbi9kb3VibGUtY29udmVyc2lvbi5vIHV0aWwvZG91YmxlLWNvbnZlcnNpb24vZmFzdC1kdG9hLm8gdXRpbC9kb3VibGUtY29udmVyc2lvbi9maXhlZC1kdG9hLm8gdXRpbC9kb3VibGUtY29udmVyc2lvbi9zdHJ0b2QubyB1dGlsL3BhcmFsbGVsX3JlYWQubwotCi1IRUFERVJTPSBsbS9iaGlrc2hhLmhoIGxtL2JpbmFyeV9mb3JtYXQuaGggbG0vYmxhbmsuaGggbG0vYnVpbGRlci9hZGp1c3RfY291bnRzLmhoIGxtL2J1aWxkZXIvY29ycHVzX2NvdW50LmhoIGxtL2J1aWxkZXIvZGlzY291bnQuaGggbG0vYnVpbGRlci9oZWFkZXJfaW5mby5oaCBsbS9idWlsZGVyL2luaXRpYWxfcHJvYmFiaWxpdGllcy5oaCBsbS9idWlsZGVyL2ludGVycG9sYXRlLmhoIGxtL2J1aWxkZXIvam9pbnRfb3JkZXIuaGggbG0vYnVpbGRlci9tdWx0aV9zdHJlYW0uaGggbG0vYnVpbGRlci9uZ3JhbS5oaCBsbS9idWlsZGVyL25ncmFtX3N0cmVhbS5oaCBsbS9idWlsZGVyL3BpcGVsaW5lLmhoIGxtL2J1aWxkZXIvcHJpbnQuaGggbG0vYnVpbGRlci9zb3J0LmhoIGxtL2NvbmZpZy5oaCBsbS9lbnVtZXJhdGVfdm9jYWIuaGggbG0vZmFjYWRlLmhoIGxtL2xlZnQuaGggbG0vbG1fZXhjZXB0aW9uLmhoIGxtL21heF9vcmRlci5oaCBsbS9tb2RlbC5oaCBsbS9tb2RlbF90eXBlLmhoIGxtL25ncmFtX3F1ZXJ5LmhoIGxtL3BhcnRpYWwuaGggbG0vcXVhbnRpemUuaGggbG0vcmVhZF9hcnBhLmhoIGxtL3JldHVybi5oaCBsbS9zZWFyY2hfaGFzaGVkLmhoIGxtL3NlYXJjaF90cmllLmhoIGxtL3NpemVzLmhoIGxtL3N0YXRlLmhoIGxtL3RyaWUuaGggbG0vdHJpZV9zb3J0LmhoIGxtL3ZhbHVlX2J1aWxkLmhoIGxtL3ZhbHVlLmhoIGxtL3ZpcnR1YWxfaW50ZXJmYWNlLmhoIGxtL3ZvY2FiLmhoIGxtL3dlaWdodHMuaGggbG0vd29yZF9pbmRleC5oaCB1dGlsL2JpdF9wYWNraW5nLmhoIHV0aWwvZXJzYXR6X3Byb2dyZXNzLmhoIHV0aWwvZXhjZXB0aW9uLmhoIHV0aWwvZmFrZV9vZnN0cmVhbS5oaCB1dGlsL2ZpbGUuaGggdXRpbC9maWxlX3BpZWNlLmhoIHV0aWwvZ2V0b3B0LmhoIHV0aWwvaGF2ZS5oaCB1dGlsL2pvaW50X3NvcnQuaGggdXRpbC9tbWFwLmhoIHV0aWwvbXVsdGlfaW50ZXJzZWN0aW9uLmhoIHV0aWwvbXVybXVyX2hhc2guaGggdXRpbC9wY3F1ZXVlLmhoIHV0aWwvcG9vbC5oaCB1dGlsL3Byb2JpbmdfaGFzaF90YWJsZS5oaCB1dGlsL3Byb3h5X2l0ZXJhdG9yLmhoIHV0aWwvcmVhZF9jb21wcmVzc2VkLmhoIHV0aWwvc2NvcGVkLmhoIHV0aWwvc2l6ZWRfaXRlcmF0b3IuaGggdXRpbC9zb3J0ZWRfdW5pZm9ybS5oaCB1dGlsL3N0cmVhbS9ibG9jay5oaCB1dGlsL3N0cmVhbS9jaGFpbi5oaCB1dGlsL3N0cmVhbS9jb25maWcuaGggdXRpbC9zdHJlYW0vaW8uaGggdXRpbC9zdHJlYW0vbGluZV9pbnB1dC5oaCB1dGlsL3N0cmVhbS9tdWx0aV9wcm9ncmVzcy5oaCB1dGlsL3N0cmVhbS9zb3J0LmhoIHV0aWwvc3RyZWFtL3N0cmVhbS5oaCB1dGlsL3N0cmVhbS90aW1lci5oaCB1dGlsL3N0cmluZ19waWVjZV9oYXNoLmhoIHV0aWwvc3RyaW5nX3BpZWNlLmhoIHV0aWwvdGhyZWFkX3Bvb2wuaGggdXRpbC90b2tlbml6ZV9waWVjZS5oaCB1dGlsL3VzYWdlLmhoIHV0aWwvcGFyYWxsZWxfcmVhZC5oaAotCi1DUFBGTEFHUyA9ICQoQ1hYRkxBR1MpIC1JLiAtSSQoQk9PU1RfUk9PVCkvaW5jbHVkZSAtTzMgLURLRU5MTV9NQVhfT1JERVI9JChNQVhfT1JERVIpIC1ESEFWRV9aTElCIC1ETkRFQlVHCi0KLS5jYy5vOiAkKEhFQURFUlMpCi0JJChDQykgLWMgJChDUFBGTEFHUykgLWZQSUMgLW8gJEAgJDwKLQotaWZlcSAoJChzaGVsbCB1bmFtZSAtcyksTGludXgpCi1SVD0tbHJ0Ci1lbmRpZgotCi0jcXVlcnktcmVsYXRlZCBleGVjdXRhYmxlcwotRVhFUz1idWlsZF9iaW5hcnkgbmdyYW1fcXVlcnkKLWJ1aWxkX2JpbmFyeTogJChDT1JFKSAkKEhFQURFUlMpIGxtL2J1aWxkX2JpbmFyeV9tYWluLmNjCi0JJChDQykgJChDUFBGTEFHUykgJChDT1JFKSBsbS9idWlsZF9iaW5hcnlfbWFpbi5jYyAtbyBidWlsZF9iaW5hcnkgLWx6ICQoUlQpCi1uZ3JhbV9xdWVyeTogJChDT1JFKSAkKEhFQURFUlMpIGxtL3F1ZXJ5X21haW4uY2MKLQkkKENDKSAkKENQUEZMQUdTKSAkKENPUkUpIGxtL3F1ZXJ5X21haW4uY2MgLW8gbmdyYW1fcXVlcnkgLWx6ICQoUlQpCi0KLUlOU1RBTEw9YnVpbGRfYmluYXJ5IG5ncmFtX3F1ZXJ5Ci0KLSNsbXBsegotU0hFTEw9YmFzaAotaWZlcSAoLCQod2lsZGNhcmQgJChCT09TVF9ST09UKS9saWIvbGliYm9vc3RfdGhyZWFkLmEpKQotICAkKGVycm9yIEJPT1NUX1JPT1QgKCQoQk9PU1RfUk9PVCkpIGRvZXMgbm90IHBvaW50IHRvIGEgQm9vc3QgaW5zdGFsbGF0aW9uLCBxdWl0dGluZy4uLikKLWVuZGlmCi1pZmVxICgkKHNoZWxsICQoQ0MpIC1MJChCT09TVF9ST09UKS9saWIgLWxib29zdF9wcm9ncmFtX29wdGlvbnMkKEJPT1NUX01UKSAtbGJvb3N0X3RocmVhZCQoQk9PU1RfTVQpIC14IGMrKyAtIDw8PCdpbnQgbWFpbigpIHt9JyAtbyBkdW1teSAmJiBybSBkdW1teSAmJiBlY2hvIEJvb3N0KSxCb29zdCkKLSAgJChpbmZvIERldGVjdGVkIEJvb3N0KQotTE1QTFo9bG0vYnVpbGRlci9hZGp1c3RfY291bnRzLm8gbG0vYnVpbGRlci9jb3JwdXNfY291bnQubyBsbS9idWlsZGVyL2luaXRpYWxfcHJvYmFiaWxpdGllcy5vIGxtL2J1aWxkZXIvaW50ZXJwb2xhdGUubyBsbS9idWlsZGVyL2xtcGx6X21haW4ubyBsbS9idWlsZGVyL3BpcGVsaW5lLm8gbG0vYnVpbGRlci9wcmludC5vIGxtL2J1aWxkZXIvb3V0cHV0Lm8gdXRpbC9zdHJlYW0vY2hhaW4ubyB1dGlsL3N0cmVhbS9pby5vIHV0aWwvc3RyZWFtL2xpbmVfaW5wdXQubyB1dGlsL3N0cmVhbS9tdWx0aV9wcm9ncmVzcy5vCi1sbXBsejogJChDT1JFKSAkKEhFQURFUlMpICQoTE1QTFopCi0JJChDQykgJChDUFBGTEFHUykgJChDT1JFKSAkKExNUExaKSAtbyBsbXBseiAtbHogLUwkKEJPT1NUX1JPT1QpL2xpYiAtbGJvb3N0X3Byb2dyYW1fb3B0aW9ucyQoQk9PU1RfTVQpIC1sYm9vc3RfdGhyZWFkJChCT09TVF9NVCkgLWxib29zdF9zeXN0ZW0kKEJPT1NUX01UKSAkKFJUKSAtcHRocmVhZAotRVhFUys9bG1wbHogCi1lbHNlCi0gIGVjaG8gImxtcGx6ICh1c2VkIGZvciBidWlsZGluZyBsYW5ndWFnZSBtb2RlbHMpIGZhaWxlZCB0byBidWlsZC4gSXMgQm9vc3QgaW5zdGFsbGVkPyIKLSAgZWNobyAiSWYgeWVzLCBtYXliZSB5b3UgaGF2ZSB0aGUgbXVsdGl0aHJlYWRlZCB2ZXJzaW9ucyBpbnN0YWxsZWQuIEVkaXQiCi0gIGVjaG8gIlwkSk9TSFVBL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9NYWtlZmlsZSBhbmQgdW5jb21tZW50IHRoZSBCT09TVF9NVCBsaW5lLCIKLSAgZWNobyAidGhlbiByZXJ1biAnYW50IGtlbmxtJyIKLWVuZGlmCi0KLSNqbmkgb2JqZWN0Ci1pZmVxICgkKHNoZWxsIHVuYW1lIC1zKSxEYXJ3aW4pCi1saWJrZW4uZHlsaWI6ICQoQ09SRSkgJChIRUFERVJTKSBqbmkvd3JhcC5jYwotCSQoQ0MpIC1JIC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzIC1ETk9fSUNVICQoQ1BQRkxBR1MpIGpuaS93cmFwLmNjIC1JL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9Ib21lL2luY2x1ZGUgLUkvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9KYXZhVk0uZnJhbWV3b3JrL0hvbWUvaW5jbHVkZS9saW51eCAkKENPUkUpIC1mcGljIC1keW5hbWljbGliIC1XbCwtaGVhZGVycGFkX21heF9pbnN0YWxsX25hbWVzLC11bmRlZmluZWQsZHluYW1pY19sb29rdXAgLW8gbGlia2VuLmR5bGliIC1seiAtV25vLWRlcHJlY2F0ZWQgLXB0aHJlYWQKLQotaW5zdGFsbDogbGlia2VuLmR5bGliICQoRVhFUykKLQljcCAtZiBsaWJrZW4uZHlsaWIgJChKT1NIVUEpL2xpYi8KLQljcCAtZiAkKEVYRVMpICQoSk9TSFVBKS9iaW4vCi1lbHNlCi1saWJrZW4uc286ICQoQ09SRSkgJChIRUFERVJTKSBqbmkvd3JhcC5jYwotCSQoQ0MpIC1JLiAtRE5PX0lDVSAkKENQUEZMQUdTKSBqbmkvd3JhcC5jYyAtSSQoSkFWQV9IT01FKS9pbmNsdWRlIC1JJChKQVZBX0hPTUUpL2luY2x1ZGUvbGludXggJChDT1JFKSAtZnBpYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYmtlbi5zbyAtbyBsaWJrZW4uc28gLWx6IC1Xbm8tZGVwcmVjYXRlZCAtcHRocmVhZCAkKFJUKQotCi1pbnN0YWxsOiBsaWJrZW4uc28gJChFWEVTKQotCWNwIC1mIGxpYmtlbi5zbyAkKEpPU0hVQSkvbGliL2xpYmtlbi5zbwotCWNwIC1mICQoRVhFUykgJChKT1NIVUEpL2Jpbi8KLWVuZGlmCi0KLS5QSE9OWTogY2xlYW4KLQotY2xlYW46Ci0JZmluZCAuIC1uYW1lICcqLm8nIC1leGVjIHJtIC1mIHt9IFw7Ci0Jcm0gLWYgbGlia2VuLmR5bGliICQoRVhFUykKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9SRUFETUUubWQgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2FjZWJjLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0jIEtlbkxNCi0KLUxhbmd1YWdlIG1vZGVsIGluZmVyZW5jZSBjb2RlIGJ5IEtlbm5ldGggSGVhZmllbGQgKGtlbmxtIGF0IGtoZWFmaWVsZC5jb20pCi0KLUkgZG8gZGV2ZWxvcG1lbnQgaW4gbWFzdGVyIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9rcHUva2VubG0vLiAgTm9ybWFsbHksIGl0IHdvcmtzLCBidXQgSSBkbyBub3QgZ3VhcmFudGVlIGl0IHdpbGwgY29tcGlsZSwgZ2l2ZSBjb3JyZWN0IGFuc3dlcnMsIG9yIGdlbmVyYXRlIG5vbi1icm9rZW4gYmluYXJ5IGZpbGVzLiAgRm9yIGEgbW9yZSBzdGFibGUgcmVsZWFzZSwgZ2V0IGh0dHA6Ly9raGVhZmllbGQuY29tL2NvZGUva2VubG0udGFyLmd6IC4gIAotCi1UaGUgd2Vic2l0ZSBodHRwOi8va2hlYWZpZWxkLmNvbS9jb2RlL2tlbmxtLyBoYXMgbW9yZSBkb2N1bWVudGF0aW9uLiAgSWYgeW91J3JlIGEgZGVjb2RlciBkZXZlbG9wZXIsIHBsZWFzZSBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSB0aGVyZSBpbnN0ZWFkIG9mIGNvcHlpbmcgZnJvbSBhbm90aGVyIGRlY29kZXIuICAKLQotIyMgQ29tcGlsaW5nCi1TZWUgQlVJTERJTkcuIAotCi0jIyBFc3RpbWF0aW9uCi1sbXBseiBlc3RpbWF0ZXMgdW5wcnVuZWQgbGFuZ3VhZ2UgbW9kZWxzIHdpdGggbW9kaWZpZWQgS25lc2VyLU5leSBzbW9vdGhpbmcuICBBZnRlciBjb21waWxpbmcgd2l0aCBiamFtLCBydW4KLWBgYGJhc2gKLWJpbi9sbXBseiAtbyA1IDx0ZXh0ID50ZXh0LmFycGEKLWBgYAotVGhlIGFsZ29yaXRobSBpcyBvbi1kaXNrLCB1c2luZyBhbiBhbW91bnQgb2YgbWVtb3J5IHRoYXQgeW91IHNwZWNpZnkuICBTZWUgaHR0cDovL2toZWFmaWVsZC5jb20vY29kZS9rZW5sbS9lc3RpbWF0aW9uLyBmb3IgbW9yZS4gIAotCi1NVCBNYXJhdGhvbiAyMDEyIHRlYW0gbWVtYmVycyBJdmFuIFBvdXp5cmV2c2t5IGFuZCBNb2hhbW1lZCBNZWRpYW5pIGNvbnRyaWJ1dGVkIHRvIHRoZSBjb21wdXRhdGlvbiBkZXNpZ24gYW5kIGVhcmx5IGltcGxlbWVudGF0aW9uLiBKb24gQ2xhcmsgY29udHJpYnV0ZWQgdG8gdGhlIGRlc2lnbiwgY2xhcmlmaWVkIHBvaW50cyBhYm91dCBzbW9vdGhpbmcsIGFuZCBhZGRlZCBsb2dnaW5nLiAKLQotIyMgRmlsdGVyaW5nCi0KLWZpbHRlciB0YWtlcyBhbiBBUlBBIG9yIGNvdW50IGZpbGUgYW5kIHJlbW92ZXMgZW50cmllcyB0aGF0IHdpbGwgbmV2ZXIgYmUgcXVlcmllZC4gIFRoZSBmaWx0ZXIgY3JpdGVyaW9uIGNhbiBiZSBjb3JwdXMtbGV2ZWwgdm9jYWJ1bGFyeSwgc2VudGVuY2UtbGV2ZWwgdm9jYWJ1bGFyeSwgb3Igc2VudGVuY2UtbGV2ZWwgcGhyYXNlcy4gIFJ1bgotYGBgYmFzaAotYmluL2ZpbHRlcgotYGBgCi1hbmQgc2VlIGh0dHA6Ly9raGVhZmllbGQuY29tL2NvZGUva2VubG0vZmlsdGVyLyBmb3IgbW9yZSBkb2N1bWVudGF0aW9uLgotCi0jIyBRdWVyeWluZwotCi1Ud28gZGF0YSBzdHJ1Y3R1cmVzIGFyZSBzdXBwb3J0ZWQ6IHByb2JpbmcgYW5kIHRyaWUuICBQcm9iaW5nIGlzIGEgcHJvYmluZyBoYXNoIHRhYmxlIHdpdGgga2V5cyB0aGF0IGFyZSA2NC1iaXQgaGFzaGVzIG9mIG4tZ3JhbXMgYW5kIGZsb2F0cyBhcyB2YWx1ZXMuICBUcmllIGlzIGEgZmFpcmx5IHN0YW5kYXJkIHRyaWUgYnV0IHdpdGggYml0LWxldmVsIHBhY2tpbmcgc28gaXQgdXNlcyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyB0byBzdG9yZSB3b3JkIGluZGljZXMgYW5kIHBvaW50ZXJzLiAgVGhlIHRyaWUgbm9kZSBlbnRyaWVzIGFyZSBzb3J0ZWQgYnkgd29yZCBpbmRleC4gIFByb2JpbmcgaXMgdGhlIGZhc3Rlc3QgYW5kIHVzZXMgdGhlIG1vc3QgbWVtb3J5LiAgVHJpZSB1c2VzIHRoZSBsZWFzdCBtZW1vcnkgYW5kIGEgYml0IHNsb3dlci4gIAotCi1XaXRoIHRyaWUsIHJlc2lkZW50IG1lbW9yeSBpcyA1OCUgb2YgSVJTVCdzIHNtYWxsZXN0IHZlcnNpb24gYW5kIDIxJSBvZiBTUkkncyBjb21wYWN0IHZlcnNpb24uICBTaW11bHRhbmVvdXNseSwgdHJpZSBDUFUncyB1c2UgaXMgODElIG9mIElSU1QncyBmYXN0ZXN0IHZlcnNpb24gYW5kIDg0JSBvZiBTUkkncyBmYXN0IHZlcnNpb24uICBLZW5MTSdzIHByb2JpbmcgaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbiBnb2VzIGV2ZW4gZmFzdGVyIGF0IHRoZSBleHBlbnNlIG9mIHVzaW5nIG1vcmUgbWVtb3J5LiAgU2VlIGh0dHA6Ly9raGVhZmllbGQuY29tL2NvZGUva2VubG0vYmVuY2htYXJrLy4gIAotCi1CaW5hcnkgZm9ybWF0IHZpYSBtbWFwIGlzIHN1cHBvcnRlZC4gIFJ1biBgLi9idWlsZF9iaW5hcnlgIHRvIG1ha2Ugb25lIHRoZW4gcGFzcyB0aGUgYmluYXJ5IGZpbGUgbmFtZSB0byB0aGUgYXBwcm9wcmlhdGUgTW9kZWwgY29uc3RydWN0b3IuICAgCi0KLSMjIFBsYXRmb3JtcwotYG11cm11cl9oYXNoLmNjYCBhbmQgYGJpdF9wYWNraW5nLmhoYCBwZXJmb3JtIHVuYWxpZ25lZCByZWFkcyBhbmQgd3JpdGVzIHRoYXQgbWFrZSB0aGUgY29kZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50LiAgCi1JdCBoYXMgYmVlbiBzdWNlc3NmdWxseSB0ZXN0ZWQgb24geDg2XF82NCwgeDg2LCBhbmQgUFBDNjQuICAKLUFSTSBzdXBwb3J0IGlzIHJlcG9ydGVkbHkgd29ya2luZywgYXQgbGVhc3Qgb24gdGhlIGlwaG9uZS4gICAKLQotUnVucyBvbiBMaW51eCwgT1MgWCwgQ3lnd2luLCBhbmQgTWluR1cuICAKLQotSGlkZW8gT2t1bWEgYW5kIFRvbW95dWtpIFlvc2hpbXVyYSBmcm9tIE5JQ1QgY29udHJpYnV0ZWQgcG9ydHMgdG8gQVJNIGFuZCBNaW5HVy4gIAotCi0jIyBDb21waWxlLXRpbWUgY29uZmlndXJhdGlvbgotVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG1hY3JvcyB5b3UgY2FuIHNldCBvbiB0aGUgZysrIGNvbW1hbmQgbGluZSBvciBpbiB1dGlsL2hhdmUuaGggLiAgCi0KLSogYEtFTkxNX01BWF9PUkRFUmAgaXMgdGhlIG1heGltdW0gb3JkZXIgdGhhdCBjYW4gYmUgbG9hZGVkLiAgVGhpcyBpcyBkb25lIHRvIG1ha2Ugc3RhdGUgYW4gZWZmaWNpZW50IFBPRCByYXRoZXIgdGhhbiBhIHZlY3Rvci4gIAotKiBgSEFWRV9JQ1VgIElmIHlvdXIgY29kZSBsaW5rcyBhZ2FpbnN0IElDVSwgZGVmaW5lIHRoaXMgdG8gZGlzYWJsZSB0aGUgaW50ZXJuYWwgU3RyaW5nUGllY2UgYW5kIHJlcGxhY2UgaXQgd2l0aCBJQ1UncyBjb3B5IG9mIFN0cmluZ1BpZWNlLCBhdm9pZGluZyBuYW1pbmcgY29uZmxpY3RzLiAgCi0KLUFSUEEgZmlsZXMgY2FuIGJlIHJlYWQgaW4gY29tcHJlc3NlZCBmb3JtYXQgd2l0aCB0aGVzZSBvcHRpb25zOgotKiBgSEFWRV9aTElCYCBTdXBwb3J0cyBnemlwLiAgTGluayB3aXRoIC1sei4gIEkgaGF2ZSBlbmFibGVkIHRoaXMgYnkgZGVmYXVsdC4gIAotKiBgSEFWRV9CWkxJQmAgU3VwcG9ydHMgYnppcDIuICBMaW5rIHdpdGggLWxiejIuCi0qIGBIQVZFX1haTElCYCBTdXBwb3J0cyB4ei4gIExpbmsgd2l0aCAtbGx6bWEuCi0KLU5vdGUgdGhhdCB0aGVzZSBtYWNyb3MgaW1wYWN0IG9ubHkgYHJlYWRfY29tcHJlc3NlZC5jY2AgYW5kIGByZWFkX2NvbXByZXNzZWRfdGVzdC5jY2AuICBUaGUgYmphbSBidWlsZCBzeXN0ZW0gd2lsbCBhdXRvLWRldGVjdCBiemlwMiBhbmQgeHogc3VwcG9ydC4gIAotCi0jIyBEZWNvZGVyIGRldmVsb3BlcnMKLS0gSSByZWNvbW1lbmQgY29weWluZyB0aGUgY29kZSBhbmQgZGlzdHJpYnV0aW5nIGl0IHdpdGggeW91ciBkZWNvZGVyLiAgSG93ZXZlciwgcGxlYXNlIHNlbmQgaW1wcm92ZW1lbnRzIHVwc3RyZWFtLiAgCi0KLS0gT21pdCB0aGUgbG0vZmlsdGVyIGRpcmVjdG9yeSBpZiB5b3UgZG8gbm90IHdhbnQgdGhlIGxhbmd1YWdlIG1vZGVsIGZpbHRlci4gIE9ubHkgdGhhdCBhbmQgdGVzdHMgZGVwZW5kIG9uIEJvb3N0LiAgCi0KLS0gU2VsZWN0IHRoZSBtYWNyb3MgeW91IHdhbnQsIGxpc3RlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gIAotCi0tIFRoZXJlIGFyZSB0d28gYnVpbGQgc3lzdGVtczogY29tcGlsZS5zaCBhbmQgSmFtcm9vdCtKYW1maWxlLiAgVGhleSdyZSBwcmV0dHkgc2ltcGxlIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgcmVpbXBsZW1lbnRlZCBpbiB5b3VyIGJ1aWxkIHN5c3RlbS4gIAotCi0tIFVzZSBlaXRoZXIgdGhlIGludGVyZmFjZSBpbiBgbG0vbW9kZWwuaGhgIG9yIGBsbS92aXJ0dWFsX2ludGVyZmFjZS5oaGAuICBJbnRlcmZhY2UgZG9jdW1lbnRhdGlvbiBpcyBpbiBjb21tZW50cyBvZiBgbG0vdmlydHVhbF9pbnRlcmZhY2UuaGhgIGFuZCBgbG0vbW9kZWwuaGhgLiAgCi0KLS0gVGhlcmUgYXJlIHNldmVyYWwgcG9zc2libGUgZGF0YSBzdHJ1Y3R1cmVzIGluIGBtb2RlbC5oaGAuICBVc2UgYFJlY29nbml6ZUJpbmFyeWAgaW4gYGJpbmFyeV9mb3JtYXQuaGhgIHRvIGRldGVybWluZSB3aGljaCBvbmUgYSB1c2VyIGhhcyBwcm92aWRlZC4gIFlvdSBwcm9iYWJseSBhbHJlYWR5IGltcGxlbWVudCBmZWF0dXJlIGZ1bmN0aW9ucyBhcyBhbiBhYnN0cmFjdCB2aXJ0dWFsIGJhc2UgY2xhc3Mgd2l0aCBzZXZlcmFsIGNoaWxkcmVuLiAgSSBzdWdnZXN0IHlvdSBjby1vcHQgdGhpcyBleGlzdGluZyB2aXJ0dWFsIGRpc3BhdGNoIGJ5IHRlbXBsYXRpemluZyB0aGUgbGFuZ3VhZ2UgbW9kZWwgZmVhdHVyZSBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgS2VuTE0gbW9kZWwgaWRlbnRpZmllZCBieSBgUmVjb2duaXplQmluYXJ5YC4gIFRoaXMgaXMgdGhlIHN0cmF0ZWd5IHVzZWQgaW4gTW9zZXMgYW5kIGNkZWMuCi0KLS0gU2VlIGBsbS9jb25maWcuaGhgIGZvciBydW4tdGltZSB0dW5pbmcgb3B0aW9ucy4KLQotIyMgQ29udHJpYnV0b3JzCi1Db250cmlidXRpb25zIHRvIEtlbkxNIGFyZSB3ZWxjb21lLiAgUGxlYXNlIGJhc2UgeW91ciBjb250cmlidXRpb25zIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9rcHUva2VubG0gYW5kIHNlbmQgcHVsbCByZXF1ZXN0cyAob3IgSSBtaWdodCBnaXZlIHlvdSBjb21taXQgYWNjZXNzKS4gIERvd25zdHJlYW0gY29waWVzIGluIE1vc2VzIGFuZCBjZGVjIGFyZSBtYWludGFpbmVkIGJ5IG92ZXJ3cml0aW5nIHRoZW0gc28gZG8gbm90IG1ha2UgY2hhbmdlcyB0aGVyZS4gIAotCi0jIyBQeXRob24gbW9kdWxlCi1Db250cmlidXRlZCBieSBWaWN0b3IgQ2hhaHVuZWF1LgotCi0jIyMgSW5zdGFsbGF0aW9uCi0KLWBgYGJhc2gKLXBpcCBpbnN0YWxsIGh0dHBzOi8vZ2l0aHViLmNvbS9rcHUva2VubG0vYXJjaGl2ZS9tYXN0ZXIuemlwCi1gYGAKLQotIyMjIEJhc2ljIFVzYWdlCi1gYGBweXRob24KLWltcG9ydCBrZW5sbQotbW9kZWwgPSBrZW5sbS5MYW5ndWFnZU1vZGVsKCdsbS90ZXN0LmFycGEnKQotc2VudGVuY2UgPSAndGhpcyBpcyBhIHNlbnRlbmNlIC4nCi1wcmludChtb2RlbC5zY29yZShzZW50ZW5jZSkpCi1gYGAKLQotLS0tCi0KLVRoZSBuYW1lIHdhcyBIaWV1IEhvYW5nJ3MgaWRlYSwgbm90IG1pbmUuICAKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9qbmkvS2VuTE0uamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9qbmkvS2VuTE0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExMGFhOS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vam5pL0tlbkxNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotcGFja2FnZSBqb3NodWEuZGVjb2Rlci5mZi5sbS5rZW5sbS5qbmk7Ci0KLWltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi5sbS5OR3JhbUxhbmd1YWdlTW9kZWw7Ci1pbXBvcnQgam9zaHVhLmRlY29kZXIuZmYuc3RhdGVfbWFpbnRlbmFuY2UuS2VuTE1TdGF0ZTsKLQotLyoqCi0gKiBKTkkgd3JhcHBlciBmb3IgS2VuTE0uIFRoaXMgdmVyc2lvbiBvZiBLZW5MTSBzdXBwb3J0cyB0d28gdXNlIGNhc2VzLCBpbXBsZW1lbnRlZCBieSB0aGUgc2VwYXJhdGUKLSAqIGZlYXR1cmUgZnVuY3Rpb25zIEtlbkxNRkYgYW5kIExhbmd1YWdlTW9kZWxGRi4gS2VuTE1GRiB1c2VzIHRoZSBSdWxlU2NvcmUoKSBpbnRlcmZhY2UgaW4KLSAqIGxtL2xlZnQuaGgsIHJldHVybmluZyBhIHN0YXRlIHBvaW50ZXIgcmVwcmVzZW50aW5nIHRoZSBLZW5MTSBzdGF0ZSwgd2hpbGUgTGFuZ2F1Z2VNb2RlbEZGIGhhbmRsZXMKLSAqIHN0YXRlIGJ5IGl0c2VsZiBhbmQganVzdCBwYXNzZXMgaW4gdGhlIG5ncmFtcyBmb3Igc2NvcmluZy4KLSAqIAotICogQGF1dGhvciBLZW5uZXRoIEhlYWZpZWxkCi0gKiBAYXV0aG9yIE1hdHQgUG9zdCA8cG9zdEBjcy5qaHUuZWR1PgotICovCi0KLXB1YmxpYyBjbGFzcyBLZW5MTSBpbXBsZW1lbnRzIE5HcmFtTGFuZ3VhZ2VNb2RlbCwgQ29tcGFyYWJsZTxLZW5MTT4gewotCi0gIHN0YXRpYyB7Ci0gICAgdHJ5IHsKLSAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgia2VuIik7Ci0gICAgfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIqIEZBVEFMOiBDYW4ndCBmaW5kIGxpYmtlbi5zbyAobGlia2VuLmR5bGliIG9uIE9TIFgpIGluICRKT1NIVUEvbGliIik7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiogICAgICAgIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgS2VuTE0gbGlicmFyeSBkaWRuJ3QgY29tcGlsZS4iKTsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiKiAgICAgICAgTWFrZSBzdXJlIHRoYXQgQk9PU1RfUk9PVCBpcyBzZXQgdG8gdGhlIHJvb3Qgb2YgeW91ciBib29zdCIpOwotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIqICAgICAgICBpbnN0YWxsYXRpb24gKGl0J3Mgbm90IC9vcHQvbG9jYWwvLCB0aGUgZGVmYXVsdCksIGNoYW5nZSB0byIpOwotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIqICAgICAgICAkSk9TSFVBLCBhbmQgdHlwZSAnYW50IGtlbmxtJy4gSWYgcHJvYmxlbXMgcGVyc2lzdCwgc2VlIHRoZSIpOwotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIqICAgICAgICB3ZWJzaXRlIChqb3NodWEtZGVjb2Rlci5vcmcpLiIpOwotICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBsb25nIHBvaW50ZXI7Ci0KLSAgLy8gdGhpcyBpcyByZWFkIGZyb20gdGhlIGNvbmZpZyBmaWxlLCB1c2VkIHRvIHNldCBtYXhpbXVtIG9yZGVyCi0gIHByaXZhdGUgZmluYWwgaW50IG5ncmFtT3JkZXI7Ci0gIC8vIGluZmVycmVkIGZyb20gbW9kZWwgZmlsZSAobWF5IGJlIGxhcmdlciB0aGFuIG5ncmFtT3JkZXIpCi0gIHByaXZhdGUgZmluYWwgaW50IE47Ci0gIC8vIHdoZXRoZXIgbGVmdC1zdGF0ZSBtaW5pbWl6YXRpb24gd2FzIHJlcXVlc3RlZAotICBwcml2YXRlIGJvb2xlYW4gbWluaW1pemluZzsKLQotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBuYXRpdmUgbG9uZyBjb25zdHJ1Y3QoU3RyaW5nIGZpbGVfbmFtZSk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgZGVzdHJveShsb25nIHB0cik7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbmF0aXZlIGludCBvcmRlcihsb25nIHB0cik7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gcmVnaXN0ZXJXb3JkKGxvbmcgcHRyLCBTdHJpbmcgd29yZCwgaW50IGlkKTsKLQotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBuYXRpdmUgZmxvYXQgcHJvYihsb25nIHB0ciwgaW50IHdvcmRzW10pOwotCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIG5hdGl2ZSBTdGF0ZVByb2JQYWlyIHByb2JSdWxlKGxvbmcgcHRyLCBsb25nIHBvb2wsIGxvbmcgd29yZHNbXSk7Ci0gIAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBuYXRpdmUgZmxvYXQgZXN0aW1hdGVSdWxlKGxvbmcgcHRyLCBsb25nIHdvcmRzW10pOwotCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIG5hdGl2ZSBmbG9hdCBwcm9iU3RyaW5nKGxvbmcgcHRyLCBpbnQgd29yZHNbXSwgaW50IHN0YXJ0KTsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSBsb25nIGNyZWF0ZVBvb2woKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBkZXN0cm95UG9vbChsb25nIHBvaW50ZXIpOwotCi0gIHB1YmxpYyBLZW5MTShpbnQgb3JkZXIsIFN0cmluZyBmaWxlX25hbWUpIHsKLSAgICBuZ3JhbU9yZGVyID0gb3JkZXI7Ci0KLSAgICBwb2ludGVyID0gY29uc3RydWN0KGZpbGVfbmFtZSk7Ci0gICAgTiA9IG9yZGVyKHBvaW50ZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICBkZXN0cm95KHBvaW50ZXIpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRPcmRlcigpIHsKLSAgICByZXR1cm4gbmdyYW1PcmRlcjsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyV29yZChTdHJpbmcgd29yZCwgaW50IGlkKSB7Ci0gICAgcmV0dXJuIHJlZ2lzdGVyV29yZChwb2ludGVyLCB3b3JkLCBpZCk7Ci0gIH0KLQotICBwdWJsaWMgZmxvYXQgcHJvYihpbnQgd29yZHNbXSkgewotICAgIHJldHVybiBwcm9iKHBvaW50ZXIsIHdvcmRzKTsKLSAgfQotCi0gIC8vIEFwcGFyZW50bHkgWmhpZmVpIHN0YXJ0cyBzb21lIGFycmF5IGluZGljZXMgYXQgMS4gQ2hhbmdlIHRvIDAtaW5kZXhpbmcuCi0gIHB1YmxpYyBmbG9hdCBwcm9iU3RyaW5nKGludCB3b3Jkc1tdLCBpbnQgc3RhcnQpIHsKLSAgICByZXR1cm4gcHJvYlN0cmluZyhwb2ludGVyLCB3b3Jkcywgc3RhcnQgLSAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBicmlkZ2UgdG8gdGhlIGludGVyZmFjZSBpbiBrZW5sbS9sbS9sZWZ0LmhoLCB3aGljaCBoYXMgS2VuTE0gc2NvcmUgdGhlCi0gICAqIHdob2xlIHJ1bGUuIEl0IHRha2VzIGEgbGlzdCBvZiB3b3JkcyBhbmQgc3RhdGVzIHJldHJpZXZlZCBmcm9tIHRhaWwgbm9kZXMgKG5vbnRlcm1pbmFscyBpbiB0aGUKLSAgICogcnVsZSkuIE5vbnRlcm1pbmFscyBoYXZlIGEgbmVnYXRpdmUgdmFsdWUgc28gS2VuTE0gY2FuIGRpc3Rpbmd1aXNoIHRoZW0uIFRoZSBzZW50ZW5jZSBudW1iZXIgaXMKLSAgICogbmVlZGVkIHNvIEtlbkxNIGtub3dzIHdoaWNoIG1lbW9yeSBwb29sIHRvIHVzZS4gV2hlbiBmaW5pc2hlZCwgaXQgcmV0dXJucyB0aGUgdXBkYXRlZCBLZW5MTQotICAgKiBzdGF0ZSBhbmQgdGhlIExNIHByb2JhYmlsaXR5IGluY3VycmVkIGFsb25nIHRoaXMgcnVsZS4KLSAgICogCi0gICAqIEBwYXJhbSB3b3JkcwotICAgKiBAcGFyYW0gc2VudElkCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBTdGF0ZVByb2JQYWlyIHByb2JSdWxlKGxvbmdbXSB3b3JkcywgbG9uZyBwb29sUG9pbnRlcikgewotCi0gICAgU3RhdGVQcm9iUGFpciBwYWlyID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgcGFpciA9IHByb2JSdWxlKHBvaW50ZXIsIHBvb2xQb2ludGVyLCB3b3Jkcyk7Ci0gICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgIH0KLQotICAgIHJldHVybiBwYWlyOwotICB9Ci0KLSAgLyoqCi0gICAqIFB1YmxpYyBmYWNpbmcgZnVuY3Rpb24gdGhhdCBlc3RpbWF0ZXMgdGhlIGNvc3Qgb2YgYSBydWxlLCB3aGljaCB2YWx1ZSBpcyB1c2VkIGZvciBzb3J0aW5nCi0gICAqIHJ1bGVzIGR1cmluZyBjdWJlIHBydW5pbmcuCi0gICAqIAotICAgKiBAcGFyYW0gd29yZHMKLSAgICogQHJldHVybiB0aGUgZXN0aW1hdGVkIGNvc3Qgb2YgdGhlIHJ1bGUgKHRoZSAocGFydGlhbCkgbi1ncmFtIHByb2JhYmlsaXRpZXMgb2YgYWxsIHdvcmRzIGluIHRoZSBydWxlKQotICAgKi8KLSAgcHVibGljIGZsb2F0IGVzdGltYXRlUnVsZShsb25nW10gd29yZHMpIHsKLSAgICBmbG9hdCBlc3RpbWF0ZSA9IDAuMGY7Ci0gICAgdHJ5IHsKLSAgICAgIGVzdGltYXRlID0gZXN0aW1hdGVSdWxlKHBvaW50ZXIsIHdvcmRzKTsKLSAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBlc3RpbWF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIElubmVyIGNsYXNzIHVzZWQgdG8gaG9sZCB0aGUgcmVzdWx0cyByZXR1cm5lZCBmcm9tIEtlbkxNIHdpdGggbGVmdC1zdGF0ZSBtaW5pbWl6YXRpb24uIE5vdGUKLSAgICogdGhhdCBpbm5lciBjbGFzc2VzIGhhdmUgdG8gYmUgc3RhdGljIHRvIGJlIGFjY2Vzc2libGUgZnJvbSB0aGUgSk5JIQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0ZVByb2JQYWlyIHsKLSAgICBwdWJsaWMgS2VuTE1TdGF0ZSBzdGF0ZSA9IG51bGw7Ci0gICAgcHVibGljIGZsb2F0IHByb2IgPSAwLjBmOwotCi0gICAgcHVibGljIFN0YXRlUHJvYlBhaXIobG9uZyBzdGF0ZSwgZmxvYXQgcHJvYikgewotICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBLZW5MTVN0YXRlKHN0YXRlKTsKLSAgICAgIHRoaXMucHJvYiA9IHByb2I7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgY29tcGFyZVRvKEtlbkxNIG90aGVyKSB7Ci0gICAgaWYgKHRoaXMgPT0gb3RoZXIpCi0gICAgICByZXR1cm4gMDsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKioKLSAgICogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGlmIEtlbkxNIGlzIGludm9rZWQgdW5kZXIgTGFuZ3VhZ2VNb2RlbEZGIGluc3RlYWQgb2YgS2VuTE1GRi4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmxvYXQgc2VudGVuY2VMb2dQcm9iYWJpbGl0eShpbnRbXSBzZW50ZW5jZSwgaW50IG9yZGVyLCBpbnQgc3RhcnRJbmRleCkgewotICAgIHJldHVybiBwcm9iU3RyaW5nKHNlbnRlbmNlLCBzdGFydEluZGV4KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmxvYXQgbmdyYW1Mb2dQcm9iYWJpbGl0eShpbnRbXSBuZ3JhbSwgaW50IG9yZGVyKSB7Ci0gICAgaWYgKG9yZGVyICE9IE4gJiYgb3JkZXIgIT0gbmdyYW0ubGVuZ3RoKQotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkxvd2VyIG9yZGVyIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgcmV0dXJuIHByb2IobmdyYW0pOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmbG9hdCBuZ3JhbUxvZ1Byb2JhYmlsaXR5KGludFtdIG5ncmFtKSB7Ci0gICAgcmV0dXJuIHByb2IobmdyYW0pOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vam5pL3dyYXAuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vam5pL3dyYXAuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2M2RkYTUuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2puaS93cmFwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLSNpbmNsdWRlICJsbS9lbnVtZXJhdGVfdm9jYWIuaGgiCi0jaW5jbHVkZSAibG0vbW9kZWwuaGgiCi0jaW5jbHVkZSAibG0vbGVmdC5oaCIKLSNpbmNsdWRlICJsbS9zdGF0ZS5oaCIKLSNpbmNsdWRlICJ1dGlsL211cm11cl9oYXNoLmhoIgotI2luY2x1ZGUgInV0aWwvcG9vbC5oaCIKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0vLyBHcnIuICBFdmVyeWJvZHkncyBjb21waWxlciBpcyBzbGlnaHRseSBkaWZmZXJlbnQgYW5kIEknbSB0cnlpbmcgdG8gbm90IGRlcGVuZCBvbiBib29zdC4gICAKLSNpbmNsdWRlIDxleHQvaGFzaF9tYXA+Ci0KLS8vIFRoaXMgaXMgbmVlZGVkIHRvIGNvbXBpbGUgb24gT1MgWCBMaW9uIC8gZ2NjIDQuMi4xCi1uYW1lc3BhY2UgX19nbnVfY3h4IHsKLXRlbXBsYXRlPD4KLXN0cnVjdCBoYXNoPHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQ+IHsKLSAgc2l6ZV90IG9wZXJhdG9yKCkodW5zaWduZWQgbG9uZyBsb25nIGludCBfX3gpIGNvbnN0IHsKLSAgICByZXR1cm4gX194OwotICB9Ci19OwotfQotCi0vLyBWZXJpZnkgdGhhdCBqaW50IGFuZCBsbTo6bmdyYW06OldvcmRJbmRleCBhcmUgdGhlIHNhbWUgc2l6ZS4gSWYgdGhpcyBicmVha3MKLS8vIGZvciB5b3UsIHRoZXJlJ3MgYSBuZWVkIHRvIHJldmlzZSBwcm9iU3RyaW5nLgotbmFtZXNwYWNlIHsKLQotdGVtcGxhdGU8Ym9vbD4gc3RydWN0IFN0YXRpY0NoZWNrIHsKLX07Ci0KLXRlbXBsYXRlPD4gc3RydWN0IFN0YXRpY0NoZWNrPHRydWU+IHsKLSAgdHlwZWRlZiBib29sIFN0YXRpY0Fzc2VydGlvblBhc3NlZDsKLX07Ci0KLXR5cGVkZWYgU3RhdGljQ2hlY2s8c2l6ZW9mKGppbnQpID09IHNpemVvZihsbTo6V29yZEluZGV4KT46OlN0YXRpY0Fzc2VydGlvblBhc3NlZCBGbG9hdFNpemU7Ci0KLXR5cGVkZWYgX19nbnVfY3h4OjpoYXNoX21hcDx1aW50NjRfdCwgbG06Om5ncmFtOjpDaGFydFN0YXRlKj4gUG9vbEhhc2g7Ci0KLS8qKgotICogQSBDaGFydCBidW5kbGVzIHRvZ2V0aGVyIGEgaGFzaF9tYXAgdGhhdCBtYXBzIENoYXJ0U3RhdGUgc2lnbmF0dXJlcyB0byBhIHNpbmdsZSBvYmplY3QKLSAqIGluc3RhbnRpYXRlZCB1c2luZyBhIHBvb2wuIFRoaXMgYWxsb3dzIGR1cGxpY2F0ZSBzdGF0ZXMgdG8gYXZvaWQgYWxsb2NhdGluZyBzZXBhcmF0ZQotICogc3RhdGUgb2JqZWN0cyBhdCBtdWx0aXBsZSBwbGFjZXMgdGhyb3VnaG91dCBhIHNlbnRlbmNlLCBhbmQgYWxzbyBhbGxvd3Mgc3RhdGUgdG8gYmUKLSAqIHNoYXJlZCBhY3Jvc3MgS2VuTE1zIGZvciB0aGUgc2FtZSBzZW50ZW5jZS4KLSAqLwotc3RydWN0IENoYXJ0IHsKLSAgLy8gQSBjYWNoZSBmb3IgYWxsb2NhdGVkIGNoYXJ0IG9iamVjdHMKLSAgUG9vbEhhc2gqIHBvb2xIYXNoOwotICAvLyBQb29sIHVzZWQgdG8gYWxsb2NhdGUgbmV3IG9uZXMKLSAgdXRpbDo6UG9vbCogcG9vbDsKLQotICBDaGFydCgpIHsKLSAgICBwb29sSGFzaCA9IG5ldyBQb29sSGFzaCgpOwotICAgIHBvb2wgPSBuZXcgdXRpbDo6UG9vbCgpOwotICB9Ci0KLSAgfkNoYXJ0KCkgewotICAgIGRlbGV0ZSBwb29sSGFzaDsKLSAgICBwb29sLT5GcmVlQWxsKCk7Ci0gICAgZGVsZXRlIHBvb2w7Ci0gIH0KLQotICBsbTo6bmdyYW06OkNoYXJ0U3RhdGUqIHB1dChjb25zdCBsbTo6bmdyYW06OkNoYXJ0U3RhdGUmIHN0YXRlKSB7Ci0gICAgdWludDY0X3QgaGFzaFZhbHVlID0gbG06Om5ncmFtOjpoYXNoX3ZhbHVlKHN0YXRlKTsKLSAgCi0gICAgaWYgKHBvb2xIYXNoLT5maW5kKGhhc2hWYWx1ZSkgPT0gcG9vbEhhc2gtPmVuZCgpKSB7Ci0gICAgICBsbTo6bmdyYW06OkNoYXJ0U3RhdGUqIHBvaW50ZXIgPSAobG06Om5ncmFtOjpDaGFydFN0YXRlICopcG9vbC0+QWxsb2NhdGUoc2l6ZW9mKGxtOjpuZ3JhbTo6Q2hhcnRTdGF0ZSkpOwotICAgICAgKnBvaW50ZXIgPSBzdGF0ZTsKLSAgICAgICgqcG9vbEhhc2gpW2hhc2hWYWx1ZV0gPSBwb2ludGVyOwotICAgIH0KLQotICAgIHJldHVybiAoKnBvb2xIYXNoKVtoYXNoVmFsdWVdOwotICB9Ci19OwotCi0vLyBWb2NhYiBpZHMgYWJvdmUgd2hhdCB0aGUgdm9jYWJ1bGFyeSBrbm93cyBhYm91dCBhcmUgdW5rbm93biBhbmQgc2hvdWxkCi0vLyBiZSBtYXBwZWQgdG8gdGhhdC4gCi12b2lkIE1hcEFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPGxtOjpXb3JkSW5kZXg+JiBtYXAsIGppbnQgKmJlZ2luLCBqaW50ICplbmQpIHsKLSAgZm9yIChqaW50ICppID0gYmVnaW47IGkgPCBlbmQ7ICsraSkgewotICAgICppID0gbWFwWyppXTsKLSAgfQotfQotCi1jaGFyICpQaWVjZUNvcHkoY29uc3QgU3RyaW5nUGllY2UgJnN0cikgewotICBjaGFyICpyZXQgPSAoY2hhciopIG1hbGxvYyhzdHIuc2l6ZSgpICsgMSk7Ci0gIG1lbWNweShyZXQsIHN0ci5kYXRhKCksIHN0ci5zaXplKCkpOwotICByZXRbc3RyLnNpemUoKV0gPSAwOwotICByZXR1cm4gcmV0OwotfQotCi0vLyBSYXRoZXIgdGhhbiBoYW5kbGUgc2V2ZXJhbCBkaWZmZXJlbnQgaW5zdGFudGlhdGlvbnMgb3ZlciBKTkksIHdlJ2xsIGp1c3QKLS8vIGRvIHZpcnR1YWwgY2FsbHMgQysrLXNpZGUuCi1jbGFzcyBWaXJ0dWFsQmFzZSB7Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgflZpcnR1YWxCYXNlKCkgewotICB9Ci0KLSAgdmlydHVhbCBmbG9hdCBQcm9iKGppbnQgKmJlZ2luLCBqaW50ICplbmQpIGNvbnN0ID0gMDsKLQotICB2aXJ0dWFsIGZsb2F0IFByb2JSdWxlKGpsb25nICpiZWdpbiwgamxvbmcgKmVuZCwgbG06Om5ncmFtOjpDaGFydFN0YXRlJiBzdGF0ZSkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgZmxvYXQgUHJvYlN0cmluZyhqaW50ICogY29uc3QgYmVnaW4sIGppbnQgKiBjb25zdCBlbmQsCi0gICAgICBqaW50IHN0YXJ0KSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCBmbG9hdCBFc3RpbWF0ZVJ1bGUoamxvbmcgKmJlZ2luLCBqbG9uZyAqZW5kKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCB1aW50OF90IE9yZGVyKCkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgYm9vbCBSZWdpc3RlcldvcmQoY29uc3QgU3RyaW5nUGllY2UmIHdvcmQsIGNvbnN0IGludCBqb3NodWFfaWQpID0gMDsKLQotICB2b2lkIFJlbWVtYmVyUmV0dXJuTWV0aG9kKGpjbGFzcyBjaGFydF9wYWlyLCBqbWV0aG9kSUQgY2hhcnRfcGFpcl9pbml0KSB7Ci0gICAgY2hhcnRfcGFpcl8gPSBjaGFydF9wYWlyOwotICAgIGNoYXJ0X3BhaXJfaW5pdF8gPSBjaGFydF9wYWlyX2luaXQ7Ci0gIH0KLQotICBqY2xhc3MgQ2hhcnRQYWlyKCkgY29uc3QgeyByZXR1cm4gY2hhcnRfcGFpcl87IH0KLSAgam1ldGhvZElEIENoYXJ0UGFpckluaXQoKSBjb25zdCB7IHJldHVybiBjaGFydF9wYWlyX2luaXRfOyB9Ci0KLXByb3RlY3RlZDoKLSAgVmlydHVhbEJhc2UoKSB7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gSGFjazogdGhlc2UgYXJlIHJlbWVtYmVyZWQgc28gd2UgY2FuIGF2b2lkIGxvb2tpbmcgdGhlbSB1cCBldmVyeSB0aW1lLgotICBqY2xhc3MgY2hhcnRfcGFpcl87Ci0gIGptZXRob2RJRCBjaGFydF9wYWlyX2luaXRfOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgTW9kZWw+IGNsYXNzIFZpcnR1YWxJbXBsOiBwdWJsaWMgVmlydHVhbEJhc2UgewotcHVibGljOgotICBWaXJ0dWFsSW1wbChjb25zdCBjaGFyICpuYW1lKSA6Ci0gICAgICBtXyhuYW1lKSB7Ci0gICAgLy8gSW5zZXJ0IHVua25vd24gaWQgbWFwcGluZy4KLSAgICBtYXBfLnB1c2hfYmFjaygwKTsKLSAgfQotCi0gIH5WaXJ0dWFsSW1wbCgpIHsKLSAgfQotCi0gIGZsb2F0IFByb2IoamludCAqIGNvbnN0IGJlZ2luLCBqaW50ICogY29uc3QgZW5kKSBjb25zdCB7Ci0gICAgTWFwQXJyYXkobWFwXywgYmVnaW4sIGVuZCk7Ci0KLSAgICBzdGQ6OnJldmVyc2UoYmVnaW4sIGVuZCAtIDEpOwotICAgIGxtOjpuZ3JhbTo6U3RhdGUgaWdub3JlZDsKLSAgICByZXR1cm4gbV8uRnVsbFNjb3JlRm9yZ290U3RhdGUoCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbG06OldvcmRJbmRleCo+KGJlZ2luKSwKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBsbTo6V29yZEluZGV4Kj4oZW5kIC0gMSksICooZW5kIC0gMSksCi0gICAgICAgIGlnbm9yZWQpLnByb2I7Ci0gIH0KLQotICBmbG9hdCBQcm9iUnVsZShqbG9uZyAqIGNvbnN0IGJlZ2luLCBqbG9uZyAqIGNvbnN0IGVuZCwgbG06Om5ncmFtOjpDaGFydFN0YXRlJiBzdGF0ZSkgY29uc3QgewotICAgIGlmIChiZWdpbiA9PSBlbmQpIHJldHVybiAwLjA7Ci0gICAgbG06Om5ncmFtOjpSdWxlU2NvcmU8TW9kZWw+IHJ1bGVTY29yZShtXywgc3RhdGUpOwotCi0gICAgaWYgKCpiZWdpbiA8IDApIHsKLSAgICAgIHJ1bGVTY29yZS5CZWdpbk5vblRlcm1pbmFsKCpyZWludGVycHJldF9jYXN0PGNvbnN0IGxtOjpuZ3JhbTo6Q2hhcnRTdGF0ZSo+KC0qYmVnaW4pKTsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgbG06OldvcmRJbmRleCB3b3JkID0gbWFwX1sqYmVnaW5dOwotICAgICAgaWYgKHdvcmQgPT0gbV8uR2V0Vm9jYWJ1bGFyeSgpLkJlZ2luU2VudGVuY2UoKSkgewotICAgICAgICBydWxlU2NvcmUuQmVnaW5TZW50ZW5jZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcnVsZVNjb3JlLlRlcm1pbmFsKHdvcmQpOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGpsb25nKiBpID0gYmVnaW4gKyAxOyBpICE9IGVuZDsgaSsrKSB7Ci0gICAgICBsb25nIHdvcmQgPSAqaTsKLSAgICAgIGlmICh3b3JkIDwgMCkKLSAgICAgICAgcnVsZVNjb3JlLk5vblRlcm1pbmFsKCpyZWludGVycHJldF9jYXN0PGNvbnN0IGxtOjpuZ3JhbTo6Q2hhcnRTdGF0ZSo+KC13b3JkKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJ1bGVTY29yZS5UZXJtaW5hbChtYXBfW3dvcmRdKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ1bGVTY29yZS5GaW5pc2goKTsKLSAgfQotCi0gIGZsb2F0IEVzdGltYXRlUnVsZShqbG9uZyAqIGNvbnN0IGJlZ2luLCBqbG9uZyAqIGNvbnN0IGVuZCkgY29uc3QgewotICAgIGlmIChiZWdpbiA9PSBlbmQpIHJldHVybiAwLjA7Ci0gICAgbG06Om5ncmFtOjpDaGFydFN0YXRlIG51bGxTdGF0ZTsKLSAgICBsbTo6bmdyYW06OlJ1bGVTY29yZTxNb2RlbD4gcnVsZVNjb3JlKG1fLCBudWxsU3RhdGUpOwotCi0gICAgaWYgKCpiZWdpbiA8IDApIHsKLSAgICAgIHJ1bGVTY29yZS5SZXNldCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb25zdCBsbTo6V29yZEluZGV4IHdvcmQgPSBtYXBfWypiZWdpbl07Ci0gICAgICBpZiAod29yZCA9PSBtXy5HZXRWb2NhYnVsYXJ5KCkuQmVnaW5TZW50ZW5jZSgpKSB7Ci0gICAgICAgIHJ1bGVTY29yZS5CZWdpblNlbnRlbmNlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBydWxlU2NvcmUuVGVybWluYWwod29yZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoamxvbmcqIGkgPSBiZWdpbiArIDE7IGkgIT0gZW5kOyBpKyspIHsKLSAgICAgIGxvbmcgd29yZCA9ICppOwotICAgICAgaWYgKHdvcmQgPCAwKQotICAgICAgICBydWxlU2NvcmUuUmVzZXQoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcnVsZVNjb3JlLlRlcm1pbmFsKG1hcF9bd29yZF0pOwotICAgIH0KLSAgICByZXR1cm4gcnVsZVNjb3JlLkZpbmlzaCgpOwotICB9Ci0KLSAgZmxvYXQgUHJvYlN0cmluZyhqaW50ICogY29uc3QgYmVnaW4sIGppbnQgKiBjb25zdCBlbmQsIGppbnQgc3RhcnQpIGNvbnN0IHsKLSAgICBNYXBBcnJheShtYXBfLCBiZWdpbiwgZW5kKTsKLQotICAgIGZsb2F0IHByb2I7Ci0gICAgbG06Om5ncmFtOjpTdGF0ZSBzdGF0ZTsKLSAgICBpZiAoc3RhcnQgPT0gMCkgewotICAgICAgcHJvYiA9IDA7Ci0gICAgICBzdGF0ZSA9IG1fLk51bGxDb250ZXh0U3RhdGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RkOjpyZXZlcnNlKGJlZ2luLCBiZWdpbiArIHN0YXJ0KTsKLSAgICAgIHByb2IgPSBtXy5GdWxsU2NvcmVGb3Jnb3RTdGF0ZSgKLSAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGxtOjpXb3JkSW5kZXgqPihiZWdpbiksCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBsbTo6V29yZEluZGV4Kj4oYmVnaW4gKyBzdGFydCksCi0gICAgICAgICAgYmVnaW5bc3RhcnRdLCBzdGF0ZSkucHJvYjsKLSAgICAgICsrc3RhcnQ7Ci0gICAgfQotICAgIGxtOjpuZ3JhbTo6U3RhdGUgc3RhdGUyOwotICAgIGZvciAoY29uc3QgamludCAqaSA9IGJlZ2luICsgc3RhcnQ7OykgewotICAgICAgaWYgKGkgPj0gZW5kKQotICAgICAgICBicmVhazsKLSAgICAgIGZsb2F0IGdvdCA9IG1fLlNjb3JlKHN0YXRlLCAqaSwgc3RhdGUyKTsKLSAgICAgIGkrKzsKLSAgICAgIHByb2IgKz0gZ290OwotICAgICAgaWYgKGkgPj0gZW5kKQotICAgICAgICBicmVhazsKLSAgICAgIGdvdCA9IG1fLlNjb3JlKHN0YXRlMiwgKmksIHN0YXRlKTsKLSAgICAgIGkrKzsKLSAgICAgIHByb2IgKz0gZ290OwotICAgIH0KLSAgICByZXR1cm4gcHJvYjsKLSAgfQotCi0gIHVpbnQ4X3QgT3JkZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fLk9yZGVyKCk7Ci0gIH0KLQotICBib29sIFJlZ2lzdGVyV29yZChjb25zdCBTdHJpbmdQaWVjZSYgd29yZCwgY29uc3QgaW50IGpvc2h1YV9pZCkgewotICAgIGlmIChtYXBfLnNpemUoKSA8PSBqb3NodWFfaWQpIHsKLSAgICAgIG1hcF8ucmVzaXplKGpvc2h1YV9pZCArIDEsIDApOwotICAgIH0KLSAgICBib29sIGFscmVhZHlfcHJlc2VudCA9IGZhbHNlOwotICAgIGlmIChtYXBfW2pvc2h1YV9pZF0gIT0gMCkKLSAgICAgIGFscmVhZHlfcHJlc2VudCA9IHRydWU7Ci0gICAgbWFwX1tqb3NodWFfaWRdID0gbV8uR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KHdvcmQpOwotICAgIHJldHVybiBhbHJlYWR5X3ByZXNlbnQ7Ci0gIH0KLQotcHJpdmF0ZToKLSAgTW9kZWwgbV87Ci0gIHN0ZDo6dmVjdG9yPGxtOjpXb3JkSW5kZXg+IG1hcF87Ci19OwotCi1WaXJ0dWFsQmFzZSAqQ29uc3RydWN0TW9kZWwoY29uc3QgY2hhciAqZmlsZV9uYW1lKSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBsbTo6bmdyYW07Ci0gIE1vZGVsVHlwZSBtb2RlbF90eXBlOwotICBpZiAoIVJlY29nbml6ZUJpbmFyeShmaWxlX25hbWUsIG1vZGVsX3R5cGUpKQotICAgIG1vZGVsX3R5cGUgPSBIQVNIX1BST0JJTkc7Ci0gIHN3aXRjaCAobW9kZWxfdHlwZSkgewotICBjYXNlIFBST0JJTkc6Ci0gICAgcmV0dXJuIG5ldyBWaXJ0dWFsSW1wbDxQcm9iaW5nTW9kZWw+KGZpbGVfbmFtZSk7Ci0gIGNhc2UgUkVTVF9QUk9CSU5HOgotICAgIHJldHVybiBuZXcgVmlydHVhbEltcGw8UmVzdFByb2JpbmdNb2RlbD4oZmlsZV9uYW1lKTsKLSAgY2FzZSBUUklFOgotICAgIHJldHVybiBuZXcgVmlydHVhbEltcGw8VHJpZU1vZGVsPihmaWxlX25hbWUpOwotICBjYXNlIEFSUkFZX1RSSUU6Ci0gICAgcmV0dXJuIG5ldyBWaXJ0dWFsSW1wbDxBcnJheVRyaWVNb2RlbD4oZmlsZV9uYW1lKTsKLSAgY2FzZSBRVUFOVF9UUklFOgotICAgIHJldHVybiBuZXcgVmlydHVhbEltcGw8UXVhbnRUcmllTW9kZWw+KGZpbGVfbmFtZSk7Ci0gIGNhc2UgUVVBTlRfQVJSQVlfVFJJRToKLSAgICByZXR1cm4gbmV3IFZpcnR1YWxJbXBsPFF1YW50QXJyYXlUcmllTW9kZWw+KGZpbGVfbmFtZSk7Ci0gIGRlZmF1bHQ6Ci0gICAgVVRJTF9USFJPVygKLSAgICAgICAgbG06OkZvcm1hdExvYWRFeGNlcHRpb24sCi0gICAgICAgICJVbnJlY29nbml6ZWQgZmlsZSBmb3JtYXQgIiA8PCAodW5zaWduZWQpIG1vZGVsX3R5cGUKLSAgICAgICAgICAgIDw8ICIgaW4gZmlsZSAiIDw8IGZpbGVfbmFtZSk7Ci0gIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UKLQotZXh0ZXJuICJDIiB7Ci0KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIEphdmFfam9zaHVhX2RlY29kZXJfZmZfbG1fa2VubG1fam5pX0tlbkxNX2NvbnN0cnVjdCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqc3RyaW5nIGZpbGVfbmFtZSkgewotICBjb25zdCBjaGFyICpzdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGZpbGVfbmFtZSwgMCk7Ci0gIGlmICghc3RyKQotICAgIHJldHVybiAwOwotCi0gIFZpcnR1YWxCYXNlICpyZXQ7Ci0gIHRyeSB7Ci0gICAgcmV0ID0gQ29uc3RydWN0TW9kZWwoc3RyKTsKLQotICAgIC8vIEdldCBhIGNsYXNzIHJlZmVyZW5jZSBmb3IgdGhlIHR5cGUgcGFpciB0aGF0IGNoYXIKLSAgICBqY2xhc3MgbG9jYWxfY2hhcnRfcGFpciA9IGVudi0+RmluZENsYXNzKCJqb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9qbmkvS2VuTE0kU3RhdGVQcm9iUGFpciIpOwotICAgIFVUSUxfVEhST1dfSUYoIWxvY2FsX2NoYXJ0X3BhaXIsIHV0aWw6OkV4Y2VwdGlvbiwgIkZhaWxlZCB0byBmaW5kIGpvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2puaS9LZW5MTSRTdGF0ZVByb2JQYWlyIik7Ci0gICAgamNsYXNzIGNoYXJ0X3BhaXIgPSAoamNsYXNzKWVudi0+TmV3R2xvYmFsUmVmKGxvY2FsX2NoYXJ0X3BhaXIpOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYobG9jYWxfY2hhcnRfcGFpcik7Ci0KLSAgICAvLyBHZXQgdGhlIE1ldGhvZCBJRCBvZiB0aGUgY29uc3RydWN0b3Igd2hpY2ggdGFrZXMgYW4gaW50Ci0gICAgam1ldGhvZElEIGNoYXJ0X3BhaXJfaW5pdCA9IGVudi0+R2V0TWV0aG9kSUQoY2hhcnRfcGFpciwgIjxpbml0PiIsICIoSkYpViIpOwotICAgIFVUSUxfVEhST1dfSUYoIWNoYXJ0X3BhaXJfaW5pdCwgdXRpbDo6RXhjZXB0aW9uLCAiRmFpbGVkIHRvIGZpbmQgaW5pdCBtZXRob2QiKTsKLQotICAgIHJldC0+UmVtZW1iZXJSZXR1cm5NZXRob2QoY2hhcnRfcGFpciwgY2hhcnRfcGFpcl9pbml0KTsKLSAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24gJmUpIHsKLSAgICBzdGQ6OmNlcnIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZmlsZV9uYW1lLCBzdHIpOwotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxqbG9uZz4ocmV0KTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2pvc2h1YV9kZWNvZGVyX2ZmX2xtX2tlbmxtX2puaV9LZW5MTV9kZXN0cm95KAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGpsb25nIHBvaW50ZXIpIHsKLSAgVmlydHVhbEJhc2UgKmJhc2UgPSByZWludGVycHJldF9jYXN0PFZpcnR1YWxCYXNlKj4ocG9pbnRlcik7Ci0gIGVudi0+RGVsZXRlR2xvYmFsUmVmKGJhc2UtPkNoYXJ0UGFpcigpKTsKLSAgZGVsZXRlIGJhc2U7Ci19Ci0KLUpOSUVYUE9SVCBsb25nIEpOSUNBTEwgSmF2YV9qb3NodWFfZGVjb2Rlcl9mZl9sbV9rZW5sbV9qbmlfS2VuTE1fY3JlYXRlUG9vbCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PGxvbmc+KG5ldyBDaGFydCgpKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2pvc2h1YV9kZWNvZGVyX2ZmX2xtX2tlbmxtX2puaV9LZW5MTV9kZXN0cm95UG9vbCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqbG9uZyBwb2ludGVyKSB7Ci0gIENoYXJ0KiBjaGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hhcnQqPihwb2ludGVyKTsKLSAgZGVsZXRlIGNoYXJ0OwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfam9zaHVhX2RlY29kZXJfZmZfbG1fa2VubG1fam5pX0tlbkxNX29yZGVyKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGpsb25nIHBvaW50ZXIpIHsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmlydHVhbEJhc2UqPihwb2ludGVyKS0+T3JkZXIoKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9qb3NodWFfZGVjb2Rlcl9mZl9sbV9rZW5sbV9qbmlfS2VuTE1fcmVnaXN0ZXJXb3JkKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGpsb25nIHBvaW50ZXIsIGpzdHJpbmcgd29yZCwgamludCBpZCkgewotICBjb25zdCBjaGFyICpzdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHdvcmQsIDApOwotICBpZiAoIXN0cikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGppbnQgcmV0OwotICB0cnkgewotICAgIHJldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmlydHVhbEJhc2UqPihwb2ludGVyKS0+UmVnaXN0ZXJXb3JkKHN0ciwgaWQpOwotICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiAmZSkgewotICAgIHN0ZDo6Y2VyciA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgYWJvcnQoKTsKLSAgfQotICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyh3b3JkLCBzdHIpOwotICByZXR1cm4gcmV0OwotfQotCi1KTklFWFBPUlQgamZsb2F0IEpOSUNBTEwgSmF2YV9qb3NodWFfZGVjb2Rlcl9mZl9sbV9rZW5sbV9qbmlfS2VuTE1fcHJvYigKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqbG9uZyBwb2ludGVyLCBqaW50QXJyYXkgYXJyKSB7Ci0gIGppbnQgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnIpOwotICBpZiAobGVuZ3RoIDw9IDApCi0gICAgcmV0dXJuIDAuMDsKLSAgLy8gR0NDIG9ubHkuCi0gIGppbnQgdmFsdWVzW2xlbmd0aF07Ci0gIGVudi0+R2V0SW50QXJyYXlSZWdpb24oYXJyLCAwLCBsZW5ndGgsIHZhbHVlcyk7Ci0KLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmlydHVhbEJhc2UqPihwb2ludGVyKS0+UHJvYih2YWx1ZXMsCi0gICAgICB2YWx1ZXMgKyBsZW5ndGgpOwotfQotCi1KTklFWFBPUlQgamZsb2F0IEpOSUNBTEwgSmF2YV9qb3NodWFfZGVjb2Rlcl9mZl9sbV9rZW5sbV9qbmlfS2VuTE1fcHJvYlN0cmluZygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqbG9uZyBwb2ludGVyLCBqaW50QXJyYXkgYXJyLCBqaW50IHN0YXJ0KSB7Ci0gIGppbnQgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnIpOwotICBpZiAobGVuZ3RoIDw9IHN0YXJ0KQotICAgIHJldHVybiAwLjA7Ci0gIC8vIEdDQyBvbmx5LgotICBqaW50IHZhbHVlc1tsZW5ndGhdOwotICBlbnYtPkdldEludEFycmF5UmVnaW9uKGFyciwgMCwgbGVuZ3RoLCB2YWx1ZXMpOwotCi0gIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFZpcnR1YWxCYXNlKj4ocG9pbnRlciktPlByb2JTdHJpbmcodmFsdWVzLAotICAgICAgdmFsdWVzICsgbGVuZ3RoLCBzdGFydCk7Ci19Ci0KLUpOSUVYUE9SVCBqb2JqZWN0IEpOSUNBTEwgSmF2YV9qb3NodWFfZGVjb2Rlcl9mZl9sbV9rZW5sbV9qbmlfS2VuTE1fcHJvYlJ1bGUoCi0gIEpOSUVudiAqZW52LCBqY2xhc3MsIGpsb25nIHBvaW50ZXIsIGpsb25nIGNoYXJ0UHRyLCBqbG9uZ0FycmF5IGFycikgewotICBqaW50IGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyKTsKLSAgLy8gR0NDIG9ubHkuCi0gIGpsb25nIHZhbHVlc1tsZW5ndGhdOwotICBlbnYtPkdldExvbmdBcnJheVJlZ2lvbihhcnIsIDAsIGxlbmd0aCwgdmFsdWVzKTsKLQotICAvLyBDb21wdXRlIHRoZSBwcm9iYWJpbGl0eQotICBsbTo6bmdyYW06OkNoYXJ0U3RhdGUgb3V0U3RhdGU7Ci0gIGNvbnN0IFZpcnR1YWxCYXNlICpiYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWaXJ0dWFsQmFzZSo+KHBvaW50ZXIpOwotICBmbG9hdCBwcm9iID0gYmFzZS0+UHJvYlJ1bGUodmFsdWVzLCB2YWx1ZXMgKyBsZW5ndGgsIG91dFN0YXRlKTsKLQotICBDaGFydCogY2hhcnQgPSByZWludGVycHJldF9jYXN0PENoYXJ0Kj4oY2hhcnRQdHIpOwotICBsbTo6bmdyYW06OkNoYXJ0U3RhdGUqIG91dFN0YXRlUHRyID0gY2hhcnQtPnB1dChvdXRTdGF0ZSk7Ci0KLSAgLy8gQ2FsbCBiYWNrIGNvbnN0cnVjdG9yIHRvIGFsbG9jYXRlIGEgbmV3IGluc3RhbmNlLCB3aXRoIGFuIGludCBhcmd1bWVudAotICByZXR1cm4gZW52LT5OZXdPYmplY3QoYmFzZS0+Q2hhcnRQYWlyKCksIGJhc2UtPkNoYXJ0UGFpckluaXQoKSwgKGxvbmcpb3V0U3RhdGVQdHIsIHByb2IpOwotfQotCi1KTklFWFBPUlQgamZsb2F0IEpOSUNBTEwgSmF2YV9qb3NodWFfZGVjb2Rlcl9mZl9sbV9rZW5sbV9qbmlfS2VuTE1fZXN0aW1hdGVSdWxlKAotICBKTklFbnYgKmVudiwgamNsYXNzLCBqbG9uZyBwb2ludGVyLCBqbG9uZ0FycmF5IGFycikgewotICBqaW50IGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyKTsKLSAgLy8gR0NDIG9ubHkuCi0gIGpsb25nIHZhbHVlc1tsZW5ndGhdOwotICBlbnYtPkdldExvbmdBcnJheVJlZ2lvbihhcnIsIDAsIGxlbmd0aCwgdmFsdWVzKTsKLQotICAvLyBDb21wdXRlIHRoZSBwcm9iYWJpbGl0eQotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWaXJ0dWFsQmFzZSo+KHBvaW50ZXIpLT5Fc3RpbWF0ZVJ1bGUodmFsdWVzLAotICAgICAgdmFsdWVzICsgbGVuZ3RoKTsKLX0KLQotfSAvLyBleHRlcm4KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9KYW1maWxlIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyN2IyMjAuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIElmIHlvdSBuZWVkIGhpZ2hlciBvcmRlciwgY2hhbmdlIHRoaXMgb3B0aW9uCi0jIEhhdmluZyB0aGlzIGxpbWl0IG1lYW5zIHRoYXQgU3RhdGUgY2FuIGJlCi0jIChLRU5MTV9NQVhfT1JERVIgLSAxKSAqIHNpemVvZihmbG9hdCkgYnl0ZXMgaW5zdGVhZCBvZgotIyBzaXplb2YoZmxvYXQqKSArIChLRU5MTV9NQVhfT1JERVIgLSAxKSAqIHNpemVvZihmbG9hdCkgKyBtYWxsb2Mgb3ZlcmhlYWQKLW1heC1vcmRlciA9IFsgb3B0aW9uLmdldCAibWF4LWtlbmxtLW9yZGVyIiA6IDYgOiA2IF0gOwotaWYgKCAkKG1heC1vcmRlcikgIT0gNiApIHsKLSAgIGVjaG8gIlNldHRpbmcgS2VuTE0gbWF4aW11bSBuLWdyYW0gb3JkZXIgdG8gJChtYXgtb3JkZXIpIiA7Ci19Ci1tYXgtb3JkZXIgPSA8ZGVmaW5lPktFTkxNX01BWF9PUkRFUj0kKG1heC1vcmRlcikgOwotCi1wYXRoLWNvbnN0YW50IE9SREVSLUxPRyA6IGJpbi9vcmRlci5sb2cgOwotdXBkYXRlLWlmLWNoYW5nZWQgJChPUkRFUi1MT0cpICQobWF4LW9yZGVyKSA7Ci0KLW1heC1vcmRlciArPSA8ZGVwZW5kZW5jeT4kKE9SREVSLUxPRykgOwotCi13cmFwcGVycyA9IDsKLWxvY2FsIHdpdGgtbnBsbSA9IFsgb3B0aW9uLmdldCAid2l0aC1ucGxtIiBdIDsKLWlmICQod2l0aC1ucGxtKSB7Ci0gIGxpYiBuZXVyYWxMTSA6IDogPHNlYXJjaD4kKHdpdGgtbnBsbSkvc3JjIDsKLSAgb2JqIG5wbG0ubyA6IHdyYXBwZXJzL25wbG0uY2MgOiA8aW5jbHVkZT4uLiA8aW5jbHVkZT4kKHdpdGgtbnBsbSkvc3JjIDxjeHhmbGFncz4tZm9wZW5tcCA7Ci0gIGFsaWFzIG5wbG0gOiBucGxtLm8gbmV1cmFsTE0gLi4vL2Jvb3N0X3RocmVhZCA6IDogOiA8Y3h4ZmxhZ3M+LWZvcGVubXAgPGxpbmtmbGFncz4tZm9wZW5tcCA8ZGVmaW5lPldJVEhfTlBMTSA8bGlicmFyeT4uLi8vYm9vc3RfdGhyZWFkIDsKLSAgd3JhcHBlcnMgKz0gbnBsbSA7Ci19Ci0KLWZha2VsaWIga2VubG0gOiAkKHdyYXBwZXJzKSBbIGdsb2IgKi5jYyA6ICptYWluLmNjICp0ZXN0LmNjIF0gLi4vdXRpbC8va2VudXRpbCA6IDxpbmNsdWRlPi4uICQobWF4LW9yZGVyKSA6IDogPGluY2x1ZGU+Li4gJChtYXgtb3JkZXIpIDsKLQotaW1wb3J0IHRlc3RpbmcgOwotCi1ydW4gbGVmdF90ZXN0LmNjIGtlbmxtIC90b3AvL2Jvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsgOiA6IHRlc3QuYXJwYSA7Ci1ydW4gbW9kZWxfdGVzdC5jYyBrZW5sbSAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIDogOiB0ZXN0LmFycGEgdGVzdF9ub3Vuay5hcnBhIDsKLXJ1biBwYXJ0aWFsX3Rlc3QuY2Mga2VubG0gL3RvcC8vYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yayA6IDogdGVzdC5hcnBhIDsKLQotZXhlcyA9IDsKLWZvciBsb2NhbCBwIGluIFsgZ2xvYiAqX21haW4uY2MgXSB7Ci0gIGxvY2FsIG5hbWUgPSBbIE1BVENIICIoLiopXF9tYWluLmNjIiA6ICQocCkgXSA7Ci0gIGV4ZSAkKG5hbWUpIDogJChwKSBrZW5sbSA7Ci0gIGV4ZXMgKz0gJChuYW1lKSA7Ci19Ci0KLWFsaWFzIHByb2dyYW1zIDogJChleGVzKSBmaWx0ZXIvL2ZpbHRlciBidWlsZGVyLy9kdW1wX2NvdW50cyA6IDx0aHJlYWRpbmc+bXVsdGk6PHNvdXJjZT5idWlsZGVyLy9sbXBseiA7CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYmhpa3NoYS5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9iaGlrc2hhLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGExOGRmLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9iaGlrc2hhLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotI2luY2x1ZGUgImxtL2JoaWtzaGEuaGgiCi0KLSNpbmNsdWRlICJsbS9iaW5hcnlfZm9ybWF0LmhoIgotI2luY2x1ZGUgImxtL2NvbmZpZy5oaCIKLSNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCi0jaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgbmdyYW0gewotbmFtZXNwYWNlIHRyaWUgewotCi1Eb250Qmhpa3NoYTo6RG9udEJoaWtzaGEoY29uc3Qgdm9pZCAqIC8qYmFzZSovLCB1aW50NjRfdCAvKm1heF9vZmZzZXQqLywgdWludDY0X3QgbWF4X25leHQsIGNvbnN0IENvbmZpZyAmLypjb25maWcqLykgOiAKLSAgbmV4dF8odXRpbDo6Qml0c01hc2s6OkJ5TWF4KG1heF9uZXh0KSkge30KLQotY29uc3QgdWludDhfdCBrQXJyYXlCaGlrc2hhVmVyc2lvbiA9IDA7Ci0KLS8vIFRPRE86IHB1dCB0aGlzIGluIGJpbmFyeSBmaWxlIGhlYWRlciBpbnN0ZWFkIHdoZW4gSSBjaGFuZ2UgdGhlIGJpbmFyeSBmaWxlIGZvcm1hdCBhZ2Fpbi4gIAotdm9pZCBBcnJheUJoaWtzaGE6OlVwZGF0ZUNvbmZpZ0Zyb21CaW5hcnkoY29uc3QgQmluYXJ5Rm9ybWF0ICZmaWxlLCB1aW50NjRfdCBvZmZzZXQsIENvbmZpZyAmY29uZmlnKSB7Ci0gIHVpbnQ4X3QgYnVmZmVyWzJdOwotICBmaWxlLlJlYWRGb3JDb25maWcoYnVmZmVyLCAyLCBvZmZzZXQpOwotICB1aW50OF90IHZlcnNpb24gPSBidWZmZXJbMF07Ci0gIHVpbnQ4X3QgY29uZmlndXJlZF9iaXRzID0gYnVmZmVyWzFdOwotICBpZiAodmVyc2lvbiAhPSBrQXJyYXlCaGlrc2hhVmVyc2lvbikgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiVGhpcyBmaWxlIGhhcyBzb3J0ZWQgYXJyYXkgY29tcHJlc3Npb24gdmVyc2lvbiAiIDw8ICh1bnNpZ25lZCkgdmVyc2lvbiA8PCAiIGJ1dCB0aGUgY29kZSBleHBlY3RzIHZlcnNpb24gIiA8PCAodW5zaWduZWQpa0FycmF5Qmhpa3NoYVZlcnNpb24pOwotICBjb25maWcucG9pbnRlcl9iaGlrc2hhX2JpdHMgPSBjb25maWd1cmVkX2JpdHM7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIEZpbmQgYXJnbWluX3tjaG9wcGVkIFxpbiBbMCwgUmVxdWlyZWRCaXRzKG1heF9uZXh0KV19IENob3BwZWREZWx0YShtYXhfb2Zmc2V0KQotdWludDhfdCBDaG9wQml0cyh1aW50NjRfdCBtYXhfb2Zmc2V0LCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQ29uZmlnICZjb25maWcpIHsKLSAgdWludDhfdCByZXF1aXJlZCA9IHV0aWw6OlJlcXVpcmVkQml0cyhtYXhfbmV4dCk7Ci0gIHVpbnQ4X3QgYmVzdF9jaG9wID0gMDsKLSAgaW50NjRfdCBsb3dlc3RfY2hhbmdlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCk7Ci0gIC8vIFRoZXJlIGFyZSBwcm9iYWJseSBmYXN0ZXIgd2F5cyBidXQgSSBkb24ndCBjYXJlIGJlY2F1c2UgdGhpcyBpcyBvbmx5IGRvbmUgb25jZSBwZXIgb3JkZXIgYXQgY29uc3RydWN0aW9uIHRpbWUuICAKLSAgZm9yICh1aW50OF90IGNob3AgPSAwOyBjaG9wIDw9IHN0ZDo6bWluKHJlcXVpcmVkLCBjb25maWcucG9pbnRlcl9iaGlrc2hhX2JpdHMpOyArK2Nob3ApIHsKLSAgICBpbnQ2NF90IGNoYW5nZSA9IChtYXhfbmV4dCA+PiAocmVxdWlyZWQgLSBjaG9wKSkgKiA2NCAvKiB0YWJsZSBjb3N0IGluIGJpdHMgKi8KLSAgICAgIC0gbWF4X29mZnNldCAqIHN0YXRpY19jYXN0PGludDY0X3Q+KGNob3ApOyAvKiBzYXZpbmdzIGluIGJpdHMqLwotICAgIGlmIChjaGFuZ2UgPCBsb3dlc3RfY2hhbmdlKSB7Ci0gICAgICBsb3dlc3RfY2hhbmdlID0gY2hhbmdlOwotICAgICAgYmVzdF9jaG9wID0gY2hvcDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGJlc3RfY2hvcDsKLX0KLQotc3RkOjpzaXplX3QgQXJyYXlDb3VudCh1aW50NjRfdCBtYXhfb2Zmc2V0LCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQ29uZmlnICZjb25maWcpIHsKLSAgdWludDhfdCByZXF1aXJlZCA9IHV0aWw6OlJlcXVpcmVkQml0cyhtYXhfbmV4dCk7Ci0gIHVpbnQ4X3QgY2hvcHBpbmcgPSBDaG9wQml0cyhtYXhfb2Zmc2V0LCBtYXhfbmV4dCwgY29uZmlnKTsKLSAgcmV0dXJuIChtYXhfbmV4dCA+PiAocmVxdWlyZWQgLSBjaG9wcGluZykpICsgMSAvKiB3ZSBzdG9yZSAwIHRvbyAqLzsKLX0KLX0gLy8gbmFtZXNwYWNlCi0KLXVpbnQ2NF90IEFycmF5Qmhpa3NoYTo6U2l6ZSh1aW50NjRfdCBtYXhfb2Zmc2V0LCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQ29uZmlnICZjb25maWcpIHsKLSAgcmV0dXJuIHNpemVvZih1aW50NjRfdCkgKiAoMSAvKiBoZWFkZXIgKi8gKyBBcnJheUNvdW50KG1heF9vZmZzZXQsIG1heF9uZXh0LCBjb25maWcpKSArIDcgLyogOC1ieXRlIGFsaWdubWVudCAqLzsKLX0KLQotdWludDhfdCBBcnJheUJoaWtzaGE6OklubGluZUJpdHModWludDY0X3QgbWF4X29mZnNldCwgdWludDY0X3QgbWF4X25leHQsIGNvbnN0IENvbmZpZyAmY29uZmlnKSB7Ci0gIHJldHVybiB1dGlsOjpSZXF1aXJlZEJpdHMobWF4X25leHQpIC0gQ2hvcEJpdHMobWF4X29mZnNldCwgbWF4X25leHQsIGNvbmZpZyk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgKkFsaWduVG84KHZvaWQgKmZyb20pIHsKLSAgdWludDhfdCAqdmFsID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZnJvbSk7Ci0gIHN0ZDo6c2l6ZV90IHJlbWFpbmRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzaXplX3Q+KHZhbCkgJiA3OwotICBpZiAoIXJlbWFpbmRlcikgcmV0dXJuIHZhbDsKLSAgcmV0dXJuIHZhbCArIDggLSByZW1haW5kZXI7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLUFycmF5Qmhpa3NoYTo6QXJyYXlCaGlrc2hhKHZvaWQgKmJhc2UsIHVpbnQ2NF90IG1heF9vZmZzZXQsIHVpbnQ2NF90IG1heF9uZXh0LCBjb25zdCBDb25maWcgJmNvbmZpZykKLSAgOiBuZXh0X2lubGluZV8odXRpbDo6Qml0c01hc2s6OkJ5Qml0cyhJbmxpbmVCaXRzKG1heF9vZmZzZXQsIG1heF9uZXh0LCBjb25maWcpKSksCi0gICAgb2Zmc2V0X2JlZ2luXyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oQWxpZ25UbzgoYmFzZSkpICsgMSAvKiA4LWJ5dGUgaGVhZGVyICovKSwKLSAgICBvZmZzZXRfZW5kXyhvZmZzZXRfYmVnaW5fICsgQXJyYXlDb3VudChtYXhfb2Zmc2V0LCBtYXhfbmV4dCwgY29uZmlnKSksCi0gICAgd3JpdGVfdG9fKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPihBbGlnblRvOChiYXNlKSkgKyAxIC8qIDgtYnl0ZSBoZWFkZXIgKi8gKyAxIC8qIGZpcnN0IGVudHJ5IGlzIDAgKi8pLAotICAgIG9yaWdpbmFsX2Jhc2VfKGJhc2UpIHt9Ci0KLXZvaWQgQXJyYXlCaGlrc2hhOjpGaW5pc2hlZExvYWRpbmcoY29uc3QgQ29uZmlnICZjb25maWcpIHsKLSAgLy8gKm9mZnNldF9iZWdpbl8gPSAwIGJ1dCB3aXRob3V0IGEgY29uc3RfY2FzdC4KLSAgKih3cml0ZV90b18gLSAod3JpdGVfdG9fIC0gb2Zmc2V0X2JlZ2luXykpID0gMDsKLQotICBpZiAod3JpdGVfdG9fICE9IG9mZnNldF9lbmRfKSBVVElMX1RIUk9XKHV0aWw6OkV4Y2VwdGlvbiwgIkRpZCBub3QgZ2V0IGFsbCB0aGUgYXJyYXkgZW50cmllcyB0aGF0IHdlcmUgZXhwZWN0ZWQuIik7Ci0KLSAgdWludDhfdCAqaGVhZF93cml0ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG9yaWdpbmFsX2Jhc2VfKTsKLSAgKihoZWFkX3dyaXRlKyspID0ga0FycmF5Qmhpa3NoYVZlcnNpb247Ci0gICooaGVhZF93cml0ZSsrKSA9IGNvbmZpZy5wb2ludGVyX2JoaWtzaGFfYml0czsKLX0KLQotfSAvLyBuYW1lc3BhY2UgdHJpZQotfSAvLyBuYW1lc3BhY2UgbmdyYW0KLX0gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYmhpa3NoYS5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9iaGlrc2hhLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzRiZWIyLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9iaGlrc2hhLmhoCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZgotICogQGlucHJvY2VlZGluZ3N7Ymhpa3NoYWNvbXByZXNzaW9uLAotICogIGF1dGhvcj17Qmhpa3NoYSBSYWogYW5kIEVkIFdoaXR0YWtlcn0sCi0gKiAgeWVhcj17MjAwM30sCi0gKiAgdGl0bGU9e0xvc3NsZXNzIENvbXByZXNzaW9uIG9mIExhbmd1YWdlIE1vZGVsIFN0cnVjdHVyZSBhbmQgV29yZCBJZGVudGlmaWVyc30sCi0gKiAgYm9va3RpdGxlPXtQcm9jZWVkaW5ncyBvZiBJRUVFIEludGVybmF0aW9uYWwgQ29uZmVyZW5jZSBvbiBBY291c3RpY3MsIFNwZWVjaCBhbmQgU2lnbmFsIFByb2Nlc3Npbmd9LAotICogIHBhZ2VzPXszODgtLTM5MX0sCi0gKiAgfQotICoKLSAqICBDdXJyZW50bHkgb25seSB1c2VkIGZvciBuZXh0IHBvaW50ZXJzLiAgCi0gKi8KLQotI2lmbmRlZiBMTV9CSElLU0hBX0gKLSNkZWZpbmUgTE1fQkhJS1NIQV9ICi0KLSNpbmNsdWRlICJsbS9tb2RlbF90eXBlLmhoIgotI2luY2x1ZGUgImxtL3RyaWUuaGgiCi0jaW5jbHVkZSAidXRpbC9iaXRfcGFja2luZy5oaCIKLSNpbmNsdWRlICJ1dGlsL3NvcnRlZF91bmlmb3JtLmhoIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgbmdyYW0gewotc3RydWN0IENvbmZpZzsKLWNsYXNzIEJpbmFyeUZvcm1hdDsKLQotbmFtZXNwYWNlIHRyaWUgewotCi1jbGFzcyBEb250Qmhpa3NoYSB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgTW9kZWxUeXBlIGtNb2RlbFR5cGVBZGQgPSBzdGF0aWNfY2FzdDxNb2RlbFR5cGU+KDApOwotCi0gICAgc3RhdGljIHZvaWQgVXBkYXRlQ29uZmlnRnJvbUJpbmFyeShjb25zdCBCaW5hcnlGb3JtYXQgJiwgdWludDY0X3QsIENvbmZpZyAmLypjb25maWcqLykge30KLQotICAgIHN0YXRpYyB1aW50NjRfdCBTaXplKHVpbnQ2NF90IC8qbWF4X29mZnNldCovLCB1aW50NjRfdCAvKm1heF9uZXh0Ki8sIGNvbnN0IENvbmZpZyAmLypjb25maWcqLykgeyByZXR1cm4gMDsgfQotCi0gICAgc3RhdGljIHVpbnQ4X3QgSW5saW5lQml0cyh1aW50NjRfdCAvKm1heF9vZmZzZXQqLywgdWludDY0X3QgbWF4X25leHQsIGNvbnN0IENvbmZpZyAmLypjb25maWcqLykgewotICAgICAgcmV0dXJuIHV0aWw6OlJlcXVpcmVkQml0cyhtYXhfbmV4dCk7Ci0gICAgfQotCi0gICAgRG9udEJoaWtzaGEoY29uc3Qgdm9pZCAqYmFzZSwgdWludDY0X3QgbWF4X29mZnNldCwgdWludDY0X3QgbWF4X25leHQsIGNvbnN0IENvbmZpZyAmY29uZmlnKTsKLQotICAgIHZvaWQgUmVhZE5leHQoY29uc3Qgdm9pZCAqYmFzZSwgdWludDY0X3QgYml0X29mZnNldCwgdWludDY0X3QgLyppbmRleCovLCB1aW50OF90IHRvdGFsX2JpdHMsIE5vZGVSYW5nZSAmb3V0KSBjb25zdCB7Ci0gICAgICBvdXQuYmVnaW4gPSB1dGlsOjpSZWFkSW50NTcoYmFzZSwgYml0X29mZnNldCwgbmV4dF8uYml0cywgbmV4dF8ubWFzayk7Ci0gICAgICBvdXQuZW5kID0gdXRpbDo6UmVhZEludDU3KGJhc2UsIGJpdF9vZmZzZXQgKyB0b3RhbF9iaXRzLCBuZXh0Xy5iaXRzLCBuZXh0Xy5tYXNrKTsKLSAgICAgIC8vYXNzZXJ0KG91dC5lbmQgPj0gb3V0LmJlZ2luKTsKLSAgICB9Ci0KLSAgICB2b2lkIFdyaXRlTmV4dCh2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2Zmc2V0LCB1aW50NjRfdCAvKmluZGV4Ki8sIHVpbnQ2NF90IHZhbHVlKSB7Ci0gICAgICB1dGlsOjpXcml0ZUludDU3KGJhc2UsIGJpdF9vZmZzZXQsIG5leHRfLmJpdHMsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICB2b2lkIEZpbmlzaGVkTG9hZGluZyhjb25zdCBDb25maWcgJi8qY29uZmlnKi8pIHt9Ci0KLSAgICB1aW50OF90IElubGluZUJpdHMoKSBjb25zdCB7IHJldHVybiBuZXh0Xy5iaXRzOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICB1dGlsOjpCaXRzTWFzayBuZXh0XzsKLX07Ci0KLWNsYXNzIEFycmF5Qmhpa3NoYSB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgTW9kZWxUeXBlIGtNb2RlbFR5cGVBZGQgPSBrQXJyYXlBZGQ7Ci0KLSAgICBzdGF0aWMgdm9pZCBVcGRhdGVDb25maWdGcm9tQmluYXJ5KGNvbnN0IEJpbmFyeUZvcm1hdCAmZmlsZSwgdWludDY0X3Qgb2Zmc2V0LCBDb25maWcgJmNvbmZpZyk7Ci0KLSAgICBzdGF0aWMgdWludDY0X3QgU2l6ZSh1aW50NjRfdCBtYXhfb2Zmc2V0LCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQ29uZmlnICZjb25maWcpOwotCi0gICAgc3RhdGljIHVpbnQ4X3QgSW5saW5lQml0cyh1aW50NjRfdCBtYXhfb2Zmc2V0LCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQ29uZmlnICZjb25maWcpOwotCi0gICAgQXJyYXlCaGlrc2hhKHZvaWQgKmJhc2UsIHVpbnQ2NF90IG1heF9vZmZzZXQsIHVpbnQ2NF90IG1heF92YWx1ZSwgY29uc3QgQ29uZmlnICZjb25maWcpOwotCi0gICAgdm9pZCBSZWFkTmV4dChjb25zdCB2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2Zmc2V0LCB1aW50NjRfdCBpbmRleCwgdWludDhfdCB0b3RhbF9iaXRzLCBOb2RlUmFuZ2UgJm91dCkgY29uc3QgewotICAgICAgLy8gU29tZSBhc3NlcnRpb25zIGFyZSBjb21tZW50ZWQgb3V0IGJlY2F1c2UgdGhleSBhcmUgZXhwZW5zaXZlLgotICAgICAgLy8gYXNzZXJ0KCpvZmZzZXRfYmVnaW5fID09IDApOwotICAgICAgLy8gc3RkOjp1cHBlcl9ib3VuZCByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgZ3JlYXRlci4gIFdhbnQgdGhlCi0gICAgICAvLyBsYXN0IGVsZW1lbnQgdGhhdCBpcyA8PSB0byB0aGUgaW5kZXguCi0gICAgICBjb25zdCB1aW50NjRfdCAqYmVnaW5faXQgPSBzdGQ6OnVwcGVyX2JvdW5kKG9mZnNldF9iZWdpbl8sIG9mZnNldF9lbmRfLCBpbmRleCkgLSAxOwotICAgICAgLy8gU2luY2UgKm9mZnNldF9iZWdpbl8gPT0gMCwgdGhlIHBvc2l0aW9uIHNob3VsZCBiZSBpbiByYW5nZS4KLSAgICAgIC8vIGFzc2VydChiZWdpbl9pdCA+PSBvZmZzZXRfYmVnaW5fKTsKLSAgICAgIGNvbnN0IHVpbnQ2NF90ICplbmRfaXQ7Ci0gICAgICBmb3IgKGVuZF9pdCA9IGJlZ2luX2l0ICsgMTsgKGVuZF9pdCA8IG9mZnNldF9lbmRfKSAmJiAoKmVuZF9pdCA8PSBpbmRleCArIDEpOyArK2VuZF9pdCkge30KLSAgICAgIC8vIGFzc2VydChlbmRfaXQgPT0gc3RkOjp1cHBlcl9ib3VuZChvZmZzZXRfYmVnaW5fLCBvZmZzZXRfZW5kXywgaW5kZXggKyAxKSk7Ci0gICAgICAtLWVuZF9pdDsKLSAgICAgIC8vIGFzc2VydChlbmRfaXQgPj0gYmVnaW5faXQpOwotICAgICAgb3V0LmJlZ2luID0gKChiZWdpbl9pdCAtIG9mZnNldF9iZWdpbl8pIDw8IG5leHRfaW5saW5lXy5iaXRzKSB8IAotICAgICAgICB1dGlsOjpSZWFkSW50NTcoYmFzZSwgYml0X29mZnNldCwgbmV4dF9pbmxpbmVfLmJpdHMsIG5leHRfaW5saW5lXy5tYXNrKTsKLSAgICAgIG91dC5lbmQgPSAoKGVuZF9pdCAtIG9mZnNldF9iZWdpbl8pIDw8IG5leHRfaW5saW5lXy5iaXRzKSB8IAotICAgICAgICB1dGlsOjpSZWFkSW50NTcoYmFzZSwgYml0X29mZnNldCArIHRvdGFsX2JpdHMsIG5leHRfaW5saW5lXy5iaXRzLCBuZXh0X2lubGluZV8ubWFzayk7Ci0gICAgICAvLyBJZiB0aGlzIGZhaWxzLCBjb25zaWRlciByZWJ1aWxkaW5nIHlvdXIgbW9kZWwgdXNpbmcgS2VuTE0gYWZ0ZXIgMWUzMzNkNzg2Yjc0ODU1NWU4ZjM2OGQyYmJiYTI5YTAxNmM5ODA1MgotICAgICAgYXNzZXJ0KG91dC5lbmQgPj0gb3V0LmJlZ2luKTsKLSAgICB9Ci0KLSAgICB2b2lkIFdyaXRlTmV4dCh2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2Zmc2V0LCB1aW50NjRfdCBpbmRleCwgdWludDY0X3QgdmFsdWUpIHsKLSAgICAgIHVpbnQ2NF90IGVuY29kZSA9IHZhbHVlID4+IG5leHRfaW5saW5lXy5iaXRzOwotICAgICAgZm9yICg7IHdyaXRlX3RvXyA8PSBvZmZzZXRfYmVnaW5fICsgZW5jb2RlOyArK3dyaXRlX3RvXykgKndyaXRlX3RvXyA9IGluZGV4OwotICAgICAgdXRpbDo6V3JpdGVJbnQ1NyhiYXNlLCBiaXRfb2Zmc2V0LCBuZXh0X2lubGluZV8uYml0cywgdmFsdWUgJiBuZXh0X2lubGluZV8ubWFzayk7Ci0gICAgfQotCi0gICAgdm9pZCBGaW5pc2hlZExvYWRpbmcoY29uc3QgQ29uZmlnICZjb25maWcpOwotCi0gICAgdWludDhfdCBJbmxpbmVCaXRzKCkgY29uc3QgeyByZXR1cm4gbmV4dF9pbmxpbmVfLmJpdHM7IH0KLQotICBwcml2YXRlOgotICAgIGNvbnN0IHV0aWw6OkJpdHNNYXNrIG5leHRfaW5saW5lXzsKLQotICAgIGNvbnN0IHVpbnQ2NF90ICpjb25zdCBvZmZzZXRfYmVnaW5fOwotICAgIGNvbnN0IHVpbnQ2NF90ICpjb25zdCBvZmZzZXRfZW5kXzsKLQotICAgIHVpbnQ2NF90ICp3cml0ZV90b187Ci0KLSAgICB2b2lkICpvcmlnaW5hbF9iYXNlXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHRyaWUKLX0gLy8gbmFtZXNwYWNlIG5ncmFtCi19IC8vIG5hbWVzcGFjZSBsbQotCi0jZW5kaWYgLy8gTE1fQkhJS1NIQV9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYmluYXJ5X2Zvcm1hdC5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9iaW5hcnlfZm9ybWF0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODExNzQwLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9iaW5hcnlfZm9ybWF0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLSNpbmNsdWRlICJsbS9iaW5hcnlfZm9ybWF0LmhoIgotCi0jaW5jbHVkZSAibG0vbG1fZXhjZXB0aW9uLmhoIgotI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKLSNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxjc3RkbGliPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgbmdyYW0gewotCi1jb25zdCBjaGFyICprTW9kZWxOYW1lc1s2XSA9IHsicHJvYmluZyBoYXNoIHRhYmxlcyIsICJwcm9iaW5nIGhhc2ggdGFibGVzIHdpdGggcmVzdCBjb3N0cyIsICJ0cmllIiwgInRyaWUgd2l0aCBxdWFudGl6YXRpb24iLCAidHJpZSB3aXRoIGFycmF5LWNvbXByZXNzZWQgcG9pbnRlcnMiLCAidHJpZSB3aXRoIHF1YW50aXphdGlvbiBhbmQgYXJyYXktY29tcHJlc3NlZCBwb2ludGVycyJ9OwotCi1uYW1lc3BhY2UgewotY29uc3QgY2hhciBrTWFnaWNCZWZvcmVWZXJzaW9uW10gPSAibW1hcCBsbSBodHRwOi8va2hlYWZpZWxkLmNvbS9jb2RlIGZvcm1hdCB2ZXJzaW9uIjsKLWNvbnN0IGNoYXIga01hZ2ljQnl0ZXNbXSA9ICJtbWFwIGxtIGh0dHA6Ly9raGVhZmllbGQuY29tL2NvZGUgZm9ybWF0IHZlcnNpb24gNVxuXDAiOwotLy8gVGhpcyBtdXN0IGJlIHNob3J0ZXIgdGhhbiBrTWFnaWNCeXRlcyBhbmQgaW5kaWNhdGVzIGFuIGluY29tcGxldGUgYmluYXJ5IGZpbGUgKGkuZS4gYnVpbGQgZmFpbGVkKS4KLWNvbnN0IGNoYXIga01hZ2ljSW5jb21wbGV0ZVtdID0gIm1tYXAgbG0gaHR0cDovL2toZWFmaWVsZC5jb20vY29kZSBpbmNvbXBsZXRlXG4iOwotY29uc3QgbG9uZyBpbnQga01hZ2ljVmVyc2lvbiA9IDU7Ci0KLS8vIE9sZCBiaW5hcnkgZmlsZXMgYnVpbHQgb24gMzItYml0IG1hY2hpbmVzIGhhdmUgdGhpcyBoZWFkZXIuCi0vLyBUT0RPOiBlbGltaW5hdGUgd2l0aCBuZXh0IGJpbmFyeSByZWxlYXNlLgotc3RydWN0IE9sZFNhbml0eSB7Ci0gIGNoYXIgbWFnaWNbc2l6ZW9mKGtNYWdpY0J5dGVzKV07Ci0gIGZsb2F0IHplcm9fZiwgb25lX2YsIG1pbnVzX2hhbGZfZjsKLSAgV29yZEluZGV4IG9uZV93b3JkX2luZGV4LCBtYXhfd29yZF9pbmRleDsKLSAgdWludDY0X3Qgb25lX3VpbnQ2NDsKLQotICB2b2lkIFNldFRvUmVmZXJlbmNlKCkgewotICAgIHN0ZDo6bWVtc2V0KHRoaXMsIDAsIHNpemVvZihPbGRTYW5pdHkpKTsKLSAgICBzdGQ6Om1lbWNweShtYWdpYywga01hZ2ljQnl0ZXMsIHNpemVvZihtYWdpYykpOwotICAgIHplcm9fZiA9IDAuMDsgb25lX2YgPSAxLjA7IG1pbnVzX2hhbGZfZiA9IC0wLjU7Ci0gICAgb25lX3dvcmRfaW5kZXggPSAxOwotICAgIG1heF93b3JkX2luZGV4ID0gc3RkOjpudW1lcmljX2xpbWl0czxXb3JkSW5kZXg+OjptYXgoKTsKLSAgICBvbmVfdWludDY0ID0gMTsKLSAgfQotfTsKLQotCi0vLyBUZXN0IHZhbHVlcyBhbGlnbmVkIHRvIDggYnl0ZXMuCi1zdHJ1Y3QgU2FuaXR5IHsKLSAgY2hhciBtYWdpY1tBTElHTjgoc2l6ZW9mKGtNYWdpY0J5dGVzKSldOwotICBmbG9hdCB6ZXJvX2YsIG9uZV9mLCBtaW51c19oYWxmX2Y7Ci0gIFdvcmRJbmRleCBvbmVfd29yZF9pbmRleCwgbWF4X3dvcmRfaW5kZXgsIHBhZGRpbmdfdG9fODsKLSAgdWludDY0X3Qgb25lX3VpbnQ2NDsKLQotICB2b2lkIFNldFRvUmVmZXJlbmNlKCkgewotICAgIHN0ZDo6bWVtc2V0KHRoaXMsIDAsIHNpemVvZihTYW5pdHkpKTsKLSAgICBzdGQ6Om1lbWNweShtYWdpYywga01hZ2ljQnl0ZXMsIHNpemVvZihrTWFnaWNCeXRlcykpOwotICAgIHplcm9fZiA9IDAuMDsgb25lX2YgPSAxLjA7IG1pbnVzX2hhbGZfZiA9IC0wLjU7Ci0gICAgb25lX3dvcmRfaW5kZXggPSAxOwotICAgIG1heF93b3JkX2luZGV4ID0gc3RkOjpudW1lcmljX2xpbWl0czxXb3JkSW5kZXg+OjptYXgoKTsKLSAgICBwYWRkaW5nX3RvXzggPSAwOwotICAgIG9uZV91aW50NjQgPSAxOwotICB9Ci19OwotCi1zdGQ6OnNpemVfdCBUb3RhbEhlYWRlclNpemUodW5zaWduZWQgY2hhciBvcmRlcikgewotICByZXR1cm4gQUxJR044KHNpemVvZihTYW5pdHkpICsgc2l6ZW9mKEZpeGVkV2lkdGhQYXJhbWV0ZXJzKSArIHNpemVvZih1aW50NjRfdCkgKiBvcmRlcik7Ci19Ci0KLXZvaWQgV3JpdGVIZWFkZXIodm9pZCAqdG8sIGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcykgewotICBTYW5pdHkgaGVhZGVyID0gU2FuaXR5KCk7Ci0gIGhlYWRlci5TZXRUb1JlZmVyZW5jZSgpOwotICBzdGQ6Om1lbWNweSh0bywgJmhlYWRlciwgc2l6ZW9mKFNhbml0eSkpOwotICBjaGFyICpvdXQgPSByZWludGVycHJldF9jYXN0PGNoYXIqPih0bykgKyBzaXplb2YoU2FuaXR5KTsKLQotICAqcmVpbnRlcnByZXRfY2FzdDxGaXhlZFdpZHRoUGFyYW1ldGVycyo+KG91dCkgPSBwYXJhbXMuZml4ZWQ7Ci0gIG91dCArPSBzaXplb2YoRml4ZWRXaWR0aFBhcmFtZXRlcnMpOwotCi0gIHVpbnQ2NF90ICpjb3VudHMgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90Kj4ob3V0KTsKLSAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5jb3VudHMuc2l6ZSgpOyArK2kpIHsKLSAgICBjb3VudHNbaV0gPSBwYXJhbXMuY291bnRzW2ldOwotICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLWJvb2wgSXNCaW5hcnlGb3JtYXQoaW50IGZkKSB7Ci0gIGNvbnN0IHVpbnQ2NF90IHNpemUgPSB1dGlsOjpTaXplRmlsZShmZCk7Ci0gIGlmIChzaXplID09IHV0aWw6OmtCYWRTaXplIHx8IChzaXplIDw9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzaXplb2YoU2FuaXR5KSkpKSByZXR1cm4gZmFsc2U7Ci0gIC8vIFRyeSByZWFkaW5nIHRoZSBoZWFkZXIuCi0gIHV0aWw6OnNjb3BlZF9tZW1vcnkgbWVtb3J5OwotICB0cnkgewotICAgIHV0aWw6Ok1hcFJlYWQodXRpbDo6TEFaWSwgZmQsIDAsIHNpemVvZihTYW5pdHkpLCBtZW1vcnkpOwotICB9IGNhdGNoIChjb25zdCB1dGlsOjpFeGNlcHRpb24gJmUpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgU2FuaXR5IHJlZmVyZW5jZV9oZWFkZXIgPSBTYW5pdHkoKTsKLSAgcmVmZXJlbmNlX2hlYWRlci5TZXRUb1JlZmVyZW5jZSgpOwotICBpZiAoIXN0ZDo6bWVtY21wKG1lbW9yeS5nZXQoKSwgJnJlZmVyZW5jZV9oZWFkZXIsIHNpemVvZihTYW5pdHkpKSkgcmV0dXJuIHRydWU7Ci0gIGlmICghc3RkOjptZW1jbXAobWVtb3J5LmdldCgpLCBrTWFnaWNJbmNvbXBsZXRlLCBzdHJsZW4oa01hZ2ljSW5jb21wbGV0ZSkpKSB7Ci0gICAgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiVGhpcyBiaW5hcnkgZmlsZSBkaWQgbm90IGZpbmlzaCBidWlsZGluZyIpOwotICB9Ci0gIGlmICghc3RkOjptZW1jbXAobWVtb3J5LmdldCgpLCBrTWFnaWNCZWZvcmVWZXJzaW9uLCBzdHJsZW4oa01hZ2ljQmVmb3JlVmVyc2lvbikpKSB7Ci0gICAgY2hhciAqZW5kX3B0cjsKLSAgICBjb25zdCBjaGFyICpiZWdpbl92ZXJzaW9uID0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KG1lbW9yeS5nZXQoKSkgKyBzdHJsZW4oa01hZ2ljQmVmb3JlVmVyc2lvbik7Ci0gICAgbG9uZyBpbnQgdmVyc2lvbiA9IHN0ZDo6c3RydG9sKGJlZ2luX3ZlcnNpb24sICZlbmRfcHRyLCAxMCk7Ci0gICAgaWYgKChlbmRfcHRyICE9IGJlZ2luX3ZlcnNpb24pICYmIHZlcnNpb24gIT0ga01hZ2ljVmVyc2lvbikgewotICAgICAgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiQmluYXJ5IGZpbGUgaGFzIHZlcnNpb24gIiA8PCB2ZXJzaW9uIDw8ICIgYnV0IHRoaXMgaW1wbGVtZW50YXRpb24gZXhwZWN0cyB2ZXJzaW9uICIgPDwga01hZ2ljVmVyc2lvbiA8PCAiIHNvIHlvdSdsbCBoYXZlIHRvIHVzZSB0aGUgQVJQQSB0byByZWJ1aWxkIHlvdXIgYmluYXJ5Iik7Ci0gICAgfQotCi0gICAgT2xkU2FuaXR5IG9sZF9zYW5pdHkgPSBPbGRTYW5pdHkoKTsKLSAgICBvbGRfc2FuaXR5LlNldFRvUmVmZXJlbmNlKCk7Ci0gICAgVVRJTF9USFJPV19JRighc3RkOjptZW1jbXAobWVtb3J5LmdldCgpLCAmb2xkX3Nhbml0eSwgc2l6ZW9mKE9sZFNhbml0eSkpLCBGb3JtYXRMb2FkRXhjZXB0aW9uLCAiTG9va3MgbGlrZSB0aGlzIGlzIGFuIG9sZCAzMi1iaXQgZm9ybWF0LiAgVGhlIG9sZCAzMi1iaXQgZm9ybWF0IGhhcyBiZWVuIHJlbW92ZWQgc28gdGhhdCA2NC1iaXQgYW5kIDMyLWJpdCBmaWxlcyBhcmUgZXhjaGFuZ2VhYmxlLiIpOwotICAgIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIkZpbGUgbG9va3MgbGlrZSBpdCBzaG91bGQgYmUgbG9hZGVkIHdpdGggbW1hcCwgYnV0IHRoZSB0ZXN0IHZhbHVlcyBkb24ndCBtYXRjaC4gIFRyeSByZWJ1aWxkaW5nIHRoZSBiaW5hcnkgZm9ybWF0IExNIHVzaW5nIHRoZSBzYW1lIGNvZGUgcmV2aXNpb24sIGNvbXBpbGVyLCBhbmQgYXJjaGl0ZWN0dXJlIik7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFJlYWRIZWFkZXIoaW50IGZkLCBQYXJhbWV0ZXJzICZvdXQpIHsKLSAgdXRpbDo6U2Vla09yVGhyb3coZmQsIHNpemVvZihTYW5pdHkpKTsKLSAgdXRpbDo6UmVhZE9yVGhyb3coZmQsICZvdXQuZml4ZWQsIHNpemVvZihvdXQuZml4ZWQpKTsKLSAgaWYgKG91dC5maXhlZC5wcm9iaW5nX211bHRpcGxpZXIgPCAxLjApCi0gICAgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiQmluYXJ5IGZvcm1hdCBjbGFpbXMgdG8gaGF2ZSBhIHByb2JpbmcgbXVsdGlwbGllciBvZiAiIDw8IG91dC5maXhlZC5wcm9iaW5nX211bHRpcGxpZXIgPDwgIiB3aGljaCBpcyA8IDEuMC4iKTsKLQotICBvdXQuY291bnRzLnJlc2l6ZShzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4ob3V0LmZpeGVkLm9yZGVyKSk7Ci0gIGlmIChvdXQuZml4ZWQub3JkZXIpIHV0aWw6OlJlYWRPclRocm93KGZkLCAmKm91dC5jb3VudHMuYmVnaW4oKSwgc2l6ZW9mKHVpbnQ2NF90KSAqIG91dC5maXhlZC5vcmRlcik7Ci19Ci0KLXZvaWQgTWF0Y2hDaGVjayhNb2RlbFR5cGUgbW9kZWxfdHlwZSwgdW5zaWduZWQgaW50IHNlYXJjaF92ZXJzaW9uLCBjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKLSAgaWYgKHBhcmFtcy5maXhlZC5tb2RlbF90eXBlICE9IG1vZGVsX3R5cGUpIHsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihwYXJhbXMuZml4ZWQubW9kZWxfdHlwZSkgPj0gKHNpemVvZihrTW9kZWxOYW1lcykgLyBzaXplb2YoY29uc3QgY2hhciAqKSkpCi0gICAgICBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJUaGUgYmluYXJ5IGZpbGUgY2xhaW1zIHRvIGJlIG1vZGVsIHR5cGUgIiA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHBhcmFtcy5maXhlZC5tb2RlbF90eXBlKSA8PCAiIGJ1dCB0aGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgaW4gdGhpcyBpbmZlcmVuY2UgY29kZS4iKTsKLSAgICBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJUaGUgYmluYXJ5IGZpbGUgd2FzIGJ1aWx0IGZvciAiIDw8IGtNb2RlbE5hbWVzW3BhcmFtcy5maXhlZC5tb2RlbF90eXBlXSA8PCAiIGJ1dCB0aGUgaW5mZXJlbmNlIGNvZGUgaXMgdHJ5aW5nIHRvIGxvYWQgIiA8PCBrTW9kZWxOYW1lc1ttb2RlbF90eXBlXSk7Ci0gIH0KLSAgVVRJTF9USFJPV19JRihzZWFyY2hfdmVyc2lvbiAhPSBwYXJhbXMuZml4ZWQuc2VhcmNoX3ZlcnNpb24sIEZvcm1hdExvYWRFeGNlcHRpb24sICJUaGUgYmluYXJ5IGZpbGUgaGFzICIgPDwga01vZGVsTmFtZXNbcGFyYW1zLmZpeGVkLm1vZGVsX3R5cGVdIDw8ICIgdmVyc2lvbiAiIDw8IHBhcmFtcy5maXhlZC5zZWFyY2hfdmVyc2lvbiA8PCAiIGJ1dCB0aGlzIGNvZGUgZXhwZWN0cyAiIDw8IGtNb2RlbE5hbWVzW3BhcmFtcy5maXhlZC5tb2RlbF90eXBlXSA8PCAiIHZlcnNpb24gIiA8PCBzZWFyY2hfdmVyc2lvbik7Ci19Ci0KLWNvbnN0IHN0ZDo6c2l6ZV90IGtJbnZhbGlkU2l6ZSA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PigtMSk7Ci0KLUJpbmFyeUZvcm1hdDo6QmluYXJ5Rm9ybWF0KGNvbnN0IENvbmZpZyAmY29uZmlnKSAKLSAgOiB3cml0ZV9tZXRob2RfKGNvbmZpZy53cml0ZV9tZXRob2QpLCB3cml0ZV9tbWFwXyhjb25maWcud3JpdGVfbW1hcCksIGxvYWRfbWV0aG9kXyhjb25maWcubG9hZF9tZXRob2QpLAotICAgIGhlYWRlcl9zaXplXyhrSW52YWxpZFNpemUpLCB2b2NhYl9zaXplXyhrSW52YWxpZFNpemUpLCB2b2NhYl9zdHJpbmdfb2Zmc2V0XyhrSW52YWxpZE9mZnNldCkge30KLQotdm9pZCBCaW5hcnlGb3JtYXQ6OkluaXRpYWxpemVCaW5hcnkoaW50IGZkLCBNb2RlbFR5cGUgbW9kZWxfdHlwZSwgdW5zaWduZWQgaW50IHNlYXJjaF92ZXJzaW9uLCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKLSAgZmlsZV8ucmVzZXQoZmQpOwotICB3cml0ZV9tbWFwXyA9IE5VTEw7IC8vIElnbm9yZSB3cml0ZSByZXF1ZXN0czsgdGhpcyBpcyBhbHJlYWR5IGluIGJpbmFyeSBmb3JtYXQuCi0gIFJlYWRIZWFkZXIoZmQsIHBhcmFtcyk7Ci0gIE1hdGNoQ2hlY2sobW9kZWxfdHlwZSwgc2VhcmNoX3ZlcnNpb24sIHBhcmFtcyk7Ci0gIGhlYWRlcl9zaXplXyA9IFRvdGFsSGVhZGVyU2l6ZShwYXJhbXMuY291bnRzLnNpemUoKSk7Ci19Ci0KLXZvaWQgQmluYXJ5Rm9ybWF0OjpSZWFkRm9yQ29uZmlnKHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQsIHVpbnQ2NF90IG9mZnNldF9leGNsdWRpbmdfaGVhZGVyKSBjb25zdCB7Ci0gIGFzc2VydChoZWFkZXJfc2l6ZV8gIT0ga0ludmFsaWRTaXplKTsKLSAgdXRpbDo6RXJzYXR6UFJlYWQoZmlsZV8uZ2V0KCksIHRvLCBhbW91bnQsIG9mZnNldF9leGNsdWRpbmdfaGVhZGVyICsgaGVhZGVyX3NpemVfKTsKLX0KLQotdm9pZCAqQmluYXJ5Rm9ybWF0OjpMb2FkQmluYXJ5KHN0ZDo6c2l6ZV90IHNpemUpIHsKLSAgYXNzZXJ0KGhlYWRlcl9zaXplXyAhPSBrSW52YWxpZFNpemUpOwotICBjb25zdCB1aW50NjRfdCBmaWxlX3NpemUgPSB1dGlsOjpTaXplRmlsZShmaWxlXy5nZXQoKSk7Ci0gIC8vIFRoZSBoZWFkZXIgaXMgc21hbGxlciB0aGFuIGEgcGFnZSwgc28gd2UgaGF2ZSB0byBtYXAgdGhlIHdob2xlIGhlYWRlciBhcyB3ZWxsLgotICB1aW50NjRfdCB0b3RhbF9tYXAgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oaGVhZGVyX3NpemVfKSArIHN0YXRpY19jYXN0PHVpbnQ2NF90PihzaXplKTsKLSAgVVRJTF9USFJPV19JRihmaWxlX3NpemUgIT0gdXRpbDo6a0JhZFNpemUgJiYgZmlsZV9zaXplIDwgdG90YWxfbWFwLCBGb3JtYXRMb2FkRXhjZXB0aW9uLCAiQmluYXJ5IGZpbGUgaGFzIHNpemUgIiA8PCBmaWxlX3NpemUgPDwgIiBidXQgdGhlIGhlYWRlcnMgc2F5IGl0IHNob3VsZCBiZSBhdCBsZWFzdCAiIDw8IHRvdGFsX21hcCk7Ci0KLSAgdXRpbDo6TWFwUmVhZChsb2FkX21ldGhvZF8sIGZpbGVfLmdldCgpLCAwLCB1dGlsOjpDaGVja092ZXJmbG93KHRvdGFsX21hcCksIG1hcHBpbmdfKTsKLQotICB2b2NhYl9zdHJpbmdfb2Zmc2V0XyA9IHRvdGFsX21hcDsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1hcHBpbmdfLmdldCgpKSArIGhlYWRlcl9zaXplXzsKLX0KLQotdm9pZCAqQmluYXJ5Rm9ybWF0OjpTZXR1cEp1c3RWb2NhYihzdGQ6OnNpemVfdCBtZW1vcnlfc2l6ZSwgdWludDhfdCBvcmRlcikgewotICB2b2NhYl9zaXplXyA9IG1lbW9yeV9zaXplOwotICBpZiAoIXdyaXRlX21tYXBfKSB7Ci0gICAgaGVhZGVyX3NpemVfID0gMDsKLSAgICB1dGlsOjpNYXBBbm9ueW1vdXMobWVtb3J5X3NpemUsIG1lbW9yeV92b2NhYl8pOwotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtZW1vcnlfdm9jYWJfLmdldCgpKTsKLSAgfQotICBoZWFkZXJfc2l6ZV8gPSBUb3RhbEhlYWRlclNpemUob3JkZXIpOwotICBzdGQ6OnNpemVfdCB0b3RhbCA9IHV0aWw6OkNoZWNrT3ZlcmZsb3coc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGhlYWRlcl9zaXplXykgKyBzdGF0aWNfY2FzdDx1aW50NjRfdD4obWVtb3J5X3NpemUpKTsKLSAgZmlsZV8ucmVzZXQodXRpbDo6Q3JlYXRlT3JUaHJvdyh3cml0ZV9tbWFwXykpOwotICAvLyBzb21lIGdjY3MgY29tcGxhaW4gYWJvdXQgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgZXZlbiB0aG91Z2ggYWxsIGVudW0gdmFsdWVzIGFyZSBjb3ZlcmVkLgotICB2b2lkICp2b2NhYl9iYXNlID0gTlVMTDsKLSAgc3dpdGNoICh3cml0ZV9tZXRob2RfKSB7Ci0gICAgY2FzZSBDb25maWc6OldSSVRFX01NQVA6Ci0gICAgICBtYXBwaW5nXy5yZXNldCh1dGlsOjpNYXBaZXJvZWRXcml0ZShmaWxlXy5nZXQoKSwgdG90YWwpLCB0b3RhbCwgdXRpbDo6c2NvcGVkX21lbW9yeTo6TU1BUF9BTExPQ0FURUQpOwotICAgICAgdm9jYWJfYmFzZSA9IG1hcHBpbmdfLmdldCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb25maWc6OldSSVRFX0FGVEVSOgotICAgICAgdXRpbDo6UmVzaXplT3JUaHJvdyhmaWxlXy5nZXQoKSwgMCk7Ci0gICAgICB1dGlsOjpNYXBBbm9ueW1vdXModG90YWwsIG1lbW9yeV92b2NhYl8pOwotICAgICAgdm9jYWJfYmFzZSA9IG1lbW9yeV92b2NhYl8uZ2V0KCk7Ci0gICAgICBicmVhazsKLSAgfQotICBzdHJuY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHZvY2FiX2Jhc2UpLCBrTWFnaWNJbmNvbXBsZXRlLCBoZWFkZXJfc2l6ZV8pOwotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4odm9jYWJfYmFzZSkgKyBoZWFkZXJfc2l6ZV87Ci19Ci0KLXZvaWQgKkJpbmFyeUZvcm1hdDo6R3Jvd0ZvclNlYXJjaChzdGQ6OnNpemVfdCBtZW1vcnlfc2l6ZSwgc3RkOjpzaXplX3Qgdm9jYWJfcGFkLCB2b2lkIComdm9jYWJfYmFzZSkgewotICBhc3NlcnQodm9jYWJfc2l6ZV8gIT0ga0ludmFsaWRTaXplKTsKLSAgdm9jYWJfcGFkXyA9IHZvY2FiX3BhZDsKLSAgc3RkOjpzaXplX3QgbmV3X3NpemUgPSBoZWFkZXJfc2l6ZV8gKyB2b2NhYl9zaXplXyArIHZvY2FiX3BhZF8gKyBtZW1vcnlfc2l6ZTsKLSAgdm9jYWJfc3RyaW5nX29mZnNldF8gPSBuZXdfc2l6ZTsKLSAgaWYgKCF3cml0ZV9tbWFwXyB8fCB3cml0ZV9tZXRob2RfID09IENvbmZpZzo6V1JJVEVfQUZURVIpIHsKLSAgICB1dGlsOjpNYXBBbm9ueW1vdXMobWVtb3J5X3NpemUsIG1lbW9yeV9zZWFyY2hfKTsKLSAgICBhc3NlcnQoaGVhZGVyX3NpemVfID09IDAgfHwgd3JpdGVfbW1hcF8pOwotICAgIHZvY2FiX2Jhc2UgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtZW1vcnlfdm9jYWJfLmdldCgpKSArIGhlYWRlcl9zaXplXzsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obWVtb3J5X3NlYXJjaF8uZ2V0KCkpOwotICB9Ci0KLSAgYXNzZXJ0KHdyaXRlX21ldGhvZF8gPT0gQ29uZmlnOjpXUklURV9NTUFQKTsKLSAgLy8gQWxzbyBrbm93biBhcyB0b3RhbCBzaXplIHdpdGhvdXQgdm9jYWIgd29yZHMuCi0gIC8vIEdyb3cgdGhlIGZpbGUgdG8gYWNjb21vZGF0ZSB0aGUgc2VhcmNoLCB1c2luZyB6ZXJvcy4KLSAgLy8gQWNjb3JkaW5nIHRvIG1hbiBtbWFwLCBiZWhhdmlvciBpcyB1bmRlZmluZWQgd2hlbiB0aGUgZmlsZSBpcyByZXNpemVkCi0gIC8vIHVuZGVybmVhdGggYSBtbWFwIHRoYXQgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZS4gIFNvIHRvIGJlCi0gIC8vIHNhZmUsIHdlJ2xsIHVubWFwIGl0IGFuZCBtYXAgaXQgYWdhaW4uCi0gIG1hcHBpbmdfLnJlc2V0KCk7Ci0gIHV0aWw6OlJlc2l6ZU9yVGhyb3coZmlsZV8uZ2V0KCksIG5ld19zaXplKTsKLSAgdm9pZCAqcmV0OwotICBNYXBGaWxlKHZvY2FiX2Jhc2UsIHJldCk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgQmluYXJ5Rm9ybWF0OjpXcml0ZVZvY2FiV29yZHMoY29uc3Qgc3RkOjpzdHJpbmcgJmJ1ZmZlciwgdm9pZCAqJnZvY2FiX2Jhc2UsIHZvaWQgKiZzZWFyY2hfYmFzZSkgewotICAvLyBDaGVja2luZyBDb25maWcncyBpbmNsdWRlX3ZvY2FiIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyLgotICBhc3NlcnQoaGVhZGVyX3NpemVfICE9IGtJbnZhbGlkU2l6ZSAmJiB2b2NhYl9zaXplXyAhPSBrSW52YWxpZFNpemUpOwotICBpZiAoIXdyaXRlX21tYXBfKSB7Ci0gICAgLy8gVW5jaGFuZ2VkIGJhc2UuCi0gICAgdm9jYWJfYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1lbW9yeV92b2NhYl8uZ2V0KCkpOwotICAgIHNlYXJjaF9iYXNlID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obWVtb3J5X3NlYXJjaF8uZ2V0KCkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAod3JpdGVfbWV0aG9kXyA9PSBDb25maWc6OldSSVRFX01NQVApIHsKLSAgICBtYXBwaW5nXy5yZXNldCgpOwotICB9Ci0gIHV0aWw6OlNlZWtPclRocm93KGZpbGVfLmdldCgpLCBWb2NhYlN0cmluZ1JlYWRpbmdPZmZzZXQoKSk7Ci0gIHV0aWw6OldyaXRlT3JUaHJvdyhmaWxlXy5nZXQoKSwgJmJ1ZmZlclswXSwgYnVmZmVyLnNpemUoKSk7Ci0gIGlmICh3cml0ZV9tZXRob2RfID09IENvbmZpZzo6V1JJVEVfTU1BUCkgewotICAgIE1hcEZpbGUodm9jYWJfYmFzZSwgc2VhcmNoX2Jhc2UpOwotICB9IGVsc2UgewotICAgIHZvY2FiX2Jhc2UgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtZW1vcnlfdm9jYWJfLmdldCgpKSArIGhlYWRlcl9zaXplXzsKLSAgICBzZWFyY2hfYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1lbW9yeV9zZWFyY2hfLmdldCgpKTsKLSAgfQotfQotCi12b2lkIEJpbmFyeUZvcm1hdDo6RmluaXNoRmlsZShjb25zdCBDb25maWcgJmNvbmZpZywgTW9kZWxUeXBlIG1vZGVsX3R5cGUsIHVuc2lnbmVkIGludCBzZWFyY2hfdmVyc2lvbiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMpIHsKLSAgaWYgKCF3cml0ZV9tbWFwXykgcmV0dXJuOwotICBzd2l0Y2ggKHdyaXRlX21ldGhvZF8pIHsKLSAgICBjYXNlIENvbmZpZzo6V1JJVEVfTU1BUDoKLSAgICAgIHV0aWw6OlN5bmNPclRocm93KG1hcHBpbmdfLmdldCgpLCBtYXBwaW5nXy5zaXplKCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb25maWc6OldSSVRFX0FGVEVSOgotICAgICAgdXRpbDo6U2Vla09yVGhyb3coZmlsZV8uZ2V0KCksIDApOwotICAgICAgdXRpbDo6V3JpdGVPclRocm93KGZpbGVfLmdldCgpLCBtZW1vcnlfdm9jYWJfLmdldCgpLCBtZW1vcnlfdm9jYWJfLnNpemUoKSk7Ci0gICAgICB1dGlsOjpTZWVrT3JUaHJvdyhmaWxlXy5nZXQoKSwgaGVhZGVyX3NpemVfICsgdm9jYWJfc2l6ZV8gKyB2b2NhYl9wYWRfKTsKLSAgICAgIHV0aWw6OldyaXRlT3JUaHJvdyhmaWxlXy5nZXQoKSwgbWVtb3J5X3NlYXJjaF8uZ2V0KCksIG1lbW9yeV9zZWFyY2hfLnNpemUoKSk7Ci0gICAgICB1dGlsOjpGU3luY09yVGhyb3coZmlsZV8uZ2V0KCkpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgLy8gaGVhZGVyIGFuZCB2b2NhYiBzaGFyZSB0aGUgc2FtZSBtbWFwLgotICBQYXJhbWV0ZXJzIHBhcmFtcyA9IFBhcmFtZXRlcnMoKTsKLSAgbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihQYXJhbWV0ZXJzKSk7Ci0gIHBhcmFtcy5jb3VudHMgPSBjb3VudHM7Ci0gIHBhcmFtcy5maXhlZC5vcmRlciA9IGNvdW50cy5zaXplKCk7Ci0gIHBhcmFtcy5maXhlZC5wcm9iaW5nX211bHRpcGxpZXIgPSBjb25maWcucHJvYmluZ19tdWx0aXBsaWVyOwotICBwYXJhbXMuZml4ZWQubW9kZWxfdHlwZSA9IG1vZGVsX3R5cGU7Ci0gIHBhcmFtcy5maXhlZC5oYXNfdm9jYWJ1bGFyeSA9IGNvbmZpZy5pbmNsdWRlX3ZvY2FiOwotICBwYXJhbXMuZml4ZWQuc2VhcmNoX3ZlcnNpb24gPSBzZWFyY2hfdmVyc2lvbjsKLSAgc3dpdGNoICh3cml0ZV9tZXRob2RfKSB7Ci0gICAgY2FzZSBDb25maWc6OldSSVRFX01NQVA6Ci0gICAgICBXcml0ZUhlYWRlcihtYXBwaW5nXy5nZXQoKSwgcGFyYW1zKTsKLSAgICAgIHV0aWw6OlN5bmNPclRocm93KG1hcHBpbmdfLmdldCgpLCBtYXBwaW5nXy5zaXplKCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb25maWc6OldSSVRFX0FGVEVSOgotICAgICAgewotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIoVG90YWxIZWFkZXJTaXplKGNvdW50cy5zaXplKCkpKTsKLSAgICAgICAgV3JpdGVIZWFkZXIoJmJ1ZmZlclswXSwgcGFyYW1zKTsKLSAgICAgICAgdXRpbDo6U2Vla09yVGhyb3coZmlsZV8uZ2V0KCksIDApOwotICAgICAgICB1dGlsOjpXcml0ZU9yVGhyb3coZmlsZV8uZ2V0KCksICZidWZmZXJbMF0sIGJ1ZmZlci5zaXplKCkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBCaW5hcnlGb3JtYXQ6Ok1hcEZpbGUodm9pZCAqJnZvY2FiX2Jhc2UsIHZvaWQgKiZzZWFyY2hfYmFzZSkgewotICBtYXBwaW5nXy5yZXNldCh1dGlsOjpNYXBPclRocm93KHZvY2FiX3N0cmluZ19vZmZzZXRfLCB0cnVlLCB1dGlsOjprRmlsZUZsYWdzLCBmYWxzZSwgZmlsZV8uZ2V0KCkpLCB2b2NhYl9zdHJpbmdfb2Zmc2V0XywgdXRpbDo6c2NvcGVkX21lbW9yeTo6TU1BUF9BTExPQ0FURUQpOwotICB2b2NhYl9iYXNlID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obWFwcGluZ18uZ2V0KCkpICsgaGVhZGVyX3NpemVfOwotICBzZWFyY2hfYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1hcHBpbmdfLmdldCgpKSArIGhlYWRlcl9zaXplXyArIHZvY2FiX3NpemVfICsgdm9jYWJfcGFkXzsKLX0KLQotYm9vbCBSZWNvZ25pemVCaW5hcnkoY29uc3QgY2hhciAqZmlsZSwgTW9kZWxUeXBlICZyZWNvZ25pemVkKSB7Ci0gIHV0aWw6OnNjb3BlZF9mZCBmZCh1dGlsOjpPcGVuUmVhZE9yVGhyb3coZmlsZSkpOwotICBpZiAoIUlzQmluYXJ5Rm9ybWF0KGZkLmdldCgpKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBQYXJhbWV0ZXJzIHBhcmFtczsKLSAgUmVhZEhlYWRlcihmZC5nZXQoKSwgcGFyYW1zKTsKLSAgcmVjb2duaXplZCA9IHBhcmFtcy5maXhlZC5tb2RlbF90eXBlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgbmdyYW0KLX0gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYmluYXJ5X2Zvcm1hdC5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9iaW5hcnlfZm9ybWF0LmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZkNmIxLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9iaW5hcnlfZm9ybWF0LmhoCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLSNpZm5kZWYgTE1fQklOQVJZX0ZPUk1BVF9ICi0jZGVmaW5lIExNX0JJTkFSWV9GT1JNQVRfSAotCi0jaW5jbHVkZSAibG0vY29uZmlnLmhoIgotI2luY2x1ZGUgImxtL21vZGVsX3R5cGUuaGgiCi0jaW5jbHVkZSAibG0vcmVhZF9hcnBhLmhoIgotCi0jaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgotI2luY2x1ZGUgInV0aWwvbW1hcC5oaCIKLSNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgbmdyYW0gewotCi1leHRlcm4gY29uc3QgY2hhciAqa01vZGVsTmFtZXNbNl07Ci0KLS8qSW5zcGVjdCBhIGZpbGUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgYmluYXJ5IGxtLiAgSWYgbm90LCByZXR1cm4gZmFsc2UuICAKLSAqIElmIHNvLCByZXR1cm4gdHJ1ZSBhbmQgc2V0IHJlY29nbml6ZWQgdG8gdGhlIHR5cGUuICBUaGlzIGlzIHRoZSBvbmx5IEFQSSBpbgotICogdGhpcyBoZWFkZXIgZGVzaWduZWQgZm9yIHVzZSBieSBkZWNvZGVyIGF1dGhvcnMuICAKLSAqLwotYm9vbCBSZWNvZ25pemVCaW5hcnkoY29uc3QgY2hhciAqZmlsZSwgTW9kZWxUeXBlICZyZWNvZ25pemVkKTsKLQotc3RydWN0IEZpeGVkV2lkdGhQYXJhbWV0ZXJzIHsKLSAgdW5zaWduZWQgY2hhciBvcmRlcjsKLSAgZmxvYXQgcHJvYmluZ19tdWx0aXBsaWVyOwotICAvLyBXaGF0IHR5cGUgb2YgbW9kZWwgaXMgdGhpcz8gIAotICBNb2RlbFR5cGUgbW9kZWxfdHlwZTsKLSAgLy8gRG9lcyB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhdmUgdGhlIGFjdHVhbCBzdHJpbmdzIGluIHRoZSB2b2NhYnVsYXJ5PyAgIAotICBib29sIGhhc192b2NhYnVsYXJ5OwotICB1bnNpZ25lZCBpbnQgc2VhcmNoX3ZlcnNpb247Ci19OwotCi0vLyBUaGlzIGlzIGEgbWFjcm8gaW5zdGVhZCBvZiBhbiBpbmxpbmUgZnVuY3Rpb24gc28gY29uc3RhbnRzIGNhbiBiZSBhc3NpZ25lZCB1c2luZyBpdC4KLSNkZWZpbmUgQUxJR044KGEpICgoc3RkOjpwdHJkaWZmX3QoKChhKS0xKS84KSsxKSo4KQotCi0vLyBQYXJhbWV0ZXJzIHN0b3JlZCBpbiB0aGUgaGVhZGVyIG9mIGEgYmluYXJ5IGZpbGUuICAKLXN0cnVjdCBQYXJhbWV0ZXJzIHsKLSAgRml4ZWRXaWR0aFBhcmFtZXRlcnMgZml4ZWQ7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBjb3VudHM7Ci19OwotCi1jbGFzcyBCaW5hcnlGb3JtYXQgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgQmluYXJ5Rm9ybWF0KGNvbnN0IENvbmZpZyAmY29uZmlnKTsKLQotICAgIC8vIFJlYWRpbmcgYSBiaW5hcnkgZmlsZToKLSAgICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgZmQKLSAgICB2b2lkIEluaXRpYWxpemVCaW5hcnkoaW50IGZkLCBNb2RlbFR5cGUgbW9kZWxfdHlwZSwgdW5zaWduZWQgaW50IHNlYXJjaF92ZXJzaW9uLCBQYXJhbWV0ZXJzICZwYXJhbXMpOwotICAgIC8vIFVzZWQgdG8gcmVhZCBwYXJ0cyBvZiB0aGUgZmlsZSB0byB1cGRhdGUgdGhlIGNvbmZpZyBvYmplY3QgYmVmb3JlIGZpZ3VyaW5nIG91dCBmdWxsIHNpemUuCi0gICAgdm9pZCBSZWFkRm9yQ29uZmlnKHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQsIHVpbnQ2NF90IG9mZnNldF9leGNsdWRpbmdfaGVhZGVyKSBjb25zdDsKLSAgICAvLyBBY3R1YWxseSBsb2FkIHRoZSBiaW5hcnkgZmlsZSBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWFyY2ggYXJlYS4KLSAgICB2b2lkICpMb2FkQmluYXJ5KHN0ZDo6c2l6ZV90IHNpemUpOwotCi0gICAgdWludDY0X3QgVm9jYWJTdHJpbmdSZWFkaW5nT2Zmc2V0KCkgY29uc3QgewotICAgICAgYXNzZXJ0KHZvY2FiX3N0cmluZ19vZmZzZXRfICE9IGtJbnZhbGlkT2Zmc2V0KTsKLSAgICAgIHJldHVybiB2b2NhYl9zdHJpbmdfb2Zmc2V0XzsKLSAgICB9Ci0KLSAgICAvLyBXcml0aW5nIGEgYmluYXJ5IGZpbGUgb3IgaW5pdGlhbGl6aW5nIGluIFJBTSBmcm9tIEFSUEE6Ci0gICAgLy8gU2l6ZSBmb3Igdm9jYWJ1bGFyeS4KLSAgICB2b2lkICpTZXR1cEp1c3RWb2NhYihzdGQ6OnNpemVfdCBtZW1vcnlfc2l6ZSwgdWludDhfdCBvcmRlcik7Ci0gICAgLy8gV2FybmluZzogY2FuIGNoYW5nZSB0aGUgdm9jYXVsYXJ5IGJhc2UgcG9pbnRlci4KLSAgICB2b2lkICpHcm93Rm9yU2VhcmNoKHN0ZDo6c2l6ZV90IG1lbW9yeV9zaXplLCBzdGQ6OnNpemVfdCB2b2NhYl9wYWQsIHZvaWQgKiZ2b2NhYl9iYXNlKTsKLSAgICAvLyBXYXJuaW5nOiBjYW4gY2hhbmdlIHZvY2FidWxhcnkgYW5kIHNlYXJjaCBiYXNlIGFkZHJlc3Nlcy4KLSAgICB2b2lkIFdyaXRlVm9jYWJXb3Jkcyhjb25zdCBzdGQ6OnN0cmluZyAmYnVmZmVyLCB2b2lkIComdm9jYWJfYmFzZSwgdm9pZCAqJnNlYXJjaF9iYXNlKTsKLSAgICAvLyBXcml0ZSB0aGUgaGVhZGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0gICAgdm9pZCBGaW5pc2hGaWxlKGNvbnN0IENvbmZpZyAmY29uZmlnLCBNb2RlbFR5cGUgbW9kZWxfdHlwZSwgdW5zaWduZWQgaW50IHNlYXJjaF92ZXJzaW9uLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cyk7Ci0KLSAgcHJpdmF0ZToKLSAgICB2b2lkIE1hcEZpbGUodm9pZCAqJnZvY2FiX2Jhc2UsIHZvaWQgKiZzZWFyY2hfYmFzZSk7Ci0KLSAgICAvLyBDb3BpZWQgZnJvbSBjb25maWd1cmF0aW9uLgotICAgIGNvbnN0IENvbmZpZzo6V3JpdGVNZXRob2Qgd3JpdGVfbWV0aG9kXzsKLSAgICBjb25zdCBjaGFyICp3cml0ZV9tbWFwXzsKLSAgICB1dGlsOjpMb2FkTWV0aG9kIGxvYWRfbWV0aG9kXzsKLQotICAgIC8vIEZpbGUgYmVoaW5kIG1lbW9yeSwgaWYgYW55LiAgCi0gICAgdXRpbDo6c2NvcGVkX2ZkIGZpbGVfOwotCi0gICAgLy8gSWYgdGhlcmUgaXMgYSBmaWxlIGludm9sdmVkLCBhIHNpbmdsZSBtYXBwaW5nLgotICAgIHV0aWw6OnNjb3BlZF9tZW1vcnkgbWFwcGluZ187Ci0KLSAgICAvLyBJZiB0aGUgZGF0YSBpcyBvbmx5IGluIG1lbW9yeSwgc2VwYXJhdGVseSBhbGxvY2F0ZSBlYWNoIGJlY2F1c2UgdGhlIHRyaWUKLSAgICAvLyBrbm93cyB2b2NhYidzIHNpemUgYmVmb3JlIGl0IGtub3dzIHNlYXJjaCdzIHNpemUgKGJlY2F1c2UgU1JJTE0gbWlnaHQKLSAgICAvLyBoYXZlIHBydW5lZCkuCi0gICAgdXRpbDo6c2NvcGVkX21lbW9yeSBtZW1vcnlfdm9jYWJfLCBtZW1vcnlfc2VhcmNoXzsKLQotICAgIC8vIE1lbW9yeSByYW5nZXMuICBOb3RlIHRoYXQgdGhlc2UgbWF5IG5vdCBiZSBjb250aWd1b3VzIGFuZCBtYXkgbm90IGFsbAotICAgIC8vIGV4aXN0LgotICAgIHN0ZDo6c2l6ZV90IGhlYWRlcl9zaXplXywgdm9jYWJfc2l6ZV8sIHZvY2FiX3BhZF87Ci0gICAgLy8gYWthIGVuZCBvZiBzZWFyY2guCi0gICAgdWludDY0X3Qgdm9jYWJfc3RyaW5nX29mZnNldF87Ci0KLSAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga0ludmFsaWRPZmZzZXQgPSAodWludDY0X3QpLTE7Ci19OwotCi1ib29sIElzQmluYXJ5Rm9ybWF0KGludCBmZCk7Ci0KLX0gLy8gbmFtZXNwYWNlIG5ncmFtCi19IC8vIG5hbWVzcGFjZSBsbQotI2VuZGlmIC8vIExNX0JJTkFSWV9GT1JNQVRfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2JsYW5rLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2JsYW5rLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGE3MWFkLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9ibGFuay5oaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSNpZm5kZWYgTE1fQkxBTktfSAotI2RlZmluZSBMTV9CTEFOS19ICi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgbmdyYW0gewotCi0vKiBTdXBwb3NlICJmb28gYmFyIiBhcHBlYXJzIHdpdGggemVybyBiYWNrb2ZmIGJ1dCB0aGVyZSBpcyBubyB0cmlncmFtCi0gKiBiZWdpbm5pbmcgd2l0aCB0aGVzZSB3b3Jkcy4gIFRoZW4sIHdoZW4gc2NvcmluZyAiZm9vIGJhciIsIHRoZSBtb2RlbCBjb3VsZAotICogcmV0dXJuIG91dF9zdGF0ZSBjb250YWluaW5nICJiYXIiIG9yIGV2ZW4gbnVsbCBjb250ZXh0IGlmICJiYXIiIGFsc28gaGFzIG5vCi0gKiBiYWNrb2ZmIGFuZCBpcyBuZXZlciBmb2xsb3dlZCBieSBhbm90aGVyIHdvcmQuICBUaGVuIHRoZSBiYWNrb2ZmIGlzIHNldCB0bwotICoga05vRXh0ZW5zaW9uQmFja29mZi4gIElmIHRoZSBuLWdyYW0gbWlnaHQgYmUgZXh0ZW5kZWQsIHRoZW4gb3V0X3N0YXRlIG11c3QKLSAqIGNvbnRhaW4gdGhlIGZ1bGwgbi1ncmFtLCBpbiB3aGljaCBjYXNlIGtFeHRlbnNpb25CYWNrb2ZmIGlzIHNldC4gIEluIGFueQotICogY2FzZSwgaWYgYW4gbi1ncmFtIGhhcyBub24temVybyBiYWNrb2ZmLCB0aGUgZnVsbCBzdGF0ZSBpcyByZXR1cm5lZCBzbwotICogYmFja29mZiBjYW4gYmUgcHJvcGVybHkgY2hhcmdlZC4gIAotICogVGhlc2UgZGlmZmVyIG9ubHkgaW4gc2lnbiBiaXQgYmVjYXVzZSB0aGUgYmFja29mZiBpcyBpbiBmYWN0IHplcm8gaW4gZWl0aGVyCi0gKiBjYXNlLiAgIAotICovCi1jb25zdCBmbG9hdCBrTm9FeHRlbnNpb25CYWNrb2ZmID0gLTAuMDsKLWNvbnN0IGZsb2F0IGtFeHRlbnNpb25CYWNrb2ZmID0gMC4wOwotY29uc3QgdWludDY0X3Qga05vRXh0ZW5zaW9uUXVhbnQgPSAwOwotY29uc3QgdWludDY0X3Qga0V4dGVuc2lvblF1YW50ID0gMTsKLQotaW5saW5lIHZvaWQgU2V0RXh0ZW5zaW9uKGZsb2F0ICZiYWNrb2ZmKSB7Ci0gIGlmIChiYWNrb2ZmID09IGtOb0V4dGVuc2lvbkJhY2tvZmYpIGJhY2tvZmYgPSBrRXh0ZW5zaW9uQmFja29mZjsKLX0KLQotLy8gVGhpcyBjb21waWxlcyBkb3duIG5pY2VseS4gIAotaW5saW5lIGJvb2wgSGFzRXh0ZW5zaW9uKGNvbnN0IGZsb2F0ICZiYWNrb2ZmKSB7Ci0gIHR5cGVkZWYgdW5pb24geyBmbG9hdCBmOyB1aW50MzJfdCBpOyB9IFVuaW9uVmFsdWU7Ci0gIFVuaW9uVmFsdWUgY29tcGFyZSwgaW50ZXJwcmV0OwotICBjb21wYXJlLmYgPSBrTm9FeHRlbnNpb25CYWNrb2ZmOwotICBpbnRlcnByZXQuZiA9IGJhY2tvZmY7Ci0gIHJldHVybiBjb21wYXJlLmkgIT0gaW50ZXJwcmV0Lmk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIG5ncmFtCi19IC8vIG5hbWVzcGFjZSBsbQotI2VuZGlmIC8vIExNX0JMQU5LX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZF9iaW5hcnlfbWFpbi5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZF9iaW5hcnlfbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFmMjIyMi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRfYmluYXJ5X21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotI2luY2x1ZGUgImxtL21vZGVsLmhoIgotI2luY2x1ZGUgImxtL3NpemVzLmhoIgotI2luY2x1ZGUgInV0aWwvZmlsZV9waWVjZS5oaCIKLSNpbmNsdWRlICJ1dGlsL3VzYWdlLmhoIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8ZXhjZXB0aW9uPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlICJ1dGlsL2dldG9wdC5oaCIKLSNlbHNlCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIGxtIHsKLW5hbWVzcGFjZSBuZ3JhbSB7Ci1uYW1lc3BhY2UgewotCi12b2lkIFVzYWdlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRlZmF1bHRfbWVtKSB7Ci0gIHN0ZDo6Y2VyciA8PCAiVXNhZ2U6ICIgPDwgbmFtZSA8PCAiIFstdSBsb2cxMF91bmtub3duX3Byb2JhYmlsaXR5XSBbLXNdIFstaV0gWy13IG1tYXB8YWZ0ZXJdIFstcCBwcm9iaW5nX211bHRpcGxpZXJdIFstVCB0cmllX3RlbXBvcmFyeV0gWy1TIHRyaWVfYnVpbGRpbmdfbWVtXSBbLXEgYml0c10gWy1iIGJpdHNdIFstYSBiaXRzXSBbdHlwZV0gaW5wdXQuYXJwYSBbb3V0cHV0Lm1tYXBdXG5cbiIKLSItdSBzZXRzIHRoZSBsb2cxMCBwcm9iYWJpbGl0eSBmb3IgPHVuaz4gaWYgdGhlIEFSUEEgZmlsZSBkb2VzIG5vdCBoYXZlIG9uZS5cbiIKLSIgICBEZWZhdWx0IGlzIC0xMDAuICBUaGUgQVJQQSBmaWxlIHdpbGwgYWx3YXlzIHRha2UgcHJlY2VkZW5jZS5cbiIKLSItcyBhbGxvd3MgbW9kZWxzIHRvIGJlIGJ1aWx0IGV2ZW4gaWYgdGhleSBkbyBub3QgaGF2ZSA8cz4gYW5kIDwvcz4uXG4iCi0iLWkgYWxsb3dzIGJ1Z2d5IG1vZGVscyBmcm9tIElSU1RMTSBieSBtYXBwaW5nIHBvc2l0aXZlIGxvZyBwcm9iYWJpbGl0eSB0byAwLlxuIgotIi13IG1tYXB8YWZ0ZXIgZGV0ZXJtaW5lcyBob3cgd3JpdGluZyBpcyBkb25lLlxuIgotIiAgIG1tYXAgbWFwcyB0aGUgYmluYXJ5IGZpbGUgYW5kIHdyaXRlcyB0byBpdC4gIERlZmF1bHQgZm9yIHRyaWUuXG4iCi0iICAgYWZ0ZXIgYWxsb2NhdGVzIGFub255bW91cyBtZW1vcnksIGJ1aWxkcywgYW5kIHdyaXRlcy4gIERlZmF1bHQgZm9yIHByb2JpbmcuXG4iCi0iLXIgXCJvcmRlcjEuYXJwYSBvcmRlcjIgb3JkZXIzIG9yZGVyNFwiIGFkZHMgbG93ZXItb3JkZXIgcmVzdCBjb3N0cyBmcm9tIHRoZXNlXG4iCi0iICAgbW9kZWwgZmlsZXMuICBvcmRlcjEuYXJwYSBtdXN0IGJlIGFuIEFSUEEgZmlsZS4gIEFsbCBvdGhlcnMgbWF5IGJlIEFSUEEgb3JcbiIKLSIgICB0aGUgc2FtZSBkYXRhIHN0cnVjdHVyZSBhcyBiZWluZyBidWlsdC4gIEFsbCBmaWxlcyBtdXN0IGhhdmUgdGhlIHNhbWVcbiIKLSIgICB2b2NhYnVsYXJ5LiAgRm9yIHByb2JpbmcsIHRoZSB1bmlncmFtcyBtdXN0IGJlIGluIHRoZSBzYW1lIG9yZGVyLlxuXG4iCi0idHlwZSBpcyBlaXRoZXIgcHJvYmluZyBvciB0cmllLiAgRGVmYXVsdCBpcyBwcm9iaW5nLlxuXG4iCi0icHJvYmluZyB1c2VzIGEgcHJvYmluZyBoYXNoIHRhYmxlLiAgSXQgaXMgdGhlIGZhc3Rlc3QgYnV0IHVzZXMgdGhlIG1vc3QgbWVtb3J5LlxuIgotIi1wIHNldHMgdGhlIHNwYWNlIG11bHRpcGxpZXIgYW5kIG11c3QgYmUgPjEuMC4gIFRoZSBkZWZhdWx0IGlzIDEuNS5cblxuIgotInRyaWUgaXMgYSBzdHJhaWdodGZvcndhcmQgdHJpZSB3aXRoIGJpdC1sZXZlbCBwYWNraW5nLiAgSXQgdXNlcyB0aGUgbGVhc3RcbiIKLSJtZW1vcnkgYW5kIGlzIHN0aWxsIGZhc3RlciB0aGFuIFNSSSBvciBJUlNULiAgQnVpbGRpbmcgdGhlIHRyaWUgZm9ybWF0IHVzZXMgYW5cbiIKLSJvbi1kaXNrIHNvcnQgdG8gc2F2ZSBtZW1vcnkuXG4iCi0iLVQgaXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgcHJlZml4LiAgRGVmYXVsdCBpcyB0aGUgb3V0cHV0IGZpbGUgbmFtZS5cbiIKLSItUyBkZXRlcm1pbmVzIG1lbW9yeSB1c2UgZm9yIHNvcnRpbmcuICBEZWZhdWx0IGlzICIgPDwgZGVmYXVsdF9tZW0gPDwgIi4gIFRoaXMgaXMgY29tcGF0aWJsZVxuIgotIiAgIHdpdGggR05VIHNvcnQuICBUaGUgbnVtYmVyIGlzIGZvbGxvd2VkIGJ5IGEgdW5pdDogXCUgZm9yIHBlcmNlbnQgb2YgcGh5c2ljYWxcbiIKLSIgICBtZW1vcnksIGIgZm9yIGJ5dGVzLCBLIGZvciBLaWxvYnl0ZXMsIE0gZm9yIG1lZ2FieXRlcywgdGhlbiBHLFQsUCxFLFosWS4gIFxuIgotIiAgIERlZmF1bHQgdW5pdCBpcyBLIGZvciBLaWxvYnl0ZXMuXG4iCi0iLXEgdHVybnMgcXVhbnRpemF0aW9uIG9uIGFuZCBzZXRzIHRoZSBudW1iZXIgb2YgYml0cyAoZS5nLiAtcSA4KS5cbiIKLSItYiBzZXRzIGJhY2tvZmYgcXVhbnRpemF0aW9uIGJpdHMuICBSZXF1aXJlcyAtcSBhbmQgZGVmYXVsdHMgdG8gdGhhdCB2YWx1ZS5cbiIKLSItYSBjb21wcmVzc2VzIHBvaW50ZXJzIHVzaW5nIGFuIGFycmF5IG9mIG9mZnNldHMuICBUaGUgcGFyYW1ldGVyIGlzIHRoZVxuIgotIiAgIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgZW5jb2RlZCBieSB0aGUgYXJyYXkuICBNZW1vcnkgaXMgbWluaW1pemVkIHN1YmplY3RcbiIKLSIgICB0byB0aGUgbWF4aW11bSwgc28gcGljayAyNTUgdG8gbWluaW1pemUgbWVtb3J5LlxuXG4iCi0iLWggcHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2UuXG5cbiIKLSJHZXQgYSBtZW1vcnkgZXN0aW1hdGUgYnkgcGFzc2luZyBhbiBBUlBBIGZpbGUgd2l0aG91dCBhbiBvdXRwdXQgZmlsZSBuYW1lLlxuIjsKLSAgZXhpdCgxKTsKLX0KLQotLy8gSSBjb3VsZCByZWFsbHkgdXNlIGJvb3N0OjpsZXhpY2FsX2Nhc3QgcmlnaHQgYWJvdXQgbm93LiAgCi1mbG9hdCBQYXJzZUZsb2F0KGNvbnN0IGNoYXIgKmZyb20pIHsKLSAgY2hhciAqZW5kOwotICBmbG9hdCByZXQgPSBzdHJ0b2QoZnJvbSwgJmVuZCk7Ci0gIGlmICgqZW5kKSB0aHJvdyB1dGlsOjpQYXJzZU51bWJlckV4Y2VwdGlvbihmcm9tKTsKLSAgcmV0dXJuIHJldDsKLX0KLXVuc2lnbmVkIGxvbmcgaW50IFBhcnNlVUludChjb25zdCBjaGFyICpmcm9tKSB7Ci0gIGNoYXIgKmVuZDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgcmV0ID0gc3RydG91bChmcm9tLCAmZW5kLCAxMCk7Ci0gIGlmICgqZW5kKSB0aHJvdyB1dGlsOjpQYXJzZU51bWJlckV4Y2VwdGlvbihmcm9tKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdWludDhfdCBQYXJzZUJpdENvdW50KGNvbnN0IGNoYXIgKmZyb20pIHsKLSAgdW5zaWduZWQgbG9uZyB2YWwgPSBQYXJzZVVJbnQoZnJvbSk7Ci0gIGlmICh2YWwgPiAyNSkgewotICAgIHV0aWw6OlBhcnNlTnVtYmVyRXhjZXB0aW9uIGUoZnJvbSk7Ci0gICAgZSA8PCAiIGJpdCBjb3VudHMgYXJlIGxpbWl0ZWQgdG8gMjUuIjsKLSAgfQotICByZXR1cm4gdmFsOwotfQotCi12b2lkIFBhcnNlRmlsZUxpc3QoY29uc3QgY2hhciAqZnJvbSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZ0bykgewotICB0by5jbGVhcigpOwotICB3aGlsZSAodHJ1ZSkgewotICAgIGNvbnN0IGNoYXIgKmk7Ci0gICAgZm9yIChpID0gZnJvbTsgKmkgJiYgKmkgIT0gJyAnOyArK2kpIHt9Ci0gICAgdG8ucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKGZyb20sIGkgLSBmcm9tKSk7Ci0gICAgaWYgKCEqaSkgYnJlYWs7Ci0gICAgZnJvbSA9IGkgKyAxOwotICB9Ci19Ci0KLXZvaWQgUHJvYmluZ1F1YW50aXphdGlvblVuc3VwcG9ydGVkKCkgewotICBzdGQ6OmNlcnIgPDwgIlF1YW50aXphdGlvbiBpcyBvbmx5IGltcGxlbWVudGVkIGluIHRoZSB0cmllIGRhdGEgc3RydWN0dXJlLiIgPDwgc3RkOjplbmRsOwotICBleGl0KDEpOwotfQotCi19IC8vIG5hbWVzcGFjZSBuZ3JhbQotfSAvLyBuYW1lc3BhY2UgbG0KLX0gLy8gbmFtZXNwYWNlCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgdXNpbmcgbmFtZXNwYWNlIGxtOjpuZ3JhbTsKLQotICBjb25zdCBjaGFyICpkZWZhdWx0X21lbSA9IHV0aWw6Okd1ZXNzUGh5c2ljYWxNZW1vcnkoKSA/ICI4MCUiIDogIjFHIjsKLQotICBpZiAoYXJnYyA9PSAyICYmICFzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpKQotICAgIFVzYWdlKGFyZ3ZbMF0sIGRlZmF1bHRfbWVtKTsKLQotICB0cnkgewotICAgIGJvb2wgcXVhbnRpemUgPSBmYWxzZSwgc2V0X2JhY2tvZmZfYml0cyA9IGZhbHNlLCBiaGlrc2hhID0gZmFsc2UsIHNldF93cml0ZV9tZXRob2QgPSBmYWxzZSwgcmVzdCA9IGZhbHNlOwotICAgIGxtOjpuZ3JhbTo6Q29uZmlnIGNvbmZpZzsKLSAgICBjb25maWcuYnVpbGRpbmdfbWVtb3J5ID0gdXRpbDo6UGFyc2VTaXplKGRlZmF1bHRfbWVtKTsKLSAgICBpbnQgb3B0OwotICAgIHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJxOmI6YTp1OnA6dDpUOm06Uzp3OnNpcjpoIikpICE9IC0xKSB7Ci0gICAgICBzd2l0Y2gob3B0KSB7Ci0gICAgICAgIGNhc2UgJ3EnOgotICAgICAgICAgIGNvbmZpZy5wcm9iX2JpdHMgPSBQYXJzZUJpdENvdW50KG9wdGFyZyk7Ci0gICAgICAgICAgaWYgKCFzZXRfYmFja29mZl9iaXRzKSBjb25maWcuYmFja29mZl9iaXRzID0gY29uZmlnLnByb2JfYml0czsKLSAgICAgICAgICBxdWFudGl6ZSA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgIGNvbmZpZy5iYWNrb2ZmX2JpdHMgPSBQYXJzZUJpdENvdW50KG9wdGFyZyk7Ci0gICAgICAgICAgc2V0X2JhY2tvZmZfYml0cyA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgIGNvbmZpZy5wb2ludGVyX2JoaWtzaGFfYml0cyA9IFBhcnNlQml0Q291bnQob3B0YXJnKTsKLSAgICAgICAgICBiaGlrc2hhID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgY29uZmlnLnVua25vd25fbWlzc2luZ19sb2dwcm9iID0gUGFyc2VGbG9hdChvcHRhcmcpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICBjb25maWcucHJvYmluZ19tdWx0aXBsaWVyID0gUGFyc2VGbG9hdChvcHRhcmcpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICd0JzogLy8gbGVnYWN5Ci0gICAgICAgIGNhc2UgJ1QnOgotICAgICAgICAgIGNvbmZpZy50ZW1wb3JhcnlfZGlyZWN0b3J5X3ByZWZpeCA9IG9wdGFyZzsKLSAgICAgICAgICB1dGlsOjpOb3JtYWxpemVUZW1wUHJlZml4KGNvbmZpZy50ZW1wb3JhcnlfZGlyZWN0b3J5X3ByZWZpeCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ20nOiAvLyBsZWdhY3kKLSAgICAgICAgICBjb25maWcuYnVpbGRpbmdfbWVtb3J5ID0gUGFyc2VVSW50KG9wdGFyZykgKiAxMDQ4NTc2OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICBjb25maWcuYnVpbGRpbmdfbWVtb3J5ID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgoKSksIHV0aWw6OlBhcnNlU2l6ZShvcHRhcmcpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAndyc6Ci0gICAgICAgICAgc2V0X3dyaXRlX21ldGhvZCA9IHRydWU7Ci0gICAgICAgICAgaWYgKCFzdHJjbXAob3B0YXJnLCAibW1hcCIpKSB7Ci0gICAgICAgICAgICBjb25maWcud3JpdGVfbWV0aG9kID0gQ29uZmlnOjpXUklURV9NTUFQOwotICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJhZnRlciIpKSB7Ci0gICAgICAgICAgICBjb25maWcud3JpdGVfbWV0aG9kID0gQ29uZmlnOjpXUklURV9BRlRFUjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVXNhZ2UoYXJndlswXSwgZGVmYXVsdF9tZW0pOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgY29uZmlnLnNlbnRlbmNlX21hcmtlcl9taXNzaW5nID0gbG06OlNJTEVOVDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgY29uZmlnLnBvc2l0aXZlX2xvZ19wcm9iYWJpbGl0eSA9IGxtOjpTSUxFTlQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgIHJlc3QgPSB0cnVlOwotICAgICAgICAgIFBhcnNlRmlsZUxpc3Qob3B0YXJnLCBjb25maWcucmVzdF9sb3dlcl9maWxlcyk7Ci0gICAgICAgICAgY29uZmlnLnJlc3RfZnVuY3Rpb24gPSBDb25maWc6OlJFU1RfTE9XRVI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2gnOiAvLyBoZWxwCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgVXNhZ2UoYXJndlswXSwgZGVmYXVsdF9tZW0pOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIXF1YW50aXplICYmIHNldF9iYWNrb2ZmX2JpdHMpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCAiWW91IHNwZWNpZmllZCBiYWNrb2ZmIHF1YW50aXphdGlvbiAoLWIpIGJ1dCBub3QgcHJvYmFiaWxpdHkgcXVhbnRpemF0aW9uICgtcSkiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGFib3J0KCk7Ci0gICAgfQotICAgIGlmIChvcHRpbmQgKyAxID09IGFyZ2MpIHsKLSAgICAgIFNob3dTaXplcyhhcmd2W29wdGluZF0sIGNvbmZpZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgY29uc3QgY2hhciAqbW9kZWxfdHlwZTsKLSAgICBjb25zdCBjaGFyICpmcm9tX2ZpbGU7Ci0KLSAgICBpZiAob3B0aW5kICsgMiA9PSBhcmdjKSB7Ci0gICAgICBtb2RlbF90eXBlID0gInByb2JpbmciOwotICAgICAgZnJvbV9maWxlID0gYXJndltvcHRpbmRdOwotICAgICAgY29uZmlnLndyaXRlX21tYXAgPSBhcmd2W29wdGluZCArIDFdOwotICAgIH0gZWxzZSBpZiAob3B0aW5kICsgMyA9PSBhcmdjKSB7Ci0gICAgICBtb2RlbF90eXBlID0gYXJndltvcHRpbmRdOwotICAgICAgZnJvbV9maWxlID0gYXJndltvcHRpbmQgKyAxXTsKLSAgICAgIGNvbmZpZy53cml0ZV9tbWFwID0gYXJndltvcHRpbmQgKyAyXTsKLSAgICB9IGVsc2UgewotICAgICAgVXNhZ2UoYXJndlswXSwgZGVmYXVsdF9tZW0pOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmICghc3RyY21wKG1vZGVsX3R5cGUsICJwcm9iaW5nIikpIHsKLSAgICAgIGlmICghc2V0X3dyaXRlX21ldGhvZCkgY29uZmlnLndyaXRlX21ldGhvZCA9IENvbmZpZzo6V1JJVEVfQUZURVI7Ci0gICAgICBpZiAocXVhbnRpemUgfHwgc2V0X2JhY2tvZmZfYml0cykgUHJvYmluZ1F1YW50aXphdGlvblVuc3VwcG9ydGVkKCk7Ci0gICAgICBpZiAocmVzdCkgewotICAgICAgICBSZXN0UHJvYmluZ01vZGVsKGZyb21fZmlsZSwgY29uZmlnKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFByb2JpbmdNb2RlbChmcm9tX2ZpbGUsIGNvbmZpZyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKG1vZGVsX3R5cGUsICJ0cmllIikpIHsKLSAgICAgIGlmIChyZXN0KSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCAiUmVzdCArIHRyaWUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgICAgaWYgKCFzZXRfd3JpdGVfbWV0aG9kKSBjb25maWcud3JpdGVfbWV0aG9kID0gQ29uZmlnOjpXUklURV9NTUFQOwotICAgICAgaWYgKHF1YW50aXplKSB7Ci0gICAgICAgIGlmIChiaGlrc2hhKSB7Ci0gICAgICAgICAgUXVhbnRBcnJheVRyaWVNb2RlbChmcm9tX2ZpbGUsIGNvbmZpZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgUXVhbnRUcmllTW9kZWwoZnJvbV9maWxlLCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYmhpa3NoYSkgewotICAgICAgICAgIEFycmF5VHJpZU1vZGVsKGZyb21fZmlsZSwgY29uZmlnKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBUcmllTW9kZWwoZnJvbV9maWxlLCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIFVzYWdlKGFyZ3ZbMF0sIGRlZmF1bHRfbWVtKTsKLSAgICB9Ci0gIH0KLSAgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZlKSB7Ci0gICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICBzdGQ6OmNlcnIgPDwgIkVSUk9SIiA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgc3RkOjpjZXJyIDw8ICJTVUNDRVNTIiA8PCBzdGQ6OmVuZGw7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvSmFtZmlsZSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMGUxOGIuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWZha2VsaWIgYnVpbGRlciA6IFsgZ2xvYiAqLmNjIDogKnRlc3QuY2MgKm1haW4uY2MgXSAKLSAgLi4vLi4vdXRpbC8va2VudXRpbCAuLi8uLi91dGlsL3N0cmVhbS8vc3RyZWFtIC4uLy4uL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vL2RvdWJsZS1jb252ZXJzaW9uIC4uLy9rZW5sbQotICA6IDogOiA8bGlicmFyeT4vdG9wLy9ib29zdF90aHJlYWQgJCh0aW1lci1saW5rKSA7Ci0KLWV4ZSBsbXBseiA6IGxtcGx6X21haW4uY2MgYnVpbGRlciAvdG9wLy9ib29zdF9wcm9ncmFtX29wdGlvbnMgOwotCi1leGUgZHVtcF9jb3VudHMgOiBkdW1wX2NvdW50c19tYWluLmNjIGJ1aWxkZXIgOwotCi1hbGlhcyBwcm9ncmFtcyA6IGxtcGx6IGR1bXBfY291bnRzIDsKLQotaW1wb3J0IHRlc3RpbmcgOwotdW5pdC10ZXN0IGNvcnB1c19jb3VudF90ZXN0IDogY29ycHVzX2NvdW50X3Rlc3QuY2MgYnVpbGRlciAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIDsKLXVuaXQtdGVzdCBhZGp1c3RfY291bnRzX3Rlc3QgOiBhZGp1c3RfY291bnRzX3Rlc3QuY2MgYnVpbGRlciAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIDsKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2FkanVzdF9jb3VudHMuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9hZGp1c3RfY291bnRzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2NjYmI5Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2FkanVzdF9jb3VudHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotI2luY2x1ZGUgImxtL2J1aWxkZXIvYWRqdXN0X2NvdW50cy5oaCIKLSNpbmNsdWRlICJsbS9idWlsZGVyL25ncmFtX3N0cmVhbS5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS90aW1lci5oaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLW5hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBidWlsZGVyIHsKLQotQmFkRGlzY291bnRFeGNlcHRpb246OkJhZERpc2NvdW50RXhjZXB0aW9uKCkgdGhyb3coKSB7fQotQmFkRGlzY291bnRFeGNlcHRpb246On5CYWREaXNjb3VudEV4Y2VwdGlvbigpIHRocm93KCkge30KLQotbmFtZXNwYWNlIHsKLS8vIFJldHVybiBsYXN0IHdvcmQgaW4gZnVsbCB0aGF0IGlzIGRpZmZlcmVudC4KLWNvbnN0IFdvcmRJbmRleCogRmluZERpZmZlcmVuY2UoY29uc3QgTkdyYW0gJmZ1bGwsIGNvbnN0IE5HcmFtICZsb3dlcl9sYXN0KSB7Ci0gIGNvbnN0IFdvcmRJbmRleCAqY3VyX3dvcmQgPSBmdWxsLmVuZCgpIC0gMTsKLSAgY29uc3QgV29yZEluZGV4ICpwcmVfd29yZCA9IGxvd2VyX2xhc3QuZW5kKCkgLSAxOwotICAvLyBGaW5kIGxhc3QgZGlmZmVyZW5jZS4KLSAgZm9yICg7IHByZV93b3JkID49IGxvd2VyX2xhc3QuYmVnaW4oKSAmJiAqcHJlX3dvcmQgPT0gKmN1cl93b3JkOyAtLWN1cl93b3JkLCAtLXByZV93b3JkKSB7fQotICByZXR1cm4gY3VyX3dvcmQ7Ci19Ci0KLWNsYXNzIFN0YXRDb2xsZWN0b3IgewotICBwdWJsaWM6Ci0gICAgU3RhdENvbGxlY3RvcihzdGQ6OnNpemVfdCBvcmRlciwgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzX3BydW5lZCwgc3RkOjp2ZWN0b3I8RGlzY291bnQ+ICZkaXNjb3VudHMpCi0gICAgICA6IG9yZGVyc18ob3JkZXIpLCBmdWxsXyhvcmRlcnNfLmJhY2soKSksIGNvdW50c18oY291bnRzKSwgY291bnRzX3BydW5lZF8oY291bnRzX3BydW5lZCksIGRpc2NvdW50c18oZGlzY291bnRzKSB7Ci0gICAgICBtZW1zZXQoJm9yZGVyc19bMF0sIDAsIHNpemVvZihPcmRlclN0YXQpICogb3JkZXIpOwotICAgIH0KLQotICAgIH5TdGF0Q29sbGVjdG9yKCkge30KLQotICAgIHZvaWQgQ2FsY3VsYXRlRGlzY291bnRzKGNvbnN0IERpc2NvdW50Q29uZmlnICZjb25maWcpIHsKLSAgICAgIGNvdW50c18ucmVzaXplKG9yZGVyc18uc2l6ZSgpKTsKLSAgICAgIGNvdW50c19wcnVuZWRfLnJlc2l6ZShvcmRlcnNfLnNpemUoKSk7Ci0gICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgb3JkZXJzXy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBPcmRlclN0YXQgJnMgPSBvcmRlcnNfW2ldOwotICAgICAgICBjb3VudHNfW2ldID0gcy5jb3VudDsKLSAgICAgICAgY291bnRzX3BydW5lZF9baV0gPSBzLmNvdW50X3BydW5lZDsKLSAgICAgIH0KLQotICAgICAgZGlzY291bnRzXyA9IGNvbmZpZy5vdmVyd3JpdGU7Ci0gICAgICBkaXNjb3VudHNfLnJlc2l6ZShvcmRlcnNfLnNpemUoKSk7Ci0gICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSBjb25maWcub3ZlcndyaXRlLnNpemUoKTsgaSA8IG9yZGVyc18uc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgT3JkZXJTdGF0ICZzID0gb3JkZXJzX1tpXTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAxOyBqIDwgNDsgKytqKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBTcGVjaWFsaXplIGVycm9yIG1lc3NhZ2UgZm9yIGogPT0gMywgbWVhbmluZyAzKwotICAgICAgICAgICAgVVRJTF9USFJPV19JRihzLm5bal0gPT0gMCwgQmFkRGlzY291bnRFeGNlcHRpb24sICJDb3VsZCBub3QgY2FsY3VsYXRlIEtuZXNlci1OZXkgZGlzY291bnRzIGZvciAiCi0gICAgICAgICAgICAgICAgPDwgKGkrMSkgPDwgIi1ncmFtcyB3aXRoIGFkanVzdGVkIGNvdW50ICIgPDwgKGorMSkgPDwgIiBiZWNhdXNlIHdlIGRpZG4ndCBvYnNlcnZlIGFueSAiCi0gICAgICAgICAgICAgICAgPDwgKGkrMSkgPDwgIi1ncmFtcyB3aXRoIGFkanVzdGVkIGNvdW50ICIgPDwgaiA8PCAiOyBJcyB0aGlzIHNtYWxsIG9yIGFydGlmaWNpYWwgZGF0YT8iKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBTZWUgZXF1YXRpb24gKDI2KSBpbiBDaGVuIGFuZCBHb29kbWFuLgotICAgICAgICAgIGRpc2NvdW50c19baV0uYW1vdW50WzBdID0gMC4wOwotICAgICAgICAgIGZsb2F0IHkgPSBzdGF0aWNfY2FzdDxmbG9hdD4ocy5uWzFdKSAvIHN0YXRpY19jYXN0PGZsb2F0PihzLm5bMV0gKyAyLjAgKiBzLm5bMl0pOwotICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDE7IGogPCA0OyArK2opIHsKLSAgICAgICAgICAgIGRpc2NvdW50c19baV0uYW1vdW50W2pdID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGopIC0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGogKyAxKSAqIHkgKiBzdGF0aWNfY2FzdDxmbG9hdD4ocy5uW2orMV0pIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHMubltqXSk7Ci0gICAgICAgICAgICBVVElMX1RIUk9XX0lGKGRpc2NvdW50c19baV0uYW1vdW50W2pdIDwgMC4wIHx8IGRpc2NvdW50c19baV0uYW1vdW50W2pdID4gaiwgQmFkRGlzY291bnRFeGNlcHRpb24sICJFUlJPUjogIiA8PCAoaSsxKSA8PCAiLWdyYW0gZGlzY291bnQgb3V0IG9mIHJhbmdlIGZvciBhZGp1c3RlZCBjb3VudCAiIDw8IGogPDwgIjogIiA8PCBkaXNjb3VudHNfW2ldLmFtb3VudFtqXSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChjb25zdCBCYWREaXNjb3VudEV4Y2VwdGlvbiAmZSkgewotICAgICAgICAgIHN3aXRjaCAoY29uZmlnLmJhZF9hY3Rpb24pIHsKLSAgICAgICAgICAgIGNhc2UgVEhST1dfVVA6Ci0gICAgICAgICAgICAgIHRocm93OwotICAgICAgICAgICAgY2FzZSBDT01QTEFJTjoKLSAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8ICIgIFN1YnN0aXR1dGluZyBmYWxsYmFjayBkaXNjb3VudHMgRDE9IiA8PCBjb25maWcuZmFsbGJhY2suYW1vdW50WzFdIDw8ICIgRDI9IiA8PCBjb25maWcuZmFsbGJhY2suYW1vdW50WzJdIDw8ICIgRDMrPSIgPDwgY29uZmlnLmZhbGxiYWNrLmFtb3VudFszXSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICBjYXNlIFNJTEVOVDoKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRpc2NvdW50c19baV0gPSBjb25maWcuZmFsbGJhY2s7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIEFkZChzdGQ6OnNpemVfdCBvcmRlcl9taW51c18xLCB1aW50NjRfdCBjb3VudCwgYm9vbCBwcnVuZWQgPSBmYWxzZSkgewotICAgICAgT3JkZXJTdGF0ICZzdGF0ID0gb3JkZXJzX1tvcmRlcl9taW51c18xXTsKLSAgICAgICsrc3RhdC5jb3VudDsKLSAgICAgIGlmICghcHJ1bmVkKQotICAgICAgICArK3N0YXQuY291bnRfcHJ1bmVkOwotICAgICAgaWYgKGNvdW50IDwgNSkgKytzdGF0Lm5bY291bnRdOwotICAgIH0KLQotICAgIHZvaWQgQWRkRnVsbCh1aW50NjRfdCBjb3VudCwgYm9vbCBwcnVuZWQgPSBmYWxzZSkgewotICAgICAgKytmdWxsXy5jb3VudDsKLSAgICAgIGlmICghcHJ1bmVkKQotICAgICAgICArK2Z1bGxfLmNvdW50X3BydW5lZDsKLSAgICAgIGlmIChjb3VudCA8IDUpICsrZnVsbF8ubltjb3VudF07Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgc3RydWN0IE9yZGVyU3RhdCB7Ci0gICAgICAvLyBuXzEgaW4gZXF1YXRpb24gMjYgb2YgQ2hlbiBhbmQgR29vZG1hbiBldGMKLSAgICAgIHVpbnQ2NF90IG5bNV07Ci0gICAgICB1aW50NjRfdCBjb3VudDsKLSAgICAgIHVpbnQ2NF90IGNvdW50X3BydW5lZDsKLSAgICB9OwotCi0gICAgc3RkOjp2ZWN0b3I8T3JkZXJTdGF0PiBvcmRlcnNfOwotICAgIE9yZGVyU3RhdCAmZnVsbF87Ci0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50c187Ci0gICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHNfcHJ1bmVkXzsKLSAgICBzdGQ6OnZlY3RvcjxEaXNjb3VudD4gJmRpc2NvdW50c187Ci19OwotCi0vLyBSZWFkcyBhbGwgZW50cmllcyBpbiBvcmRlciBsaWtlIE5HcmFtU3RyZWFtIGRvZXMuCi0vLyBCdXQgZGVsZXRlcyBhbnkgZW50cmllcyB0aGF0IGhhdmUgPHM+IGluIHRoZSAxc3QgKG5vdCAwdGgpIHBvc2l0aW9uIG9uIHRoZQotLy8gd2F5IG91dCBieSBwdXR0aW5nIG90aGVyIGVudHJpZXMgaW4gdGhlaXIgcGxhY2UuICBUaGlzIGRpc3J1cHRzIHRoZSBzb3J0Ci0vLyBvcmRlciBidXQgd2UgZG9uJ3QgY2FyZSBiZWNhdXNlIHRoZSBkYXRhIGlzIGdvaW5nIHRvIGJlIHNvcnRlZCBhZ2Fpbi4KLWNsYXNzIENvbGxhcHNlU3RyZWFtIHsKLSAgcHVibGljOgotICAgIENvbGxhcHNlU3RyZWFtKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24sIHVpbnQ2NF90IHBydW5lX3RocmVzaG9sZCwgY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4mIHBydW5lX3dvcmRzKSA6Ci0gICAgICBjdXJyZW50XyhOVUxMLCBOR3JhbTo6T3JkZXJGcm9tU2l6ZShwb3NpdGlvbi5HZXRDaGFpbigpLkVudHJ5U2l6ZSgpKSksCi0gICAgICBwcnVuZV90aHJlc2hvbGRfKHBydW5lX3RocmVzaG9sZCksCi0gICAgICBwcnVuZV93b3Jkc18ocHJ1bmVfd29yZHMpLAotICAgICAgYmxvY2tfKHBvc2l0aW9uKSB7IAotICAgICAgU3RhcnRCbG9jaygpOwotICAgIH0KLQotICAgIGNvbnN0IE5HcmFtICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBjdXJyZW50XzsgfQotICAgIGNvbnN0IE5HcmFtICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfOyB9Ci0KLSAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gYmxvY2tfOyB9Ci0KLSAgICBDb2xsYXBzZVN0cmVhbSAmb3BlcmF0b3IrKygpIHsKLSAgICAgIGFzc2VydChibG9ja18pOwotICAgICAgCi0gICAgICBpZiAoY3VycmVudF8uYmVnaW4oKVsxXSA9PSBrQk9TICYmIGN1cnJlbnRfLkJhc2UoKSA8IGNvcHlfZnJvbV8pIHsKLSAgICAgICAgbWVtY3B5KGN1cnJlbnRfLkJhc2UoKSwgY29weV9mcm9tXywgY3VycmVudF8uVG90YWxTaXplKCkpOwotICAgICAgICBVcGRhdGVDb3B5RnJvbSgpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFyayBoaWdoZXN0IG9yZGVyIG4tZ3JhbXMgZm9yIGxhdGVyIHBydW5pbmcKLSAgICAgICAgaWYoY3VycmVudF8uQ291bnQoKSA8PSBwcnVuZV90aHJlc2hvbGRfKSB7Ci0gICAgICAgICAgY3VycmVudF8uTWFyaygpOyAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIXBydW5lX3dvcmRzXy5lbXB0eSgpKSB7Ci0gICAgICAgICAgZm9yKFdvcmRJbmRleCogaSA9IGN1cnJlbnRfLmJlZ2luKCk7IGkgIT0gY3VycmVudF8uZW5kKCk7IGkrKykgewotICAgICAgICAgICAgaWYocHJ1bmVfd29yZHNfWyppXSkgewotICAgICAgICAgICAgICBjdXJyZW50Xy5NYXJrKCk7IAotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgCi0gICAgICBjdXJyZW50Xy5OZXh0SW5NZW1vcnkoKTsKLSAgICAgIHVpbnQ4X3QgKmJsb2NrX2Jhc2UgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYmxvY2tfLT5HZXQoKSk7Ci0gICAgICBpZiAoY3VycmVudF8uQmFzZSgpID09IGJsb2NrX2Jhc2UgKyBibG9ja18tPlZhbGlkU2l6ZSgpKSB7Ci0gICAgICAgIGJsb2NrXy0+U2V0VmFsaWRTaXplKGNvcHlfZnJvbV8gKyBjdXJyZW50Xy5Ub3RhbFNpemUoKSAtIGJsb2NrX2Jhc2UpOwotICAgICAgICArK2Jsb2NrXzsKLSAgICAgICAgU3RhcnRCbG9jaygpOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBNYXJrIGhpZ2hlc3Qgb3JkZXIgbi1ncmFtcyBmb3IgbGF0ZXIgcHJ1bmluZwotICAgICAgaWYoY3VycmVudF8uQ291bnQoKSA8PSBwcnVuZV90aHJlc2hvbGRfKSB7Ci0gICAgICAgIGN1cnJlbnRfLk1hcmsoKTsgCi0gICAgICB9Ci0KLSAgICAgIGlmKCFwcnVuZV93b3Jkc18uZW1wdHkoKSkgewotICAgICAgICBmb3IoV29yZEluZGV4KiBpID0gY3VycmVudF8uYmVnaW4oKTsgaSAhPSBjdXJyZW50Xy5lbmQoKTsgaSsrKSB7Ci0gICAgICAgICAgaWYocHJ1bmVfd29yZHNfWyppXSkgewotICAgICAgICAgICAgY3VycmVudF8uTWFyaygpOyAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgdm9pZCBTdGFydEJsb2NrKCkgewotICAgICAgZm9yICg7IDsgKytibG9ja18pIHsKLSAgICAgICAgaWYgKCFibG9ja18pIHJldHVybjsKLSAgICAgICAgaWYgKGJsb2NrXy0+VmFsaWRTaXplKCkpIGJyZWFrOwotICAgICAgfQotICAgICAgY3VycmVudF8uUmVCYXNlKGJsb2NrXy0+R2V0KCkpOwotICAgICAgY29weV9mcm9tXyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihibG9ja18tPkdldCgpKSArIGJsb2NrXy0+VmFsaWRTaXplKCk7Ci0gICAgICBVcGRhdGVDb3B5RnJvbSgpOwotICAgICAgCi0gICAgICAvLyBNYXJrIGhpZ2hlc3Qgb3JkZXIgbi1ncmFtcyBmb3IgbGF0ZXIgcHJ1bmluZwotICAgICAgaWYoY3VycmVudF8uQ291bnQoKSA8PSBwcnVuZV90aHJlc2hvbGRfKSB7Ci0gICAgICAgIGN1cnJlbnRfLk1hcmsoKTsgCi0gICAgICB9Ci0KLSAgICAgIGlmKCFwcnVuZV93b3Jkc18uZW1wdHkoKSkgewotICAgICAgICBmb3IoV29yZEluZGV4KiBpID0gY3VycmVudF8uYmVnaW4oKTsgaSAhPSBjdXJyZW50Xy5lbmQoKTsgaSsrKSB7Ci0gICAgICAgICAgaWYocHJ1bmVfd29yZHNfWyppXSkgewotICAgICAgICAgICAgY3VycmVudF8uTWFyaygpOyAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfQotCi0gICAgLy8gRmluZCBsYXN0IHdpdGhvdXQgYm9zLgotICAgIHZvaWQgVXBkYXRlQ29weUZyb20oKSB7Ci0gICAgICBmb3IgKGNvcHlfZnJvbV8gLT0gY3VycmVudF8uVG90YWxTaXplKCk7IGNvcHlfZnJvbV8gPj0gY3VycmVudF8uQmFzZSgpOyBjb3B5X2Zyb21fIC09IGN1cnJlbnRfLlRvdGFsU2l6ZSgpKSB7Ci0gICAgICAgIGlmIChOR3JhbShjb3B5X2Zyb21fLCBjdXJyZW50Xy5PcmRlcigpKS5iZWdpbigpWzFdICE9IGtCT1MpIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIE5HcmFtIGN1cnJlbnRfOwotCi0gICAgLy8gR29lcyBiYWNrd2FyZHMgaW4gdGhlIGJsb2NrCi0gICAgdWludDhfdCAqY29weV9mcm9tXzsKLSAgICB1aW50NjRfdCBwcnVuZV90aHJlc2hvbGRfOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+JiBwcnVuZV93b3Jkc187Ci0gICAgdXRpbDo6c3RyZWFtOjpMaW5rIGJsb2NrXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLXZvaWQgQWRqdXN0Q291bnRzOjpSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyAmcG9zaXRpb25zKSB7Ci0gIFVUSUxfVElNRVIoIigldyBzKSBBZGp1c3RlZCBjb3VudHNcbiIpOwotCi0gIGNvbnN0IHN0ZDo6c2l6ZV90IG9yZGVyID0gcG9zaXRpb25zLnNpemUoKTsKLSAgU3RhdENvbGxlY3RvciBzdGF0cyhvcmRlciwgY291bnRzXywgY291bnRzX3BydW5lZF8sIGRpc2NvdW50c18pOwotICBpZiAob3JkZXIgPT0gMSkgewotCi0gICAgLy8gT25seSB1bmlncmFtcy4gIEp1c3QgY29sbGVjdCBzdGF0cy4gIAotICAgIGZvciAoTkdyYW1TdHJlYW0gZnVsbChwb3NpdGlvbnNbMF0pOyBmdWxsOyArK2Z1bGwpIHsKLSAgICAgIAotICAgICAgLy8gRG8gbm90IHBydW5lIDxzPiA8L3M+IDx1bms+Ci0gICAgICBpZigqZnVsbC0+YmVnaW4oKSA+IDIpIHsKLSAgICAgICAgaWYoZnVsbC0+Q291bnQoKSA8PSBwcnVuZV90aHJlc2hvbGRzX1swXSkKLSAgICAgICAgICBmdWxsLT5NYXJrKCk7Ci0gICAgICAKLSAgICAgICAgaWYoIXBydW5lX3dvcmRzXy5lbXB0eSgpICYmIHBydW5lX3dvcmRzX1sqZnVsbC0+YmVnaW4oKV0pCi0gICAgICAgICAgZnVsbC0+TWFyaygpOwotICAgICAgfQotICAgICAgCi0gICAgICBzdGF0cy5BZGRGdWxsKGZ1bGwtPlVubWFya2VkQ291bnQoKSwgZnVsbC0+SXNNYXJrZWQoKSk7Ci0gICAgfQotCi0gICAgc3RhdHMuQ2FsY3VsYXRlRGlzY291bnRzKGRpc2NvdW50X2NvbmZpZ18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIE5HcmFtU3RyZWFtcyBzdHJlYW1zOwotICBzdHJlYW1zLkluaXQocG9zaXRpb25zLCBwb3NpdGlvbnMuc2l6ZSgpIC0gMSk7Ci0gIAotICBDb2xsYXBzZVN0cmVhbSBmdWxsKHBvc2l0aW9uc1twb3NpdGlvbnMuc2l6ZSgpIC0gMV0sIHBydW5lX3RocmVzaG9sZHNfLmJhY2soKSwgcHJ1bmVfd29yZHNfKTsKLQotICAvLyBJbml0aWFsaXphdGlvbjogPHVuaz4gaGFzIGNvdW50IDAgYW5kIHNvIGRvZXMgPHM+LgotICBOR3JhbVN0cmVhbSAqbG93ZXJfdmFsaWQgPSBzdHJlYW1zLmJlZ2luKCk7Ci0gIGNvbnN0IE5HcmFtU3RyZWFtICpjb25zdCBzdHJlYW1zX2JlZ2luID0gc3RyZWFtcy5iZWdpbigpOwotICBzdHJlYW1zWzBdLT5Db3VudCgpID0gMDsKLSAgKnN0cmVhbXNbMF0tPmJlZ2luKCkgPSBrVU5LOwotICBzdGF0cy5BZGQoMCwgMCk7Ci0gICgrK3N0cmVhbXNbMF0pLT5Db3VudCgpID0gMDsKLSAgKnN0cmVhbXNbMF0tPmJlZ2luKCkgPSBrQk9TOwotICAvLyA8cz4gaXMgbm90IGluIHN0YXRzIHlldCBiZWNhdXNlIGl0IHdpbGwgZ2V0IHB1dCBpbiBsYXRlci4KLQotICAvLyBUaGlzIGtlZXBzIHRyYWNrIG9mIGFjdHVhbCBjb3VudHMgZm9yIGxvd2VyIG9yZGVycy4gIEl0IGlzIG5vdCBvdXRwdXQKLSAgLy8gKG9ubHkgYWRqdXN0ZWQgY291bnRzIGFyZSksIGJ1dCB1c2VkIHRvIGRldGVybWluZSBwcnVuaW5nLgotICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gYWN0dWFsX2NvdW50cyhwb3NpdGlvbnMuc2l6ZSgpLCAwKTsKLSAgLy8gU29tZXRoaW5nIG9mIGEgaGFjazogZG9uJ3QgcHJ1bmUgPHM+LgotICBhY3R1YWxfY291bnRzWzBdID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpOwotICAKLSAgLy8gSXRlcmF0ZSBvdmVyIGZ1bGwgKHRoZSBzdHJlYW0gb2YgdGhlIGhpZ2hlc3Qgb3JkZXIgbmdyYW1zKQotICBmb3IgKDsgZnVsbDsgKytmdWxsKSB7Ci0gICAgY29uc3QgV29yZEluZGV4ICpkaWZmZXJlbnQgPSBGaW5kRGlmZmVyZW5jZSgqZnVsbCwgKipsb3dlcl92YWxpZCk7Ci0gICAgc3RkOjpzaXplX3Qgc2FtZSA9IGZ1bGwtPmVuZCgpIC0gMSAtIGRpZmZlcmVudDsKLQotICAgIC8vIFNURVAgMTogT3V0cHV0IGFsbCB0aGUgbi1ncmFtcyB0aGF0IGNoYW5nZWQuCi0gICAgZm9yICg7IGxvd2VyX3ZhbGlkID49ICZzdHJlYW1zW3NhbWVdOyAtLWxvd2VyX3ZhbGlkKSB7Ci0gICAgICB1aW50NjRfdCBvcmRlcl9taW51c18xID0gbG93ZXJfdmFsaWQgLSBzdHJlYW1zX2JlZ2luOwotICAgICAgaWYoYWN0dWFsX2NvdW50c1tvcmRlcl9taW51c18xXSA8PSBwcnVuZV90aHJlc2hvbGRzX1tvcmRlcl9taW51c18xXSkKLSAgICAgICAgKCpsb3dlcl92YWxpZCktPk1hcmsoKTsKLSAgICAgIAotICAgICAgaWYoIXBydW5lX3dvcmRzXy5lbXB0eSgpKSB7Ci0gICAgICAgIGZvcihXb3JkSW5kZXgqIGkgPSAoKmxvd2VyX3ZhbGlkKS0+YmVnaW4oKTsgaSAhPSAoKmxvd2VyX3ZhbGlkKS0+ZW5kKCk7IGkrKykgewotICAgICAgICAgIGlmKHBydW5lX3dvcmRzX1sqaV0pIHsKLSAgICAgICAgICAgICgqbG93ZXJfdmFsaWQpLT5NYXJrKCk7IAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgICAgc3RhdHMuQWRkKG9yZGVyX21pbnVzXzEsICgqbG93ZXJfdmFsaWQpLT5Vbm1hcmtlZENvdW50KCksICgqbG93ZXJfdmFsaWQpLT5Jc01hcmtlZCgpKTsKLSAgICAgICsrKmxvd2VyX3ZhbGlkOwotICAgIH0KLQotICAgIC8vIFNURVAgMjogVXBkYXRlIG4tZ3JhbXMgdGhhdCBzdGlsbCBtYXRjaC4KLSAgICAvLyBuLWdyYW1zIHRoYXQgbWF0Y2ggZ2V0IGNvdW50IGZyb20gdGhlIGZ1bGwgZW50cnkuCi0gICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNhbWU7ICsraSkgewotICAgICAgYWN0dWFsX2NvdW50c1tpXSArPSBmdWxsLT5Vbm1hcmtlZENvdW50KCk7Ci0gICAgfQotICAgIC8vIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBleHRlbnNpb25zIGZvciB0aGUgbG9uZ2VzdCBtYXRjaC4KLSAgICBpZiAoc2FtZSkgKytzdHJlYW1zW3NhbWUgLSAxXS0+Q291bnQoKTsKLQotICAgIC8vIFNURVAgMzogSW5pdGlhbGl6ZSBuZXcgbi1ncmFtcy4KLSAgICAvLyBUaGlzIGlzIGhlcmUgYmVjYXVzZSBib3MgaXMgYWxzbyBjb25zdCBXb3JkSW5kZXggKiwgc28gY29weSBnZXRzCi0gICAgLy8gY29uc2lzdGVudCBhcmd1bWVudCB0eXBlcy4KLSAgICBjb25zdCBXb3JkSW5kZXggKmZ1bGxfZW5kID0gZnVsbC0+ZW5kKCk7Ci0gICAgLy8gSW5pdGlhbGl6ZSBhbmQgbWFyayBhcyB2YWxpZCB1cCB0byBib3MuCi0gICAgY29uc3QgV29yZEluZGV4ICpib3M7Ci0gICAgZm9yIChib3MgPSBkaWZmZXJlbnQ7IChib3MgPiBmdWxsLT5iZWdpbigpKSAmJiAoKmJvcyAhPSBrQk9TKTsgLS1ib3MpIHsKLSAgICAgIE5HcmFtU3RyZWFtICZ0byA9ICorK2xvd2VyX3ZhbGlkOwotICAgICAgc3RkOjpjb3B5KGJvcywgZnVsbF9lbmQsIHRvLT5iZWdpbigpKTsKLSAgICAgIHRvLT5Db3VudCgpID0gMTsKLSAgICAgIGFjdHVhbF9jb3VudHNbbG93ZXJfdmFsaWQgLSBzdHJlYW1zX2JlZ2luXSA9IGZ1bGwtPlVubWFya2VkQ291bnQoKTsKLSAgICB9Ci0gICAgLy8gTm93IGJvcyBpbmRpY2F0ZXMgd2hlcmUgPHM+IGlzIG9yIGlzIHRoZSAwdGggd29yZCBvZiBmdWxsLgotICAgIGlmIChib3MgIT0gZnVsbC0+YmVnaW4oKSkgewotICAgICAgLy8gVGhlcmUgaXMgYW4gPHM+IGJleW9uZCB0aGUgMHRoIHdvcmQuCi0gICAgICBOR3JhbVN0cmVhbSAmdG8gPSAqKytsb3dlcl92YWxpZDsKLSAgICAgIHN0ZDo6Y29weShib3MsIGZ1bGxfZW5kLCB0by0+YmVnaW4oKSk7Ci0KLSAgICAgIC8vIEFueXRoaW5nIHRoYXQgYmVnaW5zIHdpdGggPHM+IGhhcyBmdWxsIG5vbiBhZGp1c3RlZCBjb3VudC4KLSAgICAgIHRvLT5Db3VudCgpID0gZnVsbC0+VW5tYXJrZWRDb3VudCgpOwotICAgICAgYWN0dWFsX2NvdW50c1tsb3dlcl92YWxpZCAtIHN0cmVhbXNfYmVnaW5dID0gZnVsbC0+VW5tYXJrZWRDb3VudCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdGF0cy5BZGRGdWxsKGZ1bGwtPlVubWFya2VkQ291bnQoKSwgZnVsbC0+SXNNYXJrZWQoKSk7Ci0gICAgfQotICAgIGFzc2VydChsb3dlcl92YWxpZCA+PSAmc3RyZWFtc1swXSk7Ci0gIH0KLQotICAvLyBUaGUgYWJvdmUgbG9vcCBvdXRwdXRzIG4tZ3JhbXMgd2hlbiBpdCBvYnNlcnZlcyBjaGFuZ2VzLiAgVGhpcyBvdXRwdXRzCi0gIC8vIHRoZSBsYXN0IG4tZ3JhbXMuCi0gIGZvciAoTkdyYW1TdHJlYW0gKnMgPSBzdHJlYW1zLmJlZ2luKCk7IHMgPD0gbG93ZXJfdmFsaWQ7ICsrcykgewotICAgIHVpbnQ2NF90IGxvd2VyX2NvdW50ID0gYWN0dWFsX2NvdW50c1soKnMpLT5PcmRlcigpIC0gMV07Ci0gICAgaWYobG93ZXJfY291bnQgPD0gcHJ1bmVfdGhyZXNob2xkc19bKCpzKS0+T3JkZXIoKSAtIDFdKQotICAgICAgKCpzKS0+TWFyaygpOwotICAgICAgCi0gICAgaWYoIXBydW5lX3dvcmRzXy5lbXB0eSgpKSB7Ci0gICAgICBmb3IoV29yZEluZGV4KiBpID0gKCpzKS0+YmVnaW4oKTsgaSAhPSAoKnMpLT5lbmQoKTsgaSsrKSB7Ci0gICAgICAgIGlmKHBydW5lX3dvcmRzX1sqaV0pIHsKLSAgICAgICAgICAoKnMpLT5NYXJrKCk7IAotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICAgCi0gICAgc3RhdHMuQWRkKHMgLSBzdHJlYW1zLmJlZ2luKCksIGxvd2VyX2NvdW50LCAoKnMpLT5Jc01hcmtlZCgpKTsKLSAgICArKypzOwotICB9Ci0gIC8vIFBvaXNvbiBldmVyeW9uZSEgIEV4Y2VwdCB0aGUgTi1ncmFtcyB3aGljaCB3ZXJlIGFscmVhZHkgcG9pc29uZWQgYnkgdGhlIGlucHV0LgotICBmb3IgKE5HcmFtU3RyZWFtICpzID0gc3RyZWFtcy5iZWdpbigpOyBzICE9IHN0cmVhbXMuZW5kKCk7ICsrcykKLSAgICBzLT5Qb2lzb24oKTsKLQotICBzdGF0cy5DYWxjdWxhdGVEaXNjb3VudHMoZGlzY291bnRfY29uZmlnXyk7Ci0KLSAgLy8gTk9URTogU2VlIHNwZWNpYWwgZWFybHktcmV0dXJuIGNhc2UgZm9yIHVuaWdyYW1zIG5lYXIgdGhlIHRvcCBvZiB0aGlzIGZ1bmN0aW9uCi19Ci0KLX19IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2FkanVzdF9jb3VudHMuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9hZGp1c3RfY291bnRzLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTY5OTUwLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2FkanVzdF9jb3VudHMuaGgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0jaWZuZGVmIExNX0JVSUxERVJfQURKVVNUX0NPVU5UU19ICi0jZGVmaW5lIExNX0JVSUxERVJfQURKVVNUX0NPVU5UU19ICi0KLSNpbmNsdWRlICJsbS9idWlsZGVyL2Rpc2NvdW50LmhoIgotI2luY2x1ZGUgImxtL2xtX2V4Y2VwdGlvbi5oaCIKLSNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0geyBjbGFzcyBDaGFpblBvc2l0aW9uczsgfSB9Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgYnVpbGRlciB7Ci0KLWNsYXNzIEJhZERpc2NvdW50RXhjZXB0aW9uIDogcHVibGljIHV0aWw6OkV4Y2VwdGlvbiB7Ci0gIHB1YmxpYzoKLSAgICBCYWREaXNjb3VudEV4Y2VwdGlvbigpIHRocm93KCk7Ci0gICAgfkJhZERpc2NvdW50RXhjZXB0aW9uKCkgdGhyb3coKTsKLX07Ci0KLXN0cnVjdCBEaXNjb3VudENvbmZpZyB7Ci0gIC8vIE92ZXJyaWRlcyBkaXNjb3VudHMgZm9yIG9yZGVycyBbMSxkaXNjb3VudF9vdmVycmlkZS5zaXplKCldLgotICBzdGQ6OnZlY3RvcjxEaXNjb3VudD4gb3ZlcndyaXRlOwotICAvLyBJZiBkaXNjb3VudGluZyBmYWlscyBmb3IgYW4gb3JkZXIsIGNvcHkgdGhlbSBmcm9tIGhlcmUuCi0gIERpc2NvdW50IGZhbGxiYWNrOwotICAvLyBXaGF0IHRvIGRvIHdoZW4gZGlzY291bnRzIGFyZSBvdXQgb2YgcmFuZ2Ugb3Igd291bGQgdHJpZ2dlciBkaXZpc29uIGJ5Ci0gIC8vIHplcm8uICBJdCBpdCBkb2VzIHNvbWV0aGluZyBvdGhlciB0aGFuIFRIUk9XX1VQLCB1c2UgZmFsbGJhY2tfZGlzY291bnQuCi0gIFdhcm5pbmdBY3Rpb24gYmFkX2FjdGlvbjsKLX07Ci0KLS8qIENvbXB1dGUgYWRqdXN0ZWQgY291bnRzLiAgCi0gKiBJbnB1dDogdW5pcXVlIHN1ZmZpeCBzb3J0ZWQgTi1ncmFtcyAoYW5kIGp1c3QgdGhlIE4tZ3JhbXMpIHdpdGggcmF3IGNvdW50cy4KLSAqIE91dHB1dDogWzEsTl0tZ3JhbXMgd2l0aCBhZGp1c3RlZCBjb3VudHMuICAKLSAqIFsxLE4pLWdyYW1zIGFyZSBpbiBzdWZmaXggb3JkZXIKLSAqIE4tZ3JhbXMgYXJlIGluIHVuZGVmaW5lZCBvcmRlciAodGhleSdyZSBnb2luZyB0byBiZSBzb3J0ZWQgYW55d2F5KS4KLSAqLwotY2xhc3MgQWRqdXN0Q291bnRzIHsKLSAgcHVibGljOgotICAgIC8vIGNvdW50czogb3V0cHV0Ci0gICAgLy8gY291bnRzX3BydW5lZDogb3V0cHV0Ci0gICAgLy8gZGlzY291bnRzOiBtb3N0bHkgb3V0cHV0LiAgSWYgdGhlIGlucHV0IGFscmVhZHkgaGFzIGVudHJpZXMsIHRoZXkgd2lsbCBiZSBrZXB0LgotICAgIC8vIHBydW5lX3RocmVzaG9sZHM6IGlucHV0LiAgbi1ncmFtcyB3aXRoIG5vcm1hbCAobm90IGFkanVzdGVkKSBjb3VudCBiZWxvdyB0aGlzIHdpbGwgYmUgcHJ1bmVkLgotICAgIEFkanVzdENvdW50cygKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZwcnVuZV90aHJlc2hvbGRzLAotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHNfcHJ1bmVkLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxib29sPiAmcHJ1bmVfd29yZHMsCi0gICAgICAgIGNvbnN0IERpc2NvdW50Q29uZmlnICZkaXNjb3VudF9jb25maWcsCi0gICAgICAgIHN0ZDo6dmVjdG9yPERpc2NvdW50PiAmZGlzY291bnRzKQotICAgICAgOiBwcnVuZV90aHJlc2hvbGRzXyhwcnVuZV90aHJlc2hvbGRzKSwgY291bnRzXyhjb3VudHMpLCBjb3VudHNfcHJ1bmVkXyhjb3VudHNfcHJ1bmVkKSwKLSAgICAgICAgcHJ1bmVfd29yZHNfKHBydW5lX3dvcmRzKSwgZGlzY291bnRfY29uZmlnXyhkaXNjb3VudF9jb25maWcpLCBkaXNjb3VudHNfKGRpc2NvdW50cykgCi0gICAge30KLQotICAgIHZvaWQgUnVuKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJnBvc2l0aW9ucyk7Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJnBydW5lX3RocmVzaG9sZHNfOyAKLSAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50c187Ci0gICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHNfcHJ1bmVkXzsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjxib29sPiAmcHJ1bmVfd29yZHNfOwotCi0gICAgRGlzY291bnRDb25maWcgZGlzY291bnRfY29uZmlnXzsKLSAgICBzdGQ6OnZlY3RvcjxEaXNjb3VudD4gJmRpc2NvdW50c187Ci19OwotCi19IC8vIG5hbWVzcGFjZSBidWlsZGVyCi19IC8vIG5hbWVzcGFjZSBsbQotCi0jZW5kaWYgLy8gTE1fQlVJTERFUl9BREpVU1RfQ09VTlRTX0gKLQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvYWRqdXN0X2NvdW50c190ZXN0LmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvYWRqdXN0X2NvdW50c190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzNjNWRmLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2FkanVzdF9jb3VudHNfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0jaW5jbHVkZSAibG0vYnVpbGRlci9hZGp1c3RfY291bnRzLmhoIgotCi0jaW5jbHVkZSAibG0vYnVpbGRlci9uZ3JhbV9zdHJlYW0uaGgiCi0jaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCi0KLSNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KLSNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgQWRqdXN0Q291bnRzCi0jaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgotCi1uYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7IG5hbWVzcGFjZSB7Ci0KLWNsYXNzIEtlZXBDb3B5IHsKLSAgcHVibGljOgotICAgIEtlZXBDb3B5KCkgOiBzaXplXygwKSB7fQotCi0gICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgewotICAgICAgZm9yICh1dGlsOjpzdHJlYW06OkxpbmsgbGluayhwb3NpdGlvbik7IGxpbms7ICsrbGluaykgewotICAgICAgICBtZW1fLmNhbGxfcmVhbGxvYyhzaXplXyArIGxpbmstPlZhbGlkU2l6ZSgpKTsKLSAgICAgICAgbWVtY3B5KHN0YXRpY19jYXN0PHVpbnQ4X3QqPihtZW1fLmdldCgpKSArIHNpemVfLCBsaW5rLT5HZXQoKSwgbGluay0+VmFsaWRTaXplKCkpOwotICAgICAgICBzaXplXyArPSBsaW5rLT5WYWxpZFNpemUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB1aW50OF90ICpHZXQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Kj4obWVtXy5nZXQoKSk7IH0KLSAgICBzdGQ6OnNpemVfdCBTaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KLQotICBwcml2YXRlOgotICAgIHV0aWw6OnNjb3BlZF9tYWxsb2MgbWVtXzsKLSAgICBzdGQ6OnNpemVfdCBzaXplXzsKLX07Ci0KLXN0cnVjdCBHcmFtNCB7Ci0gIFdvcmRJbmRleCBpZHNbNF07Ci0gIHVpbnQ2NF90IGNvdW50OwotfTsKLQotY2xhc3MgV3JpdGVJbnB1dCB7Ci0gIHB1YmxpYzoKLSAgICB2b2lkIFJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7Ci0gICAgICBOR3JhbVN0cmVhbSBpbnB1dChwb3NpdGlvbik7Ci0gICAgICBHcmFtNCBncmFtc1tdID0gewotICAgICAgICB7ezAsMCwwLDB9LDEwfSwKLSAgICAgICAge3swLDAsMywwfSwzfSwKLSAgICAgICAgLy8gYm9zCi0gICAgICAgIHt7MSwxLDEsMn0sNX0sCi0gICAgICAgIHt7MCwwLDMsMn0sNX0sCi0gICAgICB9OwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoZ3JhbXMpIC8gc2l6ZW9mKEdyYW00KTsgKytpLCArK2lucHV0KSB7Ci0gICAgICAgIG1lbWNweShpbnB1dC0+YmVnaW4oKSwgZ3JhbXNbaV0uaWRzLCBzaXplb2YoV29yZEluZGV4KSAqIDQpOwotICAgICAgICBpbnB1dC0+Q291bnQoKSA9IGdyYW1zW2ldLmNvdW50OwotICAgICAgfQotICAgICAgaW5wdXQuUG9pc29uKCk7Ci0gICAgfQotfTsKLQotQk9PU1RfQVVUT19URVNUX0NBU0UoU2ltcGxlKSB7Ci0gIEtlZXBDb3B5IG91dHB1dHNbNF07Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBjb3VudHM7Ci0gIHN0ZDo6dmVjdG9yPERpc2NvdW50PiBkaXNjb3VudDsKLSAgewotICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Db25maWcgY29uZmlnOwotICAgIGNvbmZpZy50b3RhbF9tZW1vcnkgPSAxMDA7Ci0gICAgY29uZmlnLmJsb2NrX2NvdW50ID0gMTsKLSAgICB1dGlsOjpzdHJlYW06OkNoYWlucyBjaGFpbnMoNCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDQ7ICsraSkgewotICAgICAgY29uZmlnLmVudHJ5X3NpemUgPSBOR3JhbTo6VG90YWxTaXplKGkgKyAxKTsKLSAgICAgIGNoYWlucy5wdXNoX2JhY2soY29uZmlnKTsKLSAgICB9Ci0KLSAgICBjaGFpbnNbM10gPj4gV3JpdGVJbnB1dCgpOwotICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgZm9yX2FkanVzdChjaGFpbnMpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICAgIGNoYWluc1tpXSA+PiBib29zdDo6cmVmKG91dHB1dHNbaV0pOwotICAgIH0KLSAgICBjaGFpbnMgPj4gdXRpbDo6c3RyZWFtOjprUmVjeWNsZTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRzX3BydW5lZCg0KTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gcHJ1bmVfdGhyZXNob2xkcyg0KTsKLSAgICBEaXNjb3VudENvbmZpZyBkaXNjb3VudF9jb25maWc7Ci0gICAgZGlzY291bnRfY29uZmlnLmZhbGxiYWNrID0gRGlzY291bnQoKTsKLSAgICBkaXNjb3VudF9jb25maWcuYmFkX2FjdGlvbiA9IFRIUk9XX1VQOwotICAgIEJPT1NUX0NIRUNLX1RIUk9XKEFkanVzdENvdW50cyhwcnVuZV90aHJlc2hvbGRzLCBjb3VudHMsIGNvdW50c19wcnVuZWQsIGRpc2NvdW50X2NvbmZpZywgZGlzY291bnQpLlJ1bihmb3JfYWRqdXN0KSwgQmFkRGlzY291bnRFeGNlcHRpb24pOwotICB9Ci0gIEJPT1NUX1JFUVVJUkVfRVFVQUwoNFVMLCBjb3VudHMuc2l6ZSgpKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoNFVMLCBjb3VudHNbMF0pOwotICAvLyBUaGVzZSBhcmUgbm8gbG9uZ2VyIHNldCBiZWNhdXNlIHRoZSBkaXNjb3VudHMgYXJlIGJhZC4gIAotLyogIEJPT1NUX0NIRUNLX0VRVUFMKDRVTCwgY291bnRzWzFdKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoM1VMLCBjb3VudHNbMl0pOwotICBCT09TVF9DSEVDS19FUVVBTCgzVUwsIGNvdW50c1szXSk7Ki8KLSAgQk9PU1RfUkVRVUlSRV9FUVVBTChOR3JhbTo6VG90YWxTaXplKDEpICogNCwgb3V0cHV0c1swXS5TaXplKCkpOwotICBOR3JhbSB1bmkob3V0cHV0c1swXS5HZXQoKSwgMSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKGtVTkssICp1bmkuYmVnaW4oKSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDBVTEwsIHVuaS5Db3VudCgpKTsKLSAgdW5pLk5leHRJbk1lbW9yeSgpOwotICBCT09TVF9DSEVDS19FUVVBTChrQk9TLCAqdW5pLmJlZ2luKCkpOwotICBCT09TVF9DSEVDS19FUVVBTCgwVUxMLCB1bmkuQ291bnQoKSk7Ci0gIHVuaS5OZXh0SW5NZW1vcnkoKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMFVMLCAqdW5pLmJlZ2luKCkpOwotICBCT09TVF9DSEVDS19FUVVBTCgyVUxMLCB1bmkuQ291bnQoKSk7Ci0gIHVuaS5OZXh0SW5NZW1vcnkoKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMlVMTCwgdW5pLkNvdW50KCkpOwotICBCT09TVF9DSEVDS19FUVVBTCgyVUwsICp1bmkuYmVnaW4oKSk7Ci0KLSAgQk9PU1RfUkVRVUlSRV9FUVVBTChOR3JhbTo6VG90YWxTaXplKDIpICogNCwgb3V0cHV0c1sxXS5TaXplKCkpOwotICBOR3JhbSBiaShvdXRwdXRzWzFdLkdldCgpLCAyKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMFVMLCAqYmkuYmVnaW4oKSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDBVTCwgKihiaS5iZWdpbigpICsgMSkpOwotICBCT09TVF9DSEVDS19FUVVBTCgxVUxMLCBiaS5Db3VudCgpKTsKLSAgYmkuTmV4dEluTWVtb3J5KCk7Ci19Ci0KLX19fSAvLyBuYW1lc3BhY2VzCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9jb3JwdXNfY291bnQuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9jb3JwdXNfY291bnQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmM2RhZmEuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvY29ycHVzX2NvdW50LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLSNpbmNsdWRlICJsbS9idWlsZGVyL2NvcnB1c19jb3VudC5oaCIKLQotI2luY2x1ZGUgImxtL2J1aWxkZXIvbmdyYW0uaGgiCi0jaW5jbHVkZSAibG0vbG1fZXhjZXB0aW9uLmhoIgotI2luY2x1ZGUgImxtL3ZvY2FiLmhoIgotI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCi0jaW5jbHVkZSAidXRpbC9mYWtlX29mc3RyZWFtLmhoIgotI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKLSNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCi0jaW5jbHVkZSAidXRpbC9tdXJtdXJfaGFzaC5oaCIKLSNpbmNsdWRlICJ1dGlsL3Byb2JpbmdfaGFzaF90YWJsZS5oaCIKLSNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9jaGFpbi5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS90aW1lci5oaCIKLSNpbmNsdWRlICJ1dGlsL3Rva2VuaXplX3BpZWNlLmhoIgotCi0jaW5jbHVkZSA8Ym9vc3QvdW5vcmRlcmVkX3NldC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdW5vcmRlcmVkX21hcC5ocHA+Ci0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgYnVpbGRlciB7Ci1uYW1lc3BhY2UgewotCi0jcHJhZ21hIHBhY2socHVzaCkKLSNwcmFnbWEgcGFjayg0KQotc3RydWN0IFZvY2FiRW50cnkgewotICB0eXBlZGVmIHVpbnQ2NF90IEtleTsKLQotICB1aW50NjRfdCBHZXRLZXkoKSBjb25zdCB7IHJldHVybiBrZXk7IH0KLSAgdm9pZCBTZXRLZXkodWludDY0X3QgdG8pIHsga2V5ID0gdG87IH0KLQotICB1aW50NjRfdCBrZXk7Ci0gIGxtOjpXb3JkSW5kZXggdmFsdWU7Ci19OwotI3ByYWdtYSBwYWNrKHBvcCkKLQotY2xhc3MgRGVkdXBlSGFzaCA6IHB1YmxpYyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPGNvbnN0IFdvcmRJbmRleCAqLCBib29sPiB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBEZWR1cGVIYXNoKHN0ZDo6c2l6ZV90IG9yZGVyKSA6IHNpemVfKG9yZGVyICogc2l6ZW9mKFdvcmRJbmRleCkpIHt9Ci0KLSAgICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IFdvcmRJbmRleCAqc3RhcnQpIGNvbnN0IHsKLSAgICAgIHJldHVybiB1dGlsOjpNdXJtdXJIYXNoTmF0aXZlKHN0YXJ0LCBzaXplXyk7Ci0gICAgfQotICAgIAotICBwcml2YXRlOgotICAgIGNvbnN0IHN0ZDo6c2l6ZV90IHNpemVfOwotfTsKLQotY2xhc3MgRGVkdXBlRXF1YWxzIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPGNvbnN0IFdvcmRJbmRleCAqLCBjb25zdCBXb3JkSW5kZXggKiwgYm9vbD4gewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgRGVkdXBlRXF1YWxzKHN0ZDo6c2l6ZV90IG9yZGVyKSA6IHNpemVfKG9yZGVyICogc2l6ZW9mKFdvcmRJbmRleCkpIHt9Ci0gICAgCi0gICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFdvcmRJbmRleCAqZmlyc3QsIGNvbnN0IFdvcmRJbmRleCAqc2Vjb25kKSBjb25zdCB7Ci0gICAgICByZXR1cm4gIW1lbWNtcChmaXJzdCwgc2Vjb25kLCBzaXplXyk7Ci0gICAgfSAKLSAgICAKLSAgcHJpdmF0ZToKLSAgICBjb25zdCBzdGQ6OnNpemVfdCBzaXplXzsKLX07Ci0KLXN0cnVjdCBEZWR1cGVFbnRyeSB7Ci0gIHR5cGVkZWYgV29yZEluZGV4ICpLZXk7Ci0gIEtleSBHZXRLZXkoKSBjb25zdCB7IHJldHVybiBrZXk7IH0KLSAgdm9pZCBTZXRLZXkoV29yZEluZGV4ICp0bykgeyBrZXkgPSB0bzsgfQotICBLZXkga2V5OwotICBzdGF0aWMgRGVkdXBlRW50cnkgQ29uc3RydWN0KFdvcmRJbmRleCAqYXQpIHsKLSAgICBEZWR1cGVFbnRyeSByZXQ7Ci0gICAgcmV0LmtleSA9IGF0OwotICAgIHJldHVybiByZXQ7Ci0gIH0KLX07Ci0KLQotLy8gVE9ETzogZG9uJ3QgaGF2ZSB0aGlzIGhlcmUsIHNob3VsZCBiZSB3aXRoIHByb2JpbmcgaGFzaCB0YWJsZSBkZWZhdWx0cz8KLWNvbnN0IGZsb2F0IGtQcm9iaW5nTXVsdGlwbGllciA9IDEuNTsKLQotdHlwZWRlZiB1dGlsOjpQcm9iaW5nSGFzaFRhYmxlPERlZHVwZUVudHJ5LCBEZWR1cGVIYXNoLCBEZWR1cGVFcXVhbHM+IERlZHVwZTsKLQotY2xhc3MgV3JpdGVyIHsKLSAgcHVibGljOgotICAgIFdyaXRlcihzdGQ6OnNpemVfdCBvcmRlciwgY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbiwgdm9pZCAqZGVkdXBlX21lbSwgc3RkOjpzaXplX3QgZGVkdXBlX21lbV9zaXplKSAKLSAgICAgIDogYmxvY2tfKHBvc2l0aW9uKSwgZ3JhbV8oYmxvY2tfLT5HZXQoKSwgb3JkZXIpLAotICAgICAgICBkZWR1cGVfaW52YWxpZF8ob3JkZXIsIHN0ZDo6bnVtZXJpY19saW1pdHM8V29yZEluZGV4Pjo6bWF4KCkpLAotICAgICAgICBkZWR1cGVfKGRlZHVwZV9tZW0sIGRlZHVwZV9tZW1fc2l6ZSwgJmRlZHVwZV9pbnZhbGlkX1swXSwgRGVkdXBlSGFzaChvcmRlciksIERlZHVwZUVxdWFscyhvcmRlcikpLAotICAgICAgICBidWZmZXJfKG5ldyBXb3JkSW5kZXhbb3JkZXIgLSAxXSksCi0gICAgICAgIGJsb2NrX3NpemVfKHBvc2l0aW9uLkdldENoYWluKCkuQmxvY2tTaXplKCkpIHsKLSAgICAgIGRlZHVwZV8uQ2xlYXIoKTsKLSAgICAgIGFzc2VydChEZWR1cGU6OlNpemUocG9zaXRpb24uR2V0Q2hhaW4oKS5CbG9ja1NpemUoKSAvIHBvc2l0aW9uLkdldENoYWluKCkuRW50cnlTaXplKCksIGtQcm9iaW5nTXVsdGlwbGllcikgPT0gZGVkdXBlX21lbV9zaXplKTsKLSAgICAgIGlmIChvcmRlciA9PSAxKSB7Ci0gICAgICAgIC8vIEFkZCBzcGVjaWFsIHdvcmRzLiAgQWRqdXN0Q291bnRzIGlzIHJlc3BvbnNpYmxlIGlmIG9yZGVyICE9IDEuICAgIAotICAgICAgICBBZGRVbmlncmFtV29yZChrVU5LKTsKLSAgICAgICAgQWRkVW5pZ3JhbVdvcmQoa0JPUyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgfldyaXRlcigpIHsKLSAgICAgIGJsb2NrXy0+U2V0VmFsaWRTaXplKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGdyYW1fLmJlZ2luKCkpIC0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJsb2NrXy0+R2V0KCkpKTsKLSAgICAgICgrK2Jsb2NrXykuUG9pc29uKCk7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgY29udGV4dCB3aXRoIGEgYnVuY2ggb2YgPHM+Ci0gICAgdm9pZCBTdGFydFNlbnRlbmNlKCkgewotICAgICAgZm9yIChXb3JkSW5kZXggKmkgPSBncmFtXy5iZWdpbigpOyBpICE9IGdyYW1fLmVuZCgpIC0gMTsgKytpKSB7Ci0gICAgICAgICppID0ga0JPUzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIEFwcGVuZChXb3JkSW5kZXggd29yZCkgewotICAgICAgKihncmFtXy5lbmQoKSAtIDEpID0gd29yZDsKLSAgICAgIERlZHVwZTo6TXV0YWJsZUl0ZXJhdG9yIGF0OwotICAgICAgYm9vbCBmb3VuZCA9IGRlZHVwZV8uRmluZE9ySW5zZXJ0KERlZHVwZUVudHJ5OjpDb25zdHJ1Y3QoZ3JhbV8uYmVnaW4oKSksIGF0KTsKLSAgICAgIGlmIChmb3VuZCkgewotICAgICAgICAvLyBBbHJlYWR5IHByZXNlbnQuCi0gICAgICAgIE5HcmFtIGFscmVhZHkoYXQtPmtleSwgZ3JhbV8uT3JkZXIoKSk7Ci0gICAgICAgICsrKGFscmVhZHkuQ291bnQoKSk7Ci0gICAgICAgIC8vIFNoaWZ0IGxlZnQgYnkgb25lLgotICAgICAgICBtZW1tb3ZlKGdyYW1fLmJlZ2luKCksIGdyYW1fLmJlZ2luKCkgKyAxLCBzaXplb2YoV29yZEluZGV4KSAqIChncmFtXy5PcmRlcigpIC0gMSkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAvLyBDb21wbGV0ZSB0aGUgd3JpdGUuICAKLSAgICAgIGdyYW1fLkNvdW50KCkgPSAxOwotICAgICAgLy8gUHJlcGFyZSB0aGUgbmV4dCBuLWdyYW0uICAKLSAgICAgIGlmIChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihncmFtXy5iZWdpbigpKSArIGdyYW1fLlRvdGFsU2l6ZSgpICE9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihibG9ja18tPkdldCgpKSArIGJsb2NrX3NpemVfKSB7Ci0gICAgICAgIE5HcmFtIGxhc3QoZ3JhbV8pOwotICAgICAgICBncmFtXy5OZXh0SW5NZW1vcnkoKTsKLSAgICAgICAgc3RkOjpjb3B5KGxhc3QuYmVnaW4oKSArIDEsIGxhc3QuZW5kKCksIGdyYW1fLmJlZ2luKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAvLyBCbG9jayBlbmQuICBOZWVkIHRvIHN0b3JlIHRoZSBjb250ZXh0IGluIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gIAotICAgICAgc3RkOjpjb3B5KGdyYW1fLmJlZ2luKCkgKyAxLCBncmFtXy5lbmQoKSwgYnVmZmVyXy5nZXQoKSk7Ci0gICAgICBkZWR1cGVfLkNsZWFyKCk7Ci0gICAgICBibG9ja18tPlNldFZhbGlkU2l6ZShibG9ja19zaXplXyk7Ci0gICAgICBncmFtXy5SZUJhc2UoKCsrYmxvY2tfKS0+R2V0KCkpOwotICAgICAgc3RkOjpjb3B5KGJ1ZmZlcl8uZ2V0KCksIGJ1ZmZlcl8uZ2V0KCkgKyBncmFtXy5PcmRlcigpIC0gMSwgZ3JhbV8uYmVnaW4oKSk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgdm9pZCBBZGRVbmlncmFtV29yZChXb3JkSW5kZXggaW5kZXgpIHsKLSAgICAgICpncmFtXy5iZWdpbigpID0gaW5kZXg7Ci0gICAgICBncmFtXy5Db3VudCgpID0gMDsKLSAgICAgIGdyYW1fLk5leHRJbk1lbW9yeSgpOwotICAgICAgaWYgKGdyYW1fLkJhc2UoKSA9PSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYmxvY2tfLT5HZXQoKSkgKyBibG9ja19zaXplXykgewotICAgICAgICBibG9ja18tPlNldFZhbGlkU2l6ZShibG9ja19zaXplXyk7Ci0gICAgICAgIGdyYW1fLlJlQmFzZSgoKytibG9ja18pLT5HZXQoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdXRpbDo6c3RyZWFtOjpMaW5rIGJsb2NrXzsKLQotICAgIE5HcmFtIGdyYW1fOwotCi0gICAgLy8gVGhpcyBpcyB0aGUgbWVtb3J5IGJlaGluZCB0aGUgaW52YWxpZCB2YWx1ZSBpbiBkZWR1cGVfLgotICAgIHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gZGVkdXBlX2ludmFsaWRfOwotICAgIC8vIEhhc2ggdGFibGUgY29tYmluZXIgaW1wbGVtZW50YXRpb24uCi0gICAgRGVkdXBlIGRlZHVwZV87Ci0KLSAgICAvLyBTbWFsbCBidWZmZXIgdG8gaG9sZCBleGlzdGluZyBuZ3JhbXMgd2hlbiBzaGlmdGluZyBhY3Jvc3MgYSBibG9jayBib3VuZGFyeS4gIAotICAgIGJvb3N0OjpzY29wZWRfYXJyYXk8V29yZEluZGV4PiBidWZmZXJfOwotCi0gICAgY29uc3Qgc3RkOjpzaXplX3QgYmxvY2tfc2l6ZV87Ci19OwotCi19IC8vIG5hbWVzcGFjZQotCi1mbG9hdCBDb3JwdXNDb3VudDo6RGVkdXBlTXVsdGlwbGllcihzdGQ6OnNpemVfdCBvcmRlcikgewotICByZXR1cm4ga1Byb2JpbmdNdWx0aXBsaWVyICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNpemVvZihEZWR1cGVFbnRyeSkpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KE5HcmFtOjpUb3RhbFNpemUob3JkZXIpKTsKLX0KLQotc3RkOjpzaXplX3QgQ29ycHVzQ291bnQ6OlZvY2FiVXNhZ2Uoc3RkOjpzaXplX3Qgdm9jYWJfZXN0aW1hdGUpIHsKLSAgcmV0dXJuIG5ncmFtOjpHcm93YWJsZVZvY2FiPG5ncmFtOjpXcml0ZVVuaXF1ZVdvcmRzPjo6TWVtVXNhZ2Uodm9jYWJfZXN0aW1hdGUpOwotfQotCi1Db3JwdXNDb3VudDo6Q29ycHVzQ291bnQodXRpbDo6RmlsZVBpZWNlICZmcm9tLCBpbnQgdm9jYWJfd3JpdGUsIHVpbnQ2NF90ICZ0b2tlbl9jb3VudCwgV29yZEluZGV4ICZ0eXBlX2NvdW50LCBzdGQ6OnZlY3Rvcjxib29sPiAmcHJ1bmVfd29yZHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcnVuZV92b2NhYl9maWxlbmFtZSwgc3RkOjpzaXplX3QgZW50cmllc19wZXJfYmxvY2ssIFdhcm5pbmdBY3Rpb24gZGlzYWxsb3dlZF9zeW1ib2wpCi0gIDogZnJvbV8oZnJvbSksIHZvY2FiX3dyaXRlXyh2b2NhYl93cml0ZSksIHRva2VuX2NvdW50Xyh0b2tlbl9jb3VudCksIHR5cGVfY291bnRfKHR5cGVfY291bnQpLAotICAgIHBydW5lX3dvcmRzXyhwcnVuZV93b3JkcyksIHBydW5lX3ZvY2FiX2ZpbGVuYW1lXyhwcnVuZV92b2NhYl9maWxlbmFtZSksCi0gICAgZGVkdXBlX21lbV9zaXplXyhEZWR1cGU6OlNpemUoZW50cmllc19wZXJfYmxvY2ssIGtQcm9iaW5nTXVsdGlwbGllcikpLAotICAgIGRlZHVwZV9tZW1fKHV0aWw6Ok1hbGxvY09yVGhyb3coZGVkdXBlX21lbV9zaXplXykpLAotICAgIGRpc2FsbG93ZWRfc3ltYm9sX2FjdGlvbl8oZGlzYWxsb3dlZF9zeW1ib2wpIHsKLX0KLQotbmFtZXNwYWNlIHsKLSAgdm9pZCBDb21wbGFpbkRpc2FsbG93ZWQoU3RyaW5nUGllY2Ugd29yZCwgV2FybmluZ0FjdGlvbiAmYWN0aW9uKSB7Ci0gICAgc3dpdGNoIChhY3Rpb24pIHsKLSAgICAgIGNhc2UgU0lMRU5UOgotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIENPTVBMQUlOOgotICAgICAgICBzdGQ6OmNlcnIgPDwgIldhcm5pbmc6ICIgPDwgd29yZCA8PCAiIGFwcGVhcnMgaW4gdGhlIGlucHV0LiAgQWxsIGluc3RhbmNlcyBvZiA8cz4sIDwvcz4sIGFuZCA8dW5rPiB3aWxsIGJlIGludGVycHJldGVkIGFzIHdoaXRlc3BhY2UuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIGFjdGlvbiA9IFNJTEVOVDsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBUSFJPV19VUDoKLSAgICAgICAgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiU3BlY2lhbCB3b3JkICIgPDwgd29yZCA8PCAiIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjb3JwdXMuICBJIHBsYW4gdG8gc3VwcG9ydCBtb2RlbHMgY29udGFpbmluZyA8dW5rPiBpbiB0aGUgZnV0dXJlLiAgUGFzcyAtLXNraXBfc3ltYm9scyB0byBjb252ZXJ0IHRoZXNlIHN5bWJvbHMgdG8gd2hpdGVzcGFjZS4iKTsKLSAgICB9Ci0gIH0KLX0gLy8gbmFtZXNwYWNlCi0KLXZvaWQgQ29ycHVzQ291bnQ6OlJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7Ci0gIG5ncmFtOjpHcm93YWJsZVZvY2FiPG5ncmFtOjpXcml0ZVVuaXF1ZVdvcmRzPiB2b2NhYih0eXBlX2NvdW50Xywgdm9jYWJfd3JpdGVfKTsKLSAgdG9rZW5fY291bnRfID0gMDsKLSAgdHlwZV9jb3VudF8gPSAwOwotICBjb25zdCBXb3JkSW5kZXggZW5kX3NlbnRlbmNlID0gdm9jYWIuRmluZE9ySW5zZXJ0KCI8L3M+Iik7Ci0gIFdyaXRlciB3cml0ZXIoTkdyYW06Ok9yZGVyRnJvbVNpemUocG9zaXRpb24uR2V0Q2hhaW4oKS5FbnRyeVNpemUoKSksIHBvc2l0aW9uLCBkZWR1cGVfbWVtXy5nZXQoKSwgZGVkdXBlX21lbV9zaXplXyk7Ci0gIHVpbnQ2NF90IGNvdW50ID0gMDsKLSAgYm9vbCBkZWxpbWl0ZXJzWzI1Nl07Ci0gIHV0aWw6OkJvb2xDaGFyYWN0ZXI6OkJ1aWxkKCJcMFx0XG5cciAiLCBkZWxpbWl0ZXJzKTsKLSAgdHJ5IHsKLSAgICB3aGlsZSh0cnVlKSB7Ci0gICAgICBTdHJpbmdQaWVjZSBsaW5lKGZyb21fLlJlYWRMaW5lKCkpOwotICAgICAgd3JpdGVyLlN0YXJ0U2VudGVuY2UoKTsKLSAgICAgIGZvciAodXRpbDo6VG9rZW5JdGVyPHV0aWw6OkJvb2xDaGFyYWN0ZXIsIHRydWU+IHcobGluZSwgZGVsaW1pdGVycyk7IHc7ICsrdykgewotICAgICAgICBXb3JkSW5kZXggd29yZCA9IHZvY2FiLkZpbmRPckluc2VydCgqdyk7Ci0gICAgICAgIGlmICh3b3JkIDw9IDIpIHsKLSAgICAgICAgICBDb21wbGFpbkRpc2FsbG93ZWQoKncsIGRpc2FsbG93ZWRfc3ltYm9sX2FjdGlvbl8pOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlci5BcHBlbmQod29yZCk7Ci0gICAgICAgICsrY291bnQ7Ci0gICAgICB9Ci0gICAgICB3cml0ZXIuQXBwZW5kKGVuZF9zZW50ZW5jZSk7Ci0gICAgfQotICB9IGNhdGNoIChjb25zdCB1dGlsOjpFbmRPZkZpbGVFeGNlcHRpb24gJmUpIHt9Ci0gIHRva2VuX2NvdW50XyA9IGNvdW50OwotICB0eXBlX2NvdW50XyA9IHZvY2FiLlNpemUoKTsKLSAgCi0gIC8vIENyZWF0ZSBsaXN0IG9mIHVuaWdyYW1zIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIHBydW5lZAotICBpZiAoIXBydW5lX3ZvY2FiX2ZpbGVuYW1lXy5lbXB0eSgpKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHV0aWw6OkZpbGVQaWVjZSBwcnVuZV92b2NhYl9maWxlKHBydW5lX3ZvY2FiX2ZpbGVuYW1lXy5jX3N0cigpKTsKLSAgICAgIAotICAgICAgcHJ1bmVfd29yZHNfLnJlc2l6ZSh2b2NhYi5TaXplKCksIHRydWUpOwotICAgICAgdHJ5IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICBTdHJpbmdQaWVjZSBsaW5lKHBydW5lX3ZvY2FiX2ZpbGUuUmVhZExpbmUoKSk7Ci0gICAgICAgICAgZm9yICh1dGlsOjpUb2tlbkl0ZXI8dXRpbDo6Qm9vbENoYXJhY3RlciwgdHJ1ZT4gdyhsaW5lLCBkZWxpbWl0ZXJzKTsgdzsgKyt3KQotICAgICAgICAgICAgcHJ1bmVfd29yZHNfW3ZvY2FiLkluZGV4KCp3KV0gPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoY29uc3QgdXRpbDo6RW5kT2ZGaWxlRXhjZXB0aW9uICZlKSB7fQotICAgICAgCi0gICAgICAvLyBOZXZlciBwcnVuZSA8dW5rPiwgPHM+LCA8L3M+Ci0gICAgICBwcnVuZV93b3Jkc19ba1VOS10gPSBmYWxzZTsKLSAgICAgIHBydW5lX3dvcmRzX1trQk9TXSA9IGZhbHNlOwotICAgICAgcHJ1bmVfd29yZHNfW2tFT1NdID0gZmFsc2U7Ci0gICAgICAKLSAgICB9IGNhdGNoIChjb25zdCB1dGlsOjpFeGNlcHRpb24gJmUpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBidWlsZGVyCi19IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvY29ycHVzX2NvdW50LmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvY29ycHVzX2NvdW50LmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzEyMWNhLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2NvcnB1c19jb3VudC5oaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSNpZm5kZWYgTE1fQlVJTERFUl9DT1JQVVNfQ09VTlRfSAotI2RlZmluZSBMTV9CVUlMREVSX0NPUlBVU19DT1VOVF9ICi0KLSNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAibG0vd29yZF9pbmRleC5oaCIKLSNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIHV0aWwgewotY2xhc3MgRmlsZVBpZWNlOwotbmFtZXNwYWNlIHN0cmVhbSB7Ci1jbGFzcyBDaGFpblBvc2l0aW9uOwotfSAvLyBuYW1lc3BhY2Ugc3RyZWFtCi19IC8vIG5hbWVzcGFjZSB1dGlsCi0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgYnVpbGRlciB7Ci0KLWNsYXNzIENvcnB1c0NvdW50IHsKLSAgcHVibGljOgotICAgIC8vIE1lbW9yeSB1c2FnZSB3aWxsIGJlIERlZHVwZU11bHRpcGxlcihvcmRlcikgKiBibG9ja19zaXplICsgdG90YWxfY2hhaW5fc2l6ZSArIHVua25vd24gdm9jYWJfaGFzaF9zaXplCi0gICAgc3RhdGljIGZsb2F0IERlZHVwZU11bHRpcGxpZXIoc3RkOjpzaXplX3Qgb3JkZXIpOwotCi0gICAgLy8gSG93IG11Y2ggbWVtb3J5IHZvY2FidWxhcnkgd2lsbCB1c2UgYmFzZWQgb24gZXN0aW1hdGVkIHNpemUgb2YgdGhlIHZvY2FiLgotICAgIHN0YXRpYyBzdGQ6OnNpemVfdCBWb2NhYlVzYWdlKHN0ZDo6c2l6ZV90IHZvY2FiX2VzdGltYXRlKTsKLQotICAgIC8vIHRva2VuX2NvdW50OiBvdXQuCi0gICAgLy8gdHlwZV9jb3VudCBha2Egdm9jYWJ1bGFyeSBzaXplLiAgSW5pdGlhbGl6ZSB0byBhbiBlc3RpbWF0ZS4gIEl0IGlzIHNldCB0byB0aGUgZXhhY3QgdmFsdWUuCi0gICAgQ29ycHVzQ291bnQodXRpbDo6RmlsZVBpZWNlICZmcm9tLCBpbnQgdm9jYWJfd3JpdGUsIHVpbnQ2NF90ICZ0b2tlbl9jb3VudCwgV29yZEluZGV4ICZ0eXBlX2NvdW50LCBzdGQ6OnZlY3Rvcjxib29sPiAmcHJ1bmVfd29yZHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcnVuZV92b2NhYl9maWxlbmFtZSwgc3RkOjpzaXplX3QgZW50cmllc19wZXJfYmxvY2ssIFdhcm5pbmdBY3Rpb24gZGlzYWxsb3dlZF9zeW1ib2wpOwotCi0gICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbik7Ci0KLSAgcHJpdmF0ZToKLSAgICB1dGlsOjpGaWxlUGllY2UgJmZyb21fOwotICAgIGludCB2b2NhYl93cml0ZV87Ci0gICAgdWludDY0X3QgJnRva2VuX2NvdW50XzsKLSAgICBXb3JkSW5kZXggJnR5cGVfY291bnRfOwotICAgIHN0ZDo6dmVjdG9yPGJvb2w+JiBwcnVuZV93b3Jkc187Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBydW5lX3ZvY2FiX2ZpbGVuYW1lXzsgCi0KLSAgICBzdGQ6OnNpemVfdCBkZWR1cGVfbWVtX3NpemVfOwotICAgIHV0aWw6OnNjb3BlZF9tYWxsb2MgZGVkdXBlX21lbV87Ci0KLSAgICBXYXJuaW5nQWN0aW9uIGRpc2FsbG93ZWRfc3ltYm9sX2FjdGlvbl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBidWlsZGVyCi19IC8vIG5hbWVzcGFjZSBsbQotI2VuZGlmIC8vIExNX0JVSUxERVJfQ09SUFVTX0NPVU5UX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2NvcnB1c19jb3VudF90ZXN0LmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvY29ycHVzX2NvdW50X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Y2I2MzQuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvY29ycHVzX2NvdW50X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jaW5jbHVkZSAibG0vYnVpbGRlci9jb3JwdXNfY291bnQuaGgiCi0KLSNpbmNsdWRlICJsbS9idWlsZGVyL25ncmFtLmhoIgotI2luY2x1ZGUgImxtL2J1aWxkZXIvbmdyYW1fc3RyZWFtLmhoIgotCi0jaW5jbHVkZSAidXRpbC9maWxlLmhoIgotI2luY2x1ZGUgInV0aWwvZmlsZV9waWVjZS5oaCIKLSNpbmNsdWRlICJ1dGlsL3Rva2VuaXplX3BpZWNlLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NoYWluLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL3N0cmVhbS5oaCIKLQotI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBDb3JwdXNDb3VudFRlc3QKLSNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+Ci0KLW5hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBidWlsZGVyIHsgbmFtZXNwYWNlIHsKLQotI2RlZmluZSBDaGVjayhzdHIsIGNvdW50KSB7IFwKLSAgQk9PU1RfUkVRVUlSRShzdHJlYW0pOyBcCi0gIHcgPSBzdHJlYW0tPmJlZ2luKCk7IFwKLSAgZm9yICh1dGlsOjpUb2tlbkl0ZXI8dXRpbDo6QW55Q2hhcmFjdGVyLCB0cnVlPiB0KHN0ciwgIiAiKTsgdDsgKyt0LCArK3cpIHsgXAotICAgIEJPT1NUX0NIRUNLX0VRVUFMKCp0LCB2Wyp3XSk7IFwKLSAgfSBcCi0gIEJPT1NUX0NIRUNLX0VRVUFMKCh1aW50NjRfdCljb3VudCwgc3RyZWFtLT5Db3VudCgpKTsgXAotICArK3N0cmVhbTsgXAotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShTaG9ydCkgewotICB1dGlsOjpzY29wZWRfZmQgaW5wdXRfZmlsZSh1dGlsOjpNYWtlVGVtcCgiY29ycHVzX2NvdW50X3Rlc3RfdGVtcCIpKTsKLSAgY29uc3QgY2hhciBpbnB1dFtdID0gImxvb2tpbmcgb24gYSBsaXR0bGUgbW9yZSBsb2luXG5vbiBhIGxpdHRsZSBtb3JlIGxvaW5cbm9uIGZvbyBsaXR0bGUgbW9yZSBsb2luXG5iYXJcblxuIjsKLSAgLy8gQmxvY2tzIG9mIDEwIGFyZQotICAvLyBsb29raW5nIG9uIGEgbGl0dGxlIG1vcmUgbG9pbiA8L3M+IG9uIGEgbGl0dGxlW2R1cGxpY2F0ZV0gbW9yZVtkdXBsaWNhdGVdIGxvaW5bZHVwbGljYXRlXSA8L3M+W2R1cGxpY2F0ZV0gb25bZHVwbGljYXRlXSBmb28KLSAgLy8gbGl0dGxlIG1vcmUgbG9pbiA8L3M+IGJhciA8L3M+IDwvcz4KLQotICB1dGlsOjpXcml0ZU9yVGhyb3coaW5wdXRfZmlsZS5nZXQoKSwgaW5wdXQsIHNpemVvZihpbnB1dCkgLSAxKTsKLSAgdXRpbDo6RmlsZVBpZWNlIGlucHV0X3BpZWNlKGlucHV0X2ZpbGUucmVsZWFzZSgpLCAidGVtcCBmaWxlIik7Ci0KLSAgdXRpbDo6c3RyZWFtOjpDaGFpbkNvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy5lbnRyeV9zaXplID0gTkdyYW06OlRvdGFsU2l6ZSgzKTsKLSAgY29uZmlnLnRvdGFsX21lbW9yeSA9IGNvbmZpZy5lbnRyeV9zaXplICogMjA7Ci0gIGNvbmZpZy5ibG9ja19jb3VudCA9IDI7Ci0KLSAgdXRpbDo6c2NvcGVkX2ZkIHZvY2FiKHV0aWw6Ok1ha2VUZW1wKCJjb3JwdXNfY291bnRfdGVzdF92b2NhYiIpKTsKLQotICB1dGlsOjpzdHJlYW06OkNoYWluIGNoYWluKGNvbmZpZyk7Ci0gIE5HcmFtU3RyZWFtIHN0cmVhbTsKLSAgdWludDY0X3QgdG9rZW5fY291bnQ7Ci0gIFdvcmRJbmRleCB0eXBlX2NvdW50ID0gMTA7Ci0gIENvcnB1c0NvdW50IGNvdW50ZXIoaW5wdXRfcGllY2UsIHZvY2FiLmdldCgpLCB0b2tlbl9jb3VudCwgdHlwZV9jb3VudCwgY2hhaW4uQmxvY2tTaXplKCkgLyBjaGFpbi5FbnRyeVNpemUoKSwgU0lMRU5UKTsKLSAgY2hhaW4gPj4gYm9vc3Q6OnJlZihjb3VudGVyKSA+PiBzdHJlYW0gPj4gdXRpbDo6c3RyZWFtOjprUmVjeWNsZTsKLQotICBjb25zdCBjaGFyICp2W10gPSB7Ijx1bms+IiwgIjxzPiIsICI8L3M+IiwgImxvb2tpbmciLCAib24iLCAiYSIsICJsaXR0bGUiLCAibW9yZSIsICJsb2luIiwgImZvbyIsICJiYXIifTsKLQotICBXb3JkSW5kZXggKnc7Ci0KLSAgQ2hlY2soIjxzPiA8cz4gbG9va2luZyIsIDEpOwotICBDaGVjaygiPHM+IGxvb2tpbmcgb24iLCAxKTsKLSAgQ2hlY2soImxvb2tpbmcgb24gYSIsIDEpOwotICBDaGVjaygib24gYSBsaXR0bGUiLCAyKTsKLSAgQ2hlY2soImEgbGl0dGxlIG1vcmUiLCAyKTsKLSAgQ2hlY2soImxpdHRsZSBtb3JlIGxvaW4iLCAyKTsKLSAgQ2hlY2soIm1vcmUgbG9pbiA8L3M+IiwgMik7Ci0gIENoZWNrKCI8cz4gPHM+IG9uIiwgMik7Ci0gIENoZWNrKCI8cz4gb24gYSIsIDEpOwotICBDaGVjaygiPHM+IG9uIGZvbyIsIDEpOwotICBDaGVjaygib24gZm9vIGxpdHRsZSIsIDEpOwotICBDaGVjaygiZm9vIGxpdHRsZSBtb3JlIiwgMSk7Ci0gIENoZWNrKCJsaXR0bGUgbW9yZSBsb2luIiwgMSk7Ci0gIENoZWNrKCJtb3JlIGxvaW4gPC9zPiIsIDEpOwotICBDaGVjaygiPHM+IDxzPiBiYXIiLCAxKTsKLSAgQ2hlY2soIjxzPiBiYXIgPC9zPiIsIDEpOwotICBDaGVjaygiPHM+IDxzPiA8L3M+IiwgMSk7Ci0gIEJPT1NUX0NIRUNLKCFzdHJlYW0pOwotICBCT09TVF9DSEVDS19FUVVBTChzaXplb2YodikgLyBzaXplb2YoY29uc3QgY2hhciopLCB0eXBlX2NvdW50KTsKLX0KLQotfX19IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2R1bXBfY291bnRzX21haW4uY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9kdW1wX2NvdW50c19tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTAwMTY3Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2R1bXBfY291bnRzX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jaW5jbHVkZSAibG0vYnVpbGRlci9wcmludC5oaCIKLSNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgotI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKLSNpbmNsdWRlICJ1dGlsL3JlYWRfY29tcHJlc3NlZC5oaCIKLQotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgaWYgKGFyZ2MgIT0gNCkgewotICAgIHN0ZDo6Y2VyciA8PCAiVXNhZ2U6ICIgPDwgYXJndlswXSA8PCAiIGNvdW50cyB2b2NhYnVsYXJ5IG9yZGVyXG4iCi0gICAgIlRoZSBjb3VudHMgZmlsZSBjb250YWlucyByZWNvcmRzIHdpdGggNC1ieXRlIHZvY2FidWxhcnkgaWRzIGZvbGxvd2VkIGJ5IDgtYnl0ZVxuIgotICAgICJjb3VudHMuICBFYWNoIHJlY29yZCBoYXMgb3JkZXIgbWFueSB2b2NhYnVsYXJ5IGlkcy5cbiIKLSAgICAiVGhlIHZvY2FidWxhcnkgZmlsZSBjb250YWlucyB0aGUgd29yZHMgZGVsaW1pdGVkIGJ5IE5VTEwgaW4gb3JkZXIgb2YgaWQuXG4iCi0gICAgIlRoZSB2b2NhYnVsYXJ5IGZpbGUgbWF5IG5vdCBiZSBjb21wcmVzc2VkIGJlY2F1c2UgaXQgaXMgbW1hcHBlZCBidXQgdGhlIGNvdW50c1xuIgotICAgICJmaWxlIGNhbiBiZSBjb21wcmVzc2VkLlxuIjsKLSAgICByZXR1cm4gMTsKLSAgfQotICB1dGlsOjpSZWFkQ29tcHJlc3NlZCBjb3VudHModXRpbDo6T3BlblJlYWRPclRocm93KGFyZ3ZbMV0pKTsKLSAgdXRpbDo6c2NvcGVkX2ZkIHZvY2FiX2ZpbGUodXRpbDo6T3BlblJlYWRPclRocm93KGFyZ3ZbMl0pKTsKLSAgbG06OmJ1aWxkZXI6OlZvY2FiUmVjb25zdGl0dXRlIHZvY2FiKHZvY2FiX2ZpbGUuZ2V0KCkpOwotICB1bnNpZ25lZCBpbnQgb3JkZXIgPSBib29zdDo6bGV4aWNhbF9jYXN0PHVuc2lnbmVkIGludD4oYXJndlszXSk7Ci0gIHN0ZDo6dmVjdG9yPGNoYXI+IHJlY29yZChzaXplb2YodWludDMyX3QpICogb3JkZXIgKyBzaXplb2YodWludDY0X3QpKTsKLSAgd2hpbGUgKHN0ZDo6c2l6ZV90IGdvdCA9IGNvdW50cy5SZWFkT3JFT0YoJipyZWNvcmQuYmVnaW4oKSwgcmVjb3JkLnNpemUoKSkpIHsKLSAgICBVVElMX1RIUk9XX0lGKGdvdCAhPSByZWNvcmQuc2l6ZSgpLCB1dGlsOjpFeGNlcHRpb24sICJSZWFkICIgPDwgZ290IDw8ICIgYnl0ZXMgYXQgdGhlIGVuZCBvZiBmaWxlLCB3aGljaCBpcyBub3QgYSBjb21wbGV0ZSByZWNvcmQgb2YgbGVuZ3RoICIgPDwgcmVjb3JkLnNpemUoKSk7Ci0gICAgY29uc3QgbG06OldvcmRJbmRleCAqd29yZHMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGxtOjpXb3JkSW5kZXgqPigmKnJlY29yZC5iZWdpbigpKTsKLSAgICBmb3IgKGNvbnN0IGxtOjpXb3JkSW5kZXggKmkgPSB3b3JkczsgaSAhPSB3b3JkcyArIG9yZGVyOyArK2kpIHsKLSAgICAgIFVUSUxfVEhST1dfSUYoKmkgPj0gdm9jYWIuU2l6ZSgpLCB1dGlsOjpFeGNlcHRpb24sICJWb2NhYiBJRCAiIDw8ICppIDw8ICIgaXMgbGFyZ2VyIHRoYW4gdGhlIHZvY2FiIGZpbGUncyBtYXhpbXVtIG9mICIgPDwgdm9jYWIuU2l6ZSgpIDw8ICIuICBBcmUgeW91IHN1cmUgeW91IGhhdmUgdGhlIHJpZ2h0IG9yZGVyIGFuZCB2b2NhYiBmaWxlIGZvciB0aGVzZSBjb3VudHM/Iik7Ci0gICAgICBzdGQ6OmNvdXQgPDwgdm9jYWIuTG9va3VwKCppKSA8PCAnICc7Ci0gICAgfQotICAgIC8vIFRPRE8gZG9uJ3QgdXNlIHN0ZDo6Y291dCBiZWNhdXNlIGl0IGlzIHNsb3cuICBBZGQgZmFzdCB1aW50NjRfdCBwcmludGluZyBzdXBwb3J0IHRvIEZha2VPRlN0cmVhbS4KLSAgICBzdGQ6OmNvdXQgPDwgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QqPih3b3JkcyArIG9yZGVyKSA8PCAnXG4nOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9oZWFkZXJfaW5mby5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2hlYWRlcl9pbmZvLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDYxOTUyLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2hlYWRlcl9pbmZvLmhoCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI2lmbmRlZiBMTV9CVUlMREVSX0hFQURFUl9JTkZPX0gKLSNkZWZpbmUgTE1fQlVJTERFUl9IRUFERVJfSU5GT19ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vLyBTb21lIGNvbmZpZ3VyYXRpb24gaW5mbyB0aGF0IGlzIHVzZWQgdG8gYWRkCi0vLyBjb21tZW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIGFuIEFSUEEgZmlsZQotc3RydWN0IEhlYWRlckluZm8gewotICBzdGQ6OnN0cmluZyBpbnB1dF9maWxlOwotICB1aW50NjRfdCB0b2tlbl9jb3VudDsKLSAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGNvdW50c19wcnVuZWQ7Ci0KLSAgSGVhZGVySW5mbygpIHt9Ci0KLSAgSGVhZGVySW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXRfZmlsZV9pbiwgdWludDY0X3QgdG9rZW5fY291bnRfaW4sIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzX3BydW5lZF9pbikKLSAgICA6IGlucHV0X2ZpbGUoaW5wdXRfZmlsZV9pbiksIHRva2VuX2NvdW50KHRva2VuX2NvdW50X2luKSwgY291bnRzX3BydW5lZChjb3VudHNfcHJ1bmVkX2luKSB7fQotCi0gIC8vIFRPRE86IEFkZCBzbW9vdGhpbmcgdHlwZQotICAvLyBUT0RPOiBNb3JlIGluZm8gaWYgbXVsdGlwbGUgbW9kZWxzIHdlcmUgaW50ZXJwb2xhdGVkCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2luaXRpYWxfcHJvYmFiaWxpdGllcy5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2luaXRpYWxfcHJvYmFiaWxpdGllcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkZDk2Zi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9pbml0aWFsX3Byb2JhYmlsaXRpZXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotI2luY2x1ZGUgImxtL2J1aWxkZXIvaW5pdGlhbF9wcm9iYWJpbGl0aWVzLmhoIgotCi0jaW5jbHVkZSAibG0vYnVpbGRlci9kaXNjb3VudC5oaCIKLSNpbmNsdWRlICJsbS9idWlsZGVyL25ncmFtX3N0cmVhbS5oaCIKLSNpbmNsdWRlICJsbS9idWlsZGVyL3NvcnQuaGgiCi0jaW5jbHVkZSAibG0vYnVpbGRlci9oYXNoX2dhbW1hLmhoIgotI2luY2x1ZGUgInV0aWwvbXVybXVyX2hhc2guaGgiCi0jaW5jbHVkZSAidXRpbC9maWxlLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NoYWluLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL2lvLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL3N0cmVhbS5oaCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGJ1aWxkZXIgewotCi1uYW1lc3BhY2Ugewotc3RydWN0IEJ1ZmZlckVudHJ5IHsKLSAgLy8gR2FtbWEgZnJvbSBwYWdlIDIwIG9mIENoZW4gYW5kIEdvb2RtYW4uCi0gIGZsb2F0IGdhbW1hOwotICAvLyBcc3VtX3cgYShjIHcpIGZvciBhbGwgdy4KLSAgZmxvYXQgZGVub21pbmF0b3I7Ci19OwotCi1zdHJ1Y3QgSGFzaEJ1ZmZlckVudHJ5IDogcHVibGljIEJ1ZmZlckVudHJ5IHsKLSAgLy8gSGFzaCB2YWx1ZSBvZiBuZ3JhbS4gVXNlZCB0byBqb2luIGNvbnRleHRzIHdpdGggYmFja29mZnMuCi0gIHVpbnQ2NF90IGhhc2hfdmFsdWU7Ci19OwotCi0vLyBSZWFkcyBhbGwgZW50cmllcyBpbiBvcmRlciBsaWtlIE5HcmFtU3RyZWFtIGRvZXMuICAKLS8vIEJ1dCBkZWxldGVzIGFueSBlbnRyaWVzIHRoYXQgaGF2ZSBDdXRvZmZDb3VudCBiZWxvdyBvciBlcXVhbCB0byBwcnVuaW5nCi0vLyB0aHJlc2hvbGQuICAgCi1jbGFzcyBQcnVuZU5HcmFtU3RyZWFtIHsKLSAgcHVibGljOgotICAgIFBydW5lTkdyYW1TdHJlYW0oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgOgotICAgICAgY3VycmVudF8oTlVMTCwgTkdyYW06Ok9yZGVyRnJvbVNpemUocG9zaXRpb24uR2V0Q2hhaW4oKS5FbnRyeVNpemUoKSkpLAotICAgICAgZGVzdF8oTlVMTCwgTkdyYW06Ok9yZGVyRnJvbVNpemUocG9zaXRpb24uR2V0Q2hhaW4oKS5FbnRyeVNpemUoKSkpLAotICAgICAgY3VycmVudENvdW50XygwKSwKLSAgICAgIGJsb2NrXyhwb3NpdGlvbikKLSAgICB7IAotICAgICAgU3RhcnRCbG9jaygpOwotICAgIH0KLQotICAgIE5HcmFtICZvcGVyYXRvciooKSB7IHJldHVybiBjdXJyZW50XzsgfQotICAgIE5HcmFtICpvcGVyYXRvci0+KCkgeyByZXR1cm4gJmN1cnJlbnRfOyB9Ci0KLSAgICBvcGVyYXRvciBib29sKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJsb2NrXzsKLSAgICB9Ci0KLSAgICBQcnVuZU5HcmFtU3RyZWFtICZvcGVyYXRvcisrKCkgewotICAgICAgYXNzZXJ0KGJsb2NrXyk7Ci0gICAgICAKLSAgICAgIGlmKGN1cnJlbnRfLk9yZGVyKCkgPT0gMSAmJiAqY3VycmVudF8uYmVnaW4oKSA8PSAyKQotICAgICAgICBkZXN0Xy5OZXh0SW5NZW1vcnkoKTsKLSAgICAgIGVsc2UgaWYoY3VycmVudENvdW50XyA+IDApIHsKLSAgICAgICAgaWYoZGVzdF8uQmFzZSgpIDwgY3VycmVudF8uQmFzZSgpKSB7Ci0gICAgICAgICAgbWVtY3B5KGRlc3RfLkJhc2UoKSwgY3VycmVudF8uQmFzZSgpLCBjdXJyZW50Xy5Ub3RhbFNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF8uTmV4dEluTWVtb3J5KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGN1cnJlbnRfLk5leHRJbk1lbW9yeSgpOwotICAgICAgCi0gICAgICB1aW50OF90ICpibG9ja19iYXNlID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJsb2NrXy0+R2V0KCkpOwotICAgICAgaWYgKGN1cnJlbnRfLkJhc2UoKSA9PSBibG9ja19iYXNlICsgYmxvY2tfLT5WYWxpZFNpemUoKSkgewotICAgICAgICBibG9ja18tPlNldFZhbGlkU2l6ZShkZXN0Xy5CYXNlKCkgLSBibG9ja19iYXNlKTsKLSAgICAgICAgKytibG9ja187Ci0gICAgICAgIFN0YXJ0QmxvY2soKTsKLSAgICAgICAgaWYgKGJsb2NrXykgewotICAgICAgICAgIGN1cnJlbnRDb3VudF8gPSBjdXJyZW50Xy5DdXRvZmZDb3VudCgpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgY3VycmVudENvdW50XyA9IGN1cnJlbnRfLkN1dG9mZkNvdW50KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgCi0gIHByaXZhdGU6Ci0gICAgdm9pZCBTdGFydEJsb2NrKCkgewotICAgICAgZm9yICg7IDsgKytibG9ja18pIHsKLSAgICAgICAgaWYgKCFibG9ja18pIHJldHVybjsKLSAgICAgICAgaWYgKGJsb2NrXy0+VmFsaWRTaXplKCkpIGJyZWFrOwotICAgICAgfQotICAgICAgY3VycmVudF8uUmVCYXNlKGJsb2NrXy0+R2V0KCkpOwotICAgICAgY3VycmVudENvdW50XyA9IGN1cnJlbnRfLkN1dG9mZkNvdW50KCk7Ci0gICAgICAKLSAgICAgIGRlc3RfLlJlQmFzZShibG9ja18tPkdldCgpKTsKLSAgICB9Ci0KLSAgICBOR3JhbSBjdXJyZW50XzsgLy8gaW5wdXQgaXRlcmF0b3IKLSAgICBOR3JhbSBkZXN0XzsgICAgLy8gb3V0cHV0IGl0ZXJhdG9yCi0gICAgCi0gICAgdWludDY0X3QgY3VycmVudENvdW50XzsKLQotICAgIHV0aWw6OnN0cmVhbTo6TGluayBibG9ja187Ci19OwotCi0vLyBFeHRyYWN0IGFuIGFycmF5IG9mIEhhc2hlZEdhbW1hIGZyb20gYW4gYXJyYXkgb2YgQnVmZmVyRW50cnkuCi1jbGFzcyBPbmx5R2FtbWEgewotICBwdWJsaWM6Ci0gICAgT25seUdhbW1hKGJvb2wgcHJ1bmluZykgOiBwcnVuaW5nXyhwcnVuaW5nKSB7fQotCi0gICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgewotICAgICAgZm9yICh1dGlsOjpzdHJlYW06OkxpbmsgYmxvY2tfaXQocG9zaXRpb24pOyBibG9ja19pdDsgKytibG9ja19pdCkgewotICAgICAgICBpZihwcnVuaW5nXykgewotICAgICAgICAgIGNvbnN0IEhhc2hCdWZmZXJFbnRyeSAqaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBIYXNoQnVmZmVyRW50cnkqPihibG9ja19pdC0+R2V0KCkpOwotICAgICAgICAgIGNvbnN0IEhhc2hCdWZmZXJFbnRyeSAqZW5kID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFzaEJ1ZmZlckVudHJ5Kj4oYmxvY2tfaXQtPlZhbGlkRW5kKCkpOwotCi0gICAgICAgICAgLy8gSnVzdCBtYWtlIGl0IHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSBzbyBpdCBjYW4gYmUgb3ZlcndyaXR0ZW4KLSAgICAgICAgICAvLyBXaXRoIEhhc2hHYW1tYSB2YWx1ZXMuIERvIG5vdCBhdHRlbXB0IHRvIGludGVycHJldCB0aGUgdmFsdWVzIHVudGlsIHNldCBiZWxvdy4KLSAgICAgICAgICBIYXNoR2FtbWEgKm91dCA9IHN0YXRpY19jYXN0PEhhc2hHYW1tYSo+KGJsb2NrX2l0LT5HZXQoKSk7Ci0gICAgICAgICAgZm9yICg7IGluIDwgZW5kOyBvdXQgKz0gMSwgaW4gKz0gMSkgewotICAgICAgICAgICAgLy8gYnVmZmVyaW5nLCBvdGhlcndpc2UgbWlnaHQgb3ZlcndyaXRlIHZhbHVlcyB0b28gZWFybHkKLSAgICAgICAgICAgIGZsb2F0IGdhbW1hX2J1ZiA9IGluLT5nYW1tYTsKLSAgICAgICAgICAgIHVpbnQ2NF90IGhhc2hfYnVmID0gaW4tPmhhc2hfdmFsdWU7Ci0KLSAgICAgICAgICAgIG91dC0+Z2FtbWEgPSBnYW1tYV9idWY7Ci0gICAgICAgICAgICBvdXQtPmhhc2hfdmFsdWUgPSBoYXNoX2J1ZjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYmxvY2tfaXQtPlNldFZhbGlkU2l6ZSgoYmxvY2tfaXQtPlZhbGlkU2l6ZSgpICogc2l6ZW9mKEhhc2hHYW1tYSkpIC8gc2l6ZW9mKEhhc2hCdWZmZXJFbnRyeSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGZsb2F0ICpvdXQgPSBzdGF0aWNfY2FzdDxmbG9hdCo+KGJsb2NrX2l0LT5HZXQoKSk7Ci0gICAgICAgICAgY29uc3QgZmxvYXQgKmluID0gb3V0OwotICAgICAgICAgIGNvbnN0IGZsb2F0ICplbmQgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCo+KGJsb2NrX2l0LT5WYWxpZEVuZCgpKTsKLSAgICAgICAgICBmb3IgKG91dCArPSAxLCBpbiArPSAyOyBpbiA8IGVuZDsgb3V0ICs9IDEsIGluICs9IDIpIHsKLSAgICAgICAgICAgICpvdXQgPSAqaW47Ci0gICAgICAgICAgfQotICAgICAgICAgIGJsb2NrX2l0LT5TZXRWYWxpZFNpemUoYmxvY2tfaXQtPlZhbGlkU2l6ZSgpIC8gMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgYm9vbCBwcnVuaW5nXzsKLX07Ci0KLWNsYXNzIEFkZFJpZ2h0IHsKLSAgcHVibGljOgotICAgIEFkZFJpZ2h0KGNvbnN0IERpc2NvdW50ICZkaXNjb3VudCwgY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZpbnB1dCwgYm9vbCBwcnVuaW5nKQotICAgICAgOiBkaXNjb3VudF8oZGlzY291bnQpLCBpbnB1dF8oaW5wdXQpLCBwcnVuaW5nXyhwcnVuaW5nKSB7fQotCi0gICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZvdXRwdXQpIHsKLSAgICAgIE5HcmFtU3RyZWFtIGluKGlucHV0Xyk7Ci0gICAgICB1dGlsOjpzdHJlYW06OlN0cmVhbSBvdXQob3V0cHV0KTsKLQotICAgICAgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiBwcmV2aW91cyhpbi0+T3JkZXIoKSAtIDEpOwotICAgICAgLy8gU2lsbHkgd2luZG93cyByZXF1aXJlcyB0aGlzIHdvcmthcm91bmQgdG8ganVzdCBnZXQgYW4gaW52YWxpZCBwb2ludGVyIHdoZW4gZW1wdHkuCi0gICAgICB2b2lkICpjb25zdCBwcmV2aW91c19yYXcgPSBwcmV2aW91cy5lbXB0eSgpID8gTlVMTCA6IHN0YXRpY19jYXN0PHZvaWQqPigmcHJldmlvdXNbMF0pOwotICAgICAgY29uc3Qgc3RkOjpzaXplX3Qgc2l6ZSA9IHNpemVvZihXb3JkSW5kZXgpICogcHJldmlvdXMuc2l6ZSgpOwotCi0gICAgICBmb3IoOyBpbjsgKytvdXQpIHsKLSAgICAgICAgbWVtY3B5KHByZXZpb3VzX3JhdywgaW4tPmJlZ2luKCksIHNpemUpOwotICAgICAgICB1aW50NjRfdCBkZW5vbWluYXRvciA9IDA7Ci0gICAgICAgIHVpbnQ2NF90IG5vcm1hbGl6ZXIgPSAwOwotICAgICAgICAKLSAgICAgICAgdWludDY0X3QgY291bnRzWzRdOwotICAgICAgICBtZW1zZXQoY291bnRzLCAwLCBzaXplb2YoY291bnRzKSk7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICBkZW5vbWluYXRvciArPSBpbi0+VW5tYXJrZWRDb3VudCgpOwotICAgICAgICAgIAotICAgICAgICAgIC8vIENvbGxlY3QgdW51c2VkIHByb2JhYmlsaXR5IG1hc3MgZnJvbSBwcnVuaW5nLgotICAgICAgICAgIC8vIEJlY29tZXMgMCBmb3IgdW5wcnVuZWQgbmdyYW1zLgotICAgICAgICAgIG5vcm1hbGl6ZXIgKz0gaW4tPlVubWFya2VkQ291bnQoKSAtIGluLT5DdXRvZmZDb3VudCgpOwotICAgICAgICAgIAotICAgICAgICAgIC8vIENoZW4mR29vZG1hbiBkbyBub3QgbWVudGlvbiBjb3VudGluZyBiYXNlZCBvbiBjdXRvZmZzLCBidXQKLSAgICAgICAgICAvLyBiYWNrb2ZmIGJlY29tZXMgbGFyZ2VyIHRoYW4gMSBvdGhlcndpc2UsIHNvIHByb2JhYmx5IG5lZWRzCi0gICAgICAgICAgLy8gdG8gY291bnQgY3V0b2Zmcy4gQ291bnRzIG5vcm1hbGx5IHdpdGhvdXQgcHJ1bmluZy4KLSAgICAgICAgICBpZihpbi0+Q3V0b2ZmQ291bnQoKSA+IDApCi0gICAgICAgICAgICArK2NvdW50c1tzdGQ6Om1pbihpbi0+Q3V0b2ZmQ291bnQoKSwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDMpKV07Ci0gICAgICAgIAotICAgICAgICB9IHdoaWxlICgrK2luICYmICFtZW1jbXAocHJldmlvdXNfcmF3LCBpbi0+YmVnaW4oKSwgc2l6ZSkpOwotICAgICAgICAKLSAgICAgICAgQnVmZmVyRW50cnkgJmVudHJ5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVmZmVyRW50cnkqPihvdXQuR2V0KCkpOwotICAgICAgICBlbnRyeS5kZW5vbWluYXRvciA9IHN0YXRpY19jYXN0PGZsb2F0PihkZW5vbWluYXRvcik7Ci0gICAgICAgIGVudHJ5LmdhbW1hID0gMC4wOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDw9IDM7ICsraSkgewotICAgICAgICAgIGVudHJ5LmdhbW1hICs9IGRpc2NvdW50Xy5HZXQoaSkgKiBzdGF0aWNfY2FzdDxmbG9hdD4oY291bnRzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1ha2VzIG1vZGVsIHN1bSB0byAxIHdpdGggcHJ1bmluZyAoSSBob3BlKS4KLSAgICAgICAgZW50cnkuZ2FtbWEgKz0gbm9ybWFsaXplcjsKLSAgICAgICAgCi0gICAgICAgIGVudHJ5LmdhbW1hIC89IGVudHJ5LmRlbm9taW5hdG9yOwotICAgICAgICAKLSAgICAgICAgaWYocHJ1bmluZ18pIHsKLSAgICAgICAgICAvLyBJZiBwcnVuaW5nIGlzIGVuYWJsZWQgdGhlIHN0cmVhbSBhY3R1YWxseSBjb250YWlucyBIYXNoQnVmZmVyRW50cnksIHNlZSBJbml0aWFsUHJvYmFiaWxpdGllcyguLi4pLAotICAgICAgICAgIC8vIHNvIGFkZCBhIGhhc2ggdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBjdXJyZW50IG5ncmFtLgotICAgICAgICAgIHN0YXRpY19jYXN0PEhhc2hCdWZmZXJFbnRyeSo+KCZlbnRyeSktPmhhc2hfdmFsdWUgPSB1dGlsOjpNdXJtdXJIYXNoTmF0aXZlKHByZXZpb3VzX3Jhdywgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG91dC5Qb2lzb24oKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBEaXNjb3VudCAmZGlzY291bnRfOwotICAgIGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiBpbnB1dF87Ci0gICAgYm9vbCBwcnVuaW5nXzsKLX07Ci0KLWNsYXNzIE1lcmdlUmlnaHQgewotICBwdWJsaWM6Ci0gICAgTWVyZ2VSaWdodChib29sIGludGVycG9sYXRlX3VuaWdyYW1zLCBjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJmZyb21fYWRkZXIsIGNvbnN0IERpc2NvdW50ICZkaXNjb3VudCkKLSAgICAgIDogaW50ZXJwb2xhdGVfdW5pZ3JhbXNfKGludGVycG9sYXRlX3VuaWdyYW1zKSwgZnJvbV9hZGRlcl8oZnJvbV9hZGRlciksIGRpc2NvdW50XyhkaXNjb3VudCkge30KLQotICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW5pdGlhbCBwcm9iYWJpbGl0eSBvZiBlYWNoIG4tZ3JhbSAoYmVmb3JlIG9yZGVyLWludGVycG9sYXRpb24pCi0gICAgLy8gUnVuKCkgZ2V0cyBpbnZva2VkIG9uY2UgZm9yIGVhY2ggb3JkZXIKLSAgICB2b2lkIFJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnByaW1hcnkpIHsKLSAgICAgIHV0aWw6OnN0cmVhbTo6U3RyZWFtIHN1bW1lZChmcm9tX2FkZGVyXyk7Ci0KLSAgICAgIFBydW5lTkdyYW1TdHJlYW0gZ3JhbXMocHJpbWFyeSk7Ci0KLSAgICAgIC8vIFdpdGhvdXQgaW50ZXJwb2xhdGlvbiwgdGhlIGludGVycG9sYXRpb24gd2VpZ2h0IGdvZXMgdG8gPHVuaz4uCi0gICAgICBpZiAoZ3JhbXMtPk9yZGVyKCkgPT0gMSkgewotICAgICAgICBCdWZmZXJFbnRyeSBzdW1zKCpzdGF0aWNfY2FzdDxjb25zdCBCdWZmZXJFbnRyeSo+KHN1bW1lZC5HZXQoKSkpOwotICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIDx1bms+Ci0gICAgICAgIGFzc2VydCgqZ3JhbXMtPmJlZ2luKCkgPT0ga1VOSyk7Ci0gICAgICAgIGZsb2F0IGdhbW1hX2Fzc2lnbjsKLSAgICAgICAgaWYgKGludGVycG9sYXRlX3VuaWdyYW1zXykgewotICAgICAgICAgIC8vIERlZmF1bHQ6IHRyZWF0IDx1bms+IGxpa2UgYSB6ZXJvdG9uLgotICAgICAgICAgIGdhbW1hX2Fzc2lnbiA9IHN1bXMuZ2FtbWE7Ci0gICAgICAgICAgZ3JhbXMtPlZhbHVlKCkudW5pbnRlcnAucHJvYiA9IDAuMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBTUkk6IGdpdmUgYWxsIHRoZSBpbnRlcnBvbGF0aW9uIG1hc3MgdG8gPHVuaz4KLSAgICAgICAgICBnYW1tYV9hc3NpZ24gPSAwLjA7Ci0gICAgICAgICAgZ3JhbXMtPlZhbHVlKCkudW5pbnRlcnAucHJvYiA9IHN1bXMuZ2FtbWE7Ci0gICAgICAgIH0KLSAgICAgICAgZ3JhbXMtPlZhbHVlKCkudW5pbnRlcnAuZ2FtbWEgPSBnYW1tYV9hc3NpZ247Ci0gICAgICAgICsrZ3JhbXM7Ci0KLSAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciA8cz46IHByb2JhYmlsaXR5IDEuMC4gIFRoaXMgYWxsb3dzIDxzPiB0byBiZQotICAgICAgICAvLyBleHBsaWNpdGx5IHNjb3JlcyBhcyBwYXJ0IG9mIHRoZSBzZW50ZW5jZSB3aXRob3V0IGltcGFjdGluZwotICAgICAgICAvLyBwcm9iYWJpbGl0eSBhbmQgY29tcHV0ZXMgcSBjb3JyZWN0bHkgYXMgYig8cz4pLgotICAgICAgICBhc3NlcnQoKmdyYW1zLT5iZWdpbigpID09IGtCT1MpOwotICAgICAgICBncmFtcy0+VmFsdWUoKS51bmludGVycC5wcm9iID0gMS4wOwotICAgICAgICBncmFtcy0+VmFsdWUoKS51bmludGVycC5nYW1tYSA9IDAuMDsKLQotICAgICAgICB3aGlsZSAoKytncmFtcykgewotICAgICAgICAgIGdyYW1zLT5WYWx1ZSgpLnVuaW50ZXJwLnByb2IgPSBkaXNjb3VudF8uQXBwbHkoZ3JhbXMtPkNvdW50KCkpIC8gc3Vtcy5kZW5vbWluYXRvcjsKLSAgICAgICAgICBncmFtcy0+VmFsdWUoKS51bmludGVycC5nYW1tYSA9IGdhbW1hX2Fzc2lnbjsKLSAgICAgICAgfQotICAgICAgICArK3N1bW1lZDsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgCi0gICAgICBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+IHByZXZpb3VzKGdyYW1zLT5PcmRlcigpIC0gMSk7Ci0gICAgICBjb25zdCBzdGQ6OnNpemVfdCBzaXplID0gc2l6ZW9mKFdvcmRJbmRleCkgKiBwcmV2aW91cy5zaXplKCk7Ci0gICAgICBmb3IgKDsgZ3JhbXM7ICsrc3VtbWVkKSB7Ci0gICAgICAgIG1lbWNweSgmcHJldmlvdXNbMF0sIGdyYW1zLT5iZWdpbigpLCBzaXplKTsKLSAgICAgICAgY29uc3QgQnVmZmVyRW50cnkgJnN1bXMgPSAqc3RhdGljX2Nhc3Q8Y29uc3QgQnVmZmVyRW50cnkqPihzdW1tZWQuR2V0KCkpOwotICAgICAgICAKLSAgICAgICAgZG8gewotICAgICAgICAgIFBheWxvYWQgJnBheSA9IGdyYW1zLT5WYWx1ZSgpOwotICAgICAgICAgIHBheS51bmludGVycC5wcm9iID0gZGlzY291bnRfLkFwcGx5KGdyYW1zLT5Vbm1hcmtlZENvdW50KCkpIC8gc3Vtcy5kZW5vbWluYXRvcjsKLSAgICAgICAgICBwYXkudW5pbnRlcnAuZ2FtbWEgPSBzdW1zLmdhbW1hOwotICAgICAgICB9IHdoaWxlICgrK2dyYW1zICYmICFtZW1jbXAoJnByZXZpb3VzWzBdLCBncmFtcy0+YmVnaW4oKSwgc2l6ZSkpOwotICAgICAgfQotICAgIH0KLQotICBwcml2YXRlOgotICAgIGJvb2wgaW50ZXJwb2xhdGVfdW5pZ3JhbXNfOwotICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiBmcm9tX2FkZGVyXzsKLSAgICBEaXNjb3VudCBkaXNjb3VudF87Ci19OwotCi19IC8vIG5hbWVzcGFjZQotCi12b2lkIEluaXRpYWxQcm9iYWJpbGl0aWVzKAotICAgIGNvbnN0IEluaXRpYWxQcm9iYWJpbGl0aWVzQ29uZmlnICZjb25maWcsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8RGlzY291bnQ+ICZkaXNjb3VudHMsCi0gICAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgJnByaW1hcnksCi0gICAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgJnNlY29uZF9pbiwKLSAgICB1dGlsOjpzdHJlYW06OkNoYWlucyAmZ2FtbWFfb3V0LAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmcHJ1bmVfdGhyZXNob2xkcywKLSAgICBib29sIHBydW5lX3ZvY2FiKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJpbWFyeS5zaXplKCk7ICsraSkgewotICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Db25maWcgZ2FtbWFfY29uZmlnID0gY29uZmlnLmFkZGVyX291dDsKLSAgICBpZihwcnVuZV92b2NhYiB8fCBwcnVuZV90aHJlc2hvbGRzW2ldID4gMCkKLSAgICAgIGdhbW1hX2NvbmZpZy5lbnRyeV9zaXplID0gc2l6ZW9mKEhhc2hCdWZmZXJFbnRyeSk7Ci0gICAgZWxzZQotICAgICAgZ2FtbWFfY29uZmlnLmVudHJ5X3NpemUgPSBzaXplb2YoQnVmZmVyRW50cnkpOwotCi0gICAgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uIHNlY29uZChzZWNvbmRfaW5baV0uQWRkKCkpOwotICAgIHNlY29uZF9pbltpXSA+PiB1dGlsOjpzdHJlYW06OmtSZWN5Y2xlOwotICAgIGdhbW1hX291dC5wdXNoX2JhY2soZ2FtbWFfY29uZmlnKTsKLSAgICBnYW1tYV9vdXRbaV0gPj4gQWRkUmlnaHQoZGlzY291bnRzW2ldLCBzZWNvbmQsIHBydW5lX3ZvY2FiIHx8IHBydW5lX3RocmVzaG9sZHNbaV0gPiAwKTsKLQotICAgIHByaW1hcnlbaV0gPj4gTWVyZ2VSaWdodChjb25maWcuaW50ZXJwb2xhdGVfdW5pZ3JhbXMsIGdhbW1hX291dFtpXS5BZGQoKSwgZGlzY291bnRzW2ldKTsKLSAgICAKLSAgICAvLyBEb24ndCBib3RoZXIgd2l0aCB0aGUgT25seUdhbW1hIHRocmVhZCBmb3Igc29tZXRoaW5nIHRvIGRpc2NhcmQuCi0gICAgaWYgKGkpIGdhbW1hX291dFtpXSA+PiBPbmx5R2FtbWEocHJ1bmVfdm9jYWIgfHwgcHJ1bmVfdGhyZXNob2xkc1tpXSA+IDApOwotICB9Ci19Ci0KLX19IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2luaXRpYWxfcHJvYmFiaWxpdGllcy5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2luaXRpYWxfcHJvYmFiaWxpdGllcy5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlMDljZC4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9pbml0aWFsX3Byb2JhYmlsaXRpZXMuaGgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jaWZuZGVmIExNX0JVSUxERVJfSU5JVElBTF9QUk9CQUJJTElUSUVTX0gKLSNkZWZpbmUgTE1fQlVJTERFUl9JTklUSUFMX1BST0JBQklMSVRJRVNfSAotCi0jaW5jbHVkZSAibG0vYnVpbGRlci9kaXNjb3VudC5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9jb25maWcuaGgiCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSB1dGlsIHsgbmFtZXNwYWNlIHN0cmVhbSB7IGNsYXNzIENoYWluczsgfSB9Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgYnVpbGRlciB7Ci0KLXN0cnVjdCBJbml0aWFsUHJvYmFiaWxpdGllc0NvbmZpZyB7Ci0gIC8vIFRoZXNlIHNob3VsZCBiZSBzbWFsbCBidWZmZXJzIHRvIGtlZXAgdGhlIGFkZGVyIGZyb20gZ2V0dGluZyB0b28gZmFyIGFoZWFkCi0gIHV0aWw6OnN0cmVhbTo6Q2hhaW5Db25maWcgYWRkZXJfaW47Ci0gIHV0aWw6OnN0cmVhbTo6Q2hhaW5Db25maWcgYWRkZXJfb3V0OwotICAvLyBTUklMTSBkb2Vzbid0IG5vcm1hbGx5IGludGVycG9sYXRlIHVuaWdyYW1zLiAgCi0gIGJvb2wgaW50ZXJwb2xhdGVfdW5pZ3JhbXM7Ci19OwotCi0vKiBDb21wdXRlIGluaXRpYWwgKHVuaW50ZXJwb2xhdGVkKSBwcm9iYWJpbGl0aWVzCi0gKiBwcmltYXJ5OiB0aGUgbm9ybWFsIGNoYWluIG9mIG4tZ3JhbXMuICBJbmNvbWluZyBpcyBjb250ZXh0IHNvcnRlZCBhZGp1c3RlZAotICogICBjb3VudHMuICBPdXRnb2luZyBoYXMgdW5pbnRlcnBvbGF0ZWQgcHJvYmFiaWxpdGllcyBmb3IgdXNlIGJ5IEludGVycG9sYXRlLgotICogc2Vjb25kX2luOiBhIHNlY29uZCBjb3B5IG9mIHRoZSBwcmltYXJ5IGlucHV0LiAgRGlzY2FyZCB0aGUgb3V0cHV0LiAgCi0gKiBnYW1tYV9vdXQ6IENvbXB1dGVkIGdhbW1hIHZhbHVlcyBhcmUgb3V0cHV0IG9uIHRoZXNlIGNoYWlucyBpbiBzdWZmaXggb3JkZXIuCi0gKiAgIFRoZSB2YWx1ZXMgYXJlIGJhcmUgZmxvYXRzIGFuZCBzaG91bGQgYmUgYnVmZmVyZWQgZm9yIGludGVycG9sYXRpb24gdG8KLSAqICAgdXNlLiAgCi0gKi8KLXZvaWQgSW5pdGlhbFByb2JhYmlsaXRpZXMoCi0gICAgY29uc3QgSW5pdGlhbFByb2JhYmlsaXRpZXNDb25maWcgJmNvbmZpZywKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxEaXNjb3VudD4gJmRpc2NvdW50cywKLSAgICB1dGlsOjpzdHJlYW06OkNoYWlucyAmcHJpbWFyeSwKLSAgICB1dGlsOjpzdHJlYW06OkNoYWlucyAmc2Vjb25kX2luLAotICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZnYW1tYV9vdXQsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZwcnVuZV90aHJlc2hvbGRzLAotICAgIGJvb2wgcHJ1bmVfdm9jYWIpOwotCi19IC8vIG5hbWVzcGFjZSBidWlsZGVyCi19IC8vIG5hbWVzcGFjZSBsbQotCi0jZW5kaWYgLy8gTE1fQlVJTERFUl9JTklUSUFMX1BST0JBQklMSVRJRVNfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvaW50ZXJwb2xhdGUuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9pbnRlcnBvbGF0ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlNzg1Mi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9pbnRlcnBvbGF0ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0jaW5jbHVkZSAibG0vYnVpbGRlci9pbnRlcnBvbGF0ZS5oaCIKLQotI2luY2x1ZGUgImxtL2J1aWxkZXIvaGFzaF9nYW1tYS5oaCIKLSNpbmNsdWRlICJsbS9idWlsZGVyL2pvaW50X29yZGVyLmhoIgotI2luY2x1ZGUgImxtL2J1aWxkZXIvbmdyYW1fc3RyZWFtLmhoIgotI2luY2x1ZGUgImxtL2J1aWxkZXIvc29ydC5oaCIKLSNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAidXRpbC9maXhlZF9hcnJheS5oaCIKLSNpbmNsdWRlICJ1dGlsL211cm11cl9oYXNoLmhoIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi1uYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7Ci1uYW1lc3BhY2UgewotCi0vKiBDYWxjdWxhdGUgcSwgdGhlIGNvbGxhcHNlZCBwcm9iYWJpbGl0eSBhbmQgYmFja29mZiwgYXMgZGVmaW5lZCBpbgotICogQGlucHJvY2VlZGluZ3N7SGVhZmllbGQtcmVzdCwKLSAqICAgYXV0aG9yID0ge0tlbm5ldGggSGVhZmllbGQgYW5kIFBoaWxpcHAgS29laG4gYW5kIEFsb24gTGF2aWV9LAotICogICB0aXRsZSA9IHtMYW5ndWFnZSBNb2RlbCBSZXN0IENvc3RzIGFuZCBTcGFjZS1FZmZpY2llbnQgU3RvcmFnZX0sCi0gKiAgIHllYXIgPSB7MjAxMn0sCi0gKiAgIG1vbnRoID0ge0p1bHl9LAotICogICBib29rdGl0bGUgPSB7UHJvY2VlZGluZ3Mgb2YgdGhlIEpvaW50IENvbmZlcmVuY2Ugb24gRW1waXJpY2FsIE1ldGhvZHMgaW4gTmF0dXJhbCBMYW5ndWFnZSBQcm9jZXNzaW5nIGFuZCBDb21wdXRhdGlvbmFsIE5hdHVyYWwgTGFuZ3VhZ2UgTGVhcm5pbmd9LAotICogICBhZGRyZXNzID0ge0planUgSXNsYW5kLCBLb3JlYX0sCi0gKiAgIHBhZ2VzID0gezExNjktLTExNzh9LAotICogICB1cmwgPSB7aHR0cDovL2toZWFmaWVsZC5jb20vcHJvZmVzc2lvbmFsL2VkaW5idXJnaC9yZXN0XF9wYXBlci5wZGZ9LAotICogfQotICogVGhpcyBpcyBwYXJ0aWN1bGFybHkgY29udmVuaWVudCB0byBjYWxjdWxhdGUgZHVyaW5nIGludGVycG9sYXRpb24gYmVjYXVzZQotICogdGhlIG5lZWRlZCBiYWNrb2ZmIHRlcm1zIGFyZSBhbHJlYWR5IGFjY2Vzc2VkIGF0IHRoZSBzYW1lIHRpbWUuCi0gKi8KLWNsYXNzIE91dHB1dFEgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgT3V0cHV0UShzdGQ6OnNpemVfdCBvcmRlcikgOiBxX2RlbHRhXyhvcmRlcikge30KLQotICAgIHZvaWQgR3JhbSh1bnNpZ25lZCBvcmRlcl9taW51c18xLCBmbG9hdCBmdWxsX2JhY2tvZmYsIFByb2JCYWNrb2ZmICZvdXQpIHsKLSAgICAgIGZsb2F0ICZxX2RlbCA9IHFfZGVsdGFfW29yZGVyX21pbnVzXzFdOwotICAgICAgaWYgKG9yZGVyX21pbnVzXzEpIHsKLSAgICAgICAgLy8gRGl2aWRlIGJ5IGNvbnRleHQncyBiYWNrb2ZmICh3aGljaCBjb21lcyBpbiBhcyBvdXQuYmFja29mZikKLSAgICAgICAgcV9kZWwgPSBxX2RlbHRhX1tvcmRlcl9taW51c18xIC0gMV0gLyBvdXQuYmFja29mZiAqIGZ1bGxfYmFja29mZjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHFfZGVsID0gZnVsbF9iYWNrb2ZmOwotICAgICAgfQotICAgICAgb3V0LnByb2IgPSBsb2cxMGYob3V0LnByb2IgKiBxX2RlbCk7Ci0gICAgICAvLyBUT0RPOiBzdG9wIHdhc3RlZnVsbHkgb3V0cHV0dGluZyB0aGlzIQotICAgICAgb3V0LmJhY2tvZmYgPSAwLjA7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgLy8gUHJvZHVjdCBvZiBiYWNrb2ZmcyBpbiB0aGUgbnVtZXJhdG9yIGRpdmlkZWQgYnkgYmFja29mZnMgaW4gdGhlCi0gICAgLy8gZGVub21pbmF0b3IuICBEb2VzIG5vdCBpbmNsdWRlIAotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBxX2RlbHRhXzsKLX07Ci0KLS8qIERlZmF1bHQ6IG91dHB1dCBwcm9iYWJpbGl0eSBhbmQgYmFja29mZiAqLwotY2xhc3MgT3V0cHV0UHJvYkJhY2tvZmYgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgT3V0cHV0UHJvYkJhY2tvZmYoc3RkOjpzaXplX3QgLypvcmRlciovKSB7fQotCi0gICAgdm9pZCBHcmFtKHVuc2lnbmVkIC8qb3JkZXJfbWludXNfMSovLCBmbG9hdCBmdWxsX2JhY2tvZmYsIFByb2JCYWNrb2ZmICZvdXQpIGNvbnN0IHsKLSAgICAgIC8vIENvcnJlY3RpbmcgZm9yIG51bWVyaWNhbCBwcmVjaXNpb24gaXNzdWVzLiAgVGFrZSB0aGF0IElSU1QuCi0gICAgICBvdXQucHJvYiA9IHN0ZDo6bWluKDAuMGYsIGxvZzEwZihvdXQucHJvYikpOwotICAgICAgb3V0LmJhY2tvZmYgPSBsb2cxMGYoZnVsbF9iYWNrb2ZmKTsKLSAgICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgT3V0cHV0PiBjbGFzcyBDYWxsYmFjayB7Ci0gIHB1YmxpYzoKLSAgICBDYWxsYmFjayhmbG9hdCB1bmlmb3JtX3Byb2IsIGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJmJhY2tvZmZzLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJnBydW5lX3RocmVzaG9sZHMsIGJvb2wgcHJ1bmVfdm9jYWIpCi0gICAgICA6IGJhY2tvZmZzXyhiYWNrb2Zmcy5zaXplKCkpLCBwcm9ic18oYmFja29mZnMuc2l6ZSgpICsgMiksCi0gICAgICAgIHBydW5lX3RocmVzaG9sZHNfKHBydW5lX3RocmVzaG9sZHMpLAotICAgICAgICBwcnVuZV92b2NhYl8ocHJ1bmVfdm9jYWIpLAotICAgICAgICBvdXRwdXRfKGJhY2tvZmZzLnNpemUoKSArIDEgLyogb3JkZXIgKi8pIHsKLSAgICAgIHByb2JzX1swXSA9IHVuaWZvcm1fcHJvYjsKLSAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBiYWNrb2Zmcy5zaXplKCk7ICsraSkgewotICAgICAgICBiYWNrb2Zmc18ucHVzaF9iYWNrKGJhY2tvZmZzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB+Q2FsbGJhY2soKSB7Ci0gICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgYmFja29mZnNfLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmKHBydW5lX3ZvY2FiXyB8fCBwcnVuZV90aHJlc2hvbGRzX1tpICsgMV0gPiAwKQotICAgICAgICAgIHdoaWxlKGJhY2tvZmZzX1tpXSkKLSAgICAgICAgICAgICsrYmFja29mZnNfW2ldOwotICAgICAgICAKLSAgICAgICAgaWYgKGJhY2tvZmZzX1tpXSkgewotICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiQmFja29mZnMgZG8gbm90IG1hdGNoIGZvciBvcmRlciAiIDw8IChpICsgMSkgPDwgc3RkOjplbmRsOwotICAgICAgICAgIGFib3J0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIEVudGVyKHVuc2lnbmVkIG9yZGVyX21pbnVzXzEsIE5HcmFtICZncmFtKSB7Ci0gICAgICBQYXlsb2FkICZwYXkgPSBncmFtLlZhbHVlKCk7Ci0gICAgICBwYXkuY29tcGxldGUucHJvYiA9IHBheS51bmludGVycC5wcm9iICsgcGF5LnVuaW50ZXJwLmdhbW1hICogcHJvYnNfW29yZGVyX21pbnVzXzFdOwotICAgICAgcHJvYnNfW29yZGVyX21pbnVzXzEgKyAxXSA9IHBheS5jb21wbGV0ZS5wcm9iOwotCi0gICAgICBmbG9hdCBvdXRfYmFja29mZjsKLSAgICAgIGlmIChvcmRlcl9taW51c18xIDwgYmFja29mZnNfLnNpemUoKSAmJiAqKGdyYW0uZW5kKCkgLSAxKSAhPSBrVU5LICYmICooZ3JhbS5lbmQoKSAtIDEpICE9IGtFT1MgJiYgYmFja29mZnNfW29yZGVyX21pbnVzXzFdKSB7Ci0gICAgICAgIGlmKHBydW5lX3ZvY2FiXyB8fCBwcnVuZV90aHJlc2hvbGRzX1tvcmRlcl9taW51c18xICsgMV0gPiAwKSB7Ci0gICAgICAgICAgLy9Db21wdXRlIGhhc2ggdmFsdWUgZm9yIGN1cnJlbnQgY29udGV4dAotICAgICAgICAgIHVpbnQ2NF90IGN1cnJlbnRfaGFzaCA9IHV0aWw6Ok11cm11ckhhc2hOYXRpdmUoZ3JhbS5iZWdpbigpLCBncmFtLk9yZGVyKCkgKiBzaXplb2YoV29yZEluZGV4KSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgY29uc3QgSGFzaEdhbW1hICpoYXNoZWRfYmFja29mZiA9IHN0YXRpY19jYXN0PGNvbnN0IEhhc2hHYW1tYSo+KGJhY2tvZmZzX1tvcmRlcl9taW51c18xXS5HZXQoKSk7Ci0gICAgICAgICAgd2hpbGUoY3VycmVudF9oYXNoICE9IGhhc2hlZF9iYWNrb2ZmLT5oYXNoX3ZhbHVlICYmICsrYmFja29mZnNfW29yZGVyX21pbnVzXzFdKQotICAgICAgICAgICAgaGFzaGVkX2JhY2tvZmYgPSBzdGF0aWNfY2FzdDxjb25zdCBIYXNoR2FtbWEqPihiYWNrb2Zmc19bb3JkZXJfbWludXNfMV0uR2V0KCkpOwotCi0gICAgICAgICAgaWYoY3VycmVudF9oYXNoID09IGhhc2hlZF9iYWNrb2ZmLT5oYXNoX3ZhbHVlKSB7Ci0gICAgICAgICAgICBvdXRfYmFja29mZiA9IGhhc2hlZF9iYWNrb2ZmLT5nYW1tYTsKLSAgICAgICAgICAgICsrYmFja29mZnNfW29yZGVyX21pbnVzXzFdOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBIYXMgYmVlbiBwcnVuZWQgYXdheSBzbyBpdCBpcyBub3QgYSBjb250ZXh0IGFueW1vcmUKLSAgICAgICAgICAgIG91dF9iYWNrb2ZmID0gMS4wOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXRfYmFja29mZiA9ICpzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCo+KGJhY2tvZmZzX1tvcmRlcl9taW51c18xXS5HZXQoKSk7Ci0gICAgICAgICAgKytiYWNrb2Zmc19bb3JkZXJfbWludXNfMV07Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE5vdCBhIGNvbnRleHQuCi0gICAgICAgIG91dF9iYWNrb2ZmID0gMS4wOwotICAgICAgfQotCi0gICAgICBvdXRwdXRfLkdyYW0ob3JkZXJfbWludXNfMSwgb3V0X2JhY2tvZmYsIHBheS5jb21wbGV0ZSk7Ci0gICAgfQotCi0gICAgdm9pZCBFeGl0KHVuc2lnbmVkLCBjb25zdCBOR3JhbSAmKSBjb25zdCB7fQotCi0gIHByaXZhdGU6Ci0gICAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OlN0cmVhbT4gYmFja29mZnNfOwotCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHByb2JzXzsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4mIHBydW5lX3RocmVzaG9sZHNfOwotICAgIGJvb2wgcHJ1bmVfdm9jYWJfOwotCi0gICAgT3V0cHV0IG91dHB1dF87Ci19OwotfSAvLyBuYW1lc3BhY2UKLQotSW50ZXJwb2xhdGU6OkludGVycG9sYXRlKHVpbnQ2NF90IHZvY2FiX3NpemUsIGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJmJhY2tvZmZzLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4mIHBydW5lX3RocmVzaG9sZHMsIGJvb2wgcHJ1bmVfdm9jYWIsIGJvb2wgb3V0cHV0X3EpCi0gIDogdW5pZm9ybV9wcm9iXygxLjAgLyBzdGF0aWNfY2FzdDxmbG9hdD4odm9jYWJfc2l6ZSkpLCAvLyBJbmNsdWRlcyA8dW5rPiBidXQgZXhjbHVkZXMgPHM+LgotICAgIGJhY2tvZmZzXyhiYWNrb2ZmcyksCi0gICAgcHJ1bmVfdGhyZXNob2xkc18ocHJ1bmVfdGhyZXNob2xkcyksCi0gICAgcHJ1bmVfdm9jYWJfKHBydW5lX3ZvY2FiKSwKLSAgICBvdXRwdXRfcV8ob3V0cHV0X3EpIHt9Ci0KLS8vIHBlcmZvcm0gb3JkZXItd2lzZSBpbnRlcnBvbGF0aW9uCi12b2lkIEludGVycG9sYXRlOjpSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyAmcG9zaXRpb25zKSB7Ci0gIGFzc2VydChwb3NpdGlvbnMuc2l6ZSgpID09IGJhY2tvZmZzXy5zaXplKCkgKyAxKTsKLSAgaWYgKG91dHB1dF9xXykgewotICAgIHR5cGVkZWYgQ2FsbGJhY2s8T3V0cHV0UT4gQzsKLSAgICBDIGNhbGxiYWNrKHVuaWZvcm1fcHJvYl8sIGJhY2tvZmZzXywgcHJ1bmVfdGhyZXNob2xkc18sIHBydW5lX3ZvY2FiXyk7Ci0gICAgSm9pbnRPcmRlcjxDLCBTdWZmaXhPcmRlcj4ocG9zaXRpb25zLCBjYWxsYmFjayk7Ci0gIH0gZWxzZSB7Ci0gICAgdHlwZWRlZiBDYWxsYmFjazxPdXRwdXRQcm9iQmFja29mZj4gQzsKLSAgICBDIGNhbGxiYWNrKHVuaWZvcm1fcHJvYl8sIGJhY2tvZmZzXywgcHJ1bmVfdGhyZXNob2xkc18sIHBydW5lX3ZvY2FiXyk7Ci0gICAgSm9pbnRPcmRlcjxDLCBTdWZmaXhPcmRlcj4ocG9zaXRpb25zLCBjYWxsYmFjayk7Ci0gIH0KLX0KLQotfX0gLy8gbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvaW50ZXJwb2xhdGUuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9pbnRlcnBvbGF0ZS5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmZDkxOS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9pbnRlcnBvbGF0ZS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSNpZm5kZWYgTE1fQlVJTERFUl9JTlRFUlBPTEFURV9ICi0jZGVmaW5lIExNX0JVSUxERVJfSU5URVJQT0xBVEVfSAotCi0jaW5jbHVkZSAidXRpbC9zdHJlYW0vbXVsdGlfc3RyZWFtLmhoIgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBidWlsZGVyIHsKLSAKLS8qIEludGVycG9sYXRlIHN0ZXAuICAKLSAqIElucHV0OiBzdWZmaXggc29ydGVkIG4tZ3JhbXMgd2l0aCAocF91bmludGVycG9sYXRlZCwgZ2FtbWEpIGZyb20KLSAqIEluaXRpYWxQcm9iYWJpbGl0aWVzLgotICogT3V0cHV0OiBzdWZmaXggc29ydGVkIG4tZ3JhbXMgd2l0aCBjb21wbGV0ZSBwcm9iYWJpbGl0eQotICovCi1jbGFzcyBJbnRlcnBvbGF0ZSB7Ci0gIHB1YmxpYzoKLSAgICAvLyBOb3JtYWxseSB2b2NhYl9zaXplIGlzIHRoZSB1bmlncmFtIGNvdW50LTEgKHNpbmNlIHAoPHM+KSA9IDApIGJ1dCBtaWdodAotICAgIC8vIGJlIGxhcmdlciB3aGVuIHRoZSB1c2VyIHNwZWNpZmllcyBhIGNvbnNpc3RlbnQgdm9jYWJ1bGFyeSBzaXplLgotICAgIGV4cGxpY2l0IEludGVycG9sYXRlKHVpbnQ2NF90IHZvY2FiX3NpemUsIGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJmJhY2tvZmZzLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJnBydW5lX3RocmVzaG9sZHMsIGJvb2wgcHJ1bmVfdm9jYWIsIGJvb2wgb3V0cHV0X3FfKTsKLQotICAgIHZvaWQgUnVuKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJnBvc2l0aW9ucyk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmbG9hdCB1bmlmb3JtX3Byb2JfOwotICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgYmFja29mZnNfOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBwcnVuZV90aHJlc2hvbGRzXzsKLSAgICBib29sIHBydW5lX3ZvY2FiXzsKLSAgICBib29sIG91dHB1dF9xXzsKLX07Ci0KLX19IC8vIG5hbWVzcGFjZXMKLSNlbmRpZiAvLyBMTV9CVUlMREVSX0lOVEVSUE9MQVRFX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2pvaW50X29yZGVyLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvam9pbnRfb3JkZXIuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZDg5MDkuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvam9pbnRfb3JkZXIuaGgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jaWZuZGVmIExNX0JVSUxERVJfSk9JTlRfT1JERVJfSAotI2RlZmluZSBMTV9CVUlMREVSX0pPSU5UX09SREVSX0gKLQotI2luY2x1ZGUgImxtL2J1aWxkZXIvbmdyYW1fc3RyZWFtLmhoIgotI2luY2x1ZGUgImxtL2xtX2V4Y2VwdGlvbi5oaCIKLQotI2lmZGVmIERFQlVHCi0jaW5jbHVkZSAidXRpbC9maXhlZF9hcnJheS5oaCIKLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBidWlsZGVyIHsKLQotdGVtcGxhdGUgPGNsYXNzIENhbGxiYWNrLCBjbGFzcyBDb21wYXJlPiB2b2lkIEpvaW50T3JkZXIoY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyAmcG9zaXRpb25zLCBDYWxsYmFjayAmY2FsbGJhY2spIHsKLSAgLy8gQWxsb3cgbWF0Y2hpbmcgdG8gcmVmZXJlbmNlIHN0cmVhbXNbLTFdLgotICBOR3JhbVN0cmVhbXMgc3RyZWFtc193aXRoX2R1bW15OwotICBzdHJlYW1zX3dpdGhfZHVtbXkuSW5pdFdpdGhEdW1teShwb3NpdGlvbnMpOwotICBOR3JhbVN0cmVhbSAqc3RyZWFtcyA9IHN0cmVhbXNfd2l0aF9kdW1teS5iZWdpbigpICsgMTsKLQotICB1bnNpZ25lZCBpbnQgb3JkZXI7Ci0gIGZvciAob3JkZXIgPSAwOyBvcmRlciA8IHBvc2l0aW9ucy5zaXplKCkgJiYgc3RyZWFtc1tvcmRlcl07ICsrb3JkZXIpIHt9Ci0gIGFzc2VydChvcmRlcik7IC8vIHNob3VsZCBhbHdheXMgaGF2ZSA8dW5rPi4KLQotICAvLyBEZWJ1Z2dpbmcgb25seTogY2FsbCBjb21wYXJpc29uIGZ1bmN0aW9uIHRvIHNhbml0eSBjaGVjayBvcmRlci4KLSNpZmRlZiBERUJVRwotICB1dGlsOjpGaXhlZEFycmF5PENvbXBhcmU+IGxlc3NfY29tcGFyZShvcmRlcik7Ci0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvcmRlcjsgKytpKQotICAgIGxlc3NfY29tcGFyZS5wdXNoX2JhY2soaSArIDEpOwotI2VuZGlmIC8vIERFQlVHCi0KLSAgdW5zaWduZWQgaW50IGN1cnJlbnQgPSAwOwotICB3aGlsZSAodHJ1ZSkgewotICAgIC8vIERvZXMgdGhlIGNvbnRleHQgbWF0Y2ggdGhlIGxvd2VyIG9uZT8KLSAgICBpZiAoIW1lbWNtcChzdHJlYW1zW3N0YXRpY19jYXN0PGludD4oY3VycmVudCkgLSAxXS0+YmVnaW4oKSwgc3RyZWFtc1tjdXJyZW50XS0+YmVnaW4oKSArIENvbXBhcmU6OmtNYXRjaE9mZnNldCwgc2l6ZW9mKFdvcmRJbmRleCkgKiBjdXJyZW50KSkgewotICAgICAgY2FsbGJhY2suRW50ZXIoY3VycmVudCwgKnN0cmVhbXNbY3VycmVudF0pOwotICAgICAgLy8gVHJhbnNpdGlvbiB0byBsb29raW5nIGZvciBleHRlbnNpb25zLiAgCi0gICAgICBpZiAoKytjdXJyZW50IDwgb3JkZXIpIGNvbnRpbnVlOwotICAgIH0KLSNpZmRlZiBERUJVRwotICAgIC8vIG1hdGNoX2NoZWNrW2N1cnJlbnQgLSAxXSBtYXRjaGVzIGN1cnJlbnQtZ3JhbXMKLSAgICAvLyBUaGUgbG93ZXItb3JkZXIgc3RyZWFtICh3aGljaCBza2lwcyBmZXdlciBjdXJyZW50LWdyYW1zKSBzaG91bGQgYWx3YXlzIGJlIDw9IHRoZSBoaWdoZXIgb3JkZXItc3RyZWFtICh3aGljaCBjYW4gc2tpcCBjdXJyZW50LWdyYW1zKS4KLSAgICBlbHNlIGlmICghbGVzc19jb21wYXJlW2N1cnJlbnQgLSAxXShzdHJlYW1zW3N0YXRpY19jYXN0PGludD4oY3VycmVudCkgLSAxXS0+YmVnaW4oKSwgc3RyZWFtc1tjdXJyZW50XS0+YmVnaW4oKSArIENvbXBhcmU6OmtNYXRjaE9mZnNldCkpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCAiU3RyZWFtIG91dCBvZiBvcmRlciBkZXRlY3RlZCIgPDwgc3RkOjplbmRsOwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0jZW5kaWYgLy8gREVCVUcKLSAgICAvLyBObyBleHRlbnNpb24gbGVmdC4gIAotICAgIHdoaWxlKHRydWUpIHsKLSAgICAgIGFzc2VydChjdXJyZW50ID4gMCk7Ci0gICAgICAtLWN1cnJlbnQ7Ci0gICAgICBjYWxsYmFjay5FeGl0KGN1cnJlbnQsICpzdHJlYW1zW2N1cnJlbnRdKTsKLSAgICAgIAotICAgICAgaWYgKCsrc3RyZWFtc1tjdXJyZW50XSkgYnJlYWs7Ci0gICAgICAKLSAgICAgIFVUSUxfVEhST1dfSUYob3JkZXIgIT0gY3VycmVudCArIDEsIEZvcm1hdExvYWRFeGNlcHRpb24sICJEZXRlY3RlZCBuLWdyYW0gd2l0aG91dCBtYXRjaGluZyBzdWZmaXgiKTsKLSAgICAgIAotICAgICAgb3JkZXIgPSBjdXJyZW50OwotICAgICAgaWYgKCFvcmRlcikgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi19fSAvLyBuYW1lc3BhY2VzCi0KLSNlbmRpZiAvLyBMTV9CVUlMREVSX0pPSU5UX09SREVSX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2xtcGx6X21haW4uY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9sbXBsel9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2JkOTlkLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL2xtcGx6X21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotI2luY2x1ZGUgImxtL2J1aWxkZXIvb3V0cHV0LmhoIgotI2luY2x1ZGUgImxtL2J1aWxkZXIvcGlwZWxpbmUuaGgiCi0jaW5jbHVkZSAibG0vYnVpbGRlci9wcmludC5oaCIKLSNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAidXRpbC9maWxlLmhoIgotI2luY2x1ZGUgInV0aWwvZmlsZV9waWVjZS5oaCIKLSNpbmNsdWRlICJ1dGlsL3VzYWdlLmhoIgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIHsKLWNsYXNzIFNpemVOb3RpZnkgewotICBwdWJsaWM6Ci0gICAgU2l6ZU5vdGlmeShzdGQ6OnNpemVfdCAmb3V0KSA6IGJlaGluZF8ob3V0KSB7fQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nICZmcm9tKSB7Ci0gICAgICBiZWhpbmRfID0gdXRpbDo6UGFyc2VTaXplKGZyb20pOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHN0ZDo6c2l6ZV90ICZiZWhpbmRfOwotfTsKLQotYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dHlwZWRfdmFsdWU8c3RkOjpzdHJpbmc+ICpTaXplT3B0aW9uKHN0ZDo6c2l6ZV90ICZ0bywgY29uc3QgY2hhciAqZGVmYXVsdF92YWx1ZSkgewotICByZXR1cm4gYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RkOjpzdHJpbmc+KCktPm5vdGlmaWVyKFNpemVOb3RpZnkodG8pKS0+ZGVmYXVsdF92YWx1ZShkZWZhdWx0X3ZhbHVlKTsKLX0KLQotLy8gUGFyc2UgYW5kIHZhbGlkYXRlIHBydW5pbmcgdGhyZXNob2xkcyB0aGVuIHJldHVybiB2ZWN0b3Igb2YgdGhyZXNob2xkIGNvdW50cwotLy8gZm9yIGVhY2ggbi1ncmFtcyBvcmRlci4KLXN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBQYXJzZVBydW5pbmcoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwYXJhbSwgc3RkOjpzaXplX3Qgb3JkZXIpIHsKLSAgLy8gY29udmVydCB0byB2ZWN0b3Igb2YgaW50ZWdlcnMKLSAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IHBydW5lX3RocmVzaG9sZHM7Ci0gIHBydW5lX3RocmVzaG9sZHMucmVzZXJ2ZShvcmRlcik7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdChwYXJhbS5iZWdpbigpKTsgaXQgIT0gcGFyYW0uZW5kKCk7ICsraXQpIHsKLSAgICB0cnkgewotICAgICAgcHJ1bmVfdGhyZXNob2xkcy5wdXNoX2JhY2soYm9vc3Q6OmxleGljYWxfY2FzdDx1aW50NjRfdD4oKml0KSk7Ci0gICAgfSBjYXRjaChjb25zdCBib29zdDo6YmFkX2xleGljYWxfY2FzdCAmKSB7Ci0gICAgICBVVElMX1RIUk9XKHV0aWw6OkV4Y2VwdGlvbiwgIkJhZCBwcnVuaW5nIHRocmVzaG9sZCAiIDw8ICppdCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gRmlsbCB3aXRoIHplcm9zIGJ5IGRlZmF1bHQuCi0gIGlmIChwcnVuZV90aHJlc2hvbGRzLmVtcHR5KCkpIHsKLSAgICBwcnVuZV90aHJlc2hvbGRzLnJlc2l6ZShvcmRlciwgMCk7Ci0gICAgcmV0dXJuIHBydW5lX3RocmVzaG9sZHM7Ci0gIH0KLQotICAvLyB2YWxpZGF0ZSBwcnVuaW5nIHRocmVzaG9sZCBpZiBzcGVjaWZpZWQKLSAgLy8gdGhyb3cgaWYgZWFjaCBuLWdyYW0gb3JkZXIgaGFzIG5vdCAgdGhyZXNob2xkIHNwZWNpZmllZAotICBVVElMX1RIUk9XX0lGKHBydW5lX3RocmVzaG9sZHMuc2l6ZSgpID4gb3JkZXIsIHV0aWw6OkV4Y2VwdGlvbiwgIllvdSBzcGVjaWZpZWQgcHJ1bmluZyB0aHJlc2hvbGRzIGZvciBvcmRlcnMgMSB0aHJvdWdoICIgPDwgcHJ1bmVfdGhyZXNob2xkcy5zaXplKCkgPDwgIiBidXQgdGhlIG1vZGVsIG9ubHkgaGFzIG9yZGVyICIgPDwgb3JkZXIpOwotICAvLyB0aHJlc2hvbGQgZm9yIHVuaWdyYW0gY2FuIG9ubHkgYmUgMCAobm8gcHJ1bmluZykKLSAgCi0gIC8vIGNoZWNrIGlmIHRocmVzaG9sZCBhcmUgbm90IGluIGRlY3JlYXNpbmcgb3JkZXIKLSAgdWludDY0X3QgbG93ZXJfdGhyZXNob2xkID0gMDsKLSAgZm9yIChzdGQ6OnZlY3Rvcjx1aW50NjRfdD46Oml0ZXJhdG9yIGl0ID0gcHJ1bmVfdGhyZXNob2xkcy5iZWdpbigpOyBpdCAhPSBwcnVuZV90aHJlc2hvbGRzLmVuZCgpOyArK2l0KSB7Ci0gICAgVVRJTF9USFJPV19JRihsb3dlcl90aHJlc2hvbGQgPiAqaXQsIHV0aWw6OkV4Y2VwdGlvbiwgIlBydW5pbmcgdGhyZXNob2xkcyBzaG91bGQgYmUgaW4gbm9uLWRlY3JlYXNpbmcgb3JkZXIuICBPdGhlcndpc2Ugc3Vic3RyaW5ncyB3b3VsZCBiZSByZW1vdmVkLCB3aGljaCBpcyBiYWQgZm9yIHF1ZXJ5LXRpbWUgZGF0YSBzdHJ1Y3R1cmVzLiIpOwotICAgIGxvd2VyX3RocmVzaG9sZCA9ICppdDsKLSAgfQotCi0gIC8vIFBhZCB0byBhbGwgb3JkZXJzIHVzaW5nIHRoZSBsYXN0IHZhbHVlLgotICBwcnVuZV90aHJlc2hvbGRzLnJlc2l6ZShvcmRlciwgcHJ1bmVfdGhyZXNob2xkcy5iYWNrKCkpOwotICByZXR1cm4gcHJ1bmVfdGhyZXNob2xkczsKLX0KLQotbG06OmJ1aWxkZXI6OkRpc2NvdW50IFBhcnNlRGlzY291bnRGYWxsYmFjayhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBhcmFtKSB7Ci0gIGxtOjpidWlsZGVyOjpEaXNjb3VudCByZXQ7Ci0gIFVUSUxfVEhST1dfSUYocGFyYW0uc2l6ZSgpID4gMywgdXRpbDo6RXhjZXB0aW9uLCAiU3BlY2lmeSBhdCBtb3N0IHRocmVlIGZhbGxiYWNrIGRpc2NvdW50czogMSwgMiwgYW5kIDMrIik7Ci0gIFVUSUxfVEhST1dfSUYocGFyYW0uZW1wdHkoKSwgdXRpbDo6RXhjZXB0aW9uLCAiRmFsbGJhY2sgZGlzY291bnRpbmcgZW5hYmxlZCwgYnV0IG5vIGRpc2NvdW50IHNwZWNpZmllZCIpOwotICByZXQuYW1vdW50WzBdID0gMC4wOwotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgZmxvYXQgZGlzY291bnQgPSBib29zdDo6bGV4aWNhbF9jYXN0PGZsb2F0PihwYXJhbVtpIDwgcGFyYW0uc2l6ZSgpID8gaSA6IChwYXJhbS5zaXplKCkgLSAxKV0pOwotICAgIFVUSUxfVEhST1dfSUYoZGlzY291bnQgPCAwLjAgfHwgZGlzY291bnQgPiBzdGF0aWNfY2FzdDxmbG9hdD4oaSsxKSwgdXRpbDo6RXhjZXB0aW9uLCAiVGhlIGRpc2NvdW50IGZvciBjb3VudCAiIDw8IChpKzEpIDw8ICIgd2FzIHBhcnNlZCBhcyAiIDw8IGRpc2NvdW50IDw8ICIgd2hpY2ggaXMgbm90IGluIHRoZSByYW5nZSBbMCwgIiA8PCAoaSsxKSA8PCAiXS4iKTsKLSAgICByZXQuYW1vdW50W2kgKyAxXSA9IGRpc2NvdW50OwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgdHJ5IHsKLSAgICBuYW1lc3BhY2UgcG8gPSBib29zdDo6cHJvZ3JhbV9vcHRpb25zOwotICAgIHBvOjpvcHRpb25zX2Rlc2NyaXB0aW9uIG9wdGlvbnMoIkxhbmd1YWdlIG1vZGVsIGJ1aWxkaW5nIG9wdGlvbnMiKTsKLSAgICBsbTo6YnVpbGRlcjo6UGlwZWxpbmVDb25maWcgcGlwZWxpbmU7Ci0KLSAgICBzdGQ6OnN0cmluZyB0ZXh0LCBhcnBhOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwcnVuaW5nOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkaXNjb3VudF9mYWxsYmFjazsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGlzY291bnRfZmFsbGJhY2tfZGVmYXVsdDsKLSAgICBkaXNjb3VudF9mYWxsYmFja19kZWZhdWx0LnB1c2hfYmFjaygiMC41Iik7Ci0gICAgZGlzY291bnRfZmFsbGJhY2tfZGVmYXVsdC5wdXNoX2JhY2soIjEiKTsKLSAgICBkaXNjb3VudF9mYWxsYmFja19kZWZhdWx0LnB1c2hfYmFjaygiMS41Iik7Ci0gICAgYm9vbCB2ZXJib3NlX2hlYWRlcjsKLQotICAgIG9wdGlvbnMuYWRkX29wdGlvbnMoKQotICAgICAgKCJoZWxwLGgiLCBwbzo6Ym9vbF9zd2l0Y2goKSwgIlNob3cgdGhpcyBoZWxwIG1lc3NhZ2UiKQotICAgICAgKCJvcmRlcixvIiwgcG86OnZhbHVlPHN0ZDo6c2l6ZV90PigmcGlwZWxpbmUub3JkZXIpCi0jaWYgQk9PU1RfVkVSU0lPTiA+PSAxMDQyMDAKLSAgICAgICAgIC0+cmVxdWlyZWQoKQotI2VuZGlmCi0gICAgICAgICAsICJPcmRlciBvZiB0aGUgbW9kZWwiKQotICAgICAgKCJpbnRlcnBvbGF0ZV91bmlncmFtcyIsIHBvOjp2YWx1ZTxib29sPigmcGlwZWxpbmUuaW5pdGlhbF9wcm9icy5pbnRlcnBvbGF0ZV91bmlncmFtcyktPmRlZmF1bHRfdmFsdWUodHJ1ZSktPmltcGxpY2l0X3ZhbHVlKHRydWUpLCAiSW50ZXJwb2xhdGUgdGhlIHVuaWdyYW1zIChkZWZhdWx0KSBhcyBvcHBvc2VkIHRvIGdpdmluZyBsb3RzIG9mIG1hc3MgdG8gPHVuaz4gbGlrZSBTUkkuICBJZiB5b3Ugd2FudCBTUkkncyBiZWhhdmlvciB3aXRoIGEgbGFyZ2UgPHVuaz4gYW5kIHRoZSBvbGQgbG1wbHogZGVmYXVsdCwgdXNlIC0taW50ZXJwb2xhdGVfdW5pZ3JhbXMgMC4iKQotICAgICAgKCJza2lwX3N5bWJvbHMiLCBwbzo6Ym9vbF9zd2l0Y2goKSwgIlRyZWF0IDxzPiwgPC9zPiwgYW5kIDx1bms+IGFzIHdoaXRlc3BhY2UgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24iKQotICAgICAgKCJ0ZW1wX3ByZWZpeCxUIiwgcG86OnZhbHVlPHN0ZDo6c3RyaW5nPigmcGlwZWxpbmUuc29ydC50ZW1wX3ByZWZpeCktPmRlZmF1bHRfdmFsdWUoIi90bXAvbG0iKSwgIlRlbXBvcmFyeSBmaWxlIHByZWZpeCIpCi0gICAgICAoIm1lbW9yeSxTIiwgU2l6ZU9wdGlvbihwaXBlbGluZS5zb3J0LnRvdGFsX21lbW9yeSwgdXRpbDo6R3Vlc3NQaHlzaWNhbE1lbW9yeSgpID8gIjgwJSIgOiAiMUciKSwgIlNvcnRpbmcgbWVtb3J5IikKLSAgICAgICgibWluaW11bV9ibG9jayIsIFNpemVPcHRpb24ocGlwZWxpbmUubWluaW11bV9ibG9jaywgIjhLIiksICJNaW5pbXVtIGJsb2NrIHNpemUgdG8gYWxsb3ciKQotICAgICAgKCJzb3J0X2Jsb2NrIiwgU2l6ZU9wdGlvbihwaXBlbGluZS5zb3J0LmJ1ZmZlcl9zaXplLCAiNjRNIiksICJTaXplIG9mIElPIG9wZXJhdGlvbnMgZm9yIHNvcnQgKGRldGVybWluZXMgYXJpdHkpIikKLSAgICAgICgiYmxvY2tfY291bnQiLCBwbzo6dmFsdWU8c3RkOjpzaXplX3Q+KCZwaXBlbGluZS5ibG9ja19jb3VudCktPmRlZmF1bHRfdmFsdWUoMiksICJCbG9jayBjb3VudCAocGVyIG9yZGVyKSIpCi0gICAgICAoInZvY2FiX2VzdGltYXRlIiwgcG86OnZhbHVlPGxtOjpXb3JkSW5kZXg+KCZwaXBlbGluZS52b2NhYl9lc3RpbWF0ZSktPmRlZmF1bHRfdmFsdWUoMTAwMDAwMCksICJBc3N1bWUgdGhpcyB2b2NhYnVsYXJ5IHNpemUgZm9yIHB1cnBvc2VzIG9mIGNhbGN1bGF0aW5nIG1lbW9yeSBpbiBzdGVwIDEgKGNvcnB1cyBjb3VudCkgYW5kIHByZS1zaXppbmcgdGhlIGhhc2ggdGFibGUiKQotICAgICAgKCJ2b2NhYl9maWxlIiwgcG86OnZhbHVlPHN0ZDo6c3RyaW5nPigmcGlwZWxpbmUudm9jYWJfZmlsZSktPmRlZmF1bHRfdmFsdWUoIiIpLCAiTG9jYXRpb24gdG8gd3JpdGUgYSBmaWxlIGNvbnRhaW5pbmcgdGhlIHVuaXF1ZSB2b2NhYnVsYXJ5IHN0cmluZ3MgZGVsaW1pdGVkIGJ5IG51bGwgYnl0ZXMiKQotICAgICAgKCJ2b2NhYl9wYWQiLCBwbzo6dmFsdWU8dWludDY0X3Q+KCZwaXBlbGluZS52b2NhYl9zaXplX2Zvcl91bmspLT5kZWZhdWx0X3ZhbHVlKDApLCAiSWYgdGhlIHZvY2FidWxhcnkgaXMgc21hbGxlciB0aGFuIHRoaXMgdmFsdWUsIHBhZCB3aXRoIDx1bms+IHRvIHJlYWNoIHRoaXMgc2l6ZS4gUmVxdWlyZXMgLS1pbnRlcnBvbGF0ZV91bmlncmFtcyIpCi0gICAgICAoInZlcmJvc2VfaGVhZGVyIiwgcG86OmJvb2xfc3dpdGNoKCZ2ZXJib3NlX2hlYWRlciksICJBZGQgYSB2ZXJib3NlIGhlYWRlciB0byB0aGUgQVJQQSBmaWxlIHRoYXQgaW5jbHVkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyB0b2tlbiBjb3VudCwgc21vb3RoaW5nIHR5cGUsIGV0Yy4iKQotICAgICAgKCJ0ZXh0IiwgcG86OnZhbHVlPHN0ZDo6c3RyaW5nPigmdGV4dCksICJSZWFkIHRleHQgZnJvbSBhIGZpbGUgaW5zdGVhZCBvZiBzdGRpbiIpCi0gICAgICAoImFycGEiLCBwbzo6dmFsdWU8c3RkOjpzdHJpbmc+KCZhcnBhKSwgIldyaXRlIEFSUEEgdG8gYSBmaWxlIGluc3RlYWQgb2Ygc3Rkb3V0IikKLSAgICAgICgiY29sbGFwc2VfdmFsdWVzIiwgcG86OmJvb2xfc3dpdGNoKCZwaXBlbGluZS5vdXRwdXRfcSksICJDb2xsYXBzZSBwcm9iYWJpbGl0eSBhbmQgYmFja29mZiBpbnRvIGEgc2luZ2xlIHZhbHVlLCBxIHRoYXQgeWllbGRzIHRoZSBzYW1lIHNlbnRlbmNlLWxldmVsIHByb2JhYmlsaXRpZXMuICBTZWUgaHR0cDovL2toZWFmaWVsZC5jb20vcHJvZmVzc2lvbmFsL2VkaW5idXJnaC9yZXN0X3BhcGVyLnBkZiBmb3IgbW9yZSBkZXRhaWxzLCBpbmNsdWRpbmcgYSBwcm9vZi4iKQotICAgICAgKCJwcnVuZSIsIHBvOjp2YWx1ZTxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPigmcHJ1bmluZyktPm11bHRpdG9rZW4oKSwgIlBydW5lIG4tZ3JhbXMgd2l0aCBjb3VudCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIHRocmVzaG9sZC4gIFNwZWNpZnkgb25lIHZhbHVlIGZvciBlYWNoIG9yZGVyIGkuZS4gMCAwIDEgdG8gcHJ1bmUgc2luZ2xldG9uIHRyaWdyYW1zIGFuZCBhYm92ZS4gIFRoZSBzZXF1ZW5jZSBvZiB2YWx1ZXMgbXVzdCBiZSBub24tZGVjcmVhc2luZyBhbmQgdGhlIGxhc3QgdmFsdWUgYXBwbGllcyB0byBhbnkgcmVtYWluaW5nIG9yZGVycy4gRGVmYXVsdCBpcyB0byBub3QgcHJ1bmUsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gLS1wcnVuZSAwLiIpCi0gICAgICAoImxpbWl0X3ZvY2FiX2ZpbGUiLCBwbzo6dmFsdWU8c3RkOjpzdHJpbmc+KCZwaXBlbGluZS5wcnVuZV92b2NhYl9maWxlKS0+ZGVmYXVsdF92YWx1ZSgiIiksICJSZWFkIGFsbG93ZWQgdm9jYWJ1bGFyeSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gTi1ncmFtcyB0aGF0IGNvbnRhaW4gdm9jYWJ1bGFyeSBpdGVtcyBub3QgaW4gdGhpcyBsaXN0IHdpbGwgYmUgcHJ1bmVkLiBDYW4gYmUgY29tYmluZWQgd2l0aCAtLXBydW5lIGFyZyIpCi0gICAgICAoImRpc2NvdW50X2ZhbGxiYWNrIiwgcG86OnZhbHVlPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+KCZkaXNjb3VudF9mYWxsYmFjayktPm11bHRpdG9rZW4oKS0+aW1wbGljaXRfdmFsdWUoZGlzY291bnRfZmFsbGJhY2tfZGVmYXVsdCwgIjAuNSAxIDEuNSIpLCAiVGhlIGNsb3NlZC1mb3JtIGVzdGltYXRlIGZvciBLbmVzZXItTmV5IGRpc2NvdW50cyBkb2VzIG5vdCB3b3JrIHdpdGhvdXQgc2luZ2xldG9ucyBvciBkb3VibGV0b25zLiAgSXQgY2FuIGFsc28gZmFpbCBpZiB0aGVzZSB2YWx1ZXMgYXJlIG91dCBvZiByYW5nZS4gIFRoaXMgb3B0aW9uIGZhbGxzIGJhY2sgdG8gdXNlci1zcGVjaWZpZWQgZGlzY291bnRzIHdoZW4gdGhlIGNsb3NlZC1mb3JtIGVzdGltYXRlIGZhaWxzLiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGlzIGdlbmVyYWxseSBhIGJhZCBpZGVhOiB5b3Ugc2hvdWxkIGRlZHVwbGljYXRlIHlvdXIgY29ycHVzIGluc3RlYWQuICBIb3dldmVyLCBjbGFzcy1iYXNlZCBtb2RlbHMgbmVlZCBjdXN0b20gZGlzY291bnRzIGJlY2F1c2UgdGhleSBsYWNrIHNpbmdsZXRvbiB1bmlncmFtcy4gIFByb3ZpZGUgdXAgdG8gdGhyZWUgZGlzY291bnRzIChmb3IgYWRqdXN0ZWQgY291bnRzIDEsIDIsIGFuZCAzKyksIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgb3JkZXJzIHdoZXJlIHRoZSBjbG9zZWQtZm9ybSBlc3RpbWF0ZXMgZmFpbC4iKTsKLSAgICBwbzo6dmFyaWFibGVzX21hcCB2bTsKLSAgICBwbzo6c3RvcmUocG86OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBvcHRpb25zKSwgdm0pOwotCi0gICAgaWYgKGFyZ2MgPT0gMSB8fCB2bVsiaGVscCJdLmFzPGJvb2w+KCkpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCAKLSAgICAgICAgIkJ1aWxkcyB1bnBydW5lZCBsYW5ndWFnZSBtb2RlbHMgd2l0aCBtb2RpZmllZCBLbmVzZXItTmV5IHNtb290aGluZy5cblxuIgotICAgICAgICAiUGxlYXNlIGNpdGU6XG4iCi0gICAgICAgICJAaW5wcm9jZWVkaW5nc3tIZWFmaWVsZC1lc3RpbWF0ZSxcbiIKLSAgICAgICAgIiAgYXV0aG9yID0ge0tlbm5ldGggSGVhZmllbGQgYW5kIEl2YW4gUG91enlyZXZza3kgYW5kIEpvbmF0aGFuIEguIENsYXJrIGFuZCBQaGlsaXBwIEtvZWhufSxcbiIKLSAgICAgICAgIiAgdGl0bGUgPSB7U2NhbGFibGUgTW9kaWZpZWQge0tuZXNlci1OZXl9IExhbmd1YWdlIE1vZGVsIEVzdGltYXRpb259LFxuIgotICAgICAgICAiICB5ZWFyID0gezIwMTN9LFxuIgotICAgICAgICAiICBtb250aCA9IHs4fSxcbiIKLSAgICAgICAgIiAgYm9va3RpdGxlID0ge1Byb2NlZWRpbmdzIG9mIHRoZSA1MXN0IEFubnVhbCBNZWV0aW5nIG9mIHRoZSBBc3NvY2lhdGlvbiBmb3IgQ29tcHV0YXRpb25hbCBMaW5ndWlzdGljc30sXG4iCi0gICAgICAgICIgIGFkZHJlc3MgPSB7U29maWEsIEJ1bGdhcmlhfSxcbiIKLSAgICAgICAgIiAgdXJsID0ge2h0dHA6Ly9raGVhZmllbGQuY29tL3Byb2Zlc3Npb25hbC9lZGluYnVyZ2gvZXN0aW1hdGVcXF9wYXBlci5wZGZ9LFxuIgotICAgICAgICAifVxuXG4iCi0gICAgICAgICJQcm92aWRlIHRoZSBjb3JwdXMgb24gc3RkaW4uICBUaGUgQVJQQSBmaWxlIHdpbGwgYmUgd3JpdHRlbiB0byBzdGRvdXQuICBPcmRlciBvZlxuIgotICAgICAgICAidGhlIG1vZGVsICgtbykgaXMgdGhlIG9ubHkgbWFuZGF0b3J5IG9wdGlvbi4gIEFzIHRoaXMgaXMgYW4gb24tZGlzayBwcm9ncmFtLFxuIgotICAgICAgICAic2V0dGluZyB0aGUgdGVtcG9yYXJ5IGZpbGUgbG9jYXRpb24gKC1UKSBhbmQgc29ydGluZyBtZW1vcnkgKC1TKSBpcyByZWNvbW1lbmRlZC5cblxuIgotICAgICAgICAiTWVtb3J5IHNpemVzIGFyZSBzcGVjaWZpZWQgbGlrZSBHTlUgc29ydDogYSBudW1iZXIgZm9sbG93ZWQgYnkgYSB1bml0IGNoYXJhY3Rlci5cbiIKLSAgICAgICAgIlZhbGlkIHVuaXRzIGFyZSBcJSBmb3IgcGVyY2VudGFnZSBvZiBtZW1vcnkgKHN1cHBvcnRlZCBwbGF0Zm9ybXMgb25seSkgYW5kIChpblxuIgotICAgICAgICAiaW5jcmVhc2luZyBwb3dlcnMgb2YgMTAyNCk6IGIsIEssIE0sIEcsIFQsIFAsIEUsIFosIFkuICBEZWZhdWx0IGlzIEsgKCoxMDI0KS5cbiI7Ci0gICAgICB1aW50NjRfdCBtZW0gPSB1dGlsOjpHdWVzc1BoeXNpY2FsTWVtb3J5KCk7Ci0gICAgICBpZiAobWVtKSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCAiVGhpcyBtYWNoaW5lIGhhcyAiIDw8IG1lbSA8PCAiIGJ5dGVzIG9mIG1lbW9yeS5cblxuIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYW1vdW50IG9mIG1lbW9yeSBvbiB0aGlzIG1hY2hpbmUuXG5cbiI7Ci0gICAgICB9IAotICAgICAgc3RkOjpjZXJyIDw8IG9wdGlvbnMgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcG86Om5vdGlmeSh2bSk7Ci0KLSAgICAvLyByZXF1aXJlZCgpIGFwcGVhcmVkIGluIEJvb3N0IDEuNDIuMC4KLSNpZiBCT09TVF9WRVJTSU9OIDwgMTA0MjAwCi0gICAgaWYgKCF2bS5jb3VudCgib3JkZXIiKSkgewotICAgICAgc3RkOjpjZXJyIDw8ICJ0aGUgb3B0aW9uICctLW9yZGVyJyBpcyByZXF1aXJlZCBidXQgbWlzc2luZyIgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAocGlwZWxpbmUudm9jYWJfc2l6ZV9mb3JfdW5rICYmICFwaXBlbGluZS5pbml0aWFsX3Byb2JzLmludGVycG9sYXRlX3VuaWdyYW1zKSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgIi0tdm9jYWJfcGFkIHJlcXVpcmVzIC0taW50ZXJwb2xhdGVfdW5pZ3JhbXMgYmUgb24iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGlmICh2bVsic2tpcF9zeW1ib2xzIl0uYXM8Ym9vbD4oKSkgewotICAgICAgcGlwZWxpbmUuZGlzYWxsb3dlZF9zeW1ib2xfYWN0aW9uID0gbG06OkNPTVBMQUlOOwotICAgIH0gZWxzZSB7Ci0gICAgICBwaXBlbGluZS5kaXNhbGxvd2VkX3N5bWJvbF9hY3Rpb24gPSBsbTo6VEhST1dfVVA7Ci0gICAgfQotCi0gICAgaWYgKHZtLmNvdW50KCJkaXNjb3VudF9mYWxsYmFjayIpKSB7Ci0gICAgICBwaXBlbGluZS5kaXNjb3VudC5mYWxsYmFjayA9IFBhcnNlRGlzY291bnRGYWxsYmFjayhkaXNjb3VudF9mYWxsYmFjayk7Ci0gICAgICBwaXBlbGluZS5kaXNjb3VudC5iYWRfYWN0aW9uID0gbG06OkNPTVBMQUlOOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBVbnVzZWQsIGp1c3QgaGVyZSB0byBwcmV2ZW50IHRoZSBjb21waWxlciBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHVuaW5pdGlhbGl6ZWQuCi0gICAgICBwaXBlbGluZS5kaXNjb3VudC5mYWxsYmFjayA9IGxtOjpidWlsZGVyOjpEaXNjb3VudCgpOwotICAgICAgcGlwZWxpbmUuZGlzY291bnQuYmFkX2FjdGlvbiA9IGxtOjpUSFJPV19VUDsKLSAgICB9Ci0KLSAgICAvLyBwYXJzZSBwcnVuaW5nIHRocmVzaG9sZHMuICBUaGVzZSBkZXBlbmQgb24gb3JkZXIsIHNvIGl0IGlzIG5vdCBkb25lIGFzIGEgbm90aWZpZXIuCi0gICAgcGlwZWxpbmUucHJ1bmVfdGhyZXNob2xkcyA9IFBhcnNlUHJ1bmluZyhwcnVuaW5nLCBwaXBlbGluZS5vcmRlcik7Ci0KLSAgICBpZiAoIXZtWyJsaW1pdF92b2NhYl9maWxlIl0uYXM8c3RkOjpzdHJpbmc+KCkuZW1wdHkoKSkgewotICAgICAgcGlwZWxpbmUucHJ1bmVfdm9jYWIgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHBpcGVsaW5lLnBydW5lX3ZvY2FiID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHV0aWw6Ok5vcm1hbGl6ZVRlbXBQcmVmaXgocGlwZWxpbmUuc29ydC50ZW1wX3ByZWZpeCk7Ci0KLSAgICBsbTo6YnVpbGRlcjo6SW5pdGlhbFByb2JhYmlsaXRpZXNDb25maWcgJmluaXRpYWwgPSBwaXBlbGluZS5pbml0aWFsX3Byb2JzOwotICAgIC8vIFRPRE86IGV2YWx1YXRlIG9wdGlvbnMgZm9yIHRoZXNlLiAgCi0gICAgaW5pdGlhbC5hZGRlcl9pbi50b3RhbF9tZW1vcnkgPSAzMjc2ODsKLSAgICBpbml0aWFsLmFkZGVyX2luLmJsb2NrX2NvdW50ID0gMjsKLSAgICBpbml0aWFsLmFkZGVyX291dC50b3RhbF9tZW1vcnkgPSAzMjc2ODsKLSAgICBpbml0aWFsLmFkZGVyX291dC5ibG9ja19jb3VudCA9IDI7Ci0gICAgcGlwZWxpbmUucmVhZF9iYWNrb2ZmcyA9IGluaXRpYWwuYWRkZXJfb3V0OwotCi0gICAgdXRpbDo6c2NvcGVkX2ZkIGluKDApLCBvdXQoMSk7Ci0gICAgaWYgKHZtLmNvdW50KCJ0ZXh0IikpIHsKLSAgICAgIGluLnJlc2V0KHV0aWw6Ok9wZW5SZWFkT3JUaHJvdyh0ZXh0LmNfc3RyKCkpKTsKLSAgICB9Ci0gICAgaWYgKHZtLmNvdW50KCJhcnBhIikpIHsKLSAgICAgIG91dC5yZXNldCh1dGlsOjpDcmVhdGVPclRocm93KGFycGEuY19zdHIoKSkpOwotICAgIH0KLQotICAgIC8vIFJlYWQgZnJvbSBzdGRpbgotICAgIHRyeSB7Ci0gICAgICBsbTo6YnVpbGRlcjo6T3V0cHV0IG91dHB1dDsKLSAgICAgIG91dHB1dC5BZGQobmV3IGxtOjpidWlsZGVyOjpQcmludEFSUEEob3V0LnJlbGVhc2UoKSwgdmVyYm9zZV9oZWFkZXIpKTsKLSAgICAgIGxtOjpidWlsZGVyOjpQaXBlbGluZShwaXBlbGluZSwgaW4ucmVsZWFzZSgpLCBvdXRwdXQpOwotICAgIH0gY2F0Y2ggKGNvbnN0IHV0aWw6Ok1hbGxvY0V4Y2VwdGlvbiAmZSkgewotICAgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHN0ZDo6Y2VyciA8PCAiVHJ5IHJlcnVubmluZyB3aXRoIGEgbW9yZSBjb25zZXJ2YXRpdmUgLVMgc2V0dGluZyB0aGFuICIgPDwgdm1bIm1lbW9yeSJdLmFzPHN0ZDo6c3RyaW5nPigpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICB1dGlsOjpQcmludFVzYWdlKHN0ZDo6Y2Vycik7Ci0gIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZlKSB7Ci0gICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gMTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvbXVsdGlfc3RyZWFtLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvbXVsdGlfc3RyZWFtLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDdhOThjLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL211bHRpX3N0cmVhbS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0jaWZuZGVmIExNX0JVSUxERVJfTVVMVElfU1RSRUFNX18KLSNkZWZpbmUgTE1fQlVJTERFUl9NVUxUSV9TVFJFQU1fXwotCi0jaW5jbHVkZSAibG0vYnVpbGRlci9uZ3JhbV9zdHJlYW0uaGgiCi0jaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCi0jaW5jbHVkZSAidXRpbC9zdHJlYW0vY2hhaW4uaGgiCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPG5ldz4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1uYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBGaXhlZEFycmF5IHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IEZpeGVkQXJyYXkoc3RkOjpzaXplX3QgY291bnQpIHsKLSAgICAgIEluaXQoY291bnQpOwotICAgIH0KLQotICAgIEZpeGVkQXJyYXkoKSA6IG5ld2VkX2VuZF8oTlVMTCkge30KLQotICAgIHZvaWQgSW5pdChzdGQ6OnNpemVfdCBjb3VudCkgewotICAgICAgYXNzZXJ0KCFibG9ja18uZ2V0KCkpOwotICAgICAgYmxvY2tfLnJlc2V0KG1hbGxvYyhzaXplb2YoVCkgKiBjb3VudCkpOwotICAgICAgaWYgKCFibG9ja18uZ2V0KCkpIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7Ci0gICAgICBuZXdlZF9lbmRfID0gYmVnaW4oKTsKLSAgICB9Ci0KLSAgICBGaXhlZEFycmF5KGNvbnN0IEZpeGVkQXJyYXkgJmZyb20pIHsKLSAgICAgIHN0ZDo6c2l6ZV90IHNpemUgPSBmcm9tLm5ld2VkX2VuZF8gLSBzdGF0aWNfY2FzdDxjb25zdCBUKj4oZnJvbS5ibG9ja18uZ2V0KCkpOwotICAgICAgSW5pdChzaXplKTsKLSAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgbmV3KGVuZCgpKSBUKGZyb21baV0pOwotICAgICAgICBDb25zdHJ1Y3RlZCgpOwotICAgICAgfQotICAgIH0KLQotICAgIH5GaXhlZEFycmF5KCkgeyBjbGVhcigpOyB9Ci0KLSAgICBUICpiZWdpbigpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihibG9ja18uZ2V0KCkpOyB9Ci0gICAgY29uc3QgVCAqYmVnaW4oKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBUKj4oYmxvY2tfLmdldCgpKTsgfQotICAgIC8vIEFsd2F5cyBjYWxsIENvbnN0cnVjdGVkIGFmdGVyIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBuZXcuICAKLSAgICBUICplbmQoKSB7IHJldHVybiBuZXdlZF9lbmRfOyB9Ci0gICAgY29uc3QgVCAqZW5kKCkgY29uc3QgeyByZXR1cm4gbmV3ZWRfZW5kXzsgfQotCi0gICAgVCAmYmFjaygpIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQotICAgIGNvbnN0IFQgJmJhY2soKSBjb25zdCB7IHJldHVybiAqKGVuZCgpIC0gMSk7IH0KLQotICAgIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBlbmQoKSAtIGJlZ2luKCk7IH0KLSAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQotCi0gICAgVCAmb3BlcmF0b3JbXShzdGQ6OnNpemVfdCBpKSB7IHJldHVybiBiZWdpbigpW2ldOyB9Ci0gICAgY29uc3QgVCAmb3BlcmF0b3JbXShzdGQ6OnNpemVfdCBpKSBjb25zdCB7IHJldHVybiBiZWdpbigpW2ldOyB9Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgQz4gdm9pZCBwdXNoX2JhY2soY29uc3QgQyAmYykgewotICAgICAgbmV3IChlbmQoKSkgVChjKTsKLSAgICAgIENvbnN0cnVjdGVkKCk7Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhcigpIHsKLSAgICAgIGZvciAoVCAqaSA9IGJlZ2luKCk7IGkgIT0gZW5kKCk7ICsraSkKLSAgICAgICAgaS0+flQoKTsKLSAgICAgIG5ld2VkX2VuZF8gPSBiZWdpbigpOwotICAgIH0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgdm9pZCBDb25zdHJ1Y3RlZCgpIHsKLSAgICAgICsrbmV3ZWRfZW5kXzsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB1dGlsOjpzY29wZWRfbWFsbG9jIGJsb2NrXzsKLQotICAgIFQgKm5ld2VkX2VuZF87Ci19OwotCi1jbGFzcyBDaGFpbnM7Ci0KLWNsYXNzIENoYWluUG9zaXRpb25zIDogcHVibGljIEZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uPiB7Ci0gIHB1YmxpYzoKLSAgICBDaGFpblBvc2l0aW9ucygpIHt9Ci0KLSAgICB2b2lkIEluaXQoQ2hhaW5zICZjaGFpbnMpOwotCi0gICAgZXhwbGljaXQgQ2hhaW5Qb3NpdGlvbnMoQ2hhaW5zICZjaGFpbnMpIHsKLSAgICAgIEluaXQoY2hhaW5zKTsKLSAgICB9Ci19OwotCi1jbGFzcyBDaGFpbnMgOiBwdWJsaWMgRml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkNoYWluPiB7Ci0gIHByaXZhdGU6Ci0gICAgdGVtcGxhdGUgPGNsYXNzIFQsIHZvaWQgKFQ6OipwdHIpKGNvbnN0IENoYWluUG9zaXRpb25zICYpID0gJlQ6OlJ1bj4gc3RydWN0IENoZWNrRm9yUnVuIHsKLSAgICAgIHR5cGVkZWYgQ2hhaW5zIHR5cGU7Ci0gICAgfTsKLQotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgQ2hhaW5zKHN0ZDo6c2l6ZV90IGxpbWl0KSA6IEZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpbj4obGltaXQpIHt9Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgV29ya2VyPiB0eXBlbmFtZSBDaGVja0ZvclJ1bjxXb3JrZXI+Ojp0eXBlICZvcGVyYXRvcj4+KGNvbnN0IFdvcmtlciAmd29ya2VyKSB7Ci0gICAgICB0aHJlYWRzXy5wdXNoX2JhY2sobmV3IHV0aWw6OnN0cmVhbTo6VGhyZWFkKENoYWluUG9zaXRpb25zKCp0aGlzKSwgd29ya2VyKSk7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPGNsYXNzIFdvcmtlcj4gdHlwZW5hbWUgQ2hlY2tGb3JSdW48V29ya2VyPjo6dHlwZSAmb3BlcmF0b3I+Pihjb25zdCBib29zdDo6cmVmZXJlbmNlX3dyYXBwZXI8V29ya2VyPiAmd29ya2VyKSB7Ci0gICAgICB0aHJlYWRzXy5wdXNoX2JhY2sobmV3IHV0aWw6OnN0cmVhbTo6VGhyZWFkKENoYWluUG9zaXRpb25zKCp0aGlzKSwgd29ya2VyKSk7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgQ2hhaW5zICZvcGVyYXRvcj4+KGNvbnN0IHV0aWw6OnN0cmVhbTo6UmVjeWNsZXIgJnJlY3ljbGVyKSB7Ci0gICAgICBmb3IgKHV0aWw6OnN0cmVhbTo6Q2hhaW4gKmkgPSBiZWdpbigpOyBpICE9IGVuZCgpOyArK2kpIAotICAgICAgICAqaSA+PiByZWN5Y2xlcjsKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICB2b2lkIFdhaXQoYm9vbCByZWxlYXNlX21lbW9yeSA9IHRydWUpIHsKLSAgICAgIHRocmVhZHNfLmNsZWFyKCk7Ci0gICAgICBmb3IgKHV0aWw6OnN0cmVhbTo6Q2hhaW4gKmkgPSBiZWdpbigpOyBpICE9IGVuZCgpOyArK2kpIHsKLSAgICAgICAgaS0+V2FpdChyZWxlYXNlX21lbW9yeSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgYm9vc3Q6OnB0cl92ZWN0b3I8dXRpbDo6c3RyZWFtOjpUaHJlYWQ+IHRocmVhZHNfOwotCi0gICAgQ2hhaW5zKGNvbnN0IENoYWlucyAmKTsKLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBDaGFpbnMgJik7Ci19OwotCi1pbmxpbmUgdm9pZCBDaGFpblBvc2l0aW9uczo6SW5pdChDaGFpbnMgJmNoYWlucykgewotICBGaXhlZEFycmF5PHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbj46OkluaXQoY2hhaW5zLnNpemUoKSk7Ci0gIGZvciAodXRpbDo6c3RyZWFtOjpDaGFpbiAqaSA9IGNoYWlucy5iZWdpbigpOyBpICE9IGNoYWlucy5lbmQoKTsgKytpKSB7Ci0gICAgbmV3IChlbmQoKSkgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uKGktPkFkZCgpKTsgQ29uc3RydWN0ZWQoKTsKLSAgfQotfQotCi1pbmxpbmUgQ2hhaW5zICZvcGVyYXRvcj4+KENoYWlucyAmY2hhaW5zLCBDaGFpblBvc2l0aW9ucyAmcG9zaXRpb25zKSB7Ci0gIHBvc2l0aW9ucy5Jbml0KGNoYWlucyk7Ci0gIHJldHVybiBjaGFpbnM7Ci19Ci0KLWNsYXNzIE5HcmFtU3RyZWFtcyA6IHB1YmxpYyBGaXhlZEFycmF5PE5HcmFtU3RyZWFtPiB7Ci0gIHB1YmxpYzoKLSAgICBOR3JhbVN0cmVhbXMoKSB7fQotCi0gICAgLy8gVGhpcyBwdXRzIGEgZHVtbXkgTkdyYW1TdHJlYW0gYXQgdGhlIGJlZ2lubmluZyAodXNlZnVsIHRvIGFsZ29yaXRobXMgdGhhdCBuZWVkIHRvIHJlZmVyZW5jZSBzb21ldGhpbmcgYXQgdGhlIGJlZ2lubmluZykuCi0gICAgdm9pZCBJbml0V2l0aER1bW15KGNvbnN0IENoYWluUG9zaXRpb25zICZwb3NpdGlvbnMpIHsKLSAgICAgIEZpeGVkQXJyYXk8TkdyYW1TdHJlYW0+OjpJbml0KHBvc2l0aW9ucy5zaXplKCkgKyAxKTsKLSAgICAgIG5ldyAoZW5kKCkpIE5HcmFtU3RyZWFtKCk7IENvbnN0cnVjdGVkKCk7Ci0gICAgICBmb3IgKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiAqaSA9IHBvc2l0aW9ucy5iZWdpbigpOyBpICE9IHBvc2l0aW9ucy5lbmQoKTsgKytpKSB7Ci0gICAgICAgIHB1c2hfYmFjaygqaSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTGltaXQgcmVzdHJpY3RzIHRvIHBvc2l0aW9uc1swLGxpbWl0KQotICAgIHZvaWQgSW5pdChjb25zdCBDaGFpblBvc2l0aW9ucyAmcG9zaXRpb25zLCBzdGQ6OnNpemVfdCBsaW1pdCkgewotICAgICAgRml4ZWRBcnJheTxOR3JhbVN0cmVhbT46OkluaXQobGltaXQpOwotICAgICAgZm9yIChjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gKmkgPSBwb3NpdGlvbnMuYmVnaW4oKTsgaSAhPSBwb3NpdGlvbnMuYmVnaW4oKSArIGxpbWl0OyArK2kpIHsKLSAgICAgICAgcHVzaF9iYWNrKCppKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBJbml0KGNvbnN0IENoYWluUG9zaXRpb25zICZwb3NpdGlvbnMpIHsKLSAgICAgIEluaXQocG9zaXRpb25zLCBwb3NpdGlvbnMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBOR3JhbVN0cmVhbXMoY29uc3QgQ2hhaW5Qb3NpdGlvbnMgJnBvc2l0aW9ucykgewotICAgICAgSW5pdChwb3NpdGlvbnMpOwotICAgIH0KLX07Ci0KLWlubGluZSBDaGFpbnMgJm9wZXJhdG9yPj4oQ2hhaW5zICZjaGFpbnMsIE5HcmFtU3RyZWFtcyAmc3RyZWFtcykgewotICBDaGFpblBvc2l0aW9ucyBwb3NpdGlvbnM7Ci0gIGNoYWlucyA+PiBwb3NpdGlvbnM7Ci0gIHN0cmVhbXMuSW5pdChwb3NpdGlvbnMpOwotICByZXR1cm4gY2hhaW5zOwotfQotCi19fSAvLyBuYW1lc3BhY2VzCi0jZW5kaWYgLy8gTE1fQlVJTERFUl9NVUxUSV9TVFJFQU1fXwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvbmdyYW0uaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9uZ3JhbS5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3MmJjYi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9uZ3JhbS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0jaWZuZGVmIExNX0JVSUxERVJfTkdSQU1fSAotI2RlZmluZSBMTV9CVUlMREVSX05HUkFNX0gKLQotI2luY2x1ZGUgImxtL3dlaWdodHMuaGgiCi0jaW5jbHVkZSAibG0vd29yZF9pbmRleC5oaCIKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotbmFtZXNwYWNlIGxtIHsKLW5hbWVzcGFjZSBidWlsZGVyIHsKLQotc3RydWN0IFVuaW50ZXJwb2xhdGVkIHsKLSAgZmxvYXQgcHJvYjsgIC8vIFVuaW50ZXJwb2xhdGVkIHByb2JhYmlsaXR5LgotICBmbG9hdCBnYW1tYTsgLy8gSW50ZXJwb2xhdGlvbiB3ZWlnaHQgZm9yIGxvd2VyIG9yZGVyLgotfTsKLQotdW5pb24gUGF5bG9hZCB7Ci0gIHVpbnQ2NF90IGNvdW50OwotICBVbmludGVycG9sYXRlZCB1bmludGVycDsKLSAgUHJvYkJhY2tvZmYgY29tcGxldGU7Ci19OwotCi1jbGFzcyBOR3JhbSB7Ci0gIHB1YmxpYzoKLSAgICBOR3JhbSh2b2lkICpiZWdpbiwgc3RkOjpzaXplX3Qgb3JkZXIpCi0gICAgICA6IGJlZ2luXyhzdGF0aWNfY2FzdDxXb3JkSW5kZXgqPihiZWdpbikpLCBlbmRfKGJlZ2luXyArIG9yZGVyKSB7fQotCi0gICAgY29uc3QgdWludDhfdCAqQmFzZSgpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJlZ2luXyk7IH0KLSAgICB1aW50OF90ICpCYXNlKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmVnaW5fKTsgfQotCi0gICAgdm9pZCBSZUJhc2Uodm9pZCAqdG8pIHsKLSAgICAgIHN0ZDo6c2l6ZV90IGRpZmZlcmVuY2UgPSBlbmRfIC0gYmVnaW5fOwotICAgICAgYmVnaW5fID0gcmVpbnRlcnByZXRfY2FzdDxXb3JkSW5kZXgqPih0byk7Ci0gICAgICBlbmRfID0gYmVnaW5fICsgZGlmZmVyZW5jZTsKLSAgICB9Ci0KLSAgICAvLyBXb3VsZCBkbyBvcGVyYXRvcisrIGJ1dCB0aGF0IGNhbiBnZXQgY29uZnVzaW5nIGZvciBhIHN0cmVhbS4KLSAgICB2b2lkIE5leHRJbk1lbW9yeSgpIHsKLSAgICAgIFJlQmFzZSgmVmFsdWUoKSArIDEpOwotICAgIH0KLQotICAgIC8vIExvd2VyLWNhc2UgaW4gZGVmZXJlbmNlIHRvIFNUTC4KLSAgICBjb25zdCBXb3JkSW5kZXggKmJlZ2luKCkgY29uc3QgeyByZXR1cm4gYmVnaW5fOyB9Ci0gICAgV29yZEluZGV4ICpiZWdpbigpIHsgcmV0dXJuIGJlZ2luXzsgfQotICAgIGNvbnN0IFdvcmRJbmRleCAqZW5kKCkgY29uc3QgeyByZXR1cm4gZW5kXzsgfQotICAgIFdvcmRJbmRleCAqZW5kKCkgeyByZXR1cm4gZW5kXzsgfQotCi0gICAgY29uc3QgUGF5bG9hZCAmVmFsdWUoKSBjb25zdCB7IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQYXlsb2FkICo+KGVuZF8pOyB9Ci0gICAgUGF5bG9hZCAmVmFsdWUoKSB7IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxQYXlsb2FkICo+KGVuZF8pOyB9Ci0KLSAgICB1aW50NjRfdCAmQ291bnQoKSB7IHJldHVybiBWYWx1ZSgpLmNvdW50OyB9Ci0gICAgdWludDY0X3QgQ291bnQoKSBjb25zdCB7IHJldHVybiBWYWx1ZSgpLmNvdW50OyB9Ci0KLSAgICBzdGQ6OnNpemVfdCBPcmRlcigpIGNvbnN0IHsgcmV0dXJuIGVuZF8gLSBiZWdpbl87IH0KLQotICAgIHN0YXRpYyBzdGQ6OnNpemVfdCBUb3RhbFNpemUoc3RkOjpzaXplX3Qgb3JkZXIpIHsKLSAgICAgIHJldHVybiBvcmRlciAqIHNpemVvZihXb3JkSW5kZXgpICsgc2l6ZW9mKFBheWxvYWQpOwotICAgIH0KLSAgICBzdGQ6OnNpemVfdCBUb3RhbFNpemUoKSBjb25zdCB7Ci0gICAgICAvLyBDb21waWxlciBzaG91bGQgb3B0aW1pemUgdGhpcy4KLSAgICAgIHJldHVybiBUb3RhbFNpemUoT3JkZXIoKSk7Ci0gICAgfQotICAgIHN0YXRpYyBzdGQ6OnNpemVfdCBPcmRlckZyb21TaXplKHN0ZDo6c2l6ZV90IHNpemUpIHsKLSAgICAgIHN0ZDo6c2l6ZV90IHJldCA9IChzaXplIC0gc2l6ZW9mKFBheWxvYWQpKSAvIHNpemVvZihXb3JkSW5kZXgpOwotICAgICAgYXNzZXJ0KHNpemUgPT0gVG90YWxTaXplKHJldCkpOwotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgCi0gICAgLy8gbWFuaXB1bGF0ZSBtc2IgdG8gc2lnbmFsIHRoYXQgbmdyYW0gY2FuIGJlIHBydW5lZAotICAgIC8qbWpkKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGJvb2wgSXNNYXJrZWQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gVmFsdWUoKS5jb3VudCA+PiAoc2l6ZW9mKFZhbHVlKCkuY291bnQpICogOCAtIDEpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIE1hcmsoKSB7Ci0gICAgICBWYWx1ZSgpLmNvdW50IHw9ICgxdWwgPDwgKHNpemVvZihWYWx1ZSgpLmNvdW50KSAqIDggLSAxKSk7Ci0gICAgfQotICAgIAotICAgIHZvaWQgVW5tYXJrKCkgewotICAgICAgVmFsdWUoKS5jb3VudCAmPSB+KDF1bCA8PCAoc2l6ZW9mKFZhbHVlKCkuY291bnQpICogOCAtIDEpKTsKLSAgICB9Ci0gICAgCi0gICAgdWludDY0X3QgVW5tYXJrZWRDb3VudCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBWYWx1ZSgpLmNvdW50ICYgfigxdWwgPDwgKHNpemVvZihWYWx1ZSgpLmNvdW50KSAqIDggLSAxKSk7Ci0gICAgfQotICAgIAotICAgIHVpbnQ2NF90IEN1dG9mZkNvdW50KCkgY29uc3QgewotICAgICAgcmV0dXJuIElzTWFya2VkKCkgPyAwIDogVW5tYXJrZWRDb3VudCgpOwotICAgIH0KLQotICAgIC8qbWpkKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBwcml2YXRlOgotICAgIFdvcmRJbmRleCAqYmVnaW5fLCAqZW5kXzsKLX07Ci0KLWNvbnN0IFdvcmRJbmRleCBrVU5LID0gMDsKLWNvbnN0IFdvcmRJbmRleCBrQk9TID0gMTsKLWNvbnN0IFdvcmRJbmRleCBrRU9TID0gMjsKLQotfSAvLyBuYW1lc3BhY2UgYnVpbGRlcgotfSAvLyBuYW1lc3BhY2UgbG0KLQotI2VuZGlmIC8vIExNX0JVSUxERVJfTkdSQU1fSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvbmdyYW1fc3RyZWFtLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvbmdyYW1fc3RyZWFtLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjQyNzM0Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL25ncmFtX3N0cmVhbS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSNpZm5kZWYgTE1fQlVJTERFUl9OR1JBTV9TVFJFQU1fSAotI2RlZmluZSBMTV9CVUlMREVSX05HUkFNX1NUUkVBTV9ICi0KLSNpbmNsdWRlICJsbS9idWlsZGVyL25ncmFtLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NoYWluLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL211bHRpX3N0cmVhbS5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9zdHJlYW0uaGgiCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotCi1uYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7Ci0KLWNsYXNzIE5HcmFtU3RyZWFtIHsKLSAgcHVibGljOgotICAgIE5HcmFtU3RyZWFtKCkgOiBncmFtXyhOVUxMLCAwKSB7fQotCi0gICAgTkdyYW1TdHJlYW0oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgOiBncmFtXyhOVUxMLCAwKSB7Ci0gICAgICBJbml0KHBvc2l0aW9uKTsKLSAgICB9Ci0KLSAgICB2b2lkIEluaXQoY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgewotICAgICAgc3RyZWFtXy5Jbml0KHBvc2l0aW9uKTsKLSAgICAgIGdyYW1fID0gTkdyYW0oc3RyZWFtXy5HZXQoKSwgTkdyYW06Ok9yZGVyRnJvbVNpemUocG9zaXRpb24uR2V0Q2hhaW4oKS5FbnRyeVNpemUoKSkpOwotICAgIH0KLQotICAgIE5HcmFtICZvcGVyYXRvciooKSB7IHJldHVybiBncmFtXzsgfQotICAgIGNvbnN0IE5HcmFtICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBncmFtXzsgfQotCi0gICAgTkdyYW0gKm9wZXJhdG9yLT4oKSB7IHJldHVybiAmZ3JhbV87IH0KLSAgICBjb25zdCBOR3JhbSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZncmFtXzsgfQotCi0gICAgdm9pZCAqR2V0KCkgeyByZXR1cm4gc3RyZWFtXy5HZXQoKTsgfQotICAgIGNvbnN0IHZvaWQgKkdldCgpIGNvbnN0IHsgcmV0dXJuIHN0cmVhbV8uR2V0KCk7IH0KLQotICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBzdHJlYW1fOyB9Ci0gICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiAhc3RyZWFtXzsgfQotICAgIHZvaWQgUG9pc29uKCkgeyBzdHJlYW1fLlBvaXNvbigpOyB9Ci0KLSAgICBOR3JhbVN0cmVhbSAmb3BlcmF0b3IrKygpIHsKLSAgICAgICsrc3RyZWFtXzsKLSAgICAgIGdyYW1fLlJlQmFzZShzdHJlYW1fLkdldCgpKTsKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBOR3JhbSBncmFtXzsKLSAgICB1dGlsOjpzdHJlYW06OlN0cmVhbSBzdHJlYW1fOwotfTsKLQotaW5saW5lIHV0aWw6OnN0cmVhbTo6Q2hhaW4gJm9wZXJhdG9yPj4odXRpbDo6c3RyZWFtOjpDaGFpbiAmY2hhaW4sIE5HcmFtU3RyZWFtICZzdHIpIHsKLSAgc3RyLkluaXQoY2hhaW4uQWRkKCkpOwotICByZXR1cm4gY2hhaW47Ci19Ci0KLXR5cGVkZWYgdXRpbDo6c3RyZWFtOjpHZW5lcmljU3RyZWFtczxOR3JhbVN0cmVhbT4gTkdyYW1TdHJlYW1zOwotCi19fSAvLyBuYW1lc3BhY2VzCi0jZW5kaWYgLy8gTE1fQlVJTERFUl9OR1JBTV9TVFJFQU1fSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvb3V0cHV0LmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvb3V0cHV0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmMwMTk3Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL291dHB1dC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNpbmNsdWRlICJsbS9idWlsZGVyL291dHB1dC5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9tdWx0aV9zdHJlYW0uaGgiCi0KLSNpbmNsdWRlIDxib29zdC9yZWYuaHBwPgotCi1uYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7Ci0KLU91dHB1dEhvb2s6On5PdXRwdXRIb29rKCkge30KLQotdm9pZCBPdXRwdXRIb29rOjpBcHBseSh1dGlsOjpzdHJlYW06OkNoYWlucyAmY2hhaW5zKSB7Ci0gIGNoYWlucyA+PiBib29zdDo6cmVmKCp0aGlzKTsKLX0KLQotfX0gLy8gbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvb3V0cHV0LmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvb3V0cHV0LmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWY3NjlhLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL291dHB1dC5oaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSNpZm5kZWYgTE1fQlVJTERFUl9PVVRQVVRfSAotI2RlZmluZSBMTV9CVUlMREVSX09VVFBVVF9ICi0KLSNpbmNsdWRlICJsbS9idWlsZGVyL2hlYWRlcl9pbmZvLmhoIgotI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKLQotI2luY2x1ZGUgPGJvb3N0L3B0cl9jb250YWluZXIvcHRyX3ZlY3Rvci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS5ocHA+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0KLW5hbWVzcGFjZSB1dGlsIHsgbmFtZXNwYWNlIHN0cmVhbSB7IGNsYXNzIENoYWluczsgY2xhc3MgQ2hhaW5Qb3NpdGlvbnM7IH0gfQotCi0vKiBPdXRwdXRzIGZyb20gbG1wbHo6IEFSUEE8IHNoYXJkZWQgZmlsZXMsIGV0YyAqLwotbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGJ1aWxkZXIgewotCi0vLyBUaGVzZSBhcmUgZGlmZmVyZW50IHR5cGVzIG9mIGhvb2tzLiAgVmFsdWVzIHNob3VsZCBiZSBjb25zZWN1dGl2ZSB0byBlbmFibGUgYSB2ZWN0b3IgbG9va3VwLgotZW51bSBIb29rVHlwZSB7Ci0gIENPVU5UX0hPT0ssIC8vIFJhdyBOLWdyYW0gY291bnRzLCBoaWdoZXN0IG9yZGVyIG9ubHkuCi0gIFBST0JfUEFSQUxMRUxfSE9PSywgLy8gUHJvYmFiaWxpdHkgYW5kIGJhY2tvZmYgKG9yIGp1c3QgcSkuICBPdXRwdXQgbXVzdCBwcm9jZXNzIHRoZSBvcmRlcnMgaW4gcGFyYWxsZWwgb3IgdGhlcmUgd2lsbCBiZSBhIGRlYWRsb2NrLgotICBQUk9CX1NFUVVFTlRJQUxfSE9PSywgLy8gUHJvYmFiaWxpdHkgYW5kIGJhY2tvZmYgKG9yIGp1c3QgcSkuICBPdXRwdXQgY2FuIHByb2Nlc3Mgb3JkZXJzIGFueSB3YXkgaXQgbGlrZXMuICBUaGlzIHJlcXVpcmVzIHdyaXRpbmcgdGhlIGRhdGEgdG8gZGlzayB0aGVuIHJlYWRpbmcuICBVc2VmdWwgZm9yIEFSUEEgZmlsZXMsIHdoaWNoIHB1dCB1bmlncmFtcyBmaXJzdCBldGMuCi0gIE5VTUJFUl9PRl9IT09LUyAvLyBLZWVwIHRoaXMgbGFzdCBzbyB3ZSBrbm93IGhvdyBtYW55IHZhbHVlcyB0aGVyZSBhcmUuCi19OwotCi1jbGFzcyBPdXRwdXQ7Ci0KLWNsYXNzIE91dHB1dEhvb2sgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgT3V0cHV0SG9vayhIb29rVHlwZSBob29rX3R5cGUpIDogdHlwZV8oaG9va190eXBlKSwgbWFzdGVyXyhOVUxMKSB7fQotCi0gICAgdmlydHVhbCB+T3V0cHV0SG9vaygpOwotCi0gICAgdmlydHVhbCB2b2lkIEFwcGx5KHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZjaGFpbnMpOwotCi0gICAgdmlydHVhbCB2b2lkIFJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zICZwb3NpdGlvbnMpID0gMDsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgY29uc3QgSGVhZGVySW5mbyAmR2V0SGVhZGVyKCkgY29uc3Q7Ci0gICAgaW50IEdldFZvY2FiRkQoKSBjb25zdDsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBPdXRwdXQ7Ci0gICAgY29uc3QgSG9va1R5cGUgdHlwZV87Ci0gICAgY29uc3QgT3V0cHV0ICptYXN0ZXJfOwotfTsKLQotY2xhc3MgT3V0cHV0IDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKLSAgcHVibGljOgotICAgIE91dHB1dCgpIHt9Ci0KLSAgICAvLyBUYWtlcyBvd25lcnNoaXAuCi0gICAgdm9pZCBBZGQoT3V0cHV0SG9vayAqaG9vaykgewotICAgICAgaG9vay0+bWFzdGVyXyA9IHRoaXM7Ci0gICAgICBvdXRwdXRzX1tob29rLT50eXBlX10ucHVzaF9iYWNrKGhvb2spOwotICAgIH0KLQotICAgIGJvb2wgSGF2ZShIb29rVHlwZSBob29rX3R5cGUpIGNvbnN0IHsKLSAgICAgIHJldHVybiAhb3V0cHV0c19baG9va190eXBlXS5lbXB0eSgpOwotICAgIH0KLQotICAgIHZvaWQgU2V0Vm9jYWJGRChpbnQgdG8pIHsgdm9jYWJfZmRfID0gdG87IH0KLSAgICBpbnQgR2V0Vm9jYWJGRCgpIGNvbnN0IHsgcmV0dXJuIHZvY2FiX2ZkXzsgfQotCi0gICAgdm9pZCBTZXRIZWFkZXIoY29uc3QgSGVhZGVySW5mbyAmaGVhZGVyKSB7IGhlYWRlcl8gPSBoZWFkZXI7IH0KLSAgICBjb25zdCBIZWFkZXJJbmZvICZHZXRIZWFkZXIoKSBjb25zdCB7IHJldHVybiBoZWFkZXJfOyB9Ci0KLSAgICB2b2lkIEFwcGx5KEhvb2tUeXBlIGhvb2tfdHlwZSwgdXRpbDo6c3RyZWFtOjpDaGFpbnMgJmNoYWlucykgewotICAgICAgZm9yIChib29zdDo6cHRyX3ZlY3RvcjxPdXRwdXRIb29rPjo6aXRlcmF0b3IgZW50cnkgPSBvdXRwdXRzX1tob29rX3R5cGVdLmJlZ2luKCk7IGVudHJ5ICE9IG91dHB1dHNfW2hvb2tfdHlwZV0uZW5kKCk7ICsrZW50cnkpIHsKLSAgICAgICAgZW50cnktPkFwcGx5KGNoYWlucyk7Ci0gICAgICB9Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgYm9vc3Q6OnB0cl92ZWN0b3I8T3V0cHV0SG9vaz4gb3V0cHV0c19bTlVNQkVSX09GX0hPT0tTXTsKLSAgICBpbnQgdm9jYWJfZmRfOwotICAgIEhlYWRlckluZm8gaGVhZGVyXzsKLX07Ci0KLWlubGluZSBjb25zdCBIZWFkZXJJbmZvICZPdXRwdXRIb29rOjpHZXRIZWFkZXIoKSBjb25zdCB7Ci0gIHJldHVybiBtYXN0ZXJfLT5HZXRIZWFkZXIoKTsKLX0KLQotaW5saW5lIGludCBPdXRwdXRIb29rOjpHZXRWb2NhYkZEKCkgY29uc3QgewotICByZXR1cm4gbWFzdGVyXy0+R2V0Vm9jYWJGRCgpOwotfQotCi19fSAvLyBuYW1lc3BhY2VzCi0KLSNlbmRpZiAvLyBMTV9CVUlMREVSX09VVFBVVF9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9waXBlbGluZS5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL3BpcGVsaW5lLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2VkMGUzLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL3BpcGVsaW5lLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLSNpbmNsdWRlICJsbS9idWlsZGVyL3BpcGVsaW5lLmhoIgotCi0jaW5jbHVkZSAibG0vYnVpbGRlci9hZGp1c3RfY291bnRzLmhoIgotI2luY2x1ZGUgImxtL2J1aWxkZXIvY29ycHVzX2NvdW50LmhoIgotI2luY2x1ZGUgImxtL2J1aWxkZXIvaGFzaF9nYW1tYS5oaCIKLSNpbmNsdWRlICJsbS9idWlsZGVyL2luaXRpYWxfcHJvYmFiaWxpdGllcy5oaCIKLSNpbmNsdWRlICJsbS9idWlsZGVyL2ludGVycG9sYXRlLmhoIgotI2luY2x1ZGUgImxtL2J1aWxkZXIvb3V0cHV0LmhoIgotI2luY2x1ZGUgImxtL2J1aWxkZXIvc29ydC5oaCIKLQotI2luY2x1ZGUgImxtL3NpemVzLmhoIgotCi0jaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAidXRpbC9maWxlLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL2lvLmhoIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7Ci0KLW5hbWVzcGFjZSB7Ci12b2lkIFByaW50U3RhdGlzdGljcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHNfcHJ1bmVkLCBjb25zdCBzdGQ6OnZlY3RvcjxEaXNjb3VudD4gJmRpc2NvdW50cykgewotICBzdGQ6OmNlcnIgPDwgIlN0YXRpc3RpY3M6XG4iOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50cy5zaXplKCk7ICsraSkgewotICAgIHN0ZDo6Y2VyciA8PCAoaSArIDEpIDw8ICcgJyA8PCBjb3VudHNfcHJ1bmVkW2ldOwotICAgIGlmKGNvdW50c1tpXSAhPSBjb3VudHNfcHJ1bmVkW2ldKQotICAgICAgIHN0ZDo6Y2VyciA8PCAiLyIgPDwgY291bnRzW2ldOwotCi0gICAgZm9yIChzaXplX3QgZCA9IDE7IGQgPD0gMzsgKytkKQotICAgICAgc3RkOjpjZXJyIDw8ICIgRCIgPDwgZCA8PCAoZCA9PSAzID8gIis9IiA6ICI9IikgPDwgZGlzY291bnRzW2ldLmFtb3VudFtkXTsKLSAgICBzdGQ6OmNlcnIgPDwgJ1xuJzsKLSAgfQotfQotCi1jbGFzcyBNYXN0ZXIgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTWFzdGVyKFBpcGVsaW5lQ29uZmlnICZjb25maWcpIAotICAgICAgOiBjb25maWdfKGNvbmZpZyksIGNoYWluc18oY29uZmlnLm9yZGVyKSwgZmlsZXNfKGNvbmZpZy5vcmRlcikgewotICAgICAgY29uZmlnXy5taW5pbXVtX2Jsb2NrID0gc3RkOjptYXgoTkdyYW06OlRvdGFsU2l6ZShjb25maWdfLm9yZGVyKSwgY29uZmlnXy5taW5pbXVtX2Jsb2NrKTsKLSAgICB9Ci0KLSAgICBjb25zdCBQaXBlbGluZUNvbmZpZyAmQ29uZmlnKCkgY29uc3QgeyByZXR1cm4gY29uZmlnXzsgfQotCi0gICAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgJk11dGFibGVDaGFpbnMoKSB7IHJldHVybiBjaGFpbnNfOyB9Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gTWFzdGVyICZvcGVyYXRvcj4+KGNvbnN0IFQgJndvcmtlcikgewotICAgICAgY2hhaW5zXyA+PiB3b3JrZXI7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgLy8gVGhpcyB0YWtlcyB0aGUgKHBhcnRpYWxseSkgc29ydGVkIG5ncmFtcyBhbmQgc2V0cyB1cCBmb3IgYWRqdXN0ZWQgY291bnRzLgotICAgIHZvaWQgSW5pdEZvckFkanVzdCh1dGlsOjpzdHJlYW06OlNvcnQ8U3VmZml4T3JkZXIsIEFkZENvbWJpbmVyPiAmbmdyYW1zLCBXb3JkSW5kZXggdHlwZXMpIHsKLSAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGVhY2hfb3JkZXJfbWluID0gY29uZmlnXy5taW5pbXVtX2Jsb2NrICogY29uZmlnXy5ibG9ja19jb3VudDsKLSAgICAgIC8vIFdlIGtub3cgaG93IG1hbnkgdW5pZ3JhbXMgdGhlcmUgYXJlLiAgRG9uJ3QgYWxsb2NhdGUgbW9yZSB0aGFuIG5lZWRlZCB0byB0aGVtLgotICAgICAgY29uc3Qgc3RkOjpzaXplX3QgbWluX2NoYWlucyA9IChjb25maWdfLm9yZGVyIC0gMSkgKiBlYWNoX29yZGVyX21pbiArCi0gICAgICAgIHN0ZDo6bWluKHR5cGVzICogTkdyYW06OlRvdGFsU2l6ZSgxKSwgZWFjaF9vcmRlcl9taW4pOwotICAgICAgLy8gRG8gbWVyZ2Ugc29ydCB3aXRoIGNhbGN1bGF0ZWQgbGF6aW5lc3MuCi0gICAgICBjb25zdCBzdGQ6OnNpemVfdCBtZXJnZV91c2luZyA9IG5ncmFtcy5NZXJnZShzdGQ6Om1pbihjb25maWdfLlRvdGFsTWVtb3J5KCkgLSBtaW5fY2hhaW5zLCBuZ3JhbXMuRGVmYXVsdExhenkoKSkpOwotCi0gICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRfYm91bmRzKDEsIHR5cGVzKTsKLSAgICAgIENyZWF0ZUNoYWlucyhjb25maWdfLlRvdGFsTWVtb3J5KCkgLSBtZXJnZV91c2luZywgY291bnRfYm91bmRzKTsKLSAgICAgIG5ncmFtcy5PdXRwdXQoY2hhaW5zXy5iYWNrKCksIG1lcmdlX3VzaW5nKTsKLQotICAgICAgLy8gU2V0dXAgdW5pZ3JhbSBmaWxlLiAgCi0gICAgICBmaWxlc18ucHVzaF9iYWNrKHV0aWw6Ok1ha2VUZW1wKGNvbmZpZ18uVGVtcFByZWZpeCgpKSk7Ci0gICAgfQotCi0gICAgLy8gRm9yIGluaXRpYWwgcHJvYmFiaWxpdGllcywgYnV0IHRoaXMgaXMgZ2VuZXJpYy4KLSAgICB2b2lkIFNvcnRBbmRSZWFkVHdpY2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIFNvcnRzPENvbnRleHRPcmRlcj4gJnNvcnRzLCB1dGlsOjpzdHJlYW06OkNoYWlucyAmc2Vjb25kLCB1dGlsOjpzdHJlYW06OkNoYWluQ29uZmlnIHNlY29uZF9jb25maWcpIHsKLSAgICAgIC8vIERvIG1lcmdlIGZpcnN0IGJlZm9yZSBhbGxvY2F0aW5nIGNoYWluIG1lbW9yeS4KLSAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDE7IGkgPCBjb25maWdfLm9yZGVyOyArK2kpIHsKLSAgICAgICAgc29ydHNbaSAtIDFdLk1lcmdlKDApOwotICAgICAgfQotICAgICAgLy8gVGhlcmUncyBubyBsYXp5IG1lcmdlLCBzbyBqdXN0IGRpdmlkZSBtZW1vcnkgYW1vbmdzdCB0aGUgY2hhaW5zLgotICAgICAgQ3JlYXRlQ2hhaW5zKGNvbmZpZ18uVG90YWxNZW1vcnkoKSwgY291bnRzKTsKLSAgICAgIGNoYWluc18uYmFjaygpLkFjdGl2YXRlUHJvZ3Jlc3MoKTsKLSAgICAgIGNoYWluc19bMF0gPj4gZmlsZXNfWzBdLlNvdXJjZSgpOwotICAgICAgc2Vjb25kX2NvbmZpZy5lbnRyeV9zaXplID0gTkdyYW06OlRvdGFsU2l6ZSgxKTsKLSAgICAgIHNlY29uZC5wdXNoX2JhY2soc2Vjb25kX2NvbmZpZyk7Ci0gICAgICBzZWNvbmQuYmFjaygpID4+IGZpbGVzX1swXS5Tb3VyY2UoKTsKLSAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDE7IGkgPCBjb25maWdfLm9yZGVyOyArK2kpIHsKLSAgICAgICAgdXRpbDo6c2NvcGVkX2ZkIGZkKHNvcnRzW2kgLSAxXS5TdGVhbENvbXBsZXRlZCgpKTsKLSAgICAgICAgY2hhaW5zX1tpXS5TZXRQcm9ncmVzc1RhcmdldCh1dGlsOjpTaXplT3JUaHJvdyhmZC5nZXQoKSkpOwotICAgICAgICBjaGFpbnNfW2ldID4+IHV0aWw6OnN0cmVhbTo6UFJlYWQodXRpbDo6RHVwT3JUaHJvdyhmZC5nZXQoKSksIHRydWUpOwotICAgICAgICBzZWNvbmRfY29uZmlnLmVudHJ5X3NpemUgPSBOR3JhbTo6VG90YWxTaXplKGkgKyAxKTsKLSAgICAgICAgc2Vjb25kLnB1c2hfYmFjayhzZWNvbmRfY29uZmlnKTsKLSAgICAgICAgc2Vjb25kLmJhY2soKSA+PiB1dGlsOjpzdHJlYW06OlBSZWFkKGZkLnJlbGVhc2UoKSwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlcmUgaXMgbm8gc29ydCBhZnRlciB0aGlzLCBzbyBnbyBmb3IgYnJva2Ugb24gbGF6eSBtZXJnaW5nLgotICAgIHRlbXBsYXRlIDxjbGFzcyBDb21wYXJlPiB2b2lkIE1heGltdW1MYXp5SW5wdXQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIFNvcnRzPENvbXBhcmU+ICZzb3J0cykgewotICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIHdlIGNhbiB1c2UgZm9yIGFsbCB0aGUgY2hhaW5zLgotICAgICAgc3RkOjpzaXplX3QgbWluX2NoYWlucyA9IDA7Ci0gICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnXy5vcmRlcjsgKytpKSB7Ci0gICAgICAgIG1pbl9jaGFpbnMgKz0gc3RkOjptaW4oY291bnRzW2ldICogTkdyYW06OlRvdGFsU2l6ZShpICsgMSksIHN0YXRpY19jYXN0PHVpbnQ2NF90Pihjb25maWdfLm1pbmltdW1fYmxvY2spKTsKLSAgICAgIH0KLSAgICAgIHN0ZDo6c2l6ZV90IGZvcl9tZXJnZSA9IG1pbl9jaGFpbnMgPiBjb25maWdfLlRvdGFsTWVtb3J5KCkgPyAwIDogKGNvbmZpZ18uVG90YWxNZW1vcnkoKSAtIG1pbl9jaGFpbnMpOwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IGxhemluZXNzOwotICAgICAgLy8gUHJpb3JpdGl6ZSBsb25nZXIgbi1ncmFtcy4KLSAgICAgIGZvciAodXRpbDo6c3RyZWFtOjpTb3J0PFN1ZmZpeE9yZGVyPiAqaSA9IHNvcnRzLmVuZCgpIC0gMTsgaSA+PSBzb3J0cy5iZWdpbigpOyAtLWkpIHsKLSAgICAgICAgbGF6aW5lc3MucHVzaF9iYWNrKGktPk1lcmdlKGZvcl9tZXJnZSkpOwotICAgICAgICBhc3NlcnQoZm9yX21lcmdlID49IGxhemluZXNzLmJhY2soKSk7Ci0gICAgICAgIGZvcl9tZXJnZSAtPSBsYXppbmVzcy5iYWNrKCk7Ci0gICAgICB9Ci0gICAgICBzdGQ6OnJldmVyc2UobGF6aW5lc3MuYmVnaW4oKSwgbGF6aW5lc3MuZW5kKCkpOwotCi0gICAgICBDcmVhdGVDaGFpbnMoZm9yX21lcmdlICsgbWluX2NoYWlucywgY291bnRzKTsKLSAgICAgIGNoYWluc18uYmFjaygpLkFjdGl2YXRlUHJvZ3Jlc3MoKTsKLSAgICAgIGNoYWluc19bMF0gPj4gZmlsZXNfWzBdLlNvdXJjZSgpOwotICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMTsgaSA8IGNvbmZpZ18ub3JkZXI7ICsraSkgewotICAgICAgICBzb3J0c1tpIC0gMV0uT3V0cHV0KGNoYWluc19baV0sIGxhemluZXNzW2kgLSAxXSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBCdWZmZXJGaW5hbChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cykgewotICAgICAgY2hhaW5zX1swXSA+PiBmaWxlc19bMF0uU2luaygpOwotICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMTsgaSA8IGNvbmZpZ18ub3JkZXI7ICsraSkgewotICAgICAgICBmaWxlc18ucHVzaF9iYWNrKHV0aWw6Ok1ha2VUZW1wKGNvbmZpZ18uVGVtcFByZWZpeCgpKSk7Ci0gICAgICAgIGNoYWluc19baV0gPj4gZmlsZXNfW2ldLlNpbmsoKTsKLSAgICAgIH0KLSAgICAgIGNoYWluc18uV2FpdCh0cnVlKTsKLSAgICAgIC8vIFVzZSBsZXNzIG1lbW9yeS4gIEJlY2F1c2Ugd2UgY2FuLgotICAgICAgQ3JlYXRlQ2hhaW5zKHN0ZDo6bWluKGNvbmZpZ18uc29ydC5idWZmZXJfc2l6ZSAqIGNvbmZpZ18ub3JkZXIsIGNvbmZpZ18uVG90YWxNZW1vcnkoKSksIGNvdW50cyk7Ci0gICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnXy5vcmRlcjsgKytpKSB7Ci0gICAgICAgIGNoYWluc19baV0gPj4gZmlsZXNfW2ldLlNvdXJjZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIHRlbXBsYXRlIDxjbGFzcyBDb21wYXJlPiB2b2lkIFNldHVwU29ydHMoU29ydHM8Q29tcGFyZT4gJnNvcnRzKSB7Ci0gICAgICBzb3J0cy5Jbml0KGNvbmZpZ18ub3JkZXIgLSAxKTsKLSAgICAgIC8vIFVuaWdyYW1zIGRvbid0IGdldCBzb3J0ZWQgYmVjYXVzZSB0aGVpciBvcmRlciBpcyBhbHdheXMgdGhlIHNhbWUuCi0gICAgICBjaGFpbnNfWzBdID4+IGZpbGVzX1swXS5TaW5rKCk7Ci0gICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDwgY29uZmlnXy5vcmRlcjsgKytpKSB7Ci0gICAgICAgIHNvcnRzLnB1c2hfYmFjayhjaGFpbnNfW2ldLCBjb25maWdfLnNvcnQsIENvbXBhcmUoaSArIDEpKTsKLSAgICAgIH0KLSAgICAgIGNoYWluc18uV2FpdCh0cnVlKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICAvLyBDcmVhdGUgY2hhaW5zLCBhbGxvY2F0aW5nIG1lbW9yeSB0byB0aGVtLiAgVG90YWxseSBoZXVyaXN0aWMuICBDb3VudAotICAgIC8vIGJvdW5kcyBhcmUgdXBwZXIgYm91bmRzIG9uIHRoZSBjb3VudHMgb3Igbm90IHByZXNlbnQuCi0gICAgdm9pZCBDcmVhdGVDaGFpbnMoc3RkOjpzaXplX3QgcmVtYWluaW5nX21lbSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudF9ib3VuZHMpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiBhc3NpZ25tZW50czsKLSAgICAgIGFzc2lnbm1lbnRzLnJlc2VydmUoY29uZmlnXy5vcmRlcik7Ci0gICAgICAvLyBTdGFydCBieSBhc3NpZ25pbmcgbWF4aW11bSBtZW1vcnkgdXNhZ2UgKHRvIGJlIHJlZmluZWQgbGF0ZXIpLgotICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGNvdW50X2JvdW5kcy5zaXplKCk7ICsraSkgewotICAgICAgICBhc3NpZ25tZW50cy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHN0ZDo6bWluKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlbWFpbmluZ19tZW0pLAotICAgICAgICAgICAgY291bnRfYm91bmRzW2ldICogc3RhdGljX2Nhc3Q8dWludDY0X3Q+KE5HcmFtOjpUb3RhbFNpemUoaSArIDEpKSkpKTsKLSAgICAgIH0KLSAgICAgIGFzc2lnbm1lbnRzLnJlc2l6ZShjb25maWdfLm9yZGVyLCByZW1haW5pbmdfbWVtKTsKLQotICAgICAgLy8gTm93IHdlIGtub3cgaG93IG11Y2ggbWVtb3J5IGV2ZXJ5Ym9keSB3YW50cy4gIEhvdyBtdWNoIHdpbGwgdGhleSBnZXQ/Ci0gICAgICAvLyBQcm9wb3J0aW9uYWwgdG8gdGhpcy4KLSAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBwb3J0aW9uczsKLSAgICAgIC8vIEluZGljZXMgb2Ygb3JkZXJzIHRoYXQgaGF2ZSB5ZXQgdG8gYmUgYXNzaWduZWQuCi0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gdW5hc3NpZ25lZDsKLSAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBjb25maWdfLm9yZGVyOyArK2kpIHsKLSAgICAgICAgcG9ydGlvbnMucHVzaF9iYWNrKHN0YXRpY19jYXN0PGZsb2F0PigoaSsxKSAqIE5HcmFtOjpUb3RhbFNpemUoaSsxKSkpOwotICAgICAgICB1bmFzc2lnbmVkLnB1c2hfYmFjayhpKTsKLSAgICAgIH0KLSAgICAgIC8qSWYgc29tZWJvZHkgZG9lc24ndCBlYXQgdGhlaXIgZnVsbCBkaW5uZXIsIGdpdmUgaXQgdG8gdGhlIHJlc3Qgb2YgdGhlCi0gICAgICAgKiBmYW1pbHkuICBUaGVuIHNvbWVib2R5IGVsc2UgbWlnaHQgbm90IGVhdCB0aGVpciBmdWxsIGRpbm5lciBldGMuICBFbmRzCi0gICAgICAgKiB3aGVuIGV2ZXJ5Ym9keSB1bmFzc2lnbmVkIGlzIGh1bmdyeS4KLSAgICAgICAqLwotICAgICAgZmxvYXQgc3VtOwotICAgICAgYm9vbCBmb3VuZF9tb3JlOwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IGJsb2NrX2NvdW50KGNvbmZpZ18ub3JkZXIpOwotICAgICAgZG8gewotICAgICAgICBzdW0gPSAwLjA7Ci0gICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB1bmFzc2lnbmVkLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgc3VtICs9IHBvcnRpb25zW3VuYXNzaWduZWRbaV1dOwotICAgICAgICB9Ci0gICAgICAgIGZvdW5kX21vcmUgPSBmYWxzZTsKLSAgICAgICAgLy8gSWYgdGhlIHByb3BvcnRpb25hbCBhc3NpZ25tZW50IGlzIG1vcmUgdGhhbiBuZWVkZWQsIGdpdmUgaXQganVzdCB3aGF0IGl0IG5lZWRzLgotICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90Pjo6aXRlcmF0b3IgaSA9IHVuYXNzaWduZWQuYmVnaW4oKTsgaSAhPSB1bmFzc2lnbmVkLmVuZCgpOykgewotICAgICAgICAgIGlmIChhc3NpZ25tZW50c1sqaV0gPD0gcmVtYWluaW5nX21lbSAqIChwb3J0aW9uc1sqaV0gLyBzdW0pKSB7Ci0gICAgICAgICAgICByZW1haW5pbmdfbWVtIC09IGFzc2lnbm1lbnRzWyppXTsKLSAgICAgICAgICAgIGJsb2NrX2NvdW50WyppXSA9IDE7Ci0gICAgICAgICAgICBpID0gdW5hc3NpZ25lZC5lcmFzZShpKTsKLSAgICAgICAgICAgIGZvdW5kX21vcmUgPSB0cnVlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IHdoaWxlIChmb3VuZF9tb3JlKTsKLSAgICAgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+OjppdGVyYXRvciBpID0gdW5hc3NpZ25lZC5iZWdpbigpOyBpICE9IHVuYXNzaWduZWQuZW5kKCk7ICsraSkgewotICAgICAgICBhc3NpZ25tZW50c1sqaV0gPSByZW1haW5pbmdfbWVtICogKHBvcnRpb25zWyppXSAvIHN1bSk7Ci0gICAgICAgIGJsb2NrX2NvdW50WyppXSA9IGNvbmZpZ18uYmxvY2tfY291bnQ7Ci0gICAgICB9Ci0gICAgICBjaGFpbnNfLmNsZWFyKCk7Ci0gICAgICBzdGQ6OmNlcnIgPDwgIkNoYWluIHNpemVzOiI7Ci0gICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnXy5vcmRlcjsgKytpKSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCAnICcgPDwgKGkrMSkgPDwgIjoiIDw8IGFzc2lnbm1lbnRzW2ldOwotICAgICAgICBjaGFpbnNfLnB1c2hfYmFjayh1dGlsOjpzdHJlYW06OkNoYWluQ29uZmlnKE5HcmFtOjpUb3RhbFNpemUoaSArIDEpLCBibG9ja19jb3VudFtpXSwgYXNzaWdubWVudHNbaV0pKTsKLSAgICAgIH0KLSAgICAgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotCi0gICAgUGlwZWxpbmVDb25maWcgJmNvbmZpZ187Ci0KLSAgICB1dGlsOjpzdHJlYW06OkNoYWlucyBjaGFpbnNfOwotICAgIC8vIE9mdGVuIG9ubHkgdW5pZ3JhbXMsIGJ1dCBzb21ldGltZXMgYWxsIG9yZGVycy4gIAotICAgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpGaWxlQnVmZmVyPiBmaWxlc187Ci19OwotCi12b2lkIENvdW50VGV4dChpbnQgdGV4dF9maWxlIC8qIGlucHV0ICovLCBpbnQgdm9jYWJfZmlsZSAvKiBvdXRwdXQgKi8sIE1hc3RlciAmbWFzdGVyLCB1aW50NjRfdCAmdG9rZW5fY291bnQsIHN0ZDo6c3RyaW5nICZ0ZXh0X2ZpbGVfbmFtZSwgc3RkOjp2ZWN0b3I8Ym9vbD4gJnBydW5lX3dvcmRzKSB7Ci0gIGNvbnN0IFBpcGVsaW5lQ29uZmlnICZjb25maWcgPSBtYXN0ZXIuQ29uZmlnKCk7Ci0gIHN0ZDo6Y2VyciA8PCAiPT09IDEvNSBDb3VudGluZyBhbmQgc29ydGluZyBuLWdyYW1zID09PSIgPDwgc3RkOjplbmRsOwotCi0gIGNvbnN0IHN0ZDo6c2l6ZV90IHZvY2FiX3VzYWdlID0gQ29ycHVzQ291bnQ6OlZvY2FiVXNhZ2UoY29uZmlnLnZvY2FiX2VzdGltYXRlKTsKLSAgVVRJTF9USFJPV19JRihjb25maWcuVG90YWxNZW1vcnkoKSA8IHZvY2FiX3VzYWdlLCB1dGlsOjpFeGNlcHRpb24sICJWb2NhYiBoYXNoIHNpemUgZXN0aW1hdGUgIiA8PCB2b2NhYl91c2FnZSA8PCAiIGV4Y2VlZHMgdG90YWwgbWVtb3J5ICIgPDwgY29uZmlnLlRvdGFsTWVtb3J5KCkpOwotICBzdGQ6OnNpemVfdCBtZW1vcnlfZm9yX2NoYWluID0gCi0gICAgLy8gVGhpcyBtdWNoIG1lbW9yeSB0byB3b3JrIHdpdGggYWZ0ZXIgdm9jYWIgaGFzaCB0YWJsZS4KLSAgICBzdGF0aWNfY2FzdDxmbG9hdD4oY29uZmlnLlRvdGFsTWVtb3J5KCkgLSB2b2NhYl91c2FnZSkgLwotICAgIC8vIFNvbHZlIGZvciBibG9jayBzaXplIGluY2x1ZGluZyB0aGUgZGVkdXBlIG11bHRpcGxpZXIgZm9yIG9uZSBibG9jay4KLSAgICAoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbmZpZy5ibG9ja19jb3VudCkgKyBDb3JwdXNDb3VudDo6RGVkdXBlTXVsdGlwbGllcihjb25maWcub3JkZXIpKSAqCi0gICAgLy8gQ2hhaW4gbGlrZXMgbWVtb3J5IGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiB0b3RhbCBtZW1vcnkuCi0gICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbmZpZy5ibG9ja19jb3VudCk7Ci0gIHV0aWw6OnN0cmVhbTo6Q2hhaW4gY2hhaW4odXRpbDo6c3RyZWFtOjpDaGFpbkNvbmZpZyhOR3JhbTo6VG90YWxTaXplKGNvbmZpZy5vcmRlciksIGNvbmZpZy5ibG9ja19jb3VudCwgbWVtb3J5X2Zvcl9jaGFpbikpOwotCi0gIFdvcmRJbmRleCB0eXBlX2NvdW50ID0gY29uZmlnLnZvY2FiX2VzdGltYXRlOwotICB1dGlsOjpGaWxlUGllY2UgdGV4dCh0ZXh0X2ZpbGUsIE5VTEwsICZzdGQ6OmNlcnIpOwotICB0ZXh0X2ZpbGVfbmFtZSA9IHRleHQuRmlsZU5hbWUoKTsKLSAgQ29ycHVzQ291bnQgY291bnRlcih0ZXh0LCB2b2NhYl9maWxlLCB0b2tlbl9jb3VudCwgdHlwZV9jb3VudCwgcHJ1bmVfd29yZHMsIGNvbmZpZy5wcnVuZV92b2NhYl9maWxlLCBjaGFpbi5CbG9ja1NpemUoKSAvIGNoYWluLkVudHJ5U2l6ZSgpLCBjb25maWcuZGlzYWxsb3dlZF9zeW1ib2xfYWN0aW9uKTsKLSAgY2hhaW4gPj4gYm9vc3Q6OnJlZihjb3VudGVyKTsKLQotICB1dGlsOjpzdHJlYW06OlNvcnQ8U3VmZml4T3JkZXIsIEFkZENvbWJpbmVyPiBzb3J0ZXIoY2hhaW4sIGNvbmZpZy5zb3J0LCBTdWZmaXhPcmRlcihjb25maWcub3JkZXIpLCBBZGRDb21iaW5lcigpKTsKLSAgY2hhaW4uV2FpdCh0cnVlKTsKLSAgc3RkOjpjZXJyIDw8ICJVbmlncmFtIHRva2VucyAiIDw8IHRva2VuX2NvdW50IDw8ICIgdHlwZXMgIiA8PCB0eXBlX2NvdW50IDw8IHN0ZDo6ZW5kbDsKLSAgc3RkOjpjZXJyIDw8ICI9PT0gMi81IENhbGN1bGF0aW5nIGFuZCBzb3J0aW5nIGFkanVzdGVkIGNvdW50cyA9PT0iIDw8IHN0ZDo6ZW5kbDsKLSAgbWFzdGVyLkluaXRGb3JBZGp1c3Qoc29ydGVyLCB0eXBlX2NvdW50KTsKLX0KLQotdm9pZCBJbml0aWFsUHJvYmFiaWxpdGllcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHNfcHJ1bmVkLCBjb25zdCBzdGQ6OnZlY3RvcjxEaXNjb3VudD4gJmRpc2NvdW50cywgTWFzdGVyICZtYXN0ZXIsIFNvcnRzPFN1ZmZpeE9yZGVyPiAmcHJpbWFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkZpbGVCdWZmZXI+ICZnYW1tYXMsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmcHJ1bmVfdGhyZXNob2xkcywgYm9vbCBwcnVuZV92b2NhYikgewotICBjb25zdCBQaXBlbGluZUNvbmZpZyAmY29uZmlnID0gbWFzdGVyLkNvbmZpZygpOwotICB1dGlsOjpzdHJlYW06OkNoYWlucyBzZWNvbmQoY29uZmlnLm9yZGVyKTsKLQotICB7Ci0gICAgU29ydHM8Q29udGV4dE9yZGVyPiBzb3J0czsKLSAgICBtYXN0ZXIuU2V0dXBTb3J0cyhzb3J0cyk7Ci0gICAgUHJpbnRTdGF0aXN0aWNzKGNvdW50cywgY291bnRzX3BydW5lZCwgZGlzY291bnRzKTsKLSAgICBsbTo6bmdyYW06OlNob3dTaXplcyhjb3VudHNfcHJ1bmVkKTsKLSAgICBzdGQ6OmNlcnIgPDwgIj09PSAzLzUgQ2FsY3VsYXRpbmcgYW5kIHNvcnRpbmcgaW5pdGlhbCBwcm9iYWJpbGl0aWVzID09PSIgPDwgc3RkOjplbmRsOwotICAgIG1hc3Rlci5Tb3J0QW5kUmVhZFR3aWNlKGNvdW50c19wcnVuZWQsIHNvcnRzLCBzZWNvbmQsIGNvbmZpZy5pbml0aWFsX3Byb2JzLmFkZGVyX2luKTsKLSAgfQotCi0gIHV0aWw6OnN0cmVhbTo6Q2hhaW5zIGdhbW1hX2NoYWlucyhjb25maWcub3JkZXIpOwotICBJbml0aWFsUHJvYmFiaWxpdGllcyhjb25maWcuaW5pdGlhbF9wcm9icywgZGlzY291bnRzLCBtYXN0ZXIuTXV0YWJsZUNoYWlucygpLCBzZWNvbmQsIGdhbW1hX2NoYWlucywgcHJ1bmVfdGhyZXNob2xkcywgcHJ1bmVfdm9jYWIpOwotICAvLyBEb24ndCBjYXJlIGFib3V0IGdhbW1hIGZvciAwLiAgCi0gIGdhbW1hX2NoYWluc1swXSA+PiB1dGlsOjpzdHJlYW06OmtSZWN5Y2xlOwotICBnYW1tYXMuSW5pdChjb25maWcub3JkZXIgLSAxKTsKLSAgZm9yIChzdGQ6OnNpemVfdCBpID0gMTsgaSA8IGNvbmZpZy5vcmRlcjsgKytpKSB7Ci0gICAgZ2FtbWFzLnB1c2hfYmFjayh1dGlsOjpNYWtlVGVtcChjb25maWcuVGVtcFByZWZpeCgpKSk7Ci0gICAgZ2FtbWFfY2hhaW5zW2ldID4+IGdhbW1hc1tpIC0gMV0uU2luaygpOwotICB9Ci0gIC8vIEhhcyB0byBiZSBkb25lIGhlcmUgZHVlIHRvIGdhbW1hX2NoYWlucyBzY29wZS4KLSAgbWFzdGVyLlNldHVwU29ydHMocHJpbWFyeSk7Ci19Ci0KLXZvaWQgSW50ZXJwb2xhdGVQcm9iYWJpbGl0aWVzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzLCBNYXN0ZXIgJm1hc3RlciwgU29ydHM8U3VmZml4T3JkZXI+ICZwcmltYXJ5LCB1dGlsOjpGaXhlZEFycmF5PHV0aWw6OnN0cmVhbTo6RmlsZUJ1ZmZlcj4gJmdhbW1hcykgewotICBzdGQ6OmNlcnIgPDwgIj09PSA0LzUgQ2FsY3VsYXRpbmcgYW5kIHdyaXRpbmcgb3JkZXItaW50ZXJwb2xhdGVkIHByb2JhYmlsaXRpZXMgPT09IiA8PCBzdGQ6OmVuZGw7Ci0gIGNvbnN0IFBpcGVsaW5lQ29uZmlnICZjb25maWcgPSBtYXN0ZXIuQ29uZmlnKCk7Ci0gIG1hc3Rlci5NYXhpbXVtTGF6eUlucHV0KGNvdW50cywgcHJpbWFyeSk7Ci0KLSAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgZ2FtbWFfY2hhaW5zKGNvbmZpZy5vcmRlciAtIDEpOwotICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLm9yZGVyIC0gMTsgKytpKSB7Ci0gICAgdXRpbDo6c3RyZWFtOjpDaGFpbkNvbmZpZyByZWFkX2JhY2tvZmZzKGNvbmZpZy5yZWFkX2JhY2tvZmZzKTsKLQotICAgIGlmKGNvbmZpZy5wcnVuZV92b2NhYiB8fCBjb25maWcucHJ1bmVfdGhyZXNob2xkc1tpICsgMV0gPiAwKQotICAgICAgICByZWFkX2JhY2tvZmZzLmVudHJ5X3NpemUgPSBzaXplb2YoSGFzaEdhbW1hKTsKLSAgICBlbHNlCi0gICAgICAgIHJlYWRfYmFja29mZnMuZW50cnlfc2l6ZSA9IHNpemVvZihmbG9hdCk7Ci0KLSAgICBnYW1tYV9jaGFpbnMucHVzaF9iYWNrKHJlYWRfYmFja29mZnMpOwotICAgIGdhbW1hX2NoYWlucy5iYWNrKCkgPj4gZ2FtbWFzW2ldLlNvdXJjZSgpOwotICB9Ci0gIG1hc3RlciA+PiBJbnRlcnBvbGF0ZShzdGQ6Om1heChtYXN0ZXIuQ29uZmlnKCkudm9jYWJfc2l6ZV9mb3JfdW5rLCBjb3VudHNbMF0gLSAxIC8qIDxzPiBpcyBub3QgaW5jbHVkZWQgKi8pLCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zKGdhbW1hX2NoYWlucyksIGNvbmZpZy5wcnVuZV90aHJlc2hvbGRzLCBjb25maWcucHJ1bmVfdm9jYWIsIGNvbmZpZy5vdXRwdXRfcSk7Ci0gIGdhbW1hX2NoYWlucyA+PiB1dGlsOjpzdHJlYW06OmtSZWN5Y2xlOwotICBtYXN0ZXIuQnVmZmVyRmluYWwoY291bnRzKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UKLQotdm9pZCBQaXBlbGluZShQaXBlbGluZUNvbmZpZyAmY29uZmlnLCBpbnQgdGV4dF9maWxlLCBPdXRwdXQgJm91dHB1dCkgewotICAvLyBTb21lIGZhaWwtZmFzdCBzYW5pdHkgY2hlY2tzLgotICBpZiAoY29uZmlnLnNvcnQuYnVmZmVyX3NpemUgKiA0ID4gY29uZmlnLlRvdGFsTWVtb3J5KCkpIHsKLSAgICBjb25maWcuc29ydC5idWZmZXJfc2l6ZSA9IGNvbmZpZy5Ub3RhbE1lbW9yeSgpIC8gNDsKLSAgICBzdGQ6OmNlcnIgPDwgIldhcm5pbmc6IGNoYW5naW5nIHNvcnQgYmxvY2sgc2l6ZSB0byAiIDw8IGNvbmZpZy5zb3J0LmJ1ZmZlcl9zaXplIDw8ICIgYnl0ZXMgZHVlIHRvIGxvdyB0b3RhbCBtZW1vcnkuIiA8PCBzdGQ6OmVuZGw7Ci0gIH0KLSAgaWYgKGNvbmZpZy5taW5pbXVtX2Jsb2NrIDwgTkdyYW06OlRvdGFsU2l6ZShjb25maWcub3JkZXIpKSB7Ci0gICAgY29uZmlnLm1pbmltdW1fYmxvY2sgPSBOR3JhbTo6VG90YWxTaXplKGNvbmZpZy5vcmRlcik7Ci0gICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nOiByYWlzaW5nIG1pbmltdW0gYmxvY2sgdG8gIiA8PCBjb25maWcubWluaW11bV9ibG9jayA8PCAiIHRvIGZpdCBhbiBuZ3JhbSBpbiBldmVyeSBibG9jay4iIDw8IHN0ZDo6ZW5kbDsKLSAgfQotICBVVElMX1RIUk9XX0lGKGNvbmZpZy5zb3J0LmJ1ZmZlcl9zaXplIDwgY29uZmlnLm1pbmltdW1fYmxvY2ssIHV0aWw6OkV4Y2VwdGlvbiwgIlNvcnQgYmxvY2sgc2l6ZSAiIDw8IGNvbmZpZy5zb3J0LmJ1ZmZlcl9zaXplIDw8ICIgaXMgYmVsb3cgdGhlIG1pbmltdW0gYmxvY2sgc2l6ZSAiIDw8IGNvbmZpZy5taW5pbXVtX2Jsb2NrIDw8ICIuIik7Ci0gIFVUSUxfVEhST1dfSUYoY29uZmlnLlRvdGFsTWVtb3J5KCkgPCBjb25maWcubWluaW11bV9ibG9jayAqIGNvbmZpZy5vcmRlciAqIGNvbmZpZy5ibG9ja19jb3VudCwgdXRpbDo6RXhjZXB0aW9uLAotICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGZpdCAiIDw8IChjb25maWcub3JkZXIgKiBjb25maWcuYmxvY2tfY291bnQpIDw8ICIgYmxvY2tzIHdpdGggbWluaW11bSBzaXplICIgPDwgY29uZmlnLm1pbmltdW1fYmxvY2sgPDwgIi4gIEluY3JlYXNlIG1lbW9yeSB0byAiIDw8IChjb25maWcubWluaW11bV9ibG9jayAqIGNvbmZpZy5vcmRlciAqIGNvbmZpZy5ibG9ja19jb3VudCkgPDwgIiBieXRlcyBvciBkZWNyZWFzZSB0aGUgbWluaW11bSBibG9jayBzaXplLiIpOwotCi0gIFVUSUxfVElNRVIoIigldyBzKSBUb3RhbCB3YWxsIHRpbWUgZWxhcHNlZFxuIik7Ci0KLSAgTWFzdGVyIG1hc3Rlcihjb25maWcpOwotICAvLyBtYXN0ZXIncyBkZXN0cnVjdG9yIHdpbGwgd2FpdCBmb3IgY2hhaW5zLiAgQnV0IHRoZXkgbWlnaHQgYmUgZGVhZGxvY2tlZCBpZgotICAvLyB0aGlzIHRocmVhZCBkaWVzIGJlY2F1c2UgZS5nLiBpdCByYW4gb3V0IG9mIG1lbW9yeS4KLSAgdHJ5IHsKLSAgICB1dGlsOjpzY29wZWRfZmQgdm9jYWJfZmlsZShjb25maWcudm9jYWJfZmlsZS5lbXB0eSgpID8gCi0gICAgICAgIHV0aWw6Ok1ha2VUZW1wKGNvbmZpZy5UZW1wUHJlZml4KCkpIDogCi0gICAgICAgIHV0aWw6OkNyZWF0ZU9yVGhyb3coY29uZmlnLnZvY2FiX2ZpbGUuY19zdHIoKSkpOwotICAgIG91dHB1dC5TZXRWb2NhYkZEKHZvY2FiX2ZpbGUuZ2V0KCkpOwotICAgIHVpbnQ2NF90IHRva2VuX2NvdW50OwotICAgIHN0ZDo6c3RyaW5nIHRleHRfZmlsZV9uYW1lOwotICAgIAotICAgIHN0ZDo6dmVjdG9yPGJvb2w+IHBydW5lX3dvcmRzOwotICAgIENvdW50VGV4dCh0ZXh0X2ZpbGUsIHZvY2FiX2ZpbGUuZ2V0KCksIG1hc3RlciwgdG9rZW5fY291bnQsIHRleHRfZmlsZV9uYW1lLCBwcnVuZV93b3Jkcyk7Ci0gICAgCi0gICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGNvdW50czsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRzX3BydW5lZDsKLSAgICBzdGQ6OnZlY3RvcjxEaXNjb3VudD4gZGlzY291bnRzOwotICAgIG1hc3RlciA+PiBBZGp1c3RDb3VudHMoY29uZmlnLnBydW5lX3RocmVzaG9sZHMsIGNvdW50cywgY291bnRzX3BydW5lZCwgcHJ1bmVfd29yZHMsIGNvbmZpZy5kaXNjb3VudCwgZGlzY291bnRzKTsKLQotICAgIHsKLSAgICAgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpGaWxlQnVmZmVyPiBnYW1tYXM7Ci0gICAgICBTb3J0czxTdWZmaXhPcmRlcj4gcHJpbWFyeTsKLSAgICAgIEluaXRpYWxQcm9iYWJpbGl0aWVzKGNvdW50cywgY291bnRzX3BydW5lZCwgZGlzY291bnRzLCBtYXN0ZXIsIHByaW1hcnksIGdhbW1hcywgY29uZmlnLnBydW5lX3RocmVzaG9sZHMsIGNvbmZpZy5wcnVuZV92b2NhYik7Ci0gICAgICBJbnRlcnBvbGF0ZVByb2JhYmlsaXRpZXMoY291bnRzX3BydW5lZCwgbWFzdGVyLCBwcmltYXJ5LCBnYW1tYXMpOwotICAgIH0KLQotICAgIHN0ZDo6Y2VyciA8PCAiPT09IDUvNSBXcml0aW5nIEFSUEEgbW9kZWwgPT09IiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBvdXRwdXQuU2V0SGVhZGVyKEhlYWRlckluZm8odGV4dF9maWxlX25hbWUsIHRva2VuX2NvdW50LCBjb3VudHNfcHJ1bmVkKSk7Ci0gICAgb3V0cHV0LkFwcGx5KFBST0JfU0VRVUVOVElBTF9IT09LLCBtYXN0ZXIuTXV0YWJsZUNoYWlucygpKTsKLSAgICBtYXN0ZXIgPj4gdXRpbDo6c3RyZWFtOjprUmVjeWNsZTsKLSAgICBtYXN0ZXIuTXV0YWJsZUNoYWlucygpLldhaXQodHJ1ZSk7Ci0gIH0gY2F0Y2ggKGNvbnN0IHV0aWw6OkV4Y2VwdGlvbiAmZSkgewotICAgIHN0ZDo6Y2VyciA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgYWJvcnQoKTsKLSAgfQotfQotCi19fSAvLyBuYW1lc3BhY2VzCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9waXBlbGluZS5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL3BpcGVsaW5lLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjRkODIxLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL3BpcGVsaW5lLmhoCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotI2lmbmRlZiBMTV9CVUlMREVSX1BJUEVMSU5FX0gKLSNkZWZpbmUgTE1fQlVJTERFUl9QSVBFTElORV9ICi0KLSNpbmNsdWRlICJsbS9idWlsZGVyL2FkanVzdF9jb3VudHMuaGgiCi0jaW5jbHVkZSAibG0vYnVpbGRlci9pbml0aWFsX3Byb2JhYmlsaXRpZXMuaGgiCi0jaW5jbHVkZSAibG0vYnVpbGRlci9oZWFkZXJfaW5mby5oaCIKLSNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAibG0vd29yZF9pbmRleC5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9jb25maWcuaGgiCi0jaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0KLW5hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBidWlsZGVyIHsKLQotY2xhc3MgT3V0cHV0OwotCi1zdHJ1Y3QgUGlwZWxpbmVDb25maWcgewotICBzdGQ6OnNpemVfdCBvcmRlcjsKLSAgc3RkOjpzdHJpbmcgdm9jYWJfZmlsZTsKLSAgdXRpbDo6c3RyZWFtOjpTb3J0Q29uZmlnIHNvcnQ7Ci0gIEluaXRpYWxQcm9iYWJpbGl0aWVzQ29uZmlnIGluaXRpYWxfcHJvYnM7Ci0gIHV0aWw6OnN0cmVhbTo6Q2hhaW5Db25maWcgcmVhZF9iYWNrb2ZmczsKLQotICAvLyBFc3RpbWF0ZWQgdm9jYWJ1bGFyeSBzaXplLiAgVXNlZCBmb3Igc2l6aW5nIENvcnB1c0NvdW50IG1lbW9yeSBhbmQKLSAgLy8gaW5pdGlhbCBwcm9iaW5nIGhhc2ggdGFibGUgc2l6aW5nLCBhbHNvIGluIENvcnB1c0NvdW50LgotICBsbTo6V29yZEluZGV4IHZvY2FiX2VzdGltYXRlOwotCi0gIC8vIE1pbmltdW0gYmxvY2sgc2l6ZSB0byB0b2xlcmF0ZS4KLSAgc3RkOjpzaXplX3QgbWluaW11bV9ibG9jazsKLQotICAvLyBOdW1iZXIgb2YgYmxvY2tzIHRvIHVzZS4gIFRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHRvIDEgaWYgZXZlcnl0aGluZyBmaXRzLgotICBzdGQ6OnNpemVfdCBibG9ja19jb3VudDsKLQotICAvLyBuLWdyYW0gY291bnQgdGhyZXNob2xkcyBmb3IgcHJ1bmluZy4gMCB2YWx1ZXMgbWVhbnMgbm8gcHJ1bmluZyBmb3IKLSAgLy8gY29ycmVzcG9uZGluZyBuLWdyYW0gb3JkZXIKLSAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IHBydW5lX3RocmVzaG9sZHM7IC8vbWpkCi0gIGJvb2wgcHJ1bmVfdm9jYWI7Ci0gIHN0ZDo6c3RyaW5nIHBydW5lX3ZvY2FiX2ZpbGU7Ci0KLSAgLy8gV2hhdCB0byBkbyB3aXRoIGRpc2NvdW50IGZhaWx1cmVzLgotICBEaXNjb3VudENvbmZpZyBkaXNjb3VudDsKLQotICAvLyBDb21wdXRlIGNvbGxhcHNlZCBxIHZhbHVlcyBpbnN0ZWFkIG9mIHByb2JhYmlsaXR5IGFuZCBiYWNrb2ZmCi0gIGJvb2wgb3V0cHV0X3E7Ci0gIAotICAvKiBDb21wdXRpbmcgdGhlIHBlcnBsZXhpdHkgb2YgTE1zIHdpdGggZGlmZmVyZW50IHZvY2FidWxhcmllcyBpcyBoYXJkLiAgRm9yCi0gICAqIGV4YW1wbGUsIHRoZSBsb3dlc3QgcGVycGxleGl0eSBpcyBhdHRhaW5lZCBieSBhIHVuaWdyYW0gbW9kZWwgdGhhdAotICAgKiBwcmVkaWN0cyBwKDx1bms+KSA9IDEgYW5kIGhhcyBubyBvdGhlciB2b2NhYnVsYXJ5LiAgQWxzbywgbGluZWFybHkKLSAgICogaW50ZXJwb2xhdGVkIG1vZGVscyB3aWxsIHN1bSB0byBtb3JlIHRoYW4gMSBiZWNhdXNlIDx1bms+IGlzIGR1cGxpY2F0ZWQKLSAgICogKFNSSSBqdXN0IHByZXRlbmRzIHAoPHVuaz4pID0gMCBmb3IgdGhlc2UgcHVycG9zZXMsIHdoaWNoIG1ha2VzIGl0IHN1bSB0bwotICAgKiAxIGJ1dCBjb21lcyB3aXRoIGl0cyBvd24gcHJvYmxlbXMpLiAgVGhpcyBvcHRpb24gd2lsbCBtYWtlIHRoZSB2b2NhYnVsYXJ5Ci0gICAqIGEgcGFydGljdWxhciBzaXplIGJ5IHJlcGxpY2F0aW5nIDx1bms+IG11bHRpcGxlIHRpbWVzIGZvciBwdXJwb3NlcyBvZgotICAgKiBjb21wdXRpbmcgdm9jYWJ1bGFyeSBzaXplLiAgSXQgaGFzIG5vIGVmZmVjdCBpZiB0aGUgYWN0dWFsIHZvY2FidWxhcnkgaXMKLSAgICogbGFyZ2VyLiAgVGhpcyBwYXJhbWV0ZXIgc2VydmVzIHRoZSBzYW1lIHB1cnBvc2UgYXMgSVJTVExNJ3MgImR1YiIuCi0gICAqLwotICB1aW50NjRfdCB2b2NhYl9zaXplX2Zvcl91bms7Ci0KLSAgLyogV2hhdCB0byBkbyB0aGUgZmlyc3QgdGltZSA8cz4sIDwvcz4sIG9yIDx1bms+IGFwcGVhcnMgaW4gdGhlIGlucHV0LiAgSWYKLSAgICogdGhpcyBpcyBhbnl0aGluZyBidXQgVEhST1dfVVAsIHRoZW4gdGhlIHN5bWJvbCB3aWxsIGFsd2F5cyBiZSB0cmVhdGVkIGFzCi0gICAqIHdoaXRlc3BhY2UuCi0gICAqLwotICBXYXJuaW5nQWN0aW9uIGRpc2FsbG93ZWRfc3ltYm9sX2FjdGlvbjsKLQotICBjb25zdCBzdGQ6OnN0cmluZyAmVGVtcFByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIHNvcnQudGVtcF9wcmVmaXg7IH0KLSAgc3RkOjpzaXplX3QgVG90YWxNZW1vcnkoKSBjb25zdCB7IHJldHVybiBzb3J0LnRvdGFsX21lbW9yeTsgfQotfTsKLQotLy8gVGFrZXMgb3duZXJzaGlwIG9mIHRleHRfZmlsZSBhbmQgb3V0X2FycGEuCi12b2lkIFBpcGVsaW5lKFBpcGVsaW5lQ29uZmlnICZjb25maWcsIGludCB0ZXh0X2ZpbGUsIE91dHB1dCAmb3V0cHV0KTsKLQotfX0gLy8gbmFtZXNwYWNlcwotI2VuZGlmIC8vIExNX0JVSUxERVJfUElQRUxJTkVfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvcHJpbnQuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9wcmludC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5NDgzMy4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9wcmludC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSNpbmNsdWRlICJsbS9idWlsZGVyL3ByaW50LmhoIgotCi0jaW5jbHVkZSAidXRpbC9mYWtlX29mc3RyZWFtLmhoIgotI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKLSNpbmNsdWRlICJ1dGlsL21tYXAuaGgiCi0jaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCi0jaW5jbHVkZSAidXRpbC9zdHJlYW0vdGltZXIuaGgiCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBidWlsZGVyIHsKLQotVm9jYWJSZWNvbnN0aXR1dGU6OlZvY2FiUmVjb25zdGl0dXRlKGludCBmZCkgewotICB1aW50NjRfdCBzaXplID0gdXRpbDo6U2l6ZU9yVGhyb3coZmQpOwotICB1dGlsOjpNYXBSZWFkKHV0aWw6OlBPUFVMQVRFX09SX1JFQUQsIGZkLCAwLCBzaXplLCBtZW1vcnlfKTsKLSAgY29uc3QgY2hhciAqY29uc3Qgc3RhcnQgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4obWVtb3J5Xy5nZXQoKSk7Ci0gIGNvbnN0IGNoYXIgKmk7Ci0gIGZvciAoaSA9IHN0YXJ0OyBpICE9IHN0YXJ0ICsgc2l6ZTsgaSArPSBzdHJsZW4oaSkgKyAxKSB7Ci0gICAgbWFwXy5wdXNoX2JhY2soaSk7Ci0gIH0KLSAgLy8gTGFzdCBvbmUgZm9yIExvb2t1cFBpZWNlLgotICBtYXBfLnB1c2hfYmFjayhpKTsKLX0KLQotdm9pZCBQcmludEFSUEE6OlJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zICZwb3NpdGlvbnMpIHsKLSAgVm9jYWJSZWNvbnN0aXR1dGUgdm9jYWIoR2V0Vm9jYWJGRCgpKTsKLQotICAvLyBXcml0ZSBoZWFkZXIuICBUT0RPOiBpbnRlZ2VycyBpbiBGYWtlT0ZTdHJlYW0uCi0gIHsKLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07Ci0gICAgaWYgKHZlcmJvc2VfaGVhZGVyXykgewotICAgICAgc3RyZWFtIDw8ICIjIElucHV0IGZpbGU6ICIgPDwgR2V0SGVhZGVyKCkuaW5wdXRfZmlsZSA8PCAnXG4nOwotICAgICAgc3RyZWFtIDw8ICIjIFRva2VuIGNvdW50OiAiIDw8IEdldEhlYWRlcigpLnRva2VuX2NvdW50IDw8ICdcbic7Ci0gICAgICBzdHJlYW0gPDwgIiMgU21vb3RoaW5nOiBNb2RpZmllZCBLbmVzZXItTmV5IiA8PCAnXG4nOwotICAgIH0KLSAgICBzdHJlYW0gPDwgIlxcZGF0YVxcXG4iOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9zaXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICBzdHJlYW0gPDwgIm5ncmFtICIgPDwgKGkrMSkgPDwgJz0nIDw8IEdldEhlYWRlcigpLmNvdW50c19wcnVuZWRbaV0gPDwgJ1xuJzsKLSAgICB9Ci0gICAgc3RyZWFtIDw8ICdcbic7Ci0gICAgc3RkOjpzdHJpbmcgYXNfc3RyaW5nKHN0cmVhbS5zdHIoKSk7Ci0gICAgdXRpbDo6V3JpdGVPclRocm93KG91dF9mZF8uZ2V0KCksIGFzX3N0cmluZy5kYXRhKCksIGFzX3N0cmluZy5zaXplKCkpOwotICB9Ci0KLSAgdXRpbDo6RmFrZU9GU3RyZWFtIG91dChvdXRfZmRfLmdldCgpKTsKLSAgZm9yICh1bnNpZ25lZCBvcmRlciA9IDE7IG9yZGVyIDw9IHBvc2l0aW9ucy5zaXplKCk7ICsrb3JkZXIpIHsKLSAgICBvdXQgPDwgIlxcIiA8PCBvcmRlciA8PCAiLWdyYW1zOiIgPDwgJ1xuJzsKLSAgICBmb3IgKE5HcmFtU3RyZWFtIHN0cmVhbShwb3NpdGlvbnNbb3JkZXIgLSAxXSk7IHN0cmVhbTsgKytzdHJlYW0pIHsKLSAgICAgIC8vIENvcnJlY3RpbmcgZm9yIG51bWVyaWNhbCBwcmVjaXNpb24gaXNzdWVzLiAgVGFrZSB0aGF0IElSU1QuCi0gICAgICBvdXQgPDwgc3RyZWFtLT5WYWx1ZSgpLmNvbXBsZXRlLnByb2IgPDwgJ1x0JyA8PCB2b2NhYi5Mb29rdXAoKnN0cmVhbS0+YmVnaW4oKSk7Ci0gICAgICBmb3IgKGNvbnN0IFdvcmRJbmRleCAqaSA9IHN0cmVhbS0+YmVnaW4oKSArIDE7IGkgIT0gc3RyZWFtLT5lbmQoKTsgKytpKSB7Ci0gICAgICAgIG91dCA8PCAnICcgPDwgdm9jYWIuTG9va3VwKCppKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcmRlciAhPSBwb3NpdGlvbnMuc2l6ZSgpKQotICAgICAgICBvdXQgPDwgJ1x0JyA8PCBzdHJlYW0tPlZhbHVlKCkuY29tcGxldGUuYmFja29mZjsKLSAgICAgIG91dCA8PCAnXG4nOwotICAgIAotICAgIH0KLSAgICBvdXQgPDwgJ1xuJzsKLSAgfQotICBvdXQgPDwgIlxcZW5kXFxcbiI7Ci19Ci0KLX19IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL3ByaW50LmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvcHJpbnQuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNTdmMDYuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvcHJpbnQuaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotI2lmbmRlZiBMTV9CVUlMREVSX1BSSU5UX0gKLSNkZWZpbmUgTE1fQlVJTERFUl9QUklOVF9ICi0KLSNpbmNsdWRlICJsbS9idWlsZGVyL25ncmFtLmhoIgotI2luY2x1ZGUgImxtL2J1aWxkZXIvbmdyYW1fc3RyZWFtLmhoIgotI2luY2x1ZGUgImxtL2J1aWxkZXIvb3V0cHV0LmhoIgotI2luY2x1ZGUgInV0aWwvZmFrZV9vZnN0cmVhbS5oaCIKLSNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCi0jaW5jbHVkZSAidXRpbC9tbWFwLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlLmhoIgotCi0jaW5jbHVkZSA8b3N0cmVhbT4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0vLyBXYXJuaW5nOiBwcmludCByb3V0aW5lcyByZWFkIGFsbCB1bmlncmFtcyBiZWZvcmUgYWxsIGJpZ3JhbXMgYmVmb3JlIGFsbAotLy8gdHJpZ3JhbXMgZXRjLiAgU28gaWYgb3RoZXIgcGFydHMgb2YgdGhlIGNoYWluIG1vdmUgam9pbnRseSwgeW91J2xsIGhhdmUgdG8KLS8vIGJ1ZmZlci4gIAotCi1uYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7Ci0KLWNsYXNzIFZvY2FiUmVjb25zdGl0dXRlIHsKLSAgcHVibGljOgotICAgIC8vIGZkIG11c3QgYmUgYWxpdmUgZm9yIGxpZmUgb2YgdGhpcyBvYmplY3Q7IGRvZXMgbm90IHRha2Ugb3duZXJzaGlwLgotICAgIGV4cGxpY2l0IFZvY2FiUmVjb25zdGl0dXRlKGludCBmZCk7Ci0KLSAgICBjb25zdCBjaGFyICpMb29rdXAoV29yZEluZGV4IGluZGV4KSBjb25zdCB7Ci0gICAgICBhc3NlcnQoaW5kZXggPCBtYXBfLnNpemUoKSAtIDEpOwotICAgICAgcmV0dXJuIG1hcF9baW5kZXhdOwotICAgIH0KLQotICAgIFN0cmluZ1BpZWNlIExvb2t1cFBpZWNlKFdvcmRJbmRleCBpbmRleCkgY29uc3QgewotICAgICAgcmV0dXJuIFN0cmluZ1BpZWNlKG1hcF9baW5kZXhdLCBtYXBfW2luZGV4ICsgMV0gLSAxIC0gbWFwX1tpbmRleF0pOwotICAgIH0KLQotICAgIHN0ZDo6c2l6ZV90IFNpemUoKSBjb25zdCB7Ci0gICAgICAvLyBUaGVyZSdzIGFuIGV4dHJhIGVudHJ5IHRvIHN1cHBvcnQgU3RyaW5nUGllY2UgbGVuZ3Rocy4KLSAgICAgIHJldHVybiBtYXBfLnNpemUoKSAtIDE7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgdXRpbDo6c2NvcGVkX21lbW9yeSBtZW1vcnlfOwotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBtYXBfOwotfTsKLQotLy8gTm90IGRlZmluZWQsIG9ubHkgc3BlY2lhbGl6ZWQuICAKLXRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIFByaW50UGF5bG9hZCh1dGlsOjpGYWtlT0ZTdHJlYW0gJnRvLCBjb25zdCBQYXlsb2FkICZwYXlsb2FkKTsKLXRlbXBsYXRlIDw+IGlubGluZSB2b2lkIFByaW50UGF5bG9hZDx1aW50NjRfdD4odXRpbDo6RmFrZU9GU3RyZWFtICZ0bywgY29uc3QgUGF5bG9hZCAmcGF5bG9hZCkgewotICAvLyBUT0RPIHNsb3cKLSAgdG8gPDwgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4ocGF5bG9hZC5jb3VudCk7Ci19Ci10ZW1wbGF0ZSA8PiBpbmxpbmUgdm9pZCBQcmludFBheWxvYWQ8VW5pbnRlcnBvbGF0ZWQ+KHV0aWw6OkZha2VPRlN0cmVhbSAmdG8sIGNvbnN0IFBheWxvYWQgJnBheWxvYWQpIHsKLSAgdG8gPDwgbG9nMTAocGF5bG9hZC51bmludGVycC5wcm9iKSA8PCAnICcgPDwgbG9nMTAocGF5bG9hZC51bmludGVycC5nYW1tYSk7Ci19Ci10ZW1wbGF0ZSA8PiBpbmxpbmUgdm9pZCBQcmludFBheWxvYWQ8UHJvYkJhY2tvZmY+KHV0aWw6OkZha2VPRlN0cmVhbSAmdG8sIGNvbnN0IFBheWxvYWQgJnBheWxvYWQpIHsKLSAgdG8gPDwgcGF5bG9hZC5jb21wbGV0ZS5wcm9iIDw8ICcgJyA8PCBwYXlsb2FkLmNvbXBsZXRlLmJhY2tvZmY7Ci19Ci0KLS8vIHRlbXBsYXRlIHBhcmFtZXRlciBpcyB0aGUgdHlwZSBzdG9yZWQuICAKLXRlbXBsYXRlIDxjbGFzcyBWPiBjbGFzcyBQcmludCB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgdm9pZCBEdW1wU2VwYXJhdGVGaWxlcyhjb25zdCBWb2NhYlJlY29uc3RpdHV0ZSAmdm9jYWIsIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlX2Jhc2UsIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZjaGFpbnMpIHsKLSAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY2hhaW5zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGZpbGUoZmlsZV9iYXNlICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oaSkpOwotICAgICAgICBjaGFpbnNbaV0gPj4gUHJpbnQodm9jYWIsIHV0aWw6OkNyZWF0ZU9yVGhyb3coZmlsZS5jX3N0cigpKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZXhwbGljaXQgUHJpbnQoY29uc3QgVm9jYWJSZWNvbnN0aXR1dGUgJnZvY2FiLCBpbnQgZmQpIDogdm9jYWJfKHZvY2FiKSwgdG9fKGZkKSB7fQotCi0gICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyAmY2hhaW5zKSB7Ci0gICAgICB1dGlsOjpzY29wZWRfZmQgZmQodG9fKTsKLSAgICAgIHV0aWw6OkZha2VPRlN0cmVhbSBvdXQodG9fKTsKLSAgICAgIE5HcmFtU3RyZWFtcyBzdHJlYW1zKGNoYWlucyk7Ci0gICAgICBmb3IgKE5HcmFtU3RyZWFtICpzID0gc3RyZWFtcy5iZWdpbigpOyBzICE9IHN0cmVhbXMuZW5kKCk7ICsrcykgewotICAgICAgICBEdW1wU3RyZWFtKCpzLCBvdXQpOwotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgUnVuKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKLSAgICAgIHV0aWw6OnNjb3BlZF9mZCBmZCh0b18pOwotICAgICAgdXRpbDo6RmFrZU9GU3RyZWFtIG91dCh0b18pOwotICAgICAgTkdyYW1TdHJlYW0gc3RyZWFtKHBvc2l0aW9uKTsKLSAgICAgIER1bXBTdHJlYW0oc3RyZWFtLCBvdXQpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHZvaWQgRHVtcFN0cmVhbShOR3JhbVN0cmVhbSAmc3RyZWFtLCB1dGlsOjpGYWtlT0ZTdHJlYW0gJnRvKSB7Ci0gICAgICBmb3IgKDsgc3RyZWFtOyArK3N0cmVhbSkgewotICAgICAgICBQcmludFBheWxvYWQ8Vj4odG8sIHN0cmVhbS0+VmFsdWUoKSk7Ci0gICAgICAgIGZvciAoY29uc3QgV29yZEluZGV4ICp3ID0gc3RyZWFtLT5iZWdpbigpOyB3ICE9IHN0cmVhbS0+ZW5kKCk7ICsrdykgewotICAgICAgICAgIHRvIDw8ICcgJyA8PCB2b2NhYl8uTG9va3VwKCp3KSA8PCAnPScgPDwgKnc7Ci0gICAgICAgIH0KLSAgICAgICAgdG8gPDwgJ1xuJzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCBWb2NhYlJlY29uc3RpdHV0ZSAmdm9jYWJfOwotICAgIGludCB0b187Ci19OwotCi1jbGFzcyBQcmludEFSUEEgOiBwdWJsaWMgT3V0cHV0SG9vayB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBQcmludEFSUEEoaW50IGZkLCBib29sIHZlcmJvc2VfaGVhZGVyKQotICAgICAgOiBPdXRwdXRIb29rKFBST0JfU0VRVUVOVElBTF9IT09LKSwgb3V0X2ZkXyhmZCksIHZlcmJvc2VfaGVhZGVyXyh2ZXJib3NlX2hlYWRlcikge30KLQotICAgIHZvaWQgUnVuKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJnBvc2l0aW9ucyk7Ci0KLSAgcHJpdmF0ZToKLSAgICB1dGlsOjpzY29wZWRfZmQgb3V0X2ZkXzsKLSAgICBib29sIHZlcmJvc2VfaGVhZGVyXzsKLX07Ci0KLX19IC8vIG5hbWVzcGFjZXMKLSNlbmRpZiAvLyBMTV9CVUlMREVSX1BSSU5UX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL3NvcnQuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9zb3J0LmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTJiYjhlLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL3NvcnQuaGgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotI2lmbmRlZiBMTV9CVUlMREVSX1NPUlRfSAotI2RlZmluZSBMTV9CVUlMREVSX1NPUlRfSAotCi0jaW5jbHVkZSAibG0vYnVpbGRlci9uZ3JhbV9zdHJlYW0uaGgiCi0jaW5jbHVkZSAibG0vYnVpbGRlci9uZ3JhbS5oaCIKLSNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL3NvcnQuaGgiCi0KLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS90aW1lci5oaCIKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgbG0gewotbmFtZXNwYWNlIGJ1aWxkZXIgewotCi0vKioKLSAqIEFic3RyYWN0IHBhcmVudCBjbGFzcyBmb3IgZGVmaW5pbmcgY3VzdG9tIG4tZ3JhbSBjb21wYXJhdG9ycy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIENoaWxkPiBjbGFzcyBDb21wYXJhdG9yIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBib29sPiB7Ci0gIHB1YmxpYzoKLSAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGNvbXBhcmF0b3IgY2FwYWJsZSBvZiBjb21wYXJpbmcgdHdvIG4tZ3JhbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3JkZXIgTnVtYmVyIG9mIHdvcmRzIGluIGVhY2ggbi1ncmFtCi0gICAgICovCi0gICAgZXhwbGljaXQgQ29tcGFyYXRvcihzdGQ6OnNpemVfdCBvcmRlcikgOiBvcmRlcl8ob3JkZXIpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBsaWVzIHRoZSBjb21wYXJhdG9yIHVzaW5nIHRoZSBDb21wYXJlIG1ldGhvZCB0aGF0IG11c3QgYmUgZGVmaW5lZCBpbiBhbnkgY2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIHRoaXMgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGhzIEEgcG9pbnRlciB0byB0aGUgbi1ncmFtIG9uIHRoZSBsZWZ0LWhhbmQgc2lkZSBvZiB0aGUgY29tcGFyaXNvbgotICAgICAqIEBwYXJhbSByaHMgQSBwb2ludGVyIHRvIHRoZSBuLWdyYW0gb24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgY29tcGFyaXNvbgotICAgICAqCi0gICAgICogQHNlZSBDb250ZXh0T3JkZXI6OkNvbXBhcmUKLSAgICAgKiBAc2VlIFByZWZpeE9yZGVyOjpDb21wYXJlCi0gICAgICogQHNlZSBTdWZmaXhPcmRlcjo6Q29tcGFyZQotICAgICAqLwotICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3Qgdm9pZCAqbGhzLCBjb25zdCB2b2lkICpyaHMpIGNvbnN0IHsKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBDaGlsZCo+KHRoaXMpLT5Db21wYXJlKHN0YXRpY19jYXN0PGNvbnN0IFdvcmRJbmRleCo+KGxocyksIHN0YXRpY19jYXN0PGNvbnN0IFdvcmRJbmRleCo+KHJocykpOwotICAgIH0KLQotICAgIC8qKiBHZXRzIHRoZSBuLWdyYW0gb3JkZXIgZGVmaW5lZCBmb3IgdGhpcyBjb21wYXJhdG9yLiAqLwotICAgIHN0ZDo6c2l6ZV90IE9yZGVyKCkgY29uc3QgeyByZXR1cm4gb3JkZXJfOyB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIHN0ZDo6c2l6ZV90IG9yZGVyXzsKLX07Ci0KLS8qKgotICogTi1ncmFtIGNvbXBhcmF0b3IgdGhhdCBjb21wYXJlcyBuLWdyYW1zIGFjY29yZGluZyB0byB0aGVpciByZXZlcnNlIChzdWZmaXgpIG9yZGVyLgotICoKLSAqIFRoaXMgY29tcGFyYXRvciBjb21wYXJlcyBuLWdyYW1zIGxleGljb2dyYXBoaWNhbGx5LCBvbmUgd29yZCBhdCBhIHRpbWUsIAotICogYmVnaW5uaW5nIHdpdGggdGhlIGxhc3Qgd29yZCBvZiBlYWNoIG4tZ3JhbSBhbmQgZW5kaW5nIHdpdGggdGhlIGZpcnN0IHdvcmQgb2YgZWFjaCBuLWdyYW0uIAotICoKLSAqIFNvbWUgZXhhbXBsZXMgb2Ygbi1ncmFtIGNvbXBhcmlzb25zIGFzIGRlZmluZWQgYnkgdGhpcyBjb21wYXJhdG9yOgotICogLSBhIGIgYyA9PSBhIGIgYwotICogLSBhIGIgYyA8IGEgYiBkCi0gKiAtIGEgYiBjID4gYSBkIGIKLSAqIC0gYSBiIGMgPiBhIGIgYgotICogLSBhIGIgYyA+IHggYSBjCi0gKiAtIGEgYiBjIDwgeCB5IHoKLSAqLwotY2xhc3MgU3VmZml4T3JkZXIgOiBwdWJsaWMgQ29tcGFyYXRvcjxTdWZmaXhPcmRlcj4gewotICBwdWJsaWM6Ci0gIAotICAgIC8qKiAKLSAgICAgKiBDb25zdHJ1Y3RzIGEgY29tcGFyYXRvciBjYXBhYmxlIG9mIGNvbXBhcmluZyB0d28gbi1ncmFtcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcmRlciBOdW1iZXIgb2Ygd29yZHMgaW4gZWFjaCBuLWdyYW0KLSAgICAgKi8KLSAgICBleHBsaWNpdCBTdWZmaXhPcmRlcihzdGQ6OnNpemVfdCBvcmRlcikgOiBDb21wYXJhdG9yPFN1ZmZpeE9yZGVyPihvcmRlcikge30KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBuLWdyYW1zIGxleGljb2dyYXBoaWNhbGx5LCBvbmUgd29yZCBhdCBhIHRpbWUsIAotICAgICAqIGJlZ2lubmluZyB3aXRoIHRoZSBsYXN0IHdvcmQgb2YgZWFjaCBuLWdyYW0gYW5kIGVuZGluZyB3aXRoIHRoZSBmaXJzdCB3b3JkIG9mIGVhY2ggbi1ncmFtLgotICAgICAqCi0gICAgICogQHBhcmFtIGxocyBBIHBvaW50ZXIgdG8gdGhlIG4tZ3JhbSBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KLSAgICAgKiBAcGFyYW0gcmhzIEEgcG9pbnRlciB0byB0aGUgbi1ncmFtIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KLSAgICAgKi8KLSAgICBpbmxpbmUgYm9vbCBDb21wYXJlKGNvbnN0IFdvcmRJbmRleCAqbGhzLCBjb25zdCBXb3JkSW5kZXggKnJocykgY29uc3QgewotICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gb3JkZXJfIC0gMTsgaSAhPSAwOyAtLWkpIHsKLSAgICAgICAgaWYgKGxoc1tpXSAhPSByaHNbaV0pCi0gICAgICAgICAgcmV0dXJuIGxoc1tpXSA8IHJoc1tpXTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBsaHNbMF0gPCByaHNbMF07Ci0gICAgfQotCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtNYXRjaE9mZnNldCA9IDE7Ci19OwotCi0gIAotLyoqCi0gICogTi1ncmFtIGNvbXBhcmF0b3IgdGhhdCBjb21wYXJlcyBuLWdyYW1zIGFjY29yZGluZyB0byB0aGUgcmV2ZXJzZSAoc3VmZml4KSBvcmRlciBvZiB0aGUgbi1ncmFtIGNvbnRleHQuCi0gICoKLSAgKiBUaGlzIGNvbXBhcmF0b3IgY29tcGFyZXMgbi1ncmFtcyBsZXhpY29ncmFwaGljYWxseSwgb25lIHdvcmQgYXQgYSB0aW1lLCAKLSAgKiBiZWdpbm5pbmcgd2l0aCB0aGUgcGVudWx0aW1hdGUgd29yZCBvZiBlYWNoIG4tZ3JhbSBhbmQgZW5kaW5nIHdpdGggdGhlIGZpcnN0IHdvcmQgb2YgZWFjaCBuLWdyYW07Ci0gICogZmluYWxseSwgdGhpcyBjb21wYXJhdG9yIGNvbXBhcmVzIHRoZSBsYXN0IHdvcmQgb2YgZWFjaCBuLWdyYW0uCi0gICoKLSAgKiBTb21lIGV4YW1wbGVzIG9mIG4tZ3JhbSBjb21wYXJpc29ucyBhcyBkZWZpbmVkIGJ5IHRoaXMgY29tcGFyYXRvcjoKLSAgKiAtIGEgYiBjID09IGEgYiBjCi0gICogLSBhIGIgYyA8IGEgYiBkCi0gICogLSBhIGIgYyA8IGEgZCBiCi0gICogLSBhIGIgYyA+IGEgYiBiCi0gICogLSBhIGIgYyA+IHggYSBjCi0gICogLSBhIGIgYyA8IHggeSB6Ci0gICovCi1jbGFzcyBDb250ZXh0T3JkZXIgOiBwdWJsaWMgQ29tcGFyYXRvcjxDb250ZXh0T3JkZXI+IHsKLSAgcHVibGljOgotICAKLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0cyBhIGNvbXBhcmF0b3IgY2FwYWJsZSBvZiBjb21wYXJpbmcgdHdvIG4tZ3JhbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3JkZXIgTnVtYmVyIG9mIHdvcmRzIGluIGVhY2ggbi1ncmFtCi0gICAgICovCi0gICAgZXhwbGljaXQgQ29udGV4dE9yZGVyKHN0ZDo6c2l6ZV90IG9yZGVyKSA6IENvbXBhcmF0b3I8Q29udGV4dE9yZGVyPihvcmRlcikge30KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBuLWdyYW1zIGxleGljb2dyYXBoaWNhbGx5LCBvbmUgd29yZCBhdCBhIHRpbWUsIAotICAgICAqIGJlZ2lubmluZyB3aXRoIHRoZSBwZW51bHRpbWF0ZSB3b3JkIG9mIGVhY2ggbi1ncmFtIGFuZCBlbmRpbmcgd2l0aCB0aGUgZmlyc3Qgd29yZCBvZiBlYWNoIG4tZ3JhbTsKLSAgICAgKiBmaW5hbGx5LCB0aGlzIGNvbXBhcmF0b3IgY29tcGFyZXMgdGhlIGxhc3Qgd29yZCBvZiBlYWNoIG4tZ3JhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaHMgQSBwb2ludGVyIHRvIHRoZSBuLWdyYW0gb24gdGhlIGxlZnQtaGFuZCBzaWRlIG9mIHRoZSBjb21wYXJpc29uCi0gICAgICogQHBhcmFtIHJocyBBIHBvaW50ZXIgdG8gdGhlIG4tZ3JhbSBvbiB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBjb21wYXJpc29uCi0gICAgICovCi0gICAgaW5saW5lIGJvb2wgQ29tcGFyZShjb25zdCBXb3JkSW5kZXggKmxocywgY29uc3QgV29yZEluZGV4ICpyaHMpIGNvbnN0IHsKLSAgICAgIGZvciAoaW50IGkgPSBvcmRlcl8gLSAyOyBpID49IDA7IC0taSkgewotICAgICAgICBpZiAobGhzW2ldICE9IHJoc1tpXSkKLSAgICAgICAgICByZXR1cm4gbGhzW2ldIDwgcmhzW2ldOwotICAgICAgfQotICAgICAgcmV0dXJuIGxoc1tvcmRlcl8gLSAxXSA8IHJoc1tvcmRlcl8gLSAxXTsKLSAgICB9Ci19OwotCi0vKioKLSAqIE4tZ3JhbSBjb21wYXJhdG9yIHRoYXQgY29tcGFyZXMgbi1ncmFtcyBhY2NvcmRpbmcgdG8gdGhlaXIgbmF0dXJhbCAocHJlZml4KSBvcmRlci4KLSAqCi0gKiBUaGlzIGNvbXBhcmF0b3IgY29tcGFyZXMgbi1ncmFtcyBsZXhpY29ncmFwaGljYWxseSwgb25lIHdvcmQgYXQgYSB0aW1lLCAKLSAqIGJlZ2lubmluZyB3aXRoIHRoZSBmaXJzdCB3b3JkIG9mIGVhY2ggbi1ncmFtIGFuZCBlbmRpbmcgd2l0aCB0aGUgbGFzdCB3b3JkIG9mIGVhY2ggbi1ncmFtLgotICoKLSAqIFNvbWUgZXhhbXBsZXMgb2Ygbi1ncmFtIGNvbXBhcmlzb25zIGFzIGRlZmluZWQgYnkgdGhpcyBjb21wYXJhdG9yOgotICogLSBhIGIgYyA9PSBhIGIgYwotICogLSBhIGIgYyA8IGEgYiBkCi0gKiAtIGEgYiBjIDwgYSBkIGIKLSAqIC0gYSBiIGMgPiBhIGIgYgotICogLSBhIGIgYyA8IHggYSBjCi0gKiAtIGEgYiBjIDwgeCB5IHoKLSAqLwotY2xhc3MgUHJlZml4T3JkZXIgOiBwdWJsaWMgQ29tcGFyYXRvcjxQcmVmaXhPcmRlcj4gewotICBwdWJsaWM6Ci0gIAotICAgIC8qKiAKLSAgICAgKiBDb25zdHJ1Y3RzIGEgY29tcGFyYXRvciBjYXBhYmxlIG9mIGNvbXBhcmluZyB0d28gbi1ncmFtcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcmRlciBOdW1iZXIgb2Ygd29yZHMgaW4gZWFjaCBuLWdyYW0KLSAgICAgKi8KLSAgICBleHBsaWNpdCBQcmVmaXhPcmRlcihzdGQ6OnNpemVfdCBvcmRlcikgOiBDb21wYXJhdG9yPFByZWZpeE9yZGVyPihvcmRlcikge30KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBuLWdyYW1zIGxleGljb2dyYXBoaWNhbGx5LCBvbmUgd29yZCBhdCBhIHRpbWUsIAotICAgICAqIGJlZ2lubmluZyB3aXRoIHRoZSBmaXJzdCB3b3JkIG9mIGVhY2ggbi1ncmFtIGFuZCBlbmRpbmcgd2l0aCB0aGUgbGFzdCB3b3JkIG9mIGVhY2ggbi1ncmFtLgotICAgICAqCi0gICAgICogQHBhcmFtIGxocyBBIHBvaW50ZXIgdG8gdGhlIG4tZ3JhbSBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KLSAgICAgKiBAcGFyYW0gcmhzIEEgcG9pbnRlciB0byB0aGUgbi1ncmFtIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KLSAgICAgKi8KLSAgICBpbmxpbmUgYm9vbCBDb21wYXJlKGNvbnN0IFdvcmRJbmRleCAqbGhzLCBjb25zdCBXb3JkSW5kZXggKnJocykgY29uc3QgewotICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG9yZGVyXzsgKytpKSB7Ci0gICAgICAgIGlmIChsaHNbaV0gIT0gcmhzW2ldKQotICAgICAgICAgIHJldHVybiBsaHNbaV0gPCByaHNbaV07Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrTWF0Y2hPZmZzZXQgPSAwOwotfTsKLQotLy8gU3VtIGNvdW50cyBmb3IgdGhlIHNhbWUgbi1ncmFtLgotc3RydWN0IEFkZENvbWJpbmVyIHsKLSAgYm9vbCBvcGVyYXRvcigpKHZvaWQgKmZpcnN0X3ZvaWQsIGNvbnN0IHZvaWQgKnNlY29uZF92b2lkLCBjb25zdCBTdWZmaXhPcmRlciAmY29tcGFyZSkgY29uc3QgewotICAgIE5HcmFtIGZpcnN0KGZpcnN0X3ZvaWQsIGNvbXBhcmUuT3JkZXIoKSk7Ci0gICAgLy8gVGhlcmUgaXNuJ3QgYSBjb25zdCB2ZXJzaW9uIG9mIE5HcmFtLiAgCi0gICAgTkdyYW0gc2Vjb25kKGNvbnN0X2Nhc3Q8dm9pZCo+KHNlY29uZF92b2lkKSwgY29tcGFyZS5PcmRlcigpKTsKLSAgICBpZiAobWVtY21wKGZpcnN0LmJlZ2luKCksIHNlY29uZC5iZWdpbigpLCBzaXplb2YoV29yZEluZGV4KSAqIGNvbXBhcmUuT3JkZXIoKSkpIHJldHVybiBmYWxzZTsKLSAgICBmaXJzdC5Db3VudCgpICs9IHNlY29uZC5Db3VudCgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19OwotCi0vLyBUaGUgY29tYmluZXIgaXMgb25seSB1c2VkIG9uIGEgc2luZ2xlIGNoYWluLCBzbyBJIGRpZG4ndCBib3RoZXIgdG8gYWxsb3cKLS8vIHRoYXQgdGVtcGxhdGUuCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gQHJlZiB1dGlsOjpGaXhlZEFycmF5ICJhcnJheSIgY2FwYWJsZSBvZiBzdG9yaW5nIEByZWYgdXRpbDo6c3RyZWFtOjpTb3J0ICJTb3J0IiBvYmplY3RzLgotICoKLSAqIEluIHRoZSBhbnRpY2lwYXRlZCB1c2UgY2FzZSwgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aWxsIG1haW50YWluIG9uZSBAcmVmIHV0aWw6OnN0cmVhbTo6U29ydCAiU29ydCIgb2JqZWN0Ci0gKiBmb3IgZWFjaCBuLWdyYW0gb3JkZXIgKHJhbmdpbmcgZnJvbSAxIHVwIHRvIHRoZSBtYXhpbXVtIG4tZ3JhbSBvcmRlciBiZWluZyBwcm9jZXNzZWQpLgotICogVXNlIGluIHRoaXMgbWFubmVyIHdvdWxkIGVuYWJsZSB0aGUgbi1ncmFtcyBlYWNoIG4tZ3JhbSBvcmRlciB0byBiZSBzb3J0ZWQsIGluIHBhcmFsbGVsLgotICoKLSAqIEB0cGFyYW0gQ29tcGFyZSBBbiBAcmVmIENvbXBhcmF0b3IgIm5ncmFtIGNvbXBhcmF0b3IiIHRvIHVzZSBkdXJpbmcgc29ydGluZy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+IGNsYXNzIFNvcnRzIDogcHVibGljIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpTb3J0PENvbXBhcmU+ID4gewotICBwcml2YXRlOgotICAgIHR5cGVkZWYgdXRpbDo6c3RyZWFtOjpTb3J0PENvbXBhcmU+IFM7Ci0gICAgdHlwZWRlZiB1dGlsOjpGaXhlZEFycmF5PFM+IFA7Ci0KLSAgcHVibGljOgotICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzLCBidXQgZG9lcyBub3QgaW5pdGlhbGl6ZS4KLSAgICAgKiAKLSAgICAgKiBAcmVmIHV0aWw6OkZpeGVkQXJyYXk6OkluaXQoKSAiSW5pdCIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVzZS4KLSAgICAgKgotICAgICAqIEBzZWUgdXRpbDo6Rml4ZWRBcnJheTo6SW5pdCgpCi0gICAgICovCi0gICAgU29ydHMoKSB7fQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBAcmVmIHV0aWw6OkZpeGVkQXJyYXkgImFycmF5IiBjYXBhYmxlIG9mIHN0b3JpbmcgYSBmaXhlZCBudW1iZXIgb2YgQHJlZiB1dGlsOjpzdHJlYW06OlNvcnQgIlNvcnQiIG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBtYXhpbXVtIG51bWJlciBvZiBAcmVmIHV0aWw6OnN0cmVhbTo6U29ydCAic29ydGVycyIgdGhhdCBjYW4gYmUgaGVsZCBieSB0aGlzIEByZWYgdXRpbDo6Rml4ZWRBcnJheSAiYXJyYXkiCi0gICAgICogQHNlZSB1dGlsOjpGaXhlZEFycmF5OjpGaXhlZEFycmF5KCkKLSAgICAgKi8KLSAgICBleHBsaWNpdCBTb3J0cyhzdGQ6OnNpemVfdCBudW1iZXIpIDogdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OlNvcnQ8Q29tcGFyZT4gPihudW1iZXIpIHt9Ci0KLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBAcmVmIHV0aWw6OnN0cmVhbTo6U29ydCAiU29ydCIgb2JqZWN0IHdoaWNoIGlzIHN0b3JlZCBpbiB0aGlzIEByZWYgdXRpbDo6Rml4ZWRBcnJheSAiYXJyYXkiLgotICAgICAqCi0gICAgICogVGhlIG5ldyBAcmVmIHV0aWw6OnN0cmVhbTo6U29ydCAiU29ydCIgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBwcm92aWRlZCBAcmVmIHV0aWw6OnN0cmVhbTo6U29ydENvbmZpZyAiU29ydENvbmZpZyIgYW5kIEByZWYgQ29tcGFyYXRvciAibmdyYW0gY29tcGFyYXRvciI7Ci0gICAgICogb25jZSBjb25zdHJ1Y3RlZCwgYSBuZXcgd29ya2VyIEByZWYgdXRpbDo6c3RyZWFtOjpUaHJlYWQgInRocmVhZCIgKG93bmVkIGJ5IHRoZSBAcmVmIHV0aWw6OnN0cmVhbTo6Q2hhaW4gImNoYWluIikgd2lsbCBzb3J0IHRoZSBuLWdyYW0gZGF0YSBzdG9yZWQKLSAgICAgKiBpbiB0aGUgQHJlZiB1dGlsOjpzdHJlYW06OkJsb2NrICJibG9ja3MiIG9mIHRoZSBwcm92aWRlZCBAcmVmIHV0aWw6OnN0cmVhbTo6Q2hhaW4gImNoYWluIi4KLSAgICAgKgotICAgICAqIEBzZWUgdXRpbDo6c3RyZWFtOjpTb3J0OjpTb3J0KCkKLSAgICAgKiBAc2VlIHV0aWw6OnN0cmVhbTo6Q2hhaW46Om9wZXJhdG9yPj4oKQotICAgICAqLwotICAgIHZvaWQgcHVzaF9iYWNrKHV0aWw6OnN0cmVhbTo6Q2hhaW4gJmNoYWluLCBjb25zdCB1dGlsOjpzdHJlYW06OlNvcnRDb25maWcgJmNvbmZpZywgY29uc3QgQ29tcGFyZSAmY29tcGFyZSkgewotICAgICAgbmV3IChQOjplbmQoKSkgUyhjaGFpbiwgY29uZmlnLCBjb21wYXJlKTsgLy8gdXNlICJwbGFjZW1lbnQgbmV3IiBzeW50YXggdG8gaW5pdGFsaXplIFMgaW4gYW4gYWxyZWFkeS1hbGxvY2F0ZWQgbWVtb3J5IGxvY2F0aW9uCi0gICAgICBQOjpDb25zdHJ1Y3RlZCgpOwotICAgIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGJ1aWxkZXIKLX0gLy8gbmFtZXNwYWNlIGxtCi0KLSNlbmRpZiAvLyBMTV9CVUlMREVSX1NPUlRfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2NvbmZpZy5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9jb25maWcuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjM4Y2QuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2NvbmZpZy5oaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jaWZuZGVmIExNX0NPTkZJR19ICi0jZGVmaW5lIExNX0NPTkZJR19ICi0KLSNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAidXRpbC9tbWFwLmhoIgotCi0jaW5jbHVkZSA8aW9zZndkPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8qIENvbmZpZ3VyYXRpb24gZm9yIG5ncmFtIG1vZGVsLiAgU2VwYXJhdGUgaGVhZGVyIHRvIHJlZHVjZSBwb2xsdXRpb24uICovCi0KLW5hbWVzcGFjZSBsbSB7Ci0KLWNsYXNzIEVudW1lcmF0ZVZvY2FiOwotCi1uYW1lc3BhY2UgbmdyYW0gewotCi1zdHJ1Y3QgQ29uZmlnIHsKLSAgLy8gRUZGRUNUSVZFIEZPUiBCT1RIIEFSUEEgQU5EIEJJTkFSWSBSRUFEUwotCi0gIC8vIChkZWZhdWx0IHRydWUpIHByaW50IHByb2dyZXNzIGJhciB0byBtZXNzYWdlcwotICBib29sIHNob3dfcHJvZ3Jlc3M7Ci0KLSAgLy8gV2hlcmUgdG8gbG9nIG1lc3NhZ2VzIGluY2x1ZGluZyB0aGUgcHJvZ3Jlc3MgYmFyLiAgU2V0IHRvIE5VTEwgZm9yCi0gIC8vIHNpbGVuY2UuCi0gIHN0ZDo6b3N0cmVhbSAqbWVzc2FnZXM7Ci0KLSAgc3RkOjpvc3RyZWFtICpQcm9ncmVzc01lc3NhZ2VzKCkgY29uc3QgewotICAgIHJldHVybiBzaG93X3Byb2dyZXNzID8gbWVzc2FnZXMgOiAwOwotICB9Ci0KLSAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCB3aXRoIGV2ZXJ5IHN0cmluZyBpbiB0aGUgdm9jYWJ1bGFyeS4gIFNlZQotICAvLyBlbnVtZXJhdGVfdm9jYWIuaGggZm9yIG1vcmUgZGV0YWlsLiAgQ29uZmlnIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwOyB5b3UKLSAgLy8gYXJlIHN0aWxsIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyBpdCAob3Igc3RhY2sgYWxsb2NhdGluZykuCi0gIEVudW1lcmF0ZVZvY2FiICplbnVtZXJhdGVfdm9jYWI7Ci0KLQotICAvLyBPTkxZIEVGRkVDVElWRSBXSEVOIFJFQURJTkcgQVJQQQotCi0gIC8vIFdoYXQgdG8gZG8gd2hlbiA8dW5rPiBpc24ndCBpbiB0aGUgcHJvdmlkZWQgbW9kZWwuCi0gIFdhcm5pbmdBY3Rpb24gdW5rbm93bl9taXNzaW5nOwotICAvLyBXaGF0IHRvIGRvIHdoZW4gPHM+IG9yIDwvcz4gaXMgbWlzc2luZyBmcm9tIHRoZSBtb2RlbC4KLSAgLy8gSWYgVEhST1dfVVAsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBvZiB0eXBlIHV0aWw6OlNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbi4KLSAgV2FybmluZ0FjdGlvbiBzZW50ZW5jZV9tYXJrZXJfbWlzc2luZzsKLQotICAvLyBXaGF0IHRvIGRvIHdpdGggYSBwb3NpdGl2ZSBsb2cgcHJvYmFiaWxpdHkuICBGb3IgQ09NUExBSU4gYW5kIFNJTEVOVCwgbWFwCi0gIC8vIHRvIDAuCi0gIFdhcm5pbmdBY3Rpb24gcG9zaXRpdmVfbG9nX3Byb2JhYmlsaXR5OwotCi0gIC8vIFRoZSBwcm9iYWJpbGl0eSB0byBzdWJzdGl0dXRlIGZvciA8dW5rPiBpZiBpdCdzIG1pc3NpbmcgZnJvbSB0aGUgbW9kZWwuCi0gIC8vIE5vIGVmZmVjdCBpZiB0aGUgbW9kZWwgaGFzIDx1bms+IG9yIHVua25vd25fbWlzc2luZyA9PSBUSFJPV19VUC4KLSAgZmxvYXQgdW5rbm93bl9taXNzaW5nX2xvZ3Byb2I7Ci0KLSAgLy8gU2l6ZSBtdWx0aXBsaWVyIGZvciBwcm9iaW5nIGhhc2ggdGFibGUuICBNdXN0IGJlID4gMS4gIFNwYWNlIGlzIGxpbmVhciBpbgotICAvLyB0aGlzLiAgVGltZSBpcyBwcm9iaW5nX211bHRpcGxpZXIgLyAocHJvYmluZ19tdWx0aXBsaWVyIC0gMSkuICBObyBlZmZlY3QKLSAgLy8gZm9yIHNvcnRlZCB2YXJpYW50LgotICAvLyBJZiB5b3UgZmluZCB5b3Vyc2VsZiBzZXR0aW5nIHRoaXMgdG8gYSBsb3cgbnVtYmVyLCBjb25zaWRlciB1c2luZyB0aGUKLSAgLy8gVHJpZU1vZGVsIHdoaWNoIGhhcyBsb3dlciBtZW1vcnkgY29uc3VtcHRpb24uCi0gIGZsb2F0IHByb2JpbmdfbXVsdGlwbGllcjsKLQotICAvLyBBbW91bnQgb2YgbWVtb3J5IHRvIHVzZSBmb3IgYnVpbGRpbmcuICBUaGUgYWN0dWFsIG1lbW9yeSB1c2FnZSB3aWxsIGJlCi0gIC8vIGhpZ2hlciBzaW5jZSB0aGlzIGp1c3Qgc2V0cyBzb3J0IGJ1ZmZlciBzaXplLiAgT25seSBhcHBsaWVzIHRvIHRyaWUKLSAgLy8gbW9kZWxzLgotICBzdGQ6OnNpemVfdCBidWlsZGluZ19tZW1vcnk7Ci0KLSAgLy8gVGVtcGxhdGUgZm9yIHRlbXBvcmFyeSBkaXJlY3RvcnkgYXBwcm9wcmlhdGUgZm9yIHBhc3NpbmcgdG8gbWtkdGVtcC4KLSAgLy8gVGhlIGNoYXJhY3RlcnMgWFhYWFhYIGFyZSBhcHBlbmRlZCBiZWZvcmUgcGFzc2luZyB0byBta2R0ZW1wLiAgT25seQotICAvLyBhcHBsaWVzIHRvIHRyaWUuICBJZiBlbXB0eSwgZGVmYXVsdHMgdG8gd3JpdGVfbW1hcC4gIElmIHRoYXQncyBOVUxMLAotICAvLyBkZWZhdWx0cyB0byBpbnB1dCBmaWxlIG5hbWUuCi0gIHN0ZDo6c3RyaW5nIHRlbXBvcmFyeV9kaXJlY3RvcnlfcHJlZml4OwotCi0gIC8vIExldmVsIG9mIGNvbXBsYWluaW5nIHRvIGRvIHdoZW4gbG9hZGluZyBmcm9tIEFSUEEgaW5zdGVhZCBvZiBiaW5hcnkgZm9ybWF0LgotICBlbnVtIEFSUEFMb2FkQ29tcGxhaW4ge0FMTCwgRVhQRU5TSVZFLCBOT05FfTsKLSAgQVJQQUxvYWRDb21wbGFpbiBhcnBhX2NvbXBsYWluOwotCi0gIC8vIFdoaWxlIGxvYWRpbmcgYW4gQVJQQSBmaWxlLCBhbHNvIHdyaXRlIG91dCB0aGlzIGJpbmFyeSBmb3JtYXQgZmlsZS4gIFNldAotICAvLyB0byBOVUxMIHRvIGRpc2FibGUuCi0gIGNvbnN0IGNoYXIgKndyaXRlX21tYXA7Ci0KLSAgZW51bSBXcml0ZU1ldGhvZCB7Ci0gICAgV1JJVEVfTU1BUCwgLy8gTWFwIHRoZSBmaWxlIGRpcmVjdGx5LgotICAgIFdSSVRFX0FGVEVSIC8vIFdyaXRlIGFmdGVyIHdlJ3JlIGRvbmUuCi0gIH07Ci0gIFdyaXRlTWV0aG9kIHdyaXRlX21ldGhvZDsKLQotICAvLyBJbmNsdWRlIHRoZSB2b2NhYiBpbiB0aGUgYmluYXJ5IGZpbGU/ICBPbmx5IGVmZmVjdGl2ZSBpZiB3cml0ZV9tbWFwICE9IE5VTEwuCi0gIGJvb2wgaW5jbHVkZV92b2NhYjsKLQotCi0gIC8vIExlZnQgcmVzdCBvcHRpb25zLiAgT25seSB1c2VkIHdoZW4gdGhlIG1vZGVsIGluY2x1ZGVzIHJlc3QgY29zdHMuCi0gIGVudW0gUmVzdEZ1bmN0aW9uIHsKLSAgICBSRVNUX01BWCwgICAvLyBNYXhpbXVtIG9mIGFueSBzY29yZSB0byB0aGUgbGVmdAotICAgIFJFU1RfTE9XRVIsIC8vIFVzZSBsb3dlci1vcmRlciBmaWxlcyBnaXZlbiBiZWxvdy4KLSAgfTsKLSAgUmVzdEZ1bmN0aW9uIHJlc3RfZnVuY3Rpb247Ci0gIC8vIE9ubHkgdXNlZCBmb3IgUkVTVF9MT1dFUi4KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlc3RfbG93ZXJfZmlsZXM7Ci0KLQotICAvLyBRdWFudGl6YXRpb24gb3B0aW9ucy4gIE9ubHkgZWZmZWN0aXZlIGZvciBRdWFudFRyaWVNb2RlbC4gIE9uZSB2YWx1ZSBpcwotICAvLyByZXNlcnZlZCBmb3IgZWFjaCBvZiBwcm9iIGFuZCBiYWNrb2ZmLCBzbyAyXmJpdHMgLSAxIGJ1Y2tldHMgd2lsbCBiZSB1c2VkCi0gIC8vIHRvIHF1YW50aXplIChhbmQgb25lIG9mIHRoZSByZW1haW5pbmcgYmFja29mZnMgd2lsbCBiZSAwKS4KLSAgdWludDhfdCBwcm9iX2JpdHMsIGJhY2tvZmZfYml0czsKLQotICAvLyBCaGlrc2hhIGNvbXByZXNzaW9uIChzaW1wbGUgZm9ybSkuICBPbmx5IHdvcmtzIHdpdGggdHJpZS4KLSAgdWludDhfdCBwb2ludGVyX2JoaWtzaGFfYml0czsKLQotCi0gIC8vIE9OTFkgRUZGRUNUSVZFIFdIRU4gUkVBRElORyBCSU5BUlkKLQotICAvLyBIb3cgdG8gZ2V0IHRoZSBnaWFudCBhcnJheSBpbnRvIG1lbW9yeTogbGF6eSBtbWFwLCBwb3B1bGF0ZSwgcmVhZCBldGMuCi0gIC8vIFNlZSB1dGlsL21tYXAuaGggZm9yIGRldGFpbHMgb2YgTWFwTWV0aG9kLgotICB1dGlsOjpMb2FkTWV0aG9kIGxvYWRfbWV0aG9kOwotCi0KLSAgLy8gU2V0IGRlZmF1bHRzLgotICBDb25maWcoKTsKLX07Ci0KLX0gLyogbmFtZXNwYWNlIG5ncmFtICovIH0gLyogbmFtZXNwYWNlIGxtICovCi0KLSNlbmRpZiAvLyBMTV9DT05GSUdfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2VudW1lcmF0ZV92b2NhYi5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9lbnVtZXJhdGVfdm9jYWIuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Y2U3ODkuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2VudW1lcmF0ZV92b2NhYi5oaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNpZm5kZWYgTE1fRU5VTUVSQVRFX1ZPQ0FCX0gKLSNkZWZpbmUgTE1fRU5VTUVSQVRFX1ZPQ0FCX0gKLQotI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCi0jaW5jbHVkZSAidXRpbC9zdHJpbmdfcGllY2UuaGgiCi0KLW5hbWVzcGFjZSBsbSB7Ci0KLS8qIElmIHlvdSBuZWVkIHRoZSBhY3R1YWwgc3RyaW5ncyBpbiB0aGUgdm9jYWJ1bGFyeSwgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MKLSAqIGFuZCBpbXBsZW1lbnQgQWRkLiAgVGhlbiBwdXQgYSBwb2ludGVyIGluIENvbmZpZy5lbnVtZXJhdGVfdm9jYWI7IGl0IGRvZXMKLSAqIG5vdCB0YWtlIG93bmVyc2hpcC4gIEFkZCBpcyBjYWxsZWQgb25jZSBwZXIgdm9jYWIgd29yZC4gIGluZGV4IHN0YXJ0cyBhdCAwCi0gKiBhbmQgaW5jcmVhc2VzIGJ5IDEgZWFjaCB0aW1lLiAgVGhpcyBpcyBvbmx5IHVzZWQgYnkgdGhlIE1vZGVsIGNvbnN0cnVjdG9yOwotICogdGhlIHBvaW50ZXIgaXMgbm90IHJldGFpbmVkIGJ5IHRoZSBjbGFzcy4gIAotICovCi1jbGFzcyBFbnVtZXJhdGVWb2NhYiB7Ci0gIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5FbnVtZXJhdGVWb2NhYigpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgQWRkKFdvcmRJbmRleCBpbmRleCwgY29uc3QgU3RyaW5nUGllY2UgJnN0cikgPSAwOwotCi0gIHByb3RlY3RlZDoKLSAgICBFbnVtZXJhdGVWb2NhYigpIHt9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBsbQotCi0jZW5kaWYgLy8gTE1fRU5VTUVSQVRFX1ZPQ0FCX0gKLQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2ZhY2FkZS5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9mYWNhZGUuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMTJiNjIuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2ZhY2FkZS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSNpZm5kZWYgTE1fRkFDQURFX0gKLSNkZWZpbmUgTE1fRkFDQURFX0gKLQotI2luY2x1ZGUgImxtL3ZpcnR1YWxfaW50ZXJmYWNlLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlLmhoIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgbG0gewotbmFtZXNwYWNlIGJhc2UgewotCi0vLyBDb21tb24gbW9kZWwgaW50ZXJmYWNlIHRoYXQgZGVwZW5kcyBvbiBrbm93aW5nIHRoZSBzcGVjaWZpYyBjbGFzc2VzLiAKLS8vIEN1cmlvdXNseSByZWN1cnJpbmcgdGVtcGxhdGUgcGF0dGVybi4gIAotdGVtcGxhdGUgPGNsYXNzIENoaWxkLCBjbGFzcyBTdGF0ZVQsIGNsYXNzIFZvY2FidWxhcnlUPiBjbGFzcyBNb2RlbEZhY2FkZSA6IHB1YmxpYyBNb2RlbCB7Ci0gIHB1YmxpYzoKLSAgICB0eXBlZGVmIFN0YXRlVCBTdGF0ZTsKLSAgICB0eXBlZGVmIFZvY2FidWxhcnlUIFZvY2FidWxhcnk7Ci0KLSAgICAvKiBUcmFuc2xhdGUgZnJvbSB2b2lkKiB0byBTdGF0ZSAqLwotICAgIEZ1bGxTY29yZVJldHVybiBCYXNlRnVsbFNjb3JlKGNvbnN0IHZvaWQgKmluX3N0YXRlLCBjb25zdCBXb3JkSW5kZXggbmV3X3dvcmQsIHZvaWQgKm91dF9zdGF0ZSkgY29uc3QgewotICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IENoaWxkKj4odGhpcyktPkZ1bGxTY29yZSgKLSAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTdGF0ZSo+KGluX3N0YXRlKSwKLSAgICAgICAgICBuZXdfd29yZCwKLSAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxTdGF0ZSo+KG91dF9zdGF0ZSkpOwotICAgIH0KLQotICAgIEZ1bGxTY29yZVJldHVybiBCYXNlRnVsbFNjb3JlRm9yZ290U3RhdGUoY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JiZWdpbiwgY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JlbmQsIGNvbnN0IFdvcmRJbmRleCBuZXdfd29yZCwgdm9pZCAqb3V0X3N0YXRlKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQ2hpbGQqPih0aGlzKS0+RnVsbFNjb3JlRm9yZ290U3RhdGUoCi0gICAgICAgICAgY29udGV4dF9yYmVnaW4sCi0gICAgICAgICAgY29udGV4dF9yZW5kLAotICAgICAgICAgIG5ld193b3JkLAotICAgICAgICAgICpyZWludGVycHJldF9jYXN0PFN0YXRlKj4ob3V0X3N0YXRlKSk7Ci0gICAgfQotCi0gICAgLy8gRGVmYXVsdCBTY29yZSBmdW5jdGlvbiBjYWxscyBGdWxsU2NvcmUuICBNb2RlbCBjYW4gb3ZlcnJpZGUgdGhpcy4gIAotICAgIGZsb2F0IFNjb3JlKGNvbnN0IFN0YXRlICZpbl9zdGF0ZSwgY29uc3QgV29yZEluZGV4IG5ld193b3JkLCBTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQ2hpbGQqPih0aGlzKS0+RnVsbFNjb3JlKGluX3N0YXRlLCBuZXdfd29yZCwgb3V0X3N0YXRlKS5wcm9iOwotICAgIH0KLQotICAgIGZsb2F0IEJhc2VTY29yZShjb25zdCB2b2lkICppbl9zdGF0ZSwgY29uc3QgV29yZEluZGV4IG5ld193b3JkLCB2b2lkICpvdXRfc3RhdGUpIGNvbnN0IHsKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBDaGlsZCo+KHRoaXMpLT5TY29yZSgKLSAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTdGF0ZSo+KGluX3N0YXRlKSwKLSAgICAgICAgICBuZXdfd29yZCwKLSAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxTdGF0ZSo+KG91dF9zdGF0ZSkpOwotICAgIH0KLQotICAgIGNvbnN0IFN0YXRlICZCZWdpblNlbnRlbmNlU3RhdGUoKSBjb25zdCB7IHJldHVybiBiZWdpbl9zZW50ZW5jZV87IH0KLSAgICBjb25zdCBTdGF0ZSAmTnVsbENvbnRleHRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG51bGxfY29udGV4dF87IH0KLSAgICBjb25zdCBWb2NhYnVsYXJ5ICZHZXRWb2NhYnVsYXJ5KCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IFZvY2FidWxhcnkqPigmQmFzZVZvY2FidWxhcnkoKSk7IH0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgTW9kZWxGYWNhZGUoKSA6IE1vZGVsKHNpemVvZihTdGF0ZSkpIHt9Ci0KLSAgICB2aXJ0dWFsIH5Nb2RlbEZhY2FkZSgpIHt9Ci0KLSAgICAvLyBiZWdpbl9zZW50ZW5jZSBhbmQgbnVsbF9jb250ZXh0IGNhbiBkaXNhcHBlYXIgYWZ0ZXIuICB2b2NhYiBzaG91bGQgc3RheS4gIAotICAgIHZvaWQgSW5pdChjb25zdCBTdGF0ZSAmYmVnaW5fc2VudGVuY2UsIGNvbnN0IFN0YXRlICZudWxsX2NvbnRleHQsIGNvbnN0IFZvY2FidWxhcnkgJnZvY2FiLCB1bnNpZ25lZCBjaGFyIG9yZGVyKSB7Ci0gICAgICBiZWdpbl9zZW50ZW5jZV8gPSBiZWdpbl9zZW50ZW5jZTsKLSAgICAgIG51bGxfY29udGV4dF8gPSBudWxsX2NvbnRleHQ7Ci0gICAgICBiZWdpbl9zZW50ZW5jZV9tZW1vcnlfID0gJmJlZ2luX3NlbnRlbmNlXzsKLSAgICAgIG51bGxfY29udGV4dF9tZW1vcnlfID0gJm51bGxfY29udGV4dF87Ci0gICAgICBiYXNlX3ZvY2FiXyA9ICZ2b2NhYjsKLSAgICAgIG9yZGVyXyA9IG9yZGVyOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIFN0YXRlIGJlZ2luX3NlbnRlbmNlXywgbnVsbF9jb250ZXh0XzsKLX07Ci0KLX0gLy8gbWFtZXNwYWNlIGJhc2UKLX0gLy8gbmFtZXNwYWNlIGxtCi0KLSNlbmRpZiAvLyBMTV9GQUNBREVfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2xlZnQuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbGVmdC5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkNjEzNi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbGVmdC5oaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKiBFZmZpY2llbnQgbGVmdCBhbmQgcmlnaHQgbGFuZ3VhZ2UgbW9kZWwgc3RhdGUgZm9yIHNlbnRlbmNlIGZyYWdtZW50cy4KLSAqIEludGVuZGVkIHVzYWdlOgotICogU3RvcmUgQ2hhcnRTdGF0ZSB3aXRoIGV2ZXJ5IGNoYXJ0IGVudHJ5LiAgCi0gKiBUbyBkbyBhIHJ1bGUgYXBwbGljYXRpb246Ci0gKiAxLiBNYWtlIGEgQ2hhcnRTdGF0ZSBvYmplY3QgZm9yIHlvdXIgbmV3IGVudHJ5LiAgCi0gKiAyLiBDb25zdHJ1Y3QgUnVsZVNjb3JlLiAgCi0gKiAzLiBHb2luZyBmcm9tIGxlZnQgdG8gcmlnaHQsIGNhbGwgVGVybWluYWwgb3IgTm9uVGVybWluYWwuIAotICogICBGb3IgdGVybWluYWxzLCBqdXN0IHBhc3MgdGhlIHZvY2FiIGlkLiAgCi0gKiAgIEZvciBub24tdGVybWluYWxzLCBwYXNzIHRoYXQgbm9uLXRlcm1pbmFsJ3MgQ2hhcnRTdGF0ZS4KLSAqICAgICBJZiB5b3VyIGRlY29kZXIgZXhwZWN0cyBzY29yZXMgaW5jbHVzaXZlIG9mIHN1YnRyZWUgc2NvcmVzIChpLmUuIHlvdQotICogICAgIGxhYmVsIGVudHJpZXMgd2l0aCB0aGUgaGlnaGVzdC1zY29yaW5nIHBhdGgpLCBwYXNzIHRoZSBub24tdGVybWluYWwncwotICogICAgIHNjb3JlIGFzIHByb2IuICAKLSAqICAgICBJZiB5b3VyIGRlY29kZXIgZXhwZWN0cyByZWxhdGl2ZSBzY29yZXMgYW5kIHdpbGwgd2FsayB0aGUgY2hhcnQgbGF0ZXIsCi0gKiAgICAgcGFzcyBwcm9iID0gMC4wLiAgCi0gKiAgICAgSW4gb3RoZXIgd29yZHMsIHRoZSBvbmx5IGVmZmVjdCBvZiBwcm9iIGlzIHRoYXQgaXQgZ2V0cyBhZGRlZCB0byB0aGUKLSAqICAgICByZXR1cm5lZCBsb2cgcHJvYmFiaWxpdHkuICAKLSAqIDQuIENhbGwgRmluaXNoLiAgSXQgcmV0dXJucyB0aGUgbG9nIHByb2JhYmlsaXR5LiAgIAotICoKLSAqIFRoZXJlJ3MgYSBjb3VwbGUgbW9yZSBkZXRhaWxzOiAKLSAqIERvIG5vdCBwYXNzIDxzPiB0byBUZXJtaW5hbCBhcyBpdCBpcyBmb3JtYWxseSBub3QgYSB3b3JkIGluIHRoZSBzZW50ZW5jZSwKLSAqIG9ubHkgY29udGV4dC4gIEluc3RlYWQsIGNhbGwgQmVnaW5TZW50ZW5jZS4gIElmIGNhbGxlZCwgaXQgc2hvdWxkIGJlIHRoZQotICogZmlyc3QgY2FsbCBhZnRlciBSdWxlU2NvcmUgaXMgY29uc3RydWN0ZWQgKHNpbmNlIDxzPiBpcyBhbHdheXMgdGhlCi0gKiBsZWZ0bW9zdCkuCi0gKgotICogSWYgdGhlIGxlZnRtb3N0IFJIUyBpcyBhIG5vbi10ZXJtaW5hbCwgaXQncyBmYXN0ZXIgdG8gY2FsbCBCZWdpbk5vblRlcm1pbmFsLgotICoKLSAqIEhhc2hpbmcgYW5kIHNvcnRpbmcgY29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlIHByb3ZpZGVkLiAgIEFsbCBzdGF0ZSBvYmplY3RzCi0gKiBhcmUgUE9ELiAgSWYgeW91IGludGVuZCB0byB1c2UgbWVtY21wIG9uIHJhdyBzdGF0ZSBvYmplY3RzLCB5b3UgbXVzdCBjYWxsCi0gKiBaZXJvUmVtYWluaW5nIGZpcnN0LCBhcyB0aGUgdmFsdWUgb2YgYXJyYXkgZW50cmllcyBiZXlvbmQgbGVuZ3RoIGlzCi0gKiBvdGhlcndpc2UgdW5kZWZpbmVkLiAgCi0gKgotICogVXNhZ2UgaXMgb2YgY291cnNlIG5vdCBsaW1pdGVkIHRvIGNoYXJ0IGRlY29kaW5nLiAgQW55dGhpbmcgdGhhdCBnZW5lcmF0ZXMKLSAqIHNlbnRlbmNlIGZyYWdtZW50cyBtaXNzaW5nIGxlZnQgY29udGV4dCBjb3VsZCBiZW5lZml0LiAgRm9yIGV4YW1wbGUsIGEKLSAqIHBocmFzZS1iYXNlZCBkZWNvZGVyIGNvdWxkIHByZS1zY29yZSBwaHJhc2VzLCBzdG9yaW5nIENoYXJ0U3RhdGUgd2l0aCBlYWNoCi0gKiBwaHJhc2UsIGV2ZW4gaWYgaHlwb3RoZXNlcyBhcmUgZ2VuZXJhdGVkIGxlZnQtdG8tcmlnaHQuICAKLSAqLwotCi0jaWZuZGVmIExNX0xFRlRfSAotI2RlZmluZSBMTV9MRUZUX0gKLQotI2luY2x1ZGUgImxtL21heF9vcmRlci5oaCIKLSNpbmNsdWRlICJsbS9zdGF0ZS5oaCIKLSNpbmNsdWRlICJsbS9yZXR1cm4uaGgiCi0KLSNpbmNsdWRlICJ1dGlsL211cm11cl9oYXNoLmhoIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi1uYW1lc3BhY2UgbG0gewotbmFtZXNwYWNlIG5ncmFtIHsKLQotdGVtcGxhdGUgPGNsYXNzIE0+IGNsYXNzIFJ1bGVTY29yZSB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBSdWxlU2NvcmUoY29uc3QgTSAmbW9kZWwsIENoYXJ0U3RhdGUgJm91dCkgOiBtb2RlbF8obW9kZWwpLCBvdXRfKCZvdXQpLCBsZWZ0X2RvbmVfKGZhbHNlKSwgcHJvYl8oMC4wKSB7Ci0gICAgICBvdXQubGVmdC5sZW5ndGggPSAwOwotICAgICAgb3V0LnJpZ2h0Lmxlbmd0aCA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCBCZWdpblNlbnRlbmNlKCkgewotICAgICAgb3V0Xy0+cmlnaHQgPSBtb2RlbF8uQmVnaW5TZW50ZW5jZVN0YXRlKCk7Ci0gICAgICAvLyBvdXRfLT5sZWZ0IGlzIGVtcHR5LgotICAgICAgbGVmdF9kb25lXyA9IHRydWU7Ci0gICAgfQotCi0gICAgdm9pZCBUZXJtaW5hbChXb3JkSW5kZXggd29yZCkgewotICAgICAgU3RhdGUgY29weShvdXRfLT5yaWdodCk7Ci0gICAgICBGdWxsU2NvcmVSZXR1cm4gcmV0KG1vZGVsXy5GdWxsU2NvcmUoY29weSwgd29yZCwgb3V0Xy0+cmlnaHQpKTsKLSAgICAgIGlmIChsZWZ0X2RvbmVfKSB7IHByb2JfICs9IHJldC5wcm9iOyByZXR1cm47IH0KLSAgICAgIGlmIChyZXQuaW5kZXBlbmRlbnRfbGVmdCkgewotICAgICAgICBwcm9iXyArPSByZXQucHJvYjsKLSAgICAgICAgbGVmdF9kb25lXyA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG91dF8tPmxlZnQucG9pbnRlcnNbb3V0Xy0+bGVmdC5sZW5ndGgrK10gPSByZXQuZXh0ZW5kX2xlZnQ7Ci0gICAgICBwcm9iXyArPSByZXQucmVzdDsKLSAgICAgIGlmIChvdXRfLT5yaWdodC5sZW5ndGggIT0gY29weS5sZW5ndGggKyAxKQotICAgICAgICBsZWZ0X2RvbmVfID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBGYXN0ZXIgdmVyc2lvbiBvZiBOb25UZXJtaW5hbCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHJ1bGUgYmVnaW5zIHdpdGggYSBub24tdGVybWluYWwuICAKLSAgICB2b2lkIEJlZ2luTm9uVGVybWluYWwoY29uc3QgQ2hhcnRTdGF0ZSAmaW4sIGZsb2F0IHByb2IgPSAwLjApIHsKLSAgICAgIHByb2JfID0gcHJvYjsKLSAgICAgICpvdXRfID0gaW47Ci0gICAgICBsZWZ0X2RvbmVfID0gaW4ubGVmdC5mdWxsOwotICAgIH0KLQotICAgIHZvaWQgTm9uVGVybWluYWwoY29uc3QgQ2hhcnRTdGF0ZSAmaW4sIGZsb2F0IHByb2IgPSAwLjApIHsKLSAgICAgIHByb2JfICs9IHByb2I7Ci0gICAgICAKLSAgICAgIGlmICghaW4ubGVmdC5sZW5ndGgpIHsKLSAgICAgICAgaWYgKGluLmxlZnQuZnVsbCkgewotICAgICAgICAgIGZvciAoY29uc3QgZmxvYXQgKmkgPSBvdXRfLT5yaWdodC5iYWNrb2ZmOyBpIDwgb3V0Xy0+cmlnaHQuYmFja29mZiArIG91dF8tPnJpZ2h0Lmxlbmd0aDsgKytpKSBwcm9iXyArPSAqaTsKLSAgICAgICAgICBsZWZ0X2RvbmVfID0gdHJ1ZTsKLSAgICAgICAgICBvdXRfLT5yaWdodCA9IGluLnJpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKCFvdXRfLT5yaWdodC5sZW5ndGgpIHsKLSAgICAgICAgb3V0Xy0+cmlnaHQgPSBpbi5yaWdodDsKLSAgICAgICAgaWYgKGxlZnRfZG9uZV8pIHsKLSAgICAgICAgICBwcm9iXyArPSBtb2RlbF8uVW5SZXN0KGluLmxlZnQucG9pbnRlcnMsIGluLmxlZnQucG9pbnRlcnMgKyBpbi5sZWZ0Lmxlbmd0aCwgMSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvdXRfLT5sZWZ0Lmxlbmd0aCkgewotICAgICAgICAgIGxlZnRfZG9uZV8gPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dF8tPmxlZnQgPSBpbi5sZWZ0OwotICAgICAgICAgIGxlZnRfZG9uZV8gPSBpbi5sZWZ0LmZ1bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBmbG9hdCBiYWNrb2Zmc1tLRU5MTV9NQVhfT1JERVIgLSAxXSwgYmFja29mZnMyW0tFTkxNX01BWF9PUkRFUiAtIDFdOwotICAgICAgZmxvYXQgKmJhY2sgPSBiYWNrb2ZmcywgKmJhY2syID0gYmFja29mZnMyOwotICAgICAgdW5zaWduZWQgY2hhciBuZXh0X3VzZSA9IG91dF8tPnJpZ2h0Lmxlbmd0aDsKLQotICAgICAgLy8gRmlyc3Qgd29yZAotICAgICAgaWYgKEV4dGVuZExlZnQoaW4sIG5leHRfdXNlLCAxLCBvdXRfLT5yaWdodC5iYWNrb2ZmLCBiYWNrKSkgcmV0dXJuOwotCi0gICAgICAvLyBXb3JkcyBhZnRlciB0aGUgZmlyc3QsIHNvIGV4dGVuZGluZyBhIGJpZ3JhbSB0byBiZWdpbiB3aXRoCi0gICAgICBmb3IgKHVuc2lnbmVkIGNoYXIgZXh0ZW5kX2xlbmd0aCA9IDI7IGV4dGVuZF9sZW5ndGggPD0gaW4ubGVmdC5sZW5ndGg7ICsrZXh0ZW5kX2xlbmd0aCkgewotICAgICAgICBpZiAoRXh0ZW5kTGVmdChpbiwgbmV4dF91c2UsIGV4dGVuZF9sZW5ndGgsIGJhY2ssIGJhY2syKSkgcmV0dXJuOwotICAgICAgICBzdGQ6OnN3YXAoYmFjaywgYmFjazIpOwotICAgICAgfQotCi0gICAgICBpZiAoaW4ubGVmdC5mdWxsKSB7Ci0gICAgICAgIGZvciAoY29uc3QgZmxvYXQgKmkgPSBiYWNrOyBpICE9IGJhY2sgKyBuZXh0X3VzZTsgKytpKSBwcm9iXyArPSAqaTsKLSAgICAgICAgbGVmdF9kb25lXyA9IHRydWU7Ci0gICAgICAgIG91dF8tPnJpZ2h0ID0gaW4ucmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gUmlnaHQgc3RhdGUgd2FzIG1pbmltaXplZCwgc28gaXQncyBhbHJlYWR5IGluZGVwZW5kZW50IG9mIHRoZSBuZXcgd29yZHMgdG8gdGhlIGxlZnQuICAKLSAgICAgIGlmIChpbi5yaWdodC5sZW5ndGggPCBpbi5sZWZ0Lmxlbmd0aCkgewotICAgICAgICBvdXRfLT5yaWdodCA9IGluLnJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8vIFNoaWZ0IGV4aXNpdGluZyB3b3JkcyBkb3duLiAgCi0gICAgICBmb3IgKFdvcmRJbmRleCAqaSA9IG91dF8tPnJpZ2h0LndvcmRzICsgbmV4dF91c2UgLSAxOyBpID49IG91dF8tPnJpZ2h0LndvcmRzOyAtLWkpIHsKLSAgICAgICAgKihpICsgaW4ucmlnaHQubGVuZ3RoKSA9ICppOwotICAgICAgfQotICAgICAgLy8gQWRkIHdvcmRzIGZyb20gaW4ucmlnaHQuICAKLSAgICAgIHN0ZDo6Y29weShpbi5yaWdodC53b3JkcywgaW4ucmlnaHQud29yZHMgKyBpbi5yaWdodC5sZW5ndGgsIG91dF8tPnJpZ2h0LndvcmRzKTsKLSAgICAgIC8vIEFzc2VtYmxlIGJhY2tvZmYgY29tcG9zZWQgb24gdGhlIGV4aXN0aW5nIHN0YXRlJ3MgYmFja29mZiBmb2xsb3dlZCBieSB0aGUgbmV3IHN0YXRlJ3MgYmFja29mZi4gIAotICAgICAgc3RkOjpjb3B5KGluLnJpZ2h0LmJhY2tvZmYsIGluLnJpZ2h0LmJhY2tvZmYgKyBpbi5yaWdodC5sZW5ndGgsIG91dF8tPnJpZ2h0LmJhY2tvZmYpOwotICAgICAgc3RkOjpjb3B5KGJhY2ssIGJhY2sgKyBuZXh0X3VzZSwgb3V0Xy0+cmlnaHQuYmFja29mZiArIGluLnJpZ2h0Lmxlbmd0aCk7Ci0gICAgICBvdXRfLT5yaWdodC5sZW5ndGggPSBpbi5yaWdodC5sZW5ndGggKyBuZXh0X3VzZTsKLSAgICB9Ci0KLSAgICBmbG9hdCBGaW5pc2goKSB7Ci0gICAgICAvLyBBIE4tMS1ncmFtIG1pZ2h0IGV4dGVuZCBsZWZ0IGFuZCByaWdodCBidXQgd2Ugc2hvdWxkIHN0aWxsIHNldCBmdWxsIHRvIHRydWUgYmVjYXVzZSBpdCdzIGFuIE4tMS1ncmFtLiAgCi0gICAgICBvdXRfLT5sZWZ0LmZ1bGwgPSBsZWZ0X2RvbmVfIHx8IChvdXRfLT5sZWZ0Lmxlbmd0aCA9PSBtb2RlbF8uT3JkZXIoKSAtIDEpOwotICAgICAgcmV0dXJuIHByb2JfOwotICAgIH0KLQotICAgIHZvaWQgUmVzZXQoKSB7Ci0gICAgICBwcm9iXyA9IDAuMDsKLSAgICAgIGxlZnRfZG9uZV8gPSBmYWxzZTsKLSAgICAgIG91dF8tPmxlZnQubGVuZ3RoID0gMDsKLSAgICAgIG91dF8tPnJpZ2h0Lmxlbmd0aCA9IDA7Ci0gICAgfQotICAgIHZvaWQgUmVzZXQoQ2hhcnRTdGF0ZSAmcmVwbGFjZW1lbnQpIHsKLSAgICAgIG91dF8gPSAmcmVwbGFjZW1lbnQ7Ci0gICAgICBSZXNldCgpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIGJvb2wgRXh0ZW5kTGVmdChjb25zdCBDaGFydFN0YXRlICZpbiwgdW5zaWduZWQgY2hhciAmbmV4dF91c2UsIHVuc2lnbmVkIGNoYXIgZXh0ZW5kX2xlbmd0aCwgY29uc3QgZmxvYXQgKmJhY2tfaW4sIGZsb2F0ICpiYWNrX291dCkgewotICAgICAgUHJvY2Vzc1JldChtb2RlbF8uRXh0ZW5kTGVmdCgKLSAgICAgICAgICAgIG91dF8tPnJpZ2h0LndvcmRzLCBvdXRfLT5yaWdodC53b3JkcyArIG5leHRfdXNlLCAvLyBXb3JkcyB0byBleHRlbmQgaW50bwotICAgICAgICAgICAgYmFja19pbiwgLy8gQmFja29mZnMgdG8gdXNlCi0gICAgICAgICAgICBpbi5sZWZ0LnBvaW50ZXJzW2V4dGVuZF9sZW5ndGggLSAxXSwgZXh0ZW5kX2xlbmd0aCwgLy8gV29yZHMgdG8gYmUgZXh0ZW5kZWQKLSAgICAgICAgICAgIGJhY2tfb3V0LCAvLyBCYWNrb2ZmcyBmb3IgdGhlIG5leHQgc2NvcmUKLSAgICAgICAgICAgIG5leHRfdXNlKSk7IC8vIExlbmd0aCBvZiBuLWdyYW0gdG8gdXNlIGluIG5leHQgc2NvcmluZy4gIAotICAgICAgaWYgKG5leHRfdXNlICE9IG91dF8tPnJpZ2h0Lmxlbmd0aCkgewotICAgICAgICBsZWZ0X2RvbmVfID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFuZXh0X3VzZSkgewotICAgICAgICAgIC8vIEVhcmx5IGV4aXQuICAKLSAgICAgICAgICBvdXRfLT5yaWdodCA9IGluLnJpZ2h0OwotICAgICAgICAgIHByb2JfICs9IG1vZGVsXy5VblJlc3QoaW4ubGVmdC5wb2ludGVycyArIGV4dGVuZF9sZW5ndGgsIGluLmxlZnQucG9pbnRlcnMgKyBpbi5sZWZ0Lmxlbmd0aCwgZXh0ZW5kX2xlbmd0aCArIDEpOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBDb250aW51ZSBzY29yaW5nLiAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBQcm9jZXNzUmV0KGNvbnN0IEZ1bGxTY29yZVJldHVybiAmcmV0KSB7Ci0gICAgICBpZiAobGVmdF9kb25lXykgewotICAgICAgICBwcm9iXyArPSByZXQucHJvYjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKHJldC5pbmRlcGVuZGVudF9sZWZ0KSB7Ci0gICAgICAgIHByb2JfICs9IHJldC5wcm9iOwotICAgICAgICBsZWZ0X2RvbmVfID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgb3V0Xy0+bGVmdC5wb2ludGVyc1tvdXRfLT5sZWZ0Lmxlbmd0aCsrXSA9IHJldC5leHRlbmRfbGVmdDsKLSAgICAgIHByb2JfICs9IHJldC5yZXN0OwotICAgIH0KLQotICAgIGNvbnN0IE0gJm1vZGVsXzsKLQotICAgIENoYXJ0U3RhdGUgKm91dF87Ci0KLSAgICBib29sIGxlZnRfZG9uZV87Ci0KLSAgICBmbG9hdCBwcm9iXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIG5ncmFtCi19IC8vIG5hbWVzcGFjZSBsbQotCi0jZW5kaWYgLy8gTE1fTEVGVF9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbGVmdF90ZXN0LmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2xlZnRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ1NjE0Ni4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbGVmdF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLSNpbmNsdWRlICJsbS9sZWZ0LmhoIgotI2luY2x1ZGUgImxtL21vZGVsLmhoIgotCi0jaW5jbHVkZSAidXRpbC90b2tlbml6ZV9waWVjZS5oaCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBMZWZ0VGVzdAotI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KLSNpbmNsdWRlIDxib29zdC90ZXN0L2Zsb2F0aW5nX3BvaW50X2NvbXBhcmlzb24uaHBwPgotCi1uYW1lc3BhY2UgbG0gewotbmFtZXNwYWNlIG5ncmFtIHsKLW5hbWVzcGFjZSB7Ci0KLSNkZWZpbmUgVGVybSh3b3JkKSBzY29yZS5UZXJtaW5hbChtLkdldFZvY2FidWxhcnkoKS5JbmRleCh3b3JkKSk7Ci0jZGVmaW5lIFZDaGVjayh3b3JkLCB2YWx1ZSkgQk9PU1RfQ0hFQ0tfRVFVQUwobS5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgod29yZCksIHZhbHVlKTsKLQotLy8gQXBwYXJlbnRseSBzb21lIEJvb3N0IHZlcnNpb25zIHVzZSB0ZW1wbGF0ZXMgYW5kIGFyZSBwcmV0dHkgc3RyaWN0IGFib3V0IHR5cGVzIG1hdGNoaW5nLiAgCi0jZGVmaW5lIFNMT1BQWV9DSEVDS19DTE9TRShyZWYsIHZhbHVlLCB0b2wpIEJPT1NUX0NIRUNLX0NMT1NFKHN0YXRpY19jYXN0PGRvdWJsZT4ocmVmKSwgc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSksIHN0YXRpY19jYXN0PGRvdWJsZT4odG9sKSk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBNPiB2b2lkIFNob3J0KGNvbnN0IE0gJm0pIHsKLSAgQ2hhcnRTdGF0ZSBiYXNlOwotICB7Ci0gICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGJhc2UpOwotICAgIFRlcm0oIm1vcmUiKTsKLSAgICBUZXJtKCJsb2luIik7Ci0gICAgU0xPUFBZX0NIRUNLX0NMT1NFKC0xLjIwNjMxOSAtIDAuMzU2MTY2NSwgc2NvcmUuRmluaXNoKCksIDAuMDAxKTsKLSAgfQotICBCT09TVF9DSEVDSyhiYXNlLmxlZnQuZnVsbCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDIsIGJhc2UubGVmdC5sZW5ndGgpOwotICBCT09TVF9DSEVDS19FUVVBTCgxLCBiYXNlLnJpZ2h0Lmxlbmd0aCk7Ci0gIFZDaGVjaygibG9pbiIsIGJhc2UucmlnaHQud29yZHNbMF0pOwotCi0gIENoYXJ0U3RhdGUgbW9yZV9sZWZ0OwotICB7Ci0gICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIG1vcmVfbGVmdCk7Ci0gICAgVGVybSgibGl0dGxlIik7Ci0gICAgc2NvcmUuTm9uVGVybWluYWwoYmFzZSwgLTEuMjA2MzE5IC0gMC4zNTYxNjY1KTsKLSAgICAvLyBwKGxpdHRsZSBtb3JlIGxvaW4gfCBudWxsIGNvbnRleHQpCi0gICAgU0xPUFBZX0NIRUNLX0NMT1NFKC0xLjU2NTM4LCBzY29yZS5GaW5pc2goKSwgMC4wMDEpOwotICB9Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDMsIG1vcmVfbGVmdC5sZWZ0Lmxlbmd0aCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDEsIG1vcmVfbGVmdC5yaWdodC5sZW5ndGgpOwotICBWQ2hlY2soImxvaW4iLCBtb3JlX2xlZnQucmlnaHQud29yZHNbMF0pOwotICBCT09TVF9DSEVDSyhtb3JlX2xlZnQubGVmdC5mdWxsKTsKLQotICBDaGFydFN0YXRlIHNob3J0ZXI7Ci0gIHsKLSAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgc2hvcnRlcik7Ci0gICAgVGVybSgidG8iKTsKLSAgICBzY29yZS5Ob25UZXJtaW5hbChiYXNlLCAtMS4yMDYzMTkgLSAwLjM1NjE2NjUpOwotICAgIFNMT1BQWV9DSEVDS19DTE9TRSgtMC4zMDEwMyAtIDEuNjg3ODcyIC0gMS4yMDYzMTkgLSAwLjM1NjE2NjUsIHNjb3JlLkZpbmlzaCgpLCAwLjAxKTsKLSAgfQotICBCT09TVF9DSEVDS19FUVVBTCgxLCBzaG9ydGVyLmxlZnQubGVuZ3RoKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgc2hvcnRlci5yaWdodC5sZW5ndGgpOwotICBWQ2hlY2soImxvaW4iLCBzaG9ydGVyLnJpZ2h0LndvcmRzWzBdKTsKLSAgQk9PU1RfQ0hFQ0soc2hvcnRlci5sZWZ0LmZ1bGwpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTT4gdm9pZCBDaGFyZ2UoY29uc3QgTSAmbSkgewotICBDaGFydFN0YXRlIGJhc2U7Ci0gIHsKLSAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgYmFzZSk7Ci0gICAgVGVybSgib24iKTsKLSAgICBUZXJtKCJtb3JlIik7Ci0gICAgU0xPUFBZX0NIRUNLX0NMT1NFKC0xLjUwOTU1OSAtMC40NzcxMjEyIC0xLjIwNjMxOSwgc2NvcmUuRmluaXNoKCksIDAuMDAxKTsKLSAgfQotICBCT09TVF9DSEVDS19FUVVBTCgxLCBiYXNlLmxlZnQubGVuZ3RoKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgYmFzZS5yaWdodC5sZW5ndGgpOwotICBWQ2hlY2soIm1vcmUiLCBiYXNlLnJpZ2h0LndvcmRzWzBdKTsKLSAgQk9PU1RfQ0hFQ0soYmFzZS5sZWZ0LmZ1bGwpOwotCi0gIENoYXJ0U3RhdGUgZXh0ZW5kOwotICB7Ci0gICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGV4dGVuZCk7Ci0gICAgVGVybSgibG9va2luZyIpOwotICAgIHNjb3JlLk5vblRlcm1pbmFsKGJhc2UsIC0xLjUwOTU1OSAtMC40NzcxMjEyIC0xLjIwNjMxOSk7Ci0gICAgU0xPUFBZX0NIRUNLX0NMT1NFKC0zLjkxMDM5LCBzY29yZS5GaW5pc2goKSwgMC4wMDEpOwotICB9Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDIsIGV4dGVuZC5sZWZ0Lmxlbmd0aCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDEsIGV4dGVuZC5yaWdodC5sZW5ndGgpOwotICBWQ2hlY2soIm1vcmUiLCBleHRlbmQucmlnaHQud29yZHNbMF0pOwotICBCT09TVF9DSEVDSyhleHRlbmQubGVmdC5mdWxsKTsKLQotICBDaGFydFN0YXRlIHRvYm9zOwotICB7Ci0gICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIHRvYm9zKTsKLSAgICBzY29yZS5CZWdpblNlbnRlbmNlKCk7Ci0gICAgc2NvcmUuTm9uVGVybWluYWwoZXh0ZW5kLCAtMy45MTAzOSk7Ci0gICAgU0xPUFBZX0NIRUNLX0NMT1NFKC0zLjQ3MTE2OSwgc2NvcmUuRmluaXNoKCksIDAuMDAxKTsKLSAgfQotICBCT09TVF9DSEVDS19FUVVBTCgwLCB0b2Jvcy5sZWZ0Lmxlbmd0aCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDEsIHRvYm9zLnJpZ2h0Lmxlbmd0aCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBNPiBmbG9hdCBMZWZ0VG9SaWdodChjb25zdCBNICZtLCBjb25zdCBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+ICZ3b3JkcywgYm9vbCBiZWdpbl9zZW50ZW5jZSA9IGZhbHNlKSB7Ci0gIGZsb2F0IHJldCA9IDAuMDsKLSAgU3RhdGUgcmlnaHQgPSBiZWdpbl9zZW50ZW5jZSA/IG0uQmVnaW5TZW50ZW5jZVN0YXRlKCkgOiBtLk51bGxDb250ZXh0U3RhdGUoKTsKLSAgZm9yIChzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+Ojpjb25zdF9pdGVyYXRvciBpID0gd29yZHMuYmVnaW4oKTsgaSAhPSB3b3Jkcy5lbmQoKTsgKytpKSB7Ci0gICAgU3RhdGUgY29weShyaWdodCk7Ci0gICAgcmV0ICs9IG0uU2NvcmUoY29weSwgKmksIHJpZ2h0KTsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTT4gZmxvYXQgUmlnaHRUb0xlZnQoY29uc3QgTSAmbSwgY29uc3Qgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiAmd29yZHMsIGJvb2wgYmVnaW5fc2VudGVuY2UgPSBmYWxzZSkgewotICBmbG9hdCByZXQgPSAwLjA7Ci0gIENoYXJ0U3RhdGUgc3RhdGU7Ci0gIHN0YXRlLmxlZnQubGVuZ3RoID0gMDsKLSAgc3RhdGUucmlnaHQubGVuZ3RoID0gMDsKLSAgc3RhdGUubGVmdC5mdWxsID0gZmFsc2U7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8V29yZEluZGV4Pjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpID0gd29yZHMucmJlZ2luKCk7IGkgIT0gd29yZHMucmVuZCgpOyArK2kpIHsKLSAgICBDaGFydFN0YXRlIGNvcHkoc3RhdGUpOwotICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBzdGF0ZSk7Ci0gICAgc2NvcmUuVGVybWluYWwoKmkpOwotICAgIHNjb3JlLk5vblRlcm1pbmFsKGNvcHksIHJldCk7Ci0gICAgcmV0ID0gc2NvcmUuRmluaXNoKCk7Ci0gIH0KLSAgaWYgKGJlZ2luX3NlbnRlbmNlKSB7Ci0gICAgQ2hhcnRTdGF0ZSBjb3B5KHN0YXRlKTsKLSAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgc3RhdGUpOwotICAgIHNjb3JlLkJlZ2luU2VudGVuY2UoKTsKLSAgICBzY29yZS5Ob25UZXJtaW5hbChjb3B5LCByZXQpOwotICAgIHJldCA9IHNjb3JlLkZpbmlzaCgpOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBNPiBmbG9hdCBUcmVlTWlkZGxlKGNvbnN0IE0gJm0sIGNvbnN0IHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gJndvcmRzLCBib29sIGJlZ2luX3NlbnRlbmNlID0gZmFsc2UpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENoYXJ0U3RhdGUsIGZsb2F0PiA+IHN0YXRlcyh3b3Jkcy5zaXplKCkpOwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHdvcmRzLnNpemUoKTsgKytpKSB7Ci0gICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIHN0YXRlc1tpXS5maXJzdCk7Ci0gICAgc2NvcmUuVGVybWluYWwod29yZHNbaV0pOwotICAgIHN0YXRlc1tpXS5zZWNvbmQgPSBzY29yZS5GaW5pc2goKTsKLSAgfQotICB3aGlsZSAoc3RhdGVzLnNpemUoKSA+IDEpIHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q2hhcnRTdGF0ZSwgZmxvYXQ+ID4gdXBwZXIoKHN0YXRlcy5zaXplKCkgKyAxKSAvIDIpOwotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc3RhdGVzLnNpemUoKSAvIDI7ICsraSkgewotICAgICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIHVwcGVyW2ldLmZpcnN0KTsKLSAgICAgIHNjb3JlLk5vblRlcm1pbmFsKHN0YXRlc1tpKjJdLmZpcnN0LCBzdGF0ZXNbaSoyXS5zZWNvbmQpOwotICAgICAgc2NvcmUuTm9uVGVybWluYWwoc3RhdGVzW2kqMisxXS5maXJzdCwgc3RhdGVzW2kqMisxXS5zZWNvbmQpOwotICAgICAgdXBwZXJbaV0uc2Vjb25kID0gc2NvcmUuRmluaXNoKCk7Ci0gICAgfQotICAgIGlmIChzdGF0ZXMuc2l6ZSgpICUgMikgewotICAgICAgdXBwZXIuYmFjaygpID0gc3RhdGVzLmJhY2soKTsKLSAgICB9Ci0gICAgc3RkOjpzd2FwKHN0YXRlcywgdXBwZXIpOwotICB9Ci0KLSAgaWYgKHN0YXRlcy5lbXB0eSgpKSByZXR1cm4gMC4wOwotCi0gIGlmIChiZWdpbl9zZW50ZW5jZSkgewotICAgIENoYXJ0U3RhdGUgaWdub3JlZDsKLSAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgaWdub3JlZCk7Ci0gICAgc2NvcmUuQmVnaW5TZW50ZW5jZSgpOwotICAgIHNjb3JlLk5vblRlcm1pbmFsKHN0YXRlcy5mcm9udCgpLmZpcnN0LCBzdGF0ZXMuZnJvbnQoKS5zZWNvbmQpOwotICAgIHJldHVybiBzY29yZS5GaW5pc2goKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gc3RhdGVzLmZyb250KCkuc2Vjb25kOwotICB9Ci0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgTG9va3VwVm9jYWIoY29uc3QgTSAmbSwgY29uc3QgU3RyaW5nUGllY2UgJnN0ciwgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiAmb3V0KSB7Ci0gIG91dC5jbGVhcigpOwotICBmb3IgKHV0aWw6OlRva2VuSXRlcjx1dGlsOjpTaW5nbGVDaGFyYWN0ZXIsIHRydWU+IGkoc3RyLCAnICcpOyBpOyArK2kpIHsKLSAgICBvdXQucHVzaF9iYWNrKG0uR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KCppKSk7Ci0gIH0KLX0KLQotI2RlZmluZSBURVhUX1RFU1Qoc3RyKSBcCi0gIExvb2t1cFZvY2FiKG0sIHN0ciwgd29yZHMpOyBcCi0gIGV4cGVjdCA9IExlZnRUb1JpZ2h0KG0sIHdvcmRzLCByZXN0KTsgXAotICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoZXhwZWN0LCBSaWdodFRvTGVmdChtLCB3b3JkcywgcmVzdCksIDAuMDAxKTsgXAotICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoZXhwZWN0LCBUcmVlTWlkZGxlKG0sIHdvcmRzLCByZXN0KSwgMC4wMDEpOyBcCi0KLS8vIEJ1aWxkIHNlbnRlbmNlcywgb3IgcGFydHMgdGhlcmVvZiwgZnJvbSByaWdodCB0byBsZWZ0LiAgCi10ZW1wbGF0ZSA8Y2xhc3MgTT4gdm9pZCBHcm93QmlnKGNvbnN0IE0gJm0sIGJvb2wgcmVzdCA9IGZhbHNlKSB7Ci0gIHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gd29yZHM7Ci0gIGZsb2F0IGV4cGVjdDsKLSAgVEVYVF9URVNUKCJpbiBiaWFycml0eiB3YXRjaGluZyBjb25zaWRlcmluZyBsb29raW5nIC4gb24gYSBsaXR0bGUgbW9yZSBsb2luIGFsc28gd291bGQgY29uc2lkZXIgaGlnaGVyIHRvIGxvb2sgZ29vZCB1bmtub3duIHRoZSBzY3JlZW5pbmcgZm9vIGJhciAsIHVua25vd24gaG93ZXZlciB1bmtub3duIDwvcz4iKTsKLSAgVEVYVF9URVNUKCJvbiBhIGxpdHRsZSBtb3JlIGxvaW4gYWxzbyB3b3VsZCBjb25zaWRlciBoaWdoZXIgdG8gbG9vayBnb29kIHVua25vd24gdGhlIHNjcmVlbmluZyBmb28gYmFyICwgdW5rbm93biBob3dldmVyIHVua25vd24gPC9zPiIpOwotICBURVhUX1RFU1QoIm9uIGEgbGl0dGxlIG1vcmUgbG9pbiBhbHNvIHdvdWxkIGNvbnNpZGVyIGhpZ2hlciB0byBsb29rIGdvb2QiKTsKLSAgVEVYVF9URVNUKCJtb3JlIGxvaW4gYWxzbyB3b3VsZCBjb25zaWRlciBoaWdoZXIgdG8gbG9vayBnb29kIik7Ci0gIFRFWFRfVEVTVCgibW9yZSBsb2luIGFsc28gd291bGQgY29uc2lkZXIgaGlnaGVyIHRvIGxvb2siKTsKLSAgVEVYVF9URVNUKCJhbHNvIHdvdWxkIGNvbnNpZGVyIGhpZ2hlciB0byBsb29rIik7Ci0gIFRFWFRfVEVTVCgiYWxzbyB3b3VsZCBjb25zaWRlciBoaWdoZXIiKTsKLSAgVEVYVF9URVNUKCJ3b3VsZCBjb25zaWRlciBoaWdoZXIgdG8gbG9vayIpOwotICBURVhUX1RFU1QoImNvbnNpZGVyIGhpZ2hlciB0byBsb29rIik7Ci0gIFRFWFRfVEVTVCgiY29uc2lkZXIgaGlnaGVyIHRvIik7Ci0gIFRFWFRfVEVTVCgiY29uc2lkZXIgaGlnaGVyIik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBNPiB2b2lkIEdyb3dTbWFsbChjb25zdCBNICZtLCBib29sIHJlc3QgPSBmYWxzZSkgewotICBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+IHdvcmRzOwotICBmbG9hdCBleHBlY3Q7Ci0gIFRFWFRfVEVTVCgiaW4gYmlhcnJpdHogd2F0Y2hpbmcgY29uc2lkZXJpbmcgbG9va2luZyAuIDwvcz4iKTsKLSAgVEVYVF9URVNUKCJpbiBiaWFycml0eiB3YXRjaGluZyBjb25zaWRlcmluZyBsb29raW5nIC4iKTsKLSAgVEVYVF9URVNUKCJpbiBiaWFycml0eiIpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTT4gdm9pZCBBbHNvV291bGRDb25zaWRlckhpZ2hlcihjb25zdCBNICZtKSB7Ci0gIENoYXJ0U3RhdGUgYWxzbzsKLSAgewotICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBhbHNvKTsKLSAgICBzY29yZS5UZXJtaW5hbChtLkdldFZvY2FidWxhcnkoKS5JbmRleCgiYWxzbyIpKTsKLSAgICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTEuNjg3ODcyLCBzY29yZS5GaW5pc2goKSwgMC4wMDEpOwotICB9Ci0gIENoYXJ0U3RhdGUgd291bGQ7Ci0gIHsKLSAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgd291bGQpOwotICAgIHNjb3JlLlRlcm1pbmFsKG0uR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KCJ3b3VsZCIpKTsKLSAgICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTEuNjg3ODcyLCBzY29yZS5GaW5pc2goKSwgMC4wMDEpOwotICB9Ci0gIENoYXJ0U3RhdGUgY29tYmluZV9hbHNvX3dvdWxkOwotICB7Ci0gICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGNvbWJpbmVfYWxzb193b3VsZCk7Ci0gICAgc2NvcmUuTm9uVGVybWluYWwoYWxzbywgLTEuNjg3ODcyKTsKLSAgICBzY29yZS5Ob25UZXJtaW5hbCh3b3VsZCwgLTEuNjg3ODcyKTsKLSAgICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTEuNjg3ODcyIC0gMi4wLCBzY29yZS5GaW5pc2goKSwgMC4wMDEpOwotICB9Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDIsIGNvbWJpbmVfYWxzb193b3VsZC5yaWdodC5sZW5ndGgpOwotCi0gIENoYXJ0U3RhdGUgYWxzb193b3VsZDsKLSAgewotICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBhbHNvX3dvdWxkKTsKLSAgICBzY29yZS5UZXJtaW5hbChtLkdldFZvY2FidWxhcnkoKS5JbmRleCgiYWxzbyIpKTsKLSAgICBzY29yZS5UZXJtaW5hbChtLkdldFZvY2FidWxhcnkoKS5JbmRleCgid291bGQiKSk7Ci0gICAgU0xPUFBZX0NIRUNLX0NMT1NFKC0xLjY4Nzg3MiAtIDIuMCwgc2NvcmUuRmluaXNoKCksIDAuMDAxKTsKLSAgfQotICBCT09TVF9DSEVDS19FUVVBTCgyLCBhbHNvX3dvdWxkLnJpZ2h0Lmxlbmd0aCk7Ci0KLSAgQ2hhcnRTdGF0ZSBjb25zaWRlcjsKLSAgewotICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBjb25zaWRlcik7Ci0gICAgc2NvcmUuVGVybWluYWwobS5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgoImNvbnNpZGVyIikpOwotICAgIFNMT1BQWV9DSEVDS19DTE9TRSgtMS42ODc4NzIsIHNjb3JlLkZpbmlzaCgpLCAwLjAwMSk7Ci0gIH0KLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgY29uc2lkZXIubGVmdC5sZW5ndGgpOwotICBCT09TVF9DSEVDS19FUVVBTCgxLCBjb25zaWRlci5yaWdodC5sZW5ndGgpOwotICBCT09TVF9DSEVDSyghY29uc2lkZXIubGVmdC5mdWxsKTsKLQotICBDaGFydFN0YXRlIGhpZ2hlcjsKLSAgZmxvYXQgaGlnaGVyX3Njb3JlOwotICB7Ci0gICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGhpZ2hlcik7Ci0gICAgc2NvcmUuVGVybWluYWwobS5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgoImhpZ2hlciIpKTsKLSAgICBoaWdoZXJfc2NvcmUgPSBzY29yZS5GaW5pc2goKTsKLSAgfQotICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTEuNTA5NTU5LCBoaWdoZXJfc2NvcmUsIDAuMDAxKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgaGlnaGVyLmxlZnQubGVuZ3RoKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgaGlnaGVyLnJpZ2h0Lmxlbmd0aCk7Ci0gIEJPT1NUX0NIRUNLKCFoaWdoZXIubGVmdC5mdWxsKTsKLSAgVkNoZWNrKCJoaWdoZXIiLCBoaWdoZXIucmlnaHQud29yZHNbMF0pOwotICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTAuMzAxMDMsIGhpZ2hlci5yaWdodC5iYWNrb2ZmWzBdLCAwLjAwMSk7Ci0KLSAgQ2hhcnRTdGF0ZSBjb25zaWRlcl9oaWdoZXI7Ci0gIHsKLSAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgY29uc2lkZXJfaGlnaGVyKTsKLSAgICBzY29yZS5Ob25UZXJtaW5hbChjb25zaWRlciwgLTEuNjg3ODcyKTsKLSAgICBzY29yZS5Ob25UZXJtaW5hbChoaWdoZXIsIGhpZ2hlcl9zY29yZSk7Ci0gICAgU0xPUFBZX0NIRUNLX0NMT1NFKC0xLjUwOTU1OSAtIDEuNjg3ODcyIC0gMC4zMDEwMywgc2NvcmUuRmluaXNoKCksIDAuMDAxKTsKLSAgfQotICBCT09TVF9DSEVDS19FUVVBTCgyLCBjb25zaWRlcl9oaWdoZXIubGVmdC5sZW5ndGgpOwotICBCT09TVF9DSEVDSyghY29uc2lkZXJfaGlnaGVyLmxlZnQuZnVsbCk7Ci0KLSAgQ2hhcnRTdGF0ZSBmdWxsOwotICB7Ci0gICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGZ1bGwpOwotICAgIHNjb3JlLk5vblRlcm1pbmFsKGNvbWJpbmVfYWxzb193b3VsZCwgLTEuNjg3ODcyIC0gMi4wKTsKLSAgICBzY29yZS5Ob25UZXJtaW5hbChjb25zaWRlcl9oaWdoZXIsIC0xLjUwOTU1OSAtIDEuNjg3ODcyIC0gMC4zMDEwMyk7Ci0gICAgU0xPUFBZX0NIRUNLX0NMT1NFKC0xMC42ODc5LCBzY29yZS5GaW5pc2goKSwgMC4wMDEpOwotICB9Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDQsIGZ1bGwucmlnaHQubGVuZ3RoKTsKLX0KLQotI2RlZmluZSBDSEVDS19TQ09SRShzdHIsIHZhbCkgXAoteyBcCi0gIGZsb2F0IGdvdCA9IHZhbDsgXAotICBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+IGluZGljZXM7IFwKLSAgTG9va3VwVm9jYWIobSwgc3RyLCBpbmRpY2VzKTsgXAotICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoTGVmdFRvUmlnaHQobSwgaW5kaWNlcyksIGdvdCwgMC4wMDEpOyBcCi19Ci0KLXRlbXBsYXRlIDxjbGFzcyBNPiB2b2lkIEZ1bGxHcm93KGNvbnN0IE0gJm0pIHsKLSAgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiB3b3JkczsKLSAgTG9va3VwVm9jYWIobSwgImluIGJpYXJyaXR6IHdhdGNoaW5nIGNvbnNpZGVyaW5nIGxvb2tpbmcgLiA8L3M+Iiwgd29yZHMpOwotCi0gIENoYXJ0U3RhdGUgbGV4aWNhbFs3XTsKLSAgZmxvYXQgbGV4aWNhbF9zY29yZXNbN107Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgNzsgKytpKSB7Ci0gICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGxleGljYWxbaV0pOwotICAgIHNjb3JlLlRlcm1pbmFsKHdvcmRzW2ldKTsKLSAgICBsZXhpY2FsX3Njb3Jlc1tpXSA9IHNjb3JlLkZpbmlzaCgpOwotICB9Ci0gIENIRUNLX1NDT1JFKCJpbiIsIGxleGljYWxfc2NvcmVzWzBdKTsKLSAgQ0hFQ0tfU0NPUkUoImJpYXJyaXR6IiwgbGV4aWNhbF9zY29yZXNbMV0pOwotICBDSEVDS19TQ09SRSgid2F0Y2hpbmciLCBsZXhpY2FsX3Njb3Jlc1syXSk7Ci0gIENIRUNLX1NDT1JFKCI8L3M+IiwgbGV4aWNhbF9zY29yZXNbNl0pOwotCi0gIENoYXJ0U3RhdGUgbDFbNF07Ci0gIGZsb2F0IGwxX3Njb3Jlc1s0XTsKLSAgewotICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBsMVswXSk7Ci0gICAgc2NvcmUuTm9uVGVybWluYWwobGV4aWNhbFswXSwgbGV4aWNhbF9zY29yZXNbMF0pOwotICAgIHNjb3JlLk5vblRlcm1pbmFsKGxleGljYWxbMV0sIGxleGljYWxfc2NvcmVzWzFdKTsKLSAgICBDSEVDS19TQ09SRSgiaW4gYmlhcnJpdHoiLCBsMV9zY29yZXNbMF0gPSBzY29yZS5GaW5pc2goKSk7Ci0gIH0KLSAgewotICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBsMVsxXSk7Ci0gICAgc2NvcmUuTm9uVGVybWluYWwobGV4aWNhbFsyXSwgbGV4aWNhbF9zY29yZXNbMl0pOwotICAgIHNjb3JlLk5vblRlcm1pbmFsKGxleGljYWxbM10sIGxleGljYWxfc2NvcmVzWzNdKTsKLSAgICBDSEVDS19TQ09SRSgid2F0Y2hpbmcgY29uc2lkZXJpbmciLCBsMV9zY29yZXNbMV0gPSBzY29yZS5GaW5pc2goKSk7Ci0gIH0KLSAgewotICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBsMVsyXSk7Ci0gICAgc2NvcmUuTm9uVGVybWluYWwobGV4aWNhbFs0XSwgbGV4aWNhbF9zY29yZXNbNF0pOwotICAgIHNjb3JlLk5vblRlcm1pbmFsKGxleGljYWxbNV0sIGxleGljYWxfc2NvcmVzWzVdKTsKLSAgICBDSEVDS19TQ09SRSgibG9va2luZyAuIiwgbDFfc2NvcmVzWzJdID0gc2NvcmUuRmluaXNoKCkpOwotICB9Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKGwxWzJdLmxlZnQubGVuZ3RoLCAxKTsKLSAgbDFbM10gPSBsZXhpY2FsWzZdOwotICBsMV9zY29yZXNbM10gPSBsZXhpY2FsX3Njb3Jlc1s2XTsKLQotICBDaGFydFN0YXRlIGwyWzJdOwotICBmbG9hdCBsMl9zY29yZXNbMl07Ci0gIHsKLSAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgbDJbMF0pOwotICAgIHNjb3JlLk5vblRlcm1pbmFsKGwxWzBdLCBsMV9zY29yZXNbMF0pOwotICAgIHNjb3JlLk5vblRlcm1pbmFsKGwxWzFdLCBsMV9zY29yZXNbMV0pOwotICAgIENIRUNLX1NDT1JFKCJpbiBiaWFycml0eiB3YXRjaGluZyBjb25zaWRlcmluZyIsIGwyX3Njb3Jlc1swXSA9IHNjb3JlLkZpbmlzaCgpKTsKLSAgfQotICB7Ci0gICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGwyWzFdKTsKLSAgICBzY29yZS5Ob25UZXJtaW5hbChsMVsyXSwgbDFfc2NvcmVzWzJdKTsKLSAgICBzY29yZS5Ob25UZXJtaW5hbChsMVszXSwgbDFfc2NvcmVzWzNdKTsKLSAgICBDSEVDS19TQ09SRSgibG9va2luZyAuIDwvcz4iLCBsMl9zY29yZXNbMV0gPSBzY29yZS5GaW5pc2goKSk7Ci0gIH0KLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobDJbMV0ubGVmdC5sZW5ndGgsIDEpOwotICBCT09TVF9DSEVDSyhsMlsxXS5sZWZ0LmZ1bGwpOwotCi0gIENoYXJ0U3RhdGUgdG9wOwotICB7Ci0gICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIHRvcCk7Ci0gICAgc2NvcmUuTm9uVGVybWluYWwobDJbMF0sIGwyX3Njb3Jlc1swXSk7Ci0gICAgc2NvcmUuTm9uVGVybWluYWwobDJbMV0sIGwyX3Njb3Jlc1sxXSk7Ci0gICAgQ0hFQ0tfU0NPUkUoImluIGJpYXJyaXR6IHdhdGNoaW5nIGNvbnNpZGVyaW5nIGxvb2tpbmcgLiA8L3M+Iiwgc2NvcmUuRmluaXNoKCkpOwotICB9Ci19Ci0KLWNvbnN0IGNoYXIgKkZpbGVMb2NhdGlvbigpIHsKLSAgaWYgKGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIDwgMikgewotICAgIHJldHVybiAidGVzdC5hcnBhIjsKLSAgfQotICByZXR1cm4gYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbMV07Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBNPiB2b2lkIEV2ZXJ5dGhpbmcoKSB7Ci0gIENvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy5tZXNzYWdlcyA9IE5VTEw7Ci0gIE0gbShGaWxlTG9jYXRpb24oKSwgY29uZmlnKTsKLQotICBTaG9ydChtKTsKLSAgQ2hhcmdlKG0pOwotICBHcm93QmlnKG0pOwotICBBbHNvV291bGRDb25zaWRlckhpZ2hlcihtKTsKLSAgR3Jvd1NtYWxsKG0pOwotICBGdWxsR3JvdyhtKTsKLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoUHJvYmluZ0FsbCkgewotICBFdmVyeXRoaW5nPE1vZGVsPigpOwotfQotQk9PU1RfQVVUT19URVNUX0NBU0UoVHJpZUFsbCkgewotICBFdmVyeXRoaW5nPFRyaWVNb2RlbD4oKTsKLX0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKFF1YW50VHJpZUFsbCkgewotICBFdmVyeXRoaW5nPFF1YW50VHJpZU1vZGVsPigpOwotfQotQk9PU1RfQVVUT19URVNUX0NBU0UoQXJyYXlRdWFudFRyaWVBbGwpIHsKLSAgRXZlcnl0aGluZzxRdWFudEFycmF5VHJpZU1vZGVsPigpOwotfQotQk9PU1RfQVVUT19URVNUX0NBU0UoQXJyYXlUcmllQWxsKSB7Ci0gIEV2ZXJ5dGhpbmc8QXJyYXlUcmllTW9kZWw+KCk7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKFJlc3RQcm9iaW5nKSB7Ci0gIENvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy5tZXNzYWdlcyA9IE5VTEw7Ci0gIFJlc3RQcm9iaW5nTW9kZWwgbShGaWxlTG9jYXRpb24oKSwgY29uZmlnKTsKLSAgR3Jvd0JpZyhtLCB0cnVlKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UKLX0gLy8gbmFtZXNwYWNlIG5ncmFtCi19IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2xtX2V4Y2VwdGlvbi5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9sbV9leGNlcHRpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNTcyZTkuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2xtX2V4Y2VwdGlvbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCi0KLSNpbmNsdWRlPGVycm5vLmg+Ci0jaW5jbHVkZTxzdGRpby5oPgotCi1uYW1lc3BhY2UgbG0gewotCi1Db25maWdFeGNlcHRpb246OkNvbmZpZ0V4Y2VwdGlvbigpIHRocm93KCkge30KLUNvbmZpZ0V4Y2VwdGlvbjo6fkNvbmZpZ0V4Y2VwdGlvbigpIHRocm93KCkge30KLQotTG9hZEV4Y2VwdGlvbjo6TG9hZEV4Y2VwdGlvbigpIHRocm93KCkge30KLUxvYWRFeGNlcHRpb246On5Mb2FkRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotCi1Gb3JtYXRMb2FkRXhjZXB0aW9uOjpGb3JtYXRMb2FkRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotRm9ybWF0TG9hZEV4Y2VwdGlvbjo6fkZvcm1hdExvYWRFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLVZvY2FiTG9hZEV4Y2VwdGlvbjo6Vm9jYWJMb2FkRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotVm9jYWJMb2FkRXhjZXB0aW9uOjp+Vm9jYWJMb2FkRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotCi1TcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb246OlNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbigpIHRocm93KCkge30KLVNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbjo6flNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbigpIHRocm93KCkge30KLQotfSAvLyBuYW1lc3BhY2UgbG0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9sbV9leGNlcHRpb24uaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbG1fZXhjZXB0aW9uLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmI2MTA4Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9sbV9leGNlcHRpb24uaGgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jaWZuZGVmIExNX0xNX0VYQ0VQVElPTl9ICi0jZGVmaW5lIExNX0xNX0VYQ0VQVElPTl9ICi0KLS8vIE5hbWVkIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggdXRpbC9leGNlcHRpb24uaGguICAKLQotI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlLmhoIgotCi0jaW5jbHVkZSA8ZXhjZXB0aW9uPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGxtIHsKLQotdHlwZWRlZiBlbnVtIHtUSFJPV19VUCwgQ09NUExBSU4sIFNJTEVOVH0gV2FybmluZ0FjdGlvbjsKLQotY2xhc3MgQ29uZmlnRXhjZXB0aW9uIDogcHVibGljIHV0aWw6OkV4Y2VwdGlvbiB7Ci0gIHB1YmxpYzoKLSAgICBDb25maWdFeGNlcHRpb24oKSB0aHJvdygpOwotICAgIH5Db25maWdFeGNlcHRpb24oKSB0aHJvdygpOwotfTsKLQotY2xhc3MgTG9hZEV4Y2VwdGlvbiA6IHB1YmxpYyB1dGlsOjpFeGNlcHRpb24gewotICAgcHVibGljOgotICAgICAgdmlydHVhbCB+TG9hZEV4Y2VwdGlvbigpIHRocm93KCk7Ci0KLSAgIHByb3RlY3RlZDoKLSAgICAgIExvYWRFeGNlcHRpb24oKSB0aHJvdygpOwotfTsKLQotY2xhc3MgRm9ybWF0TG9hZEV4Y2VwdGlvbiA6IHB1YmxpYyBMb2FkRXhjZXB0aW9uIHsKLSAgcHVibGljOgotICAgIEZvcm1hdExvYWRFeGNlcHRpb24oKSB0aHJvdygpOwotICAgIH5Gb3JtYXRMb2FkRXhjZXB0aW9uKCkgdGhyb3coKTsKLX07Ci0KLWNsYXNzIFZvY2FiTG9hZEV4Y2VwdGlvbiA6IHB1YmxpYyBMb2FkRXhjZXB0aW9uIHsKLSAgcHVibGljOgotICAgIHZpcnR1YWwgflZvY2FiTG9hZEV4Y2VwdGlvbigpIHRocm93KCk7Ci0gICAgVm9jYWJMb2FkRXhjZXB0aW9uKCkgdGhyb3coKTsKLX07Ci0KLWNsYXNzIFNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbiA6IHB1YmxpYyBWb2NhYkxvYWRFeGNlcHRpb24gewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgU3BlY2lhbFdvcmRNaXNzaW5nRXhjZXB0aW9uKCkgdGhyb3coKTsKLSAgICB+U3BlY2lhbFdvcmRNaXNzaW5nRXhjZXB0aW9uKCkgdGhyb3coKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGxtCi0KLSNlbmRpZiAvLyBMTV9MTV9FWENFUFRJT04KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9tYXhfb3JkZXIuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbWF4X29yZGVyLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjE4MWYzLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9tYXhfb3JkZXIuaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jaWZuZGVmIExNX01BWF9PUkRFUl9ICi0jZGVmaW5lIExNX01BWF9PUkRFUl9ICi0vKiBJRiBZT1VSIEJVSUxEIFNZU1RFTSBQQVNTRVMgLURLRU5MTV9NQVhfT1JERVIsIFRIRU4gQ0hBTkdFIFRIRSBCVUlMRCBTWVNURU0uCi0gKiBJZiBub3QsIHRoaXMgaXMgdGhlIGRlZmF1bHQgbWF4aW11bSBvcmRlci4gIAotICogSGF2aW5nIHRoaXMgbGltaXQgbWVhbnMgdGhhdCBTdGF0ZSBjYW4gYmUKLSAqIChrTWF4T3JkZXIgLSAxKSAqIHNpemVvZihmbG9hdCkgYnl0ZXMgaW5zdGVhZCBvZgotICogc2l6ZW9mKGZsb2F0KikgKyAoa01heE9yZGVyIC0gMSkgKiBzaXplb2YoZmxvYXQpICsgbWFsbG9jIG92ZXJoZWFkCi0gKi8KLSNpZm5kZWYgS0VOTE1fT1JERVJfTUVTU0FHRQotI2RlZmluZSBLRU5MTV9PUkRFUl9NRVNTQUdFICJJZiB5b3VyIGJ1aWxkIHN5c3RlbSBzdXBwb3J0cyBjaGFuZ2luZyBLRU5MTV9NQVhfT1JERVIsIGNoYW5nZSBpdCB0aGVyZSBhbmQgcmVjb21waWxlLiAgSW4gdGhlIEtlbkxNIHRhcmJhbGwgb3IgTW9zZXMsIHVzZSBlLmcuIGBiamFtIC0tbWF4LWtlbmxtLW9yZGVyPTYgLWEnLiAgT3RoZXJ3aXNlLCBlZGl0IGxtL21heF9vcmRlci5oaC4iCi0jZW5kaWYKLQotI2VuZGlmIC8vIExNX01BWF9PUkRFUl9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbW9kZWwuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbW9kZWwuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MjVhNTYuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL21vZGVsLmhoCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSNpZm5kZWYgTE1fTU9ERUxfSAotI2RlZmluZSBMTV9NT0RFTF9ICi0KLSNpbmNsdWRlICJsbS9iaGlrc2hhLmhoIgotI2luY2x1ZGUgImxtL2JpbmFyeV9mb3JtYXQuaGgiCi0jaW5jbHVkZSAibG0vY29uZmlnLmhoIgotI2luY2x1ZGUgImxtL2ZhY2FkZS5oaCIKLSNpbmNsdWRlICJsbS9xdWFudGl6ZS5oaCIKLSNpbmNsdWRlICJsbS9zZWFyY2hfaGFzaGVkLmhoIgotI2luY2x1ZGUgImxtL3NlYXJjaF90cmllLmhoIgotI2luY2x1ZGUgImxtL3N0YXRlLmhoIgotI2luY2x1ZGUgImxtL3ZhbHVlLmhoIgotI2luY2x1ZGUgImxtL3ZvY2FiLmhoIgotI2luY2x1ZGUgImxtL3dlaWdodHMuaGgiCi0KLSNpbmNsdWRlICJ1dGlsL211cm11cl9oYXNoLmhoIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1uYW1lc3BhY2UgdXRpbCB7IGNsYXNzIEZpbGVQaWVjZTsgfQotCi1uYW1lc3BhY2UgbG0gewotbmFtZXNwYWNlIG5ncmFtIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0vLyBTaG91bGQgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdHMgYXMgU1JJLiAgCi0vLyBNb2RlbEZhY2FkZSB0eXBlZGVmcyBWb2NhYnVsYXJ5IHNvIHdlIHVzZSBWb2NhYnVsYXJ5VCB0byBhdm9pZCBuYW1pbmcgY29uZmxpY3RzLgotdGVtcGxhdGUgPGNsYXNzIFNlYXJjaCwgY2xhc3MgVm9jYWJ1bGFyeVQ+IGNsYXNzIEdlbmVyaWNNb2RlbCA6IHB1YmxpYyBiYXNlOjpNb2RlbEZhY2FkZTxHZW5lcmljTW9kZWw8U2VhcmNoLCBWb2NhYnVsYXJ5VD4sIFN0YXRlLCBWb2NhYnVsYXJ5VD4gewotICBwcml2YXRlOgotICAgIHR5cGVkZWYgYmFzZTo6TW9kZWxGYWNhZGU8R2VuZXJpY01vZGVsPFNlYXJjaCwgVm9jYWJ1bGFyeVQ+LCBTdGF0ZSwgVm9jYWJ1bGFyeVQ+IFA7Ci0gIHB1YmxpYzoKLSAgICAvLyBUaGlzIGlzIHRoZSBtb2RlbCB0eXBlIHJldHVybmVkIGJ5IFJlY29nbml6ZUJpbmFyeS4KLSAgICBzdGF0aWMgY29uc3QgTW9kZWxUeXBlIGtNb2RlbFR5cGU7Ci0KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtWZXJzaW9uID0gU2VhcmNoOjprVmVyc2lvbjsKLQotICAgIC8qIEdldCB0aGUgc2l6ZSBvZiBtZW1vcnkgdGhhdCB3aWxsIGJlIG1hcHBlZCBnaXZlbiBuZ3JhbSBjb3VudHMuICBUaGlzCi0gICAgICogZG9lcyBub3QgaW5jbHVkZSBzbWFsbCBub24tbWFwcGVkIGNvbnRyb2wgc3RydWN0dXJlcywgc3VjaCBhcyB0aGlzIGNsYXNzCi0gICAgICogaXRzZWxmLiAgCi0gICAgICovCi0gICAgc3RhdGljIHVpbnQ2NF90IFNpemUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIGNvbnN0IENvbmZpZyAmY29uZmlnID0gQ29uZmlnKCkpOwotCi0gICAgLyogTG9hZCB0aGUgbW9kZWwgZnJvbSBhIGZpbGUuICBJdCBtYXkgYmUgYW4gQVJQQSBvciBiaW5hcnkgZmlsZS4gIEJpbmFyeQotICAgICAqIGZpbGVzIG11c3QgaGF2ZSB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoaXMgY2xhc3Mgb3IgeW91J2xsIGdldCBhbgotICAgICAqIGV4Y2VwdGlvbi4gIFNvIFRyaWVNb2RlbCBjYW4gb25seSBsb2FkIEFSUEEgb3IgYmluYXJ5IGNyZWF0ZWQgYnkKLSAgICAgKiBUcmllTW9kZWwuICBUbyBjbGFzc2lmeSBiaW5hcnkgZmlsZXMsIGNhbGwgUmVjb2duaXplQmluYXJ5IGluCi0gICAgICogbG0vYmluYXJ5X2Zvcm1hdC5oaC4gIAotICAgICAqLwotICAgIGV4cGxpY2l0IEdlbmVyaWNNb2RlbChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBDb25maWcgJmNvbmZpZyA9IENvbmZpZygpKTsKLQotICAgIC8qIFNjb3JlIHAobmV3X3dvcmQgfCBpbl9zdGF0ZSkgYW5kIGluY29ycG9yYXRlIG5ld193b3JkIGludG8gb3V0X3N0YXRlLgotICAgICAqIE5vdGUgdGhhdCBpbl9zdGF0ZSBhbmQgb3V0X3N0YXRlIG11c3QgYmUgZGlmZmVyZW50IHJlZmVyZW5jZXM6Ci0gICAgICogJmluX3N0YXRlICE9ICZvdXRfc3RhdGUuICAKLSAgICAgKi8KLSAgICBGdWxsU2NvcmVSZXR1cm4gRnVsbFNjb3JlKGNvbnN0IFN0YXRlICZpbl9zdGF0ZSwgY29uc3QgV29yZEluZGV4IG5ld193b3JkLCBTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdDsKLQotICAgIC8qIFNsb3dlciBjYWxsIHdpdGhvdXQgaW5fc3RhdGUuICBUcnkgdG8gcmVtZW1iZXIgc3RhdGUsIGJ1dCBzb21ldGltZXMgaXQKLSAgICAgKiB3b3VsZCBjb3N0IHRvbyBtdWNoIG1lbW9yeSBvciB5b3VyIGRlY29kZXIgaXNuJ3Qgc2V0dXAgcHJvcGVybHkuICAKLSAgICAgKiBUbyB1c2UgdGhpcyBmdW5jdGlvbiwgbWFrZSBhbiBhcnJheSBvZiBXb3JkSW5kZXggY29udGFpbmluZyB0aGUgY29udGV4dAotICAgICAqIHZvY2FidWxhcnkgaWRzIGluIHJldmVyc2Ugb3JkZXIuICBUaGVuLCBwYXNzIHRoZSBib3VuZHMgb2YgdGhlIGFycmF5OgotICAgICAqIFtjb250ZXh0X3JiZWdpbiwgY29udGV4dF9yZW5kKS4gIFRoZSBuZXdfd29yZCBpcyBub3QgcGFydCBvZiB0aGUgY29udGV4dAotICAgICAqIGFycmF5IHVubGVzcyB5b3UgaW50ZW5kIHRvIHJlcGVhdCB3b3Jkcy4gIAotICAgICAqLwotICAgIEZ1bGxTY29yZVJldHVybiBGdWxsU2NvcmVGb3Jnb3RTdGF0ZShjb25zdCBXb3JkSW5kZXggKmNvbnRleHRfcmJlZ2luLCBjb25zdCBXb3JkSW5kZXggKmNvbnRleHRfcmVuZCwgY29uc3QgV29yZEluZGV4IG5ld193b3JkLCBTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdDsKLQotICAgIC8qIEdldCB0aGUgc3RhdGUgZm9yIGEgY29udGV4dC4gIERvbid0IHVzZSB0aGlzIGlmIHlvdSBjYW4gYXZvaWQgaXQuICBVc2UKLSAgICAgKiBCZWdpblNlbnRlbmNlU3RhdGUgb3IgTnVsbENvbnRleHRTdGF0ZSBhbmQgZXh0ZW5kIGZyb20gdGhvc2UuICBJZgotICAgICAqIHlvdSdyZSBvbmx5IGdvaW5nIHRvIHVzZSB0aGlzIHN0YXRlIHRvIGNhbGwgRnVsbFNjb3JlIG9uY2UsIHVzZQotICAgICAqIEZ1bGxTY29yZUZvcmdvdFN0YXRlLiAKLSAgICAgKiBUbyB1c2UgdGhpcyBmdW5jdGlvbiwgbWFrZSBhbiBhcnJheSBvZiBXb3JkSW5kZXggY29udGFpbmluZyB0aGUgY29udGV4dAotICAgICAqIHZvY2FidWxhcnkgaWRzIGluIHJldmVyc2Ugb3JkZXIuICBUaGVuLCBwYXNzIHRoZSBib3VuZHMgb2YgdGhlIGFycmF5OgotICAgICAqIFtjb250ZXh0X3JiZWdpbiwgY29udGV4dF9yZW5kKS4gIAotICAgICAqLwotICAgIHZvaWQgR2V0U3RhdGUoY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JiZWdpbiwgY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JlbmQsIFN0YXRlICZvdXRfc3RhdGUpIGNvbnN0OwotCi0gICAgLyogTW9yZSBlZmZpY2llbnQgdmVyc2lvbiBvZiBGdWxsU2NvcmUgd2hlcmUgYSBwYXJ0aWFsIG4tZ3JhbSBoYXMgYWxyZWFkeQotICAgICAqIGJlZW4gc2NvcmVkLiAgCi0gICAgICogTk9URTogVEhFIFJFVFVSTkVEIC5yZXN0IEFORCAucHJvYiBBUkUgUkVMQVRJVkUgVE8gVEhFIC5yZXN0IFJFVFVSTkVEIEJFRk9SRS4gIAotICAgICAqLwotICAgIEZ1bGxTY29yZVJldHVybiBFeHRlbmRMZWZ0KAotICAgICAgICAvLyBBZGRpdGlvbmFsIGNvbnRleHQgaW4gcmV2ZXJzZSBvcmRlci4gIFRoaXMgd2lsbCB1cGRhdGUgYWRkX3JlbmQgdG8gCi0gICAgICAgIGNvbnN0IFdvcmRJbmRleCAqYWRkX3JiZWdpbiwgY29uc3QgV29yZEluZGV4ICphZGRfcmVuZCwKLSAgICAgICAgLy8gQmFja29mZiB3ZWlnaHRzIHRvIHVzZS4gIAotICAgICAgICBjb25zdCBmbG9hdCAqYmFja29mZl9pbiwKLSAgICAgICAgLy8gZXh0ZW5kX2xlZnQgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBxdWVyeS4KLSAgICAgICAgdWludDY0X3QgZXh0ZW5kX3BvaW50ZXIsCi0gICAgICAgIC8vIExlbmd0aCBvZiBuLWdyYW0gdGhhdCB0aGUgcG9pbnRlciBjb3JyZXNwb25kcyB0by4gIAotICAgICAgICB1bnNpZ25lZCBjaGFyIGV4dGVuZF9sZW5ndGgsCi0gICAgICAgIC8vIFdoZXJlIHRvIHdyaXRlIGFkZGl0aW9uYWwgYmFja29mZnMgZm9yIFtleHRlbmRfbGVuZ3RoICsgMSwgbWluKE9yZGVyKCkgLSAxLCByZXR1cm4ubmdyYW1fbGVuZ3RoKV0KLSAgICAgICAgZmxvYXQgKmJhY2tvZmZfb3V0LAotICAgICAgICAvLyBBbW91bnQgb2YgYWRkaXRpb25hbCBjb250ZW50IHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYnkgdGhlIG5leHQgY2FsbC4KLSAgICAgICAgdW5zaWduZWQgY2hhciAmbmV4dF91c2UpIGNvbnN0OwotCi0gICAgLyogUmV0dXJuIHByb2JhYmlsaXRpZXMgbWludXMgcmVzdCBjb3N0cyBmb3IgYW4gYXJyYXkgb2YgcG9pbnRlcnMuICBUaGUKLSAgICAgKiBmaXJzdCBsZW5ndGggc2hvdWxkIGJlIHRoZSBsZW5ndGggb2YgdGhlIG4tZ3JhbSB0byB3aGljaCBwb2ludGVyc19iZWdpbgotICAgICAqIHBvaW50cy4gIAotICAgICAqLwotICAgIGZsb2F0IFVuUmVzdChjb25zdCB1aW50NjRfdCAqcG9pbnRlcnNfYmVnaW4sIGNvbnN0IHVpbnQ2NF90ICpwb2ludGVyc19lbmQsIHVuc2lnbmVkIGNoYXIgZmlyc3RfbGVuZ3RoKSBjb25zdCB7Ci0gICAgICAvLyBDb21waWxlciBzaG91bGQgb3B0aW1pemUgdGhpcyBpZiBhd2F5LiAgCi0gICAgICByZXR1cm4gU2VhcmNoOjprRGlmZmVyZW50UmVzdCA/IEludGVybmFsVW5SZXN0KHBvaW50ZXJzX2JlZ2luLCBwb2ludGVyc19lbmQsIGZpcnN0X2xlbmd0aCkgOiAwLjA7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgRnVsbFNjb3JlUmV0dXJuIFNjb3JlRXhjZXB0QmFja29mZihjb25zdCBXb3JkSW5kZXggKmNvbnN0IGNvbnRleHRfcmJlZ2luLCBjb25zdCBXb3JkSW5kZXggKmNvbnN0IGNvbnRleHRfcmVuZCwgY29uc3QgV29yZEluZGV4IG5ld193b3JkLCBTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdDsKLQotICAgIC8vIFNjb3JlIGJpZ3JhbXMgYW5kIGFib3ZlLiAgRG8gbm90IGluY2x1ZGUgYmFja29mZi4gICAKLSAgICB2b2lkIFJlc3VtZVNjb3JlKGNvbnN0IFdvcmRJbmRleCAqY29udGV4dF9yYmVnaW4sIGNvbnN0IFdvcmRJbmRleCAqY29uc3QgY29udGV4dF9yZW5kLCB1bnNpZ25lZCBjaGFyIHN0YXJ0aW5nX29yZGVyX21pbnVzXzIsIHR5cGVuYW1lIFNlYXJjaDo6Tm9kZSAmbm9kZSwgZmxvYXQgKmJhY2tvZmZfb3V0LCB1bnNpZ25lZCBjaGFyICZuZXh0X3VzZSwgRnVsbFNjb3JlUmV0dXJuICZyZXQpIGNvbnN0OwotCi0gICAgLy8gQXBwZWFycyBhZnRlciBTaXplIGluIHRoZSBjYyBmaWxlLgotICAgIHZvaWQgU2V0dXBNZW1vcnkodm9pZCAqc3RhcnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzLCBjb25zdCBDb25maWcgJmNvbmZpZyk7Ci0KLSAgICB2b2lkIEluaXRpYWxpemVGcm9tQVJQQShpbnQgZmQsIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IENvbmZpZyAmY29uZmlnKTsKLQotICAgIGZsb2F0IEludGVybmFsVW5SZXN0KGNvbnN0IHVpbnQ2NF90ICpwb2ludGVyc19iZWdpbiwgY29uc3QgdWludDY0X3QgKnBvaW50ZXJzX2VuZCwgdW5zaWduZWQgY2hhciBmaXJzdF9sZW5ndGgpIGNvbnN0OwotCi0gICAgQmluYXJ5Rm9ybWF0IGJhY2tpbmdfOwotICAgIAotICAgIFZvY2FidWxhcnlUIHZvY2FiXzsKLQotICAgIFNlYXJjaCBzZWFyY2hfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLS8vIEluc3RlYWQgb2YgdHlwZWRlZiwgaW5oZXJpdC4gIFRoaXMgYWxsb3dzIHRoZSBNb2RlbCBldGMgdG8gYmUgZm9yd2FyZCBkZWNsYXJlZC4gIAotLy8gT2ggdGhlIGpveXMgb2YgQyBhbmQgQysrLiAKLSNkZWZpbmUgTE1fQ09NTUEoKSAsCi0jZGVmaW5lIExNX05BTUVfTU9ERUwobmFtZSwgZnJvbSlcCi1jbGFzcyBuYW1lIDogcHVibGljIGZyb20ge1wKLSAgcHVibGljOlwKLSAgICBuYW1lKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IENvbmZpZyAmY29uZmlnID0gQ29uZmlnKCkpIDogZnJvbShmaWxlLCBjb25maWcpIHt9XAotfTsKLQotTE1fTkFNRV9NT0RFTChQcm9iaW5nTW9kZWwsIGRldGFpbDo6R2VuZXJpY01vZGVsPGRldGFpbDo6SGFzaGVkU2VhcmNoPEJhY2tvZmZWYWx1ZT4gTE1fQ09NTUEoKSBQcm9iaW5nVm9jYWJ1bGFyeT4pOwotTE1fTkFNRV9NT0RFTChSZXN0UHJvYmluZ01vZGVsLCBkZXRhaWw6OkdlbmVyaWNNb2RlbDxkZXRhaWw6Okhhc2hlZFNlYXJjaDxSZXN0VmFsdWU+IExNX0NPTU1BKCkgUHJvYmluZ1ZvY2FidWxhcnk+KTsKLUxNX05BTUVfTU9ERUwoVHJpZU1vZGVsLCBkZXRhaWw6OkdlbmVyaWNNb2RlbDx0cmllOjpUcmllU2VhcmNoPERvbnRRdWFudGl6ZSBMTV9DT01NQSgpIHRyaWU6OkRvbnRCaGlrc2hhPiBMTV9DT01NQSgpIFNvcnRlZFZvY2FidWxhcnk+KTsKLUxNX05BTUVfTU9ERUwoQXJyYXlUcmllTW9kZWwsIGRldGFpbDo6R2VuZXJpY01vZGVsPHRyaWU6OlRyaWVTZWFyY2g8RG9udFF1YW50aXplIExNX0NPTU1BKCkgdHJpZTo6QXJyYXlCaGlrc2hhPiBMTV9DT01NQSgpIFNvcnRlZFZvY2FidWxhcnk+KTsKLUxNX05BTUVfTU9ERUwoUXVhbnRUcmllTW9kZWwsIGRldGFpbDo6R2VuZXJpY01vZGVsPHRyaWU6OlRyaWVTZWFyY2g8U2VwYXJhdGVseVF1YW50aXplIExNX0NPTU1BKCkgdHJpZTo6RG9udEJoaWtzaGE+IExNX0NPTU1BKCkgU29ydGVkVm9jYWJ1bGFyeT4pOwotTE1fTkFNRV9NT0RFTChRdWFudEFycmF5VHJpZU1vZGVsLCBkZXRhaWw6OkdlbmVyaWNNb2RlbDx0cmllOjpUcmllU2VhcmNoPFNlcGFyYXRlbHlRdWFudGl6ZSBMTV9DT01NQSgpIHRyaWU6OkFycmF5Qmhpa3NoYT4gTE1fQ09NTUEoKSBTb3J0ZWRWb2NhYnVsYXJ5Pik7Ci0KLS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24uICBObyByZWFsIHJlYXNvbiBmb3IgaXQgdG8gYmUgdGhlIGRlZmF1bHQuICAKLXR5cGVkZWYgOjpsbTo6bmdyYW06OlByb2JpbmdWb2NhYnVsYXJ5IFZvY2FidWxhcnk7Ci10eXBlZGVmIFByb2JpbmdNb2RlbCBNb2RlbDsKLQotLyogQXV0b3JlY29nbml6ZSB0aGUgZmlsZSB0eXBlLCBsb2FkLCBhbmQgcmV0dXJuIHRoZSB2aXJ0dWFsIGJhc2UgY2xhc3MuICBEb24ndAotICogdXNlIHRoZSB2aXJ0dWFsIGJhc2UgY2xhc3MgaWYgeW91IGNhbiBhdm9pZCBpdC4gIEluc3RlYWQsIHVzZSB0aGUgYWJvdmUKLSAqIGNsYXNzZXMgYXMgdGVtcGxhdGUgYXJndW1lbnRzIHRvIHlvdXIgb3duIHZpcnR1YWwgZmVhdHVyZSBmdW5jdGlvbi4qLwotYmFzZTo6TW9kZWwgKkxvYWRWaXJ0dWFsKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgY29uc3QgQ29uZmlnICZjb25maWcgPSBDb25maWcoKSwgTW9kZWxUeXBlIGlmX2FycGEgPSBQUk9CSU5HKTsKLQotfSAvLyBuYW1lc3BhY2UgbmdyYW0KLX0gLy8gbmFtZXNwYWNlIGxtCi0KLSNlbmRpZiAvLyBMTV9NT0RFTF9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbW9kZWxfdGVzdC5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9tb2RlbF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjU0NzI0Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9tb2RlbF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLSNpbmNsdWRlICJsbS9tb2RlbC5oaCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIE1vZGVsVGVzdAotI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KLSNpbmNsdWRlIDxib29zdC90ZXN0L2Zsb2F0aW5nX3BvaW50X2NvbXBhcmlzb24uaHBwPgotCi0vLyBBcHBhcmVudGx5IHNvbWUgQm9vc3QgdmVyc2lvbnMgdXNlIHRlbXBsYXRlcyBhbmQgYXJlIHByZXR0eSBzdHJpY3QgYWJvdXQgdHlwZXMgbWF0Y2hpbmcuICAKLSNkZWZpbmUgU0xPUFBZX0NIRUNLX0NMT1NFKHJlZiwgdmFsdWUsIHRvbCkgQk9PU1RfQ0hFQ0tfQ0xPU0Uoc3RhdGljX2Nhc3Q8ZG91YmxlPihyZWYpLCBzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSwgc3RhdGljX2Nhc3Q8ZG91YmxlPih0b2wpKTsKLQotbmFtZXNwYWNlIGxtIHsKLW5hbWVzcGFjZSBuZ3JhbSB7Ci0KLXN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm8sIGNvbnN0IFN0YXRlICZzdGF0ZSkgewotICBvIDw8ICJTdGF0ZSBsZW5ndGggIiA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHN0YXRlLmxlbmd0aCkgPDwgJzonOwotICBmb3IgKGNvbnN0IFdvcmRJbmRleCAqaSA9IHN0YXRlLndvcmRzOyBpIDwgc3RhdGUud29yZHMgKyBzdGF0ZS5sZW5ndGg7ICsraSkgewotICAgIG8gPDwgJyAnIDw8ICppOwotICB9Ci0gIHJldHVybiBvOwotfQotCi1uYW1lc3BhY2UgewotCi0vLyBTdHVwaWQgYmphbSByZXZlcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyByYW5kb21seS4KLWNvbnN0IGNoYXIgKlRlc3RMb2NhdGlvbigpIHsKLSAgaWYgKGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIDwgMykgewotICAgIHJldHVybiAidGVzdC5hcnBhIjsKLSAgfQotICBjaGFyICoqYXJndiA9IGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2OwotICByZXR1cm4gYXJndltzdHJzdHIoYXJndlsxXSwgIm5vdW5rIikgPyAyIDogMV07Ci19Ci1jb25zdCBjaGFyICpUZXN0Tm9VbmtMb2NhdGlvbigpIHsKLSAgaWYgKGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIDwgMykgewotICAgIHJldHVybiAidGVzdF9ub3Vuay5hcnBhIjsKLSAgfQotICBjaGFyICoqYXJndiA9IGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2OwotICByZXR1cm4gYXJndltzdHJzdHIoYXJndlsxXSwgIm5vdW5rIikgPyAxIDogMl07Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBNb2RlbD4gU3RhdGUgR2V0U3RhdGUoY29uc3QgTW9kZWwgJm1vZGVsLCBjb25zdCBjaGFyICp3b3JkLCBjb25zdCBTdGF0ZSAmaW4pIHsKLSAgV29yZEluZGV4IGNvbnRleHRbaW4ubGVuZ3RoICsgMV07Ci0gIGNvbnRleHRbMF0gPSBtb2RlbC5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgod29yZCk7Ci0gIHN0ZDo6Y29weShpbi53b3JkcywgaW4ud29yZHMgKyBpbi5sZW5ndGgsIGNvbnRleHQgKyAxKTsKLSAgU3RhdGUgcmV0OwotICBtb2RlbC5HZXRTdGF0ZShjb250ZXh0LCBjb250ZXh0ICsgaW4ubGVuZ3RoICsgMSwgcmV0KTsKLSAgcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBTdGFydFRlc3Qod29yZCwgbmdyYW0sIHNjb3JlLCBpbmRlcF9sZWZ0KSBcCi0gIHJldCA9IG1vZGVsLkZ1bGxTY29yZSggXAotICAgICAgc3RhdGUsIFwKLSAgICAgIG1vZGVsLkdldFZvY2FidWxhcnkoKS5JbmRleCh3b3JkKSwgXAotICAgICAgb3V0KTtcCi0gIFNMT1BQWV9DSEVDS19DTE9TRShzY29yZSwgcmV0LnByb2IsIDAuMDAxKTsgXAotICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KG5ncmFtKSwgcmV0Lm5ncmFtX2xlbmd0aCk7IFwKLSAgQk9PU1RfQ0hFQ0tfR0Uoc3RkOjptaW48dW5zaWduZWQgY2hhcj4obmdyYW0sIDUgLSAxKSwgb3V0Lmxlbmd0aCk7IFwKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5kZXBfbGVmdCwgcmV0LmluZGVwZW5kZW50X2xlZnQpOyBcCi0gIEJPT1NUX0NIRUNLX0VRVUFMKG91dCwgR2V0U3RhdGUobW9kZWwsIHdvcmQsIHN0YXRlKSk7Ci0KLSNkZWZpbmUgQXBwZW5kVGVzdCh3b3JkLCBuZ3JhbSwgc2NvcmUsIGluZGVwX2xlZnQpIFwKLSAgU3RhcnRUZXN0KHdvcmQsIG5ncmFtLCBzY29yZSwgaW5kZXBfbGVmdCkgXAotICBzdGF0ZSA9IG91dDsKLQotdGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgU3RhcnRlcnMoY29uc3QgTSAmbW9kZWwpIHsKLSAgRnVsbFNjb3JlUmV0dXJuIHJldDsKLSAgTW9kZWw6OlN0YXRlIHN0YXRlKG1vZGVsLkJlZ2luU2VudGVuY2VTdGF0ZSgpKTsKLSAgTW9kZWw6OlN0YXRlIG91dDsKLQotICBTdGFydFRlc3QoImxvb2tpbmciLCAyLCAtMC40ODQ2NTIyLCB0cnVlKTsKLQotICAvLyAsIHByb2JhYmlsaXR5IHBsdXMgPHM+IGJhY2tvZmYKLSAgU3RhcnRUZXN0KCIsIiwgMSwgLTEuMzgzNTE0ICsgLTAuNDE0OTczMywgdHJ1ZSk7Ci0gIC8vIDx1bms+IHByb2JhYmlsaXR5IHBsdXMgPHM+IGJhY2tvZmYKLSAgU3RhcnRUZXN0KCJ0aGlzX2lzX25vdF9mb3VuZCIsIDEsIC0xLjk5NTYzNSArIC0wLjQxNDk3MzMsIHRydWUpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTT4gdm9pZCBDb250aW51YXRpb24oY29uc3QgTSAmbW9kZWwpIHsKLSAgRnVsbFNjb3JlUmV0dXJuIHJldDsKLSAgTW9kZWw6OlN0YXRlIHN0YXRlKG1vZGVsLkJlZ2luU2VudGVuY2VTdGF0ZSgpKTsKLSAgTW9kZWw6OlN0YXRlIG91dDsKLQotICBBcHBlbmRUZXN0KCJsb29raW5nIiwgMiwgLTAuNDg0NjUyLCB0cnVlKTsKLSAgQXBwZW5kVGVzdCgib24iLCAzLCAtMC4zNDg4MzcsIHRydWUpOwotICBBcHBlbmRUZXN0KCJhIiwgNCwgLTAuMDE1NTI2NiwgdHJ1ZSk7Ci0gIEFwcGVuZFRlc3QoImxpdHRsZSIsIDUsIC0wLjAwMzA2MTIyLCB0cnVlKTsKLSAgU3RhdGUgcHJlc2VydmUgPSBzdGF0ZTsKLSAgQXBwZW5kVGVzdCgidGhlIiwgMSwgLTQuMDQwMDUsIHRydWUpOwotICBBcHBlbmRUZXN0KCJiaWFycml0eiIsIDEsIC0xLjk4ODksIHRydWUpOwotICBBcHBlbmRUZXN0KCJub3RfZm91bmQiLCAxLCAtMi4yOTY2NiwgdHJ1ZSk7Ci0gIEFwcGVuZFRlc3QoIm1vcmUiLCAxLCAtMS4yMDYzMiAtIDIwLjAsIHRydWUpOwotICBBcHBlbmRUZXN0KCIuIiwgMiwgLTAuNTEzNjMsIHRydWUpOwotICBBcHBlbmRUZXN0KCI8L3M+IiwgMywgLTAuMDE5MTY1MSwgdHJ1ZSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHN0YXRlLmxlbmd0aCk7Ci0KLSAgc3RhdGUgPSBwcmVzZXJ2ZTsKLSAgQXBwZW5kVGVzdCgibW9yZSIsIDUsIC0wLjAwMTgxMzk1LCB0cnVlKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoNCwgc3RhdGUubGVuZ3RoKTsKLSAgQXBwZW5kVGVzdCgibG9pbiIsIDUsIC0wLjA0MzI1NTcsIHRydWUpOwotICBCT09TVF9DSEVDS19FUVVBTCgxLCBzdGF0ZS5sZW5ndGgpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTT4gdm9pZCBCbGFua3MoY29uc3QgTSAmbW9kZWwpIHsKLSAgRnVsbFNjb3JlUmV0dXJuIHJldDsKLSAgU3RhdGUgc3RhdGUobW9kZWwuTnVsbENvbnRleHRTdGF0ZSgpKTsKLSAgU3RhdGUgb3V0OwotICBBcHBlbmRUZXN0KCJhbHNvIiwgMSwgLTEuNjg3ODcyLCBmYWxzZSk7Ci0gIEFwcGVuZFRlc3QoIndvdWxkIiwgMiwgLTIsIHRydWUpOwotICBBcHBlbmRUZXN0KCJjb25zaWRlciIsIDMsIC0zLCB0cnVlKTsKLSAgU3RhdGUgcHJlc2VydmUgPSBzdGF0ZTsKLSAgQXBwZW5kVGVzdCgiaGlnaGVyIiwgNCwgLTQsIHRydWUpOwotICBBcHBlbmRUZXN0KCJsb29raW5nIiwgNSwgLTUsIHRydWUpOwotICBCT09TVF9DSEVDS19FUVVBTCgxLCBzdGF0ZS5sZW5ndGgpOwotCi0gIHN0YXRlID0gcHJlc2VydmU7Ci0gIC8vIGFsc28gd291bGQgY29uc2lkZXIgbm90X2ZvdW5kCi0gIEFwcGVuZFRlc3QoIm5vdF9mb3VuZCIsIDEsIC0xLjk5NTYzNSAtIDcuMCAtIDAuMzAxMDMsIHRydWUpOwotCi0gIHN0YXRlID0gbW9kZWwuTnVsbENvbnRleHRTdGF0ZSgpOwotICAvLyBoaWdoZXIgbG9va2luZyBpcyBhIGJsYW5rLiAgCi0gIEFwcGVuZFRlc3QoImhpZ2hlciIsIDEsIC0xLjUwOTU1OSwgZmFsc2UpOwotICBBcHBlbmRUZXN0KCJsb29raW5nIiwgMiwgLTEuMjg1OTQxIC0gMC4zMDEwMywgZmFsc2UpOwotCi0gIFN0YXRlIGhpZ2hlcl9sb29raW5nID0gc3RhdGU7Ci0KLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgc3RhdGUubGVuZ3RoKTsKLSAgQXBwZW5kVGVzdCgibm90X2ZvdW5kIiwgMSwgLTEuOTk1NjM1IC0gMC40NzcxMjEyLCB0cnVlKTsKLQotICBzdGF0ZSA9IGhpZ2hlcl9sb29raW5nOwotICAvLyBoaWdoZXIgbG9va2luZyBjb25zaWRlcgotICBBcHBlbmRUZXN0KCJjb25zaWRlciIsIDEsIC0xLjY4Nzg3MiAtIDAuNDc3MTIxMiwgdHJ1ZSk7Ci0KLSAgc3RhdGUgPSBtb2RlbC5OdWxsQ29udGV4dFN0YXRlKCk7Ci0gIEFwcGVuZFRlc3QoIndvdWxkIiwgMSwgLTEuNjg3ODcyLCBmYWxzZSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDEsIHN0YXRlLmxlbmd0aCk7Ci0gIEFwcGVuZFRlc3QoImNvbnNpZGVyIiwgMiwgLTEuNjg3ODcyIC0wLjMwMTAzLCBmYWxzZSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHN0YXRlLmxlbmd0aCk7Ci0gIEFwcGVuZFRlc3QoImhpZ2hlciIsIDMsIC0xLjUwOTU1OSAtIDAuMzAxMDMsIGZhbHNlKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMywgc3RhdGUubGVuZ3RoKTsKLSAgQXBwZW5kVGVzdCgibG9va2luZyIsIDQsIC0xLjI4NTk0MSAtIDAuMzAxMDMsIGZhbHNlKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgVW5rbm93bnMoY29uc3QgTSAmbW9kZWwpIHsKLSAgRnVsbFNjb3JlUmV0dXJuIHJldDsKLSAgU3RhdGUgc3RhdGUobW9kZWwuTnVsbENvbnRleHRTdGF0ZSgpKTsKLSAgU3RhdGUgb3V0OwotCi0gIEFwcGVuZFRlc3QoIm5vdF9mb3VuZCIsIDEsIC0xLjk5NTYzNSwgZmFsc2UpOwotICBTdGF0ZSBwcmVzZXJ2ZSA9IHN0YXRlOwotICBBcHBlbmRUZXN0KCJub3RfZm91bmQyIiwgMiwgLTE1LjAsIHRydWUpOwotICBBcHBlbmRUZXN0KCJub3RfZm91bmQzIiwgMiwgLTE1LjAgLSAyLjAsIHRydWUpOwotICAKLSAgc3RhdGUgPSBwcmVzZXJ2ZTsKLSAgQXBwZW5kVGVzdCgiaG93ZXZlciIsIDIsIC00LCB0cnVlKTsKLSAgQXBwZW5kVGVzdCgibm90X2ZvdW5kMyIsIDMsIC02LCB0cnVlKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgTWluaW1hbFN0YXRlKGNvbnN0IE0gJm1vZGVsKSB7Ci0gIEZ1bGxTY29yZVJldHVybiByZXQ7Ci0gIFN0YXRlIHN0YXRlKG1vZGVsLk51bGxDb250ZXh0U3RhdGUoKSk7Ci0gIFN0YXRlIG91dDsKLQotICBBcHBlbmRUZXN0KCJiYXoiLCAxLCAtNi41MzU4OTcsIHRydWUpOwotICBCT09TVF9DSEVDS19FUVVBTCgwLCBzdGF0ZS5sZW5ndGgpOwotICBzdGF0ZSA9IG1vZGVsLk51bGxDb250ZXh0U3RhdGUoKTsKLSAgQXBwZW5kVGVzdCgiZm9vIiwgMSwgLTMuMTQxNTkyLCB0cnVlKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgc3RhdGUubGVuZ3RoKTsKLSAgQXBwZW5kVGVzdCgiYmFyIiwgMiwgLTYuMCwgdHJ1ZSk7Ci0gIC8vIEhhcyB0byBpbmNsdWRlIHRoZSBiYWNrb2ZmIHdlaWdodC4gIAotICBCT09TVF9DSEVDS19FUVVBTCgxLCBzdGF0ZS5sZW5ndGgpOwotICBBcHBlbmRUZXN0KCJiYXIiLCAxLCAtMi43MTgyODEgKyAzLjAsIHRydWUpOwotICBCT09TVF9DSEVDS19FUVVBTCgxLCBzdGF0ZS5sZW5ndGgpOwotCi0gIHN0YXRlID0gbW9kZWwuTnVsbENvbnRleHRTdGF0ZSgpOwotICBBcHBlbmRUZXN0KCJ0byIsIDEsIC0xLjY4Nzg3MiwgZmFsc2UpOwotICBBcHBlbmRUZXN0KCJsb29rIiwgMiwgLTAuMjkyMjA5NSwgdHJ1ZSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHN0YXRlLmxlbmd0aCk7Ci0gIEFwcGVuZFRlc3QoImEiLCAzLCAtNywgdHJ1ZSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBNPiB2b2lkIEV4dGVuZExlZnRUZXN0KGNvbnN0IE0gJm1vZGVsKSB7Ci0gIFN0YXRlIHJpZ2h0OwotICBGdWxsU2NvcmVSZXR1cm4gbGl0dGxlKG1vZGVsLkZ1bGxTY29yZShtb2RlbC5OdWxsQ29udGV4dFN0YXRlKCksIG1vZGVsLkdldFZvY2FidWxhcnkoKS5JbmRleCgibGl0dGxlIiksIHJpZ2h0KSk7Ci0gIGNvbnN0IGZsb2F0IGtMaXR0bGVQcm9iID0gLTEuMjg1OTQxOwotICBTTE9QUFlfQ0hFQ0tfQ0xPU0Uoa0xpdHRsZVByb2IsIGxpdHRsZS5wcm9iLCAwLjAwMSk7Ci0gIHVuc2lnbmVkIGNoYXIgbmV4dF91c2U7Ci0gIGZsb2F0IGJhY2tvZmZfb3V0WzRdOwotCi0gIEZ1bGxTY29yZVJldHVybiBleHRlbmRfbm9uZShtb2RlbC5FeHRlbmRMZWZ0KE5VTEwsIE5VTEwsIE5VTEwsIGxpdHRsZS5leHRlbmRfbGVmdCwgMSwgTlVMTCwgbmV4dF91c2UpKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgbmV4dF91c2UpOwotICBCT09TVF9DSEVDS19FUVVBTChsaXR0bGUuZXh0ZW5kX2xlZnQsIGV4dGVuZF9ub25lLmV4dGVuZF9sZWZ0KTsKLSAgU0xPUFBZX0NIRUNLX0NMT1NFKGxpdHRsZS5wcm9iIC0gbGl0dGxlLnJlc3QsIGV4dGVuZF9ub25lLnByb2IsIDAuMDAxKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgZXh0ZW5kX25vbmUubmdyYW1fbGVuZ3RoKTsKLQotICBjb25zdCBXb3JkSW5kZXggYSA9IG1vZGVsLkdldFZvY2FidWxhcnkoKS5JbmRleCgiYSIpOwotICBmbG9hdCBiYWNrb2ZmX2luID0gMy4xNDsKLSAgLy8gYSBsaXR0bGUKLSAgRnVsbFNjb3JlUmV0dXJuIGV4dGVuZF9hKG1vZGVsLkV4dGVuZExlZnQoJmEsICZhICsgMSwgJmJhY2tvZmZfaW4sIGxpdHRsZS5leHRlbmRfbGVmdCwgMSwgYmFja29mZl9vdXQsIG5leHRfdXNlKSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDEsIG5leHRfdXNlKTsKLSAgU0xPUFBZX0NIRUNLX0NMT1NFKC0wLjY5ODk3LCBiYWNrb2ZmX291dFswXSwgMC4wMDEpOwotICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTAuMDkxMzI1NDcgLSBsaXR0bGUucmVzdCwgZXh0ZW5kX2EucHJvYiwgMC4wMDEpOwotICBCT09TVF9DSEVDS19FUVVBTCgyLCBleHRlbmRfYS5uZ3JhbV9sZW5ndGgpOwotICBCT09TVF9DSEVDSyghZXh0ZW5kX2EuaW5kZXBlbmRlbnRfbGVmdCk7Ci0KLSAgY29uc3QgV29yZEluZGV4IG9uID0gbW9kZWwuR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KCJvbiIpOwotICBGdWxsU2NvcmVSZXR1cm4gZXh0ZW5kX29uKG1vZGVsLkV4dGVuZExlZnQoJm9uLCAmb24gKyAxLCAmYmFja29mZl9pbiwgZXh0ZW5kX2EuZXh0ZW5kX2xlZnQsIDIsIGJhY2tvZmZfb3V0LCBuZXh0X3VzZSkpOwotICBCT09TVF9DSEVDS19FUVVBTCgxLCBuZXh0X3VzZSk7Ci0gIFNMT1BQWV9DSEVDS19DTE9TRSgtMC40NzcxMjEyLCBiYWNrb2ZmX291dFswXSwgMC4wMDEpOwotICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTAuMDI4MzYwMyAtIChleHRlbmRfYS5yZXN0ICsgbGl0dGxlLnJlc3QpLCBleHRlbmRfb24ucHJvYiwgMC4wMDEpOwotICBCT09TVF9DSEVDS19FUVVBTCgzLCBleHRlbmRfb24ubmdyYW1fbGVuZ3RoKTsKLSAgQk9PU1RfQ0hFQ0soIWV4dGVuZF9vbi5pbmRlcGVuZGVudF9sZWZ0KTsKLQotICBjb25zdCBXb3JkSW5kZXggYm90aFsyXSA9IHthLCBvbn07Ci0gIGZsb2F0IGJhY2tvZmZfaW5fYXJyWzRdOwotICBGdWxsU2NvcmVSZXR1cm4gZXh0ZW5kX2JvdGgobW9kZWwuRXh0ZW5kTGVmdChib3RoLCBib3RoICsgMiwgYmFja29mZl9pbl9hcnIsIGxpdHRsZS5leHRlbmRfbGVmdCwgMSwgYmFja29mZl9vdXQsIG5leHRfdXNlKSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDIsIG5leHRfdXNlKTsKLSAgU0xPUFBZX0NIRUNLX0NMT1NFKC0wLjY5ODk3LCBiYWNrb2ZmX291dFswXSwgMC4wMDEpOwotICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTAuNDc3MTIxMiwgYmFja29mZl9vdXRbMV0sIDAuMDAxKTsKLSAgU0xPUFBZX0NIRUNLX0NMT1NFKC0wLjAyODM2MDMgLSBsaXR0bGUucmVzdCwgZXh0ZW5kX2JvdGgucHJvYiwgMC4wMDEpOwotICBCT09TVF9DSEVDS19FUVVBTCgzLCBleHRlbmRfYm90aC5uZ3JhbV9sZW5ndGgpOwotICBCT09TVF9DSEVDSyghZXh0ZW5kX2JvdGguaW5kZXBlbmRlbnRfbGVmdCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKGV4dGVuZF9vbi5leHRlbmRfbGVmdCwgZXh0ZW5kX2JvdGguZXh0ZW5kX2xlZnQpOwotfQotCi0jZGVmaW5lIFN0YXRlbGVzc1Rlc3Qod29yZCwgcHJvdmlkZSwgbmdyYW0sIHNjb3JlKSBcCi0gIHJldCA9IG1vZGVsLkZ1bGxTY29yZUZvcmdvdFN0YXRlKGluZGljZXMgKyBudW1fd29yZHMgLSB3b3JkLCBpbmRpY2VzICsgbnVtX3dvcmRzIC0gd29yZCArIHByb3ZpZGUsIGluZGljZXNbbnVtX3dvcmRzIC0gd29yZCAtIDFdLCBzdGF0ZSk7IFwKLSAgU0xPUFBZX0NIRUNLX0NMT1NFKHNjb3JlLCByZXQucHJvYiwgMC4wMDEpOyBcCi0gIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4obmdyYW0pLCByZXQubmdyYW1fbGVuZ3RoKTsgXAotICBtb2RlbC5HZXRTdGF0ZShpbmRpY2VzICsgbnVtX3dvcmRzIC0gd29yZCwgaW5kaWNlcyArIG51bV93b3JkcyAtIHdvcmQgKyBwcm92aWRlLCBiZWZvcmUpOyBcCi0gIHJldCA9IG1vZGVsLkZ1bGxTY29yZShiZWZvcmUsIGluZGljZXNbbnVtX3dvcmRzIC0gd29yZCAtIDFdLCBvdXQpOyBcCi0gIEJPT1NUX0NIRUNLKHN0YXRlID09IG91dCk7IFwKLSAgU0xPUFBZX0NIRUNLX0NMT1NFKHNjb3JlLCByZXQucHJvYiwgMC4wMDEpOyBcCi0gIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4obmdyYW0pLCByZXQubmdyYW1fbGVuZ3RoKTsKLQotdGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgU3RhdGVsZXNzKGNvbnN0IE0gJm1vZGVsKSB7Ci0gIGNvbnN0IGNoYXIgKndvcmRzW10gPSB7IjxzPiIsICJsb29raW5nIiwgIm9uIiwgImEiLCAibGl0dGxlIiwgInRoZSIsICJiaWFycml0eiIsICJub3RfZm91bmQiLCAibW9yZSIsICIuIiwgIjwvcz4ifTsKLSAgY29uc3Qgc2l6ZV90IG51bV93b3JkcyA9IHNpemVvZih3b3JkcykgLyBzaXplb2YoY29uc3QgY2hhciopOwotICAvLyBTaWxpZW5jZSAiYXJyYXkgc3Vic2NyaXB0IGlzIGFib3ZlIGFycmF5IGJvdW5kcyIgd2hlbiBleHRyYWN0aW5nIGVuZCBwb2ludGVyLgotICBXb3JkSW5kZXggaW5kaWNlc1tudW1fd29yZHMgKyAxXTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBudW1fd29yZHM7ICsraSkgewotICAgIGluZGljZXNbbnVtX3dvcmRzIC0gMSAtIGldID0gbW9kZWwuR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KHdvcmRzW2ldKTsKLSAgfQotICBGdWxsU2NvcmVSZXR1cm4gcmV0OwotICBTdGF0ZSBzdGF0ZSwgb3V0LCBiZWZvcmU7Ci0KLSAgcmV0ID0gbW9kZWwuRnVsbFNjb3JlRm9yZ290U3RhdGUoaW5kaWNlcyArIG51bV93b3JkcyAtIDEsIGluZGljZXMgKyBudW1fd29yZHMsIGluZGljZXNbbnVtX3dvcmRzIC0gMl0sIHN0YXRlKTsKLSAgU0xPUFBZX0NIRUNLX0NMT1NFKC0wLjQ4NDY1MiwgcmV0LnByb2IsIDAuMDAxKTsKLSAgU3RhdGVsZXNzVGVzdCgxLCAxLCAyLCAtMC40ODQ2NTIpOwotCi0gIC8vIGxvb2tpbmcKLSAgU3RhdGVsZXNzVGVzdCgxLCAyLCAyLCAtMC40ODQ2NTIpOwotICAvLyBvbgotICBBcHBlbmRUZXN0KCJvbiIsIDMsIC0wLjM0ODgzNywgdHJ1ZSk7Ci0gIFN0YXRlbGVzc1Rlc3QoMiwgMywgMywgLTAuMzQ4ODM3KTsKLSAgU3RhdGVsZXNzVGVzdCgyLCAyLCAzLCAtMC4zNDg4MzcpOwotICBTdGF0ZWxlc3NUZXN0KDIsIDEsIDIsIC0wLjQ2Mzg5MDMpOwotICAvLyBhCi0gIFN0YXRlbGVzc1Rlc3QoMywgNCwgNCwgLTAuMDE1NTI2Nik7Ci0gIC8vIGxpdHRsZQotICBBcHBlbmRUZXN0KCJsaXR0bGUiLCA1LCAtMC4wMDMwNjEyMiwgdHJ1ZSk7Ci0gIFN0YXRlbGVzc1Rlc3QoNCwgNSwgNSwgLTAuMDAzMDYxMjIpOwotICAvLyB0aGUKLSAgQXBwZW5kVGVzdCgidGhlIiwgMSwgLTQuMDQwMDUsIHRydWUpOwotICBTdGF0ZWxlc3NUZXN0KDUsIDUsIDEsIC00LjA0MDA1KTsKLSAgLy8gTm8gY29udGV4dCBvZiB0aGUuICAKLSAgU3RhdGVsZXNzVGVzdCg1LCAwLCAxLCAtMS42ODc4NzIpOwotICAvLyBiaWFycml0egotICBTdGF0ZWxlc3NUZXN0KDYsIDEsIDEsIC0xLjk4ODkpOwotICAvLyBub3QgZm91bmQKLSAgU3RhdGVsZXNzVGVzdCg3LCAxLCAxLCAtMi4yOTY2Nik7Ci0gIFN0YXRlbGVzc1Rlc3QoNywgMCwgMSwgLTEuOTk1NjM1KTsKLQotICBXb3JkSW5kZXggdW5rWzFdOwotICB1bmtbMF0gPSAwOwotICBtb2RlbC5HZXRTdGF0ZSh1bmssIHVuayArIDEsIHN0YXRlKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgc3RhdGUubGVuZ3RoKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdGljX2Nhc3Q8V29yZEluZGV4PigwKSwgc3RhdGUud29yZHNbMF0pOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTT4gdm9pZCBOb1Vua0NoZWNrKGNvbnN0IE0gJm1vZGVsKSB7Ci0gIFdvcmRJbmRleCB1bmtfaW5kZXggPSAwOwotICBTdGF0ZSBzdGF0ZTsKLQotICBGdWxsU2NvcmVSZXR1cm4gcmV0ID0gbW9kZWwuRnVsbFNjb3JlRm9yZ290U3RhdGUoJnVua19pbmRleCwgJnVua19pbmRleCArIDEsIHVua19pbmRleCwgc3RhdGUpOwotICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTEwMC4wLCByZXQucHJvYiwgMC4wMDEpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTT4gdm9pZCBFdmVyeXRoaW5nKGNvbnN0IE0gJm0pIHsKLSAgU3RhcnRlcnMobSk7Ci0gIENvbnRpbnVhdGlvbihtKTsKLSAgQmxhbmtzKG0pOwotICBVbmtub3ducyhtKTsKLSAgTWluaW1hbFN0YXRlKG0pOwotICBFeHRlbmRMZWZ0VGVzdChtKTsKLSAgU3RhdGVsZXNzKG0pOwotfQotCi1jbGFzcyBFeHBlY3RFbnVtZXJhdGVWb2NhYiA6IHB1YmxpYyBFbnVtZXJhdGVWb2NhYiB7Ci0gIHB1YmxpYzoKLSAgICBFeHBlY3RFbnVtZXJhdGVWb2NhYigpIHt9Ci0KLSAgICB2b2lkIEFkZChXb3JkSW5kZXggaW5kZXgsIGNvbnN0IFN0cmluZ1BpZWNlICZzdHIpIHsKLSAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHNlZW4uc2l6ZSgpLCBpbmRleCk7Ci0gICAgICBzZWVuLnB1c2hfYmFjayhzdGQ6OnN0cmluZyhzdHIuZGF0YSgpLCBzdHIubGVuZ3RoKCkpKTsKLSAgICB9Ci0KLSAgICB2b2lkIENoZWNrKGNvbnN0IGJhc2U6OlZvY2FidWxhcnkgJnZvY2FiKSB7Ci0gICAgICBCT09TVF9DSEVDS19FUVVBTCgzN1VMTCwgc2Vlbi5zaXplKCkpOwotICAgICAgQk9PU1RfUkVRVUlSRSghc2Vlbi5lbXB0eSgpKTsKLSAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKCI8dW5rPiIsIHNlZW5bMF0pOwotICAgICAgZm9yIChXb3JkSW5kZXggaSA9IDA7IGkgPCBzZWVuLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGksIHZvY2FiLkluZGV4KHNlZW5baV0pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIENsZWFyKCkgewotICAgICAgc2Vlbi5jbGVhcigpOwotICAgIH0KLQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzZWVuOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIE1vZGVsVD4gdm9pZCBMb2FkaW5nVGVzdCgpIHsKLSAgQ29uZmlnIGNvbmZpZzsKLSAgY29uZmlnLmFycGFfY29tcGxhaW4gPSBDb25maWc6Ok5PTkU7Ci0gIGNvbmZpZy5tZXNzYWdlcyA9IE5VTEw7Ci0gIGNvbmZpZy5wcm9iaW5nX211bHRpcGxpZXIgPSAyLjA7Ci0gIHsKLSAgICBFeHBlY3RFbnVtZXJhdGVWb2NhYiBlbnVtZXJhdGU7Ci0gICAgY29uZmlnLmVudW1lcmF0ZV92b2NhYiA9ICZlbnVtZXJhdGU7Ci0gICAgTW9kZWxUIG0oVGVzdExvY2F0aW9uKCksIGNvbmZpZyk7Ci0gICAgZW51bWVyYXRlLkNoZWNrKG0uR2V0Vm9jYWJ1bGFyeSgpKTsKLSAgICBCT09TVF9DSEVDS19FUVVBTCgoV29yZEluZGV4KTM3LCBtLkdldFZvY2FidWxhcnkoKS5Cb3VuZCgpKTsKLSAgICBFdmVyeXRoaW5nKG0pOwotICB9Ci0gIHsKLSAgICBFeHBlY3RFbnVtZXJhdGVWb2NhYiBlbnVtZXJhdGU7Ci0gICAgY29uZmlnLmVudW1lcmF0ZV92b2NhYiA9ICZlbnVtZXJhdGU7Ci0gICAgTW9kZWxUIG0oVGVzdE5vVW5rTG9jYXRpb24oKSwgY29uZmlnKTsKLSAgICBlbnVtZXJhdGUuQ2hlY2sobS5HZXRWb2NhYnVsYXJ5KCkpOwotICAgIEJPT1NUX0NIRUNLX0VRVUFMKChXb3JkSW5kZXgpMzcsIG0uR2V0Vm9jYWJ1bGFyeSgpLkJvdW5kKCkpOwotICAgIE5vVW5rQ2hlY2sobSk7Ci0gIH0KLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UocHJvYmluZykgewotICBMb2FkaW5nVGVzdDxNb2RlbD4oKTsKLX0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKHRyaWUpIHsKLSAgTG9hZGluZ1Rlc3Q8VHJpZU1vZGVsPigpOwotfQotQk9PU1RfQVVUT19URVNUX0NBU0UocXVhbnRfdHJpZSkgewotICBMb2FkaW5nVGVzdDxRdWFudFRyaWVNb2RlbD4oKTsKLX0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKGJoaWtzaGFfdHJpZSkgewotICBMb2FkaW5nVGVzdDxBcnJheVRyaWVNb2RlbD4oKTsKLX0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKHF1YW50X2JoaWtzaGFfdHJpZSkgewotICBMb2FkaW5nVGVzdDxRdWFudEFycmF5VHJpZU1vZGVsPigpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTW9kZWxUPiB2b2lkIEJpbmFyeVRlc3QoQ29uZmlnOjpXcml0ZU1ldGhvZCB3cml0ZV9tZXRob2QpIHsKLSAgQ29uZmlnIGNvbmZpZzsKLSAgY29uZmlnLndyaXRlX21tYXAgPSAidGVzdC5iaW5hcnkiOwotICBjb25maWcubWVzc2FnZXMgPSBOVUxMOwotICBjb25maWcud3JpdGVfbWV0aG9kID0gd3JpdGVfbWV0aG9kOwotICBFeHBlY3RFbnVtZXJhdGVWb2NhYiBlbnVtZXJhdGU7Ci0gIGNvbmZpZy5lbnVtZXJhdGVfdm9jYWIgPSAmZW51bWVyYXRlOwotCi0gIHsKLSAgICBNb2RlbFQgY29weV9tb2RlbChUZXN0TG9jYXRpb24oKSwgY29uZmlnKTsKLSAgICBlbnVtZXJhdGUuQ2hlY2soY29weV9tb2RlbC5HZXRWb2NhYnVsYXJ5KCkpOwotICAgIGVudW1lcmF0ZS5DbGVhcigpOwotICAgIEV2ZXJ5dGhpbmcoY29weV9tb2RlbCk7Ci0gIH0KLQotICBjb25maWcud3JpdGVfbW1hcCA9IE5VTEw7Ci0KLSAgTW9kZWxUeXBlIHR5cGU7Ci0gIEJPT1NUX1JFUVVJUkUoUmVjb2duaXplQmluYXJ5KCJ0ZXN0LmJpbmFyeSIsIHR5cGUpKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoTW9kZWxUOjprTW9kZWxUeXBlLCB0eXBlKTsKLQotICB7Ci0gICAgTW9kZWxUIGJpbmFyeSgidGVzdC5iaW5hcnkiLCBjb25maWcpOwotICAgIGVudW1lcmF0ZS5DaGVjayhiaW5hcnkuR2V0Vm9jYWJ1bGFyeSgpKTsKLSAgICBFdmVyeXRoaW5nKGJpbmFyeSk7Ci0gIH0KLSAgdW5saW5rKCJ0ZXN0LmJpbmFyeSIpOwotCi0gIC8vIE5vdyB0ZXN0IHdpdGhvdXQgPHVuaz4uCi0gIGNvbmZpZy53cml0ZV9tbWFwID0gInRlc3Rfbm91bmsuYmluYXJ5IjsKLSAgY29uZmlnLm1lc3NhZ2VzID0gTlVMTDsKLSAgZW51bWVyYXRlLkNsZWFyKCk7Ci0gIHsKLSAgICBNb2RlbFQgY29weV9tb2RlbChUZXN0Tm9VbmtMb2NhdGlvbigpLCBjb25maWcpOwotICAgIGVudW1lcmF0ZS5DaGVjayhjb3B5X21vZGVsLkdldFZvY2FidWxhcnkoKSk7Ci0gICAgZW51bWVyYXRlLkNsZWFyKCk7Ci0gICAgTm9VbmtDaGVjayhjb3B5X21vZGVsKTsKLSAgfQotICBjb25maWcud3JpdGVfbW1hcCA9IE5VTEw7Ci0gIHsKLSAgICBNb2RlbFQgYmluYXJ5KFRlc3ROb1Vua0xvY2F0aW9uKCksIGNvbmZpZyk7Ci0gICAgZW51bWVyYXRlLkNoZWNrKGJpbmFyeS5HZXRWb2NhYnVsYXJ5KCkpOwotICAgIE5vVW5rQ2hlY2soYmluYXJ5KTsKLSAgfQotICB1bmxpbmsoInRlc3Rfbm91bmsuYmluYXJ5Iik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBNb2RlbFQ+IHZvaWQgQmluYXJ5VGVzdCgpIHsKLSAgQmluYXJ5VGVzdDxNb2RlbFQ+KENvbmZpZzo6V1JJVEVfTU1BUCk7Ci0gIEJpbmFyeVRlc3Q8TW9kZWxUPihDb25maWc6OldSSVRFX0FGVEVSKTsKLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0Uod3JpdGVfYW5kX3JlYWRfcHJvYmluZykgewotICBCaW5hcnlUZXN0PFByb2JpbmdNb2RlbD4oKTsKLX0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKHdyaXRlX2FuZF9yZWFkX3Jlc3RfcHJvYmluZykgewotICBCaW5hcnlUZXN0PFJlc3RQcm9iaW5nTW9kZWw+KCk7Ci19Ci1CT09TVF9BVVRPX1RFU1RfQ0FTRSh3cml0ZV9hbmRfcmVhZF90cmllKSB7Ci0gIEJpbmFyeVRlc3Q8VHJpZU1vZGVsPigpOwotfQotQk9PU1RfQVVUT19URVNUX0NBU0Uod3JpdGVfYW5kX3JlYWRfcXVhbnRfdHJpZSkgewotICBCaW5hcnlUZXN0PFF1YW50VHJpZU1vZGVsPigpOwotfQotQk9PU1RfQVVUT19URVNUX0NBU0Uod3JpdGVfYW5kX3JlYWRfYXJyYXlfdHJpZSkgewotICBCaW5hcnlUZXN0PEFycmF5VHJpZU1vZGVsPigpOwotfQotQk9PU1RfQVVUT19URVNUX0NBU0Uod3JpdGVfYW5kX3JlYWRfcXVhbnRfYXJyYXlfdHJpZSkgewotICBCaW5hcnlUZXN0PFF1YW50QXJyYXlUcmllTW9kZWw+KCk7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKHJlc3RfbWF4KSB7Ci0gIENvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy5hcnBhX2NvbXBsYWluID0gQ29uZmlnOjpOT05FOwotICBjb25maWcubWVzc2FnZXMgPSBOVUxMOwotCi0gIFJlc3RQcm9iaW5nTW9kZWwgbW9kZWwoVGVzdExvY2F0aW9uKCksIGNvbmZpZyk7Ci0gIFN0YXRlIHN0YXRlLCBvdXQ7Ci0gIEZ1bGxTY29yZVJldHVybiByZXQobW9kZWwuRnVsbFNjb3JlKG1vZGVsLk51bGxDb250ZXh0U3RhdGUoKSwgbW9kZWwuR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KCIuIiksIHN0YXRlKSk7Ci0gIFNMT1BQWV9DSEVDS19DTE9TRSgtMC4yNzA1OTE4LCByZXQucmVzdCwgMC4wMDEpOwotICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTAuMDE5MTY1MTIsIG1vZGVsLkZ1bGxTY29yZShzdGF0ZSwgbW9kZWwuR2V0Vm9jYWJ1bGFyeSgpLkVuZFNlbnRlbmNlKCksIG91dCkucmVzdCwgMC4wMDEpOwotfQotCi19IC8vIG5hbWVzcGFjZQotfSAvLyBuYW1lc3BhY2UgbmdyYW0KLX0gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbW9kZWxfdHlwZS5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9tb2RlbF90eXBlLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmUxMTE3Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9tb2RlbF90eXBlLmhoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2lmbmRlZiBMTV9NT0RFTF9UWVBFX0gKLSNkZWZpbmUgTE1fTU9ERUxfVFlQRV9ICi0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgbmdyYW0gewotCi0vKiBOb3QgdGhlIGJlc3QgbnVtYmVyaW5nIHN5c3RlbSwgYnV0IGl0IGdyZXcgdGhpcyB3YXkgZm9yIGhpc3RvcmljYWwgcmVhc29ucwotICogYW5kIEkgd2FudCB0byBwcmVzZXJ2ZSBleGlzdGluZyBiaW5hcnkgZmlsZXMuICovCi10eXBlZGVmIGVudW0ge1BST0JJTkc9MCwgUkVTVF9QUk9CSU5HPTEsIFRSSUU9MiwgUVVBTlRfVFJJRT0zLCBBUlJBWV9UUklFPTQsIFFVQU5UX0FSUkFZX1RSSUU9NX0gTW9kZWxUeXBlOwotCi0vLyBIaXN0b3JpY2FsIG5hbWVzLiAgCi1jb25zdCBNb2RlbFR5cGUgSEFTSF9QUk9CSU5HID0gUFJPQklORzsKLWNvbnN0IE1vZGVsVHlwZSBUUklFX1NPUlRFRCA9IFRSSUU7Ci1jb25zdCBNb2RlbFR5cGUgUVVBTlRfVFJJRV9TT1JURUQgPSBRVUFOVF9UUklFOwotY29uc3QgTW9kZWxUeXBlIEFSUkFZX1RSSUVfU09SVEVEID0gQVJSQVlfVFJJRTsKLWNvbnN0IE1vZGVsVHlwZSBRVUFOVF9BUlJBWV9UUklFX1NPUlRFRCA9IFFVQU5UX0FSUkFZX1RSSUU7Ci0KLWNvbnN0IHN0YXRpYyBNb2RlbFR5cGUga1F1YW50QWRkID0gc3RhdGljX2Nhc3Q8TW9kZWxUeXBlPihRVUFOVF9UUklFIC0gVFJJRSk7Ci1jb25zdCBzdGF0aWMgTW9kZWxUeXBlIGtBcnJheUFkZCA9IHN0YXRpY19jYXN0PE1vZGVsVHlwZT4oQVJSQVlfVFJJRSAtIFRSSUUpOwotCi19IC8vIG5hbWVzcGFjZSBuZ3JhbQotfSAvLyBuYW1lc3BhY2UgbG0KLSNlbmRpZiAvLyBMTV9NT0RFTF9UWVBFX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9uZ3JhbV9xdWVyeS5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9uZ3JhbV9xdWVyeS5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzMzBjNS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbmdyYW1fcXVlcnkuaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotI2lmbmRlZiBMTV9OR1JBTV9RVUVSWV9ICi0jZGVmaW5lIExNX05HUkFNX1FVRVJZX0gKLQotI2luY2x1ZGUgImxtL2VudW1lcmF0ZV92b2NhYi5oaCIKLSNpbmNsdWRlICJsbS9tb2RlbC5oaCIKLSNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCi0jaW5jbHVkZSAidXRpbC91c2FnZS5oaCIKLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8b3N0cmVhbT4KLSNpbmNsdWRlIDxpc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPG1hdGguaD4KLQotbmFtZXNwYWNlIGxtIHsKLW5hbWVzcGFjZSBuZ3JhbSB7Ci0KLXN0cnVjdCBCYXNpY1ByaW50IHsKLSAgdm9pZCBXb3JkKFN0cmluZ1BpZWNlLCBXb3JkSW5kZXgsIGNvbnN0IEZ1bGxTY29yZVJldHVybiAmKSBjb25zdCB7fQotICB2b2lkIExpbmUodWludDY0X3Qgb292LCBmbG9hdCB0b3RhbCkgY29uc3QgewotICAgIHN0ZDo6Y291dCA8PCAiVG90YWw6ICIgPDwgdG90YWwgPDwgIiBPT1Y6ICIgPDwgb292IDw8ICdcbic7Ci0gIH0KLSAgdm9pZCBTdW1tYXJ5KGRvdWJsZSwgZG91YmxlLCB1aW50NjRfdCwgdWludDY0X3QpIHt9Ci0gIAotfTsKLQotc3RydWN0IEZ1bGxQcmludCA6IHB1YmxpYyBCYXNpY1ByaW50IHsKLSAgdm9pZCBXb3JkKFN0cmluZ1BpZWNlIHN1cmZhY2UsIFdvcmRJbmRleCB2b2NhYiwgY29uc3QgRnVsbFNjb3JlUmV0dXJuICZyZXQpIGNvbnN0IHsKLSAgICBzdGQ6OmNvdXQgPDwgc3VyZmFjZSA8PCAnPScgPDwgdm9jYWIgPDwgJyAnIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4ocmV0Lm5ncmFtX2xlbmd0aCkgIDw8ICcgJyA8PCByZXQucHJvYiA8PCAnXHQnOwotICB9Ci0KLSAgdm9pZCBTdW1tYXJ5KGRvdWJsZSBwcGxfaW5jbHVkaW5nX29vdiwgZG91YmxlIHBwbF9leGNsdWRpbmdfb292LCB1aW50NjRfdCBjb3JwdXNfb292LCB1aW50NjRfdCBjb3JwdXNfdG9rZW5zKSB7Ci0gICAgc3RkOjpjb3V0IDw8IAotICAgICAgIlBlcnBsZXhpdHkgaW5jbHVkaW5nIE9PVnM6XHQiIDw8IHBwbF9pbmNsdWRpbmdfb292IDw8ICJcbiIKLSAgICAgICJQZXJwbGV4aXR5IGV4Y2x1ZGluZyBPT1ZzOlx0IiA8PCBwcGxfZXhjbHVkaW5nX29vdiA8PCAiXG4iCi0gICAgICAiT09WczpcdCIgPDwgY29ycHVzX29vdiA8PCAiXG4iCi0gICAgICAiVG9rZW5zOlx0IiA8PCBjb3JwdXNfdG9rZW5zIDw8ICdcbicKLSAgICAgIDsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIE1vZGVsLCBjbGFzcyBQcmludGVyPiB2b2lkIFF1ZXJ5KGNvbnN0IE1vZGVsICZtb2RlbCwgYm9vbCBzZW50ZW5jZV9jb250ZXh0KSB7Ci0gIFByaW50ZXIgcHJpbnRlcjsKLSAgdHlwZW5hbWUgTW9kZWw6OlN0YXRlIHN0YXRlLCBvdXQ7Ci0gIGxtOjpGdWxsU2NvcmVSZXR1cm4gcmV0OwotICBTdHJpbmdQaWVjZSB3b3JkOwotCi0gIHV0aWw6OkZpbGVQaWVjZSBpbigwKTsKLQotICBkb3VibGUgY29ycHVzX3RvdGFsID0gMC4wOwotICBkb3VibGUgY29ycHVzX3RvdGFsX29vdl9vbmx5ID0gMC4wOwotICB1aW50NjRfdCBjb3JwdXNfb292ID0gMDsKLSAgdWludDY0X3QgY29ycHVzX3Rva2VucyA9IDA7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBzdGF0ZSA9IHNlbnRlbmNlX2NvbnRleHQgPyBtb2RlbC5CZWdpblNlbnRlbmNlU3RhdGUoKSA6IG1vZGVsLk51bGxDb250ZXh0U3RhdGUoKTsKLSAgICBmbG9hdCB0b3RhbCA9IDAuMDsKLSAgICB1aW50NjRfdCBvb3YgPSAwOwotCi0gICAgd2hpbGUgKGluLlJlYWRXb3JkU2FtZUxpbmUod29yZCkpIHsKLSAgICAgIGxtOjpXb3JkSW5kZXggdm9jYWIgPSBtb2RlbC5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgod29yZCk7Ci0gICAgICByZXQgPSBtb2RlbC5GdWxsU2NvcmUoc3RhdGUsIHZvY2FiLCBvdXQpOwotICAgICAgaWYgKHZvY2FiID09IG1vZGVsLkdldFZvY2FidWxhcnkoKS5Ob3RGb3VuZCgpKSB7Ci0gICAgICAgICsrb292OwotICAgICAgICBjb3JwdXNfdG90YWxfb292X29ubHkgKz0gcmV0LnByb2I7Ci0gICAgICB9Ci0gICAgICB0b3RhbCArPSByZXQucHJvYjsKLSAgICAgIHByaW50ZXIuV29yZCh3b3JkLCB2b2NhYiwgcmV0KTsKLSAgICAgICsrY29ycHVzX3Rva2VuczsKLSAgICAgIHN0YXRlID0gb3V0OwotICAgIH0KLSAgICAvLyBJZiBwZW9wbGUgZG9uJ3QgaGF2ZSBhIG5ld2xpbmUgYWZ0ZXIgdGhlaXIgbGFzdCBxdWVyeSwgdGhpcyB3b24ndCBhZGQgYSA8L3M+LgotICAgIC8vIFN1ZSBtZS4KLSAgICB0cnkgewotICAgICAgVVRJTF9USFJPV19JRignXG4nICE9IGluLmdldCgpLCB1dGlsOjpFeGNlcHRpb24sICJGaWxlUGllY2UgaXMgY29uZnVzZWQuIik7Ci0gICAgfSBjYXRjaCAoY29uc3QgdXRpbDo6RW5kT2ZGaWxlRXhjZXB0aW9uICZlKSB7IGJyZWFrOyB9Ci0gICAgaWYgKHNlbnRlbmNlX2NvbnRleHQpIHsKLSAgICAgIHJldCA9IG1vZGVsLkZ1bGxTY29yZShzdGF0ZSwgbW9kZWwuR2V0Vm9jYWJ1bGFyeSgpLkVuZFNlbnRlbmNlKCksIG91dCk7Ci0gICAgICB0b3RhbCArPSByZXQucHJvYjsKLSAgICAgICsrY29ycHVzX3Rva2VuczsKLSAgICAgIHByaW50ZXIuV29yZCgiPC9zPiIsIG1vZGVsLkdldFZvY2FidWxhcnkoKS5FbmRTZW50ZW5jZSgpLCByZXQpOwotICAgIH0KLSAgICBwcmludGVyLkxpbmUob292LCB0b3RhbCk7Ci0gICAgY29ycHVzX3RvdGFsICs9IHRvdGFsOwotICAgIGNvcnB1c19vb3YgKz0gb292OwotICB9Ci0gIHByaW50ZXIuU3VtbWFyeSgKLSAgICAgIHBvdygxMC4wLCAtKGNvcnB1c190b3RhbCAvIHN0YXRpY19jYXN0PGRvdWJsZT4oY29ycHVzX3Rva2VucykpKSwgLy8gUFBMIGluY2x1ZGluZyBPT1ZzCi0gICAgICBwb3coMTAuMCwgLSgoY29ycHVzX3RvdGFsIC0gY29ycHVzX3RvdGFsX29vdl9vbmx5KSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oY29ycHVzX3Rva2VucyAtIGNvcnB1c19vb3YpKSksIC8vIFBQTCBleGNsdWRpbmcgT09WcwotICAgICAgY29ycHVzX29vdiwKLSAgICAgIGNvcnB1c190b2tlbnMpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTW9kZWw+IHZvaWQgUXVlcnkoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgQ29uZmlnICZjb25maWcsIGJvb2wgc2VudGVuY2VfY29udGV4dCwgYm9vbCBzaG93X3dvcmRzKSB7Ci0gIE1vZGVsIG1vZGVsKGZpbGUsIGNvbmZpZyk7Ci0gIGlmIChzaG93X3dvcmRzKSB7Ci0gICAgUXVlcnk8TW9kZWwsIEZ1bGxQcmludD4obW9kZWwsIHNlbnRlbmNlX2NvbnRleHQpOwotICB9IGVsc2UgewotICAgIFF1ZXJ5PE1vZGVsLCBCYXNpY1ByaW50Pihtb2RlbCwgc2VudGVuY2VfY29udGV4dCk7Ci0gIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgbmdyYW0KLX0gLy8gbmFtZXNwYWNlIGxtCi0KLSNlbmRpZiAvLyBMTV9OR1JBTV9RVUVSWV9ICi0KLQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3BhcnRpYWwuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vcGFydGlhbC5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhZGM2OS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vcGFydGlhbC5oaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0jaWZuZGVmIExNX1BBUlRJQUxfSAotI2RlZmluZSBMTV9QQVJUSUFMX0gKLQotI2luY2x1ZGUgImxtL3JldHVybi5oaCIKLSNpbmNsdWRlICJsbS9zdGF0ZS5oaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1uYW1lc3BhY2UgbG0gewotbmFtZXNwYWNlIG5ncmFtIHsKLQotc3RydWN0IEV4dGVuZFJldHVybiB7Ci0gIGZsb2F0IGFkanVzdDsKLSAgYm9vbCBtYWtlX2Z1bGw7Ci0gIHVuc2lnbmVkIGNoYXIgbmV4dF91c2U7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgTW9kZWw+IEV4dGVuZFJldHVybiBFeHRlbmRMb29wKAotICAgIGNvbnN0IE1vZGVsICZtb2RlbCwKLSAgICB1bnNpZ25lZCBjaGFyIHNlZW4sIGNvbnN0IFdvcmRJbmRleCAqYWRkX3JiZWdpbiwgY29uc3QgV29yZEluZGV4ICphZGRfcmVuZCwgY29uc3QgZmxvYXQgKmJhY2tvZmZfc3RhcnQsCi0gICAgY29uc3QgdWludDY0X3QgKnBvaW50ZXJzLCBjb25zdCB1aW50NjRfdCAqcG9pbnRlcnNfZW5kLAotICAgIHVpbnQ2NF90IComcG9pbnRlcnNfd3JpdGUsCi0gICAgZmxvYXQgKmJhY2tvZmZfd3JpdGUpIHsKLSAgdW5zaWduZWQgY2hhciBhZGRfbGVuZ3RoID0gYWRkX3JlbmQgLSBhZGRfcmJlZ2luOwotCi0gIGZsb2F0IGJhY2tvZmZfYnVmWzJdW0tFTkxNX01BWF9PUkRFUiAtIDFdOwotICBmbG9hdCAqYmFja29mZl9pbiA9IGJhY2tvZmZfYnVmWzBdLCAqYmFja29mZl9vdXQgPSBiYWNrb2ZmX2J1ZlsxXTsKLSAgc3RkOjpjb3B5KGJhY2tvZmZfc3RhcnQsIGJhY2tvZmZfc3RhcnQgKyBhZGRfbGVuZ3RoLCBiYWNrb2ZmX2luKTsKLQotICBFeHRlbmRSZXR1cm4gdmFsdWU7Ci0gIHZhbHVlLm1ha2VfZnVsbCA9IGZhbHNlOwotICB2YWx1ZS5hZGp1c3QgPSAwLjA7Ci0gIHZhbHVlLm5leHRfdXNlID0gYWRkX2xlbmd0aDsKLQotICB1bnNpZ25lZCBjaGFyIGkgPSAwOwotICB1bnNpZ25lZCBjaGFyIGxlbmd0aCA9IHBvaW50ZXJzX2VuZCAtIHBvaW50ZXJzOwotICAvLyBwb2ludGVyc193cml0ZSBpcyBOVUxMIG1lYW5zIHRoYXQgdGhlIGV4aXN0aW5nIGxlZnQgc3RhdGUgaXMgZnVsbCwgc28gd2Ugc2hvdWxkIHVzZSBjb21wbGV0ZWQgcHJvYmFiaWxpdGllcy4gIAotICBpZiAocG9pbnRlcnNfd3JpdGUpIHsKLSAgICAvLyBVc2luZyBmdWxsIGNvbnRleHQsIHdyaXRpbmcgdG8gbmV3IGxlZnQgc3RhdGUuICAgCi0gICAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgRnVsbFNjb3JlUmV0dXJuIHJldChtb2RlbC5FeHRlbmRMZWZ0KAotICAgICAgICAgIGFkZF9yYmVnaW4sIGFkZF9yYmVnaW4gKyB2YWx1ZS5uZXh0X3VzZSwKLSAgICAgICAgICBiYWNrb2ZmX2luLAotICAgICAgICAgIHBvaW50ZXJzW2ldLCBpICsgc2VlbiArIDEsCi0gICAgICAgICAgYmFja29mZl9vdXQsCi0gICAgICAgICAgdmFsdWUubmV4dF91c2UpKTsKLSAgICAgIHN0ZDo6c3dhcChiYWNrb2ZmX2luLCBiYWNrb2ZmX291dCk7Ci0gICAgICBpZiAocmV0LmluZGVwZW5kZW50X2xlZnQpIHsKLSAgICAgICAgdmFsdWUuYWRqdXN0ICs9IHJldC5wcm9iOwotICAgICAgICB2YWx1ZS5tYWtlX2Z1bGwgPSB0cnVlOwotICAgICAgICArK2k7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgdmFsdWUuYWRqdXN0ICs9IHJldC5yZXN0OwotICAgICAgKnBvaW50ZXJzX3dyaXRlKysgPSByZXQuZXh0ZW5kX2xlZnQ7Ci0gICAgICBpZiAodmFsdWUubmV4dF91c2UgIT0gYWRkX2xlbmd0aCkgewotICAgICAgICB2YWx1ZS5tYWtlX2Z1bGwgPSB0cnVlOwotICAgICAgICArK2k7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICAvLyBVc2luZyBzb21lIG9mIHRoZSBuZXcgY29udGV4dC4gIAotICBmb3IgKDsgaSA8IGxlbmd0aCAmJiB2YWx1ZS5uZXh0X3VzZTsgKytpKSB7Ci0gICAgRnVsbFNjb3JlUmV0dXJuIHJldChtb2RlbC5FeHRlbmRMZWZ0KAotICAgICAgICBhZGRfcmJlZ2luLCBhZGRfcmJlZ2luICsgdmFsdWUubmV4dF91c2UsCi0gICAgICAgIGJhY2tvZmZfaW4sCi0gICAgICAgIHBvaW50ZXJzW2ldLCBpICsgc2VlbiArIDEsCi0gICAgICAgIGJhY2tvZmZfb3V0LAotICAgICAgICB2YWx1ZS5uZXh0X3VzZSkpOwotICAgIHN0ZDo6c3dhcChiYWNrb2ZmX2luLCBiYWNrb2ZmX291dCk7Ci0gICAgdmFsdWUuYWRqdXN0ICs9IHJldC5wcm9iOwotICB9Ci0gIGZsb2F0IHVucmVzdCA9IG1vZGVsLlVuUmVzdChwb2ludGVycyArIGksIHBvaW50ZXJzX2VuZCwgaSArIHNlZW4gKyAxKTsKLSAgLy8gVXNpbmcgbm9uZSBvZiB0aGUgbmV3IGNvbnRleHQuICAKLSAgdmFsdWUuYWRqdXN0ICs9IHVucmVzdDsKLQotICBzdGQ6OmNvcHkoYmFja29mZl9pbiwgYmFja29mZl9pbiArIHZhbHVlLm5leHRfdXNlLCBiYWNrb2ZmX3dyaXRlKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTW9kZWw+IGZsb2F0IFJldmVhbEJlZm9yZShjb25zdCBNb2RlbCAmbW9kZWwsIGNvbnN0IFJpZ2h0ICZyZXZlYWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2VlbiwgYm9vbCByZXZlYWxfZnVsbCwgTGVmdCAmbGVmdCwgUmlnaHQgJnJpZ2h0KSB7Ci0gIGFzc2VydChzZWVuIDwgcmV2ZWFsLmxlbmd0aCB8fCByZXZlYWxfZnVsbCk7Ci0gIHVpbnQ2NF90ICpwb2ludGVyc193cml0ZSA9IHJldmVhbF9mdWxsID8gTlVMTCA6IGxlZnQucG9pbnRlcnM7Ci0gIGZsb2F0IGJhY2tvZmZfYnVmZmVyW0tFTkxNX01BWF9PUkRFUiAtIDFdOwotICBFeHRlbmRSZXR1cm4gdmFsdWUoRXh0ZW5kTG9vcCgKLSAgICAgIG1vZGVsLAotICAgICAgc2VlbiwgcmV2ZWFsLndvcmRzICsgc2VlbiwgcmV2ZWFsLndvcmRzICsgcmV2ZWFsLmxlbmd0aCwgcmV2ZWFsLmJhY2tvZmYgKyBzZWVuLAotICAgICAgbGVmdC5wb2ludGVycywgbGVmdC5wb2ludGVycyArIGxlZnQubGVuZ3RoLAotICAgICAgcG9pbnRlcnNfd3JpdGUsCi0gICAgICBsZWZ0LmZ1bGwgPyBiYWNrb2ZmX2J1ZmZlciA6IChyaWdodC5iYWNrb2ZmICsgcmlnaHQubGVuZ3RoKSkpOwotICBpZiAocmV2ZWFsX2Z1bGwpIHsKLSAgICBsZWZ0Lmxlbmd0aCA9IDA7Ci0gICAgdmFsdWUubWFrZV9mdWxsID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBsZWZ0Lmxlbmd0aCA9IHBvaW50ZXJzX3dyaXRlIC0gbGVmdC5wb2ludGVyczsKLSAgICB2YWx1ZS5tYWtlX2Z1bGwgfD0gKGxlZnQubGVuZ3RoID09IG1vZGVsLk9yZGVyKCkgLSAxKTsKLSAgfQotICBpZiAobGVmdC5mdWxsKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSAwOyBpIDwgdmFsdWUubmV4dF91c2U7ICsraSkgdmFsdWUuYWRqdXN0ICs9IGJhY2tvZmZfYnVmZmVyW2ldOwotICB9IGVsc2UgewotICAgIC8vIElmIGxlZnQgd2Fzbid0IGZ1bGwgd2hlbiBpdCBjYW1lIGluLCBwdXQgd29yZHMgaW50byByaWdodCBzdGF0ZS4gIAotICAgIHN0ZDo6Y29weShyZXZlYWwud29yZHMgKyBzZWVuLCByZXZlYWwud29yZHMgKyBzZWVuICsgdmFsdWUubmV4dF91c2UsIHJpZ2h0LndvcmRzICsgcmlnaHQubGVuZ3RoKTsKLSAgICByaWdodC5sZW5ndGggKz0gdmFsdWUubmV4dF91c2U7Ci0gICAgbGVmdC5mdWxsID0gdmFsdWUubWFrZV9mdWxsIHx8IChyaWdodC5sZW5ndGggPT0gbW9kZWwuT3JkZXIoKSAtIDEpOwotICB9Ci0gIHJldHVybiB2YWx1ZS5hZGp1c3Q7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBNb2RlbD4gZmxvYXQgUmV2ZWFsQWZ0ZXIoY29uc3QgTW9kZWwgJm1vZGVsLCBMZWZ0ICZsZWZ0LCBSaWdodCAmcmlnaHQsIGNvbnN0IExlZnQgJnJldmVhbCwgdW5zaWduZWQgY2hhciBzZWVuKSB7Ci0gIGFzc2VydChzZWVuIDwgcmV2ZWFsLmxlbmd0aCB8fCByZXZlYWwuZnVsbCk7Ci0gIHVpbnQ2NF90ICpwb2ludGVyc193cml0ZSA9IGxlZnQuZnVsbCA/IE5VTEwgOiAobGVmdC5wb2ludGVycyArIGxlZnQubGVuZ3RoKTsKLSAgRXh0ZW5kUmV0dXJuIHZhbHVlKEV4dGVuZExvb3AoCi0gICAgICBtb2RlbCwKLSAgICAgIHNlZW4sIHJpZ2h0LndvcmRzLCByaWdodC53b3JkcyArIHJpZ2h0Lmxlbmd0aCwgcmlnaHQuYmFja29mZiwKLSAgICAgIHJldmVhbC5wb2ludGVycyArIHNlZW4sIHJldmVhbC5wb2ludGVycyArIHJldmVhbC5sZW5ndGgsCi0gICAgICBwb2ludGVyc193cml0ZSwKLSAgICAgIHJpZ2h0LmJhY2tvZmYpKTsKLSAgaWYgKHJldmVhbC5mdWxsKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSAwOyBpIDwgdmFsdWUubmV4dF91c2U7ICsraSkgdmFsdWUuYWRqdXN0ICs9IHJpZ2h0LmJhY2tvZmZbaV07Ci0gICAgcmlnaHQubGVuZ3RoID0gMDsKLSAgICB2YWx1ZS5tYWtlX2Z1bGwgPSB0cnVlOwotICB9IGVsc2UgewotICAgIHJpZ2h0Lmxlbmd0aCA9IHZhbHVlLm5leHRfdXNlOwotICAgIHZhbHVlLm1ha2VfZnVsbCB8PSAocmlnaHQubGVuZ3RoID09IG1vZGVsLk9yZGVyKCkgLSAxKTsKLSAgfQotICBpZiAoIWxlZnQuZnVsbCkgewotICAgIGxlZnQubGVuZ3RoID0gcG9pbnRlcnNfd3JpdGUgLSBsZWZ0LnBvaW50ZXJzOwotICAgIGxlZnQuZnVsbCA9IHZhbHVlLm1ha2VfZnVsbCB8fCAobGVmdC5sZW5ndGggPT0gbW9kZWwuT3JkZXIoKSAtIDEpOwotICB9Ci0gIHJldHVybiB2YWx1ZS5hZGp1c3Q7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBNb2RlbD4gZmxvYXQgU3Vic3VtZShjb25zdCBNb2RlbCAmbW9kZWwsIExlZnQgJmZpcnN0X2xlZnQsIGNvbnN0IFJpZ2h0ICZmaXJzdF9yaWdodCwgY29uc3QgTGVmdCAmc2Vjb25kX2xlZnQsIFJpZ2h0ICZzZWNvbmRfcmlnaHQsIGNvbnN0IHVuc2lnbmVkIGludCBiZXR3ZWVuX2xlbmd0aCkgewotICBhc3NlcnQoZmlyc3RfcmlnaHQubGVuZ3RoIDwgS0VOTE1fTUFYX09SREVSKTsKLSAgYXNzZXJ0KHNlY29uZF9sZWZ0Lmxlbmd0aCA8IEtFTkxNX01BWF9PUkRFUik7Ci0gIGFzc2VydChiZXR3ZWVuX2xlbmd0aCA8IEtFTkxNX01BWF9PUkRFUiAtIDEpOwotICB1aW50NjRfdCAqcG9pbnRlcnNfd3JpdGUgPSBmaXJzdF9sZWZ0LmZ1bGwgPyBOVUxMIDogKGZpcnN0X2xlZnQucG9pbnRlcnMgKyBmaXJzdF9sZWZ0Lmxlbmd0aCk7Ci0gIGZsb2F0IGJhY2tvZmZfYnVmZmVyW0tFTkxNX01BWF9PUkRFUiAtIDFdOwotICBFeHRlbmRSZXR1cm4gdmFsdWUoRXh0ZW5kTG9vcCgKLSAgICAgICAgbW9kZWwsCi0gICAgICAgIGJldHdlZW5fbGVuZ3RoLCBmaXJzdF9yaWdodC53b3JkcywgZmlyc3RfcmlnaHQud29yZHMgKyBmaXJzdF9yaWdodC5sZW5ndGgsIGZpcnN0X3JpZ2h0LmJhY2tvZmYsCi0gICAgICAgIHNlY29uZF9sZWZ0LnBvaW50ZXJzLCBzZWNvbmRfbGVmdC5wb2ludGVycyArIHNlY29uZF9sZWZ0Lmxlbmd0aCwKLSAgICAgICAgcG9pbnRlcnNfd3JpdGUsCi0gICAgICAgIHNlY29uZF9sZWZ0LmZ1bGwgPyBiYWNrb2ZmX2J1ZmZlciA6IChzZWNvbmRfcmlnaHQuYmFja29mZiArIHNlY29uZF9yaWdodC5sZW5ndGgpKSk7Ci0gIGlmIChzZWNvbmRfbGVmdC5mdWxsKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSAwOyBpIDwgdmFsdWUubmV4dF91c2U7ICsraSkgdmFsdWUuYWRqdXN0ICs9IGJhY2tvZmZfYnVmZmVyW2ldOwotICB9IGVsc2UgewotICAgIHN0ZDo6Y29weShmaXJzdF9yaWdodC53b3JkcywgZmlyc3RfcmlnaHQud29yZHMgKyB2YWx1ZS5uZXh0X3VzZSwgc2Vjb25kX3JpZ2h0LndvcmRzICsgc2Vjb25kX3JpZ2h0Lmxlbmd0aCk7Ci0gICAgc2Vjb25kX3JpZ2h0Lmxlbmd0aCArPSB2YWx1ZS5uZXh0X3VzZTsKLSAgICB2YWx1ZS5tYWtlX2Z1bGwgfD0gKHNlY29uZF9yaWdodC5sZW5ndGggPT0gbW9kZWwuT3JkZXIoKSAtIDEpOwotICB9Ci0gIGlmICghZmlyc3RfbGVmdC5mdWxsKSB7Ci0gICAgZmlyc3RfbGVmdC5sZW5ndGggPSBwb2ludGVyc193cml0ZSAtIGZpcnN0X2xlZnQucG9pbnRlcnM7Ci0gICAgZmlyc3RfbGVmdC5mdWxsID0gdmFsdWUubWFrZV9mdWxsIHx8IHNlY29uZF9sZWZ0LmZ1bGwgfHwgKGZpcnN0X2xlZnQubGVuZ3RoID09IG1vZGVsLk9yZGVyKCkgLSAxKTsKLSAgfQotICBhc3NlcnQoZmlyc3RfbGVmdC5sZW5ndGggPCBLRU5MTV9NQVhfT1JERVIpOwotICBhc3NlcnQoc2Vjb25kX3JpZ2h0Lmxlbmd0aCA8IEtFTkxNX01BWF9PUkRFUik7Ci0gIHJldHVybiB2YWx1ZS5hZGp1c3Q7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIG5ncmFtCi19IC8vIG5hbWVzcGFjZSBsbQotCi0jZW5kaWYgLy8gTE1fUEFSVElBTF9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vcGFydGlhbF90ZXN0LmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3BhcnRpYWxfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzMDljOC4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vcGFydGlhbF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLSNpbmNsdWRlICJsbS9wYXJ0aWFsLmhoIgotCi0jaW5jbHVkZSAibG0vbGVmdC5oaCIKLSNpbmNsdWRlICJsbS9tb2RlbC5oaCIKLSNpbmNsdWRlICJ1dGlsL3Rva2VuaXplX3BpZWNlLmhoIgotCi0jZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFBhcnRpYWxUZXN0Ci0jaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3Rlc3QvZmxvYXRpbmdfcG9pbnRfY29tcGFyaXNvbi5ocHA+Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgbmdyYW0gewotbmFtZXNwYWNlIHsKLQotY29uc3QgY2hhciAqVGVzdExvY2F0aW9uKCkgewotICBpZiAoYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgPCAyKSB7Ci0gICAgcmV0dXJuICJ0ZXN0LmFycGEiOwotICB9Ci0gIHJldHVybiBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlsxXTsKLX0KLQotQ29uZmlnIFNpbGVudENvbmZpZygpIHsKLSAgQ29uZmlnIGNvbmZpZzsKLSAgY29uZmlnLmFycGFfY29tcGxhaW4gPSBDb25maWc6Ok5PTkU7Ci0gIGNvbmZpZy5tZXNzYWdlcyA9IE5VTEw7Ci0gIHJldHVybiBjb25maWc7Ci19Ci0KLXN0cnVjdCBNb2RlbEZpeHR1cmUgewotICBNb2RlbEZpeHR1cmUoKSA6IG0oVGVzdExvY2F0aW9uKCksIFNpbGVudENvbmZpZygpKSB7fQotCi0gIFJlc3RQcm9iaW5nTW9kZWwgbTsKLX07Ci0KLUJPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShzdWl0ZSwgTW9kZWxGaXh0dXJlKQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShTaW1wbGVCZWZvcmUpIHsKLSAgTGVmdCBsZWZ0OwotICBsZWZ0LmZ1bGwgPSBmYWxzZTsKLSAgbGVmdC5sZW5ndGggPSAwOwotICBSaWdodCByaWdodDsKLSAgcmlnaHQubGVuZ3RoID0gMDsKLQotICBSaWdodCByZXZlYWw7Ci0gIHJldmVhbC5sZW5ndGggPSAxOwotICBXb3JkSW5kZXggcGVyaW9kID0gbS5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgoIi4iKTsKLSAgcmV2ZWFsLndvcmRzWzBdID0gcGVyaW9kOwotICByZXZlYWwuYmFja29mZlswXSA9IC0wLjg0NTA5ODsKLQotICBCT09TVF9DSEVDS19DTE9TRSgwLjAsIFJldmVhbEJlZm9yZShtLCByZXZlYWwsIDAsIGZhbHNlLCBsZWZ0LCByaWdodCksIDAuMDAxKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgbGVmdC5sZW5ndGgpOwotICBCT09TVF9DSEVDSyghbGVmdC5mdWxsKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgcmlnaHQubGVuZ3RoKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwocGVyaW9kLCByaWdodC53b3Jkc1swXSk7Ci0gIEJPT1NUX0NIRUNLX0NMT1NFKC0wLjg0NTA5OCwgcmlnaHQuYmFja29mZlswXSwgMC4wMDEpOwotCi0gIFdvcmRJbmRleCBtb3JlID0gbS5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgoIm1vcmUiKTsKLSAgcmV2ZWFsLndvcmRzWzFdID0gbW9yZTsKLSAgcmV2ZWFsLmJhY2tvZmZbMV0gPSAgLTAuNDc3MTIxMjsKLSAgcmV2ZWFsLmxlbmd0aCA9IDI7Ci0gIEJPT1NUX0NIRUNLX0NMT1NFKDAuMCwgUmV2ZWFsQmVmb3JlKG0sIHJldmVhbCwgMSwgZmFsc2UsIGxlZnQsIHJpZ2h0KSwgMC4wMDEpOwotICBCT09TVF9DSEVDS19FUVVBTCgwLCBsZWZ0Lmxlbmd0aCk7Ci0gIEJPT1NUX0NIRUNLKCFsZWZ0LmZ1bGwpOwotICBCT09TVF9DSEVDS19FUVVBTCgyLCByaWdodC5sZW5ndGgpOwotICBCT09TVF9DSEVDS19FUVVBTChwZXJpb2QsIHJpZ2h0LndvcmRzWzBdKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobW9yZSwgcmlnaHQud29yZHNbMV0pOwotICBCT09TVF9DSEVDS19DTE9TRSgtMC44NDUwOTgsIHJpZ2h0LmJhY2tvZmZbMF0sIDAuMDAxKTsKLSAgQk9PU1RfQ0hFQ0tfQ0xPU0UoLTAuNDc3MTIxMiwgcmlnaHQuYmFja29mZlsxXSwgMC4wMDEpOwotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShBbHNvV291bGRDb25zaWRlcikgewotICBXb3JkSW5kZXggd291bGQgPSBtLkdldFZvY2FidWxhcnkoKS5JbmRleCgid291bGQiKTsKLSAgV29yZEluZGV4IGNvbnNpZGVyID0gbS5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgoImNvbnNpZGVyIik7Ci0KLSAgQ2hhcnRTdGF0ZSBjdXJyZW50OwotICBjdXJyZW50LmxlZnQubGVuZ3RoID0gMTsKLSAgY3VycmVudC5sZWZ0LnBvaW50ZXJzWzBdID0gd291bGQ7Ci0gIGN1cnJlbnQubGVmdC5mdWxsID0gZmFsc2U7Ci0gIGN1cnJlbnQucmlnaHQubGVuZ3RoID0gMTsKLSAgY3VycmVudC5yaWdodC53b3Jkc1swXSA9IHdvdWxkOwotICBjdXJyZW50LnJpZ2h0LmJhY2tvZmZbMF0gPSAtMC4zMDEwMzsKLQotICBMZWZ0IGFmdGVyOwotICBhZnRlci5mdWxsID0gZmFsc2U7Ci0gIGFmdGVyLmxlbmd0aCA9IDE7Ci0gIGFmdGVyLnBvaW50ZXJzWzBdID0gY29uc2lkZXI7Ci0KLSAgLy8gYWRqdXN0bWVudCBmb3Igd291bGQgY29uc2lkZXIKLSAgQk9PU1RfQ0hFQ0tfQ0xPU0UoLTEuNjg3ODcyIC0gLTAuMjkyMjA5NSAtIDAuMzAxMDMsIFJldmVhbEFmdGVyKG0sIGN1cnJlbnQubGVmdCwgY3VycmVudC5yaWdodCwgYWZ0ZXIsIDApLCAwLjAwMSk7Ci0KLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgY3VycmVudC5sZWZ0Lmxlbmd0aCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKHdvdWxkLCBjdXJyZW50LmxlZnQucG9pbnRlcnNbMF0pOwotICBCT09TVF9DSEVDS19FUVVBTChmYWxzZSwgY3VycmVudC5sZWZ0LmZ1bGwpOwotCi0gIFdvcmRJbmRleCBhbHNvID0gbS5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgoImFsc28iKTsKLSAgUmlnaHQgYmVmb3JlOwotICBiZWZvcmUubGVuZ3RoID0gMTsKLSAgYmVmb3JlLndvcmRzWzBdID0gYWxzbzsKLSAgYmVmb3JlLmJhY2tvZmZbMF0gPSAtMC4zMDEwMzsKLSAgLy8gcih3b3VsZCkgPSAtMC4yOTIyMDk1IFtpIHdvdWxkXSwgcih3b3VsZCAtPiBjb25zaWRlcikgPSAtMS45ODg5MDIgW2Iod291bGQpICsgcChjb25zaWRlcildCi0gIC8vIHAoYWxzbyAtPiB3b3VsZCkgPSAtMiwgcChhbHNvIHdvdWxkIC0+IGNvbnNpZGVyKSA9IC0zCi0gIEJPT1NUX0NIRUNLX0NMT1NFKC0yICsgMC4yOTIyMDk1IC0zICsgMS45ODg5MDIsIFJldmVhbEJlZm9yZShtLCBiZWZvcmUsIDAsIGZhbHNlLCBjdXJyZW50LmxlZnQsIGN1cnJlbnQucmlnaHQpLCAwLjAwMSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDAsIGN1cnJlbnQubGVmdC5sZW5ndGgpOwotICBCT09TVF9DSEVDSyhjdXJyZW50LmxlZnQuZnVsbCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDIsIGN1cnJlbnQucmlnaHQubGVuZ3RoKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwod291bGQsIGN1cnJlbnQucmlnaHQud29yZHNbMF0pOwotICBCT09TVF9DSEVDS19FUVVBTChhbHNvLCBjdXJyZW50LnJpZ2h0LndvcmRzWzFdKTsKLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoRW5kU2VudGVuY2UpIHsKLSAgV29yZEluZGV4IGxvaW4gPSBtLkdldFZvY2FidWxhcnkoKS5JbmRleCgibG9pbiIpOwotICBXb3JkSW5kZXggcGVyaW9kID0gbS5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgoIi4iKTsKLSAgV29yZEluZGV4IGVvcyA9IG0uR2V0Vm9jYWJ1bGFyeSgpLkVuZFNlbnRlbmNlKCk7Ci0KLSAgQ2hhcnRTdGF0ZSBiZXR3ZWVuOwotICBiZXR3ZWVuLmxlZnQubGVuZ3RoID0gMTsKLSAgYmV0d2Vlbi5sZWZ0LnBvaW50ZXJzWzBdID0gZW9zOwotICBiZXR3ZWVuLmxlZnQuZnVsbCA9IHRydWU7Ci0gIGJldHdlZW4ucmlnaHQubGVuZ3RoID0gMDsKLQotICBSaWdodCBiZWZvcmU7Ci0gIGJlZm9yZS53b3Jkc1swXSA9IHBlcmlvZDsKLSAgYmVmb3JlLndvcmRzWzFdID0gbG9pbjsKLSAgYmVmb3JlLmJhY2tvZmZbMF0gPSAtMC44NDUwOTg7Ci0gIGJlZm9yZS5iYWNrb2ZmWzFdID0gMC4wOwotICAKLSAgYmVmb3JlLmxlbmd0aCA9IDE7Ci0gIEJPT1NUX0NIRUNLX0NMT1NFKC0wLjA0MTA3MDcsIFJldmVhbEJlZm9yZShtLCBiZWZvcmUsIDAsIHRydWUsIGJldHdlZW4ubGVmdCwgYmV0d2Vlbi5yaWdodCksIDAuMDAxKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgYmV0d2Vlbi5sZWZ0Lmxlbmd0aCk7Ci19Ci0KLWZsb2F0IFNjb3JlRnJhZ21lbnQoY29uc3QgUmVzdFByb2JpbmdNb2RlbCAmbW9kZWwsIHVuc2lnbmVkIGludCAqYmVnaW4sIHVuc2lnbmVkIGludCAqZW5kLCBDaGFydFN0YXRlICZvdXQpIHsKLSAgUnVsZVNjb3JlPFJlc3RQcm9iaW5nTW9kZWw+IHNjb3Jlcihtb2RlbCwgb3V0KTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgKmkgPSBiZWdpbjsgaSA8IGVuZDsgKytpKSB7Ci0gICAgc2NvcmVyLlRlcm1pbmFsKCppKTsKLSAgfQotICByZXR1cm4gc2NvcmVyLkZpbmlzaCgpOwotfQotCi12b2lkIENoZWNrQWRqdXN0bWVudChjb25zdCBSZXN0UHJvYmluZ01vZGVsICZtb2RlbCwgZmxvYXQgZXhwZWN0LCBjb25zdCBSaWdodCAmYmVmb3JlX2luLCBib29sIGJlZm9yZV9mdWxsLCBDaGFydFN0YXRlIGJldHdlZW4sIGNvbnN0IExlZnQgJmFmdGVyX2luKSB7Ci0gIFJpZ2h0IGJlZm9yZShiZWZvcmVfaW4pOwotICBMZWZ0IGFmdGVyKGFmdGVyX2luKTsKLSAgYWZ0ZXIuZnVsbCA9IGZhbHNlOwotICBmbG9hdCBnb3QgPSAwLjA7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAxOyBpIDwgNTsgKytpKSB7Ci0gICAgaWYgKGJlZm9yZV9pbi5sZW5ndGggPj0gaSkgewotICAgICAgYmVmb3JlLmxlbmd0aCA9IGk7Ci0gICAgICBnb3QgKz0gUmV2ZWFsQmVmb3JlKG1vZGVsLCBiZWZvcmUsIGkgLSAxLCBmYWxzZSwgYmV0d2Vlbi5sZWZ0LCBiZXR3ZWVuLnJpZ2h0KTsKLSAgICB9Ci0gICAgaWYgKGFmdGVyX2luLmxlbmd0aCA+PSBpKSB7Ci0gICAgICBhZnRlci5sZW5ndGggPSBpOwotICAgICAgZ290ICs9IFJldmVhbEFmdGVyKG1vZGVsLCBiZXR3ZWVuLmxlZnQsIGJldHdlZW4ucmlnaHQsIGFmdGVyLCBpIC0gMSk7Ci0gICAgfQotICB9Ci0gIGlmIChhZnRlcl9pbi5mdWxsKSB7Ci0gICAgYWZ0ZXIuZnVsbCA9IHRydWU7Ci0gICAgZ290ICs9IFJldmVhbEFmdGVyKG1vZGVsLCBiZXR3ZWVuLmxlZnQsIGJldHdlZW4ucmlnaHQsIGFmdGVyLCBhZnRlci5sZW5ndGgpOwotICB9Ci0gIGlmIChiZWZvcmVfZnVsbCkgewotICAgIGdvdCArPSBSZXZlYWxCZWZvcmUobW9kZWwsIGJlZm9yZSwgYmVmb3JlLmxlbmd0aCwgdHJ1ZSwgYmV0d2Vlbi5sZWZ0LCBiZXR3ZWVuLnJpZ2h0KTsKLSAgfQotICAvLyBTb21ldGltZXMgdGhleSdyZSB6ZXJvIGFuZCBCT09TVF9DSEVDS19DTE9TRSBmYWlscyBmb3IgdGhpcy4gCi0gIEJPT1NUX0NIRUNLKGZhYnMoZXhwZWN0IC0gZ290KSA8IDAuMDAxKTsKLX0KLQotdm9pZCBGdWxsRGl2aWRlKGNvbnN0IFJlc3RQcm9iaW5nTW9kZWwgJm1vZGVsLCBTdHJpbmdQaWVjZSBzdHIpIHsKLSAgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiBpbmRpY2VzOwotICBmb3IgKHV0aWw6OlRva2VuSXRlcjx1dGlsOjpTaW5nbGVDaGFyYWN0ZXIsIHRydWU+IGkoc3RyLCAnICcpOyBpOyArK2kpIHsKLSAgICBpbmRpY2VzLnB1c2hfYmFjayhtb2RlbC5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgoKmkpKTsKLSAgfQotICBDaGFydFN0YXRlIGZ1bGxfc3RhdGU7Ci0gIGZsb2F0IGZ1bGwgPSBTY29yZUZyYWdtZW50KG1vZGVsLCAmaW5kaWNlcy5mcm9udCgpLCAmaW5kaWNlcy5iYWNrKCkgKyAxLCBmdWxsX3N0YXRlKTsKLQotICBDaGFydFN0YXRlIGJlZm9yZV9zdGF0ZTsKLSAgYmVmb3JlX3N0YXRlLmxlZnQuZnVsbCA9IGZhbHNlOwotICBSdWxlU2NvcmU8UmVzdFByb2JpbmdNb2RlbD4gYmVmb3JlX3Njb3Jlcihtb2RlbCwgYmVmb3JlX3N0YXRlKTsKLSAgZmxvYXQgYmVmb3JlX3Njb3JlID0gMC4wOwotICBmb3IgKHVuc2lnbmVkIGludCBiZWZvcmUgPSAwOyBiZWZvcmUgPCBpbmRpY2VzLnNpemUoKTsgKytiZWZvcmUpIHsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBhZnRlciA9IGJlZm9yZTsgYWZ0ZXIgPD0gaW5kaWNlcy5zaXplKCk7ICsrYWZ0ZXIpIHsKLSAgICAgIENoYXJ0U3RhdGUgYWZ0ZXJfc3RhdGUsIGJldHdlZW5fc3RhdGU7Ci0gICAgICBmbG9hdCBhZnRlcl9zY29yZSA9IFNjb3JlRnJhZ21lbnQobW9kZWwsICZpbmRpY2VzLmZyb250KCkgKyBhZnRlciwgJmluZGljZXMuZnJvbnQoKSArIGluZGljZXMuc2l6ZSgpLCBhZnRlcl9zdGF0ZSk7Ci0gICAgICBmbG9hdCBiZXR3ZWVuX3Njb3JlID0gU2NvcmVGcmFnbWVudChtb2RlbCwgJmluZGljZXMuZnJvbnQoKSArIGJlZm9yZSwgJmluZGljZXMuZnJvbnQoKSArIGFmdGVyLCBiZXR3ZWVuX3N0YXRlKTsKLSAgICAgIENoZWNrQWRqdXN0bWVudChtb2RlbCwgZnVsbCAtIGJlZm9yZV9zY29yZSAtIGFmdGVyX3Njb3JlIC0gYmV0d2Vlbl9zY29yZSwgYmVmb3JlX3N0YXRlLnJpZ2h0LCBiZWZvcmVfc3RhdGUubGVmdC5mdWxsLCBiZXR3ZWVuX3N0YXRlLCBhZnRlcl9zdGF0ZS5sZWZ0KTsKLSAgICB9Ci0gICAgYmVmb3JlX3Njb3Jlci5UZXJtaW5hbChpbmRpY2VzW2JlZm9yZV0pOwotICAgIGJlZm9yZV9zY29yZSA9IGJlZm9yZV9zY29yZXIuRmluaXNoKCk7Ci0gIH0KLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoU3RyaW5ncykgewotICBGdWxsRGl2aWRlKG0sICJhbHNvIHdvdWxkIGNvbnNpZGVyIik7Ci0gIEZ1bGxEaXZpZGUobSwgImxvb2tpbmcgb24gYSBsaXR0bGUgbW9yZSBsb2luIC4gPC9zPiIpOwotICBGdWxsRGl2aWRlKG0sICJpbiBiaWFycml0eiB3YXRjaGluZyBjb25zaWRlcmluZyBsb29raW5nIC4gb24gYSBsaXR0bGUgbW9yZSBsb2luIGFsc28gd291bGQgY29uc2lkZXIgaGlnaGVyIHRvIGxvb2sgZ29vZCB1bmtub3duIHRoZSBzY3JlZW5pbmcgZm9vIGJhciAsIHVua25vd24gaG93ZXZlciB1bmtub3duIDwvcz4iKTsKLX0KLQotQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCi19IC8vIG5hbWVzcGFjZQotfSAvLyBuYW1lc3BhY2UgbmdyYW0KLX0gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vcXVhbnRpemUuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vcXVhbnRpemUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3M2VhMzkuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3F1YW50aXplLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyogUXVhbnRpemUgaW50byBiaW5zIG9mIGVxdWFsIHNpemUgYXMgZGVzY3JpYmVkIGluCi0gKiBNLiBGZWRlcmljbyBhbmQgTi4gQmVydG9sZGkuIDIwMDYuIEhvdyBtYW55IGJpdHMgYXJlIG5lZWRlZAotICogdG8gc3RvcmUgcHJvYmFiaWxpdGllcyBmb3IgcGhyYXNlLWJhc2VkIHRyYW5zbGF0aW9uPyBJbiBQcm9jLgotICogb2YgdGhlIFdvcmtzaG9wIG9uIFN0YXRpc3RpY2FsIE1hY2hpbmUgVHJhbnNsYXRpb24sIHBhZ2VzCi0gKiA5NOKAkzEwMSwgTmV3IFlvcmsgQ2l0eSwgSnVuZS4gQXNzb2NpYXRpb24gZm9yIENvbXB1dGEtCi0gKiB0aW9uYWwgTGluZ3Vpc3RpY3MuCi0gKi8KLQotI2luY2x1ZGUgImxtL3F1YW50aXplLmhoIgotCi0jaW5jbHVkZSAibG0vYmluYXJ5X2Zvcm1hdC5oaCIKLSNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAidXRpbC9maWxlLmhoIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG51bWVyaWM+Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgbmdyYW0gewotCi1uYW1lc3BhY2UgewotCi12b2lkIE1ha2VCaW5zKHN0ZDo6dmVjdG9yPGZsb2F0PiAmdmFsdWVzLCBmbG9hdCAqY2VudGVycywgdWludDMyX3QgYmlucykgewotICBzdGQ6OnNvcnQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7Ci0gIHN0ZDo6dmVjdG9yPGZsb2F0Pjo6Y29uc3RfaXRlcmF0b3Igc3RhcnQgPSB2YWx1ZXMuYmVnaW4oKSwgZmluaXNoOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluczsgKytpLCArK2NlbnRlcnMsIHN0YXJ0ID0gZmluaXNoKSB7Ci0gICAgZmluaXNoID0gdmFsdWVzLmJlZ2luKCkgKyAoKHZhbHVlcy5zaXplKCkgKiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oaSArIDEpKSAvIGJpbnMpOwotICAgIGlmIChmaW5pc2ggPT0gc3RhcnQpIHsKLSAgICAgIC8vIHplcm8gbGVuZ3RoIGJ1Y2tldC4KLSAgICAgICpjZW50ZXJzID0gaSA/ICooY2VudGVycyAtIDEpIDogLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAqY2VudGVycyA9IHN0ZDo6YWNjdW11bGF0ZShzdGFydCwgZmluaXNoLCAwLjApIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGZpbmlzaCAtIHN0YXJ0KTsKLSAgICB9Ci0gIH0KLX0KLQotY29uc3QgY2hhciBrU2VwYXJhdGVseVF1YW50aXplVmVyc2lvbiA9IDI7Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLXZvaWQgU2VwYXJhdGVseVF1YW50aXplOjpVcGRhdGVDb25maWdGcm9tQmluYXJ5KGNvbnN0IEJpbmFyeUZvcm1hdCAmZmlsZSwgdWludDY0X3Qgb2Zmc2V0LCBDb25maWcgJmNvbmZpZykgewotICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclszXTsKLSAgZmlsZS5SZWFkRm9yQ29uZmlnKGJ1ZmZlciwgMywgb2Zmc2V0KTsKLSAgY2hhciB2ZXJzaW9uID0gYnVmZmVyWzBdOwotICBjb25maWcucHJvYl9iaXRzID0gYnVmZmVyWzFdOwotICBjb25maWcuYmFja29mZl9iaXRzID0gYnVmZmVyWzJdOwotICBpZiAodmVyc2lvbiAhPSBrU2VwYXJhdGVseVF1YW50aXplVmVyc2lvbikgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiVGhpcyBmaWxlIGhhcyBxdWFudGl6YXRpb24gdmVyc2lvbiAiIDw8ICh1bnNpZ25lZCl2ZXJzaW9uIDw8ICIgYnV0IHRoZSBjb2RlIGV4cGVjdHMgdmVyc2lvbiAiIDw8ICh1bnNpZ25lZClrU2VwYXJhdGVseVF1YW50aXplVmVyc2lvbik7Ci19Ci0KLXZvaWQgU2VwYXJhdGVseVF1YW50aXplOjpTZXR1cE1lbW9yeSh2b2lkICpiYXNlLCB1bnNpZ25lZCBjaGFyIG9yZGVyLCBjb25zdCBDb25maWcgJmNvbmZpZykgewotICBwcm9iX2JpdHNfID0gY29uZmlnLnByb2JfYml0czsKLSAgYmFja29mZl9iaXRzXyA9IGNvbmZpZy5iYWNrb2ZmX2JpdHM7Ci0gIC8vIFdlIG5lZWQgdGhlIHJlc2VydmVkIHZhbHVlcy4gIAotICBpZiAoY29uZmlnLnByb2JfYml0cyA9PSAwKSBVVElMX1RIUk9XKENvbmZpZ0V4Y2VwdGlvbiwgIllvdSBjYW4ndCBxdWFudGl6ZSBwcm9iYWJpbGl0eSB0byB6ZXJvIik7Ci0gIGlmIChjb25maWcuYmFja29mZl9iaXRzID09IDApIFVUSUxfVEhST1coQ29uZmlnRXhjZXB0aW9uLCAiWW91IGNhbid0IHF1YW50aXplIGJhY2tvZmYgdG8gemVybyIpOwotICBpZiAoY29uZmlnLnByb2JfYml0cyA+IDI1KSBVVElMX1RIUk9XKENvbmZpZ0V4Y2VwdGlvbiwgIkZvciBlZmZpY2llbmN5IHJlYXNvbnMsIHF1YW50aXppbmcgcHJvYmFiaWxpdHkgc3VwcG9ydHMgYXQgbW9zdCAyNSBiaXRzLiAgQ3VycmVudGx5IHlvdSBoYXZlIHJlcXVlc3RlZCAiIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihjb25maWcucHJvYl9iaXRzKSA8PCAiIGJpdHMuIik7Ci0gIGlmIChjb25maWcuYmFja29mZl9iaXRzID4gMjUpIFVUSUxfVEhST1coQ29uZmlnRXhjZXB0aW9uLCAiRm9yIGVmZmljaWVuY3kgcmVhc29ucywgcXVhbnRpemluZyBiYWNrb2ZmIHN1cHBvcnRzIGF0IG1vc3QgMjUgYml0cy4gIEN1cnJlbnRseSB5b3UgaGF2ZSByZXF1ZXN0ZWQgIiA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oY29uZmlnLmJhY2tvZmZfYml0cykgPDwgIiBiaXRzLiIpOwotICAvLyBSZXNlcnZlIDggYnl0ZSBoZWFkZXIgZm9yIGJpdCBjb3VudHMuICAKLSAgYWN0dWFsX2Jhc2VfID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJhc2UpOwotICBmbG9hdCAqc3RhcnQgPSByZWludGVycHJldF9jYXN0PGZsb2F0Kj4oYWN0dWFsX2Jhc2VfICsgOCk7Ci0gIGZvciAodW5zaWduZWQgY2hhciBpID0gMDsgaSA8IG9yZGVyIC0gMjsgKytpKSB7Ci0gICAgdGFibGVzX1tpXVswXSA9IEJpbnMocHJvYl9iaXRzXywgc3RhcnQpOwotICAgIHN0YXJ0ICs9ICgxVUxMIDw8IHByb2JfYml0c18pOwotICAgIHRhYmxlc19baV1bMV0gPSBCaW5zKGJhY2tvZmZfYml0c18sIHN0YXJ0KTsKLSAgICBzdGFydCArPSAoMVVMTCA8PCBiYWNrb2ZmX2JpdHNfKTsKLSAgfQotICBsb25nZXN0XyA9IHRhYmxlc19bb3JkZXIgLSAyXVswXSA9IEJpbnMocHJvYl9iaXRzXywgc3RhcnQpOwotfQotCi12b2lkIFNlcGFyYXRlbHlRdWFudGl6ZTo6VHJhaW4odWludDhfdCBvcmRlciwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICZwcm9iLCBzdGQ6OnZlY3RvcjxmbG9hdD4gJmJhY2tvZmYpIHsKLSAgVHJhaW5Qcm9iKG9yZGVyLCBwcm9iKTsKLQotICAvLyBCYWNrb2ZmCi0gIGZsb2F0ICpjZW50ZXJzID0gdGFibGVzX1tvcmRlciAtIDJdWzFdLlBvcHVsYXRlKCk7Ci0gICooY2VudGVycysrKSA9IGtOb0V4dGVuc2lvbkJhY2tvZmY7Ci0gICooY2VudGVycysrKSA9IGtFeHRlbnNpb25CYWNrb2ZmOwotICBNYWtlQmlucyhiYWNrb2ZmLCBjZW50ZXJzLCAoMVVMTCA8PCBiYWNrb2ZmX2JpdHNfKSAtIDIpOwotfQotCi12b2lkIFNlcGFyYXRlbHlRdWFudGl6ZTo6VHJhaW5Qcm9iKHVpbnQ4X3Qgb3JkZXIsIHN0ZDo6dmVjdG9yPGZsb2F0PiAmcHJvYikgewotICBmbG9hdCAqY2VudGVycyA9IHRhYmxlc19bb3JkZXIgLSAyXVswXS5Qb3B1bGF0ZSgpOwotICBNYWtlQmlucyhwcm9iLCBjZW50ZXJzLCAoMVVMTCA8PCBwcm9iX2JpdHNfKSk7Ci19Ci0KLXZvaWQgU2VwYXJhdGVseVF1YW50aXplOjpGaW5pc2hlZExvYWRpbmcoY29uc3QgQ29uZmlnICZjb25maWcpIHsKLSAgdWludDhfdCAqYWN0dWFsX2Jhc2UgPSBhY3R1YWxfYmFzZV87Ci0gICooYWN0dWFsX2Jhc2UrKykgPSBrU2VwYXJhdGVseVF1YW50aXplVmVyc2lvbjsgLy8gdmVyc2lvbgotICAqKGFjdHVhbF9iYXNlKyspID0gY29uZmlnLnByb2JfYml0czsKLSAgKihhY3R1YWxfYmFzZSsrKSA9IGNvbmZpZy5iYWNrb2ZmX2JpdHM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIG5ncmFtCi19IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3F1YW50aXplLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3F1YW50aXplLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGEzMDg3Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9xdWFudGl6ZS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0jaWZuZGVmIExNX1FVQU5USVpFX0gKLSNkZWZpbmUgTE1fUVVBTlRJWkVfSAotCi0jaW5jbHVkZSAibG0vYmxhbmsuaGgiCi0jaW5jbHVkZSAibG0vY29uZmlnLmhoIgotI2luY2x1ZGUgImxtL21heF9vcmRlci5oaCIKLSNpbmNsdWRlICJsbS9tb2RlbF90eXBlLmhoIgotI2luY2x1ZGUgInV0aWwvYml0X3BhY2tpbmcuaGgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotbmFtZXNwYWNlIGxtIHsKLW5hbWVzcGFjZSBuZ3JhbSB7Ci0KLXN0cnVjdCBDb25maWc7Ci1jbGFzcyBCaW5hcnlGb3JtYXQ7Ci0KLS8qIFN0b3JlIHZhbHVlcyBkaXJlY3RseSBhbmQgZG9uJ3QgcXVhbnRpemUuICovCi1jbGFzcyBEb250UXVhbnRpemUgewotICBwdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0IE1vZGVsVHlwZSBrTW9kZWxUeXBlQWRkID0gc3RhdGljX2Nhc3Q8TW9kZWxUeXBlPigwKTsKLSAgICBzdGF0aWMgdm9pZCBVcGRhdGVDb25maWdGcm9tQmluYXJ5KGNvbnN0IEJpbmFyeUZvcm1hdCAmLCB1aW50NjRfdCwgQ29uZmlnICYpIHt9Ci0gICAgc3RhdGljIHVpbnQ2NF90IFNpemUodWludDhfdCAvKm9yZGVyKi8sIGNvbnN0IENvbmZpZyAmLypjb25maWcqLykgeyByZXR1cm4gMDsgfQotICAgIHN0YXRpYyB1aW50OF90IE1pZGRsZUJpdHMoY29uc3QgQ29uZmlnICYvKmNvbmZpZyovKSB7IHJldHVybiA2MzsgfQotICAgIHN0YXRpYyB1aW50OF90IExvbmdlc3RCaXRzKGNvbnN0IENvbmZpZyAmLypjb25maWcqLykgeyByZXR1cm4gMzE7IH0KLQotICAgIGNsYXNzIE1pZGRsZVBvaW50ZXIgewotICAgICAgcHVibGljOgotICAgICAgICBNaWRkbGVQb2ludGVyKGNvbnN0IERvbnRRdWFudGl6ZSAmIC8qcXVhbnQqLywgdW5zaWduZWQgY2hhciAvKm9yZGVyX21pbnVzXzIqLywgdXRpbDo6Qml0QWRkcmVzcyBhZGRyZXNzKSA6IGFkZHJlc3NfKGFkZHJlc3MpIHt9Ci0KLSAgICAgICAgTWlkZGxlUG9pbnRlcigpIDogYWRkcmVzc18oTlVMTCwgMCkge30KLQotICAgICAgICBib29sIEZvdW5kKCkgY29uc3QgewotICAgICAgICAgIHJldHVybiBhZGRyZXNzXy5iYXNlICE9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBQcm9iKCkgY29uc3QgewotICAgICAgICAgIHJldHVybiB1dGlsOjpSZWFkTm9uUG9zaXRpdmVGbG9hdDMxKGFkZHJlc3NfLmJhc2UsIGFkZHJlc3NfLm9mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBCYWNrb2ZmKCkgY29uc3QgewotICAgICAgICAgIHJldHVybiB1dGlsOjpSZWFkRmxvYXQzMihhZGRyZXNzXy5iYXNlLCBhZGRyZXNzXy5vZmZzZXQgKyAzMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBSZXN0KCkgY29uc3QgeyByZXR1cm4gUHJvYigpOyB9Ci0KLSAgICAgICAgdm9pZCBXcml0ZShmbG9hdCBwcm9iLCBmbG9hdCBiYWNrb2ZmKSB7Ci0gICAgICAgICAgdXRpbDo6V3JpdGVOb25Qb3NpdGl2ZUZsb2F0MzEoYWRkcmVzc18uYmFzZSwgYWRkcmVzc18ub2Zmc2V0LCBwcm9iKTsKLSAgICAgICAgICB1dGlsOjpXcml0ZUZsb2F0MzIoYWRkcmVzc18uYmFzZSwgYWRkcmVzc18ub2Zmc2V0ICsgMzEsIGJhY2tvZmYpOwotICAgICAgICB9Ci0KLSAgICAgIHByaXZhdGU6Ci0gICAgICAgIHV0aWw6OkJpdEFkZHJlc3MgYWRkcmVzc187Ci0gICAgfTsKLQotICAgIGNsYXNzIExvbmdlc3RQb2ludGVyIHsKLSAgICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgTG9uZ2VzdFBvaW50ZXIoY29uc3QgRG9udFF1YW50aXplICYvKnF1YW50Ki8sIHV0aWw6OkJpdEFkZHJlc3MgYWRkcmVzcykgOiBhZGRyZXNzXyhhZGRyZXNzKSB7fQotCi0gICAgICAgIExvbmdlc3RQb2ludGVyKCkgOiBhZGRyZXNzXyhOVUxMLCAwKSB7fQotCi0gICAgICAgIGJvb2wgRm91bmQoKSBjb25zdCB7Ci0gICAgICAgICAgcmV0dXJuIGFkZHJlc3NfLmJhc2UgIT0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IFByb2IoKSBjb25zdCB7Ci0gICAgICAgICAgcmV0dXJuIHV0aWw6OlJlYWROb25Qb3NpdGl2ZUZsb2F0MzEoYWRkcmVzc18uYmFzZSwgYWRkcmVzc18ub2Zmc2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgV3JpdGUoZmxvYXQgcHJvYikgewotICAgICAgICAgIHV0aWw6OldyaXRlTm9uUG9zaXRpdmVGbG9hdDMxKGFkZHJlc3NfLmJhc2UsIGFkZHJlc3NfLm9mZnNldCwgcHJvYik7Ci0gICAgICAgIH0KLQotICAgICAgcHJpdmF0ZToKLSAgICAgICAgdXRpbDo6Qml0QWRkcmVzcyBhZGRyZXNzXzsKLSAgICB9OwotCi0gICAgRG9udFF1YW50aXplKCkge30KLQotICAgIHZvaWQgU2V0dXBNZW1vcnkodm9pZCAqIC8qc3RhcnQqLywgdW5zaWduZWQgY2hhciAvKm9yZGVyKi8sIGNvbnN0IENvbmZpZyAmIC8qY29uZmlnKi8pIHt9Ci0KLSAgICBzdGF0aWMgY29uc3QgYm9vbCBrVHJhaW4gPSBmYWxzZTsKLSAgICAvLyBUaGVzZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJlY2F1c2Uga1RyYWluIGlzIGZhbHNlLiAgCi0gICAgdm9pZCBUcmFpbih1aW50OF90IC8qb3JkZXIqLywgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICYvKnByb2IqLywgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICYvKmJhY2tvZmYqLykge30KLSAgICB2b2lkIFRyYWluUHJvYih1aW50OF90LCBzdGQ6OnZlY3RvcjxmbG9hdD4gJi8qcHJvYiovKSB7fQotCi0gICAgdm9pZCBGaW5pc2hlZExvYWRpbmcoY29uc3QgQ29uZmlnICYpIHt9Ci19OwotCi1jbGFzcyBTZXBhcmF0ZWx5UXVhbnRpemUgewotICBwcml2YXRlOgotICAgIGNsYXNzIEJpbnMgewotICAgICAgcHVibGljOgotICAgICAgICAvLyBTaWdoIEMrKyBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAgIEJpbnMoKSB7fQotCi0gICAgICAgIEJpbnModWludDhfdCBiaXRzLCBmbG9hdCAqYmVnaW4pIDogYmVnaW5fKGJlZ2luKSwgZW5kXyhiZWdpbl8gKyAoMVVMTCA8PCBiaXRzKSksIGJpdHNfKGJpdHMpLCBtYXNrXygoMVVMTCA8PCBiaXRzKSAtIDEpIHt9Ci0KLSAgICAgICAgZmxvYXQgKlBvcHVsYXRlKCkgeyByZXR1cm4gYmVnaW5fOyB9Ci0KLSAgICAgICAgdWludDY0X3QgRW5jb2RlUHJvYihmbG9hdCB2YWx1ZSkgY29uc3QgewotICAgICAgICAgIHJldHVybiBFbmNvZGUodmFsdWUsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDY0X3QgRW5jb2RlQmFja29mZihmbG9hdCB2YWx1ZSkgY29uc3QgewotICAgICAgICAgIGlmICh2YWx1ZSA9PSAwLjApIHsKLSAgICAgICAgICAgIHJldHVybiBIYXNFeHRlbnNpb24odmFsdWUpID8ga0V4dGVuc2lvblF1YW50IDoga05vRXh0ZW5zaW9uUXVhbnQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBFbmNvZGUodmFsdWUsIDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgRGVjb2RlKHN0ZDo6c2l6ZV90IG9mZikgY29uc3QgeyByZXR1cm4gYmVnaW5fW29mZl07IH0KLQotICAgICAgICB1aW50OF90IEJpdHMoKSBjb25zdCB7IHJldHVybiBiaXRzXzsgfQotCi0gICAgICAgIHVpbnQ2NF90IE1hc2soKSBjb25zdCB7IHJldHVybiBtYXNrXzsgfQotCi0gICAgICBwcml2YXRlOgotICAgICAgICB1aW50NjRfdCBFbmNvZGUoZmxvYXQgdmFsdWUsIHNpemVfdCByZXNlcnZlZCkgY29uc3QgewotICAgICAgICAgIGNvbnN0IGZsb2F0ICphYm92ZSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQqPihiZWdpbl8pICsgcmVzZXJ2ZWQsIGVuZF8sIHZhbHVlKTsKLSAgICAgICAgICBpZiAoYWJvdmUgPT0gYmVnaW5fICsgcmVzZXJ2ZWQpIHJldHVybiByZXNlcnZlZDsKLSAgICAgICAgICBpZiAoYWJvdmUgPT0gZW5kXykgcmV0dXJuIGVuZF8gLSBiZWdpbl8gLSAxOwotICAgICAgICAgIHJldHVybiBhYm92ZSAtIGJlZ2luXyAtICh2YWx1ZSAtICooYWJvdmUgLSAxKSA8ICphYm92ZSAtIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0ICpiZWdpbl87Ci0gICAgICAgIGNvbnN0IGZsb2F0ICplbmRfOwotICAgICAgICB1aW50OF90IGJpdHNfOwotICAgICAgICB1aW50NjRfdCBtYXNrXzsKLSAgICB9OwotCi0gIHB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgTW9kZWxUeXBlIGtNb2RlbFR5cGVBZGQgPSBrUXVhbnRBZGQ7Ci0KLSAgICBzdGF0aWMgdm9pZCBVcGRhdGVDb25maWdGcm9tQmluYXJ5KGNvbnN0IEJpbmFyeUZvcm1hdCAmZmlsZSwgdWludDY0X3Qgb2Zmc2V0LCBDb25maWcgJmNvbmZpZyk7Ci0KLSAgICBzdGF0aWMgdWludDY0X3QgU2l6ZSh1aW50OF90IG9yZGVyLCBjb25zdCBDb25maWcgJmNvbmZpZykgewotICAgICAgdWludDY0X3QgbG9uZ2VzdF90YWJsZSA9IChzdGF0aWNfY2FzdDx1aW50NjRfdD4oMSkgPDwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGNvbmZpZy5wcm9iX2JpdHMpKSAqIHNpemVvZihmbG9hdCk7Ci0gICAgICB1aW50NjRfdCBtaWRkbGVfdGFibGUgPSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDEpIDw8IHN0YXRpY19jYXN0PHVpbnQ2NF90Pihjb25maWcuYmFja29mZl9iaXRzKSkgKiBzaXplb2YoZmxvYXQpICsgbG9uZ2VzdF90YWJsZTsKLSAgICAgIC8vIHVuaWdyYW1zIGFyZSBjdXJyZW50bHkgbm90IHF1YW50aXplZCBzbyBubyBuZWVkIGZvciBhIHRhYmxlLiAgCi0gICAgICByZXR1cm4gKG9yZGVyIC0gMikgKiBtaWRkbGVfdGFibGUgKyBsb25nZXN0X3RhYmxlICsgLyogZm9yIHRoZSBiaXQgY291bnRzIGFuZCBhbGlnbm1lbnQgcGFkZGluZykgKi8gODsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdWludDhfdCBNaWRkbGVCaXRzKGNvbnN0IENvbmZpZyAmY29uZmlnKSB7IHJldHVybiBjb25maWcucHJvYl9iaXRzICsgY29uZmlnLmJhY2tvZmZfYml0czsgfQotICAgIHN0YXRpYyB1aW50OF90IExvbmdlc3RCaXRzKGNvbnN0IENvbmZpZyAmY29uZmlnKSB7IHJldHVybiBjb25maWcucHJvYl9iaXRzOyB9Ci0KLSAgICBjbGFzcyBNaWRkbGVQb2ludGVyIHsKLSAgICAgIHB1YmxpYzoKLSAgICAgICAgTWlkZGxlUG9pbnRlcihjb25zdCBTZXBhcmF0ZWx5UXVhbnRpemUgJnF1YW50LCB1bnNpZ25lZCBjaGFyIG9yZGVyX21pbnVzXzIsIGNvbnN0IHV0aWw6OkJpdEFkZHJlc3MgJmFkZHJlc3MpIDogYmluc18ocXVhbnQuR2V0VGFibGVzKG9yZGVyX21pbnVzXzIpKSwgYWRkcmVzc18oYWRkcmVzcykge30KLQotICAgICAgICBNaWRkbGVQb2ludGVyKCkgOiBhZGRyZXNzXyhOVUxMLCAwKSB7fQotCi0gICAgICAgIGJvb2wgRm91bmQoKSBjb25zdCB7IHJldHVybiBhZGRyZXNzXy5iYXNlICE9IE5VTEw7IH0KLQotICAgICAgICBmbG9hdCBQcm9iKCkgY29uc3QgewotICAgICAgICAgIHJldHVybiBQcm9iQmlucygpLkRlY29kZSh1dGlsOjpSZWFkSW50MjUoYWRkcmVzc18uYmFzZSwgYWRkcmVzc18ub2Zmc2V0ICsgQmFja29mZkJpbnMoKS5CaXRzKCksIFByb2JCaW5zKCkuQml0cygpLCBQcm9iQmlucygpLk1hc2soKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgQmFja29mZigpIGNvbnN0IHsKLSAgICAgICAgICByZXR1cm4gQmFja29mZkJpbnMoKS5EZWNvZGUodXRpbDo6UmVhZEludDI1KGFkZHJlc3NfLmJhc2UsIGFkZHJlc3NfLm9mZnNldCwgQmFja29mZkJpbnMoKS5CaXRzKCksIEJhY2tvZmZCaW5zKCkuTWFzaygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBSZXN0KCkgY29uc3QgeyByZXR1cm4gUHJvYigpOyB9Ci0KLSAgICAgICAgdm9pZCBXcml0ZShmbG9hdCBwcm9iLCBmbG9hdCBiYWNrb2ZmKSBjb25zdCB7Ci0gICAgICAgICAgdXRpbDo6V3JpdGVJbnQ1NyhhZGRyZXNzXy5iYXNlLCBhZGRyZXNzXy5vZmZzZXQsIFByb2JCaW5zKCkuQml0cygpICsgQmFja29mZkJpbnMoKS5CaXRzKCksIAotICAgICAgICAgICAgICAoUHJvYkJpbnMoKS5FbmNvZGVQcm9iKHByb2IpIDw8IEJhY2tvZmZCaW5zKCkuQml0cygpKSB8IEJhY2tvZmZCaW5zKCkuRW5jb2RlQmFja29mZihiYWNrb2ZmKSk7Ci0gICAgICAgIH0KLQotICAgICAgcHJpdmF0ZToKLSAgICAgICAgY29uc3QgQmlucyAmUHJvYkJpbnMoKSBjb25zdCB7IHJldHVybiBiaW5zX1swXTsgfQotICAgICAgICBjb25zdCBCaW5zICZCYWNrb2ZmQmlucygpIGNvbnN0IHsgcmV0dXJuIGJpbnNfWzFdOyB9Ci0gICAgICAgIGNvbnN0IEJpbnMgKmJpbnNfOwotCi0gICAgICAgIHV0aWw6OkJpdEFkZHJlc3MgYWRkcmVzc187Ci0gICAgfTsKLQotICAgIGNsYXNzIExvbmdlc3RQb2ludGVyIHsKLSAgICAgIHB1YmxpYzoKLSAgICAgICAgTG9uZ2VzdFBvaW50ZXIoY29uc3QgU2VwYXJhdGVseVF1YW50aXplICZxdWFudCwgY29uc3QgdXRpbDo6Qml0QWRkcmVzcyAmYWRkcmVzcykgOiB0YWJsZV8oJnF1YW50Lkxvbmdlc3RUYWJsZSgpKSwgYWRkcmVzc18oYWRkcmVzcykge30KLSAgICAgICAgCi0gICAgICAgIExvbmdlc3RQb2ludGVyKCkgOiBhZGRyZXNzXyhOVUxMLCAwKSB7fQotCi0gICAgICAgIGJvb2wgRm91bmQoKSBjb25zdCB7IHJldHVybiBhZGRyZXNzXy5iYXNlICE9IE5VTEw7IH0KLQotICAgICAgICB2b2lkIFdyaXRlKGZsb2F0IHByb2IpIGNvbnN0IHsKLSAgICAgICAgICB1dGlsOjpXcml0ZUludDI1KGFkZHJlc3NfLmJhc2UsIGFkZHJlc3NfLm9mZnNldCwgdGFibGVfLT5CaXRzKCksIHRhYmxlXy0+RW5jb2RlUHJvYihwcm9iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBQcm9iKCkgY29uc3QgewotICAgICAgICAgIHJldHVybiB0YWJsZV8tPkRlY29kZSh1dGlsOjpSZWFkSW50MjUoYWRkcmVzc18uYmFzZSwgYWRkcmVzc18ub2Zmc2V0LCB0YWJsZV8tPkJpdHMoKSwgdGFibGVfLT5NYXNrKCkpKTsKLSAgICAgICAgfQotCi0gICAgICBwcml2YXRlOgotICAgICAgICBjb25zdCBCaW5zICp0YWJsZV87Ci0gICAgICAgIHV0aWw6OkJpdEFkZHJlc3MgYWRkcmVzc187Ci0gICAgfTsKLQotICAgIFNlcGFyYXRlbHlRdWFudGl6ZSgpIHt9Ci0KLSAgICB2b2lkIFNldHVwTWVtb3J5KHZvaWQgKnN0YXJ0LCB1bnNpZ25lZCBjaGFyIG9yZGVyLCBjb25zdCBDb25maWcgJmNvbmZpZyk7Ci0KLSAgICBzdGF0aWMgY29uc3QgYm9vbCBrVHJhaW4gPSB0cnVlOwotICAgIC8vIEFzc3VtZXMgMC4wIGlzIHJlbW92ZWQgZnJvbSBiYWNrb2ZmLiAgCi0gICAgdm9pZCBUcmFpbih1aW50OF90IG9yZGVyLCBzdGQ6OnZlY3RvcjxmbG9hdD4gJnByb2IsIHN0ZDo6dmVjdG9yPGZsb2F0PiAmYmFja29mZik7Ci0gICAgLy8gVHJhaW4ganVzdCBwcm9iYWJpbGl0aWVzIChmb3IgbG9uZ2VzdCBvcmRlcikuCi0gICAgdm9pZCBUcmFpblByb2IodWludDhfdCBvcmRlciwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICZwcm9iKTsKLQotICAgIHZvaWQgRmluaXNoZWRMb2FkaW5nKGNvbnN0IENvbmZpZyAmY29uZmlnKTsKLQotICAgIGNvbnN0IEJpbnMgKkdldFRhYmxlcyh1bnNpZ25lZCBjaGFyIG9yZGVyX21pbnVzXzIpIGNvbnN0IHsgcmV0dXJuIHRhYmxlc19bb3JkZXJfbWludXNfMl07IH0KLQotICAgIGNvbnN0IEJpbnMgJkxvbmdlc3RUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGxvbmdlc3RfOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBCaW5zIHRhYmxlc19bS0VOTE1fTUFYX09SREVSIC0gMV1bMl07Ci0KLSAgICBCaW5zIGxvbmdlc3RfOwotCi0gICAgdWludDhfdCAqYWN0dWFsX2Jhc2VfOwotCi0gICAgdWludDhfdCBwcm9iX2JpdHNfLCBiYWNrb2ZmX2JpdHNfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgbmdyYW0KLX0gLy8gbmFtZXNwYWNlIGxtCi0KLSNlbmRpZiAvLyBMTV9RVUFOVElaRV9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vcXVlcnlfbWFpbi5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9xdWVyeV9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDEzZmYyLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9xdWVyeV9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLSNpbmNsdWRlICJsbS9uZ3JhbV9xdWVyeS5oaCIKLSNpbmNsdWRlICJ1dGlsL2dldG9wdC5oaCIKLQotI2lmZGVmIFdJVEhfTlBMTQotI2luY2x1ZGUgImxtL3dyYXBwZXJzL25wbG0uaGgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi12b2lkIFVzYWdlKGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgc3RkOjpjZXJyIDw8Ci0gICAgIktlbkxNIHdhcyBjb21waWxlZCB3aXRoIG1heGltdW0gb3JkZXIgIiA8PCBLRU5MTV9NQVhfT1JERVIgPDwgIi5cbiIKLSAgICAiVXNhZ2U6ICIgPDwgbmFtZSA8PCAiIFstbl0gWy1zXSBsbV9maWxlXG4iCi0gICAgIi1uOiBEbyBub3Qgd3JhcCB0aGUgaW5wdXQgaW4gPHM+IGFuZCA8L3M+LlxuIgotICAgICItczogU2VudGVuY2UgdG90YWxzIG9ubHkuXG4iCi0gICAgIi1sIGxhenl8cG9wdWxhdGV8cmVhZHxwYXJhbGxlbDogTG9hZCBsYXppbHksIHdpdGggcG9wdWxhdGUsIG9yIG1hbGxvYytyZWFkXG4iCi0gICAgIlRoZSBkZWZhdWx0IGxvYWRpbmcgbWV0aG9kIGlzIHBvcHVsYXRlIG9uIExpbnV4IGFuZCByZWFkIG9uIG90aGVycy5cbiI7Ci0gIGV4aXQoMSk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgaWYgKGFyZ2MgPT0gMSB8fCAoYXJnYyA9PSAyICYmICFzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpKSkKLSAgICBVc2FnZShhcmd2WzBdKTsKLQotICBsbTo6bmdyYW06OkNvbmZpZyBjb25maWc7Ci0gIGJvb2wgc2VudGVuY2VfY29udGV4dCA9IHRydWU7Ci0gIGJvb2wgc2hvd193b3JkcyA9IHRydWU7Ci0KLSAgaW50IG9wdDsKLSAgd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImhuc2w6IikpICE9IC0xKSB7Ci0gICAgc3dpdGNoIChvcHQpIHsKLSAgICAgIGNhc2UgJ24nOgotICAgICAgICBzZW50ZW5jZV9jb250ZXh0ID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAncyc6Ci0gICAgICAgIHNob3dfd29yZHMgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdsJzoKLSAgICAgICAgaWYgKCFzdHJjbXAob3B0YXJnLCAibGF6eSIpKSB7Ci0gICAgICAgICAgY29uZmlnLmxvYWRfbWV0aG9kID0gdXRpbDo6TEFaWTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgInBvcHVsYXRlIikpIHsKLSAgICAgICAgICBjb25maWcubG9hZF9tZXRob2QgPSB1dGlsOjpQT1BVTEFURV9PUl9SRUFEOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAicmVhZCIpKSB7Ci0gICAgICAgICAgY29uZmlnLmxvYWRfbWV0aG9kID0gdXRpbDo6UkVBRDsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgInBhcmFsbGVsIikpIHsKLSAgICAgICAgICBjb25maWcubG9hZF9tZXRob2QgPSB1dGlsOjpQQVJBTExFTF9SRUFEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFVzYWdlKGFyZ3ZbMF0pOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnaCc6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBVc2FnZShhcmd2WzBdKTsKLSAgICB9Ci0gIH0KLSAgaWYgKG9wdGluZCArIDEgIT0gYXJnYykKLSAgICBVc2FnZShhcmd2WzBdKTsKLSAgY29uc3QgY2hhciAqZmlsZSA9IGFyZ3Zbb3B0aW5kXTsKLSAgdHJ5IHsKLSAgICB1c2luZyBuYW1lc3BhY2UgbG06Om5ncmFtOwotICAgIE1vZGVsVHlwZSBtb2RlbF90eXBlOwotICAgIGlmIChSZWNvZ25pemVCaW5hcnkoZmlsZSwgbW9kZWxfdHlwZSkpIHsKLSAgICAgIHN3aXRjaChtb2RlbF90eXBlKSB7Ci0gICAgICAgIGNhc2UgUFJPQklORzoKLSAgICAgICAgICBRdWVyeTxsbTo6bmdyYW06OlByb2JpbmdNb2RlbD4oZmlsZSwgY29uZmlnLCBzZW50ZW5jZV9jb250ZXh0LCBzaG93X3dvcmRzKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRVNUX1BST0JJTkc6Ci0gICAgICAgICAgUXVlcnk8bG06Om5ncmFtOjpSZXN0UHJvYmluZ01vZGVsPihmaWxlLCBjb25maWcsIHNlbnRlbmNlX2NvbnRleHQsIHNob3dfd29yZHMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRSSUU6Ci0gICAgICAgICAgUXVlcnk8VHJpZU1vZGVsPihmaWxlLCBjb25maWcsIHNlbnRlbmNlX2NvbnRleHQsIHNob3dfd29yZHMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFFVQU5UX1RSSUU6Ci0gICAgICAgICAgUXVlcnk8UXVhbnRUcmllTW9kZWw+KGZpbGUsIGNvbmZpZywgc2VudGVuY2VfY29udGV4dCwgc2hvd193b3Jkcyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVJSQVlfVFJJRToKLSAgICAgICAgICBRdWVyeTxBcnJheVRyaWVNb2RlbD4oZmlsZSwgY29uZmlnLCBzZW50ZW5jZV9jb250ZXh0LCBzaG93X3dvcmRzKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBRVUFOVF9BUlJBWV9UUklFOgotICAgICAgICAgIFF1ZXJ5PFF1YW50QXJyYXlUcmllTW9kZWw+KGZpbGUsIGNvbmZpZywgc2VudGVuY2VfY29udGV4dCwgc2hvd193b3Jkcyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgc3RkOjpjZXJyIDw8ICJVbnJlY29nbml6ZWQga2VubG0gbW9kZWwgdHlwZSAiIDw8IG1vZGVsX3R5cGUgPDwgc3RkOjplbmRsOwotICAgICAgICAgIGFib3J0KCk7Ci0gICAgICB9Ci0jaWZkZWYgV0lUSF9OUExNCi0gICAgfSBlbHNlIGlmIChsbTo6bnA6Ok1vZGVsOjpSZWNvZ25pemUoZmlsZSkpIHsKLSAgICAgIGxtOjpucDo6TW9kZWwgbW9kZWwoZmlsZSk7Ci0gICAgICBpZiAoc2hvd193b3JkcykgewotICAgICAgICBRdWVyeTxsbTo6bnA6Ok1vZGVsLCBsbTo6bmdyYW06OkZ1bGxQcmludD4obW9kZWwsIHNlbnRlbmNlX2NvbnRleHQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUXVlcnk8bG06Om5wOjpNb2RlbCwgbG06Om5ncmFtOjpCYXNpY1ByaW50Pihtb2RlbCwgc2VudGVuY2VfY29udGV4dCk7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgUXVlcnk8UHJvYmluZ01vZGVsPihmaWxlLCBjb25maWcsIHNlbnRlbmNlX2NvbnRleHQsIHNob3dfd29yZHMpOwotICAgIH0KLSAgICB1dGlsOjpQcmludFVzYWdlKHN0ZDo6Y2Vycik7Ci0gIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZlKSB7Ci0gICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9yZWFkX2FycGEuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vcmVhZF9hcnBhLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjhiYmZhLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9yZWFkX2FycGEuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotI2luY2x1ZGUgImxtL3JlYWRfYXJwYS5oaCIKLQotI2luY2x1ZGUgImxtL2JsYW5rLmhoIgotI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKLQotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDxmbG9hdC5oPgotI2VuZGlmCi0KLW5hbWVzcGFjZSBsbSB7Ci0KLS8vIDEgZm9yICdcdCcsICdcbicsIGFuZCAnICcuICBUaGlzIGlzIHN0cmljdGVyIHRoYW4gaXNzcGFjZS4KLWNvbnN0IGJvb2wga0FSUEFTcGFjZXNbMjU2XSA9IHswLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKLQotbmFtZXNwYWNlIHsKLQotYm9vbCBJc0VudGlyZWx5V2hpdGVTcGFjZShjb25zdCBTdHJpbmdQaWVjZSAmbGluZSkgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PHNpemVfdD4obGluZS5zaXplKCkpOyArK2kpIHsKLSAgICBpZiAoIWlzc3BhY2UobGluZS5kYXRhKClbaV0pKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IGNoYXIga0JpbmFyeU1hZ2ljW10gPSAibW1hcCBsbSBodHRwOi8va2hlYWZpZWxkLmNvbS9jb2RlIjsKLQotLy8gc3RydG91bGwgaXNuJ3QgcG9ydGFibGUgZW5vdWdoIDotKAotdWludDY0X3QgUmVhZENvdW50KGNvbnN0IHN0ZDo6c3RyaW5nICZmcm9tKSB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbShmcm9tKTsKLSAgdWludDY0X3QgcmV0OwotICBzdHJlYW0gPj4gcmV0OwotICBVVElMX1RIUk9XX0lGKCFzdHJlYW0sIEZvcm1hdExvYWRFeGNlcHRpb24sICJCYWQgY291bnQgIiA8PCBmcm9tKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotfSAvLyBuYW1lc3BhY2UKLQotdm9pZCBSZWFkQVJQQUNvdW50cyh1dGlsOjpGaWxlUGllY2UgJmluLCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJm51bWJlcikgewotICBudW1iZXIuY2xlYXIoKTsKLSAgU3RyaW5nUGllY2UgbGluZSA9IGluLlJlYWRMaW5lKCk7Ci0gIC8vIEluIGdlbmVyYWwsIEFSUEEgZmlsZXMgY2FuIGhhdmUgYXJiaXRyYXJ5IHRleHQgYmVmb3JlICJcZGF0YVwiCi0gIC8vIEJ1dCBpbiBLZW5MTSwgd2UgcmVxdWlyZSBzdWNoIGxpbmVzIHRvIHN0YXJ0IHdpdGggIiMiLCBzbyB0aGF0Ci0gIC8vIHdlIGNhbiBkbyBzdHJpY3RlciBlcnJvciBjaGVja2luZwotICB3aGlsZSAoSXNFbnRpcmVseVdoaXRlU3BhY2UobGluZSkgfHwgc3RhcnRzX3dpdGgobGluZSwgIiMiKSkgewotICAgIGxpbmUgPSBpbi5SZWFkTGluZSgpOwotICB9Ci0KLSAgaWYgKGxpbmUgIT0gIlxcZGF0YVxcIikgewotICAgIGlmICgobGluZS5zaXplKCkgPj0gMikgJiYgKGxpbmUuZGF0YSgpWzBdID09IDB4MWYpICYmIChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihsaW5lLmRhdGEoKVsxXSkgPT0gMHg4YikpIHsKLSAgICAgIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIkxvb2tzIGxpa2UgYSBnemlwIGZpbGUuICBJZiB0aGlzIGlzIGFuIEFSUEEgZmlsZSwgcGlwZSAiIDw8IGluLkZpbGVOYW1lKCkgPDwgIiB0aHJvdWdoIHpjYXQuICBJZiB0aGlzIGFscmVhZHkgaW4gYmluYXJ5IGZvcm1hdCwgeW91IG5lZWQgdG8gZGVjb21wcmVzcyBpdCBiZWNhdXNlIG1tYXAgZG9lc24ndCB3b3JrIG9uIHRvcCBvZiBnemlwLiIpOwotICAgIH0KLSAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihsaW5lLnNpemUoKSkgPj0gc3RybGVuKGtCaW5hcnlNYWdpYykgJiYgU3RyaW5nUGllY2UobGluZS5kYXRhKCksIHN0cmxlbihrQmluYXJ5TWFnaWMpKSA9PSBrQmluYXJ5TWFnaWMpCi0gICAgICBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJUaGlzIGxvb2tzIGxpa2UgYSBiaW5hcnkgZmlsZSBidXQgZ290IHNlbnQgdG8gdGhlIEFSUEEgcGFyc2VyLiAgRGlkIHlvdSBjb21wcmVzcyB0aGUgYmluYXJ5IGZpbGUgb3IgcGFzcyBhIGJpbmFyeSBmaWxlIHdoZXJlIG9ubHkgQVJQQSBmaWxlcyBhcmUgYWNjZXB0ZWQ/Iik7Ci0gICAgVVRJTF9USFJPV19JRihsaW5lLnNpemUoKSA+PSA0ICYmIFN0cmluZ1BpZWNlKGxpbmUuZGF0YSgpLCA0KSA9PSAiYmxtdCIsIEZvcm1hdExvYWRFeGNlcHRpb24sICJUaGlzIGxvb2tzIGxpa2UgYW4gSVJTVExNIGJpbmFyeSBmaWxlLiAgRGlkIHlvdSBmb3JnZXQgdG8gcGFzcyAtLXRleHQgeWVzIHRvIGNvbXBpbGUtbG0/Iik7Ci0gICAgVVRJTF9USFJPV19JRihsaW5lID09ICJpQVJQQSIsIEZvcm1hdExvYWRFeGNlcHRpb24sICJUaGlzIGxvb2tzIGxpa2UgYW4gSVJTVExNIGlBUlBBIGZpbGUuICBZb3UgbmVlZCBhbiBBUlBBIGZpbGUuICBSdW5cbiAgY29tcGlsZS1sbSAtLXRleHQgeWVzICIgPDwgaW4uRmlsZU5hbWUoKSA8PCAiICIgPDwgaW4uRmlsZU5hbWUoKSA8PCAiLmFycGFcbmZpcnN0LiIpOwotICAgIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgImZpcnN0IG5vbi1lbXB0eSBsaW5lIHdhcyBcIiIgPDwgbGluZSA8PCAiXCIgbm90IFxcZGF0YVxcLiIpOwotICB9Ci0gIHdoaWxlICghSXNFbnRpcmVseVdoaXRlU3BhY2UobGluZSA9IGluLlJlYWRMaW5lKCkpKSB7Ci0gICAgaWYgKGxpbmUuc2l6ZSgpIDwgNiB8fCBzdHJuY21wKGxpbmUuZGF0YSgpLCAibmdyYW0gIiwgNikpIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgImNvdW50IGxpbmUgXCIiIDw8IGxpbmUgPDwgIlwiZG9lc24ndCBiZWdpbiB3aXRoIFwibmdyYW0gXCIiKTsKLSAgICAvLyBTbyBzdHJ0b2wgZG9lc24ndCBnbyBvZmYgdGhlIGVuZCBvZiBsaW5lLgotICAgIHN0ZDo6c3RyaW5nIHJlbWFpbmluZyhsaW5lLmRhdGEoKSArIDYsIGxpbmUuc2l6ZSgpIC0gNik7Ci0gICAgY2hhciAqZW5kX3B0cjsKLSAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoID0gc3RkOjpzdHJ0b2wocmVtYWluaW5nLmNfc3RyKCksICZlbmRfcHRyLCAxMCk7Ci0gICAgaWYgKChlbmRfcHRyID09IHJlbWFpbmluZy5jX3N0cigpKSB8fCAobGVuZ3RoIC0gMSAhPSBudW1iZXIuc2l6ZSgpKSkgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAibmdyYW0gY291bnQgbGVuZ3RocyBzaG91bGQgYmUgY29uc2VjdXRpdmUgc3RhcnRpbmcgd2l0aCAxOiAiIDw8IGxpbmUpOwotICAgIGlmICgqZW5kX3B0ciAhPSAnPScpIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIkV4cGVjdGVkID0gaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBmaXJzdCBudW1iZXIgaW4gdGhlIGNvdW50IGxpbmUgIiA8PCBsaW5lKTsKLSAgICArK2VuZF9wdHI7Ci0gICAgbnVtYmVyLnB1c2hfYmFjayhSZWFkQ291bnQoZW5kX3B0cikpOwotICB9Ci19Ci0KLXZvaWQgUmVhZE5HcmFtSGVhZGVyKHV0aWw6OkZpbGVQaWVjZSAmaW4sIHVuc2lnbmVkIGludCBsZW5ndGgpIHsKLSAgIFN0cmluZ1BpZWNlIGxpbmU7Ci0gIHdoaWxlIChJc0VudGlyZWx5V2hpdGVTcGFjZShsaW5lID0gaW4uUmVhZExpbmUoKSkpIHt9Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIGV4cGVjdGVkOwotICBleHBlY3RlZCA8PCAnXFwnIDw8IGxlbmd0aCA8PCAiLWdyYW1zOiI7Ci0gIGlmIChsaW5lICE9IGV4cGVjdGVkLnN0cigpKSBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJXYXMgZXhwZWN0aW5nIG4tZ3JhbSBoZWFkZXIgIiA8PCBleHBlY3RlZC5zdHIoKSA8PCAiIGJ1dCBnb3QgIiA8PCBsaW5lIDw8ICIgaW5zdGVhZCIpOwotfQotCi12b2lkIFJlYWRCYWNrb2ZmKHV0aWw6OkZpbGVQaWVjZSAmaW4sIFByb2IgJi8qd2VpZ2h0cyovKSB7Ci0gIHN3aXRjaCAoaW4uZ2V0KCkpIHsKLSAgICBjYXNlICdcdCc6Ci0gICAgICB7Ci0gICAgICAgIGZsb2F0IGdvdCA9IGluLlJlYWRGbG9hdCgpOwotICAgICAgICBpZiAoZ290ICE9IDAuMCkKLSAgICAgICAgICBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJOb24temVybyBiYWNrb2ZmICIgPDwgZ290IDw8ICIgcHJvdmlkZWQgZm9yIGFuIG4tZ3JhbSB0aGF0IHNob3VsZCBoYXZlIG5vIGJhY2tvZmYiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1xuJzoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJFeHBlY3RlZCB0YWIgb3IgbmV3bGluZSBmb3IgYmFja29mZiIpOwotICB9Ci19Ci0KLXZvaWQgUmVhZEJhY2tvZmYodXRpbDo6RmlsZVBpZWNlICZpbiwgZmxvYXQgJmJhY2tvZmYpIHsKLSAgLy8gQWx3YXlzIG1ha2UgemVybyBuZWdhdGl2ZS4KLSAgLy8gTmVnYXRpdmUgemVybyBtZWFucyB0aGF0IG5vIChuKzEpLWdyYW0gaGFzIHRoaXMgbi1ncmFtIGFzIGNvbnRleHQuCi0gIC8vIFRoZXJlZm9yZSB0aGUgaHlwb3RoZXNpcyBzdGF0ZSBjYW4gYmUgc2hvcnRlci4gIE9mIGNvdXJzZSwgbWFueSBuLWdyYW1zCi0gIC8vIGFyZSBjb250ZXh0IGZvciAobisxKS1ncmFtcy4gIEFuIGFsZ29yaXRobSBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgd2lsbCBnbwotICAvLyBiYWNrIGFuZCBzZXQgdGhlIGJhY2tvZmYgdG8gcG9zaXRpdmUgemVybyBpbiB0aGVzZSBjYXNlcy4KLSAgc3dpdGNoIChpbi5nZXQoKSkgewotICAgIGNhc2UgJ1x0JzoKLSAgICAgIGJhY2tvZmYgPSBpbi5SZWFkRmxvYXQoKTsKLSAgICAgIGlmIChiYWNrb2ZmID09IG5ncmFtOjprRXh0ZW5zaW9uQmFja29mZikgYmFja29mZiA9IG5ncmFtOjprTm9FeHRlbnNpb25CYWNrb2ZmOwotICAgICAgewotI2lmZGVmIFdJTjMyCi0JCWludCBmbG9hdF9jbGFzcyA9IF9mcGNsYXNzKGJhY2tvZmYpOwotICAgICAgICBVVElMX1RIUk9XX0lGKGZsb2F0X2NsYXNzID09IF9GUENMQVNTX1NOQU4gfHwgZmxvYXRfY2xhc3MgPT0gX0ZQQ0xBU1NfUU5BTiB8fCBmbG9hdF9jbGFzcyA9PSBfRlBDTEFTU19OSU5GIHx8IGZsb2F0X2NsYXNzID09IF9GUENMQVNTX1BJTkYsIEZvcm1hdExvYWRFeGNlcHRpb24sICJCYWQgYmFja29mZiAiIDw8IGJhY2tvZmYpOwotI2Vsc2UKLSAgICAgICAgaW50IGZsb2F0X2NsYXNzID0gc3RkOjpmcGNsYXNzaWZ5KGJhY2tvZmYpOwotICAgICAgICBVVElMX1RIUk9XX0lGKGZsb2F0X2NsYXNzID09IEZQX05BTiB8fCBmbG9hdF9jbGFzcyA9PSBGUF9JTkZJTklURSwgRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIkJhZCBiYWNrb2ZmICIgPDwgYmFja29mZik7Ci0jZW5kaWYKLSAgICAgIH0KLSAgICAgIFVUSUxfVEhST1dfSUYoaW4uZ2V0KCkgIT0gJ1xuJywgRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIkV4cGVjdGVkIG5ld2xpbmUgYWZ0ZXIgYmFja29mZiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnXG4nOgotICAgICAgYmFja29mZiA9IG5ncmFtOjprTm9FeHRlbnNpb25CYWNrb2ZmOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIkV4cGVjdGVkIHRhYiBvciBuZXdsaW5lIGZvciBiYWNrb2ZmIik7Ci0gIH0KLX0KLQotdm9pZCBSZWFkRW5kKHV0aWw6OkZpbGVQaWVjZSAmaW4pIHsKLSAgU3RyaW5nUGllY2UgbGluZTsKLSAgZG8gewotICAgIGxpbmUgPSBpbi5SZWFkTGluZSgpOwotICB9IHdoaWxlIChJc0VudGlyZWx5V2hpdGVTcGFjZShsaW5lKSk7Ci0gIGlmIChsaW5lICE9ICJcXGVuZFxcIikgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiRXhwZWN0ZWQgXFxlbmRcXCBidXQgdGhlIEFSUEEgZmlsZSBoYXMgIiA8PCBsaW5lKTsKLQotICB0cnkgewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBsaW5lID0gaW4uUmVhZExpbmUoKTsKLSAgICAgIGlmICghSXNFbnRpcmVseVdoaXRlU3BhY2UobGluZSkpIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIlRyYWlsaW5nIGxpbmUgIiA8PCBsaW5lKTsKLSAgICB9Ci0gIH0gY2F0Y2ggKGNvbnN0IHV0aWw6OkVuZE9mRmlsZUV4Y2VwdGlvbiAmZSkge30KLX0KLQotdm9pZCBQb3NpdGl2ZVByb2JXYXJuOjpXYXJuKGZsb2F0IHByb2IpIHsKLSAgc3dpdGNoIChhY3Rpb25fKSB7Ci0gICAgY2FzZSBUSFJPV19VUDoKLSAgICAgIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIlBvc2l0aXZlIGxvZyBwcm9iYWJpbGl0eSAiIDw8IHByb2IgPDwgIiBpbiB0aGUgbW9kZWwuICBUaGlzIGlzIGEgYnVnIGluIElSU1RMTTsgeW91IGNhbiBzZXQgY29uZmlnLnBvc2l0aXZlX2xvZ19wcm9iYWJpbGl0eSA9IFNJTEVOVCBvciBwYXNzIC1pIHRvIGJ1aWxkX2JpbmFyeSB0byBzdWJzdGl0dXRlIDAuMCBmb3IgdGhlIGxvZyBwcm9iYWJpbGl0eS4gIEVycm9yIik7Ci0gICAgY2FzZSBDT01QTEFJTjoKLSAgICAgIHN0ZDo6Y2VyciA8PCAiVGhlcmUncyBhIHBvc2l0aXZlIGxvZyBwcm9iYWJpbGl0eSAiIDw8IHByb2IgPDwgIiBpbiB0aGUgQVBSQSBmaWxlLCBwcm9iYWJseSBiZWNhdXNlIG9mIGEgYnVnIGluIElSU1RMTS4gIFRoaXMgYW5kIHN1YnNlcXVlbnQgZW50aXJlcyB3aWxsIGJlIG1hcHBlZCB0byAwIGxvZyBwcm9iYWJpbGl0eS4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGFjdGlvbl8gPSBTSUxFTlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNJTEVOVDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vcmV0dXJuLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3JldHVybi5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyZmZkNi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vcmV0dXJuLmhoCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotI2lmbmRlZiBMTV9SRVRVUk5fSAotI2RlZmluZSBMTV9SRVRVUk5fSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBsbSB7Ci0vKiBTdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgc2NvcmluZyByb3V0aW5lcy4gKi8KLXN0cnVjdCBGdWxsU2NvcmVSZXR1cm4gewotICAvLyBsb2cxMCBwcm9iYWJpbGl0eQotICBmbG9hdCBwcm9iOwotCi0gIC8qIFRoZSBsZW5ndGggb2Ygbi1ncmFtIG1hdGNoZWQuICBEbyBub3QgdXNlIHRoaXMgZm9yIHJlY29tYmluYXRpb24uICAKLSAgICogQ29uc2lkZXIgYSBtb2RlbCBjb250YWluaW5nIG9ubHkgdGhlIGZvbGxvd2luZyBuLWdyYW1zOgotICAgKiAtMSBmb28KLSAgICogLTMuMTQgIGJhcgotICAgKiAtMi43MTggYmF6IC01Ci0gICAqIC02IGZvbyBiYXIKLSAgICoKLSAgICogSWYgeW91IHNjb3JlIGBgYmFyJycgdGhlbiBuZ3JhbV9sZW5ndGggaXMgMSBhbmQgcmVjb21iaW5hdGlvbiBzdGF0ZSBpcyB0aGUKLSAgICogZW1wdHkgc3RyaW5nIGJlY2F1c2UgYmFyIGhhcyB6ZXJvIGJhY2tvZmYgYW5kIGRvZXMgbm90IGV4dGVuZCB0byB0aGUKLSAgICogcmlnaHQuICAKLSAgICogSWYgeW91IHNjb3JlIGBgZm9vJycgdGhlbiBuZ3JhbV9sZW5ndGggaXMgMSBhbmQgcmVjb21iaW5hdGlvbiBzdGF0ZSBpcyAKLSAgICogYGBmb28nJy4gIAotICAgKgotICAgKiBJZGVhbGx5LCBrZWVwIG91dHB1dCBzdGF0ZXMgYXJvdW5kIGFuZCBjb21wYXJlIHRoZW0uICBGYWlsaW5nIHRoYXQsCi0gICAqIGdldCBvdXRfc3RhdGUuVmFsaWRMZW5ndGgoKSBhbmQgdXNlIHRoYXQgbGVuZ3RoIGZvciByZWNvbWJpbmF0aW9uLgotICAgKi8KLSAgdW5zaWduZWQgY2hhciBuZ3JhbV9sZW5ndGg7Ci0KLSAgLyogTGVmdCBleHRlbnNpb24gaW5mb3JtYXRpb24uICBJZiBpbmRlcGVuZGVudF9sZWZ0IGlzIHNldCwgdGhlbiBwcm9iIGlzCi0gICAqIGluZGVwZW5kZW50IG9mIHdvcmRzIHRvIHRoZSBsZWZ0ICh1cCB0byBhZGRpdGlvbmFsIGJhY2tvZmYpLiAgT3RoZXJ3aXNlLAotICAgKiBleHRlbmRfbGVmdCBpbmRpY2F0ZXMgaG93IHRvIGVmZmljaWVudGx5IGV4dGVuZCBmdXJ0aGVyIHRvIHRoZSBsZWZ0LiAgCi0gICAqLwotICBib29sIGluZGVwZW5kZW50X2xlZnQ7Ci0gIHVpbnQ2NF90IGV4dGVuZF9sZWZ0OyAvLyBEZWZpbmVkIG9ubHkgaWYgaW5kZXBlbmRlbnRfbGVmdAotCi0gIC8vIFJlc3QgY29zdCBmb3IgZXh0ZW5zaW9uIHRvIHRoZSBsZWZ0LgotICBmbG9hdCByZXN0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgbG0KLSNlbmRpZiAvLyBMTV9SRVRVUk5fSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3NlYXJjaF90cmllLmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3NlYXJjaF90cmllLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjBmNTVmLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9zZWFyY2hfdHJpZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKiBUaGlzIGlzIHdoZXJlIHRoZSB0cmllIGlzIGJ1aWx0LiAgSXQncyBvbi1kaXNrLiAgKi8KLSNpbmNsdWRlICJsbS9zZWFyY2hfdHJpZS5oaCIKLQotI2luY2x1ZGUgImxtL2JoaWtzaGEuaGgiCi0jaW5jbHVkZSAibG0vYmluYXJ5X2Zvcm1hdC5oaCIKLSNpbmNsdWRlICJsbS9ibGFuay5oaCIKLSNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAibG0vbWF4X29yZGVyLmhoIgotI2luY2x1ZGUgImxtL3F1YW50aXplLmhoIgotI2luY2x1ZGUgImxtL3RyaWUuaGgiCi0jaW5jbHVkZSAibG0vdHJpZV9zb3J0LmhoIgotI2luY2x1ZGUgImxtL3ZvY2FiLmhoIgotI2luY2x1ZGUgImxtL3dlaWdodHMuaGgiCi0jaW5jbHVkZSAibG0vd29yZF9pbmRleC5oaCIKLSNpbmNsdWRlICJ1dGlsL2Vyc2F0el9wcm9ncmVzcy5oaCIKLSNpbmNsdWRlICJ1dGlsL21tYXAuaGgiCi0jaW5jbHVkZSAidXRpbC9wcm94eV9pdGVyYXRvci5oaCIKLSNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKLSNpbmNsdWRlICJ1dGlsL3NpemVkX2l0ZXJhdG9yLmhoIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPG51bWVyaWM+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi1uYW1lc3BhY2UgbG0gewotbmFtZXNwYWNlIG5ncmFtIHsKLW5hbWVzcGFjZSB0cmllIHsKLW5hbWVzcGFjZSB7Ci0KLXZvaWQgUmVhZE9yVGhyb3coRklMRSAqZnJvbSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgVVRJTF9USFJPV19JRigxICE9IHN0ZDo6ZnJlYWQoZGF0YSwgc2l6ZSwgMSwgZnJvbSksIHV0aWw6OkVycm5vRXhjZXB0aW9uLCAiU2hvcnQgcmVhZCIpOwotfQotCi1pbnQgQ29tcGFyZSh1bnNpZ25lZCBjaGFyIG9yZGVyLCBjb25zdCB2b2lkICpmaXJzdF92b2lkLCBjb25zdCB2b2lkICpzZWNvbmRfdm9pZCkgewotICBjb25zdCBXb3JkSW5kZXggKmZpcnN0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBXb3JkSW5kZXgqPihmaXJzdF92b2lkKSwgKnNlY29uZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgV29yZEluZGV4Kj4oc2Vjb25kX3ZvaWQpOwotICBjb25zdCBXb3JkSW5kZXggKmVuZCA9IGZpcnN0ICsgb3JkZXI7Ci0gIGZvciAoOyBmaXJzdCAhPSBlbmQ7ICsrZmlyc3QsICsrc2Vjb25kKSB7Ci0gICAgaWYgKCpmaXJzdCA8ICpzZWNvbmQpIHJldHVybiAtMTsKLSAgICBpZiAoKmZpcnN0ID4gKnNlY29uZCkgcmV0dXJuIDE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBQcm9iUG9pbnRlciB7Ci0gIHVuc2lnbmVkIGNoYXIgYXJyYXk7Ci0gIHVpbnQ2NF90IGluZGV4OwotfTsKLQotLy8gQXJyYXkgb2Ygbi1ncmFtcyBhbmQgZmxvYXQgaW5kaWNlcy4KLWNsYXNzIEJhY2tvZmZNZXNzYWdlcyB7Ci0gIHB1YmxpYzoKLSAgICB2b2lkIEluaXQoc3RkOjpzaXplX3QgZW50cnlfc2l6ZSkgewotICAgICAgY3VycmVudF8gPSBOVUxMOwotICAgICAgYWxsb2NhdGVkXyA9IE5VTEw7Ci0gICAgICBlbnRyeV9zaXplXyA9IGVudHJ5X3NpemU7Ci0gICAgfQotCi0gICAgdm9pZCBBZGQoY29uc3QgV29yZEluZGV4ICp0bywgUHJvYlBvaW50ZXIgaW5kZXgpIHsKLSAgICAgIHdoaWxlIChjdXJyZW50XyArIGVudHJ5X3NpemVfID4gYWxsb2NhdGVkXykgewotICAgICAgICBzdGQ6OnNpemVfdCBhbGxvY2F0ZWRfc2l6ZSA9IGFsbG9jYXRlZF8gLSAodWludDhfdCopYmFja2luZ18uZ2V0KCk7Ci0gICAgICAgIFJlc2l6ZShzdGQ6Om1heDxzdGQ6OnNpemVfdD4oYWxsb2NhdGVkX3NpemUgKiAyLCBlbnRyeV9zaXplXykpOwotICAgICAgfQotICAgICAgbWVtY3B5KGN1cnJlbnRfLCB0bywgZW50cnlfc2l6ZV8gLSBzaXplb2YoUHJvYlBvaW50ZXIpKTsKLSAgICAgICpyZWludGVycHJldF9jYXN0PFByb2JQb2ludGVyKj4oY3VycmVudF8gKyBlbnRyeV9zaXplXyAtIHNpemVvZihQcm9iUG9pbnRlcikpID0gaW5kZXg7Ci0gICAgICBjdXJyZW50XyArPSBlbnRyeV9zaXplXzsKLSAgICB9Ci0KLSAgICB2b2lkIEFwcGx5KGZsb2F0ICpjb25zdCAqY29uc3QgYmFzZSwgRklMRSAqdW5pZ3JhbXMpIHsKLSAgICAgIEZpbmlzaGVkQWRkaW5nKCk7Ci0gICAgICBpZiAoY3VycmVudF8gPT0gYWxsb2NhdGVkXykgcmV0dXJuOwotICAgICAgcmV3aW5kKHVuaWdyYW1zKTsKLSAgICAgIFByb2JCYWNrb2ZmIHdlaWdodHM7Ci0gICAgICBXb3JkSW5kZXggdW5pZ3JhbSA9IDA7Ci0gICAgICBSZWFkT3JUaHJvdyh1bmlncmFtcywgJndlaWdodHMsIHNpemVvZih3ZWlnaHRzKSk7Ci0gICAgICBmb3IgKDsgY3VycmVudF8gIT0gYWxsb2NhdGVkXzsgY3VycmVudF8gKz0gZW50cnlfc2l6ZV8pIHsKLSAgICAgICAgY29uc3QgV29yZEluZGV4ICZjdXJfd29yZCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFdvcmRJbmRleCo+KGN1cnJlbnRfKTsKLSAgICAgICAgZm9yICg7IHVuaWdyYW0gPCBjdXJfd29yZDsgKyt1bmlncmFtKSB7Ci0gICAgICAgICAgUmVhZE9yVGhyb3codW5pZ3JhbXMsICZ3ZWlnaHRzLCBzaXplb2Yod2VpZ2h0cykpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghSGFzRXh0ZW5zaW9uKHdlaWdodHMuYmFja29mZikpIHsKLSAgICAgICAgICB3ZWlnaHRzLmJhY2tvZmYgPSBrRXh0ZW5zaW9uQmFja29mZjsKLSAgICAgICAgICBVVElMX1RIUk9XX0lGKGZzZWVrKHVuaWdyYW1zLCAtc2l6ZW9mKHdlaWdodHMpLCBTRUVLX0NVUiksIHV0aWw6OkVycm5vRXhjZXB0aW9uLCAiU2Vla2luZyBiYWNrd2FyZHMgdG8gZGVub3RlIHVuaWdyYW0gZXh0ZW5zaW9uIGZhaWxlZC4iKTsKLSAgICAgICAgICB1dGlsOjpXcml0ZU9yVGhyb3codW5pZ3JhbXMsICZ3ZWlnaHRzLCBzaXplb2Yod2VpZ2h0cykpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IFByb2JQb2ludGVyICZ3cml0ZV90byA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFByb2JQb2ludGVyKj4oY3VycmVudF8gKyBzaXplb2YoV29yZEluZGV4KSk7Ci0gICAgICAgIGJhc2Vbd3JpdGVfdG8uYXJyYXldW3dyaXRlX3RvLmluZGV4XSArPSB3ZWlnaHRzLmJhY2tvZmY7Ci0gICAgICB9Ci0gICAgICBiYWNraW5nXy5yZXNldCgpOwotICAgIH0KLQotICAgIHZvaWQgQXBwbHkoZmxvYXQgKmNvbnN0ICpjb25zdCBiYXNlLCBSZWNvcmRSZWFkZXIgJnJlYWRlcikgewotICAgICAgRmluaXNoZWRBZGRpbmcoKTsKLSAgICAgIGlmIChjdXJyZW50XyA9PSBhbGxvY2F0ZWRfKSByZXR1cm47Ci0gICAgICAvLyBXZSdsbCBhbHNvIHVzZSB0aGUgc2FtZSBidWZmZXIgdG8gcmVjb3JkIG1lc3NhZ2VzIHRvIGJsYW5rcyB0aGF0IHRoZXkgZXh0ZW5kLgotICAgICAgV29yZEluZGV4ICpleHRlbmRfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxXb3JkSW5kZXgqPihjdXJyZW50Xyk7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG9yZGVyID0gKGVudHJ5X3NpemVfIC0gc2l6ZW9mKFByb2JQb2ludGVyKSkgLyBzaXplb2YoV29yZEluZGV4KTsKLSAgICAgIGZvciAocmVhZGVyLlJld2luZCgpOyByZWFkZXIgJiYgKGN1cnJlbnRfICE9IGFsbG9jYXRlZF8pOyApIHsKLSAgICAgICAgc3dpdGNoIChDb21wYXJlKG9yZGVyLCByZWFkZXIuRGF0YSgpLCBjdXJyZW50XykpIHsKLSAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgKytyZWFkZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAvLyBNZXNzYWdlIGJ1dCBub2JvZHkgdG8gcmVjZWl2ZSBpdC4gIFdyaXRlIGl0IGRvd24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNvIHdlIGNhbiBpbmZvcm0gdGhpcyBibGFuayB0aGF0IGl0IGV4dGVuZHMuCi0gICAgICAgICAgICBmb3IgKGNvbnN0IFdvcmRJbmRleCAqdyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgV29yZEluZGV4ICo+KGN1cnJlbnRfKTsgdyAhPSByZWludGVycHJldF9jYXN0PGNvbnN0IFdvcmRJbmRleCAqPihjdXJyZW50XykgKyBvcmRlcjsgKyt3LCArK2V4dGVuZF9vdXQpICpleHRlbmRfb3V0ID0gKnc7Ci0gICAgICAgICAgICBjdXJyZW50XyArPSBlbnRyeV9zaXplXzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGZsb2F0ICZiYWNrb2ZmID0gcmVpbnRlcnByZXRfY2FzdDxQcm9iQmFja29mZio+KCh1aW50OF90KilyZWFkZXIuRGF0YSgpICsgb3JkZXIgKiBzaXplb2YoV29yZEluZGV4KSktPmJhY2tvZmY7Ci0gICAgICAgICAgICBpZiAoIUhhc0V4dGVuc2lvbihiYWNrb2ZmKSkgewotICAgICAgICAgICAgICBiYWNrb2ZmID0ga0V4dGVuc2lvbkJhY2tvZmY7Ci0gICAgICAgICAgICAgIHJlYWRlci5PdmVyd3JpdGUoJmJhY2tvZmYsIHNpemVvZihmbG9hdCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgY29uc3QgUHJvYlBvaW50ZXIgJndyaXRlX3RvID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUHJvYlBvaW50ZXIqPihjdXJyZW50XyArIGVudHJ5X3NpemVfIC0gc2l6ZW9mKFByb2JQb2ludGVyKSk7Ci0gICAgICAgICAgICAgIGJhc2Vbd3JpdGVfdG8uYXJyYXldW3dyaXRlX3RvLmluZGV4XSArPSBiYWNrb2ZmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudF8gKz0gZW50cnlfc2l6ZV87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gTm93IHRoaXMgaXMgYSBsaXN0IG9mIGJsYW5rcyB0aGF0IGV4dGVuZCByaWdodC4KLSAgICAgIGVudHJ5X3NpemVfID0gc2l6ZW9mKFdvcmRJbmRleCkgKiBvcmRlcjsKLSAgICAgIFJlc2l6ZShzaXplb2YoV29yZEluZGV4KSAqIChleHRlbmRfb3V0IC0gKGNvbnN0IFdvcmRJbmRleCopYmFja2luZ18uZ2V0KCkpKTsKLSAgICAgIGN1cnJlbnRfID0gKHVpbnQ4X3QqKWJhY2tpbmdfLmdldCgpOwotICAgIH0KLQotICAgIC8vIENhbGwgYWZ0ZXIgQXBwbHkKLSAgICBib29sIEV4dGVuZHModW5zaWduZWQgY2hhciBvcmRlciwgY29uc3QgV29yZEluZGV4ICp3b3JkcykgewotICAgICAgaWYgKGN1cnJlbnRfID09IGFsbG9jYXRlZF8pIHJldHVybiBmYWxzZTsKLSAgICAgIGFzc2VydChvcmRlciAqIHNpemVvZihXb3JkSW5kZXgpID09IGVudHJ5X3NpemVfKTsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaChDb21wYXJlKG9yZGVyLCB3b3JkcywgY3VycmVudF8pKSB7Ci0gICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY3VycmVudF8gKz0gZW50cnlfc2l6ZV87Ci0gICAgICAgICAgICBpZiAoY3VycmVudF8gPT0gYWxsb2NhdGVkXykgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAtMToKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBwcml2YXRlOgotICAgIHZvaWQgRmluaXNoZWRBZGRpbmcoKSB7Ci0gICAgICBSZXNpemUoY3VycmVudF8gLSAodWludDhfdCopYmFja2luZ18uZ2V0KCkpOwotICAgICAgLy8gU29ydCByZXF1ZXN0cyBpbiBzYW1lIG9yZGVyIGFzIGZpbGVzLgotICAgICAgc3RkOjpzb3J0KAotICAgICAgICAgIHV0aWw6OlNpemVkSXRlcmF0b3IodXRpbDo6U2l6ZWRQcm94eShiYWNraW5nXy5nZXQoKSwgZW50cnlfc2l6ZV8pKSwKLSAgICAgICAgICB1dGlsOjpTaXplZEl0ZXJhdG9yKHV0aWw6OlNpemVkUHJveHkoY3VycmVudF8sIGVudHJ5X3NpemVfKSksCi0gICAgICAgICAgdXRpbDo6U2l6ZWRDb21wYXJlPEVudHJ5Q29tcGFyZT4oRW50cnlDb21wYXJlKChlbnRyeV9zaXplXyAtIHNpemVvZihQcm9iUG9pbnRlcikpIC8gc2l6ZW9mKFdvcmRJbmRleCkpKSk7Ci0gICAgICBjdXJyZW50XyA9ICh1aW50OF90KiliYWNraW5nXy5nZXQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIFJlc2l6ZShzdGQ6OnNpemVfdCB0bykgewotICAgICAgc3RkOjpzaXplX3QgY3VycmVudCA9IGN1cnJlbnRfIC0gKHVpbnQ4X3QqKWJhY2tpbmdfLmdldCgpOwotICAgICAgYmFja2luZ18uY2FsbF9yZWFsbG9jKHRvKTsKLSAgICAgIGN1cnJlbnRfID0gKHVpbnQ4X3QqKWJhY2tpbmdfLmdldCgpICsgY3VycmVudDsKLSAgICAgIGFsbG9jYXRlZF8gPSAodWludDhfdCopYmFja2luZ18uZ2V0KCkgKyB0bzsKLSAgICB9Ci0KLSAgICB1dGlsOjpzY29wZWRfbWFsbG9jIGJhY2tpbmdfOwotCi0gICAgdWludDhfdCAqY3VycmVudF8sICphbGxvY2F0ZWRfOwotCi0gICAgc3RkOjpzaXplX3QgZW50cnlfc2l6ZV87Ci19OwotCi1jb25zdCBmbG9hdCBrQmFkUHJvYiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOwotCi1jbGFzcyBTUklTdWNrcyB7Ci0gIHB1YmxpYzoKLSAgICBTUklTdWNrcygpIHsKLSAgICAgIGZvciAoQmFja29mZk1lc3NhZ2VzICppID0gbWVzc2FnZXNfOyBpICE9IG1lc3NhZ2VzXyArIEtFTkxNX01BWF9PUkRFUiAtIDE7ICsraSkKLSAgICAgICAgaS0+SW5pdChzaXplb2YoUHJvYlBvaW50ZXIpICsgc2l6ZW9mKFdvcmRJbmRleCkgKiAoaSAtIG1lc3NhZ2VzXyArIDEpKTsKLSAgICB9Ci0KLSAgICB2b2lkIFNlbmQodW5zaWduZWQgY2hhciBiZWdpbiwgdW5zaWduZWQgY2hhciBvcmRlciwgY29uc3QgV29yZEluZGV4ICp0bywgZmxvYXQgcHJvYl9iYXNpcykgewotICAgICAgYXNzZXJ0KHByb2JfYmFzaXMgIT0ga0JhZFByb2IpOwotICAgICAgUHJvYlBvaW50ZXIgcG9pbnRlcjsKLSAgICAgIHBvaW50ZXIuYXJyYXkgPSBvcmRlciAtIDE7Ci0gICAgICBwb2ludGVyLmluZGV4ID0gdmFsdWVzX1tvcmRlciAtIDFdLnNpemUoKTsKLSAgICAgIGZvciAodW5zaWduZWQgY2hhciBpID0gYmVnaW47IGkgPCBvcmRlcjsgKytpKSB7Ci0gICAgICAgIG1lc3NhZ2VzX1tpIC0gMV0uQWRkKHRvLCBwb2ludGVyKTsKLSAgICAgIH0KLSAgICAgIHZhbHVlc19bb3JkZXIgLSAxXS5wdXNoX2JhY2socHJvYl9iYXNpcyk7Ci0gICAgfQotCi0gICAgdm9pZCBPYnRhaW5CYWNrb2Zmcyh1bnNpZ25lZCBjaGFyIHRvdGFsX29yZGVyLCBGSUxFICp1bmlncmFtX2ZpbGUsIFJlY29yZFJlYWRlciAqcmVhZGVyKSB7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGNoYXIgaSA9IDA7IGkgPCBLRU5MTV9NQVhfT1JERVIgLSAxOyArK2kpIHsKLSAgICAgICAgaXRfW2ldID0gdmFsdWVzX1tpXS5lbXB0eSgpID8gTlVMTCA6ICYqdmFsdWVzX1tpXS5iZWdpbigpOwotICAgICAgfQotICAgICAgbWVzc2FnZXNfWzBdLkFwcGx5KGl0XywgdW5pZ3JhbV9maWxlKTsKLSAgICAgIEJhY2tvZmZNZXNzYWdlcyAqbWVzc2FnZXMgPSBtZXNzYWdlc18gKyAxOwotICAgICAgY29uc3QgUmVjb3JkUmVhZGVyICplbmQgPSByZWFkZXIgKyB0b3RhbF9vcmRlciAtIDIgLyogZXhjbHVkZSB1bmlncmFtcyBhbmQgbG9uZ2VzdCBvcmRlciAqLzsKLSAgICAgIGZvciAoOyByZWFkZXIgIT0gZW5kOyArK21lc3NhZ2VzLCArK3JlYWRlcikgewotICAgICAgICBtZXNzYWdlcy0+QXBwbHkoaXRfLCAqcmVhZGVyKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBQcm9iQmFja29mZiBHZXRCbGFuayh1bnNpZ25lZCBjaGFyIHRvdGFsX29yZGVyLCB1bnNpZ25lZCBjaGFyIG9yZGVyLCBjb25zdCBXb3JkSW5kZXggKmluZGljZXMpIHsKLSAgICAgIGFzc2VydChvcmRlciA+IDEpOwotICAgICAgUHJvYkJhY2tvZmYgcmV0OwotICAgICAgcmV0LnByb2IgPSAqKGl0X1tvcmRlciAtIDFdKyspOwotICAgICAgcmV0LmJhY2tvZmYgPSAoKG9yZGVyICE9IHRvdGFsX29yZGVyIC0gMSkgJiYgbWVzc2FnZXNfW29yZGVyIC0gMV0uRXh0ZW5kcyhvcmRlciwgaW5kaWNlcykpID8ga0V4dGVuc2lvbkJhY2tvZmYgOiBrTm9FeHRlbnNpb25CYWNrb2ZmOwotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4gJlZhbHVlcyh1bnNpZ25lZCBjaGFyIG9yZGVyKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdmFsdWVzX1tvcmRlciAtIDFdOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIC8vIFRoaXMgdXNlZCB0byBiZSBvbmUgYXJyYXkuICBUaGVuIEkgbmVlZGVkIHRvIHNlcGFyYXRlIGl0IGJ5IG9yZGVyIGZvciBxdWFudGl6YXRpb24gdG8gd29yay4KLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gdmFsdWVzX1tLRU5MTV9NQVhfT1JERVIgLSAxXTsKLSAgICBCYWNrb2ZmTWVzc2FnZXMgbWVzc2FnZXNfW0tFTkxNX01BWF9PUkRFUiAtIDFdOwotCi0gICAgZmxvYXQgKml0X1tLRU5MTV9NQVhfT1JERVIgLSAxXTsKLX07Ci0KLWNsYXNzIEZpbmRCbGFua3MgewotICBwdWJsaWM6Ci0gICAgRmluZEJsYW5rcyh1bnNpZ25lZCBjaGFyIG9yZGVyLCBjb25zdCBQcm9iQmFja29mZiAqdW5pZ3JhbXMsIFNSSVN1Y2tzICZtZXNzYWdlcykKLSAgICAgIDogY291bnRzXyhvcmRlciksIHVuaWdyYW1zXyh1bmlncmFtcyksIHNyaV8obWVzc2FnZXMpIHt9Ci0KLSAgICBmbG9hdCBVbmlncmFtUHJvYihXb3JkSW5kZXggaW5kZXgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB1bmlncmFtc19baW5kZXhdLnByb2I7Ci0gICAgfQotCi0gICAgdm9pZCBVbmlncmFtKFdvcmRJbmRleCAvKmluZGV4Ki8pIHsKLSAgICAgICsrY291bnRzX1swXTsKLSAgICB9Ci0KLSAgICB2b2lkIE1pZGRsZUJsYW5rKGNvbnN0IHVuc2lnbmVkIGNoYXIgb3JkZXIsIGNvbnN0IFdvcmRJbmRleCAqaW5kaWNlcywgdW5zaWduZWQgY2hhciBsb3dlciwgZmxvYXQgcHJvYl9iYXNpcykgewotICAgICAgc3JpXy5TZW5kKGxvd2VyLCBvcmRlciwgaW5kaWNlcyArIDEsIHByb2JfYmFzaXMpOwotICAgICAgKytjb3VudHNfW29yZGVyIC0gMV07Ci0gICAgfQotCi0gICAgdm9pZCBNaWRkbGUoY29uc3QgdW5zaWduZWQgY2hhciBvcmRlciwgY29uc3Qgdm9pZCAqIC8qZGF0YSovKSB7Ci0gICAgICArK2NvdW50c19bb3JkZXIgLSAxXTsKLSAgICB9Ci0KLSAgICB2b2lkIExvbmdlc3QoY29uc3Qgdm9pZCAqIC8qZGF0YSovKSB7Ci0gICAgICArK2NvdW50c18uYmFjaygpOwotICAgIH0KLQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmQ291bnRzKCkgY29uc3QgewotICAgICAgcmV0dXJuIGNvdW50c187Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGNvdW50c187Ci0KLSAgICBjb25zdCBQcm9iQmFja29mZiAqdW5pZ3JhbXNfOwotCi0gICAgU1JJU3Vja3MgJnNyaV87Ci19OwotCi0vLyBQaGFzZSB0byBhY3R1YWxseSB3cml0ZSBuLWdyYW1zIHRvIHRoZSB0cmllLgotdGVtcGxhdGUgPGNsYXNzIFF1YW50LCBjbGFzcyBCaGlrc2hhPiBjbGFzcyBXcml0ZUVudHJpZXMgewotICBwdWJsaWM6Ci0gICAgV3JpdGVFbnRyaWVzKFJlY29yZFJlYWRlciAqY29udGV4dHMsIGNvbnN0IFF1YW50ICZxdWFudCwgVW5pZ3JhbVZhbHVlICp1bmlncmFtcywgQml0UGFja2VkTWlkZGxlPEJoaWtzaGE+ICptaWRkbGUsIEJpdFBhY2tlZExvbmdlc3QgJmxvbmdlc3QsIHVuc2lnbmVkIGNoYXIgb3JkZXIsIFNSSVN1Y2tzICZzcmkpIDoKLSAgICAgIGNvbnRleHRzXyhjb250ZXh0cyksCi0gICAgICBxdWFudF8ocXVhbnQpLAotICAgICAgdW5pZ3JhbXNfKHVuaWdyYW1zKSwKLSAgICAgIG1pZGRsZV8obWlkZGxlKSwKLSAgICAgIGxvbmdlc3RfKGxvbmdlc3QpLAotICAgICAgYmlncmFtX3BhY2tfKChvcmRlciA9PSAyKSA/IHN0YXRpY19jYXN0PEJpdFBhY2tlZCY+KGxvbmdlc3RfKSA6IHN0YXRpY19jYXN0PEJpdFBhY2tlZCY+KCptaWRkbGVfKSksCi0gICAgICBvcmRlcl8ob3JkZXIpLAotICAgICAgc3JpXyhzcmkpIHt9Ci0KLSAgICBmbG9hdCBVbmlncmFtUHJvYihXb3JkSW5kZXggaW5kZXgpIGNvbnN0IHsgcmV0dXJuIHVuaWdyYW1zX1tpbmRleF0ud2VpZ2h0cy5wcm9iOyB9Ci0KLSAgICB2b2lkIFVuaWdyYW0oV29yZEluZGV4IHdvcmQpIHsKLSAgICAgIHVuaWdyYW1zX1t3b3JkXS5uZXh0ID0gYmlncmFtX3BhY2tfLkluc2VydEluZGV4KCk7Ci0gICAgfQotCi0gICAgdm9pZCBNaWRkbGVCbGFuayhjb25zdCB1bnNpZ25lZCBjaGFyIG9yZGVyLCBjb25zdCBXb3JkSW5kZXggKmluZGljZXMsIHVuc2lnbmVkIGNoYXIgLypsb3dlciovLCBmbG9hdCAvKnByb2JfYmFzZSovKSB7Ci0gICAgICBQcm9iQmFja29mZiB3ZWlnaHRzID0gc3JpXy5HZXRCbGFuayhvcmRlcl8sIG9yZGVyLCBpbmRpY2VzKTsKLSAgICAgIHR5cGVuYW1lIFF1YW50OjpNaWRkbGVQb2ludGVyKHF1YW50Xywgb3JkZXIgLSAyLCBtaWRkbGVfW29yZGVyIC0gMl0uSW5zZXJ0KGluZGljZXNbb3JkZXIgLSAxXSkpLldyaXRlKHdlaWdodHMucHJvYiwgd2VpZ2h0cy5iYWNrb2ZmKTsKLSAgICB9Ci0KLSAgICB2b2lkIE1pZGRsZShjb25zdCB1bnNpZ25lZCBjaGFyIG9yZGVyLCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgICBSZWNvcmRSZWFkZXIgJmNvbnRleHQgPSBjb250ZXh0c19bb3JkZXIgLSAxXTsKLSAgICAgIGNvbnN0IFdvcmRJbmRleCAqd29yZHMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFdvcmRJbmRleCo+KGRhdGEpOwotICAgICAgUHJvYkJhY2tvZmYgd2VpZ2h0cyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFByb2JCYWNrb2ZmKj4od29yZHMgKyBvcmRlcik7Ci0gICAgICBpZiAoY29udGV4dCAmJiAhbWVtY21wKGRhdGEsIGNvbnRleHQuRGF0YSgpLCBzaXplb2YoV29yZEluZGV4KSAqIG9yZGVyKSkgewotICAgICAgICBTZXRFeHRlbnNpb24od2VpZ2h0cy5iYWNrb2ZmKTsKLSAgICAgICAgKytjb250ZXh0OwotICAgICAgfQotICAgICAgdHlwZW5hbWUgUXVhbnQ6Ok1pZGRsZVBvaW50ZXIocXVhbnRfLCBvcmRlciAtIDIsIG1pZGRsZV9bb3JkZXIgLSAyXS5JbnNlcnQod29yZHNbb3JkZXIgLSAxXSkpLldyaXRlKHdlaWdodHMucHJvYiwgd2VpZ2h0cy5iYWNrb2ZmKTsKLSAgICB9Ci0KLSAgICB2b2lkIExvbmdlc3QoY29uc3Qgdm9pZCAqZGF0YSkgewotICAgICAgY29uc3QgV29yZEluZGV4ICp3b3JkcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgV29yZEluZGV4Kj4oZGF0YSk7Ci0gICAgICB0eXBlbmFtZSBRdWFudDo6TG9uZ2VzdFBvaW50ZXIocXVhbnRfLCBsb25nZXN0Xy5JbnNlcnQod29yZHNbb3JkZXJfIC0gMV0pKS5Xcml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IFByb2IqPih3b3JkcyArIG9yZGVyXyktPnByb2IpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIFJlY29yZFJlYWRlciAqY29udGV4dHNfOwotICAgIGNvbnN0IFF1YW50ICZxdWFudF87Ci0gICAgVW5pZ3JhbVZhbHVlICpjb25zdCB1bmlncmFtc187Ci0gICAgQml0UGFja2VkTWlkZGxlPEJoaWtzaGE+ICpjb25zdCBtaWRkbGVfOwotICAgIEJpdFBhY2tlZExvbmdlc3QgJmxvbmdlc3RfOwotICAgIEJpdFBhY2tlZCAmYmlncmFtX3BhY2tfOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb3JkZXJfOwotICAgIFNSSVN1Y2tzICZzcmlfOwotfTsKLQotc3RydWN0IEdyYW0gewotICBHcmFtKGNvbnN0IFdvcmRJbmRleCAqaW5fYmVnaW4sIHVuc2lnbmVkIGNoYXIgb3JkZXIpIDogYmVnaW4oaW5fYmVnaW4pLCBlbmQoaW5fYmVnaW4gKyBvcmRlcikge30KLQotICBjb25zdCBXb3JkSW5kZXggKmJlZ2luLCAqZW5kOwotCi0gIC8vIEZvciBxdWV1ZSwgdGhpcyBpcyB0aGUgZGlyZWN0aW9uIHdlIHdhbnQuCi0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEdyYW0gJm90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUob3RoZXIuYmVnaW4sIG90aGVyLmVuZCwgYmVnaW4sIGVuZCk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBEb2luZz4gY2xhc3MgQmxhbmtNYW5hZ2VyIHsKLSAgcHVibGljOgotICAgIEJsYW5rTWFuYWdlcih1bnNpZ25lZCBjaGFyIHRvdGFsX29yZGVyLCBEb2luZyAmZG9pbmcpIDogdG90YWxfb3JkZXJfKHRvdGFsX29yZGVyKSwgYmVlbl9sZW5ndGhfKDApLCBkb2luZ18oZG9pbmcpIHsKLSAgICAgIGZvciAoZmxvYXQgKmkgPSBiYXNpc187IGkgIT0gYmFzaXNfICsgS0VOTE1fTUFYX09SREVSIC0gMTsgKytpKSAqaSA9IGtCYWRQcm9iOwotICAgIH0KLQotICAgIHZvaWQgVmlzaXQoY29uc3QgV29yZEluZGV4ICp0bywgdW5zaWduZWQgY2hhciBsZW5ndGgsIGZsb2F0IHByb2IpIHsKLSAgICAgIGJhc2lzX1tsZW5ndGggLSAxXSA9IHByb2I7Ci0gICAgICB1bnNpZ25lZCBjaGFyIG92ZXJsYXAgPSBzdGQ6Om1pbjx1bnNpZ25lZCBjaGFyPihsZW5ndGggLSAxLCBiZWVuX2xlbmd0aF8pOwotICAgICAgY29uc3QgV29yZEluZGV4ICpjdXI7Ci0gICAgICBXb3JkSW5kZXggKnByZTsKLSAgICAgIGZvciAoY3VyID0gdG8sIHByZSA9IGJlZW5fOyBjdXIgIT0gdG8gKyBvdmVybGFwOyArK2N1ciwgKytwcmUpIHsKLSAgICAgICAgaWYgKCpwcmUgIT0gKmN1cikgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoY3VyID09IHRvICsgbGVuZ3RoIC0gMSkgewotICAgICAgICAqcHJlID0gKmN1cjsKLSAgICAgICAgYmVlbl9sZW5ndGhfID0gbGVuZ3RoOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAvLyBUaGVyZSBhcmUgYmxhbmtzIHRvIGluc2VydCBzdGFydGluZyB3aXRoIG9yZGVyIGJsYW5rLgotICAgICAgdW5zaWduZWQgY2hhciBibGFuayA9IGN1ciAtIHRvICsgMTsKLSAgICAgIFVUSUxfVEhST1dfSUYoYmxhbmsgPT0gMSwgRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIk1pc3NpbmcgYSB1bmlncmFtIHRoYXQgYXBwZWFycyBhcyBjb250ZXh0LiIpOwotICAgICAgY29uc3QgZmxvYXQgKmxvd2VyX2Jhc2lzOwotICAgICAgZm9yIChsb3dlcl9iYXNpcyA9IGJhc2lzXyArIGJsYW5rIC0gMjsgKmxvd2VyX2Jhc2lzID09IGtCYWRQcm9iOyAtLWxvd2VyX2Jhc2lzKSB7fQotICAgICAgdW5zaWduZWQgY2hhciBiYXNlZF9vbiA9IGxvd2VyX2Jhc2lzIC0gYmFzaXNfICsgMTsKLSAgICAgIGZvciAoOyBjdXIgIT0gdG8gKyBsZW5ndGggLSAxOyArK2JsYW5rLCArK2N1ciwgKytwcmUpIHsKLSAgICAgICAgYXNzZXJ0KCpsb3dlcl9iYXNpcyAhPSBrQmFkUHJvYik7Ci0gICAgICAgIGRvaW5nXy5NaWRkbGVCbGFuayhibGFuaywgdG8sIGJhc2VkX29uLCAqbG93ZXJfYmFzaXMpOwotICAgICAgICAqcHJlID0gKmN1cjsKLSAgICAgICAgLy8gTWFyayB0aGF0IHRoZSBwcm9iYWJpbGl0eSBpcyBhIGJsYW5rIHNvIGl0IHNob3VsZG4ndCBiZSB1c2VkIGFzIHRoZSBiYXNpcyBmb3IgYSBsYXRlciBuLWdyYW0uCi0gICAgICAgIGJhc2lzX1tibGFuayAtIDFdID0ga0JhZFByb2I7Ci0gICAgICB9Ci0gICAgICAqcHJlID0gKmN1cjsKLSAgICAgIGJlZW5fbGVuZ3RoXyA9IGxlbmd0aDsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyIHRvdGFsX29yZGVyXzsKLQotICAgIFdvcmRJbmRleCBiZWVuX1tLRU5MTV9NQVhfT1JERVJdOwotICAgIHVuc2lnbmVkIGNoYXIgYmVlbl9sZW5ndGhfOwotCi0gICAgZmxvYXQgYmFzaXNfW0tFTkxNX01BWF9PUkRFUl07Ci0KLSAgICBEb2luZyAmZG9pbmdfOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIERvaW5nPiB2b2lkIFJlY3Vyc2l2ZUluc2VydChjb25zdCB1bnNpZ25lZCBjaGFyIHRvdGFsX29yZGVyLCBjb25zdCBXb3JkSW5kZXggdW5pZ3JhbV9jb3VudCwgUmVjb3JkUmVhZGVyICppbnB1dCwgc3RkOjpvc3RyZWFtICpwcm9ncmVzc19vdXQsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIERvaW5nICZkb2luZykgewotICB1dGlsOjpFcnNhdHpQcm9ncmVzcyBwcm9ncmVzcyh1bmlncmFtX2NvdW50ICsgMSwgcHJvZ3Jlc3Nfb3V0LCBtZXNzYWdlKTsKLSAgV29yZEluZGV4IHVuaWdyYW0gPSAwOwotICBzdGQ6OnByaW9yaXR5X3F1ZXVlPEdyYW0+IGdyYW1zOwotICBpZiAodW5pZ3JhbV9jb3VudCkgZ3JhbXMucHVzaChHcmFtKCZ1bmlncmFtLCAxKSk7Ci0gIGZvciAodW5zaWduZWQgY2hhciBpID0gMjsgaSA8PSB0b3RhbF9vcmRlcjsgKytpKSB7Ci0gICAgaWYgKGlucHV0W2ktMl0pIGdyYW1zLnB1c2goR3JhbShyZWludGVycHJldF9jYXN0PGNvbnN0IFdvcmRJbmRleCo+KGlucHV0W2ktMl0uRGF0YSgpKSwgaSkpOwotICB9Ci0KLSAgQmxhbmtNYW5hZ2VyPERvaW5nPiBibGFuayh0b3RhbF9vcmRlciwgZG9pbmcpOwotCi0gIHdoaWxlICghZ3JhbXMuZW1wdHkoKSkgewotICAgIEdyYW0gdG9wID0gZ3JhbXMudG9wKCk7Ci0gICAgZ3JhbXMucG9wKCk7Ci0gICAgdW5zaWduZWQgY2hhciBvcmRlciA9IHRvcC5lbmQgLSB0b3AuYmVnaW47Ci0gICAgaWYgKG9yZGVyID09IDEpIHsKLSAgICAgIGJsYW5rLlZpc2l0KCZ1bmlncmFtLCAxLCBkb2luZy5VbmlncmFtUHJvYih1bmlncmFtKSk7Ci0gICAgICBkb2luZy5VbmlncmFtKHVuaWdyYW0pOwotICAgICAgcHJvZ3Jlc3MuU2V0KHVuaWdyYW0pOwotICAgICAgaWYgKCsrdW5pZ3JhbSA8IHVuaWdyYW1fY291bnQpIGdyYW1zLnB1c2godG9wKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKG9yZGVyID09IHRvdGFsX29yZGVyKSB7Ci0gICAgICAgIGJsYW5rLlZpc2l0KHRvcC5iZWdpbiwgb3JkZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUHJvYio+KHRvcC5lbmQpLT5wcm9iKTsKLSAgICAgICAgZG9pbmcuTG9uZ2VzdCh0b3AuYmVnaW4pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYmxhbmsuVmlzaXQodG9wLmJlZ2luLCBvcmRlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQcm9iQmFja29mZio+KHRvcC5lbmQpLT5wcm9iKTsKLSAgICAgICAgZG9pbmcuTWlkZGxlKG9yZGVyLCB0b3AuYmVnaW4pOwotICAgICAgfQotICAgICAgUmVjb3JkUmVhZGVyICZyZWFkZXIgPSBpbnB1dFtvcmRlciAtIDJdOwotICAgICAgaWYgKCsrcmVhZGVyKSBncmFtcy5wdXNoKHRvcCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgU2FuaXR5Q2hlY2tDb3VudHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZpbml0aWFsLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmZpeGVkKSB7Ci0gIGlmIChmaXhlZFswXSAhPSBpbml0aWFsWzBdKSBVVElMX1RIUk9XKHV0aWw6OkV4Y2VwdGlvbiwgIlVuaWdyYW0gY291bnQgc2hvdWxkIGJlIGNvbnN0YW50IGJ1dCBpbml0aWFsIGlzICIgPDwgaW5pdGlhbFswXSA8PCAiIGFuZCByZWNvdW50ZWQgaXMgIiA8PCBmaXhlZFswXSk7Ci0gIGlmIChmaXhlZC5iYWNrKCkgIT0gaW5pdGlhbC5iYWNrKCkpIFVUSUxfVEhST1codXRpbDo6RXhjZXB0aW9uLCAiTG9uZ2VzdCBjb3VudCBzaG91bGQgYmUgY29uc3RhbnQgYnV0IGl0IGNoYW5nZWQgZnJvbSAiIDw8IGluaXRpYWwuYmFjaygpIDw8ICIgdG8gIiA8PCBmaXhlZC5iYWNrKCkpOwotICBmb3IgKHVuc2lnbmVkIGNoYXIgaSA9IDA7IGkgPCBpbml0aWFsLnNpemUoKTsgKytpKSB7Ci0gICAgaWYgKGZpeGVkW2ldIDwgaW5pdGlhbFtpXSkgVVRJTF9USFJPVyh1dGlsOjpFeGNlcHRpb24sICJDb3VudHMgY2FtZSBvdXQgbG93ZXIgdGhhbiBleHBlY3RlZC4gIFRoaXMgc2hvdWxkbid0IGhhcHBlbiIpOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBRdWFudD4gdm9pZCBUcmFpblF1YW50aXplcih1aW50OF90IG9yZGVyLCB1aW50NjRfdCBjb3VudCwgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICZhZGRpdGlvbmFsLCBSZWNvcmRSZWFkZXIgJnJlYWRlciwgdXRpbDo6RXJzYXR6UHJvZ3Jlc3MgJnByb2dyZXNzLCBRdWFudCAmcXVhbnQpIHsKLSAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHByb2JzKGFkZGl0aW9uYWwpLCBiYWNrb2ZmczsKLSAgcHJvYnMucmVzZXJ2ZShjb3VudCArIGFkZGl0aW9uYWwuc2l6ZSgpKTsKLSAgYmFja29mZnMucmVzZXJ2ZShjb3VudCk7Ci0gIGZvciAocmVhZGVyLlJld2luZCgpOyByZWFkZXI7ICsrcmVhZGVyKSB7Ci0gICAgY29uc3QgUHJvYkJhY2tvZmYgJndlaWdodHMgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQcm9iQmFja29mZio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJlYWRlci5EYXRhKCkpICsgc2l6ZW9mKFdvcmRJbmRleCkgKiBvcmRlcik7Ci0gICAgcHJvYnMucHVzaF9iYWNrKHdlaWdodHMucHJvYik7Ci0gICAgaWYgKHdlaWdodHMuYmFja29mZiAhPSAwLjApIGJhY2tvZmZzLnB1c2hfYmFjayh3ZWlnaHRzLmJhY2tvZmYpOwotICAgICsrcHJvZ3Jlc3M7Ci0gIH0KLSAgcXVhbnQuVHJhaW4ob3JkZXIsIHByb2JzLCBiYWNrb2Zmcyk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBRdWFudD4gdm9pZCBUcmFpblByb2JRdWFudGl6ZXIodWludDhfdCBvcmRlciwgdWludDY0X3QgY291bnQsIFJlY29yZFJlYWRlciAmcmVhZGVyLCB1dGlsOjpFcnNhdHpQcm9ncmVzcyAmcHJvZ3Jlc3MsIFF1YW50ICZxdWFudCkgewotICBzdGQ6OnZlY3RvcjxmbG9hdD4gcHJvYnMsIGJhY2tvZmZzOwotICBwcm9icy5yZXNlcnZlKGNvdW50KTsKLSAgZm9yIChyZWFkZXIuUmV3aW5kKCk7IHJlYWRlcjsgKytyZWFkZXIpIHsKLSAgICBjb25zdCBQcm9iICZ3ZWlnaHRzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUHJvYio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJlYWRlci5EYXRhKCkpICsgc2l6ZW9mKFdvcmRJbmRleCkgKiBvcmRlcik7Ci0gICAgcHJvYnMucHVzaF9iYWNrKHdlaWdodHMucHJvYik7Ci0gICAgKytwcm9ncmVzczsKLSAgfQotICBxdWFudC5UcmFpblByb2Iob3JkZXIsIHByb2JzKTsKLX0KLQotdm9pZCBQb3B1bGF0ZVVuaWdyYW1XZWlnaHRzKEZJTEUgKmZpbGUsIFdvcmRJbmRleCB1bmlncmFtX2NvdW50LCBSZWNvcmRSZWFkZXIgJmNvbnRleHRzLCBVbmlncmFtVmFsdWUgKnVuaWdyYW1zKSB7Ci0gIC8vIEZpbGwgdW5pZ3JhbSBwcm9iYWJpbGl0aWVzLgotICB0cnkgewotICAgIHJld2luZChmaWxlKTsKLSAgICBmb3IgKFdvcmRJbmRleCBpID0gMDsgaSA8IHVuaWdyYW1fY291bnQ7ICsraSkgewotICAgICAgUmVhZE9yVGhyb3coZmlsZSwgJnVuaWdyYW1zW2ldLndlaWdodHMsIHNpemVvZihQcm9iQmFja29mZikpOwotICAgICAgaWYgKGNvbnRleHRzICYmICpyZWludGVycHJldF9jYXN0PGNvbnN0IFdvcmRJbmRleCo+KGNvbnRleHRzLkRhdGEoKSkgPT0gaSkgewotICAgICAgICBTZXRFeHRlbnNpb24odW5pZ3JhbXNbaV0ud2VpZ2h0cy5iYWNrb2ZmKTsKLSAgICAgICAgKytjb250ZXh0czsKLSAgICAgIH0KLSAgICB9Ci0gIH0gY2F0Y2ggKHV0aWw6OkV4Y2VwdGlvbiAmZSkgewotICAgIGUgPDwgIiB3aGlsZSByZS1yZWFkaW5nIHVuaWdyYW0gcHJvYmFiaWxpdGllcyI7Ci0gICAgdGhyb3c7Ci0gIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UKLQotdGVtcGxhdGUgPGNsYXNzIFF1YW50LCBjbGFzcyBCaGlrc2hhPiB2b2lkIEJ1aWxkVHJpZShTb3J0ZWRGaWxlcyAmZmlsZXMsIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzLCBjb25zdCBDb25maWcgJmNvbmZpZywgVHJpZVNlYXJjaDxRdWFudCwgQmhpa3NoYT4gJm91dCwgUXVhbnQgJnF1YW50LCBTb3J0ZWRWb2NhYnVsYXJ5ICZ2b2NhYiwgQmluYXJ5Rm9ybWF0ICZiYWNraW5nKSB7Ci0gIFJlY29yZFJlYWRlciBpbnB1dHNbS0VOTE1fTUFYX09SREVSIC0gMV07Ci0gIFJlY29yZFJlYWRlciBjb250ZXh0c1tLRU5MTV9NQVhfT1JERVIgLSAxXTsKLQotICBmb3IgKHVuc2lnbmVkIGNoYXIgaSA9IDI7IGkgPD0gY291bnRzLnNpemUoKTsgKytpKSB7Ci0gICAgaW5wdXRzW2ktMl0uSW5pdChmaWxlcy5GdWxsKGkpLCBpICogc2l6ZW9mKFdvcmRJbmRleCkgKyAoaSA9PSBjb3VudHMuc2l6ZSgpID8gc2l6ZW9mKFByb2IpIDogc2l6ZW9mKFByb2JCYWNrb2ZmKSkpOwotICAgIGNvbnRleHRzW2ktMl0uSW5pdChmaWxlcy5Db250ZXh0KGkpLCAoaS0xKSAqIHNpemVvZihXb3JkSW5kZXgpKTsKLSAgfQotCi0gIFNSSVN1Y2tzIHNyaTsKLSAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGZpeGVkX2NvdW50czsKLSAgdXRpbDo6c2NvcGVkX0ZJTEUgdW5pZ3JhbV9maWxlOwotICB1dGlsOjpzY29wZWRfZmQgdW5pZ3JhbV9mZChmaWxlcy5TdGVhbFVuaWdyYW0oKSk7Ci0gIHsKLSAgICB1dGlsOjpzY29wZWRfbWVtb3J5IHVuaWdyYW1zOwotICAgIE1hcFJlYWQodXRpbDo6UE9QVUxBVEVfT1JfUkVBRCwgdW5pZ3JhbV9mZC5nZXQoKSwgMCwgY291bnRzWzBdICogc2l6ZW9mKFByb2JCYWNrb2ZmKSwgdW5pZ3JhbXMpOwotICAgIEZpbmRCbGFua3MgZmluZGVyKGNvdW50cy5zaXplKCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUHJvYkJhY2tvZmYqPih1bmlncmFtcy5nZXQoKSksIHNyaSk7Ci0gICAgUmVjdXJzaXZlSW5zZXJ0KGNvdW50cy5zaXplKCksIGNvdW50c1swXSwgaW5wdXRzLCBjb25maWcuUHJvZ3Jlc3NNZXNzYWdlcygpLCAiSWRlbnRpZnlpbmcgbi1ncmFtcyBvbWl0dGVkIGJ5IFNSSSIsIGZpbmRlcik7Ci0gICAgZml4ZWRfY291bnRzID0gZmluZGVyLkNvdW50cygpOwotICB9Ci0gIHVuaWdyYW1fZmlsZS5yZXNldCh1dGlsOjpGRE9wZW5PclRocm93KHVuaWdyYW1fZmQpKTsKLSAgZm9yIChjb25zdCBSZWNvcmRSZWFkZXIgKmkgPSBpbnB1dHM7IGkgIT0gaW5wdXRzICsgY291bnRzLnNpemUoKSAtIDI7ICsraSkgewotICAgIGlmICgqaSkgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiVGhlcmUncyBhIGJ1ZyBpbiB0aGUgdHJpZSBpbXBsZW1lbnRhdGlvbjogdGhlICIgPDwgKGkgLSBpbnB1dHMgKyAyKSA8PCAiLWdyYW0gdGFibGUgZGlkIG5vdCBjb21wbGV0ZSByZWFkaW5nIik7Ci0gIH0KLSAgU2FuaXR5Q2hlY2tDb3VudHMoY291bnRzLCBmaXhlZF9jb3VudHMpOwotICBjb3VudHMgPSBmaXhlZF9jb3VudHM7Ci0KLSAgc3JpLk9idGFpbkJhY2tvZmZzKGNvdW50cy5zaXplKCksIHVuaWdyYW1fZmlsZS5nZXQoKSwgaW5wdXRzKTsKLQotICB2b2lkICp2b2NhYl9yZWxvY2F0ZTsKLSAgdm9pZCAqc2VhcmNoX2Jhc2UgPSBiYWNraW5nLkdyb3dGb3JTZWFyY2goVHJpZVNlYXJjaDxRdWFudCwgQmhpa3NoYT46OlNpemUoZml4ZWRfY291bnRzLCBjb25maWcpLCB2b2NhYi5VbmtDb3VudENoYW5nZVBhZGRpbmcoKSwgdm9jYWJfcmVsb2NhdGUpOwotICB2b2NhYi5SZWxvY2F0ZSh2b2NhYl9yZWxvY2F0ZSk7Ci0gIG91dC5TZXR1cE1lbW9yeShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihzZWFyY2hfYmFzZSksIGZpeGVkX2NvdW50cywgY29uZmlnKTsKLQotICBmb3IgKHVuc2lnbmVkIGNoYXIgaSA9IDI7IGkgPD0gY291bnRzLnNpemUoKTsgKytpKSB7Ci0gICAgaW5wdXRzW2ktMl0uUmV3aW5kKCk7Ci0gIH0KLSAgaWYgKFF1YW50OjprVHJhaW4pIHsKLSAgICB1dGlsOjpFcnNhdHpQcm9ncmVzcyBwcm9ncmVzcyhzdGQ6OmFjY3VtdWxhdGUoY291bnRzLmJlZ2luKCkgKyAxLCBjb3VudHMuZW5kKCksIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5Qcm9ncmVzc01lc3NhZ2VzKCksICJRdWFudGl6aW5nIik7Ci0gICAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSAyOyBpIDwgY291bnRzLnNpemUoKTsgKytpKSB7Ci0gICAgICBUcmFpblF1YW50aXplcihpLCBjb3VudHNbaS0xXSwgc3JpLlZhbHVlcyhpKSwgaW5wdXRzW2ktMl0sIHByb2dyZXNzLCBxdWFudCk7Ci0gICAgfQotICAgIFRyYWluUHJvYlF1YW50aXplcihjb3VudHMuc2l6ZSgpLCBjb3VudHMuYmFjaygpLCBpbnB1dHNbY291bnRzLnNpemUoKSAtIDJdLCBwcm9ncmVzcywgcXVhbnQpOwotICAgIHF1YW50LkZpbmlzaGVkTG9hZGluZyhjb25maWcpOwotICB9Ci0KLSAgVW5pZ3JhbVZhbHVlICp1bmlncmFtcyA9IG91dC51bmlncmFtXy5SYXcoKTsKLSAgUG9wdWxhdGVVbmlncmFtV2VpZ2h0cyh1bmlncmFtX2ZpbGUuZ2V0KCksIGNvdW50c1swXSwgY29udGV4dHNbMF0sIHVuaWdyYW1zKTsKLSAgdW5pZ3JhbV9maWxlLnJlc2V0KCk7Ci0KLSAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSAyOyBpIDw9IGNvdW50cy5zaXplKCk7ICsraSkgewotICAgIGlucHV0c1tpLTJdLlJld2luZCgpOwotICB9Ci0gIC8vIEZpbGwgZW50cmllcyBleGNlcHQgdW5pZ3JhbSBwcm9iYWJpbGl0aWVzLgotICB7Ci0gICAgV3JpdGVFbnRyaWVzPFF1YW50LCBCaGlrc2hhPiB3cml0ZXIoY29udGV4dHMsIHF1YW50LCB1bmlncmFtcywgb3V0Lm1pZGRsZV9iZWdpbl8sIG91dC5sb25nZXN0XywgY291bnRzLnNpemUoKSwgc3JpKTsKLSAgICBSZWN1cnNpdmVJbnNlcnQoY291bnRzLnNpemUoKSwgY291bnRzWzBdLCBpbnB1dHMsIGNvbmZpZy5Qcm9ncmVzc01lc3NhZ2VzKCksICJXcml0aW5nIHRyaWUiLCB3cml0ZXIpOwotICAgIC8vIFdyaXRlIHRoZSBsYXN0IHVuaWdyYW0gZW50cnksIHdoaWNoIGlzIHRoZSBlbmQgcG9pbnRlciBmb3IgdGhlIGJpZ3JhbXMuICAKLSAgICB3cml0ZXIuVW5pZ3JhbShjb3VudHNbMF0pOwotICB9Ci0KLSAgLy8gRG8gbm90IGRpc2FibGUgdGhpcyBlcnJvciBtZXNzYWdlIG9yIGVsc2UgdG9vIGxpdHRsZSBzdGF0ZSB3aWxsIGJlIHJldHVybmVkLiAgQm90aCBXcml0ZUVudHJpZXM6Ok1pZGRsZSBhbmQgcmV0dXJuaW5nIHN0YXRlIGJhc2VkIG9uIGZvdW5kIG4tZ3JhbXMgd2lsbCBuZWVkIHRvIGJlIGZpeGVkIHRvIGhhbmRsZSB0aGlzIHNpdHVhdGlvbi4KLSAgZm9yICh1bnNpZ25lZCBjaGFyIG9yZGVyID0gMjsgb3JkZXIgPD0gY291bnRzLnNpemUoKTsgKytvcmRlcikgewotICAgIGNvbnN0IFJlY29yZFJlYWRlciAmY29udGV4dCA9IGNvbnRleHRzW29yZGVyIC0gMl07Ci0gICAgaWYgKGNvbnRleHQpIHsKLSAgICAgIEZvcm1hdExvYWRFeGNlcHRpb24gZTsKLSAgICAgIGUgPDwgIkEgIiA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KG9yZGVyKSA8PCAiLWdyYW0gaGFzIGNvbnRleHQiOwotICAgICAgY29uc3QgV29yZEluZGV4ICpjdHggPSByZWludGVycHJldF9jYXN0PGNvbnN0IFdvcmRJbmRleCo+KGNvbnRleHQuRGF0YSgpKTsKLSAgICAgIGZvciAoY29uc3QgV29yZEluZGV4ICppID0gY3R4OyBpICE9IGN0eCArIG9yZGVyIC0gMTsgKytpKSB7Ci0gICAgICAgIGUgPDwgJyAnIDw8ICppOwotICAgICAgfQotICAgICAgZSA8PCAiIHNvIHRoaXMgY29udGV4dCBtdXN0IGFwcGVhciBpbiB0aGUgbW9kZWwgYXMgYSAiIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4ob3JkZXIgLSAxKSA8PCAiLWdyYW0gYnV0IGl0IGRvZXMgbm90IjsKLSAgICAgIHRocm93IGU7Ci0gICAgfQotICB9Ci0KLSAgLyogU2V0IGVuZGluZyBvZmZzZXRzIHNvIHRoZSBsYXN0IGVudHJ5IHdpbGwgYmUgc2l6ZWQgcHJvcGVybHkgKi8KLSAgLy8gTGFzdCBlbnRyeSBmb3IgdW5pZ3JhbXMgd2FzIGFscmVhZHkgc2V0LgotICBpZiAob3V0Lm1pZGRsZV9iZWdpbl8gIT0gb3V0Lm1pZGRsZV9lbmRfKSB7Ci0gICAgZm9yICh0eXBlbmFtZSBUcmllU2VhcmNoPFF1YW50LCBCaGlrc2hhPjo6TWlkZGxlICppID0gb3V0Lm1pZGRsZV9iZWdpbl87IGkgIT0gb3V0Lm1pZGRsZV9lbmRfIC0gMTsgKytpKSB7Ci0gICAgICBpLT5GaW5pc2hlZExvYWRpbmcoKGkrMSktPkluc2VydEluZGV4KCksIGNvbmZpZyk7Ci0gICAgfQotICAgIChvdXQubWlkZGxlX2VuZF8gLSAxKS0+RmluaXNoZWRMb2FkaW5nKG91dC5sb25nZXN0Xy5JbnNlcnRJbmRleCgpLCBjb25maWcpOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBRdWFudCwgY2xhc3MgQmhpa3NoYT4gdWludDhfdCAqVHJpZVNlYXJjaDxRdWFudCwgQmhpa3NoYT46OlNldHVwTWVtb3J5KHVpbnQ4X3QgKnN0YXJ0LCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3QgQ29uZmlnICZjb25maWcpIHsKLSAgcXVhbnRfLlNldHVwTWVtb3J5KHN0YXJ0LCBjb3VudHMuc2l6ZSgpLCBjb25maWcpOwotICBzdGFydCArPSBRdWFudDo6U2l6ZShjb3VudHMuc2l6ZSgpLCBjb25maWcpOwotICB1bmlncmFtXy5Jbml0KHN0YXJ0KTsKLSAgc3RhcnQgKz0gVW5pZ3JhbTo6U2l6ZShjb3VudHNbMF0pOwotICBGcmVlTWlkZGxlcygpOwotICBtaWRkbGVfYmVnaW5fID0gc3RhdGljX2Nhc3Q8TWlkZGxlKj4obWFsbG9jKHNpemVvZihNaWRkbGUpICogKGNvdW50cy5zaXplKCkgLSAyKSkpOwotICBtaWRkbGVfZW5kXyA9IG1pZGRsZV9iZWdpbl8gKyAoY291bnRzLnNpemUoKSAtIDIpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90Kj4gbWlkZGxlX3N0YXJ0cyhjb3VudHMuc2l6ZSgpIC0gMik7Ci0gIGZvciAodW5zaWduZWQgY2hhciBpID0gMjsgaSA8IGNvdW50cy5zaXplKCk7ICsraSkgewotICAgIG1pZGRsZV9zdGFydHNbaS0yXSA9IHN0YXJ0OwotICAgIHN0YXJ0ICs9IE1pZGRsZTo6U2l6ZShRdWFudDo6TWlkZGxlQml0cyhjb25maWcpLCBjb3VudHNbaS0xXSwgY291bnRzWzBdLCBjb3VudHNbaV0sIGNvbmZpZyk7Ci0gIH0KLSAgLy8gQ3JhenkgYmFja3dhcmRzIHRoaW5nIHNvIHdlIGluaXRpYWxpemUgdXNpbmcgcG9pbnRlcnMgdG8gb25lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkCi0gIGZvciAodW5zaWduZWQgY2hhciBpID0gY291bnRzLnNpemUoKSAtIDE7IGkgPj0gMjsgLS1pKSB7Ci0gICAgLy8gdXNlICJwbGFjZW1lbnQgbmV3IiBzeW50YXggdG8gaW5pdGFsaXplIE1pZGRsZSBpbiBhbiBhbHJlYWR5LWFsbG9jYXRlZCBtZW1vcnkgbG9jYXRpb24KLSAgICBuZXcgKG1pZGRsZV9iZWdpbl8gKyBpIC0gMikgTWlkZGxlKAotICAgICAgICBtaWRkbGVfc3RhcnRzW2ktMl0sCi0gICAgICAgIHF1YW50Xy5NaWRkbGVCaXRzKGNvbmZpZyksCi0gICAgICAgIGNvdW50c1tpLTFdLAotICAgICAgICBjb3VudHNbMF0sCi0gICAgICAgIGNvdW50c1tpXSwKLSAgICAgICAgKGkgPT0gY291bnRzLnNpemUoKSAtIDEpID8gc3RhdGljX2Nhc3Q8Y29uc3QgQml0UGFja2VkJj4obG9uZ2VzdF8pIDogc3RhdGljX2Nhc3Q8Y29uc3QgQml0UGFja2VkICY+KG1pZGRsZV9iZWdpbl9baS0xXSksCi0gICAgICAgIGNvbmZpZyk7Ci0gIH0KLSAgbG9uZ2VzdF8uSW5pdChzdGFydCwgcXVhbnRfLkxvbmdlc3RCaXRzKGNvbmZpZyksIGNvdW50c1swXSk7Ci0gIHJldHVybiBzdGFydCArIExvbmdlc3Q6OlNpemUoUXVhbnQ6Okxvbmdlc3RCaXRzKGNvbmZpZyksIGNvdW50cy5iYWNrKCksIGNvdW50c1swXSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBRdWFudCwgY2xhc3MgQmhpa3NoYT4gdm9pZCBUcmllU2VhcmNoPFF1YW50LCBCaGlrc2hhPjo6SW5pdGlhbGl6ZUZyb21BUlBBKGNvbnN0IGNoYXIgKmZpbGUsIHV0aWw6OkZpbGVQaWVjZSAmZiwgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIGNvbnN0IENvbmZpZyAmY29uZmlnLCBTb3J0ZWRWb2NhYnVsYXJ5ICZ2b2NhYiwgQmluYXJ5Rm9ybWF0ICZiYWNraW5nKSB7Ci0gIHN0ZDo6c3RyaW5nIHRlbXBvcmFyeV9wcmVmaXg7Ci0gIGlmICghY29uZmlnLnRlbXBvcmFyeV9kaXJlY3RvcnlfcHJlZml4LmVtcHR5KCkpIHsKLSAgICB0ZW1wb3JhcnlfcHJlZml4ID0gY29uZmlnLnRlbXBvcmFyeV9kaXJlY3RvcnlfcHJlZml4OwotICB9IGVsc2UgaWYgKGNvbmZpZy53cml0ZV9tbWFwKSB7Ci0gICAgdGVtcG9yYXJ5X3ByZWZpeCA9IGNvbmZpZy53cml0ZV9tbWFwOwotICB9IGVsc2UgewotICAgIHRlbXBvcmFyeV9wcmVmaXggPSBmaWxlOwotICB9Ci0gIC8vIEF0IGxlYXN0IDFNQiBzb3J0aW5nIG1lbW9yeS4KLSAgU29ydGVkRmlsZXMgc29ydGVkKGNvbmZpZywgZiwgY291bnRzLCBzdGQ6Om1heDxzaXplX3Q+KGNvbmZpZy5idWlsZGluZ19tZW1vcnksIDEwNDg1NzYpLCB0ZW1wb3JhcnlfcHJlZml4LCB2b2NhYik7Ci0KLSAgQnVpbGRUcmllKHNvcnRlZCwgY291bnRzLCBjb25maWcsICp0aGlzLCBxdWFudF8sIHZvY2FiLCBiYWNraW5nKTsKLX0KLQotdGVtcGxhdGUgY2xhc3MgVHJpZVNlYXJjaDxEb250UXVhbnRpemUsIERvbnRCaGlrc2hhPjsKLXRlbXBsYXRlIGNsYXNzIFRyaWVTZWFyY2g8RG9udFF1YW50aXplLCBBcnJheUJoaWtzaGE+OwotdGVtcGxhdGUgY2xhc3MgVHJpZVNlYXJjaDxTZXBhcmF0ZWx5UXVhbnRpemUsIERvbnRCaGlrc2hhPjsKLXRlbXBsYXRlIGNsYXNzIFRyaWVTZWFyY2g8U2VwYXJhdGVseVF1YW50aXplLCBBcnJheUJoaWtzaGE+OwotCi19IC8vIG5hbWVzcGFjZSB0cmllCi19IC8vIG5hbWVzcGFjZSBuZ3JhbQotfSAvLyBuYW1lc3BhY2UgbG0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9zZWFyY2hfdHJpZS5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9zZWFyY2hfdHJpZS5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4MzhkMi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vc2VhcmNoX3RyaWUuaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotI2lmbmRlZiBMTV9TRUFSQ0hfVFJJRV9ICi0jZGVmaW5lIExNX1NFQVJDSF9UUklFX0gKLQotI2luY2x1ZGUgImxtL2NvbmZpZy5oaCIKLSNpbmNsdWRlICJsbS9tb2RlbF90eXBlLmhoIgotI2luY2x1ZGUgImxtL3JldHVybi5oaCIKLSNpbmNsdWRlICJsbS90cmllLmhoIgotI2luY2x1ZGUgImxtL3dlaWdodHMuaGgiCi0KLSNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCi0jaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotbmFtZXNwYWNlIGxtIHsKLW5hbWVzcGFjZSBuZ3JhbSB7Ci1jbGFzcyBCaW5hcnlGb3JtYXQ7Ci1jbGFzcyBTb3J0ZWRWb2NhYnVsYXJ5OwotbmFtZXNwYWNlIHRyaWUgewotCi10ZW1wbGF0ZSA8Y2xhc3MgUXVhbnQsIGNsYXNzIEJoaWtzaGE+IGNsYXNzIFRyaWVTZWFyY2g7Ci1jbGFzcyBTb3J0ZWRGaWxlczsKLXRlbXBsYXRlIDxjbGFzcyBRdWFudCwgY2xhc3MgQmhpa3NoYT4gdm9pZCBCdWlsZFRyaWUoU29ydGVkRmlsZXMgJmZpbGVzLCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3QgQ29uZmlnICZjb25maWcsIFRyaWVTZWFyY2g8UXVhbnQsIEJoaWtzaGE+ICZvdXQsIFF1YW50ICZxdWFudCwgU29ydGVkVm9jYWJ1bGFyeSAmdm9jYWIsIEJpbmFyeUZvcm1hdCAmYmFja2luZyk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBRdWFudCwgY2xhc3MgQmhpa3NoYT4gY2xhc3MgVHJpZVNlYXJjaCB7Ci0gIHB1YmxpYzoKLSAgICB0eXBlZGVmIE5vZGVSYW5nZSBOb2RlOwotCi0gICAgdHlwZWRlZiA6OmxtOjpuZ3JhbTo6dHJpZTo6VW5pZ3JhbVBvaW50ZXIgVW5pZ3JhbVBvaW50ZXI7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBRdWFudDo6TWlkZGxlUG9pbnRlciBNaWRkbGVQb2ludGVyOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgUXVhbnQ6Okxvbmdlc3RQb2ludGVyIExvbmdlc3RQb2ludGVyOwotCi0gICAgc3RhdGljIGNvbnN0IGJvb2wga0RpZmZlcmVudFJlc3QgPSBmYWxzZTsKLQotICAgIHN0YXRpYyBjb25zdCBNb2RlbFR5cGUga01vZGVsVHlwZSA9IHN0YXRpY19jYXN0PE1vZGVsVHlwZT4oVFJJRV9TT1JURUQgKyBRdWFudDo6a01vZGVsVHlwZUFkZCArIEJoaWtzaGE6OmtNb2RlbFR5cGVBZGQpOwotCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrVmVyc2lvbiA9IDE7Ci0KLSAgICBzdGF0aWMgdm9pZCBVcGRhdGVDb25maWdGcm9tQmluYXJ5KGNvbnN0IEJpbmFyeUZvcm1hdCAmZmlsZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIHVpbnQ2NF90IG9mZnNldCwgQ29uZmlnICZjb25maWcpIHsKLSAgICAgIFF1YW50OjpVcGRhdGVDb25maWdGcm9tQmluYXJ5KGZpbGUsIG9mZnNldCwgY29uZmlnKTsKLSAgICAgIC8vIEN1cnJlbnRseSB0aGUgdW5pZ3JhbSBwb2ludGVycyBhcmUgbm90IGNvbXByZXNzc2VkLCBzbyB0aGVyZSB3aWxsIG9ubHkgYmUgYSBoZWFkZXIgZm9yIG9yZGVyID4gMi4KLSAgICAgIGlmIChjb3VudHMuc2l6ZSgpID4gMikKLSAgICAgICAgQmhpa3NoYTo6VXBkYXRlQ29uZmlnRnJvbUJpbmFyeShmaWxlLCBvZmZzZXQgKyBRdWFudDo6U2l6ZShjb3VudHMuc2l6ZSgpLCBjb25maWcpICsgVW5pZ3JhbTo6U2l6ZShjb3VudHNbMF0pLCBjb25maWcpOwotICAgIH0KLQotICAgIHN0YXRpYyB1aW50NjRfdCBTaXplKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzLCBjb25zdCBDb25maWcgJmNvbmZpZykgewotICAgICAgdWludDY0X3QgcmV0ID0gUXVhbnQ6OlNpemUoY291bnRzLnNpemUoKSwgY29uZmlnKSArIFVuaWdyYW06OlNpemUoY291bnRzWzBdKTsKLSAgICAgIGZvciAodW5zaWduZWQgY2hhciBpID0gMTsgaSA8IGNvdW50cy5zaXplKCkgLSAxOyArK2kpIHsKLSAgICAgICAgcmV0ICs9IE1pZGRsZTo6U2l6ZShRdWFudDo6TWlkZGxlQml0cyhjb25maWcpLCBjb3VudHNbaV0sIGNvdW50c1swXSwgY291bnRzW2krMV0sIGNvbmZpZyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmV0ICsgTG9uZ2VzdDo6U2l6ZShRdWFudDo6TG9uZ2VzdEJpdHMoY29uZmlnKSwgY291bnRzLmJhY2soKSwgY291bnRzWzBdKTsKLSAgICB9Ci0KLSAgICBUcmllU2VhcmNoKCkgOiBtaWRkbGVfYmVnaW5fKE5VTEwpLCBtaWRkbGVfZW5kXyhOVUxMKSB7fQotCi0gICAgflRyaWVTZWFyY2goKSB7IEZyZWVNaWRkbGVzKCk7IH0KLQotICAgIHVpbnQ4X3QgKlNldHVwTWVtb3J5KHVpbnQ4X3QgKnN0YXJ0LCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3QgQ29uZmlnICZjb25maWcpOwotCi0gICAgdm9pZCBJbml0aWFsaXplRnJvbUFSUEEoY29uc3QgY2hhciAqZmlsZSwgdXRpbDo6RmlsZVBpZWNlICZmLCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3QgQ29uZmlnICZjb25maWcsIFNvcnRlZFZvY2FidWxhcnkgJnZvY2FiLCBCaW5hcnlGb3JtYXQgJmJhY2tpbmcpOwotCi0gICAgdW5zaWduZWQgY2hhciBPcmRlcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBtaWRkbGVfZW5kXyAtIG1pZGRsZV9iZWdpbl8gKyAyOwotICAgIH0KLQotICAgIFByb2JCYWNrb2ZmICZVbmtub3duVW5pZ3JhbSgpIHsgcmV0dXJuIHVuaWdyYW1fLlVua25vd24oKTsgfQotCi0gICAgVW5pZ3JhbVBvaW50ZXIgTG9va3VwVW5pZ3JhbShXb3JkSW5kZXggd29yZCwgTm9kZSAmbmV4dCwgYm9vbCAmaW5kZXBlbmRlbnRfbGVmdCwgdWludDY0X3QgJmV4dGVuZF9sZWZ0KSBjb25zdCB7Ci0gICAgICBleHRlbmRfbGVmdCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pih3b3JkKTsKLSAgICAgIFVuaWdyYW1Qb2ludGVyIHJldCh1bmlncmFtXy5GaW5kKHdvcmQsIG5leHQpKTsKLSAgICAgIGluZGVwZW5kZW50X2xlZnQgPSAobmV4dC5iZWdpbiA9PSBuZXh0LmVuZCk7Ci0gICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIE1pZGRsZVBvaW50ZXIgVW5wYWNrKHVpbnQ2NF90IGV4dGVuZF9wb2ludGVyLCB1bnNpZ25lZCBjaGFyIGV4dGVuZF9sZW5ndGgsIE5vZGUgJm5vZGUpIGNvbnN0IHsKLSAgICAgIHJldHVybiBNaWRkbGVQb2ludGVyKHF1YW50XywgZXh0ZW5kX2xlbmd0aCAtIDIsIG1pZGRsZV9iZWdpbl9bZXh0ZW5kX2xlbmd0aCAtIDJdLlJlYWRFbnRyeShleHRlbmRfcG9pbnRlciwgbm9kZSkpOwotICAgIH0KLQotICAgIE1pZGRsZVBvaW50ZXIgTG9va3VwTWlkZGxlKHVuc2lnbmVkIGNoYXIgb3JkZXJfbWludXNfMiwgV29yZEluZGV4IHdvcmQsIE5vZGUgJm5vZGUsIGJvb2wgJmluZGVwZW5kZW50X2xlZnQsIHVpbnQ2NF90ICZleHRlbmRfbGVmdCkgY29uc3QgewotICAgICAgdXRpbDo6Qml0QWRkcmVzcyBhZGRyZXNzKG1pZGRsZV9iZWdpbl9bb3JkZXJfbWludXNfMl0uRmluZCh3b3JkLCBub2RlLCBleHRlbmRfbGVmdCkpOwotICAgICAgaW5kZXBlbmRlbnRfbGVmdCA9IChhZGRyZXNzLmJhc2UgPT0gTlVMTCkgfHwgKG5vZGUuYmVnaW4gPT0gbm9kZS5lbmQpOwotICAgICAgcmV0dXJuIE1pZGRsZVBvaW50ZXIocXVhbnRfLCBvcmRlcl9taW51c18yLCBhZGRyZXNzKTsKLSAgICB9Ci0KLSAgICBMb25nZXN0UG9pbnRlciBMb29rdXBMb25nZXN0KFdvcmRJbmRleCB3b3JkLCBjb25zdCBOb2RlICZub2RlKSBjb25zdCB7Ci0gICAgICByZXR1cm4gTG9uZ2VzdFBvaW50ZXIocXVhbnRfLCBsb25nZXN0Xy5GaW5kKHdvcmQsIG5vZGUpKTsKLSAgICB9Ci0KLSAgICBib29sIEZhc3RNYWtlTm9kZShjb25zdCBXb3JkSW5kZXggKmJlZ2luLCBjb25zdCBXb3JkSW5kZXggKmVuZCwgTm9kZSAmbm9kZSkgY29uc3QgewotICAgICAgYXNzZXJ0KGJlZ2luICE9IGVuZCk7Ci0gICAgICBib29sIGluZGVwZW5kZW50X2xlZnQ7Ci0gICAgICB1aW50NjRfdCBpZ25vcmVkOwotICAgICAgTG9va3VwVW5pZ3JhbSgqYmVnaW4sIG5vZGUsIGluZGVwZW5kZW50X2xlZnQsIGlnbm9yZWQpOwotICAgICAgZm9yIChjb25zdCBXb3JkSW5kZXggKmkgPSBiZWdpbiArIDE7IGkgPCBlbmQ7ICsraSkgewotICAgICAgICBpZiAoaW5kZXBlbmRlbnRfbGVmdCB8fCAhTG9va3VwTWlkZGxlKGkgLSBiZWdpbiAtIDEsICppLCBub2RlLCBpbmRlcGVuZGVudF9sZWZ0LCBpZ25vcmVkKS5Gb3VuZCgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgdm9pZCBCdWlsZFRyaWU8UXVhbnQsIEJoaWtzaGE+KFNvcnRlZEZpbGVzICZmaWxlcywgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIGNvbnN0IENvbmZpZyAmY29uZmlnLCBUcmllU2VhcmNoPFF1YW50LCBCaGlrc2hhPiAmb3V0LCBRdWFudCAmcXVhbnQsIFNvcnRlZFZvY2FidWxhcnkgJnZvY2FiLCBCaW5hcnlGb3JtYXQgJmJhY2tpbmcpOwotCi0gICAgLy8gTWlkZGxlcyBhcmUgbWFuYWdlZCBtYW51YWxseSBzbyB3ZSBjYW4gZGVsYXkgY29uc3RydWN0aW9uIGFuZCB0aGV5IGRvbid0IGhhdmUgdG8gYmUgY29weWFibGUuCi0gICAgdm9pZCBGcmVlTWlkZGxlcygpIHsKLSAgICAgIGZvciAoY29uc3QgTWlkZGxlICppID0gbWlkZGxlX2JlZ2luXzsgaSAhPSBtaWRkbGVfZW5kXzsgKytpKSB7Ci0gICAgICAgIGktPn5NaWRkbGUoKTsKLSAgICAgIH0KLSAgICAgIHN0ZDo6ZnJlZShtaWRkbGVfYmVnaW5fKTsKLSAgICB9Ci0KLSAgICB0eXBlZGVmIHRyaWU6OkJpdFBhY2tlZE1pZGRsZTxCaGlrc2hhPiBNaWRkbGU7Ci0KLSAgICB0eXBlZGVmIHRyaWU6OkJpdFBhY2tlZExvbmdlc3QgTG9uZ2VzdDsKLSAgICBMb25nZXN0IGxvbmdlc3RfOwotCi0gICAgTWlkZGxlICptaWRkbGVfYmVnaW5fLCAqbWlkZGxlX2VuZF87Ci0gICAgUXVhbnQgcXVhbnRfOwotCi0gICAgdHlwZWRlZiA6OmxtOjpuZ3JhbTo6dHJpZTo6VW5pZ3JhbSBVbmlncmFtOwotICAgIFVuaWdyYW0gdW5pZ3JhbV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSB0cmllCi19IC8vIG5hbWVzcGFjZSBuZ3JhbQotfSAvLyBuYW1lc3BhY2UgbG0KLQotI2VuZGlmIC8vIExNX1NFQVJDSF9UUklFX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9zaXplcy5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9zaXplcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhZDU4Ni4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vc2l6ZXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jaW5jbHVkZSAibG0vc2l6ZXMuaGgiCi0jaW5jbHVkZSAibG0vbW9kZWwuaGgiCi0jaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgbmdyYW0gewotCi12b2lkIFNob3dTaXplcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3QgbG06Om5ncmFtOjpDb25maWcgJmNvbmZpZykgewotICB1aW50NjRfdCBzaXplc1s2XTsKLSAgc2l6ZXNbMF0gPSBQcm9iaW5nTW9kZWw6OlNpemUoY291bnRzLCBjb25maWcpOwotICBzaXplc1sxXSA9IFJlc3RQcm9iaW5nTW9kZWw6OlNpemUoY291bnRzLCBjb25maWcpOwotICBzaXplc1syXSA9IFRyaWVNb2RlbDo6U2l6ZShjb3VudHMsIGNvbmZpZyk7Ci0gIHNpemVzWzNdID0gUXVhbnRUcmllTW9kZWw6OlNpemUoY291bnRzLCBjb25maWcpOwotICBzaXplc1s0XSA9IEFycmF5VHJpZU1vZGVsOjpTaXplKGNvdW50cywgY29uZmlnKTsKLSAgc2l6ZXNbNV0gPSBRdWFudEFycmF5VHJpZU1vZGVsOjpTaXplKGNvdW50cywgY29uZmlnKTsKLSAgdWludDY0X3QgbWF4X2xlbmd0aCA9ICpzdGQ6Om1heF9lbGVtZW50KHNpemVzLCBzaXplcyArIHNpemVvZihzaXplcykgLyBzaXplb2YodWludDY0X3QpKTsKLSAgdWludDY0X3QgbWluX2xlbmd0aCA9ICpzdGQ6Om1pbl9lbGVtZW50KHNpemVzLCBzaXplcyArIHNpemVvZihzaXplcykgLyBzaXplb2YodWludDY0X3QpKTsKLSAgdWludDY0X3QgZGl2aWRlOwotICBjaGFyIHByZWZpeDsKLSAgaWYgKG1pbl9sZW5ndGggPCAoMSA8PCAxMCkgKiAxMCkgewotICAgIHByZWZpeCA9ICcgJzsKLSAgICBkaXZpZGUgPSAxOwotICB9IGVsc2UgaWYgKG1pbl9sZW5ndGggPCAoMSA8PCAyMCkgKiAxMCkgewotICAgIHByZWZpeCA9ICdrJzsKLSAgICBkaXZpZGUgPSAxIDw8IDEwOwotICB9IGVsc2UgaWYgKG1pbl9sZW5ndGggPCAoMVVMTCA8PCAzMCkgKiAxMCkgewotICAgIHByZWZpeCA9ICdNJzsKLSAgICBkaXZpZGUgPSAxIDw8IDIwOwotICB9IGVsc2UgewotICAgIHByZWZpeCA9ICdHJzsKLSAgICBkaXZpZGUgPSAxIDw8IDMwOwotICB9Ci0gIGxvbmcgaW50IGxlbmd0aCA9IHN0ZDo6bWF4PGxvbmcgaW50PigyLCBzdGF0aWNfY2FzdDxsb25nIGludD4oY2VpbChsb2cxMCgoZG91YmxlKSBtYXhfbGVuZ3RoIC8gZGl2aWRlKSkpKTsKLSAgc3RkOjpjZXJyIDw8ICJNZW1vcnkgZXN0aW1hdGUgZm9yIGJpbmFyeSBMTTpcbnR5cGUgICAgIjsKLQotICAvLyByaWdodCBhbGlnbiBieXRlcy4gIAotICBmb3IgKGxvbmcgaW50IGkgPSAwOyBpIDwgbGVuZ3RoIC0gMjsgKytpKSBzdGQ6OmNlcnIgPDwgJyAnOwotCi0gIHN0ZDo6Y2VyciA8PCBwcmVmaXggPDwgIkJcbiIKLSAgICAicHJvYmluZyAiIDw8IHN0ZDo6c2V0dyhsZW5ndGgpIDw8IChzaXplc1swXSAvIGRpdmlkZSkgPDwgIiBhc3N1bWluZyAtcCAiIDw8IGNvbmZpZy5wcm9iaW5nX211bHRpcGxpZXIgPDwgIlxuIgotICAgICJwcm9iaW5nICIgPDwgc3RkOjpzZXR3KGxlbmd0aCkgPDwgKHNpemVzWzFdIC8gZGl2aWRlKSA8PCAiIGFzc3VtaW5nIC1yIG1vZGVscyAtcCAiIDw8IGNvbmZpZy5wcm9iaW5nX211bHRpcGxpZXIgPDwgIlxuIgotICAgICJ0cmllICAgICIgPDwgc3RkOjpzZXR3KGxlbmd0aCkgPDwgKHNpemVzWzJdIC8gZGl2aWRlKSA8PCAiIHdpdGhvdXQgcXVhbnRpemF0aW9uXG4iCi0gICAgInRyaWUgICAgIiA8PCBzdGQ6OnNldHcobGVuZ3RoKSA8PCAoc2l6ZXNbM10gLyBkaXZpZGUpIDw8ICIgYXNzdW1pbmcgLXEgIiA8PCAodW5zaWduZWQpY29uZmlnLnByb2JfYml0cyA8PCAiIC1iICIgPDwgKHVuc2lnbmVkKWNvbmZpZy5iYWNrb2ZmX2JpdHMgPDwgIiBxdWFudGl6YXRpb24gXG4iCi0gICAgInRyaWUgICAgIiA8PCBzdGQ6OnNldHcobGVuZ3RoKSA8PCAoc2l6ZXNbNF0gLyBkaXZpZGUpIDw8ICIgYXNzdW1pbmcgLWEgIiA8PCAodW5zaWduZWQpY29uZmlnLnBvaW50ZXJfYmhpa3NoYV9iaXRzIDw8ICIgYXJyYXkgcG9pbnRlciBjb21wcmVzc2lvblxuIgotICAgICJ0cmllICAgICIgPDwgc3RkOjpzZXR3KGxlbmd0aCkgPDwgKHNpemVzWzVdIC8gZGl2aWRlKSA8PCAiIGFzc3VtaW5nIC1hICIgPDwgKHVuc2lnbmVkKWNvbmZpZy5wb2ludGVyX2JoaWtzaGFfYml0cyA8PCAiIC1xICIgPDwgKHVuc2lnbmVkKWNvbmZpZy5wcm9iX2JpdHMgPDwgIiAtYiAiIDw8ICh1bnNpZ25lZCljb25maWcuYmFja29mZl9iaXRzPDwgIiBhcnJheSBwb2ludGVyIGNvbXByZXNzaW9uIGFuZCBxdWFudGl6YXRpb25cbiI7Ci19Ci0KLXZvaWQgU2hvd1NpemVzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzKSB7Ci0gIGxtOjpuZ3JhbTo6Q29uZmlnIGNvbmZpZzsKLSAgU2hvd1NpemVzKGNvdW50cywgY29uZmlnKTsKLX0KLQotdm9pZCBTaG93U2l6ZXMoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgbG06Om5ncmFtOjpDb25maWcgJmNvbmZpZykgewotICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRzOwotICB1dGlsOjpGaWxlUGllY2UgZihmaWxlKTsKLSAgbG06OlJlYWRBUlBBQ291bnRzKGYsIGNvdW50cyk7Ci0gIFNob3dTaXplcyhjb3VudHMsIGNvbmZpZyk7Ci19Ci0KLX19IC8vbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3N0YXRlLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3N0YXRlLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmM1MWQ2Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9zdGF0ZS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0jaWZuZGVmIExNX1NUQVRFX0gKLSNkZWZpbmUgTE1fU1RBVEVfSAotCi0jaW5jbHVkZSAibG0vbWF4X29yZGVyLmhoIgotI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCi0jaW5jbHVkZSAidXRpbC9tdXJtdXJfaGFzaC5oaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1uYW1lc3BhY2UgbG0gewotbmFtZXNwYWNlIG5ncmFtIHsKLQotLy8gVGhpcyBpcyBhIFBPRCBidXQgaWYgeW91IHdhbnQgbWVtY21wIHRvIHJldHVybiB0aGUgc2FtZSBhcyBvcGVyYXRvcj09LCBjYWxsCi0vLyBaZXJvUmVtYWluaW5nIGZpcnN0LiAgICAKLWNsYXNzIFN0YXRlIHsKLSAgcHVibGljOgotICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdGF0ZSAmb3RoZXIpIGNvbnN0IHsKLSAgICAgIGlmIChsZW5ndGggIT0gb3RoZXIubGVuZ3RoKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gIW1lbWNtcCh3b3Jkcywgb3RoZXIud29yZHMsIGxlbmd0aCAqIHNpemVvZihXb3JkSW5kZXgpKTsKLSAgICB9Ci0KLSAgICAvLyBUaHJlZSB3YXkgY29tcGFyaXNvbiBmdW5jdGlvbi4gIAotICAgIGludCBDb21wYXJlKGNvbnN0IFN0YXRlICZvdGhlcikgY29uc3QgewotICAgICAgaWYgKGxlbmd0aCAhPSBvdGhlci5sZW5ndGgpIHJldHVybiBsZW5ndGggPCBvdGhlci5sZW5ndGggPyAtMSA6IDE7Ci0gICAgICByZXR1cm4gbWVtY21wKHdvcmRzLCBvdGhlci53b3JkcywgbGVuZ3RoICogc2l6ZW9mKFdvcmRJbmRleCkpOwotICAgIH0KLQotICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN0YXRlICZvdGhlcikgY29uc3QgewotICAgICAgaWYgKGxlbmd0aCAhPSBvdGhlci5sZW5ndGgpIHJldHVybiBsZW5ndGggPCBvdGhlci5sZW5ndGg7Ci0gICAgICByZXR1cm4gbWVtY21wKHdvcmRzLCBvdGhlci53b3JkcywgbGVuZ3RoICogc2l6ZW9mKFdvcmRJbmRleCkpIDwgMDsKLSAgICB9Ci0KLSAgICAvLyBDYWxsIHRoaXMgYmVmb3JlIHVzaW5nIHJhdyBtZW1jbXAuICAKLSAgICB2b2lkIFplcm9SZW1haW5pbmcoKSB7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGNoYXIgaSA9IGxlbmd0aDsgaSA8IEtFTkxNX01BWF9PUkRFUiAtIDE7ICsraSkgewotICAgICAgICB3b3Jkc1tpXSA9IDA7Ci0gICAgICAgIGJhY2tvZmZbaV0gPSAwLjA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdW5zaWduZWQgY2hhciBMZW5ndGgoKSBjb25zdCB7IHJldHVybiBsZW5ndGg7IH0KLQotICAgIC8vIFlvdSBzaG91bGRuJ3QgbmVlZCB0byB0b3VjaCBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUsIGJ1dCB0aGUgbWVtYmVycyBhcmUgcHVibGljIHNvIEZ1bGxTdGF0ZSB3aWxsIHF1YWxpZnkgYXMgYSBQT0QuICAKLSAgICAvLyBUaGlzIG9yZGVyIG1pbmltaXplcyB0b3RhbCBzaXplIG9mIHRoZSBzdHJ1Y3QgaWYgV29yZEluZGV4IGlzIDY0IGJpdCwgZmxvYXQgaXMgMzIgYml0LCBhbmQgYWxpZ25tZW50IG9mIDY0IGJpdCBpbnRlZ2VycyBpcyA2NCBiaXQuICAKLSAgICBXb3JkSW5kZXggd29yZHNbS0VOTE1fTUFYX09SREVSIC0gMV07Ci0gICAgZmxvYXQgYmFja29mZltLRU5MTV9NQVhfT1JERVIgLSAxXTsKLSAgICB1bnNpZ25lZCBjaGFyIGxlbmd0aDsKLX07Ci0KLXR5cGVkZWYgU3RhdGUgUmlnaHQ7Ci0KLWlubGluZSB1aW50NjRfdCBoYXNoX3ZhbHVlKGNvbnN0IFN0YXRlICZzdGF0ZSwgdWludDY0X3Qgc2VlZCA9IDApIHsKLSAgcmV0dXJuIHV0aWw6Ok11cm11ckhhc2hOYXRpdmUoc3RhdGUud29yZHMsIHNpemVvZihXb3JkSW5kZXgpICogc3RhdGUubGVuZ3RoLCBzZWVkKTsKLX0KLQotc3RydWN0IExlZnQgewotICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGVmdCAmb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gCi0gICAgICBsZW5ndGggPT0gb3RoZXIubGVuZ3RoICYmCi0gICAgICAoIWxlbmd0aCB8fCAocG9pbnRlcnNbbGVuZ3RoIC0gMV0gPT0gb3RoZXIucG9pbnRlcnNbbGVuZ3RoIC0gMV0gJiYgZnVsbCA9PSBvdGhlci5mdWxsKSk7Ci0gIH0KLQotICBpbnQgQ29tcGFyZShjb25zdCBMZWZ0ICZvdGhlcikgY29uc3QgewotICAgIGlmIChsZW5ndGggPCBvdGhlci5sZW5ndGgpIHJldHVybiAtMTsKLSAgICBpZiAobGVuZ3RoID4gb3RoZXIubGVuZ3RoKSByZXR1cm4gMTsKLSAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiAwOyAvLyBNdXN0IGJlIGZ1bGwuCi0gICAgaWYgKHBvaW50ZXJzW2xlbmd0aCAtIDFdID4gb3RoZXIucG9pbnRlcnNbbGVuZ3RoIC0gMV0pIHJldHVybiAxOwotICAgIGlmIChwb2ludGVyc1tsZW5ndGggLSAxXSA8IG90aGVyLnBvaW50ZXJzW2xlbmd0aCAtIDFdKSByZXR1cm4gLTE7Ci0gICAgcmV0dXJuIChpbnQpZnVsbCAtIChpbnQpb3RoZXIuZnVsbDsKLSAgfQotCi0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExlZnQgJm90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIENvbXBhcmUob3RoZXIpID09IC0xOwotICB9Ci0KLSAgdm9pZCBaZXJvUmVtYWluaW5nKCkgewotICAgIGZvciAodWludDY0X3QgKiBpID0gcG9pbnRlcnMgKyBsZW5ndGg7IGkgPCBwb2ludGVycyArIEtFTkxNX01BWF9PUkRFUiAtIDE7ICsraSkKLSAgICAgICppID0gMDsKLSAgfQotCi0gIHVpbnQ2NF90IHBvaW50ZXJzW0tFTkxNX01BWF9PUkRFUiAtIDFdOwotICB1bnNpZ25lZCBjaGFyIGxlbmd0aDsKLSAgYm9vbCBmdWxsOwotfTsKLQotaW5saW5lIHVpbnQ2NF90IGhhc2hfdmFsdWUoY29uc3QgTGVmdCAmbGVmdCkgewotICB1bnNpZ25lZCBjaGFyIGFkZFsyXTsKLSAgYWRkWzBdID0gbGVmdC5sZW5ndGg7Ci0gIGFkZFsxXSA9IGxlZnQuZnVsbDsKLSAgcmV0dXJuIHV0aWw6Ok11cm11ckhhc2hOYXRpdmUoYWRkLCAyLCBsZWZ0Lmxlbmd0aCA/IGxlZnQucG9pbnRlcnNbbGVmdC5sZW5ndGggLSAxXSA6IDApOwotfQotCi1zdHJ1Y3QgQ2hhcnRTdGF0ZSB7Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDaGFydFN0YXRlICZvdGhlcikgY29uc3QgewotICAgIHJldHVybiAocmlnaHQgPT0gb3RoZXIucmlnaHQpICYmIChsZWZ0ID09IG90aGVyLmxlZnQpOwotICB9Ci0KLSAgaW50IENvbXBhcmUoY29uc3QgQ2hhcnRTdGF0ZSAmb3RoZXIpIGNvbnN0IHsKLSAgICBpbnQgbHJlcyA9IGxlZnQuQ29tcGFyZShvdGhlci5sZWZ0KTsKLSAgICBpZiAobHJlcykgcmV0dXJuIGxyZXM7Ci0gICAgcmV0dXJuIHJpZ2h0LkNvbXBhcmUob3RoZXIucmlnaHQpOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ2hhcnRTdGF0ZSAmb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gQ29tcGFyZShvdGhlcikgPCAwOwotICB9Ci0KLSAgdm9pZCBaZXJvUmVtYWluaW5nKCkgewotICAgIGxlZnQuWmVyb1JlbWFpbmluZygpOwotICAgIHJpZ2h0Llplcm9SZW1haW5pbmcoKTsKLSAgfQotCi0gIExlZnQgbGVmdDsKLSAgU3RhdGUgcmlnaHQ7Ci19OwotCi1pbmxpbmUgdWludDY0X3QgaGFzaF92YWx1ZShjb25zdCBDaGFydFN0YXRlICZzdGF0ZSkgewotICByZXR1cm4gaGFzaF92YWx1ZShzdGF0ZS5yaWdodCwgaGFzaF92YWx1ZShzdGF0ZS5sZWZ0KSk7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgbmdyYW0KLX0gLy8gbmFtZXNwYWNlIGxtCi0KLSNlbmRpZiAvLyBMTV9TVEFURV9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vdHJpZS5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS90cmllLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhlN2NlLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS90cmllLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLSNpbmNsdWRlICJsbS90cmllLmhoIgotCi0jaW5jbHVkZSAibG0vYmhpa3NoYS5oaCIKLSNpbmNsdWRlICJ1dGlsL2JpdF9wYWNraW5nLmhoIgotI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgotI2luY2x1ZGUgInV0aWwvc29ydGVkX3VuaWZvcm0uaGgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotbmFtZXNwYWNlIGxtIHsKLW5hbWVzcGFjZSBuZ3JhbSB7Ci1uYW1lc3BhY2UgdHJpZSB7Ci1uYW1lc3BhY2UgewotCi1jbGFzcyBLZXlBY2Nlc3NvciB7Ci0gIHB1YmxpYzoKLSAgICBLZXlBY2Nlc3Nvcihjb25zdCB2b2lkICpiYXNlLCB1aW50NjRfdCBrZXlfbWFzaywgdWludDhfdCBrZXlfYml0cywgdWludDhfdCB0b3RhbF9iaXRzKSAKLSAgICAgIDogYmFzZV8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYmFzZSkpLCBrZXlfbWFza18oa2V5X21hc2spLCBrZXlfYml0c18oa2V5X2JpdHMpLCB0b3RhbF9iaXRzXyh0b3RhbF9iaXRzKSB7fQotCi0gICAgdHlwZWRlZiB1aW50NjRfdCBLZXk7Ci0KLSAgICBLZXkgb3BlcmF0b3IoKSh1aW50NjRfdCBpbmRleCkgY29uc3QgewotICAgICAgcmV0dXJuIHV0aWw6OlJlYWRJbnQ1NyhiYXNlXywgaW5kZXggKiBzdGF0aWNfY2FzdDx1aW50NjRfdD4odG90YWxfYml0c18pLCBrZXlfYml0c18sIGtleV9tYXNrXyk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgdWludDhfdCAqY29uc3QgYmFzZV87Ci0gICAgY29uc3QgV29yZEluZGV4IGtleV9tYXNrXzsKLSAgICBjb25zdCB1aW50OF90IGtleV9iaXRzXywgdG90YWxfYml0c187Ci19OwotCi1ib29sIEZpbmRCaXRQYWNrZWQoY29uc3Qgdm9pZCAqYmFzZSwgdWludDY0X3Qga2V5X21hc2ssIHVpbnQ4X3Qga2V5X2JpdHMsIHVpbnQ4X3QgdG90YWxfYml0cywgdWludDY0X3QgYmVnaW5faW5kZXgsIHVpbnQ2NF90IGVuZF9pbmRleCwgY29uc3QgdWludDY0X3QgbWF4X3ZvY2FiLCBjb25zdCB1aW50NjRfdCBrZXksIHVpbnQ2NF90ICZhdF9pbmRleCkgewotICBLZXlBY2Nlc3NvciBhY2Nlc3NvcihiYXNlLCBrZXlfbWFzaywga2V5X2JpdHMsIHRvdGFsX2JpdHMpOwotICBpZiAoIXV0aWw6OkJvdW5kZWRTb3J0ZWRVbmlmb3JtRmluZDx1aW50NjRfdCwgS2V5QWNjZXNzb3IsIHV0aWw6OlBpdm90U2VsZWN0PHNpemVvZihXb3JkSW5kZXgpPjo6VD4oYWNjZXNzb3IsIGJlZ2luX2luZGV4IC0gMSwgKHVpbnQ2NF90KTAsIGVuZF9pbmRleCwgbWF4X3ZvY2FiLCBrZXksIGF0X2luZGV4KSkgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLX0gLy8gbmFtZXNwYWNlCi0KLXVpbnQ2NF90IEJpdFBhY2tlZDo6QmFzZVNpemUodWludDY0X3QgZW50cmllcywgdWludDY0X3QgbWF4X3ZvY2FiLCB1aW50OF90IHJlbWFpbmluZ19iaXRzKSB7Ci0gIHVpbnQ4X3QgdG90YWxfYml0cyA9IHV0aWw6OlJlcXVpcmVkQml0cyhtYXhfdm9jYWIpICsgcmVtYWluaW5nX2JpdHM7Ci0gIC8vIEV4dHJhIGVudHJ5IGZvciBuZXh0IHBvaW50ZXIgYXQgdGhlIGVuZC4gIAotICAvLyArNyB0aGVuIC8gOCB0byByb3VuZCB1cCBiaXRzIGFuZCBjb252ZXJ0IHRvIGJ5dGVzCi0gIC8vICtzaXplb2YodWludDY0X3QpIHNvIHRoYXQgUmVhZEludDU3IGV0YyBkb24ndCBnbyBzZWdmYXVsdC4gIAotICAvLyBOb3RlIHRoYXQgdGhpcyB3YXN0ZSBpcyBPKG9yZGVyKSwgbm90IE8obnVtYmVyIG9mIG5ncmFtcykuCi0gIHJldHVybiAoKDEgKyBlbnRyaWVzKSAqIHRvdGFsX2JpdHMgKyA3KSAvIDggKyBzaXplb2YodWludDY0X3QpOwotfQotCi12b2lkIEJpdFBhY2tlZDo6QmFzZUluaXQodm9pZCAqYmFzZSwgdWludDY0X3QgbWF4X3ZvY2FiLCB1aW50OF90IHJlbWFpbmluZ19iaXRzKSB7Ci0gIHV0aWw6OkJpdFBhY2tpbmdTYW5pdHkoKTsKLSAgd29yZF9iaXRzXyA9IHV0aWw6OlJlcXVpcmVkQml0cyhtYXhfdm9jYWIpOwotICB3b3JkX21hc2tfID0gKDFVTEwgPDwgd29yZF9iaXRzXykgLSAxVUxMOwotICBpZiAod29yZF9iaXRzXyA+IDU3KSBVVElMX1RIUk9XKHV0aWw6OkV4Y2VwdGlvbiwgIlNvcnJ5LCB3b3JkIGluZGljZXMgbW9yZSB0aGFuICIgPDwgKDFVTEwgPDwgNTcpIDw8ICIgYXJlIG5vdCBpbXBsZW1lbnRlZC4gIEVkaXQgdXRpbC9iaXRfcGFja2luZy5oaCBhbmQgZml4IHRoZSBiaXQgcGFja2luZyBmdW5jdGlvbnMuIik7Ci0gIHRvdGFsX2JpdHNfID0gd29yZF9iaXRzXyArIHJlbWFpbmluZ19iaXRzOwotCi0gIGJhc2VfID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJhc2UpOwotICBpbnNlcnRfaW5kZXhfID0gMDsKLSAgbWF4X3ZvY2FiXyA9IG1heF92b2NhYjsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIEJoaWtzaGE+IHVpbnQ2NF90IEJpdFBhY2tlZE1pZGRsZTxCaGlrc2hhPjo6U2l6ZSh1aW50OF90IHF1YW50X2JpdHMsIHVpbnQ2NF90IGVudHJpZXMsIHVpbnQ2NF90IG1heF92b2NhYiwgdWludDY0X3QgbWF4X3B0ciwgY29uc3QgQ29uZmlnICZjb25maWcpIHsKLSAgcmV0dXJuIEJoaWtzaGE6OlNpemUoZW50cmllcyArIDEsIG1heF9wdHIsIGNvbmZpZykgKyBCYXNlU2l6ZShlbnRyaWVzLCBtYXhfdm9jYWIsIHF1YW50X2JpdHMgKyBCaGlrc2hhOjpJbmxpbmVCaXRzKGVudHJpZXMgKyAxLCBtYXhfcHRyLCBjb25maWcpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIEJoaWtzaGE+IEJpdFBhY2tlZE1pZGRsZTxCaGlrc2hhPjo6Qml0UGFja2VkTWlkZGxlKHZvaWQgKmJhc2UsIHVpbnQ4X3QgcXVhbnRfYml0cywgdWludDY0X3QgZW50cmllcywgdWludDY0X3QgbWF4X3ZvY2FiLCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQml0UGFja2VkICZuZXh0X3NvdXJjZSwgY29uc3QgQ29uZmlnICZjb25maWcpIDoKLSAgQml0UGFja2VkKCksCi0gIHF1YW50X2JpdHNfKHF1YW50X2JpdHMpLAotICAvLyBJZiB0aGUgb2Zmc2V0IG9mIHRoZSBtZXRob2QgY2hhbmdlcywgYWxzbyBjaGFuZ2UgVHJpZVNlYXJjaDo6VXBkYXRlQ29uZmlnRnJvbUJpbmFyeS4KLSAgYmhpa3NoYV8oYmFzZSwgZW50cmllcyArIDEsIG1heF9uZXh0LCBjb25maWcpLAotICBuZXh0X3NvdXJjZV8oJm5leHRfc291cmNlKSB7Ci0gIGlmIChlbnRyaWVzICsgMSA+PSAoMVVMTCA8PCA1NykgfHwgKG1heF9uZXh0ID49ICgxVUxMIDw8IDU3KSkpICBVVElMX1RIUk9XKHV0aWw6OkV4Y2VwdGlvbiwgIlNvcnJ5LCB0aGlzIGRvZXMgbm90IHN1cHBvcnQgbW9yZSB0aGFuICIgPDwgKDFVTEwgPDwgNTcpIDw8ICIgbi1ncmFtcyBvZiBhIHBhcnRpY3VsYXIgb3JkZXIuICBFZGl0IHV0aWwvYml0X3BhY2tpbmcuaGggYW5kIGZpeCB0aGUgYml0IHBhY2tpbmcgZnVuY3Rpb25zLiIpOwotICBCYXNlSW5pdChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihiYXNlKSArIEJoaWtzaGE6OlNpemUoZW50cmllcyArIDEsIG1heF9uZXh0LCBjb25maWcpLCBtYXhfdm9jYWIsIHF1YW50X2JpdHNfICsgYmhpa3NoYV8uSW5saW5lQml0cygpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIEJoaWtzaGE+IHV0aWw6OkJpdEFkZHJlc3MgQml0UGFja2VkTWlkZGxlPEJoaWtzaGE+OjpJbnNlcnQoV29yZEluZGV4IHdvcmQpIHsKLSAgYXNzZXJ0KHdvcmQgPD0gd29yZF9tYXNrXyk7Ci0gIHVpbnQ2NF90IGF0X3BvaW50ZXIgPSBpbnNlcnRfaW5kZXhfICogdG90YWxfYml0c187Ci0KLSAgdXRpbDo6V3JpdGVJbnQ1NyhiYXNlXywgYXRfcG9pbnRlciwgd29yZF9iaXRzXywgd29yZCk7Ci0gIGF0X3BvaW50ZXIgKz0gd29yZF9iaXRzXzsKLSAgdXRpbDo6Qml0QWRkcmVzcyByZXQoYmFzZV8sIGF0X3BvaW50ZXIpOwotICBhdF9wb2ludGVyICs9IHF1YW50X2JpdHNfOwotICB1aW50NjRfdCBuZXh0ID0gbmV4dF9zb3VyY2VfLT5JbnNlcnRJbmRleCgpOwotICBiaGlrc2hhXy5Xcml0ZU5leHQoYmFzZV8sIGF0X3BvaW50ZXIsIGluc2VydF9pbmRleF8sIG5leHQpOwotICArK2luc2VydF9pbmRleF87Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBCaGlrc2hhPiB1dGlsOjpCaXRBZGRyZXNzIEJpdFBhY2tlZE1pZGRsZTxCaGlrc2hhPjo6RmluZChXb3JkSW5kZXggd29yZCwgTm9kZVJhbmdlICZyYW5nZSwgdWludDY0X3QgJnBvaW50ZXIpIGNvbnN0IHsKLSAgdWludDY0X3QgYXRfcG9pbnRlcjsKLSAgaWYgKCFGaW5kQml0UGFja2VkKGJhc2VfLCB3b3JkX21hc2tfLCB3b3JkX2JpdHNfLCB0b3RhbF9iaXRzXywgcmFuZ2UuYmVnaW4sIHJhbmdlLmVuZCwgbWF4X3ZvY2FiXywgd29yZCwgYXRfcG9pbnRlcikpIHsKLSAgICByZXR1cm4gdXRpbDo6Qml0QWRkcmVzcyhOVUxMLCAwKTsKLSAgfQotICBwb2ludGVyID0gYXRfcG9pbnRlcjsKLSAgYXRfcG9pbnRlciAqPSB0b3RhbF9iaXRzXzsKLSAgYXRfcG9pbnRlciArPSB3b3JkX2JpdHNfOwotICBiaGlrc2hhXy5SZWFkTmV4dChiYXNlXywgYXRfcG9pbnRlciArIHF1YW50X2JpdHNfLCBwb2ludGVyLCB0b3RhbF9iaXRzXywgcmFuZ2UpOwotCi0gIHJldHVybiB1dGlsOjpCaXRBZGRyZXNzKGJhc2VfLCBhdF9wb2ludGVyKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIEJoaWtzaGE+IHZvaWQgQml0UGFja2VkTWlkZGxlPEJoaWtzaGE+OjpGaW5pc2hlZExvYWRpbmcodWludDY0X3QgbmV4dF9lbmQsIGNvbnN0IENvbmZpZyAmY29uZmlnKSB7Ci0gIC8vIFdyaXRlIGF0IGluc2VydF9pbmRleC4gLiAuCi0gIHVpbnQ2NF90IGxhc3RfbmV4dF93cml0ZSA9IGluc2VydF9pbmRleF8gKiB0b3RhbF9iaXRzXyArIAotICAgIC8vIGF0IHRoZSBvZmZzZXQgd2hlcmUgdGhlIG5leHQgcG9pbnRlcnMgYXJlIHN0b3JlZC4KLSAgICAodG90YWxfYml0c18gLSBiaGlrc2hhXy5JbmxpbmVCaXRzKCkpOwotICBiaGlrc2hhXy5Xcml0ZU5leHQoYmFzZV8sIGxhc3RfbmV4dF93cml0ZSwgaW5zZXJ0X2luZGV4XywgbmV4dF9lbmQpOwotICBiaGlrc2hhXy5GaW5pc2hlZExvYWRpbmcoY29uZmlnKTsKLX0KLQotdXRpbDo6Qml0QWRkcmVzcyBCaXRQYWNrZWRMb25nZXN0OjpJbnNlcnQoV29yZEluZGV4IGluZGV4KSB7Ci0gIGFzc2VydChpbmRleCA8PSB3b3JkX21hc2tfKTsKLSAgdWludDY0X3QgYXRfcG9pbnRlciA9IGluc2VydF9pbmRleF8gKiB0b3RhbF9iaXRzXzsKLSAgdXRpbDo6V3JpdGVJbnQ1NyhiYXNlXywgYXRfcG9pbnRlciwgd29yZF9iaXRzXywgaW5kZXgpOwotICBhdF9wb2ludGVyICs9IHdvcmRfYml0c187Ci0gICsraW5zZXJ0X2luZGV4XzsKLSAgcmV0dXJuIHV0aWw6OkJpdEFkZHJlc3MoYmFzZV8sIGF0X3BvaW50ZXIpOwotfQotCi11dGlsOjpCaXRBZGRyZXNzIEJpdFBhY2tlZExvbmdlc3Q6OkZpbmQoV29yZEluZGV4IHdvcmQsIGNvbnN0IE5vZGVSYW5nZSAmcmFuZ2UpIGNvbnN0IHsKLSAgdWludDY0X3QgYXRfcG9pbnRlcjsKLSAgaWYgKCFGaW5kQml0UGFja2VkKGJhc2VfLCB3b3JkX21hc2tfLCB3b3JkX2JpdHNfLCB0b3RhbF9iaXRzXywgcmFuZ2UuYmVnaW4sIHJhbmdlLmVuZCwgbWF4X3ZvY2FiXywgd29yZCwgYXRfcG9pbnRlcikpIHJldHVybiB1dGlsOjpCaXRBZGRyZXNzKE5VTEwsIDApOwotICBhdF9wb2ludGVyID0gYXRfcG9pbnRlciAqIHRvdGFsX2JpdHNfICsgd29yZF9iaXRzXzsKLSAgcmV0dXJuIHV0aWw6OkJpdEFkZHJlc3MoYmFzZV8sIGF0X3BvaW50ZXIpOwotfQotCi10ZW1wbGF0ZSBjbGFzcyBCaXRQYWNrZWRNaWRkbGU8RG9udEJoaWtzaGE+OwotdGVtcGxhdGUgY2xhc3MgQml0UGFja2VkTWlkZGxlPEFycmF5Qmhpa3NoYT47Ci0KLX0gLy8gbmFtZXNwYWNlIHRyaWUKLX0gLy8gbmFtZXNwYWNlIG5ncmFtCi19IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3RyaWUuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vdHJpZS5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzOTI5OC4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vdHJpZS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0jaWZuZGVmIExNX1RSSUVfSAotI2RlZmluZSBMTV9UUklFX0gKLQotI2luY2x1ZGUgImxtL3dlaWdodHMuaGgiCi0jaW5jbHVkZSAibG0vd29yZF9pbmRleC5oaCIKLSNpbmNsdWRlICJ1dGlsL2JpdF9wYWNraW5nLmhoIgotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgbG0gewotbmFtZXNwYWNlIG5ncmFtIHsKLXN0cnVjdCBDb25maWc7Ci1uYW1lc3BhY2UgdHJpZSB7Ci0KLXN0cnVjdCBOb2RlUmFuZ2UgewotICB1aW50NjRfdCBiZWdpbiwgZW5kOwotfTsKLQotLy8gVE9ETzogaWYgdGhlIG51bWJlciBvZiB1bmlncmFtcyBpcyBhIGNvbmNlcm4sIGFsc28gYml0IHBhY2sgdGhlc2UgcmVjb3Jkcy4gIAotc3RydWN0IFVuaWdyYW1WYWx1ZSB7Ci0gIFByb2JCYWNrb2ZmIHdlaWdodHM7Ci0gIHVpbnQ2NF90IG5leHQ7Ci0gIHVpbnQ2NF90IE5leHQoKSBjb25zdCB7IHJldHVybiBuZXh0OyB9Ci19OwotCi1jbGFzcyBVbmlncmFtUG9pbnRlciB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBVbmlncmFtUG9pbnRlcihjb25zdCBQcm9iQmFja29mZiAmdG8pIDogdG9fKCZ0bykge30KLQotICAgIFVuaWdyYW1Qb2ludGVyKCkgOiB0b18oTlVMTCkge30KLQotICAgIGJvb2wgRm91bmQoKSBjb25zdCB7IHJldHVybiB0b18gIT0gTlVMTDsgfQotCi0gICAgZmxvYXQgUHJvYigpIGNvbnN0IHsgcmV0dXJuIHRvXy0+cHJvYjsgfQotICAgIGZsb2F0IEJhY2tvZmYoKSBjb25zdCB7IHJldHVybiB0b18tPmJhY2tvZmY7IH0KLSAgICBmbG9hdCBSZXN0KCkgY29uc3QgeyByZXR1cm4gUHJvYigpOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBQcm9iQmFja29mZiAqdG9fOwotfTsKLQotY2xhc3MgVW5pZ3JhbSB7Ci0gIHB1YmxpYzoKLSAgICBVbmlncmFtKCkge30KLSAgICAKLSAgICB2b2lkIEluaXQodm9pZCAqc3RhcnQpIHsKLSAgICAgIHVuaWdyYW1fID0gc3RhdGljX2Nhc3Q8VW5pZ3JhbVZhbHVlKj4oc3RhcnQpOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdWludDY0X3QgU2l6ZSh1aW50NjRfdCBjb3VudCkgewotICAgICAgLy8gKzEgaW4gY2FzZSB1bmtub3duIGRvZXNuJ3QgYXBwZWFyLiAgKzEgZm9yIHRoZSBmaW5hbCBuZXh0LiAgCi0gICAgICByZXR1cm4gKGNvdW50ICsgMikgKiBzaXplb2YoVW5pZ3JhbVZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgY29uc3QgUHJvYkJhY2tvZmYgJkxvb2t1cChXb3JkSW5kZXggaW5kZXgpIGNvbnN0IHsgcmV0dXJuIHVuaWdyYW1fW2luZGV4XS53ZWlnaHRzOyB9Ci0gICAgCi0gICAgUHJvYkJhY2tvZmYgJlVua25vd24oKSB7IHJldHVybiB1bmlncmFtX1swXS53ZWlnaHRzOyB9Ci0KLSAgICBVbmlncmFtVmFsdWUgKlJhdygpIHsKLSAgICAgIHJldHVybiB1bmlncmFtXzsKLSAgICB9Ci0gICAgCi0gICAgVW5pZ3JhbVBvaW50ZXIgRmluZChXb3JkSW5kZXggd29yZCwgTm9kZVJhbmdlICZuZXh0KSBjb25zdCB7Ci0gICAgICBVbmlncmFtVmFsdWUgKnZhbCA9IHVuaWdyYW1fICsgd29yZDsKLSAgICAgIG5leHQuYmVnaW4gPSB2YWwtPm5leHQ7Ci0gICAgICBuZXh0LmVuZCA9ICh2YWwrMSktPm5leHQ7Ci0gICAgICByZXR1cm4gVW5pZ3JhbVBvaW50ZXIodmFsLT53ZWlnaHRzKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBVbmlncmFtVmFsdWUgKnVuaWdyYW1fOwotfTsgIAotCi1jbGFzcyBCaXRQYWNrZWQgewotICBwdWJsaWM6Ci0gICAgQml0UGFja2VkKCkge30KLQotICAgIHVpbnQ2NF90IEluc2VydEluZGV4KCkgY29uc3QgewotICAgICAgcmV0dXJuIGluc2VydF9pbmRleF87Ci0gICAgfQotCi0gIHByb3RlY3RlZDoKLSAgICBzdGF0aWMgdWludDY0X3QgQmFzZVNpemUodWludDY0X3QgZW50cmllcywgdWludDY0X3QgbWF4X3ZvY2FiLCB1aW50OF90IHJlbWFpbmluZ19iaXRzKTsKLQotICAgIHZvaWQgQmFzZUluaXQodm9pZCAqYmFzZSwgdWludDY0X3QgbWF4X3ZvY2FiLCB1aW50OF90IHJlbWFpbmluZ19iaXRzKTsKLQotICAgIHVpbnQ4X3Qgd29yZF9iaXRzXzsKLSAgICB1aW50OF90IHRvdGFsX2JpdHNfOwotICAgIHVpbnQ2NF90IHdvcmRfbWFza187Ci0KLSAgICB1aW50OF90ICpiYXNlXzsKLQotICAgIHVpbnQ2NF90IGluc2VydF9pbmRleF8sIG1heF92b2NhYl87Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgQmhpa3NoYT4gY2xhc3MgQml0UGFja2VkTWlkZGxlIDogcHVibGljIEJpdFBhY2tlZCB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgdWludDY0X3QgU2l6ZSh1aW50OF90IHF1YW50X2JpdHMsIHVpbnQ2NF90IGVudHJpZXMsIHVpbnQ2NF90IG1heF92b2NhYiwgdWludDY0X3QgbWF4X25leHQsIGNvbnN0IENvbmZpZyAmY29uZmlnKTsKLQotICAgIC8vIG5leHRfc291cmNlIG5lZWQgbm90IGJlIGluaXRpYWxpemVkLiAgCi0gICAgQml0UGFja2VkTWlkZGxlKHZvaWQgKmJhc2UsIHVpbnQ4X3QgcXVhbnRfYml0cywgdWludDY0X3QgZW50cmllcywgdWludDY0X3QgbWF4X3ZvY2FiLCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQml0UGFja2VkICZuZXh0X3NvdXJjZSwgY29uc3QgQ29uZmlnICZjb25maWcpOwotCi0gICAgdXRpbDo6Qml0QWRkcmVzcyBJbnNlcnQoV29yZEluZGV4IHdvcmQpOwotCi0gICAgdm9pZCBGaW5pc2hlZExvYWRpbmcodWludDY0X3QgbmV4dF9lbmQsIGNvbnN0IENvbmZpZyAmY29uZmlnKTsKLQotICAgIHV0aWw6OkJpdEFkZHJlc3MgRmluZChXb3JkSW5kZXggd29yZCwgTm9kZVJhbmdlICZyYW5nZSwgdWludDY0X3QgJnBvaW50ZXIpIGNvbnN0OwotCi0gICAgdXRpbDo6Qml0QWRkcmVzcyBSZWFkRW50cnkodWludDY0X3QgcG9pbnRlciwgTm9kZVJhbmdlICZyYW5nZSkgewotICAgICAgdWludDY0X3QgYWRkciA9IHBvaW50ZXIgKiB0b3RhbF9iaXRzXzsKLSAgICAgIGFkZHIgKz0gd29yZF9iaXRzXzsKLSAgICAgIGJoaWtzaGFfLlJlYWROZXh0KGJhc2VfLCBhZGRyICsgcXVhbnRfYml0c18sIHBvaW50ZXIsIHRvdGFsX2JpdHNfLCByYW5nZSk7Ci0gICAgICByZXR1cm4gdXRpbDo6Qml0QWRkcmVzcyhiYXNlXywgYWRkcik7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgdWludDhfdCBxdWFudF9iaXRzXzsKLSAgICBCaGlrc2hhIGJoaWtzaGFfOwotCi0gICAgY29uc3QgQml0UGFja2VkICpuZXh0X3NvdXJjZV87Ci19OwotCi1jbGFzcyBCaXRQYWNrZWRMb25nZXN0IDogcHVibGljIEJpdFBhY2tlZCB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgdWludDY0X3QgU2l6ZSh1aW50OF90IHF1YW50X2JpdHMsIHVpbnQ2NF90IGVudHJpZXMsIHVpbnQ2NF90IG1heF92b2NhYikgewotICAgICAgcmV0dXJuIEJhc2VTaXplKGVudHJpZXMsIG1heF92b2NhYiwgcXVhbnRfYml0cyk7Ci0gICAgfQotCi0gICAgQml0UGFja2VkTG9uZ2VzdCgpIHt9Ci0KLSAgICB2b2lkIEluaXQodm9pZCAqYmFzZSwgdWludDhfdCBxdWFudF9iaXRzLCB1aW50NjRfdCBtYXhfdm9jYWIpIHsKLSAgICAgIEJhc2VJbml0KGJhc2UsIG1heF92b2NhYiwgcXVhbnRfYml0cyk7Ci0gICAgfQotCi0gICAgdXRpbDo6Qml0QWRkcmVzcyBJbnNlcnQoV29yZEluZGV4IHdvcmQpOwotCi0gICAgdXRpbDo6Qml0QWRkcmVzcyBGaW5kKFdvcmRJbmRleCB3b3JkLCBjb25zdCBOb2RlUmFuZ2UgJm5vZGUpIGNvbnN0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgdHJpZQotfSAvLyBuYW1lc3BhY2UgbmdyYW0KLX0gLy8gbmFtZXNwYWNlIGxtCi0KLSNlbmRpZiAvLyBMTV9UUklFX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS90cmllX3NvcnQuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vdHJpZV9zb3J0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Y0Njg3Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS90cmllX3NvcnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotI2luY2x1ZGUgImxtL3RyaWVfc29ydC5oaCIKLQotI2luY2x1ZGUgImxtL2NvbmZpZy5oaCIKLSNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAibG0vcmVhZF9hcnBhLmhoIgotI2luY2x1ZGUgImxtL3ZvY2FiLmhoIgotI2luY2x1ZGUgImxtL3dlaWdodHMuaGgiCi0jaW5jbHVkZSAibG0vd29yZF9pbmRleC5oaCIKLSNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCi0jaW5jbHVkZSAidXRpbC9tbWFwLmhoIgotI2luY2x1ZGUgInV0aWwvcHJveHlfaXRlcmF0b3IuaGgiCi0jaW5jbHVkZSAidXRpbC9zaXplZF9pdGVyYXRvci5oaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgbmdyYW0gewotbmFtZXNwYWNlIHRyaWUgewotbmFtZXNwYWNlIHsKLQotdHlwZWRlZiB1dGlsOjpTaXplZEl0ZXJhdG9yIE5HcmFtSXRlcjsKLQotLy8gUHJveHkgZm9yIGFuIGVudHJ5IGV4Y2VwdCB0aGVyZSBpcyBzb21lIGV4dHJhIGNydWZ0IGJldHdlZW4gdGhlIGVudHJpZXMuICBUaGlzIGlzIHVzZWQgdG8gc29ydCAobi0xKS1ncmFtcyB1c2luZyB0aGUgc2FtZSBtZW1vcnkgYXMgdGhlIHNvcnRlZCBuLWdyYW1zLiAgCi1jbGFzcyBQYXJ0aWFsVmlld1Byb3h5IHsKLSAgcHVibGljOgotICAgIFBhcnRpYWxWaWV3UHJveHkoKSA6IGF0dGVudGlvbl9zaXplXygwKSwgaW5uZXJfKCkge30KLQotICAgIFBhcnRpYWxWaWV3UHJveHkodm9pZCAqcHRyLCBzdGQ6OnNpemVfdCBibG9ja19zaXplLCBzdGQ6OnNpemVfdCBhdHRlbnRpb25fc2l6ZSkgOiBhdHRlbnRpb25fc2l6ZV8oYXR0ZW50aW9uX3NpemUpLCBpbm5lcl8ocHRyLCBibG9ja19zaXplKSB7fQotCi0gICAgb3BlcmF0b3Igc3RkOjpzdHJpbmcoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oaW5uZXJfLkRhdGEoKSksIGF0dGVudGlvbl9zaXplXyk7Ci0gICAgfQotCi0gICAgUGFydGlhbFZpZXdQcm94eSAmb3BlcmF0b3I9KGNvbnN0IFBhcnRpYWxWaWV3UHJveHkgJmZyb20pIHsKLSAgICAgIG1lbWNweShpbm5lcl8uRGF0YSgpLCBmcm9tLmlubmVyXy5EYXRhKCksIGF0dGVudGlvbl9zaXplXyk7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgUGFydGlhbFZpZXdQcm94eSAmb3BlcmF0b3I9KGNvbnN0IHN0ZDo6c3RyaW5nICZmcm9tKSB7Ci0gICAgICBtZW1jcHkoaW5uZXJfLkRhdGEoKSwgZnJvbS5kYXRhKCksIGF0dGVudGlvbl9zaXplXyk7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgY29uc3Qgdm9pZCAqRGF0YSgpIGNvbnN0IHsgcmV0dXJuIGlubmVyXy5EYXRhKCk7IH0KLSAgICB2b2lkICpEYXRhKCkgeyByZXR1cm4gaW5uZXJfLkRhdGEoKTsgfQotCi0gICAgZnJpZW5kIHZvaWQgc3dhcChQYXJ0aWFsVmlld1Byb3h5IGZpcnN0LCBQYXJ0aWFsVmlld1Byb3h5IHNlY29uZCkgewotICAgICAgc3RkOjpzd2FwX3JhbmdlcyhyZWludGVycHJldF9jYXN0PGNoYXIqPihmaXJzdC5EYXRhKCkpLCByZWludGVycHJldF9jYXN0PGNoYXIqPihmaXJzdC5EYXRhKCkpICsgZmlyc3QuYXR0ZW50aW9uX3NpemVfLCByZWludGVycHJldF9jYXN0PGNoYXIqPihzZWNvbmQuRGF0YSgpKSk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIHV0aWw6OlByb3h5SXRlcmF0b3I8UGFydGlhbFZpZXdQcm94eT47Ci0KLSAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nIHZhbHVlX3R5cGU7Ci0KLSAgICBjb25zdCBzdGQ6OnNpemVfdCBhdHRlbnRpb25fc2l6ZV87Ci0KLSAgICB0eXBlZGVmIHV0aWw6OlNpemVkSW5uZXJJdGVyYXRvciBJbm5lckl0ZXJhdG9yOwotICAgIElubmVySXRlcmF0b3IgJklubmVyKCkgeyByZXR1cm4gaW5uZXJfOyB9Ci0gICAgY29uc3QgSW5uZXJJdGVyYXRvciAmSW5uZXIoKSBjb25zdCB7IHJldHVybiBpbm5lcl87IH0gCi0gICAgSW5uZXJJdGVyYXRvciBpbm5lcl87Ci19OwotCi10eXBlZGVmIHV0aWw6OlByb3h5SXRlcmF0b3I8UGFydGlhbFZpZXdQcm94eT4gUGFydGlhbEl0ZXI7Ci0KLUZJTEUgKkRpc2tGbHVzaChjb25zdCB2b2lkICptZW1fYmVnaW4sIGNvbnN0IHZvaWQgKm1lbV9lbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZW1wX3ByZWZpeCkgewotICB1dGlsOjpzY29wZWRfZmQgZmlsZSh1dGlsOjpNYWtlVGVtcCh0ZW1wX3ByZWZpeCkpOwotICB1dGlsOjpXcml0ZU9yVGhyb3coZmlsZS5nZXQoKSwgbWVtX2JlZ2luLCAodWludDhfdCopbWVtX2VuZCAtICh1aW50OF90KiltZW1fYmVnaW4pOwotICByZXR1cm4gdXRpbDo6RkRPcGVuT3JUaHJvdyhmaWxlKTsKLX0KLQotRklMRSAqV3JpdGVDb250ZXh0RmlsZSh1aW50OF90ICpiZWdpbiwgdWludDhfdCAqZW5kLCBjb25zdCBzdGQ6OnN0cmluZyAmdGVtcF9wcmVmaXgsIHN0ZDo6c2l6ZV90IGVudHJ5X3NpemUsIHVuc2lnbmVkIGNoYXIgb3JkZXIpIHsKLSAgY29uc3Qgc2l6ZV90IGNvbnRleHRfc2l6ZSA9IHNpemVvZihXb3JkSW5kZXgpICogKG9yZGVyIC0gMSk7Ci0gIC8vIFNvcnQganVzdCB0aGUgY29udGV4dHMgdXNpbmcgdGhlIHNhbWUgbWVtb3J5LiAgCi0gIFBhcnRpYWxJdGVyIGNvbnRleHRfYmVnaW4oUGFydGlhbFZpZXdQcm94eShiZWdpbiArIHNpemVvZihXb3JkSW5kZXgpLCBlbnRyeV9zaXplLCBjb250ZXh0X3NpemUpKTsKLSAgUGFydGlhbEl0ZXIgY29udGV4dF9lbmQoUGFydGlhbFZpZXdQcm94eShlbmQgKyBzaXplb2YoV29yZEluZGV4KSwgZW50cnlfc2l6ZSwgY29udGV4dF9zaXplKSk7Ci0KLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0gIHN0ZDo6c3RhYmxlX3NvcnQKLSNlbHNlCi0gIHN0ZDo6c29ydAotI2VuZGlmCi0gICAgKGNvbnRleHRfYmVnaW4sIGNvbnRleHRfZW5kLCB1dGlsOjpTaXplZENvbXBhcmU8RW50cnlDb21wYXJlLCBQYXJ0aWFsVmlld1Byb3h5PihFbnRyeUNvbXBhcmUob3JkZXIgLSAxKSkpOwotCi0gIHV0aWw6OnNjb3BlZF9GSUxFIG91dCh1dGlsOjpGTWFrZVRlbXAodGVtcF9wcmVmaXgpKTsKLQotICAvLyBXcml0ZSBvdXQgdG8gZmlsZSBhbmQgdW5pcXVlaWZ5IGF0IHRoZSBzYW1lIHRpbWUuICBDb3VsZCBoYXZlIHVzZWQgdW5pcXVlX2NvcHkgaWYgdGhlcmUgd2FzIGFuIGFwcHJvcHJpYXRlIE91dHB1dEl0ZXJhdG9yLiAgCi0gIGlmIChjb250ZXh0X2JlZ2luID09IGNvbnRleHRfZW5kKSByZXR1cm4gb3V0LnJlbGVhc2UoKTsKLSAgUGFydGlhbEl0ZXIgaShjb250ZXh0X2JlZ2luKTsKLSAgdXRpbDo6V3JpdGVPclRocm93KG91dC5nZXQoKSwgaS0+RGF0YSgpLCBjb250ZXh0X3NpemUpOwotICBjb25zdCB2b2lkICpwcmV2aW91cyA9IGktPkRhdGEoKTsKLSAgKytpOwotICBmb3IgKDsgaSAhPSBjb250ZXh0X2VuZDsgKytpKSB7Ci0gICAgaWYgKG1lbWNtcChwcmV2aW91cywgaS0+RGF0YSgpLCBjb250ZXh0X3NpemUpKSB7Ci0gICAgICB1dGlsOjpXcml0ZU9yVGhyb3cob3V0LmdldCgpLCBpLT5EYXRhKCksIGNvbnRleHRfc2l6ZSk7Ci0gICAgICBwcmV2aW91cyA9IGktPkRhdGEoKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG91dC5yZWxlYXNlKCk7Ci19Ci0KLXN0cnVjdCBUaHJvd0NvbWJpbmUgewotICB2b2lkIG9wZXJhdG9yKCkoc3RkOjpzaXplX3QgZW50cnlfc2l6ZSwgdW5zaWduZWQgY2hhciBvcmRlciwgY29uc3Qgdm9pZCAqZmlyc3QsIGNvbnN0IHZvaWQgKnNlY29uZCwgRklMRSAqIC8qb3V0Ki8pIGNvbnN0IHsKLSAgICBjb25zdCBXb3JkSW5kZXggKmJhc2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFdvcmRJbmRleCo+KGZpcnN0KTsKLSAgICBGb3JtYXRMb2FkRXhjZXB0aW9uIGU7Ci0gICAgZSA8PCAiRHVwbGljYXRlIG4tZ3JhbSBkZXRlY3RlZCB3aXRoIHZvY2FiIGlkcyI7Ci0gICAgZm9yIChjb25zdCBXb3JkSW5kZXggKmkgPSBiYXNlOyBpICE9IGJhc2UgKyBvcmRlcjsgKytpKSB7Ci0gICAgICBlIDw8ICcgJyA8PCAqaTsKLSAgICB9Ci0gICAgdGhyb3cgZTsKLSAgfQotfTsKLQotLy8gVXNlZnVsIGZvciBjb250ZXh0IGZpbGVzIHRoYXQganVzdCBjb250YWluIHJlY29yZHMgd2l0aCBubyB2YWx1ZS4gIAotc3RydWN0IEZpcnN0Q29tYmluZSB7Ci0gIHZvaWQgb3BlcmF0b3IoKShzdGQ6OnNpemVfdCBlbnRyeV9zaXplLCB1bnNpZ25lZCBjaGFyIC8qb3JkZXIqLywgY29uc3Qgdm9pZCAqZmlyc3QsIGNvbnN0IHZvaWQgKiAvKnNlY29uZCovLCBGSUxFICpvdXQpIGNvbnN0IHsKLSAgICB1dGlsOjpXcml0ZU9yVGhyb3cob3V0LCBmaXJzdCwgZW50cnlfc2l6ZSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBDb21iaW5lPiBGSUxFICpNZXJnZVNvcnRlZEZpbGVzKEZJTEUgKmZpcnN0X2ZpbGUsIEZJTEUgKnNlY29uZF9maWxlLCBjb25zdCBzdGQ6OnN0cmluZyAmdGVtcF9wcmVmaXgsIHN0ZDo6c2l6ZV90IHdlaWdodHNfc2l6ZSwgdW5zaWduZWQgY2hhciBvcmRlciwgY29uc3QgQ29tYmluZSAmY29tYmluZSkgewotICBzdGQ6OnNpemVfdCBlbnRyeV9zaXplID0gc2l6ZW9mKFdvcmRJbmRleCkgKiBvcmRlciArIHdlaWdodHNfc2l6ZTsKLSAgUmVjb3JkUmVhZGVyIGZpcnN0LCBzZWNvbmQ7Ci0gIGZpcnN0LkluaXQoZmlyc3RfZmlsZSwgZW50cnlfc2l6ZSk7Ci0gIHNlY29uZC5Jbml0KHNlY29uZF9maWxlLCBlbnRyeV9zaXplKTsKLSAgdXRpbDo6c2NvcGVkX0ZJTEUgb3V0X2ZpbGUodXRpbDo6Rk1ha2VUZW1wKHRlbXBfcHJlZml4KSk7Ci0gIEVudHJ5Q29tcGFyZSBsZXNzKG9yZGVyKTsKLSAgd2hpbGUgKGZpcnN0ICYmIHNlY29uZCkgewotICAgIGlmIChsZXNzKGZpcnN0LkRhdGEoKSwgc2Vjb25kLkRhdGEoKSkpIHsKLSAgICAgIHV0aWw6OldyaXRlT3JUaHJvdyhvdXRfZmlsZS5nZXQoKSwgZmlyc3QuRGF0YSgpLCBlbnRyeV9zaXplKTsKLSAgICAgICsrZmlyc3Q7Ci0gICAgfSBlbHNlIGlmIChsZXNzKHNlY29uZC5EYXRhKCksIGZpcnN0LkRhdGEoKSkpIHsKLSAgICAgIHV0aWw6OldyaXRlT3JUaHJvdyhvdXRfZmlsZS5nZXQoKSwgc2Vjb25kLkRhdGEoKSwgZW50cnlfc2l6ZSk7Ci0gICAgICArK3NlY29uZDsKLSAgICB9IGVsc2UgewotICAgICAgY29tYmluZShlbnRyeV9zaXplLCBvcmRlciwgZmlyc3QuRGF0YSgpLCBzZWNvbmQuRGF0YSgpLCBvdXRfZmlsZS5nZXQoKSk7Ci0gICAgICArK2ZpcnN0OyArK3NlY29uZDsKLSAgICB9Ci0gIH0KLSAgZm9yIChSZWNvcmRSZWFkZXIgJnJlbWFpbnMgPSAoZmlyc3QgPyBmaXJzdCA6IHNlY29uZCk7IHJlbWFpbnM7ICsrcmVtYWlucykgewotICAgIHV0aWw6OldyaXRlT3JUaHJvdyhvdXRfZmlsZS5nZXQoKSwgcmVtYWlucy5EYXRhKCksIGVudHJ5X3NpemUpOwotICB9Ci0gIHJldHVybiBvdXRfZmlsZS5yZWxlYXNlKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLXZvaWQgUmVjb3JkUmVhZGVyOjpJbml0KEZJTEUgKmZpbGUsIHN0ZDo6c2l6ZV90IGVudHJ5X3NpemUpIHsKLSAgZW50cnlfc2l6ZV8gPSBlbnRyeV9zaXplOwotICBkYXRhXy5yZXNldChtYWxsb2MoZW50cnlfc2l6ZSkpOwotICBVVElMX1RIUk9XX0lGKCFkYXRhXy5nZXQoKSwgdXRpbDo6RXJybm9FeGNlcHRpb24sICJGYWlsZWQgdG8gbWFsbG9jIHJlYWQgYnVmZmVyIik7Ci0gIGZpbGVfID0gZmlsZTsKLSAgaWYgKGZpbGUpIHsKLSAgICByZXdpbmQoZmlsZSk7Ci0gICAgcmVtYWluc18gPSB0cnVlOwotICAgICsrKnRoaXM7Ci0gIH0gZWxzZSB7Ci0gICAgcmVtYWluc18gPSBmYWxzZTsKLSAgfQotfQotCi12b2lkIFJlY29yZFJlYWRlcjo6T3ZlcndyaXRlKGNvbnN0IHZvaWQgKnN0YXJ0LCBzdGQ6OnNpemVfdCBhbW91bnQpIHsKLSAgbG9uZyBpbnRlcm5hbCA9ICh1aW50OF90KilzdGFydCAtICh1aW50OF90KilkYXRhXy5nZXQoKTsKLSAgVVRJTF9USFJPV19JRihmc2VlayhmaWxlXywgaW50ZXJuYWwgLSBlbnRyeV9zaXplXywgU0VFS19DVVIpLCB1dGlsOjpFcnJub0V4Y2VwdGlvbiwgIkNvdWxkbid0IHNlZWsgYmFja3dhcmRzIGZvciByZXZpc2lvbiIpOwotICB1dGlsOjpXcml0ZU9yVGhyb3coZmlsZV8sIHN0YXJ0LCBhbW91bnQpOwotICBsb25nIGZvcndhcmQgPSBlbnRyeV9zaXplXyAtIGludGVybmFsIC0gYW1vdW50OwotI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjY0KQotICBpZiAoZm9yd2FyZCkgCi0jZW5kaWYKLSAgICBVVElMX1RIUk9XX0lGKGZzZWVrKGZpbGVfLCBmb3J3YXJkLCBTRUVLX0NVUiksIHV0aWw6OkVycm5vRXhjZXB0aW9uLCAiQ291bGRuJ3Qgc2VlayBmb3J3YXJkcyBwYXN0IHJldmlzaW9uIik7Ci19Ci0KLXZvaWQgUmVjb3JkUmVhZGVyOjpSZXdpbmQoKSB7Ci0gIGlmIChmaWxlXykgewotICAgIHJld2luZChmaWxlXyk7Ci0gICAgcmVtYWluc18gPSB0cnVlOwotICAgICsrKnRoaXM7Ci0gIH0gZWxzZSB7Ci0gICAgcmVtYWluc18gPSBmYWxzZTsKLSAgfQotfQotCi1Tb3J0ZWRGaWxlczo6U29ydGVkRmlsZXMoY29uc3QgQ29uZmlnICZjb25maWcsIHV0aWw6OkZpbGVQaWVjZSAmZiwgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIHNpemVfdCBidWZmZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlX3ByZWZpeCwgU29ydGVkVm9jYWJ1bGFyeSAmdm9jYWIpIHsKLSAgUG9zaXRpdmVQcm9iV2FybiB3YXJuKGNvbmZpZy5wb3NpdGl2ZV9sb2dfcHJvYmFiaWxpdHkpOwotICB1bmlncmFtXy5yZXNldCh1dGlsOjpNYWtlVGVtcChmaWxlX3ByZWZpeCkpOwotICB7Ci0gICAgLy8gSW4gY2FzZSA8dW5rPiBhcHBlYXJzLiAgCi0gICAgc2l6ZV90IHNpemVfb3V0ID0gKGNvdW50c1swXSArIDEpICogc2l6ZW9mKFByb2JCYWNrb2ZmKTsKLSAgICB1dGlsOjpzY29wZWRfbW1hcCB1bmlncmFtX21tYXAodXRpbDo6TWFwWmVyb2VkV3JpdGUodW5pZ3JhbV8uZ2V0KCksIHNpemVfb3V0KSwgc2l6ZV9vdXQpOwotICAgIFJlYWQxR3JhbXMoZiwgY291bnRzWzBdLCB2b2NhYiwgcmVpbnRlcnByZXRfY2FzdDxQcm9iQmFja29mZio+KHVuaWdyYW1fbW1hcC5nZXQoKSksIHdhcm4pOwotICAgIENoZWNrU3BlY2lhbHMoY29uZmlnLCB2b2NhYik7Ci0gICAgaWYgKCF2b2NhYi5TYXdVbmsoKSkgKytjb3VudHNbMF07Ci0gIH0KLQotICAvLyBPbmx5IHVzZSBhcyBtdWNoIGJ1ZmZlciBhcyB3ZSBuZWVkLiAgCi0gIHNpemVfdCBidWZmZXJfdXNlID0gMDsKLSAgZm9yICh1bnNpZ25lZCBpbnQgb3JkZXIgPSAyOyBvcmRlciA8IGNvdW50cy5zaXplKCk7ICsrb3JkZXIpIHsKLSAgICBidWZmZXJfdXNlID0gc3RkOjptYXg8c2l6ZV90PihidWZmZXJfdXNlLCBzdGF0aWNfY2FzdDxzaXplX3Q+KChzaXplb2YoV29yZEluZGV4KSAqIG9yZGVyICsgMiAqIHNpemVvZihmbG9hdCkpICogY291bnRzW29yZGVyIC0gMV0pKTsKLSAgfQotICBidWZmZXJfdXNlID0gc3RkOjptYXg8c2l6ZV90PihidWZmZXJfdXNlLCBzdGF0aWNfY2FzdDxzaXplX3Q+KChzaXplb2YoV29yZEluZGV4KSAqIGNvdW50cy5zaXplKCkgKyBzaXplb2YoZmxvYXQpKSAqIGNvdW50cy5iYWNrKCkpKTsKLSAgYnVmZmVyID0gc3RkOjptaW48c2l6ZV90PihidWZmZXIsIGJ1ZmZlcl91c2UpOwotCi0gIHV0aWw6OnNjb3BlZF9tYWxsb2MgbWVtOwotICBtZW0ucmVzZXQobWFsbG9jKGJ1ZmZlcikpOwotICBpZiAoIW1lbS5nZXQoKSkgVVRJTF9USFJPVyh1dGlsOjpFcnJub0V4Y2VwdGlvbiwgIm1hbGxvYyBmYWlsZWQgZm9yIHNvcnQgYnVmZmVyIHNpemUgIiA8PCBidWZmZXIpOwotCi0gIGZvciAodW5zaWduZWQgY2hhciBvcmRlciA9IDI7IG9yZGVyIDw9IGNvdW50cy5zaXplKCk7ICsrb3JkZXIpIHsKLSAgICBDb252ZXJ0VG9Tb3J0ZWQoZiwgdm9jYWIsIGNvdW50cywgZmlsZV9wcmVmaXgsIG9yZGVyLCB3YXJuLCBtZW0uZ2V0KCksIGJ1ZmZlcik7Ci0gIH0KLSAgUmVhZEVuZChmKTsKLX0KLQotbmFtZXNwYWNlIHsKLWNsYXNzIENsb3NlciB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBDbG9zZXIoc3RkOjpkZXF1ZTxGSUxFKj4gJmZpbGVzKSA6IGZpbGVzXyhmaWxlcykge30KLQotICAgIH5DbG9zZXIoKSB7Ci0gICAgICBmb3IgKHN0ZDo6ZGVxdWU8RklMRSo+OjppdGVyYXRvciBpID0gZmlsZXNfLmJlZ2luKCk7IGkgIT0gZmlsZXNfLmVuZCgpOyArK2kpIHsKLSAgICAgICAgdXRpbDo6c2NvcGVkX0ZJTEUgZGVsZXRlcigqaSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBQb3BGcm9udCgpIHsKLSAgICAgIHV0aWw6OnNjb3BlZF9GSUxFIGRlbGV0ZXIoZmlsZXNfLmZyb250KCkpOwotICAgICAgZmlsZXNfLnBvcF9mcm9udCgpOwotICAgIH0KLSAgcHJpdmF0ZToKLSAgICBzdGQ6OmRlcXVlPEZJTEUqPiAmZmlsZXNfOwotfTsKLX0gLy8gbmFtZXNwYWNlCi0KLXZvaWQgU29ydGVkRmlsZXM6OkNvbnZlcnRUb1NvcnRlZCh1dGlsOjpGaWxlUGllY2UgJmYsIGNvbnN0IFNvcnRlZFZvY2FidWxhcnkgJnZvY2FiLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVfcHJlZml4LCB1bnNpZ25lZCBjaGFyIG9yZGVyLCBQb3NpdGl2ZVByb2JXYXJuICZ3YXJuLCB2b2lkICptZW0sIHN0ZDo6c2l6ZV90IG1lbV9zaXplKSB7Ci0gIFJlYWROR3JhbUhlYWRlcihmLCBvcmRlcik7Ci0gIGNvbnN0IHNpemVfdCBjb3VudCA9IGNvdW50c1tvcmRlciAtIDFdOwotICAvLyBTaXplIG9mIHdlaWdodHMuICBEb2VzIGl0IGluY2x1ZGUgYmFja29mZj8gIAotICBjb25zdCBzaXplX3Qgd29yZHNfc2l6ZSA9IHNpemVvZihXb3JkSW5kZXgpICogb3JkZXI7Ci0gIGNvbnN0IHNpemVfdCB3ZWlnaHRzX3NpemUgPSBzaXplb2YoZmxvYXQpICsgKChvcmRlciA9PSBjb3VudHMuc2l6ZSgpKSA/IDAgOiBzaXplb2YoZmxvYXQpKTsKLSAgY29uc3Qgc2l6ZV90IGVudHJ5X3NpemUgPSB3b3Jkc19zaXplICsgd2VpZ2h0c19zaXplOwotICBjb25zdCBzaXplX3QgYmF0Y2hfc2l6ZSA9IHN0ZDo6bWluKGNvdW50LCBtZW1fc2l6ZSAvIGVudHJ5X3NpemUpOwotICB1aW50OF90ICpjb25zdCBiZWdpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1lbSk7Ci0KLSAgc3RkOjpkZXF1ZTxGSUxFKj4gZmlsZXMsIGNvbnRleHRzOwotICBDbG9zZXIgZmlsZXNfY2xvc2VyKGZpbGVzKSwgY29udGV4dHNfY2xvc2VyKGNvbnRleHRzKTsKLQotICBmb3IgKHN0ZDo6c2l6ZV90IGJhdGNoID0gMCwgZG9uZSA9IDA7IGRvbmUgPCBjb3VudDsgKytiYXRjaCkgewotICAgIHVpbnQ4X3QgKm91dCA9IGJlZ2luOwotICAgIHVpbnQ4X3QgKm91dF9lbmQgPSBvdXQgKyBzdGQ6Om1pbihjb3VudCAtIGRvbmUsIGJhdGNoX3NpemUpICogZW50cnlfc2l6ZTsKLSAgICBpZiAob3JkZXIgPT0gY291bnRzLnNpemUoKSkgewotICAgICAgZm9yICg7IG91dCAhPSBvdXRfZW5kOyBvdXQgKz0gZW50cnlfc2l6ZSkgewotICAgICAgICBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8V29yZEluZGV4Kj4gaXQocmVpbnRlcnByZXRfY2FzdDxXb3JkSW5kZXgqPihvdXQpICsgb3JkZXIpOwotICAgICAgICBSZWFkTkdyYW0oZiwgb3JkZXIsIHZvY2FiLCBpdCwgKnJlaW50ZXJwcmV0X2Nhc3Q8UHJvYio+KG91dCArIHdvcmRzX3NpemUpLCB3YXJuKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZm9yICg7IG91dCAhPSBvdXRfZW5kOyBvdXQgKz0gZW50cnlfc2l6ZSkgewotICAgICAgICBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8V29yZEluZGV4Kj4gaXQocmVpbnRlcnByZXRfY2FzdDxXb3JkSW5kZXgqPihvdXQpICsgb3JkZXIpOwotICAgICAgICBSZWFkTkdyYW0oZiwgb3JkZXIsIHZvY2FiLCBpdCwgKnJlaW50ZXJwcmV0X2Nhc3Q8UHJvYkJhY2tvZmYqPihvdXQgKyB3b3Jkc19zaXplKSwgd2Fybik7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFNvcnQgZnVsbCByZWNvcmRzIGJ5IGZ1bGwgbi1ncmFtLiAgCi0gICAgdXRpbDo6U2l6ZWRQcm94eSBwcm94eV9iZWdpbihiZWdpbiwgZW50cnlfc2l6ZSksIHByb3h5X2VuZChvdXRfZW5kLCBlbnRyeV9zaXplKTsKLSAgICAvLyBwYXJhbGxlbF9zb3J0IHVzZXMgdG9vIG11Y2ggUkFNLiAgVE9ETzogZmlndXJlIG91dCB3aHkgd2luZG93cyBzb3J0IGRvZXNuJ3QgbGlrZSBteSBwcm94aWVzLiAgCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotICAgIHN0ZDo6c3RhYmxlX3NvcnQKLSNlbHNlCi0gICAgc3RkOjpzb3J0Ci0jZW5kaWYKLSAgICAgICAgKE5HcmFtSXRlcihwcm94eV9iZWdpbiksIE5HcmFtSXRlcihwcm94eV9lbmQpLCB1dGlsOjpTaXplZENvbXBhcmU8RW50cnlDb21wYXJlPihFbnRyeUNvbXBhcmUob3JkZXIpKSk7Ci0gICAgZmlsZXMucHVzaF9iYWNrKERpc2tGbHVzaChiZWdpbiwgb3V0X2VuZCwgZmlsZV9wcmVmaXgpKTsKLSAgICBjb250ZXh0cy5wdXNoX2JhY2soV3JpdGVDb250ZXh0RmlsZShiZWdpbiwgb3V0X2VuZCwgZmlsZV9wcmVmaXgsIGVudHJ5X3NpemUsIG9yZGVyKSk7Ci0KLSAgICBkb25lICs9IChvdXRfZW5kIC0gYmVnaW4pIC8gZW50cnlfc2l6ZTsKLSAgfQotCi0gIC8vIEFsbCBpbmRpdmlkdWFsIGZpbGVzIGNyZWF0ZWQuICBNZXJnZSB0aGVtLiAgCi0KLSAgd2hpbGUgKGZpbGVzLnNpemUoKSA+IDEpIHsKLSAgICBmaWxlcy5wdXNoX2JhY2soTWVyZ2VTb3J0ZWRGaWxlcyhmaWxlc1swXSwgZmlsZXNbMV0sIGZpbGVfcHJlZml4LCB3ZWlnaHRzX3NpemUsIG9yZGVyLCBUaHJvd0NvbWJpbmUoKSkpOwotICAgIGZpbGVzX2Nsb3Nlci5Qb3BGcm9udCgpOwotICAgIGZpbGVzX2Nsb3Nlci5Qb3BGcm9udCgpOwotICAgIGNvbnRleHRzLnB1c2hfYmFjayhNZXJnZVNvcnRlZEZpbGVzKGNvbnRleHRzWzBdLCBjb250ZXh0c1sxXSwgZmlsZV9wcmVmaXgsIDAsIG9yZGVyIC0gMSwgRmlyc3RDb21iaW5lKCkpKTsKLSAgICBjb250ZXh0c19jbG9zZXIuUG9wRnJvbnQoKTsKLSAgICBjb250ZXh0c19jbG9zZXIuUG9wRnJvbnQoKTsKLSAgfQotCi0gIGlmICghZmlsZXMuZW1wdHkoKSkgewotICAgIC8vIFN0ZWFsIGZyb20gY2xvc2Vycy4KLSAgICBmdWxsX1tvcmRlciAtIDJdLnJlc2V0KGZpbGVzLmZyb250KCkpOwotICAgIGZpbGVzLnBvcF9mcm9udCgpOwotICAgIGNvbnRleHRfW29yZGVyIC0gMl0ucmVzZXQoY29udGV4dHMuZnJvbnQoKSk7Ci0gICAgY29udGV4dHMucG9wX2Zyb250KCk7Ci0gIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgdHJpZQotfSAvLyBuYW1lc3BhY2UgbmdyYW0KLX0gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vdHJpZV9zb3J0LmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3RyaWVfc29ydC5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0MDZkOS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vdHJpZV9zb3J0LmhoCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vIFN0ZXAgb2YgdHJpZSBidWlsZGVyOiBjcmVhdGUgc29ydGVkIGZpbGVzLiAgCi0KLSNpZm5kZWYgTE1fVFJJRV9TT1JUX0gKLSNkZWZpbmUgTE1fVFJJRV9TT1JUX0gKLQotI2luY2x1ZGUgImxtL21heF9vcmRlci5oaCIKLSNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgotCi0jaW5jbHVkZSAidXRpbC9maWxlLmhoIgotI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIHV0aWwgewotY2xhc3MgRmlsZVBpZWNlOwotfSAvLyBuYW1lc3BhY2UgdXRpbAotCi1uYW1lc3BhY2UgbG0gewotY2xhc3MgUG9zaXRpdmVQcm9iV2FybjsKLW5hbWVzcGFjZSBuZ3JhbSB7Ci1jbGFzcyBTb3J0ZWRWb2NhYnVsYXJ5Owotc3RydWN0IENvbmZpZzsKLQotbmFtZXNwYWNlIHRyaWUgewotCi1jbGFzcyBFbnRyeUNvbXBhcmUgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248Y29uc3Qgdm9pZCosIGNvbnN0IHZvaWQqLCBib29sPiB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBFbnRyeUNvbXBhcmUodW5zaWduZWQgY2hhciBvcmRlcikgOiBvcmRlcl8ob3JkZXIpIHt9Ci0KLSAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgdm9pZCAqZmlyc3Rfdm9pZCwgY29uc3Qgdm9pZCAqc2Vjb25kX3ZvaWQpIGNvbnN0IHsKLSAgICAgIGNvbnN0IFdvcmRJbmRleCAqZmlyc3QgPSBzdGF0aWNfY2FzdDxjb25zdCBXb3JkSW5kZXgqPihmaXJzdF92b2lkKTsKLSAgICAgIGNvbnN0IFdvcmRJbmRleCAqc2Vjb25kID0gc3RhdGljX2Nhc3Q8Y29uc3QgV29yZEluZGV4Kj4oc2Vjb25kX3ZvaWQpOwotICAgICAgY29uc3QgV29yZEluZGV4ICplbmQgPSBmaXJzdCArIG9yZGVyXzsKLSAgICAgIGZvciAoOyBmaXJzdCAhPSBlbmQ7ICsrZmlyc3QsICsrc2Vjb25kKSB7Ci0gICAgICAgIGlmICgqZmlyc3QgPCAqc2Vjb25kKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKCpmaXJzdCA+ICpzZWNvbmQpIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHByaXZhdGU6Ci0gICAgdW5zaWduZWQgY2hhciBvcmRlcl87Ci19OwotCi1jbGFzcyBSZWNvcmRSZWFkZXIgewotICBwdWJsaWM6Ci0gICAgUmVjb3JkUmVhZGVyKCkgOiByZW1haW5zXyh0cnVlKSB7fQotCi0gICAgdm9pZCBJbml0KEZJTEUgKmZpbGUsIHN0ZDo6c2l6ZV90IGVudHJ5X3NpemUpOwotCi0gICAgdm9pZCAqRGF0YSgpIHsgcmV0dXJuIGRhdGFfLmdldCgpOyB9Ci0gICAgY29uc3Qgdm9pZCAqRGF0YSgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfLmdldCgpOyB9Ci0KLSAgICBSZWNvcmRSZWFkZXIgJm9wZXJhdG9yKysoKSB7Ci0gICAgICBzdGQ6OnNpemVfdCByZXQgPSBmcmVhZChkYXRhXy5nZXQoKSwgZW50cnlfc2l6ZV8sIDEsIGZpbGVfKTsKLSAgICAgIGlmICghcmV0KSB7Ci0gICAgICAgIFVUSUxfVEhST1dfSUYoIWZlb2YoZmlsZV8pLCB1dGlsOjpFcnJub0V4Y2VwdGlvbiwgIkVycm9yIHJlYWRpbmcgdGVtcG9yYXJ5IGZpbGUiKTsKLSAgICAgICAgcmVtYWluc18gPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gcmVtYWluc187IH0KLQotICAgIHZvaWQgUmV3aW5kKCk7Ci0KLSAgICBzdGQ6OnNpemVfdCBFbnRyeVNpemUoKSBjb25zdCB7IHJldHVybiBlbnRyeV9zaXplXzsgfQotCi0gICAgdm9pZCBPdmVyd3JpdGUoY29uc3Qgdm9pZCAqc3RhcnQsIHN0ZDo6c2l6ZV90IGFtb3VudCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBGSUxFICpmaWxlXzsKLQotICAgIHV0aWw6OnNjb3BlZF9tYWxsb2MgZGF0YV87Ci0KLSAgICBib29sIHJlbWFpbnNfOwotCi0gICAgc3RkOjpzaXplX3QgZW50cnlfc2l6ZV87Ci19OwotCi1jbGFzcyBTb3J0ZWRGaWxlcyB7Ci0gIHB1YmxpYzoKLSAgICAvLyBCdWlsZCBmcm9tIEFSUEEKLSAgICBTb3J0ZWRGaWxlcyhjb25zdCBDb25maWcgJmNvbmZpZywgdXRpbDo6RmlsZVBpZWNlICZmLCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgc3RkOjpzaXplX3QgYnVmZmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZV9wcmVmaXgsIFNvcnRlZFZvY2FidWxhcnkgJnZvY2FiKTsKLQotICAgIGludCBTdGVhbFVuaWdyYW0oKSB7Ci0gICAgICByZXR1cm4gdW5pZ3JhbV8ucmVsZWFzZSgpOwotICAgIH0KLQotICAgIEZJTEUgKkZ1bGwodW5zaWduZWQgY2hhciBvcmRlcikgewotICAgICAgcmV0dXJuIGZ1bGxfW29yZGVyIC0gMl0uZ2V0KCk7Ci0gICAgfQotCi0gICAgRklMRSAqQ29udGV4dCh1bnNpZ25lZCBjaGFyIG9mX29yZGVyKSB7Ci0gICAgICByZXR1cm4gY29udGV4dF9bb2Zfb3JkZXIgLSAyXS5nZXQoKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB2b2lkIENvbnZlcnRUb1NvcnRlZCh1dGlsOjpGaWxlUGllY2UgJmYsIGNvbnN0IFNvcnRlZFZvY2FidWxhcnkgJnZvY2FiLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3Qgc3RkOjpzdHJpbmcgJnByZWZpeCwgdW5zaWduZWQgY2hhciBvcmRlciwgUG9zaXRpdmVQcm9iV2FybiAmd2Fybiwgdm9pZCAqbWVtLCBzdGQ6OnNpemVfdCBtZW1fc2l6ZSk7Ci0gICAgCi0gICAgdXRpbDo6c2NvcGVkX2ZkIHVuaWdyYW1fOwotCi0gICAgdXRpbDo6c2NvcGVkX0ZJTEUgZnVsbF9bS0VOTE1fTUFYX09SREVSIC0gMV0sIGNvbnRleHRfW0tFTkxNX01BWF9PUkRFUiAtIDFdOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgdHJpZQotfSAvLyBuYW1lc3BhY2UgbmdyYW0KLX0gLy8gbmFtZXNwYWNlIGxtCi0KLSNlbmRpZiAvLyBMTV9UUklFX1NPUlRfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3ZhbHVlLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3ZhbHVlLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmU4NzA4Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS92YWx1ZS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jaWZuZGVmIExNX1ZBTFVFX0gKLSNkZWZpbmUgTE1fVkFMVUVfSAotCi0jaW5jbHVkZSAibG0vbW9kZWxfdHlwZS5oaCIKLSNpbmNsdWRlICJsbS92YWx1ZV9idWlsZC5oaCIKLSNpbmNsdWRlICJsbS93ZWlnaHRzLmhoIgotI2luY2x1ZGUgInV0aWwvYml0X3BhY2tpbmcuaGgiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIGxtIHsKLW5hbWVzcGFjZSBuZ3JhbSB7Ci0KLS8vIFRlbXBsYXRlIHByb3h5IGZvciBwcm9iaW5nIHVuaWdyYW1zIGFuZCBtaWRkbGUuCi10ZW1wbGF0ZSA8Y2xhc3MgV2VpZ2h0cz4gY2xhc3MgR2VuZXJpY1Byb2JpbmdQcm94eSB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBHZW5lcmljUHJvYmluZ1Byb3h5KGNvbnN0IFdlaWdodHMgJnRvKSA6IHRvXygmdG8pIHt9Ci0KLSAgICBHZW5lcmljUHJvYmluZ1Byb3h5KCkgOiB0b18oMCkge30KLQotICAgIGJvb2wgRm91bmQoKSBjb25zdCB7IHJldHVybiB0b18gIT0gMDsgfQotCi0gICAgZmxvYXQgUHJvYigpIGNvbnN0IHsKLSAgICAgIHV0aWw6OkZsb2F0RW5jIGVuYzsKLSAgICAgIGVuYy5mID0gdG9fLT5wcm9iOwotICAgICAgZW5jLmkgfD0gdXRpbDo6a1NpZ25CaXQ7Ci0gICAgICByZXR1cm4gZW5jLmY7Ci0gICAgfQotCi0gICAgZmxvYXQgQmFja29mZigpIGNvbnN0IHsgcmV0dXJuIHRvXy0+YmFja29mZjsgfQotCi0gICAgYm9vbCBJbmRlcGVuZGVudExlZnQoKSBjb25zdCB7Ci0gICAgICB1dGlsOjpGbG9hdEVuYyBlbmM7Ci0gICAgICBlbmMuZiA9IHRvXy0+cHJvYjsKLSAgICAgIHJldHVybiBlbmMuaSAmIHV0aWw6OmtTaWduQml0OwotICAgIH0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgY29uc3QgV2VpZ2h0cyAqdG9fOwotfTsKLQotLy8gQmFzaWMgcHJveHkgZm9yIHRyaWUgdW5pZ3JhbXMuICAKLXRlbXBsYXRlIDxjbGFzcyBXZWlnaHRzPiBjbGFzcyBHZW5lcmljVHJpZVVuaWdyYW1Qcm94eSB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBHZW5lcmljVHJpZVVuaWdyYW1Qcm94eShjb25zdCBXZWlnaHRzICZ0bykgOiB0b18oJnRvKSB7fQotCi0gICAgR2VuZXJpY1RyaWVVbmlncmFtUHJveHkoKSA6IHRvXygwKSB7fQotCi0gICAgYm9vbCBGb3VuZCgpIGNvbnN0IHsgcmV0dXJuIHRvXyAhPSAwOyB9Ci0gICAgZmxvYXQgUHJvYigpIGNvbnN0IHsgcmV0dXJuIHRvXy0+cHJvYjsgfQotICAgIGZsb2F0IEJhY2tvZmYoKSBjb25zdCB7IHJldHVybiB0b18tPmJhY2tvZmY7IH0KLSAgICBmbG9hdCBSZXN0KCkgY29uc3QgeyByZXR1cm4gUHJvYigpOyB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIGNvbnN0IFdlaWdodHMgKnRvXzsKLX07Ci0KLXN0cnVjdCBCYWNrb2ZmVmFsdWUgewotICB0eXBlZGVmIFByb2JCYWNrb2ZmIFdlaWdodHM7Ci0gIHN0YXRpYyBjb25zdCBNb2RlbFR5cGUga1Byb2JpbmdNb2RlbFR5cGUgPSBQUk9CSU5HOwotCi0gIGNsYXNzIFByb2JpbmdQcm94eSA6IHB1YmxpYyBHZW5lcmljUHJvYmluZ1Byb3h5PFdlaWdodHM+IHsKLSAgICBwdWJsaWM6Ci0gICAgICBleHBsaWNpdCBQcm9iaW5nUHJveHkoY29uc3QgV2VpZ2h0cyAmdG8pIDogR2VuZXJpY1Byb2JpbmdQcm94eTxXZWlnaHRzPih0bykge30KLSAgICAgIFByb2JpbmdQcm94eSgpIHt9Ci0gICAgICBmbG9hdCBSZXN0KCkgY29uc3QgeyByZXR1cm4gUHJvYigpOyB9Ci0gIH07Ci0KLSAgY2xhc3MgVHJpZVVuaWdyYW1Qcm94eSA6IHB1YmxpYyBHZW5lcmljVHJpZVVuaWdyYW1Qcm94eTxXZWlnaHRzPiB7Ci0gICAgcHVibGljOgotICAgICAgZXhwbGljaXQgVHJpZVVuaWdyYW1Qcm94eShjb25zdCBXZWlnaHRzICZ0bykgOiBHZW5lcmljVHJpZVVuaWdyYW1Qcm94eTxXZWlnaHRzPih0bykge30KLSAgICAgIFRyaWVVbmlncmFtUHJveHkoKSB7fQotICAgICAgZmxvYXQgUmVzdCgpIGNvbnN0IHsgcmV0dXJuIFByb2IoKTsgfQotICB9OwotCi0gIHN0cnVjdCBQcm9iaW5nRW50cnkgewotICAgIHR5cGVkZWYgdWludDY0X3QgS2V5OwotICAgIHR5cGVkZWYgV2VpZ2h0cyBWYWx1ZTsKLSAgICB1aW50NjRfdCBrZXk7Ci0gICAgUHJvYkJhY2tvZmYgdmFsdWU7Ci0gICAgdWludDY0X3QgR2V0S2V5KCkgY29uc3QgeyByZXR1cm4ga2V5OyB9Ci0gIH07Ci0KLSAgc3RydWN0IFRyaWVVbmlncmFtVmFsdWUgewotICAgIFdlaWdodHMgd2VpZ2h0czsKLSAgICB1aW50NjRfdCBuZXh0OwotICAgIHVpbnQ2NF90IE5leHQoKSBjb25zdCB7IHJldHVybiBuZXh0OyB9Ci0gIH07Ci0KLSAgY29uc3Qgc3RhdGljIGJvb2wga0RpZmZlcmVudFJlc3QgPSBmYWxzZTsKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgTW9kZWwsIGNsYXNzIEM+IHZvaWQgQ2FsbGJhY2soY29uc3QgQ29uZmlnICYsIHVuc2lnbmVkIGludCwgdHlwZW5hbWUgTW9kZWw6OlZvY2FidWxhcnkgJiwgQyAmY2FsbGJhY2spIHsKLSAgICBOb1Jlc3RCdWlsZCBidWlsZDsKLSAgICBjYWxsYmFjayhidWlsZCk7Ci0gIH0KLX07Ci0KLXN0cnVjdCBSZXN0VmFsdWUgewotICB0eXBlZGVmIFJlc3RXZWlnaHRzIFdlaWdodHM7Ci0gIHN0YXRpYyBjb25zdCBNb2RlbFR5cGUga1Byb2JpbmdNb2RlbFR5cGUgPSBSRVNUX1BST0JJTkc7Ci0KLSAgY2xhc3MgUHJvYmluZ1Byb3h5IDogcHVibGljIEdlbmVyaWNQcm9iaW5nUHJveHk8UmVzdFdlaWdodHM+IHsKLSAgICBwdWJsaWM6Ci0gICAgICBleHBsaWNpdCBQcm9iaW5nUHJveHkoY29uc3QgV2VpZ2h0cyAmdG8pIDogR2VuZXJpY1Byb2JpbmdQcm94eTxSZXN0V2VpZ2h0cz4odG8pIHt9Ci0gICAgICBQcm9iaW5nUHJveHkoKSB7fQotICAgICAgZmxvYXQgUmVzdCgpIGNvbnN0IHsgcmV0dXJuIHRvXy0+cmVzdDsgfQotICB9OwotCi0gIGNsYXNzIFRyaWVVbmlncmFtUHJveHkgOiBwdWJsaWMgR2VuZXJpY1RyaWVVbmlncmFtUHJveHk8V2VpZ2h0cz4gewotICAgIHB1YmxpYzoKLSAgICAgIGV4cGxpY2l0IFRyaWVVbmlncmFtUHJveHkoY29uc3QgV2VpZ2h0cyAmdG8pIDogR2VuZXJpY1RyaWVVbmlncmFtUHJveHk8V2VpZ2h0cz4odG8pIHt9Ci0gICAgICBUcmllVW5pZ3JhbVByb3h5KCkge30KLSAgICAgIGZsb2F0IFJlc3QoKSBjb25zdCB7IHJldHVybiB0b18tPnJlc3Q7IH0KLSAgfTsKLQotLy8gZ2NjIDQuMSBkb2Vzbid0IHByb3Blcmx5IGJhY2sgZGVwZW5kZW50IHR5cGVzIDotKC4gIAotI3ByYWdtYSBwYWNrKHB1c2gpCi0jcHJhZ21hIHBhY2soNCkKLSAgc3RydWN0IFByb2JpbmdFbnRyeSB7Ci0gICAgdHlwZWRlZiB1aW50NjRfdCBLZXk7Ci0gICAgdHlwZWRlZiBXZWlnaHRzIFZhbHVlOwotICAgIEtleSBrZXk7Ci0gICAgVmFsdWUgdmFsdWU7Ci0gICAgS2V5IEdldEtleSgpIGNvbnN0IHsgcmV0dXJuIGtleTsgfQotICB9OwotCi0gIHN0cnVjdCBUcmllVW5pZ3JhbVZhbHVlIHsKLSAgICBXZWlnaHRzIHdlaWdodHM7Ci0gICAgdWludDY0X3QgbmV4dDsKLSAgICB1aW50NjRfdCBOZXh0KCkgY29uc3QgeyByZXR1cm4gbmV4dDsgfQotICB9OwotI3ByYWdtYSBwYWNrKHBvcCkKLQotICBjb25zdCBzdGF0aWMgYm9vbCBrRGlmZmVyZW50UmVzdCA9IHRydWU7Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIE1vZGVsLCBjbGFzcyBDPiB2b2lkIENhbGxiYWNrKGNvbnN0IENvbmZpZyAmY29uZmlnLCB1bnNpZ25lZCBpbnQgb3JkZXIsIHR5cGVuYW1lIE1vZGVsOjpWb2NhYnVsYXJ5ICZ2b2NhYiwgQyAmY2FsbGJhY2spIHsKLSAgICBzd2l0Y2ggKGNvbmZpZy5yZXN0X2Z1bmN0aW9uKSB7Ci0gICAgICBjYXNlIENvbmZpZzo6UkVTVF9NQVg6Ci0gICAgICAgIHsKLSAgICAgICAgICBNYXhSZXN0QnVpbGQgYnVpbGQ7Ci0gICAgICAgICAgY2FsbGJhY2soYnVpbGQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDb25maWc6OlJFU1RfTE9XRVI6Ci0gICAgICAgIHsKLSAgICAgICAgICBMb3dlclJlc3RCdWlsZDxNb2RlbD4gYnVpbGQoY29uZmlnLCBvcmRlciwgdm9jYWIpOwotICAgICAgICAgIGNhbGxiYWNrKGJ1aWxkKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIG5ncmFtCi19IC8vIG5hbWVzcGFjZSBsbQotCi0jZW5kaWYgLy8gTE1fVkFMVUVfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3ZhbHVlX2J1aWxkLmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3ZhbHVlX2J1aWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWMzZGNlLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS92YWx1ZV9idWlsZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSNpbmNsdWRlICJsbS92YWx1ZV9idWlsZC5oaCIKLQotI2luY2x1ZGUgImxtL21vZGVsLmhoIgotI2luY2x1ZGUgImxtL3JlYWRfYXJwYS5oaCIKLQotbmFtZXNwYWNlIGxtIHsgCi1uYW1lc3BhY2UgbmdyYW0gewotCi10ZW1wbGF0ZSA8Y2xhc3MgTW9kZWw+IExvd2VyUmVzdEJ1aWxkPE1vZGVsPjo6TG93ZXJSZXN0QnVpbGQoY29uc3QgQ29uZmlnICZjb25maWcsIHVuc2lnbmVkIGludCBvcmRlciwgY29uc3QgdHlwZW5hbWUgTW9kZWw6OlZvY2FidWxhcnkgJnZvY2FiKSB7Ci0gIFVUSUxfVEhST1dfSUYoY29uZmlnLnJlc3RfbG93ZXJfZmlsZXMuc2l6ZSgpICE9IG9yZGVyIC0gMSwgQ29uZmlnRXhjZXB0aW9uLCAiVGhpcyBtb2RlbCBoYXMgb3JkZXIgIiA8PCBvcmRlciA8PCAiIHNvIHRoZXJlIHNob3VsZCBiZSAiIDw8IChvcmRlciAtIDEpIDw8ICIgbG93ZXItb3JkZXIgbW9kZWxzIGZvciByZXN0IGNvc3QgcHVycG9zZXMuIik7Ci0gIENvbmZpZyBmb3JfbG93ZXIgPSBjb25maWc7Ci0gIGZvcl9sb3dlci53cml0ZV9tbWFwID0gTlVMTDsKLSAgZm9yX2xvd2VyLnJlc3RfbG93ZXJfZmlsZXMuY2xlYXIoKTsKLQotICAvLyBVbmlncmFtIG1vZGVscyBhcmVuJ3Qgc3VwcG9ydGVkLCBzbyB0aGlzIGlzIGEgY3VzdG9tIGxvYWRlci4gIAotICAvLyBUT0RPOiBvcHRpbWl6ZSB0aGUgdW5pZ3JhbSBsb2FkaW5nPyAgCi0gIHsKLSAgICB1dGlsOjpGaWxlUGllY2UgdW5pKGNvbmZpZy5yZXN0X2xvd2VyX2ZpbGVzWzBdLmNfc3RyKCkpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBudW1iZXI7Ci0gICAgUmVhZEFSUEFDb3VudHModW5pLCBudW1iZXIpOwotICAgIFVUSUxfVEhST1dfSUYobnVtYmVyLnNpemUoKSAhPSAxLCBGb3JtYXRMb2FkRXhjZXB0aW9uLCAiRXhwZWN0ZWQgdGhlIHVuaWdyYW0gbW9kZWwgdG8gaGF2ZSBvcmRlciAxLCBub3QgIiA8PCBudW1iZXIuc2l6ZSgpKTsKLSAgICBSZWFkTkdyYW1IZWFkZXIodW5pLCAxKTsKLSAgICB1bmlncmFtc18ucmVzaXplKG51bWJlclswXSk7Ci0gICAgdW5pZ3JhbXNfWzBdID0gY29uZmlnLnVua25vd25fbWlzc2luZ19sb2dwcm9iOwotICAgIFBvc2l0aXZlUHJvYldhcm4gd2FybjsKLSAgICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgbnVtYmVyWzBdOyArK2kpIHsKLSAgICAgIFdvcmRJbmRleCB3OwotICAgICAgUHJvYiBlbnRyeTsKLSAgICAgIFJlYWROR3JhbSh1bmksIDEsIHZvY2FiLCAmdywgZW50cnksIHdhcm4pOwotICAgICAgdW5pZ3JhbXNfW3ddID0gZW50cnkucHJvYjsKLSAgICB9Ci0gIH0KLQotICB0cnkgewotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAyOyBpIDwgb3JkZXI7ICsraSkgewotICAgICAgbW9kZWxzXy5wdXNoX2JhY2sobmV3IE1vZGVsKGNvbmZpZy5yZXN0X2xvd2VyX2ZpbGVzW2kgLSAxXS5jX3N0cigpLCBmb3JfbG93ZXIpKTsKLSAgICAgIFVUSUxfVEhST1dfSUYobW9kZWxzXy5iYWNrKCktPk9yZGVyKCkgIT0gaSwgRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIkxvd2VyIG9yZGVyIGZpbGUgIiA8PCBjb25maWcucmVzdF9sb3dlcl9maWxlc1tpLTFdIDw8ICIgc2hvdWxkIGhhdmUgb3JkZXIgIiA8PCBpKTsKLSAgICB9Ci0gIH0gY2F0Y2ggKC4uLikgewotICAgIGZvciAodHlwZW5hbWUgc3RkOjp2ZWN0b3I8Y29uc3QgTW9kZWwqPjo6Y29uc3RfaXRlcmF0b3IgaSA9IG1vZGVsc18uYmVnaW4oKTsgaSAhPSBtb2RlbHNfLmVuZCgpOyArK2kpIHsKLSAgICAgIGRlbGV0ZSAqaTsKLSAgICB9Ci0gICAgbW9kZWxzXy5jbGVhcigpOwotICAgIHRocm93OwotICB9Ci0KLSAgLy8gVE9ETzogZm9yY2UvY2hlY2sgc2FtZSB2b2NhYi4gIAotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTW9kZWw+IExvd2VyUmVzdEJ1aWxkPE1vZGVsPjo6fkxvd2VyUmVzdEJ1aWxkKCkgewotICBmb3IgKHR5cGVuYW1lIHN0ZDo6dmVjdG9yPGNvbnN0IE1vZGVsKj46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtb2RlbHNfLmJlZ2luKCk7IGkgIT0gbW9kZWxzXy5lbmQoKTsgKytpKSB7Ci0gICAgZGVsZXRlICppOwotICB9Ci19Ci0KLXRlbXBsYXRlIGNsYXNzIExvd2VyUmVzdEJ1aWxkPFByb2JpbmdNb2RlbD47Ci0KLX0gLy8gbmFtZXNwYWNlIG5ncmFtCi19IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3ZhbHVlX2J1aWxkLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3ZhbHVlX2J1aWxkLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmQyNmVmLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS92YWx1ZV9idWlsZC5oaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLSNpZm5kZWYgTE1fVkFMVUVfQlVJTERfSAotI2RlZmluZSBMTV9WQUxVRV9CVUlMRF9ICi0KLSNpbmNsdWRlICJsbS93ZWlnaHRzLmhoIgotI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCi0jaW5jbHVkZSAidXRpbC9iaXRfcGFja2luZy5oaCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIGxtIHsKLW5hbWVzcGFjZSBuZ3JhbSB7Ci0KLXN0cnVjdCBDb25maWc7Ci1zdHJ1Y3QgQmFja29mZlZhbHVlOwotc3RydWN0IFJlc3RWYWx1ZTsKLQotY2xhc3MgTm9SZXN0QnVpbGQgewotICBwdWJsaWM6Ci0gICAgdHlwZWRlZiBCYWNrb2ZmVmFsdWUgVmFsdWU7Ci0KLSAgICBOb1Jlc3RCdWlsZCgpIHt9Ci0KLSAgICB2b2lkIFNldFJlc3QoY29uc3QgV29yZEluZGV4ICosIHVuc2lnbmVkIGludCwgY29uc3QgUHJvYiAmLypwcm9iKi8pIGNvbnN0IHt9Ci0gICAgdm9pZCBTZXRSZXN0KGNvbnN0IFdvcmRJbmRleCAqLCB1bnNpZ25lZCBpbnQsIGNvbnN0IFByb2JCYWNrb2ZmICYpIGNvbnN0IHt9Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgU2Vjb25kPiBib29sIE1hcmtFeHRlbmRzKFByb2JCYWNrb2ZmICZ3ZWlnaHRzLCBjb25zdCBTZWNvbmQgJikgY29uc3QgewotICAgICAgdXRpbDo6VW5zZXRTaWduKHdlaWdodHMucHJvYik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gUHJvYmluZyBkb2Vzbid0IG5lZWQgdG8gZ28gYmFjayB0byB1bmlncmFtLgotICAgIGNvbnN0IHN0YXRpYyBib29sIGtNYXJrRXZlbkxvd2VyID0gZmFsc2U7Ci19OwotCi1jbGFzcyBNYXhSZXN0QnVpbGQgewotICBwdWJsaWM6Ci0gICAgdHlwZWRlZiBSZXN0VmFsdWUgVmFsdWU7Ci0KLSAgICBNYXhSZXN0QnVpbGQoKSB7fQotCi0gICAgdm9pZCBTZXRSZXN0KGNvbnN0IFdvcmRJbmRleCAqLCB1bnNpZ25lZCBpbnQsIGNvbnN0IFByb2IgJi8qcHJvYiovKSBjb25zdCB7fQotICAgIHZvaWQgU2V0UmVzdChjb25zdCBXb3JkSW5kZXggKiwgdW5zaWduZWQgaW50LCBSZXN0V2VpZ2h0cyAmd2VpZ2h0cykgY29uc3QgewotICAgICAgd2VpZ2h0cy5yZXN0ID0gd2VpZ2h0cy5wcm9iOwotICAgICAgdXRpbDo6U2V0U2lnbih3ZWlnaHRzLnJlc3QpOwotICAgIH0KLQotICAgIGJvb2wgTWFya0V4dGVuZHMoUmVzdFdlaWdodHMgJndlaWdodHMsIGNvbnN0IFJlc3RXZWlnaHRzICZ0bykgY29uc3QgewotICAgICAgdXRpbDo6VW5zZXRTaWduKHdlaWdodHMucHJvYik7Ci0gICAgICBpZiAod2VpZ2h0cy5yZXN0ID49IHRvLnJlc3QpIHJldHVybiBmYWxzZTsKLSAgICAgIHdlaWdodHMucmVzdCA9IHRvLnJlc3Q7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgYm9vbCBNYXJrRXh0ZW5kcyhSZXN0V2VpZ2h0cyAmd2VpZ2h0cywgY29uc3QgUHJvYiAmdG8pIGNvbnN0IHsKLSAgICAgIHV0aWw6OlVuc2V0U2lnbih3ZWlnaHRzLnByb2IpOwotICAgICAgaWYgKHdlaWdodHMucmVzdCA+PSB0by5wcm9iKSByZXR1cm4gZmFsc2U7Ci0gICAgICB3ZWlnaHRzLnJlc3QgPSB0by5wcm9iOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gUHJvYmluZyBkb2VzIG5lZWQgdG8gZ28gYmFjayB0byB1bmlncmFtLiAgCi0gICAgY29uc3Qgc3RhdGljIGJvb2wga01hcmtFdmVuTG93ZXIgPSB0cnVlOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIE1vZGVsPiBjbGFzcyBMb3dlclJlc3RCdWlsZCB7Ci0gIHB1YmxpYzoKLSAgICB0eXBlZGVmIFJlc3RWYWx1ZSBWYWx1ZTsKLQotICAgIExvd2VyUmVzdEJ1aWxkKGNvbnN0IENvbmZpZyAmY29uZmlnLCB1bnNpZ25lZCBpbnQgb3JkZXIsIGNvbnN0IHR5cGVuYW1lIE1vZGVsOjpWb2NhYnVsYXJ5ICZ2b2NhYik7Ci0KLSAgICB+TG93ZXJSZXN0QnVpbGQoKTsKLQotICAgIHZvaWQgU2V0UmVzdChjb25zdCBXb3JkSW5kZXggKiwgdW5zaWduZWQgaW50LCBjb25zdCBQcm9iICYvKnByb2IqLykgY29uc3Qge30KLSAgICB2b2lkIFNldFJlc3QoY29uc3QgV29yZEluZGV4ICp2b2NhYl9pZHMsIHVuc2lnbmVkIGludCBuLCBSZXN0V2VpZ2h0cyAmd2VpZ2h0cykgY29uc3QgewotICAgICAgdHlwZW5hbWUgTW9kZWw6OlN0YXRlIGlnbm9yZWQ7Ci0gICAgICBpZiAobiA9PSAxKSB7Ci0gICAgICAgIHdlaWdodHMucmVzdCA9IHVuaWdyYW1zX1sqdm9jYWJfaWRzXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdlaWdodHMucmVzdCA9IG1vZGVsc19bbi0yXS0+RnVsbFNjb3JlRm9yZ290U3RhdGUodm9jYWJfaWRzICsgMSwgdm9jYWJfaWRzICsgbiwgKnZvY2FiX2lkcywgaWdub3JlZCkucHJvYjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgU2Vjb25kPiBib29sIE1hcmtFeHRlbmRzKFJlc3RXZWlnaHRzICZ3ZWlnaHRzLCBjb25zdCBTZWNvbmQgJikgY29uc3QgewotICAgICAgdXRpbDo6VW5zZXRTaWduKHdlaWdodHMucHJvYik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3Qgc3RhdGljIGJvb2wga01hcmtFdmVuTG93ZXIgPSBmYWxzZTsKLQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB1bmlncmFtc187Ci0KLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBNb2RlbCo+IG1vZGVsc187Ci19OwotCi19IC8vIG5hbWVzcGFjZSBuZ3JhbQotfSAvLyBuYW1lc3BhY2UgbG0KLQotI2VuZGlmIC8vIExNX1ZBTFVFX0JVSUxEX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS92aXJ0dWFsX2ludGVyZmFjZS5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS92aXJ0dWFsX2ludGVyZmFjZS5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyNjkwZS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vdmlydHVhbF9pbnRlcmZhY2UuaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotI2lmbmRlZiBMTV9WSVJUVUFMX0lOVEVSRkFDRV9ICi0jZGVmaW5lIExNX1ZJUlRVQUxfSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgImxtL3JldHVybi5oaCIKLSNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgotI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlLmhoIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1uYW1lc3BhY2UgbG0gewotbmFtZXNwYWNlIGJhc2UgewotCi10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgVj4gY2xhc3MgTW9kZWxGYWNhZGU7Ci0KLS8qIFZvY2FidWxhcnkgaW50ZXJmYWNlLiAgQ2FsbCBJbmRleChzdHJpbmcpIGFuZCBnZXQgYSB3b3JkIGluZGV4IGZvciB1c2UgaW4KLSAqIGNhbGxpbmcgTW9kZWwuICBJdCBwcm92aWRlcyBmYXN0ZXIgY29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciA8cz4sIDwvcz4sIGFuZAotICogPHVuaz4gYWx0aG91Z2ggeW91IGNhbiBhbHNvIGZpbmQgdGhlc2UgdXNpbmcgSW5kZXguICAKLSAqCi0gKiBTb21lIG1vZGVscyBkbyBub3QgbG9hZCB0aGUgbWFwcGluZyBmcm9tIGluZGV4IHRvIHN0cmluZy4gIElmIHlvdSBuZWVkIHRoaXMsCi0gKiBjaGVjayBpZiB0aGUgbW9kZWwgVm9jYWJ1bGFyeSBjbGFzcyBpbXBsZW1lbnRzIHN1Y2ggYSBmdW5jdGlvbiBhbmQgYWNjZXNzIGl0Ci0gKiBkaXJlY3RseS4gIAotICoKLSAqIFRoZSBWb2NhYnVsYXJ5IG9iamVjdCBpcyBhbHdheXMgb3duZWQgYnkgdGhlIE1vZGVsIGFuZCBjYW4gYmUgcmV0cmlldmVkIGZyb20KLSAqIHRoZSBNb2RlbCB1c2luZyBCYXNlVm9jYWJ1bGFyeSgpIGZvciB0aGlzIGFic3RyYWN0IGludGVyZmFjZSBvcgotICogR2V0Vm9jYWJ1bGFyeSgpIGZvciB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIChpbiB3aGljaCBjYXNlIHlvdSdsbCBuZWVkIHRoZQotICogYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNb2RlbCB0b28pLiAgCi0gKi8KLWNsYXNzIFZvY2FidWxhcnkgewotICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+Vm9jYWJ1bGFyeSgpOwotCi0gICAgV29yZEluZGV4IEJlZ2luU2VudGVuY2UoKSBjb25zdCB7IHJldHVybiBiZWdpbl9zZW50ZW5jZV87IH0KLSAgICBXb3JkSW5kZXggRW5kU2VudGVuY2UoKSBjb25zdCB7IHJldHVybiBlbmRfc2VudGVuY2VfOyB9Ci0gICAgV29yZEluZGV4IE5vdEZvdW5kKCkgY29uc3QgeyByZXR1cm4gbm90X2ZvdW5kXzsgfQotCi0gICAgLyogTW9zdCBpbXBsZW1lbnRhdGlvbnMgYWxsb3cgU3RyaW5nUGllY2UgbG9va3VwcyBhbmQgbmVlZCBvbmx5IG92ZXJyaWRlCi0gICAgICogSW5kZXgoU3RyaW5nUGllY2UpLiAgU1JJIHJlcXVpcmVzIG51bGwgdGVybWluYXRpb24gYW5kIG92ZXJyaWRlcyBhbGwKLSAgICAgKiB0aHJlZSBtZXRob2RzLiAgCi0gICAgICovCi0gICAgdmlydHVhbCBXb3JkSW5kZXggSW5kZXgoY29uc3QgU3RyaW5nUGllY2UgJnN0cikgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgV29yZEluZGV4IEluZGV4KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIGNvbnN0IHsKLSAgICAgIHJldHVybiBJbmRleChTdHJpbmdQaWVjZShzdHIpKTsKLSAgICB9Ci0gICAgdmlydHVhbCBXb3JkSW5kZXggSW5kZXgoY29uc3QgY2hhciAqc3RyKSBjb25zdCB7Ci0gICAgICByZXR1cm4gSW5kZXgoU3RyaW5nUGllY2Uoc3RyKSk7Ci0gICAgfQotCi0gIHByb3RlY3RlZDoKLSAgICAvLyBDYWxsIFNldFNwZWNpYWwgYWZ0ZXJ3YXJkLiAgCi0gICAgVm9jYWJ1bGFyeSgpIHt9Ci0KLSAgICBWb2NhYnVsYXJ5KFdvcmRJbmRleCBiZWdpbl9zZW50ZW5jZSwgV29yZEluZGV4IGVuZF9zZW50ZW5jZSwgV29yZEluZGV4IG5vdF9mb3VuZCkgewotICAgICAgU2V0U3BlY2lhbChiZWdpbl9zZW50ZW5jZSwgZW5kX3NlbnRlbmNlLCBub3RfZm91bmQpOwotICAgIH0KLQotICAgIHZvaWQgU2V0U3BlY2lhbChXb3JkSW5kZXggYmVnaW5fc2VudGVuY2UsIFdvcmRJbmRleCBlbmRfc2VudGVuY2UsIFdvcmRJbmRleCBub3RfZm91bmQpOwotCi0gICAgV29yZEluZGV4IGJlZ2luX3NlbnRlbmNlXywgZW5kX3NlbnRlbmNlXywgbm90X2ZvdW5kXzsKLQotICBwcml2YXRlOgotICAgIC8vIERpc2FibGUgY29weSBjb25zdHJ1Y3RvcnMuICBUaGV5J3JlIHByaXZhdGUgYW5kIHVuZGVmaW5lZC4gCi0gICAgLy8gRXJzYXR6IGJvb3N0Ojpub25jb3B5YWJsZS4KLSAgICBWb2NhYnVsYXJ5KGNvbnN0IFZvY2FidWxhcnkgJik7Ci0gICAgVm9jYWJ1bGFyeSAmb3BlcmF0b3I9KGNvbnN0IFZvY2FidWxhcnkgJik7Ci19OwotCi0vKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gYWNjZXNzIGEgTW9kZWwuICAKLSAqCi0gKgotICogT1BUSU9OIDE6IEFjY2VzcyB0aGUgTW9kZWwgZGlyZWN0bHkgKGUuZy4gbG06Om5ncmFtOjpNb2RlbCBpbiBtb2RlbC5oaCkuCi0gKgotICogRXZlcnkgTW9kZWwgaW1wbGVtZW50cyB0aGUgc2NvcmluZyBmdW5jdGlvbjoKLSAqIGZsb2F0IFNjb3JlKAotICogICBjb25zdCBNb2RlbDo6U3RhdGUgJmluX3N0YXRlLAotICogICBjb25zdCBXb3JkSW5kZXggbmV3X3dvcmQsCi0gKiAgIE1vZGVsOjpTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdDsKLSAqCi0gKiBJdCBjYW4gYWxzbyByZXR1cm4gdGhlIGxlbmd0aCBvZiBuLWdyYW0gbWF0Y2hlZCBieSB0aGUgbW9kZWw6Ci0gKiBGdWxsU2NvcmVSZXR1cm4gRnVsbFNjb3JlKAotICogICBjb25zdCBNb2RlbDo6U3RhdGUgJmluX3N0YXRlLAotICogICBjb25zdCBXb3JkSW5kZXggbmV3X3dvcmQsCi0gKiAgIE1vZGVsOjpTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdDsKLSAqCi0gKgotICogVGhlcmUgYXJlIGFsc28gYWNjZXNzb3IgZnVuY3Rpb25zOgotICogY29uc3QgU3RhdGUgJkJlZ2luU2VudGVuY2VTdGF0ZSgpIGNvbnN0OwotICogY29uc3QgU3RhdGUgJk51bGxDb250ZXh0U3RhdGUoKSBjb25zdDsKLSAqIGNvbnN0IFZvY2FidWxhcnkgJkdldFZvY2FidWxhcnkoKSBjb25zdDsKLSAqIHVuc2lnbmVkIGludCBPcmRlcigpIGNvbnN0OwotICoKLSAqIE5COiBJbiBjYXNlIHlvdSdyZSB3b25kZXJpbmcgd2h5IHRoZSBtb2RlbCBpbXBsZW1lbnRhdGlvbiBsb29rcyBsaWtlIGl0J3MKLSAqIG1pc3NpbmcgdGhlc2UgbWV0aG9kcywgc2VlIGZhY2FkZS5oaC4gIAotICoKLSAqIFRoaXMgaXMgdGhlIGZhc3Rlc3Qgd2F5IHRvIHVzZSBhIG1vZGVsIGFuZCBwcmVzZW50cyBhIG5vcm1hbCBTdGF0ZSBjbGFzcyB0bwotICogYmUgaW5jbHVkZWQgaW4gYSBoeXBvdGhlc2lzIHN0YXRlIHN0cnVjdHVyZS4gIAotICoKLSAqCi0gKiBPUFRJT04gMjogVXNlIHRoZSB2aXJ0dWFsIGludGVyZmFjZSBiZWxvdy4gIAotICoKLSAqIFRoZSB2aXJ0dWFsIGludGVyZmFjZSBhbGxvdyB5b3UgdG8gZGVjaWRlIHdoaWNoIE1vZGVsIHRvIHVzZSBhdCBydW50aW1lIAotICogd2l0aG91dCB0ZW1wbGF0aXppbmcgZXZlcnl0aGluZyBvbiB0aGUgTW9kZWwgdHlwZS4gIEhvd2V2ZXIsIGVhY2ggTW9kZWwgaGFzCi0gKiBpdHMgb3duIFN0YXRlIGNsYXNzLCBzbyBhIHNpbmdsZSBTdGF0ZSBjYW5ub3QgYmUgZWZmaWNpZW50bHkgcHJvdmlkZWQgKGl0Ci0gKiB3b3VsZCByZXF1aXJlIHVzaW5nIHRoZSBtYXhpbXVtIG1lbW9yeSBvZiBhbnkgTW9kZWwncyBTdGF0ZSBvciBtZW1vcnkKLSAqIGFsbG9jYXRpb24gd2l0aCBlYWNoIGxvb2t1cCkuICBUaGlzIG1lYW5zIHlvdSBiZWNvbWUgcmVzcG9uc2libGUgZm9yCi0gKiBhbGxvY2F0aW5nIG1lbW9yeSB3aXRoIHNpemUgU3RhdGVTaXplKCkgYW5kIHBhc3NpbmcgaXQgdG8gdGhlIFNjb3JlIG9yIAotICogRnVsbFNjb3JlIGZ1bmN0aW9ucyBwcm92aWRlZCBoZXJlLiAgCi0gKgotICogRm9yIGV4YW1wbGUsIGNkZWMgaGFzIGEgc3RkOjpzdHJpbmcgY29udGFpbmluZyB0aGUgZW50aXJlIHN0YXRlIG9mIGEKLSAqIGh5cG90aGVzaXMuICBJdCBjYW4gcmVzZXJ2ZSBTdGF0ZVNpemUgYnl0ZXMgaW4gdGhpcyBzdHJpbmcgZm9yIHRoZSBtb2RlbAotICogc3RhdGUuICAKLSAqCi0gKiBBbGwgdGhlIFN0YXRlIG9iamVjdHMgYXJlIFBPRCwgc28gaXQncyBvayB0byB1c2UgcmF3IG1lbW9yeSBmb3Igc3RvcmluZwotICogU3RhdGUuCi0gKiBpbl9zdGF0ZSBhbmQgb3V0X3N0YXRlIG11c3Qgbm90IGhhdmUgdGhlIHNhbWUgYWRkcmVzcy4gCi0gKi8KLWNsYXNzIE1vZGVsIHsKLSAgcHVibGljOgotICAgIHZpcnR1YWwgfk1vZGVsKCk7Ci0KLSAgICBzaXplX3QgU3RhdGVTaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfc2l6ZV87IH0KLSAgICBjb25zdCB2b2lkICpCZWdpblNlbnRlbmNlTWVtb3J5KCkgY29uc3QgeyByZXR1cm4gYmVnaW5fc2VudGVuY2VfbWVtb3J5XzsgfQotICAgIHZvaWQgQmVnaW5TZW50ZW5jZVdyaXRlKHZvaWQgKnRvKSBjb25zdCB7IG1lbWNweSh0bywgYmVnaW5fc2VudGVuY2VfbWVtb3J5XywgU3RhdGVTaXplKCkpOyB9Ci0gICAgY29uc3Qgdm9pZCAqTnVsbENvbnRleHRNZW1vcnkoKSBjb25zdCB7IHJldHVybiBudWxsX2NvbnRleHRfbWVtb3J5XzsgfQotICAgIHZvaWQgTnVsbENvbnRleHRXcml0ZSh2b2lkICp0bykgY29uc3QgeyBtZW1jcHkodG8sIG51bGxfY29udGV4dF9tZW1vcnlfLCBTdGF0ZVNpemUoKSk7IH0KLQotICAgIC8vIFJlcXVpcmVzIGluX3N0YXRlICE9IG91dF9zdGF0ZQotICAgIHZpcnR1YWwgZmxvYXQgQmFzZVNjb3JlKGNvbnN0IHZvaWQgKmluX3N0YXRlLCBjb25zdCBXb3JkSW5kZXggbmV3X3dvcmQsIHZvaWQgKm91dF9zdGF0ZSkgY29uc3QgPSAwOwotCi0gICAgLy8gUmVxdWlyZXMgaW5fc3RhdGUgIT0gb3V0X3N0YXRlCi0gICAgdmlydHVhbCBGdWxsU2NvcmVSZXR1cm4gQmFzZUZ1bGxTY29yZShjb25zdCB2b2lkICppbl9zdGF0ZSwgY29uc3QgV29yZEluZGV4IG5ld193b3JkLCB2b2lkICpvdXRfc3RhdGUpIGNvbnN0ID0gMDsKLQotICAgIC8vIFByZWZlciB0byB1c2UgRnVsbFNjb3JlLiAgVGhlIGNvbnRleHQgd29yZHMgc2hvdWxkIGJlIHByb3ZpZGVkIGluIHJldmVyc2Ugb3JkZXIuCi0gICAgdmlydHVhbCBGdWxsU2NvcmVSZXR1cm4gQmFzZUZ1bGxTY29yZUZvcmdvdFN0YXRlKGNvbnN0IFdvcmRJbmRleCAqY29udGV4dF9yYmVnaW4sIGNvbnN0IFdvcmRJbmRleCAqY29udGV4dF9yZW5kLCBjb25zdCBXb3JkSW5kZXggbmV3X3dvcmQsIHZvaWQgKm91dF9zdGF0ZSkgY29uc3QgPSAwOwotCi0gICAgdW5zaWduZWQgY2hhciBPcmRlcigpIGNvbnN0IHsgcmV0dXJuIG9yZGVyXzsgfQotCi0gICAgY29uc3QgVm9jYWJ1bGFyeSAmQmFzZVZvY2FidWxhcnkoKSBjb25zdCB7IHJldHVybiAqYmFzZV92b2NhYl87IH0KLQotICBwcml2YXRlOgotICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWPiBmcmllbmQgY2xhc3MgTW9kZWxGYWNhZGU7Ci0gICAgZXhwbGljaXQgTW9kZWwoc2l6ZV90IHN0YXRlX3NpemUpIDogc3RhdGVfc2l6ZV8oc3RhdGVfc2l6ZSkge30KLQotICAgIGNvbnN0IHNpemVfdCBzdGF0ZV9zaXplXzsKLSAgICBjb25zdCB2b2lkICpiZWdpbl9zZW50ZW5jZV9tZW1vcnlfLCAqbnVsbF9jb250ZXh0X21lbW9yeV87Ci0KLSAgICBjb25zdCBWb2NhYnVsYXJ5ICpiYXNlX3ZvY2FiXzsKLQotICAgIHVuc2lnbmVkIGNoYXIgb3JkZXJfOwotCi0gICAgLy8gRGlzYWJsZSBjb3B5IGNvbnN0cnVjdG9ycy4gIFRoZXkncmUgcHJpdmF0ZSBhbmQgdW5kZWZpbmVkLiAKLSAgICAvLyBFcnNhdHogYm9vc3Q6Om5vbmNvcHlhYmxlLgotICAgIE1vZGVsKGNvbnN0IE1vZGVsICYpOwotICAgIE1vZGVsICZvcGVyYXRvcj0oY29uc3QgTW9kZWwgJik7Ci19OwotCi19IC8vIG1hbWVzcGFjZSBiYXNlCi19IC8vIG5hbWVzcGFjZSBsbQotCi0jZW5kaWYgLy8gTE1fVklSVFVBTF9JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3ZvY2FiLmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3ZvY2FiLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjg1ZDI3Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS92b2NhYi5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0jaW5jbHVkZSAibG0vdm9jYWIuaGgiCi0KLSNpbmNsdWRlICJsbS9iaW5hcnlfZm9ybWF0LmhoIgotI2luY2x1ZGUgImxtL2VudW1lcmF0ZV92b2NhYi5oaCIKLSNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAibG0vY29uZmlnLmhoIgotI2luY2x1ZGUgImxtL3dlaWdodHMuaGgiCi0jaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAidXRpbC9maWxlLmhoIgotI2luY2x1ZGUgInV0aWwvam9pbnRfc29ydC5oaCIKLSNpbmNsdWRlICJ1dGlsL211cm11cl9oYXNoLmhoIgotI2luY2x1ZGUgInV0aWwvcHJvYmluZ19oYXNoX3RhYmxlLmhoIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBsbSB7Ci1uYW1lc3BhY2UgbmdyYW0gewotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLXVpbnQ2NF90IEhhc2hGb3JWb2NhYihjb25zdCBjaGFyICpzdHIsIHN0ZDo6c2l6ZV90IGxlbikgewotICAvLyBUaGlzIHByb3ZlZCBmYXN0ZXIgdGhhbiBCb29zdCdzIGhhc2ggaW4gc3BlZWQgdHJpYWxzOiB0b3RhbCBsb2FkIHRpbWUgTXVybXVyIDY3MDkwMDAwLCBCb29zdCA3MjIxMDAwMAotICAvLyBDaG9zZSB0byB1c2UgNjRBIGluc3RlYWQgb2YgbmF0aXZlIHNvIGJpbmFyeSBmb3JtYXQgd2lsbCBiZSBwb3J0YWJsZSBhY3Jvc3MgNjQgYW5kIDMyIGJpdC4gIAotICByZXR1cm4gdXRpbDo6TXVybXVySGFzaDY0QShzdHIsIGxlbiwgMCk7Ci19Ci19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotbmFtZXNwYWNlIHsKLS8vIE5vcm1hbGx5IHN0YXRpYyBpbml0aWFsaXphdGlvbiBpcyBhIGJhZCBpZGVhIGJ1dCBNdXJtdXJIYXNoIGlzIHB1cmUgYXJpdGhtZXRpYywgc28gdGhpcyBpcyBvay4gIAotY29uc3QgdWludDY0X3Qga1Vua25vd25IYXNoID0gZGV0YWlsOjpIYXNoRm9yVm9jYWIoIjx1bms+IiwgNSk7Ci0vLyBTYWRseSBzb21lIExNcyBoYXZlIDxVTks+LiAgCi1jb25zdCB1aW50NjRfdCBrVW5rbm93bkNhcEhhc2ggPSBkZXRhaWw6Okhhc2hGb3JWb2NhYigiPFVOSz4iLCA1KTsKLQotdm9pZCBSZWFkV29yZHMoaW50IGZkLCBFbnVtZXJhdGVWb2NhYiAqZW51bWVyYXRlLCBXb3JkSW5kZXggZXhwZWN0ZWRfY291bnQsIHVpbnQ2NF90IG9mZnNldCkgewotICB1dGlsOjpTZWVrT3JUaHJvdyhmZCwgb2Zmc2V0KTsKLSAgLy8gQ2hlY2sgdGhhdCB3ZSdyZSBhdCB0aGUgcmlnaHQgcGxhY2UgYnkgcmVhZGluZyA8dW5rPiB3aGljaCBpcyBhbHdheXMgZmlyc3QuCi0gIGNoYXIgY2hlY2tfdW5rWzZdOwotICB1dGlsOjpSZWFkT3JUaHJvdyhmZCwgY2hlY2tfdW5rLCA2KTsKLSAgVVRJTF9USFJPV19JRigKLSAgICAgIG1lbWNtcChjaGVja191bmssICI8dW5rPiIsIDYpLAotICAgICAgRm9ybWF0TG9hZEV4Y2VwdGlvbiwgCi0gICAgICAiVm9jYWJ1bGFyeSB3b3JkcyBhcmUgaW4gdGhlIHdyb25nIHBsYWNlLiAgVGhpcyBjb3VsZCBiZSBiZWNhdXNlIHRoZSBiaW5hcnkgZmlsZSB3YXMgYnVpbHQgd2l0aCBzdGFsZSBnY2MgYW5kIG9sZCBrZW5sbS4gIFN0YWxlIGdjYywgaW5jbHVkaW5nIHRoZSBnY2MgZGlzdHJpYnV0ZWQgd2l0aCBSZWRIYXQgYW5kIE9TIFgsIGhhcyBhIGJ1ZyB0aGF0IGlnbm9yZXMgcHJhZ21hIHBhY2sgZm9yIHRlbXBsYXRlLWRlcGVuZGVudCB0eXBlcy4gIE5ldyBrZW5sbSB3b3JrcyBhcm91bmQgdGhpcywgc28geW91J2xsIHNhdmUgbWVtb3J5IGJ1dCBoYXZlIHRvIHJlYnVpbGQgYW55IGJpbmFyeSBmaWxlcyB1c2luZyB0aGUgcHJvYmluZyBkYXRhIHN0cnVjdHVyZS4iKTsKLSAgaWYgKCFlbnVtZXJhdGUpIHJldHVybjsKLSAgZW51bWVyYXRlLT5BZGQoMCwgIjx1bms+Iik7Ci0KLSAgLy8gUmVhZCBhbGwgdGhlIHdvcmRzIGFmdGVyIHVuay4KLSAgY29uc3Qgc3RkOjpzaXplX3Qga0luaXRpYWxSZWFkID0gMTYzODQ7Ci0gIHN0ZDo6c3RyaW5nIGJ1ZjsKLSAgYnVmLnJlc2VydmUoa0luaXRpYWxSZWFkICsgMTAwKTsKLSAgYnVmLnJlc2l6ZShrSW5pdGlhbFJlYWQpOwotICBXb3JkSW5kZXggaW5kZXggPSAxOyAvLyBSZWFkIDx1bms+IGFscmVhZHkuCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgc3RkOjpzaXplX3QgZ290ID0gdXRpbDo6UmVhZE9yRU9GKGZkLCAmYnVmWzBdLCBrSW5pdGlhbFJlYWQpOwotICAgIGlmIChnb3QgPT0gMCkgYnJlYWs7Ci0gICAgYnVmLnJlc2l6ZShnb3QpOwotICAgIHdoaWxlIChidWZbYnVmLnNpemUoKSAtIDFdKSB7Ci0gICAgICBjaGFyIG5leHRfY2hhcjsKLSAgICAgIHV0aWw6OlJlYWRPclRocm93KGZkLCAmbmV4dF9jaGFyLCAxKTsKLSAgICAgIGJ1Zi5wdXNoX2JhY2sobmV4dF9jaGFyKTsKLSAgICB9Ci0gICAgLy8gT2sgbm93IHdlIGhhdmUgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MuICAKLSAgICBmb3IgKGNvbnN0IGNoYXIgKmkgPSBidWYuZGF0YSgpOyBpICE9IGJ1Zi5kYXRhKCkgKyBidWYuc2l6ZSgpOykgewotICAgICAgc3RkOjpzaXplX3QgbGVuZ3RoID0gc3RybGVuKGkpOwotICAgICAgZW51bWVyYXRlLT5BZGQoaW5kZXgrKywgU3RyaW5nUGllY2UoaSwgbGVuZ3RoKSk7Ci0gICAgICBpICs9IGxlbmd0aCArIDEgLyogbnVsbCBieXRlICovOwotICAgIH0KLSAgfQotCi0gIFVUSUxfVEhST1dfSUYoZXhwZWN0ZWRfY291bnQgIT0gaW5kZXgsIEZvcm1hdExvYWRFeGNlcHRpb24sICJUaGUgYmluYXJ5IGZpbGUgaGFzIHRoZSB3cm9uZyBudW1iZXIgb2Ygd29yZHMgYXQgdGhlIGVuZC4gIFRoaXMgY291bGQgYmUgY2F1c2VkIGJ5IGEgdHJ1bmNhdGVkIGJpbmFyeSBmaWxlLiIpOwotfQotCi19IC8vIG5hbWVzcGFjZQotCi1Xcml0ZVdvcmRzV3JhcHBlcjo6V3JpdGVXb3Jkc1dyYXBwZXIoRW51bWVyYXRlVm9jYWIgKmlubmVyKSA6IGlubmVyXyhpbm5lcikge30KLVdyaXRlV29yZHNXcmFwcGVyOjp+V3JpdGVXb3Jkc1dyYXBwZXIoKSB7fQotCi12b2lkIFdyaXRlV29yZHNXcmFwcGVyOjpBZGQoV29yZEluZGV4IGluZGV4LCBjb25zdCBTdHJpbmdQaWVjZSAmc3RyKSB7Ci0gIGlmIChpbm5lcl8pIGlubmVyXy0+QWRkKGluZGV4LCBzdHIpOwotICBidWZmZXJfLmFwcGVuZChzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKTsKLSAgYnVmZmVyXy5wdXNoX2JhY2soMCk7Ci19Ci0KLVNvcnRlZFZvY2FidWxhcnk6OlNvcnRlZFZvY2FidWxhcnkoKSA6IGJlZ2luXyhOVUxMKSwgZW5kXyhOVUxMKSwgZW51bWVyYXRlXyhOVUxMKSB7fQotCi11aW50NjRfdCBTb3J0ZWRWb2NhYnVsYXJ5OjpTaXplKHVpbnQ2NF90IGVudHJpZXMsIGNvbnN0IENvbmZpZyAmLypjb25maWcqLykgewotICAvLyBMZWFkIHdpdGggdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgCi0gIHJldHVybiBzaXplb2YodWludDY0X3QpICsgc2l6ZW9mKHVpbnQ2NF90KSAqIGVudHJpZXM7Ci19Ci0KLXZvaWQgU29ydGVkVm9jYWJ1bGFyeTo6U2V0dXBNZW1vcnkodm9pZCAqc3RhcnQsIHN0ZDo6c2l6ZV90IGFsbG9jYXRlZCwgc3RkOjpzaXplX3QgZW50cmllcywgY29uc3QgQ29uZmlnICZjb25maWcpIHsKLSAgYXNzZXJ0KGFsbG9jYXRlZCA+PSBTaXplKGVudHJpZXMsIGNvbmZpZykpOwotICAvLyBMZWF2ZSBzcGFjZSBmb3IgbnVtYmVyIG9mIGVudHJpZXMuICAKLSAgYmVnaW5fID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCo+KHN0YXJ0KSArIDE7Ci0gIGVuZF8gPSBiZWdpbl87Ci0gIHNhd191bmtfID0gZmFsc2U7Ci19Ci0KLXZvaWQgU29ydGVkVm9jYWJ1bGFyeTo6UmVsb2NhdGUodm9pZCAqbmV3X3N0YXJ0KSB7Ci0gIHN0ZDo6c2l6ZV90IGRlbHRhID0gZW5kXyAtIGJlZ2luXzsKLSAgYmVnaW5fID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCo+KG5ld19zdGFydCkgKyAxOwotICBlbmRfID0gYmVnaW5fICsgZGVsdGE7Ci19Ci0KLXZvaWQgU29ydGVkVm9jYWJ1bGFyeTo6Q29uZmlndXJlRW51bWVyYXRlKEVudW1lcmF0ZVZvY2FiICp0bywgc3RkOjpzaXplX3QgbWF4X2VudHJpZXMpIHsKLSAgZW51bWVyYXRlXyA9IHRvOwotICBpZiAoZW51bWVyYXRlXykgewotICAgIGVudW1lcmF0ZV8tPkFkZCgwLCAiPHVuaz4iKTsKLSAgICBzdHJpbmdzX3RvX2VudW1lcmF0ZV8ucmVzaXplKG1heF9lbnRyaWVzKTsKLSAgfQotfQotCi1Xb3JkSW5kZXggU29ydGVkVm9jYWJ1bGFyeTo6SW5zZXJ0KGNvbnN0IFN0cmluZ1BpZWNlICZzdHIpIHsKLSAgdWludDY0X3QgaGFzaGVkID0gZGV0YWlsOjpIYXNoRm9yVm9jYWIoc3RyKTsKLSAgaWYgKGhhc2hlZCA9PSBrVW5rbm93bkhhc2ggfHwgaGFzaGVkID09IGtVbmtub3duQ2FwSGFzaCkgewotICAgIHNhd191bmtfID0gdHJ1ZTsKLSAgICByZXR1cm4gMDsKLSAgfQotICAqZW5kXyA9IGhhc2hlZDsKLSAgaWYgKGVudW1lcmF0ZV8pIHsKLSAgICB2b2lkICpjb3BpZWQgPSBzdHJpbmdfYmFja2luZ18uQWxsb2NhdGUoc3RyLnNpemUoKSk7Ci0gICAgbWVtY3B5KGNvcGllZCwgc3RyLmRhdGEoKSwgc3RyLnNpemUoKSk7Ci0gICAgc3RyaW5nc190b19lbnVtZXJhdGVfW2VuZF8gLSBiZWdpbl9dID0gU3RyaW5nUGllY2Uoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGNvcGllZCksIHN0ci5zaXplKCkpOwotICB9Ci0gICsrZW5kXzsKLSAgLy8gVGhpcyBpcyAxICsgdGhlIG9mZnNldCB3aGVyZSBpdCB3YXMgaW5zZXJ0ZWQgdG8gbWFrZSByb29tIGZvciB1bmsuICAKLSAgcmV0dXJuIGVuZF8gLSBiZWdpbl87Ci19Ci0KLXZvaWQgU29ydGVkVm9jYWJ1bGFyeTo6RmluaXNoZWRMb2FkaW5nKFByb2JCYWNrb2ZmICpyZW9yZGVyX3ZvY2FiKSB7Ci0gIGlmIChlbnVtZXJhdGVfKSB7Ci0gICAgaWYgKCFzdHJpbmdzX3RvX2VudW1lcmF0ZV8uZW1wdHkoKSkgewotICAgICAgdXRpbDo6UGFpcmVkSXRlcmF0b3I8UHJvYkJhY2tvZmYqLCBTdHJpbmdQaWVjZSo+IHZhbHVlcyhyZW9yZGVyX3ZvY2FiICsgMSwgJipzdHJpbmdzX3RvX2VudW1lcmF0ZV8uYmVnaW4oKSk7Ci0gICAgICB1dGlsOjpKb2ludFNvcnQoYmVnaW5fLCBlbmRfLCB2YWx1ZXMpOwotICAgIH0KLSAgICBmb3IgKFdvcmRJbmRleCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PFdvcmRJbmRleD4oZW5kXyAtIGJlZ2luXyk7ICsraSkgewotICAgICAgLy8gPHVuaz4gc3RyaWtlcyBhZ2FpbjogKzEgaGVyZS4gIAotICAgICAgZW51bWVyYXRlXy0+QWRkKGkgKyAxLCBzdHJpbmdzX3RvX2VudW1lcmF0ZV9baV0pOwotICAgIH0KLSAgICBzdHJpbmdzX3RvX2VudW1lcmF0ZV8uY2xlYXIoKTsKLSAgICBzdHJpbmdfYmFja2luZ18uRnJlZUFsbCgpOwotICB9IGVsc2UgewotICAgIHV0aWw6OkpvaW50U29ydChiZWdpbl8sIGVuZF8sIHJlb3JkZXJfdm9jYWIgKyAxKTsKLSAgfQotICBTZXRTcGVjaWFsKEluZGV4KCI8cz4iKSwgSW5kZXgoIjwvcz4iKSwgMCk7Ci0gIC8vIFNhdmUgc2l6ZS4gIEV4Y2x1ZGVzIFVOSy4gIAotICAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPihiZWdpbl8pIC0gMSkgPSBlbmRfIC0gYmVnaW5fOwotICAvLyBJbmNsdWRlcyBVTksuCi0gIGJvdW5kXyA9IGVuZF8gLSBiZWdpbl8gKyAxOwotfQotCi12b2lkIFNvcnRlZFZvY2FidWxhcnk6OkxvYWRlZEJpbmFyeShib29sIGhhdmVfd29yZHMsIGludCBmZCwgRW51bWVyYXRlVm9jYWIgKnRvLCB1aW50NjRfdCBvZmZzZXQpIHsKLSAgZW5kXyA9IGJlZ2luXyArICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCo+KGJlZ2luXykgLSAxKTsKLSAgU2V0U3BlY2lhbChJbmRleCgiPHM+IiksIEluZGV4KCI8L3M+IiksIDApOwotICBib3VuZF8gPSBlbmRfIC0gYmVnaW5fICsgMTsKLSAgaWYgKGhhdmVfd29yZHMpIFJlYWRXb3JkcyhmZCwgdG8sIGJvdW5kXywgb2Zmc2V0KTsKLX0KLQotbmFtZXNwYWNlIHsKLWNvbnN0IHVuc2lnbmVkIGludCBrUHJvYmluZ1ZvY2FidWxhcnlWZXJzaW9uID0gMDsKLX0gLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBkZXRhaWwgewotc3RydWN0IFByb2JpbmdWb2NhYnVsYXJ5SGVhZGVyIHsKLSAgLy8gTG93ZXN0IHVudXNlZCB2b2NhYiBpZC4gIFRoaXMgaXMgYWxzbyB0aGUgbnVtYmVyIG9mIHdvcmRzLCBpbmNsdWRpbmcgPHVuaz4uICAKLSAgdW5zaWduZWQgaW50IHZlcnNpb247Ci0gIFdvcmRJbmRleCBib3VuZDsKLX07Ci19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotUHJvYmluZ1ZvY2FidWxhcnk6OlByb2JpbmdWb2NhYnVsYXJ5KCkgOiBlbnVtZXJhdGVfKE5VTEwpIHt9Ci0KLXVpbnQ2NF90IFByb2JpbmdWb2NhYnVsYXJ5OjpTaXplKHVpbnQ2NF90IGVudHJpZXMsIGZsb2F0IHByb2JpbmdfbXVsdGlwbGllcikgewotICByZXR1cm4gQUxJR044KHNpemVvZihkZXRhaWw6OlByb2JpbmdWb2NhYnVsYXJ5SGVhZGVyKSkgKyBMb29rdXA6OlNpemUoZW50cmllcywgcHJvYmluZ19tdWx0aXBsaWVyKTsKLX0KLQotdWludDY0X3QgUHJvYmluZ1ZvY2FidWxhcnk6OlNpemUodWludDY0X3QgZW50cmllcywgY29uc3QgQ29uZmlnICZjb25maWcpIHsKLSAgcmV0dXJuIFNpemUoZW50cmllcywgY29uZmlnLnByb2JpbmdfbXVsdGlwbGllcik7Ci19Ci0KLXZvaWQgUHJvYmluZ1ZvY2FidWxhcnk6OlNldHVwTWVtb3J5KHZvaWQgKnN0YXJ0LCBzdGQ6OnNpemVfdCBhbGxvY2F0ZWQpIHsKLSAgaGVhZGVyXyA9IHN0YXRpY19jYXN0PGRldGFpbDo6UHJvYmluZ1ZvY2FidWxhcnlIZWFkZXIqPihzdGFydCk7Ci0gIGxvb2t1cF8gPSBMb29rdXAoc3RhdGljX2Nhc3Q8dWludDhfdCo+KHN0YXJ0KSArIEFMSUdOOChzaXplb2YoZGV0YWlsOjpQcm9iaW5nVm9jYWJ1bGFyeUhlYWRlcikpLCBhbGxvY2F0ZWQpOwotICBib3VuZF8gPSAxOwotICBzYXdfdW5rXyA9IGZhbHNlOwotfQotCi12b2lkIFByb2JpbmdWb2NhYnVsYXJ5OjpSZWxvY2F0ZSh2b2lkICpuZXdfc3RhcnQpIHsKLSAgaGVhZGVyXyA9IHN0YXRpY19jYXN0PGRldGFpbDo6UHJvYmluZ1ZvY2FidWxhcnlIZWFkZXIqPihuZXdfc3RhcnQpOwotICBsb29rdXBfLlJlbG9jYXRlKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihuZXdfc3RhcnQpICsgQUxJR044KHNpemVvZihkZXRhaWw6OlByb2JpbmdWb2NhYnVsYXJ5SGVhZGVyKSkpOwotfQotCi12b2lkIFByb2JpbmdWb2NhYnVsYXJ5OjpDb25maWd1cmVFbnVtZXJhdGUoRW51bWVyYXRlVm9jYWIgKnRvLCBzdGQ6OnNpemVfdCAvKm1heF9lbnRyaWVzKi8pIHsKLSAgZW51bWVyYXRlXyA9IHRvOwotICBpZiAoZW51bWVyYXRlXykgewotICAgIGVudW1lcmF0ZV8tPkFkZCgwLCAiPHVuaz4iKTsKLSAgfQotfQotCi1Xb3JkSW5kZXggUHJvYmluZ1ZvY2FidWxhcnk6Okluc2VydChjb25zdCBTdHJpbmdQaWVjZSAmc3RyKSB7Ci0gIHVpbnQ2NF90IGhhc2hlZCA9IGRldGFpbDo6SGFzaEZvclZvY2FiKHN0cik7Ci0gIC8vIFByZXZlbnQgdW5rbm93biBmcm9tIGdvaW5nIGludG8gdGhlIHRhYmxlLiAgCi0gIGlmIChoYXNoZWQgPT0ga1Vua25vd25IYXNoIHx8IGhhc2hlZCA9PSBrVW5rbm93bkNhcEhhc2gpIHsKLSAgICBzYXdfdW5rXyA9IHRydWU7Ci0gICAgcmV0dXJuIDA7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGVudW1lcmF0ZV8pIGVudW1lcmF0ZV8tPkFkZChib3VuZF8sIHN0cik7Ci0gICAgbG9va3VwXy5JbnNlcnQoUHJvYmluZ1ZvY2FidWxhcnlFbnRyeTo6TWFrZShoYXNoZWQsIGJvdW5kXykpOwotICAgIHJldHVybiBib3VuZF8rKzsKLSAgfQotfQotCi12b2lkIFByb2JpbmdWb2NhYnVsYXJ5OjpGaW5pc2hlZExvYWRpbmcoKSB7Ci0gIGxvb2t1cF8uRmluaXNoZWRJbnNlcnRpbmcoKTsKLSAgaGVhZGVyXy0+Ym91bmQgPSBib3VuZF87Ci0gIGhlYWRlcl8tPnZlcnNpb24gPSBrUHJvYmluZ1ZvY2FidWxhcnlWZXJzaW9uOwotICBTZXRTcGVjaWFsKEluZGV4KCI8cz4iKSwgSW5kZXgoIjwvcz4iKSwgMCk7Ci19Ci0KLXZvaWQgUHJvYmluZ1ZvY2FidWxhcnk6OkxvYWRlZEJpbmFyeShib29sIGhhdmVfd29yZHMsIGludCBmZCwgRW51bWVyYXRlVm9jYWIgKnRvLCB1aW50NjRfdCBvZmZzZXQpIHsKLSAgVVRJTF9USFJPV19JRihoZWFkZXJfLT52ZXJzaW9uICE9IGtQcm9iaW5nVm9jYWJ1bGFyeVZlcnNpb24sIEZvcm1hdExvYWRFeGNlcHRpb24sICJUaGUgYmluYXJ5IGZpbGUgaGFzIHByb2JpbmcgdmVyc2lvbiAiIDw8IGhlYWRlcl8tPnZlcnNpb24gPDwgIiBidXQgdGhlIGNvZGUgZXhwZWN0cyB2ZXJzaW9uICIgPDwga1Byb2JpbmdWb2NhYnVsYXJ5VmVyc2lvbiA8PCAiLiAgUGxlYXNlIHJlcnVuIGJ1aWxkX2JpbmFyeSB1c2luZyB0aGUgc2FtZSB2ZXJzaW9uIG9mIHRoZSBjb2RlLiIpOwotICBib3VuZF8gPSBoZWFkZXJfLT5ib3VuZDsKLSAgU2V0U3BlY2lhbChJbmRleCgiPHM+IiksIEluZGV4KCI8L3M+IiksIDApOwotICBpZiAoaGF2ZV93b3JkcykgUmVhZFdvcmRzKGZkLCB0bywgYm91bmRfLCBvZmZzZXQpOwotfQotCi12b2lkIE1pc3NpbmdVbmtub3duKGNvbnN0IENvbmZpZyAmY29uZmlnKSB0aHJvdyhTcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb24pIHsKLSAgc3dpdGNoKGNvbmZpZy51bmtub3duX21pc3NpbmcpIHsKLSAgICBjYXNlIFNJTEVOVDoKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIENPTVBMQUlOOgotICAgICAgaWYgKGNvbmZpZy5tZXNzYWdlcykgKmNvbmZpZy5tZXNzYWdlcyA8PCAiVGhlIEFSUEEgZmlsZSBpcyBtaXNzaW5nIDx1bms+LiAgU3Vic3RpdHV0aW5nIGxvZzEwIHByb2JhYmlsaXR5ICIgPDwgY29uZmlnLnVua25vd25fbWlzc2luZ19sb2dwcm9iIDw8ICIuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRIUk9XX1VQOgotICAgICAgVVRJTF9USFJPVyhTcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb24sICJUaGUgQVJQQSBmaWxlIGlzIG1pc3NpbmcgPHVuaz4gYW5kIHRoZSBtb2RlbCBpcyBjb25maWd1cmVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbi4iKTsKLSAgfQotfQotCi12b2lkIE1pc3NpbmdTZW50ZW5jZU1hcmtlcihjb25zdCBDb25maWcgJmNvbmZpZywgY29uc3QgY2hhciAqc3RyKSB0aHJvdyhTcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb24pIHsKLSAgc3dpdGNoIChjb25maWcuc2VudGVuY2VfbWFya2VyX21pc3NpbmcpIHsKLSAgICBjYXNlIFNJTEVOVDoKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIENPTVBMQUlOOgotICAgICAgaWYgKGNvbmZpZy5tZXNzYWdlcykgKmNvbmZpZy5tZXNzYWdlcyA8PCAiTWlzc2luZyBzcGVjaWFsIHdvcmQgIiA8PCBzdHIgPDwgIjsgd2lsbCB0cmVhdCBpdCBhcyA8dW5rPi4iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUSFJPV19VUDoKLSAgICAgIFVUSUxfVEhST1coU3BlY2lhbFdvcmRNaXNzaW5nRXhjZXB0aW9uLCAiVGhlIEFSUEEgZmlsZSBpcyBtaXNzaW5nICIgPDwgc3RyIDw8ICIgYW5kIHRoZSBtb2RlbCBpcyBjb25maWd1cmVkIHRvIHJlamVjdCB0aGVzZSBtb2RlbHMuICBSdW4gYnVpbGRfYmluYXJ5IC1zIHRvIGRpc2FibGUgdGhpcyBjaGVjay4iKTsKLSAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBuZ3JhbQotfSAvLyBuYW1lc3BhY2UgbG0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS92b2NhYi5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS92b2NhYi5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhZTA3Yi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vdm9jYWIuaGgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotI2lmbmRlZiBMTV9WT0NBQl9ICi0jZGVmaW5lIExNX1ZPQ0FCX0gKLQotI2luY2x1ZGUgImxtL2VudW1lcmF0ZV92b2NhYi5oaCIKLSNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAibG0vdmlydHVhbF9pbnRlcmZhY2UuaGgiCi0jaW5jbHVkZSAidXRpbC9mYWtlX29mc3RyZWFtLmhoIgotI2luY2x1ZGUgInV0aWwvbXVybXVyX2hhc2guaGgiCi0jaW5jbHVkZSAidXRpbC9wb29sLmhoIgotI2luY2x1ZGUgInV0aWwvcHJvYmluZ19oYXNoX3RhYmxlLmhoIgotI2luY2x1ZGUgInV0aWwvc29ydGVkX3VuaWZvcm0uaGgiCi0jaW5jbHVkZSAidXRpbC9zdHJpbmdfcGllY2UuaGgiCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIGxtIHsKLXN0cnVjdCBQcm9iQmFja29mZjsKLWNsYXNzIEVudW1lcmF0ZVZvY2FiOwotCi1uYW1lc3BhY2UgbmdyYW0gewotc3RydWN0IENvbmZpZzsKLQotbmFtZXNwYWNlIGRldGFpbCB7Ci11aW50NjRfdCBIYXNoRm9yVm9jYWIoY29uc3QgY2hhciAqc3RyLCBzdGQ6OnNpemVfdCBsZW4pOwotaW5saW5lIHVpbnQ2NF90IEhhc2hGb3JWb2NhYihjb25zdCBTdHJpbmdQaWVjZSAmc3RyKSB7Ci0gIHJldHVybiBIYXNoRm9yVm9jYWIoc3RyLmRhdGEoKSwgc3RyLmxlbmd0aCgpKTsKLX0KLXN0cnVjdCBQcm9iaW5nVm9jYWJ1bGFyeUhlYWRlcjsKLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi1jbGFzcyBXcml0ZVdvcmRzV3JhcHBlciA6IHB1YmxpYyBFbnVtZXJhdGVWb2NhYiB7Ci0gIHB1YmxpYzoKLSAgICBXcml0ZVdvcmRzV3JhcHBlcihFbnVtZXJhdGVWb2NhYiAqaW5uZXIpOwotCi0gICAgfldyaXRlV29yZHNXcmFwcGVyKCk7Ci0gICAgCi0gICAgdm9pZCBBZGQoV29yZEluZGV4IGluZGV4LCBjb25zdCBTdHJpbmdQaWVjZSAmc3RyKTsKLQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCdWZmZXIoKSBjb25zdCB7IHJldHVybiBidWZmZXJfOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBFbnVtZXJhdGVWb2NhYiAqaW5uZXJfOwotCi0gICAgc3RkOjpzdHJpbmcgYnVmZmVyXzsKLX07Ci0KLS8vIFZvY2FidWxhcnkgYmFzZWQgb24gc29ydGVkIHVuaWZvcm0gZmluZCBzdG9yaW5nIG9ubHkgdWludDY0X3QgdmFsdWVzIGFuZCB1c2luZyB0aGVpciBvZmZzZXRzIGFzIGluZGljZXMuICAKLWNsYXNzIFNvcnRlZFZvY2FidWxhcnkgOiBwdWJsaWMgYmFzZTo6Vm9jYWJ1bGFyeSB7Ci0gIHB1YmxpYzoKLSAgICBTb3J0ZWRWb2NhYnVsYXJ5KCk7Ci0KLSAgICBXb3JkSW5kZXggSW5kZXgoY29uc3QgU3RyaW5nUGllY2UgJnN0cikgY29uc3QgewotICAgICAgY29uc3QgdWludDY0X3QgKmZvdW5kOwotICAgICAgaWYgKHV0aWw6OkJvdW5kZWRTb3J0ZWRVbmlmb3JtRmluZDxjb25zdCB1aW50NjRfdCosIHV0aWw6OklkZW50aXR5QWNjZXNzb3I8dWludDY0X3Q+LCB1dGlsOjpQaXZvdDY0PigKLSAgICAgICAgICAgIHV0aWw6OklkZW50aXR5QWNjZXNzb3I8dWludDY0X3Q+KCksCi0gICAgICAgICAgICBiZWdpbl8gLSAxLCAwLAotICAgICAgICAgICAgZW5kXywgc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpLAotICAgICAgICAgICAgZGV0YWlsOjpIYXNoRm9yVm9jYWIoc3RyKSwgZm91bmQpKSB7Ci0gICAgICAgIHJldHVybiBmb3VuZCAtIGJlZ2luXyArIDE7IC8vICsxIGJlY2F1c2UgPHVuaz4gaXMgMCBhbmQgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBsb29rdXAgdGFibGUuCi0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTaXplIGZvciBwdXJwb3NlcyBvZiBmaWxlIHdyaXRpbmcKLSAgICBzdGF0aWMgdWludDY0X3QgU2l6ZSh1aW50NjRfdCBlbnRyaWVzLCBjb25zdCBDb25maWcgJmNvbmZpZyk7Ci0KLSAgICAvLyBWb2NhYiB3b3JkcyBhcmUgWzAsIEJvdW5kKCkpICBPbmx5IHZhbGlkIGFmdGVyIEZpbmlzaGVkTG9hZGluZy9Mb2FkZWRCaW5hcnkuICAKLSAgICBXb3JkSW5kZXggQm91bmQoKSBjb25zdCB7IHJldHVybiBib3VuZF87IH0KLQotICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpcyBmb3IgcG9wdWxhdGluZy4gIEknbSB0b28gbGF6eSB0byBoaWRlIGFuZCBmcmllbmQgdGhlc2UsIGJ1dCB5b3UnbGwgb25seSBnZXQgYSBjb25zdCByZWZlcmVuY2UgYW55d2F5LgotICAgIHZvaWQgU2V0dXBNZW1vcnkodm9pZCAqc3RhcnQsIHN0ZDo6c2l6ZV90IGFsbG9jYXRlZCwgc3RkOjpzaXplX3QgZW50cmllcywgY29uc3QgQ29uZmlnICZjb25maWcpOwotCi0gICAgdm9pZCBSZWxvY2F0ZSh2b2lkICpuZXdfc3RhcnQpOwotCi0gICAgdm9pZCBDb25maWd1cmVFbnVtZXJhdGUoRW51bWVyYXRlVm9jYWIgKnRvLCBzdGQ6OnNpemVfdCBtYXhfZW50cmllcyk7Ci0KLSAgICBXb3JkSW5kZXggSW5zZXJ0KGNvbnN0IFN0cmluZ1BpZWNlICZzdHIpOwotCi0gICAgLy8gUmVvcmRlcnMgcmVvcmRlcl92b2NhYiBzbyB0aGF0IHRoZSBJRHMgYXJlIHNvcnRlZC4gIAotICAgIHZvaWQgRmluaXNoZWRMb2FkaW5nKFByb2JCYWNrb2ZmICpyZW9yZGVyX3ZvY2FiKTsKLQotICAgIC8vIFRyaWUgc3RvcmVzIHRoZSBjb3JyZWN0IGNvdW50cyBpbmNsdWRpbmcgPHVuaz4gaW4gdGhlIGhlYWRlci4gIElmIHRoaXMgd2FzIHByZXZpb3VzbHkgc2l6ZWQgYmFzZWQgb24gYSBjb3VudCBleGx1ZGluZyA8dW5rPiwgcGFkZGluZyB3aXRoIDggYnl0ZXMgd2lsbCBtYWtlIGl0IHRoZSBjb3JyZWN0IHNpemUgYmFzZWQgb24gYSBjb3VudCBpbmNsdWRpbmcgPHVuaz4uCi0gICAgc3RkOjpzaXplX3QgVW5rQ291bnRDaGFuZ2VQYWRkaW5nKCkgY29uc3QgeyByZXR1cm4gU2F3VW5rKCkgPyAwIDogc2l6ZW9mKHVpbnQ2NF90KTsgfQotCi0gICAgYm9vbCBTYXdVbmsoKSBjb25zdCB7IHJldHVybiBzYXdfdW5rXzsgfQotCi0gICAgdm9pZCBMb2FkZWRCaW5hcnkoYm9vbCBoYXZlX3dvcmRzLCBpbnQgZmQsIEVudW1lcmF0ZVZvY2FiICp0bywgdWludDY0X3Qgb2Zmc2V0KTsKLQotICBwcml2YXRlOgotICAgIHVpbnQ2NF90ICpiZWdpbl8sICplbmRfOwotCi0gICAgV29yZEluZGV4IGJvdW5kXzsKLQotICAgIGJvb2wgc2F3X3Vua187Ci0KLSAgICBFbnVtZXJhdGVWb2NhYiAqZW51bWVyYXRlXzsKLQotICAgIC8vIEFjdHVhbCBzdHJpbmdzLiAgVXNlZCBvbmx5IHdoZW4gbG9hZGluZyBmcm9tIEFSUEEgYW5kIGVudW1lcmF0ZV8gIT0gTlVMTCAKLSAgICB1dGlsOjpQb29sIHN0cmluZ19iYWNraW5nXzsKLQotICAgIHN0ZDo6dmVjdG9yPFN0cmluZ1BpZWNlPiBzdHJpbmdzX3RvX2VudW1lcmF0ZV87Ci19OwotCi0jcHJhZ21hIHBhY2socHVzaCkKLSNwcmFnbWEgcGFjayg0KQotc3RydWN0IFByb2JpbmdWb2NhYnVsYXJ5RW50cnkgewotICB1aW50NjRfdCBrZXk7Ci0gIFdvcmRJbmRleCB2YWx1ZTsKLQotICB0eXBlZGVmIHVpbnQ2NF90IEtleTsKLSAgdWludDY0X3QgR2V0S2V5KCkgY29uc3QgeyByZXR1cm4ga2V5OyB9Ci0gIHZvaWQgU2V0S2V5KHVpbnQ2NF90IHRvKSB7IGtleSA9IHRvOyB9Ci0KLSAgc3RhdGljIFByb2JpbmdWb2NhYnVsYXJ5RW50cnkgTWFrZSh1aW50NjRfdCBrZXksIFdvcmRJbmRleCB2YWx1ZSkgewotICAgIFByb2JpbmdWb2NhYnVsYXJ5RW50cnkgcmV0OwotICAgIHJldC5rZXkgPSBrZXk7Ci0gICAgcmV0LnZhbHVlID0gdmFsdWU7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfTsKLSNwcmFnbWEgcGFjayhwb3ApCi0KLS8vIFZvY2FidWxhcnkgc3RvcmluZyBhIG1hcCBmcm9tIHVpbnQ2NF90IHRvIFdvcmRJbmRleC4gCi1jbGFzcyBQcm9iaW5nVm9jYWJ1bGFyeSA6IHB1YmxpYyBiYXNlOjpWb2NhYnVsYXJ5IHsKLSAgcHVibGljOgotICAgIFByb2JpbmdWb2NhYnVsYXJ5KCk7Ci0KLSAgICBXb3JkSW5kZXggSW5kZXgoY29uc3QgU3RyaW5nUGllY2UgJnN0cikgY29uc3QgewotICAgICAgTG9va3VwOjpDb25zdEl0ZXJhdG9yIGk7Ci0gICAgICByZXR1cm4gbG9va3VwXy5GaW5kKGRldGFpbDo6SGFzaEZvclZvY2FiKHN0ciksIGkpID8gaS0+dmFsdWUgOiAwOwotICAgIH0KLQotICAgIHN0YXRpYyB1aW50NjRfdCBTaXplKHVpbnQ2NF90IGVudHJpZXMsIGZsb2F0IHByb2JpbmdfbXVsdGlwbGllcik7Ci0gICAgLy8gVGhpcyBqdXN0IHVud3JhcHMgQ29uZmlnIHRvIGdldCB0aGUgcHJvYmluZ19tdWx0aXBsaWVyLgotICAgIHN0YXRpYyB1aW50NjRfdCBTaXplKHVpbnQ2NF90IGVudHJpZXMsIGNvbnN0IENvbmZpZyAmY29uZmlnKTsKLQotICAgIC8vIFZvY2FiIHdvcmRzIGFyZSBbMCwgQm91bmQoKSkuICAKLSAgICBXb3JkSW5kZXggQm91bmQoKSBjb25zdCB7IHJldHVybiBib3VuZF87IH0KLQotICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpcyBmb3IgcG9wdWxhdGluZy4gIEknbSB0b28gbGF6eSB0byBoaWRlIGFuZCBmcmllbmQgdGhlc2UsIGJ1dCB5b3UnbGwgb25seSBnZXQgYSBjb25zdCByZWZlcmVuY2UgYW55d2F5LgotICAgIHZvaWQgU2V0dXBNZW1vcnkodm9pZCAqc3RhcnQsIHN0ZDo6c2l6ZV90IGFsbG9jYXRlZCk7Ci0gICAgdm9pZCBTZXR1cE1lbW9yeSh2b2lkICpzdGFydCwgc3RkOjpzaXplX3QgYWxsb2NhdGVkLCBzdGQ6OnNpemVfdCAvKmVudHJpZXMqLywgY29uc3QgQ29uZmlnICYvKmNvbmZpZyovKSB7Ci0gICAgICBTZXR1cE1lbW9yeShzdGFydCwgYWxsb2NhdGVkKTsKLSAgICB9Ci0KLSAgICB2b2lkIFJlbG9jYXRlKHZvaWQgKm5ld19zdGFydCk7Ci0KLSAgICB2b2lkIENvbmZpZ3VyZUVudW1lcmF0ZShFbnVtZXJhdGVWb2NhYiAqdG8sIHN0ZDo6c2l6ZV90IG1heF9lbnRyaWVzKTsKLQotICAgIFdvcmRJbmRleCBJbnNlcnQoY29uc3QgU3RyaW5nUGllY2UgJnN0cik7Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgV2VpZ2h0cz4gdm9pZCBGaW5pc2hlZExvYWRpbmcoV2VpZ2h0cyAqIC8qcmVvcmRlcl92b2NhYiovKSB7Ci0gICAgICBGaW5pc2hlZExvYWRpbmcoKTsKLSAgICB9Ci0gICAgdm9pZCBGaW5pc2hlZExvYWRpbmcoKTsKLQotICAgIHN0ZDo6c2l6ZV90IFVua0NvdW50Q2hhbmdlUGFkZGluZygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIGJvb2wgU2F3VW5rKCkgY29uc3QgeyByZXR1cm4gc2F3X3Vua187IH0KLQotICAgIHZvaWQgTG9hZGVkQmluYXJ5KGJvb2wgaGF2ZV93b3JkcywgaW50IGZkLCBFbnVtZXJhdGVWb2NhYiAqdG8sIHVpbnQ2NF90IG9mZnNldCk7Ci0KLSAgcHJpdmF0ZToKLSAgICB0eXBlZGVmIHV0aWw6OlByb2JpbmdIYXNoVGFibGU8UHJvYmluZ1ZvY2FidWxhcnlFbnRyeSwgdXRpbDo6SWRlbnRpdHlIYXNoPiBMb29rdXA7Ci0KLSAgICBMb29rdXAgbG9va3VwXzsKLQotICAgIFdvcmRJbmRleCBib3VuZF87Ci0KLSAgICBib29sIHNhd191bmtfOwotCi0gICAgRW51bWVyYXRlVm9jYWIgKmVudW1lcmF0ZV87Ci0KLSAgICBkZXRhaWw6OlByb2JpbmdWb2NhYnVsYXJ5SGVhZGVyICpoZWFkZXJfOwotfTsKLQotdm9pZCBNaXNzaW5nVW5rbm93bihjb25zdCBDb25maWcgJmNvbmZpZykgdGhyb3coU3BlY2lhbFdvcmRNaXNzaW5nRXhjZXB0aW9uKTsKLXZvaWQgTWlzc2luZ1NlbnRlbmNlTWFya2VyKGNvbnN0IENvbmZpZyAmY29uZmlnLCBjb25zdCBjaGFyICpzdHIpIHRocm93KFNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbik7Ci0KLXRlbXBsYXRlIDxjbGFzcyBWb2NhYj4gdm9pZCBDaGVja1NwZWNpYWxzKGNvbnN0IENvbmZpZyAmY29uZmlnLCBjb25zdCBWb2NhYiAmdm9jYWIpIHRocm93KFNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbikgewotICBpZiAoIXZvY2FiLlNhd1VuaygpKSBNaXNzaW5nVW5rbm93bihjb25maWcpOwotICBpZiAodm9jYWIuQmVnaW5TZW50ZW5jZSgpID09IHZvY2FiLk5vdEZvdW5kKCkpIE1pc3NpbmdTZW50ZW5jZU1hcmtlcihjb25maWcsICI8cz4iKTsKLSAgaWYgKHZvY2FiLkVuZFNlbnRlbmNlKCkgPT0gdm9jYWIuTm90Rm91bmQoKSkgTWlzc2luZ1NlbnRlbmNlTWFya2VyKGNvbmZpZywgIjwvcz4iKTsKLX0KLQotY2xhc3MgV3JpdGVVbmlxdWVXb3JkcyB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBXcml0ZVVuaXF1ZVdvcmRzKGludCBmZCkgOiB3b3JkX2xpc3RfKGZkKSB7fQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFN0cmluZ1BpZWNlICZ3b3JkKSB7Ci0gICAgICB3b3JkX2xpc3RfIDw8IHdvcmQgPDwgJ1wwJzsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB1dGlsOjpGYWtlT0ZTdHJlYW0gd29yZF9saXN0XzsKLX07Ci0KLWNsYXNzIE5vT3BVbmlxdWVXb3JkcyB7Ci0gIHB1YmxpYzoKLSAgICBOb09wVW5pcXVlV29yZHMoKSB7fQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBTdHJpbmdQaWVjZSAmd29yZCkge30KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBOZXdXb3JkQWN0aW9uID0gTm9PcFVuaXF1ZVdvcmRzPiBjbGFzcyBHcm93YWJsZVZvY2FiIHsKLSAgcHVibGljOgotICAgIHN0YXRpYyBzdGQ6OnNpemVfdCBNZW1Vc2FnZShXb3JkSW5kZXggY29udGVudCkgewotICAgICAgcmV0dXJuIExvb2t1cDo6TWVtVXNhZ2UoY29udGVudCA+IDIgPyBjb250ZW50IDogMik7Ci0gICAgfQotCi0gICAgLy8gRG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2Ygd3JpdGVfd29yZGkKLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgTmV3V29yZENvbnN0cnVjdD4gR3Jvd2FibGVWb2NhYihXb3JkSW5kZXggaW5pdGlhbF9zaXplLCBjb25zdCBOZXdXb3JkQ29uc3RydWN0ICZuZXdfd29yZF9jb25zdHJ1Y3QgPSBOZXdXb3JkQWN0aW9uKCkpCi0gICAgICA6IGxvb2t1cF8oaW5pdGlhbF9zaXplKSwgbmV3X3dvcmRfKG5ld193b3JkX2NvbnN0cnVjdCkgewotICAgICAgRmluZE9ySW5zZXJ0KCI8dW5rPiIpOyAvLyBGb3JjZSAwCi0gICAgICBGaW5kT3JJbnNlcnQoIjxzPiIpOyAvLyBGb3JjZSAxCi0gICAgICBGaW5kT3JJbnNlcnQoIjwvcz4iKTsgLy8gRm9yY2UgMgotICAgIH0KLQotICAgIFdvcmRJbmRleCBJbmRleChjb25zdCBTdHJpbmdQaWVjZSAmc3RyKSBjb25zdCB7Ci0gICAgICBMb29rdXA6OkNvbnN0SXRlcmF0b3IgaTsKLSAgICAgIHJldHVybiBsb29rdXBfLkZpbmQoZGV0YWlsOjpIYXNoRm9yVm9jYWIoc3RyKSwgaSkgPyBpLT52YWx1ZSA6IDA7Ci0gICAgfQotCi0gICAgV29yZEluZGV4IEZpbmRPckluc2VydChjb25zdCBTdHJpbmdQaWVjZSAmd29yZCkgewotICAgICAgUHJvYmluZ1ZvY2FidWxhcnlFbnRyeSBlbnRyeSA9IFByb2JpbmdWb2NhYnVsYXJ5RW50cnk6Ok1ha2UodXRpbDo6TXVybXVySGFzaE5hdGl2ZSh3b3JkLmRhdGEoKSwgd29yZC5zaXplKCkpLCBTaXplKCkpOwotICAgICAgTG9va3VwOjpNdXRhYmxlSXRlcmF0b3IgaXQ7Ci0gICAgICBpZiAoIWxvb2t1cF8uRmluZE9ySW5zZXJ0KGVudHJ5LCBpdCkpIHsKLSAgICAgICAgbmV3X3dvcmRfKHdvcmQpOwotICAgICAgICBVVElMX1RIUk9XX0lGKFNpemUoKSA+PSBzdGQ6Om51bWVyaWNfbGltaXRzPGxtOjpXb3JkSW5kZXg+OjptYXgoKSwgVm9jYWJMb2FkRXhjZXB0aW9uLCAiVG9vIG1hbnkgdm9jYWJ1bGFyeSB3b3Jkcy4gIENoYW5nZSBXb3JkSW5kZXggdG8gdWludDY0X3QgaW4gbG0vd29yZF9pbmRleC5oaCIpOwotICAgICAgfQotICAgICAgcmV0dXJuIGl0LT52YWx1ZTsKLSAgICB9Ci0KLSAgICBXb3JkSW5kZXggU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxvb2t1cF8uU2l6ZSgpOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICB0eXBlZGVmIHV0aWw6OkF1dG9Qcm9iaW5nPFByb2JpbmdWb2NhYnVsYXJ5RW50cnksIHV0aWw6OklkZW50aXR5SGFzaD4gTG9va3VwOwotCi0gICAgTG9va3VwIGxvb2t1cF87Ci0KLSAgICBOZXdXb3JkQWN0aW9uIG5ld193b3JkXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIG5ncmFtCi19IC8vIG5hbWVzcGFjZSBsbQotCi0jZW5kaWYgLy8gTE1fVk9DQUJfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3dlaWdodHMuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vd2VpZ2h0cy5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExOTYzZC4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vd2VpZ2h0cy5oaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSNpZm5kZWYgTE1fV0VJR0hUU19ICi0jZGVmaW5lIExNX1dFSUdIVFNfSAotCi0vLyBXZWlnaHRzIGZvciBuLWdyYW1zLiAgUHJvYmFiaWxpdHkgYW5kIHBvc3NpYmx5IGEgYmFja29mZi4gIAotCi1uYW1lc3BhY2UgbG0gewotc3RydWN0IFByb2IgewotICBmbG9hdCBwcm9iOwotfTsKLS8vIE5vIGluaGVyaXRhbmNlIHNvIHRoaXMgd2lsbCBiZSBhIFBPRC4gIAotc3RydWN0IFByb2JCYWNrb2ZmIHsKLSAgZmxvYXQgcHJvYjsKLSAgZmxvYXQgYmFja29mZjsKLX07Ci1zdHJ1Y3QgUmVzdFdlaWdodHMgewotICBmbG9hdCBwcm9iOwotICBmbG9hdCBiYWNrb2ZmOwotICBmbG9hdCByZXN0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgbG0KLSNlbmRpZiAvLyBMTV9XRUlHSFRTX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS93b3JkX2luZGV4LmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3dvcmRfaW5kZXguaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YTBmZGEuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3dvcmRfaW5kZXguaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vLyBTZXBhcmF0ZSBoZWFkZXIgYmVjYXVzZSB0aGlzIGlzIHVzZWQgb2Z0ZW4uCi0jaWZuZGVmIExNX1dPUkRfSU5ERVhfSAotI2RlZmluZSBMTV9XT1JEX0lOREVYX0gKLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi1uYW1lc3BhY2UgbG0gewotdHlwZWRlZiB1bnNpZ25lZCBpbnQgV29yZEluZGV4OwotY29uc3QgV29yZEluZGV4IGtNYXhXb3JkSW5kZXggPSBVSU5UX01BWDsKLX0gLy8gbmFtZXNwYWNlIGxtCi0KLXR5cGVkZWYgbG06OldvcmRJbmRleCBMTVdvcmRJbmRleDsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9KYW1maWxlIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiMjBhMy4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotbG9jYWwgY29tcHJlc3NlZF9mbGFncyA9IDxpbmNsdWRlPi4uIDxkZWZpbmU+SEFWRV9aTElCIDsKLWxvY2FsIGNvbXByZXNzZWRfZGVwcyA9IC90b3AvL3ogOwotaWYgWyB0ZXN0X2xpYnJhcnkgImJ6MiIgXSAmJiBbIHRlc3RfaGVhZGVyICJiemxpYi5oIiBdIHsKLSAgZXh0ZXJuYWwtbGliIGJ6MiA7Ci0gIGNvbXByZXNzZWRfZmxhZ3MgKz0gPGRlZmluZT5IQVZFX0JaTElCIDsKLSAgY29tcHJlc3NlZF9kZXBzICs9IGJ6MiA7Ci19Ci1pZiBbIHRlc3RfbGlicmFyeSAibHptYSIgXSAmJiBbIHRlc3RfaGVhZGVyICJsem1hLmgiIF0gewotICBleHRlcm5hbC1saWIgbHptYSA7Ci0gIGNvbXByZXNzZWRfZmxhZ3MgKz0gPGRlZmluZT5IQVZFX1haTElCIDsKLSAgY29tcHJlc3NlZF9kZXBzICs9IGx6bWEgOwotfQotCi0jcnQgaXMgbmVlZGVkIGZvciBjbG9ja19nZXR0aW1lIG9uIGxpbnV4LiAgQnV0IGl0J3MgYWxyZWFkeSBpbmNsdWRlZCB3aXRoIHRocmVhZGluZz1tdWx0aQotbGliIHJ0IDsKLQotb2JqIHJlYWRfY29tcHJlc3NlZC5vIDogcmVhZF9jb21wcmVzc2VkLmNjIDogJChjb21wcmVzc2VkX2ZsYWdzKSA7Ci1hbGlhcyByZWFkX2NvbXByZXNzZWQgOiByZWFkX2NvbXByZXNzZWQubyAkKGNvbXByZXNzZWRfZGVwcykgOwotb2JqIHJlYWRfY29tcHJlc3NlZF90ZXN0Lm8gOiByZWFkX2NvbXByZXNzZWRfdGVzdC5jYyAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIDogJChjb21wcmVzc2VkX2ZsYWdzKSA7Ci1vYmogZmlsZV9waWVjZV90ZXN0Lm8gOiBmaWxlX3BpZWNlX3Rlc3QuY2MgL3RvcC8vYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yayA6ICQoY29tcHJlc3NlZF9mbGFncykgOwotCi1mYWtlbGliIHBhcmFsbGVsX3JlYWQgOiBwYXJhbGxlbF9yZWFkLmNjIDogPHRocmVhZGluZz5tdWx0aTo8c291cmNlPi90b3AvL2Jvb3N0X3RocmVhZCA8dGhyZWFkaW5nPm11bHRpOjxkZWZpbmU+V0lUSF9USFJFQURTIDogOiA8aW5jbHVkZT4uLiA7Ci0KLWZha2VsaWIga2VudXRpbCA6IGJpdF9wYWNraW5nLmNjIGVyc2F0el9wcm9ncmVzcy5jYyBleGNlcHRpb24uY2MgZmlsZS5jYyBmaWxlX3BpZWNlLmNjIG1tYXAuY2MgbXVybXVyX2hhc2guY2MgcGFyYWxsZWxfcmVhZCBwb29sLmNjIHJlYWRfY29tcHJlc3NlZCBzY29wZWQuY2Mgc3RyaW5nX3BpZWNlLmNjIHVzYWdlLmNjIGRvdWJsZS1jb252ZXJzaW9uLy9kb3VibGUtY29udmVyc2lvbiA6IDxpbmNsdWRlPi4uIDxvcz5MSU5VWCw8dGhyZWFkaW5nPnNpbmdsZTo8c291cmNlPnJ0IDogOiA8aW5jbHVkZT4uLiA7Ci0KLWV4ZSBjYXRfY29tcHJlc3NlZCA6IGNhdF9jb21wcmVzc2VkX21haW4uY2Mga2VudXRpbCA7Ci0KLWFsaWFzIHByb2dyYW1zIDogY2F0X2NvbXByZXNzZWQgOwotCi1pbXBvcnQgdGVzdGluZyA7Ci0KLXJ1biBmaWxlX3BpZWNlX3Rlc3QubyBrZW51dGlsIC90b3AvL2Jvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsgOiA6IGZpbGVfcGllY2UuY2MgOwotZm9yIGxvY2FsIHQgaW4gWyBnbG9iICpfdGVzdC5jYyA6IGZpbGVfcGllY2VfdGVzdC5jYyByZWFkX2NvbXByZXNzZWRfdGVzdC5jYyBdIHsKLSAgICBsb2NhbCBuYW1lID0gWyBNQVRDSCAiKC4qKVwuY2MiIDogJCh0KSBdIDsKLSAgICB1bml0LXRlc3QgJChuYW1lKSA6ICQodCkga2VudXRpbCAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIC90b3AvL2Jvb3N0X3N5c3RlbSA7Ci19CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9iaXRfcGFja2luZy5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2JpdF9wYWNraW5nLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk5OWI3Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2JpdF9wYWNraW5nLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotI2luY2x1ZGUgInV0aWwvYml0X3BhY2tpbmcuaGgiCi0jaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotbmFtZXNwYWNlIHV0aWwgewotCi1uYW1lc3BhY2UgewotdGVtcGxhdGUgPGJvb2w+IHN0cnVjdCBTdGF0aWNDaGVjayB7fTsKLXRlbXBsYXRlIDw+IHN0cnVjdCBTdGF0aWNDaGVjazx0cnVlPiB7IHR5cGVkZWYgYm9vbCBTdGF0aWNBc3NlcnRpb25QYXNzZWQ7IH07Ci0KLS8vIElmIHlvdXIgZmxvYXQgaXNuJ3QgNCBieXRlcywgd2UncmUgaG9zZWQuICAKLXR5cGVkZWYgU3RhdGljQ2hlY2s8c2l6ZW9mKGZsb2F0KSA9PSA0Pjo6U3RhdGljQXNzZXJ0aW9uUGFzc2VkIEZsb2F0U2l6ZTsKLQotfSAvLyBuYW1lc3BhY2UKLQotdWludDhfdCBSZXF1aXJlZEJpdHModWludDY0X3QgbWF4X3ZhbHVlKSB7Ci0gIGlmICghbWF4X3ZhbHVlKSByZXR1cm4gMDsKLSAgdWludDhfdCByZXQgPSAxOwotICB3aGlsZSAobWF4X3ZhbHVlID4+PSAxKSArK3JldDsKLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBCaXRQYWNraW5nU2FuaXR5KCkgewotICBjb25zdCBGbG9hdEVuYyBuZWcxID0geyAtMS4wIH0sIHBvczEgPSB7IDEuMCB9OwotICBpZiAoKG5lZzEuaSBeIHBvczEuaSkgIT0gMHg4MDAwMDAwMCkgVVRJTF9USFJPVyhFeGNlcHRpb24sICJTaWduIGJpdCBpcyBub3QgMHg4MDAwMDAwMCIpOwotICBjaGFyIG1lbVs1Nys4XTsKLSAgbWVtc2V0KG1lbSwgMCwgc2l6ZW9mKG1lbSkpOwotICBjb25zdCB1aW50NjRfdCB0ZXN0NTcgPSAweDEyMzQ1Njc4OWFiY2RlZlVMTDsKLSAgZm9yICh1aW50NjRfdCBiID0gMDsgYiA8IDU3ICogODsgYiArPSA1NykgewotICAgIFdyaXRlSW50NTcobWVtLCBiLCA1NywgdGVzdDU3KTsKLSAgfQotICBmb3IgKHVpbnQ2NF90IGIgPSAwOyBiIDwgNTcgKiA4OyBiICs9IDU3KSB7Ci0gICAgaWYgKHRlc3Q1NyAhPSBSZWFkSW50NTcobWVtLCBiLCA1NywgKDFVTEwgPDwgNTcpIC0gMSkpCi0gICAgICBVVElMX1RIUk9XKEV4Y2VwdGlvbiwgIlRoZSBiaXQgcGFja2luZyByb3V0aW5lcyBhcmUgZmFpbGluZyBmb3IgeW91ciBhcmNoaXRlY3R1cmUuICBQbGVhc2Ugc2VuZCBhIGJ1ZyByZXBvcnQgd2l0aCB5b3VyIGFyY2hpdGVjdHVyZSwgb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGNvbXBpbGVyLiIpOwotICB9Ci0gIC8vIFRPRE86IG1vcmUgY2hlY2tzLiAgCi19Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2JpdF9wYWNraW5nLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvYml0X3BhY2tpbmcuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzRkOWEuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvYml0X3BhY2tpbmcuaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotI2lmbmRlZiBVVElMX0JJVF9QQUNLSU5HX0gKLSNkZWZpbmUgVVRJTF9CSVRfUEFDS0lOR19ICi0KLS8qIEJpdC1sZXZlbCBwYWNraW5nIHJvdXRpbmVzIAotICoKLSAqIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HOgotICogVGhlIHdyaXRlIGZ1bmN0aW9ucyBhc3N1bWUgdGhhdCBtZW1vcnkgaXMgemVybyBpbml0aWFsbHkuICBUaGlzIG1ha2VzIHRoZW0KLSAqIGZhc3RlciBhbmQgaXMgdGhlIGFwcHJvcHJpYXRlIGNhc2UgZm9yIG1tYXBwZWQgbGFuZ3VhZ2UgbW9kZWwgY29uc3RydWN0aW9uLgotICogVGhlc2Ugcm91dGluZXMgYXNzdW1lIHRoYXQgdW5hbGlnbmVkIGFjY2VzcyB0byB1aW50NjRfdCBpcyBmYXN0LiAgVGhpcyBpcwotICogdGhlIGNhc2Ugb24geDg2XzY0LiAgSSdtIG5vdCBzdXJlIGhvdyBmYXN0IHVuYWxpZ25lZCA2NC1iaXQgYWNjZXNzIGlzIG9uCi0gKiB4ODYgYnV0IG15IHRhcmdldCBhdWRpZW5jZSBpcyBsYXJnZSBsYW5ndWFnZSBtb2RlbHMgZm9yIHdoaWNoIDY0LWJpdCBpcwotICogbmVjZXNzYXJ5LiAgCi0gKgotICogQ2FsbCB0aGUgQml0UGFja2luZ1Nhbml0eSBmdW5jdGlvbiB0byBzYW5pdHkgY2hlY2suICBDYWxsaW5nIG9uY2Ugc3VmZmljZXMsCi0gKiBidXQgaXQgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aGVuIHRoYXQncyBpbmNvbnZlbmllbnQuICAKLSAqCi0gKiBBUk0gYW5kIE1pbkdXIHBvcnRzIGNvbnRyaWJ1dGVkIGJ5IEhpZGVvIE9rdW1hIGFuZCBUb21veXVraSBZb3NoaW11cmEgYXQKLSAqIE5JQ1QuCi0gKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2lmZGVmIF9fQVBQTEVfXwotI2luY2x1ZGUgPGFyY2hpdGVjdHVyZS9ieXRlX29yZGVyLmg+Ci0jZWxpZiBfX2xpbnV4X18KLSNpbmNsdWRlIDxlbmRpYW4uaD4KLSNlbGlmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjY0KQotI2luY2x1ZGUgPGFycGEvbmFtZXNlcl9jb21wYXQuaD4KLSNlbmRpZiAKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLQotLy8gRnVuIGZhY3Q6IF9fQllURV9PUkRFUiBpcyB3cm9uZyBvbiBTb2xhcmlzIFNwYXJjLCBidXQgdGhlIHZlcnNpb24gd2l0aG91dCBfXyBpcyBjb3JyZWN0LiAgCi0jaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCi1pbmxpbmUgdWludDhfdCBCaXRQYWNrU2hpZnQodWludDhfdCBiaXQsIHVpbnQ4X3QgLypsZW5ndGgqLykgewotICByZXR1cm4gYml0OwotfQotI2VsaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCi1pbmxpbmUgdWludDhfdCBCaXRQYWNrU2hpZnQodWludDhfdCBiaXQsIHVpbnQ4X3QgbGVuZ3RoKSB7Ci0gIHJldHVybiA2NCAtIGxlbmd0aCAtIGJpdDsKLX0KLSNlbHNlCi0jZXJyb3IgIkJpdCBwYWNraW5nIGNvZGUgaXNuJ3Qgd3JpdHRlbiBmb3IgeW91ciBieXRlIG9yZGVyLiIKLSNlbmRpZgotCi1pbmxpbmUgdWludDY0X3QgUmVhZE9mZihjb25zdCB2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2ZmKSB7Ci0jaWYgZGVmaW5lZChfX2FybSkgfHwgZGVmaW5lZChfX2FybV9fKQotICBjb25zdCB1aW50OF90ICpiYXNlX29mZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJhc2UpICsgKGJpdF9vZmYgPj4gMyk7Ci0gIHVpbnQ2NF90IHZhbHVlNjQ7Ci0gIG1lbWNweSgmdmFsdWU2NCwgYmFzZV9vZmYsIHNpemVvZih2YWx1ZTY0KSk7Ci0gIHJldHVybiB2YWx1ZTY0OwotI2Vsc2UKLSAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYmFzZSkgKyAoYml0X29mZiA+PiAzKSk7Ci0jZW5kaWYKLX0KLQotLyogUGFjayBpbnRlZ2VycyB1cCB0byA1NyBiaXRzIHVzaW5nIHRoZWlyIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0cy4gCi0gKiBUaGUgbGVuZ3RoIGlzIHNwZWNpZmllZCB1c2luZyBtYXNrOgotICogQXNzdW1lcyBtYXNrID09ICgxIDw8IGxlbmd0aCkgLSAxIHdoZXJlIGxlbmd0aCA8PSA1Ny4gICAKLSAqLwotaW5saW5lIHVpbnQ2NF90IFJlYWRJbnQ1Nyhjb25zdCB2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2ZmLCB1aW50OF90IGxlbmd0aCwgdWludDY0X3QgbWFzaykgewotICByZXR1cm4gKFJlYWRPZmYoYmFzZSwgYml0X29mZikgPj4gQml0UGFja1NoaWZ0KGJpdF9vZmYgJiA3LCBsZW5ndGgpKSAmIG1hc2s7Ci19Ci0vKiBBc3N1bWVzIHZhbHVlIDwgKDEgPDwgbGVuZ3RoKSBhbmQgbGVuZ3RoIDw9IDU3LgotICogQXNzdW1lcyB0aGUgbWVtb3J5IGlzIHplcm8gaW5pdGlhbGx5LiAKLSAqLwotaW5saW5lIHZvaWQgV3JpdGVJbnQ1Nyh2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2ZmLCB1aW50OF90IGxlbmd0aCwgdWludDY0X3QgdmFsdWUpIHsKLSNpZiBkZWZpbmVkKF9fYXJtKSB8fCBkZWZpbmVkKF9fYXJtX18pCi0gIHVpbnQ4X3QgKmJhc2Vfb2ZmID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmFzZSkgKyAoYml0X29mZiA+PiAzKTsKLSAgdWludDY0X3QgdmFsdWU2NDsKLSAgbWVtY3B5KCZ2YWx1ZTY0LCBiYXNlX29mZiwgc2l6ZW9mKHZhbHVlNjQpKTsKLSAgdmFsdWU2NCB8PSAodmFsdWUgPDwgQml0UGFja1NoaWZ0KGJpdF9vZmYgJiA3LCBsZW5ndGgpKTsKLSAgbWVtY3B5KGJhc2Vfb2ZmLCAmdmFsdWU2NCwgc2l6ZW9mKHZhbHVlNjQpKTsKLSNlbHNlCi0gICpyZWludGVycHJldF9jYXN0PHVpbnQ2NF90Kj4ocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmFzZSkgKyAoYml0X29mZiA+PiAzKSkgfD0gCi0gICAgKHZhbHVlIDw8IEJpdFBhY2tTaGlmdChiaXRfb2ZmICYgNywgbGVuZ3RoKSk7Ci0jZW5kaWYKLX0KLQotLyogU2FtZSBjYXZlYXRzIGFzIGFib3ZlLCBidXQgZm9yIGEgMjUgYml0IGxpbWl0LiAqLwotaW5saW5lIHVpbnQzMl90IFJlYWRJbnQyNShjb25zdCB2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2ZmLCB1aW50OF90IGxlbmd0aCwgdWludDMyX3QgbWFzaykgewotI2lmIGRlZmluZWQoX19hcm0pIHx8IGRlZmluZWQoX19hcm1fXykKLSAgY29uc3QgdWludDhfdCAqYmFzZV9vZmYgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihiYXNlKSArIChiaXRfb2ZmID4+IDMpOwotICB1aW50MzJfdCB2YWx1ZTMyOwotICBtZW1jcHkoJnZhbHVlMzIsIGJhc2Vfb2ZmLCBzaXplb2YodmFsdWUzMikpOwotICByZXR1cm4gKHZhbHVlMzIgPj4gQml0UGFja1NoaWZ0KGJpdF9vZmYgJiA3LCBsZW5ndGgpKSAmIG1hc2s7Ci0jZWxzZQotICByZXR1cm4gKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYmFzZSkgKyAoYml0X29mZiA+PiAzKSkgPj4gQml0UGFja1NoaWZ0KGJpdF9vZmYgJiA3LCBsZW5ndGgpKSAmIG1hc2s7Ci0jZW5kaWYKLX0KLQotaW5saW5lIHZvaWQgV3JpdGVJbnQyNSh2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2ZmLCB1aW50OF90IGxlbmd0aCwgdWludDMyX3QgdmFsdWUpIHsKLSNpZiBkZWZpbmVkKF9fYXJtKSB8fCBkZWZpbmVkKF9fYXJtX18pCi0gIHVpbnQ4X3QgKmJhc2Vfb2ZmID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmFzZSkgKyAoYml0X29mZiA+PiAzKTsKLSAgdWludDMyX3QgdmFsdWUzMjsKLSAgbWVtY3B5KCZ2YWx1ZTMyLCBiYXNlX29mZiwgc2l6ZW9mKHZhbHVlMzIpKTsKLSAgdmFsdWUzMiB8PSAodmFsdWUgPDwgQml0UGFja1NoaWZ0KGJpdF9vZmYgJiA3LCBsZW5ndGgpKTsKLSAgbWVtY3B5KGJhc2Vfb2ZmLCAmdmFsdWUzMiwgc2l6ZW9mKHZhbHVlMzIpKTsKLSNlbHNlCi0gICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4ocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmFzZSkgKyAoYml0X29mZiA+PiAzKSkgfD0gCi0gICAgKHZhbHVlIDw8IEJpdFBhY2tTaGlmdChiaXRfb2ZmICYgNywgbGVuZ3RoKSk7Ci0jZW5kaWYKLX0KLQotdHlwZWRlZiB1bmlvbiB7IGZsb2F0IGY7IHVpbnQzMl90IGk7IH0gRmxvYXRFbmM7Ci0KLWlubGluZSBmbG9hdCBSZWFkRmxvYXQzMihjb25zdCB2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2ZmKSB7Ci0gIEZsb2F0RW5jIGVuY29kZWQ7Ci0gIGVuY29kZWQuaSA9IFJlYWRPZmYoYmFzZSwgYml0X29mZikgPj4gQml0UGFja1NoaWZ0KGJpdF9vZmYgJiA3LCAzMik7Ci0gIHJldHVybiBlbmNvZGVkLmY7Ci19Ci1pbmxpbmUgdm9pZCBXcml0ZUZsb2F0MzIodm9pZCAqYmFzZSwgdWludDY0X3QgYml0X29mZiwgZmxvYXQgdmFsdWUpIHsKLSAgRmxvYXRFbmMgZW5jb2RlZDsKLSAgZW5jb2RlZC5mID0gdmFsdWU7Ci0gIFdyaXRlSW50NTcoYmFzZSwgYml0X29mZiwgMzIsIGVuY29kZWQuaSk7Ci19Ci0KLWNvbnN0IHVpbnQzMl90IGtTaWduQml0ID0gMHg4MDAwMDAwMDsKLQotaW5saW5lIHZvaWQgU2V0U2lnbihmbG9hdCAmdG8pIHsKLSAgRmxvYXRFbmMgZW5jOwotICBlbmMuZiA9IHRvOwotICBlbmMuaSB8PSBrU2lnbkJpdDsKLSAgdG8gPSBlbmMuZjsKLX0KLQotaW5saW5lIHZvaWQgVW5zZXRTaWduKGZsb2F0ICZ0bykgewotICBGbG9hdEVuYyBlbmM7Ci0gIGVuYy5mID0gdG87Ci0gIGVuYy5pICY9IH5rU2lnbkJpdDsKLSAgdG8gPSBlbmMuZjsKLX0KLQotaW5saW5lIGZsb2F0IFJlYWROb25Qb3NpdGl2ZUZsb2F0MzEoY29uc3Qgdm9pZCAqYmFzZSwgdWludDY0X3QgYml0X29mZikgewotICBGbG9hdEVuYyBlbmNvZGVkOwotICBlbmNvZGVkLmkgPSBSZWFkT2ZmKGJhc2UsIGJpdF9vZmYpID4+IEJpdFBhY2tTaGlmdChiaXRfb2ZmICYgNywgMzEpOwotICAvLyBTaWduIGJpdCBzZXQgbWVhbnMgbmVnYXRpdmUuICAKLSAgZW5jb2RlZC5pIHw9IGtTaWduQml0OwotICByZXR1cm4gZW5jb2RlZC5mOwotfQotaW5saW5lIHZvaWQgV3JpdGVOb25Qb3NpdGl2ZUZsb2F0MzEodm9pZCAqYmFzZSwgdWludDY0X3QgYml0X29mZiwgZmxvYXQgdmFsdWUpIHsKLSAgRmxvYXRFbmMgZW5jb2RlZDsKLSAgZW5jb2RlZC5mID0gdmFsdWU7Ci0gIGVuY29kZWQuaSAmPSB+a1NpZ25CaXQ7Ci0gIFdyaXRlSW50NTcoYmFzZSwgYml0X29mZiwgMzEsIGVuY29kZWQuaSk7Ci19Ci0KLXZvaWQgQml0UGFja2luZ1Nhbml0eSgpOwotCi0vLyBSZXR1cm4gYml0cyByZXF1aXJlZCB0byBzdG9yZSBpbnRlZ2VycyB1cHRvIG1heF92YWx1ZS4gIE5vdCB0aGUgbW9zdAotLy8gZWZmaWNpZW50IGltcGxlbWVudGF0aW9uLCBidXQgdGhpcyBpcyBvbmx5IGNhbGxlZCBhIGZldyB0aW1lcyB0byBzaXplIHRyaWVzLiAKLXVpbnQ4X3QgUmVxdWlyZWRCaXRzKHVpbnQ2NF90IG1heF92YWx1ZSk7Ci0KLXN0cnVjdCBCaXRzTWFzayB7Ci0gIHN0YXRpYyBCaXRzTWFzayBCeU1heCh1aW50NjRfdCBtYXhfdmFsdWUpIHsKLSAgICBCaXRzTWFzayByZXQ7Ci0gICAgcmV0LkZyb21NYXgobWF4X3ZhbHVlKTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0gIHN0YXRpYyBCaXRzTWFzayBCeUJpdHModWludDhfdCBiaXRzKSB7Ci0gICAgQml0c01hc2sgcmV0OwotICAgIHJldC5iaXRzID0gYml0czsKLSAgICByZXQubWFzayA9ICgxVUxMIDw8IGJpdHMpIC0gMTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0gIHZvaWQgRnJvbU1heCh1aW50NjRfdCBtYXhfdmFsdWUpIHsKLSAgICBiaXRzID0gUmVxdWlyZWRCaXRzKG1heF92YWx1ZSk7Ci0gICAgbWFzayA9ICgxVUxMIDw8IGJpdHMpIC0gMTsKLSAgfQotICB1aW50OF90IGJpdHM7Ci0gIHVpbnQ2NF90IG1hc2s7Ci19OwotCi1zdHJ1Y3QgQml0QWRkcmVzcyB7Ci0gIEJpdEFkZHJlc3Modm9pZCAqaW5fYmFzZSwgdWludDY0X3QgaW5fb2Zmc2V0KSA6IGJhc2UoaW5fYmFzZSksIG9mZnNldChpbl9vZmZzZXQpIHt9Ci0KLSAgdm9pZCAqYmFzZTsKLSAgdWludDY0X3Qgb2Zmc2V0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgdXRpbAotCi0jZW5kaWYgLy8gVVRJTF9CSVRfUEFDS0lOR19ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9iaXRfcGFja2luZ190ZXN0LmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvYml0X3BhY2tpbmdfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkYzIwMC4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9iaXRfcGFja2luZ190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotI2luY2x1ZGUgInV0aWwvYml0X3BhY2tpbmcuaGgiCi0KLSNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgQml0UGFja2luZ1Rlc3QKLSNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotbmFtZXNwYWNlIHV0aWwgewotbmFtZXNwYWNlIHsKLQotY29uc3QgdWludDY0X3QgdGVzdDU3ID0gMHgxMjM0NTY3ODlhYmNkZWZVTEw7Ci1jb25zdCB1aW50MzJfdCB0ZXN0MjUgPSAweDEyMzQ1Njc7Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKFplcm9CaXQ1NykgewotICBjaGFyIG1lbVsxNl07Ci0gIG1lbXNldChtZW0sIDAsIHNpemVvZihtZW0pKTsKLSAgV3JpdGVJbnQ1NyhtZW0sIDAsIDU3LCB0ZXN0NTcpOwotICBCT09TVF9DSEVDS19FUVVBTCh0ZXN0NTcsIFJlYWRJbnQ1NyhtZW0sIDAsIDU3LCAoMVVMTCA8PCA1NykgLSAxKSk7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKEVhY2hCaXQ1NykgewotICBjaGFyIG1lbVsxNl07Ci0gIGZvciAodWludDhfdCBiID0gMDsgYiA8IDg7ICsrYikgewotICAgIG1lbXNldChtZW0sIDAsIHNpemVvZihtZW0pKTsKLSAgICBXcml0ZUludDU3KG1lbSwgYiwgNTcsIHRlc3Q1Nyk7Ci0gICAgQk9PU1RfQ0hFQ0tfRVFVQUwodGVzdDU3LCBSZWFkSW50NTcobWVtLCBiLCA1NywgKDFVTEwgPDwgNTcpIC0gMSkpOwotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKENvbnNlY3V0aXZlNTcpIHsKLSAgY2hhciBtZW1bNTcrOF07Ci0gIG1lbXNldChtZW0sIDAsIHNpemVvZihtZW0pKTsKLSAgZm9yICh1aW50NjRfdCBiID0gMDsgYiA8IDU3ICogODsgYiArPSA1NykgewotICAgIFdyaXRlSW50NTcobWVtLCBiLCA1NywgdGVzdDU3KTsKLSAgICBCT09TVF9DSEVDS19FUVVBTCh0ZXN0NTcsIFJlYWRJbnQ1NyhtZW0sIGIsIDU3LCAoMVVMTCA8PCA1NykgLSAxKSk7Ci0gIH0KLSAgZm9yICh1aW50NjRfdCBiID0gMDsgYiA8IDU3ICogODsgYiArPSA1NykgewotICAgIEJPT1NUX0NIRUNLX0VRVUFMKHRlc3Q1NywgUmVhZEludDU3KG1lbSwgYiwgNTcsICgxVUxMIDw8IDU3KSAtIDEpKTsKLSAgfQotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShDb25zZWN1dGl2ZTI1KSB7Ci0gIGNoYXIgbWVtWzI1KzhdOwotICBtZW1zZXQobWVtLCAwLCBzaXplb2YobWVtKSk7Ci0gIGZvciAodWludDY0X3QgYiA9IDA7IGIgPCAyNSAqIDg7IGIgKz0gMjUpIHsKLSAgICBXcml0ZUludDI1KG1lbSwgYiwgMjUsIHRlc3QyNSk7Ci0gICAgQk9PU1RfQ0hFQ0tfRVFVQUwodGVzdDI1LCBSZWFkSW50MjUobWVtLCBiLCAyNSwgKDFVTEwgPDwgMjUpIC0gMSkpOwotICB9Ci0gIGZvciAodWludDY0X3QgYiA9IDA7IGIgPCAyNSAqIDg7IGIgKz0gMjUpIHsKLSAgICBCT09TVF9DSEVDS19FUVVBTCh0ZXN0MjUsIFJlYWRJbnQyNShtZW0sIGIsIDI1LCAoMVVMTCA8PCAyNSkgLSAxKSk7Ci0gIH0KLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoU2FuaXR5KSB7Ci0gIEJpdFBhY2tpbmdTYW5pdHkoKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UKLX0gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2NhdF9jb21wcmVzc2VkX21haW4uY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9jYXRfY29tcHJlc3NlZF9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjRkNzI5Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2NhdF9jb21wcmVzc2VkX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyBMaWtlIGNhdCBidXQgaW50ZXJwcmV0cyBjb21wcmVzc2VkIGZpbGVzLgotI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKLSNpbmNsdWRlICJ1dGlsL3JlYWRfY29tcHJlc3NlZC5oaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi1uYW1lc3BhY2UgewotY29uc3Qgc3RkOjpzaXplX3Qga0J1ZlNpemUgPSAxNjM4NDsKLXZvaWQgQ29weSh1dGlsOjpSZWFkQ29tcHJlc3NlZCAmZnJvbSwgaW50IHRvKSB7Ci0gIHV0aWw6OnNjb3BlZF9tYWxsb2MgYnVmZmVyKHV0aWw6Ok1hbGxvY09yVGhyb3coa0J1ZlNpemUpKTsKLSAgd2hpbGUgKHN0ZDo6c2l6ZV90IGFtb3VudCA9IGZyb20uUmVhZChidWZmZXIuZ2V0KCksIGtCdWZTaXplKSkgewotICAgIHV0aWw6OldyaXRlT3JUaHJvdyh0bywgYnVmZmVyLmdldCgpLCBhbW91bnQpOwotICB9Ci19Ci19IC8vIG5hbWVzcGFjZQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0gIC8vIExhbmUgU2Nod2FydHogbGlrZXMgLWggYW5kIC0taGVscAotICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkgewotICAgIGNoYXIgKmFyZyA9IGFyZ3ZbaV07Ci0gICAgaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgYnJlYWs7Ci0gICAgaWYgKCFzdHJjbXAoYXJnLCAiLWgiKSB8fCAhc3RyY21wKGFyZywgIi0taGVscCIpKSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgCi0gICAgICAgICJBIGNhdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGludGVycHJldHMgY29tcHJlc3NlZCBmaWxlcy5cbiIKLSAgICAgICAgIlVzYWdlOiAiIDw8IGFyZ3ZbMF0gPDwgIiBbZmlsZTFdIFtmaWxlMl0gLi4uXG4iCi0gICAgICAgICJJZiBubyBmaWxlIGlzIHByb3ZpZGVkLCB0aGVuIHN0ZGluIGlzIHJlYWQuXG4iOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0KLSAgdHJ5IHsKLSAgICBpZiAoYXJnYyA9PSAxKSB7Ci0gICAgICB1dGlsOjpSZWFkQ29tcHJlc3NlZCBpbigwKTsKLSAgICAgIENvcHkoaW4sIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkgewotICAgICAgICB1dGlsOjpSZWFkQ29tcHJlc3NlZCBpbih1dGlsOjpPcGVuUmVhZE9yVGhyb3coYXJndltpXSkpOwotICAgICAgICBDb3B5KGluLCAxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZlKSB7Ci0gICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gMjsKLSAgfQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2JpZ251bS1kdG9hLmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vYmlnbnVtLWR0b2EuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YzJlODUuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vYmlnbnVtLWR0b2EuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotLy8gICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0vLyAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLS8vICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSAiYmlnbnVtLWR0b2EuaCIKLQotI2luY2x1ZGUgImJpZ251bS5oIgotI2luY2x1ZGUgImllZWUuaCIKLQotbmFtZXNwYWNlIGRvdWJsZV9jb252ZXJzaW9uIHsKLQotc3RhdGljIGludCBOb3JtYWxpemVkRXhwb25lbnQodWludDY0X3Qgc2lnbmlmaWNhbmQsIGludCBleHBvbmVudCkgewotICBBU1NFUlQoc2lnbmlmaWNhbmQgIT0gMCk7Ci0gIHdoaWxlICgoc2lnbmlmaWNhbmQgJiBEb3VibGU6OmtIaWRkZW5CaXQpID09IDApIHsKLSAgICBzaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kIDw8IDE7Ci0gICAgZXhwb25lbnQgPSBleHBvbmVudCAtIDE7Ci0gIH0KLSAgcmV0dXJuIGV4cG9uZW50OwotfQotCi0KLS8vIEZvcndhcmQgZGVjbGFyYXRpb25zOgotLy8gUmV0dXJucyBhbiBlc3RpbWF0aW9uIG9mIGsgc3VjaCB0aGF0IDEwXihrLTEpIDw9IHYgPCAxMF5rLgotc3RhdGljIGludCBFc3RpbWF0ZVBvd2VyKGludCBleHBvbmVudCk7Ci0vLyBDb21wdXRlcyB2IC8gMTBeZXN0aW1hdGVkX3Bvd2VyIGV4YWN0bHksIGFzIGEgcmF0aW8gb2YgdHdvIGJpZ251bXMsIG51bWVyYXRvcgotLy8gYW5kIGRlbm9taW5hdG9yLgotc3RhdGljIHZvaWQgSW5pdGlhbFNjYWxlZFN0YXJ0VmFsdWVzKHVpbnQ2NF90IHNpZ25pZmljYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvd2VyX2JvdW5kYXJ5X2lzX2Nsb3NlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXN0aW1hdGVkX3Bvd2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZF9ib3VuZGFyeV9kZWx0YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnbnVtKiBudW1lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnbnVtKiBkZW5vbWluYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIGRlbHRhX21pbnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogZGVsdGFfcGx1cyk7Ci0vLyBNdWx0aXBsaWVzIG51bWVyYXRvci9kZW5vbWluYXRvciBzbyB0aGF0IGl0cyB2YWx1ZXMgbGllcyBpbiB0aGUgcmFuZ2UgMS0xMC4KLS8vIFJldHVybnMgZGVjaW1hbF9wb2ludCBzLnQuCi0vLyAgdiA9IG51bWVyYXRvcicvZGVub21pbmF0b3InICogMTBeKGRlY2ltYWxfcG9pbnQtMSkKLS8vICAgICB3aGVyZSBudW1lcmF0b3InIGFuZCBkZW5vbWluYXRvcicgYXJlIHRoZSB2YWx1ZXMgb2YgbnVtZXJhdG9yIGFuZAotLy8gICAgIGRlbm9taW5hdG9yIGFmdGVyIHRoZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCi1zdGF0aWMgdm9pZCBGaXh1cE11bHRpcGx5MTAoaW50IGVzdGltYXRlZF9wb3dlciwgYm9vbCBpc19ldmVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVjaW1hbF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIGRlbHRhX21pbnVzLCBCaWdudW0qIGRlbHRhX3BsdXMpOwotLy8gR2VuZXJhdGVzIGRpZ2l0cyBmcm9tIHRoZSBsZWZ0IHRvIHRoZSByaWdodCBhbmQgc3RvcHMgd2hlbiB0aGUgZ2VuZXJhdGVkCi0vLyBkaWdpdHMgeWllbGQgdGhlIHNob3J0ZXN0IGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2Ygdi4KLXN0YXRpYyB2b2lkIEdlbmVyYXRlU2hvcnRlc3REaWdpdHMoQmlnbnVtKiBudW1lcmF0b3IsIEJpZ251bSogZGVub21pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogZGVsdGFfbWludXMsIEJpZ251bSogZGVsdGFfcGx1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19ldmVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8Y2hhcj4gYnVmZmVyLCBpbnQqIGxlbmd0aCk7Ci0vLyBHZW5lcmF0ZXMgJ3JlcXVlc3RlZF9kaWdpdHMnIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50Lgotc3RhdGljIHZvaWQgQmlnbnVtVG9GaXhlZChpbnQgcmVxdWVzdGVkX2RpZ2l0cywgaW50KiBkZWNpbWFsX3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+KGJ1ZmZlciksIGludCogbGVuZ3RoKTsKLS8vIEdlbmVyYXRlcyAnY291bnQnIGRpZ2l0cyBvZiBudW1lcmF0b3IvZGVub21pbmF0b3IuCi0vLyBPbmNlICdjb3VudCcgZGlnaXRzIGhhdmUgYmVlbiBwcm9kdWNlZCByb3VuZHMgdGhlIHJlc3VsdCBkZXBlbmRpbmcgb24gdGhlCi0vLyByZW1haW5kZXIgKHJlbWFpbmRlcnMgb2YgZXhhY3RseSAuNSByb3VuZCB1cHdhcmRzKS4gTWlnaHQgdXBkYXRlIHRoZQotLy8gZGVjaW1hbF9wb2ludCB3aGVuIHJvdW5kaW5nIHVwIChmb3IgZXhhbXBsZSBmb3IgMC45OTk5KS4KLXN0YXRpYyB2b2lkIEdlbmVyYXRlQ291bnRlZERpZ2l0cyhpbnQgY291bnQsIGludCogZGVjaW1hbF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8Y2hhcj4oYnVmZmVyKSwgaW50KiBsZW5ndGgpOwotCi0KLXZvaWQgQmlnbnVtRHRvYShkb3VibGUgdiwgQmlnbnVtRHRvYU1vZGUgbW9kZSwgaW50IHJlcXVlc3RlZF9kaWdpdHMsCi0gICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+IGJ1ZmZlciwgaW50KiBsZW5ndGgsIGludCogZGVjaW1hbF9wb2ludCkgewotICBBU1NFUlQodiA+IDApOwotICBBU1NFUlQoIURvdWJsZSh2KS5Jc1NwZWNpYWwoKSk7Ci0gIHVpbnQ2NF90IHNpZ25pZmljYW5kOwotICBpbnQgZXhwb25lbnQ7Ci0gIGJvb2wgbG93ZXJfYm91bmRhcnlfaXNfY2xvc2VyOwotICBpZiAobW9kZSA9PSBCSUdOVU1fRFRPQV9TSE9SVEVTVF9TSU5HTEUpIHsKLSAgICBmbG9hdCBmID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHYpOwotICAgIEFTU0VSVChmID09IHYpOwotICAgIHNpZ25pZmljYW5kID0gU2luZ2xlKGYpLlNpZ25pZmljYW5kKCk7Ci0gICAgZXhwb25lbnQgPSBTaW5nbGUoZikuRXhwb25lbnQoKTsKLSAgICBsb3dlcl9ib3VuZGFyeV9pc19jbG9zZXIgPSBTaW5nbGUoZikuTG93ZXJCb3VuZGFyeUlzQ2xvc2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc2lnbmlmaWNhbmQgPSBEb3VibGUodikuU2lnbmlmaWNhbmQoKTsKLSAgICBleHBvbmVudCA9IERvdWJsZSh2KS5FeHBvbmVudCgpOwotICAgIGxvd2VyX2JvdW5kYXJ5X2lzX2Nsb3NlciA9IERvdWJsZSh2KS5Mb3dlckJvdW5kYXJ5SXNDbG9zZXIoKTsKLSAgfQotICBib29sIG5lZWRfYm91bmRhcnlfZGVsdGFzID0KLSAgICAgIChtb2RlID09IEJJR05VTV9EVE9BX1NIT1JURVNUIHx8IG1vZGUgPT0gQklHTlVNX0RUT0FfU0hPUlRFU1RfU0lOR0xFKTsKLQotICBib29sIGlzX2V2ZW4gPSAoc2lnbmlmaWNhbmQgJiAxKSA9PSAwOwotICBpbnQgbm9ybWFsaXplZF9leHBvbmVudCA9IE5vcm1hbGl6ZWRFeHBvbmVudChzaWduaWZpY2FuZCwgZXhwb25lbnQpOwotICAvLyBlc3RpbWF0ZWRfcG93ZXIgbWlnaHQgYmUgdG9vIGxvdyBieSAxLgotICBpbnQgZXN0aW1hdGVkX3Bvd2VyID0gRXN0aW1hdGVQb3dlcihub3JtYWxpemVkX2V4cG9uZW50KTsKLQotICAvLyBTaG9ydGN1dCBmb3IgRml4ZWQuCi0gIC8vIFRoZSByZXF1ZXN0ZWQgZGlnaXRzIGNvcnJlc3BvbmQgdG8gdGhlIGRpZ2l0cyBhZnRlciB0aGUgcG9pbnQuIElmIHRoZQotICAvLyBudW1iZXIgaXMgbXVjaCB0b28gc21hbGwsIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCBpbiB0cnlpbmcgdG8gZ2V0IGFueQotICAvLyBkaWdpdHMuCi0gIGlmIChtb2RlID09IEJJR05VTV9EVE9BX0ZJWEVEICYmIC1lc3RpbWF0ZWRfcG93ZXIgLSAxID4gcmVxdWVzdGVkX2RpZ2l0cykgewotICAgIGJ1ZmZlclswXSA9ICdcMCc7Ci0gICAgKmxlbmd0aCA9IDA7Ci0gICAgLy8gU2V0IGRlY2ltYWwtcG9pbnQgdG8gLXJlcXVlc3RlZF9kaWdpdHMuIFRoaXMgaXMgd2hhdCBHYXkgZG9lcy4KLSAgICAvLyBOb3RlIHRoYXQgaXQgc2hvdWxkIG5vdCBoYXZlIGFueSBlZmZlY3QgYW55d2F5cyBzaW5jZSB0aGUgc3RyaW5nIGlzCi0gICAgLy8gZW1wdHkuCi0gICAgKmRlY2ltYWxfcG9pbnQgPSAtcmVxdWVzdGVkX2RpZ2l0czsKLSAgICByZXR1cm47Ci0gIH0KLQotICBCaWdudW0gbnVtZXJhdG9yOwotICBCaWdudW0gZGVub21pbmF0b3I7Ci0gIEJpZ251bSBkZWx0YV9taW51czsKLSAgQmlnbnVtIGRlbHRhX3BsdXM7Ci0gIC8vIE1ha2Ugc3VyZSB0aGUgYmlnbnVtIGNhbiBncm93IGxhcmdlIGVub3VnaC4gVGhlIHNtYWxsZXN0IGRvdWJsZSBlcXVhbHMKLSAgLy8gNGUtMzI0LiBJbiB0aGlzIGNhc2UgdGhlIGRlbm9taW5hdG9yIG5lZWRzIGZld2VyIHRoYW4gMzI0KjQgYmluYXJ5IGRpZ2l0cy4KLSAgLy8gVGhlIG1heGltdW0gZG91YmxlIGlzIDEuNzk3NjkzMTM0ODYyMzE1N2UzMDggd2hpY2ggbmVlZHMgZmV3ZXIgdGhhbgotICAvLyAzMDgqNCBiaW5hcnkgZGlnaXRzLgotICBBU1NFUlQoQmlnbnVtOjprTWF4U2lnbmlmaWNhbnRCaXRzID49IDMyNCo0KTsKLSAgSW5pdGlhbFNjYWxlZFN0YXJ0VmFsdWVzKHNpZ25pZmljYW5kLCBleHBvbmVudCwgbG93ZXJfYm91bmRhcnlfaXNfY2xvc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkX3Bvd2VyLCBuZWVkX2JvdW5kYXJ5X2RlbHRhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1lcmF0b3IsICZkZW5vbWluYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9taW51cywgJmRlbHRhX3BsdXMpOwotICAvLyBXZSBub3cgaGF2ZSB2ID0gKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKSAqIDEwXmVzdGltYXRlZF9wb3dlci4KLSAgRml4dXBNdWx0aXBseTEwKGVzdGltYXRlZF9wb3dlciwgaXNfZXZlbiwgZGVjaW1hbF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICZudW1lcmF0b3IsICZkZW5vbWluYXRvciwKLSAgICAgICAgICAgICAgICAgICZkZWx0YV9taW51cywgJmRlbHRhX3BsdXMpOwotICAvLyBXZSBub3cgaGF2ZSB2ID0gKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKSAqIDEwXihkZWNpbWFsX3BvaW50LTEpLCBhbmQKLSAgLy8gIDEgPD0gKG51bWVyYXRvciArIGRlbHRhX3BsdXMpIC8gZGVub21pbmF0b3IgPCAxMAotICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBjYXNlIEJJR05VTV9EVE9BX1NIT1JURVNUOgotICAgIGNhc2UgQklHTlVNX0RUT0FfU0hPUlRFU1RfU0lOR0xFOgotICAgICAgR2VuZXJhdGVTaG9ydGVzdERpZ2l0cygmbnVtZXJhdG9yLCAmZGVub21pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9taW51cywgJmRlbHRhX3BsdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V2ZW4sIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQklHTlVNX0RUT0FfRklYRUQ6Ci0gICAgICBCaWdudW1Ub0ZpeGVkKHJlcXVlc3RlZF9kaWdpdHMsIGRlY2ltYWxfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICZudW1lcmF0b3IsICZkZW5vbWluYXRvciwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCSUdOVU1fRFRPQV9QUkVDSVNJT046Ci0gICAgICBHZW5lcmF0ZUNvdW50ZWREaWdpdHMocmVxdWVzdGVkX2RpZ2l0cywgZGVjaW1hbF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtZXJhdG9yLCAmZGVub21pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFVOUkVBQ0hBQkxFKCk7Ci0gIH0KLSAgYnVmZmVyWypsZW5ndGhdID0gJ1wwJzsKLX0KLQotCi0vLyBUaGUgcHJvY2VkdXJlIHN0YXJ0cyBnZW5lcmF0aW5nIGRpZ2l0cyBmcm9tIHRoZSBsZWZ0IHRvIHRoZSByaWdodCBhbmQgc3RvcHMKLS8vIHdoZW4gdGhlIGdlbmVyYXRlZCBkaWdpdHMgeWllbGQgdGhlIHNob3J0ZXN0IGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2Ygdi4gQQotLy8gZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB2IGlzIGEgbnVtYmVyIGx5aW5nIGNsb3NlciB0byB2IHRoYW4gdG8gYW55IG90aGVyCi0vLyBkb3VibGUsIHNvIGl0IGNvbnZlcnRzIHRvIHYgd2hlbiByZWFkLgotLy8KLS8vIFRoaXMgaXMgdHJ1ZSBpZiBkLCB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiwgaXMgYmV0d2VlbiBtLSBhbmQgbSssIHRoZQotLy8gdXBwZXIgYW5kIGxvd2VyIGJvdW5kYXJpZXMuIGQgbXVzdCBiZSBzdHJpY3RseSBiZXR3ZWVuIHRoZW0gaWYgIWlzX2V2ZW4uCi0vLyAgICAgICAgICAgbS0gOj0gKG51bWVyYXRvciAtIGRlbHRhX21pbnVzKSAvIGRlbm9taW5hdG9yCi0vLyAgICAgICAgICAgbSsgOj0gKG51bWVyYXRvciArIGRlbHRhX3BsdXMpIC8gZGVub21pbmF0b3IKLS8vCi0vLyBQcmVjb25kaXRpb246IDAgPD0gKG51bWVyYXRvcitkZWx0YV9wbHVzKSAvIGRlbm9taW5hdG9yIDwgMTAuCi0vLyAgIElmIDEgPD0gKG51bWVyYXRvcitkZWx0YV9wbHVzKSAvIGRlbm9taW5hdG9yIDwgMTAgdGhlbiBubyBsZWFkaW5nIDAgZGlnaXQKLS8vICAgd2lsbCBiZSBwcm9kdWNlZC4gVGhpcyBzaG91bGQgYmUgdGhlIHN0YW5kYXJkIHByZWNvbmRpdGlvbi4KLXN0YXRpYyB2b2lkIEdlbmVyYXRlU2hvcnRlc3REaWdpdHMoQmlnbnVtKiBudW1lcmF0b3IsIEJpZ251bSogZGVub21pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogZGVsdGFfbWludXMsIEJpZ251bSogZGVsdGFfcGx1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19ldmVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8Y2hhcj4gYnVmZmVyLCBpbnQqIGxlbmd0aCkgewotICAvLyBTbWFsbCBvcHRpbWl6YXRpb246IGlmIGRlbHRhX21pbnVzIGFuZCBkZWx0YV9wbHVzIGFyZSB0aGUgc2FtZSBqdXN0IHJldXNlCi0gIC8vIG9uZSBvZiB0aGUgdHdvIGJpZ251bXMuCi0gIGlmIChCaWdudW06OkVxdWFsKCpkZWx0YV9taW51cywgKmRlbHRhX3BsdXMpKSB7Ci0gICAgZGVsdGFfcGx1cyA9IGRlbHRhX21pbnVzOwotICB9Ci0gICpsZW5ndGggPSAwOwotICB3aGlsZSAodHJ1ZSkgewotICAgIHVpbnQxNl90IGRpZ2l0OwotICAgIGRpZ2l0ID0gbnVtZXJhdG9yLT5EaXZpZGVNb2R1bG9JbnRCaWdudW0oKmRlbm9taW5hdG9yKTsKLSAgICBBU1NFUlQoZGlnaXQgPD0gOSk7ICAvLyBkaWdpdCBpcyBhIHVpbnQxNl90IGFuZCB0aGVyZWZvcmUgYWx3YXlzIHBvc2l0aXZlLgotICAgIC8vIGRpZ2l0ID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3IgKGludGVnZXIgZGl2aXNpb24pLgotICAgIC8vIG51bWVyYXRvciA9IG51bWVyYXRvciAlIGRlbm9taW5hdG9yLgotICAgIGJ1ZmZlclsoKmxlbmd0aCkrK10gPSBkaWdpdCArICcwJzsKLQotICAgIC8vIENhbiB3ZSBzdG9wIGFscmVhZHk/Ci0gICAgLy8gSWYgdGhlIHJlbWFpbmRlciBvZiB0aGUgZGl2aXNpb24gaXMgbGVzcyB0aGFuIHRoZSBkaXN0YW5jZSB0byB0aGUgbG93ZXIKLSAgICAvLyBib3VuZGFyeSB3ZSBjYW4gc3RvcC4gSW4gdGhpcyBjYXNlIHdlIHNpbXBseSByb3VuZCBkb3duIChkaXNjYXJkaW5nIHRoZQotICAgIC8vIHJlbWFpbmRlcikuCi0gICAgLy8gU2ltaWxhcmx5IHdlIHRlc3QgaWYgd2UgY2FuIHJvdW5kIHVwICh1c2luZyB0aGUgdXBwZXIgYm91bmRhcnkpLgotICAgIGJvb2wgaW5fZGVsdGFfcm9vbV9taW51czsKLSAgICBib29sIGluX2RlbHRhX3Jvb21fcGx1czsKLSAgICBpZiAoaXNfZXZlbikgewotICAgICAgaW5fZGVsdGFfcm9vbV9taW51cyA9IEJpZ251bTo6TGVzc0VxdWFsKCpudW1lcmF0b3IsICpkZWx0YV9taW51cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluX2RlbHRhX3Jvb21fbWludXMgPSBCaWdudW06Okxlc3MoKm51bWVyYXRvciwgKmRlbHRhX21pbnVzKTsKLSAgICB9Ci0gICAgaWYgKGlzX2V2ZW4pIHsKLSAgICAgIGluX2RlbHRhX3Jvb21fcGx1cyA9Ci0gICAgICAgICAgQmlnbnVtOjpQbHVzQ29tcGFyZSgqbnVtZXJhdG9yLCAqZGVsdGFfcGx1cywgKmRlbm9taW5hdG9yKSA+PSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbl9kZWx0YV9yb29tX3BsdXMgPQotICAgICAgICAgIEJpZ251bTo6UGx1c0NvbXBhcmUoKm51bWVyYXRvciwgKmRlbHRhX3BsdXMsICpkZW5vbWluYXRvcikgPiAwOwotICAgIH0KLSAgICBpZiAoIWluX2RlbHRhX3Jvb21fbWludXMgJiYgIWluX2RlbHRhX3Jvb21fcGx1cykgewotICAgICAgLy8gUHJlcGFyZSBmb3IgbmV4dCBpdGVyYXRpb24uCi0gICAgICBudW1lcmF0b3ItPlRpbWVzMTAoKTsKLSAgICAgIGRlbHRhX21pbnVzLT5UaW1lczEwKCk7Ci0gICAgICAvLyBXZSBvcHRpbWl6ZWQgZGVsdGFfcGx1cyB0byBiZSBlcXVhbCB0byBkZWx0YV9taW51cyAoaWYgdGhleSBzaGFyZSB0aGUKLSAgICAgIC8vIHNhbWUgdmFsdWUpLiBTbyBkb24ndCBtdWx0aXBseSBkZWx0YV9wbHVzIGlmIHRoZXkgcG9pbnQgdG8gdGhlIHNhbWUKLSAgICAgIC8vIG9iamVjdC4KLSAgICAgIGlmIChkZWx0YV9taW51cyAhPSBkZWx0YV9wbHVzKSB7Ci0gICAgICAgIGRlbHRhX3BsdXMtPlRpbWVzMTAoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGluX2RlbHRhX3Jvb21fbWludXMgJiYgaW5fZGVsdGFfcm9vbV9wbHVzKSB7Ci0gICAgICAvLyBMZXQncyBzZWUgaWYgMipudW1lcmF0b3IgPCBkZW5vbWluYXRvci4KLSAgICAgIC8vIElmIHllcywgdGhlbiB0aGUgbmV4dCBkaWdpdCB3b3VsZCBiZSA8IDUgYW5kIHdlIGNhbiByb3VuZCBkb3duLgotICAgICAgaW50IGNvbXBhcmUgPSBCaWdudW06OlBsdXNDb21wYXJlKCpudW1lcmF0b3IsICpudW1lcmF0b3IsICpkZW5vbWluYXRvcik7Ci0gICAgICBpZiAoY29tcGFyZSA8IDApIHsKLSAgICAgICAgLy8gUmVtYWluaW5nIGRpZ2l0cyBhcmUgbGVzcyB0aGFuIC41LiAtPiBSb3VuZCBkb3duICg9PSBkbyBub3RoaW5nKS4KLSAgICAgIH0gZWxzZSBpZiAoY29tcGFyZSA+IDApIHsKLSAgICAgICAgLy8gUmVtYWluaW5nIGRpZ2l0cyBhcmUgbW9yZSB0aGFuIC41IG9mIGRlbm9taW5hdG9yLiAtPiBSb3VuZCB1cC4KLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBsYXN0IGRpZ2l0IGNvdWxkIG5vdCBiZSBhICc5JyBhcyBvdGhlcndpc2UgdGhlIHdob2xlCi0gICAgICAgIC8vIGxvb3Agd291bGQgaGF2ZSBzdG9wcGVkIGVhcmxpZXIuCi0gICAgICAgIC8vIFdlIHN0aWxsIGhhdmUgYW4gYXNzZXJ0IGhlcmUgaW4gY2FzZSB0aGUgcHJlY29uZGl0aW9ucyB3ZXJlIG5vdAotICAgICAgICAvLyBzYXRpc2ZpZWQuCi0gICAgICAgIEFTU0VSVChidWZmZXJbKCpsZW5ndGgpIC0gMV0gIT0gJzknKTsKLSAgICAgICAgYnVmZmVyWygqbGVuZ3RoKSAtIDFdKys7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBIYWxmd2F5IGNhc2UuCi0gICAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBuZWVkIGEgd2F5IHRvIHNvbHZlIGhhbGYtd2F5IGNhc2VzLgotICAgICAgICAvLyAgIEZvciBub3cgbGV0J3Mgcm91bmQgdG93YXJkcyBldmVuIChzaW5jZSB0aGlzIGlzIHdoYXQgR2F5IHNlZW1zIHRvCi0gICAgICAgIC8vICAgZG8pLgotCi0gICAgICAgIGlmICgoYnVmZmVyWygqbGVuZ3RoKSAtIDFdIC0gJzAnKSAlIDIgPT0gMCkgewotICAgICAgICAgIC8vIFJvdW5kIGRvd24gPT4gRG8gbm90aGluZy4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBBU1NFUlQoYnVmZmVyWygqbGVuZ3RoKSAtIDFdICE9ICc5Jyk7Ci0gICAgICAgICAgYnVmZmVyWygqbGVuZ3RoKSAtIDFdKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGluX2RlbHRhX3Jvb21fbWludXMpIHsKLSAgICAgIC8vIFJvdW5kIGRvd24gKD09IGRvIG5vdGhpbmcpLgotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7ICAvLyBpbl9kZWx0YV9yb29tX3BsdXMKLSAgICAgIC8vIFJvdW5kIHVwLgotICAgICAgLy8gTm90ZSBhZ2FpbiB0aGF0IHRoZSBsYXN0IGRpZ2l0IGNvdWxkIG5vdCBiZSAnOScgc2luY2UgdGhpcyB3b3VsZCBoYXZlCi0gICAgICAvLyBzdG9wcGVkIHRoZSBsb29wIGVhcmxpZXIuCi0gICAgICAvLyBXZSBzdGlsbCBoYXZlIGFuIEFTU0VSVCBoZXJlLCBpbiBjYXNlIHRoZSBwcmVjb25kaXRpb25zIHdlcmUgbm90Ci0gICAgICAvLyBzYXRpc2ZpZWQuCi0gICAgICBBU1NFUlQoYnVmZmVyWygqbGVuZ3RoKSAtMV0gIT0gJzknKTsKLSAgICAgIGJ1ZmZlclsoKmxlbmd0aCkgLSAxXSsrOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi0KLS8vIExldCB2ID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3IgPCAxMC4KLS8vIFRoZW4gd2UgZ2VuZXJhdGUgJ2NvdW50JyBkaWdpdHMgb2YgZCA9IHgueHh4eHguLi4gKHdpdGhvdXQgdGhlIGRlY2ltYWwgcG9pbnQpCi0vLyBmcm9tIGxlZnQgdG8gcmlnaHQuIE9uY2UgJ2NvdW50JyBkaWdpdHMgaGF2ZSBiZWVuIHByb2R1Y2VkIHdlIGRlY2lkZSB3ZXRoZXIKLS8vIHRvIHJvdW5kIHVwIG9yIGRvd24uIFJlbWFpbmRlcnMgb2YgZXhhY3RseSAuNSByb3VuZCB1cHdhcmRzLiBOdW1iZXJzIHN1Y2gKLS8vIGFzIDkuOTk5OTk5IHByb3BhZ2F0ZSBhIGNhcnJ5IGFsbCB0aGUgd2F5LCBhbmQgY2hhbmdlIHRoZQotLy8gZXhwb25lbnQgKGRlY2ltYWxfcG9pbnQpLCB3aGVuIHJvdW5kaW5nIHVwd2FyZHMuCi1zdGF0aWMgdm9pZCBHZW5lcmF0ZUNvdW50ZWREaWdpdHMoaW50IGNvdW50LCBpbnQqIGRlY2ltYWxfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnbnVtKiBudW1lcmF0b3IsIEJpZ251bSogZGVub21pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+KGJ1ZmZlciksIGludCogbGVuZ3RoKSB7Ci0gIEFTU0VSVChjb3VudCA+PSAwKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudCAtIDE7ICsraSkgewotICAgIHVpbnQxNl90IGRpZ2l0OwotICAgIGRpZ2l0ID0gbnVtZXJhdG9yLT5EaXZpZGVNb2R1bG9JbnRCaWdudW0oKmRlbm9taW5hdG9yKTsKLSAgICBBU1NFUlQoZGlnaXQgPD0gOSk7ICAvLyBkaWdpdCBpcyBhIHVpbnQxNl90IGFuZCB0aGVyZWZvcmUgYWx3YXlzIHBvc2l0aXZlLgotICAgIC8vIGRpZ2l0ID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3IgKGludGVnZXIgZGl2aXNpb24pLgotICAgIC8vIG51bWVyYXRvciA9IG51bWVyYXRvciAlIGRlbm9taW5hdG9yLgotICAgIGJ1ZmZlcltpXSA9IGRpZ2l0ICsgJzAnOwotICAgIC8vIFByZXBhcmUgZm9yIG5leHQgaXRlcmF0aW9uLgotICAgIG51bWVyYXRvci0+VGltZXMxMCgpOwotICB9Ci0gIC8vIEdlbmVyYXRlIHRoZSBsYXN0IGRpZ2l0LgotICB1aW50MTZfdCBkaWdpdDsKLSAgZGlnaXQgPSBudW1lcmF0b3ItPkRpdmlkZU1vZHVsb0ludEJpZ251bSgqZGVub21pbmF0b3IpOwotICBpZiAoQmlnbnVtOjpQbHVzQ29tcGFyZSgqbnVtZXJhdG9yLCAqbnVtZXJhdG9yLCAqZGVub21pbmF0b3IpID49IDApIHsKLSAgICBkaWdpdCsrOwotICB9Ci0gIGJ1ZmZlcltjb3VudCAtIDFdID0gZGlnaXQgKyAnMCc7Ci0gIC8vIENvcnJlY3QgYmFkIGRpZ2l0cyAoaW4gY2FzZSB3ZSBoYWQgYSBzZXF1ZW5jZSBvZiAnOSdzKS4gUHJvcGFnYXRlIHRoZQotICAvLyBjYXJyeSB1bnRpbCB3ZSBoYXQgYSBub24tJzknIG9yIHRpbCB3ZSByZWFjaCB0aGUgZmlyc3QgZGlnaXQuCi0gIGZvciAoaW50IGkgPSBjb3VudCAtIDE7IGkgPiAwOyAtLWkpIHsKLSAgICBpZiAoYnVmZmVyW2ldICE9ICcwJyArIDEwKSBicmVhazsKLSAgICBidWZmZXJbaV0gPSAnMCc7Ci0gICAgYnVmZmVyW2kgLSAxXSsrOwotICB9Ci0gIGlmIChidWZmZXJbMF0gPT0gJzAnICsgMTApIHsKLSAgICAvLyBQcm9wYWdhdGUgYSBjYXJyeSBwYXN0IHRoZSB0b3AgcGxhY2UuCi0gICAgYnVmZmVyWzBdID0gJzEnOwotICAgICgqZGVjaW1hbF9wb2ludCkrKzsKLSAgfQotICAqbGVuZ3RoID0gY291bnQ7Ci19Ci0KLQotLy8gR2VuZXJhdGVzICdyZXF1ZXN0ZWRfZGlnaXRzJyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4gSXQgbWlnaHQgb21pdAotLy8gdHJhaWxpbmcgJzAncy4gSWYgdGhlIGlucHV0IG51bWJlciBpcyB0b28gc21hbGwgdGhlbiBubyBkaWdpdHMgYXQgYWxsIGFyZQotLy8gZ2VuZXJhdGVkIChleC46IDIgZml4ZWQgZGlnaXRzIGZvciAwLjAwMDAxKS4KLS8vCi0vLyBJbnB1dCB2ZXJpZmllczogIDEgPD0gKG51bWVyYXRvciArIGRlbHRhKSAvIGRlbm9taW5hdG9yIDwgMTAuCi1zdGF0aWMgdm9pZCBCaWdudW1Ub0ZpeGVkKGludCByZXF1ZXN0ZWRfZGlnaXRzLCBpbnQqIGRlY2ltYWxfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogbnVtZXJhdG9yLCBCaWdudW0qIGRlbm9taW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8Y2hhcj4oYnVmZmVyKSwgaW50KiBsZW5ndGgpIHsKLSAgLy8gTm90ZSB0aGF0IHdlIGhhdmUgdG8gbG9vayBhdCBtb3JlIHRoYW4ganVzdCB0aGUgcmVxdWVzdGVkX2RpZ2l0cywgc2luY2UKLSAgLy8gYSBudW1iZXIgY291bGQgYmUgcm91bmRlZCB1cC4gRXhhbXBsZTogdj0wLjUgd2l0aCByZXF1ZXN0ZWRfZGlnaXRzPTAuCi0gIC8vIEV2ZW4gdGhvdWdoIHRoZSBwb3dlciBvZiB2IGVxdWFscyAwIHdlIGNhbid0IGp1c3Qgc3RvcCBoZXJlLgotICBpZiAoLSgqZGVjaW1hbF9wb2ludCkgPiByZXF1ZXN0ZWRfZGlnaXRzKSB7Ci0gICAgLy8gVGhlIG51bWJlciBpcyBkZWZpbml0aXZlbHkgdG9vIHNtYWxsLgotICAgIC8vIEV4OiAwLjAwMSB3aXRoIHJlcXVlc3RlZF9kaWdpdHMgPT0gMS4KLSAgICAvLyBTZXQgZGVjaW1hbC1wb2ludCB0byAtcmVxdWVzdGVkX2RpZ2l0cy4gVGhpcyBpcyB3aGF0IEdheSBkb2VzLgotICAgIC8vIE5vdGUgdGhhdCBpdCBzaG91bGQgbm90IGhhdmUgYW55IGVmZmVjdCBhbnl3YXlzIHNpbmNlIHRoZSBzdHJpbmcgaXMKLSAgICAvLyBlbXB0eS4KLSAgICAqZGVjaW1hbF9wb2ludCA9IC1yZXF1ZXN0ZWRfZGlnaXRzOwotICAgICpsZW5ndGggPSAwOwotICAgIHJldHVybjsKLSAgfSBlbHNlIGlmICgtKCpkZWNpbWFsX3BvaW50KSA9PSByZXF1ZXN0ZWRfZGlnaXRzKSB7Ci0gICAgLy8gV2Ugb25seSBuZWVkIHRvIHZlcmlmeSBpZiB0aGUgbnVtYmVyIHJvdW5kcyBkb3duIG9yIHVwLgotICAgIC8vIEV4OiAwLjA0IGFuZCAwLjA2IHdpdGggcmVxdWVzdGVkX2RpZ2l0cyA9PSAxLgotICAgIEFTU0VSVCgqZGVjaW1hbF9wb2ludCA9PSAtcmVxdWVzdGVkX2RpZ2l0cyk7Ci0gICAgLy8gSW5pdGlhbGx5IHRoZSBmcmFjdGlvbiBsaWVzIGluIHJhbmdlICgxLCAxMF0uIE11bHRpcGx5IHRoZSBkZW5vbWluYXRvcgotICAgIC8vIGJ5IDEwIHNvIHRoYXQgd2UgY2FuIGNvbXBhcmUgbW9yZSBlYXNpbHkuCi0gICAgZGVub21pbmF0b3ItPlRpbWVzMTAoKTsKLSAgICBpZiAoQmlnbnVtOjpQbHVzQ29tcGFyZSgqbnVtZXJhdG9yLCAqbnVtZXJhdG9yLCAqZGVub21pbmF0b3IpID49IDApIHsKLSAgICAgIC8vIElmIHRoZSBmcmFjdGlvbiBpcyA+PSAwLjUgdGhlbiB3ZSBoYXZlIHRvIGluY2x1ZGUgdGhlIHJvdW5kZWQKLSAgICAgIC8vIGRpZ2l0LgotICAgICAgYnVmZmVyWzBdID0gJzEnOwotICAgICAgKmxlbmd0aCA9IDE7Ci0gICAgICAoKmRlY2ltYWxfcG9pbnQpKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYXVnaHQgbW9zdCBvZiBzaW1pbGFyIGNhc2VzIGVhcmxpZXIuCi0gICAgICAqbGVuZ3RoID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9IGVsc2UgewotICAgIC8vIFRoZSByZXF1ZXN0ZWQgZGlnaXRzIGNvcnJlc3BvbmQgdG8gdGhlIGRpZ2l0cyBhZnRlciB0aGUgcG9pbnQuCi0gICAgLy8gVGhlIHZhcmlhYmxlICduZWVkZWRfZGlnaXRzJyBpbmNsdWRlcyB0aGUgZGlnaXRzIGJlZm9yZSB0aGUgcG9pbnQuCi0gICAgaW50IG5lZWRlZF9kaWdpdHMgPSAoKmRlY2ltYWxfcG9pbnQpICsgcmVxdWVzdGVkX2RpZ2l0czsKLSAgICBHZW5lcmF0ZUNvdW50ZWREaWdpdHMobmVlZGVkX2RpZ2l0cywgZGVjaW1hbF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJhdG9yLCBkZW5vbWluYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW5ndGgpOwotICB9Ci19Ci0KLQotLy8gUmV0dXJucyBhbiBlc3RpbWF0aW9uIG9mIGsgc3VjaCB0aGF0IDEwXihrLTEpIDw9IHYgPCAxMF5rIHdoZXJlCi0vLyB2ID0gZiAqIDJeZXhwb25lbnQgYW5kIDJeNTIgPD0gZiA8IDJeNTMuCi0vLyB2IGlzIGhlbmNlIGEgbm9ybWFsaXplZCBkb3VibGUgd2l0aCB0aGUgZ2l2ZW4gZXhwb25lbnQuIFRoZSBvdXRwdXQgaXMgYW4KLS8vIGFwcHJveGltYXRpb24gZm9yIHRoZSBleHBvbmVudCBvZiB0aGUgZGVjaW1hbCBhcHByb2ltYXRpb24gLmRpZ2l0cyAqIDEwXmsuCi0vLwotLy8gVGhlIHJlc3VsdCBtaWdodCB1bmRlcnNob290IGJ5IDEgaW4gd2hpY2ggY2FzZSAxMF5rIDw9IHYgPCAxMF5rKzEuCi0vLyBOb3RlOiB0aGlzIHByb3BlcnR5IGhvbGRzIGZvciB2J3MgdXBwZXIgYm91bmRhcnkgbSsgdG9vLgotLy8gICAgMTBeayA8PSBtKyA8IDEwXmsrMS4KLS8vICAgKHNlZSBleHBsYW5hdGlvbiBiZWxvdykuCi0vLwotLy8gRXhhbXBsZXM6Ci0vLyAgRXN0aW1hdGVQb3dlcigwKSAgID0+IDE2Ci0vLyAgRXN0aW1hdGVQb3dlcigtNTIpID0+IDAKLS8vCi0vLyBOb3RlOiBlID49IDAgPT4gRXN0aW1hdGVkUG93ZXIoZSkgPiAwLiBObyBzaW1pbGFyIGNsYWltIGNhbiBiZSBtYWRlIGZvciBlPDAuCi1zdGF0aWMgaW50IEVzdGltYXRlUG93ZXIoaW50IGV4cG9uZW50KSB7Ci0gIC8vIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIGxvZzEwIG9mIHYgd2hlcmUgdiA9IGYqMl5lICh3aXRoIGUgPT0gZXhwb25lbnQpLgotICAvLyBOb3RlIHRoYXQgMTBeZmxvb3IobG9nMTAodikpIDw9IHYsIGJ1dCB2IDw9IDEwXmNlaWwobG9nMTAodikpLgotICAvLyBOb3RlIHRoYXQgZiBpcyBib3VuZGVkIGJ5IGl0cyBjb250YWluZXIgc2l6ZS4gTGV0IHAgPSA1MyAodGhlIGRvdWJsZSdzCi0gIC8vIHNpZ25pZmljYW5kIHNpemUpLiBUaGVuIDJeKHAtMSkgPD0gZiA8IDJecC4KLSAgLy8KLSAgLy8gR2l2ZW4gdGhhdCBsb2cxMCh2KSA9PSBsb2cyKHYpL2xvZzIoMTApIGFuZCBlKyhsZW4oZiktMSkgaXMgcXVpdGUgY2xvc2UKLSAgLy8gdG8gbG9nMih2KSB0aGUgZnVuY3Rpb24gaXMgc2ltcGxpZmllZCB0byAoZSsobGVuKGYpLTEpL2xvZzIoMTApKS4KLSAgLy8gVGhlIGNvbXB1dGVkIG51bWJlciB1bmRlcnNob290cyBieSBsZXNzIHRoYW4gMC42MzEgKHdoZW4gd2UgY29tcHV0ZSBsb2czCi0gIC8vIGFuZCBub3QgbG9nMTApLgotICAvLwotICAvLyBPcHRpbWl6YXRpb246IHNpbmNlIHdlIG9ubHkgbmVlZCBhbiBhcHByb3hpbWF0ZWQgcmVzdWx0IHRoaXMgY29tcHV0YXRpb24KLSAgLy8gY2FuIGJlIHBlcmZvcm1lZCBvbiA2NCBiaXQgaW50ZWdlcnMuIE9uIHg4Ni94NjQgYXJjaGl0ZWN0dXJlIHRoZSBzcGVlZHVwIGlzCi0gIC8vIG5vdCByZWFsbHkgbWVhc3VyYWJsZSwgdGhvdWdoLgotICAvLwotICAvLyBTaW5jZSB3ZSB3YW50IHRvIGF2b2lkIG92ZXJzaG9vdGluZyB3ZSBkZWNyZW1lbnQgYnkgMWUxMCBzbyB0aGF0Ci0gIC8vIGZsb2F0aW5nLXBvaW50IGltcHJlY2lzaW9ucyBkb24ndCBhZmZlY3QgdXMuCi0gIC8vCi0gIC8vIEV4cGxhbmF0aW9uIGZvciB2J3MgYm91bmRhcnkgbSs6IHRoZSBjb21wdXRhdGlvbiB0YWtlcyBhZHZhbnRhZ2Ugb2YKLSAgLy8gdGhlIGZhY3QgdGhhdCAyXihwLTEpIDw9IGYgPCAyXnAuIEJvdW5kYXJpZXMgc3RpbGwgc2F0aXNmeSB0aGlzIHJlcXVpcmVtZW50Ci0gIC8vIChldmVuIGZvciBkZW5vcm1hbHMgd2hlcmUgdGhlIGRlbHRhIGNhbiBiZSBtdWNoIG1vcmUgaW1wb3J0YW50KS4KLQotICBjb25zdCBkb3VibGUgazFMb2cxMCA9IDAuMzAxMDI5OTk1NjYzOTgxMTQ7ICAvLyAxL2xnKDEwKQotCi0gIC8vIEZvciBkb3VibGVzIGxlbihmKSA9PSA1MyAoZG9uJ3QgZm9yZ2V0IHRoZSBoaWRkZW4gYml0KS4KLSAgY29uc3QgaW50IGtTaWduaWZpY2FuZFNpemUgPSBEb3VibGU6OmtTaWduaWZpY2FuZFNpemU7Ci0gIGRvdWJsZSBlc3RpbWF0ZSA9IGNlaWwoKGV4cG9uZW50ICsga1NpZ25pZmljYW5kU2l6ZSAtIDEpICogazFMb2cxMCAtIDFlLTEwKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZXN0aW1hdGUpOwotfQotCi0KLS8vIFNlZSBjb21tZW50cyBmb3IgSW5pdGlhbFNjYWxlZFN0YXJ0VmFsdWVzLgotc3RhdGljIHZvaWQgSW5pdGlhbFNjYWxlZFN0YXJ0VmFsdWVzUG9zaXRpdmVFeHBvbmVudCgKLSAgICB1aW50NjRfdCBzaWduaWZpY2FuZCwgaW50IGV4cG9uZW50LAotICAgIGludCBlc3RpbWF0ZWRfcG93ZXIsIGJvb2wgbmVlZF9ib3VuZGFyeV9kZWx0YXMsCi0gICAgQmlnbnVtKiBudW1lcmF0b3IsIEJpZ251bSogZGVub21pbmF0b3IsCi0gICAgQmlnbnVtKiBkZWx0YV9taW51cywgQmlnbnVtKiBkZWx0YV9wbHVzKSB7Ci0gIC8vIEEgcG9zaXRpdmUgZXhwb25lbnQgaW1wbGllcyBhIHBvc2l0aXZlIHBvd2VyLgotICBBU1NFUlQoZXN0aW1hdGVkX3Bvd2VyID49IDApOwotICAvLyBTaW5jZSB0aGUgZXN0aW1hdGVkX3Bvd2VyIGlzIHBvc2l0aXZlIHdlIHNpbXBseSBtdWx0aXBseSB0aGUgZGVub21pbmF0b3IKLSAgLy8gYnkgMTBeZXN0aW1hdGVkX3Bvd2VyLgotCi0gIC8vIG51bWVyYXRvciA9IHYuCi0gIG51bWVyYXRvci0+QXNzaWduVUludDY0KHNpZ25pZmljYW5kKTsKLSAgbnVtZXJhdG9yLT5TaGlmdExlZnQoZXhwb25lbnQpOwotICAvLyBkZW5vbWluYXRvciA9IDEwXmVzdGltYXRlZF9wb3dlci4KLSAgZGVub21pbmF0b3ItPkFzc2lnblBvd2VyVUludDE2KDEwLCBlc3RpbWF0ZWRfcG93ZXIpOwotCi0gIGlmIChuZWVkX2JvdW5kYXJ5X2RlbHRhcykgewotICAgIC8vIEludHJvZHVjZSBhIGNvbW1vbiBkZW5vbWluYXRvciBzbyB0aGF0IHRoZSBkZWx0YXMgdG8gdGhlIGJvdW5kYXJpZXMgYXJlCi0gICAgLy8gaW50ZWdlcnMuCi0gICAgZGVub21pbmF0b3ItPlNoaWZ0TGVmdCgxKTsKLSAgICBudW1lcmF0b3ItPlNoaWZ0TGVmdCgxKTsKLSAgICAvLyBMZXQgdiA9IGYgKiAyXmUsIHRoZW4gbSsgLSB2ID0gMS8yICogMl5lOyBXaXRoIHRoZSBjb21tb24KLSAgICAvLyBkZW5vbWluYXRvciAob2YgMikgZGVsdGFfcGx1cyBlcXVhbHMgMl5lLgotICAgIGRlbHRhX3BsdXMtPkFzc2lnblVJbnQxNigxKTsKLSAgICBkZWx0YV9wbHVzLT5TaGlmdExlZnQoZXhwb25lbnQpOwotICAgIC8vIFNhbWUgZm9yIGRlbHRhX21pbnVzLiBUaGUgYWRqdXN0bWVudHMgaWYgZiA9PSAyXnAtMSBhcmUgZG9uZSBsYXRlci4KLSAgICBkZWx0YV9taW51cy0+QXNzaWduVUludDE2KDEpOwotICAgIGRlbHRhX21pbnVzLT5TaGlmdExlZnQoZXhwb25lbnQpOwotICB9Ci19Ci0KLQotLy8gU2VlIGNvbW1lbnRzIGZvciBJbml0aWFsU2NhbGVkU3RhcnRWYWx1ZXMKLXN0YXRpYyB2b2lkIEluaXRpYWxTY2FsZWRTdGFydFZhbHVlc05lZ2F0aXZlRXhwb25lbnRQb3NpdGl2ZVBvd2VyKAotICAgIHVpbnQ2NF90IHNpZ25pZmljYW5kLCBpbnQgZXhwb25lbnQsCi0gICAgaW50IGVzdGltYXRlZF9wb3dlciwgYm9vbCBuZWVkX2JvdW5kYXJ5X2RlbHRhcywKLSAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKLSAgICBCaWdudW0qIGRlbHRhX21pbnVzLCBCaWdudW0qIGRlbHRhX3BsdXMpIHsKLSAgLy8gdiA9IGYgKiAyXmUgd2l0aCBlIDwgMCwgYW5kIHdpdGggZXN0aW1hdGVkX3Bvd2VyID49IDAuCi0gIC8vIFRoaXMgbWVhbnMgdGhhdCBlIGlzIGNsb3NlIHRvIDAgKGhhdmUgYSBsb29rIGF0IGhvdyBlc3RpbWF0ZWRfcG93ZXIgaXMKLSAgLy8gY29tcHV0ZWQpLgotCi0gIC8vIG51bWVyYXRvciA9IHNpZ25pZmljYW5kCi0gIC8vICBzaW5jZSB2ID0gc2lnbmlmaWNhbmQgKiAyXmV4cG9uZW50IHRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAvLyAgbnVtZXJhdG9yID0gdiAqIC8gMl4tZXhwb25lbnQKLSAgbnVtZXJhdG9yLT5Bc3NpZ25VSW50NjQoc2lnbmlmaWNhbmQpOwotICAvLyBkZW5vbWluYXRvciA9IDEwXmVzdGltYXRlZF9wb3dlciAqIDJeLWV4cG9uZW50ICh3aXRoIGV4cG9uZW50IDwgMCkKLSAgZGVub21pbmF0b3ItPkFzc2lnblBvd2VyVUludDE2KDEwLCBlc3RpbWF0ZWRfcG93ZXIpOwotICBkZW5vbWluYXRvci0+U2hpZnRMZWZ0KC1leHBvbmVudCk7Ci0KLSAgaWYgKG5lZWRfYm91bmRhcnlfZGVsdGFzKSB7Ci0gICAgLy8gSW50cm9kdWNlIGEgY29tbW9uIGRlbm9taW5hdG9yIHNvIHRoYXQgdGhlIGRlbHRhcyB0byB0aGUgYm91bmRhcmllcyBhcmUKLSAgICAvLyBpbnRlZ2Vycy4KLSAgICBkZW5vbWluYXRvci0+U2hpZnRMZWZ0KDEpOwotICAgIG51bWVyYXRvci0+U2hpZnRMZWZ0KDEpOwotICAgIC8vIExldCB2ID0gZiAqIDJeZSwgdGhlbiBtKyAtIHYgPSAxLzIgKiAyXmU7IFdpdGggdGhlIGNvbW1vbgotICAgIC8vIGRlbm9taW5hdG9yIChvZiAyKSBkZWx0YV9wbHVzIGVxdWFscyAyXmUuCi0gICAgLy8gR2l2ZW4gdGhhdCB0aGUgZGVub21pbmF0b3IgYWxyZWFkeSBpbmNsdWRlcyB2J3MgZXhwb25lbnQgdGhlIGRpc3RhbmNlCi0gICAgLy8gdG8gdGhlIGJvdW5kYXJpZXMgaXMgc2ltcGx5IDEuCi0gICAgZGVsdGFfcGx1cy0+QXNzaWduVUludDE2KDEpOwotICAgIC8vIFNhbWUgZm9yIGRlbHRhX21pbnVzLiBUaGUgYWRqdXN0bWVudHMgaWYgZiA9PSAyXnAtMSBhcmUgZG9uZSBsYXRlci4KLSAgICBkZWx0YV9taW51cy0+QXNzaWduVUludDE2KDEpOwotICB9Ci19Ci0KLQotLy8gU2VlIGNvbW1lbnRzIGZvciBJbml0aWFsU2NhbGVkU3RhcnRWYWx1ZXMKLXN0YXRpYyB2b2lkIEluaXRpYWxTY2FsZWRTdGFydFZhbHVlc05lZ2F0aXZlRXhwb25lbnROZWdhdGl2ZVBvd2VyKAotICAgIHVpbnQ2NF90IHNpZ25pZmljYW5kLCBpbnQgZXhwb25lbnQsCi0gICAgaW50IGVzdGltYXRlZF9wb3dlciwgYm9vbCBuZWVkX2JvdW5kYXJ5X2RlbHRhcywKLSAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKLSAgICBCaWdudW0qIGRlbHRhX21pbnVzLCBCaWdudW0qIGRlbHRhX3BsdXMpIHsKLSAgLy8gSW5zdGVhZCBvZiBtdWx0aXBseWluZyB0aGUgZGVub21pbmF0b3Igd2l0aCAxMF5lc3RpbWF0ZWRfcG93ZXIgd2UKLSAgLy8gbXVsdGlwbHkgYWxsIHZhbHVlcyAobnVtZXJhdG9yIGFuZCBkZWx0YXMpIGJ5IDEwXi1lc3RpbWF0ZWRfcG93ZXIuCi0KLSAgLy8gVXNlIG51bWVyYXRvciBhcyB0ZW1wb3JhcnkgY29udGFpbmVyIGZvciBwb3dlcl90ZW4uCi0gIEJpZ251bSogcG93ZXJfdGVuID0gbnVtZXJhdG9yOwotICBwb3dlcl90ZW4tPkFzc2lnblBvd2VyVUludDE2KDEwLCAtZXN0aW1hdGVkX3Bvd2VyKTsKLQotICBpZiAobmVlZF9ib3VuZGFyeV9kZWx0YXMpIHsKLSAgICAvLyBTaW5jZSBwb3dlcl90ZW4gPT0gbnVtZXJhdG9yIHdlIG11c3QgbWFrZSBhIGNvcHkgb2YgMTBeZXN0aW1hdGVkX3Bvd2VyCi0gICAgLy8gYmVmb3JlIHdlIGNvbXBsZXRlIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgbnVtZXJhdG9yLgotICAgIC8vIGRlbHRhX3BsdXMgPSBkZWx0YV9taW51cyA9IDEwXmVzdGltYXRlZF9wb3dlcgotICAgIGRlbHRhX3BsdXMtPkFzc2lnbkJpZ251bSgqcG93ZXJfdGVuKTsKLSAgICBkZWx0YV9taW51cy0+QXNzaWduQmlnbnVtKCpwb3dlcl90ZW4pOwotICB9Ci0KLSAgLy8gbnVtZXJhdG9yID0gc2lnbmlmaWNhbmQgKiAyICogMTBeLWVzdGltYXRlZF9wb3dlcgotICAvLyAgc2luY2UgdiA9IHNpZ25pZmljYW5kICogMl5leHBvbmVudCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgLy8gbnVtZXJhdG9yID0gdiAqIDEwXi1lc3RpbWF0ZWRfcG93ZXIgKiAyICogMl4tZXhwb25lbnQuCi0gIC8vIFJlbWVtYmVyOiBudW1lcmF0b3IgaGFzIGJlZW4gYWJ1c2VkIGFzIHBvd2VyX3Rlbi4gU28gbm8gbmVlZCB0byBhc3NpZ24gaXQKLSAgLy8gIHRvIGl0c2VsZi4KLSAgQVNTRVJUKG51bWVyYXRvciA9PSBwb3dlcl90ZW4pOwotICBudW1lcmF0b3ItPk11bHRpcGx5QnlVSW50NjQoc2lnbmlmaWNhbmQpOwotCi0gIC8vIGRlbm9taW5hdG9yID0gMiAqIDJeLWV4cG9uZW50IHdpdGggZXhwb25lbnQgPCAwLgotICBkZW5vbWluYXRvci0+QXNzaWduVUludDE2KDEpOwotICBkZW5vbWluYXRvci0+U2hpZnRMZWZ0KC1leHBvbmVudCk7Ci0KLSAgaWYgKG5lZWRfYm91bmRhcnlfZGVsdGFzKSB7Ci0gICAgLy8gSW50cm9kdWNlIGEgY29tbW9uIGRlbm9taW5hdG9yIHNvIHRoYXQgdGhlIGRlbHRhcyB0byB0aGUgYm91bmRhcmllcyBhcmUKLSAgICAvLyBpbnRlZ2Vycy4KLSAgICBudW1lcmF0b3ItPlNoaWZ0TGVmdCgxKTsKLSAgICBkZW5vbWluYXRvci0+U2hpZnRMZWZ0KDEpOwotICAgIC8vIFdpdGggdGhpcyBzaGlmdCB0aGUgYm91bmRhcmllcyBoYXZlIHRoZWlyIGNvcnJlY3QgdmFsdWUsIHNpbmNlCi0gICAgLy8gZGVsdGFfcGx1cyA9IDEwXi1lc3RpbWF0ZWRfcG93ZXIsIGFuZAotICAgIC8vIGRlbHRhX21pbnVzID0gMTBeLWVzdGltYXRlZF9wb3dlci4KLSAgICAvLyBUaGVzZSBhc3NpZ25tZW50cyBoYXZlIGJlZW4gZG9uZSBlYXJsaWVyLgotICAgIC8vIFRoZSBhZGp1c3RtZW50cyBpZiBmID09IDJecC0xIChsb3dlciBib3VuZGFyeSBpcyBjbG9zZXIpIGFyZSBkb25lIGxhdGVyLgotICB9Ci19Ci0KLQotLy8gTGV0IHYgPSBzaWduaWZpY2FuZCAqIDJeZXhwb25lbnQuCi0vLyBDb21wdXRlcyB2IC8gMTBeZXN0aW1hdGVkX3Bvd2VyIGV4YWN0bHksIGFzIGEgcmF0aW8gb2YgdHdvIGJpZ251bXMsIG51bWVyYXRvcgotLy8gYW5kIGRlbm9taW5hdG9yLiBUaGUgZnVuY3Rpb25zIEdlbmVyYXRlU2hvcnRlc3REaWdpdHMgYW5kCi0vLyBHZW5lcmF0ZUNvdW50ZWREaWdpdHMgd2lsbCB0aGVuIGNvbnZlcnQgdGhpcyByYXRpbyB0byBpdHMgZGVjaW1hbAotLy8gcmVwcmVzZW50YXRpb24gZCwgd2l0aCB0aGUgcmVxdWlyZWQgYWNjdXJhY3kuCi0vLyBUaGVuIGQgKiAxMF5lc3RpbWF0ZWRfcG93ZXIgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHYuCi0vLyAoTm90ZTogdGhlIGZyYWN0aW9uIGFuZCB0aGUgZXN0aW1hdGVkX3Bvd2VyIG1pZ2h0IGdldCBhZGp1c3RlZCBiZWZvcmUKLS8vIGdlbmVyYXRpbmcgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24uKQotLy8KLS8vIFRoZSBpbml0aWFsIHN0YXJ0IHZhbHVlcyBjb25zaXN0IG9mOgotLy8gIC0gYSBzY2FsZWQgbnVtZXJhdG9yOiBzLnQuIG51bWVyYXRvci9kZW5vbWluYXRvciA9PSB2IC8gMTBeZXN0aW1hdGVkX3Bvd2VyLgotLy8gIC0gYSBzY2FsZWQgKGNvbW1vbikgZGVub21pbmF0b3IuCi0vLyAgb3B0aW9uYWxseSAodXNlZCBieSBHZW5lcmF0ZVNob3J0ZXN0RGlnaXRzIHRvIGRlY2lkZSBpZiBpdCBoYXMgdGhlIHNob3J0ZXN0Ci0vLyAgZGVjaW1hbCBjb252ZXJ0aW5nIGJhY2sgdG8gdik6Ci0vLyAgLSB2IC0gbS06IHRoZSBkaXN0YW5jZSB0byB0aGUgbG93ZXIgYm91bmRhcnkuCi0vLyAgLSBtKyAtIHY6IHRoZSBkaXN0YW5jZSB0byB0aGUgdXBwZXIgYm91bmRhcnkuCi0vLwotLy8gdiwgbSssIG0tLCBhbmQgdGhlcmVmb3JlIHYgLSBtLSBhbmQgbSsgLSB2IGFsbCBzaGFyZSB0aGUgc2FtZSBkZW5vbWluYXRvci4KLS8vCi0vLyBMZXQgZXAgPT0gZXN0aW1hdGVkX3Bvd2VyLCB0aGVuIHRoZSByZXR1cm5lZCB2YWx1ZXMgd2lsbCBzYXRpc2Z5OgotLy8gIHYgLyAxMF5lcCA9IG51bWVyYXRvciAvIGRlbm9taW5hdG9yLgotLy8gIHYncyBib3VuZGFyeXMgbS0gYW5kIG0rOgotLy8gICAgbS0gLyAxMF5lcCA9PSB2IC8gMTBeZXAgLSBkZWx0YV9taW51cyAvIGRlbm9taW5hdG9yCi0vLyAgICBtKyAvIDEwXmVwID09IHYgLyAxMF5lcCArIGRlbHRhX3BsdXMgLyBkZW5vbWluYXRvcgotLy8gIE9yIGluIG90aGVyIHdvcmRzOgotLy8gICAgbS0gPT0gdiAtIGRlbHRhX21pbnVzICogMTBeZXAgLyBkZW5vbWluYXRvcjsKLS8vICAgIG0rID09IHYgKyBkZWx0YV9wbHVzICogMTBeZXAgLyBkZW5vbWluYXRvcjsKLS8vCi0vLyBTaW5jZSAxMF4oay0xKSA8PSB2IDwgMTBeayAgICAod2l0aCBrID09IGVzdGltYXRlZF9wb3dlcikKLS8vICBvciAgICAgICAxMF5rIDw9IHYgPCAxMF4oaysxKQotLy8gIHdlIHRoZW4gaGF2ZSAwLjEgPD0gbnVtZXJhdG9yL2Rlbm9taW5hdG9yIDwgMQotLy8gICAgICAgICAgIG9yICAgIDEgPD0gbnVtZXJhdG9yL2Rlbm9taW5hdG9yIDwgMTAKLS8vCi0vLyBJdCBpcyB0aGVuIGVhc3kgdG8ga2lja3N0YXJ0IHRoZSBkaWdpdC1nZW5lcmF0aW9uIHJvdXRpbmUuCi0vLwotLy8gVGhlIGJvdW5kYXJ5LWRlbHRhcyBhcmUgb25seSBmaWxsZWQgaWYgdGhlIG1vZGUgZXF1YWxzIEJJR05VTV9EVE9BX1NIT1JURVNUCi0vLyBvciBCSUdOVU1fRFRPQV9TSE9SVEVTVF9TSU5HTEUuCi0KLXN0YXRpYyB2b2lkIEluaXRpYWxTY2FsZWRTdGFydFZhbHVlcyh1aW50NjRfdCBzaWduaWZpY2FuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb3dlcl9ib3VuZGFyeV9pc19jbG9zZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVzdGltYXRlZF9wb3dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRfYm91bmRhcnlfZGVsdGFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogbnVtZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogZGVub21pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnbnVtKiBkZWx0YV9taW51cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIGRlbHRhX3BsdXMpIHsKLSAgaWYgKGV4cG9uZW50ID49IDApIHsKLSAgICBJbml0aWFsU2NhbGVkU3RhcnRWYWx1ZXNQb3NpdGl2ZUV4cG9uZW50KAotICAgICAgICBzaWduaWZpY2FuZCwgZXhwb25lbnQsIGVzdGltYXRlZF9wb3dlciwgbmVlZF9ib3VuZGFyeV9kZWx0YXMsCi0gICAgICAgIG51bWVyYXRvciwgZGVub21pbmF0b3IsIGRlbHRhX21pbnVzLCBkZWx0YV9wbHVzKTsKLSAgfSBlbHNlIGlmIChlc3RpbWF0ZWRfcG93ZXIgPj0gMCkgewotICAgIEluaXRpYWxTY2FsZWRTdGFydFZhbHVlc05lZ2F0aXZlRXhwb25lbnRQb3NpdGl2ZVBvd2VyKAotICAgICAgICBzaWduaWZpY2FuZCwgZXhwb25lbnQsIGVzdGltYXRlZF9wb3dlciwgbmVlZF9ib3VuZGFyeV9kZWx0YXMsCi0gICAgICAgIG51bWVyYXRvciwgZGVub21pbmF0b3IsIGRlbHRhX21pbnVzLCBkZWx0YV9wbHVzKTsKLSAgfSBlbHNlIHsKLSAgICBJbml0aWFsU2NhbGVkU3RhcnRWYWx1ZXNOZWdhdGl2ZUV4cG9uZW50TmVnYXRpdmVQb3dlcigKLSAgICAgICAgc2lnbmlmaWNhbmQsIGV4cG9uZW50LCBlc3RpbWF0ZWRfcG93ZXIsIG5lZWRfYm91bmRhcnlfZGVsdGFzLAotICAgICAgICBudW1lcmF0b3IsIGRlbm9taW5hdG9yLCBkZWx0YV9taW51cywgZGVsdGFfcGx1cyk7Ci0gIH0KLQotICBpZiAobmVlZF9ib3VuZGFyeV9kZWx0YXMgJiYgbG93ZXJfYm91bmRhcnlfaXNfY2xvc2VyKSB7Ci0gICAgLy8gVGhlIGxvd2VyIGJvdW5kYXJ5IGlzIGNsb3NlciBhdCBoYWxmIHRoZSBkaXN0YW5jZSBvZiAibm9ybWFsIiBudW1iZXJzLgotICAgIC8vIEluY3JlYXNlIHRoZSBjb21tb24gZGVub21pbmF0b3IgYW5kIGFkYXB0IGFsbCBidXQgdGhlIGRlbHRhX21pbnVzLgotICAgIGRlbm9taW5hdG9yLT5TaGlmdExlZnQoMSk7ICAvLyAqMgotICAgIG51bWVyYXRvci0+U2hpZnRMZWZ0KDEpOyAgICAvLyAqMgotICAgIGRlbHRhX3BsdXMtPlNoaWZ0TGVmdCgxKTsgICAvLyAqMgotICB9Ci19Ci0KLQotLy8gVGhpcyByb3V0aW5lIG11bHRpcGxpZXMgbnVtZXJhdG9yL2Rlbm9taW5hdG9yIHNvIHRoYXQgaXRzIHZhbHVlcyBsaWVzIGluIHRoZQotLy8gcmFuZ2UgMS0xMC4gVGhhdCBpcyBhZnRlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiB3ZSBoYXZlOgotLy8gICAgMSA8PSAobnVtZXJhdG9yICsgZGVsdGFfcGx1cykgL2Rlbm9taW5hdG9yIDwgMTAuCi0vLyBMZXQgbnVtZXJhdG9yIHRoZSBpbnB1dCBiZWZvcmUgbW9kaWZpY2F0aW9uIGFuZCBudW1lcmF0b3InIHRoZSBhcmd1bWVudAotLy8gYWZ0ZXIgbW9kaWZpY2F0aW9uLCB0aGVuIHRoZSBvdXRwdXQtcGFyYW1ldGVyIGRlY2ltYWxfcG9pbnQgaXMgc3VjaCB0aGF0Ci0vLyAgbnVtZXJhdG9yIC8gZGVub21pbmF0b3IgKiAxMF5lc3RpbWF0ZWRfcG93ZXIgPT0KLS8vICAgIG51bWVyYXRvcicgLyBkZW5vbWluYXRvcicgKiAxMF4oZGVjaW1hbF9wb2ludCAtIDEpCi0vLyBJbiBzb21lIGNhc2VzIGVzdGltYXRlZF9wb3dlciB3YXMgdG9vIGxvdywgYW5kIHRoaXMgaXMgYWxyZWFkeSB0aGUgY2FzZS4gV2UKLS8vIHRoZW4gc2ltcGx5IGFkanVzdCB0aGUgcG93ZXIgc28gdGhhdCAxMF4oay0xKSA8PSB2IDwgMTBeayAod2l0aCBrID09Ci0vLyBlc3RpbWF0ZWRfcG93ZXIpIGJ1dCBkbyBub3QgdG91Y2ggdGhlIG51bWVyYXRvciBvciBkZW5vbWluYXRvci4KLS8vIE90aGVyd2lzZSB0aGUgcm91dGluZSBtdWx0aXBsaWVzIHRoZSBudW1lcmF0b3IgYW5kIHRoZSBkZWx0YXMgYnkgMTAuCi1zdGF0aWMgdm9pZCBGaXh1cE11bHRpcGx5MTAoaW50IGVzdGltYXRlZF9wb3dlciwgYm9vbCBpc19ldmVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVjaW1hbF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIGRlbHRhX21pbnVzLCBCaWdudW0qIGRlbHRhX3BsdXMpIHsKLSAgYm9vbCBpbl9yYW5nZTsKLSAgaWYgKGlzX2V2ZW4pIHsKLSAgICAvLyBGb3IgSUVFRSBkb3VibGVzIGhhbGYtd2F5IGNhc2VzIChpbiBkZWNpbWFsIHN5c3RlbSBudW1iZXJzIGVuZGluZyB3aXRoIDUpCi0gICAgLy8gYXJlIHJvdW5kZWQgdG8gdGhlIGNsb3Nlc3QgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdpdGggZXZlbiBzaWduaWZpY2FuZC4KLSAgICBpbl9yYW5nZSA9IEJpZ251bTo6UGx1c0NvbXBhcmUoKm51bWVyYXRvciwgKmRlbHRhX3BsdXMsICpkZW5vbWluYXRvcikgPj0gMDsKLSAgfSBlbHNlIHsKLSAgICBpbl9yYW5nZSA9IEJpZ251bTo6UGx1c0NvbXBhcmUoKm51bWVyYXRvciwgKmRlbHRhX3BsdXMsICpkZW5vbWluYXRvcikgPiAwOwotICB9Ci0gIGlmIChpbl9yYW5nZSkgewotICAgIC8vIFNpbmNlIG51bWVyYXRvciArIGRlbHRhX3BsdXMgPj0gZGVub21pbmF0b3Igd2UgYWxyZWFkeSBoYXZlCi0gICAgLy8gMSA8PSBudW1lcmF0b3IvZGVub21pbmF0b3IgPCAxMC4gU2ltcGx5IHVwZGF0ZSB0aGUgZXN0aW1hdGVkX3Bvd2VyLgotICAgICpkZWNpbWFsX3BvaW50ID0gZXN0aW1hdGVkX3Bvd2VyICsgMTsKLSAgfSBlbHNlIHsKLSAgICAqZGVjaW1hbF9wb2ludCA9IGVzdGltYXRlZF9wb3dlcjsKLSAgICBudW1lcmF0b3ItPlRpbWVzMTAoKTsKLSAgICBpZiAoQmlnbnVtOjpFcXVhbCgqZGVsdGFfbWludXMsICpkZWx0YV9wbHVzKSkgewotICAgICAgZGVsdGFfbWludXMtPlRpbWVzMTAoKTsKLSAgICAgIGRlbHRhX3BsdXMtPkFzc2lnbkJpZ251bSgqZGVsdGFfbWludXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkZWx0YV9taW51cy0+VGltZXMxMCgpOwotICAgICAgZGVsdGFfcGx1cy0+VGltZXMxMCgpOwotICAgIH0KLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgZG91YmxlX2NvbnZlcnNpb24KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2NhY2hlZC1wb3dlcnMuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9jYWNoZWQtcG93ZXJzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjc2NDI5Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2NhY2hlZC1wb3dlcnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYtMjAwOCB0aGUgVjggcHJvamVjdCBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0vLyAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLS8vICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotLy8gICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlICJ1dGlscy5oIgotCi0jaW5jbHVkZSAiY2FjaGVkLXBvd2Vycy5oIgotCi1uYW1lc3BhY2UgZG91YmxlX2NvbnZlcnNpb24gewotCi1zdHJ1Y3QgQ2FjaGVkUG93ZXIgewotICB1aW50NjRfdCBzaWduaWZpY2FuZDsKLSAgaW50MTZfdCBiaW5hcnlfZXhwb25lbnQ7Ci0gIGludDE2X3QgZGVjaW1hbF9leHBvbmVudDsKLX07Ci0KLXN0YXRpYyBjb25zdCBDYWNoZWRQb3dlciBrQ2FjaGVkUG93ZXJzW10gPSB7Ci0gIHtVSU5UNjRfMlBBUlRfQygweGZhOGZkNWEwLCAwODFjMDI4OCksIC0xMjIwLCAtMzQ4fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4YmFhZWUxN2YsIGEyM2ViZjc2KSwgLTExOTMsIC0zNDB9LAotICB7VUlOVDY0XzJQQVJUX0MoMHg4YjE2ZmIyMCwgMzA1NWFjNzYpLCAtMTE2NiwgLTMzMn0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGNmNDI4OTRhLCA1ZGNlMzVlYSksIC0xMTQwLCAtMzI0fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4OWE2YmIwYWEsIDU1NjUzYjJkKSwgLTExMTMsIC0zMTZ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhlNjFhY2YwMywgM2QxYTQ1ZGYpLCAtMTA4NywgLTMwOH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGFiNzBmZTE3LCBjNzlhYzZjYSksIC0xMDYwLCAtMzAwfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZmY3N2IxZmMsIGJlYmNkYzRmKSwgLTEwMzQsIC0yOTJ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhiZTU2OTFlZiwgNDE2YmQ2MGMpLCAtMTAwNywgLTI4NH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweDhkZDAxZmFkLCA5MDdmZmMzYyksIC05ODAsIC0yNzZ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhkMzUxNWMyOCwgMzE1NTlhODMpLCAtOTU0LCAtMjY4fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4OWQ3MWFjOGYsIGFkYTZjOWI1KSwgLTkyNywgLTI2MH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGVhOWMyMjc3LCAyM2VlOGJjYiksIC05MDEsIC0yNTJ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhhZWNjNDk5MSwgNDA3ODUzNmQpLCAtODc0LCAtMjQ0fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ODIzYzEyNzksIDVkYjZjZTU3KSwgLTg0NywgLTIzNn0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGMyMTA5NDM2LCA0ZGZiNTYzNyksIC04MjEsIC0yMjh9LAotICB7VUlOVDY0XzJQQVJUX0MoMHg5MDk2ZWE2ZiwgMzg0ODk4NGYpLCAtNzk0LCAtMjIwfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZDc3NDg1Y2IsIDI1ODIzYWM3KSwgLTc2OCwgLTIxMn0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGEwODZjZmNkLCA5N2JmOTdmNCksIC03NDEsIC0yMDR9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhlZjM0MGE5OCwgMTcyYWFjZTUpLCAtNzE1LCAtMTk2fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4YjIzODY3ZmIsIDJhMzViMjhlKSwgLTY4OCwgLTE4OH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweDg0YzhkNGRmLCBkMmM2M2YzYiksIC02NjEsIC0xODB9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhjNWRkNDQyNywgMWFkM2NkYmEpLCAtNjM1LCAtMTcyfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4OTM2YjlmY2UsIGJiMjVjOTk2KSwgLTYwOCwgLTE2NH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGRiYWM2YzI0LCA3ZDYyYTU4NCksIC01ODIsIC0xNTZ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhhM2FiNjY1OCwgMGQ1ZmRhZjYpLCAtNTU1LCAtMTQ4fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZjNlMmY4OTMsIGRlYzNmMTI2KSwgLTUyOSwgLTE0MH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGI1YjVhZGE4LCBhYWZmODBiOCksIC01MDIsIC0xMzJ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHg4NzYyNWYwNSwgNmM3YzRhOGIpLCAtNDc1LCAtMTI0fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4YzliY2ZmNjAsIDM0YzEzMDUzKSwgLTQ0OSwgLTExNn0sCi0gIHtVSU5UNjRfMlBBUlRfQygweDk2NGU4NThjLCA5MWJhMjY1NSksIC00MjIsIC0xMDh9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhkZmY5NzcyNCwgNzAyOTdlYmQpLCAtMzk2LCAtMTAwfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4YTZkZmJkOWYsIGI4ZTViODhmKSwgLTM2OSwgLTkyfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZjhhOTVmY2YsIDg4NzQ3ZDk0KSwgLTM0MywgLTg0fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4Yjk0NDcwOTMsIDhmYTg5YmNmKSwgLTMxNiwgLTc2fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4OGEwOGYwZjgsIGJmMGYxNTZiKSwgLTI4OSwgLTY4fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4Y2RiMDI1NTUsIDY1MzEzMWI2KSwgLTI2MywgLTYwfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4OTkzZmUyYzYsIGQwN2I3ZmFjKSwgLTIzNiwgLTUyfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZTQ1YzEwYzQsIDJhMmIzYjA2KSwgLTIxMCwgLTQ0fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4YWEyNDI0OTksIDY5NzM5MmQzKSwgLTE4MywgLTM2fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZmQ4N2I1ZjIsIDgzMDBjYTBlKSwgLTE1NywgLTI4fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4YmNlNTA4NjQsIDkyMTExYWViKSwgLTEzMCwgLTIwfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4OGNiY2NjMDksIDZmNTA4OGNjKSwgLTEwMywgLTEyfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZDFiNzE3NTgsIGUyMTk2NTJjKSwgLTc3LCAtNH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweDljNDAwMDAwLCAwMDAwMDAwMCksIC01MCwgNH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGU4ZDRhNTEwLCAwMDAwMDAwMCksIC0yNCwgMTJ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhhZDc4ZWJjNSwgYWM2MjAwMDApLCAzLCAyMH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweDgxM2YzOTc4LCBmODk0MDk4NCksIDMwLCAyOH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGMwOTdjZTdiLCBjOTA3MTViMyksIDU2LCAzNn0sCi0gIHtVSU5UNjRfMlBBUlRfQygweDhmN2UzMmNlLCA3YmVhNWM3MCksIDgzLCA0NH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGQ1ZDIzOGE0LCBhYmU5ODA2OCksIDEwOSwgNTJ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHg5ZjRmMjcyNiwgMTc5YTIyNDUpLCAxMzYsIDYwfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZWQ2M2EyMzEsIGQ0YzRmYjI3KSwgMTYyLCA2OH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGIwZGU2NTM4LCA4Y2M4YWRhOCksIDE4OSwgNzZ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHg4M2M3MDg4ZSwgMWFhYjY1ZGIpLCAyMTYsIDg0fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4YzQ1ZDFkZjksIDQyNzExZDlhKSwgMjQyLCA5Mn0sCi0gIHtVSU5UNjRfMlBBUlRfQygweDkyNGQ2OTJjLCBhNjFiZTc1OCksIDI2OSwgMTAwfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZGEwMWVlNjQsIDFhNzA4ZGVhKSwgMjk1LCAxMDh9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhhMjZkYTM5OSwgOWFlZjc3NGEpLCAzMjIsIDExNn0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGYyMDk3ODdiLCBiNDdkNmI4NSksIDM0OCwgMTI0fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4YjQ1NGU0YTEsIDc5ZGQxODc3KSwgMzc1LCAxMzJ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHg4NjViODY5MiwgNWI5YmM1YzIpLCA0MDIsIDE0MH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGM4MzU1M2M1LCBjODk2NWQzZCksIDQyOCwgMTQ4fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4OTUyYWI0NWMsIGZhOTdhMGIzKSwgNDU1LCAxNTZ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhkZTQ2OWZiZCwgOTlhMDVmZTMpLCA0ODEsIDE2NH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGE1OWJjMjM0LCBkYjM5OGMyNSksIDUwOCwgMTcyfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZjZjNjlhNzIsIGEzOTg5ZjVjKSwgNTM0LCAxODB9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhiN2RjYmY1MywgNTRlOWJlY2UpLCA1NjEsIDE4OH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweDg4ZmNmMzE3LCBmMjIyNDFlMiksIDU4OCwgMTk2fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4Y2MyMGNlOWIsIGQzNWM3OGE1KSwgNjE0LCAyMDR9LAotICB7VUlOVDY0XzJQQVJUX0MoMHg5ODE2NWFmMywgN2IyMTUzZGYpLCA2NDEsIDIxMn0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGUyYTBiNWRjLCA5NzFmMzAzYSksIDY2NywgMjIwfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4YThkOWQxNTMsIDVjZTNiMzk2KSwgNjk0LCAyMjh9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhmYjliN2NkOSwgYTRhNzQ0M2MpLCA3MjAsIDIzNn0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGJiNzY0YzRjLCBhN2E0NDQxMCksIDc0NywgMjQ0fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4OGJhYjhlZWYsIGI2NDA5YzFhKSwgNzc0LCAyNTJ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhkMDFmZWYxMCwgYTY1Nzg0MmMpLCA4MDAsIDI2MH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweDliMTBhNGU1LCBlOTkxMzEyOSksIDgyNywgMjY4fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZTcxMDliZmIsIGExOWMwYzlkKSwgODUzLCAyNzZ9LAotICB7VUlOVDY0XzJQQVJUX0MoMHhhYzI4MjBkOSwgNjIzYmY0MjkpLCA4ODAsIDI4NH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweDgwNDQ0YjVlLCA3YWE3Y2Y4NSksIDkwNywgMjkyfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4YmYyMWU0NDAsIDAzYWNkZDJkKSwgOTMzLCAzMDB9LAotICB7VUlOVDY0XzJQQVJUX0MoMHg4ZTY3OWMyZiwgNWU0NGZmOGYpLCA5NjAsIDMwOH0sCi0gIHtVSU5UNjRfMlBBUlRfQygweGQ0MzMxNzlkLCA5YzhjYjg0MSksIDk4NiwgMzE2fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4OWUxOWRiOTIsIGI0ZTMxYmE5KSwgMTAxMywgMzI0fSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4ZWI5NmJmNmUsIGJhZGY3N2Q5KSwgMTAzOSwgMzMyfSwKLSAge1VJTlQ2NF8yUEFSVF9DKDB4YWY4NzAyM2IsIDliZjBlZTZiKSwgMTA2NiwgMzQwfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQga0NhY2hlZFBvd2Vyc0xlbmd0aCA9IEFSUkFZX1NJWkUoa0NhY2hlZFBvd2Vycyk7Ci1zdGF0aWMgY29uc3QgaW50IGtDYWNoZWRQb3dlcnNPZmZzZXQgPSAzNDg7ICAvLyAtMSAqIHRoZSBmaXJzdCBkZWNpbWFsX2V4cG9uZW50Lgotc3RhdGljIGNvbnN0IGRvdWJsZSBrRF8xX0xPRzJfMTAgPSAwLjMwMTAyOTk5NTY2Mzk4MTE0OyAgLy8gIDEgLyBsZygxMCkKLS8vIERpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZGVjaW1hbCBleHBvbmVudHMgaW4gdGhlIHRhYmxlIGFib3ZlLgotY29uc3QgaW50IFBvd2Vyc09mVGVuQ2FjaGU6OmtEZWNpbWFsRXhwb25lbnREaXN0YW5jZSA9IDg7Ci1jb25zdCBpbnQgUG93ZXJzT2ZUZW5DYWNoZTo6a01pbkRlY2ltYWxFeHBvbmVudCA9IC0zNDg7Ci1jb25zdCBpbnQgUG93ZXJzT2ZUZW5DYWNoZTo6a01heERlY2ltYWxFeHBvbmVudCA9IDM0MDsKLQotdm9pZCBQb3dlcnNPZlRlbkNhY2hlOjpHZXRDYWNoZWRQb3dlckZvckJpbmFyeUV4cG9uZW50UmFuZ2UoCi0gICAgaW50IG1pbl9leHBvbmVudCwKLSAgICBpbnQgbWF4X2V4cG9uZW50LAotICAgIERpeUZwKiBwb3dlciwKLSAgICBpbnQqIGRlY2ltYWxfZXhwb25lbnQpIHsKLSAgaW50IGtRID0gRGl5RnA6OmtTaWduaWZpY2FuZFNpemU7Ci0gIGRvdWJsZSBrID0gY2VpbCgobWluX2V4cG9uZW50ICsga1EgLSAxKSAqIGtEXzFfTE9HMl8xMCk7Ci0gIGludCBmb28gPSBrQ2FjaGVkUG93ZXJzT2Zmc2V0OwotICBpbnQgaW5kZXggPQotICAgICAgKGZvbyArIHN0YXRpY19jYXN0PGludD4oaykgLSAxKSAvIGtEZWNpbWFsRXhwb25lbnREaXN0YW5jZSArIDE7Ci0gIEFTU0VSVCgwIDw9IGluZGV4ICYmIGluZGV4IDwga0NhY2hlZFBvd2Vyc0xlbmd0aCk7Ci0gIENhY2hlZFBvd2VyIGNhY2hlZF9wb3dlciA9IGtDYWNoZWRQb3dlcnNbaW5kZXhdOwotICBBU1NFUlQobWluX2V4cG9uZW50IDw9IGNhY2hlZF9wb3dlci5iaW5hcnlfZXhwb25lbnQpOwotICBBU1NFUlQoY2FjaGVkX3Bvd2VyLmJpbmFyeV9leHBvbmVudCA8PSBtYXhfZXhwb25lbnQpOwotICAqZGVjaW1hbF9leHBvbmVudCA9IGNhY2hlZF9wb3dlci5kZWNpbWFsX2V4cG9uZW50OwotICAqcG93ZXIgPSBEaXlGcChjYWNoZWRfcG93ZXIuc2lnbmlmaWNhbmQsIGNhY2hlZF9wb3dlci5iaW5hcnlfZXhwb25lbnQpOwotfQotCi0KLXZvaWQgUG93ZXJzT2ZUZW5DYWNoZTo6R2V0Q2FjaGVkUG93ZXJGb3JEZWNpbWFsRXhwb25lbnQoaW50IHJlcXVlc3RlZF9leHBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGl5RnAqIHBvd2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZvdW5kX2V4cG9uZW50KSB7Ci0gIEFTU0VSVChrTWluRGVjaW1hbEV4cG9uZW50IDw9IHJlcXVlc3RlZF9leHBvbmVudCk7Ci0gIEFTU0VSVChyZXF1ZXN0ZWRfZXhwb25lbnQgPCBrTWF4RGVjaW1hbEV4cG9uZW50ICsga0RlY2ltYWxFeHBvbmVudERpc3RhbmNlKTsKLSAgaW50IGluZGV4ID0KLSAgICAgIChyZXF1ZXN0ZWRfZXhwb25lbnQgKyBrQ2FjaGVkUG93ZXJzT2Zmc2V0KSAvIGtEZWNpbWFsRXhwb25lbnREaXN0YW5jZTsKLSAgQ2FjaGVkUG93ZXIgY2FjaGVkX3Bvd2VyID0ga0NhY2hlZFBvd2Vyc1tpbmRleF07Ci0gICpwb3dlciA9IERpeUZwKGNhY2hlZF9wb3dlci5zaWduaWZpY2FuZCwgY2FjaGVkX3Bvd2VyLmJpbmFyeV9leHBvbmVudCk7Ci0gICpmb3VuZF9leHBvbmVudCA9IGNhY2hlZF9wb3dlci5kZWNpbWFsX2V4cG9uZW50OwotICBBU1NFUlQoKmZvdW5kX2V4cG9uZW50IDw9IHJlcXVlc3RlZF9leHBvbmVudCk7Ci0gIEFTU0VSVChyZXF1ZXN0ZWRfZXhwb25lbnQgPCAqZm91bmRfZXhwb25lbnQgKyBrRGVjaW1hbEV4cG9uZW50RGlzdGFuY2UpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZG91YmxlX2NvbnZlcnNpb24KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2RvdWJsZS1jb252ZXJzaW9uLmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZG91YmxlLWNvbnZlcnNpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYmJhNmMuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZG91YmxlLWNvbnZlcnNpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4ODkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotLy8gICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0vLyAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLS8vICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSAiZG91YmxlLWNvbnZlcnNpb24uaCIKLQotI2luY2x1ZGUgImJpZ251bS1kdG9hLmgiCi0jaW5jbHVkZSAiZmFzdC1kdG9hLmgiCi0jaW5jbHVkZSAiZml4ZWQtZHRvYS5oIgotI2luY2x1ZGUgImllZWUuaCIKLSNpbmNsdWRlICJzdHJ0b2QuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotCi1uYW1lc3BhY2UgZG91YmxlX2NvbnZlcnNpb24gewotCi1jb25zdCBEb3VibGVUb1N0cmluZ0NvbnZlcnRlciYgRG91YmxlVG9TdHJpbmdDb252ZXJ0ZXI6OkVjbWFTY3JpcHRDb252ZXJ0ZXIoKSB7Ci0gIGludCBmbGFncyA9IFVOSVFVRV9aRVJPIHwgRU1JVF9QT1NJVElWRV9FWFBPTkVOVF9TSUdOOwotICBzdGF0aWMgRG91YmxlVG9TdHJpbmdDb252ZXJ0ZXIgY29udmVydGVyKGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZpbml0eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02LCAyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAwKTsKLSAgcmV0dXJuIGNvbnZlcnRlcjsKLX0KLQotCi1ib29sIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpIYW5kbGVTcGVjaWFsVmFsdWVzKAotICAgIGRvdWJsZSB2YWx1ZSwKLSAgICBTdHJpbmdCdWlsZGVyKiByZXN1bHRfYnVpbGRlcikgY29uc3QgewotICBEb3VibGUgZG91YmxlX2luc3BlY3QodmFsdWUpOwotICBpZiAoZG91YmxlX2luc3BlY3QuSXNJbmZpbml0ZSgpKSB7Ci0gICAgaWYgKGluZmluaXR5X3N5bWJvbF8gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgIHJlc3VsdF9idWlsZGVyLT5BZGRDaGFyYWN0ZXIoJy0nKTsKLSAgICB9Ci0gICAgcmVzdWx0X2J1aWxkZXItPkFkZFN0cmluZyhpbmZpbml0eV9zeW1ib2xfKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoZG91YmxlX2luc3BlY3QuSXNOYW4oKSkgewotICAgIGlmIChuYW5fc3ltYm9sXyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0gICAgcmVzdWx0X2J1aWxkZXItPkFkZFN0cmluZyhuYW5fc3ltYm9sXyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLXZvaWQgRG91YmxlVG9TdHJpbmdDb252ZXJ0ZXI6OkNyZWF0ZUV4cG9uZW50aWFsUmVwcmVzZW50YXRpb24oCi0gICAgY29uc3QgY2hhciogZGVjaW1hbF9kaWdpdHMsCi0gICAgaW50IGxlbmd0aCwKLSAgICBpbnQgZXhwb25lbnQsCi0gICAgU3RyaW5nQnVpbGRlciogcmVzdWx0X2J1aWxkZXIpIGNvbnN0IHsKLSAgQVNTRVJUKGxlbmd0aCAhPSAwKTsKLSAgcmVzdWx0X2J1aWxkZXItPkFkZENoYXJhY3RlcihkZWNpbWFsX2RpZ2l0c1swXSk7Ci0gIGlmIChsZW5ndGggIT0gMSkgewotICAgIHJlc3VsdF9idWlsZGVyLT5BZGRDaGFyYWN0ZXIoJy4nKTsKLSAgICByZXN1bHRfYnVpbGRlci0+QWRkU3Vic3RyaW5nKCZkZWNpbWFsX2RpZ2l0c1sxXSwgbGVuZ3RoLTEpOwotICB9Ci0gIHJlc3VsdF9idWlsZGVyLT5BZGRDaGFyYWN0ZXIoZXhwb25lbnRfY2hhcmFjdGVyXyk7Ci0gIGlmIChleHBvbmVudCA8IDApIHsKLSAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCctJyk7Ci0gICAgZXhwb25lbnQgPSAtZXhwb25lbnQ7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKChmbGFnc18gJiBFTUlUX1BPU0lUSVZFX0VYUE9ORU5UX1NJR04pICE9IDApIHsKLSAgICAgIHJlc3VsdF9idWlsZGVyLT5BZGRDaGFyYWN0ZXIoJysnKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGV4cG9uZW50ID09IDApIHsKLSAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCcwJyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEFTU0VSVChleHBvbmVudCA8IDFlNCk7Ci0gIGNvbnN0IGludCBrTWF4RXhwb25lbnRMZW5ndGggPSA1OwotICBjaGFyIGJ1ZmZlcltrTWF4RXhwb25lbnRMZW5ndGggKyAxXTsKLSAgYnVmZmVyW2tNYXhFeHBvbmVudExlbmd0aF0gPSAnXDAnOwotICBpbnQgZmlyc3RfY2hhcl9wb3MgPSBrTWF4RXhwb25lbnRMZW5ndGg7Ci0gIHdoaWxlIChleHBvbmVudCA+IDApIHsKLSAgICBidWZmZXJbLS1maXJzdF9jaGFyX3Bvc10gPSAnMCcgKyAoZXhwb25lbnQgJSAxMCk7Ci0gICAgZXhwb25lbnQgLz0gMTA7Ci0gIH0KLSAgcmVzdWx0X2J1aWxkZXItPkFkZFN1YnN0cmluZygmYnVmZmVyW2ZpcnN0X2NoYXJfcG9zXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4RXhwb25lbnRMZW5ndGggLSBmaXJzdF9jaGFyX3Bvcyk7Ci19Ci0KLQotdm9pZCBEb3VibGVUb1N0cmluZ0NvbnZlcnRlcjo6Q3JlYXRlRGVjaW1hbFJlcHJlc2VudGF0aW9uKAotICAgIGNvbnN0IGNoYXIqIGRlY2ltYWxfZGlnaXRzLAotICAgIGludCBsZW5ndGgsCi0gICAgaW50IGRlY2ltYWxfcG9pbnQsCi0gICAgaW50IGRpZ2l0c19hZnRlcl9wb2ludCwKLSAgICBTdHJpbmdCdWlsZGVyKiByZXN1bHRfYnVpbGRlcikgY29uc3QgewotICAvLyBDcmVhdGUgYSByZXByZXNlbnRhdGlvbiB0aGF0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGlmIG5lZWRlZC4KLSAgaWYgKGRlY2ltYWxfcG9pbnQgPD0gMCkgewotICAgICAgLy8gIjAuMDAwMDBkZWNpbWFsX3JlcCIuCi0gICAgcmVzdWx0X2J1aWxkZXItPkFkZENoYXJhY3RlcignMCcpOwotICAgIGlmIChkaWdpdHNfYWZ0ZXJfcG9pbnQgPiAwKSB7Ci0gICAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCcuJyk7Ci0gICAgICByZXN1bHRfYnVpbGRlci0+QWRkUGFkZGluZygnMCcsIC1kZWNpbWFsX3BvaW50KTsKLSAgICAgIEFTU0VSVChsZW5ndGggPD0gZGlnaXRzX2FmdGVyX3BvaW50IC0gKC1kZWNpbWFsX3BvaW50KSk7Ci0gICAgICByZXN1bHRfYnVpbGRlci0+QWRkU3Vic3RyaW5nKGRlY2ltYWxfZGlnaXRzLCBsZW5ndGgpOwotICAgICAgaW50IHJlbWFpbmluZ19kaWdpdHMgPSBkaWdpdHNfYWZ0ZXJfcG9pbnQgLSAoLWRlY2ltYWxfcG9pbnQpIC0gbGVuZ3RoOwotICAgICAgcmVzdWx0X2J1aWxkZXItPkFkZFBhZGRpbmcoJzAnLCByZW1haW5pbmdfZGlnaXRzKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoZGVjaW1hbF9wb2ludCA+PSBsZW5ndGgpIHsKLSAgICAvLyAiZGVjaW1hbF9yZXAwMDAwLjAwMDAwIiBvciAiZGVjaW1hbF9yZXAuMDAwMCIKLSAgICByZXN1bHRfYnVpbGRlci0+QWRkU3Vic3RyaW5nKGRlY2ltYWxfZGlnaXRzLCBsZW5ndGgpOwotICAgIHJlc3VsdF9idWlsZGVyLT5BZGRQYWRkaW5nKCcwJywgZGVjaW1hbF9wb2ludCAtIGxlbmd0aCk7Ci0gICAgaWYgKGRpZ2l0c19hZnRlcl9wb2ludCA+IDApIHsKLSAgICAgIHJlc3VsdF9idWlsZGVyLT5BZGRDaGFyYWN0ZXIoJy4nKTsKLSAgICAgIHJlc3VsdF9idWlsZGVyLT5BZGRQYWRkaW5nKCcwJywgZGlnaXRzX2FmdGVyX3BvaW50KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gImRlY2ltYS5sX3JlcDAwMCIKLSAgICBBU1NFUlQoZGlnaXRzX2FmdGVyX3BvaW50ID4gMCk7Ci0gICAgcmVzdWx0X2J1aWxkZXItPkFkZFN1YnN0cmluZyhkZWNpbWFsX2RpZ2l0cywgZGVjaW1hbF9wb2ludCk7Ci0gICAgcmVzdWx0X2J1aWxkZXItPkFkZENoYXJhY3RlcignLicpOwotICAgIEFTU0VSVChsZW5ndGggLSBkZWNpbWFsX3BvaW50IDw9IGRpZ2l0c19hZnRlcl9wb2ludCk7Ci0gICAgcmVzdWx0X2J1aWxkZXItPkFkZFN1YnN0cmluZygmZGVjaW1hbF9kaWdpdHNbZGVjaW1hbF9wb2ludF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggLSBkZWNpbWFsX3BvaW50KTsKLSAgICBpbnQgcmVtYWluaW5nX2RpZ2l0cyA9IGRpZ2l0c19hZnRlcl9wb2ludCAtIChsZW5ndGggLSBkZWNpbWFsX3BvaW50KTsKLSAgICByZXN1bHRfYnVpbGRlci0+QWRkUGFkZGluZygnMCcsIHJlbWFpbmluZ19kaWdpdHMpOwotICB9Ci0gIGlmIChkaWdpdHNfYWZ0ZXJfcG9pbnQgPT0gMCkgewotICAgIGlmICgoZmxhZ3NfICYgRU1JVF9UUkFJTElOR19ERUNJTUFMX1BPSU5UKSAhPSAwKSB7Ci0gICAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCcuJyk7Ci0gICAgfQotICAgIGlmICgoZmxhZ3NfICYgRU1JVF9UUkFJTElOR19aRVJPX0FGVEVSX1BPSU5UKSAhPSAwKSB7Ci0gICAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCcwJyk7Ci0gICAgfQotICB9Ci19Ci0KLQotYm9vbCBEb3VibGVUb1N0cmluZ0NvbnZlcnRlcjo6VG9TaG9ydGVzdEllZWVOdW1iZXIoCi0gICAgZG91YmxlIHZhbHVlLAotICAgIFN0cmluZ0J1aWxkZXIqIHJlc3VsdF9idWlsZGVyLAotICAgIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpEdG9hTW9kZSBtb2RlKSBjb25zdCB7Ci0gIEFTU0VSVChtb2RlID09IFNIT1JURVNUIHx8IG1vZGUgPT0gU0hPUlRFU1RfU0lOR0xFKTsKLSAgaWYgKERvdWJsZSh2YWx1ZSkuSXNTcGVjaWFsKCkpIHsKLSAgICByZXR1cm4gSGFuZGxlU3BlY2lhbFZhbHVlcyh2YWx1ZSwgcmVzdWx0X2J1aWxkZXIpOwotICB9Ci0KLSAgaW50IGRlY2ltYWxfcG9pbnQ7Ci0gIGJvb2wgc2lnbjsKLSAgY29uc3QgaW50IGtEZWNpbWFsUmVwQ2FwYWNpdHkgPSBrQmFzZTEwTWF4aW1hbExlbmd0aCArIDE7Ci0gIGNoYXIgZGVjaW1hbF9yZXBba0RlY2ltYWxSZXBDYXBhY2l0eV07Ci0gIGludCBkZWNpbWFsX3JlcF9sZW5ndGg7Ci0KLSAgRG91YmxlVG9Bc2NpaSh2YWx1ZSwgbW9kZSwgMCwgZGVjaW1hbF9yZXAsIGtEZWNpbWFsUmVwQ2FwYWNpdHksCi0gICAgICAgICAgICAgICAgJnNpZ24sICZkZWNpbWFsX3JlcF9sZW5ndGgsICZkZWNpbWFsX3BvaW50KTsKLQotICBib29sIHVuaXF1ZV96ZXJvID0gKGZsYWdzXyAmIFVOSVFVRV9aRVJPKSAhPSAwOwotICBpZiAoc2lnbiAmJiAodmFsdWUgIT0gMC4wIHx8ICF1bmlxdWVfemVybykpIHsKLSAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCctJyk7Ci0gIH0KLQotICBpbnQgZXhwb25lbnQgPSBkZWNpbWFsX3BvaW50IC0gMTsKLSAgaWYgKChkZWNpbWFsX2luX3Nob3J0ZXN0X2xvd18gPD0gZXhwb25lbnQpICYmCi0gICAgICAoZXhwb25lbnQgPCBkZWNpbWFsX2luX3Nob3J0ZXN0X2hpZ2hfKSkgewotICAgIENyZWF0ZURlY2ltYWxSZXByZXNlbnRhdGlvbihkZWNpbWFsX3JlcCwgZGVjaW1hbF9yZXBfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsX3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXgoMCwgZGVjaW1hbF9yZXBfbGVuZ3RoIC0gZGVjaW1hbF9wb2ludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9idWlsZGVyKTsKLSAgfSBlbHNlIHsKLSAgICBDcmVhdGVFeHBvbmVudGlhbFJlcHJlc2VudGF0aW9uKGRlY2ltYWxfcmVwLCBkZWNpbWFsX3JlcF9sZW5ndGgsIGV4cG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2J1aWxkZXIpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLWJvb2wgRG91YmxlVG9TdHJpbmdDb252ZXJ0ZXI6OlRvRml4ZWQoZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVxdWVzdGVkX2RpZ2l0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciogcmVzdWx0X2J1aWxkZXIpIGNvbnN0IHsKLSAgQVNTRVJUKGtNYXhGaXhlZERpZ2l0c0JlZm9yZVBvaW50ID09IDYwKTsKLSAgY29uc3QgZG91YmxlIGtGaXJzdE5vbkZpeGVkID0gMWU2MDsKLQotICBpZiAoRG91YmxlKHZhbHVlKS5Jc1NwZWNpYWwoKSkgewotICAgIHJldHVybiBIYW5kbGVTcGVjaWFsVmFsdWVzKHZhbHVlLCByZXN1bHRfYnVpbGRlcik7Ci0gIH0KLQotICBpZiAocmVxdWVzdGVkX2RpZ2l0cyA+IGtNYXhGaXhlZERpZ2l0c0FmdGVyUG9pbnQpIHJldHVybiBmYWxzZTsKLSAgaWYgKHZhbHVlID49IGtGaXJzdE5vbkZpeGVkIHx8IHZhbHVlIDw9IC1rRmlyc3ROb25GaXhlZCkgcmV0dXJuIGZhbHNlOwotCi0gIC8vIEZpbmQgYSBzdWZmaWNpZW50bHkgcHJlY2lzZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIG4uCi0gIGludCBkZWNpbWFsX3BvaW50OwotICBib29sIHNpZ247Ci0gIC8vIEFkZCBzcGFjZSBmb3IgdGhlICdcMCcgYnl0ZS4KLSAgY29uc3QgaW50IGtEZWNpbWFsUmVwQ2FwYWNpdHkgPQotICAgICAga01heEZpeGVkRGlnaXRzQmVmb3JlUG9pbnQgKyBrTWF4Rml4ZWREaWdpdHNBZnRlclBvaW50ICsgMTsKLSAgY2hhciBkZWNpbWFsX3JlcFtrRGVjaW1hbFJlcENhcGFjaXR5XTsKLSAgaW50IGRlY2ltYWxfcmVwX2xlbmd0aDsKLSAgRG91YmxlVG9Bc2NpaSh2YWx1ZSwgRklYRUQsIHJlcXVlc3RlZF9kaWdpdHMsCi0gICAgICAgICAgICAgICAgZGVjaW1hbF9yZXAsIGtEZWNpbWFsUmVwQ2FwYWNpdHksCi0gICAgICAgICAgICAgICAgJnNpZ24sICZkZWNpbWFsX3JlcF9sZW5ndGgsICZkZWNpbWFsX3BvaW50KTsKLQotICBib29sIHVuaXF1ZV96ZXJvID0gKChmbGFnc18gJiBVTklRVUVfWkVSTykgIT0gMCk7Ci0gIGlmIChzaWduICYmICh2YWx1ZSAhPSAwLjAgfHwgIXVuaXF1ZV96ZXJvKSkgewotICAgIHJlc3VsdF9idWlsZGVyLT5BZGRDaGFyYWN0ZXIoJy0nKTsKLSAgfQotCi0gIENyZWF0ZURlY2ltYWxSZXByZXNlbnRhdGlvbihkZWNpbWFsX3JlcCwgZGVjaW1hbF9yZXBfbGVuZ3RoLCBkZWNpbWFsX3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2RpZ2l0cywgcmVzdWx0X2J1aWxkZXIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1ib29sIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpUb0V4cG9uZW50aWFsKAotICAgIGRvdWJsZSB2YWx1ZSwKLSAgICBpbnQgcmVxdWVzdGVkX2RpZ2l0cywKLSAgICBTdHJpbmdCdWlsZGVyKiByZXN1bHRfYnVpbGRlcikgY29uc3QgewotICBpZiAoRG91YmxlKHZhbHVlKS5Jc1NwZWNpYWwoKSkgewotICAgIHJldHVybiBIYW5kbGVTcGVjaWFsVmFsdWVzKHZhbHVlLCByZXN1bHRfYnVpbGRlcik7Ci0gIH0KLQotICBpZiAocmVxdWVzdGVkX2RpZ2l0cyA8IC0xKSByZXR1cm4gZmFsc2U7Ci0gIGlmIChyZXF1ZXN0ZWRfZGlnaXRzID4ga01heEV4cG9uZW50aWFsRGlnaXRzKSByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IGRlY2ltYWxfcG9pbnQ7Ci0gIGJvb2wgc2lnbjsKLSAgLy8gQWRkIHNwYWNlIGZvciBkaWdpdCBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQgYW5kIHRoZSAnXDAnIGNoYXJhY3Rlci4KLSAgY29uc3QgaW50IGtEZWNpbWFsUmVwQ2FwYWNpdHkgPSBrTWF4RXhwb25lbnRpYWxEaWdpdHMgKyAyOwotICBBU1NFUlQoa0RlY2ltYWxSZXBDYXBhY2l0eSA+IGtCYXNlMTBNYXhpbWFsTGVuZ3RoKTsKLSAgY2hhciBkZWNpbWFsX3JlcFtrRGVjaW1hbFJlcENhcGFjaXR5XTsKLSAgaW50IGRlY2ltYWxfcmVwX2xlbmd0aDsKLQotICBpZiAocmVxdWVzdGVkX2RpZ2l0cyA9PSAtMSkgewotICAgIERvdWJsZVRvQXNjaWkodmFsdWUsIFNIT1JURVNULCAwLAotICAgICAgICAgICAgICAgICAgZGVjaW1hbF9yZXAsIGtEZWNpbWFsUmVwQ2FwYWNpdHksCi0gICAgICAgICAgICAgICAgICAmc2lnbiwgJmRlY2ltYWxfcmVwX2xlbmd0aCwgJmRlY2ltYWxfcG9pbnQpOwotICB9IGVsc2UgewotICAgIERvdWJsZVRvQXNjaWkodmFsdWUsIFBSRUNJU0lPTiwgcmVxdWVzdGVkX2RpZ2l0cyArIDEsCi0gICAgICAgICAgICAgICAgICBkZWNpbWFsX3JlcCwga0RlY2ltYWxSZXBDYXBhY2l0eSwKLSAgICAgICAgICAgICAgICAgICZzaWduLCAmZGVjaW1hbF9yZXBfbGVuZ3RoLCAmZGVjaW1hbF9wb2ludCk7Ci0gICAgQVNTRVJUKGRlY2ltYWxfcmVwX2xlbmd0aCA8PSByZXF1ZXN0ZWRfZGlnaXRzICsgMSk7Ci0KLSAgICBmb3IgKGludCBpID0gZGVjaW1hbF9yZXBfbGVuZ3RoOyBpIDwgcmVxdWVzdGVkX2RpZ2l0cyArIDE7ICsraSkgewotICAgICAgZGVjaW1hbF9yZXBbaV0gPSAnMCc7Ci0gICAgfQotICAgIGRlY2ltYWxfcmVwX2xlbmd0aCA9IHJlcXVlc3RlZF9kaWdpdHMgKyAxOwotICB9Ci0KLSAgYm9vbCB1bmlxdWVfemVybyA9ICgoZmxhZ3NfICYgVU5JUVVFX1pFUk8pICE9IDApOwotICBpZiAoc2lnbiAmJiAodmFsdWUgIT0gMC4wIHx8ICF1bmlxdWVfemVybykpIHsKLSAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCctJyk7Ci0gIH0KLQotICBpbnQgZXhwb25lbnQgPSBkZWNpbWFsX3BvaW50IC0gMTsKLSAgQ3JlYXRlRXhwb25lbnRpYWxSZXByZXNlbnRhdGlvbihkZWNpbWFsX3JlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsX3JlcF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2J1aWxkZXIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1ib29sIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpUb1ByZWNpc2lvbihkb3VibGUgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlY2lzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciogcmVzdWx0X2J1aWxkZXIpIGNvbnN0IHsKLSAgaWYgKERvdWJsZSh2YWx1ZSkuSXNTcGVjaWFsKCkpIHsKLSAgICByZXR1cm4gSGFuZGxlU3BlY2lhbFZhbHVlcyh2YWx1ZSwgcmVzdWx0X2J1aWxkZXIpOwotICB9Ci0KLSAgaWYgKHByZWNpc2lvbiA8IGtNaW5QcmVjaXNpb25EaWdpdHMgfHwgcHJlY2lzaW9uID4ga01heFByZWNpc2lvbkRpZ2l0cykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEZpbmQgYSBzdWZmaWNpZW50bHkgcHJlY2lzZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIG4uCi0gIGludCBkZWNpbWFsX3BvaW50OwotICBib29sIHNpZ247Ci0gIC8vIEFkZCBvbmUgZm9yIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3Rlci4KLSAgY29uc3QgaW50IGtEZWNpbWFsUmVwQ2FwYWNpdHkgPSBrTWF4UHJlY2lzaW9uRGlnaXRzICsgMTsKLSAgY2hhciBkZWNpbWFsX3JlcFtrRGVjaW1hbFJlcENhcGFjaXR5XTsKLSAgaW50IGRlY2ltYWxfcmVwX2xlbmd0aDsKLQotICBEb3VibGVUb0FzY2lpKHZhbHVlLCBQUkVDSVNJT04sIHByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICBkZWNpbWFsX3JlcCwga0RlY2ltYWxSZXBDYXBhY2l0eSwKLSAgICAgICAgICAgICAgICAmc2lnbiwgJmRlY2ltYWxfcmVwX2xlbmd0aCwgJmRlY2ltYWxfcG9pbnQpOwotICBBU1NFUlQoZGVjaW1hbF9yZXBfbGVuZ3RoIDw9IHByZWNpc2lvbik7Ci0KLSAgYm9vbCB1bmlxdWVfemVybyA9ICgoZmxhZ3NfICYgVU5JUVVFX1pFUk8pICE9IDApOwotICBpZiAoc2lnbiAmJiAodmFsdWUgIT0gMC4wIHx8ICF1bmlxdWVfemVybykpIHsKLSAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCctJyk7Ci0gIH0KLQotICAvLyBUaGUgZXhwb25lbnQgaWYgd2UgcHJpbnQgdGhlIG51bWJlciBhcyB4Lnh4ZXl5eS4gVGhhdCBpcyB3aXRoIHRoZQotICAvLyBkZWNpbWFsIHBvaW50IGFmdGVyIHRoZSBmaXJzdCBkaWdpdC4KLSAgaW50IGV4cG9uZW50ID0gZGVjaW1hbF9wb2ludCAtIDE7Ci0KLSAgaW50IGV4dHJhX3plcm8gPSAoKGZsYWdzXyAmIEVNSVRfVFJBSUxJTkdfWkVST19BRlRFUl9QT0lOVCkgIT0gMCkgPyAxIDogMDsKLSAgaWYgKCgtZGVjaW1hbF9wb2ludCArIDEgPiBtYXhfbGVhZGluZ19wYWRkaW5nX3plcm9lc19pbl9wcmVjaXNpb25fbW9kZV8pIHx8Ci0gICAgICAoZGVjaW1hbF9wb2ludCAtIHByZWNpc2lvbiArIGV4dHJhX3plcm8gPgotICAgICAgIG1heF90cmFpbGluZ19wYWRkaW5nX3plcm9lc19pbl9wcmVjaXNpb25fbW9kZV8pKSB7Ci0gICAgLy8gRmlsbCBidWZmZXIgdG8gY29udGFpbiAncHJlY2lzaW9uJyBkaWdpdHMuCi0gICAgLy8gVXN1YWxseSB0aGUgYnVmZmVyIGlzIGFscmVhZHkgYXQgdGhlIGNvcnJlY3QgbGVuZ3RoLCBidXQgJ0RvdWJsZVRvQXNjaWknCi0gICAgLy8gaXMgYWxsb3dlZCB0byByZXR1cm4gbGVzcyBjaGFyYWN0ZXJzLgotICAgIGZvciAoaW50IGkgPSBkZWNpbWFsX3JlcF9sZW5ndGg7IGkgPCBwcmVjaXNpb247ICsraSkgewotICAgICAgZGVjaW1hbF9yZXBbaV0gPSAnMCc7Ci0gICAgfQotCi0gICAgQ3JlYXRlRXhwb25lbnRpYWxSZXByZXNlbnRhdGlvbihkZWNpbWFsX3JlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2J1aWxkZXIpOwotICB9IGVsc2UgewotICAgIENyZWF0ZURlY2ltYWxSZXByZXNlbnRhdGlvbihkZWNpbWFsX3JlcCwgZGVjaW1hbF9yZXBfbGVuZ3RoLCBkZWNpbWFsX3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXgoMCwgcHJlY2lzaW9uIC0gZGVjaW1hbF9wb2ludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9idWlsZGVyKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgQmlnbnVtRHRvYU1vZGUgRHRvYVRvQmlnbnVtRHRvYU1vZGUoCi0gICAgRG91YmxlVG9TdHJpbmdDb252ZXJ0ZXI6OkR0b2FNb2RlIGR0b2FfbW9kZSkgewotICBzd2l0Y2ggKGR0b2FfbW9kZSkgewotICAgIGNhc2UgRG91YmxlVG9TdHJpbmdDb252ZXJ0ZXI6OlNIT1JURVNUOiAgcmV0dXJuIEJJR05VTV9EVE9BX1NIT1JURVNUOwotICAgIGNhc2UgRG91YmxlVG9TdHJpbmdDb252ZXJ0ZXI6OlNIT1JURVNUX1NJTkdMRToKLSAgICAgICAgcmV0dXJuIEJJR05VTV9EVE9BX1NIT1JURVNUX1NJTkdMRTsKLSAgICBjYXNlIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpGSVhFRDogICAgIHJldHVybiBCSUdOVU1fRFRPQV9GSVhFRDsKLSAgICBjYXNlIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpQUkVDSVNJT046IHJldHVybiBCSUdOVU1fRFRPQV9QUkVDSVNJT047Ci0gICAgZGVmYXVsdDoKLSAgICAgIFVOUkVBQ0hBQkxFKCk7Ci0gICAgICByZXR1cm4gQklHTlVNX0RUT0FfU0hPUlRFU1Q7ICAvLyBUbyBzaWxlbmNlIGNvbXBpbGVyLgotICB9Ci19Ci0KLQotdm9pZCBEb3VibGVUb1N0cmluZ0NvbnZlcnRlcjo6RG91YmxlVG9Bc2NpaShkb3VibGUgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHRvYU1vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RlZF9kaWdpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBvaW50KSB7Ci0gIFZlY3RvcjxjaGFyPiB2ZWN0b3IoYnVmZmVyLCBidWZmZXJfbGVuZ3RoKTsKLSAgQVNTRVJUKCFEb3VibGUodikuSXNTcGVjaWFsKCkpOwotICBBU1NFUlQobW9kZSA9PSBTSE9SVEVTVCB8fCBtb2RlID09IFNIT1JURVNUX1NJTkdMRSB8fCByZXF1ZXN0ZWRfZGlnaXRzID49IDApOwotCi0gIGlmIChEb3VibGUodikuU2lnbigpIDwgMCkgewotICAgICpzaWduID0gdHJ1ZTsKLSAgICB2ID0gLXY7Ci0gIH0gZWxzZSB7Ci0gICAgKnNpZ24gPSBmYWxzZTsKLSAgfQotCi0gIGlmIChtb2RlID09IFBSRUNJU0lPTiAmJiByZXF1ZXN0ZWRfZGlnaXRzID09IDApIHsKLSAgICB2ZWN0b3JbMF0gPSAnXDAnOwotICAgICpsZW5ndGggPSAwOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICh2ID09IDApIHsKLSAgICB2ZWN0b3JbMF0gPSAnMCc7Ci0gICAgdmVjdG9yWzFdID0gJ1wwJzsKLSAgICAqbGVuZ3RoID0gMTsKLSAgICAqcG9pbnQgPSAxOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgZmFzdF93b3JrZWQ7Ci0gIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2UgU0hPUlRFU1Q6Ci0gICAgICBmYXN0X3dvcmtlZCA9IEZhc3REdG9hKHYsIEZBU1RfRFRPQV9TSE9SVEVTVCwgMCwgdmVjdG9yLCBsZW5ndGgsIHBvaW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hPUlRFU1RfU0lOR0xFOgotICAgICAgZmFzdF93b3JrZWQgPSBGYXN0RHRvYSh2LCBGQVNUX0RUT0FfU0hPUlRFU1RfU0lOR0xFLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IsIGxlbmd0aCwgcG9pbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGSVhFRDoKLSAgICAgIGZhc3Rfd29ya2VkID0gRmFzdEZpeGVkRHRvYSh2LCByZXF1ZXN0ZWRfZGlnaXRzLCB2ZWN0b3IsIGxlbmd0aCwgcG9pbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUkVDSVNJT046Ci0gICAgICBmYXN0X3dvcmtlZCA9IEZhc3REdG9hKHYsIEZBU1RfRFRPQV9QUkVDSVNJT04sIHJlcXVlc3RlZF9kaWdpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciwgbGVuZ3RoLCBwb2ludCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgVU5SRUFDSEFCTEUoKTsKLSAgICAgIGZhc3Rfd29ya2VkID0gZmFsc2U7Ci0gIH0KLSAgaWYgKGZhc3Rfd29ya2VkKSByZXR1cm47Ci0KLSAgLy8gSWYgdGhlIGZhc3QgZHRvYSBkaWRuJ3Qgc3VjY2VlZCB1c2UgdGhlIHNsb3dlciBiaWdudW0gdmVyc2lvbi4KLSAgQmlnbnVtRHRvYU1vZGUgYmlnbnVtX21vZGUgPSBEdG9hVG9CaWdudW1EdG9hTW9kZShtb2RlKTsKLSAgQmlnbnVtRHRvYSh2LCBiaWdudW1fbW9kZSwgcmVxdWVzdGVkX2RpZ2l0cywgdmVjdG9yLCBsZW5ndGgsIHBvaW50KTsKLSAgdmVjdG9yWypsZW5ndGhdID0gJ1wwJzsKLX0KLQotCi0vLyBDb25zdW1lcyB0aGUgZ2l2ZW4gc3Vic3RyaW5nIGZyb20gdGhlIGl0ZXJhdG9yLgotLy8gUmV0dXJucyBmYWxzZSwgaWYgdGhlIHN1YnN0cmluZyBkb2VzIG5vdCBtYXRjaC4KLXN0YXRpYyBib29sIENvbnN1bWVTdWJTdHJpbmcoY29uc3QgY2hhcioqIGN1cnJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3Vic3RyaW5nKSB7Ci0gIEFTU0VSVCgqKmN1cnJlbnQgPT0gKnN1YnN0cmluZyk7Ci0gIGZvciAoc3Vic3RyaW5nKys7ICpzdWJzdHJpbmcgIT0gJ1wwJzsgc3Vic3RyaW5nKyspIHsKLSAgICArKypjdXJyZW50OwotICAgIGlmICgqY3VycmVudCA9PSBlbmQgfHwgKipjdXJyZW50ICE9ICpzdWJzdHJpbmcpIHJldHVybiBmYWxzZTsKLSAgfQotICArKypjdXJyZW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vLyBNYXhpbXVtIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgaW4gZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KLS8vIFRoZSBsb25nZXN0IHBvc3NpYmxlIGRvdWJsZSBpbiBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIGlzCi0vLyAoMl41MyAtIDEpICogMiBeIC0xMDc0IHRoYXQgaXMgKDIgXiA1MyAtIDEpICogNSBeIDEwNzQgLyAxMCBeIDEwNzQKLS8vICg3NjggZGlnaXRzKS4gSWYgd2UgcGFyc2UgYSBudW1iZXIgd2hvc2UgZmlyc3QgZGlnaXRzIGFyZSBlcXVhbCB0byBhCi0vLyBtZWFuIG9mIDIgYWRqYWNlbnQgZG91YmxlcyAodGhhdCBjb3VsZCBoYXZlIHVwIHRvIDc2OSBkaWdpdHMpIHRoZSByZXN1bHQKLS8vIG11c3QgYmUgcm91bmRlZCB0byB0aGUgYmlnZ2VyIG9uZSB1bmxlc3MgdGhlIHRhaWwgY29uc2lzdHMgb2YgemVyb3MsIHNvCi0vLyB3ZSBkb24ndCBuZWVkIHRvIHByZXNlcnZlIGFsbCB0aGUgZGlnaXRzLgotY29uc3QgaW50IGtNYXhTaWduaWZpY2FudERpZ2l0cyA9IDc3MjsKLQotCi0vLyBSZXR1cm5zIHRydWUgaWYgYSBub25zcGFjZSBmb3VuZCBhbmQgZmFsc2UgaWYgdGhlIGVuZCBoYXMgcmVhY2hlZC4KLXN0YXRpYyBpbmxpbmUgYm9vbCBBZHZhbmNlVG9Ob25zcGFjZShjb25zdCBjaGFyKiogY3VycmVudCwgY29uc3QgY2hhciogZW5kKSB7Ci0gIHdoaWxlICgqY3VycmVudCAhPSBlbmQpIHsKLSAgICBpZiAoKipjdXJyZW50ICE9ICcgJykgcmV0dXJuIHRydWU7Ci0gICAgKysqY3VycmVudDsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotc3RhdGljIGJvb2wgaXNEaWdpdChpbnQgeCwgaW50IHJhZGl4KSB7Ci0gIHJldHVybiAoeCA+PSAnMCcgJiYgeCA8PSAnOScgJiYgeCA8ICcwJyArIHJhZGl4KQotICAgICAgfHwgKHJhZGl4ID4gMTAgJiYgeCA+PSAnYScgJiYgeCA8ICdhJyArIHJhZGl4IC0gMTApCi0gICAgICB8fCAocmFkaXggPiAxMCAmJiB4ID49ICdBJyAmJiB4IDwgJ0EnICsgcmFkaXggLSAxMCk7Ci19Ci0KLQotc3RhdGljIGRvdWJsZSBTaWduZWRaZXJvKGJvb2wgc2lnbikgewotICByZXR1cm4gc2lnbiA/IC0wLjAgOiAwLjA7Ci19Ci0KLQotLy8gUGFyc2luZyBpbnRlZ2VycyB3aXRoIHJhZGl4IDIsIDQsIDgsIDE2LCAzMi4gQXNzdW1lcyBjdXJyZW50ICE9IGVuZC4KLXRlbXBsYXRlIDxpbnQgcmFkaXhfbG9nXzI+Ci1zdGF0aWMgZG91YmxlIFJhZGl4U3RyaW5nVG9JZWVlKGNvbnN0IGNoYXIqIGN1cnJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93X3RyYWlsaW5nX2p1bmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBqdW5rX3N0cmluZ192YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkX2FzX2RvdWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIHRyYWlsaW5nX3BvaW50ZXIpIHsKLSAgQVNTRVJUKGN1cnJlbnQgIT0gZW5kKTsKLQotICBjb25zdCBpbnQga0RvdWJsZVNpemUgPSBEb3VibGU6OmtTaWduaWZpY2FuZFNpemU7Ci0gIGNvbnN0IGludCBrU2luZ2xlU2l6ZSA9IFNpbmdsZTo6a1NpZ25pZmljYW5kU2l6ZTsKLSAgY29uc3QgaW50IGtTaWduaWZpY2FuZFNpemUgPSByZWFkX2FzX2RvdWJsZT8ga0RvdWJsZVNpemU6IGtTaW5nbGVTaXplOwotCi0gIC8vIFNraXAgbGVhZGluZyAwcy4KLSAgd2hpbGUgKCpjdXJyZW50ID09ICcwJykgewotICAgICsrY3VycmVudDsKLSAgICBpZiAoY3VycmVudCA9PSBlbmQpIHsKLSAgICAgICp0cmFpbGluZ19wb2ludGVyID0gZW5kOwotICAgICAgcmV0dXJuIFNpZ25lZFplcm8oc2lnbik7Ci0gICAgfQotICB9Ci0KLSAgaW50NjRfdCBudW1iZXIgPSAwOwotICBpbnQgZXhwb25lbnQgPSAwOwotICBjb25zdCBpbnQgcmFkaXggPSAoMSA8PCByYWRpeF9sb2dfMik7Ci0KLSAgZG8gewotICAgIGludCBkaWdpdDsKLSAgICBpZiAoKmN1cnJlbnQgPj0gJzAnICYmICpjdXJyZW50IDw9ICc5JyAmJiAqY3VycmVudCA8ICcwJyArIHJhZGl4KSB7Ci0gICAgICBkaWdpdCA9IHN0YXRpY19jYXN0PGNoYXI+KCpjdXJyZW50KSAtICcwJzsKLSAgICB9IGVsc2UgaWYgKHJhZGl4ID4gMTAgJiYgKmN1cnJlbnQgPj0gJ2EnICYmICpjdXJyZW50IDwgJ2EnICsgcmFkaXggLSAxMCkgewotICAgICAgZGlnaXQgPSBzdGF0aWNfY2FzdDxjaGFyPigqY3VycmVudCkgLSAnYScgKyAxMDsKLSAgICB9IGVsc2UgaWYgKHJhZGl4ID4gMTAgJiYgKmN1cnJlbnQgPj0gJ0EnICYmICpjdXJyZW50IDwgJ0EnICsgcmFkaXggLSAxMCkgewotICAgICAgZGlnaXQgPSBzdGF0aWNfY2FzdDxjaGFyPigqY3VycmVudCkgLSAnQScgKyAxMDsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGFsbG93X3RyYWlsaW5nX2p1bmsgfHwgIUFkdmFuY2VUb05vbnNwYWNlKCZjdXJyZW50LCBlbmQpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIG51bWJlciA9IG51bWJlciAqIHJhZGl4ICsgZGlnaXQ7Ci0gICAgaW50IG92ZXJmbG93ID0gc3RhdGljX2Nhc3Q8aW50PihudW1iZXIgPj4ga1NpZ25pZmljYW5kU2l6ZSk7Ci0gICAgaWYgKG92ZXJmbG93ICE9IDApIHsKLSAgICAgIC8vIE92ZXJmbG93IG9jY3VycmVkLiBOZWVkIHRvIGRldGVybWluZSB3aGljaCBkaXJlY3Rpb24gdG8gcm91bmQgdGhlCi0gICAgICAvLyByZXN1bHQuCi0gICAgICBpbnQgb3ZlcmZsb3dfYml0c19jb3VudCA9IDE7Ci0gICAgICB3aGlsZSAob3ZlcmZsb3cgPiAxKSB7Ci0gICAgICAgIG92ZXJmbG93X2JpdHNfY291bnQrKzsKLSAgICAgICAgb3ZlcmZsb3cgPj49IDE7Ci0gICAgICB9Ci0KLSAgICAgIGludCBkcm9wcGVkX2JpdHNfbWFzayA9ICgoMSA8PCBvdmVyZmxvd19iaXRzX2NvdW50KSAtIDEpOwotICAgICAgaW50IGRyb3BwZWRfYml0cyA9IHN0YXRpY19jYXN0PGludD4obnVtYmVyKSAmIGRyb3BwZWRfYml0c19tYXNrOwotICAgICAgbnVtYmVyID4+PSBvdmVyZmxvd19iaXRzX2NvdW50OwotICAgICAgZXhwb25lbnQgPSBvdmVyZmxvd19iaXRzX2NvdW50OwotCi0gICAgICBib29sIHplcm9fdGFpbCA9IHRydWU7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICArK2N1cnJlbnQ7Ci0gICAgICAgIGlmIChjdXJyZW50ID09IGVuZCB8fCAhaXNEaWdpdCgqY3VycmVudCwgcmFkaXgpKSBicmVhazsKLSAgICAgICAgemVyb190YWlsID0gemVyb190YWlsICYmICpjdXJyZW50ID09ICcwJzsKLSAgICAgICAgZXhwb25lbnQgKz0gcmFkaXhfbG9nXzI7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghYWxsb3dfdHJhaWxpbmdfanVuayAmJiBBZHZhbmNlVG9Ob25zcGFjZSgmY3VycmVudCwgZW5kKSkgewotICAgICAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWU7Ci0gICAgICB9Ci0KLSAgICAgIGludCBtaWRkbGVfdmFsdWUgPSAoMSA8PCAob3ZlcmZsb3dfYml0c19jb3VudCAtIDEpKTsKLSAgICAgIGlmIChkcm9wcGVkX2JpdHMgPiBtaWRkbGVfdmFsdWUpIHsKLSAgICAgICAgbnVtYmVyKys7ICAvLyBSb3VuZGluZyB1cC4KLSAgICAgIH0gZWxzZSBpZiAoZHJvcHBlZF9iaXRzID09IG1pZGRsZV92YWx1ZSkgewotICAgICAgICAvLyBSb3VuZGluZyB0byBldmVuIHRvIGNvbnNpc3RlbmN5IHdpdGggZGVjaW1hbHM6IGhhbGYtd2F5IGNhc2Ugcm91bmRzCi0gICAgICAgIC8vIHVwIGlmIHNpZ25pZmljYW50IHBhcnQgaXMgb2RkIGFuZCBkb3duIG90aGVyd2lzZS4KLSAgICAgICAgaWYgKChudW1iZXIgJiAxKSAhPSAwIHx8ICF6ZXJvX3RhaWwpIHsKLSAgICAgICAgICBudW1iZXIrKzsgIC8vIFJvdW5kaW5nIHVwLgotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIFJvdW5kaW5nIHVwIG1heSBjYXVzZSBvdmVyZmxvdy4KLSAgICAgIGlmICgobnVtYmVyICYgKChpbnQ2NF90KTEgPDwga1NpZ25pZmljYW5kU2l6ZSkpICE9IDApIHsKLSAgICAgICAgZXhwb25lbnQrKzsKLSAgICAgICAgbnVtYmVyID4+PSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgICsrY3VycmVudDsKLSAgfSB3aGlsZSAoY3VycmVudCAhPSBlbmQpOwotCi0gIEFTU0VSVChudW1iZXIgPCAoKGludDY0X3QpMSA8PCBrU2lnbmlmaWNhbmRTaXplKSk7Ci0gIEFTU0VSVChzdGF0aWNfY2FzdDxpbnQ2NF90PihzdGF0aWNfY2FzdDxkb3VibGU+KG51bWJlcikpID09IG51bWJlcik7Ci0KLSAgKnRyYWlsaW5nX3BvaW50ZXIgPSBjdXJyZW50OwotCi0gIGlmIChleHBvbmVudCA9PSAwKSB7Ci0gICAgaWYgKHNpZ24pIHsKLSAgICAgIGlmIChudW1iZXIgPT0gMCkgcmV0dXJuIC0wLjA7Ci0gICAgICBudW1iZXIgPSAtbnVtYmVyOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihudW1iZXIpOwotICB9Ci0KLSAgQVNTRVJUKG51bWJlciAhPSAwKTsKLSAgcmV0dXJuIERvdWJsZShEaXlGcChudW1iZXIsIGV4cG9uZW50KSkudmFsdWUoKTsKLX0KLQotCi1kb3VibGUgU3RyaW5nVG9Eb3VibGVDb252ZXJ0ZXI6OlN0cmluZ1RvSWVlZSgKLSAgICBjb25zdCBjaGFyKiBpbnB1dCwKLSAgICBpbnQgbGVuZ3RoLAotICAgIGludCogcHJvY2Vzc2VkX2NoYXJhY3RlcnNfY291bnQsCi0gICAgYm9vbCByZWFkX2FzX2RvdWJsZSkgY29uc3QgewotICBjb25zdCBjaGFyKiBjdXJyZW50ID0gaW5wdXQ7Ci0gIGNvbnN0IGNoYXIqIGVuZCA9IGlucHV0ICsgbGVuZ3RoOwotCi0gICpwcm9jZXNzZWRfY2hhcmFjdGVyc19jb3VudCA9IDA7Ci0KLSAgY29uc3QgYm9vbCBhbGxvd190cmFpbGluZ19qdW5rID0gKGZsYWdzXyAmIEFMTE9XX1RSQUlMSU5HX0pVTkspICE9IDA7Ci0gIGNvbnN0IGJvb2wgYWxsb3dfbGVhZGluZ19zcGFjZXMgPSAoZmxhZ3NfICYgQUxMT1dfTEVBRElOR19TUEFDRVMpICE9IDA7Ci0gIGNvbnN0IGJvb2wgYWxsb3dfdHJhaWxpbmdfc3BhY2VzID0gKGZsYWdzXyAmIEFMTE9XX1RSQUlMSU5HX1NQQUNFUykgIT0gMDsKLSAgY29uc3QgYm9vbCBhbGxvd19zcGFjZXNfYWZ0ZXJfc2lnbiA9IChmbGFnc18gJiBBTExPV19TUEFDRVNfQUZURVJfU0lHTikgIT0gMDsKLQotICAvLyBUbyBtYWtlIHN1cmUgdGhhdCBpdGVyYXRvciBkZXJlZmVyZW5jaW5nIGlzIHZhbGlkIHRoZSBmb2xsb3dpbmcKLSAgLy8gY29udmVudGlvbiBpcyB1c2VkOgotICAvLyAxLiBFYWNoICcrK2N1cnJlbnQnIHN0YXRlbWVudCBpcyBmb2xsb3dlZCBieSBjaGVjayBmb3IgZXF1YWxpdHkgdG8gJ2VuZCcuCi0gIC8vIDIuIElmIEFkdmFuY2VUb05vbnNwYWNlIHJldHVybmVkIGZhbHNlIHRoZW4gY3VycmVudCA9PSBlbmQuCi0gIC8vIDMuIElmICdjdXJyZW50JyBiZWNvbWVzIGVxdWFsIHRvICdlbmQnIHRoZSBmdW5jdGlvbiByZXR1cm5zIG9yIGdvZXMgdG8KLSAgLy8gJ3BhcnNpbmdfZG9uZScuCi0gIC8vIDQuICdjdXJyZW50JyBpcyBub3QgZGVyZWZlcmVuY2VkIGFmdGVyIHRoZSAncGFyc2luZ19kb25lJyBsYWJlbC4KLSAgLy8gNS4gQ29kZSBiZWZvcmUgJ3BhcnNpbmdfZG9uZScgbWF5IHJlbHkgb24gJ2N1cnJlbnQgIT0gZW5kJy4KLSAgaWYgKGN1cnJlbnQgPT0gZW5kKSByZXR1cm4gZW1wdHlfc3RyaW5nX3ZhbHVlXzsKLQotICBpZiAoYWxsb3dfbGVhZGluZ19zcGFjZXMgfHwgYWxsb3dfdHJhaWxpbmdfc3BhY2VzKSB7Ci0gICAgaWYgKCFBZHZhbmNlVG9Ob25zcGFjZSgmY3VycmVudCwgZW5kKSkgewotICAgICAgKnByb2Nlc3NlZF9jaGFyYWN0ZXJzX2NvdW50ID0gY3VycmVudCAtIGlucHV0OwotICAgICAgcmV0dXJuIGVtcHR5X3N0cmluZ192YWx1ZV87Ci0gICAgfQotICAgIGlmICghYWxsb3dfbGVhZGluZ19zcGFjZXMgJiYgKGlucHV0ICE9IGN1cnJlbnQpKSB7Ci0gICAgICAvLyBObyBsZWFkaW5nIHNwYWNlcyBhbGxvd2VkLCBidXQgQWR2YW5jZVRvTm9uc3BhY2UgbW92ZWQgZm9yd2FyZC4KLSAgICAgIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZV87Ci0gICAgfQotICB9Ci0KLSAgLy8gVGhlIGxvbmdlc3QgZm9ybSBvZiBzaW1wbGlmaWVkIG51bWJlciBpczogIi08c2lnbmlmaWNhbnQgZGlnaXRzPi4xZVhYWFwwIi4KLSAgY29uc3QgaW50IGtCdWZmZXJTaXplID0ga01heFNpZ25pZmljYW50RGlnaXRzICsgMTA7Ci0gIGNoYXIgYnVmZmVyW2tCdWZmZXJTaXplXTsgIC8vIE5PTElOVDogc2l6ZSBpcyBrbm93biBhdCBjb21waWxlIHRpbWUuCi0gIGludCBidWZmZXJfcG9zID0gMDsKLQotICAvLyBFeHBvbmVudCB3aWxsIGJlIGFkanVzdGVkIGlmIGluc2lnbmlmaWNhbnQgZGlnaXRzIG9mIHRoZSBpbnRlZ2VyIHBhcnQKLSAgLy8gb3IgaW5zaWduaWZpY2FudCBsZWFkaW5nIHplcm9zIG9mIHRoZSBmcmFjdGlvbmFsIHBhcnQgYXJlIGRyb3BwZWQuCi0gIGludCBleHBvbmVudCA9IDA7Ci0gIGludCBzaWduaWZpY2FudF9kaWdpdHMgPSAwOwotICBpbnQgaW5zaWduaWZpY2FudF9kaWdpdHMgPSAwOwotICBib29sIG5vbnplcm9fZGlnaXRfZHJvcHBlZCA9IGZhbHNlOwotCi0gIGJvb2wgc2lnbiA9IGZhbHNlOwotCi0gIGlmICgqY3VycmVudCA9PSAnKycgfHwgKmN1cnJlbnQgPT0gJy0nKSB7Ci0gICAgc2lnbiA9ICgqY3VycmVudCA9PSAnLScpOwotICAgICsrY3VycmVudDsKLSAgICBjb25zdCBjaGFyKiBuZXh0X25vbl9zcGFjZSA9IGN1cnJlbnQ7Ci0gICAgLy8gU2tpcCBmb2xsb3dpbmcgc3BhY2VzIChpZiBhbGxvd2VkKS4KLSAgICBpZiAoIUFkdmFuY2VUb05vbnNwYWNlKCZuZXh0X25vbl9zcGFjZSwgZW5kKSkgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKLSAgICBpZiAoIWFsbG93X3NwYWNlc19hZnRlcl9zaWduICYmIChjdXJyZW50ICE9IG5leHRfbm9uX3NwYWNlKSkgewotICAgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKLSAgICB9Ci0gICAgY3VycmVudCA9IG5leHRfbm9uX3NwYWNlOwotICB9Ci0KLSAgaWYgKGluZmluaXR5X3N5bWJvbF8gIT0gTlVMTCkgewotICAgIGlmICgqY3VycmVudCA9PSBpbmZpbml0eV9zeW1ib2xfWzBdKSB7Ci0gICAgICBpZiAoIUNvbnN1bWVTdWJTdHJpbmcoJmN1cnJlbnQsIGVuZCwgaW5maW5pdHlfc3ltYm9sXykpIHsKLSAgICAgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKLSAgICAgIH0KLQotICAgICAgaWYgKCEoYWxsb3dfdHJhaWxpbmdfc3BhY2VzIHx8IGFsbG93X3RyYWlsaW5nX2p1bmspICYmIChjdXJyZW50ICE9IGVuZCkpIHsKLSAgICAgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKLSAgICAgIH0KLSAgICAgIGlmICghYWxsb3dfdHJhaWxpbmdfanVuayAmJiBBZHZhbmNlVG9Ob25zcGFjZSgmY3VycmVudCwgZW5kKSkgewotICAgICAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOwotICAgICAgfQotCi0gICAgICBBU1NFUlQoYnVmZmVyX3BvcyA9PSAwKTsKLSAgICAgICpwcm9jZXNzZWRfY2hhcmFjdGVyc19jb3VudCA9IGN1cnJlbnQgLSBpbnB1dDsKLSAgICAgIHJldHVybiBzaWduID8gLURvdWJsZTo6SW5maW5pdHkoKSA6IERvdWJsZTo6SW5maW5pdHkoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobmFuX3N5bWJvbF8gIT0gTlVMTCkgewotICAgIGlmICgqY3VycmVudCA9PSBuYW5fc3ltYm9sX1swXSkgewotICAgICAgaWYgKCFDb25zdW1lU3ViU3RyaW5nKCZjdXJyZW50LCBlbmQsIG5hbl9zeW1ib2xfKSkgewotICAgICAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOwotICAgICAgfQotCi0gICAgICBpZiAoIShhbGxvd190cmFpbGluZ19zcGFjZXMgfHwgYWxsb3dfdHJhaWxpbmdfanVuaykgJiYgKGN1cnJlbnQgIT0gZW5kKSkgewotICAgICAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOwotICAgICAgfQotICAgICAgaWYgKCFhbGxvd190cmFpbGluZ19qdW5rICYmIEFkdmFuY2VUb05vbnNwYWNlKCZjdXJyZW50LCBlbmQpKSB7Ci0gICAgICAgIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZV87Ci0gICAgICB9Ci0KLSAgICAgIEFTU0VSVChidWZmZXJfcG9zID09IDApOwotICAgICAgKnByb2Nlc3NlZF9jaGFyYWN0ZXJzX2NvdW50ID0gY3VycmVudCAtIGlucHV0OwotICAgICAgcmV0dXJuIHNpZ24gPyAtRG91YmxlOjpOYU4oKSA6IERvdWJsZTo6TmFOKCk7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBsZWFkaW5nX3plcm8gPSBmYWxzZTsKLSAgaWYgKCpjdXJyZW50ID09ICcwJykgewotICAgICsrY3VycmVudDsKLSAgICBpZiAoY3VycmVudCA9PSBlbmQpIHsKLSAgICAgICpwcm9jZXNzZWRfY2hhcmFjdGVyc19jb3VudCA9IGN1cnJlbnQgLSBpbnB1dDsKLSAgICAgIHJldHVybiBTaWduZWRaZXJvKHNpZ24pOwotICAgIH0KLQotICAgIGxlYWRpbmdfemVybyA9IHRydWU7Ci0KLSAgICAvLyBJdCBjb3VsZCBiZSBoZXhhZGVjaW1hbCB2YWx1ZS4KLSAgICBpZiAoKGZsYWdzXyAmIEFMTE9XX0hFWCkgJiYgKCpjdXJyZW50ID09ICd4JyB8fCAqY3VycmVudCA9PSAnWCcpKSB7Ci0gICAgICArK2N1cnJlbnQ7Ci0gICAgICBpZiAoY3VycmVudCA9PSBlbmQgfHwgIWlzRGlnaXQoKmN1cnJlbnQsIDE2KSkgewotICAgICAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOyAgLy8gIjB4Ii4KLSAgICAgIH0KLQotICAgICAgY29uc3QgY2hhciogdGFpbF9wb2ludGVyID0gTlVMTDsKLSAgICAgIGRvdWJsZSByZXN1bHQgPSBSYWRpeFN0cmluZ1RvSWVlZTw0PihjdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3RyYWlsaW5nX2p1bmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVua19zdHJpbmdfdmFsdWVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYXNfZG91YmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWlsX3BvaW50ZXIpOwotICAgICAgaWYgKHRhaWxfcG9pbnRlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChhbGxvd190cmFpbGluZ19zcGFjZXMpIEFkdmFuY2VUb05vbnNwYWNlKCZ0YWlsX3BvaW50ZXIsIGVuZCk7Ci0gICAgICAgICpwcm9jZXNzZWRfY2hhcmFjdGVyc19jb3VudCA9IHRhaWxfcG9pbnRlciAtIGlucHV0OwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBJZ25vcmUgbGVhZGluZyB6ZXJvcyBpbiB0aGUgaW50ZWdlciBwYXJ0LgotICAgIHdoaWxlICgqY3VycmVudCA9PSAnMCcpIHsKLSAgICAgICsrY3VycmVudDsKLSAgICAgIGlmIChjdXJyZW50ID09IGVuZCkgewotICAgICAgICAqcHJvY2Vzc2VkX2NoYXJhY3RlcnNfY291bnQgPSBjdXJyZW50IC0gaW5wdXQ7Ci0gICAgICAgIHJldHVybiBTaWduZWRaZXJvKHNpZ24pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGJvb2wgb2N0YWwgPSBsZWFkaW5nX3plcm8gJiYgKGZsYWdzXyAmIEFMTE9XX09DVEFMUykgIT0gMDsKLQotICAvLyBDb3B5IHNpZ25pZmljYW50IGRpZ2l0cyBvZiB0aGUgaW50ZWdlciBwYXJ0IChpZiBhbnkpIHRvIHRoZSBidWZmZXIuCi0gIHdoaWxlICgqY3VycmVudCA+PSAnMCcgJiYgKmN1cnJlbnQgPD0gJzknKSB7Ci0gICAgaWYgKHNpZ25pZmljYW50X2RpZ2l0cyA8IGtNYXhTaWduaWZpY2FudERpZ2l0cykgewotICAgICAgQVNTRVJUKGJ1ZmZlcl9wb3MgPCBrQnVmZmVyU2l6ZSk7Ci0gICAgICBidWZmZXJbYnVmZmVyX3BvcysrXSA9IHN0YXRpY19jYXN0PGNoYXI+KCpjdXJyZW50KTsKLSAgICAgIHNpZ25pZmljYW50X2RpZ2l0cysrOwotICAgICAgLy8gV2lsbCBsYXRlciBjaGVjayBpZiBpdCdzIGFuIG9jdGFsIGluIHRoZSBidWZmZXIuCi0gICAgfSBlbHNlIHsKLSAgICAgIGluc2lnbmlmaWNhbnRfZGlnaXRzKys7ICAvLyBNb3ZlIHRoZSBkaWdpdCBpbnRvIHRoZSBleHBvbmVudGlhbCBwYXJ0LgotICAgICAgbm9uemVyb19kaWdpdF9kcm9wcGVkID0gbm9uemVyb19kaWdpdF9kcm9wcGVkIHx8ICpjdXJyZW50ICE9ICcwJzsKLSAgICB9Ci0gICAgb2N0YWwgPSBvY3RhbCAmJiAqY3VycmVudCA8ICc4JzsKLSAgICArK2N1cnJlbnQ7Ci0gICAgaWYgKGN1cnJlbnQgPT0gZW5kKSBnb3RvIHBhcnNpbmdfZG9uZTsKLSAgfQotCi0gIGlmIChzaWduaWZpY2FudF9kaWdpdHMgPT0gMCkgewotICAgIG9jdGFsID0gZmFsc2U7Ci0gIH0KLQotICBpZiAoKmN1cnJlbnQgPT0gJy4nKSB7Ci0gICAgaWYgKG9jdGFsICYmICFhbGxvd190cmFpbGluZ19qdW5rKSByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOwotICAgIGlmIChvY3RhbCkgZ290byBwYXJzaW5nX2RvbmU7Ci0KLSAgICArK2N1cnJlbnQ7Ci0gICAgaWYgKGN1cnJlbnQgPT0gZW5kKSB7Ci0gICAgICBpZiAoc2lnbmlmaWNhbnRfZGlnaXRzID09IDAgJiYgIWxlYWRpbmdfemVybykgewotICAgICAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZ290byBwYXJzaW5nX2RvbmU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNpZ25pZmljYW50X2RpZ2l0cyA9PSAwKSB7Ci0gICAgICAvLyBvY3RhbCA9IGZhbHNlOwotICAgICAgLy8gSW50ZWdlciBwYXJ0IGNvbnNpc3RzIG9mIDAgb3IgaXMgYWJzZW50LiBTaWduaWZpY2FudCBkaWdpdHMgc3RhcnQgYWZ0ZXIKLSAgICAgIC8vIGxlYWRpbmcgemVyb3MgKGlmIGFueSkuCi0gICAgICB3aGlsZSAoKmN1cnJlbnQgPT0gJzAnKSB7Ci0gICAgICAgICsrY3VycmVudDsKLSAgICAgICAgaWYgKGN1cnJlbnQgPT0gZW5kKSB7Ci0gICAgICAgICAgKnByb2Nlc3NlZF9jaGFyYWN0ZXJzX2NvdW50ID0gY3VycmVudCAtIGlucHV0OwotICAgICAgICAgIHJldHVybiBTaWduZWRaZXJvKHNpZ24pOwotICAgICAgICB9Ci0gICAgICAgIGV4cG9uZW50LS07ICAvLyBNb3ZlIHRoaXMgMCBpbnRvIHRoZSBleHBvbmVudC4KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGVyZSBpcyBhIGZyYWN0aW9uYWwgcGFydC4KLSAgICAvLyBXZSBkb24ndCBlbWl0IGEgJy4nLCBidXQgYWRqdXN0IHRoZSBleHBvbmVudCBpbnN0ZWFkLgotICAgIHdoaWxlICgqY3VycmVudCA+PSAnMCcgJiYgKmN1cnJlbnQgPD0gJzknKSB7Ci0gICAgICBpZiAoc2lnbmlmaWNhbnRfZGlnaXRzIDwga01heFNpZ25pZmljYW50RGlnaXRzKSB7Ci0gICAgICAgIEFTU0VSVChidWZmZXJfcG9zIDwga0J1ZmZlclNpemUpOwotICAgICAgICBidWZmZXJbYnVmZmVyX3BvcysrXSA9IHN0YXRpY19jYXN0PGNoYXI+KCpjdXJyZW50KTsKLSAgICAgICAgc2lnbmlmaWNhbnRfZGlnaXRzKys7Ci0gICAgICAgIGV4cG9uZW50LS07Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBJZ25vcmUgaW5zaWduaWZpY2FudCBkaWdpdHMgaW4gdGhlIGZyYWN0aW9uYWwgcGFydC4KLSAgICAgICAgbm9uemVyb19kaWdpdF9kcm9wcGVkID0gbm9uemVyb19kaWdpdF9kcm9wcGVkIHx8ICpjdXJyZW50ICE9ICcwJzsKLSAgICAgIH0KLSAgICAgICsrY3VycmVudDsKLSAgICAgIGlmIChjdXJyZW50ID09IGVuZCkgZ290byBwYXJzaW5nX2RvbmU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFsZWFkaW5nX3plcm8gJiYgZXhwb25lbnQgPT0gMCAmJiBzaWduaWZpY2FudF9kaWdpdHMgPT0gMCkgewotICAgIC8vIElmIGxlYWRpbmdfemVyb3MgaXMgdHJ1ZSB0aGVuIHRoZSBzdHJpbmcgY29udGFpbnMgemVyb3MuCi0gICAgLy8gSWYgZXhwb25lbnQgPCAwIHRoZW4gc3RyaW5nIHdhcyBbKy1dXC4wKi4uLgotICAgIC8vIElmIHNpZ25pZmljYW50X2RpZ2l0cyAhPSAwIHRoZSBzdHJpbmcgaXMgbm90IGVxdWFsIHRvIDAuCi0gICAgLy8gT3RoZXJ3aXNlIHRoZXJlIGFyZSBubyBkaWdpdHMgaW4gdGhlIHN0cmluZy4KLSAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOwotICB9Ci0KLSAgLy8gUGFyc2UgZXhwb25lbnRpYWwgcGFydC4KLSAgaWYgKCpjdXJyZW50ID09ICdlJyB8fCAqY3VycmVudCA9PSAnRScpIHsKLSAgICBpZiAob2N0YWwgJiYgIWFsbG93X3RyYWlsaW5nX2p1bmspIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZV87Ci0gICAgaWYgKG9jdGFsKSBnb3RvIHBhcnNpbmdfZG9uZTsKLSAgICArK2N1cnJlbnQ7Ci0gICAgaWYgKGN1cnJlbnQgPT0gZW5kKSB7Ci0gICAgICBpZiAoYWxsb3dfdHJhaWxpbmdfanVuaykgewotICAgICAgICBnb3RvIHBhcnNpbmdfZG9uZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZV87Ci0gICAgICB9Ci0gICAgfQotICAgIGNoYXIgc2lnbiA9ICcrJzsKLSAgICBpZiAoKmN1cnJlbnQgPT0gJysnIHx8ICpjdXJyZW50ID09ICctJykgewotICAgICAgc2lnbiA9IHN0YXRpY19jYXN0PGNoYXI+KCpjdXJyZW50KTsKLSAgICAgICsrY3VycmVudDsKLSAgICAgIGlmIChjdXJyZW50ID09IGVuZCkgewotICAgICAgICBpZiAoYWxsb3dfdHJhaWxpbmdfanVuaykgewotICAgICAgICAgIGdvdG8gcGFyc2luZ19kb25lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZV87Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY3VycmVudCA9PSBlbmQgfHwgKmN1cnJlbnQgPCAnMCcgfHwgKmN1cnJlbnQgPiAnOScpIHsKLSAgICAgIGlmIChhbGxvd190cmFpbGluZ19qdW5rKSB7Ci0gICAgICAgIGdvdG8gcGFyc2luZ19kb25lOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCBpbnQgbWF4X2V4cG9uZW50ID0gSU5UX01BWCAvIDI7Ci0gICAgQVNTRVJUKC1tYXhfZXhwb25lbnQgLyAyIDw9IGV4cG9uZW50ICYmIGV4cG9uZW50IDw9IG1heF9leHBvbmVudCAvIDIpOwotICAgIGludCBudW0gPSAwOwotICAgIGRvIHsKLSAgICAgIC8vIENoZWNrIG92ZXJmbG93LgotICAgICAgaW50IGRpZ2l0ID0gKmN1cnJlbnQgLSAnMCc7Ci0gICAgICBpZiAobnVtID49IG1heF9leHBvbmVudCAvIDEwCi0gICAgICAgICAgJiYgIShudW0gPT0gbWF4X2V4cG9uZW50IC8gMTAgJiYgZGlnaXQgPD0gbWF4X2V4cG9uZW50ICUgMTApKSB7Ci0gICAgICAgIG51bSA9IG1heF9leHBvbmVudDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG51bSA9IG51bSAqIDEwICsgZGlnaXQ7Ci0gICAgICB9Ci0gICAgICArK2N1cnJlbnQ7Ci0gICAgfSB3aGlsZSAoY3VycmVudCAhPSBlbmQgJiYgKmN1cnJlbnQgPj0gJzAnICYmICpjdXJyZW50IDw9ICc5Jyk7Ci0KLSAgICBleHBvbmVudCArPSAoc2lnbiA9PSAnLScgPyAtbnVtIDogbnVtKTsKLSAgfQotCi0gIGlmICghKGFsbG93X3RyYWlsaW5nX3NwYWNlcyB8fCBhbGxvd190cmFpbGluZ19qdW5rKSAmJiAoY3VycmVudCAhPSBlbmQpKSB7Ci0gICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKLSAgfQotICBpZiAoIWFsbG93X3RyYWlsaW5nX2p1bmsgJiYgQWR2YW5jZVRvTm9uc3BhY2UoJmN1cnJlbnQsIGVuZCkpIHsKLSAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOwotICB9Ci0gIGlmIChhbGxvd190cmFpbGluZ19zcGFjZXMpIHsKLSAgICBBZHZhbmNlVG9Ob25zcGFjZSgmY3VycmVudCwgZW5kKTsKLSAgfQotCi0gIHBhcnNpbmdfZG9uZToKLSAgZXhwb25lbnQgKz0gaW5zaWduaWZpY2FudF9kaWdpdHM7Ci0KLSAgaWYgKG9jdGFsKSB7Ci0gICAgZG91YmxlIHJlc3VsdDsKLSAgICBjb25zdCBjaGFyKiB0YWlsX3BvaW50ZXIgPSBOVUxMOwotICAgIHJlc3VsdCA9IFJhZGl4U3RyaW5nVG9JZWVlPDM+KGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyBidWZmZXJfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfdHJhaWxpbmdfanVuaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5rX3N0cmluZ192YWx1ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9hc19kb3VibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhaWxfcG9pbnRlcik7Ci0gICAgQVNTRVJUKHRhaWxfcG9pbnRlciAhPSBOVUxMKTsKLSAgICAqcHJvY2Vzc2VkX2NoYXJhY3RlcnNfY291bnQgPSBjdXJyZW50IC0gaW5wdXQ7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIGlmIChub256ZXJvX2RpZ2l0X2Ryb3BwZWQpIHsKLSAgICBidWZmZXJbYnVmZmVyX3BvcysrXSA9ICcxJzsKLSAgICBleHBvbmVudC0tOwotICB9Ci0KLSAgQVNTRVJUKGJ1ZmZlcl9wb3MgPCBrQnVmZmVyU2l6ZSk7Ci0gIGJ1ZmZlcltidWZmZXJfcG9zXSA9ICdcMCc7Ci0KLSAgZG91YmxlIGNvbnZlcnRlZDsKLSAgaWYgKHJlYWRfYXNfZG91YmxlKSB7Ci0gICAgY29udmVydGVkID0gU3RydG9kKFZlY3Rvcjxjb25zdCBjaGFyPihidWZmZXIsIGJ1ZmZlcl9wb3MpLCBleHBvbmVudCk7Ci0gIH0gZWxzZSB7Ci0gICAgY29udmVydGVkID0gU3RydG9mKFZlY3Rvcjxjb25zdCBjaGFyPihidWZmZXIsIGJ1ZmZlcl9wb3MpLCBleHBvbmVudCk7Ci0gIH0KLSAgKnByb2Nlc3NlZF9jaGFyYWN0ZXJzX2NvdW50ID0gY3VycmVudCAtIGlucHV0OwotICByZXR1cm4gc2lnbj8gLWNvbnZlcnRlZDogY29udmVydGVkOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZG91YmxlX2NvbnZlcnNpb24KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2ZpeGVkLWR0b2EuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9maXhlZC1kdG9hLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTZiMTQ0Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2ZpeGVkLWR0b2EuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotLy8gICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0vLyAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLS8vICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSAiZml4ZWQtZHRvYS5oIgotI2luY2x1ZGUgImllZWUuaCIKLQotbmFtZXNwYWNlIGRvdWJsZV9jb252ZXJzaW9uIHsKLQotLy8gUmVwcmVzZW50cyBhIDEyOGJpdCB0eXBlLiBUaGlzIGNsYXNzIHNob3VsZCBiZSByZXBsYWNlZCBieSBhIG5hdGl2ZSB0eXBlIG9uCi0vLyBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IDEyOGJpdCBpbnRlZ2Vycy4KLWNsYXNzIFVJbnQxMjggewotIHB1YmxpYzoKLSAgVUludDEyOCgpIDogaGlnaF9iaXRzXygwKSwgbG93X2JpdHNfKDApIHsgfQotICBVSW50MTI4KHVpbnQ2NF90IGhpZ2gsIHVpbnQ2NF90IGxvdykgOiBoaWdoX2JpdHNfKGhpZ2gpLCBsb3dfYml0c18obG93KSB7IH0KLQotICB2b2lkIE11bHRpcGx5KHVpbnQzMl90IG11bHRpcGxpY2FuZCkgewotICAgIHVpbnQ2NF90IGFjY3VtdWxhdG9yOwotCi0gICAgYWNjdW11bGF0b3IgPSAobG93X2JpdHNfICYga01hc2szMikgKiBtdWx0aXBsaWNhbmQ7Ci0gICAgdWludDMyX3QgcGFydCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhY2N1bXVsYXRvciAmIGtNYXNrMzIpOwotICAgIGFjY3VtdWxhdG9yID4+PSAzMjsKLSAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICsgKGxvd19iaXRzXyA+PiAzMikgKiBtdWx0aXBsaWNhbmQ7Ci0gICAgbG93X2JpdHNfID0gKGFjY3VtdWxhdG9yIDw8IDMyKSArIHBhcnQ7Ci0gICAgYWNjdW11bGF0b3IgPj49IDMyOwotICAgIGFjY3VtdWxhdG9yID0gYWNjdW11bGF0b3IgKyAoaGlnaF9iaXRzXyAmIGtNYXNrMzIpICogbXVsdGlwbGljYW5kOwotICAgIHBhcnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYWNjdW11bGF0b3IgJiBrTWFzazMyKTsKLSAgICBhY2N1bXVsYXRvciA+Pj0gMzI7Ci0gICAgYWNjdW11bGF0b3IgPSBhY2N1bXVsYXRvciArIChoaWdoX2JpdHNfID4+IDMyKSAqIG11bHRpcGxpY2FuZDsKLSAgICBoaWdoX2JpdHNfID0gKGFjY3VtdWxhdG9yIDw8IDMyKSArIHBhcnQ7Ci0gICAgQVNTRVJUKChhY2N1bXVsYXRvciA+PiAzMikgPT0gMCk7Ci0gIH0KLQotICB2b2lkIFNoaWZ0KGludCBzaGlmdF9hbW91bnQpIHsKLSAgICBBU1NFUlQoLTY0IDw9IHNoaWZ0X2Ftb3VudCAmJiBzaGlmdF9hbW91bnQgPD0gNjQpOwotICAgIGlmIChzaGlmdF9hbW91bnQgPT0gMCkgewotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoc2hpZnRfYW1vdW50ID09IC02NCkgewotICAgICAgaGlnaF9iaXRzXyA9IGxvd19iaXRzXzsKLSAgICAgIGxvd19iaXRzXyA9IDA7Ci0gICAgfSBlbHNlIGlmIChzaGlmdF9hbW91bnQgPT0gNjQpIHsKLSAgICAgIGxvd19iaXRzXyA9IGhpZ2hfYml0c187Ci0gICAgICBoaWdoX2JpdHNfID0gMDsKLSAgICB9IGVsc2UgaWYgKHNoaWZ0X2Ftb3VudCA8PSAwKSB7Ci0gICAgICBoaWdoX2JpdHNfIDw8PSAtc2hpZnRfYW1vdW50OwotICAgICAgaGlnaF9iaXRzXyArPSBsb3dfYml0c18gPj4gKDY0ICsgc2hpZnRfYW1vdW50KTsKLSAgICAgIGxvd19iaXRzXyA8PD0gLXNoaWZ0X2Ftb3VudDsKLSAgICB9IGVsc2UgewotICAgICAgbG93X2JpdHNfID4+PSBzaGlmdF9hbW91bnQ7Ci0gICAgICBsb3dfYml0c18gKz0gaGlnaF9iaXRzXyA8PCAoNjQgLSBzaGlmdF9hbW91bnQpOwotICAgICAgaGlnaF9iaXRzXyA+Pj0gc2hpZnRfYW1vdW50OwotICAgIH0KLSAgfQotCi0gIC8vIE1vZGlmaWVzICp0aGlzIHRvICp0aGlzIE1PRCAoMl5wb3dlcikuCi0gIC8vIFJldHVybnMgKnRoaXMgRElWICgyXnBvd2VyKS4KLSAgaW50IERpdk1vZFBvd2VyT2YyKGludCBwb3dlcikgewotICAgIGlmIChwb3dlciA+PSA2NCkgewotICAgICAgaW50IHJlc3VsdCA9IHN0YXRpY19jYXN0PGludD4oaGlnaF9iaXRzXyA+PiAocG93ZXIgLSA2NCkpOwotICAgICAgaGlnaF9iaXRzXyAtPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocmVzdWx0KSA8PCAocG93ZXIgLSA2NCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICB1aW50NjRfdCBwYXJ0X2xvdyA9IGxvd19iaXRzXyA+PiBwb3dlcjsKLSAgICAgIHVpbnQ2NF90IHBhcnRfaGlnaCA9IGhpZ2hfYml0c18gPDwgKDY0IC0gcG93ZXIpOwotICAgICAgaW50IHJlc3VsdCA9IHN0YXRpY19jYXN0PGludD4ocGFydF9sb3cgKyBwYXJ0X2hpZ2gpOwotICAgICAgaGlnaF9iaXRzXyA9IDA7Ci0gICAgICBsb3dfYml0c18gLT0gcGFydF9sb3cgPDwgcG93ZXI7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotCi0gIGJvb2wgSXNaZXJvKCkgY29uc3QgewotICAgIHJldHVybiBoaWdoX2JpdHNfID09IDAgJiYgbG93X2JpdHNfID09IDA7Ci0gIH0KLQotICBpbnQgQml0QXQoaW50IHBvc2l0aW9uKSB7Ci0gICAgaWYgKHBvc2l0aW9uID49IDY0KSB7Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihoaWdoX2JpdHNfID4+IChwb3NpdGlvbiAtIDY0KSkgJiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihsb3dfYml0c18gPj4gcG9zaXRpb24pICYgMTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrTWFzazMyID0gMHhGRkZGRkZGRjsKLSAgLy8gVmFsdWUgPT0gKGhpZ2hfYml0c18gPDwgNjQpICsgbG93X2JpdHNfCi0gIHVpbnQ2NF90IGhpZ2hfYml0c187Ci0gIHVpbnQ2NF90IGxvd19iaXRzXzsKLX07Ci0KLQotc3RhdGljIGNvbnN0IGludCBrRG91YmxlU2lnbmlmaWNhbmRTaXplID0gNTM7ICAvLyBJbmNsdWRlcyB0aGUgaGlkZGVuIGJpdC4KLQotCi1zdGF0aWMgdm9pZCBGaWxsRGlnaXRzMzJGaXhlZExlbmd0aCh1aW50MzJfdCBudW1iZXIsIGludCByZXF1ZXN0ZWRfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+IGJ1ZmZlciwgaW50KiBsZW5ndGgpIHsKLSAgZm9yIChpbnQgaSA9IHJlcXVlc3RlZF9sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewotICAgIGJ1ZmZlclsoKmxlbmd0aCkgKyBpXSA9ICcwJyArIG51bWJlciAlIDEwOwotICAgIG51bWJlciAvPSAxMDsKLSAgfQotICAqbGVuZ3RoICs9IHJlcXVlc3RlZF9sZW5ndGg7Ci19Ci0KLQotc3RhdGljIHZvaWQgRmlsbERpZ2l0czMyKHVpbnQzMl90IG51bWJlciwgVmVjdG9yPGNoYXI+IGJ1ZmZlciwgaW50KiBsZW5ndGgpIHsKLSAgaW50IG51bWJlcl9sZW5ndGggPSAwOwotICAvLyBXZSBmaWxsIHRoZSBkaWdpdHMgaW4gcmV2ZXJzZSBvcmRlciBhbmQgZXhjaGFuZ2UgdGhlbSBhZnRlcndhcmRzLgotICB3aGlsZSAobnVtYmVyICE9IDApIHsKLSAgICBpbnQgZGlnaXQgPSBudW1iZXIgJSAxMDsKLSAgICBudW1iZXIgLz0gMTA7Ci0gICAgYnVmZmVyWygqbGVuZ3RoKSArIG51bWJlcl9sZW5ndGhdID0gJzAnICsgZGlnaXQ7Ci0gICAgbnVtYmVyX2xlbmd0aCsrOwotICB9Ci0gIC8vIEV4Y2hhbmdlIHRoZSBkaWdpdHMuCi0gIGludCBpID0gKmxlbmd0aDsKLSAgaW50IGogPSAqbGVuZ3RoICsgbnVtYmVyX2xlbmd0aCAtIDE7Ci0gIHdoaWxlIChpIDwgaikgewotICAgIGNoYXIgdG1wID0gYnVmZmVyW2ldOwotICAgIGJ1ZmZlcltpXSA9IGJ1ZmZlcltqXTsKLSAgICBidWZmZXJbal0gPSB0bXA7Ci0gICAgaSsrOwotICAgIGotLTsKLSAgfQotICAqbGVuZ3RoICs9IG51bWJlcl9sZW5ndGg7Ci19Ci0KLQotc3RhdGljIHZvaWQgRmlsbERpZ2l0czY0Rml4ZWRMZW5ndGgodWludDY0X3QgbnVtYmVyLCBpbnQgcmVxdWVzdGVkX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxjaGFyPiBidWZmZXIsIGludCogbGVuZ3RoKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtUZW43ID0gMTAwMDAwMDA7Ci0gIC8vIEZvciBlZmZpY2llbmN5IGN1dCB0aGUgbnVtYmVyIGludG8gMyB1aW50MzJfdCBwYXJ0cywgYW5kIHByaW50IHRob3NlLgotICB1aW50MzJfdCBwYXJ0MiA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihudW1iZXIgJSBrVGVuNyk7Ci0gIG51bWJlciAvPSBrVGVuNzsKLSAgdWludDMyX3QgcGFydDEgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtYmVyICUga1RlbjcpOwotICB1aW50MzJfdCBwYXJ0MCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihudW1iZXIgLyBrVGVuNyk7Ci0KLSAgRmlsbERpZ2l0czMyRml4ZWRMZW5ndGgocGFydDAsIDMsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgRmlsbERpZ2l0czMyRml4ZWRMZW5ndGgocGFydDEsIDcsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgRmlsbERpZ2l0czMyRml4ZWRMZW5ndGgocGFydDIsIDcsIGJ1ZmZlciwgbGVuZ3RoKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBGaWxsRGlnaXRzNjQodWludDY0X3QgbnVtYmVyLCBWZWN0b3I8Y2hhcj4gYnVmZmVyLCBpbnQqIGxlbmd0aCkgewotICBjb25zdCB1aW50MzJfdCBrVGVuNyA9IDEwMDAwMDAwOwotICAvLyBGb3IgZWZmaWNpZW5jeSBjdXQgdGhlIG51bWJlciBpbnRvIDMgdWludDMyX3QgcGFydHMsIGFuZCBwcmludCB0aG9zZS4KLSAgdWludDMyX3QgcGFydDIgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtYmVyICUga1RlbjcpOwotICBudW1iZXIgLz0ga1Rlbjc7Ci0gIHVpbnQzMl90IHBhcnQxID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bWJlciAlIGtUZW43KTsKLSAgdWludDMyX3QgcGFydDAgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtYmVyIC8ga1RlbjcpOwotCi0gIGlmIChwYXJ0MCAhPSAwKSB7Ci0gICAgRmlsbERpZ2l0czMyKHBhcnQwLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgRmlsbERpZ2l0czMyRml4ZWRMZW5ndGgocGFydDEsIDcsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICBGaWxsRGlnaXRzMzJGaXhlZExlbmd0aChwYXJ0MiwgNywgYnVmZmVyLCBsZW5ndGgpOwotICB9IGVsc2UgaWYgKHBhcnQxICE9IDApIHsKLSAgICBGaWxsRGlnaXRzMzIocGFydDEsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICBGaWxsRGlnaXRzMzJGaXhlZExlbmd0aChwYXJ0MiwgNywgYnVmZmVyLCBsZW5ndGgpOwotICB9IGVsc2UgewotICAgIEZpbGxEaWdpdHMzMihwYXJ0MiwgYnVmZmVyLCBsZW5ndGgpOwotICB9Ci19Ci0KLQotc3RhdGljIHZvaWQgUm91bmRVcChWZWN0b3I8Y2hhcj4gYnVmZmVyLCBpbnQqIGxlbmd0aCwgaW50KiBkZWNpbWFsX3BvaW50KSB7Ci0gIC8vIEFuIGVtcHR5IGJ1ZmZlciByZXByZXNlbnRzIDAuCi0gIGlmICgqbGVuZ3RoID09IDApIHsKLSAgICBidWZmZXJbMF0gPSAnMSc7Ci0gICAgKmRlY2ltYWxfcG9pbnQgPSAxOwotICAgICpsZW5ndGggPSAxOwotICAgIHJldHVybjsKLSAgfQotICAvLyBSb3VuZCB0aGUgbGFzdCBkaWdpdCB1bnRpbCB3ZSBlaXRoZXIgaGF2ZSBhIGRpZ2l0IHRoYXQgd2FzIG5vdCAnOScgb3IgdW50aWwKLSAgLy8gd2UgcmVhY2hlZCB0aGUgZmlyc3QgZGlnaXQuCi0gIGJ1ZmZlclsoKmxlbmd0aCkgLSAxXSsrOwotICBmb3IgKGludCBpID0gKCpsZW5ndGgpIC0gMTsgaSA+IDA7IC0taSkgewotICAgIGlmIChidWZmZXJbaV0gIT0gJzAnICsgMTApIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYnVmZmVyW2ldID0gJzAnOwotICAgIGJ1ZmZlcltpIC0gMV0rKzsKLSAgfQotICAvLyBJZiB0aGUgZmlyc3QgZGlnaXQgaXMgbm93ICcwJyArIDEwLCB3ZSB3b3VsZCBuZWVkIHRvIHNldCBpdCB0byAnMCcgYW5kIGFkZAotICAvLyBhICcxJyBpbiBmcm9udC4gSG93ZXZlciB3ZSByZWFjaCB0aGUgZmlyc3QgZGlnaXQgb25seSBpZiBhbGwgZm9sbG93aW5nCi0gIC8vIGRpZ2l0cyBoYWQgYmVlbiAnOScgYmVmb3JlIHJvdW5kaW5nIHVwLiBOb3cgYWxsIHRyYWlsaW5nIGRpZ2l0cyBhcmUgJzAnIGFuZAotICAvLyB3ZSBzaW1wbHkgc3dpdGNoIHRoZSBmaXJzdCBkaWdpdCB0byAnMScgYW5kIHVwZGF0ZSB0aGUgZGVjaW1hbC1wb2ludAotICAvLyAoaW5kaWNhdGluZyB0aGF0IHRoZSBwb2ludCBpcyBub3cgb25lIGRpZ2l0IHRvIHRoZSByaWdodCkuCi0gIGlmIChidWZmZXJbMF0gPT0gJzAnICsgMTApIHsKLSAgICBidWZmZXJbMF0gPSAnMSc7Ci0gICAgKCpkZWNpbWFsX3BvaW50KSsrOwotICB9Ci19Ci0KLQotLy8gVGhlIGdpdmVuIGZyYWN0aW9uYWxzIG51bWJlciByZXByZXNlbnRzIGEgZml4ZWQtcG9pbnQgbnVtYmVyIHdpdGggYmluYXJ5Ci0vLyBwb2ludCBhdCBiaXQgKC1leHBvbmVudCkuCi0vLyBQcmVjb25kaXRpb25zOgotLy8gICAtMTI4IDw9IGV4cG9uZW50IDw9IDAuCi0vLyAgIDAgPD0gZnJhY3Rpb25hbHMgKiAyXmV4cG9uZW50IDwgMQotLy8gICBUaGUgYnVmZmVyIGhvbGRzIHRoZSByZXN1bHQuCi0vLyBUaGUgZnVuY3Rpb24gd2lsbCByb3VuZCBpdHMgcmVzdWx0LiBEdXJpbmcgdGhlIHJvdW5kaW5nLXByb2Nlc3MgZGlnaXRzIG5vdAotLy8gZ2VuZXJhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgdXBkYXRlZCwgYW5kIHRoZSBkZWNpbWFsLXBvaW50IHZhcmlhYmxlCi0vLyBtaWdodCBiZSB1cGRhdGVkLiBJZiB0aGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyB0aGUgZGlnaXRzIDk5IGFuZCB0aGUgYnVmZmVyCi0vLyBhbHJlYWR5IGNvbnRhaW5lZCAiMTk5IiAodGh1cyB5aWVsZGluZyBhIGJ1ZmZlciBvZiAiMTk5OTkiKSB0aGVuIGEKLS8vIHJvdW5kaW5nLXVwIHdpbGwgY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIHRvICIyMDAwMCIuCi1zdGF0aWMgdm9pZCBGaWxsRnJhY3Rpb25hbHModWludDY0X3QgZnJhY3Rpb25hbHMsIGludCBleHBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhY3Rpb25hbF9jb3VudCwgVmVjdG9yPGNoYXI+IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxlbmd0aCwgaW50KiBkZWNpbWFsX3BvaW50KSB7Ci0gIEFTU0VSVCgtMTI4IDw9IGV4cG9uZW50ICYmIGV4cG9uZW50IDw9IDApOwotICAvLyAnZnJhY3Rpb25hbHMnIGlzIGEgZml4ZWQtcG9pbnQgbnVtYmVyLCB3aXRoIGJpbmFyeSBwb2ludCBhdCBiaXQKLSAgLy8gKC1leHBvbmVudCkuIEluc2lkZSB0aGUgZnVuY3Rpb24gdGhlIG5vbi1jb252ZXJ0ZWQgcmVtYWluZGVyIG9mIGZyYWN0aW9uYWxzCi0gIC8vIGlzIGEgZml4ZWQtcG9pbnQgbnVtYmVyLCB3aXRoIGJpbmFyeSBwb2ludCBhdCBiaXQgJ3BvaW50Jy4KLSAgaWYgKC1leHBvbmVudCA8PSA2NCkgewotICAgIC8vIE9uZSA2NCBiaXQgbnVtYmVyIGlzIHN1ZmZpY2llbnQuCi0gICAgQVNTRVJUKGZyYWN0aW9uYWxzID4+IDU2ID09IDApOwotICAgIGludCBwb2ludCA9IC1leHBvbmVudDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWN0aW9uYWxfY291bnQ7ICsraSkgewotICAgICAgaWYgKGZyYWN0aW9uYWxzID09IDApIGJyZWFrOwotICAgICAgLy8gSW5zdGVhZCBvZiBtdWx0aXBseWluZyBieSAxMCB3ZSBtdWx0aXBseSBieSA1IGFuZCBhZGp1c3QgdGhlIHBvaW50Ci0gICAgICAvLyBsb2NhdGlvbi4gVGhpcyB3YXkgdGhlIGZyYWN0aW9uYWxzIHZhcmlhYmxlIHdpbGwgbm90IG92ZXJmbG93LgotICAgICAgLy8gSW52YXJpYW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3A6IGZyYWN0aW9uYWxzIDwgMl5wb2ludC4KLSAgICAgIC8vIEluaXRpYWxseSB3ZSBoYXZlOiBwb2ludCA8PSA2NCBhbmQgZnJhY3Rpb25hbHMgPCAyXjU2Ci0gICAgICAvLyBBZnRlciBlYWNoIGl0ZXJhdGlvbiB0aGUgcG9pbnQgaXMgZGVjcmVtZW50ZWQgYnkgb25lLgotICAgICAgLy8gTm90ZSB0aGF0IDVeMyA9IDEyNSA8IDEyOCA9IDJeNy4KLSAgICAgIC8vIFRoZXJlZm9yZSB0aHJlZSBpdGVyYXRpb25zIG9mIHRoaXMgbG9vcCB3aWxsIG5vdCBvdmVyZmxvdyBmcmFjdGlvbmFscwotICAgICAgLy8gKGV2ZW4gd2l0aG91dCB0aGUgc3VidHJhY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCBib2R5KS4gQXQgdGhpcwotICAgICAgLy8gdGltZSBwb2ludCB3aWxsIHNhdGlzZnkgcG9pbnQgPD0gNjEgYW5kIHRoZXJlZm9yZSBmcmFjdGlvbmFscyA8IDJecG9pbnQKLSAgICAgIC8vIGFuZCBhbnkgZnVydGhlciBtdWx0aXBsaWNhdGlvbiBvZiBmcmFjdGlvbmFscyBieSA1IHdpbGwgbm90IG92ZXJmbG93LgotICAgICAgZnJhY3Rpb25hbHMgKj0gNTsKLSAgICAgIHBvaW50LS07Ci0gICAgICBpbnQgZGlnaXQgPSBzdGF0aWNfY2FzdDxpbnQ+KGZyYWN0aW9uYWxzID4+IHBvaW50KTsKLSAgICAgIGJ1ZmZlclsqbGVuZ3RoXSA9ICcwJyArIGRpZ2l0OwotICAgICAgKCpsZW5ndGgpKys7Ci0gICAgICBmcmFjdGlvbmFscyAtPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZGlnaXQpIDw8IHBvaW50OwotICAgIH0KLSAgICAvLyBJZiB0aGUgZmlyc3QgYml0IGFmdGVyIHRoZSBwb2ludCBpcyBzZXQgd2UgaGF2ZSB0byByb3VuZCB1cC4KLSAgICBpZiAoKChmcmFjdGlvbmFscyA+PiAocG9pbnQgLSAxKSkgJiAxKSA9PSAxKSB7Ci0gICAgICBSb3VuZFVwKGJ1ZmZlciwgbGVuZ3RoLCBkZWNpbWFsX3BvaW50KTsKLSAgICB9Ci0gIH0gZWxzZSB7ICAvLyBXZSBuZWVkIDEyOCBiaXRzLgotICAgIEFTU0VSVCg2NCA8IC1leHBvbmVudCAmJiAtZXhwb25lbnQgPD0gMTI4KTsKLSAgICBVSW50MTI4IGZyYWN0aW9uYWxzMTI4ID0gVUludDEyOChmcmFjdGlvbmFscywgMCk7Ci0gICAgZnJhY3Rpb25hbHMxMjguU2hpZnQoLWV4cG9uZW50IC0gNjQpOwotICAgIGludCBwb2ludCA9IDEyODsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWN0aW9uYWxfY291bnQ7ICsraSkgewotICAgICAgaWYgKGZyYWN0aW9uYWxzMTI4LklzWmVybygpKSBicmVhazsKLSAgICAgIC8vIEFzIGJlZm9yZTogaW5zdGVhZCBvZiBtdWx0aXBseWluZyBieSAxMCB3ZSBtdWx0aXBseSBieSA1IGFuZCBhZGp1c3QgdGhlCi0gICAgICAvLyBwb2ludCBsb2NhdGlvbi4KLSAgICAgIC8vIFRoaXMgbXVsdGlwbGljYXRpb24gd2lsbCBub3Qgb3ZlcmZsb3cgZm9yIHRoZSBzYW1lIHJlYXNvbnMgYXMgYmVmb3JlLgotICAgICAgZnJhY3Rpb25hbHMxMjguTXVsdGlwbHkoNSk7Ci0gICAgICBwb2ludC0tOwotICAgICAgaW50IGRpZ2l0ID0gZnJhY3Rpb25hbHMxMjguRGl2TW9kUG93ZXJPZjIocG9pbnQpOwotICAgICAgYnVmZmVyWypsZW5ndGhdID0gJzAnICsgZGlnaXQ7Ci0gICAgICAoKmxlbmd0aCkrKzsKLSAgICB9Ci0gICAgaWYgKGZyYWN0aW9uYWxzMTI4LkJpdEF0KHBvaW50IC0gMSkgPT0gMSkgewotICAgICAgUm91bmRVcChidWZmZXIsIGxlbmd0aCwgZGVjaW1hbF9wb2ludCk7Ci0gICAgfQotICB9Ci19Ci0KLQotLy8gUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB6ZXJvcy4KLS8vIElmIGxlYWRpbmcgemVyb3MgYXJlIHJlbW92ZWQgdGhlbiB0aGUgZGVjaW1hbCBwb2ludCBwb3NpdGlvbiBpcyBhZGp1c3RlZC4KLXN0YXRpYyB2b2lkIFRyaW1aZXJvcyhWZWN0b3I8Y2hhcj4gYnVmZmVyLCBpbnQqIGxlbmd0aCwgaW50KiBkZWNpbWFsX3BvaW50KSB7Ci0gIHdoaWxlICgqbGVuZ3RoID4gMCAmJiBidWZmZXJbKCpsZW5ndGgpIC0gMV0gPT0gJzAnKSB7Ci0gICAgKCpsZW5ndGgpLS07Ci0gIH0KLSAgaW50IGZpcnN0X25vbl96ZXJvID0gMDsKLSAgd2hpbGUgKGZpcnN0X25vbl96ZXJvIDwgKmxlbmd0aCAmJiBidWZmZXJbZmlyc3Rfbm9uX3plcm9dID09ICcwJykgewotICAgIGZpcnN0X25vbl96ZXJvKys7Ci0gIH0KLSAgaWYgKGZpcnN0X25vbl96ZXJvICE9IDApIHsKLSAgICBmb3IgKGludCBpID0gZmlyc3Rfbm9uX3plcm87IGkgPCAqbGVuZ3RoOyArK2kpIHsKLSAgICAgIGJ1ZmZlcltpIC0gZmlyc3Rfbm9uX3plcm9dID0gYnVmZmVyW2ldOwotICAgIH0KLSAgICAqbGVuZ3RoIC09IGZpcnN0X25vbl96ZXJvOwotICAgICpkZWNpbWFsX3BvaW50IC09IGZpcnN0X25vbl96ZXJvOwotICB9Ci19Ci0KLQotYm9vbCBGYXN0Rml4ZWREdG9hKGRvdWJsZSB2LAotICAgICAgICAgICAgICAgICAgIGludCBmcmFjdGlvbmFsX2NvdW50LAotICAgICAgICAgICAgICAgICAgIFZlY3RvcjxjaGFyPiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgaW50KiBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgaW50KiBkZWNpbWFsX3BvaW50KSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtNYXhVSW50MzIgPSAweEZGRkZGRkZGOwotICB1aW50NjRfdCBzaWduaWZpY2FuZCA9IERvdWJsZSh2KS5TaWduaWZpY2FuZCgpOwotICBpbnQgZXhwb25lbnQgPSBEb3VibGUodikuRXhwb25lbnQoKTsKLSAgLy8gdiA9IHNpZ25pZmljYW5kICogMl5leHBvbmVudCAod2l0aCBzaWduaWZpY2FuZCBhIDUzYml0IGludGVnZXIpLgotICAvLyBJZiB0aGUgZXhwb25lbnQgaXMgbGFyZ2VyIHRoYW4gMjAgKGkuZS4gd2UgbWF5IGhhdmUgYSA3M2JpdCBudW1iZXIpIHRoZW4gd2UKLSAgLy8gZG9uJ3Qga25vdyBob3cgdG8gY29tcHV0ZSB0aGUgcmVwcmVzZW50YXRpb24uIDJeNzMgfj0gOS41KjEwXjIxLgotICAvLyBJZiBuZWNlc3NhcnkgdGhpcyBsaW1pdCBjb3VsZCBwcm9iYWJseSBiZSBpbmNyZWFzZWQsIGJ1dCB3ZSBkb24ndCBuZWVkCi0gIC8vIG1vcmUuCi0gIGlmIChleHBvbmVudCA+IDIwKSByZXR1cm4gZmFsc2U7Ci0gIGlmIChmcmFjdGlvbmFsX2NvdW50ID4gMjApIHJldHVybiBmYWxzZTsKLSAgKmxlbmd0aCA9IDA7Ci0gIC8vIEF0IG1vc3Qga0RvdWJsZVNpZ25pZmljYW5kU2l6ZSBiaXRzIG9mIHRoZSBzaWduaWZpY2FuZCBhcmUgbm9uLXplcm8uCi0gIC8vIEdpdmVuIGEgNjQgYml0IGludGVnZXIgd2UgaGF2ZSAxMSAwcyBmb2xsb3dlZCBieSA1MyBwb3RlbnRpYWxseSBub24temVybwotICAvLyBiaXRzOiAgMC4uMTEqLi4weHh4Li41MyouLnh4Ci0gIGlmIChleHBvbmVudCArIGtEb3VibGVTaWduaWZpY2FuZFNpemUgPiA2NCkgewotICAgIC8vIFRoZSBleHBvbmVudCBtdXN0IGJlID4gMTEuCi0gICAgLy8KLSAgICAvLyBXZSBrbm93IHRoYXQgdiA9IHNpZ25pZmljYW5kICogMl5leHBvbmVudC4KLSAgICAvLyBBbmQgdGhlIGV4cG9uZW50ID4gMTEuCi0gICAgLy8gV2Ugc2ltcGxpZnkgdGhlIHRhc2sgYnkgZGl2aWRpbmcgdiBieSAxMF4xNy4KLSAgICAvLyBUaGUgcXVvdGllbnQgZGVsaXZlcnMgdGhlIGZpcnN0IGRpZ2l0cywgYW5kIHRoZSByZW1haW5kZXIgZml0cyBpbnRvIGEgNjQKLSAgICAvLyBiaXQgbnVtYmVyLgotICAgIC8vIERpdmlkaW5nIGJ5IDEwXjE3IGlzIGVxdWl2YWxlbnQgdG8gZGl2aWRpbmcgYnkgNV4xNyoyXjE3LgotICAgIGNvbnN0IHVpbnQ2NF90IGtGaXZlMTcgPSBVSU5UNjRfMlBBUlRfQygweEIxLCBBMkJDMkVDNSk7ICAvLyA1XjE3Ci0gICAgdWludDY0X3QgZGl2aXNvciA9IGtGaXZlMTc7Ci0gICAgaW50IGRpdmlzb3JfcG93ZXIgPSAxNzsKLSAgICB1aW50NjRfdCBkaXZpZGVuZCA9IHNpZ25pZmljYW5kOwotICAgIHVpbnQzMl90IHF1b3RpZW50OwotICAgIHVpbnQ2NF90IHJlbWFpbmRlcjsKLSAgICAvLyBMZXQgdiA9IGYgKiAyXmUgd2l0aCBmID09IHNpZ25pZmljYW5kIGFuZCBlID09IGV4cG9uZW50LgotICAgIC8vIFRoZW4gbmVlZCBxIChxdW90aWVudCkgYW5kIHIgKHJlbWFpbmRlcikgYXMgZm9sbG93czoKLSAgICAvLyAgIHYgICAgICAgICAgICA9IHEgKiAxMF4xNyAgICAgICArIHIKLSAgICAvLyAgIGYgKiAyXmUgICAgICA9IHEgKiAxMF4xNyAgICAgICArIHIKLSAgICAvLyAgIGYgKiAyXmUgICAgICA9IHEgKiA1XjE3ICogMl4xNyArIHIKLSAgICAvLyBJZiBlID4gMTcgdGhlbgotICAgIC8vICAgZiAqIDJeKGUtMTcpID0gcSAqIDVeMTcgICAgICAgICsgci8yXjE3Ci0gICAgLy8gZWxzZQotICAgIC8vICAgZiAgPSBxICogNV4xNyAqIDJeKDE3LWUpICsgci8yXmUKLSAgICBpZiAoZXhwb25lbnQgPiBkaXZpc29yX3Bvd2VyKSB7Ci0gICAgICAvLyBXZSBvbmx5IGFsbG93IGV4cG9uZW50cyBvZiB1cCB0byAyMCBhbmQgdGhlcmVmb3JlICgxNyAtIGUpIDw9IDMKLSAgICAgIGRpdmlkZW5kIDw8PSBleHBvbmVudCAtIGRpdmlzb3JfcG93ZXI7Ci0gICAgICBxdW90aWVudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkaXZpZGVuZCAvIGRpdmlzb3IpOwotICAgICAgcmVtYWluZGVyID0gKGRpdmlkZW5kICUgZGl2aXNvcikgPDwgZGl2aXNvcl9wb3dlcjsKLSAgICB9IGVsc2UgewotICAgICAgZGl2aXNvciA8PD0gZGl2aXNvcl9wb3dlciAtIGV4cG9uZW50OwotICAgICAgcXVvdGllbnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGl2aWRlbmQgLyBkaXZpc29yKTsKLSAgICAgIHJlbWFpbmRlciA9IChkaXZpZGVuZCAlIGRpdmlzb3IpIDw8IGV4cG9uZW50OwotICAgIH0KLSAgICBGaWxsRGlnaXRzMzIocXVvdGllbnQsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICBGaWxsRGlnaXRzNjRGaXhlZExlbmd0aChyZW1haW5kZXIsIGRpdmlzb3JfcG93ZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICAqZGVjaW1hbF9wb2ludCA9ICpsZW5ndGg7Ci0gIH0gZWxzZSBpZiAoZXhwb25lbnQgPj0gMCkgewotICAgIC8vIDAgPD0gZXhwb25lbnQgPD0gMTEKLSAgICBzaWduaWZpY2FuZCA8PD0gZXhwb25lbnQ7Ci0gICAgRmlsbERpZ2l0czY0KHNpZ25pZmljYW5kLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgKmRlY2ltYWxfcG9pbnQgPSAqbGVuZ3RoOwotICB9IGVsc2UgaWYgKGV4cG9uZW50ID4gLWtEb3VibGVTaWduaWZpY2FuZFNpemUpIHsKLSAgICAvLyBXZSBoYXZlIHRvIGN1dCB0aGUgbnVtYmVyLgotICAgIHVpbnQ2NF90IGludGVncmFscyA9IHNpZ25pZmljYW5kID4+IC1leHBvbmVudDsKLSAgICB1aW50NjRfdCBmcmFjdGlvbmFscyA9IHNpZ25pZmljYW5kIC0gKGludGVncmFscyA8PCAtZXhwb25lbnQpOwotICAgIGlmIChpbnRlZ3JhbHMgPiBrTWF4VUludDMyKSB7Ci0gICAgICBGaWxsRGlnaXRzNjQoaW50ZWdyYWxzLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpbGxEaWdpdHMzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW50ZWdyYWxzKSwgYnVmZmVyLCBsZW5ndGgpOwotICAgIH0KLSAgICAqZGVjaW1hbF9wb2ludCA9ICpsZW5ndGg7Ci0gICAgRmlsbEZyYWN0aW9uYWxzKGZyYWN0aW9uYWxzLCBleHBvbmVudCwgZnJhY3Rpb25hbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW5ndGgsIGRlY2ltYWxfcG9pbnQpOwotICB9IGVsc2UgaWYgKGV4cG9uZW50IDwgLTEyOCkgewotICAgIC8vIFRoaXMgY29uZmlndXJhdGlvbiAod2l0aCBhdCBtb3N0IDIwIGRpZ2l0cykgbWVhbnMgdGhhdCBhbGwgZGlnaXRzIG11c3QgYmUKLSAgICAvLyAwLgotICAgIEFTU0VSVChmcmFjdGlvbmFsX2NvdW50IDw9IDIwKTsKLSAgICBidWZmZXJbMF0gPSAnXDAnOwotICAgICpsZW5ndGggPSAwOwotICAgICpkZWNpbWFsX3BvaW50ID0gLWZyYWN0aW9uYWxfY291bnQ7Ci0gIH0gZWxzZSB7Ci0gICAgKmRlY2ltYWxfcG9pbnQgPSAwOwotICAgIEZpbGxGcmFjdGlvbmFscyhzaWduaWZpY2FuZCwgZXhwb25lbnQsIGZyYWN0aW9uYWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgbGVuZ3RoLCBkZWNpbWFsX3BvaW50KTsKLSAgfQotICBUcmltWmVyb3MoYnVmZmVyLCBsZW5ndGgsIGRlY2ltYWxfcG9pbnQpOwotICBidWZmZXJbKmxlbmd0aF0gPSAnXDAnOwotICBpZiAoKCpsZW5ndGgpID09IDApIHsKLSAgICAvLyBUaGUgc3RyaW5nIGlzIGVtcHR5IGFuZCB0aGUgZGVjaW1hbF9wb2ludCB0aHVzIGhhcyBubyBpbXBvcnRhbmNlLiBNaW1pY2sKLSAgICAvLyBHYXkncyBkdG9hIGFuZCBhbmQgc2V0IGl0IHRvIC1mcmFjdGlvbmFsX2NvdW50LgotICAgICpkZWNpbWFsX3BvaW50ID0gLWZyYWN0aW9uYWxfY291bnQ7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBkb3VibGVfY29udmVyc2lvbgpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vc3RydG9kLmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vc3RydG9kLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjk4NzY2Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL3N0cnRvZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMCB0aGUgVjggcHJvamVjdCBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0vLyAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLS8vICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotLy8gICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2luY2x1ZGUgInN0cnRvZC5oIgotI2luY2x1ZGUgImJpZ251bS5oIgotI2luY2x1ZGUgImNhY2hlZC1wb3dlcnMuaCIKLSNpbmNsdWRlICJpZWVlLmgiCi0KLW5hbWVzcGFjZSBkb3VibGVfY29udmVyc2lvbiB7Ci0KLS8vIDJeNTMgPSA5MDA3MTk5MjU0NzQwOTkyLgotLy8gQW55IGludGVnZXIgd2l0aCBhdCBtb3N0IDE1IGRlY2ltYWwgZGlnaXRzIHdpbGwgaGVuY2UgZml0IGludG8gYSBkb3VibGUKLS8vICh3aGljaCBoYXMgYSA1M2JpdCBzaWduaWZpY2FuZCkgd2l0aG91dCBsb3NzIG9mIHByZWNpc2lvbi4KLXN0YXRpYyBjb25zdCBpbnQga01heEV4YWN0RG91YmxlSW50ZWdlckRlY2ltYWxEaWdpdHMgPSAxNTsKLS8vIDJeNjQgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNiA+IDEwXjE5Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhVaW50NjREZWNpbWFsRGlnaXRzID0gMTk7Ci0KLS8vIE1heCBkb3VibGU6IDEuNzk3NjkzMTM0ODYyMzE1NyB4IDEwXjMwOAotLy8gTWluIG5vbi16ZXJvIGRvdWJsZTogNC45NDA2NTY0NTg0MTI0NjU0IHggMTBeLTMyNAotLy8gQW55IHggPj0gMTBeMzA5IGlzIGludGVycHJldGVkIGFzICtpbmZpbml0eS4KLS8vIEFueSB4IDw9IDEwXi0zMjQgaXMgaW50ZXJwcmV0ZWQgYXMgMC4KLS8vIE5vdGUgdGhhdCAyLjVlLTMyNCAoZGVzcGl0ZSBiZWluZyBzbWFsbGVyIHRoYW4gdGhlIG1pbiBkb3VibGUpIHdpbGwgYmUgcmVhZAotLy8gYXMgbm9uLXplcm8gKGVxdWFsIHRvIHRoZSBtaW4gbm9uLXplcm8gZG91YmxlKS4KLXN0YXRpYyBjb25zdCBpbnQga01heERlY2ltYWxQb3dlciA9IDMwOTsKLXN0YXRpYyBjb25zdCBpbnQga01pbkRlY2ltYWxQb3dlciA9IC0zMjQ7Ci0KLS8vIDJeNjQgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNgotc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtNYXhVaW50NjQgPSBVSU5UNjRfMlBBUlRfQygweEZGRkZGRkZGLCBGRkZGRkZGRik7Ci0KLQotc3RhdGljIGNvbnN0IGRvdWJsZSBleGFjdF9wb3dlcnNfb2ZfdGVuW10gPSB7Ci0gIDEuMCwgIC8vIDEwXjAKLSAgMTAuMCwKLSAgMTAwLjAsCi0gIDEwMDAuMCwKLSAgMTAwMDAuMCwKLSAgMTAwMDAwLjAsCi0gIDEwMDAwMDAuMCwKLSAgMTAwMDAwMDAuMCwKLSAgMTAwMDAwMDAwLjAsCi0gIDEwMDAwMDAwMDAuMCwKLSAgMTAwMDAwMDAwMDAuMCwgIC8vIDEwXjEwCi0gIDEwMDAwMDAwMDAwMC4wLAotICAxMDAwMDAwMDAwMDAwLjAsCi0gIDEwMDAwMDAwMDAwMDAwLjAsCi0gIDEwMDAwMDAwMDAwMDAwMC4wLAotICAxMDAwMDAwMDAwMDAwMDAwLjAsCi0gIDEwMDAwMDAwMDAwMDAwMDAwLjAsCi0gIDEwMDAwMDAwMDAwMDAwMDAwMC4wLAotICAxMDAwMDAwMDAwMDAwMDAwMDAwLjAsCi0gIDEwMDAwMDAwMDAwMDAwMDAwMDAwLjAsCi0gIDEwMDAwMDAwMDAwMDAwMDAwMDAwMC4wLCAgLy8gMTBeMjAKLSAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wLAotICAvLyAxMF4yMiA9IDB4MjFlMTllMGM5YmFiMjQwMDAwMCA9IDB4ODc4Njc4MzI2ZWFjOSAqIDJeMjIKLSAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMAotfTsKLXN0YXRpYyBjb25zdCBpbnQga0V4YWN0UG93ZXJzT2ZUZW5TaXplID0gQVJSQVlfU0laRShleGFjdF9wb3dlcnNfb2ZfdGVuKTsKLQotLy8gTWF4aW11bSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIGluIHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uLgotLy8gSW4gZmFjdCB0aGUgdmFsdWUgaXMgNzcyIChzZWUgY29udmVyc2lvbnMuY2MpLCBidXQgdG8gZ2l2ZSB1cyBzb21lIG1hcmdpbgotLy8gd2Ugcm91bmQgdXAgdG8gNzgwLgotc3RhdGljIGNvbnN0IGludCBrTWF4U2lnbmlmaWNhbnREZWNpbWFsRGlnaXRzID0gNzgwOwotCi1zdGF0aWMgVmVjdG9yPGNvbnN0IGNoYXI+IFRyaW1MZWFkaW5nWmVyb3MoVmVjdG9yPGNvbnN0IGNoYXI+IGJ1ZmZlcikgewotICBmb3IgKGludCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgaWYgKGJ1ZmZlcltpXSAhPSAnMCcpIHsKLSAgICAgIHJldHVybiBidWZmZXIuU3ViVmVjdG9yKGksIGJ1ZmZlci5sZW5ndGgoKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBWZWN0b3I8Y29uc3QgY2hhcj4oYnVmZmVyLnN0YXJ0KCksIDApOwotfQotCi0KLXN0YXRpYyBWZWN0b3I8Y29uc3QgY2hhcj4gVHJpbVRyYWlsaW5nWmVyb3MoVmVjdG9yPGNvbnN0IGNoYXI+IGJ1ZmZlcikgewotICBmb3IgKGludCBpID0gYnVmZmVyLmxlbmd0aCgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICBpZiAoYnVmZmVyW2ldICE9ICcwJykgewotICAgICAgcmV0dXJuIGJ1ZmZlci5TdWJWZWN0b3IoMCwgaSArIDEpOwotICAgIH0KLSAgfQotICByZXR1cm4gVmVjdG9yPGNvbnN0IGNoYXI+KGJ1ZmZlci5zdGFydCgpLCAwKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBDdXRUb01heFNpZ25pZmljYW50RGlnaXRzKFZlY3Rvcjxjb25zdCBjaGFyPiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBzaWduaWZpY2FudF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNpZ25pZmljYW50X2V4cG9uZW50KSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga01heFNpZ25pZmljYW50RGVjaW1hbERpZ2l0cyAtIDE7ICsraSkgewotICAgIHNpZ25pZmljYW50X2J1ZmZlcltpXSA9IGJ1ZmZlcltpXTsKLSAgfQotICAvLyBUaGUgaW5wdXQgYnVmZmVyIGhhcyBiZWVuIHRyaW1tZWQuIFRoZXJlZm9yZSB0aGUgbGFzdCBkaWdpdCBtdXN0IGJlCi0gIC8vIGRpZmZlcmVudCBmcm9tICcwJy4KLSAgQVNTRVJUKGJ1ZmZlcltidWZmZXIubGVuZ3RoKCkgLSAxXSAhPSAnMCcpOwotICAvLyBTZXQgdGhlIGxhc3QgZGlnaXQgdG8gYmUgbm9uLXplcm8uIFRoaXMgaXMgc3VmZmljaWVudCB0byBndWFyYW50ZWUKLSAgLy8gY29ycmVjdCByb3VuZGluZy4KLSAgc2lnbmlmaWNhbnRfYnVmZmVyW2tNYXhTaWduaWZpY2FudERlY2ltYWxEaWdpdHMgLSAxXSA9ICcxJzsKLSAgKnNpZ25pZmljYW50X2V4cG9uZW50ID0KLSAgICAgIGV4cG9uZW50ICsgKGJ1ZmZlci5sZW5ndGgoKSAtIGtNYXhTaWduaWZpY2FudERlY2ltYWxEaWdpdHMpOwotfQotCi0KLS8vIFRyaW1zIHRoZSBidWZmZXIgYW5kIGN1dHMgaXQgdG8gYXQgbW9zdCBrTWF4U2lnbmlmaWNhbnREZWNpbWFsRGlnaXRzLgotLy8gSWYgcG9zc2libGUgdGhlIGlucHV0LWJ1ZmZlciBpcyByZXVzZWQsIGJ1dCBpZiB0aGUgYnVmZmVyIG5lZWRzIHRvIGJlCi0vLyBtb2RpZmllZCAoZHVlIHRvIGN1dHRpbmcpLCB0aGVuIHRoZSBpbnB1dCBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUKLS8vIGJ1ZmZlcl9jb3B5X3NwYWNlLgotc3RhdGljIHZvaWQgVHJpbUFuZEN1dChWZWN0b3I8Y29uc3QgY2hhcj4gYnVmZmVyLCBpbnQgZXhwb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcl9jb3B5X3NwYWNlLCBpbnQgc3BhY2Vfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPGNvbnN0IGNoYXI+KiB0cmltbWVkLCBpbnQqIHVwZGF0ZWRfZXhwb25lbnQpIHsKLSAgVmVjdG9yPGNvbnN0IGNoYXI+IGxlZnRfdHJpbW1lZCA9IFRyaW1MZWFkaW5nWmVyb3MoYnVmZmVyKTsKLSAgVmVjdG9yPGNvbnN0IGNoYXI+IHJpZ2h0X3RyaW1tZWQgPSBUcmltVHJhaWxpbmdaZXJvcyhsZWZ0X3RyaW1tZWQpOwotICBleHBvbmVudCArPSBsZWZ0X3RyaW1tZWQubGVuZ3RoKCkgLSByaWdodF90cmltbWVkLmxlbmd0aCgpOwotICBpZiAocmlnaHRfdHJpbW1lZC5sZW5ndGgoKSA+IGtNYXhTaWduaWZpY2FudERlY2ltYWxEaWdpdHMpIHsKLSAgICBBU1NFUlQoc3BhY2Vfc2l6ZSA+PSBrTWF4U2lnbmlmaWNhbnREZWNpbWFsRGlnaXRzKTsKLSAgICBDdXRUb01heFNpZ25pZmljYW50RGlnaXRzKHJpZ2h0X3RyaW1tZWQsIGV4cG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2NvcHlfc3BhY2UsIHVwZGF0ZWRfZXhwb25lbnQpOwotICAgICp0cmltbWVkID0gVmVjdG9yPGNvbnN0IGNoYXI+KGJ1ZmZlcl9jb3B5X3NwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heFNpZ25pZmljYW50RGVjaW1hbERpZ2l0cyk7Ci0gIH0gZWxzZSB7Ci0gICAgKnRyaW1tZWQgPSByaWdodF90cmltbWVkOwotICAgICp1cGRhdGVkX2V4cG9uZW50ID0gZXhwb25lbnQ7Ci0gIH0KLX0KLQotCi0vLyBSZWFkcyBkaWdpdHMgZnJvbSB0aGUgYnVmZmVyIGFuZCBjb252ZXJ0cyB0aGVtIHRvIGEgdWludDY0LgotLy8gUmVhZHMgaW4gYXMgbWFueSBkaWdpdHMgYXMgZml0IGludG8gYSB1aW50NjQuCi0vLyBXaGVuIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggIjE4NDQ2NzQ0MDczNzA5NTUxNjEiIG5vIGZ1cnRoZXIgZGlnaXQgaXMgcmVhZC4KLS8vIFNpbmNlIDJeNjQgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNiBpdCB3b3VsZCBzdGlsbCBiZSBwb3NzaWJsZSByZWFkIGFub3RoZXIKLS8vIGRpZ2l0IGlmIGl0IHdhcyBsZXNzIG9yIGVxdWFsIHRoYW4gNiwgYnV0IHRoaXMgd291bGQgY29tcGxpY2F0ZSB0aGUgY29kZS4KLXN0YXRpYyB1aW50NjRfdCBSZWFkVWludDY0KFZlY3Rvcjxjb25zdCBjaGFyPiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG51bWJlcl9vZl9yZWFkX2RpZ2l0cykgewotICB1aW50NjRfdCByZXN1bHQgPSAwOwotICBpbnQgaSA9IDA7Ci0gIHdoaWxlIChpIDwgYnVmZmVyLmxlbmd0aCgpICYmIHJlc3VsdCA8PSAoa01heFVpbnQ2NCAvIDEwIC0gMSkpIHsKLSAgICBpbnQgZGlnaXQgPSBidWZmZXJbaSsrXSAtICcwJzsKLSAgICBBU1NFUlQoMCA8PSBkaWdpdCAmJiBkaWdpdCA8PSA5KTsKLSAgICByZXN1bHQgPSAxMCAqIHJlc3VsdCArIGRpZ2l0OwotICB9Ci0gICpudW1iZXJfb2ZfcmVhZF9kaWdpdHMgPSBpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8vIFJlYWRzIGEgRGl5RnAgZnJvbSB0aGUgYnVmZmVyLgotLy8gVGhlIHJldHVybmVkIERpeUZwIGlzIG5vdCBuZWNlc3NhcmlseSBub3JtYWxpemVkLgotLy8gSWYgcmVtYWluaW5nX2RlY2ltYWxzIGlzIHplcm8gdGhlbiB0aGUgcmV0dXJuZWQgRGl5RnAgaXMgYWNjdXJhdGUuCi0vLyBPdGhlcndpc2UgaXQgaGFzIGJlZW4gcm91bmRlZCBhbmQgaGFzIGVycm9yIG9mIGF0IG1vc3QgMS8yIHVscC4KLXN0YXRpYyB2b2lkIFJlYWREaXlGcChWZWN0b3I8Y29uc3QgY2hhcj4gYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIERpeUZwKiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50KiByZW1haW5pbmdfZGVjaW1hbHMpIHsKLSAgaW50IHJlYWRfZGlnaXRzOwotICB1aW50NjRfdCBzaWduaWZpY2FuZCA9IFJlYWRVaW50NjQoYnVmZmVyLCAmcmVhZF9kaWdpdHMpOwotICBpZiAoYnVmZmVyLmxlbmd0aCgpID09IHJlYWRfZGlnaXRzKSB7Ci0gICAgKnJlc3VsdCA9IERpeUZwKHNpZ25pZmljYW5kLCAwKTsKLSAgICAqcmVtYWluaW5nX2RlY2ltYWxzID0gMDsKLSAgfSBlbHNlIHsKLSAgICAvLyBSb3VuZCB0aGUgc2lnbmlmaWNhbmQuCi0gICAgaWYgKGJ1ZmZlcltyZWFkX2RpZ2l0c10gPj0gJzUnKSB7Ci0gICAgICBzaWduaWZpY2FuZCsrOwotICAgIH0KLSAgICAvLyBDb21wdXRlIHRoZSBiaW5hcnkgZXhwb25lbnQuCi0gICAgaW50IGV4cG9uZW50ID0gMDsKLSAgICAqcmVzdWx0ID0gRGl5RnAoc2lnbmlmaWNhbmQsIGV4cG9uZW50KTsKLSAgICAqcmVtYWluaW5nX2RlY2ltYWxzID0gYnVmZmVyLmxlbmd0aCgpIC0gcmVhZF9kaWdpdHM7Ci0gIH0KLX0KLQotCi1zdGF0aWMgYm9vbCBEb3VibGVTdHJ0b2QoVmVjdG9yPGNvbnN0IGNoYXI+IHRyaW1tZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmVzdWx0KSB7Ci0jaWYgIWRlZmluZWQoRE9VQkxFX0NPTlZFUlNJT05fQ09SUkVDVF9ET1VCTEVfT1BFUkFUSU9OUykKLSAgLy8gT24geDg2IHRoZSBmbG9hdGluZy1wb2ludCBzdGFjayBjYW4gYmUgNjQgb3IgODAgYml0cyB3aWRlLiBJZiBpdCBpcwotICAvLyA4MCBiaXRzIHdpZGUgKGFzIGlzIHRoZSBjYXNlIG9uIExpbnV4KSB0aGVuIGRvdWJsZS1yb3VuZGluZyBvY2N1cnMgYW5kIHRoZQotICAvLyByZXN1bHQgaXMgbm90IGFjY3VyYXRlLgotICAvLyBXZSBrbm93IHRoYXQgV2luZG93czMyIHVzZXMgNjQgYml0cyBhbmQgaXMgdGhlcmVmb3JlIGFjY3VyYXRlLgotICAvLyBOb3RlIHRoYXQgdGhlIEFSTSBzaW11bGF0b3IgaXMgY29tcGlsZWQgZm9yIDMyYml0cy4gSXQgdGhlcmVmb3JlIGV4aGliaXRzCi0gIC8vIHRoZSBzYW1lIHByb2JsZW0uCi0gIHJldHVybiBmYWxzZTsKLSNlbmRpZgotICBpZiAodHJpbW1lZC5sZW5ndGgoKSA8PSBrTWF4RXhhY3REb3VibGVJbnRlZ2VyRGVjaW1hbERpZ2l0cykgewotICAgIGludCByZWFkX2RpZ2l0czsKLSAgICAvLyBUaGUgdHJpbW1lZCBpbnB1dCBmaXRzIGludG8gYSBkb3VibGUuCi0gICAgLy8gSWYgdGhlIDEwXmV4cG9uZW50IChyZXNwLiAxMF4tZXhwb25lbnQpIGZpdHMgaW50byBhIGRvdWJsZSB0b28gdGhlbiB3ZQotICAgIC8vIGNhbiBjb21wdXRlIHRoZSByZXN1bHQtZG91YmxlIHNpbXBseSBieSBtdWx0aXBseWluZyAocmVzcC4gZGl2aWRpbmcpIHRoZQotICAgIC8vIHR3byBudW1iZXJzLgotICAgIC8vIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBJRUVFIGd1YXJhbnRlZXMgdGhhdCBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zCi0gICAgLy8gcmV0dXJuIHRoZSBiZXN0IHBvc3NpYmxlIGFwcHJveGltYXRpb24uCi0gICAgaWYgKGV4cG9uZW50IDwgMCAmJiAtZXhwb25lbnQgPCBrRXhhY3RQb3dlcnNPZlRlblNpemUpIHsKLSAgICAgIC8vIDEwXi1leHBvbmVudCBmaXRzIGludG8gYSBkb3VibGUuCi0gICAgICAqcmVzdWx0ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihSZWFkVWludDY0KHRyaW1tZWQsICZyZWFkX2RpZ2l0cykpOwotICAgICAgQVNTRVJUKHJlYWRfZGlnaXRzID09IHRyaW1tZWQubGVuZ3RoKCkpOwotICAgICAgKnJlc3VsdCAvPSBleGFjdF9wb3dlcnNfb2ZfdGVuWy1leHBvbmVudF07Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKDAgPD0gZXhwb25lbnQgJiYgZXhwb25lbnQgPCBrRXhhY3RQb3dlcnNPZlRlblNpemUpIHsKLSAgICAgIC8vIDEwXmV4cG9uZW50IGZpdHMgaW50byBhIGRvdWJsZS4KLSAgICAgICpyZXN1bHQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KFJlYWRVaW50NjQodHJpbW1lZCwgJnJlYWRfZGlnaXRzKSk7Ci0gICAgICBBU1NFUlQocmVhZF9kaWdpdHMgPT0gdHJpbW1lZC5sZW5ndGgoKSk7Ci0gICAgICAqcmVzdWx0ICo9IGV4YWN0X3Bvd2Vyc19vZl90ZW5bZXhwb25lbnRdOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGludCByZW1haW5pbmdfZGlnaXRzID0KLSAgICAgICAga01heEV4YWN0RG91YmxlSW50ZWdlckRlY2ltYWxEaWdpdHMgLSB0cmltbWVkLmxlbmd0aCgpOwotICAgIGlmICgoMCA8PSBleHBvbmVudCkgJiYKLSAgICAgICAgKGV4cG9uZW50IC0gcmVtYWluaW5nX2RpZ2l0cyA8IGtFeGFjdFBvd2Vyc09mVGVuU2l6ZSkpIHsKLSAgICAgIC8vIFRoZSB0cmltbWVkIHN0cmluZyB3YXMgc2hvcnQgYW5kIHdlIGNhbiBtdWx0aXBseSBpdCB3aXRoCi0gICAgICAvLyAxMF5yZW1haW5pbmdfZGlnaXRzLiBBcyBhIHJlc3VsdCB0aGUgcmVtYWluaW5nIGV4cG9uZW50IG5vdyBmaXRzCi0gICAgICAvLyBpbnRvIGEgZG91YmxlIHRvby4KLSAgICAgICpyZXN1bHQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KFJlYWRVaW50NjQodHJpbW1lZCwgJnJlYWRfZGlnaXRzKSk7Ci0gICAgICBBU1NFUlQocmVhZF9kaWdpdHMgPT0gdHJpbW1lZC5sZW5ndGgoKSk7Ci0gICAgICAqcmVzdWx0ICo9IGV4YWN0X3Bvd2Vyc19vZl90ZW5bcmVtYWluaW5nX2RpZ2l0c107Ci0gICAgICAqcmVzdWx0ICo9IGV4YWN0X3Bvd2Vyc19vZl90ZW5bZXhwb25lbnQgLSByZW1haW5pbmdfZGlnaXRzXTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLy8gUmV0dXJucyAxMF5leHBvbmVudCBhcyBhbiBleGFjdCBEaXlGcC4KLS8vIFRoZSBnaXZlbiBleHBvbmVudCBtdXN0IGJlIGluIHRoZSByYW5nZSBbMTsga0RlY2ltYWxFeHBvbmVudERpc3RhbmNlWy4KLXN0YXRpYyBEaXlGcCBBZGp1c3RtZW50UG93ZXJPZlRlbihpbnQgZXhwb25lbnQpIHsKLSAgQVNTRVJUKDAgPCBleHBvbmVudCk7Ci0gIEFTU0VSVChleHBvbmVudCA8IFBvd2Vyc09mVGVuQ2FjaGU6OmtEZWNpbWFsRXhwb25lbnREaXN0YW5jZSk7Ci0gIC8vIFNpbXBseSBoYXJkY29kZSB0aGUgcmVtYWluaW5nIHBvd2VycyBmb3IgdGhlIGdpdmVuIGRlY2ltYWwgZXhwb25lbnQKLSAgLy8gZGlzdGFuY2UuCi0gIEFTU0VSVChQb3dlcnNPZlRlbkNhY2hlOjprRGVjaW1hbEV4cG9uZW50RGlzdGFuY2UgPT0gOCk7Ci0gIHN3aXRjaCAoZXhwb25lbnQpIHsKLSAgICBjYXNlIDE6IHJldHVybiBEaXlGcChVSU5UNjRfMlBBUlRfQygweGEwMDAwMDAwLCAwMDAwMDAwMCksIC02MCk7Ci0gICAgY2FzZSAyOiByZXR1cm4gRGl5RnAoVUlOVDY0XzJQQVJUX0MoMHhjODAwMDAwMCwgMDAwMDAwMDApLCAtNTcpOwotICAgIGNhc2UgMzogcmV0dXJuIERpeUZwKFVJTlQ2NF8yUEFSVF9DKDB4ZmEwMDAwMDAsIDAwMDAwMDAwKSwgLTU0KTsKLSAgICBjYXNlIDQ6IHJldHVybiBEaXlGcChVSU5UNjRfMlBBUlRfQygweDljNDAwMDAwLCAwMDAwMDAwMCksIC01MCk7Ci0gICAgY2FzZSA1OiByZXR1cm4gRGl5RnAoVUlOVDY0XzJQQVJUX0MoMHhjMzUwMDAwMCwgMDAwMDAwMDApLCAtNDcpOwotICAgIGNhc2UgNjogcmV0dXJuIERpeUZwKFVJTlQ2NF8yUEFSVF9DKDB4ZjQyNDAwMDAsIDAwMDAwMDAwKSwgLTQ0KTsKLSAgICBjYXNlIDc6IHJldHVybiBEaXlGcChVSU5UNjRfMlBBUlRfQygweDk4OTY4MDAwLCAwMDAwMDAwMCksIC00MCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFVOUkVBQ0hBQkxFKCk7Ci0gICAgICByZXR1cm4gRGl5RnAoMCwgMCk7Ci0gIH0KLX0KLQotCi0vLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHRoZW4gdGhlIHJlc3VsdCBpcyB0aGUgY29ycmVjdCBkb3VibGUuCi0vLyBPdGhlcndpc2UgaXQgaXMgZWl0aGVyIHRoZSBjb3JyZWN0IGRvdWJsZSBvciB0aGUgZG91YmxlIHRoYXQgaXMganVzdCBiZWxvdwotLy8gdGhlIGNvcnJlY3QgZG91YmxlLgotc3RhdGljIGJvb2wgRGl5RnBTdHJ0b2QoVmVjdG9yPGNvbnN0IGNoYXI+IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmVzdWx0KSB7Ci0gIERpeUZwIGlucHV0OwotICBpbnQgcmVtYWluaW5nX2RlY2ltYWxzOwotICBSZWFkRGl5RnAoYnVmZmVyLCAmaW5wdXQsICZyZW1haW5pbmdfZGVjaW1hbHMpOwotICAvLyBTaW5jZSB3ZSBtYXkgaGF2ZSBkcm9wcGVkIHNvbWUgZGlnaXRzIHRoZSBpbnB1dCBpcyBub3QgYWNjdXJhdGUuCi0gIC8vIElmIHJlbWFpbmluZ19kZWNpbWFscyBpcyBkaWZmZXJlbnQgdGhhbiAwIHRoYW4gdGhlIGVycm9yIGlzIGF0IG1vc3QKLSAgLy8gLjUgdWxwICh1bml0IGluIHRoZSBsYXN0IHBsYWNlKS4KLSAgLy8gV2UgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggZnJhY3Rpb25zIGFuZCB0aGVyZWZvcmUga2VlcCBhIGNvbW1vbgotICAvLyBkZW5vbWluYXRvci4KLSAgY29uc3QgaW50IGtEZW5vbWluYXRvckxvZyA9IDM7Ci0gIGNvbnN0IGludCBrRGVub21pbmF0b3IgPSAxIDw8IGtEZW5vbWluYXRvckxvZzsKLSAgLy8gTW92ZSB0aGUgcmVtYWluaW5nIGRlY2ltYWxzIGludG8gdGhlIGV4cG9uZW50LgotICBleHBvbmVudCArPSByZW1haW5pbmdfZGVjaW1hbHM7Ci0gIGludCBlcnJvciA9IChyZW1haW5pbmdfZGVjaW1hbHMgPT0gMCA/IDAgOiBrRGVub21pbmF0b3IgLyAyKTsKLQotICBpbnQgb2xkX2UgPSBpbnB1dC5lKCk7Ci0gIGlucHV0Lk5vcm1hbGl6ZSgpOwotICBlcnJvciA8PD0gb2xkX2UgLSBpbnB1dC5lKCk7Ci0KLSAgQVNTRVJUKGV4cG9uZW50IDw9IFBvd2Vyc09mVGVuQ2FjaGU6OmtNYXhEZWNpbWFsRXhwb25lbnQpOwotICBpZiAoZXhwb25lbnQgPCBQb3dlcnNPZlRlbkNhY2hlOjprTWluRGVjaW1hbEV4cG9uZW50KSB7Ci0gICAgKnJlc3VsdCA9IDAuMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBEaXlGcCBjYWNoZWRfcG93ZXI7Ci0gIGludCBjYWNoZWRfZGVjaW1hbF9leHBvbmVudDsKLSAgUG93ZXJzT2ZUZW5DYWNoZTo6R2V0Q2FjaGVkUG93ZXJGb3JEZWNpbWFsRXhwb25lbnQoZXhwb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWNoZWRfcG93ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWNoZWRfZGVjaW1hbF9leHBvbmVudCk7Ci0KLSAgaWYgKGNhY2hlZF9kZWNpbWFsX2V4cG9uZW50ICE9IGV4cG9uZW50KSB7Ci0gICAgaW50IGFkanVzdG1lbnRfZXhwb25lbnQgPSBleHBvbmVudCAtIGNhY2hlZF9kZWNpbWFsX2V4cG9uZW50OwotICAgIERpeUZwIGFkanVzdG1lbnRfcG93ZXIgPSBBZGp1c3RtZW50UG93ZXJPZlRlbihhZGp1c3RtZW50X2V4cG9uZW50KTsKLSAgICBpbnB1dC5NdWx0aXBseShhZGp1c3RtZW50X3Bvd2VyKTsKLSAgICBpZiAoa01heFVpbnQ2NERlY2ltYWxEaWdpdHMgLSBidWZmZXIubGVuZ3RoKCkgPj0gYWRqdXN0bWVudF9leHBvbmVudCkgewotICAgICAgLy8gVGhlIHByb2R1Y3Qgb2YgaW5wdXQgd2l0aCB0aGUgYWRqdXN0bWVudCBwb3dlciBmaXRzIGludG8gYSA2NCBiaXQKLSAgICAgIC8vIGludGVnZXIuCi0gICAgICBBU1NFUlQoRGl5RnA6OmtTaWduaWZpY2FuZFNpemUgPT0gNjQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUaGUgYWRqdXN0bWVudCBwb3dlciBpcyBleGFjdC4gVGhlcmUgaXMgaGVuY2Ugb25seSBhbiBlcnJvciBvZiAwLjUuCi0gICAgICBlcnJvciArPSBrRGVub21pbmF0b3IgLyAyOwotICAgIH0KLSAgfQotCi0gIGlucHV0Lk11bHRpcGx5KGNhY2hlZF9wb3dlcik7Ci0gIC8vIFRoZSBlcnJvciBpbnRyb2R1Y2VkIGJ5IGEgbXVsdGlwbGljYXRpb24gb2YgYSpiIGVxdWFscwotICAvLyAgIGVycm9yX2EgKyBlcnJvcl9iICsgZXJyb3JfYSplcnJvcl9iLzJeNjQgKyAwLjUKLSAgLy8gU3Vic3RpdHV0aW5nIGEgd2l0aCAnaW5wdXQnIGFuZCBiIHdpdGggJ2NhY2hlZF9wb3dlcicgd2UgaGF2ZQotICAvLyAgIGVycm9yX2IgPSAwLjUgIChhbGwgY2FjaGVkIHBvd2VycyBoYXZlIGFuIGVycm9yIG9mIGxlc3MgdGhhbiAwLjUgdWxwKSwKLSAgLy8gICBlcnJvcl9hYiA9IDAgb3IgMSAvIGtEZW5vbWluYXRvciA+IGVycm9yX2EqZXJyb3JfYi8gMl42NAotICBpbnQgZXJyb3JfYiA9IGtEZW5vbWluYXRvciAvIDI7Ci0gIGludCBlcnJvcl9hYiA9IChlcnJvciA9PSAwID8gMCA6IDEpOyAgLy8gV2Ugcm91bmQgdXAgdG8gMS4KLSAgaW50IGZpeGVkX2Vycm9yID0ga0Rlbm9taW5hdG9yIC8gMjsKLSAgZXJyb3IgKz0gZXJyb3JfYiArIGVycm9yX2FiICsgZml4ZWRfZXJyb3I7Ci0KLSAgb2xkX2UgPSBpbnB1dC5lKCk7Ci0gIGlucHV0Lk5vcm1hbGl6ZSgpOwotICBlcnJvciA8PD0gb2xkX2UgLSBpbnB1dC5lKCk7Ci0KLSAgLy8gU2VlIGlmIHRoZSBkb3VibGUncyBzaWduaWZpY2FuZCBjaGFuZ2VzIGlmIHdlIGFkZC9zdWJ0cmFjdCB0aGUgZXJyb3IuCi0gIGludCBvcmRlcl9vZl9tYWduaXR1ZGUgPSBEaXlGcDo6a1NpZ25pZmljYW5kU2l6ZSArIGlucHV0LmUoKTsKLSAgaW50IGVmZmVjdGl2ZV9zaWduaWZpY2FuZF9zaXplID0KLSAgICAgIERvdWJsZTo6U2lnbmlmaWNhbmRTaXplRm9yT3JkZXJPZk1hZ25pdHVkZShvcmRlcl9vZl9tYWduaXR1ZGUpOwotICBpbnQgcHJlY2lzaW9uX2RpZ2l0c19jb3VudCA9Ci0gICAgICBEaXlGcDo6a1NpZ25pZmljYW5kU2l6ZSAtIGVmZmVjdGl2ZV9zaWduaWZpY2FuZF9zaXplOwotICBpZiAocHJlY2lzaW9uX2RpZ2l0c19jb3VudCArIGtEZW5vbWluYXRvckxvZyA+PSBEaXlGcDo6a1NpZ25pZmljYW5kU2l6ZSkgewotICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGZvciB2ZXJ5IHNtYWxsIGRlbm9ybWFscy4gSW4gdGhpcyBjYXNlIHRoZQotICAgIC8vIGhhbGYtd2F5IG11bHRpcGxpZWQgYnkgdGhlIGRlbm9taW5hdG9yIGV4Y2VlZHMgdGhlIHJhbmdlIG9mIGFuIHVpbnQ2NC4KLSAgICAvLyBTaW1wbHkgc2hpZnQgZXZlcnl0aGluZyB0byB0aGUgcmlnaHQuCi0gICAgaW50IHNoaWZ0X2Ftb3VudCA9IChwcmVjaXNpb25fZGlnaXRzX2NvdW50ICsga0Rlbm9taW5hdG9yTG9nKSAtCi0gICAgICAgIERpeUZwOjprU2lnbmlmaWNhbmRTaXplICsgMTsKLSAgICBpbnB1dC5zZXRfZihpbnB1dC5mKCkgPj4gc2hpZnRfYW1vdW50KTsKLSAgICBpbnB1dC5zZXRfZShpbnB1dC5lKCkgKyBzaGlmdF9hbW91bnQpOwotICAgIC8vIFdlIGFkZCAxIGZvciB0aGUgbG9zdCBwcmVjaXNpb24gb2YgZXJyb3IsIGFuZCBrRGVub21pbmF0b3IgZm9yCi0gICAgLy8gdGhlIGxvc3QgcHJlY2lzaW9uIG9mIGlucHV0LmYoKS4KLSAgICBlcnJvciA9IChlcnJvciA+PiBzaGlmdF9hbW91bnQpICsgMSArIGtEZW5vbWluYXRvcjsKLSAgICBwcmVjaXNpb25fZGlnaXRzX2NvdW50IC09IHNoaWZ0X2Ftb3VudDsKLSAgfQotICAvLyBXZSB1c2UgdWludDY0X3RzIG5vdy4gVGhpcyBvbmx5IHdvcmtzIGlmIHRoZSBEaXlGcCB1c2VzIHVpbnQ2NF90cyB0b28uCi0gIEFTU0VSVChEaXlGcDo6a1NpZ25pZmljYW5kU2l6ZSA9PSA2NCk7Ci0gIEFTU0VSVChwcmVjaXNpb25fZGlnaXRzX2NvdW50IDwgNjQpOwotICB1aW50NjRfdCBvbmU2NCA9IDE7Ci0gIHVpbnQ2NF90IHByZWNpc2lvbl9iaXRzX21hc2sgPSAob25lNjQgPDwgcHJlY2lzaW9uX2RpZ2l0c19jb3VudCkgLSAxOwotICB1aW50NjRfdCBwcmVjaXNpb25fYml0cyA9IGlucHV0LmYoKSAmIHByZWNpc2lvbl9iaXRzX21hc2s7Ci0gIHVpbnQ2NF90IGhhbGZfd2F5ID0gb25lNjQgPDwgKHByZWNpc2lvbl9kaWdpdHNfY291bnQgLSAxKTsKLSAgcHJlY2lzaW9uX2JpdHMgKj0ga0Rlbm9taW5hdG9yOwotICBoYWxmX3dheSAqPSBrRGVub21pbmF0b3I7Ci0gIERpeUZwIHJvdW5kZWRfaW5wdXQoaW5wdXQuZigpID4+IHByZWNpc2lvbl9kaWdpdHNfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZSgpICsgcHJlY2lzaW9uX2RpZ2l0c19jb3VudCk7Ci0gIGlmIChwcmVjaXNpb25fYml0cyA+PSBoYWxmX3dheSArIGVycm9yKSB7Ci0gICAgcm91bmRlZF9pbnB1dC5zZXRfZihyb3VuZGVkX2lucHV0LmYoKSArIDEpOwotICB9Ci0gIC8vIElmIHRoZSBsYXN0X2JpdHMgYXJlIHRvbyBjbG9zZSB0byB0aGUgaGFsZi13YXkgY2FzZSB0aGFuIHdlIGFyZSB0b28KLSAgLy8gaW5hY2N1cmF0ZSBhbmQgcm91bmQgZG93bi4gSW4gdGhpcyBjYXNlIHdlIHJldHVybiBmYWxzZSBzbyB0aGF0IHdlIGNhbgotICAvLyBmYWxsIGJhY2sgdG8gYSBtb3JlIHByZWNpc2UgYWxnb3JpdGhtLgotCi0gICpyZXN1bHQgPSBEb3VibGUocm91bmRlZF9pbnB1dCkudmFsdWUoKTsKLSAgaWYgKGhhbGZfd2F5IC0gZXJyb3IgPCBwcmVjaXNpb25fYml0cyAmJiBwcmVjaXNpb25fYml0cyA8IGhhbGZfd2F5ICsgZXJyb3IpIHsKLSAgICAvLyBUb28gaW1wcmVjaXNlLiBUaGUgY2FsbGVyIHdpbGwgaGF2ZSB0byBmYWxsIGJhY2sgdG8gYSBzbG93ZXIgdmVyc2lvbi4KLSAgICAvLyBIb3dldmVyIHRoZSByZXR1cm5lZCBudW1iZXIgaXMgZ3VhcmFudGVlZCB0byBiZSBlaXRoZXIgdGhlIGNvcnJlY3QKLSAgICAvLyBkb3VibGUsIG9yIHRoZSBuZXh0LWxvd2VyIGRvdWJsZS4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotCi0vLyBSZXR1cm5zCi0vLyAgIC0gLTEgaWYgYnVmZmVyKjEwXmV4cG9uZW50IDwgZGl5X2ZwLgotLy8gICAtICAwIGlmIGJ1ZmZlcioxMF5leHBvbmVudCA9PSBkaXlfZnAuCi0vLyAgIC0gKzEgaWYgYnVmZmVyKjEwXmV4cG9uZW50ID4gZGl5X2ZwLgotLy8gUHJlY29uZGl0aW9uczoKLS8vICAgYnVmZmVyLmxlbmd0aCgpICsgZXhwb25lbnQgPD0ga01heERlY2ltYWxQb3dlciArIDEKLS8vICAgYnVmZmVyLmxlbmd0aCgpICsgZXhwb25lbnQgPiBrTWluRGVjaW1hbFBvd2VyCi0vLyAgIGJ1ZmZlci5sZW5ndGgoKSA8PSBrTWF4RGVjaW1hbFNpZ25pZmljYW50RGlnaXRzCi1zdGF0aWMgaW50IENvbXBhcmVCdWZmZXJXaXRoRGl5RnAoVmVjdG9yPGNvbnN0IGNoYXI+IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGl5RnAgZGl5X2ZwKSB7Ci0gIEFTU0VSVChidWZmZXIubGVuZ3RoKCkgKyBleHBvbmVudCA8PSBrTWF4RGVjaW1hbFBvd2VyICsgMSk7Ci0gIEFTU0VSVChidWZmZXIubGVuZ3RoKCkgKyBleHBvbmVudCA+IGtNaW5EZWNpbWFsUG93ZXIpOwotICBBU1NFUlQoYnVmZmVyLmxlbmd0aCgpIDw9IGtNYXhTaWduaWZpY2FudERlY2ltYWxEaWdpdHMpOwotICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgQmlnbnVtIHdpbGwgYmUgYWJsZSB0byBob2xkIGFsbCBvdXIgbnVtYmVycy4KLSAgLy8gT3VyIEJpZ251bSBpbXBsZW1lbnRhdGlvbiBoYXMgYSBzZXBhcmF0ZSBmaWVsZCBmb3IgZXhwb25lbnRzLiBTaGlmdHMgd2lsbAotICAvLyBjb25zdW1lIGF0IG1vc3Qgb25lIGJpZ2l0ICg8IDY0IGJpdHMpLgotICAvLyBsbigxMCkgPT0gMy4zMjE5Li4uCi0gIEFTU0VSVCgoKGtNYXhEZWNpbWFsUG93ZXIgKyAxKSAqIDMzMyAvIDEwMCkgPCBCaWdudW06OmtNYXhTaWduaWZpY2FudEJpdHMpOwotICBCaWdudW0gYnVmZmVyX2JpZ251bTsKLSAgQmlnbnVtIGRpeV9mcF9iaWdudW07Ci0gIGJ1ZmZlcl9iaWdudW0uQXNzaWduRGVjaW1hbFN0cmluZyhidWZmZXIpOwotICBkaXlfZnBfYmlnbnVtLkFzc2lnblVJbnQ2NChkaXlfZnAuZigpKTsKLSAgaWYgKGV4cG9uZW50ID49IDApIHsKLSAgICBidWZmZXJfYmlnbnVtLk11bHRpcGx5QnlQb3dlck9mVGVuKGV4cG9uZW50KTsKLSAgfSBlbHNlIHsKLSAgICBkaXlfZnBfYmlnbnVtLk11bHRpcGx5QnlQb3dlck9mVGVuKC1leHBvbmVudCk7Ci0gIH0KLSAgaWYgKGRpeV9mcC5lKCkgPiAwKSB7Ci0gICAgZGl5X2ZwX2JpZ251bS5TaGlmdExlZnQoZGl5X2ZwLmUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgYnVmZmVyX2JpZ251bS5TaGlmdExlZnQoLWRpeV9mcC5lKCkpOwotICB9Ci0gIHJldHVybiBCaWdudW06OkNvbXBhcmUoYnVmZmVyX2JpZ251bSwgZGl5X2ZwX2JpZ251bSk7Ci19Ci0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBndWVzcyBpcyB0aGUgY29ycmVjdCBkb3VibGUuCi0vLyBSZXR1cm5zIGZhbHNlLCB3aGVuIGd1ZXNzIGlzIGVpdGhlciBjb3JyZWN0IG9yIHRoZSBuZXh0LWxvd2VyIGRvdWJsZS4KLXN0YXRpYyBib29sIENvbXB1dGVHdWVzcyhWZWN0b3I8Y29uc3QgY2hhcj4gdHJpbW1lZCwgaW50IGV4cG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZ3Vlc3MpIHsKLSAgaWYgKHRyaW1tZWQubGVuZ3RoKCkgPT0gMCkgewotICAgICpndWVzcyA9IDAuMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoZXhwb25lbnQgKyB0cmltbWVkLmxlbmd0aCgpIC0gMSA+PSBrTWF4RGVjaW1hbFBvd2VyKSB7Ci0gICAgKmd1ZXNzID0gRG91YmxlOjpJbmZpbml0eSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChleHBvbmVudCArIHRyaW1tZWQubGVuZ3RoKCkgPD0ga01pbkRlY2ltYWxQb3dlcikgewotICAgICpndWVzcyA9IDAuMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmIChEb3VibGVTdHJ0b2QodHJpbW1lZCwgZXhwb25lbnQsIGd1ZXNzKSB8fAotICAgICAgRGl5RnBTdHJ0b2QodHJpbW1lZCwgZXhwb25lbnQsIGd1ZXNzKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmICgqZ3Vlc3MgPT0gRG91YmxlOjpJbmZpbml0eSgpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1kb3VibGUgU3RydG9kKFZlY3Rvcjxjb25zdCBjaGFyPiBidWZmZXIsIGludCBleHBvbmVudCkgewotICBjaGFyIGNvcHlfYnVmZmVyW2tNYXhTaWduaWZpY2FudERlY2ltYWxEaWdpdHNdOwotICBWZWN0b3I8Y29uc3QgY2hhcj4gdHJpbW1lZDsKLSAgaW50IHVwZGF0ZWRfZXhwb25lbnQ7Ci0gIFRyaW1BbmRDdXQoYnVmZmVyLCBleHBvbmVudCwgY29weV9idWZmZXIsIGtNYXhTaWduaWZpY2FudERlY2ltYWxEaWdpdHMsCi0gICAgICAgICAgICAgJnRyaW1tZWQsICZ1cGRhdGVkX2V4cG9uZW50KTsKLSAgZXhwb25lbnQgPSB1cGRhdGVkX2V4cG9uZW50OwotCi0gIGRvdWJsZSBndWVzczsKLSAgYm9vbCBpc19jb3JyZWN0ID0gQ29tcHV0ZUd1ZXNzKHRyaW1tZWQsIGV4cG9uZW50LCAmZ3Vlc3MpOwotICBpZiAoaXNfY29ycmVjdCkgcmV0dXJuIGd1ZXNzOwotCi0gIERpeUZwIHVwcGVyX2JvdW5kYXJ5ID0gRG91YmxlKGd1ZXNzKS5VcHBlckJvdW5kYXJ5KCk7Ci0gIGludCBjb21wYXJpc29uID0gQ29tcGFyZUJ1ZmZlcldpdGhEaXlGcCh0cmltbWVkLCBleHBvbmVudCwgdXBwZXJfYm91bmRhcnkpOwotICBpZiAoY29tcGFyaXNvbiA8IDApIHsKLSAgICByZXR1cm4gZ3Vlc3M7Ci0gIH0gZWxzZSBpZiAoY29tcGFyaXNvbiA+IDApIHsKLSAgICByZXR1cm4gRG91YmxlKGd1ZXNzKS5OZXh0RG91YmxlKCk7Ci0gIH0gZWxzZSBpZiAoKERvdWJsZShndWVzcykuU2lnbmlmaWNhbmQoKSAmIDEpID09IDApIHsKLSAgICAvLyBSb3VuZCB0b3dhcmRzIGV2ZW4uCi0gICAgcmV0dXJuIGd1ZXNzOwotICB9IGVsc2UgewotICAgIHJldHVybiBEb3VibGUoZ3Vlc3MpLk5leHREb3VibGUoKTsKLSAgfQotfQotCi1mbG9hdCBTdHJ0b2YoVmVjdG9yPGNvbnN0IGNoYXI+IGJ1ZmZlciwgaW50IGV4cG9uZW50KSB7Ci0gIGNoYXIgY29weV9idWZmZXJba01heFNpZ25pZmljYW50RGVjaW1hbERpZ2l0c107Ci0gIFZlY3Rvcjxjb25zdCBjaGFyPiB0cmltbWVkOwotICBpbnQgdXBkYXRlZF9leHBvbmVudDsKLSAgVHJpbUFuZEN1dChidWZmZXIsIGV4cG9uZW50LCBjb3B5X2J1ZmZlciwga01heFNpZ25pZmljYW50RGVjaW1hbERpZ2l0cywKLSAgICAgICAgICAgICAmdHJpbW1lZCwgJnVwZGF0ZWRfZXhwb25lbnQpOwotICBleHBvbmVudCA9IHVwZGF0ZWRfZXhwb25lbnQ7Ci0KLSAgZG91YmxlIGRvdWJsZV9ndWVzczsKLSAgYm9vbCBpc19jb3JyZWN0ID0gQ29tcHV0ZUd1ZXNzKHRyaW1tZWQsIGV4cG9uZW50LCAmZG91YmxlX2d1ZXNzKTsKLQotICBmbG9hdCBmbG9hdF9ndWVzcyA9IHN0YXRpY19jYXN0PGZsb2F0Pihkb3VibGVfZ3Vlc3MpOwotICBpZiAoZmxvYXRfZ3Vlc3MgPT0gZG91YmxlX2d1ZXNzKSB7Ci0gICAgLy8gVGhpcyBzaG9ydGN1dCB0cmlnZ2VycyBmb3IgaW50ZWdlciB2YWx1ZXMuCi0gICAgcmV0dXJuIGZsb2F0X2d1ZXNzOwotICB9Ci0KLSAgLy8gV2UgbXVzdCBjYXRjaCBkb3VibGUtcm91bmRpbmcuIFNheSB0aGUgZG91YmxlIGhhcyBiZWVuIHJvdW5kZWQgdXAsIGFuZCBpcwotICAvLyBub3cgYSBib3VuZGFyeSBvZiBhIGZsb2F0LCBhbmQgcm91bmRzIHVwIGFnYWluLiBUaGlzIGlzIHdoeSB3ZSBoYXZlIHRvCi0gIC8vIGxvb2sgYXQgcHJldmlvdXMgdG9vLgotICAvLyBFeGFtcGxlIChpbiBkZWNpbWFsIG51bWJlcnMpOgotICAvLyAgICBpbnB1dDogMTIzNDkKLSAgLy8gICAgaGlnaC1wcmVjaXNpb24gKDQgZGlnaXRzKTogMTIzNQotICAvLyAgICBsb3ctcHJlY2lzaW9uICgzIGRpZ2l0cyk6Ci0gIC8vICAgICAgIHdoZW4gcmVhZCBmcm9tIGlucHV0OiAxMjMKLSAgLy8gICAgICAgd2hlbiByb3VuZGVkIGZyb20gaGlnaCBwcmVjaXNpb246IDEyNC4KLSAgLy8gVG8gZG8gdGhpcyB3ZSBzaW1wbHkgbG9vayBhdCB0aGUgbmVpZ2JvcnMgb2YgdGhlIGNvcnJlY3QgcmVzdWx0IGFuZCBzZWUKLSAgLy8gaWYgdGhleSB3b3VsZCByb3VuZCB0byB0aGUgc2FtZSBmbG9hdC4gSWYgdGhlIGd1ZXNzIGlzIG5vdCBjb3JyZWN0IHdlIGhhdmUKLSAgLy8gdG8gbG9vayBhdCBmb3VyIHZhbHVlcyAoc2luY2UgdHdvIGRpZmZlcmVudCBkb3VibGVzIGNvdWxkIGJlIHRoZSBjb3JyZWN0Ci0gIC8vIGRvdWJsZSkuCi0KLSAgZG91YmxlIGRvdWJsZV9uZXh0ID0gRG91YmxlKGRvdWJsZV9ndWVzcykuTmV4dERvdWJsZSgpOwotICBkb3VibGUgZG91YmxlX3ByZXZpb3VzID0gRG91YmxlKGRvdWJsZV9ndWVzcykuUHJldmlvdXNEb3VibGUoKTsKLQotICBmbG9hdCBmMSA9IHN0YXRpY19jYXN0PGZsb2F0Pihkb3VibGVfcHJldmlvdXMpOwotI2lmbmRlZiBOREVCVUcKLSAgZmxvYXQgZjIgPSBmbG9hdF9ndWVzczsKLSNlbmRpZgotICBmbG9hdCBmMyA9IHN0YXRpY19jYXN0PGZsb2F0Pihkb3VibGVfbmV4dCk7Ci0gIGZsb2F0IGY0OwotICBpZiAoaXNfY29ycmVjdCkgewotICAgIGY0ID0gZjM7Ci0gIH0gZWxzZSB7Ci0gICAgZG91YmxlIGRvdWJsZV9uZXh0MiA9IERvdWJsZShkb3VibGVfbmV4dCkuTmV4dERvdWJsZSgpOwotICAgIGY0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRvdWJsZV9uZXh0Mik7Ci0gIH0KLSNpZm5kZWYgTkRFQlVHCi0gIEFTU0VSVChmMSA8PSBmMiAmJiBmMiA8PSBmMyAmJiBmMyA8PSBmNCk7Ci0jZW5kaWYKLQotICAvLyBJZiB0aGUgZ3Vlc3MgZG9lc24ndCBsaWUgbmVhciBhIHNpbmdsZS1wcmVjaXNpb24gYm91bmRhcnkgd2UgY2FuIHNpbXBseQotICAvLyByZXR1cm4gaXRzIGZsb2F0LXZhbHVlLgotICBpZiAoZjEgPT0gZjQpIHsKLSAgICByZXR1cm4gZmxvYXRfZ3Vlc3M7Ci0gIH0KLQotICBBU1NFUlQoKGYxICE9IGYyICYmIGYyID09IGYzICYmIGYzID09IGY0KSB8fAotICAgICAgICAgKGYxID09IGYyICYmIGYyICE9IGYzICYmIGYzID09IGY0KSB8fAotICAgICAgICAgKGYxID09IGYyICYmIGYyID09IGYzICYmIGYzICE9IGY0KSk7Ci0KLSAgLy8gZ3Vlc3MgYW5kIG5leHQgYXJlIHRoZSB0d28gcG9zc2libGUgY2FuZGl0YXRlcyAoaW4gdGhlIHNhbWUgd2F5IHRoYXQKLSAgLy8gZG91YmxlX2d1ZXNzIHdhcyB0aGUgbG93ZXIgY2FuZGlkYXRlIGZvciBhIGRvdWJsZS1wcmVjaXNpb24gZ3Vlc3MpLgotICBmbG9hdCBndWVzcyA9IGYxOwotICBmbG9hdCBuZXh0ID0gZjQ7Ci0gIERpeUZwIHVwcGVyX2JvdW5kYXJ5OwotICBpZiAoZ3Vlc3MgPT0gMC4wZikgewotICAgIGZsb2F0IG1pbl9mbG9hdCA9IDFlLTQ1ZjsKLSAgICB1cHBlcl9ib3VuZGFyeSA9IERvdWJsZShzdGF0aWNfY2FzdDxkb3VibGU+KG1pbl9mbG9hdCkgLyAyKS5Bc0RpeUZwKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdXBwZXJfYm91bmRhcnkgPSBTaW5nbGUoZ3Vlc3MpLlVwcGVyQm91bmRhcnkoKTsKLSAgfQotICBpbnQgY29tcGFyaXNvbiA9IENvbXBhcmVCdWZmZXJXaXRoRGl5RnAodHJpbW1lZCwgZXhwb25lbnQsIHVwcGVyX2JvdW5kYXJ5KTsKLSAgaWYgKGNvbXBhcmlzb24gPCAwKSB7Ci0gICAgcmV0dXJuIGd1ZXNzOwotICB9IGVsc2UgaWYgKGNvbXBhcmlzb24gPiAwKSB7Ci0gICAgcmV0dXJuIG5leHQ7Ci0gIH0gZWxzZSBpZiAoKFNpbmdsZShndWVzcykuU2lnbmlmaWNhbmQoKSAmIDEpID09IDApIHsKLSAgICAvLyBSb3VuZCB0b3dhcmRzIGV2ZW4uCi0gICAgcmV0dXJuIGd1ZXNzOwotICB9IGVsc2UgewotICAgIHJldHVybiBuZXh0OwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBkb3VibGVfY29udmVyc2lvbgpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZXJzYXR6X3Byb2dyZXNzLmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZXJzYXR6X3Byb2dyZXNzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OThhYjVjLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2Vyc2F0el9wcm9ncmVzcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSNpbmNsdWRlICJ1dGlsL2Vyc2F0el9wcm9ncmVzcy5oaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxvc3RyZWFtPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLQotbmFtZXNwYWNlIHsgY29uc3QgdW5zaWduZWQgY2hhciBrV2lkdGggPSAxMDA7IH0KLQotY29uc3QgY2hhciBrUHJvZ3Jlc3NCYW5uZXJbXSA9ICItLS0tNS0tLTEwLS0tMTUtLS0yMC0tLTI1LS0tMzAtLS0zNS0tLTQwLS0tNDUtLS01MC0tLTU1LS0tNjAtLS02NS0tLTcwLS0tNzUtLS04MC0tLTg1LS0tOTAtLS05NS0tMTAwXG4iOwotCi1FcnNhdHpQcm9ncmVzczo6RXJzYXR6UHJvZ3Jlc3MoKSA6IGN1cnJlbnRfKDApLCBuZXh0XyhzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpLCBjb21wbGV0ZV8obmV4dF8pLCBvdXRfKE5VTEwpIHt9Ci0KLUVyc2F0elByb2dyZXNzOjp+RXJzYXR6UHJvZ3Jlc3MoKSB7Ci0gIGlmIChvdXRfKSBGaW5pc2hlZCgpOwotfQotCi1FcnNhdHpQcm9ncmVzczo6RXJzYXR6UHJvZ3Jlc3ModWludDY0X3QgY29tcGxldGUsIHN0ZDo6b3N0cmVhbSAqdG8sIGNvbnN0IHN0ZDo6c3RyaW5nICZtZXNzYWdlKSAKLSAgOiBjdXJyZW50XygwKSwgbmV4dF8oY29tcGxldGUgLyBrV2lkdGgpLCBjb21wbGV0ZV8oY29tcGxldGUpLCBzdG9uZXNfd3JpdHRlbl8oMCksIG91dF8odG8pIHsKLSAgaWYgKCFvdXRfKSB7Ci0gICAgbmV4dF8gPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghbWVzc2FnZS5lbXB0eSgpKSAqb3V0XyA8PCBtZXNzYWdlIDw8ICdcbic7Ci0gICpvdXRfIDw8IGtQcm9ncmVzc0Jhbm5lcjsKLX0KLQotdm9pZCBFcnNhdHpQcm9ncmVzczo6TWlsZXN0b25lKCkgewotICBpZiAoIW91dF8pIHsgY3VycmVudF8gPSAwOyByZXR1cm47IH0KLSAgaWYgKCFjb21wbGV0ZV8pIHJldHVybjsKLSAgdW5zaWduZWQgY2hhciBzdG9uZSA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHVpbnQ2NF90PihrV2lkdGgpLCAoY3VycmVudF8gKiBrV2lkdGgpIC8gY29tcGxldGVfKTsKLQotICBmb3IgKDsgc3RvbmVzX3dyaXR0ZW5fIDwgc3RvbmU7ICsrc3RvbmVzX3dyaXR0ZW5fKSB7Ci0gICAgKCpvdXRfKSA8PCAnKic7Ci0gIH0KLSAgaWYgKHN0b25lID09IGtXaWR0aCkgewotICAgICgqb3V0XykgPDwgc3RkOjplbmRsOwotICAgIG5leHRfID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpOwotICAgIG91dF8gPSBOVUxMOwotICB9IGVsc2UgewotICAgIG5leHRfID0gc3RkOjptYXgobmV4dF8sICgoc3RvbmUgKyAxKSAqIGNvbXBsZXRlXyArIGtXaWR0aCAtIDEpIC8ga1dpZHRoKTsKLSAgfQotfQotCi19IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9lcnNhdHpfcHJvZ3Jlc3MuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9lcnNhdHpfcHJvZ3Jlc3MuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNWRiZGUuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZXJzYXR6X3Byb2dyZXNzLmhoCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI2lmbmRlZiBVVElMX0VSU0FUWl9QUk9HUkVTU19ICi0jZGVmaW5lIFVUSUxfRVJTQVRaX1BST0dSRVNTX0gKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vLyBFcnNhdHogdmVyc2lvbiBvZiBib29zdDo6cHJvZ3Jlc3Mgc28gY29yZSBsYW5ndWFnZSBtb2RlbCBkb2Vzbid0IGRlcGVuZCBvbgotLy8gYm9vc3QuICBBbHNvIGFkZHMgb3B0aW9uIHRvIHByaW50IG5vdGhpbmcuICAKLQotbmFtZXNwYWNlIHV0aWwgewotCi1leHRlcm4gY29uc3QgY2hhciBrUHJvZ3Jlc3NCYW5uZXJbXTsKLQotY2xhc3MgRXJzYXR6UHJvZ3Jlc3MgewotICBwdWJsaWM6Ci0gICAgLy8gTm8gb3V0cHV0LiAgCi0gICAgRXJzYXR6UHJvZ3Jlc3MoKTsKLQotICAgIC8vIE51bGwgbWVhbnMgbm8gb3V0cHV0LiAgVGhlIG51bGwgdmFsdWUgaXMgdXNlZnVsIGZvciBwYXNzaW5nIGFsb25nIHRoZSBvc3RyZWFtIHBvaW50ZXIgZnJvbSBhbm90aGVyIGNhbGxlci4gICAKLSAgICBleHBsaWNpdCBFcnNhdHpQcm9ncmVzcyh1aW50NjRfdCBjb21wbGV0ZSwgc3RkOjpvc3RyZWFtICp0byA9ICZzdGQ6OmNlcnIsIGNvbnN0IHN0ZDo6c3RyaW5nICZtZXNzYWdlID0gIiIpOwotCi0gICAgfkVyc2F0elByb2dyZXNzKCk7Ci0KLSAgICBFcnNhdHpQcm9ncmVzcyAmb3BlcmF0b3IrKygpIHsKLSAgICAgIGlmICgrK2N1cnJlbnRfID49IG5leHRfKSBNaWxlc3RvbmUoKTsKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICBFcnNhdHpQcm9ncmVzcyAmb3BlcmF0b3IrPSh1aW50NjRfdCBhbW91bnQpIHsKLSAgICAgIGlmICgoY3VycmVudF8gKz0gYW1vdW50KSA+PSBuZXh0XykgTWlsZXN0b25lKCk7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgdm9pZCBTZXQodWludDY0X3QgdG8pIHsKLSAgICAgIGlmICgoY3VycmVudF8gPSB0bykgPj0gbmV4dF8pIE1pbGVzdG9uZSgpOwotICAgIH0KLQotICAgIHZvaWQgRmluaXNoZWQoKSB7Ci0gICAgICBTZXQoY29tcGxldGVfKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB2b2lkIE1pbGVzdG9uZSgpOwotCi0gICAgdWludDY0X3QgY3VycmVudF8sIG5leHRfLCBjb21wbGV0ZV87Ci0gICAgdW5zaWduZWQgY2hhciBzdG9uZXNfd3JpdHRlbl87Ci0gICAgc3RkOjpvc3RyZWFtICpvdXRfOwotCi0gICAgLy8gbm9uY29weWFibGUKLSAgICBFcnNhdHpQcm9ncmVzcyhjb25zdCBFcnNhdHpQcm9ncmVzcyAmb3RoZXIpOwotICAgIEVyc2F0elByb2dyZXNzICZvcGVyYXRvcj0oY29uc3QgRXJzYXR6UHJvZ3Jlc3MgJm90aGVyKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKLQotI2VuZGlmIC8vIFVUSUxfRVJTQVRaX1BST0dSRVNTX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2V4Y2VwdGlvbi5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2V4Y2VwdGlvbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmNGNiYy4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9leGNlcHRpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0jaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCi0KLSNpZmRlZiBfX0dYWF9SVFRJCi0jaW5jbHVkZSA8dHlwZWluZm8+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLQotRXhjZXB0aW9uOjpFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci1FeGNlcHRpb246On5FeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLUV4Y2VwdGlvbjo6RXhjZXB0aW9uKGNvbnN0IEV4Y2VwdGlvbiAmZnJvbSkgOiBzdGQ6OmV4Y2VwdGlvbigpIHsKLSAgc3RyZWFtXyA8PCBmcm9tLnN0cmVhbV8uc3RyKCk7Ci19Ci0KLUV4Y2VwdGlvbiAmRXhjZXB0aW9uOjpvcGVyYXRvcj0oY29uc3QgRXhjZXB0aW9uICZmcm9tKSB7Ci0gIHN0cmVhbV8gPDwgZnJvbS5zdHJlYW1fLnN0cigpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWNvbnN0IGNoYXIgKkV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IHRocm93KCkgewotICB0ZXh0XyA9IHN0cmVhbV8uc3RyKCk7Ci0gIHJldHVybiB0ZXh0Xy5jX3N0cigpOwotfQotCi12b2lkIEV4Y2VwdGlvbjo6U2V0TG9jYXRpb24oY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZ1bmMsIGNvbnN0IGNoYXIgKmNoaWxkX25hbWUsIGNvbnN0IGNoYXIgKmNvbmRpdGlvbikgewotICAvKiBUaGUgY2hpbGQgY2xhc3MgbWlnaHQgaGF2ZSBzZXQgc29tZSB0ZXh0LCBidXQgd2Ugd2FudCB0aGlzIHRvIGNvbWUgZmlyc3QuCi0gICAqIEFub3RoZXIgb3B0aW9uIHdvdWxkIGJlIHBhc3NpbmcgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUgY29uc3RydWN0b3IsIGJ1dAotICAgKiB0aGVuIGNoaWxkIGNsYXNzZXMgd291bGQgaGF2ZSB0byBhY2NlcHQgY29uc3RydWN0b3IgYXJndW1lbnRzIGFuZCBwYXNzCi0gICAqIHRoZW0gZG93bi4gIAotICAgKi8KLSAgdGV4dF8gPSBzdHJlYW1fLnN0cigpOwotICBzdHJlYW1fLnN0cigiIik7Ci0gIHN0cmVhbV8gPDwgZmlsZSA8PCAnOicgPDwgbGluZTsKLSAgaWYgKGZ1bmMpIHN0cmVhbV8gPDwgIiBpbiAiIDw8IGZ1bmMgPDwgIiB0aHJldyAiOwotICBpZiAoY2hpbGRfbmFtZSkgewotICAgIHN0cmVhbV8gPDwgY2hpbGRfbmFtZTsKLSAgfSBlbHNlIHsKLSNpZmRlZiBfX0dYWF9SVFRJCi0gICAgc3RyZWFtXyA8PCB0eXBlaWQodGhpcykubmFtZSgpOwotI2Vsc2UKLSAgICBzdHJlYW1fIDw8ICJhbiBleGNlcHRpb24iOwotI2VuZGlmCi0gIH0KLSAgaWYgKGNvbmRpdGlvbikgc3RyZWFtXyA8PCAiIGJlY2F1c2UgYCIgPDwgY29uZGl0aW9uOwotICBzdHJlYW1fIDw8ICInLlxuIjsKLSAgc3RyZWFtXyA8PCB0ZXh0XzsKLX0KLQotbmFtZXNwYWNlIHsKLQotI2lmZGVmIF9fR05VQ19fCi1jb25zdCBjaGFyICpIYW5kbGVTdHJlcnJvcihpbnQgcmV0LCBjb25zdCBjaGFyICpidWYpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKLWNvbnN0IGNoYXIgKkhhbmRsZVN0cmVycm9yKGNvbnN0IGNoYXIgKnJldCwgY29uc3QgY2hhciAqIC8qYnVmKi8pIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKLSNlbmRpZgotLy8gQXQgbGVhc3Qgb25lIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIG5vdCBiZSBjYWxsZWQuCi0jaWZkZWYgX19jbGFuZ19fCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLWZ1bmN0aW9uIgotI2VuZGlmCi0vLyBUaGUgWE9QRU4gdmVyc2lvbi4KLWNvbnN0IGNoYXIgKkhhbmRsZVN0cmVycm9yKGludCByZXQsIGNvbnN0IGNoYXIgKmJ1ZikgewotICBpZiAoIXJldCkgcmV0dXJuIGJ1ZjsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIFRoZSBHTlUgdmVyc2lvbi4KLWNvbnN0IGNoYXIgKkhhbmRsZVN0cmVycm9yKGNvbnN0IGNoYXIgKnJldCwgY29uc3QgY2hhciAqIC8qYnVmKi8pIHsKLSAgcmV0dXJuIHJldDsKLX0KLSNpZmRlZiBfX2NsYW5nX18KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLSNlbmRpZgotfSAvLyBuYW1lc3BhY2UKLQotRXJybm9FeGNlcHRpb246OkVycm5vRXhjZXB0aW9uKCkgdGhyb3coKSA6IGVycm5vXyhlcnJubykgewotICBjaGFyIGJ1ZlsyMDBdOwotICBidWZbMF0gPSAwOwotI2lmIGRlZmluZWQoc3VuKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0gIGNvbnN0IGNoYXIgKmFkZCA9IHN0cmVycm9yKGVycm5vKTsKLSNlbHNlCi0gIGNvbnN0IGNoYXIgKmFkZCA9IEhhbmRsZVN0cmVycm9yKHN0cmVycm9yX3IoZXJybm8sIGJ1ZiwgMjAwKSwgYnVmKTsKLSNlbmRpZgotCi0gIGlmIChhZGQpIHsKLSAgICAqdGhpcyA8PCBhZGQgPDwgJyAnOwotICB9Ci19Ci0KLUVycm5vRXhjZXB0aW9uOjp+RXJybm9FeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLU92ZXJmbG93RXhjZXB0aW9uOjpPdmVyZmxvd0V4Y2VwdGlvbigpIHRocm93KCkge30KLU92ZXJmbG93RXhjZXB0aW9uOjp+T3ZlcmZsb3dFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2V4Y2VwdGlvbi5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2V4Y2VwdGlvbi5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1MGE2Zi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9leGNlcHRpb24uaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotI2lmbmRlZiBVVElMX0VYQ0VQVElPTl9ICi0jZGVmaW5lIFVUSUxfRVhDRVBUSU9OX0gKLQotI2luY2x1ZGUgPGV4Y2VwdGlvbj4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIHV0aWwgewotCi10ZW1wbGF0ZSA8Y2xhc3MgRXhjZXB0LCBjbGFzcyBEYXRhPiB0eXBlbmFtZSBFeGNlcHQ6OnRlbXBsYXRlIEV4Y2VwdGlvblRhZzxFeGNlcHQmPjo6SWRlbnRpdHkgb3BlcmF0b3I8PChFeGNlcHQgJmUsIGNvbnN0IERhdGEgJmRhdGEpOwotCi1jbGFzcyBFeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24gewotICBwdWJsaWM6Ci0gICAgRXhjZXB0aW9uKCkgdGhyb3coKTsKLSAgICB2aXJ0dWFsIH5FeGNlcHRpb24oKSB0aHJvdygpOwotCi0gICAgRXhjZXB0aW9uKGNvbnN0IEV4Y2VwdGlvbiAmZnJvbSk7Ci0gICAgRXhjZXB0aW9uICZvcGVyYXRvcj0oY29uc3QgRXhjZXB0aW9uICZmcm9tKTsKLQotICAgIC8vIE5vdCB0aHJlYWRzYWZlLCBidXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIuICBGV0lXLCBCb29zdCdzIGV4Y2VwdGlvbiBndWlkYW5jZSBpbXBsaWVzIHRoYXQgd2hhdCgpIGlzbid0IHRocmVhZHNhZmUuICAKLSAgICBjb25zdCBjaGFyICp3aGF0KCkgY29uc3QgdGhyb3coKTsKLQotICAgIC8vIEZvciB1c2UgYnkgdGhlIFVUSUxfVEhST1cgbWFjcm9zLiAgCi0gICAgdm9pZCBTZXRMb2NhdGlvbigKLSAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgdW5zaWduZWQgaW50IGxpbmUsCi0gICAgICAgIGNvbnN0IGNoYXIgKmZ1bmMsCi0gICAgICAgIGNvbnN0IGNoYXIgKmNoaWxkX25hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvbmRpdGlvbik7Ci0KLSAgcHJpdmF0ZToKLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgRXhjZXB0LCBjbGFzcyBEYXRhPiBmcmllbmQgdHlwZW5hbWUgRXhjZXB0Ojp0ZW1wbGF0ZSBFeGNlcHRpb25UYWc8RXhjZXB0Jj46OklkZW50aXR5IG9wZXJhdG9yPDwoRXhjZXB0ICZlLCBjb25zdCBEYXRhICZkYXRhKTsKLQotICAgIC8vIFRoaXMgaGVscHMgcmVzdHJpY3Qgb3BlcmF0b3I8PCBkZWZpbmVkIGJlbG93LiAgCi0gICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBFeGNlcHRpb25UYWcgewotICAgICAgdHlwZWRlZiBUIElkZW50aXR5OwotICAgIH07Ci0KLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW1fOwotICAgIG11dGFibGUgc3RkOjpzdHJpbmcgdGV4dF87Ci19OwotCi0vKiBUaGlzIGltcGxlbWVudHMgdGhlIG5vcm1hbCBvcGVyYXRvcjw8IGZvciBFeGNlcHRpb24gYW5kIGFsbCBpdHMgY2hpbGRyZW4uIAotICogU0ZJTkFFIG1lYW5zIGl0IG9ubHkgYXBwbGllcyB0byBFeGNlcHRpb24uICBUaGluayBvZiB0aGlzIGFzIGFuIGVyc2F0egotICogYm9vc3Q6OmVuYWJsZV9pZi4gIAotICovCi10ZW1wbGF0ZSA8Y2xhc3MgRXhjZXB0LCBjbGFzcyBEYXRhPiB0eXBlbmFtZSBFeGNlcHQ6OnRlbXBsYXRlIEV4Y2VwdGlvblRhZzxFeGNlcHQmPjo6SWRlbnRpdHkgb3BlcmF0b3I8PChFeGNlcHQgJmUsIGNvbnN0IERhdGEgJmRhdGEpIHsKLSAgZS5zdHJlYW1fIDw8IGRhdGE7Ci0gIHJldHVybiBlOwotfQotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgVVRJTF9GVU5DX05BTUUgX19QUkVUVFlfRlVOQ1RJT05fXwotI2Vsc2UKLSNpZmRlZiBfV0lOMzIKLSNkZWZpbmUgVVRJTF9GVU5DX05BTUUgX19GVU5DVElPTl9fCi0jZWxzZQotI2RlZmluZSBVVElMX0ZVTkNfTkFNRSBOVUxMCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgRXhjZXB0aW9uLCBhZGQgdGhlIG1lc3NhZ2UgTW9kaWZ5LCBhbmQgdGhyb3cgaXQuCi0gKiBNb2RpZnkgaXMgYXBwZW5kZWQgdG8gdGhlIHdoYXQoKSBtZXNzYWdlIGFuZCBjYW4gY29udGFpbiA8PCBmb3Igb3N0cmVhbQotICogb3BlcmF0aW9ucy4gIAotICoKLSAqIGRvIC4uIHdoaWxlIGtsdWRnZSB0byBzd2FsbG93IHRyYWlsaW5nIDsgY2hhcmFjdGVyCi0gKiBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9jcHAvU3dhbGxvd2luZy10aGUtU2VtaWNvbG9uLmh0bWwgLiAgCi0gKiBBcmcgY2FuIGJlIGEgY29uc3RydWN0b3IgYXJndW1lbnQgdG8gdGhlIGV4Y2VwdGlvbi4KLSAqLwotI2RlZmluZSBVVElMX1RIUk9XX0JBQ0tFTkQoQ29uZGl0aW9uLCBFeGNlcHRpb24sIEFyZywgTW9kaWZ5KSBkbyB7IFwKLSAgRXhjZXB0aW9uIFVUSUxfZSBBcmc7IFwKLSAgVVRJTF9lLlNldExvY2F0aW9uKF9fRklMRV9fLCBfX0xJTkVfXywgVVRJTF9GVU5DX05BTUUsICNFeGNlcHRpb24sIENvbmRpdGlvbik7IFwKLSAgVVRJTF9lIDw8IE1vZGlmeTsgXAotICB0aHJvdyBVVElMX2U7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVVRJTF9USFJPV19BUkcoRXhjZXB0aW9uLCBBcmcsIE1vZGlmeSkgXAotICBVVElMX1RIUk9XX0JBQ0tFTkQoTlVMTCwgRXhjZXB0aW9uLCBBcmcsIE1vZGlmeSkKLQotI2RlZmluZSBVVElMX1RIUk9XKEV4Y2VwdGlvbiwgTW9kaWZ5KSBcCi0gIFVUSUxfVEhST1dfQkFDS0VORChOVUxMLCBFeGNlcHRpb24sICwgTW9kaWZ5KTsKLQotI2RlZmluZSBVVElMX1RIUk9XMihNb2RpZnkpIFwKLSAgVVRJTF9USFJPV19CQUNLRU5EKE5VTEwsIHV0aWw6OkV4Y2VwdGlvbiwgLCBNb2RpZnkpOwotCi0jaWYgX19HTlVDX18gPj0gMwotI2RlZmluZSBVVElMX1VOTElLRUxZKHgpIF9fYnVpbHRpbl9leHBlY3QgKCEhKHgpLCAwKQotI2Vsc2UKLSNkZWZpbmUgVVRJTF9VTkxJS0VMWSh4KSAoeCkKLSNlbmRpZgotCi0jZGVmaW5lIFVUSUxfVEhST1dfSUZfQVJHKENvbmRpdGlvbiwgRXhjZXB0aW9uLCBBcmcsIE1vZGlmeSkgZG8geyBcCi0gIGlmIChVVElMX1VOTElLRUxZKENvbmRpdGlvbikpIHsgXAotICAgIFVUSUxfVEhST1dfQkFDS0VORCgjQ29uZGl0aW9uLCBFeGNlcHRpb24sIEFyZywgTW9kaWZ5KTsgXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVVRJTF9USFJPV19JRihDb25kaXRpb24sIEV4Y2VwdGlvbiwgTW9kaWZ5KSBcCi0gIFVUSUxfVEhST1dfSUZfQVJHKENvbmRpdGlvbiwgRXhjZXB0aW9uLCAsIE1vZGlmeSkKLQotI2RlZmluZSBVVElMX1RIUk9XX0lGMihDb25kaXRpb24sIE1vZGlmeSkgXAotICBVVElMX1RIUk9XX0lGX0FSRyhDb25kaXRpb24sIHV0aWw6OkV4Y2VwdGlvbiwgLCBNb2RpZnkpCi0KLS8vIEV4Y2VwdGlvbiB0aGF0IHJlY29yZHMgZXJybm8gYW5kIGFkZHMgaXQgdG8gdGhlIG1lc3NhZ2UuCi1jbGFzcyBFcnJub0V4Y2VwdGlvbiA6IHB1YmxpYyBFeGNlcHRpb24gewotICBwdWJsaWM6Ci0gICAgRXJybm9FeGNlcHRpb24oKSB0aHJvdygpOwotCi0gICAgdmlydHVhbCB+RXJybm9FeGNlcHRpb24oKSB0aHJvdygpOwotCi0gICAgaW50IEVycm9yKCkgY29uc3QgdGhyb3coKSB7IHJldHVybiBlcnJub187IH0KLQotICBwcml2YXRlOgotICAgIGludCBlcnJub187Ci19OwotCi0vLyBmaWxlIHdhc24ndCB0aGVyZSwgb3IgY291bGRuJ3QgYmUgb3BlbiBmb3Igc29tZSByZWFzb24KLWNsYXNzIEZpbGVPcGVuRXhjZXB0aW9uIDogcHVibGljIEV4Y2VwdGlvbiB7Ci0gIHB1YmxpYzoKLQlGaWxlT3BlbkV4Y2VwdGlvbigpIHRocm93KCkge30KLSAgICB+RmlsZU9wZW5FeGNlcHRpb24oKSB0aHJvdygpIHt9Ci19OwotCi0vLyBVdGlsaXRpZXMgZm9yIG92ZXJmbG93IGNoZWNraW5nLiAgCi1jbGFzcyBPdmVyZmxvd0V4Y2VwdGlvbiA6IHB1YmxpYyBFeGNlcHRpb24gewotICBwdWJsaWM6Ci0gICAgT3ZlcmZsb3dFeGNlcHRpb24oKSB0aHJvdygpOwotICAgIH5PdmVyZmxvd0V4Y2VwdGlvbigpIHRocm93KCk7Ci19OwotCi10ZW1wbGF0ZSA8dW5zaWduZWQgbGVuPiBpbmxpbmUgc3RkOjpzaXplX3QgQ2hlY2tPdmVyZmxvd0ludGVybmFsKHVpbnQ2NF90IHZhbHVlKSB7Ci0gIFVUSUxfVEhST1dfSUYodmFsdWUgPiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnNpemVfdD46Om1heCgpKSwgT3ZlcmZsb3dFeGNlcHRpb24sICJJbnRlZ2VyIG92ZXJmbG93IGRldGVjdGVkLiAgVGhpcyBtb2RlbCBpcyB0b28gYmlnIGZvciAzMi1iaXQgY29kZS4iKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi10ZW1wbGF0ZSA8PiBpbmxpbmUgc3RkOjpzaXplX3QgQ2hlY2tPdmVyZmxvd0ludGVybmFsPDg+KHVpbnQ2NF90IHZhbHVlKSB7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW5saW5lIHN0ZDo6c2l6ZV90IENoZWNrT3ZlcmZsb3codWludDY0X3QgdmFsdWUpIHsKLSAgcmV0dXJuIENoZWNrT3ZlcmZsb3dJbnRlcm5hbDxzaXplb2Yoc3RkOjpzaXplX3QpPih2YWx1ZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKLQotI2VuZGlmIC8vIFVUSUxfRVhDRVBUSU9OX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2Zha2Vfb2ZzdHJlYW0uaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9mYWtlX29mc3RyZWFtLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODdmYTgwLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2Zha2Vfb2ZzdHJlYW0uaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyogTGlrZSBzdGQ6Om9mc3RyZWFtIGJ1dCB3aXRob3V0IGJlaW5nIGluY3JlZGlibHkgc2xvdy4gIEJhY2tlZCBieSBhIHJhdyBmZC4KLSAqIERvZXMgbm90IHN1cHBvcnQgbWFueSBkYXRhIHR5cGVzLiAgQ3VycmVudGx5LCBpdCdzIHRhcmdldGVkIGF0IHdyaXRpbmcgQVJQQQotICogZmlsZXMgcXVpY2tseS4KLSAqLwotI2lmbmRlZiBVVElMX0ZBS0VfT0ZTVFJFQU1fSAotI2RlZmluZSBVVElMX0ZBS0VfT0ZTVFJFQU1fSAotCi0jaW5jbHVkZSAidXRpbC9kb3VibGUtY29udmVyc2lvbi9kb3VibGUtY29udmVyc2lvbi5oIgotI2luY2x1ZGUgInV0aWwvZG91YmxlLWNvbnZlcnNpb24vdXRpbHMuaCIKLSNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCi0jaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCi0jaW5jbHVkZSAidXRpbC9zdHJpbmdfcGllY2UuaGgiCi0KLSNkZWZpbmUgQk9PU1RfTEVYSUNBTF9DQVNUX0FTU1VNRV9DX0xPQ0FMRQotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLWNsYXNzIEZha2VPRlN0cmVhbSB7Ci0gIHB1YmxpYzoKLSAgICAvLyBEb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiBvdXQuCi0gICAgLy8gQWxsb3dzIGRlZmF1bHQgY29uc3RydWN0b3IsIGJ1dCBtdXN0IGNhbGwgU2V0RkQuCi0gICAgZXhwbGljaXQgRmFrZU9GU3RyZWFtKGludCBvdXQgPSAtMSwgc3RkOjpzaXplX3QgYnVmZmVyX3NpemUgPSAxMDQ4NTc2KQotICAgICAgOiBidWZfKHV0aWw6Ok1hbGxvY09yVGhyb3coYnVmZmVyX3NpemUpKSwKLSAgICAgICAgYnVpbGRlcl8oc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1Zl8uZ2V0KCkpLCBidWZmZXJfc2l6ZSksCi0gICAgICAgIC8vIE1vc3RseSB0aGUgZGVmYXVsdCBidXQgd2l0aCBpbmYgaW5zdGVhZC4gIEFuZCBubyBmbGFncy4KLSAgICAgICAgY29udmVydF8oZG91YmxlX2NvbnZlcnNpb246OkRvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpOT19GTEFHUywgImluZiIsICJOYU4iLCAnZScsIC02LCAyMSwgNiwgMCksCi0gICAgICAgIGZkXyhvdXQpLAotICAgICAgICBidWZmZXJfc2l6ZV8oYnVmZmVyX3NpemUpIHt9Ci0KLSAgICB+RmFrZU9GU3RyZWFtKCkgewotICAgICAgaWYgKGJ1Zl8uZ2V0KCkpIEZsdXNoKCk7Ci0gICAgfQotCi0gICAgdm9pZCBTZXRGRChpbnQgdG8pIHsKLSAgICAgIGlmIChidWlsZGVyXy5wb3NpdGlvbigpKSBGbHVzaCgpOwotICAgICAgZmRfID0gdG87Ci0gICAgfQotCi0gICAgRmFrZU9GU3RyZWFtICZvcGVyYXRvcjw8KGZsb2F0IHZhbHVlKSB7Ci0gICAgICAvLyBPZGQsIGJ1dCB0aGlzIGlzIHRoZSBsYXJnZXN0IG51bWJlciBmb3VuZCBpbiB0aGUgY29tbWVudHMuCi0gICAgICBFbnN1cmVSZW1haW5pbmcoZG91YmxlX2NvbnZlcnNpb246OkRvdWJsZVRvU3RyaW5nQ29udmVydGVyOjprTWF4UHJlY2lzaW9uRGlnaXRzICsgOCk7Ci0gICAgICBjb252ZXJ0Xy5Ub1Nob3J0ZXN0U2luZ2xlKHZhbHVlLCAmYnVpbGRlcl8pOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIEZha2VPRlN0cmVhbSAmb3BlcmF0b3I8PChkb3VibGUgdmFsdWUpIHsKLSAgICAgIEVuc3VyZVJlbWFpbmluZyhkb3VibGVfY29udmVyc2lvbjo6RG91YmxlVG9TdHJpbmdDb252ZXJ0ZXI6OmtNYXhQcmVjaXNpb25EaWdpdHMgKyA4KTsKLSAgICAgIGNvbnZlcnRfLlRvU2hvcnRlc3QodmFsdWUsICZidWlsZGVyXyk7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgRmFrZU9GU3RyZWFtICZvcGVyYXRvcjw8KFN0cmluZ1BpZWNlIHN0cikgewotICAgICAgaWYgKHN0ci5zaXplKCkgPiBidWZmZXJfc2l6ZV8pIHsKLSAgICAgICAgRmx1c2goKTsKLSAgICAgICAgdXRpbDo6V3JpdGVPclRocm93KGZkXywgc3RyLmRhdGEoKSwgc3RyLnNpemUoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBFbnN1cmVSZW1haW5pbmcoc3RyLnNpemUoKSk7Ci0gICAgICAgIGJ1aWxkZXJfLkFkZFN1YnN0cmluZyhzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvLyBJbmVmZmljaWVudCEgIFRPRE86IG1vcmUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uCi0gICAgRmFrZU9GU3RyZWFtICZvcGVyYXRvcjw8KHVuc2lnbmVkIHZhbHVlKSB7Ci0gICAgICByZXR1cm4gKnRoaXMgPDwgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4odmFsdWUpOwotICAgIH0KLQotICAgIEZha2VPRlN0cmVhbSAmb3BlcmF0b3I8PChjaGFyIGMpIHsKLSAgICAgIEVuc3VyZVJlbWFpbmluZygxKTsKLSAgICAgIGJ1aWxkZXJfLkFkZENoYXJhY3RlcihjKTsKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvLyBOb3RlIHRoaXMgZG9lcyBub3Qgc3luYy4KLSAgICB2b2lkIEZsdXNoKCkgewotICAgICAgdXRpbDo6V3JpdGVPclRocm93KGZkXywgYnVmXy5nZXQoKSwgYnVpbGRlcl8ucG9zaXRpb24oKSk7Ci0gICAgICBidWlsZGVyXy5SZXNldCgpOwotICAgIH0KLQotICAgIC8vIE5vdCBuZWNlc3NhcnksIGJ1dCBkb2VzIGFzc3VyZSB0aGUgZGF0YSBpcyBjbGVhcmVkLgotICAgIHZvaWQgRmluaXNoKCkgewotICAgICAgRmx1c2goKTsKLSAgICAgIC8vIEl0IHdpbGwgc2VnZmF1bHQgdHJ5aW5nIHRvIG51bGwgdGVybWluYXRlIG90aGVyd2lzZS4KLSAgICAgIGJ1aWxkZXJfLkZpbmFsaXplKCk7Ci0gICAgICBidWZfLnJlc2V0KCk7Ci0gICAgICB1dGlsOjpGU3luY09yVGhyb3coZmRfKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB2b2lkIEVuc3VyZVJlbWFpbmluZyhzdGQ6OnNpemVfdCBhbW91bnQpIHsKLSAgICAgIGlmIChzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oYnVpbGRlcl8uc2l6ZSgpIC0gYnVpbGRlcl8ucG9zaXRpb24oKSkgPD0gYW1vdW50KSB7Ci0gICAgICAgIEZsdXNoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdXRpbDo6c2NvcGVkX21hbGxvYyBidWZfOwotICAgIGRvdWJsZV9jb252ZXJzaW9uOjpTdHJpbmdCdWlsZGVyIGJ1aWxkZXJfOwotICAgIGRvdWJsZV9jb252ZXJzaW9uOjpEb3VibGVUb1N0cmluZ0NvbnZlcnRlciBjb252ZXJ0XzsKLSAgICBpbnQgZmRfOwotICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZmlsZS5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2ZpbGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNjFjZjkuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZmlsZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0jZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UKLSNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKLQotI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKLQotI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2lmIGRlZmluZWQoX19NSU5HVzMyX18pCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI3dhcm5pbmcgIlRoZSBmaWxlIGZ1bmN0aW9ucyBvbiBNaW5HVyBoYXZlIG5vdCBiZWVuIHRlc3RlZCBmb3IgZmlsZSBzaXplcyBhYm92ZSAyXjMxIC0gMS4gIFBsZWFzZSByZWFkIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyNTM5NDg4L2RldGVybWluZS02NC1iaXQtZmlsZS1zaXplLWluLWMtb24tbWluZ3ctMzItYml0IGFuZCBmaXgiCi0jZWxpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPGlvLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLW5hbWVzcGFjZSB1dGlsIHsKLQotc2NvcGVkX2ZkOjp+c2NvcGVkX2ZkKCkgewotICBpZiAoZmRfICE9IC0xICYmIGNsb3NlKGZkXykpIHsKLSAgICBzdGQ6OmNlcnIgPDwgIkNvdWxkIG5vdCBjbG9zZSBmaWxlICIgPDwgZmRfIDw8IHN0ZDo6ZW5kbDsKLSAgICBzdGQ6OmFib3J0KCk7Ci0gIH0KLX0KLQotdm9pZCBzY29wZWRfRklMRV9jbG9zZXI6OkNsb3NlKHN0ZDo6RklMRSAqZmlsZSkgewotICBpZiAoZmlsZSAmJiBzdGQ6OmZjbG9zZShmaWxlKSkgewotICAgIHN0ZDo6Y2VyciA8PCAiQ291bGQgbm90IGNsb3NlIGZpbGUgIiA8PCBmaWxlIDw8IHN0ZDo6ZW5kbDsKLSAgICBzdGQ6OmFib3J0KCk7Ci0gIH0KLX0KLQotLy8gTm90ZSB0aGF0IEVycm5vRXhjZXB0aW9uIHJlY29yZHMgZXJybm8gYmVmb3JlIE5hbWVGcm9tRkQgaXMgY2FsbGVkLgotRkRFeGNlcHRpb246OkZERXhjZXB0aW9uKGludCBmZCkgdGhyb3coKSA6IGZkXyhmZCksIG5hbWVfZ3Vlc3NfKE5hbWVGcm9tRkQoZmQpKSB7Ci0gICp0aGlzIDw8ICJpbiAiIDw8IG5hbWVfZ3Vlc3NfIDw8ICcgJzsKLX0KLQotRkRFeGNlcHRpb246On5GREV4Y2VwdGlvbigpIHRocm93KCkge30KLQotRW5kT2ZGaWxlRXhjZXB0aW9uOjpFbmRPZkZpbGVFeGNlcHRpb24oKSB0aHJvdygpIHsKLSAgKnRoaXMgPDwgIkVuZCBvZiBmaWxlIjsKLX0KLUVuZE9mRmlsZUV4Y2VwdGlvbjo6fkVuZE9mRmlsZUV4Y2VwdGlvbigpIHRocm93KCkge30KLQotaW50IE9wZW5SZWFkT3JUaHJvdyhjb25zdCBjaGFyICpuYW1lKSB7Ci0gIGludCByZXQ7Ci0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotICBVVElMX1RIUk9XX0lGKC0xID09IChyZXQgPSBfb3BlbihuYW1lLCBfT19CSU5BUlkgfCBfT19SRE9OTFkpKSwgRXJybm9FeGNlcHRpb24sICJ3aGlsZSBvcGVuaW5nICIgPDwgbmFtZSk7Ci0jZWxzZQotICBVVElMX1RIUk9XX0lGKC0xID09IChyZXQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZKSksIEVycm5vRXhjZXB0aW9uLCAid2hpbGUgb3BlbmluZyAiIDw8IG5hbWUpOwotI2VuZGlmCi0gIHJldHVybiByZXQ7Ci19Ci0KLWludCBDcmVhdGVPclRocm93KGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgaW50IHJldDsKLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0gIFVUSUxfVEhST1dfSUYoLTEgPT0gKHJldCA9IF9vcGVuKG5hbWUsIF9PX0NSRUFUIHwgX09fVFJVTkMgfCBfT19SRFdSIHwgX09fQklOQVJZLCBfU19JUkVBRCB8IF9TX0lXUklURSkpLCBFcnJub0V4Y2VwdGlvbiwgIndoaWxlIGNyZWF0aW5nICIgPDwgbmFtZSk7Ci0jZWxzZQotICBVVElMX1RIUk9XX0lGKC0xID09IChyZXQgPSBvcGVuKG5hbWUsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKSksIEVycm5vRXhjZXB0aW9uLCAid2hpbGUgY3JlYXRpbmcgIiA8PCBuYW1lKTsKLSNlbmRpZgotICByZXR1cm4gcmV0OwotfQotCi11aW50NjRfdCBTaXplRmlsZShpbnQgZmQpIHsKLSNpZiBkZWZpbmVkIF9fTUlOR1czMl9fCi0gIHN0cnVjdCBzdGF0IHNiOwotICAvLyBEb2VzIHRoaXMgaGFuZGxlIDY0LWJpdD8KLSAgaW50IHJldCA9IGZzdGF0KGZkLCAmc2IpOwotICBpZiAocmV0ID09IC0xIHx8ICghc2Iuc3Rfc2l6ZSAmJiAhU19JU1JFRyhzYi5zdF9tb2RlKSkpIHJldHVybiBrQmFkU2l6ZTsKLSAgcmV0dXJuIHNiLnN0X3NpemU7Ci0jZWxpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0gIF9faW50NjQgcmV0ID0gX2ZpbGVsZW5ndGhpNjQoZmQpOwotICByZXR1cm4gKHJldCA9PSAtMSkgPyBrQmFkU2l6ZSA6IHJldDsKLSNlbHNlIC8vIE5vdCB3aW5kb3dzLgotCi0jaWZkZWYgT1NfQU5EUk9JRAotICBzdHJ1Y3Qgc3RhdDY0IHNiOwotICBpbnQgcmV0ID0gZnN0YXQ2NChmZCwgJnNiKTsKLSNlbHNlCi0gIHN0cnVjdCBzdGF0IHNiOwotICBpbnQgcmV0ID0gZnN0YXQoZmQsICZzYik7Ci0jZW5kaWYKLSAgaWYgKHJldCA9PSAtMSB8fCAoIXNiLnN0X3NpemUgJiYgIVNfSVNSRUcoc2Iuc3RfbW9kZSkpKSByZXR1cm4ga0JhZFNpemU7Ci0gIHJldHVybiBzYi5zdF9zaXplOwotI2VuZGlmCi19Ci0KLXVpbnQ2NF90IFNpemVPclRocm93KGludCBmZCkgewotICB1aW50NjRfdCByZXQgPSBTaXplRmlsZShmZCk7Ci0gIFVUSUxfVEhST1dfSUZfQVJHKHJldCA9PSBrQmFkU2l6ZSwgRkRFeGNlcHRpb24sIChmZCksICJGYWlsZWQgdG8gc2l6ZSIpOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIFJlc2l6ZU9yVGhyb3coaW50IGZkLCB1aW50NjRfdCB0bykgewotI2lmIGRlZmluZWQgX19NSU5HVzMyX18KLSAgICAvLyBEb2VzIHRoaXMgaGFuZGxlIDY0LWJpdD8KLSAgICBpbnQgcmV0ID0gZnRydW5jYXRlCi0jZWxpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0gICAgZXJybm9fdCByZXQgPSBfY2hzaXplX3MKLSNlbGlmIGRlZmluZWQoT1NfQU5EUk9JRCkKLSAgICBpbnQgcmV0ID0gZnRydW5jYXRlNjQKLSNlbHNlCi0gICAgaW50IHJldCA9IGZ0cnVuY2F0ZQotI2VuZGlmCi0gICAgKGZkLCB0byk7Ci0gIFVUSUxfVEhST1dfSUZfQVJHKHJldCwgRkRFeGNlcHRpb24sIChmZCksICJ3aGlsZSByZXNpemluZyB0byAiIDw8IHRvIDw8ICIgYnl0ZXMiKTsKLX0KLQotbmFtZXNwYWNlIHsKLXN0ZDo6c2l6ZV90IEd1YXJkTGFyZ2Uoc3RkOjpzaXplX3Qgc2l6ZSkgewotICAvLyBUaGUgZm9sbG93aW5nIG9wZXJhdGluZyBzeXN0ZW1zIGhhdmUgYnJva2VuIHJlYWQvd3JpdGUvcHJlYWQvcHdyaXRlIHRoYXQKLSAgLy8gb25seSBzdXBwb3J0cyB1cCB0byAyXjMxLgotICAvLyBPUyBYIG1hbiBwYWdlcyBjbGFpbSB0byBzdXBwb3J0IDY0LWJpdCwgYnV0IEthcmVlbSBNLiBEYXJ3aXNoIGhhZCBwcm9ibGVtcwotICAvLyBidWlsZGluZyB3aXRoIGxhcmdlciBmaWxlcywgc28gQVBQTEUgaXMgYWxzbyBoZXJlLgotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkgfHwgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoT1NfQU5EUk9JRCkgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKLSAgcmV0dXJuIHNpemUgPCBJTlRfTUFYID8gc2l6ZSA6IElOVF9NQVg7Ci0jZWxzZQotICByZXR1cm4gc2l6ZTsKLSNlbmRpZgotfQotfQotCi1zdGQ6OnNpemVfdCBQYXJ0aWFsUmVhZChpbnQgZmQsIHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQpIHsKLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0gIGludCByZXQgPSBfcmVhZChmZCwgdG8sIEd1YXJkTGFyZ2UoYW1vdW50KSk7Ci0jZWxzZQotICBlcnJubyA9IDA7Ci0gIHNzaXplX3QgcmV0OwotICBkbyB7Ci0gICAgcmV0ID0gcmVhZChmZCwgdG8sIEd1YXJkTGFyZ2UoYW1vdW50KSk7Ci0gIH0gd2hpbGUgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7Ci0jZW5kaWYKLSAgVVRJTF9USFJPV19JRl9BUkcocmV0IDwgMCwgRkRFeGNlcHRpb24sIChmZCksICJ3aGlsZSByZWFkaW5nICIgPDwgYW1vdW50IDw8ICIgYnl0ZXMiKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihyZXQpOwotfQotCi12b2lkIFJlYWRPclRocm93KGludCBmZCwgdm9pZCAqdG9fdm9pZCwgc3RkOjpzaXplX3QgYW1vdW50KSB7Ci0gIHVpbnQ4X3QgKnRvID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KHRvX3ZvaWQpOwotICB3aGlsZSAoYW1vdW50KSB7Ci0gICAgc3RkOjpzaXplX3QgcmV0ID0gUGFydGlhbFJlYWQoZmQsIHRvLCBhbW91bnQpOwotICAgIFVUSUxfVEhST1dfSUYocmV0ID09IDAsIEVuZE9mRmlsZUV4Y2VwdGlvbiwgIiBpbiAiIDw8IE5hbWVGcm9tRkQoZmQpIDw8ICIgYnV0IHRoZXJlIHNob3VsZCBiZSAiIDw8IGFtb3VudCA8PCAiIG1vcmUgYnl0ZXMgdG8gcmVhZC4iKTsKLSAgICBhbW91bnQgLT0gcmV0OwotICAgIHRvICs9IHJldDsKLSAgfQotfQotCi1zdGQ6OnNpemVfdCBSZWFkT3JFT0YoaW50IGZkLCB2b2lkICp0b192b2lkLCBzdGQ6OnNpemVfdCBhbW91bnQpIHsKLSAgdWludDhfdCAqdG8gPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4odG9fdm9pZCk7Ci0gIHN0ZDo6c2l6ZV90IHJlbWFpbmluZyA9IGFtb3VudDsKLSAgd2hpbGUgKHJlbWFpbmluZykgewotICAgIHN0ZDo6c2l6ZV90IHJldCA9IFBhcnRpYWxSZWFkKGZkLCB0bywgcmVtYWluaW5nKTsKLSAgICBpZiAoIXJldCkgcmV0dXJuIGFtb3VudCAtIHJlbWFpbmluZzsKLSAgICByZW1haW5pbmcgLT0gcmV0OwotICAgIHRvICs9IHJldDsKLSAgfQotICByZXR1cm4gYW1vdW50OwotfQotCi12b2lkIFdyaXRlT3JUaHJvdyhpbnQgZmQsIGNvbnN0IHZvaWQgKmRhdGFfdm9pZCwgc3RkOjpzaXplX3Qgc2l6ZSkgewotICBjb25zdCB1aW50OF90ICpkYXRhID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGFfdm9pZCk7Ci0gIHdoaWxlIChzaXplKSB7Ci0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotICAgIGludCByZXQ7Ci0jZWxzZQotICAgIHNzaXplX3QgcmV0OwotI2VuZGlmCi0gICAgZXJybm8gPSAwOwotICAgIGRvIHsKLSAgICAgIHJldCA9Ci0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotICAgICAgICBfd3JpdGUKLSNlbHNlCi0gICAgICAgIHdyaXRlCi0jZW5kaWYKLSAgICAgICAgKGZkLCBkYXRhLCBHdWFyZExhcmdlKHNpemUpKTsKLSAgICB9IHdoaWxlIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotICAgIFVUSUxfVEhST1dfSUZfQVJHKHJldCA8IDEsIEZERXhjZXB0aW9uLCAoZmQpLCAid2hpbGUgd3JpdGluZyAiIDw8IHNpemUgPDwgIiBieXRlcyIpOwotICAgIGRhdGEgKz0gcmV0OwotICAgIHNpemUgLT0gcmV0OwotICB9Ci19Ci0KLXZvaWQgV3JpdGVPclRocm93KEZJTEUgKnRvLCBjb25zdCB2b2lkICpkYXRhLCBzdGQ6OnNpemVfdCBzaXplKSB7Ci0gIGlmICghc2l6ZSkgcmV0dXJuOwotICBVVElMX1RIUk9XX0lGKDEgIT0gc3RkOjpmd3JpdGUoZGF0YSwgc2l6ZSwgMSwgdG8pLCBFcnJub0V4Y2VwdGlvbiwgIlNob3J0IHdyaXRlOyByZXF1ZXN0ZWQgc2l6ZSAiIDw8IHNpemUpOwotfQotCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotbmFtZXNwYWNlIHsKLWNvbnN0IHN0ZDo6c2l6ZV90IGtNYXhEV09SRCA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90Pig0Mjk0OTY3Mjk1VUwpOwotfSAvLyBuYW1lc3BhY2UKLSNlbmRpZgotCi12b2lkIEVyc2F0elBSZWFkKGludCBmZCwgdm9pZCAqdG9fdm9pZCwgc3RkOjpzaXplX3Qgc2l6ZSwgdWludDY0X3Qgb2ZmKSB7Ci0gIHVpbnQ4X3QgKnRvID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KHRvX3ZvaWQpOwotICB3aGlsZSAoc2l6ZSkgewotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKLSAgICAvKiBCUk9LRU46IGNoYW5nZXMgZmlsZSBwb2ludGVyLiAgRXZlbiBpZiB5b3Ugc2F2ZSBpdCBhbmQgY2hhbmdlIGl0IGJhY2ssIGl0IHdvbid0IGJlIHNhZmUgdG8gdXNlIGNvbmN1cnJlbnRseSB3aXRoIHdyaXRlKCkgb3IgcmVhZCgpIHdoaWNoIGxtcGx6IGRvZXMuICovCi0gICAgLy8gc2l6ZV90IG1pZ2h0IGJlIDY0LWJpdC4gIERXT1JEIGlzIGFsd2F5cyAzMi4KLSAgICBEV09SRCByZWFkaW5nID0gc3RhdGljX2Nhc3Q8RFdPUkQ+KHN0ZDo6bWluPHN0ZDo6c2l6ZV90PihrTWF4RFdPUkQsIHNpemUpKTsKLSAgICBEV09SRCByZXQ7Ci0gICAgT1ZFUkxBUFBFRCBvdmVybGFwcGVkOwotICAgIG1lbXNldCgmb3ZlcmxhcHBlZCwgMCwgc2l6ZW9mKE9WRVJMQVBQRUQpKTsKLSAgICBvdmVybGFwcGVkLk9mZnNldCA9IHN0YXRpY19jYXN0PERXT1JEPihvZmYpOwotICAgIG92ZXJsYXBwZWQuT2Zmc2V0SGlnaCA9IHN0YXRpY19jYXN0PERXT1JEPihvZmYgPj4gMzIpOwotICAgIFVUSUxfVEhST1dfSUYoIVJlYWRGaWxlKChIQU5ETEUpX2dldF9vc2ZoYW5kbGUoZmQpLCB0bywgcmVhZGluZywgJnJldCwgJm92ZXJsYXBwZWQpLCBFeGNlcHRpb24sICJSZWFkRmlsZSBmYWlsZWQgZm9yIG9mZnNldCAiIDw8IG9mZik7Ci0jZWxzZQotICAgIHNzaXplX3QgcmV0OwotICAgIGVycm5vID0gMDsKLSAgICByZXQgPQotI2lmZGVmIE9TX0FORFJPSUQKLSAgICAgIHByZWFkNjQKLSNlbHNlCi0gICAgICBwcmVhZAotI2VuZGlmCi0gICAgICAoZmQsIHRvLCBHdWFyZExhcmdlKHNpemUpLCBvZmYpOwotICAgIGlmIChyZXQgPD0gMCkgewotICAgICAgaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikgY29udGludWU7Ci0gICAgICBVVElMX1RIUk9XX0lGKHJldCA9PSAwLCBFbmRPZkZpbGVFeGNlcHRpb24sICIgZm9yIHJlYWRpbmcgIiA8PCBzaXplIDw8ICIgYnl0ZXMgYXQgIiA8PCBvZmYgPDwgIiBmcm9tICIgPDwgTmFtZUZyb21GRChmZCkpOwotICAgICAgVVRJTF9USFJPV19BUkcoRkRFeGNlcHRpb24sIChmZCksICJ3aGlsZSByZWFkaW5nICIgPDwgc2l6ZSA8PCAiIGJ5dGVzIGF0IG9mZnNldCAiIDw8IG9mZik7Ci0gICAgfQotI2VuZGlmCi0gICAgc2l6ZSAtPSByZXQ7Ci0gICAgb2ZmICs9IHJldDsKLSAgICB0byArPSByZXQ7Ci0gIH0KLX0KLQotdm9pZCBFcnNhdHpQV3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpmcm9tX3ZvaWQsIHN0ZDo6c2l6ZV90IHNpemUsIHVpbnQ2NF90IG9mZikgewotICBjb25zdCB1aW50OF90ICpmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGZyb21fdm9pZCk7Ci0gIHdoaWxlKHNpemUpIHsKLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0gICAgLyogQ2hhbmdlcyBmaWxlIHBvaW50ZXIuICBFdmVuIGlmIHlvdSBzYXZlIGl0IGFuZCBjaGFuZ2UgaXQgYmFjaywgaXQgd29uJ3QgYmUgc2FmZSB0byB1c2UgY29uY3VycmVudGx5IHdpdGggd3JpdGUoKSBvciByZWFkKCkgKi8KLSAgICAvLyBzaXplX3QgbWlnaHQgYmUgNjQtYml0LiAgRFdPUkQgaXMgYWx3YXlzIDMyLgotICAgIERXT1JEIHdyaXRpbmcgPSBzdGF0aWNfY2FzdDxEV09SRD4oc3RkOjptaW48c3RkOjpzaXplX3Q+KGtNYXhEV09SRCwgc2l6ZSkpOwotICAgIERXT1JEIHJldDsKLSAgICBPVkVSTEFQUEVEIG92ZXJsYXBwZWQ7Ci0gICAgbWVtc2V0KCZvdmVybGFwcGVkLCAwLCBzaXplb2YoT1ZFUkxBUFBFRCkpOwotICAgIG92ZXJsYXBwZWQuT2Zmc2V0ID0gc3RhdGljX2Nhc3Q8RFdPUkQ+KG9mZik7Ci0gICAgb3ZlcmxhcHBlZC5PZmZzZXRIaWdoID0gc3RhdGljX2Nhc3Q8RFdPUkQ+KG9mZiA+PiAzMik7Ci0gICAgVVRJTF9USFJPV19JRighV3JpdGVGaWxlKChIQU5ETEUpX2dldF9vc2ZoYW5kbGUoZmQpLCBmcm9tLCB3cml0aW5nLCAmcmV0LCAmb3ZlcmxhcHBlZCksIEV4Y2VwdGlvbiwgIldyaXRlRmlsZSBmYWlsZWQgZm9yIG9mZnNldCAiIDw8IG9mZik7Ci0jZWxzZQotICAgIHNzaXplX3QgcmV0OwotICAgIGVycm5vID0gMDsKLSAgICByZXQgPQotI2lmZGVmIE9TX0FORFJPSUQKLSAgICAgIHB3cml0ZTY0Ci0jZWxzZQotICAgICAgcHdyaXRlCi0jZW5kaWYKLSAgICAgIChmZCwgZnJvbSwgR3VhcmRMYXJnZShzaXplKSwgb2ZmKTsKLSAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgIGlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpIGNvbnRpbnVlOwotICAgICAgVVRJTF9USFJPV19JRihyZXQgPT0gMCwgRW5kT2ZGaWxlRXhjZXB0aW9uLCAiIGZvciB3cml0aW5nICIgPDwgc2l6ZSA8PCAiIGJ5dGVzIGF0ICIgPDwgb2ZmIDw8ICIgZnJvbSAiIDw8IE5hbWVGcm9tRkQoZmQpKTsKLSAgICAgIFVUSUxfVEhST1dfQVJHKEZERXhjZXB0aW9uLCAoZmQpLCAid2hpbGUgd3JpdGluZyAiIDw8IHNpemUgPDwgIiBieXRlcyBhdCBvZmZzZXQgIiA8PCBvZmYpOwotICAgIH0KLSNlbmRpZgotICAgIHNpemUgLT0gcmV0OwotICAgIG9mZiArPSByZXQ7Ci0gICAgZnJvbSArPSByZXQ7Ci0gIH0KLX0KLQotCi12b2lkIEZTeW5jT3JUaHJvdyhpbnQgZmQpIHsKLS8vIEFwcGFyZW50bHkgd2luZG93cyBkb2Vzbid0IGhhdmUgZnN5bmM/Ci0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpCi0gIFVUSUxfVEhST1dfSUZfQVJHKC0xID09IGZzeW5jKGZkKSwgRkRFeGNlcHRpb24sIChmZCksICJ3aGlsZSBzeW5jaW5nIik7Ci0jZW5kaWYKLX0KLQotbmFtZXNwYWNlIHsKLQotLy8gU3RhdGljIGFzc2VydCBmb3IgNjQtYml0IG9mZl90IHNpemUuCi0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpICYmICFkZWZpbmVkKE9TX0FORFJPSUQpCi10ZW1wbGF0ZSA8dW5zaWduZWQ+IHN0cnVjdCBDaGVja09mZlQ7Ci10ZW1wbGF0ZSA8PiBzdHJ1Y3QgQ2hlY2tPZmZUPDg+IHsKLSAgc3RydWN0IFRydWUge307Ci19OwotLy8gSWYgdGhlcmUncyBhIGNvbXBpbGVyIGVycm9yIG9uIHRoZSBuZXh0IGxpbmUsIHRoZW4gb2ZmX3QgaXNuJ3QgNjQgYml0LiAgQW5kCi0vLyB0aGF0IG1ha2VzIG1lIGEgc2FkIHBhbmRhLgotdHlwZWRlZiBDaGVja09mZlQ8c2l6ZW9mKG9mZl90KT46OlRydWUgSWdub3JlZFR5cGU7Ci0jZW5kaWYKLQotLy8gQ2FuJ3Qgd2UgYWxsIGp1c3QgZ2V0IGFsb25nPwotdm9pZCBJbnRlcm5hbFNlZWsoaW50IGZkLCBpbnQ2NF90IG9mZiwgaW50IHdoZW5jZSkgewotICBpZiAoCi0jaWYgZGVmaW5lZCBfX01JTkdXMzJfXwotICAgIC8vIERvZXMgdGhpcyBoYW5kbGUgNjQtYml0PwotICAgIChvZmZfdCktMSA9PSBsc2VlayhmZCwgb2ZmLCB3aGVuY2UpCi0jZWxpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0gICAgKF9faW50NjQpLTEgPT0gX2xzZWVraTY0KGZkLCBvZmYsIHdoZW5jZSkKLSNlbGlmIGRlZmluZWQoT1NfQU5EUk9JRCkKLSAgICAob2ZmNjRfdCktMSA9PSBsc2VlazY0KGZkLCBvZmYsIHdoZW5jZSkKLSNlbHNlCi0gICAgKG9mZl90KS0xID09IGxzZWVrKGZkLCBvZmYsIHdoZW5jZSkKLSNlbmRpZgotICApIFVUSUxfVEhST1dfQVJHKEZERXhjZXB0aW9uLCAoZmQpLCAid2hpbGUgc2Vla2luZyB0byAiIDw8IG9mZiA8PCAiIHdoZW5jZSAiIDw8IHdoZW5jZSk7Ci19Ci19IC8vIG5hbWVzcGFjZQotCi12b2lkIFNlZWtPclRocm93KGludCBmZCwgdWludDY0X3Qgb2ZmKSB7Ci0gIEludGVybmFsU2VlayhmZCwgb2ZmLCBTRUVLX1NFVCk7Ci19Ci0KLXZvaWQgQWR2YW5jZU9yVGhyb3coaW50IGZkLCBpbnQ2NF90IG9mZikgewotICBJbnRlcm5hbFNlZWsoZmQsIG9mZiwgU0VFS19DVVIpOwotfQotCi12b2lkIFNlZWtFbmQoaW50IGZkKSB7Ci0gIEludGVybmFsU2VlayhmZCwgMCwgU0VFS19FTkQpOwotfQotCi1zdGQ6OkZJTEUgKkZET3Blbk9yVGhyb3coc2NvcGVkX2ZkICZmaWxlKSB7Ci0gIHN0ZDo6RklMRSAqcmV0ID0gZmRvcGVuKGZpbGUuZ2V0KCksICJyK2IiKTsKLSAgVVRJTF9USFJPV19JRl9BUkcoIXJldCwgRkRFeGNlcHRpb24sIChmaWxlLmdldCgpKSwgIkNvdWxkIG5vdCBmZG9wZW4gZm9yIHdyaXRlIik7Ci0gIGZpbGUucmVsZWFzZSgpOwotICByZXR1cm4gcmV0OwotfQotCi1zdGQ6OkZJTEUgKkZET3BlblJlYWRPclRocm93KHNjb3BlZF9mZCAmZmlsZSkgewotICBzdGQ6OkZJTEUgKnJldCA9IGZkb3BlbihmaWxlLmdldCgpLCAicmIiKTsKLSAgVVRJTF9USFJPV19JRl9BUkcoIXJldCwgRkRFeGNlcHRpb24sIChmaWxlLmdldCgpKSwgIkNvdWxkIG5vdCBmZG9wZW4gZm9yIHJlYWQiKTsKLSAgZmlsZS5yZWxlYXNlKCk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8vIFNpZ2guICBXaW5kb3dzIHRlbXBvcmFyeSBmaWxlIGNyZWF0aW9uIGlzIGZ1bGwgb2YgcmFjZSBjb25kaXRpb25zLgotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKLS8qIG1rc3RlbXAgZXh0cmFjdGVkIGZyb20gbGliYy9zeXNkZXBzL3Bvc2l4L3RlbXBuYW1lLmMuICBDb3B5cmlnaHQKLSAgIChDKSAxOTkxLTE5OTksIDIwMDAsIDIwMDEsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICovCi0KLS8qIFRoaXMgaGFzIGJlZW4gbW9kaWZpZWQgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbiB0byByZW5hbWUgdGhlIGZ1bmN0aW9uIGFuZAotICogc2V0IHRoZSBXaW5kb3dzIHRlbXBvcmFyeSBmbGFnLiAqLwotCi1zdGF0aWMgY29uc3QgY2hhciBsZXR0ZXJzW10gPQotImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IjsKLQotLyogR2VuZXJhdGUgYSB0ZW1wb3JhcnkgZmlsZSBuYW1lIGJhc2VkIG9uIFRNUEwuICBUTVBMIG11c3QgbWF0Y2ggdGhlCi0gICBydWxlcyBmb3IgbWtbc110ZW1wIChpLmUuIGVuZCBpbiAiWFhYWFhYIikuICBUaGUgbmFtZSBjb25zdHJ1Y3RlZAotICAgZG9lcyBub3QgZXhpc3QgYXQgdGhlIHRpbWUgb2YgdGhlIGNhbGwgdG8gbWtzdGVtcC4gIFRNUEwgaXMKLSAgIG92ZXJ3cml0dGVuIHdpdGggdGhlIHJlc3VsdC4gICovCi1pbnQKLW1rc3RlbXBfYW5kX3VubGluayhjaGFyICp0bXBsKQotewotICBpbnQgbGVuOwotICBjaGFyICpYWFhYWFg7Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWU7Ci0gIHVuc2lnbmVkIGxvbmcgbG9uZyByYW5kb21fdGltZV9iaXRzOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGludCBmZCA9IC0xOwotICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwotCi0gIC8qIEEgbG93ZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiB0ZW1wb3JhcnkgZmlsZXMgdG8gYXR0ZW1wdCB0bwotICAgICBnZW5lcmF0ZS4gIFRoZSBtYXhpbXVtIHRvdGFsIG51bWJlciBvZiB0ZW1wb3JhcnkgZmlsZSBuYW1lcyB0aGF0Ci0gICAgIGNhbiBleGlzdCBmb3IgYSBnaXZlbiB0ZW1wbGF0ZSBpcyA2MioqNi4gIEl0IHNob3VsZCBuZXZlciBiZQotICAgICBuZWNlc3NhcnkgdG8gdHJ5IGFsbCB0aGVzZSBjb21iaW5hdGlvbnMuICBJbnN0ZWFkIGlmIGEgcmVhc29uYWJsZQotICAgICBudW1iZXIgb2YgbmFtZXMgaXMgdHJpZWQgKHdlIGRlZmluZSByZWFzb25hYmxlIGFzIDYyKiozKSBmYWlsIHRvCi0gICAgIGdpdmUgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHRoZSBjaGFuY2UgdG8gcmVtb3ZlIHRoZSBwcm9ibGVtcy4gICovCi0jZGVmaW5lIEFUVEVNUFRTX01JTiAoNjIgKiA2MiAqIDYyKQotCi0gIC8qIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gYXR0ZW1wdCB0byBnZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlLiAgVG8KLSAgICAgY29uZm9ybSB0byBQT1NJWCwgdGhpcyBtdXN0IGJlIG5vIHNtYWxsZXIgdGhhbiBUTVBfTUFYLiAgKi8KLSNpZiBBVFRFTVBUU19NSU4gPCBUTVBfTUFYCi0gIHVuc2lnbmVkIGludCBhdHRlbXB0cyA9IFRNUF9NQVg7Ci0jZWxzZQotICB1bnNpZ25lZCBpbnQgYXR0ZW1wdHMgPSBBVFRFTVBUU19NSU47Ci0jZW5kaWYKLQotICBsZW4gPSBzdHJsZW4gKHRtcGwpOwotICBpZiAobGVuIDwgNiB8fCBzdHJjbXAgKCZ0bXBsW2xlbiAtIDZdLCAiWFhYWFhYIikpCi0gICAgewotICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0vKiBUaGlzIGlzIHdoZXJlIHRoZSBYcyBzdGFydC4gICovCi0gIFhYWFhYWCA9ICZ0bXBsW2xlbiAtIDZdOwotCi0gIC8qIEdldCBzb21lIG1vcmUgb3IgbGVzcyByYW5kb20gZGF0YS4gICovCi0gIHsKLSAgICBTWVNURU1USU1FICAgICAgc3ROb3c7Ci0gICAgRklMRVRJTUUgZnROb3c7Ci0KLSAgICAvLyBnZXQgc3lzdGVtIHRpbWUKLSAgICBHZXRTeXN0ZW1UaW1lKCZzdE5vdyk7Ci0gICAgc3ROb3cud01pbGxpc2Vjb25kcyA9IDUwMDsKLSAgICBpZiAoIVN5c3RlbVRpbWVUb0ZpbGVUaW1lKCZzdE5vdywgJmZ0Tm93KSkKLSAgICB7Ci0gICAgICAgIGVycm5vID0gLTE7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByYW5kb21fdGltZV9iaXRzID0gKCgodW5zaWduZWQgbG9uZyBsb25nKWZ0Tm93LmR3SGlnaERhdGVUaW1lIDw8IDMyKQotICAgICAgICAgICAgICAgICAgICAgICAgfCAodW5zaWduZWQgbG9uZyBsb25nKWZ0Tm93LmR3TG93RGF0ZVRpbWUpOwotICB9Ci0gIHZhbHVlICs9IHJhbmRvbV90aW1lX2JpdHMgXiAodW5zaWduZWQgbG9uZyBsb25nKUdldEN1cnJlbnRUaHJlYWRJZCAoKTsKLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBhdHRlbXB0czsgdmFsdWUgKz0gNzc3NywgKytjb3VudCkKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2ID0gdmFsdWU7Ci0KLSAgICAvKiBGaWxsIGluIHRoZSByYW5kb20gYml0cy4gICovCi0gICAgWFhYWFhYWzBdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgIHYgLz0gNjI7Ci0gICAgWFhYWFhYWzFdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgIHYgLz0gNjI7Ci0gICAgWFhYWFhYWzJdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgIHYgLz0gNjI7Ci0gICAgWFhYWFhYWzNdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgIHYgLz0gNjI7Ci0gICAgWFhYWFhYWzRdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgIHYgLz0gNjI7Ci0gICAgWFhYWFhYWzVdID0gbGV0dGVyc1t2ICUgNjJdOwotCi0gICAgLyogTW9kaWZpZWQgZm9yIHdpbmRvd3MgYW5kIHRvIHVubGluayAqLwotICAgIC8vICAgICAgZmQgPSBvcGVuICh0bXBsLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19FWENMLCBfU19JUkVBRCB8IF9TX0lXUklURSk7Ci0gICAgaW50IGZsYWdzID0gX09fUkRXUiB8IF9PX0NSRUFUIHwgX09fRVhDTCB8IF9PX0JJTkFSWTsKLSAgICBmbGFncyB8PSBfT19URU1QT1JBUlk7Ci0gICAgZmQgPSBfb3BlbiAodG1wbCwgZmxhZ3MsIF9TX0lSRUFEIHwgX1NfSVdSSVRFKTsKLSAgICBpZiAoZmQgPj0gMCkKLSAgICB7Ci0gICAgICBlcnJubyA9IHNhdmVfZXJybm87Ci0gICAgICByZXR1cm4gZmQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm5vICE9IEVFWElTVCkKLSAgICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8qIFdlIGdvdCBvdXQgb2YgdGhlIGxvb3AgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIGNvbWJpbmF0aW9ucyB0byB0cnkuICAqLwotICBlcnJubyA9IEVFWElTVDsKLSAgcmV0dXJuIC0xOwotfQotI2Vsc2UKLWludAotbWtzdGVtcF9hbmRfdW5saW5rKGNoYXIgKnRtcGwpIHsKLSAgaW50IHJldCA9IG1rc3RlbXAodG1wbCk7Ci0gIGlmIChyZXQgIT0gLTEpIHsKLSAgICBVVElMX1RIUk9XX0lGKHVubGluayh0bXBsKSwgRXJybm9FeGNlcHRpb24sICJ3aGlsZSBkZWxldGluZyBkZWxldGUgIiA8PCB0bXBsKTsKLSAgfQotICByZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KLS8vIElmIGl0J3MgYSBkaXJlY3RvcnksIGFkZCBhIC8uICBUaGlzIGxldHMgdXNlcnMgc2F5IC1UIC90bXAgd2l0aG91dCBjcmVhdGluZwotLy8gL3RtcEFBQUFBQQotdm9pZCBOb3JtYWxpemVUZW1wUHJlZml4KHN0ZDo6c3RyaW5nICZiYXNlKSB7Ci0gIGlmIChiYXNlLmVtcHR5KCkpIHJldHVybjsKLSAgaWYgKGJhc2VbYmFzZS5zaXplKCkgLSAxXSA9PSAnLycpIHJldHVybjsKLSAgc3RydWN0IHN0YXQgc2I7Ci0gIC8vIEl0J3MgZmluZSBmb3IgaXQgdG8gbm90IGV4aXN0LgotICBpZiAoLTEgPT0gc3RhdChiYXNlLmNfc3RyKCksICZzYikpIHJldHVybjsKLSAgaWYgKAotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKLSAgICBzYi5zdF9tb2RlICYgX1NfSUZESVIKLSNlbHNlCi0gICAgU19JU0RJUihzYi5zdF9tb2RlKQotI2VuZGlmCi0gICAgKSBiYXNlICs9ICcvJzsKLX0KLQotaW50IE1ha2VUZW1wKGNvbnN0IFN0cmluZ1BpZWNlICZiYXNlKSB7Ci0gIHN0ZDo6c3RyaW5nIG5hbWUoYmFzZS5kYXRhKCksIGJhc2Uuc2l6ZSgpKTsKLSAgbmFtZSArPSAiWFhYWFhYIjsKLSAgbmFtZS5wdXNoX2JhY2soMCk7Ci0gIGludCByZXQ7Ci0gIFVUSUxfVEhST1dfSUYoLTEgPT0gKHJldCA9IG1rc3RlbXBfYW5kX3VubGluaygmbmFtZVswXSkpLCBFcnJub0V4Y2VwdGlvbiwgIndoaWxlIG1ha2luZyBhIHRlbXBvcmFyeSBiYXNlZCBvbiAiIDw8IGJhc2UpOwotICByZXR1cm4gcmV0OwotfQotCi1zdGQ6OkZJTEUgKkZNYWtlVGVtcChjb25zdCBTdHJpbmdQaWVjZSAmYmFzZSkgewotICB1dGlsOjpzY29wZWRfZmQgZmlsZShNYWtlVGVtcChiYXNlKSk7Ci0gIHJldHVybiBGRE9wZW5PclRocm93KGZpbGUpOwotfQotCi1pbnQgRHVwT3JUaHJvdyhpbnQgZmQpIHsKLSAgaW50IHJldCA9IGR1cChmZCk7Ci0gIFVUSUxfVEhST1dfSUZfQVJHKHJldCA9PSAtMSwgRkRFeGNlcHRpb24sIChmZCksICJpbiBkdXBsaWNhdGluZyB0aGUgZmlsZSBkZXNjcmlwdG9yIik7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0vLyBUcnkgdG8gbmFtZSB0aGluZ3MgYnV0IGJlIHdpbGxpbmcgdG8gZmFpbCB0b28uCi1ib29sIFRyeU5hbWUoaW50IGZkLCBzdGQ6OnN0cmluZyAmb3V0KSB7Ci0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotICByZXR1cm4gZmFsc2U7Ci0jZWxzZQotICBzdGQ6OnN0cmluZyBuYW1lKCIvcHJvYy9zZWxmL2ZkLyIpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29udmVydDsKLSAgY29udmVydCA8PCBmZDsKLSAgbmFtZSArPSBjb252ZXJ0LnN0cigpOwotCi0gIHN0cnVjdCBzdGF0IHNiOwotICBpZiAoLTEgPT0gbHN0YXQobmFtZS5jX3N0cigpLCAmc2IpKQotICAgIHJldHVybiBmYWxzZTsKLSAgb3V0LnJlc2l6ZShzYi5zdF9zaXplICsgMSk7Ci0gIC8vIGxzdGF0IGdhdmUgdXMgYSBzaXplLCBidXQgSSd2ZSBzZWVuIGl0IGdyb3csIHBvc3NpYmx5IGR1ZSB0byBzeW1saW5rcyBvbiB0b3Agb2Ygc3ltbGlua3MuCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgc3NpemVfdCByZXQgPSByZWFkbGluayhuYW1lLmNfc3RyKCksICZvdXRbMF0sIG91dC5zaXplKCkpOwotICAgIGlmICgtMSA9PSByZXQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKChzaXplX3QpcmV0IDwgb3V0LnNpemUoKSkgewotICAgICAgb3V0LnJlc2l6ZShyZXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8vIEV4cG9uZW50aWFsIGdyb3d0aC4KLSAgICBvdXQucmVzaXplKG91dC5zaXplKCkgKiAyKTsKLSAgfQotICAvLyBEb24ndCB1c2UgdGhlIG5vbi1maWxlIG5hbWVzLgotICBpZiAoIW91dC5lbXB0eSgpICYmIG91dFswXSAhPSAnLycpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotfQotfSAvLyBuYW1lc3BhY2UKLQotc3RkOjpzdHJpbmcgTmFtZUZyb21GRChpbnQgZmQpIHsKLSAgc3RkOjpzdHJpbmcgcmV0OwotICBpZiAoVHJ5TmFtZShmZCwgcmV0KSkgcmV0dXJuIHJldDsKLSAgc3dpdGNoIChmZCkgewotICAgIGNhc2UgMDogcmV0dXJuICJzdGRpbiI7Ci0gICAgY2FzZSAxOiByZXR1cm4gInN0ZG91dCI7Ci0gICAgY2FzZSAyOiByZXR1cm4gInN0ZGVyciI7Ci0gIH0KLSAgcmV0ID0gImZkICI7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb252ZXJ0OwotICBjb252ZXJ0IDw8IGZkOwotICByZXQgKz0gY29udmVydC5zdHIoKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZmlsZS5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2ZpbGUuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMDRiNmEuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZmlsZS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jaWZuZGVmIFVUSUxfRklMRV9ICi0jZGVmaW5lIFVUSUxfRklMRV9ICi0KLSNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKLSNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmluZ19waWVjZS5oaCIKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgdXRpbCB7Ci0KLWNsYXNzIHNjb3BlZF9mZCB7Ci0gIHB1YmxpYzoKLSAgICBzY29wZWRfZmQoKSA6IGZkXygtMSkge30KLQotICAgIGV4cGxpY2l0IHNjb3BlZF9mZChpbnQgZmQpIDogZmRfKGZkKSB7fQotCi0gICAgfnNjb3BlZF9mZCgpOwotCi0gICAgdm9pZCByZXNldChpbnQgdG8gPSAtMSkgewotICAgICAgc2NvcGVkX2ZkIG90aGVyKGZkXyk7Ci0gICAgICBmZF8gPSB0bzsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0KCkgY29uc3QgeyByZXR1cm4gZmRfOyB9Ci0KLSAgICBpbnQgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gZmRfOyB9Ci0KLSAgICBpbnQgcmVsZWFzZSgpIHsKLSAgICAgIGludCByZXQgPSBmZF87Ci0gICAgICBmZF8gPSAtMTsKLSAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgaW50IGZkXzsKLQotICAgIHNjb3BlZF9mZChjb25zdCBzY29wZWRfZmQgJik7Ci0gICAgc2NvcGVkX2ZkICZvcGVyYXRvcj0oY29uc3Qgc2NvcGVkX2ZkICYpOwotfTsKLQotc3RydWN0IHNjb3BlZF9GSUxFX2Nsb3NlciB7Ci0gIHN0YXRpYyB2b2lkIENsb3NlKHN0ZDo6RklMRSAqZmlsZSk7Ci19OwotdHlwZWRlZiBzY29wZWQ8c3RkOjpGSUxFLCBzY29wZWRfRklMRV9jbG9zZXI+IHNjb3BlZF9GSUxFOwotCi0vKiBUaHJvd24gZm9yIGFueSBvcGVyYXRpb24gd2hlcmUgdGhlIGZkIGlzIGtub3duLiAqLwotY2xhc3MgRkRFeGNlcHRpb24gOiBwdWJsaWMgRXJybm9FeGNlcHRpb24gewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgRkRFeGNlcHRpb24oaW50IGZkKSB0aHJvdygpOwotCi0gICAgdmlydHVhbCB+RkRFeGNlcHRpb24oKSB0aHJvdygpOwotCi0gICAgLy8gVGhpcyBtYXkgbm8gbG9uZ2VyIGJlIHZhbGlkIGlmIHRoZSBleGNlcHRpb24gd2FzIHRocm93biBwYXN0IG9wZW4uCi0gICAgaW50IEZEKCkgY29uc3QgeyByZXR1cm4gZmRfOyB9Ci0KLSAgICAvLyBHdWVzcyBmcm9tIE5hbWVGcm9tRkQuCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWVHdWVzcygpIGNvbnN0IHsgcmV0dXJuIG5hbWVfZ3Vlc3NfOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBpbnQgZmRfOwotCi0gICAgc3RkOjpzdHJpbmcgbmFtZV9ndWVzc187Ci19OwotCi0vLyBFbmQgb2YgZmlsZSByZWFjaGVkLgotY2xhc3MgRW5kT2ZGaWxlRXhjZXB0aW9uIDogcHVibGljIEV4Y2VwdGlvbiB7Ci0gIHB1YmxpYzoKLSAgICBFbmRPZkZpbGVFeGNlcHRpb24oKSB0aHJvdygpOwotICAgIH5FbmRPZkZpbGVFeGNlcHRpb24oKSB0aHJvdygpOwotfTsKLQotLy8gT3BlbiBmb3IgcmVhZCBvbmx5LiAgCi1pbnQgT3BlblJlYWRPclRocm93KGNvbnN0IGNoYXIgKm5hbWUpOwotLy8gQ3JlYXRlIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdCwgdHJ1bmNhdGUgaWYgaXQgZG9lcy4gIE9wZW5lZCBmb3Igd3JpdGUuICAgCi1pbnQgQ3JlYXRlT3JUaHJvdyhjb25zdCBjaGFyICpuYW1lKTsKLQotLy8gUmV0dXJuIHZhbHVlIGZvciBTaXplRmlsZSB3aGVuIGl0IGNhbid0IHNpemUgcHJvcGVybHkuICAKLWNvbnN0IHVpbnQ2NF90IGtCYWRTaXplID0gKHVpbnQ2NF90KS0xOwotdWludDY0X3QgU2l6ZUZpbGUoaW50IGZkKTsKLXVpbnQ2NF90IFNpemVPclRocm93KGludCBmZCk7Ci0KLXZvaWQgUmVzaXplT3JUaHJvdyhpbnQgZmQsIHVpbnQ2NF90IHRvKTsKLQotc3RkOjpzaXplX3QgUGFydGlhbFJlYWQoaW50IGZkLCB2b2lkICp0bywgc3RkOjpzaXplX3Qgc2l6ZSk7Ci12b2lkIFJlYWRPclRocm93KGludCBmZCwgdm9pZCAqdG8sIHN0ZDo6c2l6ZV90IHNpemUpOwotc3RkOjpzaXplX3QgUmVhZE9yRU9GKGludCBmZCwgdm9pZCAqdG9fdm9pZCwgc3RkOjpzaXplX3Qgc2l6ZSk7Ci0KLXZvaWQgV3JpdGVPclRocm93KGludCBmZCwgY29uc3Qgdm9pZCAqZGF0YV92b2lkLCBzdGQ6OnNpemVfdCBzaXplKTsKLXZvaWQgV3JpdGVPclRocm93KEZJTEUgKnRvLCBjb25zdCB2b2lkICpkYXRhLCBzdGQ6OnNpemVfdCBzaXplKTsKLQotLyogVGhlc2UgY2FsbCBwcmVhZC9wd3JpdGUgaW4gYSBsb29wLiAgSG93ZXZlciwgb24gV2luZG93cyB0aGV5IGNhbGwgUmVhZEZpbGUvCi0gKiBXcml0ZUZpbGUgd2hpY2ggY2hhbmdlcyB0aGUgZmlsZSBwb2ludGVyLiAgU28gaXQncyBzYWZlIHRvIGNhbGwgRXJzYXR6UFJlYWQKLSAqIGFuZCBFcnNhdHpQV3JpdGUgY29uY3VycmVudGx5IChvciBhbnkgY29tYmluYXRpb24gdGhlcmVvZikuICBCdXQgaXQgY2hhbmdlcwotICogdGhlIGZpbGUgcG9pbnRlciBvbiB3aW5kb3dzLCBzbyBpdCdzIG5vdCBzYWZlIHRvIGNhbGwgY29uY3VycmVudGx5IHdpdGgKLSAqIGFueXRoaW5nIHRoYXQgdXNlcyB0aGUgaW1wbGljaXQgZmlsZSBwb2ludGVyIGUuZy4gdGhlIFJlYWQvV3JpdGUgZnVuY3Rpb25zCi0gKiBhYm92ZS4KLSAqLwotdm9pZCBFcnNhdHpQUmVhZChpbnQgZmQsIHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBzaXplLCB1aW50NjRfdCBvZmYpOwotdm9pZCBFcnNhdHpQV3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpkYXRhX3ZvaWQsIHN0ZDo6c2l6ZV90IHNpemUsIHVpbnQ2NF90IG9mZik7Ci0KLXZvaWQgRlN5bmNPclRocm93KGludCBmZCk7Ci0KLS8vIFNlZWtpbmcKLXZvaWQgU2Vla09yVGhyb3coaW50IGZkLCB1aW50NjRfdCBvZmYpOwotdm9pZCBBZHZhbmNlT3JUaHJvdyhpbnQgZmQsIGludDY0X3Qgb2ZmKTsKLXZvaWQgU2Vla0VuZChpbnQgZmQpOwotCi1zdGQ6OkZJTEUgKkZET3Blbk9yVGhyb3coc2NvcGVkX2ZkICZmaWxlKTsKLXN0ZDo6RklMRSAqRkRPcGVuUmVhZE9yVGhyb3coc2NvcGVkX2ZkICZmaWxlKTsKLQotLy8gVGVtcG9yYXJ5IGZpbGVzCi0vLyBBcHBlbmQgYSAvIGlmIGJhc2UgaXMgYSBkaXJlY3RvcnkuCi12b2lkIE5vcm1hbGl6ZVRlbXBQcmVmaXgoc3RkOjpzdHJpbmcgJmJhc2UpOwotaW50IE1ha2VUZW1wKGNvbnN0IFN0cmluZ1BpZWNlICZwcmVmaXgpOwotc3RkOjpGSUxFICpGTWFrZVRlbXAoY29uc3QgU3RyaW5nUGllY2UgJnByZWZpeCk7Ci0KLS8vIGR1cCBhbiBmZC4KLWludCBEdXBPclRocm93KGludCBmZCk7Ci0KLS8qIEF0dGVtcHQgZ2V0IGZpbGUgbmFtZSBmcm9tIGZkLiAgVGhpcyB3b24ndCBhbHdheXMgd29yayAoaS5lLiBvbiBXaW5kb3dzIG9yCi0gKiBhIHBpcGUpLiAgVGhlIGZpbGUgbWlnaHQgaGF2ZSBiZWVuIHJlbmFtZWQuICBJdCdzIGludGVuZGVkIGZvciBkaWFnbm9zdGljcwotICogYW5kIGxvZ2dpbmcgb25seS4KLSAqLwotc3RkOjpzdHJpbmcgTmFtZUZyb21GRChpbnQgZmQpOwotCi19IC8vIG5hbWVzcGFjZSB1dGlsCi0KLSNlbmRpZiAvLyBVVElMX0ZJTEVfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZmlsZV9waWVjZS5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2ZpbGVfcGllY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYWEyNTAuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZmlsZV9waWVjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0jaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgotCi0jaW5jbHVkZSAidXRpbC9kb3VibGUtY29udmVyc2lvbi9kb3VibGUtY29udmVyc2lvbi5oIgotI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgotI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKLSNpbmNsdWRlICJ1dGlsL21tYXAuaGgiCi0KLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0jaW5jbHVkZSA8aW8uaD4KLSNlbHNlCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLQotUGFyc2VOdW1iZXJFeGNlcHRpb246OlBhcnNlTnVtYmVyRXhjZXB0aW9uKFN0cmluZ1BpZWNlIHZhbHVlKSB0aHJvdygpIHsKLSAgKnRoaXMgPDwgIkNvdWxkIG5vdCBwYXJzZSBcIiIgPDwgdmFsdWUgPDwgIlwiIGludG8gYSBudW1iZXIiOwotfQotCi0vLyBTaWdoIHRoaXMgaXMgdGhlIG9ubHkgd2F5IEkgY291bGQgY29tZSB1cCB3aXRoIHRvIGRvIGEgX2NvbnN0XyBib29sLiAgSXQgaGFzICcgJywgJ1xmJywgJ1xuJywgJ1xyJywgJ1x0JywgYW5kICdcdicgKHNhbWUgYXMgaXNzcGFjZSBvbiBDIGxvY2FsZSkuIAotY29uc3QgYm9vbCBrU3BhY2VzWzI1Nl0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07Ci0KLUZpbGVQaWVjZTo6RmlsZVBpZWNlKGNvbnN0IGNoYXIgKm5hbWUsIHN0ZDo6b3N0cmVhbSAqc2hvd19wcm9ncmVzcywgc3RkOjpzaXplX3QgbWluX2J1ZmZlcikgOiAKLSAgZmlsZV8oT3BlblJlYWRPclRocm93KG5hbWUpKSwgdG90YWxfc2l6ZV8oU2l6ZUZpbGUoZmlsZV8uZ2V0KCkpKSwgcGFnZV8oU2l6ZVBhZ2UoKSksCi0gIHByb2dyZXNzXyh0b3RhbF9zaXplXywgdG90YWxfc2l6ZV8gPT0ga0JhZFNpemUgPyBOVUxMIDogc2hvd19wcm9ncmVzcywgc3RkOjpzdHJpbmcoIlJlYWRpbmcgIikgKyBuYW1lKSB7Ci0gIEluaXRpYWxpemUobmFtZSwgc2hvd19wcm9ncmVzcywgbWluX2J1ZmZlcik7Ci19Ci0KLW5hbWVzcGFjZSB7Ci1zdGQ6OnN0cmluZyBOYW1lUG9zc2libHlGaW5kKGludCBmZCwgY29uc3QgY2hhciAqbmFtZSkgewotICBpZiAobmFtZSkgcmV0dXJuIG5hbWU7Ci0gIHJldHVybiBOYW1lRnJvbUZEKGZkKTsKLX0KLX0gLy8gbmFtZXNwYWNlCi0KLUZpbGVQaWVjZTo6RmlsZVBpZWNlKGludCBmZCwgY29uc3QgY2hhciAqbmFtZSwgc3RkOjpvc3RyZWFtICpzaG93X3Byb2dyZXNzLCBzdGQ6OnNpemVfdCBtaW5fYnVmZmVyKSA6IAotICBmaWxlXyhmZCksIHRvdGFsX3NpemVfKFNpemVGaWxlKGZpbGVfLmdldCgpKSksIHBhZ2VfKFNpemVQYWdlKCkpLAotICBwcm9ncmVzc18odG90YWxfc2l6ZV8sIHRvdGFsX3NpemVfID09IGtCYWRTaXplID8gTlVMTCA6IHNob3dfcHJvZ3Jlc3MsIHN0ZDo6c3RyaW5nKCJSZWFkaW5nICIpICsgTmFtZVBvc3NpYmx5RmluZChmZCwgbmFtZSkpIHsKLSAgSW5pdGlhbGl6ZShOYW1lUG9zc2libHlGaW5kKGZkLCBuYW1lKS5jX3N0cigpLCBzaG93X3Byb2dyZXNzLCBtaW5fYnVmZmVyKTsKLX0KLQotRmlsZVBpZWNlOjpGaWxlUGllY2Uoc3RkOjppc3RyZWFtICZzdHJlYW0sIGNvbnN0IGNoYXIgKm5hbWUsIHN0ZDo6c2l6ZV90IG1pbl9idWZmZXIpIDoKLSAgdG90YWxfc2l6ZV8oa0JhZFNpemUpLCBwYWdlXyhTaXplUGFnZSgpKSB7Ci0gIEluaXRpYWxpemVOb1JlYWQoImlzdHJlYW0iLCBtaW5fYnVmZmVyKTsKLQotICBmYWxsYmFja190b19yZWFkXyA9IHRydWU7Ci0gIGRhdGFfLnJlc2V0KE1hbGxvY09yVGhyb3coZGVmYXVsdF9tYXBfc2l6ZV8pLCBkZWZhdWx0X21hcF9zaXplXywgc2NvcGVkX21lbW9yeTo6TUFMTE9DX0FMTE9DQVRFRCk7Ci0gIHBvc2l0aW9uXyA9IGRhdGFfLmJlZ2luKCk7Ci0gIHBvc2l0aW9uX2VuZF8gPSBwb3NpdGlvbl87Ci0gIAotICBmZWxsX2JhY2tfLlJlc2V0KHN0cmVhbSk7Ci19Ci0KLUZpbGVQaWVjZTo6fkZpbGVQaWVjZSgpIHt9Ci0KLVN0cmluZ1BpZWNlIEZpbGVQaWVjZTo6UmVhZExpbmUoY2hhciBkZWxpbSkgewotICBzdGQ6OnNpemVfdCBza2lwID0gMDsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBmb3IgKGNvbnN0IGNoYXIgKmkgPSBwb3NpdGlvbl8gKyBza2lwOyBpIDwgcG9zaXRpb25fZW5kXzsgKytpKSB7Ci0gICAgICBpZiAoKmkgPT0gZGVsaW0pIHsKLSAgICAgICAgU3RyaW5nUGllY2UgcmV0KHBvc2l0aW9uXywgaSAtIHBvc2l0aW9uXyk7Ci0gICAgICAgIHBvc2l0aW9uXyA9IGkgKyAxOwotICAgICAgICByZXR1cm4gcmV0OwotICAgICAgfQotICAgIH0KLSAgICBpZiAoYXRfZW5kXykgewotICAgICAgaWYgKHBvc2l0aW9uXyA9PSBwb3NpdGlvbl9lbmRfKSB7Ci0gICAgICAgIFNoaWZ0KCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gQ29uc3VtZShwb3NpdGlvbl9lbmRfKTsKLSAgICB9Ci0gICAgc2tpcCA9IHBvc2l0aW9uX2VuZF8gLSBwb3NpdGlvbl87Ci0gICAgU2hpZnQoKTsKLSAgfQotfQotCi1ib29sIEZpbGVQaWVjZTo6UmVhZExpbmVPckVPRihTdHJpbmdQaWVjZSAmdG8sIGNoYXIgZGVsaW0pIHsKLSAgdHJ5IHsKLSAgICB0byA9IFJlYWRMaW5lKGRlbGltKTsKLSAgfSBjYXRjaCAoY29uc3QgdXRpbDo6RW5kT2ZGaWxlRXhjZXB0aW9uICZlKSB7IHJldHVybiBmYWxzZTsgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotZmxvYXQgRmlsZVBpZWNlOjpSZWFkRmxvYXQoKSB7Ci0gIHJldHVybiBSZWFkTnVtYmVyPGZsb2F0PigpOwotfQotZG91YmxlIEZpbGVQaWVjZTo6UmVhZERvdWJsZSgpIHsKLSAgcmV0dXJuIFJlYWROdW1iZXI8ZG91YmxlPigpOwotfQotbG9uZyBpbnQgRmlsZVBpZWNlOjpSZWFkTG9uZygpIHsKLSAgcmV0dXJuIFJlYWROdW1iZXI8bG9uZyBpbnQ+KCk7Ci19Ci11bnNpZ25lZCBsb25nIGludCBGaWxlUGllY2U6OlJlYWRVTG9uZygpIHsKLSAgcmV0dXJuIFJlYWROdW1iZXI8dW5zaWduZWQgbG9uZyBpbnQ+KCk7Ci19Ci0KLS8vIEZhY3RvcmVkIG91dCBzbyB0aGF0IGlzdHJlYW0gY2FuIGNhbGwgdGhpcy4KLXZvaWQgRmlsZVBpZWNlOjpJbml0aWFsaXplTm9SZWFkKGNvbnN0IGNoYXIgKm5hbWUsIHN0ZDo6c2l6ZV90IG1pbl9idWZmZXIpIHsKLSAgZmlsZV9uYW1lXyA9IG5hbWU7Ci0KLSAgZGVmYXVsdF9tYXBfc2l6ZV8gPSBwYWdlXyAqIHN0ZDo6bWF4PHN0ZDo6c2l6ZV90PigobWluX2J1ZmZlciAvIHBhZ2VfICsgMSksIDIpOwotICBwb3NpdGlvbl8gPSBOVUxMOwotICBwb3NpdGlvbl9lbmRfID0gTlVMTDsKLSAgbWFwcGVkX29mZnNldF8gPSAwOwotICBhdF9lbmRfID0gZmFsc2U7Ci19Ci0KLXZvaWQgRmlsZVBpZWNlOjpJbml0aWFsaXplKGNvbnN0IGNoYXIgKm5hbWUsIHN0ZDo6b3N0cmVhbSAqc2hvd19wcm9ncmVzcywgc3RkOjpzaXplX3QgbWluX2J1ZmZlcikgewotICBJbml0aWFsaXplTm9SZWFkKG5hbWUsIG1pbl9idWZmZXIpOwotCi0gIGlmICh0b3RhbF9zaXplXyA9PSBrQmFkU2l6ZSkgewotICAgIC8vIFNvIHRoZSBhc3NlcnRpb24gcGFzc2VzLiAgCi0gICAgZmFsbGJhY2tfdG9fcmVhZF8gPSBmYWxzZTsKLSAgICBpZiAoc2hvd19wcm9ncmVzcykgCi0gICAgICAqc2hvd19wcm9ncmVzcyA8PCAiRmlsZSAiIDw8IG5hbWUgPDwgIiBpc24ndCBub3JtYWwuICBVc2luZyBzbG93ZXIgcmVhZCgpIGluc3RlYWQgb2YgbW1hcCgpLiAgTm8gcHJvZ3Jlc3MgYmFyLiIgPDwgc3RkOjplbmRsOwotICAgIFRyYW5zaXRpb25Ub1JlYWQoKTsKLSAgfSBlbHNlIHsKLSAgICBmYWxsYmFja190b19yZWFkXyA9IGZhbHNlOwotICB9Ci0gIFNoaWZ0KCk7Ci0gIC8vIGd6aXAgZGV0ZWN0LgotICBpZiAoKHBvc2l0aW9uX2VuZF8gPj0gcG9zaXRpb25fICsgUmVhZENvbXByZXNzZWQ6OmtNYWdpY1NpemUpICYmIFJlYWRDb21wcmVzc2VkOjpEZXRlY3RDb21wcmVzc2VkTWFnaWMocG9zaXRpb25fKSkgewotICAgIGlmICghZmFsbGJhY2tfdG9fcmVhZF8pIHsKLSAgICAgIGF0X2VuZF8gPSBmYWxzZTsKLSAgICAgIFRyYW5zaXRpb25Ub1JlYWQoKTsKLSAgICB9Ci0gIH0KLX0KLQotbmFtZXNwYWNlIHsKLQotc3RhdGljIGNvbnN0IGRvdWJsZV9jb252ZXJzaW9uOjpTdHJpbmdUb0RvdWJsZUNvbnZlcnRlciBrQ29udmVydGVyKAotICAgIGRvdWJsZV9jb252ZXJzaW9uOjpTdHJpbmdUb0RvdWJsZUNvbnZlcnRlcjo6QUxMT1dfVFJBSUxJTkdfSlVOSyB8IGRvdWJsZV9jb252ZXJzaW9uOjpTdHJpbmdUb0RvdWJsZUNvbnZlcnRlcjo6QUxMT1dfTEVBRElOR19TUEFDRVMsCi0gICAgc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKSwKLSAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpLAotICAgICJpbmYiLAotICAgICJOYU4iKTsKLQotdm9pZCBQYXJzZU51bWJlcihjb25zdCBjaGFyICpiZWdpbiwgY29uc3QgY2hhciAqJmVuZCwgZmxvYXQgJm91dCkgewotICBpbnQgY291bnQ7Ci0gIG91dCA9IGtDb252ZXJ0ZXIuU3RyaW5nVG9GbG9hdChiZWdpbiwgZW5kIC0gYmVnaW4sICZjb3VudCk7Ci0gIGVuZCA9IGJlZ2luICsgY291bnQ7Ci19Ci12b2lkIFBhcnNlTnVtYmVyKGNvbnN0IGNoYXIgKmJlZ2luLCBjb25zdCBjaGFyIComZW5kLCBkb3VibGUgJm91dCkgewotICBpbnQgY291bnQ7Ci0gIG91dCA9IGtDb252ZXJ0ZXIuU3RyaW5nVG9Eb3VibGUoYmVnaW4sIGVuZCAtIGJlZ2luLCAmY291bnQpOwotICBlbmQgPSBiZWdpbiArIGNvdW50OwotfQotdm9pZCBQYXJzZU51bWJlcihjb25zdCBjaGFyICpiZWdpbiwgY29uc3QgY2hhciAqJmVuZCwgbG9uZyBpbnQgJm91dCkgewotICBjaGFyICpzaWxseV9lbmQ7Ci0gIG91dCA9IHN0cnRvbChiZWdpbiwgJnNpbGx5X2VuZCwgMTApOwotICBlbmQgPSBzaWxseV9lbmQ7Ci19Ci12b2lkIFBhcnNlTnVtYmVyKGNvbnN0IGNoYXIgKmJlZ2luLCBjb25zdCBjaGFyIComZW5kLCB1bnNpZ25lZCBsb25nIGludCAmb3V0KSB7Ci0gIGNoYXIgKnNpbGx5X2VuZDsKLSAgb3V0ID0gc3RydG91bChiZWdpbiwgJnNpbGx5X2VuZCwgMTApOwotICBlbmQgPSBzaWxseV9lbmQ7Ci19Ci19IC8vIG5hbWVzcGFjZQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4gVCBGaWxlUGllY2U6OlJlYWROdW1iZXIoKSB7Ci0gIFNraXBTcGFjZXMoKTsKLSAgd2hpbGUgKGxhc3Rfc3BhY2VfIDwgcG9zaXRpb25fKSB7Ci0gICAgaWYgKGF0X2VuZF8pIHsKLSAgICAgIC8vIEhhbGx1Y2luYXRlIGEgbnVsbCBvZmYgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcihwb3NpdGlvbl8sIHBvc2l0aW9uX2VuZF8pOwotICAgICAgY29uc3QgY2hhciAqYnVmID0gYnVmZmVyLmNfc3RyKCk7Ci0gICAgICBjb25zdCBjaGFyICplbmQgPSBidWYgKyBidWZmZXIuc2l6ZSgpOwotICAgICAgVCByZXQ7Ci0gICAgICBQYXJzZU51bWJlcihidWYsIGVuZCwgcmV0KTsKLSAgICAgIGlmIChidWYgPT0gZW5kKSB0aHJvdyBQYXJzZU51bWJlckV4Y2VwdGlvbihidWZmZXIpOwotICAgICAgcG9zaXRpb25fICs9IGVuZCAtIGJ1ZjsKLSAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIFNoaWZ0KCk7Ci0gIH0KLSAgY29uc3QgY2hhciAqZW5kID0gbGFzdF9zcGFjZV87Ci0gIFQgcmV0OwotICBQYXJzZU51bWJlcihwb3NpdGlvbl8sIGVuZCwgcmV0KTsKLSAgaWYgKGVuZCA9PSBwb3NpdGlvbl8pIHRocm93IFBhcnNlTnVtYmVyRXhjZXB0aW9uKFJlYWREZWxpbWl0ZWQoKSk7Ci0gIHBvc2l0aW9uXyA9IGVuZDsKLSAgcmV0dXJuIHJldDsKLX0KLQotY29uc3QgY2hhciAqRmlsZVBpZWNlOjpGaW5kRGVsaW1pdGVyT3JFT0YoY29uc3QgYm9vbCAqZGVsaW0pICB7Ci0gIHN0ZDo6c2l6ZV90IHNraXAgPSAwOwotICB3aGlsZSAodHJ1ZSkgewotICAgIGZvciAoY29uc3QgY2hhciAqaSA9IHBvc2l0aW9uXyArIHNraXA7IGkgPCBwb3NpdGlvbl9lbmRfOyArK2kpIHsKLSAgICAgIGlmIChkZWxpbVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigqaSldKSByZXR1cm4gaTsKLSAgICB9Ci0gICAgaWYgKGF0X2VuZF8pIHsKLSAgICAgIGlmIChwb3NpdGlvbl8gPT0gcG9zaXRpb25fZW5kXykgU2hpZnQoKTsKLSAgICAgIHJldHVybiBwb3NpdGlvbl9lbmRfOwotICAgIH0KLSAgICBza2lwID0gcG9zaXRpb25fZW5kXyAtIHBvc2l0aW9uXzsKLSAgICBTaGlmdCgpOwotICB9Ci19Ci0KLXZvaWQgRmlsZVBpZWNlOjpTaGlmdCgpIHsKLSAgaWYgKGF0X2VuZF8pIHsKLSAgICBwcm9ncmVzc18uRmluaXNoZWQoKTsKLSAgICB0aHJvdyBFbmRPZkZpbGVFeGNlcHRpb24oKTsKLSAgfQotICB1aW50NjRfdCBkZXNpcmVkX2JlZ2luID0gcG9zaXRpb25fIC0gZGF0YV8uYmVnaW4oKSArIG1hcHBlZF9vZmZzZXRfOwotCi0gIGlmICghZmFsbGJhY2tfdG9fcmVhZF8pIE1NYXBTaGlmdChkZXNpcmVkX2JlZ2luKTsKLSAgLy8gTm90aWNlIGFuIG1tYXAgZmFpbHVyZSBtaWdodCBzZXQgdGhlIGZhbGxiYWNrLiAgCi0gIGlmIChmYWxsYmFja190b19yZWFkXykgUmVhZFNoaWZ0KCk7Ci0KLSAgZm9yIChsYXN0X3NwYWNlXyA9IHBvc2l0aW9uX2VuZF8gLSAxOyBsYXN0X3NwYWNlXyA+PSBwb3NpdGlvbl87IC0tbGFzdF9zcGFjZV8pIHsKLSAgICBpZiAoa1NwYWNlc1tzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigqbGFzdF9zcGFjZV8pXSkgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgRmlsZVBpZWNlOjpNTWFwU2hpZnQodWludDY0X3QgZGVzaXJlZF9iZWdpbikgewotICAvLyBVc2UgbW1hcC4gIAotICB1aW50NjRfdCBpZ25vcmUgPSBkZXNpcmVkX2JlZ2luICUgcGFnZV87Ci0gIC8vIER1cGxpY2F0ZSByZXF1ZXN0IGZvciBTaGlmdCBtZWFucyBnaXZlIG1vcmUgZGF0YS4gIAotICBpZiAocG9zaXRpb25fID09IGRhdGFfLmJlZ2luKCkgKyBpZ25vcmUgJiYgcG9zaXRpb25fKSB7Ci0gICAgZGVmYXVsdF9tYXBfc2l6ZV8gKj0gMjsKLSAgfQotICAvLyBMb2NhbCB2ZXJzaW9uIHNvIHRoYXQgaW4gY2FzZSBvZiBmYWlsdXJlIGl0IGRvZXNuJ3Qgb3ZlcndyaXRlIHRoZSBjbGFzcyB2YXJpYWJsZS4gIAotICB1aW50NjRfdCBtYXBwZWRfb2Zmc2V0ID0gZGVzaXJlZF9iZWdpbiAtIGlnbm9yZTsKLQotICB1aW50NjRfdCBtYXBwZWRfc2l6ZTsKLSAgaWYgKGRlZmF1bHRfbWFwX3NpemVfID49IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90Pih0b3RhbF9zaXplXyAtIG1hcHBlZF9vZmZzZXQpKSB7Ci0gICAgYXRfZW5kXyA9IHRydWU7Ci0gICAgbWFwcGVkX3NpemUgPSB0b3RhbF9zaXplXyAtIG1hcHBlZF9vZmZzZXQ7Ci0gIH0gZWxzZSB7Ci0gICAgbWFwcGVkX3NpemUgPSBkZWZhdWx0X21hcF9zaXplXzsKLSAgfQotCi0gIC8vIEZvcmNpYmx5IGNsZWFyIHRoZSBleGlzdGluZyBtbWFwIGZpcnN0LiAgCi0gIGRhdGFfLnJlc2V0KCk7Ci0gIHRyeSB7Ci0gICAgTWFwUmVhZChQT1BVTEFURV9PUl9MQVpZLCAqZmlsZV8sIG1hcHBlZF9vZmZzZXQsIG1hcHBlZF9zaXplLCBkYXRhXyk7Ci0gIH0gY2F0Y2ggKGNvbnN0IHV0aWw6OkVycm5vRXhjZXB0aW9uICZlKSB7Ci0gICAgaWYgKGRlc2lyZWRfYmVnaW4pIHsKLSAgICAgIFNlZWtPclRocm93KCpmaWxlXywgZGVzaXJlZF9iZWdpbik7Ci0gICAgfQotICAgIC8vIFRoZSBtbWFwIHdhcyBzY2hlZHVsZWQgdG8gZW5kIHRoZSBmaWxlLCBidXQgbm93IHdlJ3JlIGdvaW5nIHRvIHJlYWQgaXQuICAKLSAgICBhdF9lbmRfID0gZmFsc2U7Ci0gICAgVHJhbnNpdGlvblRvUmVhZCgpOwotICAgIHJldHVybjsKLSAgfQotICBtYXBwZWRfb2Zmc2V0XyA9IG1hcHBlZF9vZmZzZXQ7Ci0gIHBvc2l0aW9uXyA9IGRhdGFfLmJlZ2luKCkgKyBpZ25vcmU7Ci0gIHBvc2l0aW9uX2VuZF8gPSBkYXRhXy5iZWdpbigpICsgbWFwcGVkX3NpemU7Ci0KLSAgcHJvZ3Jlc3NfLlNldChkZXNpcmVkX2JlZ2luKTsKLX0KLQotdm9pZCBGaWxlUGllY2U6OlRyYW5zaXRpb25Ub1JlYWQoKSB7Ci0gIGFzc2VydCghZmFsbGJhY2tfdG9fcmVhZF8pOwotICBmYWxsYmFja190b19yZWFkXyA9IHRydWU7Ci0gIGRhdGFfLnJlc2V0KCk7Ci0gIGRhdGFfLnJlc2V0KE1hbGxvY09yVGhyb3coZGVmYXVsdF9tYXBfc2l6ZV8pLCBkZWZhdWx0X21hcF9zaXplXywgc2NvcGVkX21lbW9yeTo6TUFMTE9DX0FMTE9DQVRFRCk7Ci0gIHBvc2l0aW9uXyA9IGRhdGFfLmJlZ2luKCk7Ci0gIHBvc2l0aW9uX2VuZF8gPSBwb3NpdGlvbl87Ci0KLSAgdHJ5IHsKLSAgICBmZWxsX2JhY2tfLlJlc2V0KGZpbGVfLnJlbGVhc2UoKSk7Ci0gIH0gY2F0Y2ggKHV0aWw6OkV4Y2VwdGlvbiAmZSkgewotICAgIGUgPDwgIiBpbiBmaWxlICIgPDwgZmlsZV9uYW1lXzsKLSAgICB0aHJvdzsKLSAgfQotfQotCi12b2lkIEZpbGVQaWVjZTo6UmVhZFNoaWZ0KCkgewotICBhc3NlcnQoZmFsbGJhY2tfdG9fcmVhZF8pOwotICAvLyBCeXRlcyBbZGF0YV8uYmVnaW4oKSwgcG9zaXRpb25fKSBoYXZlIGJlZW4gY29uc3VtZWQuICAKLSAgLy8gQnl0ZXMgW3Bvc2l0aW9uXywgcG9zaXRpb25fZW5kXykgaGF2ZSBiZWVuIHJlYWQgaW50byB0aGUgYnVmZmVyLiAgCi0KLSAgLy8gU3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGlmIHRoZXJlJ3Mgbm90aGluZyB1c2VmdWwgaW4gaXQuICAKLSAgaWYgKHBvc2l0aW9uXyA9PSBwb3NpdGlvbl9lbmRfKSB7Ci0gICAgbWFwcGVkX29mZnNldF8gKz0gKHBvc2l0aW9uX2VuZF8gLSBkYXRhXy5iZWdpbigpKTsKLSAgICBwb3NpdGlvbl8gPSBkYXRhXy5iZWdpbigpOwotICAgIHBvc2l0aW9uX2VuZF8gPSBwb3NpdGlvbl87Ci0gIH0KLQotICBzdGQ6OnNpemVfdCBhbHJlYWR5X3JlYWQgPSBwb3NpdGlvbl9lbmRfIC0gZGF0YV8uYmVnaW4oKTsKLQotICBpZiAoYWxyZWFkeV9yZWFkID09IGRlZmF1bHRfbWFwX3NpemVfKSB7Ci0gICAgaWYgKHBvc2l0aW9uXyA9PSBkYXRhXy5iZWdpbigpKSB7Ci0gICAgICAvLyBCdWZmZXIgdG9vIHNtYWxsLiAgCi0gICAgICBzdGQ6OnNpemVfdCB2YWxpZF9sZW5ndGggPSBwb3NpdGlvbl9lbmRfIC0gcG9zaXRpb25fOwotICAgICAgZGVmYXVsdF9tYXBfc2l6ZV8gKj0gMjsKLSAgICAgIGRhdGFfLmNhbGxfcmVhbGxvYyhkZWZhdWx0X21hcF9zaXplXyk7Ci0gICAgICBVVElMX1RIUk9XX0lGKCFkYXRhXy5nZXQoKSwgRXJybm9FeGNlcHRpb24sICJyZWFsbG9jIGZhaWxlZCBmb3IgIiA8PCBkZWZhdWx0X21hcF9zaXplXyk7Ci0gICAgICBwb3NpdGlvbl8gPSBkYXRhXy5iZWdpbigpOwotICAgICAgcG9zaXRpb25fZW5kXyA9IHBvc2l0aW9uXyArIHZhbGlkX2xlbmd0aDsKLSAgICB9IGVsc2UgewotICAgICAgc3RkOjpzaXplX3QgbW92aW5nID0gcG9zaXRpb25fZW5kXyAtIHBvc2l0aW9uXzsKLSAgICAgIG1lbW1vdmUoZGF0YV8uZ2V0KCksIHBvc2l0aW9uXywgbW92aW5nKTsKLSAgICAgIHBvc2l0aW9uXyA9IGRhdGFfLmJlZ2luKCk7Ci0gICAgICBwb3NpdGlvbl9lbmRfID0gcG9zaXRpb25fICsgbW92aW5nOwotICAgICAgYWxyZWFkeV9yZWFkID0gbW92aW5nOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c2l6ZV90IHJlYWRfcmV0dXJuID0gZmVsbF9iYWNrXy5SZWFkKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihkYXRhXy5nZXQoKSkgKyBhbHJlYWR5X3JlYWQsIGRlZmF1bHRfbWFwX3NpemVfIC0gYWxyZWFkeV9yZWFkKTsKLSAgcHJvZ3Jlc3NfLlNldChmZWxsX2JhY2tfLlJhd0Ftb3VudCgpKTsKLQotICBpZiAocmVhZF9yZXR1cm4gPT0gMCkgewotICAgIGF0X2VuZF8gPSB0cnVlOwotICB9Ci0gIHBvc2l0aW9uX2VuZF8gKz0gcmVhZF9yZXR1cm47Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2ZpbGVfcGllY2UuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9maWxlX3BpZWNlLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDk1ZGRjLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2ZpbGVfcGllY2UuaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotI2lmbmRlZiBVVElMX0ZJTEVfUElFQ0VfSAotI2RlZmluZSBVVElMX0ZJTEVfUElFQ0VfSAotCi0jaW5jbHVkZSAidXRpbC9lcnNhdHpfcHJvZ3Jlc3MuaGgiCi0jaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAidXRpbC9maWxlLmhoIgotI2luY2x1ZGUgInV0aWwvbW1hcC5oaCIKLSNpbmNsdWRlICJ1dGlsL3JlYWRfY29tcHJlc3NlZC5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmluZ19waWVjZS5oaCIKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8aW9zZndkPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgdXRpbCB7Ci0KLWNsYXNzIFBhcnNlTnVtYmVyRXhjZXB0aW9uIDogcHVibGljIEV4Y2VwdGlvbiB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBQYXJzZU51bWJlckV4Y2VwdGlvbihTdHJpbmdQaWVjZSB2YWx1ZSkgdGhyb3coKTsKLSAgICB+UGFyc2VOdW1iZXJFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci19OwotCi1leHRlcm4gY29uc3QgYm9vbCBrU3BhY2VzWzI1Nl07Ci0KLS8vIE1lbW9yeSBiYWNraW5nIHRoZSByZXR1cm5lZCBTdHJpbmdQaWVjZSBtYXkgdmFuaXNoIG9uIHRoZSBuZXh0IGNhbGwuCi1jbGFzcyBGaWxlUGllY2UgewotICBwdWJsaWM6Ci0gICAgLy8gMSBNQiBkZWZhdWx0LgotICAgIGV4cGxpY2l0IEZpbGVQaWVjZShjb25zdCBjaGFyICpmaWxlLCBzdGQ6Om9zdHJlYW0gKnNob3dfcHJvZ3Jlc3MgPSBOVUxMLCBzdGQ6OnNpemVfdCBtaW5fYnVmZmVyID0gMTA0ODU3Nik7Ci0gICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIGZkLiAgbmFtZSBpcyB1c2VkIGZvciBtZXNzYWdlcy4KLSAgICBleHBsaWNpdCBGaWxlUGllY2UoaW50IGZkLCBjb25zdCBjaGFyICpuYW1lID0gTlVMTCwgc3RkOjpvc3RyZWFtICpzaG93X3Byb2dyZXNzID0gTlVMTCwgc3RkOjpzaXplX3QgbWluX2J1ZmZlciA9IDEwNDg1NzYpOwotCi0gICAgLyogUmVhZCBmcm9tIGFuIGlzdHJlYW0uICBEb24ndCB1c2UgdGhpcyBpZiB5b3UgY2FuIGF2b2lkIGl0LiAgUmF3IGZkIElPIGlzCi0gICAgICogbXVjaCBmYXN0ZXIuICBCdXQgc29tZXRpbWVzIHlvdSBqdXN0IGhhdmUgYW4gaXN0cmVhbSBsaWtlIEJvb3N0J3MgSFRUUAotICAgICAqIHNlcnZlciBhbmQgd2FudCB0byBwYXJzZSBpdCB0aGUgc2FtZSB3YXkuCi0gICAgICogbmFtZSBpcyBqdXN0IHVzZWQgZm9yIG1lc3NhZ2VzIGFuZCBGaWxlTmFtZSgpLgotICAgICAqLwotICAgIGV4cGxpY2l0IEZpbGVQaWVjZShzdGQ6OmlzdHJlYW0gJnN0cmVhbSwgY29uc3QgY2hhciAqbmFtZSA9IE5VTEwsIHN0ZDo6c2l6ZV90IG1pbl9idWZmZXIgPSAxMDQ4NTc2KTsKLQotICAgIH5GaWxlUGllY2UoKTsKLQotICAgIGNoYXIgZ2V0KCkgewotICAgICAgaWYgKHBvc2l0aW9uXyA9PSBwb3NpdGlvbl9lbmRfKSB7Ci0gICAgICAgIFNoaWZ0KCk7Ci0gICAgICAgIGlmIChhdF9lbmRfKSB0aHJvdyBFbmRPZkZpbGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAqKHBvc2l0aW9uXysrKTsKLSAgICB9Ci0KLSAgICAvLyBMZWF2ZXMgdGhlIGRlbGltaXRlciwgaWYgYW55LCB0byBiZSByZXR1cm5lZCBieSBnZXQoKS4gIERlbGltaXRlcnMgZGVmaW5lZCBieSBpc3NwYWNlKCkuCi0gICAgU3RyaW5nUGllY2UgUmVhZERlbGltaXRlZChjb25zdCBib29sICpkZWxpbSA9IGtTcGFjZXMpIHsKLSAgICAgIFNraXBTcGFjZXMoZGVsaW0pOwotICAgICAgcmV0dXJuIENvbnN1bWUoRmluZERlbGltaXRlck9yRU9GKGRlbGltKSk7Ci0gICAgfQotCi0gICAgLy8gUmVhZCB3b3JkIHVudGlsIHRoZSBsaW5lIG9yIGZpbGUgZW5kcy4KLSAgICBib29sIFJlYWRXb3JkU2FtZUxpbmUoU3RyaW5nUGllY2UgJnRvLCBjb25zdCBib29sICpkZWxpbSA9IGtTcGFjZXMpIHsKLSAgICAgIGFzc2VydChkZWxpbVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPignXG4nKV0pOwotICAgICAgLy8gU2tpcCBub24tZW50ZXIgc3BhY2VzLgotICAgICAgZm9yICg7IDsgKytwb3NpdGlvbl8pIHsKLSAgICAgICAgaWYgKHBvc2l0aW9uXyA9PSBwb3NpdGlvbl9lbmRfKSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNoaWZ0KCk7Ci0gICAgICAgICAgfSBjYXRjaCAoY29uc3QgdXRpbDo6RW5kT2ZGaWxlRXhjZXB0aW9uICZlKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICAgIC8vIEFuZCBicmVhayBvdXQgYXQgZW5kIG9mIGZpbGUuCi0gICAgICAgICAgaWYgKHBvc2l0aW9uXyA9PSBwb3NpdGlvbl9lbmRfKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFkZWxpbVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigqcG9zaXRpb25fKV0pIGJyZWFrOwotICAgICAgICBpZiAoKnBvc2l0aW9uXyA9PSAnXG4nKSByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICAvLyBXZSBjYW4ndCBiZSBhdCB0aGUgZW5kIG9mIGZpbGUgYmVjYXVzZSB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgb3Blbi4KLSAgICAgIHRvID0gQ29uc3VtZShGaW5kRGVsaW1pdGVyT3JFT0YoZGVsaW0pKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIFVubGlrZSBSZWFkRGVsaW1pdGVkLCB0aGlzIGluY2x1ZGVzIGxlYWRpbmcgc3BhY2VzIGFuZCBjb25zdW1lcyB0aGUgZGVsaW1pdGVyLgotICAgIC8vIEl0IGlzIHNpbWlsYXIgdG8gZ2V0bGluZSBpbiB0aGF0IHdheS4KLSAgICBTdHJpbmdQaWVjZSBSZWFkTGluZShjaGFyIGRlbGltID0gJ1xuJyk7Ci0KLSAgICAvLyBEb2Vzbid0IHRocm93IEVuZE9mRmlsZUV4Y2VwdGlvbiwganVzdCByZXR1cm5zIGZhbHNlLgotICAgIGJvb2wgUmVhZExpbmVPckVPRihTdHJpbmdQaWVjZSAmdG8sIGNoYXIgZGVsaW0gPSAnXG4nKTsKLQotICAgIGZsb2F0IFJlYWRGbG9hdCgpOwotICAgIGRvdWJsZSBSZWFkRG91YmxlKCk7Ci0gICAgbG9uZyBpbnQgUmVhZExvbmcoKTsKLSAgICB1bnNpZ25lZCBsb25nIGludCBSZWFkVUxvbmcoKTsKLQotICAgIC8vIFNraXAgc3BhY2VzIGRlZmluZWQgYnkgaXNzcGFjZS4KLSAgICB2b2lkIFNraXBTcGFjZXMoY29uc3QgYm9vbCAqZGVsaW0gPSBrU3BhY2VzKSB7Ci0gICAgICBhc3NlcnQocG9zaXRpb25fIDw9IHBvc2l0aW9uX2VuZF8pOwotICAgICAgZm9yICg7IDsgKytwb3NpdGlvbl8pIHsKLSAgICAgICAgaWYgKHBvc2l0aW9uXyA9PSBwb3NpdGlvbl9lbmRfKSB7Ci0gICAgICAgICAgU2hpZnQoKTsKLSAgICAgICAgICAvLyBBbmQgYnJlYWsgb3V0IGF0IGVuZCBvZiBmaWxlLgotICAgICAgICAgIGlmIChwb3NpdGlvbl8gPT0gcG9zaXRpb25fZW5kXykgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydChwb3NpdGlvbl8gPCBwb3NpdGlvbl9lbmRfKTsKLSAgICAgICAgaWYgKCFkZWxpbVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigqcG9zaXRpb25fKV0pIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB1aW50NjRfdCBPZmZzZXQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcG9zaXRpb25fIC0gZGF0YV8uYmVnaW4oKSArIG1hcHBlZF9vZmZzZXRfOwotICAgIH0KLQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGaWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfbmFtZV87IH0KLQotICBwcml2YXRlOgotICAgIHZvaWQgSW5pdGlhbGl6ZU5vUmVhZChjb25zdCBjaGFyICpuYW1lLCBzdGQ6OnNpemVfdCBtaW5fYnVmZmVyKTsKLSAgICAvLyBDYWxscyBJbml0aWFsaXplTm9SZWFkLCBzbyBkb24ndCBjYWxsIGJvdGguCi0gICAgdm9pZCBJbml0aWFsaXplKGNvbnN0IGNoYXIgKm5hbWUsIHN0ZDo6b3N0cmVhbSAqc2hvd19wcm9ncmVzcywgc3RkOjpzaXplX3QgbWluX2J1ZmZlcik7Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gVCBSZWFkTnVtYmVyKCk7Ci0KLSAgICBTdHJpbmdQaWVjZSBDb25zdW1lKGNvbnN0IGNoYXIgKnRvKSB7Ci0gICAgICBhc3NlcnQodG8gPj0gcG9zaXRpb25fKTsKLSAgICAgIFN0cmluZ1BpZWNlIHJldChwb3NpdGlvbl8sIHRvIC0gcG9zaXRpb25fKTsKLSAgICAgIHBvc2l0aW9uXyA9IHRvOwotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyICpGaW5kRGVsaW1pdGVyT3JFT0YoY29uc3QgYm9vbCAqZGVsaW0gPSBrU3BhY2VzKTsKLQotICAgIHZvaWQgU2hpZnQoKTsKLSAgICAvLyBCYWNrZW5kcyB0byBTaGlmdCgpLgotICAgIHZvaWQgTU1hcFNoaWZ0KHVpbnQ2NF90IGRlc2lyZWRfYmVnaW4pOwotCi0gICAgdm9pZCBUcmFuc2l0aW9uVG9SZWFkKCk7Ci0gICAgdm9pZCBSZWFkU2hpZnQoKTsKLQotICAgIGNvbnN0IGNoYXIgKnBvc2l0aW9uXywgKmxhc3Rfc3BhY2VfLCAqcG9zaXRpb25fZW5kXzsKLQotICAgIHNjb3BlZF9mZCBmaWxlXzsKLSAgICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplXzsKLSAgICBjb25zdCB1aW50NjRfdCBwYWdlXzsKLQotICAgIHN0ZDo6c2l6ZV90IGRlZmF1bHRfbWFwX3NpemVfOwotICAgIHVpbnQ2NF90IG1hcHBlZF9vZmZzZXRfOwotCi0gICAgLy8gT3JkZXIgbWF0dGVyczogZmlsZV8gc2hvdWxkIGFsd2F5cyBiZSBkZXN0cm95ZWQgYWZ0ZXIgdGhpcy4KLSAgICBzY29wZWRfbWVtb3J5IGRhdGFfOwotCi0gICAgYm9vbCBhdF9lbmRfOwotICAgIGJvb2wgZmFsbGJhY2tfdG9fcmVhZF87Ci0KLSAgICBFcnNhdHpQcm9ncmVzcyBwcm9ncmVzc187Ci0KLSAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWVfOwotCi0gICAgUmVhZENvbXByZXNzZWQgZmVsbF9iYWNrXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKLQotI2VuZGlmIC8vIFVUSUxfRklMRV9QSUVDRV9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9maWxlX3BpZWNlX3Rlc3QuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9maWxlX3BpZWNlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNjE4NzcuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZmlsZV9waWVjZV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vIFRlc3RzIG1pZ2h0IGZhaWwgaWYgeW91IGhhdmUgY3JlYXRpdmUgY2hhcmFjdGVycyBpbiB5b3VyIHBhdGguICBTdWUgbWUuCi0jaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgotCi0jaW5jbHVkZSAidXRpbC9maWxlLmhoIgotI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgotCi0jZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEZpbGVQaWVjZVRlc3QKLSNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotbmFtZXNwYWNlIHV0aWwgewotbmFtZXNwYWNlIHsKLQotc3RkOjpzdHJpbmcgRmlsZUxvY2F0aW9uKCkgewotICBpZiAoYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgPCAyKSB7Ci0gICAgcmV0dXJuICJmaWxlX3BpZWNlLmNjIjsKLSAgfQotICBzdGQ6OnN0cmluZyByZXQoYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbMV0pOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBpc3RyZWFtICovCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShJU3RyZWFtKSB7Ci0gIHN0ZDo6ZnN0cmVhbSByZWYoRmlsZUxvY2F0aW9uKCkuY19zdHIoKSwgc3RkOjppb3M6OmluKTsKLSAgc3RkOjpmc3RyZWFtIGJhY2tpbmcoRmlsZUxvY2F0aW9uKCkuY19zdHIoKSwgc3RkOjppb3M6OmluKTsKLSAgRmlsZVBpZWNlIHRlc3QoYmFja2luZyk7Ci0gIHN0ZDo6c3RyaW5nIHJlZl9saW5lOwotICB3aGlsZSAoZ2V0bGluZShyZWYsIHJlZl9saW5lKSkgewotICAgIFN0cmluZ1BpZWNlIHRlc3RfbGluZSh0ZXN0LlJlYWRMaW5lKCkpOwotICAgIEJPT1NUX0NIRUNLX0VRVUFMKHJlZl9saW5lLCB0ZXN0X2xpbmUpOwotICB9Ci0gIEJPT1NUX0NIRUNLX1RIUk9XKHRlc3QuZ2V0KCksIEVuZE9mRmlsZUV4Y2VwdGlvbik7Ci0gIEJPT1NUX0NIRUNLX1RIUk9XKHRlc3QuZ2V0KCksIEVuZE9mRmlsZUV4Y2VwdGlvbik7Ci19Ci0KLS8qIG1tYXAgaW1wbGVtZW50YXRpb24gKi8KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKE1NYXBSZWFkTGluZSkgewotICBzdGQ6OmZzdHJlYW0gcmVmKEZpbGVMb2NhdGlvbigpLmNfc3RyKCksIHN0ZDo6aW9zOjppbik7Ci0gIEZpbGVQaWVjZSB0ZXN0KEZpbGVMb2NhdGlvbigpLmNfc3RyKCksIE5VTEwsIDEpOwotICBzdGQ6OnN0cmluZyByZWZfbGluZTsKLSAgd2hpbGUgKGdldGxpbmUocmVmLCByZWZfbGluZSkpIHsKLSAgICBTdHJpbmdQaWVjZSB0ZXN0X2xpbmUodGVzdC5SZWFkTGluZSgpKTsKLSAgICAvLyBJIHN1Ym1pdHRlZCBhIGJ1ZyByZXBvcnQgdG8gSUNVOiBodHRwOi8vYnVncy5pY3UtcHJvamVjdC5vcmcvdHJhYy90aWNrZXQvNzkyNAotICAgIGlmICghdGVzdF9saW5lLmVtcHR5KCkgfHwgIXJlZl9saW5lLmVtcHR5KCkpIHsKLSAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHJlZl9saW5lLCB0ZXN0X2xpbmUpOwotICAgIH0KLSAgfQotICBCT09TVF9DSEVDS19USFJPVyh0ZXN0LmdldCgpLCBFbmRPZkZpbGVFeGNlcHRpb24pOwotfQotCi0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpICYmICFkZWZpbmVkKF9fQVBQTEVfXykKLS8qIEFwcGxlIGlzbid0IGhhcHB5IHdpdGggdGhlIHBvcGVuLCBmaWxlbm8sIGR1cC4gIEFuZCBJIGRvbid0IHdhbnQgdG8KLSAqIHJlaW1wbGVtZW50IHBvcGVuLiAgVGhpcyBpcyBhbiBpc3N1ZSB3aXRoIHRoZSB0ZXN0LgotICovCi0vKiByZWFkKCkgaW1wbGVtZW50YXRpb24gKi8KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKFN0cmVhbVJlYWRMaW5lKSB7Ci0gIHN0ZDo6ZnN0cmVhbSByZWYoRmlsZUxvY2F0aW9uKCkuY19zdHIoKSwgc3RkOjppb3M6OmluKTsKLQotICBzdGQ6OnN0cmluZyBwb3Blbl9hcmdzID0gImNhdCBcIiI7Ci0gIHBvcGVuX2FyZ3MgKz0gRmlsZUxvY2F0aW9uKCk7Ci0gIHBvcGVuX2FyZ3MgKz0gJyInOwotCi0gIEZJTEUgKmNhdHRlciA9IHBvcGVuKHBvcGVuX2FyZ3MuY19zdHIoKSwgInIiKTsKLSAgQk9PU1RfUkVRVUlSRShjYXR0ZXIpOwotCi0gIEZpbGVQaWVjZSB0ZXN0KGR1cChmaWxlbm8oY2F0dGVyKSksICJmaWxlX3BpZWNlLmNjIiwgTlVMTCwgMSk7Ci0gIHN0ZDo6c3RyaW5nIHJlZl9saW5lOwotICB3aGlsZSAoZ2V0bGluZShyZWYsIHJlZl9saW5lKSkgewotICAgIFN0cmluZ1BpZWNlIHRlc3RfbGluZSh0ZXN0LlJlYWRMaW5lKCkpOwotICAgIC8vIEkgc3VibWl0dGVkIGEgYnVnIHJlcG9ydCB0byBJQ1U6IGh0dHA6Ly9idWdzLmljdS1wcm9qZWN0Lm9yZy90cmFjL3RpY2tldC83OTI0Ci0gICAgaWYgKCF0ZXN0X2xpbmUuZW1wdHkoKSB8fCAhcmVmX2xpbmUuZW1wdHkoKSkgewotICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwocmVmX2xpbmUsIHRlc3RfbGluZSk7Ci0gICAgfQotICB9Ci0gIEJPT1NUX0NIRUNLX1RIUk9XKHRlc3QuZ2V0KCksIEVuZE9mRmlsZUV4Y2VwdGlvbik7Ci0gIEJPT1NUX1JFUVVJUkUoIXBjbG9zZShjYXR0ZXIpKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9aTElCCi0KLS8vIGd6aXAgZmlsZQotQk9PU1RfQVVUT19URVNUX0NBU0UoUGxhaW5aaXBSZWFkTGluZSkgewotICBzdGQ6OnN0cmluZyBsb2NhdGlvbihGaWxlTG9jYXRpb24oKSk7Ci0gIHN0ZDo6ZnN0cmVhbSByZWYobG9jYXRpb24uY19zdHIoKSwgc3RkOjppb3M6OmluKTsKLQotICBzdGQ6OnN0cmluZyBjb21tYW5kKCJnemlwIDxcIiIpOwotICBjb21tYW5kICs9IGxvY2F0aW9uICsgIlwiID5cIiIgKyBsb2NhdGlvbiArICJcIi5neiI7Ci0KLSAgQk9PU1RfUkVRVUlSRV9FUVVBTCgwLCBzeXN0ZW0oY29tbWFuZC5jX3N0cigpKSk7Ci0gIEZpbGVQaWVjZSB0ZXN0KChsb2NhdGlvbiArICIuZ3oiKS5jX3N0cigpLCBOVUxMLCAxKTsKLSAgdW5saW5rKChsb2NhdGlvbiArICIuZ3oiKS5jX3N0cigpKTsKLSAgc3RkOjpzdHJpbmcgcmVmX2xpbmU7Ci0gIHdoaWxlIChnZXRsaW5lKHJlZiwgcmVmX2xpbmUpKSB7Ci0gICAgU3RyaW5nUGllY2UgdGVzdF9saW5lKHRlc3QuUmVhZExpbmUoKSk7Ci0gICAgLy8gSSBzdWJtaXR0ZWQgYSBidWcgcmVwb3J0IHRvIElDVTogaHR0cDovL2J1Z3MuaWN1LXByb2plY3Qub3JnL3RyYWMvdGlja2V0Lzc5MjQKLSAgICBpZiAoIXRlc3RfbGluZS5lbXB0eSgpIHx8ICFyZWZfbGluZS5lbXB0eSgpKSB7Ci0gICAgICBCT09TVF9DSEVDS19FUVVBTChyZWZfbGluZSwgdGVzdF9saW5lKTsKLSAgICB9Ci0gIH0KLSAgQk9PU1RfQ0hFQ0tfVEhST1codGVzdC5nZXQoKSwgRW5kT2ZGaWxlRXhjZXB0aW9uKTsKLX0KLQotLy8gZ3ppcCBzdHJlYW0uICBBcHBsZSBkb2Vzbid0IGxpa2UgcG9wZW4sIGZpbGVubywgZHVwLiAgVGhpcyBpcyBhbiBpc3N1ZSB3aXRoCi0vLyB0aGUgdGVzdC4KLSNpZiAhZGVmaW5lZCBfX0FQUExFX18gJiYgIWRlZmluZWQgX19NSU5HVzMyX18KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKFN0cmVhbVppcFJlYWRMaW5lKSB7Ci0gIHN0ZDo6ZnN0cmVhbSByZWYoRmlsZUxvY2F0aW9uKCkuY19zdHIoKSwgc3RkOjppb3M6OmluKTsKLQotICBzdGQ6OnN0cmluZyBjb21tYW5kKCJnemlwIDxcIiIpOwotICBjb21tYW5kICs9IEZpbGVMb2NhdGlvbigpICsgIlwiIjsKLQotICBGSUxFICogY2F0dGVyID0gcG9wZW4oY29tbWFuZC5jX3N0cigpLCAiciIpOwotICBCT09TVF9SRVFVSVJFKGNhdHRlcik7Ci0KLSAgRmlsZVBpZWNlIHRlc3QoZHVwKGZpbGVubyhjYXR0ZXIpKSwgImZpbGVfcGllY2UuY2MuZ3oiLCBOVUxMLCAxKTsKLSAgc3RkOjpzdHJpbmcgcmVmX2xpbmU7Ci0gIHdoaWxlIChnZXRsaW5lKHJlZiwgcmVmX2xpbmUpKSB7Ci0gICAgU3RyaW5nUGllY2UgdGVzdF9saW5lKHRlc3QuUmVhZExpbmUoKSk7Ci0gICAgLy8gSSBzdWJtaXR0ZWQgYSBidWcgcmVwb3J0IHRvIElDVTogaHR0cDovL2J1Z3MuaWN1LXByb2plY3Qub3JnL3RyYWMvdGlja2V0Lzc5MjQKLSAgICBpZiAoIXRlc3RfbGluZS5lbXB0eSgpIHx8ICFyZWZfbGluZS5lbXB0eSgpKSB7Ci0gICAgICBCT09TVF9DSEVDS19FUVVBTChyZWZfbGluZSwgdGVzdF9saW5lKTsKLSAgICB9Ci0gIH0KLSAgQk9PU1RfQ0hFQ0tfVEhST1codGVzdC5nZXQoKSwgRW5kT2ZGaWxlRXhjZXB0aW9uKTsKLSAgQk9PU1RfUkVRVUlSRSghcGNsb3NlKGNhdHRlcikpOwotfQotI2VuZGlmIC8vIF9fQVBQTEVfXwotCi0jZW5kaWYgLy8gSEFWRV9aTElCCi0KLX0gLy8gbmFtZXNwYWNlCi19IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9maXhlZF9hcnJheS5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2ZpeGVkX2FycmF5LmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTZiOTJmLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2ZpeGVkX2FycmF5LmhoCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLSNpZm5kZWYgVVRJTF9GSVhFRF9BUlJBWV9ICi0jZGVmaW5lIFVUSUxfRklYRURfQVJSQVlfSAotCi0jaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLQotLyoqCi0gKiBEZWZpbmVzIGEgZml4ZWQtc2l6ZSBjb2xsZWN0aW9uLgotICoKLSAqIEV2ZXIgd2FudCBhbiBhcnJheSBvZiB0aGluZ3MgYnkgdGhleSBkb24ndCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciBvciBhcmUKLSAqIG5vbi1jb3B5YWJsZT8gIEZpeGVkQXJyYXkgYWxsb3dzIGNvbnN0cnVjdGluZyBvbmUgYXQgYSB0aW1lLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgRml4ZWRBcnJheSB7Ci0gIHB1YmxpYzoKLSAgICAvKiogSW5pdGlhbGl6ZSB3aXRoIGEgZ2l2ZW4gc2l6ZSBib3VuZCBidXQgZG8gbm90IGNvbnN0cnVjdCB0aGUgb2JqZWN0cy4gKi8KLSAgICBleHBsaWNpdCBGaXhlZEFycmF5KHN0ZDo6c2l6ZV90IGxpbWl0KSB7Ci0gICAgICBJbml0KGxpbWl0KTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSwgYnV0IGRvZXMgbm90IGluaXRpYWxpemUgaXQuCi0gICAgICoKLSAgICAgKiBBbnkgb2JqZWN0cyBjb25zdHJ1Y3RlZCBpbiB0aGlzIG1hbm5lciBtdXN0IGJlIHN1YnNlcXVlbnRseSBAcmVmIEZpeGVkQXJyYXk6OkluaXQoKSAiaW5pdGlhbGl6ZWQiIHByaW9yIHRvIHVzZS4KLSAgICAgKgotICAgICAqIEBzZWUgRml4ZWRBcnJheTo6SW5pdCgpCi0gICAgICovCi0gICAgRml4ZWRBcnJheSgpIAotICAgICAgOiBuZXdlZF9lbmRfKE5VTEwpIAotI2lmbmRlZiBOREVCVUcKLSAgICAgICwgYWxsb2NhdGVkX2VuZF8oTlVMTCkgCi0jZW5kaWYKLSAgICB7fQotCi0gICAgLyoqIAotICAgICAqIEluaXRpYWxpemUgd2l0aCBhIGdpdmVuIHNpemUgYm91bmQgYnV0IGRvIG5vdCBjb25zdHJ1Y3QgdGhlIG9iamVjdHMuIAotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcgbWVtb3J5LgotICAgICAqIE9iamVjdHMgc3RvcmVkIGluIHRoaXMgYXJyYXkgd2lsbCBiZSBjb25zdHJ1Y3RlZCBpbiBhIGxvY2F0aW9uIHdpdGhpbiB0aGlzIGFsbG9jYXRlZCBtZW1vcnkuCi0gICAgICovCi0gICAgdm9pZCBJbml0KHN0ZDo6c2l6ZV90IGNvdW50KSB7Ci0gICAgICBhc3NlcnQoIWJsb2NrXy5nZXQoKSk7Ci0gICAgICBibG9ja18ucmVzZXQobWFsbG9jKHNpemVvZihUKSAqIGNvdW50KSk7Ci0gICAgICBpZiAoIWJsb2NrXy5nZXQoKSkgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKLSAgICAgIG5ld2VkX2VuZF8gPSBiZWdpbigpOwotI2lmbmRlZiBOREVCVUcKLSAgICAgIGFsbG9jYXRlZF9lbmRfID0gYmVnaW4oKSArIGNvdW50OwotI2VuZGlmCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGNvcHkgb2YgdGhlIHByb3ZpZGVkIGFycmF5LgotICAgICAqCi0gICAgICogQHBhcmFtIGZyb20gQXJyYXkgd2hvc2UgZWxlbWVudHMgc2hvdWxkIGJlIGNvcGllZCBpbnRvIHRoaXMgbmV3bHktY29uc3RydWN0ZWQgZGF0YSBzdHJ1Y3R1cmUuCi0gICAgICovCi0gICAgRml4ZWRBcnJheShjb25zdCBGaXhlZEFycmF5ICZmcm9tKSB7Ci0gICAgICBzdGQ6OnNpemVfdCBzaXplID0gZnJvbS5uZXdlZF9lbmRfIC0gc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KGZyb20uYmxvY2tfLmdldCgpKTsKLSAgICAgIEluaXQoc2l6ZSk7Ci0gICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIHB1c2hfYmFjayhmcm9tW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlcyB0aGUgbWVtb3J5IGhlbGQgYnkgdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgfkZpeGVkQXJyYXkoKSB7IGNsZWFyKCk7IH0KLQotICAgIC8qKiBHZXRzIGEgcG9pbnRlciB0byB0aGUgZmlyc3Qgb2JqZWN0IGN1cnJlbnRseSBzdG9yZWQgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZS4gKi8KLSAgICBUICpiZWdpbigpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihibG9ja18uZ2V0KCkpOyB9Ci0gIAotICAgIC8qKiBHZXRzIGEgY29uc3QgcG9pbnRlciB0byB0aGUgbGFzdCBvYmplY3QgY3VycmVudGx5IHN0b3JlZCBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLiAqLwotICAgIGNvbnN0IFQgKmJlZ2luKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KGJsb2NrXy5nZXQoKSk7IH0KLSAgICAKLSAgICAvKiogR2V0cyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2JqZWN0IGN1cnJlbnRseSBzdG9yZWQgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZS4gKi8KLSAgICBUICplbmQoKSB7IHJldHVybiBuZXdlZF9lbmRfOyB9Ci0gIAotICAgIC8qKiBHZXRzIGEgY29uc3QgcG9pbnRlciB0byB0aGUgbGFzdCBvYmplY3QgY3VycmVudGx5IHN0b3JlZCBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLiAqLwotICAgIGNvbnN0IFQgKmVuZCgpIGNvbnN0IHsgcmV0dXJuIG5ld2VkX2VuZF87IH0KLQotICAgIC8qKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBsYXN0IG9iamVjdCBjdXJyZW50bHkgc3RvcmVkIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuICovCi0gICAgVCAmYmFjaygpIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQotICAKLSAgICAvKiogR2V0cyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbGFzdCBvYmplY3QgY3VycmVudGx5IHN0b3JlZCBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLiAqLwotICAgIGNvbnN0IFQgJmJhY2soKSBjb25zdCB7IHJldHVybiAqKGVuZCgpIC0gMSk7IH0KLQotICAgIC8qKiBHZXRzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBjdXJyZW50bHkgc3RvcmVkIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuICovCi0gICAgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGVuZCgpIC0gYmVnaW4oKTsgfQotICAKLSAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBubyBvYmplY3RzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZS4gKi8KLSAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQotCi0gICAgLyoqIAotICAgICAqIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB3aXRoIGluZGV4IGkgY3VycmVudGx5IHN0b3JlZCBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBpIEluZGV4IG9mIHRoZSBvYmplY3QgdG8gcmVmZXJlbmNlCi0gICAgICovCi0gICAgVCAmb3BlcmF0b3JbXShzdGQ6OnNpemVfdCBpKSB7IHJldHVybiBiZWdpbigpW2ldOyB9Ci0gIAotICAgIC8qKiAKLSAgICAgKiBHZXRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgd2l0aCBpbmRleCBpIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZS4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaSBJbmRleCBvZiB0aGUgb2JqZWN0IHRvIHJlZmVyZW5jZQotICAgICAqLwotICAgIGNvbnN0IFQgJm9wZXJhdG9yW10oc3RkOjpzaXplX3QgaSkgY29uc3QgeyByZXR1cm4gYmVnaW4oKVtpXTsgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBvYmplY3QgdXNpbmcgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciwKLSAgICAgKiBhbmQgc3RvcmVzIGl0IGluIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuCi0gICAgICoKLSAgICAgKiBUaGUgbWVtb3J5IGJhY2tpbmcgdGhlIGNvbnN0cnVjdGVkIG9iamVjdCBpcyBtYW5hZ2VkIGJ5IHRoaXMgZGF0YSBzdHJ1Y3R1cmUuCi0gICAgICovCi0gICAgdGVtcGxhdGUgPGNsYXNzIEM+IHZvaWQgcHVzaF9iYWNrKGNvbnN0IEMgJmMpIHsKLSAgICAgIG5ldyAoZW5kKCkpIFQoYyk7IC8vIHVzZSAicGxhY2VtZW50IG5ldyIgc3ludGF4IHRvIGluaXRhbGl6ZSBUIGluIGFuIGFscmVhZHktYWxsb2NhdGVkIG1lbW9yeSBsb2NhdGlvbgotICAgICAgQ29uc3RydWN0ZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgYXJyYXkuCi0gICAgICovCi0gICAgdm9pZCBjbGVhcigpIHsKLSAgICAgIGZvciAoVCAqaSA9IGJlZ2luKCk7IGkgIT0gZW5kKCk7ICsraSkKLSAgICAgICAgaS0+flQoKTsKLSAgICAgIG5ld2VkX2VuZF8gPSBiZWdpbigpOwotICAgIH0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gQWx3YXlzIGNhbGwgQ29uc3RydWN0ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIG5ldy4KLSAgICB2b2lkIENvbnN0cnVjdGVkKCkgewotICAgICAgKytuZXdlZF9lbmRfOwotI2lmbmRlZiBOREVCVUcKLSAgICAgIGFzc2VydChuZXdlZF9lbmRfIDw9IGFsbG9jYXRlZF9lbmRfKTsKLSNlbmRpZgotICAgIH0KLQotICBwcml2YXRlOgotICAgIHV0aWw6OnNjb3BlZF9tYWxsb2MgYmxvY2tfOwotCi0gICAgVCAqbmV3ZWRfZW5kXzsKLQotI2lmbmRlZiBOREVCVUcKLSAgICBUICphbGxvY2F0ZWRfZW5kXzsKLSNlbmRpZgotfTsKLQotfSAvLyBuYW1lc3BhY2UgdXRpbAotCi0jZW5kaWYgLy8gVVRJTF9GSVhFRF9BUlJBWV9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9nZXRvcHQuYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2dldG9wdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTJjOTZiLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2dldG9wdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLVBPU0lYIGdldG9wdCBmb3IgV2luZG93cwotCi1BVCZUIFB1YmxpYyBMaWNlbnNlCi0KLUNvZGUgZ2l2ZW4gb3V0IGF0IHRoZSAxOTg1IFVOSUZPUlVNIGNvbmZlcmVuY2UgaW4gRGFsbGFzLiAgCi0qLwotCi0jaWZuZGVmIF9fR05VQ19fCi0KLSNpbmNsdWRlICJnZXRvcHQuaGgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBOVUxMCTAKLSNkZWZpbmUgRU9GCSgtMSkKLSNkZWZpbmUgRVJSKHMsIGMpCWlmKG9wdGVycil7XAotCWNoYXIgZXJyYnVmWzJdO1wKLQllcnJidWZbMF0gPSBjOyBlcnJidWZbMV0gPSAnXG4nO1wKLQlmcHV0cyhhcmd2WzBdLCBzdGRlcnIpO1wKLQlmcHV0cyhzLCBzdGRlcnIpO1wKLQlmcHV0YyhjLCBzdGRlcnIpO30KLQkvLyh2b2lkKSB3cml0ZSgyLCBhcmd2WzBdLCAodW5zaWduZWQpc3RybGVuKGFyZ3ZbMF0pKTtcCi0JLy8odm9pZCkgd3JpdGUoMiwgcywgKHVuc2lnbmVkKXN0cmxlbihzKSk7XAotCS8vKHZvaWQpIHdyaXRlKDIsIGVycmJ1ZiwgMik7fQotCi1pbnQJb3B0ZXJyID0gMTsKLWludAlvcHRpbmQgPSAxOwotaW50CW9wdG9wdDsKLWNoYXIJKm9wdGFyZzsKLQotaW50Ci1nZXRvcHQoYXJnYywgYXJndiwgb3B0cykKLWludAlhcmdjOwotY2hhcgkqKmFyZ3YsICpvcHRzOwotewotCXN0YXRpYyBpbnQgc3AgPSAxOwotCXJlZ2lzdGVyIGludCBjOwotCXJlZ2lzdGVyIGNoYXIgKmNwOwotCi0JaWYoc3AgPT0gMSkKLQkJaWYob3B0aW5kID49IGFyZ2MgfHwKLQkJICAgYXJndltvcHRpbmRdWzBdICE9ICctJyB8fCBhcmd2W29wdGluZF1bMV0gPT0gJ1wwJykKLQkJCXJldHVybihFT0YpOwotCQllbHNlIGlmKHN0cmNtcChhcmd2W29wdGluZF0sICItLSIpID09IE5VTEwpIHsKLQkJCW9wdGluZCsrOwotCQkJcmV0dXJuKEVPRik7Ci0JCX0KLQlvcHRvcHQgPSBjID0gYXJndltvcHRpbmRdW3NwXTsKLQlpZihjID09ICc6JyB8fCAoY3A9c3RyY2hyKG9wdHMsIGMpKSA9PSBOVUxMKSB7Ci0JCUVSUigiOiBpbGxlZ2FsIG9wdGlvbiAtLSAiLCBjKTsKLQkJaWYoYXJndltvcHRpbmRdWysrc3BdID09ICdcMCcpIHsKLQkJCW9wdGluZCsrOwotCQkJc3AgPSAxOwotCQl9Ci0JCXJldHVybignPycpOwotCX0KLQlpZigqKytjcCA9PSAnOicpIHsKLQkJaWYoYXJndltvcHRpbmRdW3NwKzFdICE9ICdcMCcpCi0JCQlvcHRhcmcgPSAmYXJndltvcHRpbmQrK11bc3ArMV07Ci0JCWVsc2UgaWYoKytvcHRpbmQgPj0gYXJnYykgewotCQkJRVJSKCI6IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtLSAiLCBjKTsKLQkJCXNwID0gMTsKLQkJCXJldHVybignPycpOwotCQl9IGVsc2UKLQkJCW9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOwotCQlzcCA9IDE7Ci0JfSBlbHNlIHsKLQkJaWYoYXJndltvcHRpbmRdWysrc3BdID09ICdcMCcpIHsKLQkJCXNwID0gMTsKLQkJCW9wdGluZCsrOwotCQl9Ci0JCW9wdGFyZyA9IE5VTEw7Ci0JfQotCXJldHVybihjKTsKLX0KLQotI2VuZGlmICAvKiBfX0dOVUNfXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZ2V0b3B0LmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZ2V0b3B0LmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGVhYjU2Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2dldG9wdC5oaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi1QT1NJWCBnZXRvcHQgZm9yIFdpbmRvd3MKLQotQVQmVCBQdWJsaWMgTGljZW5zZQotCi1Db2RlIGdpdmVuIG91dCBhdCB0aGUgMTk4NSBVTklGT1JVTSBjb25mZXJlbmNlIGluIERhbGxhcy4gIAotKi8KLQotI2lmZGVmIF9fR05VQ19fCi0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jZW5kaWYKLSNpZm5kZWYgX19HTlVDX18KLQotI2lmbmRlZiBVVElMX0dFVE9QVF9ICi0jZGVmaW5lIFVUSUxfR0VUT1BUX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1leHRlcm4gaW50IG9wdGVycjsKLWV4dGVybiBpbnQgb3B0aW5kOwotZXh0ZXJuIGludCBvcHRvcHQ7Ci1leHRlcm4gY2hhciAqb3B0YXJnOwotZXh0ZXJuIGludCBnZXRvcHQoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICpvcHRzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmICAvKiBVVElMX0dFVE9QVF9IICovCi0jZW5kaWYgIC8qIF9fR05VQ19fICovCi0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL21tYXAuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9tbWFwLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2M4YTAyLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL21tYXAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyogTWVtb3J5IG1hcHBpbmcgd3JhcHBlcnMuCi0gKiBBUk0gYW5kIE1pbkdXIHBvcnRzIGNvbnRyaWJ1dGVkIGJ5IEhpZGVvIE9rdW1hIGFuZCBUb21veXVraSBZb3NoaW11cmEgYXQKLSAqIE5JQ1QuCi0gKi8KLSNpbmNsdWRlICJ1dGlsL21tYXAuaGgiCi0KLSNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKLSNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCi0jaW5jbHVkZSAidXRpbC9wYXJhbGxlbF9yZWFkLmhoIgotI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPGlvLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHV0aWwgewotCi1sb25nIFNpemVQYWdlKCkgewotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKLSAgU1lTVEVNX0lORk8gc2k7Ci0gIEdldFN5c3RlbUluZm8oJnNpKTsKLSAgcmV0dXJuIHNpLmR3QWxsb2NhdGlvbkdyYW51bGFyaXR5OwotI2Vsc2UKLSAgcmV0dXJuIHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBTeW5jT3JUaHJvdyh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCkgewotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKLSAgVVRJTF9USFJPV19JRighOjpGbHVzaFZpZXdPZkZpbGUoc3RhcnQsIGxlbmd0aCksIEVycm5vRXhjZXB0aW9uLCAiRmFpbGVkIHRvIHN5bmMgbW1hcCIpOwotI2Vsc2UKLSAgVVRJTF9USFJPV19JRihsZW5ndGggJiYgbXN5bmMoc3RhcnQsIGxlbmd0aCwgTVNfU1lOQyksIEVycm5vRXhjZXB0aW9uLCAiRmFpbGVkIHRvIHN5bmMgbW1hcCIpOwotI2VuZGlmCi19Ci0KLXZvaWQgVW5tYXBPclRocm93KHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoKSB7Ci0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotICBVVElMX1RIUk9XX0lGKCE6OlVubWFwVmlld09mRmlsZShzdGFydCksIEVycm5vRXhjZXB0aW9uLCAiRmFpbGVkIHRvIHVubWFwIGEgZmlsZSIpOwotI2Vsc2UKLSAgVVRJTF9USFJPV19JRihtdW5tYXAoc3RhcnQsIGxlbmd0aCksIEVycm5vRXhjZXB0aW9uLCAibXVubWFwIGZhaWxlZCIpOwotI2VuZGlmCi19Ci0KLXNjb3BlZF9tbWFwOjp+c2NvcGVkX21tYXAoKSB7Ci0gIGlmIChkYXRhXyAhPSAodm9pZCopLTEpIHsKLSAgICB0cnkgewotICAgICAgLy8gVGhhbmtzIERlbmlzIEZpbGltb25vdiBmb3IgcG9pbnRpbmcgb3V0IE5GUyBsaWtlcyBtc3luYyBmaXJzdC4gIAotICAgICAgU3luY09yVGhyb3coZGF0YV8sIHNpemVfKTsKLSAgICAgIFVubWFwT3JUaHJvdyhkYXRhXywgc2l6ZV8pOwotICAgIH0gY2F0Y2ggKGNvbnN0IHV0aWw6OkVycm5vRXhjZXB0aW9uICZlKSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgZS53aGF0KCk7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgfQotfQotCi12b2lkIHNjb3BlZF9tZW1vcnk6OnJlc2V0KHZvaWQgKmRhdGEsIHN0ZDo6c2l6ZV90IHNpemUsIEFsbG9jIHNvdXJjZSkgewotICBzd2l0Y2goc291cmNlXykgewotICAgIGNhc2UgTU1BUF9BTExPQ0FURUQ6Ci0gICAgICBzY29wZWRfbW1hcChkYXRhXywgc2l6ZV8pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBUlJBWV9BTExPQ0FURUQ6Ci0gICAgICBkZWxldGUgW10gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZGF0YV8pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNQUxMT0NfQUxMT0NBVEVEOgotICAgICAgZnJlZShkYXRhXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5PTkVfQUxMT0NBVEVEOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgZGF0YV8gPSBkYXRhOwotICBzaXplXyA9IHNpemU7Ci0gIHNvdXJjZV8gPSBzb3VyY2U7Ci19Ci0KLXZvaWQgc2NvcGVkX21lbW9yeTo6Y2FsbF9yZWFsbG9jKHN0ZDo6c2l6ZV90IHNpemUpIHsKLSAgYXNzZXJ0KHNvdXJjZV8gPT0gTUFMTE9DX0FMTE9DQVRFRCB8fCBzb3VyY2VfID09IE5PTkVfQUxMT0NBVEVEKTsKLSAgdm9pZCAqbmV3X2RhdGEgPSByZWFsbG9jKGRhdGFfLCBzaXplKTsKLSAgaWYgKCFuZXdfZGF0YSkgewotICAgIHJlc2V0KCk7Ci0gIH0gZWxzZSB7Ci0gICAgZGF0YV8gPSBuZXdfZGF0YTsKLSAgICBzaXplXyA9IHNpemU7Ci0gICAgc291cmNlXyA9IE1BTExPQ19BTExPQ0FURUQ7Ci0gIH0KLX0KLQotdm9pZCAqTWFwT3JUaHJvdyhzdGQ6OnNpemVfdCBzaXplLCBib29sIGZvcl93cml0ZSwgaW50IGZsYWdzLCBib29sIHByZWZhdWx0LCBpbnQgZmQsIHVpbnQ2NF90IG9mZnNldCkgewotI2lmZGVmIE1BUF9QT1BVTEFURSAvLyBMaW51eCBzcGVjaWZpYwotICBpZiAocHJlZmF1bHQpIHsKLSAgICBmbGFncyB8PSBNQVBfUE9QVUxBVEU7Ci0gIH0KLSNlbmRpZgotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKLSAgaW50IHByb3RlY3RDID0gZm9yX3dyaXRlID8gUEFHRV9SRUFEV1JJVEUgOiBQQUdFX1JFQURPTkxZOwotICBpbnQgcHJvdGVjdE0gPSBmb3Jfd3JpdGUgPyBGSUxFX01BUF9XUklURSA6IEZJTEVfTUFQX1JFQUQ7Ci0gIHVpbnQ2NF90IHRvdGFsX3NpemUgPSBzaXplICsgb2Zmc2V0OwotICBIQU5ETEUgaE1hcHBpbmcgPSBDcmVhdGVGaWxlTWFwcGluZygoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZkKSwgTlVMTCwgcHJvdGVjdEMsIHRvdGFsX3NpemUgPj4gMzIsIHN0YXRpY19jYXN0PERXT1JEPih0b3RhbF9zaXplKSwgTlVMTCk7Ci0gIFVUSUxfVEhST1dfSUYoIWhNYXBwaW5nLCBFcnJub0V4Y2VwdGlvbiwgIkNyZWF0ZUZpbGVNYXBwaW5nIGZhaWxlZCIpOwotICBMUFZPSUQgcmV0ID0gTWFwVmlld09mRmlsZShoTWFwcGluZywgcHJvdGVjdE0sIG9mZnNldCA+PiAzMiwgb2Zmc2V0LCBzaXplKTsKLSAgQ2xvc2VIYW5kbGUoaE1hcHBpbmcpOwotICBVVElMX1RIUk9XX0lGKCFyZXQsIEVycm5vRXhjZXB0aW9uLCAiTWFwVmlld09mRmlsZSBmYWlsZWQiKTsKLSNlbHNlCi0gIGludCBwcm90ZWN0ID0gZm9yX3dyaXRlID8gKFBST1RfUkVBRCB8IFBST1RfV1JJVEUpIDogUFJPVF9SRUFEOwotICB2b2lkICpyZXQ7Ci0gIFVUSUxfVEhST1dfSUYoKHJldCA9IG1tYXAoTlVMTCwgc2l6ZSwgcHJvdGVjdCwgZmxhZ3MsIGZkLCBvZmZzZXQpKSA9PSBNQVBfRkFJTEVELCBFcnJub0V4Y2VwdGlvbiwgIm1tYXAgZmFpbGVkIGZvciBzaXplICIgPDwgc2l6ZSA8PCAiIGF0IG9mZnNldCAiIDw8IG9mZnNldCk7Ci0jICBpZmRlZiBNQURWX0hVR0VQQUdFCi0gIC8qIFdlIGxpa2UgaHVnZSBwYWdlcyBidXQgaXQncyBmaW5lIGlmIHdlIGNhbid0IGhhdmUgdGhlbS4gIE5vdGUgdGhhdCBodWdlCi0gICAqIHBhZ2VzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBmaWxlLWJhY2tlZCBtbWFwIG9uIGxpbnV4LgotICAgKi8KLSAgbWFkdmlzZShyZXQsIHNpemUsIE1BRFZfSFVHRVBBR0UpOwotIyAgZW5kaWYKLSNlbmRpZgotICByZXR1cm4gcmV0OwotfQotCi1jb25zdCBpbnQga0ZpbGVGbGFncyA9Ci0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotICAwIC8vIE1hcE9yVGhyb3cgaWdub3JlcyBmbGFncyBvbiB3aW5kb3dzCi0jZWxpZiBkZWZpbmVkKE1BUF9GSUxFKQotICBNQVBfRklMRSB8IE1BUF9TSEFSRUQKLSNlbHNlCi0gIE1BUF9TSEFSRUQKLSNlbmRpZgotICA7Ci0KLXZvaWQgTWFwUmVhZChMb2FkTWV0aG9kIG1ldGhvZCwgaW50IGZkLCB1aW50NjRfdCBvZmZzZXQsIHN0ZDo6c2l6ZV90IHNpemUsIHNjb3BlZF9tZW1vcnkgJm91dCkgewotICBzd2l0Y2ggKG1ldGhvZCkgewotICAgIGNhc2UgTEFaWToKLSAgICAgIG91dC5yZXNldChNYXBPclRocm93KHNpemUsIGZhbHNlLCBrRmlsZUZsYWdzLCBmYWxzZSwgZmQsIG9mZnNldCksIHNpemUsIHNjb3BlZF9tZW1vcnk6Ok1NQVBfQUxMT0NBVEVEKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUE9QVUxBVEVfT1JfTEFaWToKLSNpZmRlZiBNQVBfUE9QVUxBVEUKLSAgICBjYXNlIFBPUFVMQVRFX09SX1JFQUQ6Ci0jZW5kaWYKLSAgICAgIG91dC5yZXNldChNYXBPclRocm93KHNpemUsIGZhbHNlLCBrRmlsZUZsYWdzLCB0cnVlLCBmZCwgb2Zmc2V0KSwgc2l6ZSwgc2NvcGVkX21lbW9yeTo6TU1BUF9BTExPQ0FURUQpOwotICAgICAgYnJlYWs7Ci0jaWZuZGVmIE1BUF9QT1BVTEFURQotICAgIGNhc2UgUE9QVUxBVEVfT1JfUkVBRDoKLSNlbmRpZgotICAgIGNhc2UgUkVBRDoKLSAgICAgIG91dC5yZXNldChNYWxsb2NPclRocm93KHNpemUpLCBzaXplLCBzY29wZWRfbWVtb3J5OjpNQUxMT0NfQUxMT0NBVEVEKTsKLSAgICAgIFNlZWtPclRocm93KGZkLCBvZmZzZXQpOwotICAgICAgUmVhZE9yVGhyb3coZmQsIG91dC5nZXQoKSwgc2l6ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBBUkFMTEVMX1JFQUQ6Ci0gICAgICBvdXQucmVzZXQoTWFsbG9jT3JUaHJvdyhzaXplKSwgc2l6ZSwgc2NvcGVkX21lbW9yeTo6TUFMTE9DX0FMTE9DQVRFRCk7Ci0gICAgICBQYXJhbGxlbFJlYWQoZmQsIG91dC5nZXQoKSwgc2l6ZSwgb2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8vIEFsbG9jYXRlcyB6ZXJvZWQgbWVtb3J5IGluIHRvLgotdm9pZCBNYXBBbm9ueW1vdXMoc3RkOjpzaXplX3Qgc2l6ZSwgdXRpbDo6c2NvcGVkX21lbW9yeSAmdG8pIHsKLSAgdG8ucmVzZXQoKTsKLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0gIHRvLnJlc2V0KGNhbGxvYygxLCBzaXplKSwgc2l6ZSwgc2NvcGVkX21lbW9yeTo6TUFMTE9DX0FMTE9DQVRFRCk7Ci0jZWxzZQotICB0by5yZXNldChNYXBPclRocm93KHNpemUsIHRydWUsCi0jICBpZiBkZWZpbmVkKE1BUF9BTk9OWU1PVVMpCi0gICAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgLy8gTGludXgKLSMgIGVsc2UKLSAgICAgIE1BUF9BTk9OIHwgTUFQX1BSSVZBVEUgLy8gQlNECi0jICBlbmRpZgotICAgICAgLCBmYWxzZSwgLTEsIDApLCBzaXplLCBzY29wZWRfbWVtb3J5OjpNTUFQX0FMTE9DQVRFRCk7Ci0jZW5kaWYKLX0KLQotdm9pZCAqTWFwWmVyb2VkV3JpdGUoaW50IGZkLCBzdGQ6OnNpemVfdCBzaXplKSB7Ci0gIFJlc2l6ZU9yVGhyb3coZmQsIDApOwotICBSZXNpemVPclRocm93KGZkLCBzaXplKTsKLSAgcmV0dXJuIE1hcE9yVGhyb3coc2l6ZSwgdHJ1ZSwga0ZpbGVGbGFncywgZmFsc2UsIGZkLCAwKTsKLX0KLQotdm9pZCAqTWFwWmVyb2VkV3JpdGUoY29uc3QgY2hhciAqbmFtZSwgc3RkOjpzaXplX3Qgc2l6ZSwgc2NvcGVkX2ZkICZmaWxlKSB7Ci0gIGZpbGUucmVzZXQoQ3JlYXRlT3JUaHJvdyhuYW1lKSk7Ci0gIHRyeSB7Ci0gICAgcmV0dXJuIE1hcFplcm9lZFdyaXRlKGZpbGUuZ2V0KCksIHNpemUpOwotICB9IGNhdGNoIChFcnJub0V4Y2VwdGlvbiAmZSkgewotICAgIGUgPDwgIiBpbiBmaWxlICIgPDwgbmFtZTsKLSAgICB0aHJvdzsKLSAgfQotfQotCi1Sb2xsaW5nOjpSb2xsaW5nKGNvbnN0IFJvbGxpbmcgJmNvcHlfZnJvbSwgdWludDY0X3QgaW5jcmVhc2UpIHsKLSAgKnRoaXMgPSBjb3B5X2Zyb207Ci0gIEluY3JlYXNlQmFzZShpbmNyZWFzZSk7Ci19Ci0KLVJvbGxpbmcgJlJvbGxpbmc6Om9wZXJhdG9yPShjb25zdCBSb2xsaW5nICZjb3B5X2Zyb20pIHsKLSAgZmRfID0gY29weV9mcm9tLmZkXzsKLSAgZmlsZV9iZWdpbl8gPSBjb3B5X2Zyb20uZmlsZV9iZWdpbl87Ci0gIGZpbGVfZW5kXyA9IGNvcHlfZnJvbS5maWxlX2VuZF87Ci0gIGZvcl93cml0ZV8gPSBjb3B5X2Zyb20uZm9yX3dyaXRlXzsKLSAgYmxvY2tfID0gY29weV9mcm9tLmJsb2NrXzsKLSAgcmVhZF9ib3VuZF8gPSBjb3B5X2Zyb20ucmVhZF9ib3VuZF87Ci0KLSAgY3VycmVudF9iZWdpbl8gPSAwOwotICBpZiAoY29weV9mcm9tLklzUGFzc3Rocm91Z2goKSkgewotICAgIGN1cnJlbnRfZW5kXyA9IGNvcHlfZnJvbS5jdXJyZW50X2VuZF87Ci0gICAgcHRyXyA9IGNvcHlfZnJvbS5wdHJfOwotICB9IGVsc2UgewotICAgIC8vIEZvcmNlIGNhbGwgb24gbmV4dCBtbWFwLgotICAgIGN1cnJlbnRfZW5kXyA9IDA7Ci0gICAgcHRyXyA9IE5VTEw7Ci0gIH0KLSAgcmV0dXJuICp0aGlzOwotfQotCi1Sb2xsaW5nOjpSb2xsaW5nKGludCBmZCwgYm9vbCBmb3Jfd3JpdGUsIHN0ZDo6c2l6ZV90IGJsb2NrLCBzdGQ6OnNpemVfdCByZWFkX2JvdW5kLCB1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IGFtb3VudCkgewotICBjdXJyZW50X2JlZ2luXyA9IDA7Ci0gIGN1cnJlbnRfZW5kXyA9IDA7Ci0gIGZkXyA9IGZkOwotICBmaWxlX2JlZ2luXyA9IG9mZnNldDsKLSAgZmlsZV9lbmRfID0gb2Zmc2V0ICsgYW1vdW50OwotICBmb3Jfd3JpdGVfID0gZm9yX3dyaXRlOwotICBibG9ja18gPSBibG9jazsKLSAgcmVhZF9ib3VuZF8gPSByZWFkX2JvdW5kOwotfQotCi12b2lkICpSb2xsaW5nOjpFeHRyYWN0Tm9uUm9sbGluZyhzY29wZWRfbWVtb3J5ICZvdXQsIHVpbnQ2NF90IGluZGV4LCBzdGQ6OnNpemVfdCBzaXplKSB7Ci0gIG91dC5yZXNldCgpOwotICBpZiAoSXNQYXNzdGhyb3VnaCgpKSByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGdldCgpKSArIGluZGV4OwotICB1aW50NjRfdCBvZmZzZXQgPSBpbmRleCArIGZpbGVfYmVnaW5fOwotICAvLyBSb3VuZCBkb3duIHRvIG11bHRpcGxlIG9mIHBhZ2Ugc2l6ZS4KLSAgdWludDY0X3QgY3J1ZnQgPSBvZmZzZXQgJSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oU2l6ZVBhZ2UoKSk7Ci0gIHN0ZDo6c2l6ZV90IG1hcF9zaXplID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHNpemUgKyBjcnVmdCk7Ci0gIG91dC5yZXNldChNYXBPclRocm93KG1hcF9zaXplLCBmb3Jfd3JpdGVfLCBrRmlsZUZsYWdzLCB0cnVlLCBmZF8sIG9mZnNldCAtIGNydWZ0KSwgbWFwX3NpemUsIHNjb3BlZF9tZW1vcnk6Ok1NQVBfQUxMT0NBVEVEKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihvdXQuZ2V0KCkpICsgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KGNydWZ0KTsKLX0KLQotdm9pZCBSb2xsaW5nOjpSb2xsKHVpbnQ2NF90IGluZGV4KSB7Ci0gIGFzc2VydCghSXNQYXNzdGhyb3VnaCgpKTsKLSAgc3RkOjpzaXplX3QgYW1vdW50OwotICBpZiAoZmlsZV9lbmRfIC0gKGluZGV4ICsgZmlsZV9iZWdpbl8pID4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJsb2NrXykpIHsKLSAgICBhbW91bnQgPSBibG9ja187Ci0gICAgY3VycmVudF9lbmRfID0gaW5kZXggKyBhbW91bnQgLSByZWFkX2JvdW5kXzsKLSAgfSBlbHNlIHsKLSAgICBhbW91bnQgPSBmaWxlX2VuZF8gLSAoaW5kZXggKyBmaWxlX2JlZ2luXyk7Ci0gICAgY3VycmVudF9lbmRfID0gaW5kZXggKyBhbW91bnQ7Ci0gIH0KLSAgcHRyXyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihFeHRyYWN0Tm9uUm9sbGluZyhtZW1fLCBpbmRleCwgYW1vdW50KSkgLSBpbmRleDsKLQotICBjdXJyZW50X2JlZ2luXyA9IGluZGV4OwotfQotCi19IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9tbWFwLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvbW1hcC5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxZTEyMC4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9tbWFwLmhoCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLSNpZm5kZWYgVVRJTF9NTUFQX0gKLSNkZWZpbmUgVVRJTF9NTUFQX0gKLS8vIFV0aWxpdGllcyBmb3IgbW1hcGVkIGZpbGVzLiAgCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi1uYW1lc3BhY2UgdXRpbCB7Ci0KLWNsYXNzIHNjb3BlZF9mZDsKLQotbG9uZyBTaXplUGFnZSgpOwotCi0vLyAodm9pZCopLTEgaXMgTUFQX0ZBSUxFRDsgdGhpcyBpcyBkb25lIHRvIGF2b2lkIGluY2x1ZGluZyB0aGUgbW1hcCBoZWFkZXIgaGVyZS4gIAotY2xhc3Mgc2NvcGVkX21tYXAgewotICBwdWJsaWM6Ci0gICAgc2NvcGVkX21tYXAoKSA6IGRhdGFfKCh2b2lkKiktMSksIHNpemVfKDApIHt9Ci0gICAgc2NvcGVkX21tYXAodm9pZCAqZGF0YSwgc3RkOjpzaXplX3Qgc2l6ZSkgOiBkYXRhXyhkYXRhKSwgc2l6ZV8oc2l6ZSkge30KLSAgICB+c2NvcGVkX21tYXAoKTsKLQotICAgIHZvaWQgKmdldCgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfOyB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRhdGFfKTsgfQotICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCgpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRhdGFfKSArIHNpemVfOyB9Ci0gICAgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9Ci0KLSAgICB2b2lkIHJlc2V0KHZvaWQgKmRhdGEsIHN0ZDo6c2l6ZV90IHNpemUpIHsKLSAgICAgIHNjb3BlZF9tbWFwIG90aGVyKGRhdGFfLCBzaXplXyk7Ci0gICAgICBkYXRhXyA9IGRhdGE7Ci0gICAgICBzaXplXyA9IHNpemU7Ci0gICAgfQotCi0gICAgdm9pZCByZXNldCgpIHsKLSAgICAgIHJlc2V0KCh2b2lkKiktMSwgMCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgdm9pZCAqZGF0YV87Ci0gICAgc3RkOjpzaXplX3Qgc2l6ZV87Ci0KLSAgICBzY29wZWRfbW1hcChjb25zdCBzY29wZWRfbW1hcCAmKTsKLSAgICBzY29wZWRfbW1hcCAmb3BlcmF0b3I9KGNvbnN0IHNjb3BlZF9tbWFwICYpOwotfTsKLQotLyogRm9yIHdoZW4gdGhlIG1lbW9yeSBtaWdodCBjb21lIGZyb20gbW1hcCwgbmV3IGNoYXJbXSwgb3IgbWFsbG9jLiAgVXNlcyBOVUxMCi0gKiBhbmQgMCBmb3IgYmxhbmtzIGV2ZW4gdGhvdWdoIG1tYXAgc2lnbmFscyBlcnJvcnMgd2l0aCAodm9pZCopLTEpLiAgVGhlIHJlc2V0Ci0gKiBmdW5jdGlvbiBjaGVja3MgdGhhdCBibGFuayBmb3IgbW1hcC4gIAotICovCi1jbGFzcyBzY29wZWRfbWVtb3J5IHsKLSAgcHVibGljOgotICAgIHR5cGVkZWYgZW51bSB7TU1BUF9BTExPQ0FURUQsIEFSUkFZX0FMTE9DQVRFRCwgTUFMTE9DX0FMTE9DQVRFRCwgTk9ORV9BTExPQ0FURUR9IEFsbG9jOwotCi0gICAgc2NvcGVkX21lbW9yeSh2b2lkICpkYXRhLCBzdGQ6OnNpemVfdCBzaXplLCBBbGxvYyBzb3VyY2UpIAotICAgICAgOiBkYXRhXyhkYXRhKSwgc2l6ZV8oc2l6ZSksIHNvdXJjZV8oc291cmNlKSB7fQotCi0gICAgc2NvcGVkX21lbW9yeSgpIDogZGF0YV8oTlVMTCksIHNpemVfKDApLCBzb3VyY2VfKE5PTkVfQUxMT0NBVEVEKSB7fQotCi0gICAgfnNjb3BlZF9tZW1vcnkoKSB7IHJlc2V0KCk7IH0KLQotICAgIHZvaWQgKmdldCgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfOyB9Ci0gICAgY29uc3QgY2hhciAqYmVnaW4oKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PGNoYXIqPihkYXRhXyk7IH0KLSAgICBjb25zdCBjaGFyICplbmQoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PGNoYXIqPihkYXRhXykgKyBzaXplXzsgfQotICAgIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQotCi0gICAgQWxsb2Mgc291cmNlKCkgY29uc3QgeyByZXR1cm4gc291cmNlXzsgfQotCi0gICAgdm9pZCByZXNldCgpIHsgcmVzZXQoTlVMTCwgMCwgTk9ORV9BTExPQ0FURUQpOyB9Ci0KLSAgICB2b2lkIHJlc2V0KHZvaWQgKmRhdGEsIHN0ZDo6c2l6ZV90IHNpemUsIEFsbG9jIGZyb20pOwotCi0gICAgLy8gcmVhbGxvYyBhbGxvd3MgdGhlIGN1cnJlbnQgZGF0YSB0byBlc2NhcGUgaGVuY2UgdGhlIG5lZWQgZm9yIHRoaXMgY2FsbAotICAgIC8vIElmIHJlYWxsb2MgZmFpbHMsIGRlc3Ryb3lzIHRoZSBvcmlnaW5hbCB0b28gYW5kIGdldCgpIHJldHVybnMgTlVMTC4KLSAgICB2b2lkIGNhbGxfcmVhbGxvYyhzdGQ6OnNpemVfdCB0byk7Ci0KLSAgcHJpdmF0ZToKLSAgICB2b2lkICpkYXRhXzsKLSAgICBzdGQ6OnNpemVfdCBzaXplXzsKLQotICAgIEFsbG9jIHNvdXJjZV87Ci0KLSAgICBzY29wZWRfbWVtb3J5KGNvbnN0IHNjb3BlZF9tZW1vcnkgJik7Ci0gICAgc2NvcGVkX21lbW9yeSAmb3BlcmF0b3I9KGNvbnN0IHNjb3BlZF9tZW1vcnkgJik7Ci19OwotCi10eXBlZGVmIGVudW0gewotICAvLyBtbWFwIHdpdGggbm8gcHJlcG9wdWxhdGUKLSAgTEFaWSwKLSAgLy8gT24gbGludXgsIHBhc3MgTUFQX1BPUFVMQVRFIHRvIG1tYXAuCi0gIFBPUFVMQVRFX09SX0xBWlksCi0gIC8vIFBvcHVsYXRlIG9uIExpbnV4LiAgbWFsbG9jIGFuZCByZWFkIG9uIG5vbi1MaW51eC4gIAotICBQT1BVTEFURV9PUl9SRUFELAotICAvLyBtYWxsb2MgYW5kIHJlYWQuICAKLSAgUkVBRCwKLSAgLy8gbWFsbG9jIGFuZCByZWFkIGluIHBhcmFsbGVsIChyZWNvbW1lbmRlZCBmb3IgTHVzdHJlKQotICBQQVJBTExFTF9SRUFELAotfSBMb2FkTWV0aG9kOwotCi1leHRlcm4gY29uc3QgaW50IGtGaWxlRmxhZ3M7Ci0KLS8vIFdyYXBwZXIgYXJvdW5kIG1tYXAgdG8gY2hlY2sgaXQgd29ya2VkIGFuZCBoaWRlIHNvbWUgcGxhdGZvcm0gbWFjcm9zLiAgCi12b2lkICpNYXBPclRocm93KHN0ZDo6c2l6ZV90IHNpemUsIGJvb2wgZm9yX3dyaXRlLCBpbnQgZmxhZ3MsIGJvb2wgcHJlZmF1bHQsIGludCBmZCwgdWludDY0X3Qgb2Zmc2V0ID0gMCk7Ci0KLXZvaWQgTWFwUmVhZChMb2FkTWV0aG9kIG1ldGhvZCwgaW50IGZkLCB1aW50NjRfdCBvZmZzZXQsIHN0ZDo6c2l6ZV90IHNpemUsIHNjb3BlZF9tZW1vcnkgJm91dCk7Ci0KLXZvaWQgTWFwQW5vbnltb3VzKHN0ZDo6c2l6ZV90IHNpemUsIHNjb3BlZF9tZW1vcnkgJnRvKTsKLQotLy8gT3BlbiBmaWxlIG5hbWUgd2l0aCBtbWFwIG9mIHNpemUgYnl0ZXMsIGFsbCBvZiB3aGljaCBhcmUgaW5pdGlhbGx5IHplcm8uICAKLXZvaWQgKk1hcFplcm9lZFdyaXRlKGludCBmZCwgc3RkOjpzaXplX3Qgc2l6ZSk7Ci12b2lkICpNYXBaZXJvZWRXcml0ZShjb25zdCBjaGFyICpuYW1lLCBzdGQ6OnNpemVfdCBzaXplLCBzY29wZWRfZmQgJmZpbGUpOwotCi0vLyBtc3luYyB3cmFwcGVyIAotdm9pZCBTeW5jT3JUaHJvdyh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCk7Ci0KLS8vIEZvcndhcmQgcm9sbGluZyBtZW1vcnkgbWFwIHdpdGggbm8gb3ZlcmxhcC4KLWNsYXNzIFJvbGxpbmcgewotICBwdWJsaWM6Ci0gICAgUm9sbGluZygpIHt9Ci0gICAgCi0gICAgZXhwbGljaXQgUm9sbGluZyh2b2lkICpkYXRhKSB7IEluaXQoZGF0YSk7IH0KLQotICAgIFJvbGxpbmcoY29uc3QgUm9sbGluZyAmY29weV9mcm9tLCB1aW50NjRfdCBpbmNyZWFzZSA9IDApOwotICAgIFJvbGxpbmcgJm9wZXJhdG9yPShjb25zdCBSb2xsaW5nICZjb3B5X2Zyb20pOwotCi0gICAgLy8gRm9yIGFuIGFjdHVhbCByb2xsaW5nIG1tYXAuCi0gICAgZXhwbGljaXQgUm9sbGluZyhpbnQgZmQsIGJvb2wgZm9yX3dyaXRlLCBzdGQ6OnNpemVfdCBibG9jaywgc3RkOjpzaXplX3QgcmVhZF9ib3VuZCwgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBhbW91bnQpOwotCi0gICAgLy8gRm9yIGEgc3RhdGljIG1hcHBpbmcKLSAgICB2b2lkIEluaXQodm9pZCAqZGF0YSkgewotICAgICAgcHRyXyA9IGRhdGE7Ci0gICAgICBjdXJyZW50X2VuZF8gPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCk7Ci0gICAgICBjdXJyZW50X2JlZ2luXyA9IDA7Ci0gICAgICAvLyBNYXJrIGFzIGEgcGFzcy10aHJvdWdoLgotICAgICAgZmRfID0gLTE7Ci0gICAgfQotCi0gICAgdm9pZCBJbmNyZWFzZUJhc2UodWludDY0X3QgYnkpIHsKLSAgICAgIGZpbGVfYmVnaW5fICs9IGJ5OwotICAgICAgcHRyXyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihwdHJfKSArIGJ5OwotICAgICAgaWYgKCFJc1Bhc3N0aHJvdWdoKCkpIGN1cnJlbnRfZW5kXyA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCBEZWNyZWFzZUJhc2UodWludDY0X3QgYnkpIHsKLSAgICAgIGZpbGVfYmVnaW5fIC09IGJ5OwotICAgICAgcHRyXyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihwdHJfKSAtIGJ5OwotICAgICAgaWYgKCFJc1Bhc3N0aHJvdWdoKCkpIGN1cnJlbnRfZW5kXyA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCAqRXh0cmFjdE5vblJvbGxpbmcoc2NvcGVkX21lbW9yeSAmb3V0LCB1aW50NjRfdCBpbmRleCwgc3RkOjpzaXplX3Qgc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm5zIGJhc2UgcG9pbnRlcgotICAgIHZvaWQgKmdldCgpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KLQotICAgIC8vIFJldHVybnMgYmFzZSBwb2ludGVyLgotICAgIHZvaWQgKkNoZWNrZWRCYXNlKHVpbnQ2NF90IGluZGV4KSB7Ci0gICAgICBpZiAoaW5kZXggPj0gY3VycmVudF9lbmRfIHx8IGluZGV4IDwgY3VycmVudF9iZWdpbl8pIHsKLSAgICAgICAgUm9sbChpbmRleCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcHRyXzsKLSAgICB9Ci0gICAgCi0gICAgLy8gUmV0dXJucyBpbmRleGVkIHBvaW50ZXIuCi0gICAgdm9pZCAqQ2hlY2tlZEluZGV4KHVpbnQ2NF90IGluZGV4KSB7Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdCo+KENoZWNrZWRCYXNlKGluZGV4KSkgKyBpbmRleDsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB2b2lkIFJvbGwodWludDY0X3QgaW5kZXgpOwotCi0gICAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgb24gYSBwb2ludGVyLgotICAgIGJvb2wgSXNQYXNzdGhyb3VnaCgpIGNvbnN0IHsgcmV0dXJuIGZkXyA9PSAtMTsgfQotCi0gICAgdm9pZCAqcHRyXzsKLSAgICB1aW50NjRfdCBjdXJyZW50X2JlZ2luXzsKLSAgICB1aW50NjRfdCBjdXJyZW50X2VuZF87Ci0gICAgCi0gICAgc2NvcGVkX21lbW9yeSBtZW1fOwotCi0gICAgaW50IGZkXzsKLSAgICB1aW50NjRfdCBmaWxlX2JlZ2luXzsKLSAgICB1aW50NjRfdCBmaWxlX2VuZF87Ci0KLSAgICBib29sIGZvcl93cml0ZV87Ci0gICAgc3RkOjpzaXplX3QgYmxvY2tfOwotICAgIHN0ZDo6c2l6ZV90IHJlYWRfYm91bmRfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgdXRpbAotCi0jZW5kaWYgLy8gVVRJTF9NTUFQX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL211bHRpX2ludGVyc2VjdGlvbi5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL211bHRpX2ludGVyc2VjdGlvbi5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1NWFjYy4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9tdWx0aV9pbnRlcnNlY3Rpb24uaGgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jaWZuZGVmIFVUSUxfTVVMVElfSU5URVJTRUNUSU9OX0gKLSNkZWZpbmUgVVRJTF9NVUxUSV9JTlRFUlNFQ1RJT05fSAotCi0jaW5jbHVkZSA8Ym9vc3Qvb3B0aW9uYWwuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2l0ZXJhdG9yX3JhbmdlLmhwcD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIHV0aWwgewotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLXRlbXBsYXRlIDxjbGFzcyBSYW5nZT4gc3RydWN0IFJhbmdlTGVzc0J5U2l6ZSA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxjb25zdCBSYW5nZSAmLCBjb25zdCBSYW5nZSAmLCBib29sPiB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYW5nZSAmbGVmdCwgY29uc3QgUmFuZ2UgJnJpZ2h0KSBjb25zdCB7Ci0gICAgcmV0dXJuIGxlZnQuc2l6ZSgpIDwgcmlnaHQuc2l6ZSgpOwotICB9Ci19OwotCi0vKiBUYWtlcyBzZXRzIHNwZWNpZmllZCBieSB0aGVpciBpdGVyYXRvcnMgYW5kIGEgYm9vc3Q6Om9wdGlvbmFsIGNvbnRhaW5pbmcKLSAqIHRoZSBsb3dlc3QgaW50ZXJzZWN0aW9uIGlmIGFueS4gIEVhY2ggc2V0IG11c3QgYmUgc29ydGVkIGluIGluY3JlYXNpbmcKLSAqIG9yZGVyLiAgc2V0cyBpcyBjaGFuZ2VkIHRvIHRydW5jYXRlIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzZXF1ZW5jZSB0byB0aGUKLSAqIGxvY2F0aW9uIG9mIHRoZSBtYXRjaCBvciBhbiBlbXB0eSBzZXQuICBQcmVjb25kaXRpb246IHNldHMgaXMgbm90IGVtcHR5Ci0gKiBzaW5jZSB0aGUgaW50ZXJzZWN0aW9uIG92ZXIgbnVsbCBpcyB0aGUgdW5pdmVyc2UgYW5kIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QKLSAqIGtub3cgdGhlIHVuaXZlcnNlLiAgIAotICovCi10ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IsIGNsYXNzIExlc3M+IGJvb3N0OjpvcHRpb25hbDx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGU+IEZpcnN0SW50ZXJzZWN0aW9uU29ydGVkKHN0ZDo6dmVjdG9yPGJvb3N0OjppdGVyYXRvcl9yYW5nZTxJdGVyYXRvcj4gPiAmc2V0cywgY29uc3QgTGVzcyAmbGVzcyA9IHN0ZDo6bGVzczx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KCkpIHsKLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxib29zdDo6aXRlcmF0b3JfcmFuZ2U8SXRlcmF0b3I+ID4gU2V0czsKLSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGUgVmFsdWU7Ci0KLSAgYXNzZXJ0KCFzZXRzLmVtcHR5KCkpOwotCi0gIGlmIChzZXRzLmZyb250KCkuZW1wdHkoKSkgcmV0dXJuIGJvb3N0OjpvcHRpb25hbDxWYWx1ZT4oKTsKLSAgLy8gUG9zc2libHkgc3Vib3B0aW1hbCB0byBjb3B5IGZvciBnZW5lcmFsIFZhbHVlOyBtYWtlcyB1bnNpZ25lZCBpbnQgZ28gc2xpZ2h0bHkgZmFzdGVyLiAgCi0gIFZhbHVlIGhpZ2hlc3Qoc2V0cy5mcm9udCgpLmZyb250KCkpOwotICBmb3IgKHR5cGVuYW1lIFNldHM6Oml0ZXJhdG9yIGkoc2V0cy5iZWdpbigpKTsgaSAhPSBzZXRzLmVuZCgpOyApIHsKLSAgICBpLT5hZHZhbmNlX2JlZ2luKHN0ZDo6bG93ZXJfYm91bmQoaS0+YmVnaW4oKSwgaS0+ZW5kKCksIGhpZ2hlc3QsIGxlc3MpIC0gaS0+YmVnaW4oKSk7Ci0gICAgaWYgKGktPmVtcHR5KCkpIHJldHVybiBib29zdDo6b3B0aW9uYWw8VmFsdWU+KCk7Ci0gICAgaWYgKGxlc3MoaGlnaGVzdCwgaS0+ZnJvbnQoKSkpIHsKLSAgICAgIGhpZ2hlc3QgPSBpLT5mcm9udCgpOwotICAgICAgLy8gc3RhcnQgb3ZlcgotICAgICAgaSA9IHNldHMuYmVnaW4oKTsKLSAgICB9IGVsc2UgewotICAgICAgKytpOwotICAgIH0KLSAgfQotICByZXR1cm4gYm9vc3Q6Om9wdGlvbmFsPFZhbHVlPihoaWdoZXN0KTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLXRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvciwgY2xhc3MgTGVzcz4gYm9vc3Q6Om9wdGlvbmFsPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4gRmlyc3RJbnRlcnNlY3Rpb24oc3RkOjp2ZWN0b3I8Ym9vc3Q6Oml0ZXJhdG9yX3JhbmdlPEl0ZXJhdG9yPiA+ICZzZXRzLCBjb25zdCBMZXNzIGxlc3MpIHsKLSAgYXNzZXJ0KCFzZXRzLmVtcHR5KCkpOwotCi0gIHN0ZDo6c29ydChzZXRzLmJlZ2luKCksIHNldHMuZW5kKCksIGRldGFpbDo6UmFuZ2VMZXNzQnlTaXplPGJvb3N0OjppdGVyYXRvcl9yYW5nZTxJdGVyYXRvcj4gPigpKTsKLSAgcmV0dXJuIGRldGFpbDo6Rmlyc3RJbnRlcnNlY3Rpb25Tb3J0ZWQoc2V0cywgbGVzcyk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gYm9vc3Q6Om9wdGlvbmFsPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4gRmlyc3RJbnRlcnNlY3Rpb24oc3RkOjp2ZWN0b3I8Ym9vc3Q6Oml0ZXJhdG9yX3JhbmdlPEl0ZXJhdG9yPiA+ICZzZXRzKSB7Ci0gIHJldHVybiBGaXJzdEludGVyc2VjdGlvbihzZXRzLCBzdGQ6Omxlc3M8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPigpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yLCBjbGFzcyBPdXRwdXQsIGNsYXNzIExlc3M+IHZvaWQgQWxsSW50ZXJzZWN0aW9uKHN0ZDo6dmVjdG9yPGJvb3N0OjppdGVyYXRvcl9yYW5nZTxJdGVyYXRvcj4gPiAmc2V0cywgT3V0cHV0ICZvdXQsIGNvbnN0IExlc3MgbGVzcykgewotICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBWYWx1ZTsKLSAgYXNzZXJ0KCFzZXRzLmVtcHR5KCkpOwotCi0gIHN0ZDo6c29ydChzZXRzLmJlZ2luKCksIHNldHMuZW5kKCksIGRldGFpbDo6UmFuZ2VMZXNzQnlTaXplPGJvb3N0OjppdGVyYXRvcl9yYW5nZTxJdGVyYXRvcj4gPigpKTsKLSAgYm9vc3Q6Om9wdGlvbmFsPFZhbHVlPiByZXQ7Ci0gIGZvciAoYm9vc3Q6Om9wdGlvbmFsPFZhbHVlPiByZXQ7IChyZXQgPSBkZXRhaWw6OkZpcnN0SW50ZXJzZWN0aW9uU29ydGVkKHNldHMsIGxlc3MpKTsgc2V0cy5mcm9udCgpLmFkdmFuY2VfYmVnaW4oMSkpIHsKLSAgICBvdXQoKnJldCk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yLCBjbGFzcyBPdXRwdXQ+IHZvaWQgQWxsSW50ZXJzZWN0aW9uKHN0ZDo6dmVjdG9yPGJvb3N0OjppdGVyYXRvcl9yYW5nZTxJdGVyYXRvcj4gPiAmc2V0cywgT3V0cHV0ICZvdXQpIHsKLSAgQWxsSW50ZXJzZWN0aW9uKHNldHMsIG91dCwgc3RkOjpsZXNzPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKLQotI2VuZGlmIC8vIFVUSUxfTVVMVElfSU5URVJTRUNUSU9OX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL211bHRpX2ludGVyc2VjdGlvbl90ZXN0LmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvbXVsdGlfaW50ZXJzZWN0aW9uX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MGFmYzEuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvbXVsdGlfaW50ZXJzZWN0aW9uX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jaW5jbHVkZSAidXRpbC9tdWx0aV9pbnRlcnNlY3Rpb24uaGgiCi0KLSNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgTXVsdGlJbnRlcnNlY3Rpb25UZXN0Ci0jaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgotCi1uYW1lc3BhY2UgdXRpbCB7Ci1uYW1lc3BhY2UgewotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShFbXB0eSkgewotICBzdGQ6OnZlY3Rvcjxib29zdDo6aXRlcmF0b3JfcmFuZ2U8Y29uc3QgdW5zaWduZWQgaW50Kj4gPiBzZXRzOwotICAKLSAgc2V0cy5wdXNoX2JhY2soYm9vc3Q6Oml0ZXJhdG9yX3JhbmdlPGNvbnN0IHVuc2lnbmVkIGludCo+KHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGludCo+KE5VTEwpLCBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBpbnQqPihOVUxMKSkpOwotICBCT09TVF9DSEVDSyghRmlyc3RJbnRlcnNlY3Rpb24oc2V0cykpOwotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShTaW5nbGUpIHsKLSAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiBudW1zOwotICBudW1zLnB1c2hfYmFjaygxKTsKLSAgbnVtcy5wdXNoX2JhY2soNCk7Ci0gIG51bXMucHVzaF9iYWNrKDEwMCk7Ci0gIHN0ZDo6dmVjdG9yPGJvb3N0OjppdGVyYXRvcl9yYW5nZTxzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+Ojpjb25zdF9pdGVyYXRvcj4gPiBzZXRzOwotICBzZXRzLnB1c2hfYmFjayhudW1zKTsKLQotICBib29zdDo6b3B0aW9uYWw8dW5zaWduZWQgaW50PiByZXQoRmlyc3RJbnRlcnNlY3Rpb24oc2V0cykpOwotCi0gIEJPT1NUX1JFUVVJUkUocmV0KTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigxKSwgKnJldCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBULCB1bnNpZ25lZCBpbnQgbGVuPiBib29zdDo6aXRlcmF0b3JfcmFuZ2U8Y29uc3QgVCo+IFJhbmdlRnJvbUFycmF5KGNvbnN0IFQgKCZhcnIpW2xlbl0pIHsKLSAgcmV0dXJuIGJvb3N0OjppdGVyYXRvcl9yYW5nZTxjb25zdCBUKj4oYXJyLCBhcnIgKyBsZW4pOwotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShNdWx0aU5vbmUpIHsKLSAgdW5zaWduZWQgaW50IG51bXMwW10gPSB7MSwgMywgNCwgMjJ9OwotICB1bnNpZ25lZCBpbnQgbnVtczFbXSA9IHsyLCA1LCAxMn07Ci0gIHVuc2lnbmVkIGludCBudW1zMltdID0gezQsIDE3fTsKLQotICBzdGQ6OnZlY3Rvcjxib29zdDo6aXRlcmF0b3JfcmFuZ2U8Y29uc3QgdW5zaWduZWQgaW50Kj4gPiBzZXRzOwotICBzZXRzLnB1c2hfYmFjayhSYW5nZUZyb21BcnJheShudW1zMCkpOwotICBzZXRzLnB1c2hfYmFjayhSYW5nZUZyb21BcnJheShudW1zMSkpOwotICBzZXRzLnB1c2hfYmFjayhSYW5nZUZyb21BcnJheShudW1zMikpOwotCi0gIEJPT1NUX0NIRUNLKCFGaXJzdEludGVyc2VjdGlvbihzZXRzKSk7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKE11bHRpT25lKSB7Ci0gIHVuc2lnbmVkIGludCBudW1zMFtdID0gezEsIDMsIDQsIDE3LCAyMn07Ci0gIHVuc2lnbmVkIGludCBudW1zMVtdID0gezIsIDUsIDEyLCAxN307Ci0gIHVuc2lnbmVkIGludCBudW1zMltdID0gezQsIDE3fTsKLQotICBzdGQ6OnZlY3Rvcjxib29zdDo6aXRlcmF0b3JfcmFuZ2U8Y29uc3QgdW5zaWduZWQgaW50Kj4gPiBzZXRzOwotICBzZXRzLnB1c2hfYmFjayhSYW5nZUZyb21BcnJheShudW1zMCkpOwotICBzZXRzLnB1c2hfYmFjayhSYW5nZUZyb21BcnJheShudW1zMSkpOwotICBzZXRzLnB1c2hfYmFjayhSYW5nZUZyb21BcnJheShudW1zMikpOwotCi0gIGJvb3N0OjpvcHRpb25hbDx1bnNpZ25lZCBpbnQ+IHJldChGaXJzdEludGVyc2VjdGlvbihzZXRzKSk7Ci0gIEJPT1NUX1JFUVVJUkUocmV0KTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigxNyksICpyZXQpOwotfQotCi19IC8vIG5hbWVzcGFjZQotfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvbXVybXVyX2hhc2guY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9tdXJtdXJfaGFzaC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5NjY4Yy4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9tdXJtdXJfaGFzaC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKiBEb3dubG9hZGVkIGZyb20gaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vc2l0ZS9tdXJtdXJoYXNoLyB3aGljaCBzYXlzICJBbGwKLSAqIGNvZGUgaXMgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4uIEZvciBidXNpbmVzcyBwdXJwb3NlcywgTXVybXVyaGFzaCBpcwotICogdW5kZXIgdGhlIE1JVCBsaWNlbnNlLiIKLSAqIFRoaXMgaXMgbW9kaWZpZWQgZnJvbSB0aGUgb3JpZ2luYWw6Ci0gKiBVTEwgdGFnIG9uIDB4YzZhNGE3OTM1YmQxZTk5NSBzbyB0aGlzIHdpbGwgY29tcGlsZSBvbiAzMi1iaXQuICAKLSAqIGxlbmd0aCBjaGFuZ2VkIHRvIHVuc2lnbmVkIGludC4gIAotICogcGxhY2VkIGluIG5hbWVzcGFjZSB1dGlsCi0gKiBhZGQgTXVybXVySGFzaE5hdGl2ZQotICogZGVmYXVsdCBvcHRpb24gPSAwIGZvciBzZWVkCi0gKiBBUk0gcG9ydCBmcm9tIE5JQ1QKLSAqLwotCi0jaW5jbHVkZSAidXRpbC9tdXJtdXJfaGFzaC5oaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotbmFtZXNwYWNlIHV0aWwgewotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNdXJtdXJIYXNoMiwgNjQtYml0IHZlcnNpb25zLCBieSBBdXN0aW4gQXBwbGVieQotCi0vLyBUaGUgc2FtZSBjYXZlYXRzIGFzIDMyLWJpdCBNdXJtdXJIYXNoMiBhcHBseSBoZXJlIC0gYmV3YXJlIG9mIGFsaWdubWVudCAKLS8vIGFuZCBlbmRpYW4tbmVzcyBpc3N1ZXMgaWYgdXNlZCBhY3Jvc3MgbXVsdGlwbGUgcGxhdGZvcm1zLgotCi0vLyA2NC1iaXQgaGFzaCBmb3IgNjQtYml0IHBsYXRmb3JtcwotCi11aW50NjRfdCBNdXJtdXJIYXNoNjRBICggY29uc3Qgdm9pZCAqIGtleSwgc3RkOjpzaXplX3QgbGVuLCB1aW50NjRfdCBzZWVkICkKLXsKLSAgY29uc3QgdWludDY0X3QgbSA9IDB4YzZhNGE3OTM1YmQxZTk5NVVMTDsKLSAgY29uc3QgaW50IHIgPSA0NzsKLQotICB1aW50NjRfdCBoID0gc2VlZCBeIChsZW4gKiBtKTsKLQotI2lmIGRlZmluZWQoX19hcm0pIHx8IGRlZmluZWQoX19hcm1fXykKLSAgY29uc3Qgc2l6ZV90IGtzaXplID0gc2l6ZW9mKHVpbnQ2NF90KTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqIGRhdGEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWtleTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqIGVuZCA9IGRhdGEgKyAoc3RkOjpzaXplX3QpKGxlbi84KSAqIGtzaXplOwotI2Vsc2UKLSAgY29uc3QgdWludDY0X3QgKiBkYXRhID0gKGNvbnN0IHVpbnQ2NF90ICopa2V5OwotICBjb25zdCB1aW50NjRfdCAqIGVuZCA9IGRhdGEgKyAobGVuLzgpOwotI2VuZGlmCi0KLSAgd2hpbGUoZGF0YSAhPSBlbmQpCi0gIHsKLSNpZiBkZWZpbmVkKF9fYXJtKSB8fCBkZWZpbmVkKF9fYXJtX18pCi0gICAgdWludDY0X3QgazsKLSAgICBtZW1jcHkoJmssIGRhdGEsIGtzaXplKTsKLSAgICBkYXRhICs9IGtzaXplOwotI2Vsc2UKLSAgICB1aW50NjRfdCBrID0gKmRhdGErKzsKLSNlbmRpZgotCi0gICAgayAqPSBtOyAKLSAgICBrIF49IGsgPj4gcjsgCi0gICAgayAqPSBtOyAKLSAgICAKLSAgICBoIF49IGs7Ci0gICAgaCAqPSBtOyAKLSAgfQotCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBkYXRhMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilkYXRhOwotCi0gIHN3aXRjaChsZW4gJiA3KQotICB7Ci0gIGNhc2UgNzogaCBePSB1aW50NjRfdChkYXRhMls2XSkgPDwgNDg7Ci0gIGNhc2UgNjogaCBePSB1aW50NjRfdChkYXRhMls1XSkgPDwgNDA7Ci0gIGNhc2UgNTogaCBePSB1aW50NjRfdChkYXRhMls0XSkgPDwgMzI7Ci0gIGNhc2UgNDogaCBePSB1aW50NjRfdChkYXRhMlszXSkgPDwgMjQ7Ci0gIGNhc2UgMzogaCBePSB1aW50NjRfdChkYXRhMlsyXSkgPDwgMTY7Ci0gIGNhc2UgMjogaCBePSB1aW50NjRfdChkYXRhMlsxXSkgPDwgODsKLSAgY2FzZSAxOiBoIF49IHVpbnQ2NF90KGRhdGEyWzBdKTsKLSAgICAgICAgICBoICo9IG07Ci0gIH07Ci0gCi0gIGggXj0gaCA+PiByOwotICBoICo9IG07Ci0gIGggXj0gaCA+PiByOwotCi0gIHJldHVybiBoOwotfSAKLQotCi0vLyA2NC1iaXQgaGFzaCBmb3IgMzItYml0IHBsYXRmb3JtcwotCi11aW50NjRfdCBNdXJtdXJIYXNoNjRCICggY29uc3Qgdm9pZCAqIGtleSwgc3RkOjpzaXplX3QgbGVuLCB1aW50NjRfdCBzZWVkICkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG0gPSAweDViZDFlOTk1OwotICBjb25zdCBpbnQgciA9IDI0OwotCi0gIHVuc2lnbmVkIGludCBoMSA9IHNlZWQgXiBsZW47Ci0gIHVuc2lnbmVkIGludCBoMiA9IDA7Ci0KLSNpZiBkZWZpbmVkKF9fYXJtKSB8fCBkZWZpbmVkKF9fYXJtX18pCi0gIHNpemVfdCBrc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBpbnQpOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogZGF0YSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopa2V5OwotI2Vsc2UKLSAgY29uc3QgdW5zaWduZWQgaW50ICogZGF0YSA9IChjb25zdCB1bnNpZ25lZCBpbnQgKilrZXk7Ci0jZW5kaWYKLQotICB1bnNpZ25lZCBpbnQgazEsIGsyOwotICB3aGlsZShsZW4gPj0gOCkKLSAgewotI2lmIGRlZmluZWQoX19hcm0pIHx8IGRlZmluZWQoX19hcm1fXykKLSAgICBtZW1jcHkoJmsxLCBkYXRhLCBrc2l6ZSk7Ci0gICAgZGF0YSArPSBrc2l6ZTsKLSAgICBtZW1jcHkoJmsyLCBkYXRhLCBrc2l6ZSk7Ci0gICAgZGF0YSArPSBrc2l6ZTsKLSNlbHNlCi0gICAgazEgPSAqZGF0YSsrOwotICAgIGsyID0gKmRhdGErKzsKLSNlbmRpZgotCi0gICAgazEgKj0gbTsgazEgXj0gazEgPj4gcjsgazEgKj0gbTsKLSAgICBoMSAqPSBtOyBoMSBePSBrMTsKLSAgICBsZW4gLT0gNDsKLQotICAgIGsyICo9IG07IGsyIF49IGsyID4+IHI7IGsyICo9IG07Ci0gICAgaDIgKj0gbTsgaDIgXj0gazI7Ci0gICAgbGVuIC09IDQ7Ci0gIH0KLQotICBpZihsZW4gPj0gNCkKLSAgewotI2lmIGRlZmluZWQoX19hcm0pIHx8IGRlZmluZWQoX19hcm1fXykKLSAgICBtZW1jcHkoJmsxLCBkYXRhLCBrc2l6ZSk7Ci0gICAgZGF0YSArPSBrc2l6ZTsKLSNlbHNlCi0gICAgazEgPSAqZGF0YSsrOwotI2VuZGlmCi0gICAgazEgKj0gbTsgazEgXj0gazEgPj4gcjsgazEgKj0gbTsKLSAgICBoMSAqPSBtOyBoMSBePSBrMTsKLSAgICBsZW4gLT0gNDsKLSAgfQotCi0gIHN3aXRjaChsZW4pCi0gIHsKLSAgY2FzZSAzOiBoMiBePSAoKHVuc2lnbmVkIGNoYXIqKWRhdGEpWzJdIDw8IDE2OwotICBjYXNlIDI6IGgyIF49ICgodW5zaWduZWQgY2hhciopZGF0YSlbMV0gPDwgODsKLSAgY2FzZSAxOiBoMiBePSAoKHVuc2lnbmVkIGNoYXIqKWRhdGEpWzBdOwotICAgICAgaDIgKj0gbTsKLSAgfTsKLQotICBoMSBePSBoMiA+PiAxODsgaDEgKj0gbTsKLSAgaDIgXj0gaDEgPj4gMjI7IGgyICo9IG07Ci0gIGgxIF49IGgyID4+IDE3OyBoMSAqPSBtOwotICBoMiBePSBoMSA+PiAxOTsgaDIgKj0gbTsKLQotICB1aW50NjRfdCBoID0gaDE7Ci0KLSAgaCA9IChoIDw8IDMyKSB8IGgyOwotCi0gIHJldHVybiBoOwotfQotCi0vLyBUcmljayB0byB0ZXN0IGZvciA2NC1iaXQgYXJjaGl0ZWN0dXJlIGF0IGNvbXBpbGUgdGltZS4gIAotbmFtZXNwYWNlIHsKLSNpZmRlZiBfX2NsYW5nX18KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtZnVuY3Rpb24iCi0jZW5kaWYKLXRlbXBsYXRlIDx1bnNpZ25lZCBMPiBpbmxpbmUgdWludDY0X3QgTXVybXVySGFzaE5hdGl2ZUJhY2tlbmQoY29uc3Qgdm9pZCAqIGtleSwgc3RkOjpzaXplX3QgbGVuLCB1aW50NjRfdCBzZWVkKSB7Ci0gIHJldHVybiBNdXJtdXJIYXNoNjRBKGtleSwgbGVuLCBzZWVkKTsKLX0KLXRlbXBsYXRlIDw+IGlubGluZSB1aW50NjRfdCBNdXJtdXJIYXNoTmF0aXZlQmFja2VuZDw0Pihjb25zdCB2b2lkICoga2V5LCBzdGQ6OnNpemVfdCBsZW4sIHVpbnQ2NF90IHNlZWQpIHsKLSAgcmV0dXJuIE11cm11ckhhc2g2NEIoa2V5LCBsZW4sIHNlZWQpOwotfQotI2lmZGVmIF9fY2xhbmdfXwotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAotI2VuZGlmCi19IC8vIG5hbWVzcGFjZQotCi11aW50NjRfdCBNdXJtdXJIYXNoTmF0aXZlKGNvbnN0IHZvaWQgKiBrZXksIHN0ZDo6c2l6ZV90IGxlbiwgdWludDY0X3Qgc2VlZCkgewotICByZXR1cm4gTXVybXVySGFzaE5hdGl2ZUJhY2tlbmQ8c2l6ZW9mKHZvaWQqKT4oa2V5LCBsZW4sIHNlZWQpOwotfQotCi19IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wY3F1ZXVlLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvcGNxdWV1ZS5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmZmVlNy4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wY3F1ZXVlLmhoCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSNpZm5kZWYgVVRJTF9QQ1FVRVVFX0gKLSNkZWZpbmUgVVRJTF9QQ1FVRVVFX0gKLQotI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgotCi0jaW5jbHVkZSA8Ym9vc3QvaW50ZXJwcm9jZXNzL3N5bmMvaW50ZXJwcm9jZXNzX3NlbWFwaG9yZS5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX2FycmF5LmhwcD4KLSNpbmNsdWRlIDxib29zdC90aHJlYWQvbXV0ZXguaHBwPgotI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkuaHBwPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2lmZGVmIF9fQVBQTEVfXwotI2luY2x1ZGUgPG1hY2gvc2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8bWFjaC90YXNrLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYWNoX3RyYXBzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYWNoLmg+Ci0jZW5kaWYgLy8gX19BUFBMRV9fCi0KLW5hbWVzcGFjZSB1dGlsIHsKLQotLyogT1MgWCBNYXZlcmljayBhbmQgQm9vc3QgaW50ZXJwcm9jZXNzIHdlcmUgZG9pbmcgIkZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZC4iCi0gKiBTbyB0aGlzIGlzIG15IG93biB3cmFwcGVyIGFyb3VuZCB0aGUgbWFjaCBrZXJuZWwgQVBJcy4KLSAqLwotI2lmZGVmIF9fQVBQTEVfXwotCi0jZGVmaW5lIE1BQ0hfQ0FMTChjYWxsKSBVVElMX1RIUk9XX0lGKEtFUk5fU1VDQ0VTUyAhPSAoY2FsbCksIEV4Y2VwdGlvbiwgIk1hY2ggY2FsbCBmYWlsdXJlIikKLQotY2xhc3MgU2VtYXBob3JlIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IFNlbWFwaG9yZShpbnQgdmFsdWUpIDogdGFza18obWFjaF90YXNrX3NlbGYoKSkgewotICAgICAgTUFDSF9DQUxMKHNlbWFwaG9yZV9jcmVhdGUodGFza18sICZiYWNrXywgU1lOQ19QT0xJQ1lfRklGTywgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICB+U2VtYXBob3JlKCkgewotICAgICAgTUFDSF9DQUxMKHNlbWFwaG9yZV9kZXN0cm95KHRhc2tfLCBiYWNrXykpOwotICAgIH0KLQotICAgIHZvaWQgd2FpdCgpIHsKLSAgICAgIE1BQ0hfQ0FMTChzZW1hcGhvcmVfd2FpdChiYWNrXykpOwotICAgIH0KLQotICAgIHZvaWQgcG9zdCgpIHsKLSAgICAgIE1BQ0hfQ0FMTChzZW1hcGhvcmVfc2lnbmFsKGJhY2tfKSk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgc2VtYXBob3JlX3QgYmFja187Ci0gICAgdGFza190IHRhc2tfOwotfTsKLQotaW5saW5lIHZvaWQgV2FpdFNlbWFwaG9yZShTZW1hcGhvcmUgJnNlbWFwaG9yZSkgewotICBzZW1hcGhvcmUud2FpdCgpOwotfQotCi0jZWxzZQotdHlwZWRlZiBib29zdDo6aW50ZXJwcm9jZXNzOjppbnRlcnByb2Nlc3Nfc2VtYXBob3JlIFNlbWFwaG9yZTsKLQotaW5saW5lIHZvaWQgV2FpdFNlbWFwaG9yZSAoU2VtYXBob3JlICZvbikgewotICB3aGlsZSAoMSkgewotICAgIHRyeSB7Ci0gICAgICBvbi53YWl0KCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2F0Y2ggKGJvb3N0OjppbnRlcnByb2Nlc3M6OmludGVycHJvY2Vzc19leGNlcHRpb24gJmUpIHsKLSAgICAgIGlmIChlLmdldF9uYXRpdmVfZXJyb3IoKSAhPSBFSU5UUikgewotICAgICAgICB0aHJvdzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotI2VuZGlmIC8vIF9fQVBQTEVfXwotCi0vKioKLSAqIFByb2R1Y2VyIGNvbnN1bWVyIHF1ZXVlIHNhZmUgZm9yIG11bHRpcGxlIHByb2R1Y2VycyBhbmQgbXVsdGlwbGUgY29uc3VtZXJzLgotICogVCBtdXN0IGJlIGRlZmF1bHQgY29uc3RydWN0YWJsZSBhbmQgaGF2ZSBvcGVyYXRvcj0uICAKLSAqIFRoZSB2YWx1ZSBpcyBjb3BpZWQgdHdpY2UgZm9yIENvbnN1bWUoVCAmb3V0KSBvciB0aHJlZSB0aW1lcyBmb3IgQ29uc3VtZSgpLAotICogc28gbGFyZ2VyIG9iamVjdHMgc2hvdWxkIGJlIHBhc3NlZCB2aWEgcG9pbnRlci4KLSAqIFN0cm9uZyBleGNlcHRpb24gZ3VhcmFudGVlIGlmIG9wZXJhdG9yPSB0aHJvd3MuICBVbmRlZmluZWQgaWYgc2VtYXBob3JlcyB0aHJvdy4gIAotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgUENRdWV1ZSA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQQ1F1ZXVlKHNpemVfdCBzaXplKQotICAgOiBlbXB0eV8oc2l6ZSksIHVzZWRfKDApLAotICAgICBzdG9yYWdlXyhuZXcgVFtzaXplXSksCi0gICAgIGVuZF8oc3RvcmFnZV8uZ2V0KCkgKyBzaXplKSwKLSAgICAgcHJvZHVjZV9hdF8oc3RvcmFnZV8uZ2V0KCkpLAotICAgICBjb25zdW1lX2F0XyhzdG9yYWdlXy5nZXQoKSkge30KLQotICAvLyBBZGQgYSB2YWx1ZSB0byB0aGUgcXVldWUuCi0gIHZvaWQgUHJvZHVjZShjb25zdCBUICZ2YWwpIHsKLSAgICBXYWl0U2VtYXBob3JlKGVtcHR5Xyk7Ci0gICAgewotICAgICAgYm9vc3Q6OnVuaXF1ZV9sb2NrPGJvb3N0OjptdXRleD4gcHJvZHVjZV9sb2NrKHByb2R1Y2VfYXRfbXV0ZXhfKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgICpwcm9kdWNlX2F0XyA9IHZhbDsKLSAgICAgIH0KLSAgICAgIGNhdGNoICguLi4pIHsKLSAgICAgICAgZW1wdHlfLnBvc3QoKTsKLSAgICAgICAgdGhyb3c7Ci0gICAgICB9Ci0gICAgICBpZiAoKytwcm9kdWNlX2F0XyA9PSBlbmRfKSBwcm9kdWNlX2F0XyA9IHN0b3JhZ2VfLmdldCgpOwotICAgIH0KLSAgICB1c2VkXy5wb3N0KCk7Ci0gIH0KLQotICAvLyBDb25zdW1lIGEgdmFsdWUsIGFzc2lnbmluZyBpdCB0byBvdXQuCi0gIFQmIENvbnN1bWUoVCAmb3V0KSB7Ci0gICAgV2FpdFNlbWFwaG9yZSh1c2VkXyk7Ci0gICAgewotICAgICAgYm9vc3Q6OnVuaXF1ZV9sb2NrPGJvb3N0OjptdXRleD4gY29uc3VtZV9sb2NrKGNvbnN1bWVfYXRfbXV0ZXhfKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIG91dCA9ICpjb25zdW1lX2F0XzsKLSAgICAgIH0KLSAgICAgIGNhdGNoICguLi4pIHsKLSAgICAgICAgdXNlZF8ucG9zdCgpOwotICAgICAgICB0aHJvdzsKLSAgICAgIH0KLSAgICAgIGlmICgrK2NvbnN1bWVfYXRfID09IGVuZF8pIGNvbnN1bWVfYXRfID0gc3RvcmFnZV8uZ2V0KCk7Ci0gICAgfQotICAgIGVtcHR5Xy5wb3N0KCk7Ci0gICAgcmV0dXJuIG91dDsKLSAgfQotCi0gIC8vIENvbnZlbmllbmNlIHZlcnNpb24gb2YgQ29uc3VtZSB0aGF0IGNvcGllcyB0aGUgdmFsdWUgdG8gcmV0dXJuLgotICAvLyBUaGUgb3RoZXIgdmVyc2lvbiBpcyBmYXN0ZXIuCi0gIFQgQ29uc3VtZSgpIHsKLSAgICBUIHJldDsKLSAgICBDb25zdW1lKHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotICAgCi0gcHJpdmF0ZToKLSAgLy8gTnVtYmVyIG9mIGVtcHR5IHNwYWNlcyBpbiBzdG9yYWdlXy4KLSAgU2VtYXBob3JlIGVtcHR5XzsKLSAgLy8gTnVtYmVyIG9mIG9jY3VwaWVkIHNwYWNlcyBpbiBzdG9yYWdlXy4KLSAgU2VtYXBob3JlIHVzZWRfOwotCi0gIGJvb3N0OjpzY29wZWRfYXJyYXk8VD4gc3RvcmFnZV87Ci0KLSAgVCAqY29uc3QgZW5kXzsKLQotICAvLyBJbmRleCBmb3IgbmV4dCB3cml0ZSBpbiBzdG9yYWdlXy4KLSAgVCAqcHJvZHVjZV9hdF87Ci0gIGJvb3N0OjptdXRleCBwcm9kdWNlX2F0X211dGV4XzsKLQotICAvLyBJbmRleCBmb3IgbmV4dCByZWFkIGZyb20gc3RvcmFnZV8uCi0gIFQgKmNvbnN1bWVfYXRfOwotICBib29zdDo6bXV0ZXggY29uc3VtZV9hdF9tdXRleF87Ci0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKLQotI2VuZGlmIC8vIFVUSUxfUENRVUVVRV9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wb29sLmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvcG9vbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5YmExNS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wb29sLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotI2luY2x1ZGUgInV0aWwvcG9vbC5oaCIKLQotI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLQotUG9vbDo6UG9vbCgpIHsKLSAgY3VycmVudF8gPSBOVUxMOwotICBjdXJyZW50X2VuZF8gPSBOVUxMOwotfQotCi1Qb29sOjp+UG9vbCgpIHsKLSAgRnJlZUFsbCgpOwotfQotCi12b2lkIFBvb2w6OkZyZWVBbGwoKSB7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8dm9pZCAqPjo6Y29uc3RfaXRlcmF0b3IgaShmcmVlX2xpc3RfLmJlZ2luKCkpOyBpICE9IGZyZWVfbGlzdF8uZW5kKCk7ICsraSkgewotICAgIGZyZWUoKmkpOwotICB9Ci0gIGZyZWVfbGlzdF8uY2xlYXIoKTsKLSAgY3VycmVudF8gPSBOVUxMOwotICBjdXJyZW50X2VuZF8gPSBOVUxMOwotfQotCi12b2lkICpQb29sOjpNb3JlKHN0ZDo6c2l6ZV90IHNpemUpIHsKLSAgc3RkOjpzaXplX3QgYW1vdW50ID0gc3RkOjptYXgoc3RhdGljX2Nhc3Q8c2l6ZV90PigzMikgPDwgZnJlZV9saXN0Xy5zaXplKCksIHNpemUpOwotICB1aW50OF90ICpyZXQgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oTWFsbG9jT3JUaHJvdyhhbW91bnQpKTsKLSAgZnJlZV9saXN0Xy5wdXNoX2JhY2socmV0KTsKLSAgY3VycmVudF8gPSByZXQgKyBzaXplOwotICBjdXJyZW50X2VuZF8gPSByZXQgKyBhbW91bnQ7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3Bvb2wuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wb29sLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWU3OTNkLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3Bvb2wuaGgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLyBWZXJ5IHNpbXBsZSBwb29sLiAgSXQgY2FuIG9ubHkgYWxsb2NhdGUgbWVtb3J5LiAgQW5kIGFsbCBvZiB0aGUgbWVtb3J5IGl0Ci0vLyBhbGxvY2F0ZXMgbXVzdCBiZSBmcmVlZCBhdCB0aGUgc2FtZSB0aW1lLiAgCi0KLSNpZm5kZWYgVVRJTF9QT09MX0gKLSNkZWZpbmUgVVRJTF9QT09MX0gKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgdXRpbCB7Ci0KLWNsYXNzIFBvb2wgewotICBwdWJsaWM6Ci0gICAgUG9vbCgpOwotCi0gICAgflBvb2woKTsKLQotICAgIHZvaWQgKkFsbG9jYXRlKHN0ZDo6c2l6ZV90IHNpemUpIHsKLSAgICAgIHZvaWQgKnJldCA9IGN1cnJlbnRfOwotICAgICAgY3VycmVudF8gKz0gc2l6ZTsKLSAgICAgIGlmIChjdXJyZW50XyA8IGN1cnJlbnRfZW5kXykgewotICAgICAgICByZXR1cm4gcmV0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE1vcmUoc2l6ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBGcmVlQWxsKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICB2b2lkICpNb3JlKHN0ZDo6c2l6ZV90IHNpemUpOwotCi0gICAgc3RkOjp2ZWN0b3I8dm9pZCAqPiBmcmVlX2xpc3RfOwotCi0gICAgdWludDhfdCAqY3VycmVudF8sICpjdXJyZW50X2VuZF87Ci0KLSAgICAvLyBubyBjb3B5aW5nCi0gICAgUG9vbChjb25zdCBQb29sICYpOwotICAgIFBvb2wgJm9wZXJhdG9yPShjb25zdCBQb29sICYpOwotfTsgCi0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKLQotI2VuZGlmIC8vIFVUSUxfUE9PTF9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wcm9iaW5nX2hhc2hfdGFibGUuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wcm9iaW5nX2hhc2hfdGFibGUuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMjI4ZGQuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvcHJvYmluZ19oYXNoX3RhYmxlLmhoCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSNpZm5kZWYgVVRJTF9QUk9CSU5HX0hBU0hfVEFCTEVfSAotI2RlZmluZSBVVElMX1BST0JJTkdfSEFTSF9UQUJMRV9ICi0KLSNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKLSNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLQotLyogVGhyb3duIHdoZW4gdGFibGUgZ3Jvd3MgdG9vIGxhcmdlICovCi1jbGFzcyBQcm9iaW5nU2l6ZUV4Y2VwdGlvbiA6IHB1YmxpYyBFeGNlcHRpb24gewotICBwdWJsaWM6Ci0gICAgUHJvYmluZ1NpemVFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0gICAgflByb2JpbmdTaXplRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotfTsKLQotLy8gc3RkOjppZGVudGl0eSBpcyBhbiBTR0kgZXh0ZW5zaW9uIDotKAotc3RydWN0IElkZW50aXR5SGFzaCB7Ci0gIHRlbXBsYXRlIDxjbGFzcyBUPiBUIG9wZXJhdG9yKCkoVCBhcmcpIGNvbnN0IHsgcmV0dXJuIGFyZzsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIEVudHJ5VCwgY2xhc3MgSGFzaFQsIGNsYXNzIEVxdWFsVD4gY2xhc3MgQXV0b1Byb2Jpbmc7Ci0KLS8qIE5vbi1zdGFuZGFyZCBoYXNoIHRhYmxlCi0gKiBCdWNrZXRzIG11c3QgYmUgc2V0IGF0IHRoZSBiZWdpbm5pbmcgYW5kIG11c3QgYmUgZ3JlYXRlciB0aGFuIG1heGltdW0gbnVtYmVyCi0gKiBvZiBlbGVtZW50cywgZWxzZSBpdCB0aHJvd3MgUHJvYmluZ1NpemVFeGNlcHRpb24uCi0gKiBNZW1vcnkgbWFuYWdlbWVudCBhbmQgaW5pdGlhbGl6YXRpb24gaXMgZXh0ZXJuYWxpemVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvCi0gKiBzZXJpYWxpemUgdGhlc2UgdG8gZGlzayBhbmQgbG9hZCB0aGVtIHF1aWNrbHkuCi0gKiBVc2VzIGxpbmVhciBwcm9iaW5nIHRvIGZpbmQgdmFsdWUuCi0gKiBPbmx5IGluc2VydCBhbmQgbG9va3VwIG9wZXJhdGlvbnMuICAKLSAqLwotdGVtcGxhdGUgPGNsYXNzIEVudHJ5VCwgY2xhc3MgSGFzaFQsIGNsYXNzIEVxdWFsVCA9IHN0ZDo6ZXF1YWxfdG88dHlwZW5hbWUgRW50cnlUOjpLZXk+ID4gY2xhc3MgUHJvYmluZ0hhc2hUYWJsZSB7Ci0gIHB1YmxpYzoKLSAgICB0eXBlZGVmIEVudHJ5VCBFbnRyeTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEVudHJ5OjpLZXkgS2V5OwotICAgIHR5cGVkZWYgY29uc3QgRW50cnkgKkNvbnN0SXRlcmF0b3I7Ci0gICAgdHlwZWRlZiBFbnRyeSAqTXV0YWJsZUl0ZXJhdG9yOwotICAgIHR5cGVkZWYgSGFzaFQgSGFzaDsKLSAgICB0eXBlZGVmIEVxdWFsVCBFcXVhbDsKLQotICAgIHN0YXRpYyB1aW50NjRfdCBTaXplKHVpbnQ2NF90IGVudHJpZXMsIGZsb2F0IG11bHRpcGxpZXIpIHsKLSAgICAgIHVpbnQ2NF90IGJ1Y2tldHMgPSBzdGQ6Om1heChlbnRyaWVzICsgMSwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG11bHRpcGxpZXIgKiBzdGF0aWNfY2FzdDxmbG9hdD4oZW50cmllcykpKTsKLSAgICAgIHJldHVybiBidWNrZXRzICogc2l6ZW9mKEVudHJ5KTsKLSAgICB9Ci0KLSAgICAvLyBNdXN0IGJlIGFzc2lnbmVkIHRvIGxhdGVyLiAgCi0gICAgUHJvYmluZ0hhc2hUYWJsZSgpIDogZW50cmllc18oMCkKLSNpZmRlZiBERUJVRwotICAgICAgLCBpbml0aWFsaXplZF8oZmFsc2UpCi0jZW5kaWYKLSAgICB7fQotCi0gICAgUHJvYmluZ0hhc2hUYWJsZSh2b2lkICpzdGFydCwgc3RkOjpzaXplX3QgYWxsb2NhdGVkLCBjb25zdCBLZXkgJmludmFsaWQgPSBLZXkoKSwgY29uc3QgSGFzaCAmaGFzaF9mdW5jID0gSGFzaCgpLCBjb25zdCBFcXVhbCAmZXF1YWxfZnVuYyA9IEVxdWFsKCkpCi0gICAgICA6IGJlZ2luXyhyZWludGVycHJldF9jYXN0PE11dGFibGVJdGVyYXRvcj4oc3RhcnQpKSwKLSAgICAgICAgYnVja2V0c18oYWxsb2NhdGVkIC8gc2l6ZW9mKEVudHJ5KSksCi0gICAgICAgIGVuZF8oYmVnaW5fICsgYnVja2V0c18pLAotICAgICAgICBpbnZhbGlkXyhpbnZhbGlkKSwKLSAgICAgICAgaGFzaF8oaGFzaF9mdW5jKSwKLSAgICAgICAgZXF1YWxfKGVxdWFsX2Z1bmMpLAotICAgICAgICBlbnRyaWVzXygwKQotI2lmZGVmIERFQlVHCi0gICAgICAgICwgaW5pdGlhbGl6ZWRfKHRydWUpCi0jZW5kaWYKLSAgICB7fQotCi0gICAgdm9pZCBSZWxvY2F0ZSh2b2lkICpuZXdfYmFzZSkgewotICAgICAgYmVnaW5fID0gcmVpbnRlcnByZXRfY2FzdDxNdXRhYmxlSXRlcmF0b3I+KG5ld19iYXNlKTsKLSAgICAgIGVuZF8gPSBiZWdpbl8gKyBidWNrZXRzXzsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gTXV0YWJsZUl0ZXJhdG9yIEluc2VydChjb25zdCBUICZ0KSB7Ci0jaWZkZWYgREVCVUcKLSAgICAgIGFzc2VydChpbml0aWFsaXplZF8pOwotI2VuZGlmCi0gICAgICBVVElMX1RIUk9XX0lGKCsrZW50cmllc18gPj0gYnVja2V0c18sIFByb2JpbmdTaXplRXhjZXB0aW9uLCAiSGFzaCB0YWJsZSB3aXRoICIgPDwgYnVja2V0c18gPDwgIiBidWNrZXRzIGlzIGZ1bGwuIik7Ci0gICAgICByZXR1cm4gVW5jaGVja2VkSW5zZXJ0KHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMgZm91bmQgKGFuZCBub3QgaW5zZXJ0ZWQpLiAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggRmluZCBidXQgdGhlIG9wcG9zaXRlIGlmIGhhc2hfbWFwIQotICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBib29sIEZpbmRPckluc2VydChjb25zdCBUICZ0LCBNdXRhYmxlSXRlcmF0b3IgJm91dCkgewotI2lmZGVmIERFQlVHCi0gICAgICBhc3NlcnQoaW5pdGlhbGl6ZWRfKTsKLSNlbmRpZgotICAgICAgZm9yIChNdXRhYmxlSXRlcmF0b3IgaSA9IElkZWFsKHQpOzspIHsKLSAgICAgICAgS2V5IGdvdChpLT5HZXRLZXkoKSk7Ci0gICAgICAgIGlmIChlcXVhbF8oZ290LCB0LkdldEtleSgpKSkgeyBvdXQgPSBpOyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICBpZiAoZXF1YWxfKGdvdCwgaW52YWxpZF8pKSB7Ci0gICAgICAgICAgVVRJTF9USFJPV19JRigrK2VudHJpZXNfID49IGJ1Y2tldHNfLCBQcm9iaW5nU2l6ZUV4Y2VwdGlvbiwgIkhhc2ggdGFibGUgd2l0aCAiIDw8IGJ1Y2tldHNfIDw8ICIgYnVja2V0cyBpcyBmdWxsLiIpOwotICAgICAgICAgICppID0gdDsKLSAgICAgICAgICBvdXQgPSBpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKytpID09IGVuZF8pIGkgPSBiZWdpbl87Ci0gICAgICB9ICAgCi0gICAgfQotCi0gICAgdm9pZCBGaW5pc2hlZEluc2VydGluZygpIHt9Ci0KLSAgICAvLyBEb24ndCBjaGFuZ2UgYW55dGhpbmcgcmVsYXRlZCB0byBHZXRLZXksICAKLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5PiBib29sIFVuc2FmZU11dGFibGVGaW5kKGNvbnN0IEtleSBrZXksIE11dGFibGVJdGVyYXRvciAmb3V0KSB7Ci0jaWZkZWYgREVCVUcKLSAgICAgIGFzc2VydChpbml0aWFsaXplZF8pOwotI2VuZGlmCi0gICAgICBmb3IgKE11dGFibGVJdGVyYXRvciBpKGJlZ2luXyArIChoYXNoXyhrZXkpICUgYnVja2V0c18pKTs7KSB7Ci0gICAgICAgIEtleSBnb3QoaS0+R2V0S2V5KCkpOwotICAgICAgICBpZiAoZXF1YWxfKGdvdCwga2V5KSkgeyBvdXQgPSBpOyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICBpZiAoZXF1YWxfKGdvdCwgaW52YWxpZF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICgrK2kgPT0gZW5kXykgaSA9IGJlZ2luXzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBMaWtlIFVuc2FmZU11dGFibGVGaW5kLCBidXQgdGhlIGtleSBtdXN0IGJlIHRoZXJlLgotICAgIHRlbXBsYXRlIDxjbGFzcyBLZXk+IE11dGFibGVJdGVyYXRvciBVbnNhZmVNdXRhYmxlTXVzdEZpbmQoY29uc3QgS2V5IGtleSkgewotICAgICAgIGZvciAoTXV0YWJsZUl0ZXJhdG9yIGkoYmVnaW5fICsgKGhhc2hfKGtleSkgJSBidWNrZXRzXykpOzspIHsKLSAgICAgICAgS2V5IGdvdChpLT5HZXRLZXkoKSk7Ci0gICAgICAgIGlmIChlcXVhbF8oZ290LCBrZXkpKSB7IHJldHVybiBpOyB9Ci0gICAgICAgIGFzc2VydCghZXF1YWxfKGdvdCwgaW52YWxpZF8pKTsKLSAgICAgICAgaWYgKCsraSA9PSBlbmRfKSBpID0gYmVnaW5fOwotICAgICAgfQotICAgIH0KLQotCi0gICAgdGVtcGxhdGUgPGNsYXNzIEtleT4gYm9vbCBGaW5kKGNvbnN0IEtleSBrZXksIENvbnN0SXRlcmF0b3IgJm91dCkgY29uc3QgewotI2lmZGVmIERFQlVHCi0gICAgICBhc3NlcnQoaW5pdGlhbGl6ZWRfKTsKLSNlbmRpZgotICAgICAgZm9yIChDb25zdEl0ZXJhdG9yIGkoYmVnaW5fICsgKGhhc2hfKGtleSkgJSBidWNrZXRzXykpOzspIHsKLSAgICAgICAgS2V5IGdvdChpLT5HZXRLZXkoKSk7Ci0gICAgICAgIGlmIChlcXVhbF8oZ290LCBrZXkpKSB7IG91dCA9IGk7IHJldHVybiB0cnVlOyB9Ci0gICAgICAgIGlmIChlcXVhbF8oZ290LCBpbnZhbGlkXykpIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCsraSA9PSBlbmRfKSBpID0gYmVnaW5fOwotICAgICAgfSAgICAKLSAgICB9Ci0KLSAgICAvLyBMaWtlIEZpbmQgYnV0IHdlJ3JlIHN1cmUgaXQgbXVzdCBiZSB0aGVyZS4KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5PiBDb25zdEl0ZXJhdG9yIE11c3RGaW5kKGNvbnN0IEtleSBrZXkpIGNvbnN0IHsKLSAgICAgIGZvciAoQ29uc3RJdGVyYXRvciBpKGJlZ2luXyArIChoYXNoXyhrZXkpICUgYnVja2V0c18pKTs7KSB7Ci0gICAgICAgIEtleSBnb3QoaS0+R2V0S2V5KCkpOwotICAgICAgICBpZiAoZXF1YWxfKGdvdCwga2V5KSkgeyByZXR1cm4gaTsgfQotICAgICAgICBhc3NlcnQoIWVxdWFsXyhnb3QsIGludmFsaWRfKSk7Ci0gICAgICAgIGlmICgrK2kgPT0gZW5kXykgaSA9IGJlZ2luXzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIENsZWFyKCkgewotICAgICAgRW50cnkgaW52YWxpZDsKLSAgICAgIGludmFsaWQuU2V0S2V5KGludmFsaWRfKTsKLSAgICAgIHN0ZDo6ZmlsbChiZWdpbl8sIGVuZF8sIGludmFsaWQpOwotICAgICAgZW50cmllc18gPSAwOwotICAgIH0KLQotICAgIC8vIFJldHVybiBudW1iZXIgb2YgZW50cmllcyBhc3N1bWluZyBubyBzZXJpYWxpemF0aW9uIHdlbnQgb24uCi0gICAgc3RkOjpzaXplX3QgU2l6ZU5vU2VyaWFsaXphdGlvbigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBlbnRyaWVzXzsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gbWVtb3J5IHNpemUgZXhwZWN0ZWQgYnkgRG91YmxlLgotICAgIHN0ZDo6c2l6ZV90IERvdWJsZVRvKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJ1Y2tldHNfICogMiAqIHNpemVvZihFbnRyeSk7Ci0gICAgfQotCi0gICAgLy8gSW5mb3JtIHRoZSB0YWJsZSB0aGF0IGl0IGhhcyBkb3VibGUgdGhlIGFtb3VudCBvZiBtZW1vcnkuCi0gICAgLy8gUGFzcyBjbGVhcl9uZXcgPSBmYWxzZSBpZiB5b3UgYXJlIHN1cmUgdGhlIG5ldyBtZW1vcnkgaXMgaW5pdGlhbGl6ZWQKLSAgICAvLyBwcm9wZXJseSAodG8gaW52YWxpZF8pIGkuZS4gYnkgbXJlbWFwLgotICAgIHZvaWQgRG91YmxlKHZvaWQgKm5ld19iYXNlLCBib29sIGNsZWFyX25ldyA9IHRydWUpIHsKLSAgICAgIGJlZ2luXyA9IHN0YXRpY19jYXN0PE11dGFibGVJdGVyYXRvcj4obmV3X2Jhc2UpOwotICAgICAgTXV0YWJsZUl0ZXJhdG9yIG9sZF9lbmQgPSBiZWdpbl8gKyBidWNrZXRzXzsKLSAgICAgIGJ1Y2tldHNfICo9IDI7Ci0gICAgICBlbmRfID0gYmVnaW5fICsgYnVja2V0c187Ci0gICAgICBpZiAoY2xlYXJfbmV3KSB7Ci0gICAgICAgIEVudHJ5IGludmFsaWQ7Ci0gICAgICAgIGludmFsaWQuU2V0S2V5KGludmFsaWRfKTsKLSAgICAgICAgc3RkOjpmaWxsKG9sZF9lbmQsIGVuZF8sIGludmFsaWQpOwotICAgICAgfQotICAgICAgc3RkOjp2ZWN0b3I8RW50cnk+IHJvbGxlZF9vdmVyOwotICAgICAgLy8gTW92ZSByb2xsLW92ZXIgZW50cmllcyB0byBhIGJ1ZmZlciBiZWNhdXNlIHRoZXkgbWlnaHQgbm90IHJvbGwgb3ZlciBhbnltb3JlLiAgVGhpcyBzaG91bGQgYmUgc21hbGwuCi0gICAgICBmb3IgKE11dGFibGVJdGVyYXRvciBpID0gYmVnaW5fOyBpICE9IG9sZF9lbmQgJiYgIWVxdWFsXyhpLT5HZXRLZXkoKSwgaW52YWxpZF8pOyArK2kpIHsKLSAgICAgICAgcm9sbGVkX292ZXIucHVzaF9iYWNrKCppKTsKLSAgICAgICAgaS0+U2V0S2V5KGludmFsaWRfKTsKLSAgICAgIH0KLSAgICAgIC8qIFJlLWluc2VydCBldmVyeXRoaW5nLiAgRW50cmllcyBtaWdodCBnbyBiYWNrd2FyZHMgdG8gdGFrZSBvdmVyIGEKLSAgICAgICAqIHJlY2VudGx5IG9wZW5lZCBnYXAsIHN0YXksIG1vdmUgdG8gbmV3IHRlcnJpdG9yeSwgb3Igd3JhcCBhcm91bmQuICAgSWYKLSAgICAgICAqIGFuIGVudHJ5IHdyYXBzIGFyb3VuZCwgaXQgbWlnaHQgZ28gdG8gYSBwb2ludGVyIGdyZWF0ZXIgdGhhbiBpICh3aGljaAotICAgICAgICogY2FuIGhhcHBlbiBhdCB0aGUgYmVnaW5uaW5nKSBhbmQgaXQgd2lsbCBiZSByZXZpc2l0ZWQgdG8gcG9zc2libHkgZmlsbAotICAgICAgICogaW4gYSBnYXAgY3JlYXRlZCBsYXRlci4KLSAgICAgICAqLwotICAgICAgRW50cnkgdGVtcDsKLSAgICAgIGZvciAoTXV0YWJsZUl0ZXJhdG9yIGkgPSBiZWdpbl87IGkgIT0gb2xkX2VuZDsgKytpKSB7Ci0gICAgICAgIGlmICghZXF1YWxfKGktPkdldEtleSgpLCBpbnZhbGlkXykpIHsKLSAgICAgICAgICB0ZW1wID0gKmk7Ci0gICAgICAgICAgaS0+U2V0S2V5KGludmFsaWRfKTsKLSAgICAgICAgICBVbmNoZWNrZWRJbnNlcnQodGVtcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIFB1dCB0aGUgcm9sbC1vdmVyIGVudHJpZXMgYmFjayBpbi4KLSAgICAgIGZvciAodHlwZW5hbWUgc3RkOjp2ZWN0b3I8RW50cnk+Ojpjb25zdF9pdGVyYXRvciBpKHJvbGxlZF9vdmVyLmJlZ2luKCkpOyBpICE9IHJvbGxlZF9vdmVyLmVuZCgpOyArK2kpIHsKLSAgICAgICAgVW5jaGVja2VkSW5zZXJ0KCppKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBNb3N0bHkgZm9yIHRlc3RzLCBjaGVjayBjb25zaXN0ZW5jeSBvZiBldmVyeSBlbnRyeS4KLSAgICB2b2lkIENoZWNrQ29uc2lzdGVuY3koKSB7Ci0gICAgICBNdXRhYmxlSXRlcmF0b3IgbGFzdDsKLSAgICAgIGZvciAobGFzdCA9IGVuZF8gLSAxOyBsYXN0ID49IGJlZ2luXyAmJiAhZXF1YWxfKGxhc3QtPkdldEtleSgpLCBpbnZhbGlkXyk7IC0tbGFzdCkge30KLSAgICAgIFVUSUxfVEhST1dfSUYobGFzdCA9PSBiZWdpbl8sIFByb2JpbmdTaXplRXhjZXB0aW9uLCAiQ29tcGxldGVseSBmdWxsIik7Ci0gICAgICBNdXRhYmxlSXRlcmF0b3IgaTsKLSAgICAgIC8vIEJlZ2lubmluZyBjYW4gYmUgd3JhcC1hcm91bmRzLgotICAgICAgZm9yIChpID0gYmVnaW5fOyAhZXF1YWxfKGktPkdldEtleSgpLCBpbnZhbGlkXyk7ICsraSkgewotICAgICAgICBNdXRhYmxlSXRlcmF0b3IgaWRlYWwgPSBJZGVhbCgqaSk7Ci0gICAgICAgIFVUSUxfVEhST1dfSUYoaWRlYWwgPiBpICYmIGlkZWFsIDw9IGxhc3QsIEV4Y2VwdGlvbiwgIkluY29uc2lzdGVuY3kgYXQgcG9zaXRpb24gIiA8PCAoaSAtIGJlZ2luXykgPDwgIiBzaG91bGQgYmUgYXQgIiA8PCAoaWRlYWwgLSBiZWdpbl8pKTsKLSAgICAgIH0KLSAgICAgIE11dGFibGVJdGVyYXRvciBwcmVfZ2FwID0gaTsKLSAgICAgIGZvciAoOyBpICE9IGVuZF87ICsraSkgewotICAgICAgICBpZiAoZXF1YWxfKGktPkdldEtleSgpLCBpbnZhbGlkXykpIHsKLSAgICAgICAgICBwcmVfZ2FwID0gaTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBNdXRhYmxlSXRlcmF0b3IgaWRlYWwgPSBJZGVhbCgqaSk7Ci0gICAgICAgIFVUSUxfVEhST1dfSUYoaWRlYWwgPiBpIHx8IGlkZWFsIDw9IHByZV9nYXAsIEV4Y2VwdGlvbiwgIkluY29uc2lzdGVuY3kgYXQgcG9zaXRpb24gIiA8PCAoaSAtIGJlZ2luXykgPDwgIiB3aXRoIGlkZWFsICIgPDwgKGlkZWFsIC0gYmVnaW5fKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEF1dG9Qcm9iaW5nPEVudHJ5LCBIYXNoLCBFcXVhbD47Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gTXV0YWJsZUl0ZXJhdG9yIElkZWFsKGNvbnN0IFQgJnQpIHsKLSAgICAgIHJldHVybiBiZWdpbl8gKyAoaGFzaF8odC5HZXRLZXkoKSkgJSBidWNrZXRzXyk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPGNsYXNzIFQ+IE11dGFibGVJdGVyYXRvciBVbmNoZWNrZWRJbnNlcnQoY29uc3QgVCAmdCkgewotICAgICAgZm9yIChNdXRhYmxlSXRlcmF0b3IgaShJZGVhbCh0KSk7OykgewotICAgICAgICBpZiAoZXF1YWxfKGktPkdldEtleSgpLCBpbnZhbGlkXykpIHsgKmkgPSB0OyByZXR1cm4gaTsgfQotICAgICAgICBpZiAoKytpID09IGVuZF8pIHsgaSA9IGJlZ2luXzsgfQotICAgICAgfQotICAgIH0KLQotICAgIE11dGFibGVJdGVyYXRvciBiZWdpbl87Ci0gICAgc3RkOjpzaXplX3QgYnVja2V0c187Ci0gICAgTXV0YWJsZUl0ZXJhdG9yIGVuZF87Ci0gICAgS2V5IGludmFsaWRfOwotICAgIEhhc2ggaGFzaF87Ci0gICAgRXF1YWwgZXF1YWxfOwotICAgIHN0ZDo6c2l6ZV90IGVudHJpZXNfOwotI2lmZGVmIERFQlVHCi0gICAgYm9vbCBpbml0aWFsaXplZF87Ci0jZW5kaWYKLX07Ci0KLS8vIFJlc2l6YWJsZSBsaW5lYXIgcHJvYmluZyBoYXNoIHRhYmxlLiAgVGhpcyBvd25zIHRoZSBtZW1vcnkuICAKLXRlbXBsYXRlIDxjbGFzcyBFbnRyeVQsIGNsYXNzIEhhc2hULCBjbGFzcyBFcXVhbFQgPSBzdGQ6OmVxdWFsX3RvPHR5cGVuYW1lIEVudHJ5VDo6S2V5PiA+IGNsYXNzIEF1dG9Qcm9iaW5nIHsKLSAgcHJpdmF0ZToKLSAgICB0eXBlZGVmIFByb2JpbmdIYXNoVGFibGU8RW50cnlULCBIYXNoVCwgRXF1YWxUPiBCYWNrZW5kOwotICBwdWJsaWM6Ci0gICAgc3RhdGljIHN0ZDo6c2l6ZV90IE1lbVVzYWdlKHN0ZDo6c2l6ZV90IHNpemUsIGZsb2F0IG11bHRpcGxpZXIgPSAxLjUpIHsKLSAgICAgIHJldHVybiBCYWNrZW5kOjpTaXplKHNpemUsIG11bHRpcGxpZXIpOwotICAgIH0KLQotICAgIHR5cGVkZWYgRW50cnlUIEVudHJ5OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgRW50cnk6OktleSBLZXk7Ci0gICAgdHlwZWRlZiBjb25zdCBFbnRyeSAqQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIEVudHJ5ICpNdXRhYmxlSXRlcmF0b3I7Ci0gICAgdHlwZWRlZiBIYXNoVCBIYXNoOwotICAgIHR5cGVkZWYgRXF1YWxUIEVxdWFsOwotCi0gICAgQXV0b1Byb2Jpbmcoc3RkOjpzaXplX3QgaW5pdGlhbF9zaXplID0gMTAsIGNvbnN0IEtleSAmaW52YWxpZCA9IEtleSgpLCBjb25zdCBIYXNoICZoYXNoX2Z1bmMgPSBIYXNoKCksIGNvbnN0IEVxdWFsICZlcXVhbF9mdW5jID0gRXF1YWwoKSkgOgotICAgICAgYWxsb2NhdGVkXyhCYWNrZW5kOjpTaXplKGluaXRpYWxfc2l6ZSwgMS41KSksIG1lbV8odXRpbDo6TWFsbG9jT3JUaHJvdyhhbGxvY2F0ZWRfKSksIGJhY2tlbmRfKG1lbV8uZ2V0KCksIGFsbG9jYXRlZF8sIGludmFsaWQsIGhhc2hfZnVuYywgZXF1YWxfZnVuYykgewotICAgICAgdGhyZXNob2xkXyA9IGluaXRpYWxfc2l6ZSAqIDEuMjsKLSAgICAgIENsZWFyKCk7Ci0gICAgfQotCi0gICAgLy8gQXNzdW1lcyB0aGF0IHRoZSBrZXkgaXMgdW5pcXVlLiAgTXVsdGlwbGUgaW5zZXJ0aW9ucyB3b24ndCBjYXVzZSBhIGZhaWx1cmUsIGp1c3QgaW5jb25zaXN0ZW50IGxvb2t1cC4KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gTXV0YWJsZUl0ZXJhdG9yIEluc2VydChjb25zdCBUICZ0KSB7Ci0gICAgICBEb3VibGVJZk5lZWRlZCgpOwotICAgICAgcmV0dXJuIGJhY2tlbmRfLlVuY2hlY2tlZEluc2VydCh0KTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gYm9vbCBGaW5kT3JJbnNlcnQoY29uc3QgVCAmdCwgTXV0YWJsZUl0ZXJhdG9yICZvdXQpIHsKLSAgICAgIERvdWJsZUlmTmVlZGVkKCk7Ci0gICAgICByZXR1cm4gYmFja2VuZF8uRmluZE9ySW5zZXJ0KHQsIG91dCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPGNsYXNzIEtleT4gYm9vbCBVbnNhZmVNdXRhYmxlRmluZChjb25zdCBLZXkga2V5LCBNdXRhYmxlSXRlcmF0b3IgJm91dCkgewotICAgICAgcmV0dXJuIGJhY2tlbmRfLlVuc2FmZU11dGFibGVGaW5kKGtleSwgb3V0KTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5PiBNdXRhYmxlSXRlcmF0b3IgVW5zYWZlTXV0YWJsZU11c3RGaW5kKGNvbnN0IEtleSBrZXkpIHsKLSAgICAgIHJldHVybiBiYWNrZW5kXy5VbnNhZmVNdXRhYmxlTXVzdEZpbmQoa2V5KTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5PiBib29sIEZpbmQoY29uc3QgS2V5IGtleSwgQ29uc3RJdGVyYXRvciAmb3V0KSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFja2VuZF8uRmluZChrZXksIG91dCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPGNsYXNzIEtleT4gQ29uc3RJdGVyYXRvciBNdXN0RmluZChjb25zdCBLZXkga2V5KSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFja2VuZF8uTXVzdEZpbmQoa2V5KTsKLSAgICB9Ci0KLSAgICBzdGQ6OnNpemVfdCBTaXplKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhY2tlbmRfLlNpemVOb1NlcmlhbGl6YXRpb24oKTsKLSAgICB9Ci0KLSAgICB2b2lkIENsZWFyKCkgewotICAgICAgYmFja2VuZF8uQ2xlYXIoKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB2b2lkIERvdWJsZUlmTmVlZGVkKCkgewotICAgICAgaWYgKFNpemUoKSA8IHRocmVzaG9sZF8pCi0gICAgICAgIHJldHVybjsKLSAgICAgIG1lbV8uY2FsbF9yZWFsbG9jKGJhY2tlbmRfLkRvdWJsZVRvKCkpOwotICAgICAgYWxsb2NhdGVkXyA9IGJhY2tlbmRfLkRvdWJsZVRvKCk7Ci0gICAgICBiYWNrZW5kXy5Eb3VibGUobWVtXy5nZXQoKSk7Ci0gICAgICB0aHJlc2hvbGRfICo9IDI7Ci0gICAgfQotCi0gICAgc3RkOjpzaXplX3QgYWxsb2NhdGVkXzsKLSAgICB1dGlsOjpzY29wZWRfbWFsbG9jIG1lbV87Ci0gICAgQmFja2VuZCBiYWNrZW5kXzsKLSAgICBzdGQ6OnNpemVfdCB0aHJlc2hvbGRfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgdXRpbAotCi0jZW5kaWYgLy8gVVRJTF9QUk9CSU5HX0hBU0hfVEFCTEVfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvcHJvYmluZ19oYXNoX3RhYmxlX3Rlc3QuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wcm9iaW5nX2hhc2hfdGFibGVfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3OTQ4Yy4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wcm9iaW5nX2hhc2hfdGFibGVfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0jaW5jbHVkZSAidXRpbC9wcm9iaW5nX2hhc2hfdGFibGUuaGgiCi0KLSNpbmNsdWRlICJ1dGlsL211cm11cl9oYXNoLmhoIgotI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgotCi0jZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFByb2JpbmdIYXNoVGFibGVUZXN0Ci0jaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9hcnJheS5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb25hbC9oYXNoLmhwcD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgdXRpbCB7Ci1uYW1lc3BhY2UgewotCi1zdHJ1Y3QgRW50cnkgewotICB1bnNpZ25lZCBjaGFyIGtleTsKLSAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEtleTsKLQotICB1bnNpZ25lZCBjaGFyIEdldEtleSgpIGNvbnN0IHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0KLSAgdm9pZCBTZXRLZXkodW5zaWduZWQgY2hhciB0bykgewotICAgIGtleSA9IHRvOwotICB9Ci0KLSAgdWludDY0X3QgR2V0VmFsdWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgdWludDY0X3QgdmFsdWU7Ci19OwotCi10eXBlZGVmIFByb2JpbmdIYXNoVGFibGU8RW50cnksIGJvb3N0OjpoYXNoPHVuc2lnbmVkIGNoYXI+ID4gVGFibGU7Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKHNpbXBsZSkgewotICBzaXplX3Qgc2l6ZSA9IFRhYmxlOjpTaXplKDEwLCAxLjIpOwotICBib29zdDo6c2NvcGVkX2FycmF5PGNoYXI+IG1lbShuZXcgY2hhcltzaXplXSk7Ci0gIG1lbXNldChtZW0uZ2V0KCksIDAsIHNpemUpOwotCi0gIFRhYmxlIHRhYmxlKG1lbS5nZXQoKSwgc2l6ZSk7Ci0gIGNvbnN0IEVudHJ5ICppID0gTlVMTDsKLSAgQk9PU1RfQ0hFQ0soIXRhYmxlLkZpbmQoMiwgaSkpOwotICBFbnRyeSB0b19pbnM7Ci0gIHRvX2lucy5rZXkgPSAzOwotICB0b19pbnMudmFsdWUgPSAzMjg5MjA7Ci0gIHRhYmxlLkluc2VydCh0b19pbnMpOwotICBCT09TVF9SRVFVSVJFKHRhYmxlLkZpbmQoMywgaSkpOwotICBCT09TVF9DSEVDS19FUVVBTCgzLCBpLT5HZXRLZXkoKSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PHVpbnQ2NF90PigzMjg5MjApLCBpLT5HZXRWYWx1ZSgpKTsKLSAgQk9PU1RfQ0hFQ0soIXRhYmxlLkZpbmQoMiwgaSkpOwotfQotCi1zdHJ1Y3QgRW50cnk2NCB7Ci0gIHVpbnQ2NF90IGtleTsKLSAgdHlwZWRlZiB1aW50NjRfdCBLZXk7Ci0KLSAgRW50cnk2NCgpIHt9Ci0KLSAgZXhwbGljaXQgRW50cnk2NCh1aW50NjRfdCBrZXlfaW4pIHsKLSAgICBrZXkgPSBrZXlfaW47Ci0gIH0KLQotICBLZXkgR2V0S2V5KCkgY29uc3QgeyByZXR1cm4ga2V5OyB9Ci0gIHZvaWQgU2V0S2V5KHVpbnQ2NF90IHRvKSB7IGtleSA9IHRvOyB9Ci19OwotCi1zdHJ1Y3QgTXVybXVySGFzaEVudHJ5NjQgewotICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKHVpbnQ2NF90IHZhbHVlKSBjb25zdCB7Ci0gICAgcmV0dXJuIHV0aWw6Ok11cm11ckhhc2g2NEEoJnZhbHVlLCA4KTsKLSAgfQotfTsKLQotdHlwZWRlZiBQcm9iaW5nSGFzaFRhYmxlPEVudHJ5NjQsIE11cm11ckhhc2hFbnRyeTY0PiBUYWJsZTY0OwotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShEb3VibGUpIHsKLSAgZm9yIChzdGQ6OnNpemVfdCBpbml0aWFsID0gMTk7IGluaXRpYWwgPCAzMDsgKytpbml0aWFsKSB7Ci0gICAgc2l6ZV90IHNpemUgPSBUYWJsZTY0OjpTaXplKGluaXRpYWwsIDEuMik7Ci0gICAgc2NvcGVkX21hbGxvYyBtZW0oTWFsbG9jT3JUaHJvdyhzaXplKSk7Ci0gICAgVGFibGU2NCB0YWJsZShtZW0uZ2V0KCksIHNpemUsIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSk7Ci0gICAgdGFibGUuQ2xlYXIoKTsKLSAgICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgMTk7ICsraSkgewotICAgICAgdGFibGUuSW5zZXJ0KEVudHJ5NjQoaSkpOwotICAgIH0KLSAgICB0YWJsZS5DaGVja0NvbnNpc3RlbmN5KCk7Ci0gICAgbWVtLmNhbGxfcmVhbGxvYyh0YWJsZS5Eb3VibGVUbygpKTsKLSAgICB0YWJsZS5Eb3VibGUobWVtLmdldCgpKTsKLSAgICB0YWJsZS5DaGVja0NvbnNpc3RlbmN5KCk7Ci0gICAgZm9yICh1aW50NjRfdCBpID0gMjA7IGkgPCA0MCA7ICsraSkgewotICAgICAgdGFibGUuSW5zZXJ0KEVudHJ5NjQoaSkpOwotICAgIH0KLSAgICBtZW0uY2FsbF9yZWFsbG9jKHRhYmxlLkRvdWJsZVRvKCkpOwotICAgIHRhYmxlLkRvdWJsZShtZW0uZ2V0KCkpOwotICAgIHRhYmxlLkNoZWNrQ29uc2lzdGVuY3koKTsKLSAgfQotfQotCi19IC8vIG5hbWVzcGFjZQotfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvcmVhZF9jb21wcmVzc2VkLmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvcmVhZF9jb21wcmVzc2VkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWU5ODA0Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3JlYWRfY29tcHJlc3NlZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0jaW5jbHVkZSAidXRpbC9yZWFkX2NvbXByZXNzZWQuaGgiCi0KLSNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCi0jaW5jbHVkZSAidXRpbC9oYXZlLmhoIgotI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZmRlZiBIQVZFX1pMSUIKLSNpbmNsdWRlIDx6bGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQlpMSUIKLSNpbmNsdWRlIDxiemxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1haTElCCi0jaW5jbHVkZSA8bHptYS5oPgotI2VuZGlmCi0KLW5hbWVzcGFjZSB1dGlsIHsKLQotQ29tcHJlc3NlZEV4Y2VwdGlvbjo6Q29tcHJlc3NlZEV4Y2VwdGlvbigpIHRocm93KCkge30KLUNvbXByZXNzZWRFeGNlcHRpb246On5Db21wcmVzc2VkRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotCi1HWkV4Y2VwdGlvbjo6R1pFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci1HWkV4Y2VwdGlvbjo6fkdaRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotCi1CWkV4Y2VwdGlvbjo6QlpFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci1CWkV4Y2VwdGlvbjo6fkJaRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotCi1YWkV4Y2VwdGlvbjo6WFpFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci1YWkV4Y2VwdGlvbjo6flhaRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotCi1jbGFzcyBSZWFkQmFzZSB7Ci0gIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5SZWFkQmFzZSgpIHt9Ci0KLSAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IFJlYWQodm9pZCAqdG8sIHN0ZDo6c2l6ZV90IGFtb3VudCwgUmVhZENvbXByZXNzZWQgJnRodW5rKSA9IDA7Ci0KLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyB2b2lkIFJlcGxhY2VUaGlzKFJlYWRCYXNlICp3aXRoLCBSZWFkQ29tcHJlc3NlZCAmdGh1bmspIHsKLSAgICAgIHRodW5rLmludGVybmFsXy5yZXNldCh3aXRoKTsKLSAgICB9Ci0KLSAgICBSZWFkQmFzZSAqQ3VycmVudChSZWFkQ29tcHJlc3NlZCAmdGh1bmspIHsgcmV0dXJuIHRodW5rLmludGVybmFsXy5nZXQoKTsgfQotCi0gICAgc3RhdGljIHVpbnQ2NF90ICZSZWFkQ291bnQoUmVhZENvbXByZXNzZWQgJnRodW5rKSB7Ci0gICAgICByZXR1cm4gdGh1bmsucmF3X2Ftb3VudF87Ci0gICAgfQotfTsKLQotbmFtZXNwYWNlIHsKLQotUmVhZEJhc2UgKlJlYWRGYWN0b3J5KGludCBmZCwgdWludDY0X3QgJnJhd19hbW91bnQsIGNvbnN0IHZvaWQgKmFscmVhZHlfZGF0YSwgc3RkOjpzaXplX3QgYWxyZWFkeV9zaXplLCBib29sIHJlcXVpcmVfY29tcHJlc3NlZCk7Ci0KLS8vIENvbXBsZXRlZCBmaWxlIHRoYXQgb3RoZXIgY2xhc3NlcyBjYW4gdGh1bmsgdG8uICAKLWNsYXNzIENvbXBsZXRlIDogcHVibGljIFJlYWRCYXNlIHsKLSAgcHVibGljOgotICAgIHN0ZDo6c2l6ZV90IFJlYWQodm9pZCAqLCBzdGQ6OnNpemVfdCwgUmVhZENvbXByZXNzZWQgJikgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfTsKLQotY2xhc3MgVW5jb21wcmVzc2VkIDogcHVibGljIFJlYWRCYXNlIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IFVuY29tcHJlc3NlZChpbnQgZmQpIDogZmRfKGZkKSB7fQotCi0gICAgc3RkOjpzaXplX3QgUmVhZCh2b2lkICp0bywgc3RkOjpzaXplX3QgYW1vdW50LCBSZWFkQ29tcHJlc3NlZCAmdGh1bmspIHsKLSAgICAgIHN0ZDo6c2l6ZV90IGdvdCA9IFBhcnRpYWxSZWFkKGZkXy5nZXQoKSwgdG8sIGFtb3VudCk7Ci0gICAgICBSZWFkQ291bnQodGh1bmspICs9IGdvdDsKLSAgICAgIHJldHVybiBnb3Q7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgc2NvcGVkX2ZkIGZkXzsKLX07Ci0KLWNsYXNzIFVuY29tcHJlc3NlZFdpdGhIZWFkZXIgOiBwdWJsaWMgUmVhZEJhc2UgewotICBwdWJsaWM6Ci0gICAgVW5jb21wcmVzc2VkV2l0aEhlYWRlcihpbnQgZmQsIGNvbnN0IHZvaWQgKmFscmVhZHlfZGF0YSwgc3RkOjpzaXplX3QgYWxyZWFkeV9zaXplKSA6IGZkXyhmZCkgewotICAgICAgYXNzZXJ0KGFscmVhZHlfc2l6ZSk7Ci0gICAgICBidWZfLnJlc2V0KG1hbGxvYyhhbHJlYWR5X3NpemUpKTsKLSAgICAgIGlmICghYnVmXy5nZXQoKSkgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKLSAgICAgIG1lbWNweShidWZfLmdldCgpLCBhbHJlYWR5X2RhdGEsIGFscmVhZHlfc2l6ZSk7Ci0gICAgICByZW1haW5fID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1Zl8uZ2V0KCkpOwotICAgICAgZW5kXyA9IHJlbWFpbl8gKyBhbHJlYWR5X3NpemU7Ci0gICAgfQotCi0gICAgc3RkOjpzaXplX3QgUmVhZCh2b2lkICp0bywgc3RkOjpzaXplX3QgYW1vdW50LCBSZWFkQ29tcHJlc3NlZCAmdGh1bmspIHsKLSAgICAgIGFzc2VydChidWZfLmdldCgpKTsKLSAgICAgIGFzc2VydChyZW1haW5fICE9IGVuZF8pOwotICAgICAgc3RkOjpzaXplX3Qgc2VuZGluZyA9IHN0ZDo6bWluPHN0ZDo6c2l6ZV90PihhbW91bnQsIGVuZF8gLSByZW1haW5fKTsKLSAgICAgIG1lbWNweSh0bywgcmVtYWluXywgc2VuZGluZyk7Ci0gICAgICByZW1haW5fICs9IHNlbmRpbmc7Ci0gICAgICBpZiAocmVtYWluXyA9PSBlbmRfKSB7Ci0gICAgICAgIFJlcGxhY2VUaGlzKG5ldyBVbmNvbXByZXNzZWQoZmRfLnJlbGVhc2UoKSksIHRodW5rKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzZW5kaW5nOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHNjb3BlZF9tYWxsb2MgYnVmXzsKLSAgICB1aW50OF90ICpyZW1haW5fOwotICAgIHVpbnQ4X3QgKmVuZF87Ci0KLSAgICBzY29wZWRfZmQgZmRfOwotfTsKLQotc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IGtJbnB1dEJ1ZmZlciA9IDE2Mzg0OwotCi10ZW1wbGF0ZSA8Y2xhc3MgQ29tcHJlc3Npb24+IGNsYXNzIFN0cmVhbUNvbXByZXNzZWQgOiBwdWJsaWMgUmVhZEJhc2UgewotICBwdWJsaWM6Ci0gICAgU3RyZWFtQ29tcHJlc3NlZChpbnQgZmQsIGNvbnN0IHZvaWQgKmFscmVhZHlfZGF0YSwgc3RkOjpzaXplX3QgYWxyZWFkeV9zaXplKQotICAgICAgOiBmaWxlXyhmZCksCi0gICAgICAgIGluX2J1ZmZlcl8oTWFsbG9jT3JUaHJvdyhrSW5wdXRCdWZmZXIpKSwKLSAgICAgICAgYmFja18obWVtY3B5KGluX2J1ZmZlcl8uZ2V0KCksIGFscmVhZHlfZGF0YSwgYWxyZWFkeV9zaXplKSwgYWxyZWFkeV9zaXplKSB7fQotICAgIAotICAgIHN0ZDo6c2l6ZV90IFJlYWQodm9pZCAqdG8sIHN0ZDo6c2l6ZV90IGFtb3VudCwgUmVhZENvbXByZXNzZWQgJnRodW5rKSB7Ci0gICAgICBpZiAoYW1vdW50ID09IDApIHJldHVybiAwOwotICAgICAgYmFja18uU2V0T3V0cHV0KHRvLCBhbW91bnQpOwotICAgICAgZG8gewotICAgICAgICBpZiAoIWJhY2tfLlN0cmVhbSgpLmF2YWlsX2luKSBSZWFkSW5wdXQodGh1bmspOwotICAgICAgICBpZiAoIWJhY2tfLlByb2Nlc3MoKSkgewotICAgICAgICAgIC8vIHJlYWNoZWQgZW5kLCBhdCBsZWFzdCBmb3IgdGhlIGNvbXByZXNzZWQgcG9ydGlvbi4KLSAgICAgICAgICBzdGQ6OnNpemVfdCByZXQgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KHN0YXRpY19jYXN0PHZvaWQqPihiYWNrXy5TdHJlYW0oKS5uZXh0X291dCkpIC0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRvKTsKLSAgICAgICAgICBSZXBsYWNlVGhpcyhSZWFkRmFjdG9yeShmaWxlXy5yZWxlYXNlKCksIFJlYWRDb3VudCh0aHVuayksIGJhY2tfLlN0cmVhbSgpLm5leHRfaW4sIGJhY2tfLlN0cmVhbSgpLmF2YWlsX2luLCB0cnVlKSwgdGh1bmspOwotICAgICAgICAgIGlmIChyZXQpIHJldHVybiByZXQ7Ci0gICAgICAgICAgLy8gV2UgZGlkIG5vdCByZWFkIGFueXRoaW5nIHRoaXMgcm91bmQsIHNvIGNsaWVudHMgbWlnaHQgdGhpbmsgRU9GLiAgVHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgdG8gdGhlIG5leHQgcmVhZGVyLgotICAgICAgICAgIHJldHVybiBDdXJyZW50KHRodW5rKS0+UmVhZCh0bywgYW1vdW50LCB0aHVuayk7Ci0gICAgICAgIH0KLSAgICAgIH0gd2hpbGUgKGJhY2tfLlN0cmVhbSgpLm5leHRfb3V0ID09IHRvKTsKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oc3RhdGljX2Nhc3Q8dm9pZCo+KGJhY2tfLlN0cmVhbSgpLm5leHRfb3V0KSkgLSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4odG8pOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHZvaWQgUmVhZElucHV0KFJlYWRDb21wcmVzc2VkICZ0aHVuaykgewotICAgICAgYXNzZXJ0KCFiYWNrXy5TdHJlYW0oKS5hdmFpbF9pbik7Ci0gICAgICBzdGQ6OnNpemVfdCBnb3QgPSBSZWFkT3JFT0YoZmlsZV8uZ2V0KCksIGluX2J1ZmZlcl8uZ2V0KCksIGtJbnB1dEJ1ZmZlcik7Ci0gICAgICBiYWNrXy5TZXRJbnB1dChpbl9idWZmZXJfLmdldCgpLCBnb3QpOwotICAgICAgUmVhZENvdW50KHRodW5rKSArPSBnb3Q7Ci0gICAgfQotCi0gICAgc2NvcGVkX2ZkIGZpbGVfOwotICAgIHNjb3BlZF9tYWxsb2MgaW5fYnVmZmVyXzsKLQotICAgIENvbXByZXNzaW9uIGJhY2tfOwotfTsKLQotI2lmZGVmIEhBVkVfWkxJQgotY2xhc3MgR1ppcCB7Ci0gIHB1YmxpYzoKLSAgICBHWmlwKGNvbnN0IHZvaWQgKmJhc2UsIHN0ZDo6c2l6ZV90IGFtb3VudCkgewotICAgICAgU2V0SW5wdXQoYmFzZSwgYW1vdW50KTsKLSAgICAgIHN0cmVhbV8uemFsbG9jID0gWl9OVUxMOwotICAgICAgc3RyZWFtXy56ZnJlZSA9IFpfTlVMTDsKLSAgICAgIHN0cmVhbV8ub3BhcXVlID0gWl9OVUxMOwotICAgICAgc3RyZWFtXy5tc2cgPSBOVUxMOwotICAgICAgLy8gMzIgZm9yIHpsaWIgYW5kIGd6aXAgZGVjb2Rpbmcgd2l0aCBhdXRvbWF0aWMgaGVhZGVyIGRldGVjdGlvbi4gIAotICAgICAgLy8gMTUgZm9yIG1heGltdW0gd2luZG93IHNpemUuICAKLSAgICAgIFVUSUxfVEhST1dfSUYoWl9PSyAhPSBpbmZsYXRlSW5pdDIoJnN0cmVhbV8sIDMyICsgMTUpLCBHWkV4Y2VwdGlvbiwgIkZhaWxlZCB0byBpbml0aWFsaXplIHpsaWIuIik7Ci0gICAgfQotCi0gICAgfkdaaXAoKSB7Ci0gICAgICBpZiAoWl9PSyAhPSBpbmZsYXRlRW5kKCZzdHJlYW1fKSkgewotICAgICAgICBzdGQ6OmNlcnIgPDwgInpsaWIgY291bGQgbm90IGNsb3NlIHByb3Blcmx5LiIgPDwgc3RkOjplbmRsOwotICAgICAgICBhYm9ydCgpOwotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgU2V0T3V0cHV0KHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQpIHsKLSAgICAgIHN0cmVhbV8ubmV4dF9vdXQgPSBzdGF0aWNfY2FzdDxCeXRlZio+KHRvKTsKLSAgICAgIHN0cmVhbV8uYXZhaWxfb3V0ID0gc3RkOjptaW48c3RkOjpzaXplX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8dUludD46Om1heCgpLCBhbW91bnQpOwotICAgIH0KLQotICAgIHZvaWQgU2V0SW5wdXQoY29uc3Qgdm9pZCAqYmFzZSwgc3RkOjpzaXplX3QgYW1vdW50KSB7Ci0gICAgICBhc3NlcnQoYW1vdW50IDwgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8dUludD46Om1heCgpKSk7Ci0gICAgICBzdHJlYW1fLm5leHRfaW4gPSBjb25zdF9jYXN0PEJ5dGVmKj4oc3RhdGljX2Nhc3Q8Y29uc3QgQnl0ZWYqPihiYXNlKSk7Ci0gICAgICBzdHJlYW1fLmF2YWlsX2luID0gYW1vdW50OwotICAgIH0KLQotICAgIGNvbnN0IHpfc3RyZWFtICZTdHJlYW0oKSBjb25zdCB7IHJldHVybiBzdHJlYW1fOyB9Ci0KLSAgICBib29sIFByb2Nlc3MoKSB7Ci0gICAgICBpbnQgcmVzdWx0ID0gaW5mbGF0ZSgmc3RyZWFtXywgMCk7Ci0gICAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFpfT0s6Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgWl9TVFJFQU1fRU5EOgotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBaX0VSUk5POgotICAgICAgICAgIFVUSUxfVEhST1coRXJybm9FeGNlcHRpb24sICJ6bGliIGVycm9yIik7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgVVRJTF9USFJPVyhHWkV4Y2VwdGlvbiwgInpsaWIgZW5jb3VudGVyZWQgIiA8PCAoc3RyZWFtXy5tc2cgPyBzdHJlYW1fLm1zZyA6ICJhbiBlcnJvciAiKSA8PCAiIGNvZGUgIiA8PCByZXN1bHQpOwotICAgICAgfQotICAgIH0KLQotICBwcml2YXRlOgotICAgIHpfc3RyZWFtIHN0cmVhbV87Ci19OwotI2VuZGlmIC8vIEhBVkVfWkxJQgotCi0jaWZkZWYgSEFWRV9CWkxJQgotY2xhc3MgQlppcCB7Ci0gIHB1YmxpYzoKLSAgICBCWmlwKGNvbnN0IHZvaWQgKmJhc2UsIHN0ZDo6c2l6ZV90IGFtb3VudCkgewotICAgICAgbWVtc2V0KCZzdHJlYW1fLCAwLCBzaXplb2Yoc3RyZWFtXykpOwotICAgICAgU2V0SW5wdXQoYmFzZSwgYW1vdW50KTsKLSAgICAgIEhhbmRsZUVycm9yKEJaMl9iekRlY29tcHJlc3NJbml0KCZzdHJlYW1fLCAwLCAwKSk7Ci0gICAgfQotCi0gICAgfkJaaXAoKSB7Ci0gICAgICB0cnkgewotICAgICAgICBIYW5kbGVFcnJvcihCWjJfYnpEZWNvbXByZXNzRW5kKCZzdHJlYW1fKSk7Ci0gICAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmZSkgewotICAgICAgICBzdGQ6OmNlcnIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwotICAgICAgICBhYm9ydCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgUHJvY2VzcygpIHsKLSAgICAgIGludCByZXQgPSBCWjJfYnpEZWNvbXByZXNzKCZzdHJlYW1fKTsKLSAgICAgIGlmIChyZXQgPT0gQlpfU1RSRUFNX0VORCkgcmV0dXJuIGZhbHNlOwotICAgICAgSGFuZGxlRXJyb3IocmV0KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHZvaWQgU2V0T3V0cHV0KHZvaWQgKmJhc2UsIHN0ZDo6c2l6ZV90IGFtb3VudCkgewotICAgICAgc3RyZWFtXy5uZXh0X291dCA9IHN0YXRpY19jYXN0PGNoYXIqPihiYXNlKTsKLSAgICAgIHN0cmVhbV8uYXZhaWxfb3V0ID0gc3RkOjptaW48c3RkOjpzaXplX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWF4KCksIGFtb3VudCk7Ci0gICAgfQotCi0gICAgdm9pZCBTZXRJbnB1dChjb25zdCB2b2lkICpiYXNlLCBzdGQ6OnNpemVfdCBhbW91bnQpIHsKLSAgICAgIHN0cmVhbV8ubmV4dF9pbiA9IGNvbnN0X2Nhc3Q8Y2hhcio+KHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihiYXNlKSk7Ci0gICAgICBzdHJlYW1fLmF2YWlsX2luID0gYW1vdW50OwotICAgIH0KLQotICAgIGNvbnN0IGJ6X3N0cmVhbSAmU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gc3RyZWFtXzsgfQotCi0gIHByaXZhdGU6Ci0gICAgdm9pZCBIYW5kbGVFcnJvcihpbnQgdmFsdWUpIHsKLSAgICAgIHN3aXRjaCh2YWx1ZSkgewotICAgICAgICBjYXNlIEJaX09LOgotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBCWl9DT05GSUdfRVJST1I6Ci0gICAgICAgICAgVVRJTF9USFJPVyhCWkV4Y2VwdGlvbiwgImJ6aXAyIHNlZW1zIHRvIGJlIG1pc2NvbXBpbGVkLiIpOwotICAgICAgICBjYXNlIEJaX1BBUkFNX0VSUk9SOgotICAgICAgICAgIFVUSUxfVEhST1coQlpFeGNlcHRpb24sICJiemlwMiBQYXJhbWV0ZXIgZXJyb3IiKTsKLSAgICAgICAgY2FzZSBCWl9EQVRBX0VSUk9SOgotICAgICAgICAgIFVUSUxfVEhST1coQlpFeGNlcHRpb24sICJiemlwMiBkZXRlY3RlZCBhIGNvcnJ1cHQgZmlsZSIpOwotICAgICAgICBjYXNlIEJaX0RBVEFfRVJST1JfTUFHSUM6Ci0gICAgICAgICAgVVRJTF9USFJPVyhCWkV4Y2VwdGlvbiwgImJ6aXAyIGRldGVjdGVkIGJhZCBtYWdpYyBieXRlcy4gIFBlcmhhcHMgdGhpcyB3YXMgbm90IGEgYnppcDIgZmlsZSBhZnRlciBhbGw/Iik7Ci0gICAgICAgIGNhc2UgQlpfTUVNX0VSUk9SOgotICAgICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgVVRJTF9USFJPVyhCWkV4Y2VwdGlvbiwgIlVua25vd24gYnppcDIgZXJyb3IgY29kZSAiIDw8IHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBiel9zdHJlYW0gc3RyZWFtXzsKLX07Ci0jZW5kaWYgLy8gSEFWRV9CWkxJQgotCi0jaWZkZWYgSEFWRV9YWkxJQgotY2xhc3MgWFppcCB7Ci0gIHB1YmxpYzoKLSAgICBYWmlwKGNvbnN0IHZvaWQgKmJhc2UsIHN0ZDo6c2l6ZV90IGFtb3VudCkKLSAgICAgIDogc3RyZWFtXygpLCBhY3Rpb25fKExaTUFfUlVOKSB7Ci0gICAgICBtZW1zZXQoJnN0cmVhbV8sIDAsIHNpemVvZihzdHJlYW1fKSk7Ci0gICAgICBTZXRJbnB1dChiYXNlLCBhbW91bnQpOwotICAgICAgSGFuZGxlRXJyb3IobHptYV9zdHJlYW1fZGVjb2Rlcigmc3RyZWFtXywgVUlOVDY0X01BWCwgMCkpOwotICAgIH0KLQotICAgIH5YWmlwKCkgewotICAgICAgbHptYV9lbmQoJnN0cmVhbV8pOwotICAgIH0KLQotICAgIHZvaWQgU2V0T3V0cHV0KHZvaWQgKmJhc2UsIHN0ZDo6c2l6ZV90IGFtb3VudCkgewotICAgICAgc3RyZWFtXy5uZXh0X291dCA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihiYXNlKTsKLSAgICAgIHN0cmVhbV8uYXZhaWxfb3V0ID0gYW1vdW50OwotICAgIH0KLQotICAgIHZvaWQgU2V0SW5wdXQoY29uc3Qgdm9pZCAqYmFzZSwgc3RkOjpzaXplX3QgYW1vdW50KSB7Ci0gICAgICBzdHJlYW1fLm5leHRfaW4gPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYmFzZSk7Ci0gICAgICBzdHJlYW1fLmF2YWlsX2luID0gYW1vdW50OwotICAgICAgaWYgKCFhbW91bnQpIGFjdGlvbl8gPSBMWk1BX0ZJTklTSDsKLSAgICB9Ci0KLSAgICBjb25zdCBsem1hX3N0cmVhbSAmU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gc3RyZWFtXzsgfQotCi0gICAgYm9vbCBQcm9jZXNzKCkgewotICAgICAgbHptYV9yZXQgc3RhdHVzID0gbHptYV9jb2RlKCZzdHJlYW1fLCBhY3Rpb25fKTsKLSAgICAgIGlmIChzdGF0dXMgPT0gTFpNQV9TVFJFQU1fRU5EKSByZXR1cm4gZmFsc2U7Ci0gICAgICBIYW5kbGVFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgdm9pZCBIYW5kbGVFcnJvcihsem1hX3JldCB2YWx1ZSkgewotICAgICAgc3dpdGNoICh2YWx1ZSkgewotICAgICAgICBjYXNlIExaTUFfT0s6Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIExaTUFfTUVNX0VSUk9SOgotICAgICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7Ci0gICAgICAgIGNhc2UgTFpNQV9GT1JNQVRfRVJST1I6Ci0gICAgICAgICAgVVRJTF9USFJPVyhYWkV4Y2VwdGlvbiwgInh6bGliIHNheXMgZmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiKTsKLSAgICAgICAgY2FzZSBMWk1BX09QVElPTlNfRVJST1I6Ci0gICAgICAgICAgVVRJTF9USFJPVyhYWkV4Y2VwdGlvbiwgInh6bGliIHNheXMgdW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gb3B0aW9ucyIpOwotICAgICAgICBjYXNlIExaTUFfREFUQV9FUlJPUjoKLSAgICAgICAgICBVVElMX1RIUk9XKFhaRXhjZXB0aW9uLCAieHpsaWIgc2F5cyB0aGlzIGZpbGUgaXMgY29ycnVwdCIpOwotICAgICAgICBjYXNlIExaTUFfQlVGX0VSUk9SOgotICAgICAgICAgIFVUSUxfVEhST1coWFpFeGNlcHRpb24sICJ4emxpYiBzYXlzIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgVVRJTF9USFJPVyhYWkV4Y2VwdGlvbiwgInVucmVjb2duaXplZCB4emxpYiBlcnJvciAiIDw8IHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBsem1hX3N0cmVhbSBzdHJlYW1fOwotICAgIGx6bWFfYWN0aW9uIGFjdGlvbl87Ci19OwotI2VuZGlmIC8vIEhBVkVfWFpMSUIKLQotY2xhc3MgSVN0cmVhbVJlYWRlciA6IHB1YmxpYyBSZWFkQmFzZSB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJU3RyZWFtUmVhZGVyKHN0ZDo6aXN0cmVhbSAmc3RyZWFtKSA6IHN0cmVhbV8oc3RyZWFtKSB7fQotCi0gICAgc3RkOjpzaXplX3QgUmVhZCh2b2lkICp0bywgc3RkOjpzaXplX3QgYW1vdW50LCBSZWFkQ29tcHJlc3NlZCAmdGh1bmspIHsKLSAgICAgIGlmICghc3RyZWFtXy5yZWFkKHN0YXRpY19jYXN0PGNoYXIqPih0byksIGFtb3VudCkpIHsKLSAgICAgICAgVVRJTF9USFJPV19JRighc3RyZWFtXy5lb2YoKSwgRXJybm9FeGNlcHRpb24sICJpc3RyZWFtIGVycm9yIik7Ci0gICAgICAgIGFtb3VudCA9IHN0cmVhbV8uZ2NvdW50KCk7Ci0gICAgICB9Ci0gICAgICBSZWFkQ291bnQodGh1bmspICs9IGFtb3VudDsKLSAgICAgIHJldHVybiBhbW91bnQ7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgc3RkOjppc3RyZWFtICZzdHJlYW1fOwotfTsKLQotZW51bSBNYWdpY1Jlc3VsdCB7Ci0gIFVUSUxfVU5LTk9XTiwgVVRJTF9HWklQLCBVVElMX0JaSVAsIFVUSUxfWFpJUAotfTsKLQotTWFnaWNSZXN1bHQgRGV0ZWN0TWFnaWMoY29uc3Qgdm9pZCAqZnJvbV92b2lkLCBzdGQ6OnNpemVfdCBsZW5ndGgpIHsKLSAgY29uc3QgdWludDhfdCAqaGVhZGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGZyb21fdm9pZCk7Ci0gIGlmIChsZW5ndGggPj0gMiAmJiBoZWFkZXJbMF0gPT0gMHgxZiAmJiBoZWFkZXJbMV0gPT0gMHg4YikgewotICAgIHJldHVybiBVVElMX0daSVA7Ci0gIH0KLSAgY29uc3QgdWludDhfdCBrQlpNYWdpY1szXSA9IHsnQicsICdaJywgJ2gnfTsKLSAgaWYgKGxlbmd0aCA+PSBzaXplb2Yoa0JaTWFnaWMpICYmICFtZW1jbXAoaGVhZGVyLCBrQlpNYWdpYywgc2l6ZW9mKGtCWk1hZ2ljKSkpIHsKLSAgICByZXR1cm4gVVRJTF9CWklQOwotICB9Ci0gIGNvbnN0IHVpbnQ4X3Qga1haTWFnaWNbNl0gPSB7IDB4RkQsICc3JywgJ3onLCAnWCcsICdaJywgMHgwMCB9OwotICBpZiAobGVuZ3RoID49IHNpemVvZihrWFpNYWdpYykgJiYgIW1lbWNtcChoZWFkZXIsIGtYWk1hZ2ljLCBzaXplb2Yoa1haTWFnaWMpKSkgewotICAgIHJldHVybiBVVElMX1haSVA7Ci0gIH0KLSAgcmV0dXJuIFVUSUxfVU5LTk9XTjsKLX0KLQotUmVhZEJhc2UgKlJlYWRGYWN0b3J5KGludCBmZCwgdWludDY0X3QgJnJhd19hbW91bnQsIGNvbnN0IHZvaWQgKmFscmVhZHlfZGF0YSwgY29uc3Qgc3RkOjpzaXplX3QgYWxyZWFkeV9zaXplLCBib29sIHJlcXVpcmVfY29tcHJlc3NlZCkgewotICBzY29wZWRfZmQgaG9sZChmZCk7Ci0gIHN0ZDo6c3RyaW5nIGhlYWRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihhbHJlYWR5X2RhdGEpLCBhbHJlYWR5X3NpemUpOwotICBpZiAoaGVhZGVyLnNpemUoKSA8IFJlYWRDb21wcmVzc2VkOjprTWFnaWNTaXplKSB7Ci0gICAgc3RkOjpzaXplX3Qgb3JpZ2luYWwgPSBoZWFkZXIuc2l6ZSgpOwotICAgIGhlYWRlci5yZXNpemUoUmVhZENvbXByZXNzZWQ6OmtNYWdpY1NpemUpOwotICAgIHN0ZDo6c2l6ZV90IGdvdCA9IFJlYWRPckVPRihmZCwgJmhlYWRlcltvcmlnaW5hbF0sIFJlYWRDb21wcmVzc2VkOjprTWFnaWNTaXplIC0gb3JpZ2luYWwpOwotICAgIHJhd19hbW91bnQgKz0gZ290OwotICAgIGhlYWRlci5yZXNpemUob3JpZ2luYWwgKyBnb3QpOwotICB9Ci0gIGlmIChoZWFkZXIuZW1wdHkoKSkgewotICAgIHJldHVybiBuZXcgQ29tcGxldGUoKTsKLSAgfQotICBzd2l0Y2ggKERldGVjdE1hZ2ljKCZoZWFkZXJbMF0sIGhlYWRlci5zaXplKCkpKSB7Ci0gICAgY2FzZSBVVElMX0daSVA6Ci0jaWZkZWYgSEFWRV9aTElCCi0gICAgICByZXR1cm4gbmV3IFN0cmVhbUNvbXByZXNzZWQ8R1ppcD4oaG9sZC5yZWxlYXNlKCksIGhlYWRlci5kYXRhKCksIGhlYWRlci5zaXplKCkpOwotI2Vsc2UKLSAgICAgIFVUSUxfVEhST1coQ29tcHJlc3NlZEV4Y2VwdGlvbiwgIlRoaXMgbG9va3MgbGlrZSBhIGd6aXAgZmlsZSBidXQgZ3ppcCBzdXBwb3J0IHdhcyBub3QgY29tcGlsZWQgaW4uIik7Ci0jZW5kaWYKLSAgICBjYXNlIFVUSUxfQlpJUDoKLSNpZmRlZiBIQVZFX0JaTElCCi0gICAgICByZXR1cm4gbmV3IFN0cmVhbUNvbXByZXNzZWQ8QlppcD4oaG9sZC5yZWxlYXNlKCksICZoZWFkZXJbMF0sIGhlYWRlci5zaXplKCkpOwotI2Vsc2UKLSAgICAgIFVUSUxfVEhST1coQ29tcHJlc3NlZEV4Y2VwdGlvbiwgIlRoaXMgbG9va3MgbGlrZSBhIGJ6aXAgZmlsZSAoaXQgYmVnaW5zIHdpdGggQlpoKSwgYnV0IGJ6aXAgc3VwcG9ydCB3YXMgbm90IGNvbXBpbGVkIGluLiIpOwotI2VuZGlmCi0gICAgY2FzZSBVVElMX1haSVA6Ci0jaWZkZWYgSEFWRV9YWkxJQgotICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Db21wcmVzc2VkPFhaaXA+KGhvbGQucmVsZWFzZSgpLCBoZWFkZXIuZGF0YSgpLCBoZWFkZXIuc2l6ZSgpKTsKLSNlbHNlCi0gICAgICBVVElMX1RIUk9XKENvbXByZXNzZWRFeGNlcHRpb24sICJUaGlzIGxvb2tzIGxpa2UgYW4geHogZmlsZSwgYnV0IHh6IHN1cHBvcnQgd2FzIG5vdCBjb21waWxlZCBpbi4iKTsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBVVElMX1RIUk9XX0lGKHJlcXVpcmVfY29tcHJlc3NlZCwgQ29tcHJlc3NlZEV4Y2VwdGlvbiwgIlVuY29tcHJlc3NlZCBkYXRhIGRldGVjdGVkIGFmdGVyIGEgY29tcHJlc3NzZWQgZmlsZS4gIFRoaXMgY291bGQgYmUgc3VwcG9ydGVkIGJ1dCB1c3VhbGx5IGluZGljYXRlcyBhbiBlcnJvci4iKTsKLSAgICAgIHJldHVybiBuZXcgVW5jb21wcmVzc2VkV2l0aEhlYWRlcihob2xkLnJlbGVhc2UoKSwgaGVhZGVyLmRhdGEoKSwgaGVhZGVyLnNpemUoKSk7Ci0gIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UKLQotYm9vbCBSZWFkQ29tcHJlc3NlZDo6RGV0ZWN0Q29tcHJlc3NlZE1hZ2ljKGNvbnN0IHZvaWQgKmZyb21fdm9pZCkgewotICByZXR1cm4gRGV0ZWN0TWFnaWMoZnJvbV92b2lkLCBrTWFnaWNTaXplKSAhPSBVVElMX1VOS05PV047Ci19Ci0KLVJlYWRDb21wcmVzc2VkOjpSZWFkQ29tcHJlc3NlZChpbnQgZmQpIHsKLSAgUmVzZXQoZmQpOwotfQotCi1SZWFkQ29tcHJlc3NlZDo6UmVhZENvbXByZXNzZWQoc3RkOjppc3RyZWFtICZpbikgewotICBSZXNldChpbik7Ci19Ci0KLVJlYWRDb21wcmVzc2VkOjpSZWFkQ29tcHJlc3NlZCgpIHt9Ci0KLVJlYWRDb21wcmVzc2VkOjp+UmVhZENvbXByZXNzZWQoKSB7fQotCi12b2lkIFJlYWRDb21wcmVzc2VkOjpSZXNldChpbnQgZmQpIHsKLSAgcmF3X2Ftb3VudF8gPSAwOwotICBpbnRlcm5hbF8ucmVzZXQoKTsKLSAgaW50ZXJuYWxfLnJlc2V0KFJlYWRGYWN0b3J5KGZkLCByYXdfYW1vdW50XywgTlVMTCwgMCwgZmFsc2UpKTsKLX0KLQotdm9pZCBSZWFkQ29tcHJlc3NlZDo6UmVzZXQoc3RkOjppc3RyZWFtICZpbikgewotICBpbnRlcm5hbF8ucmVzZXQoKTsKLSAgaW50ZXJuYWxfLnJlc2V0KG5ldyBJU3RyZWFtUmVhZGVyKGluKSk7Ci19Ci0KLXN0ZDo6c2l6ZV90IFJlYWRDb21wcmVzc2VkOjpSZWFkKHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQpIHsKLSAgcmV0dXJuIGludGVybmFsXy0+UmVhZCh0bywgYW1vdW50LCAqdGhpcyk7Ci19Ci0KLXN0ZDo6c2l6ZV90IFJlYWRDb21wcmVzc2VkOjpSZWFkT3JFT0Yodm9pZCAqY29uc3QgdG9faW4sIHN0ZDo6c2l6ZV90IGFtb3VudCkgewotICB1aW50OF90ICp0byA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHRvX2luKTsKLSAgd2hpbGUgKGFtb3VudCkgewotICAgIHN0ZDo6c2l6ZV90IGdvdCA9IFJlYWQodG8sIGFtb3VudCk7Ci0gICAgaWYgKCFnb3QpIGJyZWFrOwotICAgIHRvICs9IGdvdDsKLSAgICBhbW91bnQgLT0gZ290OwotICB9Ci0gIHJldHVybiB0byAtIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHRvX2luKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvcmVhZF9jb21wcmVzc2VkLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvcmVhZF9jb21wcmVzc2VkLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjdlZTk0Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3JlYWRfY29tcHJlc3NlZC5oaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLSNpZm5kZWYgVVRJTF9SRUFEX0NPTVBSRVNTRURfSAotI2RlZmluZSBVVElMX1JFQURfQ09NUFJFU1NFRF9ICi0KLSNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKLSNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIHV0aWwgewotCi1jbGFzcyBDb21wcmVzc2VkRXhjZXB0aW9uIDogcHVibGljIEV4Y2VwdGlvbiB7Ci0gIHB1YmxpYzoKLSAgICBDb21wcmVzc2VkRXhjZXB0aW9uKCkgdGhyb3coKTsKLSAgICB2aXJ0dWFsIH5Db21wcmVzc2VkRXhjZXB0aW9uKCkgdGhyb3coKTsKLX07Ci0KLWNsYXNzIEdaRXhjZXB0aW9uIDogcHVibGljIENvbXByZXNzZWRFeGNlcHRpb24gewotICBwdWJsaWM6Ci0gICAgR1pFeGNlcHRpb24oKSB0aHJvdygpOwotICAgIH5HWkV4Y2VwdGlvbigpIHRocm93KCk7Ci19OwotCi1jbGFzcyBCWkV4Y2VwdGlvbiA6IHB1YmxpYyBDb21wcmVzc2VkRXhjZXB0aW9uIHsKLSAgcHVibGljOgotICAgIEJaRXhjZXB0aW9uKCkgdGhyb3coKTsKLSAgICB+QlpFeGNlcHRpb24oKSB0aHJvdygpOwotfTsKLQotY2xhc3MgWFpFeGNlcHRpb24gOiBwdWJsaWMgQ29tcHJlc3NlZEV4Y2VwdGlvbiB7Ci0gIHB1YmxpYzoKLSAgICBYWkV4Y2VwdGlvbigpIHRocm93KCk7Ci0gICAgflhaRXhjZXB0aW9uKCkgdGhyb3coKTsKLX07Ci0KLWNsYXNzIFJlYWRCYXNlOwotCi1jbGFzcyBSZWFkQ29tcHJlc3NlZCB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3Qga01hZ2ljU2l6ZSA9IDY7Ci0gICAgLy8gTXVzdCBoYXZlIGF0IGxlYXN0IGtNYWdpY1NpemUgYnl0ZXMuICAKLSAgICBzdGF0aWMgYm9vbCBEZXRlY3RDb21wcmVzc2VkTWFnaWMoY29uc3Qgdm9pZCAqZnJvbSk7Ci0KLSAgICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgZmQuICAgCi0gICAgZXhwbGljaXQgUmVhZENvbXByZXNzZWQoaW50IGZkKTsKLQotICAgIC8vIFRyeSB0byBhdm9pZCB1c2luZyB0aGlzLiAgVXNlIHRoZSBmZCBpbnN0ZWFkLgotICAgIC8vIFRoZXJlIGlzIG5vIGRlY29tcHJlc3Npb24gc3VwcG9ydCBmb3IgaXN0cmVhbXMuCi0gICAgZXhwbGljaXQgUmVhZENvbXByZXNzZWQoc3RkOjppc3RyZWFtICZpbik7Ci0KLSAgICAvLyBNdXN0IGNhbGwgUmVzZXQgbGF0ZXIuCi0gICAgUmVhZENvbXByZXNzZWQoKTsKLQotICAgIH5SZWFkQ29tcHJlc3NlZCgpOwotCi0gICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIGZkLiAgCi0gICAgdm9pZCBSZXNldChpbnQgZmQpOwotCi0gICAgLy8gU2FtZSBhZHZpY2UgYXMgdGhlIGNvbnN0cnVjdG9yLgotICAgIHZvaWQgUmVzZXQoc3RkOjppc3RyZWFtICZpbik7Ci0KLSAgICBzdGQ6OnNpemVfdCBSZWFkKHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQpOwotCi0gICAgLy8gUmVwZWF0ZWRseSBjYWxsIHJlYWQgdG8gZmlsbCBhIGJ1ZmZlciB1bmxlc3MgRU9GIGlzIGhpdC4KLSAgICAvLyBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCi0gICAgc3RkOjpzaXplX3QgUmVhZE9yRU9GKHZvaWQgKmNvbnN0IHRvLCBzdGQ6OnNpemVfdCBhbW91bnQpOwotCi0gICAgdWludDY0X3QgUmF3QW1vdW50KCkgY29uc3QgeyByZXR1cm4gcmF3X2Ftb3VudF87IH0KLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBSZWFkQmFzZTsKLQotICAgIHNjb3BlZF9wdHI8UmVhZEJhc2U+IGludGVybmFsXzsKLQotICAgIHVpbnQ2NF90IHJhd19hbW91bnRfOwotCi0gICAgLy8gTm8gY29weWluZy4gIAotICAgIFJlYWRDb21wcmVzc2VkKGNvbnN0IFJlYWRDb21wcmVzc2VkICYpOwotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFJlYWRDb21wcmVzc2VkICYpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgdXRpbAotCi0jZW5kaWYgLy8gVVRJTF9SRUFEX0NPTVBSRVNTRURfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvcmVhZF9jb21wcmVzc2VkX3Rlc3QuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9yZWFkX2NvbXByZXNzZWRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxZThmNC4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9yZWFkX2NvbXByZXNzZWRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0jaW5jbHVkZSAidXRpbC9yZWFkX2NvbXByZXNzZWQuaGgiCi0KLSNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCi0jaW5jbHVkZSAidXRpbC9oYXZlLmhoIgotCi0jZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFJlYWRDb21wcmVzc2VkVGVzdAotI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KLSNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpZiBkZWZpbmVkIF9fTUlOR1czMl9fCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpZiAhZGVmaW5lZCBta3N0ZW1wCi0vLyBUT0RPIGluc2VjdXJlCi1pbnQgbWtzdGVtcChjaGFyICogc3RlbXBsYXRlKQotewotICAgIGNoYXIgKmZpbGVuYW1lID0gbWt0ZW1wKHN0ZW1wbGF0ZSk7Ci0gICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gb3BlbihmaWxlbmFtZSwgT19SRFdSIHwgT19DUkVBVCwgMDYwMCk7Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8vIGRlZmluZWQKLQotbmFtZXNwYWNlIHV0aWwgewotbmFtZXNwYWNlIHsKLQotdm9pZCBSZWFkTG9vcChSZWFkQ29tcHJlc3NlZCAmcmVhZGVyLCB2b2lkICp0b192b2lkLCBzdGQ6OnNpemVfdCBhbW91bnQpIHsKLSAgdWludDhfdCAqdG8gPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4odG9fdm9pZCk7Ci0gIHdoaWxlIChhbW91bnQpIHsKLSAgICBzdGQ6OnNpemVfdCByZXQgPSByZWFkZXIuUmVhZCh0bywgYW1vdW50KTsKLSAgICBCT09TVF9SRVFVSVJFKHJldCk7Ci0gICAgdG8gKz0gcmV0OwotICAgIGFtb3VudCAtPSByZXQ7Ci0gIH0KLX0KLQotY29uc3QgdWludDMyX3Qga1NpemU0ID0gMTAwMDAwIC8gNDsKLQotc3RkOjpzdHJpbmcgV3JpdGVSYW5kb20oKSB7Ci0gIGNoYXIgbmFtZVtdID0gInRlbXBYWFhYWFgiOwotICBzY29wZWRfZmQgb3JpZ2luYWwobWtzdGVtcChuYW1lKSk7Ci0gIEJPT1NUX1JFUVVJUkUob3JpZ2luYWwuZ2V0KCkgPiAwKTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtTaXplNDsgKytpKSB7Ci0gICAgV3JpdGVPclRocm93KG9yaWdpbmFsLmdldCgpLCAmaSwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIH0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXZvaWQgVmVyaWZ5UmVhZChSZWFkQ29tcHJlc3NlZCAmcmVhZGVyKSB7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrU2l6ZTQ7ICsraSkgewotICAgIHVpbnQzMl90IGdvdDsKLSAgICBSZWFkTG9vcChyZWFkZXIsICZnb3QsIHNpemVvZih1aW50MzJfdCkpOwotICAgIEJPT1NUX0NIRUNLX0VRVUFMKGksIGdvdCk7Ci0gIH0KLQotICBjaGFyIGlnbm9yZWQ7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKChzdGQ6OnNpemVfdCkwLCByZWFkZXIuUmVhZCgmaWdub3JlZCwgMSkpOwotICAvLyBUZXN0IGRvdWJsZSBFT0YgY2FsbC4KLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHN0ZDo6c2l6ZV90KTAsIHJlYWRlci5SZWFkKCZpZ25vcmVkLCAxKSk7Ci19Ci0KLXZvaWQgVGVzdFJhbmRvbShjb25zdCBjaGFyICpjb21wcmVzc29yKSB7Ci0gIHN0ZDo6c3RyaW5nIG5hbWUoV3JpdGVSYW5kb20oKSk7Ci0KLSAgY2hhciBnem5hbWVbXSA9ICJ0ZW1wWFhYWFhYIjsKLSAgc2NvcGVkX2ZkIGd6aXBwZWQobWtzdGVtcChnem5hbWUpKTsKLQotICBzdGQ6OnN0cmluZyBjb21tYW5kKGNvbXByZXNzb3IpOwotI2lmZGVmIF9fQ1lHV0lOX18KLSAgY29tbWFuZCArPSAiLmV4ZSI7Ci0jZW5kaWYKLSAgY29tbWFuZCArPSAiIDxcIiI7Ci0gIGNvbW1hbmQgKz0gbmFtZTsKLSAgY29tbWFuZCArPSAiXCIgPlwiIjsKLSAgY29tbWFuZCArPSBnem5hbWU7Ci0gIGNvbW1hbmQgKz0gIlwiIjsKLSAgQk9PU1RfUkVRVUlSRV9FUVVBTCgwLCBzeXN0ZW0oY29tbWFuZC5jX3N0cigpKSk7Ci0KLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgdW5saW5rKG5hbWUuY19zdHIoKSkpOwotICBCT09TVF9DSEVDS19FUVVBTCgwLCB1bmxpbmsoZ3puYW1lKSk7Ci0KLSAgUmVhZENvbXByZXNzZWQgcmVhZGVyKGd6aXBwZWQucmVsZWFzZSgpKTsKLSAgVmVyaWZ5UmVhZChyZWFkZXIpOwotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShVbmNvbXByZXNzZWQpIHsKLSAgVGVzdFJhbmRvbSgiY2F0Iik7Ci19Ci0KLSNpZmRlZiBIQVZFX1pMSUIKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKFJlYWRHWikgewotICBUZXN0UmFuZG9tKCJnemlwIik7Ci19Ci0jZW5kaWYgLy8gSEFWRV9aTElCCi0KLSNpZmRlZiBIQVZFX0JaTElCCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShSZWFkQlopIHsKLSAgVGVzdFJhbmRvbSgiYnppcDIiKTsKLX0KLSNlbmRpZiAvLyBIQVZFX0JaTElCCi0KLSNpZmRlZiBIQVZFX1haTElCCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShSZWFkWFopIHsKLSAgVGVzdFJhbmRvbSgieHoiKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9aTElCCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShBcHBlbmRHWikgewotfQotI2VuZGlmCi0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKElTdHJlYW0pIHsKLSAgc3RkOjpzdHJpbmcgbmFtZShXcml0ZVJhbmRvbSgpKTsKLSAgc3RkOjpmc3RyZWFtIHN0cmVhbShuYW1lLmNfc3RyKCksIHN0ZDo6aW9zOjppbik7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHVubGluayhuYW1lLmNfc3RyKCkpKTsKLSAgUmVhZENvbXByZXNzZWQgcmVhZGVyOwotICByZWFkZXIuUmVzZXQoc3RyZWFtKTsKLSAgVmVyaWZ5UmVhZChyZWFkZXIpOwotfQotCi19IC8vIG5hbWVzcGFjZQotfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc2NvcGVkLmNjIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc2NvcGVkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTFkOWU5Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3Njb3BlZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpCi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNlbmRpZgotCi1uYW1lc3BhY2UgdXRpbCB7Ci0KLU1hbGxvY0V4Y2VwdGlvbjo6TWFsbG9jRXhjZXB0aW9uKHN0ZDo6c2l6ZV90IHJlcXVlc3RlZCkgdGhyb3coKSB7Ci0gICp0aGlzIDw8ICJmb3IgIiA8PCByZXF1ZXN0ZWQgPDwgIiBieXRlcyAiOwotfQotCi1NYWxsb2NFeGNlcHRpb246On5NYWxsb2NFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLW5hbWVzcGFjZSB7Ci12b2lkICpJbnNwZWN0QWRkcih2b2lkICphZGRyLCBzdGQ6OnNpemVfdCByZXF1ZXN0ZWQsIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSkgewotICBVVElMX1RIUk9XX0lGX0FSRyghYWRkciAmJiByZXF1ZXN0ZWQsIE1hbGxvY0V4Y2VwdGlvbiwgKHJlcXVlc3RlZCksICJpbiAiIDw8IGZ1bmNfbmFtZSk7Ci0gIC8vIFRoZXNlIHJvdXRpbmVzIGFyZSBvZnRlbiB1c2VkIGZvciBsYXJnZSBjaHVua3Mgb2YgbWVtb3J5IHdoZXJlIGh1Z2UgcGFnZXMgaGVscC4KLSNpZiBNQURWX0hVR0VQQUdFCi0gIG1hZHZpc2UoYWRkciwgcmVxdWVzdGVkLCBNQURWX0hVR0VQQUdFKTsKLSNlbmRpZgotICByZXR1cm4gYWRkcjsKLX0KLX0gLy8gbmFtZXNwYWNlCi0KLXZvaWQgKk1hbGxvY09yVGhyb3coc3RkOjpzaXplX3QgcmVxdWVzdGVkKSB7Ci0gIHJldHVybiBJbnNwZWN0QWRkcihzdGQ6Om1hbGxvYyhyZXF1ZXN0ZWQpLCByZXF1ZXN0ZWQsICJtYWxsb2MiKTsKLX0KLQotdm9pZCAqQ2FsbG9jT3JUaHJvdyhzdGQ6OnNpemVfdCByZXF1ZXN0ZWQpIHsKLSAgcmV0dXJuIEluc3BlY3RBZGRyKHN0ZDo6Y2FsbG9jKDEsIHJlcXVlc3RlZCksIHJlcXVlc3RlZCwgImNhbGxvYyIpOwotfQotCi12b2lkIHNjb3BlZF9tYWxsb2M6OmNhbGxfcmVhbGxvYyhzdGQ6OnNpemVfdCByZXF1ZXN0ZWQpIHsKLSAgcF8gPSBJbnNwZWN0QWRkcihzdGQ6OnJlYWxsb2MocF8sIHJlcXVlc3RlZCksIHJlcXVlc3RlZCwgInJlYWxsb2MiKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc2NvcGVkLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc2NvcGVkLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGMzNmMzLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3Njb3BlZC5oaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0jaWZuZGVmIFVUSUxfU0NPUEVEX0gKLSNkZWZpbmUgVVRJTF9TQ09QRURfSAotLyogT3RoZXIgc2NvcGVkIG9iamVjdHMgaW4gdGhlIHN0eWxlIG9mIHNjb3BlZF9wdHIuICovCi0KLSNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLQotY2xhc3MgTWFsbG9jRXhjZXB0aW9uIDogcHVibGljIEVycm5vRXhjZXB0aW9uIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IE1hbGxvY0V4Y2VwdGlvbihzdGQ6OnNpemVfdCByZXF1ZXN0ZWQpIHRocm93KCk7Ci0gICAgfk1hbGxvY0V4Y2VwdGlvbigpIHRocm93KCk7Ci19OwotCi12b2lkICpNYWxsb2NPclRocm93KHN0ZDo6c2l6ZV90IHJlcXVlc3RlZCk7Ci12b2lkICpDYWxsb2NPclRocm93KHN0ZDo6c2l6ZV90IHJlcXVlc3RlZCk7Ci0KLS8qIFVuZm9ydHVuYXRlbHksIGRlZmluaW5nIHRoZSBvcGVyYXRvciogZm9yIHZvaWQgKiBtYWtlcyB0aGUgY29tcGlsZXIgY29tcGxhaW4uCi0gKiBTbyBzY29wZWQgaXMgc3BlY2lhbGl6ZWQgdG8gdm9pZC4gIFRoaXMgaW5jbHVkZXMgdGhlIGZ1bmN0aW9uYWxpdHkgY29tbW9uIHRvCi0gKiBib3RoLCBuYW1lbHkgZXZlcnl0aGluZyBleGNlcHQgcmVmZXJlbmNlLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2xvc2VyPiBjbGFzcyBzY29wZWRfYmFzZSB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBzY29wZWRfYmFzZShUICpwID0gTlVMTCkgOiBwXyhwKSB7fQotCi0gICAgfnNjb3BlZF9iYXNlKCkgeyBDbG9zZXI6OkNsb3NlKHBfKTsgfQotCi0gICAgdm9pZCByZXNldChUICpwID0gTlVMTCkgewotICAgICAgc2NvcGVkX2Jhc2Ugb3RoZXIocF8pOwotICAgICAgcF8gPSBwOwotICAgIH0KLQotICAgIFQgKmdldCgpIHsgcmV0dXJuIHBfOyB9Ci0gICAgY29uc3QgVCAqZ2V0KCkgY29uc3QgeyByZXR1cm4gcF87IH0KLQotICAgIFQgKm9wZXJhdG9yLT4oKSB7IHJldHVybiBwXzsgfQotICAgIGNvbnN0IFQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBwXzsgfQotCi0gICAgVCAqcmVsZWFzZSgpIHsKLSAgICAgIFQgKnJldCA9IHBfOwotICAgICAgcF8gPSBOVUxMOwotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIFQgKnBfOwotCi0gIHByaXZhdGU6Ci0gICAgc2NvcGVkX2Jhc2UoY29uc3Qgc2NvcGVkX2Jhc2UgJik7Ci0gICAgc2NvcGVkX2Jhc2UgJm9wZXJhdG9yPShjb25zdCBzY29wZWRfYmFzZSAmKTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDbG9zZXI+IGNsYXNzIHNjb3BlZCA6IHB1YmxpYyBzY29wZWRfYmFzZTxULCBDbG9zZXI+IHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IHNjb3BlZChUICpwID0gTlVMTCkgOiBzY29wZWRfYmFzZTxULCBDbG9zZXI+KHApIHt9Ci0KLSAgICBUICZvcGVyYXRvciooKSB7IHJldHVybiAqc2NvcGVkX2Jhc2U8VCwgQ2xvc2VyPjo6cF87IH0KLSAgICBjb25zdCBUJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpzY29wZWRfYmFzZTxULCBDbG9zZXI+OjpwXzsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIENsb3Nlcj4gY2xhc3Mgc2NvcGVkPHZvaWQsIENsb3Nlcj4gOiBwdWJsaWMgc2NvcGVkX2Jhc2U8dm9pZCwgQ2xvc2VyPiB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBzY29wZWQodm9pZCAqcCA9IE5VTEwpIDogc2NvcGVkX2Jhc2U8dm9pZCwgQ2xvc2VyPihwKSB7fQotfTsKLQotLyogQ2xvc2VyIGZvciBjIGZ1bmN0aW9ucyBsaWtlIHN0ZDo6ZnJlZSBhbmQgY21waCBjbGVhbnVwIGZ1bmN0aW9ucyAqLwotdGVtcGxhdGUgPGNsYXNzIFQsIHZvaWQgKCpjbGVhbikoVCopPiBzdHJ1Y3Qgc2NvcGVkX2NfZm9yd2FyZCB7Ci0gIHN0YXRpYyB2b2lkIENsb3NlKFQgKnApIHsgY2xlYW4ocCk7IH0KLX07Ci0vLyBDYWxsIGEgQyBmdW5jdGlvbiB0byBkZWxldGUgc3R1ZmYKLXRlbXBsYXRlIDxjbGFzcyBULCB2b2lkICgqY2xlYW4pKFQqKT4gY2xhc3Mgc2NvcGVkX2MgOiBwdWJsaWMgc2NvcGVkPFQsIHNjb3BlZF9jX2ZvcndhcmQ8VCwgY2xlYW4+ID4gewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgc2NvcGVkX2MoVCAqcCA9IE5VTEwpIDogc2NvcGVkPFQsIHNjb3BlZF9jX2ZvcndhcmQ8VCwgY2xlYW4+ID4ocCkge30KLX07Ci0KLWNsYXNzIHNjb3BlZF9tYWxsb2MgOiBwdWJsaWMgc2NvcGVkX2M8dm9pZCwgc3RkOjpmcmVlPiB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBzY29wZWRfbWFsbG9jKHZvaWQgKnAgPSBOVUxMKSA6IHNjb3BlZF9jPHZvaWQsIHN0ZDo6ZnJlZT4ocCkge30KLQotICAgIHZvaWQgY2FsbF9yZWFsbG9jKHN0ZDo6c2l6ZV90IHRvKTsKLX07Ci0KLS8qIHNjb3BlZF9hcnJheSB1c2luZyBkZWxldGVbXSAqLwotc3RydWN0IHNjb3BlZF9kZWxldGVfYXJyYXlfZm9yd2FyZCB7Ci0gIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgdm9pZCBDbG9zZShUICpwKSB7IGRlbGV0ZSBbXSBwOyB9Ci19OwotLy8gSGF0IHRpcCB0byBib29zdC4gIAotdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIHNjb3BlZF9hcnJheSA6IHB1YmxpYyBzY29wZWQ8VCwgc2NvcGVkX2RlbGV0ZV9hcnJheV9mb3J3YXJkPiB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBzY29wZWRfYXJyYXkoVCAqcCA9IE5VTEwpIDogc2NvcGVkPFQsIHNjb3BlZF9kZWxldGVfYXJyYXlfZm9yd2FyZD4ocCkge30KLQotICAgIFQgJm9wZXJhdG9yW10oc3RkOjpzaXplX3QgaWR4KSB7IHJldHVybiBzY29wZWQ8VCwgc2NvcGVkX2RlbGV0ZV9hcnJheV9mb3J3YXJkPjo6cF9baWR4XTsgfQotICAgIGNvbnN0IFQgJm9wZXJhdG9yW10oc3RkOjpzaXplX3QgaWR4KSBjb25zdCB7IHJldHVybiBzY29wZWQ8VCwgc2NvcGVkX2RlbGV0ZV9hcnJheV9mb3J3YXJkPjo6cF9baWR4XTsgfQotfTsKLQotLyogc2NvcGVkX3B0ciB1c2luZyBkZWxldGUuICBJZiBvbmx5IHRoZXJlIHdlcmUgYSB0ZW1wbGF0ZSB0eXBlZGVmLiAqLwotc3RydWN0IHNjb3BlZF9kZWxldGVfZm9yd2FyZCB7Ci0gIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgdm9pZCBDbG9zZShUICpwKSB7IGRlbGV0ZSBwOyB9Ci19OwotdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIHNjb3BlZF9wdHIgOiBwdWJsaWMgc2NvcGVkPFQsIHNjb3BlZF9kZWxldGVfZm9yd2FyZD4gewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgc2NvcGVkX3B0cihUICpwID0gTlVMTCkgOiBzY29wZWQ8VCwgc2NvcGVkX2RlbGV0ZV9mb3J3YXJkPihwKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgdXRpbAotCi0jZW5kaWYgLy8gVVRJTF9TQ09QRURfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc2l6ZWRfaXRlcmF0b3IuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zaXplZF9pdGVyYXRvci5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmNjg4Ni4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zaXplZF9pdGVyYXRvci5oaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0jaWZuZGVmIFVUSUxfU0laRURfSVRFUkFUT1JfSAotI2RlZmluZSBVVElMX1NJWkVEX0lURVJBVE9SX0gKLQotI2luY2x1ZGUgInV0aWwvcHJveHlfaXRlcmF0b3IuaGgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotbmFtZXNwYWNlIHV0aWwgewotCi1jbGFzcyBTaXplZElubmVySXRlcmF0b3IgewotICBwdWJsaWM6Ci0gICAgU2l6ZWRJbm5lckl0ZXJhdG9yKCkge30KLQotICAgIFNpemVkSW5uZXJJdGVyYXRvcih2b2lkICpwdHIsIHN0ZDo6c2l6ZV90IHNpemUpIDogcHRyXyhzdGF0aWNfY2FzdDx1aW50OF90Kj4ocHRyKSksIHNpemVfKHNpemUpIHt9Ci0KLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2l6ZWRJbm5lckl0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICAgICAgcmV0dXJuIHB0cl8gPT0gb3RoZXIucHRyXzsKLSAgICB9Ci0gICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU2l6ZWRJbm5lckl0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICAgICAgcmV0dXJuIHB0cl8gPCBvdGhlci5wdHJfOwotICAgIH0KLSAgICBTaXplZElubmVySXRlcmF0b3IgJm9wZXJhdG9yKz0oc3RkOjpwdHJkaWZmX3QgYW1vdW50KSB7Ci0gICAgICBwdHJfICs9IGFtb3VudCAqIHNpemVfOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBzdGQ6OnB0cmRpZmZfdCBvcGVyYXRvci0oY29uc3QgU2l6ZWRJbm5lckl0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICAgICAgcmV0dXJuIChwdHJfIC0gb3RoZXIucHRyXykgLyBzaXplXzsKLSAgICB9Ci0KLSAgICBjb25zdCB2b2lkICpEYXRhKCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQotICAgIHZvaWQgKkRhdGEoKSB7IHJldHVybiBwdHJfOyB9Ci0gICAgc3RkOjpzaXplX3QgRW50cnlTaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KLQotICAgIGZyaWVuZCB2b2lkIHN3YXAoU2l6ZWRJbm5lckl0ZXJhdG9yICZmaXJzdCwgU2l6ZWRJbm5lckl0ZXJhdG9yICZzZWNvbmQpIHsKLSAgICAgIHN0ZDo6c3dhcChmaXJzdC5wdHJfLCBzZWNvbmQucHRyXyk7Ci0gICAgICBzdGQ6OnN3YXAoZmlyc3Quc2l6ZV8sIHNlY29uZC5zaXplXyk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgdWludDhfdCAqcHRyXzsKLSAgICBzdGQ6OnNpemVfdCBzaXplXzsKLX07Ci0KLWNsYXNzIFNpemVkUHJveHkgewotICBwdWJsaWM6Ci0gICAgU2l6ZWRQcm94eSgpIHt9Ci0KLSAgICBTaXplZFByb3h5KHZvaWQgKnB0ciwgc3RkOjpzaXplX3Qgc2l6ZSkgOiBpbm5lcl8ocHRyLCBzaXplKSB7fQotCi0gICAgb3BlcmF0b3Igc3RkOjpzdHJpbmcoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oaW5uZXJfLkRhdGEoKSksIGlubmVyXy5FbnRyeVNpemUoKSk7Ci0gICAgfQotCi0gICAgU2l6ZWRQcm94eSAmb3BlcmF0b3I9KGNvbnN0IFNpemVkUHJveHkgJmZyb20pIHsKLSAgICAgIG1lbWNweShpbm5lcl8uRGF0YSgpLCBmcm9tLmlubmVyXy5EYXRhKCksIGlubmVyXy5FbnRyeVNpemUoKSk7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgU2l6ZWRQcm94eSAmb3BlcmF0b3I9KGNvbnN0IHN0ZDo6c3RyaW5nICZmcm9tKSB7Ci0gICAgICBtZW1jcHkoaW5uZXJfLkRhdGEoKSwgZnJvbS5kYXRhKCksIGlubmVyXy5FbnRyeVNpemUoKSk7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgY29uc3Qgdm9pZCAqRGF0YSgpIGNvbnN0IHsgcmV0dXJuIGlubmVyXy5EYXRhKCk7IH0KLSAgICB2b2lkICpEYXRhKCkgeyByZXR1cm4gaW5uZXJfLkRhdGEoKTsgfQotCi0gICAgZnJpZW5kIHZvaWQgc3dhcChTaXplZFByb3h5IGZpcnN0LCBTaXplZFByb3h5IHNlY29uZCkgewotICAgICAgc3RkOjpzd2FwX3JhbmdlcygKLSAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4oZmlyc3QuaW5uZXJfLkRhdGEoKSksCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KGZpcnN0LmlubmVyXy5EYXRhKCkpICsgZmlyc3QuaW5uZXJfLkVudHJ5U2l6ZSgpLAotICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihzZWNvbmQuaW5uZXJfLkRhdGEoKSkpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyB1dGlsOjpQcm94eUl0ZXJhdG9yPFNpemVkUHJveHk+OwotCi0gICAgdHlwZWRlZiBzdGQ6OnN0cmluZyB2YWx1ZV90eXBlOwotCi0gICAgdHlwZWRlZiBTaXplZElubmVySXRlcmF0b3IgSW5uZXJJdGVyYXRvcjsKLQotICAgIElubmVySXRlcmF0b3IgJklubmVyKCkgeyByZXR1cm4gaW5uZXJfOyB9Ci0gICAgY29uc3QgSW5uZXJJdGVyYXRvciAmSW5uZXIoKSBjb25zdCB7IHJldHVybiBpbm5lcl87IH0KLSAgICBJbm5lckl0ZXJhdG9yIGlubmVyXzsKLX07Ci0KLXR5cGVkZWYgUHJveHlJdGVyYXRvcjxTaXplZFByb3h5PiBTaXplZEl0ZXJhdG9yOwotCi1pbmxpbmUgU2l6ZWRJdGVyYXRvciBTaXplZEl0KHZvaWQgKnB0ciwgc3RkOjpzaXplX3Qgc2l6ZSkgeyByZXR1cm4gU2l6ZWRJdGVyYXRvcihTaXplZFByb3h5KHB0ciwgc2l6ZSkpOyB9Ci0KLS8vIFVzZWZ1bCB3cmFwcGVyIGZvciBhIGNvbXBhcmlzb24gZnVuY3Rpb24gaS5lLiBzb3J0LgotdGVtcGxhdGUgPGNsYXNzIERlbGVnYXRlLCBjbGFzcyBQcm94eSA9IFNpemVkUHJveHk+IGNsYXNzIFNpemVkQ29tcGFyZSA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxjb25zdCBQcm94eSAmLCBjb25zdCBQcm94eSAmLCBib29sPiB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBTaXplZENvbXBhcmUoY29uc3QgRGVsZWdhdGUgJmRlbGVnYXRlID0gRGVsZWdhdGUoKSkgOiBkZWxlZ2F0ZV8oZGVsZWdhdGUpIHt9Ci0KLSAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgUHJveHkgJmZpcnN0LCBjb25zdCBQcm94eSAmc2Vjb25kKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGVfKGZpcnN0LkRhdGEoKSwgc2Vjb25kLkRhdGEoKSk7Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBQcm94eSAmZmlyc3QsIGNvbnN0IHN0ZDo6c3RyaW5nICZzZWNvbmQpIGNvbnN0IHsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZV8oZmlyc3QuRGF0YSgpLCBzZWNvbmQuZGF0YSgpKTsKLSAgICB9Ci0gICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nICZmaXJzdCwgY29uc3QgUHJveHkgJnNlY29uZCkgY29uc3QgewotICAgICAgcmV0dXJuIGRlbGVnYXRlXyhmaXJzdC5kYXRhKCksIHNlY29uZC5EYXRhKCkpOwotICAgIH0KLSAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcgJmZpcnN0LCBjb25zdCBzdGQ6OnN0cmluZyAmc2Vjb25kKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGVfKGZpcnN0LmRhdGEoKSwgc2Vjb25kLmRhdGEoKSk7Ci0gICAgfQotCi0gICAgY29uc3QgRGVsZWdhdGUgJkdldERlbGVnYXRlKCkgY29uc3QgeyByZXR1cm4gZGVsZWdhdGVfOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBEZWxlZ2F0ZSBkZWxlZ2F0ZV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSB1dGlsCi0jZW5kaWYgLy8gVVRJTF9TSVpFRF9JVEVSQVRPUl9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zb3J0ZWRfdW5pZm9ybS5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3NvcnRlZF91bmlmb3JtLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Y2ZDAyLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3NvcnRlZF91bmlmb3JtLmhoCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLSNpZm5kZWYgVVRJTF9TT1JURURfVU5JRk9STV9ICi0jZGVmaW5lIFVUSUxfU09SVEVEX1VOSUZPUk1fSAotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIHV0aWwgewotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgSWRlbnRpdHlBY2Nlc3NvciB7Ci0gIHB1YmxpYzoKLSAgICB0eXBlZGVmIFQgS2V5OwotICAgIFQgb3BlcmF0b3IoKShjb25zdCBUICppbikgY29uc3QgeyByZXR1cm4gKmluOyB9Ci19OwotCi1zdHJ1Y3QgUGl2b3Q2NCB7Ci0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzaXplX3QgQ2FsYyh1aW50NjRfdCBvZmYsIHVpbnQ2NF90IHJhbmdlLCBzdGQ6OnNpemVfdCB3aWR0aCkgewotICAgIHN0ZDo6c2l6ZV90IHJldCA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzdGF0aWNfY2FzdDxmbG9hdD4ob2ZmKSAvIHN0YXRpY19jYXN0PGZsb2F0PihyYW5nZSkgKiBzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgpKTsKLSAgICAvLyBDYXAgZm9yIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nCi0gICAgcmV0dXJuIChyZXQgPCB3aWR0aCkgPyByZXQgOiB3aWR0aCAtIDE7Ci0gIH0KLX07Ci0KLS8vIFVzZSB3aGVuIG9mZiAqIHdpZHRoIGlzIDwyXjY0LiAgVGhpcyBpcyBndWFyYW50ZWVkIHdoZW4gZWFjaCBvZiB0aGVtIGlzIGFjdHVhbGx5IGEgMzItYml0IHZhbHVlLiAgIAotc3RydWN0IFBpdm90MzIgewotICBzdGF0aWMgaW5saW5lIHN0ZDo6c2l6ZV90IENhbGModWludDY0X3Qgb2ZmLCB1aW50NjRfdCByYW5nZSwgdWludDY0X3Qgd2lkdGgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KChvZmYgKiB3aWR0aCkgLyAocmFuZ2UgKyAxKSk7Ci0gIH0KLX07Ci0KLS8vIFVzYWdlOiBQaXZvdFNlbGVjdDxzaXplb2YoRGF0YVR5cGUpPjo6VAotdGVtcGxhdGUgPHVuc2lnbmVkPiBzdHJ1Y3QgUGl2b3RTZWxlY3Q7Ci10ZW1wbGF0ZSA8PiBzdHJ1Y3QgUGl2b3RTZWxlY3Q8OD4geyB0eXBlZGVmIFBpdm90NjQgVDsgfTsKLXRlbXBsYXRlIDw+IHN0cnVjdCBQaXZvdFNlbGVjdDw0PiB7IHR5cGVkZWYgUGl2b3QzMiBUOyB9OwotdGVtcGxhdGUgPD4gc3RydWN0IFBpdm90U2VsZWN0PDI+IHsgdHlwZWRlZiBQaXZvdDMyIFQ7IH07Ci0KLS8qIEJpbmFyeSBzZWFyY2guICovCi10ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IsIGNsYXNzIEFjY2Vzc29yPiBib29sIEJpbmFyeUZpbmQoCi0gICAgY29uc3QgQWNjZXNzb3IgJmFjY2Vzc29yLAotICAgIEl0ZXJhdG9yIGJlZ2luLAotICAgIEl0ZXJhdG9yIGVuZCwKLSAgICBjb25zdCB0eXBlbmFtZSBBY2Nlc3Nvcjo6S2V5IGtleSwgSXRlcmF0b3IgJm91dCkgewotICB3aGlsZSAoZW5kID4gYmVnaW4pIHsKLSAgICBJdGVyYXRvciBwaXZvdChiZWdpbiArIChlbmQgLSBiZWdpbikgLyAyKTsKLSAgICB0eXBlbmFtZSBBY2Nlc3Nvcjo6S2V5IG1pZChhY2Nlc3NvcihwaXZvdCkpOwotICAgIGlmIChtaWQgPCBrZXkpIHsKLSAgICAgIGJlZ2luID0gcGl2b3QgKyAxOwotICAgIH0gZWxzZSBpZiAobWlkID4ga2V5KSB7Ci0gICAgICBlbmQgPSBwaXZvdDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0ID0gcGl2b3Q7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBTZWFyY2ggdGhlIHJhbmdlIFtiZWZvcmVfaXQgKyAxLCBhZnRlcl9pdCAtIDFdIGZvciBrZXkuICAKLS8vIFByZWNvbmRpdGlvbnM6Ci0vLyBiZWZvcmVfdiA8PSBrZXkgPD0gYWZ0ZXJfdgotLy8gYmVmb3JlX3YgPD0gYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UgW2JlZm9yZV9pdCArIDEsIGFmdGVyX2l0IC0gMV0gPD0gYWZ0ZXJfdgotLy8gcmFuZ2UgaXMgc29ydGVkLgotdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yLCBjbGFzcyBBY2Nlc3NvciwgY2xhc3MgUGl2b3Q+IGJvb2wgQm91bmRlZFNvcnRlZFVuaWZvcm1GaW5kKAotICAgIGNvbnN0IEFjY2Vzc29yICZhY2Nlc3NvciwKLSAgICBJdGVyYXRvciBiZWZvcmVfaXQsIHR5cGVuYW1lIEFjY2Vzc29yOjpLZXkgYmVmb3JlX3YsCi0gICAgSXRlcmF0b3IgYWZ0ZXJfaXQsIHR5cGVuYW1lIEFjY2Vzc29yOjpLZXkgYWZ0ZXJfdiwKLSAgICBjb25zdCB0eXBlbmFtZSBBY2Nlc3Nvcjo6S2V5IGtleSwgSXRlcmF0b3IgJm91dCkgewotICB3aGlsZSAoYWZ0ZXJfaXQgLSBiZWZvcmVfaXQgPiAxKSB7Ci0gICAgSXRlcmF0b3IgcGl2b3QoYmVmb3JlX2l0ICsgKDEgKyBQaXZvdDo6Q2FsYyhrZXkgLSBiZWZvcmVfdiwgYWZ0ZXJfdiAtIGJlZm9yZV92LCBhZnRlcl9pdCAtIGJlZm9yZV9pdCAtIDEpKSk7Ci0gICAgdHlwZW5hbWUgQWNjZXNzb3I6OktleSBtaWQoYWNjZXNzb3IocGl2b3QpKTsKLSAgICBpZiAobWlkIDwga2V5KSB7Ci0gICAgICBiZWZvcmVfaXQgPSBwaXZvdDsKLSAgICAgIGJlZm9yZV92ID0gbWlkOwotICAgIH0gZWxzZSBpZiAobWlkID4ga2V5KSB7Ci0gICAgICBhZnRlcl9pdCA9IHBpdm90OwotICAgICAgYWZ0ZXJfdiA9IG1pZDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0ID0gcGl2b3Q7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IsIGNsYXNzIEFjY2Vzc29yLCBjbGFzcyBQaXZvdD4gYm9vbCBTb3J0ZWRVbmlmb3JtRmluZChjb25zdCBBY2Nlc3NvciAmYWNjZXNzb3IsIEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQsIGNvbnN0IHR5cGVuYW1lIEFjY2Vzc29yOjpLZXkga2V5LCBJdGVyYXRvciAmb3V0KSB7Ci0gIGlmIChiZWdpbiA9PSBlbmQpIHJldHVybiBmYWxzZTsKLSAgdHlwZW5hbWUgQWNjZXNzb3I6OktleSBiZWxvdyhhY2Nlc3NvcihiZWdpbikpOwotICBpZiAoa2V5IDw9IGJlbG93KSB7Ci0gICAgaWYgKGtleSA9PSBiZWxvdykgeyBvdXQgPSBiZWdpbjsgcmV0dXJuIHRydWU7IH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTWFrZSB0aGUgcmFuZ2UgW2JlZ2luLCBlbmRdLiAgCi0gIC0tZW5kOwotICB0eXBlbmFtZSBBY2Nlc3Nvcjo6S2V5IGFib3ZlKGFjY2Vzc29yKGVuZCkpOwotICBpZiAoa2V5ID49IGFib3ZlKSB7Ci0gICAgaWYgKGtleSA9PSBhYm92ZSkgeyBvdXQgPSBlbmQ7IHJldHVybiB0cnVlOyB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBCb3VuZGVkU29ydGVkVW5pZm9ybUZpbmQ8SXRlcmF0b3IsIEFjY2Vzc29yLCBQaXZvdD4oYWNjZXNzb3IsIGJlZ2luLCBiZWxvdywgZW5kLCBhYm92ZSwga2V5LCBvdXQpOwotfQotCi19IC8vIG5hbWVzcGFjZSB1dGlsCi0KLSNlbmRpZiAvLyBVVElMX1NPUlRFRF9VTklGT1JNX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3NvcnRlZF91bmlmb3JtX3Rlc3QuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zb3J0ZWRfdW5pZm9ybV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY2ZmFkLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3NvcnRlZF91bmlmb3JtX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotI2luY2x1ZGUgInV0aWwvc29ydGVkX3VuaWZvcm0uaGgiCi0KLSNpbmNsdWRlIDxib29zdC9yYW5kb20vbWVyc2VubmVfdHdpc3Rlci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvcmFuZG9tL3VuaWZvcm1faW50LmhwcD4KLSNpbmNsdWRlIDxib29zdC9yYW5kb20vdmFyaWF0ZV9nZW5lcmF0b3IuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9hcnJheS5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdW5vcmRlcmVkX21hcC5ocHA+Ci0KLSNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgU29ydGVkVW5pZm9ybVRlc3QKLSNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIHV0aWwgewotbmFtZXNwYWNlIHsKLQotdGVtcGxhdGUgPGNsYXNzIEtleVQsIGNsYXNzIFZhbHVlVD4gc3RydWN0IEVudHJ5IHsKLSAgdHlwZWRlZiBLZXlUIEtleTsKLSAgdHlwZWRlZiBWYWx1ZVQgVmFsdWU7Ci0KLSAgS2V5IGtleTsKLSAgVmFsdWUgdmFsdWU7Ci0KLSAgS2V5IEdldEtleSgpIGNvbnN0IHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0KLSAgVmFsdWUgR2V0VmFsdWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRW50cnk8S2V5LFZhbHVlPiAmb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4ga2V5IDwgb3RoZXIua2V5OwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgS2V5VD4gc3RydWN0IEFjY2Vzc29yIHsKLSAgdHlwZWRlZiBLZXlUIEtleTsKLSAgdGVtcGxhdGUgPGNsYXNzIFZhbHVlPiBLZXkgb3BlcmF0b3IoKShjb25zdCBFbnRyeTxLZXksIFZhbHVlPiAqZW50cnkpIGNvbnN0IHsKLSAgICByZXR1cm4gZW50cnktPkdldEtleSgpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBWYWx1ZT4gdm9pZCBDaGVjayhjb25zdCBFbnRyeTxLZXksIFZhbHVlPiAqYmVnaW4sIGNvbnN0IEVudHJ5PEtleSwgVmFsdWU+ICplbmQsIGNvbnN0IGJvb3N0Ojp1bm9yZGVyZWRfbWFwPEtleSwgVmFsdWU+ICZyZWZlcmVuY2UsIGNvbnN0IEtleSBrZXkpIHsKLSAgdHlwZW5hbWUgYm9vc3Q6OnVub3JkZXJlZF9tYXA8S2V5LCBWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIHJlZiA9IHJlZmVyZW5jZS5maW5kKGtleSk7Ci0gIHR5cGVkZWYgY29uc3QgRW50cnk8S2V5LCBWYWx1ZT4gKkl0OwotICAvLyBnKysgY2FuJ3QgdGVsbCB0aGF0IHJlcXVpcmUgd2lsbCBjcmFzaCBhbmQgYnVybi4KLSAgSXQgaSA9IE5VTEw7Ci0gIGJvb2wgcmV0ID0gU29ydGVkVW5pZm9ybUZpbmQ8SXQsIEFjY2Vzc29yPEtleT4sIFBpdm90NjQ+KEFjY2Vzc29yPEtleT4oKSwgYmVnaW4sIGVuZCwga2V5LCBpKTsKLSAgaWYgKHJlZiA9PSByZWZlcmVuY2UuZW5kKCkpIHsKLSAgICBCT09TVF9DSEVDSyghcmV0KTsKLSAgfSBlbHNlIHsKLSAgICBCT09TVF9SRVFVSVJFKHJldCk7Ci0gICAgQk9PU1RfQ0hFQ0tfRVFVQUwocmVmLT5zZWNvbmQsIGktPkdldFZhbHVlKCkpOwotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKGVtcHR5KSB7Ci0gIHR5cGVkZWYgY29uc3QgRW50cnk8dWludDY0X3QsIGZsb2F0PiBUOwotICBjb25zdCBUICppOwotICBib29sIHJldCA9IFNvcnRlZFVuaWZvcm1GaW5kPGNvbnN0IFQqLCBBY2Nlc3Nvcjx1aW50NjRfdD4sIFBpdm90NjQ+KEFjY2Vzc29yPHVpbnQ2NF90PigpLCAoY29uc3QgVCopTlVMTCwgKGNvbnN0IFQqKU5VTEwsICh1aW50NjRfdCkxMCwgaSk7Ci0gIEJPT1NUX0NIRUNLKCFyZXQpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgS2V5PiB2b2lkIFJhbmRvbVRlc3QoS2V5IHVwcGVyLCBzaXplX3QgZW50cmllcywgc2l6ZV90IHF1ZXJpZXMpIHsKLSAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFZhbHVlOwotICBib29zdDo6bXQxOTkzNyBybmc7Ci0gIGJvb3N0Ojp1bmlmb3JtX2ludDxLZXk+IHJhbmdlX2tleSgwLCB1cHBlcik7Ci0gIGJvb3N0Ojp1bmlmb3JtX2ludDxWYWx1ZT4gcmFuZ2VfdmFsdWUoMCwgMjU1KTsKLSAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPGJvb3N0OjptdDE5OTM3JiwgYm9vc3Q6OnVuaWZvcm1faW50PEtleT4gPiBnZW5fa2V5KHJuZywgcmFuZ2Vfa2V5KTsKLSAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPGJvb3N0OjptdDE5OTM3JiwgYm9vc3Q6OnVuaWZvcm1faW50PHVuc2lnbmVkIGNoYXI+ID4gZ2VuX3ZhbHVlKHJuZywgcmFuZ2VfdmFsdWUpOwotCi0gIHR5cGVkZWYgRW50cnk8S2V5LCBWYWx1ZT4gRW50OwotICBzdGQ6OnZlY3RvcjxFbnQ+IGJhY2tpbmc7Ci0gIGJvb3N0Ojp1bm9yZGVyZWRfbWFwPEtleSwgdW5zaWduZWQgY2hhcj4gcmVmZXJlbmNlOwotICBFbnQgZW50OwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJpZXM7ICsraSkgewotICAgIEtleSBrZXkgPSBnZW5fa2V5KCk7Ci0gICAgdW5zaWduZWQgY2hhciB2YWx1ZSA9IGdlbl92YWx1ZSgpOwotICAgIGlmIChyZWZlcmVuY2UuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWUpKS5zZWNvbmQpIHsKLSAgICAgIGVudC5rZXkgPSBrZXk7Ci0gICAgICBlbnQudmFsdWUgPSB2YWx1ZTsKLSAgICAgIGJhY2tpbmcucHVzaF9iYWNrKGVudCk7Ci0gICAgfQotICB9Ci0gIHN0ZDo6c29ydChiYWNraW5nLmJlZ2luKCksIGJhY2tpbmcuZW5kKCkpOwotCi0gIC8vIFJhbmRvbSBxdWVyaWVzLiAgCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcXVlcmllczsgKytpKSB7Ci0gICAgY29uc3QgS2V5IGtleSA9IGdlbl9rZXkoKTsKLSAgICBDaGVjazxLZXksIHVuc2lnbmVkIGNoYXI+KCYqYmFja2luZy5iZWdpbigpLCAmKmJhY2tpbmcuZW5kKCksIHJlZmVyZW5jZSwga2V5KTsKLSAgfQotCi0gIHR5cGVuYW1lIGJvb3N0Ojp1bm9yZGVyZWRfbWFwPEtleSwgdW5zaWduZWQgY2hhcj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlLmJlZ2luKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyAoaSA8IHF1ZXJpZXMpICYmIChpdCAhPSByZWZlcmVuY2UuZW5kKCkpOyArK2ksICsraXQpIHsKLSAgICBDaGVjazxLZXksIHVuc2lnbmVkIGNoYXI+KCYqYmFja2luZy5iZWdpbigpLCAmKmJhY2tpbmcuZW5kKCksIHJlZmVyZW5jZSwgaXQtPnNlY29uZCk7Ci0gIH0KLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoYmFzaWMpIHsKLSAgUmFuZG9tVGVzdDx1aW50OF90PigxMSwgMTAsIDIwMCk7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKHRpbnlfZGVuc2VfcmFuZG9tKSB7Ci0gIFJhbmRvbVRlc3Q8dWludDhfdD4oMTEsIDUwLCAyMDApOwotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRShzbWFsbF9kZW5zZV9yYW5kb20pIHsKLSAgUmFuZG9tVGVzdDx1aW50OF90PigxMDAsIDEwMCwgMjAwKTsKLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0Uoc21hbGxfc3BhcnNlX3JhbmRvbSkgewotICBSYW5kb21UZXN0PHVpbnQ4X3Q+KDIwMCwgMTUsIDIwMCk7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKG1lZGl1bV9zcGFyc2VfcmFuZG9tKSB7Ci0gIFJhbmRvbVRlc3Q8dWludDE2X3Q+KDMyMDAwLCAxMDAwLCAyMDAwKTsKLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0Uoc3BhcnNlX3JhbmRvbSkgewotICBSYW5kb21UZXN0PHVpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCksIDEwMDAwMCwgMjAwMCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlCi19IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vSmFtZmlsZSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTk5OTc5Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI2lmICQoQk9PU1QtVkVSU0lPTikgPj0gMTA0ODAwIHsKLSMgICAgdGltZXItbGluayA9IDxsaWJyYXJ5Pi90b3AvL2Jvb3N0X3RpbWVyIDsKLSN9IGVsc2UgewotIyAgIHRpbWVyLWxpbmsgPSA7Ci0jfQotCi1mYWtlbGliIHN0cmVhbSA6IGNoYWluLmNjIGlvLmNjIGxpbmVfaW5wdXQuY2MgbXVsdGlfcHJvZ3Jlc3MuY2MgLi4vL2tlbnV0aWwgL3RvcC8vYm9vc3RfdGhyZWFkIDogOiA6IDxsaWJyYXJ5Pi90b3AvL2Jvb3N0X3RocmVhZCA7Ci0KLWltcG9ydCB0ZXN0aW5nIDsKLXVuaXQtdGVzdCBpb190ZXN0IDogaW9fdGVzdC5jYyBzdHJlYW0gL3RvcC8vYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yayA7Ci11bml0LXRlc3Qgc3RyZWFtX3Rlc3QgOiBzdHJlYW1fdGVzdC5jYyBzdHJlYW0gL3RvcC8vYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yayA7Ci11bml0LXRlc3Qgc29ydF90ZXN0IDogc29ydF90ZXN0LmNjIHN0cmVhbSAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIDsKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9ibG9jay5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9ibG9jay5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3ZTI4Yi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vYmxvY2suaGgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0jaWZuZGVmIFVUSUxfU1RSRUFNX0JMT0NLX0gKLSNkZWZpbmUgVVRJTF9TVFJFQU1fQkxPQ0tfSAotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIHV0aWwgewotbmFtZXNwYWNlIHN0cmVhbSB7Ci0KLS8qKgotICogRW5jYXBzdWxhdGVzIGEgYmxvY2sgb2YgbWVtb3J5LgotICovCi1jbGFzcyBCbG9jayB7Ci0gIHB1YmxpYzoKLSAgCi0gICAgLyoqIAotICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgYmxvY2suIAotICAgICAqLwotICAgIEJsb2NrKCkgOiBtZW1fKE5VTEwpLCB2YWxpZF9zaXplXygwKSB7fQotCi0gICAgLyoqIAotICAgICAqIENvbnN0cnVjdHMgYSBibG9jayB0aGF0IGVuY2Fwc3VsYXRlcyBhIHNlZ21lbnQgb2YgbWVtb3J5LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBtZW0gIFRoZSBzZWdtZW50IG9mIG1lbW9yeSB0byBlbmNhcHN1bGF0ZQotICAgICAqIEBwYXJhbVtpbl0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgbWVtb3J5IHNlZ21lbnQgaW4gYnl0ZXMKLSAgICAgKi8KLSAgICBCbG9jayh2b2lkICptZW0sIHN0ZDo6c2l6ZV90IHNpemUpIDogbWVtXyhtZW0pLCB2YWxpZF9zaXplXyhzaXplKSB7fQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBibG9jayB0aGF0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyB2YWxpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gdG8gTnVtYmVyIG9mIGJ5dGVzCi0gICAgICovCi0gICAgdm9pZCBTZXRWYWxpZFNpemUoc3RkOjpzaXplX3QgdG8pIHsgdmFsaWRfc2l6ZV8gPSB0bzsgfQotCi0gICAgLyoqIAotICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGlzIGJsb2NrIHRoYXQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIHZhbGlkLgotICAgICAqIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgcmVhZCBtaWdodCBmaWxsIGluIGxlc3MgdGhhbiBBbGxvY2F0ZWQgYXQgRU9GLiAKLSAgICAgKi8KLSAgICBzdGQ6OnNpemVfdCBWYWxpZFNpemUoKSBjb25zdCB7IHJldHVybiB2YWxpZF9zaXplXzsgfQotCi0gICAgLyoqIEdldHMgYSB2b2lkIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSB1bmRlcmx5aW5nIHRoaXMgYmxvY2suICovCi0gICAgdm9pZCAqR2V0KCkgeyByZXR1cm4gbWVtXzsgfQotCi0gICAgLyoqIEdldHMgYSBjb25zdCB2b2lkIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSB1bmRlcmx5aW5nIHRoaXMgYmxvY2suICovCi0gICAgY29uc3Qgdm9pZCAqR2V0KCkgY29uc3QgeyByZXR1cm4gbWVtXzsgfQotCi0gIAotICAgIC8qKgotICAgICAqIEdldHMgYSBjb25zdCB2b2lkIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgdmFsaWQgc2VjdGlvbiBvZiBtZW1vcnkKLSAgICAgKiBlbmNhcHN1bGF0ZWQgYnkgdGhpcyBibG9jay4KLSAgICAgKi8KLSAgICBjb25zdCB2b2lkICpWYWxpZEVuZCgpIGNvbnN0IHsgCi0gICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4obWVtXykgKyB2YWxpZF9zaXplXzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBibG9jayBlbmNhcHN1bGF0ZXMgYSB2YWxpZCAobm9uLU5VTEwpIGJsb2NrIG9mIG1lbW9yeS4KLSAgICAgKiAKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBhIHVzZXItZGVmaW5lZCBpbXBsaWNpdCBjb252ZXJzaW9uIGZ1bmN0aW9uIHRvIGJvb2xlYW47Ci0gICAgICogYW1vbmcgb3RoZXIgdGhpbmdzLCB0aGlzIG1ldGhvZCBlbmFibGVzIGJhcmUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgCi0gICAgICogdG8gYmUgdXNlZCBhcyB0aGUgY29uZGl0aW9uIG9mIGFuIGlmIHN0YXRlbWVudC4KLSAgICAgKi8KLSAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbWVtXyAhPSBOVUxMOyB9Ci0gIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJsb2NrIGlzIGVtcHR5LgotICAgICAqIAotICAgICAqIEluIG90aGVyIHdvcmRzLCBpZiBHZXQoKT09TlVMTCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZS4KLSAgICAgKi8KLSAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuIG1lbV8gPT0gTlVMTDsgfQotIAotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBMaW5rOwotICAKLSAgICAvKioKLSAgICAgKiBQb2ludHMgdGhpcyBibG9jaydzIG1lbW9yeSBhdCBOVUxMLgotICAgICAqCi0gICAgICogVGhpcyBjbGFzcyBkZWZpbmVzIHBvaXNvbiBhcyBhIGJsb2NrIHdob3NlIG1lbW9yeSBwb2ludGVyIGlzIE5VTEwuCi0gICAgICovCi0gICAgdm9pZCBTZXRUb1BvaXNvbigpIHsKLSAgICAgIG1lbV8gPSBOVUxMOwotICAgIH0KLQotICAgIHZvaWQgKm1lbV87Ci0gICAgc3RkOjpzaXplX3QgdmFsaWRfc2l6ZV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBzdHJlYW0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKLQotI2VuZGlmIC8vIFVUSUxfU1RSRUFNX0JMT0NLX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9jaGFpbi5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9jaGFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyOWU0Mi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vY2hhaW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NoYWluLmhoIgotCi0jaW5jbHVkZSAidXRpbC9zdHJlYW0vaW8uaGgiCi0KLSNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKLSNpbmNsdWRlICJ1dGlsL3BjcXVldWUuaGgiCi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPG5ldz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1uYW1lc3BhY2UgdXRpbCB7Ci1uYW1lc3BhY2Ugc3RyZWFtIHsKLQotQ2hhaW5Db25maWdFeGNlcHRpb246OkNoYWluQ29uZmlnRXhjZXB0aW9uKCkgdGhyb3coKSB7ICp0aGlzIDw8ICJDaGFpbiBjb25maWd1cmVkIHdpdGggIjsgfQotQ2hhaW5Db25maWdFeGNlcHRpb246On5DaGFpbkNvbmZpZ0V4Y2VwdGlvbigpIHRocm93KCkge30KLQotVGhyZWFkOjp+VGhyZWFkKCkgewotICB0aHJlYWRfLmpvaW4oKTsKLX0KLQotdm9pZCBUaHJlYWQ6OlVuaGFuZGxlZEV4Y2VwdGlvbihjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmZSkgewotICBzdGQ6OmNlcnIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwotICBhYm9ydCgpOwotfQotCi12b2lkIFJlY3ljbGVyOjpSdW4oY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKLSAgZm9yIChMaW5rIGwocG9zaXRpb24pOyBsOyArK2wpIHsKLSAgICBsLT5TZXRWYWxpZFNpemUocG9zaXRpb24uR2V0Q2hhaW4oKS5CbG9ja1NpemUoKSk7Ci0gIH0KLX0KLQotY29uc3QgUmVjeWNsZXIga1JlY3ljbGUgPSBSZWN5Y2xlcigpOwotCi1DaGFpbjo6Q2hhaW4oY29uc3QgQ2hhaW5Db25maWcgJmNvbmZpZykgOiBjb25maWdfKGNvbmZpZyksIGNvbXBsZXRlX2NhbGxlZF8oZmFsc2UpIHsKLSAgVVRJTF9USFJPV19JRighY29uZmlnLmVudHJ5X3NpemUsIENoYWluQ29uZmlnRXhjZXB0aW9uLCAiemVyby1zaXplIGVudHJpZXMuIik7Ci0gIFVUSUxfVEhST1dfSUYoIWNvbmZpZy5ibG9ja19jb3VudCwgQ2hhaW5Db25maWdFeGNlcHRpb24sICJibG9jayBjb3VudCB6ZXJvIik7Ci0gIFVUSUxfVEhST1dfSUYoY29uZmlnLnRvdGFsX21lbW9yeSA8IGNvbmZpZy5lbnRyeV9zaXplICogY29uZmlnLmJsb2NrX2NvdW50LCBDaGFpbkNvbmZpZ0V4Y2VwdGlvbiwgY29uZmlnLnRvdGFsX21lbW9yeSA8PCAiIHRvdGFsIG1lbW9yeSwgdG9vIHNtYWxsIGZvciAiIDw8IGNvbmZpZy5ibG9ja19jb3VudCA8PCAiIGJsb2NrcyBvZiBjb250YWluaW5nIGVudHJpZXMgb2Ygc2l6ZSAiIDw8IGNvbmZpZy5lbnRyeV9zaXplKTsKLSAgLy8gUm91bmQgZG93biBibG9jayBzaXplIHRvIGEgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZS4gICAKLSAgYmxvY2tfc2l6ZV8gPSBjb25maWcudG90YWxfbWVtb3J5IC8gKGNvbmZpZy5ibG9ja19jb3VudCAqIGNvbmZpZy5lbnRyeV9zaXplKSAqIGNvbmZpZy5lbnRyeV9zaXplOwotfQotCi1DaGFpbjo6fkNoYWluKCkgewotICBXYWl0KCk7Ci19Ci0KLUNoYWluUG9zaXRpb24gQ2hhaW46OkFkZCgpIHsKLSAgaWYgKCFSdW5uaW5nKCkpIFN0YXJ0KCk7Ci0gIFBDUXVldWU8QmxvY2s+ICZpbiA9IHF1ZXVlc18uYmFjaygpOwotICBxdWV1ZXNfLnB1c2hfYmFjayhuZXcgUENRdWV1ZTxCbG9jaz4oY29uZmlnXy5ibG9ja19jb3VudCkpOwotICByZXR1cm4gQ2hhaW5Qb3NpdGlvbihpbiwgcXVldWVzXy5iYWNrKCksIHRoaXMsIHByb2dyZXNzXyk7Ci19Ci0KLUNoYWluICZDaGFpbjo6b3BlcmF0b3I+Pihjb25zdCBXcml0ZUFuZFJlY3ljbGUgJndyaXRlcikgewotICB0aHJlYWRzXy5wdXNoX2JhY2sobmV3IFRocmVhZChDb21wbGV0ZSgpLCB3cml0ZXIpKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1DaGFpbiAmQ2hhaW46Om9wZXJhdG9yPj4oY29uc3QgUFdyaXRlQW5kUmVjeWNsZSAmd3JpdGVyKSB7Ci0gIHRocmVhZHNfLnB1c2hfYmFjayhuZXcgVGhyZWFkKENvbXBsZXRlKCksIHdyaXRlcikpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXZvaWQgQ2hhaW46OldhaXQoYm9vbCByZWxlYXNlX21lbW9yeSkgewotICBpZiAocXVldWVzXy5lbXB0eSgpKSB7Ci0gICAgYXNzZXJ0KHRocmVhZHNfLmVtcHR5KCkpOwotICAgIHJldHVybjsgLy8gTm90aGluZyB0byB3YWl0IGZvci4gIAotICB9Ci0gIGlmICghY29tcGxldGVfY2FsbGVkXykgQ29tcGxldGVMb29wKCk7Ci0gIHRocmVhZHNfLmNsZWFyKCk7Ci0gIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IHF1ZXVlc18uZnJvbnQoKS5Db25zdW1lKCk7ICsraSkgewotICAgIGlmIChpID09IGNvbmZpZ18uYmxvY2tfY291bnQpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCAiQ2hhaW4gZW5kaW5nIHdpdGhvdXQgcG9pc29uLiIgPDwgc3RkOjplbmRsOwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0gIH0KLSAgcXVldWVzXy5jbGVhcigpOwotICBwcm9ncmVzc18uRmluaXNoZWQoKTsKLSAgY29tcGxldGVfY2FsbGVkXyA9IGZhbHNlOwotICBpZiAocmVsZWFzZV9tZW1vcnkpIG1lbW9yeV8ucmVzZXQoKTsKLX0KLQotdm9pZCBDaGFpbjo6U3RhcnQoKSB7Ci0gIFdhaXQoZmFsc2UpOwotICBpZiAoIW1lbW9yeV8uZ2V0KCkpIHsKLSAgICAvLyBBbGxvY2F0ZSBtZW1vcnkuICAKLSAgICBhc3NlcnQodGhyZWFkc18uZW1wdHkoKSk7Ci0gICAgYXNzZXJ0KHF1ZXVlc18uZW1wdHkoKSk7Ci0gICAgc3RkOjpzaXplX3QgbWFsbG9jX3NpemUgPSBibG9ja19zaXplXyAqIGNvbmZpZ18uYmxvY2tfY291bnQ7Ci0gICAgbWVtb3J5Xy5yZXNldChNYWxsb2NPclRocm93KG1hbGxvY19zaXplKSk7Ci0gIH0KLSAgLy8gVGhpcyBxdWV1ZSBjYW4gYWNjb21vZGF0ZSBhbGwgYmxvY2tzLiAgICAKLSAgcXVldWVzXy5wdXNoX2JhY2sobmV3IFBDUXVldWU8QmxvY2s+KGNvbmZpZ18uYmxvY2tfY291bnQpKTsKLSAgLy8gUG9wdWxhdGUgdGhlIGxlYWQgcXVldWUgd2l0aCBibG9ja3MuICAKLSAgdWludDhfdCAqYmFzZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihtZW1vcnlfLmdldCgpKTsKLSAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGNvbmZpZ18uYmxvY2tfY291bnQ7ICsraSkgewotICAgIHF1ZXVlc18uZnJvbnQoKS5Qcm9kdWNlKEJsb2NrKGJhc2UsIGJsb2NrX3NpemVfKSk7Ci0gICAgYmFzZSArPSBibG9ja19zaXplXzsKLSAgfQotfQotCi1DaGFpblBvc2l0aW9uIENoYWluOjpDb21wbGV0ZSgpIHsKLSAgYXNzZXJ0KFJ1bm5pbmcoKSk7Ci0gIFVUSUxfVEhST1dfSUYoY29tcGxldGVfY2FsbGVkXywgdXRpbDo6RXhjZXB0aW9uLCAiQ29tcGxldGVMb29wKCkgY2FsbGVkIHR3aWNlIik7Ci0gIGNvbXBsZXRlX2NhbGxlZF8gPSB0cnVlOwotICByZXR1cm4gQ2hhaW5Qb3NpdGlvbihxdWV1ZXNfLmJhY2soKSwgcXVldWVzXy5mcm9udCgpLCB0aGlzLCBwcm9ncmVzc18pOwotfQotCi1MaW5rOjpMaW5rKCkgOiBpbl8oTlVMTCksIG91dF8oTlVMTCksIHBvaXNvbmVkXyh0cnVlKSB7fQotCi12b2lkIExpbms6OkluaXQoY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKLSAgVVRJTF9USFJPV19JRihpbl8sIHV0aWw6OkV4Y2VwdGlvbiwgIkxpbms6OkluaXQgdHdpY2UiKTsKLSAgaW5fID0gcG9zaXRpb24uaW5fOwotICBvdXRfID0gcG9zaXRpb24ub3V0XzsKLSAgcG9pc29uZWRfID0gZmFsc2U7Ci0gIHByb2dyZXNzXyA9IHBvc2l0aW9uLnByb2dyZXNzXzsKLSAgaW5fLT5Db25zdW1lKGN1cnJlbnRfKTsKLX0KLQotTGluazo6TGluayhjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgOiBpbl8oTlVMTCkgewotICBJbml0KHBvc2l0aW9uKTsKLX0KLQotTGluazo6fkxpbmsoKSB7Ci0gIGlmIChjdXJyZW50XykgewotICAgIC8vIFByb2JhYmx5IGFuIGV4Y2VwdGlvbiB1bndpbmRpbmcuICAKLSAgICBzdGQ6OmNlcnIgPDwgIkxhc3QgaW5wdXQgc2hvdWxkIGhhdmUgYmVlbiBwb2lzb24uIiA8PCBzdGQ6OmVuZGw7Ci0gICAgLy8gYWJvcnQoKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoIXBvaXNvbmVkXykgewotICAgICAgLy8gUG9pc29uIGlzIGEgYmxvY2sgd2hvc2UgbWVtb3J5IHBvaW50ZXIgaXMgTlVMTC4KLSAgICAgIC8vCi0gICAgICAvLyBCZWNhdXNlIHdlJ3JlIGluIHRoZSBlbHNlIGJsb2NrLAotICAgICAgLy8gICB3ZSBrbm93IHRoYXQgdGhlIG1lbW9yeSBwb2ludGVyIG9mIGN1cnJlbnRfIGlzIE5VTEwuCi0gICAgICAvLwotICAgICAgLy8gUGFzcyB0aGUgY3VycmVudCAocG9pc29uKSBibG9jayEKLSAgICAgIG91dF8tPlByb2R1Y2UoY3VycmVudF8pOwotICAgIH0KLSAgfQotfQotCi1MaW5rICZMaW5rOjpvcGVyYXRvcisrKCkgewotICBhc3NlcnQoY3VycmVudF8pOwotICBwcm9ncmVzc18gKz0gY3VycmVudF8uVmFsaWRTaXplKCk7Ci0gIG91dF8tPlByb2R1Y2UoY3VycmVudF8pOwotICBpbl8tPkNvbnN1bWUoY3VycmVudF8pOwotICBpZiAoIWN1cnJlbnRfKSB7Ci0gICAgcG9pc29uZWRfID0gdHJ1ZTsKLSAgICBvdXRfLT5Qcm9kdWNlKGN1cnJlbnRfKTsKLSAgfQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXZvaWQgTGluazo6UG9pc29uKCkgewotICBhc3NlcnQoIXBvaXNvbmVkXyk7Ci0gIGN1cnJlbnRfLlNldFRvUG9pc29uKCk7Ci0gIG91dF8tPlByb2R1Y2UoY3VycmVudF8pOwotICBwb2lzb25lZF8gPSB0cnVlOwotfQotCi19IC8vIG5hbWVzcGFjZSBzdHJlYW0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9jaGFpbi5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9jaGFpbi5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4NjUwOC4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vY2hhaW4uaGgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotI2lmbmRlZiBVVElMX1NUUkVBTV9DSEFJTl9ICi0jZGVmaW5lIFVUSUxfU1RSRUFNX0NIQUlOX0gKLQotI2luY2x1ZGUgInV0aWwvc3RyZWFtL2Jsb2NrLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NvbmZpZy5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9tdWx0aV9wcm9ncmVzcy5oaCIKLSNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKLQotI2luY2x1ZGUgPGJvb3N0L3B0cl9jb250YWluZXIvcHRyX3ZlY3Rvci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL3RocmVhZC5ocHA+Ci0KLSNpbmNsdWRlIDxjc3RkZGVmPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLXRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBQQ1F1ZXVlOwotbmFtZXNwYWNlIHN0cmVhbSB7Ci0KLWNsYXNzIENoYWluQ29uZmlnRXhjZXB0aW9uIDogcHVibGljIEV4Y2VwdGlvbiB7Ci0gIHB1YmxpYzoKLSAgICBDaGFpbkNvbmZpZ0V4Y2VwdGlvbigpIHRocm93KCk7Ci0gICAgfkNoYWluQ29uZmlnRXhjZXB0aW9uKCkgdGhyb3coKTsKLX07Ci0KLWNsYXNzIENoYWluOwotICAKLS8qKgotICogRW5jYXBzdWxhdGVzIGEgQHJlZiBQQ1F1ZXVlICJwcm9kdWNlciBxdWV1ZSIgYW5kIGEgQHJlZiBQQ1F1ZXVlICJjb25zdW1lciBxdWV1ZSIgd2l0aGluIGEgQHJlZiBDaGFpbiAiY2hhaW4iLgotICogCi0gKiBTcGVjaWZpZXMgcG9zaXRpb24gaW4gY2hhaW4gZm9yIExpbmsgY29uc3RydWN0b3IuCi0gKi8KLWNsYXNzIENoYWluUG9zaXRpb24gewotICBwdWJsaWM6Ci0gICAgY29uc3QgQ2hhaW4gJkdldENoYWluKCkgY29uc3QgeyByZXR1cm4gKmNoYWluXzsgfQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBDaGFpbjsKLSAgICBmcmllbmQgY2xhc3MgTGluazsKLSAgICBDaGFpblBvc2l0aW9uKFBDUXVldWU8QmxvY2s+ICZpbiwgUENRdWV1ZTxCbG9jaz4gJm91dCwgQ2hhaW4gKmNoYWluLCBNdWx0aVByb2dyZXNzICZwcm9ncmVzcykgCi0gICAgICA6IGluXygmaW4pLCBvdXRfKCZvdXQpLCBjaGFpbl8oY2hhaW4pLCBwcm9ncmVzc18ocHJvZ3Jlc3MuQWRkKCkpIHt9Ci0KLSAgICBQQ1F1ZXVlPEJsb2NrPiAqaW5fLCAqb3V0XzsKLQotICAgIENoYWluICpjaGFpbl87Ci0KLSAgICBXb3JrZXJQcm9ncmVzcyBwcm9ncmVzc187Ci19OwotCi0gCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyBhIHdvcmtlciB0aHJlYWQgcHJvY2Vzc2luZyBkYXRhIGF0IGEgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGNoYWluLgotICoKLSAqIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBvd25zIG9uZSBib29zdCB0aHJlYWQgaW4gd2hpY2ggdGhlIHdvcmtlciBpcyBSdW4oKS4KLSAqLwotY2xhc3MgVGhyZWFkIHsKLSAgcHVibGljOgotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVGhyZWFkIGluIHdoaWNoIHRoZSBwcm92aWRlZCBXb3JrZXIgaXMgUnVuKCkuCi0gICAgICoKLSAgICAgKiBQb3NpdGlvbiBpcyB1c3VhbGx5IENoYWluUG9zaXRpb24gYnV0IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdHJlYW1zIGludm9sdmVkLCB0aGlzIGNhbiBiZSBDaGFpblBvc2l0aW9ucy4KLSAgICAgKgotICAgICAqIEFmdGVyIGEgY2FsbCB0byB0aGlzIGNvbnN0cnVjdG9yLCB0aGUgcHJvdmlkZWQgd29ya2VyIHdpbGwgYmUgcnVubmluZyB3aXRoaW4gYSBib29zdCB0aHJlYWQgb3duZWQgYnkgdGhlIG5ld2x5IGNvbnN0cnVjdGVkIFRocmVhZCBvYmplY3QuCi0gICAgICovCi0gICAgdGVtcGxhdGUgPGNsYXNzIFBvc2l0aW9uLCBjbGFzcyBXb3JrZXI+IFRocmVhZChjb25zdCBQb3NpdGlvbiAmcG9zaXRpb24sIGNvbnN0IFdvcmtlciAmd29ya2VyKQotICAgICAgOiB0aHJlYWRfKGJvb3N0OjpyZWYoKnRoaXMpLCBwb3NpdGlvbiwgd29ya2VyKSB7fQotCi0gICAgflRocmVhZCgpOwotCi0gICAgLyoqCi0gICAgICogTGF1bmNoZXMgdGhlIHByb3ZpZGVkIHdvcmtlciBpbiB0aGlzIG9iamVjdCdzIGJvb3N0IHRocmVhZC4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoaXMgY2xhc3MncyBAcmVmIFRocmVhZCgpICJjb25zdHJ1Y3RvciIuCi0gICAgICovCi0gICAgdGVtcGxhdGUgPGNsYXNzIFBvc2l0aW9uLCBjbGFzcyBXb3JrZXI+IHZvaWQgb3BlcmF0b3IoKShjb25zdCBQb3NpdGlvbiAmcG9zaXRpb24sIFdvcmtlciAmd29ya2VyKSB7Ci0gICAgICB0cnkgewotICAgICAgICB3b3JrZXIuUnVuKHBvc2l0aW9uKTsKLSAgICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZlKSB7Ci0gICAgICAgIFVuaGFuZGxlZEV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB2b2lkIFVuaGFuZGxlZEV4Y2VwdGlvbihjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmZSk7Ci0KLSAgICBib29zdDo6dGhyZWFkIHRocmVhZF87Ci19OwotCi0vKioKLSAqIFRoaXMgcmVzZXRzIGJsb2NrcyB0byBmdWxsIHZhbGlkIHNpemUuICBVc2VkIHRvIGNsb3NlIHRoZSBsb29wIGluIENoYWluIGJ5IHJlY3ljbGluZyBibG9ja3MuCi0gKi8KLWNsYXNzIFJlY3ljbGVyIHsKLSAgcHVibGljOgotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgYmxvY2tzIGluIHRoZSBjaGFpbiBzdWNoIHRoYXQgdGhlIGJsb2NrcycgcmVzcGVjdGl2ZSB2YWxpZCBzaXplcyBtYXRjaCB0aGUgY2hhaW4ncyBibG9jayBzaXplLgotICAgICAqCi0gICAgICogQHNlZSBCbG9jazo6U2V0VmFsaWRTaXplKCkKLSAgICAgKiBAc2VlIENoYWluOjpCbG9ja1NpemUoKQotICAgICAqLwotICAgIHZvaWQgUnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKTsKLX07Ci0KLWV4dGVybiBjb25zdCBSZWN5Y2xlciBrUmVjeWNsZTsKLWNsYXNzIFdyaXRlQW5kUmVjeWNsZTsKLWNsYXNzIFBXcml0ZUFuZFJlY3ljbGU7Ci0gIAotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2Ygd29ya2VycywgdGhyb3VnaCB3aGljaCBAcmVmIEJsb2NrICJibG9ja3MiIGNhbiBwYXNzLgotICovCi1jbGFzcyBDaGFpbiB7Ci0gIHByaXZhdGU6Ci0gICAgdGVtcGxhdGUgPGNsYXNzIFQsIHZvaWQgKFQ6OipwdHIpKGNvbnN0IENoYWluUG9zaXRpb24gJikgPSAmVDo6UnVuPiBzdHJ1Y3QgQ2hlY2tGb3JSdW4gewotICAgICAgdHlwZWRlZiBDaGFpbiB0eXBlOwotICAgIH07Ci0KLSAgcHVibGljOgotICAKLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0cyBhIGNvbmZpZ3VyZWQgQ2hhaW4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbmZpZyBTcGVjaWZpZXMgaG93IHRvIGNvbmZpZ3VyZSB0aGUgQ2hhaW4uCi0gICAgICovCi0gICAgZXhwbGljaXQgQ2hhaW4oY29uc3QgQ2hhaW5Db25maWcgJmNvbmZpZyk7Ci0KLSAgICAvKioKLSAgICAgKiBEZXN0cnVjdHMgYSBDaGFpbi4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIHdhaXRzIGZvciB0aGUgY2hhaW4ncyB0aHJlYWRzIHRvIGNvbXBsZXRlLAotICAgICAqIGFuZCBmcmVlcyB0aGUgbWVtb3J5IGhlbGQgYnkgdGhpcyBjaGFpbi4KLSAgICAgKi8KLSAgICB+Q2hhaW4oKTsKLQotICAgIHZvaWQgQWN0aXZhdGVQcm9ncmVzcygpIHsKLSAgICAgIGFzc2VydCghUnVubmluZygpKTsKLSAgICAgIHByb2dyZXNzXy5BY3RpdmF0ZSgpOwotICAgIH0KLQotICAgIHZvaWQgU2V0UHJvZ3Jlc3NUYXJnZXQodWludDY0X3QgdGFyZ2V0KSB7Ci0gICAgICBwcm9ncmVzc18uU2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggcmVjb3JkIG9mIGEgQmxvY2suCi0gICAgICoKLSAgICAgKiBAc2VlIENoYWluQ29uZmlnOjplbnRyeV9zaXplCi0gICAgICovCi0gICAgc3RkOjpzaXplX3QgRW50cnlTaXplKCkgY29uc3QgewotICAgICAgcmV0dXJuIGNvbmZpZ18uZW50cnlfc2l6ZTsKLSAgICB9Ci0gIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGluaXRhbCBAcmVmIEJsb2NrOjpWYWxpZFNpemUgInZhbGlkIHNpemUiIGZvciBAcmVmIEJsb2NrICJibG9ja3MiIGluIHRoaXMgY2hhaW4uCi0gICAgICoKLSAgICAgKiBAc2VlIEJsb2NrOjpWYWxpZFNpemUKLSAgICAgKi8KLSAgICBzdGQ6OnNpemVfdCBCbG9ja1NpemUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmxvY2tfc2l6ZV87Ci0gICAgfQotCi0gICAgLyoqIFR3byB3YXlzIHRvIGFkZCB0byB0aGUgY2hhaW46IEFkZCgpIG9yIG9wZXJhdG9yPj4uICovCi0gICAgQ2hhaW5Qb3NpdGlvbiBBZGQoKTsKLQotICAgIC8qKiAKLSAgICAgKiBBZGRzIGEgbmV3IHdvcmtlciB0byB0aGlzIGNoYWluLAotICAgICAqIGFuZCBydW5zIHRoYXQgd29ya2VyIGluIGEgbmV3IFRocmVhZCBvd25lZCBieSB0aGlzIGNoYWluLgotICAgICAqIAotICAgICAqIFRoZSB3b3JrZXIgbXVzdCBoYXZlIGEgUnVuIG1ldGhvZCB0aGF0IGFjY2VwdHMgYSBwb3NpdGlvbiBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgVGhyZWFkOjpvcGVyYXRvcigpKCkKLSAgICAgKi8KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgV29ya2VyPiB0eXBlbmFtZSBDaGVja0ZvclJ1bjxXb3JrZXI+Ojp0eXBlICZvcGVyYXRvcj4+KGNvbnN0IFdvcmtlciAmd29ya2VyKSB7Ci0gICAgICBhc3NlcnQoIWNvbXBsZXRlX2NhbGxlZF8pOwotICAgICAgdGhyZWFkc18ucHVzaF9iYWNrKG5ldyBUaHJlYWQoQWRkKCksIHdvcmtlcikpOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAvKiogCi0gICAqIEFkZHMgYSBuZXcgd29ya2VyIHRvIHRoaXMgY2hhaW4gKGJ1dCBhdm9pZHMgY29weWluZyB0aGF0IHdvcmtlciksCi0gICAqIGFuZCBydW5zIHRoYXQgd29ya2VyIGluIGEgbmV3IFRocmVhZCBvd25lZCBieSB0aGlzIGNoYWluLgotICAgKiAKLSAgICogVGhlIHdvcmtlciBtdXN0IGhhdmUgYSBSdW4gbWV0aG9kIHRoYXQgYWNjZXB0cyBhIHBvc2l0aW9uIGFyZ3VtZW50LgotICAgKgotICAgKiBAc2VlIFRocmVhZDo6b3BlcmF0b3IoKSgpCi0gICAqLwotICAgIHRlbXBsYXRlIDxjbGFzcyBXb3JrZXI+IHR5cGVuYW1lIENoZWNrRm9yUnVuPFdvcmtlcj46OnR5cGUgJm9wZXJhdG9yPj4oY29uc3QgYm9vc3Q6OnJlZmVyZW5jZV93cmFwcGVyPFdvcmtlcj4gJndvcmtlcikgewotICAgICAgYXNzZXJ0KCFjb21wbGV0ZV9jYWxsZWRfKTsKLSAgICAgIHRocmVhZHNfLnB1c2hfYmFjayhuZXcgVGhyZWFkKEFkZCgpLCB3b3JrZXIpKTsKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvLyBOb3RlIHRoYXQgTGluayBhbmQgU3RyZWFtIGFsc28gZGVmaW5lIG9wZXJhdG9yPj4gb3V0c2lkZSB0aGlzIGNsYXNzLiAgCi0KLSAgICAvLyBUbyBjb21wbGV0ZSB0aGUgbG9vcCwgY2FsbCBDb21wbGV0ZUxvb3AoKSwgPj4ga1JlY3ljbGUsIG9yIHRoZSBkZXN0cnVjdG9yLiAgCi0gICAgdm9pZCBDb21wbGV0ZUxvb3AoKSB7Ci0gICAgICB0aHJlYWRzXy5wdXNoX2JhY2sobmV3IFRocmVhZChDb21wbGV0ZSgpLCBrUmVjeWNsZSkpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBBZGRzIGEgUmVjeWNsZXIgd29ya2VyIHRvIHRoaXMgY2hhaW4sCi0gICAgICogYW5kIHJ1bnMgdGhhdCB3b3JrZXIgaW4gYSBuZXcgVGhyZWFkIG93bmVkIGJ5IHRoaXMgY2hhaW4uCi0gICAgICovCi0gICAgQ2hhaW4gJm9wZXJhdG9yPj4oY29uc3QgUmVjeWNsZXIgJikgewotICAgICAgQ29tcGxldGVMb29wKCk7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEFkZHMgYSBXcml0ZUFuZFJlY3ljbGUgd29ya2VyIHRvIHRoaXMgY2hhaW4sCi0gICAgICogYW5kIHJ1bnMgdGhhdCB3b3JrZXIgaW4gYSBuZXcgVGhyZWFkIG93bmVkIGJ5IHRoaXMgY2hhaW4uCi0gICAgICovCi0gICAgQ2hhaW4gJm9wZXJhdG9yPj4oY29uc3QgV3JpdGVBbmRSZWN5Y2xlICZ3cml0ZXIpOwotICAgIENoYWluICZvcGVyYXRvcj4+KGNvbnN0IFBXcml0ZUFuZFJlY3ljbGUgJndyaXRlcik7Ci0KLSAgICAvLyBDaGFpbnMgYXJlIHJldXNhYmxlLiAgQ2FsbCBXYWl0IHRvIHdhaXQgZm9yIGV2ZXJ5dGhpbmcgdG8gZmluaXNoIGFuZCBmcmVlIG1lbW9yeS4gIAotICAgIHZvaWQgV2FpdChib29sIHJlbGVhc2VfbWVtb3J5ID0gdHJ1ZSk7Ci0KLSAgICAvLyBXYWl0cyBmb3IgdGhlIGN1cnJlbnQgY2hhaW4gdG8gY29tcGxldGUgKGlmIGFueSkgdGhlbiBzdGFydHMgYWdhaW4uICAKLSAgICB2b2lkIFN0YXJ0KCk7Ci0KLSAgICBib29sIFJ1bm5pbmcoKSBjb25zdCB7IHJldHVybiAhcXVldWVzXy5lbXB0eSgpOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBDaGFpblBvc2l0aW9uIENvbXBsZXRlKCk7Ci0KLSAgICBDaGFpbkNvbmZpZyBjb25maWdfOwotCi0gICAgc3RkOjpzaXplX3QgYmxvY2tfc2l6ZV87Ci0KLSAgICBzY29wZWRfbWFsbG9jIG1lbW9yeV87Ci0KLSAgICBib29zdDo6cHRyX3ZlY3RvcjxQQ1F1ZXVlPEJsb2NrPiA+IHF1ZXVlc187Ci0KLSAgICBib29sIGNvbXBsZXRlX2NhbGxlZF87Ci0KLSAgICBib29zdDo6cHRyX3ZlY3RvcjxUaHJlYWQ+IHRocmVhZHNfOwotCi0gICAgTXVsdGlQcm9ncmVzcyBwcm9ncmVzc187Ci19OwotCi0vLyBDcmVhdGUgdGhlIGxpbmsgaW4gdGhlIHdvcmtlciB0aHJlYWQgdXNpbmcgdGhlIHBvc2l0aW9uIHRva2VuLgotLyoqIAotICogUmVwcmVzZW50cyBhIEMrKyBzdHlsZSBpdGVyYXRvciBvdmVyIEByZWYgQmxvY2sgImJsb2NrcyIuCi0gKi8KLWNsYXNzIExpbmsgewotICBwdWJsaWM6Ci0gIAotICAgIC8vIEVpdGhlciBkZWZhdWx0IGNvbnN0cnVjdCBhbmQgSW5pdCBvciBqdXN0IGNvbnN0cnVjdCBhbGwgYXQgb25jZS4KLSAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBAcmVmIEluaXQgImluaXRpYWxpemVkIiBsaW5rLgotICAgICAqCi0gICAgICogQHNlZSBJbml0Ci0gICAgICovCi0gICAgZXhwbGljaXQgTGluayhjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbik7Ci0gIAotICAgIC8qKiAKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbGluayB0aGF0IG11c3Qgc3Vic2VxdWVudGx5IGJlIEByZWYgSW5pdCAiaW5pdGlhbGl6ZWQiLiAKLSAgICAgKgotICAgICAqIEBzZWUgSW5pdAotICAgICAqLwotICAgIExpbmsoKTsKLSAgCi0gICAgLyoqIAotICAgICAqIEluaXRpYWxpemVzIHRoZSBsaW5rIHdpdGggdGhlIGlucHV0IEByZWYgUENRdWV1ZSAiY29uc3VtZXIgcXVldWUiIGFuZCBvdXRwdXQgQHJlZiBQQ1F1ZXVlICJwcm9kdWNlciBxdWV1ZSIgYXQgYSBnaXZlbiBAcmVmIENoYWluUG9zaXRpb24gInBvc2l0aW9uIiBpbiB0aGUgQHJlZiBDaGFpbiAiY2hhaW4iLgotICAgICAqCi0gICAgICogQHNlZSBMaW5rKCkKLSAgICAgKi8KLSAgICB2b2lkIEluaXQoY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pOwotCi0gICAgLyoqCi0gICAgICogRGVzdHJ1Y3RzIHRoZSBsaW5rIG9iamVjdC4KLSAgICAgKgotICAgICAqIElmIG5lY2Vzc2FyeSwgdGhpcyBtZXRob2Qgd2lsbCBwYXNzIGEgcG9pc29uIGJsb2NrIAotICAgICAqIHRvIHRoaXMgbGluaydzIG91dHB1dCBAcmVmIFBDUXVldWUgInByb2R1Y2VyIHF1ZXVlIi4KLSAgICAgKgotICAgICAqIEBzZWUgQmxvY2s6OlNldFRvUG9pc29uKCkKLSAgICAgKi8KLSAgICB+TGluaygpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgQHJlZiBCbG9jayAiYmxvY2siIGF0IHRoaXMgbGluay4KLSAgICAgKi8KLSAgICBCbG9jayAmb3BlcmF0b3IqKCkgeyByZXR1cm4gY3VycmVudF87IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIEByZWYgQmxvY2sgImJsb2NrIiBhdCB0aGlzIGxpbmsuCi0gICAgICovCi0gICAgY29uc3QgQmxvY2sgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgcG9pbnRlciB0byB0aGUgQHJlZiBCbG9jayAiYmxvY2siIGF0IHRoaXMgbGluay4KLSAgICAgKi8KLSAgICBCbG9jayAqb3BlcmF0b3ItPigpIHsgcmV0dXJuICZjdXJyZW50XzsgfQotICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGEgY29uc3QgcG9pbnRlciB0byB0aGUgQHJlZiBCbG9jayAiYmxvY2siIGF0IHRoaXMgbGluay4KLSAgICAgKi8KLSAgICBjb25zdCBCbG9jayAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50XzsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGluayBhdCB0aGUgbmV4dCBAcmVmIENoYWluUG9zaXRpb24gInBvc2l0aW9uIiBpbiB0aGUgQHJlZiBDaGFpbiAiY2hhaW4iLgotICAgICAqLwotICAgIExpbmsgJm9wZXJhdG9yKysoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQHJlZiBCbG9jayAiYmxvY2siIGF0IHRoaXMgbGluayBlbmNhcHN1bGF0ZXMgYSB2YWxpZCAobm9uLU5VTEwpIGJsb2NrIG9mIG1lbW9yeS4KLSAgICAgKiAKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBhIHVzZXItZGVmaW5lZCBpbXBsaWNpdCBjb252ZXJzaW9uIGZ1bmN0aW9uIHRvIGJvb2xlYW47Ci0gICAgICogYW1vbmcgb3RoZXIgdGhpbmdzLCB0aGlzIG1ldGhvZCBlbmFibGVzIGJhcmUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgCi0gICAgICogdG8gYmUgdXNlZCBhcyB0aGUgY29uZGl0aW9uIG9mIGFuIGlmIHN0YXRlbWVudC4KLSAgICAgKi8KLSAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF87IH0KLQotICAgIC8qKiAKLSAgICAgKiBAcmVmIEJsb2NrOjpTZXRUb1BvaXNvbigpICJQb2lzb25zIiB0aGUgQHJlZiBCbG9jayAiYmxvY2siIGF0IHRoaXMgbGluaywKLSAgICAgKiBhbmQgcGFzc2VzIHRoaXMgbm93LXBvaXNvbmVkIGJsb2NrIHRvIHRoaXMgbGluaydzIG91dHB1dCBAcmVmIFBDUXVldWUgInByb2R1Y2VyIHF1ZXVlIi4KLSAgICAgKgotICAgICAqIEBzZWUgQmxvY2s6OlNldFRvUG9pc29uKCkKLSAgICAgKi8KLSAgICB2b2lkIFBvaXNvbigpOwotICAKLSAgcHJpdmF0ZToKLSAgICBCbG9jayBjdXJyZW50XzsKLSAgICBQQ1F1ZXVlPEJsb2NrPiAqaW5fLCAqb3V0XzsKLSAKLSAgICBib29sIHBvaXNvbmVkXzsKLQotICAgIFdvcmtlclByb2dyZXNzIHByb2dyZXNzXzsKLX07Ci0KLWlubGluZSBDaGFpbiAmb3BlcmF0b3I+PihDaGFpbiAmY2hhaW4sIExpbmsgJmxpbmspIHsKLSAgbGluay5Jbml0KGNoYWluLkFkZCgpKTsKLSAgcmV0dXJuIGNoYWluOwotfQotCi19IC8vIG5hbWVzcGFjZSBzdHJlYW0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKLQotI2VuZGlmIC8vIFVUSUxfU1RSRUFNX0NIQUlOX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9jb25maWcuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vY29uZmlnLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmFkMzZiLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9jb25maWcuaGgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jaWZuZGVmIFVUSUxfU1RSRUFNX0NPTkZJR19ICi0jZGVmaW5lIFVUSUxfU1RSRUFNX0NPTkZJR19ICi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIHV0aWwgeyBuYW1lc3BhY2Ugc3RyZWFtIHsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGhvdyBhIGNoYWluIHNob3VsZCBiZSBjb25maWd1cmVkLgotICovCi1zdHJ1Y3QgQ2hhaW5Db25maWcgewotICAKLSAgLyoqIENvbnN0cnVjdHMgYW4gY29uZmlndXJhdGlvbiB3aXRoIHVuZGVyc3BlY2lmaWVkIChvciBkZWZhdWx0KSBwYXJhbWV0ZXJzLiAqLwotICBDaGFpbkNvbmZpZygpIHt9Ci0KLSAgLyoqIAotICAgKiBDb25zdHJ1Y3RzIGEgY2hhaW4gY29uZmlndXJhdGlvbiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBbaW5dIGluX2VudHJ5X3NpemUgICBOdW1iZXIgb2YgYnl0ZXMgaW4gZWFjaCByZWNvcmQuCi0gICAqIEBwYXJhbSBbaW5dIGluX2Jsb2NrX2NvdW50ICBOdW1iZXIgb2YgYmxvY2tzIGluIHRoZSBjaGFpbi4KLSAgICogQHBhcmFtIFtpbl0gaW5fdG90YWxfbWVtb3J5IFRvdGFsIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgdG8gdGhlIGNoYWluLgotICAgKiAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgZGl2aWRlZCBhbW9uZ3N0IHRoZSBibG9ja3MgaW4gdGhlIGNoYWluLgotICAgKi8KLSAgQ2hhaW5Db25maWcoc3RkOjpzaXplX3QgaW5fZW50cnlfc2l6ZSwgc3RkOjpzaXplX3QgaW5fYmxvY2tfY291bnQsIHN0ZDo6c2l6ZV90IGluX3RvdGFsX21lbW9yeSkKLSAgICA6IGVudHJ5X3NpemUoaW5fZW50cnlfc2l6ZSksIGJsb2NrX2NvdW50KGluX2Jsb2NrX2NvdW50KSwgdG90YWxfbWVtb3J5KGluX3RvdGFsX21lbW9yeSkge30KLQotICAvKioKLSAgICogTnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggcmVjb3JkLgotICAgKi8KLSAgc3RkOjpzaXplX3QgZW50cnlfc2l6ZTsKLSAgCi0gIC8qKgotICAgKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoZSBjaGFpbi4KLSAgICovCi0gIHN0ZDo6c2l6ZV90IGJsb2NrX2NvdW50OwotICAKLSAgLyoqIAotICAgKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIHRvIHRoZSBjaGFpbi4KLSAgICogVGhpcyB2YWx1ZSB3aWxsIGJlIGRpdmlkZWQgYW1vbmdzdCB0aGUgYmxvY2tzIGluIHRoZSBjaGFpbi4KLSAgICogQ2hhaW4ncyBjb25zdHJ1Y3RvciB3aWxsIG1ha2UgdGhpcyBhIG11bHRpcGxlIG9mIGVudHJ5X3NpemUuIAotICAgKi8KLSAgc3RkOjpzaXplX3QgdG90YWxfbWVtb3J5OwotfTsKLQotICAKLS8qKgotICogUmVwcmVzZW50cyBob3cgYSBzb3J0ZXIgc2hvdWxkIGJlIGNvbmZpZ3VyZWQuCi0gKi8KLXN0cnVjdCBTb3J0Q29uZmlnIHsKLSAgCi0gIC8qKiBGaWxlbmFtZSBwcmVmaXggd2hlcmUgdGVtcG9yYXJ5IGZpbGVzIHNob3VsZCBiZSBwbGFjZWQuICovCi0gIHN0ZDo6c3RyaW5nIHRlbXBfcHJlZml4OwotCi0gIC8qKiBTaXplIG9mIGVhY2ggaW5wdXQvb3V0cHV0IGJ1ZmZlci4gKi8KLSAgc3RkOjpzaXplX3QgYnVmZmVyX3NpemU7Ci0KLSAgLyoqIFRvdGFsIG1lbW9yeSB0byB1c2Ugd2hlbiBydW5uaW5nIGFsb25lLiAqLwotICBzdGQ6OnNpemVfdCB0b3RhbF9tZW1vcnk7Ci19OwotCi19fSAvLyBuYW1lc3BhY2VzCi0jZW5kaWYgLy8gVVRJTF9TVFJFQU1fQ09ORklHX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9pby5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9pby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4NDY3YS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vaW8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jaW5jbHVkZSAidXRpbC9zdHJlYW0vaW8uaGgiCi0KLSNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCi0jaW5jbHVkZSAidXRpbC9zdHJlYW0vY2hhaW4uaGgiCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotCi1uYW1lc3BhY2UgdXRpbCB7Ci1uYW1lc3BhY2Ugc3RyZWFtIHsKLQotUmVhZFNpemVFeGNlcHRpb246OlJlYWRTaXplRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotUmVhZFNpemVFeGNlcHRpb246On5SZWFkU2l6ZUV4Y2VwdGlvbigpIHRocm93KCkge30KLQotdm9pZCBSZWFkOjpSdW4oY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKLSAgY29uc3Qgc3RkOjpzaXplX3QgYmxvY2tfc2l6ZSA9IHBvc2l0aW9uLkdldENoYWluKCkuQmxvY2tTaXplKCk7Ci0gIGNvbnN0IHN0ZDo6c2l6ZV90IGVudHJ5X3NpemUgPSBwb3NpdGlvbi5HZXRDaGFpbigpLkVudHJ5U2l6ZSgpOwotICBmb3IgKExpbmsgbGluayhwb3NpdGlvbik7IGxpbms7ICsrbGluaykgewotICAgIHN0ZDo6c2l6ZV90IGdvdCA9IHV0aWw6OlJlYWRPckVPRihmaWxlXywgbGluay0+R2V0KCksIGJsb2NrX3NpemUpOwotICAgIFVUSUxfVEhST1dfSUYoZ290ICUgZW50cnlfc2l6ZSwgUmVhZFNpemVFeGNlcHRpb24sICJGaWxlIGVuZGVkIHdpdGggIiA8PCBnb3QgPDwgIiBieXRlcywgbm90IGEgbXVsdGlwbGUgb2YgIiA8PCBlbnRyeV9zaXplIDw8ICIuIik7IAotICAgIGlmIChnb3QgPT0gMCkgewotICAgICAgbGluay5Qb2lzb24oKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgbGluay0+U2V0VmFsaWRTaXplKGdvdCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgUFJlYWQ6OlJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgewotICBzY29wZWRfZmQgb3duZXI7Ci0gIGlmIChvd25fKSBvd25lci5yZXNldChmaWxlXyk7Ci0gIGNvbnN0IHVpbnQ2NF90IHNpemUgPSBTaXplT3JUaHJvdyhmaWxlXyk7Ci0gIFVUSUxfVEhST1dfSUYoc2l6ZSAlIHN0YXRpY19jYXN0PHVpbnQ2NF90Pihwb3NpdGlvbi5HZXRDaGFpbigpLkVudHJ5U2l6ZSgpKSwgUmVhZFNpemVFeGNlcHRpb24sICJGaWxlIHNpemUgIiA8PCBmaWxlXyA8PCAiIHNpemUgaXMgIiA8PCBzaXplIDw8ICIgbm90IGEgbXVsdGlwbGUgb2YgIiA8PCBwb3NpdGlvbi5HZXRDaGFpbigpLkVudHJ5U2l6ZSgpKTsKLSAgY29uc3Qgc3RkOjpzaXplX3QgYmxvY2tfc2l6ZSA9IHBvc2l0aW9uLkdldENoYWluKCkuQmxvY2tTaXplKCk7Ci0gIGNvbnN0IHVpbnQ2NF90IGJsb2NrX3NpemU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihibG9ja19zaXplKTsKLSAgTGluayBsaW5rKHBvc2l0aW9uKTsKLSAgdWludDY0X3Qgb2Zmc2V0ID0gMDsKLSAgZm9yICg7IG9mZnNldCArIGJsb2NrX3NpemU2NCA8IHNpemU7IG9mZnNldCArPSBibG9ja19zaXplNjQsICsrbGluaykgewotICAgIEVyc2F0elBSZWFkKGZpbGVfLCBsaW5rLT5HZXQoKSwgYmxvY2tfc2l6ZSwgb2Zmc2V0KTsKLSAgICBsaW5rLT5TZXRWYWxpZFNpemUoYmxvY2tfc2l6ZSk7Ci0gIH0KLSAgLy8gc2l6ZSAtIG9mZnNldCBpcyA8PSBibG9ja19zaXplLCBzbyBpdCBjYXN0cyB0byAzMi1iaXQgZmluZS4KLSAgaWYgKHNpemUgLSBvZmZzZXQpIHsKLSAgICBFcnNhdHpQUmVhZChmaWxlXywgbGluay0+R2V0KCksIHNpemUgLSBvZmZzZXQsIG9mZnNldCk7Ci0gICAgbGluay0+U2V0VmFsaWRTaXplKHNpemUgLSBvZmZzZXQpOwotICAgICsrbGluazsKLSAgfQotICBsaW5rLlBvaXNvbigpOwotfQotCi12b2lkIFdyaXRlOjpSdW4oY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKLSAgZm9yIChMaW5rIGxpbmsocG9zaXRpb24pOyBsaW5rOyArK2xpbmspIHsKLSAgICBXcml0ZU9yVGhyb3coZmlsZV8sIGxpbmstPkdldCgpLCBsaW5rLT5WYWxpZFNpemUoKSk7Ci0gIH0KLX0KLQotdm9pZCBXcml0ZUFuZFJlY3ljbGU6OlJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgewotICBjb25zdCBzdGQ6OnNpemVfdCBibG9ja19zaXplID0gcG9zaXRpb24uR2V0Q2hhaW4oKS5CbG9ja1NpemUoKTsKLSAgZm9yIChMaW5rIGxpbmsocG9zaXRpb24pOyBsaW5rOyArK2xpbmspIHsKLSAgICBXcml0ZU9yVGhyb3coZmlsZV8sIGxpbmstPkdldCgpLCBsaW5rLT5WYWxpZFNpemUoKSk7Ci0gICAgbGluay0+U2V0VmFsaWRTaXplKGJsb2NrX3NpemUpOwotICB9Ci19Ci0KLXZvaWQgUFdyaXRlQW5kUmVjeWNsZTo6UnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7Ci0gIGNvbnN0IHN0ZDo6c2l6ZV90IGJsb2NrX3NpemUgPSBwb3NpdGlvbi5HZXRDaGFpbigpLkJsb2NrU2l6ZSgpOwotICB1aW50NjRfdCBvZmZzZXQgPSAwOwotICBmb3IgKExpbmsgbGluayhwb3NpdGlvbik7IGxpbms7ICsrbGluaykgewotICAgIEVyc2F0elBXcml0ZShmaWxlXywgbGluay0+R2V0KCksIGxpbmstPlZhbGlkU2l6ZSgpLCBvZmZzZXQpOwotICAgIG9mZnNldCArPSBsaW5rLT5WYWxpZFNpemUoKTsKLSAgICBsaW5rLT5TZXRWYWxpZFNpemUoYmxvY2tfc2l6ZSk7Ci0gIH0KLSAgLy8gVHJpbSBmaWxlIHRvIHNpemUuCi0gIHV0aWw6OlJlc2l6ZU9yVGhyb3coZmlsZV8sIG9mZnNldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIHN0cmVhbQotfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL2lvLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL2lvLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGFlMmNiLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9pby5oaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSNpZm5kZWYgVVRJTF9TVFJFQU1fSU9fSAotI2RlZmluZSBVVElMX1NUUkVBTV9JT19ICi0KLSNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKLSNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCi0KLW5hbWVzcGFjZSB1dGlsIHsKLW5hbWVzcGFjZSBzdHJlYW0gewotCi1jbGFzcyBDaGFpblBvc2l0aW9uOwotCi1jbGFzcyBSZWFkU2l6ZUV4Y2VwdGlvbiA6IHB1YmxpYyB1dGlsOjpFeGNlcHRpb24gewotICBwdWJsaWM6Ci0gICAgUmVhZFNpemVFeGNlcHRpb24oKSB0aHJvdygpOwotICAgIH5SZWFkU2l6ZUV4Y2VwdGlvbigpIHRocm93KCk7Ci19OwotCi1jbGFzcyBSZWFkIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IFJlYWQoaW50IGZkKSA6IGZpbGVfKGZkKSB7fQotICAgIHZvaWQgUnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKTsgCi0gIHByaXZhdGU6Ci0gICAgaW50IGZpbGVfOwotfTsKLQotLy8gTGlrZSByZWFkIGJ1dCB1c2VzIHByZWFkIHNvIHRoYXQgdGhlIGZpbGUgY2FuIGJlIGFjY2Vzc2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4gIAotY2xhc3MgUFJlYWQgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgUFJlYWQoaW50IGZkLCBib29sIHRha2Vfb3duID0gZmFsc2UpIDogZmlsZV8oZmQpLCBvd25fKHRha2Vfb3duKSB7fQotICAgIHZvaWQgUnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKTsKLSAgcHJpdmF0ZToKLSAgICBpbnQgZmlsZV87Ci0gICAgYm9vbCBvd25fOwotfTsKLQotY2xhc3MgV3JpdGUgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgV3JpdGUoaW50IGZkKSA6IGZpbGVfKGZkKSB7fQotICAgIHZvaWQgUnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKTsKLSAgcHJpdmF0ZToKLSAgICBpbnQgZmlsZV87Ci19OwotCi0vLyBJdCdzIGEgY29tbW9uIGNhc2UgdGhhdCBzdHVmZiBpcyB3cml0dGVuIGFuZCB0aGVuIHJlY3ljbGVkLiAgU28gcmF0aGVyIHRoYW4KLS8vIHNwYXduIGFub3RoZXIgdGhyZWFkIHRvIFJlY3ljbGUsIHRoaXMgY29tYmluZXMgdGhlIHR3byByb2xlcy4KLWNsYXNzIFdyaXRlQW5kUmVjeWNsZSB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBXcml0ZUFuZFJlY3ljbGUoaW50IGZkKSA6IGZpbGVfKGZkKSB7fQotICAgIHZvaWQgUnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKTsKLSAgcHJpdmF0ZToKLSAgICBpbnQgZmlsZV87Ci19OwotCi1jbGFzcyBQV3JpdGVBbmRSZWN5Y2xlIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IFBXcml0ZUFuZFJlY3ljbGUoaW50IGZkKSA6IGZpbGVfKGZkKSB7fQotICAgIHZvaWQgUnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKTsKLSAgcHJpdmF0ZToKLSAgICBpbnQgZmlsZV87Ci19OwotCi0KLS8vIFJldXNlIHRoZSBzYW1lIGZpbGUgb3ZlciBhbmQgb3ZlciBhZ2FpbiB0byBidWZmZXIgb3V0cHV0LiAgCi1jbGFzcyBGaWxlQnVmZmVyIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IEZpbGVCdWZmZXIoaW50IGZkKSA6IGZpbGVfKGZkKSB7fQotCi0gICAgUFdyaXRlQW5kUmVjeWNsZSBTaW5rKCkgY29uc3QgewotICAgICAgdXRpbDo6U2Vla09yVGhyb3coZmlsZV8uZ2V0KCksIDApOwotICAgICAgcmV0dXJuIFBXcml0ZUFuZFJlY3ljbGUoZmlsZV8uZ2V0KCkpOwotICAgIH0KLQotICAgIFBSZWFkIFNvdXJjZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBQUmVhZChmaWxlXy5nZXQoKSk7Ci0gICAgfQotCi0gICAgdWludDY0X3QgU2l6ZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBTaXplT3JUaHJvdyhmaWxlXy5nZXQoKSk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgc2NvcGVkX2ZkIGZpbGVfOwotfTsKLQotfSAvLyBuYW1lc3BhY2Ugc3RyZWFtCi19IC8vIG5hbWVzcGFjZSB1dGlsCi0jZW5kaWYgLy8gVVRJTF9TVFJFQU1fSU9fSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL2xpbmVfaW5wdXQuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vbGluZV9pbnB1dC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmYTUwMi4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vbGluZV9pbnB1dC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9saW5lX2lucHV0LmhoIgotCi0jaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCi0jaW5jbHVkZSAidXRpbC9maWxlLmhoIgotI2luY2x1ZGUgInV0aWwvcmVhZF9jb21wcmVzc2VkLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NoYWluLmhoIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIHV0aWwgeyBuYW1lc3BhY2Ugc3RyZWFtIHsKLQotdm9pZCBMaW5lSW5wdXQ6OlJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgewotICBSZWFkQ29tcHJlc3NlZCByZWFkZXIoZmRfKTsKLSAgLy8gSG9sZGluZyBhcmVhIGZvciBiZWdpbm5pbmcgb2YgbGluZSB0byBiZSBwbGFjZWQgaW4gbmV4dCBibG9jay4KLSAgc3RkOjp2ZWN0b3I8Y2hhcj4gY2Fycnk7Ci0gIAotICBmb3IgKExpbmsgYmxvY2socG9zaXRpb24pOyA7ICsrYmxvY2spIHsKLSAgICBjaGFyICp0byA9IHN0YXRpY19jYXN0PGNoYXIqPihibG9jay0+R2V0KCkpOwotICAgIGNoYXIgKmJlZ2luID0gdG87Ci0gICAgY2hhciAqZW5kID0gdG8gKyBwb3NpdGlvbi5HZXRDaGFpbigpLkJsb2NrU2l6ZSgpOwotICAgIHN0ZDo6Y29weShjYXJyeS5iZWdpbigpLCBjYXJyeS5lbmQoKSwgdG8pOwotICAgIHRvICs9IGNhcnJ5LnNpemUoKTsKLSAgICB3aGlsZSAodG8gIT0gZW5kKSB7Ci0gICAgICBzdGQ6OnNpemVfdCBnb3QgPSByZWFkZXIuUmVhZCh0bywgZW5kIC0gdG8pOwotICAgICAgaWYgKCFnb3QpIHsKLSAgICAgICAgLy8gRU9GCi0gICAgICAgIGJsb2NrLT5TZXRWYWxpZFNpemUodG8gLSBiZWdpbik7Ci0gICAgICAgICsrYmxvY2s7Ci0gICAgICAgIGJsb2NrLlBvaXNvbigpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICB0byArPSBnb3Q7Ci0gICAgfQotCi0gICAgLy8gRmluZCB0aGUgbGFzdCBuZXdsaW5lLgotICAgIGNoYXIgKm5ld2xpbmU7Ci0gICAgZm9yIChuZXdsaW5lID0gdG8gLSAxOyA7IC0tbmV3bGluZSkgewotICAgICAgVVRJTF9USFJPV19JRihuZXdsaW5lIDwgYmVnaW4sIEV4Y2VwdGlvbiwgIkRpZCBub3QgZmluZCBhIG5ld2xpbmUgaW4gIiA8PCBwb3NpdGlvbi5HZXRDaGFpbigpLkJsb2NrU2l6ZSgpIDw8ICIgYnl0ZXMgb2YgaW5wdXQgb2YgIiA8PCBOYW1lRnJvbUZEKGZkXykgPDwgIi4gIElzIHRoaXMgYSB0ZXh0IGZpbGU/Iik7Ci0gICAgICBpZiAoKm5ld2xpbmUgPT0gJ1xuJykgYnJlYWs7Ci0gICAgfQotICAgIAotICAgIC8vIENvcHkgZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdCBuZXdsaW5lIHRvIHRoZSBjYXJyeS4KLSAgICBjYXJyeS5jbGVhcigpOwotICAgIGNhcnJ5LnJlc2l6ZSh0byAtIChuZXdsaW5lICsgMSkpOwotICAgIHN0ZDo6Y29weShuZXdsaW5lICsgMSwgdG8sICYqY2FycnkuYmVnaW4oKSk7Ci0KLSAgICBibG9jay0+U2V0VmFsaWRTaXplKG5ld2xpbmUgKyAxIC0gYmVnaW4pOwotICB9Ci19Ci0KLX19IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9tdWx0aV9wcm9ncmVzcy5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9tdWx0aV9wcm9ncmVzcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhMTAzOC4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vbXVsdGlfcHJvZ3Jlc3MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jaW5jbHVkZSAidXRpbC9zdHJlYW0vbXVsdGlfcHJvZ3Jlc3MuaGgiCi0KLS8vIFRPRE86IG1lcmdlIHNvbWUgZnVuY3Rpb25hbGl0eSB3aXRoIHRoZSBzaW1wbGUgcHJvZ3Jlc3MgYmFyPwotI2luY2x1ZGUgInV0aWwvZXJzYXR6X3Byb2dyZXNzLmhoIgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZiAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU42NCkKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi1uYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0gewotCi1uYW1lc3BhY2UgewotY29uc3QgY2hhciBrRGlzcGxheUNoYXJhY3RlcnNbXSA9ICItKyojMDEyMzQ1Njc4OSI7Ci0KLXVpbnQ2NF90IE5leHQodW5zaWduZWQgY2hhciBzdG9uZSwgdWludDY0X3QgY29tcGxldGUpIHsKLSAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RvbmUgKyAxKSAqIGNvbXBsZXRlICsgTXVsdGlQcm9ncmVzczo6a1dpZHRoIC0gMSkgLyBNdWx0aVByb2dyZXNzOjprV2lkdGg7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLU11bHRpUHJvZ3Jlc3M6Ok11bHRpUHJvZ3Jlc3MoKSA6IGFjdGl2ZV8oZmFsc2UpLCBjb21wbGV0ZV8oc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpKSwgY2hhcmFjdGVyX2hhbmRvdXRfKDApIHt9Ci0KLU11bHRpUHJvZ3Jlc3M6On5NdWx0aVByb2dyZXNzKCkgewotICBpZiAoYWN0aXZlXyAmJiBjb21wbGV0ZV8gIT0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpKQotICAgIHN0ZDo6Y2VyciA8PCAnXG4nOwotfQotCi12b2lkIE11bHRpUHJvZ3Jlc3M6OkFjdGl2YXRlKCkgewotICBhY3RpdmVfID0gCi0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpCi0gICAgLy8gSXMgc3RkZXJyIGEgdGVybWluYWw/ICAKLSAgICAoaXNhdHR5KDIpID09IDEpCi0jZWxzZQotICAgIHRydWUKLSNlbmRpZgotICAgIDsKLX0KLQotdm9pZCBNdWx0aVByb2dyZXNzOjpTZXRUYXJnZXQodWludDY0X3QgY29tcGxldGUpIHsKLSAgaWYgKCFhY3RpdmVfKSByZXR1cm47Ci0gIGNvbXBsZXRlXyA9IGNvbXBsZXRlOwotICBpZiAoIWNvbXBsZXRlKSBjb21wbGV0ZV8gPSAxOwotICBtZW1zZXQoZGlzcGxheV8sIDAsIHNpemVvZihkaXNwbGF5XykpOwotICBjaGFyYWN0ZXJfaGFuZG91dF8gPSAwOwotICBzdGQ6OmNlcnIgPDwga1Byb2dyZXNzQmFubmVyOwotfQotCi1Xb3JrZXJQcm9ncmVzcyBNdWx0aVByb2dyZXNzOjpBZGQoKSB7Ci0gIGlmICghYWN0aXZlXykKLSAgICByZXR1cm4gV29ya2VyUHJvZ3Jlc3Moc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpLCAqdGhpcywgJ1wwJyk7Ci0gIHN0ZDo6c2l6ZV90IGNoYXJhY3Rlcl9pbmRleDsKLSAgewotICAgIGJvb3N0Ojp1bmlxdWVfbG9jazxib29zdDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBjaGFyYWN0ZXJfaW5kZXggPSBjaGFyYWN0ZXJfaGFuZG91dF8rKzsKLSAgICBpZiAoY2hhcmFjdGVyX2hhbmRvdXRfID09IHNpemVvZihrRGlzcGxheUNoYXJhY3RlcnMpIC0gMSkKLSAgICAgIGNoYXJhY3Rlcl9oYW5kb3V0XyA9IDA7Ci0gIH0KLSAgcmV0dXJuIFdvcmtlclByb2dyZXNzKE5leHQoMCwgY29tcGxldGVfKSwgKnRoaXMsIGtEaXNwbGF5Q2hhcmFjdGVyc1tjaGFyYWN0ZXJfaW5kZXhdKTsKLX0KLQotdm9pZCBNdWx0aVByb2dyZXNzOjpGaW5pc2hlZCgpIHsKLSAgaWYgKCFhY3RpdmVfIHx8IGNvbXBsZXRlXyA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpIHJldHVybjsKLSAgc3RkOjpjZXJyIDw8ICdcbic7Ci0gIGNvbXBsZXRlXyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKTsKLX0KLQotdm9pZCBNdWx0aVByb2dyZXNzOjpNaWxlc3RvbmUoV29ya2VyUHJvZ3Jlc3MgJndvcmtlcikgewotICBpZiAoIWFjdGl2ZV8gfHwgY29tcGxldGVfID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSkgcmV0dXJuOwotICB1bnNpZ25lZCBjaGFyIHN0b25lID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGtXaWR0aCksIHdvcmtlci5jdXJyZW50XyAqIGtXaWR0aCAvIGNvbXBsZXRlXyk7Ci0gIGZvciAoY2hhciAqaSA9ICZkaXNwbGF5X1t3b3JrZXIuc3RvbmVfXTsgaSA8ICZkaXNwbGF5X1tzdG9uZV07ICsraSkgewotICAgICppID0gd29ya2VyLmNoYXJhY3Rlcl87Ci0gIH0KLSAgd29ya2VyLm5leHRfID0gTmV4dChzdG9uZSwgY29tcGxldGVfKTsKLSAgd29ya2VyLnN0b25lXyA9IHN0b25lOwotICB7Ci0gICAgYm9vc3Q6OnVuaXF1ZV9sb2NrPGJvb3N0OjptdXRleD4gbG9jayhtdXRleF8pOwotICAgIHN0ZDo6Y2VyciA8PCAnXHInIDw8IGRpc3BsYXlfIDw8IHN0ZDo6Zmx1c2g7Ci0gIH0KLX0KLQotfX0gLy8gbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL211bHRpX3Byb2dyZXNzLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL211bHRpX3Byb2dyZXNzLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmU2OThhLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9tdWx0aV9wcm9ncmVzcy5oaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qIFByb2dyZXNzIGJhciBzdWl0YWJsZSBmb3IgY2hhaW5zIG9mIHdvcmtlcnMgKi8KLSNpZm5kZWYgVVRJTF9TVFJFQU1fTVVMVElfUFJPR1JFU1NfSAotI2RlZmluZSBVVElMX1NUUkVBTV9NVUxUSV9QUk9HUkVTU19ICi0KLSNpbmNsdWRlIDxib29zdC90aHJlYWQvbXV0ZXguaHBwPgotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0gewotCi1jbGFzcyBXb3JrZXJQcm9ncmVzczsKLQotY2xhc3MgTXVsdGlQcm9ncmVzcyB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrV2lkdGggPSAxMDA7Ci0KLSAgICBNdWx0aVByb2dyZXNzKCk7Ci0KLSAgICB+TXVsdGlQcm9ncmVzcygpOwotCi0gICAgLy8gVHVybnMgb24gc2hvd2luZyAocmVxdWlyZXMgU2V0VGFyZ2V0IHRvbykuCi0gICAgdm9pZCBBY3RpdmF0ZSgpOwotCi0gICAgdm9pZCBTZXRUYXJnZXQodWludDY0X3QgY29tcGxldGUpOwotCi0gICAgV29ya2VyUHJvZ3Jlc3MgQWRkKCk7Ci0KLSAgICB2b2lkIEZpbmlzaGVkKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgV29ya2VyUHJvZ3Jlc3M7Ci0gICAgdm9pZCBNaWxlc3RvbmUoV29ya2VyUHJvZ3Jlc3MgJndvcmtlcik7Ci0KLSAgICBib29sIGFjdGl2ZV87Ci0KLSAgICB1aW50NjRfdCBjb21wbGV0ZV87Ci0KLSAgICBib29zdDo6bXV0ZXggbXV0ZXhfOwotCi0gICAgLy8gXDAgYXQgdGhlIGVuZC4gIAotICAgIGNoYXIgZGlzcGxheV9ba1dpZHRoICsgMV07Ci0KLSAgICBzdGQ6OnNpemVfdCBjaGFyYWN0ZXJfaGFuZG91dF87Ci0KLSAgICBNdWx0aVByb2dyZXNzKGNvbnN0IE11bHRpUHJvZ3Jlc3MgJik7Ci0gICAgTXVsdGlQcm9ncmVzcyAmb3BlcmF0b3I9KGNvbnN0IE11bHRpUHJvZ3Jlc3MgJik7Ci19OwotCi1jbGFzcyBXb3JrZXJQcm9ncmVzcyB7Ci0gIHB1YmxpYzoKLSAgICAvLyBEZWZhdWx0IGNvbnRydXRvciBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggb3BlcmF0b3I9IGxhdGVyLiAgCi0gICAgV29ya2VyUHJvZ3Jlc3MoKSA6IHBhcmVudF8oTlVMTCkge30KLQotICAgIC8vIE5vdCB0aHJlYWRzYWZlIGZvciB0aGUgc2FtZSB3b3JrZXIgYnkgZGVmYXVsdC4gIAotICAgIFdvcmtlclByb2dyZXNzICZvcGVyYXRvcisrKCkgewotICAgICAgaWYgKCsrY3VycmVudF8gPj0gbmV4dF8pIHsKLSAgICAgICAgcGFyZW50Xy0+TWlsZXN0b25lKCp0aGlzKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICBXb3JrZXJQcm9ncmVzcyAmb3BlcmF0b3IrPSh1aW50NjRfdCBhbW91bnQpIHsKLSAgICAgIGN1cnJlbnRfICs9IGFtb3VudDsKLSAgICAgIGlmIChjdXJyZW50XyA+PSBuZXh0XykgewotICAgICAgICBwYXJlbnRfLT5NaWxlc3RvbmUoKnRoaXMpOwotICAgICAgfQotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBNdWx0aVByb2dyZXNzOwotICAgIFdvcmtlclByb2dyZXNzKHVpbnQ2NF90IG5leHQsIE11bHRpUHJvZ3Jlc3MgJnBhcmVudCwgY2hhciBjaGFyYWN0ZXIpIAotICAgICAgOiBjdXJyZW50XygwKSwgbmV4dF8obmV4dCksIHBhcmVudF8oJnBhcmVudCksIHN0b25lXygwKSwgY2hhcmFjdGVyXyhjaGFyYWN0ZXIpIHt9Ci0KLSAgICB1aW50NjRfdCBjdXJyZW50XywgbmV4dF87Ci0KLSAgICBNdWx0aVByb2dyZXNzICpwYXJlbnRfOwotCi0gICAgLy8gUHJldmlvdXMgbWlsZXN0b25lIHJlYWNoZWQuICAKLSAgICB1bnNpZ25lZCBjaGFyIHN0b25lXzsKLQotICAgIC8vIENoYXJhY3RlciB0byBkaXNwbGF5IGluIGJhci4gIAotICAgIGNoYXIgY2hhcmFjdGVyXzsKLX07Ci0KLX19IC8vIG5hbWVzcGFjZXMKLQotI2VuZGlmIC8vIFVUSUxfU1RSRUFNX01VTFRJX1BST0dSRVNTX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9tdWx0aV9zdHJlYW0uaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vbXVsdGlfc3RyZWFtLmhoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWU3ZmFiLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9tdWx0aV9zdHJlYW0uaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotI2lmbmRlZiBVVElMX1NUUkVBTV9NVUxUSV9TVFJFQU1fSAotI2RlZmluZSBVVElMX1NUUkVBTV9NVUxUSV9TVFJFQU1fSAotCi0jaW5jbHVkZSAidXRpbC9maXhlZF9hcnJheS5oaCIKLSNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9jaGFpbi5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9zdHJlYW0uaGgiCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPG5ldz4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1uYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0gewotCi1jbGFzcyBDaGFpbnM7Ci0KLWNsYXNzIENoYWluUG9zaXRpb25zIDogcHVibGljIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uPiB7Ci0gIHB1YmxpYzoKLSAgICBDaGFpblBvc2l0aW9ucygpIHt9Ci0KLSAgICB2b2lkIEluaXQoQ2hhaW5zICZjaGFpbnMpOwotCi0gICAgZXhwbGljaXQgQ2hhaW5Qb3NpdGlvbnMoQ2hhaW5zICZjaGFpbnMpIHsKLSAgICAgIEluaXQoY2hhaW5zKTsKLSAgICB9Ci19OwotCi1jbGFzcyBDaGFpbnMgOiBwdWJsaWMgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkNoYWluPiB7Ci0gIHByaXZhdGU6Ci0gICAgdGVtcGxhdGUgPGNsYXNzIFQsIHZvaWQgKFQ6OipwdHIpKGNvbnN0IENoYWluUG9zaXRpb25zICYpID0gJlQ6OlJ1bj4gc3RydWN0IENoZWNrRm9yUnVuIHsKLSAgICAgIHR5cGVkZWYgQ2hhaW5zIHR5cGU7Ci0gICAgfTsKLQotICBwdWJsaWM6Ci0gICAgLy8gTXVzdCBjYWxsIEluaXQuCi0gICAgQ2hhaW5zKCkge30KLQotICAgIGV4cGxpY2l0IENoYWlucyhzdGQ6OnNpemVfdCBsaW1pdCkgOiB1dGlsOjpGaXhlZEFycmF5PHV0aWw6OnN0cmVhbTo6Q2hhaW4+KGxpbWl0KSB7fQotCi0gICAgdGVtcGxhdGUgPGNsYXNzIFdvcmtlcj4gdHlwZW5hbWUgQ2hlY2tGb3JSdW48V29ya2VyPjo6dHlwZSAmb3BlcmF0b3I+Pihjb25zdCBXb3JrZXIgJndvcmtlcikgewotICAgICAgdGhyZWFkc18ucHVzaF9iYWNrKG5ldyB1dGlsOjpzdHJlYW06OlRocmVhZChDaGFpblBvc2l0aW9ucygqdGhpcyksIHdvcmtlcikpOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDxjbGFzcyBXb3JrZXI+IHR5cGVuYW1lIENoZWNrRm9yUnVuPFdvcmtlcj46OnR5cGUgJm9wZXJhdG9yPj4oY29uc3QgYm9vc3Q6OnJlZmVyZW5jZV93cmFwcGVyPFdvcmtlcj4gJndvcmtlcikgewotICAgICAgdGhyZWFkc18ucHVzaF9iYWNrKG5ldyB1dGlsOjpzdHJlYW06OlRocmVhZChDaGFpblBvc2l0aW9ucygqdGhpcyksIHdvcmtlcikpOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIENoYWlucyAmb3BlcmF0b3I+Pihjb25zdCB1dGlsOjpzdHJlYW06OlJlY3ljbGVyICZyZWN5Y2xlcikgewotICAgICAgZm9yICh1dGlsOjpzdHJlYW06OkNoYWluICppID0gYmVnaW4oKTsgaSAhPSBlbmQoKTsgKytpKSAKLSAgICAgICAgKmkgPj4gcmVjeWNsZXI7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgdm9pZCBXYWl0KGJvb2wgcmVsZWFzZV9tZW1vcnkgPSB0cnVlKSB7Ci0gICAgICB0aHJlYWRzXy5jbGVhcigpOwotICAgICAgZm9yICh1dGlsOjpzdHJlYW06OkNoYWluICppID0gYmVnaW4oKTsgaSAhPSBlbmQoKTsgKytpKSB7Ci0gICAgICAgIGktPldhaXQocmVsZWFzZV9tZW1vcnkpOwotICAgICAgfQotICAgIH0KLQotICBwcml2YXRlOgotICAgIGJvb3N0OjpwdHJfdmVjdG9yPHV0aWw6OnN0cmVhbTo6VGhyZWFkPiB0aHJlYWRzXzsKLQotICAgIENoYWlucyhjb25zdCBDaGFpbnMgJik7Ci0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2hhaW5zICYpOwotfTsKLQotaW5saW5lIHZvaWQgQ2hhaW5Qb3NpdGlvbnM6OkluaXQoQ2hhaW5zICZjaGFpbnMpIHsKLSAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24+OjpJbml0KGNoYWlucy5zaXplKCkpOwotICBmb3IgKHV0aWw6OnN0cmVhbTo6Q2hhaW4gKmkgPSBjaGFpbnMuYmVnaW4oKTsgaSAhPSBjaGFpbnMuZW5kKCk7ICsraSkgewotICAgIC8vIHVzZSAicGxhY2VtZW50IG5ldyIgc3ludGF4IHRvIGluaXRhbGl6ZSBDaGFpblBvc2l0aW9uIGluIGFuIGFscmVhZHktYWxsb2NhdGVkIG1lbW9yeSBsb2NhdGlvbgotICAgIG5ldyAoZW5kKCkpIHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbihpLT5BZGQoKSk7IENvbnN0cnVjdGVkKCk7Ci0gIH0KLX0KLQotaW5saW5lIENoYWlucyAmb3BlcmF0b3I+PihDaGFpbnMgJmNoYWlucywgQ2hhaW5Qb3NpdGlvbnMgJnBvc2l0aW9ucykgewotICBwb3NpdGlvbnMuSW5pdChjaGFpbnMpOwotICByZXR1cm4gY2hhaW5zOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgR2VuZXJpY1N0cmVhbXMgOiBwdWJsaWMgdXRpbDo6Rml4ZWRBcnJheTxUPiB7Ci0gIHByaXZhdGU6Ci0gICAgdHlwZWRlZiB1dGlsOjpGaXhlZEFycmF5PFQ+IFA7Ci0gIHB1YmxpYzoKLSAgICBHZW5lcmljU3RyZWFtcygpIHt9Ci0KLSAgICAvLyBUaGlzIHB1dHMgYSBkdW1teSBUIGF0IHRoZSBiZWdpbm5pbmcgKHVzZWZ1bCB0byBhbGdvcml0aG1zIHRoYXQgbmVlZCB0byByZWZlcmVuY2Ugc29tZXRoaW5nIGF0IHRoZSBiZWdpbm5pbmcpLgotICAgIHZvaWQgSW5pdFdpdGhEdW1teShjb25zdCBDaGFpblBvc2l0aW9ucyAmcG9zaXRpb25zKSB7Ci0gICAgICBQOjpJbml0KHBvc2l0aW9ucy5zaXplKCkgKyAxKTsKLSAgICAgIG5ldyAoUDo6ZW5kKCkpIFQoKTsgLy8gdXNlICJwbGFjZW1lbnQgbmV3IiBzeW50YXggdG8gaW5pdGFsaXplIFQgaW4gYW4gYWxyZWFkeS1hbGxvY2F0ZWQgbWVtb3J5IGxvY2F0aW9uCi0gICAgICBQOjpDb25zdHJ1Y3RlZCgpOwotICAgICAgZm9yIChjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gKmkgPSBwb3NpdGlvbnMuYmVnaW4oKTsgaSAhPSBwb3NpdGlvbnMuZW5kKCk7ICsraSkgewotICAgICAgICBQOjpwdXNoX2JhY2soKmkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIExpbWl0IHJlc3RyaWN0cyB0byBwb3NpdGlvbnNbMCxsaW1pdCkKLSAgICB2b2lkIEluaXQoY29uc3QgQ2hhaW5Qb3NpdGlvbnMgJnBvc2l0aW9ucywgc3RkOjpzaXplX3QgbGltaXQpIHsKLSAgICAgIFA6OkluaXQobGltaXQpOwotICAgICAgZm9yIChjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gKmkgPSBwb3NpdGlvbnMuYmVnaW4oKTsgaSAhPSBwb3NpdGlvbnMuYmVnaW4oKSArIGxpbWl0OyArK2kpIHsKLSAgICAgICAgUDo6cHVzaF9iYWNrKCppKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBJbml0KGNvbnN0IENoYWluUG9zaXRpb25zICZwb3NpdGlvbnMpIHsKLSAgICAgIEluaXQocG9zaXRpb25zLCBwb3NpdGlvbnMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBHZW5lcmljU3RyZWFtcyhjb25zdCBDaGFpblBvc2l0aW9ucyAmcG9zaXRpb25zKSB7Ci0gICAgICBJbml0KHBvc2l0aW9ucyk7Ci0gICAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBDaGFpbnMgJm9wZXJhdG9yPj4oQ2hhaW5zICZjaGFpbnMsIEdlbmVyaWNTdHJlYW1zPFQ+ICZzdHJlYW1zKSB7Ci0gIENoYWluUG9zaXRpb25zIHBvc2l0aW9uczsKLSAgY2hhaW5zID4+IHBvc2l0aW9uczsKLSAgc3RyZWFtcy5Jbml0KHBvc2l0aW9ucyk7Ci0gIHJldHVybiBjaGFpbnM7Ci19Ci0KLXR5cGVkZWYgR2VuZXJpY1N0cmVhbXM8U3RyZWFtPiBTdHJlYW1zOwotCi19fSAvLyBuYW1lc3BhY2VzCi0jZW5kaWYgLy8gVVRJTF9TVFJFQU1fTVVMVElfU1RSRUFNX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9zb3J0LmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL3NvcnQuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwODJjZmQuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL3NvcnQuaGgKKysrIC9kZXYvbnVsbApAQCAtMSw1NTAgKzAsMCBAQAotLyogVXNhZ2U6Ci0gKiBTb3J0PENvbXBhcmU+IHNvcnRlcih0ZW1wLCBjb21wYXJlKTsKLSAqIENoYWluKGNvbmZpZykgPj4gUmVhZChmaWxlKSA+PiBzb3J0ZXIuVW5zb3J0ZWQoKTsKLSAqIFN0cmVhbSBzdHJlYW07Ci0gKiBDaGFpbiBjaGFpbihjb25maWcpID4+IHNvcnRlci5Tb3J0ZWQoaW50ZXJuYWxfY29uZmlnLCBsYXp5X2NvbmZpZykgPj4gc3RyZWFtOwotICogCi0gKiBOb3RlIHRoYXQgc29ydGVyIG11c3Qgb3V0bGl2ZSBhbnkgdGhyZWFkcyB0aGF0IHVzZSBVbnNvcnRlZCBvciBTb3J0ZWQuICAKLSAqCi0gKiBDb21iaW5lcnMgdGFrZSB0aGUgZm9ybToKLSAqIGJvb2wgb3BlcmF0b3IoKSh2b2lkICppbnRvLCBjb25zdCB2b2lkICpvcHRpb24sIGNvbnN0IENvbXBhcmUgJmNvbXBhcmUpIGNvbnN0Ci0gKiB3aGljaCByZXR1cm5zIHRydWUgaWZmIGEgY29tYmluYXRpb24gaGFwcGVuZWQuICBUaGUgc29ydGluZyBhbGdvcml0aG0KLSAqIGd1YXJhbnRlZXMgY29tcGFyZShpbnRvLCBvcHRpb24pLiAgQnV0IGl0IGRvZXMgbm90IGd1YXJhbnRlZSAKLSAqIGNvbXBhcmUob3B0aW9uLCBpbnRvKS4gIAotICogQ3VycmVudGx5LCBjb21iaW5pbmcgaXMgb25seSBkb25lIGluIG1lcmdlIHN0ZXBzLCBub3QgZHVyaW5nIG9uLXRoZS1mbHkKLSAqIHNvcnQuICBVc2UgYSBoYXNoIHRhYmxlIGZvciB0aGF0LiAgCi0gKi8KLQotI2lmbmRlZiBVVElMX1NUUkVBTV9TT1JUX0gKLSNkZWZpbmUgVVRJTF9TVFJFQU1fU09SVF9ICi0KLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9jaGFpbi5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9jb25maWcuaGgiCi0jaW5jbHVkZSAidXRpbC9zdHJlYW0vaW8uaGgiCi0jaW5jbHVkZSAidXRpbC9zdHJlYW0vc3RyZWFtLmhoIgotI2luY2x1ZGUgInV0aWwvc3RyZWFtL3RpbWVyLmhoIgotCi0jaW5jbHVkZSAidXRpbC9maWxlLmhoIgotI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgotI2luY2x1ZGUgInV0aWwvc2l6ZWRfaXRlcmF0b3IuaGgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgdXRpbCB7Ci1uYW1lc3BhY2Ugc3RyZWFtIHsKLQotc3RydWN0IE5ldmVyQ29tYmluZSB7Ci0gIHRlbXBsYXRlIDxjbGFzcyBDb21wYXJlPiBib29sIG9wZXJhdG9yKCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIGNvbnN0IENvbXBhcmUgJikgY29uc3QgeyAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX07Ci0KLS8vIE1hbmFnZSB0aGUgb2Zmc2V0cyBvZiBzb3J0ZWQgYmxvY2tzIGluIGEgZmlsZS4gIAotY2xhc3MgT2Zmc2V0cyB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBPZmZzZXRzKGludCBmZCkgOiBsb2dfKGZkKSB7Ci0gICAgICBSZXNldCgpOwotICAgIH0KLQotICAgIGludCBGaWxlKCkgY29uc3QgeyByZXR1cm4gbG9nXzsgfQotCi0gICAgdm9pZCBBcHBlbmQodWludDY0X3QgbGVuZ3RoKSB7Ci0gICAgICBpZiAoIWxlbmd0aCkgcmV0dXJuOwotICAgICAgKytibG9ja19jb3VudF87Ci0gICAgICBpZiAobGVuZ3RoID09IGN1cl8ubGVuZ3RoKSB7Ci0gICAgICAgICsrY3VyXy5ydW47Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIFdyaXRlT3JUaHJvdyhsb2dfLCAmY3VyXywgc2l6ZW9mKEVudHJ5KSk7Ci0gICAgICBjdXJfLmxlbmd0aCA9IGxlbmd0aDsKLSAgICAgIGN1cl8ucnVuID0gMTsKLSAgICB9Ci0KLSAgICB2b2lkIEZpbmlzaGVkQXBwZW5kaW5nKCkgewotICAgICAgV3JpdGVPclRocm93KGxvZ18sICZjdXJfLCBzaXplb2YoRW50cnkpKTsKLSAgICAgIFNlZWtPclRocm93KGxvZ18sIHNpemVvZihFbnRyeSkpOyAvLyBTa2lwIDAsMCBhdCBiZWdpbm5pbmcuCi0gICAgICBjdXJfLnJ1biA9IDA7Ci0gICAgICBpZiAoYmxvY2tfY291bnRfKSB7Ci0gICAgICAgIFJlYWRPclRocm93KGxvZ18sICZjdXJfLCBzaXplb2YoRW50cnkpKTsKLSAgICAgICAgYXNzZXJ0KGN1cl8ubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0KGN1cl8ucnVuKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB1aW50NjRfdCBSZW1haW5pbmdCbG9ja3MoKSBjb25zdCB7IHJldHVybiBibG9ja19jb3VudF87IH0KLQotICAgIHVpbnQ2NF90IFRvdGFsT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gb3V0cHV0X3N1bV87IH0KLQotICAgIHVpbnQ2NF90IFBlZWtTaXplKCkgY29uc3QgewotICAgICAgcmV0dXJuIGN1cl8ubGVuZ3RoOwotICAgIH0KLQotICAgIHVpbnQ2NF90IE5leHRTaXplKCkgewotICAgICAgYXNzZXJ0KGJsb2NrX2NvdW50Xyk7Ci0gICAgICB1aW50NjRfdCByZXQgPSBjdXJfLmxlbmd0aDsKLSAgICAgIG91dHB1dF9zdW1fICs9IHJldDsKLQotICAgICAgLS1jdXJfLnJ1bjsKLSAgICAgIC0tYmxvY2tfY291bnRfOwotICAgICAgaWYgKCFjdXJfLnJ1biAmJiBibG9ja19jb3VudF8pIHsKLSAgICAgICAgUmVhZE9yVGhyb3cobG9nXywgJmN1cl8sIHNpemVvZihFbnRyeSkpOwotICAgICAgICBhc3NlcnQoY3VyXy5sZW5ndGgpOwotICAgICAgICBhc3NlcnQoY3VyXy5ydW4pOwotICAgICAgfQotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICB2b2lkIFJlc2V0KCkgewotICAgICAgU2Vla09yVGhyb3cobG9nXywgMCk7Ci0gICAgICBSZXNpemVPclRocm93KGxvZ18sIDApOwotICAgICAgY3VyXy5sZW5ndGggPSAwOwotICAgICAgY3VyXy5ydW4gPSAwOwotICAgICAgYmxvY2tfY291bnRfID0gMDsKLSAgICAgIG91dHB1dF9zdW1fID0gMDsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBpbnQgbG9nXzsKLQotICAgIHN0cnVjdCBFbnRyeSB7Ci0gICAgICB1aW50NjRfdCBsZW5ndGg7Ci0gICAgICB1aW50NjRfdCBydW47Ci0gICAgfTsKLSAgICBFbnRyeSBjdXJfOwotCi0gICAgdWludDY0X3QgYmxvY2tfY291bnRfOwotCi0gICAgdWludDY0X3Qgb3V0cHV0X3N1bV87Ci19OwotCi0vLyBBIHByaW9yaXR5IHF1ZXVlIG9mIGVudHJpZXMgYmFja2VkIGJ5IGZpbGUgYnVmZmVycwotdGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+IGNsYXNzIE1lcmdlUXVldWUgewotICBwdWJsaWM6Ci0gICAgTWVyZ2VRdWV1ZShpbnQgZmQsIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplLCBzdGQ6OnNpemVfdCBlbnRyeV9zaXplLCBjb25zdCBDb21wYXJlICZjb21wYXJlKQotICAgICAgOiBxdWV1ZV8oR3JlYXRlcihjb21wYXJlKSksIGluXyhmZCksIGJ1ZmZlcl9zaXplXyhidWZmZXJfc2l6ZSksIGVudHJ5X3NpemVfKGVudHJ5X3NpemUpIHt9Ci0KLSAgICB2b2lkIFB1c2godm9pZCAqYmFzZSwgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBhbW91bnQpIHsKLSAgICAgIHF1ZXVlXy5wdXNoKEVudHJ5KGJhc2UsIGluXywgb2Zmc2V0LCBhbW91bnQsIGJ1ZmZlcl9zaXplXykpOwotICAgIH0KLQotICAgIGNvbnN0IHZvaWQgKlRvcCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBxdWV1ZV8udG9wKCkuQ3VycmVudCgpOwotICAgIH0KLQotICAgIHZvaWQgUG9wKCkgewotICAgICAgRW50cnkgdG9wKHF1ZXVlXy50b3AoKSk7Ci0gICAgICBxdWV1ZV8ucG9wKCk7Ci0gICAgICBpZiAodG9wLkluY3JlbWVudChpbl8sIGJ1ZmZlcl9zaXplXywgZW50cnlfc2l6ZV8pKQotICAgICAgICBxdWV1ZV8ucHVzaCh0b3ApOwotICAgIH0KLQotICAgIHN0ZDo6c2l6ZV90IFNpemUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcXVldWVfLnNpemUoKTsKLSAgICB9Ci0KLSAgICBib29sIEVtcHR5KCkgY29uc3QgewotICAgICAgcmV0dXJuIHF1ZXVlXy5lbXB0eSgpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIC8vIFByaW9yaXR5IHF1ZXVlIGNvbnRhaW5zIHRoZXNlIGVudHJpZXMuICAKLSAgICBjbGFzcyBFbnRyeSB7Ci0gICAgICBwdWJsaWM6Ci0gICAgICAgIEVudHJ5KCkge30KLQotICAgICAgICBFbnRyeSh2b2lkICpiYXNlLCBpbnQgZmQsIHVpbnQ2NF90IG9mZnNldCwgdWludDY0X3QgYW1vdW50LCBzdGQ6OnNpemVfdCBidWZfc2l6ZSkgewotICAgICAgICAgIG9mZnNldF8gPSBvZmZzZXQ7Ci0gICAgICAgICAgcmVtYWluaW5nXyA9IGFtb3VudDsKLSAgICAgICAgICBidWZmZXJfZW5kXyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihiYXNlKSArIGJ1Zl9zaXplOwotICAgICAgICAgIFJlYWQoZmQsIGJ1Zl9zaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgSW5jcmVtZW50KGludCBmZCwgc3RkOjpzaXplX3QgYnVmX3NpemUsIHN0ZDo6c2l6ZV90IGVudHJ5X3NpemUpIHsKLSAgICAgICAgICBjdXJyZW50XyArPSBlbnRyeV9zaXplOwotICAgICAgICAgIGlmIChjdXJyZW50XyAhPSBidWZmZXJfZW5kXykgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgcmV0dXJuIFJlYWQoZmQsIGJ1Zl9zaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHZvaWQgKkN1cnJlbnQoKSBjb25zdCB7IHJldHVybiBjdXJyZW50XzsgfQotCi0gICAgICBwcml2YXRlOgotICAgICAgICBib29sIFJlYWQoaW50IGZkLCBzdGQ6OnNpemVfdCBidWZfc2l6ZSkgewotICAgICAgICAgIGN1cnJlbnRfID0gYnVmZmVyX2VuZF8gLSBidWZfc2l6ZTsKLSAgICAgICAgICBzdGQ6OnNpemVfdCBhbW91bnQ7Ci0gICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihidWZfc2l6ZSkgPCByZW1haW5pbmdfKSB7Ci0gICAgICAgICAgICBhbW91bnQgPSBidWZfc2l6ZTsKLSAgICAgICAgICB9IGVsc2UgaWYgKCFyZW1haW5pbmdfKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFtb3VudCA9IHJlbWFpbmluZ187Ci0gICAgICAgICAgICBidWZmZXJfZW5kXyA9IGN1cnJlbnRfICsgcmVtYWluaW5nXzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgRXJzYXR6UFJlYWQoZmQsIGN1cnJlbnRfLCBhbW91bnQsIG9mZnNldF8pOwotICAgICAgICAgIG9mZnNldF8gKz0gYW1vdW50OwotICAgICAgICAgIGFzc2VydChjdXJyZW50XyA8PSBidWZmZXJfZW5kXyk7Ci0gICAgICAgICAgcmVtYWluaW5nXyAtPSBhbW91bnQ7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBCdWZmZXIKLSAgICAgICAgdWludDhfdCAqY3VycmVudF8sICpidWZmZXJfZW5kXzsKLSAgICAgICAgLy8gRmlsZQotICAgICAgICB1aW50NjRfdCByZW1haW5pbmdfLCBvZmZzZXRfOwotICAgIH07Ci0KLSAgICAvLyBXcmFwcGVyIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHF1ZXVlIGVudHJpZXMuICAgCi0gICAgY2xhc3MgR3JlYXRlciA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxjb25zdCBFbnRyeSAmLCBjb25zdCBFbnRyeSAmLCBib29sPiB7Ci0gICAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IEdyZWF0ZXIoY29uc3QgQ29tcGFyZSAmY29tcGFyZSkgOiBjb21wYXJlXyhjb21wYXJlKSB7fQotCi0gICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBFbnRyeSAmZmlyc3QsIGNvbnN0IEVudHJ5ICZzZWNvbmQpIGNvbnN0IHsKLSAgICAgICAgICByZXR1cm4gY29tcGFyZV8oc2Vjb25kLkN1cnJlbnQoKSwgZmlyc3QuQ3VycmVudCgpKTsKLSAgICAgICAgfQotCi0gICAgICBwcml2YXRlOgotICAgICAgICBjb25zdCBDb21wYXJlIGNvbXBhcmVfOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIHN0ZDo6cHJpb3JpdHlfcXVldWU8RW50cnksIHN0ZDo6dmVjdG9yPEVudHJ5PiwgR3JlYXRlcj4gUXVldWU7Ci0gICAgUXVldWUgcXVldWVfOwotCi0gICAgY29uc3QgaW50IGluXzsKLSAgICBjb25zdCBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZV87Ci0gICAgY29uc3Qgc3RkOjpzaXplX3QgZW50cnlfc2l6ZV87Ci19OwotCi0vKiBBIHdvcmtlciBvYmplY3QgdGhhdCBtZXJnZXMuICBJZiB0aGUgbnVtYmVyIG9mIHBpZWNlcyB0byBtZXJnZSBleGNlZWRzIHRoZQotICogYXJpdHksIGl0IG91dHB1dHMgbXVsdGlwbGUgc29ydGVkIGJsb2NrcywgcmVjb3JkaW5nIHRvIG91dF9vZmZzZXRzLiAgCi0gKiBIb3dldmVyLCB1c2VycyB3aWxsIG9ubHkgZXZlcnkgc2VlIGEgc2luZ2xlIHNvcnRlZCBibG9jayBvdXQgb3V0cHV0IGJlY2F1c2UKLSAqIFNvcnQ6OlNvcnRlZCBpbnN1cmVzIHRoZSBhcml0eSBpcyBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHBpZWNlcyBiZWZvcmUKLSAqIHJldHVybmluZyB0aGlzLiAgIAotICovCi10ZW1wbGF0ZSA8Y2xhc3MgQ29tcGFyZSwgY2xhc3MgQ29tYmluZT4gY2xhc3MgTWVyZ2luZ1JlYWRlciB7Ci0gIHB1YmxpYzoKLSAgICBNZXJnaW5nUmVhZGVyKGludCBpbiwgT2Zmc2V0cyAqaW5fb2Zmc2V0cywgT2Zmc2V0cyAqb3V0X29mZnNldHMsIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplLCBzdGQ6OnNpemVfdCB0b3RhbF9tZW1vcnksIGNvbnN0IENvbXBhcmUgJmNvbXBhcmUsIGNvbnN0IENvbWJpbmUgJmNvbWJpbmUpIDoKLSAgICAgICAgY29tcGFyZV8oY29tcGFyZSksIGNvbWJpbmVfKGNvbWJpbmUpLAotICAgICAgICBpbl8oaW4pLAotICAgICAgICBpbl9vZmZzZXRzXyhpbl9vZmZzZXRzKSwgb3V0X29mZnNldHNfKG91dF9vZmZzZXRzKSwKLSAgICAgICAgYnVmZmVyX3NpemVfKGJ1ZmZlcl9zaXplKSwgdG90YWxfbWVtb3J5Xyh0b3RhbF9tZW1vcnkpIHt9Ci0KLSAgICB2b2lkIFJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgewotICAgICAgUnVuKHBvc2l0aW9uLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgdm9pZCBSdW4oY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24sIGJvb2wgYXNzZXJ0X29uZSkgewotICAgICAgLy8gU3BlY2lhbCBjYXNlOiBub3RoaW5nIHRvIHJlYWQuICAKLSAgICAgIGlmICghaW5fb2Zmc2V0c18tPlJlbWFpbmluZ0Jsb2NrcygpKSB7Ci0gICAgICAgIExpbmsgbChwb3NpdGlvbik7Ci0gICAgICAgIGwuUG9pc29uKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIC8vIElmIHRoZXJlJ3MganVzdCBvbmUgZW50cnksIGp1c3QgcmVhZC4KLSAgICAgIGlmIChpbl9vZmZzZXRzXy0+UmVtYWluaW5nQmxvY2tzKCkgPT0gMSkgewotICAgICAgICAvLyBTZXF1ZW5jaW5nIGlzIGltcG9ydGFudC4KLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0ID0gaW5fb2Zmc2V0c18tPlRvdGFsT2Zmc2V0KCk7Ci0gICAgICAgIHVpbnQ2NF90IGFtb3VudCA9IGluX29mZnNldHNfLT5OZXh0U2l6ZSgpOwotICAgICAgICBSZWFkU2luZ2xlKG9mZnNldCwgYW1vdW50LCBwb3NpdGlvbik7Ci0gICAgICAgIGlmIChvdXRfb2Zmc2V0c18pIG91dF9vZmZzZXRzXy0+QXBwZW5kKGFtb3VudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgU3RyZWFtIHN0cihwb3NpdGlvbik7Ci0gICAgICBzY29wZWRfbWFsbG9jIGJ1ZmZlcihNYWxsb2NPclRocm93KHRvdGFsX21lbW9yeV8pKTsKLSAgICAgIHVpbnQ4X3QgKmNvbnN0IGJ1ZmZlcl9lbmQgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyLmdldCgpKSArIHRvdGFsX21lbW9yeV87Ci0KLSAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGVudHJ5X3NpemUgPSBwb3NpdGlvbi5HZXRDaGFpbigpLkVudHJ5U2l6ZSgpOwotCi0gICAgICB3aGlsZSAoaW5fb2Zmc2V0c18tPlJlbWFpbmluZ0Jsb2NrcygpKSB7Ci0gICAgICAgIC8vIFVzZSBiaWdnZXIgYnVmZmVycyBpZiB0aGVyZSdzIGxlc3MgcmVtYWluaW5nLgotICAgICAgICB1aW50NjRfdCBwZXJfYnVmZmVyID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0ZDo6bWF4PHN0ZDo6c2l6ZV90PigKLSAgICAgICAgICAgIGJ1ZmZlcl9zaXplXywKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90Pigoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHRvdGFsX21lbW9yeV8pIC8gaW5fb2Zmc2V0c18tPlJlbWFpbmluZ0Jsb2NrcygpKSkpKTsKLSAgICAgICAgcGVyX2J1ZmZlciAtPSBwZXJfYnVmZmVyICUgZW50cnlfc2l6ZTsKLSAgICAgICAgYXNzZXJ0KHBlcl9idWZmZXIpOwotCi0gICAgICAgIC8vIFBvcHVsYXRlIHF1ZXVlLgotICAgICAgICBNZXJnZVF1ZXVlPENvbXBhcmU+IHF1ZXVlKGluXywgcGVyX2J1ZmZlciwgZW50cnlfc2l6ZSwgY29tcGFyZV8pOwotICAgICAgICBmb3IgKHVpbnQ4X3QgKmJ1ZiA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIuZ2V0KCkpOyAKLSAgICAgICAgICAgIGluX29mZnNldHNfLT5SZW1haW5pbmdCbG9ja3MoKSAmJiAoYnVmICsgc3RkOjptaW4ocGVyX2J1ZmZlciwgaW5fb2Zmc2V0c18tPlBlZWtTaXplKCkpIDw9IGJ1ZmZlcl9lbmQpOykgewotICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCA9IGluX29mZnNldHNfLT5Ub3RhbE9mZnNldCgpOwotICAgICAgICAgIHVpbnQ2NF90IHNpemUgPSBpbl9vZmZzZXRzXy0+TmV4dFNpemUoKTsKLSAgICAgICAgICBxdWV1ZS5QdXNoKGJ1Ziwgb2Zmc2V0LCBzaXplKTsKLSAgICAgICAgICBidWYgKz0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHN0ZDo6bWluPHVpbnQ2NF90PihzaXplLCBwZXJfYnVmZmVyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGJ1dCBpdCdzIHByb2JhYmx5IGJldHRlciB0byBkaWUgdGhhbiBsb29wIGluZGVmaW5pdGVseS4KLSAgICAgICAgaWYgKHF1ZXVlLlNpemUoKSA8IDIgJiYgaW5fb2Zmc2V0c18tPlJlbWFpbmluZ0Jsb2NrcygpKSB7Ci0gICAgICAgICAgc3RkOjpjZXJyIDw8ICJCdWcgaW4gc29ydCBpbXBsZW1lbnRhdGlvbjogbm90IG1lcmdpbmcgYXQgbGVhc3QgdHdvIHN0cmlwZXMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXNzZXJ0X29uZSAmJiBpbl9vZmZzZXRzXy0+UmVtYWluaW5nQmxvY2tzKCkpIHsKLSAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkJ1ZyBpbiBzb3J0IGltcGxlbWVudGF0aW9uOiBzaG91bGQgb25seSBiZSBvbmUgbWVyZ2UgZ3JvdXAgZm9yIGxhenkgc29ydCIgPDwgc3RkOjplbmRsOwotICAgICAgICAgIGFib3J0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50NjRfdCB3cml0dGVuID0gMDsKLSAgICAgICAgLy8gTWVyZ2UgaW5jbHVkaW5nIGNvbWJpbmVyIHN1cHBvcnQuICAKLSAgICAgICAgbWVtY3B5KHN0ci5HZXQoKSwgcXVldWUuVG9wKCksIGVudHJ5X3NpemUpOwotICAgICAgICBmb3IgKHF1ZXVlLlBvcCgpOyAhcXVldWUuRW1wdHkoKTsgcXVldWUuUG9wKCkpIHsKLSAgICAgICAgICBpZiAoIWNvbWJpbmVfKHN0ci5HZXQoKSwgcXVldWUuVG9wKCksIGNvbXBhcmVfKSkgewotICAgICAgICAgICAgKyt3cml0dGVuOyArK3N0cjsKLSAgICAgICAgICAgIG1lbWNweShzdHIuR2V0KCksIHF1ZXVlLlRvcCgpLCBlbnRyeV9zaXplKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKyt3cml0dGVuOyArK3N0cjsKLSAgICAgICAgaWYgKG91dF9vZmZzZXRzXykKLSAgICAgICAgICBvdXRfb2Zmc2V0c18tPkFwcGVuZCh3cml0dGVuICogZW50cnlfc2l6ZSk7Ci0gICAgICB9Ci0gICAgICBzdHIuUG9pc29uKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6IAotICAgIHZvaWQgUmVhZFNpbmdsZSh1aW50NjRfdCBvZmZzZXQsIGNvbnN0IHVpbnQ2NF90IHNpemUsIGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7Ci0gICAgICAvLyBTcGVjaWFsIGNhc2U6IG9ubHkgb25lIHRvIHJlYWQuICAKLSAgICAgIGNvbnN0IHVpbnQ2NF90IGVuZCA9IG9mZnNldCArIHNpemU7Ci0gICAgICBjb25zdCB1aW50NjRfdCBibG9ja19zaXplID0gcG9zaXRpb24uR2V0Q2hhaW4oKS5CbG9ja1NpemUoKTsKLSAgICAgIExpbmsgbChwb3NpdGlvbik7Ci0gICAgICBmb3IgKDsgb2Zmc2V0ICsgYmxvY2tfc2l6ZSA8IGVuZDsgKytsLCBvZmZzZXQgKz0gYmxvY2tfc2l6ZSkgewotICAgICAgICBFcnNhdHpQUmVhZChpbl8sIGwtPkdldCgpLCBibG9ja19zaXplLCBvZmZzZXQpOwotICAgICAgICBsLT5TZXRWYWxpZFNpemUoYmxvY2tfc2l6ZSk7Ci0gICAgICB9Ci0gICAgICBFcnNhdHpQUmVhZChpbl8sIGwtPkdldCgpLCBlbmQgLSBvZmZzZXQsIG9mZnNldCk7Ci0gICAgICBsLT5TZXRWYWxpZFNpemUoZW5kIC0gb2Zmc2V0KTsKLSAgICAgICgrK2wpLlBvaXNvbigpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgIAotICAgIENvbXBhcmUgY29tcGFyZV87Ci0gICAgQ29tYmluZSBjb21iaW5lXzsKLQotICAgIGludCBpbl87Ci0KLSAgcHJvdGVjdGVkOgotICAgIE9mZnNldHMgKmluX29mZnNldHNfOwotCi0gIHByaXZhdGU6Ci0gICAgT2Zmc2V0cyAqb3V0X29mZnNldHNfOwotIAotICAgIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplXzsKLSAgICBzdGQ6OnNpemVfdCB0b3RhbF9tZW1vcnlfOwotfTsKLQotLy8gVGhlIGxhenkgc3RlcCBvd25zIHRoZSByZW1haW5pbmcgZmlsZXMuICBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZW0uICAKLXRlbXBsYXRlIDxjbGFzcyBDb21wYXJlLCBjbGFzcyBDb21iaW5lPiBjbGFzcyBPd25pbmdNZXJnaW5nUmVhZGVyIDogcHVibGljIE1lcmdpbmdSZWFkZXI8Q29tcGFyZSwgQ29tYmluZT4gewotICBwcml2YXRlOgotICAgIHR5cGVkZWYgTWVyZ2luZ1JlYWRlcjxDb21wYXJlLCBDb21iaW5lPiBQOwotICBwdWJsaWM6Ci0gICAgT3duaW5nTWVyZ2luZ1JlYWRlcihpbnQgZGF0YSwgY29uc3QgT2Zmc2V0cyAmb2Zmc2V0cywgc3RkOjpzaXplX3QgYnVmZmVyLCBzdGQ6OnNpemVfdCBsYXp5LCBjb25zdCBDb21wYXJlICZjb21wYXJlLCBjb25zdCBDb21iaW5lICZjb21iaW5lKSAKLSAgICAgIDogUChkYXRhLCBOVUxMLCBOVUxMLCBidWZmZXIsIGxhenksIGNvbXBhcmUsIGNvbWJpbmUpLAotICAgICAgICBkYXRhXyhkYXRhKSwKLSAgICAgICAgb2Zmc2V0c18ob2Zmc2V0cykge30KLQotICAgIHZvaWQgUnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7Ci0gICAgICBQOjppbl9vZmZzZXRzXyA9ICZvZmZzZXRzXzsKLSAgICAgIHNjb3BlZF9mZCBkYXRhKGRhdGFfKTsKLSAgICAgIHNjb3BlZF9mZCBvZmZzZXRzX2ZpbGUob2Zmc2V0c18uRmlsZSgpKTsKLSAgICAgIFA6OlJ1bihwb3NpdGlvbiwgdHJ1ZSk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgaW50IGRhdGFfOwotICAgIE9mZnNldHMgb2Zmc2V0c187Ci19OwotCi0vLyBEb24ndCB1c2UgdGhpcyBkaXJlY3RseS4gIFdvcmtlciB0aGF0IHNvcnRzIGJsb2Nrcy4gICAKLXRlbXBsYXRlIDxjbGFzcyBDb21wYXJlPiBjbGFzcyBCbG9ja1NvcnRlciB7Ci0gIHB1YmxpYzoKLSAgICBCbG9ja1NvcnRlcihPZmZzZXRzICZvZmZzZXRzLCBjb25zdCBDb21wYXJlICZjb21wYXJlKSA6Ci0gICAgICBvZmZzZXRzXygmb2Zmc2V0cyksIGNvbXBhcmVfKGNvbXBhcmUpIHt9Ci0KLSAgICB2b2lkIFJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgewotICAgICAgY29uc3Qgc3RkOjpzaXplX3QgZW50cnlfc2l6ZSA9IHBvc2l0aW9uLkdldENoYWluKCkuRW50cnlTaXplKCk7Ci0gICAgICBmb3IgKExpbmsgbGluayhwb3NpdGlvbik7IGxpbms7ICsrbGluaykgewotICAgICAgICAvLyBSZWNvcmQgdGhlIHNpemUgb2YgZWFjaCBibG9jayBpbiBhIHNlcGFyYXRlIGZpbGUuICAgIAotICAgICAgICBvZmZzZXRzXy0+QXBwZW5kKGxpbmstPlZhbGlkU2l6ZSgpKTsKLSAgICAgICAgdm9pZCAqZW5kID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGxpbmstPkdldCgpKSArIGxpbmstPlZhbGlkU2l6ZSgpOwotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKLSAgICAgICAgc3RkOjpzdGFibGVfc29ydAotI2Vsc2UKLSAgICAgICAgc3RkOjpzb3J0Ci0jZW5kaWYKLSAgICAgICAgICAoU2l6ZWRJdChsaW5rLT5HZXQoKSwgZW50cnlfc2l6ZSksCi0gICAgICAgICAgIFNpemVkSXQoZW5kLCBlbnRyeV9zaXplKSwKLSAgICAgICAgICAgY29tcGFyZV8pOwotICAgICAgfQotICAgICAgb2Zmc2V0c18tPkZpbmlzaGVkQXBwZW5kaW5nKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgT2Zmc2V0cyAqb2Zmc2V0c187Ci0gICAgU2l6ZWRDb21wYXJlPENvbXBhcmU+IGNvbXBhcmVfOwotfTsKLQotY2xhc3MgQmFkU29ydENvbmZpZyA6IHB1YmxpYyBFeGNlcHRpb24gewotICBwdWJsaWM6Ci0gICAgQmFkU29ydENvbmZpZygpIHRocm93KCkge30KLSAgICB+QmFkU29ydENvbmZpZygpIHRocm93KCkge30KLX07Ci0KLS8qKiBTb3J0ICovCi10ZW1wbGF0ZSA8Y2xhc3MgQ29tcGFyZSwgY2xhc3MgQ29tYmluZSA9IE5ldmVyQ29tYmluZT4gY2xhc3MgU29ydCB7Ci0gIHB1YmxpYzoKLSAgICAvKiogQ29uc3RydWN0cyBhbiBvYmplY3QgY2FwYWJsZSBvZiBzb3J0aW5nICovCi0gICAgU29ydChDaGFpbiAmaW4sIGNvbnN0IFNvcnRDb25maWcgJmNvbmZpZywgY29uc3QgQ29tcGFyZSAmY29tcGFyZSA9IENvbXBhcmUoKSwgY29uc3QgQ29tYmluZSAmY29tYmluZSA9IENvbWJpbmUoKSkKLSAgICAgIDogY29uZmlnXyhjb25maWcpLAotICAgICAgICBkYXRhXyhNYWtlVGVtcChjb25maWcudGVtcF9wcmVmaXgpKSwKLSAgICAgICAgb2Zmc2V0c19maWxlXyhNYWtlVGVtcChjb25maWcudGVtcF9wcmVmaXgpKSwgb2Zmc2V0c18ob2Zmc2V0c19maWxlXy5nZXQoKSksCi0gICAgICAgIGNvbXBhcmVfKGNvbXBhcmUpLCBjb21iaW5lXyhjb21iaW5lKSwKLSAgICAgICAgZW50cnlfc2l6ZV8oaW4uRW50cnlTaXplKCkpIHsKLSAgICAgIFVUSUxfVEhST1dfSUYoIWVudHJ5X3NpemVfLCBCYWRTb3J0Q29uZmlnLCAiU29ydGluZyBlbnRyaWVzIG9mIHNpemUgMCIpOwotICAgICAgLy8gTWFrZSBidWZmZXJfc2l6ZSBhIG11bHRpcGxlIG9mIHRoZSBlbnRyeV9zaXplLiAgCi0gICAgICBjb25maWdfLmJ1ZmZlcl9zaXplIC09IGNvbmZpZ18uYnVmZmVyX3NpemUgJSBlbnRyeV9zaXplXzsKLSAgICAgIFVUSUxfVEhST1dfSUYoIWNvbmZpZ18uYnVmZmVyX3NpemUsIEJhZFNvcnRDb25maWcsICJTb3J0IGJ1ZmZlciB0b28gc21hbGwiKTsKLSAgICAgIFVUSUxfVEhST1dfSUYoY29uZmlnXy50b3RhbF9tZW1vcnkgPCBjb25maWdfLmJ1ZmZlcl9zaXplICogNCwgQmFkU29ydENvbmZpZywgIlNvcnRpbmcgbWVtb3J5ICIgPDwgY29uZmlnXy50b3RhbF9tZW1vcnkgPDwgIiBpcyB0b28gc21hbGwgZm9yIGZvdXIgYnVmZmVycyAodHdvIHJlYWQgYW5kIHR3byB3cml0ZSkuIik7Ci0gICAgICBpbiA+PiBCbG9ja1NvcnRlcjxDb21wYXJlPihvZmZzZXRzXywgY29tcGFyZV8pID4+IFdyaXRlQW5kUmVjeWNsZShkYXRhXy5nZXQoKSk7Ci0gICAgfQotCi0gICAgdWludDY0X3QgU2l6ZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBTaXplT3JUaHJvdyhkYXRhXy5nZXQoKSk7Ci0gICAgfQotCi0gICAgLy8gRG8gbWVyZ2Ugc29ydCwgdGVybWluYXRpbmcgd2hlbiBsYXp5IG1lcmdlIGNvdWxkIGJlIGRvbmUgd2l0aCB0aGUKLSAgICAvLyBzcGVjaWZpZWQgbWVtb3J5LiAgUmV0dXJuIHRoZSBtaW5pbXVtIG1lbW9yeSBuZWNlc3NhcnkgdG8gZG8gbGF6eSBtZXJnZS4KLSAgICBzdGQ6OnNpemVfdCBNZXJnZShzdGQ6OnNpemVfdCBsYXp5X21lbW9yeSkgewotICAgICAgaWYgKG9mZnNldHNfLlJlbWFpbmluZ0Jsb2NrcygpIDw9IDEpIHJldHVybiAwOwotICAgICAgY29uc3QgdWludDY0X3QgbGF6eV9hcml0eSA9IHN0ZDo6bWF4PHVpbnQ2NF90PigxLCBsYXp5X21lbW9yeSAvIGNvbmZpZ18uYnVmZmVyX3NpemUpOwotICAgICAgdWludDY0X3Qgc2l6ZSA9IFNpemUoKTsKLSAgICAgIC8qIE5vIG92ZXJmbG93IGJlY2F1c2UKLSAgICAgICAqIG9mZnNldHNfLlJlbWFpbmluZ0Jsb2NrcygpICogY29uZmlnXy5idWZmZXJfc2l6ZSA8PSBsYXp5X21lbW9yeSB8fAotICAgICAgICogc2l6ZSA8IGxhenlfbWVtb3J5Ci0gICAgICAgKi8KLSAgICAgIGlmIChvZmZzZXRzXy5SZW1haW5pbmdCbG9ja3MoKSA8PSBsYXp5X2FyaXR5IHx8IHNpemUgPD0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGxhenlfbWVtb3J5KSkKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWluPHN0ZDo6c2l6ZV90PihzaXplLCBvZmZzZXRzXy5SZW1haW5pbmdCbG9ja3MoKSAqIGNvbmZpZ18uYnVmZmVyX3NpemUpOwotCi0gICAgICBzY29wZWRfZmQgZGF0YTIoTWFrZVRlbXAoY29uZmlnXy50ZW1wX3ByZWZpeCkpOwotICAgICAgaW50IGZkX2luID0gZGF0YV8uZ2V0KCksIGZkX291dCA9IGRhdGEyLmdldCgpOwotICAgICAgc2NvcGVkX2ZkIG9mZnNldHMyX2ZpbGUoTWFrZVRlbXAoY29uZmlnXy50ZW1wX3ByZWZpeCkpOwotICAgICAgT2Zmc2V0cyBvZmZzZXRzMihvZmZzZXRzMl9maWxlLmdldCgpKTsKLSAgICAgIE9mZnNldHMgKm9mZnNldHNfaW4gPSAmb2Zmc2V0c18sICpvZmZzZXRzX291dCA9ICZvZmZzZXRzMjsKLQotICAgICAgLy8gRG91YmxlIGJ1ZmZlcmVkIHdyaXRpbmcuICAKLSAgICAgIENoYWluQ29uZmlnIGNoYWluX2NvbmZpZzsKLSAgICAgIGNoYWluX2NvbmZpZy5lbnRyeV9zaXplID0gZW50cnlfc2l6ZV87Ci0gICAgICBjaGFpbl9jb25maWcuYmxvY2tfY291bnQgPSAyOwotICAgICAgY2hhaW5fY29uZmlnLnRvdGFsX21lbW9yeSA9IGNvbmZpZ18uYnVmZmVyX3NpemUgKiAyOwotICAgICAgQ2hhaW4gY2hhaW4oY2hhaW5fY29uZmlnKTsKLQotICAgICAgd2hpbGUgKG9mZnNldHNfaW4tPlJlbWFpbmluZ0Jsb2NrcygpID4gbGF6eV9hcml0eSkgewotICAgICAgICBpZiAoc2l6ZSA8PSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obGF6eV9tZW1vcnkpKSBicmVhazsKLSAgICAgICAgc3RkOjpzaXplX3QgcmVhZGluZ19tZW1vcnkgPSBjb25maWdfLnRvdGFsX21lbW9yeSAtIDIgKiBjb25maWdfLmJ1ZmZlcl9zaXplOwotICAgICAgICBpZiAoc2l6ZSA8IHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZWFkaW5nX21lbW9yeSkpIHsKLSAgICAgICAgICByZWFkaW5nX21lbW9yeSA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzaXplKTsKLSAgICAgICAgfQotICAgICAgICBTZWVrT3JUaHJvdyhmZF9pbiwgMCk7Ci0gICAgICAgIGNoYWluID4+Ci0gICAgICAgICAgTWVyZ2luZ1JlYWRlcjxDb21wYXJlLCBDb21iaW5lPigKLSAgICAgICAgICAgICAgZmRfaW4sCi0gICAgICAgICAgICAgIG9mZnNldHNfaW4sIG9mZnNldHNfb3V0LAotICAgICAgICAgICAgICBjb25maWdfLmJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICByZWFkaW5nX21lbW9yeSwKLSAgICAgICAgICAgICAgY29tcGFyZV8sIGNvbWJpbmVfKSA+PgotICAgICAgICAgIFdyaXRlQW5kUmVjeWNsZShmZF9vdXQpOwotICAgICAgICBjaGFpbi5XYWl0KCk7Ci0gICAgICAgIG9mZnNldHNfb3V0LT5GaW5pc2hlZEFwcGVuZGluZygpOwotICAgICAgICBSZXNpemVPclRocm93KGZkX2luLCAwKTsKLSAgICAgICAgb2Zmc2V0c19pbi0+UmVzZXQoKTsKLSAgICAgICAgc3RkOjpzd2FwKGZkX2luLCBmZF9vdXQpOwotICAgICAgICBzdGQ6OnN3YXAob2Zmc2V0c19pbiwgb2Zmc2V0c19vdXQpOwotICAgICAgICBzaXplID0gU2l6ZU9yVGhyb3coZmRfaW4pOwotICAgICAgfQotCi0gICAgICBTZWVrT3JUaHJvdyhmZF9pbiwgMCk7Ci0gICAgICBpZiAoZmRfaW4gPT0gZGF0YTIuZ2V0KCkpIHsKLSAgICAgICAgZGF0YV8ucmVzZXQoZGF0YTIucmVsZWFzZSgpKTsKLSAgICAgICAgb2Zmc2V0c19maWxlXy5yZXNldChvZmZzZXRzMl9maWxlLnJlbGVhc2UoKSk7Ci0gICAgICAgIG9mZnNldHNfID0gb2Zmc2V0czI7Ci0gICAgICB9Ci0gICAgICBpZiAob2Zmc2V0c18uUmVtYWluaW5nQmxvY2tzKCkgPD0gMSkgcmV0dXJuIDA7Ci0gICAgICAvLyBObyBvdmVyZmxvdyBiZWNhdXNlIHRoZSB3aGlsZSBsb29wIGV4aXRlZC4KLSAgICAgIHJldHVybiBzdGQ6Om1pbihzaXplLCBvZmZzZXRzXy5SZW1haW5pbmdCbG9ja3MoKSAqIHN0YXRpY19jYXN0PHVpbnQ2NF90Pihjb25maWdfLmJ1ZmZlcl9zaXplKSk7Ci0gICAgfQotCi0gICAgLy8gT3V0cHV0IHRvIGNoYWluLCB1c2luZyB0aGlzIGFtb3VudCBvZiBtZW1vcnksIG1heGltdW0sIGZvciBsYXp5IG1lcmdlCi0gICAgLy8gc29ydC4gIAotICAgIHZvaWQgT3V0cHV0KENoYWluICZvdXQsIHN0ZDo6c2l6ZV90IGxhenlfbWVtb3J5KSB7Ci0gICAgICBNZXJnZShsYXp5X21lbW9yeSk7Ci0gICAgICBvdXQuU2V0UHJvZ3Jlc3NUYXJnZXQoU2l6ZSgpKTsKLSAgICAgIG91dCA+PiBPd25pbmdNZXJnaW5nUmVhZGVyPENvbXBhcmUsIENvbWJpbmU+KGRhdGFfLmdldCgpLCBvZmZzZXRzXywgY29uZmlnXy5idWZmZXJfc2l6ZSwgbGF6eV9tZW1vcnksIGNvbXBhcmVfLCBjb21iaW5lXyk7Ci0gICAgICBkYXRhXy5yZWxlYXNlKCk7Ci0gICAgICBvZmZzZXRzX2ZpbGVfLnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICAvKiBJZiBhIHBpcGVsaW5lIHN0ZXAgaXMgcmVhZGluZyBzb3J0ZWQgaW5wdXQgYW5kIHdyaXRpbmcgdG8gYSBkaWZmZXJlbnQKLSAgICAgKiBzb3J0IG9yZGVyLCB0aGVuIHRoZXJlJ3MgYSB0cmFkZS1vZmYgYmV0d2VlbiB1c2luZyBSQU0gdG8gcmVhZCBsYXppbHkKLSAgICAgKiAoYXZvaWRpbmcgY29weWluZyB0aGUgZmlsZSkgYW5kIHVzaW5nIFJBTSB0byBpbmNyZWFzZSBibG9jayBzaXplIGFuZCwgCi0gICAgICogdGhlcmVmb3JlLCBkZWNyZWFzZSB0aGUgbnVtYmVyIG9mIG1lcmdlIHNvcnQgcGFzc2VzIGluIHRoZSBuZXh0Ci0gICAgICogaXRlcmF0aW9uLiAgCi0gICAgICogCi0gICAgICogTWVyZ2Ugc29ydCB0YWtlcyBsb2dfe2FyaXR5fShwaWVjZXMpIHBhc3Nlcy4gIFRodXMsIGVhY2ggdGltZSB0aGUgY2hhaW4KLSAgICAgKiBibG9jayBzaXplIGlzIG11bHRpcGxpZWQgYnkgYXJpdHksIHRoZSBudW1iZXIgb2Ygb3V0cHV0IHBhc3NlcyBkZWNyZWFzZXMKLSAgICAgKiBieSBvbmUuICBVcCB0byBhIGNvbnN0YW50LCB0aGVuLCBsb2dfe2FyaXR5fShjaGFpbikgaXMgdGhlIG51bWJlciBvZgotICAgICAqIHBhc3NlcyBzYXZlZC4gIENoYWluIHNpbXBseSBkaXZpZGVzIHRoZSBtZW1vcnkgZXZlbmx5IG92ZXIgYWxsIGJsb2Nrcy4KLSAgICAgKiAKLSAgICAgKiBMYXp5IHNvcnQgc2F2ZXMgdGhpcyBtYW55IHBhc3NlcyAodXAgdG8gYSBjb25zdGFudCkKLSAgICAgKiAgIGxvZ197YXJpdHl9KChtZW1vcnktbGF6eSkvYmxvY2tfY291bnQpICsgMQotICAgICAqIE5vbi1sYXp5IHNvcnQgc2F2ZXMgdGhpcyBtYW55IHBhc3NlcyAodXAgdG8gdGhlIHNhbWUgY29uc3RhbnQpOgotICAgICAqICAgbG9nX3thcml0eX0obWVtb3J5L2Jsb2NrX2NvdW50KQotICAgICAqIEFkZCBsb2dfe2FyaXR5fShibG9ja19jb3VudCkgdG8gYm90aDoKLSAgICAgKiAgIGxvZ197YXJpdHl9KG1lbW9yeS1sYXp5KSArIDEgdmVyc3VzIGxvZ197YXJpdHl9KG1lbW9yeSkKLSAgICAgKiBUYWtlIGFyaXR5IHRvIHRoZSBwb3dlciBvZiBib3RoIHNpemVzIChhcml0eSA+IDEpCi0gICAgICogICAobWVtb3J5IC0gbGF6eSkqYXJpdHkgdmVyc3VzIG1lbW9yeQotICAgICAqIFNvbHZlIGZvciBsYXp5Ci0gICAgICogICBsYXp5ID0gbWVtb3J5ICogKGFyaXR5IC0gMSkgLyBhcml0eQotICAgICAqLwotICAgIHN0ZDo6c2l6ZV90IERlZmF1bHRMYXp5KCkgewotICAgICAgZmxvYXQgYXJpdHkgPSBzdGF0aWNfY2FzdDxmbG9hdD4oY29uZmlnXy50b3RhbF9tZW1vcnkgLyBjb25maWdfLmJ1ZmZlcl9zaXplKTsKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbmZpZ18udG90YWxfbWVtb3J5KSAqIChhcml0eSAtIDEuMCkgLyBhcml0eSk7Ci0gICAgfQotCi0gICAgLy8gU2FtZSBhcyBPdXRwdXQgd2l0aCBkZWZhdWx0IGxhenkgbWVtb3J5IHNldHRpbmcuCi0gICAgdm9pZCBPdXRwdXQoQ2hhaW4gJm91dCkgewotICAgICAgT3V0cHV0KG91dCwgRGVmYXVsdExhenkoKSk7Ci0gICAgfQotCi0gICAgLy8gQ29tcGxldGVseSBtZXJnZSBzb3J0IGFuZCB0cmFuc2ZlciBvd25lcnNoaXAgdG8gdGhlIGNhbGxlci4KLSAgICBpbnQgU3RlYWxDb21wbGV0ZWQoKSB7Ci0gICAgICAvLyBNZXJnZSBhbGwgdGhlIHdheS4KLSAgICAgIE1lcmdlKDApOwotICAgICAgU2Vla09yVGhyb3coZGF0YV8uZ2V0KCksIDApOwotICAgICAgb2Zmc2V0c19maWxlXy5yZXNldCgpOwotICAgICAgcmV0dXJuIGRhdGFfLnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBTb3J0Q29uZmlnIGNvbmZpZ187Ci0KLSAgICBzY29wZWRfZmQgZGF0YV87Ci0KLSAgICBzY29wZWRfZmQgb2Zmc2V0c19maWxlXzsKLSAgICBPZmZzZXRzIG9mZnNldHNfOwotCi0gICAgY29uc3QgQ29tcGFyZSBjb21wYXJlXzsKLSAgICBjb25zdCBDb21iaW5lIGNvbWJpbmVfOwotICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGVudHJ5X3NpemVfOwotfTsKLQotLy8gcmV0dXJucyBieXRlcyB0byBiZSByZWFkIG9uIGRlbWFuZC4gIAotdGVtcGxhdGUgPGNsYXNzIENvbXBhcmUsIGNsYXNzIENvbWJpbmU+IHVpbnQ2NF90IEJsb2NraW5nU29ydChDaGFpbiAmY2hhaW4sIGNvbnN0IFNvcnRDb25maWcgJmNvbmZpZywgY29uc3QgQ29tcGFyZSAmY29tcGFyZSA9IENvbXBhcmUoKSwgY29uc3QgQ29tYmluZSAmY29tYmluZSA9IE5ldmVyQ29tYmluZSgpKSB7Ci0gIFNvcnQ8Q29tcGFyZSwgQ29tYmluZT4gc29ydGVyKGNoYWluLCBjb25maWcsIGNvbXBhcmUsIGNvbWJpbmUpOwotICBjaGFpbi5XYWl0KHRydWUpOwotICB1aW50NjRfdCBzaXplID0gc29ydGVyLlNpemUoKTsKLSAgc29ydGVyLk91dHB1dChjaGFpbik7Ci0gIHJldHVybiBzaXplOwotfQotCi19IC8vIG5hbWVzcGFjZSBzdHJlYW0KLX0gLy8gbmFtZXNwYWNlIHV0aWwKLQotI2VuZGlmIC8vIFVUSUxfU1RSRUFNX1NPUlRfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL3NvcnRfdGVzdC5jYyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9zb3J0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzcwNWMuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL3NvcnRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSNpbmNsdWRlICJ1dGlsL3N0cmVhbS9zb3J0LmhoIgotCi0jZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFNvcnRUZXN0Ci0jaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLW5hbWVzcGFjZSB1dGlsIHsgbmFtZXNwYWNlIHN0cmVhbSB7IG5hbWVzcGFjZSB7Ci0KLXN0cnVjdCBDb21wYXJlVUludDY0IDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBib29sPiB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCB2b2lkICpmaXJzdCwgY29uc3Qgdm9pZCAqc2Vjb25kKSBjb25zdCB7Ci0gICAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCB1aW50NjRfdCo+KGZpcnN0KSA8ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oc2Vjb25kKTsKLSAgfQotfTsKLQotY29uc3QgdWludDY0X3Qga1NpemUgPSAxMDAwMDA7Ci0KLXN0cnVjdCBQdXR0ZXIgewotICBQdXR0ZXIoc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZzaHVmZmxlZCkgOiBzaHVmZmxlZF8oc2h1ZmZsZWQpIHt9Ci0KLSAgdm9pZCBSdW4oY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKLSAgICBTdHJlYW0gcHV0X3NodWZmbGVkKHBvc2l0aW9uKTsKLSAgICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgc2h1ZmZsZWRfLnNpemUoKTsgKytpLCArK3B1dF9zaHVmZmxlZCkgewotICAgICAgKnN0YXRpY19jYXN0PHVpbnQ2NF90Kj4ocHV0X3NodWZmbGVkLkdldCgpKSA9IHNodWZmbGVkX1tpXTsKLSAgICB9Ci0gICAgcHV0X3NodWZmbGVkLlBvaXNvbigpOwotICB9Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmc2h1ZmZsZWRfOwotfTsKLQotQk9PU1RfQVVUT19URVNUX0NBU0UoRnJvbVNodWZmbGVkKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBzaHVmZmxlZDsKLSAgc2h1ZmZsZWQucmVzZXJ2ZShrU2l6ZSk7Ci0gIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBrU2l6ZTsgKytpKSB7Ci0gICAgc2h1ZmZsZWQucHVzaF9iYWNrKGkpOwotICB9Ci0gIHN0ZDo6cmFuZG9tX3NodWZmbGUoc2h1ZmZsZWQuYmVnaW4oKSwgc2h1ZmZsZWQuZW5kKCkpOwotICAKLSAgQ2hhaW5Db25maWcgY29uZmlnOwotICBjb25maWcuZW50cnlfc2l6ZSA9IDg7Ci0gIGNvbmZpZy50b3RhbF9tZW1vcnkgPSA4MDA7Ci0gIGNvbmZpZy5ibG9ja19jb3VudCA9IDM7Ci0KLSAgU29ydENvbmZpZyBtZXJnZV9jb25maWc7Ci0gIG1lcmdlX2NvbmZpZy50ZW1wX3ByZWZpeCA9ICJzb3J0X3Rlc3RfdGVtcCI7Ci0gIG1lcmdlX2NvbmZpZy5idWZmZXJfc2l6ZSA9IDgwMDsKLSAgbWVyZ2VfY29uZmlnLnRvdGFsX21lbW9yeSA9IDMzMDA7Ci0KLSAgQ2hhaW4gY2hhaW4oY29uZmlnKTsKLSAgY2hhaW4gPj4gUHV0dGVyKHNodWZmbGVkKTsKLSAgQmxvY2tpbmdTb3J0KGNoYWluLCBtZXJnZV9jb25maWcsIENvbXBhcmVVSW50NjQoKSwgTmV2ZXJDb21iaW5lKCkpOwotICBTdHJlYW0gc29ydGVkOwotICBjaGFpbiA+PiBzb3J0ZWQgPj4ga1JlY3ljbGU7Ci0gIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBrU2l6ZTsgKytpLCArK3NvcnRlZCkgewotICAgIEJPT1NUX0NIRUNLX0VRVUFMKGksICpzdGF0aWNfY2FzdDxjb25zdCB1aW50NjRfdCo+KHNvcnRlZC5HZXQoKSkpOwotICB9Ci0gIEJPT1NUX0NIRUNLKCFzb3J0ZWQpOwotfQotCi19fX0gLy8gbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL3N0cmVhbS5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9zdHJlYW0uaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTFjOWYuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL3N0cmVhbS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSNpZm5kZWYgVVRJTF9TVFJFQU1fU1RSRUFNX0gKLSNkZWZpbmUgVVRJTF9TVFJFQU1fU1RSRUFNX0gKLQotI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NoYWluLmhoIgotCi0jaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLW5hbWVzcGFjZSBzdHJlYW0gewotCi1jbGFzcyBTdHJlYW0gOiBib29zdDo6bm9uY29weWFibGUgewotICBwdWJsaWM6Ci0gICAgU3RyZWFtKCkgOiBjdXJyZW50XyhOVUxMKSwgZW5kXyhOVUxMKSB7fQotCi0gICAgdm9pZCBJbml0KGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7Ci0gICAgICBlbnRyeV9zaXplXyA9IHBvc2l0aW9uLkdldENoYWluKCkuRW50cnlTaXplKCk7Ci0gICAgICBibG9ja19zaXplXyA9IHBvc2l0aW9uLkdldENoYWluKCkuQmxvY2tTaXplKCk7Ci0gICAgICBibG9ja19pdF8uSW5pdChwb3NpdGlvbik7Ci0gICAgICBTdGFydEJsb2NrKCk7Ci0gICAgfQotCi0gICAgZXhwbGljaXQgU3RyZWFtKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7Ci0gICAgICBJbml0KHBvc2l0aW9uKTsKLSAgICB9Ci0KLSAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF8gIT0gTlVMTDsgfQotICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF8gPT0gTlVMTDsgfQotCi0gICAgY29uc3Qgdm9pZCAqR2V0KCkgY29uc3QgeyByZXR1cm4gY3VycmVudF87IH0KLSAgICB2b2lkICpHZXQoKSB7IHJldHVybiBjdXJyZW50XzsgfQotCi0gICAgdm9pZCBQb2lzb24oKSB7Ci0gICAgICBibG9ja19pdF8tPlNldFZhbGlkU2l6ZShjdXJyZW50XyAtIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihibG9ja19pdF8tPkdldCgpKSk7Ci0gICAgICArK2Jsb2NrX2l0XzsKLSAgICAgIGJsb2NrX2l0Xy5Qb2lzb24oKTsKLSAgICB9Ci0gICAgCi0gICAgU3RyZWFtICZvcGVyYXRvcisrKCkgewotICAgICAgYXNzZXJ0KCp0aGlzKTsKLSAgICAgIGFzc2VydChjdXJyZW50XyA8IGVuZF8pOwotICAgICAgY3VycmVudF8gKz0gZW50cnlfc2l6ZV87Ci0gICAgICBpZiAoY3VycmVudF8gPT0gZW5kXykgewotICAgICAgICArK2Jsb2NrX2l0XzsKLSAgICAgICAgU3RhcnRCbG9jaygpOwotICAgICAgfQotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHZvaWQgU3RhcnRCbG9jaygpIHsKLSAgICAgIGZvciAoOyBibG9ja19pdF8gJiYgIWJsb2NrX2l0Xy0+VmFsaWRTaXplKCk7ICsrYmxvY2tfaXRfKSB7fQotICAgICAgY3VycmVudF8gPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYmxvY2tfaXRfLT5HZXQoKSk7Ci0gICAgICBlbmRfID0gY3VycmVudF8gKyBibG9ja19pdF8tPlZhbGlkU2l6ZSgpOwotICAgIH0KLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIHBvaW50ZXJzIHRvIHJhdyBtZW1vcnkKLSAgICAvLyBjdXJyZW50XyBpcyB0aGUgY3VycmVudCByZWNvcmQKLSAgICAvLyBlbmRfIGlzIHRoZSBlbmQgb2YgdGhlIGJsb2NrIChzbyB3ZSBrbm93IHdoZW4gdG8gbW92ZSB0byB0aGUgbmV4dCBibG9jaykKLSAgICB1aW50OF90ICpjdXJyZW50XywgKmVuZF87Ci0KLSAgICBzdGQ6OnNpemVfdCBlbnRyeV9zaXplXzsKLSAgICBzdGQ6OnNpemVfdCBibG9ja19zaXplXzsKLQotICAgIExpbmsgYmxvY2tfaXRfOwotfTsKLQotaW5saW5lIENoYWluICZvcGVyYXRvcj4+KENoYWluICZjaGFpbiwgU3RyZWFtICZzdHJlYW0pIHsKLSAgc3RyZWFtLkluaXQoY2hhaW4uQWRkKCkpOwotICByZXR1cm4gY2hhaW47Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIHN0cmVhbQotfSAvLyBuYW1lc3BhY2UgdXRpbAotI2VuZGlmIC8vIFVUSUxfU1RSRUFNX1NUUkVBTV9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vdGltZXIuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vdGltZXIuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NDg4YTEuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL3RpbWVyLmhoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI2lmbmRlZiBVVElMX1NUUkVBTV9USU1FUl9ICi0jZGVmaW5lIFVUSUxfU1RSRUFNX1RJTUVSX0gKLQotLy8gU29ycnkgSm9uLCB0aGlzIHdhcyBhZGRpbmcgbGlicmFyeSBkZXBlbmRlbmNpZXMgaW4gTW9zZXMgYW5kIHBlb3BsZSBjb21wbGFpbmVkLgotCi0vKiNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KLQotI2lmIEJPT1NUX1ZFUlNJT04gPj0gMTA0ODAwCi0jaW5jbHVkZSA8Ym9vc3QvdGltZXIvdGltZXIuaHBwPgotI2RlZmluZSBVVElMX1RJTUVSKHN0cikgYm9vc3Q6OnRpbWVyOjphdXRvX2NwdV90aW1lciB0aW1lcihzdGQ6OmNlcnIsIDEsIChzdHIpKQotI2Vsc2UKLS8vI3dhcm5pbmcgVXNpbmcgQm9vc3Qgb2xkZXIgdGhhbiAxLjQ4LiBUaW1pbmcgaW5mb3JtYXRpb24gd2lsbCBub3QgYmUgYXZhaWxhYmxlLiovCi0jZGVmaW5lIFVUSUxfVElNRVIoc3RyKSAKLS8vI2VuZGlmCi0KLSNlbmRpZiAvLyBVVElMX1NUUkVBTV9USU1FUl9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJpbmdfcGllY2UuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJpbmdfcGllY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMzk0YjkuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyaW5nX3BpZWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA0IFRoZSBSRTIgQXV0aG9ycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZQotLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiBzdHJpbmdfcGllY2UuaGguCi0KLSNpbmNsdWRlICJ1dGlsL3N0cmluZ19waWVjZS5oaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jaWZuZGVmIEhBVkVfSUNVCi0KLXR5cGVkZWYgU3RyaW5nUGllY2U6OnNpemVfdHlwZSBzaXplX3R5cGU7Ci0KLXZvaWQgU3RyaW5nUGllY2U6OkNvcHlUb1N0cmluZyhzdGQ6OnN0cmluZyogdGFyZ2V0KSBjb25zdCB7Ci0gIHRhcmdldC0+YXNzaWduKHB0cl8sIGxlbmd0aF8pOwotfQotCi1zaXplX3R5cGUgU3RyaW5nUGllY2U6OmZpbmQoY29uc3QgU3RyaW5nUGllY2UmIHMsIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKLSAgLy8gTm90IHN1cmUgd2h5IGxlbmd0aF8gPCAwIHdhcyBoZXJlIHNpbmNlIGl0J3Mgc3RkOjpzaXplX3QuCi0gIGlmICgvKmxlbmd0aF8gPCAwIHx8ICovcG9zID4gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihsZW5ndGhfKSkKLSAgICByZXR1cm4gbnBvczsKLQotICBjb25zdCBjaGFyKiByZXN1bHQgPSBzdGQ6OnNlYXJjaChwdHJfICsgcG9zLCBwdHJfICsgbGVuZ3RoXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wdHJfLCBzLnB0cl8gKyBzLmxlbmd0aF8pOwotICBjb25zdCBzaXplX3R5cGUgeHBvcyA9IHJlc3VsdCAtIHB0cl87Ci0gIHJldHVybiB4cG9zICsgcy5sZW5ndGhfIDw9IGxlbmd0aF8gPyB4cG9zIDogbnBvczsKLX0KLQotc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kKGNoYXIgYywgc2l6ZV90eXBlIHBvcykgY29uc3QgewotICBpZiAobGVuZ3RoXyA8PSAwIHx8IHBvcyA+PSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGxlbmd0aF8pKSB7Ci0gICAgcmV0dXJuIG5wb3M7Ci0gIH0KLSAgY29uc3QgY2hhciogcmVzdWx0ID0gc3RkOjpmaW5kKHB0cl8gKyBwb3MsIHB0cl8gKyBsZW5ndGhfLCBjKTsKLSAgcmV0dXJuIHJlc3VsdCAhPSBwdHJfICsgbGVuZ3RoXyA/IHJlc3VsdCAtIHB0cl8gOiBucG9zOwotfQotCi1zaXplX3R5cGUgU3RyaW5nUGllY2U6OnJmaW5kKGNvbnN0IFN0cmluZ1BpZWNlJiBzLCBzaXplX3R5cGUgcG9zKSBjb25zdCB7Ci0gIGlmIChsZW5ndGhfIDwgcy5sZW5ndGhfKSByZXR1cm4gbnBvczsKLSAgY29uc3Qgc2l6ZV90IHVsZW4gPSBsZW5ndGhfOwotICBpZiAocy5sZW5ndGhfID09IDApIHJldHVybiBzdGQ6Om1pbih1bGVuLCBwb3MpOwotCi0gIGNvbnN0IGNoYXIqIGxhc3QgPSBwdHJfICsgc3RkOjptaW4odWxlbiAtIHMubGVuZ3RoXywgcG9zKSArIHMubGVuZ3RoXzsKLSAgY29uc3QgY2hhciogcmVzdWx0ID0gc3RkOjpmaW5kX2VuZChwdHJfLCBsYXN0LCBzLnB0cl8sIHMucHRyXyArIHMubGVuZ3RoXyk7Ci0gIHJldHVybiByZXN1bHQgIT0gbGFzdCA/IHJlc3VsdCAtIHB0cl8gOiBucG9zOwotfQotCi1zaXplX3R5cGUgU3RyaW5nUGllY2U6OnJmaW5kKGNoYXIgYywgc2l6ZV90eXBlIHBvcykgY29uc3QgewotICBpZiAobGVuZ3RoXyA8PSAwKSByZXR1cm4gbnBvczsKLSAgZm9yIChpbnQgaSA9IHN0ZDo6bWluKHBvcywgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihsZW5ndGhfIC0gMSkpOwotICAgICAgIGkgPj0gMDsgLS1pKSB7Ci0gICAgaWYgKHB0cl9baV0gPT0gYykgewotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBucG9zOwotfQotCi0vLyBGb3IgZWFjaCBjaGFyYWN0ZXIgaW4gY2hhcmFjdGVyc193YW50ZWQsIHNldHMgdGhlIGluZGV4IGNvcnJlc3BvbmRpbmcKLS8vIHRvIHRoZSBBU0NJSSBjb2RlIG9mIHRoYXQgY2hhcmFjdGVyIHRvIDEgaW4gdGFibGUuICBUaGlzIGlzIHVzZWQgYnkKLS8vIHRoZSBmaW5kXy4qX29mIG1ldGhvZHMgYmVsb3cgdG8gdGVsbCB3aGV0aGVyIG9yIG5vdCBhIGNoYXJhY3RlciBpcyBpbgotLy8gdGhlIGxvb2t1cCB0YWJsZSBpbiBjb25zdGFudCB0aW1lLgotLy8gVGhlIGFyZ3VtZW50IGB0YWJsZScgbXVzdCBiZSBhbiBhcnJheSB0aGF0IGlzIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbAotLy8gdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBhbiB1bnNpZ25lZCBjaGFyLiAgVGh1cyBpdCBzaG91bGQgYmUgYmUgZGVjbGFyZWQKLS8vIGFzIGZvbGxvd3M6Ci0vLyAgIGJvb2wgdGFibGVbVUNIQVJfTUFYICsgMV0KLXN0YXRpYyBpbmxpbmUgdm9pZCBCdWlsZExvb2t1cFRhYmxlKGNvbnN0IFN0cmluZ1BpZWNlJiBjaGFyYWN0ZXJzX3dhbnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHRhYmxlKSB7Ci0gIGNvbnN0IHNpemVfdHlwZSBsZW5ndGggPSBjaGFyYWN0ZXJzX3dhbnRlZC5sZW5ndGgoKTsKLSAgY29uc3QgY2hhciogY29uc3QgZGF0YSA9IGNoYXJhY3RlcnNfd2FudGVkLmRhdGEoKTsKLSAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgIHRhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGRhdGFbaV0pXSA9IHRydWU7Ci0gIH0KLX0KLQotc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kX2ZpcnN0X29mKGNvbnN0IFN0cmluZ1BpZWNlJiBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKLSAgaWYgKGxlbmd0aF8gPT0gMCB8fCBzLmxlbmd0aF8gPT0gMCkKLSAgICByZXR1cm4gbnBvczsKLQotICAvLyBBdm9pZCB0aGUgY29zdCBvZiBCdWlsZExvb2t1cFRhYmxlKCkgZm9yIGEgc2luZ2xlLWNoYXJhY3RlciBzZWFyY2guCi0gIGlmIChzLmxlbmd0aF8gPT0gMSkKLSAgICByZXR1cm4gZmluZF9maXJzdF9vZihzLnB0cl9bMF0sIHBvcyk7Ci0KLSAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07Ci0gIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKLSAgZm9yIChzaXplX3R5cGUgaSA9IHBvczsgaSA8IGxlbmd0aF87ICsraSkgewotICAgIGlmIChsb29rdXBbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocHRyX1tpXSldKSB7Ci0gICAgICByZXR1cm4gaTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5wb3M7Ci19Ci0KLXNpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgU3RyaW5nUGllY2UmIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKLSAgaWYgKGxlbmd0aF8gPT0gMCkKLSAgICByZXR1cm4gbnBvczsKLQotICBpZiAocy5sZW5ndGhfID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgLy8gQXZvaWQgdGhlIGNvc3Qgb2YgQnVpbGRMb29rdXBUYWJsZSgpIGZvciBhIHNpbmdsZS1jaGFyYWN0ZXIgc2VhcmNoLgotICBpZiAocy5sZW5ndGhfID09IDEpCi0gICAgcmV0dXJuIGZpbmRfZmlyc3Rfbm90X29mKHMucHRyX1swXSwgcG9zKTsKLQotICBib29sIGxvb2t1cFtVQ0hBUl9NQVggKyAxXSA9IHsgZmFsc2UgfTsKLSAgQnVpbGRMb29rdXBUYWJsZShzLCBsb29rdXApOwotICBmb3IgKHNpemVfdHlwZSBpID0gcG9zOyBpIDwgbGVuZ3RoXzsgKytpKSB7Ci0gICAgaWYgKCFsb29rdXBbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocHRyX1tpXSldKSB7Ci0gICAgICByZXR1cm4gaTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5wb3M7Ci19Ci0KLXNpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9maXJzdF9ub3Rfb2YoY2hhciBjLCBzaXplX3R5cGUgcG9zKSBjb25zdCB7Ci0gIGlmIChsZW5ndGhfID09IDApCi0gICAgcmV0dXJuIG5wb3M7Ci0KLSAgZm9yICg7IHBvcyA8IGxlbmd0aF87ICsrcG9zKSB7Ci0gICAgaWYgKHB0cl9bcG9zXSAhPSBjKSB7Ci0gICAgICByZXR1cm4gcG9zOwotICAgIH0KLSAgfQotICByZXR1cm4gbnBvczsKLX0KLQotc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kX2xhc3Rfb2YoY29uc3QgU3RyaW5nUGllY2UmIHMsIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKLSAgaWYgKGxlbmd0aF8gPT0gMCB8fCBzLmxlbmd0aF8gPT0gMCkKLSAgICByZXR1cm4gbnBvczsKLQotICAvLyBBdm9pZCB0aGUgY29zdCBvZiBCdWlsZExvb2t1cFRhYmxlKCkgZm9yIGEgc2luZ2xlLWNoYXJhY3RlciBzZWFyY2guCi0gIGlmIChzLmxlbmd0aF8gPT0gMSkKLSAgICByZXR1cm4gZmluZF9sYXN0X29mKHMucHRyX1swXSwgcG9zKTsKLQotICBib29sIGxvb2t1cFtVQ0hBUl9NQVggKyAxXSA9IHsgZmFsc2UgfTsKLSAgQnVpbGRMb29rdXBUYWJsZShzLCBsb29rdXApOwotICBmb3IgKHNpemVfdHlwZSBpID0gc3RkOjptaW4ocG9zLCBsZW5ndGhfIC0gMSk7IDsgLS1pKSB7Ci0gICAgaWYgKGxvb2t1cFtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihwdHJfW2ldKV0pCi0gICAgICByZXR1cm4gaTsKLSAgICBpZiAoaSA9PSAwKQotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIG5wb3M7Ci19Ci0KLXNpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9sYXN0X25vdF9vZihjb25zdCBTdHJpbmdQaWVjZSYgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zKSBjb25zdCB7Ci0gIGlmIChsZW5ndGhfID09IDApCi0gICAgcmV0dXJuIG5wb3M7Ci0KLSAgc2l6ZV90eXBlIGkgPSBzdGQ6Om1pbihwb3MsIGxlbmd0aF8gLSAxKTsKLSAgaWYgKHMubGVuZ3RoXyA9PSAwKQotICAgIHJldHVybiBpOwotCi0gIC8vIEF2b2lkIHRoZSBjb3N0IG9mIEJ1aWxkTG9va3VwVGFibGUoKSBmb3IgYSBzaW5nbGUtY2hhcmFjdGVyIHNlYXJjaC4KLSAgaWYgKHMubGVuZ3RoXyA9PSAxKQotICAgIHJldHVybiBmaW5kX2xhc3Rfbm90X29mKHMucHRyX1swXSwgcG9zKTsKLQotICBib29sIGxvb2t1cFtVQ0hBUl9NQVggKyAxXSA9IHsgZmFsc2UgfTsKLSAgQnVpbGRMb29rdXBUYWJsZShzLCBsb29rdXApOwotICBmb3IgKDsgOyAtLWkpIHsKLSAgICBpZiAoIWxvb2t1cFtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihwdHJfW2ldKV0pCi0gICAgICByZXR1cm4gaTsKLSAgICBpZiAoaSA9PSAwKQotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIG5wb3M7Ci19Ci0KLXNpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9sYXN0X25vdF9vZihjaGFyIGMsIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKLSAgaWYgKGxlbmd0aF8gPT0gMCkKLSAgICByZXR1cm4gbnBvczsKLQotICBmb3IgKHNpemVfdHlwZSBpID0gc3RkOjptaW4ocG9zLCBsZW5ndGhfIC0gMSk7IDsgLS1pKSB7Ci0gICAgaWYgKHB0cl9baV0gIT0gYykKLSAgICAgIHJldHVybiBpOwotICAgIGlmIChpID09IDApCi0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gbnBvczsKLX0KLQotU3RyaW5nUGllY2UgU3RyaW5nUGllY2U6OnN1YnN0cihzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3QgewotICBpZiAocG9zID4gbGVuZ3RoXykgcG9zID0gbGVuZ3RoXzsKLSAgaWYgKG4gPiBsZW5ndGhfIC0gcG9zKSBuID0gbGVuZ3RoXyAtIHBvczsKLSAgcmV0dXJuIFN0cmluZ1BpZWNlKHB0cl8gKyBwb3MsIG4pOwotfQotCi1jb25zdCBzaXplX3R5cGUgU3RyaW5nUGllY2U6Om5wb3MgPSBzaXplX3R5cGUoLTEpOwotCi0jZW5kaWYgLy8gIUhBVkVfSUNVCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJpbmdfcGllY2UuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJpbmdfcGllY2UuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNGUyNTQuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyaW5nX3BpZWNlLmhoCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qIElmIHlvdSB1c2UgSUNVIGluIHlvdXIgcHJvZ3JhbSwgdGhlbiBjb21waWxlIHdpdGggLURIQVZFX0lDVSAtbGljdWkxOG4uICBJZgotICogeW91IGRvbid0IHVzZSBJQ1UsIHRoZW4gdGhpcyB3aWxsIHVzZSB0aGUgR29vZ2xlIGltcGxlbWVudGF0aW9uIGZyb20gQ2hyb21lLgotICogVGhpcyBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHRvIGxldCB5b3UgY2hvb3NlLgotICovCi0KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vIENvcGllZCBmcm9tIHN0cmluZ3Mvc3RyaW5ncGllY2UuaCB3aXRoIG1vZGlmaWNhdGlvbnMKLS8vCi0vLyBBIHN0cmluZy1saWtlIG9iamVjdCB0aGF0IHBvaW50cyB0byBhIHNpemVkIHBpZWNlIG9mIG1lbW9yeS4KLS8vCi0vLyBGdW5jdGlvbnMgb3IgbWV0aG9kcyBtYXkgdXNlIGNvbnN0IFN0cmluZ1BpZWNlJiBwYXJhbWV0ZXJzIHRvIGFjY2VwdCBlaXRoZXIKLS8vIGEgImNvbnN0IGNoYXIqIiBvciBhICJzdHJpbmciIHZhbHVlIHRoYXQgd2lsbCBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bwotLy8gYSBTdHJpbmdQaWVjZS4gIFRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIG1lYW5zIHRoYXQgaXQgaXMgb2Z0ZW4gYXBwcm9wcmlhdGUKLS8vIHRvIGluY2x1ZGUgdGhpcyAuaCBmaWxlIGluIG90aGVyIGZpbGVzIHJhdGhlciB0aGFuIGZvcndhcmQtZGVjbGFyaW5nCi0vLyBTdHJpbmdQaWVjZSBhcyB3b3VsZCBiZSBhcHByb3ByaWF0ZSBmb3IgbW9zdCBvdGhlciBHb29nbGUgY2xhc3Nlcy4KLS8vCi0vLyBTeXN0ZW1hdGljIHVzYWdlIG9mIFN0cmluZ1BpZWNlIGlzIGVuY291cmFnZWQgYXMgaXQgd2lsbCByZWR1Y2UgdW5uZWNlc3NhcnkKLS8vIGNvbnZlcnNpb25zIGZyb20gImNvbnN0IGNoYXIqIiB0byAic3RyaW5nIiBhbmQgYmFjayBhZ2Fpbi4KLS8vCi0KLSNpZm5kZWYgVVRJTF9TVFJJTkdfUElFQ0VfSAotI2RlZmluZSBVVElMX1NUUklOR19QSUVDRV9ICi0KLSNpbmNsdWRlICJ1dGlsL2hhdmUuaGgiCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGlvc2Z3ZD4KLSNpbmNsdWRlIDxvc3RyZWFtPgotCi0jaWZkZWYgSEFWRV9JQ1UKLSNpbmNsdWRlIDx1bmljb2RlL3N0cmluZ3BpZWNlLmg+Ci0jaW5jbHVkZSA8dW5pY29kZS91dmVyc2lvbi5oPgotCi0vLyBPbGQgdmVyc2lvbnMgb2YgSUNVIGRvbid0IGRlZmluZSBvcGVyYXRvcj09IGFuZCBvcGVyYXRvciE9LgotI2lmIChVX0lDVV9WRVJTSU9OX01BSk9SX05VTSA8IDQpIHx8ICgoVV9JQ1VfVkVSU0lPTl9NQUpPUl9OVU0gPT0gNCkgJiYgKFVfSUNVX1ZFUlNJT05fTUlOT1JfTlVNIDwgNCkpCi0jd2FybmluZyBZb3UgYXJlIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIG9mIElDVS4gIENvbnNpZGVyIHVwZ3JhZGluZyB0byBJQ1UgPj0gNC42LgotaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJpbmdQaWVjZSYgeCwgY29uc3QgU3RyaW5nUGllY2UmIHkpIHsKLSAgaWYgKHguc2l6ZSgpICE9IHkuc2l6ZSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gc3RkOjptZW1jbXAoeC5kYXRhKCksIHkuZGF0YSgpLCB4LnNpemUoKSkgPT0gMDsKLX0KLQotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJpbmdQaWVjZSYgeCwgY29uc3QgU3RyaW5nUGllY2UmIHkpIHsKLSAgcmV0dXJuICEoeCA9PSB5KTsKLX0KLSNlbmRpZiAvLyBvbGQgdmVyc2lvbiBvZiBJQ1UKLQotVV9OQU1FU1BBQ0VfQkVHSU4KLQotaW5saW5lIGJvb2wgc3RhcnRzX3dpdGgoY29uc3QgU3RyaW5nUGllY2UmIGxvbmdlciwgY29uc3QgU3RyaW5nUGllY2UmIHByZWZpeCkgewotICBpbnQgbG9uZ2Vyc2l6ZSA9IGxvbmdlci5zaXplKCksIHByZWZpeHNpemUgPSBwcmVmaXguc2l6ZSgpOwotICByZXR1cm4gbG9uZ2Vyc2l6ZSA+PSBwcmVmaXhzaXplICYmIHN0ZDo6bWVtY21wKGxvbmdlci5kYXRhKCksIHByZWZpeC5kYXRhKCksIHByZWZpeHNpemUpID09IDA7Ci19Ci0KLSNlbHNlCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZmRlZiBXSU4zMgotI3VuZGVmIG1heAotI3VuZGVmIG1pbgotI2VuZGlmCi0KLWNsYXNzIFN0cmluZ1BpZWNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IGNoYXIqICAgcHRyXzsKLSAgc2l6ZV90eXBlICAgICBsZW5ndGhfOwotCi0gcHVibGljOgotICAvLyBXZSBwcm92aWRlIG5vbi1leHBsaWNpdCBzaW5nbGV0b24gY29uc3RydWN0b3JzIHNvIHVzZXJzIGNhbiBwYXNzCi0gIC8vIGluIGEgImNvbnN0IGNoYXIqIiBvciBhICJzdHJpbmciIHdoZXJldmVyIGEgIlN0cmluZ1BpZWNlIiBpcwotICAvLyBleHBlY3RlZC4KLSAgU3RyaW5nUGllY2UoKSA6IHB0cl8oTlVMTCksIGxlbmd0aF8oMCkgeyB9Ci0gIFN0cmluZ1BpZWNlKGNvbnN0IGNoYXIqIHN0cikKLSAgICA6IHB0cl8oc3RyKSwgbGVuZ3RoXygoc3RyID09IE5VTEwpID8gMCA6IHN0cmxlbihzdHIpKSB7IH0KLSAgU3RyaW5nUGllY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikKLSAgICA6IHB0cl8oc3RyLmRhdGEoKSksIGxlbmd0aF8oc3RyLnNpemUoKSkgeyB9Ci0gIFN0cmluZ1BpZWNlKGNvbnN0IGNoYXIqIG9mZnNldCwgc2l6ZV90eXBlIGxlbikKLSAgICA6IHB0cl8ob2Zmc2V0KSwgbGVuZ3RoXyhsZW4pIHsgfQotCi0gIC8vIGRhdGEoKSBtYXkgcmV0dXJuIGEgcG9pbnRlciB0byBhIGJ1ZmZlciB3aXRoIGVtYmVkZGVkIE5VTHMsIGFuZCB0aGUKLSAgLy8gcmV0dXJuZWQgYnVmZmVyIG1heSBvciBtYXkgbm90IGJlIG51bGwgdGVybWluYXRlZC4gIFRoZXJlZm9yZSBpdCBpcwotICAvLyB0eXBpY2FsbHkgYSBtaXN0YWtlIHRvIHBhc3MgZGF0YSgpIHRvIGEgcm91dGluZSB0aGF0IGV4cGVjdHMgYSBOVUwKLSAgLy8gdGVybWluYXRlZCBzdHJpbmcuCi0gIGNvbnN0IGNoYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9Ci0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXzsgfQotICBzaXplX3R5cGUgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXzsgfQotICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXyA9PSAwOyB9Ci0KLSAgdm9pZCBjbGVhcigpIHsgcHRyXyA9IE5VTEw7IGxlbmd0aF8gPSAwOyB9Ci0gIHZvaWQgc2V0KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdHlwZSBsZW4pIHsgcHRyXyA9IGRhdGE7IGxlbmd0aF8gPSBsZW47IH0KLSAgdm9pZCBzZXQoY29uc3QgY2hhciogc3RyKSB7Ci0gICAgcHRyXyA9IHN0cjsKLSAgICBsZW5ndGhfID0gc3RyID8gc3RybGVuKHN0cikgOiAwOwotICB9Ci0gIHZvaWQgc2V0KGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdHlwZSBsZW4pIHsKLSAgICBwdHJfID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSk7Ci0gICAgbGVuZ3RoXyA9IGxlbjsKLSAgfQotCi0gIGNoYXIgb3BlcmF0b3JbXShzaXplX3R5cGUgaSkgY29uc3QgeyByZXR1cm4gcHRyX1tpXTsgfQotCi0gIHZvaWQgcmVtb3ZlX3ByZWZpeChzaXplX3R5cGUgbikgewotICAgIHB0cl8gKz0gbjsKLSAgICBsZW5ndGhfIC09IG47Ci0gIH0KLQotICB2b2lkIHJlbW92ZV9zdWZmaXgoc2l6ZV90eXBlIG4pIHsKLSAgICBsZW5ndGhfIC09IG47Ci0gIH0KLQotICBpbnQgY29tcGFyZShjb25zdCBTdHJpbmdQaWVjZSYgeCkgY29uc3QgewotICAgIGludCByID0gd29yZG1lbWNtcChwdHJfLCB4LnB0cl8sIHN0ZDo6bWluKGxlbmd0aF8sIHgubGVuZ3RoXykpOwotICAgIGlmIChyID09IDApIHsKLSAgICAgIGlmIChsZW5ndGhfIDwgeC5sZW5ndGhfKSByID0gLTE7Ci0gICAgICBlbHNlIGlmIChsZW5ndGhfID4geC5sZW5ndGhfKSByID0gKzE7Ci0gICAgfQotICAgIHJldHVybiByOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgYXNfc3RyaW5nKCkgY29uc3QgewotICAgIC8vIHN0ZDo6c3RyaW5nIGRvZXNuJ3QgbGlrZSB0byB0YWtlIGEgTlVMTCBwb2ludGVyIGV2ZW4gd2l0aCBhIDAgc2l6ZS4KLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIWVtcHR5KCkgPyBkYXRhKCkgOiAiIiwgc2l6ZSgpKTsKLSAgfQotCi0gIHZvaWQgQ29weVRvU3RyaW5nKHN0ZDo6c3RyaW5nKiB0YXJnZXQpIGNvbnN0OwotICB2b2lkIEFwcGVuZFRvU3RyaW5nKHN0ZDo6c3RyaW5nKiB0YXJnZXQpIGNvbnN0OwotCi0gIC8vIERvZXMgInRoaXMiIHN0YXJ0IHdpdGggIngiCi0gIGJvb2wgc3RhcnRzX3dpdGgoY29uc3QgU3RyaW5nUGllY2UmIHgpIGNvbnN0IHsKLSAgICByZXR1cm4gKChsZW5ndGhfID49IHgubGVuZ3RoXykgJiYKLSAgICAgICAgICAgICh3b3JkbWVtY21wKHB0cl8sIHgucHRyXywgeC5sZW5ndGhfKSA9PSAwKSk7Ci0gIH0KLQotICAvLyBEb2VzICJ0aGlzIiBlbmQgd2l0aCAieCIKLSAgYm9vbCBlbmRzX3dpdGgoY29uc3QgU3RyaW5nUGllY2UmIHgpIGNvbnN0IHsKLSAgICByZXR1cm4gKChsZW5ndGhfID49IHgubGVuZ3RoXykgJiYKLSAgICAgICAgICAgICh3b3JkbWVtY21wKHB0cl8gKyAobGVuZ3RoXy14Lmxlbmd0aF8pLCB4LnB0cl8sIHgubGVuZ3RoXykgPT0gMCkpOwotICB9Ci0KLSAgLy8gc3RhbmRhcmQgU1RMIGNvbnRhaW5lciBib2lsZXJwbGF0ZQotICB0eXBlZGVmIGNoYXIgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBjb25zdCBjaGFyKiBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IGNoYXImIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBjb25zdCBjaGFyJiBjb25zdF9yZWZlcmVuY2U7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLSAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBucG9zOwotICB0eXBlZGVmIGNvbnN0IGNoYXIqIGNvbnN0X2l0ZXJhdG9yOwotICB0eXBlZGVmIGNvbnN0IGNoYXIqIGl0ZXJhdG9yOwotICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKLSAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7Ci0gIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQotICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBwdHJfICsgbGVuZ3RoXzsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihwdHJfICsgbGVuZ3RoXyk7Ci0gIH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgewotICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHB0cl8pOwotICB9Ci0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXzsgfQotICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBsZW5ndGhfOyB9Ci0KLSAgc2l6ZV90eXBlIGNvcHkoY2hhciogYnVmLCBzaXplX3R5cGUgbiwgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OwotCi0gIHNpemVfdHlwZSBmaW5kKGNvbnN0IFN0cmluZ1BpZWNlJiBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7Ci0gIHNpemVfdHlwZSBmaW5kKGNoYXIgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OwotICBzaXplX3R5cGUgcmZpbmQoY29uc3QgU3RyaW5nUGllY2UmIHMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKLSAgc2l6ZV90eXBlIHJmaW5kKGNoYXIgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OwotCi0gIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IFN0cmluZ1BpZWNlJiBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7Ci0gIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNoYXIgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IHsKLSAgICByZXR1cm4gZmluZChjLCBwb3MpOwotICB9Ci0gIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBTdHJpbmdQaWVjZSYgcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OwotICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY2hhciBjLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7Ci0gIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3QgU3RyaW5nUGllY2UmIHMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjaGFyIGMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJmaW5kKGMsIHBvcyk7Ci0gIH0KLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgU3RyaW5nUGllY2UmIHMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKLSAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY2hhciBjLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7Ci0KLSAgU3RyaW5nUGllY2Ugc3Vic3RyKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuID0gbnBvcykgY29uc3Q7Ci0KLSAgc3RhdGljIGludCB3b3JkbWVtY21wKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIHAyLCBzaXplX3R5cGUgTikgewotICAgIHJldHVybiBzdGQ6Om1lbWNtcChwLCBwMiwgTik7Ci0gIH0KLX07Ci0KLWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RyaW5nUGllY2UmIHgsIGNvbnN0IFN0cmluZ1BpZWNlJiB5KSB7Ci0gIGlmICh4LnNpemUoKSAhPSB5LnNpemUoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHN0ZDo6bWVtY21wKHguZGF0YSgpLCB5LmRhdGEoKSwgeC5zaXplKCkpID09IDA7Ci19Ci0KLWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RyaW5nUGllY2UmIHgsIGNvbnN0IFN0cmluZ1BpZWNlJiB5KSB7Ci0gIHJldHVybiAhKHggPT0geSk7Ci19Ci0KLWlubGluZSBib29sIHN0YXJ0c193aXRoKGNvbnN0IFN0cmluZ1BpZWNlJiBsb25nZXIsIGNvbnN0IFN0cmluZ1BpZWNlJiBwcmVmaXgpIHsKLSAgcmV0dXJuIGxvbmdlci5zdGFydHNfd2l0aChwcmVmaXgpOwotfQotCi0jZW5kaWYgLy8gSEFWRV9JQ1UgdW5kZWZpbmVkCi0KLWlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBTdHJpbmdQaWVjZSYgeCwgY29uc3QgU3RyaW5nUGllY2UmIHkpIHsKLSAgY29uc3QgaW50IHIgPSBzdGQ6Om1lbWNtcCh4LmRhdGEoKSwgeS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbih4LnNpemUoKSwgeS5zaXplKCkpKTsKLSAgcmV0dXJuICgociA8IDApIHx8ICgociA9PSAwKSAmJiAoeC5zaXplKCkgPCB5LnNpemUoKSkpKTsKLX0KLQotaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFN0cmluZ1BpZWNlJiB4LCBjb25zdCBTdHJpbmdQaWVjZSYgeSkgewotICByZXR1cm4geSA8IHg7Ci19Ci0KLWlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgU3RyaW5nUGllY2UmIHgsIGNvbnN0IFN0cmluZ1BpZWNlJiB5KSB7Ci0gIHJldHVybiAhKHggPiB5KTsKLX0KLQotaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBTdHJpbmdQaWVjZSYgeCwgY29uc3QgU3RyaW5nUGllY2UmIHkpIHsKLSAgcmV0dXJuICEoeCA8IHkpOwotfQotCi0vLyBhbGxvdyBTdHJpbmdQaWVjZSB0byBiZSBsb2dnZWQgKG5lZWRlZCBmb3IgdW5pdCB0ZXN0aW5nKS4KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvLCBjb25zdCBTdHJpbmdQaWVjZSYgcGllY2UpIHsKLSAgcmV0dXJuIG8ud3JpdGUocGllY2UuZGF0YSgpLCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KHBpZWNlLnNpemUoKSkpOwotfQotCi0jaWZkZWYgSEFWRV9JQ1UKLVVfTkFNRVNQQUNFX0VORAotdXNpbmcgVV9OQU1FU1BBQ0VfUVVBTElGSUVSIFN0cmluZ1BpZWNlOwotI2VuZGlmCi0KLSNlbmRpZiAgLy8gVVRJTF9TVFJJTkdfUElFQ0VfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvdGhyZWFkX3Bvb2wuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC90aHJlYWRfcG9vbC5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhODgzYS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC90aHJlYWRfcG9vbC5oaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSNpZm5kZWYgVVRJTF9USFJFQURfUE9PTF9ICi0jZGVmaW5lIFVUSUxfVEhSRUFEX1BPT0xfSAotCi0jaW5jbHVkZSAidXRpbC9wY3F1ZXVlLmhoIgotCi0jaW5jbHVkZSA8Ym9vc3QvcHRyX2NvbnRhaW5lci9wdHJfdmVjdG9yLmhwcD4KLSNpbmNsdWRlIDxib29zdC9vcHRpb25hbC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLQotdGVtcGxhdGUgPGNsYXNzIEhhbmRsZXJUPiBjbGFzcyBXb3JrZXIgOiBib29zdDo6bm9uY29weWFibGUgewotICBwdWJsaWM6Ci0gICAgdHlwZWRlZiBIYW5kbGVyVCBIYW5kbGVyOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgSGFuZGxlcjo6UmVxdWVzdCBSZXF1ZXN0OwotCi0gICAgdGVtcGxhdGUgPGNsYXNzIENvbnN0cnVjdD4gV29ya2VyKFBDUXVldWU8UmVxdWVzdD4gJmluLCBDb25zdHJ1Y3QgJmNvbnN0cnVjdCwgY29uc3QgUmVxdWVzdCAmcG9pc29uKQotICAgICAgOiBpbl8oaW4pLCBoYW5kbGVyXyhjb25zdHJ1Y3QpLCBwb2lzb25fKHBvaXNvbiksIHRocmVhZF8oYm9vc3Q6OnJlZigqdGhpcykpIHt9Ci0KLSAgICAvLyBPbmx5IGNhbGwgZnJvbSB0aHJlYWQuCi0gICAgdm9pZCBvcGVyYXRvcigpKCkgewotICAgICAgUmVxdWVzdCByZXF1ZXN0OwotICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaW5fLkNvbnN1bWUocmVxdWVzdCk7Ci0gICAgICAgIGlmIChyZXF1ZXN0ID09IHBvaXNvbl8pIHJldHVybjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAoKmhhbmRsZXJfKShyZXF1ZXN0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmZSkgewotICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiSGFuZGxlciB0aHJldyAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICBhYm9ydCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKC4uLikgewotICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiSGFuZGxlciB0aHJldyBhbiBleGNlcHRpb24sIGRyb3BwaW5nIHJlcXVlc3QiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICBhYm9ydCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBKb2luKCkgewotICAgICAgdGhyZWFkXy5qb2luKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgUENRdWV1ZTxSZXF1ZXN0PiAmaW5fOwotCi0gICAgYm9vc3Q6Om9wdGlvbmFsPEhhbmRsZXI+IGhhbmRsZXJfOwotICAgIAotICAgIGNvbnN0IFJlcXVlc3QgcG9pc29uXzsKLQotICAgIGJvb3N0Ojp0aHJlYWQgdGhyZWFkXzsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBIYW5kbGVyVD4gY2xhc3MgVGhyZWFkUG9vbCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Ci0gIHB1YmxpYzoKLSAgICB0eXBlZGVmIEhhbmRsZXJUIEhhbmRsZXI7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBIYW5kbGVyOjpSZXF1ZXN0IFJlcXVlc3Q7Ci0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ29uc3RydWN0PiBUaHJlYWRQb29sKHNpemVfdCBxdWV1ZV9sZW5ndGgsIHNpemVfdCB3b3JrZXJzLCBDb25zdHJ1Y3QgaGFuZGxlcl9jb25zdHJ1Y3QsIFJlcXVlc3QgcG9pc29uKSA6IGluXyhxdWV1ZV9sZW5ndGgpLCBwb2lzb25fKHBvaXNvbikgewotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3b3JrZXJzOyArK2kpIHsKLSAgICAgICAgd29ya2Vyc18ucHVzaF9iYWNrKG5ldyBXb3JrZXI8SGFuZGxlcj4oaW5fLCBoYW5kbGVyX2NvbnN0cnVjdCwgcG9pc29uKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgflRocmVhZFBvb2woKSB7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmtlcnNfLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFByb2R1Y2UocG9pc29uXyk7Ci0gICAgICB9Ci0gICAgICBmb3IgKHR5cGVuYW1lIGJvb3N0OjpwdHJfdmVjdG9yPFdvcmtlcjxIYW5kbGVyPiA+OjppdGVyYXRvciBpID0gd29ya2Vyc18uYmVnaW4oKTsgaSAhPSB3b3JrZXJzXy5lbmQoKTsgKytpKSB7Ci0gICAgICAgIGktPkpvaW4oKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIFByb2R1Y2UoY29uc3QgUmVxdWVzdCAmcmVxdWVzdCkgewotICAgICAgaW5fLlByb2R1Y2UocmVxdWVzdCk7Ci0gICAgfQotCi0gICAgLy8gRm9yIGFkZGluZyB0byB0aGUgcXVldWUuCi0gICAgUENRdWV1ZTxSZXF1ZXN0PiAmSW4oKSB7IHJldHVybiBpbl87IH0KLQotICBwcml2YXRlOgotICAgIFBDUXVldWU8UmVxdWVzdD4gaW5fOwotCi0gICAgYm9vc3Q6OnB0cl92ZWN0b3I8V29ya2VyPEhhbmRsZXI+ID4gd29ya2Vyc187Ci0KLSAgICBSZXF1ZXN0IHBvaXNvbl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSB1dGlsCi0KLSNlbmRpZiAvLyBVVElMX1RIUkVBRF9QT09MX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3Rva2VuaXplX3BpZWNlLmhoIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvdG9rZW5pemVfcGllY2UuaGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOGM4ZGEuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvdG9rZW5pemVfcGllY2UuaGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotI2lmbmRlZiBVVElMX1RPS0VOSVpFX1BJRUNFX0gKLSNkZWZpbmUgVVRJTF9UT0tFTklaRV9QSUVDRV9ICi0KLSNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKLSNpbmNsdWRlICJ1dGlsL3N0cmluZ19waWVjZS5oaCIKLQotI2luY2x1ZGUgPGJvb3N0L2l0ZXJhdG9yL2l0ZXJhdG9yX2ZhY2FkZS5ocHA+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotbmFtZXNwYWNlIHV0aWwgewotCi0vLyBUaHJvd24gb24gZGVyZWZlcmVuY2Ugd2hlbiBvdXQgb2YgdG9rZW5zIHRvIHBhcnNlCi1jbGFzcyBPdXRPZlRva2VucyA6IHB1YmxpYyBFeGNlcHRpb24gewotICBwdWJsaWM6Ci0gICAgT3V0T2ZUb2tlbnMoKSB0aHJvdygpIHt9Ci0gICAgfk91dE9mVG9rZW5zKCkgdGhyb3coKSB7fQotfTsKLQotY2xhc3MgU2luZ2xlQ2hhcmFjdGVyIHsKLSAgcHVibGljOgotICAgIFNpbmdsZUNoYXJhY3RlcigpIHt9Ci0gICAgZXhwbGljaXQgU2luZ2xlQ2hhcmFjdGVyKGNoYXIgZGVsaW0pIDogZGVsaW1fKGRlbGltKSB7fQotCi0gICAgU3RyaW5nUGllY2UgRmluZChjb25zdCBTdHJpbmdQaWVjZSAmaW4pIGNvbnN0IHsKLSAgICAgIHJldHVybiBTdHJpbmdQaWVjZShzdGQ6OmZpbmQoaW4uZGF0YSgpLCBpbi5kYXRhKCkgKyBpbi5zaXplKCksIGRlbGltXyksIDEpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIGNoYXIgZGVsaW1fOwotfTsKLQotY2xhc3MgTXVsdGlDaGFyYWN0ZXIgewotICBwdWJsaWM6Ci0gICAgTXVsdGlDaGFyYWN0ZXIoKSB7fQotCi0gICAgZXhwbGljaXQgTXVsdGlDaGFyYWN0ZXIoY29uc3QgU3RyaW5nUGllY2UgJmRlbGltaXRlcikgOiBkZWxpbWl0ZXJfKGRlbGltaXRlcikge30KLQotICAgIFN0cmluZ1BpZWNlIEZpbmQoY29uc3QgU3RyaW5nUGllY2UgJmluKSBjb25zdCB7Ci0gICAgICByZXR1cm4gU3RyaW5nUGllY2Uoc3RkOjpzZWFyY2goaW4uZGF0YSgpLCBpbi5kYXRhKCkgKyBpbi5zaXplKCksIGRlbGltaXRlcl8uZGF0YSgpLCBkZWxpbWl0ZXJfLmRhdGEoKSArIGRlbGltaXRlcl8uc2l6ZSgpKSwgZGVsaW1pdGVyXy5zaXplKCkpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIFN0cmluZ1BpZWNlIGRlbGltaXRlcl87Ci19OwotCi1jbGFzcyBBbnlDaGFyYWN0ZXIgewotICBwdWJsaWM6Ci0gICAgQW55Q2hhcmFjdGVyKCkge30KLSAgICBleHBsaWNpdCBBbnlDaGFyYWN0ZXIoY29uc3QgU3RyaW5nUGllY2UgJmNoYXJzKSA6IGNoYXJzXyhjaGFycykge30KLQotICAgIFN0cmluZ1BpZWNlIEZpbmQoY29uc3QgU3RyaW5nUGllY2UgJmluKSBjb25zdCB7Ci0gICAgICByZXR1cm4gU3RyaW5nUGllY2Uoc3RkOjpmaW5kX2ZpcnN0X29mKGluLmRhdGEoKSwgaW4uZGF0YSgpICsgaW4uc2l6ZSgpLCBjaGFyc18uZGF0YSgpLCBjaGFyc18uZGF0YSgpICsgY2hhcnNfLnNpemUoKSksIDEpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIFN0cmluZ1BpZWNlIGNoYXJzXzsKLX07Ci0KLWNsYXNzIEJvb2xDaGFyYWN0ZXIgewotICBwdWJsaWM6Ci0gICAgQm9vbENoYXJhY3RlcigpIHt9Ci0KLSAgICBleHBsaWNpdCBCb29sQ2hhcmFjdGVyKGNvbnN0IGJvb2wgKmRlbGltaXRlcikgeyBkZWxpbWl0ZXJfID0gZGVsaW1pdGVyOyB9Ci0KLSAgICBTdHJpbmdQaWVjZSBGaW5kKGNvbnN0IFN0cmluZ1BpZWNlICZpbikgY29uc3QgewotICAgICAgZm9yIChjb25zdCBjaGFyICppID0gaW4uZGF0YSgpOyBpICE9IGluLmRhdGEoKSArIGluLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChkZWxpbWl0ZXJfW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCppKV0pIHJldHVybiBTdHJpbmdQaWVjZShpLCAxKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBTdHJpbmdQaWVjZShpbi5kYXRhKCkgKyBpbi5zaXplKCksIDApOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx1bnNpZ25lZCBMZW5ndGg+IHN0YXRpYyB2b2lkIEJ1aWxkKGNvbnN0IGNoYXIgKCZjaGFyYWN0ZXJzKVtMZW5ndGhdLCBib29sICgmb3V0KVsyNTZdKSB7Ci0gICAgICBtZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0gICAgICBmb3IgKGNvbnN0IGNoYXIgKmkgPSBjaGFyYWN0ZXJzOyBpICE9IGNoYXJhY3RlcnMgKyBMZW5ndGg7ICsraSkgewotICAgICAgICBvdXRbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKmkpXSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgYm9vbCAqZGVsaW1pdGVyXzsKLX07Ci0KLWNsYXNzIEFueUNoYXJhY3Rlckxhc3QgewotICBwdWJsaWM6Ci0gICAgQW55Q2hhcmFjdGVyTGFzdCgpIHt9Ci0KLSAgICBleHBsaWNpdCBBbnlDaGFyYWN0ZXJMYXN0KGNvbnN0IFN0cmluZ1BpZWNlICZjaGFycykgOiBjaGFyc18oY2hhcnMpIHt9Ci0KLSAgICBTdHJpbmdQaWVjZSBGaW5kKGNvbnN0IFN0cmluZ1BpZWNlICZpbikgY29uc3QgewotICAgICAgcmV0dXJuIFN0cmluZ1BpZWNlKHN0ZDo6ZmluZF9lbmQoaW4uZGF0YSgpLCBpbi5kYXRhKCkgKyBpbi5zaXplKCksIGNoYXJzXy5kYXRhKCksIGNoYXJzXy5kYXRhKCkgKyBjaGFyc18uc2l6ZSgpKSwgMSk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgU3RyaW5nUGllY2UgY2hhcnNfOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIEZpbmQsIGJvb2wgU2tpcEVtcHR5ID0gZmFsc2U+IGNsYXNzIFRva2VuSXRlciA6IHB1YmxpYyBib29zdDo6aXRlcmF0b3JfZmFjYWRlPFRva2VuSXRlcjxGaW5kLCBTa2lwRW1wdHk+LCBjb25zdCBTdHJpbmdQaWVjZSwgYm9vc3Q6OmZvcndhcmRfdHJhdmVyc2FsX3RhZz4gewotICBwdWJsaWM6Ci0gICAgVG9rZW5JdGVyKCkge30KLQotICAgIHRlbXBsYXRlIDxjbGFzcyBDb25zdHJ1Y3Q+IFRva2VuSXRlcihjb25zdCBTdHJpbmdQaWVjZSAmc3RyLCBjb25zdCBDb25zdHJ1Y3QgJmNvbnN0cnVjdCkgOiBhZnRlcl8oc3RyKSwgZmluZGVyXyhjb25zdHJ1Y3QpIHsKLSAgICAgIGluY3JlbWVudCgpOwotICAgIH0KLQotICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgewotICAgICAgcmV0dXJuIGN1cnJlbnRfLmRhdGEoKSA9PSAwOwotICAgIH0KLSAgICBvcGVyYXRvciBib29sKCkgY29uc3QgewotICAgICAgcmV0dXJuIGN1cnJlbnRfLmRhdGEoKSAhPSAwOwotICAgIH0KLQotICAgIHN0YXRpYyBUb2tlbkl0ZXI8RmluZCwgU2tpcEVtcHR5PiBlbmQoKSB7Ci0gICAgICByZXR1cm4gVG9rZW5JdGVyPEZpbmQsIFNraXBFbXB0eT4oKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgYm9vc3Q6Oml0ZXJhdG9yX2NvcmVfYWNjZXNzOwotCi0gICAgdm9pZCBpbmNyZW1lbnQoKSB7Ci0gICAgICBkbyB7Ci0gICAgICAgIFN0cmluZ1BpZWNlIGZvdW5kKGZpbmRlcl8uRmluZChhZnRlcl8pKTsKLSAgICAgICAgY3VycmVudF8gPSBTdHJpbmdQaWVjZShhZnRlcl8uZGF0YSgpLCBmb3VuZC5kYXRhKCkgLSBhZnRlcl8uZGF0YSgpKTsKLSAgICAgICAgaWYgKGZvdW5kLmRhdGEoKSA9PSBhZnRlcl8uZGF0YSgpICsgYWZ0ZXJfLnNpemUoKSkgewotICAgICAgICAgIGFmdGVyXyA9IFN0cmluZ1BpZWNlKE5VTEwsIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFmdGVyXyA9IFN0cmluZ1BpZWNlKGZvdW5kLmRhdGEoKSArIGZvdW5kLnNpemUoKSwgYWZ0ZXJfLmRhdGEoKSAtIGZvdW5kLmRhdGEoKSArIGFmdGVyXy5zaXplKCkgLSBmb3VuZC5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICB9IHdoaWxlIChTa2lwRW1wdHkgJiYgY3VycmVudF8uZGF0YSgpICYmIGN1cnJlbnRfLmVtcHR5KCkpOyAvLyBDb21waWxlciBzaG91bGQgb3B0aW1pemUgdGhpcyBhd2F5IGlmIFNraXBFbXB0eSBpcyBmYWxzZS4gIAotICAgIH0KLQotICAgIGJvb2wgZXF1YWwoY29uc3QgVG9rZW5JdGVyPEZpbmQsIFNraXBFbXB0eT4gJm90aGVyKSBjb25zdCB7Ci0gICAgICByZXR1cm4gY3VycmVudF8uZGF0YSgpID09IG90aGVyLmN1cnJlbnRfLmRhdGEoKTsKLSAgICB9Ci0KLSAgICBjb25zdCBTdHJpbmdQaWVjZSAmZGVyZWZlcmVuY2UoKSBjb25zdCB7Ci0gICAgICBVVElMX1RIUk9XX0lGKCFjdXJyZW50Xy5kYXRhKCksIE91dE9mVG9rZW5zLCAiUmFuIG91dCBvZiB0b2tlbnMiKTsKLSAgICAgIHJldHVybiBjdXJyZW50XzsKLSAgICB9Ci0KLSAgICBTdHJpbmdQaWVjZSBjdXJyZW50XzsKLSAgICBTdHJpbmdQaWVjZSBhZnRlcl87Ci0KLSAgICBGaW5kIGZpbmRlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSB1dGlsCi0KLSNlbmRpZiAvLyBVVElMX1RPS0VOSVpFX1BJRUNFX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3VuaXN0ZC5oaCBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3VuaXN0ZC5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3OWM0OS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC91bmlzdGQuaGgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jaWZuZGVmIFVUSUxfVU5JU1REX0gKLSNkZWZpbmUgVVRJTF9VTklTVERfSAotCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotCi0vLyBXaW5kb3dzIGRvZXNuJ3QgZGVmaW5lIDx1bmlzdGQuaD4KLS8vCi0vLyBTbyB3ZSBkZWZpbmUgd2hhdCB3ZSBuZWVkIGhlcmUgaW5zdGVhZDoKLS8vCi0jZGVmaW5lIFNURElOX0ZJTEVOTz0wCi0jZGVmaW5lIFNURE9VVF9GSUxFTk89MQotCi0KLSNlbHNlIC8vIEh1enphaCBmb3IgUE9TSVghCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2VuZGlmCi0KLQotCi0jZW5kaWYgLy8gVVRJTF9VTklTVERfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvdXNhZ2UuY2MgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC91c2FnZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5NzMwMC4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC91c2FnZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0jaW5jbHVkZSAidXRpbC91c2FnZS5oaCIKLQotI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxvc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKLS8vIFRoaXMgY29kZSBsaWZ0ZWQgZnJvbSBwaHlzbWVtLmMgaW4gZ251bGliLiAgU2VlIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50Ci0vLyBiZWxvdy4gIAotIyBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0vKiAgTUVNT1JZU1RBVFVTRVggaXMgbWlzc2luZyBmcm9tIG9sZGVyIHdpbmRvd3MgaGVhZGVycywgc28gZGVmaW5lCi0gICAgYSBsb2NhbCByZXBsYWNlbWVudC4gICovCi10eXBlZGVmIHN0cnVjdAotewotICBEV09SRCBkd0xlbmd0aDsKLSAgRFdPUkQgZHdNZW1vcnlMb2FkOwotICBEV09SRExPTkcgdWxsVG90YWxQaHlzOwotICBEV09SRExPTkcgdWxsQXZhaWxQaHlzOwotICBEV09SRExPTkcgdWxsVG90YWxQYWdlRmlsZTsKLSAgRFdPUkRMT05HIHVsbEF2YWlsUGFnZUZpbGU7Ci0gIERXT1JETE9ORyB1bGxUb3RhbFZpcnR1YWw7Ci0gIERXT1JETE9ORyB1bGxBdmFpbFZpcnR1YWw7Ci0gIERXT1JETE9ORyB1bGxBdmFpbEV4dGVuZGVkVmlydHVhbDsKLX0gbE1FTU9SWVNUQVRVU0VYOwotLy8gSXMgdGhpcyByZWFsbHkgc3VwcG9zZWQgdG8gYmUgZGVmaW5lZCBsaWtlIHRoaXM/Ci10eXBlZGVmIGludCBXSU5CT09MOwotdHlwZWRlZiBXSU5CT09MIChXSU5BUEkgKlBGTl9NU19FWCkgKGxNRU1PUllTVEFUVVNFWCopOwotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fTUFDSF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHV0aWwgewotbmFtZXNwYWNlIHsKLQotI2lmIGRlZmluZWQoX19NQUNIX18pCi10eXBlZGVmIHN0cnVjdCB0aW1ldmFsIFdhbGw7Ci1XYWxsIEdldFdhbGwoKSB7Ci0gIHN0cnVjdCB0aW1ldmFsIHR2OwotICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLSAgcmV0dXJuIHR2OwotfQotI2VsaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotdHlwZWRlZiB0aW1lX3QgV2FsbDsKLVdhbGwgR2V0V2FsbCgpIHsKLSAgcmV0dXJuIHRpbWUoTlVMTCk7Ci19Ci0jZWxzZQotdHlwZWRlZiBzdHJ1Y3QgdGltZXNwZWMgV2FsbDsKLVdhbGwgR2V0V2FsbCgpIHsKLSAgV2FsbCByZXQ7Ci0gIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmcmV0KTsKLSAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi0vLyBnY2MgcG9zc2libGUtdW51c2VkIGZ1bmN0aW9uIGZsYWdzCi0jaWZkZWYgX19HTlVDX18KLWRvdWJsZSBTdWJ0cmFjdCh0aW1lX3QgZmlyc3QsIHRpbWVfdCBzZWNvbmQpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKLWRvdWJsZSBEb3VibGVTZWModGltZV90IHR2KSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7Ci0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpCi1kb3VibGUgU3VidHJhY3QoY29uc3Qgc3RydWN0IHRpbWV2YWwgJmZpcnN0LCBjb25zdCBzdHJ1Y3QgdGltZXZhbCAmc2Vjb25kKSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7Ci1kb3VibGUgU3VidHJhY3QoY29uc3Qgc3RydWN0IHRpbWVzcGVjICZmaXJzdCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICZzZWNvbmQpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKLWRvdWJsZSBEb3VibGVTZWMoY29uc3Qgc3RydWN0IHRpbWV2YWwgJnR2KSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7Ci1kb3VibGUgRG91YmxlU2VjKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdHYpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKLSNlbmRpZgotI2VuZGlmCi0KLS8vIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IHVzZWQgb24gc29tZSBwbGF0Zm9ybXMuCi0jaWZkZWYgX19jbGFuZ19fCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLWZ1bmN0aW9uIgotI2VuZGlmCi0vLyBUaGVzZSBhbGwgYXNzdW1lIGZpcnN0ID4gc2Vjb25kCi1kb3VibGUgU3VidHJhY3QodGltZV90IGZpcnN0LCB0aW1lX3Qgc2Vjb25kKSB7Ci0gIHJldHVybiBkaWZmdGltZShmaXJzdCwgc2Vjb25kKTsKLX0KLWRvdWJsZSBEb3VibGVTZWModGltZV90IHR2KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KHR2KTsKLX0KLSNpZiAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU42NCkKLWRvdWJsZSBTdWJ0cmFjdChjb25zdCBzdHJ1Y3QgdGltZXZhbCAmZmlyc3QsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICZzZWNvbmQpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oZmlyc3QudHZfc2VjIC0gc2Vjb25kLnR2X3NlYykgKyBzdGF0aWNfY2FzdDxkb3VibGU+KGZpcnN0LnR2X3VzZWMgLSBzZWNvbmQudHZfdXNlYykgLyAxMDAwMDAwLjA7Ci19Ci1kb3VibGUgU3VidHJhY3QoY29uc3Qgc3RydWN0IHRpbWVzcGVjICZmaXJzdCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICZzZWNvbmQpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oZmlyc3QudHZfc2VjIC0gc2Vjb25kLnR2X3NlYykgKyBzdGF0aWNfY2FzdDxkb3VibGU+KGZpcnN0LnR2X25zZWMgLSBzZWNvbmQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7Ci19Ci1kb3VibGUgRG91YmxlU2VjKGNvbnN0IHN0cnVjdCB0aW1ldmFsICZ0dikgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPih0di50dl9zZWMpICsgKHN0YXRpY19jYXN0PGRvdWJsZT4odHYudHZfdXNlYykgLyAxMDAwMDAwLjApOwotfQotZG91YmxlIERvdWJsZVNlYyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgJnR2KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KHR2LnR2X3NlYykgKyAoc3RhdGljX2Nhc3Q8ZG91YmxlPih0di50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMCk7Ci19Ci0jZW5kaWYKLSNpZmRlZiBfX2NsYW5nX18KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLSNlbmRpZgotCi1jbGFzcyBSZWNvcmRTdGFydCB7Ci0gIHB1YmxpYzoKLSAgICBSZWNvcmRTdGFydCgpIHsKLSAgICAgIHN0YXJ0ZWRfID0gR2V0V2FsbCgpOwotICAgIH0KLQotICAgIGNvbnN0IFdhbGwgJlN0YXJ0ZWQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3RhcnRlZF87Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgV2FsbCBzdGFydGVkXzsKLX07Ci0KLWNvbnN0IFJlY29yZFN0YXJ0IGtSZWNvcmRTdGFydDsKLQotY29uc3QgY2hhciAqU2tpcFNwYWNlcyhjb25zdCBjaGFyICphdCkgewotICBmb3IgKDsgKmF0ID09ICcgJyB8fCAqYXQgPT0gJ1x0JzsgKythdCkge30KLSAgcmV0dXJuIGF0OwotfQotfSAvLyBuYW1lc3BhY2UKLQotZG91YmxlIFdhbGxUaW1lKCkgewotICByZXR1cm4gU3VidHJhY3QoR2V0V2FsbCgpLCBrUmVjb3JkU3RhcnQuU3RhcnRlZCgpKTsKLX0KLQotdm9pZCBQcmludFVzYWdlKHN0ZDo6b3N0cmVhbSAmb3V0KSB7Ci0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpCi0gIC8vIExpbnV4IGRvZXNuJ3Qgc2V0IG1lbW9yeSB1c2FnZSBpbiBnZXRydXNhZ2UgOi0oCi0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBoZWFkZXJzOwotICBoZWFkZXJzLmluc2VydCgiVm1QZWFrOiIpOwotICBoZWFkZXJzLmluc2VydCgiVm1SU1M6Iik7Ci0gIGhlYWRlcnMuaW5zZXJ0KCJOYW1lOiIpOwotCi0gIHN0ZDo6aWZzdHJlYW0gc3RhdHVzKCIvcHJvYy9zZWxmL3N0YXR1cyIsIHN0ZDo6aW9zOjppbik7Ci0gIHN0ZDo6c3RyaW5nIGhlYWRlciwgdmFsdWU7Ci0gIHdoaWxlICgoc3RhdHVzID4+IGhlYWRlcikgJiYgZ2V0bGluZShzdGF0dXMsIHZhbHVlKSkgewotICAgIGlmIChoZWFkZXJzLmZpbmQoaGVhZGVyKSAhPSBoZWFkZXJzLmVuZCgpKSB7Ci0gICAgICBvdXQgPDwgaGVhZGVyIDw8IFNraXBTcGFjZXModmFsdWUuY19zdHIoKSkgPDwgJ1x0JzsKLSAgICB9Ci0gIH0KLQotICBzdHJ1Y3QgcnVzYWdlIHVzYWdlOwotICBpZiAoZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmdXNhZ2UpKSB7Ci0gICAgcGVycm9yKCJnZXRydXNhZ2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgb3V0IDw8ICJSU1NNYXg6IiA8PCB1c2FnZS5ydV9tYXhyc3MgPDwgIiBrQiIgPDwgJ1x0JzsKLSAgb3V0IDw8ICJ1c2VyOiIgPDwgRG91YmxlU2VjKHVzYWdlLnJ1X3V0aW1lKSA8PCAiXHRzeXM6IiA8PCBEb3VibGVTZWModXNhZ2UucnVfc3RpbWUpIDw8ICdcdCc7Ci0gIG91dCA8PCAiQ1BVOiIgPDwgKERvdWJsZVNlYyh1c2FnZS5ydV91dGltZSkgKyBEb3VibGVTZWModXNhZ2UucnVfc3RpbWUpKTsKLSAgb3V0IDw8ICdcdCc7Ci0jZW5kaWYKLQotICBvdXQgPDwgInJlYWw6IiA8PCBXYWxsVGltZSgpIDw8ICdcbic7Ci19Ci0KLS8qIEFkYXB0ZWQgZnJvbSBwaHlzbWVtLmMgaW4gZ251bGliIDgzMWI4NGM1OWVmNDEzYzU3YTM2YjY3MzQ0NDY3ZDY2YThhMmJhNzAgKi8KLS8qIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBwaHlzaWNhbCBtZW1vcnkuCi0KLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxLCAyMDAzLCAyMDA1LTIwMDYsIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotLyogV3JpdHRlbiBieSBQYXVsIEVnZ2VydC4gICovCi11aW50NjRfdCBHdWVzc1BoeXNpY2FsTWVtb3J5KCkgewotI2lmIGRlZmluZWQoX1NDX1BIWVNfUEFHRVMpICYmIGRlZmluZWQoX1NDX1BBR0VTSVpFKQotICB7Ci0gICAgbG9uZyBwYWdlcyA9IHN5c2NvbmYoX1NDX1BIWVNfUEFHRVMpOwotICAgIGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwotICAgIGlmIChwYWdlcyAhPSAtMSAmJiBwYWdlX3NpemUgIT0gLTEpCi0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHBhZ2VzKSAqIHN0YXRpY19jYXN0PHVpbnQ2NF90PihwYWdlX3NpemUpOwotICB9Ci0jZW5kaWYKLSNpZmRlZiBIV19QSFlTTUVNCi0gIHsgLyogVGhpcyB3b3JrcyBvbiAqYnNkIGFuZCBkYXJ3aW4uICAqLwotICAgIHVuc2lnbmVkIGludCBwaHlzbWVtOwotICAgIHNpemVfdCBsZW4gPSBzaXplb2YgcGh5c21lbTsKLSAgICBzdGF0aWMgaW50IG1pYlsyXSA9IHsgQ1RMX0hXLCBIV19QSFlTTUVNIH07Ci0KLSAgICBpZiAoc3lzY3RsIChtaWIsIHNpemVvZihtaWIpIC8gc2l6ZW9mKG1pYlswXSksICZwaHlzbWVtLCAmbGVuLCBOVUxMLCAwKSA9PSAwCi0gICAgICAgICYmIGxlbiA9PSBzaXplb2YgKHBoeXNtZW0pKQotICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90PihwaHlzbWVtKTsKLSAgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCi0gIHsgLyogdGhpcyB3b3JrcyBvbiB3aW5kb3dzICovCi0gICAgUEZOX01TX0VYIHBmbmV4OwotICAgIEhNT0RVTEUgaCA9IEdldE1vZHVsZUhhbmRsZSAoVEVYVCgia2VybmVsMzIuZGxsIikpOwotCi0gICAgaWYgKCFoKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiAgVXNlIEdsb2JhbE1lbW9yeVN0YXR1c0V4IGlmIGF2YWlsYWJsZS4gICovCi0gICAgaWYgKChwZm5leCA9IChQRk5fTVNfRVgpIEdldFByb2NBZGRyZXNzIChoLCAiR2xvYmFsTWVtb3J5U3RhdHVzRXgiKSkpCi0gICAgICB7Ci0gICAgICAgIGxNRU1PUllTVEFUVVNFWCBsbXNfZXg7Ci0gICAgICAgIGxtc19leC5kd0xlbmd0aCA9IHNpemVvZiBsbXNfZXg7Ci0gICAgICAgIGlmICghcGZuZXggKCZsbXNfZXgpKQotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gbG1zX2V4LnVsbFRvdGFsUGh5czsKLSAgICAgIH0KLQotICAgIC8qICBGYWxsIGJhY2sgdG8gR2xvYmFsTWVtb3J5U3RhdHVzIHdoaWNoIGlzIGFsd2F5cyBhdmFpbGFibGUuCi0gICAgICAgIGJ1dCByZXR1cm5zIHdyb25nIHJlc3VsdHMgZm9yIHBoeXNpY2FsIG1lbW9yeSA+IDRHQi4gICovCi0gICAgZWxzZQotICAgICAgewotICAgICAgICBNRU1PUllTVEFUVVMgbXM7Ci0gICAgICAgIEdsb2JhbE1lbW9yeVN0YXR1cyAoJm1zKTsKLSAgICAgICAgcmV0dXJuIG1zLmR3VG90YWxQaHlzOwotICAgICAgfQotICB9Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLW5hbWVzcGFjZSB7Ci1jbGFzcyBTaXplUGFyc2VFcnJvciA6IHB1YmxpYyBFeGNlcHRpb24gewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgU2l6ZVBhcnNlRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgdGhyb3coKSB7Ci0gICAgICAqdGhpcyA8PCAiRmFpbGVkIHRvIHBhcnNlICIgPDwgc3RyIDw8ICIgaW50byBhIG1lbW9yeSBzaXplICI7Ci0gICAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIE51bT4gdWludDY0X3QgUGFyc2VOdW0oY29uc3Qgc3RkOjpzdHJpbmcgJmFyZykgewotICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW0oYXJnKTsKLSAgTnVtIHZhbHVlOwotICBzdHJlYW0gPj4gdmFsdWU7Ci0gIFVUSUxfVEhST1dfSUZfQVJHKCFzdHJlYW0sIFNpemVQYXJzZUVycm9yLCAoYXJnKSwgImZvciB0aGUgbGVhZGluZyBudW1iZXIuIik7Ci0gIHN0ZDo6c3RyaW5nIGFmdGVyOwotICBzdHJlYW0gPj4gYWZ0ZXI7Ci0gIFVUSUxfVEhST1dfSUZfQVJHKGFmdGVyLnNpemUoKSA+IDEsIFNpemVQYXJzZUVycm9yLCAoYXJnKSwgImJlY2F1c2UgdGhlcmUgYXJlIG1vcmUgdGhhbiB0d28gY2hhcmFjdGVycyBhZnRlciB0aGUgbnVtYmVyLiIpOwotICBzdGQ6OnN0cmluZyB0aHJvd2F3YXk7Ci0gIFVUSUxfVEhST1dfSUZfQVJHKHN0cmVhbSA+PiB0aHJvd2F3YXksIFNpemVQYXJzZUVycm9yLCAoYXJnKSwgImJlY2F1c2UgdGhlcmUgd2FzIG1vcmUgY3J1ZnQgIiA8PCB0aHJvd2F3YXkgPDwgIiBhZnRlciB0aGUgbnVtYmVyLiIpOwotCi0gIC8vIFNpbGx5IHNvcnQsIHVzaW5nIGtpbG9ieXRlcyBhcyB5b3VyIGRlZmF1bHQgdW5pdC4gIAotICBpZiAoYWZ0ZXIuZW1wdHkoKSkgYWZ0ZXIgPSAiSyI7Ci0gIGlmIChhZnRlciA9PSAiJSIpIHsKLSAgICB1aW50NjRfdCBtZW0gPSBHdWVzc1BoeXNpY2FsTWVtb3J5KCk7Ci0gICAgVVRJTF9USFJPV19JRl9BUkcoIW1lbSwgU2l6ZVBhcnNlRXJyb3IsIChhcmcpLCAiYmVjYXVzZSAlIHdhcyBzcGVjaWZpZWQgYnV0IHRoZSBwaHlzaWNhbCBtZW1vcnkgc2l6ZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4iKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpICogc3RhdGljX2Nhc3Q8ZG91YmxlPihtZW0pIC8gMTAwLjApOwotICB9Ci0gIAotICBzdGQ6OnN0cmluZyB1bml0cygiYktNR1RQRVpZIik7Ci0gIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaW5kZXggPSB1bml0cy5maW5kKGFmdGVyWzBdKTsKLSAgVVRJTF9USFJPV19JRl9BUkcoaW5kZXggPT0gc3RkOjpzdHJpbmc6Om5wb3MsIFNpemVQYXJzZUVycm9yLCAoYXJnKSwgInRoZSBhbGxvd2VkIHN1ZmZpeGVzIGFyZSAiIDw8IHVuaXRzIDw8ICIlLiIpOwotICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBpbmRleDsgKytpKSB7Ci0gICAgdmFsdWUgKj0gMTAyNDsKLSAgfQotICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHZhbHVlKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UKLQotdWludDY0X3QgUGFyc2VTaXplKGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcpIHsKLSAgcmV0dXJuIGFyZy5maW5kKCcuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgPyBQYXJzZU51bTxkb3VibGU+KGFyZykgOiBQYXJzZU51bTx1aW50NjRfdD4oYXJnKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvdXNhZ2UuaGggYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC91c2FnZS5oaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3OGIwYS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC91c2FnZS5oaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSNpZm5kZWYgVVRJTF9VU0FHRV9ICi0jZGVmaW5lIFVUSUxfVVNBR0VfSAotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8aW9zZndkPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgdXRpbCB7Ci0vLyBUaW1lIGluIHNlY29uZHMgc2luY2UgcHJvY2VzcyBzdGFydGVkLiAgWmVybyBvbiB1bnN1cHBvcnRlZCBwbGF0Zm9ybXMuCi1kb3VibGUgV2FsbFRpbWUoKTsKLQotdm9pZCBQcmludFVzYWdlKHN0ZDo6b3N0cmVhbSAmdG8pOwotCi0vLyBEZXRlcm1pbmUgaG93IG11Y2ggcGh5c2ljYWwgbWVtb3J5IHRoZXJlIGlzLiAgUmV0dXJuIDAgb24gZmFpbHVyZS4KLXVpbnQ2NF90IEd1ZXNzUGh5c2ljYWxNZW1vcnkoKTsKLQotLy8gUGFyc2UgYSBzaXplIGxpa2UgdW5peCBzb3J0LiAgU2FkbHksIHRoaXMgbWVhbnMgdGhlIGRlZmF1bHQgbXVsdGlwbGllciBpcyBLLgotdWludDY0X3QgUGFyc2VTaXplKGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcpOwotfSAvLyBuYW1lc3BhY2UgdXRpbAotI2VuZGlmIC8vIFVUSUxfVVNBR0VfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3BocmFzZS9EaXN0b3J0aW9uLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvcGhyYXNlL0Rpc3RvcnRpb24uamF2YQppbmRleCBlMDIzNjk4Li45NTlhMGQ3IDEwMDY0NAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvcGhyYXNlL0Rpc3RvcnRpb24uamF2YQorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvcGhyYXNlL0Rpc3RvcnRpb24uamF2YQpAQCAtMSw1ICsxLDYgQEAKIHBhY2thZ2Ugam9zaHVhLmRlY29kZXIuZmYucGhyYXNlOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsJCiAKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5Kb3NodWFDb25maWd1cmF0aW9uOwpAQCAtMjMsNiArMjQsMTUgQEAKICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgIH0KICAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBBcnJheUxpc3Q8U3RyaW5nPiByZXBvcnREZW5zZUZlYXR1cmVzKGludCBpbmRleCkgeworICAgIGRlbnNlRmVhdHVyZUluZGV4ID0gaW5kZXg7CisgICAgCisgICAgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBuYW1lcy5hZGQobmFtZSk7CisgICAgcmV0dXJuIG5hbWVzOworICB9CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBEUFN0YXRlIGNvbXB1dGUoUnVsZSBydWxlLCBMaXN0PEhHTm9kZT4gdGFpbE5vZGVzLCBpbnQgaSwgaW50IGosIFNvdXJjZVBhdGggc291cmNlUGF0aCwKQEAgLTMyLDcgKzQyLDggQEAKICAgICAgICAgaW50IHN0YXJ0X3BvaW50ID0gaiAtIHJ1bGUuZ2V0RnJlbmNoKCkubGVuZ3RoICsgcnVsZS5nZXRBcml0eSgpOwogCiAgICAgICAgIGludCBqdW1wX3NpemUgPSBNYXRoLmFicyh0YWlsTm9kZXMuZ2V0KDApLmogLSBzdGFydF9wb2ludCk7Ci0gICAgICAgIGFjYy5hZGQobmFtZSwgLWp1bXBfc2l6ZSk7CisvLyAgICAgICAgYWNjLmFkZChuYW1lLCAtanVtcF9zaXplKTsKKyAgICAgICAgYWNjLmFkZChkZW5zZUZlYXR1cmVJbmRleCwgLWp1bXBfc2l6ZSk7IAogICAgIH0KICAgICAKIC8vICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJESVNUT1JUSU9OKCVkLCAlZCkgZnJvbSAlZCA9ICVkIiwgaSwgaiwgdGFpbE5vZGVzICE9IG51bGwgPyB0YWlsTm9kZXMuZ2V0KDApLmogOiAtMSwganVtcF9zaXplKSk7CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vQ3JlYXRlR2x1ZUdyYW1tYXIuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi90bS9DcmVhdGVHbHVlR3JhbW1hci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZDVlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vQ3JlYXRlR2x1ZUdyYW1tYXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorcGFja2FnZSBqb3NodWEuZGVjb2Rlci5mZi50bTsKKworaW1wb3J0IHN0YXRpYyBqb3NodWEuZGVjb2Rlci5mZi50bS5wYWNrZWQuUGFja2VkR3JhbW1hci5WT0NBQlVMQVJZX0ZJTEVOQU1FOworaW1wb3J0IHN0YXRpYyBqb3NodWEudXRpbC5Gb3JtYXRVdGlscy5jbGVhbk5vblRlcm1pbmFsOworaW1wb3J0IHN0YXRpYyBqb3NodWEudXRpbC5Gb3JtYXRVdGlscy5pc05vbnRlcm1pbmFsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqb3NodWEuY29ycHVzLlZvY2FidWxhcnk7CitpbXBvcnQgam9zaHVhLmRlY29kZXIuSm9zaHVhQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqb3NodWEudXRpbC5pby5MaW5lUmVhZGVyOworCitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkNtZExpbmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkNtZExpbmVQYXJzZXI7CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKKworCitwdWJsaWMgY2xhc3MgQ3JlYXRlR2x1ZUdyYW1tYXIgeworICAKKyAgCisgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gbm9uVGVybWluYWxTeW1ib2xzID0gbmV3IEhhc2hTZXQ8PigpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihDcmVhdGVHbHVlR3JhbW1hci5jbGFzcy5nZXROYW1lKCkpOworICAKKyAgQE9wdGlvbihuYW1lID0gIi0tZ3JhbW1hciIsIGFsaWFzZXMgPSB7Ii1nIn0sIHJlcXVpcmVkID0gdHJ1ZSwgdXNhZ2UgPSAicHJvdmlkZSBncmFtbWFyIHRvIGRldGVybWluZSBsaXN0IG9mIE5vblRlcm1pbmFsIHN5bWJvbHMuIikKKyAgcHJpdmF0ZSBTdHJpbmcgZ3JhbW1hclBhdGg7CisgIAorICBAT3B0aW9uKG5hbWUgPSAiLS1nb2FsIiwgYWxpYXNlcyA9IHsiLWdvYWwifSwgcmVxdWlyZWQgPSBmYWxzZSwgdXNhZ2UgPSAic3BlY2lmeSBjdXN0b20gR09BTCBzeW1ib2wuIERlZmF1bHQ6ICdHT0FMJyIpCisgIHByaXZhdGUgU3RyaW5nIGdvYWxTeW1ib2wgPSBjbGVhbk5vblRlcm1pbmFsKG5ldyBKb3NodWFDb25maWd1cmF0aW9uKCkuZ29hbF9zeW1ib2wpOworCisgIC8qIFJ1bGUgdGVtcGxhdGVzICovCisgIC8vIFtHT0FMXSB8fHwgPHM+IHx8fCA8cz4gfHx8IDAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJfU1RBUlQgPSAiWyUxJHNdIHx8fCA8cz4gfHx8IDxzPiB8fHwgMCI7CisgIC8vIFtHT0FMXSB8fHwgW0dPQUwsMV0gW1gsMl0gfHx8IFtHT0FMLDFdIFtYLDJdIHx8fCAtMQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUl9UV08gPSAiWyUxJHNdIHx8fCBbJTEkcywxXSBbJTIkcywyXSB8fHwgWyUxJHMsMV0gWyUyJHMsMl0gfHx8IC0xIjsKKyAgLy8gW0dPQUxdIHx8fCBbR09BTCwxXSA8L3M+IHx8fCBbR09BTCwxXSA8L3M+IHx8fCAwCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSX0VORCA9ICJbJTEkc10gfHx8IFslMSRzLDFdIDwvcz4gfHx8IFslMSRzLDFdIDwvcz4gfHx8IDAiOworICAvLyBbR09BTF0gfHx8IDxzPiBbWCwxXSA8L3M+IHx8fCA8cz4gW1gsMV0gPC9zPiB8fHwgMAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUl9UT1AgPSAiWyUxJHNdIHx8fCA8cz4gWyUyJHMsMV0gPC9zPiB8fHwgPHM+IFslMiRzLDFdIDwvcz4gfHx8IDAiOworICAKKyAgcHJpdmF0ZSB2b2lkIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgCisgICAgRmlsZSBncmFtbWFyX2ZpbGUgPSBuZXcgRmlsZShncmFtbWFyUGF0aCk7CisgICAgaWYgKCFncmFtbWFyX2ZpbGUuZXhpc3RzKCkpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiR3JhbW1hciBmaWxlIGRvZXNuJ3QgZXhpc3Q6ICIgKyBncmFtbWFyUGF0aCk7CisgICAgfQorCisgICAgLy8gaW4gY2FzZSBvZiBhIHBhY2tlZEdyYW1tYXIsIHdlIHJlYWQgdGhlIHNlcmlhbGl6ZWQgdm9jYWJ1bGFyeSwKKyAgICAvLyBjb2xsZWN0aW5nIGFsbCBjbGVhbmVkIG5vblRlcm1pbmFsIHN5bWJvbHMuCisgICAgaWYgKGdyYW1tYXJfZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICBWb2NhYnVsYXJ5LnJlYWQobmV3IEZpbGUoZ3JhbW1hclBhdGggKyBGaWxlLnNlcGFyYXRvciArIFZPQ0FCVUxBUllfRklMRU5BTUUpKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVm9jYWJ1bGFyeS5zaXplKCk7ICsraSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdG9rZW4gPSBWb2NhYnVsYXJ5LndvcmQoaSk7CisgICAgICAgIGlmIChpc05vbnRlcm1pbmFsKHRva2VuKSkgeworICAgICAgICAgIG5vblRlcm1pbmFsU3ltYm9scy5hZGQoY2xlYW5Ob25UZXJtaW5hbCh0b2tlbikpOworICAgICAgICB9CisgICAgICB9CisgICAgLy8gb3RoZXJ3aXNlIHdlIGNvbGxlY3QgY2xlYW5lZCBsZWZ0LWhhbmQgc2lkZXMgZnJvbSB0aGUgcnVsZXMgaW4gdGhlIHRleHQgZ3JhbW1hci4KKyAgICB9IGVsc2UgeyAKKyAgICAgIGZpbmFsIExpbmVSZWFkZXIgcmVhZGVyID0gbmV3IExpbmVSZWFkZXIoZ3JhbW1hclBhdGgpOworICAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSByZWFkZXIubmV4dCgpOworICAgICAgICBpbnQgbGhzU3RhcnQgPSBsaW5lLmluZGV4T2YoIlsiKSArIDE7CisgICAgICAgIGludCBsaHNFbmQgPSBsaW5lLmluZGV4T2YoIl0iKTsKKyAgICAgICAgaWYgKGxoc1N0YXJ0IDwgMSB8fCBsaHNFbmQgPCAwKSB7CisgICAgICAgICAgbG9nLmluZm8oU3RyaW5nLmZvcm1hdCgibWFsZm9ybWVkIHJ1bGU6ICVzXG4iLCBsaW5lKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIGxocyA9IGxpbmUuc3Vic3RyaW5nKGxoc1N0YXJ0LCBsaHNFbmQpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4obGhzKTsKKyAgICAgICAgbm9uVGVybWluYWxTeW1ib2xzLmFkZChsaHMpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBsb2cuaW5mbygKKyAgICAgICAgU3RyaW5nLmZvcm1hdCgiJWQgbm9uVGVybWluYWwgc3ltYm9scyByZWFkOiAlcyIsCisgICAgICAgIG5vblRlcm1pbmFsU3ltYm9scy5zaXplKCksCisgICAgICAgIG5vblRlcm1pbmFsU3ltYm9scy50b1N0cmluZygpKSk7CisKKyAgICAvLyB3cml0ZSBnbHVlIHJ1bGVzIHRvIHN0ZG91dAorICAgIAorICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KFJfU1RBUlQsIGdvYWxTeW1ib2wpKTsKKyAgICAKKyAgICBmb3IgKFN0cmluZyBudCA6IG5vblRlcm1pbmFsU3ltYm9scykKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KFJfVFdPLCBnb2FsU3ltYm9sLCBudCkpOworICAgIAorICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KFJfRU5ELCBnb2FsU3ltYm9sKSk7CisgICAgCisgICAgZm9yIChTdHJpbmcgbnQgOiBub25UZXJtaW5hbFN5bWJvbHMpCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdChSX1RPUCwgZ29hbFN5bWJvbCwgbnQpKTsKKworICB9CisgIAorICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIENyZWF0ZUdsdWVHcmFtbWFyIGdsdWVDcmVhdG9yID0gbmV3IENyZWF0ZUdsdWVHcmFtbWFyKCk7CisgICAgZmluYWwgQ21kTGluZVBhcnNlciBwYXJzZXIgPSBuZXcgQ21kTGluZVBhcnNlcihnbHVlQ3JlYXRvcik7CisKKyAgICB0cnkgeworICAgICAgcGFyc2VyLnBhcnNlQXJndW1lbnQoYXJncyk7CisgICAgICBnbHVlQ3JlYXRvci5ydW4oKTsKKyAgICB9IGNhdGNoIChDbWRMaW5lRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5pbmZvKGUudG9TdHJpbmcoKSk7CisgICAgICBwYXJzZXIucHJpbnRVc2FnZShTeXN0ZW0uZXJyKTsKKyAgICAgIFN5c3RlbS5leGl0KDEpOworICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi90bS9HcmFtbWFyLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vR3JhbW1hci5qYXZhCmluZGV4IDcyODUwYmIuLmEzYjcwNjIgMTAwNjQ0Ci0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi90bS9HcmFtbWFyLmphdmEKKysrIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3RtL0dyYW1tYXIuamF2YQpAQCAtNjQsNiArNjQsMTMgQEAKICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJ1bGVzIHN0b3JlZCBpbiB0aGUgZ3JhbW1hcgogICAgKi8KICAgaW50IGdldE51bVJ1bGVzKCk7CisgIAorICAvKioKKyAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRlbnNlIGZlYXR1cmVzLgorICAgKiAKKyAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGRlbnNlIGZlYXR1cmVzCisgICAqLworICBpbnQgZ2V0TnVtRGVuc2VGZWF0dXJlcygpOwogCiAgIC8qKgogICAgKiBUaGlzIGlzIHVzZWQgdG8gY29uc3RydWN0IGEgbWFudWFsIHJ1bGUgc3VwcG9ydGVkIGZyb20gb3V0c2lkZSB0aGUgZ3JhbW1hciwgYnV0IHRoZSBvd25lcgpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3RtL01vc2VzUGhyYXNlUnVsZS5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3RtL01vc2VzUGhyYXNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGE0NzkyLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi90bS9Nb3Nlc1BocmFzZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLXBhY2thZ2Ugam9zaHVhLmRlY29kZXIuZmYudG07Ci0KLS8qKioKLSAqIEEgY2xhc3MgZm9yIHJlYWRpbmcgaW4gcnVsZXMgZnJvbSBhIE1vc2VzIHBocmFzZSB0YWJsZS4gTW9zdCBvZiB0aGUgY29udmVyc2lvbiB3b3JrIGlzIGRvbmUKLSAqIGluIHtAbGluayBqb3NodWEuZGVjb2Rlci5mZi50bS5mb3JtYXQuTW9zZXNGb3JtYXRSZWFkZXJ9LiBUaGlzIGluY2x1ZGVzIHByZXBlbmRpbmcgZXZlcnkKLSAqIHJ1bGUgd2l0aCBhIG5vbnRlcm1pbmFsLCBzbyB0aGF0IHRoZSBwaHJhc2UtYmFzZWQgZGVjb2RlciBjYW4gYXNzdW1lIHRoZSBzYW1lIGh5cGVyZ3JhcGgKLSAqIGZvcm1hdCBhcyB0aGUgaGllcmFyY2hpY2FsIGRlY29kZXIgKGJ5IHByZXRlbmRpbmcgdG8gYmUgYSBzdHJpY3RseSBsZWZ0LWJyYW5jaGluZyBncmFtbWFyIGFuZAotICogZGlzcGVuc2luZyB3aXRoIHRoZSBub3Rpb24gb2YgY292ZXJhZ2Ugc3BhbnMpLiBIb3dldmVyLCBwcmVwZW5kaW5nIHRoZSBub250ZXJtaW5hbHMgbWVhbnMgYWxsCi0gKiB0aGUgYWxpZ25tZW50cyBhcmUgb2ZmIGJ5IDEuIFdlIGRvIG5vdCB3YW50IHRvIGZpeCB0aG9zZSB3aGVuIHJlYWRpbmcgaW4gZHVlIHRvIHRoZSBleHBlbnNlLAotICogc28gaW5zdGVhZCB3ZSB1c2UgdGhpcyBydWxlIHdoaWNoIGFkanVzdCB0aGUgYWxpZ25tZW50cyBvbiB0aGUgZmx5LgotICogCi0gKiBBbHNvLCB3ZSBvbmx5IGNvbnZlcnQgdGhlIE1vc2VzIGRlbnNlIGZlYXR1cmVzIG9uIHRoZSBmbHksIHZpYSB0aGlzIGNsYXNzLgotICogCi0gKiBUT0RPOiB0aGlzIGNsYXNzIHNob3VsZCBhbHNvIGJlIHJlc3BvbnNpYmxlIGZvciBwcmVwZW5kaW5nIHRoZSBub250ZXJtaW5hbHMuCi0gKiAKLSAqIEBhdXRob3IgTWF0dCBQb3N0Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTW9zZXNQaHJhc2VSdWxlIGV4dGVuZHMgUnVsZSB7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgbW9zZXNGZWF0dXJlU3RyaW5nID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBNb3Nlc1BocmFzZVJ1bGUoaW50IGxocywgaW50W10gZnJlbmNoLCBpbnRbXSBlbmdsaXNoLCBTdHJpbmcgc3BhcnNlX2ZlYXR1cmVzLCBpbnQgYXJpdHksCi0gICAgICBTdHJpbmcgYWxpZ25tZW50KSB7Ci0gICAgc3VwZXIobGhzLCBmcmVuY2gsIGVuZ2xpc2gsIG51bGwsIGFyaXR5LCBhbGlnbm1lbnQpOwotICAgIG1vc2VzRmVhdHVyZVN0cmluZyA9IHNwYXJzZV9mZWF0dXJlczsKLSAgfQotCi0gIC8qKiAKLSAgICogTW9zZXMgZmVhdHVyZXMgYXJlIHByb2JhYmlsaXRpZXM7IHdlIG5lZWQgdG8gY29udmVydCB0aGVtIGhlcmUgYnkgdGFraW5nIHRoZSBuZWdhdGl2ZSBsb2cgcHJvYi4KLSAgICogV2UgZG8gdGhpcyBvbmx5IHdoZW4gdGhlIHJ1bGUgaXMgdXNlZCB0byBhbW9ydGl6ZS4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVTdHJpbmcoKSB7Ci0gICAgaWYgKHNwYXJzZUZlYXR1cmVzID09IG51bGwpIHsKLSAgICAgIFN0cmluZ0J1ZmZlciB2YWx1ZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBmb3IgKFN0cmluZyB2YWx1ZTogbW9zZXNGZWF0dXJlU3RyaW5nLnNwbGl0KCIgIikpIHsKLSAgICAgICAgZmxvYXQgZiA9IEZsb2F0LnBhcnNlRmxvYXQodmFsdWUpOwotICAgICAgICB2YWx1ZXMuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiVmICIsIGYgPD0gMC4wID8gLTEwMCA6IC1NYXRoLmxvZyhmKSkpOwotICAgICAgfQotICAgICAgc3BhcnNlRmVhdHVyZXMgPSB2YWx1ZXMudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgfQotICAgIHJldHVybiBzcGFyc2VGZWF0dXJlczsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIGV4YWN0IHNhbWUgYXMgdGhlIHBhcmVudCBpbXBsZW1lbnRhdGlvbiwgYnV0IHdlIG5lZWQgdG8gYWRkIDEgdG8gZWFjaCBhbGlnbm1lbnQKLSAgICogcG9pbnQgdG8gYWNjb3VudCBmb3IgdGhlIG5vbnRlcm1pbmFsIFtYXSB0aGF0IHdhcyBwcmVwZW5kZWQgdG8gZWFjaCBydWxlLiAKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYnl0ZVtdIGdldEFsaWdubWVudCgpIHsKLSAgICBpZiAoYWxpZ25tZW50ID09IG51bGwpIHsKLSAgICAgIFN0cmluZ1tdIHRva2VucyA9IGdldEFsaWdubWVudFN0cmluZygpLnNwbGl0KCJbLVxcc10rIik7Ci0gICAgICBhbGlnbm1lbnQgPSBuZXcgYnl0ZVt0b2tlbnMubGVuZ3RoICsgMl07Ci0gICAgICBhbGlnbm1lbnRbMF0gPSBhbGlnbm1lbnRbMV0gPSAwOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIGFsaWdubWVudFtpICsgMl0gPSAoYnl0ZSkgKFNob3J0LnBhcnNlU2hvcnQodG9rZW5zW2ldKSArIDEpOwotICAgIH0KLSAgICByZXR1cm4gYWxpZ25tZW50OwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vUGhyYXNlUnVsZS5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3RtL1BocmFzZVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDJhN2VlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3RtL1BocmFzZVJ1bGUuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIGpvc2h1YS5kZWNvZGVyLmZmLnRtOworCisvKioqCisgKiBBIGNsYXNzIGZvciByZWFkaW5nIGluIHJ1bGVzIGZyb20gYSBNb3NlcyBwaHJhc2UgdGFibGUuIE1vc3Qgb2YgdGhlIGNvbnZlcnNpb24gd29yayBpcyBkb25lCisgKiBpbiB7QGxpbmsgam9zaHVhLmRlY29kZXIuZmYudG0uZm9ybWF0LlBocmFzZUZvcm1hdFJlYWRlcn0uIFRoaXMgaW5jbHVkZXMgcHJlcGVuZGluZyBldmVyeQorICogcnVsZSB3aXRoIGEgbm9udGVybWluYWwsIHNvIHRoYXQgdGhlIHBocmFzZS1iYXNlZCBkZWNvZGVyIGNhbiBhc3N1bWUgdGhlIHNhbWUgaHlwZXJncmFwaAorICogZm9ybWF0IGFzIHRoZSBoaWVyYXJjaGljYWwgZGVjb2RlciAoYnkgcHJldGVuZGluZyB0byBiZSBhIHN0cmljdGx5IGxlZnQtYnJhbmNoaW5nIGdyYW1tYXIgYW5kCisgKiBkaXNwZW5zaW5nIHdpdGggdGhlIG5vdGlvbiBvZiBjb3ZlcmFnZSBzcGFucykuIEhvd2V2ZXIsIHByZXBlbmRpbmcgdGhlIG5vbnRlcm1pbmFscyBtZWFucyBhbGwKKyAqIHRoZSBhbGlnbm1lbnRzIGFyZSBvZmYgYnkgMS4gV2UgZG8gbm90IHdhbnQgdG8gZml4IHRob3NlIHdoZW4gcmVhZGluZyBpbiBkdWUgdG8gdGhlIGV4cGVuc2UsCisgKiBzbyBpbnN0ZWFkIHdlIHVzZSB0aGlzIHJ1bGUgd2hpY2ggYWRqdXN0IHRoZSBhbGlnbm1lbnRzIG9uIHRoZSBmbHkuCisgKiAKKyAqIEFsc28sIHdlIG9ubHkgY29udmVydCB0aGUgTW9zZXMgZGVuc2UgZmVhdHVyZXMgb24gdGhlIGZseSwgdmlhIHRoaXMgY2xhc3MuCisgKiAKKyAqIFRPRE86IHRoaXMgY2xhc3Mgc2hvdWxkIGFsc28gYmUgcmVzcG9uc2libGUgZm9yIHByZXBlbmRpbmcgdGhlIG5vbnRlcm1pbmFscy4KKyAqIAorICogQGF1dGhvciBNYXR0IFBvc3QKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQaHJhc2VSdWxlIGV4dGVuZHMgUnVsZSB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgbW9zZXNGZWF0dXJlU3RyaW5nID0gbnVsbDsKKyAgCisgIHB1YmxpYyBQaHJhc2VSdWxlKGludCBsaHMsIGludFtdIGZyZW5jaCwgaW50W10gZW5nbGlzaCwgU3RyaW5nIHNwYXJzZV9mZWF0dXJlcywgaW50IGFyaXR5LAorICAgICAgU3RyaW5nIGFsaWdubWVudCkgeworICAgIHN1cGVyKGxocywgZnJlbmNoLCBlbmdsaXNoLCBudWxsLCBhcml0eSwgYWxpZ25tZW50KTsKKyAgICBtb3Nlc0ZlYXR1cmVTdHJpbmcgPSBzcGFyc2VfZmVhdHVyZXM7CisgIH0KKworICAvKiogCisgICAqIE1vc2VzIGZlYXR1cmVzIGFyZSBwcm9iYWJpbGl0aWVzOyB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlbSBoZXJlIGJ5IHRha2luZyB0aGUgbmVnYXRpdmUgbG9nIHByb2IuCisgICAqIFdlIGRvIHRoaXMgb25seSB3aGVuIHRoZSBydWxlIGlzIHVzZWQgdG8gYW1vcnRpemUuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRGZWF0dXJlU3RyaW5nKCkgeworICAgIGlmIChzcGFyc2VGZWF0dXJlU3RyaW5nID09IG51bGwpIHsKKyAgICAgIFN0cmluZ0J1ZmZlciB2YWx1ZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICBmb3IgKFN0cmluZyB2YWx1ZTogbW9zZXNGZWF0dXJlU3RyaW5nLnNwbGl0KCIgIikpIHsKKyAgICAgICAgZmxvYXQgZiA9IEZsb2F0LnBhcnNlRmxvYXQodmFsdWUpOworICAgICAgICB2YWx1ZXMuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiVmICIsIGYgPD0gMC4wID8gLTEwMCA6IC1NYXRoLmxvZyhmKSkpOworICAgICAgfQorICAgICAgc3BhcnNlRmVhdHVyZVN0cmluZyA9IHZhbHVlcy50b1N0cmluZygpLnRyaW0oKTsKKyAgICB9CisgICAgcmV0dXJuIHNwYXJzZUZlYXR1cmVTdHJpbmc7CisgIH0KKyAgCisgIC8qKgorICAgKiBUaGlzIGlzIHRoZSBleGFjdCBzYW1lIGFzIHRoZSBwYXJlbnQgaW1wbGVtZW50YXRpb24sIGJ1dCB3ZSBuZWVkIHRvIGFkZCAxIHRvIGVhY2ggYWxpZ25tZW50CisgICAqIHBvaW50IHRvIGFjY291bnQgZm9yIHRoZSBub250ZXJtaW5hbCBbWF0gdGhhdCB3YXMgcHJlcGVuZGVkIHRvIGVhY2ggcnVsZS4gCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJ5dGVbXSBnZXRBbGlnbm1lbnQoKSB7CisgICAgaWYgKGFsaWdubWVudCA9PSBudWxsKSB7CisgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBnZXRBbGlnbm1lbnRTdHJpbmcoKS5zcGxpdCgiWy1cXHNdKyIpOworICAgICAgYWxpZ25tZW50ID0gbmV3IGJ5dGVbdG9rZW5zLmxlbmd0aCArIDJdOworICAgICAgYWxpZ25tZW50WzBdID0gYWxpZ25tZW50WzFdID0gMDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQorICAgICAgICBhbGlnbm1lbnRbaSArIDJdID0gKGJ5dGUpIChTaG9ydC5wYXJzZVNob3J0KHRva2Vuc1tpXSkgKyAxKTsKKyAgICB9CisgICAgcmV0dXJuIGFsaWdubWVudDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3RtL1J1bGUuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi90bS9SdWxlLmphdmEKaW5kZXggY2Y4MGRiNi4uYzcwMWFjNiAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3RtL1J1bGUuamF2YQorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vUnVsZS5qYXZhCkBAIC0zOCw3ICszOCw4IEBACiAgIHByb3RlY3RlZCBpbnQgYXJpdHk7CiAKICAgLy8gQW5kIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNwYXJzZSBvbmVzCi0gIHByb3RlY3RlZCBTdHJpbmcgc3BhcnNlRmVhdHVyZXM7CisgIHByb3RlY3RlZCBGZWF0dXJlVmVjdG9yIGZlYXR1cmVzID0gbnVsbDsKKyAgcHJvdGVjdGVkIFN0cmluZyBzcGFyc2VGZWF0dXJlU3RyaW5nOwogCiAgIC8qCiAgICAqIGEgZmVhdHVyZSBmdW5jdGlvbiB3aWxsIGJlIGZpcmVkIGZvciB0aGlzIHJ1bGUgb25seSBpZiB0aGUgb3duZXIgb2YgdGhlIHJ1bGUgbWF0Y2hlcyB0aGUgb3duZXIKQEAgLTc5LDcgKzgwLDcgQEAKICAgICAgIGludCBvd25lcikgewogICAgIHRoaXMubGhzID0gbGhzOwogICAgIHRoaXMucEZyZW5jaCA9IHNvdXJjZVJoczsKLSAgICB0aGlzLnNwYXJzZUZlYXR1cmVzID0gc3BhcnNlRmVhdHVyZXM7CisgICAgdGhpcy5zcGFyc2VGZWF0dXJlU3RyaW5nID0gc3BhcnNlRmVhdHVyZXM7CiAgICAgdGhpcy5hcml0eSA9IGFyaXR5OwogICAgIHRoaXMub3duZXIgPSBvd25lcjsKICAgICB0aGlzLmVuZ2xpc2ggPSB0YXJnZXRSaHM7CkBAIC04OSw3ICs5MCw3IEBACiAgIHB1YmxpYyBSdWxlKGludCBsaHMsIGludFtdIHNvdXJjZVJocywgaW50W10gdGFyZ2V0UmhzLCBTdHJpbmcgc3BhcnNlRmVhdHVyZXMsIGludCBhcml0eSkgewogICAgIHRoaXMubGhzID0gbGhzOwogICAgIHRoaXMucEZyZW5jaCA9IHNvdXJjZVJoczsKLSAgICB0aGlzLnNwYXJzZUZlYXR1cmVzID0gc3BhcnNlRmVhdHVyZXM7CisgICAgdGhpcy5zcGFyc2VGZWF0dXJlU3RyaW5nID0gc3BhcnNlRmVhdHVyZXM7CiAgICAgdGhpcy5hcml0eSA9IGFyaXR5OwogICAgIHRoaXMub3duZXIgPSAtMTsKICAgICB0aGlzLmVuZ2xpc2ggPSB0YXJnZXRSaHM7CkBAIC0yMDEsMTAgKzIwMiwxMSBAQAogICAgICAqIHNwYXJzZSAobGFiZWxlZCkgb25lcywgYnV0IGl0J3Mgbm90IHJlcXVpcmVkLgogICAgICAqLwogCi0gICAgRmVhdHVyZVZlY3RvciBmZWF0dXJlcyA9IChvd25lciAhPSAtMSkKKyAgICBpZiAoZmVhdHVyZXMgPT0gbnVsbCkKKyAgICAgIGZlYXR1cmVzID0gKG93bmVyICE9IC0xKQogICAgICAgICA/IG5ldyBGZWF0dXJlVmVjdG9yKGdldEZlYXR1cmVTdHJpbmcoKSwgInRtXyIgKyBWb2NhYnVsYXJ5LndvcmQob3duZXIpICsgIl8iKQogICAgICAgICA6IG5ldyBGZWF0dXJlVmVjdG9yKCk7Ci0KKyAgCiAgICAgcmV0dXJuIGZlYXR1cmVzOwogICB9CiAKQEAgLTIzNywzMyArMjM5LDI2IEBACiAgICAgcmV0dXJuIHByZWNvbXB1dGFibGVDb3N0OwogICB9CiAKKyAgcHVibGljIGZsb2F0IGdldERlbnNlRmVhdHVyZShpbnQgaykgeworICAgIHJldHVybiBnZXRGZWF0dXJlVmVjdG9yKCkuZ2V0RGVuc2Uoayk7CisgIH0KKyAgCiAgIHB1YmxpYyB2b2lkIHNldFByZWNvbXB1dGFibGVDb3N0KGZsb2F0W10gcGhyYXNlX3dlaWdodHMsIEZlYXR1cmVWZWN0b3Igd2VpZ2h0cykgewotICAgIGludCBkZW5zZUZlYXR1cmVJbmRleCA9IDA7CiAgICAgZmxvYXQgY29zdCA9IDAuMGY7Ci0gICAgCi0gICAgaWYgKCFnZXRGZWF0dXJlU3RyaW5nKCkudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2V0RmVhdHVyZVN0cmluZygpKTsKLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgU3RyaW5nIHRva2VuID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgIGlmICh0b2tlbi5pbmRleE9mKCc9JykgPT0gLTEpIHsKLS8vICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJWQUxVRSglcykgPSAlLjVmIiwgdG9rZW4sIC1GbG9hdC5wYXJzZUZsb2F0KHRva2VuKSkpOwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb3N0ICs9IHBocmFzZV93ZWlnaHRzW2RlbnNlRmVhdHVyZUluZGV4KytdICogLUZsb2F0LnBhcnNlRmxvYXQodG9rZW4pOwotICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLyogVGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG1vcmUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgcnVsZSB0aGFuIHRoZXJlIGFyZSB3ZWlnaHRzCi0gICAgICAgICAgICAgKiBmb3VuZCBpbiB0aGUgY29uZmlnIGZpbGUuIENvbnNpc3RlbnQgd2l0aCB0cmVhdGluZyB1bmZvdW5kIHdlaWdodHMgYXMgaGF2ZSBhIHZhbHVlCi0gICAgICAgICAgICAgKiBvZiAwLCB3ZSBqdXN0IHNraXAgaXQgaGVyZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbnQgc3BsaXRQb2ludCA9IHRva2VuLmluZGV4T2YoJz0nKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRva2VuLnN1YnN0cmluZygwLCBzcGxpdFBvaW50KTsKLSAgICAgICAgICBmbG9hdCB2YWx1ZSA9IEZsb2F0LnBhcnNlRmxvYXQodG9rZW4uc3Vic3RyaW5nKHNwbGl0UG9pbnQgKyAxKSk7Ci0gICAgICAgICAgY29zdCArPSB3ZWlnaHRzLmdldChuYW1lKSAqIHZhbHVlOwotICAgICAgICB9Ci0gICAgICB9CisKKy8vICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIvLyBTZXR0aW5nIHByZWNvbXB1dGFibGUgY29zdCBmb3IgZm9yICVzLyVzIiwgZ2V0RW5nbGlzaFdvcmRzKCksIGdldEZyZW5jaFdvcmRzKCkpKTsKKyAgICBGZWF0dXJlVmVjdG9yIGZlYXR1cmVzID0gZ2V0RmVhdHVyZVZlY3RvcigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuZ2V0RGVuc2VGZWF0dXJlcygpLnNpemUoKSAmJiBpIDwgcGhyYXNlX3dlaWdodHMubGVuZ3RoOyBpKyspIHsKKy8vICAgICAgU3lzdGVtLmVyci5wcmludGxuKFN0cmluZy5mb3JtYXQoIiAgICAlZCAtPiAlLjVmIiwgaSwgZmVhdHVyZXMuZ2V0KGkpKSk7CisgICAgICBjb3N0ICs9IHBocmFzZV93ZWlnaHRzW2ldICogZmVhdHVyZXMuZ2V0RGVuc2UoaSk7CiAgICAgfQorCisgICAgZm9yIChTdHJpbmcga2V5OiBmZWF0dXJlcy5nZXRTcGFyc2VGZWF0dXJlcygpLmtleVNldCgpKSB7CisvLyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIgICAgJXMgLT4gJS41ZiIsIGtleSwgZmVhdHVyZXMuZ2V0KGtleSkpKTsKKyAgICAgIGNvc3QgKz0gd2VpZ2h0cy5nZXRTcGFyc2Uoa2V5KSAqIGZlYXR1cmVzLmdldFNwYXJzZShrZXkpOworICAgIH0KKyAgICAKKy8vICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCItPiAlZiIsIGNvc3QpKTsKICAgICAKICAgICB0aGlzLnByZWNvbXB1dGFibGVDb3N0ID0gY29zdDsKICAgfQpAQCAtMzUyLDcgKzM0Nyw3IEBACiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVTdHJpbmcoKSB7Ci0gICAgcmV0dXJuIHNwYXJzZUZlYXR1cmVzOworICAgIHJldHVybiBzcGFyc2VGZWF0dXJlU3RyaW5nOwogICB9CiAgIAogICAvKioKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi90bS9mb3JtYXQvTW9zZXNGb3JtYXRSZWFkZXIuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi90bS9mb3JtYXQvTW9zZXNGb3JtYXRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiYWRiYS4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vZm9ybWF0L01vc2VzRm9ybWF0UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi1wYWNrYWdlIGpvc2h1YS5kZWNvZGVyLmZmLnRtLmZvcm1hdDsKLQotaW1wb3J0IGpvc2h1YS5jb3JwdXMuVm9jYWJ1bGFyeTsKLWltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi50bS5Nb3Nlc1BocmFzZVJ1bGU7Ci1pbXBvcnQgam9zaHVhLnV0aWwuaW8uTGluZVJlYWRlcjsKLQotLyoqKgotICogVGhpcyBjbGFzcyByZWFkcyBpbiB0aGUgTW9zZXMgcGhyYXNlIHRhYmxlIGZvcm1hdCwgd2l0aCBzdXBwb3J0IGZvciB0aGUgc291cmNlIGFuZCB0YXJnZXQgc2lkZSwKLSAqIGxpc3Qgb2YgZmVhdHVyZXMsIGFuZCB3b3JkIGFsaWdubWVudHMuIEl0IHdvcmtzIGJ5IHNpbXBseSBjYXN0aW5nIHRoZSBwaHJhc2UtYmFzZWQgcnVsZXMgdG8KLSAqIGxlZnQtYnJhbmNoaW5nIGhpZXJhcmNoaWNhbCBydWxlcyBhbmQgcGFzc2luZyB0aGVtIG9uIHRvIGl0cyBwYXJlbnQgY2xhc3MsIHtASGllcm9Gb3JtYXRSZWFkZXJ9LgotICogCi0gKiBUaGVyZSBpcyBhbHNvIGEgdG9vbCB0byBjb252ZXJ0IHRoZSBncmFtbWFycyBkaXJlY3RseSwgc28gdGhhdCB0aGV5IGNhbiBiZSBzdWl0YWJseSBwYWNrZWQuIFVzYWdlOgotICogCi0gKiA8cHJlPgotICogICAgIGNhdCBQSFJBU0VfVEFCTEUgfCBqYXZhIC1jcCAkSk9TSFVBL2NsYXNzIGpvc2h1YS5kZWNvZGVyLmZmLnRtLmZvcm1hdC5QaHJhc2VGb3JtYXRSZWFkZXIgPiBncmFtbWFyCi0gKiA8L3ByZT4KLSAqIAotICogQGF1dGhvciBNYXR0IFBvc3QgPHBvc3RAY3Muamh1LmVkdT4KLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIE1vc2VzRm9ybWF0UmVhZGVyIGV4dGVuZHMgSGllcm9Gb3JtYXRSZWFkZXIgewotCi0gIHByaXZhdGUgaW50IGxoczsKLQotICBwdWJsaWMgTW9zZXNGb3JtYXRSZWFkZXIoU3RyaW5nIGdyYW1tYXJGaWxlKSB7Ci0gICAgc3VwZXIoZ3JhbW1hckZpbGUpOwotICAgIHRoaXMubGhzID0gVm9jYWJ1bGFyeS5pZCgiW1hdIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBNb3Nlc0Zvcm1hdFJlYWRlcigpIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMubGhzID0gVm9jYWJ1bGFyeS5pZCgiW1hdIik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG11bmdlcyBhIE1vc2VzLXN0eWxlIHBocmFzZSB0YWJsZSBpbnRvIGEgZ3JhbW1hci4KLSAgICogCi0gICAqICAgIG1vdHMgZnJhbmNhaXNlcyB8fHwgRnJlbmNoIHdvcmRzIHx8fCAxIDIgMyB8fHwgMC0xIDEtMAotICAgKiAgICAKLSAgICogYmVjb21lcwotICAgKiAKLSAgICogICAgW1hdIHx8fCBbWCwxXSBtb3RzIGZyYW5jYWlzZXMgfHx8IFtYLDFdIEZyZW5jaCB3b3JkcyB8fHwgMSAyIDMgIHx8fCAwLTEgMS0wCi0gICAqIAotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBNb3Nlc1BocmFzZVJ1bGUgcGFyc2VMaW5lKFN0cmluZyBsaW5lKSB7Ci0gICAgU3RyaW5nW10gZmllbGRzID0gbGluZS5zcGxpdChmaWVsZERlbGltaXRlcik7Ci0KLSAgICBpbnQgYXJpdHkgPSAxOwotICAgIAotICAgIC8vIGZvcmVpZ24gc2lkZQotICAgIFN0cmluZ1tdIGZvcmVpZ25Xb3JkcyA9IGZpZWxkc1swXS5zcGxpdCgiXFxzKyIpOwotICAgIGludFtdIGZyZW5jaCA9IG5ldyBpbnRbZm9yZWlnbldvcmRzLmxlbmd0aCArIDFdOwotICAgIGZyZW5jaFswXSA9IGxoczsgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JlaWduV29yZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGZyZW5jaFtpKzFdID0gVm9jYWJ1bGFyeS5pZChmb3JlaWduV29yZHNbaV0pOwotICAgIH0KLQotICAgIC8vIEVuZ2xpc2ggc2lkZQotICAgIFN0cmluZ1tdIGVuZ2xpc2hXb3JkcyA9IGZpZWxkc1sxXS5zcGxpdCgiXFxzKyIpOwotICAgIGludFtdIGVuZ2xpc2ggPSBuZXcgaW50W2VuZ2xpc2hXb3Jkcy5sZW5ndGggKyAxXTsKLSAgICBlbmdsaXNoWzBdID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmdsaXNoV29yZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGVuZ2xpc2hbaSsxXSA9IFZvY2FidWxhcnkuaWQoZW5nbGlzaFdvcmRzW2ldKTsKLSAgICB9Ci0KLSAgICAvLyB0cmFuc2Zvcm0gZmVhdHVyZSB2YWx1ZXMKLSAgICBTdHJpbmcgc3BhcnNlX2ZlYXR1cmVzID0gZmllbGRzWzJdOwotCi0vLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgicGFyc2VMaW5lOiAlc1xuICAtPiVzIiwgbGluZSwgc3BhcnNlX2ZlYXR1cmVzKSk7Ci0KLSAgICAvLyBhbGlnbm1lbnRzCi0gICAgU3RyaW5nIGFsaWdubWVudCA9IChmaWVsZHMubGVuZ3RoID4gMykgPyBmaWVsZHNbM10gOiBudWxsOwotCi0gICAgcmV0dXJuIG5ldyBNb3Nlc1BocmFzZVJ1bGUobGhzLCBmcmVuY2gsIGVuZ2xpc2gsIHNwYXJzZV9mZWF0dXJlcywgYXJpdHksIGFsaWdubWVudCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb252ZXJ0cyBhIE1vc2VzIHBocmFzZSB0YWJsZSB0byBhIEpvc2h1YSBncmFtbWFyLiAKLSAgICogCi0gICAqIEBwYXJhbSBhcmdzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgTW9zZXNGb3JtYXRSZWFkZXIgcmVhZGVyID0gbmV3IE1vc2VzRm9ybWF0UmVhZGVyKCk7Ci0gICAgZm9yIChTdHJpbmcgbGluZTogbmV3IExpbmVSZWFkZXIoU3lzdGVtLmluKSkgewotICAgICAgTW9zZXNQaHJhc2VSdWxlIHJ1bGUgPSByZWFkZXIucGFyc2VMaW5lKGxpbmUpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJ1bGUudGV4dEZvcm1hdCgpKTsKLSAgICB9ICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vZm9ybWF0L1BocmFzZUZvcm1hdFJlYWRlci5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3RtL2Zvcm1hdC9QaHJhc2VGb3JtYXRSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDE1MjI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3RtL2Zvcm1hdC9QaHJhc2VGb3JtYXRSZWFkZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorcGFja2FnZSBqb3NodWEuZGVjb2Rlci5mZi50bS5mb3JtYXQ7CisKK2ltcG9ydCBqb3NodWEuY29ycHVzLlZvY2FidWxhcnk7CitpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYudG0uUGhyYXNlUnVsZTsKK2ltcG9ydCBqb3NodWEudXRpbC5pby5MaW5lUmVhZGVyOworCisvKioqCisgKiBUaGlzIGNsYXNzIHJlYWRzIGluIHRoZSBNb3NlcyBwaHJhc2UgdGFibGUgZm9ybWF0LCB3aXRoIHN1cHBvcnQgZm9yIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBzaWRlLAorICogbGlzdCBvZiBmZWF0dXJlcywgYW5kIHdvcmQgYWxpZ25tZW50cy4gSXQgd29ya3MgYnkgc2ltcGx5IGNhc3RpbmcgdGhlIHBocmFzZS1iYXNlZCBydWxlcyB0bworICogbGVmdC1icmFuY2hpbmcgaGllcmFyY2hpY2FsIHJ1bGVzIGFuZCBwYXNzaW5nIHRoZW0gb24gdG8gaXRzIHBhcmVudCBjbGFzcywge0BIaWVyb0Zvcm1hdFJlYWRlcn0uCisgKiAKKyAqIFRoZXJlIGlzIGFsc28gYSB0b29sIHRvIGNvbnZlcnQgdGhlIGdyYW1tYXJzIGRpcmVjdGx5LCBzbyB0aGF0IHRoZXkgY2FuIGJlIHN1aXRhYmx5IHBhY2tlZC4gVXNhZ2U6CisgKiAKKyAqIDxwcmU+CisgKiAgICAgY2F0IFBIUkFTRV9UQUJMRSB8IGphdmEgLWNwICRKT1NIVUEvY2xhc3Mgam9zaHVhLmRlY29kZXIuZmYudG0uZm9ybWF0LlBocmFzZUZvcm1hdFJlYWRlciA+IGdyYW1tYXIKKyAqIDwvcHJlPgorICogCisgKiBAYXV0aG9yIE1hdHQgUG9zdCA8cG9zdEBjcy5qaHUuZWR1PgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgUGhyYXNlRm9ybWF0UmVhZGVyIGV4dGVuZHMgSGllcm9Gb3JtYXRSZWFkZXIgeworCisgIHByaXZhdGUgaW50IGxoczsKKyAgCisgIC8qIFdoZXRoZXIgd2UgYXJlIHJlYWRpbmcgYSBNb3NlcyBwaHJhc2UgdGFibGUgb3IgVGhyYXggcGhyYXNlIHRhYmxlICovCisgIHByaXZhdGUgYm9vbGVhbiBtb3Nlc19mb3JtYXQgPSBmYWxzZTsKKworICBwdWJsaWMgUGhyYXNlRm9ybWF0UmVhZGVyKFN0cmluZyBncmFtbWFyRmlsZSwgYm9vbGVhbiBpc19tb3NlcykgeworICAgIHN1cGVyKGdyYW1tYXJGaWxlKTsKKyAgICB0aGlzLmxocyA9IFZvY2FidWxhcnkuaWQoIltYXSIpOworICAgIHRoaXMubW9zZXNfZm9ybWF0ID0gaXNfbW9zZXM7CisgIH0KKyAgCisgIHB1YmxpYyBQaHJhc2VGb3JtYXRSZWFkZXIoKSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLmxocyA9IFZvY2FidWxhcnkuaWQoIltYXSIpOworICB9CisgIAorICAvKioKKyAgICogV2hlbiBkZWFsaW5nIHdpdGggTW9zZXMgZm9ybWF0LCB0aGlzIG11bmdlcyBhIE1vc2VzLXN0eWxlIHBocmFzZSB0YWJsZSBpbnRvIGEgZ3JhbW1hci4KKyAgICogCisgICAqICAgIG1vdHMgZnJhbmNhaXNlcyB8fHwgRnJlbmNoIHdvcmRzIHx8fCAxIDIgMyB8fHwgMC0xIDEtMAorICAgKiAgICAKKyAgICogYmVjb21lcworICAgKiAKKyAgICogICAgW1hdIHx8fCBbWCwxXSBtb3RzIGZyYW5jYWlzZXMgfHx8IFtYLDFdIEZyZW5jaCB3b3JkcyB8fHwgMSAyIDMgIHx8fCAwLTEgMS0wCisgICAqICAgIAorICAgKiBGb3IgdGhyYXgtZXh0cmFjdGVkIHBocmFzYWwgZ3JhbW1hcnMsIGl0IHRyYW5zZm9ybXMKKyAgICogCisgICAqICAgIFtYXSB8fHwgbW90cyBmcmFuY2Fpc2VzIHx8fCBGcmVuY2ggd29yZHMgfHx8IDEgMiAzIHx8fCAwLTEgMS0wCisgICAqCisgICAqIGludG8KKyAgICogCisgICAqICAgIFtYXSB8fHwgW1gsMV0gbW90cyBmcmFuY2Fpc2VzIHx8fCBbWCwxXSBGcmVuY2ggd29yZHMgfHx8IDEgMiAzIHx8fCAwLTEgMS0wCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFBocmFzZVJ1bGUgcGFyc2VMaW5lKFN0cmluZyBsaW5lKSB7CisgICAgU3RyaW5nW10gZmllbGRzID0gbGluZS5zcGxpdChmaWVsZERlbGltaXRlcik7CisKKyAgICBpbnQgYXJpdHkgPSAxOworICAgIAorICAgIC8qIEZvciBUaHJheCBwaHJhc2UtYmFzZWQgZ3JhbW1hcnMsIHNraXAgb3ZlciB0aGUgYmVnaW5uaW5nIG5vbnRlcm1pbmFsICovCisgICAgaW50IGZpZWxkSW5kZXggPSAwOworICAgIGlmICghIG1vc2VzX2Zvcm1hdCkKKyAgICAgIGZpZWxkSW5kZXgrKzsKKyAgICAKKyAgICAvLyBmb3JlaWduIHNpZGUKKyAgICBTdHJpbmdbXSBmb3JlaWduV29yZHMgPSBmaWVsZHNbZmllbGRJbmRleF0uc3BsaXQoIlxccysiKTsKKyAgICBpbnRbXSBmcmVuY2ggPSBuZXcgaW50W2ZvcmVpZ25Xb3Jkcy5sZW5ndGggKyAxXTsKKyAgICBmcmVuY2hbMF0gPSBsaHM7IAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9yZWlnbldvcmRzLmxlbmd0aDsgaSsrKSB7CisgICAgICBmcmVuY2hbaSsxXSA9IFZvY2FidWxhcnkuaWQoZm9yZWlnbldvcmRzW2ldKTsKKyAgICB9CisKKyAgICAvLyBFbmdsaXNoIHNpZGUKKyAgICBmaWVsZEluZGV4Kys7CisgICAgU3RyaW5nW10gZW5nbGlzaFdvcmRzID0gZmllbGRzW2ZpZWxkSW5kZXhdLnNwbGl0KCJcXHMrIik7CisgICAgaW50W10gZW5nbGlzaCA9IG5ldyBpbnRbZW5nbGlzaFdvcmRzLmxlbmd0aCArIDFdOworICAgIGVuZ2xpc2hbMF0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZ2xpc2hXb3Jkcy5sZW5ndGg7IGkrKykgeworICAgICAgZW5nbGlzaFtpKzFdID0gVm9jYWJ1bGFyeS5pZChlbmdsaXNoV29yZHNbaV0pOworICAgIH0KKworICAgIC8vIHRyYW5zZm9ybSBmZWF0dXJlIHZhbHVlcworICAgIGZpZWxkSW5kZXgrKzsKKyAgICBTdHJpbmcgc3BhcnNlX2ZlYXR1cmVzID0gZmllbGRzW2ZpZWxkSW5kZXhdOworCisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgicGFyc2VMaW5lOiAlc1xuICAtPiVzIiwgbGluZSwgc3BhcnNlX2ZlYXR1cmVzKSk7CisKKyAgICAvLyBhbGlnbm1lbnRzCisgICAgZmllbGRJbmRleCsrOworICAgIFN0cmluZyBhbGlnbm1lbnQgPSAoZmllbGRzLmxlbmd0aCA+IGZpZWxkSW5kZXgpID8gZmllbGRzW2ZpZWxkSW5kZXhdIDogbnVsbDsKKworICAgIHJldHVybiBuZXcgUGhyYXNlUnVsZShsaHMsIGZyZW5jaCwgZW5nbGlzaCwgc3BhcnNlX2ZlYXR1cmVzLCBhcml0eSwgYWxpZ25tZW50KTsKKyAgfQorICAKKyAgLyoqCisgICAqIENvbnZlcnRzIGEgTW9zZXMgcGhyYXNlIHRhYmxlIHRvIGEgSm9zaHVhIGdyYW1tYXIuIAorICAgKiAKKyAgICogQHBhcmFtIGFyZ3MKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICBQaHJhc2VGb3JtYXRSZWFkZXIgcmVhZGVyID0gbmV3IFBocmFzZUZvcm1hdFJlYWRlcigpOworICAgIGZvciAoU3RyaW5nIGxpbmU6IG5ldyBMaW5lUmVhZGVyKFN5c3RlbS5pbikpIHsKKyAgICAgIFBocmFzZVJ1bGUgcnVsZSA9IHJlYWRlci5wYXJzZUxpbmUobGluZSk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocnVsZS50ZXh0Rm9ybWF0KCkpOworICAgIH0gICAgCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi90bS9oYXNoX2Jhc2VkL01lbW9yeUJhc2VkQmF0Y2hHcmFtbWFyLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vaGFzaF9iYXNlZC9NZW1vcnlCYXNlZEJhdGNoR3JhbW1hci5qYXZhCmluZGV4IDMzZTU2YmQuLjBmNjdjMjcgMTAwNjQ0Ci0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi90bS9oYXNoX2Jhc2VkL01lbW9yeUJhc2VkQmF0Y2hHcmFtbWFyLmphdmEKKysrIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3RtL2hhc2hfYmFzZWQvTWVtb3J5QmFzZWRCYXRjaEdyYW1tYXIuamF2YQpAQCAtMSw2ICsxLDYgQEAKIHBhY2thZ2Ugam9zaHVhLmRlY29kZXIuZmYudG0uaGFzaF9iYXNlZDsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTE1LDcgKzE1LDcgQEAKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi50bS5HcmFtbWFyUmVhZGVyOwogaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLnRtLlRyaWU7CiBpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYudG0uZm9ybWF0LkhpZXJvRm9ybWF0UmVhZGVyOwotaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLnRtLmZvcm1hdC5Nb3Nlc0Zvcm1hdFJlYWRlcjsKK2ltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi50bS5mb3JtYXQuUGhyYXNlRm9ybWF0UmVhZGVyOwogaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLnRtLmZvcm1hdC5TYW10Rm9ybWF0UmVhZGVyOwogaW1wb3J0IGpvc2h1YS51dGlsLkZvcm1hdFV0aWxzOwogCkBAIC00MSw2ICs0MSw4IEBACiAgIC8qIFRoZSBudW1iZXIgb2YgZGlzdGluY3Qgc291cmNlIHNpZGVzLiAqLwogICBwcml2YXRlIGludCBxdHlSdWxlQmlucyA9IDA7CiAKKyAgcHJpdmF0ZSBpbnQgbnVtRGVuc2VGZWF0dXJlcyA9IDA7CisKICAgLyogVGhlIHRyaWUgcm9vdC4gKi8KICAgcHJpdmF0ZSBNZW1vcnlCYXNlZFRyaWUgcm9vdCA9IG51bGw7CiAKQEAgLTQ4LDcgKzUwLDcgQEAKICAgcHJpdmF0ZSBTdHJpbmcgZ3JhbW1hckZpbGU7CiAKICAgcHJpdmF0ZSBHcmFtbWFyUmVhZGVyPFJ1bGU+IG1vZGVsUmVhZGVyOwotICAKKwogICAvKiBXaGV0aGVyIHRoZSBncmFtbWFyJ3MgcnVsZXMgY29udGFpbiByZWd1bGFyIGV4cHJlc3Npb25zLiAqLwogICBwcml2YXRlIGJvb2xlYW4gaXNSZWdleHBHcmFtbWFyID0gZmFsc2U7CiAKQEAgLTcxLDcgKzczLDcgQEAKICAgICB0aGlzLm93bmVyID0gVm9jYWJ1bGFyeS5pZChvd25lcik7CiAgIH0KIAotICBwdWJsaWMgTWVtb3J5QmFzZWRCYXRjaEdyYW1tYXIoR3JhbW1hclJlYWRlcjxSdWxlPiBncixKb3NodWFDb25maWd1cmF0aW9uIGpvc2h1YUNvbmZpZ3VyYXRpb24pIHsKKyAgcHVibGljIE1lbW9yeUJhc2VkQmF0Y2hHcmFtbWFyKEdyYW1tYXJSZWFkZXI8UnVsZT4gZ3IsIEpvc2h1YUNvbmZpZ3VyYXRpb24gam9zaHVhQ29uZmlndXJhdGlvbikgewogICAgIC8vIHRoaXMuZGVmYXVsdE93bmVyID0gVm9jYWJ1bGFyeS5pZChkZWZhdWx0T3duZXIpOwogICAgIC8vIHRoaXMuZGVmYXVsdExIUyA9IFZvY2FidWxhcnkuaWQoZGVmYXVsdExIU1N5bWJvbCk7CiAgICAgdGhpcyhqb3NodWFDb25maWd1cmF0aW9uKTsKQEAgLTc5LDcgKzgxLDggQEAKICAgfQogCiAgIHB1YmxpYyBNZW1vcnlCYXNlZEJhdGNoR3JhbW1hcihTdHJpbmcgZm9ybWF0S2V5d29yZCwgU3RyaW5nIGdyYW1tYXJGaWxlLCBTdHJpbmcgb3duZXIsCi0gICAgICBTdHJpbmcgZGVmYXVsdExIU1N5bWJvbCwgaW50IHNwYW5MaW1pdCwgSm9zaHVhQ29uZmlndXJhdGlvbiBqb3NodWFDb25maWd1cmF0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgU3RyaW5nIGRlZmF1bHRMSFNTeW1ib2wsIGludCBzcGFuTGltaXQsIEpvc2h1YUNvbmZpZ3VyYXRpb24gam9zaHVhQ29uZmlndXJhdGlvbikKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKICAgICB0aGlzKGpvc2h1YUNvbmZpZ3VyYXRpb24pOwogICAgIHRoaXMub3duZXIgPSBWb2NhYnVsYXJ5LmlkKG93bmVyKTsKQEAgLTg3LDcgKzkwLDcgQEAKICAgICB0aGlzLnNwYW5MaW1pdCA9IHNwYW5MaW1pdDsKICAgICB0aGlzLmdyYW1tYXJGaWxlID0gZ3JhbW1hckZpbGU7CiAgICAgdGhpcy5zZXRSZWdleHBHcmFtbWFyKGZvcm1hdEtleXdvcmQuZXF1YWxzKCJyZWdleHAiKSk7Ci0gICAgCisKICAgICAvLyA9PT09IGxvYWRpbmcgZ3JhbW1hcgogICAgIHRoaXMubW9kZWxSZWFkZXIgPSBjcmVhdGVSZWFkZXIoZm9ybWF0S2V5d29yZCwgZ3JhbW1hckZpbGUpOwogICAgIGlmIChtb2RlbFJlYWRlciAhPSBudWxsKSB7CkBAIC05OCw3ICsxMDEsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIERlY29kZXIuTE9HKDEsICJDb3VsZG4ndCBjcmVhdGUgYSBHcmFtbWFyUmVhZGVyIGZvciBmaWxlICIgKyBncmFtbWFyRmlsZSArICIgd2l0aCBmb3JtYXQgIgotICAgICAgICAgICAgKyBmb3JtYXRLZXl3b3JkKTsKKyAgICAgICAgICArIGZvcm1hdEtleXdvcmQpOwogICAgIH0KIAogICAgIHRoaXMucHJpbnRHcmFtbWFyKCk7CkBAIC0xMTIsNyArMTE1LDcgQEAKICAgICAgIH0gZWxzZSBpZiAoInNhbXQiLmVxdWFscyhmb3JtYXQpKSB7CiAgICAgICAgIHJldHVybiBuZXcgU2FtdEZvcm1hdFJlYWRlcihncmFtbWFyRmlsZSk7CiAgICAgICB9IGVsc2UgaWYgKCJwaHJhc2UiLmVxdWFscyhmb3JtYXQpIHx8ICJtb3NlcyIuZXF1YWxzKGZvcm1hdCkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNb3Nlc0Zvcm1hdFJlYWRlcihncmFtbWFyRmlsZSk7CisgICAgICAgIHJldHVybiBuZXcgUGhyYXNlRm9ybWF0UmVhZGVyKGdyYW1tYXJGaWxlLCBmb3JtYXQuZXF1YWxzKCJtb3NlcyIpKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiogRkFUQUw6IHVua25vd24gZ3JhbW1hciBmb3JtYXQgJyVzJyIsIGZvcm1hdCkpOwogICAgICAgfQpAQCAtMTIwLDcgKzEyMyw2IEBACiAgICAgcmV0dXJuIG51bGw7CiAgIH0KIAotCiAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAvLyBNZXRob2RzCiAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTI4LDcgKzEzMCw3IEBACiAgIHB1YmxpYyB2b2lkIHNldFNwYW5MaW1pdChpbnQgc3BhbkxpbWl0KSB7CiAgICAgdGhpcy5zcGFuTGltaXQgPSBzcGFuTGltaXQ7CiAgIH0KLSAgCisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgZ2V0TnVtUnVsZXMoKSB7CiAgICAgcmV0dXJuIHRoaXMucXR5UnVsZXNSZWFkOwpAQCAtMTQ3LDcgKzE0OSw4IEBACiAgICAgaWYgKHRoaXMuc3BhbkxpbWl0ID09IC0xKSB7IC8vIG1vbm8tZ2x1ZSBncmFtbWFyCiAgICAgICByZXR1cm4gKGkgPT0gMCk7CiAgICAgfSBlbHNlIHsKLS8vICAgICAgU3lzdGVtLmVyci5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVzIEhBU1JVTEVGT1JTUEFOKCVkLCVkLCVkKS8lZCA9ICVzIiwgVm9jYWJ1bGFyeS53b3JkKHRoaXMub3duZXIpLCBpLCBqLCBwYXRoTGVuZ3RoLCBzcGFuTGltaXQsIHBhdGhMZW5ndGggPD0gdGhpcy5zcGFuTGltaXQpKTsKKyAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIlcyBIQVNSVUxFRk9SU1BBTiglZCwlZCwlZCkvJWQgPSAlcyIsCisgICAgICAvLyBWb2NhYnVsYXJ5LndvcmQodGhpcy5vd25lciksIGksIGosIHBhdGhMZW5ndGgsIHNwYW5MaW1pdCwgcGF0aExlbmd0aCA8PSB0aGlzLnNwYW5MaW1pdCkpOwogICAgICAgcmV0dXJuIChwYXRoTGVuZ3RoIDw9IHRoaXMuc3BhbkxpbWl0KTsKICAgICB9CiAgIH0KQEAgLTE2MywxOSArMTY2LDIyIEBACiAKICAgICAvLyBUT0RPOiBXaHkgdHdvIGluY3JlbWVudHM/CiAgICAgdGhpcy5xdHlSdWxlc1JlYWQrKzsKLSAgICAKLS8vICAgIGlmIChvd25lciA9PSAtMSkgewotLy8gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiogRkFUQUw6IE1lbW9yeUJhc2VkQmF0Y2hHcmFtbWFyOjphZGRSdWxlKCk6IG93bmVyIG5vdCBzZXQgZm9yIGdyYW1tYXIiKTsKLS8vICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0vLyAgICB9CisKKyAgICAvLyBpZiAob3duZXIgPT0gLTEpIHsKKyAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oIiogRkFUQUw6IE1lbW9yeUJhc2VkQmF0Y2hHcmFtbWFyOjphZGRSdWxlKCk6IG93bmVyIG5vdCBzZXQgZm9yIGdyYW1tYXIiKTsKKyAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKKyAgICAvLyB9CiAgICAgcnVsZS5zZXRPd25lcihvd25lcik7CiAKKyAgICBpZiAobnVtRGVuc2VGZWF0dXJlcyA9PSAwKQorICAgICAgbnVtRGVuc2VGZWF0dXJlcyA9IHJ1bGUuZ2V0RmVhdHVyZVZlY3RvcigpLmdldERlbnNlRmVhdHVyZXMoKS5zaXplKCk7CisKICAgICAvLyA9PT0gaWRlbnRpZnkgdGhlIHBvc2l0aW9uLCBhbmQgaW5zZXJ0IHRoZSB0cmllIG5vZGVzIGFzIG5lY2Vzc2FyeQogICAgIE1lbW9yeUJhc2VkVHJpZSBwb3MgPSByb290OwogICAgIGludFtdIGZyZW5jaCA9IHJ1bGUuZ2V0RnJlbmNoKCk7Ci0gICAgCisKICAgICBtYXhTb3VyY2VQaHJhc2VMZW5ndGggPSBNYXRoLm1heChtYXhTb3VyY2VQaHJhc2VMZW5ndGgsIGZyZW5jaC5sZW5ndGgpOwotICAgIAorCiAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBmcmVuY2gubGVuZ3RoOyBrKyspIHsKICAgICAgIGludCBjdXJTeW1JRCA9IGZyZW5jaFtrXTsKIApAQCAtMjA3LDcgKzIxMyw4IEBACiAgIH0KIAogICBwcm90ZWN0ZWQgdm9pZCBwcmludEdyYW1tYXIoKSB7Ci0gICAgRGVjb2Rlci5MT0coMSwgIFN0cmluZy5mb3JtYXQoIk1lbW9yeUJhc2VkQmF0Y2hHcmFtbWFyOiBSZWFkICVkIHJ1bGVzIHdpdGggJWQgZGlzdGluY3Qgc291cmNlIHNpZGVzIGZyb20gJyVzJyIsIAorICAgIERlY29kZXIuTE9HKDEsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICJNZW1vcnlCYXNlZEJhdGNoR3JhbW1hcjogUmVhZCAlZCBydWxlcyB3aXRoICVkIGRpc3RpbmN0IHNvdXJjZSBzaWRlcyBmcm9tICclcyciLAogICAgICAgICB0aGlzLnF0eVJ1bGVzUmVhZCwgdGhpcy5xdHlSdWxlQmlucywgZ3JhbW1hckZpbGUpKTsKICAgfQogCkBAIC0yMjEsNyArMjI4LDcgQEAKICAgcHVibGljIGJvb2xlYW4gaXNSZWdleHBHcmFtbWFyKCkgewogICAgIHJldHVybiB0aGlzLmlzUmVnZXhwR3JhbW1hcjsKICAgfQotICAKKwogICBwdWJsaWMgdm9pZCBzZXRSZWdleHBHcmFtbWFyKGJvb2xlYW4gdmFsdWUpIHsKICAgICB0aGlzLmlzUmVnZXhwR3JhbW1hciA9IHZhbHVlOwogICB9CkBAIC0yMzQsNTggKzI0MSw2MCBAQAogICAgKi8KICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGFkZE9PVlJ1bGVzKGludCBzb3VyY2VXb3JkLCBMaXN0PEZlYXR1cmVGdW5jdGlvbj4gZmVhdHVyZUZ1bmN0aW9ucykgewotICAgIAotICAgIC8vIFRPRE86IF9PT1Ygc2hvdWxkbid0IGJlIG91dHJpZ2h0IGFkZGVkLCBzaW5jZSB0aGUgd29yZCBtaWdodCBub3QgYmUgT09WIGZvciB0aGUgTE0gKGJ1dCBub3cgYWxtb3N0CisKKyAgICAvLyBUT0RPOiBfT09WIHNob3VsZG4ndCBiZSBvdXRyaWdodCBhZGRlZCwgc2luY2UgdGhlIHdvcmQgbWlnaHQgbm90IGJlIE9PViBmb3IgdGhlIExNIChidXQgbm93CisgICAgLy8gYWxtb3N0CiAgICAgLy8gY2VydGFpbmx5IGlzKQotICAgIGZpbmFsIGludCB0YXJnZXRXb3JkID0gdGhpcy5qb3NodWFDb25maWd1cmF0aW9uLm1hcmtfb292cwotICAgICAgICA/IFZvY2FidWxhcnkuaWQoVm9jYWJ1bGFyeS53b3JkKHNvdXJjZVdvcmQpICsgIl9PT1YiKQotICAgICAgICA6IHNvdXJjZVdvcmQ7ICAgCisgICAgZmluYWwgaW50IHRhcmdldFdvcmQgPSB0aGlzLmpvc2h1YUNvbmZpZ3VyYXRpb24ubWFya19vb3ZzID8gVm9jYWJ1bGFyeS5pZChWb2NhYnVsYXJ5CisgICAgICAgIC53b3JkKHNvdXJjZVdvcmQpICsgIl9PT1YiKSA6IHNvdXJjZVdvcmQ7CiAKICAgICBpbnRbXSBzb3VyY2VXb3JkcyA9IHsgc291cmNlV29yZCB9OwogICAgIGludFtdIHRhcmdldFdvcmRzID0geyB0YXJnZXRXb3JkIH07CiAgICAgZmluYWwgU3RyaW5nIG9vdkFsaWdubWVudCA9ICIwLTAiOwotICAgIAorCiAgICAgaWYgKHRoaXMuam9zaHVhQ29uZmlndXJhdGlvbi5vb3ZMaXN0ICE9IG51bGwgJiYgdGhpcy5qb3NodWFDb25maWd1cmF0aW9uLm9vdkxpc3Quc2l6ZSgpICE9IDApIHsKLSAgICAgIGZvciAoT09WSXRlbSBpdGVtOiB0aGlzLmpvc2h1YUNvbmZpZ3VyYXRpb24ub292TGlzdCkgewotICAgICAgICBSdWxlIG9vdlJ1bGUgPSBuZXcgUnVsZSgKLSAgICAgICAgICAgIFZvY2FidWxhcnkuaWQoaXRlbS5sYWJlbCksIHNvdXJjZVdvcmRzLCB0YXJnZXRXb3JkcywgIiIsIDAsCisgICAgICBmb3IgKE9PVkl0ZW0gaXRlbSA6IHRoaXMuam9zaHVhQ29uZmlndXJhdGlvbi5vb3ZMaXN0KSB7CisgICAgICAgIFJ1bGUgb292UnVsZSA9IG5ldyBSdWxlKFZvY2FidWxhcnkuaWQoaXRlbS5sYWJlbCksIHNvdXJjZVdvcmRzLCB0YXJnZXRXb3JkcywgIiIsIDAsCiAgICAgICAgICAgICBvb3ZBbGlnbm1lbnQpOwogICAgICAgICBhZGRSdWxlKG9vdlJ1bGUpOwogICAgICAgICBvb3ZSdWxlLmVzdGltYXRlUnVsZUNvc3QoZmVhdHVyZUZ1bmN0aW9ucyk7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIGludCBudF9pID0gVm9jYWJ1bGFyeS5pZCh0aGlzLmpvc2h1YUNvbmZpZ3VyYXRpb24uZGVmYXVsdF9ub25fdGVybWluYWwpOwotICAgICAgUnVsZSBvb3ZSdWxlID0gbmV3IFJ1bGUobnRfaSwgc291cmNlV29yZHMsIHRhcmdldFdvcmRzLCAiIiwgMCwKLSAgICAgICAgICBvb3ZBbGlnbm1lbnQpOworICAgICAgUnVsZSBvb3ZSdWxlID0gbmV3IFJ1bGUobnRfaSwgc291cmNlV29yZHMsIHRhcmdldFdvcmRzLCAiIiwgMCwgb292QWxpZ25tZW50KTsKICAgICAgIGFkZFJ1bGUob292UnVsZSk7CiAgICAgICBvb3ZSdWxlLmVzdGltYXRlUnVsZUNvc3QoZmVhdHVyZUZ1bmN0aW9ucyk7CiAgICAgfQogICB9Ci0gIAorCiAgIC8qKgogICAgKiBBZGRzIGEgZGVmYXVsdCBzZXQgb2YgZ2x1ZSBydWxlcy4KICAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlRnVuY3Rpb25zIAorICAgKiBAcGFyYW0gZmVhdHVyZUZ1bmN0aW9ucwogICAgKi8KICAgcHVibGljIHZvaWQgYWRkR2x1ZVJ1bGVzKEFycmF5TGlzdDxGZWF0dXJlRnVuY3Rpb24+IGZlYXR1cmVGdW5jdGlvbnMpIHsKICAgICBIaWVyb0Zvcm1hdFJlYWRlciByZWFkZXIgPSBuZXcgSGllcm9Gb3JtYXRSZWFkZXIoKTsKIAotICAgIFN0cmluZyBnb2FsTlQgPSBGb3JtYXRVdGlscy5jbGVhbk5vbnRlcm1pbmFsKGpvc2h1YUNvbmZpZ3VyYXRpb24uZ29hbF9zeW1ib2wpOwotICAgIFN0cmluZyBkZWZhdWx0TlQgPSBGb3JtYXRVdGlscy5jbGVhbk5vbnRlcm1pbmFsKGpvc2h1YUNvbmZpZ3VyYXRpb24uZGVmYXVsdF9ub25fdGVybWluYWwpOwotICAgIAorICAgIFN0cmluZyBnb2FsTlQgPSBGb3JtYXRVdGlscy5jbGVhbk5vblRlcm1pbmFsKGpvc2h1YUNvbmZpZ3VyYXRpb24uZ29hbF9zeW1ib2wpOworICAgIFN0cmluZyBkZWZhdWx0TlQgPSBGb3JtYXRVdGlscy5jbGVhbk5vblRlcm1pbmFsKGpvc2h1YUNvbmZpZ3VyYXRpb24uZGVmYXVsdF9ub25fdGVybWluYWwpOworCiAgICAgU3RyaW5nW10gcnVsZVN0cmluZ3MgPSBuZXcgU3RyaW5nW10gewogICAgICAgICBTdHJpbmcuZm9ybWF0KCJbJXNdIHx8fCAlcyB8fHwgJXMgfHx8IDAiLCBnb2FsTlQsIFZvY2FidWxhcnkuU1RBUlRfU1lNLAogICAgICAgICAgICAgVm9jYWJ1bGFyeS5TVEFSVF9TWU0pLAotICAgICAgICBTdHJpbmcuZm9ybWF0KCJbJXNdIHx8fCBbJXMsMV0gWyVzLDJdIHx8fCBbJXMsMV0gWyVzLDJdIHx8fCAtMSIsIAotICAgICAgICAgICAgZ29hbE5ULCBnb2FsTlQsIGRlZmF1bHROVCwgZ29hbE5ULCBkZWZhdWx0TlQpLAotICAgICAgICBTdHJpbmcuZm9ybWF0KCJbJXNdIHx8fCBbJXMsMV0gJXMgfHx8IFslcywxXSAlcyB8fHwgMCIsIAotICAgICAgICAgICAgZ29hbE5ULCBnb2FsTlQsIFZvY2FidWxhcnkuU1RPUF9TWU0sIGdvYWxOVCwgVm9jYWJ1bGFyeS5TVE9QX1NZTSkKLSAgICB9OwotICAgIAotICAgIGZvciAoU3RyaW5nIHJ1bGVTdHJpbmc6IHJ1bGVTdHJpbmdzKSB7CisgICAgICAgIFN0cmluZy5mb3JtYXQoIlslc10gfHx8IFslcywxXSBbJXMsMl0gfHx8IFslcywxXSBbJXMsMl0gfHx8IC0xIiwgZ29hbE5ULCBnb2FsTlQsIGRlZmF1bHROVCwKKyAgICAgICAgICAgIGdvYWxOVCwgZGVmYXVsdE5UKSwKKyAgICAgICAgU3RyaW5nLmZvcm1hdCgiWyVzXSB8fHwgWyVzLDFdICVzIHx8fCBbJXMsMV0gJXMgfHx8IDAiLCBnb2FsTlQsIGdvYWxOVCwKKyAgICAgICAgICAgIFZvY2FidWxhcnkuU1RPUF9TWU0sIGdvYWxOVCwgVm9jYWJ1bGFyeS5TVE9QX1NZTSkgfTsKKworICAgIGZvciAoU3RyaW5nIHJ1bGVTdHJpbmcgOiBydWxlU3RyaW5ncykgewogICAgICAgUnVsZSBydWxlID0gcmVhZGVyLnBhcnNlTGluZShydWxlU3RyaW5nKTsKICAgICAgIGFkZFJ1bGUocnVsZSk7CiAgICAgICBydWxlLmVzdGltYXRlUnVsZUNvc3QoZmVhdHVyZUZ1bmN0aW9ucyk7CiAgICAgfQogICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0TnVtRGVuc2VGZWF0dXJlcygpIHsKKyAgICByZXR1cm4gbnVtRGVuc2VGZWF0dXJlczsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL3RtL3BhY2tlZC9QYWNrZWRHcmFtbWFyLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vcGFja2VkL1BhY2tlZEdyYW1tYXIuamF2YQppbmRleCAwYmM5ZTc5Li43YTM1MDZlIDEwMDY0NAotLS0gYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vcGFja2VkL1BhY2tlZEdyYW1tYXIuamF2YQorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vcGFja2VkL1BhY2tlZEdyYW1tYXIuamF2YQpAQCAtMjgsMjUgKzI4LDQwIEBACiAgKiBzaGFyZWQgdm9jYWJ1bGFyeSwgYW5kIHRoZW4gcmVseSBvbiBKb3NodWEncyBhYmlsaXR5IHRvIHF1ZXJ5IG11bHRpcGxlIGdyYW1tYXJzIGZvciBydWxlcyB0bwogICogc29sdmUgdGhpcyBwcm9ibGVtLiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYnV0IGNvdWxkIGJlIGRvbmUgZGlyZWN0bHkgaW4gdGhlCiAgKiBHcmFtbWFyIFBhY2tlci4KKyAqCisgKiAqVVBEQVRFIDEwLzIwMTUqCisgKiBUaGUgaW50cm9kdWN0aW9uIG9mIGEgU2xpY2VBZ2dyZWdhdGluZ1RyaWUgdG9nZXRoZXIgd2l0aCBzb3J0aW5nIHRoZSBncmFtbWFyIGJ5IHRoZSBmdWxsIHNvdXJjZSBzdHJpbmcKKyAqIChub3QganVzdCBieSB0aGUgZmlyc3Qgc291cmNlIHdvcmQpIGFsbG93cyBkaXN0cmlidXRpbmcgcnVsZXMgd2l0aCB0aGUgc2FtZSBmaXJzdCBzb3VyY2Ugd29yZAorICogYWNyb3NzIG11bHRpcGxlIHNsaWNlcy4KKyAqIEBhdXRob3IgZmhpZWJlcgogICovCiAKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNvcnQ7CisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CiBpbXBvcnQgamF2YS5uaW8uSW50QnVmZmVyOwogaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwuTWFwTW9kZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgam9zaHVhLmNvcnB1cy5Wb2NhYnVsYXJ5OwogaW1wb3J0IGpvc2h1YS5kZWNvZGVyLkRlY29kZXI7CkBAIC01OSw2ICs3NCw3IEBACiBpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYudG0uUnVsZUNvbGxlY3Rpb247CiBpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYudG0uVHJpZTsKIGltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi50bS5oYXNoX2Jhc2VkLkV4dGVuc2lvbkl0ZXJhdG9yOworaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLnRtLnBhY2tlZC5TbGljZUFnZ3JlZ2F0aW5nVHJpZTsKIGltcG9ydCBqb3NodWEudXRpbC5lbmNvZGluZy5FbmNvZGVyQ29uZmlndXJhdGlvbjsKIGltcG9ydCBqb3NodWEudXRpbC5lbmNvZGluZy5GbG9hdEVuY29kZXI7CiBpbXBvcnQgam9zaHVhLnV0aWwuaW8uTGluZVJlYWRlcjsKQEAgLTY5LDYgKzg1LDkgQEAKIAogICBwcml2YXRlIFBhY2tlZFJvb3Qgcm9vdDsKICAgcHJpdmF0ZSBBcnJheUxpc3Q8UGFja2VkU2xpY2U+IHNsaWNlczsKKyAgcHJpdmF0ZSBmaW5hbCBGaWxlIHZvY2FiRmlsZTsgLy8gc3RvcmUgcGF0aCB0byB2b2NhYnVsYXJ5IGZpbGUKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0NBQlVMQVJZX0ZJTEVOQU1FID0gInZvY2FidWxhcnkiOwogCiAgIC8vIFRoZSBncmFtbWFyIHNwZWNpZmljYXRpb24ga2V5d29yZCAoZS5nLiwgInRocmF4IiBvciAibW9zZXMiKQogICBwcml2YXRlIFN0cmluZyB0eXBlOwpAQCAtODAsOSArOTksMTEgQEAKICAgICB0aGlzLnR5cGUgPSB0eXBlOwogCiAgICAgLy8gUmVhZCB0aGUgdm9jYWJ1bGFyeS4KLSAgICBTdHJpbmcgdm9jYWJGaWxlID0gZ3JhbW1hcl9kaXIgKyBGaWxlLnNlcGFyYXRvciArICJ2b2NhYnVsYXJ5IjsKKyAgICB2b2NhYkZpbGUgPSBuZXcgRmlsZShncmFtbWFyX2RpciArIEZpbGUuc2VwYXJhdG9yICsgVk9DQUJVTEFSWV9GSUxFTkFNRSk7CiAgICAgRGVjb2Rlci5MT0coMSwgU3RyaW5nLmZvcm1hdCgiUmVhZGluZyB2b2NhYnVsYXJ5OiAlcyIsIHZvY2FiRmlsZSkpOwotICAgIFZvY2FidWxhcnkucmVhZCh2b2NhYkZpbGUpOworICAgIGlmICghVm9jYWJ1bGFyeS5yZWFkKHZvY2FiRmlsZSkpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJtaXNtYXRjaGVzIG9yIGNvbGxpc2lvbnMgd2hpbGUgcmVhZGluZyBvbi1kaXNrIHZvY2FidWxhcnkiKTsKKyAgICB9CiAgICAgCiAgICAgLy8gUmVhZCB0aGUgY29uZmlnCiAgICAgU3RyaW5nIGNvbmZpZ0ZpbGUgPSBncmFtbWFyX2RpciArIEZpbGUuc2VwYXJhdG9yICsgImNvbmZpZyI7CkBAIC05OSwxNyArMTIwLDE4IEBACiAgICAgLy8gU2V0IHBocmFzZSBvd25lci4KICAgICB0aGlzLm93bmVyID0gVm9jYWJ1bGFyeS5pZChvd25lcik7CiAKLSAgICBTdHJpbmdbXSBsaXN0aW5nID0gbmV3IEZpbGUoZ3JhbW1hcl9kaXIpLmxpc3QoKTsKKyAgICBmaW5hbCBMaXN0PFN0cmluZz4gbGlzdGluZyA9IEFycmF5cy5hc0xpc3QobmV3IEZpbGUoZ3JhbW1hcl9kaXIpLmxpc3QoKSk7CisgICAgc29ydChsaXN0aW5nKTsgLy8gRmlsZS5saXN0KCkgaGFzIGFyYml0cmFyeSBzb3J0IG9yZGVyCiAgICAgc2xpY2VzID0gbmV3IEFycmF5TGlzdDxQYWNrZWRTbGljZT4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RpbmcubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmIChsaXN0aW5nW2ldLnN0YXJ0c1dpdGgoInNsaWNlXyIpICYmIGxpc3RpbmdbaV0uZW5kc1dpdGgoIi5zb3VyY2UiKSkKLSAgICAgICAgc2xpY2VzLmFkZChuZXcgUGFja2VkU2xpY2UoZ3JhbW1hcl9kaXIgKyBGaWxlLnNlcGFyYXRvciArIGxpc3RpbmdbaV0uc3Vic3RyaW5nKDAsIDExKSkpOworICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IGxpc3RpbmcpIHsKKyAgICAgIGlmIChwcmVmaXguc3RhcnRzV2l0aCgic2xpY2VfIikgJiYgcHJlZml4LmVuZHNXaXRoKCIuc291cmNlIikpCisgICAgICAgIHNsaWNlcy5hZGQobmV3IFBhY2tlZFNsaWNlKGdyYW1tYXJfZGlyICsgRmlsZS5zZXBhcmF0b3IgKyBwcmVmaXguc3Vic3RyaW5nKDAsIDExKSkpOwogICAgIH0KIAogICAgIGxvbmcgY291bnQgPSAwOwogICAgIGZvciAoUGFja2VkU2xpY2UgcyA6IHNsaWNlcykKICAgICAgIGNvdW50ICs9IHMuZXN0aW1hdGVkLmxlbmd0aDsKLSAgICByb290ID0gbmV3IFBhY2tlZFJvb3QodGhpcyk7CisgICAgcm9vdCA9IG5ldyBQYWNrZWRSb290KHNsaWNlcyk7CiAKICAgICBEZWNvZGVyLkxPRygxLCBTdHJpbmcuZm9ybWF0KCJMb2FkZWQgJWQgcnVsZXMiLCBjb3VudCkpOwogICB9CkBAIC0xMzIsMzAgKzE1NCwxMjEgQEAKICAgICByZXR1cm4gbnVtX3J1bGVzOwogICB9CiAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0TnVtRGVuc2VGZWF0dXJlcygpIHsKKyAgICByZXR1cm4gZW5jb2RpbmcuZ2V0TnVtRGVuc2VGZWF0dXJlcygpOworICB9CisKICAgcHVibGljIFJ1bGUgY29uc3RydWN0TWFudWFsUnVsZShpbnQgbGhzLCBpbnRbXSBzcmMsIGludFtdIHRndCwgZmxvYXRbXSBzY29yZXMsIGludCBhcml0eSkgewogICAgIHJldHVybiBudWxsOwogICB9CisgIAorICAvKioKKyAgICogQ29tcHV0ZXMgdGhlIE1ENSBjaGVja3N1bSBvZiB0aGUgdm9jYWJ1bGFyeSBmaWxlLgorICAgKiBDYW4gYmUgdXNlZCBmb3IgY29tcGFyaW5nIHZvY2FidWxhcmllcyBhY3Jvc3MgbXVsdGlwbGUgcGFja2VkR3JhbW1hcnMuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVWb2NhYnVsYXJ5Q2hlY2tzdW0oKSB7CisgICAgTWVzc2FnZURpZ2VzdCBtZDsKKyAgICB0cnkgeworICAgICAgbWQgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gY2hlY2tzdW0gYWxnb3JpdGhtIik7CisgICAgfQorICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICB0cnkgKGZpbmFsIElucHV0U3RyZWFtIGlzID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oUGF0aHMuZ2V0KHZvY2FiRmlsZS50b1N0cmluZygpKSk7CisgICAgICAgIERpZ2VzdElucHV0U3RyZWFtIGRpcyA9IG5ldyBEaWdlc3RJbnB1dFN0cmVhbShpcywgbWQpKSB7CisgICAgICB3aGlsZSAoZGlzLnJlYWQoYnVmZmVyKSAhPSAtMSkge30KKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuIG5vdCBmaW5kIHZvY2FidWxhcnkgZmlsZS4gVGhpcyBzaG91bGQgbm90IGhhcHBlbi4iKTsKKyAgICB9CisgICAgYnl0ZVtdIGRpZ2VzdCA9IG1kLmRpZ2VzdCgpOworICAgIC8vIGNvbnZlcnQgdGhlIGJ5dGUgdG8gaGV4IGZvcm1hdAorICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnZXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZygoZGlnZXN0W2ldICYgMHhmZikgKyAweDEwMCwgMTYpLnN1YnN0cmluZygxKSk7CisgICAgfQorICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CiAKKyAgLyoqCisgICAqIFBhY2tlZFJvb3QgcmVwcmVzZW50cyB0aGUgcm9vdCBvZiB0aGUgcGFja2VkIGdyYW1tYXIgdHJpZS4KKyAgICogVHJpZXMgZm9yIGRpZmZlcmVudCBzb3VyY2Utc2lkZSBmaXJzdHdvcmRzIGFyZSBvcmdhbml6ZWQgaW4KKyAgICogcGFja2VkU2xpY2VzIG9uIGRpc2suIEEgcGFja2VkU2xpY2UgY2FuIGNvbnRhaW4gbXVsdGlwbGUgdHJpZQorICAgKiByb290cyAoaS5lLiBtdWx0aXBsZSBzb3VyY2Utc2lkZSBmaXJzdHdvcmRzKS4KKyAgICogVGhlIFBhY2tlZFJvb3QgYnVpbGRzIGEgbG9va3VwIHRhYmxlLCBtYXBwaW5nIGZyb20KKyAgICogc291cmNlLXNpZGUgZmlyc3R3b3JkcyB0byB0aGUgYWRkcmVzc2VzIGluIHRoZSBwYWNrZWRTbGljZXMKKyAgICogdGhhdCByZXByZXNlbnQgdGhlIHN1YnRyaWUgZm9yIGEgcGFydGljdWxhciBmaXJzdHdvcmQuCisgICAqIElmIHRoZSBHcmFtbWFyUGFja2VyIGhhcyB0byBkaXN0cmlidXRlIHJ1bGVzIGZvciBhCisgICAqIHNvdXJjZS1zaWRlIGZpcnN0d29yZCBhY3Jvc3MgbXVsdGlwbGUgc2xpY2VzLCBhCisgICAqIFNsaWNlQWdncmVnYXRpbmdUcmllIG5vZGUgaXMgY3JlYXRlZCB0aGF0IGFnZ3JlZ2F0ZXMgdGhvc2UgCisgICAqIHRyaWVzIHRvIGhpZGUKKyAgICogdGhpcyBhZGRpdGlvbmFsIGNvbXBsZXhpdHkgZnJvbSB0aGUgZ3JhbW1hciBpbnRlcmZhY2UKKyAgICogVGhpcyBmZWF0dXJlIGFsbG93cyBwYWNraW5nIG9mIGdyYW1tYXJzIHdoZXJlIHRoZSBsaXN0IG9mIHJ1bGVzCisgICAqIGZvciBhIHNpbmdsZSBzb3VyY2Utc2lkZSBmaXJzdHdvcmQgd291bGQgZXhjZWVkIHRoZSBtYXhpbXVtIGFycmF5CisgICAqIHNpemUgb2YgSmF2YSAoMmdiKS4KKyAgICovCiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBQYWNrZWRSb290IGltcGxlbWVudHMgVHJpZSB7CiAKLSAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgUGFja2VkU2xpY2U+IGxvb2t1cDsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8SW50ZWdlciwgVHJpZT4gbG9va3VwOwogCi0gICAgcHVibGljIFBhY2tlZFJvb3QoUGFja2VkR3JhbW1hciBncmFtbWFyKSB7Ci0gICAgICBsb29rdXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBQYWNrZWRTbGljZT4oKTsKLQotICAgICAgZm9yIChQYWNrZWRTbGljZSBwcyA6IGdyYW1tYXIuc2xpY2VzKSB7Ci0gICAgICAgIGludCBudW1fY2hpbGRyZW4gPSBwcy5zb3VyY2VbMF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2NoaWxkcmVuOyBpKyspCi0gICAgICAgICAgbG9va3VwLnB1dChwcy5zb3VyY2VbMiAqIGkgKyAxXSwgcHMpOworICAgIHB1YmxpYyBQYWNrZWRSb290KGZpbmFsIExpc3Q8UGFja2VkU2xpY2U+IHNsaWNlcykgeworICAgICAgZmluYWwgTWFwPEludGVnZXIsIExpc3Q8VHJpZT4+IGNoaWxkVHJpZXMgPSBjb2xsZWN0Q2hpbGRUcmllcyhzbGljZXMpOworICAgICAgbG9va3VwID0gYnVpbGRMb29rdXBUYWJsZShjaGlsZFRyaWVzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRyaWUgbm9kZXMgZm9yIHNvdXJjZSBmaXJzdC13b3JkcyBhcmUgc3ByZWFkIG92ZXIgCisgICAgICogbXVsdGlwbGUgcGFja2VkU2xpY2VzIGJ5IGNvdW50aW5nIHRoZWlyIG9jY3VycmVuY2VzLgorICAgICAqIEBwYXJhbSBzbGljZXMKKyAgICAgKiBAcmV0dXJuIEEgbWFwcGluZyBmcm9tIGZpcnN0IHdvcmQgaWRzIHRvIGEgbGlzdCBvZiB0cmllIG5vZGVzLgorICAgICAqLworICAgIHByaXZhdGUgTWFwPEludGVnZXIsIExpc3Q8VHJpZT4+IGNvbGxlY3RDaGlsZFRyaWVzKGZpbmFsIExpc3Q8UGFja2VkU2xpY2U+IHNsaWNlcykgeworICAgICAgZmluYWwgTWFwPEludGVnZXIsIExpc3Q8VHJpZT4+IGNoaWxkVHJpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICBmb3IgKFBhY2tlZFNsaWNlIHBhY2tlZFNsaWNlIDogc2xpY2VzKSB7CisgICAgICAgIAorICAgICAgICAvLyBudW1iZXIgb2YgdHJpZXMgc3RvcmVkIGluIHRoaXMgcGFja2VkU2xpY2UKKyAgICAgICAgZmluYWwgaW50IG51bV9jaGlsZHJlbiA9IHBhY2tlZFNsaWNlLnNvdXJjZVswXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fY2hpbGRyZW47IGkrKykgeworICAgICAgICAgIGZpbmFsIGludCBpZCA9IHBhY2tlZFNsaWNlLnNvdXJjZVsyICogaSArIDFdOworICAgICAgICAgIAorICAgICAgICAgIC8qIGFnZ3JlZ2F0ZSB0cmllcyB3aXRoIHNhbWUgcm9vdCBpZAorICAgICAgICAgICAqIG9idGFpbiBhIFRyaWUgbm9kZSwgYWxyZWFkeSBhdCB0aGUgY29ycmVjdCBhZGRyZXNzIGluIHRoZSBwYWNrZWRTbGljZS4KKyAgICAgICAgICAgKiBJbiBvdGhlciB3b3JkcywgdGhlIGxvb2t1cCBpbmRleCBhbHJlYWR5IHBvaW50cyB0byB0aGUgY29ycmVjdCB0cmllIG5vZGUgaW4gdGhlIHBhY2tlZFNsaWNlLgorICAgICAgICAgICAqIHBhY2tlZFJvb3QubWF0Y2goKSB0aHVzIGNhbiBkaXJlY3RseSByZXR1cm4gdGhlIHJlc3VsdCBvZiBsb29rdXAuZ2V0KGlkKTsKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoIWNoaWxkVHJpZXMuY29udGFpbnNLZXkoaWQpKSB7CisgICAgICAgICAgICBjaGlsZFRyaWVzLnB1dChpZCwgbmV3IEFycmF5TGlzdDxUcmllPigxKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsIFRyaWUgdHJpZSA9IHBhY2tlZFNsaWNlLnJvb3QoKS5tYXRjaChpZCk7CisgICAgICAgICAgY2hpbGRUcmllcy5nZXQoaWQpLmFkZCh0cmllKTsKKyAgICAgICAgfQogICAgICAgfQorICAgICAgcmV0dXJuIGNoaWxkVHJpZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEJ1aWxkIGEgbG9va3VwIHRhYmxlIGZvciBjaGlsZHJlbiB0cmllcy4KKyAgICAgKiBJZiB0aGUgbGlzdCBjb250YWlucyBvbmx5IGEgc2luZ2xlIGNoaWxkIG5vZGUsIGEgcmVndWxhciB0cmllIG5vZGUKKyAgICAgKiBpcyBpbnNlcnRlZCBpbnRvIHRoZSB0YWJsZTsgb3RoZXJ3aXNlIGEgU2xpY2VBZ2dyZWdhdGluZ1RyaWUgbm9kZSBpcworICAgICAqIGNyZWF0ZWQgdGhhdCBoaWRlcyB0aGlzIHBhcnRpdGlvbmluZyBpbnRvIG11bHRpcGxlIHBhY2tlZFNsaWNlcworICAgICAqIHVwc3RyZWFtLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLFRyaWU+IGJ1aWxkTG9va3VwVGFibGUoZmluYWwgTWFwPEludGVnZXIsIExpc3Q8VHJpZT4+IGNoaWxkVHJpZXMpIHsKKyAgICAgIEhhc2hNYXA8SW50ZWdlcixUcmllPiBsb29rdXAgPSBuZXcgSGFzaE1hcDw+KGNoaWxkVHJpZXMuc2l6ZSgpKTsKKyAgICAgIGZvciAoaW50IGlkIDogY2hpbGRUcmllcy5rZXlTZXQoKSkgeworICAgICAgICBmaW5hbCBMaXN0PFRyaWU+IHRyaWVzID0gY2hpbGRUcmllcy5nZXQoaWQpOworICAgICAgICBpZiAodHJpZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICBsb29rdXAucHV0KGlkLCB0cmllcy5nZXQoMCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxvb2t1cC5wdXQoaWQsIG5ldyBTbGljZUFnZ3JlZ2F0aW5nVHJpZSh0cmllcykpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbG9va3VwOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBUcmllIG1hdGNoKGludCB3b3JkX2lkKSB7Ci0gICAgICBQYWNrZWRTbGljZSBwcyA9IGxvb2t1cC5nZXQod29yZF9pZCk7Ci0gICAgICBpZiAocHMgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHBzLnJvb3QoKS5tYXRjaCh3b3JkX2lkKTsKLSAgICAgIHJldHVybiBudWxsOworICAgICAgcmV0dXJuIGxvb2t1cC5nZXQod29yZF9pZCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNjUsMTkgKzI3OCwxMiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEhhc2hNYXA8SW50ZWdlciwgPyBleHRlbmRzIFRyaWU+IGdldENoaWxkcmVuKCkgewotICAgICAgSGFzaE1hcDxJbnRlZ2VyLCBUcmllPiBjaGlsZHJlbiA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFRyaWU+KCk7Ci0gICAgICBmb3IgKGludCBrZXkgOiBsb29rdXAua2V5U2V0KCkpCi0gICAgICAgIGNoaWxkcmVuLnB1dChrZXksIG1hdGNoKGtleSkpOwotICAgICAgcmV0dXJuIGNoaWxkcmVuOworICAgICAgcmV0dXJuIGxvb2t1cDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQXJyYXlMaXN0PD8gZXh0ZW5kcyBUcmllPiBnZXRFeHRlbnNpb25zKCkgewotICAgICAgQXJyYXlMaXN0PFRyaWU+IHRyaWVzID0gbmV3IEFycmF5TGlzdDxUcmllPigpOwotICAgICAgZm9yIChpbnQga2V5IDogbG9va3VwLmtleVNldCgpKSB7Ci0gICAgICAgIHRyaWVzLmFkZChtYXRjaChrZXkpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cmllczsKKyAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4obG9va3VwLnZhbHVlcygpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIyMSw2ICszMjcsOSBAQAogICAgIHByaXZhdGUgTWFwcGVkQnl0ZUJ1ZmZlciBhbGlnbm1lbnRzOwogICAgIHByaXZhdGUgaW50W10gYWxpZ25tZW50TG9va3VwOwogCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgYSBjYWNoZSBvZiBwYWNrZWRUcmllIG5vZGVzIHRvIGJlIHVzZWQgaW4gZ2V0VHJpZS4KKyAgICAgKi8KICAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgUGFja2VkVHJpZT4gdHJpZXM7CiAKICAgICBwdWJsaWMgUGFja2VkU2xpY2UoU3RyaW5nIHByZWZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTUxNSw3ICs2MjQsNyBAQAogCiAgICAgICAgIEFycmF5TGlzdDxSdWxlPiBydWxlcyA9IG5ldyBBcnJheUxpc3Q8UnVsZT4obnVtX3J1bGVzKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fcnVsZXM7IGkrKykgewotICAgICAgICAgIGlmICh0eXBlLmVxdWFscygibW9zZXMiKSkKKyAgICAgICAgICBpZiAodHlwZS5lcXVhbHMoIm1vc2VzIikgfHwgdHlwZS5lcXVhbHMoInBocmFzZSIpKQogICAgICAgICAgICAgcnVsZXMuYWRkKG5ldyBQYWNrZWRQaHJhc2VQYWlyKHJ1bGVfcG9zaXRpb24gKyAzICogaSkpOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHJ1bGVzLmFkZChuZXcgUGFja2VkUnVsZShydWxlX3Bvc2l0aW9uICsgMyAqIGkpKTsKQEAgLTc4NSw3ICs4OTQsNyBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEZlYXR1cmVWZWN0b3IgZ2V0RmVhdHVyZVZlY3RvcigpIHsKICAgICAgICAgICBpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZVZlY3RvcihnZXRGZWF0dXJlcyhzb3VyY2VbYWRkcmVzcyArIDJdKSwgIiIpOworICAgICAgICAgICAgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZVZlY3RvcihnZXRGZWF0dXJlcyhzb3VyY2VbYWRkcmVzcyArIDJdKSwgInRtXyIgKyBWb2NhYnVsYXJ5LndvcmQob3duZXIpICsgIl8iKTsKICAgICAgICAgICB9CiAKICAgICAgICAgICByZXR1cm4gZmVhdHVyZXM7CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vcGFja2VkL1NsaWNlQWdncmVnYXRpbmdUcmllLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvZmYvdG0vcGFja2VkL1NsaWNlQWdncmVnYXRpbmdUcmllLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3ODNmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qb3NodWEvZGVjb2Rlci9mZi90bS9wYWNrZWQvU2xpY2VBZ2dyZWdhdGluZ1RyaWUuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorcGFja2FnZSBqb3NodWEuZGVjb2Rlci5mZi50bS5wYWNrZWQ7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi5GZWF0dXJlRnVuY3Rpb247CitpbXBvcnQgam9zaHVhLmRlY29kZXIuZmYudG0uUnVsZTsKK2ltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi50bS5SdWxlQ29sbGVjdGlvbjsKK2ltcG9ydCBqb3NodWEuZGVjb2Rlci5mZi50bS5UcmllOworaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLnRtLmhhc2hfYmFzZWQuRXh0ZW5zaW9uSXRlcmF0b3I7CisKKy8qKgorICogU2xpY2VBZ2dyZWdhdGluZ1RyaWUgY29sbGFwc2VzIG11bHRpcGxlIHRyaWVzCisgKiB3aXRoIHRoZSBzYW1lIHNvdXJjZSByb290IChpLmUuIHRyaWVzIGZyb20gbXVsdGlwbGUgcGFja2VkIHNsaWNlcykuCisgKiAKKyAqIENvbnNpZGVyIHRoZSBleGFtcGxlIGJlbG93LgorICogV2l0aG91dCBTbGljZUFnZ3JlZ2F0aW5nVHJpZXMsIHRoZSBmb2xsb3dpbmcgZ3JhbW1hciBydWxlcyBjb3VsZCBoYXZlIG9ubHkKKyAqIHBhcnRpdGlvbmVkIGJ5IHNwbGl0dGluZyBydWxlIGxpc3RzIHdoZW4gdGhlIGZpcnN0IHdvcmQgb2YgU09VUkNFIGNoYW5nZXMuICgiPiIgbWFya2VycykuCisgKiAKKyAqIFVzaW5nIGEgU2xpY2VBZ2dyZWdhdGluZ1RyaWUgYWxsb3dzIHNwbGl0dGluZyBhdCBjaGFuZ2VzIG9mIHNlY29uZCBTT1VSQ0Ugd29yZHMgKCI+PiIgbWFya2VyKS4KKyAqIAorICogRVhBTVBMRTogKExIUyB8fHwgU09VUkNFIHx8fCBUQVJHRVQpCisgKiBbWF0gfHx8IC0gfHx8IC0KKyAqID4KKyAqIFtYXSB8fHwgW1hdIHx8fCBbWF0KKyAqID4+CisgKiBbWF0gfHx8IFtYXSBhIHx8fCBbWF0gQQorICogW1hdIHx8fCBbWF0gYSB8fHwgW1hdIEEKKyAqID4+CisgKiBbWF0gfHx8IFtYXSBiIHx8fCBbWF0gQgorICogPgorICogW1hdIHx8fCB1IHx8fCB1CisgKiAKKyAqIEEgU2xpY2VBZ2dyZWdhdGluZ1RyaWUgbm9kZSBiZWhhdmVzIGp1c3QgbGlrZSBhIHJlZ3VsYXIgVHJpZSBub2RlIGJ1dCBzdWJzdW1lcyBhIGxpc3Qgb2YgZXh0ZW5zaW9ucy9jaGlsZHJlbi4KKyAqIFRoaXMgY2xhc3MgaGlkZXMgdGhlIGNvbXBsZXhpdHkgb2YgaGF2aW5nIG11bHRpcGxlIHRyaWVzIHdpdGggdGhlIHNhbWUgcm9vdAorICogZnJvbSBub2RlcyBvbmUgbGV2ZWwgdXAuCisgKiBTaW1pbGFyIHRvIFBhY2tlZFJvb3QsIGl0IG1haW50YWlucyBhIGxvb2t1cCB0YWJsZSBvZiBjaGlsZHJlbidzCisgKiBzb3VyY2Utc2lkZSB3b3JkcyB0byBrbm93CisgKiBpbiB3aGljaCBzdWJ0cmllIChpLmUuIHBhY2tlZFNsaWNlKSBpdCBuZWVkcyB0byB0cmF2ZXJzZSBpbnRvIHdoZW4gCisgKiBtYXRjaCgpIGlzIGNhbGxlZC4KKyAqIEEgU2xpY2VBZ2dyZWdhdGluZ1RyaWUgbmV2ZXIgaG9sZHMgYW55IHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGh1cworICogcnVsZXMgd2l0aCB0aGUgc291cmNlLXNpZGUgcmVwcmVzZW50ZWQgYnkgdGhlIFNsaWNlQWdncmVnYXRpbmdUcmllIG5vZGUKKyAqIG11c3QgYmUgZm91bmQgaW4gZXhhY3RseSBvbmUgb2YgdGhlIHN1YnRyaWVzLgorICogKCEpIFRoaXMgYXNzdW1wdGlvbiByZWxpZXMgb24gdGhlIHNvcnQgb3JkZXIgb2YgdGhlIHBhY2tlZCBncmFtbWFyLgorICogSWYgdGhlIGdyYW1tYXIgd2FzIGluY29ycmVjdGx5IHNvcnRlZCBhbmQgdGhlbiBwYWNrZWQsIGNvbnN0cnVjdGlvbgorICogb2YgU2xpY2VBZ2dyZWdhdGluZ1RyaWUgbm9kZXMgZmFpbHMuIAorICogCisgKiBAYXV0aG9yIGZoaWViZXIKKyAqLworcHVibGljIGNsYXNzIFNsaWNlQWdncmVnYXRpbmdUcmllIGltcGxlbWVudHMgVHJpZSwgUnVsZUNvbGxlY3Rpb24geworICAKKyAgLyoqCisgICAqIEEgbXVsdGl0dWRlIG9mIHBhY2tlZFRyaWVzIHdpdGggdGhlIHNhbWUgc291cmNlLXNpZGUKKyAgICogZmlyc3R3b3JkLiBUaGUgb3JkZXIgaXMgaW5kdWNlZCBieSB0aGUKKyAgICogc29ydGluZyBvcmRlciBvZiB0aGUgdGV4dCBncmFtbWFyIHRoYXQgd2FzIGlucHV0IHRvIHRoZSBHcmFtbWFyUGFja2VyLgorICAgKiBUaGlzIGltcGxpZXMgdGhhdCBydWxlcyBmb3IgdGhlIG5vZGUgcmVwcmVzZW50ZWQgYnkgdGhpcyBTbGljZUFnZ3JlZ2F0aW5nVHJpZQorICAgKiBpbnN0YW5jZSBtdXN0IGJlIGZvdW5kIGluIE9ORSBvZiB0aGUgc3ViIHRyaWVzLgorICAgKiBUaGlzIGlzIGNoZWNrZWQgYmVsb3cgaW4gdGhlIGNvbnN0cnVjdG9yLiAKKyAgICovCisgIHByaXZhdGUgZmluYWwgTGlzdDxUcmllPiB0cmllczsKKyAgLyoqIHJlZmVyZW5jZSB0byB0aGUgb25seSBzdWJ0cmllIHRoYXQgY2FuIGNvbnRhaW4gcnVsZXMuIFNldCBieSBidWlsZExvb2t1cFRhYmxlKCkgKi8KKyAgcHJpdmF0ZSBUcmllIHRyaWVXaXRoUnVsZXMgPSBudWxsOworICAKKyAgLyoqIE1haW50YWlucyBhbiBpbmRleCBvZiBhbGwgY2hpbGRyZW4gb2YgYWxsIHN1YiB0cmllcyAqLworICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8SW50ZWdlciwgVHJpZT4gbG9va3VwID0gbmV3IEhhc2hNYXA8PigpOworICAKKyAgcHVibGljIFNsaWNlQWdncmVnYXRpbmdUcmllKGZpbmFsIExpc3Q8VHJpZT4gdHJpZXMpIHsKKyAgICBpZiAodHJpZXMgPT0gbnVsbCB8fCB0cmllcy5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICJTbGljZUFnZ3JlZ2F0aW5nVHJpZSBub2RlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBwYWNrZWRUcmllIik7CisgICAgfQorICAgIHRoaXMudHJpZXMgPSB1bm1vZGlmaWFibGVMaXN0KHRyaWVzKTsKKyAgICBidWlsZExvb2t1cFRhYmxlKCk7CisgIH0KKyAgCisgIC8qKgorICAgKiBGaWxscyB0aGUgbG9va3VwIHRhYmxlIGZvciBjaGlsZCBub2Rlcy4KKyAgICogQWxzbyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyB0byBlbnN1cmUgY29ycmVjdG5lc3Mgb2YgdGhlIAorICAgKiBQYWNrZWRUcmllIGFnZ3JlZ2F0aW9uLiAKKyAgICovCisgIHByaXZhdGUgdm9pZCBidWlsZExvb2t1cFRhYmxlKCkgeworICAgIGZpbmFsIFNldDxJbnRlZ2VyPiBzZWVuX2NoaWxkX2lkcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICBUcmllIHByZXZpb3VzX3RyaWUgPSBudWxsOworICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmluYWwgVHJpZSB0cmllIDogdGhpcy50cmllcykgeworICAgICAgLyoKKyAgICAgICAqIHBlcmZvcm0gc29tZSBjaGVja3MgdG8gbWFrZSBzdXJlIHRyaWVzIGFyZSBjb3JyZWN0bHkgc3BsaXQuCisgICAgICAgKi8KKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgaWYgKCFoYXZlU2FtZVNvdXJjZVNpZGUocHJldmlvdXNfdHJpZSwgdHJpZSkgfHwgIWhhdmVTYW1lQXJpdHkocHJldmlvdXNfdHJpZSwgdHJpZSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2xpY2VBZ2dyZWdhdGluZ1RyaWUncyBzdWJ0cmllcyBkaWZmZXIgaW4gc291cmNlU2lkZSBvciBhcml0eS4gV2FzIHRoZSB0ZXh0IGdyYW1tYXIgc29ydGVkIGluc3VmZmljaWVudGx5PyIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfQorICAgICAgcHJldmlvdXNfdHJpZSA9IHRyaWU7CisgICAgICAKKyAgICAgIGlmICh0cmllLmhhc1J1bGVzKCkpIHsKKyAgICAgICAgaWYgKHRyaWVXaXRoUnVsZXMgIT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTbGljZUFnZ3JlZ2F0aW5nVHJpZSBjYW4gb25seSBoYXZlIG9uZSBzdWJ0cmllIHdpdGggcnVsZXMuIFdhcyB0aGUgdGV4dCBncmFtbWFyIHNvcnRlZCBpbnN1ZmZpY2llbnRseT8iKTsKKyAgICAgICAgfQorICAgICAgICB0cmllV2l0aFJ1bGVzID0gdHJpZTsKKyAgICAgIH0KKworICAgICAgZmluYWwgSGFzaE1hcDxJbnRlZ2VyLCA/IGV4dGVuZHMgVHJpZT4gY2hpbGRyZW4gPSB0cmllLmdldENoaWxkcmVuKCk7CisgICAgICBmb3IgKGludCBpZCA6IGNoaWxkcmVuLmtleVNldCgpKSB7CisgICAgICAgIGlmIChzZWVuX2NoaWxkX2lkcy5jb250YWlucyhpZCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2xpY2VBZ2dyZWdhdGluZ1RyaWUncyBzdWJ0cmllcyBjb250YWluIG5vbi1kaXNqb2ludCBjaGlsZCB3b3Jkcy4gV2FzIHRoZSB0ZXh0IGdyYW1tYXIgc29ydGVkIGluc3VmZmljaWVudGx5PyIpOworICAgICAgICB9CisgICAgICAgIHNlZW5fY2hpbGRfaWRzLmFkZChpZCk7CisgICAgICAgIGxvb2t1cC5wdXQoaWQsIGNoaWxkcmVuLmdldChpZCkpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSBib29sZWFuIGhhdmVTYW1lU291cmNlU2lkZShmaW5hbCBUcmllIHQxLCBmaW5hbCBUcmllIHQyKSB7CisgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoCisgICAgICAgIHQxLmdldFJ1bGVDb2xsZWN0aW9uKCkuZ2V0U291cmNlU2lkZSgpLAorICAgICAgICB0Mi5nZXRSdWxlQ29sbGVjdGlvbigpLmdldFNvdXJjZVNpZGUoKSk7CisgIH0KKyAgCisgIHByaXZhdGUgYm9vbGVhbiBoYXZlU2FtZUFyaXR5KGZpbmFsIFRyaWUgdDEsIGZpbmFsIFRyaWUgdDIpIHsKKyAgICByZXR1cm4gdDEuZ2V0UnVsZUNvbGxlY3Rpb24oKS5nZXRBcml0eSgpID09IHQyLmdldFJ1bGVDb2xsZWN0aW9uKCkuZ2V0QXJpdHkoKTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUcmllIG1hdGNoKGludCB3b3JkSWQpIHsKKyAgICByZXR1cm4gbG9va3VwLmdldCh3b3JkSWQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGhhc0V4dGVuc2lvbnMoKSB7CisgICAgcmV0dXJuICFsb29rdXAuaXNFbXB0eSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUcmllPiBnZXRFeHRlbnNpb25zKCkgeworICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4obG9va3VwLnZhbHVlcygpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSGFzaE1hcDxJbnRlZ2VyLCA/IGV4dGVuZHMgVHJpZT4gZ2V0Q2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGxvb2t1cDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSXRlcmF0b3I8SW50ZWdlcj4gZ2V0VGVybWluYWxFeHRlbnNpb25JdGVyYXRvcigpIHsKKyAgICByZXR1cm4gbmV3IEV4dGVuc2lvbkl0ZXJhdG9yKGxvb2t1cCwgdHJ1ZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEl0ZXJhdG9yPEludGVnZXI+IGdldE5vbnRlcm1pbmFsRXh0ZW5zaW9uSXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25JdGVyYXRvcihsb29rdXAsIHRydWUpOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIFJ1bGVDb2xsZWN0aW9uIGdldFJ1bGVDb2xsZWN0aW9uKCkgeworICAgIHJldHVybiB0aGlzOworICB9CisgIAorICAvKgorICAgKiBUaGUgZm9sbG93aW5nIG1ldGhvZCdzIHJldHVybiB2YWx1ZXMgZGVwZW5kIG9uIHdoZXRoZXIgdGhlcmUgaXMgCisgICAqIGEgc2luZ2xlIHN1YnRyaWUgZW5jb2RpbmcgcnVsZXMgKHRyaWVXaXRoUnVsZXMpLgorICAgKiBBbGwgb3RoZXIgc3VidHJpZXMgY2FuIG9ubHkgY29udGFpbiBydWxlcyBzb21lIGxldmVscyBkZWVwZXIuCisgICAqLyAKKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBoYXNSdWxlcygpIHsKKyAgICByZXR1cm4gdHJpZVdpdGhSdWxlcyA9PSBudWxsID8gZmFsc2UgOiB0cmllV2l0aFJ1bGVzLmhhc1J1bGVzKCk7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxSdWxlPiBnZXRSdWxlcygpIHsKKyAgICBpZiAoIWhhc1J1bGVzKCkpIHsKKyAgICAgIHJldHVybiBlbXB0eUxpc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIHRyaWVXaXRoUnVsZXMuZ2V0UnVsZUNvbGxlY3Rpb24oKS5nZXRSdWxlcygpOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8UnVsZT4gZ2V0U29ydGVkUnVsZXMoTGlzdDxGZWF0dXJlRnVuY3Rpb24+IG1vZGVscykgeworICAgIGlmICghaGFzUnVsZXMoKSkgeworICAgICAgcmV0dXJuIGVtcHR5TGlzdCgpOworICAgIH0KKyAgICByZXR1cm4gdHJpZVdpdGhSdWxlcy5nZXRSdWxlQ29sbGVjdGlvbigpLmdldFNvcnRlZFJ1bGVzKG1vZGVscyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNTb3J0ZWQoKSB7CisgICAgcmV0dXJuICFoYXNSdWxlcygpID8gZmFsc2UgOiB0cmllV2l0aFJ1bGVzLmdldFJ1bGVDb2xsZWN0aW9uKCkuaXNTb3J0ZWQoKTsKKyAgfQorCisgIC8qCisgICAqIFRoZSBjb25zdHJ1Y3RvciBjaGVja2VkIHRoYXQgYWxsIHN1YiB0cmllcyBoYXZlIHRoZSBzYW1lIGFyaXR5IGFuZCBzb3VyY2VTaWRlLgorICAgKiBXZSBjYW4gdGh1cyBzaW1wbHkgcmV0dXJuIHRoZSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBpbiBsaXN0LgorICAgKi8KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludFtdIGdldFNvdXJjZVNpZGUoKSB7CisgICAgcmV0dXJuIHRyaWVzLmdldCgwKS5nZXRSdWxlQ29sbGVjdGlvbigpLmdldFNvdXJjZVNpZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldEFyaXR5KCkgeworICAgIHJldHVybiB0cmllcy5nZXQoMCkuZ2V0UnVsZUNvbGxlY3Rpb24oKS5nZXRBcml0eSgpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9oeXBlcmdyYXBoL0tCZXN0RXh0cmFjdG9yLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvaHlwZXJncmFwaC9LQmVzdEV4dHJhY3Rvci5qYXZhCmluZGV4IGJjMGU2YWUuLmVmMTc3OTkgMTAwNjQ0Ci0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9oeXBlcmdyYXBoL0tCZXN0RXh0cmFjdG9yLmphdmEKKysrIGIvc3JjL2pvc2h1YS9kZWNvZGVyL2h5cGVyZ3JhcGgvS0Jlc3RFeHRyYWN0b3IuamF2YQpAQCAtNjI2LDcgKzYyNiw3IEBACiAgICAgICogQHJldHVybgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRDb3N0KCkgewotICAgICAgcmV0dXJuIGNvc3QgLSB3ZWlnaHRzLmdldCgiQkxFVSIpICogYmxldTsKKyAgICAgIHJldHVybiBjb3N0IC0gd2VpZ2h0cy5nZXRTcGFyc2UoIkJMRVUiKSAqIGJsZXU7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTkwMSw5ICs5MDEsOSBAQAogICAgICAgICBpZiAod29yZC5zdGFydHNXaXRoKCJbIikgJiYgd29yZC5lbmRzV2l0aCgiXSIpKQogICAgICAgICAgIHF1b3RlZFdvcmRzICs9IFN0cmluZy5mb3JtYXQoIiVzICIsIHdvcmQpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgcXVvdGVkV29yZHMgKz0gU3RyaW5nLmZvcm1hdCgiIFwiJXNcIiIsIHdvcmQpOworICAgICAgICBxdW90ZWRXb3JkcyArPSBTdHJpbmcuZm9ybWF0KCJcIiVzXCIgIiwgd29yZCk7CiAKLSAgICAgIHJldHVybiBxdW90ZWRXb3Jkcy5zdWJzdHJpbmcoMSk7CisgICAgICByZXR1cm4gcXVvdGVkV29yZHMuc3Vic3RyaW5nKDAsIHF1b3RlZFdvcmRzLmxlbmd0aCgpIC0gMSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvcGhyYXNlL0NoYXJ0U3RhdGUuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9waHJhc2UvQ2hhcnRTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2QwYzE2Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9waHJhc2UvQ2hhcnRTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBqb3NodWEuZGVjb2Rlci5waHJhc2U7Ci0KLXB1YmxpYyBjbGFzcyBDaGFydFN0YXRlIHsKLQotICBwdWJsaWMgTGVmdCBsZWZ0OwotICBwdWJsaWMgUmlnaHQgcmlnaHQ7Ci0KLSAgcHVibGljIENoYXJ0U3RhdGUoKSB7Ci0gICAgbGVmdCA9IG5ldyBMZWZ0KCk7Ci0gICAgcmlnaHQgPSBuZXcgUmlnaHQoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvcGhyYXNlL0NvbnRleHRCYXNlLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvcGhyYXNlL0NvbnRleHRCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5Zjk4MWYuLjAwMDAwMDAKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL3BocmFzZS9Db250ZXh0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotcGFja2FnZSBqb3NodWEuZGVjb2Rlci5waHJhc2U7Ci0KLWltcG9ydCBqb3NodWEuZGVjb2Rlci5EZWNvZGVyOwotaW1wb3J0IGpvc2h1YS5kZWNvZGVyLkpvc2h1YUNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDb250ZXh0QmFzZSB7Ci0gIHByaXZhdGUgSm9zaHVhQ29uZmlndXJhdGlvbiBjb25maWc7Ci0gIAotICBwdWJsaWMgQ29udGV4dEJhc2UoSm9zaHVhQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLSAgfQotICAKLSAgcHVibGljIGludCBQb3BMaW1pdCgpIHsKLSAgICByZXR1cm4gY29uZmlnLnBvcF9saW1pdDsKLSAgfQotICAKLSAgcHVibGljIGZsb2F0IExNV2VpZ2h0KCkgewotICAgIHJldHVybiBEZWNvZGVyLndlaWdodHMuZ2V0KCJsbV8wIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBKb3NodWFDb25maWd1cmF0aW9uIEdldENvbmZpZygpIHsKLSAgICByZXR1cm4gY29uZmlnOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvcGhyYXNlL0xlZnQuamF2YSBiL3NyYy9qb3NodWEvZGVjb2Rlci9waHJhc2UvTGVmdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDFkNmQ3Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9waHJhc2UvTGVmdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBqb3NodWEuZGVjb2Rlci5waHJhc2U7Ci0KLXB1YmxpYyBjbGFzcyBMZWZ0IGltcGxlbWVudHMgU3RhdGUgewotCi0gIHB1YmxpYyBsb25nW10gcG9pbnRlcnM7IC8vIEtFTkxNX01BWF9PUkRFUiAtIDEKLSAgcHVibGljIGJ5dGUgbGVuZ3RoOwotICBwdWJsaWMgYm9vbGVhbiBmdWxsOwotCi0gIHB1YmxpYyBieXRlIGdldExlbmd0aCgpIHsKLSAgICByZXR1cm4gbGVuZ3RoOwotICB9Ci0KLSAgcHVibGljIGxvbmcgaWRlbnRpZnkoYnl0ZSBpbmRleCkgewotICAgIHJldHVybiBwb2ludGVyc1tpbmRleF07Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL3BocmFzZS9QaHJhc2VUYWJsZS5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL3BocmFzZS9QaHJhc2VUYWJsZS5qYXZhCmluZGV4IGVmNjk0YTMuLmIzMzVkYzIgMTAwNjQ0Ci0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9waHJhc2UvUGhyYXNlVGFibGUuamF2YQorKysgYi9zcmMvam9zaHVhL2RlY29kZXIvcGhyYXNlL1BocmFzZVRhYmxlLmphdmEKQEAgLTM0LDEzICszNCwxMyBAQAogICAgKiBAcGFyYW0gY29uZmlnCiAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBQaHJhc2VUYWJsZShTdHJpbmcgZ3JhbW1hckZpbGUsIFN0cmluZyBvd25lciwgSm9zaHVhQ29uZmlndXJhdGlvbiBjb25maWcsIGludCBtYXhTb3VyY2UpIAorICBwdWJsaWMgUGhyYXNlVGFibGUoU3RyaW5nIGdyYW1tYXJGaWxlLCBTdHJpbmcgb3duZXIsIFN0cmluZyB0eXBlLCBKb3NodWFDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IG1heFNvdXJjZSkgCiAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwogICAgIGludCBzcGFuTGltaXQgPSAwOwogICAgIAogICAgIGlmIChuZXcgRmlsZShncmFtbWFyRmlsZSkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgdGhpcy5iYWNrZW5kID0gbmV3IFBhY2tlZEdyYW1tYXIoZ3JhbW1hckZpbGUsIHNwYW5MaW1pdCwgb3duZXIsICJtb3NlcyIsIGNvbmZpZyk7CisgICAgICB0aGlzLmJhY2tlbmQgPSBuZXcgUGFja2VkR3JhbW1hcihncmFtbWFyRmlsZSwgc3BhbkxpbWl0LCBvd25lciwgdHlwZSwgY29uZmlnKTsKICAgICAgIGlmICh0aGlzLmJhY2tlbmQuZ2V0TWF4U291cmNlUGhyYXNlTGVuZ3RoKCkgPT0gLTEpIHsKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGQVRBTDogVXNpbmcgYSBwYWNrZWQgZ3JhbW1hciBmb3IgYSBwaHJhc2UgdGFibGUgYmFja2VuZCByZXF1aXJlcyB0aGF0IHlvdSIpOwogICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAgICBwYWNrZWQgdGhlIGdyYW1tYXIgd2l0aCBKb3NodWEgNi4wLjIgb3IgZ3JlYXRlciIpOwpAQCAtNDgsNyArNDgsNyBAQAogICAgICAgfQogCiAgICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuYmFja2VuZCA9IG5ldyBNZW1vcnlCYXNlZEJhdGNoR3JhbW1hcigibW9zZXMiLCBncmFtbWFyRmlsZSwgb3duZXIsICJbWF0iLCBzcGFuTGltaXQsIGNvbmZpZyk7CisgICAgICB0aGlzLmJhY2tlbmQgPSBuZXcgTWVtb3J5QmFzZWRCYXRjaEdyYW1tYXIodHlwZSwgZ3JhbW1hckZpbGUsIG93bmVyLCAiW1hdIiwgc3BhbkxpbWl0LCBjb25maWcpOwogICAgIH0KICAgfQogICAKQEAgLTE3NSw0ICsxNzUsOSBAQAogICBwdWJsaWMgaW50IGdldE93bmVyKCkgewogICAgIHJldHVybiBiYWNrZW5kLmdldE93bmVyKCk7CiAgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXROdW1EZW5zZUZlYXR1cmVzKCkgeworICAgIHJldHVybiBiYWNrZW5kLmdldE51bURlbnNlRmVhdHVyZXMoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL3BocmFzZS9SaWdodC5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL3BocmFzZS9SaWdodC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmY5NzdhLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9waHJhc2UvUmlnaHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXBhY2thZ2Ugam9zaHVhLmRlY29kZXIucGhyYXNlOwotCi1wdWJsaWMgY2xhc3MgUmlnaHQgaW1wbGVtZW50cyBTdGF0ZSB7Ci0KLSAgcHVibGljIGludFtdIHdvcmRzOyAvLyBjKysgdHlwZWRlZiB1aW50IFdvcmRJbmRleCwgS0VOTE1fTUFYX09SREVSIC0gMQotICBwdWJsaWMgZmxvYXRbXSBiYWNrb2ZmOyAvLyBLRU5MTV9NQVhfT1JERVIgLSAxCi0gIHB1YmxpYyBieXRlIGxlbmd0aDsKLQotICBwdWJsaWMgYnl0ZSBnZXRMZW5ndGgoKSB7Ci0gICAgcmV0dXJuIGxlbmd0aDsKLSAgfQotCi0gIHB1YmxpYyBsb25nIGlkZW50aWZ5KGJ5dGUgaW5kZXgpIHsKLSAgICByZXR1cm4gd29yZHNbaW5kZXhdOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgaWYgKCEgKG9iaiBpbnN0YW5jZW9mIFJpZ2h0KSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBSaWdodCBvdGhlciA9IChSaWdodClvYmo7Ci0gICAgaWYgKGdldExlbmd0aCgpICE9IG90aGVyLmdldExlbmd0aCgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICh3b3Jkcy5sZW5ndGggIT0gb3RoZXIud29yZHMubGVuZ3RoKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspCi0gICAgICBpZiAod29yZHNbaV0gIT0gb3RoZXIud29yZHNbaV0pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gamF2YS51dGlsLkFycmF5cy5oYXNoQ29kZSh3b3JkcykgKiBsZW5ndGg7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9waHJhc2UvU2NvcmVIaXN0b3J5LmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvcGhyYXNlL1Njb3JlSGlzdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQwMTQwLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9waHJhc2UvU2NvcmVIaXN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2Ugam9zaHVhLmRlY29kZXIucGhyYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotY2xhc3MgU2NvcmVIaXN0b3J5IHsKLSAgcHVibGljIFZlY3RvcjxGbG9hdD4gc2NvcmVzOwotICBmbG9hdCB0b3RhbDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9waHJhc2UvU2NvcmVyLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvcGhyYXNlL1Njb3Jlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTIyZDc3Li4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9waHJhc2UvU2NvcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1wYWNrYWdlIGpvc2h1YS5kZWNvZGVyLnBocmFzZTsKLQotaW1wb3J0IGpvc2h1YS5jb3JwdXMuVm9jYWJ1bGFyeTsKLWltcG9ydCBqb3NodWEuZGVjb2Rlci5EZWNvZGVyOwotaW1wb3J0IGpvc2h1YS5kZWNvZGVyLmZmLkZlYXR1cmVWZWN0b3I7Ci1pbXBvcnQgam9zaHVhLmRlY29kZXIuZmYubG0ua2VubG0uam5pLktlbkxNOwotCi1wdWJsaWMgY2xhc3MgU2NvcmVyIHsKLQotICBwcml2YXRlIEZlYXR1cmVWZWN0b3Igd2VpZ2h0czsKLSAgcHJpdmF0ZSBLZW5MTSBtb2RlbDsKLQotICBwdWJsaWMgU2NvcmVyKFN0cmluZyBsbV9maWxlLCBTdHJpbmcgd2VpZ2h0c19maWxlKSB7Ci0gICAgd2VpZ2h0cyA9IERlY29kZXIud2VpZ2h0czsKLQotICAgIHRoaXMubW9kZWwgPSBuZXcgS2VuTE0oNSwgbG1fZmlsZSk7Ci0KLSAgICAvLyBUaGUgZ2xvYmFsIHZvY2FidWxhcnkgbmVlZHMgdG8ga25vdyBhYm91dCBsYW5ndWFnZSBtb2RlbHMgc28gdGhhdCBpdCBjYW4gbWFwIGZyb20gdGhlIAotICAgIC8vIGdsb2JhbCBJRHMgdG8gdGhlIExNJ3MgcHJpdmF0ZSB2b2NhYnVsYXJ5Ci0gICAgVm9jYWJ1bGFyeS5yZWdpc3Rlckxhbmd1YWdlTW9kZWwodGhpcy5tb2RlbCk7Ci0gICAgU3lzdGVtLmVyci5wcmludGxuKFN0cmluZy5mb3JtYXQoIkxvYWRlZCBhICVkLWdyYW0gbGFuZ3VhZ2UgbW9kZWwgZnJvbSAnJXMnIiwKLSAgICAgICAgdGhpcy5tb2RlbC5nZXRPcmRlcigpLCBsbV9maWxlKSk7Ci0gIH0KLQotICBwdWJsaWMgZmxvYXQgcGFyc2UoU3RyaW5nIGZlYXR1cmVzKSB7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBmbG9hdCBzdW0gPSAwLjBmOwotICAgIGZvciAoU3RyaW5nIHZhbHVlc3RyIDogZmVhdHVyZXMuc3BsaXQoIiAiKSkgewotICAgICAgZmxvYXQgdmFsdWUgPSBGbG9hdC5wYXJzZUZsb2F0KHZhbHVlc3RyKTsKLSAgICAgIHN1bSArPSB2YWx1ZSAqIHdlaWdodHMuZ2V0KFN0cmluZy5mb3JtYXQoInRtXyVkIiwgaW5kZXgpKTsKLSAgICAgIGluZGV4Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1bTsKLSAgfQotCi0gIHB1YmxpYyBGZWF0dXJlVmVjdG9yIGdldFdlaWdodHMoKSB7Ci0gICAgcmV0dXJuIHdlaWdodHM7Ci0gIH0KLQotICBwdWJsaWMgS2VuTE0gTGFuZ3VhZ2VNb2RlbCgpIHsKLSAgICByZXR1cm4gbW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgZmxvYXQgTE0oaW50IGlzKSB7Ci0gICAgcmV0dXJuIExNKG5ldyBpbnRbXSB7IGlzIH0pOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIHByZWxpbWluYXJ5IHNjb3JpbmcgZm9yIGEgcGhyYXNlIGJ5IHNjb3JpbmcgZWFjaCB3b3JkIHdpdGggb25seSB3b3JkcyBmcm9tIHRoYXQKLSAgICogcGhyYXNlIGFzIGhpc3RvcnkuCi0gICAqIAotICAgKiBAcGFyYW0gaXMgYSBzZXF1ZW5jZSBvZiB3b3JkIElEcwotICAgKiBAcGFyYW0gc3RhdGUgdGhlIGNoYXJ0IHN0YXRlICh1bnVzZWQpCi0gICAqIEByZXR1cm4gdGhlIGxhbmd1YWdlIG1vZGVsIHByb2JhYmlsaXR5IG9mIHRoZSBwaHJhc2UKLSAgICovCi0gIHB1YmxpYyBmbG9hdCBMTShpbnRbXSBpcykgewotICAgIGZsb2F0IHByb2IgPSBtb2RlbC5wcm9iKGlzKTsKLSAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgicHJvYiglcywlZCkgPSAlLjNmIiwgVm9jYWJ1bGFyeS5nZXRXb3JkcyhpcyksIGlzLmxlbmd0aCwgcHJvYikpOwotICAgIHJldHVybiBwcm9iOwotICB9Ci0KLSAgcHVibGljIGZsb2F0IFRhcmdldFdvcmRDb3VudChpbnQgbnVtX3dvcmRzKSB7Ci0gICAgcmV0dXJuIHdlaWdodHMuZ2V0KCJ0YXJnZXRfd29yZF9pbnNlcnRpb24iKSAqIG51bV93b3JkczsKLSAgfQotCi0gIHB1YmxpYyBmbG9hdCB0cmFuc2l0aW9uKEh5cG90aGVzaXMgaHlwb3RoZXNpcywgVGFyZ2V0UGhyYXNlcyBwaHJhc2VzLCBpbnQgc291cmNlX2JlZ2luLAotICAgICAgaW50IHNvdXJjZV9lbmQpIHsKLSAgICBpbnQganVtcF9zaXplID0gTWF0aC5hYnMoaHlwb3RoZXNpcy5MYXN0U291cmNlSW5kZXgoKSAtIHNvdXJjZV9iZWdpbik7Ci0gICAgcmV0dXJuIChqdW1wX3NpemUgKiB3ZWlnaHRzLmdldCgiZGlzdG9ydGlvbiIpKTsKLSAgfQotCi0gIHB1YmxpYyBmbG9hdCBwYXNzVGhyb3VnaCgpIHsKLSAgICByZXR1cm4gLTEwMC4wZjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL3BocmFzZS9TdGF0ZS5qYXZhIGIvc3JjL2pvc2h1YS9kZWNvZGVyL3BocmFzZS9TdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDZiNWNkLi4wMDAwMDAwCi0tLSBhL3NyYy9qb3NodWEvZGVjb2Rlci9waHJhc2UvU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBqb3NodWEuZGVjb2Rlci5waHJhc2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdGUgewotICBieXRlIGdldExlbmd0aCgpOwotCi0gIGxvbmcgaWRlbnRpZnkoYnl0ZSBpbmRleCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvc2VnbWVudF9maWxlL1NlbnRlbmNlLmphdmEgYi9zcmMvam9zaHVhL2RlY29kZXIvc2VnbWVudF9maWxlL1NlbnRlbmNlLmphdmEKaW5kZXggM2Q3OTI1MC4uODMyMzBkYiAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS9kZWNvZGVyL3NlZ21lbnRfZmlsZS9TZW50ZW5jZS5qYXZhCisrKyBiL3NyYy9qb3NodWEvZGVjb2Rlci9zZWdtZW50X2ZpbGUvU2VudGVuY2UuamF2YQpAQCAtOTQsOCArOTQsOCBAQAogICAgICAgICAucmVwbGFjZUFsbCgiXFxdIiwgICItcnNiLSIpCiAgICAgICAgIC5yZXBsYWNlQWxsKCJcXHwiLCAgIi1waXBlLSIpOwogICAKLSAgICAvLyBBIG1heGxlbiBvZiAwIG1lYW5zIG5vIGxpbWl0LiBPbmx5IHRyaW0gbGF0dGljZXMgdGhhdCBhcmUgbGluZWFyIGNoYWlucy4KLSAgICBpZiAoam9zaHVhQ29uZmlndXJhdGlvbi5tYXhsZW4gIT0gMCAmJiBpc0xpbmVhckNoYWluKCkpCisgICAgLy8gT25seSB0cmltIHN0cmluZ3MKKyAgICBpZiAoam9zaHVhQ29uZmlndXJhdGlvbi5sYXR0aWNlX2RlY29kaW5nICYmICEgc291cmNlLnN0YXJ0c1dpdGgoIigoKCIpKQogICAgICAgYWRqdXN0Rm9yTGVuZ3RoKGpvc2h1YUNvbmZpZ3VyYXRpb24ubWF4bGVuKTsKICAgfQogICAKQEAgLTM0Niw3ICszNDYsNyBAQAogICAgIGFzc2VydCBpc0xpbmVhckNoYWluKCk7CiAgICAgTGlzdDxUb2tlbj4gdG9rZW5zID0gbmV3IEFycmF5TGlzdDxUb2tlbj4oKTsKICAgICBmb3IgKE5vZGU8VG9rZW4+IG5vZGU6IGdldExhdHRpY2UoKS5nZXROb2RlcygpKQotICAgICAgaWYgKG5vZGUuZ2V0T3V0Z29pbmdBcmNzKCkuc2l6ZSgpID4gMCkgCisgICAgICBpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0T3V0Z29pbmdBcmNzKCkuc2l6ZSgpID4gMCkgCiAgICAgICAgIHRva2Vucy5hZGQobm9kZS5nZXRPdXRnb2luZ0FyY3MoKS5nZXQoMCkuZ2V0TGFiZWwoKSk7CiAgICAgcmV0dXJuIHRva2VuczsKICAgfQpAQCAtMzc5LDExICszNzksMTcgQEAKICAgfQogCiAgIHB1YmxpYyBMYXR0aWNlPFRva2VuPiBnZXRMYXR0aWNlKCkgewotICAgIGlmICh0aGlzLnNvdXJjZUxhdHRpY2UgPT0gbnVsbCkKLSAgICAgIHRoaXMuc291cmNlTGF0dGljZSA9IChjb25maWcubGF0dGljZV9kZWNvZGluZyAmJiByYXdTb3VyY2UoKS5zdGFydHNXaXRoKCIoKCgiKSkKLSAgICAgICAgPyBMYXR0aWNlLmNyZWF0ZVRva2VuTGF0dGljZUZyb21QTEYocmF3U291cmNlKCkpCi0gICAgICAgIDogTGF0dGljZS5jcmVhdGVUb2tlbkxhdHRpY2VGcm9tU3RyaW5nKFN0cmluZy5mb3JtYXQoIiVzICVzICVzIiwgVm9jYWJ1bGFyeS5TVEFSVF9TWU0sCisgICAgaWYgKHRoaXMuc291cmNlTGF0dGljZSA9PSBudWxsKSB7CisgICAgICBpZiAoY29uZmlnLmxhdHRpY2VfZGVjb2RpbmcgJiYgcmF3U291cmNlKCkuc3RhcnRzV2l0aCgiKCgoIikpIHsKKyAgICAgICAgaWYgKGNvbmZpZy5zZWFyY2hfYWxnb3JpdGhtLmVxdWFscygic3RhY2siKSkgeworICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiKiBGQVRBTDogbGF0dGljZSBkZWNvZGluZyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBmb3Igc3RhY2stYmFzZWQgc2VhcmNoIGFsZ29yaXRobS4iKTsKKyAgICAgICAgICBTeXN0ZW0uZXhpdCgxMik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zb3VyY2VMYXR0aWNlID0gTGF0dGljZS5jcmVhdGVUb2tlbkxhdHRpY2VGcm9tUExGKHJhd1NvdXJjZSgpKTsKKyAgICAgIH0gZWxzZQorICAgICAgICB0aGlzLnNvdXJjZUxhdHRpY2UgPSBMYXR0aWNlLmNyZWF0ZVRva2VuTGF0dGljZUZyb21TdHJpbmcoU3RyaW5nLmZvcm1hdCgiJXMgJXMgJXMiLCBWb2NhYnVsYXJ5LlNUQVJUX1NZTSwKICAgICAgICAgICAgIHJhd1NvdXJjZSgpLCBWb2NhYnVsYXJ5LlNUT1BfU1lNKSk7CisgICAgfQogICAgIHJldHVybiB0aGlzLnNvdXJjZUxhdHRpY2U7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9sYXR0aWNlL0xhdHRpY2UuamF2YSBiL3NyYy9qb3NodWEvbGF0dGljZS9MYXR0aWNlLmphdmEKaW5kZXggYzcyNjdhNC4uZTljZmQ1OSAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS9sYXR0aWNlL0xhdHRpY2UuamF2YQorKysgYi9zcmMvam9zaHVhL2xhdHRpY2UvTGF0dGljZS5qYXZhCkBAIC0xMzMsOCArMTMzLDggQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgTGF0dGljZTxUb2tlbj4gY3JlYXRlVG9rZW5MYXR0aWNlRnJvbVBMRihTdHJpbmcgZGF0YSkgewotICAgIE1hcDxJbnRlZ2VyLCBOb2RlPFRva2VuPj4gbm9kZXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBOb2RlPFRva2VuPj4oKTsKLQorICAgIEFycmF5TGlzdDxOb2RlPFRva2VuPj4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU8VG9rZW4+PigpOworICAgIAogICAgIC8vIFRoaXMgbWF0Y2hlcyBhIHNlcXVlbmNlIG9mIHR1cGxlcywgd2hpY2ggZGVzY3JpYmUgYXJjcyBsZWF2aW5nIHRoaXMgbm9kZQogICAgIFBhdHRlcm4gbm9kZVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIiguKz8pXFwoXFxzKihcXCguKz9cXCksXFxzKilcXHMqXFwpKC4qKSIpOwogCkBAIC0xNTEsNyArMTUxLDcgQEAKIAogICAgIGludCBub2RlSUQgPSAwOwogICAgIE5vZGU8VG9rZW4+IHN0YXJ0Tm9kZSA9IG5ldyBOb2RlPFRva2VuPihub2RlSUQpOwotICAgIG5vZGVzLnB1dChub2RlSUQsIHN0YXJ0Tm9kZSk7CisgICAgbm9kZXMuYWRkKHN0YXJ0Tm9kZSk7CiAKICAgICB3aGlsZSAobm9kZU1hdGNoZXIubWF0Y2hlcygpKSB7CiAKQEAgLTE2MSwxNSArMTYxLDE1IEBACiAgICAgICBub2RlSUQrKzsKIAogICAgICAgTm9kZTxUb2tlbj4gY3VycmVudE5vZGUgPSBudWxsOwotICAgICAgaWYgKG5vZGVzLmNvbnRhaW5zS2V5KG5vZGVJRCkpIHsKKyAgICAgIGlmIChub2RlSUQgPCBub2Rlcy5zaXplKCkgJiYgbm9kZXMuZ2V0KG5vZGVJRCkgIT0gbnVsbCkgewogICAgICAgICBjdXJyZW50Tm9kZSA9IG5vZGVzLmdldChub2RlSUQpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgY3VycmVudE5vZGUgPSBuZXcgTm9kZTxUb2tlbj4obm9kZUlEKTsKLSAgICAgICAgbm9kZXMucHV0KG5vZGVJRCwgY3VycmVudE5vZGUpOworICAgICAgICB3aGlsZSAobm9kZUlEID4gbm9kZXMuc2l6ZSgpKQorICAgICAgICAgIG5vZGVzLmFkZChuZXcgTm9kZTxUb2tlbj4obm9kZXMuc2l6ZSgpKSk7CisgICAgICAgIG5vZGVzLmFkZChjdXJyZW50Tm9kZSk7CiAgICAgICB9CiAKLSAgICAgIGxvZ2dlci5maW5lKCJOb2RlICIgKyBub2RlSUQgKyAiOiIpOwotCiAgICAgICBNYXRjaGVyIGFyY01hdGNoZXIgPSBhcmNQYXR0ZXJuLm1hdGNoZXIobm9kZURhdGEpOwogICAgICAgaW50IG51bUFyY3MgPSAwOwogICAgICAgaWYgKCFhcmNNYXRjaGVyLm1hdGNoZXMoKSkgewpAQCAtMTgyLDE2ICsxODIsMTcgQEAKICAgICAgICAgaW50IGRlc3RpbmF0aW9uTm9kZUlEID0gbm9kZUlEICsgSW50ZWdlci52YWx1ZU9mKGFyY01hdGNoZXIuZ3JvdXAoMykpOwogCiAgICAgICAgIE5vZGU8VG9rZW4+IGRlc3RpbmF0aW9uTm9kZTsKLSAgICAgICAgaWYgKG5vZGVzLmNvbnRhaW5zS2V5KGRlc3RpbmF0aW9uTm9kZUlEKSkgeworICAgICAgICBpZiAoZGVzdGluYXRpb25Ob2RlSUQgPCBub2Rlcy5zaXplKCkgJiYgbm9kZXMuZ2V0KGRlc3RpbmF0aW9uTm9kZUlEKSAhPSBudWxsKSB7CiAgICAgICAgICAgZGVzdGluYXRpb25Ob2RlID0gbm9kZXMuZ2V0KGRlc3RpbmF0aW9uTm9kZUlEKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBkZXN0aW5hdGlvbk5vZGUgPSBuZXcgTm9kZTxUb2tlbj4oZGVzdGluYXRpb25Ob2RlSUQpOwotICAgICAgICAgIG5vZGVzLnB1dChkZXN0aW5hdGlvbk5vZGVJRCwgZGVzdGluYXRpb25Ob2RlKTsKKyAgICAgICAgICB3aGlsZSAoZGVzdGluYXRpb25Ob2RlSUQgPiBub2Rlcy5zaXplKCkpCisgICAgICAgICAgICBub2Rlcy5hZGQobmV3IE5vZGU8VG9rZW4+KG5vZGVzLnNpemUoKSkpOworICAgICAgICAgIG5vZGVzLmFkZChkZXN0aW5hdGlvbk5vZGUpOwogICAgICAgICB9CiAKICAgICAgICAgU3RyaW5nIHJlbWFpbmluZ0FyY3MgPSBhcmNNYXRjaGVyLmdyb3VwKDQpOwogCi0gICAgICAgIGxvZ2dlci5maW5lKCJcdCIgKyBhcmNMYWJlbCArICIgIiArIGFyY1dlaWdodCArICIgIiArIGRlc3RpbmF0aW9uTm9kZUlEKTsKICAgICAgICAgVG9rZW4gYXJjVG9rZW4gPSBuZXcgVG9rZW4oYXJjTGFiZWwpOwogICAgICAgICBjdXJyZW50Tm9kZS5hZGRBcmMoZGVzdGluYXRpb25Ob2RlLCBhcmNXZWlnaHQsIGFyY1Rva2VuKTsKIApAQCAtMjA0LDI2ICsyMDUsMTggQEAKICAgICB9CiAKICAgICAvKiBBZGQgPHM+IHRvIHRoZSBzdGFydCBvZiB0aGUgbGF0dGljZS4gKi8KLSAgICBpZiAobm9kZXMuY29udGFpbnNLZXkoMSkpIHsKKyAgICBpZiAobm9kZXMuc2l6ZSgpID4gMSAmJiBub2Rlcy5nZXQoMSkgIT0gbnVsbCkgewogICAgICAgTm9kZTxUb2tlbj4gZmlyc3ROb2RlID0gbm9kZXMuZ2V0KDEpOwogICAgICAgc3RhcnROb2RlLmFkZEFyYyhmaXJzdE5vZGUsIDAuMGYsIG5ldyBUb2tlbihWb2NhYnVsYXJ5LlNUQVJUX1NZTSkpOwogICAgIH0KIAotICAgIC8qIEFkZCA8L3M+IGFzIGEgZmluYWwgc3RhdGUsIGFuZCBjb25uZWN0IGl0IHRvIGFsbCBlbmQtc3RhdGUgbm9kZXMuICovCi0gICAgTm9kZTxUb2tlbj4gZW5kTm9kZSA9IG5ldyBOb2RlPFRva2VuPigrK25vZGVJRCk7Ci0gICAgZm9yIChOb2RlPFRva2VuPiBub2RlIDogbm9kZXMudmFsdWVzKCkpIHsKLSAgICAgIGlmIChub2RlLmdldE91dGdvaW5nQXJjcygpLnNpemUoKSA9PSAwKQotICAgICAgICBub2RlLmFkZEFyYyhlbmROb2RlLCAwLjBmLCBuZXcgVG9rZW4oVm9jYWJ1bGFyeS5TVE9QX1NZTSkpOwotICAgIH0KLSAgICAvLyBBZGQgdGhlIGVuZG5vZGUgYWZ0ZXIgdGhlIGFib3ZlIGxvb3Agc28gYXMgdG8gYXZvaWQgYSBzZWxmLWxvb3AuCi0gICAgbm9kZXMucHV0KG5vZGVJRCwgZW5kTm9kZSk7CisgICAgLyogQWRkIDwvcz4gYXMgYSBmaW5hbCBzdGF0ZSwgY29ubmVjdCBpdCB0byB0aGUgcHJldmlvdXMgZW5kLXN0YXRlICovCisgICAgbm9kZUlEID0gbm9kZXMuZ2V0KG5vZGVzLnNpemUoKS0xKS5nZXROdW1iZXIoKSArIDE7CisgICAgTm9kZTxUb2tlbj4gZW5kTm9kZSA9IG5ldyBOb2RlPFRva2VuPihub2RlSUQpOworICAgIG5vZGVzLmdldChub2Rlcy5zaXplKCktMSkuYWRkQXJjKGVuZE5vZGUsIDAuMGYsIG5ldyBUb2tlbihWb2NhYnVsYXJ5LlNUT1BfU1lNKSk7CisgICAgbm9kZXMuYWRkKGVuZE5vZGUpOwogCi0gICAgTGlzdDxOb2RlPFRva2VuPj4gbm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PE5vZGU8VG9rZW4+Pihub2Rlcy52YWx1ZXMoKSk7Ci0gICAgQ29sbGVjdGlvbnMuc29ydChub2RlTGlzdCwgbmV3IE5vZGVJZGVudGlmaWVyQ29tcGFyYXRvcigpKTsKLQotICAgIGxvZ2dlci5maW5lKG5vZGVMaXN0LnRvU3RyaW5nKCkpOwotCi0gICAgcmV0dXJuIG5ldyBMYXR0aWNlPFRva2VuPihub2RlTGlzdCwgbGF0dGljZUlzQW1iaWd1b3VzKTsKKyAgICByZXR1cm4gbmV3IExhdHRpY2U8VG9rZW4+KG5vZGVzLCBsYXR0aWNlSXNBbWJpZ3VvdXMpOwogICB9CiAKICAgLyoqCkBAIC00OTgsNCArNDkxLDQgQEAKICAgICAKICAgICB0aGlzLm5vZGVzID0gc29ydGVkTm9kZXM7CiAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL21pcmEvTUlSQUNvcmUuamF2YSBiL3NyYy9qb3NodWEvbWlyYS9NSVJBQ29yZS5qYXZhCmluZGV4IGU1NDg1MzMuLmFhOGZlYjkgMTAwNzU1Ci0tLSBhL3NyYy9qb3NodWEvbWlyYS9NSVJBQ29yZS5qYXZhCisrKyBiL3NyYy9qb3NodWEvbWlyYS9NSVJBQ29yZS5qYXZhCkBAIC0xMCw4ICsxMCw2IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwpAQCAtOTIsMTEgKzkwLDExIEBACiAgIC8vIDQ6IGFwcGx5IDErMiszCiAKICAgcHJpdmF0ZSBpbnQgbnVtUGFyYW1zOwotICAvL3RvdGFsIG51bWJlciBvZiBmaXJpbmcgZmVhdHVyZXMKLSAgLy90aGlzIG51bWJlciBtYXkgaW5jcmVhc2Ugb3ZlcnRpbWUgYXMgbmV3IG4tYmVzdCBsaXN0cyBhcmUgZGVjb2RlZAotICAvL2luaXRpYWxseSBpdCBpcyBlcXVhbCB0byB0aGUgIyBvZiBwYXJhbXMgaW4gdGhlIHBhcmFtZXRlciBjb25maWcgZmlsZQorICAvLyB0b3RhbCBudW1iZXIgb2YgZmlyaW5nIGZlYXR1cmVzCisgIC8vIHRoaXMgbnVtYmVyIG1heSBpbmNyZWFzZSBvdmVydGltZSBhcyBuZXcgbi1iZXN0IGxpc3RzIGFyZSBkZWNvZGVkCisgIC8vIGluaXRpYWxseSBpdCBpcyBlcXVhbCB0byB0aGUgIyBvZiBwYXJhbXMgaW4gdGhlIHBhcmFtZXRlciBjb25maWcgZmlsZQogICBwcml2YXRlIGludCBudW1QYXJhbXNPbGQ7Ci0gIC8vbnVtYmVyIG9mIGZlYXR1cmVzIGJlZm9yZSBvYnNlcnZpbmcgdGhlIG5ldyBmZWF0dXJlcyBmaXJlZCBpbiB0aGUgY3VycmVudCBpdGVyYXRpb24KKyAgLy8gbnVtYmVyIG9mIGZlYXR1cmVzIGJlZm9yZSBvYnNlcnZpbmcgdGhlIG5ldyBmZWF0dXJlcyBmaXJlZCBpbiB0aGUgY3VycmVudCBpdGVyYXRpb24KIAogICBwcml2YXRlIGRvdWJsZVtdIG5vcm1hbGl6YXRpb25PcHRpb25zOwogICAvLyBIb3cgc2hvdWxkIGEgbGFtYmRhW10gdmVjdG9yIGJlIG5vcm1hbGl6ZWQgKGJlZm9yZSBkZWNvZGluZyk/CkBAIC0xMTAsNyArMTA4LDcgQEAKICAgLyogTk9URTogaW5kZXhpbmcgc3RhcnRzIGF0IDEgaW4gdGhlIGZvbGxvd2luZyBmZXcgYXJyYXlzOiAqLwogICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCi0gIC8vcHJpdmF0ZSBkb3VibGVbXSBsYW1iZGE7CisgIC8vIHByaXZhdGUgZG91YmxlW10gbGFtYmRhOwogICBwcml2YXRlIEFycmF5TGlzdDxEb3VibGU+IGxhbWJkYSA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOwogICAvLyB0aGUgY3VycmVudCB3ZWlnaHQgdmVjdG9yLiBOT1RFOiBpbmRleGluZyBzdGFydHMgYXQgMS4KICAgcHJpdmF0ZSBBcnJheUxpc3Q8RG91YmxlPiBiZXN0TGFtYmRhID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CkBAIC0yMDksMjAgKzIwNywyMiBAQAogCiAgIC8vIHVzZWQgYnkgbWlyYQogICBwcml2YXRlIGJvb2xlYW4gbmVlZFNodWZmbGUgPSB0cnVlOyAvLyBzaHVmZmxlIHRoZSB0cmFpbmluZyBzZW50ZW5jZXMgb3Igbm90Ci0gIHByaXZhdGUgYm9vbGVhbiBuZWVkQXZnID0gdHJ1ZTsgLy9hdmVyYWdlIHRoZSB3ZWloZ3RzIG9yIG5vdD8KLSAgcHJpdmF0ZSBib29sZWFuIHJ1blBlcmNlcCA9IGZhbHNlOyAvL3J1biBwZXJjZXB0cm9uIGluc3RlYWQgb2YgbWlyYQotICBwcml2YXRlIGJvb2xlYW4gdXNlUHNldWRvQmxldSA9IHRydWU7IC8vbmVlZCB0byB1c2UgcHNldWRvIGNvcnB1cyB0byBjb21wdXRlIGJsZXU/Ci0gIHByaXZhdGUgYm9vbGVhbiByZXR1cm5CZXN0ID0gdHJ1ZTsgLy9yZXR1cm4gdGhlIGJlc3Qgd2VpZ2h0IGR1cmluZyB0dW5pbmcKLSAgcHJpdmF0ZSBib29sZWFuIG5lZWRTY2FsZSA9IHRydWU7IC8vbmVlZCBzY2FsaW5nPworICBwcml2YXRlIGJvb2xlYW4gbmVlZEF2ZyA9IHRydWU7IC8vIGF2ZXJhZ2UgdGhlIHdlaWhndHMgb3Igbm90PworICBwcml2YXRlIGJvb2xlYW4gcnVuUGVyY2VwID0gZmFsc2U7IC8vIHJ1biBwZXJjZXB0cm9uIGluc3RlYWQgb2YgbWlyYQorICBwcml2YXRlIGJvb2xlYW4gdXNlUHNldWRvQmxldSA9IHRydWU7IC8vIG5lZWQgdG8gdXNlIHBzZXVkbyBjb3JwdXMgdG8gY29tcHV0ZSBibGV1PworICBwcml2YXRlIGJvb2xlYW4gcmV0dXJuQmVzdCA9IGZhbHNlOyAvLyByZXR1cm4gdGhlIGJlc3Qgd2VpZ2h0IGR1cmluZyB0dW5pbmcKKyAgcHJpdmF0ZSBib29sZWFuIG5lZWRTY2FsZSA9IHRydWU7IC8vIG5lZWQgc2NhbGluZz8KICAgcHJpdmF0ZSBTdHJpbmcgdHJhaW5pbmdNb2RlOwogICBwcml2YXRlIGludCBvcmFTZWxlY3RNb2RlID0gMTsKICAgcHJpdmF0ZSBpbnQgcHJlZFNlbGVjdE1vZGUgPSAxOwogICBwcml2YXRlIGludCBtaXJhSXRlciA9IDE7Ci0gIHByaXZhdGUgZG91YmxlIEMgPSAwLjAxOyAvL3JlbGF4YXRpb24gY29lZmZpY2llbnQKLSAgcHJpdmF0ZSBkb3VibGUgUiA9IDAuOTk7IC8vY29ycHVzIGRlY2F5IHdoZW4gcHNldWRvIGNvcnB1cyBpcyB1c2VkIGZvciBibGV1IGNvbXB1dGF0aW9uCi0gICAgLy9wcml2YXRlIGRvdWJsZSBzZW50Rm9yU2NhbGUgPSAwLjE1OyAvL3BlcmNlbnRhZ2Ugb2Ygc2VudGVuY2VzIGZvciBzY2FsZSBmYWN0b3IgZXN0aW1hdGlvbgotICBwcml2YXRlIGRvdWJsZSBzY29yZVJhdGlvID0gNS4wOyAvL3NjbGFsZSBzbyB0aGF0IG1vZGVsX3Njb3JlL21ldHJpY19zY29yZSA9IHNjb3JlcmF0aW8KLSAgcHJpdmF0ZSBkb3VibGUgcHJldk1ldHJpY1Njb3JlID0gMDsgLy9maW5hbCBtZXRyaWMgc2NvcmUgb2YgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiwgdXNlZCBvbmx5IHdoZW4gcmV0dXJuQmVzdCA9IHRydWUKKyAgcHJpdmF0ZSBpbnQgYmF0Y2hTaXplID0gMTsKKyAgcHJpdmF0ZSBkb3VibGUgQyA9IDAuMDE7IC8vIHJlbGF4YXRpb24gY29lZmZpY2llbnQKKyAgcHJpdmF0ZSBkb3VibGUgUiA9IDAuOTk7IC8vIGNvcnB1cyBkZWNheSB3aGVuIHBzZXVkbyBjb3JwdXMgaXMgdXNlZCBmb3IgYmxldSBjb21wdXRhdGlvbgorICAvLyBwcml2YXRlIGRvdWJsZSBzZW50Rm9yU2NhbGUgPSAwLjE1OyAvL3BlcmNlbnRhZ2Ugb2Ygc2VudGVuY2VzIGZvciBzY2FsZSBmYWN0b3IgZXN0aW1hdGlvbgorICBwcml2YXRlIGRvdWJsZSBzY29yZVJhdGlvID0gNS4wOyAvLyBzY2xhbGUgc28gdGhhdCBtb2RlbF9zY29yZS9tZXRyaWNfc2NvcmUgPSBzY29yZXJhdGlvCisgIHByaXZhdGUgZG91YmxlIHByZXZNZXRyaWNTY29yZSA9IDA7IC8vIGZpbmFsIG1ldHJpYyBzY29yZSBvZiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLCB1c2VkIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiByZXR1cm5CZXN0ID0gdHJ1ZQogCiAgIHByaXZhdGUgU3RyaW5nIGRpclByZWZpeDsgLy8gd2hlcmUgYXJlIGFsbCB0aGVzZSBmaWxlcyBsb2NhdGVkPwogICBwcml2YXRlIFN0cmluZyBwYXJhbXNGaWxlTmFtZSwgZG9jSW5mb0ZpbGVOYW1lLCBmaW5hbExhbWJkYUZpbGVOYW1lOwpAQCAtMjk3LDE1ICsyOTcsMTUgQEAKICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluRmlsZV9uYW1lcyA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihwYXJhbXNGaWxlTmFtZSkpOwogCiAgICAgICBmb3IgKGludCBjID0gMTsgYyA8PSBudW1QYXJhbXM7ICsrYykgewotICAgICAgICAgIFN0cmluZyBsaW5lID0gIiI7Ci0gICAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCAmJiBsaW5lLmxlbmd0aCgpID09IDApIHsgLy8gc2tpcCBlbXB0eSBsaW5lcwotCSAgICAgIGxpbmUgPSBpbkZpbGVfbmFtZXMucmVhZExpbmUoKTsKLSAgICAgICAgICB9Ci0JICAKLSAgICAgICAgICAvLyBzYXZlIGZlYXR1cmUgbmFtZXMKLQkgIFN0cmluZyBwYXJhbU5hbWUgPSAobGluZS5zdWJzdHJpbmcoMCwgbGluZS5pbmRleE9mKCJ8fHwiKSkpLnRyaW0oKTsKLQkgIFZvY2FidWxhcnkuaWQocGFyYW1OYW1lKTsKLQkgIC8vIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJWT0NBQiglcykgPSAlZCIsIHBhcmFtTmFtZSwgaWQpKTsKKyAgICAgICAgU3RyaW5nIGxpbmUgPSAiIjsKKyAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCAmJiBsaW5lLmxlbmd0aCgpID09IDApIHsgLy8gc2tpcCBlbXB0eSBsaW5lcworICAgICAgICAgIGxpbmUgPSBpbkZpbGVfbmFtZXMucmVhZExpbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNhdmUgZmVhdHVyZSBuYW1lcworICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gKGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZigifHx8IikpKS50cmltKCk7CisgICAgICAgIFZvY2FidWxhcnkuaWQocGFyYW1OYW1lKTsKKyAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKFN0cmluZy5mb3JtYXQoIlZPQ0FCKCVzKSA9ICVkIiwgcGFyYW1OYW1lLCBpZCkpOwogICAgICAgfQogCiAgICAgICBpbkZpbGVfbmFtZXMuY2xvc2UoKTsKQEAgLTMxOSw5ICszMTksOSBAQAogCiAgICAgLy8gdGhlIHBhcmFtZXRlciBmaWxlIGNvbnRhaW5zIG9uZSBsaW5lIHBlciBwYXJhbWV0ZXIKICAgICAvLyBhbmQgb25lIGxpbmUgZm9yIHRoZSBub3JtYWxpemF0aW9uIG1ldGhvZAotICAgIC8vIGluZGV4aW5nIHN0YXJ0cyBhdCAxIGluIHRoZXNlIGFycmF5cyAKLSAgICBmb3IgKCBpbnQgcCA9IDA7IHAgPD0gbnVtUGFyYW1zOyArK3AgKQotCWxhbWJkYS5hZGQobmV3IERvdWJsZSgwKSk7CisgICAgLy8gaW5kZXhpbmcgc3RhcnRzIGF0IDEgaW4gdGhlc2UgYXJyYXlzCisgICAgZm9yIChpbnQgcCA9IDA7IHAgPD0gbnVtUGFyYW1zOyArK3ApCisgICAgICBsYW1iZGEuYWRkKG5ldyBEb3VibGUoMCkpOwogICAgIGJlc3RMYW1iZGEuYWRkKG5ldyBEb3VibGUoMCkpOwogICAgIC8vIHdoeSBvbmx5IGxhbWJkYSBpcyBhIGxpc3Q/IGJlY2F1c2UgdGhlIHNpemUgb2YgbGFtYmRhCiAgICAgLy8gbWF5IGluY3JlYXNlIG92ZXIgdGltZSwgYnV0IG90aGVyIGFycmF5cyBhcmUgc3BlY2lmaWVkIGluCkBAIC0zODgsNyArMzg4LDcgQEAKICAgICBFdmFsdWF0aW9uTWV0cmljLnNldF90bXBEaXJQcmVmaXgodG1wRGlyUHJlZml4KTsKIAogICAgIGV2YWxNZXRyaWMgPSBFdmFsdWF0aW9uTWV0cmljLmdldE1ldHJpYyhtZXRyaWNOYW1lLCBtZXRyaWNPcHRpb25zKTsKLSAgICAvL3VzZWQgb25seSBpZiByZXR1cm5CZXN0ID0gdHJ1ZQorICAgIC8vIHVzZWQgb25seSBpZiByZXR1cm5CZXN0ID0gdHJ1ZQogICAgIHByZXZNZXRyaWNTY29yZSA9IGV2YWxNZXRyaWMuZ2V0VG9CZU1pbmltaXplZCgpID8gUG9zSW5mIDogTmVnSW5mOwogCiAgICAgLy8gbGVuZ3RoIG9mIHN1ZmZpY2llbnQgc3RhdGlzdGljcwpAQCAtMzk4LDggKzM5OCw4IEBACiAgICAgLy8gc2V0IHN0YXRpYyBkYXRhIG1lbWJlcnMgZm9yIHRoZSBJbnRlcm1lZGlhdGVPcHRpbWl6ZXIgY2xhc3MKICAgICAvKgogICAgICAqIEludGVybWVkaWF0ZU9wdGltaXplci5zZXRfTUVSVHBhcmFtcyhudW1TZW50ZW5jZXMsIG51bURvY3VtZW50cywgZG9jT2ZTZW50ZW5jZSwKLSAgICAgKiBkb2NTdWJzZXRJbmZvLCBudW1QYXJhbXMsIG5vcm1hbGl6YXRpb25PcHRpb25zLCBpc09wdGltaXphYmxlCi0gICAgICogb25lTW9kaWZpY2F0aW9uUGVySXRlcmF0aW9uLCBldmFsTWV0cmljLCB0bXBEaXJQcmVmaXgsIHZlcmJvc2l0eSk7CisgICAgICogZG9jU3Vic2V0SW5mbywgbnVtUGFyYW1zLCBub3JtYWxpemF0aW9uT3B0aW9ucywgaXNPcHRpbWl6YWJsZSBvbmVNb2RpZmljYXRpb25QZXJJdGVyYXRpb24sCisgICAgICogZXZhbE1ldHJpYywgdG1wRGlyUHJlZml4LCB2ZXJib3NpdHkpOwogICAgICAqLwogCiAgICAgLy8gcHJpbnQgaW5mbwpAQCAtNDI1LDcgKzQyNSw3IEBACiAgICAgICBwcmludGxuKCJjICAgIERlZmF1bHQgdmFsdWVcdE9wdGltaXphYmxlP1x0UmFuZC4gdmFsLiByYW5nZSIsIDEpOwogCiAgICAgICBmb3IgKGludCBjID0gMTsgYyA8PSBudW1QYXJhbXM7ICsrYykgewotICAgICAgICAgIHByaW50KGMgKyAiICAgICAiICsgZjQuZm9ybWF0KGxhbWJkYS5nZXQoYykuZG91YmxlVmFsdWUoKSkgKyAiXHRcdCIsIDEpOworICAgICAgICBwcmludChjICsgIiAgICAgIiArIGY0LmZvcm1hdChsYW1iZGEuZ2V0KGMpLmRvdWJsZVZhbHVlKCkpICsgIlx0XHQiLCAxKTsKIAogICAgICAgICBpZiAoIWlzT3B0aW1pemFibGVbY10pIHsKICAgICAgICAgICBwcmludGxuKCIgTm8iLCAxKTsKQEAgLTU2NiwxMSArNTY2LDExIEBACiAgICAgLy8gcHJpbnRNZW1vcnlVc2FnZSgpOwogICAgIHByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLCAxKTsKICAgICBwcmludGxuKCIiLCAxKTsKLSAgICBpZiAoICEgcmV0dXJuQmVzdCApCi0JcHJpbnRsbigiRklOQUwgbGFtYmRhOiAiICsgbGFtYmRhVG9TdHJpbmcobGFtYmRhKSwgMSk7Ci0gICAgICAgLy8gKyAiICgiICsgbWV0cmljTmFtZV9kaXNwbGF5ICsgIjogIiArIEZJTkFMX3Njb3JlICsgIikiLDEpOworICAgIGlmICghcmV0dXJuQmVzdCkKKyAgICAgIHByaW50bG4oIkZJTkFMIGxhbWJkYTogIiArIGxhbWJkYVRvU3RyaW5nKGxhbWJkYSksIDEpOworICAgIC8vICsgIiAoIiArIG1ldHJpY05hbWVfZGlzcGxheSArICI6ICIgKyBGSU5BTF9zY29yZSArICIpIiwxKTsKICAgICBlbHNlCi0JcHJpbnRsbigiQkVTVCBsYW1iZGE6ICIgKyBsYW1iZGFUb1N0cmluZyhsYW1iZGEpLCAxKTsKKyAgICAgIHByaW50bG4oIkJFU1QgbGFtYmRhOiAiICsgbGFtYmRhVG9TdHJpbmcobGFtYmRhKSwgMSk7CiAKICAgICAvLyBkZWxldGUgaW50ZXJtZWRpYXRlIC50ZW1wLiouaXQqIGRlY29kZXIgb3V0cHV0IGZpbGVzCiAgICAgZm9yIChpbnQgaXRlcmF0aW9uID0gMTsgaXRlcmF0aW9uIDw9IG1heEl0czsgKytpdGVyYXRpb24pIHsKQEAgLTU5Nyw3ICs1OTcsNyBAQAogICAvLyB0aGlzIGlzIHRoZSBrZXkgZnVuY3Rpb24hCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICBwdWJsaWMgZG91YmxlW10gcnVuX3NpbmdsZV9pdGVyYXRpb24oaW50IGl0ZXJhdGlvbiwgaW50IG1pbkl0cywgaW50IG1heEl0cywgaW50IHByZXZJdHMsCi0JCQkJICAgICAgIGludCBlYXJseVN0b3AsIGludFtdIG1heEluZGV4KSB7CisgICAgICBpbnQgZWFybHlTdG9wLCBpbnRbXSBtYXhJbmRleCkgewogICAgIGRvdWJsZSBGSU5BTF9zY29yZSA9IDA7CiAKICAgICBkb3VibGVbXSByZXRBID0gbmV3IGRvdWJsZVszXTsKQEAgLTYzNCw5ICs2MzQsOSBAQAogICAgICAgLyoqKioqKioqKioqKioqKi8KIAogICAgICAgaWYgKGl0ZXJhdGlvbiA9PSAxKSB7Ci0JICBwcmludGxuKCJEZWNvZGluZyB1c2luZyBpbml0aWFsIHdlaWdodCB2ZWN0b3IgIiArIGxhbWJkYVRvU3RyaW5nKGxhbWJkYSksIDEpOworICAgICAgICBwcmludGxuKCJEZWNvZGluZyB1c2luZyBpbml0aWFsIHdlaWdodCB2ZWN0b3IgIiArIGxhbWJkYVRvU3RyaW5nKGxhbWJkYSksIDEpOwogICAgICAgfSBlbHNlIHsKLQkgIHByaW50bG4oIlJlZGVjb2RpbmcgdXNpbmcgd2VpZ2h0IHZlY3RvciAiICsgbGFtYmRhVG9TdHJpbmcobGFtYmRhKSwgMSk7CisgICAgICAgIHByaW50bG4oIlJlZGVjb2RpbmcgdXNpbmcgd2VpZ2h0IHZlY3RvciAiICsgbGFtYmRhVG9TdHJpbmcobGFtYmRhKSwgMSk7CiAgICAgICB9CiAKICAgICAgIC8vIGdlbmVyYXRlIHRoZSBuLWJlc3QgZmlsZSBhZnRlciBkZWNvZGluZwpAQCAtNzA5LDcgKzcwOSw3IEBACiAgICAgICAvLyBpbml0TGFtYmRhWzBdIGlzIG5vdCB1c2VkIQogICAgICAgZG91YmxlW10gaW5pdGlhbExhbWJkYSA9IG5ldyBkb3VibGVbMSArIG51bVBhcmFtc107CiAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBudW1QYXJhbXM7ICsraSkKLQkgIGluaXRpYWxMYW1iZGFbaV0gPSBsYW1iZGEuZ2V0KGkpOworICAgICAgICBpbml0aWFsTGFtYmRhW2ldID0gbGFtYmRhLmdldChpKTsKIAogICAgICAgLy8gdGhlICJzY29yZSIgaW4gaW5pdGlhbFNjb3JlIHJlZmVycyB0byB0aGF0CiAgICAgICAvLyBhc3NpZ25lZCBieSB0aGUgZXZhbHVhdGlvbiBtZXRyaWMpCkBAIC04OTcsMTMgKzg5Nyw2IEBACiAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBmZWF0dXJlIHZhbHVlCiAgICAgICAgICAgICAgICAgZmVhdFZhbF9zdHIgPSBmZWF0c19zdHIuc3BsaXQoIlxccysiKTsKIAotCQlpZiAoZmVhdHNfc3RyLmluZGV4T2YoJz0nKSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmZWF0dXJlUGFpciA6IGZlYXRWYWxfc3RyKSB7Ci0JCQlTdHJpbmdbXSBwYWlyID0gZmVhdHVyZVBhaXIuc3BsaXQoIj0iKTsKLQkJCVN0cmluZyBuYW1lID0gcGFpclswXTsKLQkJCURvdWJsZSB2YWx1ZSA9IERvdWJsZS5wYXJzZURvdWJsZShwYWlyWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCQl9CiAgICAgICAgICAgICAgICAgZXhpc3RpbmdDYW5kU3RhdHMucHV0KHNlbnRzX3N0ciwgc3RhdHNfc3RyKTsKICAgICAgICAgICAgICAgICBjYW5kQ291bnRbaV0gKz0gMTsKICAgICAgICAgICAgICAgICBuZXdDYW5kaWRhdGVzQWRkZWRbaXRdICs9IDE7CkBAIC0xMDMwLDggKzEwMjMsOCBAQAogICAgICAgICBCdWZmZXJlZFJlYWRlciBpbkZpbGVfc3RhdHNNZXJnZWRLbm93biA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCiAgICAgICAgICAgICBpbnN0cmVhbV9zdGF0c01lcmdlZEtub3duLCAidXRmOCIpKTsKIAotCS8vbnVtIG9mIGZlYXR1cmVzIGJlZm9yZSBvYnNlcnZpbmcgbmV3IGZpcmluZyBmZWF0dXJlcyBmcm9tIHRoaXMgaXRlcmF0aW9uCi0JbnVtUGFyYW1zT2xkID0gbnVtUGFyYW1zOworICAgICAgICAvLyBudW0gb2YgZmVhdHVyZXMgYmVmb3JlIG9ic2VydmluZyBuZXcgZmlyaW5nIGZlYXR1cmVzIGZyb20gdGhpcyBpdGVyYXRpb24KKyAgICAgICAgbnVtUGFyYW1zT2xkID0gbnVtUGFyYW1zOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2VudGVuY2VzOyArK2kpIHsKICAgICAgICAgICAvLyByZXByb2Nlc3MgY2FuZGlkYXRlcyBmcm9tIHByZXZpb3VzIGl0ZXJhdGlvbnMKQEAgLTEwOTIsMjQgKzEwODUsMjQgQEAKICAgICAgICAgICAgICAgc3RhdHNfaGFzaFtpXS5wdXQoc2VudHNfc3RyLCBzdGF0c19zdHIpOwogCiAgICAgICAgICAgICAgIGZlYXRWYWxfc3RyID0gZmVhdHNfc3RyLnNwbGl0KCJcXHMrIik7Ci0JICAgICAgCi0JICAgICAgaWYgKGZlYXRzX3N0ci5pbmRleE9mKCc9JykgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZlYXR1cmVQYWlyIDogZmVhdFZhbF9zdHIpIHsKLQkJICAgICAgU3RyaW5nW10gcGFpciA9IGZlYXR1cmVQYWlyLnNwbGl0KCI9Iik7Ci0JCSAgICAgIFN0cmluZyBuYW1lID0gcGFpclswXTsKLQkJICAgICAgRG91YmxlIHZhbHVlID0gRG91YmxlLnBhcnNlRG91YmxlKHBhaXJbMV0pOwotCQkgICAgICBpbnQgZmVhdElkID0gVm9jYWJ1bGFyeS5pZChuYW1lKTsKIAotCQkgICAgICAvL25lZWQgdG8gaWRlbnRpZnkgbmV3bHkgZmlyZWQgZmVhdHMgaGVyZQotCQkgICAgICAvL2luIHRoaXMgY2FzZSBjdXJyRmVhdFZhbCBpcyBub3QgZ2l2ZW4gdGhlIHZhbHVlCi0JCSAgICAgIC8vb2YgdGhlIG5ldyBmZWF0LCBzaW5jZSB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQgaXMKLQkJICAgICAgLy9pbml0aWFsaXplZCBhcyB6ZXJvIGFueXdheQotCQkgICAgICBpZiAoZmVhdElkID4gbnVtUGFyYW1zKSB7Ci0JCQkgICsrbnVtUGFyYW1zOwotCQkJICBsYW1iZGEuYWRkKG5ldyBEb3VibGUoMCkpOwotCQkgICAgICB9CisgICAgICAgICAgICAgIGlmIChmZWF0c19zdHIuaW5kZXhPZignPScpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmVhdHVyZVBhaXIgOiBmZWF0VmFsX3N0cikgeworICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFpciA9IGZlYXR1cmVQYWlyLnNwbGl0KCI9Iik7CisgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhaXJbMF07CisgICAgICAgICAgICAgICAgICBEb3VibGUgdmFsdWUgPSBEb3VibGUucGFyc2VEb3VibGUocGFpclsxXSk7CisgICAgICAgICAgICAgICAgICBpbnQgZmVhdElkID0gVm9jYWJ1bGFyeS5pZChuYW1lKTsKKworICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBpZGVudGlmeSBuZXdseSBmaXJlZCBmZWF0cyBoZXJlCisgICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UgY3VyckZlYXRWYWwgaXMgbm90IGdpdmVuIHRoZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIG5ldyBmZWF0LCBzaW5jZSB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQgaXMKKyAgICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemVkIGFzIHplcm8gYW55d2F5CisgICAgICAgICAgICAgICAgICBpZiAoZmVhdElkID4gbnVtUGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgICsrbnVtUGFyYW1zOworICAgICAgICAgICAgICAgICAgICBsYW1iZGEuYWRkKG5ldyBEb3VibGUoMCkpOwogICAgICAgICAgICAgICAgICAgfQotCSAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgZXhpc3RpbmdDYW5kU3RhdHMucHV0KHNlbnRzX3N0ciwgc3RhdHNfc3RyKTsKICAgICAgICAgICAgICAgY2FuZENvdW50W2ldICs9IDE7CiAKQEAgLTExOTgsOCArMTE5MSw4IEBACiAKICAgICAgICAgcHJpbnRsbigiIiwgMSk7CiAKLQlwcmludGxuKCJOdW1iZXIgb2YgZmVhdHVyZXMgb2JzZXJ2ZWQgc28gZmFyOiAiICsgbnVtUGFyYW1zKTsKLQlwcmludGxuKCIiLCAxKTsKKyAgICAgICAgcHJpbnRsbigiTnVtYmVyIG9mIGZlYXR1cmVzIG9ic2VydmVkIHNvIGZhcjogIiArIG51bVBhcmFtcyk7CisgICAgICAgIHByaW50bG4oIiIsIDEpOwogCiAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpbiBNSVJBQ29yZS5ydW5fc2luZ2xlX2l0ZXJhdGlvbig2KTogIgpAQCAtMTIxNywxNiArMTIxMCwxNiBAQAogICAgICAgICAgIHByaW50bG4oIiIsIDEpOwogICAgICAgICAgIHByaW50bG4oIi0tLSAgTUlSQSBpdGVyYXRpb24gIyIgKyBpdGVyYXRpb24gKyAiIGVuZGluZyBAICIgKyAobmV3IERhdGUoKSkgKyAiICAtLS0iLCAxKTsKICAgICAgICAgICBwcmludGxuKCIiLCAxKTsKLQkgIGRlbGV0ZUZpbGUodG1wRGlyUHJlZml4ICsgInRlbXAuc3RhdHMubWVyZ2VkIik7CisgICAgICAgICAgZGVsZXRlRmlsZSh0bXBEaXJQcmVmaXggKyAidGVtcC5zdGF0cy5tZXJnZWQiKTsKIAotCSAgaWYgKHJldHVybkJlc3QpIHsKLQkgICAgICAvL25vdGUgdGhhdCBiZXN0TGFtYmRhLnNpemUoKSA8PSBsYW1iZGEuc2l6ZSgpCi0JICAgICAgZm9yICggaW50IHAgPSAxOyBwIDwgYmVzdExhbWJkYS5zaXplKCk7ICsrcCApCi0JCSAgbGFtYmRhLnNldChwLCBiZXN0TGFtYmRhLmdldChwKSk7Ci0JICAgICAgLy9hbmQgc2V0IHRoZSByZXN0IG9mIGxhbWJkYSB0byBiZSAwCi0JICAgICAgZm9yICggaW50IHAgPSAwOyBwIDwgbGFtYmRhLnNpemUoKSAtIGJlc3RMYW1iZGEuc2l6ZSgpOyArK3AgKQotCQkgIGxhbWJkYS5zZXQocCtiZXN0TGFtYmRhLnNpemUoKSwgbmV3IERvdWJsZSgwKSk7Ci0JICB9CisgICAgICAgICAgaWYgKHJldHVybkJlc3QpIHsKKyAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBiZXN0TGFtYmRhLnNpemUoKSA8PSBsYW1iZGEuc2l6ZSgpCisgICAgICAgICAgICBmb3IgKGludCBwID0gMTsgcCA8IGJlc3RMYW1iZGEuc2l6ZSgpOyArK3ApCisgICAgICAgICAgICAgIGxhbWJkYS5zZXQocCwgYmVzdExhbWJkYS5nZXQocCkpOworICAgICAgICAgICAgLy8gYW5kIHNldCB0aGUgcmVzdCBvZiBsYW1iZGEgdG8gYmUgMAorICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBsYW1iZGEuc2l6ZSgpIC0gYmVzdExhbWJkYS5zaXplKCk7ICsrcCkKKyAgICAgICAgICAgICAgbGFtYmRhLnNldChwICsgYmVzdExhbWJkYS5zaXplKCksIG5ldyBEb3VibGUoMCkpOworICAgICAgICAgIH0KIAogICAgICAgICAgIHJldHVybiBudWxsOyAvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIG9sZCB2YWx1ZXMgc2hvdWxkIGJlIGtlcHQgYnkgdGhlIGNhbGxlcgogICAgICAgICB9IGVsc2UgewpAQCAtMTI0OSw2NyArMTI0Miw3MCBAQAogICAgICAgT3B0aW1pemVyLnJ1blBlcmNlcCA9IHJ1blBlcmNlcDsKICAgICAgIE9wdGltaXplci5DID0gQzsKICAgICAgIE9wdGltaXplci5uZWVkQXZnID0gbmVlZEF2ZzsKLSAgICAgIC8vT3B0aW1pemVyLnNlbnRGb3JTY2FsZSA9IHNlbnRGb3JTY2FsZTsKKyAgICAgIC8vIE9wdGltaXplci5zZW50Rm9yU2NhbGUgPSBzZW50Rm9yU2NhbGU7CiAgICAgICBPcHRpbWl6ZXIuc2NvcmVSYXRpbyA9IHNjb3JlUmF0aW87CiAgICAgICBPcHRpbWl6ZXIuZXZhbE1ldHJpYyA9IGV2YWxNZXRyaWM7CiAgICAgICBPcHRpbWl6ZXIubm9ybWFsaXphdGlvbk9wdGlvbnMgPSBub3JtYWxpemF0aW9uT3B0aW9uczsKICAgICAgIE9wdGltaXplci5uZWVkU2NhbGUgPSBuZWVkU2NhbGU7CisgICAgICBPcHRpbWl6ZXIuYmF0Y2hTaXplID0gYmF0Y2hTaXplOwogCi0gICAgICAvL2lmIG5lZWQgdG8gdXNlIGJsZXUgc3RhdHMgaGlzdG9yeQotICAgICAgaWYoIGl0ZXJhdGlvbiA9PSAxICkgewotCSAgaWYoZXZhbE1ldHJpYy5nZXRfbWV0cmljTmFtZSgpLmVxdWFscygiQkxFVSIpICYmIHVzZVBzZXVkb0JsZXUpIHsKLQkgICAgICBPcHRpbWl6ZXIuaW5pdEJsZXVIaXN0b3J5KG51bVNlbnRlbmNlcywgZXZhbE1ldHJpYy5nZXRfc3VmZlN0YXRzQ291bnQoKSk7Ci0JICAgICAgT3B0aW1pemVyLnVzZVBzZXVkb0JsZXUgPSB1c2VQc2V1ZG9CbGV1OwotCSAgICAgIE9wdGltaXplci5SID0gUjsKLQkgIH0KLQkgIGlmKGV2YWxNZXRyaWMuZ2V0X21ldHJpY05hbWUoKS5lcXVhbHMoIlRFUi1CTEVVIikgJiYgdXNlUHNldWRvQmxldSkgewotCSAgICAgIE9wdGltaXplci5pbml0QmxldUhpc3RvcnkobnVtU2VudGVuY2VzLCBldmFsTWV0cmljLmdldF9zdWZmU3RhdHNDb3VudCgpLTIpOyAvL1N0YXRzIGNvdW50IG9mIFRFUj0yCi0JICAgICAgT3B0aW1pemVyLnVzZVBzZXVkb0JsZXUgPSB1c2VQc2V1ZG9CbGV1OwotCSAgICAgIE9wdGltaXplci5SID0gUjsKLQkgIH0KKyAgICAgIC8vIGlmIG5lZWQgdG8gdXNlIGJsZXUgc3RhdHMgaGlzdG9yeQorICAgICAgaWYgKGl0ZXJhdGlvbiA9PSAxKSB7CisgICAgICAgIGlmIChldmFsTWV0cmljLmdldF9tZXRyaWNOYW1lKCkuZXF1YWxzKCJCTEVVIikgJiYgdXNlUHNldWRvQmxldSkgeworICAgICAgICAgIE9wdGltaXplci5pbml0QmxldUhpc3RvcnkobnVtU2VudGVuY2VzLCBldmFsTWV0cmljLmdldF9zdWZmU3RhdHNDb3VudCgpKTsKKyAgICAgICAgICBPcHRpbWl6ZXIudXNlUHNldWRvQmxldSA9IHVzZVBzZXVkb0JsZXU7CisgICAgICAgICAgT3B0aW1pemVyLlIgPSBSOworICAgICAgICB9CisgICAgICAgIGlmIChldmFsTWV0cmljLmdldF9tZXRyaWNOYW1lKCkuZXF1YWxzKCJURVItQkxFVSIpICYmIHVzZVBzZXVkb0JsZXUpIHsKKyAgICAgICAgICBPcHRpbWl6ZXIuaW5pdEJsZXVIaXN0b3J5KG51bVNlbnRlbmNlcywgZXZhbE1ldHJpYy5nZXRfc3VmZlN0YXRzQ291bnQoKSAtIDIpOyAvLyBTdGF0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVEVSPTIKKyAgICAgICAgICBPcHRpbWl6ZXIudXNlUHNldWRvQmxldSA9IHVzZVBzZXVkb0JsZXU7CisgICAgICAgICAgT3B0aW1pemVyLlIgPSBSOworICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIFZlY3RvcjxTdHJpbmc+IG91dHB1dCA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwogCi0gICAgICAvL25vdGU6IGluaXRpYWxMYW1iZGFbXSBoYXMgbGVuZ3RoID0gbnVtUGFyYW1zT2xkCi0gICAgICAvL2F1Z21lbnRlZCB3aXRoIG5ldyBmZWF0dXJlIHdlaWdodHMsIGluaXRpYWwgdmFsdWVzIGFyZSAwCisgICAgICAvLyBub3RlOiBpbml0aWFsTGFtYmRhW10gaGFzIGxlbmd0aCA9IG51bVBhcmFtc09sZAorICAgICAgLy8gYXVnbWVudGVkIHdpdGggbmV3IGZlYXR1cmUgd2VpZ2h0cywgaW5pdGlhbCB2YWx1ZXMgYXJlIDAKICAgICAgIGRvdWJsZVtdIGluaXRpYWxMYW1iZGFOZXcgPSBuZXcgZG91YmxlWzEgKyBudW1QYXJhbXNdOwogICAgICAgU3lzdGVtLmFycmF5Y29weShpbml0aWFsTGFtYmRhLCAxLCBpbml0aWFsTGFtYmRhTmV3LCAxLCBudW1QYXJhbXNPbGQpOwogCi0gICAgICAvL2ZpbmFsTGFtYmRhW10gaGFzIGxlbmd0aCA9IG51bVBhcmFtcyAoY29uc2lkZXJpbmcgbmV3IGZlYXR1cmVzKQorICAgICAgLy8gZmluYWxMYW1iZGFbXSBoYXMgbGVuZ3RoID0gbnVtUGFyYW1zIChjb25zaWRlcmluZyBuZXcgZmVhdHVyZXMpCiAgICAgICBkb3VibGVbXSBmaW5hbExhbWJkYSA9IG5ldyBkb3VibGVbMSArIG51bVBhcmFtc107CiAKICAgICAgIE9wdGltaXplciBvcHQgPSBuZXcgT3B0aW1pemVyKG91dHB1dCwgaXNPcHRpbWl6YWJsZSwgaW5pdGlhbExhbWJkYU5ldywgZmVhdF9oYXNoLCBzdGF0c19oYXNoKTsKICAgICAgIGZpbmFsTGFtYmRhID0gb3B0LnJ1bk9wdGltaXplcigpOwogCi0gICAgICBpZiAoIHJldHVybkJlc3QgKSB7Ci0JICBkb3VibGUgbWV0cmljU2NvcmUgPSBvcHQuZ2V0TWV0cmljU2NvcmUoKTsKLQkgIGlmICggISBldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSApIHsKLQkgICAgICBpZiAoIG1ldHJpY1Njb3JlID4gcHJldk1ldHJpY1Njb3JlICkgewotCQkgIHByZXZNZXRyaWNTY29yZSA9IG1ldHJpY1Njb3JlOwotCQkgIGZvciAoIGludCBwID0gMTsgcCA8IGJlc3RMYW1iZGEuc2l6ZSgpOyArK3AgKQotCQkgICAgICBiZXN0TGFtYmRhLnNldChwLCBmaW5hbExhbWJkYVtwXSk7Ci0JCSAgaWYgKCAxICsgbnVtUGFyYW1zID4gYmVzdExhbWJkYS5zaXplKCkgKSB7Ci0JCSAgICAgIGZvciAoIGludCBwID0gYmVzdExhbWJkYS5zaXplKCk7IHAgPD0gbnVtUGFyYW1zOyArK3AgKQotCQkJICBiZXN0TGFtYmRhLmFkZChwLCBmaW5hbExhbWJkYVtwXSk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0gZWxzZSB7Ci0JICAgICAgaWYgKCBtZXRyaWNTY29yZSA8IHByZXZNZXRyaWNTY29yZSApIHsKLQkJICBwcmV2TWV0cmljU2NvcmUgPSBtZXRyaWNTY29yZTsKLQkJICBmb3IgKCBpbnQgcCA9IDE7IHAgPCBiZXN0TGFtYmRhLnNpemUoKTsgKytwICkKLQkJICAgICAgYmVzdExhbWJkYS5zZXQocCwgZmluYWxMYW1iZGFbcF0pOwotCQkgIGlmICggMSArIG51bVBhcmFtcyA+IGJlc3RMYW1iZGEuc2l6ZSgpICkgewotCQkgICAgICBmb3IgKCBpbnQgcCA9IGJlc3RMYW1iZGEuc2l6ZSgpOyBwIDw9IG51bVBhcmFtczsgKytwICkKLQkJCSAgYmVzdExhbWJkYS5hZGQocCwgZmluYWxMYW1iZGFbcF0pOwotCQkgIH0KLQkgICAgICB9Ci0JICB9CisgICAgICBpZiAocmV0dXJuQmVzdCkgeworICAgICAgICBkb3VibGUgbWV0cmljU2NvcmUgPSBvcHQuZ2V0TWV0cmljU2NvcmUoKTsKKyAgICAgICAgaWYgKCFldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSkgeworICAgICAgICAgIGlmIChtZXRyaWNTY29yZSA+IHByZXZNZXRyaWNTY29yZSkgeworICAgICAgICAgICAgcHJldk1ldHJpY1Njb3JlID0gbWV0cmljU2NvcmU7CisgICAgICAgICAgICBmb3IgKGludCBwID0gMTsgcCA8IGJlc3RMYW1iZGEuc2l6ZSgpOyArK3ApCisgICAgICAgICAgICAgIGJlc3RMYW1iZGEuc2V0KHAsIGZpbmFsTGFtYmRhW3BdKTsKKyAgICAgICAgICAgIGlmICgxICsgbnVtUGFyYW1zID4gYmVzdExhbWJkYS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgZm9yIChpbnQgcCA9IGJlc3RMYW1iZGEuc2l6ZSgpOyBwIDw9IG51bVBhcmFtczsgKytwKQorICAgICAgICAgICAgICAgIGJlc3RMYW1iZGEuYWRkKHAsIGZpbmFsTGFtYmRhW3BdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKG1ldHJpY1Njb3JlIDwgcHJldk1ldHJpY1Njb3JlKSB7CisgICAgICAgICAgICBwcmV2TWV0cmljU2NvcmUgPSBtZXRyaWNTY29yZTsKKyAgICAgICAgICAgIGZvciAoaW50IHAgPSAxOyBwIDwgYmVzdExhbWJkYS5zaXplKCk7ICsrcCkKKyAgICAgICAgICAgICAgYmVzdExhbWJkYS5zZXQocCwgZmluYWxMYW1iZGFbcF0pOworICAgICAgICAgICAgaWYgKDEgKyBudW1QYXJhbXMgPiBiZXN0TGFtYmRhLnNpemUoKSkgeworICAgICAgICAgICAgICBmb3IgKGludCBwID0gYmVzdExhbWJkYS5zaXplKCk7IHAgPD0gbnVtUGFyYW1zOyArK3ApCisgICAgICAgICAgICAgICAgYmVzdExhbWJkYS5hZGQocCwgZmluYWxMYW1iZGFbcF0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfQogCi0gICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKGZpbmFsTGFtYmRhLmxlbmd0aCk7Ci0gICAgICAgLy8gZm9yKCBpbnQgaT0wOyBpPGZpbmFsTGFtYmRhLmxlbmd0aC0xOyBpKysgKQotICAgICAgIC8vIAkgICBTeXN0ZW0ub3V0LnByaW50bG4oZmluYWxMYW1iZGFbaSsxXSk7CisgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oZmluYWxMYW1iZGEubGVuZ3RoKTsKKyAgICAgIC8vIGZvciggaW50IGk9MDsgaTxmaW5hbExhbWJkYS5sZW5ndGgtMTsgaSsrICkKKyAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihmaW5hbExhbWJkYVtpKzFdKTsKIAogICAgICAgLyoqKioqKioqKioqKiogZW5kIG9wdGltaXphdGlvbiAqKioqKioqKioqKioqKi8KIApAQCAtMTMyMSwxMiArMTMxNywxMiBAQAogICAgICAgYm9vbGVhbiBhbnlQYXJhbUNoYW5nZWRTaWduaWZpY2FudGx5ID0gZmFsc2U7CiAKICAgICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IG51bVBhcmFtczsgKytjKSB7Ci0JICBpZiAoZmluYWxMYW1iZGFbY10gIT0gbGFtYmRhLmdldChjKSkgewotCSAgICAgIGFueVBhcmFtQ2hhbmdlZCA9IHRydWU7Ci0JICB9Ci0JICBpZiAoTWF0aC5hYnMoZmluYWxMYW1iZGFbY10gLSBsYW1iZGEuZ2V0KGMpKSA+IHN0b3BTaWdWYWx1ZSkgewotCSAgICAgIGFueVBhcmFtQ2hhbmdlZFNpZ25pZmljYW50bHkgPSB0cnVlOwotCSAgfQorICAgICAgICBpZiAoZmluYWxMYW1iZGFbY10gIT0gbGFtYmRhLmdldChjKSkgeworICAgICAgICAgIGFueVBhcmFtQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE1hdGguYWJzKGZpbmFsTGFtYmRhW2NdIC0gbGFtYmRhLmdldChjKSkgPiBzdG9wU2lnVmFsdWUpIHsKKyAgICAgICAgICBhbnlQYXJhbUNoYW5nZWRTaWduaWZpY2FudGx5ID0gdHJ1ZTsKKyAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvLyBTeXN0ZW0uYXJyYXljb3B5KGZpbmFsTGFtYmRhLDEsbGFtYmRhLDEsbnVtUGFyYW1zKTsKQEAgLTEzNjAsMTQgKzEzNTYsMTQgQEAKICAgICAgICAgcHJpbnRsbigiU29tZSBlYXJseSBzdG9wcGluZyBjcml0ZXJpYSBoYXMgYmVlbiBvYnNlcnZlZCAiICsgImluICIgKyBzdG9wTWluSXRzCiAgICAgICAgICAgICArICIgY29uc2VjdXRpdmUgaXRlcmF0aW9uczsgZXhpdGluZyBNSVJBLiIsIDEpOwogICAgICAgICBwcmludGxuKCIiLCAxKTsKLQkKLQlpZiAoIHJldHVybkJlc3QgKSB7Ci0JICAgIGZvciAoIGludCBmID0gMTsgZiA8PSBudW1QYXJhbXM7ICsrZiApCi0JCWxhbWJkYS5zZXQoZiwgYmVzdExhbWJkYS5nZXQoZikpOwotCX0gZWxzZSB7Ci0JICAgIGZvciAoIGludCBmID0gMTsgZiA8PSBudW1QYXJhbXM7ICsrZiApCi0JCWxhbWJkYS5zZXQoZiwgZmluYWxMYW1iZGFbZl0pOwotCX0KKworICAgICAgICBpZiAocmV0dXJuQmVzdCkgeworICAgICAgICAgIGZvciAoaW50IGYgPSAxOyBmIDw9IGJlc3RMYW1iZGEuc2l6ZSgpIC0gMTsgKytmKQorICAgICAgICAgICAgbGFtYmRhLnNldChmLCBiZXN0TGFtYmRhLmdldChmKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpbnQgZiA9IDE7IGYgPD0gbnVtUGFyYW1zOyArK2YpCisgICAgICAgICAgICBsYW1iZGEuc2V0KGYsIGZpbmFsTGFtYmRhW2ZdKTsKKyAgICAgICAgfQogCiAgICAgICAgIGJyZWFrOyAvLyBleGl0IGZvciAoaXRlcmF0aW9uKSBsb29wIHByZWVtcHRpdmVseQogICAgICAgfQpAQCAtMTM3NywyNSArMTM3MywyNCBAQAogICAgICAgICBwcmludGxuKCJNYXhpbXVtIG51bWJlciBvZiBNSVJBIGl0ZXJhdGlvbnMgcmVhY2hlZDsgZXhpdGluZyBNSVJBLiIsIDEpOwogICAgICAgICBwcmludGxuKCIiLCAxKTsKIAotCWlmICggcmV0dXJuQmVzdCApIHsKLQkgICAgZm9yICggaW50IGYgPSAxOyBmIDw9IG51bVBhcmFtczsgKytmICkKLQkJbGFtYmRhLnNldChmLCBiZXN0TGFtYmRhLmdldChmKSk7Ci0JfSBlbHNlIHsKLQkgICAgZm9yICggaW50IGYgPSAxOyBmIDw9IG51bVBhcmFtczsgKytmICkKLQkJbGFtYmRhLnNldChmLCBmaW5hbExhbWJkYVtmXSk7Ci0JfQorICAgICAgICBpZiAocmV0dXJuQmVzdCkgeworICAgICAgICAgIGZvciAoaW50IGYgPSAxOyBmIDw9IGJlc3RMYW1iZGEuc2l6ZSgpIC0gMTsgKytmKQorICAgICAgICAgICAgbGFtYmRhLnNldChmLCBiZXN0TGFtYmRhLmdldChmKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpbnQgZiA9IDE7IGYgPD0gbnVtUGFyYW1zOyArK2YpCisgICAgICAgICAgICBsYW1iZGEuc2V0KGYsIGZpbmFsTGFtYmRhW2ZdKTsKKyAgICAgICAgfQogCiAgICAgICAgIGJyZWFrOyAvLyBleGl0IGZvciAoaXRlcmF0aW9uKSBsb29wCiAgICAgICB9CiAKICAgICAgIC8vIHVzZSB0aGUgbmV3IHd0IHZlY3RvciB0byBkZWNvZGUgdGhlIG5leHQgaXRlcmF0aW9uCiAgICAgICAvLyAoaW50ZXJwb2xhdGlvbiB3aXRoIHByZXZpb3VzIHd0IHZlY3RvcikKLSAgICAgIGRvdWJsZSBpbnRlckNvZWYgPSAxLjA7IC8vbm8gaW50ZXJwb2xhdGlvbiBmb3Igbm93CisgICAgICBkb3VibGUgaW50ZXJDb2VmID0gMS4wOyAvLyBubyBpbnRlcnBvbGF0aW9uIGZvciBub3cKICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG51bVBhcmFtczsgaSsrKQotCSAgbGFtYmRhLnNldChpLCBpbnRlckNvZWYgKiBmaW5hbExhbWJkYVtpXSArICgxIC0gaW50ZXJDb2VmKSAqIGxhbWJkYS5nZXQoaSkuZG91YmxlVmFsdWUoKSk7CisgICAgICAgIGxhbWJkYS5zZXQoaSwgaW50ZXJDb2VmICogZmluYWxMYW1iZGFbaV0gKyAoMSAtIGludGVyQ29lZikgKiBsYW1iZGEuZ2V0KGkpLmRvdWJsZVZhbHVlKCkpOwogCi0gICAgICBwcmludGxuKCJOZXh0IGl0ZXJhdGlvbiB3aWxsIGRlY29kZSB3aXRoIGxhbWJkYTogIgotCSAgICAgICsgbGFtYmRhVG9TdHJpbmcobGFtYmRhKSwgMSk7CisgICAgICBwcmludGxuKCJOZXh0IGl0ZXJhdGlvbiB3aWxsIGRlY29kZSB3aXRoIGxhbWJkYTogIiArIGxhbWJkYVRvU3RyaW5nKGxhbWJkYSksIDEpOwogICAgICAgcHJpbnRsbigiIiwgMSk7CiAKICAgICAgIC8vIHByaW50TWVtb3J5VXNhZ2UoKTsKQEAgLTE0MjMsMTEgKzE0MTgsMTEgQEAKICAgcHJpdmF0ZSBTdHJpbmcgbGFtYmRhVG9TdHJpbmcoQXJyYXlMaXN0PERvdWJsZT4gbGFtYmRhQSkgewogICAgIFN0cmluZyByZXRTdHIgPSAieyI7CiAgICAgaW50IGZlYXRUb1ByaW50ID0gbnVtUGFyYW1zID4gMTUgPyAxNSA6IG51bVBhcmFtczsKLSAgICAvL3ByaW50IGF0IG1vc3QgdGhlIGZpcnN0IDE1IGZlYXR1cmVzCisgICAgLy8gcHJpbnQgYXQgbW9zdCB0aGUgZmlyc3QgMTUgZmVhdHVyZXMKIAogICAgIHJldFN0ciArPSAiKGxpc3RpbmcgdGhlIGZpcnN0ICIgKyBmZWF0VG9QcmludCArICIgbGFtYmRhcykiOwogICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IGZlYXRUb1ByaW50IC0gMTsgKytjKSB7Ci0gICAgICAgIHJldFN0ciArPSAiIiArIFN0cmluZy5mb3JtYXQoIiUuNGYiLCBsYW1iZGFBLmdldChjKS5kb3VibGVWYWx1ZSgpKSArICIsICI7CisgICAgICByZXRTdHIgKz0gIiIgKyBTdHJpbmcuZm9ybWF0KCIlLjRmIiwgbGFtYmRhQS5nZXQoYykuZG91YmxlVmFsdWUoKSkgKyAiLCAiOwogICAgIH0KICAgICByZXRTdHIgKz0gIiIgKyBTdHJpbmcuZm9ybWF0KCIlLjRmIiwgbGFtYmRhQS5nZXQobnVtUGFyYW1zKS5kb3VibGVWYWx1ZSgpKSArICJ9IjsKIApAQCAtMTU5Niw3ICsxNTkxLDggQEAKIAogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbmZpZ0ZpbGUoQXJyYXlMaXN0PERvdWJsZT4gcGFyYW1zLCBTdHJpbmcgY2ZnRmlsZU5hbWUsIFN0cmluZyB0ZW1wbGF0ZUZpbGVOYW1lKSB7CisgIHByaXZhdGUgdm9pZCBjcmVhdGVDb25maWdGaWxlKEFycmF5TGlzdDxEb3VibGU+IHBhcmFtcywgU3RyaW5nIGNmZ0ZpbGVOYW1lLAorICAgICAgU3RyaW5nIHRlbXBsYXRlRmlsZU5hbWUpIHsKICAgICB0cnkgewogICAgICAgLy8gaS5lLiBjcmVhdGUgY2ZnRmlsZU5hbWUsIHdoaWNoIGlzIHNpbWlsYXIgdG8gdGVtcGxhdGVGaWxlTmFtZSwgYnV0IHdpdGgKICAgICAgIC8vIHBhcmFtc1tdIGFzIHBhcmFtZXRlciB2YWx1ZXMKQEAgLTE2MDYsMzMgKzE2MDIsMzMgQEAKIAogICAgICAgQnVmZmVyZWRSZWFkZXIgaW5GZWF0RGVmRmlsZSA9IG51bGw7CiAgICAgICBQcmludFdyaXRlciBvdXRGZWF0RGVmRmlsZSA9IG51bGw7Ci0gICAgICBpbnQgb3JpZ0ZlYXROdW0gPSAwOyAvL2ZlYXQgbnVtIGluIHRoZSB0ZW1wbGF0ZSBmaWxlCisgICAgICBpbnQgb3JpZ0ZlYXROdW0gPSAwOyAvLyBmZWF0IG51bSBpbiB0aGUgdGVtcGxhdGUgZmlsZQogCiAgICAgICBTdHJpbmcgbGluZSA9IGluRmlsZS5yZWFkTGluZSgpOwogICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgIGludCBjX21hdGNoID0gLTE7Ci0gICAgICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gbnVtUGFyYW1zOyArK2MpIHsKLQkgICAgICBpZiAobGluZS5zdGFydHNXaXRoKFZvY2FidWxhcnkud29yZChjKSArICIgIikpIHsKLQkJICBjX21hdGNoID0gYzsKLQkJICArK29yaWdGZWF0TnVtOwotCQkgIGJyZWFrOwotCSAgICAgIH0KKyAgICAgICAgaW50IGNfbWF0Y2ggPSAtMTsKKyAgICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gbnVtUGFyYW1zOyArK2MpIHsKKyAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKFZvY2FidWxhcnkud29yZChjKSArICIgIikpIHsKKyAgICAgICAgICAgIGNfbWF0Y2ggPSBjOworICAgICAgICAgICAgKytvcmlnRmVhdE51bTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KLQkgIAotICAgICAgICAgIGlmIChjX21hdGNoID09IC0xKSB7Ci0JICAgICAgb3V0RmlsZS5wcmludGxuKGxpbmUpOwotICAgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgaWYgKCBNYXRoLmFicyhwYXJhbXMuZ2V0KGNfbWF0Y2gpLmRvdWJsZVZhbHVlKCkpID4gMWUtMjAgKQotCQkgIG91dEZpbGUucHJpbnRsbihWb2NhYnVsYXJ5LndvcmQoY19tYXRjaCkgKyAiICIgKyBwYXJhbXMuZ2V0KGNfbWF0Y2gpKTsKLSAgICAgICAgICB9Ci0JICAKLSAgICAgICAgICBsaW5lID0gaW5GaWxlLnJlYWRMaW5lKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY19tYXRjaCA9PSAtMSkgeworICAgICAgICAgIG91dEZpbGUucHJpbnRsbihsaW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoTWF0aC5hYnMocGFyYW1zLmdldChjX21hdGNoKS5kb3VibGVWYWx1ZSgpKSA+IDFlLTIwKQorICAgICAgICAgICAgb3V0RmlsZS5wcmludGxuKFZvY2FidWxhcnkud29yZChjX21hdGNoKSArICIgIiArIHBhcmFtcy5nZXQoY19tYXRjaCkpOworICAgICAgICB9CisKKyAgICAgICAgbGluZSA9IGluRmlsZS5yZWFkTGluZSgpOwogICAgICAgfQogCi0gICAgICAvL25vdyBhcHBlbmQgd2VpZ2h0cyBvZiBuZXcgZmVhdHVyZXMKLSAgICAgIGZvciAoaW50IGMgPSBvcmlnRmVhdE51bSsxOyBjIDw9IG51bVBhcmFtczsgKytjKSB7Ci0JICBpZiAoIE1hdGguYWJzKHBhcmFtcy5nZXQoYykuZG91YmxlVmFsdWUoKSkgPiAxZS0yMCApCi0JICAgICAgb3V0RmlsZS5wcmludGxuKFZvY2FidWxhcnkud29yZChjKSArICIgIiArIHBhcmFtcy5nZXQoYykpOworICAgICAgLy8gbm93IGFwcGVuZCB3ZWlnaHRzIG9mIG5ldyBmZWF0dXJlcworICAgICAgZm9yIChpbnQgYyA9IG9yaWdGZWF0TnVtICsgMTsgYyA8PSBudW1QYXJhbXM7ICsrYykgeworICAgICAgICBpZiAoTWF0aC5hYnMocGFyYW1zLmdldChjKS5kb3VibGVWYWx1ZSgpKSA+IDFlLTIwKQorICAgICAgICAgIG91dEZpbGUucHJpbnRsbihWb2NhYnVsYXJ5LndvcmQoYykgKyAiICIgKyBwYXJhbXMuZ2V0KGMpKTsKICAgICAgIH0KIAogICAgICAgaW5GaWxlLmNsb3NlKCk7CkBAIC0xNjgxLDcgKzE2NzcsMTIgQEAKICAgICAgIGlmICghaXNPcHRpbWl6YWJsZVtjXSkgeyAvLyBza2lwIG5leHQgdHdvIHZhbHVlcwogICAgICAgICBkdW1teSA9IGluRmlsZV9pbml0Lm5leHQoKTsKICAgICAgICAgZHVtbXkgPSBpbkZpbGVfaW5pdC5uZXh0KCk7CisgICAgICAgIGR1bW15ID0gaW5GaWxlX2luaXQubmV4dCgpOworICAgICAgICBkdW1teSA9IGluRmlsZV9pbml0Lm5leHQoKTsKICAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHRoZSBuZXh0IHR3byB2YWx1ZXMgYXJlIG5vdCB1c2VkLCBvbmx5IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBaTUVSVCdzIHBhcmFtcyBmaWxlIGZvcm1hdAorICAgICAgICBkdW1teSA9IGluRmlsZV9pbml0Lm5leHQoKTsKKyAgICAgICAgZHVtbXkgPSBpbkZpbGVfaW5pdC5uZXh0KCk7CiAgICAgICAgIC8vIHNldCBtaW5SYW5kVmFsdWVbY10gYW5kIG1heFJhbmRWYWx1ZVtjXSAocmFuZ2UgZm9yIHJhbmRvbSB2YWx1ZXMpCiAgICAgICAgIGR1bW15ID0gaW5GaWxlX2luaXQubmV4dCgpOwogICAgICAgICBpZiAoZHVtbXkuZXF1YWxzKCItSW5mIikgfHwgZHVtbXkuZXF1YWxzKCIrSW5mIikpIHsKQEAgLTE3MDYsNyArMTcwNyw3IEBACiAgICAgICAgICAgU3lzdGVtLmV4aXQoMjEpOwogICAgICAgICB9CiAKLQkvLyBjaGVjayBmb3Igb2RkIHZhbHVlcworICAgICAgICAvLyBjaGVjayBmb3Igb2RkIHZhbHVlcwogICAgICAgICBpZiAobWluUmFuZFZhbHVlW2NdID09IG1heFJhbmRWYWx1ZVtjXSkgewogICAgICAgICAgIHByaW50bG4oIldhcm5pbmc6IGxhbWJkYVsiICsgYyArICJdIGhhcyAiICsgIm1pblJhbmRWYWx1ZSA9IG1heFJhbmRWYWx1ZSA9ICIKICAgICAgICAgICAgICAgKyBtaW5SYW5kVmFsdWVbY10gKyAiLiIsIDEpOwpAQCAtMjAwMCw3ICsyMDAxLDcgQEAKICAgICAgIHRyeSB7CiAgICAgICAgIFByaW50V3JpdGVyIG91dEZpbGVfbGFtYmRhcyA9IG5ldyBQcmludFdyaXRlcihmaW5hbExhbWJkYUZpbGVOYW1lKTsKICAgICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gbnVtUGFyYW1zOyArK2MpIHsKLQkgICAgb3V0RmlsZV9sYW1iZGFzLnByaW50bG4oVm9jYWJ1bGFyeS53b3JkKGMpICsgIiB8fHwgIiArIGxhbWJkYS5nZXQoYykuZG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgb3V0RmlsZV9sYW1iZGFzLnByaW50bG4oVm9jYWJ1bGFyeS53b3JkKGMpICsgIiB8fHwgIiArIGxhbWJkYS5nZXQoYykuZG91YmxlVmFsdWUoKSk7CiAgICAgICAgIH0KICAgICAgICAgb3V0RmlsZV9sYW1iZGFzLmNsb3NlKCk7CiAKQEAgLTIwODEsOCArMjA4Miw3IEBACiAgICAgICAgICAgaWYgKHBhcmFtQS5sZW5ndGggPT0gMiAmJiBwYXJhbUFbMF0uY2hhckF0KDApID09ICctJykgewogICAgICAgICAgICAgYXJnc1ZlY3Rvci5hZGQocGFyYW1BWzBdKTsKICAgICAgICAgICAgIGFyZ3NWZWN0b3IuYWRkKHBhcmFtQVsxXSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwYXJhbUEubGVuZ3RoID4gMgotICAgICAgICAgICAgICAmJiAocGFyYW1BWzBdLmVxdWFscygiLW0iKSB8fCBwYXJhbUFbMF0uZXF1YWxzKCItZG9jU2V0IikpKSB7CisgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbUEubGVuZ3RoID4gMiAmJiAocGFyYW1BWzBdLmVxdWFscygiLW0iKSB8fCBwYXJhbUFbMF0uZXF1YWxzKCItZG9jU2V0IikpKSB7CiAgICAgICAgICAgICAvLyAtbSAobWV0cmljTmFtZSksIC1kb2NTZXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBleHRyYSBvcHRpbm9zCiAgICAgICAgICAgICBmb3IgKGludCBvcHQgPSAwOyBvcHQgPCBwYXJhbUEubGVuZ3RoOyArK29wdCkgewogICAgICAgICAgICAgICBhcmdzVmVjdG9yLmFkZChwYXJhbUFbb3B0XSk7CkBAIC0yMzQwLDEwNiArMjM0MCwxMDcgQEAKIAogICAgICAgLy8gZm9yIG1pcmE6CiAgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbmVlZFNodWZmbGUiKSkgewotCSAgaW50IHNodWZmbGUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKLQkgIGlmKHNodWZmbGU9PTEpCi0JICAgICAgbmVlZFNodWZmbGUgPSB0cnVlOwotCSAgZWxzZSBpZihzaHVmZmxlPT0wKQotCSAgICAgIG5lZWRTaHVmZmxlID0gZmFsc2U7Ci0JICBlbHNlIHsKLQkgICAgICBwcmludGxuKCItbmVlZFNodWZmbGUgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOwotCSAgICAgIFN5c3RlbS5leGl0KDEwKTsKLQkgIH0KKyAgICAgICAgaW50IHNodWZmbGUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKHNodWZmbGUgPT0gMSkKKyAgICAgICAgICBuZWVkU2h1ZmZsZSA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKHNodWZmbGUgPT0gMCkKKyAgICAgICAgICBuZWVkU2h1ZmZsZSA9IGZhbHNlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBwcmludGxuKCItbmVlZFNodWZmbGUgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQogICAgICAgfQotICAgICAgLy9hdmVyYWdlIHdlaWdodHMgYWZ0ZXIgZWFjaCBlcG9jaCBvciBub3QKKyAgICAgIC8vIGF2ZXJhZ2Ugd2VpZ2h0cyBhZnRlciBlYWNoIGVwb2NoIG9yIG5vdAogICAgICAgZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLW5lZWRBdmciKSkgewotCSAgaW50IGF2ZyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOwotCSAgaWYoYXZnPT0xKQotCSAgICAgIG5lZWRBdmcgPSB0cnVlOwotCSAgZWxzZSBpZihhdmc9PTApCi0JICAgICAgbmVlZEF2ZyA9IGZhbHNlOwotCSAgZWxzZSB7Ci0JICAgICAgcHJpbnRsbigiLW5lZWRBdmcgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOwotCSAgICAgIFN5c3RlbS5leGl0KDEwKTsKLQkgIH0KKyAgICAgICAgaW50IGF2ZyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgICBpZiAoYXZnID09IDEpCisgICAgICAgICAgbmVlZEF2ZyA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKGF2ZyA9PSAwKQorICAgICAgICAgIG5lZWRBdmcgPSBmYWxzZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcHJpbnRsbigiLW5lZWRBdmcgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQogICAgICAgfQotICAgICAgLy9yZXR1cm4gdGhlIGJlc3Qgd2VpZ2h0IGR1cmluZyB0dW5pbmcgb3Igbm90CisgICAgICAvLyByZXR1cm4gdGhlIGJlc3Qgd2VpZ2h0IGR1cmluZyB0dW5pbmcgb3Igbm90CiAgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItcmV0dXJuQmVzdCIpKSB7Ci0JICBpbnQgcmV0QmVzdCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOwotCSAgaWYocmV0QmVzdCA9PSAxKQotCSAgICAgIHJldHVybkJlc3QgPSB0cnVlOwotCSAgZWxzZSBpZihyZXRCZXN0ID09IDApCi0JICAgICAgcmV0dXJuQmVzdCA9IGZhbHNlOwotCSAgZWxzZSB7Ci0JICAgICAgcHJpbnRsbigiLXJldHVybkJlc3QgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOwotCSAgICAgIFN5c3RlbS5leGl0KDEwKTsKLQkgIH0KKyAgICAgICAgaW50IHJldEJlc3QgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKHJldEJlc3QgPT0gMSkKKyAgICAgICAgICByZXR1cm5CZXN0ID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAocmV0QmVzdCA9PSAwKQorICAgICAgICAgIHJldHVybkJlc3QgPSBmYWxzZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcHJpbnRsbigiLXJldHVybkJlc3QgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQogICAgICAgfQotICAgICAgLy9ydW4gcGVyY2VwdHJvbiBvciBub3QKKyAgICAgIC8vIHJ1biBwZXJjZXB0cm9uIG9yIG5vdAogICAgICAgZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXJ1blBlcmNlcCIpKSB7Ci0JICBpbnQgcGVyID0gSW50ZWdlci5wYXJzZUludChhcmdzW2kgKyAxXSk7Ci0JICBpZihwZXI9PTEpCi0JICAgICAgcnVuUGVyY2VwID0gdHJ1ZTsKLQkgIGVsc2UgaWYocGVyPT0wKQotCSAgICAgIHJ1blBlcmNlcCA9IGZhbHNlOwotCSAgZWxzZSB7Ci0JICAgICAgcHJpbnRsbigiLXJ1blBlcmNlcCBtdXN0IGJlIGVpdGhlciAwIG9yIDEuIik7Ci0JICAgICAgU3lzdGVtLmV4aXQoMTApOwotCSAgfQorICAgICAgICBpbnQgcGVyID0gSW50ZWdlci5wYXJzZUludChhcmdzW2kgKyAxXSk7CisgICAgICAgIGlmIChwZXIgPT0gMSkKKyAgICAgICAgICBydW5QZXJjZXAgPSB0cnVlOworICAgICAgICBlbHNlIGlmIChwZXIgPT0gMCkKKyAgICAgICAgICBydW5QZXJjZXAgPSBmYWxzZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcHJpbnRsbigiLXJ1blBlcmNlcCBtdXN0IGJlIGVpdGhlciAwIG9yIDEuIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMTApOworICAgICAgICB9CiAgICAgICB9CiAgICAgICAvLyBvcmFjbGUgc2VsZWN0aW9uIG1vZGUKICAgICAgIGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1vcmFjbGVTZWxlY3Rpb24iKSkgewotCSAgb3JhU2VsZWN0TW9kZSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgICBvcmFTZWxlY3RNb2RlID0gSW50ZWdlci5wYXJzZUludChhcmdzW2kgKyAxXSk7CiAgICAgICB9CiAgICAgICAvLyBwcmVkaWN0aW9uIHNlbGVjdGlvbiBtb2RlCiAgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItcHJlZGljdGlvblNlbGVjdGlvbiIpKSB7Ci0JICBwcmVkU2VsZWN0TW9kZSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgICBwcmVkU2VsZWN0TW9kZSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOwogICAgICAgfQogICAgICAgLy8gTUlSQSBpbnRlcm5hbCBpdGVyYXRpb25zCiAgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbWlyYUl0ZXIiKSkgewotCSAgbWlyYUl0ZXIgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgbWlyYUl0ZXIgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgIH0KKyAgICAgIC8vIG1pbmktYmF0Y2ggc2l6ZQorICAgICAgZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWJhdGNoU2l6ZSIpKSB7CisgICAgICAgIGJhdGNoU2l6ZSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOwogICAgICAgfQogICAgICAgLy8gcmVsYXhhdGlvbiBjb2VmZmljaWVudAogICAgICAgZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLUMiKSkgewotCSAgQyA9IERvdWJsZS5wYXJzZURvdWJsZShhcmdzW2kgKyAxXSk7CisgICAgICAgIEMgPSBEb3VibGUucGFyc2VEb3VibGUoYXJnc1tpICsgMV0pOwogICAgICAgfQogICAgICAgLy8gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXNlbnRGb3JTY2FsaW5nIikpIHsKLSAgICAgIC8vIAkgIHNlbnRGb3JTY2FsZSA9IERvdWJsZS5wYXJzZURvdWJsZShhcmdzW2kgKyAxXSk7Ci0gICAgICAvLyAJICBpZihzZW50Rm9yU2NhbGU+MSB8fCBzZW50Rm9yU2NhbGU8MCkgewotICAgICAgLy8gCSAgICAgIHByaW50bG4oIi1zZW50Rm9yU2NhbGluZyBtdXN0IGJlIGluIFswLDFdIik7Ci0gICAgICAvLyAJICAgICAgU3lzdGVtLmV4aXQoMTApOwotICAgICAgLy8gCSAgfQorICAgICAgLy8gc2VudEZvclNjYWxlID0gRG91YmxlLnBhcnNlRG91YmxlKGFyZ3NbaSArIDFdKTsKKyAgICAgIC8vIGlmKHNlbnRGb3JTY2FsZT4xIHx8IHNlbnRGb3JTY2FsZTwwKSB7CisgICAgICAvLyBwcmludGxuKCItc2VudEZvclNjYWxpbmcgbXVzdCBiZSBpbiBbMCwxXSIpOworICAgICAgLy8gU3lzdGVtLmV4aXQoMTApOworICAgICAgLy8gfQogICAgICAgLy8gfQogICAgICAgZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXNjb3JlUmF0aW8iKSkgewotICAgICAgCSAgc2NvcmVSYXRpbyA9IERvdWJsZS5wYXJzZURvdWJsZShhcmdzW2kgKyAxXSk7Ci0gICAgICAJICBpZihzY29yZVJhdGlvPD0wKSB7Ci0gICAgICAJICAgICAgcHJpbnRsbigiLXNjb3JlUmF0aW8gbXVzdCBiZSBwb3NpdGl2ZSIpOwotICAgICAgCSAgICAgIFN5c3RlbS5leGl0KDEwKTsKLSAgICAgIAkgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1uZWVkU2NhbGluZyIpKSB7Ci0gICAgICAJICBpbnQgc2NhbGUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKLSAgICAgIAkgIGlmKHNjYWxlPT0xKQotICAgICAgCSAgICAgIG5lZWRTY2FsZSA9IHRydWU7Ci0gICAgICAJICBlbHNlIGlmKHNjYWxlPT0wKQotICAgICAgCSAgICAgIG5lZWRTY2FsZSA9IGZhbHNlOwotICAgICAgCSAgZWxzZSB7Ci0gICAgICAJICAgICAgcHJpbnRsbigiLW5lZWRTY2FsaW5nIG11c3QgYmUgZWl0aGVyIDAgb3IgMS4iKTsKLSAgICAgIAkgICAgICBTeXN0ZW0uZXhpdCgxMCk7Ci0gICAgICAJICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItdXNlUHNldWRvQ29ycHVzIikpIHsKLQkgIGludCB1c2UgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKLQkgIGlmKHVzZT09MSkKLQkgICAgICB1c2VQc2V1ZG9CbGV1ID0gdHJ1ZTsKLQkgIGVsc2UgaWYodXNlPT0wKQotCSAgICAgIHVzZVBzZXVkb0JsZXUgPSBmYWxzZTsKLQkgIGVsc2UgewotCSAgICAgIHByaW50bG4oIi11c2VQc2V1ZG9Db3JwdXMgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOwotCSAgICAgIFN5c3RlbS5leGl0KDEwKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1jb3JwdXNEZWNheSIpKSB7Ci0JICBSID0gRG91YmxlLnBhcnNlRG91YmxlKGFyZ3NbaSArIDFdKTsKKyAgICAgICAgc2NvcmVSYXRpbyA9IERvdWJsZS5wYXJzZURvdWJsZShhcmdzW2kgKyAxXSk7CisgICAgICAgIGlmIChzY29yZVJhdGlvIDw9IDApIHsKKyAgICAgICAgICBwcmludGxuKCItc2NvcmVSYXRpbyBtdXN0IGJlIHBvc2l0aXZlIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMTApOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1uZWVkU2NhbGluZyIpKSB7CisgICAgICAgIGludCBzY2FsZSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgICBpZiAoc2NhbGUgPT0gMSkKKyAgICAgICAgICBuZWVkU2NhbGUgPSB0cnVlOworICAgICAgICBlbHNlIGlmIChzY2FsZSA9PSAwKQorICAgICAgICAgIG5lZWRTY2FsZSA9IGZhbHNlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBwcmludGxuKCItbmVlZFNjYWxpbmcgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItdXNlUHNldWRvQ29ycHVzIikpIHsKKyAgICAgICAgaW50IHVzZSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOworICAgICAgICBpZiAodXNlID09IDEpCisgICAgICAgICAgdXNlUHNldWRvQmxldSA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKHVzZSA9PSAwKQorICAgICAgICAgIHVzZVBzZXVkb0JsZXUgPSBmYWxzZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcHJpbnRsbigiLXVzZVBzZXVkb0NvcnB1cyBtdXN0IGJlIGVpdGhlciAwIG9yIDEuIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMTApOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1jb3JwdXNEZWNheSIpKSB7CisgICAgICAgIFIgPSBEb3VibGUucGFyc2VEb3VibGUoYXJnc1tpICsgMV0pOwogICAgICAgfQogCiAgICAgICAvLyBEZWNvZGVyIHNwZWNzCkBAIC0zMDg1LDcgKzMwODYsNyBAQAogICB9CiAKICAgcHJpdmF0ZSBBcnJheUxpc3Q8RG91YmxlPiByYW5kb21MYW1iZGEoKSB7Ci0gICAgQXJyYXlMaXN0PERvdWJsZT4gcmV0TGFtYmRhID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KDErbnVtUGFyYW1zKTsKKyAgICBBcnJheUxpc3Q8RG91YmxlPiByZXRMYW1iZGEgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oMSArIG51bVBhcmFtcyk7CiAKICAgICBmb3IgKGludCBjID0gMTsgYyA8PSBudW1QYXJhbXM7ICsrYykgewogICAgICAgaWYgKGlzT3B0aW1pemFibGVbY10pIHsKQEAgLTMwOTUsNyArMzA5Niw3IEBACiAgICAgICAgIHJhbmRWYWwgPSBtaW5SYW5kVmFsdWVbY10gKyByYW5kVmFsOyAvLyBudW1iZXIgaW4gW21pbixtYXhdCiAgICAgICAgIHJldExhbWJkYS5zZXQoYywgcmFuZFZhbCk7CiAgICAgICB9IGVsc2UgewotCSAgcmV0TGFtYmRhLnNldChjLCBkZWZhdWx0TGFtYmRhW2NdKTsKKyAgICAgICAgcmV0TGFtYmRhLnNldChjLCBkZWZhdWx0TGFtYmRhW2NdKTsKICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvbWlyYS9PcHRpbWl6ZXIuamF2YSBiL3NyYy9qb3NodWEvbWlyYS9PcHRpbWl6ZXIuamF2YQppbmRleCBlMmUyZmRkLi4wNzM2NWUyIDEwMDc1NQotLS0gYS9zcmMvam9zaHVhL21pcmEvT3B0aW1pemVyLmphdmEKKysrIGIvc3JjL2pvc2h1YS9taXJhL09wdGltaXplci5qYXZhCkBAIC0xNCw1ODQgKzE0LDU4NCBAQAogCiAvLyB0aGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIE1JUkEgYWxnb3JpdGhtCiBwdWJsaWMgY2xhc3MgT3B0aW1pemVyIHsKLSAgICBwdWJsaWMgT3B0aW1pemVyKFZlY3RvcjxTdHJpbmc+X291dHB1dCwgYm9vbGVhbltdIF9pc09wdGltaXphYmxlLCBkb3VibGVbXSBfaW5pdGlhbExhbWJkYSwKKyAgcHVibGljIE9wdGltaXplcihWZWN0b3I8U3RyaW5nPiBfb3V0cHV0LCBib29sZWFuW10gX2lzT3B0aW1pemFibGUsIGRvdWJsZVtdIF9pbml0aWFsTGFtYmRhLAogICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz5bXSBfZmVhdF9oYXNoLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPltdIF9zdGF0c19oYXNoKSB7CiAgICAgb3V0cHV0ID0gX291dHB1dDsgLy8gKG5vdCB1c2VkIGZvciBub3cpCiAgICAgaXNPcHRpbWl6YWJsZSA9IF9pc09wdGltaXphYmxlOwogICAgIGluaXRpYWxMYW1iZGEgPSBfaW5pdGlhbExhbWJkYTsgLy8gaW5pdGlhbCB3ZWlnaHRzIGFycmF5Ci0gICAgcGFyYW1EaW0gPSBpbml0aWFsTGFtYmRhLmxlbmd0aCAtIDE7ICAgIAorICAgIHBhcmFtRGltID0gaW5pdGlhbExhbWJkYS5sZW5ndGggLSAxOwogICAgIGluaXRpYWxMYW1iZGEgPSBfaW5pdGlhbExhbWJkYTsKICAgICBmZWF0X2hhc2ggPSBfZmVhdF9oYXNoOyAvLyBmZWF0dXJlIGhhc2ggdGFibGUKICAgICBzdGF0c19oYXNoID0gX3N0YXRzX2hhc2g7IC8vIHN1ZmYuIHN0YXRzIGhhc2ggdGFibGUKICAgICBmaW5hbExhbWJkYSA9IG5ldyBkb3VibGVbaW5pdGlhbExhbWJkYS5sZW5ndGhdOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBmaW5hbExhbWJkYS5sZW5ndGg7IGkrKykKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbmFsTGFtYmRhLmxlbmd0aDsgaSsrKQogICAgICAgZmluYWxMYW1iZGFbaV0gPSBpbml0aWFsTGFtYmRhW2ldOwogICB9CiAKLSAgLy9ydW4gTUlSQSBmb3Igb25lIGVwb2NoCisgIC8vIHJ1biBNSVJBIGZvciBvbmUgZXBvY2gKICAgcHVibGljIGRvdWJsZVtdIHJ1bk9wdGltaXplcigpIHsKLSAgICAgIGZvciAoIGludCBpdGVyID0gMDsgaXRlciA8IG1pcmFJdGVyOyArK2l0ZXIgKSB7Ci0JICBTeXN0ZW0uYXJyYXljb3B5KGZpbmFsTGFtYmRhLCAxLCBpbml0aWFsTGFtYmRhLCAxLCBwYXJhbURpbSk7Ci0JICAKLQkgIExpc3Q8SW50ZWdlcj4gc2VudHMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0JICBmb3IoIGludCBpID0gMDsgaSA8IHNlbnROdW07ICsraSApCi0JICAgICAgc2VudHMuYWRkKGkpOwotICAgIAotCSAgaWYobmVlZFNodWZmbGUpCi0JICAgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShzZW50cyk7Ci0gICAgCi0JICBkb3VibGUgb3JhTWV0cmljLCBvcmFTY29yZSwgcHJlZE1ldHJpYywgcHJlZFNjb3JlOwotCSAgZG91YmxlW10gb3JhUHJlZFNjb3JlID0gbmV3IGRvdWJsZVs0XTsKLQkgIGRvdWJsZSBldGEgPSAxLjA7IC8vbGVhcm5pbmcgcmF0ZSwgd2lsbCBub3QgYmUgY2hhbmdlZCBpZiBydW4gcGVyY2VwCi0JICBkb3VibGUgYXZnRXRhID0gMDsgLy9hdmVyYWdlIGV0YSwganVzdCBmb3IgYW5hbHlzaXMKLQkgIGRvdWJsZSBsb3NzID0gMDsKLQkgIGRvdWJsZSBmZWF0Tm9ybSA9IDA7Ci0JICBkb3VibGUgZmVhdERpZmZWYWw7Ci0JICBkb3VibGUgc3VtTWV0cmljU2NvcmUgPSAwOwotCSAgZG91YmxlIHN1bU1vZGVsU2NvcmUgPSAwOwotCSAgU3RyaW5nIG9yYUZlYXQgPSAiIjsKLQkgIFN0cmluZyBwcmVkRmVhdCA9ICIiOwotCSAgU3RyaW5nW10gb3JhUHJlZEZlYXQgPSBuZXcgU3RyaW5nWzJdOwotCSAgU3RyaW5nW10gdmVjT3JhRmVhdDsKLQkgIFN0cmluZ1tdIHZlY1ByZWRGZWF0OwotCSAgU3RyaW5nW10gZmVhdEluZm87Ci0JICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkgIC8vaW50IHByb2Nlc3NlZFNlbnQgPSAwOwotCSAgSXRlcmF0b3IgaXQ7Ci0JICBJbnRlZ2VyIGRpZmZGZWF0SWQ7Ci0JICBkb3VibGVbXSBhdmdMYW1iZGEgPSBuZXcgZG91YmxlW2luaXRpYWxMYW1iZGEubGVuZ3RoXTsgLy9vbmx5IG5lZWRlZCBpZiBhdmVyYWdpbmcgaXMgcmVxdWlyZWQKLQkgIGZvcihpbnQgaT0wOyBpPGluaXRpYWxMYW1iZGEubGVuZ3RoOyBpKyspCi0JICAgICAgYXZnTGFtYmRhW2ldID0gMC4wOworICAgIExpc3Q8SW50ZWdlcj4gc2VudHMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZW50TnVtOyArK2kpCisgICAgICAgIHNlbnRzLmFkZChpKTsKKyAgICBkb3VibGVbXSBhdmdMYW1iZGEgPSBuZXcgZG91YmxlW2luaXRpYWxMYW1iZGEubGVuZ3RoXTsgLy8gb25seSBuZWVkZWQgaWYgYXZlcmFnaW5nIGlzIHJlcXVpcmVkCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0aWFsTGFtYmRhLmxlbmd0aDsgaSsrKQorCWF2Z0xhbWJkYVtpXSA9IDAuMDsKKyAgICBkb3VibGVbXSBiZXN0TGFtYmRhID0gbmV3IGRvdWJsZVtpbml0aWFsTGFtYmRhLmxlbmd0aF07IC8vIG9ubHkgbmVlZGVkIGlmIGF2ZXJhZ2luZyBpcyByZXF1aXJlZAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5pdGlhbExhbWJkYS5sZW5ndGg7IGkrKykKKwliZXN0TGFtYmRhW2ldID0gMC4wOworICAgIGRvdWJsZSBiZXN0TWV0cmljU2NvcmUgPSBldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSA/IFBvc0luZiA6IE5lZ0luZjsKKyAgICBpbnQgYmVzdEl0ZXIgPSAwOworICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgbWlyYUl0ZXI7ICsraXRlcikgeworICAgICAgU3lzdGVtLmFycmF5Y29weShmaW5hbExhbWJkYSwgMSwgaW5pdGlhbExhbWJkYSwgMSwgcGFyYW1EaW0pOworICAgICAgaWYgKG5lZWRTaHVmZmxlKQorICAgICAgICBDb2xsZWN0aW9ucy5zaHVmZmxlKHNlbnRzKTsKIAotCSAgLy91cGRhdGUgd2VpZ2h0cwotCSAgZm9yKEludGVnZXIgcyA6IHNlbnRzKSB7CisgICAgICBkb3VibGUgb3JhTWV0cmljLCBvcmFTY29yZSwgcHJlZE1ldHJpYywgcHJlZFNjb3JlOworICAgICAgZG91YmxlW10gb3JhUHJlZFNjb3JlID0gbmV3IGRvdWJsZVs0XTsKKyAgICAgIGRvdWJsZSBldGEgPSAxLjA7IC8vIGxlYXJuaW5nIHJhdGUsIHdpbGwgbm90IGJlIGNoYW5nZWQgaWYgcnVuIHBlcmNlcAorICAgICAgZG91YmxlIGF2Z0V0YSA9IDA7IC8vIGF2ZXJhZ2UgZXRhLCBqdXN0IGZvciBhbmFseXNpcworICAgICAgZG91YmxlIGxvc3MgPSAwOworICAgICAgZG91YmxlIGRpZmYgPSAwOworICAgICAgZG91YmxlIGZlYXROb3JtID0gMDsKKyAgICAgIGRvdWJsZSBzdW1NZXRyaWNTY29yZSA9IDA7CisgICAgICBkb3VibGUgc3VtTW9kZWxTY29yZSA9IDA7CisgICAgICBTdHJpbmcgb3JhRmVhdCA9ICIiOworICAgICAgU3RyaW5nIHByZWRGZWF0ID0gIiI7CisgICAgICBTdHJpbmdbXSBvcmFQcmVkRmVhdCA9IG5ldyBTdHJpbmdbMl07CisgICAgICBTdHJpbmdbXSB2ZWNPcmFGZWF0OworICAgICAgU3RyaW5nW10gdmVjUHJlZEZlYXQ7CisgICAgICBTdHJpbmdbXSBmZWF0SW5mbzsKKyAgICAgIGludCB0aGlzQmF0Y2hTaXplID0gMDsKKyAgICAgIGludCBudW1CYXRjaCA9IDA7CisgICAgICBpbnQgbnVtVXBkYXRlID0gMDsKKyAgICAgIEl0ZXJhdG9yIGl0OworICAgICAgSW50ZWdlciBkaWZmRmVhdElkOworCisgICAgICAvLyB1cGRhdGUgd2VpZ2h0cworICAgICAgSW50ZWdlciBzOworICAgICAgaW50IHNlbnRDb3VudCA9IDA7CisgICAgICB3aGlsZSggc2VudENvdW50IDwgc2VudE51bSApIHsKKwkgIGxvc3MgPSAwOworCSAgdGhpc0JhdGNoU2l6ZSA9IGJhdGNoU2l6ZTsKKwkgICsrbnVtQmF0Y2g7CisJICBIYXNoTWFwPEludGVnZXIsIERvdWJsZT4gZmVhdERpZmYgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBEb3VibGU+KCk7CisJICBmb3IoaW50IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IgKSB7CiAJICAgICAgLy9maW5kIG91dCBvcmFjbGUgYW5kIHByZWRpY3Rpb24KLQkgICAgICBpZihmaXJzdCkKLQkJICBmaW5kT3JhUHJlZChzLCBvcmFQcmVkU2NvcmUsIG9yYVByZWRGZWF0LCBpbml0aWFsTGFtYmRhLCBmZWF0U2NhbGUpOwotCSAgICAgIGVsc2UKLQkJICBmaW5kT3JhUHJlZChzLCBvcmFQcmVkU2NvcmUsIG9yYVByZWRGZWF0LCBmaW5hbExhbWJkYSwgZmVhdFNjYWxlKTsKLSAgICAgIAotCSAgICAgIC8vdGhlIG1vZGVsIHNjb3JlcyBoZXJlIGFyZSBhbHJlYWR5IHNjYWxlZCBpbiBmaW5kT3JhUHJlZAorCSAgICAgIHMgPSBzZW50cy5nZXQoc2VudENvdW50KTsKKwkgICAgICAvLyBmaW5kIG91dCBvcmFjbGUgYW5kIHByZWRpY3Rpb24KKwkgICAgICBmaW5kT3JhUHJlZChzLCBvcmFQcmVkU2NvcmUsIG9yYVByZWRGZWF0LCBmaW5hbExhbWJkYSwgZmVhdFNjYWxlKTsKKwkgICAgICAKKwkgICAgICAvLyB0aGUgbW9kZWwgc2NvcmVzIGhlcmUgYXJlIGFscmVhZHkgc2NhbGVkIGluIGZpbmRPcmFQcmVkCiAJICAgICAgb3JhTWV0cmljID0gb3JhUHJlZFNjb3JlWzBdOwogCSAgICAgIG9yYVNjb3JlID0gb3JhUHJlZFNjb3JlWzFdOwogCSAgICAgIHByZWRNZXRyaWMgPSBvcmFQcmVkU2NvcmVbMl07CiAJICAgICAgcHJlZFNjb3JlID0gb3JhUHJlZFNjb3JlWzNdOwogCSAgICAgIG9yYUZlYXQgPSBvcmFQcmVkRmVhdFswXTsKIAkgICAgICBwcmVkRmVhdCA9IG9yYVByZWRGZWF0WzFdOwotICAgICAgCi0JICAgICAgLy91cGRhdGUgdGhlIHNjYWxlCi0JICAgICAgaWYobmVlZFNjYWxlKSB7IC8vb3RoZXJ3aXNlIGZlYXRzY2FsZSByZW1haW5zIDEuMAotCQkgIHN1bU1ldHJpY1Njb3JlICs9IGphdmEubGFuZy5NYXRoLmFicyhvcmFNZXRyaWMrcHJlZE1ldHJpYyk7Ci0JCSAgc3VtTW9kZWxTY29yZSArPSBqYXZhLmxhbmcuTWF0aC5hYnMob3JhU2NvcmUrcHJlZFNjb3JlKS9mZWF0U2NhbGU7IC8vcmVzdG9yZSB0aGUgb3JpZ2luYWwgbW9kZWwgc2NvcmUKLSAgICAgICAgCi0JCSAgaWYoc3VtTW9kZWxTY29yZS9zdW1NZXRyaWNTY29yZSA+IHNjb3JlUmF0aW8pCi0JCSAgICAgIGZlYXRTY2FsZSA9IHN1bU1ldHJpY1Njb3JlL3N1bU1vZGVsU2NvcmU7CisJICAgICAgCisJICAgICAgLy8gdXBkYXRlIHRoZSBzY2FsZQorCSAgICAgIGlmIChuZWVkU2NhbGUpIHsgLy8gb3RoZXJ3aXNlIGZlYXRzY2FsZSByZW1haW5zIDEuMAorCQkgIHN1bU1ldHJpY1Njb3JlICs9IGphdmEubGFuZy5NYXRoLmFicyhvcmFNZXRyaWMgKyBwcmVkTWV0cmljKTsKKyAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG1vZGVsIHNjb3JlCisJCSAgc3VtTW9kZWxTY29yZSArPSBqYXZhLmxhbmcuTWF0aC5hYnMob3JhU2NvcmUgKyBwcmVkU2NvcmUpIC8gZmVhdFNjYWxlOwogCi0JCSAgLy8gICAvKiBhIGRpZmZlcmVudCBzY2FsaW5nIHN0cmF0ZWd5IAotCQkgIC8vICAgaWYoICgxLjAqcHJvY2Vzc2VkU2VudC9zZW50TnVtKSA8IHNlbnRGb3JTY2FsZSApIHsgLy9zdGlsbCBuZWVkIHRvIHNjYWxlCi0JCSAgLy8gICAgIGRvdWJsZSBuZXdGZWF0U2NhbGUgPSBqYXZhLmxhbmcuTWF0aC5hYnMoc2NvcmVSYXRpbypzdW1NZXRyaWNEaWZmIC8gc3VtTW9kZWxEaWZmKTsgLy90byBtYWtlIHN1cmUgbW9kZWxTY29yZSpmZWF0U2NhbGUvbWV0cmljU2NvcmUgPSBzY29yZVJhdGlvCi0gICAgICAgICAgCi0JCSAgLy8gICAgIC8vdXBkYXRlIHRoZSBzY2FsZSBvbmx5IHdoZW4gZGlmZmVyZW5jZSBpcyBzaWduaWZpY2FudAotCQkgIC8vICAgICBpZiggamF2YS5sYW5nLk1hdGguYWJzKG5ld0ZlYXRTY2FsZS1mZWF0U2NhbGUpL2ZlYXRTY2FsZSA+IDAuMiApCi0JCSAgLy8gICAgICAgZmVhdFNjYWxlID0gbmV3RmVhdFNjYWxlOwotCQkgIC8vICAgfSovCisJCSAgaWYgKHN1bU1vZGVsU2NvcmUgLyBzdW1NZXRyaWNTY29yZSA+IHNjb3JlUmF0aW8pCisJCSAgICAgIGZlYXRTY2FsZSA9IHN1bU1ldHJpY1Njb3JlIC8gc3VtTW9kZWxTY29yZTsKIAkgICAgICB9Ci0JICAgICAgLy8gcHJvY2Vzc2VkU2VudCsrOwogCi0JICAgICAgSGFzaE1hcDxJbnRlZ2VyLCBEb3VibGU+IGFsbFByZWRGZWF0ID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgRG91YmxlPigpOwotCSAgICAgIEhhc2hNYXA8SW50ZWdlciwgRG91YmxlPiBmZWF0RGlmZiA9IG5ldyBIYXNoTWFwPEludGVnZXIsIERvdWJsZT4oKTsKLSAgICAgIAogCSAgICAgIHZlY09yYUZlYXQgPSBvcmFGZWF0LnNwbGl0KCJcXHMrIik7CiAJICAgICAgdmVjUHJlZEZlYXQgPSBwcmVkRmVhdC5zcGxpdCgiXFxzKyIpOwotICAgICAgCi0JICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWNPcmFGZWF0Lmxlbmd0aDsgaSsrKSB7Ci0JCSAgZmVhdEluZm8gPSB2ZWNPcmFGZWF0W2ldLnNwbGl0KCI9Iik7Ci0JCSAgZGlmZkZlYXRJZCA9IEludGVnZXIucGFyc2VJbnQoZmVhdEluZm9bMF0pOwotCQkgIGZlYXREaWZmLnB1dChkaWZmRmVhdElkLCBEb3VibGUucGFyc2VEb3VibGUoZmVhdEluZm9bMV0pKTsKLQkgICAgICB9Ci0KLQkgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlY1ByZWRGZWF0Lmxlbmd0aDsgaSsrKSB7Ci0JCSAgZmVhdEluZm8gPSB2ZWNQcmVkRmVhdFtpXS5zcGxpdCgiPSIpOwotCQkgIGRpZmZGZWF0SWQgPSBJbnRlZ2VyLnBhcnNlSW50KGZlYXRJbmZvWzBdKTsKLQkJICBhbGxQcmVkRmVhdC5wdXQoZGlmZkZlYXRJZCwgRG91YmxlLnBhcnNlRG91YmxlKGZlYXRJbmZvWzFdKSk7Ci0JCSAgaWYgKGZlYXREaWZmLmNvbnRhaW5zS2V5KGRpZmZGZWF0SWQpKSAvL292ZXJsYXBwaW5nIGZlYXR1cmVzCi0JCSAgICAgIGZlYXREaWZmLnB1dChkaWZmRmVhdElkLCBmZWF0RGlmZi5nZXQoZGlmZkZlYXRJZCktRG91YmxlLnBhcnNlRG91YmxlKGZlYXRJbmZvWzFdKSk7Ci0JCSAgZWxzZSAvL2ZlYXR1cmVzIG9ubHkgZmlyaW5nIGluIHRoZSAybmQgZmVhdHVyZSB2ZWN0b3IKLQkJICAgICAgZmVhdERpZmYucHV0KGRpZmZGZWF0SWQsIC0xLjAqRG91YmxlLnBhcnNlRG91YmxlKGZlYXRJbmZvWzFdKSk7Ci0JICAgICAgfQotCi0JICAgICAgaWYoIXJ1blBlcmNlcCkgeyAvL290aGVyd2lzZSBldGE9MS4wCi0JCSAgZmVhdE5vcm0gPSAwOwotCi0JCSAgQ29sbGVjdGlvbjxEb3VibGU+IGFsbERpZmYgPSBmZWF0RGlmZi52YWx1ZXMoKTsKLQkJICBmb3IoaXQgPWFsbERpZmYuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkgICAgICBmZWF0RGlmZlZhbCA9IChEb3VibGUpIGl0Lm5leHQoKTsKLQkJICAgICAgZmVhdE5vcm0gKz0gZmVhdERpZmZWYWwqZmVhdERpZmZWYWw7CisJICAgICAgCisJICAgICAgLy9hY2N1bXVsYXRlIGRpZmZlcmVuY2UgZmVhdHVyZSB2ZWN0b3IKKwkgICAgICBpZiAoIGIgPT0gMCApIHsKKwkJICBmb3IgKGludCBpID0gMDsgaSA8IHZlY09yYUZlYXQubGVuZ3RoOyBpKyspIHsKKwkJICAgICAgZmVhdEluZm8gPSB2ZWNPcmFGZWF0W2ldLnNwbGl0KCI9Iik7CisJCSAgICAgIGRpZmZGZWF0SWQgPSBJbnRlZ2VyLnBhcnNlSW50KGZlYXRJbmZvWzBdKTsKKwkJICAgICAgZmVhdERpZmYucHV0KGRpZmZGZWF0SWQsIERvdWJsZS5wYXJzZURvdWJsZShmZWF0SW5mb1sxXSkpOwogCQkgIH0KLSAgICAgICAgCi0JCSAgLy9hIGZldyBzYW5pdHkgY2hlY2tzCi0JCSAgaWYoISBldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSkgewotCQkgICAgICBpZihvcmFTZWxlY3RNb2RlPT0xICYmIHByZWRTZWxlY3RNb2RlPT0xKSB7IC8vImhvcGUtZmVhciIgc2VsZWN0aW9uCi0JCQkgIC8qIG9yYV9zY29yZStvcmFfbWV0cmljID4gcHJlZF9zY29yZStwcmVkX21ldHJpYwotCQkJICAgKiBwcmVkX3Njb3JlLXByZWRfbWV0cmljID4gb3JhX3Njb3JlLW9yYV9tZXRyaWMKLQkJCSAgICogPT4gb3JhX21ldHJpYyA+IHByZWRfbWV0cmljICAqLwotCQkJICBpZihvcmFNZXRyaWMrMWUtMTAgPCBwcmVkTWV0cmljKSB7Ci0JCQkgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIldBUk5JTkc6IGZvciBob3BlLWZlYXIgc2VsZWN0aW9uLCBvcmFjbGUgbWV0cmljIHNjb3JlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHByZWRpY3Rpb24gbWV0cmljIHNjb3JlISIpOwotCQkJICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTb21ldGhpbmcgaXMgd3JvbmchIik7Ci0JCQkgIH0KKwkJICBmb3IgKGludCBpID0gMDsgaSA8IHZlY1ByZWRGZWF0Lmxlbmd0aDsgaSsrKSB7CisJCSAgICAgIGZlYXRJbmZvID0gdmVjUHJlZEZlYXRbaV0uc3BsaXQoIj0iKTsKKwkJICAgICAgZGlmZkZlYXRJZCA9IEludGVnZXIucGFyc2VJbnQoZmVhdEluZm9bMF0pOworCQkgICAgICBpZiAoZmVhdERpZmYuY29udGFpbnNLZXkoZGlmZkZlYXRJZCkpIHsgLy9vdmVybGFwcGluZyBmZWF0dXJlcworCQkJICBkaWZmID0gZmVhdERpZmYuZ2V0KGRpZmZGZWF0SWQpLURvdWJsZS5wYXJzZURvdWJsZShmZWF0SW5mb1sxXSk7CisJCQkgIGlmICggTWF0aC5hYnMoZGlmZikgPiAxZS0yMCApCisJCQkgICAgICBmZWF0RGlmZi5wdXQoZGlmZkZlYXRJZCwgZGlmZik7CisJCQkgIGVsc2UKKwkJCSAgICAgIGZlYXREaWZmLnJlbW92ZShkaWZmRmVhdElkKTsKIAkJICAgICAgfQotICAgICAgICAgIAotCQkgICAgICBpZihvcmFTZWxlY3RNb2RlPT0yIHx8IHByZWRTZWxlY3RNb2RlPT0zKSB7Ci0JCQkgIGlmKG9yYU1ldHJpYysxZS0xMCA8IHByZWRNZXRyaWMpIHsKLQkJCSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV0FSTklORzogZm9yIG1heC1tZXRyaWMgb3JhY2xlIHNlbGVjdGlvbiBvciBtaW4tbWV0cmljIHByZWRpY3Rpb24gc2VsZWN0aW9uLCB0aGUgb3JhY2xlIG1ldHJpYyAiICsKLQkJCQkJCSAic2NvcmUgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIHByZWRpY3Rpb24gbWV0cmljIHNjb3JlISIpOwotCQkJICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTb21ldGhpbmcgaXMgd3JvbmchIik7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgIH0gZWxzZSB7Ci0JCSAgICAgIGlmKG9yYVNlbGVjdE1vZGU9PTEgJiYgcHJlZFNlbGVjdE1vZGU9PTEpIHsgLy8iaG9wZS1mZWFyIiBzZWxlY3Rpb24KLQkJCSAgLyogb3JhX3Njb3JlLW9yYV9tZXRyaWMgPiBwcmVkX3Njb3JlLXByZWRfbWV0cmljCi0JCQkgICAqIHByZWRfc2NvcmUrcHJlZF9tZXRyaWMgPiBvcmFfc2NvcmUrb3JhX21ldHJpYwotCQkJICAgKiA9PiBvcmFfbWV0cmljIDwgcHJlZF9tZXRyaWMgICovCi0JCQkgIGlmKG9yYU1ldHJpYy0xZS0xMCA+IHByZWRNZXRyaWMpIHsKLQkJCSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV0FSTklORzogZm9yIGhvcGUtZmVhciBzZWxlY3Rpb24sIG9yYWNsZSBtZXRyaWMgc2NvcmUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gcHJlZGljdGlvbiBtZXRyaWMgc2NvcmUhIik7Ci0JCQkgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNvbWV0aGluZyBpcyB3cm9uZyEiKTsKLQkJCSAgfQotCQkgICAgICB9Ci0gICAgICAgICAgCi0JCSAgICAgIGlmKG9yYVNlbGVjdE1vZGU9PTIgfHwgcHJlZFNlbGVjdE1vZGU9PTMpIHsKLQkJCSAgaWYob3JhTWV0cmljLTFlLTEwID4gcHJlZE1ldHJpYykgewotCQkJICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBmb3IgbWluLW1ldHJpYyBvcmFjbGUgc2VsZWN0aW9uIG9yIG1heC1tZXRyaWMgcHJlZGljdGlvbiBzZWxlY3Rpb24sIHRoZSBvcmFjbGUgbWV0cmljICIgKwotCQkJCQkJICJzY29yZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiB0aGUgcHJlZGljdGlvbiBtZXRyaWMgc2NvcmUhIik7Ci0JCQkgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNvbWV0aGluZyBpcyB3cm9uZyEiKTsKLQkJCSAgfQotCQkgICAgICB9CisJCSAgICAgIGVsc2UgLy9mZWF0dXJlcyBvbmx5IGZpcmluZyBpbiB0aGUgMm5kIGZlYXR1cmUgdmVjdG9yCisJCQkgIGZlYXREaWZmLnB1dChkaWZmRmVhdElkLCAtMS4wKkRvdWJsZS5wYXJzZURvdWJsZShmZWF0SW5mb1sxXSkpOwogCQkgIH0KLSAgICAgICAgCi0JCSAgaWYocHJlZFNlbGVjdE1vZGU9PTIpIHsKLQkJICAgICAgaWYocHJlZFNjb3JlKzFlLTEwIDwgb3JhU2NvcmUpIHsKLQkJCSAgU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBmb3IgbWF4LW1vZGVsIHByZWRpY3Rpb24gc2VsZWN0aW9uLCB0aGUgcHJlZGljdGlvbiBtb2RlbCBzY29yZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvcmFjbGUgbW9kZWwgc2NvcmUhIik7Ci0JCQkgIFN5c3RlbS5lcnIucHJpbnRsbigiU29tZXRoaW5nIGlzIHdyb25nISIpOworCSAgICAgIH0gZWxzZSB7CisJCSAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWNPcmFGZWF0Lmxlbmd0aDsgaSsrKSB7CisJCSAgICAgIGZlYXRJbmZvID0gdmVjT3JhRmVhdFtpXS5zcGxpdCgiPSIpOworCQkgICAgICBkaWZmRmVhdElkID0gSW50ZWdlci5wYXJzZUludChmZWF0SW5mb1swXSk7CisJCSAgICAgIGlmIChmZWF0RGlmZi5jb250YWluc0tleShkaWZmRmVhdElkKSkgeyAvL292ZXJsYXBwaW5nIGZlYXR1cmVzCisJCQkgIGRpZmYgPSBmZWF0RGlmZi5nZXQoZGlmZkZlYXRJZCkrRG91YmxlLnBhcnNlRG91YmxlKGZlYXRJbmZvWzFdKTsKKwkJCSAgaWYgKCBNYXRoLmFicyhkaWZmKSA+IDFlLTIwICkKKwkJCSAgICAgIGZlYXREaWZmLnB1dChkaWZmRmVhdElkLCBkaWZmKTsKKwkJCSAgZWxzZQorCQkJICAgICAgZmVhdERpZmYucmVtb3ZlKGRpZmZGZWF0SWQpOwogCQkgICAgICB9CisJCSAgICAgIGVsc2UgLy9mZWF0dXJlcyBvbmx5IGZpcmluZyBpbiB0aGUgbmV3IG9yYWNsZSBmZWF0dXJlIHZlY3RvcgorCQkJICBmZWF0RGlmZi5wdXQoZGlmZkZlYXRJZCwgRG91YmxlLnBhcnNlRG91YmxlKGZlYXRJbmZvWzFdKSk7CiAJCSAgfQotICAgICAgICAKLQkJICAvL2Nvc3QgLSBtYXJnaW4KLQkJICAvL3JlbWVtYmVyIHRoZSBtb2RlbCBzY29yZXMgaGVyZSBhcmUgYWxyZWFkeSBzY2FsZWQKLQkJICBsb3NzID0gZXZhbE1ldHJpYy5nZXRUb0JlTWluaW1pemVkKCkgPyAvL2Nvc3Qgc2hvdWxkIGFsd2F5cyBiZSBub24tbmVnYXRpdmUgCi0JCSAgICAgIChwcmVkTWV0cmljLW9yYU1ldHJpYykgLSAob3JhU2NvcmUtcHJlZFNjb3JlKS9mZWF0U2NhbGU6IAotCQkgICAgICAob3JhTWV0cmljLXByZWRNZXRyaWMpIC0gKG9yYVNjb3JlLXByZWRTY29yZSkvZmVhdFNjYWxlOwotICAgICAgICAKLQkJICBpZiggbG9zcyA8PSAwICkKLQkJICAgICAgZXRhID0gMDsKLQkJICBlbHNlCi0JCSAgICAgIC8vZXRhID0gQyA8IGxvc3MvKGZlYXROb3JtKmZlYXRTY2FsZSpmZWF0U2NhbGUpID8gQyA6IGxvc3MvKGZlYXROb3JtKmZlYXRTY2FsZSpmZWF0U2NhbGUpOyAvL2ZlYXQgdmVjdG9yIG5vdCBzY2FsZWQgYmVmb3JlCi0JCSAgICAgIGV0YSA9IEMgPCBsb3NzLyhmZWF0Tm9ybSkgPyBDIDogbG9zcy8oZmVhdE5vcm0pOyAvL2ZlYXQgdmVjdG9yIG5vdCBzY2FsZWQgYmVmb3JlCi0JICAgICAgfQotICAgICAgCi0JICAgICAgYXZnRXRhICs9IGV0YTsKLQotCSAgICAgIFNldDxJbnRlZ2VyPiBkaWZmRmVhdFNldCA9IGZlYXREaWZmLmtleVNldCgpOwotCSAgICAgIGl0ID0gZGlmZkZlYXRTZXQuaXRlcmF0b3IoKTsKLQotCSAgICAgIGlmKGZpcnN0KSB7Ci0JCSAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgCi0JCSAgaWYoIGV0YSE9MCApIHsKLQkJICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQkgIGRpZmZGZWF0SWQgPSAoSW50ZWdlcilpdC5uZXh0KCk7Ci0JCQkgIGZpbmFsTGFtYmRhW2RpZmZGZWF0SWRdID0gaW5pdGlhbExhbWJkYVtkaWZmRmVhdElkXSArIGV0YSpmZWF0RGlmZi5nZXQoZGlmZkZlYXRJZCk7CisJCSAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWNQcmVkRmVhdC5sZW5ndGg7IGkrKykgeworCQkgICAgICBmZWF0SW5mbyA9IHZlY1ByZWRGZWF0W2ldLnNwbGl0KCI9Iik7CisJCSAgICAgIGRpZmZGZWF0SWQgPSBJbnRlZ2VyLnBhcnNlSW50KGZlYXRJbmZvWzBdKTsKKwkJICAgICAgaWYgKGZlYXREaWZmLmNvbnRhaW5zS2V5KGRpZmZGZWF0SWQpKSB7IC8vb3ZlcmxhcHBpbmcgZmVhdHVyZXMKKwkJCSAgZGlmZiA9IGZlYXREaWZmLmdldChkaWZmRmVhdElkKS1Eb3VibGUucGFyc2VEb3VibGUoZmVhdEluZm9bMV0pOworCQkJICBpZiAoIE1hdGguYWJzKGRpZmYpID4gMWUtMjAgKQorCQkJICAgICAgZmVhdERpZmYucHV0KGRpZmZGZWF0SWQsIGRpZmYpOworCQkJICBlbHNlCisJCQkgICAgICBmZWF0RGlmZi5yZW1vdmUoZGlmZkZlYXRJZCk7CiAJCSAgICAgIH0KKwkJICAgICAgZWxzZSAvL2ZlYXR1cmVzIG9ubHkgZmlyaW5nIGluIHRoZSBuZXcgcHJlZGljdGlvbiBmZWF0dXJlIHZlY3RvcgorCQkJICBmZWF0RGlmZi5wdXQoZGlmZkZlYXRJZCwgLTEuMCpEb3VibGUucGFyc2VEb3VibGUoZmVhdEluZm9bMV0pKTsKIAkJICB9CiAJICAgICAgfQotCSAgICAgIGVsc2UgewotCQkgIGlmKCBldGEhPTAgKSB7Ci0JCSAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJICBkaWZmRmVhdElkID0gKEludGVnZXIpaXQubmV4dCgpOwotCQkJICBmaW5hbExhbWJkYVtkaWZmRmVhdElkXSA9IGZpbmFsTGFtYmRhW2RpZmZGZWF0SWRdICsgZXRhKmZlYXREaWZmLmdldChkaWZmRmVhdElkKTsKLQkJICAgICAgfQotCQkgIH0KKwkgICAgICBpZiAoIXJ1blBlcmNlcCkgeyAvLyBvdGhlcndpc2UgZXRhPTEuMAorCQkgIC8vIHJlbWVtYmVyIHRoZSBtb2RlbCBzY29yZXMgaGVyZSBhcmUgYWxyZWFkeSBzY2FsZWQKKwkJICBkb3VibGUgc2luZ2xlTG9zcyA9IGV2YWxNZXRyaWMuZ2V0VG9CZU1pbmltaXplZCgpID8KKwkJICAgICAgKHByZWRNZXRyaWMgLSBvcmFNZXRyaWMpIC0gKG9yYVNjb3JlIC0gcHJlZFNjb3JlKSAvIGZlYXRTY2FsZQorCQkgICAgICA6IChvcmFNZXRyaWMgLSBwcmVkTWV0cmljKSAtIChvcmFTY29yZSAtIHByZWRTY29yZSkgLyBmZWF0U2NhbGU7CisJCSAgbG9zcyArPSBzaW5nbGVMb3NzOwogCSAgICAgIH0KLSAgICAgIAotCSAgICAgIGlmKG5lZWRBdmcpIHsKLQkJICBmb3IoaW50IGk9MDsgaTxhdmdMYW1iZGEubGVuZ3RoOyBpKyspCi0JCSAgICAgIGF2Z0xhbWJkYVtpXSArPSBmaW5hbExhbWJkYVtpXTsKKwkgICAgICArK3NlbnRDb3VudDsKKwkgICAgICBpZiggc2VudENvdW50ID49IHNlbnROdW0gKSB7CisJCSAgdGhpc0JhdGNoU2l6ZSA9IGIgKyAxOworCQkgIGJyZWFrOworCSAgICAgIH0KKwkgIH0gLy9mb3IoaW50IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpCisKKwkgIGlmICghcnVuUGVyY2VwKSB7IC8vIG90aGVyd2lzZSBldGE9MS4wCisJICAgICAgZmVhdE5vcm0gPSAwOworCSAgICAgIENvbGxlY3Rpb248RG91YmxlPiBhbGxEaWZmID0gZmVhdERpZmYudmFsdWVzKCk7CisJICAgICAgZm9yIChpdCA9IGFsbERpZmYuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkgIGRpZmYgPSAoRG91YmxlKSBpdC5uZXh0KCk7CisJCSAgZmVhdE5vcm0gKz0gZGlmZiAqIGRpZmYgLyAoIHRoaXNCYXRjaFNpemUgKiB0aGlzQmF0Y2hTaXplICk7CiAJICAgICAgfQogCSAgfQotICAgICAgCi0JICBpZihuZWVkQXZnKSB7Ci0JICAgICAgZm9yKGludCBpPTA7IGk8ZmluYWxMYW1iZGEubGVuZ3RoOyBpKyspCi0JCSAgZmluYWxMYW1iZGFbaV0gPSBhdmdMYW1iZGFbaV0vc2VudE51bTsKKwkgIGlmKCBsb3NzIDw9IDAgKQorCSAgICAgIGV0YSA9IDA7CisJICBlbHNlIHsKKwkgICAgICBsb3NzIC89IHRoaXNCYXRjaFNpemU7CisJICAgICAgLy8gZmVhdCB2ZWN0b3Igbm90IHNjYWxlZCBiZWZvcmUKKwkgICAgICBldGEgPSBDIDwgbG9zcyAvIGZlYXROb3JtID8gQyA6IGxvc3MgLyBmZWF0Tm9ybTsKIAkgIH0KLSAgICAKLQkgIGF2Z0V0YSAvPSBzZW50TnVtOworCSAgYXZnRXRhICs9IGV0YTsKKwkgIFNldDxJbnRlZ2VyPiBkaWZmRmVhdFNldCA9IGZlYXREaWZmLmtleVNldCgpOworCSAgaXQgPSBkaWZmRmVhdFNldC5pdGVyYXRvcigpOworCSAgaWYgKCBqYXZhLmxhbmcuTWF0aC5hYnMoZXRhKSA+IDFlLTIwICkgeworCSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJICBkaWZmRmVhdElkID0gKEludGVnZXIpIGl0Lm5leHQoKTsKKwkJICBmaW5hbExhbWJkYVtkaWZmRmVhdElkXSA9CisJCSAgICAgIGZpbmFsTGFtYmRhW2RpZmZGZWF0SWRdICsgZXRhICogZmVhdERpZmYuZ2V0KGRpZmZGZWF0SWQpIC8gdGhpc0JhdGNoU2l6ZTsKKwkgICAgICB9CisJICB9CisJICBpZiAobmVlZEF2ZykgeworCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXZnTGFtYmRhLmxlbmd0aDsgKytpKQorCQkgIGF2Z0xhbWJkYVtpXSArPSBmaW5hbExhbWJkYVtpXTsKKwkgIH0KKyAgICAgIH0gLy93aGlsZSggc2VudENvdW50IDwgc2VudE51bSApCiAKLQkgIC8qCi0JICAgKiBmb3IoIGludCBpPTA7IGk8ZmluYWxMYW1iZGEubGVuZ3RoOyBpKysgKSBTeXN0ZW0ub3V0LnByaW50KGZpbmFsTGFtYmRhW2ldKyIgIik7Ci0JICAgKiBTeXN0ZW0ub3V0LnByaW50bG4oKTsgU3lzdGVtLmV4aXQoMCk7Ci0JICAgKi8gCisgICAgICBhdmdFdGEgLz0gbnVtQmF0Y2g7CiAKLQkgIGRvdWJsZSBpbml0TWV0cmljU2NvcmUgPSBjb21wdXRlQ29ycHVzTWV0cmljU2NvcmUoaW5pdGlhbExhbWJkYSk7IC8vIGNvbXB1dGUgdGhlIGluaXRpYWwgY29ycHVzLWxldmVsIG1ldHJpYyBzY29yZQotCSAgZmluYWxNZXRyaWNTY29yZSA9IGNvbXB1dGVDb3JwdXNNZXRyaWNTY29yZShmaW5hbExhbWJkYSk7IC8vIGNvbXB1dGUgZmluYWwgY29ycHVzLWxldmVsIG1ldHJpYyBzY29yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlCisgICAgICAvKgorICAgICAgICogZm9yKCBpbnQgaT0wOyBpPGZpbmFsTGFtYmRhLmxlbmd0aDsgaSsrICkgU3lzdGVtLm91dC5wcmludChmaW5hbExhbWJkYVtpXSsiICIpOworICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKCk7IFN5c3RlbS5leGl0KDApOworICAgICAgICovCiAKLQkgIC8vIHByZXBhcmUgdGhlIHByaW50aW5nIGluZm8KLQkgIFN0cmluZyByZXN1bHQgPSAiSXRlciAiK2l0ZXIrIjogQXZnIGxlYXJuaW5nIHJhdGU9IitTdHJpbmcuZm9ybWF0KCIlLjRmIiwgYXZnRXRhKTsKLQkgIHJlc3VsdCArPSAiIEluaXRpYWwgIgotCSAgICAgICsgZXZhbE1ldHJpYy5nZXRfbWV0cmljTmFtZSgpICsgIj0iICsgU3RyaW5nLmZvcm1hdCgiJS40ZiIsIGluaXRNZXRyaWNTY29yZSkgKyAiIEZpbmFsICIKLQkgICAgICArIGV2YWxNZXRyaWMuZ2V0X21ldHJpY05hbWUoKSArICI9IiArIFN0cmluZy5mb3JtYXQoIiUuNGYiLCBmaW5hbE1ldHJpY1Njb3JlKTsKLQkgIC8vcHJpbnQgbGFtYmRhIGluZm8KLQkgIC8vIGludCBudW1QYXJhbVRvUHJpbnQgPSAwOwotCSAgLy8gbnVtUGFyYW1Ub1ByaW50ID0gcGFyYW1EaW0gPiAxMCA/IDEwIDogcGFyYW1EaW07IC8vIGhvdyBtYW55IHBhcmFtZXRlcnMKLQkgIC8vIC8vIHRvIHByaW50Ci0JICAvLyByZXN1bHQgPSBwYXJhbURpbSA+IDEwID8gIkZpbmFsIGxhbWJkYSAoZmlyc3QgMTApOiB7IiA6ICJGaW5hbCBsYW1iZGE6IHsiOwotICAgIAotCSAgLy8gZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtUGFyYW1Ub1ByaW50OyArK2kpCi0JICAvLyAgICAgcmVzdWx0ICs9IFN0cmluZy5mb3JtYXQoIiUuNGYiLCBmaW5hbExhbWJkYVtpXSkgKyAiICI7Ci0KLQkgIG91dHB1dC5hZGQocmVzdWx0KTsKLSAgICAgIH0gLy9mb3IgKCBpbnQgaXRlciA9IDA7IGl0ZXIgPCBtaXJhSXRlcjsgKytpdGVyICkgewotCi0gICAgICAvL25vbi1vcHRpbWl6YWJsZSB3ZWlnaHRzIHNob3VsZCByZW1haW4gdW5jaGFuZ2VkCi0gICAgICBBcnJheUxpc3Q8RG91YmxlPiBjcEZpeFd0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7Ci0gICAgICBmb3IgKCBpbnQgaSA9IDE7IGkgPCBpc09wdGltaXphYmxlLmxlbmd0aDsgKytpICkgewotCSAgaWYgKCAhIGlzT3B0aW1pemFibGVbaV0gKQotCSAgICAgIGNwRml4V3QuYWRkKGZpbmFsTGFtYmRhW2ldKTsKKyAgICAgIGRvdWJsZSBpbml0TWV0cmljU2NvcmU7CisgICAgICBpZihpdGVyID09IDAgKSB7CisJICBpbml0TWV0cmljU2NvcmUgPSBjb21wdXRlQ29ycHVzTWV0cmljU2NvcmUoaW5pdGlhbExhbWJkYSk7CisJICBpZihuZWVkQXZnKQorCSAgICAgIGZpbmFsTWV0cmljU2NvcmUgPSBjb21wdXRlQ29ycHVzTWV0cmljU2NvcmUoYXZnTGFtYmRhKTsKKwkgIGVsc2UKKwkgICAgICBmaW5hbE1ldHJpY1Njb3JlID0gY29tcHV0ZUNvcnB1c01ldHJpY1Njb3JlKGZpbmFsTGFtYmRhKTsKKyAgICAgIH0gZWxzZSB7CisJICBpbml0TWV0cmljU2NvcmUgPSBmaW5hbE1ldHJpY1Njb3JlOworCSAgaWYobmVlZEF2ZykKKwkgICAgICBmaW5hbE1ldHJpY1Njb3JlID0gY29tcHV0ZUNvcnB1c01ldHJpY1Njb3JlKGF2Z0xhbWJkYSk7CisJICBlbHNlCisJICAgICAgZmluYWxNZXRyaWNTY29yZSA9IGNvbXB1dGVDb3JwdXNNZXRyaWNTY29yZShmaW5hbExhbWJkYSk7CiAgICAgICB9Ci0gICAgICBub3JtYWxpemVMYW1iZGEoZmluYWxMYW1iZGEpOwotICAgICAgaW50IGNvdW50Tm9uT3B0ID0gMDsKLSAgICAgIGZvciAoIGludCBpID0gMTsgaSA8IGlzT3B0aW1pemFibGUubGVuZ3RoOyArK2kgKSB7Ci0JICBpZiAoICEgaXNPcHRpbWl6YWJsZVtpXSApIHsKLQkgICAgICBmaW5hbExhbWJkYVtpXSA9IGNwRml4V3QuZ2V0KGNvdW50Tm9uT3B0KTsKLQkgICAgICArK2NvdW50Tm9uT3B0OworCisgICAgICBpZihldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSkgeworCSAgaWYoIGZpbmFsTWV0cmljU2NvcmUgPCBiZXN0TWV0cmljU2NvcmUgKSB7CisJICAgICAgYmVzdE1ldHJpY1Njb3JlID0gZmluYWxNZXRyaWNTY29yZTsKKwkgICAgICBiZXN0SXRlciA9IGl0ZXI7CisJICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBmaW5hbExhbWJkYS5sZW5ndGg7ICsraSApCisJCSAgYmVzdExhbWJkYVtpXSA9IG5lZWRBdmcgPyBhdmdMYW1iZGFbaV0gOiBmaW5hbExhbWJkYVtpXTsKKwkgIH0KKyAgICAgIH0gZWxzZSB7CisJICBpZiggZmluYWxNZXRyaWNTY29yZSA+IGJlc3RNZXRyaWNTY29yZSApIHsKKwkgICAgICBiZXN0TWV0cmljU2NvcmUgPSBmaW5hbE1ldHJpY1Njb3JlOworCSAgICAgIGJlc3RJdGVyID0gaXRlcjsKKwkgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGZpbmFsTGFtYmRhLmxlbmd0aDsgKytpICkKKwkJICBiZXN0TGFtYmRhW2ldID0gbmVlZEF2ZyA/IGF2Z0xhbWJkYVtpXSA6IGZpbmFsTGFtYmRhW2ldOwogCSAgfQogICAgICAgfQotICAgICAgcmV0dXJuIGZpbmFsTGFtYmRhOworCisgICAgICBpZiAoIGl0ZXIgPT0gbWlyYUl0ZXIgLSAxICkgeworCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5hbExhbWJkYS5sZW5ndGg7ICsraSkKKwkgICAgICBmaW5hbExhbWJkYVtpXSA9CisJCSAgbmVlZEF2ZyA/IGJlc3RMYW1iZGFbaV0gLyAoIG51bUJhdGNoICogKCBiZXN0SXRlciArIDEgKSApIDogYmVzdExhbWJkYVtpXTsKKyAgICAgIH0KKworICAgICAgLy8gcHJlcGFyZSB0aGUgcHJpbnRpbmcgaW5mbworICAgICAgU3RyaW5nIHJlc3VsdCA9ICJJdGVyICIgKyBpdGVyICsgIjogQXZnIGxlYXJuaW5nIHJhdGU9IiArIFN0cmluZy5mb3JtYXQoIiUuNGYiLCBhdmdFdGEpOworICAgICAgcmVzdWx0ICs9ICIgSW5pdGlhbCAiICsgZXZhbE1ldHJpYy5nZXRfbWV0cmljTmFtZSgpICsgIj0iCisJICArIFN0cmluZy5mb3JtYXQoIiUuNGYiLCBpbml0TWV0cmljU2NvcmUpICsgIiBGaW5hbCAiICsgZXZhbE1ldHJpYy5nZXRfbWV0cmljTmFtZSgpICsgIj0iCisJICArIFN0cmluZy5mb3JtYXQoIiUuNGYiLCBmaW5hbE1ldHJpY1Njb3JlKTsKKyAgICAgIG91dHB1dC5hZGQocmVzdWx0KTsKKyAgICB9IC8vIGZvciAoIGludCBpdGVyID0gMDsgaXRlciA8IG1pcmFJdGVyOyArK2l0ZXIgKQorICAgIFN0cmluZyByZXN1bHQgPSAiQmVzdCAiICsgZXZhbE1ldHJpYy5nZXRfbWV0cmljTmFtZSgpICsgIj0iCisJKyBTdHJpbmcuZm9ybWF0KCIlLjRmIiwgYmVzdE1ldHJpY1Njb3JlKQorCSsgIiAoaXRlciA9ICIgKyBiZXN0SXRlciArICIpXG4iOworICAgIG91dHB1dC5hZGQocmVzdWx0KTsKKyAgICBmaW5hbE1ldHJpY1Njb3JlID0gYmVzdE1ldHJpY1Njb3JlOworCisgICAgLy8gbm9uLW9wdGltaXphYmxlIHdlaWdodHMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQKKyAgICBBcnJheUxpc3Q8RG91YmxlPiBjcEZpeFd0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBpc09wdGltaXphYmxlLmxlbmd0aDsgKytpKSB7CisJaWYgKCFpc09wdGltaXphYmxlW2ldKQorCSAgICBjcEZpeFd0LmFkZChmaW5hbExhbWJkYVtpXSk7CisgICAgfQorICAgIG5vcm1hbGl6ZUxhbWJkYShmaW5hbExhbWJkYSk7CisgICAgaW50IGNvdW50Tm9uT3B0ID0gMDsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGlzT3B0aW1pemFibGUubGVuZ3RoOyArK2kpIHsKKwlpZiAoIWlzT3B0aW1pemFibGVbaV0pIHsKKwkgICAgZmluYWxMYW1iZGFbaV0gPSBjcEZpeFd0LmdldChjb3VudE5vbk9wdCk7CisJICAgICsrY291bnROb25PcHQ7CisJfQorICAgIH0KKyAgICByZXR1cm4gZmluYWxMYW1iZGE7CiAgIH0KIAogICBwdWJsaWMgZG91YmxlIGNvbXB1dGVDb3JwdXNNZXRyaWNTY29yZShkb3VibGVbXSBmaW5hbExhbWJkYSkgewotICAgIGludCBzdWZmU3RhdHNDb3VudCA9IGV2YWxNZXRyaWMuZ2V0X3N1ZmZTdGF0c0NvdW50KCk7Ci0gICAgZG91YmxlIG1vZGVsU2NvcmU7Ci0gICAgZG91YmxlIG1heE1vZGVsU2NvcmU7Ci0gICAgU2V0PFN0cmluZz4gY2FuZFNldDsKLSAgICBTdHJpbmcgY2FuZFN0cjsKLSAgICBTdHJpbmdbXSBmZWF0X3N0cjsKLSAgICBTdHJpbmdbXSB0bXBTdGF0c1ZhbCA9IG5ldyBTdHJpbmdbc3VmZlN0YXRzQ291bnRdOwotICAgIGludFtdIGNvcnB1c1N0YXRzVmFsID0gbmV3IGludFtzdWZmU3RhdHNDb3VudF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmU3RhdHNDb3VudDsgaSsrKQotICAgICAgY29ycHVzU3RhdHNWYWxbaV0gPSAwOworICAgICAgaW50IHN1ZmZTdGF0c0NvdW50ID0gZXZhbE1ldHJpYy5nZXRfc3VmZlN0YXRzQ291bnQoKTsKKyAgICAgIGRvdWJsZSBtb2RlbFNjb3JlOworICAgICAgZG91YmxlIG1heE1vZGVsU2NvcmU7CisgICAgICBTZXQ8U3RyaW5nPiBjYW5kU2V0OworICAgICAgU3RyaW5nIGNhbmRTdHI7CisgICAgICBTdHJpbmdbXSBmZWF0X3N0cjsKKyAgICAgIFN0cmluZ1tdIHRtcFN0YXRzVmFsID0gbmV3IFN0cmluZ1tzdWZmU3RhdHNDb3VudF07CisgICAgICBpbnRbXSBjb3JwdXNTdGF0c1ZhbCA9IG5ldyBpbnRbc3VmZlN0YXRzQ291bnRdOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmU3RhdHNDb3VudDsgaSsrKQorCSAgY29ycHVzU3RhdHNWYWxbaV0gPSAwOwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZW50TnVtOyBpKyspIHsKLSAgICAgIGNhbmRTZXQgPSBmZWF0X2hhc2hbaV0ua2V5U2V0KCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbnROdW07IGkrKykgeworCSAgY2FuZFNldCA9IGZlYXRfaGFzaFtpXS5rZXlTZXQoKTsKKwkgIC8vIGZpbmQgb3V0IHRoZSAxLWJlc3QgY2FuZGlkYXRlIGZvciBlYWNoIHNlbnRlbmNlCisJICAvLyB0aGlzIGRlcGVuZHMgb24gdGhlIHRyYWluaW5nIG1vZGUKKwkgIG1heE1vZGVsU2NvcmUgPSBOZWdJbmY7CisJICBmb3IgKEl0ZXJhdG9yIGl0ID0gY2FuZFNldC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJICAgICAgbW9kZWxTY29yZSA9IDAuMDsKKwkgICAgICBjYW5kU3RyID0gaXQubmV4dCgpLnRvU3RyaW5nKCk7CisJICAgICAgZmVhdF9zdHIgPSBmZWF0X2hhc2hbaV0uZ2V0KGNhbmRTdHIpLnNwbGl0KCJcXHMrIik7CisJICAgICAgU3RyaW5nW10gZmVhdF9pbmZvOworCSAgICAgIGZvciAoaW50IGYgPSAwOyBmIDwgZmVhdF9zdHIubGVuZ3RoOyBmKyspIHsKKwkJICBmZWF0X2luZm8gPSBmZWF0X3N0cltmXS5zcGxpdCgiPSIpOworCQkgIG1vZGVsU2NvcmUgKz0gRG91YmxlLnBhcnNlRG91YmxlKGZlYXRfaW5mb1sxXSkgKiBmaW5hbExhbWJkYVtWb2NhYnVsYXJ5LmlkKGZlYXRfaW5mb1swXSldOworCSAgICAgIH0KKwkgICAgICBpZiAobWF4TW9kZWxTY29yZSA8IG1vZGVsU2NvcmUpIHsKKwkJICBtYXhNb2RlbFNjb3JlID0gbW9kZWxTY29yZTsKKwkJICB0bXBTdGF0c1ZhbCA9IHN0YXRzX2hhc2hbaV0uZ2V0KGNhbmRTdHIpLnNwbGl0KCJcXHMrIik7IC8vIHNhdmUgdGhlCisJCSAgLy8gc3VmZiBzdGF0cworCSAgICAgIH0KKwkgIH0KIAotICAgICAgLy8gZmluZCBvdXQgdGhlIDEtYmVzdCBjYW5kaWRhdGUgZm9yIGVhY2ggc2VudGVuY2UKLSAgICAgIC8vIHRoaXMgZGVwZW5kcyBvbiB0aGUgdHJhaW5pbmcgbW9kZQotICAgICAgbWF4TW9kZWxTY29yZSA9IC05OTk5OTk5OTk5OS4wOworCSAgZm9yIChpbnQgaiA9IDA7IGogPCBzdWZmU3RhdHNDb3VudDsgaisrKQorCSAgICAgIGNvcnB1c1N0YXRzVmFsW2pdICs9IEludGVnZXIucGFyc2VJbnQodG1wU3RhdHNWYWxbal0pOyAvLyBhY2N1bXVsYXRlCisJICAvLyBjb3JwdXMtbGV2ZQorCSAgLy8gc3VmZiBzdGF0cworICAgICAgfSAvLyBmb3IoIGludCBpPTA7IGk8c2VudE51bTsgaSsrICkKKworICAgICAgcmV0dXJuIGV2YWxNZXRyaWMuc2NvcmUoY29ycHVzU3RhdHNWYWwpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGZpbmRPcmFQcmVkKGludCBzZW50SWQsIGRvdWJsZVtdIG9yYVByZWRTY29yZSwgU3RyaW5nW10gb3JhUHJlZEZlYXQsCisJCQkgICBkb3VibGVbXSBsYW1iZGEsIGRvdWJsZSBmZWF0U2NhbGUpIHsKKyAgICAgIGRvdWJsZSBvcmFNZXRyaWMgPSAwLCBvcmFTY29yZSA9IDAsIHByZWRNZXRyaWMgPSAwLCBwcmVkU2NvcmUgPSAwOworICAgICAgU3RyaW5nIG9yYUZlYXQgPSAiIiwgcHJlZEZlYXQgPSAiIjsKKyAgICAgIGRvdWJsZSBjYW5kTWV0cmljID0gMCwgY2FuZFNjb3JlID0gMDsgLy8gbWV0cmljIGFuZCBtb2RlbCBzY29yZXMgZm9yIGVhY2ggY2FuZAorICAgICAgU2V0PFN0cmluZz4gY2FuZFNldCA9IHN0YXRzX2hhc2hbc2VudElkXS5rZXlTZXQoKTsKKyAgICAgIFN0cmluZyBjYW5kID0gIiI7CisgICAgICBTdHJpbmcgZmVhdHMgPSAiIjsKKyAgICAgIFN0cmluZyBvcmFDYW5kID0gIiI7IC8vIG9ubHkgdXNlZCB3aGVuIEJMRVUvVEVSLUJMRVUgaXMgdXNlZCBhcyBtZXRyaWMKKyAgICAgIFN0cmluZ1tdIGZlYXRTdHI7CisgICAgICBTdHJpbmdbXSBmZWF0SW5mbzsKKworICAgICAgaW50IGFjdHVhbEZlYXRJZDsKKyAgICAgIGRvdWJsZSBiZXN0T3JhU2NvcmU7CisgICAgICBkb3VibGUgd29yc3RQcmVkU2NvcmU7CisKKyAgICAgIGlmIChvcmFTZWxlY3RNb2RlID09IDEpCisJICBiZXN0T3JhU2NvcmUgPSBOZWdJbmY7IC8vIGxhcmdlciBzY29yZSB3aWxsIGJlIHNlbGVjdGVkCisgICAgICBlbHNlIHsKKwkgIGlmIChldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSkKKwkgICAgICBiZXN0T3JhU2NvcmUgPSBQb3NJbmY7IC8vIHNtYWxsZXIgc2NvcmUgd2lsbCBiZSBzZWxlY3RlZAorCSAgZWxzZQorCSAgICAgIGJlc3RPcmFTY29yZSA9IE5lZ0luZjsKKyAgICAgIH0KKworICAgICAgaWYgKHByZWRTZWxlY3RNb2RlID09IDEgfHwgcHJlZFNlbGVjdE1vZGUgPT0gMikKKwkgIHdvcnN0UHJlZFNjb3JlID0gTmVnSW5mOyAvLyBsYXJnZXIgc2NvcmUgd2lsbCBiZSBzZWxlY3RlZAorICAgICAgZWxzZSB7CisJICBpZiAoZXZhbE1ldHJpYy5nZXRUb0JlTWluaW1pemVkKCkpCisJICAgICAgd29yc3RQcmVkU2NvcmUgPSBOZWdJbmY7IC8vIGxhcmdlciBzY29yZSB3aWxsIGJlIHNlbGVjdGVkCisJICBlbHNlCisJICAgICAgd29yc3RQcmVkU2NvcmUgPSBQb3NJbmY7CisgICAgICB9CisKICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjYW5kU2V0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgbW9kZWxTY29yZSA9IDAuMDsKLSAgICAgICAgY2FuZFN0ciA9IGl0Lm5leHQoKS50b1N0cmluZygpOworCSAgY2FuZCA9IGl0Lm5leHQoKS50b1N0cmluZygpOworCSAgY2FuZE1ldHJpYyA9IGNvbXB1dGVTZW50TWV0cmljKHNlbnRJZCwgY2FuZCk7IC8vIGNvbXB1dGUgbWV0cmljIHNjb3JlCiAKLSAgICAgICAgZmVhdF9zdHIgPSBmZWF0X2hhc2hbaV0uZ2V0KGNhbmRTdHIpLnNwbGl0KCJcXHMrIik7CisJICAvLyBzdGFydCB0byBjb21wdXRlIG1vZGVsIHNjb3JlCisJICBjYW5kU2NvcmUgPSAwOworCSAgZmVhdFN0ciA9IGZlYXRfaGFzaFtzZW50SWRdLmdldChjYW5kKS5zcGxpdCgiXFxzKyIpOworCSAgZmVhdHMgPSAiIjsKIAotCVN0cmluZ1tdIGZlYXRfaW5mbzsKKwkgIGZvciAoaW50IGkgPSAwOyBpIDwgZmVhdFN0ci5sZW5ndGg7IGkrKykgeworCSAgICAgIGZlYXRJbmZvID0gZmVhdFN0cltpXS5zcGxpdCgiPSIpOworCSAgICAgIGFjdHVhbEZlYXRJZCA9IFZvY2FidWxhcnkuaWQoZmVhdEluZm9bMF0pOworCSAgICAgIGNhbmRTY29yZSArPSBEb3VibGUucGFyc2VEb3VibGUoZmVhdEluZm9bMV0pICogbGFtYmRhW2FjdHVhbEZlYXRJZF07CisJICAgICAgaWYgKChhY3R1YWxGZWF0SWQgPCBpc09wdGltaXphYmxlLmxlbmd0aCAmJiBpc09wdGltaXphYmxlW2FjdHVhbEZlYXRJZF0pCisJCSAgfHwgYWN0dWFsRmVhdElkID49IGlzT3B0aW1pemFibGUubGVuZ3RoKQorCQkgIGZlYXRzICs9IGFjdHVhbEZlYXRJZCArICI9IiArIERvdWJsZS5wYXJzZURvdWJsZShmZWF0SW5mb1sxXSkgKyAiICI7CisJICB9CiAKLQlmb3IgKGludCBmID0gMDsgZiA8IGZlYXRfc3RyLmxlbmd0aDsgZisrKSB7Ci0JICAgIGZlYXRfaW5mbyA9IGZlYXRfc3RyW2ZdLnNwbGl0KCI9Iik7Ci0JICAgIG1vZGVsU2NvcmUgKz0KLQkJRG91YmxlLnBhcnNlRG91YmxlKGZlYXRfaW5mb1sxXSkgKiBmaW5hbExhbWJkYVtWb2NhYnVsYXJ5LmlkKGZlYXRfaW5mb1swXSldOwotCX0KKwkgIGNhbmRTY29yZSAqPSBmZWF0U2NhbGU7IC8vIHNjYWxlIHRoZSBtb2RlbCBzY29yZQogCi0gICAgICAgIGlmIChtYXhNb2RlbFNjb3JlIDwgbW9kZWxTY29yZSkgewotICAgICAgICAgIG1heE1vZGVsU2NvcmUgPSBtb2RlbFNjb3JlOwotICAgICAgICAgIHRtcFN0YXRzVmFsID0gc3RhdHNfaGFzaFtpXS5nZXQoY2FuZFN0cikuc3BsaXQoIlxccysiKTsgLy8gc2F2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1ZmYgc3RhdHMKLSAgICAgICAgfQorCSAgLy8gaXMgdGhpcyBjYW5kIG9yYWNsZT8KKwkgIGlmIChvcmFTZWxlY3RNb2RlID09IDEpIHsvLyAiaG9wZSIsIGI9MSwgcj0xCisJICAgICAgaWYgKGV2YWxNZXRyaWMuZ2V0VG9CZU1pbmltaXplZCgpKSB7Ly8gaWYgdGhlIHNtYWxsZXIgdGhlIG1ldHJpYyBzY29yZSwgdGhlIGJldHRlcgorCQkgIGlmIChiZXN0T3JhU2NvcmUgPD0gKGNhbmRTY29yZSAtIGNhbmRNZXRyaWMpKSB7CisJCSAgICAgIGJlc3RPcmFTY29yZSA9IGNhbmRTY29yZSAtIGNhbmRNZXRyaWM7CisJCSAgICAgIG9yYU1ldHJpYyA9IGNhbmRNZXRyaWM7CisJCSAgICAgIG9yYVNjb3JlID0gY2FuZFNjb3JlOworCQkgICAgICBvcmFGZWF0ID0gZmVhdHM7CisJCSAgICAgIG9yYUNhbmQgPSBjYW5kOworCQkgIH0KKwkgICAgICB9IGVsc2UgeworCQkgIGlmIChiZXN0T3JhU2NvcmUgPD0gKGNhbmRTY29yZSArIGNhbmRNZXRyaWMpKSB7CisJCSAgICAgIGJlc3RPcmFTY29yZSA9IGNhbmRTY29yZSArIGNhbmRNZXRyaWM7CisJCSAgICAgIG9yYU1ldHJpYyA9IGNhbmRNZXRyaWM7CisJCSAgICAgIG9yYVNjb3JlID0gY2FuZFNjb3JlOworCQkgICAgICBvcmFGZWF0ID0gZmVhdHM7CisJCSAgICAgIG9yYUNhbmQgPSBjYW5kOworCQkgIH0KKwkgICAgICB9CisJICB9IGVsc2Ugey8vIGJlc3QgbWV0cmljIHNjb3JlKGV4OiBtYXggQkxFVSksIGI9MSwgcj0wCisJICAgICAgaWYgKGV2YWxNZXRyaWMuZ2V0VG9CZU1pbmltaXplZCgpKSB7Ly8gaWYgdGhlIHNtYWxsZXIgdGhlIG1ldHJpYyBzY29yZSwgdGhlIGJldHRlcgorCQkgIGlmIChiZXN0T3JhU2NvcmUgPj0gY2FuZE1ldHJpYykgeworCQkgICAgICBiZXN0T3JhU2NvcmUgPSBjYW5kTWV0cmljOworCQkgICAgICBvcmFNZXRyaWMgPSBjYW5kTWV0cmljOworCQkgICAgICBvcmFTY29yZSA9IGNhbmRTY29yZTsKKwkJICAgICAgb3JhRmVhdCA9IGZlYXRzOworCQkgICAgICBvcmFDYW5kID0gY2FuZDsKKwkJICB9CisJICAgICAgfSBlbHNlIHsKKwkJICBpZiAoYmVzdE9yYVNjb3JlIDw9IGNhbmRNZXRyaWMpIHsKKwkJICAgICAgYmVzdE9yYVNjb3JlID0gY2FuZE1ldHJpYzsKKwkJICAgICAgb3JhTWV0cmljID0gY2FuZE1ldHJpYzsKKwkJICAgICAgb3JhU2NvcmUgPSBjYW5kU2NvcmU7CisJCSAgICAgIG9yYUZlYXQgPSBmZWF0czsKKwkJICAgICAgb3JhQ2FuZCA9IGNhbmQ7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKworCSAgLy8gaXMgdGhpcyBjYW5kIHByZWRpY3Rpb24/CisJICBpZiAocHJlZFNlbGVjdE1vZGUgPT0gMSkgey8vICJmZWFyIgorCSAgICAgIGlmIChldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSkgey8vIGlmIHRoZSBzbWFsbGVyIHRoZSBtZXRyaWMgc2NvcmUsIHRoZSBiZXR0ZXIKKwkJICBpZiAod29yc3RQcmVkU2NvcmUgPD0gKGNhbmRTY29yZSArIGNhbmRNZXRyaWMpKSB7CisJCSAgICAgIHdvcnN0UHJlZFNjb3JlID0gY2FuZFNjb3JlICsgY2FuZE1ldHJpYzsKKwkJICAgICAgcHJlZE1ldHJpYyA9IGNhbmRNZXRyaWM7CisJCSAgICAgIHByZWRTY29yZSA9IGNhbmRTY29yZTsKKwkJICAgICAgcHJlZEZlYXQgPSBmZWF0czsKKwkJICB9CisJICAgICAgfSBlbHNlIHsKKwkJICBpZiAod29yc3RQcmVkU2NvcmUgPD0gKGNhbmRTY29yZSAtIGNhbmRNZXRyaWMpKSB7CisJCSAgICAgIHdvcnN0UHJlZFNjb3JlID0gY2FuZFNjb3JlIC0gY2FuZE1ldHJpYzsKKwkJICAgICAgcHJlZE1ldHJpYyA9IGNhbmRNZXRyaWM7CisJCSAgICAgIHByZWRTY29yZSA9IGNhbmRTY29yZTsKKwkJICAgICAgcHJlZEZlYXQgPSBmZWF0czsKKwkJICB9CisJICAgICAgfQorCSAgfSBlbHNlIGlmIChwcmVkU2VsZWN0TW9kZSA9PSAyKSB7Ly8gbW9kZWwgcHJlZGljdGlvbihtYXggbW9kZWwgc2NvcmUpCisJICAgICAgaWYgKHdvcnN0UHJlZFNjb3JlIDw9IGNhbmRTY29yZSkgeworCQkgIHdvcnN0UHJlZFNjb3JlID0gY2FuZFNjb3JlOworCQkgIHByZWRNZXRyaWMgPSBjYW5kTWV0cmljOworCQkgIHByZWRTY29yZSA9IGNhbmRTY29yZTsKKwkJICBwcmVkRmVhdCA9IGZlYXRzOworCSAgICAgIH0KKwkgIH0gZWxzZSB7Ly8gd29yc3QgbWV0cmljIHNjb3JlKGV4OiBtaW4gQkxFVSkKKwkgICAgICBpZiAoZXZhbE1ldHJpYy5nZXRUb0JlTWluaW1pemVkKCkpIHsvLyBpZiB0aGUgc21hbGxlciB0aGUgbWV0cmljIHNjb3JlLCB0aGUgYmV0dGVyCisJCSAgaWYgKHdvcnN0UHJlZFNjb3JlIDw9IGNhbmRNZXRyaWMpIHsKKwkJICAgICAgd29yc3RQcmVkU2NvcmUgPSBjYW5kTWV0cmljOworCQkgICAgICBwcmVkTWV0cmljID0gY2FuZE1ldHJpYzsKKwkJICAgICAgcHJlZFNjb3JlID0gY2FuZFNjb3JlOworCQkgICAgICBwcmVkRmVhdCA9IGZlYXRzOworCQkgIH0KKwkgICAgICB9IGVsc2UgeworCQkgIGlmICh3b3JzdFByZWRTY29yZSA+PSBjYW5kTWV0cmljKSB7CisJCSAgICAgIHdvcnN0UHJlZFNjb3JlID0gY2FuZE1ldHJpYzsKKwkJICAgICAgcHJlZE1ldHJpYyA9IGNhbmRNZXRyaWM7CisJCSAgICAgIHByZWRTY29yZSA9IGNhbmRTY29yZTsKKwkJICAgICAgcHJlZEZlYXQgPSBmZWF0czsKKwkJICB9CisJICAgICAgfQorCSAgfQogICAgICAgfQogCi0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN1ZmZTdGF0c0NvdW50OyBqKyspCi0gICAgICAgIGNvcnB1c1N0YXRzVmFsW2pdICs9IEludGVnZXIucGFyc2VJbnQodG1wU3RhdHNWYWxbal0pOyAvLyBhY2N1bXVsYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JwdXMtbGV2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VmZiBzdGF0cwotICAgIH0gLy8gZm9yKCBpbnQgaT0wOyBpPHNlbnROdW07IGkrKyApCisgICAgICBvcmFQcmVkU2NvcmVbMF0gPSBvcmFNZXRyaWM7CisgICAgICBvcmFQcmVkU2NvcmVbMV0gPSBvcmFTY29yZTsKKyAgICAgIG9yYVByZWRTY29yZVsyXSA9IHByZWRNZXRyaWM7CisgICAgICBvcmFQcmVkU2NvcmVbM10gPSBwcmVkU2NvcmU7CisgICAgICBvcmFQcmVkRmVhdFswXSA9IG9yYUZlYXQ7CisgICAgICBvcmFQcmVkRmVhdFsxXSA9IHByZWRGZWF0OwogCi0gICAgcmV0dXJuIGV2YWxNZXRyaWMuc2NvcmUoY29ycHVzU3RhdHNWYWwpOworICAgICAgLy8gdXBkYXRlIHRoZSBCTEVVIG1ldHJpYyBzdGF0aXN0aWNzIGlmIHBzZXVkbyBjb3JwdXMgaXMgdXNlZCB0byBjb21wdXRlIEJMRVUvVEVSLUJMRVUKKyAgICAgIGlmIChldmFsTWV0cmljLmdldF9tZXRyaWNOYW1lKCkuZXF1YWxzKCJCTEVVIikgJiYgdXNlUHNldWRvQmxldSkgeworCSAgU3RyaW5nIHN0YXRTdHJpbmc7CisJICBTdHJpbmdbXSBzdGF0VmFsX3N0cjsKKwkgIHN0YXRTdHJpbmcgPSBzdGF0c19oYXNoW3NlbnRJZF0uZ2V0KG9yYUNhbmQpOworCSAgc3RhdFZhbF9zdHIgPSBzdGF0U3RyaW5nLnNwbGl0KCJcXHMrIik7CisKKwkgIGZvciAoaW50IGogPSAwOyBqIDwgZXZhbE1ldHJpYy5nZXRfc3VmZlN0YXRzQ291bnQoKTsgaisrKQorCSAgICAgIGJsZXVIaXN0b3J5W3NlbnRJZF1bal0gPSBSICogYmxldUhpc3Rvcnlbc2VudElkXVtqXSArIEludGVnZXIucGFyc2VJbnQoc3RhdFZhbF9zdHJbal0pOworICAgICAgfQorCisgICAgICBpZiAoZXZhbE1ldHJpYy5nZXRfbWV0cmljTmFtZSgpLmVxdWFscygiVEVSLUJMRVUiKSAmJiB1c2VQc2V1ZG9CbGV1KSB7CisJICBTdHJpbmcgc3RhdFN0cmluZzsKKwkgIFN0cmluZ1tdIHN0YXRWYWxfc3RyOworCSAgc3RhdFN0cmluZyA9IHN0YXRzX2hhc2hbc2VudElkXS5nZXQob3JhQ2FuZCk7CisJICBzdGF0VmFsX3N0ciA9IHN0YXRTdHJpbmcuc3BsaXQoIlxccysiKTsKKworCSAgZm9yIChpbnQgaiA9IDA7IGogPCBldmFsTWV0cmljLmdldF9zdWZmU3RhdHNDb3VudCgpIC0gMjsgaisrKQorCSAgICAgIGJsZXVIaXN0b3J5W3NlbnRJZF1bal0gPSBSICogYmxldUhpc3Rvcnlbc2VudElkXVtqXSArIEludGVnZXIucGFyc2VJbnQoc3RhdFZhbF9zdHJbaiArIDJdKTsgLy8gdGhlCisJICAvLyBmaXJzdAorCSAgLy8gMgorCSAgLy8gc3RhdHMKKwkgIC8vIGFyZQorCSAgLy8gVEVSCisJICAvLyBzdGF0cworICAgICAgfQogICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZmluZE9yYVByZWQoaW50IHNlbnRJZCwgZG91YmxlW10gb3JhUHJlZFNjb3JlLCBTdHJpbmdbXSBvcmFQcmVkRmVhdCwgZG91YmxlW10gbGFtYmRhLCBkb3VibGUgZmVhdFNjYWxlKQotICB7Ci0gICAgZG91YmxlIG9yYU1ldHJpYz0wLCBvcmFTY29yZT0wLCBwcmVkTWV0cmljPTAsIHByZWRTY29yZT0wOwotICAgIFN0cmluZyBvcmFGZWF0PSIiLCBwcmVkRmVhdD0iIjsKLSAgICBkb3VibGUgY2FuZE1ldHJpYyA9IDAsIGNhbmRTY29yZSA9IDA7IC8vbWV0cmljIGFuZCBtb2RlbCBzY29yZXMgZm9yIGVhY2ggY2FuZAotICAgIFNldDxTdHJpbmc+IGNhbmRTZXQgPSBzdGF0c19oYXNoW3NlbnRJZF0ua2V5U2V0KCk7Ci0gICAgU3RyaW5nIGNhbmQgPSAiIjsKLSAgICBTdHJpbmcgZmVhdHMgPSAiIjsKLSAgICBTdHJpbmcgb3JhQ2FuZCA9ICIiOyAvL29ubHkgdXNlZCB3aGVuIEJMRVUvVEVSLUJMRVUgaXMgdXNlZCBhcyBtZXRyaWMKLSAgICBTdHJpbmdbXSBmZWF0U3RyOwotICAgIFN0cmluZ1tdIGZlYXRJbmZvOwotICAgIAotICAgIGludCBhY3R1YWxGZWF0SWQ7Ci0gICAgZG91YmxlIGJlc3RPcmFTY29yZTsKLSAgICBkb3VibGUgd29yc3RQcmVkU2NvcmU7Ci0gICAgCi0gICAgaWYob3JhU2VsZWN0TW9kZT09MSkKLSAgICAgIGJlc3RPcmFTY29yZSA9IE5lZ0luZjsgLy9sYXJnZXIgc2NvcmUgd2lsbCBiZSBzZWxlY3RlZAotICAgIGVsc2UgewotICAgICAgaWYoZXZhbE1ldHJpYy5nZXRUb0JlTWluaW1pemVkKCkpCi0gICAgICAgIGJlc3RPcmFTY29yZSA9IFBvc0luZjsgLy9zbWFsbGVyIHNjb3JlIHdpbGwgYmUgc2VsZWN0ZWQKLSAgICAgIGVsc2UKLSAgICAgICAgYmVzdE9yYVNjb3JlID0gTmVnSW5mOwotICAgIH0KLSAgICAKLSAgICBpZihwcmVkU2VsZWN0TW9kZT09MSB8fCBwcmVkU2VsZWN0TW9kZT09MikKLSAgICAgIHdvcnN0UHJlZFNjb3JlID0gTmVnSW5mOyAvL2xhcmdlciBzY29yZSB3aWxsIGJlIHNlbGVjdGVkCi0gICAgZWxzZSB7Ci0gICAgICBpZihldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSkKLSAgICAgICAgd29yc3RQcmVkU2NvcmUgPSBOZWdJbmY7IC8vbGFyZ2VyIHNjb3JlIHdpbGwgYmUgc2VsZWN0ZWQKLSAgICAgIGVsc2UKLSAgICAgICAgd29yc3RQcmVkU2NvcmUgPSBQb3NJbmY7Ci0gICAgfQotICAgIAotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjYW5kU2V0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgIGNhbmQgPSBpdC5uZXh0KCkudG9TdHJpbmcoKTsKLSAgICAgIGNhbmRNZXRyaWMgPSBjb21wdXRlU2VudE1ldHJpYyhzZW50SWQsIGNhbmQpOyAvL2NvbXB1dGUgbWV0cmljIHNjb3JlCi0gICAgICAKLSAgICAgIC8vc3RhcnQgdG8gY29tcHV0ZSBtb2RlbCBzY29yZQotICAgICAgY2FuZFNjb3JlID0gMDsKLSAgICAgIGZlYXRTdHIgPSBmZWF0X2hhc2hbc2VudElkXS5nZXQoY2FuZCkuc3BsaXQoIlxccysiKTsKLSAgICAgIGZlYXRzID0gIiI7CiAKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmVhdFN0ci5sZW5ndGg7IGkrKykgewotICAgICAgICAgIGZlYXRJbmZvID0gZmVhdFN0cltpXS5zcGxpdCgiPSIpOwotCSAgYWN0dWFsRmVhdElkID0gVm9jYWJ1bGFyeS5pZChmZWF0SW5mb1swXSk7Ci0JICBjYW5kU2NvcmUgKz0gRG91YmxlLnBhcnNlRG91YmxlKGZlYXRJbmZvWzFdKSAqIGxhbWJkYVthY3R1YWxGZWF0SWRdOwotCSAgaWYgKCAoYWN0dWFsRmVhdElkIDwgaXNPcHRpbWl6YWJsZS5sZW5ndGggJiYgaXNPcHRpbWl6YWJsZVthY3R1YWxGZWF0SWRdKSB8fAotCSAgICAgICBhY3R1YWxGZWF0SWQgPj0gaXNPcHRpbWl6YWJsZS5sZW5ndGggKQotCSAgICAgIGZlYXRzICs9IGFjdHVhbEZlYXRJZCArICI9IiArIERvdWJsZS5wYXJzZURvdWJsZShmZWF0SW5mb1sxXSkgKyAiICI7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhbmRTY29yZSAqPSBmZWF0U2NhbGU7ICAvL3NjYWxlIHRoZSBtb2RlbCBzY29yZQotICAgICAgCi0gICAgICAvL2lzIHRoaXMgY2FuZCBvcmFjbGU/Ci0gICAgICBpZihvcmFTZWxlY3RNb2RlID09IDEpIHsvLyJob3BlIiwgYj0xLCByPTEKLSAgICAgICAgaWYoZXZhbE1ldHJpYy5nZXRUb0JlTWluaW1pemVkKCkpIHsvL2lmIHRoZSBzbWFsbGVyIHRoZSBtZXRyaWMgc2NvcmUsIHRoZSBiZXR0ZXIKLSAgICAgICAgICBpZiggYmVzdE9yYVNjb3JlPD0oY2FuZFNjb3JlLWNhbmRNZXRyaWMpICkgewotICAgICAgICAgICAgYmVzdE9yYVNjb3JlID0gY2FuZFNjb3JlLWNhbmRNZXRyaWM7Ci0gICAgICAgICAgICBvcmFNZXRyaWMgPSBjYW5kTWV0cmljOwotICAgICAgICAgICAgb3JhU2NvcmUgPSBjYW5kU2NvcmU7Ci0gICAgICAgICAgICBvcmFGZWF0ID0gZmVhdHM7Ci0gICAgICAgICAgICBvcmFDYW5kID0gY2FuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYoIGJlc3RPcmFTY29yZTw9KGNhbmRTY29yZStjYW5kTWV0cmljKSApIHsKLSAgICAgICAgICAgIGJlc3RPcmFTY29yZSA9IGNhbmRTY29yZStjYW5kTWV0cmljOwotICAgICAgICAgICAgb3JhTWV0cmljID0gY2FuZE1ldHJpYzsKLSAgICAgICAgICAgIG9yYVNjb3JlID0gY2FuZFNjb3JlOwotICAgICAgICAgICAgb3JhRmVhdCA9IGZlYXRzOwotICAgICAgICAgICAgb3JhQ2FuZCA9IGNhbmQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsvL2Jlc3QgbWV0cmljIHNjb3JlKGV4OiBtYXggQkxFVSksIGI9MSwgcj0wCi0gICAgICAgIGlmKGV2YWxNZXRyaWMuZ2V0VG9CZU1pbmltaXplZCgpKSB7Ly9pZiB0aGUgc21hbGxlciB0aGUgbWV0cmljIHNjb3JlLCB0aGUgYmV0dGVyCi0gICAgICAgICAgaWYoIGJlc3RPcmFTY29yZT49Y2FuZE1ldHJpYyApIHsKLSAgICAgICAgICAgIGJlc3RPcmFTY29yZSA9IGNhbmRNZXRyaWM7Ci0gICAgICAgICAgICBvcmFNZXRyaWMgPSBjYW5kTWV0cmljOwotICAgICAgICAgICAgb3JhU2NvcmUgPSBjYW5kU2NvcmU7Ci0gICAgICAgICAgICBvcmFGZWF0ID0gZmVhdHM7Ci0gICAgICAgICAgICBvcmFDYW5kID0gY2FuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYoIGJlc3RPcmFTY29yZTw9Y2FuZE1ldHJpYyApIHsKLSAgICAgICAgICAgIGJlc3RPcmFTY29yZSA9IGNhbmRNZXRyaWM7Ci0gICAgICAgICAgICBvcmFNZXRyaWMgPSBjYW5kTWV0cmljOwotICAgICAgICAgICAgb3JhU2NvcmUgPSBjYW5kU2NvcmU7Ci0gICAgICAgICAgICBvcmFGZWF0ID0gZmVhdHM7Ci0gICAgICAgICAgICBvcmFDYW5kID0gY2FuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9pcyB0aGlzIGNhbmQgcHJlZGljdGlvbj8KLSAgICAgIGlmKHByZWRTZWxlY3RNb2RlID09IDEpIHsvLyJmZWFyIgotICAgICAgICBpZihldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSkgey8vaWYgdGhlIHNtYWxsZXIgdGhlIG1ldHJpYyBzY29yZSwgdGhlIGJldHRlcgotICAgICAgICAgIGlmKCB3b3JzdFByZWRTY29yZTw9KGNhbmRTY29yZStjYW5kTWV0cmljKSApIHsKLSAgICAgICAgICAgIHdvcnN0UHJlZFNjb3JlID0gY2FuZFNjb3JlK2NhbmRNZXRyaWM7Ci0gICAgICAgICAgICBwcmVkTWV0cmljID0gY2FuZE1ldHJpYzsKLSAgICAgICAgICAgIHByZWRTY29yZSA9IGNhbmRTY29yZTsKLSAgICAgICAgICAgIHByZWRGZWF0ID0gZmVhdHM7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmKCB3b3JzdFByZWRTY29yZTw9KGNhbmRTY29yZS1jYW5kTWV0cmljKSApIHsKLSAgICAgICAgICAgIHdvcnN0UHJlZFNjb3JlID0gY2FuZFNjb3JlLWNhbmRNZXRyaWM7Ci0gICAgICAgICAgICBwcmVkTWV0cmljID0gY2FuZE1ldHJpYzsKLSAgICAgICAgICAgIHByZWRTY29yZSA9IGNhbmRTY29yZTsKLSAgICAgICAgICAgIHByZWRGZWF0ID0gZmVhdHM7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHByZWRTZWxlY3RNb2RlID09IDIpIHsvL21vZGVsIHByZWRpY3Rpb24obWF4IG1vZGVsIHNjb3JlKQotICAgICAgICBpZiggd29yc3RQcmVkU2NvcmU8PWNhbmRTY29yZSApIHsKLSAgICAgICAgICB3b3JzdFByZWRTY29yZSA9IGNhbmRTY29yZTsKLSAgICAgICAgICBwcmVkTWV0cmljID0gY2FuZE1ldHJpYzsgCi0gICAgICAgICAgcHJlZFNjb3JlID0gY2FuZFNjb3JlOwotICAgICAgICAgIHByZWRGZWF0ID0gZmVhdHM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2Ugey8vd29yc3QgbWV0cmljIHNjb3JlKGV4OiBtaW4gQkxFVSkKLSAgICAgICAgaWYoZXZhbE1ldHJpYy5nZXRUb0JlTWluaW1pemVkKCkpIHsvL2lmIHRoZSBzbWFsbGVyIHRoZSBtZXRyaWMgc2NvcmUsIHRoZSBiZXR0ZXIKLSAgICAgICAgICBpZiggd29yc3RQcmVkU2NvcmU8PWNhbmRNZXRyaWMgKSB7Ci0gICAgICAgICAgICB3b3JzdFByZWRTY29yZSA9IGNhbmRNZXRyaWM7Ci0gICAgICAgICAgICBwcmVkTWV0cmljID0gY2FuZE1ldHJpYzsKLSAgICAgICAgICAgIHByZWRTY29yZSA9IGNhbmRTY29yZTsKLSAgICAgICAgICAgIHByZWRGZWF0ID0gZmVhdHM7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmKCB3b3JzdFByZWRTY29yZT49Y2FuZE1ldHJpYyApIHsKLSAgICAgICAgICAgIHdvcnN0UHJlZFNjb3JlID0gY2FuZE1ldHJpYzsKLSAgICAgICAgICAgIHByZWRNZXRyaWMgPSBjYW5kTWV0cmljOwotICAgICAgICAgICAgcHJlZFNjb3JlID0gY2FuZFNjb3JlOwotICAgICAgICAgICAgcHJlZEZlYXQgPSBmZWF0czsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gCi0gICAgfQotICAgIAotICAgIG9yYVByZWRTY29yZVswXSA9IG9yYU1ldHJpYzsKLSAgICBvcmFQcmVkU2NvcmVbMV0gPSBvcmFTY29yZTsKLSAgICBvcmFQcmVkU2NvcmVbMl0gPSBwcmVkTWV0cmljOwotICAgIG9yYVByZWRTY29yZVszXSA9IHByZWRTY29yZTsKLSAgICBvcmFQcmVkRmVhdFswXSA9IG9yYUZlYXQ7Ci0gICAgb3JhUHJlZEZlYXRbMV0gPSBwcmVkRmVhdDsKLSAgICAKLSAgICAvL3VwZGF0ZSB0aGUgQkxFVSBtZXRyaWMgc3RhdGlzdGljcyBpZiBwc2V1ZG8gY29ycHVzIGlzIHVzZWQgdG8gY29tcHV0ZSBCTEVVL1RFUi1CTEVVCi0gICAgaWYoZXZhbE1ldHJpYy5nZXRfbWV0cmljTmFtZSgpLmVxdWFscygiQkxFVSIpICYmIHVzZVBzZXVkb0JsZXUgKSB7Ci0gICAgICBTdHJpbmcgc3RhdFN0cmluZzsKLSAgICAgIFN0cmluZ1tdIHN0YXRWYWxfc3RyOwotICAgICAgc3RhdFN0cmluZyA9IHN0YXRzX2hhc2hbc2VudElkXS5nZXQob3JhQ2FuZCk7Ci0gICAgICBzdGF0VmFsX3N0ciA9IHN0YXRTdHJpbmcuc3BsaXQoIlxccysiKTsKLQotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBldmFsTWV0cmljLmdldF9zdWZmU3RhdHNDb3VudCgpOyBqKyspCi0gICAgICAgIGJsZXVIaXN0b3J5W3NlbnRJZF1bal0gPSBSKmJsZXVIaXN0b3J5W3NlbnRJZF1bal0rSW50ZWdlci5wYXJzZUludChzdGF0VmFsX3N0cltqXSk7Ci0gICAgfQotICAgIAotICAgIGlmKGV2YWxNZXRyaWMuZ2V0X21ldHJpY05hbWUoKS5lcXVhbHMoIlRFUi1CTEVVIikgJiYgdXNlUHNldWRvQmxldSApIHsKLSAgICAgIFN0cmluZyBzdGF0U3RyaW5nOwotICAgICAgU3RyaW5nW10gc3RhdFZhbF9zdHI7Ci0gICAgICBzdGF0U3RyaW5nID0gc3RhdHNfaGFzaFtzZW50SWRdLmdldChvcmFDYW5kKTsKLSAgICAgIHN0YXRWYWxfc3RyID0gc3RhdFN0cmluZy5zcGxpdCgiXFxzKyIpOwotCi0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV2YWxNZXRyaWMuZ2V0X3N1ZmZTdGF0c0NvdW50KCktMjsgaisrKQotICAgICAgICBibGV1SGlzdG9yeVtzZW50SWRdW2pdID0gUipibGV1SGlzdG9yeVtzZW50SWRdW2pdK0ludGVnZXIucGFyc2VJbnQoc3RhdFZhbF9zdHJbaisyXSk7IC8vdGhlIGZpcnN0IDIgc3RhdHMgYXJlIFRFUiBzdGF0cwotICAgIH0KLSAgfQotICAKICAgLy8gY29tcHV0ZSAqc2VudGVuY2UtbGV2ZWwqIG1ldHJpYyBzY29yZSBmb3IgY2FuZAogICBwcml2YXRlIGRvdWJsZSBjb21wdXRlU2VudE1ldHJpYyhpbnQgc2VudElkLCBTdHJpbmcgY2FuZCkgewotICAgIFN0cmluZyBzdGF0U3RyaW5nOwotICAgIFN0cmluZ1tdIHN0YXRWYWxfc3RyOwotICAgIGludFtdIHN0YXRWYWwgPSBuZXcgaW50W2V2YWxNZXRyaWMuZ2V0X3N1ZmZTdGF0c0NvdW50KCldOworICAgICAgU3RyaW5nIHN0YXRTdHJpbmc7CisgICAgICBTdHJpbmdbXSBzdGF0VmFsX3N0cjsKKyAgICAgIGludFtdIHN0YXRWYWwgPSBuZXcgaW50W2V2YWxNZXRyaWMuZ2V0X3N1ZmZTdGF0c0NvdW50KCldOwogCi0gICAgc3RhdFN0cmluZyA9IHN0YXRzX2hhc2hbc2VudElkXS5nZXQoY2FuZCk7Ci0gICAgc3RhdFZhbF9zdHIgPSBzdGF0U3RyaW5nLnNwbGl0KCJcXHMrIik7CisgICAgICBzdGF0U3RyaW5nID0gc3RhdHNfaGFzaFtzZW50SWRdLmdldChjYW5kKTsKKyAgICAgIHN0YXRWYWxfc3RyID0gc3RhdFN0cmluZy5zcGxpdCgiXFxzKyIpOwogCi0gICAgaWYoZXZhbE1ldHJpYy5nZXRfbWV0cmljTmFtZSgpLmVxdWFscygiQkxFVSIpICYmIHVzZVBzZXVkb0JsZXUpIHsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXZhbE1ldHJpYy5nZXRfc3VmZlN0YXRzQ291bnQoKTsgaisrKQotICAgICAgICBzdGF0VmFsW2pdID0gKGludCkgKEludGVnZXIucGFyc2VJbnQoc3RhdFZhbF9zdHJbal0pICsgYmxldUhpc3Rvcnlbc2VudElkXVtqXSk7Ci0gICAgfSBlbHNlIGlmKGV2YWxNZXRyaWMuZ2V0X21ldHJpY05hbWUoKS5lcXVhbHMoIlRFUi1CTEVVIikgJiYgdXNlUHNldWRvQmxldSkgewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBldmFsTWV0cmljLmdldF9zdWZmU3RhdHNDb3VudCgpLTI7IGorKykKLSAgICAgICAgc3RhdFZhbFtqKzJdID0gKGludCkoSW50ZWdlci5wYXJzZUludChzdGF0VmFsX3N0cltqKzJdKSArIGJsZXVIaXN0b3J5W3NlbnRJZF1bal0pOyAvL29ubHkgbW9kaWZ5IHRoZSBCTEVVIHN0YXRzIHBhcnQoVEVSIGhhcyAyIHN0YXRzKQotICAgIH0gZWxzZSB7IC8vaW4gYWxsIG90aGVyIHNpdHVhdGlvbnMsIHVzZSBub3JtYWwgc3RhdHMKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXZhbE1ldHJpYy5nZXRfc3VmZlN0YXRzQ291bnQoKTsgaisrKQotICAgICAgICBzdGF0VmFsW2pdID0gSW50ZWdlci5wYXJzZUludChzdGF0VmFsX3N0cltqXSk7Ci0gICAgfQorICAgICAgaWYgKGV2YWxNZXRyaWMuZ2V0X21ldHJpY05hbWUoKS5lcXVhbHMoIkJMRVUiKSAmJiB1c2VQc2V1ZG9CbGV1KSB7CisJICBmb3IgKGludCBqID0gMDsgaiA8IGV2YWxNZXRyaWMuZ2V0X3N1ZmZTdGF0c0NvdW50KCk7IGorKykKKwkgICAgICBzdGF0VmFsW2pdID0gKGludCkgKEludGVnZXIucGFyc2VJbnQoc3RhdFZhbF9zdHJbal0pICsgYmxldUhpc3Rvcnlbc2VudElkXVtqXSk7CisgICAgICB9IGVsc2UgaWYgKGV2YWxNZXRyaWMuZ2V0X21ldHJpY05hbWUoKS5lcXVhbHMoIlRFUi1CTEVVIikgJiYgdXNlUHNldWRvQmxldSkgeworCSAgZm9yIChpbnQgaiA9IDA7IGogPCBldmFsTWV0cmljLmdldF9zdWZmU3RhdHNDb3VudCgpIC0gMjsgaisrKQorCSAgICAgIHN0YXRWYWxbaiArIDJdID0gKGludCkgKEludGVnZXIucGFyc2VJbnQoc3RhdFZhbF9zdHJbaiArIDJdKSArIGJsZXVIaXN0b3J5W3NlbnRJZF1bal0pOyAvLyBvbmx5CisJICAvLyBtb2RpZnkKKwkgIC8vIHRoZQorCSAgLy8gQkxFVQorCSAgLy8gc3RhdHMKKwkgIC8vIHBhcnQoVEVSCisJICAvLyBoYXMKKwkgIC8vIDIKKwkgIC8vIHN0YXRzKQorICAgICAgfSBlbHNlIHsgLy8gaW4gYWxsIG90aGVyIHNpdHVhdGlvbnMsIHVzZSBub3JtYWwgc3RhdHMKKwkgIGZvciAoaW50IGogPSAwOyBqIDwgZXZhbE1ldHJpYy5nZXRfc3VmZlN0YXRzQ291bnQoKTsgaisrKQorCSAgICAgIHN0YXRWYWxbal0gPSBJbnRlZ2VyLnBhcnNlSW50KHN0YXRWYWxfc3RyW2pdKTsKKyAgICAgIH0KIAotICAgIHJldHVybiBldmFsTWV0cmljLnNjb3JlKHN0YXRWYWwpOworICAgICAgcmV0dXJuIGV2YWxNZXRyaWMuc2NvcmUoc3RhdFZhbCk7CiAgIH0KIAogICAvLyBmcm9tIFpNRVJUCiAgIHByaXZhdGUgdm9pZCBub3JtYWxpemVMYW1iZGEoZG91YmxlW10gb3JpZ0xhbWJkYSkgewotICAgIC8vIHByaXZhdGUgU3RyaW5nW10gbm9ybWFsaXphdGlvbk9wdGlvbnM7Ci0gICAgLy8gSG93IHNob3VsZCBhIGxhbWJkYVtdIHZlY3RvciBiZSBub3JtYWxpemVkIChiZWZvcmUgZGVjb2RpbmcpPwotICAgIC8vIG5PWzBdID0gMDogbm8gbm9ybWFsaXphdGlvbgotICAgIC8vIG5PWzBdID0gMTogc2NhbGUgc28gdGhhdCBwYXJhbWV0ZXIgbk9bMl0gaGFzIGFic29sdXRlIHZhbHVlIG5PWzFdCi0gICAgLy8gbk9bMF0gPSAyOiBzY2FsZSBzbyB0aGF0IHRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIGlzIG5PWzFdCi0gICAgLy8gbk9bMF0gPSAzOiBzY2FsZSBzbyB0aGF0IHRoZSBtaW5pbXVtIGFic29sdXRlIHZhbHVlIGlzIG5PWzFdCi0gICAgLy8gbk9bMF0gPSA0OiBzY2FsZSBzbyB0aGF0IHRoZSBMLW5PWzFdIG5vcm0gZXF1YWxzIG5PWzJdCisgICAgICAvLyBwcml2YXRlIFN0cmluZ1tdIG5vcm1hbGl6YXRpb25PcHRpb25zOworICAgICAgLy8gSG93IHNob3VsZCBhIGxhbWJkYVtdIHZlY3RvciBiZSBub3JtYWxpemVkIChiZWZvcmUgZGVjb2RpbmcpPworICAgICAgLy8gbk9bMF0gPSAwOiBubyBub3JtYWxpemF0aW9uCisgICAgICAvLyBuT1swXSA9IDE6IHNjYWxlIHNvIHRoYXQgcGFyYW1ldGVyIG5PWzJdIGhhcyBhYnNvbHV0ZSB2YWx1ZSBuT1sxXQorICAgICAgLy8gbk9bMF0gPSAyOiBzY2FsZSBzbyB0aGF0IHRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIGlzIG5PWzFdCisgICAgICAvLyBuT1swXSA9IDM6IHNjYWxlIHNvIHRoYXQgdGhlIG1pbmltdW0gYWJzb2x1dGUgdmFsdWUgaXMgbk9bMV0KKyAgICAgIC8vIG5PWzBdID0gNDogc2NhbGUgc28gdGhhdCB0aGUgTC1uT1sxXSBub3JtIGVxdWFscyBuT1syXQogCi0gICAgaW50IG5vcm1hbGl6YXRpb25NZXRob2QgPSAoaW50KSBub3JtYWxpemF0aW9uT3B0aW9uc1swXTsKLSAgICBkb3VibGUgc2NhbGluZ0ZhY3RvciA9IDEuMDsKLSAgICBpZiAobm9ybWFsaXphdGlvbk1ldGhvZCA9PSAwKSB7Ci0gICAgICBzY2FsaW5nRmFjdG9yID0gMS4wOwotICAgIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvbk1ldGhvZCA9PSAxKSB7Ci0gICAgICBpbnQgYyA9IChpbnQpIG5vcm1hbGl6YXRpb25PcHRpb25zWzJdOwotICAgICAgc2NhbGluZ0ZhY3RvciA9IG5vcm1hbGl6YXRpb25PcHRpb25zWzFdIC8gTWF0aC5hYnMob3JpZ0xhbWJkYVtjXSk7Ci0gICAgfSBlbHNlIGlmIChub3JtYWxpemF0aW9uTWV0aG9kID09IDIpIHsKLSAgICAgIGRvdWJsZSBtYXhBYnNWYWwgPSAtMTsKLSAgICAgIGludCBtYXhBYnNWYWxfYyA9IDA7Ci0gICAgICBmb3IgKGludCBjID0gMTsgYyA8PSBwYXJhbURpbTsgKytjKSB7Ci0gICAgICAgIGlmIChNYXRoLmFicyhvcmlnTGFtYmRhW2NdKSA+IG1heEFic1ZhbCkgewotICAgICAgICAgIG1heEFic1ZhbCA9IE1hdGguYWJzKG9yaWdMYW1iZGFbY10pOwotICAgICAgICAgIG1heEFic1ZhbF9jID0gYzsKLSAgICAgICAgfQorICAgICAgaW50IG5vcm1hbGl6YXRpb25NZXRob2QgPSAoaW50KSBub3JtYWxpemF0aW9uT3B0aW9uc1swXTsKKyAgICAgIGRvdWJsZSBzY2FsaW5nRmFjdG9yID0gMS4wOworICAgICAgaWYgKG5vcm1hbGl6YXRpb25NZXRob2QgPT0gMCkgeworCSAgc2NhbGluZ0ZhY3RvciA9IDEuMDsKKyAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvbk1ldGhvZCA9PSAxKSB7CisJICBpbnQgYyA9IChpbnQpIG5vcm1hbGl6YXRpb25PcHRpb25zWzJdOworCSAgc2NhbGluZ0ZhY3RvciA9IG5vcm1hbGl6YXRpb25PcHRpb25zWzFdIC8gTWF0aC5hYnMob3JpZ0xhbWJkYVtjXSk7CisgICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6YXRpb25NZXRob2QgPT0gMikgeworCSAgZG91YmxlIG1heEFic1ZhbCA9IC0xOworCSAgaW50IG1heEFic1ZhbF9jID0gMDsKKwkgIGZvciAoaW50IGMgPSAxOyBjIDw9IHBhcmFtRGltOyArK2MpIHsKKwkgICAgICBpZiAoTWF0aC5hYnMob3JpZ0xhbWJkYVtjXSkgPiBtYXhBYnNWYWwpIHsKKwkJICBtYXhBYnNWYWwgPSBNYXRoLmFicyhvcmlnTGFtYmRhW2NdKTsKKwkJICBtYXhBYnNWYWxfYyA9IGM7CisJICAgICAgfQorCSAgfQorCSAgc2NhbGluZ0ZhY3RvciA9IG5vcm1hbGl6YXRpb25PcHRpb25zWzFdIC8gTWF0aC5hYnMob3JpZ0xhbWJkYVttYXhBYnNWYWxfY10pOworCisgICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6YXRpb25NZXRob2QgPT0gMykgeworCSAgZG91YmxlIG1pbkFic1ZhbCA9IFBvc0luZjsKKwkgIGludCBtaW5BYnNWYWxfYyA9IDA7CisKKwkgIGZvciAoaW50IGMgPSAxOyBjIDw9IHBhcmFtRGltOyArK2MpIHsKKwkgICAgICBpZiAoTWF0aC5hYnMob3JpZ0xhbWJkYVtjXSkgPCBtaW5BYnNWYWwpIHsKKwkJICBtaW5BYnNWYWwgPSBNYXRoLmFicyhvcmlnTGFtYmRhW2NdKTsKKwkJICBtaW5BYnNWYWxfYyA9IGM7CisJICAgICAgfQorCSAgfQorCSAgc2NhbGluZ0ZhY3RvciA9IG5vcm1hbGl6YXRpb25PcHRpb25zWzFdIC8gTWF0aC5hYnMob3JpZ0xhbWJkYVttaW5BYnNWYWxfY10pOworCisgICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6YXRpb25NZXRob2QgPT0gNCkgeworCSAgZG91YmxlIHBvdyA9IG5vcm1hbGl6YXRpb25PcHRpb25zWzFdOworCSAgZG91YmxlIG5vcm0gPSBMX25vcm0ob3JpZ0xhbWJkYSwgcG93KTsKKwkgIHNjYWxpbmdGYWN0b3IgPSBub3JtYWxpemF0aW9uT3B0aW9uc1syXSAvIG5vcm07CiAgICAgICB9Ci0gICAgICBzY2FsaW5nRmFjdG9yID0gbm9ybWFsaXphdGlvbk9wdGlvbnNbMV0gLyBNYXRoLmFicyhvcmlnTGFtYmRhW21heEFic1ZhbF9jXSk7Ci0KLSAgICB9IGVsc2UgaWYgKG5vcm1hbGl6YXRpb25NZXRob2QgPT0gMykgewotICAgICAgZG91YmxlIG1pbkFic1ZhbCA9IFBvc0luZjsKLSAgICAgIGludCBtaW5BYnNWYWxfYyA9IDA7CiAKICAgICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IHBhcmFtRGltOyArK2MpIHsKLSAgICAgICAgaWYgKE1hdGguYWJzKG9yaWdMYW1iZGFbY10pIDwgbWluQWJzVmFsKSB7Ci0gICAgICAgICAgbWluQWJzVmFsID0gTWF0aC5hYnMob3JpZ0xhbWJkYVtjXSk7Ci0gICAgICAgICAgbWluQWJzVmFsX2MgPSBjOwotICAgICAgICB9CisJICBvcmlnTGFtYmRhW2NdICo9IHNjYWxpbmdGYWN0b3I7CiAgICAgICB9Ci0gICAgICBzY2FsaW5nRmFjdG9yID0gbm9ybWFsaXphdGlvbk9wdGlvbnNbMV0gLyBNYXRoLmFicyhvcmlnTGFtYmRhW21pbkFic1ZhbF9jXSk7Ci0KLSAgICB9IGVsc2UgaWYgKG5vcm1hbGl6YXRpb25NZXRob2QgPT0gNCkgewotICAgICAgZG91YmxlIHBvdyA9IG5vcm1hbGl6YXRpb25PcHRpb25zWzFdOwotICAgICAgZG91YmxlIG5vcm0gPSBMX25vcm0ob3JpZ0xhbWJkYSwgcG93KTsKLSAgICAgIHNjYWxpbmdGYWN0b3IgPSBub3JtYWxpemF0aW9uT3B0aW9uc1syXSAvIG5vcm07Ci0gICAgfQotCi0gICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gcGFyYW1EaW07ICsrYykgewotICAgICAgb3JpZ0xhbWJkYVtjXSAqPSBzY2FsaW5nRmFjdG9yOwotICAgIH0KICAgfQogCiAgIC8vIGZyb20gWk1FUlQKICAgcHJpdmF0ZSBkb3VibGUgTF9ub3JtKGRvdWJsZVtdIEEsIGRvdWJsZSBwb3cpIHsKLSAgICAvLyBjYWxjdWxhdGVzIHRoZSBMLXBvdyBub3JtIG9mIEFbXQotICAgIC8vIE5PVEU6IHRoaXMgY2FsY3VsYXRpb24gaWdub3JlcyBBWzBdCi0gICAgZG91YmxlIHN1bSA9IDAuMDsKLSAgICBmb3IgKGludCBpID0gMTsgaSA8IEEubGVuZ3RoOyArK2kpCi0gICAgICBzdW0gKz0gTWF0aC5wb3coTWF0aC5hYnMoQVtpXSksIHBvdyk7CisgICAgICAvLyBjYWxjdWxhdGVzIHRoZSBMLXBvdyBub3JtIG9mIEFbXQorICAgICAgLy8gTk9URTogdGhpcyBjYWxjdWxhdGlvbiBpZ25vcmVzIEFbMF0KKyAgICAgIGRvdWJsZSBzdW0gPSAwLjA7CisgICAgICBmb3IgKGludCBpID0gMTsgaSA8IEEubGVuZ3RoOyArK2kpCisJICBzdW0gKz0gTWF0aC5wb3coTWF0aC5hYnMoQVtpXSksIHBvdyk7CiAKLSAgICByZXR1cm4gTWF0aC5wb3coc3VtLCAxIC8gcG93KTsKKyAgICAgIHJldHVybiBNYXRoLnBvdyhzdW0sIDEgLyBwb3cpOwogICB9CiAKLSAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0U2NhbGUoKQotICB7Ci0gICAgcmV0dXJuIGZlYXRTY2FsZTsKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0U2NhbGUoKSB7CisgICAgICByZXR1cm4gZmVhdFNjYWxlOwogICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEJsZXVIaXN0b3J5KGludCBzZW50TnVtLCBpbnQgc3RhdENvdW50KQotICB7Ci0gICAgYmxldUhpc3RvcnkgPSBuZXcgZG91YmxlW3NlbnROdW1dW3N0YXRDb3VudF07Ci0gICAgZm9yKGludCBpPTA7IGk8c2VudE51bTsgaSsrKSB7Ci0gICAgICBmb3IoaW50IGo9MDsgajxzdGF0Q291bnQ7IGorKykgewotICAgICAgICBibGV1SGlzdG9yeVtpXVtqXSA9IDAuMDsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEJsZXVIaXN0b3J5KGludCBzZW50TnVtLCBpbnQgc3RhdENvdW50KSB7CisgICAgICBibGV1SGlzdG9yeSA9IG5ldyBkb3VibGVbc2VudE51bV1bc3RhdENvdW50XTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VudE51bTsgaSsrKSB7CisJICBmb3IgKGludCBqID0gMDsgaiA8IHN0YXRDb3VudDsgaisrKSB7CisJICAgICAgYmxldUhpc3RvcnlbaV1bal0gPSAwLjA7CisJICB9CiAgICAgICB9Ci0gICAgfQogICB9Ci0KLSAgcHVibGljIGRvdWJsZSBnZXRNZXRyaWNTY29yZSgpCi0gIHsKKyAgICAKKyAgcHVibGljIGRvdWJsZSBnZXRNZXRyaWNTY29yZSgpIHsKICAgICAgIHJldHVybiBmaW5hbE1ldHJpY1Njb3JlOwogICB9Ci0gIAorICAgIAogICBwcml2YXRlIFZlY3RvcjxTdHJpbmc+IG91dHB1dDsKICAgcHJpdmF0ZSBkb3VibGVbXSBpbml0aWFsTGFtYmRhOwogICBwcml2YXRlIGRvdWJsZVtdIGZpbmFsTGFtYmRhOwpAQCAtNjAxLDIzICs2MDEsMjUgQEAKICAgcHJpdmF0ZSBpbnQgcGFyYW1EaW07CiAgIHByaXZhdGUgYm9vbGVhbltdIGlzT3B0aW1pemFibGU7CiAgIHB1YmxpYyBzdGF0aWMgaW50IHNlbnROdW07Ci0gIHB1YmxpYyBzdGF0aWMgaW50IG1pcmFJdGVyOyAvL01JUkEgaW50ZXJuYWwgaXRlcmF0aW9ucworICBwdWJsaWMgc3RhdGljIGludCBtaXJhSXRlcjsgLy8gTUlSQSBpbnRlcm5hbCBpdGVyYXRpb25zCiAgIHB1YmxpYyBzdGF0aWMgaW50IG9yYVNlbGVjdE1vZGU7CiAgIHB1YmxpYyBzdGF0aWMgaW50IHByZWRTZWxlY3RNb2RlOworICBwdWJsaWMgc3RhdGljIGludCBiYXRjaFNpemU7CiAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZWVkU2h1ZmZsZTsKICAgcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRTY2FsZTsKICAgcHVibGljIHN0YXRpYyBkb3VibGUgc2NvcmVSYXRpbzsKICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJ1blBlcmNlcDsKICAgcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRBdmc7CiAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VQc2V1ZG9CbGV1OwotICBwdWJsaWMgc3RhdGljIGRvdWJsZSBmZWF0U2NhbGUgPSAxLjA7IC8vc2NhbGUgdGhlIGZlYXR1cmVzIGluIG9yZGVyIHRvIG1ha2UgdGhlIG1vZGVsIHNjb3JlIGNvbXBhcmFibGUgd2l0aCBtZXRyaWMgc2NvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGVzIGluIGVhY2ggZXBvY2ggaWYgbmVjZXNzYXJ5Ci0gIHB1YmxpYyBzdGF0aWMgZG91YmxlIEM7IC8vcmVsYXhhdGlvbiBjb2VmZmljaWVudAotICBwdWJsaWMgc3RhdGljIGRvdWJsZSBSOyAvL2NvcnB1cyBkZWNheSh1c2VkIG9ubHkgd2hlbiBwc2V1ZG8gY29ycHVzIGlzIHVzZWQgdG8gY29tcHV0ZSBCTEVVKSAKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgZmVhdFNjYWxlID0gMS4wOyAvLyBzY2FsZSB0aGUgZmVhdHVyZXMgaW4gb3JkZXIgdG8gbWFrZSB0aGUgbW9kZWwgc2NvcmUKKyAgLy8gY29tcGFyYWJsZSB3aXRoIG1ldHJpYyBzY29yZQorICAvLyB1cGRhdGVzIGluIGVhY2ggZXBvY2ggaWYgbmVjZXNzYXJ5CisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEM7IC8vIHJlbGF4YXRpb24gY29lZmZpY2llbnQKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgUjsgLy8gY29ycHVzIGRlY2F5KHVzZWQgb25seSB3aGVuIHBzZXVkbyBjb3JwdXMgaXMgdXNlZCB0byBjb21wdXRlIEJMRVUpCiAgIHB1YmxpYyBzdGF0aWMgRXZhbHVhdGlvbk1ldHJpYyBldmFsTWV0cmljOwogICBwdWJsaWMgc3RhdGljIGRvdWJsZVtdIG5vcm1hbGl6YXRpb25PcHRpb25zOwogICBwdWJsaWMgc3RhdGljIGRvdWJsZVtdW10gYmxldUhpc3Rvcnk7Ci0gIAorCiAgIHByaXZhdGUgZmluYWwgc3RhdGljIGRvdWJsZSBOZWdJbmYgPSAoLTEuMCAvIDAuMCk7CiAgIHByaXZhdGUgZmluYWwgc3RhdGljIGRvdWJsZSBQb3NJbmYgPSAoKzEuMCAvIDAuMCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL3Byby9DbGFzc2lmaWVyUGVyY2VwdHJvbi5qYXZhIGIvc3JjL2pvc2h1YS9wcm8vQ2xhc3NpZmllclBlcmNlcHRyb24uamF2YQppbmRleCBkZjIyMWQ1Li43ZjA2NDU2IDEwMDc1NQotLS0gYS9zcmMvam9zaHVhL3Byby9DbGFzc2lmaWVyUGVyY2VwdHJvbi5qYXZhCisrKyBiL3NyYy9qb3NodWEvcHJvL0NsYXNzaWZpZXJQZXJjZXB0cm9uLmphdmEKQEAgLTM4LDEyICszOCw2IEBACiAgICAgICAgIC8vIHsKICAgICAgICAgLy8gbnVtUG9zU2FtcCsrOwogICAgICAgICBzY29yZSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZm9yKCBpbnQgZD0wOyBkPGZlYXREaW07IGQrKyApIC8vaW5uZXIgcHJvZHVjdCB7IC8vU3lzdGVtLm91dC5wcmludGYoIiUuMmYgIiwKLSAgICAgICAgICogRG91YmxlLnBhcnNlRG91YmxlKGZlYXRWYWxbZF0pKTsgc2NvcmUgKz0gRG91YmxlLnBhcnNlRG91YmxlKGZlYXRWYWxbZF0pICogbGFtYmRhW2QrMV07Ci0gICAgICAgICAqLwotCiAgICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgZmVhdFZhbC5sZW5ndGggLSAxOyBkKyspIHsKICAgICAgICAgICBmZWF0X2luZm8gPSBmZWF0VmFsW2RdLnNwbGl0KCI6Iik7CiAgICAgICAgICAgc2NvcmUgKz0gRG91YmxlLnBhcnNlRG91YmxlKGZlYXRfaW5mb1sxXSkgKiBsYW1iZGFbSW50ZWdlci5wYXJzZUludChmZWF0X2luZm9bMF0pXTsKQEAgLTU1LDM1ICs0OSwxNSBAQAogICAgICAgICBpZiAoc2NvcmUgPD0gYmlhcykgLy8gaW5jb3JyZWN0IGNsYXNzaWZpY2F0aW9uCiAgICAgICAgIHsKICAgICAgICAgICBudW1FcnJvcisrOwotCi0gICAgICAgICAgLyoKLSAgICAgICAgICAgKiBmb3IoIGludCBkPTA7IGQ8ZmVhdERpbTsgZCsrICkgeyBsYW1iZGFbZCsxXSArPSBsZWFybmluZ1JhdGUqbGFiZWwgKgotICAgICAgICAgICAqIERvdWJsZS5wYXJzZURvdWJsZShmZWF0VmFsW2RdKTsgc3VtX2xhbWJkYVtkKzFdICs9IGxlYXJuaW5nUmF0ZSpsYW1iZGFbZCsxXTsgfQotICAgICAgICAgICAqLwotCi0JICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0IitzKTsKLQkgIC8vIGZvciAoaW50IGQgPSAwOyBkIDwgbGFtYmRhLmxlbmd0aDsgKytkICkKLQkgIC8vICAgICBTeXN0ZW0ub3V0LnByaW50KFN0cmluZy5mb3JtYXQoIiUuNGYiLGxhbWJkYVtkXSkrIiAiKTsKLQkgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0iKTsKLQogICAgICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgZmVhdFZhbC5sZW5ndGggLSAxOyBkKyspIHsKICAgICAgICAgICAgIGZlYXRfaW5mbyA9IGZlYXRWYWxbZF0uc3BsaXQoIjoiKTsKICAgICAgICAgICAgIGludCBmZWF0SUQgPSBJbnRlZ2VyLnBhcnNlSW50KGZlYXRfaW5mb1swXSk7CiAgICAgICAgICAgICBsYW1iZGFbZmVhdElEXSArPSBsZWFybmluZ1JhdGUgKiBsYWJlbCAqIERvdWJsZS5wYXJzZURvdWJsZShmZWF0X2luZm9bMV0pOwogICAgICAgICAgICAgc3VtX2xhbWJkYVtmZWF0SURdICs9IGxhbWJkYVtmZWF0SURdOwogICAgICAgICAgIH0KLQotCSAgLy8gU3lzdGVtLm91dC5wcmludGxuKHNhbXBsZXMuZ2V0KHMpKTsKLQkgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0iKTsKLQkgIC8vIGZvciAoaW50IGQgPSAwOyBkIDwgbGFtYmRhLmxlbmd0aDsgKytkICkKLQkgIC8vICAgICBTeXN0ZW0ub3V0LnByaW50KFN0cmluZy5mb3JtYXQoIiUuNGYiLGxhbWJkYVtkXSkrIiAiKTsKLQkgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICB9CiAgICAgICAgIC8vIH0vL2lmKCBmZWF0VmFsW2ZlYXREaW1dLmVxdWFscygiMSIpICkKICAgICAgIH0KLQotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGYoIiglLjJmJSUpICIsbnVtRXJyb3IqMTAwLjAvbnVtUG9zU2FtcCk7Ci0KICAgICAgIGlmIChudW1FcnJvciA9PSAwKSBicmVhazsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvcHJvL09wdGltaXplci5qYXZhIGIvc3JjL2pvc2h1YS9wcm8vT3B0aW1pemVyLmphdmEKaW5kZXggNTQ0YTg4MC4uYmMwMWQyMSAxMDA3NTUKLS0tIGEvc3JjL2pvc2h1YS9wcm8vT3B0aW1pemVyLmphdmEKKysrIGIvc3JjL2pvc2h1YS9wcm8vT3B0aW1pemVyLmphdmEKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICBmZWF0X3N0ciA9IGZlYXRfaGFzaFtpXS5nZXQoY2FuZFN0cikuc3BsaXQoIlxccysiKTsKIAogCWZvciAoaW50IGYgPSAwOyBmIDwgZmVhdF9zdHIubGVuZ3RoOyBmKyspIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGZlYXRfaW5mbyA9IGZlYXRfc3RyW2ZdLnNwbGl0KCJbPTpdIik7CisgICAgICAgICAgICBTdHJpbmdbXSBmZWF0X2luZm8gPSBmZWF0X3N0cltmXS5zcGxpdCgiWz1dIik7CiAgICAgICAgICAgICBtb2RlbFNjb3JlICs9CiAgICAgICAgICAgICAgICAgRG91YmxlLnBhcnNlRG91YmxlKGZlYXRfaW5mb1sxXSkgKiBmaW5hbExhbWJkYVtWb2NhYnVsYXJ5LmlkKGZlYXRfaW5mb1swXSldOwogCX0KQEAgLTI1OCw3ICsyNTgsNyBAQAogCWludCBmZWF0X2lkOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmVhdF9zdHJfajEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBmZWF0X2luZm8gPSBmZWF0X3N0cl9qMVtpXS5zcGxpdCgiWzo9XSIpOworICAgICAgICAgIGZlYXRfaW5mbyA9IGZlYXRfc3RyX2oxW2ldLnNwbGl0KCJbPV0iKTsKIAkgIGZlYXRfaWQgPSBWb2NhYnVsYXJ5LmlkKGZlYXRfaW5mb1swXSk7CiAJICBpZiAoIChmZWF0X2lkIDwgaXNPcHRpbWl6YWJsZS5sZW5ndGggJiYKIAkJaXNPcHRpbWl6YWJsZVtmZWF0X2lkXSkgfHwgCkBAIC0yNjYsNyArMjY2LDcgQEAKIAkgICAgICBmZWF0X2RpZmYucHV0KCBmZWF0X2lkLCBmZWF0X2luZm9bMV0gKTsKICAgICAgICAgfQogCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdF9zdHJfajIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZlYXRfaW5mbyA9IGZlYXRfc3RyX2oyW2ldLnNwbGl0KCJbOj1dIik7CisgICAgICAgICAgICBmZWF0X2luZm8gPSBmZWF0X3N0cl9qMltpXS5zcGxpdCgiWz1dIik7CiAJICAgIGZlYXRfaWQgPSBWb2NhYnVsYXJ5LmlkKGZlYXRfaW5mb1swXSk7CiAJICAgIGlmICggKGZlYXRfaWQgPCBpc09wdGltaXphYmxlLmxlbmd0aCAmJgogCQkgIGlzT3B0aW1pemFibGVbZmVhdF9pZF0pIHx8IApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9wcm8vUFJPQ29yZS5qYXZhIGIvc3JjL2pvc2h1YS9wcm8vUFJPQ29yZS5qYXZhCmluZGV4IDk0OTY2N2EuLjA1YzZhYmQgMTAwNzU1Ci0tLSBhL3NyYy9qb3NodWEvcHJvL1BST0NvcmUuamF2YQorKysgYi9zcmMvam9zaHVhL3Byby9QUk9Db3JlLmphdmEKQEAgLTEwLDggKzEwLDYgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CkBAIC05MiwxMSArOTAsMTEgQEAKICAgLy8gNDogYXBwbHkgMSsyKzMKIAogICBwcml2YXRlIGludCBudW1QYXJhbXM7Ci0gIC8vdG90YWwgbnVtYmVyIG9mIGZpcmluZyBmZWF0dXJlcwotICAvL3RoaXMgbnVtYmVyIG1heSBpbmNyZWFzZSBvdmVydGltZSBhcyBuZXcgbi1iZXN0IGxpc3RzIGFyZSBkZWNvZGVkCi0gIC8vaW5pdGlhbGx5IGl0IGlzIGVxdWFsIHRvIHRoZSAjIG9mIHBhcmFtcyBpbiB0aGUgcGFyYW1ldGVyIGNvbmZpZyBmaWxlCisgIC8vIHRvdGFsIG51bWJlciBvZiBmaXJpbmcgZmVhdHVyZXMKKyAgLy8gdGhpcyBudW1iZXIgbWF5IGluY3JlYXNlIG92ZXJ0aW1lIGFzIG5ldyBuLWJlc3QgbGlzdHMgYXJlIGRlY29kZWQKKyAgLy8gaW5pdGlhbGx5IGl0IGlzIGVxdWFsIHRvIHRoZSAjIG9mIHBhcmFtcyBpbiB0aGUgcGFyYW1ldGVyIGNvbmZpZyBmaWxlCiAgIHByaXZhdGUgaW50IG51bVBhcmFtc09sZDsKLSAgLy9udW1iZXIgb2YgZmVhdHVyZXMgYmVmb3JlIG9ic2VydmluZyB0aGUgbmV3IGZlYXR1cmVzIGZpcmVkIGluIHRoZSBjdXJyZW50IGl0ZXJhdGlvbgorICAvLyBudW1iZXIgb2YgZmVhdHVyZXMgYmVmb3JlIG9ic2VydmluZyB0aGUgbmV3IGZlYXR1cmVzIGZpcmVkIGluIHRoZSBjdXJyZW50IGl0ZXJhdGlvbgogCiAgIHByaXZhdGUgZG91YmxlW10gbm9ybWFsaXphdGlvbk9wdGlvbnM7CiAgIC8vIEhvdyBzaG91bGQgYSBsYW1iZGFbXSB2ZWN0b3IgYmUgbm9ybWFsaXplZCAoYmVmb3JlIGRlY29kaW5nKT8KQEAgLTExMCw3ICsxMDgsNyBAQAogICAvKiBOT1RFOiBpbmRleGluZyBzdGFydHMgYXQgMSBpbiB0aGUgZm9sbG93aW5nIGZldyBhcnJheXM6ICovCiAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLSAgLy9wcml2YXRlIGRvdWJsZVtdIGxhbWJkYTsKKyAgLy8gcHJpdmF0ZSBkb3VibGVbXSBsYW1iZGE7CiAgIHByaXZhdGUgQXJyYXlMaXN0PERvdWJsZT4gbGFtYmRhID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CiAgIC8vIHRoZSBjdXJyZW50IHdlaWdodCB2ZWN0b3IuIE5PVEU6IGluZGV4aW5nIHN0YXJ0cyBhdCAxLgogICBwcml2YXRlIEFycmF5TGlzdDxEb3VibGU+IGJlc3RMYW1iZGEgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKQEAgLTIxNCw4ICsyMTIsOSBAQAogICBwcml2YXRlIGludCBYaTsKICAgcHJpdmF0ZSBkb3VibGUgaW50ZXJDb2VmOwogICBwcml2YXRlIGRvdWJsZSBtZXRyaWNEaWZmOwotICBwcml2YXRlIGRvdWJsZSBwcmV2TWV0cmljU2NvcmUgPSAwOyAvL2ZpbmFsIG1ldHJpYyBzY29yZSBvZiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLCB1c2VkIG9ubHkgd2hlbiByZXR1cm5CZXN0ID0gdHJ1ZQotICBwcml2YXRlIGJvb2xlYW4gcmV0dXJuQmVzdCA9IHRydWU7IC8vcmV0dXJuIHRoZSBiZXN0IHdlaWdodCBkdXJpbmcgdHVuaW5nCisgIHByaXZhdGUgZG91YmxlIHByZXZNZXRyaWNTY29yZSA9IDA7IC8vIGZpbmFsIG1ldHJpYyBzY29yZSBvZiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLCB1c2VkIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiByZXR1cm5CZXN0ID0gdHJ1ZQorICBwcml2YXRlIGJvb2xlYW4gcmV0dXJuQmVzdCA9IGZhbHNlOyAvLyByZXR1cm4gdGhlIGJlc3Qgd2VpZ2h0IGR1cmluZyB0dW5pbmcKIAogICBwcml2YXRlIFN0cmluZyBkaXJQcmVmaXg7IC8vIHdoZXJlIGFyZSBhbGwgdGhlc2UgZmlsZXMgbG9jYXRlZD8KICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW1zRmlsZU5hbWUsIGRvY0luZm9GaWxlTmFtZSwgZmluYWxMYW1iZGFGaWxlTmFtZTsKQEAgLTI5MCwxNSArMjg5LDE1IEBACiAgICAgICBCdWZmZXJlZFJlYWRlciBpbkZpbGVfbmFtZXMgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIocGFyYW1zRmlsZU5hbWUpKTsKIAogICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gbnVtUGFyYW1zOyArK2MpIHsKLSAgICAgICAgICBTdHJpbmcgbGluZSA9ICIiOwotICAgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwgJiYgbGluZS5sZW5ndGgoKSA9PSAwKSB7IC8vIHNraXAgZW1wdHkgbGluZXMKLQkgICAgICBsaW5lID0gaW5GaWxlX25hbWVzLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgfQotCSAgCi0gICAgICAgICAgLy8gc2F2ZSBmZWF0dXJlIG5hbWVzCi0JICBTdHJpbmcgcGFyYW1OYW1lID0gKGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZigifHx8IikpKS50cmltKCk7Ci0JICBWb2NhYnVsYXJ5LmlkKHBhcmFtTmFtZSk7Ci0JICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiVk9DQUIoJXMpID0gJWQiLCBwYXJhbU5hbWUsIGlkKSk7CisgICAgICAgIFN0cmluZyBsaW5lID0gIiI7CisgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwgJiYgbGluZS5sZW5ndGgoKSA9PSAwKSB7IC8vIHNraXAgZW1wdHkgbGluZXMKKyAgICAgICAgICBsaW5lID0gaW5GaWxlX25hbWVzLnJlYWRMaW5lKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzYXZlIGZlYXR1cmUgbmFtZXMKKyAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IChsaW5lLnN1YnN0cmluZygwLCBsaW5lLmluZGV4T2YoInx8fCIpKSkudHJpbSgpOworICAgICAgICBWb2NhYnVsYXJ5LmlkKHBhcmFtTmFtZSk7CisgICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJWT0NBQiglcykgPSAlZCIsIHBhcmFtTmFtZSwgaWQpKTsKICAgICAgIH0KIAogICAgICAgaW5GaWxlX25hbWVzLmNsb3NlKCk7CkBAIC0zMTIsOSArMzExLDkgQEAKIAogICAgIC8vIHRoZSBwYXJhbWV0ZXIgZmlsZSBjb250YWlucyBvbmUgbGluZSBwZXIgcGFyYW1ldGVyCiAgICAgLy8gYW5kIG9uZSBsaW5lIGZvciB0aGUgbm9ybWFsaXphdGlvbiBtZXRob2QKLSAgICAvLyBpbmRleGluZyBzdGFydHMgYXQgMSBpbiB0aGVzZSBhcnJheXMgCi0gICAgZm9yICggaW50IHAgPSAwOyBwIDw9IG51bVBhcmFtczsgKytwICkKLQlsYW1iZGEuYWRkKG5ldyBEb3VibGUoMCkpOworICAgIC8vIGluZGV4aW5nIHN0YXJ0cyBhdCAxIGluIHRoZXNlIGFycmF5cworICAgIGZvciAoaW50IHAgPSAwOyBwIDw9IG51bVBhcmFtczsgKytwKQorICAgICAgbGFtYmRhLmFkZChuZXcgRG91YmxlKDApKTsKICAgICBiZXN0TGFtYmRhLmFkZChuZXcgRG91YmxlKDApKTsKICAgICAvLyB3aHkgb25seSBsYW1iZGEgaXMgYSBsaXN0PyBiZWNhdXNlIHRoZSBzaXplIG9mIGxhbWJkYQogICAgIC8vIG1heSBpbmNyZWFzZSBvdmVyIHRpbWUsIGJ1dCBvdGhlciBhcnJheXMgYXJlIHNwZWNpZmllZCBpbgpAQCAtMzgxLDcgKzM4MCw3IEBACiAgICAgRXZhbHVhdGlvbk1ldHJpYy5zZXRfdG1wRGlyUHJlZml4KHRtcERpclByZWZpeCk7CiAKICAgICBldmFsTWV0cmljID0gRXZhbHVhdGlvbk1ldHJpYy5nZXRNZXRyaWMobWV0cmljTmFtZSwgbWV0cmljT3B0aW9ucyk7Ci0gICAgLy91c2VkIG9ubHkgaWYgcmV0dXJuQmVzdCA9IHRydWUKKyAgICAvLyB1c2VkIG9ubHkgaWYgcmV0dXJuQmVzdCA9IHRydWUKICAgICBwcmV2TWV0cmljU2NvcmUgPSBldmFsTWV0cmljLmdldFRvQmVNaW5pbWl6ZWQoKSA/IFBvc0luZiA6IE5lZ0luZjsKIAogICAgIC8vIGxlbmd0aCBvZiBzdWZmaWNpZW50IHN0YXRpc3RpY3MKQEAgLTM5MSw4ICszOTAsOCBAQAogICAgIC8vIHNldCBzdGF0aWMgZGF0YSBtZW1iZXJzIGZvciB0aGUgSW50ZXJtZWRpYXRlT3B0aW1pemVyIGNsYXNzCiAgICAgLyoKICAgICAgKiBJbnRlcm1lZGlhdGVPcHRpbWl6ZXIuc2V0X01FUlRwYXJhbXMobnVtU2VudGVuY2VzLCBudW1Eb2N1bWVudHMsIGRvY09mU2VudGVuY2UsCi0gICAgICogZG9jU3Vic2V0SW5mbywgbnVtUGFyYW1zLCBub3JtYWxpemF0aW9uT3B0aW9ucywgaXNPcHRpbWl6YWJsZQotICAgICAqIG9uZU1vZGlmaWNhdGlvblBlckl0ZXJhdGlvbiwgZXZhbE1ldHJpYywgdG1wRGlyUHJlZml4LCB2ZXJib3NpdHkpOworICAgICAqIGRvY1N1YnNldEluZm8sIG51bVBhcmFtcywgbm9ybWFsaXphdGlvbk9wdGlvbnMsIGlzT3B0aW1pemFibGUgb25lTW9kaWZpY2F0aW9uUGVySXRlcmF0aW9uLAorICAgICAqIGV2YWxNZXRyaWMsIHRtcERpclByZWZpeCwgdmVyYm9zaXR5KTsKICAgICAgKi8KIAogICAgIC8vIHByaW50IGluZm8KQEAgLTQxOCw3ICs0MTcsNyBAQAogICAgICAgcHJpbnRsbigiYyAgICBEZWZhdWx0IHZhbHVlXHRPcHRpbWl6YWJsZT9cdFJhbmQuIHZhbC4gcmFuZ2UiLCAxKTsKIAogICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gbnVtUGFyYW1zOyArK2MpIHsKLSAgICAgICAgICBwcmludChjICsgIiAgICAgIiArIGY0LmZvcm1hdChsYW1iZGEuZ2V0KGMpLmRvdWJsZVZhbHVlKCkpICsgIlx0XHQiLCAxKTsKKyAgICAgICAgcHJpbnQoYyArICIgICAgICIgKyBmNC5mb3JtYXQobGFtYmRhLmdldChjKS5kb3VibGVWYWx1ZSgpKSArICJcdFx0IiwgMSk7CiAKICAgICAgICAgaWYgKCFpc09wdGltaXphYmxlW2NdKSB7CiAgICAgICAgICAgcHJpbnRsbigiIE5vIiwgMSk7CkBAIC01NjAsMTIgKzU1OSwxMiBAQAogICAgIHByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLCAxKTsKICAgICBwcmludGxuKCIiLCAxKTsKIAotICAgIGlmICggISByZXR1cm5CZXN0ICkKLQlwcmludGxuKCJGSU5BTCBsYW1iZGE6ICIgKyBsYW1iZGFUb1N0cmluZyhsYW1iZGEpLCAxKTsKLSAgICAgICAgLy8gKyAiICgiICsgbWV0cmljTmFtZV9kaXNwbGF5ICsgIjogIiArIEZJTkFMX3Njb3JlICsgIikiLDEpOworICAgIGlmICghcmV0dXJuQmVzdCkKKyAgICAgIHByaW50bG4oIkZJTkFMIGxhbWJkYTogIiArIGxhbWJkYVRvU3RyaW5nKGxhbWJkYSksIDEpOworICAgIC8vICsgIiAoIiArIG1ldHJpY05hbWVfZGlzcGxheSArICI6ICIgKyBGSU5BTF9zY29yZSArICIpIiwxKTsKICAgICBlbHNlCi0JcHJpbnRsbigiQkVTVCBsYW1iZGE6ICIgKyBsYW1iZGFUb1N0cmluZyhsYW1iZGEpLCAxKTsKLSAgICAgICAgLy8gKyAiICgiICsgbWV0cmljTmFtZV9kaXNwbGF5ICsgIjogIiArIEZJTkFMX3Njb3JlICsgIikiLDEpOworICAgICAgcHJpbnRsbigiQkVTVCBsYW1iZGE6ICIgKyBsYW1iZGFUb1N0cmluZyhsYW1iZGEpLCAxKTsKKyAgICAvLyArICIgKCIgKyBtZXRyaWNOYW1lX2Rpc3BsYXkgKyAiOiAiICsgRklOQUxfc2NvcmUgKyAiKSIsMSk7CiAKICAgICAvLyBkZWxldGUgaW50ZXJtZWRpYXRlIC50ZW1wLiouaXQqIGRlY29kZXIgb3V0cHV0IGZpbGVzCiAgICAgZm9yIChpbnQgaXRlcmF0aW9uID0gMTsgaXRlcmF0aW9uIDw9IG1heEl0czsgKytpdGVyYXRpb24pIHsKQEAgLTU5Miw3ICs1OTEsNyBAQAogICAvLyB0aGlzIGlzIHRoZSBrZXkgZnVuY3Rpb24hCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICBwdWJsaWMgZG91YmxlW10gcnVuX3NpbmdsZV9pdGVyYXRpb24oaW50IGl0ZXJhdGlvbiwgaW50IG1pbkl0cywgaW50IG1heEl0cywgaW50IHByZXZJdHMsCi0JCQkJICAgICAgIGludCBlYXJseVN0b3AsIGludFtdIG1heEluZGV4KSB7CisgICAgICBpbnQgZWFybHlTdG9wLCBpbnRbXSBtYXhJbmRleCkgewogICAgIGRvdWJsZSBGSU5BTF9zY29yZSA9IDA7CiAKICAgICBkb3VibGVbXSByZXRBID0gbmV3IGRvdWJsZVszXTsKQEAgLTYyOSw5ICs2MjgsOSBAQAogICAgICAgLyoqKioqKioqKioqKioqKi8KIAogICAgICAgaWYgKGl0ZXJhdGlvbiA9PSAxKSB7Ci0JICBwcmludGxuKCJEZWNvZGluZyB1c2luZyBpbml0aWFsIHdlaWdodCB2ZWN0b3IgIiArIGxhbWJkYVRvU3RyaW5nKGxhbWJkYSksIDEpOworICAgICAgICBwcmludGxuKCJEZWNvZGluZyB1c2luZyBpbml0aWFsIHdlaWdodCB2ZWN0b3IgIiArIGxhbWJkYVRvU3RyaW5nKGxhbWJkYSksIDEpOwogICAgICAgfSBlbHNlIHsKLQkgIHByaW50bG4oIlJlZGVjb2RpbmcgdXNpbmcgd2VpZ2h0IHZlY3RvciAiICsgbGFtYmRhVG9TdHJpbmcobGFtYmRhKSwgMSk7CisgICAgICAgIHByaW50bG4oIlJlZGVjb2RpbmcgdXNpbmcgd2VpZ2h0IHZlY3RvciAiICsgbGFtYmRhVG9TdHJpbmcobGFtYmRhKSwgMSk7CiAgICAgICB9CiAKICAgICAgIC8vIGdlbmVyYXRlIHRoZSBuLWJlc3QgZmlsZSBhZnRlciBkZWNvZGluZwpAQCAtNzA0LDcgKzcwMyw3IEBACiAgICAgICAvLyBpbml0TGFtYmRhWzBdIGlzIG5vdCB1c2VkIQogICAgICAgZG91YmxlW10gaW5pdGlhbExhbWJkYSA9IG5ldyBkb3VibGVbMSArIG51bVBhcmFtc107CiAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBudW1QYXJhbXM7ICsraSkKLQkgIGluaXRpYWxMYW1iZGFbaV0gPSBsYW1iZGEuZ2V0KGkpOworICAgICAgICBpbml0aWFsTGFtYmRhW2ldID0gbGFtYmRhLmdldChpKTsKIAogICAgICAgLy8gdGhlICJzY29yZSIgaW4gaW5pdGlhbFNjb3JlIHJlZmVycyB0byB0aGF0CiAgICAgICAvLyBhc3NpZ25lZCBieSB0aGUgZXZhbHVhdGlvbiBtZXRyaWMpCkBAIC04OTEsMTkgKzg5MCwxOSBAQAogICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgZmVhdHVyZSB2YWx1ZQogICAgICAgICAgICAgICAgIGZlYXRWYWxfc3RyID0gZmVhdHNfc3RyLnNwbGl0KCJcXHMrIik7CiAKLQkJaWYgKGZlYXRzX3N0ci5pbmRleE9mKCc9JykgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmVhdHVyZVBhaXIgOiBmZWF0VmFsX3N0cikgewotCQkJU3RyaW5nW10gcGFpciA9IGZlYXR1cmVQYWlyLnNwbGl0KCI9Iik7Ci0JCQlTdHJpbmcgbmFtZSA9IHBhaXJbMF07Ci0JCQlEb3VibGUgdmFsdWUgPSBEb3VibGUucGFyc2VEb3VibGUocGFpclsxXSk7Ci0JCQlpbnQgZmVhdElkID0gVm9jYWJ1bGFyeS5pZChuYW1lKTsKLQkJCS8vbmVlZCB0byBpZGVudGlmeSBuZXdseSBmaXJlZCBmZWF0cyBoZXJlCi0JCQlpZiAoZmVhdElkID4gbnVtUGFyYW1zKSB7Ci0JCQkgICAgKytudW1QYXJhbXM7Ci0JCQkgICAgbGFtYmRhLmFkZChuZXcgRG91YmxlKDApKTsKLQkJCX0KKyAgICAgICAgICAgICAgICBpZiAoZmVhdHNfc3RyLmluZGV4T2YoJz0nKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmVhdHVyZVBhaXIgOiBmZWF0VmFsX3N0cikgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYWlyID0gZmVhdHVyZVBhaXIuc3BsaXQoIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYWlyWzBdOworICAgICAgICAgICAgICAgICAgICBEb3VibGUgdmFsdWUgPSBEb3VibGUucGFyc2VEb3VibGUocGFpclsxXSk7CisgICAgICAgICAgICAgICAgICAgIGludCBmZWF0SWQgPSBWb2NhYnVsYXJ5LmlkKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGlkZW50aWZ5IG5ld2x5IGZpcmVkIGZlYXRzIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXRJZCA+IG51bVBhcmFtcykgeworICAgICAgICAgICAgICAgICAgICAgICsrbnVtUGFyYW1zOworICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYS5hZGQobmV3IERvdWJsZSgwKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLQkJfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBleGlzdGluZ0NhbmRTdGF0cy5wdXQoc2VudHNfc3RyLCBzdGF0c19zdHIpOwogICAgICAgICAgICAgICAgIGNhbmRDb3VudFtpXSArPSAxOwogICAgICAgICAgICAgICAgIG5ld0NhbmRpZGF0ZXNBZGRlZFtpdF0gKz0gMTsKQEAgLTEwMjksOCArMTAyOCw4IEBACiAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluRmlsZV9zdGF0c01lcmdlZEtub3duID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKICAgICAgICAgICAgIGluc3RyZWFtX3N0YXRzTWVyZ2VkS25vd24sICJ1dGY4IikpOwogCi0JLy9udW0gb2YgZmVhdHVyZXMgYmVmb3JlIG9ic2VydmluZyBuZXcgZmlyaW5nIGZlYXR1cmVzIGZyb20gdGhpcyBpdGVyYXRpb24KLQludW1QYXJhbXNPbGQgPSBudW1QYXJhbXM7CisgICAgICAgIC8vIG51bSBvZiBmZWF0dXJlcyBiZWZvcmUgb2JzZXJ2aW5nIG5ldyBmaXJpbmcgZmVhdHVyZXMgZnJvbSB0aGlzIGl0ZXJhdGlvbgorICAgICAgICBudW1QYXJhbXNPbGQgPSBudW1QYXJhbXM7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TZW50ZW5jZXM7ICsraSkgewogICAgICAgICAgIC8vIHJlcHJvY2VzcyBjYW5kaWRhdGVzIGZyb20gcHJldmlvdXMgaXRlcmF0aW9ucwpAQCAtMTA5MSwyMCArMTA5MCwxOSBAQAogICAgICAgICAgICAgICBzdGF0c19oYXNoW2ldLnB1dChzZW50c19zdHIsIHN0YXRzX3N0cik7CiAKICAgICAgICAgICAgICAgZmVhdFZhbF9zdHIgPSBmZWF0c19zdHIuc3BsaXQoIlxccysiKTsKLQkgICAgICAKLQkgICAgICBpZiAoZmVhdHNfc3RyLmluZGV4T2YoJz0nKSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmVhdHVyZVBhaXIgOiBmZWF0VmFsX3N0cikgewotCQkgICAgICBTdHJpbmdbXSBwYWlyID0gZmVhdHVyZVBhaXIuc3BsaXQoIj0iKTsKLQkJICAgICAgU3RyaW5nIG5hbWUgPSBwYWlyWzBdOwotCQkgICAgICBEb3VibGUgdmFsdWUgPSBEb3VibGUucGFyc2VEb3VibGUocGFpclsxXSk7Ci0JCSAgICAgIGludCBmZWF0SWQgPSBWb2NhYnVsYXJ5LmlkKG5hbWUpOwotCQkgICAgICAvL25lZWQgdG8gaWRlbnRpZnkgbmV3bHkgZmlyZWQgZmVhdHMgaGVyZQotCQkgICAgICBpZiAoZmVhdElkID4gbnVtUGFyYW1zKSB7Ci0JCQkgICsrbnVtUGFyYW1zOwotCQkJICBsYW1iZGEuYWRkKG5ldyBEb3VibGUoMCkpOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoZmVhdHNfc3RyLmluZGV4T2YoJz0nKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZlYXR1cmVQYWlyIDogZmVhdFZhbF9zdHIpIHsKKyAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhaXIgPSBmZWF0dXJlUGFpci5zcGxpdCgiPSIpOworICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYWlyWzBdOworICAgICAgICAgICAgICAgICAgaW50IGZlYXRJZCA9IFZvY2FidWxhcnkuaWQobmFtZSk7CisgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGlkZW50aWZ5IG5ld2x5IGZpcmVkIGZlYXRzIGhlcmUKKyAgICAgICAgICAgICAgICAgIGlmIChmZWF0SWQgPiBudW1QYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKytudW1QYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIGxhbWJkYS5hZGQobmV3IERvdWJsZSgwKSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGV4aXN0aW5nQ2FuZFN0YXRzLnB1dChzZW50c19zdHIsIHN0YXRzX3N0cik7CiAgICAgICAgICAgICAgIGNhbmRDb3VudFtpXSArPSAxOwogCkBAIC0xMTkzLDggKzExOTEsOCBAQAogCiAgICAgICAgIHByaW50bG4oIiIsIDEpOwogCi0JcHJpbnRsbigiTnVtYmVyIG9mIGZlYXR1cmVzIG9ic2VydmVkIHNvIGZhcjogIiArIG51bVBhcmFtcyk7Ci0JcHJpbnRsbigiIiwgMSk7CisgICAgICAgIHByaW50bG4oIk51bWJlciBvZiBmZWF0dXJlcyBvYnNlcnZlZCBzbyBmYXI6ICIgKyBudW1QYXJhbXMpOworICAgICAgICBwcmludGxuKCIiLCAxKTsKIAogICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGaWxlTm90Rm91bmRFeGNlcHRpb24gaW4gUFJPQ29yZS5ydW5fc2luZ2xlX2l0ZXJhdGlvbig2KTogIgpAQCAtMTIxMiwxNiArMTIxMCwxNiBAQAogICAgICAgICAgIHByaW50bG4oIiIsIDEpOwogICAgICAgICAgIHByaW50bG4oIi0tLSAgUFJPIGl0ZXJhdGlvbiAjIiArIGl0ZXJhdGlvbiArICIgZW5kaW5nIEAgIiArIChuZXcgRGF0ZSgpKSArICIgIC0tLSIsIDEpOwogICAgICAgICAgIHByaW50bG4oIiIsIDEpOwotCSAgZGVsZXRlRmlsZSh0bXBEaXJQcmVmaXggKyAidGVtcC5zdGF0cy5tZXJnZWQiKTsKKyAgICAgICAgICBkZWxldGVGaWxlKHRtcERpclByZWZpeCArICJ0ZW1wLnN0YXRzLm1lcmdlZCIpOwogCi0JICBpZiAocmV0dXJuQmVzdCkgewotCSAgICAgIC8vbm90ZSB0aGF0IGJlc3RMYW1iZGEuc2l6ZSgpIDw9IGxhbWJkYS5zaXplKCkKLQkgICAgICBmb3IgKCBpbnQgcCA9IDE7IHAgPCBiZXN0TGFtYmRhLnNpemUoKTsgKytwICkKLQkJICBsYW1iZGEuc2V0KHAsIGJlc3RMYW1iZGEuZ2V0KHApKTsKLQkgICAgICAvL2FuZCBzZXQgdGhlIHJlc3Qgb2YgbGFtYmRhIHRvIGJlIDAKLQkgICAgICBmb3IgKCBpbnQgcCA9IDA7IHAgPCBsYW1iZGEuc2l6ZSgpIC0gYmVzdExhbWJkYS5zaXplKCk7ICsrcCApCi0JCSAgbGFtYmRhLnNldChwK2Jlc3RMYW1iZGEuc2l6ZSgpLCBuZXcgRG91YmxlKDApKTsKLQkgIH0KKyAgICAgICAgICBpZiAocmV0dXJuQmVzdCkgeworICAgICAgICAgICAgLy8gbm90ZSB0aGF0IGJlc3RMYW1iZGEuc2l6ZSgpIDw9IGxhbWJkYS5zaXplKCkKKyAgICAgICAgICAgIGZvciAoaW50IHAgPSAxOyBwIDwgYmVzdExhbWJkYS5zaXplKCk7ICsrcCkKKyAgICAgICAgICAgICAgbGFtYmRhLnNldChwLCBiZXN0TGFtYmRhLmdldChwKSk7CisgICAgICAgICAgICAvLyBhbmQgc2V0IHRoZSByZXN0IG9mIGxhbWJkYSB0byBiZSAwCisgICAgICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IGxhbWJkYS5zaXplKCkgLSBiZXN0TGFtYmRhLnNpemUoKTsgKytwKQorICAgICAgICAgICAgICBsYW1iZGEuc2V0KHAgKyBiZXN0TGFtYmRhLnNpemUoKSwgbmV3IERvdWJsZSgwKSk7CisgICAgICAgICAgfQogCiAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIHRoaXMgbWVhbnMgdGhhdCB0aGUgb2xkIHZhbHVlcyBzaG91bGQgYmUga2VwdCBieSB0aGUgY2FsbGVyCiAgICAgICAgIH0gZWxzZSB7CkBAIC0xMjM4LDEyICsxMjM2LDEyIEBACiAKICAgICAgIFZlY3RvcjxTdHJpbmc+IG91dHB1dCA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwogCi0gICAgICAvL25vdGU6IGluaXRpYWxMYW1iZGFbXSBoYXMgbGVuZ3RoID0gbnVtUGFyYW1zT2xkCi0gICAgICAvL2F1Z21lbnRlZCB3aXRoIG5ldyBmZWF0dXJlIHdlaWdodHMsIGluaXRpYWwgdmFsdWVzIGFyZSAwCisgICAgICAvLyBub3RlOiBpbml0aWFsTGFtYmRhW10gaGFzIGxlbmd0aCA9IG51bVBhcmFtc09sZAorICAgICAgLy8gYXVnbWVudGVkIHdpdGggbmV3IGZlYXR1cmUgd2VpZ2h0cywgaW5pdGlhbCB2YWx1ZXMgYXJlIDAKICAgICAgIGRvdWJsZVtdIGluaXRpYWxMYW1iZGFOZXcgPSBuZXcgZG91YmxlWzEgKyBudW1QYXJhbXNdOwogICAgICAgU3lzdGVtLmFycmF5Y29weShpbml0aWFsTGFtYmRhLCAxLCBpbml0aWFsTGFtYmRhTmV3LCAxLCBudW1QYXJhbXNPbGQpOwogCi0gICAgICAvL2ZpbmFsTGFtYmRhW10gaGFzIGxlbmd0aCA9IG51bVBhcmFtcyAoY29uc2lkZXJpbmcgbmV3IGZlYXR1cmVzKQorICAgICAgLy8gZmluYWxMYW1iZGFbXSBoYXMgbGVuZ3RoID0gbnVtUGFyYW1zIChjb25zaWRlcmluZyBuZXcgZmVhdHVyZXMpCiAgICAgICBkb3VibGVbXSBmaW5hbExhbWJkYSA9IG5ldyBkb3VibGVbMSArIG51bVBhcmFtc107CiAKICAgICAgIE9wdGltaXplciBvcHQgPSBuZXcgT3B0aW1pemVyKHNlZWQgKyBpdGVyYXRpb24sIGlzT3B0aW1pemFibGUsIG91dHB1dCwgaW5pdGlhbExhbWJkYU5ldywKQEAgLTEyNTEsMzQgKzEyNDksMzQgQEAKICAgICAgICAgICBjbGFzc2lmaWVyQWxnLCBjbGFzc2lmaWVyUGFyYW1zKTsKICAgICAgIGZpbmFsTGFtYmRhID0gb3B0LnJ1bl9PcHRpbWl6ZXIoKTsKIAotICAgICAgaWYgKCByZXR1cm5CZXN0ICkgewotCSAgZG91YmxlIG1ldHJpY1Njb3JlID0gb3B0LmdldE1ldHJpY1Njb3JlKCk7Ci0JICBpZiAoICEgZXZhbE1ldHJpYy5nZXRUb0JlTWluaW1pemVkKCkgKSB7Ci0JICAgICAgaWYgKCBtZXRyaWNTY29yZSA+IHByZXZNZXRyaWNTY29yZSApIHsKLQkJICBwcmV2TWV0cmljU2NvcmUgPSBtZXRyaWNTY29yZTsKLQkJICBmb3IgKCBpbnQgcCA9IDE7IHAgPCBiZXN0TGFtYmRhLnNpemUoKTsgKytwICkKLQkJICAgICAgYmVzdExhbWJkYS5zZXQocCwgZmluYWxMYW1iZGFbcF0pOwotCQkgIGlmICggMSArIG51bVBhcmFtcyA+IGJlc3RMYW1iZGEuc2l6ZSgpICkgewotCQkgICAgICBmb3IgKCBpbnQgcCA9IGJlc3RMYW1iZGEuc2l6ZSgpOyBwIDw9IG51bVBhcmFtczsgKytwICkKLQkJCSAgYmVzdExhbWJkYS5hZGQocCwgZmluYWxMYW1iZGFbcF0pOwotCQkgIH0KLQkgICAgICB9Ci0JICB9IGVsc2UgewotCSAgICAgIGlmICggbWV0cmljU2NvcmUgPCBwcmV2TWV0cmljU2NvcmUgKSB7Ci0JCSAgcHJldk1ldHJpY1Njb3JlID0gbWV0cmljU2NvcmU7Ci0JCSAgZm9yICggaW50IHAgPSAxOyBwIDwgYmVzdExhbWJkYS5zaXplKCk7ICsrcCApCi0JCSAgICAgIGJlc3RMYW1iZGEuc2V0KHAsIGZpbmFsTGFtYmRhW3BdKTsKLQkJICBpZiAoIDEgKyBudW1QYXJhbXMgPiBiZXN0TGFtYmRhLnNpemUoKSApIHsKLQkJICAgICAgZm9yICggaW50IHAgPSBiZXN0TGFtYmRhLnNpemUoKTsgcCA8PSBudW1QYXJhbXM7ICsrcCApCi0JCQkgIGJlc3RMYW1iZGEuYWRkKHAsIGZpbmFsTGFtYmRhW3BdKTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQorICAgICAgaWYgKHJldHVybkJlc3QpIHsKKyAgICAgICAgZG91YmxlIG1ldHJpY1Njb3JlID0gb3B0LmdldE1ldHJpY1Njb3JlKCk7CisgICAgICAgIGlmICghZXZhbE1ldHJpYy5nZXRUb0JlTWluaW1pemVkKCkpIHsKKyAgICAgICAgICBpZiAobWV0cmljU2NvcmUgPiBwcmV2TWV0cmljU2NvcmUpIHsKKyAgICAgICAgICAgIHByZXZNZXRyaWNTY29yZSA9IG1ldHJpY1Njb3JlOworICAgICAgICAgICAgZm9yIChpbnQgcCA9IDE7IHAgPCBiZXN0TGFtYmRhLnNpemUoKTsgKytwKQorICAgICAgICAgICAgICBiZXN0TGFtYmRhLnNldChwLCBmaW5hbExhbWJkYVtwXSk7CisgICAgICAgICAgICBpZiAoMSArIG51bVBhcmFtcyA+IGJlc3RMYW1iZGEuc2l6ZSgpKSB7CisgICAgICAgICAgICAgIGZvciAoaW50IHAgPSBiZXN0TGFtYmRhLnNpemUoKTsgcCA8PSBudW1QYXJhbXM7ICsrcCkKKyAgICAgICAgICAgICAgICBiZXN0TGFtYmRhLmFkZChwLCBmaW5hbExhbWJkYVtwXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChtZXRyaWNTY29yZSA8IHByZXZNZXRyaWNTY29yZSkgeworICAgICAgICAgICAgcHJldk1ldHJpY1Njb3JlID0gbWV0cmljU2NvcmU7CisgICAgICAgICAgICBmb3IgKGludCBwID0gMTsgcCA8IGJlc3RMYW1iZGEuc2l6ZSgpOyArK3ApCisgICAgICAgICAgICAgIGJlc3RMYW1iZGEuc2V0KHAsIGZpbmFsTGFtYmRhW3BdKTsKKyAgICAgICAgICAgIGlmICgxICsgbnVtUGFyYW1zID4gYmVzdExhbWJkYS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgZm9yIChpbnQgcCA9IGJlc3RMYW1iZGEuc2l6ZSgpOyBwIDw9IG51bVBhcmFtczsgKytwKQorICAgICAgICAgICAgICAgIGJlc3RMYW1iZGEuYWRkKHAsIGZpbmFsTGFtYmRhW3BdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgIH0KIAogICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKGZpbmFsTGFtYmRhLmxlbmd0aCk7CiAgICAgICAvLyBmb3IoIGludCBpPTA7IGk8ZmluYWxMYW1iZGEubGVuZ3RoLTE7IGkrKyApCi0gICAgICAvLyAJICAgU3lzdGVtLm91dC5wcmludChmaW5hbExhbWJkYVtpKzFdKyIgIik7CisgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50KGZpbmFsTGFtYmRhW2krMV0rIiAiKTsKICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigpOwogCiAgICAgICAvKioqKioqKioqKioqKiBlbmQgb3B0aW1pemF0aW9uICoqKioqKioqKioqKioqLwpAQCAtMTI5MSwxMiArMTI4OSwxMiBAQAogICAgICAgYm9vbGVhbiBhbnlQYXJhbUNoYW5nZWRTaWduaWZpY2FudGx5ID0gZmFsc2U7CiAKICAgICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IG51bVBhcmFtczsgKytjKSB7Ci0JICBpZiAoZmluYWxMYW1iZGFbY10gIT0gbGFtYmRhLmdldChjKSkgewotCSAgICAgIGFueVBhcmFtQ2hhbmdlZCA9IHRydWU7Ci0JICB9Ci0JICBpZiAoTWF0aC5hYnMoZmluYWxMYW1iZGFbY10gLSBsYW1iZGEuZ2V0KGMpKSA+IHN0b3BTaWdWYWx1ZSkgewotCSAgICAgIGFueVBhcmFtQ2hhbmdlZFNpZ25pZmljYW50bHkgPSB0cnVlOwotCSAgfQorICAgICAgICBpZiAoZmluYWxMYW1iZGFbY10gIT0gbGFtYmRhLmdldChjKSkgeworICAgICAgICAgIGFueVBhcmFtQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE1hdGguYWJzKGZpbmFsTGFtYmRhW2NdIC0gbGFtYmRhLmdldChjKSkgPiBzdG9wU2lnVmFsdWUpIHsKKyAgICAgICAgICBhbnlQYXJhbUNoYW5nZWRTaWduaWZpY2FudGx5ID0gdHJ1ZTsKKyAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvLyBTeXN0ZW0uYXJyYXljb3B5KGZpbmFsTGFtYmRhLDEsbGFtYmRhLDEsbnVtUGFyYW1zKTsKQEAgLTEzMzEsMTMgKzEzMjksMTQgQEAKICAgICAgICAgICAgICsgIiBjb25zZWN1dGl2ZSBpdGVyYXRpb25zOyBleGl0aW5nIFBSTy4iLCAxKTsKICAgICAgICAgcHJpbnRsbigiIiwgMSk7CiAKLQlpZiAoIHJldHVybkJlc3QgKSB7Ci0JICAgIGZvciAoIGludCBmID0gMTsgZiA8PSBudW1QYXJhbXM7ICsrZiApCi0JCWxhbWJkYS5zZXQoZiwgYmVzdExhbWJkYS5nZXQoZikpOwotCX0gZWxzZSB7Ci0JICAgIGZvciAoIGludCBmID0gMTsgZiA8PSBudW1QYXJhbXM7ICsrZiApCi0JCWxhbWJkYS5zZXQoZiwgZmluYWxMYW1iZGFbZl0pOwotCX0KKyAgICAgICAgaWYgKHJldHVybkJlc3QpIHsKKyAgICAgICAgICAvLyBub3RlIHRoYXQgbnVtUGFyYW1zID49IGJlc3RMYW1iYS5zaXplKCktMSBoZXJlIQorICAgICAgICAgIGZvciAoaW50IGYgPSAxOyBmIDw9IGJlc3RMYW1iZGEuc2l6ZSgpIC0gMTsgKytmKQorICAgICAgICAgICAgbGFtYmRhLnNldChmLCBiZXN0TGFtYmRhLmdldChmKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpbnQgZiA9IDE7IGYgPD0gbnVtUGFyYW1zOyArK2YpCisgICAgICAgICAgICBsYW1iZGEuc2V0KGYsIGZpbmFsTGFtYmRhW2ZdKTsKKyAgICAgICAgfQogCiAgICAgICAgIGJyZWFrOyAvLyBleGl0IGZvciAoaXRlcmF0aW9uKSBsb29wIHByZWVtcHRpdmVseQogICAgICAgfQpAQCAtMTM0NywxMyArMTM0NiwxNCBAQAogICAgICAgICBwcmludGxuKCJNYXhpbXVtIG51bWJlciBvZiBQUk8gaXRlcmF0aW9ucyByZWFjaGVkOyBleGl0aW5nIFBSTy4iLCAxKTsKICAgICAgICAgcHJpbnRsbigiIiwgMSk7CiAKLQlpZiAoIHJldHVybkJlc3QgKSB7Ci0JICAgIGZvciAoIGludCBmID0gMTsgZiA8PSBudW1QYXJhbXM7ICsrZiApCi0JCWxhbWJkYS5zZXQoZiwgYmVzdExhbWJkYS5nZXQoZikpOwotCX0gZWxzZSB7Ci0JICAgIGZvciAoIGludCBmID0gMTsgZiA8PSBudW1QYXJhbXM7ICsrZiApCi0JCWxhbWJkYS5zZXQoZiwgZmluYWxMYW1iZGFbZl0pOwotCX0KKyAgICAgICAgaWYgKHJldHVybkJlc3QpIHsKKyAgICAgICAgICAvLyBub3RlIHRoYXQgbnVtUGFyYW1zID49IGJlc3RMYW1iYS5zaXplKCktMSBoZXJlIQorICAgICAgICAgIGZvciAoaW50IGYgPSAxOyBmIDw9IGJlc3RMYW1iZGEuc2l6ZSgpIC0gMTsgKytmKQorICAgICAgICAgICAgbGFtYmRhLnNldChmLCBiZXN0TGFtYmRhLmdldChmKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpbnQgZiA9IDE7IGYgPD0gbnVtUGFyYW1zOyArK2YpCisgICAgICAgICAgICBsYW1iZGEuc2V0KGYsIGZpbmFsTGFtYmRhW2ZdKTsKKyAgICAgICAgfQogCiAgICAgICAgIGJyZWFrOyAvLyBleGl0IGZvciAoaXRlcmF0aW9uKSBsb29wCiAgICAgICB9CkBAIC0xMzYxLDEwICsxMzYxLDkgQEAKICAgICAgIC8vIHVzZSB0aGUgbmV3IHd0IHZlY3RvciB0byBkZWNvZGUgdGhlIG5leHQgaXRlcmF0aW9uCiAgICAgICAvLyAoaW50ZXJwb2xhdGlvbiB3aXRoIHByZXZpb3VzIHd0IHZlY3RvcikKICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG51bVBhcmFtczsgaSsrKQotCSAgbGFtYmRhLnNldChpLCBpbnRlckNvZWYgKiBmaW5hbExhbWJkYVtpXSArICgxIC0gaW50ZXJDb2VmKSAqIGxhbWJkYS5nZXQoaSkuZG91YmxlVmFsdWUoKSk7CisgICAgICAgIGxhbWJkYS5zZXQoaSwgaW50ZXJDb2VmICogZmluYWxMYW1iZGFbaV0gKyAoMSAtIGludGVyQ29lZikgKiBsYW1iZGEuZ2V0KGkpLmRvdWJsZVZhbHVlKCkpOwogCi0gICAgICBwcmludGxuKCJOZXh0IGl0ZXJhdGlvbiB3aWxsIGRlY29kZSB3aXRoIGxhbWJkYTogIgotCSAgICAgICsgbGFtYmRhVG9TdHJpbmcobGFtYmRhKSwgMSk7CisgICAgICBwcmludGxuKCJOZXh0IGl0ZXJhdGlvbiB3aWxsIGRlY29kZSB3aXRoIGxhbWJkYTogIiArIGxhbWJkYVRvU3RyaW5nKGxhbWJkYSksIDEpOwogICAgICAgcHJpbnRsbigiIiwgMSk7CiAKICAgICAgIC8vIHByaW50TWVtb3J5VXNhZ2UoKTsKQEAgLTEzOTIsMTEgKzEzOTEsMTEgQEAKICAgcHJpdmF0ZSBTdHJpbmcgbGFtYmRhVG9TdHJpbmcoQXJyYXlMaXN0PERvdWJsZT4gbGFtYmRhQSkgewogICAgIFN0cmluZyByZXRTdHIgPSAieyI7CiAgICAgaW50IGZlYXRUb1ByaW50ID0gbnVtUGFyYW1zID4gMTUgPyAxNSA6IG51bVBhcmFtczsKLSAgICAvL3ByaW50IGF0IG1vc3QgdGhlIGZpcnN0IDE1IGZlYXR1cmVzCisgICAgLy8gcHJpbnQgYXQgbW9zdCB0aGUgZmlyc3QgMTUgZmVhdHVyZXMKIAogICAgIHJldFN0ciArPSAiKGxpc3RpbmcgdGhlIGZpcnN0ICIgKyBmZWF0VG9QcmludCArICIgbGFtYmRhcykiOwogICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IGZlYXRUb1ByaW50IC0gMTsgKytjKSB7Ci0gICAgICAgIHJldFN0ciArPSAiIiArIFN0cmluZy5mb3JtYXQoIiUuNGYiLCBsYW1iZGFBLmdldChjKS5kb3VibGVWYWx1ZSgpKSArICIsICI7CisgICAgICByZXRTdHIgKz0gIiIgKyBTdHJpbmcuZm9ybWF0KCIlLjRmIiwgbGFtYmRhQS5nZXQoYykuZG91YmxlVmFsdWUoKSkgKyAiLCAiOwogICAgIH0KICAgICByZXRTdHIgKz0gIiIgKyBTdHJpbmcuZm9ybWF0KCIlLjRmIiwgbGFtYmRhQS5nZXQobnVtUGFyYW1zKS5kb3VibGVWYWx1ZSgpKSArICJ9IjsKIApAQCAtMTU2NSw3ICsxNTY0LDggQEAKIAogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbmZpZ0ZpbGUoQXJyYXlMaXN0PERvdWJsZT4gcGFyYW1zLCBTdHJpbmcgY2ZnRmlsZU5hbWUsIFN0cmluZyB0ZW1wbGF0ZUZpbGVOYW1lKSB7CisgIHByaXZhdGUgdm9pZCBjcmVhdGVDb25maWdGaWxlKEFycmF5TGlzdDxEb3VibGU+IHBhcmFtcywgU3RyaW5nIGNmZ0ZpbGVOYW1lLAorICAgICAgU3RyaW5nIHRlbXBsYXRlRmlsZU5hbWUpIHsKICAgICB0cnkgewogICAgICAgLy8gaS5lLiBjcmVhdGUgY2ZnRmlsZU5hbWUsIHdoaWNoIGlzIHNpbWlsYXIgdG8gdGVtcGxhdGVGaWxlTmFtZSwgYnV0IHdpdGgKICAgICAgIC8vIHBhcmFtc1tdIGFzIHBhcmFtZXRlciB2YWx1ZXMKQEAgLTE1NzUsMzMgKzE1NzUsMzMgQEAKIAogICAgICAgQnVmZmVyZWRSZWFkZXIgaW5GZWF0RGVmRmlsZSA9IG51bGw7CiAgICAgICBQcmludFdyaXRlciBvdXRGZWF0RGVmRmlsZSA9IG51bGw7Ci0gICAgICBpbnQgb3JpZ0ZlYXROdW0gPSAwOyAvL2ZlYXQgbnVtIGluIHRoZSB0ZW1wbGF0ZSBmaWxlCisgICAgICBpbnQgb3JpZ0ZlYXROdW0gPSAwOyAvLyBmZWF0IG51bSBpbiB0aGUgdGVtcGxhdGUgZmlsZQogCiAgICAgICBTdHJpbmcgbGluZSA9IGluRmlsZS5yZWFkTGluZSgpOwogICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgIGludCBjX21hdGNoID0gLTE7Ci0gICAgICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gbnVtUGFyYW1zOyArK2MpIHsKLQkgICAgICBpZiAobGluZS5zdGFydHNXaXRoKFZvY2FidWxhcnkud29yZChjKSArICIgIikpIHsKLQkJICBjX21hdGNoID0gYzsKLQkJICArK29yaWdGZWF0TnVtOwotCQkgIGJyZWFrOwotCSAgICAgIH0KKyAgICAgICAgaW50IGNfbWF0Y2ggPSAtMTsKKyAgICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gbnVtUGFyYW1zOyArK2MpIHsKKyAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKFZvY2FidWxhcnkud29yZChjKSArICIgIikpIHsKKyAgICAgICAgICAgIGNfbWF0Y2ggPSBjOworICAgICAgICAgICAgKytvcmlnRmVhdE51bTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KLQkgIAotICAgICAgICAgIGlmIChjX21hdGNoID09IC0xKSB7Ci0JICAgICAgb3V0RmlsZS5wcmludGxuKGxpbmUpOwotICAgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgaWYgKCBNYXRoLmFicyhwYXJhbXMuZ2V0KGNfbWF0Y2gpLmRvdWJsZVZhbHVlKCkpID4gMWUtMjAgKQotCQkgIG91dEZpbGUucHJpbnRsbihWb2NhYnVsYXJ5LndvcmQoY19tYXRjaCkgKyAiICIgKyBwYXJhbXMuZ2V0KGNfbWF0Y2gpKTsKLSAgICAgICAgICB9Ci0JICAKLSAgICAgICAgICBsaW5lID0gaW5GaWxlLnJlYWRMaW5lKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY19tYXRjaCA9PSAtMSkgeworICAgICAgICAgIG91dEZpbGUucHJpbnRsbihsaW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoTWF0aC5hYnMocGFyYW1zLmdldChjX21hdGNoKS5kb3VibGVWYWx1ZSgpKSA+IDFlLTIwKQorICAgICAgICAgICAgb3V0RmlsZS5wcmludGxuKFZvY2FidWxhcnkud29yZChjX21hdGNoKSArICIgIiArIHBhcmFtcy5nZXQoY19tYXRjaCkpOworICAgICAgICB9CisKKyAgICAgICAgbGluZSA9IGluRmlsZS5yZWFkTGluZSgpOwogICAgICAgfQogCi0gICAgICAvL25vdyBhcHBlbmQgd2VpZ2h0cyBvZiBuZXcgZmVhdHVyZXMKLSAgICAgIGZvciAoaW50IGMgPSBvcmlnRmVhdE51bSsxOyBjIDw9IG51bVBhcmFtczsgKytjKSB7Ci0JICBpZiAoIE1hdGguYWJzKHBhcmFtcy5nZXQoYykuZG91YmxlVmFsdWUoKSkgPiAxZS0yMCApCi0JICAgICAgb3V0RmlsZS5wcmludGxuKFZvY2FidWxhcnkud29yZChjKSArICIgIiArIHBhcmFtcy5nZXQoYykpOworICAgICAgLy8gbm93IGFwcGVuZCB3ZWlnaHRzIG9mIG5ldyBmZWF0dXJlcworICAgICAgZm9yIChpbnQgYyA9IG9yaWdGZWF0TnVtICsgMTsgYyA8PSBudW1QYXJhbXM7ICsrYykgeworICAgICAgICBpZiAoTWF0aC5hYnMocGFyYW1zLmdldChjKS5kb3VibGVWYWx1ZSgpKSA+IDFlLTIwKQorICAgICAgICAgIG91dEZpbGUucHJpbnRsbihWb2NhYnVsYXJ5LndvcmQoYykgKyAiICIgKyBwYXJhbXMuZ2V0KGMpKTsKICAgICAgIH0KIAogICAgICAgaW5GaWxlLmNsb3NlKCk7CkBAIC0xNjUwLDcgKzE2NTAsMTIgQEAKICAgICAgIGlmICghaXNPcHRpbWl6YWJsZVtjXSkgeyAvLyBza2lwIG5leHQgdHdvIHZhbHVlcwogICAgICAgICBkdW1teSA9IGluRmlsZV9pbml0Lm5leHQoKTsKICAgICAgICAgZHVtbXkgPSBpbkZpbGVfaW5pdC5uZXh0KCk7CisgICAgICAgIGR1bW15ID0gaW5GaWxlX2luaXQubmV4dCgpOworICAgICAgICBkdW1teSA9IGluRmlsZV9pbml0Lm5leHQoKTsKICAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHRoZSBuZXh0IHR3byB2YWx1ZXMgYXJlIG5vdCB1c2VkLCBvbmx5IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBaTUVSVCdzIHBhcmFtcyBmaWxlIGZvcm1hdAorICAgICAgICBkdW1teSA9IGluRmlsZV9pbml0Lm5leHQoKTsKKyAgICAgICAgZHVtbXkgPSBpbkZpbGVfaW5pdC5uZXh0KCk7CiAgICAgICAgIC8vIHNldCBtaW5SYW5kVmFsdWVbY10gYW5kIG1heFJhbmRWYWx1ZVtjXSAocmFuZ2UgZm9yIHJhbmRvbSB2YWx1ZXMpCiAgICAgICAgIGR1bW15ID0gaW5GaWxlX2luaXQubmV4dCgpOwogICAgICAgICBpZiAoZHVtbXkuZXF1YWxzKCItSW5mIikgfHwgZHVtbXkuZXF1YWxzKCIrSW5mIikpIHsKQEAgLTE2NzUsNyArMTY4MCw3IEBACiAgICAgICAgICAgU3lzdGVtLmV4aXQoMjEpOwogICAgICAgICB9CiAKLQkvLyBjaGVjayBmb3Igb2RkIHZhbHVlcworICAgICAgICAvLyBjaGVjayBmb3Igb2RkIHZhbHVlcwogICAgICAgICBpZiAobWluUmFuZFZhbHVlW2NdID09IG1heFJhbmRWYWx1ZVtjXSkgewogICAgICAgICAgIHByaW50bG4oIldhcm5pbmc6IGxhbWJkYVsiICsgYyArICJdIGhhcyAiICsgIm1pblJhbmRWYWx1ZSA9IG1heFJhbmRWYWx1ZSA9ICIKICAgICAgICAgICAgICAgKyBtaW5SYW5kVmFsdWVbY10gKyAiLiIsIDEpOwpAQCAtMTk2OSw3ICsxOTc0LDcgQEAKICAgICAgIHRyeSB7CiAgICAgICAgIFByaW50V3JpdGVyIG91dEZpbGVfbGFtYmRhcyA9IG5ldyBQcmludFdyaXRlcihmaW5hbExhbWJkYUZpbGVOYW1lKTsKICAgICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gbnVtUGFyYW1zOyArK2MpIHsKLQkgICAgb3V0RmlsZV9sYW1iZGFzLnByaW50bG4oVm9jYWJ1bGFyeS53b3JkKGMpICsgIiB8fHwgIiArIGxhbWJkYS5nZXQoYykuZG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgb3V0RmlsZV9sYW1iZGFzLnByaW50bG4oVm9jYWJ1bGFyeS53b3JkKGMpICsgIiB8fHwgIiArIGxhbWJkYS5nZXQoYykuZG91YmxlVmFsdWUoKSk7CiAgICAgICAgIH0KICAgICAgICAgb3V0RmlsZV9sYW1iZGFzLmNsb3NlKCk7CiAKQEAgLTIwNTAsOCArMjA1NSw3IEBACiAgICAgICAgICAgaWYgKHBhcmFtQS5sZW5ndGggPT0gMiAmJiBwYXJhbUFbMF0uY2hhckF0KDApID09ICctJykgewogICAgICAgICAgICAgYXJnc1ZlY3Rvci5hZGQocGFyYW1BWzBdKTsKICAgICAgICAgICAgIGFyZ3NWZWN0b3IuYWRkKHBhcmFtQVsxXSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwYXJhbUEubGVuZ3RoID4gMgotICAgICAgICAgICAgICAmJiAocGFyYW1BWzBdLmVxdWFscygiLW0iKSB8fCBwYXJhbUFbMF0uZXF1YWxzKCItZG9jU2V0IikpKSB7CisgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbUEubGVuZ3RoID4gMiAmJiAocGFyYW1BWzBdLmVxdWFscygiLW0iKSB8fCBwYXJhbUFbMF0uZXF1YWxzKCItZG9jU2V0IikpKSB7CiAgICAgICAgICAgICAvLyAtbSAobWV0cmljTmFtZSksIC1kb2NTZXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBleHRyYSBvcHRpbm9zCiAgICAgICAgICAgICBmb3IgKGludCBvcHQgPSAwOyBvcHQgPCBwYXJhbUEubGVuZ3RoOyArK29wdCkgewogICAgICAgICAgICAgICBhcmdzVmVjdG9yLmFkZChwYXJhbUFbb3B0XSk7CkBAIC0yMzI0LDE3ICsyMzI4LDE3IEBACiAgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItWGkiKSkgewogICAgICAgICBYaSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOwogICAgICAgfQotICAgICAgLy9yZXR1cm4gdGhlIGJlc3Qgd2VpZ2h0IGR1cmluZyB0dW5pbmcgb3Igbm90CisgICAgICAvLyByZXR1cm4gdGhlIGJlc3Qgd2VpZ2h0IGR1cmluZyB0dW5pbmcgb3Igbm90CiAgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItcmV0dXJuQmVzdCIpKSB7Ci0JICBpbnQgcmV0QmVzdCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpICsgMV0pOwotCSAgaWYocmV0QmVzdCA9PSAxKQotCSAgICAgIHJldHVybkJlc3QgPSB0cnVlOwotCSAgZWxzZSBpZihyZXRCZXN0ID09IDApCi0JICAgICAgcmV0dXJuQmVzdCA9IGZhbHNlOwotCSAgZWxzZSB7Ci0JICAgICAgcHJpbnRsbigiLXJldHVybkJlc3QgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOwotCSAgICAgIFN5c3RlbS5leGl0KDEwKTsKLQkgIH0KKyAgICAgICAgaW50IHJldEJlc3QgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgaWYgKHJldEJlc3QgPT0gMSkKKyAgICAgICAgICByZXR1cm5CZXN0ID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAocmV0QmVzdCA9PSAwKQorICAgICAgICAgIHJldHVybkJlc3QgPSBmYWxzZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcHJpbnRsbigiLXJldHVybkJlc3QgbXVzdCBiZSBlaXRoZXIgMCBvciAxLiIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKKyAgICAgICAgfQogICAgICAgfQogICAgICAgLy8gaW50ZXJwb2xhdGlvbiBjb2VmZmljaWVudCBiZXR3ZWVuIGN1cnJlbnQgJiBwcmV2aW91cyB3ZWlnaHRzCiAgICAgICBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCItaW50ZXJDb2VmIikpIHsKQEAgLTI5ODgsNyArMjk5Miw3IEBACiAgIH0KIAogICBwcml2YXRlIEFycmF5TGlzdDxEb3VibGU+IHJhbmRvbUxhbWJkYSgpIHsKLSAgICBBcnJheUxpc3Q8RG91YmxlPiByZXRMYW1iZGEgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oMStudW1QYXJhbXMpOworICAgIEFycmF5TGlzdDxEb3VibGU+IHJldExhbWJkYSA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigxICsgbnVtUGFyYW1zKTsKIAogICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IG51bVBhcmFtczsgKytjKSB7CiAgICAgICBpZiAoaXNPcHRpbWl6YWJsZVtjXSkgewpAQCAtMjk5OCw3ICszMDAyLDcgQEAKICAgICAgICAgcmFuZFZhbCA9IG1pblJhbmRWYWx1ZVtjXSArIHJhbmRWYWw7IC8vIG51bWJlciBpbiBbbWluLG1heF0KICAgICAgICAgcmV0TGFtYmRhLnNldChjLCByYW5kVmFsKTsKICAgICAgIH0gZWxzZSB7Ci0JICByZXRMYW1iZGEuc2V0KGMsIGRlZmF1bHRMYW1iZGFbY10pOworICAgICAgICByZXRMYW1iZGEuc2V0KGMsIGRlZmF1bHRMYW1iZGFbY10pOwogICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS90b29scy9HcmFtbWFyUGFja2VyLmphdmEgYi9zcmMvam9zaHVhL3Rvb2xzL0dyYW1tYXJQYWNrZXIuamF2YQppbmRleCA3MjI4MGUyLi5mYjEzZWU0IDEwMDY0NAotLS0gYS9zcmMvam9zaHVhL3Rvb2xzL0dyYW1tYXJQYWNrZXIuamF2YQorKysgYi9zcmMvam9zaHVhL3Rvb2xzL0dyYW1tYXJQYWNrZXIuamF2YQpAQCAtMSw1ICsxLDcgQEAKIHBhY2thZ2Ugam9zaHVhLnRvb2xzOwogCitpbXBvcnQgc3RhdGljIGpvc2h1YS5kZWNvZGVyLmZmLnRtLnBhY2tlZC5QYWNrZWRHcmFtbWFyLlZPQ0FCVUxBUllfRklMRU5BTUU7CisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xMiw3ICsxNCw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwpAQCAtMjgsMTIgKzI5LDEyIEBACiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoR3JhbW1hclBhY2tlci5jbGFzcy5nZXROYW1lKCkpOwogCi0gIC8vIEFwcHJveGltYXRlIG1heGltdW0gc2l6ZSBvZiBhIHNsaWNlIGluIG51bWJlciBvZiBydWxlcwotICBwcml2YXRlIHN0YXRpYyBpbnQgU0xJQ0VfU0laRTsKICAgLy8gU2l6ZSBsaW1pdCBmb3Igc2xpY2UgaW4gYnl0ZXMuCi0gIHByaXZhdGUgc3RhdGljIGludCBEQVRBX1NJWkVfTElNSVQ7CisgIHByaXZhdGUgc3RhdGljIGludCBEQVRBX1NJWkVfTElNSVQgPSAoaW50KSAoSW50ZWdlci5NQVhfVkFMVUUgKiAwLjgpOwogICAvLyBFc3RpbWF0ZWQgYXZlcmFnZSBudW1iZXIgb2YgZmVhdHVyZSBlbnRyaWVzIGZvciBvbmUgcnVsZS4KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IERBVEFfU0laRV9FU1RJTUFURTsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IERBVEFfU0laRV9FU1RJTUFURSA9IDIwOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfV09SRFNfU0VQQVJBVE9SID0gIiB8fHwgIjsKIAogICAvLyBPdXRwdXQgZGlyZWN0b3J5IG5hbWUuCiAgIHByaXZhdGUgU3RyaW5nIG91dHB1dDsKQEAgLTQxLDYgKzQyLDE3IEBACiAgIC8vIElucHV0IGdyYW1tYXIgdG8gYmUgcGFja2VkLgogICBwcml2YXRlIFN0cmluZyBncmFtbWFyOwogCisgIHB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hcigpIHsKKyAgICByZXR1cm4gZ3JhbW1hcjsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CisgICAgcmV0dXJuIG91dHB1dDsKKyAgfQorCisgIC8vIEFwcHJveGltYXRlIG1heGltdW0gc2l6ZSBvZiBhIHNsaWNlIGluIG51bWJlciBvZiBydWxlcworICBwcml2YXRlIGludCBhcHByb3hpbWF0ZU1heGltdW1TbGljZVNpemU7CisKICAgcHJpdmF0ZSBib29sZWFuIGxhYmVsZWQ7CiAKICAgcHJpdmF0ZSBib29sZWFuIHBhY2tBbGlnbm1lbnRzOwpAQCAtNTQsMjAgKzY2LDE2IEBACiAKICAgcHJpdmF0ZSBpbnQgbWF4X3NvdXJjZV9sZW47CiAKLSAgc3RhdGljIHsKLSAgICBTTElDRV9TSVpFID0gMTAwMDAwMDsKLSAgICBEQVRBX1NJWkVfTElNSVQgPSAoaW50KSAoSW50ZWdlci5NQVhfVkFMVUUgKiAwLjgpOwotICAgIERBVEFfU0laRV9FU1RJTUFURSA9IDIwOwotICB9Ci0KICAgcHVibGljIEdyYW1tYXJQYWNrZXIoU3RyaW5nIGdyYW1tYXJfZmlsZW5hbWUsIFN0cmluZyBjb25maWdfZmlsZW5hbWUsIFN0cmluZyBvdXRwdXRfZmlsZW5hbWUsCi0gICAgICBTdHJpbmcgYWxpZ25tZW50c19maWxlbmFtZSwgU3RyaW5nIGZlYXR1cmVkdW1wX2ZpbGVuYW1lLCBib29sZWFuIGdyYW1tYXJfYWxpZ25tZW50cykKKyAgICAgIFN0cmluZyBhbGlnbm1lbnRzX2ZpbGVuYW1lLCBTdHJpbmcgZmVhdHVyZWR1bXBfZmlsZW5hbWUsIGJvb2xlYW4gZ3JhbW1hcl9hbGlnbm1lbnRzLAorICAgICAgaW50IGFwcHJveGltYXRlTWF4aW11bVNsaWNlU2l6ZSkKICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgdGhpcy5sYWJlbGVkID0gdHJ1ZTsKICAgICB0aGlzLmdyYW1tYXIgPSBncmFtbWFyX2ZpbGVuYW1lOwogICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0X2ZpbGVuYW1lOwogICAgIHRoaXMuZHVtcCA9IGZlYXR1cmVkdW1wX2ZpbGVuYW1lOwogICAgIHRoaXMuZ3JhbW1hckFsaWdubWVudHMgPSBncmFtbWFyX2FsaWdubWVudHM7CisgICAgdGhpcy5hcHByb3hpbWF0ZU1heGltdW1TbGljZVNpemUgPSBhcHByb3hpbWF0ZU1heGltdW1TbGljZVNpemU7CiAgICAgdGhpcy5tYXhfc291cmNlX2xlbiA9IDA7CiAKICAgICAvLyBUT0RPOiBBbHdheXMgb3BlbiBlbmNvZGVyIGNvbmZpZz8gVGhpcyBpcyBkZWJhdGFibGUuCkBAIC03OSw3ICs4Nyw3IEBACiAgICAgICBsb2dnZXIuaW5mbygiTm8gYWxpZ25tZW50cyBmaWxlIG9yIGdyYW1tYXIgc3BlY2lmaWVkLCBza2lwcGluZy4iKTsKICAgICB9IGVsc2UgaWYgKGFsaWdubWVudHMgIT0gbnVsbCAmJiAhbmV3IEZpbGUoYWxpZ25tZW50c19maWxlbmFtZSkuZXhpc3RzKCkpIHsKICAgICAgIGxvZ2dlci5zZXZlcmUoIkFsaWdubWVudHMgZmlsZSBkb2VzIG5vdCBleGlzdDogIiArIGFsaWdubWVudHMpOwotICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKICAgICB9CiAKICAgICBpZiAoY29uZmlnX2ZpbGVuYW1lICE9IG51bGwpIHsKQEAgLTg4LDEyICs5NiwxMyBAQAogICAgIH0gZWxzZSB7CiAgICAgICBsb2dnZXIuaW5mbygiTm8gY29uZmlnIHNwZWNpZmllZC4gQXR0ZW1wdGluZyBhdXRvLWRldGVjdGlvbiBvZiBmZWF0dXJlIHR5cGVzLiIpOwogICAgIH0KKyAgICBsb2dnZXIuaW5mbyhTdHJpbmcuZm9ybWF0KCJBcHByb3hpbWF0ZSBtYXhpbXVtIHNsaWNlIHNpemUgKGluICMgb2YgcnVsZXMpIHNldCB0byAlcyIsIGFwcHJveGltYXRlTWF4aW11bVNsaWNlU2l6ZSkpOwogCiAgICAgRmlsZSB3b3JraW5nX2RpciA9IG5ldyBGaWxlKG91dHB1dCk7CiAgICAgd29ya2luZ19kaXIubWtkaXIoKTsKICAgICBpZiAoIXdvcmtpbmdfZGlyLmV4aXN0cygpKSB7CiAgICAgICBsb2dnZXIuc2V2ZXJlKCJGYWlsZWQgY3JlYXRpbmcgb3V0cHV0IGRpcmVjdG9yeS4iKTsKLSAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgfQogICB9CiAKQEAgLTExMCwxMSArMTE5LDExIEBACiAKICAgICAgIGlmIChmaWVsZHMubGVuZ3RoIDwgMikgewogICAgICAgICBsb2dnZXIuc2V2ZXJlKCJJbmNvbXBsZXRlIGxpbmUgaW4gY29uZmlnLiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgICB9CiAgICAgICBpZiAoInNsaWNlX3NpemUiLmVxdWFscyhmaWVsZHNbMF0pKSB7CiAgICAgICAgIC8vIE51bWJlciBvZiByZWNvcmRzIHRvIGNvbmN1cnJlbnRseSBsb2FkIGludG8gbWVtb3J5IGZvciBzb3J0aW5nLgotICAgICAgICBTTElDRV9TSVpFID0gSW50ZWdlci5wYXJzZUludChmaWVsZHNbMV0pOworICAgICAgICBhcHByb3hpbWF0ZU1heGltdW1TbGljZVNpemUgPSBJbnRlZ2VyLnBhcnNlSW50KGZpZWxkc1sxXSk7CiAgICAgICB9CiAgICAgfQogICAgIHJlYWRlci5jbG9zZSgpOwpAQCAtMTUwLDExICsxNTksNyBAQAogICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIGVuY29kaW5nLiIpOwogICAgIHR5cGVzLndyaXRlKG91dHB1dCArIEZpbGUuc2VwYXJhdG9yICsgImVuY29kaW5nIik7CiAKLSAgICBsb2dnZXIuaW5mbygiRnJlZXppbmcgdm9jYWIuIik7Ci0gICAgVm9jYWJ1bGFyeS5mcmVlemUoKTsKLQotICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIHZvY2FiLiIpOwotICAgIFZvY2FidWxhcnkud3JpdGUob3V0cHV0ICsgRmlsZS5zZXBhcmF0b3IgKyAidm9jYWJ1bGFyeSIpOworICAgIHdyaXRlVm9jYWJ1bGFyeSgpOwogCiAgICAgU3RyaW5nIGNvbmZpZ0ZpbGUgPSBvdXRwdXQgKyBGaWxlLnNlcGFyYXRvciArICJjb25maWciOwogICAgIGxvZ2dlci5pbmZvKFN0cmluZy5mb3JtYXQoIldyaXRpbmcgY29uZmlnIHRvICclcyciLCBjb25maWdGaWxlKSk7CkBAIC0xNzAsMTMgKzE3NSwxMiBAQAogICAgIGVuY29kZXJDb25maWcubG9hZChvdXRwdXQgKyBGaWxlLnNlcGFyYXRvciArICJlbmNvZGluZyIpOwogCiAgICAgbG9nZ2VyLmluZm8oIkJlZ2lubmluZyBwYWNraW5nIHBhc3MuIik7Ci0gICAgUXVldWU8UGFja2luZ0ZpbGVUdXBsZT4gc2xpY2VzID0gbmV3IFByaW9yaXR5UXVldWU8UGFja2luZ0ZpbGVUdXBsZT4oKTsKICAgICAvLyBBY3R1YWwgYmluYXJpemF0aW9uIHBhc3MuIFNsaWNlIGFuZCBwYWNrIHNvdXJjZSwgdGFyZ2V0IGFuZCBkYXRhLgogICAgIGdyYW1tYXJfcmVhZGVyID0gbmV3IExpbmVSZWFkZXIoZ3JhbW1hcik7CiAKICAgICBpZiAocGFja0FsaWdubWVudHMgJiYgIWdyYW1tYXJBbGlnbm1lbnRzKQogICAgICAgYWxpZ25tZW50X3JlYWRlciA9IG5ldyBMaW5lUmVhZGVyKGFsaWdubWVudHMpOwotICAgIGJpbmFyaXplKGdyYW1tYXJfcmVhZGVyLCBhbGlnbm1lbnRfcmVhZGVyLCBzbGljZXMpOworICAgIGJpbmFyaXplKGdyYW1tYXJfcmVhZGVyLCBhbGlnbm1lbnRfcmVhZGVyKTsKICAgICBsb2dnZXIuaW5mbygiUGFja2luZyBjb21wbGV0ZS4iKTsKIAogICAgIGxvZ2dlci5pbmZvKCJQYWNrZWQgZ3JhbW1hciBpbjogIiArIG91dHB1dCk7CkBAIC0yMjAsMTggKzIyNCwyMSBAQAogCiAgICAgICBWb2NhYnVsYXJ5LmlkKGxocyk7CiAgICAgICB0cnkgewotICAgICAgICAvLyBBZGQgc3ltYm9scyB0byB2b2NhYnVsYXJ5LgorICAgICAgICAvKiBBZGQgc3ltYm9scyB0byB2b2NhYnVsYXJ5LgorICAgICAgICAgKiBOT1RFOiBJbiBjYXNlIG9mIG5vbnRlcm1pbmFscywgd2UgYWRkIGJvdGggc3RyaXBwZWQgdmVyc2lvbnMgKCJbWF0iKQorICAgICAgICAgKiBhbmQgIltYLDFdIiB0byB0aGUgdm9jYWJ1bGFyeS4KKyAgICAgICAgICovCiAgICAgICAgIGZvciAoU3RyaW5nIHNvdXJjZV93b3JkIDogc291cmNlKSB7Ci0gICAgICAgICAgaWYgKEZvcm1hdFV0aWxzLmlzTm9udGVybWluYWwoc291cmNlX3dvcmQpKQotICAgICAgICAgICAgVm9jYWJ1bGFyeS5pZChGb3JtYXRVdGlscy5zdHJpcE50KHNvdXJjZV93b3JkKSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgVm9jYWJ1bGFyeS5pZChzb3VyY2Vfd29yZCk7CisgICAgICAgICAgVm9jYWJ1bGFyeS5pZChzb3VyY2Vfd29yZCk7CisgICAgICAgICAgaWYgKEZvcm1hdFV0aWxzLmlzTm9udGVybWluYWwoc291cmNlX3dvcmQpKSB7CisgICAgICAgICAgICBWb2NhYnVsYXJ5LmlkKEZvcm1hdFV0aWxzLnN0cmlwTm9uVGVybWluYWxJbmRleChzb3VyY2Vfd29yZCkpOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRfd29yZCA6IHRhcmdldCkgewotICAgICAgICAgIGlmIChGb3JtYXRVdGlscy5pc05vbnRlcm1pbmFsKHRhcmdldF93b3JkKSkKLSAgICAgICAgICAgIFZvY2FidWxhcnkuaWQoRm9ybWF0VXRpbHMuc3RyaXBOdCh0YXJnZXRfd29yZCkpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIFZvY2FidWxhcnkuaWQodGFyZ2V0X3dvcmQpOworICAgICAgICAgIFZvY2FidWxhcnkuaWQodGFyZ2V0X3dvcmQpOworICAgICAgICAgIGlmIChGb3JtYXRVdGlscy5pc05vbnRlcm1pbmFsKHRhcmdldF93b3JkKSkgeworICAgICAgICAgICAgVm9jYWJ1bGFyeS5pZChGb3JtYXRVdGlscy5zdHJpcE5vblRlcm1pbmFsSW5kZXgodGFyZ2V0X3dvcmQpKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5TdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKFN0cmluZy5mb3JtYXQoIiogU2tpcHBpbmcgYmFkIGdyYW1tYXIgbGluZSAnJXMnIiwgbGluZSkpOwpAQCAtMjU1LDE0ICsyNjIsMjIgQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIHZvaWQgYmluYXJpemUoTGluZVJlYWRlciBncmFtbWFyX3JlYWRlciwgTGluZVJlYWRlciBhbGlnbm1lbnRfcmVhZGVyLAotICAgICAgUXVldWU8UGFja2luZ0ZpbGVUdXBsZT4gc2xpY2VzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAvKioKKyAgICogUmV0dXJucyBhIFN0cmluZyBlbmNvZGluZyB0aGUgZmlyc3QgdHdvIHNvdXJjZSB3b3Jkcy4KKyAgICogSWYgdGhlcmUgaXMgb25seSBvbmUgc291cmNlIHdvcmQsIHVzZSBlbXB0eSBzdHJpbmcgZm9yIHRoZSBzZWNvbmQuCisgICAqLworICBwcml2YXRlIFN0cmluZyBnZXRGaXJzdFR3b1NvdXJjZVdvcmRzKGZpbmFsIFN0cmluZ1tdIHNvdXJjZV93b3JkcykgeworICAgIHJldHVybiBzb3VyY2Vfd29yZHNbMF0gKyBTT1VSQ0VfV09SRFNfU0VQQVJBVE9SICsgKChzb3VyY2Vfd29yZHMubGVuZ3RoID4gMSkgPyBzb3VyY2Vfd29yZHNbMV0gOiAiIik7CisgIH0KKworICBwcml2YXRlIHZvaWQgYmluYXJpemUoTGluZVJlYWRlciBncmFtbWFyX3JlYWRlciwgTGluZVJlYWRlciBhbGlnbm1lbnRfcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGludCBjb3VudGVyID0gMDsKICAgICBpbnQgc2xpY2VfY291bnRlciA9IDA7CiAgICAgaW50IG51bV9zbGljZXMgPSAwOwogCiAgICAgYm9vbGVhbiByZWFkeV90b19mbHVzaCA9IGZhbHNlOwotICAgIFN0cmluZyBmaXJzdF9zb3VyY2Vfd29yZCA9IG51bGw7CisgICAgLy8gdG8gZGV0ZXJtaW5lIHdoZW4gZmx1c2hpbmcgaXMgcG9zc2libGUKKyAgICBTdHJpbmcgcHJldl9maXJzdF90d29fc291cmNlX3dvcmRzID0gbnVsbDsKIAogICAgIFBhY2tpbmdUcmllPFNvdXJjZVZhbHVlPiBzb3VyY2VfdHJpZSA9IG5ldyBQYWNraW5nVHJpZTxTb3VyY2VWYWx1ZT4oKTsKICAgICBQYWNraW5nVHJpZTxUYXJnZXRWYWx1ZT4gdGFyZ2V0X3RyaWUgPSBuZXcgUGFja2luZ1RyaWU8VGFyZ2V0VmFsdWU+KCk7CkBAIC0zMDYsMjMgKzMyMSwzMyBAQAogCiAgICAgICAvLyBSZWFjaGVkIHNsaWNlIGxpbWl0IHNpemUsIGluZGljYXRlIHRoYXQgd2UncmUgY2xvc2luZyB1cC4KICAgICAgIGlmICghcmVhZHlfdG9fZmx1c2gKLSAgICAgICAgICAmJiAoc2xpY2VfY291bnRlciA+IFNMSUNFX1NJWkUgfHwgZmVhdHVyZV9idWZmZXIub3ZlcmZsb3dpbmcoKSB8fCAocGFja0FsaWdubWVudHMgJiYgYWxpZ25tZW50X2J1ZmZlcgotICAgICAgICAgICAgICAub3ZlcmZsb3dpbmcoKSkpKSB7CisgICAgICAgICAgJiYgKHNsaWNlX2NvdW50ZXIgPiBhcHByb3hpbWF0ZU1heGltdW1TbGljZVNpemUKKyAgICAgICAgICAgICAgfHwgZmVhdHVyZV9idWZmZXIub3ZlcmZsb3dpbmcoKQorICAgICAgICAgICAgICB8fCAocGFja0FsaWdubWVudHMgJiYgYWxpZ25tZW50X2J1ZmZlci5vdmVyZmxvd2luZygpKSkpIHsKICAgICAgICAgcmVhZHlfdG9fZmx1c2ggPSB0cnVlOwotICAgICAgICBmaXJzdF9zb3VyY2Vfd29yZCA9IHNvdXJjZV93b3Jkc1swXTsKKyAgICAgICAgLy8gc3RvcmUgdGhlIGZpcnN0IHR3byBzb3VyY2Ugd29yZHMgd2hlbiBzbGljZSBzaXplIGxpbWl0IHdhcyByZWFjaGVkCisgICAgICAgIHByZXZfZmlyc3RfdHdvX3NvdXJjZV93b3JkcyA9IGdldEZpcnN0VHdvU291cmNlV29yZHMoc291cmNlX3dvcmRzKTsKICAgICAgIH0KLSAgICAgIC8vIEZpbmlzaGVkIGNsb3NpbmcgdXAuCi0gICAgICBpZiAocmVhZHlfdG9fZmx1c2ggJiYgIWZpcnN0X3NvdXJjZV93b3JkLmVxdWFscyhzb3VyY2Vfd29yZHNbMF0pKSB7Ci0gICAgICAgIHNsaWNlcy5hZGQoZmx1c2goc291cmNlX3RyaWUsIHRhcmdldF90cmllLCBmZWF0dXJlX2J1ZmZlciwgYWxpZ25tZW50X2J1ZmZlciwgbnVtX3NsaWNlcykpOwotICAgICAgICBzb3VyY2VfdHJpZS5jbGVhcigpOwotICAgICAgICB0YXJnZXRfdHJpZS5jbGVhcigpOwotICAgICAgICBmZWF0dXJlX2J1ZmZlci5jbGVhcigpOwotICAgICAgICBpZiAocGFja0FsaWdubWVudHMpCi0gICAgICAgICAgYWxpZ25tZW50X2J1ZmZlci5jbGVhcigpOworICAgICAgLy8gcmVhZHkgdG8gZmx1c2gKKyAgICAgIGlmIChyZWFkeV90b19mbHVzaCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZmlyc3RfdHdvX3NvdXJjZV93b3JkcyA9IGdldEZpcnN0VHdvU291cmNlV29yZHMoc291cmNlX3dvcmRzKTsKKyAgICAgICAgLy8gdGhlIGdyYW1tYXIgY2FuIG9ubHkgYmUgcGFydGl0aW9uZWQgYXQgdGhlIGxldmVsIG9mIGZpcnN0IHR3byBzb3VyY2Ugd29yZCBjaGFuZ2VzLgorICAgICAgICAvLyBUaHVzLCB3ZSBjYW4gb25seSBmbHVzaCBpZiB0aGUgY3VycmVudCBmaXJzdCB0d28gc291cmNlIHdvcmRzIGRpZmZlciBmcm9tIHRoZSBvbmVzCisgICAgICAgIC8vIHdoZW4gdGhlIHNsaWNlIHNpemUgbGltaXQgd2FzIHJlYWNoZWQuCisgICAgICAgIGlmICghZmlyc3RfdHdvX3NvdXJjZV93b3Jkcy5lcXVhbHMocHJldl9maXJzdF90d29fc291cmNlX3dvcmRzKSkgeworICAgICAgICAgIGxvZ2dlci53YXJuaW5nKFN0cmluZy5mb3JtYXQoInJlYWR5IHRvIGZsdXNoIGFuZCBmaXJzdCB0d28gd29yZHMgaGF2ZSBjaGFuZ2VkICglcyB2cy4gJXMpIiwgcHJldl9maXJzdF90d29fc291cmNlX3dvcmRzLCBmaXJzdF90d29fc291cmNlX3dvcmRzKSk7CisgICAgICAgICAgbG9nZ2VyLmluZm8oU3RyaW5nLmZvcm1hdCgiZmx1c2hpbmcgJWQgcnVsZXMgdG8gc2xpY2UuIiwgc2xpY2VfY291bnRlcikpOworICAgICAgICAgIGZsdXNoKHNvdXJjZV90cmllLCB0YXJnZXRfdHJpZSwgZmVhdHVyZV9idWZmZXIsIGFsaWdubWVudF9idWZmZXIsIG51bV9zbGljZXMpOworICAgICAgICAgIHNvdXJjZV90cmllLmNsZWFyKCk7CisgICAgICAgICAgdGFyZ2V0X3RyaWUuY2xlYXIoKTsKKyAgICAgICAgICBmZWF0dXJlX2J1ZmZlci5jbGVhcigpOworICAgICAgICAgIGlmIChwYWNrQWxpZ25tZW50cykKKyAgICAgICAgICAgIGFsaWdubWVudF9idWZmZXIuY2xlYXIoKTsKIAotICAgICAgICBudW1fc2xpY2VzKys7Ci0gICAgICAgIHNsaWNlX2NvdW50ZXIgPSAwOwotICAgICAgICByZWFkeV90b19mbHVzaCA9IGZhbHNlOworICAgICAgICAgIG51bV9zbGljZXMrKzsKKyAgICAgICAgICBzbGljZV9jb3VudGVyID0gMDsKKyAgICAgICAgICByZWFkeV90b19mbHVzaCA9IGZhbHNlOworICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIGludCBhbGlnbm1lbnRfaW5kZXggPSAtMTsKQEAgLTM4Niw3ICs0MTEsNyBAQAogICAgICAgaW50W10gc291cmNlID0gbmV3IGludFtzb3VyY2Vfd29yZHMubGVuZ3RoXTsKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlX3dvcmRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgIGlmIChGb3JtYXRVdGlscy5pc05vbnRlcm1pbmFsKHNvdXJjZV93b3Jkc1tpXSkpCi0gICAgICAgICAgc291cmNlW2ldID0gVm9jYWJ1bGFyeS5pZChGb3JtYXRVdGlscy5zdHJpcE50KHNvdXJjZV93b3Jkc1tpXSkpOworICAgICAgICAgIHNvdXJjZVtpXSA9IFZvY2FidWxhcnkuaWQoRm9ybWF0VXRpbHMuc3RyaXBOb25UZXJtaW5hbEluZGV4KHNvdXJjZV93b3Jkc1tpXSkpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgc291cmNlW2ldID0gVm9jYWJ1bGFyeS5pZChzb3VyY2Vfd29yZHNbaV0pOwogICAgICAgfQpAQCAtNDA0LDcgKzQyOSw4IEBACiAgICAgICB9CiAgICAgICB0YXJnZXRfdHJpZS5hZGQodGFyZ2V0LCB0dik7CiAgICAgfQotICAgIHNsaWNlcy5hZGQoZmx1c2goc291cmNlX3RyaWUsIHRhcmdldF90cmllLCBmZWF0dXJlX2J1ZmZlciwgYWxpZ25tZW50X2J1ZmZlciwgbnVtX3NsaWNlcykpOworICAgIC8vIGZsdXNoIGxhc3Qgc2xpY2UgYW5kIGNsZWFyIGJ1ZmZlcnMKKyAgICBmbHVzaChzb3VyY2VfdHJpZSwgdGFyZ2V0X3RyaWUsIGZlYXR1cmVfYnVmZmVyLCBhbGlnbm1lbnRfYnVmZmVyLCBudW1fc2xpY2VzKTsKICAgfQogCiAgIC8qKgpAQCAtNDIxLDcgKzQ0Nyw3IEBACiAgICAqIEBwYXJhbSBpZAogICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAqLwotICBwcml2YXRlIFBhY2tpbmdGaWxlVHVwbGUgZmx1c2goUGFja2luZ1RyaWU8U291cmNlVmFsdWU+IHNvdXJjZV90cmllLAorICBwcml2YXRlIHZvaWQgZmx1c2goUGFja2luZ1RyaWU8U291cmNlVmFsdWU+IHNvdXJjZV90cmllLAogICAgICAgUGFja2luZ1RyaWU8VGFyZ2V0VmFsdWU+IHRhcmdldF90cmllLCBGZWF0dXJlQnVmZmVyIGZlYXR1cmVfYnVmZmVyLAogICAgICAgQWxpZ25tZW50QnVmZmVyIGFsaWdubWVudF9idWZmZXIsIGludCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAvLyBNYWtlIGEgc2xpY2Ugb2JqZWN0IGZvciB0aGlzIHBpZWNlIG9mIHRoZSBncmFtbWFyLgpAQCAtNTQ2LDc0ICs1NzIsMTIgQEAKICAgICBmZWF0dXJlX3N0cmVhbS5jbG9zZSgpOwogICAgIGlmIChwYWNrQWxpZ25tZW50cykKICAgICAgIGFsaWdubWVudF9zdHJlYW0uY2xvc2UoKTsKLQotICAgIHJldHVybiBzbGljZTsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIGdyYW1tYXJfZmlsZW5hbWUgPSBudWxsOwotICAgIFN0cmluZyBjb25maWdfZmlsZW5hbWUgPSBudWxsOwotICAgIFN0cmluZyBvdXRwdXRfcHJlZml4ID0gbnVsbDsKLSAgICBTdHJpbmcgYWxpZ25tZW50c19maWxlbmFtZSA9IG51bGw7Ci0gICAgU3RyaW5nIGZlYXR1cmVkdW1wX2ZpbGVuYW1lID0gbnVsbDsKLSAgICBib29sZWFuIGdyYW1tYXJfYWxpZ25tZW50cyA9IGZhbHNlOwotCi0gICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSB8fCBhcmdzWzBdLmVxdWFscygiLWgiKSkgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogIiArIEdyYW1tYXJQYWNrZXIuY2xhc3MudG9TdHJpbmcoKSk7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAtZyBncmFtbWFyX2ZpbGUgICAgIHRyYW5zbGF0aW9uIGdyYW1tYXIgdG8gcHJvY2VzcyIpOwotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgICAgLXAgcGFja2VkX25hbWUgICAgICBwcmVmaXggZm9yICoucGFja2VkIG91dHB1dCBkaXJlY3RvcnkiKTsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAgWy1jIGNvbmZpZ19maWxlICAgICAgcGFja2luZyBjb25maWd1cmF0aW9uIGZpbGVdIik7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgIFstZmEgYWxpZ25tZW50X2ZpbGUgIGFsaWdubWVudF9maWxlXSIpOwotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgICBbLWdhICAgICAgICAgICAgICAgICBhbGlnbm1lbnRzIGluIGdyYW1tYXJdIik7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgIFstZCBkdW1wX2ZpbGUgICAgICAgIGR1bXAgZmVhdHVyZSBzdGF0c10iKTsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOwotICAgICAgU3lzdGVtLmV4aXQoLTEpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKCItZyIuZXF1YWxzKGFyZ3NbaV0pICYmIChpIDwgYXJncy5sZW5ndGggLSAxKSkgewotICAgICAgICBncmFtbWFyX2ZpbGVuYW1lID0gYXJnc1srK2ldOwotICAgICAgfSBlbHNlIGlmICgiLXAiLmVxdWFscyhhcmdzW2ldKSAmJiAoaSA8IGFyZ3MubGVuZ3RoIC0gMSkpIHsKLSAgICAgICAgb3V0cHV0X3ByZWZpeCA9IGFyZ3NbKytpXTsKLSAgICAgIH0gZWxzZSBpZiAoIi1jIi5lcXVhbHMoYXJnc1tpXSkgJiYgKGkgPCBhcmdzLmxlbmd0aCAtIDEpKSB7Ci0gICAgICAgIGNvbmZpZ19maWxlbmFtZSA9IGFyZ3NbKytpXTsKLSAgICAgIH0gZWxzZSBpZiAoIi1mYSIuZXF1YWxzKGFyZ3NbaV0pICYmIChpIDwgYXJncy5sZW5ndGggLSAxKSkgewotICAgICAgICBhbGlnbm1lbnRzX2ZpbGVuYW1lID0gYXJnc1srK2ldOwotICAgICAgfSBlbHNlIGlmICgiLWdhIi5lcXVhbHMoYXJnc1tpXSkpIHsKLSAgICAgICAgZ3JhbW1hcl9hbGlnbm1lbnRzID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoIi1kIi5lcXVhbHMoYXJnc1tpXSkgJiYgKGkgPCBhcmdzLmxlbmd0aCAtIDEpKSB7Ci0gICAgICAgIGZlYXR1cmVkdW1wX2ZpbGVuYW1lID0gYXJnc1srK2ldOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZ3JhbW1hcl9maWxlbmFtZSA9PSBudWxsKSB7Ci0gICAgICBsb2dnZXIuc2V2ZXJlKCJHcmFtbWFyIGZpbGUgbm90IHNwZWNpZmllZC4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFuZXcgRmlsZShncmFtbWFyX2ZpbGVuYW1lKS5leGlzdHMoKSkgewotICAgICAgbG9nZ2VyLnNldmVyZSgiR3JhbW1hciBmaWxlIG5vdCBmb3VuZDogIiArIGdyYW1tYXJfZmlsZW5hbWUpOwotICAgIH0KLSAgICBpZiAoY29uZmlnX2ZpbGVuYW1lICE9IG51bGwgJiYgIW5ldyBGaWxlKGNvbmZpZ19maWxlbmFtZSkuZXhpc3RzKCkpIHsKLSAgICAgIGxvZ2dlci5zZXZlcmUoIkNvbmZpZyBmaWxlIG5vdCBmb3VuZDogIiArIGNvbmZpZ19maWxlbmFtZSk7Ci0gICAgfQotCi0gICAgU3RyaW5nIG91dHB1dF9maWxlbmFtZSA9IG51bGw7Ci0gICAgaWYgKG91dHB1dF9wcmVmaXggIT0gbnVsbCkgewotICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gb3V0cHV0X3ByZWZpeDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gZ3JhbW1hcl9maWxlbmFtZSArICIucGFja2VkIjsKLSAgICB9Ci0KLSAgICBpZiAobmV3IEZpbGUob3V0cHV0X2ZpbGVuYW1lKS5leGlzdHMoKSkgewotICAgICAgbG9nZ2VyLnNldmVyZSgiRmlsZSBvciBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHM6ICIgKyBvdXRwdXRfZmlsZW5hbWUpOwotICAgICAgbG9nZ2VyLnNldmVyZSgiV2lsbCBub3Qgb3ZlcndyaXRlLiIpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7Ci0gICAgICBsb2dnZXIuaW5mbygiV2lsbCBiZSB3cml0aW5nIHRvICIgKyBvdXRwdXRfZmlsZW5hbWUpOwotICAgIH0KLQotICAgIEdyYW1tYXJQYWNrZXIgcGFja2VyID0gbmV3IEdyYW1tYXJQYWNrZXIoZ3JhbW1hcl9maWxlbmFtZSwgY29uZmlnX2ZpbGVuYW1lLCBvdXRwdXRfZmlsZW5hbWUsCi0gICAgICAgIGFsaWdubWVudHNfZmlsZW5hbWUsIGZlYXR1cmVkdW1wX2ZpbGVuYW1lLCBncmFtbWFyX2FsaWdubWVudHMpOwotICAgIHBhY2tlci5wYWNrKCk7CisgIHB1YmxpYyB2b2lkIHdyaXRlVm9jYWJ1bGFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIHZvY2FidWxhcnlGaWxlbmFtZSA9IG91dHB1dCArIEZpbGUuc2VwYXJhdG9yICsgVk9DQUJVTEFSWV9GSUxFTkFNRTsKKyAgICBsb2dnZXIuaW5mbygiV3JpdGluZyB2b2NhYnVsYXJ5IHRvICIgKyB2b2NhYnVsYXJ5RmlsZW5hbWUpOworICAgIFZvY2FidWxhcnkud3JpdGUodm9jYWJ1bGFyeUZpbGVuYW1lKTsKICAgfQogCiAgIC8qKgpAQCAtNzU4LDcgKzcyMiw3IEBACiAKICAgICAvLyBBbGxvY2F0ZSBhIHJlYXNvbmFibHktc2l6ZWQgYnVmZmVyIGZvciB0aGUgZmVhdHVyZSBkYXRhLgogICAgIHByaXZhdGUgdm9pZCBhbGxvY2F0ZSgpIHsKLSAgICAgIGJhY2tpbmcgPSBuZXcgYnl0ZVtTTElDRV9TSVpFICogREFUQV9TSVpFX0VTVElNQVRFXTsKKyAgICAgIGJhY2tpbmcgPSBuZXcgYnl0ZVthcHByb3hpbWF0ZU1heGltdW1TbGljZVNpemUgKiBEQVRBX1NJWkVfRVNUSU1BVEVdOwogICAgICAgYnVmZmVyID0gQnl0ZUJ1ZmZlci53cmFwKGJhY2tpbmcpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS90b29scy9HcmFtbWFyUGFja2VyQ2xpLmphdmEgYi9zcmMvam9zaHVhL3Rvb2xzL0dyYW1tYXJQYWNrZXJDbGkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGViMmViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2pvc2h1YS90b29scy9HcmFtbWFyUGFja2VyQ2xpLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKK3BhY2thZ2Ugam9zaHVhLnRvb2xzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZVBhcnNlcjsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5zcGkuU3RyaW5nQXJyYXlPcHRpb25IYW5kbGVyOworCitwdWJsaWMgY2xhc3MgR3JhbW1hclBhY2tlckNsaSB7CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihHcmFtbWFyUGFja2VyQ2xpLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgLy8gSW5wdXQgZ3JhbW1hcnMgdG8gYmUgcGFja2VkICh3aXRoIGEgam9pbnQgdm9jYWJ1bGFyeSkKKyAgQE9wdGlvbihuYW1lID0gIi0tZ3JhbW1hcnMiLCBhbGlhc2VzID0geyItZyIsICItaSJ9LCBoYW5kbGVyID0gU3RyaW5nQXJyYXlPcHRpb25IYW5kbGVyLmNsYXNzLCByZXF1aXJlZCA9IHRydWUsIHVzYWdlID0gImxpc3Qgb2YgZ3JhbW1hcnMgdG8gcGFjayAoam9pbnRseSwgaS5lLiB0aGV5IHNoYXJlIHRoZSBzYW1lIHZvY2FidWxhcnkpIikKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ3JhbW1hcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgCisgIC8vIE91dHB1dCBncmFtbWFycworICBAT3B0aW9uKG5hbWUgPSAiLS1vdXRwdXRzIiwgYWxpYXNlcyA9IHsiLXAiLCAiLW8ifSwgaGFuZGxlciA9IFN0cmluZ0FycmF5T3B0aW9uSGFuZGxlci5jbGFzcywgcmVxdWlyZWQgPSB0cnVlLCB1c2FnZSA9ICJvdXRwdXQgZGlyZWN0b3JpZXMgb2YgcGFja2VkIGdyYW1tYXJzLiIpCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG91dHB1dHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgCisgIC8vIE91dHB1dCBncmFtbWFycworICBAT3B0aW9uKG5hbWUgPSAiLS1hbGlnbm1lbnRzIiwgYWxpYXNlcyA9IHsiLWEiLCAiLS1mYSJ9LCBoYW5kbGVyID0gU3RyaW5nQXJyYXlPcHRpb25IYW5kbGVyLmNsYXNzLCByZXF1aXJlZCA9IGZhbHNlLCB1c2FnZSA9ICJhbGlnbm1lbnQgZmlsZXMiKQorICBwcml2YXRlIExpc3Q8U3RyaW5nPiBhbGlnbm1lbnRzX2ZpbGVuYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAKKyAgLy8gQ29uZmlnIGZpbGVuYW1lCisgIEBPcHRpb24obmFtZSA9ICItLWNvbmZpZ19maWxlIiwgYWxpYXNlcyA9IHsiLWMifSwgcmVxdWlyZWQgPSBmYWxzZSwgdXNhZ2UgPSAiKG9wdGlvbmFsKSBwYWNraW5nIGNvbmZpZ3VyYXRpb24gZmlsZSIpCisgIHByaXZhdGUgU3RyaW5nIGNvbmZpZ19maWxlbmFtZTsKKyAgCisgIEBPcHRpb24obmFtZSA9ICItLWR1bXBfZmlsZXMiLCBhbGlhc2VzID0geyItZCJ9LCBoYW5kbGVyID0gU3RyaW5nQXJyYXlPcHRpb25IYW5kbGVyLmNsYXNzLCB1c2FnZSA9ICIob3B0aW9uYWwpIGR1bXAgZmVhdHVyZSBzdGF0cyB0byBmaWxlIikKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZmVhdHVyZWR1bXBfZmlsZW5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgIAorICBAT3B0aW9uKG5hbWUgPSAiLS1nYSIsIHVzYWdlID0gIndoZXRoZXIgYWxpZ25tZW50cyBhcmUgcHJlc2VudCBpbiB0aGUgZ3JhbW1hciIpCisgIHByaXZhdGUgYm9vbGVhbiBncmFtbWFyX2FsaWdubWVudHMgPSBmYWxzZTsKKyAgCisgIEBPcHRpb24obmFtZSA9ICItLXNsaWNlX3NpemUiLCBhbGlhc2VzID0geyItcyJ9LCByZXF1aXJlZCA9IGZhbHNlLCB1c2FnZSA9ICJhcHByb3hpbWF0ZSBzbGljZSBzaXplIGluICMgb2YgcnVsZXMgKGRlZmF1bHQ9MTAwMDAwMCkiKQorICBwcml2YXRlIGludCBzbGljZV9zaXplID0gMTAwMDAwMDsKKyAgCisgIAorICBwcml2YXRlIHZvaWQgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBtaXNzaW5nRmlsZW5hbWVzID0gbmV3IEFycmF5TGlzdDw+KGdyYW1tYXJzLnNpemUoKSk7CisgICAgZm9yIChmaW5hbCBTdHJpbmcgZyA6IGdyYW1tYXJzKSB7CisgICAgICBpZiAoIW5ldyBGaWxlKGcpLmV4aXN0cygpKSB7CisgICAgICAgIG1pc3NpbmdGaWxlbmFtZXMuYWRkKGcpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1pc3NpbmdGaWxlbmFtZXMuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIklucHV0IGdyYW1tYXIgZmlsZXMgbm90IGZvdW5kOiAiICsgbWlzc2luZ0ZpbGVuYW1lcy50b1N0cmluZygpKTsKKyAgICB9CisgICAgCisgICAgaWYgKGNvbmZpZ19maWxlbmFtZSAhPSBudWxsICYmICFuZXcgRmlsZShjb25maWdfZmlsZW5hbWUpLmV4aXN0cygpKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvbmZpZyBmaWxlIG5vdCBmb3VuZDogIiArIGNvbmZpZ19maWxlbmFtZSk7CisgICAgfQorCisgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgaWYgKG91dHB1dHMuc2l6ZSgpICE9IGdyYW1tYXJzLnNpemUoKSkgeworICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk11c3QgcHJvdmlkZSBhbiBvdXRwdXQgZGlyZWN0b3J5IGZvciBlYWNoIGdyYW1tYXIiKTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBleGlzdGluZ091dHB1dHMgPSBuZXcgQXJyYXlMaXN0PD4ob3V0cHV0cy5zaXplKCkpOworICAgICAgZm9yIChmaW5hbCBTdHJpbmcgbyA6IG91dHB1dHMpIHsKKyAgICAgICAgaWYgKG5ldyBGaWxlKG8pLmV4aXN0cygpKSB7CisgICAgICAgICAgZXhpc3RpbmdPdXRwdXRzLmFkZChvKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFleGlzdGluZ091dHB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhlc2Ugb3V0cHV0IGRpcmVjdG9yaWVzIGFscmVhZHkgZXhpc3QgKHdpbGwgbm90IG92ZXJ3cml0ZSk6ICIgKyBleGlzdGluZ091dHB1dHMudG9TdHJpbmcoKSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZyA6IGdyYW1tYXJzKSB7CisgICAgICAgIG91dHB1dHMuYWRkKGcgKyAiLnBhY2tlZCIpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoIWFsaWdubWVudHNfZmlsZW5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG1pc3NpbmdBbGlnbm1lbnRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8PihhbGlnbm1lbnRzX2ZpbGVuYW1lcy5zaXplKCkpOworICAgICAgZm9yIChmaW5hbCBTdHJpbmcgYSA6IGFsaWdubWVudHNfZmlsZW5hbWVzKSB7CisgICAgICAgIGlmICghbmV3IEZpbGUoYSkuZXhpc3RzKCkpIHsKKyAgICAgICAgICBtaXNzaW5nQWxpZ25tZW50RmlsZXMuYWRkKGEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIW1pc3NpbmdBbGlnbm1lbnRGaWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJBbGlnbm1lbnQgZmlsZXMgbm90IGZvdW5kOiAiICsgbWlzc2luZ0FsaWdubWVudEZpbGVzLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNyZWF0ZSBQYWNrZXIgaW5zdGFuY2VzIGZvciBlYWNoIGdyYW1tYXIKKyAgICBmaW5hbCBMaXN0PEdyYW1tYXJQYWNrZXI+IHBhY2tlcnMgPSBuZXcgQXJyYXlMaXN0PD4oZ3JhbW1hcnMuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyYW1tYXJzLnNpemUoKTsgaSsrKSB7CisgICAgICBsb2cuaW5mbygiU3RhcnRpbmcgR3JhbW1hclBhY2tlciBmb3IgIiArIGdyYW1tYXJzLmdldChpKSk7CisgICAgICBmaW5hbCBTdHJpbmcgYWxpZ25tZW50X2ZpbGVuYW1lID0gYWxpZ25tZW50c19maWxlbmFtZXMuaXNFbXB0eSgpID8gbnVsbCA6IGFsaWdubWVudHNfZmlsZW5hbWVzLmdldChpKTsKKyAgICAgIGZpbmFsIFN0cmluZyBmZWF0dXJlZHVtcF9maWxlbmFtZSA9IGZlYXR1cmVkdW1wX2ZpbGVuYW1lcy5pc0VtcHR5KCkgPyBudWxsIDogZmVhdHVyZWR1bXBfZmlsZW5hbWVzLmdldChpKTsKKyAgICAgIGZpbmFsIEdyYW1tYXJQYWNrZXIgcGFja2VyID0gbmV3IEdyYW1tYXJQYWNrZXIoCisgICAgICAgICAgZ3JhbW1hcnMuZ2V0KGkpLAorICAgICAgICAgIGNvbmZpZ19maWxlbmFtZSwKKyAgICAgICAgICBvdXRwdXRzLmdldChpKSwKKyAgICAgICAgICBhbGlnbm1lbnRfZmlsZW5hbWUsCisgICAgICAgICAgZmVhdHVyZWR1bXBfZmlsZW5hbWUsCisgICAgICAgICAgZ3JhbW1hcl9hbGlnbm1lbnRzLAorICAgICAgICAgIHNsaWNlX3NpemUpOworICAgICAgcGFja2Vycy5hZGQocGFja2VyKTsKKyAgICB9CisgICAgCisgICAgLy8gcnVuIGFsbCBwYWNrZXJzIGluIHNlcXVlbmNlLCBhY2N1bXVsYXRpbmcgdm9jYWJ1bGFyeSBpdGVtcworICAgIGZvciAoZmluYWwgR3JhbW1hclBhY2tlciBwYWNrZXIgOiBwYWNrZXJzKSB7CisgICAgICBsb2cuaW5mbygiU3RhcnRpbmcgR3JhbW1hclBhY2tlciBmb3IgIiArIHBhY2tlci5nZXRHcmFtbWFyKCkpOworICAgICAgcGFja2VyLnBhY2soKTsKKyAgICAgIGxvZy5pbmZvKCJQYWNrZWRHcmFtbWFyIGxvY2F0ZWQgYXQgIiArIHBhY2tlci5nZXRPdXRwdXREaXJlY3RvcnkoKSk7CisgICAgfQorICAgIAorICAgIC8vIGZvciBlYWNoIHBhY2tlZCBncmFtbWFyLCBvdmVyd3JpdGUgdGhlIGludGVybmFsbHkgc2VyaWFsaXplZCB2b2NhYnVsYXJ5IHdpdGggdGhlIGN1cnJlbnQgZ2xvYmFsIG9uZS4KKyAgICBmb3IgKGZpbmFsIEdyYW1tYXJQYWNrZXIgcGFja2VyIDogcGFja2VycykgeworICAgICAgbG9nLmluZm8oIldyaXRpbmcgZmluYWwgY29tbW9uIFZvY2FidWxhcnkgdG8gIiArIHBhY2tlci5nZXRPdXRwdXREaXJlY3RvcnkoKSk7CisgICAgICBwYWNrZXIud3JpdGVWb2NhYnVsYXJ5KCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBHcmFtbWFyUGFja2VyQ2xpIGNsaSA9IG5ldyBHcmFtbWFyUGFja2VyQ2xpKCk7CisgICAgZmluYWwgQ21kTGluZVBhcnNlciBwYXJzZXIgPSBuZXcgQ21kTGluZVBhcnNlcihjbGkpOworCisgICAgdHJ5IHsKKyAgICAgIHBhcnNlci5wYXJzZUFyZ3VtZW50KGFyZ3MpOworICAgICAgY2xpLnJ1bigpOworICAgIH0gY2F0Y2ggKENtZExpbmVFeGNlcHRpb24gZSkgeworICAgICAgbG9nLmluZm8oZS50b1N0cmluZygpKTsKKyAgICAgIHBhcnNlci5wcmludFVzYWdlKFN5c3RlbS5lcnIpOworICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvdXRpbC9Gb3JtYXRVdGlscy5qYXZhIGIvc3JjL2pvc2h1YS91dGlsL0Zvcm1hdFV0aWxzLmphdmEKaW5kZXggYmVkMDIzNC4uMGNhNjkyOCAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS91dGlsL0Zvcm1hdFV0aWxzLmphdmEKKysrIGIvc3JjL2pvc2h1YS91dGlsL0Zvcm1hdFV0aWxzLmphdmEKQEAgLTIsOCArMiw2IEBACiAKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiAvKioKQEAgLTEzLDEyICsxMSw4IEBACiAgKiBAYXV0aG9yIExhbmUgU2Nod2FydHoKICAqLwogcHVibGljIGNsYXNzIEZvcm1hdFV0aWxzIHsKLQotICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGNhY2hlOwotCi0gIHN0YXRpYyB7Ci0gICAgY2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX1NFUEFSQVRPUiA9ICIsIjsKIAogICAvKioKICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdHJpbmcgaXMgYSBub250ZXJtaW5hbCBieSBjaGVja2luZyB0aGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgWwpAQCAtMzQsMzEgKzI4LDM4IEBACiAgIC8qKgogICAgKiBOb250ZXJtaW5hbHMgYXJlIHN0b3JlZCBpbiB0aGUgdm9jYWJ1bGFyeSBpbiBzcXVhcmUgYnJhY2tldHMuIFRoaXMgcmVtb3ZlcyB0aGVtIHdoZW4geW91IAogICAgKiBqdXN0IHdhbnQgdGhlIHJhdyBub250ZXJtaW5hbCB3b3JkLgorICAgKiBTdXBwb3J0cyBpbmRleGVkIGFuZCBub24taW5kZXhlZCBub25UZXJtaW5hbHM6CisgICAqIFtHT0FMXSAtPiBHT0FMCisgICAqIFtYLDFdIC0+IFtYXQogICAgKiAKICAgICogQHBhcmFtIG50IHRoZSBub250ZXJtaW5hbCwgZS5nLiwgIltHT0FMXSIKICAgICogQHJldHVybiB0aGUgY2xlYW5lZCBub250ZXJtaW5hbCwgZS5nLiwgIkdPQUwiCiAgICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhbk5vbnRlcm1pbmFsKFN0cmluZyBudCkgewotICAgIGlmIChpc05vbnRlcm1pbmFsKG50KSkKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYW5Ob25UZXJtaW5hbChTdHJpbmcgbnQpIHsKKyAgICBpZiAoaXNOb250ZXJtaW5hbChudCkpIHsKKyAgICAgIGlmIChpc0luZGV4ZWROb25UZXJtaW5hbChudCkpIHsKKyAgICAgICAgLy8gc3RyaXAgIiwuKl0iCisgICAgICAgIHJldHVybiBudC5zdWJzdHJpbmcoMSwgbnQuaW5kZXhPZihJTkRFWF9TRVBBUkFUT1IpKTsKKyAgICAgIH0KKyAgICAgIC8vIHN0cmlwICJdIgogICAgICAgcmV0dXJuIG50LnN1YnN0cmluZygxLCBudC5sZW5ndGgoKSAtIDEpOworICAgIH0KICAgICByZXR1cm4gbnQ7CiAgIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhbkluZGV4ZWROb250ZXJtaW5hbChTdHJpbmcgbnQpIHsKLSAgICByZXR1cm4gbnQuc3Vic3RyaW5nKDEsIG50Lmxlbmd0aCgpIC0gMyk7CisgIAorICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5kZXhlZE5vblRlcm1pbmFsKFN0cmluZyBudCkgeworICAgIHJldHVybiBudC5jb250YWlucyhJTkRFWF9TRVBBUkFUT1IpOwogICB9CiAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBOdChTdHJpbmcgbnQpIHsKLSAgICBTdHJpbmcgc3RyaXBwZWQgPSBjYWNoZS5nZXQobnQpOwotICAgIGlmIChzdHJpcHBlZCA9PSBudWxsKSB7Ci0gICAgICBzdHJpcHBlZCA9IG1hcmt1cChjbGVhbkluZGV4ZWROb250ZXJtaW5hbChudCkpOwotICAgICAgY2FjaGUucHV0KG50LCBzdHJpcHBlZCk7Ci0gICAgfQotICAgIHJldHVybiBzdHJpcHBlZDsKKyAgLyoqCisgICAqIFJlbW92ZXMgdGhlIGluZGV4IGZyb20gYSBub25UZXJtaW5hbDogW1gsMV0gLT4gW1hdLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBOb25UZXJtaW5hbEluZGV4KFN0cmluZyBudCkgeworICAgIHJldHVybiBtYXJrdXAoY2xlYW5Ob25UZXJtaW5hbChudCkpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9udGVybWluYWxJbmRleChTdHJpbmcgbnQpIHsKLSAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChudC5zdWJzdHJpbmcobnQubGVuZ3RoKCkgLSAyLCBudC5sZW5ndGgoKSAtIDEpKTsKKyAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChudC5zdWJzdHJpbmcobnQuaW5kZXhPZihJTkRFWF9TRVBBUkFUT1IpICsgMSwgbnQubGVuZ3RoKCkgLSAxKSk7CiAgIH0KIAogICAvKioKQEAgLTc1LDcgKzc2LDcgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hcmt1cChTdHJpbmcgbnQsIGludCBpbmRleCkgewotICAgIHJldHVybiAiWyIgKyBudCArICIsIiArIGluZGV4ICsgIl0iOworICAgIHJldHVybiAiWyIgKyBudCArIElOREVYX1NFUEFSQVRPUiArIGluZGV4ICsgIl0iOwogICB9CiAKICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL3V0aWwvTXVybXVySGFzaC5qYXZhIGIvc3JjL2pvc2h1YS91dGlsL011cm11ckhhc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczNmQyNC4uMDAwMDAwMAotLS0gYS9zcmMvam9zaHVhL3V0aWwvTXVybXVySGFzaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLXBhY2thZ2Ugam9zaHVhLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLS8qKgotICogTXVybXVySGFzaCAyLjAuCi0gKiAKLSAqIFRoZSBtdXJtdXIgaGFzaCBpcyBhIHJlbGF0aXZlIGZhc3QgaGFzaCBmdW5jdGlvbiBmcm9tIGh0dHA6Ly9tdXJtdXJoYXNoLmdvb2dsZXBhZ2VzLmNvbS8gZm9yCi0gKiBwbGF0Zm9ybXMgd2l0aCBlZmZpY2llbnQgbXVsdGlwbGljYXRpb24uCi0gKiAKLSAqIFRoaXMgaXMgYSByZS1pbXBsZW1lbnRhdGlvbiBvZiB0aGUgb3JpZ2luYWwgQyBjb2RlIHBsdXMgc29tZSBhZGRpdGlvbmFsIGZlYXR1cmVzLgotICogCi0gKiBQdWJsaWMgZG9tYWluLgotICogCi0gKiBAYXV0aG9yIFZpbGlhbSBIb2x1YgotICogQHZlcnNpb24gMS4wLjIKLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTXVybXVySGFzaCB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVOQ09ESU5HID0gIlVURi0xNiI7Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyAzMiBiaXQgaGFzaCBmcm9tIGJ5dGUgYXJyYXkgb2YgdGhlIGdpdmVuIGxlbmd0aCBhbmQgc2VlZC4KLSAgICogCi0gICAqIEBwYXJhbSBkYXRhIGJ5dGUgYXJyYXkgdG8gaGFzaAotICAgKiBAcGFyYW0gbGVuZ3RoIGxlbmd0aCBvZiB0aGUgYXJyYXkgdG8gaGFzaAotICAgKiBAcGFyYW0gc2VlZCBpbml0aWFsIHNlZWQgdmFsdWUKLSAgICogQHJldHVybiAzMiBiaXQgaGFzaCBvZiB0aGUgZ2l2ZW4gYXJyYXkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGhhc2gzMihmaW5hbCBieXRlW10gZGF0YSwgaW50IGxlbmd0aCwgaW50IHNlZWQpIHsKLSAgICAvLyAnbScgYW5kICdyJyBhcmUgbWl4aW5nIGNvbnN0YW50cyBnZW5lcmF0ZWQgb2ZmbGluZS4KLSAgICAvLyBUaGV5J3JlIG5vdCByZWFsbHkgJ21hZ2ljJywgdGhleSBqdXN0IGhhcHBlbiB0byB3b3JrIHdlbGwuCi0gICAgZmluYWwgaW50IG0gPSAweDViZDFlOTk1OwotICAgIGZpbmFsIGludCByID0gMjQ7Ci0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgaGFzaCB0byBhIHJhbmRvbSB2YWx1ZQotICAgIGludCBoID0gc2VlZCBeIGxlbmd0aDsKLSAgICBpbnQgbGVuZ3RoNCA9IGxlbmd0aCAvIDQ7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDQ7IGkrKykgewotICAgICAgZmluYWwgaW50IGk0ID0gaSAqIDQ7Ci0gICAgICBpbnQgayA9Ci0gICAgICAgICAgKGRhdGFbaTQgKyAwXSAmIDB4ZmYpICsgKChkYXRhW2k0ICsgMV0gJiAweGZmKSA8PCA4KSArICgoZGF0YVtpNCArIDJdICYgMHhmZikgPDwgMTYpCi0gICAgICAgICAgICAgICsgKChkYXRhW2k0ICsgM10gJiAweGZmKSA8PCAyNCk7Ci0gICAgICBrICo9IG07Ci0gICAgICBrIF49IGsgPj4+IHI7Ci0gICAgICBrICo9IG07Ci0gICAgICBoICo9IG07Ci0gICAgICBoIF49IGs7Ci0gICAgfQotCi0gICAgLy8gSGFuZGxlIHRoZSBsYXN0IGZldyBieXRlcyBvZiB0aGUgaW5wdXQgYXJyYXkKLSAgICBzd2l0Y2ggKGxlbmd0aCAlIDQpIHsKLSAgICAgIGNhc2UgMzoKLSAgICAgICAgaCBePSAoZGF0YVsobGVuZ3RoICYgfjMpICsgMl0gJiAweGZmKSA8PCAxNjsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaCBePSAoZGF0YVsobGVuZ3RoICYgfjMpICsgMV0gJiAweGZmKSA8PCA4OwotICAgICAgY2FzZSAxOgotICAgICAgICBoIF49IChkYXRhW2xlbmd0aCAmIH4zXSAmIDB4ZmYpOwotICAgICAgICBoICo9IG07Ci0gICAgfQotCi0gICAgaCBePSBoID4+PiAxMzsKLSAgICBoICo9IG07Ci0gICAgaCBePSBoID4+PiAxNTsKLQotICAgIHJldHVybiBoOwotICB9Ci0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIDMyIGJpdCBoYXNoIGZyb20gYnl0ZSBhcnJheSB3aXRoIGRlZmF1bHQgc2VlZCB2YWx1ZS4KLSAgICogCi0gICAqIEBwYXJhbSBkYXRhIGJ5dGUgYXJyYXkgdG8gaGFzaAotICAgKiBAcGFyYW0gbGVuZ3RoIGxlbmd0aCBvZiB0aGUgYXJyYXkgdG8gaGFzaAotICAgKiBAcmV0dXJuIDMyIGJpdCBoYXNoIG9mIHRoZSBnaXZlbiBhcnJheQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgaGFzaDMyKGZpbmFsIGJ5dGVbXSBkYXRhLCBpbnQgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIGhhc2gzMihkYXRhLCBsZW5ndGgsIDB4OTc0N2IyOGMpOwotICB9Ci0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIDMyIGJpdCBoYXNoIGZyb20gYSBzdHJpbmcuCi0gICAqIAotICAgKiBAcGFyYW0gdGV4dCBzdHJpbmcgdG8gaGFzaAotICAgKiBAcmV0dXJuIDMyIGJpdCBoYXNoIG9mIHRoZSBnaXZlbiBzdHJpbmcKLSAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBoYXNoMzIoZmluYWwgU3RyaW5nIHRleHQpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSB0ZXh0LmdldEJ5dGVzKEVOQ09ESU5HKTsKLSAgICByZXR1cm4gaGFzaDMyKGJ5dGVzLCBieXRlcy5sZW5ndGgpOwotICB9Ci0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIDMyIGJpdCBoYXNoIGZyb20gYSBzdWJzdHJpbmcuCi0gICAqIAotICAgKiBAcGFyYW0gdGV4dCBzdHJpbmcgdG8gaGFzaAotICAgKiBAcGFyYW0gZnJvbSBzdGFydGluZyBpbmRleAotICAgKiBAcGFyYW0gbGVuZ3RoIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nIHRvIGhhc2gKLSAgICogQHJldHVybiAzMiBiaXQgaGFzaCBvZiB0aGUgZ2l2ZW4gc3RyaW5nCi0gICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgaGFzaDMyKGZpbmFsIFN0cmluZyB0ZXh0LCBpbnQgZnJvbSwgaW50IGxlbmd0aCkKLSAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gaGFzaDMyKHRleHQuc3Vic3RyaW5nKGZyb20sIGZyb20gKyBsZW5ndGgpKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyA2NCBiaXQgaGFzaCBmcm9tIGJ5dGUgYXJyYXkgb2YgdGhlIGdpdmVuIGxlbmd0aCBhbmQgc2VlZC4KLSAgICogCi0gICAqIEBwYXJhbSBkYXRhIGJ5dGUgYXJyYXkgdG8gaGFzaAotICAgKiBAcGFyYW0gbGVuZ3RoIGxlbmd0aCBvZiB0aGUgYXJyYXkgdG8gaGFzaAotICAgKiBAcGFyYW0gc2VlZCBpbml0aWFsIHNlZWQgdmFsdWUKLSAgICogQHJldHVybiA2NCBiaXQgaGFzaCBvZiB0aGUgZ2l2ZW4gYXJyYXkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbG9uZyBoYXNoNjQoZmluYWwgYnl0ZVtdIGRhdGEsIGludCBsZW5ndGgsIGludCBzZWVkKSB7Ci0gICAgZmluYWwgbG9uZyBtID0gMHhjNmE0YTc5MzViZDFlOTk1TDsKLSAgICBmaW5hbCBpbnQgciA9IDQ3OwotCi0gICAgbG9uZyBoID0gKHNlZWQgJiAweGZmZmZmZmZmbCkgXiAobGVuZ3RoICogbSk7Ci0KLSAgICBpbnQgbGVuZ3RoOCA9IGxlbmd0aCAvIDg7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDg7IGkrKykgewotICAgICAgZmluYWwgaW50IGk4ID0gaSAqIDg7Ci0gICAgICBsb25nIGsgPQotICAgICAgICAgICgobG9uZykgZGF0YVtpOCArIDBdICYgMHhmZikgKyAoKChsb25nKSBkYXRhW2k4ICsgMV0gJiAweGZmKSA8PCA4KQotICAgICAgICAgICAgICArICgoKGxvbmcpIGRhdGFbaTggKyAyXSAmIDB4ZmYpIDw8IDE2KSArICgoKGxvbmcpIGRhdGFbaTggKyAzXSAmIDB4ZmYpIDw8IDI0KQotICAgICAgICAgICAgICArICgoKGxvbmcpIGRhdGFbaTggKyA0XSAmIDB4ZmYpIDw8IDMyKSArICgoKGxvbmcpIGRhdGFbaTggKyA1XSAmIDB4ZmYpIDw8IDQwKQotICAgICAgICAgICAgICArICgoKGxvbmcpIGRhdGFbaTggKyA2XSAmIDB4ZmYpIDw8IDQ4KSArICgoKGxvbmcpIGRhdGFbaTggKyA3XSAmIDB4ZmYpIDw8IDU2KTsKLQotICAgICAgayAqPSBtOwotICAgICAgayBePSBrID4+PiByOwotICAgICAgayAqPSBtOwotCi0gICAgICBoIF49IGs7Ci0gICAgICBoICo9IG07Ci0gICAgfQotCi0gICAgc3dpdGNoIChsZW5ndGggJSA4KSB7Ci0gICAgICBjYXNlIDc6Ci0gICAgICAgIGggXj0gKGxvbmcpIChkYXRhWyhsZW5ndGggJiB+NykgKyA2XSAmIDB4ZmYpIDw8IDQ4OwotICAgICAgY2FzZSA2OgotICAgICAgICBoIF49IChsb25nKSAoZGF0YVsobGVuZ3RoICYgfjcpICsgNV0gJiAweGZmKSA8PCA0MDsKLSAgICAgIGNhc2UgNToKLSAgICAgICAgaCBePSAobG9uZykgKGRhdGFbKGxlbmd0aCAmIH43KSArIDRdICYgMHhmZikgPDwgMzI7Ci0gICAgICBjYXNlIDQ6Ci0gICAgICAgIGggXj0gKGxvbmcpIChkYXRhWyhsZW5ndGggJiB+NykgKyAzXSAmIDB4ZmYpIDw8IDI0OwotICAgICAgY2FzZSAzOgotICAgICAgICBoIF49IChsb25nKSAoZGF0YVsobGVuZ3RoICYgfjcpICsgMl0gJiAweGZmKSA8PCAxNjsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaCBePSAobG9uZykgKGRhdGFbKGxlbmd0aCAmIH43KSArIDFdICYgMHhmZikgPDwgODsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgaCBePSAobG9uZykgKGRhdGFbbGVuZ3RoICYgfjddICYgMHhmZik7Ci0gICAgICAgIGggKj0gbTsKLSAgICB9OwotCi0gICAgaCBePSBoID4+PiByOwotICAgIGggKj0gbTsKLSAgICBoIF49IGggPj4+IHI7Ci0KLSAgICByZXR1cm4gaDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyA2NCBiaXQgaGFzaCBmcm9tIGJ5dGUgYXJyYXkgd2l0aCBkZWZhdWx0IHNlZWQgdmFsdWUuCi0gICAqIAotICAgKiBAcGFyYW0gZGF0YSBieXRlIGFycmF5IHRvIGhhc2gKLSAgICogQHBhcmFtIGxlbmd0aCBsZW5ndGggb2YgdGhlIGFycmF5IHRvIGhhc2gKLSAgICogQHJldHVybiA2NCBiaXQgaGFzaCBvZiB0aGUgZ2l2ZW4gc3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGxvbmcgaGFzaDY0KGZpbmFsIGJ5dGVbXSBkYXRhLCBpbnQgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIGhhc2g2NChkYXRhLCBsZW5ndGgsIDB4ZTE3YTE0NjUpOwotICB9Ci0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIDY0IGJpdCBoYXNoIGZyb20gYSBzdHJpbmcuCi0gICAqIAotICAgKiBAcGFyYW0gdGV4dCBzdHJpbmcgdG8gaGFzaAotICAgKiBAcmV0dXJuIDY0IGJpdCBoYXNoIG9mIHRoZSBnaXZlbiBzdHJpbmcKLSAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGxvbmcgaGFzaDY0KGZpbmFsIFN0cmluZyB0ZXh0KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGJ5dGVzOwotICAgIGJ5dGVzID0gdGV4dC5nZXRCeXRlcyhFTkNPRElORyk7Ci0gICAgcmV0dXJuIGhhc2g2NChieXRlcywgYnl0ZXMubGVuZ3RoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyA2NCBiaXQgaGFzaCBmcm9tIGEgc3Vic3RyaW5nLgotICAgKiAKLSAgICogQHBhcmFtIHRleHQgc3RyaW5nIHRvIGhhc2gKLSAgICogQHBhcmFtIGZyb20gc3RhcnRpbmcgaW5kZXgKLSAgICogQHBhcmFtIGxlbmd0aCBsZW5ndGggb2YgdGhlIHN1YnN0cmluZyB0byBoYXNoCi0gICAqIEByZXR1cm4gNjQgYml0IGhhc2ggb2YgdGhlIGdpdmVuIGFycmF5Ci0gICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBsb25nIGhhc2g2NChmaW5hbCBTdHJpbmcgdGV4dCwgaW50IGZyb20sIGludCBsZW5ndGgpCi0gICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGhhc2g2NCh0ZXh0LnN1YnN0cmluZyhmcm9tLCBmcm9tICsgbGVuZ3RoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvdXRpbC9lbmNvZGluZy9FbmNvZGVyQ29uZmlndXJhdGlvbi5qYXZhIGIvc3JjL2pvc2h1YS91dGlsL2VuY29kaW5nL0VuY29kZXJDb25maWd1cmF0aW9uLmphdmEKaW5kZXggNDU0NzU5OS4uZGEzYmM0ZSAxMDA2NDQKLS0tIGEvc3JjL2pvc2h1YS91dGlsL2VuY29kaW5nL0VuY29kZXJDb25maWd1cmF0aW9uLmphdmEKKysrIGIvc3JjL2pvc2h1YS91dGlsL2VuY29kaW5nL0VuY29kZXJDb25maWd1cmF0aW9uLmphdmEKQEAgLTI0LDEwICsyNCwxNiBAQAogICAKICAgcHJpdmF0ZSBib29sZWFuIGxhYmVsZWQ7CiAgIAorICBwcml2YXRlIGludCBudW1EZW5zZUZlYXR1cmVzID0gMDsKKyAgCiAgIHB1YmxpYyBFbmNvZGVyQ29uZmlndXJhdGlvbigpIHsKICAgICB0aGlzLm91dGVyVG9Jbm5lciA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CiAgIH0KIAorICBwdWJsaWMgaW50IGdldE51bURlbnNlRmVhdHVyZXMoKSB7CisgICAgcmV0dXJuIG51bURlbnNlRmVhdHVyZXM7CisgIH0KKyAgCiAgIHB1YmxpYyBpbnQgZ2V0TnVtRmVhdHVyZXMoKSB7CiAgICAgcmV0dXJuIGVuY29kZXJzLmxlbmd0aDsKICAgfQpAQCAtNTksNiArNjUsMTAgQEAKICAgICAgIGlmIChsYWJlbGVkKSB7CiAgICAgICAgIFN0cmluZyBmZWF0dXJlX25hbWUgPSBpbl9zdHJlYW0ucmVhZFVURigpOwogICAgICAgICBvdXRlcl9pZCA9IFZvY2FidWxhcnkuaWQoZmVhdHVyZV9uYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGZlYXR1cmVfbmFtZSk7CisgICAgICAgICAgbnVtRGVuc2VGZWF0dXJlcysrOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkge30KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIG91dGVyX2lkID0gaW5fc3RyZWFtLnJlYWRJbnQoKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS8uZ2l0aWdub3JlIGIvc3JjL2tlbmxtLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhYWUzZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMzIgQEAKK2Jpbi8KK2xtL2Jpbi8KK3V0aWwvYmluLwordXRpbC9maWxlX3BpZWNlLmNjLmd6CitsaWIvCitkaXN0CisqLnN3cAorKi5vCitxdWVyeQorYnVpbGRfYmluYXJ5CitrZW5sbV9tYXhfb3JkZXIKK2xtL2xlZnRfdGVzdAorbG0vbW9kZWxfdGVzdAordXRpbC9iaXRfcGFja2luZ190ZXN0Cit1dGlsL2ZpbGVfcGllY2VfdGVzdAordXRpbC9qb2ludF9zb3J0X3Rlc3QKK3V0aWwvcHJvYmluZ19oYXNoX3RhYmxlX3Rlc3QKK3V0aWwvcmVhZF9jb21wcmVzc2VkX3Rlc3QKK3V0aWwvc29ydGVkX3VuaWZvcm1fdGVzdAorcHJldmlvdXMuc2gKK2phbS1maWxlcy9iamFtLTFfNTUKK2phbS1maWxlcy9lbmdpbmUvYmluLiovCitqYW0tZmlsZXMvZW5naW5lL2Jvb3RzdHJhcC8KK2RvYy8KKy5fKgoraW5jbHVkZS8KK3dpbmRvd3MvV2luMzIKK3dpbmRvd3MveDY0Cit3aW5kb3dzLyoudXNlcgord2luZG93cy8qLnNkZgord2luZG93cy8qLm9wZW5zZGYKK3dpbmRvd3MvKi5zdW8KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9CVUlMRElORyBiL3NyYy9rZW5sbS9CVUlMRElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzA2ODE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL0JVSUxESU5HCkBAIC0wLDAgKzEsMTAgQEAKK0lmIHlvdSBoYXZlIEJvb3N0ID49IDEuMzYuMCBpbnN0YWxsZWQ6CisgICAuL2JqYW0KKyAgIC4vYmphbSBpbnN0YWxsIC0tcHJlZml4PS91c3IgI29wdGlvbmFsCisKK0lmIHlvdSBvbmx5IHdhbnQgdGhlIHF1ZXJ5IGNvZGUgYW5kIGRvIG5vdCBjYXJlIGFib3V0IGNvbXByZXNzaW9uICguZ3osIC5iejIsIGFuZCAueHopOgorICAuL2NvbXBpbGVfcXVlcnlfb25seS5zaAorCitXaW5kb3dzOgorICBUaGUgd2luZG93cyBkaXJlY3RvcnkgaGFzIHZpc3VhbCBzdHVkaW8gZmlsZXMuICBOb3RlIHRoYXQgeW91IG5lZWQgdG8gY29tcGlsZQorICB0aGUga2VubG0gcHJvamVjdCBiZWZvcmUgYnVpbGRfYmluYXJ5IGFuZCBuZ3JhbV9xdWVyeSBwcm9qZWN0cy4gIApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL0NNYWtlTGlzdHMudHh0IGIvc3JjL2tlbmxtL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDk5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1NyBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC44KQorIworIyBUaGUgS2VuTE0gY21ha2UgZmlsZXMgbWFrZSB1c2Ugb2YgYWRkX2xpYnJhcnkoLi4uIE9CSkVDVFMgLi4uKQorIyAKKyMgVGhpcyBzeW50YXggYWxsb3dzIGdyb3VwaW5nIG9mIHNvdXJjZSBmaWxlcyB3aGVuIGNvbXBpbGluZworIyAoZWZmZWN0aXZlbHkgY3JlYXRpbmcgImZha2UiIGxpYnJhcmllcyBiYXNlZCBvbiBzb3VyY2Ugc3ViZGlycykuCisjIAorIyBUaGlzIHN5bnRheCB3YXMgb25seSBhZGRlZCBpbiBjbWFrZSB2ZXJzaW9uIDIuOC44CisjCisjIHNlZSBodHRwOi8vd3d3LmNtYWtlLm9yZy9XaWtpL0NNYWtlL1R1dG9yaWFscy9PYmplY3RfTGlicmFyeQorCisKKyMgVGhpcyBDTWFrZSBmaWxlIHdhcyBjcmVhdGVkIGJ5IExhbmUgU2Nod2FydHogPGRvd29iZWhhQGdtYWlsLmNvbT4KKworCisjIERlZmluZSBhIHNpbmdsZSBjbWFrZSBwcm9qZWN0Citwcm9qZWN0KGtlbmxtKQorCisjIENvbXBpbGUgYWxsIGV4ZWN1dGFibGVzIGludG8gYmluLworc2V0KEVYRUNVVEFCTEVfT1VUUFVUX1BBVEggJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2JpbikKKworIyBDb21waWxlIGFsbCBsaWJyYXJpZXMgaW50byBsaWIvCitzZXQoTElCUkFSWV9PVVRQVVRfUEFUSCAke1BST0pFQ1RfQklOQVJZX0RJUn0vbGliKQorCisjIFRlbGwgY21ha2UgdGhhdCB3ZSB3YW50IHVuaXQgdGVzdHMgdG8gYmUgY29tcGlsZWQKK2luY2x1ZGUoQ1Rlc3QpCitlbmFibGVfdGVzdGluZygpCisKKyMgQWRkIG91ciBDTWFrZSBoZWxwZXIgZnVuY3Rpb25zCitpbmNsdWRlKGNtYWtlL0tlbkxNRnVuY3Rpb25zLmNtYWtlKQorCisjIEFuZCBvdXIgaGVscGVyIG1vZHVsZXMKK2xpc3QoQVBQRU5EIENNQUtFX01PRFVMRV9QQVRIICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jbWFrZS9tb2R1bGVzKQorCisjIFdlIG5lZWQgYm9vc3QKK2ZpbmRfcGFja2FnZShCb29zdCAxLjM2LjAgUkVRVUlSRUQgQ09NUE9ORU5UUworICBwcm9ncmFtX29wdGlvbnMgCisgIHN5c3RlbQorICB0aHJlYWQKKyAgdW5pdF90ZXN0X2ZyYW1ld29yaworKQorCisKKworCisjIERlZmluZSB3aGVyZSBpbmNsdWRlIGZpbGVzIGxpdmUKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICR7UFJPSkVDVF9TT1VSQ0VfRElSfSAKKyAgJHtCb29zdF9JTkNMVURFX0RJUlN9CispCisKK29wdGlvbihCVUlMRF9JTlRFUlBPTEFURSAiQnVpbGQgbGFuZ3VhZ2UgbW9kZWwgaW50ZXJwb2xhdGlvbiBjb2RlIiBPRkYpCisKKyMgUHJvY2VzcyBzdWJkaXJlY3RvcmllcworYWRkX3N1YmRpcmVjdG9yeSh1dGlsKQorYWRkX3N1YmRpcmVjdG9yeShsbSkKKwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL0NPUFlJTkcgYi9zcmMva2VubG0vQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzYyYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL0NPUFlJTkcKQEAgLTAsMCArMSw1MDIgQEAKKyAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQorCisgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitbVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgTGVzc2VyIEdQTC4gIEl0IGFsc28gY291bnRzCisgYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UKKyB0aGUgdmVyc2lvbiBudW1iZXIgMi4xLl0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKK2ZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KKworICBUaGlzIGxpY2Vuc2UsIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCitzcGVjaWFsbHkgZGVzaWduYXRlZCBzb2Z0d2FyZSBwYWNrYWdlcy0tdHlwaWNhbGx5IGxpYnJhcmllcy0tb2YgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIG90aGVyIGF1dGhvcnMgd2hvIGRlY2lkZSB0byB1c2UgaXQuICBZb3UKK2NhbiB1c2UgaXQgdG9vLCBidXQgd2Ugc3VnZ2VzdCB5b3UgZmlyc3QgdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXIKK3RoaXMgbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyCitzdHJhdGVneSB0byB1c2UgaW4gYW55IHBhcnRpY3VsYXIgY2FzZSwgYmFzZWQgb24gdGhlIGV4cGxhbmF0aW9ucyBiZWxvdy4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsCitub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0Cit5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlCitmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0CitpdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YKK2l0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbwordGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2Rpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UKK3JpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcgoreW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCitvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCit5b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCitjb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCitjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCitpdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlCitsaWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAorcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCisKKyAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0Cit0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzCittb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cKK3RoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbAorYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlCitpbnRyb2R1Y2VkIGJ5IG90aGVycy4KKwwKKyAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKK2FueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QKK2VmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQorcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKK2FueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUKK2NvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCitpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQordGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQorbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCisKKyAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKK2Egc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQorY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQorZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoCit0aGUgbGlicmFyeS4KKworICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgIkxlc3NlciIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0Citkb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UuICBJdCBhbHNvIHByb3ZpZGVzIG90aGVyIGZyZWUgc29mdHdhcmUgZGV2ZWxvcGVycyBMZXNzCitvZiBhbiBhZHZhbnRhZ2Ugb3ZlciBjb21wZXRpbmcgbm9uLWZyZWUgcHJvZ3JhbXMuICBUaGVzZSBkaXNhZHZhbnRhZ2VzCithcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKK2xpYnJhcmllcy4gIEhvd2V2ZXIsIHRoZSBMZXNzZXIgbGljZW5zZSBwcm92aWRlcyBhZHZhbnRhZ2VzIGluIGNlcnRhaW4KK3NwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KKworICBGb3IgZXhhbXBsZSwgb24gcmFyZSBvY2Nhc2lvbnMsIHRoZXJlIG1heSBiZSBhIHNwZWNpYWwgbmVlZCB0bworZW5jb3VyYWdlIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlIG9mIGEgY2VydGFpbiBsaWJyYXJ5LCBzbyB0aGF0IGl0IGJlY29tZXMKK2EgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUKK2FsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUKK2xpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcworY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCitzb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQorcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mCitmcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluCitub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKK29wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nCitzeXN0ZW0uCisKKyAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUKK3VzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzCitsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KK3RoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKK2JlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgorDAorICAgICAgICAgICAgICAgICAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKK3Byb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCitvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCitFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCitjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoreW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KK2FwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CithbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQord2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKK0xpYnJhcnkuCisKKyAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKK2FuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKK2ZlZS4KKwwKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgorCisgICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubworICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCisgICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcworICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKKyAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKKyAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKKyAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgorICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KKworICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCisgICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQorICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CisgICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQorICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKK2l0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Cit3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCit0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCit0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCitpbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Cit0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCit0aGVzZSBub3RpY2VzLgorDAorICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCit0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAorc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KKworICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKK3RoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KKworICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgorZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KK3VuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQoraXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAorbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCitzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KK2Rpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKK0xpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKK2xpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCit3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCit0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKK2NyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAorY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKK2xpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgorU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCisKKyAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKK3RoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQorZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCitXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQorbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKK3RocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCisKKyAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKK3N0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQorZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAorZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQord29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKK0xpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCisKKyAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKK2Rpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgorQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCit3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCisMCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCisgICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGEKKyAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKKyAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKKyAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmCisgICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCisgICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCisKKyAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAorICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscworICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKK25vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCisMCisgIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCitsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KK3RoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQorcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCisgICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQorICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgIFNlY3Rpb25zIGFib3ZlLgorCisgICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKKyAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZworICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KKworICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQordGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKK2F0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCityaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCitvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCit0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKK3RoaXMgTGljZW5zZS4KKwwKKyAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCithbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKK2FuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAorc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCitleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgord3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCitTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCitidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAorImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQorbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisMCisgIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKK3dyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCitjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgorZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cworb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKK2FuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTyBXQVJSQU5UWQorCisgIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTworV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KK0VYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCitPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQorS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQorTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKK1RIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgorV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKK0FORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCitGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQorTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORworUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKK0ZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKK1NVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKK0RBTUFHRVMuCisKKyAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQorICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL0NPUFlJTkcgYi9zcmMva2VubG0vQ09QWUlORy4zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vQ09QWUlORwpyZW5hbWUgdG8gc3JjL2tlbmxtL0NPUFlJTkcuMwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL0NPUFlJTkcuTEVTU0VSIGIvc3JjL2tlbmxtL0NPUFlJTkcuTEVTU0VSLjMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9DT1BZSU5HLkxFU1NFUgpyZW5hbWUgdG8gc3JjL2tlbmxtL0NPUFlJTkcuTEVTU0VSLjMKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9Eb3h5ZmlsZSBiL3NyYy9rZW5sbS9Eb3h5ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWJhYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL0RveHlmaWxlCkBAIC0wLDAgKzEsMTUxOSBAQAorIyBEb3h5ZmlsZSAxLjYuMQorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdAorIworIyBBbGwgdGV4dCBhZnRlciBhIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQKKyMgVGhlIGZvcm1hdCBpczoKKyMgICAgICAgVEFHID0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIEZvciBsaXN0cyBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKKyMgICAgICAgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzICgiICIpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwKKyMgdGV4dCBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlCisjIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlCisjIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKKworIyBUaGUgUFJPSkVDVF9OQU1FIHRhZyBpcyBhIHNpbmdsZSB3b3JkIChvciBhIHNlcXVlbmNlIG9mIHdvcmRzIHN1cnJvdW5kZWQKKyMgYnkgcXVvdGVzKSB0aGF0IHNob3VsZCBpZGVudGlmeSB0aGUgcHJvamVjdC4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9IEtlbkxNCisKKyMgVGhlIFBST0pFQ1RfTlVNQkVSIHRhZyBjYW4gYmUgdXNlZCB0byBlbnRlciBhIHByb2plY3Qgb3IgcmV2aXNpb24gbnVtYmVyLgorIyBUaGlzIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yCisjIGlmIHNvbWUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBpcyB1c2VkLgorCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0KKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpCisjIGJhc2UgcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbgorIyB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZiBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCisKK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSBkb2MKKworIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZQorIyA0MDk2IHN1Yi1kaXJlY3RvcmllcyAoaW4gMiBsZXZlbHMpIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIGVhY2ggb3V0cHV0CisjIGZvcm1hdCBhbmQgd2lsbCBkaXN0cmlidXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgb3ZlciB0aGVzZSBkaXJlY3Rvcmllcy4KKyMgRW5hYmxpbmcgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mCisjIHNvdXJjZSBmaWxlcywgd2hlcmUgcHV0dGluZyBhbGwgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3b3VsZAorIyBvdGhlcndpc2UgY2F1c2UgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKworQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBFbmdsaXNoLCBvdGhlciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZToKKyMgQWZyaWthYW5zLCBBcmFiaWMsIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwgQ2hpbmVzZS1UcmFkaXRpb25hbCwKKyMgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFc3BlcmFudG8sIEZhcnNpLCBGaW5uaXNoLCBGcmVuY2gsIEdlcm1hbiwKKyMgR3JlZWssIEh1bmdhcmlhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2gKKyMgbWVzc2FnZXMpLCBLb3JlYW4sIEtvcmVhbi1lbiwgTGl0aHVhbmlhbiwgTm9yd2VnaWFuLCBNYWNlZG9uaWFuLCBQZXJzaWFuLAorIyBQb2xpc2gsIFBvcnR1Z3Vlc2UsIFJvbWFuaWFuLCBSdXNzaWFuLCBTZXJiaWFuLCBTZXJiaWFuLUN5cmlsaWMsIFNsb3ZhaywKKyMgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVWtyYWluaWFuLCBhbmQgVmlldG5hbWVzZS4KKworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKKworIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgaW5jbHVkZSBicmllZiBtZW1iZXIgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbgorIyB0aGUgZmlsZSBhbmQgY2xhc3MgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhRG9jKS4KKyMgU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKworQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUworCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgcHJlcGVuZAorIyB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4KKyMgTm90ZTogaWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IKKyMgdGhhdCBpcyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcKKyMgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZCBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZQorIyBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0IGFuZCB0aGUgcmVzdWx0IGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzCisjIHVzZWQgYXMgdGhlIGFubm90YXRlZCB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLgorIyBJZiBsZWZ0IGJsYW5rLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoIiRuYW1lIiBpcyBhdXRvbWF0aWNhbGx5CisjIHJlcGxhY2VkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGVudGl0eSk6ICJUaGUgJG5hbWUgY2xhc3MiICJUaGUgJG5hbWUgd2lkZ2V0IgorIyAiVGhlICRuYW1lIGZpbGUiICJpcyIgInByb3ZpZGVzIiAic3BlY2lmaWVzIiAiY29udGFpbnMiCisjICJyZXByZXNlbnRzIiAiYSIgImFuIiAidGhlIgorCitBQkJSRVZJQVRFX0JSSUVGICAgICAgID0KKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisKK0FMV0FZU19ERVRBSUxFRF9TRUMgICAgPSBZRVMKKworIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwKKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50CisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwKKyMgcGF0aCBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQKKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuCisKK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIFNUUklQX0ZST01fUEFUSCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4gU3RyaXBwaW5nIGlzCisjIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZCBwYXJ0IG9mCisjIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUKKyMgcGF0aCB0byBzdHJpcC4KKworU1RSSVBfRlJPTV9QQVRIICAgICAgICA9CisKKyMgVGhlIFNUUklQX0ZST01fSU5DX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YKKyMgdGhlIHBhdGggbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgY2xhc3MsIHdoaWNoIHRlbGxzCisjIHRoZSByZWFkZXIgd2hpY2ggaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiBvcmRlciB0byB1c2UgYSBjbGFzcy4KKyMgSWYgbGVmdCBibGFuayBvbmx5IHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcworIyBkZWZpbml0aW9uIGlzIHVzZWQuIE90aGVyd2lzZSBvbmUgc2hvdWxkIHNwZWNpZnkgdGhlIGluY2x1ZGUgcGF0aHMgdGhhdAorIyBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlciB1c2luZyB0aGUgLUkgZmxhZy4KKworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9CisKKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyCisjIChidXQgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlzIHlvdXIgZmlsZSBzeXN0ZW1zCisjIGRvZXNuJ3Qgc3VwcG9ydCBsb25nIG5hbWVzIGxpa2Ugb24gRE9TLCBNYWMsIG9yIENELVJPTS4KKworU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbgorIyB3aWxsIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhRG9jLXN0eWxlCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhRG9jCisjIGNvbW1lbnRzIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzCisjICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsCisjIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgY29tbWVudHMKKyMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nCisjIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgRG94eWdlbgorIyB0cmVhdCBhIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8KKyMgY29tbWVudHMpIGFzIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuCisjIFRoZSBuZXcgZGVmYXVsdCBpcyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZAorIyBkZXNjcmlwdGlvbi4gU2V0IHRoaXMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3VyIGluc3RlYWQuCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGFuIHVuZG9jdW1lbnRlZAorIyBtZW1iZXIgaW5oZXJpdHMgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdAorIyByZS1pbXBsZW1lbnRzLgorCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZQorIyBhIG5ldyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsCisjIGJlIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLgorIyBEb3h5Z2VuIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gOAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMKKyMgYXMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuCisjIEZvciBleGFtcGxlIGFkZGluZyAic2lkZWVmZmVjdD1ccGFyIFNpZGUgRWZmZWN0czpcbiIgd2lsbCBhbGxvdyB5b3UgdG8KKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoCisjIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcgIlNpZGUgRWZmZWN0czoiLgorIyBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydCBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9CisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQworIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuCisjIEZvciBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3QKKyMgb2YgYWxsIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisKK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0pBVkEgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgSmF2YQorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yCisjIEphdmEuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywgcXVhbGlmaWVkCisjIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisKK09QVElNSVpFX09VVFBVVF9KQVZBICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfRk9SX0ZPUlRSQU4gdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgRm9ydHJhbgorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yCisjIEZvcnRyYW4uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IKKyMgVkhETC4KKworT1BUSU1JWkVfT1VUUFVUX1ZIREwgICA9IE5PCisKKyMgRG94eWdlbiBzZWxlY3RzIHRoZSBwYXJzZXIgdG8gdXNlIGRlcGVuZGluZyBvbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlcyBpdCBwYXJzZXMuCisjIFdpdGggdGhpcyB0YWcgeW91IGNhbiBhc3NpZ24gd2hpY2ggcGFyc2VyIHRvIHVzZSBmb3IgYSBnaXZlbiBleHRlbnNpb24uCisjIERveHlnZW4gaGFzIGEgYnVpbHQtaW4gbWFwcGluZywgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgb3IgZXh0ZW5kIGl0IHVzaW5nIHRoaXMgdGFnLgorIyBUaGUgZm9ybWF0IGlzIGV4dD1sYW5ndWFnZSwgd2hlcmUgZXh0IGlzIGEgZmlsZSBleHRlbnNpb24sIGFuZCBsYW5ndWFnZSBpcyBvbmUgb2YKKyMgdGhlIHBhcnNlcnMgc3VwcG9ydGVkIGJ5IGRveHlnZW46IElETCwgSmF2YSwgSmF2YXNjcmlwdCwgQyMsIEMsIEMrKywgRCwgUEhQLAorIyBPYmplY3RpdmUtQywgUHl0aG9uLCBGb3J0cmFuLCBWSERMLCBDLCBDKysuIEZvciBpbnN0YW5jZSB0byBtYWtlIGRveHlnZW4gdHJlYXQKKyMgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0IGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDIChkZWZhdWx0IGlzIEZvcnRyYW4pLAorIyB1c2U6IGluYz1Gb3J0cmFuIGY9Qy4gTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCisKK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPQorCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQKKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkCisjIHNldCB0aGlzIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7IHYucy4KKyMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorCitCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gTk8KKworIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bworIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCBzb3VyY2VzIG9ubHkuCisjIERveHlnZW4gd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYworIyBpbnN0ZWFkIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KKworU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCisKKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlIGdldHRlcgorIyBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTICh0aGUgZGVmYXVsdCkKKyMgd2lsbCBtYWtlIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvcgorIyBzZXR0aW5nIGEgc2ltcGxlIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZQorIyBtZXRob2RzIGFueXdheSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YKKyMgdGhlIHNhbWUgdHlwZSAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEKKyMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8KKyMgTk8gdG8gcHJldmVudCBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcKKyMgdGhlIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yIGVudW0KKyMgaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkKKyMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gTk8KKworIyBUaGUgU1lNQk9MX0NBQ0hFX1NJWkUgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgY2FjaGUgdXNlIHRvCisjIGRldGVybWluZSB3aGljaCBzeW1ib2xzIHRvIGtlZXAgaW4gbWVtb3J5IGFuZCB3aGljaCB0byBmbHVzaCB0byBkaXNrLgorIyBXaGVuIHRoZSBjYWNoZSBpcyBmdWxsLCBsZXNzIG9mdGVuIHVzZWQgc3ltYm9scyB3aWxsIGJlIHdyaXR0ZW4gdG8gZGlzay4KKyMgRm9yIHNtYWxsIHRvIG1lZGl1bSBzaXplIHByb2plY3RzICg8MTAwMCBpbnB1dCBmaWxlcykgdGhlIGRlZmF1bHQgdmFsdWUgaXMKKyMgcHJvYmFibHkgZ29vZCBlbm91Z2guIEZvciBsYXJnZXIgcHJvamVjdHMgYSB0b28gc21hbGwgY2FjaGUgc2l6ZSBjYW4gY2F1c2UKKyMgZG94eWdlbiB0byBiZSBidXN5IHN3YXBwaW5nIHN5bWJvbHMgdG8gYW5kIGZyb20gZGlzayBtb3N0IG9mIHRoZSB0aW1lCisjIGNhdXNpbmcgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBwZW5hbGl0eS4KKyMgSWYgdGhlIHN5c3RlbSBoYXMgZW5vdWdoIHBoeXNpY2FsIG1lbW9yeSBpbmNyZWFzaW5nIHRoZSBjYWNoZSB3aWxsIGltcHJvdmUgdGhlCisjIHBlcmZvcm1hbmNlIGJ5IGtlZXBpbmcgbW9yZSBzeW1ib2xzIGluIG1lbW9yeS4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB3b3JrcyBvbgorIyBhIGxvZ2FyaXRobWljIHNjYWxlIHNvIGluY3JlYXNpbmcgdGhlIHNpemUgYnkgb25lIHdpbGwgcm91Z2x5IGRvdWJsZSB0aGUKKyMgbWVtb3J5IHVzYWdlLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6CisjIDJeKDE2K1NZTUJPTF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzCisKK1NZTUJPTF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuCisjIFByaXZhdGUgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MKKyMgdGhlIEVYVFJBQ1RfUFJJVkFURSBhbmQgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUworCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcworIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUKKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykKKyMgZGVmaW5lZCBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBJZiBzZXQgdG8gTk8gb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gV2hlbiBzZXQgdG8gWUVTIGxvY2FsCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4KKyMgdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZC4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UKKyMgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0CisjIGFub255bW91cyBuYW1lc3BhY2UgYXJlIGhpZGRlbi4KKworRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBtZW1iZXJzIG9mIGRvY3VtZW50ZWQgY2xhc3NlcywgZmlsZXMgb3IgbmFtZXNwYWNlcy4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorIyB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24gc2VjdGlvbiBpcyBnZW5lcmF0ZWQuCisjIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IFlFUworCisjIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cworIyBvdmVydmlld3MuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IFlFUworCisjIElmIHRoZSBISURFX0ZSSUVORF9DT01QT1VORFMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbAorIyBmcmllbmQgKGNsYXNzfHN0cnVjdHx1bmlvbikgZGVjbGFyYXRpb25zLgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4KKworSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PCisKKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbnkKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQorIyBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suCisKK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24KKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldAorIyB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gdGhlIGRvY3VtZW50YXRpb24gd2lsbCBiZSBleGNsdWRlZC4KKyMgU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gRG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUKKyMgZmlsZSBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbgorIyB3aWxsIHNob3cgbWVtYmVycyB3aXRoIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMgdGhlIHNjb3BlIHdpbGwgYmUgaGlkZGVuLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU0hPV19JTkNMVURFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuCisjIHdpbGwgcHV0IGEgbGlzdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uCisjIG9mIHRoYXQgZmlsZS4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisjIElmIHRoZSBJTkxJTkVfSU5GTyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYSB0YWcgW2lubGluZV0KKyMgaXMgaW5zZXJ0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4KKyMgd2lsbCBzb3J0IHRoZSAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycworIyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluCisjIGRlY2xhcmF0aW9uIG9yZGVyLgorCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyBicmllZiBkb2N1bWVudGF0aW9uIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseQorIyBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4KKyMgZGVjbGFyYXRpb24gb3JkZXIuCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieSBTT1JUX01FTUJFUl9ET0NTIGFuZCBTT1JUX0JSSUVGX0RPQ1MuIFRoaXMgdGFnIHdpbGwgYmUgaWdub3JlZCBmb3IgYnJpZWYgZG9jcyBpZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PIGFuZCBpZ25vcmVkIGZvciBkZXRhaWxlZCBkb2NzIGlmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PLgorCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgaGllcmFyY2h5IG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQorIyB0aGUgZ3JvdXAgbmFtZXMgd2lsbCBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZQorIyBzb3J0ZWQgYnkgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvCisjIE5PICh0aGUgZGVmYXVsdCksIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwKKyMgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZQorIyBhbHBoYWJldGljYWwgbGlzdC4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgdG9kbyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0IGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QKKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgYnVnIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZworIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nCisjIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCisKKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbAorIyBkb2N1bWVudGF0aW9uIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIHNlY3Rpb25uYW1lIC4uLiBcZW5kaWYuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPQorCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzCisjIHRoZSBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgZGVmaW5lIGNvbnNpc3RzIG9mIGZvciBpdCB0byBhcHBlYXIgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkCisjIGhlcmUgaXQgd2lsbCBiZSBoaWRkZW4uIFVzZSBhIHZhbHVlIG9mIDAgdG8gaGlkZSBpbml0aWFsaXplcnMgY29tcGxldGVseS4KKyMgVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGluaXRpYWxpemVyIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBkZWZpbmVzIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplcgorIyBjb21tYW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQKKyMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgc291cmNlcyBpbiB5b3VyIHByb2plY3QgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgbXVsdGlwbGUgZGlyZWN0b3JpZXMKKyMgdGhlbiBzZXR0aW5nIHRoZSBTSE9XX0RJUkVDVE9SSUVTIHRhZyB0byBZRVMgd2lsbCBzaG93IHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5CisjIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyBOTy4KKworU0hPV19ESVJFQ1RPUklFUyAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLgorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlCisjIE5hbWVzcGFjZXMgcGFnZS4KKyMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleAorIyBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLgorCitTSE9XX05BTUVTUEFDRVMgICAgICAgID0gWUVTCisKKyMgVGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIG9yIHNjcmlwdCB0aGF0CisjIGRveHlnZW4gc2hvdWxkIGludm9rZSB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBmb3IgZWFjaCBmaWxlICh0eXBpY2FsbHkgZnJvbQorIyB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSkuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIHByb2dyYW0gYnkgZXhlY3V0aW5nICh2aWEKKyMgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGNvbW1hbmQ+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGNvbW1hbmQ+IGlzIHRoZSB2YWx1ZSBvZgorIyB0aGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZQorIyBwcm92aWRlZCBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0CisjIGlzIHVzZWQgYXMgdGhlIGZpbGUgdmVyc2lvbi4gU2VlIHRoZSBtYW51YWwgZm9yIGV4YW1wbGVzLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0KKworIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZCBieQorIyBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZXMKKyMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRoZSBjcmVhdGUgdGhlIGxheW91dCBmaWxlIHRoYXQgcmVwcmVzZW50cworIyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYQorIyBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUKKyMgb2YgdGhlIGxheW91dCBmaWxlLgorCitMQVlPVVRfRklMRSAgICAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZAorIyBieSBkb3h5Z2VuLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rCisjIE5PIGlzIHVzZWQuCisKK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKKworIyBJZiBXQVJOX0lGX1VORE9DVU1FTlRFRCBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncworIyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcgd2lsbAorIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgV0FSTl9JRl9ET0NfRVJST1IgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcgorIyBwb3RlbnRpYWwgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uLCBzdWNoIGFzIG5vdCBkb2N1bWVudGluZyBzb21lCisjIHBhcmFtZXRlcnMgaW4gYSBkb2N1bWVudGVkIGZ1bmN0aW9uLCBvciBkb2N1bWVudGluZyBwYXJhbWV0ZXJzIHRoYXQKKyMgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGlzIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBhYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yCisjIGZ1bmN0aW9ucyB0aGF0IGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzCisjIG9yIHJldHVybiB2YWx1ZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dAorIyB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mCisjIGRvY3VtZW50YXRpb24uCisKK1dBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBOTworCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQKKyMgZG94eWdlbiBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQKKyMgdGFncywgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUKKyMgd2FybmluZyBvcmlnaW5hdGVkIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4KKyMgJHZlcnNpb24sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkCisjIGJlIG9idGFpbmVkIHZpYSBGSUxFX1ZFUlNJT05fRklMVEVSKQorCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKKworIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nCisjIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4KKyMgdG8gc3RkZXJyLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgSU5QVVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlICJteWZpbGUuY3BwIiBvcgorIyBkaXJlY3RvcmllcyBsaWtlICIvdXNyL3NyYy9teXByb2plY3QiLiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgd2l0aCBzcGFjZXMuCisKK0lOUFVUICAgICAgICAgICAgICAgICAgPSBsbSBsbS9idWlsZGVyIGxtL2ZpbHRlciBsbS9pbnRlcnBvbGF0ZSBsbS93cmFwcGVycyB1dGlsIHV0aWwvZG91YmxlLWNvbnZlcnNpb24gdXRpbC9zdHJlYW0KKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcworIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGlzCisjIGFsc28gdGhlIGRlZmF1bHQgaW5wdXQgZW5jb2RpbmcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0CisjIGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3IKKyMgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcAorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0CisjIGJsYW5rIHRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHRlc3RlZDoKKyMgKi5jICouY2MgKi5jeHggKi5jcHAgKi5jKysgKi5qYXZhICouaWkgKi5peHggKi5pcHAgKi5pKysgKi5pbmwgKi5oICouaGggKi5oeHgKKyMgKi5ocHAgKi5oKysgKi5pZGwgKi5vZGwgKi5jcyAqLnBocCAqLnBocDMgKi5pbmMgKi5tICoubW0gKi5weSAqLmY5MAorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0KKworIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMKKyMgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uCisjIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworUkVDVVJTSVZFICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkCisjIGV4Y2x1ZGVkIGZyb20gdGhlIElOUFVUIHNvdXJjZSBmaWxlcy4gVGhpcyB3YXkgeW91IGNhbiBlYXNpbHkgZXhjbHVkZSBhCisjIHN1YmRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IHRyZWUgd2hvc2Ugcm9vdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgSU5QVVQgdGFnLgorCitFWENMVURFICAgICAgICAgICAgICAgID0KKworIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZXN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQKKyMgZnJvbSB0aGUgaW5wdXQuCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4gTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQKKyMgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMKKyMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPQorCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLAorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0CisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPQorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZQorIyB0aGUgXGluY2x1ZGUgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPQorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcAorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0CisjIGJsYW5rIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPQorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlCisjIGNvbW1hbmRzIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KKworIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gaW1hZ2UgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZQorIyB0aGUgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0KKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPgorIyBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4KKyMgaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyIHByb2dyYW0gd3JpdGVzCisjIHRvIHN0YW5kYXJkIG91dHB1dC4KKyMgSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcgd2lsbCBiZQorIyBpZ25vcmVkLgorCitJTlBVVF9GSUxURVIgICAgICAgICAgID0KKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuCisjIGJhc2lzLgorIyBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guCisjIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06CisjIHBhdHRlcm49ZmlsdGVyIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSwgSU5QVVRfRklMVEVSCisjIGlzIGFwcGxpZWQgdG8gYWxsIGZpbGVzLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0KKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlCisjIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwKKyMgYmUgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgYWxzbworIyBWRVJCQVRJTV9IRUFERVJTIGlzIHNldCB0byBOTy4KKworU09VUkNFX0JST1dTRVIgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgSU5MSU5FX1NPVVJDRVMgdGFnIHRvIFlFUyB3aWxsIGluY2x1ZGUgdGhlIGJvZHkKKyMgb2YgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB3aWxsIGluc3RydWN0CisjIGRveHlnZW4gdG8gaGlkZSBhbnkgc3BlY2lhbCBjb21tZW50IGJsb2NrcyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgY29kZQorIyBmcmFnbWVudHMuIE5vcm1hbCBDIGFuZCBDKysgY29tbWVudHMgd2lsbCBhbHdheXMgcmVtYWluIHZpc2libGUuCisKK1NUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUworIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQKKyMgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIGl0IHdpbGwgYmUgbGlzdGVkLgorCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gTk8KKworIyBJZiB0aGUgUkVGRVJFTkNFU19SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUworIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQgZW50aXRpZXMKKyMgY2FsbGVkL3VzZWQgYnkgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGxpc3RlZC4KKworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfTElOS19TT1VSQ0UgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KQorIyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbQorIyBmdW5jdGlvbnMgaW4gUkVGRVJFTkNFU19SRUxBVElPTiBhbmQgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiBsaXN0cyB3aWxsCisjIGxpbmsgdG8gdGhlIHNvdXJjZSBjb2RlLgorIyBPdGhlcndpc2UgdGhleSB3aWxsIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uCisKK1JFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUKKyMgd2lsbCBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuCisjIGJ1aWx0LWluIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UKKyMgdGFnZ2luZyBzeXN0ZW0gKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91CisjIHdpbGwgbmVlZCB2ZXJzaW9uIDQuOC42IG9yIGhpZ2hlci4KKworVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvcgorIyB3aGljaCBhbiBpbmNsdWRlIGlzIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXgKKyMgb2YgYWxsIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QKKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBOTworCisjIElmIHRoZSBhbHBoYWJldGljYWwgaW5kZXggaXMgZW5hYmxlZCAoc2VlIEFMUEhBQkVUSUNBTF9JTkRFWCkgdGhlbgorIyB0aGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMKKyMgaW4gd2hpY2ggdGhpcyBsaXN0IHdpbGwgYmUgc3BsaXQgKGNhbiBiZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzEuLjIwXSkKKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsCisjIGNsYXNzZXMgd2lsbCBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguCisjIFRoZSBJR05PUkVfUFJFRklYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHByZWZpeGVzIHRoYXQKKyMgc2hvdWxkIGJlIGlnbm9yZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgSFRNTCBvdXRwdXQuCisKK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKKworIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgaHRtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSBodG1sCisKKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLC5waHAsLmFzcCkuIElmIGl0IGlzIGxlZnQgYmxhbmsKKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGZpbGVzIHdpdGggLmh0bWwgZXh0ZW5zaW9uLgorCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBIVE1MIGhlYWRlciBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4KKworSFRNTF9IRUFERVIgICAgICAgICAgICA9CisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBmb290ZXIuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPQorCisjIElmIHRoZSBIVE1MX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBnZW5lcmF0ZWQgSFRNTAorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiB0aGUgdGltZXNzdGFtcC4KKworSFRNTF9USU1FU1RBTVAgICAgICAgICA9IE5PCisKKyMgVGhlIEhUTUxfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcKKyMgc3R5bGUgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0bworIyBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIEhUTUwgb3V0cHV0LiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4gTm90ZSB0aGF0IGRveHlnZW4gd2lsbCB0cnkgdG8gY29weQorIyB0aGUgc3R5bGUgc2hlZXQgZmlsZSB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCBzbyBkb24ndCBwdXQgeW91ciBvd24KKyMgc3R5bGVzaGVldCBpbiB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGFzIHdlbGwsIG9yIGl0IHdpbGwgYmUgZXJhc2VkIQorCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0KKworIyBJZiB0aGUgSFRNTF9BTElHTl9NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBjbGFzc2VzLAorIyBmaWxlcyBvciBuYW1lc3BhY2VzIHdpbGwgYmUgYWxpZ25lZCBpbiBIVE1MIHVzaW5nIHRhYmxlcy4gSWYgc2V0IHRvCisjIE5PIGEgYnVsbGV0IGxpc3Qgd2lsbCBiZSB1c2VkLgorCitIVE1MX0FMSUdOX01FTUJFUlMgICAgID0gWUVTCisKKyMgSWYgdGhlIEhUTUxfRFlOQU1JQ19TRUNUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBnZW5lcmF0ZWQgSFRNTAorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBoaWRkZW4gYW5kIHNob3duIGFmdGVyIHRoZQorIyBwYWdlIGhhcyBsb2FkZWQuIEZvciB0aGlzIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMKKyMgSmF2YVNjcmlwdCBhbmQgREhUTUwgaXMgcmVxdWlyZWQgKGZvciBpbnN0YW5jZSBNb3ppbGxhIDEuMCssIEZpcmVmb3gKKyMgTmV0c2NhcGUgNi4wKywgSW50ZXJuZXQgZXhwbG9yZXIgNS4wKywgS29ucXVlcm9yLCBvciBTYWZhcmkpLgorCitIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMworIyBpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBpbnRyb2R1Y2VkIHdpdGggT1NYIDEwLjUgKExlb3BhcmQpLgorIyBUbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHNldCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgTWFrZWZpbGUgaW4gdGhlCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluIHRoYXQKKyMgZGlyZWN0b3J5IGFuZCBydW5uaW5nICJtYWtlIGluc3RhbGwiIHdpbGwgaW5zdGFsbCB0aGUgZG9jc2V0IGluCisjIH4vTGlicmFyeS9EZXZlbG9wZXIvU2hhcmVkL0RvY3VtZW50YXRpb24vRG9jU2V0cyBzbyB0aGF0IFhjb2RlIHdpbGwgZmluZAorIyBpdCBhdCBzdGFydHVwLgorIyBTZWUgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMvY3JlYXRpbmdkb2NzZXRzd2l0aGRveHlnZW4uaHRtbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworR0VORVJBVEVfRE9DU0VUICAgICAgICA9IE5PCisKKyMgV2hlbiBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIHRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlCisjIGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlCisjIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKQorIyBjYW4gYmUgZ3JvdXBlZC4KKworRE9DU0VUX0ZFRUROQU1FICAgICAgICA9ICJEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzIgorCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdAorIyBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24gc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYQorIyByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuCisjIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRvb2xzIGxpa2UgdGhlCisjIE1pY3Jvc29mdCBIVE1MIGhlbHAgd29ya3Nob3AgdG8gZ2VuZXJhdGUgYSBjb21waWxlZCBIVE1MIGhlbHAgZmlsZSAoLmNobSkKKyMgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIENITV9GSUxFIHRhZyBjYW4KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htIGZpbGUuIFlvdQorIyBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUKKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5LgorCitDSE1fRklMRSAgICAgICAgICAgICAgID0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBISENfTE9DQVRJT04gdGFnIGNhbgorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4KKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKworSEhDX0xPQ0FUSU9OICAgICAgICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgR0VORVJBVEVfQ0hJIGZsYWcKKyMgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIHRoYXQKKyMgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIENITV9JTkRFWF9FTkNPRElORworIyBpcyB1c2VkIHRvIGVuY29kZSBIdG1sSGVscCBpbmRleCAoaGhrKSwgY29udGVudCAoaGhjKSBhbmQgcHJvamVjdCBmaWxlCisjIGNvbnRlbnQuCisKK0NITV9JTkRFWF9FTkNPRElORyAgICAgPQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEJJTkFSWV9UT0MgZmxhZworIyBjb250cm9scyB3aGV0aGVyIGEgYmluYXJ5IHRhYmxlIG9mIGNvbnRlbnRzIGlzIGdlbmVyYXRlZCAoWUVTKSBvciBhCisjIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoTk8pIGluIHRoZSAuY2htIGZpbGUuCisKK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzCisjIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisKK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQgUUhQX1ZJUlRVQUxfRk9MREVSCisjIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvcgorIyBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEgUXQgQ29tcHJlc3NlZCBIZWxwICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkCisjIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfUUhQICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbgorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4KKyMgVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuCisKK1FDSF9GSUxFICAgICAgICAgICAgICAgPQorCisjIFRoZSBRSFBfTkFNRVNQQUNFIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nCisjIFF0IEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUKKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UKKworUUhQX05BTUVTUEFDRSAgICAgICAgICA9CisKKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZworIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC1mb2xkZXJzCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiBRSFBfQ1VTVF9GSUxURVJfTkFNRSBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLgorIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLWZpbHRlcnMKKworUUhQX0NVU1RfRklMVEVSX05BTUUgICA9CisKKyMgVGhlIFFIUF9DVVNUX0ZJTFRfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgY3VzdG9tIGZpbHRlciB0byBhZGQuRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzIj5RdCBIZWxwIFByb2plY3QgLyBDdXN0b20gRmlsdGVyczwvYT4uCisKK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPQorCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzIHByb2plY3QncworIyBmaWx0ZXIgc2VjdGlvbiBtYXRjaGVzLgorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzIj5RdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlczwvYT4uCisKK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPQorCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbgorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIFF0J3MgcWhlbHBnZW5lcmF0b3IuCisjIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUgZ2VuZXJhdGVkCisjIC5xaHAgZmlsZS4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9CisKKyMgVGhlIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggYXQKKyMgdG9wIG9mIGVhY2ggSFRNTCBwYWdlLiBUaGUgdmFsdWUgTk8gKHRoZSBkZWZhdWx0KSBlbmFibGVzIHRoZSBpbmRleCBhbmQKKyMgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcyBpdC4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMgKHJhbmdlIFsxLi4yMF0pCisjIHRoYXQgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAorCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uCisjIElmIHRoZSB0YWcgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkCisjIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0CisjIGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cworIyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4KKyMgV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUgSFRNTCBoZWxwIGZlYXR1cmUuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOTworCisjIEJ5IGVuYWJsaW5nIFVTRV9JTkxJTkVfVFJFRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgR3JvdXBzLCBEaXJlY3RvcmllcywKKyMgYW5kIENsYXNzIEhpZXJhcmNoeSBwYWdlcyB1c2luZyBhIHRyZWUgdmlldyBpbnN0ZWFkIG9mIGFuIG9yZGVyZWQgbGlzdC4KKworVVNFX0lOTElORV9UUkVFUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUKKyMgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlCisjIGlzIHNob3duLgorCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwCisKKyMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhdGV4IGZvcm11bGFzIGluY2x1ZGVkCisjIGFzIGltYWdlcyBpbiB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyAxMC4gTm90ZSB0aGF0CisjIHdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bCBkb3h5Z2VuIHJ1biB5b3UgbmVlZAorIyB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeQorIyB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTAKKworIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZSBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94IGZvciB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0CisjIGFuZCBESFRNTCBhbmQgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBIVE1MIGhlbHAgKEdFTkVSQVRFX0hUTUxIRUxQKSBvciBRdCBoZWxwIChHRU5FUkFURV9RSFApCisjIHRoZXJlIGlzIGFscmVhZHkgYSBzZWFyY2ggZnVuY3Rpb24gc28gdGhpcyBvbmUgc2hvdWxkIHR5cGljYWxseQorIyBiZSBkaXNhYmxlZC4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgTGF0ZXggb3V0cHV0LgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gWUVTCisKKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTEFURVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIExhVGVYIGNvbW1hbmQgbmFtZSB0byBiZQorIyBpbnZva2VkLiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGNvbW1hbmQgbmFtZS4KKworTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvCisjIGdlbmVyYXRlIGluZGV4IGZvciBMYVRlWC4gSWYgbGVmdCBibGFuayBgbWFrZWluZGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlCisjIGRlZmF1bHQgY29tbWFuZCBuYW1lLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0CisjIExhVGVYIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8KKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuCisKK0NPTVBBQ1RfTEFURVggICAgICAgICAgPSBOTworCisjIFRoZSBQQVBFUl9UWVBFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHBhcGVyIHR5cGUgdGhhdCBpcyB1c2VkCisjIGJ5IHRoZSBwcmludGVyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBhNCwgYTR3aWRlLCBsZXR0ZXIsIGxlZ2FsIGFuZAorIyBleGVjdXRpdmUuIElmIGxlZnQgYmxhbmsgYTR3aWRlIHdpbGwgYmUgdXNlZC4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbmFtZXMgb2YgTGFUZVgKKyMgcGFja2FnZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4KKworRVhUUkFfUEFDS0FHRVMgICAgICAgICA9CisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IKKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsCisjIHRoZSBmaXJzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPQorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkCisjIGlzIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIHBkZiAodXNpbmcgcHMycGRmKS4gVGhlIHBkZiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMKKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgcGRmbGF0ZXggd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YKKyMgcGxhaW4gbGF0ZXggaW4gdGhlIGdlbmVyYXRlZCBNYWtlZmlsZS4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYQorIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxcYmF0Y2htb2RlLgorIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwCisjIHJ1bm5pbmcgaWYgZXJyb3JzIG9jY3VyLCBpbnN0ZWFkIG9mIGFza2luZyB0aGUgdXNlciBmb3IgaGVscC4KKyMgVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIyBJZiBMQVRFWF9ISURFX0lORElDRVMgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QKKyMgaW5jbHVkZSB0aGUgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pCisjIGluIHRoZSBvdXRwdXQuCisKK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworCisjIElmIExBVEVYX1NPVVJDRV9DT0RFIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBzb3VyY2UgY29kZSB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIExhVGVYIG91dHB1dC4gTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzIFNPVVJDRV9CUk9XU0VSLgorCitMQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQKKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aAorIyBvdGhlciBSVEYgcmVhZGVycyBvciBlZGl0b3JzLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHJ0Zicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0CisjIFJURiBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQKKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLgorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBXT1JEIG9yIG90aGVyCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLgorIyBOb3RlOiB3b3JkcGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCisKKyMgTG9hZCBzdHlsZXNoZWV0IGRlZmluaXRpb25zIGZyb20gZmlsZS4gU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzCisjIGNvbmZpZyBmaWxlLCBpLmUuIGEgc2VyaWVzIG9mIGFzc2lnbm1lbnRzLiBZb3Ugb25seSBoYXZlIHRvIHByb3ZpZGUKKyMgcmVwbGFjZW1lbnRzLCBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9CisKKyMgU2V0IG9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIGFuIHJ0ZiBkb2N1bWVudC4KKyMgU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZyBmaWxlLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBtYW4gcGFnZXMKKworR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbWFuJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0bworIyB0aGUgZ2VuZXJhdGVkIG1hbiBwYWdlcyAoZGVmYXVsdCBpcyB0aGUgc3Vicm91dGluZSdzIHNlY3Rpb24gLjMpCisKK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuMworCisjIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIERveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsCisjIHRoZW4gaXQgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkKKyMgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbCBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcworIyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQgdGhlbSB0aGUgbWFuIGNvbW1hbmQKKyMgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4gVGhlIGRlZmF1bHQgaXMgTk8uCisKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgeG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorCisjIFRoZSBYTUxfU0NIRU1BIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBzY2hlbWEsCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKworWE1MX1NDSEVNQSAgICAgICAgICAgICA9CisKKyMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIERURCwKKyMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlCisjIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLgorCitYTUxfRFREICAgICAgICAgICAgICAgID0KKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAorIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZworIyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQKKyMgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFhNTCBvdXRwdXQuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYW4gQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGF1dG9nZW4uc2YubmV0KSBmaWxlCisjIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsCisjIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZSBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzCisjIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZQorIyBtb21lbnQuCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB0aGUgbmVjZXNzYXJ5IE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZQorIyB0byBnZW5lcmF0ZSBQREYgYW5kIERWSSBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlCisjIG5pY2VseSBmb3JtYXR0ZWQgc28gaXQgY2FuIGJlIHBhcnNlZCBieSBhIGh1bWFuIHJlYWRlci4KKyMgVGhpcyBpcyB1c2VmdWwKKyMgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLgorIyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhpcworIyB0YWcgaXMgc2V0IHRvIE5PIHRoZSBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIKKyMgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdCBqdXN0IHRoZSBzYW1lLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUKKyMgYXJlIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4KKyMgVGhpcyBpcyB1c2VmdWwgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lCisjIE1ha2VmaWxlIGRvbid0IG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGV2YWx1YXRlIGFsbCBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlCisjIGZpbGVzLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybworIyBuYW1lcyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgY29uZGl0aW9uYWwKKyMgY29tcGlsYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQKKyMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUworIyB0aGVuIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZQorIyBQUkVERUZJTkVEIGFuZCBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gTk8KKworIyBJZiB0aGUgU0VBUkNIX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlIGluY2x1ZGVzIGZpbGVzCisjIGluIHRoZSBJTkNMVURFX1BBVEggKHNlZSBiZWxvdykgd2lsbCBiZSBzZWFyY2ggaWYgYSAjaW5jbHVkZSBpcyBmb3VuZC4KKworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5CisjIHRoZSBwcmVwcm9jZXNzb3IuCisKK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPQorCisjIFlvdSBjYW4gdXNlIHRoZSBJTkNMVURFX0ZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQKKyMgcGF0dGVybnMgKGxpa2UgKi5oIGFuZCAqLmhwcCkgdG8gZmlsdGVyIG91dCB0aGUgaGVhZGVyLWZpbGVzIGluIHRoZQorIyBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuaywgdGhlIHBhdHRlcm5zIHNwZWNpZmllZCB3aXRoIEZJTEVfUEFUVEVSTlMgd2lsbAorIyBiZSB1c2VkLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0KKworIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0CisjIGFyZSBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lCisjIG9yIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSA9IGFyZQorIyBvbWl0dGVkID0xIGlzIGFzc3VtZWQuIFRvIHByZXZlbnQgYSBtYWNybyBkZWZpbml0aW9uIGZyb20gYmVpbmcKKyMgdW5kZWZpbmVkIHZpYSAjdW5kZWYgb3IgcmVjdXJzaXZlbHkgZXhwYW5kZWQgdXNlIHRoZSA6PSBvcGVyYXRvcgorIyBpbnN0ZWFkIG9mIHRoZSA9IG9wZXJhdG9yLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0KKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuCisjIHRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLgorIyBUaGUgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4KKyMgVXNlIHRoZSBQUkVERUZJTkVEIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbi4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9CisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbgorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCBmdW5jdGlvbi1saWtlIG1hY3JvcyB0aGF0IGFyZSBhbG9uZQorIyBvbiBhIGxpbmUsIGhhdmUgYW4gYWxsIHVwcGVyY2FzZSBuYW1lLCBhbmQgZG8gbm90IGVuZCB3aXRoIGEgc2VtaWNvbG9uLiBTdWNoCisjIGZ1bmN0aW9uIG1hY3JvcyBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIGJvaWxlci1wbGF0ZSBjb2RlLCBhbmQgd2lsbCBjb25mdXNlCisjIHRoZSBwYXJzZXIgaWYgbm90IHJlbW92ZWQuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZ2ZpbGVzLgorIyBPcHRpb25hbGx5IGFuIGluaXRpYWwgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24KKyMgY2FuIGJlIGFkZGVkIGZvciBlYWNoIHRhZ2ZpbGUuIFRoZSBmb3JtYXQgb2YgYSB0YWcgZmlsZSB3aXRob3V0CisjIHRoaXMgbG9jYXRpb24gaXMgYXMgZm9sbG93czoKKyMKKyMgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4KKyMgQWRkaW5nIGxvY2F0aW9uIGZvciB0aGUgdGFnIGZpbGVzIGlzIGRvbmUgYXMgZm9sbG93czoKKyMKKyMgVEFHRklMRVMgPSBmaWxlMT1sb2MxICJmaWxlMiA9IGxvYzIiIC4uLgorIyB3aGVyZSAibG9jMSIgYW5kICJsb2MyIiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IKKyMgVVJMcy4gSWYgYSBsb2NhdGlvbiBpcyBwcmVzZW50IGZvciBlYWNoIHRhZywgdGhlIGluc3RhbGxkb3ggdG9vbAorIyBkb2VzIG5vdCBoYXZlIHRvIGJlIHJ1biB0byBjb3JyZWN0IHRoZSBsaW5rcy4KKyMgTm90ZSB0aGF0IGVhY2ggdGFnIGZpbGUgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUKKyMgKHdoZXJlIHRoZSBuYW1lIGRvZXMgTk9UIGluY2x1ZGUgdGhlIHBhdGgpCisjIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuCisjIGlzIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPQorCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUKKyMgYSB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4KKworR0VORVJBVEVfVEFHRklMRSAgICAgICA9CisKKyMgSWYgdGhlIEFMTEVYVEVSTkFMUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3NlcworIyB3aWxsIGJlIGxpc3RlZC4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgZ3JvdXBzIHdpbGwgYmUgbGlzdGVkCisjIGluIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsCisjIGJlIGxpc3RlZC4KKworRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mIGB3aGljaCBwZXJsJykuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgaW5oZXJpdGFuY2UgZGlhZ3JhbSAoaW4gSFRNTCwgUlRGIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlCisjIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0byBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQKKyMgdGhpcyBvcHRpb24gaXMgc3VwZXJzZWRlZCBieSB0aGUgSEFWRV9ET1Qgb3B0aW9uIGJlbG93LiBUaGlzIGlzIG9ubHkgYQorIyBmYWxsYmFjay4gSXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKKyMgcG93ZXJmdWwgZ3JhcGhzLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCisKKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlCisjIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0KKworIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZQorIyBpbmhlcml0YW5jZSBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkCisjIG9yIGlzIG5vdCBhIGNsYXNzLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiwgYSBncmFwaCB2aXN1YWxpemF0aW9uCisjIHRvb2xraXQgZnJvbSBBVCZUIGFuZCBMdWNlbnQgQmVsbCBMYWJzLiBUaGUgb3RoZXIgb3B0aW9ucyBpbiB0aGlzIHNlY3Rpb24KKyMgaGF2ZSBubyBlZmZlY3QgaWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkKKworSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PCisKKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgd3JpdGUgYSBmb250IGNhbGxlZCBGcmVlU2Fucy50dGYgdG8gdGhlIG91dHB1dAorIyBkaXJlY3RvcnkgYW5kIHJlZmVyZW5jZSBpdCBpbiBhbGwgZG90IGZpbGVzIHRoYXQgZG94eWdlbiBnZW5lcmF0ZXMuIFRoaXMKKyMgZm9udCBkb2VzIG5vdCBpbmNsdWRlIGFsbCBwb3NzaWJsZSB1bmljb2RlIGNoYXJhY3RlcnMgaG93ZXZlciwgc28gd2hlbiB5b3UgbmVlZAorIyB0aGVzZSAob3IganVzdCB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250KSB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZQorIyB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIG5lZWQgdG8gbWFrZSBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQgdGhlIGZvbnQsCisjIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYSBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nIHRoZQorIyBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUgZGlyZWN0b3J5CisjIGNvbnRhaW5pbmcgdGhlIGZvbnQuCisKK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBGcmVlU2FucworCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgZm9udCBvZiBkb3QgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCBzaXplIGlzIDEwcHQuCisKK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMAorCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSB0byBsb29rIGZvciB0aGUKKyMgRnJlZVNhbnMudHRmIGZvbnQgKHdoaWNoIGRveHlnZW4gd2lsbCBwdXQgdGhlcmUgaXRzZWxmKS4gSWYgeW91IHNwZWNpZnkgYQorIyBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiBzZXQgdGhlIHBhdGggd2hlcmUgZG90CisjIGNhbiBmaW5kIGl0IHVzaW5nIHRoaXMgdGFnLgorCitET1RfRk9OVFBBVEggICAgICAgICAgID0KKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQKKyMgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLiBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZQorIyB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQKKyMgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24gZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZAorIyBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCisKKyMgSWYgdGhlIEdST1VQX0dSQVBIUyBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzCisKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZworIyBMYW5ndWFnZS4KKworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIgaW5zdGFuY2VzLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERV9HUkFQSCwgYW5kIEhBVkVfRE9UCisjIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkCisjIGZpbGUgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoCisjIG90aGVyIGRvY3VtZW50ZWQgZmlsZXMuCisKK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERURfQllfR1JBUEgsIGFuZAorIyBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2gKKyMgZG9jdW1lbnRlZCBoZWFkZXIgZmlsZSBzaG93aW5nIHRoZSBkb2N1bWVudGVkIGZpbGVzIHRoYXQgZGlyZWN0bHkgb3IKKyMgaW5kaXJlY3RseSBpbmNsdWRlIHRoaXMgZmlsZS4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIGFuZCBIQVZFX0RPVCBvcHRpb25zIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbCBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocworIyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4KKworQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBTExFUl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlciBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXIKKyMgZ3JhcGhzIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuCisKK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdyYXBoaWNhbCBoaWVyYXJjaHkgb2YgYWxsIGNsYXNzZXMgaW5zdGVhZCBvZiBhIHRleHR1YWwgb25lLgorCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCisKKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCwgU0hPV19ESVJFQ1RPUklFUyBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUworIyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZSBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzCisjIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZQorIyByZWxhdGlvbnMgYmV0d2VlbiB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTCisKKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gUG9zc2libGUgdmFsdWVzIGFyZSBwbmcsIGpwZywgb3IgZ2lmCisjIElmIGxlZnQgYmxhbmsgcG5nIHdpbGwgYmUgdXNlZC4KKworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZworCisjIFRoZSB0YWcgRE9UX1BBVEggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPQorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcZG90ZmlsZSBjb21tYW5kKS4KKworRE9URklMRV9ESVJTICAgICAgICAgICA9CisKKyMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyMgbm9kZXMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoCisjIGJlY29tZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMKKyMgdmlzdWFsaXplZCBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlCisjIG51bWJlciBvZiBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4KKyMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZQorIyB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILgorCitET1RfR1JBUEhfTUFYX05PREVTICAgID0gNTAKKworIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZQorIyBncmFwaHMgZ2VuZXJhdGVkIGJ5IGRvdC4gQSBkZXB0aCB2YWx1ZSBvZiAzIG1lYW5zIHRoYXQgb25seSBub2RlcyByZWFjaGFibGUKKyMgZnJvbSB0aGUgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMKKyMgdGhhdCBsYXkgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzCisjIG9wdGlvbiB0byAxIG9yIDIgbWF5IGdyZWF0bHkgcmVkdWNlIHRoZSBjb21wdXRhdGlvbiB0aW1lIG5lZWRlZCBmb3IgbGFyZ2UKKyMgY29kZSBiYXNlcy4gQWxzbyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5CisjIERPVF9HUkFQSF9NQVhfTk9ERVMuIFVzaW5nIGEgZGVwdGggb2YgMCBtZWFucyBubyBkZXB0aCByZXN0cmljdGlvbi4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90CisjIHNlZW0gdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LiBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsCisjIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mCisjIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0byByZWFkKS4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKQorIyBzdXBwb3J0IHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQKKyMgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkIGdyYXBocy4KKworR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUworCisjIElmIHRoZSBET1RfQ0xFQU5VUCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZQorIyB0aGUgdmFyaW91cyBncmFwaHMuCisKK0RPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9KYW1yb290IGIvc3JjL2tlbmxtL0phbXJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3MGMyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9KYW1yb290CkBAIC0wLDAgKzEsNjggQEAKKyNCVUlMRElORyBLRU5MTQorIworI0RFUEVOREVOQ0lFUworI1JlbWVtYmVyIHRoYXQgc29tZSBkaXN0cmlidXRpb25zIHNwbGl0IHBhY2thZ2VzIGludG8gZGV2ZWxvcG1lbnQgYW5kIGJpbmFyeQorI3ZlcnNpb25zLiAgWW91IG5lZWQgdGhlIGRldmVsb3BtZW50IHZlcnNpb25zLgorIworI3psaWIgYW5kIEJvb3N0ID49IDEuMzYuMCBhcmUgcmVxdWlyZWQuICBEb24ndCBoYXZlIEJvb3N0PyAgWW91IGNhbiBjb21waWxlIHRoZQorI3F1ZXJpZXMgcGFydCB3aXRoIC4vY29tcGlsZV9xdWVyeV9vbmx5LnNoIC4gIAorIy0td2l0aC1ib29zdD0vcGF0aC90by9ib29zdCB1c2VzIGEgQm9vc3QgaW5zdGFsbCBmcm9tIGEgY3VzdG9tIHBhdGguCisjCisjVGhlIGZvbGxvd2luZyBvcHRpb25hbCBwYWNrYWdlcyBhcmUgYXV0b2RldGVjdGVkOgorI2xpYnRjbWFsbG9jX21pbmltYWwgZnJvbSBnb29nbGUtcGVyZnRvb2xzCisjYnppcDIKKyNsem1hIGFrYSB4egorIworI0lOU1RBTExBVElPTgorIy0tcHJlZml4PS9wYXRoL3RvL3ByZWZpeCBzZXRzIHRoZSBpbnN0YWxsIHByZWZpeCBbZGVmYXVsdCBpcyBzb3VyY2Ugcm9vdF0uCisjLS1iaW5kaXI9L3BhdGgvdG8vcHJlZml4L2JpbiBzZXRzIHRoZSBiaW4gZGlyZWN0b3J5IFtQUkVGSVgvYmluXQorIy0tbGliZGlyPS9wYXRoL3RvL3ByZWZpeC9saWIgc2V0cyB0aGUgbGliIGRpcmVjdG9yeSBbUFJFRklYL2xpYl0KKyMtLWluY2x1ZGVkaXI9L3BhdGgvdG8vcHJlZml4L2luY2x1ZGUgaW5zdGFsbHMgaGVhZGVycy4gIAorIyAgRG9lcyBub3QgaW5zdGFsbCBpZiBtaXNzaW5nLiAgTm8gYXJndW1lbnQgZGVmYXVsdHMgdG8gUFJFRklYL2luY2x1ZGUgLgorIy0taW5zdGFsbC1zY3JpcHRzPS9wYXRoL3RvL3NjcmlwdHMgY29waWVzIHNjcmlwdHMgaW50byBhIGRpcmVjdG9yeS4KKyMgIERvZXMgbm90IGluc3RhbGwgaWYgbWlzc2luZy4gIE5vIGFyZ3VtZW50IGRlZmF1bHRzIHRvIFBSRUZJWC9zY3JpcHRzIC4KKyMtLWdpdCBhcHBlbmRzIHRoZSBnaXQgcmV2aXNpb24gdG8gdGhlIHByZWZpeCBkaXJlY3RvcnkuCisjCisjQlVJTEQgT1BUSU9OUworIyBCeSBkZWZhdWx0LCB0aGUgYnVpbGQgaXMgbXVsdGktdGhyZWFkZWQsIG9wdGltaXplZCwgYW5kIHN0YXRpY2FsbHkgbGlua2VkLiAgCisjIFBhc3MgdGhlc2UgdG8gY2hhbmdlIHRoZSBidWlsZDoKKyMKKyMgdGhyZWFkaW5nPXNpbmdsZXxtdWx0aSAgICAgICAgIGNvbnRyb2xzIHRocmVhZGluZyAoZGVmYXVsdCBtdWx0aSkKKyMKKyMgdmFyaWFudD1yZWxlYXNlfGRlYnVnfHByb2ZpbGUgIGJ1aWxkcyBvcHRpbWl6ZWQgKGRlZmF1bHQpLCBmb3IgZGVidWcsIG9yIGZvcgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsaW5nCisjCisjIGxpbms9c3RhdGljfHNoYXJlZCAgICAgICAgICAgICBjb250cm9scyBwcmVmZXJyZWQgbGlua2luZyAoZGVmYXVsdCBzdGF0aWMpCisjIC0tc3RhdGljICAgICAgICAgICAgICAgICAgICAgICBmb3JjZXMgc3RhdGljIGxpbmtpbmcgKHRoZSBkZWZhdWx0IHdpbGwgZmFsbAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjayB0byBzaGFyZWQpCisjCisjIGRlYnVnLXN5bWJvbHM9b258b2ZmICAgICAgICAgICBpbmNsdWRlIG9yIGV4Y2x1ZGUgKGRlZmF1bHQpIGRlYnVnZ2luZworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWxzbyBrbm93biBhcyAtZworIyAtLXdpdGhvdXQtbGlic2VnZmF1bHQgICAgICAgICAgZG9lcyBub3QgbGluayB3aXRoIGxpYlNlZ0ZhdWx0CisjCisjIC0tbWF4LWtlbmxtLW9yZGVyICAgICAgICAgICAgICBtYXhpbXVtIG5ncmFtIG9yZGVyIHRoYXQga2VubG0gY2FuIHByb2Nlc3MgKGRlZmF1bHQgNikKKyMKKyNDT05UUk9MTElORyBUSEUgQlVJTEQKKyMtYSB0byBidWlsZCBmcm9tIHNjcmF0Y2gKKyMtaiROQ1BVUyB0byBjb21waWxlIGluIHBhcmFsbGVsCisjLS1jbGVhbiB0byBjbGVhbgorCitwYXRoLWNvbnN0YW50IFRPUCA6IC4gOworaW5jbHVkZSAkKFRPUCkvamFtLWZpbGVzL3Nhbml0eS5qYW0gOworCitib29zdCAxMDM2MDAgOworcHJvamVjdCA6IHJlcXVpcmVtZW50cyAkKHJlcXVpcmVtZW50cykgPGluY2x1ZGU+LiA7Citwcm9qZWN0IDogZGVmYXVsdC1idWlsZCA8dGhyZWFkaW5nPm11bHRpIDx3YXJuaW5ncz5vbiA8dmFyaWFudD5yZWxlYXNlIDxsaW5rPnN0YXRpYyA7CisKK2V4dGVybmFsLWxpYiB6IDsKKworYnVpbGQtcHJvamVjdCBsbSA7CitidWlsZC1wcm9qZWN0IHV0aWwgOworCitsaWIga2VubG0gOiBsbS8va2VubG0gOworCitpbnN0YWxsLWJpbi1saWJzIGxtLy9wcm9ncmFtcyB1dGlsLy9wcm9ncmFtcyBrZW5sbSA7CitpbnN0YWxsLWhlYWRlcnMgcHJlZml4LWluY2x1ZGUgOiBbIGdsb2ItdHJlZSAqLmhoIDogZGlzdCBpbmNsdWRlIHByZWZpeC1pbmNsdWRlIF0gOiAuIDsKK2FsaWFzIGluc3RhbGwgOiBwcmVmaXgtYmluIHByZWZpeC1saWIgcHJlZml4LWluY2x1ZGUgOyAKK2V4cGxpY2l0IGhlYWRlcnMgOworZXhwbGljaXQgaW5zdGFsbCA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vTElDRU5TRSBiL3NyYy9rZW5sbS9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZmJiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vTElDRU5TRQpAQCAtMCwwICsxLDI2IEBACitNb3N0IG9mIHRoZSBjb2RlIGhlcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIExHUEwuICBUaGVyZSBhcmUgZXhjZXB0aW9ucyB0aGF0CitoYXZlIHRoZWlyIG93biBsaWNlbnNlcywgbGlzdGVkIGJlbG93LiAgU2VlIGNvbW1lbnRzIGluIHRob3NlIGZpbGVzIGZvciBtb3JlCitkZXRhaWxzLiAgCisKK3V0aWwvZ2V0b3B0LiogaXMgZ2V0b3B0IGZvciBXaW5kb3dzCit1dGlsL211cm11cl9oYXNoLmNjCit1dGlsL3N0cmluZ19waWVjZS5oaCBhbmQgdXRpbC9zdHJpbmdfcGllY2UuY2MKK3V0aWwvZG91YmxlLWNvbnZlcnNpb24vTElDRU5TRSBjb3ZlcnMgdXRpbC9kb3VibGUtY29udmVyc2lvbiBleGNlcHQgSmFtZmlsZQordXRpbC9maWxlLmNjIGNvbnRhaW5zIGEgbW9kaWZpZWQgaW1wbGVtZW50YXRpb24gb2YgbWtzdGVtcCB1bmRlciB0aGUgTEdQTAordXRpbC9pbnRlZ2VyX3RvX3N0cmluZy4qIGlzIEJTRAoramFtLWZpbGVzL0xJQ0VOU0VfMV8wLnR4dCBjb3ZlcnMgamFtLWZpbGVzIGV4Y2VwdCBKYW1yb290CisKK0ZvciB0aGUgcmVzdDoKKworICAgIEtlbkxNIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIEtlbkxNIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgMi4xCisgICAgYWxvbmcgd2l0aCBLZW5MTSBjb2RlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLTIuMS5odG1sPi4KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9SRUFETUUubWQgYi9zcmMva2VubG0vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODg1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vUkVBRE1FLm1kCkBAIC0wLDAgKzEsOTYgQEAKKyMga2VubG0KKworTGFuZ3VhZ2UgbW9kZWwgaW5mZXJlbmNlIGNvZGUgYnkgS2VubmV0aCBIZWFmaWVsZCAoa2VubG0gYXQga2hlYWZpZWxkLmNvbSkKKworSSBkbyBkZXZlbG9wbWVudCBpbiBtYXN0ZXIgb24gaHR0cHM6Ly9naXRodWIuY29tL2twdS9rZW5sbS8uICBOb3JtYWxseSwgaXQgd29ya3MsIGJ1dCBJIGRvIG5vdCBndWFyYW50ZWUgaXQgd2lsbCBjb21waWxlLCBnaXZlIGNvcnJlY3QgYW5zd2Vycywgb3IgZ2VuZXJhdGUgbm9uLWJyb2tlbiBiaW5hcnkgZmlsZXMuICBGb3IgYSBtb3JlIHN0YWJsZSByZWxlYXNlLCBnZXQgaHR0cDovL2toZWFmaWVsZC5jb20vY29kZS9rZW5sbS50YXIuZ3ogLiAgCisKK1RoZSB3ZWJzaXRlIGh0dHA6Ly9raGVhZmllbGQuY29tL2NvZGUva2VubG0vIGhhcyBtb3JlIGRvY3VtZW50YXRpb24uICBJZiB5b3UncmUgYSBkZWNvZGVyIGRldmVsb3BlciwgcGxlYXNlIGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIHRoZXJlIGluc3RlYWQgb2YgY29weWluZyBmcm9tIGFub3RoZXIgZGVjb2Rlci4gIAorCisjIyBDb21waWxpbmcKK1NlZSBCVUlMRElORy4gCisKKyMjIENvbXBpbGluZyB3aXRoIHlvdXIgb3duIGJ1aWxkIHN5c3RlbQorSWYgeW91IHdhbnQgdG8gY29tcGlsZSB3aXRoIHlvdXIgb3duIGJ1aWxkIHN5c3RlbSAoTWFrZWZpbGUgZXRjKSBvciB0byB1c2UgYXMgYSBsaWJyYXJ5LCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgbWFjcm9zIHlvdSBjYW4gc2V0IG9uIHRoZSBnKysgY29tbWFuZCBsaW5lIG9yIGluIHV0aWwvaGF2ZS5oaCAuICAKKworKiBgS0VOTE1fTUFYX09SREVSYCBpcyB0aGUgbWF4aW11bSBvcmRlciB0aGF0IGNhbiBiZSBsb2FkZWQuICBUaGlzIGlzIGRvbmUgdG8gbWFrZSBzdGF0ZSBhbiBlZmZpY2llbnQgUE9EIHJhdGhlciB0aGFuIGEgdmVjdG9yLiAgCisqIGBIQVZFX0lDVWAgSWYgeW91ciBjb2RlIGxpbmtzIGFnYWluc3QgSUNVLCBkZWZpbmUgdGhpcyB0byBkaXNhYmxlIHRoZSBpbnRlcm5hbCBTdHJpbmdQaWVjZSBhbmQgcmVwbGFjZSBpdCB3aXRoIElDVSdzIGNvcHkgb2YgU3RyaW5nUGllY2UsIGF2b2lkaW5nIG5hbWluZyBjb25mbGljdHMuICAKKworQVJQQSBmaWxlcyBjYW4gYmUgcmVhZCBpbiBjb21wcmVzc2VkIGZvcm1hdCB3aXRoIHRoZXNlIG9wdGlvbnM6CisqIGBIQVZFX1pMSUJgIFN1cHBvcnRzIGd6aXAuICBMaW5rIHdpdGggLWx6LgorKiBgSEFWRV9CWkxJQmAgU3VwcG9ydHMgYnppcDIuICBMaW5rIHdpdGggLWxiejIuCisqIGBIQVZFX1haTElCYCBTdXBwb3J0cyB4ei4gIExpbmsgd2l0aCAtbGx6bWEuCisKK05vdGUgdGhhdCB0aGVzZSBtYWNyb3MgaW1wYWN0IG9ubHkgYHJlYWRfY29tcHJlc3NlZC5jY2AgYW5kIGByZWFkX2NvbXByZXNzZWRfdGVzdC5jY2AuICBUaGUgYmphbSBidWlsZCBzeXN0ZW0gd2lsbCBhdXRvLWRldGVjdCBiemlwMiBhbmQgeHogc3VwcG9ydC4gIAorCisjIyBFc3RpbWF0aW9uCitsbXBseiBlc3RpbWF0ZXMgdW5wcnVuZWQgbGFuZ3VhZ2UgbW9kZWxzIHdpdGggbW9kaWZpZWQgS25lc2VyLU5leSBzbW9vdGhpbmcuICBBZnRlciBjb21waWxpbmcgd2l0aCBiamFtLCBydW4KK2BgYGJhc2gKK2Jpbi9sbXBseiAtbyA1IDx0ZXh0ID50ZXh0LmFycGEKK2BgYAorVGhlIGFsZ29yaXRobSBpcyBvbi1kaXNrLCB1c2luZyBhbiBhbW91bnQgb2YgbWVtb3J5IHRoYXQgeW91IHNwZWNpZnkuICBTZWUgaHR0cDovL2toZWFmaWVsZC5jb20vY29kZS9rZW5sbS9lc3RpbWF0aW9uLyBmb3IgbW9yZS4gIAorCitNVCBNYXJhdGhvbiAyMDEyIHRlYW0gbWVtYmVycyBJdmFuIFBvdXp5cmV2c2t5IGFuZCBNb2hhbW1lZCBNZWRpYW5pIGNvbnRyaWJ1dGVkIHRvIHRoZSBjb21wdXRhdGlvbiBkZXNpZ24gYW5kIGVhcmx5IGltcGxlbWVudGF0aW9uLiBKb24gQ2xhcmsgY29udHJpYnV0ZWQgdG8gdGhlIGRlc2lnbiwgY2xhcmlmaWVkIHBvaW50cyBhYm91dCBzbW9vdGhpbmcsIGFuZCBhZGRlZCBsb2dnaW5nLiAKKworIyMgRmlsdGVyaW5nCisKK2ZpbHRlciB0YWtlcyBhbiBBUlBBIG9yIGNvdW50IGZpbGUgYW5kIHJlbW92ZXMgZW50cmllcyB0aGF0IHdpbGwgbmV2ZXIgYmUgcXVlcmllZC4gIFRoZSBmaWx0ZXIgY3JpdGVyaW9uIGNhbiBiZSBjb3JwdXMtbGV2ZWwgdm9jYWJ1bGFyeSwgc2VudGVuY2UtbGV2ZWwgdm9jYWJ1bGFyeSwgb3Igc2VudGVuY2UtbGV2ZWwgcGhyYXNlcy4gIFJ1bgorYGBgYmFzaAorYmluL2ZpbHRlcgorYGBgCithbmQgc2VlIGh0dHA6Ly9raGVhZmllbGQuY29tL2NvZGUva2VubG0vZmlsdGVyLyBmb3IgbW9yZSBkb2N1bWVudGF0aW9uLgorCisjIyBRdWVyeWluZworCitUd28gZGF0YSBzdHJ1Y3R1cmVzIGFyZSBzdXBwb3J0ZWQ6IHByb2JpbmcgYW5kIHRyaWUuICBQcm9iaW5nIGlzIGEgcHJvYmluZyBoYXNoIHRhYmxlIHdpdGgga2V5cyB0aGF0IGFyZSA2NC1iaXQgaGFzaGVzIG9mIG4tZ3JhbXMgYW5kIGZsb2F0cyBhcyB2YWx1ZXMuICBUcmllIGlzIGEgZmFpcmx5IHN0YW5kYXJkIHRyaWUgYnV0IHdpdGggYml0LWxldmVsIHBhY2tpbmcgc28gaXQgdXNlcyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyB0byBzdG9yZSB3b3JkIGluZGljZXMgYW5kIHBvaW50ZXJzLiAgVGhlIHRyaWUgbm9kZSBlbnRyaWVzIGFyZSBzb3J0ZWQgYnkgd29yZCBpbmRleC4gIFByb2JpbmcgaXMgdGhlIGZhc3Rlc3QgYW5kIHVzZXMgdGhlIG1vc3QgbWVtb3J5LiAgVHJpZSB1c2VzIHRoZSBsZWFzdCBtZW1vcnkgYW5kIGEgYml0IHNsb3dlci4gIAorCitXaXRoIHRyaWUsIHJlc2lkZW50IG1lbW9yeSBpcyA1OCUgb2YgSVJTVCdzIHNtYWxsZXN0IHZlcnNpb24gYW5kIDIxJSBvZiBTUkkncyBjb21wYWN0IHZlcnNpb24uICBTaW11bHRhbmVvdXNseSwgdHJpZSBDUFUncyB1c2UgaXMgODElIG9mIElSU1QncyBmYXN0ZXN0IHZlcnNpb24gYW5kIDg0JSBvZiBTUkkncyBmYXN0IHZlcnNpb24uICBLZW5MTSdzIHByb2JpbmcgaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbiBnb2VzIGV2ZW4gZmFzdGVyIGF0IHRoZSBleHBlbnNlIG9mIHVzaW5nIG1vcmUgbWVtb3J5LiAgU2VlIGh0dHA6Ly9raGVhZmllbGQuY29tL2NvZGUva2VubG0vYmVuY2htYXJrLy4gIAorCitCaW5hcnkgZm9ybWF0IHZpYSBtbWFwIGlzIHN1cHBvcnRlZC4gIFJ1biBgLi9idWlsZF9iaW5hcnlgIHRvIG1ha2Ugb25lIHRoZW4gcGFzcyB0aGUgYmluYXJ5IGZpbGUgbmFtZSB0byB0aGUgYXBwcm9wcmlhdGUgTW9kZWwgY29uc3RydWN0b3IuICAgCisKKyMjIFBsYXRmb3JtcworYG11cm11cl9oYXNoLmNjYCBhbmQgYGJpdF9wYWNraW5nLmhoYCBwZXJmb3JtIHVuYWxpZ25lZCByZWFkcyBhbmQgd3JpdGVzIHRoYXQgbWFrZSB0aGUgY29kZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50LiAgCitJdCBoYXMgYmVlbiBzdWNlc3NmdWxseSB0ZXN0ZWQgb24geDg2XF82NCwgeDg2LCBhbmQgUFBDNjQuICAKK0FSTSBzdXBwb3J0IGlzIHJlcG9ydGVkbHkgd29ya2luZywgYXQgbGVhc3Qgb24gdGhlIGlwaG9uZS4gICAKKworUnVucyBvbiBMaW51eCwgT1MgWCwgQ3lnd2luLCBhbmQgTWluR1cuICAKKworSGlkZW8gT2t1bWEgYW5kIFRvbW95dWtpIFlvc2hpbXVyYSBmcm9tIE5JQ1QgY29udHJpYnV0ZWQgcG9ydHMgdG8gQVJNIGFuZCBNaW5HVy4gIAorCisjIyBEZWNvZGVyIGRldmVsb3BlcnMKKy0gSSByZWNvbW1lbmQgY29weWluZyB0aGUgY29kZSBhbmQgZGlzdHJpYnV0aW5nIGl0IHdpdGggeW91ciBkZWNvZGVyLiAgSG93ZXZlciwgcGxlYXNlIHNlbmQgaW1wcm92ZW1lbnRzIHVwc3RyZWFtLiAgCisKKy0gT21pdCB0aGUgbG0vZmlsdGVyIGRpcmVjdG9yeSBpZiB5b3UgZG8gbm90IHdhbnQgdGhlIGxhbmd1YWdlIG1vZGVsIGZpbHRlci4gIE9ubHkgdGhhdCBhbmQgdGVzdHMgZGVwZW5kIG9uIEJvb3N0LiAgCisKKy0gU2VsZWN0IHRoZSBtYWNyb3MgeW91IHdhbnQsIGxpc3RlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gIAorCistIFRoZXJlIGFyZSB0d28gYnVpbGQgc3lzdGVtczogY29tcGlsZS5zaCBhbmQgSmFtcm9vdCtKYW1maWxlLiAgVGhleSdyZSBwcmV0dHkgc2ltcGxlIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgcmVpbXBsZW1lbnRlZCBpbiB5b3VyIGJ1aWxkIHN5c3RlbS4gIAorCistIFVzZSBlaXRoZXIgdGhlIGludGVyZmFjZSBpbiBgbG0vbW9kZWwuaGhgIG9yIGBsbS92aXJ0dWFsX2ludGVyZmFjZS5oaGAuICBJbnRlcmZhY2UgZG9jdW1lbnRhdGlvbiBpcyBpbiBjb21tZW50cyBvZiBgbG0vdmlydHVhbF9pbnRlcmZhY2UuaGhgIGFuZCBgbG0vbW9kZWwuaGhgLiAgCisKKy0gVGhlcmUgYXJlIHNldmVyYWwgcG9zc2libGUgZGF0YSBzdHJ1Y3R1cmVzIGluIGBtb2RlbC5oaGAuICBVc2UgYFJlY29nbml6ZUJpbmFyeWAgaW4gYGJpbmFyeV9mb3JtYXQuaGhgIHRvIGRldGVybWluZSB3aGljaCBvbmUgYSB1c2VyIGhhcyBwcm92aWRlZC4gIFlvdSBwcm9iYWJseSBhbHJlYWR5IGltcGxlbWVudCBmZWF0dXJlIGZ1bmN0aW9ucyBhcyBhbiBhYnN0cmFjdCB2aXJ0dWFsIGJhc2UgY2xhc3Mgd2l0aCBzZXZlcmFsIGNoaWxkcmVuLiAgSSBzdWdnZXN0IHlvdSBjby1vcHQgdGhpcyBleGlzdGluZyB2aXJ0dWFsIGRpc3BhdGNoIGJ5IHRlbXBsYXRpemluZyB0aGUgbGFuZ3VhZ2UgbW9kZWwgZmVhdHVyZSBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgS2VuTE0gbW9kZWwgaWRlbnRpZmllZCBieSBgUmVjb2duaXplQmluYXJ5YC4gIFRoaXMgaXMgdGhlIHN0cmF0ZWd5IHVzZWQgaW4gTW9zZXMgYW5kIGNkZWMuCisKKy0gU2VlIGBsbS9jb25maWcuaGhgIGZvciBydW4tdGltZSB0dW5pbmcgb3B0aW9ucy4KKworIyMgQ29udHJpYnV0b3JzCitDb250cmlidXRpb25zIHRvIEtlbkxNIGFyZSB3ZWxjb21lLiAgUGxlYXNlIGJhc2UgeW91ciBjb250cmlidXRpb25zIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9rcHUva2VubG0gYW5kIHNlbmQgcHVsbCByZXF1ZXN0cyAob3IgSSBtaWdodCBnaXZlIHlvdSBjb21taXQgYWNjZXNzKS4gIERvd25zdHJlYW0gY29waWVzIGluIE1vc2VzIGFuZCBjZGVjIGFyZSBtYWludGFpbmVkIGJ5IG92ZXJ3cml0aW5nIHRoZW0gc28gZG8gbm90IG1ha2UgY2hhbmdlcyB0aGVyZS4gIAorCisjIyBQeXRob24gbW9kdWxlCitDb250cmlidXRlZCBieSBWaWN0b3IgQ2hhaHVuZWF1LgorCisjIyMgSW5zdGFsbGF0aW9uCisKK2BgYGJhc2gKK3BpcCBpbnN0YWxsIGh0dHBzOi8vZ2l0aHViLmNvbS9rcHUva2VubG0vYXJjaGl2ZS9tYXN0ZXIuemlwCitgYGAKKworIyMjIEJhc2ljIFVzYWdlCitgYGBweXRob24KK2ltcG9ydCBrZW5sbQorbW9kZWwgPSBrZW5sbS5MYW5ndWFnZU1vZGVsKCdsbS90ZXN0LmFycGEnKQorc2VudGVuY2UgPSAndGhpcyBpcyBhIHNlbnRlbmNlIC4nCitwcmludChtb2RlbC5zY29yZShzZW50ZW5jZSkpCitgYGAKKworLS0tCisKK1RoZSBuYW1lIHdhcyBIaWV1IEhvYW5nJ3MgaWRlYSwgbm90IG1pbmUuICAKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9iamFtIGIvc3JjL2tlbmxtL2JqYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM5ZWE5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9iamFtCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9iYXNoCitzZXQgLWUKK3RvcD0iJChkaXJuYW1lICIkMCIpIgoraWYKKyAgYmphbT0iJCh3aGljaCBiamFtIDI+L2Rldi9udWxsKSIgJiYgI2V4aXN0cworICBbICR7I2JqYW19ICE9IDAgXSAmJiAjcGFyYW5vaWEgYWJvdXQgd2hpY2ggcHJpbnRpbmcgbm90aGluZyB0aGVuIHJldHVybmluZyB0cnVlCisgICEgZ3JlcCBVRklIR1VGSUhCREpLTkNGWlhBRVZBICIke2JqYW19IiA8L2Rldi9udWxsID4vZGV2L251bGwgJiYgI2JqYW0gaW4gcGF0aCBpc24ndCB0aGlzIHNjcmlwdAorICAiJHtiamFtfSIgLS1zYW5pdHktdGVzdCAyPi9kZXYvbnVsbCB8Z3JlcCBTYW5lID4vZGV2L251bGwgJiYgI1RoZSB0ZXN0IGluIGphbS1maWxlcy9zYW5pdHkuamFtIHBhc3NlcworICAoY2QgIiR7dG9wfS9qYW0tZmlsZXMvZmFpbCIgJiYgISAiJHtiamFtfSIpID4vZGV2L251bGwgI1JldHVybnMgbm9uLXplcm8gb24gZmFpbHVyZQordGhlbgorICAjRGVsZWdhdGUgdG8gc3lzdGVtIGJqYW0KKyAgZXhlYyAiJHtiamFtfSIgIiRAIgorZmkKKworaWYgWyAhIC14ICIkdG9wIi9qYW0tZmlsZXMvYmphbS0xXzU1IF07IHRoZW4KKyAgcHVzaGQgIiR0b3AvamFtLWZpbGVzL2VuZ2luZSIKKyAgLi9idWlsZC5zaAorICBjcCAtZiBiaW4uKi9iamFtIC4uL2JqYW0tMV81NQorICBwb3BkCitmaQorCitleHBvcnQgQk9PU1RfQlVJTERfUEFUSD0iJHRvcCIvamFtLWZpbGVzL2Jvb3N0LWJ1aWxkIAorZXhlYyAiJHRvcCIvamFtLWZpbGVzL2JqYW0tMV81NSAiJEAiCmRpZmYgLS1naXQgYS9zcmMva2VubG0vY2xlYW5fcXVlcnlfb25seS5zaCBiL3NyYy9rZW5sbS9jbGVhbl9xdWVyeV9vbmx5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2MzYyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vY2xlYW5fcXVlcnlfb25seS5zaApAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9iYXNoCitybSAtcmYge2xtLHV0aWwsdXRpbC9kb3VibGUtY29udmVyc2lvbn0vKi5vIGJpbi97cXVlcnksYnVpbGRfYmluYXJ5fQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2NtYWtlL0tlbkxNRnVuY3Rpb25zLmNtYWtlIGIvc3JjL2tlbmxtL2NtYWtlL0tlbkxNRnVuY3Rpb25zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDAwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vY21ha2UvS2VuTE1GdW5jdGlvbnMuY21ha2UKQEAgLTAsMCArMSw4MiBAQAorIyBIZWxwZXIgZnVuY3Rpb25zIHVzZWQgYWNyb3NzIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0KKworaW5jbHVkZShDTWFrZVBhcnNlQXJndW1lbnRzKQorCisjIEFkZHMgYSBidW5jaCBvZiBleGVjdXRhYmxlcyB0byB0aGUgYnVpbGQsIGVhY2ggZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQKKyMgZGVwZW5kZW50IG9iamVjdCBmaWxlcyBhbmQgbGlua2luZyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgbGlicmFyaWVzCitmdW5jdGlvbihBZGRFeGVzKQorICBzZXQobXVsdGlWYWx1ZUFyZ3MgRVhFUyBERVBFTkRTIExJQlJBUklFUykKKyAgY21ha2VfcGFyc2VfYXJndW1lbnRzKEFkZEV4ZXMgIiIgIiIgIiR7bXVsdGlWYWx1ZUFyZ3N9IiAke0FSR059KQorCisgICMgSXRlcmF0ZSB0aHJvdWdoIHRoZSBleGVjdXRhYmxlIGxpc3QKKyAgZm9yZWFjaChleGUgJHtBZGRFeGVzX0VYRVN9KQorCisgICAgIyBDb21waWxlIHRoZSBleGVjdXRhYmxlLCBsaW5raW5nIGFnYWluc3QgdGhlIHJlcXVpc2l0ZSBkZXBlbmRlbnQgb2JqZWN0IGZpbGVzCisgICAgYWRkX2V4ZWN1dGFibGUoJHtleGV9ICR7ZXhlfV9tYWluLmNjICR7QWRkRXhlc19ERVBFTkRTfSkKKworICAgICMgTGluayB0aGUgZXhlY3V0YWJsZSBhZ2FpbnN0IHRoZSBzdXBwbGllZCBsaWJyYXJpZXMKKyAgICBpZihBZGRFeGVzX0xJQlJBUklFUykKKyAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke2V4ZX0gJHtBZGRFeGVzX0xJQlJBUklFU30pCisgICAgZW5kaWYoKQorCisgICAgIyBHcm91cCBleGVjdXRhYmxlcyB0b2dldGhlcgorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke2V4ZX0gUFJPUEVSVElFUyBGT0xERVIgZXhlY3V0YWJsZXMpCisKKyAgIyBFbmQgZm9yIGxvb3AKKyAgZW5kZm9yZWFjaChleGUpCisKKyAgIyBJbnN0YWxsIHRoZSBleGVjdXRhYmxlIGZpbGVzCisgIGluc3RhbGwoVEFSR0VUUyAke0FkZEV4ZXNfRVhFU30gREVTVElOQVRJT04gYmluKQorZW5kZnVuY3Rpb24oKQorCisjIEFkZHMgYSBzaW5nbGUgdGVzdCB0byB0aGUgYnVpbGQsIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWVkIGRlcGVuZGVudAorIyBvYmplY3QgZmlsZXMsIGxpbmtpbmcgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIGxpYnJhcmllcywgYW5kIHdpdGggdGhlCisjIHNwZWNpZmllZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCitmdW5jdGlvbihLZW5MTUFkZFRlc3QpCisgIGNtYWtlX3BhcnNlX2FyZ3VtZW50cyhLZW5MTUFkZFRlc3QgIiIgIlRFU1QiCisgICAgICAgICAgICAgICAgICAgICAgICAiREVQRU5EUztMSUJSQVJJRVM7VEVTVF9BUkdTIiAke0FSR059KQorCisgICMgQ29tcGlsZSB0aGUgZXhlY3V0YWJsZSwgbGlua2luZyBhZ2FpbnN0IHRoZSByZXF1aXNpdGUgZGVwZW5kZW50IG9iamVjdCBmaWxlcworICBhZGRfZXhlY3V0YWJsZSgke0tlbkxNQWRkVGVzdF9URVNUfQorICAgICAgICAgICAgICAgICAke0tlbkxNQWRkVGVzdF9URVNUfS5jYworICAgICAgICAgICAgICAgICAke0tlbkxNQWRkVGVzdF9ERVBFTkRTfSkKKworICAjIFJlcXVpcmUgdGhlIGZvbGxvd2luZyBjb21waWxlIGZsYWcKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7S2VuTE1BZGRUZXN0X1RFU1R9IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAtREJPT1NUX1RFU1RfRFlOX0xJTkspCisKKyAgaWYoS2VuTE1BZGRUZXN0X0xJQlJBUklFUykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtLZW5MTUFkZFRlc3RfVEVTVH0gJHtLZW5MTUFkZFRlc3RfTElCUkFSSUVTfSkKKyAgZW5kaWYoKQorCisgIHNldCh0ZXN0X3BhcmFtcyAiIikKKyAgaWYoS2VuTE1BZGRUZXN0X1RFU1RfQVJHUykKKyAgICBzZXQodGVzdF9wYXJhbXMgJHtLZW5MTUFkZFRlc3RfVEVTVF9BUkdTfSkKKyAgZW5kaWYoKQorCisgICMgU3BlY2lmeSBjb21tYW5kIGFyZ3VtZW50cyBmb3IgaG93IHRvIHJ1biBlYWNoIHVuaXQgdGVzdAorICAjCisgICMgQXNzdW1pbmcgdGhhdCBmb28gd2FzIGRlZmluZWQgdmlhIGFkZF9leGVjdXRhYmxlKGZvbyAuLi4pLAorICAjICAgdGhlIHN5bnRheCAkPFRBUkdFVF9GSUxFOmZvbz4gZ2l2ZXMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZXhlY3V0YWJsZS4KKyAgIworICBhZGRfdGVzdChOQU1FICR7S2VuTE1BZGRUZXN0X1RFU1R9CisgICAgICAgICAgIENPTU1BTkQgJDxUQVJHRVRfRklMRToke0tlbkxNQWRkVGVzdF9URVNUfT4gJHt0ZXN0X3BhcmFtc30pCisKKyAgIyBHcm91cCB1bml0IHRlc3RzIHRvZ2V0aGVyCisgIHNldF90YXJnZXRfcHJvcGVydGllcygke0tlbkxNQWRkVGVzdF9URVNUfSBQUk9QRVJUSUVTIEZPTERFUiAidW5pdF90ZXN0cyIpCitlbmRmdW5jdGlvbigpCisKKyMgQWRkcyBhIGJ1bmNoIG9mIHRlc3RzIHRvIHRoZSBidWlsZCwgZWFjaCBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZAorIyBkZXBlbmRlbnQgb2JqZWN0IGZpbGVzIGFuZCBsaW5raW5nIGFnYWluc3QgdGhlIHNwZWNpZmllZCBsaWJyYXJpZXMKK2Z1bmN0aW9uKEFkZFRlc3RzKQorICBzZXQobXVsdGlWYWx1ZUFyZ3MgVEVTVFMgREVQRU5EUyBMSUJSQVJJRVMgVEVTVF9BUkdTKQorICBjbWFrZV9wYXJzZV9hcmd1bWVudHMoQWRkVGVzdHMgIiIgIiIgIiR7bXVsdGlWYWx1ZUFyZ3N9IiAke0FSR059KQorCisgICMgSXRlcmF0ZSB0aHJvdWdoIHRoZSBCb29zdCB0ZXN0cyBsaXN0CisgIGZvcmVhY2godGVzdCAke0tFTkxNX0JPT1NUX1RFU1RTX0xJU1R9KQorCisgICAgS2VuTE1BZGRUZXN0KFRFU1QgJHt0ZXN0fQorICAgICAgICAgICAgICAgICBERVBFTkRTICR7QWRkVGVzdHNfREVQRU5EU30KKyAgICAgICAgICAgICAgICAgTElCUkFSSUVTICR7QWRkVGVzdHNfTElCUkFSSUVTfQorICAgICAgICAgICAgICAgICBURVNUX0FSR1MgJHtBZGRUZXN0c19URVNUX0FSR1N9KQorICBlbmRmb3JlYWNoKHRlc3QpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9zcmMva2VubG0vY21ha2UvbW9kdWxlcy9GaW5kRWlnZW4zLmNtYWtlIGIvc3JjL2tlbmxtL2NtYWtlL21vZHVsZXMvRmluZEVpZ2VuMy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWExYWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2NtYWtlL21vZHVsZXMvRmluZEVpZ2VuMy5jbWFrZQpAQCAtMCwwICsxLDkwIEBACisjIC0gVHJ5IHRvIGZpbmQgRWlnZW4zIGxpYgorIworIyBUaGlzIG1vZHVsZSBzdXBwb3J0cyByZXF1aXJpbmcgYSBtaW5pbXVtIHZlcnNpb24sIGUuZy4geW91IGNhbiBkbworIyAgIGZpbmRfcGFja2FnZShFaWdlbjMgMy4xLjIpCisjIHRvIHJlcXVpcmUgdmVyc2lvbiAzLjEuMiBvciBuZXdlciBvZiBFaWdlbjMuCisjCisjIE9uY2UgZG9uZSB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBFSUdFTjNfRk9VTkQgLSBzeXN0ZW0gaGFzIGVpZ2VuIGxpYiB3aXRoIGNvcnJlY3QgdmVyc2lvbgorIyAgRUlHRU4zX0lOQ0xVREVfRElSIC0gdGhlIGVpZ2VuIGluY2x1ZGUgZGlyZWN0b3J5CisjICBFSUdFTjNfVkVSU0lPTiAtIGVpZ2VuIHZlcnNpb24KKyMKKyMgVGhpcyBtb2R1bGUgcmVhZHMgaGludHMgYWJvdXQgc2VhcmNoIGxvY2F0aW9ucyBmcm9tIAorIyB0aGUgZm9sbG93aW5nIGVudmlyb21lbnQgdmFyaWFibGVzOgorIworIyBFSUdFTjNfUk9PVAorIyBFSUdFTjNfUk9PVF9ESVIKKworIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgTW9udGVsIExhdXJlbnQsIDxtb250ZWxAa2RlLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCwgPGcuZ2FlbEBmcmVlLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSAyLWNsYXVzZSBCU0QgbGljZW5zZS4KKworaWYoTk9UIEVpZ2VuM19GSU5EX1ZFUlNJT04pCisgIGlmKE5PVCBFaWdlbjNfRklORF9WRVJTSU9OX01BSk9SKQorICAgIHNldChFaWdlbjNfRklORF9WRVJTSU9OX01BSk9SIDIpCisgIGVuZGlmKE5PVCBFaWdlbjNfRklORF9WRVJTSU9OX01BSk9SKQorICBpZihOT1QgRWlnZW4zX0ZJTkRfVkVSU0lPTl9NSU5PUikKKyAgICBzZXQoRWlnZW4zX0ZJTkRfVkVSU0lPTl9NSU5PUiA5MSkKKyAgZW5kaWYoTk9UIEVpZ2VuM19GSU5EX1ZFUlNJT05fTUlOT1IpCisgIGlmKE5PVCBFaWdlbjNfRklORF9WRVJTSU9OX1BBVENIKQorICAgIHNldChFaWdlbjNfRklORF9WRVJTSU9OX1BBVENIIDApCisgIGVuZGlmKE5PVCBFaWdlbjNfRklORF9WRVJTSU9OX1BBVENIKQorCisgIHNldChFaWdlbjNfRklORF9WRVJTSU9OICIke0VpZ2VuM19GSU5EX1ZFUlNJT05fTUFKT1J9LiR7RWlnZW4zX0ZJTkRfVkVSU0lPTl9NSU5PUn0uJHtFaWdlbjNfRklORF9WRVJTSU9OX1BBVENIfSIpCitlbmRpZihOT1QgRWlnZW4zX0ZJTkRfVkVSU0lPTikKKworbWFjcm8oX2VpZ2VuM19jaGVja192ZXJzaW9uKQorICBmaWxlKFJFQUQgIiR7RUlHRU4zX0lOQ0xVREVfRElSfS9FaWdlbi9zcmMvQ29yZS91dGlsL01hY3Jvcy5oIiBfZWlnZW4zX3ZlcnNpb25faGVhZGVyKQorCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiZGVmaW5lWyBcdF0rRUlHRU5fV09STERfVkVSU0lPTlsgXHRdKyhbMC05XSspIiBfZWlnZW4zX3dvcmxkX3ZlcnNpb25fbWF0Y2ggIiR7X2VpZ2VuM192ZXJzaW9uX2hlYWRlcn0iKQorICBzZXQoRUlHRU4zX1dPUkxEX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICBzdHJpbmcoUkVHRVggTUFUQ0ggImRlZmluZVsgXHRdK0VJR0VOX01BSk9SX1ZFUlNJT05bIFx0XSsoWzAtOV0rKSIgX2VpZ2VuM19tYWpvcl92ZXJzaW9uX21hdGNoICIke19laWdlbjNfdmVyc2lvbl9oZWFkZXJ9IikKKyAgc2V0KEVJR0VOM19NQUpPUl9WRVJTSU9OICIke0NNQUtFX01BVENIXzF9IikKKyAgc3RyaW5nKFJFR0VYIE1BVENIICJkZWZpbmVbIFx0XStFSUdFTl9NSU5PUl9WRVJTSU9OWyBcdF0rKFswLTldKykiIF9laWdlbjNfbWlub3JfdmVyc2lvbl9tYXRjaCAiJHtfZWlnZW4zX3ZlcnNpb25faGVhZGVyfSIpCisgIHNldChFSUdFTjNfTUlOT1JfVkVSU0lPTiAiJHtDTUFLRV9NQVRDSF8xfSIpCisKKyAgc2V0KEVJR0VOM19WRVJTSU9OICR7RUlHRU4zX1dPUkxEX1ZFUlNJT059LiR7RUlHRU4zX01BSk9SX1ZFUlNJT059LiR7RUlHRU4zX01JTk9SX1ZFUlNJT059KQorICBpZigke0VJR0VOM19WRVJTSU9OfSBWRVJTSU9OX0xFU1MgJHtFaWdlbjNfRklORF9WRVJTSU9OfSkKKyAgICBzZXQoRUlHRU4zX1ZFUlNJT05fT0sgRkFMU0UpCisgIGVsc2UoJHtFSUdFTjNfVkVSU0lPTn0gVkVSU0lPTl9MRVNTICR7RWlnZW4zX0ZJTkRfVkVSU0lPTn0pCisgICAgc2V0KEVJR0VOM19WRVJTSU9OX09LIFRSVUUpCisgIGVuZGlmKCR7RUlHRU4zX1ZFUlNJT059IFZFUlNJT05fTEVTUyAke0VpZ2VuM19GSU5EX1ZFUlNJT059KQorCisgIGlmKE5PVCBFSUdFTjNfVkVSU0lPTl9PSykKKworICAgIG1lc3NhZ2UoU1RBVFVTICJFaWdlbjMgdmVyc2lvbiAke0VJR0VOM19WRVJTSU9OfSBmb3VuZCBpbiAke0VJR0VOM19JTkNMVURFX0RJUn0sICIKKyAgICAgICAgICAgICAgICAgICAiYnV0IGF0IGxlYXN0IHZlcnNpb24gJHtFaWdlbjNfRklORF9WRVJTSU9OfSBpcyByZXF1aXJlZCIpCisgIGVuZGlmKE5PVCBFSUdFTjNfVkVSU0lPTl9PSykKK2VuZG1hY3JvKF9laWdlbjNfY2hlY2tfdmVyc2lvbikKKworaWYgKEVJR0VOM19JTkNMVURFX0RJUikKKworICAjIGluIGNhY2hlIGFscmVhZHkKKyAgX2VpZ2VuM19jaGVja192ZXJzaW9uKCkKKyAgc2V0KEVJR0VOM19GT1VORCAke0VJR0VOM19WRVJTSU9OX09LfSkKKworZWxzZSAoRUlHRU4zX0lOQ0xVREVfRElSKQorCisgIGZpbmRfcGF0aChFSUdFTjNfSU5DTFVERV9ESVIgTkFNRVMgc2lnbmF0dXJlX29mX2VpZ2VuM19tYXRyaXhfbGlicmFyeQorICAgICAgSElOVFMKKyAgICAgIEVOViBFSUdFTjNfUk9PVCAKKyAgICAgIEVOViBFSUdFTjNfUk9PVF9ESVIKKyAgICAgIFBBVEhTCisgICAgICAke0NNQUtFX0lOU1RBTExfUFJFRklYfS9pbmNsdWRlCisgICAgICAke0tERTRfSU5DTFVERV9ESVJ9CisgICAgICBQQVRIX1NVRkZJWEVTIGVpZ2VuMyBlaWdlbgorICAgICkKKworICBpZihFSUdFTjNfSU5DTFVERV9ESVIpCisgICAgX2VpZ2VuM19jaGVja192ZXJzaW9uKCkKKyAgZW5kaWYoRUlHRU4zX0lOQ0xVREVfRElSKQorCisgIGluY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisgIGZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhFaWdlbjMgREVGQVVMVF9NU0cgRUlHRU4zX0lOQ0xVREVfRElSIEVJR0VOM19WRVJTSU9OX09LKQorCisgIG1hcmtfYXNfYWR2YW5jZWQoRUlHRU4zX0lOQ0xVREVfRElSKQorCitlbmRpZihFSUdFTjNfSU5DTFVERV9ESVIpCisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9jb21waWxlX3F1ZXJ5X29ubHkuc2ggYi9zcmMva2VubG0vY29tcGlsZV9xdWVyeV9vbmx5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhODJmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vY29tcGlsZV9xdWVyeV9vbmx5LnNoCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9iYXNoCisjVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUgY29tcGlsYXRpb24uICBZb3Ugc2hvdWxkIGludGVncmF0ZSB0aGVzZSBmaWxlcyBpbnRvIHlvdXIgYnVpbGQgc3lzdGVtLiAgQm9vc3QgamFtIGlzIHByb3ZpZGVkIGFuZCBwcmVmZXJyZWQuCisKK2VjaG8gWW91IG11c3QgdXNlIC4vYmphbSBpZiB5b3Ugd2FudCBsYW5ndWFnZSBtb2RlbCBlc3RpbWF0aW9uLCBmaWx0ZXJpbmcsIG9yIHN1cHBvcnQgZm9yIGNvbXByZXNzZWQgZmlsZXMgXCguZ3osIC5iejIsIC54elwpIDE+JjIKKworcm0ge2xtLHV0aWx9LyoubyAyPi9kZXYvbnVsbAorc2V0IC1lCisKK0NYWD0ke0NYWDotZysrfQorCitDWFhGTEFHUys9IiAtSS4gLU8zIC1ETkRFQlVHIC1ES0VOTE1fTUFYX09SREVSPTYiCisKKyNJZiB0aGlzIGZhaWxzIGZvciB5b3UsIGNvbnNpZGVyIHVzaW5nIGJqYW0uCitpZiBbICR7I05QTE19ICE9IDAgXTsgdGhlbgorICBDWFhGTEFHUys9IiAtREhBVkVfTlBMTSAtbG5ldXJhbExNIC1MJE5QTE0vc3JjIC1JJE5QTE0vc3JjIC1sYm9vc3RfdGhyZWFkLW10IC1mb3Blbm1wIgorICBBRERFRF9QQVRIUz0ibG0vd3JhcHBlcnMvKi5jYyIKK2ZpCitlY2hvICdDb21waWxpbmcgd2l0aCAnJENYWCAkQ1hYRkxBR1MKKworI0dyYWIgYWxsIGNjIGZpbGVzIGluIHRoZXNlIGRpcmVjdG9yaWVzIGV4Y2VwdCB0aG9zZSBlbmRpbmcgaW4gdGVzdC5jYyBvciBtYWluLmNjCitvYmplY3RzPSIiCitmb3IgaSBpbiB1dGlsL2RvdWJsZS1jb252ZXJzaW9uLyouY2MgdXRpbC8qLmNjIGxtLyouY2MgJEFEREVEX1BBVEhTOyBkbworICBpZiBbICIke2kldGVzdC5jY30iID09ICIkaSIgXSAmJiBbICIke2klbWFpbi5jY30iID09ICIkaSIgXTsgdGhlbgorICAgICRDWFggJENYWEZMQUdTIC1jICRpIC1vICR7aSUuY2N9Lm8KKyAgICBvYmplY3RzPSIkb2JqZWN0cyAke2klLmNjfS5vIgorICBmaQorZG9uZQorCitta2RpciAtcCBiaW4KK2lmIFsgIiQodW5hbWUpIiAhPSBEYXJ3aW4gXTsgdGhlbgorICBDWFhGTEFHUz0iJENYWEZMQUdTIC1scnQiCitmaQorJENYWCBsbS9idWlsZF9iaW5hcnlfbWFpbi5jYyAkb2JqZWN0cyAtbyBiaW4vYnVpbGRfYmluYXJ5ICRDWFhGTEFHUyAkTERGTEFHUworJENYWCBsbS9xdWVyeV9tYWluLmNjICRvYmplY3RzIC1vIGJpbi9xdWVyeSAkQ1hYRkxBR1MgJExERkxBR1MKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvTElDRU5TRV8xXzAudHh0IGIvc3JjL2tlbmxtL2phbS1maWxlcy9MSUNFTlNFXzFfMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiN2NkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvTElDRU5TRV8xXzAudHh0CkBAIC0wLDAgKzEsMjMgQEAKK0Jvb3N0IFNvZnR3YXJlIExpY2Vuc2UgLSBWZXJzaW9uIDEuMCAtIEF1Z3VzdCAxN3RoLCAyMDAzCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9yIG9yZ2FuaXphdGlvbgorb2J0YWluaW5nIGEgY29weSBvZiB0aGUgc29mdHdhcmUgYW5kIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uIGNvdmVyZWQgYnkKK3RoaXMgbGljZW5zZSAodGhlICJTb2Z0d2FyZSIpIHRvIHVzZSwgcmVwcm9kdWNlLCBkaXNwbGF5LCBkaXN0cmlidXRlLAorZXhlY3V0ZSwgYW5kIHRyYW5zbWl0IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUKK1NvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHRoaXJkLXBhcnRpZXMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvCitkbyBzbywgYWxsIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZzoKKworVGhlIGNvcHlyaWdodCBub3RpY2VzIGluIHRoZSBTb2Z0d2FyZSBhbmQgdGhpcyBlbnRpcmUgc3RhdGVtZW50LCBpbmNsdWRpbmcKK3RoZSBhYm92ZSBsaWNlbnNlIGdyYW50LCB0aGlzIHJlc3RyaWN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCittdXN0IGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBhbmQKK2FsbCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTb2Z0d2FyZSwgdW5sZXNzIHN1Y2ggY29waWVzIG9yIGRlcml2YXRpdmUKK3dvcmtzIGFyZSBzb2xlbHkgaW4gdGhlIGZvcm0gb2YgbWFjaGluZS1leGVjdXRhYmxlIG9iamVjdCBjb2RlIGdlbmVyYXRlZCBieQorYSBzb3VyY2UgbGFuZ3VhZ2UgcHJvY2Vzc29yLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UCitTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQU5ZT05FIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUgQkUgTElBQkxFCitGT1IgQU5ZIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9ib29zdC1idWlsZC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2Jvb3N0LWJ1aWxkLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2RiMDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9ib29zdC1idWlsZC5qYW0KQEAgLTAsMCArMSw4IEBACisjIENvcHlyaWdodCAyMDAxLCAyMDAyIERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDIgUmVuZSBSaXZlcmEKKyMgQ29weXJpZ2h0IDIwMDMgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworCitib29zdC1idWlsZCBrZXJuZWwgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9ib290c3RyYXAuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9ib290c3RyYXAuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmM2U4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2Jvb3RzdHJhcC5qYW0KQEAgLTAsMCArMSwxOCBAQAorIyAgQ29weXJpZ2h0IChjKSAyMDAzIFZsYWRpbWlyIFBydXMuCisjCisjICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlCisjICBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIFRoaXMgZmlsZSBoYW5kbGVzIGluaXRpYWwgcGhhc2Ugb2YgQm9vc3QuQnVpbGQgbG9hZGluZy4KKyMgQm9vc3QuSmFtIGhhcyBhbHJlYWR5IGZpZ3VyZWQgb3V0IHdoZXJlIEJvb3N0LkJ1aWxkIGlzCisjIGFuZCBsb2FkcyB0aGlzIGZpbGUsIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXphdGlvbgorIyBvZiBiYXNpYyBmYWNpbGl0aWVzIHN1Y2ggYSBtb2R1bGUgc3lzdGVtIGFuZCBsb2FkaW5nIHRoZQorIyBtYWluIEJvb3N0LkJ1aWxkIG1vZHVsZSwgYnVpbGQtc3lzdGVtLmphbS4KKyMKKyMgRXhhY3Qgb3BlcmF0aW9uIG9mIHRoaXMgbW9kdWxlIGlzIG5vdCBpbnRlcmVzdGluZywgaXQgbWFrZXMKKyMgc2Vuc2UgdG8gbG9vayBhdCBidWlsZC1zeXN0ZW0uamFtIHJpZ2h0IGF3YXkuCisKKyMgTG9hZCB0aGUga2VybmVsL2Jvb3RzdHJhcC5qYW0sIHdoaWNoIGRvZXMgYWxsIHRoZSB3b3JrLgorLmJvb3RzdHJhcC1maWxlID0gJCguYm9vdHN0cmFwLWZpbGU6RCkva2VybmVsL2Jvb3RzdHJhcC5qYW0gOworaW5jbHVkZSAkKC5ib290c3RyYXAtZmlsZSkgOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQtc3lzdGVtLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQtc3lzdGVtLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDczMjZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC1zeXN0ZW0uamFtCkBAIC0wLDAgKzEsOTgxIEBACisjIENvcHlyaWdodCAyMDAzLCAyMDA1LCAyMDA3IERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDYsIDIwMDcgUmVuZSBSaXZlcmEKKyMgQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJvb3N0IEJ1aWxkIHZlcnNpb24gMi4gWW91IGNhbiB0aGluayBvZiBpdCBhcyBmb3JtaW5nIHRoZQorIyBtYWluKCkgcm91dGluZS4gSXQgaXMgaW52b2tlZCBieSB0aGUgYm9vdHN0cmFwcGluZyBjb2RlIGluIGJvb3RzdHJhcC5qYW0uCisKK2ltcG9ydCBidWlsZC1yZXF1ZXN0IDsKK2ltcG9ydCBidWlsdGluIDsKK2ltcG9ydCAiY2xhc3MiIDogbmV3IDsKK2ltcG9ydCBjb25maWd1cmUgOworaW1wb3J0IGNvbmZpZy1jYWNoZSA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgbWFrZSA7CitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgb3MgOworaW1wb3J0IHBhdGggOworaW1wb3J0IHByb2plY3QgOworaW1wb3J0IHByb3BlcnR5IDsKK2ltcG9ydCBwcm9wZXJ0eS1zZXQgOworaW1wb3J0IHJlZ2V4IDsKK2ltcG9ydCBzZXF1ZW5jZSA7CitpbXBvcnQgdGFyZ2V0cyA7CitpbXBvcnQgdG9vbHNldCA7CitpbXBvcnQgdXRpbGl0eSA7CitpbXBvcnQgdmVyc2lvbiA7CitpbXBvcnQgdmlydHVhbC10YXJnZXQgOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE1vZHVsZSBnbG9iYWwgZGF0YS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgU2hvcnRjdXQgdXNlZCBpbiB0aGlzIG1vZHVsZSBmb3IgYWNjZXNzaW5nIHVzZWQgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMuCisuYXJndiA9IFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIDsKKworIyBGbGFnIGluZGljYXRpbmcgd2Ugc2hvdWxkIGRpc3BsYXkgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gcmVsYXRlZCB0bworIyBsb2NhdGluZyBhbmQgbG9hZGluZyBCb29zdCBCdWlsZCBjb25maWd1cmF0aW9uIGZpbGVzLgorLmRlYnVnLWNvbmZpZyA9IFsgTUFUQ0ggXigtLWRlYnVnLWNvbmZpZ3VyYXRpb24pJCA6ICQoLmFyZ3YpIF0gOworCisjIFZpcnR1YWwgdGFyZ2V0cyBvYnRhaW5lZCB3aGVuIGJ1aWxkaW5nIG1haW4gdGFyZ2V0cyByZWZlcmVuY2VzIG9uIHRoZSBjb21tYW5kCisjIGxpbmUuIFdoZW4gcnVubmluZyAnYmphbSAtLWNsZWFuIG1haW5fdGFyZ2V0JyB3ZSB3YW50IHRvIGNsZWFuIG9ubHkgZmlsZXMKKyMgYmVsb25naW5nIHRvIHRoYXQgbWFpbiB0YXJnZXQgc28gd2UgbmVlZCB0byByZWNvcmQgd2hpY2ggdGFyZ2V0cyBhcmUgcHJvZHVjZWQKKyMgZm9yIGl0LgorLnJlc3VsdHMtb2YtbWFpbi10YXJnZXRzID0gOworCisjIFdhcyBhbiBYTUwgZHVtcCByZXF1ZXN0ZWQ/Cisub3V0LXhtbCA9IFsgTUFUQ0ggXi0tb3V0LXhtbD0oLiopJCA6ICQoLmFyZ3YpIF0gOworCisjIERlZmF1bHQgdG9vbHNldCAmIHZlcnNpb24gdG8gYmUgdXNlZCBpbiBjYXNlIG5vIG90aGVyIHRvb2xzZXQgaGFzIGJlZW4gdXNlZAorIyBleHBsaWNpdGx5IGJ5IGVpdGhlciB0aGUgbG9hZGVkIGNvbmZpZ3VyYXRpb24gZmlsZXMsIHRoZSBsb2FkZWQgcHJvamVjdCBidWlsZAorIyBzY3JpcHRzIG9yIGFuIGV4cGxpY2l0IHRvb2xzZXQgcmVxdWVzdCBvbiB0aGUgY29tbWFuZCBsaW5lLiBJZiBub3Qgc3BlY2lmaWVkLAorIyBhbiBhcmJpdHJhcnkgZGVmYXVsdCB3aWxsIGJlIHVzZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgaG9zdCBPUy4gVGhpcyB2YWx1ZSwKKyMgd2hpbGUgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgaGFzIGJlZW4gYWRkZWQgdG8gYWxsb3cgdGVzdGluZyBCb29zdC1CdWlsZCdzCisjIGRlZmF1bHQgdG9vbHNldCB1c2FnZSBmdW5jdGlvbmFsaXR5LgorLmRlZmF1bHQtdG9vbHNldCA9IDsKKy5kZWZhdWx0LXRvb2xzZXQtdmVyc2lvbiA9IDsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBQdWJsaWMgcnVsZXMuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFJldHVybnMgdGhlIHByb3BlcnR5IHNldCB3aXRoIHRoZSBmcmVlIGZlYXR1cmVzIGZyb20gdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQKKyMgYnVpbGQgcmVxdWVzdC4KKyMKK3J1bGUgY29tbWFuZC1saW5lLWZyZWUtZmVhdHVyZXMgKCApCit7CisgICAgcmV0dXJuICQoLmNvbW1hbmQtbGluZS1mcmVlLWZlYXR1cmVzKSA7Cit9CisKKworIyBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgYnVpbGQgc3lzdGVtLiBUaGUgcHJpbWFyeSB1c2UgY2FzZSBpcyBidWlsZGluZworIyBCb29zdCB3aGVyZSBpdCBpcyBzb21ldGltZXMgbmVlZGVkIHRvIGdldCB0aGUgbG9jYXRpb24gb2Ygb3RoZXIgY29tcG9uZW50cworIyAoZS5nLiBCb29zdEJvb2sgZmlsZXMpIGFuZCBpdCBpcyBjb252ZW5pZW50IHRvIHVzZSBsb2NhdGlvbnMgcmVsYXRpdmUgdG8gdGhlCisjIEJvb3N0IEJ1aWxkIHBhdGguCisjCitydWxlIGxvY2F0aW9uICggKQoreworICAgIGxvY2FsIHIgPSBbIG1vZHVsZXMuYmluZGluZyBidWlsZC1zeXN0ZW0gXSA7CisgICAgcmV0dXJuICQocjpQKSA7Cit9CisKKworIyBTZXRzIHRoZSBkZWZhdWx0IHRvb2xzZXQgJiB2ZXJzaW9uIHRvIGJlIHVzZWQgaW4gY2FzZSBubyBvdGhlciB0b29sc2V0IGhhcworIyBiZWVuIHVzZWQgZXhwbGljaXRseSBieSBlaXRoZXIgdGhlIGxvYWRlZCBjb25maWd1cmF0aW9uIGZpbGVzLCB0aGUgbG9hZGVkCisjIHByb2plY3QgYnVpbGQgc2NyaXB0cyBvciBhbiBleHBsaWNpdCB0b29sc2V0IHJlcXVlc3Qgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yCisjIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlIHRoZSBjb21tZW50IHJlbGF0ZWQgdG8gdXNlZCBnbG9iYWwgdmFyaWFibGVzLgorIworcnVsZSBzZXQtZGVmYXVsdC10b29sc2V0ICggdG9vbHNldCA6IHZlcnNpb24gPyApCit7CisgICAgLmRlZmF1bHQtdG9vbHNldCA9ICQodG9vbHNldCkgOworICAgIC5kZWZhdWx0LXRvb2xzZXQtdmVyc2lvbiA9ICQodmVyc2lvbikgOworfQorCitydWxlIHNldC1wcmUtYnVpbGQtaG9vayAoIGZ1bmN0aW9uICkKK3sKKyAgICAucHJlLWJ1aWxkLWhvb2sgPSAkKGZ1bmN0aW9uKSA7Cit9CisKK3J1bGUgc2V0LXBvc3QtYnVpbGQtaG9vayAoIGZ1bmN0aW9uICkKK3sKKyAgICAucG9zdC1idWlsZC1ob29rID0gJChmdW5jdGlvbikgOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBMb2NhbCBydWxlcy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgUmV0dXJucyBhY3R1YWwgSmFtIHRhcmdldHMgdG8gYmUgdXNlZCBmb3IgZXhlY3V0aW5nIGEgY2xlYW4gcmVxdWVzdC4KKyMKK2xvY2FsIHJ1bGUgYWN0dWFsLWNsZWFuLXRhcmdldHMgKCApCit7CisgICAgIyBUaGUgY2xlYW5pbmcgaXMgdHJpY2t5LiBTYXksIGlmIHVzZXIgc2F5cyAnYmphbSAtLWNsZWFuIGZvbycgd2hlcmUgJ2ZvbycKKyAgICAjIGlzIGEgZGlyZWN0b3J5LCB0aGVuIHdlIHdhbnQgdG8gY2xlYW4gdGFyZ2V0cyB3aGljaCBhcmUgaW4gJ2ZvbycgYXMgd2VsbAorICAgICMgYXMgdGhvc2UgaW4gYW55IGNoaWxkcmVuIEphbWZpbGVzIHVuZGVyIGZvbyBidXQgbm90IGluIGFueSB1bnJlbGF0ZWQKKyAgICAjIEphbWZpbGVzLiBUbyBhY2hpZXZlIHRoaXMgd2UgZmlyc3QgbWFyayBhbGwgcHJvamVjdHMgZXhwbGljaXRseSBkZXRlY3RlZAorICAgICMgYXMgdGFyZ2V0cyBmb3IgdGhpcyBidWlsZCBzeXN0ZW0gcnVuIGFzIG5lZWRpbmcgdG8gYmUgY2xlYW5lZC4KKyAgICBmb3IgbG9jYWwgdCBpbiAkKHRhcmdldHMpCisgICAgeworICAgICAgICBpZiBbIGNsYXNzLmlzLWEgJCh0KSA6IHByb2plY3QtdGFyZ2V0IF0KKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgcHJvamVjdCA9IFsgJCh0KS5wcm9qZWN0LW1vZHVsZSBdIDsKKyAgICAgICAgICAgIC5zaG91bGQtY2xlYW4tcHJvamVjdC4kKHByb2plY3QpID0gdHJ1ZSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIENvbnN0cnVjdCBhIGxpc3Qgb2YgdGFyZ2V0cyBleHBsaWNpdGx5IGRldGVjdGVkIG9uIHRoaXMgYnVpbGQgc3lzdGVtIHJ1bgorICAgICMgYXMgYSByZXN1bHQgb2YgYnVpbGRpbmcgbWFpbiB0YXJnZXRzLgorICAgIGxvY2FsIHRhcmdldHMtdG8tY2xlYW4gOworICAgIGZvciBsb2NhbCB0IGluICQoLnJlc3VsdHMtb2YtbWFpbi10YXJnZXRzKQorICAgIHsKKyAgICAgICAgIyBEbyBub3QgaW5jbHVkZSByb290cyBvciBzb3VyY2VzLgorICAgICAgICB0YXJnZXRzLXRvLWNsZWFuICs9IFsgdmlydHVhbC10YXJnZXQudHJhdmVyc2UgJCh0KSBdIDsKKyAgICB9CisgICAgdGFyZ2V0cy10by1jbGVhbiA9IFsgc2VxdWVuY2UudW5pcXVlICQodGFyZ2V0cy10by1jbGVhbikgXSA7CisKKyAgICBsb2NhbCB0by1jbGVhbiA7CisgICAgZm9yIGxvY2FsIHQgaW4gWyB2aXJ0dWFsLXRhcmdldC5hbGwtdGFyZ2V0cyBdCisgICAgeworICAgICAgICAjIFJlbW92ZSBvbmx5IGRlcml2ZWQgdGFyZ2V0cyBhbmQgb25seSB0aG9zZSBhc2tlZCB0byBiZSBjbGVhbmVkLAorICAgICAgICAjIHdoZXRoZXIgZGlyZWN0bHkgb3IgYnkgYmVsb25naW5nIHRvIG9uZSBvZiB0aGUgcmVtb3ZlZCBwcm9qZWN0cy4KKyAgICAgICAgbG9jYWwgcCA9IFsgJCh0KS5wcm9qZWN0IF0gOworICAgICAgICBpZiBbICQodCkuYWN0aW9uIF0gJiYgKCAkKHQpIGluICQodGFyZ2V0cy10by1jbGVhbikgfHwKKyAgICAgICAgICAgIFsgc2hvdWxkLWNsZWFuLXByb2plY3QgWyAkKHApLnByb2plY3QtbW9kdWxlIF0gXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRvLWNsZWFuICs9ICQodCkgOworICAgICAgICB9CisgICAgfQorCisgICAgbG9jYWwgdG8tY2xlYW4tYWN0dWFsIDsKKyAgICBmb3IgbG9jYWwgdCBpbiAkKHRvLWNsZWFuKQorICAgIHsKKyAgICAgICAgdG8tY2xlYW4tYWN0dWFsICs9IFsgJCh0KS5hY3R1YWxpemUgXSA7CisgICAgfQorICAgIHJldHVybiAkKHRvLWNsZWFuLWFjdHVhbCkgOworfQorCisKKyMgR2l2ZW4gYSB0YXJnZXQgaWQsIHRyeSB0byBmaW5kIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0LiBUaGlzIGlzCisjIG9ubHkgaW52b2tlZCB3aGVuIHRoZXJlIGlzIG5vIEphbWZpbGUgaW4gIi4iLiBUaGlzIGNvZGUgc29tZXdoYXQgZHVwbGljYXRlcworIyBjb2RlIGluIHByb2plY3QtdGFyZ2V0LmZpbmQgYnV0IHdlIGNhbiBub3QgcmV1c2UgdGhhdCBjb2RlIHdpdGhvdXQgYQorIyBwcm9qZWN0LXRhcmdldHMgaW5zdGFuY2UuCisjCitsb2NhbCBydWxlIGZpbmQtdGFyZ2V0ICggdGFyZ2V0LWlkICkKK3sKKyAgICBsb2NhbCBzcGxpdCA9IFsgTUFUQ0ggKC4qKS8vKC4qKSA6ICQodGFyZ2V0LWlkKSBdIDsKKworICAgIGxvY2FsIHBtIDsKKyAgICBpZiAkKHNwbGl0KQorICAgIHsKKyAgICAgICAgcG0gPSBbIHByb2plY3QuZmluZCAkKHNwbGl0WzFdKSA6ICIuIiBdIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcG0gPSBbIHByb2plY3QuZmluZCAkKHRhcmdldC1pZCkgOiAiLiIgXSA7CisgICAgfQorCisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBpZiAkKHBtKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gWyBwcm9qZWN0LnRhcmdldCAkKHBtKSBdIDsKKyAgICB9CisKKyAgICBpZiAkKHNwbGl0KQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gWyAkKHJlc3VsdCkuZmluZCAkKHNwbGl0WzJdKSBdIDsKKyAgICB9CisKKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIEluaXRpYWxpemVzIGEgbmV3IGNvbmZpZ3VyYXRpb24gbW9kdWxlLgorIworbG9jYWwgcnVsZSBpbml0aWFsaXplLWNvbmZpZy1tb2R1bGUgKCBtb2R1bGUtbmFtZSA6IGxvY2F0aW9uID8gKQoreworICAgIHByb2plY3QuaW5pdGlhbGl6ZSAkKG1vZHVsZS1uYW1lKSA6ICQobG9jYXRpb24pIDsKKyAgICBpZiBVU0VSX01PRFVMRSBpbiBbIFJVTEVOQU1FUyBdCisgICAgeworICAgICAgICBVU0VSX01PRFVMRSAkKG1vZHVsZS1uYW1lKSA7CisgICAgfQorfQorCisKKyMgSGVscGVyIHJ1bGUgdXNlZCB0byBsb2FkIGNvbmZpZ3VyYXRpb24gZmlsZXMuIExvYWRzIHRoZSBmaXJzdCBjb25maWd1cmF0aW9uCisjIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gJ2ZpbGVuYW1lJyBhdCAncGF0aCcgaW50byBtb2R1bGUgd2l0aCBuYW1lICdtb2R1bGUtbmFtZScuCisjIE5vdCBmaW5kaW5nIHRoZSByZXF1ZXN0ZWQgZmlsZSBtYXkgb3IgbWF5IG5vdCBiZSB0cmVhdGVkIGFzIGFuIGVycm9yIGRlcGVuZGluZworIyBvbiB0aGUgbXVzdC1maW5kIHBhcmFtZXRlci4gUmV0dXJucyBhIG5vcm1hbGl6ZWQgcGF0aCB0byB0aGUgbG9hZGVkCisjIGNvbmZpZ3VyYXRpb24gZmlsZSBvciBub3RoaW5nIGlmIG5vIGZpbGUgd2FzIGxvYWRlZC4KKyMKK2xvY2FsIHJ1bGUgbG9hZC1jb25maWcgKCBtb2R1bGUtbmFtZSA6IGZpbGVuYW1lIDogcGF0aCArIDogbXVzdC1maW5kID8gKQoreworICAgIGlmICQoLmRlYnVnLWNvbmZpZykKKyAgICB7CisgICAgICAgIGxvY2FsIHBhdGgtc3RyaW5nID0gJChwYXRoKSA7CisgICAgICAgIGlmICQocGF0aC1zdHJpbmcpID0gIiIgeyBwYXRoLXN0cmluZyA9IC4gOyB9CisgICAgICAgIEVDSE8gbm90aWNlOiBTZWFyY2hpbmcgJyQocGF0aC1zdHJpbmcpJyBmb3IgJChtb2R1bGUtbmFtZSkKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSAnJChmaWxlbmFtZSknLiA7CisgICAgfQorICAgIGxvY2FsIHdoZXJlID0gWyBHTE9CICQocGF0aCkgOiAkKGZpbGVuYW1lKSBdIDsKKyAgICBpZiAkKHdoZXJlKQorICAgIHsKKyAgICAgICAgd2hlcmUgPSBbIE5PUk1BTElaRV9QQVRIICQod2hlcmVbMV0pIF0gOworICAgICAgICBpZiAkKC5kZWJ1Zy1jb25maWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHdoZXJlLXN0cmluZyA9ICQod2hlcmU6RCkgOworICAgICAgICAgICAgaWYgJCh3aGVyZS1zdHJpbmcpID0gIiIgeyB3aGVyZS1zdHJpbmcgPSAuIDsgfQorICAgICAgICAgICAgd2hlcmUtc3RyaW5nID0gJyQod2hlcmUtc3RyaW5nKScgOworICAgICAgICAgICAgRUNITyBub3RpY2U6IExvYWRpbmcgJChtb2R1bGUtbmFtZSkgY29uZmlndXJhdGlvbiBmaWxlICckKGZpbGVuYW1lKScKKyAgICAgICAgICAgICAgICBmcm9tICQod2hlcmUtc3RyaW5nOko9IiAiKS4gOworICAgICAgICB9CisKKyAgICAgICAgIyBTZXQgc291cmNlIGxvY2F0aW9uIHNvIHRoYXQgcGF0aC1jb25zdGFudCBpbiBjb25maWcgZmlsZXMgd2l0aAorICAgICAgICAjIHJlbGF0aXZlIHBhdGhzIHdvcmsuIFRoaXMgaXMgb2YgbW9zdCBpbXBvcnRhbmNlIGZvcgorICAgICAgICAjIHByb2plY3QtY29uZmlnLmphbSwgYnV0IG1heSBiZSB1c2VkIGluIG90aGVyIGNvbmZpZyBmaWxlcyBhcyB3ZWxsLgorICAgICAgICBsb2NhbCBhdHRyaWJ1dGVzID0gWyBwcm9qZWN0LmF0dHJpYnV0ZXMgJChtb2R1bGUtbmFtZSkgXSA7CisgICAgICAgICQoYXR0cmlidXRlcykuc2V0IHNvdXJjZS1sb2NhdGlvbiA6ICQod2hlcmU6RCkgOiBleGFjdCA7CisgICAgICAgIG1vZHVsZXMubG9hZCAkKG1vZHVsZS1uYW1lKSA6ICQoZmlsZW5hbWUpIDogJChwYXRoKSA7CisgICAgICAgIHByb2plY3QubG9hZC11c2VkLXByb2plY3RzICQobW9kdWxlLW5hbWUpIDsKKyAgICB9CisgICAgZWxzZSBpZiAkKG11c3QtZmluZCkgfHwgJCguZGVidWctY29uZmlnKQorICAgIHsKKyAgICAgICAgbG9jYWwgcGF0aC1zdHJpbmcgPSAkKHBhdGgpIDsKKyAgICAgICAgaWYgJChwYXRoLXN0cmluZykgPSAiIiB7IHBhdGgtc3RyaW5nID0gLiA7IH0KKyAgICAgICAgcGF0aC1zdHJpbmcgPSAnJChwYXRoLXN0cmluZyknIDsKKyAgICAgICAgcGF0aC1zdHJpbmcgPSAkKHBhdGgtc3RyaW5nOko9IiAiKSA7CisgICAgICAgIGlmICQobXVzdC1maW5kKQorICAgICAgICB7CisgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgIGVycm9ycy51c2VyLWVycm9yIENvbmZpZ3VyYXRpb24gZmlsZSAnJChmaWxlbmFtZSknIG5vdCBmb3VuZCAiaW4iCisgICAgICAgICAgICAgICAgJChwYXRoLXN0cmluZykuIDsKKyAgICAgICAgfQorICAgICAgICBFQ0hPIG5vdGljZTogQ29uZmlndXJhdGlvbiBmaWxlICckKGZpbGVuYW1lKScgbm90IGZvdW5kICJpbiIKKyAgICAgICAgICAgICQocGF0aC1zdHJpbmcpLiA7CisgICAgfQorICAgIHJldHVybiAkKHdoZXJlKSA7Cit9CisKKworIyBMb2FkcyBhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdXNlZCBieSBCb29zdCBCdWlsZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorIworIyAgIC0tIHRlc3QtY29uZmlnIC0tCisjICAgTG9hZGVkIG9ubHkgaWYgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUgdXNpbmcgdGhlIC0tdGVzdC1jb25maWcKKyMgY29tbWFuZC1saW5lIHBhcmFtZXRlci4gSXQgaXMgb2sgZm9yIHRoaXMgZmlsZSBub3QgdG8gZXhpc3QgZXZlbiBpZiBzcGVjaWZpZWQuCisjIElmIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlIGlzIGxvYWRlZCwgcmVndWxhciBzaXRlIGFuZCB1c2VyIGNvbmZpZ3VyYXRpb24KKyMgZmlsZXMgd2lsbCBub3QgYmUuIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBzcGVjaWZpZWQsIGZpbGUgaXMgc2VhcmNoZWQgZm9yIGluCisjIHRoZSBjdXJyZW50IGZvbGRlci4KKyMKKyMgICAtLSBzaXRlLWNvbmZpZyAtLQorIyAgIEFsd2F5cyBuYW1lZCBzaXRlLWNvbmZpZy5qYW0uIFdpbGwgb25seSBiZSBmb3VuZCBpZiBsb2NhdGVkIG9uIHRoZSBzeXN0ZW0KKyMgcm9vdCBwYXRoIChXaW5kb3dzKSwgL2V0YyAobm9uLVdpbmRvd3MpLCB1c2VyJ3MgaG9tZSBmb2xkZXIgb3IgdGhlIEJvb3N0IEJ1aWxkCisjIHBhdGgsIGluIHRoYXQgb3JkZXIuIE5vdCBsb2FkZWQgaW4gY2FzZSB0aGUgdGVzdC1jb25maWcgY29uZmlndXJhdGlvbiBmaWxlIGlzCisjIGxvYWRlZCBvciB0aGUgLS1pZ25vcmUtc2l0ZS1jb25maWcgY29tbWFuZC1saW5lIG9wdGlvbiBpcyBzcGVjaWZpZWQuCisjCisjICAgLS0gdXNlci1jb25maWcgLS0KKyMgICBOYW1lZCB1c2VyLWNvbmZpZy5qYW0gYnkgZGVmYXVsdCBvciBtYXkgYmUgbmFtZWQgZXhwbGljaXRseSB1c2luZyB0aGUKKyMgLS11c2VyLWNvbmZpZyBjb21tYW5kLWxpbmUgb3B0aW9uIG9yIHRoZSBCT09TVF9CVUlMRF9VU0VSX0NPTkZJRyBlbnZpcm9ubWVudAorIyB2YXJpYWJsZS4gSWYgbmFtZWQgZXhwbGljaXRseSB0aGUgZmlsZSBpcyBsb29rZWQgZm9yIGZyb20gdGhlIGN1cnJlbnQgd29ya2luZworIyBkaXJlY3RvcnkgYW5kIGlmIHRoZSBkZWZhdWx0IG9uZSBpcyB1c2VkIHRoZW4gaXQgaXMgc2VhcmNoZWQgZm9yIGluIHRoZQorIyB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgYW5kIHRoZSBCb29zdCBCdWlsZCBwYXRoLCBpbiB0aGF0IG9yZGVyLiBOb3QgbG9hZGVkIGluCisjIGNhc2UgZWl0aGVyIHRoZSB0ZXN0LWNvbmZpZyBjb25maWd1cmF0aW9uIGZpbGUgaXMgbG9hZGVkIG9yIGFuIGVtcHR5IGZpbGUgbmFtZQorIyBpcyBleHBsaWNpdGx5IHNwZWNpZmllZC4gSWYgdGhlIGZpbGUgbmFtZSBoYXMgYmVlbiBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdGhlCisjIGZpbGUgbXVzdCBleGlzdC4KKyMKKyMgICAtLSBwcm9qZWN0LWNvbmZpZyAtLQorIyAgIEFsd2F5cyBuYW1lZCBwcm9qZWN0LWNvbmZpZy5qYW0uIExvb2tlZCB1cCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciBhbmQKKyMgdGhlbiB1cHdhcmRzIHRocm91Z2ggaXRzIHBhcmVudHMgdXAgdG8gdGhlIHJvb3QgZm9sZGVyLgorIworIyBUZXN0IGNvbmZpZ3VyYXRpb25zIGhhdmUgYmVlbiBhZGRlZCBwcmltYXJpbHkgZm9yIHVzZSBieSBCb29zdCBCdWlsZCdzCisjIGludGVybmFsIHVuaXQgdGVzdGluZyBzeXN0ZW0gYnV0IG1heSBiZSB1c2VkIGZyZWVseSBpbiBvdGhlciBwbGFjZXMgYXMgd2VsbC4KKyMKK2xvY2FsIHJ1bGUgbG9hZC1jb25maWd1cmF0aW9uLWZpbGVzCit7CisgICAgIyBGbGFnIGluZGljYXRpbmcgdGhhdCBzaXRlIGNvbmZpZ3VyYXRpb24gc2hvdWxkIG5vdCBiZSBsb2FkZWQuCisgICAgbG9jYWwgaWdub3JlLXNpdGUtY29uZmlnID0KKyAgICAgICAgWyBNQVRDSCBeKC0taWdub3JlLXNpdGUtY29uZmlnKSQgOiAkKC5hcmd2KSBdIDsKKworICAgIGluaXRpYWxpemUtY29uZmlnLW1vZHVsZSB0ZXN0LWNvbmZpZyA7CisgICAgbG9jYWwgdGVzdC1jb25maWcgPSBbIE1BVENIIF4tLXRlc3QtY29uZmlnPSguKikkIDogJCguYXJndikgXSA7CisgICAgbG9jYWwgdXEgPSBbIE1BVENIIFwiKC4qKVwiIDogJCh0ZXN0LWNvbmZpZykgXSA7CisgICAgaWYgJCh1cSkKKyAgICB7CisgICAgICAgIHRlc3QtY29uZmlnID0gJCh1cSkgOworICAgIH0KKyAgICBpZiAkKHRlc3QtY29uZmlnKQorICAgIHsKKyAgICAgICAgbG9jYWwgd2hlcmUgPSBbIGxvYWQtY29uZmlnIHRlc3QtY29uZmlnIDogJCh0ZXN0LWNvbmZpZzpCUykgOgorICAgICAgICAgICAgJCh0ZXN0LWNvbmZpZzpEKSBdIDsKKyAgICAgICAgaWYgJCh3aGVyZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJCguZGVidWctY29uZmlnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIm5vdGljZTogUmVndWxhciBzaXRlIGFuZCB1c2VyIGNvbmZpZ3VyYXRpb24gZmlsZXMgd2lsbCIgOworICAgICAgICAgICAgICAgIEVDSE8gIm5vdGljZTogYmUgaWdub3JlZCBkdWUgdG8gdGhlIHRlc3QgY29uZmlndXJhdGlvbiBiZWluZyIKKyAgICAgICAgICAgICAgICAgICAgImxvYWRlZC4iIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3QtY29uZmlnID0gOworICAgICAgICB9CisgICAgfQorCisgICAgbG9jYWwgdXNlci1wYXRoID0gWyBvcy5ob21lLWRpcmVjdG9yaWVzIF0gWyBvcy5lbnZpcm9uIEJPT1NUX0JVSUxEX1BBVEggXSA7CisgICAgbG9jYWwgc2l0ZS1wYXRoID0gL2V0YyAkKHVzZXItcGF0aCkgOworICAgIGlmIFsgb3MubmFtZSBdIGluIE5UIENZR1dJTgorICAgIHsKKyAgICAgICAgc2l0ZS1wYXRoID0gWyBtb2R1bGVzLnBlZWsgOiBTeXN0ZW1Sb290IF0gJCh1c2VyLXBhdGgpIDsKKyAgICB9CisKKyAgICBpZiAkKC5kZWJ1Zy1jb25maWcpICYmICEgJCh0ZXN0LWNvbmZpZykgJiYgJChpZ25vcmUtc2l0ZS1jb25maWcpCisgICAgeworICAgICAgICBFQ0hPICJub3RpY2U6IFNpdGUgY29uZmlndXJhdGlvbiBmaWxlcyB3aWxsIGJlIGlnbm9yZWQgZHVlIHRvIHRoZSIgOworICAgICAgICBFQ0hPICJub3RpY2U6IC0taWdub3JlLXNpdGUtY29uZmlnIGNvbW1hbmQtbGluZSBvcHRpb24uIiA7CisgICAgfQorCisgICAgaW5pdGlhbGl6ZS1jb25maWctbW9kdWxlIHNpdGUtY29uZmlnIDsKKyAgICBpZiAhICQodGVzdC1jb25maWcpICYmICEgJChpZ25vcmUtc2l0ZS1jb25maWcpCisgICAgeworICAgICAgICBsb2FkLWNvbmZpZyBzaXRlLWNvbmZpZyA6IHNpdGUtY29uZmlnLmphbSA6ICQoc2l0ZS1wYXRoKSA7CisgICAgfQorCisgICAgaW5pdGlhbGl6ZS1jb25maWctbW9kdWxlIHVzZXItY29uZmlnIDsKKyAgICBpZiAhICQodGVzdC1jb25maWcpCisgICAgeworICAgICAgICBsb2NhbCB1c2VyLWNvbmZpZyA9IFsgTUFUQ0ggXi0tdXNlci1jb25maWc9KC4qKSQgOiAkKC5hcmd2KSBdIDsKKyAgICAgICAgdXNlci1jb25maWcgPSAkKHVzZXItY29uZmlnWy0xXSkgOworICAgICAgICB1c2VyLWNvbmZpZyA/PSBbIG9zLmVudmlyb24gQk9PU1RfQlVJTERfVVNFUl9DT05GSUcgXSA7CisgICAgICAgICMgU3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIGNhc2Ugd2hlbiB0aGUgT1MgZG9lcyBub3Qgc3RyaXAgdGhlIHF1b3RlcworICAgICAgICAjIGFyb3VuZCB0aGUgZmlsZSBuYW1lLCBhcyBpcyB0aGUgY2FzZSB3aGVuIHVzaW5nIEN5Z3dpbiBiYXNoLgorICAgICAgICB1c2VyLWNvbmZpZyA9IFsgdXRpbGl0eS51bnF1b3RlICQodXNlci1jb25maWcpIF0gOworICAgICAgICBsb2NhbCBleHBsaWNpdGx5LXJlcXVlc3RlZCA9ICQodXNlci1jb25maWcpIDsKKyAgICAgICAgdXNlci1jb25maWcgPz0gdXNlci1jb25maWcuamFtIDsKKworICAgICAgICBpZiAkKHVzZXItY29uZmlnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKGV4cGxpY2l0bHktcmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgVHJlYXQgZXhwbGljaXRseSBlbnRlcmVkIHVzZXIgcGF0aHMgYXMgbmF0aXZlIE9TIHBhdGgKKyAgICAgICAgICAgICAgICAjIHJlZmVyZW5jZXMgYW5kLCBpZiBub24tYWJzb2x1dGUsIHJvb3QgdGhlbSBhdCB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICMgd29ya2luZyBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgdXNlci1jb25maWcgPSBbIHBhdGgubWFrZSAkKHVzZXItY29uZmlnKSBdIDsKKyAgICAgICAgICAgICAgICB1c2VyLWNvbmZpZyA9IFsgcGF0aC5yb290ICQodXNlci1jb25maWcpIFsgcGF0aC5wd2QgXSBdIDsKKyAgICAgICAgICAgICAgICB1c2VyLWNvbmZpZyA9IFsgcGF0aC5uYXRpdmUgJCh1c2VyLWNvbmZpZykgXSA7CisKKyAgICAgICAgICAgICAgICBpZiAkKC5kZWJ1Zy1jb25maWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFQ0hPIG5vdGljZTogTG9hZGluZyBleHBsaWNpdGx5IHNwZWNpZmllZCB1c2VyIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IDsKKyAgICAgICAgICAgICAgICAgICAgRUNITyAiICAgICQodXNlci1jb25maWcpIiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbG9hZC1jb25maWcgdXNlci1jb25maWcgOiAkKHVzZXItY29uZmlnOkJTKSA6ICQodXNlci1jb25maWc6RCkKKyAgICAgICAgICAgICAgICAgICAgOiBtdXN0LWV4aXN0IDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2FkLWNvbmZpZyB1c2VyLWNvbmZpZyA6ICQodXNlci1jb25maWcpIDogJCh1c2VyLXBhdGgpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICQoLmRlYnVnLWNvbmZpZykKKyAgICAgICAgeworICAgICAgICAgICAgRUNITyBub3RpY2U6IFVzZXIgY29uZmlndXJhdGlvbiBmaWxlIGxvYWRpbmcgZXhwbGljaXRseSBkaXNhYmxlZC4gOworICAgICAgICB9CisgICAgfQorCisgICAgIyBXZSBsb29rIGZvciBwcm9qZWN0LWNvbmZpZy5qYW0gZnJvbSAiLiIgdXB3YXJkLiBJIGFtIG5vdCBzdXJlIHRoaXMgaXMgMTAwJQorICAgICMgcmlnaHQgZGVjaXNpb24sIHdlIG1pZ2h0IGFzIHdlbGwgY2hlY2sgZm9yIGl0IG9ubHkgYWxvbmdzaWRlIHRoZSBKYW1yb290CisgICAgIyBmaWxlLiBIb3dldmVyOgorICAgICMgLSBXZSBuZWVkIHRvIGxvYWQgcHJvamVjdC1jb25maWcuamFtIGJlZm9yZSBKYW1yb290CisgICAgIyAtIFdlIHByb2JhYmx5IG5lZWQgdG8gbG9hZCBwcm9qZWN0LWNvbmZpZy5qYW0gZXZlbiBpZiB0aGVyZSBpcyBubyBKYW1yb290CisgICAgIyAgIC0gZS5nLiB0byBpbXBsZW1lbnQgYXV0b21ha2Utc3R5bGUgb3V0LW9mLXRyZWUgYnVpbGRzLgorICAgIGxvY2FsIGZpbGUgPSBbIHBhdGguZ2xvYiAiLiIgOiBwcm9qZWN0LWNvbmZpZy5qYW0gXSA7CisgICAgaWYgISAkKGZpbGUpCisgICAgeworICAgICAgICBmaWxlID0gWyBwYXRoLmdsb2ItaW4tcGFyZW50cyAiLiIgOiBwcm9qZWN0LWNvbmZpZy5qYW0gXSA7CisgICAgfQorICAgIGlmICQoZmlsZSkKKyAgICB7CisgICAgICAgIGluaXRpYWxpemUtY29uZmlnLW1vZHVsZSBwcm9qZWN0LWNvbmZpZyA6ICQoZmlsZTpEKSA7CisgICAgICAgIGxvYWQtY29uZmlnIHByb2plY3QtY29uZmlnIDogcHJvamVjdC1jb25maWcuamFtIDogJChmaWxlOkQpIDsKKyAgICB9CisKKyAgICBwcm9qZWN0LmVuZC1sb2FkIDsKK30KKworCisjIEF1dG9jb25maWd1cmUgdG9vbHNldHMgYmFzZWQgb24gYW55IGluc3RhbmNlcyBvZiAtLXRvb2xzZXQ9eHgseXksLi4uenogb3IKKyMgdG9vbHNldD14eCx5eSwuLi56eiBpbiB0aGUgY29tbWFuZCBsaW5lLiBNYXkgcmV0dXJuIGFkZGl0aW9uYWwgcHJvcGVydGllcyB0bworIyBiZSBwcm9jZXNzZWQgYXMgaWYgdGhleSBoYWQgYmVlbiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisjCitsb2NhbCBydWxlIHByb2Nlc3MtZXhwbGljaXQtdG9vbHNldC1yZXF1ZXN0cworeworICAgIGxvY2FsIGV4dHJhLXByb3BlcnRpZXMgOworCisgICAgbG9jYWwgb3B0aW9uLXRvb2xzZXRzICA9IFsgcmVnZXguc3BsaXQtbGlzdCBbIE1BVENIIF4tLXRvb2xzZXQ9KC4qKSQgOiAkKC5hcmd2KSBdIDogIiwiIF0gOworICAgIGxvY2FsIGZlYXR1cmUtdG9vbHNldHMgPSBbIHJlZ2V4LnNwbGl0LWxpc3QgWyBNQVRDSCAgIF50b29sc2V0PSguKikkIDogJCguYXJndikgXSA6ICIsIiBdIDsKKworICAgIGZvciBsb2NhbCB0IGluICQob3B0aW9uLXRvb2xzZXRzKSAkKGZlYXR1cmUtdG9vbHNldHMpCisgICAgeworICAgICAgICAjIFBhcnNlIHRvb2xzZXQtdmVyc2lvbi9wcm9wZXJ0aWVzLgorICAgICAgICBsb2NhbCB0b29sc2V0ID0gWyBNQVRDSCAoW14vXSspLz8uKiA6ICQodCkgXSA7CisgICAgICAgIGxvY2FsIHByb3BlcnRpZXMgPSBbIGZlYXR1cmUuZXhwYW5kLXN1YmZlYXR1cmVzIDx0b29sc2V0PiQodG9vbHNldCkgOiB0cnVlIF0gOworICAgICAgICBsb2NhbCB0b29sc2V0LXByb3BlcnR5ID0gWyBwcm9wZXJ0eS5zZWxlY3QgPHRvb2xzZXQ+IDogJChwcm9wZXJ0aWVzKSBdIDsKKyAgICAgICAgbG9jYWwga25vd24gOworICAgICAgICBpZiAkKHRvb2xzZXQtcHJvcGVydHk6Rz0pIGluIFsgZmVhdHVyZS52YWx1ZXMgPHRvb2xzZXQ+IF0KKyAgICAgICAgeworICAgICAgICAgICAga25vd24gPSB0cnVlIDsKKyAgICAgICAgfQorCisgICAgICAgICMgSWYgdGhlIHRvb2xzZXQgaXMgbm90IGtub3duLCBjb25maWd1cmUgaXQgbm93LgorCisgICAgICAgICMgVE9ETzogd2Ugc2hvdWxkIGRvICd1c2luZyAkKHRvb2xzZXQpJyBpbiBjYXNlIG5vIHZlcnNpb24gaGFzIGJlZW4KKyAgICAgICAgIyBzcGVjaWZpZWQgYW5kIHRoZXJlIGFyZSBubyB2ZXJzaW9ucyBkZWZpbmVkIGZvciB0aGUgZ2l2ZW4gdG9vbHNldCB0bworICAgICAgICAjIGFsbG93IHRoZSB0b29sc2V0IHRvIGNvbmZpZ3VyZSBpdHMgZGVmYXVsdCB2ZXJzaW9uLiBGb3IgdGhpcyB3ZSBuZWVkCisgICAgICAgICMgdG8ga25vdyBob3cgdG8gZGV0ZWN0IHdoZXRoZXIgYSBnaXZlbiB0b29sc2V0IGhhcyBhbnkgdmVyc2lvbnMKKyAgICAgICAgIyBkZWZpbmVkLiBBbiBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBkbyB0aGlzIHdoZW5ldmVyIHZlcnNpb24gaXMgbm90CisgICAgICAgICMgc3BlY2lmaWVkIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgdGhhdCB0b29sc2V0cyBjb3JyZWN0bHkgaGFuZGxlIHRoZQorICAgICAgICAjIGNhc2Ugd2hlbiB0aGVpciBkZWZhdWx0IHZlcnNpb24gaXMgY29uZmlndXJlZCBtdWx0aXBsZSB0aW1lcyB3aGljaAorICAgICAgICAjIHNob3VsZCBiZSBjaGVja2VkIGZvciBhbGwgZXhpc3RpbmcgdG9vbHNldHMgZmlyc3QuCisKKyAgICAgICAgaWYgISAkKGtub3duKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKC5kZWJ1Zy1jb25maWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAibm90aWNlOiBbY21kbGluZS1jZmddIHRvb2xzZXQgJCh0b29sc2V0KSBub3QiCisgICAgICAgICAgICAgICAgICAgICJwcmV2aW91c2x5IGNvbmZpZ3VyZWQ7IGF0dGVtcHRpbmcgdG8gYXV0by1jb25maWd1cmUgbm93IiA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NhbCB0LHYgPSBbIE1BVENIIChbXi1dKyktPyguKyk/IDogJCh0b29sc2V0KSBdIDsKKyAgICAgICAgICAgIHRvb2xzZXQudXNpbmcgJCh0LHZbMV0pIDogJCh0LHZbMl0pIDsKKyAgICAgICAgfQorCisgICAgICAgICMgTWFrZSBzdXJlIHdlIGdldCBhbiBhcHByb3ByaWF0ZSBwcm9wZXJ0eSBpbnRvIHRoZSBidWlsZCByZXF1ZXN0IGluCisgICAgICAgICMgY2FzZSB0b29sc2V0IGhhcyBiZWVuIHNwZWNpZmllZCB1c2luZyB0aGUgIi0tdG9vbHNldD0uLi4iIGNvbW1hbmQtbGluZQorICAgICAgICAjIG9wdGlvbiBmb3JtLgorICAgICAgICBpZiAhICQodCkgaW4gJCguYXJndikgJChmZWF0dXJlLXRvb2xzZXRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKC5kZWJ1Zy1jb25maWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyBub3RpY2U6IFtjbWRsaW5lLWNmZ10gYWRkaW5nIHRvb2xzZXQ9JCh0KSB0byB0aGUgYnVpbGQKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC4gOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXh0cmEtcHJvcGVydGllcyArPSB0b29sc2V0PSQodCkgOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICQoZXh0cmEtcHJvcGVydGllcykgOworfQorCisKKyMgUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBwcm9qZWN0IChpZGVudGlmZWQgYnkgaXRzIHByb2plY3QgbW9kdWxlKSBzaG91bGQgYmUKKyMgY2xlYW5lZCBiZWNhdXNlIGl0IG9yIGFueSBvZiBpdHMgcGFyZW50IHByb2plY3RzIGhhdmUgYWxyZWFkeSBiZWVuIG1hcmtlZCBhcworIyBuZWVkaW5nIHRvIGJlIGNsZWFuZWQgaW4gdGhpcyBidWlsZC4gQXMgYW4gb3B0aW1pemF0aW9uLCB3aWxsIGV4cGxpY2l0bHkgbWFyaworIyBhbGwgZW5jb3VudGVyZWQgcHJvamVjdCBuZWVkaW5nIHRvIGJlIGNsZWFuZWQgaW4gY2FzZSB0aGF5IGhhdmUgbm90IGFscmVhZHkKKyMgYmVlbiBtYXJrZWQgc28uCisjCitsb2NhbCBydWxlIHNob3VsZC1jbGVhbi1wcm9qZWN0ICggcHJvamVjdCApCit7CisgICAgaWYgISAkKC5zaG91bGQtY2xlYW4tcHJvamVjdC4kKHByb2plY3QpKS1pcy1kZWZpbmVkCisgICAgeworICAgICAgICBsb2NhbCByID0gIiIgOworICAgICAgICBpZiAhIFsgcHJvamVjdC5pcy1qYW1yb290LW1vZHVsZSAkKHByb2plY3QpIF0KKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgcGFyZW50ID0gWyBwcm9qZWN0LmF0dHJpYnV0ZSAkKHByb2plY3QpIHBhcmVudC1tb2R1bGUgXSA7CisgICAgICAgICAgICBpZiAkKHBhcmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByID0gWyBzaG91bGQtY2xlYW4tcHJvamVjdCAkKHBhcmVudCkgXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLnNob3VsZC1jbGVhbi1wcm9qZWN0LiQocHJvamVjdCkgPSAkKHIpIDsKKyAgICB9CisKKyAgICByZXR1cm4gJCguc2hvdWxkLWNsZWFuLXByb2plY3QuJChwcm9qZWN0KSkgOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG1haW4oKQorIyAtLS0tLS0KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3sKKyAgICBpZiAtLXZlcnNpb24gaW4gJCguYXJndikKKyAgICB7CisgICAgICAgIHZlcnNpb24ucHJpbnQgOworICAgICAgICBFWElUIDsKKyAgICB9CisKKyAgICB2ZXJzaW9uLnZlcmlmeS1lbmdpbmUtdmVyc2lvbiA7CisKKyAgICBsb2FkLWNvbmZpZ3VyYXRpb24tZmlsZXMgOworCisgICAgIyBMb2FkIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHRvb2xzZXQgbW9kdWxlcy4KKyAgICBsb2NhbCBleHRyYS1wcm9wZXJ0aWVzID0gWyBwcm9jZXNzLWV4cGxpY2l0LXRvb2xzZXQtcmVxdWVzdHMgXSA7CisKKyAgICAjIExvYWQgdGhlIGFjdHVhbCBwcm9qZWN0IGJ1aWxkIHNjcmlwdCBtb2R1bGVzLiBXZSBhbHdheXMgbG9hZCB0aGUgcHJvamVjdAorICAgICMgaW4gdGhlIGN1cnJlbnQgZm9sZGVyIHNvICd1c2UtcHJvamVjdCcgZGlyZWN0aXZlcyBoYXZlIGFueSBjaGFuY2Ugb2YgYmVpbmcKKyAgICAjIHNlZW4uIE90aGVyd2lzZSwgd2Ugd291bGQgbm90IGJlIGFibGUgdG8gcmVmZXIgdG8gc3VicHJvamVjdHMgdXNpbmcgdGFyZ2V0CisgICAgIyBpZHMuCisgICAgbG9jYWwgY3VycmVudC1wcm9qZWN0IDsKKyAgICB7CisgICAgICAgIGxvY2FsIGN1cnJlbnQtbW9kdWxlID0gWyBwcm9qZWN0LmZpbmQgIi4iIDogIi4iIF0gOworICAgICAgICBpZiAkKGN1cnJlbnQtbW9kdWxlKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50LXByb2plY3QgPSBbIHByb2plY3QudGFyZ2V0ICQoY3VycmVudC1tb2R1bGUpIF0gOworICAgICAgICB9CisgICAgfQorCisgICAgIyBMb2FkIHRoZSBkZWZhdWx0IHRvb2xzZXQgbW9kdWxlIGlmIG5vIG90aGVyIGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkLgorICAgIGlmICEgWyBmZWF0dXJlLnZhbHVlcyA8dG9vbHNldD4gXQorICAgIHsKKyAgICAgICAgbG9jYWwgZGVmYXVsdC10b29sc2V0ID0gJCguZGVmYXVsdC10b29sc2V0KSA7CisgICAgICAgIGxvY2FsIGRlZmF1bHQtdG9vbHNldC12ZXJzaW9uID0gOworICAgICAgICBpZiAkKGRlZmF1bHQtdG9vbHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgZGVmYXVsdC10b29sc2V0LXZlcnNpb24gPSAkKC5kZWZhdWx0LXRvb2xzZXQtdmVyc2lvbikgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGVmYXVsdC10b29sc2V0ID0gZ2NjIDsKKyAgICAgICAgICAgIGlmIFsgb3MubmFtZSBdID0gTlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0LXRvb2xzZXQgPSBtc3ZjIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgWyBvcy5uYW1lIF0gPSBNQUNPU1gKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0LXRvb2xzZXQgPSBkYXJ3aW4gOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRUNITyAid2FybmluZzogTm8gdG9vbHNldHMgYXJlIGNvbmZpZ3VyZWQuIiA7CisgICAgICAgIEVDSE8gIndhcm5pbmc6IENvbmZpZ3VyaW5nIGRlZmF1bHQgdG9vbHNldCIgXCIkKGRlZmF1bHQtdG9vbHNldClcIi4gOworICAgICAgICBFQ0hPICJ3YXJuaW5nOiBJZiB0aGUgZGVmYXVsdCBpcyB3cm9uZywgeW91ciBidWlsZCBtYXkgbm90IHdvcmsgY29ycmVjdGx5LiIgOworICAgICAgICBFQ0hPICJ3YXJuaW5nOiBVc2UgdGhlIFwidG9vbHNldD14eHh4eFwiIG9wdGlvbiB0byBvdmVycmlkZSBvdXIgZ3Vlc3MuIiA7CisgICAgICAgIEVDSE8gIndhcm5pbmc6IEZvciBtb3JlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgcGxlYXNlIGNvbnN1bHQiIDsKKyAgICAgICAgRUNITyAid2FybmluZzogaHR0cDovL2Jvb3N0Lm9yZy9ib29zdC1idWlsZDIvZG9jL2h0bWwvYmJ2Mi9hZHZhbmNlZC9jb25maWd1cmF0aW9uLmh0bWwiIDsKKworICAgICAgICB0b29sc2V0LnVzaW5nICQoZGVmYXVsdC10b29sc2V0KSA6ICQoZGVmYXVsdC10b29sc2V0LXZlcnNpb24pIDsKKyAgICB9CisKKworICAgICMgUGFyc2UgY29tbWFuZCBsaW5lIGZvciB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzLiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcworICAgICMgdGhhdCBhbGwgcHJvamVjdCBmaWxlcyBhbHJlYWR5IGJlIGxvYWRlZC4KKyAgICAjIEZJWE1FOiBUaGlzIGlzIG5vdCBlbnRpcmVseSB0cnVlLiBBZGRpdGlvbmFsIHByb2plY3QgZmlsZXMgbWF5IGJlIGxvYWRlZAorICAgICMgb25seSBsYXRlciB2aWEgdGhlIHByb2plY3QuZmluZCgpIHJ1bGUgd2hlbiBkZXJlZmVyZW5jaW5nIGVuY291bnRlcmVkCisgICAgIyB0YXJnZXQgaWRzIGNvbnRhaW5pbmcgZXhwbGljaXQgcHJvamVjdCByZWZlcmVuY2VzLiBTZWUgd2hhdCB0byBkbyBhYm91dAorICAgICMgdGhvc2UgYXMgc3VjaCAnbGF6eSBsb2FkaW5nJyBtYXkgY2F1c2UgcHJvYmxlbXMgdGhhdCBhcmUgdGhlbiBleHRyZW1lbHkKKyAgICAjIGRpZmZpY3VsdCB0byBkZWJ1Zy4KKyAgICBsb2NhbCBidWlsZC1yZXF1ZXN0ID0gWyBidWlsZC1yZXF1ZXN0LmZyb20tY29tbWFuZC1saW5lICQoLmFyZ3YpCisgICAgICAgICQoZXh0cmEtcHJvcGVydGllcykgXSA7CisgICAgbG9jYWwgdGFyZ2V0LWlkcyA9IFsgJChidWlsZC1yZXF1ZXN0KS5nZXQtYXQgMSBdIDsKKyAgICBsb2NhbCBwcm9wZXJ0aWVzID0gWyAkKGJ1aWxkLXJlcXVlc3QpLmdldC1hdCAyIF0gOworCisKKyAgICAjIEV4cGFuZCBwcm9wZXJ0aWVzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIGludG8gbXVsdGlwbGUgcHJvcGVydHkKKyAgICAjIHNldHMgY29uc2lzdGluZyBvZiBhbGwgbGVnYWwgcHJvcGVydHkgY29tYmluYXRpb25zLiBFYWNoIGV4cGFuZGVkIHByb3BlcnR5CisgICAgIyBzZXQgd2lsbCBiZSB1c2VkIGZvciBhIHNpbmdsZSBidWlsZCBydW4uIEUuZy4gaWYgbXVsdGlwbGUgdG9vbHNldHMgYXJlCisgICAgIyBzcGVjaWZpZWQgdGhlbiByZXF1ZXN0ZWQgdGFyZ2V0cyB3aWxsIGJlIGJ1aWx0IHdpdGggZWFjaCBvZiB0aGVtLgorICAgIGlmICQocHJvcGVydGllcykKKyAgICB7CisgICAgICAgIGV4cGFuZGVkID0gWyBidWlsZC1yZXF1ZXN0LmV4cGFuZC1uby1kZWZhdWx0cyAkKHByb3BlcnRpZXMpIF0gOworICAgICAgICBsb2NhbCB4ZXhwYW5kZWQgOworICAgICAgICBmb3IgbG9jYWwgZSBpbiAkKGV4cGFuZGVkKQorICAgICAgICB7CisgICAgICAgICAgICB4ZXhwYW5kZWQgKz0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlIFsgZmVhdHVyZS5zcGxpdCAkKGUpIF0gXSA7CisgICAgICAgIH0KKyAgICAgICAgZXhwYW5kZWQgPSAkKHhleHBhbmRlZCkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBleHBhbmRlZCA9IFsgcHJvcGVydHktc2V0LmVtcHR5IF0gOworICAgIH0KKworCisgICAgIyBDaGVjayB0aGF0IHdlIGFjdHVhbGx5IGZvdW5kIHNvbWV0aGluZyB0byBidWlsZC4KKyAgICBpZiAhICQoY3VycmVudC1wcm9qZWN0KSAmJiAhICQodGFyZ2V0LWlkcykKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMudXNlci1lcnJvciBubyBKYW1maWxlICJpbiIgY3VycmVudCBkaXJlY3RvcnkgZm91bmQsIGFuZCBubyB0YXJnZXQKKyAgICAgICAgICAgIHJlZmVyZW5jZXMgc3BlY2lmaWVkLiA7CisgICAgfQorCisKKyAgICAjIEZsYWdzIGluZGljYXRpbmcgdGhhdCB0aGlzIGJ1aWxkIHN5c3RlbSBydW4gaGFzIGJlZW4gc3RhcnRlZCBpbiBvcmRlciB0bworICAgICMgY2xlYW4gZXhpc3RpbmcgaW5zdGVhZCBvZiBjcmVhdGUgbmV3IHRhcmdldHMuIE5vdGUgdGhhdCB0aGVzZSBhcmUgbm90IHRoZQorICAgICMgZmluYWwgZmxhZyB2YWx1ZXMgYXMgdGhleSBtYXkgZ2V0IGNoYW5nZWQgbGF0ZXIgb24gZHVlIHRvIHNvbWUgc3BlY2lhbAorICAgICMgdGFyZ2V0cyBiZWluZyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICBsb2NhbCBjbGVhbiAgICA7IGlmICItLWNsZWFuIiAgICAgaW4gJCguYXJndikgeyBjbGVhbiAgICA9IHRydWUgOyB9CisgICAgbG9jYWwgY2xlYW5hbGwgOyBpZiAiLS1jbGVhbi1hbGwiIGluICQoLmFyZ3YpIHsgY2xlYW5hbGwgPSB0cnVlIDsgfQorCisKKyAgICAjIExpc3Qgb2YgZXhwbGljaXRseSByZXF1ZXN0ZWQgZmlsZXMgdG8gYnVpbGQuIEFueSB0YXJnZXQgcmVmZXJlbmNlcyByZWFkCisgICAgIyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIG5vdCByZWNvZ25pemVkIGFzIG9uZSBvZiB0aGUgdGFyZ2V0cworICAgICMgZGVmaW5lZCBpbiB0aGUgbG9hZGVkIEphbWZpbGVzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gZXhwbGljaXRseQorICAgICMgcmVxdWVzdGVkIGZpbGUgdG8gYnVpbGQuIElmIGFueSBzdWNoIGZpbGVzIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZCB0aGVuCisgICAgIyBvbmx5IHRob3NlIGZpbGVzIGFuZCB0aGUgdGFyZ2V0cyB0aGV5IGRlcGVuZCBvbiB3aWxsIGJlIGJ1aWx0IGFuZCB0aGV5CisgICAgIyB3aWxsIGJlIHNlYXJjaGVkIGZvciBhbW9uZyB0YXJnZXRzIHRoYXQgd291bGQgaGF2ZSBiZWVuIGJ1aWx0IGhhZCB0aGVyZQorICAgICMgYmVlbiBubyBleHBsaWNpdGx5IHJlcXVlc3RlZCBmaWxlcy4KKyAgICBsb2NhbCBleHBsaWNpdGx5LXJlcXVlc3RlZC1maWxlcworCisKKyAgICAjIExpc3Qgb2YgQm9vc3QgQnVpbGQgbWV0YS10YXJnZXRzLCB2aXJ0dWFsLXRhcmdldHMgYW5kIGFjdHVhbCBKYW0gdGFyZ2V0cworICAgICMgY29uc3RydWN0ZWQgaW4gdGhpcyBidWlsZCBzeXN0ZW0gcnVuLgorICAgIGxvY2FsIHRhcmdldHMgOworICAgIGxvY2FsIHZpcnR1YWwtdGFyZ2V0cyA7CisgICAgbG9jYWwgYWN0dWFsLXRhcmdldHMgOworCisKKyAgICAjIFByb2Nlc3MgZWFjaCB0YXJnZXQgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUgYW5kIGNvbnZlcnQgaXQgaW50bworICAgICMgaW50ZXJuYWwgQm9vc3QgQnVpbGQgdGFyZ2V0IG9iamVjdHMuIERldGVjdCBzcGVjaWFsIGNsZWFuIHRhcmdldC4gSWYgbm8KKyAgICAjIG1haW4gQm9vc3QgQnVpbGQgdGFyZ2V0cyB3ZXJlIGV4cGxpY3RseSByZXF1ZXN0ZWQgdXNlIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAjIGFzIHRoZSB0YXJnZXQuCisgICAgZm9yIGxvY2FsIGlkIGluICQodGFyZ2V0LWlkcykKKyAgICB7CisgICAgICAgIGlmICQoaWQpID0gY2xlYW4KKyAgICAgICAgeworICAgICAgICAgICAgY2xlYW4gPSB0cnVlIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHQgOworICAgICAgICAgICAgaWYgJChjdXJyZW50LXByb2plY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdCA9IFsgJChjdXJyZW50LXByb2plY3QpLmZpbmQgJChpZCkgOiBuby1lcnJvciBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gWyBmaW5kLXRhcmdldCAkKGlkKSBdIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgISAkKHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAibm90aWNlOiBjb3VsZCBub3QgZmluZCBtYWluIHRhcmdldCIgJChpZCkgOworICAgICAgICAgICAgICAgIEVDSE8gIm5vdGljZTogYXNzdW1pbmcgaXQgaXMgYSBuYW1lIG9mIGZpbGUgdG8gY3JlYXRlLiIgOworICAgICAgICAgICAgICAgIGV4cGxpY2l0bHktcmVxdWVzdGVkLWZpbGVzICs9ICQoaWQpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRzICs9ICQodCkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICEgJCh0YXJnZXRzKQorICAgIHsKKyAgICAgICAgdGFyZ2V0cyArPSBbIHByb2plY3QudGFyZ2V0IFsgcHJvamVjdC5tb2R1bGUtbmFtZSAiLiIgXSBdIDsKKyAgICB9CisKKyAgICBpZiBbIG9wdGlvbi5nZXQgZHVtcC1nZW5lcmF0b3JzIDogOiB0cnVlIF0KKyAgICB7CisgICAgICAgIGdlbmVyYXRvcnMuZHVtcCA7CisgICAgfQorCisgICAgIyBXZSB3aXNoIHRvIHB1dCBjb25maWcubG9nIGluIHRoZSBidWlsZCBkaXJlY3RvcnkgY29ycmVzcG9uZGluZyB0byBKYW1yb290LAorICAgICMgc28gdGhhdCB0aGUgbG9jYXRpb24gZG9lcyBub3QgZGlmZmVyIGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0b3J5IHdlIHJ1biB0aGUKKyAgICAjIGJ1aWxkIGZyb20uIFRoZSBhbW91bnQgb2YgaW5kaXJlY3Rpb24gbmVjZXNzYXJ5IGhlcmUgaXMgc2NhcnkuCisgICAgbG9jYWwgZmlyc3QtcHJvamVjdCA9IFsgJCh0YXJnZXRzWzBdKS5wcm9qZWN0IF0gOworICAgIGxvY2FsIGZpcnN0LXByb2plY3Qtcm9vdC1sb2NhdGlvbiA9IFsgJChmaXJzdC1wcm9qZWN0KS5nZXQgcHJvamVjdC1yb290IF0gOworICAgIGxvY2FsIGZpcnN0LXByb2plY3Qtcm9vdC1tb2R1bGUgPSBbIHByb2plY3QubG9hZAorICAgICAgICAkKGZpcnN0LXByb2plY3Qtcm9vdC1sb2NhdGlvbikgXSA7CisgICAgbG9jYWwgZmlyc3QtcHJvamVjdC1yb290ID0gWyBwcm9qZWN0LnRhcmdldCAkKGZpcnN0LXByb2plY3Qtcm9vdC1tb2R1bGUpIF0gOworICAgIGxvY2FsIGZpcnN0LWJ1aWxkLWJ1aWxkLWRpciA9IFsgJChmaXJzdC1wcm9qZWN0LXJvb3QpLmJ1aWxkLWRpciBdIDsKKyAgICBjb25maWd1cmUuc2V0LWxvZy1maWxlICQoZmlyc3QtYnVpbGQtYnVpbGQtZGlyKS9jb25maWcubG9nIDsKKyAgICBjb25maWctY2FjaGUubG9hZCAkKGZpcnN0LWJ1aWxkLWJ1aWxkLWRpcikvcHJvamVjdC1jYWNoZS5qYW0gOworCisgICAgIyBOb3cgdGhhdCB3ZSBoYXZlIGEgc2V0IG9mIHRhcmdldHMgdG8gYnVpbGQgYW5kIGEgc2V0IG9mIHByb3BlcnR5IHNldHMgdG8KKyAgICAjIGJ1aWxkIHRoZSB0YXJnZXRzIHdpdGgsIHdlIGNhbiBzdGFydCB0aGUgbWFpbiBidWlsZCBwcm9jZXNzIGJ5IHVzaW5nIGVhY2gKKyAgICAjIHByb3BlcnR5IHNldCB0byBnZW5lcmF0ZSB2aXJ0dWFsIHRhcmdldHMgZnJvbSBhbGwgb2Ygb3VyIGxpc3RlZCB0YXJnZXRzCisgICAgIyBhbmQgYW55IG9mIHRoZWlyIGRlcGVuZGFudHMuCisgICAgZm9yIGxvY2FsIHAgaW4gJChleHBhbmRlZCkKKyAgICB7CisgICAgICAgIC5jb21tYW5kLWxpbmUtZnJlZS1mZWF0dXJlcyA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZSBbICQocCkuZnJlZSBdIF0gOworICAgICAgICBmb3IgbG9jYWwgdCBpbiAkKHRhcmdldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGcgPSBbICQodCkuZ2VuZXJhdGUgJChwKSBdIDsKKyAgICAgICAgICAgIGlmICEgWyBjbGFzcy5pcy1hICQodCkgOiBwcm9qZWN0LXRhcmdldCBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLnJlc3VsdHMtb2YtbWFpbi10YXJnZXRzICs9ICQoZ1syLV0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwtdGFyZ2V0cyArPSAkKGdbMi1dKSA7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgQ29udmVydCBjb2xsZWN0ZWQgdmlydHVhbCB0YXJnZXRzIGludG8gYWN0dWFsIHJhdyBKYW0gdGFyZ2V0cy4KKyAgICBmb3IgdCBpbiAkKHZpcnR1YWwtdGFyZ2V0cykKKyAgICB7CisgICAgICAgIGFjdHVhbC10YXJnZXRzICs9IFsgJCh0KS5hY3R1YWxpemUgXSA7CisgICAgfQorCisgICAgY29uZmlnLWNhY2hlLnNhdmUgOworCisKKyAgICAjIElmIFhNTCBkYXRhIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQgcHJlcGFyZSBhZGRpdGlvbmFsIHJ1bGVzIGFuZCB0YXJnZXRzCisgICAgIyBzbyB3ZSBjYW4gaG9vayBpbnRvIEphbSB0byBjb2xsZWN0IGJ1aWxkIGRhdGEgd2hpbGUgaXRzIGJ1aWxkaW5nIGFuZCBoYXZlCisgICAgIyBpdCB0cmlnZ2VyIHRoZSBmaW5hbCBYTUwgcmVwb3J0IGdlbmVyYXRpb24gYWZ0ZXIgYWxsIHRoZSBwbGFubmVkIHRhcmdldHMKKyAgICAjIGhhdmUgYmVlbiBidWlsdC4KKyAgICBpZiAkKC5vdXQteG1sKQorICAgIHsKKyAgICAgICAgIyBHZXQgYSBxdWFsaWZpZWQgdmlydHVhbCB0YXJnZXQgbmFtZS4KKyAgICAgICAgcnVsZSBmdWxsLXRhcmdldC1uYW1lICggdGFyZ2V0ICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgbmFtZSA9IFsgJCh0YXJnZXQpLm5hbWUgXSA7CisgICAgICAgICAgICBsb2NhbCBwcm9qZWN0ID0gWyAkKHRhcmdldCkucHJvamVjdCBdIDsKKyAgICAgICAgICAgIGxvY2FsIHByb2plY3QtcGF0aCA9IFsgJChwcm9qZWN0KS5nZXQgbG9jYXRpb24gXSA7CisgICAgICAgICAgICByZXR1cm4gJChwcm9qZWN0LXBhdGgpLy8kKG5hbWUpIDsKKyAgICAgICAgfQorCisgICAgICAgICMgR2VuZXJhdGUgYW4gWE1MIGZpbGUgY29udGFpbmluZyBidWlsZCBzdGF0aXN0aWNzIGZvciBlYWNoIGNvbnN0aXR1ZW50LgorICAgICAgICAjCisgICAgICAgIHJ1bGUgb3V0LXhtbCAoIHhtbC1maWxlIDogY29uc3RpdHVlbnRzICogKQorICAgICAgICB7CisgICAgICAgICAgICAjIFByZXBhcmUgdmFsaWQgWE1MIGhlYWRlciBhbmQgZm9vdGVyIHdpdGggc29tZSBiYXNpYyBpbmZvLgorICAgICAgICAgICAgbG9jYWwgbmwgPSAiCisiIDsKKyAgICAgICAgICAgIGxvY2FsIG9zICAgICAgICA9IFsgbW9kdWxlcy5wZWVrIDogT1MgT1NQTEFUIEpBTVVOQU1FIF0gIiIgOworICAgICAgICAgICAgbG9jYWwgdGltZXN0YW1wID0gWyBtb2R1bGVzLnBlZWsgOiBKQU1EQVRFIF0gOworICAgICAgICAgICAgbG9jYWwgY3dkICAgICAgID0gWyBQV0QgXSA7CisgICAgICAgICAgICBsb2NhbCBjb21tYW5kICAgPSAkKC5hcmd2KSA7CisgICAgICAgICAgICBsb2NhbCBiYi12ZXJzaW9uID0gWyB2ZXJzaW9uLmJvb3N0LWJ1aWxkIF0gOworICAgICAgICAgICAgLmhlYWRlciBvbiAkKHhtbC1maWxlKSA9CisgICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PiIKKyAgICAgICAgICAgICAgICAiJChubCk8YnVpbGQgZm9ybWF0PVwiMS4wXCIgdmVyc2lvbj1cIiQoYmItdmVyc2lvbilcIj4iCisgICAgICAgICAgICAgICAgIiQobmwpICA8b3MgbmFtZT1cIiQob3NbMV0pXCIgcGxhdGZvcm09XCIkKG9zWzJdKVwiPjwhW0NEQVRBWyQob3NbMy1dOko9ICldXT48L29zPiIKKyAgICAgICAgICAgICAgICAiJChubCkgIDx0aW1lc3RhbXA+PCFbQ0RBVEFbJCh0aW1lc3RhbXApXV0+PC90aW1lc3RhbXA+IgorICAgICAgICAgICAgICAgICIkKG5sKSAgPGRpcmVjdG9yeT48IVtDREFUQVskKGN3ZCldXT48L2RpcmVjdG9yeT4iCisgICAgICAgICAgICAgICAgIiQobmwpICA8Y29tbWFuZD48IVtDREFUQVtcIiQoY29tbWFuZDpKPVwiIFwiKVwiXV0+PC9jb21tYW5kPiIKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAuZm9vdGVyIG9uICQoeG1sLWZpbGUpID0KKyAgICAgICAgICAgICAgICAiJChubCk8L2J1aWxkPiIgOworCisgICAgICAgICAgICAjIEdlbmVyYXRlIHRoZSB0YXJnZXQgZGVwZW5kZW5jeSBncmFwaC4KKyAgICAgICAgICAgIC5jb250ZW50cyBvbiAkKHhtbC1maWxlKSArPQorICAgICAgICAgICAgICAgICIkKG5sKSAgPHRhcmdldHM+IiA7CisgICAgICAgICAgICBmb3IgbG9jYWwgdCBpbiBbIHZpcnR1YWwtdGFyZ2V0LmFsbC10YXJnZXRzIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBhY3Rpb24gPSBbICQodCkuYWN0aW9uIF0gOworICAgICAgICAgICAgICAgIGlmICQoYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAjIElmIGEgdGFyZ2V0IGhhcyBubyBhY3Rpb24sIGl0IGhhcyBubyBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NhbCBuYW1lID0gWyBmdWxsLXRhcmdldC1uYW1lICQodCkgXSA7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsIHNvdXJjZXMgPSBbICQoYWN0aW9uKS5zb3VyY2VzIF0gOworICAgICAgICAgICAgICAgICAgICBsb2NhbCBkZXBlbmRlbmNpZXMgOworICAgICAgICAgICAgICAgICAgICBmb3IgbG9jYWwgcyBpbiAkKHNvdXJjZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyArPSBbIGZ1bGwtdGFyZ2V0LW5hbWUgJChzKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxvY2FsIHBhdGggPSBbICQodCkucGF0aCBdIDsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwgamFtLXRhcmdldCA9IFsgJCh0KS5hY3R1YWwtbmFtZSBdIDsKKworICAgICAgICAgICAgICAgICAgICAuY29udGVudHMgb24gJCh4bWwtZmlsZSkgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgICIkKG5sKSAgICA8dGFyZ2V0PiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIkKG5sKSAgICAgIDxuYW1lPjwhW0NEQVRBWyQobmFtZSldXT48L25hbWU+IgorICAgICAgICAgICAgICAgICAgICAgICAgIiQobmwpICAgICAgPGRlcGVuZGVuY2llcz4iCisgICAgICAgICAgICAgICAgICAgICAgICAiJChubCkgICAgICAgIDxkZXBlbmRlbmN5PjwhW0NEQVRBWyQoZGVwZW5kZW5jaWVzKV1dPjwvZGVwZW5kZW5jeT4iCisgICAgICAgICAgICAgICAgICAgICAgICAiJChubCkgICAgICA8L2RlcGVuZGVuY2llcz4iCisgICAgICAgICAgICAgICAgICAgICAgICAiJChubCkgICAgICA8cGF0aD48IVtDREFUQVskKHBhdGgpXV0+PC9wYXRoPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIkKG5sKSAgICAgIDxqYW0tdGFyZ2V0PjwhW0NEQVRBWyQoamFtLXRhcmdldCldXT48L2phbS10YXJnZXQ+IgorICAgICAgICAgICAgICAgICAgICAgICAgIiQobmwpICAgIDwvdGFyZ2V0PiIKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAuY29udGVudHMgb24gJCh4bWwtZmlsZSkgKz0KKyAgICAgICAgICAgICAgICAiJChubCkgIDwvdGFyZ2V0cz4iIDsKKworICAgICAgICAgICAgIyBCdWlsZCAkKHhtbC1maWxlKSBhZnRlciAkKGNvbnN0aXR1ZW50cykuIERvIHNvIGV2ZW4gaWYgYQorICAgICAgICAgICAgIyBjb25zdGl0dWVudCBhY3Rpb24gZmFpbHMgYW5kIHJlZ2VuZXJhdGUgdGhlIHhtbCBvbiBldmVyeSBiamFtIHJ1bi4KKyAgICAgICAgICAgIElOQ0xVREVTICQoeG1sLWZpbGUpIDogJChjb25zdGl0dWVudHMpIDsKKyAgICAgICAgICAgIEFMV0FZUyAkKHhtbC1maWxlKSA7CisgICAgICAgICAgICBfX0FDVElPTl9SVUxFX18gb24gJCh4bWwtZmlsZSkgPQorICAgICAgICAgICAgICAgIGJ1aWxkLXN5c3RlbS5vdXQteG1sLmdlbmVyYXRlLWFjdGlvbiA7CisgICAgICAgICAgICBvdXQteG1sLmdlbmVyYXRlICQoeG1sLWZpbGUpIDsKKyAgICAgICAgfQorCisgICAgICAgICMgVGhlIGFjdHVhbCBidWlsZCBhY3Rpb25zIGFyZSBoZXJlOyBpZiB3ZSBkaWQgdGhpcyB3b3JrIGluIHRoZSBhY3Rpb25zCisgICAgICAgICMgY2xhdXNlIHdlIHdvdWxkIGhhdmUgdG8gZm9ybSBhIHZhbGlkIGNvbW1hbmQgbGluZSBjb250YWluaW5nIHRoZQorICAgICAgICAjIHJlc3VsdCBvZiBAKC4uLikgYmVsb3cgKHRoZSBuYW1lIG9mIHRoZSBYTUwgZmlsZSkuCisgICAgICAgICMKKyAgICAgICAgcnVsZSBvdXQteG1sLmdlbmVyYXRlLWFjdGlvbiAoIGFyZ3MgKiA6IHhtbC1maWxlCisgICAgICAgICAgICA6IGNvbW1hbmQgc3RhdHVzIHN0YXJ0IGVuZCB1c2VyIHN5c3RlbSA6IG91dHB1dCA/ICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgY29udGVudHMgPQorICAgICAgICAgICAgICAgIFsgb24gJCh4bWwtZmlsZSkgcmV0dXJuICQoLmhlYWRlcikgJCguY29udGVudHMpICQoLmZvb3RlcikgXSA7CisgICAgICAgICAgICBsb2NhbCBmID0gQCgkKHhtbC1maWxlKTpFPSQoY29udGVudHMpKSA7CisgICAgICAgIH0KKworICAgICAgICAjIE5vdGhpbmcgdG8gZG8gaGVyZTsgdGhlICpyZWFsKiBhY3Rpb25zIGhhcHBlbiBpbgorICAgICAgICAjIG91dC14bWwuZ2VuZXJhdGUtYWN0aW9uLgorICAgICAgICBhY3Rpb25zIHF1aWV0bHkgb3V0LXhtbC5nZW5lcmF0ZSB7IH0KKworICAgICAgICAjIERlZmluZSB0aGUgb3V0LXhtbCBmaWxlIHRhcmdldCwgd2hpY2ggZGVwZW5kcyBvbiBhbGwgdGhlIHRhcmdldHMgc28KKyAgICAgICAgIyB0aGF0IGl0IHJ1bnMgdGhlIGNvbGxlY3Rpb24gYWZ0ZXIgdGhlIHRhcmdldHMgaGF2ZSBydW4uCisgICAgICAgIG91dC14bWwgJCgub3V0LXhtbCkgOiAkKGFjdHVhbC10YXJnZXRzKSA7CisKKyAgICAgICAgIyBTZXQgdXAgYSBnbG9iYWwgX19BQ1RJT05fUlVMRV9fIHRoYXQgcmVjb3JkcyBhbGwgdGhlIGF2YWlsYWJsZQorICAgICAgICAjIHN0YXRpc3RpY3MgYWJvdXQgZWFjaCBhY3R1YWwgdGFyZ2V0IGluIGEgdmFyaWFibGUgIm9uIiB0aGUgLS1vdXQteG1sCisgICAgICAgICMgdGFyZ2V0LgorICAgICAgICAjCisgICAgICAgIHJ1bGUgb3V0LXhtbC5jb2xsZWN0ICggeG1sLWZpbGUgOiB0YXJnZXQgOiBjb21tYW5kIHN0YXR1cyBzdGFydCBlbmQgdXNlcgorICAgICAgICAgICAgc3lzdGVtIDogb3V0cHV0ID8gKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBubCA9ICIKKyIgOworICAgICAgICAgICAgIyBPcGVuIHRoZSBhY3Rpb24gd2l0aCBzb21lIGJhc2ljIGluZm8uCisgICAgICAgICAgICAuY29udGVudHMgb24gJCh4bWwtZmlsZSkgKz0KKyAgICAgICAgICAgICAgICAiJChubCkgIDxhY3Rpb24gc3RhdHVzPVwiJChzdGF0dXMpXCIgc3RhcnQ9XCIkKHN0YXJ0KVwiIGVuZD1cIiQoZW5kKVwiIHVzZXI9XCIkKHVzZXIpXCIgc3lzdGVtPVwiJChzeXN0ZW0pXCI+IiA7CisKKyAgICAgICAgICAgICMgSWYgd2UgaGF2ZSBhbiBhY3Rpb24gb2JqZWN0IHdlIGNhbiBwcmludCBvdXQgbW9yZSBkZXRhaWxlZCBpbmZvLgorICAgICAgICAgICAgbG9jYWwgYWN0aW9uID0gWyBvbiAkKHRhcmdldCkgcmV0dXJuICQoLmFjdGlvbikgXSA7CisgICAgICAgICAgICBpZiAkKGFjdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBhY3Rpb24tbmFtZSAgICA9IFsgJChhY3Rpb24pLmFjdGlvbi1uYW1lIF0gOworICAgICAgICAgICAgICAgIGxvY2FsIGFjdGlvbi1zb3VyY2VzID0gWyAkKGFjdGlvbikuc291cmNlcyAgICAgXSA7CisgICAgICAgICAgICAgICAgbG9jYWwgYWN0aW9uLXByb3BzICAgPSBbICQoYWN0aW9uKS5wcm9wZXJ0aWVzICBdIDsKKworICAgICAgICAgICAgICAgICMgVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhY3Rpb24gd2hpY2ggd2UgY3JlYXRlZCB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgICAgIC5jb250ZW50cyBvbiAkKHhtbC1maWxlKSArPQorICAgICAgICAgICAgICAgICAgICAiJChubCkgICAgPG5hbWU+PCFbQ0RBVEFbJChhY3Rpb24tbmFtZSldXT48L25hbWU+IiA7CisKKyAgICAgICAgICAgICAgICAjIFRoZSBzb3VyY2VzIHRoYXQgbWFkZSB1cCB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgICAgIC5jb250ZW50cyBvbiAkKHhtbC1maWxlKSArPQorICAgICAgICAgICAgICAgICAgICAiJChubCkgICAgPHNvdXJjZXM+IiA7CisgICAgICAgICAgICAgICAgZm9yIGxvY2FsIHNvdXJjZSBpbiAkKGFjdGlvbi1zb3VyY2VzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwgc291cmNlLWFjdHVhbCA9IFsgJChzb3VyY2UpLmFjdHVhbC1uYW1lIF0gOworICAgICAgICAgICAgICAgICAgICAuY29udGVudHMgb24gJCh4bWwtZmlsZSkgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgICIkKG5sKSAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbJChzb3VyY2UtYWN0dWFsKV1dPjwvc291cmNlPiIgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAuY29udGVudHMgb24gJCh4bWwtZmlsZSkgKz0KKyAgICAgICAgICAgICAgICAgICAgIiQobmwpICAgIDwvc291cmNlcz4iIDsKKworICAgICAgICAgICAgICAgICMgVGhlIHByb3BlcnRpZXMgdGhhdCBkZWZpbmUgdGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlCisgICAgICAgICAgICAgICAgIyB0YXJnZXQgd2FzIGJ1aWx0LgorICAgICAgICAgICAgICAgIC5jb250ZW50cyBvbiAkKHhtbC1maWxlKSArPQorICAgICAgICAgICAgICAgICAgICAiJChubCkgICAgPHByb3BlcnRpZXM+IiA7CisgICAgICAgICAgICAgICAgZm9yIGxvY2FsIHByb3AgaW4gWyAkKGFjdGlvbi1wcm9wcykucmF3IF0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsIHByb3AtbmFtZSA9IFsgTUFUQ0ggXjwoLiopPiQgOiAkKHByb3A6RykgXSA7CisgICAgICAgICAgICAgICAgICAgIC5jb250ZW50cyBvbiAkKHhtbC1maWxlKSArPQorICAgICAgICAgICAgICAgICAgICAgICAgIiQobmwpICAgICAgPHByb3BlcnR5IG5hbWU9XCIkKHByb3AtbmFtZSlcIj48IVtDREFUQVskKHByb3A6Rz0pXV0+PC9wcm9wZXJ0eT4iIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLmNvbnRlbnRzIG9uICQoeG1sLWZpbGUpICs9CisgICAgICAgICAgICAgICAgICAgICIkKG5sKSAgICA8L3Byb3BlcnRpZXM+IiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvY2FsIGxvY2F0ZSA9IFsgb24gJCh0YXJnZXQpIHJldHVybiAkKExPQ0FURSkgXSA7CisgICAgICAgICAgICBsb2NhdGUgPz0gIiIgOworICAgICAgICAgICAgLmNvbnRlbnRzIG9uICQoeG1sLWZpbGUpICs9CisgICAgICAgICAgICAgICAgIiQobmwpICAgIDxqYW0tdGFyZ2V0PjwhW0NEQVRBWyQodGFyZ2V0KV1dPjwvamFtLXRhcmdldD4iCisgICAgICAgICAgICAgICAgIiQobmwpICAgIDxwYXRoPjwhW0NEQVRBWyQodGFyZ2V0Okc9OlI9JChsb2NhdGUpKV1dPjwvcGF0aD4iCisgICAgICAgICAgICAgICAgIiQobmwpICAgIDxjb21tYW5kPjwhW0NEQVRBWyQoY29tbWFuZCldXT48L2NvbW1hbmQ+IgorICAgICAgICAgICAgICAgICIkKG5sKSAgICA8b3V0cHV0PjwhW0NEQVRBWyQob3V0cHV0KV1dPjwvb3V0cHV0PiIgOworICAgICAgICAgICAgLmNvbnRlbnRzIG9uICQoeG1sLWZpbGUpICs9CisgICAgICAgICAgICAgICAgIiQobmwpICA8L2FjdGlvbj4iIDsKKyAgICAgICAgfQorCisgICAgICAgICMgV2hlbiBubyBfX0FDVElPTl9SVUxFX18gaXMgc2V0ICJvbiIgYSB0YXJnZXQsIHRoZSBzZWFyY2ggZmFsbHMgYmFjayB0bworICAgICAgICAjIHRoZSBnbG9iYWwgbW9kdWxlLgorICAgICAgICBtb2R1bGUKKyAgICAgICAgeworICAgICAgICAgICAgX19BQ1RJT05fUlVMRV9fID0gYnVpbGQtc3lzdGVtLm91dC14bWwuY29sbGVjdAorICAgICAgICAgICAgICAgIFsgbW9kdWxlcy5wZWVrIGJ1aWxkLXN5c3RlbSA6IC5vdXQteG1sIF0gOworICAgICAgICB9CisKKyAgICAgICAgSU1QT1JUCisgICAgICAgICAgICBidWlsZC1zeXN0ZW0gOgorICAgICAgICAgICAgb3V0LXhtbC5jb2xsZWN0CisgICAgICAgICAgICBvdXQteG1sLmdlbmVyYXRlLWFjdGlvbgorICAgICAgICAgICAgOiA6CisgICAgICAgICAgICBidWlsZC1zeXN0ZW0ub3V0LXhtbC5jb2xsZWN0CisgICAgICAgICAgICBidWlsZC1zeXN0ZW0ub3V0LXhtbC5nZW5lcmF0ZS1hY3Rpb24KKyAgICAgICAgICAgIDsKKyAgICB9CisKKyAgICBsb2NhbCBqID0gWyBvcHRpb24uZ2V0IGpvYnMgXSA7CisgICAgaWYgJChqKQorICAgIHsKKyAgICAgICAgbW9kdWxlcy5wb2tlIDogUEFSQUxMRUxJU00gOiAkKGopIDsKKyAgICB9CisKKyAgICBsb2NhbCBrID0gWyBvcHRpb24uZ2V0IGtlZXAtZ29pbmcgOiB0cnVlIDogdHJ1ZSBdIDsKKyAgICBpZiAkKGspIGluICJvbiIgInllcyIgInRydWUiCisgICAgeworICAgICAgICBtb2R1bGVzLnBva2UgOiBLRUVQX0dPSU5HIDogMSA7CisgICAgfQorICAgIGVsc2UgaWYgJChrKSBpbiAib2ZmIiAibm8iICJmYWxzZSIKKyAgICB7CisgICAgICAgIG1vZHVsZXMucG9rZSA6IEtFRVBfR09JTkcgOiAwIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRVhJVCAiZXJyb3I6IEludmFsaWQgdmFsdWUgZm9yIHRoZSAtLWtlZXAtZ29pbmcgb3B0aW9uIiA7CisgICAgfQorCisgICAgIyBUaGUgJ2FsbCcgcHNldWRvIHRhcmdldCBpcyBub3Qgc3RyaWN0bHkgbmVlZGVkIGV4cGVjdCBpbiB0aGUgY2FzZSB3aGVuIHdlCisgICAgIyB1c2UgaXQgYmVsb3cgYnV0IHBlb3BsZSBvZnRlbiBhc3N1bWUgdGhleSBhbHdheXMgaGF2ZSB0aGlzIHRhcmdldAorICAgICMgYXZhaWxhYmxlIGFuZCBkbyBub3QgZGVjbGFyZSBpdCB0aGVtc2VsdmVzIGJlZm9yZSB1c2Ugd2hpY2ggbWF5IGNhdXNlCisgICAgIyBidWlsZCBmYWlsdXJlcyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgbm90IGJlaW5nIGFibGUgdG8gYnVpbGQgdGhlCisgICAgIyAnYWxsJyB0YXJnZXQuCisgICAgTk9URklMRSBhbGwgOworCisgICAgIyBBbmQgbm93IHRoYXQgYWxsIHRoZSBhY3R1YWwgcmF3IEphbSB0YXJnZXRzIGFuZCBhbGwgdGhlIGRlcGVuZGVuY2llcworICAgICMgYmV0d2VlbiB0aGVtIGhhdmUgYmVlbiBwcmVwYXJlZCBhbGwgdGhhdCBpcyBsZWZ0IGlzIHRvIHRlbGwgSmFtIHRvIHVwZGF0ZQorICAgICMgdGhvc2UgdGFyZ2V0cy4KKyAgICBpZiAkKGV4cGxpY2l0bHktcmVxdWVzdGVkLWZpbGVzKQorICAgIHsKKyAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyBjYXNlIGNhbiBub3QgYmUgam9pbmVkIHdpdGggdGhlIHJlZ3VsYXIgb25lIHdoZW4gb25seQorICAgICAgICAjIGV4YWN0IEJvb3N0IEJ1aWxkIHRhcmdldHMgYXJlIHJlcXVlc3RlZCBhcyBoZXJlIHdlIGRvIG5vdCBidWlsZCB0aG9zZQorICAgICAgICAjIHJlcXVlc3RlZCB0YXJnZXRzIGJ1dCBvbmx5IHVzZSB0aGVtIHRvIGNvbnN0cnVjdCB0aGUgZGVwZW5kZW5jeSB0cmVlCisgICAgICAgICMgbmVlZGVkIHRvIGJ1aWxkIHRoZSBleHBsaWNpdGx5IHJlcXVlc3RlZCBmaWxlcy4KKyAgICAgICAgVVBEQVRFICQoZXhwbGljaXRseS1yZXF1ZXN0ZWQtZmlsZXM6Rz1lKSAkKC5vdXQteG1sKSA7CisgICAgfQorICAgIGVsc2UgaWYgJChjbGVhbmFsbCkKKyAgICB7CisgICAgICAgIFVQREFURSBjbGVhbi1hbGwgOworICAgIH0KKyAgICBlbHNlIGlmICQoY2xlYW4pCisgICAgeworICAgICAgICBjb21tb24uQ2xlYW4gY2xlYW4gOiBbIGFjdHVhbC1jbGVhbi10YXJnZXRzIF0gOworICAgICAgICBVUERBVEUgY2xlYW4gOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb25maWd1cmUucHJpbnQtY29uZmlndXJlLWNoZWNrcy1zdW1tYXJ5IDsKKworICAgICAgICBpZiAkKC5wcmUtYnVpbGQtaG9vaykKKyAgICAgICAgeworICAgICAgICAgICAgJCgucHJlLWJ1aWxkLWhvb2spIDsKKyAgICAgICAgfQorCisgICAgICAgIERFUEVORFMgYWxsIDogJChhY3R1YWwtdGFyZ2V0cykgOworICAgICAgICBpZiBVUERBVEVfTk9XIGluIFsgUlVMRU5BTUVTIF0KKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgb2sgPSBbIFVQREFURV9OT1cgYWxsICQoLm91dC14bWwpIF0gOworICAgICAgICAgICAgaWYgJCgucG9zdC1idWlsZC1ob29rKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICQoLnBvc3QtYnVpbGQtaG9vaykgJChvaykgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgIyBQcmV2ZW50IGF1dG9tYXRpYyB1cGRhdGUgb2YgdGhlICdhbGwnIHRhcmdldCwgbm93IHRoYXQgd2UgaGF2ZQorICAgICAgICAgICAgIyBleHBsaWNpdGx5IHVwZGF0ZWQgd2hhdCB3ZSB3YW50ZWQuCisgICAgICAgICAgICBVUERBVEUgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVVBEQVRFIGFsbCAkKC5vdXQteG1sKSA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL2FjLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvYWMuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYmMxNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL2FjLmphbQpAQCAtMCwwICsxLDMwMyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTAgVmxhZGltaXIgUHJ1cy4KKyMgQ29weXJpZ2h0IChjKSAyMDEzIFN0ZXZlbiBXYXRhbmFiZQorIworIyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlCisjIExpY2Vuc2UgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yCisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworaW1wb3J0IHByb3BlcnR5LXNldCA7CitpbXBvcnQgcGF0aCA7CitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgImNsYXNzIiA7IAoraW1wb3J0IGVycm9ycyA7CitpbXBvcnQgY29uZmlndXJlIDsKK2ltcG9ydCBwcm9qZWN0IDsKK2ltcG9ydCB2aXJ0dWFsLXRhcmdldCA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IHByaW50IDsKKworcHJvamVjdC5pbml0aWFsaXplICQoX19uYW1lX18pIDsKKy5wcm9qZWN0ID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7Citwcm9qZWN0IGFjIDsKKworcnVsZSBnZW5lcmF0ZS1pbmNsdWRlICggdGFyZ2V0IDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NhbCBoZWFkZXIgPSBbIHByb3BlcnR5LnNlbGVjdCA8aW5jbHVkZT4gOiAkKHByb3BlcnRpZXMpIF0gOworICAgIHByaW50Lm91dHB1dCAkKHRhcmdldCkgOworICAgIHByaW50LnRleHQgIiNpbmNsdWRlIDwkKGhlYWRlcjpHPSk+IiA6IHRydWUgOworfQorCitydWxlIGdlbmVyYXRlLW1haW4gKCB0YXJnZXQgOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIHByaW50Lm91dHB1dCAkKHRhcmdldCkgOworICAgIHByaW50LnRleHQgImludCBtYWluKCkge30iIDogdHJ1ZSA7Cit9CisKK3J1bGUgZmluZC1pbmNsdWRlLXBhdGggKCBwcm9wZXJ0aWVzIDogaGVhZGVyIDogcHJvdmlkZWQtcGF0aCA/ICkKK3sKKyAgICBpZiAkKHByb3ZpZGVkLXBhdGgpICYmIFsgcGF0aC5leGlzdHMgWyBwYXRoLnJvb3QgJChoZWFkZXIpICQocHJvdmlkZWQtcGF0aCkgXSBdCisgICAgeworICAgICAgICByZXR1cm4gJChwcm92aWRlZC1wYXRoKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxvY2FsIGEgPSBbIGNsYXNzLm5ldyBhY3Rpb24gOiBhYy5nZW5lcmF0ZS1pbmNsdWRlIDogWyBwcm9wZXJ0eS1zZXQuY3JlYXRlIDxpbmNsdWRlPiQoaGVhZGVyKSBdIF0gOworICAgICAgICBsb2NhbCBjcHAgPSBbIGNsYXNzLm5ldyBmaWxlLXRhcmdldCAkKGhlYWRlcikuY3BwIGV4YWN0IDogQ1BQIDogJCgucHJvamVjdCkgOiAkKGEpIF0gOworICAgICAgICBjcHAgPSBbIHZpcnR1YWwtdGFyZ2V0LnJlZ2lzdGVyICQoY3BwKSBdIDsKKyAgICAgICAgbG9jYWwgcmVzdWx0ID0gWyBnZW5lcmF0b3JzLmNvbnN0cnVjdCAkKC5wcm9qZWN0KSAkKGhlYWRlcikgOiBPQkogOiAkKHByb3BlcnRpZXMpIDogJChjcHApIDogdHJ1ZSBdIDsKKyAgICAgICAgbG9jYWwgamFtLXRhcmdldHMgOworICAgICAgICBmb3IgdCBpbiAkKHJlc3VsdFsyLV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGphbS10YXJnZXRzICs9IFsgJCh0KS5hY3R1YWxpemUgXSA7CisgICAgICAgIH0KKyAgICAgICAgaWYgWyBVUERBVEVfTk9XICQoamFtLXRhcmdldHMpIDogWyBtb2R1bGVzLnBlZWsgY29uZmlndXJlIDogLmxvZy1mZCBdCisgICAgICAgICAgICA6IGlnbm9yZS1taW51cy1uIDogaWdub3JlLW1pbnVzLXEgXQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gJWRlZmF1bHQgOworICAgICAgICB9CisgICAgfQorfQorCitydWxlIGNvbnN0cnVjdC1saWJyYXJ5ICggbmFtZSA6IHByb3BlcnR5LXNldCA6IHByb3ZpZGVkLXBhdGggPyApCit7CisgICAgcHJvcGVydHktc2V0ID0gWyAkKHByb3BlcnR5LXNldCkucmVmaW5lIFsgcHJvcGVydHktc2V0LmNyZWF0ZSAkKGxpbmstb3B0KSBdIF0gOworICAgIGxvY2FsIGxpYi1wcm9wcyA9IFsgJChwcm9wZXJ0eS1zZXQpLmFkZC1yYXcgPG5hbWU+JChuYW1lKSA8c2VhcmNoPiQocHJvdmlkZWQtcGF0aCkgXSA7CisgICAgcmV0dXJuIFsgZ2VuZXJhdG9ycy5jb25zdHJ1Y3QgJCgucHJvamVjdCkgbGliLSQobmFtZSkKKyAgICAgICAgOiBTRUFSQ0hFRF9MSUIgOiAkKGxpYi1wcm9wcykgOiA6IHRydWUgXSA7Cit9CisKKworcnVsZSBmaW5kLWxpYnJhcnkgKCBwcm9wZXJ0aWVzIDogbmFtZXMgKyA6IHByb3ZpZGVkLXBhdGggPyApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBpZiAhICQoLm1haW4uY3BwKQorICAgIHsKKyAgICAgICAgbG9jYWwgYSA9IFsgY2xhc3MubmV3IGFjdGlvbiA6IGFjLmdlbmVyYXRlLW1haW4gOgorICAgICAgICAgICAgICAgICAgICBbIHByb3BlcnR5LXNldC5lbXB0eSBdIF0gOworICAgICAgICAubWFpbi5jcHAgPSBbIHZpcnR1YWwtdGFyZ2V0LnJlZ2lzdGVyCisgICAgICAgICAgICBbIGNsYXNzLm5ldyBmaWxlLXRhcmdldCBtYWluLmNwcCBleGFjdAorICAgICAgICAgICAgICAgIDogQ1BQIDogJCgucHJvamVjdCkgOiAkKGEpIF0gXSA7CisgICAgfQorICAgIGlmIFsgJChwcm9wZXJ0aWVzKS5nZXQgPGxpbms+IF0gPSBzaGFyZWQKKyAgICB7CisgICAgICAgIGxpbmstb3B0cyA9IDxsaW5rPnNoYXJlZCA8bGluaz5zdGF0aWMgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW5rLW9wdHMgPSA8bGluaz5zdGF0aWMgPGxpbms+c2hhcmVkIDsKKyAgICB9CisgICAgd2hpbGUgJChsaW5rLW9wdHMpCisgICAgeworICAgICAgICBsb2NhbCBuYW1lcy1pdGVyID0gJChuYW1lcykgOworICAgICAgICBwcm9wZXJ0aWVzID0gWyAkKHByb3BlcnRpZXMpLnJlZmluZSBbIHByb3BlcnR5LXNldC5jcmVhdGUgJChsaW5rLW9wdHNbMV0pIF0gXSA7CisgICAgICAgIHdoaWxlICQobmFtZXMtaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgbmFtZSA9ICQobmFtZXMtaXRlclsxXSkgOworICAgICAgICAgICAgbG9jYWwgbGliID0gWyBjb25zdHJ1Y3QtbGlicmFyeSAkKG5hbWUpIDogJChwcm9wZXJ0aWVzKSA6ICQocHJvdmlkZWQtcGF0aCkgXSA7CisgICAgICAgICAgICBsb2NhbCB0ZXN0ID0gWyBnZW5lcmF0b3JzLmNvbnN0cnVjdCAkKC5wcm9qZWN0KSAkKG5hbWUpIDogRVhFCisgICAgICAgICAgICAgICAgOiBbICQocHJvcGVydGllcykuYWRkICQobGliWzFdKSBdIDogJCgubWFpbi5jcHApICQobGliWzItXSkKKyAgICAgICAgICAgICAgICA6IHRydWUgXSA7CisgICAgICAgICAgICBsb2NhbCBqYW0tdGFyZ2V0cyA7CisgICAgICAgICAgICBmb3IgdCBpbiAkKHRlc3RbMi1dKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGphbS10YXJnZXRzICs9IFsgJCh0KS5hY3R1YWxpemUgXSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiBbIFVQREFURV9OT1cgJChqYW0tdGFyZ2V0cykgOiBbIG1vZHVsZXMucGVlayBjb25maWd1cmUgOiAubG9nLWZkIF0KKyAgICAgICAgICAgICAgICAgICAgOiBpZ25vcmUtbWludXMtbiA6IGlnbm9yZS1taW51cy1xIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAkKG5hbWUpICQobGluay1vcHRzWzFdKSA7CisgICAgICAgICAgICAgICAgbmFtZXMtaXRlciA9IDsgbGluay1vcHRzID0gOyAjIGJyZWFrCisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lcy1pdGVyID0gJChuYW1lcy1pdGVyWzItXSkgOworICAgICAgICB9CisgICAgICAgIGxpbmstb3B0cyA9ICQobGluay1vcHRzWzItXSkgOworICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworY2xhc3MgYWMtbGlicmFyeSA6IGJhc2ljLXRhcmdldAoreworICAgIGltcG9ydCBlcnJvcnMgOworICAgIGltcG9ydCBpbmRpcmVjdCA7CisgICAgaW1wb3J0IHZpcnR1YWwtdGFyZ2V0IDsKKyAgICBpbXBvcnQgYWMgOworICAgIGltcG9ydCBjb25maWd1cmUgOworICAgIGltcG9ydCBjb25maWctY2FjaGUgOworCisgICAgcnVsZSBfX2luaXRfXyAoIG5hbWUgOiBwcm9qZWN0IDogcmVxdWlyZW1lbnRzICogOiBpbmNsdWRlLXBhdGggPyA6IGxpYnJhcnktcGF0aCA/IDogbGlicmFyeS1uYW1lID8gKQorICAgIHsKKyAgICAgICAgYmFzaWMtdGFyZ2V0Ll9faW5pdF9fICQobmFtZSkgOiAkKHByb2plY3QpIDogOiAkKHJlcXVpcmVtZW50cykgOworICAgICAgICAKKyAgICAgICAgcmVjb25maWd1cmUgJChpbmNsdWRlLXBhdGgpIDogJChsaWJyYXJ5LXBhdGgpIDogJChsaWJyYXJ5LW5hbWUpIDsgCisgICAgfQorICAgIAorICAgIHJ1bGUgc2V0LWhlYWRlciAoIGhlYWRlciApCisgICAgeworICAgICAgICBzZWxmLmhlYWRlciA9ICQoaGVhZGVyKSA7IAorICAgIH0KKyAgICAgICAgCisgICAgcnVsZSBzZXQtZGVmYXVsdC1uYW1lcyAoIG5hbWVzICsgKQorICAgIHsKKyAgICAgICAgc2VsZi5kZWZhdWx0LW5hbWVzID0gJChuYW1lcykgOworICAgIH0KKworICAgIHJ1bGUgcmVjb25maWd1cmUgKCBpbmNsdWRlLXBhdGggPyA6IGxpYnJhcnktcGF0aCA/IDogbGlicmFyeS1uYW1lID8gKQorICAgIHsKKyAgICAgICAgaWYgJChpbmNsdWRlLXBhdGgpIHx8ICQobGlicmFyeS1wYXRoKSB8fCAkKGxpYnJhcnktbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2stbm90LWNvbmZpZ3VyZWQgOworCisgICAgICAgICAgICBzZWxmLmluY2x1ZGUtcGF0aCA9ICQoaW5jbHVkZS1wYXRoKSA7CisgICAgICAgICAgICBzZWxmLmxpYnJhcnktcGF0aCA9ICQobGlicmFyeS1wYXRoKSA7CisgICAgICAgICAgICBzZWxmLmxpYnJhcnktbmFtZSA9ICQobGlicmFyeS1uYW1lKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBydWxlIHNldC10YXJnZXQgKCB0YXJnZXQgKQorICAgIHsKKyAgICAgICAgY2hlY2stbm90LWNvbmZpZ3VyZWQgOworICAgICAgICBzZWxmLnRhcmdldCA9ICQodGFyZ2V0KSA7CisgICAgfQorCisgICAgcnVsZSBjaGVjay1ub3QtY29uZmlndXJlZCAoICkKKyAgICB7CisgICAgICAgIGlmICQoc2VsZi5pbmNsdWRlLXBhdGgpIHx8ICQoc2VsZi5saWJyYXJ5LXBhdGgpIHx8ICQoc2VsZi5saWJyYXJ5LW5hbWUpIHx8ICQoc2VsZi50YXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9ycy51c2VyLWVycm9yIFsgbmFtZSBdICJpcyBhbHJlYWR5IGNvbmZpZ3VyZWQiIDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBydWxlIGNvbnN0cnVjdCAoIG5hbWUgOiBzb3VyY2VzICogOiBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgaWYgJChzZWxmLnRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFsgJChzZWxmLnRhcmdldCkuZ2VuZXJhdGUgJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgdXNlLWVudmlyb25tZW50IDsKKyAgICAgICAgICAgIGlmICEgJChzZWxmLmxpYnJhcnktbmFtZSkgJiYgISAkKHNlbGYuaW5jbHVkZS1wYXRoKSAmJiAhICQoc2VsZi5saWJyYXJ5LXBhdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNlLWVudmlyb25tZW50ID0gdHJ1ZSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NhbCBsaWJuYW1lcyA9ICQoc2VsZi5saWJyYXJ5LW5hbWUpIDsKKyAgICAgICAgICAgIGlmICEgJChsaWJuYW1lcykgJiYgJCh1c2UtZW52aXJvbm1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlibmFtZXMgPSBbIG1vZHVsZXMucGVlayA6ICQobmFtZTpVKV9OQU1FIF0gOworICAgICAgICAgICAgICAgICMgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5LgorICAgICAgICAgICAgICAgIGxpYm5hbWVzID89IFsgbW9kdWxlcy5wZWVrIDogJChuYW1lOlUpX0JJTkFSWSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpYm5hbWVzID89ICQoc2VsZi5kZWZhdWx0LW5hbWVzKSA7CisKKyAgICAgICAgICAgIGxvY2FsIGluY2x1ZGUtcGF0aCA9ICQoc2VsZi5pbmNsdWRlLXBhdGgpIDsKKyAgICAgICAgICAgIGlmICEgJChpbmNsdWRlLXBhdGgpICYmICQodXNlLWVudmlyb25tZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluY2x1ZGUtcGF0aCA9IFsgbW9kdWxlcy5wZWVrIDogJChuYW1lOlUpX0lOQ0xVREUgXSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvY2FsIGxpYnJhcnktcGF0aCA9ICQoc2VsZi5saWJyYXJ5LXBhdGgpIDsKKyAgICAgICAgICAgIGlmICEgJChsaWJyYXJ5LXBhdGgpICYmICQodXNlLWVudmlyb25tZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpYnJhcnktcGF0aCA9IFsgbW9kdWxlcy5wZWVrIDogJChuYW1lOlUpX0xJQlJBUllfUEFUSCBdIDsKKyAgICAgICAgICAgICAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHkKKyAgICAgICAgICAgICAgICBsaWJyYXJ5LXBhdGggPz0gWyBtb2R1bGVzLnBlZWsgOiAkKG5hbWU6VSlfTElCUEFUSCBdIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9jYWwgdG9vbHNldCA9IFsgJChwcm9wZXJ0eS1zZXQpLmdldCA8dG9vbHNldD4gXSA7CisgICAgICAgICAgICBsb2NhbCB0b29sc2V0LXZlcnNpb24tcHJvcGVydHkgPSAiPHRvb2xzZXQtJCh0b29sc2V0KTp2ZXJzaW9uPiIgOworICAgICAgICAgICAgbG9jYWwgcmVsZXZhbnQgPSBbIHByb3BlcnR5LnNlbGVjdCA8dGFyZ2V0LW9zPiA8dG9vbHNldD4KKyAgICAgICAgICAgICAgICAkKHRvb2xzZXQtdmVyc2lvbi1wcm9wZXJ0eSkgPGxpbms+IDxhZGRyZXNzLW1vZGVsPiA8YXJjaGl0ZWN0dXJlPiA6CisgICAgICAgICAgICAgICAgWyAkKHByb3BlcnR5LXNldCkucmF3IF0gXSA7CisKKyAgICAgICAgICAgIGxvY2FsIGtleSA9IGFjLWxpYnJhcnktJChuYW1lKS0kKHJlbGV2YW50Oko9LSkgOworICAgICAgICAgICAgbG9jYWwgbG9va3VwID0gWyBjb25maWctY2FjaGUuZ2V0ICQoa2V5KSBdIDsKKworICAgICAgICAgICAgaWYgJChsb29rdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgJChsb29rdXApID0gbWlzc2luZworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlLmxvZy1saWJyYXJ5LXNlYXJjaC1yZXN1bHQgJChuYW1lKSA6ICJubyAgKGNhY2hlZCkiIDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgcHJvcGVydHktc2V0LmVtcHR5IF0gOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NhbCBpbmNsdWRlcyA9ICQobG9va3VwWzFdKSA7CisgICAgICAgICAgICAgICAgICAgIGlmICQoaW5jbHVkZXMpID0gJWRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgPSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbG9jYWwgbGlicmFyeSA9IFsgYWMuY29uc3RydWN0LWxpYnJhcnkgJChsb29rdXBbMl0pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFsgJChwcm9wZXJ0eS1zZXQpLnJlZmluZSBbIHByb3BlcnR5LXNldC5jcmVhdGUgJChsb29rdXBbM10pIF0gXSA6ICQobGlicmFyeS1wYXRoKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlLmxvZy1saWJyYXJ5LXNlYXJjaC1yZXN1bHQgJChuYW1lKSA6ICJ5ZXMgKGNhY2hlZCkiIDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgJChsaWJyYXJ5WzFdKS5hZGQtcmF3IDxpbmNsdWRlPiQoaW5jbHVkZXMpIF0gJChsaWJyYXJ5WzItXSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBpbmNsdWRlcyA9IFsgYWMuZmluZC1pbmNsdWRlLXBhdGggJChwcm9wZXJ0eS1zZXQpIDogJChzZWxmLmhlYWRlcikgOiAkKGluY2x1ZGUtcGF0aCkgXSA7CisgICAgICAgICAgICAgICAgbG9jYWwgbGlicmFyeSA9IFsgYWMuZmluZC1saWJyYXJ5ICQocHJvcGVydHktc2V0KSA6ICQobGlibmFtZXMpIDogJChsaWJyYXJ5LXBhdGgpIF0gOworICAgICAgICAgICAgICAgIGlmICQoaW5jbHVkZXMpICYmICQobGlicmFyeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy1jYWNoZS5zZXQgJChrZXkpIDogJChpbmNsdWRlcykgJChsaWJyYXJ5KSA7CisgICAgICAgICAgICAgICAgICAgIGlmICQoaW5jbHVkZXMpID0gJWRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgPSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGlicmFyeSA9IFsgYWMuY29uc3RydWN0LWxpYnJhcnkgJChsaWJyYXJ5WzFdKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBbICQocHJvcGVydHktc2V0KS5yZWZpbmUgWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQobGlicmFyeVsyXSkgXSBdICA6ICQobGlicmFyeS1wYXRoKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlLmxvZy1saWJyYXJ5LXNlYXJjaC1yZXN1bHQgJChuYW1lKSA6ICJ5ZXMiIDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgJChsaWJyYXJ5WzFdKS5hZGQtcmF3IDxpbmNsdWRlPiQoaW5jbHVkZXMpIF0gJChsaWJyYXJ5WzItXSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25maWctY2FjaGUuc2V0ICQoa2V5KSA6IG1pc3NpbmcgOworICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUubG9nLWxpYnJhcnktc2VhcmNoLXJlc3VsdCAkKG5hbWUpIDogIm5vIiA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBbIHByb3BlcnR5LXNldC5lbXB0eSBdIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgCisgICAgfQorfQorCitjbGFzcyBjaGVjay1saWJyYXJ5LXdvcmtlcgoreworICAgIGltcG9ydCBwcm9wZXJ0eS1zZXQgOworICAgIGltcG9ydCB0YXJnZXRzIDsKKyAgICBpbXBvcnQgcHJvcGVydHkgOworCisgICAgcnVsZSBfX2luaXRfXyAoIHRhcmdldCA6IHRydWUtcHJvcGVydGllcyAqIDogZmFsc2UtcHJvcGVydGllcyAqICkKKyAgICB7CisgICAgICAgIHNlbGYudGFyZ2V0ID0gJCh0YXJnZXQpIDsKKyAgICAgICAgc2VsZi50cnVlLXByb3BlcnRpZXMgPSAkKHRydWUtcHJvcGVydGllcykgOworICAgICAgICBzZWxmLmZhbHNlLXByb3BlcnRpZXMgPSAkKGZhbHNlLXByb3BlcnRpZXMpIDsKKyAgICB9CisKKyAgICBydWxlIGNoZWNrICggcHJvcGVydGllcyAqICkKKyAgICB7CisgICAgICAgIGxvY2FsIGNob29zZW4gOworICAgICAgICBsb2NhbCB0ID0gWyB0YXJnZXRzLmN1cnJlbnQgXSA7CisgICAgICAgIGxvY2FsIHAgPSAgWyAkKHQpLnByb2plY3QgXSA7CisgICAgICAgIGxvY2FsIHBzID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQocHJvcGVydGllcykgXSA7CisgICAgICAgIHBzID0gWyAkKHBzKS5wcm9wYWdhdGVkIF0gOworICAgICAgICBsb2NhbCBnZW5lcmF0ZWQgPQorICAgICAgICAgICAgWyB0YXJnZXRzLmdlbmVyYXRlLWZyb20tcmVmZXJlbmNlICQoc2VsZi50YXJnZXQpIDogJChwKSA6ICQocHMpIF0gOworICAgICAgICBpZiAkKGdlbmVyYXRlZFsyXSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hvb3NlbiA9ICQoc2VsZi50cnVlLXByb3BlcnRpZXMpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNob29zZW4gPSAkKHNlbGYuZmFsc2UtcHJvcGVydGllcykgOworICAgICAgICB9CisgICAgICAgIHJldHVybiBbIHByb3BlcnR5LmV2YWx1YXRlLWNvbmRpdGlvbmFscy1pbi1jb250ZXh0ICQoY2hvb3NlbikgOgorICAgICAgICAgICAgJChwcm9wZXJ0aWVzKSBdIDsKKyAgICB9Cit9CisKK3J1bGUgY2hlY2stbGlicmFyeSAoIHRhcmdldCA6IHRydWUtcHJvcGVydGllcyAqIDogZmFsc2UtcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NhbCBpbnN0YW5jZSA9IFsgY2xhc3MubmV3IGNoZWNrLWxpYnJhcnktd29ya2VyICQodGFyZ2V0KSA6CisgICAgICAgICQodHJ1ZS1wcm9wZXJ0aWVzKSA6ICQoZmFsc2UtcHJvcGVydGllcykgXSA7CisgICAgcmV0dXJuIDxjb25kaXRpb25hbD5AJChpbnN0YW5jZSkuY2hlY2sgOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9hbGlhcy5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL2FsaWFzLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWM4Y2I4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9hbGlhcy5qYW0KQEAgLTAsMCArMSw3NCBAQAorIyBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNiBWbGFkaW1pciBQcnVzCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgJ2FsaWFzJyBydWxlIGFuZCB0aGUgYXNzb2NpYXRlZCB0YXJnZXQgY2xhc3MuCisjCisjIEFsaWFzIGlzIGp1c3QgYSBtYWluIHRhcmdldCB3aGljaCByZXR1cm5zIGl0cyBzb3VyY2UgdGFyZ2V0cyB3aXRob3V0IGFueQorIyBwcm9jZXNzaW5nLiBGb3IgZXhhbXBsZToKKyMKKyMgICBhbGlhcyBiaW4gOiBoZWxsbyB0ZXN0X2hlbGxvIDsKKyMgICBhbGlhcyBsaWIgOiBoZWxwZXJzIHhtbF9wYXJzZXIgOworIworIyBBbm90aGVyIGltcG9ydGFudCB1c2Ugb2YgJ2FsaWFzJyBpcyB0byBjb252ZW5pZW50bHkgZ3JvdXAgc291cmNlIGZpbGVzOgorIworIyAgIGFsaWFzIHBsYXRmb3JtLXNyYyA6IHdpbi5jcHAgOiA8b3M+TlQgOworIyAgIGFsaWFzIHBsYXRmb3JtLXNyYyA6IGxpbnV4LmNwcCA6IDxvcz5MSU5VWCA7CisjICAgZXhlIG1haW4gOiBtYWluLmNwcCBwbGF0Zm9ybS1zcmMgOworIworIyBMYXN0bHksIGl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBhIGxvY2FsIGFsaWFzIGZvciBzb21lIHRhcmdldCwgd2l0aCBkaWZmZXJlbnQKKyMgcHJvcGVydGllczoKKyMKKyMgICBhbGlhcyBiaWdfbGliIDogOiBAL2V4dGVybmFsX3Byb2plY3QvYmlnX2xpYi88bGluaz5zdGF0aWMgOworIworCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgcHJvcGVydHktc2V0IDsKK2ltcG9ydCB0YXJnZXRzIDsKKworCitjbGFzcyBhbGlhcy10YXJnZXQtY2xhc3MgOiBiYXNpYy10YXJnZXQKK3sKKyAgICBydWxlIF9faW5pdF9fICggbmFtZSA6IHByb2plY3QgOiBzb3VyY2VzICogOiByZXF1aXJlbWVudHMgKgorICAgICAgICA6IGRlZmF1bHQtYnVpbGQgKiA6IHVzYWdlLXJlcXVpcmVtZW50cyAqICkKKyAgICB7CisgICAgICAgIGJhc2ljLXRhcmdldC5fX2luaXRfXyAkKG5hbWUpIDogJChwcm9qZWN0KSA6ICQoc291cmNlcykgOgorICAgICAgICAgICAgJChyZXF1aXJlbWVudHMpIDogJChkZWZhdWx0LWJ1aWxkKSA6ICQodXNhZ2UtcmVxdWlyZW1lbnRzKSA7CisgICAgfQorCisgICAgcnVsZSBjb25zdHJ1Y3QgKCBuYW1lIDogc291cmNlLXRhcmdldHMgKiA6IHByb3BlcnR5LXNldCApCisgICAgeworICAgICAgICByZXR1cm4gWyBwcm9wZXJ0eS1zZXQuZW1wdHkgXSAkKHNvdXJjZS10YXJnZXRzKSA7CisgICAgfQorCisgICAgcnVsZSBjb21wdXRlLXVzYWdlLXJlcXVpcmVtZW50cyAoIHN1YnZhcmlhbnQgKQorICAgIHsKKyAgICAgICAgbG9jYWwgYmFzZSA9IFsgYmFzaWMtdGFyZ2V0LmNvbXB1dGUtdXNhZ2UtcmVxdWlyZW1lbnRzICQoc3VidmFyaWFudCkgXSA7CisgICAgICAgIHJldHVybiBbICQoYmFzZSkuYWRkIFsgJChzdWJ2YXJpYW50KS5zb3VyY2VzLXVzYWdlLXJlcXVpcmVtZW50cyBdIF0gOworICAgIH0KK30KKworCisjIERlY2xhcmVzIHRoZSAnYWxpYXMnIHRhcmdldC4gSXQgd2lsbCBwcm9jZXNzIGl0cyBzb3VyY2VzIHZpcnR1YWwtdGFyZ2V0cyBieQorIyByZXR1cm5pbmcgdGhlbSB1bmFsdGVyZWQgYXMgaXRzIG93biBjb25zdHJ1Y3RlZCB2aXJ0dWFsLXRhcmdldHMuCisjCitydWxlIGFsaWFzICggbmFtZSA6IHNvdXJjZXMgKiA6IHJlcXVpcmVtZW50cyAqIDogZGVmYXVsdC1idWlsZCAqIDoKKyAgICB1c2FnZS1yZXF1aXJlbWVudHMgKiApCit7CisgICAgbG9jYWwgcHJvamVjdCA9IFsgcHJvamVjdC5jdXJyZW50IF0gOworCisgICAgdGFyZ2V0cy5tYWluLXRhcmdldC1hbHRlcm5hdGl2ZQorICAgICAgICBbIG5ldyBhbGlhcy10YXJnZXQtY2xhc3MgJChuYW1lKSA6ICQocHJvamVjdCkKKyAgICAgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LXNvdXJjZXMgJChzb3VyY2VzKSA6ICQobmFtZSkgOiBuby1yZW5hbWluZyBdCisgICAgICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1yZXF1aXJlbWVudHMgJChyZXF1aXJlbWVudHMpIDogJChwcm9qZWN0KSBdCisgICAgICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1kZWZhdWx0LWJ1aWxkICQoZGVmYXVsdC1idWlsZCkgOiAkKHByb2plY3QpCisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtdXNhZ2UtcmVxdWlyZW1lbnRzICQodXNhZ2UtcmVxdWlyZW1lbnRzKSA6CisgICAgICAgICAgICAgICAgJChwcm9qZWN0KSBdCisgICAgICAgIF0gOworfQorCisKK0lNUE9SVCAkKF9fbmFtZV9fKSA6IGFsaWFzIDogOiBhbGlhcyA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL2J1aWxkLXJlcXVlc3QuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9idWlsZC1yZXF1ZXN0LmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTFiYmI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9idWlsZC1yZXF1ZXN0LmphbQpAQCAtMCwwICsxLDMyMiBAQAorIyBDb3B5cmlnaHQgMjAwMiBEYXZlIEFicmFoYW1zCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgc2VxdWVuY2UgOworaW1wb3J0IHNldCA7CitpbXBvcnQgcmVnZXggOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IHByb3BlcnR5IDsKK2ltcG9ydCBjb250YWluZXIgOworaW1wb3J0IHN0cmluZyA7CisKKworIyBUcmFuc2Zvcm0gcHJvcGVydHktc2V0IGJ5IGFwcGx5aW5nIGYgdG8gZWFjaCBjb21wb25lbnQgcHJvcGVydHkuCisjCitsb2NhbCBydWxlIGFwcGx5LXRvLXByb3BlcnR5LXNldCAoIGYgcHJvcGVydHktc2V0ICkKK3sKKyAgICBsb2NhbCBwcm9wZXJ0aWVzID0gWyBmZWF0dXJlLnNwbGl0ICQocHJvcGVydHktc2V0KSBdIDsKKyAgICByZXR1cm4gWyBzdHJpbmcuam9pbiBbICQoZikgJChwcm9wZXJ0aWVzKSBdIDogLyBdIDsKK30KKworCisjIEV4cGFuZCB0aGUgZ2l2ZW4gYnVpbGQgcmVxdWVzdCBieSBjb21iaW5pbmcgYWxsIHByb3BlcnR5LXNldHMgd2hpY2ggZG8gbm90CisjIHNwZWNpZnkgY29uZmxpY3Rpbmcgbm9uLWZyZWUgZmVhdHVyZXMuIEV4cGVjdHMgYWxsIHRoZSBwcm9qZWN0IGZpbGVzIHRvCisjIGFscmVhZHkgYmUgbG9hZGVkLgorIworcnVsZSBleHBhbmQtbm8tZGVmYXVsdHMgKCBwcm9wZXJ0eS1zZXRzICogKQoreworICAgICMgRmlyc3QgbWFrZSBhbGwgZmVhdHVyZXMgYW5kIHN1YmZlYXR1cmVzIGV4cGxpY2l0LgorICAgIGxvY2FsIGV4cGFuZGVkLXByb3BlcnR5LXNldHMgPSBbIHNlcXVlbmNlLnRyYW5zZm9ybSBhcHBseS10by1wcm9wZXJ0eS1zZXQKKyAgICAgICAgZmVhdHVyZS5leHBhbmQtc3ViZmVhdHVyZXMgOiAkKHByb3BlcnR5LXNldHMpIF0gOworCisgICAgIyBOb3cgY29tYmluZSBhbGwgb2YgdGhlIGV4cGFuZGVkIHByb3BlcnR5LXNldHMKKyAgICBsb2NhbCBwcm9kdWN0ID0gWyB4LXByb2R1Y3QgJChleHBhbmRlZC1wcm9wZXJ0eS1zZXRzKSA6ICQoZmVhdHVyZS1zcGFjZSkgXSA7CisKKyAgICByZXR1cm4gJChwcm9kdWN0KSA7Cit9CisKKworIyBJbXBsZW1lbnRhdGlvbiBvZiB4LXByb2R1Y3QsIGJlbG93LiBFeHBlY3RzIGFsbCB0aGUgcHJvamVjdCBmaWxlcyB0byBhbHJlYWR5CisjIGJlIGxvYWRlZC4KKyMKK2xvY2FsIHJ1bGUgeC1wcm9kdWN0LWF1eCAoIHByb3BlcnR5LXNldHMgKyApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBsb2NhbCBwID0gWyBmZWF0dXJlLnNwbGl0ICQocHJvcGVydHktc2V0c1sxXSkgXSA7CisgICAgbG9jYWwgZiA9IFsgc2V0LmRpZmZlcmVuY2UgJChwOkcpIDogWyBmZWF0dXJlLmZyZWUtZmVhdHVyZXMgXSBdIDsKKyAgICBsb2NhbCBzZWVuIDsKKyAgICAjIE5vIGNvbmZsaWN0IHdpdGggdGhpbmdzIHVzZWQgYXQgYSBoaWdoZXIgbGV2ZWw/CisgICAgaWYgISBbIHNldC5pbnRlcnNlY3Rpb24gJChmKSA6ICQoeC1wcm9kdWN0LXVzZWQpIF0KKyAgICB7CisgICAgICAgIGxvY2FsIHgtcHJvZHVjdC1zZWVuIDsKKyAgICAgICAgeworICAgICAgICAgICAgIyBEbyBub3QgbWl4IGluIGFueSBjb25mbGljdGluZyBmZWF0dXJlcy4KKyAgICAgICAgICAgIGxvY2FsIHgtcHJvZHVjdC11c2VkID0gJCh4LXByb2R1Y3QtdXNlZCkgJChmKSA7CisKKyAgICAgICAgICAgIGlmICQocHJvcGVydHktc2V0c1syXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCByZXN0ID0gWyB4LXByb2R1Y3QtYXV4ICQocHJvcGVydHktc2V0c1syLV0pIDogJChmZWF0dXJlLXNwYWNlKSBdIDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAkKHByb3BlcnR5LXNldHNbMV0pLyQocmVzdCkgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQgPz0gJChwcm9wZXJ0eS1zZXRzWzFdKSA7CisgICAgICAgIH0KKworICAgICAgICAjIElmIHdlIGRpZCBub3QgZW5jb3VudGVyIGEgY29uZmxpY3RpbmcgZmVhdHVyZSBsb3dlciBkb3duLCBkbyBub3QKKyAgICAgICAgIyByZWN1cnNlIGFnYWluLgorICAgICAgICBpZiAhIFsgc2V0LmludGVyc2VjdGlvbiAkKGYpIDogJCh4LXByb2R1Y3Qtc2VlbikgXQorICAgICAgICB7CisgICAgICAgICAgICBwcm9wZXJ0eS1zZXRzID0gOworICAgICAgICB9CisKKyAgICAgICAgc2VlbiA9ICQoeC1wcm9kdWN0LXNlZW4pIDsKKyAgICB9CisKKyAgICBpZiAkKHByb3BlcnR5LXNldHNbMl0pCisgICAgeworICAgICAgICByZXN1bHQgKz0gWyB4LXByb2R1Y3QtYXV4ICQocHJvcGVydHktc2V0c1syLV0pIDogJChmZWF0dXJlLXNwYWNlKSBdIDsKKyAgICB9CisKKyAgICAjIE5vdGUgdGhhdCB3ZSBoYXZlIHNlZW4gdGhlc2UgZmVhdHVyZXMgc28gdGhhdCBoaWdoZXIgbGV2ZWxzIHdpbGwgcmVjdXJzZQorICAgICMgYWdhaW4gd2l0aG91dCB0aGVtIHNldC4KKyAgICB4LXByb2R1Y3Qtc2VlbiArPSAkKGYpICQoc2VlbikgOworICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgUmV0dXJuIHRoZSBjcm9zcy1wcm9kdWN0IG9mIGFsbCBlbGVtZW50cyBvZiBwcm9wZXJ0eS1zZXRzLCBsZXNzIGFueSB0aGF0IHdvdWxkCisjIGNvbnRhaW4gY29uZmxpY3RpbmcgdmFsdWVzIGZvciBzaW5nbGUtdmFsdWVkIGZlYXR1cmVzLiBFeHBlY3RzIGFsbCB0aGUgcHJvamVjdAorIyBmaWxlcyB0byBhbHJlYWR5IGJlIGxvYWRlZC4KKyMKK2xvY2FsIHJ1bGUgeC1wcm9kdWN0ICggcHJvcGVydHktc2V0cyAqICkKK3sKKyAgICBpZiAkKHByb3BlcnR5LXNldHMpLm5vbi1lbXB0eQorICAgIHsKKyAgICAgICAgIyBQcmVwYXJlIHNvbWUgInNjb3BlZCBnbG9iYWxzIiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAjIGZ1bmN0aW9uLCB4LXByb2R1Y3QtYXV4LgorICAgICAgICBsb2NhbCB4LXByb2R1Y3Qtc2VlbiB4LXByb2R1Y3QtdXNlZCA7CisgICAgICAgIHJldHVybiBbIHgtcHJvZHVjdC1hdXggJChwcm9wZXJ0eS1zZXRzKSA6ICQoZmVhdHVyZS1zcGFjZSkgXSA7CisgICAgfQorICAgICMgT3RoZXJ3aXNlIHJldHVybiBlbXB0eS4KK30KKworCisjIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgJ3YnIG9yIHRoZSBwYXJ0IG9mICd2JyBiZWZvcmUgdGhlIGZpcnN0ICctJyBzeW1ib2wgaXMKKyMgYW4gaW1wbGljaXQgdmFsdWUuIEV4cGVjdHMgYWxsIHRoZSBwcm9qZWN0IGZpbGVzIHRvIGFscmVhZHkgYmUgbG9hZGVkLgorIworbG9jYWwgcnVsZSBsb29rcy1saWtlLWltcGxpY2l0LXZhbHVlICggdiApCit7CisgICAgaWYgWyBmZWF0dXJlLmlzLWltcGxpY2l0LXZhbHVlICQodikgXQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWUgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsb2NhbCBzcGxpdCA9IFsgcmVnZXguc3BsaXQgJCh2KSAtIF0gOworICAgICAgICBpZiBbIGZlYXR1cmUuaXMtaW1wbGljaXQtdmFsdWUgJChzcGxpdFsxXSkgXQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyBUYWtlcyB0aGUgY29tbWFuZCBsaW5lIHRva2VucyAoc3VjaCBhcyB0YWtlbiBmcm9tIHRoZSBBUkdWIHJ1bGUpIGFuZAorIyBjb25zdHJ1Y3RzIGEgYnVpbGQgcmVxdWVzdCBmcm9tIHRoZW0uIFJldHVybnMgYSB2ZWN0b3Igb2YgdHdvIHZlY3RvcnMgKHdoZXJlCisjICJ2ZWN0b3IiIG1lYW5zIGNvbnRhaW5lci5qYW0ncyAidmVjdG9yIikuIEZpcnN0IGlzIHRoZSBzZXQgb2YgdGFyZ2V0cworIyBzcGVjaWZpZWQgaW4gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHNlY29uZCBpcyB0aGUgc2V0IG9mIHJlcXVlc3RlZCBidWlsZAorIyBwcm9wZXJ0aWVzLiBFeHBlY3RzIGFsbCB0aGUgcHJvamVjdCBmaWxlcyB0byBhbHJlYWR5IGJlIGxvYWRlZC4KKyMKK3J1bGUgZnJvbS1jb21tYW5kLWxpbmUgKCBjb21tYW5kLWxpbmUgKiApCit7CisgICAgbG9jYWwgdGFyZ2V0cyA7CisgICAgbG9jYWwgcHJvcGVydGllcyA7CisKKyAgICBjb21tYW5kLWxpbmUgPSAkKGNvbW1hbmQtbGluZVsyLV0pIDsKKyAgICBsb2NhbCBza2lwLW5leHQgPSA7CisgICAgZm9yIGxvY2FsIGUgaW4gJChjb21tYW5kLWxpbmUpCisgICAgeworICAgICAgICBpZiAkKHNraXAtbmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcC1uZXh0ID0gOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgISBbIE1BVENIIF4oLSkgOiAkKGUpIF0KKyAgICAgICAgeworICAgICAgICAgICAgIyBCdWlsZCByZXF1ZXN0IHNwZWMgZWl0aGVyIGhhcyAiPSIgaW4gaXQgb3IgY29tcGxldGVseSBjb25zaXN0cyBvZgorICAgICAgICAgICAgIyBpbXBsaWNpdCBmZWF0dXJlIHZhbHVlcy4KKyAgICAgICAgICAgIGxvY2FsIGZzID0gZmVhdHVyZS1zcGFjZSA7CisgICAgICAgICAgICBpZiBbIE1BVENIICIoLio9LiopIiA6ICQoZSkgXQorICAgICAgICAgICAgICAgIHx8IFsgbG9va3MtbGlrZS1pbXBsaWNpdC12YWx1ZSAkKGU6RD0pIDogJChmZWF0dXJlLXNwYWNlKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvcGVydGllcyArPSBbIGNvbnZlcnQtY29tbWFuZC1saW5lLWVsZW1lbnQgJChlKSA6CisgICAgICAgICAgICAgICAgICAgICQoZmVhdHVyZS1zcGFjZSkgXSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICQoZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRzICs9ICQoZSkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgWyBNQVRDSCAiXigtWy1sZGpmc3RvXSkkIiA6ICQoZSkgXQorICAgICAgICB7CisgICAgICAgICAgICBza2lwLW5leHQgPSB0cnVlIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gWyBuZXcgdmVjdG9yCisgICAgICAgIFsgbmV3IHZlY3RvciAkKHRhcmdldHMpIF0KKyAgICAgICAgWyBuZXcgdmVjdG9yICQocHJvcGVydGllcykgXSBdIDsKK30KKworCisjIENvbnZlcnRzIG9uZSBlbGVtZW50IG9mIGNvbW1hbmQgbGluZSBidWlsZCByZXF1ZXN0IHNwZWNpZmljYXRpb24gaW50byBpbnRlcm5hbAorIyBmb3JtLiBFeHBlY3RzIGFsbCB0aGUgcHJvamVjdCBmaWxlcyB0byBhbHJlYWR5IGJlIGxvYWRlZC4KKyMKK2xvY2FsIHJ1bGUgY29udmVydC1jb21tYW5kLWxpbmUtZWxlbWVudCAoIGUgKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgbG9jYWwgcGFydHMgPSBbIHJlZ2V4LnNwbGl0ICQoZSkgIi8iIF0gOworICAgIHdoaWxlICQocGFydHMpCisgICAgeworICAgICAgICBsb2NhbCBwID0gJChwYXJ0c1sxXSkgOworICAgICAgICBsb2NhbCBtID0gWyBNQVRDSCAiKFtePV0qKT0oLiopIiA6ICQocCkgXSA7CisgICAgICAgIGxvY2FsIGxyZXN1bHQgOworICAgICAgICBsb2NhbCBmZWF0dXJlIDsKKyAgICAgICAgbG9jYWwgdmFsdWVzIDsKKyAgICAgICAgaWYgJChtKQorICAgICAgICB7CisgICAgICAgICAgICBmZWF0dXJlID0gJChtWzFdKSA7CisgICAgICAgICAgICB2YWx1ZXMgPSBbIHJlZ2V4LnNwbGl0ICQobVsyXSkgIiwiIF0gOworICAgICAgICAgICAgbHJlc3VsdCA9IDwkKGZlYXR1cmUpPiQodmFsdWVzKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBscmVzdWx0ID0gWyByZWdleC5zcGxpdCAkKHApICIsIiBdIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICQoZmVhdHVyZSkgJiYgZnJlZSBpbiBbIGZlYXR1cmUuYXR0cmlidXRlcyA8JChmZWF0dXJlKT4gXQorICAgICAgICB7CisgICAgICAgICAgICAjIElmIHdlIGhhdmUgZnJlZSBmZWF0dXJlLCB0aGVuIHRoZSB2YWx1ZSBpcyBldmVyeXRoaW5nCisgICAgICAgICAgICAjIHVudGlsIHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgbGluZSB0b2tlbi4gU2xhc2hlcyBpbgorICAgICAgICAgICAgIyB0aGUgZm9sbG93aW5nIHN0cmluZyBhcmUgbm90IHRha2VkIHRvIG1lYW4gc2VwYXJhdGlvbgorICAgICAgICAgICAgIyBvZiBwcm9wZXJ0aWVzLiBDb21tYXMgYXJlIGFsc28gbm90IGludGVycHJldGVkIHNwZWNpYWxseS4KKyAgICAgICAgICAgIHZhbHVlcyA9ICQodmFsdWVzOko9LCkgOworICAgICAgICAgICAgdmFsdWVzID0gJCh2YWx1ZXMpICQocGFydHNbMi1dKSA7CisgICAgICAgICAgICB2YWx1ZXMgPSAkKHZhbHVlczpKPS8pIDsKKyAgICAgICAgICAgIGxyZXN1bHQgPSA8JChmZWF0dXJlKT4kKHZhbHVlcykgOworICAgICAgICAgICAgcGFydHMgPSA7CisgICAgICAgIH0KKworICAgICAgICBpZiAhIFsgTUFUQ0ggKC4qLS4qKSA6ICQocCkgXQorICAgICAgICB7CisgICAgICAgICAgICAjIHByb3BlcnR5LnZhbGlkYXRlIGNhbm5vdCBoYW5kbGUgc3ViZmVhdHVyZXMsIHNvIHdlIGF2b2lkIHRoZSBjaGVjaworICAgICAgICAgICAgIyBoZXJlLgorICAgICAgICAgICAgZm9yIGxvY2FsIHAgaW4gJChscmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb3BlcnR5LnZhbGlkYXRlICQocCkgOiAkKGZlYXR1cmUtc3BhY2UpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICEgJChyZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICQobHJlc3VsdCkgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gJChyZXN1bHQpLyQobHJlc3VsdCkgOworICAgICAgICB9CisKKyAgICAgICAgcGFydHMgPSAkKHBhcnRzWzItXSkgOworICAgIH0KKworICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKK3J1bGUgX190ZXN0X18gKCApCit7CisgICAgaW1wb3J0IGFzc2VydCA7CisgICAgaW1wb3J0IGZlYXR1cmUgOworCisgICAgZmVhdHVyZS5wcmVwYXJlLXRlc3QgYnVpbGQtcmVxdWVzdC10ZXN0LXRlbXAgOworCisgICAgaW1wb3J0IGJ1aWxkLXJlcXVlc3QgOworICAgIGltcG9ydCBidWlsZC1yZXF1ZXN0IDogZXhwYW5kLW5vLWRlZmF1bHRzIDogYnVpbGQtcmVxdWVzdC5leHBhbmQtbm8tZGVmYXVsdHMgOworICAgIGltcG9ydCBlcnJvcnMgOiB0cnkgY2F0Y2ggOworICAgIGltcG9ydCBmZWF0dXJlIDogZmVhdHVyZSBzdWJmZWF0dXJlIDsKKworICAgIGZlYXR1cmUgdG9vbHNldCA6IGdjYyBtc3ZjIGJvcmxhbmQgOiBpbXBsaWNpdCA7CisgICAgc3ViZmVhdHVyZSB0b29sc2V0IGdjYyA6IHZlcnNpb24gOiAyLjk1LjIgMi45NS4zIDIuOTUuNAorICAgICAgMy4wIDMuMC4xIDMuMC4yIDogb3B0aW9uYWwgOworCisgICAgZmVhdHVyZSB2YXJpYW50IDogZGVidWcgcmVsZWFzZSA6IGltcGxpY2l0IGNvbXBvc2l0ZSA7CisgICAgZmVhdHVyZSBpbmxpbmluZyA6IG9uIG9mZiA7CisgICAgZmVhdHVyZSAiaW5jbHVkZSIgOiA6IGZyZWUgOworCisgICAgZmVhdHVyZSBzdGRsaWIgOiBuYXRpdmUgc3RscG9ydCA6IGltcGxpY2l0IDsKKworICAgIGZlYXR1cmUgcnVudGltZS1saW5rIDogZHluYW1pYyBzdGF0aWMgOiBzeW1tZXRyaWMgOworCisgICAgIyBFbXB0eSBidWlsZCByZXF1ZXN0cyBzaG91bGQgZXhwYW5kIHRvIGVtcHR5LgorICAgIGFzc2VydC5yZXN1bHQKKyAgICAgICAgOiBidWlsZC1yZXF1ZXN0LmV4cGFuZC1uby1kZWZhdWx0cyA7CisKKyAgICBhc3NlcnQucmVzdWx0CisgICAgICAgIDx0b29sc2V0PmdjYy88dG9vbHNldC1nY2M6dmVyc2lvbj4zLjAuMS88c3RkbGliPnN0bHBvcnQvPHZhcmlhbnQ+ZGVidWcKKyAgICAgICAgPHRvb2xzZXQ+bXN2Yy88c3RkbGliPnN0bHBvcnQvPHZhcmlhbnQ+ZGVidWcKKyAgICAgICAgPHRvb2xzZXQ+bXN2Yy88dmFyaWFudD5kZWJ1ZworICAgICAgICA6IGJ1aWxkLXJlcXVlc3QuZXhwYW5kLW5vLWRlZmF1bHRzIGdjYy0zLjAuMS9zdGxwb3J0IG1zdmMvc3RscG9ydCBtc3ZjIGRlYnVnIDsKKworICAgIGFzc2VydC5yZXN1bHQKKyAgICAgICAgPHRvb2xzZXQ+Z2NjLzx0b29sc2V0LWdjYzp2ZXJzaW9uPjMuMC4xLzxzdGRsaWI+c3RscG9ydC88dmFyaWFudD5kZWJ1ZworICAgICAgICA8dG9vbHNldD5tc3ZjLzx2YXJpYW50PmRlYnVnCisgICAgICAgIDx2YXJpYW50PmRlYnVnLzx0b29sc2V0Pm1zdmMvPHN0ZGxpYj5zdGxwb3J0CisgICAgICAgIDogYnVpbGQtcmVxdWVzdC5leHBhbmQtbm8tZGVmYXVsdHMgZ2NjLTMuMC4xL3N0bHBvcnQgbXN2YyBkZWJ1ZyBtc3ZjL3N0bHBvcnQgOworCisgICAgYXNzZXJ0LnJlc3VsdAorICAgICAgICA8dG9vbHNldD5nY2MvPHRvb2xzZXQtZ2NjOnZlcnNpb24+My4wLjEvPHN0ZGxpYj5zdGxwb3J0Lzx2YXJpYW50PmRlYnVnLzxpbmxpbmluZz5vZmYKKyAgICAgICAgPHRvb2xzZXQ+Z2NjLzx0b29sc2V0LWdjYzp2ZXJzaW9uPjMuMC4xLzxzdGRsaWI+c3RscG9ydC88dmFyaWFudD5yZWxlYXNlLzxpbmxpbmluZz5vZmYKKyAgICAgICAgOiBidWlsZC1yZXF1ZXN0LmV4cGFuZC1uby1kZWZhdWx0cyBnY2MtMy4wLjEvc3RscG9ydCBkZWJ1ZyByZWxlYXNlIDxpbmxpbmluZz5vZmYgOworCisgICAgYXNzZXJ0LnJlc3VsdAorICAgICAgICA8aW5jbHVkZT5hL2IvYy88dG9vbHNldD5nY2MvPHRvb2xzZXQtZ2NjOnZlcnNpb24+My4wLjEvPHN0ZGxpYj5zdGxwb3J0Lzx2YXJpYW50PmRlYnVnLzxpbmNsdWRlPngveS96CisgICAgICAgIDxpbmNsdWRlPmEvYi9jLzx0b29sc2V0Pm1zdmMvPHN0ZGxpYj5zdGxwb3J0Lzx2YXJpYW50PmRlYnVnLzxpbmNsdWRlPngveS96CisgICAgICAgIDxpbmNsdWRlPmEvYi9jLzx0b29sc2V0Pm1zdmMvPHZhcmlhbnQ+ZGVidWcvPGluY2x1ZGU+eC95L3oKKyAgICAgICAgOiBidWlsZC1yZXF1ZXN0LmV4cGFuZC1uby1kZWZhdWx0cyA8aW5jbHVkZT5hL2IvYyBnY2MtMy4wLjEvc3RscG9ydCBtc3ZjL3N0bHBvcnQgbXN2YyBkZWJ1ZyAgPGluY2x1ZGU+eC95L3ogOworCisgICAgbG9jYWwgciA7CisKKyAgICByID0gWyBidWlsZC1yZXF1ZXN0LmZyb20tY29tbWFuZC1saW5lIGJqYW0gZGVidWcgcnVudGltZS1saW5rPWR5bmFtaWMgXSA7CisgICAgYXNzZXJ0LmVxdWFsIFsgJChyKS5nZXQtYXQgMSBdIDogOworICAgIGFzc2VydC5lcXVhbCBbICQocikuZ2V0LWF0IDIgXSA6IGRlYnVnIDxydW50aW1lLWxpbms+ZHluYW1pYyA7CisKKyAgICB0cnkgOworICAgIHsKKyAgICAgICAgYnVpbGQtcmVxdWVzdC5mcm9tLWNvbW1hbmQtbGluZSBiamFtIGdjYy9kZWJ1ZyBydW50aW1lLWxpbms9ZHluYW1pYy9zdGF0aWMgOworICAgIH0KKyAgICBjYXRjaCBcInN0YXRpY1wiIGlzIG5vdCBhbiBpbXBsaWNpdCBmZWF0dXJlIHZhbHVlIDsKKworICAgIHIgPSBbIGJ1aWxkLXJlcXVlc3QuZnJvbS1jb21tYW5kLWxpbmUgYmphbSAtZDIgLS1kZWJ1ZyBkZWJ1ZyB0YXJnZXQgcnVudGltZS1saW5rPWR5bmFtaWMgXSA7CisgICAgYXNzZXJ0LmVxdWFsIFsgJChyKS5nZXQtYXQgMSBdIDogdGFyZ2V0IDsKKyAgICBhc3NlcnQuZXF1YWwgWyAkKHIpLmdldC1hdCAyIF0gOiBkZWJ1ZyA8cnVudGltZS1saW5rPmR5bmFtaWMgOworCisgICAgciA9IFsgYnVpbGQtcmVxdWVzdC5mcm9tLWNvbW1hbmQtbGluZSBiamFtIGRlYnVnIHJ1bnRpbWUtbGluaz1keW5hbWljLHN0YXRpYyBdIDsKKyAgICBhc3NlcnQuZXF1YWwgWyAkKHIpLmdldC1hdCAxIF0gOiA7CisgICAgYXNzZXJ0LmVxdWFsIFsgJChyKS5nZXQtYXQgMiBdIDogZGVidWcgPHJ1bnRpbWUtbGluaz5keW5hbWljIDxydW50aW1lLWxpbms+c3RhdGljIDsKKworICAgIHIgPSBbIGJ1aWxkLXJlcXVlc3QuZnJvbS1jb21tYW5kLWxpbmUgYmphbSBkZWJ1ZyBnY2MvcnVudGltZS1saW5rPWR5bmFtaWMsc3RhdGljIF0gOworICAgIGFzc2VydC5lcXVhbCBbICQocikuZ2V0LWF0IDEgXSA6IDsKKyAgICBhc3NlcnQuZXF1YWwgWyAkKHIpLmdldC1hdCAyIF0gOiBkZWJ1ZyBnY2MvPHJ1bnRpbWUtbGluaz5keW5hbWljCisgICAgICAgIGdjYy88cnVudGltZS1saW5rPnN0YXRpYyA7CisKKyAgICByID0gWyBidWlsZC1yZXF1ZXN0LmZyb20tY29tbWFuZC1saW5lIGJqYW0gbXN2YyBnY2MsYm9ybGFuZC9ydW50aW1lLWxpbms9c3RhdGljIF0gOworICAgIGFzc2VydC5lcXVhbCBbICQocikuZ2V0LWF0IDEgXSA6IDsKKyAgICBhc3NlcnQuZXF1YWwgWyAkKHIpLmdldC1hdCAyIF0gOiBtc3ZjIGdjYy88cnVudGltZS1saW5rPnN0YXRpYworICAgICAgICBib3JsYW5kLzxydW50aW1lLWxpbms+c3RhdGljIDsKKworICAgIHIgPSBbIGJ1aWxkLXJlcXVlc3QuZnJvbS1jb21tYW5kLWxpbmUgYmphbSBnY2MtMy4wIF0gOworICAgIGFzc2VydC5lcXVhbCBbICQocikuZ2V0LWF0IDEgXSA6IDsKKyAgICBhc3NlcnQuZXF1YWwgWyAkKHIpLmdldC1hdCAyIF0gOiBnY2MtMy4wIDsKKworICAgIGZlYXR1cmUuZmluaXNoLXRlc3QgYnVpbGQtcmVxdWVzdC10ZXN0LXRlbXAgOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9jb25maWctY2FjaGUuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9jb25maWctY2FjaGUuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTdkYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL2NvbmZpZy1jYWNoZS5qYW0KQEAgLTAsMCArMSw2NCBAQAorIyBDb3B5cmlnaHQgMjAxMiBTdGV2ZW4gV2F0YW5hYmUKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2ltcG9ydCBtb2R1bGVzIDsKK2ltcG9ydCBlcnJvcnMgOworaW1wb3J0IHJlZ2V4IDsKK2ltcG9ydCBwYXRoIDsKK2ltcG9ydCBwcm9qZWN0IDsKKworcnVsZSBnZXQgKCBuYW1lICkKK3sKKyAgICByZXR1cm4gJCgudmFycy4kKG5hbWUpKSA7Cit9CisKK3J1bGUgc2V0ICggbmFtZSA6IHZhbHVlICogKQoreworICAgIC5hbGwtdmFycyArPSAkKG5hbWUpIDsKKyAgICAudmFycy4kKG5hbWUpID0gJCh2YWx1ZSkgOworfQorCitydWxlIHNhdmUgKCApCit7CisgICAgaWYgJCguY2FjaGUtZmlsZSkKKyAgICB7CisgICAgICAgIGxvY2FsIGNhY2hlLWZpbGUtbmF0aXZlID0gWyBwYXRoLm5hdGl2ZSAkKC5jYWNoZS1maWxlKSBdIDsKKyAgICAgICAgbG9jYWwgdGFyZ2V0ID0gPG5ldy1jYWNoZS1maWxlPiQoY2FjaGUtZmlsZS1uYXRpdmUpIDsKKyAgICAgICAgbG9jYWwgY29udGVudHMgPSAiIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBCb29zdC5CdWlsZC5cbiMgRG8gbm90IGVkaXQuXG5cbm1vZHVsZSBjb25maWctY2FjaGUge1xuIiA7CisgICAgICAgIGZvciBsb2NhbCB2YXIgaW4gJCguYWxsLXZhcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHRyYW5zZm9ybWVkIDsKKyAgICAgICAgICAgIGZvciBsb2NhbCB2YWx1ZSBpbiAkKC52YXJzLiQodmFyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCArPSBbIHJlZ2V4LmVzY2FwZSAkKHZhbHVlKSA6IFwiXFwgOiBcXCBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2FsIHF1b3RlZCA9IFwiJCh0cmFuc2Zvcm1lZClcIiA7CisgICAgICAgICAgICBjb250ZW50cyArPSAiICBzZXQgXCIkKHZhcilcIiA6ICQocXVvdGVkOko9ICkgO1xuIiA7CisgICAgICAgIH0KKyAgICAgICAgY29udGVudHMgKz0gIn1cbiIgOworICAgICAgICBGSUxFX0NPTlRFTlRTIG9uICQodGFyZ2V0KSA9ICQoY29udGVudHMpIDsKKyAgICAgICAgQUxXQVlTICQodGFyZ2V0KSA7CisgICAgICAgIGNvbmZpZy1jYWNoZS53cml0ZSAkKHRhcmdldCkgOworICAgICAgICBVUERBVEVfTk9XICQodGFyZ2V0KSA6IFsgbW9kdWxlcy5wZWVrIGNvbmZpZ3VyZSA6IC5sb2ctZmQgXSA6IGlnbm9yZS1taW51cy1uIDsKKyAgICB9Cit9CisKK2FjdGlvbnMgd3JpdGUKK3sKKyAgICBAKCQoU1RET1VUKTpFPSQoRklMRV9DT05URU5UUzpKPSkpID4gIiQoPCkiCit9CisKK3J1bGUgbG9hZCAoIGNhY2hlLWZpbGUgKQoreworICAgIGlmICQoLmNhY2hlLWZpbGUpCisgICAgeworICAgICAgICBlcnJvcnMuZXJyb3IgZHVwbGljYXRlIGxvYWQgb2YgY2FjaGUgZmlsZSA7CisgICAgfQorICAgIGNhY2hlLWZpbGUgPSBbIHBhdGgubmF0aXZlICQoY2FjaGUtZmlsZSkgXSA7CisgICAgaWYgWyBwYXRoLmV4aXN0cyAkKGNhY2hlLWZpbGUpIF0gJiYgISAoIC0tcmVjb25maWd1cmUgaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0gKQorICAgIHsKKyAgICAgICAgaW5jbHVkZSA8b2xkLWNhY2hlLWZpbGU+JChjYWNoZS1maWxlKSA7CisgICAgfQorICAgIC5jYWNoZS1maWxlID0gJChjYWNoZS1maWxlKSA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL2NvbmZpZ3VyZS5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL2NvbmZpZ3VyZS5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiODFiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvY29uZmlndXJlLmphbQpAQCAtMCwwICsxLDI4MSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTAgVmxhZGltaXIgUHJ1cy4KKyMKKyMgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorIyBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgVGhpcyBtb2R1bGUgZGVmaW5lcyBmdW5jdGlvbiB0byBoZWxwIHdpdGggdHdvIG1haW4gdGFza3M6CisjCisjIC0gRGlzY292ZXJpbmcgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uIGZvciB0aGUgcHVycG9zZXMgb2YgYWRqdXN0aW5nIHRoZSBidWlsZAorIyAgIHByb2Nlc3MuCisjIC0gUmVwb3J0aW5nIHdoYXQgaXMgYnVpbHQsIGFuZCBob3cgaXQgaXMgY29uZmlndXJlZC4KKworaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworaW1wb3J0IGNvbW1vbiA7CitpbXBvcnQgcGF0aCA7CitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IHByb3BlcnR5LXNldCA7CitpbXBvcnQgdGFyZ2V0cyA7CitpbXBvcnQgY29uZmlnLWNhY2hlIDsKKworCitydWxlIGxvZy1zdW1tYXJ5ICggKQoreworfQorCisKKy53aWR0aCA9IDMwIDsKKworcnVsZSBzZXQtd2lkdGggKCB3aWR0aCApCit7CisgICAgLndpZHRoID0gJCh3aWR0aCkgOworfQorCisKKyMgRGVjbGFyZSB0aGF0IHRoZSBjb21wb25lbnRzIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyIGV4aXN0LgorIworcnVsZSByZWdpc3Rlci1jb21wb25lbnRzICggY29tcG9uZW50cyAqICkKK3sKKyAgICAuY29tcG9uZW50cyArPSAkKGNvbXBvbmVudHMpIDsKK30KKworCisjIERlY2xhcmUgdGhhdCB0aGUgY29tcG9uZW50cyBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBidWlsdC4KKyMKK3J1bGUgY29tcG9uZW50cy1idWlsZGluZyAoIGNvbXBvbmVudHMgKiApCit7CisgICAgLmJ1aWx0LWNvbXBvbmVudHMgKz0gJChjb21wb25lbnRzKSA7Cit9CisKKworIyBSZXBvcnQgc29tZXRoaW5nIGFib3V0IGNvbXBvbmVudCBjb25maWd1cmF0aW9uIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJldHRlcgorIyBrbm93LgorIworcnVsZSBsb2ctY29tcG9uZW50LWNvbmZpZ3VyYXRpb24gKCBjb21wb25lbnQgOiBtZXNzYWdlICkKK3sKKyAgICAjIEZJWE1FOiBJbXBsZW1lbnQgcGVyLXByb3BlcnR5LXNldCBsb2dzLgorICAgIC5jb21wb25lbnQtbG9ncy4kKGNvbXBvbmVudCkgKz0gJChtZXNzYWdlKSA7Cit9CisKKworcnVsZSBsb2ctY2hlY2stcmVzdWx0ICggcmVzdWx0ICkKK3sKKyAgICBpZiAhICQoLmFubm91bmNlZC1jaGVja3MpCisgICAgeworICAgICAgICBFQ0hPICJQZXJmb3JtaW5nIGNvbmZpZ3VyYXRpb24gY2hlY2tzXG4iIDsKKyAgICAgICAgLmFubm91bmNlZC1jaGVja3MgPSAxIDsKKyAgICB9CisKKyAgICBFQ0hPICQocmVzdWx0KSA7CisgICAgIyBGSVhNRTogVW5maW5pc2hlZCBjb2RlLiBOb3RoaW5nIHNlZW1zIHRvIHNldCAuY2hlY2stcmVzdWx0cyBhdCB0aGUgbW9tZW50LgorICAgICMuY2hlY2stcmVzdWx0cyArPSAkKHJlc3VsdCkgOworfQorCisKK3J1bGUgbG9nLWxpYnJhcnktc2VhcmNoLXJlc3VsdCAoIGxpYnJhcnkgOiByZXN1bHQgKQoreworICAgIGxvY2FsIHggPSBbIFBBRCAiICAgIC0gJChsaWJyYXJ5KSIgOiAkKC53aWR0aCkgXSA7CisgICAgbG9nLWNoZWNrLXJlc3VsdCAiJCh4KSA6ICQocmVzdWx0KSIgOworfQorCisKK3J1bGUgcHJpbnQtY29tcG9uZW50LWNvbmZpZ3VyYXRpb24gKCApCit7CisgICAgIyBGSVhNRTogU2VlIHdoYXQgd2FzIGludGVuZGVkIHdpdGggdGhpcyBpbml0aWFsIGFzc2lnbm1lbnQuCisgICAgIyBsb2NhbCBjID0gWyBzZXF1ZW5jZS51bmlxdWUgJCguY29tcG9uZW50cykgXSA7CisKKyAgICBFQ0hPICJcbkNvbXBvbmVudCBjb25maWd1cmF0aW9uOlxuIiA7CisgICAgbG9jYWwgYyA7CisgICAgZm9yIGMgaW4gJCguY29tcG9uZW50cykKKyAgICB7CisgICAgICAgIGxvY2FsIHMgOworICAgICAgICBpZiAkKGMpIGluICQoLmJ1aWx0LWNvbXBvbmVudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHMgPSAiYnVpbGRpbmciIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHMgPSAibm90IGJ1aWxkaW5nIiA7CisgICAgICAgIH0KKyAgICAgICAgRUNITyBbIFBBRCAiICAgIC0gJChjKSIgOiAkKC53aWR0aCkgXSAiOiAkKHMpIiA7CisgICAgICAgIGZvciBsb2NhbCBtIGluICQoLmNvbXBvbmVudC1sb2dzLiQoYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gIiAgICAgICAgLSIgJChtKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgRUNITyA7Cit9CisKKworcnVsZSBwcmludC1jb25maWd1cmUtY2hlY2tzLXN1bW1hcnkgKCApCit7CisgICAgIyBGSVhNRTogVGhlIHByb2JsZW0gd2l0aCB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgdGhlIHVzZXIgc2VlcyB0aGUgY2hlY2tzCisgICAgIyBzdW1tYXJ5IHdoZW4gYWxsIGNoZWNrcyBhcmUgZG9uZSwgYW5kIGhhcyBubyBwcm9ncmVzcyByZXBvcnRpbmcgd2hpbGUgdGhlCisgICAgIyBjaGVja3MgYXJlIGJlaW5nIGV4ZWN1dGVkLgorICAgIGlmICQoLmNoZWNrLXJlc3VsdHMpCisgICAgeworICAgICAgICBFQ0hPICJDb25maWd1cmF0aW9uIGNoZWNrcyBzdW1tYXJ5XG4iIDsKKyAgICAgICAgZm9yIGxvY2FsIHIgaW4gJCguY2hlY2stcmVzdWx0cykKKyAgICAgICAgeworICAgICAgICAgICAgRUNITyAkKHIpIDsKKyAgICAgICAgfQorICAgICAgICBFQ0hPIDsKKyAgICB9Cit9CisKKworIyBBdHRlbXB0IHRvIGJ1aWxkIGEgbWV0YXRhcmdldCBuYW1lZCBieSAnbWV0YXRhcmdldC1yZWZlcmVuY2UnIGluIGNvbnRleHQgb2YKKyMgJ3Byb2plY3QnIHdpdGggcHJvcGVydGllcyAncHMnLiBSZXR1cm5zIG5vbi1lbXB0eSB2YWx1ZSBpZiBidWlsZCBpcyBPSy4KKyMKK3J1bGUgYnVpbGRzLXJhdyAoIG1ldGF0YXJnZXQtcmVmZXJlbmNlIDogcHJvamVjdCA6IHBzIDogd2hhdCA6IHJldHJ5ID8gKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisKKyAgICBpZiAhICQocmV0cnkpICYmICEgJCguJCh3aGF0KS10ZXN0ZWQuJChwcykpCisgICAgeworICAgICAgICAuJCh3aGF0KS10ZXN0ZWQuJChwcykgPSB0cnVlIDsKKworICAgICAgICBsb2NhbCBjYWNoZS1uYW1lID0gJCh3aGF0KSBbICQocHMpLnJhdyBdIDsKKyAgICAgICAgY2FjaGUtbmFtZSA9ICQoY2FjaGUtbmFtZTpKPS0pIDsKKyAgICAgICAgbG9jYWwgdmFsdWUgPSBbIGNvbmZpZy1jYWNoZS5nZXQgJChjYWNoZS1uYW1lKSBdIDsKKyAgICAgICAgCisgICAgICAgIGxvY2FsIHRhcmdldHMgPSBbIHRhcmdldHMuZ2VuZXJhdGUtZnJvbS1yZWZlcmVuY2UgCisgICAgICAgICAgICAkKG1ldGF0YXJnZXQtcmVmZXJlbmNlKSA6ICQocHJvamVjdCkgOiAkKHBzKSBdIDsKKworICAgICAgICBsb2NhbCBqYW0tdGFyZ2V0cyA7CisgICAgICAgIGZvciBsb2NhbCB0IGluICQodGFyZ2V0c1syLV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGphbS10YXJnZXRzICs9IFsgJCh0KS5hY3R1YWxpemUgXSA7CisgICAgICAgIH0KKyAgICAgICAgICAgICAKKyAgICAgICAgaWYgJCh2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgeCA9IFsgUEFEICIgICAgLSAkKHdoYXQpIiA6ICQoLndpZHRoKSBdIDsgCisgICAgICAgICAgICBpZiAkKHZhbHVlKSA9IHRydWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAuJCh3aGF0KS1zdXBwb3J0ZWQuJChwcykgPSB5ZXMgOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUgOworICAgICAgICAgICAgICAgIGxvZy1jaGVjay1yZXN1bHQgIiQoeCkgOiB5ZXMgKGNhY2hlZCkiIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2ctY2hlY2stcmVzdWx0ICIkKHgpIDogbm8gIChjYWNoZWQpIiA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgCisgICAgICAgIGVsc2UgaWYgISBVUERBVEVfTk9XIGluIFsgUlVMRU5BTUVTIF0KKyAgICAgICAgeworICAgICAgICAgICAgIyBDYW5ub3QgZGV0ZXJtaW5lLiBBc3N1bWUgZXhpc3RhbmNlLgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgeCA9IFsgUEFEICIgICAgLSAkKHdoYXQpIiA6ICQoLndpZHRoKSBdIDsKKyAgICAgICAgICAgIGlmIFsgVVBEQVRFX05PVyAkKGphbS10YXJnZXRzKSA6CisgICAgICAgICAgICAgICAgICQoLmxvZy1mZCkgOiBpZ25vcmUtbWludXMtbiA6IGlnbm9yZS1taW51cy1xIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAuJCh3aGF0KS1zdXBwb3J0ZWQuJChwcykgPSB5ZXMgOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUgOworICAgICAgICAgICAgICAgIGxvZy1jaGVjay1yZXN1bHQgIiQoeCkgOiB5ZXMiIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2ctY2hlY2stcmVzdWx0ICIkKHgpIDogbm8iIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAhICQodmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQocmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZy1jYWNoZS5zZXQgJChjYWNoZS1uYW1lKSA6IHRydWUgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZy1jYWNoZS5zZXQgJChjYWNoZS1uYW1lKSA6IGZhbHNlIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gJCguJCh3aGF0KS1zdXBwb3J0ZWQuJChwcykpIDsKKyAgICB9Cit9CisKK3J1bGUgYnVpbGRzICggbWV0YXRhcmdldC1yZWZlcmVuY2UgOiBwcm9wZXJ0aWVzICogOiB3aGF0ID8gOiByZXRyeSA/ICkKK3sKKyAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgaGFyZGNvZGVkLiBPdGhlciBjaGVja3MgbWlnaHQgd2FudCB0byBjb25zaWRlciBhCisgICAgIyBkaWZmZXJlbnQgc2V0IG9mIGZlYXR1cmVzIGFzIHJlbGV2YW50LgorICAgIGxvY2FsIHRvb2xzZXQgPSBbIHByb3BlcnR5LnNlbGVjdCA8dG9vbHNldD4gOiAkKHByb3BlcnRpZXMpIF0gOworICAgIGxvY2FsIHRvb2xzZXQtdmVyc2lvbi1wcm9wZXJ0eSA9ICI8dG9vbHNldC0kKHRvb2xzZXQ6Rz0pOnZlcnNpb24+IiA7CisgICAgbG9jYWwgcmVsZXZhbnQgPSBbIHByb3BlcnR5LnNlbGVjdCA8dGFyZ2V0LW9zPiA8dG9vbHNldD4KKyAgICAgICAgJCh0b29sc2V0LXZlcnNpb24tcHJvcGVydHkpIDxhZGRyZXNzLW1vZGVsPiA8YXJjaGl0ZWN0dXJlPiA6CisgICAgICAgICQocHJvcGVydGllcykgXSA7CisgICAgbG9jYWwgcHMgPSBbIHByb3BlcnR5LXNldC5jcmVhdGUgJChyZWxldmFudCkgXSA7CisgICAgbG9jYWwgdCA9IFsgdGFyZ2V0cy5jdXJyZW50IF0gOworICAgIGxvY2FsIHAgPSBbICQodCkucHJvamVjdCBdIDsKKworICAgIGlmICEgJCh3aGF0KQorICAgIHsKKyAgICAgICAgbG9jYWwgcmVzb2x2ZWQgPSBbIHRhcmdldHMucmVzb2x2ZS1yZWZlcmVuY2UgJChtZXRhdGFyZ2V0LXJlZmVyZW5jZSkgOiAkKHApIF0gOworICAgICAgICBsb2NhbCBuYW1lID0gWyAkKHJlc29sdmVkWzFdKS5uYW1lIF0gOworICAgICAgICB3aGF0ID0gIiQobmFtZSkgYnVpbGRzIiA7CisgICAgfQorCisgICAgcmV0dXJuIFsgYnVpbGRzLXJhdyAkKG1ldGF0YXJnZXQtcmVmZXJlbmNlKSA6ICQocCkgOiAkKHBzKSA6ICQod2hhdCkgOgorICAgICAgICAkKHJldHJ5KSBdIDsKK30KKworCisjIENhbGxlZCBieSBCb29zdC5CdWlsZCBzdGFydHVwIGNvZGUgdG8gc3BlY2lmeSB0aGUgZmlsZSB0byByZWNlaXZlIHRoZQorIyBjb25maWd1cmF0aW9uIGNoZWNrIHJlc3VsdHMuIFNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnkgdXNlciBjb2RlLgorIworcnVsZSBzZXQtbG9nLWZpbGUgKCBsb2ctZmlsZSApCit7CisgICAgcGF0aC5tYWtlZGlycyBbIHBhdGgucGFyZW50ICQobG9nLWZpbGUpIF0gOworICAgIC5sb2ctZmQgPSBbIEZJTEVfT1BFTiAkKGxvZy1maWxlKSA6ICJ3IiBdIDsKK30KKworCisjIEZyb250ZW5kIHJ1bGVzCisKK2NsYXNzIGNoZWNrLXRhcmdldC1idWlsZHMtd29ya2VyCit7CisgICAgaW1wb3J0IGNvbmZpZ3VyZSA7CisgICAgaW1wb3J0IHByb3BlcnR5LXNldCA7CisgICAgaW1wb3J0IHRhcmdldHMgOworICAgIGltcG9ydCBwcm9wZXJ0eSA7CisKKyAgICBydWxlIF9faW5pdF9fICggdGFyZ2V0IG1lc3NhZ2UgPyA6IHRydWUtcHJvcGVydGllcyAqIDogZmFsc2UtcHJvcGVydGllcyAqICkKKyAgICB7CisgICAgICAgIHNlbGYudGFyZ2V0ID0gJCh0YXJnZXQpIDsKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gJChtZXNzYWdlKSA7CisgICAgICAgIHNlbGYudHJ1ZS1wcm9wZXJ0aWVzID0gJCh0cnVlLXByb3BlcnRpZXMpIDsKKyAgICAgICAgc2VsZi5mYWxzZS1wcm9wZXJ0aWVzID0gJChmYWxzZS1wcm9wZXJ0aWVzKSA7CisgICAgfQorCisgICAgcnVsZSBjaGVjayAoIHByb3BlcnRpZXMgKiApCisgICAgeworICAgICAgICBsb2NhbCBjaG9vc2VuIDsKKyAgICAgICAgaWYgWyBjb25maWd1cmUuYnVpbGRzICQoc2VsZi50YXJnZXQpIDogJChwcm9wZXJ0aWVzKSA6ICQoc2VsZi5tZXNzYWdlKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGNob29zZW4gPSAkKHNlbGYudHJ1ZS1wcm9wZXJ0aWVzKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjaG9vc2VuID0gJChzZWxmLmZhbHNlLXByb3BlcnRpZXMpIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gWyBwcm9wZXJ0eS5ldmFsdWF0ZS1jb25kaXRpb25hbHMtaW4tY29udGV4dCAkKGNob29zZW4pIDoKKyAgICAgICAgICAgICQocHJvcGVydGllcykgXSA7CisgICAgfQorfQorCisKK3J1bGUgY2hlY2stdGFyZ2V0LWJ1aWxkcyAoIHRhcmdldCBtZXNzYWdlID8gOiB0cnVlLXByb3BlcnRpZXMgKiA6CisgICAgZmFsc2UtcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NhbCBpbnN0YW5jZSA9IFsgbmV3IGNoZWNrLXRhcmdldC1idWlsZHMtd29ya2VyICQodGFyZ2V0KSAkKG1lc3NhZ2UpIDoKKyAgICAgICAgJCh0cnVlLXByb3BlcnRpZXMpIDogJChmYWxzZS1wcm9wZXJ0aWVzKSBdIDsKKyAgICByZXR1cm4gPGNvbmRpdGlvbmFsPkAkKGluc3RhbmNlKS5jaGVjayA7Cit9CisKKworSU1QT1JUICQoX19uYW1lX18pIDogY2hlY2stdGFyZ2V0LWJ1aWxkcyA6ICA6IGNoZWNrLXRhcmdldC1idWlsZHMgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9mZWF0dXJlLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvZmVhdHVyZS5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2YWJjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvZmVhdHVyZS5qYW0KQEAgLTAsMCArMSwxMzUwIEBACisjIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAzIERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDYgUmVuZSBSaXZlcmEKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgYXNzZXJ0IDogKiA7CitpbXBvcnQgImNsYXNzIiA6ICogOworaW1wb3J0IGluZGlyZWN0IDsKK2ltcG9ydCBtb2R1bGVzIDsKK2ltcG9ydCByZWdleCA7CitpbXBvcnQgc2VxdWVuY2UgOworaW1wb3J0IHNldCA7CitpbXBvcnQgdXRpbGl0eSA7CisKKworbG9jYWwgcnVsZSBzZXR1cCAoICkKK3sKKyAgICAuYWxsLWF0dHJpYnV0ZXMgPQorICAgICAgICBpbXBsaWNpdAorICAgICAgICBjb21wb3NpdGUKKyAgICAgICAgb3B0aW9uYWwKKyAgICAgICAgc3ltbWV0cmljCisgICAgICAgIGZyZWUKKyAgICAgICAgaW5jaWRlbnRhbAorICAgICAgICBwYXRoCisgICAgICAgIGRlcGVuZGVuY3kKKyAgICAgICAgcHJvcGFnYXRlZAorICAgICAgICBsaW5rLWluY29tcGF0aWJsZQorICAgICAgICBzdWJmZWF0dXJlCisgICAgICAgIG9yZGVyLXNlbnNpdGl2ZQorICAgIDsKKworICAgIC5hbGwtZmVhdHVyZXMgPSA7CisgICAgLmFsbC1zdWJmZWF0dXJlcyA9IDsKKyAgICAuYWxsLXRvcC1mZWF0dXJlcyA9IDsgICMgbm9uLXN1YmZlYXR1cmVzCisgICAgLmFsbC1pbXBsaWNpdC12YWx1ZXMgPSA7Cit9CitzZXR1cCA7CisKKworIyBQcmVwYXJlIGEgZnJlc2ggc3BhY2UgdG8gdGVzdCBpbiBieSBtb3ZpbmcgYWxsIGdsb2JhbCB2YXJpYWJsZSBzZXR0aW5ncyBpbnRvCisjIHRoZSBnaXZlbiB0ZW1wb3JhcnkgbW9kdWxlIGFuZCBlcmFzaW5nIHRoZW0gaGVyZS4KKyMKK3J1bGUgcHJlcGFyZS10ZXN0ICggdGVtcC1tb2R1bGUgKQoreworICAgIERFTEVURV9NT0RVTEUgJCh0ZW1wLW1vZHVsZSkgOworCisgICAgIyBUcmFuc2ZlciBnbG9iYWxzIHRvIHRlbXAtbW9kdWxlLgorICAgIGZvciBsb2NhbCB2IGluIFsgVkFSTkFNRVMgZmVhdHVyZSBdCisgICAgeworICAgICAgICBpZiBbIE1BVENIIChcXC4pIDogJCh2KSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZHVsZXMucG9rZSAkKHRlbXAtbW9kdWxlKSA6ICQodikgOiAkKCQodikpIDsKKyAgICAgICAgICAgICQodikgPSA7CisgICAgICAgIH0KKyAgICB9CisgICAgc2V0dXAgOworfQorCisKKyMgQ2xlYXIgb3V0IGFsbCBnbG9iYWwgdmFyaWFibGVzIGFuZCByZWNvdmVyIGFsbCB2YXJpYWJsZXMgZnJvbSB0aGUgZ2l2ZW4KKyMgdGVtcG9yYXJ5IG1vZHVsZS4KKyMKK3J1bGUgZmluaXNoLXRlc3QgKCB0ZW1wLW1vZHVsZSApCit7CisgICAgIyBDbGVhciBnbG9iYWxzLgorICAgIGZvciBsb2NhbCB2IGluIFsgVkFSTkFNRVMgZmVhdHVyZSBdCisgICAgeworICAgICAgICBpZiBbIE1BVENIIChcXC4pIDogJCh2KSBdCisgICAgICAgIHsKKyAgICAgICAgICAgICQodikgPSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgbG9jYWwgdiBpbiBbIFZBUk5BTUVTICQodGVtcC1tb2R1bGUpIF0KKyAgICB7CisgICAgICAgICQodikgPSBbIG1vZHVsZXMucGVlayAkKHRlbXAtbW9kdWxlKSA6ICQodikgXSA7CisgICAgfQorICAgIERFTEVURV9NT0RVTEUgJCh0ZW1wLW1vZHVsZSkgOworfQorCisKKyMgVHJhbnNmb3JtIGZlYXR1cmVzIGJ5IGJyYWNrZXRpbmcgYW55IGVsZW1lbnRzIHdoaWNoIGFyZSBub3QgYWxyZWFkeSBicmFja2V0ZWQKKyMgYnkgIjw+Ii4KKyMKK2xvY2FsIHJ1bGUgZ3Jpc3QgKCBmZWF0dXJlcyAqICkKK3sKKyAgICBsb2NhbCBlbXB0eSA9ICIiIDsKKyAgICByZXR1cm4gJChlbXB0eTpHPSQoZmVhdHVyZXMpKSA7Cit9CisKKworIyBEZWNsYXJlIGEgbmV3IGZlYXR1cmUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdmFsdWVzLCBhbmQgYXR0cmlidXRlcy4KKyMKK3J1bGUgZmVhdHVyZSAoCisgICAgICBuYW1lICAgICAgICAgICMgRmVhdHVyZSBuYW1lLgorICAgIDogdmFsdWVzICogICAgICAjIEFsbG93YWJsZSB2YWx1ZXMgLSBtYXkgYmUgZXh0ZW5kZWQgbGF0ZXIgdXNpbmcgZmVhdHVyZS5leHRlbmQuCisgICAgOiBhdHRyaWJ1dGVzICogICMgRmVhdHVyZSBhdHRyaWJ1dGVzIChlLmcuIGltcGxpY2l0LCBmcmVlLCBwcm9wYWdhdGVkLi4uKS4KKykKK3sKKyAgICBuYW1lID0gWyBncmlzdCAkKG5hbWUpIF0gOworCisgICAgbG9jYWwgZXJyb3IgOworCisgICAgIyBDaGVjayBmb3IgYW55IHVua25vd24gYXR0cmlidXRlcy4KKyAgICBpZiAhICggJChhdHRyaWJ1dGVzKSBpbiAkKC5hbGwtYXR0cmlidXRlcykgKQorICAgIHsKKyAgICAgICAgZXJyb3IgPSB1bmtub3duIGF0dHJpYnV0ZXM6CisgICAgICAgICAgICBbIHNldC5kaWZmZXJlbmNlICQoYXR0cmlidXRlcykgOiAkKC5hbGwtYXR0cmlidXRlcykgXSA7CisgICAgfQorICAgIGVsc2UgaWYgJChuYW1lKSBpbiAkKC5hbGwtZmVhdHVyZXMpCisgICAgeworICAgICAgICBlcnJvciA9IGZlYXR1cmUgYWxyZWFkeSBkZWZpbmVkOiA7CisgICAgfQorICAgIGVsc2UgaWYgaW1wbGljaXQgaW4gJChhdHRyaWJ1dGVzKSAmJiBmcmVlIGluICQoYXR0cmlidXRlcykKKyAgICB7CisgICAgICAgIGVycm9yID0gZnJlZSBmZWF0dXJlcyBjYW5ub3QgYWxzbyBiZSBpbXBsaWNpdCA7CisgICAgfQorICAgIGVsc2UgaWYgZnJlZSBpbiAkKGF0dHJpYnV0ZXMpICYmIHByb3BhZ2F0ZWQgaW4gJChhdHRyaWJ1dGVzKQorICAgIHsKKyAgICAgICAgZXJyb3IgPSBmcmVlIGZlYXR1cmVzIGNhbm5vdCBiZSBwcm9wYWdhdGVkIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbG9jYWwgbSA9IFsgTUFUQ0ggKC4qPS4qKSA6ICQodmFsdWVzKSBdIDsKKyAgICAgICAgaWYgJChtWzFdKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvciA9ICJmZWF0dXJlIHZhbHVlIG1heSBub3QgY29udGFpbiAnPSciIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICQoZXJyb3IpCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgZXJyb3JzLmVycm9yICQoZXJyb3IpCisgICAgICAgICAgICAgIDogImluIiBmZWF0dXJlIGRlY2xhcmF0aW9uOgorICAgICAgICAgICAgICA6IGZlYXR1cmUgWyBlcnJvcnMubG9sLT5saXN0ICQoMSkgOiAkKDIpIDogJCgzKSBdIDsKKyAgICB9CisKKyAgICAkKG5hbWUpLnZhbHVlcyA/PSA7CisgICAgJChuYW1lKS5hdHRyaWJ1dGVzID0gJChhdHRyaWJ1dGVzKSA7CisgICAgJChuYW1lKS5zdWJmZWF0dXJlcyA/PSA7CisgICAgJChhdHRyaWJ1dGVzKS5mZWF0dXJlcyArPSAkKG5hbWUpIDsKKworICAgIC5hbGwtZmVhdHVyZXMgKz0gJChuYW1lKSA7CisgICAgaWYgc3ViZmVhdHVyZSBpbiAkKGF0dHJpYnV0ZXMpCisgICAgeworICAgICAgICAuYWxsLXN1YmZlYXR1cmVzICs9ICQobmFtZSkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAuYWxsLXRvcC1mZWF0dXJlcyArPSAkKG5hbWUpIDsKKyAgICB9CisgICAgZXh0ZW5kICQobmFtZSkgOiAkKHZhbHVlcykgOworfQorCisKKyMgU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmVhdHVyZSwgb3ZlcnJpZGluZyBhbnkgcHJldmlvdXMgZGVmYXVsdC4KKyMKK3J1bGUgc2V0LWRlZmF1bHQgKCBmZWF0dXJlIDogdmFsdWUgKQoreworICAgIGxvY2FsIGYgPSBbIGdyaXN0ICQoZmVhdHVyZSkgXSA7CisgICAgbG9jYWwgYSA9ICQoJChmKS5hdHRyaWJ1dGVzKSA7CisgICAgbG9jYWwgYmFkLWF0dHJpYnV0ZSA9IDsKKyAgICBpZiBmcmVlIGluICQoYSkKKyAgICB7CisgICAgICAgIGJhZC1hdHRyaWJ1dGUgPSBmcmVlIDsKKyAgICB9CisgICAgZWxzZSBpZiBvcHRpb25hbCBpbiAkKGEpCisgICAgeworICAgICAgICBiYWQtYXR0cmlidXRlID0gb3B0aW9uYWwgOworICAgIH0KKyAgICBpZiAkKGJhZC1hdHRyaWJ1dGUpCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgZXJyb3JzLmVycm9yICQoYmFkLWF0dHJpYnV0ZSkgcHJvcGVydHkgJChmKSBjYW5ub3QgaGF2ZSBhIGRlZmF1bHQuIDsKKyAgICB9CisgICAgaWYgISAkKHZhbHVlKSBpbiAkKCQoZikudmFsdWVzKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciBUaGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUsICckKHZhbHVlKScgaXMgaW52YWxpZCA6CisgICAgICAgICAgICBhbGxvd2VkIHZhbHVlcyBhcmU6ICQoJChmKS52YWx1ZXMpIDsKKyAgICB9CisgICAgJChmKS5kZWZhdWx0ID0gJCh2YWx1ZSkgOworfQorCisKKyMgUmV0dXJucyB0aGUgZGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBmZWF0dXJlcy4KKyMKK3J1bGUgZGVmYXVsdHMgKCBmZWF0dXJlcyAqICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGZvciBsb2NhbCBmIGluICQoZmVhdHVyZXMpCisgICAgeworICAgICAgICBsb2NhbCBnZiA9ICQoOkU9Okc9JChmKSkgOworICAgICAgICBsb2NhbCBhID0gJCgkKGdmKS5hdHRyaWJ1dGVzKSA7CisgICAgICAgIGlmICggZnJlZSBpbiAkKGEpICkgfHwgKCBvcHRpb25hbCBpbiAkKGEpICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICQoZ2YpJCgkKGdmKS5kZWZhdWx0KSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBSZXR1cm5zIHRydWUgaWZmIGFsbCAnbmFtZXMnIGVsZW1lbnRzIGFyZSB2YWxpZCBmZWF0dXJlcy4KKyMKK3J1bGUgdmFsaWQgKCBuYW1lcyArICkKK3sKKyAgICBpZiAkKG5hbWVzKSBpbiAkKC5hbGwtZmVhdHVyZXMpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgfQorfQorCisKKyMgUmV0dXJucyB0aGUgYXR0aWJ1dGVzIG9mIHRoZSBnaXZlbiBmZWF0dXJlLgorIworcnVsZSBhdHRyaWJ1dGVzICggZmVhdHVyZSApCit7CisgICAgcmV0dXJuICQoJChmZWF0dXJlKS5hdHRyaWJ1dGVzKSA7Cit9CisKKworIyBSZXR1cm5zIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGZlYXR1cmUuCisjCitydWxlIHZhbHVlcyAoIGZlYXR1cmUgKQoreworICAgIHJldHVybiAkKCQoOkU9Okc9JChmZWF0dXJlKSkudmFsdWVzKSA7Cit9CisKKworIyBSZXR1cm5zIHRydWUgaWZmICd2YWx1ZS1zdHJpbmcnIGlzIGEgdmFsdWUtc3RyaW5nIG9mIGFuIGltcGxpY2l0IGZlYXR1cmUuCisjCitydWxlIGlzLWltcGxpY2l0LXZhbHVlICggdmFsdWUtc3RyaW5nICkKK3sKKyAgICBsb2NhbCB2ID0gWyByZWdleC5zcGxpdCAkKHZhbHVlLXN0cmluZykgLSBdIDsKKyAgICBsb2NhbCBmYWlsZWQgOworICAgIGlmICEgJCh2WzFdKSBpbiAkKC5hbGwtaW1wbGljaXQtdmFsdWVzKQorICAgIHsKKyAgICAgICAgZmFpbGVkID0gdHJ1ZSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxvY2FsIGZlYXR1cmUgPSAkKCQodlsxXSkuaW1wbGljaXQtZmVhdHVyZSkgOworICAgICAgICBmb3IgbG9jYWwgc3VidmFsdWUgaW4gJCh2WzItXSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgISBbIGZpbmQtaW1wbGllZC1zdWJmZWF0dXJlICQoZmVhdHVyZSkgJChzdWJ2YWx1ZSkgOiAkKHZbMV0pIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICEgJChmYWlsZWQpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgfQorfQorCisKKyMgUmV0dXJucyB0aGUgaW1wbGljaXQgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGltcGxpY2l0IHZhbHVlLgorIworcnVsZSBpbXBsaWVkLWZlYXR1cmUgKCBpbXBsaWNpdC12YWx1ZSApCit7CisgICAgbG9jYWwgY29tcG9uZW50cyA9IFsgcmVnZXguc3BsaXQgJChpbXBsaWNpdC12YWx1ZSkgIi0iIF0gOworICAgIGxvY2FsIGZlYXR1cmUgPSAkKCQoY29tcG9uZW50c1sxXSkuaW1wbGljaXQtZmVhdHVyZSkgOworICAgIGlmICEgJChmZWF0dXJlKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciBcIiQoaW1wbGljaXQtdmFsdWUpXCIgaXMgbm90IGFuIGltcGxpY2l0IGZlYXR1cmUgdmFsdWUgOworICAgICAgICBmZWF0dXJlID0gIiIgOyAgIyBLZWVwIHRlc3RpbmcgaGFwcHk7IGl0IGV4cGVjdHMgYSByZXN1bHQuCisgICAgfQorICAgIHJldHVybiAkKGZlYXR1cmUpIDsKK30KKworCitsb2NhbCBydWxlIGZpbmQtaW1wbGllZC1zdWJmZWF0dXJlICggZmVhdHVyZSBzdWJ2YWx1ZSA6IHZhbHVlLXN0cmluZyA/ICkKK3sKKyAgICAjIEZlYXR1cmUgc2hvdWxkIGJlIG9mIHRoZSBmb3JtIDxmZWF0dXJlLW5hbWU+LgorICAgIGlmICQoZmVhdHVyZSkgIT0gJChmZWF0dXJlOkcpCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgZXJyb3JzLmVycm9yIGludmFsaWQgZmVhdHVyZSAkKGZlYXR1cmUpIDsKKyAgICB9CisgICAgcmV0dXJuICQoJChmZWF0dXJlKSQodmFsdWUtc3RyaW5nOkU9IiIpPD4kKHN1YnZhbHVlKS5zdWJmZWF0dXJlKSA7Cit9CisKKworIyBHaXZlbiBhIGZlYXR1cmUgYW5kIGEgdmFsdWUgb2Ygb25lIG9mIGl0cyBzdWJmZWF0dXJlcywgZmluZCB0aGUgbmFtZSBvZiB0aGUKKyMgc3ViZmVhdHVyZS4gSWYgdmFsdWUtc3RyaW5nIGlzIHN1cHBsaWVkLCBsb29rcyBmb3IgaW1wbGllZCBzdWJmZWF0dXJlcyB0aGF0CisjIGFyZSBzcGVjaWZpYyB0byB0aGF0IHZhbHVlIG9mIGZlYXR1cmUKKyMKK3J1bGUgaW1wbGllZC1zdWJmZWF0dXJlICgKKyAgICAgIGZlYXR1cmUgICAgICAgICAjIFRoZSBtYWluIGZlYXR1cmUgbmFtZS4KKyAgICAgIHN1YnZhbHVlICAgICAgICAjIFRoZSB2YWx1ZSBvZiBvbmUgb2YgaXRzIHN1YmZlYXR1cmVzLgorICAgIDogdmFsdWUtc3RyaW5nID8gICMgVGhlIHZhbHVlIG9mIHRoZSBtYWluIGZlYXR1cmUuCispCit7CisgICAgbG9jYWwgc3ViZmVhdHVyZSA9IFsgZmluZC1pbXBsaWVkLXN1YmZlYXR1cmUgJChmZWF0dXJlKSAkKHN1YnZhbHVlKQorICAgICAgICA6ICQodmFsdWUtc3RyaW5nKSBdIDsKKyAgICBpZiAhICQoc3ViZmVhdHVyZSkKKyAgICB7CisgICAgICAgIHZhbHVlLXN0cmluZyA/PSAiIiA7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgXCIkKHN1YnZhbHVlKVwiIGlzIG5vdCBhIGtub3duIHN1YmZlYXR1cmUgdmFsdWUgb2YKKyAgICAgICAgICAgICQoZmVhdHVyZSkkKHZhbHVlLXN0cmluZykgOworICAgIH0KKyAgICByZXR1cm4gJChzdWJmZWF0dXJlKSA7Cit9CisKKworIyBHZW5lcmF0ZSBhbiBlcnJvciBpZiB0aGUgZmVhdHVyZSBpcyB1bmtub3duLgorIworbG9jYWwgcnVsZSB2YWxpZGF0ZS1mZWF0dXJlICggZmVhdHVyZSApCit7CisgICAgaWYgISAkKGZlYXR1cmUpIGluICQoLmFsbC1mZWF0dXJlcykKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgdW5rbm93biBmZWF0dXJlIFwiJChmZWF0dXJlKVwiIDsKKyAgICB9Cit9CisKKworIyBHaXZlbiBhIGZlYXR1cmUgYW5kIGl0cyB2YWx1ZSBvciBqdXN0IGEgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbiBpbXBsaWNpdAorIyBmZWF0dXJlLCByZXR1cm5zIGEgcHJvcGVydHkgc2V0IGNvbnNpc3Rpbmcgb2YgYWxsIGNvbXBvbmVudCBzdWJmZWF0dXJlcyBhbmQKKyMgdGhlaXIgdmFsdWVzLiBGb3IgZXhhbXBsZSBhbGwgdGhlIGZvbGxvd2luZyBjYWxsczoKKyMKKyMgICBleHBhbmQtc3ViZmVhdHVyZXMtYXV4IDx0b29sc2V0PmdjYy0yLjk1LjItbGludXgteDg2CisjICAgZXhwYW5kLXN1YmZlYXR1cmVzLWF1eCBnY2MtMi45NS4yLWxpbnV4LXg4NgorIworIyByZXR1cm46CisjCisjICAgPHRvb2xzZXQ+Z2NjIDx0b29sc2V0LXZlcnNpb24+Mi45NS4yIDx0b29sc2V0LW9zPmxpbnV4IDx0b29sc2V0LWNwdT54ODYKKyMKK2xvY2FsIHJ1bGUgZXhwYW5kLXN1YmZlYXR1cmVzLWF1eCAoCisgICAgICBmZWF0dXJlID8gICAgICAgICMgRmVhdHVyZSBuYW1lIG9yIGVtcHR5IGlmIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGFuCisgICAgICAgICAgICAgICAgICAgICAgICMgaW1wbGljaXQgcHJvcGVydHkuCisgICAgOiB2YWx1ZSAgICAgICAgICAgICMgRmVhdHVyZSB2YWx1ZS4KKyAgICA6IGRvbnQtdmFsaWRhdGUgPyAgIyBJZiBzZXQsIG5vIHZhbHVlIHN0cmluZyB2YWxpZGF0aW9uIHdpbGwgYmUgZG9uZS4KKykKK3sKKyAgICBpZiAkKGZlYXR1cmUpCisgICAgeworICAgICAgICBmZWF0dXJlID0gJChmZWF0dXJlKSA7CisgICAgfQorCisgICAgaWYgISAkKGZlYXR1cmUpCisgICAgeworICAgICAgICBmZWF0dXJlID0gWyBpbXBsaWVkLWZlYXR1cmUgJCh2YWx1ZSkgXSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZhbGlkYXRlLWZlYXR1cmUgJChmZWF0dXJlKSA7CisgICAgfQorICAgIGlmICEgJChkb250LXZhbGlkYXRlKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGUtdmFsdWUtc3RyaW5nICQoZmVhdHVyZSkgJCh2YWx1ZSkgOworICAgIH0KKworICAgIGxvY2FsIGNvbXBvbmVudHMgPSBbIHJlZ2V4LnNwbGl0ICQodmFsdWUpICItIiBdIDsKKworICAgICMgR2V0IHRoZSB0b3AtbGV2ZWwgZmVhdHVyZSdzIHZhbHVlLgorICAgIGxvY2FsIHZhbHVlID0gJChjb21wb25lbnRzWzFdOkc9KSA7CisKKyAgICBsb2NhbCByZXN1bHQgPSAkKGNvbXBvbmVudHNbMV06Rz0kKGZlYXR1cmUpKSA7CisKKyAgICBsb2NhbCBzdWJ2YWx1ZXMgPSAkKGNvbXBvbmVudHNbMi1dKSA7CisgICAgd2hpbGUgJChzdWJ2YWx1ZXMpCisgICAgeworICAgICAgICBsb2NhbCBzdWJ2YWx1ZSA9ICQoc3VidmFsdWVzWzFdKSA7ICAjIFBvcCB0aGUgaGVhZCBvZmYgb2Ygc3VidmFsdWVzLgorICAgICAgICBzdWJ2YWx1ZXMgPSAkKHN1YnZhbHVlc1syLV0pIDsKKworICAgICAgICBsb2NhbCBzdWJmZWF0dXJlID0gWyBmaW5kLWltcGxpZWQtc3ViZmVhdHVyZSAkKGZlYXR1cmUpICQoc3VidmFsdWUpIDoKKyAgICAgICAgICAgICQodmFsdWUpIF0gOworCisgICAgICAgICMgSWYgbm8gc3ViZmVhdHVyZSB3YXMgZm91bmQgcmVjb25zdGl0dXRlIHRoZSB2YWx1ZSBzdHJpbmcgYW5kIHVzZSB0aGF0LgorICAgICAgICBpZiAhICQoc3ViZmVhdHVyZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gJChjb21wb25lbnRzOko9LSkgOworICAgICAgICAgICAgcmVzdWx0ID0gJChyZXN1bHQ6Rz0kKGZlYXR1cmUpKSA7CisgICAgICAgICAgICBzdWJ2YWx1ZXMgPSA7ICAjIFN0b3AgbG9vcGluZy4KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGYgPSBbIE1BVENIIF48KC4qKT4kIDogJChmZWF0dXJlKSBdIDsKKyAgICAgICAgICAgIHJlc3VsdCArPSAkKHN1YnZhbHVlOkc9JChmKS0kKHN1YmZlYXR1cmUpKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIE1ha2UgYWxsIGVsZW1lbnRzIG9mIHByb3BlcnRpZXMgY29ycmVzcG9uZGluZyB0byBpbXBsaWNpdCBmZWF0dXJlcyBleHBsaWNpdCwKKyMgYW5kIGV4cHJlc3MgYWxsIHN1YmZlYXR1cmUgdmFsdWVzIGFzIHNlcGFyYXRlIHByb3BlcnRpZXMgaW4gdGhlaXIgb3duIHJpZ2h0LgorIyBGb3IgZXhhbXBsZSwgYWxsIG9mIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcworIworIyAgICBnY2MtMi45NS4yLWxpbnV4LXg4NgorIyAgICA8dG9vbHNldD5nY2MtMi45NS4yLWxpbnV4LXg4NgorIworIyBtaWdodCBleHBhbmQgdG8KKyMKKyMgICA8dG9vbHNldD5nY2MgPHRvb2xzZXQtdmVyc2lvbj4yLjk1LjIgPHRvb2xzZXQtb3M+bGludXggPHRvb2xzZXQtY3B1Png4NgorIworcnVsZSBleHBhbmQtc3ViZmVhdHVyZXMgKAorICAgIHByb3BlcnRpZXMgKiAgICAgICAjIFByb3BlcnR5IHNldCB3aXRoIGVsZW1lbnRzIG9mIHRoZSBmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICMgPGZlYXR1cmU+dmFsdWUtc3RyaW5nIG9yIGp1c3QgdmFsdWUtc3RyaW5nIGluIHRoZSBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICMgb2YgaW1wbGljaXQgZmVhdHVyZXMuCisgICAgOiBkb250LXZhbGlkYXRlID8KKykKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGZvciBsb2NhbCBwIGluICQocHJvcGVydGllcykKKyAgICB7CisgICAgICAgICMgRG9uJ3QgZXhwYW5kIHN1YmZlYXR1cmVzIGluIHN1YmZlYXR1cmVzCisgICAgICAgIGlmICEgWyBNQVRDSCAiKDopIiA6ICQocDpHKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSBbIGV4cGFuZC1zdWJmZWF0dXJlcy1hdXggJChwOkcpIDogJChwOkc9KSA6ICQoZG9udC12YWxpZGF0ZSkgXSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gJChwKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBIZWxwZXIgZm9yIGV4dGVuZCwgYmVsb3cuIEhhbmRsZXMgdGhlIGZlYXR1cmUgY2FzZS4KKyMKK2xvY2FsIHJ1bGUgZXh0ZW5kLWZlYXR1cmUgKCBmZWF0dXJlIDogdmFsdWVzICogKQoreworICAgIGZlYXR1cmUgPSBbIGdyaXN0ICQoZmVhdHVyZSkgXSA7CisgICAgdmFsaWRhdGUtZmVhdHVyZSAkKGZlYXR1cmUpIDsKKyAgICBpZiBpbXBsaWNpdCBpbiAkKCQoZmVhdHVyZSkuYXR0cmlidXRlcykKKyAgICB7CisgICAgICAgIGZvciBsb2NhbCB2IGluICQodmFsdWVzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKCQodikuaW1wbGljaXQtZmVhdHVyZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgICAgICBlcnJvcnMuZXJyb3IgJCh2KSBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgXCIkKCQodikuaW1wbGljaXQtZmVhdHVyZSlcIiBmZWF0dXJlIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICQodikuaW1wbGljaXQtZmVhdHVyZSA9ICQoZmVhdHVyZSkgOworICAgICAgICB9CisKKyAgICAgICAgLmFsbC1pbXBsaWNpdC12YWx1ZXMgKz0gJCh2YWx1ZXMpIDsKKyAgICB9CisgICAgaWYgISAkKCQoZmVhdHVyZSkudmFsdWVzKQorICAgIHsKKyAgICAgICAgIyBUaGlzIGlzIHRoZSBmaXJzdCB2YWx1ZSBzcGVjaWZpZWQgZm9yIHRoaXMgZmVhdHVyZSBzbyBtYWtlIGl0IGJlIHRoZQorICAgICAgICAjIGRlZmF1bHQuCisgICAgICAgICQoZmVhdHVyZSkuZGVmYXVsdCA9ICQodmFsdWVzWzFdKSA7CisgICAgfQorICAgICQoZmVhdHVyZSkudmFsdWVzICs9ICQodmFsdWVzKSA7Cit9CisKKworIyBDaGVja3MgdGhhdCB2YWx1ZS1zdHJpbmcgaXMgYSB2YWxpZCB2YWx1ZS1zdHJpbmcgZm9yIHRoZSBnaXZlbiBmZWF0dXJlLgorIworcnVsZSB2YWxpZGF0ZS12YWx1ZS1zdHJpbmcgKCBmZWF0dXJlIHZhbHVlLXN0cmluZyApCit7CisgICAgaWYgISAoCisgICAgICAgIGZyZWUgaW4gJCgkKGZlYXR1cmUpLmF0dHJpYnV0ZXMpCisgICAgICAgIHx8ICggJCh2YWx1ZS1zdHJpbmcpIGluICQoZmVhdHVyZSkudmFsdWVzICkKKyAgICApCisgICAgeworICAgICAgICBsb2NhbCB2YWx1ZXMgPSAkKHZhbHVlLXN0cmluZykgOworCisgICAgICAgIGlmICQoJChmZWF0dXJlKS5zdWJmZWF0dXJlcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgISAkKHZhbHVlLXN0cmluZykgaW4gJCgkKGZlYXR1cmUpLnZhbHVlcykKKyAgICAgICAgICAgICAgICAkKCQoZmVhdHVyZSkuc3ViZmVhdHVyZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsdWVzID0gWyByZWdleC5zcGxpdCAkKHZhbHVlLXN0cmluZykgLSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICEgKCAkKHZhbHVlc1sxXSkgaW4gJCgkKGZlYXR1cmUpLnZhbHVlcykgKSAmJgorCisgICAgICAgICAgICAjIEFuIGVtcHR5IHZhbHVlIGlzIGFsbG93ZWQgZm9yIG9wdGlvbmFsIGZlYXR1cmVzLgorICAgICAgICAgICAgKCAkKHZhbHVlc1sxXSkgfHwgISAoIG9wdGlvbmFsIGluICQoJChmZWF0dXJlKS5hdHRyaWJ1dGVzKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICBlcnJvcnMuZXJyb3IgXCIkKHZhbHVlc1sxXSlcIiBpcyBub3QgYSBrbm93biB2YWx1ZSBvZiBmZWF0dXJlCisgICAgICAgICAgICAgICAgJChmZWF0dXJlKSA6IGxlZ2FsIHZhbHVlczogXCIkKCQoZmVhdHVyZSkudmFsdWVzKVwiIDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciBsb2NhbCB2IGluICQodmFsdWVzWzItXSkKKyAgICAgICAgeworICAgICAgICAgICAgIyBUaGlzIHdpbGwgdmFsaWRhdGUgYW55IHN1YmZlYXR1cmUgdmFsdWVzIGluIHZhbHVlLXN0cmluZy4KKyAgICAgICAgICAgIGltcGxpZWQtc3ViZmVhdHVyZSAkKGZlYXR1cmUpICQodikgOiAkKHZhbHVlc1sxXSkgOworICAgICAgICB9CisgICAgfQorfQorCisKKyMgQSBoZWxwZXIgdGhhdCBjb21wdXRlczoKKyMgICogbmFtZShzKSBvZiBtb2R1bGUtbG9jYWwgdmFyaWFibGUocykgdXNlZCB0byByZWNvcmQgdGhlIGNvcnJlc3BvbmRlbmNlCisjICAgIGJldHdlZW4gc3VidmFsdWUocykgYW5kIGEgc3ViZmVhdHVyZQorIyAgKiB2YWx1ZSBvZiB0aGF0IHZhcmlhYmxlIHdoZW4gc3VjaCBhIHN1YmZlYXR1cmUvc3VidmFsdWUgaGFzIGJlZW4gZGVmaW5lZCBhbmQKKyMgcmV0dXJucyBhIGxpc3QgY29uc2lzdGluZyBvZiB0aGUgbGF0dGVyIGZvbGxvd2VkIGJ5IHRoZSBmb3JtZXIuCisjCitsb2NhbCBydWxlIHN1YnZhbHVlLXZhciAoCisgICAgZmVhdHVyZSAgICAgICAgICMgTWFpbiBmZWF0dXJlIG5hbWUuCisgICAgdmFsdWUtc3RyaW5nID8gICMgSWYgc3VwcGxpZWQsIHNwZWNpZmllcyBhIHNwZWNpZmljIHZhbHVlIG9mIHRoZSBtYWluCisgICAgICAgICAgICAgICAgICAgICMgZmVhdHVyZSBmb3Igd2hpY2ggdGhlIHN1YmZlYXR1cmUgdmFsdWVzIGFyZSB2YWxpZC4KKyAgICA6IHN1YmZlYXR1cmUgICAgIyBTdWJmZWF0dXJlIG5hbWUuCisgICAgOiBzdWJ2YWx1ZXMgKiAgICMgU3ViZmVhdHVyZSB2YWx1ZXMuCispCit7CisgICAgZmVhdHVyZSA9IFsgZ3Jpc3QgJChmZWF0dXJlKSBdIDsKKyAgICB2YWxpZGF0ZS1mZWF0dXJlICQoZmVhdHVyZSkgOworICAgIGlmICQodmFsdWUtc3RyaW5nKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGUtdmFsdWUtc3RyaW5nICQoZmVhdHVyZSkgJCh2YWx1ZS1zdHJpbmcpIDsKKyAgICB9CisKKyAgICBsb2NhbCBzdWJmZWF0dXJlLW5hbWUgPSBbIGdldC1zdWJmZWF0dXJlLW5hbWUgJChzdWJmZWF0dXJlKSAkKHZhbHVlLXN0cmluZykgXSA7CisKKyAgICByZXR1cm4gJChzdWJmZWF0dXJlLW5hbWUpCisgICAgJChmZWF0dXJlKSQodmFsdWUtc3RyaW5nOkU9IiIpPD4kKHN1YnZhbHVlcykuc3ViZmVhdHVyZSA7Cit9CisKKworIyBFeHRlbmRzIHRoZSBnaXZlbiBzdWJmZWF0dXJlIHdpdGggdGhlIHN1YnZhbHVlcy4gSWYgdGhlIG9wdGlvbmFsIHZhbHVlLXN0cmluZworIyBpcyBwcm92aWRlZCwgdGhlIHN1YnZhbHVlcyBhcmUgb25seSB2YWxpZCBmb3IgdGhlIGdpdmVuIHZhbHVlIG9mIHRoZSBmZWF0dXJlLgorIyBUaHVzLCB5b3UgY291bGQgc2F5IHRoYXQgPHRhcmdldC1wbGF0Zm9ybT5taW5ndyBpcyBzcGVjaWZpYyB0bworIyA8dG9vbHNldD5nY2MtMi45NS4yIGFzIGZvbGxvd3M6CisjCisjICAgICAgIGV4dGVuZC1zdWJmZWF0dXJlIHRvb2xzZXQgZ2NjLTIuOTUuMiA6IHRhcmdldC1wbGF0Zm9ybSA6IG1pbmd3IDsKKyMKK3J1bGUgZXh0ZW5kLXN1YmZlYXR1cmUgKAorICAgIGZlYXR1cmUgICAgICAgICAjIFRoZSBmZWF0dXJlIHdob3NlIHN1YmZlYXR1cmUgaXMgYmVpbmcgZXh0ZW5kZWQuCisKKyAgICB2YWx1ZS1zdHJpbmcgPyAgIyBJZiBzdXBwbGllZCwgc3BlY2lmaWVzIGEgc3BlY2lmaWMgdmFsdWUgb2YgdGhlIG1haW4KKyAgICAgICAgICAgICAgICAgICAgIyBmZWF0dXJlIGZvciB3aGljaCB0aGUgbmV3IHN1YmZlYXR1cmUgdmFsdWVzIGFyZSB2YWxpZC4KKworICAgIDogc3ViZmVhdHVyZSAgICAjIFN1YmZlYXR1cmUgbmFtZS4KKyAgICA6IHN1YnZhbHVlcyAqICAgIyBBZGRpdGlvbmFsIHN1YmZlYXR1cmUgdmFsdWVzLgorKQoreworICAgIGxvY2FsIHN1YmZlYXR1cmUtdmFycyA9IFsgc3VidmFsdWUtdmFyICQoZmVhdHVyZSkgJCh2YWx1ZS1zdHJpbmcpCisgICAgICAgIDogJChzdWJmZWF0dXJlKSA6ICQoc3VidmFsdWVzKSBdIDsKKworICAgIGxvY2FsIGYgPSBbIHV0aWxpdHkudW5ncmlzdCBbIGdyaXN0ICQoZmVhdHVyZSkgXSBdIDsKKyAgICBleHRlbmQgJChmKS0kKHN1YmZlYXR1cmUtdmFyc1sxXSkgOiAkKHN1YnZhbHVlcykgOworCisgICAgIyBQcm92aWRlIGEgd2F5IHRvIGdldCBmcm9tIHRoZSBnaXZlbiBmZWF0dXJlIG9yIHByb3BlcnR5IGFuZCBzdWJmZWF0dXJlCisgICAgIyB2YWx1ZSB0byB0aGUgc3ViZmVhdHVyZSBuYW1lLgorICAgICQoc3ViZmVhdHVyZS12YXJzWzItXSkgPSAkKHN1YmZlYXR1cmUtdmFyc1sxXSkgOworfQorCisKKyMgUmV0dXJucyB0cnVlIGlmZiB0aGUgc3VidmFsdWVzIGFyZSB2YWxpZCBmb3IgdGhlIGZlYXR1cmUuIFdoZW4gdGhlIG9wdGlvbmFsCisjIHZhbHVlLXN0cmluZyBpcyBwcm92aWRlZCwgcmV0dXJucyB0cnVlIGlmZiB0aGUgc3VidmFsdWVzIGFyZSB2YWxpZCBmb3IgdGhlCisjIGdpdmVuIHZhbHVlIG9mIHRoZSBmZWF0dXJlLgorIworcnVsZSBpcy1zdWJ2YWx1ZSAoIGZlYXR1cmUgOiB2YWx1ZS1zdHJpbmcgPyA6IHN1YmZlYXR1cmUgOiBzdWJ2YWx1ZSApCit7CisgICAgbG9jYWwgc3ViZmVhdHVyZS12YXJzID0gWyBzdWJ2YWx1ZS12YXIgJChmZWF0dXJlKSAkKHZhbHVlLXN0cmluZykKKyAgICAgICAgOiAkKHN1YmZlYXR1cmUpIDogJChzdWJ2YWx1ZSkgXSA7CisKKyAgICBpZiAkKCQoc3ViZmVhdHVyZS12YXJzWzJdKSkgPSAkKHN1YmZlYXR1cmUtdmFyc1sxXSkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlIDsKKyAgICB9Cit9CisKKworIyBDYW4gYmUgY2FsbGVkIHRocmVlIHdheXM6CisjCisjICAgIDEuIGV4dGVuZCBmZWF0dXJlIDogdmFsdWVzICoKKyMgICAgMi4gZXh0ZW5kIDxmZWF0dXJlPiBzdWJmZWF0dXJlIDogdmFsdWVzICoKKyMgICAgMy4gZXh0ZW5kIDxmZWF0dXJlPnZhbHVlLXN0cmluZyBzdWJmZWF0dXJlIDogdmFsdWVzICoKKyMKKyMgKiBGb3JtIDEgYWRkcyB0aGUgZ2l2ZW4gdmFsdWVzIHRvIHRoZSBnaXZlbiBmZWF0dXJlLgorIyAqIEZvcm1zIDIgYW5kIDMgYWRkIHN1YmZlYXR1cmUgdmFsdWVzIHRvIHRoZSBnaXZlbiBmZWF0dXJlLgorIyAqIEZvcm0gMyBhZGRzIHRoZSBzdWJmZWF0dXJlIHZhbHVlcyBhcyBzcGVjaWZpYyB0byB0aGUgZ2l2ZW4gcHJvcGVydHkKKyMgICB2YWx1ZS1zdHJpbmcuCisjCitydWxlIGV4dGVuZCAoIGZlYXR1cmUtb3ItcHJvcGVydHkgc3ViZmVhdHVyZSA/IDogdmFsdWVzICogKQoreworICAgIGxvY2FsIGZlYXR1cmUgOyAgICAgICAjIElmIGEgcHJvcGVydHkgd2FzIHNwZWNpZmllZCB0aGlzIGlzIGl0cyBmZWF0dXJlLgorICAgIGxvY2FsIHZhbHVlLXN0cmluZyA7ICAjIEUuZy4sIHRoZSBnY2MtMi45NS0yIHBhcnQgb2YgPHRvb2xzZXQ+Z2NjLTIuOTUuMi4KKworICAgICMgSWYgYSBwcm9wZXJ0eSB3YXMgc3BlY2lmaWVkLgorICAgIGlmICQoZmVhdHVyZS1vci1wcm9wZXJ0eTpHKSAmJiAkKGZlYXR1cmUtb3ItcHJvcGVydHk6Rz0pCisgICAgeworICAgICAgICAjIEV4dHJhY3QgdGhlIGZlYXR1cmUgYW5kIHZhbHVlLXN0cmluZywgaWYgYW55LgorICAgICAgICBmZWF0dXJlID0gJChmZWF0dXJlLW9yLXByb3BlcnR5OkcpIDsKKyAgICAgICAgdmFsdWUtc3RyaW5nID0gJChmZWF0dXJlLW9yLXByb3BlcnR5Okc9KSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZlYXR1cmUgPSBbIGdyaXN0ICQoZmVhdHVyZS1vci1wcm9wZXJ0eSkgXSA7CisgICAgfQorCisgICAgIyBEaXNwYXRjaCB0byB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlci4KKyAgICBpZiAkKHN1YmZlYXR1cmUpCisgICAgeworICAgICAgICBleHRlbmQtc3ViZmVhdHVyZSAkKGZlYXR1cmUpICQodmFsdWUtc3RyaW5nKSA6ICQoc3ViZmVhdHVyZSkKKyAgICAgICAgICAgIDogJCh2YWx1ZXMpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgIyBJZiBubyBzdWJmZWF0dXJlIHdhcyBzcGVjaWZpZWQsIHdlIGRvIG5vdCBleHBlY3QgdG8gc2VlIGEKKyAgICAgICAgIyB2YWx1ZS1zdHJpbmcuCisgICAgICAgIGlmICQodmFsdWUtc3RyaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciBjYW4gb25seSBzcGVjaWZ5IGEgcHJvcGVydHkgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHdoZW4KKyAgICAgICAgICAgICAgICBleHRlbmRpbmcgYSBzdWJmZWF0dXJlCisgICAgICAgICAgICAgICAgOiB1c2FnZToKKyAgICAgICAgICAgICAgICA6ICIgICAgZXh0ZW5kIiBmZWF0dXJlICI6IiB2YWx1ZXMuLi4KKyAgICAgICAgICAgICAgICA6ICIgIHwgZXh0ZW5kIiA8ZmVhdHVyZT52YWx1ZS1zdHJpbmcgc3ViZmVhdHVyZSAiOiIgdmFsdWVzLi4uIDsKKyAgICAgICAgfQorCisgICAgICAgIGV4dGVuZC1mZWF0dXJlICQoZmVhdHVyZSkgOiAkKHZhbHVlcykgOworICAgIH0KK30KKworCitsb2NhbCBydWxlIGdldC1zdWJmZWF0dXJlLW5hbWUgKCBzdWJmZWF0dXJlIHZhbHVlLXN0cmluZyA/ICkKK3sKKyAgICBsb2NhbCBwcmVmaXggPSAkKHZhbHVlLXN0cmluZyk6IDsKKyAgICByZXR1cm4gJChwcmVmaXg6RT0iIikkKHN1YmZlYXR1cmUpIDsKK30KKworCisjIERlY2xhcmVzIGEgc3ViZmVhdHVyZS4KKyMKK3J1bGUgc3ViZmVhdHVyZSAoCisgICAgZmVhdHVyZSAgICAgICAgICMgUm9vdCBmZWF0dXJlIHRoYXQgaXMgbm90IGEgc3ViZmVhdHVyZS4KKyAgICB2YWx1ZS1zdHJpbmcgPyAgIyBBIHZhbHVlLXN0cmluZyBzcGVjaWZ5aW5nIHdoaWNoIGZlYXR1cmUgb3Igc3ViZmVhdHVyZQorICAgICAgICAgICAgICAgICAgICAjIHZhbHVlcyB0aGlzIHN1YmZlYXR1cmUgaXMgc3BlY2lmaWMgdG8sIGlmIGFueS4KKyAgICA6IHN1YmZlYXR1cmUgICAgIyBUaGUgbmFtZSBvZiB0aGUgc3ViZmVhdHVyZSBiZWluZyBkZWNsYXJlZC4KKyAgICA6IHN1YnZhbHVlcyAqICAgIyBUaGUgYWxsb3dlZCB2YWx1ZXMgb2YgdGhpcyBzdWJmZWF0dXJlLgorICAgIDogYXR0cmlidXRlcyAqICAjIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBzdWJmZWF0dXJlLgorKQoreworICAgIGZlYXR1cmUgPSBbIGdyaXN0ICQoZmVhdHVyZSkgXSA7CisgICAgdmFsaWRhdGUtZmVhdHVyZSAkKGZlYXR1cmUpIDsKKworICAgICMgQWRkIGdyaXN0IHRvIHRoZSBzdWJmZWF0dXJlIG5hbWUgaWYgYSB2YWx1ZS1zdHJpbmcgd2FzIHN1cHBsaWVkLgorICAgIGxvY2FsIHN1YmZlYXR1cmUtbmFtZSA9IFsgZ2V0LXN1YmZlYXR1cmUtbmFtZSAkKHN1YmZlYXR1cmUpICQodmFsdWUtc3RyaW5nKSBdIDsKKworICAgIGlmICQoc3ViZmVhdHVyZS1uYW1lKSBpbiAkKCQoZmVhdHVyZSkuc3ViZmVhdHVyZXMpCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgZXJyb3JzLmVycm9yIFwiJChzdWJmZWF0dXJlKVwiIGFscmVhZHkgZGVjbGFyZWQgYXMgYSBzdWJmZWF0dXJlIG9mCisgICAgICAgICAgICBcIiQoZmVhdHVyZSlcIiAic3BlY2lmaWMgdG8gIiQodmFsdWUtc3RyaW5nKSA7CisgICAgfQorICAgICQoZmVhdHVyZSkuc3ViZmVhdHVyZXMgKz0gJChzdWJmZWF0dXJlLW5hbWUpIDsKKworICAgICMgRmlyc3QgZGVjbGFyZSB0aGUgc3ViZmVhdHVyZSBhcyBhIGZlYXR1cmUgaW4gaXRzIG93biByaWdodC4KKyAgICBsb2NhbCBmID0gWyB1dGlsaXR5LnVuZ3Jpc3QgJChmZWF0dXJlKSBdIDsKKyAgICBmZWF0dXJlICQoZiktJChzdWJmZWF0dXJlLW5hbWUpIDogJChzdWJ2YWx1ZXMpIDogJChhdHRyaWJ1dGVzKSBzdWJmZWF0dXJlIDsKKworICAgICMgTm93IG1ha2Ugc3VyZSB0aGUgc3ViZmVhdHVyZSB2YWx1ZXMgYXJlIGtub3duLgorICAgIGV4dGVuZC1zdWJmZWF0dXJlICQoZmVhdHVyZSkgJCh2YWx1ZS1zdHJpbmcpIDogJChzdWJmZWF0dXJlKSA6ICQoc3VidmFsdWVzKSA7Cit9CisKKworIyBTZXQgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gY29tcG9zaXRlIHByb3BlcnR5LgorIworcnVsZSBjb21wb3NlICggY29tcG9zaXRlLXByb3BlcnR5IDogY29tcG9uZW50LXByb3BlcnRpZXMgKiApCit7CisgICAgbG9jYWwgZmVhdHVyZSA9ICQoY29tcG9zaXRlLXByb3BlcnR5OkcpIDsKKyAgICBpZiAhICggY29tcG9zaXRlIGluIFsgYXR0cmlidXRlcyAkKGZlYXR1cmUpIF0gKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciAiJChmZWF0dXJlKSIgaXMgbm90IGEgY29tcG9zaXRlIGZlYXR1cmUgOworICAgIH0KKworICAgICQoY29tcG9zaXRlLXByb3BlcnR5KS5jb21wb25lbnRzID89IDsKKyAgICBpZiAkKCQoY29tcG9zaXRlLXByb3BlcnR5KS5jb21wb25lbnRzKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciBjb21wb25lbnRzIG9mICIkKGNvbXBvc2l0ZS1wcm9wZXJ0eSkiIGFscmVhZHkgc2V0OgorICAgICAgICAgICAgJCgkKGNvbXBvc2l0ZS1wcm9wZXJ0eSkuY29tcG9uZW50cykgOworICAgIH0KKworICAgIGlmICQoY29tcG9zaXRlLXByb3BlcnR5KSBpbiAkKGNvbXBvbmVudC1wcm9wZXJ0aWVzKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciBjb21wb3NpdGUgcHJvcGVydHkgIiQoY29tcG9zaXRlLXByb3BlcnR5KSIgY2Fubm90IGhhdmUgaXRzZWxmIGFzIGEgY29tcG9uZW50IDsKKyAgICB9CisgICAgJChjb21wb3NpdGUtcHJvcGVydHkpLmNvbXBvbmVudHMgPSAkKGNvbXBvbmVudC1wcm9wZXJ0aWVzKSA7Cit9CisKKworbG9jYWwgcnVsZSBleHBhbmQtY29tcG9zaXRlICggcHJvcGVydHkgKQoreworICAgIHJldHVybiAkKHByb3BlcnR5KQorICAgICAgICBbIHNlcXVlbmNlLnRyYW5zZm9ybSBleHBhbmQtY29tcG9zaXRlIDogJCgkKHByb3BlcnR5KS5jb21wb25lbnRzKSBdIDsKK30KKworCisjIFJldHVybiBhbGwgdmFsdWVzIG9mIHRoZSBnaXZlbiBmZWF0dXJlIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gcHJvcGVydHkgc2V0LgorIworcnVsZSBnZXQtdmFsdWVzICggZmVhdHVyZSA6IHByb3BlcnRpZXMgKiApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKworICAgIGZlYXR1cmUgPSAkKDpFPTpHPSQoZmVhdHVyZSkpIDsgICMgQWRkIDw+IGlmIG5lY2Vzc2FyeS4KKyAgICBmb3IgbG9jYWwgcCBpbiAkKHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBpZiAkKHA6RykgPSAkKGZlYXR1cmUpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgVXNlIE1BVENIIGluc3RlYWQgb2YgOkc9IHRvIGdldCB0aGUgdmFsdWUsIGluIG9yZGVyIHRvIHByZXNlcnZlCisgICAgICAgICAgICAjIHRoZSB2YWx1ZSBpbnRhY3QgaW5zdGVhZCBvZiBoYXZpbmcgYmphbSB0cmVhdCBpdCBhcyBhIGRlY29tcG9zYWJsZQorICAgICAgICAgICAgIyBwYXRoLgorICAgICAgICAgICAgcmVzdWx0ICs9IFsgTUFUQ0ggIj4oLiopIiA6ICQocCkgXSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworcnVsZSBmcmVlLWZlYXR1cmVzICggKQoreworICAgIHJldHVybiAkKGZyZWUuZmVhdHVyZXMpIDsKK30KKworCisjIEV4cGFuZCBhbGwgY29tcG9zaXRlIHByb3BlcnRpZXMgaW4gdGhlIHNldCBzbyB0aGF0IGFsbCBjb21wb25lbnRzIGFyZQorIyBleHBsaWNpdGx5IGV4cHJlc3NlZC4KKyMKK3J1bGUgZXhwYW5kLWNvbXBvc2l0ZXMgKCBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2FsIGV4cGxpY2l0LWZlYXR1cmVzID0gJChwcm9wZXJ0aWVzOkcpIDsKKyAgICBsb2NhbCByZXN1bHQgOworCisgICAgIyBOb3cgZXhwYW5kIGNvbXBvc2l0ZSBmZWF0dXJlcy4KKyAgICBmb3IgbG9jYWwgcCBpbiAkKHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBsb2NhbCBleHBhbmRlZCA9IFsgZXhwYW5kLWNvbXBvc2l0ZSAkKHApIF0gOworCisgICAgICAgIGZvciBsb2NhbCB4IGluICQoZXhwYW5kZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICEgJCh4KSBpbiAkKHJlc3VsdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBmID0gJCh4OkcpIDsKKworICAgICAgICAgICAgICAgIGlmICQoZikgaW4gJChmcmVlLmZlYXR1cmVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoeCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICEgJCh4KSBpbiAkKHByb3BlcnRpZXMpICAjIHggaXMgdGhlIHJlc3VsdCBvZiBleHBhbnNpb24KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICEgJChmKSBpbiAkKGV4cGxpY2l0LWZlYXR1cmVzKSAgIyBub3QgZXhwbGljaXRseS1zcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgJChmKSBpbiAkKHJlc3VsdDpHKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5lcnJvciBleHBhbnNpb25zIG9mIGNvbXBvc2l0ZSBmZWF0dXJlcyByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY29uZmxpY3RpbmcgdmFsdWVzIGZvciAkKGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWVzOiBbIGdldC12YWx1ZXMgJChmKSA6ICQocmVzdWx0KSBdICQoeDpHPSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvbmUgY29udHJpYnV0aW5nIGNvbXBvc2l0ZSBwcm9wZXJ0eSB3YXMgJChwKSA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoeCkgOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgJChmKSBpbiAkKHJlc3VsdDpHKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5lcnJvciBleHBsaWNpdGx5LXNwZWNpZmllZCB2YWx1ZXMgb2Ygbm9uLWZyZWUgZmVhdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgJChmKSBjb25mbGljdCA6CisgICAgICAgICAgICAgICAgICAgICAgICAiZXhpc3RpbmcgdmFsdWVzOiIgWyBnZXQtdmFsdWVzICQoZikgOiAkKHByb3BlcnRpZXMpIF0gOgorICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIGZyb20gZXhwYW5kaW5nICIgJChwKSAiOiIgJCh4Okc9KSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAkKHgpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBSZXR1cm4gdHJ1ZSBpZmYgZiBpcyBhbiBvcmRpbmFyeSBzdWJmZWF0dXJlIG9mIHRoZSBwYXJlbnQtcHJvcGVydHkncyBmZWF0dXJlLAorIyBvciBpZiBmIGlzIGEgc3ViZmVhdHVyZSBvZiB0aGUgcGFyZW50LXByb3BlcnR5J3MgZmVhdHVyZSBzcGVjaWZpYyB0byB0aGUKKyMgcGFyZW50LXByb3BlcnR5J3MgdmFsdWUuCisjCitsb2NhbCBydWxlIGlzLXN1YmZlYXR1cmUtb2YgKCBwYXJlbnQtcHJvcGVydHkgZiApCit7CisgICAgaWYgc3ViZmVhdHVyZSBpbiAkKCQoZikuYXR0cmlidXRlcykKKyAgICB7CisgICAgICAgIGxvY2FsIHNwZWNpZmljLXN1YmZlYXR1cmUgPSBbIE1BVENIIDwoLiopOiguKik+IDogJChmKSBdIDsKKyAgICAgICAgaWYgJChzcGVjaWZpYy1zdWJmZWF0dXJlKQorICAgICAgICB7CisgICAgICAgICAgICAjIFRoZSBmZWF0dXJlIGhhcyB0aGUgZm9ybSA8dG9wZmVhdHVyZS10b3B2YWx1ZTpzdWJmZWF0dXJlPiwgZS5nLgorICAgICAgICAgICAgIyA8dG9vbHNldC1tc3ZjOnZlcnNpb24+LgorICAgICAgICAgICAgbG9jYWwgZmVhdHVyZS12YWx1ZSA9IFsgc3BsaXQtdG9wLWZlYXR1cmUgJChzcGVjaWZpYy1zdWJmZWF0dXJlWzFdKQorICAgICAgICAgICAgICAgIF0gOworICAgICAgICAgICAgaWYgPCQoZmVhdHVyZS12YWx1ZVsxXSk+JChmZWF0dXJlLXZhbHVlWzJdKSA9ICQocGFyZW50LXByb3BlcnR5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICMgVGhlIGZlYXR1cmUgaGFzIHRoZSBmb3JtIDx0b3BmZWF0dXJlLXN1YmZlYXR1cmU+LCBlLmcuCisgICAgICAgICAgICAjIDx0b29sc2V0LXZlcnNpb24+CisgICAgICAgICAgICBsb2NhbCB0b3Atc3ViID0gWyBzcGxpdC10b3AtZmVhdHVyZSBbIHV0aWxpdHkudW5ncmlzdCAkKGYpIF0gXSA7CisgICAgICAgICAgICBpZiAkKHRvcC1zdWJbMl0pICYmIDwkKHRvcC1zdWJbMV0pPiA9ICQocGFyZW50LXByb3BlcnR5OkcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWUgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKyMgQXMgZm9yIGlzLXN1YmZlYXR1cmUtb2YgYnV0IGZvciBzdWJwcm9wZXJ0aWVzLgorIworbG9jYWwgcnVsZSBpcy1zdWJwcm9wZXJ0eS1vZiAoIHBhcmVudC1wcm9wZXJ0eSBwICkKK3sKKyAgICByZXR1cm4gWyBpcy1zdWJmZWF0dXJlLW9mICQocGFyZW50LXByb3BlcnR5KSAkKHA6RykgXSA7Cit9CisKKworIyBHaXZlbiBhIHByb3BlcnR5LCByZXR1cm4gdGhlIHN1YnNldCBvZiBmZWF0dXJlcyBjb25zaXN0aW5nIG9mIGFsbCBvcmRpbmFyeQorIyBzdWJmZWF0dXJlcyBvZiB0aGUgcHJvcGVydHkncyBmZWF0dXJlLCBhbmQgYWxsIHNwZWNpZmljIHN1YmZlYXR1cmVzIG9mIHRoZQorIyBwcm9wZXJ0eSdzIGZlYXR1cmUgd2hpY2ggYXJlIGNvbmRpdGlvbmFsIG9uIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLgorIworbG9jYWwgcnVsZSBzZWxlY3Qtc3ViZmVhdHVyZXMgKCBwYXJlbnQtcHJvcGVydHkgOiBmZWF0dXJlcyAqICkKK3sKKyAgICByZXR1cm4gWyBzZXF1ZW5jZS5maWx0ZXIgaXMtc3ViZmVhdHVyZS1vZiAkKHBhcmVudC1wcm9wZXJ0eSkgOiAkKGZlYXR1cmVzKSBdIDsKK30KKworCisjIEFzIGZvciBzZWxlY3Qtc3ViZmVhdHVyZXMgYnV0IGZvciBzdWJwcm9wZXJ0aWVzLgorIworbG9jYWwgcnVsZSBzZWxlY3Qtc3VicHJvcGVydGllcyAoIHBhcmVudC1wcm9wZXJ0eSA6IHByb3BlcnRpZXMgKiApCit7CisgICAgcmV0dXJuIFsgc2VxdWVuY2UuZmlsdGVyIGlzLXN1YnByb3BlcnR5LW9mICQocGFyZW50LXByb3BlcnR5KSA6ICQocHJvcGVydGllcykgXSA7Cit9CisKKworIyBHaXZlbiBhIHByb3BlcnR5IHNldCB3aGljaCBtYXkgY29uc2lzdCBvZiBjb21wb3NpdGUgYW5kIGltcGxpY2l0IHByb3BlcnRpZXMKKyMgYW5kIGNvbWJpbmVkIHN1YmZlYXR1cmUgdmFsdWVzLCByZXR1cm5zIGFuIGV4cGFuZGVkLCBub3JtYWxpemVkIHByb3BlcnR5IHNldAorIyB3aXRoIGFsbCBpbXBsaWNpdCBmZWF0dXJlcyBleHByZXNzZWQgZXhwbGljaXRseSwgYWxsIHN1YmZlYXR1cmUgdmFsdWVzCisjIGluZGl2aWR1YWxseSBleHByZXNzZWQsIGFuZCBhbGwgY29tcG9uZW50cyBvZiBjb21wb3NpdGUgcHJvcGVydGllcyBleHBhbmRlZC4KKyMgTm9uLWZyZWUgZmVhdHVyZXMgZGlyZWN0bHkgZXhwcmVzc2VkIGluIHRoZSBpbnB1dCBwcm9wZXJ0aWVzIGNhdXNlIGFueSB2YWx1ZXMKKyMgb2YgdGhvc2UgZmVhdHVyZXMgZHVlIHRvIGNvbXBvc2l0ZSBmZWF0dXJlIGV4cGFuc2lvbiB0byBiZSBkcm9wcGVkLiBJZiB0d28KKyMgdmFsdWVzIG9mIGEgZ2l2ZW4gbm9uLWZyZWUgZmVhdHVyZSBhcmUgZGlyZWN0bHkgZXhwcmVzc2VkIGluIHRoZSBpbnB1dCwgYW4KKyMgZXJyb3IgaXMgaXNzdWVkLgorIworcnVsZSBleHBhbmQgKCBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2FsIGV4cGFuZGVkID0gWyBleHBhbmQtc3ViZmVhdHVyZXMgJChwcm9wZXJ0aWVzKSBdIDsKKyAgICByZXR1cm4gWyBleHBhbmQtY29tcG9zaXRlcyAkKGV4cGFuZGVkKSBdIDsKK30KKworCisjIEhlbHBlciBydWxlIGZvciBtaW5pbWl6ZS4gUmV0dXJucyB0cnVlIGlmZiBwcm9wZXJ0eSdzIGZlYXR1cmUgaXMgcHJlc2VudCBpbgorIyB0aGUgY29udGVudHMgb2YgdGhlIHZhcmlhYmxlIG5hbWVkIGJ5IGZlYXR1cmUtc2V0LXZhci4KKyMKK2xvY2FsIHJ1bGUgaW4tZmVhdHVyZXMgKCBmZWF0dXJlLXNldC12YXIgcHJvcGVydHkgKQoreworICAgIGlmICQocHJvcGVydHk6RykgaW4gJCgkKGZlYXR1cmUtc2V0LXZhcikpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgfQorfQorCisKKyMgSGVscGVyIHJ1bGUgZm9yIG1pbmltaXplLiBSZXR1cm5zIHRoZSBsaXN0IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcywgYnV0IHdpdGgKKyMgYWxsIHN1YmZlYXR1cmVzIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisjCitsb2NhbCBydWxlIG1vdmUtc3ViZmVhdHVyZXMtdG8tdGhlLWVuZCAoIHByb3BlcnRpZXMgKiApCit7CisgICAgbG9jYWwgeDEgOworICAgIGxvY2FsIHgyIDsKKyAgICBmb3IgbG9jYWwgcCBpbiAkKHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBpZiBzdWJmZWF0dXJlIGluICQoJChwOkcpLmF0dHJpYnV0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHgyICs9ICQocCkgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgeDEgKz0gJChwKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQoeDEpICQoeDIpIDsKK30KKworCisjIEdpdmVuIGFuIGV4cGFuZGVkIHByb3BlcnR5IHNldCwgZWxpbWluYXRlIGFsbCByZWR1bmRhbmN5OiBwcm9wZXJ0aWVzIHRoYXQgYXJlCisjIGVsZW1lbnRzIG9mIG90aGVyIChjb21wb3NpdGUpIHByb3BlcnRpZXMgaW4gdGhlIHNldCB3aWxsIGJlIGVsaW1pbmF0ZWQuCisjIE5vbi1zeW1tZXRyaWMgcHJvcGVydGllcyBlcXVhbCB0byBkZWZhdWx0IHZhbHVlcyB3aWxsIGJlIGVsaW1pbmF0ZWQgdW5sZXNzCisjIHRoZXkgb3ZlcnJpZGUgYSB2YWx1ZSBmcm9tIHNvbWUgY29tcG9zaXRlIHByb3BlcnR5LiBJbXBsaWNpdCBwcm9wZXJ0aWVzIHdpbGwKKyMgYmUgZXhwcmVzc2VkIHdpdGhvdXQgZmVhdHVyZSBncmlzdCwgYW5kIHN1Yi1wcm9wZXJ0eSB2YWx1ZXMgd2lsbCBiZSBleHByZXNzZWQKKyMgYXMgZWxlbWVudHMgam9pbmVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIG1haW4gcHJvcGVydHkuCisjCitydWxlIG1pbmltaXplICggcHJvcGVydGllcyAqICkKK3sKKyAgICAjIFByZWNvbmRpdGlvbiBjaGVja2luZworICAgIGxvY2FsIGltcGxpY2l0cyA9IFsgc2V0LmludGVyc2VjdGlvbiAkKHA6Rz0pIDogJChwOkcpIF0gOworICAgIGlmICQoaW1wbGljaXRzKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciBtaW5pbWl6ZSByZXF1aXJlcyBhbiBleHBhbmRlZCBwcm9wZXJ0eSBzZXQsIGJ1dAorICAgICAgICAgICAgXCIkKGltcGxpY2l0c1sxXSlcIiBhcHBlYXJzIHRvIGJlIHRoZSB2YWx1ZSBvZiBhbiB1bi1leHBhbmRlZAorICAgICAgICAgICAgaW1wbGljaXQgZmVhdHVyZSA7CisgICAgfQorCisgICAgIyBSZW1vdmUgcHJvcGVydGllcyBpbXBsaWVkIGJ5IGNvbXBvc2l0ZSBmZWF0dXJlcy4KKyAgICBsb2NhbCBjb21wb25lbnRzID0gJCgkKHByb3BlcnRpZXMpLmNvbXBvbmVudHMpIDsKKyAgICBsb2NhbCB4ID0gWyBzZXQuZGlmZmVyZW5jZSAkKHByb3BlcnRpZXMpIDogJChjb21wb25lbnRzKSBdIDsKKworICAgICMgSGFuZGxlIHN1YmZlYXR1cmVzIGFuZCBpbXBsaWNpdCBmZWF0dXJlcy4KKyAgICB4ID0gWyBtb3ZlLXN1YmZlYXR1cmVzLXRvLXRoZS1lbmQgJCh4KSBdIDsKKyAgICBsb2NhbCByZXN1bHQgOworICAgIHdoaWxlICQoeCkKKyAgICB7CisgICAgICAgIGxvY2FsIHAgZnVsbHAgPSAkKHhbMV0pIDsKKyAgICAgICAgbG9jYWwgZiA9ICQocDpHKSA7CisgICAgICAgIGxvY2FsIHYgPSAkKHA6Rz0pIDsKKworICAgICAgICAjIEVsaW1pbmF0ZSBmZWF0dXJlcyBpbiBpbXBsaWNpdCBwcm9wZXJ0aWVzLgorICAgICAgICBpZiBpbXBsaWNpdCBpbiBbIGF0dHJpYnV0ZXMgJChmKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHAgPSAkKHYpIDsKKyAgICAgICAgfQorCisgICAgICAgICMgTG9jYXRlIGFsbCBzdWJwcm9wZXJ0aWVzIG9mICQoeFsxXSkgaW4gdGhlIHByb3BlcnR5IHNldC4KKyAgICAgICAgbG9jYWwgc3VicHJvcGVydGllcyA9IFsgc2VsZWN0LXN1YnByb3BlcnRpZXMgJChmdWxscCkgOiAkKHgpIF0gOworICAgICAgICBpZiAkKHN1YnByb3BlcnRpZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgUmVjb25zdGl0dXRlIHRoZSBqb2luZWQgcHJvcGVydHkgbmFtZS4KKyAgICAgICAgICAgIGxvY2FsIHNvcnRlZCA9IFsgc2VxdWVuY2UuaW5zZXJ0aW9uLXNvcnQgJChzdWJwcm9wZXJ0aWVzKSBdIDsKKyAgICAgICAgICAgIHJlc3VsdCArPSAkKHApLSQoc29ydGVkOkc9IiI6Sj0tKSA7CisKKyAgICAgICAgICAgIHggPSBbIHNldC5kaWZmZXJlbmNlICQoeFsyLV0pIDogJChzdWJwcm9wZXJ0aWVzKSBdIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICMgRWxpbWluYXRlIHByb3BlcnRpZXMgd2hvc2UgdmFsdWUgaXMgZXF1YWwgdG8gZmVhdHVyZSdzIGRlZmF1bHQsCisgICAgICAgICAgICAjIHdoaWNoIGFyZSBub3Qgc3ltbWV0cmljIGFuZCB3aGljaCBkbyBub3QgY29udHJhZGljdCB2YWx1ZXMgaW1wbGllZAorICAgICAgICAgICAgIyBieSBjb21wb3NpdGUgcHJvcGVydGllcy4KKworICAgICAgICAgICAgIyBTaW5jZSBhbGwgY29tcG9uZW50IHByb3BlcnRpZXMgb2YgY29tcG9zaXRlcyBpbiB0aGUgc2V0IGhhdmUgYmVlbgorICAgICAgICAgICAgIyBlbGltaW5hdGVkLCBhbnkgcmVtYWluaW5nIHByb3BlcnR5IHdob3NlIGZlYXR1cmUgaXMgdGhlIHNhbWUgYXMgYQorICAgICAgICAgICAgIyBjb21wb25lbnQgb2YgYSBjb21wb3NpdGUgaW4gdGhlIHNldCBtdXN0IGhhdmUgYSBub24tcmVkdW5kYW50CisgICAgICAgICAgICAjIHZhbHVlLgorICAgICAgICAgICAgaWYgJChmdWxscCkgIT0gWyBkZWZhdWx0cyAkKGYpIF0KKyAgICAgICAgICAgICAgICB8fCBzeW1tZXRyaWMgaW4gWyBhdHRyaWJ1dGVzICQoZikgXQorICAgICAgICAgICAgICAgIHx8ICQoZnVsbHA6RykgaW4gJChjb21wb25lbnRzOkcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQocCkgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB4ID0gJCh4WzItXSkgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgQ29tYmluZSBhbGwgc3VicHJvcGVydGllcyBpbnRvIHRoZWlyIHBhcmVudCBwcm9wZXJ0aWVzCisjCisjIFJlcXVpcmVzOiBmb3IgZXZlcnkgc3VicHJvcGVydHksIHRoZXJlIGlzIGEgcGFyZW50IHByb3BlcnR5LiBBbGwgZmVhdHVyZXMgYXJlCisjIGV4cGxpY2l0bHkgZXhwcmVzc2VkLgorIworIyBUaGlzIHJ1bGUgcHJvYmFibHkgc2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJ1dCBidWlsZC1yZXF1ZXN0LmV4cGFuZC1uby1kZWZhdWx0cworIyBpcyBiZWluZyBhYnVzZWQgZm9yIHVuaW50ZW5kZWQgcHVycG9zZXMgYW5kIGl0IG5lZWRzIGhlbHAuCisjCitydWxlIGNvbXByZXNzLXN1YnByb3BlcnRpZXMgKCBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2FsIGFsbC1zdWJzIDsKKyAgICBsb2NhbCBtYXRjaGVkLXN1YnMgOworICAgIGxvY2FsIHJlc3VsdCA7CisKKyAgICBmb3IgbG9jYWwgcCBpbiAkKHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBpZiAhICQocDpHKQorICAgICAgICB7CisgICAgICAgICAgICAjIEV4cGVjdGluZyBmdWxseS1ncmlzdGVkIHByb3BlcnRpZXMuCisgICAgICAgICAgICBhc3NlcnQudmFyaWFibGUtbm90LWVtcHR5IHA6RyA7CisgICAgICAgIH0KKworICAgICAgICBpZiAhIHN1YmZlYXR1cmUgaW4gJCgkKHA6RykuYXR0cmlidXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgc3VicyA9IFsgc2VxdWVuY2UuaW5zZXJ0aW9uLXNvcnQKKyAgICAgICAgICAgICAgICBbIHNlcXVlbmNlLmZpbHRlciBpcy1zdWJwcm9wZXJ0eS1vZiAkKHApIDogJChwcm9wZXJ0aWVzKSBdIF0gOworCisgICAgICAgICAgICBtYXRjaGVkLXN1YnMgKz0gJChzdWJzKSA7CisKKyAgICAgICAgICAgIGxvY2FsIHN1YnZhbHVlcyA9IC0kKHN1YnM6Rz06Sj0tKSA7CisgICAgICAgICAgICBzdWJ2YWx1ZXMgPz0gIiIgOworICAgICAgICAgICAgcmVzdWx0ICs9ICQocCkkKHN1YnZhbHVlcykgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYWxsLXN1YnMgKz0gJChwKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0LnJlc3VsdCB0cnVlIDogc2V0LmVxdWFsICQoYWxsLXN1YnMpIDogJChtYXRjaGVkLXN1YnMpIDsKKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIEdpdmVuIGFuIHVuZ3Jpc3RlZCBzdHJpbmcsIGZpbmRzIHRoZSBsb25nZXN0IHByZWZpeCB3aGljaCBpcyBhIHRvcC1sZXZlbAorIyBmZWF0dXJlIG5hbWUgZm9sbG93ZWQgYnkgYSBkYXNoLCBhbmQgcmV0dXJuIGEgcGFpciBjb25zaXN0aW5nIG9mIHRoZSBwYXJ0cworIyBiZWZvcmUgYW5kIGFmdGVyIHRoYXQgZGFzaC4gTW9yZSBpbnRlcmVzdGluZyB0aGFuIGEgc2ltcGxlIHNwbGl0IGJlY2F1c2UKKyMgZmVhdHVyZSBuYW1lcyBtYXkgY29udGFpbiBkYXNoZXMuCisjCitsb2NhbCBydWxlIHNwbGl0LXRvcC1mZWF0dXJlICggZmVhdHVyZS1wbHVzICkKK3sKKyAgICBsb2NhbCBlID0gWyByZWdleC5zcGxpdCAkKGZlYXR1cmUtcGx1cykgLSBdIDsKKyAgICBsb2NhbCBmID0gJChlWzFdKSA7CisgICAgbG9jYWwgdiA7CisgICAgd2hpbGUgJChlKQorICAgIHsKKyAgICAgICAgaWYgPCQoZik+IGluICQoLmFsbC10b3AtZmVhdHVyZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHYgPSAkKGYpICQoZVsyLV06Sj0tKSA7CisgICAgICAgIH0KKyAgICAgICAgZSA9ICQoZVsyLV0pIDsKKyAgICAgICAgZiA9ICQoZiktJChlWzFdKSA7CisgICAgfQorICAgIHJldHVybiAkKHYpIDsKK30KKworCisjIEdpdmVuIGEgc2V0IG9mIHByb3BlcnRpZXMsIGFkZCBkZWZhdWx0IHZhbHVlcyBmb3IgZmVhdHVyZXMgbm90IHJlcHJlc2VudGVkIGluCisjIHRoZSBzZXQuCisjCisjIE5vdGU6IGlmIHRoZXJlJ3MgYW4gb3JkaW5hcnkgZmVhdHVyZSBGMSBhbmQgYSBjb21wb3NpdGUgZmVhdHVyZSBGMiB3aGljaAorIyBpbmNsdWRlcyBzb21lIHZhbHVlIGZvciBGMSBhbmQgYm90aCBmZWF0dXJlIGhhdmUgZGVmYXVsdCB2YWx1ZXMgdGhlbiB0aGUKKyMgZGVmYXVsdCB2YWx1ZSBvZiBGMSB3aWxsIGJlIGFkZGVkIChhcyBvcHBvc2VkIHRvIHRoZSB2YWx1ZSBpbiBGMikuIFRoaXMgbWlnaHQKKyMgbm90IGJlIHRoZSByaWdodCBpZGVhLCBlLmcuIGNvbnNpZGVyOgorIworIyAgIGZlYXR1cmUgdmFyaWFudCA6IGRlYnVnIC4uLiA7CisjICAgICAgICA8dmFyaWFudD5kZWJ1ZyA6IC4uLi4gPHJ1bnRpbWUtZGVidWdnaW5nPm9uCisjICAgZmVhdHVyZSA8cnVudGltZS1kZWJ1Z2dpbmc+IDogb2ZmIG9uIDsKKyMKKyMgICBIZXJlLCB3aGVuIGFkZGluZyBkZWZhdWx0IGZvciBhbiBlbXB0eSBwcm9wZXJ0eSBzZXQsIHdlJ2xsIGdldAorIworIyAgICAgPHZhcmlhbnQ+ZGVidWcgPHJ1bnRpbWVfZGVidWdnaW5nPm9mZgorIworIyAgIGFuZCB0aGF0J3Mga2luZCBvZiBzdHJhbmdlLgorIworcnVsZSBhZGQtZGVmYXVsdHMgKCBwcm9wZXJ0aWVzICogKQoreworICAgIGZvciBsb2NhbCB2IGluICQocHJvcGVydGllczpHPSkKKyAgICB7CisgICAgICAgIGlmICQodikgaW4gJChwcm9wZXJ0aWVzKQorICAgICAgICB7CisgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciBhZGQtZGVmYXVsdHMgcmVxdWlyZXMgZXhwbGljaXRseSBzcGVjaWZpZWQgZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgYnV0IFwiJCh2KVwiIGFwcGVhcnMgdG8gYmUgdGhlIHZhbHVlIG9mIGFuIHVuLWV4cGFuZGVkIGltcGxpY2l0CisgICAgICAgICAgICAgICAgZmVhdHVyZSA7CisgICAgICAgIH0KKyAgICB9CisgICAgIyBXZSBkb24ndCBhZGQgZGVmYXVsdCBmb3IgZWxlbWVudHMgd2l0aCAiOiIgaW5zaWRlLiBUaGlzIGNhdGNoZXM6CisgICAgIyAxLiBDb25kaXRpb25hbCBwcm9wZXJ0aWVzIC0tLSB3ZSBkb24ndCB3YW50IDx2YXJpYW50PmRlYnVnOjxkZWZpbmU+REVCVUcKKyAgICAjICAgIHRvIGJlIHRha2VzIGFzIHNwZWNpZmllZCB2YWx1ZSBmb3IgPHZhcmlhbnQ+CisgICAgIyAyLiBGcmVlIHByb3BlcnRpZXMgd2l0aCAiOiIgaW4gdmFsdWVzLiBXZSBkb24ndCBjYXJlLCBzaW5jZSBmcmVlCisgICAgIyAgICBwcm9wZXJ0aWVzIGRvbid0IGhhdmUgZGVmYXVsdHMuCisgICAgbG9jYWwgeHByb3BlcnRpZXMgPSBbIE1BVENIICJeKFteOl0rKSQiIDogJChwcm9wZXJ0aWVzKSBdIDsKKyAgICBsb2NhbCBtaXNzaW5nLXRvcCA9IFsgc2V0LmRpZmZlcmVuY2UgJCguYWxsLXRvcC1mZWF0dXJlcykgOiAkKHhwcm9wZXJ0aWVzOkcpIF0gOworICAgIGxvY2FsIG1vcmUgPSAgWyBkZWZhdWx0cyAkKG1pc3NpbmctdG9wKSBdIDsKKyAgICBwcm9wZXJ0aWVzICs9ICQobW9yZSkgOworICAgIHhwcm9wZXJ0aWVzICs9ICQobW9yZSkgOworCisgICAgIyBBZGQgZGVmYXVsdHMgZm9yIHN1YmZlYXR1cmVzIG9mIGZlYXR1cmVzIHdoaWNoIGFyZSBwcmVzZW50LgorICAgIGZvciBsb2NhbCBwIGluICQoeHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBsb2NhbCBzID0gJCgkKHA6Rykuc3ViZmVhdHVyZXMpIDsKKyAgICAgICAgbG9jYWwgZiA9IFsgdXRpbGl0eS51bmdyaXN0ICQocDpHKSBdIDsKKyAgICAgICAgbG9jYWwgbWlzc2luZy1zdWJzID0gWyBzZXQuZGlmZmVyZW5jZSA8JChmKS0kKHMpPiA6ICQocHJvcGVydGllczpHKSBdIDsKKyAgICAgICAgcHJvcGVydGllcyArPSBbIGRlZmF1bHRzIFsgc2VsZWN0LXN1YmZlYXR1cmVzICQocCkgOiAkKG1pc3Npbmctc3VicykgXSBdIDsKKyAgICB9CisKKyAgICByZXR1cm4gJChwcm9wZXJ0aWVzKSAgOworfQorCisKKyMgR2l2ZW4gYSBwcm9wZXJ0eS1zZXQgb2YgdGhlIGZvcm0KKyMgICAgICAgdjEvdjIvLi4udk4tMS88Zk4+dk4vPGZOKzE+dk4rMS8uLi48Zk0+dk0KKyMKKyMgUmV0dXJucworIyAgICAgICB2MSB2MiAuLi4gdk4tMSA8Zk4+dk4gPGZOKzE+dk4rMSAuLi4gPGZNPnZNCisjCisjIE5vdGUgdGhhdCB2Ti4uLnZNIG1heSBjb250YWluIHNsYXNoZXMuIFRoaXMgbmVlZHMgdG8gYmUgcmVzaWxpZW50IHRvIHRoZQorIyBzdWJzdGl0dXRpb24gb2YgYmFja3NsYXNoZXMgZm9yIHNsYXNoZXMsIHNpbmNlIEphbSwgdW5iaWRkZW4sIHNvbWV0aW1lcyBzd2FwcworIyBzbGFzaCBkaXJlY3Rpb24gb24gTlQuCisjCitydWxlIHNwbGl0ICggcHJvcGVydHktc2V0ICkKK3sKKyAgICBsb2NhbCBwaWVjZXMgPSBbIHJlZ2V4LnNwbGl0ICQocHJvcGVydHktc2V0KSBbXFwvXSBdIDsKKyAgICBsb2NhbCByZXN1bHQgOworCisgICAgZm9yIGxvY2FsIHggaW4gJChwaWVjZXMpCisgICAgeworICAgICAgICBpZiAoICEgJCh4OkcpICkgJiYgJChyZXN1bHRbLTFdOkcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICQocmVzdWx0WzEtLTJdKSAkKHJlc3VsdFstMV0pLyQoeCkgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICQoeCkgOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBUZXN0cyBvZiBtb2R1bGUgZmVhdHVyZS4KKyMKK3J1bGUgX190ZXN0X18gKCApCit7CisgICAgIyBVc2UgYSBmcmVzaCBjb3B5IG9mIHRoZSBmZWF0dXJlIG1vZHVsZS4KKyAgICBwcmVwYXJlLXRlc3QgZmVhdHVyZS10ZXN0LXRlbXAgOworCisgICAgaW1wb3J0IGFzc2VydCA7CisgICAgaW1wb3J0IGVycm9ycyA6IHRyeSBjYXRjaCA7CisKKyAgICAjIFRoZXNlIGFyZSBsb2NhbCBydWxlcyBhbmQgc28gbXVzdCBiZSBleHBsaWNpdGx5IHJlaW1wb3J0ZWQgaW50byB0aGUKKyAgICAjIHRlc3RpbmcgbW9kdWxlLgorICAgIGltcG9ydCBmZWF0dXJlIDogZXh0ZW5kLWZlYXR1cmUgdmFsaWRhdGUtZmVhdHVyZSBzZWxlY3Qtc3ViZmVhdHVyZXMgOworCisgICAgZmVhdHVyZSB0b29sc2V0IDogZ2NjIDogaW1wbGljaXQgOworICAgIGZlYXR1cmUgZGVmaW5lIDogOiBmcmVlIDsKKyAgICBmZWF0dXJlIHJ1bnRpbWUtbGluayA6IGR5bmFtaWMgc3RhdGljIDogc3ltbWV0cmljIDsKKyAgICBmZWF0dXJlIG9wdGltaXphdGlvbiA6IG9uIG9mZiA7CisgICAgZmVhdHVyZSB2YXJpYW50IDogZGVidWcgcmVsZWFzZSBwcm9maWxlIDogaW1wbGljaXQgY29tcG9zaXRlIHN5bW1ldHJpYyA7CisgICAgZmVhdHVyZSBzdGRsaWIgOiBuYXRpdmUgc3RscG9ydCA7CisgICAgZmVhdHVyZSBtYWdpYyA6IDogZnJlZSA7CisKKyAgICBjb21wb3NlIDx2YXJpYW50PmRlYnVnIDogPGRlZmluZT5fREVCVUcgPG9wdGltaXphdGlvbj5vZmYgOworICAgIGNvbXBvc2UgPHZhcmlhbnQ+cmVsZWFzZSA6IDxkZWZpbmU+TkRFQlVHIDxvcHRpbWl6YXRpb24+b24gOworCisgICAgYXNzZXJ0LnJlc3VsdCBkeW5hbWljIHN0YXRpYyA6IHZhbHVlcyA8cnVudGltZS1saW5rPiA7CisgICAgYXNzZXJ0LnJlc3VsdCBkeW5hbWljIHN0YXRpYyA6IHZhbHVlcyBydW50aW1lLWxpbmsgOworCisgICAgdHJ5IDsKKyAgICB7CisgICAgICAgIGNvbXBvc2UgPHZhcmlhbnQ+cHJvZmlsZSA6IDx2YXJpYW50PnByb2ZpbGUgOworICAgIH0KKyAgICBjYXRjaCBjb21wb3NpdGUgcHJvcGVydHkgPHZhcmlhbnQ+cHJvZmlsZSBjYW5ub3QgaGF2ZSBpdHNlbGYgYXMgYSBjb21wb25lbnQgOworCisgICAgZXh0ZW5kLWZlYXR1cmUgdG9vbHNldCA6IG1zdmMgbWV0cm93ZXJrcyA7CisgICAgc3ViZmVhdHVyZSB0b29sc2V0IGdjYyA6IHZlcnNpb24gOiAyLjk1LjIgMi45NS4zIDIuOTUuNCAzLjAgMy4wLjEgMy4wLjIgOworCisgICAgYXNzZXJ0LnRydWUgaXMtc3VidmFsdWUgdG9vbHNldCA6IGdjYyA6IHZlcnNpb24gOiAyLjk1LjMgOworICAgIGFzc2VydC5mYWxzZSBpcy1zdWJ2YWx1ZSB0b29sc2V0IDogZ2NjIDogdmVyc2lvbiA6IDEuMSA7CisKKyAgICBhc3NlcnQuZmFsc2UgaXMtc3VidmFsdWUgdG9vbHNldCA6IG1zdmMgOiB2ZXJzaW9uIDogMi45NS4zIDsKKyAgICBhc3NlcnQuZmFsc2UgaXMtc3VidmFsdWUgdG9vbHNldCA6IDogdmVyc2lvbiA6IHlhYmJhIDsKKworICAgIGZlYXR1cmUgeWFiYmEgOworICAgIHN1YmZlYXR1cmUgeWFiYmEgOiB2ZXJzaW9uIDogZGFiYmEgOworICAgIGFzc2VydC50cnVlIGlzLXN1YnZhbHVlIHlhYmJhIDogOiB2ZXJzaW9uIDogZGFiYmEgOworCisgICAgc3ViZmVhdHVyZSB0b29sc2V0IGdjYyA6IHBsYXRmb3JtIDogbGludXggY3lnd2luIDogb3B0aW9uYWwgOworCisgICAgYXNzZXJ0LnJlc3VsdCA8dG9vbHNldC1nY2M6dmVyc2lvbj4KKyAgICAgICAgOiBzZWxlY3Qtc3ViZmVhdHVyZXMgPHRvb2xzZXQ+Z2NjCisgICAgICAgIDogPHRvb2xzZXQtZ2NjOnZlcnNpb24+CisgICAgICAgICAgPHRvb2xzZXQtbXN2Yzp2ZXJzaW9uPgorICAgICAgICAgIDx0b29sc2V0LXZlcnNpb24+CisgICAgICAgICAgPHN0ZGxpYj4gOworCisgICAgc3ViZmVhdHVyZSBzdGRsaWIgOiB2ZXJzaW9uIDogMyA0IDogb3B0aW9uYWwgOworCisgICAgYXNzZXJ0LnJlc3VsdCA8c3RkbGliLXZlcnNpb24+CisgICAgICAgIDogc2VsZWN0LXN1YmZlYXR1cmVzIDxzdGRsaWI+bmF0aXZlCisgICAgICAgIDogPHRvb2xzZXQtZ2NjOnZlcnNpb24+CisgICAgICAgICAgPHRvb2xzZXQtbXN2Yzp2ZXJzaW9uPgorICAgICAgICAgIDx0b29sc2V0LXZlcnNpb24+CisgICAgICAgICAgPHN0ZGxpYi12ZXJzaW9uPiA7CisKKyAgICBhc3NlcnQucmVzdWx0IDx0b29sc2V0PmdjYyA8dG9vbHNldC1nY2M6dmVyc2lvbj4zLjAuMQorICAgICAgICA6IGV4cGFuZC1zdWJmZWF0dXJlcyA8dG9vbHNldD5nY2MtMy4wLjEgOworCisgICAgYXNzZXJ0LnJlc3VsdCA8dG9vbHNldD5nY2MgPHRvb2xzZXQtZ2NjOnZlcnNpb24+My4wLjEgPHRvb2xzZXQtZ2NjOnBsYXRmb3JtPmxpbnV4CisgICAgICAgIDogZXhwYW5kLXN1YmZlYXR1cmVzIDx0b29sc2V0PmdjYy0zLjAuMS1saW51eCA7CisKKyAgICBhc3NlcnQucmVzdWx0IDx0b29sc2V0PmdjYyA8dG9vbHNldC1nY2M6dmVyc2lvbj4zLjAuMQorICAgICAgICA6IGV4cGFuZCA8dG9vbHNldD5nY2MgPHRvb2xzZXQtZ2NjOnZlcnNpb24+My4wLjEgIDsKKworICAgIGFzc2VydC5yZXN1bHQgPGRlZmluZT5mb289eC15CisgICAgICAgIDogZXhwYW5kLXN1YmZlYXR1cmVzIDxkZWZpbmU+Zm9vPXgteSA7CisKKyAgICBhc3NlcnQucmVzdWx0IDx0b29sc2V0PmdjYyA8dG9vbHNldC1nY2M6dmVyc2lvbj4zLjAuMQorICAgICAgICA6IGV4cGFuZC1zdWJmZWF0dXJlcyBnY2MtMy4wLjEgOworCisgICAgYXNzZXJ0LnJlc3VsdCBhIGMgZQorICAgICAgICA6IGdldC12YWx1ZXMgPHg+IDogPHg+YSA8eT5iIDx4PmMgPHk+ZCA8eD5lIDsKKworICAgIGFzc2VydC5yZXN1bHQgPHRvb2xzZXQ+Z2NjIDx0b29sc2V0LWdjYzp2ZXJzaW9uPjMuMC4xCisgICAgICAgIDx2YXJpYW50PmRlYnVnIDxkZWZpbmU+X0RFQlVHIDxvcHRpbWl6YXRpb24+b24KKyAgICAgICAgOiBleHBhbmQgZ2NjLTMuMC4xIGRlYnVnIDxvcHRpbWl6YXRpb24+b24gOworCisgICAgYXNzZXJ0LnJlc3VsdCA8dmFyaWFudD5kZWJ1ZyA8ZGVmaW5lPl9ERUJVRyA8b3B0aW1pemF0aW9uPm9uCisgICAgICAgIDogZXhwYW5kIGRlYnVnIDxvcHRpbWl6YXRpb24+b24gOworCisgICAgYXNzZXJ0LnJlc3VsdCA8b3B0aW1pemF0aW9uPm9uIDx2YXJpYW50PmRlYnVnIDxkZWZpbmU+X0RFQlVHCisgICAgICAgIDogZXhwYW5kIDxvcHRpbWl6YXRpb24+b24gZGVidWcgOworCisgICAgYXNzZXJ0LnJlc3VsdCA8cnVudGltZS1saW5rPmR5bmFtaWMgPG9wdGltaXphdGlvbj5vbgorICAgICAgICA6IGRlZmF1bHRzIDxydW50aW1lLWxpbms+IDxkZWZpbmU+IDxvcHRpbWl6YXRpb24+IDsKKworICAgICMgTWFrZSBzdXJlIGRlZmF1bHRzIGlzIHJlc2lsaWVudCB0byBtaXNzaW5nIGdyaXN0LgorICAgIGFzc2VydC5yZXN1bHQgPHJ1bnRpbWUtbGluaz5keW5hbWljIDxvcHRpbWl6YXRpb24+b24KKyAgICAgICAgOiBkZWZhdWx0cyBydW50aW1lLWxpbmsgZGVmaW5lIG9wdGltaXphdGlvbiA7CisKKyAgICBmZWF0dXJlIGR1bW15IDogZHVtbXkxIGR1bW15MiA7CisgICAgc3ViZmVhdHVyZSBkdW1teSA6IHN1YmR1bW15IDogeCB5IHogOiBvcHRpb25hbCA7CisKKyAgICBmZWF0dXJlIGZ1IDogZnUxIGZ1MiA6IG9wdGlvbmFsIDsKKyAgICBzdWJmZWF0dXJlIGZ1IDogc3ViZnUgOiB4IHkgeiA6IG9wdGlvbmFsIDsKKyAgICBzdWJmZWF0dXJlIGZ1IDogc3ViZnUyIDogcSByIHMgOworCisgICAgYXNzZXJ0LnJlc3VsdCBvcHRpb25hbCA6IGF0dHJpYnV0ZXMgPGZ1PiA7CisKKyAgICBhc3NlcnQucmVzdWx0IDxydW50aW1lLWxpbms+c3RhdGljIDxkZWZpbmU+Zm9vYmFyIDxvcHRpbWl6YXRpb24+b24KKyAgICAgICAgPHRvb2xzZXQ+Z2NjOjxkZWZpbmU+Rk9PIDx0b29sc2V0PmdjYyA8dmFyaWFudD5kZWJ1ZyA8c3RkbGliPm5hdGl2ZQorICAgICAgICA8ZHVtbXk+ZHVtbXkxIDx0b29sc2V0LWdjYzp2ZXJzaW9uPjIuOTUuMgorICAgICAgICA6IGFkZC1kZWZhdWx0cyA8cnVudGltZS1saW5rPnN0YXRpYyA8ZGVmaW5lPmZvb2JhciA8b3B0aW1pemF0aW9uPm9uCisgICAgICAgICAgPHRvb2xzZXQ+Z2NjOjxkZWZpbmU+Rk9PIDsKKworICAgIGFzc2VydC5yZXN1bHQgPHJ1bnRpbWUtbGluaz5zdGF0aWMgPGRlZmluZT5mb29iYXIgPG9wdGltaXphdGlvbj5vbgorICAgICAgICA8dG9vbHNldD5nY2M6PGRlZmluZT5GT08gPGZ1PmZ1MSA8dG9vbHNldD5nY2MgPHZhcmlhbnQ+ZGVidWcKKyAgICAgICAgPHN0ZGxpYj5uYXRpdmUgPGR1bW15PmR1bW15MSA8ZnUtc3ViZnUyPnEgPHRvb2xzZXQtZ2NjOnZlcnNpb24+Mi45NS4yCisgICAgICAgIDogYWRkLWRlZmF1bHRzIDxydW50aW1lLWxpbms+c3RhdGljIDxkZWZpbmU+Zm9vYmFyIDxvcHRpbWl6YXRpb24+b24KKyAgICAgICAgICA8dG9vbHNldD5nY2M6PGRlZmluZT5GT08gPGZ1PmZ1MSA7CisKKyAgICBzZXQtZGVmYXVsdCA8cnVudGltZS1saW5rPiA6IHN0YXRpYyA7CisgICAgYXNzZXJ0LnJlc3VsdCA8cnVudGltZS1saW5rPnN0YXRpYyA6IGRlZmF1bHRzIDxydW50aW1lLWxpbms+IDsKKworICAgIGFzc2VydC5yZXN1bHQgZ2NjLTMuMC4xIGRlYnVnIDxvcHRpbWl6YXRpb24+b24KKyAgICAgICAgOiBtaW5pbWl6ZSBbIGV4cGFuZCBnY2MtMy4wLjEgZGVidWcgPG9wdGltaXphdGlvbj5vbiA8c3RkbGliPm5hdGl2ZSBdIDsKKworICAgIGFzc2VydC5yZXN1bHQgZ2NjLTMuMC4xIGRlYnVnIDxydW50aW1lLWxpbms+ZHluYW1pYworICAgICAgICA6IG1pbmltaXplCisgICAgICAgICAgWyBleHBhbmQgZ2NjLTMuMC4xIGRlYnVnIDxvcHRpbWl6YXRpb24+b2ZmIDxydW50aW1lLWxpbms+ZHluYW1pYyBdIDsKKworICAgIGFzc2VydC5yZXN1bHQgZ2NjLTMuMC4xIGRlYnVnCisgICAgICAgIDogbWluaW1pemUgWyBleHBhbmQgZ2NjLTMuMC4xIGRlYnVnIDxvcHRpbWl6YXRpb24+b2ZmIF0gOworCisgICAgYXNzZXJ0LnJlc3VsdCBkZWJ1ZyA8b3B0aW1pemF0aW9uPm9uCisgICAgICAgIDogbWluaW1pemUgWyBleHBhbmQgZGVidWcgPG9wdGltaXphdGlvbj5vbiBdIDsKKworICAgIGFzc2VydC5yZXN1bHQgZ2NjLTMuMAorICAgICAgICA6IG1pbmltaXplIDx0b29sc2V0PmdjYyA8dG9vbHNldC1nY2M6dmVyc2lvbj4zLjAgOworCisgICAgYXNzZXJ0LnJlc3VsdCBnY2MtMy4wCisgICAgICAgIDogbWluaW1pemUgPHRvb2xzZXQtZ2NjOnZlcnNpb24+My4wIDx0b29sc2V0PmdjYyA7CisKKyAgICBhc3NlcnQucmVzdWx0IDx4PnkveiA8YT5iL2MgPGQ+ZS9mCisgICAgICAgIDogc3BsaXQgPHg+eS96LzxhPmIvYy88ZD5lL2YgOworCisgICAgYXNzZXJ0LnJlc3VsdCA8eD55L3ogPGE+Yi9jIDxkPmUvZgorICAgICAgICA6IHNwbGl0IDx4PnlcXHpcXDxhPmJcXGNcXDxkPmVcXGYgOworCisgICAgYXNzZXJ0LnJlc3VsdCBhIGIgYyA8ZD5lL2YvZyA8aD5pL2ovaworICAgICAgICA6IHNwbGl0IGEvYi9jLzxkPmUvZi9nLzxoPmkvai9rIDsKKworICAgIGFzc2VydC5yZXN1bHQgYSBiIGMgPGQ+ZS9mL2cgPGg+aS9qL2sKKyAgICAgICAgOiBzcGxpdCBhXFxiXFxjXFw8ZD5lXFxmXFxnXFw8aD5pXFxqXFxrIDsKKworICAgICMgVGVzdCBlcnJvciBjaGVja2luZy4KKworICAgIHRyeSA7CisgICAgeworICAgICAgICBleHBhbmQgcmVsZWFzZSA8b3B0aW1pemF0aW9uPm9mZiA8b3B0aW1pemF0aW9uPm9uIDsKKyAgICB9CisgICAgY2F0Y2ggZXhwbGljaXRseS1zcGVjaWZpZWQgdmFsdWVzIG9mIG5vbi1mcmVlIGZlYXR1cmUgPG9wdGltaXphdGlvbj4gY29uZmxpY3QgOworCisgICAgdHJ5IDsKKyAgICB7CisgICAgICAgIHZhbGlkYXRlLWZlYXR1cmUgPGZvb2Jhcj4gOworICAgIH0KKyAgICBjYXRjaCB1bmtub3duIGZlYXR1cmUgOworCisgICAgdmFsaWRhdGUtdmFsdWUtc3RyaW5nIDx0b29sc2V0PiBnY2MgOworICAgIHZhbGlkYXRlLXZhbHVlLXN0cmluZyA8dG9vbHNldD4gZ2NjLTMuMC4xIDsKKworICAgIHRyeSA7CisgICAgeworICAgICAgICB2YWxpZGF0ZS12YWx1ZS1zdHJpbmcgPHRvb2xzZXQ+IGRpZ2l0YWxfbWFycyA7CisgICAgfQorICAgIGNhdGNoIFwiZGlnaXRhbF9tYXJzXCIgaXMgbm90IGEga25vd24gdmFsdWUgb2YgPHRvb2xzZXQ+IDsKKworICAgIHRyeSA7CisgICAgeworICAgICAgICBmZWF0dXJlIGZvb2JhciA6IDogYmF6IDsKKyAgICB9CisgICAgY2F0Y2ggdW5rbm93biBhdHRyaWJ1dGVzOiBiYXogOworCisgICAgZmVhdHVyZSBmZWF0dXJlMSA7CisgICAgdHJ5IDsKKyAgICB7CisgICAgICAgIGZlYXR1cmUgZmVhdHVyZTEgOworICAgIH0KKyAgICBjYXRjaCBmZWF0dXJlIGFscmVhZHkgZGVmaW5lZDogOworCisgICAgdHJ5IDsKKyAgICB7CisgICAgICAgIGZlYXR1cmUgZmVhdHVyZTIgOiA6IGZyZWUgaW1wbGljaXQgOworICAgIH0KKyAgICBjYXRjaCBmcmVlIGZlYXR1cmVzIGNhbm5vdCBhbHNvIGJlIGltcGxpY2l0IDsKKworICAgIHRyeSA7CisgICAgeworICAgICAgICBmZWF0dXJlIGZlYXR1cmUzIDogOiBmcmVlIHByb3BhZ2F0ZWQgOworICAgIH0KKyAgICBjYXRjaCBmcmVlIGZlYXR1cmVzIGNhbm5vdCBiZSBwcm9wYWdhdGVkIDsKKworICAgIHRyeSA7CisgICAgeworICAgICAgICBpbXBsaWVkLWZlYXR1cmUgbGFja2x1c3RlciA7CisgICAgfQorICAgIGNhdGNoIFwibGFja2x1c3RlclwiIGlzIG5vdCBhbiBpbXBsaWNpdCBmZWF0dXJlIHZhbHVlIDsKKworICAgIHRyeSA7CisgICAgeworICAgICAgICBpbXBsaWVkLXN1YmZlYXR1cmUgPHRvb2xzZXQ+IDMuMC4xIDsKKyAgICB9CisgICAgY2F0Y2ggXCIzLjAuMVwiIGlzIG5vdCBhIGtub3duIHN1YmZlYXR1cmUgdmFsdWUgb2YgPHRvb2xzZXQ+IDsKKworICAgIHRyeSA7CisgICAgeworICAgICAgICBpbXBsaWVkLXN1YmZlYXR1cmUgPHRvb2xzZXQ+IG5vdC1hLXZlcnNpb24gOiBnY2MgOworICAgIH0KKyAgICBjYXRjaCBcIm5vdC1hLXZlcnNpb25cIiBpcyBub3QgYSBrbm93biBzdWJmZWF0dXJlIHZhbHVlIG9mIDx0b29sc2V0PmdjYyA7CisKKyAgICAjIExlYXZlIGEgY2xlYW4gY29weSBvZiB0aGUgZmVhdHVyZXMgbW9kdWxlIGJlaGluZC4KKyAgICBmaW5pc2gtdGVzdCBmZWF0dXJlLXRlc3QtdGVtcCA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL2dlbmVyYXRvcnMuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9nZW5lcmF0b3JzLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzcxODNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9nZW5lcmF0b3JzLmphbQpAQCAtMCwwICsxLDE0MjAgQEAKKyMgQ29weXJpZ2h0IDIwMDIuIFZsYWRpbWlyIFBydXMKKyMgQ29weXJpZ2h0IDIwMDYuIFJlbmUgUml2ZXJhCisjCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgTWFuYWdlcyAnZ2VuZXJhdG9ycycgLS0tIG9iamVjdHMgd2hpY2ggY2FuIGRvIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gZGlmZmVyZW50CisjIHRhcmdldCB0eXBlcyBhbmQgY29udGFpbiBhbGdvcml0aG0gZm9yIGZpbmRpbmcgdHJhbnNmb3JtYXRpb24gZnJvbSBzb3VyY2VzIHRvCisjIHRhcmdldHMuCisjCisjIFRoZSBtYWluIGVudHJ5IHBvaW50IHRvIHRoaXMgbW9kdWxlIGlzIGdlbmVyYXRvcnMuY29uc3RydWN0IHJ1bGUuIEl0IGlzIGdpdmVuCisjIGEgbGlzdCBvZiBzb3VyY2UgdGFyZ2V0cywgZGVzaXJlZCB0YXJnZXQgdHlwZSBhbmQgYSBzZXQgb2YgcHJvcGVydGllcy4gSXQKKyMgc3RhcnRzIGJ5IHNlbGVjdGluZyAndmlhYmxlIGdlbmVyYXRvcnMnLCB3aGljaCBoYXZlIGFueSBjaGFuY2VzIG9mIHByb2R1Y2luZworIyB0aGUgZGVzaXJlZCB0YXJnZXQgdHlwZSB3aXRoIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzLiBHZW5lcmF0b3JzIGFyZSByYW5rZWQKKyMgYW5kIGEgc2V0IG9mIHRoZSBtb3N0IHNwZWNpZmljIG9uZXMgaXMgc2VsZWN0ZWQuCisjCisjIFRoZSBtb3N0IHNwZWNpZmljIGdlbmVyYXRvcnMgaGF2ZSB0aGVpciAncnVuJyBtZXRob2RzIGNhbGxlZCwgd2l0aCB0aGUKKyMgcHJvcGVydGllcyBhbmQgbGlzdCBvZiBzb3VyY2VzLiBFYWNoIG9uZSBzZWxlY3RzIGEgdGFyZ2V0IHdoaWNoIGNhbiBiZQorIyBkaXJlY3RseSBjb25zdW1lZCwgYW5kIHRyaWVzIHRvIGNvbnZlcnQgdGhlIHJlbWFpbmluZyBvbmVzIHRvIHRoZSB0eXBlcyBpdCBjYW4KKyMgY29uc3VtZS4gVGhpcyBpcyBkb25lIGJ5IHJlY3Vyc2l2ZWx5IGNhbGxpbmcgJ2NvbnN0cnVjdCcgd2l0aCBhbGwgY29uc3VtYWJsZQorIyB0eXBlcy4KKyMKKyMgSWYgdGhlIGdlbmVyYXRvciBoYXMgY29sbGVjdGVkIGFsbCB0aGUgdGFyZ2V0cyBpdCBuZWVkcywgaXQgY3JlYXRlcyB0YXJnZXRzCisjIGNvcnJlc3BvbmRpbmcgdG8gcmVzdWx0LCBhbmQgcmV0dXJucyBpdC4gV2hlbiBhbGwgZ2VuZXJhdG9ycyBoYXZlIGJlZW4gcnVuLAorIyByZXN1bHRzIG9mIG9uZSBvZiB0aGVtIGFyZSBzZWxlY3RlZCBhbmQgcmV0dXJuZWQgYXMgYSByZXN1bHQuCisjCisjIEl0IGlzIHF1aXRlIHBvc3NpYmxlIGZvciAnY29uc3RydWN0JyB0byByZXR1cm4gbW9yZSB0YXJnZXRzIHRoYXQgaXQgd2FzIGFza2VkCisjIGZvci4gRm9yIGV4YW1wbGUsIGlmIGl0IHdlcmUgYXNrZWQgdG8gZ2VuZXJhdGUgYSB0YXJnZXQgb2YgdHlwZSBFWEUsIGJ1dCB0aGUKKyMgb25seSBmb3VuZCBnZW5lcmF0b3IgcHJvZHVjZXMgYm90aCBFWEUgYW5kIFREUyAoZmlsZSB3aXRoIGRlYnVnKSBpbmZvcm1hdGlvbi4KKyMgVGhlIGV4dHJhIHRhcmdldCB3aWxsIGJlIHJldHVybmVkLgorIworIyBMaWtld2lzZSwgd2hlbiBnZW5lcmF0b3IgdHJpZXMgdG8gY29udmVydCBzb3VyY2VzIHRvIGNvbnN1bWFibGUgdHlwZXMsIGl0IGNhbgorIyBnZXQgbW9yZSB0YXJnZXRzIHRoYXQgaXQgd2FzIGFza2VkIGZvci4gVGhlIHF1ZXN0aW9uIGlzIHdoYXQgdG8gZG8gd2l0aCBleHRyYQorIyB0YXJnZXRzLiBCb29zdC5CdWlsZCBhdHRlbXB0cyB0byBjb252ZXJ0IHRoZW0gdG8gcmVxdWVzdGVkIHR5cGVzLCBhbmQgYXR0ZW1wdHMKKyMgdGhhdCBhcyBlYXJseSBhcyBwb3NzaWJsZS4gU3BlY2lmaWNhbGx5LCB0aGlzIGlzIGRvbmUgYWZ0ZXIgaW52b2tpbmcgZWFjaAorIyBnZW5lcmF0b3IuIFRPRE86IEFuIGV4YW1wbGUgaXMgbmVlZGVkIHRvIGRvY3VtZW50IHRoZSByYXRpb25hbGUgZm9yIHRyeWluZworIyBleHRyYSB0YXJnZXQgY29udmVyc2lvbiBhdCB0aGF0IHBvaW50LgorIworIyBJbiBvcmRlciBmb3IgdGhlIHN5c3RlbSB0byBiZSBhYmxlIHRvIHVzZSBhIHNwZWNpZmljIGdlbmVyYXRvciBpbnN0YW5jZSAnd2hlbgorIyBuZWVkZWQnLCB0aGUgaW5zdGFuY2UgbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzeXN0ZW0gdXNpbmcKKyMgZ2VuZXJhdG9ycy5yZWdpc3RlcigpIG9yIG9uZSBvZiBpdHMgcmVsYXRlZCBydWxlcy4gVW5yZWdpc3RlcmVkIGdlbmVyYXRvcnMgbWF5CisjIG9ubHkgYmUgcnVuIGV4cGxpY2l0bHkgYW5kIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgYnkgQm9vc3QuQnVpbGQgd2hlbiB3aGVuCisjIGNvbnZlcnRpbmcgYmV0d2VlbiBnaXZlbiB0YXJnZXQgdHlwZXMuCisKK2ltcG9ydCAiY2xhc3MiIDogbmV3IDsKK2ltcG9ydCBwcm9wZXJ0eS1zZXQgOworaW1wb3J0IHNlcXVlbmNlIDsKK2ltcG9ydCBzZXQgOworaW1wb3J0IHR5cGUgOworaW1wb3J0IHV0aWxpdHkgOworaW1wb3J0IHZpcnR1YWwtdGFyZ2V0IDsKKworCitpZiAiLS1kZWJ1Zy1nZW5lcmF0b3JzIiBpbiBbIG1vZHVsZXMucGVlayA6IEFSR1YgXQoreworICAgIC5kZWJ1ZyA9IHRydWUgOworfQorCisKKyMgVXBkYXRlZCBjYWNoZWQgdmlhYmxlIHNvdXJjZSB0YXJnZXQgdHlwZSBpbmZvcm1hdGlvbiBhcyBuZWVkZWQgYWZ0ZXIgYSBuZXcKKyMgdGFyZ2V0IHR5cGUgZ2V0cyBkZWZpbmVkLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGlmIGEgdGFyZ2V0IHR5cGUgaXMgYSB2aWFibGUKKyMgc291cmNlIHRhcmdldCB0eXBlIGZvciBzb21lIGdlbmVyYXRvciB0aGVuIGFsbCBvZiB0aGUgdGFyZ2V0IHR5cGUncyBkZXJpdmVkCisjIHRhcmdldCB0eXBlcyBzaG91bGQgYXV0b21hdGljYWxseSBiZSBjb25zaWRlcmVkIGFzIHZpYWJsZSBzb3VyY2UgdGFyZ2V0IHR5cGVzCisjIGZvciB0aGUgc2FtZSBnZW5lcmF0b3IgYXMgd2VsbC4gRG9lcyBub3RoaW5nIGlmIGEgbm9uLWRlcml2ZWQgdGFyZ2V0IHR5cGUgaXMKKyMgcGFzc2VkIHRvIGl0LgorIworcnVsZSB1cGRhdGUtY2FjaGVkLWluZm9ybWF0aW9uLXdpdGgtYS1uZXctdHlwZSAoIHR5cGUgKQoreworICAgIGxvY2FsIGJhc2UtdHlwZSA9IFsgdHlwZS5iYXNlICQodHlwZSkgXSA7CisgICAgaWYgJChiYXNlLXR5cGUpCisgICAgeworICAgICAgICBmb3IgbG9jYWwgZyBpbiAkKC52c3RnLWNhY2hlZC1nZW5lcmF0b3JzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKGJhc2UtdHlwZSkgaW4gJCgudnN0Zy4kKGcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC52c3RnLiQoZykgKz0gJCh0eXBlKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgbG9jYWwgdCBpbiAkKC52c3QtY2FjaGVkLXR5cGVzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKGJhc2UtdHlwZSkgaW4gJCgudnN0LiQodCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLnZzdC4kKHQpICs9ICQodHlwZSkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKyMgQ2xlYXJzIGNhY2hlZCB2aWFibGUgc291cmNlIHRhcmdldCB0eXBlIGluZm9ybWF0aW9uIGV4Y2VwdCBmb3IgdGFyZ2V0IHR5cGVzCisjIGFuZCBnZW5lcmF0b3JzIHdpdGggYWxsIHNvdXJjZSB0eXBlcyBsaXN0ZWQgYXMgdmlhYmxlLiBTaG91bGQgYmUgY2FsbGVkIHdoZW4KKyMgc29tZXRoaW5nIGludmFsaWRhdGVzIHRob3NlIGNhY2hlZCB2YWx1ZXMgYnkgcG9zc2libHkgY2F1c2luZyBzb21lIG5ldyBzb3VyY2UKKyMgdHlwZXMgdG8gYmVjb21lIHZpYWJsZS4KKyMKK2xvY2FsIHJ1bGUgaW52YWxpZGF0ZS1leHRlbmRhYmxlLXZpYWJsZS1zb3VyY2UtdGFyZ2V0LXR5cGUtY2FjaGUgKCApCit7CisgICAgbG9jYWwgZ2VuZXJhdG9ycy13aXRoLWNhY2hlZC1zb3VyY2UtdHlwZXMgPSAkKC52c3RnLWNhY2hlZC1nZW5lcmF0b3JzKSA7CisgICAgLnZzdGctY2FjaGVkLWdlbmVyYXRvcnMgPSA7CisgICAgZm9yIGxvY2FsIGcgaW4gJChnZW5lcmF0b3JzLXdpdGgtY2FjaGVkLXNvdXJjZS10eXBlcykKKyAgICB7CisgICAgICAgIGlmICQoLnZzdGcuJChnKSkgPSAqCisgICAgICAgIHsKKyAgICAgICAgICAgIC52c3RnLWNhY2hlZC1nZW5lcmF0b3JzICs9ICQoZykgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLnZzdGcuJChnKSA9IDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxvY2FsIHR5cGVzLXdpdGgtY2FjaGVkLXNvdXJjZS10eXBlcyA9ICQoLnZzdC1jYWNoZWQtdHlwZXMpIDsKKyAgICAudnN0LWNhY2hlZC10eXBlcyA9IDsKKyAgICBmb3IgbG9jYWwgdCBpbiAkKHR5cGVzLXdpdGgtY2FjaGVkLXNvdXJjZS10eXBlcykKKyAgICB7CisgICAgICAgIGlmICQoLnZzdC4kKHQpKSA9ICoKKyAgICAgICAgeworICAgICAgICAgICAgLnZzdC1jYWNoZWQtdHlwZXMgKz0gJCh0KSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAudnN0LiQodCkgPSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyBPdXRwdXRzIGEgZGVidWcgbWVzc2FnZSBpZiBnZW5lcmF0b3JzIGRlYnVnZ2luZyBpcyBvbi4gRWFjaCBlbGVtZW50IG9mCisjICdtZXNzYWdlJyBpcyBjaGVja2VkIHRvIHNlZSBpZiBpdCBpcyBhIGNsYXNzIGluc3RhbmNlLiBJZiBzbywgaW5zdGVhZCBvZiB0aGUKKyMgdmFsdWUsIHRoZSByZXN1bHQgb2YgJ3N0cicgY2FsbCBpcyBvdXRwdXQuCisjCitsb2NhbCBydWxlIGdlbmVyYXRvcnMuZG91dCAoIG1lc3NhZ2UgKiApCit7CisgICAgaWYgJCguZGVidWcpCisgICAgeworICAgICAgICBFQ0hPIFsgc2VxdWVuY2UudHJhbnNmb3JtIHV0aWxpdHkuc3RyIDogJChtZXNzYWdlKSBdIDsKKyAgICB9Cit9CisKKworbG9jYWwgcnVsZSBpbmRlbnQgKCApCit7CisgICAgcmV0dXJuICQoLmluZGVudDpKPSIiKSA7Cit9CisKKworbG9jYWwgcnVsZSBpbmNyZWFzZS1pbmRlbnQgKCApCit7CisgICAgLmluZGVudCArPSAiICAgICIgOworfQorCisKK2xvY2FsIHJ1bGUgZGVjcmVhc2UtaW5kZW50ICggKQoreworICAgIC5pbmRlbnQgPSAkKC5pbmRlbnRbMi1dKSA7Cit9CisKKworIyBNb2RlbHMgYSBnZW5lcmF0b3IuCisjCitjbGFzcyBnZW5lcmF0b3IKK3sKKyAgICBpbXBvcnQgImNsYXNzIiA6IG5ldyA7CisgICAgaW1wb3J0IGZlYXR1cmUgOworICAgIGltcG9ydCBnZW5lcmF0b3JzIDogaW5kZW50IGluY3JlYXNlLWluZGVudCBkZWNyZWFzZS1pbmRlbnQgZ2VuZXJhdG9ycy5kb3V0IDsKKyAgICBpbXBvcnQgdXRpbGl0eSA7CisgICAgaW1wb3J0IHBhdGggOworICAgIGltcG9ydCBwcm9wZXJ0eSA7CisgICAgaW1wb3J0IHNlcXVlbmNlIDsKKyAgICBpbXBvcnQgc2V0IDsKKyAgICBpbXBvcnQgdHlwZSA7CisgICAgaW1wb3J0IHZpcnR1YWwtdGFyZ2V0IDsKKworICAgIEVYUE9SVCBjbGFzc0BnZW5lcmF0b3IgOiBpbmRlbnQgaW5jcmVhc2UtaW5kZW50IGRlY3JlYXNlLWluZGVudAorICAgICAgICBnZW5lcmF0b3JzLmRvdXQgOworCisgICAgcnVsZSBfX2luaXRfXyAoCisgICAgICAgIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAjIElkZW50aWZpZXMgdGhlIGdlbmVyYXRvciAtIHNob3VsZCBiZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9mIHRoZSBydWxlIHdoaWNoIHNldHMgdXAgdGhlIGJ1aWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFjdGlvbnMuCisKKyAgICAgICAgY29tcG9zaW5nID8gICAgICAgICAgICAgICAgICMgV2hldGhlciBnZW5lcmF0b3IgcHJvY2Vzc2VzIGVhY2ggc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhcmdldCBpbiB0dXJuLCBjb252ZXJ0aW5nIGl0IHRvIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHR5cGVzLiBPcmRpbmFyeSBnZW5lcmF0b3JzIHBhc3MgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNvdXJjZXMgdG9nZXRoZXIgdG8gdGhlIHJlY3Vyc2l2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZW5lcmF0b3JzLmNvbnN0cnVjdC10eXBlcyBjYWxsLgorCisgICAgICAgIDogc291cmNlLXR5cGVzICogICAgICAgICAgICAjIFR5cGVzIHRoYXQgdGhpcyBnZW5lcmF0b3IgY2FuIGhhbmRsZS4gSWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZW1wdHksIHRoZSBnZW5lcmF0b3IgY2FuIGNvbnN1bWUgYW55dGhpbmcuCisKKyAgICAgICAgOiB0YXJnZXQtdHlwZXMtYW5kLW5hbWVzICsgICMgVHlwZXMgdGhlIGdlbmVyYXRvciB3aWxsIGNyZWF0ZSBhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsbHksIG5hbWVzIGZvciBjcmVhdGVkIHRhcmdldHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVhY2ggZWxlbWVudCBzaG91bGQgaGF2ZSB0aGUgZm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0eXBlWyIoIiBuYW1lLXBhdHRlcm4gIikiXSwgZm9yIGV4YW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9iaiglX3gpLiBHZW5lcmF0ZWQgdGFyZ2V0IG5hbWUgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3VuZCBieSByZXBsYWNpbmcgJSB3aXRoIHRoZSBuYW1lIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNvdXJjZSwgcHJvdmlkZWQgYW4gZXhwbGljaXQgbmFtZSB3YXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNwZWNpZmllZC4KKworICAgICAgICA6IHJlcXVpcmVtZW50cyAqCisgICAgKQorICAgIHsKKyAgICAgICAgc2VsZi5pZCA9ICQoaWQpIDsKKyAgICAgICAgc2VsZi5ydWxlLW5hbWUgPSAkKGlkKSA7CisgICAgICAgIHNlbGYuY29tcG9zaW5nID0gJChjb21wb3NpbmcpIDsKKyAgICAgICAgc2VsZi5zb3VyY2UtdHlwZXMgPSAkKHNvdXJjZS10eXBlcykgOworICAgICAgICBzZWxmLnRhcmdldC10eXBlcy1hbmQtbmFtZXMgPSAkKHRhcmdldC10eXBlcy1hbmQtbmFtZXMpIDsKKyAgICAgICAgc2VsZi5yZXF1aXJlbWVudHMgPSAkKHJlcXVpcmVtZW50cykgOworCisgICAgICAgIGZvciBsb2NhbCBlIGluICQodGFyZ2V0LXR5cGVzLWFuZC1uYW1lcykKKyAgICAgICAgeworICAgICAgICAgICAgIyBDcmVhdGUgdGhyZWUgcGFyYWxsZWwgbGlzdHM6IG9uZSB3aXRoIHRoZSBsaXN0IG9mIHRhcmdldCB0eXBlcywKKyAgICAgICAgICAgICMgYW5kIHR3byBvdGhlciB3aXRoIHByZWZpeGVzIGFuZCBwb3N0Zml4ZXMgdG8gYmUgYWRkZWQgdG8gdGFyZ2V0CisgICAgICAgICAgICAjIG5hbWUuIFdlIHVzZSBwYXJhbGxlbCBsaXN0cyBmb3IgcHJlZml4IGFuZCBwb3N0Zml4IChhcyBvcHBvc2VkIHRvCisgICAgICAgICAgICAjIG1hcHBpbmcpLCBiZWNhdXNlIGdpdmVuIHRhcmdldCB0eXBlIG1pZ2h0IG9jY3VyIHNldmVyYWwgdGltZXMsIGZvcgorICAgICAgICAgICAgIyBleGFtcGxlICJIIEgoJV9zeW1ib2xzKSIuCisgICAgICAgICAgICBsb2NhbCBtID0gWyBNQVRDSCAoW15cXChdKikoXFwoKC4qKSUoLiopXFwpKT8gOiAkKGUpIF0gOworICAgICAgICAgICAgc2VsZi50YXJnZXQtdHlwZXMgKz0gJChtWzFdKSA7CisgICAgICAgICAgICBzZWxmLm5hbWUtcHJlZml4ICs9ICQobVszXTpFPSIiKSA7CisgICAgICAgICAgICBzZWxmLm5hbWUtcG9zdGZpeCArPSAkKG1bNF06RT0iIikgOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgbG9jYWwgciBpbiBbIHJlcXVpcmVtZW50cyBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQocjpHPSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxmLnByb3BlcnR5LXJlcXVpcmVtZW50cyArPSAkKHIpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxmLmZlYXR1cmUtcmVxdWlyZW1lbnRzICs9ICQocikgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBOb3RlIHRoYXQgJ3RyYW5zZm9ybScgaGVyZSwgaXMgdGhlIHNhbWUgYXMgJ2Zvcl9lYWNoJy4KKyAgICAgICAgc2VxdWVuY2UudHJhbnNmb3JtIHR5cGUudmFsaWRhdGUgOiAkKHNlbGYuc291cmNlLXR5cGVzKSA7CisgICAgICAgIHNlcXVlbmNlLnRyYW5zZm9ybSB0eXBlLnZhbGlkYXRlIDogJChzZWxmLnRhcmdldC10eXBlcykgOworICAgIH0KKworICAgICMjIyMjIyMjIyMjIyMjIyMjIEVuZCBvZiBjb25zdHJ1Y3RvciAjIyMjIyMjIyMjIyMjIyMjIworCisgICAgcnVsZSBpZCAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYuaWQpIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdGhlIGxpc3Qgb2YgdGFyZ2V0IHR5cGUgdGhlIGdlbmVyYXRvciBhY2NlcHRzLgorICAgICMKKyAgICBydWxlIHNvdXJjZS10eXBlcyAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYuc291cmNlLXR5cGVzKSA7CisgICAgfQorCisgICAgIyBSZXR1cm5zIHRoZSBsaXN0IG9mIHRhcmdldCB0eXBlcyB0aGF0IHRoaXMgZ2VuZXJhdG9yIHByb2R1Y2VzLiBJdCBpcworICAgICMgYXNzdW1lZCB0byBiZSBhbHdheXMgdGhlIHNhbWUgLS0gaS5lLiBpdCBjYW4gbm90IGNoYW5nZSBkZXBlbmRpbmcgb24gc29tZQorICAgICMgcHJvdmlkZWQgbGlzdCBvZiBzb3VyY2VzLgorICAgICMKKyAgICBydWxlIHRhcmdldC10eXBlcyAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYudGFyZ2V0LXR5cGVzKSA7CisgICAgfQorCisgICAgIyBSZXR1cm5zIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciB0aGlzIGdlbmVyYXRvci4gUHJvcGVydGllcyBpbiByZXR1cm5lZAorICAgICMgc2V0IG11c3QgYmUgcHJlc2VudCBpbiBidWlsZCBwcm9wZXJ0aWVzIGlmIHRoaXMgZ2VuZXJhdG9yIGlzIHRvIGJlIHVzZWQuCisgICAgIyBJZiByZXN1bHQgaGFzIGdyaXN0LW9ubHkgZWxlbWVudCwgdGhhdCBidWlsZCBwcm9wZXJ0aWVzIG11c3QgaW5jbHVkZSBzb21lCisgICAgIyB2YWx1ZSBvZiB0aGF0IGZlYXR1cmUuCisgICAgIworICAgICMgWFhYOiByZW1vdmUgdGhpcyBtZXRob2Q/CisgICAgIworICAgIHJ1bGUgcmVxdWlyZW1lbnRzICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi5yZXF1aXJlbWVudHMpIDsKKyAgICB9CisKKyAgICBydWxlIHNldC1ydWxlLW5hbWUgKCBydWxlLW5hbWUgKQorICAgIHsKKyAgICAgICAgc2VsZi5ydWxlLW5hbWUgPSAkKHJ1bGUtbmFtZSkgOworICAgIH0KKworICAgIHJ1bGUgcnVsZS1uYW1lICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi5ydWxlLW5hbWUpIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgYSB0cnVlIHZhbHVlIGlmIHRoZSBnZW5lcmF0b3IgY2FuIGJlIHJ1biB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAjIHByb3BlcnRpZXMuCisgICAgIworICAgIHJ1bGUgbWF0Y2gtcmFuayAoIHByb3BlcnR5LXNldC10by1tYXRjaCApCisgICAgeworICAgICAgICAjIFNlZSBpZiBnZW5lcmF0b3IgcmVxdWlyZW1lbnRzIGFyZSBzYXRpc2ZpZWQgYnkgJ3Byb3BlcnRpZXMnLiBUcmVhdCBhCisgICAgICAgICMgZmVhdHVyZSBuYW1lIGluIHJlcXVpcmVtZW50cyAoaS5lLiBncmlzdC1vbmx5IGVsZW1lbnQpLCBhcyBtYXRjaGluZworICAgICAgICAjIGFueSB2YWx1ZSBvZiB0aGUgZmVhdHVyZS4KKworICAgICAgICBpZiBbICQocHJvcGVydHktc2V0LXRvLW1hdGNoKS5jb250YWlucy1yYXcgJChzZWxmLnByb3BlcnR5LXJlcXVpcmVtZW50cykgXSAmJgorICAgICAgICAgICAgWyAkKHByb3BlcnR5LXNldC10by1tYXRjaCkuY29udGFpbnMtZmVhdHVyZXMgJChzZWxmLmZlYXR1cmUtcmVxdWlyZW1lbnRzKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFJldHVybnMgYW5vdGhlciBnZW5lcmF0b3Igd2hpY2ggZGlmZmVycyBmcm9tICQoc2VsZikgaW4KKyAgICAjICAgLSBpZAorICAgICMgICAtIHZhbHVlIHRvIDx0b29sc2V0PiBmZWF0dXJlIGluIHByb3BlcnRpZXMKKyAgICAjCisgICAgcnVsZSBjbG9uZSAoIG5ldy1pZCA6IG5ldy10b29sc2V0LXByb3BlcnRpZXMgKyApCisgICAgeworICAgICAgICBsb2NhbCBnID0gWyBuZXcgJChfX2NsYXNzX18pICQobmV3LWlkKSAkKHNlbGYuY29tcG9zaW5nKSA6CisgICAgICAgICAgICAkKHNlbGYuc291cmNlLXR5cGVzKSA6ICQoc2VsZi50YXJnZXQtdHlwZXMtYW5kLW5hbWVzKSA6CisgICAgICAgICAgICAjIE5vdGU6IHRoaXMgZG9lcyBub3QgcmVtb3ZlIGFueSBzdWJmZWF0dXJlcyBvZiA8dG9vbHNldD4gd2hpY2gKKyAgICAgICAgICAgICMgbWlnaHQgY2F1c2UgcHJvYmxlbXMuCisgICAgICAgICAgICBbIHByb3BlcnR5LmNoYW5nZSAkKHNlbGYucmVxdWlyZW1lbnRzKSA6IDx0b29sc2V0PiBdCisgICAgICAgICAgICAkKG5ldy10b29sc2V0LXByb3BlcnRpZXMpIF0gOworICAgICAgICByZXR1cm4gJChnKSA7CisgICAgfQorCisgICAgIyBDcmVhdGVzIGFub3RoZXIgZ2VuZXJhdG9yIHRoYXQgaXMgdGhlIHNhbWUgYXMgJChzZWxmKSwgZXhjZXB0IHRoYXQgaWYKKyAgICAjICdiYXNlJyBpcyBpbiB0YXJnZXQgdHlwZXMgb2YgJChzZWxmKSwgJ3R5cGUnIHdpbGwgaW4gdGFyZ2V0IHR5cGVzIG9mIHRoZQorICAgICMgbmV3IGdlbmVyYXRvci4KKyAgICAjCisgICAgcnVsZSBjbG9uZS1hbmQtY2hhbmdlLXRhcmdldC10eXBlICggYmFzZSA6IHR5cGUgKQorICAgIHsKKyAgICAgICAgbG9jYWwgdGFyZ2V0LXR5cGVzIDsKKyAgICAgICAgZm9yIGxvY2FsIHQgaW4gJChzZWxmLnRhcmdldC10eXBlcy1hbmQtbmFtZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIG0gPSBbIE1BVENIIChbXlxcKF0qKShcXCguKlxcKSk/IDogJCh0KSBdIDsKKyAgICAgICAgICAgIGlmICQobSkgPSAkKGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGVzICs9ICQodHlwZSkkKG1bMl06RT0iIikgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRhcmdldC10eXBlcyArPSAkKHQpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIGcgPSBbIG5ldyAkKF9fY2xhc3NfXykgJChzZWxmLmlkKSAkKHNlbGYuY29tcG9zaW5nKSA6CisgICAgICAgICAgICAkKHNlbGYuc291cmNlLXR5cGVzKSA6ICQodGFyZ2V0LXR5cGVzKSA6ICQoc2VsZi5yZXF1aXJlbWVudHMpIF0gOworICAgICAgICBpZiAkKHNlbGYucnVsZS1uYW1lKQorICAgICAgICB7CisgICAgICAgICAgICAkKGcpLnNldC1ydWxlLW5hbWUgJChzZWxmLnJ1bGUtbmFtZSkgOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKGcpIDsKKyAgICB9CisKKyAgICAjIFRyaWVzIHRvIGludm9rZSB0aGlzIGdlbmVyYXRvciBvbiB0aGUgZ2l2ZW4gc291cmNlcy4gUmV0dXJucyBhIGxpc3Qgb2YKKyAgICAjIGdlbmVyYXRlZCB0YXJnZXRzIChpbnN0YW5jZXMgb2YgJ3ZpcnR1YWwtdGFyZ2V0JykgYW5kIG9wdGlvbmFsbHkgYSBzZXQgb2YKKyAgICAjIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIHVzYWdlLXJlcXVpcmVtZW50cyBmb3IgYWxsIHRoZSBnZW5lcmF0ZWQKKyAgICAjIHRhcmdldHMuIFJldHVybmluZyBub3RoaW5nIGZyb20gcnVuIGluZGljYXRlcyB0aGF0IHRoZSBnZW5lcmF0b3Igd2FzCisgICAgIyB1bmFibGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQuCisgICAgIworICAgIHJ1bGUgcnVuCisgICAgKAorICAgICAgICBwcm9qZWN0ICAgICAgICAgIyBQcm9qZWN0IGZvciB3aGljaCB0aGUgdGFyZ2V0cyBhcmUgZ2VuZXJhdGVkLgorICAgICAgICBuYW1lID8gICAgICAgICAgIyBVc2VkIHdoZW4gZGV0ZXJtaW5pbmcgdGhlICduYW1lJyBhdHRyaWJ1dGUgZm9yIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgIyBnZW5lcmF0ZWQgdGFyZ2V0cy4gU2VlIHRoZSAnZ2VuZXJhdGVkLXRhcmdldHMnIG1ldGhvZC4KKyAgICAgICAgOiBwcm9wZXJ0eS1zZXQgICMgRGVzaXJlZCBwcm9wZXJ0aWVzIGZvciBnZW5lcmF0ZWQgdGFyZ2V0cy4KKyAgICAgICAgOiBzb3VyY2VzICsgICAgICMgU291cmNlIHRhcmdldHMuCisgICAgKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdG9ycy5kb3V0IFsgaW5kZW50IF0gIiAgKiogZ2VuZXJhdG9yIiAkKHNlbGYuaWQpIDsKKyAgICAgICAgZ2VuZXJhdG9ycy5kb3V0IFsgaW5kZW50IF0gIiAgY29tcG9zaW5nOiIgJChzZWxmLmNvbXBvc2luZykgOworCisgICAgICAgIGlmICEgJChzZWxmLmNvbXBvc2luZykgJiYgJChzb3VyY2VzWzJdKSAmJiAkKHNlbGYuc291cmNlLXR5cGVzWzJdKQorICAgICAgICB7CisgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDogZXJyb3IgOiBlcnJvcnMuZXJyb3IgOworICAgICAgICAgICAgZXJyb3JzLmVycm9yICJVbnN1cHBvcnRlZCBzb3VyY2Uvc291cmNlLXR5cGUgY29tYmluYXRpb24iIDsKKyAgICAgICAgfQorCisgICAgICAgICMgV2UgZG8gbm90IHJ1biBjb21wb3NpbmcgZ2VuZXJhdG9ycyBpZiBubyBuYW1lIGlzIHNwZWNpZmllZC4gVGhlIHJlYXNvbgorICAgICAgICAjIGlzIHRoYXQgY29tcG9zaW5nIGdlbmVyYXRvciBjb21iaW5lcyBzZXZlcmFsIHRhcmdldHMsIHdoaWNoIGNhbiBoYXZlCisgICAgICAgICMgZGlmZmVyZW50IG5hbWVzLCBhbmQgaXQgY2Fubm90IGRlY2lkZSB3aGljaCBuYW1lIHRvIGdpdmUgZm9yIHByb2R1Y2VkCisgICAgICAgICMgdGFyZ2V0LiBUaGVyZWZvcmUsIHRoZSBuYW1lIG11c3QgYmUgcGFzc2VkLgorICAgICAgICAjCisgICAgICAgICMgVGhpcyBpbiBlZmZlY3QsIG1lYW5zIHRoYXQgY29tcG9zaW5nIGdlbmVyYXRvcnMgYXJlIHJ1bm5hYmxlIG9ubHkgYXQKKyAgICAgICAgIyB0aGUgdG9wLWxldmVsIG9mIGEgdHJhbnNmb3JtYXRpb24gZ3JhcGgsIG9yIGlmIHRoZWlyIG5hbWUgaXMgcGFzc2VkCisgICAgICAgICMgZXhwbGljaXRseS4gVGh1cywgd2UgZGlzc2FsbG93IGNvbXBvc2luZyBnZW5lcmF0b3JzIGluIHRoZSBtaWRkbGUuIEZvcgorICAgICAgICAjIGV4YW1wbGUsIHRoZSB0cmFuc2Zvcm1hdGlvbiBDUFAgLT4gT0JKIC0+IFNUQVRJQ19MSUIgLT4gUlNQIC0+IEVYRQorICAgICAgICAjIHdpbGwgbm90IGJlIGFsbG93ZWQgYXMgdGhlIE9CSiAtPiBTVEFUSUNfTElCIGdlbmVyYXRvciBpcyBjb21wb3NpbmcuCisgICAgICAgIGlmICEgJChzZWxmLmNvbXBvc2luZykgfHwgJChuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBydW4tcmVhbGx5ICQocHJvamVjdCkgJChuYW1lKSA6ICQocHJvcGVydHktc2V0KSA6ICQoc291cmNlcykgOworICAgICAgICB9CisgICAgfQorCisgICAgcnVsZSBydW4tcmVhbGx5ICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICsgKQorICAgIHsKKyAgICAgICAgIyBUYXJnZXRzIHRoYXQgdGhpcyBnZW5lcmF0b3Igd2lsbCBjb25zdW1lIGRpcmVjdGx5LgorICAgICAgICBsb2NhbCBjb25zdW1lZCA9IDsKKyAgICAgICAgIyBUYXJnZXRzIHRoYXQgY2FuIG5vdCBiZSBjb25zdW1lZCBhbmQgd2lsbCBiZSByZXR1cm5lZCBhcy1pcy4KKyAgICAgICAgbG9jYWwgYnlwYXNzZWQgPSA7CisKKyAgICAgICAgaWYgJChzZWxmLmNvbXBvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3VtZWQgPSBbIGNvbnZlcnQtbXVsdGlwbGUtc291cmNlcy10by1jb25zdW1hYmxlLXR5cGVzICQocHJvamVjdCkKKyAgICAgICAgICAgICAgICA6ICQocHJvcGVydHktc2V0KSA6ICQoc291cmNlcykgXSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdW1lZCA9IFsgY29udmVydC10by1jb25zdW1hYmxlLXR5cGVzICQocHJvamVjdCkgJChuYW1lKQorICAgICAgICAgICAgICAgIDogJChwcm9wZXJ0eS1zZXQpIDogJChzb3VyY2VzKSBdIDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIHJlc3VsdCA7CisgICAgICAgIGlmICQoY29uc3VtZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFsgY29uc3RydWN0LXJlc3VsdCAkKGNvbnN1bWVkKSA6ICQocHJvamVjdCkgJChuYW1lKSA6CisgICAgICAgICAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICB9CisKKyAgICAgICAgaWYgJChyZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdlbmVyYXRvcnMuZG91dCBbIGluZGVudCBdICIgIFNVQ0NFU1M6ICIgJChyZXN1bHQpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdlbmVyYXRvcnMuZG91dCBbIGluZGVudCBdICIgIEZBSUxVUkUiIDsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0b3JzLmRvdXQgOworICAgICAgICByZXR1cm4gJChyZXN1bHQpIDsKKyAgICB9CisKKyAgICAjIENvbnN0cnVjdHMgdGhlIGRlcGVuZGVuY3kgZ3JhcGggdG8gYmUgcmV0dXJuZWQgYnkgdGhpcyBnZW5lcmF0b3IuCisgICAgIworICAgIHJ1bGUgY29uc3RydWN0LXJlc3VsdAorICAgICgKKyAgICAgICAgY29uc3VtZWQgKyAgICAgICAgIyBBbHJlYWR5IHByZXBhcmVkIGxpc3Qgb2YgY29uc3VtYWJsZSB0YXJnZXRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAjIENvbXBvc2luZyBnZW5lcmF0b3JzIG1heSByZWNlaXZlIG11bHRpcGxlIHNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbGwgb2Ygd2hpY2ggd2lsbCBoYXZlIHR5cGVzIG1hdGNoaW5nIHRob3NlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgJChzZWxmLnNvdXJjZS10eXBlcykuIE5vbi1jb21wb3NpbmcgZ2VuZXJhdG9ycyB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgbXVsdGlwbGUgJChzZWxmLnNvdXJjZS10eXBlcykgd2lsbCByZWNlaXZlIGV4YWN0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZW4gJChzZWxmLnNvdXJjZS10eXBlcykgc291cmNlcyB3aXRoIHR5cGVzIG1hdGNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhvc2UgaW4gJChzZWxmLnNvdXJjZS10eXBlcykuIEFuZCBub24tY29tcG9zaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2VuZXJhdG9ycyB3aXRoIG9ubHkgYSBzaW5nbGUgc291cmNlIHR5cGUgbWF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVjZWl2ZSBtdWx0aXBsZSBzb3VyY2VzIHdpdGggYWxsIG9mIHRoZW0gb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHlwZSBsaXN0ZWQgaW4gJChzZWxmLnNvdXJjZS10eXBlcykuCisgICAgICAgIDogcHJvamVjdCBuYW1lID8KKyAgICAgICAgOiBwcm9wZXJ0eS1zZXQgICAgIyBQcm9wZXJ0aWVzIHRvIGJlIHVzZWQgZm9yIGFsbCBhY3Rpb25zIGNyZWF0ZWQgaGVyZS4KKyAgICApCisgICAgeworICAgICAgICBsb2NhbCByZXN1bHQgOworICAgICAgICAjIElmIHRoaXMgaXMgYSAxLT4xIHRyYW5zZm9ybWF0aW9uLCBhcHBseSBpdCB0byBhbGwgY29uc3VtZWQgdGFyZ2V0cyBpbgorICAgICAgICAjIG9yZGVyLgorICAgICAgICBpZiAhICQoc2VsZi5zb3VyY2UtdHlwZXNbMl0pICYmICEgJChzZWxmLmNvbXBvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIGxvY2FsIHIgaW4gJChjb25zdW1lZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gWyBnZW5lcmF0ZWQtdGFyZ2V0cyAkKHIpIDogJChwcm9wZXJ0eS1zZXQpIDoKKyAgICAgICAgICAgICAgICAgICAgJChwcm9qZWN0KSAkKG5hbWUpIF0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgJChjb25zdW1lZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9IFsgZ2VuZXJhdGVkLXRhcmdldHMgJChjb25zdW1lZCkgOiAkKHByb3BlcnR5LXNldCkgOgorICAgICAgICAgICAgICAgICQocHJvamVjdCkgJChuYW1lKSBdIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChyZXN1bHQpIDsKKyAgICB9CisKKyAgICAjIERldGVybWluZSB0YXJnZXQgbmFtZSBmcm9tIGZ1bGxuYW1lIChtYXliZSBpbmNsdWRpbmcgcGF0aCBjb21wb25lbnRzKQorICAgICMgUGxhY2Ugb3B0aW9uYWwgcHJlZml4IGFuZCBwb3N0Zml4IGFyb3VuZCBiYXNlbmFtZQorICAgICMKKyAgICBydWxlIGRldGVybWluZS10YXJnZXQtbmFtZSAoIGZ1bGxuYW1lICA6IHByZWZpeCA/IDogcG9zdGZpeCA/ICkKKyAgICB7CisgICAgICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYWRkIGRpcmVjdG9yeSB0byB0aGUgdGFyZ2V0IG5hbWUuCisgICAgICAgIGxvY2FsIGRpciAgPSAkKGZ1bGxuYW1lOkQpIDsKKyAgICAgICAgbG9jYWwgbmFtZSA9ICQoZnVsbG5hbWU6QikgOworCisgICAgICAgIG5hbWUgPSAkKHByZWZpeDpFPSkkKG5hbWUpIDsKKyAgICAgICAgbmFtZSA9ICQobmFtZSkkKHBvc3RmaXg6RT0pIDsKKworICAgICAgICBpZiAkKGRpcikKKyAgICAgICAgICAgICMgTmV2ZXIgYXBwZW5kICcuLicgdG8gdGFyZ2V0IHBhdGguCisgICAgICAgICAgICAmJiAhIFsgTUFUQ0ggLiooXFwuXFwuKS4qIDogJChkaXIpIF0KKyAgICAgICAgICAgICYmICEgWyBwYXRoLmlzLXJvb3RlZCAkKGRpcikgXQorICAgICAgICB7CisgICAgICAgICAgICAjIFJlbGF0aXZlIHBhdGggaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiBSZXRhaW4KKyAgICAgICAgICAgICMgaXQsIHNvIHRoYXQgdXNlcnMgY2FuIGhhdmUgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHR3bworICAgICAgICAgICAgIyBkaWZmZXJlbnQgc3ViZGlyZWN0b3JpZXMuCisgICAgICAgICAgICBuYW1lID0gJChkaXIpLyQobmFtZSkgOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKG5hbWUpIDsKKyAgICB9CisKKyAgICAjIERldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjZWQgdGFyZ2V0IGZyb20gdGhlIG5hbWVzIG9mIHRoZSBzb3VyY2VzLgorICAgICMKKyAgICBydWxlIGRldGVybWluZS1vdXRwdXQtbmFtZSAoIHNvdXJjZXMgKyApCisgICAgeworICAgICAgICAjIFRoZSBzaW1wbGUgY2FzZSBpZiB3aGVuIGEgbmFtZSBvZiBzb3VyY2UgaGFzIHNpbmdsZSBkb3QuIFRoZW4sIHdlIHRha2UKKyAgICAgICAgIyB0aGUgcGFydCBiZWZvcmUgZG90LiBTZXZlcmFsIGRvdHMgY2FuIGJlIGNhdXNlZCBieToKKyAgICAgICAgIyAgIC0gdXNpbmcgc291cmNlIGZpbGUgbGlrZSBhLmhvc3QuY3BwLCBvcgorICAgICAgICAjICAgLSBhIHR5cGUgd2hvc2Ugc3VmZml4IGhhcyBhIGRvdC4gU2F5LCB3ZSBjYW4gdHlwZSAnaG9zdF9jcHAnIHdpdGgKKyAgICAgICAgIyAgICAgZXh0ZW5zaW9uICdob3N0LmNwcCcuCisgICAgICAgICMgSW4gdGhlIGZpcnN0IGNhc2UsIHdlIHdhbnQgdG8gdGFrZSB0aGUgcGFydCB1cCB0byB0aGUgbGFzdCBkb3QuIEluIHRoZQorICAgICAgICAjIHNlY29uZCBjYXNlIC0tIG5vdCBzdXJlLCBidXQgZm9yIG5vdyB0YWtlIHRoZSBwYXJ0IHVwIHRvIHRoZSBsYXN0IGRvdAorICAgICAgICAjIHRvby4KKyAgICAgICAgbmFtZSA9IFsgdXRpbGl0eS5iYXNlbmFtZSBbICQoc291cmNlc1sxXSkubmFtZSBdIF0gOworICAgICAgICBmb3IgbG9jYWwgcyBpbiAkKHNvdXJjZXNbMi1dKQorICAgICAgICB7CisgICAgICAgICAgICBpZiBbIHV0aWxpdHkuYmFzZW5hbWUgWyAkKHMpLm5hbWUgXSBdICE9ICQobmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDogZXJyb3IgOiBlcnJvcnMuZXJyb3IgOworICAgICAgICAgICAgICAgIGVycm9ycy5lcnJvciAiJChzZWxmLmlkKTogc291cmNlIHRhcmdldHMgaGF2ZSBkaWZmZXJlbnQgbmFtZXM6IGNhbm5vdCBkZXRlcm1pbmUgdGFyZ2V0IG5hbWUiIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gWyBkZXRlcm1pbmUtdGFyZ2V0LW5hbWUgWyAkKHNvdXJjZXNbMV0pLm5hbWUgXSBdIDsKKyAgICB9CisKKyAgICAjIENvbnN0cnVjdHMgdGFyZ2V0cyB0aGF0IGFyZSBjcmVhdGVkIGFmdGVyIGNvbnN1bWluZyAnc291cmNlcycuIFRoZSByZXN1bHQKKyAgICAjIHdpbGwgYmUgdGhlIGxpc3Qgb2YgdmlydHVhbC10YXJnZXQsIHdoaWNoIGhhcyB0aGUgc2FtZSBsZW5ndGggYXMgdGhlCisgICAgIyAndGFyZ2V0LXR5cGVzJyBhdHRyaWJ1dGUgYW5kIHdpdGggY29ycmVzcG9uZGluZyB0eXBlcy4KKyAgICAjCisgICAgIyBXaGVuICduYW1lJyBpcyBlbXB0eSwgYWxsIHNvdXJjZSB0YXJnZXRzIG11c3QgaGF2ZSB0aGUgc2FtZSAnbmFtZScKKyAgICAjIGF0dHJpYnV0ZSB2YWx1ZSwgd2hpY2ggd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlICduYW1lJyBhcmd1bWVudC4KKyAgICAjCisgICAgIyBUaGUgJ25hbWUnIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgZWFjaCBnZW5lcmF0ZWQgdGFyZ2V0IHdpbGwgYmUgZXF1YWwgdG8gdGhlCisgICAgIyAnbmFtZScgcGFyYW1ldGVyIGlmIHRoZXJlIGlzIG5vIG5hbWUgcGF0dGVybiBmb3IgdGhpcyB0eXBlLiBPdGhlcndpc2UsIHRoZQorICAgICMgJyUnIHN5bWJvbCBpbiB0aGUgbmFtZSBwYXR0ZXJuIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgJ25hbWUnIHBhcmFtZXRlcgorICAgICMgdG8gb2J0YWluIHRoZSAnbmFtZScgYXR0cmlidXRlLgorICAgICMKKyAgICAjIEZvciBleGFtcGxlLCBpZiB0YXJnZXRzIHR5cGVzIGFyZSBUMSBhbmQgVDIgKHdpdGggbmFtZSBwYXR0ZXJuICIlX3giKSwKKyAgICAjIHN1ZmZpeGVzIGZvciBUMSBhbmQgVDIgYXJlIC50MSBhbmQgLnQyLCBhbmQgc291cmNlIGlzIGZvby56LCB0aGVuIGNyZWF0ZWQKKyAgICAjIGZpbGVzIHdvdWxkIGJlICJmb28udDEiIGFuZCAiZm9vX3gudDIiLiBUaGUgJ25hbWUnIGF0dHJpYnV0ZSBhY3R1YWxseQorICAgICMgZGV0ZXJtaW5lcyB0aGUgYmFzZW5hbWUgb2YgYSBmaWxlLgorICAgICMKKyAgICAjIE5vdGUgdGhhdCB0aGlzIHBhdHRlcm4gbWVjaGFuaXNtIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggaW1wbGljaXQgcGF0dGVybnMKKyAgICAjIGluIG1ha2UuIEl0IGlzIGEgd2F5IHRvIHByb2R1Y2UgYSB0YXJnZXQgd2hvc2UgbmFtZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUKKyAgICAjIG5hbWUgb2YgaXRzIHNvdXJjZS4KKyAgICAjCisgICAgcnVsZSBnZW5lcmF0ZWQtdGFyZ2V0cyAoIHNvdXJjZXMgKyA6IHByb3BlcnR5LXNldCA6IHByb2plY3QgbmFtZSA/ICkKKyAgICB7CisgICAgICAgIGlmICEgJChuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBuYW1lID0gWyBkZXRlcm1pbmUtb3V0cHV0LW5hbWUgJChzb3VyY2VzKSBdIDsKKyAgICAgICAgfQorCisgICAgICAgICMgQXNzaWduIGFuIGFjdGlvbiBmb3IgZWFjaCB0YXJnZXQuCisgICAgICAgIGxvY2FsIGFjdGlvbiA9IFsgYWN0aW9uLWNsYXNzIF0gOworICAgICAgICBsb2NhbCBhID0gWyBjbGFzcy5uZXcgJChhY3Rpb24pICQoc291cmNlcykgOiAkKHNlbGYucnVsZS1uYW1lKSA6CisgICAgICAgICAgICAgICAgICAgICQocHJvcGVydHktc2V0KSBdIDsKKworICAgICAgICAjIENyZWF0ZSBnZW5lcmF0ZWQgdGFyZ2V0IGZvciBlYWNoIHRhcmdldCB0eXBlLgorICAgICAgICBsb2NhbCB0YXJnZXRzIDsKKyAgICAgICAgbG9jYWwgcHJlID0gJChzZWxmLm5hbWUtcHJlZml4KSA7CisgICAgICAgIGxvY2FsIHBvc3QgPSAkKHNlbGYubmFtZS1wb3N0Zml4KSA7CisgICAgICAgIGZvciBsb2NhbCB0IGluICQoc2VsZi50YXJnZXQtdHlwZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGdlbmVyYXRlZC1uYW1lID0gJChwcmVbMV0pJChuYW1lOkJTKSQocG9zdFsxXSkgOworICAgICAgICAgICAgZ2VuZXJhdGVkLW5hbWUgPSAkKGdlbmVyYXRlZC1uYW1lOlI9JChuYW1lOkQpKSA7CisgICAgICAgICAgICBwcmUgPSAkKHByZVsyLV0pIDsKKyAgICAgICAgICAgIHBvc3QgPSAkKHBvc3RbMi1dKSA7CisKKyAgICAgICAgICAgIHRhcmdldHMgKz0gWyBjbGFzcy5uZXcgZmlsZS10YXJnZXQgJChnZW5lcmF0ZWQtbmFtZSkgOiAkKHQpIDoKKyAgICAgICAgICAgICAgICAkKHByb2plY3QpIDogJChhKSBdIDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBbIHNlcXVlbmNlLnRyYW5zZm9ybSB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciA6ICQodGFyZ2V0cykgXSA7CisgICAgfQorCisgICAgIyBBdHRlbXB0cyB0byBjb252ZXJ0ICdzb3VyY2VzJyB0byB0YXJnZXRzIG9mIHR5cGVzIHRoYXQgdGhpcyBnZW5lcmF0b3IgY2FuCisgICAgIyBoYW5kbGUuIFRoZSBpbnRlbnRpb24gaXMgdG8gcHJvZHVjZSB0aGUgc2V0IG9mIHRhcmdldHMgdGhhdCBjYW4gYmUgdXNlZAorICAgICMgd2hlbiB0aGUgZ2VuZXJhdG9yIGlzIHJ1bi4KKyAgICAjCisgICAgcnVsZSBjb252ZXJ0LXRvLWNvbnN1bWFibGUtdHlwZXMKKyAgICAoCisgICAgICAgIHByb2plY3QgbmFtZSA/CisgICAgICAgIDogcHJvcGVydHktc2V0CisgICAgICAgIDogc291cmNlcyArCisgICAgICAgIDogb25seS1vbmUgPyAgICAjIENvbnZlcnQgJ3NvdXJjZScgdG8gb25seSBvbmUgb2YgdGhlIHNvdXJjZSB0eXBlcy4gSWYKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlcmUgaXMgbW9yZSB0aGF0IG9uZSBwb3NzaWJpbGl0eSwgcmVwb3J0IGFuIGVycm9yLgorICAgICkKKyAgICB7CisgICAgICAgIGxvY2FsIF9jb25zdW1lZCA7CisgICAgICAgIGxvY2FsIG1pc3NpbmctdHlwZXMgOworCisgICAgICAgIGlmICQoc291cmNlc1syXSkKKyAgICAgICAgeworICAgICAgICAgICAgIyBEbyBub3Qga25vdyBob3cgdG8gaGFuZGxlIHNldmVyYWwgc291cmNlcyB5ZXQuIEp1c3QgdHJ5IHRvIHBhc3MKKyAgICAgICAgICAgICMgdGhlIHJlcXVlc3QgdG8gb3RoZXIgZ2VuZXJhdG9yLgorICAgICAgICAgICAgbWlzc2luZy10eXBlcyA9ICQoc2VsZi5zb3VyY2UtdHlwZXMpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHRlbXAgPSBbIGNvbnN1bWUtZGlyZWN0bHkgJChzb3VyY2VzKSBdIDsKKyAgICAgICAgICAgIGlmICQodGVtcFsxXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29uc3VtZWQgPSAkKHRlbXBbMV0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1pc3NpbmctdHlwZXMgPSAkKHRlbXBbMi1dKSA7CisgICAgICAgIH0KKworICAgICAgICAjIE5vIG5lZWQgdG8gc2VhcmNoIGZvciB0cmFuc2Zvcm1hdGlvbiBpZiBzb21lIHNvdXJjZSB0eXBlIGhhcyBjb25zdW1lZAorICAgICAgICAjIHNvdXJjZSBhbmQgbm8gbW9yZSBzb3VyY2UgdHlwZXMgYXJlIG5lZWRlZC4KKyAgICAgICAgaWYgJChvbmx5LW9uZSkgJiYgJChfY29uc3VtZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pc3NpbmctdHlwZXMgPSA7CisgICAgICAgIH0KKworICAgICAgICAjIFRPRE86IHdlIHNob3VsZCBjaGVjayB0aGF0IG9ubHkgb25lIHNvdXJjZSB0eXBlIGlzIGNyZWF0ZWQgaWYKKyAgICAgICAgIyAnb25seS1vbmUnIGlzIHRydWUuCisKKyAgICAgICAgaWYgJChtaXNzaW5nLXR5cGVzKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCB0cmFuc2Zvcm1lZCA9IFsgZ2VuZXJhdG9ycy5jb25zdHJ1Y3QtdHlwZXMgJChwcm9qZWN0KSAkKG5hbWUpCisgICAgICAgICAgICAgICAgOiAkKG1pc3NpbmctdHlwZXMpIDogJChwcm9wZXJ0eS1zZXQpIDogJChzb3VyY2VzKSBdIDsKKworICAgICAgICAgICAgIyBBZGQgdGFyZ2V0cyBvZiByaWdodCB0eXBlIHRvICdjb25zdW1lZCcuIEFkZCBvdGhlcnMgdG8gJ2J5cGFzc2VkJy4KKyAgICAgICAgICAgICMgVGhlICdnZW5lcmF0b3JzLmNvbnN0cnVjdCcgcnVsZSBoYXMgZG9uZSBpdHMgYmVzdCB0byBjb252ZXJ0CisgICAgICAgICAgICAjIGV2ZXJ5dGhpbmcgdG8gdGhlIHJlcXVpcmVkIHR5cGUuIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVydW4gaXQgb24KKyAgICAgICAgICAgICMgdGFyZ2V0cyBvZiBkaWZmZXJlbnQgdHlwZXMuCisKKyAgICAgICAgICAgICMgTk9URTogaWdub3JpbmcgdXNhZ2UgcmVxdWlyZW1lbnRzLgorICAgICAgICAgICAgZm9yIGxvY2FsIHQgaW4gJCh0cmFuc2Zvcm1lZFsyLV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgWyAkKHQpLnR5cGUgXSBpbiAkKG1pc3NpbmctdHlwZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY29uc3VtZWQgKz0gJCh0KSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFsgc2VxdWVuY2UudW5pcXVlICQoX2NvbnN1bWVkKSBdIDsKKyAgICB9CisKKyAgICAjIENvbnZlcnRzIHNldmVyYWwgZmlsZXMgdG8gY29uc3VtYWJsZSB0eXBlcy4gQ2FsbGVkIGZvciBjb21wb3NpbmcKKyAgICAjIGdlbmVyYXRvcnMgb25seS4KKyAgICAjCisgICAgcnVsZSBjb252ZXJ0LW11bHRpcGxlLXNvdXJjZXMtdG8tY29uc3VtYWJsZS10eXBlcyAoIHByb2plY3QgOiBwcm9wZXJ0eS1zZXQgOgorICAgICAgICBzb3VyY2VzICogKQorICAgIHsKKyAgICAgICAgbG9jYWwgcmVzdWx0IDsKKyAgICAgICAgIyBXZSBwcm9jZXNzIGVhY2ggc291cmNlIG9uZS1ieS1vbmUsIHRyeWluZyB0byBjb252ZXJ0IGl0IHRvIGEgdXNhYmxlCisgICAgICAgICMgdHlwZS4KKyAgICAgICAgaWYgISAkKHNlbGYuc291cmNlLXR5cGVzKQorICAgICAgICB7CisgICAgICAgICAgICAjIEFueXRoaW5nIGlzIGFjY2VwdGlibGUKKyAgICAgICAgICAgIHJldHVybiAkKHNvdXJjZXMpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGFjY2VwdGlibGUtdHlwZXMgPSBbIHNlcXVlbmNlLnVuaXF1ZQorICAgICAgICAgICAgICAgIFsgc2VxdWVuY2UudHJhbnNmb3JtIHR5cGUuYWxsLWRlcml2ZWQgOiAkKHNlbGYuc291cmNlLXR5cGVzKSBdIF0gOworICAgICAgICAgICAgZm9yIGxvY2FsIHNvdXJjZSBpbiAkKHNvdXJjZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgISBbICQoc291cmNlKS50eXBlIF0gaW4gJChhY2NlcHRpYmxlLXR5cGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwgdHJhbnNmb3JtZWQgPSBbIGdlbmVyYXRvcnMuY29uc3RydWN0LXR5cGVzICQocHJvamVjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogJChzZWxmLnNvdXJjZS10eXBlcykgOiAkKHByb3BlcnR5LXNldCkgOiAkKHNvdXJjZSkgXSA7CisgICAgICAgICAgICAgICAgICAgIGZvciBsb2NhbCB0IGluICQodHJhbnNmb3JtZWRbMi1dKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBbICQodCkudHlwZSBdIGluICQoc2VsZi5zb3VyY2UtdHlwZXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQodCkgOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICEgJCh0cmFuc2Zvcm1lZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9ycy5kb3V0IFsgaW5kZW50IF0gIiBmYWlsZWQgdG8gY29udmVydCAiICQoc291cmNlKSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoc291cmNlKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFsgc2VxdWVuY2UudW5pcXVlICQocmVzdWx0KSBdIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJ1bGUgY29uc3VtZS1kaXJlY3RseSAoIHNvdXJjZSApCisgICAgeworICAgICAgICBsb2NhbCByZWFsLXNvdXJjZS10eXBlID0gWyAkKHNvdXJjZSkudHlwZSBdIDsKKworICAgICAgICAjIElmIHRoZXJlIGFyZSBubyBzb3VyY2UgdHlwZXMsIHdlIGNhbiBjb25zdW1lIGFueXRoaW5nLgorICAgICAgICBsb2NhbCBzb3VyY2UtdHlwZXMgPSAkKHNlbGYuc291cmNlLXR5cGVzKSA7CisgICAgICAgIHNvdXJjZS10eXBlcyA/PSAkKHJlYWwtc291cmNlLXR5cGUpIDsKKworICAgICAgICBsb2NhbCByZXN1bHQgPSAiIiA7CisgICAgICAgIGxvY2FsIG1pc3NpbmctdHlwZXMgOworCisgICAgICAgIGZvciBsb2NhbCBzdCBpbiAkKHNvdXJjZS10eXBlcykKKyAgICAgICAgeworICAgICAgICAgICAgIyBUaGUgJ3NvdXJjZScgaWYgb2YgdGhlIHJpZ2h0IHR5cGUgYWxyZWFkeS4KKyAgICAgICAgICAgIGlmICQocmVhbC1zb3VyY2UtdHlwZSkgPSAkKHN0KSB8fCBbIHR5cGUuaXMtZGVyaXZlZAorICAgICAgICAgICAgICAgICQocmVhbC1zb3VyY2UtdHlwZSkgJChzdCkgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9ICQoc291cmNlKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWlzc2luZy10eXBlcyArPSAkKHN0KSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQocmVzdWx0KSAkKG1pc3NpbmctdHlwZXMpIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gYWN0aW9ucy4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zCisgICAgIyAiYWN0aW9uIi4KKyAgICAjCisgICAgcnVsZSBhY3Rpb24tY2xhc3MgKCApCisgICAgeworICAgICAgICByZXR1cm4gImFjdGlvbiIgOworICAgIH0KK30KKworCisjIFJlZ2lzdGVycyBhIG5ldyBnZW5lcmF0b3IgaW5zdGFuY2UgJ2cnLgorIworcnVsZSByZWdpc3RlciAoIGcgKQoreworICAgIC5hbGwtZ2VuZXJhdG9ycyArPSAkKGcpIDsKKworICAgICMgQSBnZW5lcmF0b3IgY2FuIHByb2R1Y2Ugc2V2ZXJhbCB0YXJnZXRzIG9mIHRoZSBzYW1lIHR5cGUuIFdlIHdhbnQgdW5pcXVlCisgICAgIyBvY2N1cnJlbmNlIG9mIHRoYXQgZ2VuZXJhdG9yIGluIC5nZW5lcmF0b3JzLiQodCkgaW4gdGhhdCBjYXNlLCBvdGhlcndpc2UsCisgICAgIyBpdCB3aWxsIGJlIHRyaWVkIHR3aWNlIGFuZCB3ZSB3aWxsIGdldCBhIGZhbHNlIGFtYmlndWl0eS4KKyAgICBmb3IgbG9jYWwgdCBpbiBbIHNlcXVlbmNlLnVuaXF1ZSBbICQoZykudGFyZ2V0LXR5cGVzIF0gXQorICAgIHsKKyAgICAgICAgLmdlbmVyYXRvcnMuJCh0KSArPSAkKGcpIDsKKyAgICB9CisKKyAgICAjIFVwZGF0ZSB0aGUgc2V0IG9mIGdlbmVyYXRvcnMgZm9yIHRvb2xzZXQuCisKKyAgICAjIFRPRE86IHNob3VsZCB3ZSBjaGVjayB0aGF0IGdlbmVyYXRvciB3aXRoIHRoaXMgaWQgaXMgbm90IGFscmVhZHkKKyAgICAjIHJlZ2lzdGVyZWQuIEZvciBleGFtcGxlLCB0aGUgZm9wLmphbSBtb2R1bGUgaW50ZW50aW9uYWxseSBkZWNsYXJlZCB0d28KKyAgICAjIGdlbmVyYXRvcnMgd2l0aCB0aGUgc2FtZSBpZCwgc28gc3VjaCBjaGVjayB3aWxsIGJyZWFrIGl0LgorICAgIGxvY2FsIGlkID0gWyAkKGcpLmlkIF0gOworCisgICAgIyBTb21lIGdlbmVyYXRvcnMgaGF2ZSBtdWx0aXBsZSBwZXJpb2RzIGluIHRoZWlyIG5hbWUsIHNvIGEgc2ltcGxlICQoaWQ6Uz0pCisgICAgIyB3aWxsIG5vdCBnZW5lcmF0ZSB0aGUgcmlnaHQgdG9vbHNldCBuYW1lLiBFLmcuIGlmIGlkID0gZ2NjLmNvbXBpbGUuYysrLAorICAgICMgdGhlbiAuZ2VuZXJhdG9ycy1mb3ItdG9vbHNldC4kKGlkOlM9KSB3aWxsIGFwcGVuZCB0bworICAgICMgLmdlbmVyYXRvcnMtZm9yLXRvb2xzZXQuZ2NjLmNvbXBpbGUsIHdoaWNoIGlzIGEgc2VwYXJhdGUgdmFsdWUgZnJvbQorICAgICMgLmdlbmVyYXRvcnMtZm9yLXRvb2xzZXQuZ2NjLiBDb3JyZWN0aW5nIHRoaXMgbWFrZXMgZ2VuZXJhdG9yIGluaGVyaXRhbmNlCisgICAgIyB3b3JrIHByb3Blcmx5LiBTZWUgYWxzbyBpbmhlcml0LWdlbmVyYXRvcnMgaW4gdGhlIHRvb2xzZXQgbW9kdWxlLgorICAgIGxvY2FsIGJhc2UgPSAkKGlkKSA7CisgICAgd2hpbGUgJChiYXNlOlMpCisgICAgeworICAgICAgICBiYXNlID0gJChiYXNlOkIpIDsKKyAgICB9CisgICAgLmdlbmVyYXRvcnMtZm9yLXRvb2xzZXQuJChiYXNlKSArPSAkKGcpIDsKKworCisgICAgIyBBZnRlciBhZGRpbmcgYSBuZXcgZ2VuZXJhdG9yIHRoYXQgY2FuIGNvbnN0cnVjdCBuZXcgdGFyZ2V0IHR5cGVzLCB3ZSBuZWVkCisgICAgIyB0byBjbGVhciB0aGUgcmVsYXRlZCBjYWNoZWQgdmlhYmxlIHNvdXJjZSB0YXJnZXQgdHlwZSBpbmZvcm1hdGlvbiBmb3IKKyAgICAjIGNvbnN0cnVjdGluZyBhIHNwZWNpZmljIHRhcmdldCB0eXBlIG9yIHVzaW5nIGEgc3BlY2lmaWMgZ2VuZXJhdG9yLiBDYWNoZWQKKyAgICAjIHZpYWJsZSBzb3VyY2UgdGFyZ2V0IHR5cGUgbGlzdHMgYWZmZWN0ZWQgYnkgdGhpcyBhcmUgdGhvc2UgY29udGFpbmluZyBhbnkKKyAgICAjIG9mIHRoZSB0YXJnZXQgdHlwZXMgY29uc3RydWN0ZWQgYnkgdGhlIG5ldyBnZW5lcmF0b3Igb3IgYW55IG9mIHRoZWlyIGJhc2UKKyAgICAjIHRhcmdldCB0eXBlcy4KKyAgICAjCisgICAgIyBBIG1vcmUgYWR2YW5jZWQgYWx0ZXJuYXRpdmUgdG8gY2xlYXJpbmcgdGhhdCBjYWNoZWQgdmlhYmxlIHNvdXJjZSB0YXJnZXQKKyAgICAjIHR5cGUgaW5mb3JtYXRpb24gd291bGQgYmUgdG8gZXhwYW5kIGl0IHdpdGggYWRkaXRpb25hbCBzb3VyY2UgdHlwZXMgb3IKKyAgICAjIGV2ZW4gYmV0dGVyIC0gbWFyayBpdCBhcyBuZWVkaW5nIHRvIGJlIGV4cGFuZGVkIG9uIG5leHQgdXNlLgorICAgICMKKyAgICAjIEFsc28gc2VlIHRoZSBodHRwOi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5jb21wLmxpYi5ib29zdC5idWlsZC8xOTA3NworICAgICMgbWFpbGluZyBsaXN0IHRocmVhZCBmb3IgYW4gZXZlbiBtb3JlIGFkdmFuY2VkIGlkZWEgb2YgaG93IHdlIGNvdWxkIGNvbnZlcnQKKyAgICAjIEJvb3N0IEJ1aWxkJ3MgSmFtZmlsZSBwcm9jZXNzaW5nLCB0YXJnZXQgc2VsZWN0aW9uIGFuZCBnZW5lcmF0b3Igc2VsZWN0aW9uCisgICAgIyBpbnRvIHNlcGFyYXRlIHN0ZXBzIHdoaWNoIHdvdWxkIHByZXZlbnQgdGhlc2UgY2FjaGVzIGZyb20gZXZlciBiZWluZworICAgICMgaW52YWxpZGF0ZWQuCisgICAgIworICAgICMgRm9yIG5vdyB3ZSBqdXN0IGNsZWFyIGFsbCB0aGUgY2FjaGVkIHZpYWJsZSBzb3VyY2UgdGFyZ2V0IHR5cGUgaW5mb3JtYXRpb24KKyAgICAjIHRoYXQgZG9lcyBub3Qgc2ltcGx5IHN0YXRlICdhbGwgdHlwZXMnIGFuZCBtYXkgaW1wbGVtZW50IGEgbW9yZSBkZXRhaWxlZAorICAgICMgYWxnb3JpdGhtIGxhdGVyIG9uIGlmIGl0IGJlY29tZXMgbmVlZGVkLgorCisgICAgaW52YWxpZGF0ZS1leHRlbmRhYmxlLXZpYWJsZS1zb3VyY2UtdGFyZ2V0LXR5cGUtY2FjaGUgOworfQorCisKKyMgQ3JlYXRlcyBhIG5ldyBub24tY29tcG9zaW5nICdnZW5lcmF0b3InIGNsYXNzIGluc3RhbmNlIGFuZCByZWdpc3RlcnMgaXQuCisjIFJldHVybnMgdGhlIGNyZWF0ZWQgaW5zdGFuY2UuIFJhdGlvbmFsZTogdGhlIGluc3RhbmNlIGlzIHJldHVybmVkIHNvIHRoYXQgaXQKKyMgaXMgcG9zc2libGUgdG8gZmlyc3QgcmVnaXN0ZXIgYSBnZW5lcmF0b3IgYW5kIHRoZW4gY2FsbCBpdHMgJ3J1bicgbWV0aG9kLAorIyBieXBhc3NpbmcgdGhlIHdob2xlIGdlbmVyYXRvciBzZWxlY3Rpb24gcHJvY2Vzcy4KKyMKK3J1bGUgcmVnaXN0ZXItc3RhbmRhcmQgKCBpZCA6IHNvdXJjZS10eXBlcyAqIDogdGFyZ2V0LXR5cGVzICsgOiByZXF1aXJlbWVudHMgKiApCit7CisgICAgbG9jYWwgZyA9IFsgbmV3IGdlbmVyYXRvciAkKGlkKSA6ICQoc291cmNlLXR5cGVzKSA6ICQodGFyZ2V0LXR5cGVzKSA6CisgICAgICAgICQocmVxdWlyZW1lbnRzKSBdIDsKKyAgICByZWdpc3RlciAkKGcpIDsKKyAgICByZXR1cm4gJChnKSA7Cit9CisKKworIyBDcmVhdGVzIGEgbmV3IGNvbXBvc2luZyAnZ2VuZXJhdG9yJyBjbGFzcyBpbnN0YW5jZSBhbmQgcmVnaXN0ZXJzIGl0LgorIworcnVsZSByZWdpc3Rlci1jb21wb3NpbmcgKCBpZCA6IHNvdXJjZS10eXBlcyAqIDogdGFyZ2V0LXR5cGVzICsgOiByZXF1aXJlbWVudHMgKgorICAgICkKK3sKKyAgICBsb2NhbCBnID0gWyBuZXcgZ2VuZXJhdG9yICQoaWQpIHRydWUgOiAkKHNvdXJjZS10eXBlcykgOiAkKHRhcmdldC10eXBlcykgOgorICAgICAgICAkKHJlcXVpcmVtZW50cykgXSA7CisgICAgcmVnaXN0ZXIgJChnKSA7CisgICAgcmV0dXJuICQoZykgOworfQorCisKKyMgUmV0dXJucyBhbGwgZ2VuZXJhdG9ycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuICd0b29sc2V0JywgaS5lLiB3aG9zZSBpZHMgYXJlCisjICckKHRvb2xzZXQpLjxzb21ldGhpbmc+Jy4KKyMKK3J1bGUgZ2VuZXJhdG9ycy1mb3ItdG9vbHNldCAoIHRvb2xzZXQgKQoreworICAgIHJldHVybiAkKC5nZW5lcmF0b3JzLWZvci10b29sc2V0LiQodG9vbHNldCkpIDsKK30KKworCisjIE1ha2UgZ2VuZXJhdG9yICdvdmVycmlkZXItaWQnIGJlIHByZWZlcnJlZCB0byAnb3ZlcnJpZGVlLWlkJy4gSWYsIHdoZW4KKyMgc2VhcmNoaW5nIGZvciBnZW5lcmF0b3JzIHRoYXQgY291bGQgcHJvZHVjZSBhIHRhcmdldCBvZiBhIGNlcnRhaW4gdHlwZSwgYm90aAorIyB0aG9zZSBnZW5lcmF0b3JzIGFyZSBhbW9uZyB2aWFibGUgZ2VuZXJhdG9ycywgdGhlIG92ZXJyaWRkZW4gZ2VuZXJhdG9yIGlzCisjIGltbWVkaWF0ZWx5IGRpc2NhcmRlZC4KKyMKKyMgVGhlIG92ZXJyaWRkZW4gZ2VuZXJhdG9ycyBhcmUgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IGFmdGVyIGNvbXB1dGluZyB0aGUgbGlzdAorIyBvZiB2aWFibGUgZ2VuZXJhdG9ycyBidXQgYmVmb3JlIHJ1bm5pbmcgYW55IG9mIHRoZW0uCisjCitydWxlIG92ZXJyaWRlICggb3ZlcnJpZGVyLWlkIDogb3ZlcnJpZGVlLWlkICkKK3sKKyAgICAub3ZlcnJpZGUuJChvdmVycmlkZXItaWQpICs9ICQob3ZlcnJpZGVlLWlkKSA7Cit9CisKKworIyBSZXR1cm5zIGEgbGlzdCBvZiBzb3VyY2UgdHlwZSB3aGljaCBjYW4gcG9zc2libHkgYmUgY29udmVydGVkIHRvICd0YXJnZXQtdHlwZScKKyMgYnkgc29tZSBjaGFpbiBvZiBnZW5lcmF0b3IgaW52b2NhdGlvbi4KKyMKKyMgTW9yZSBmb3JtYWxseSwgdGFrZXMgYWxsIGdlbmVyYXRvcnMgZm9yICd0YXJnZXQtdHlwZScgYW5kIHJldHVybnMgYSB1bmlvbiBvZgorIyBzb3VyY2UgdHlwZXMgZm9yIHRob3NlIGdlbmVyYXRvcnMgYW5kIHJlc3VsdCBvZiBjYWxsaW5nIGl0c2VsZiByZWN1cnNpdmVseSBvbgorIyBzb3VyY2UgdHlwZXMuCisjCisjIFJldHVybnMgJyonIGluIGNhc2UgYW55IHR5cGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSB2aWFibGUgc291cmNlIHR5cGUgZm9yIHRoZQorIyBnaXZlbiB0eXBlLgorIworbG9jYWwgcnVsZSB2aWFibGUtc291cmNlLXR5cGVzLXJlYWwgKCB0YXJnZXQtdHlwZSApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKworICAgICMgJ3QwJyBpcyB0aGUgaW5pdGlhbCBsaXN0IG9mIHRhcmdldCB0eXBlcyB3ZSBuZWVkIHRvIHByb2Nlc3MgdG8gZ2V0IGEgbGlzdAorICAgICMgb2YgdGhlaXIgdmlhYmxlIHNvdXJjZSB0YXJnZXQgdHlwZXMuIE5ldyB0YXJnZXQgdHlwZXMgd2lsbCBub3QgYmUgYWRkZWQgdG8KKyAgICAjIHRoaXMgbGlzdC4KKyAgICBsb2NhbCB0MCA9IFsgdHlwZS5hbGwtYmFzZXMgJCh0YXJnZXQtdHlwZSkgXSA7CisKKyAgICAjICd0JyBpcyB0aGUgbGlzdCBvZiB0YXJnZXQgdHlwZXMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4gcHJvY2Vzc2VkIHRvIGdldCBhCisgICAgIyBsaXN0IG9mIHRoZWlyIHZpYWJsZSBzb3VyY2UgdGFyZ2V0IHR5cGVzLiBUaGlzIGxpc3Qgd2lsbCBnZXQgZXhwYW5kZWQgYXMKKyAgICAjIHdlIGxvY2F0ZSBtb3JlIHRhcmdldCB0eXBlcyB0byBwcm9jZXNzLgorICAgIGxvY2FsIHQgPSAkKHQwKSA7CisKKyAgICB3aGlsZSAkKHQpCisgICAgeworICAgICAgICAjIEZpbmQgYWxsIGdlbmVyYXRvcnMgZm9yIHRoZSBjdXJyZW50IHR5cGUuIFVubGlrZQorICAgICAgICAjICdmaW5kLXZpYWJsZS1nZW5lcmF0b3JzJyB3ZSBkbyBub3QgY2FyZSBhYm91dCB0aGUgcHJvcGVydHktc2V0LgorICAgICAgICBsb2NhbCBnZW5lcmF0b3JzID0gJCguZ2VuZXJhdG9ycy4kKHRbMV0pKSA7CisgICAgICAgIHQgPSAkKHRbMi1dKSA7CisKKyAgICAgICAgd2hpbGUgJChnZW5lcmF0b3JzKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBnID0gJChnZW5lcmF0b3JzWzFdKSA7CisgICAgICAgICAgICBnZW5lcmF0b3JzID0gJChnZW5lcmF0b3JzWzItXSkgOworCisgICAgICAgICAgICBpZiAhIFsgJChnKS5zb3VyY2UtdHlwZXMgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgRW1wdHkgc291cmNlIHR5cGVzIC0tIGV2ZXJ5dGhpbmcgY2FuIGJlIGFjY2VwdGVkLgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICogOworICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIHRlcm1pbmF0ZSB0aGlzIGxvb3AuCisgICAgICAgICAgICAgICAgZ2VuZXJhdG9ycyA9IDsKKyAgICAgICAgICAgICAgICAjIFRoaXMgd2lsbCB0ZXJtaW5hdGUgdGhlIG91dGVyIGxvb3AuCisgICAgICAgICAgICAgICAgdCA9IDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIGxvY2FsIHNvdXJjZS10eXBlIGluIFsgJChnKS5zb3VyY2UtdHlwZXMgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICEgJChzb3VyY2UtdHlwZSkgaW4gJChyZXN1bHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjIElmIGEgZ2VuZXJhdG9yIGFjY2VwdHMgYSAnc291cmNlLXR5cGUnIGl0IHdpbGwgYWxzbworICAgICAgICAgICAgICAgICAgICAjIGhhcHBpbHkgYWNjZXB0IGFueSB0eXBlIGRlcml2ZWQgZnJvbSBpdC4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGxvY2FsIG4gaW4gWyB0eXBlLmFsbC1kZXJpdmVkICQoc291cmNlLXR5cGUpIF0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgISAkKG4pIGluICQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSGVyZSB0aGVyZSBpcyBubyBwb2ludCBpbiBhZGRpbmcgdGFyZ2V0IHR5cGVzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgbGlzdCBvZiB0eXBlcyB0byBwcm9jZXNzIGluIGNhc2UgdGhleSBhcmUgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhhdmUgYWxyZWFkeSBiZWVuIG9uIHRoYXQgbGlzdC4gV2Ugb3B0aW1pemUgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgYnkgcmVhbGl6aW5nIHRoYXQgd2Ugb25seSBuZWVkIHRvIGF2b2lkIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3JpZ2luYWwgdGFyZ2V0IHR5cGUncyBiYXNlIHR5cGVzLiBPdGhlciB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHR5cGVzIHRoYXQgYXJlIG9yIGhhdmUgYmVlbiBvbiB0aGUgbGlzdCBvZiB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHR5cGVzIHRvIHByb2Nlc3MgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSAncmVzdWx0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGlzdCBhcyB3ZWxsIGFuZCBoYXZlIHRodXMgYWxyZWFkeSBiZWVuIGVsaW1pbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGJ5IHRoZSBwcmV2aW91cyBpZi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAhICQobikgaW4gJCh0MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gJChuKSA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAkKG4pIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgSGVscGVyIHJ1bGUsIGNhY2hlcyB0aGUgcmVzdWx0IG9mICd2aWFibGUtc291cmNlLXR5cGVzLXJlYWwnLgorIworcnVsZSB2aWFibGUtc291cmNlLXR5cGVzICggdGFyZ2V0LXR5cGUgKQoreworICAgIGxvY2FsIGtleSA9IC52c3QuJCh0YXJnZXQtdHlwZSkgOworICAgIGlmICEgJCgkKGtleSkpCisgICAgeworICAgICAgICAudnN0LWNhY2hlZC10eXBlcyArPSAkKHRhcmdldC10eXBlKSA7CisgICAgICAgIGxvY2FsIHYgPSBbIHZpYWJsZS1zb3VyY2UtdHlwZXMtcmVhbCAkKHRhcmdldC10eXBlKSBdIDsKKyAgICAgICAgaWYgISAkKHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHYgPSBub25lIDsKKyAgICAgICAgfQorICAgICAgICAkKGtleSkgPSAkKHYpIDsKKyAgICB9CisKKyAgICBpZiAkKCQoa2V5KSkgIT0gbm9uZQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoJChrZXkpKSA7CisgICAgfQorfQorCisKKyMgUmV0dXJucyB0aGUgbGlzdCBvZiBzb3VyY2UgdHlwZXMsIHdoaWNoLCB3aGVuIHBhc3NlZCB0byAncnVuJyBtZXRob2Qgb2YKKyMgJ2dlbmVyYXRvcicsIGhhcyBzb21lIGNoYW5nZSBvZiBiZWluZyBldmVudHVhbGx5IHVzZWQgKHByb2JhYmx5IGFmdGVyCisjIGNvbnZlcnNpb24gYnkgb3RoZXIgZ2VuZXJhdG9ycykuCisjCisjIFJldHVybnMgJyonIGluIGNhc2UgYW55IHR5cGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSB2aWFibGUgc291cmNlIHR5cGUgZm9yIHRoZQorIyBnaXZlbiBnZW5lcmF0b3IuCisjCitydWxlIHZpYWJsZS1zb3VyY2UtdHlwZXMtZm9yLWdlbmVyYXRvci1yZWFsICggZ2VuZXJhdG9yICkKK3sKKyAgICBsb2NhbCBzb3VyY2UtdHlwZXMgPSBbICQoZ2VuZXJhdG9yKS5zb3VyY2UtdHlwZXMgXSA7CisgICAgaWYgISAkKHNvdXJjZS10eXBlcykKKyAgICB7CisgICAgICAgICMgSWYgZ2VuZXJhdG9yIGRvZXMgbm90IHNwZWNpZnkgYW55IHNvdXJjZSB0eXBlcywgaXQgbWlnaHQgYmUgYSBzcGVjaWFsCisgICAgICAgICMgZ2VuZXJhdG9yIGxpa2UgYnVpbHRpbi5saWItZ2VuZXJhdG9yIHdoaWNoIGp1c3QgcmVsYXlzIHRvIG90aGVyCisgICAgICAgICMgZ2VuZXJhdG9ycy4gUmV0dXJuICcqJyB0byBpbmRpY2F0ZSB0aGF0IGFueSBzb3VyY2UgdHlwZSBpcyBwb3NzaWJseQorICAgICAgICAjIE9LLCBzaW5jZSB3ZSBkbyBub3Qga25vdyBmb3Igc3VyZS4KKyAgICAgICAgcmV0dXJuICogOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsb2NhbCByZXN1bHQgOworICAgICAgICB3aGlsZSAkKHNvdXJjZS10eXBlcykKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgcyA9ICQoc291cmNlLXR5cGVzWzFdKSA7CisgICAgICAgICAgICBzb3VyY2UtdHlwZXMgPSAkKHNvdXJjZS10eXBlc1syLV0pIDsKKyAgICAgICAgICAgIGxvY2FsIHZpYWJsZS1zb3VyY2VzID0gWyBnZW5lcmF0b3JzLnZpYWJsZS1zb3VyY2UtdHlwZXMgJChzKSBdIDsKKyAgICAgICAgICAgIGlmICQodmlhYmxlLXNvdXJjZXMpID0gKgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9ICogOworICAgICAgICAgICAgICAgIHNvdXJjZS10eXBlcyA9IDsgICMgVGVybWluYXRlIHRoZSBsb29wLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbIHR5cGUuYWxsLWRlcml2ZWQgJChzKSBdICQodmlhYmxlLXNvdXJjZXMpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gWyBzZXF1ZW5jZS51bmlxdWUgJChyZXN1bHQpIF0gOworICAgIH0KK30KKworCisjIEhlbHBlciBydWxlLCBjYWNoZXMgdGhlIHJlc3VsdCBvZiAndmlhYmxlLXNvdXJjZS10eXBlcy1mb3ItZ2VuZXJhdG9yJy4KKyMKK2xvY2FsIHJ1bGUgdmlhYmxlLXNvdXJjZS10eXBlcy1mb3ItZ2VuZXJhdG9yICggZ2VuZXJhdG9yICkKK3sKKyAgICBsb2NhbCBrZXkgPSAudnN0Zy4kKGdlbmVyYXRvcikgOworICAgIGlmICEgJCgkKGtleSkpCisgICAgeworICAgICAgICAudnN0Zy1jYWNoZWQtZ2VuZXJhdG9ycyArPSAkKGdlbmVyYXRvcikgOworICAgICAgICBsb2NhbCB2ID0gWyB2aWFibGUtc291cmNlLXR5cGVzLWZvci1nZW5lcmF0b3ItcmVhbCAkKGdlbmVyYXRvcikgXSA7CisgICAgICAgIGlmICEgJCh2KQorICAgICAgICB7CisgICAgICAgICAgICB2ID0gbm9uZSA7CisgICAgICAgIH0KKyAgICAgICAgJChrZXkpID0gJCh2KSA7CisgICAgfQorCisgICAgaWYgJCgkKGtleSkpICE9IG5vbmUKKyAgICB7CisgICAgICAgIHJldHVybiAkKCQoa2V5KSkgOworICAgIH0KK30KKworCisjIFJldHVybnMgdXNhZ2UgcmVxdWlyZW1lbnRzICsgbGlzdCBvZiBjcmVhdGVkIHRhcmdldHMuCisjCitsb2NhbCBydWxlIHRyeS1vbmUtZ2VuZXJhdG9yLXJlYWxseSAoIHByb2plY3QgbmFtZSA/IDogZ2VuZXJhdG9yIDogdGFyZ2V0LXR5cGUKKyAgICA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKiApCit7CisgICAgbG9jYWwgdGFyZ2V0cyA9CisgICAgICAgIFsgJChnZW5lcmF0b3IpLnJ1biAkKHByb2plY3QpICQobmFtZSkgOiAkKHByb3BlcnR5LXNldCkgOiAkKHNvdXJjZXMpIF0gOworCisgICAgbG9jYWwgdXNhZ2UtcmVxdWlyZW1lbnRzIDsKKyAgICBsb2NhbCBzdWNjZXNzIDsKKworICAgIGdlbmVyYXRvcnMuZG91dCBbIGluZGVudCBdIHJldHVybmVkICQodGFyZ2V0cykgOworCisgICAgaWYgJCh0YXJnZXRzKQorICAgIHsKKyAgICAgICAgc3VjY2VzcyA9IHRydWUgOworCisgICAgICAgIGlmICBbIGNsYXNzLmlzLWEgJCh0YXJnZXRzWzFdKSA6IHByb3BlcnR5LXNldCBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYWdlLXJlcXVpcmVtZW50cyA9ICQodGFyZ2V0c1sxXSkgOworICAgICAgICAgICAgdGFyZ2V0cyA9ICQodGFyZ2V0c1syLV0pIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYWdlLXJlcXVpcmVtZW50cyA9IFsgcHJvcGVydHktc2V0LmVtcHR5IF0gOworICAgICAgICB9CisgICAgfQorCisgICAgZ2VuZXJhdG9ycy5kb3V0IFsgaW5kZW50IF0gIiAgZ2VuZXJhdG9yIiBbICQoZ2VuZXJhdG9yKS5pZCBdICIgc3Bhd25lZCAiIDsKKyAgICBnZW5lcmF0b3JzLmRvdXQgWyBpbmRlbnQgXSAiICIgJCh0YXJnZXRzKSA7CisgICAgaWYgJCh1c2FnZS1yZXF1aXJlbWVudHMpCisgICAgeworICAgICAgICBnZW5lcmF0b3JzLmRvdXQgWyBpbmRlbnQgXSAiICB3aXRoIHVzYWdlIHJlcXVpcmVtZW50czoiICQoeCkgOworICAgIH0KKworICAgIGlmICQoc3VjY2VzcykKKyAgICB7CisgICAgICAgIHJldHVybiAkKHVzYWdlLXJlcXVpcmVtZW50cykgJCh0YXJnZXRzKSA7CisgICAgfQorfQorCisKKyMgQ2hlY2tzIGlmIGdlbmVyYXRvciBpbnZvY2F0aW9uIGNhbiBiZSBwcnVuZWQsIGJlY2F1c2UgaXQgaXMgZ3VhcmFudGVlZCB0bworIyBmYWlsLiBJZiBzbywgcXVpY2tseSByZXR1cm5zIGFuIGVtcHR5IGxpc3QuIE90aGVyd2lzZSwgY2FsbHMKKyMgdHJ5LW9uZS1nZW5lcmF0b3ItcmVhbGx5LgorIworbG9jYWwgcnVsZSB0cnktb25lLWdlbmVyYXRvciAoIHByb2plY3QgbmFtZSA/IDogZ2VuZXJhdG9yIDogdGFyZ2V0LXR5cGUKKyAgICA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKiApCit7CisgICAgbG9jYWwgc291cmNlLXR5cGVzIDsKKyAgICBmb3IgbG9jYWwgcyBpbiAkKHNvdXJjZXMpCisgICAgeworICAgICAgICBzb3VyY2UtdHlwZXMgKz0gWyAkKHMpLnR5cGUgXSA7CisgICAgfQorICAgIGxvY2FsIHZpYWJsZS1zb3VyY2UtdHlwZXMgPSBbIHZpYWJsZS1zb3VyY2UtdHlwZXMtZm9yLWdlbmVyYXRvciAkKGdlbmVyYXRvcikKKyAgICAgICAgXSA7CisKKyAgICBpZiAgJChzb3VyY2UtdHlwZXMpICYmICQodmlhYmxlLXNvdXJjZS10eXBlcykgIT0gKiAmJgorICAgICAgICAhIFsgc2V0LmludGVyc2VjdGlvbiAkKHNvdXJjZS10eXBlcykgOiAkKHZpYWJsZS1zb3VyY2UtdHlwZXMpIF0KKyAgICB7CisgICAgICAgIGxvY2FsIGlkID0gWyAkKGdlbmVyYXRvcikuaWQgXSA7CisgICAgICAgIGdlbmVyYXRvcnMuZG91dCBbIGluZGVudCBdICIgICoqIGdlbmVyYXRvciAnJChpZCknIHBydW5lZCIgOworICAgICAgICAjZ2VuZXJhdG9ycy5kb3V0IFsgaW5kZW50IF0gInNvdXJjZS10eXBlcyIgJyQoc291cmNlLXR5cGVzKScgOworICAgICAgICAjZ2VuZXJhdG9ycy5kb3V0IFsgaW5kZW50IF0gInZpYWJsZS1zb3VyY2UtdHlwZXMiICckKHZpYWJsZS1zb3VyY2UtdHlwZXMpJyA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBbIHRyeS1vbmUtZ2VuZXJhdG9yLXJlYWxseSAkKHByb2plY3QpICQobmFtZSkgOiAkKGdlbmVyYXRvcikgOgorICAgICAgICAgICAgJCh0YXJnZXQtdHlwZSkgOiAkKHByb3BlcnR5LXNldCkgOiAkKHNvdXJjZXMpIF0gOworICAgIH0KK30KKworCitydWxlIGNvbnN0cnVjdC10eXBlcyAoIHByb2plY3QgbmFtZSA/IDogdGFyZ2V0LXR5cGVzICsgOiBwcm9wZXJ0eS1zZXQKKyAgICA6IHNvdXJjZXMgKyApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBsb2NhbCB1c2FnZS1yZXF1aXJlbWVudHMgPSBbIHByb3BlcnR5LXNldC5lbXB0eSBdIDsKKyAgICBmb3IgbG9jYWwgdCBpbiAkKHRhcmdldC10eXBlcykKKyAgICB7CisgICAgICAgIGxvY2FsIHIgPSBbIGNvbnN0cnVjdCAkKHByb2plY3QpICQobmFtZSkgOiAkKHQpIDogJChwcm9wZXJ0eS1zZXQpIDoKKyAgICAgICAgICAgICQoc291cmNlcykgXSA7CisgICAgICAgIGlmICQocikKKyAgICAgICAgeworICAgICAgICAgICAgdXNhZ2UtcmVxdWlyZW1lbnRzID0gWyAkKHVzYWdlLXJlcXVpcmVtZW50cykuYWRkICQoclsxXSkgXSA7CisgICAgICAgICAgICByZXN1bHQgKz0gJChyWzItXSkgOworICAgICAgICB9CisgICAgfQorICAgICMgVE9ETzogaGF2ZSB0byBpbnRyb2R1Y2UgcGFyYW1ldGVyIGNvbnRyb2xsaW5nIGlmIHNldmVyYWwgdHlwZXMgY2FuIGJlCisgICAgIyBtYXRjaGVkIGFuZCBhZGQgYXBwcm9wcmlhdGUgY2hlY2tzLgorCisgICAgIyBUT0RPOiBuZWVkIHRvIHJldmlldyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgJ2NvbnN0cnVjdCcgdG8gc2VlIGlmIGl0IHNob3VsZAorICAgICMgcmV0dXJuICQoc291cmNlKSBldmVuIGlmIG5vdGhpbmcgY2FuIGJlIGRvbmUgd2l0aCBpdC4gQ3VycmVudHMgZG9jcyBzZWVtCisgICAgIyB0byBpbXBseSB0aGF0LCBjb250cmFyeSB0byB0aGUgYmVoYXZpb3VyLgorICAgIGlmICQocmVzdWx0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICQodXNhZ2UtcmVxdWlyZW1lbnRzKSAkKHJlc3VsdCkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gJCh1c2FnZS1yZXF1aXJlbWVudHMpICQoc291cmNlcykgOworICAgIH0KK30KKworCisjIEVuc3VyZXMgYWxsICd0YXJnZXRzJyBoYXZlIHRoZWlyIHR5cGUuIElmIHRoaXMgaXMgbm90IHNvLCBleGlzdHMgd2l0aCBlcnJvci4KKyMKK2xvY2FsIHJ1bGUgZW5zdXJlLXR5cGUgKCB0YXJnZXRzICogKQoreworICAgIGZvciBsb2NhbCB0IGluICQodGFyZ2V0cykKKyAgICB7CisgICAgICAgIGlmICEgWyAkKHQpLnR5cGUgXQorICAgICAgICB7CisgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciAidGFyZ2V0IiBbICQodCkuc3RyIF0gImhhcyBubyB0eXBlIiA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyBSZXR1cm5zIGdlbmVyYXRvcnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IHRhcmdldCBvZiBzcGVjaWZpZWQgdHlwZQorIyB3aXRoIHNwZWNpZmllZCBwcm9wZXJ0aWVzLiBVc2VzIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgorIyAtIGl0ZXJhdGVzIG92ZXIgcmVxdWVzdGVkIHRhcmdldC10eXBlIGFuZCBhbGwgaXRzIGJhc2VzIChpbiB0aGUgb3JkZXIgcmV0dXJuZWQKKyMgICBieSB0eXBlLmFsbC1iYXNlcykuCisjIC0gZm9yIGVhY2ggdHlwZSBmaW5kIGFsbCBnZW5lcmF0b3JzIHRoYXQgZ2VuZXJhdGUgdGhhdCB0eXBlIGFuZCB3aG9zZQorIyAgIHJlcXVpcmVtZW50cyBhcmUgc2F0aXNmaWVkIGJ5IHByb3BlcnRpZXMuCisjIC0gaWYgdGhlIHNldCBvZiBnZW5lcmF0b3JzIGlzIG5vdCBlbXB0eSwgcmV0dXJucyB0aGF0IHNldC4KKyMKKyMgTm90ZTogdGhpcyBhbGdvcml0aG0gZXhwbGljaXRseSBpZ25vcmVzIGdlbmVyYXRvcnMgZm9yIGJhc2UgY2xhc3NlcyBpZiB0aGVyZQorIyBpcyBhdCBsZWFzdCBvbmUgZ2VuZXJhdG9yIGZvciB0aGUgcmVxdWVzdGVkIHRhcmdldC10eXBlLgorIworbG9jYWwgcnVsZSBmaW5kLXZpYWJsZS1nZW5lcmF0b3JzLWF1eCAoIHRhcmdldC10eXBlIDogcHJvcGVydHktc2V0ICkKK3sKKyAgICAjIFNlbGVjdCBnZW5lcmF0b3JzIHRoYXQgY2FuIGNyZWF0ZSB0aGUgcmVxdWlyZWQgdGFyZ2V0IHR5cGUuCisgICAgbG9jYWwgdmlhYmxlLWdlbmVyYXRvcnMgPSA7CisKKyAgICBpbXBvcnQgdHlwZSA7CisgICAgbG9jYWwgdCA9ICQodGFyZ2V0LXR5cGUpIDsKKworICAgIGlmICQoLmRlYnVnKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdG9ycy5kb3V0IFsgaW5kZW50IF0gZmluZC12aWFibGUtZ2VuZXJhdG9ycyB0YXJnZXQtdHlwZT0gJCh0YXJnZXQtdHlwZSkKKyAgICAgICAgICAgIHByb3BlcnR5LXNldD0gWyAkKHByb3BlcnR5LXNldCkuYXMtcGF0aCBdIDsKKyAgICAgICAgZ2VuZXJhdG9ycy5kb3V0IFsgaW5kZW50IF0gInRyeWluZyB0eXBlIiAkKHRhcmdldC10eXBlKSA7CisgICAgfQorCisgICAgbG9jYWwgZ2VuZXJhdG9ycyA9ICQoLmdlbmVyYXRvcnMuJCh0YXJnZXQtdHlwZSkpIDsKKyAgICBpZiAkKGdlbmVyYXRvcnMpCisgICAgeworICAgICAgICBpZiAkKC5kZWJ1ZykKKyAgICAgICAgeworICAgICAgICAgICAgZ2VuZXJhdG9ycy5kb3V0IFsgaW5kZW50IF0gInRoZXJlIGFyZSBnZW5lcmF0b3JzIGZvciB0aGlzIHR5cGUiIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsb2NhbCB0ID0gWyB0eXBlLmJhc2UgJCh0YXJnZXQtdHlwZSkgXSA7CisKKyAgICAgICAgIyBHZXQgdGhlIGxpc3Qgb2YgZ2VuZXJhdG9ycyBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlLiBJZiBubyBnZW5lcmF0b3IgaXMKKyAgICAgICAgIyByZWdpc3RlcmVkLCB0cnkgYmFzZSB0eXBlLCBhbmQgc28gb24uCisgICAgICAgIHdoaWxlICQodCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJCguZGVidWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdG9ycy5kb3V0IFsgaW5kZW50IF0gInRyeWluZyB0eXBlIiAkKHQpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICQoLmdlbmVyYXRvcnMuJCh0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0b3JzLmRvdXQgWyBpbmRlbnQgXSAidGhlcmUgYXJlIGdlbmVyYXRvcnMgZm9yIHRoaXMgdHlwZSIgOworICAgICAgICAgICAgICAgIGdlbmVyYXRvcnMgPSAkKC5nZW5lcmF0b3JzLiQodCkpIDsKKworICAgICAgICAgICAgICAgICMgV2UgYXJlIGhlcmUgYmVjYXVzZSB0aGVyZSB3ZXJlIG5vIGdlbmVyYXRvcnMgZm91bmQgZm9yCisgICAgICAgICAgICAgICAgIyB0YXJnZXQtdHlwZSBidXQgdGhlcmUgYXJlIHNvbWUgZ2VuZXJhdG9ycyBmb3IgaXRzIGJhc2UgdHlwZS4KKyAgICAgICAgICAgICAgICAjIFdlIHdpbGwgdHJ5IHRvIHVzZSB0aGVtLCBidXQgdGhleSB3aWxsIHByb2R1Y2UgdGFyZ2V0cyBvZgorICAgICAgICAgICAgICAgICMgYmFzZSB0eXBlLCBub3Qgb2YgJ3RhcmdldC10eXBlJy4gU28sIHdlIGNsb25lIHRoZSBnZW5lcmF0b3JzCisgICAgICAgICAgICAgICAgIyBhbmQgbW9kaWZ5IHRoZSBsaXN0IG9mIHRhcmdldCB0eXBlcy4KKyAgICAgICAgICAgICAgICBsb2NhbCBnZW5lcmF0b3JzMiA7CisgICAgICAgICAgICAgICAgZm9yIGxvY2FsIGcgaW4gJChnZW5lcmF0b3JzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIyBnZW5lcmF0b3JzLnJlZ2lzdGVyIGFkZHMgYSBnZW5lcmF0b3IgdG8gdGhlIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgICAgIyBnZW5lcmF0b3JzIGZvciB0b29sc2V0cywgd2hpY2ggaXMgYSBiaXQgc3RyYW5nZSwgYnV0CisgICAgICAgICAgICAgICAgICAgICMgc2hvdWxkIHdvcmsuIFRoYXQgbGlzdCBpcyBvbmx5IHVzZWQgd2hlbiBpbmhlcml0aW5nIGEKKyAgICAgICAgICAgICAgICAgICAgIyB0b29sc2V0LCB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIGRvbmUgYmVmb3JlIHJ1bm5pbmcKKyAgICAgICAgICAgICAgICAgICAgIyBnZW5lcmF0b3JzLgorICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3JzMiArPSBbICQoZykuY2xvbmUtYW5kLWNoYW5nZS10YXJnZXQtdHlwZSAkKHQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICQodGFyZ2V0LXR5cGUpIF0gOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3JzLnJlZ2lzdGVyICQoZ2VuZXJhdG9yczJbLTFdKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbmVyYXRvcnMgPSAkKGdlbmVyYXRvcnMyKSA7CisgICAgICAgICAgICAgICAgdCA9IDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gWyB0eXBlLmJhc2UgJCh0KSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciBsb2NhbCBnIGluICQoZ2VuZXJhdG9ycykKKyAgICB7CisgICAgICAgIGlmICQoLmRlYnVnKQorICAgICAgICB7CisgICAgICAgICAgICBnZW5lcmF0b3JzLmRvdXQgWyBpbmRlbnQgXSAidHJ5aW5nIGdlbmVyYXRvciIgWyAkKGcpLmlkIF0gIigiIFsgJChnKS5zb3VyY2UtdHlwZXMgXSAtPiBbICQoZykudGFyZ2V0LXR5cGVzIF0gIikiIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIFsgJChnKS5tYXRjaC1yYW5rICQocHJvcGVydHktc2V0KSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQoLmRlYnVnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdlbmVyYXRvcnMuZG91dCBbIGluZGVudCBdICIgIGlzIHZpYWJsZSIgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlhYmxlLWdlbmVyYXRvcnMgKz0gJChnKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gJCh2aWFibGUtZ2VuZXJhdG9ycykgOworfQorCisKK3J1bGUgZmluZC12aWFibGUtZ2VuZXJhdG9ycyAoIHRhcmdldC10eXBlIDogcHJvcGVydHktc2V0ICkKK3sKKyAgICBsb2NhbCBrZXkgPSAkKHRhcmdldC10eXBlKS4kKHByb3BlcnR5LXNldCkgOworICAgIGxvY2FsIGwgPSAkKC5mdi4kKGtleSkpIDsKKyAgICBpZiAhICQobCkKKyAgICB7CisgICAgICAgIGwgPSBbIGZpbmQtdmlhYmxlLWdlbmVyYXRvcnMtYXV4ICQodGFyZ2V0LXR5cGUpIDogJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICBpZiAhICQobCkKKyAgICAgICAgeworICAgICAgICAgICAgbCA9IG5vbmUgOworICAgICAgICB9CisgICAgICAgIC5mdi4kKGtleSkgPSAkKGwpIDsKKyAgICB9CisKKyAgICBpZiAkKGwpID0gbm9uZQorICAgIHsKKyAgICAgICAgbCA9IDsKKyAgICB9CisKKyAgICBsb2NhbCB2aWFibGUtZ2VuZXJhdG9ycyA7CisgICAgZm9yIGxvY2FsIGcgaW4gJChsKQorICAgIHsKKyAgICAgICAgIyBBdm9pZCB0cnlpbmcgdGhlIHNhbWUgZ2VuZXJhdG9yIHR3aWNlIG9uIGRpZmZlcmVudCBsZXZlbHMuCisgICAgICAgIGlmICEgJChnKSBpbiAkKC5hY3RpdmUtZ2VuZXJhdG9ycykKKyAgICAgICAgeworICAgICAgICAgICAgdmlhYmxlLWdlbmVyYXRvcnMgKz0gJChnKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBnZW5lcmF0b3JzLmRvdXQgWyBpbmRlbnQgXSAiICAgZ2VuZXJhdG9yICIgWyAkKGcpLmlkIF0gImlzIGFjdGl2ZSwgZGlzY2FyaW5nIiA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIEdlbmVyYXRvcnMgd2hpY2ggb3ZlcnJpZGUgJ2FsbCcuCisgICAgbG9jYWwgYWxsLW92ZXJyaWRlcyA7CisgICAgIyBHZW5lcmF0b3JzIHdoaWNoIGFyZSBvdmVycmlkZW4uCisgICAgbG9jYWwgb3ZlcnJpZGVuLWlkcyA7CisgICAgZm9yIGxvY2FsIGcgaW4gJCh2aWFibGUtZ2VuZXJhdG9ycykKKyAgICB7CisgICAgICAgIGxvY2FsIGlkID0gWyAkKGcpLmlkIF0gOworICAgICAgICBsb2NhbCB0aGlzLW92ZXJyaWRlcyA9ICQoLm92ZXJyaWRlLiQoaWQpKSA7CisgICAgICAgIG92ZXJyaWRlbi1pZHMgKz0gJCh0aGlzLW92ZXJyaWRlcykgOworICAgICAgICBpZiBhbGwgaW4gJCh0aGlzLW92ZXJyaWRlcykKKyAgICAgICAgeworICAgICAgICAgICAgYWxsLW92ZXJyaWRlcyArPSAkKGcpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAkKGFsbC1vdmVycmlkZXMpCisgICAgeworICAgICAgICB2aWFibGUtZ2VuZXJhdG9ycyA9ICQoYWxsLW92ZXJyaWRlcykgOworICAgIH0KKyAgICBsb2NhbCByZXN1bHQgOworICAgIGZvciBsb2NhbCBnIGluICQodmlhYmxlLWdlbmVyYXRvcnMpCisgICAgeworICAgICAgICBpZiAhIFsgJChnKS5pZCBdIGluICQob3ZlcnJpZGVuLWlkcykKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICQoZykgOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworLmNvbnN0cnVjdC1zdGFjayA9IDsKKworCisjIEF0dGVtcHRzIHRvIGNvbnN0cnVjdCBhIHRhcmdldCBieSBmaW5kaW5nIHZpYWJsZSBnZW5lcmF0b3JzLCBydW5uaW5nIHRoZW0gYW5kCisjIHNlbGVjdGluZyB0aGUgZGVwZW5kZW5jeSBncmFwaC4KKyMKK2xvY2FsIHJ1bGUgY29uc3RydWN0LXJlYWxseSAoIHByb2plY3QgbmFtZSA/IDogdGFyZ2V0LXR5cGUgOiBwcm9wZXJ0eS1zZXQgOgorICAgIHNvdXJjZXMgKiApCit7CisgICAgdmlhYmxlLWdlbmVyYXRvcnMgPSBbIGZpbmQtdmlhYmxlLWdlbmVyYXRvcnMgJCh0YXJnZXQtdHlwZSkgOgorICAgICAgICAkKHByb3BlcnR5LXNldCkgXSA7CisKKyAgICBnZW5lcmF0b3JzLmRvdXQgWyBpbmRlbnQgXSAiKioqICIgWyBzZXF1ZW5jZS5sZW5ndGggJCh2aWFibGUtZ2VuZXJhdG9ycykgXQorICAgICAgICAiIHZpYWJsZSBnZW5lcmF0b3JzIiA7CisKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGxvY2FsIGdlbmVyYXRvcnMtdGhhdC1zdWNjZWVkZWQgOworICAgIGZvciBsb2NhbCBnIGluICQodmlhYmxlLWdlbmVyYXRvcnMpCisgICAgeworICAgICAgICAjIFRoaXMgdmFyaWFibGUgd2lsbCBiZSByZXN0b3JlZCBvbiBleGl0IGZyb20gdGhpcyBzY29wZS4KKyAgICAgICAgbG9jYWwgLmFjdGl2ZS1nZW5lcmF0b3JzID0gJChnKSAkKC5hY3RpdmUtZ2VuZXJhdG9ycykgOworCisgICAgICAgIGxvY2FsIHIgPSBbIHRyeS1vbmUtZ2VuZXJhdG9yICQocHJvamVjdCkgJChuYW1lKSA6ICQoZykgOiAkKHRhcmdldC10eXBlKQorICAgICAgICAgICAgOiAkKHByb3BlcnR5LXNldCkgOiAkKHNvdXJjZXMpIF0gOworCisgICAgICAgIGlmICQocikKKyAgICAgICAgeworICAgICAgICAgICAgZ2VuZXJhdG9ycy10aGF0LXN1Y2NlZWRlZCArPSAkKGcpIDsKKyAgICAgICAgICAgIGlmICQocmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIkVycm9yOiBhbWJpZ3VpdHkgZm91bmQgd2hlbiBzZWFyY2hpbmcgZm9yIGJlc3QgdHJhbnNmb3JtYXRpb24iIDsKKyAgICAgICAgICAgICAgICBFQ0hPICJUcnlpbmcgdG8gcHJvZHVjZSB0eXBlICckKHRhcmdldC10eXBlKScgZnJvbTogIiA7CisgICAgICAgICAgICAgICAgZm9yIGxvY2FsIHMgaW4gJChzb3VyY2VzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRUNITyAiIC0gIiBbICQocykuc3RyIF0gOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFQ0hPICJHZW5lcmF0b3JzIHRoYXQgc3VjY2VlZGVkOiIgOworICAgICAgICAgICAgICAgIGZvciBsb2NhbCBnIGluICQoZ2VuZXJhdG9ycy10aGF0LXN1Y2NlZWRlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVDSE8gIiAtICIgWyAkKGcpLmlkIF0gOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFQ0hPICJGaXJzdCBnZW5lcmF0b3IgcHJvZHVjZWQ6ICIgOworICAgICAgICAgICAgICAgIGZvciBsb2NhbCB0IGluICQocmVzdWx0WzItXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVDSE8gIiAtICIgWyAkKHQpLnN0ciBdIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRUNITyAiU2Vjb25kIGdlbmVyYXRvciBwcm9kdWNlZDogIiA7CisgICAgICAgICAgICAgICAgZm9yIGxvY2FsIHQgaW4gJChyWzItXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVDSE8gIiAtICIgWyAkKHQpLnN0ciBdIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRVhJVCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gJChyKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIEF0dGVtcHRzIHRvIGNyZWF0ZSBhIHRhcmdldCBvZiAndGFyZ2V0LXR5cGUnIHdpdGggJ3Byb3BlcnRpZXMnIGZyb20gJ3NvdXJjZXMnLgorIyBUaGUgJ3NvdXJjZXMnIGFyZSB0cmVhdGVkIGFzIGEgY29sbGVjdGlvbiBvZiAqcG9zc2libGUqIGluZ3JpZGllbnRzLCBpLmUuCisjIHRoZXJlIGlzIG5vIG9ibGlnYXRpb24gdG8gY29uc3VtZSB0aGVtIGFsbC4KKyMKKyMgUmV0dXJucyBhIGxpc3Qgb2YgdGFyZ2V0cy4gV2hlbiB0aGlzIGludm9jYXRpb24gaXMgZmlyc3QgaW5zdGFuY2Ugb2YKKyMgJ2NvbnN0cnVjdCcgaW4gc3RhY2ssIHJldHVybnMgb25seSB0YXJnZXRzIG9mIHJlcXVlc3RlZCAndGFyZ2V0LXR5cGUnLAorIyBvdGhlcndpc2UsIHJldHVybnMgYWxzbyB1bnVzZWQgc291cmNlcyBhbmQgYWRkaXRpb25hbGx5IGdlbmVyYXRlZCB0YXJnZXRzLgorIworIyBJZiAndG9wLWxldmVsJyBpcyBzZXQsIGRvZXMgbm90IHN1cHByZXNzIGdlbmVyYXRvcnMgdGhhdCBhcmUgYWxyZWFkeQorIyB1c2VkIGluIHRoZSBzdGFjay4gVGhpcyBtYXkgYmUgdXNlZnVsIGluIGNhc2VzIHdoZXJlIGEgZ2VuZXJhdG9yCisjIGhhcyB0byBidWlsZCBhIG1ldGF0YXJnZXRzIC0tIGZvciBleGFtcGxlIGEgdGFyZ2V0IGNvcnJlc3BvbmRpbmcgdG8KKyMgYnVpbHQgdG9vbC4KKyMKK3J1bGUgY29uc3RydWN0ICggcHJvamVjdCBuYW1lID8gOiB0YXJnZXQtdHlwZSA6IHByb3BlcnR5LXNldCAqIDogc291cmNlcyAqIDogdG9wLWxldmVsID8gKQoreworICAgIGxvY2FsIHNhdmVkLXN0YWNrIDsKKyAgICBpZiAkKHRvcC1sZXZlbCkKKyAgICB7CisgICAgICAgIHNhdmVkLWFjdGl2ZSA9ICQoLmFjdGl2ZS1nZW5lcmF0b3JzKSA7CisgICAgICAgIC5hY3RpdmUtZ2VuZXJhdG9ycyA9IDsKKyAgICB9CisKKyAgICBpZiAoLmNvbnN0cnVjdC1zdGFjaykKKyAgICB7CisgICAgICAgIGVuc3VyZS10eXBlICQoc291cmNlcykgOworICAgIH0KKworICAgIC5jb25zdHJ1Y3Qtc3RhY2sgKz0gMSA7CisKKyAgICBpbmNyZWFzZS1pbmRlbnQgOworCisgICAgaWYgJCguZGVidWcpCisgICAgeworICAgICAgICBnZW5lcmF0b3JzLmRvdXQgWyBpbmRlbnQgXSAiKioqIGNvbnN0cnVjdCIgJCh0YXJnZXQtdHlwZSkgOworCisgICAgICAgIGZvciBsb2NhbCBzIGluICQoc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgZ2VuZXJhdG9ycy5kb3V0IFsgaW5kZW50IF0gIiAgICBmcm9tIiAkKHMpIDsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0b3JzLmRvdXQgWyBpbmRlbnQgXSAiICAgIHByb3BlcnRpZXM6IiBbICQocHJvcGVydHktc2V0KS5yYXcgXSA7CisgICAgfQorCisgICAgbG9jYWwgcmVzdWx0ID0gWyBjb25zdHJ1Y3QtcmVhbGx5ICQocHJvamVjdCkgJChuYW1lKSA6ICQodGFyZ2V0LXR5cGUpIDoKKyAgICAgICAgJChwcm9wZXJ0eS1zZXQpIDogJChzb3VyY2VzKSBdIDsKKworICAgIGRlY3JlYXNlLWluZGVudCA7CisKKyAgICAuY29uc3RydWN0LXN0YWNrID0gJCguY29uc3RydWN0LXN0YWNrWzItXSkgOworCisgICAgaWYgJCh0b3AtbGV2ZWwpCisgICAgeworICAgICAgICAuYWN0aXZlLWdlbmVyYXRvcnMgPSAkKHNhdmVkLWFjdGl2ZSkgOworICAgIH0KKworICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisjIEdpdmVuICdyZXN1bHQnLCBvYnRhaW5lZCBmcm9tIHNvbWUgZ2VuZXJhdG9yIG9yIGdlbmVyYXRvcnMuY29uc3RydWN0LCBhZGRzCisjICdyYXctcHJvcGVydGllcycgYXMgdXNhZ2UgcmVxdWlyZW1lbnRzIHRvIGl0LiBJZiByZXN1bHQgYWxyZWFkeSBjb250YWlucyB1c2FnZQorIyByZXF1aXJlbWVudHMgLS0gdGhhdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiByZXN1bHQgb2YgYW4gaW5zdGFuY2Ugb2YgdGhlCisjIHByb3BlcnR5LXNldCBjbGFzcywgdGhlIGV4aXN0aW5nIHVzYWdlIHJlcXVpcmVtZW50cyBhbmQgJ3Jhdy1wcm9wZXJ0aWVzJyBhcmUKKyMgY29tYmluZWQuCisjCitydWxlIGFkZC11c2FnZS1yZXF1aXJlbWVudHMgKCByZXN1bHQgKiA6IHJhdy1wcm9wZXJ0aWVzICogKQoreworICAgIGlmICQocmVzdWx0KQorICAgIHsKKyAgICAgICAgaWYgWyBjbGFzcy5pcy1hICQocmVzdWx0WzFdKSA6IHByb3BlcnR5LXNldCBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBbICQocmVzdWx0WzFdKS5hZGQtcmF3ICQocmF3LXByb3BlcnRpZXMpIF0gJChyZXN1bHRbMi1dKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQocmF3LXByb3BlcnRpZXMpIF0gJChyZXN1bHQpIDsKKyAgICAgICAgfQorICAgIH0KK30KKworcnVsZSBkdW1wICggKQoreworICAgIGZvciBsb2NhbCBnIGluICQoLmFsbC1nZW5lcmF0b3JzKQorICAgIHsKKyAgICAgICAgRUNITyBbICQoZykuaWQgXSAiOiIgWyAkKGcpLnNvdXJjZS10eXBlcyBdIC0+IFsgJChnKS50YXJnZXQtdHlwZXMgXSA7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL3Byb2plY3QuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9wcm9qZWN0LmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWEwOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9wcm9qZWN0LmphbQpAQCAtMCwwICsxLDEyMjggQEAKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMgRGF2ZSBBYnJhaGFtcworIyBDb3B5cmlnaHQgMjAwMiwgMjAwNSwgMjAwNiBSZW5lIFJpdmVyYQorIyBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBWbGFkaW1pciBQcnVzCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgSW1wbGVtZW50cyBwcm9qZWN0IHJlcHJlc2VudGF0aW9uIGFuZCBsb2FkaW5nLiBFYWNoIHByb2plY3QgaXMgcmVwcmVzZW50ZWQgYnk6CisjICAtIGEgbW9kdWxlIHdoZXJlIGFsbCB0aGUgSmFtZmlsZSBjb250ZW50IGxpdmVzLgorIyAgLSBhbiBpbnN0YW5jZSBvZiAncHJvamVjdC1hdHRyaWJ1dGVzJyBjbGFzcy4KKyMgICAgKGdpdmVuIGEgbW9kdWxlIG5hbWUsIGNhbiBiZSBvYnRhaW5lZCB1c2luZyB0aGUgJ2F0dHJpYnV0ZXMnIHJ1bGUpCisjICAtIGFuIGluc3RhbmNlIG9mICdwcm9qZWN0LXRhcmdldCcgY2xhc3MgKGZyb20gdGFyZ2V0cy5qYW0pCisjICAgIChnaXZlbiBhIG1vZHVsZSBuYW1lLCBjYW4gYmUgb2J0YWluZWQgdXNpbmcgdGhlICd0YXJnZXQnIHJ1bGUpCisjCisjIFR5cGljYWxseSwgcHJvamVjdHMgYXJlIGNyZWF0ZWQgYXMgcmVzdWx0IG9mIGxvYWRpbmcgYSBKYW1maWxlLCB3aGljaCBpcyBkb25lCisjIGJ5IHJ1bGVzICdsb2FkJyBhbmQgJ2luaXRpYWxpemUnLCBiZWxvdy4gRmlyc3QsIGEgbW9kdWxlIGlzIHByZXBhcmVkIGFuZCBhIG5ldworIyBwcm9qZWN0LWF0dHJpYnV0ZXMgaW5zdGFuY2UgaXMgY3JlYXRlZC4gU29tZSBydWxlcyBuZWNlc3NhcnkgZm9yIGFsbCBwcm9qZWN0cworIyBhcmUgYWRkZWQgdG8gdGhlIG1vZHVsZSAoc2VlIHRoZSAncHJvamVjdC1ydWxlcycgbW9kdWxlKS4gRGVmYXVsdCBwcm9qZWN0CisjIGF0dHJpYnV0ZXMgYXJlIHNldCAoaW5oZXJpdGluZyBwYXJlbnQgcHJvamVjdCBhdHRyaWJ1dGVzLCBpZiBpdCBleGlzdHMpLiBBZnRlcgorIyB0aGF0IHRoZSBKYW1maWxlIGlzIHJlYWQuIEl0IGNhbiBkZWNsYXJlIGl0cyBvd24gYXR0cmlidXRlcyB1c2luZyB0aGUKKyMgJ3Byb2plY3QnIHJ1bGUgd2hpY2ggd2lsbCBiZSBjb21iaW5lZCB3aXRoIGFueSBhbHJlYWR5IHNldC4KKyMKKyMgVGhlICdwcm9qZWN0JyBydWxlIGNhbiBhbHNvIGRlY2xhcmUgYSBwcm9qZWN0IGlkIHdoaWNoIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoCisjIHRoZSBwcm9qZWN0IG1vZHVsZS4KKyMKKyMgQmVzaWRlcyBKYW1maWxlIHByb2plY3RzLCB3ZSBhbHNvIHN1cHBvcnQgJ3N0YW5kYWxvbmUnIHByb2plY3RzIGNyZWF0ZWQgYnkKKyMgY2FsbGluZyAnaW5pdGlhbGl6ZScgaW4gYW4gYXJiaXRyYXJ5IG1vZHVsZSBhbmQgbm90IHNwZWNpZnlpbmcgdGhlIHByb2plY3QncworIyBsb2NhdGlvbi4gQWZ0ZXIgdGhlIGNhbGwsIHRoZSBtb2R1bGUgY2FuIGNhbGwgdGhlICdwcm9qZWN0JyBydWxlLCBkZWNsYXJlIG1haW4KKyMgdGFyZ2V0cyBhbmQgYmVoYXZlIGFzIGEgcmVndWxhciBwcm9qZWN0IGV4Y2VwdCB0aGF0LCBzaW5jZSBpdCBpcyBub3QKKyMgYXNzb2NpYXRlZCB3aXRoIGFueSBsb2NhdGlvbiwgaXQgc2hvdWxkIG9ubHkgZGVjbGFyZSBwcmVidWlsdCB0YXJnZXRzLgorIworIyBUaGUgbGlzdCBvZiBhbGwgbG9hZGVkIEphbWZpbGVzIGlzIHN0b3JlZCBpbiB0aGUgLnByb2plY3QtbG9jYXRpb25zIHZhcmlhYmxlLgorIyBJdCBpcyBwb3NzaWJsZSB0byBvYnRhaW4gYSBtb2R1bGUgbmFtZSBmb3IgYSBsb2NhdGlvbiB1c2luZyB0aGUgJ21vZHVsZS1uYW1lJworIyBydWxlLiBTdGFuZGFsb25lIHByb2plY3RzIGFyZSBub3QgcmVjb3JkZWQgYW5kIGNhbiBvbmx5IGJlIHJlZmVyZW5jZWQgdXNpbmcKKyMgdGhlaXIgcHJvamVjdCBpZC4KKworaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworaW1wb3J0IG1vZHVsZXMgOworaW1wb3J0IHBhdGggOworaW1wb3J0IHByaW50IDsKK2ltcG9ydCBwcm9wZXJ0eS1zZXQgOworaW1wb3J0IHNlcXVlbmNlIDsKKworCisuZGVidWctbG9hZGluZyA9IFsgTUFUQ0ggXigtLWRlYnVnLWxvYWRpbmcpJCA6IFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIF0gOworCisKKyMgTG9hZHMgdGhlIEphbWZpbGUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLiBBZnRlciBsb2FkaW5nLCBwcm9qZWN0IGdsb2JhbCBmaWxlCisjIGFuZCBKYW1maWxlcyBuZWVkZWQgYnkgdGhlIHJlcXVlc3RlZCBvbmUgd2lsbCBiZSBsb2FkZWQgcmVjdXJzaXZlbHkuIElmIHRoZQorIyBKYW1maWxlIGF0IHRoYXQgbG9jYXRpb24gaXMgbG9hZGVkIGFscmVhZHksIGRvZXMgbm90aGluZy4gUmV0dXJucyB0aGUgcHJvamVjdAorIyBtb2R1bGUgZm9yIHRoZSBKYW1maWxlLgorIworcnVsZSBsb2FkICggamFtZmlsZS1sb2NhdGlvbiApCit7CisgICAgbG9jYWwgbW9kdWxlLW5hbWUgPSBbIG1vZHVsZS1uYW1lICQoamFtZmlsZS1sb2NhdGlvbikgXSA7CisgICAgIyBJZiBKYW1maWxlIGlzIGFscmVhZHkgbG9hZGVkLCBkbyBub3QgdHJ5IGFnYWluLgorICAgIGlmICEgJChtb2R1bGUtbmFtZSkgaW4gJCguamFtZmlsZS1tb2R1bGVzKQorICAgIHsKKyAgICAgICAgaWYgJCguZGVidWctbG9hZGluZykKKyAgICAgICAgeworICAgICAgICAgICAgRUNITyBMb2FkaW5nIEphbWZpbGUgYXQgJyQoamFtZmlsZS1sb2NhdGlvbiknIDsKKyAgICAgICAgfQorCisgICAgICAgIGxvYWQtamFtZmlsZSAkKGphbWZpbGUtbG9jYXRpb24pIDogJChtb2R1bGUtbmFtZSkgOworCisgICAgICAgICMgV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBjaGlsZCBwcm9qZWN0IGFyZSBsb2FkZWQgb25seSBhZnRlciBwYXJlbnQKKyAgICAgICAgIyBwcm9qZWN0cy4gSW4gcGFydGljdWxhciwgYmVjYXVzZSBwYXJlbnQgcHJvamVjdHMgZGVmaW5lIGF0dHJpYnV0ZXMKKyAgICAgICAgIyB3aGljaCBhcmUgdGhlbiBpbmhlcml0ZWQgYnkgY2hpbGRyZW4sIGFuZCB3ZSBkbyBub3Qgd2FudCBjaGlsZHJlbiB0bworICAgICAgICAjIGJlIGxvYWRlZCBiZWZvcmUgcGFyZW50IGhhcyBkZWZpbmVkIGV2ZXJ5dGhpbmcuCisgICAgICAgICMKKyAgICAgICAgIyBXaGlsZSAiYnVpbGQtcHJvamVjdCIgYW5kICJ1c2UtcHJvamVjdCIgY2FuIHBvdGVudGlhbGx5IHJlZmVyIHRvIGNoaWxkCisgICAgICAgICMgcHJvamVjdHMgZnJvbSBwYXJlbnQgcHJvamVjdHMsIHdlIGRvIG5vdCBpbW1lZGlhdGVseSBsb2FkIGNoaWxkCisgICAgICAgICMgcHJvamVjdHMgd2hlbiBzZWVpbmcgdGhvc2UgYXR0cmlidXRlcy4gSW5zdGVhZCwgd2UgcmVjb3JkIHRoZSBtaW5pbWFsCisgICAgICAgICMgaW5mb3JtYXRpb24gdG8gYmUgdXNlZCBvbmx5IGxhdGVyLgorICAgICAgICBsb2FkLXVzZWQtcHJvamVjdHMgJChtb2R1bGUtbmFtZSkgOworICAgIH0KKyAgICByZXR1cm4gJChtb2R1bGUtbmFtZSkgOworfQorCisKK3J1bGUgbG9hZC11c2VkLXByb2plY3RzICggbW9kdWxlLW5hbWUgKQoreworICAgIGxvY2FsIHVzZWQgPSBbIG1vZHVsZXMucGVlayAkKG1vZHVsZS1uYW1lKSA6IC51c2VkLXByb2plY3RzIF0gOworICAgIGxvY2FsIGxvY2F0aW9uID0gWyBhdHRyaWJ1dGUgJChtb2R1bGUtbmFtZSkgbG9jYXRpb24gXSA7CisgICAgd2hpbGUgJCh1c2VkKQorICAgIHsKKyAgICAgICAgbG9jYWwgaWQgPSAkKHVzZWRbMV0pIDsKKyAgICAgICAgbG9jYWwgd2hlcmUgPSBbIHBhdGgubWFrZSAkKHVzZWRbMl0pIF0gOworICAgICAgICByZWdpc3Rlci1pZCAkKGlkKSA6IFsgbG9hZCBbIHBhdGgucm9vdCAkKHdoZXJlKSAkKGxvY2F0aW9uKSBdIF0gOworICAgICAgICB1c2VkID0gJCh1c2VkWzMtXSkgOworICAgIH0KK30KKworCisjIE5vdGUgdGhlIHVzZSBvZiBjaGFyYWN0ZXIgZ3JvdXBzLCBhcyBvcHBvc2VkIHRvIGxpc3RpbmcgJ0phbXJvb3QnIGFuZAorIyAnamFtcm9vdCcuIFdpdGggdGhlIGxhdHRlciwgd2Ugd291bGQgZ2V0IGR1cGxpY2F0ZSBtYXRjaGVzIG9uIFdpbmRvd3MgYW5kCisjIHdvdWxkIGhhdmUgdG8gZWxpbWluYXRlIGR1cGxpY2F0ZXMuCitKQU1ST09UID89IFsgbW9kdWxlcy5wZWVrIDogSkFNUk9PVCBdIDsKK0pBTVJPT1QgPz0gcHJvamVjdC1yb290LmphbSBbSmpdYW1yb290IFtKal1hbXJvb3QuamFtIDsKKworCisjIExvYWRzIHBhcmVudCBvZiBKYW1maWxlIGF0ICdsb2NhdGlvbicuIElzc3VlcyBhbiBlcnJvciBpZiBub3RoaW5nIGlzIGZvdW5kLgorIworcnVsZSBsb2FkLXBhcmVudCAoIGxvY2F0aW9uICkKK3sKKyAgICBsb2NhbCBmb3VuZCA9IFsgcGF0aC5nbG9iLWluLXBhcmVudHMgJChsb2NhdGlvbikgOiAkKEpBTVJPT1QpICQoSkFNRklMRSkgXSA7CisgICAgaWYgISAkKGZvdW5kKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciBDb3VsZCBub3QgZmluZCBwYXJlbnQgImZvciIgcHJvamVjdCBhdCAnJChsb2NhdGlvbiknIDoKKyAgICAgICAgICAgIERpZCBub3QgZmluZCBKYW1maWxlLmphbSBvciBKYW1yb290LmphbSAiaW4iIGFueSBwYXJlbnQgZGlyZWN0b3J5LiA7CisgICAgfQorICAgIHJldHVybiBbIGxvYWQgJChmb3VuZFsxXTpEKSBdIDsKK30KKworCisjIFJldHVybnMgdGhlIHByb2plY3QgbW9kdWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb2plY3QtaWQgb3IgcGxhaW4KKyMgZGlyZWN0b3J5IG5hbWUuIFJldHVybnMgbm90aGluZyBpZiBzdWNoIGEgcHJvamVjdCBjYW4gbm90IGJlIGZvdW5kLgorIworcnVsZSBmaW5kICggbmFtZSA6IGN1cnJlbnQtbG9jYXRpb24gKQoreworICAgIGxvY2FsIHByb2plY3QtbW9kdWxlIDsKKworICAgICMgVHJ5IGludGVycHJldGluZyBuYW1lIGFzIHByb2plY3QgaWQuCisgICAgaWYgWyBwYXRoLmlzLXJvb3RlZCAkKG5hbWUpIF0KKyAgICB7CisgICAgICAgIHByb2plY3QtbW9kdWxlID0gJCgkKG5hbWUpLmphbWZpbGUtbW9kdWxlKSA7CisgICAgfQorCisgICAgaWYgISAkKHByb2plY3QtbW9kdWxlKQorICAgIHsKKyAgICAgICAgbG9jYWwgbG9jYXRpb24gPSBbIHBhdGgucm9vdCBbIHBhdGgubWFrZSAkKG5hbWUpIF0gJChjdXJyZW50LWxvY2F0aW9uKSBdCisgICAgICAgICAgICA7CisKKyAgICAgICAgIyBJZiBubyBwcm9qZWN0IGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBsb2NhdGlvbiwgdHJ5IHRvIGxvYWQgaXQuCisgICAgICAgICMgRmlyc3Qgc2VlIGlmIHdlIGhhdmUgYSBKYW1maWxlLiBJZiBub3QsIHRoZW4gc2VlIGlmIHdlIG1pZ2h0IGhhdmUgYQorICAgICAgICAjIHByb2plY3Qgcm9vdCB3aWxsaW5nIHRvIGFjdCBhcyBhIEphbWZpbGUuIEluIHRoYXQgY2FzZSwgcHJvamVjdCByb290CisgICAgICAgICMgbXVzdCBiZSBwbGFjZWQgaW4gdGhlIGRpcmVjdG9yeSByZWZlcnJlZCB0byBieSBpZC4KKworICAgICAgICBwcm9qZWN0LW1vZHVsZSA9IFsgbW9kdWxlLW5hbWUgJChsb2NhdGlvbikgXSA7CisgICAgICAgIGlmICEgJChwcm9qZWN0LW1vZHVsZSkgaW4gJCguamFtZmlsZS1tb2R1bGVzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiBbIHBhdGguZ2xvYiAkKGxvY2F0aW9uKSA6ICQoSkFNUk9PVCkgJChKQU1GSUxFKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvamVjdC1tb2R1bGUgPSBbIGxvYWQgJChsb2NhdGlvbikgXSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvamVjdC1tb2R1bGUgPSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gJChwcm9qZWN0LW1vZHVsZSkgOworfQorCisKKyMgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGNvcnJlc3BvbmRpbmcgdG8gJ2phbWZpbGUtbG9jYXRpb24nLiBJZiBubworIyBtb2R1bGUgY29ycmVzcG9uZHMgdG8gdGhhdCBsb2NhdGlvbiB5ZXQsIGFzc29jaWF0ZXMgdGhlIGRlZmF1bHQgbW9kdWxlIG5hbWUKKyMgd2l0aCB0aGF0IGxvY2F0aW9uLgorIworcnVsZSBtb2R1bGUtbmFtZSAoIGphbWZpbGUtbG9jYXRpb24gKQoreworICAgIGlmICEgJCgubW9kdWxlLiQoamFtZmlsZS1sb2NhdGlvbikpCisgICAgeworICAgICAgICAjIFJvb3QgdGhlIHBhdGgsIHNvIHRoYXQgbG9jYXRpb25zIGFyZSBhbHdheXMgdW5hbWJpZ3VvdXMuIFdpdGhvdXQgdGhpcywKKyAgICAgICAgIyB3ZSBjYW4gbm90IGRlY2lkZSBpZiAnLi4vLi4vZXhlL3Byb2dyYW0xJyBhbmQgJy4nIGFyZSB0aGUgc2FtZSBwYXRocy4KKyAgICAgICAgbG9jYWwgbm9ybWFsaXplZCA9IFsgcGF0aC5yb290ICQoamFtZmlsZS1sb2NhdGlvbikgWyBwYXRoLnB3ZCBdIF0gOworCisgICAgICAgICMgUXVpY2sgJiBkaXJ0eSBmaXggdG8gZ2V0IHRoZSBzYW1lIG1vZHVsZSBuYW1lIHdoZW4gd2Ugc3VwcGx5IHR3bworICAgICAgICAjIGVxdWl2YWxlbnQgbG9jYXRpb24gcGF0aHMsIGUuZy4gJ2Q6XEZvbycgJiAnRDpcZk9vXGJhclwuLicgb24gV2luZG93cy4KKyAgICAgICAgIyBOb3RlIHRoYXQgb3VyIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgaWYgdGhlCisgICAgICAgICMgZ2l2ZW4gbG9jYXRpb24gcmVmZXJlbmNlcyBhbiBlbXB0eSBmb2xkZXIsIGJ1dCBpbiB0aGF0IGNhc2UgYW55IGxhdGVyCisgICAgICAgICMgYXR0ZW1wdCB0byBsb2FkIGEgSmFtZmlsZSBmcm9tIHRoaXMgbG9jYXRpb24gd2lsbCBmYWlsIGFueXdheS4KKyAgICAgICAgIyBGSVhNRTogSW1wbGVtZW50IHRoaXMgY2xlYW5seS4gU3VwcG9ydCBmb3IgdGhpcyB0eXBlIG9mIHBhdGgKKyAgICAgICAgIyBub3JtYWxpemF0aW9uIGFscmVhZHkgZXhpc3RzIGludGVybmFsbHkgaW4gQm9vc3QgSmFtIGFuZCB0aGUgY3VycmVudAorICAgICAgICAjIGZpeCByZWxpZXMgb24gdGhlIEdMT0IgYnVpbHRpbiBydWxlIHVzaW5nIHRoYXQgc3VwcG9ydC4gTW9zdCBsaWtlbHkgd2UKKyAgICAgICAgIyBqdXN0IG5lZWQgdG8gYWRkIGEgbmV3IGJ1aWx0aW4gcnVsZSB0byBkbyB0aGlzIGV4cGxpY2l0bHkuCisgICAgICAgIG5vcm1hbGl6ZWQgPSBbIE5PUk1BTElaRV9QQVRIICQobm9ybWFsaXplZCkgXSA7CisgICAgICAgIGxvY2FsIGdsb2ItcmVzdWx0ID0gWyBHTE9CIFsgcGF0aC5uYXRpdmUgJChub3JtYWxpemVkKSBdIDogKiBdIDsKKyAgICAgICAgaWYgJChnbG9iLXJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgbm9ybWFsaXplZCA9ICQoZ2xvYi1yZXN1bHRbMV06RCkgOworICAgICAgICB9CisgICAgICAgIC5tb2R1bGUuJChqYW1maWxlLWxvY2F0aW9uKSA9IEphbWZpbGU8JChub3JtYWxpemVkKT4gOworICAgIH0KKyAgICByZXR1cm4gJCgubW9kdWxlLiQoamFtZmlsZS1sb2NhdGlvbikpIDsKK30KKworCisjIERlZmF1bHQgcGF0dGVybnMgdG8gc2VhcmNoIGZvciB0aGUgSmFtZmlsZXMgdG8gdXNlIGZvciBidWlsZCBkZWNsYXJhdGlvbnMuCisjCitKQU1GSUxFID0gWyBtb2R1bGVzLnBlZWsgOiBKQU1GSUxFIF0gOworSkFNRklMRSA/PSBbQmJddWlsZC5qYW0gW0pqXWFtZmlsZS52MiBbSmpdYW1maWxlIFtKal1hbWZpbGUuamFtIDsKKworCisjIEZpbmQgdGhlIEphbWZpbGUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLiBUaGlzIHJldHVybnMgdGhlIGV4YWN0IG5hbWVzIG9mIGFsbAorIyB0aGUgSmFtZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeS4gVGhlIG9wdGlvbmFsIHBhcmVudC1yb290IGFyZ3VtZW50IGNhdXNlcworIyB0aGlzIHRvIHNlYXJjaCBub3QgdGhlIGdpdmVuIGRpcmVjdG9yeSBidXQgdGhlIG9uZXMgYWJvdmUgaXQgdXAgdG8gdGhlCisjIHBhcmVudC1yb290IGRpcmVjdG9yeS4KKyMKK3J1bGUgZmluZC1qYW1maWxlICgKKyAgICBkaXIgICAgICAgICAgICAjIFRoZSBkaXJlY3RvcnkocykgdG8gbG9vayBmb3IgYSBKYW1maWxlLgorICAgIHBhcmVudC1yb290ID8gICMgT3B0aW9uYWwgZmxhZyBpbmRpY2F0aW5nIHRvIHNlYXJjaCBmb3IgdGhlIHBhcmVudCBKYW1maWxlLgorICAgIDogbm8tZXJyb3JzID8KKyAgICApCit7CisgICAgIyBHbG9iIGZvciBhbGwgdGhlIHBvc3NpYmxlIEphbWZpbGVzIGFjY29yZGluZyB0byB0aGUgbWF0Y2ggcGF0dGVybi4KKyAgICAjCisgICAgbG9jYWwgamFtZmlsZS1nbG9iID0gOworICAgIGlmICQocGFyZW50LXJvb3QpCisgICAgeworICAgICAgICBpZiAhICQoLnBhcmVudC1qYW1maWxlLiQoZGlyKSkKKyAgICAgICAgeworICAgICAgICAgICAgLnBhcmVudC1qYW1maWxlLiQoZGlyKSA9IFsgcGF0aC5nbG9iLWluLXBhcmVudHMgJChkaXIpIDogJChKQU1GSUxFKQorICAgICAgICAgICAgICAgIF0gOworICAgICAgICB9CisgICAgICAgIGphbWZpbGUtZ2xvYiA9ICQoLnBhcmVudC1qYW1maWxlLiQoZGlyKSkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAhICQoLmphbWZpbGUuJChkaXIpKQorICAgICAgICB7CisgICAgICAgICAgICAuamFtZmlsZS4kKGRpcikgPSBbIHBhdGguZ2xvYiAkKGRpcikgOiAkKEpBTUZJTEUpIF0gOworICAgICAgICB9CisgICAgICAgIGphbWZpbGUtZ2xvYiA9ICQoLmphbWZpbGUuJChkaXIpKSA7CisKKyAgICB9CisKKyAgICBsb2NhbCBqYW1maWxlLXRvLWxvYWQgPSAkKGphbWZpbGUtZ2xvYikgOworICAgICMgTXVsdGlwbGUgSmFtZmlsZXMgZm91bmQgaW4gdGhlIHNhbWUgcGxhY2UuIFdhcm4gYWJvdXQgdGhpcyBhbmQgZW5zdXJlIHdlCisgICAgIyB1c2Ugb25seSBvbmUgb2YgdGhlbS4gQXMgYSB0ZW1wb3JhcnkgY29udmVuaWVuY2UgbWVhc3VyZSwgaWYgdGhlcmUgaXMKKyAgICAjIEphbWZpbGUudjIgYW1vbmcgZm91bmQgZmlsZXMsIHN1cHByZXNzIHRoZSB3YXJuaW5nIGFuZCB1c2UgaXQuCisgICAgIworICAgIGlmICQoamFtZmlsZS10by1sb2FkWzItXSkKKyAgICB7CisgICAgICAgIGxvY2FsIHYyLWphbWZpbGVzID0gWyBNQVRDSCBeKC4qW0pqXWFtZmlsZVxcLnYyKXwoLipbQmJddWlsZFxcLmphbSkkIDoKKyAgICAgICAgICAgICQoamFtZmlsZS10by1sb2FkKSBdIDsKKworICAgICAgICBpZiAkKHYyLWphbWZpbGVzKSAmJiAhICQodjItamFtZmlsZXNbMl0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGphbWZpbGUtdG8tbG9hZCA9ICQodjItamFtZmlsZXMpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGphbWZpbGUgPSBbIHBhdGguYmFzZW5hbWUgJChqYW1maWxlLXRvLWxvYWRbMV0pIF0gOworICAgICAgICAgICAgRUNITyAid2FybmluZzogRm91bmQgbXVsdGlwbGUgSmFtZmlsZXMgYXQgJyIkKGRpcikiJyEiCisgICAgICAgICAgICAgICAgIkxvYWRpbmcgdGhlIGZpcnN0IG9uZTogJyQoamFtZmlsZSknLiIgOworICAgICAgICB9CisKKyAgICAgICAgamFtZmlsZS10by1sb2FkID0gJChqYW1maWxlLXRvLWxvYWRbMV0pIDsKKyAgICB9CisKKyAgICAjIENvdWxkIG5vdCBmaW5kIGl0LCBlcnJvci4KKyAgICAjCisgICAgaWYgISAkKG5vLWVycm9ycykgJiYgISAkKGphbWZpbGUtdG8tbG9hZCkKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgVW5hYmxlIHRvIGxvYWQgSmFtZmlsZS4KKyAgICAgICAgICAgIDogQ291bGQgbm90IGZpbmQgYSBKYW1maWxlIGluIGRpcmVjdG9yeSAnJChkaXIpJy4KKyAgICAgICAgICAgIDogQXR0ZW1wdGVkIHRvIGZpbmQgaXQgd2l0aCBwYXR0ZXJuICckKEpBTUZJTEU6Sj0iICIpJy4KKyAgICAgICAgICAgIDogUGxlYXNlIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gYXQgJ2h0dHA6Ly93d3cuYm9vc3Qub3JnJy4gOworICAgIH0KKworICAgIHJldHVybiAkKGphbWZpbGUtdG8tbG9hZCkgOworfQorCisKKyMgTG9hZCBhIEphbWZpbGUgYXQgdGhlIGdpdmVuIGRpcmVjdG9yeS4gUmV0dXJucyBub3RoaW5nLiBXaWxsIGF0dGVtcHQgdG8gbG9hZAorIyB0aGUgZmlsZSBhcyBpbmRpY2F0ZWQgYnkgdGhlIEpBTUZJTEUgcGF0dGVybnMuIEVmZmVjdCBvZiBjYWxsaW5nIHRoaXMgcnVsZQorIyB0d2ljZSB3aXRoIHRoZSBzYW1lICdkaXInIGlzIHVuZGVmaW5lZC4KKyMKK2xvY2FsIHJ1bGUgbG9hZC1qYW1maWxlICggZGlyIDogamFtZmlsZS1tb2R1bGUgKQoreworICAgICMgU2VlIGlmIHRoZSBKYW1maWxlIGlzIHdoZXJlIGl0IHNob3VsZCBiZS4KKyAgICAjCisgICAgbG9jYWwgamFtZmlsZS10by1sb2FkID0gWyBwYXRoLmdsb2IgJChkaXIpIDogJChKQU1ST09UKSBdIDsKKyAgICBpZiAhICQoamFtZmlsZS10by1sb2FkKQorICAgIHsKKyAgICAgICAgamFtZmlsZS10by1sb2FkID0gWyBmaW5kLWphbWZpbGUgJChkaXIpIF0gOworICAgIH0KKworICAgIGlmICQoamFtZmlsZS10by1sb2FkWzJdKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciAiTXVsdGlwbGUgSmFtZmlsZXMgZm91bmQgYXQgJyQoZGlyKSciIDoKKyAgICAgICAgICAgICJGaWxlbmFtZXMgYXJlOiAiICQoamFtZmlsZS10by1sb2FkOkQ9KSA7CisgICAgfQorCisgICAgIyBOb3cgbG9hZCB0aGUgSmFtZmlsZSBpbiBpdHMgb3duIGNvbnRleHQuCisgICAgIyBUaGUgY2FsbCB0byAnaW5pdGlhbGl6ZScgbWF5IGxvYWQgdGhlIHBhcmVudCBKYW1maWxlLCB3aGljaCBtaWdodCBjb250YWluCisgICAgIyBhICd1c2UtcHJvamVjdCcgb3IgYSAncHJvamVjdC5sb2FkJyBjYWxsLCBjYXVzaW5nIGEgc2Vjb25kIGF0dGVtcHQgdG8gbG9hZAorICAgICMgdGhlIHNhbWUgcHJvamVjdCB3ZSBhcmUgbG9hZGluZyBub3cuIENoZWNraW5nIGluc2lkZSAuamFtZmlsZS1tb2R1bGVzCisgICAgIyBwcmV2ZW50cyB0aGF0IHNlY29uZCBhdHRlbXB0IGZyb20gbWVzc2luZyB0aGluZ3MgdXAuCisgICAgaWYgISAkKGphbWZpbGUtbW9kdWxlKSBpbiAkKC5qYW1maWxlLW1vZHVsZXMpCisgICAgeworICAgICAgICBsb2NhbCBwcmV2aW91cy1wcm9qZWN0ID0gJCguY3VycmVudC1wcm9qZWN0KSA7CisKKyAgICAgICAgIyBJbml0aWFsaXplIHRoZSBKYW1maWxlIG1vZHVsZSBiZWZvcmUgbG9hZGluZy4KKyAgICAgICAgaW5pdGlhbGl6ZSAkKGphbWZpbGUtbW9kdWxlKSA6IFsgcGF0aC5wYXJlbnQgJChqYW1maWxlLXRvLWxvYWQpIF0gOgorICAgICAgICAgICAgJChqYW1maWxlLXRvLWxvYWQ6QlMpIDsKKworICAgICAgICBpZiAhICQoamFtZmlsZS1tb2R1bGUpIGluICQoLmphbWZpbGUtbW9kdWxlcykKKyAgICAgICAgeworICAgICAgICAgICAgLmphbWZpbGUtbW9kdWxlcyArPSAkKGphbWZpbGUtbW9kdWxlKSA7CisKKyAgICAgICAgICAgIGxvY2FsIHNhdmVkLXByb2plY3QgPSAkKC5jdXJyZW50LXByb2plY3QpIDsKKworICAgICAgICAgICAgbWFyay1hcy11c2VyICQoamFtZmlsZS1tb2R1bGUpIDsKKyAgICAgICAgICAgIG1vZHVsZXMubG9hZCAkKGphbWZpbGUtbW9kdWxlKSA6IFsgcGF0aC5uYXRpdmUgJChqYW1maWxlLXRvLWxvYWQpIF0KKyAgICAgICAgICAgICAgICA6IC4gOworICAgICAgICAgICAgaWYgWyBNQVRDSCBeKCQoSkFNUk9PVCkpJCA6ICQoamFtZmlsZS10by1sb2FkOkJTKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgamFtZmlsZSA9IFsgZmluZC1qYW1maWxlICQoZGlyKSA6IG5vLWVycm9ycyBdIDsKKyAgICAgICAgICAgICAgICBpZiAkKGphbWZpbGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2FkLWF1eCAkKGphbWZpbGUtbW9kdWxlKSA6IFsgcGF0aC5uYXRpdmUgJChqYW1maWxlKSBdIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgTm93IGRvIHNvbWUgY2hlY2tzLgorICAgICAgICAgICAgaWYgJCguY3VycmVudC1wcm9qZWN0KSAhPSAkKHNhdmVkLXByb2plY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICAgICAgZXJyb3JzLmVycm9yCisgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgLmN1cnJlbnQtcHJvamVjdCB2YXJpYWJsZSBoYXMgbWFnaWNhbGx5CisgICAgICAgICAgICAgICAgICAgIDogY2hhbmdlZCBhZnRlciBsb2FkaW5nIGEgSmFtZmlsZS4gVGhpcyBtZWFucyBzb21lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICA6IHRhcmdldHMgbWlnaHQgYmUgZGVmaW5lZCBpbiB0aGUgd3JvbmcgcHJvamVjdC4KKyAgICAgICAgICAgICAgICAgICAgOiBhZnRlciBsb2FkaW5nICQoamFtZmlsZS1tb2R1bGUpCisgICAgICAgICAgICAgICAgICAgIDogZXhwZWN0ZWQgdmFsdWUgJChzYXZlZC1wcm9qZWN0KQorICAgICAgICAgICAgICAgICAgICA6IGFjdHVhbCB2YWx1ZSAkKC5jdXJyZW50LXByb2plY3QpIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW5kLWxvYWQgJChwcmV2aW91cy1wcm9qZWN0KSA7CisKKyAgICAgICAgICAgIGlmICQoLmdsb2JhbC1idWlsZC1kaXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgWyBhdHRyaWJ1dGUgJChqYW1maWxlLW1vZHVsZSkgbG9jYXRpb24gXSAmJiAhIFsgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICQoamFtZmlsZS1tb2R1bGUpIGlkIF0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsIHByb2plY3Qtcm9vdCA9IFsgYXR0cmlidXRlICQoamFtZmlsZS1tb2R1bGUpCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LXJvb3QgXSA7CisgICAgICAgICAgICAgICAgICAgIGlmICQocHJvamVjdC1yb290KSA9ICQoZGlyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFQ0hPICJ3YXJuaW5nOiB0aGUgLS1idWlsZC1kaXIgb3B0aW9uIHdhcyBzcGVjaWZpZWQiIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVDSE8gIndhcm5pbmc6IGJ1dCBKYW1yb290IGF0ICckKGRpciknIiA7CisgICAgICAgICAgICAgICAgICAgICAgICBFQ0hPICJ3YXJuaW5nOiBzcGVjaWZpZWQgbm8gcHJvamVjdCBpZCIgOworICAgICAgICAgICAgICAgICAgICAgICAgRUNITyAid2FybmluZzogdGhlIC0tYnVpbGQtZGlyIG9wdGlvbiB3aWxsIGJlIGlnbm9yZWQiIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisjIENhbGxlZCB3aGVuIGRvbmUgbG9hZGluZyBhIHByb2plY3QgbW9kdWxlLiBSZXN0b3JlcyB0aGUgY3VycmVudCBwcm9qZWN0IHRvIGl0cworIyBwcmV2aW91cyB2YWx1ZSBhbmQgZG9lcyBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcgdG8gbWFrZSBzdXJlIG91ciAnY3VycmVudGx5CisjIGxvYWRlZCBwcm9qZWN0JyBpZGVudGlmaWVyIGRvZXMgbm90IGdldCBsZWZ0IHdpdGggYW4gaW52YWxpZCB2YWx1ZS4KKyMKK3J1bGUgZW5kLWxvYWQgKCBwcmV2aW91cy1wcm9qZWN0ID8gKQoreworICAgIGlmICEgJCguY3VycmVudC1wcm9qZWN0KQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciBFbmRpbmcgcHJvamVjdCBsb2FkaW5nIHJlcXVlc3RlZCB3aGVuIHRoZXJlIHdhcyBubyBwcm9qZWN0CisgICAgICAgICAgICBjdXJyZW50bHkgYmVpbmcgbG9hZGVkLiA7CisgICAgfQorCisgICAgaWYgISAkKHByZXZpb3VzLXByb2plY3QpICYmICQoLnNhdmVkLWN1cnJlbnQtcHJvamVjdCkKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgRW5kaW5nIHByb2plY3QgbG9hZGluZyByZXF1ZXN0ZWQgd2l0aCBubyAncHJldmlvdXMgcHJvamVjdCcKKyAgICAgICAgICAgIHdoZW4gdGhlcmUgd2VyZSBvdGhlciBwcm9qZWN0cyBzdGlsbCBtYXJrZWQgYXMgYmVpbmcgbG9hZGVkCisgICAgICAgICAgICByZWN1cnNpdmVseS4gOworICAgIH0KKworICAgIC5jdXJyZW50LXByb2plY3QgPSAkKHByZXZpb3VzLXByb2plY3QpIDsKK30KKworCitydWxlIG1hcmstYXMtdXNlciAoIG1vZHVsZS1uYW1lICkKK3sKKyAgICBpZiBVU0VSX01PRFVMRSBpbiBbIFJVTEVOQU1FUyBdCisgICAgeworICAgICAgICBVU0VSX01PRFVMRSAkKG1vZHVsZS1uYW1lKSA7CisgICAgfQorfQorCisKK3J1bGUgbG9hZC1hdXggKCBtb2R1bGUtbmFtZSA6IGZpbGUgKQoreworICAgIG1hcmstYXMtdXNlciAkKG1vZHVsZS1uYW1lKSA7CisKKyAgICBtb2R1bGUgJChtb2R1bGUtbmFtZSkKKyAgICB7CisgICAgICAgIGluY2x1ZGUgJCgyKSA7CisgICAgICAgIGxvY2FsIHJ1bGVzID0gWyBSVUxFTkFNRVMgJCgxKSBdIDsKKyAgICAgICAgSU1QT1JUICQoMSkgOiAkKHJ1bGVzKSA6ICQoMSkgOiAkKDEpLiQocnVsZXMpIDsKKyAgICB9Cit9CisKKworLmdsb2JhbC1idWlsZC1kaXIgPSBbIE1BVENIIF4tLWJ1aWxkLWRpcj0oLiopJCA6IFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIF0gOworaWYgJCguZ2xvYmFsLWJ1aWxkLWRpcikKK3sKKyAgICAjIElmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIHNldmVyYWwgdGltZXMsIHRha2UgdGhlIGxhc3QgdmFsdWUuCisgICAgLmdsb2JhbC1idWlsZC1kaXIgPSBbIHBhdGgubWFrZSAkKC5nbG9iYWwtYnVpbGQtZGlyWy0xXSkgXSA7Cit9CisKKworIyBJbml0aWFsaXplIHRoZSBtb2R1bGUgZm9yIGEgcHJvamVjdC4KKyMKK3J1bGUgaW5pdGlhbGl6ZSAoCisgICAgbW9kdWxlLW5hbWUgICAjIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG1vZHVsZS4KKyAgICA6IGxvY2F0aW9uID8gICMgVGhlIGxvY2F0aW9uIChkaXJlY3RvcnkpIG9mIHRoZSBwcm9qZWN0IHRvIGluaXRpYWxpemUuIElmCisgICAgICAgICAgICAgICAgICAjIG5vdCBzcGVjaWZpZWQsIGEgc3RhbmRhbG9uZSBwcm9qZWN0IHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICAgOiBiYXNlbmFtZSA/CisgICAgKQoreworICAgIGlmICQoLmRlYnVnLWxvYWRpbmcpCisgICAgeworICAgICAgICBFQ0hPICJJbml0aWFsaXppbmcgcHJvamVjdCAnJChtb2R1bGUtbmFtZSknIiA7CisgICAgfQorCisgICAgbG9jYWwgamFtcm9vdCA7CisKKyAgICBsb2NhbCBwYXJlbnQtbW9kdWxlIDsKKyAgICBpZiAkKG1vZHVsZS1uYW1lKSA9IHRlc3QtY29uZmlnCisgICAgeworICAgICAgICAjIE5vIHBhcmVudC4KKyAgICB9CisgICAgZWxzZSBpZiAkKG1vZHVsZS1uYW1lKSA9IHNpdGUtY29uZmlnCisgICAgeworICAgICAgICBwYXJlbnQtbW9kdWxlID0gdGVzdC1jb25maWcgOworICAgIH0KKyAgICBlbHNlIGlmICQobW9kdWxlLW5hbWUpID0gdXNlci1jb25maWcKKyAgICB7CisgICAgICAgIHBhcmVudC1tb2R1bGUgPSBzaXRlLWNvbmZpZyA7CisgICAgfQorICAgIGVsc2UgaWYgJChtb2R1bGUtbmFtZSkgPSBwcm9qZWN0LWNvbmZpZworICAgIHsKKyAgICAgICAgcGFyZW50LW1vZHVsZSA9IHVzZXItY29uZmlnIDsKKyAgICB9CisgICAgZWxzZSBpZiAkKGxvY2F0aW9uKSAmJiAhIFsgTUFUQ0ggXigkKEpBTVJPT1QpKSQgOiAkKGJhc2VuYW1lKSBdCisgICAgeworICAgICAgICAjIFdlIHNlYXJjaCBmb3IgcGFyZW50L2phbXJvb3Qgb25seSBpZiB0aGlzIGlzIGEgamFtZmlsZSBwcm9qZWN0LCBpLmUuCisgICAgICAgICMgaWYgaXMgbm90IGEgc3RhbmRhbG9uZSBvciBhIGphbXJvb3QgcHJvamVjdC4KKyAgICAgICAgcGFyZW50LW1vZHVsZSA9IFsgbG9hZC1wYXJlbnQgJChsb2NhdGlvbikgXSA7CisgICAgfQorICAgIGVsc2UgaWYgJChsb2NhdGlvbikKKyAgICB7CisgICAgICAgICMgV2UgaGF2ZSBhIGphbXJvb3QgcHJvamVjdC4gSW5oZXJpdCBmcm9tIHVzZXItY29uZmlnIChvciBwcm9qZWN0LWNvbmZpZworICAgICAgICAjIGlmIGl0IGV4aXN0cykuCisgICAgICAgIGlmICQocHJvamVjdC1jb25maWcuYXR0cmlidXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgcGFyZW50LW1vZHVsZSA9IHByb2plY3QtY29uZmlnIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcmVudC1tb2R1bGUgPSB1c2VyLWNvbmZpZyA7CisgICAgICAgIH0KKyAgICAgICAgamFtcm9vdCA9IHRydWUgOworICAgIH0KKworICAgICMgVE9ETzogbmVlZCB0byBjb25zaWRlciBpZiBzdGFuZGFsb25lIHByb2plY3RzIGNhbiBkbyBhbnl0aGluZyBidXQgZGVmaW5lCisgICAgIyBwcmVidWlsdCB0YXJnZXRzLiBJZiBzbywgd2UgbmVlZCB0byBnaXZlIHRoZW0gYSBtb3JlIHNlbnNpYmxlICJsb2NhdGlvbiIsCisgICAgIyBzbyB0aGF0IHNvdXJjZSBwYXRocyBhcmUgY29ycmVjdC4KKyAgICBsb2NhdGlvbiA/PSAiIiA7CisgICAgIyBDcmVhdGUgdGhlIG1vZHVsZSBmb3IgdGhlIEphbWZpbGUgZmlyc3QuCisgICAgbW9kdWxlICQobW9kdWxlLW5hbWUpCisgICAgeworICAgIH0KKworICAgICMgbG9hZC1wYXJlbnQgY2FuIGVuZCB1cCBsb2FkaW5nIHRoaXMgbW9kdWxlIGFnYWluLiBNYWtlIHN1cmUgdGhpcyBpcyBub3QKKyAgICAjIGR1cGxpY2F0ZWQuCisgICAgaWYgISAkKCQobW9kdWxlLW5hbWUpLmF0dHJpYnV0ZXMpCisgICAgeworICAgICAgICAkKG1vZHVsZS1uYW1lKS5hdHRyaWJ1dGVzID0gWyBuZXcgcHJvamVjdC1hdHRyaWJ1dGVzICQobG9jYXRpb24pCisgICAgICAgICAgICAkKG1vZHVsZS1uYW1lKSBdIDsKKyAgICAgICAgbG9jYWwgYXR0cmlidXRlcyA9ICQoJChtb2R1bGUtbmFtZSkuYXR0cmlidXRlcykgOworCisgICAgICAgIGlmICQobG9jYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgICQoYXR0cmlidXRlcykuc2V0IHNvdXJjZS1sb2NhdGlvbiA6IFsgcGF0aC5tYWtlICQobG9jYXRpb24pIF0gOgorICAgICAgICAgICAgICAgIGV4YWN0IDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGNmZ3MgPSBwcm9qZWN0IHNpdGUgdGVzdCB1c2VyIDsKKyAgICAgICAgICAgIGlmICEgJChtb2R1bGUtbmFtZSkgaW4gJChjZmdzKS1jb25maWcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYSBzdGFuZGFsb25lIHByb2plY3Qgd2l0aCBrbm93biBsb2NhdGlvbi4gU2V0IGl0cworICAgICAgICAgICAgICAgICMgc291cmNlIGxvY2F0aW9uIHNvIGl0IGNhbiBkZWNsYXJlIHRhcmdldHMuIFRoaXMgaXMgbmVlZGVkIHNvCisgICAgICAgICAgICAgICAgIyB5b3UgY2FuIHB1dCBhIC5qYW0gZmlsZSB3aXRoIHlvdXIgc291cmNlcyBhbmQgdXNlIGl0IHZpYQorICAgICAgICAgICAgICAgICMgJ3VzaW5nJy4gU3RhbmRhcmQgbW9kdWxlcyAoaW4gdGhlICd0b29scycgc3ViZGlyKSBtYXkgbm90CisgICAgICAgICAgICAgICAgIyBhc3N1bWUgc291cmNlIGRpciBpcyBzZXQuCisgICAgICAgICAgICAgICAgbG9jYWwgcyA9IFsgbW9kdWxlcy5iaW5kaW5nICQobW9kdWxlLW5hbWUpIF0gOworICAgICAgICAgICAgICAgIGlmICEgJChzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5lcnJvciBDb3VsZCBub3QgZGV0ZXJtaW5lIHByb2plY3QgbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICQobW9kdWxlLW5hbWUpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJChhdHRyaWJ1dGVzKS5zZXQgc291cmNlLWxvY2F0aW9uIDogJChzOkQpIDogZXhhY3QgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgJChhdHRyaWJ1dGVzKS5zZXQgcmVxdWlyZW1lbnRzICAgICAgIDogWyBwcm9wZXJ0eS1zZXQuZW1wdHkgXSA6IGV4YWN0IDsKKyAgICAgICAgJChhdHRyaWJ1dGVzKS5zZXQgdXNhZ2UtcmVxdWlyZW1lbnRzIDogWyBwcm9wZXJ0eS1zZXQuZW1wdHkgXSA6IGV4YWN0IDsKKworICAgICAgICAjIEltcG9ydCBydWxlcyBjb21tb24gdG8gYWxsIHByb2plY3QgbW9kdWxlcyBmcm9tIHByb2plY3QtcnVsZXMgbW9kdWxlLAorICAgICAgICAjIGRlZmluZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgICAgICAgIGxvY2FsIHJ1bGVzID0gWyBSVUxFTkFNRVMgcHJvamVjdC1ydWxlcyBdIDsKKyAgICAgICAgSU1QT1JUIHByb2plY3QtcnVsZXMgOiAkKHJ1bGVzKSA6ICQobW9kdWxlLW5hbWUpIDogJChydWxlcykgOworCisgICAgICAgIGlmICQocGFyZW50LW1vZHVsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5oZXJpdC1hdHRyaWJ1dGVzICQobW9kdWxlLW5hbWUpIDogJChwYXJlbnQtbW9kdWxlKSA7CisgICAgICAgICAgICAkKGF0dHJpYnV0ZXMpLnNldCBwYXJlbnQtbW9kdWxlIDogJChwYXJlbnQtbW9kdWxlKSA6IGV4YWN0IDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICQoamFtcm9vdCkKKyAgICAgICAgeworICAgICAgICAgICAgJChhdHRyaWJ1dGVzKS5zZXQgcHJvamVjdC1yb290IDogJChsb2NhdGlvbikgOiBleGFjdCA7CisgICAgICAgICAgICBpZiAhICQoLmZpcnN0LXByb2plY3Qtcm9vdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAuZmlyc3QtcHJvamVjdC1yb290ID0gJChtb2R1bGUtbmFtZSkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgcGFyZW50IDsKKyAgICAgICAgaWYgJChwYXJlbnQtbW9kdWxlKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJlbnQgPSBbIHRhcmdldCAkKHBhcmVudC1tb2R1bGUpIF0gOworICAgICAgICB9CisKKyAgICAgICAgaWYgISAkKC50YXJnZXQuJChtb2R1bGUtbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHJlcXVpcmVtZW50cyA9IFsgYXR0cmlidXRlICQobW9kdWxlLW5hbWUpIHJlcXVpcmVtZW50cyBdIDsKKyAgICAgICAgICAgIC50YXJnZXQuJChtb2R1bGUtbmFtZSkgPSBbIG5ldyBwcm9qZWN0LXRhcmdldCAkKG1vZHVsZS1uYW1lKSA6CisgICAgICAgICAgICAgICAgJChtb2R1bGUtbmFtZSkgJChwYXJlbnQpIDogJChyZXF1aXJlbWVudHMpIF0gOworCisgICAgICAgICAgICBpZiAkKC5kZWJ1Zy1sb2FkaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gQXNzaWduZWQgcHJvamVjdCB0YXJnZXQgJCgudGFyZ2V0LiQobW9kdWxlLW5hbWUpKSB0bworICAgICAgICAgICAgICAgICAgICAnJChtb2R1bGUtbmFtZSknIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC5jdXJyZW50LXByb2plY3QgPSBbIHRhcmdldCAkKG1vZHVsZS1uYW1lKSBdIDsKK30KKworCisjIE1ha2UgJ3Byb2plY3QtbW9kdWxlJyBpbmhlcml0IGF0dHJpYnV0ZXMgb2YgcHJvamVjdCByb290IGFuZCBwYXJlbnQgbW9kdWxlLgorIworcnVsZSBpbmhlcml0LWF0dHJpYnV0ZXMgKCBwcm9qZWN0LW1vZHVsZSA6IHBhcmVudC1tb2R1bGUgKQoreworICAgIGxvY2FsIGF0dHJpYnV0ZXMgPSAkKCQocHJvamVjdC1tb2R1bGUpLmF0dHJpYnV0ZXMpIDsKKyAgICBsb2NhbCBwYXR0cmlidXRlcyA9IFsgYXR0cmlidXRlcyAkKHBhcmVudC1tb2R1bGUpIF0gOworICAgICMgUGFyZW50IG1vZHVsZSBtaWdodCBiZSBsb2NhdGlvbmxlc3MgY29uZmlndXJhdGlvbiBtb2R1bGUuCisgICAgaWYgWyBtb2R1bGVzLmJpbmRpbmcgJChwYXJlbnQtbW9kdWxlKSBdCisgICAgeworICAgICAgICAkKGF0dHJpYnV0ZXMpLnNldCBwYXJlbnQgOgorICAgICAgICAgICAgWyBwYXRoLnBhcmVudCBbIHBhdGgubWFrZSBbIG1vZHVsZXMuYmluZGluZyAkKHBhcmVudC1tb2R1bGUpIF0gXSBdIDsKKyAgICB9CisgICAgJChhdHRyaWJ1dGVzKS5zZXQgcHJvamVjdC1yb290IDoKKyAgICAgICAgWyAkKHBhdHRyaWJ1dGVzKS5nZXQgcHJvamVjdC1yb290IF0gOiBleGFjdCA7CisgICAgJChhdHRyaWJ1dGVzKS5zZXQgZGVmYXVsdC1idWlsZCA6CisgICAgICAgIFsgJChwYXR0cmlidXRlcykuZ2V0IGRlZmF1bHQtYnVpbGQgXSA7CisgICAgJChhdHRyaWJ1dGVzKS5zZXQgcmVxdWlyZW1lbnRzIDoKKyAgICAgICAgWyAkKHBhdHRyaWJ1dGVzKS5nZXQgcmVxdWlyZW1lbnRzIF0gOiBleGFjdCA7CisgICAgJChhdHRyaWJ1dGVzKS5zZXQgdXNhZ2UtcmVxdWlyZW1lbnRzIDoKKyAgICAgICAgWyAkKHBhdHRyaWJ1dGVzKS5nZXQgdXNhZ2UtcmVxdWlyZW1lbnRzIF0gOiBleGFjdCA7CisKKyAgICBsb2NhbCBwYXJlbnQtYnVpbGQtZGlyID0gWyAkKHBhdHRyaWJ1dGVzKS5nZXQgYnVpbGQtZGlyIF0gOworICAgIGlmICQocGFyZW50LWJ1aWxkLWRpcikKKyAgICB7CisgICAgICAgICMgSGF2ZSB0byBjb21wdXRlIHJlbGF0aXZlIHBhdGggZnJvbSBwYXJlbnQgZGlyIHRvIG91ciBkaXIuIENvbnZlcnQgYm90aAorICAgICAgICAjIHBhdGhzIHRvIGFic29sdXRlLCBzaW5jZSB3ZSBjYW5ub3QgZmluZCByZWxhdGl2ZSBwYXRoIGZyb20gIi4uIiB0bworICAgICAgICAjICIuIi4KKworICAgICAgICBsb2NhbCBsb2NhdGlvbiA9IFsgYXR0cmlidXRlICQocHJvamVjdC1tb2R1bGUpIGxvY2F0aW9uIF0gOworICAgICAgICBsb2NhbCBwYXJlbnQtbG9jYXRpb24gPSBbIGF0dHJpYnV0ZSAkKHBhcmVudC1tb2R1bGUpIGxvY2F0aW9uIF0gOworCisgICAgICAgIGxvY2FsIHB3ZCA9IFsgcGF0aC5wd2QgXSA7CisgICAgICAgIGxvY2FsIHBhcmVudC1kaXIgPSBbIHBhdGgucm9vdCAkKHBhcmVudC1sb2NhdGlvbikgJChwd2QpIF0gOworICAgICAgICBsb2NhbCBvdXItZGlyID0gWyBwYXRoLnJvb3QgJChsb2NhdGlvbikgJChwd2QpIF0gOworICAgICAgICAkKGF0dHJpYnV0ZXMpLnNldCBidWlsZC1kaXIgOiBbIHBhdGguam9pbiAkKHBhcmVudC1idWlsZC1kaXIpCisgICAgICAgICAgICBbIHBhdGgucmVsYXRpdmUgJChvdXItZGlyKSAkKHBhcmVudC1kaXIpIF0gXSA6IGV4YWN0IDsKKyAgICB9Cit9CisKKworIyBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIHJlZ2lzdGVyZWQgcHJvamVjdCBpZC4KKyMKK3J1bGUgaXMtcmVnaXN0ZXJlZC1pZCAoIGlkICkKK3sKKyAgICByZXR1cm4gJCgkKGlkKS5qYW1maWxlLW1vZHVsZSkgOworfQorCisKKyMgQXNzb2NpYXRlIHRoZSBnaXZlbiBpZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IG1vZHVsZS4gUmV0dXJucyB0aGUgcG9zc2libHkKKyMgY29ycmVjdGVkIHByb2plY3QgaWQuCisjCitydWxlIHJlZ2lzdGVyLWlkICggaWQgOiBtb2R1bGUgKQoreworICAgIGlkID0gWyBwYXRoLnJvb3QgJChpZCkgLyBdIDsKKworICAgIGlmIFsgTUFUQ0ggKC8vKSA6ICQoaWQpIF0KKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMudXNlci1lcnJvciBQcm9qZWN0IGlkIG1heSBub3QgY29udGFpbiB0d28gY29uc2VjdXRpdmUgc2xhc2gKKyAgICAgICAgICAgIGNoYXJhY3RlcnMgKHByb2plY3QgaWQ6ICckKGlkKScpLiA7CisgICAgfQorCisgICAgbG9jYWwgb3JpZy1tb2R1bGUgPSAkKCQoaWQpLmphbWZpbGUtbW9kdWxlKSA7CisgICAgaWYgJChvcmlnLW1vZHVsZSkgJiYgJChvcmlnLW1vZHVsZSkgIT0gJChtb2R1bGUpCisgICAgeworICAgICAgICBsb2NhbCBuZXctZmlsZSA9IFsgbW9kdWxlcy5wZWVrICQobW9kdWxlKSA6IF9fZmlsZV9fIF0gOworICAgICAgICBsb2NhbCBuZXctbG9jYXRpb24gPSBbIHByb2plY3QuYXR0cmlidXRlICQobW9kdWxlKSBsb2NhdGlvbiBdIDsKKworICAgICAgICBsb2NhbCBvcmlnLWZpbGUgPSBbIG1vZHVsZXMucGVlayAkKG9yaWctbW9kdWxlKSA6IF9fZmlsZV9fIF0gOworICAgICAgICBsb2NhbCBvcmlnLW1haW4taWQgPSBbIHByb2plY3QuYXR0cmlidXRlICQob3JpZy1tb2R1bGUpIGlkIF0gOworICAgICAgICBsb2NhbCBvcmlnLWxvY2F0aW9uID0gWyBwcm9qZWN0LmF0dHJpYnV0ZSAkKG9yaWctbW9kdWxlKSBsb2NhdGlvbiBdIDsKKyAgICAgICAgbG9jYWwgb3JpZy1wcm9qZWN0ID0gWyB0YXJnZXQgJChvcmlnLW1vZHVsZSkgXSA7CisgICAgICAgIGxvY2FsIG9yaWctbmFtZSA9IFsgJChvcmlnLXByb2plY3QpLm5hbWUgXSA7CisKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy51c2VyLWVycm9yIEF0dGVtcHQgdG8gcmVkZWNsYXJlIGFscmVhZHkgcmVnaXN0ZXJlZCBwcm9qZWN0IGlkCisgICAgICAgICAgICAnJChpZCknLgorICAgICAgICAgICAgOiBPcmlnaW5hbCBwcm9qZWN0OgorICAgICAgICAgICAgOiAiICAgIiBOYW1lOiAkKG9yaWctbmFtZTpFPS0tLSkKKyAgICAgICAgICAgIDogIiAgICIgTW9kdWxlOiAkKG9yaWctbW9kdWxlKQorICAgICAgICAgICAgOiAiICAgIiBNYWluIGlkOiAkKG9yaWctbWFpbi1pZDpFPS0tLSkKKyAgICAgICAgICAgIDogIiAgICIgRmlsZTogJChvcmlnLWZpbGU6RT0tLS0pCisgICAgICAgICAgICA6ICIgICAiIExvY2F0aW9uOiAkKG9yaWctbG9jYXRpb246RT0tLS0pCisgICAgICAgICAgICA6IE5ldyBwcm9qZWN0OgorICAgICAgICAgICAgOiAiICAgIiBNb2R1bGU6ICQobW9kdWxlKQorICAgICAgICAgICAgOiAiICAgIiBGaWxlOiAkKG5ldy1maWxlOkU9LS0tKQorICAgICAgICAgICAgOiAiICAgIiBMb2NhdGlvbjogJChuZXctbG9jYXRpb246RT0tLS0pIDsKKyAgICB9CisKKyAgICAkKGlkKS5qYW1maWxlLW1vZHVsZSA9ICQobW9kdWxlKSA7CisgICAgcmV0dXJuICQoaWQpIDsKK30KKworCisjIENsYXNzIGtlZXBpbmcgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIGEgcHJvamVjdC4KKyMKKyMgVGhlIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXJlICJpZCIsICJsb2NhdGlvbiIsICJwcm9qZWN0LXJvb3QiLCAicGFyZW50IgorIyAicmVxdWlyZW1lbnRzIiwgImRlZmF1bHQtYnVpbGQiLCAic291cmNlLWxvY2F0aW9uIiBhbmQgInByb2plY3RzLXRvLWJ1aWxkIi4KKyMKK2NsYXNzIHByb2plY3QtYXR0cmlidXRlcworeworICAgIGltcG9ydCBwYXRoIDsKKyAgICBpbXBvcnQgcHJpbnQgOworICAgIGltcG9ydCBwcm9qZWN0IDsKKyAgICBpbXBvcnQgcHJvcGVydHkgOworICAgIGltcG9ydCBwcm9wZXJ0eS1zZXQgOworICAgIGltcG9ydCBzZXF1ZW5jZSA7CisKKyAgICBydWxlIF9faW5pdF9fICggbG9jYXRpb24gcHJvamVjdC1tb2R1bGUgKQorICAgIHsKKyAgICAgICAgc2VsZi5sb2NhdGlvbiA9ICQobG9jYXRpb24pIDsKKyAgICAgICAgc2VsZi5wcm9qZWN0LW1vZHVsZSA9ICQocHJvamVjdC1tb2R1bGUpIDsKKyAgICB9CisKKyAgICAjIFNldCB0aGUgbmFtZWQgYXR0cmlidXRlIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZ2l2ZW4gYnkgdGhlIHVzZXIuIFRoZQorICAgICMgdmFsdWUgYWN0dWFsbHkgc2V0IG1heSBiZSBkaWZmZXJlbnQuCisgICAgIworICAgIHJ1bGUgc2V0ICggYXR0cmlidXRlIDogc3BlY2lmaWNhdGlvbiAqCisgICAgICAgIDogZXhhY3QgPyAgIyBTZXRzIHZhbHVlIGZyb20gJ3NwZWNpZmljYXRpb24nIHdpdGhvdXQgYW55IHByb2Nlc3NpbmcuCisgICAgICAgICkKKyAgICB7CisgICAgICAgIGlmICQoZXhhY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbGYuJChhdHRyaWJ1dGUpID0gJChzcGVjaWZpY2F0aW9uKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAkKGF0dHJpYnV0ZSkgPSAicmVxdWlyZW1lbnRzIgorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCByZXN1bHQgPSBbIHByb3BlcnR5LXNldC5yZWZpbmUtZnJvbS11c2VyLWlucHV0CisgICAgICAgICAgICAgICAgJChzZWxmLnJlcXVpcmVtZW50cykgOiAkKHNwZWNpZmljYXRpb24pCisgICAgICAgICAgICAgICAgOiAkKHNlbGYucHJvamVjdC1tb2R1bGUpIDogJChzZWxmLmxvY2F0aW9uKSBdIDsKKworICAgICAgICAgICAgaWYgJChyZXN1bHRbMV0pID0gIkBlcnJvciIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDogZXJyb3IgOiBlcnJvcnMuZXJyb3IgOworICAgICAgICAgICAgICAgIGVycm9ycy5lcnJvciBSZXF1aXJlbWVudHMgZm9yIHByb2plY3QgYXQgJyQoc2VsZi5sb2NhdGlvbiknCisgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0IHdpdGggcGFyZW50J3MuIDogRXhwbGFuYXRpb246ICQocmVzdWx0WzItXSkgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZWxmLnJlcXVpcmVtZW50cyA9ICQocmVzdWx0KSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAkKGF0dHJpYnV0ZSkgPSAidXNhZ2UtcmVxdWlyZW1lbnRzIgorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCB1bmNvbmRpdGlvbmFsIDsKKyAgICAgICAgICAgIGZvciBsb2NhbCBwIGluICQoc3BlY2lmaWNhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBzcGxpdCA9IFsgcHJvcGVydHkuc3BsaXQtY29uZGl0aW9uYWwgJChwKSBdIDsKKyAgICAgICAgICAgICAgICBzcGxpdCA/PSBub3RoaW5nICQocCkgOworICAgICAgICAgICAgICAgIHVuY29uZGl0aW9uYWwgKz0gJChzcGxpdFsyXSkgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2NhbCBub24tZnJlZSA9IFsgcHJvcGVydHkucmVtb3ZlIGZyZWUgOiAkKHVuY29uZGl0aW9uYWwpIF0gOworICAgICAgICAgICAgaWYgJChub24tZnJlZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDogZXJyb3IgOiBlcnJvcnMuZXJyb3IgOworICAgICAgICAgICAgICAgIGVycm9ycy5lcnJvciB1c2FnZS1yZXF1aXJlbWVudHMgJChzcGVjaWZpY2F0aW9uKSBoYXZlIG5vbi1mcmVlCisgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgJChub24tZnJlZSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jYWwgdCA9IFsgcHJvcGVydHkudHJhbnNsYXRlLXBhdGhzICQoc3BlY2lmaWNhdGlvbikgOgorICAgICAgICAgICAgICAgICQoc2VsZi5sb2NhdGlvbikgXSA7CisgICAgICAgICAgICBpZiAkKHNlbGYudXNhZ2UtcmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGYudXNhZ2UtcmVxdWlyZW1lbnRzID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlCisgICAgICAgICAgICAgICAgICAgIFsgJChzZWxmLnVzYWdlLXJlcXVpcmVtZW50cykucmF3IF0gJCh0KSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxmLnVzYWdlLXJlcXVpcmVtZW50cyA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZSAkKHQpIF0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgJChhdHRyaWJ1dGUpID0gImRlZmF1bHQtYnVpbGQiCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbGYuZGVmYXVsdC1idWlsZCA9IFsgcHJvcGVydHkubWFrZSAkKHNwZWNpZmljYXRpb24pIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgJChhdHRyaWJ1dGUpID0gInNvdXJjZS1sb2NhdGlvbiIKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZi5zb3VyY2UtbG9jYXRpb24gPSA7CisgICAgICAgICAgICBmb3IgbG9jYWwgc3JjLXBhdGggaW4gJChzcGVjaWZpY2F0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGYuc291cmNlLWxvY2F0aW9uICs9IFsgcGF0aC5yb290IFsgcGF0aC5tYWtlICQoc3JjLXBhdGgpIF0KKyAgICAgICAgICAgICAgICAgICAgJChzZWxmLmxvY2F0aW9uKSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICQoYXR0cmlidXRlKSA9ICJidWlsZC1kaXIiCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbGYuYnVpbGQtZGlyID0gWyBwYXRoLnJvb3QgWyBwYXRoLm1ha2UgJChzcGVjaWZpY2F0aW9uKSBdCisgICAgICAgICAgICAgICAgJChzZWxmLmxvY2F0aW9uKSBdIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICQoYXR0cmlidXRlKSA9ICJpZCIKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZi5pZCA9IFsgcHJvamVjdC5yZWdpc3Rlci1pZCAkKHNwZWNpZmljYXRpb24pIDoKKyAgICAgICAgICAgICAgICAkKHNlbGYucHJvamVjdC1tb2R1bGUpIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgISAkKGF0dHJpYnV0ZSkgaW4gImRlZmF1bHQtYnVpbGQiICJsb2NhdGlvbiIgInBhcmVudCIKKyAgICAgICAgICAgICJwcm9qZWN0cy10by1idWlsZCIgInByb2plY3Qtcm9vdCIgInNvdXJjZS1sb2NhdGlvbiIKKyAgICAgICAgeworICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA6IGVycm9yIDogZXJyb3JzLmVycm9yIDsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciBJbnZhbGlkIHByb2plY3QgYXR0cmlidXRlICckKGF0dHJpYnV0ZSknIHNwZWNpZmllZCBmb3IKKyAgICAgICAgICAgICAgICBwcm9qZWN0IGF0ICckKHNlbGYubG9jYXRpb24pJyA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLiQoYXR0cmlidXRlKSA9ICQoc3BlY2lmaWNhdGlvbikgOworICAgICAgICB9CisgICAgfQorCisgICAgIyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlLgorICAgICMKKyAgICBydWxlIGdldCAoIGF0dHJpYnV0ZSApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLiQoYXR0cmlidXRlKSkgOworICAgIH0KKworICAgICMgUmV0dXJucyB3aGV0aGVyIHRoZXNlIGF0dHJpYnV0ZXMgYmVsb25nIHRvIGEgSmFtcm9vdCBwcm9qZWN0IG1vZHVsZS4KKyAgICAjCisgICAgcnVsZSBpcy1qYW1yb290ICggKQorICAgIHsKKyAgICAgICAgaWYgJChzZWxmLmxvY2F0aW9uKSAmJiAkKHNlbGYucHJvamVjdC1yb290KSA9ICQoc2VsZi5sb2NhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWUgOworICAgICAgICB9CisgICAgfQorCisgICAgIyBQcmludHMgdGhlIHByb2plY3QgYXR0cmlidXRlcy4KKyAgICAjCisgICAgcnVsZSBwcmludCAoICkKKyAgICB7CisgICAgICAgIGxvY2FsIGlkID0gJyQoc2VsZi5pZCknIDsKKyAgICAgICAgcHJpbnQuc2VjdGlvbiAkKGlkOkU9KG5vbmUpKSA7CisgICAgICAgIHByaW50Lmxpc3Qtc3RhcnQgOworICAgICAgICBwcmludC5saXN0LWl0ZW0gIlBhcmVudCBwcm9qZWN0OiIgJChzZWxmLnBhcmVudDpFPShub25lKSkgOworICAgICAgICBwcmludC5saXN0LWl0ZW0gIlJlcXVpcmVtZW50czoiIFsgJChzZWxmLnJlcXVpcmVtZW50cykucmF3IF0gOworICAgICAgICBwcmludC5saXN0LWl0ZW0gIkRlZmF1bHQgYnVpbGQ6IiAkKHNlbGYuZGVmYXVsdC1idWlsZCkgOworICAgICAgICBwcmludC5saXN0LWl0ZW0gIlNvdXJjZSBsb2NhdGlvbjoiICQoc2VsZi5zb3VyY2UtbG9jYXRpb24pIDsKKyAgICAgICAgcHJpbnQubGlzdC1pdGVtICJQcm9qZWN0cyB0byBidWlsZDoiIFsgc2VxdWVuY2UuaW5zZXJ0aW9uLXNvcnQKKyAgICAgICAgICAgICQoc2VsZi5wcm9qZWN0cy10by1idWlsZCkgXSA7CisgICAgICAgIHByaW50Lmxpc3QtZW5kIDsKKyAgICB9Cit9CisKKworIyBSZXR1cm5zIHRoZSBidWlsZCBkaXJlY3RvcnkgZm9yIHN0YW5kYWxvbmUgcHJvamVjdHMKKyMKK3J1bGUgc3RhbmRhbG9uZS1idWlsZC1kaXIgKCApCit7CisgICAgcHJvamVjdCA9IFsgdGFyZ2V0ICQoLmZpcnN0LXByb2plY3Qtcm9vdCkgXSA7CisgICAgcmV0dXJuIFsgcGF0aC5qb2luIFsgJChwcm9qZWN0KS5idWlsZC1kaXIgXSBzdGFuZGFsb25lIF0gOworfQorCisjIFJldHVybnMgdGhlIHByb2plY3Qgd2hpY2ggaXMgY3VycmVudGx5IGJlaW5nIGxvYWRlZC4KKyMKK3J1bGUgY3VycmVudCAoICkKK3sKKyAgICBpZiAhICQoLmN1cnJlbnQtcHJvamVjdCkKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgUmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IGN1cnJlbnRseSBiZWluZyBsb2FkZWQgcmVxdWVzdGVkCisgICAgICAgICAgICB3aGVuIHRoZXJlIHdhcyBubyBwcm9qZWN0IG1vZHVsZSBiZWluZyBsb2FkZWQuIDsKKyAgICB9CisgICAgcmV0dXJuICQoLmN1cnJlbnQtcHJvamVjdCkgOworfQorCisKKyMgVGVtcG9yYXJpbHkgY2hhbmdlcyB0aGUgY3VycmVudCBwcm9qZWN0IHRvICdwcm9qZWN0Jy4gU2hvdWxkIGJlIGZvbGxvd2VkIGJ5CisjICdwb3AtY3VycmVudCcuCisjCitydWxlIHB1c2gtY3VycmVudCAoIHByb2plY3QgKQoreworICAgIC5zYXZlZC1jdXJyZW50LXByb2plY3QgKz0gJCguY3VycmVudC1wcm9qZWN0KSA7CisgICAgLmN1cnJlbnQtcHJvamVjdCA9ICQocHJvamVjdCkgOworfQorCisKK3J1bGUgcG9wLWN1cnJlbnQgKCApCit7CisgICAgLmN1cnJlbnQtcHJvamVjdCA9ICQoLnNhdmVkLWN1cnJlbnQtcHJvamVjdFstMV0pIDsKKyAgICAuc2F2ZWQtY3VycmVudC1wcm9qZWN0ID0gJCguc2F2ZWQtY3VycmVudC1wcm9qZWN0WzEtLTJdKSA7Cit9CisKKworIyBSZXR1cm5zIHRoZSBwcm9qZWN0LWF0dHJpYnV0ZSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBKYW1maWxlIG1vZHVsZS4KKyMKK3J1bGUgYXR0cmlidXRlcyAoIHByb2plY3QgKQoreworICAgIHJldHVybiAkKCQocHJvamVjdCkuYXR0cmlidXRlcykgOworfQorCisKKyMgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgaW4gdGhlIHNwZWNpZmllZCBKYW1maWxlIG1vZHVsZS4KKyMKK3J1bGUgYXR0cmlidXRlICggcHJvamVjdCBhdHRyaWJ1dGUgKQoreworICAgIHJldHVybiBbICQoJChwcm9qZWN0KS5hdHRyaWJ1dGVzKS5nZXQgJChhdHRyaWJ1dGUpIF0gOworfQorCisKKyMgUmV0dXJucyB3aGV0aGVyIGEgcHJvamVjdCBtb2R1bGUgaXMgb25lIG9mIEJvb3N0IEJ1aWxkJ3MgY29uZmlndXJhdGlvbgorIyBtb2R1bGVzLgorIworcnVsZSBpcy1jb25maWctbW9kdWxlICggcHJvamVjdCApCit7CisgICAgbG9jYWwgY2ZncyA9IHByb2plY3Qgc2l0ZSB0ZXN0IHVzZXIgOworICAgIGlmICQocHJvamVjdCkgaW4gJChjZmdzKS1jb25maWcKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlIDsKKyAgICB9Cit9CisKKworIyBSZXR1cm5zIHdoZXRoZXIgYSBwcm9qZWN0IG1vZHVsZSBpcyBhIEphbXJvb3QgcHJvamVjdCBtb2R1bGUuCisjCitydWxlIGlzLWphbXJvb3QtbW9kdWxlICggcHJvamVjdCApCit7CisgICAgcmV0dXJuIFsgJCgkKHByb2plY3QpLmF0dHJpYnV0ZXMpLmlzLWphbXJvb3QgXSA7Cit9CisKKworIyBSZXR1cm5zIGEgcHJvamVjdCdzIHBhcmVudCBqYW1yb290IG1vZHVsZS4gUmV0dXJucyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHN1Y2gKKyMgbW9kdWxlLCBpLmUuIGlmIHRoaXMgaXMgYSBzdGFuZGFsb25lIHByb2plY3Qgb3Igb25lIG9mIHRoZSBpbnRlcm5hbCBCb29zdAorIyBCdWlsZCBjb25maWd1cmF0aW9uIHByb2plY3RzLgorIworcnVsZSBnZXQtamFtcm9vdC1tb2R1bGUgKCBwcm9qZWN0ICkKK3sKKyAgICBsb2NhbCBqYW1yb290LWxvY2F0aW9uID0gWyBhdHRyaWJ1dGUgJChwcm9qZWN0KSBwcm9qZWN0LXJvb3QgXSA7CisgICAgaWYgJChqYW1yb290LWxvY2F0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFsgbW9kdWxlLW5hbWUgJChqYW1yb290LWxvY2F0aW9uKSBdIDsKKyAgICB9Cit9CisKKworIyBSZXR1cm5zIHRoZSBwcm9qZWN0IHRhcmdldCBjb3JyZXNwb25kaW5nIHRvIHRoZSAncHJvamVjdC1tb2R1bGUnLgorIworcnVsZSB0YXJnZXQgKCBwcm9qZWN0LW1vZHVsZSApCit7CisgICAgaWYgISAkKC50YXJnZXQuJChwcm9qZWN0LW1vZHVsZSkpCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgUHJvamVjdCB0YXJnZXQgcmVxdWVzdGVkIGJ1dCBub3QgeWV0IGFzc2lnbmVkIGZvcgorICAgICAgICAgICAgbW9kdWxlICckKHByb2plY3QtbW9kdWxlKScuIDsKKyAgICB9CisgICAgcmV0dXJuICQoLnRhcmdldC4kKHByb2plY3QtbW9kdWxlKSkgOworfQorCisKKyMgRGVmaW5lcyBhIEJvb3N0LkJ1aWxkIGV4dGVuc2lvbiBwcm9qZWN0LiBTdWNoIGV4dGVuc2lvbnMgdXN1YWxseSBjb250YWluCisjIGxpYnJhcnkgdGFyZ2V0cyBhbmQgZmVhdHVyZXMgdGhhdCBjYW4gYmUgdXNlZCBieSBtYW55IHBlb3BsZS4gRXZlbiB0aG91Z2gKKyMgZXh0ZW5zaW9ucyBhcmUgcmVhbGx5IHByb2plY3RzLCB0aGV5IGNhbiBiZSBpbml0aWFsaXplZCBhcyBhIG1vZHVsZSB3b3VsZCBiZQorIyB3aXRoIHRoZSAidXNpbmciIChwcm9qZWN0LnByb2plY3QtcnVsZXMudXNpbmcpIG1lY2hhbmlzbS4KKyMKK3J1bGUgZXh0ZW5zaW9uICggaWQgOiBvcHRpb25zICogOiAqICkKK3sKKyAgICAjIFRoZSBjYWxsZXIgaXMgYSBzdGFuZGFsb25lIG1vZHVsZSBmb3IgdGhlIGV4dGVuc2lvbi4KKyAgICBsb2NhbCBtb2QgPSBbIENBTExFUl9NT0RVTEUgXSA7CisKKyAgICAjIFdlIG5lZWQgdG8gZG8gdGhlIHJlc3Qgd2l0aGluIHRoZSBleHRlbnNpb24gbW9kdWxlLgorICAgIG1vZHVsZSAkKG1vZCkKKyAgICB7CisgICAgICAgIGltcG9ydCBwYXRoIDsKKworICAgICAgICAjIEZpbmQgdGhlIHJvb3QgcHJvamVjdC4KKyAgICAgICAgbG9jYWwgcm9vdC1wcm9qZWN0ID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7CisgICAgICAgIHJvb3QtcHJvamVjdCA9IFsgJChyb290LXByb2plY3QpLnByb2plY3QtbW9kdWxlIF0gOworICAgICAgICB3aGlsZQorICAgICAgICAgICAgWyBwcm9qZWN0LmF0dHJpYnV0ZSAkKHJvb3QtcHJvamVjdCkgcGFyZW50LW1vZHVsZSBdICYmCisgICAgICAgICAgICBbIHByb2plY3QuYXR0cmlidXRlICQocm9vdC1wcm9qZWN0KSBwYXJlbnQtbW9kdWxlIF0gIT0gdXNlci1jb25maWcKKyAgICAgICAgeworICAgICAgICAgICAgcm9vdC1wcm9qZWN0ID0gWyBwcm9qZWN0LmF0dHJpYnV0ZSAkKHJvb3QtcHJvamVjdCkgcGFyZW50LW1vZHVsZSBdIDsKKyAgICAgICAgfQorCisgICAgICAgICMgQ3JlYXRlIHRoZSBwcm9qZWN0IGRhdGEsIGFuZCBicmluZyBpbiB0aGUgcHJvamVjdCBydWxlcyBpbnRvIHRoZQorICAgICAgICAjIG1vZHVsZS4KKyAgICAgICAgcHJvamVjdC5pbml0aWFsaXplICQoX19uYW1lX18pIDogWyBwYXRoLmpvaW4gWyBwcm9qZWN0LmF0dHJpYnV0ZQorICAgICAgICAgICAgJChyb290LXByb2plY3QpIGxvY2F0aW9uIF0gZXh0ICQoMTpMKSBdIDsKKworICAgICAgICAjIENyZWF0ZSB0aGUgcHJvamVjdCBpdHNlbGYsIGkuZS4gdGhlIGF0dHJpYnV0ZXMuIEFsbCBleHRlbnNpb25zIGFyZQorICAgICAgICAjIGNyZWF0ZWQgaW4gdGhlICIvZXh0IiBwcm9qZWN0IHNwYWNlLgorICAgICAgICBwcm9qZWN0IC9leHQvJCgxKSA6ICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkgOgorICAgICAgICAgICAgJCg5KSA6ICQoMTApIDogJCgxMSkgOiAkKDEyKSA6ICQoMTMpIDogJCgxNCkgOiAkKDE1KSA6ICQoMTYpIDogJCgxNykKKyAgICAgICAgICAgIDogJCgxOCkgOiAkKDE5KSA7CisgICAgICAgIGxvY2FsIGF0dHJpYnV0ZXMgPSBbIHByb2plY3QuYXR0cmlidXRlcyAkKF9fbmFtZV9fKSBdIDsKKworICAgICAgICAjIEluaGVyaXQgZnJvbSB0aGUgcm9vdCBwcm9qZWN0IG9mIHdob21ldmVyIGlzIGRlZmluaW5nIHVzLgorICAgICAgICBwcm9qZWN0LmluaGVyaXQtYXR0cmlidXRlcyAkKF9fbmFtZV9fKSA6ICQocm9vdC1wcm9qZWN0KSA7CisgICAgICAgICQoYXR0cmlidXRlcykuc2V0IHBhcmVudC1tb2R1bGUgOiAkKHJvb3QtcHJvamVjdCkgOiBleGFjdCA7CisgICAgfQorfQorCisKK3J1bGUgZ2xvYi1pbnRlcm5hbCAoIHByb2plY3QgOiB3aWxkY2FyZHMgKyA6IGV4Y2x1ZGVzICogOiBydWxlLW5hbWUgKQoreworICAgIGxvY2FsIGxvY2F0aW9uID0gWyAkKHByb2plY3QpLmdldCBzb3VyY2UtbG9jYXRpb24gXSA7CisKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGxvY2FsIHBhdGhzID0gWyBwYXRoLiQocnVsZS1uYW1lKSAkKGxvY2F0aW9uKSA6CisgICAgICAgIFsgc2VxdWVuY2UudHJhbnNmb3JtIHBhdGgubWFrZSA6ICQod2lsZGNhcmRzKSBdIDoKKyAgICAgICAgWyBzZXF1ZW5jZS50cmFuc2Zvcm0gcGF0aC5tYWtlIDogJChleGNsdWRlcykgXSBdIDsKKyAgICBpZiAkKHdpbGRjYXJkczpEKSB8fCAkKHJ1bGUtbmFtZSkgIT0gZ2xvYgorICAgIHsKKyAgICAgICAgIyBUaGUgcGF0aHMgd2UgaGF2ZSBmb3VuZCBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBidXQgdGhlCisgICAgICAgICMgbmFtZXMgc3BlY2lmaWVkIGluIHRoZSBzb3VyY2VzIGxpc3QgYXJlIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgICMgc291cmNlIGRpcmVjdG9yeSBvZiB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0LiBTbywganVzdCBtYWtlIHRoZSBuYW1lcworICAgICAgICAjIGFic29sdXRlLgorICAgICAgICBmb3IgbG9jYWwgcCBpbiAkKHBhdGhzKQorICAgICAgICB7CisgICAgICAgICAgICAjIElmIHRoZSBwYXRoIGlzIGJlbG93IHNvdXJjZSBsb2NhdGlvbiwgdXNlIHJlbGF0aXZlIHBhdGguCisgICAgICAgICAgICAjIE90aGVyd2lzZSwgdXNlIGZ1bGwgcGF0aCBqdXN0IHRvIGF2b2lkIGFueSBhbWJpZ3VpdGllcy4KKyAgICAgICAgICAgIGxvY2FsIHJlbCA9IFsgcGF0aC5yZWxhdGl2ZSAkKHApICQobG9jYXRpb24pIDogbm8tZXJyb3IgXSA7CisgICAgICAgICAgICBpZiAkKHJlbCkgPSBub3QtYS1jaGlsZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbIHBhdGgucm9vdCAkKHApIFsgcGF0aC5wd2QgXSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gJChyZWwpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAjIFRoZXJlIHdlcmUgbm8gd2lsZGNhcmRzIGluIHRoZSBkaXJlY3RvcnkgcGF0aCwgc28gdGhlIGZpbGVzIGFyZSBhbGwgaW4KKyAgICAgICAgIyB0aGUgc291cmNlIGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdC4gSnVzdCBkcm9wIHRoZSBkaXJlY3RvcnksIGluc3RlYWQKKyAgICAgICAgIyBvZiBtYWtpbmcgcGF0aHMgYWJzb2x1dGUuCisgICAgICAgIHJlc3VsdCA9ICQocGF0aHM6RD0iIikgOworICAgIH0KKworICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgVGhpcyBtb2R1bGUgZGVmaW5lcyBydWxlcyBjb21tb24gdG8gYWxsIHByb2plY3RzLgorIworbW9kdWxlIHByb2plY3QtcnVsZXMKK3sKKyAgICBpbXBvcnQgbW9kdWxlcyA7CisKKyAgICBydWxlIHVzaW5nICggdG9vbHNldC1tb2R1bGUgOiAqICkKKyAgICB7CisgICAgICAgIGltcG9ydCB0b29sc2V0IDsKKworICAgICAgICBsb2NhbCBzYXZlZC1wcm9qZWN0ID0gWyBtb2R1bGVzLnBlZWsgcHJvamVjdCA6IC5jdXJyZW50LXByb2plY3QgXSA7CisKKyAgICAgICAgIyBUZW1wb3JhcmlseSBjaGFuZ2UgdGhlIHNlYXJjaCBwYXRoIHNvIHRoZSBtb2R1bGUgcmVmZXJyZWQgdG8gYnkKKyAgICAgICAgIyAndXNpbmcnIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIEphbWZpbGUuIFVzZXIgd2lsbAorICAgICAgICAjIGV4cGVjdCB0aGUgbW9kdWxlIHRvIGJlIGZvdW5kIGV2ZW4gdGhvdWdoIHRoZSBkaXJlY3RvcnkgaXMgbm90IGluCisgICAgICAgICMgQk9PU1RfQlVJTERfUEFUSC4KKyAgICAgICAgbG9jYWwgeCA9IFsgbW9kdWxlcy5wZWVrIDogQk9PU1RfQlVJTERfUEFUSCBdIDsKKyAgICAgICAgbG9jYWwgY2FsbGVyID0gWyBDQUxMRVJfTU9EVUxFIF0gOworICAgICAgICBsb2NhbCBjYWxsZXItbG9jYXRpb24gPSBbIG1vZHVsZXMuYmluZGluZyAkKGNhbGxlcikgXSA7CisgICAgICAgIG1vZHVsZXMucG9rZSA6IEJPT1NUX0JVSUxEX1BBVEggOiAkKGNhbGxlci1sb2NhdGlvbjpEKSAkKHgpIDsKKyAgICAgICAgdG9vbHNldC51c2luZyAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6CisgICAgICAgICAgICAkKDkpIDogJCgxMCkgOiAkKDExKSA6ICQoMTIpIDogJCgxMykgOiAkKDE0KSA6ICQoMTUpIDogJCgxNikgOiAkKDE3KQorICAgICAgICAgICAgOiAkKDE4KSA6ICQoMTkpIDsKKyAgICAgICAgbW9kdWxlcy5wb2tlIDogQk9PU1RfQlVJTERfUEFUSCA6ICQoeCkgOworCisgICAgICAgICMgVGhlIGFib3ZlIG1pZ2h0IGhhdmUgY2xvYmJlcmVkIC5jdXJyZW50LXByb2plY3QgaW4gY2FzZSBpdCBjYXVzZWQgYQorICAgICAgICAjIG5ldyBwcm9qZWN0IGluc3RhbmNlIHRvIGJlIGNyZWF0ZWQgKHdoaWNoIHdvdWxkIHRoZW4gYXV0b21hdGljYWxseQorICAgICAgICAjIGdldCBzZXQgYXMgdGhlICdjdXJyZW50JyBwcm9qZWN0KS4gUmVzdG9yZSB0aGUgY29ycmVjdCB2YWx1ZSBzbyBhbnkKKyAgICAgICAgIyBtYWluIHRhcmdldHMgZGVjbGFyZWQgYWZ0ZXIgdGhpcyBkbyBub3QgZ2V0IG1hcHBlZCB0byB0aGUgbG9hZGVkCisgICAgICAgICMgbW9kdWxlJ3MgcHJvamVjdC4KKyAgICAgICAgbW9kdWxlcy5wb2tlIHByb2plY3QgOiAuY3VycmVudC1wcm9qZWN0IDogJChzYXZlZC1wcm9qZWN0KSA7CisgICAgfQorCisgICAgcnVsZSBpbXBvcnQgKCAqIDogKiA6ICogKQorICAgIHsKKyAgICAgICAgbG9jYWwgY2FsbGVyID0gWyBDQUxMRVJfTU9EVUxFIF0gOworICAgICAgICBsb2NhbCBzYXZlZC1wcm9qZWN0ID0gWyBtb2R1bGVzLnBlZWsgcHJvamVjdCA6IC5jdXJyZW50LXByb2plY3QgXSA7CisgICAgICAgIG1vZHVsZSAkKGNhbGxlcikKKyAgICAgICAgeworICAgICAgICAgICAgbW9kdWxlcy5pbXBvcnQgJCgxKSA6ICQoMikgOiAkKDMpIDsKKyAgICAgICAgfQorCisgICAgICAgICMgVGhlIGFib3ZlIG1pZ2h0IGhhdmUgY2xvYmJlcmVkIC5jdXJyZW50LXByb2plY3QgaW4gY2FzZSBpdCBjYXVzZWQgYQorICAgICAgICAjIG5ldyBwcm9qZWN0IGluc3RhbmNlIHRvIGJlIGNyZWF0ZWQgKHdoaWNoIHdvdWxkIHRoZW4gYXV0b21hdGljYWxseQorICAgICAgICAjIGdldCBzZXQgYXMgdGhlICdjdXJyZW50JyBwcm9qZWN0KS4gUmVzdG9yZSB0aGUgY29ycmVjdCB2YWx1ZSBzbyBhbnkKKyAgICAgICAgIyBtYWluIHRhcmdldHMgZGVjbGFyZWQgYWZ0ZXIgdGhpcyBkbyBub3QgZ2V0IG1hcHBlZCB0byB0aGUgbG9hZGVkCisgICAgICAgICMgbW9kdWxlJ3MgcHJvamVjdC4KKyAgICAgICAgbW9kdWxlcy5wb2tlIHByb2plY3QgOiAuY3VycmVudC1wcm9qZWN0IDogJChzYXZlZC1wcm9qZWN0KSA7CisgICAgfQorCisgICAgcnVsZSBwcm9qZWN0ICggaWQgPyA6IG9wdGlvbnMgKiA6ICogKQorICAgIHsKKyAgICAgICAgaW1wb3J0IHBhdGggOworICAgICAgICBpbXBvcnQgcHJvamVjdCA7CisKKyAgICAgICAgbG9jYWwgY2FsbGVyID0gWyBDQUxMRVJfTU9EVUxFIF0gOworICAgICAgICBsb2NhbCBhdHRyaWJ1dGVzID0gWyBwcm9qZWN0LmF0dHJpYnV0ZXMgJChjYWxsZXIpIF0gOworICAgICAgICBpZiAkKGlkKQorICAgICAgICB7CisgICAgICAgICAgICAkKGF0dHJpYnV0ZXMpLnNldCBpZCA6ICQoaWQpIDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIGV4cGxpY2l0LWJ1aWxkLWRpciA7CisKKyAgICAgICAgZm9yIG4gaW4gMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5CisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIG9wdGlvbiA9ICQoJChuKSkgOworICAgICAgICAgICAgaWYgJChvcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJChhdHRyaWJ1dGVzKS5zZXQgJChvcHRpb25bMV0pIDogJChvcHRpb25bMi1dKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAkKG9wdGlvblsxXSkgPSAiYnVpbGQtZGlyIgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4cGxpY2l0LWJ1aWxkLWRpciA9IFsgcGF0aC5tYWtlICQob3B0aW9uWzItXSkgXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjIElmICctLWJ1aWxkLWRpcicgaXMgc3BlY2lmaWVkLCBjaGFuZ2UgdGhlIGJ1aWxkIGRpciBmb3IgdGhlIHByb2plY3QuCisgICAgICAgIGxvY2FsIGdsb2JhbC1idWlsZC1kaXIgPSBbIG1vZHVsZXMucGVlayBwcm9qZWN0IDogLmdsb2JhbC1idWlsZC1kaXIgXSA7CisKKyAgICAgICAgaWYgJChnbG9iYWwtYnVpbGQtZGlyKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBsb2NhdGlvbiA9IFsgJChhdHRyaWJ1dGVzKS5nZXQgbG9jYXRpb24gXSA7CisgICAgICAgICAgICAjIFByb2plY3Qgd2l0aCBhbiBlbXB0eSBsb2NhdGlvbiBpcyBhICdzdGFuZGFsb25lJyBwcm9qZWN0IHN1Y2ggYXMKKyAgICAgICAgICAgICMgdXNlci1jb25maWcgb3IgcXQuIEl0IGhhcyBubyBidWlsZCBkaXIuIElmIHdlIHRyeSB0byBzZXQgYnVpbGQgZGlyCisgICAgICAgICAgICAjIGZvciB1c2VyLWNvbmZpZywgd2Ugc2hhbGwgdGhlbiB0cnkgdG8gaW5oZXJpdCBpdCwgd2l0aCBlaXRoZXIKKyAgICAgICAgICAgICMgd2VpcmQgb3Igd3JvbmcgY29uc2VxdWVuY2VzLgorICAgICAgICAgICAgaWYgJChsb2NhdGlvbikgJiYgJChsb2NhdGlvbikgPSBbICQoYXR0cmlidXRlcykuZ2V0IHByb2plY3Qtcm9vdCBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBSZS1yZWFkIHRoZSBwcm9qZWN0IGlkLCBzaW5jZSBpdCBtaWdodCBoYXZlIGJlZW4gbW9kaWZpZWQgYQorICAgICAgICAgICAgICAgICMgYml0IHdoZW4gc2V0dGluZyB0aGUgcHJvamVjdCdzIGlkIGF0dHJpYnV0ZSwgZS5nLiBtaWdodCBoYXZlCisgICAgICAgICAgICAgICAgIyBiZWVuIHByZWZpeGVkIGJ5IGEgc2xhc2ggaWYgaXQgd2FzIG5vdCBhbHJlYWR5LgorICAgICAgICAgICAgICAgIGlkID0gWyAkKGF0dHJpYnV0ZXMpLmdldCBpZCBdIDsKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgSmFtcm9vdC4KKyAgICAgICAgICAgICAgICBpZiAkKGlkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgJChleHBsaWNpdC1idWlsZC1kaXIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBbIHBhdGguaXMtcm9vdGVkICQoZXhwbGljaXQtYnVpbGQtZGlyKSBdCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgQWJzb2x1dGUgZGlyZWN0b3J5IHNwZWNpZmllZCB2aWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnVpbGQtZGlyJyBwcm9qZWN0IGF0dHJpYnV0ZSA6IERvIG5vdCBrbm93IGhvdyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmUgdGhhdCB3aXRoIHRoZSAtLWJ1aWxkLWRpciBvcHRpb24uIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjIFN0cmlwIHRoZSBsZWFkaW5nIHNsYXNoIGZyb20gaWQuCisgICAgICAgICAgICAgICAgICAgIGxvY2FsIHJpZCA9IFsgTUFUQ0ggXi8oLiopIDogJChpZCkgXSA7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsIHAgPSBbIHBhdGguam9pbiAkKGdsb2JhbC1idWlsZC1kaXIpICQocmlkKQorICAgICAgICAgICAgICAgICAgICAgICAgJChleHBsaWNpdC1idWlsZC1kaXIpIF0gOworCisgICAgICAgICAgICAgICAgICAgICQoYXR0cmlidXRlcykuc2V0IGJ1aWxkLWRpciA6ICQocCkgOiBleGFjdCA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgTm90IEphbXJvb3QuCisgICAgICAgICAgICAgICAgaWYgJChleHBsaWNpdC1idWlsZC1kaXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgV2hlbiAtLWJ1aWxkLWRpciBpcyBzcGVjaWZpZWQsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkLWRpcicgcHJvamVjdCA6IGF0dHJpYnV0ZSBpcyBhbGxvd2VkIG9ubHkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICB0b3AtbGV2ZWwgJ3Byb2plY3QnIGludm9jYXRpb25zIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIERlY2xhcmUgYW5kIHNldCBhIHByb2plY3QgZ2xvYmFsIGNvbnN0YW50LiBQcm9qZWN0IGdsb2JhbCBjb25zdGFudHMgYXJlCisgICAgIyBub3JtYWwgdmFyaWFibGVzIGJ1dCBzaG91bGQgbm90IGJlIGNoYW5nZWQuIFRoZXkgYXJlIGFwcGxpZWQgdG8gZXZlcnkKKyAgICAjIGNoaWxkIEphbWZpbGUuCisgICAgIworICAgIHJ1bGUgY29uc3RhbnQgKCBuYW1lIDogdmFsdWUgKyApCisgICAgeworICAgICAgICBpbXBvcnQgcHJvamVjdCA7CisgICAgICAgIGxvY2FsIGNhbGxlciA9IFsgQ0FMTEVSX01PRFVMRSBdIDsKKyAgICAgICAgbG9jYWwgcCA9IFsgcHJvamVjdC50YXJnZXQgJChjYWxsZXIpIF0gOworICAgICAgICAkKHApLmFkZC1jb25zdGFudCAkKG5hbWUpIDogJCh2YWx1ZSkgOworICAgIH0KKworICAgICMgRGVjbGFyZSBhbmQgc2V0IGEgcHJvamVjdCBnbG9iYWwgY29uc3RhbnQsIHdob3NlIHZhbHVlIGlzIGEgcGF0aC4gVGhlIHBhdGgKKyAgICAjIGlzIGFkanVzdGVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBpbnZvY2F0aW9uIGRpcmVjdG9yeS4gVGhlIGdpdmVuIHZhbHVlCisgICAgIyBwYXRoIGlzIHRha2VuIHRvIGJlIGVpdGhlciBhYnNvbHV0ZSwgb3IgcmVsYXRpdmUgdG8gdGhpcyBwcm9qZWN0IHJvb3QuCisgICAgIworICAgIHJ1bGUgcGF0aC1jb25zdGFudCAoIG5hbWUgOiB2YWx1ZSArICkKKyAgICB7CisgICAgICAgIGltcG9ydCBwcm9qZWN0IDsKKyAgICAgICAgbG9jYWwgY2FsbGVyID0gWyBDQUxMRVJfTU9EVUxFIF0gOworICAgICAgICBsb2NhbCBwID0gWyBwcm9qZWN0LnRhcmdldCAkKGNhbGxlcikgXSA7CisgICAgICAgICQocCkuYWRkLWNvbnN0YW50ICQobmFtZSkgOiAkKHZhbHVlKSA6IHBhdGggOworICAgIH0KKworICAgIHJ1bGUgdXNlLXByb2plY3QgKCBpZCA6IHdoZXJlICkKKyAgICB7CisgICAgICAgICMgU2VlIGNvbW1lbnQgaW4gJ2xvYWQnIGZvciBleHBsYW5hdGlvbi4KKyAgICAgICAgbG9jYWwgY2FsbGVyID0gWyBDQUxMRVJfTU9EVUxFIF0gOworICAgICAgICBtb2R1bGVzLnBva2UgJChjYWxsZXIpIDogLnVzZWQtcHJvamVjdHMgOiBbIG1vZHVsZXMucGVlayAkKGNhbGxlcikgOgorICAgICAgICAgICAgLnVzZWQtcHJvamVjdHMgXSAkKGlkKSAkKHdoZXJlKSA7CisgICAgfQorCisgICAgcnVsZSBidWlsZC1wcm9qZWN0ICggZGlyICkKKyAgICB7CisgICAgICAgIGltcG9ydCBwcm9qZWN0IDsKKyAgICAgICAgbG9jYWwgY2FsbGVyID0gWyBDQUxMRVJfTU9EVUxFIF0gOworICAgICAgICBsb2NhbCBhdHRyaWJ1dGVzID0gWyBwcm9qZWN0LmF0dHJpYnV0ZXMgJChjYWxsZXIpIF0gOworICAgICAgICBsb2NhbCBub3cgPSBbICQoYXR0cmlidXRlcykuZ2V0IHByb2plY3RzLXRvLWJ1aWxkIF0gOworICAgICAgICAkKGF0dHJpYnV0ZXMpLnNldCBwcm9qZWN0cy10by1idWlsZCA6ICQobm93KSAkKGRpcikgOworICAgIH0KKworICAgIHJ1bGUgZXhwbGljaXQgKCB0YXJnZXQtbmFtZXMgKiApCisgICAgeworICAgICAgICBpbXBvcnQgcHJvamVjdCA7CisgICAgICAgICMgSWYgJ2V4cGxpY2l0JyBpcyB1c2VkIGluIGEgaGVscGVyIHJ1bGUgZGVmaW5lZCBpbiBKYW1yb290IGFuZAorICAgICAgICAjIGluaGVyaXRlZCBieSBjaGlsZHJlbiwgdGhlbiBtb3N0IG9mIHRoZSB0aW1lIHdlIHdhbnQgJ2V4cGxpY2l0JyB0bworICAgICAgICAjIG9wZXJhdGUgb24gdGhlIEphbWZpbGUgd2hlcmUgdGhlIGhlbHBlciBydWxlIGlzIGludm9rZWQuCisgICAgICAgIGxvY2FsIHQgPSBbIHByb2plY3QuY3VycmVudCBdIDsKKyAgICAgICAgZm9yIGxvY2FsIG4gaW4gJCh0YXJnZXQtbmFtZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgICQodCkubWFyay10YXJnZXQtYXMtZXhwbGljaXQgJChuKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBydWxlIGFsd2F5cyAoIHRhcmdldC1uYW1lcyAqICkKKyAgICB7CisgICAgICAgIGltcG9ydCBwcm9qZWN0IDsKKyAgICAgICAgbG9jYWwgdCA9IFsgcHJvamVjdC5jdXJyZW50IF0gOworICAgICAgICBmb3IgbG9jYWwgbiBpbiAkKHRhcmdldC1uYW1lcykKKyAgICAgICAgeworICAgICAgICAgICAgJCh0KS5tYXJrLXRhcmdldC1hcy1hbHdheXMgJChuKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBydWxlIGdsb2IgKCB3aWxkY2FyZHMgKyA6IGV4Y2x1ZGVzICogKQorICAgIHsKKyAgICAgICAgaW1wb3J0IHByb2plY3QgOworICAgICAgICByZXR1cm4gWyBwcm9qZWN0Lmdsb2ItaW50ZXJuYWwgWyBwcm9qZWN0LmN1cnJlbnQgXSA6ICQod2lsZGNhcmRzKSA6CisgICAgICAgICAgICAkKGV4Y2x1ZGVzKSA6IGdsb2IgXSA7CisgICAgfQorCisgICAgcnVsZSBnbG9iLXRyZWUgKCB3aWxkY2FyZHMgKyA6IGV4Y2x1ZGVzICogKQorICAgIHsKKyAgICAgICAgaW1wb3J0IHByb2plY3QgOworICAgICAgICBpZiAkKHdpbGRjYXJkczpEKSB8fCAkKGV4Y2x1ZGVzOkQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgVGhlIHBhdHRlcm5zIHRvICdnbG9iLXRyZWUnIG1heSBub3QgaW5jbHVkZQorICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFsgcHJvamVjdC5nbG9iLWludGVybmFsIFsgcHJvamVjdC5jdXJyZW50IF0gOiAkKHdpbGRjYXJkcykgOgorICAgICAgICAgICAgJChleGNsdWRlcykgOiBnbG9iLXRyZWUgXSA7CisgICAgfQorCisgICAgIyBDYWxjdWxhdGVzIGNvbmRpdGlvbmFsIHJlcXVpcmVtZW50cyBmb3IgbXVsdGlwbGUgcmVxdWlyZW1lbnRzIGF0IG9uY2UuCisgICAgIyBUaGlzIGlzIGEgc2hvcnRoYW5kIHRvIHJlZHVjZSBkdXBsaWNhdGlvbiBhbmQgdG8ga2VlcCBhbiBpbmxpbmUKKyAgICAjIGRlY2xhcmF0aXZlIHN5bnRheC4gRm9yIGV4YW1wbGU6CisgICAgIworICAgICMgICBsaWIgeCA6IHguY3BwIDogWyBjb25kaXRpb25hbCA8dG9vbHNldD5nY2MgPHZhcmlhbnQ+ZGVidWcgOgorICAgICMgICAgICAgPGRlZmluZT5ERUJVR19FWENFUFRJT04gPGRlZmluZT5ERUJVR19UUkFDRSBdIDsKKyAgICAjCisgICAgcnVsZSBjb25kaXRpb25hbCAoIGNvbmRpdGlvbiArIDogcmVxdWlyZW1lbnRzICogKQorICAgIHsKKyAgICAgICAgbG9jYWwgY29uZGl0aW9uID0gJChjb25kaXRpb246Sj0sKSA7CisgICAgICAgIGlmIFsgTUFUQ0ggKDopIDogJChjb25kaXRpb24pIF0KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICQoY29uZGl0aW9uKSQocmVxdWlyZW1lbnRzKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gJChjb25kaXRpb24pOiQocmVxdWlyZW1lbnRzKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBydWxlIG9wdGlvbiAoIG5hbWUgOiB2YWx1ZSApCisgICAgeworICAgICAgICBsb2NhbCBtID0gWyBDQUxMRVJfTU9EVUxFIF0gOworICAgICAgICBsb2NhbCBjZmdzID0gcHJvamVjdCBzaXRlIHRlc3QgdXNlciA7CisgICAgICAgIGlmICEgJChtKSBpbiAkKGNmZ3MpLWNvbmZpZworICAgICAgICB7CisgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciBUaGUgJ29wdGlvbicgcnVsZSBtYXkgb25seSBiZSB1c2VkICJpbiIgQm9vc3QgQnVpbGQKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGVzLiA7CisgICAgICAgIH0KKyAgICAgICAgaW1wb3J0IG9wdGlvbiA7CisgICAgICAgIG9wdGlvbi5zZXQgJChuYW1lKSA6ICQodmFsdWUpIDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL3Byb3BlcnR5LXNldC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL3Byb3BlcnR5LXNldC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjYjU1NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvcHJvcGVydHktc2V0LmphbQpAQCAtMCwwICsxLDUxNyBAQAorIyBDb3B5cmlnaHQgMjAwMyBEYXZlIEFicmFoYW1zCisjIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IFZsYWRpbWlyIFBydXMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IHBhdGggOworaW1wb3J0IHByb2plY3QgOworaW1wb3J0IHByb3BlcnR5IDsKK2ltcG9ydCBzZXF1ZW5jZSA7CitpbXBvcnQgc2V0IDsKK2ltcG9ydCBvcHRpb24gOworCisjIENsYXNzIGZvciBzdG9yaW5nIGEgc2V0IG9mIHByb3BlcnRpZXMuCisjCisjICAgVGhlcmUgaXMgMTwtPjEgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBpZGVudGl0eSBhbmQgdmFsdWUuIE5vIHR3byBpbnN0YW5jZXMKKyMgb2YgdGhlIGNsYXNzIGFyZSBlcXVhbC4gVG8gbWFpbnRhaW4gdGhpcyBwcm9wZXJ0eSwgdGhlICdwcm9wZXJ0eS1zZXQuY3JlYXRlJworIyBydWxlIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzLiBJbnN0YW5jZXMgYXJlIGltbXV0YWJsZS4KKyMKKyMgICBFYWNoIHByb3BlcnR5IGlzIGNsYXNzaWZpZWQgd2l0aCByZWdhcmQgdG8gaXRzIGVmZmVjdCBvbiBidWlsZCByZXN1bHRzLgorIyBJbmNpZGVudGFsIHByb3BlcnRpZXMgaGF2ZSBubyBlZmZlY3Qgb24gYnVpbGQgcmVzdWx0cywgZnJvbSBCb29zdC5CdWlsZCdzCisjIHBvaW50IG9mIHZpZXcuIE90aGVycyBhcmUgZWl0aGVyIGZyZWUsIG9yIG5vbi1mcmVlIGFuZCB3ZSByZWZlciB0byBub24tZnJlZQorIyBvbmVzIGFzICdiYXNlJy4gRWFjaCBwcm9wZXJ0eSBiZWxvbmdzIHRvIGV4YWN0bHkgb25lIG9mIHRob3NlIGNhdGVnb3JpZXMuCisjCisjICAgSXQgaXMgcG9zc2libGUgdG8gZ2V0IGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGJlbG9uZ2luZyB0byBlYWNoIGNhdGVnb3J5IGFzCisjIHdlbGwgYXMgYSBsaXN0IG9mIHByb3BlcnRpZXMgd2l0aCBhIHNwZWNpZmljIGF0dHJpYnV0ZS4KKyMKKyMgICBTZXZlcmFsIG9wZXJhdGlvbnMsIGxpa2UgYW5kIHJlZmluZSBhbmQgYXMtcGF0aCBhcmUgcHJvdmlkZWQuIFRoZXkgYWxsIHVzZQorIyBjYWNoaW5nIHdoZW5ldmVyIHBvc3NpYmxlLgorIworY2xhc3MgcHJvcGVydHktc2V0Cit7CisgICAgaW1wb3J0IGVycm9ycyA7CisgICAgaW1wb3J0IGZlYXR1cmUgOworICAgIGltcG9ydCBwYXRoIDsKKyAgICBpbXBvcnQgcHJvcGVydHkgOworICAgIGltcG9ydCBwcm9wZXJ0eS1zZXQgOworICAgIGltcG9ydCBzZXQgOworCisgICAgcnVsZSBfX2luaXRfXyAoIHJhdy1wcm9wZXJ0aWVzICogKQorICAgIHsKKyAgICAgICAgc2VsZi5yYXcgPSAkKHJhdy1wcm9wZXJ0aWVzKSA7CisKKyAgICAgICAgZm9yIGxvY2FsIHAgaW4gJChyYXctcHJvcGVydGllcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgISAkKHA6RykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuZXJyb3IgIkludmFsaWQgcHJvcGVydHk6ICckKHApJyIgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgIyBSZXR1cm5zIEphbSBsaXN0IG9mIHN0b3JlZCBwcm9wZXJ0aWVzLgorICAgICMKKyAgICBydWxlIHJhdyAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYucmF3KSA7CisgICAgfQorCisgICAgcnVsZSBzdHIgKCApCisgICAgeworICAgICAgICByZXR1cm4gIlsiICQoc2VsZi5yYXcpICJdIiA7CisgICAgfQorCisgICAgIyBSZXR1cm5zIHByb3BlcnRpZXMgdGhhdCBhcmUgbmVpdGhlciBpbmNpZGVudGFsIG5vciBmcmVlLgorICAgICMKKyAgICBydWxlIGJhc2UgKCApCisgICAgeworICAgICAgICBpZiAhICQoc2VsZi5iYXNlLWluaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBpbml0LWJhc2UgOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHNlbGYuYmFzZSkgOworICAgIH0KKworICAgICMgUmV0dXJucyBmcmVlIHByb3BlcnRpZXMgd2hpY2ggYXJlIG5vdCBpbmNpZGVudGFsLgorICAgICMKKyAgICBydWxlIGZyZWUgKCApCisgICAgeworICAgICAgICBpZiAhICQoc2VsZi5iYXNlLWluaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBpbml0LWJhc2UgOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHNlbGYuZnJlZSkgOworICAgIH0KKworICAgICMgUmV0dXJucyBkZXBlbmRlbmN5IHByb3BlcnRpZXMuCisgICAgIworICAgIHJ1bGUgZGVwZW5kZW5jeSAoICkKKyAgICB7CisgICAgICAgIGlmICEgJChzZWxmLmRlcGVuZGVuY3ktaW5pdGlhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluaXQtZGVwZW5kZW5jeSA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQoc2VsZi5kZXBlbmRlbmN5KSA7CisgICAgfQorCisgICAgcnVsZSBub24tZGVwZW5kZW5jeSAoICkKKyAgICB7CisgICAgICAgIGlmICEgJChzZWxmLmRlcGVuZGVuY3ktaW5pdGlhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluaXQtZGVwZW5kZW5jeSA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQoc2VsZi5ub24tZGVwZW5kZW5jeSkgOworICAgIH0KKworICAgIHJ1bGUgY29uZGl0aW9uYWwgKCApCisgICAgeworICAgICAgICBpZiAhICQoc2VsZi5jb25kaXRpb25hbC1pbml0aWFsaXplZCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5pdC1jb25kaXRpb25hbCA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQoc2VsZi5jb25kaXRpb25hbCkgOworICAgIH0KKworICAgIHJ1bGUgbm9uLWNvbmRpdGlvbmFsICggKQorICAgIHsKKyAgICAgICAgaWYgISAkKHNlbGYuY29uZGl0aW9uYWwtaW5pdGlhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluaXQtY29uZGl0aW9uYWwgOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHNlbGYubm9uLWNvbmRpdGlvbmFsKSA7CisgICAgfQorCisgICAgIyBSZXR1cm5zIGluY2lkZW50YWwgcHJvcGVydGllcy4KKyAgICAjCisgICAgcnVsZSBpbmNpZGVudGFsICggKQorICAgIHsKKyAgICAgICAgaWYgISAkKHNlbGYuYmFzZS1pbml0aWFsaXplZCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5pdC1iYXNlIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChzZWxmLmluY2lkZW50YWwpIDsKKyAgICB9CisKKyAgICBydWxlIHJlZmluZSAoIHBzICkKKyAgICB7CisgICAgICAgIGlmICEgJChzZWxmLnJlZmluZWQuJChwcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHIgPSBbIHByb3BlcnR5LnJlZmluZSAkKHNlbGYucmF3KSA6IFsgJChwcykucmF3IF0gXSA7CisgICAgICAgICAgICBpZiAkKHJbMV0pICE9ICJAZXJyb3IiCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZi5yZWZpbmVkLiQocHMpID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQocikgXSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZi5yZWZpbmVkLiQocHMpID0gJChyKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQoc2VsZi5yZWZpbmVkLiQocHMpKSA7CisgICAgfQorCisgICAgcnVsZSBleHBhbmQgKCApCisgICAgeworICAgICAgICBpZiAhICQoc2VsZi5leHBhbmRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZi5leHBhbmRlZCA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZSBbIGZlYXR1cmUuZXhwYW5kICQoc2VsZi5yYXcpIF0KKyAgICAgICAgICAgICAgICBdIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChzZWxmLmV4cGFuZGVkKSA7CisgICAgfQorCisgICAgcnVsZSBleHBhbmQtY29tcG9zaXRlcyAoICkKKyAgICB7CisgICAgICAgIGlmICEgJChzZWxmLmNvbXBvc2l0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbGYuY29tcG9zaXRlcyA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZQorICAgICAgICAgICAgICAgIFsgZmVhdHVyZS5leHBhbmQtY29tcG9zaXRlcyAkKHNlbGYucmF3KSBdIF0gOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHNlbGYuY29tcG9zaXRlcykgOworICAgIH0KKworICAgIHJ1bGUgZXZhbHVhdGUtY29uZGl0aW9uYWxzICggY29udGV4dCA/ICkKKyAgICB7CisgICAgICAgIGNvbnRleHQgPz0gJChfX25hbWVfXykgOworICAgICAgICBpZiAhICQoc2VsZi5ldmFsdWF0ZWQuJChjb250ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZi5ldmFsdWF0ZWQuJChjb250ZXh0KSA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZQorICAgICAgICAgICAgICAgIFsgcHJvcGVydHkuZXZhbHVhdGUtY29uZGl0aW9uYWxzLWluLWNvbnRleHQgJChzZWxmLnJhdykgOiBbCisgICAgICAgICAgICAgICAgJChjb250ZXh0KS5yYXcgXSBdIF0gOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHNlbGYuZXZhbHVhdGVkLiQoY29udGV4dCkpIDsKKyAgICB9CisKKyAgICBydWxlIHByb3BhZ2F0ZWQgKCApCisgICAgeworICAgICAgICBpZiAhICQoc2VsZi5wcm9wYWdhdGVkLXBzKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCByZXN1bHQgOworICAgICAgICAgICAgZm9yIGxvY2FsIHAgaW4gJChzZWxmLnJhdykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiBwcm9wYWdhdGVkIGluIFsgZmVhdHVyZS5hdHRyaWJ1dGVzICQocDpHKSBdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJChwKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZi5wcm9wYWdhdGVkLXBzID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQocmVzdWx0KSBdIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChzZWxmLnByb3BhZ2F0ZWQtcHMpIDsKKyAgICB9CisKKyAgICBydWxlIGFkZC1kZWZhdWx0cyAoICkKKyAgICB7CisgICAgICAgIGlmICEgJChzZWxmLmRlZmF1bHRzKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLmRlZmF1bHRzID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlCisgICAgICAgICAgICAgICAgWyBmZWF0dXJlLmFkZC1kZWZhdWx0cyAkKHNlbGYucmF3KSBdIF0gOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHNlbGYuZGVmYXVsdHMpIDsKKyAgICB9CisKKyAgICBydWxlIGFzLXBhdGggKCApCisgICAgeworICAgICAgICBpZiAhICQoc2VsZi5hcy1wYXRoKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLmFzLXBhdGggPSBbIHByb3BlcnR5LmFzLXBhdGggWyBiYXNlIF0gXSA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQoc2VsZi5hcy1wYXRoKSA7CisgICAgfQorCisgICAgIyBDb21wdXRlcyB0aGUgcGF0aCB0byBiZSB1c2VkIGZvciBhIHRhcmdldCB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLgorICAgICMgUmV0dXJucyBhIGxpc3Qgb2YKKyAgICAjICAgLSB0aGUgY29tcHV0ZWQgcGF0aAorICAgICMgICAtIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBidWlsZCBkaXJlY3RvcnksIGEgdmFsdWUgb2YgJ3RydWUnLgorICAgICMKKyAgICBydWxlIHRhcmdldC1wYXRoICggKQorICAgIHsKKyAgICAgICAgaWYgISAkKHNlbGYudGFyZ2V0LXBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgVGhlIDxsb2NhdGlvbj4gZmVhdHVyZSBjYW4gYmUgdXNlZCB0byBleHBsaWNpdGx5IGNoYW5nZSB0aGUKKyAgICAgICAgICAgICMgbG9jYXRpb24gb2YgZ2VuZXJhdGVkIHRhcmdldHMuCisgICAgICAgICAgICBsb2NhbCBsID0gWyBnZXQgPGxvY2F0aW9uPiBdIDsKKyAgICAgICAgICAgIGlmICQobCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxmLnRhcmdldC1wYXRoID0gJChsKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWwgcCA9IFsgcHJvcGVydHktc2V0Lmhhc2gtbWF5YmUgWyBhcy1wYXRoIF0gXSA7CisKKyAgICAgICAgICAgICAgICAjIEEgcmVhbCB1Z2x5IGhhY2suIEJvb3N0IHJlZ3Jlc3Npb24gdGVzdCBzeXN0ZW0gcmVxdWlyZXMKKyAgICAgICAgICAgICAgICAjIHNwZWNpZmljIHRhcmdldCBwYXRocywgYW5kIGl0IHNlZW1zIHRoYXQgY2hhbmdpbmcgaXQgdG8gaGFuZGxlCisgICAgICAgICAgICAgICAgIyBvdGhlciBkaXJlY3RvcnkgbGF5b3V0IGlzIHJlYWxseSBoYXJkLiBGb3IgdGhhdCByZWFzb24sIHdlCisgICAgICAgICAgICAgICAgIyB0ZWFjaCBWMiB0byBkbyB0aGUgdGhpbmdzIHJlZ3Jlc3Npb24gc3lzdGVtIHJlcXVpcmVzLiBUaGUKKyAgICAgICAgICAgICAgICAjIHZhbHVlIG9mICc8bG9jYXRpb24tcHJlZml4PicgaXMgcHJlcGVuZGVkIHRvIHRoZSBwYXRoLgorICAgICAgICAgICAgICAgIGxvY2FsIHByZWZpeCA9IFsgZ2V0IDxsb2NhdGlvbi1wcmVmaXg+IF0gOworICAgICAgICAgICAgICAgIGlmICQocHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YXJnZXQtcGF0aCA9IFsgcGF0aC5qb2luICQocHJlZml4KSAkKHApIF0gOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZWxmLnRhcmdldC1wYXRoID0gJChwKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICEgJChzZWxmLnRhcmdldC1wYXRoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YXJnZXQtcGF0aCA9IC4gOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIGJ1aWxkIGRpci4KKyAgICAgICAgICAgICAgICBzZWxmLnRhcmdldC1wYXRoICs9IHRydWUgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHNlbGYudGFyZ2V0LXBhdGgpIDsKKyAgICB9CisKKyAgICBydWxlIGFkZCAoIHBzICkKKyAgICB7CisgICAgICAgIGlmICEgJChzZWxmLmFkZGVkLiQocHMpKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLmFkZGVkLiQocHMpID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQoc2VsZi5yYXcpIFsgJChwcykucmF3IF0gXQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChzZWxmLmFkZGVkLiQocHMpKSA7CisgICAgfQorCisgICAgcnVsZSBhZGQtcmF3ICggcHJvcGVydGllcyAqICkKKyAgICB7CisgICAgICAgIHJldHVybiBbIGFkZCBbIHByb3BlcnR5LXNldC5jcmVhdGUgJChwcm9wZXJ0aWVzKSBdIF0gOworICAgIH0KKworICAgICMgUmV0dXJucyBhbGwgdmFsdWVzIG9mICdmZWF0dXJlJy4KKyAgICAjCisgICAgcnVsZSBnZXQgKCBmZWF0dXJlICkKKyAgICB7CisgICAgICAgIGlmICEgJChzZWxmLm1hcC1idWlsdCkKKyAgICAgICAgeworICAgICAgICAgICAgIyBGb3IgZWFjaCBmZWF0dXJlLCBjcmVhdGUgYSBtZW1iZXIgdmFyIGFuZCBhc3NpZ24gYWxsIHZhbHVlcyB0byBpdC4KKyAgICAgICAgICAgICMgU2luY2UgYWxsIHJlZ3VsYXIgbWVtYmVyIHZhcnMgc3RhcnQgd2l0aCAnc2VsZicsIHRoZXJlIHdpbGwgYmUgbm8KKyAgICAgICAgICAgICMgY29uZmxpY3RzIGJldHdlZW4gbmFtZXMuCisgICAgICAgICAgICBzZWxmLm1hcC1idWlsdCA9IHRydWUgOworICAgICAgICAgICAgZm9yIGxvY2FsIHYgaW4gJChzZWxmLnJhdykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkKHY6RykgKz0gJCh2Okc9KSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQoJChmZWF0dXJlKSkgOworICAgIH0KKworICAgICMgUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eS1zZXQgY29udGFpbnMgYWxsIHRoZQorICAgICMgc3BlY2lmaWVkIHByb3BlcnRpZXMuCisgICAgIworICAgIHJ1bGUgY29udGFpbnMtcmF3ICggcHJvcGVydGllcyAqICkKKyAgICB7CisgICAgICAgIGlmICQocHJvcGVydGllcykgaW4gJChzZWxmLnJhdykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWUgOworICAgICAgICB9CisgICAgfQorCisgICAgIyBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5LXNldCBoYXMgdmFsdWVzIGZvcgorICAgICMgYWxsIHRoZSBzcGVjaWZpZWQgZmVhdHVyZXMKKyAgICAjCisgICAgcnVsZSBjb250YWlucy1mZWF0dXJlcyAoIGZlYXR1cmVzICogKQorICAgIHsKKyAgICAgICAgaWYgJChmZWF0dXJlcykgaW4gJChzZWxmLnJhdzpHKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIHByaXZhdGUKKworICAgIHJ1bGUgaW5pdC1iYXNlICggKQorICAgIHsKKyAgICAgICAgZm9yIGxvY2FsIHAgaW4gJChzZWxmLnJhdykKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgYXR0ID0gWyBmZWF0dXJlLmF0dHJpYnV0ZXMgJChwOkcpIF0gOworICAgICAgICAgICAgIyBBIGZlYXR1cmUgY2FuIGJlIGJvdGggaW5jaWRlbnRhbCBhbmQgZnJlZSwgaW4gd2hpY2ggY2FzZSB3ZSBhZGQgaXQKKyAgICAgICAgICAgICMgdG8gaW5jaWRlbnRhbC4KKyAgICAgICAgICAgIGlmIGluY2lkZW50YWwgaW4gJChhdHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZi5pbmNpZGVudGFsICs9ICQocCkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiBmcmVlIGluICQoYXR0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGYuZnJlZSArPSAkKHApIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxmLmJhc2UgKz0gJChwKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2VsZi5iYXNlLWluaXRpYWxpemVkID0gdHJ1ZSA7CisgICAgfQorCisgICAgcnVsZSBpbml0LWRlcGVuZGVuY3kgKCApCisgICAgeworICAgICAgICBmb3IgbG9jYWwgcCBpbiAkKHNlbGYucmF3KQorICAgICAgICB7CisgICAgICAgICAgICBpZiBkZXBlbmRlbmN5IGluIFsgZmVhdHVyZS5hdHRyaWJ1dGVzICQocDpHKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZi5kZXBlbmRlbmN5ICs9ICQocCkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGYubm9uLWRlcGVuZGVuY3kgKz0gJChwKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2VsZi5kZXBlbmRlbmN5LWluaXRpYWxpemVkID0gdHJ1ZSA7CisgICAgfQorCisgICAgcnVsZSBpbml0LWNvbmRpdGlvbmFsICggKQorICAgIHsKKyAgICAgICAgZm9yIGxvY2FsIHAgaW4gJChzZWxmLnJhdykKKyAgICAgICAgeworICAgICAgICAgICAgIyBUT0RPOiBOb3RlIHRoYXQgbm9uLWNvbmRpdGlvbmFsIHByb3BlcnRpZXMgbWF5IGNvbnRhaW4gY29sb24gKCc6JykKKyAgICAgICAgICAgICMgY2hhcmFjdGVycyBhcyB3ZWxsLCBlLmcuIGZyZWUgb3IgaW5kaXJlY3QgcHJvcGVydGllcy4gSW5kaXJlY3QKKyAgICAgICAgICAgICMgcHJvcGVydGllcyBmb3IgZXhhbXBsZSBjb250YWluIGEgZnVsbCBKYW1maWxlIHBhdGggaW4gdGhlaXIgdmFsdWUKKyAgICAgICAgICAgICMgd2hpY2ggb24gV2luZG93cyBmaWxlIHN5c3RlbXMgY29udGFpbnMgJzonIGFzIHRoZSBkcml2ZSBzZXBhcmF0b3IuCisgICAgICAgICAgICBpZiBbIE1BVENIICg6KSA6ICQocDpHPSkgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGYuY29uZGl0aW9uYWwgKz0gJChwKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZi5ub24tY29uZGl0aW9uYWwgKz0gJChwKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2VsZi5jb25kaXRpb25hbC1pbml0aWFsaXplZCA9IHRydWUgOworICAgIH0KK30KKworCisjIENyZWF0ZXMgYSBuZXcgJ3Byb3BlcnR5LXNldCcgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiByYXcgcHJvcGVydGllcyBvciByZXR1cm5zCisjIGFuIGFscmVhZHkgZXhpc3Rpbmcgb25lcy4KKyMKK3J1bGUgY3JlYXRlICggcmF3LXByb3BlcnRpZXMgKiApCit7CisgICAgcmF3LXByb3BlcnRpZXMgPSBbIHNlcXVlbmNlLnVuaXF1ZQorICAgICAgICBbIHNlcXVlbmNlLmluc2VydGlvbi1zb3J0ICQocmF3LXByb3BlcnRpZXMpIF0gXSA7CisKKyAgICBsb2NhbCBrZXkgPSAkKHJhdy1wcm9wZXJ0aWVzOko9LTpFPSkgOworCisgICAgaWYgISAkKC5wcy4kKGtleSkpCisgICAgeworICAgICAgICAucHMuJChrZXkpID0gWyBuZXcgcHJvcGVydHktc2V0ICQocmF3LXByb3BlcnRpZXMpIF0gOworICAgIH0KKyAgICByZXR1cm4gJCgucHMuJChrZXkpKSA7Cit9CitOQVRJVkVfUlVMRSBwcm9wZXJ0eS1zZXQgOiBjcmVhdGUgOworCitpZiBbIEhBU19OQVRJVkVfUlVMRSBjbGFzc0Bwcm9wZXJ0eS1zZXQgOiBnZXQgOiAxIF0KK3sKKyAgICBOQVRJVkVfUlVMRSBjbGFzc0Bwcm9wZXJ0eS1zZXQgOiBnZXQgOworfQorCitpZiBbIEhBU19OQVRJVkVfUlVMRSBjbGFzc0Bwcm9wZXJ0eS1zZXQgOiBjb250YWlucy1mZWF0dXJlcyA6IDEgXQoreworICAgIE5BVElWRV9SVUxFIGNsYXNzQHByb3BlcnR5LXNldCA6IGNvbnRhaW5zLWZlYXR1cmVzIDsKK30KKworIyBDcmVhdGVzIGEgbmV3ICdwcm9wZXJ0eS1zZXQnIGluc3RhbmNlIGFmdGVyIGNoZWNraW5nIHRoYXQgYWxsIHByb3BlcnRpZXMgYXJlCisjIHZhbGlkIGFuZCBjb252ZXJ0aW5nIGltcGxpY2l0IHByb3BlcnRpZXMgaW50byBncmlzdGVkIGZvcm0uCisjCitydWxlIGNyZWF0ZS13aXRoLXZhbGlkYXRpb24gKCByYXctcHJvcGVydGllcyAqICkKK3sKKyAgICBwcm9wZXJ0eS52YWxpZGF0ZSAkKHJhdy1wcm9wZXJ0aWVzKSA7CisgICAgcmV0dXJuIFsgY3JlYXRlIFsgcHJvcGVydHkubWFrZSAkKHJhdy1wcm9wZXJ0aWVzKSBdIF0gOworfQorCisKKyMgQ3JlYXRlcyBhIHByb3BlcnR5LXNldCBmcm9tIHRoZSBpbnB1dCBnaXZlbiBieSB0aGUgdXNlciwgaW4gdGhlIGNvbnRleHQgb2YKKyMgJ2phbWZpbGUtbW9kdWxlJyBhdCAnbG9jYXRpb24nLgorIworcnVsZSBjcmVhdGUtZnJvbS11c2VyLWlucHV0ICggcmF3LXByb3BlcnRpZXMgKiA6IGphbWZpbGUtbW9kdWxlIGxvY2F0aW9uICkKK3sKKyAgICBsb2NhbCBwcm9qZWN0LWlkID0gWyBwcm9qZWN0LmF0dHJpYnV0ZSAkKGphbWZpbGUtbW9kdWxlKSBpZCBdIDsKKyAgICBwcm9qZWN0LWlkID89IFsgcGF0aC5yb290ICQobG9jYXRpb24pIFsgcGF0aC5wd2QgXSBdIDsKKyAgICByZXR1cm4gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlIFsgcHJvcGVydHkudHJhbnNsYXRlICQocmF3LXByb3BlcnRpZXMpCisgICAgICAgIDogJChwcm9qZWN0LWlkKSA6ICQobG9jYXRpb24pIDogJChqYW1maWxlLW1vZHVsZSkgXSBdIDsKK30KKworCisjIFJlZmluZXMgcmVxdWlyZW1lbnRzIHdpdGggcmVxdWlyZW1lbnRzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBTcGVjaWFsbHkgaGFuZGxlcworIyAiLTxwcm9wZXJ0eT52YWx1ZSIgc3ludGF4IGluIHNwZWNpZmljYXRpb24gdG8gcmVtb3ZlIGdpdmVuIHJlcXVpcmVtZW50cy4KKyMgLSBwYXJlbnQtcmVxdWlyZW1lbnRzIC0tIHByb3BlcnR5LXNldCBvYmplY3Qgd2l0aCByZXF1aXJlbWVudHMgdG8gcmVmaW5lLgorIyAtIHNwZWNpZmljYXRpb24gICAgICAgLS0gc3RyaW5nIGxpc3Qgb2YgcmVxdWlyZW1lbnRzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgorIyAtIHByb2plY3QtbW9kdWxlICAgICAgLS0gbW9kdWxlIHRvIHdoaWNoIGNvbnRleHQgaW5kaXJlY3QgZmVhdHVyZXMgd2lsbCBiZQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmQuCisjIC0gbG9jYXRpb24gICAgICAgICAgICAtLSBwYXRoIHRvIHdoaWNoIHBhdGggZmVhdHVyZXMgYXJlIHJlbGF0aXZlLgorIworcnVsZSByZWZpbmUtZnJvbS11c2VyLWlucHV0ICggcGFyZW50LXJlcXVpcmVtZW50cyA6IHNwZWNpZmljYXRpb24gKiA6CisgICAgcHJvamVjdC1tb2R1bGUgOiBsb2NhdGlvbiApCit7CisgICAgaWYgISAkKHNwZWNpZmljYXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gJChwYXJlbnQtcmVxdWlyZW1lbnRzKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxvY2FsIGFkZC1yZXF1aXJlbWVudHMgOworICAgICAgICBsb2NhbCByZW1vdmUtcmVxdWlyZW1lbnRzIDsKKworICAgICAgICBmb3IgbG9jYWwgciBpbiAkKHNwZWNpZmljYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIG0gPSBbIE1BVENIICJeLSguKikiIDogJChyKSBdIDsKKyAgICAgICAgICAgIGlmICQobSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZW1vdmUtcmVxdWlyZW1lbnRzICs9ICQobSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZC1yZXF1aXJlbWVudHMgKz0gJChyKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAkKHJlbW92ZS1yZXF1aXJlbWVudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgTmVlZCB0byBjcmVhdGUgYSBwcm9wZXJ0eSBzZXQsIHNvIHRoYXQgcGF0aCBmZWF0dXJlcyBhbmQgaW5kaXJlY3QKKyAgICAgICAgICAgICMgZmVhdHVyZXMgYXJlIHRyYW5zbGF0ZWQganVzdCBsaWtlIHRoZXkgYXJlIGluIHByb2plY3QKKyAgICAgICAgICAgICMgcmVxdWlyZW1lbnRzLgorICAgICAgICAgICAgbG9jYWwgcHMgPSBbIHByb3BlcnR5LXNldC5jcmVhdGUtZnJvbS11c2VyLWlucHV0CisgICAgICAgICAgICAgICAgJChyZW1vdmUtcmVxdWlyZW1lbnRzKSA6ICQocHJvamVjdC1tb2R1bGUpICQobG9jYXRpb24pIF0gOworCisgICAgICAgICAgICBwYXJlbnQtcmVxdWlyZW1lbnRzID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlCisgICAgICAgICAgICAgICAgWyBzZXQuZGlmZmVyZW5jZSBbICQocGFyZW50LXJlcXVpcmVtZW50cykucmF3IF0KKyAgICAgICAgICAgICAgICA6IFsgJChwcykucmF3IF0gXSBdIDsKKyAgICAgICAgICAgIHNwZWNpZmljYXRpb24gPSAkKGFkZC1yZXF1aXJlbWVudHMpIDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIHJlcXVpcmVtZW50cyA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZS1mcm9tLXVzZXItaW5wdXQKKyAgICAgICAgICAgICQoc3BlY2lmaWNhdGlvbikgOiAkKHByb2plY3QtbW9kdWxlKSAkKGxvY2F0aW9uKSBdIDsKKworICAgICAgICByZXR1cm4gWyAkKHBhcmVudC1yZXF1aXJlbWVudHMpLnJlZmluZSAkKHJlcXVpcmVtZW50cykgXSA7CisgICAgfQorfQorCisKKyMgUmV0dXJucyBhIHByb3BlcnR5LXNldCB3aXRoIGFuIGVtcHR5IHNldCBvZiBwcm9wZXJ0aWVzLgorIworcnVsZSBlbXB0eSAoICkKK3sKKyAgICBpZiAhICQoLmVtcHR5KQorICAgIHsKKyAgICAgICAgLmVtcHR5ID0gWyBjcmVhdGUgXSA7CisgICAgfQorICAgIHJldHVybiAkKC5lbXB0eSkgOworfQorCisKK2lmIFsgb3B0aW9uLmdldCBoYXNoIDogOiB5ZXMgXSA9IHllcworeworICAgIHJ1bGUgaGFzaC1tYXliZSAoIHBhdGggPyApCisgICAgeworICAgICAgICBwYXRoID89ICIiIDsKKyAgICAgICAgcmV0dXJuIFsgTUQ1ICQocGF0aCkgXSA7CisgICAgfQorfQorZWxzZQoreworICAgIHJ1bGUgaGFzaC1tYXliZSAoIHBhdGggPyApCisgICAgeworICAgICAgICByZXR1cm4gJChwYXRoKSA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9wcm9wZXJ0eS5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL3Byb3BlcnR5LmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzlkYmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9wcm9wZXJ0eS5qYW0KQEAgLTAsMCArMSw5MDUgQEAKKyMgQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDMgRGF2ZSBBYnJhaGFtcworIyBDb3B5cmlnaHQgMjAwNiBSZW5lIFJpdmVyYQorIyBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBWbGFkaW1pciBQcnVzCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBpbmRpcmVjdCA7CitpbXBvcnQgcGF0aCA7CitpbXBvcnQgcmVnZXggOworaW1wb3J0IHN0cmluZyA7CitpbXBvcnQgc2VxdWVuY2UgOworaW1wb3J0IHNldCA7CitpbXBvcnQgdXRpbGl0eSA7CisKKworIyBSZWZpbmVzICdwcm9wZXJ0aWVzJyBieSBvdmVycmlkaW5nIGFueSBub24tZnJlZSBhbmQgbm9uLWNvbmRpdGlvbmFsIHByb3BlcnRpZXMKKyMgZm9yIHdoaWNoIGEgZGlmZmVyZW50IHZhbHVlIGlzIHNwZWNpZmllZCBpbiAncmVxdWlyZW1lbnRzJy4gUmV0dXJucyB0aGUKKyMgcmVzdWx0aW5nIGxpc3Qgb2YgcHJvcGVydGllcy4KKyMKK3J1bGUgcmVmaW5lICggcHJvcGVydGllcyAqIDogcmVxdWlyZW1lbnRzICogKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgbG9jYWwgdW5zZXQgOworCisgICAgIyBDb2xsZWN0IGFsbCBub24tZnJlZSBmZWF0dXJlcyBpbiByZXF1aXJlbWVudHMKKyAgICBmb3IgbG9jYWwgciBpbiAkKHJlcXVpcmVtZW50cykKKyAgICB7CisgICAgICAgICMgRG8gbm90IGNvbnNpZGVyIGNvbmRpdGlvbmFsIHJlcXVpcmVtZW50cy4KKyAgICAgICAgaWYgISBbIE1BVENIICg6KSA6ICQocjpHPSkgXSAmJiAhIGZyZWUgaW4gWyBmZWF0dXJlLmF0dHJpYnV0ZXMgJChyOkcpIF0KKyAgICAgICAgeworICAgICAgICAgICAgdW5zZXQgKz0gJChyOkcpIDsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgUmVtb3ZlIHByb3BlcnRpZXMgdGhhdCBhcmUgb3ZlcnJpZGRlbiBieSByZXF1aXJlbWVudHMKKyAgICBmb3IgbG9jYWwgcCBpbiAkKHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBpZiBbIE1BVENIICg6KSA6ICQocDpHPSkgXSB8fCAhICQocDpHKSBpbiAkKHVuc2V0KQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gJChwKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gWyBzZXF1ZW5jZS51bmlxdWUgJChyZXN1bHQpICQocmVxdWlyZW1lbnRzKSBdIDsKK30KKworCisjIFJlbW92ZXMgYWxsIGNvbmRpdGlvbmFsIHByb3BlcnRpZXMgd2hvc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4gRm9yIHRob3NlCisjIHdpdGggbWV0IGNvbmRpdGlvbnMsIHJlbW92ZXMgdGhlIGNvbmRpdGlvbi4gUHJvcGVydGllcyBpbiBjb25kaXRpb25zIGFyZQorIyBsb29rZWQgdXAgaW4gJ2NvbnRleHQnLgorIworcnVsZSBldmFsdWF0ZS1jb25kaXRpb25hbHMtaW4tY29udGV4dCAoIHByb3BlcnRpZXMgKiA6IGNvbnRleHQgKiApCit7CisgICAgbG9jYWwgYmFzZSA7CisgICAgbG9jYWwgY29uZGl0aW9uYWxzIDsKKyAgICBmb3IgbG9jYWwgcCBpbiAkKHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBpZiBbIE1BVENIICg6PCkgOiAkKHApIF0KKyAgICAgICAgeworICAgICAgICAgICAgY29uZGl0aW9uYWxzICs9ICQocCkgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZSArPSAkKHApIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxvY2FsIHJlc3VsdCA9ICQoYmFzZSkgOworICAgIGZvciBsb2NhbCBwIGluICQoY29uZGl0aW9uYWxzKQorICAgIHsKKyAgICAgICAgIyBTZXBhcmF0ZSBjb25kaXRpb24gYW5kIHByb3BlcnR5LgorICAgICAgICBsb2NhbCBzID0gWyBNQVRDSCBeKC4qKTooPC4qKSA6ICQocCkgXSA7CisgICAgICAgICMgU3BsaXQgY29uZGl0aW9uIGludG8gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzLgorICAgICAgICBsb2NhbCBjb25kaXRpb24gPSBbIHJlZ2V4LnNwbGl0ICQoc1sxXSkgIiwiIF0gOworICAgICAgICAjIEV2YWx1YXRlIGNvbmRpdGlvbi4KKyAgICAgICAgaWYgISBbIE1BVENIIF4oISkuKiA6ICQoY29uZGl0aW9uOkc9KSBdCisgICAgICAgIHsKKyAgICAgICAgICAgICMgT25seSBwb3NpdGl2ZSBjaGVja3MKKyAgICAgICAgICAgIGlmICQoY29uZGl0aW9uKSBpbiAkKGNvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoc1syXSkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgIyBIYXZlIG5lZ2F0aXZlIGNoZWNrcworICAgICAgICAgICAgbG9jYWwgZmFpbCA7CisgICAgICAgICAgICB3aGlsZSAkKGNvbmRpdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBjID0gJChjb25kaXRpb25bMV0pIDsKKyAgICAgICAgICAgICAgICBsb2NhbCBtID0gWyBNQVRDSCBeISguKikgOiAkKGMpIF0gOworICAgICAgICAgICAgICAgIGlmICQobSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsIHAgPSAkKG06Rz0kKGM6RykpIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgJChwKSBpbiAkKGNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgISAkKGMpIGluICQoY29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWUgOworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25kaXRpb24gPSAkKGNvbmRpdGlvblsyLV0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICEgJChmYWlsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAkKHNbMl0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCitydWxlIGV4cGFuZC1zdWJmZWF0dXJlcy1pbi1jb25kaXRpb25zICggcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGZvciBsb2NhbCBwIGluICQocHJvcGVydGllcykKKyAgICB7CisgICAgICAgIGxvY2FsIHMgPSBbIE1BVENIIF4oLiopOig8LiopIDogJChwKSBdIDsKKyAgICAgICAgaWYgISAkKHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAkKHApIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGNvbmRpdGlvbiA9ICQoc1sxXSkgOworICAgICAgICAgICAgbG9jYWwgdmFsdWUgICAgID0gJChzWzJdKSA7CisgICAgICAgICAgICAjIENvbmRpdGlvbiBtaWdodCBpbmNsdWRlIHNldmVyYWwgZWxlbWVudHMuCisgICAgICAgICAgICBjb25kaXRpb24gPSBbIHJlZ2V4LnNwbGl0ICQoY29uZGl0aW9uKSAiLCIgXSA7CisgICAgICAgICAgICBsb2NhbCBlIDsKKyAgICAgICAgICAgIGZvciBsb2NhbCBjIGluICQoY29uZGl0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgSXQgaXMgY29tbW9uIGZvciBhIGNvbmRpdGlvbiB0byBpbmNsdWRlIGEgdG9vbHNldCBvcgorICAgICAgICAgICAgICAgICMgc3ViZmVhdHVyZXMgdGhhdCBoYXZlIG5vdCBiZWVuIGRlZmluZWQuIEluIHRoYXQgY2FzZSB3ZSB3YW50CisgICAgICAgICAgICAgICAgIyB0aGUgY29uZGl0aW9uIHRvIHNpbXBseSAnbmV2ZXIgYmUgc2F0aXNmaWVkJyBhbmQgdmFsaWRhdGlvbgorICAgICAgICAgICAgICAgICMgd291bGQgb25seSBwcm9kdWNlIGEgc3B1cmlvdXMgZXJyb3Igc28gd2UgcHJldmVudCBpdCBieQorICAgICAgICAgICAgICAgICMgcGFzc2luZyAndHJ1ZScgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgICAgZSArPSBbIGZlYXR1cmUuZXhwYW5kLXN1YmZlYXR1cmVzICQoYykgOiB0cnVlIF0gOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgJChlKSA9ICQoY29uZGl0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgKHRvZG8pCisgICAgICAgICAgICAgICAgIyAgIFRoaXMgaXMganVzdCBhbiBvcHRpbWl6YXRpb24gYW5kIHBvc3NpYmx5IGEgcHJlbWF0dXJlIG9uZSBhdAorICAgICAgICAgICAgICAgICMgdGhhdC4KKyAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9kbykgKDEyLjA3LjIwMDguKSAoSnVya28pCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQocCkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAkKGU6Sj0sKTokKHZhbHVlKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBIZWxwZXIgZm9yIGFzLXBhdGgsIGJlbG93LiBPcmRlcnMgcHJvcGVydGllcyB3aXRoIHRoZSBpbXBsaWNpdCBvbmVzIGZpcnN0LCBhbmQKKyMgd2l0aGluIHRoZSB0d28gc2VjdGlvbnMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIG9mIGZlYXR1cmUgbmFtZS4KKyMKK2xvY2FsIHJ1bGUgcGF0aC1vcmRlciAoIHggeSApCit7CisgICAgaWYgJCh5OkcpICYmICEgJCh4OkcpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgfQorICAgIGVsc2UgaWYgJCh4OkcpICYmICEgJCh5OkcpCisgICAgeworICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAhICQoeDpHKQorICAgICAgICB7CisgICAgICAgICAgICB4ID0gWyBmZWF0dXJlLmV4cGFuZC1zdWJmZWF0dXJlcyAkKHgpIF0gOworICAgICAgICAgICAgeSA9IFsgZmVhdHVyZS5leHBhbmQtc3ViZmVhdHVyZXMgJCh5KSBdIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICQoeFsxXSkgPCAkKHlbMV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitsb2NhbCBydWxlIGFiYnJldmlhdGUtZGFzaGVkICggc3RyaW5nICkKK3sKKyAgICBsb2NhbCByIDsKKyAgICBmb3IgbG9jYWwgcGFydCBpbiBbIHJlZ2V4LnNwbGl0ICQoc3RyaW5nKSAtIF0KKyAgICB7CisgICAgICAgIHIgKz0gWyBzdHJpbmcuYWJicmV2aWF0ZSAkKHBhcnQpIF0gOworICAgIH0KKyAgICByZXR1cm4gJChyOko9LSkgOworfQorCisKK2xvY2FsIHJ1bGUgaWRlbnRpdHkgKCBzdHJpbmcgKQoreworICAgIHJldHVybiAkKHN0cmluZykgOworfQorCisKK2lmIC0tYWJicmV2aWF0ZS1wYXRocyBpbiBbIG1vZHVsZXMucGVlayA6IEFSR1YgXQoreworICAgIC5hYmJyZXYgPSBhYmJyZXZpYXRlLWRhc2hlZCA7Cit9CitlbHNlCit7CisgICAgLmFiYnJldiA9IGlkZW50aXR5IDsKK30KKworCisjIFJldHVybnMgYSBwYXRoIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gZXhwYW5kZWQgcHJvcGVydHkgc2V0LgorIworcnVsZSBhcy1wYXRoICggcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NhbCBlbnRyeSA9IC5yZXN1bHQuJChwcm9wZXJ0aWVzOko9LSkgOworCisgICAgaWYgISAkKCQoZW50cnkpKQorICAgIHsKKyAgICAgICAgIyBUcmltIHJlZHVuZGFuY3kuCisgICAgICAgIHByb3BlcnRpZXMgPSBbIGZlYXR1cmUubWluaW1pemUgJChwcm9wZXJ0aWVzKSBdIDsKKworICAgICAgICAjIFNvcnQgYWNjb3JkaW5nIHRvIHBhdGgtb3JkZXIuCisgICAgICAgIHByb3BlcnRpZXMgPSBbIHNlcXVlbmNlLmluc2VydGlvbi1zb3J0ICQocHJvcGVydGllcykgOiBwYXRoLW9yZGVyIF0gOworCisgICAgICAgIGxvY2FsIGNvbXBvbmVudHMgOworICAgICAgICBmb3IgbG9jYWwgcCBpbiAkKHByb3BlcnRpZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQocDpHKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsIGYgPSBbIHV0aWxpdHkudW5ncmlzdCAkKHA6RykgXSA7CisgICAgICAgICAgICAgICAgcCA9ICQoZiktJChwOkc9KSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21wb25lbnRzICs9IFsgJCguYWJicmV2KSAkKHApIF0gOworICAgICAgICB9CisKKyAgICAgICAgJChlbnRyeSkgPSAkKGNvbXBvbmVudHM6Sj0vKSA7CisgICAgfQorCisgICAgcmV0dXJuICQoJChlbnRyeSkpIDsKK30KKworCisjIEV4aXQgd2l0aCBlcnJvciBpZiBwcm9wZXJ0eSBpcyBub3QgdmFsaWQuCisjCitsb2NhbCBydWxlIHZhbGlkYXRlMSAoIHByb3BlcnR5ICkKK3sKKyAgICBsb2NhbCBtc2cgOworICAgIGlmICQocHJvcGVydHk6RykKKyAgICB7CisgICAgICAgIGxvY2FsIGZlYXR1cmUgPSAkKHByb3BlcnR5OkcpIDsKKyAgICAgICAgbG9jYWwgdmFsdWUgPSAkKHByb3BlcnR5Okc9KSA7CisKKyAgICAgICAgaWYgISBbIGZlYXR1cmUudmFsaWQgJChmZWF0dXJlKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgICMgVW5ncmlzdCBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLgorICAgICAgICAgICAgZmVhdHVyZSA9IFsgdXRpbGl0eS51bmdyaXN0ICQocHJvcGVydHk6RykgXSA7CisgICAgICAgICAgICBtc2cgPSAidW5rbm93biBmZWF0dXJlICckKGZlYXR1cmUpJyIgOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgJCh2YWx1ZSkgJiYgISBmcmVlIGluIFsgZmVhdHVyZS5hdHRyaWJ1dGVzICQoZmVhdHVyZSkgXQorICAgICAgICB7CisgICAgICAgICAgICBmZWF0dXJlLnZhbGlkYXRlLXZhbHVlLXN0cmluZyAkKGZlYXR1cmUpICQodmFsdWUpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICEgKCAkKHZhbHVlKSB8fCAoIG9wdGlvbmFsIGluIFsgZmVhdHVyZS5hdHRyaWJ1dGVzICQoZmVhdHVyZSkgXSApICkKKyAgICAgICAgeworICAgICAgICAgICAgIyBVbmdyaXN0IGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuCisgICAgICAgICAgICBmZWF0dXJlID0gWyB1dGlsaXR5LnVuZ3Jpc3QgJChwcm9wZXJ0eTpHKSBdIDsKKyAgICAgICAgICAgIG1zZyA9ICJObyB2YWx1ZSBzcGVjaWZpZWQgZm9yIGZlYXR1cmUgJyQoZmVhdHVyZSknIiA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbG9jYWwgZmVhdHVyZSA9IFsgZmVhdHVyZS5pbXBsaWVkLWZlYXR1cmUgJChwcm9wZXJ0eSkgXSA7CisgICAgICAgIGZlYXR1cmUudmFsaWRhdGUtdmFsdWUtc3RyaW5nICQoZmVhdHVyZSkgJChwcm9wZXJ0eSkgOworICAgIH0KKyAgICBpZiAkKG1zZykKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgIkludmFsaWQgcHJvcGVydHkgIickKHByb3BlcnR5Oko9IiAiKSciOiAiJChtc2c6Sj0iICIpLiA7CisgICAgfQorfQorCisKK3J1bGUgdmFsaWRhdGUgKCBwcm9wZXJ0aWVzICogKQoreworICAgIGZvciBsb2NhbCBwIGluICQocHJvcGVydGllcykKKyAgICB7CisgICAgICAgIHZhbGlkYXRlMSAkKHApIDsKKyAgICB9Cit9CisKKworcnVsZSB2YWxpZGF0ZS1wcm9wZXJ0eS1zZXRzICggcHJvcGVydHktc2V0cyAqICkKK3sKKyAgICBmb3IgbG9jYWwgcyBpbiAkKHByb3BlcnR5LXNldHMpCisgICAgeworICAgICAgICB2YWxpZGF0ZSBbIGZlYXR1cmUuc3BsaXQgJChzKSBdIDsKKyAgICB9Cit9CisKKworIyBFeHBhbmRzIGFueSBpbXBsaWNpdCBwcm9wZXJ0eSB2YWx1ZXMgaW4gdGhlIGdpdmVuIHByb3BlcnR5ICdzcGVjaWZpY2F0aW9uJyBzbworIyB0aGV5IGV4cGxpY2l0bHkgc3RhdGUgdGhlaXIgZmVhdHVyZS4KKyMKK3J1bGUgbWFrZSAoIHNwZWNpZmljYXRpb24gKiApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBmb3IgbG9jYWwgZSBpbiAkKHNwZWNpZmljYXRpb24pCisgICAgeworICAgICAgICBpZiAkKGU6RykKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICQoZSkgOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgWyBmZWF0dXJlLmlzLWltcGxpY2l0LXZhbHVlICQoZSkgXQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBmZWF0dXJlID0gWyBmZWF0dXJlLmltcGxpZWQtZmVhdHVyZSAkKGUpIF0gOworICAgICAgICAgICAgcmVzdWx0ICs9ICQoZmVhdHVyZSkkKGUpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICAgICAgZXJyb3JzLmVycm9yICInJChlKScgaXMgbm90IGEgdmFsaWQgcHJvcGVydHkgc3BlY2lmaWNhdGlvbiIgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgUmV0dXJucyBhIHByb3BlcnR5IHNldCBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgaW4gJ3Byb3BlcnRpZXMnIHRoYXQgZG8gbm90CisjIGhhdmUgdGhlaXIgYXR0cmlidXRlcyBsaXN0ZWQgaW4gJ2F0dHJpYnV0ZXMnLgorIworcnVsZSByZW1vdmUgKCBhdHRyaWJ1dGVzICsgOiBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgZm9yIGxvY2FsIGUgaW4gJChwcm9wZXJ0aWVzKQorICAgIHsKKyAgICAgICAgaWYgISBbIHNldC5pbnRlcnNlY3Rpb24gJChhdHRyaWJ1dGVzKSA6IFsgZmVhdHVyZS5hdHRyaWJ1dGVzICQoZTpHKSBdIF0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICQoZSkgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgUmV0dXJucyBhIHByb3BlcnR5IHNldCBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgaW4gJ3Byb3BlcnRpZXMnIHRoYXQgaGF2ZQorIyB0aGVpciBhdHRyaWJ1dGVzIGxpc3RlZCBpbiAnYXR0cmlidXRlcycuCisjCitydWxlIHRha2UgKCBhdHRyaWJ1dGVzICsgOiBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgZm9yIGxvY2FsIGUgaW4gJChwcm9wZXJ0aWVzKQorICAgIHsKKyAgICAgICAgaWYgWyBzZXQuaW50ZXJzZWN0aW9uICQoYXR0cmlidXRlcykgOiBbIGZlYXR1cmUuYXR0cmlidXRlcyAkKGU6RykgXSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAkKGUpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIFNlbGVjdHMgcHJvcGVydGllcyBjb3JyZXNwb25kaW5nIHRvIGFueSBvZiB0aGUgZ2l2ZW4gZmVhdHVyZXMuCisjCitydWxlIHNlbGVjdCAoIGZlYXR1cmVzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisKKyAgICAjIEFkZCBhbnkgbWlzc2luZyBhbmdsZSBicmFja2V0cy4KKyAgICBsb2NhbCBlbXB0eSA9ICIiIDsKKyAgICBmZWF0dXJlcyA9ICQoZW1wdHk6Rz0kKGZlYXR1cmVzKSkgOworCisgICAgZm9yIGxvY2FsIHAgaW4gJChwcm9wZXJ0aWVzKQorICAgIHsKKyAgICAgICAgaWYgJChwOkcpIGluICQoZmVhdHVyZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAkKHApIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIFJldHVybnMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHByb3BlcnRpZXMgd2l0aCBhbGwgdmFsdWVzIG9mIHRoZSBnaXZlbiBmZWF0dXJlCisjIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiB2YWx1ZS4gSWYgJ3ZhbHVlJyBpcyBlbXB0eSB0aGUgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQuCisjCitydWxlIGNoYW5nZSAoIHByb3BlcnRpZXMgKiA6IGZlYXR1cmUgdmFsdWUgPyApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBmb3IgbG9jYWwgcCBpbiAkKHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBpZiAkKHA6RykgPSAkKGZlYXR1cmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAkKHZhbHVlOkc9JChmZWF0dXJlKSkgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICQocCkgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgSWYgJ3Byb3BlcnR5JyBpcyBhIGNvbmRpdGlvbmFsIHByb3BlcnR5LCByZXR1cm5zIHRoZSBjb25kaXRpb24gYW5kIHRoZQorIyBwcm9wZXJ0eS4gRS5nLiA8dmFyaWFudD5kZWJ1Zyw8dG9vbHNldD5nY2M6PGlubGluaW5nPmZ1bGwgd2lsbCBiZWNvbWUKKyMgPHZhcmlhbnQ+ZGVidWcsPHRvb2xzZXQ+Z2NjIDxpbmxpbmluZz5mdWxsLiBPdGhlcndpc2UsIHJldHVybnMgYW4gZW1wdHkKKyMgc3RyaW5nLgorIworcnVsZSBzcGxpdC1jb25kaXRpb25hbCAoIHByb3BlcnR5ICkKK3sKKyAgICByZXR1cm4gWyBNQVRDSCAiXiguKyk6KDwuKykiIDogJChwcm9wZXJ0eSkgXSA7Cit9CisKKworcnVsZSB0cmFuc2xhdGUtcGF0aC12YWx1ZSAoIHZhbHVlIDogcGF0aCApCit7CisgICAgbG9jYWwgdCA7CisgICAgZm9yIGxvY2FsIHYgaW4gWyByZWdleC5zcGxpdCAkKHZhbHVlKSAiJiYiIF0KKyAgICB7CisgICAgICAgIHQgKz0gWyBwYXRoLnJvb3QgWyBwYXRoLm1ha2UgJCh2KSBdICQocGF0aCkgXSA7CisgICAgfQorICAgIHJldHVybiAkKHQ6VEo9IiYmIikgOworfQorCitydWxlIHRyYW5zbGF0ZS1kZXBlbmRlbmN5LXZhbHVlICggdmFsdWUgOiBwcm9qZWN0LWlkIDogcHJvamVjdC1sb2NhdGlvbiApCit7CisgICAgbG9jYWwgc3BsaXQtdGFyZ2V0ID0gWyByZWdleC5tYXRjaCBeKC4qKS8vKC4qKSA6ICQodmFsdWUpIF0gOworICAgIGlmICQoc3BsaXQtdGFyZ2V0KQorICAgIHsKKyAgICAgICAgbG9jYWwgcm9vdGVkID0gWyBwYXRoLnJvb3QgWyBwYXRoLm1ha2UgJChzcGxpdC10YXJnZXRbMV0pIF0KKyAgICAgICAgICAgICAgICBbIHBhdGgucm9vdCAkKHByb2plY3QtbG9jYXRpb24pIFsgcGF0aC5wd2QgXSBdIF0gOworICAgICAgICByZXR1cm4gJChyb290ZWQpLy8kKHNwbGl0LXRhcmdldFsyXSkgOworICAgIH0KKyAgICBlbHNlIGlmIFsgcGF0aC5pcy1yb290ZWQgJCh2YWx1ZSkgXQorICAgIHsKKyAgICAgICAgcmV0dXJuICQodmFsdWUpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuICQocHJvamVjdC1pZCkvLyQodmFsdWUpIDsKKyAgICB9Cit9CisKK3J1bGUgdHJhbnNsYXRlLWluZGlyZWN0LXZhbHVlICggcnVsZW5hbWUgOiBjb250ZXh0LW1vZHVsZSApCit7CisgICAgaWYgWyBNQVRDSCAiXihbXiVdKiklKFteJV0rKSQiIDogJChydWxlbmFtZSkgXQorICAgIHsKKyAgICAgICAgIyBSdWxlIGlzIGFscmVhZHkgaW4gdGhlICdpbmRpcmVjdC1ydWxlJyBmb3JtYXQuCisgICAgICAgIHJldHVybiBAJChydWxlbmFtZSkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsb2NhbCB2IDsKKyAgICAgICAgaWYgISBbIE1BVENIICIoWy5dKSIgOiAkKHJ1bGVuYW1lKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgICMgVGhpcyBpcyBhbiB1bnF1YWxpZmllZCBydWxlIG5hbWUuIFRoZSB1c2VyIG1pZ2h0IHdhbnQgdG8KKyAgICAgICAgICAgICMgc2V0IGZsYWdzIG9uIHRoaXMgcnVsZSBuYW1lIGFuZCB0b29sc2V0LmZsYWcKKyAgICAgICAgICAgICMgYXV0by1xdWFsaWZpZXMgaXQuIE5lZWQgdG8gZG8gdGhlIHNhbWUgaGVyZSBzbyBmbGFnCisgICAgICAgICAgICAjIHNldHRpbmcgd29ya3MuIFdlIGNhbiBhcnJhbmdlIGZvciB0b29sc2V0LmZsYWcgdG8gKm5vdCoKKyAgICAgICAgICAgICMgYXV0by1xdWFsaWZ5IHRoZSBhcmd1bWVudCBidXQgdGhlbiB0d28gcnVsZXMgZGVmaW5lZCBpbgorICAgICAgICAgICAgIyB0d28gSmFtZmlsZXMgd291bGQgY29uZmxpY3QuCisgICAgICAgICAgICBydWxlbmFtZSA9ICQoY29udGV4dC1tb2R1bGUpLiQocnVsZW5hbWUpIDsKKyAgICAgICAgfQorICAgICAgICB2ID0gWyBpbmRpcmVjdC5tYWtlICQocnVsZW5hbWUpIDogJChjb250ZXh0LW1vZHVsZSkgXSA7CisgICAgICAgIHJldHVybiBAJCh2KSA7CisgICAgfQorCit9CisKKyMgRXF1aXZhbGVudCB0byBhIGNhbGxpbmcgYWxsIG9mOgorIyAgIHRyYW5zbGF0ZS1wYXRoCisjICAgdHJhbnNsYXRlLWluZGlyZWN0CisjICAgdHJhbnNsYXRlLWRlcGVuZGVuY3kKKyMgICBleHBhbmQtc3ViZmVhdHVyZXMtaW4tY29uZGl0aW9ucworIyAgIG1ha2UKKyMKK3J1bGUgdHJhbnNsYXRlICggcHJvcGVydGllcyAqIDogcHJvamVjdC1pZCA6IHByb2plY3QtbG9jYXRpb24gOiBjb250ZXh0LW1vZHVsZSApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBmb3IgbG9jYWwgcCBpbiAkKHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBsb2NhbCBzcGxpdCA9IFsgc3BsaXQtY29uZGl0aW9uYWwgJChwKSBdIDsKKyAgICAgICAgbG9jYWwgY29uZGl0aW9uIHByb3BlcnR5IDsKKworICAgICAgICBpZiAkKHNwbGl0KQorICAgICAgICB7CisgICAgICAgICAgICBjb25kaXRpb24gPSAkKHNwbGl0WzFdKSA7CisgICAgICAgICAgICBwcm9wZXJ0eSA9ICQoc3BsaXRbMl0pIDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbG9jYWwgZSA7CisgICAgICAgICAgICBmb3IgbG9jYWwgYyBpbiBbIHJlZ2V4LnNwbGl0ICQoY29uZGl0aW9uKSAiLCIgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGUgKz0gWyBmZWF0dXJlLmV4cGFuZC1zdWJmZWF0dXJlcyAkKGMpIDogdHJ1ZSBdIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uZGl0aW9uID0gJChlOko9LCk6IDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3BlcnR5ID0gJChwKSA7CisgICAgICAgIH0KKworICAgICAgICBsb2NhbCBmZWF0dXJlID0gJChwcm9wZXJ0eTpHKSA7CisgICAgICAgIGlmICEgJChmZWF0dXJlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiBbIGZlYXR1cmUuaXMtaW1wbGljaXQtdmFsdWUgJChwcm9wZXJ0eSkgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZlYXR1cmUgPSBbIGZlYXR1cmUuaW1wbGllZC1mZWF0dXJlICQocHJvcGVydHkpIF0gOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAkKGNvbmRpdGlvbjpFPSkkKGZlYXR1cmUpJChwcm9wZXJ0eSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICAgICAgICAgIGVycm9ycy5lcnJvciAiJyQoZSknIGlzIG5vdCBhIHZhbGlkIHByb3BlcnR5IHNwZWNpZmljYXRpb24iIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvY2FsIGF0dHJpYnV0ZXMgPSBbIGZlYXR1cmUuYXR0cmlidXRlcyAkKGZlYXR1cmUpIF0gOworICAgICAgICAgICAgbG9jYWwgdmFsdWUgOworICAgICAgICAgICAgIyBPbmx5IGZyZWUgZmVhdHVyZXMgc2hvdWxkIGJlIHRyYW5zbGF0ZWQKKyAgICAgICAgICAgIGlmIGZyZWUgaW4gJChhdHRyaWJ1dGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIHBhdGggaW4gJChhdHRyaWJ1dGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbIHRyYW5zbGF0ZS1wYXRoLXZhbHVlICQocHJvcGVydHk6Rz0pIDogJChwcm9qZWN0LWxvY2F0aW9uKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoY29uZGl0aW9uOkU9KSQoZmVhdHVyZSkkKHZhbHVlKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgZGVwZW5kZW5jeSBpbiAkKGF0dHJpYnV0ZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFsgdHJhbnNsYXRlLWRlcGVuZGVuY3ktdmFsdWUgJChwcm9wZXJ0eTpHPSkgOiAkKHByb2plY3QtaWQpIDogJChwcm9qZWN0LWxvY2F0aW9uKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoY29uZGl0aW9uOkU9KSQoZmVhdHVyZSkkKHZhbHVlKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsIG0gPSBbIE1BVENIIF5AKC4rKSA6ICQocHJvcGVydHk6Rz0pIF0gOworICAgICAgICAgICAgICAgICAgICBpZiAkKG0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gWyB0cmFuc2xhdGUtaW5kaXJlY3QtdmFsdWUgJChtKSA6ICQoY29udGV4dC1tb2R1bGUpIF0gOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoY29uZGl0aW9uOkU9KSQoZmVhdHVyZSkkKHZhbHVlKSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJChjb25kaXRpb246RT0pJChwcm9wZXJ0eSkgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAkKGNvbmRpdGlvbjpFPSkkKHByb3BlcnR5KSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKyMgSW50ZXJwcmV0IGFsbCBwYXRoIHByb3BlcnRpZXMgaW4gJ3Byb3BlcnRpZXMnIGFzIHJlbGF0aXZlIHRvICdwYXRoJy4gVGhlCisjIHByb3BlcnR5IHZhbHVlcyBhcmUgYXNzdW1lZCB0byBiZSBpbiBzeXN0ZW0tc3BlY2lmaWMgZm9ybSwgYW5kIHdpbGwgYmUKKyMgdHJhbnNsYXRlZCBpbnRvIG5vcm1hbGl6ZWQgZm9ybS4KKyMKK3J1bGUgdHJhbnNsYXRlLXBhdGhzICggcHJvcGVydGllcyAqIDogcGF0aCApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBmb3IgbG9jYWwgcCBpbiAkKHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBsb2NhbCBzcGxpdCA9IFsgc3BsaXQtY29uZGl0aW9uYWwgJChwKSBdIDsKKyAgICAgICAgbG9jYWwgY29uZGl0aW9uID0gIiIgOworICAgICAgICBpZiAkKHNwbGl0KQorICAgICAgICB7CisgICAgICAgICAgICBjb25kaXRpb24gPSAkKHNwbGl0WzFdKTogOworICAgICAgICAgICAgcCA9ICQoc3BsaXRbMl0pIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIHBhdGggaW4gWyBmZWF0dXJlLmF0dHJpYnV0ZXMgJChwOkcpIF0KKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgdmFsdWVzID0gWyByZWdleC5zcGxpdCAkKHA6VEc9KSAiJiYiIF0gOworICAgICAgICAgICAgbG9jYWwgdCA7CisgICAgICAgICAgICBmb3IgbG9jYWwgdiBpbiAkKHZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ICs9IFsgcGF0aC5yb290IFsgcGF0aC5tYWtlICQodikgXSAkKHBhdGgpIF0gOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdCA9ICQodDpKPSImJiIpIDsKKyAgICAgICAgICAgIHJlc3VsdCArPSAkKGNvbmRpdGlvbikkKHQ6VEc9JChwOkcpKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gJChjb25kaXRpb24pJChwKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBBc3N1bWVzIHRoYXQgYWxsIGZlYXR1cmUgdmFsdWVzIHRoYXQgc3RhcnQgd2l0aCAnQCcgYXJlIG5hbWVzIG9mIHJ1bGVzLCB1c2VkCisjIGluICdjb250ZXh0LW1vZHVsZScuIFN1Y2ggcnVsZXMgY2FuIGJlIGVpdGhlciBsb2NhbCB0byB0aGUgbW9kdWxlIG9yIGdsb2JhbC4KKyMgQ29udmVydHMgc3VjaCB2YWx1ZXMgaW50byAnaW5kaXJlY3QtcnVsZScgZm9ybWF0IChzZWUgaW5kaXJlY3QuamFtKSwgc28gdGhleQorIyBjYW4gYmUgY2FsbGVkIGZyb20gb3RoZXIgbW9kdWxlcy4gRG9lcyBub3RoaW5nIGZvciBzdWNoIHZhbHVlcyB0aGF0IGFyZQorIyBhbHJlYWR5IGluIHRoZSAnaW5kaXJlY3QtcnVsZScgZm9ybWF0LgorIworcnVsZSB0cmFuc2xhdGUtaW5kaXJlY3QgKCBzcGVjaWZpY2F0aW9uICogOiBjb250ZXh0LW1vZHVsZSApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBmb3IgbG9jYWwgcCBpbiAkKHNwZWNpZmljYXRpb24pCisgICAgeworICAgICAgICBsb2NhbCBtID0gWyBNQVRDSCBeQCguKykgOiAkKHA6Rz0pIF0gOworICAgICAgICBpZiAkKG0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHYgOworICAgICAgICAgICAgaWYgWyBNQVRDSCAiXihbXiVdKiklKFteJV0rKSQiIDogJChtKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBSdWxlIGlzIGFscmVhZHkgaW4gdGhlICdpbmRpcmVjdC1ydWxlJyBmb3JtYXQuCisgICAgICAgICAgICAgICAgdiA9ICQobSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICEgWyBNQVRDSCAiKFsuXSkiIDogJChtKSBdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYW4gdW5xdWFsaWZpZWQgcnVsZSBuYW1lLiBUaGUgdXNlciBtaWdodCB3YW50IHRvCisgICAgICAgICAgICAgICAgICAgICMgc2V0IGZsYWdzIG9uIHRoaXMgcnVsZSBuYW1lIGFuZCB0b29sc2V0LmZsYWcKKyAgICAgICAgICAgICAgICAgICAgIyBhdXRvLXF1YWxpZmllcyBpdC4gTmVlZCB0byBkbyB0aGUgc2FtZSBoZXJlIHNvIGZsYWcKKyAgICAgICAgICAgICAgICAgICAgIyBzZXR0aW5nIHdvcmtzLiBXZSBjYW4gYXJyYW5nZSBmb3IgdG9vbHNldC5mbGFnIHRvICpub3QqCisgICAgICAgICAgICAgICAgICAgICMgYXV0by1xdWFsaWZ5IHRoZSBhcmd1bWVudCBidXQgdGhlbiB0d28gcnVsZXMgZGVmaW5lZCBpbgorICAgICAgICAgICAgICAgICAgICAjIHR3byBKYW1maWxlcyB3b3VsZCBjb25mbGljdC4KKyAgICAgICAgICAgICAgICAgICAgbSA9ICQoY29udGV4dC1tb2R1bGUpLiQobSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2ID0gWyBpbmRpcmVjdC5tYWtlICQobSkgOiAkKGNvbnRleHQtbW9kdWxlKSBdIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdiA9IEAkKHYpIDsKKyAgICAgICAgICAgIHJlc3VsdCArPSAkKHY6Rz0kKHA6RykpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAkKHApIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIEJpbmRzIGFsbCBkZXBlbmRlbmN5IHByb3BlcnRpZXMgaW4gYSBsaXN0IHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBwcm9qZWN0LgorIyBUYXJnZXRzIHdpdGggYWJzb2x1dGUgcGF0aHMgd2lsbCBiZSBsZWZ0IHVuY2hhbmdlZCBhbmQgdGFyZ2V0cyB3aGljaCBoYXZlIGEKKyMgcHJvamVjdCBzcGVjaWZpZWQgd2lsbCBoYXZlIHRoZSBwYXRoIHRvIHRoZSBwcm9qZWN0IGludGVycHJldGVkIHJlbGF0aXZlIHRvCisjIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisjCitydWxlIHRyYW5zbGF0ZS1kZXBlbmRlbmNpZXMgKCBzcGVjaWZpY2F0aW9uICogOiBwcm9qZWN0LWlkIDogbG9jYXRpb24gKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgZm9yIGxvY2FsIHAgaW4gJChzcGVjaWZpY2F0aW9uKQorICAgIHsKKyAgICAgICAgbG9jYWwgc3BsaXQgPSBbIHNwbGl0LWNvbmRpdGlvbmFsICQocCkgXSA7CisgICAgICAgIGxvY2FsIGNvbmRpdGlvbiA9ICIiIDsKKyAgICAgICAgaWYgJChzcGxpdCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uZGl0aW9uID0gJChzcGxpdFsxXSk6IDsKKyAgICAgICAgICAgIHAgPSAkKHNwbGl0WzJdKSA7CisgICAgICAgIH0KKyAgICAgICAgaWYgZGVwZW5kZW5jeSBpbiBbIGZlYXR1cmUuYXR0cmlidXRlcyAkKHA6RykgXQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBzcGxpdC10YXJnZXQgPSBbIHJlZ2V4Lm1hdGNoIF4oLiopLy8oLiopIDogJChwOkc9KSBdIDsKKyAgICAgICAgICAgIGlmICQoc3BsaXQtdGFyZ2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsIHJvb3RlZCA9IFsgcGF0aC5yb290IFsgcGF0aC5tYWtlICQoc3BsaXQtdGFyZ2V0WzFdKSBdCisgICAgICAgICAgICAgICAgICAgICBbIHBhdGgucm9vdCAkKGxvY2F0aW9uKSBbIHBhdGgucHdkIF0gXSBdIDsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gJChjb25kaXRpb24pJChwOkcpJChyb290ZWQpLy8kKHNwbGl0LXRhcmdldFsyXSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiBbIHBhdGguaXMtcm9vdGVkICQocDpHPSkgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAkKGNvbmRpdGlvbikkKHApIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gJChjb25kaXRpb24pJChwOkcpJChwcm9qZWN0LWlkKS8vJChwOkc9KSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gJChjb25kaXRpb24pJChwKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBDbGFzcyBtYWludGFpbmluZyBhIHByb3BlcnR5IHNldCAtPiBzdHJpbmcgbWFwcGluZy4KKyMKK2NsYXNzIHByb3BlcnR5LW1hcAoreworICAgIGltcG9ydCBudW1iZXJzIDsKKyAgICBpbXBvcnQgc2VxdWVuY2UgOworCisgICAgcnVsZSBfX2luaXRfXyAoICkKKyAgICB7CisgICAgICAgIHNlbGYubmV4dC1mbGFnID0gMSA7CisgICAgfQorCisgICAgIyBBc3NvY2lhdGUgJ3ZhbHVlJyB3aXRoICdwcm9wZXJ0aWVzJy4KKyAgICAjCisgICAgcnVsZSBpbnNlcnQgKCBwcm9wZXJ0aWVzICogOiB2YWx1ZSApCisgICAgeworICAgICAgICBzZWxmLmFsbC1mbGFncyArPSBzZWxmLiQoc2VsZi5uZXh0LWZsYWcpIDsKKyAgICAgICAgc2VsZi4kKHNlbGYubmV4dC1mbGFnKSA9ICQodmFsdWUpICQocHJvcGVydGllcykgOworCisgICAgICAgIHNlbGYubmV4dC1mbGFnID0gWyBudW1iZXJzLmluY3JlbWVudCAkKHNlbGYubmV4dC1mbGFnKSBdIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAncHJvcGVydGllcycgb3IgYW55IHN1YnNldCBvZiBpdC4gSWYKKyAgICAjIG1vcmUgdGhhbiBvbmUgc3Vic2V0IGhhcyBhIHZhbHVlIGFzc2lnbmVkIHRvIGl0LCByZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlCisgICAgIyBsb25nZXN0IHN1YnNldCwgaWYgaXQgaXMgdW5pcXVlLgorICAgICMKKyAgICBydWxlIGZpbmQgKCBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgIyBGaXJzdCBmaW5kIGFsbCBtYXRjaGVzLgorICAgICAgICBsb2NhbCBtYXRjaGVzIDsKKyAgICAgICAgbG9jYWwgbWF0Y2gtcmFua3MgOworICAgICAgICBmb3IgbG9jYWwgaSBpbiAkKHNlbGYuYWxsLWZsYWdzKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBsaXN0ID0gJCgkKGkpKSA7CisgICAgICAgICAgICBpZiBbICQocHJvcGVydHktc2V0KS5jb250YWlucy1yYXcgJChsaXN0WzItXSkgXSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVzICs9ICQobGlzdFsxXSkgOworICAgICAgICAgICAgICAgIG1hdGNoLXJhbmtzICs9IFsgc2VxdWVuY2UubGVuZ3RoICQobGlzdCkgXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9jYWwgYmVzdCA9IFsgc2VxdWVuY2Uuc2VsZWN0LWhpZ2hlc3QtcmFua2VkICQobWF0Y2hlcykKKyAgICAgICAgICAgIDogJChtYXRjaC1yYW5rcykgXSA7CisgICAgICAgIGlmICQoYmVzdFsyXSkKKyAgICAgICAgeworICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA6IGVycm9yIDogZXJyb3JzLmVycm9yIDsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciAiQW1iaWd1b3VzIGtleSAkKHByb3BlcnRpZXM6Sj0gOkU9KSIgOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKGJlc3QpIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAncHJvcGVydGllcycuIElmICd2YWx1ZScgcGFyYW1ldGVyIGlzCisgICAgIyBnaXZlbiwgcmVwbGFjZXMgdGhlIGZvdW5kIHZhbHVlLgorICAgICMKKyAgICBydWxlIGZpbmQtcmVwbGFjZSAoIHByb3BlcnRpZXMgKiA6IHZhbHVlID8gKQorICAgIHsKKyAgICAgICAgIyBGaXJzdCBmaW5kIGFsbCBtYXRjaGVzLgorICAgICAgICBsb2NhbCBtYXRjaGVzIDsKKyAgICAgICAgbG9jYWwgbWF0Y2gtcmFua3MgOworICAgICAgICBmb3IgbG9jYWwgaSBpbiAkKHNlbGYuYWxsLWZsYWdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKCQoaSlbMi1dKSBpbiAkKHByb3BlcnRpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF0Y2hlcyArPSAkKGkpIDsKKyAgICAgICAgICAgICAgICBtYXRjaC1yYW5rcyArPSBbIHNlcXVlbmNlLmxlbmd0aCAkKCQoaSkpIF0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvY2FsIGJlc3QgPSBbIHNlcXVlbmNlLnNlbGVjdC1oaWdoZXN0LXJhbmtlZCAkKG1hdGNoZXMpCisgICAgICAgICAgICA6ICQobWF0Y2gtcmFua3MpIF0gOworICAgICAgICBpZiAkKGJlc3RbMl0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOiBlcnJvciA6IGVycm9ycy5lcnJvciA7CisgICAgICAgICAgICBlcnJvcnMuZXJyb3IgIkFtYmlndW91cyBrZXkgJChwcm9wZXJ0aWVzOko9IDpFPSkiIDsKKyAgICAgICAgfQorICAgICAgICBsb2NhbCBvcmlnaW5hbCA9ICQoJChiZXN0KVsxXSkgOworICAgICAgICBpZiAkKHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICAkKGJlc3QpID0gJCh2YWx1ZSkgJCgkKGJlc3QpWzItXSkgOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKG9yaWdpbmFsKSA7CisgICAgfQorfQorCisKK3J1bGUgX190ZXN0X18gKCApCit7CisgICAgaW1wb3J0IGFzc2VydCA7CisgICAgaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworICAgIGltcG9ydCBlcnJvcnMgOiB0cnkgY2F0Y2ggOworICAgIGltcG9ydCBmZWF0dXJlIDsKKworICAgICMgTG9jYWwgcnVsZXMgbXVzdCBiZSBleHBsaWNpdGx5IHJlLWltcG9ydGVkLgorICAgIGltcG9ydCBwcm9wZXJ0eSA6IHBhdGgtb3JkZXIgYWJicmV2aWF0ZS1kYXNoZWQgOworCisgICAgZmVhdHVyZS5wcmVwYXJlLXRlc3QgcHJvcGVydHktdGVzdC10ZW1wIDsKKworICAgIGZlYXR1cmUuZmVhdHVyZSB0b29sc2V0IDogZ2NjIDogaW1wbGljaXQgc3ltbWV0cmljIDsKKyAgICBmZWF0dXJlLnN1YmZlYXR1cmUgdG9vbHNldCBnY2MgOiB2ZXJzaW9uIDogMi45NS4yIDIuOTUuMyAyLjk1LjQgMy4wIDMuMC4xCisgICAgICAgIDMuMC4yIDogb3B0aW9uYWwgOworICAgIGZlYXR1cmUuZmVhdHVyZSBkZWZpbmUgOiA6IGZyZWUgOworICAgIGZlYXR1cmUuZmVhdHVyZSBydW50aW1lLWxpbmsgOiBkeW5hbWljIHN0YXRpYyA6IHN5bW1ldHJpYyBsaW5rLWluY29tcGF0aWJsZSA7CisgICAgZmVhdHVyZS5mZWF0dXJlIG9wdGltaXphdGlvbiA6IG9uIG9mZiA7CisgICAgZmVhdHVyZS5mZWF0dXJlIHZhcmlhbnQgOiBkZWJ1ZyByZWxlYXNlIDogaW1wbGljaXQgY29tcG9zaXRlIHN5bW1ldHJpYyA7CisgICAgZmVhdHVyZS5mZWF0dXJlIHJ0dGkgOiBvbiBvZmYgOiBsaW5rLWluY29tcGF0aWJsZSA7CisKKyAgICBmZWF0dXJlLmNvbXBvc2UgPHZhcmlhbnQ+ZGVidWcgOiA8ZGVmaW5lPl9ERUJVRyA8b3B0aW1pemF0aW9uPm9mZiA7CisgICAgZmVhdHVyZS5jb21wb3NlIDx2YXJpYW50PnJlbGVhc2UgOiA8ZGVmaW5lPk5ERUJVRyA8b3B0aW1pemF0aW9uPm9uIDsKKworICAgIHZhbGlkYXRlIDx0b29sc2V0PmdjYyA8dG9vbHNldD5nY2MtMy4wLjEgOiAkKHRlc3Qtc3BhY2UpIDsKKworICAgIGFzc2VydC50cnVlICBwYXRoLW9yZGVyICQodGVzdC1zcGFjZSkgZGVidWcgPGRlZmluZT5mb28gOworICAgIGFzc2VydC5mYWxzZSBwYXRoLW9yZGVyICQodGVzdC1zcGFjZSkgPGRlZmluZT5mb28gZGVidWcgOworICAgIGFzc2VydC50cnVlICBwYXRoLW9yZGVyICQodGVzdC1zcGFjZSkgZ2NjIGRlYnVnIDsKKyAgICBhc3NlcnQuZmFsc2UgcGF0aC1vcmRlciAkKHRlc3Qtc3BhY2UpIGRlYnVnIGdjYyA7CisgICAgYXNzZXJ0LnRydWUgIHBhdGgtb3JkZXIgJCh0ZXN0LXNwYWNlKSA8b3B0aW1pemF0aW9uPm9uIDxydHRpPm9uIDsKKyAgICBhc3NlcnQuZmFsc2UgcGF0aC1vcmRlciAkKHRlc3Qtc3BhY2UpIDxydHRpPm9uIDxvcHRpbWl6YXRpb24+b24gOworCisgICAgYXNzZXJ0LnJlc3VsdC1zZXQtZXF1YWwgPHRvb2xzZXQ+Z2NjIDxydHRpPm9mZiA8ZGVmaW5lPkZPTworICAgICAgICA6IHJlZmluZSA8dG9vbHNldD5nY2MgPHJ0dGk+b2ZmCisgICAgICAgIDogPGRlZmluZT5GT08KKyAgICAgICAgOiAkKHRlc3Qtc3BhY2UpIDsKKworICAgIGFzc2VydC5yZXN1bHQtc2V0LWVxdWFsIDx0b29sc2V0PmdjYyA8b3B0aW1pemF0aW9uPm9uCisgICAgICAgIDogcmVmaW5lIDx0b29sc2V0PmdjYyA8b3B0aW1pemF0aW9uPm9mZgorICAgICAgICA6IDxvcHRpbWl6YXRpb24+b24KKyAgICAgICAgOiAkKHRlc3Qtc3BhY2UpIDsKKworICAgIGFzc2VydC5yZXN1bHQtc2V0LWVxdWFsIDx0b29sc2V0PmdjYyA8cnR0aT5vZmYKKyAgICAgICAgOiByZWZpbmUgPHRvb2xzZXQ+Z2NjIDogPHJ0dGk+b2ZmIDogJCh0ZXN0LXNwYWNlKSA7CisKKyAgICBhc3NlcnQucmVzdWx0LXNldC1lcXVhbCA8dG9vbHNldD5nY2MgPHJ0dGk+b2ZmIDxydHRpPm9mZjo8ZGVmaW5lPkZPTworICAgICAgICA6IHJlZmluZSA8dG9vbHNldD5nY2MgOiA8cnR0aT5vZmYgPHJ0dGk+b2ZmOjxkZWZpbmU+Rk9PCisgICAgICAgIDogJCh0ZXN0LXNwYWNlKSA7CisKKyAgICBhc3NlcnQucmVzdWx0LXNldC1lcXVhbCA8dG9vbHNldD5nY2M6PGRlZmluZT5mb28gPHRvb2xzZXQ+Z2NjOjxkZWZpbmU+YmFyCisgICAgICAgIDogcmVmaW5lIDx0b29sc2V0PmdjYzo8ZGVmaW5lPmZvbyA6IDx0b29sc2V0PmdjYzo8ZGVmaW5lPmJhcgorICAgICAgICA6ICQodGVzdC1zcGFjZSkgOworCisgICAgYXNzZXJ0LnJlc3VsdCA8ZGVmaW5lPk1ZX1JFTEVBU0UKKyAgICAgICAgOiBldmFsdWF0ZS1jb25kaXRpb25hbHMtaW4tY29udGV4dAorICAgICAgICAgIDx2YXJpYW50PnJlbGVhc2UsPHJ0dGk+b2ZmOjxkZWZpbmU+TVlfUkVMRUFTRQorICAgICAgICA6IDx0b29sc2V0PmdjYyA8dmFyaWFudD5yZWxlYXNlIDxydHRpPm9mZiA7CisKKyAgICBhc3NlcnQucmVzdWx0IGRlYnVnCisgICAgICAgIDogYXMtcGF0aCA8b3B0aW1pemF0aW9uPm9mZiA8dmFyaWFudD5kZWJ1ZworICAgICAgICA6ICQodGVzdC1zcGFjZSkgOworCisgICAgYXNzZXJ0LnJlc3VsdCBnY2MvZGVidWcvcnR0aS1vZmYKKyAgICAgICAgOiBhcy1wYXRoIDx0b29sc2V0PmdjYyA8b3B0aW1pemF0aW9uPm9mZiA8cnR0aT5vZmYgPHZhcmlhbnQ+ZGVidWcKKyAgICAgICAgOiAkKHRlc3Qtc3BhY2UpIDsKKworICAgIGFzc2VydC5yZXN1bHQgb3B0bXotb2ZmIDogYWJicmV2aWF0ZS1kYXNoZWQgb3B0aW1pemF0aW9uLW9mZiA7CisgICAgYXNzZXJ0LnJlc3VsdCBybnRtLWxuay1zdHRjIDogYWJicmV2aWF0ZS1kYXNoZWQgcnVudGltZS1saW5rLXN0YXRpYyA7CisKKyAgICB0cnkgOworICAgICAgICB2YWxpZGF0ZSA8ZmVhdHVyZT52YWx1ZSA6ICQodGVzdC1zcGFjZSkgOworICAgIGNhdGNoICJJbnZhbGlkIHByb3BlcnR5ICc8ZmVhdHVyZT52YWx1ZSc6IHVua25vd24gZmVhdHVyZSAnZmVhdHVyZScuIiA7CisKKyAgICB0cnkgOworICAgICAgICB2YWxpZGF0ZSA8cnR0aT5kZWZhdWx0IDogJCh0ZXN0LXNwYWNlKSA7CisgICAgY2F0Y2ggXCJkZWZhdWx0XCIgaXMgbm90IGEga25vd24gdmFsdWUgb2YgZmVhdHVyZSA8cnR0aT4gOworCisgICAgdmFsaWRhdGUgPGRlZmluZT5XSEFURVZFUiA6ICQodGVzdC1zcGFjZSkgOworCisgICAgdHJ5IDsKKyAgICAgICAgdmFsaWRhdGUgPHJ0dGk+IDogJCh0ZXN0LXNwYWNlKSA7CisgICAgY2F0Y2ggIkludmFsaWQgcHJvcGVydHkgJzxydHRpPic6IE5vIHZhbHVlIHNwZWNpZmllZCBmb3IgZmVhdHVyZSAncnR0aScuIiA7CisKKyAgICB0cnkgOworICAgICAgICB2YWxpZGF0ZSB2YWx1ZSA6ICQodGVzdC1zcGFjZSkgOworICAgIGNhdGNoIFwidmFsdWVcIiBpcyBub3QgYW4gaW1wbGljaXQgZmVhdHVyZSB2YWx1ZSA7CisKKyAgICBhc3NlcnQucmVzdWx0LXNldC1lcXVhbCA8cnR0aT5vbgorICAgICAgICA6IHJlbW92ZSBmcmVlIGltcGxpY2l0IDogPHRvb2xzZXQ+Z2NjIDxkZWZpbmU+Zm9vIDxydHRpPm9uIDogJCh0ZXN0LXNwYWNlKSA7CisKKyAgICBhc3NlcnQucmVzdWx0LXNldC1lcXVhbCA8aW5jbHVkZT5hCisgICAgICAgIDogc2VsZWN0IGluY2x1ZGUgOiA8aW5jbHVkZT5hIDx0b29sc2V0PmdjYyA7CisKKyAgICBhc3NlcnQucmVzdWx0LXNldC1lcXVhbCA8aW5jbHVkZT5hCisgICAgICAgIDogc2VsZWN0IGluY2x1ZGUgYmFyIDogPGluY2x1ZGU+YSA8dG9vbHNldD5nY2MgOworCisgICAgYXNzZXJ0LnJlc3VsdC1zZXQtZXF1YWwgPGluY2x1ZGU+YSA8dG9vbHNldD5nY2MKKyAgICAgICAgOiBzZWxlY3QgaW5jbHVkZSA8YmFyPiA8dG9vbHNldD4gOiA8aW5jbHVkZT5hIDx0b29sc2V0PmdjYyA7CisKKyAgICBhc3NlcnQucmVzdWx0LXNldC1lcXVhbCA8dG9vbHNldD5reWxpeCA8aW5jbHVkZT5hCisgICAgICAgIDogY2hhbmdlIDx0b29sc2V0PmdjYyA8aW5jbHVkZT5hIDogPHRvb2xzZXQ+IGt5bGl4IDsKKworICAgIHBtID0gWyBuZXcgcHJvcGVydHktbWFwIF0gOworICAgICQocG0pLmluc2VydCA8dG9vbHNldD5nY2MgOiBvIDsKKyAgICAkKHBtKS5pbnNlcnQgPHRvb2xzZXQ+Z2NjIDxvcz5OVCA6IG9iaiA7CisgICAgJChwbSkuaW5zZXJ0IDx0b29sc2V0PmdjYyA8b3M+Q1lHV0lOIDogb2JqIDsKKworICAgIGFzc2VydC5lcXVhbCBvIDogWyAkKHBtKS5maW5kLXJlcGxhY2UgPHRvb2xzZXQ+Z2NjIF0gOworCisgICAgYXNzZXJ0LmVxdWFsIG9iaiA6IFsgJChwbSkuZmluZC1yZXBsYWNlIDx0b29sc2V0PmdjYyA8b3M+TlQgXSA7CisKKyAgICB0cnkgOworICAgICAgICAkKHBtKS5maW5kLXJlcGxhY2UgPHRvb2xzZXQ+Z2NjIDxvcz5OVCA8b3M+Q1lHV0lOIDsKKyAgICBjYXRjaCAiQW1iaWd1b3VzIGtleSA8dG9vbHNldD5nY2MgPG9zPk5UIDxvcz5DWUdXSU4iIDsKKworICAgICMgVGVzdCBvcmRpbmFyeSBwcm9wZXJ0aWVzLgorICAgIGFzc2VydC5yZXN1bHQgOiBzcGxpdC1jb25kaXRpb25hbCA8dG9vbHNldD5nY2MgOworCisgICAgIyBUZXN0IHByb3BlcnRpZXMgd2l0aCAiOiIuCisgICAgYXNzZXJ0LnJlc3VsdCA6IHNwbGl0LWNvbmRpdGlvbmFsIDxkZWZpbmU+Rk9PPUE6OkIgOworCisgICAgIyBUZXN0IGNvbmRpdGlvbmFsIGZlYXR1cmUuCisgICAgYXNzZXJ0LnJlc3VsdC1zZXQtZXF1YWwgPHRvb2xzZXQ+Z2NjLDx0b29sc2V0LWdjYzp2ZXJzaW9uPjMuMCA8ZGVmaW5lPkZPTworICAgICAgICA6IHNwbGl0LWNvbmRpdGlvbmFsIDx0b29sc2V0PmdjYyw8dG9vbHNldC1nY2M6dmVyc2lvbj4zLjA6PGRlZmluZT5GT08gOworCisgICAgZmVhdHVyZS5maW5pc2gtdGVzdCBwcm9wZXJ0eS10ZXN0LXRlbXAgOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9yZWFkbWUudHh0IGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTA1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL3JlYWRtZS50eHQKQEAgLTAsMCArMSwxMSBAQAorQ29weXJpZ2h0IDIwMDEsIDIwMDIgRGF2ZSBBYnJhaGFtcworQ29weXJpZ2h0IDIwMDIgVmxhZGltaXIgUHJ1cworRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAoraHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitEZXZlbG9wbWVudCBjb2RlIGZvciBuZXcgYnVpbGQgc3lzdGVtLiBUbyBydW4gdW5pdCB0ZXN0cyBmb3IgamFtIGNvZGUsIGV4ZWN1dGU6CisKKyAgYmphbSAtLWRlYnVnIC0tYnVpbGQtc3lzdGVtPXRlc3QKKworQ29tcHJlaGVuc2l2ZSB0ZXN0cyByZXF1aXJlIFB5dGhvbi4gU2VlIC4uL3Rlc3QvcmVhZG1lLnR4dApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC9zY2FubmVyLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvc2Nhbm5lci5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ1NTA3MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvc2Nhbm5lci5qYW0KQEAgLTAsMCArMSwxNjMgQEAKKyMgQ29weXJpZ2h0IDIwMDMgRGF2ZSBBYnJhaGFtcworIyBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBWbGFkaW1pciBQcnVzCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgSW1wbGVtZW50cyBzY2FubmVyczogb2JqZWN0cyBjb21wdXRpbmcgaW1wbGljaXQgZGVwZW5kZW5jaWVzIGZvciBmaWxlcywgc3VjaAorIyBhcyBpbmNsdWRlcyBpbiBDKysuCisjCisjIEEgc2Nhbm5lciBoYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBmaW5kIHRoZSBkZXBlbmRlbmNpZXMsIHNvbWUgZGF0YQorIyBuZWVkZWQgdG8gaW50ZXJwcmV0IHRob3NlIGRlcGVuZGVuY2llcyAoZS5nLiwgaW5jbHVkZSBwYXRocyksIGFuZCBjb2RlIHdoaWNoCisjIGVzdGFibGlzaGluZyBuZWVkZWQgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGFjdHVhbCBqYW0gdGFyZ2V0cy4KKyMKKyMgU2Nhbm5lciBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGFjdGlvbnMgd2hlbiB0aGV5IHRyeSB0byBhY3R1YWxpemUgdmlydHVhbAorIyB0YXJnZXRzLCBwYXNzZWQgdG8gdGhlIHZpcnR1YWwtdGFyZ2V0LmFjdHVhbGl6ZSgpIG1ldGhvZCBhbmQgYXJlIHRoZW4KKyMgYXNzb2NpYXRlZCB3aXRoIGFjdHVhbCB0YXJnZXRzLiBJdCBpcyBwb3NzaWJsZSB0byB1c2Ugc2V2ZXJhbCBzY2FubmVycyBmb3IgYQorIyBzaW5nbGUgdmlydHVhbC10YXJnZXQuIEZvciBleGFtcGxlLCBhIHNpbmdsZSBzb3VyY2UgZmlsZSBtaWdodCBiZSBjb21waWxlZAorIyB0d2ljZSAtIGVhY2ggdGltZSB1c2luZyBhIGRpZmZlcmVudCBpbmNsdWRlIHBhdGguIEluIHRoaXMgY2FzZSwgdHdvIHNlcGFyYXRlCisjIGFjdHVhbCB0YXJnZXRzIHdpbGwgYmUgY3JlYXRlZCwgZWFjaCBoYXZpbmcgYSBzY2FubmVyIG9mIGl0cyBvd24uCisjCisjIFR5cGljYWxseSwgc2Nhbm5lcnMgYXJlIGNyZWF0ZWQgZnJvbSB0YXJnZXQgdHlwZSBhbmQgdGhlIGFjdGlvbidzIHByb3BlcnRpZXMsCisjIHVzaW5nIHRoZSBydWxlICdnZXQnIGluIHRoaXMgbW9kdWxlLiBEaXJlY3RseSBjcmVhdGluZyBzY2FubmVycyBpcyBub3QKKyMgcmVjb21tZW5kZWQsIGFzIGl0IG1pZ2h0IGNyZWF0ZSBtdWx0aXBsZSBlcXV2aXZhbGVudCBidXQgZGlmZmVyZW50IGluc3RhbmNlcywKKyMgYW5kIGxlYWQgdG8gdW5uZWNlc3NhcnkgYWN0dWFsIHRhcmdldCBkdXBsaWNhdGlvbi4gSG93ZXZlciwgYWN0aW9ucyBjYW4gYWxzbworIyBjcmVhdGUgc2Nhbm5lcnMgaW4gYSBzcGVjaWFsIHdheSwgaW5zdGVhZCBvZiByZWx5aW5nIG9uIGp1c3QgdGhlIHRhcmdldCB0eXBlLgorCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IHByb3BlcnR5LXNldCA7CitpbXBvcnQgdmlydHVhbC10YXJnZXQgOworCisjIEJhc2Ugc2Nhbm5lciBjbGFzcy4KKyMKK2NsYXNzIHNjYW5uZXIKK3sKKyAgICBydWxlIF9faW5pdF9fICggKQorICAgIHsKKyAgICB9CisKKyAgICAjIFJldHVybnMgYSBwYXR0ZXJuIHRvIHVzZSBmb3Igc2Nhbm5pbmcuCisgICAgIworICAgIHJ1bGUgcGF0dGVybiAoICkKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOiBlcnJvciA6IGVycm9ycy5lcnJvciA7CisgICAgICAgIGVycm9ycy5lcnJvciAibWV0aG9kIG11c3QgYmUgb3ZlcnJpZGVuIiA7CisgICAgfQorCisgICAgIyBFc3RhYmxpc2ggbmVjZXNzYXJ5IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRhcmdldHMsIGdpdmVuIGFuIGFjdHVhbCB0YXJnZXQKKyAgICAjIGJlZWluZyBzY2FubmVkIGFuZCBhIGxpc3Qgb2YgcGF0dGVybiBtYXRjaGVzIGluIHRoYXQgZmlsZS4KKyAgICAjCisgICAgcnVsZSBwcm9jZXNzICggdGFyZ2V0IDogbWF0Y2hlcyAqICkKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOiBlcnJvciA6IGVycm9ycy5lcnJvciA7CisgICAgICAgIGVycm9ycy5lcnJvciAibWV0aG9kIG11c3QgYmUgb3ZlcnJpZGVuIiA7CisgICAgfQorfQorCisKKyMgUmVnaXN0ZXJzIGEgbmV3IGdlbmVyYXRvciBjbGFzcywgc3BlY2lmeWluZyBhIHNldCBvZiBwcm9wZXJ0aWVzIHJlbGV2YW50IHRvCisjIHRoaXMgc2Nhbm5lci4gQ29uc3RydWN0b3IgZm9yIHRoYXQgY2xhc3Mgc2hvdWxkIGhhdmUgb25lIHBhcmFtZXRlcjogYSBsaXN0IG9mCisjIHByb3BlcnRpZXMuCisjCitydWxlIHJlZ2lzdGVyICggc2Nhbm5lci1jbGFzcyA6IHJlbGV2YW50LXByb3BlcnRpZXMgKiApCit7CisgICAgLnJlZ2lzdGVyZWQgKz0gJChzY2FubmVyLWNsYXNzKSA7CisgICAgLnJlbGV2YW50LXByb3BlcnRpZXMuJChzY2FubmVyLWNsYXNzKSA9ICQocmVsZXZhbnQtcHJvcGVydGllcykgOworfQorCisKKyMgQ29tbW9uIHNjYW5uZXIgY2xhc3MsIHVzYWJsZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGtpbmQgb2YgaW5jbHVkZXMgKHVubGlrZQorIyBDLCB3aGVyZSAiIiBhbmQgPD4gaW5jbHVkZXMgaGF2ZSBkaWZmZXJlbnQgc2VhcmNoIHBhdGhzKS4KKyMKK2NsYXNzIGNvbW1vbi1zY2FubmVyIDogc2Nhbm5lcgoreworICAgIGltcG9ydCBzY2FubmVyIDsKKworICAgIHJ1bGUgX19pbml0X18gKCBpbmNsdWRlcyAqICkKKyAgICB7CisgICAgICAgIHNjYW5uZXIuX19pbml0X18gOworICAgICAgICBzZWxmLmluY2x1ZGVzID0gJChpbmNsdWRlcykgOworICAgIH0KKworICAgIHJ1bGUgcHJvY2VzcyAoIHRhcmdldCA6IG1hdGNoZXMgKiA6IGJpbmRpbmcgKQorICAgIHsKKyAgICAgICAgbG9jYWwgdGFyZ2V0X3BhdGggPSBbIE5PUk1BTElaRV9QQVRIICQoYmluZGluZzpEKSBdIDsKKworICAgICAgICBOT0NBUkUgJChtYXRjaGVzKSA7CisgICAgICAgIElOQ0xVREVTICQodGFyZ2V0KSA6ICQobWF0Y2hlcykgOworICAgICAgICBTRUFSQ0ggb24gJChtYXRjaGVzKSA9ICQodGFyZ2V0X3BhdGgpICQoc2VsZi5pbmNsdWRlczpHPSkgOworICAgICAgICBJU0ZJTEUgJChtYXRjaGVzKSA7CisKKyAgICAgICAgc2Nhbm5lci5wcm9wYWdhdGUgJChfX25hbWVfXykgOiAkKG1hdGNoZXMpIDogJCh0YXJnZXQpIDsKKyAgICB9Cit9CisKKworIyBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHNjYW5uZXIsIHdpdGggdGhlIHNwZWNpZmllZAorIyBwcm9wZXJ0aWVzLgorIworcnVsZSBnZXQgKCBzY2FubmVyLWNsYXNzIDogcHJvcGVydHktc2V0ICkKK3sKKyAgICBpZiAhICQoc2Nhbm5lci1jbGFzcykgaW4gJCgucmVnaXN0ZXJlZCkKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgImF0dGVtcHQgdG8gZ2V0IGFuIHVucmVnaXN0ZWQgc2Nhbm5lciIgOworICAgIH0KKworICAgIGxvY2FsIHIgPSAkKC5ydi1jYWNoZS4kKHByb3BlcnR5LXNldCkpIDsKKyAgICBpZiAhICQocikKKyAgICB7CisgICAgICAgIHIgPSBbIHByb3BlcnR5LXNldC5jcmVhdGUKKyAgICAgICAgICAgIFsgcHJvcGVydHkuc2VsZWN0ICQoLnJlbGV2YW50LXByb3BlcnRpZXMuJChzY2FubmVyLWNsYXNzKSkgOgorICAgICAgICAgICAgICBbICQocHJvcGVydHktc2V0KS5yYXcgXSBdIF0gOworICAgICAgICAucnYtY2FjaGUuJChwcm9wZXJ0eS1zZXQpID0gJChyKSA7CisgICAgfQorCisgICAgaWYgISAkKHNjYW5uZXIuJChzY2FubmVyLWNsYXNzKS4kKHI6Sj0tKSkKKyAgICB7CisgICAgICAgIGxvY2FsIHMgPSBbIG5ldyAkKHNjYW5uZXItY2xhc3MpIFsgJChyKS5yYXcgXSBdIDsKKyAgICAgICAgc2Nhbm5lci4kKHNjYW5uZXItY2xhc3MpLiQocjpKPS0pID0gJChzKSA7CisgICAgfQorICAgIHJldHVybiAkKHNjYW5uZXIuJChzY2FubmVyLWNsYXNzKS4kKHI6Sj0tKSkgOworfQorCisKKyMgSW5zdGFsbHMgdGhlIHNwZWNpZmllZCBzY2FubmVyIG9uIHRoZSBhY3R1YWwgdGFyZ2V0ICd0YXJnZXQnLgorIworcnVsZSBpbnN0YWxsICggc2Nhbm5lciA6IHRhcmdldCApCit7CisgICAgSERSU0NBTiBvbiAkKHRhcmdldCkgPSBbICQoc2Nhbm5lcikucGF0dGVybiBdIDsKKyAgICBTQ0FOTkVSIG9uICQodGFyZ2V0KSA9ICQoc2Nhbm5lcikgOworICAgIEhEUlJVTEUgb24gJCh0YXJnZXQpID0gc2Nhbm5lci5oZHJydWxlIDsKKworICAgICMgU2Nhbm5lciByZWZsZWN0cyBkaWZmZXJlbmNlcyBpbiBwcm9wZXJ0aWVzIGFmZmVjdGluZyBiaW5kaW5nIG9mICd0YXJnZXQnLAorICAgICMgd2hpY2ggd2lsbCBiZSBrbm93biB3aGVuIHByb2Nlc3NpbmcgaW5jbHVkZXMgZm9yIGl0LCBhbmQgZ2l2ZSBpbmZvcm1hdGlvbgorICAgICMgb24gaG93IHRvIGludGVycHJldCBkaWZmZXJlbnQgaW5jbHVkZSB0eXBlcyAoZS5nLiBxdW90ZWQgdnMuIHRob3NlIGluCisgICAgIyBhbmdsZSBicmFja2V0cyBpbiBDIGZpbGVzKS4KKyAgICBIRFJHUklTVCBvbiAkKHRhcmdldCkgPSAkKHNjYW5uZXIpIDsKK30KKworCisjIFByb3BhZ2F0ZSBzY2FubmVyIHNldHRpbmdzIGZyb20gJ2luY2x1ZGluZy10YXJnZXQnIHRvICd0YXJnZXRzJy4KKyMKK3J1bGUgcHJvcGFnYXRlICggc2Nhbm5lciA6IHRhcmdldHMgKiA6IGluY2x1ZGluZy10YXJnZXQgKQoreworICAgIEhEUlNDQU4gb24gJCh0YXJnZXRzKSA9IFsgb24gJChpbmNsdWRpbmctdGFyZ2V0KSByZXR1cm4gJChIRFJTQ0FOKSBdIDsKKyAgICBTQ0FOTkVSIG9uICQodGFyZ2V0cykgPSAkKHNjYW5uZXIpIDsKKyAgICBIRFJSVUxFIG9uICQodGFyZ2V0cykgPSBzY2FubmVyLmhkcnJ1bGUgOworICAgIEhEUkdSSVNUIG9uICQodGFyZ2V0cykgPSBbIG9uICQoaW5jbHVkaW5nLXRhcmdldCkgcmV0dXJuICQoSERSR1JJU1QpIF0gOworfQorCisKK3J1bGUgaGRycnVsZSAoIHRhcmdldCA6IG1hdGNoZXMgKiA6IGJpbmRpbmcgKQoreworICAgIGxvY2FsIHNjYW5uZXIgPSBbIG9uICQodGFyZ2V0KSByZXR1cm4gJChTQ0FOTkVSKSBdIDsKKyAgICAkKHNjYW5uZXIpLnByb2Nlc3MgJCh0YXJnZXQpIDogJChtYXRjaGVzKSA6ICQoYmluZGluZykgOworfQorCisKKyMgaGRycnVsZSBtdXN0IGJlIGF2YWlsYWJsZSBhdCBnbG9iYWwgc2NvcGUgc28gaXQgY2FuIGJlIGludm9rZWQgYnkgaGVhZGVyCisjIHNjYW5uaW5nLgorIworSU1QT1JUIHNjYW5uZXIgOiBoZHJydWxlIDogOiBzY2FubmVyLmhkcnJ1bGUgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC90YXJnZXRzLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvdGFyZ2V0cy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkMzlhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvdGFyZ2V0cy5qYW0KQEAgLTAsMCArMSwxNjk0IEBACisjIENvcHlyaWdodCBWbGFkaW1pciBQcnVzIDIwMDIuCisjIENvcHlyaWdodCBSZW5lIFJpdmVyYSAyMDA2LgorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIFN1cHBvcnRzICdhYnN0cmFjdCcgdGFyZ2V0cywgd2hpY2ggYXJlIHRhcmdldHMgZXhwbGljaXRseSBkZWZpbmVkIGluIGEKKyMgSmFtZmlsZS4KKyMKKyMgQWJzdHJhY3QgdGFyZ2V0cyBhcmUgcmVwcmVzZW50ZWQgYnkgY2xhc3NlcyBkZXJpdmVkIGZyb20gJ2Fic3RyYWN0LXRhcmdldCcKKyMgY2xhc3MuIFRoZSBmaXJzdCBhYnN0cmFjdCB0YXJnZXQgaXMgJ3Byb2plY3QtdGFyZ2V0Jywgd2hpY2ggaXMgY3JlYXRlZCBmb3IKKyMgZWFjaCBKYW1maWxlLCBhbmQgY2FuIGJlIG9idGFpbmVkIGJ5IHRoZSAndGFyZ2V0JyBydWxlIGluIHRoZSBKYW1maWxlJ3MgbW9kdWxlCisjIChzZWUgcHJvamVjdC5qYW0pLgorIworIyBQcm9qZWN0IHRhcmdldHMga2VlcCBhIGxpc3Qgb2YgJ21haW4tdGFyZ2V0JyBpbnN0YW5jZXMuIEEgbWFpbiB0YXJnZXQgaXMgd2hhdAorIyB0aGUgdXNlciBleHBsaWNpdGx5IGRlZmluZXMgaW4gYSBKYW1maWxlLiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIHNldmVyYWwKKyMgZGVmaW5pdGlvbnMgZm9yIGEgbWFpbiB0YXJnZXQsIGZvciBleGFtcGxlIHRvIGhhdmUgZGlmZmVyZW50IGxpc3RzIG9mIHNvdXJjZXMKKyMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMuIFNvLCBtYWluIHRhcmdldHMga2VlcCBhIGxpc3Qgb2YgYWx0ZXJuYXRpdmVzLgorIworIyBFYWNoIGFsdGVybmF0aXZlIGlzIGFuIGluc3RhbmNlIG9mICdhYnN0cmFjdC10YXJnZXQnLiBXaGVuIGEgbWFpbiB0YXJnZXQKKyMgc3VidmFyaWFudCBpcyBkZWZpbmVkIGJ5IHNvbWUgcnVsZSwgdGhhdCBydWxlIHdpbGwgZGVjaWRlIHdoYXQgY2xhc3MgdG8gdXNlLAorIyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGFsdGVybmF0aXZlcyBmb3IKKyMgdGhlIG1haW4gdGFyZ2V0LgorIworIyBSdWxlcyBzdXBwbGllZCBieSB0aGUgYnVpbGQgc3lzdGVtIHdpbGwgdXNlIG9ubHkgdGFyZ2V0cyBkZXJpdmVkIGZyb20gdGhlCisjICdiYXNpYy10YXJnZXQnIGNsYXNzLCB3aGljaCB3aWxsIHByb3ZpZGUgc29tZSBkZWZhdWx0IGJlaGF2aW91ci4gVGhlcmUgd2lsbCBiZQorIyBkaWZmZXJlbnQgY2xhc3NlcyBkZXJpdmVkIGZyb20gaXQgc3VjaCBhcyAnbWFrZS10YXJnZXQnLCBjcmVhdGVkIGJ5IHRoZSAnbWFrZScKKyMgcnVsZSwgYW5kICd0eXBlZC10YXJnZXQnLCBjcmVhdGVkIGJ5IHJ1bGVzIHN1Y2ggYXMgJ2V4ZScgYW5kICdsaWInLgorIworIyAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyMgICAgICAgICAgICAgICAgICB8IGFic3RyYWN0LXRhcmdldCAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09PT09KworIyAgICAgICAgICAgICAgICAgIHwgbmFtZSAgICAgICAgICAgICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICB8IHByb2plY3QgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIyAgICAgICAgICAgICAgICAgIHwgZ2VuZXJhdGUocHJvcGVydGllcykgPSAwIHwKKyMgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstKy0rCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICstLS0tLS0tLS0tLSstLS0tLS0tLS0tKyAgICAgICstLS0tLS0rLS0tLS0tKyAgICAgICAgICAgICAgICArLS0tLS0tLSstLS0tLS0rCisjIHwgcHJvamVjdC10YXJnZXQgICAgICAgfCAgICAgIHwgbWFpbi10YXJnZXQgfCAgICAgICAgICAgICAgICB8IGJhc2ljLXRhcmdldCB8CisjICs9PT09PT09PT09PT09PT09PT09PT09KyAxICAqICs9PT09PT09PT09PT09KyAgYWx0ZXJuYXRpdmVzICArPT09PT09PT09PT09PT0rCisjIHwgZ2VuZXJhdGUocHJvcGVydGllcykgfG8tLS0tLSsgZ2VuZXJhdGUgICAgfDw+LS0tLS0tLS0tLS0tLT58IGdlbmVyYXRlICAgICB8CisjIHwgbWFpbi10YXJnZXQgICAgICAgICAgfCAgICAgICstLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICB8IGNvbnN0cnVjdCA9IDB8CisjICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSstLS0tLS0rCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0rLSsKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAgIC4uLi0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSsKKyMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAorIyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAuLi4gLS0tKy0tLS0tKyAgICstLS0tLS0tKy0tLS0tLSsgICArLS0tLS0tKy0tLS0tLSsgICArLS0tLS0tLSstLS0tLS0rCisjICAgICAgICAgICAgICAgICAgICAgfCAgIHwgdHlwZWQtdGFyZ2V0IHwgICB8IG1ha2UtdGFyZ2V0IHwgICB8IHN0YWdlLXRhcmdldCB8CisjICAgICAgICAgICAgICAgICAgICAgLiAgICs9PT09PT09PT09PT09PSsgICArPT09PT09PT09PT09PSsgICArPT09PT09PT09PT09PT0rCisjICAgICAgICAgICAgICAgICAgICAgLiAgIHwgY29uc3RydWN0ICAgIHwgICB8IGNvbnN0cnVjdCAgIHwgICB8IGNvbnN0cnVjdCAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0tLS0rCisKK2ltcG9ydCBhc3NlcnQgOworaW1wb3J0IGJ1aWxkLXJlcXVlc3QgOworaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IGluZGlyZWN0IDsKK2ltcG9ydCBwYXRoIDsKK2ltcG9ydCBwcm9wZXJ0eSA7CitpbXBvcnQgcHJvcGVydHktc2V0IDsKK2ltcG9ydCBzZXF1ZW5jZSA7CitpbXBvcnQgc2V0IDsKK2ltcG9ydCB0b29sc2V0IDsKKworCisjIEJhc2UgY2xhc3MgZm9yIGFsbCBhYnN0cmFjdCB0YXJnZXRzLgorIworY2xhc3MgYWJzdHJhY3QtdGFyZ2V0Cit7CisgICAgaW1wb3J0IGFzc2VydCA7CisgICAgaW1wb3J0ICJjbGFzcyIgOworICAgIGltcG9ydCBlcnJvcnMgOworICAgIGltcG9ydCBwcm9qZWN0IDsKKworICAgIHJ1bGUgX19pbml0X18gKCBuYW1lICAjIE5hbWUgb2YgdGhlIHRhcmdldCBpbiBKYW1maWxlLgorICAgICAgICA6IHByb2plY3QtdGFyZ2V0ICAjIFRoZSBwcm9qZWN0IHRhcmdldCB0byB3aGljaCB0aGlzIG9uZSBiZWxvbmdzLgorICAgICkKKyAgICB7CisgICAgICAgICMgTm90ZTogaXQgbWlnaHQgc2VlbSB0aGF0IHdlIGRvbid0IG5lZWQgZWl0aGVyIG5hbWUgb3IgcHJvamVjdCBhdCBhbGwuCisgICAgICAgICMgSG93ZXZlciwgdGhlcmUgYXJlIHBsYWNlcyB3aGVyZSB3ZSByZWFsbHkgbmVlZCBpdC4gT25lIGV4YW1wbGUgaXMKKyAgICAgICAgIyBlcnJvciBtZXNzYWdlcyB3aGljaCBzaG91bGQgbmFtZSBwcm9ibGVtYXRpYyB0YXJnZXRzLiBBbm90aGVyIGlzCisgICAgICAgICMgc2V0dGluZyBjb3JyZWN0IHBhdGhzIGZvciBzb3VyY2VzIGFuZCBnZW5lcmF0ZWQgZmlsZXMuCisKKyAgICAgICAgc2VsZi5uYW1lID0gJChuYW1lKSA7CisgICAgICAgIHNlbGYucHJvamVjdCA9ICQocHJvamVjdC10YXJnZXQpIDsKKyAgICAgICAgc2VsZi5sb2NhdGlvbiA9IFsgZXJyb3JzLm5lYXJlc3QtdXNlci1sb2NhdGlvbiBdIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyB0YXJnZXQuCisgICAgcnVsZSBuYW1lICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi5uYW1lKSA7CisgICAgfQorCisgICAgIyBSZXR1cm5zIHRoZSBwcm9qZWN0IGZvciB0aGlzIHRhcmdldC4KKyAgICBydWxlIHByb2plY3QgKCApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLnByb2plY3QpIDsKKyAgICB9CisKKyAgICAjIFJldHVybiB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHRhcmdldCB3YXMgZGVjbGFyZWQuCisgICAgcnVsZSBsb2NhdGlvbiAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYubG9jYXRpb24pIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgYSB1c2VyLXJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgdGFyZ2V0LgorICAgIHJ1bGUgZnVsbC1uYW1lICggKQorICAgIHsKKyAgICAgICAgbG9jYWwgbG9jYXRpb24gPSBbICQoc2VsZi5wcm9qZWN0KS5nZXQgbG9jYXRpb24gXSA7CisgICAgICAgIHJldHVybiAkKGxvY2F0aW9uKS8kKHNlbGYubmFtZSkgOworICAgIH0KKworICAgICMgR2VuZXJhdGVzIHZpcnR1YWwgdGFyZ2V0cyBmb3IgdGhpcyBhYnN0cmFjdCB0YXJnZXQgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICMgcHJvcGVydGllcywgdW5sZXNzIGEgZGlmZmVyZW50IHZhbHVlIG9mIHNvbWUgZmVhdHVyZSBpcyByZXF1aXJlZCBieSB0aGUKKyAgICAjIHRhcmdldC4KKyAgICAjIE9uIHN1Y2Nlc3MsIHJldHVybnM6CisgICAgIyAtIGEgcHJvcGVydHktc2V0IHdpdGggdGhlIHVzYWdlIHJlcXVpcmVtZW50cyB0byBiZSBhcHBsaWVkIHRvIGRlcGVuZGFudHMKKyAgICAjIC0gYSBsaXN0IG9mIHByb2R1Y2VkIHZpcnR1YWwgdGFyZ2V0cywgd2hpY2ggbWF5IGJlIGVtcHR5LgorICAgICMgSWYgJ3Byb3BlcnR5LXNldCcgaXMgZW1wdHksIHBlcmZvcm1zIHRoZSBkZWZhdWx0IGJ1aWxkIG9mIHRoaXMgdGFyZ2V0LCBpbgorICAgICMgYSB3YXkgc3BlY2lmaWMgdG8gdGhlIGRlcml2ZWQgY2xhc3MuCisgICAgIworICAgIHJ1bGUgZ2VuZXJhdGUgKCBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgZXJyb3JzLmVycm9yICJtZXRob2Qgc2hvdWxkIGJlIGRlZmluZWQgaW4gZGVyaXZlZCBjbGFzc2VzIiA7CisgICAgfQorCisgICAgcnVsZSByZW5hbWUgKCBuZXctbmFtZSApCisgICAgeworICAgICAgICBzZWxmLm5hbWUgPSAkKG5ldy1uYW1lKSA7CisgICAgfQorfQorCisKK2lmIC0tZGVidWctYnVpbGRpbmcgaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0KK3sKKyAgICBtb2R1bGVzLnBva2UgOiAuZGVidWctYnVpbGRpbmcgOiB0cnVlIDsKK30KKworCitydWxlIGluZGVudCAoICkKK3sKKyAgICByZXR1cm4gJCguaW5kZW50Oko9IiIpIDsKK30KKworCitydWxlIGluY3JlYXNlLWluZGVudCAoICkKK3sKKyAgICAuaW5kZW50ICs9ICIgICAgIiA7Cit9CisKKworcnVsZSBkZWNyZWFzZS1pbmRlbnQgKCApCit7CisgICAgLmluZGVudCA9ICQoLmluZGVudFsyLV0pIDsKK30KKworCisjICBQcm9qZWN0IHRhcmdldCBjbGFzcyAoZGVyaXZlZCBmcm9tICdhYnN0cmFjdC10YXJnZXQnKS4KKyMKKyMgIFRoaXMgY2xhc3MgaGFzIHRoZSBmb2xsb3dpbmcgcmVzcG9uc2liaWxpdGllczoKKyMgIC0gTWFpbnRhaW5pbmcgYSBsaXN0IG9mIG1haW4gdGFyZ2V0cyBpbiB0aGlzIHByb2plY3QgYW5kIGJ1aWxkaW5nIHRoZW0uCisjCisjICBNYWluIHRhcmdldHMgYXJlIGNvbnN0cnVjdGVkIGluIHR3byBzdGFnZXM6CisjICAtIFdoZW4gSmFtZmlsZSBpcyByZWFkLCBhIG51bWJlciBvZiBjYWxscyB0byAnYWRkLWFsdGVybmF0aXZlJyBpcyBtYWRlLiBBdAorIyAgICB0aGF0IHRpbWUsIGFsdGVybmF0aXZlcyBjYW4gYWxzbyBiZSByZW5hbWVkIHRvIGFjY291bnQgZm9yIGlubGluZSB0YXJnZXRzLgorIyAgLSBUaGUgZmlyc3QgdGltZSAnbWFpbi10YXJnZXQnIG9yICdoYXMtbWFpbi10YXJnZXQnIHJ1bGUgaXMgY2FsbGVkLCBhbGwKKyMgICAgYWx0ZXJuYXRpdmVzIGFyZSBlbnVtZXJhdGVkIGFuZCBtYWluIHRhcmdldHMgYXJlIGNyZWF0ZWQuCisjCitjbGFzcyBwcm9qZWN0LXRhcmdldCA6IGFic3RyYWN0LXRhcmdldAoreworICAgIGltcG9ydCBwcm9qZWN0IDsKKyAgICBpbXBvcnQgdGFyZ2V0cyA7CisgICAgaW1wb3J0IHBhdGggOworICAgIGltcG9ydCBwcmludCA7CisgICAgaW1wb3J0IHByb3BlcnR5LXNldCA7CisgICAgaW1wb3J0IHNldCA7CisgICAgaW1wb3J0IHNlcXVlbmNlIDsKKyAgICBpbXBvcnQgImNsYXNzIiA6IG5ldyA7CisKKyAgICBydWxlIF9faW5pdF9fICggbmFtZSA6IHByb2plY3QtbW9kdWxlIHBhcmVudC1wcm9qZWN0ID8KKyAgICAgICAgOiByZXF1aXJlbWVudHMgKiA6IGRlZmF1bHQtYnVpbGQgKiApCisgICAgeworICAgICAgICBhYnN0cmFjdC10YXJnZXQuX19pbml0X18gJChuYW1lKSA6ICQoX19uYW1lX18pIDsKKworICAgICAgICBzZWxmLnByb2plY3QtbW9kdWxlID0gJChwcm9qZWN0LW1vZHVsZSkgOworICAgICAgICBzZWxmLmxvY2F0aW9uID0gWyBwcm9qZWN0LmF0dHJpYnV0ZSAkKHByb2plY3QtbW9kdWxlKSBsb2NhdGlvbiBdIDsKKyAgICAgICAgc2VsZi5yZXF1aXJlbWVudHMgPSAkKHJlcXVpcmVtZW50cykgOworICAgICAgICBzZWxmLmRlZmF1bHQtYnVpbGQgPSAkKGRlZmF1bHQtYnVpbGQpIDsKKworICAgICAgICBpZiAkKHBhcmVudC1wcm9qZWN0KQorICAgICAgICB7CisgICAgICAgICAgICBpbmhlcml0ICQocGFyZW50LXByb2plY3QpIDsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgVGhpcyBpcyBuZWVkZWQgb25seSBieSB0aGUgJ21ha2UnIHJ1bGUuIE5lZWQgdG8gZmluZCBhIHdheSB0byBtYWtlICdtYWtlJworICAgICMgd29yayB3aXRob3V0IHRoaXMgbWV0aG9kLgorICAgICMKKyAgICBydWxlIHByb2plY3QtbW9kdWxlICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi5wcm9qZWN0LW1vZHVsZSkgOworICAgIH0KKworICAgIHJ1bGUgZ2V0ICggYXR0cmlidXRlICkKKyAgICB7CisgICAgICAgIHJldHVybiBbIHByb2plY3QuYXR0cmlidXRlICQoc2VsZi5wcm9qZWN0LW1vZHVsZSkgJChhdHRyaWJ1dGUpIF0gOworICAgIH0KKworICAgIHJ1bGUgYnVpbGQtZGlyICggKQorICAgIHsKKyAgICAgICAgaWYgISAkKHNlbGYuYnVpbGQtZGlyKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLmJ1aWxkLWRpciA9IFsgZ2V0IGJ1aWxkLWRpciBdIDsKKyAgICAgICAgICAgIGlmICEgJChzZWxmLmJ1aWxkLWRpcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBsb2NhdGlvbiA9IFsgJChzZWxmLnByb2plY3QpLmdldCBsb2NhdGlvbiBdIDsKKyAgICAgICAgICAgICAgICBpZiAkKGxvY2F0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5idWlsZC1kaXIgPSBbIHBhdGguam9pbiAkKGxvY2F0aW9uKSBiaW4gXSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsIGlkID0gWyBnZXQgaWQgIF0gOworICAgICAgICAgICAgICAgICAgICBpZiAkKGlkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCByaWQgPSBbIE1BVENIIF4vKC4qKSA6ICQoaWQpIF0gOworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWlsZC1kaXIgPSBbIHBhdGguam9pbiBbIHByb2plY3Quc3RhbmRhbG9uZS1idWlsZC1kaXIgXSAkKHJpZCkgXSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuZXJyb3IgIkNvdWxkIG5vdCBjcmVhdGUgYnVpbGQtZGlyIGZvciBzdGFuZGFsb25lIHByb2plY3QgJChzZWxmLnByb2plY3QtbW9kdWxlOkU9KS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1pc3NpbmcgcHJvamVjdCBpZCIgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHNlbGYuYnVpbGQtZGlyKSA7CisgICAgfQorCisgICAgIyBHZW5lcmF0ZXMgYWxsIHBvc3NpYmxlIHRhcmdldHMgY29udGFpbmVkIGluIHRoaXMgcHJvamVjdC4KKyAgICAjCisgICAgcnVsZSBnZW5lcmF0ZSAoIHByb3BlcnR5LXNldCAqICkKKyAgICB7CisgICAgICAgIGlmIFsgbW9kdWxlcy5wZWVrIDogLmRlYnVnLWJ1aWxkaW5nIF0KKyAgICAgICAgeworICAgICAgICAgICAgRUNITyBbIHRhcmdldHMuaW5kZW50IF0gImJ1aWxkaW5nIHByb2plY3QiIFsgbmFtZSBdCisgICAgICAgICAgICAgICAgIiAoJyQoX19uYW1lX18pJykgd2l0aCIgWyAkKHByb3BlcnR5LXNldCkucmF3IF0gOworICAgICAgICAgICAgdGFyZ2V0cy5pbmNyZWFzZS1pbmRlbnQgOworICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgdXNhZ2UtcmVxdWlyZW1lbnRzID0gWyBwcm9wZXJ0eS1zZXQuZW1wdHkgXSA7CisgICAgICAgIGxvY2FsIHRhcmdldHMgOworCisgICAgICAgIGZvciBsb2NhbCB0IGluIFsgdGFyZ2V0cy10by1idWlsZCBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGcgPSBbICQodCkuZ2VuZXJhdGUgJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICAgICAgdXNhZ2UtcmVxdWlyZW1lbnRzID0gWyAkKHVzYWdlLXJlcXVpcmVtZW50cykuYWRkICQoZ1sxXSkgXSA7CisgICAgICAgICAgICB0YXJnZXRzICs9ICQoZ1syLV0pIDsKKyAgICAgICAgfQorICAgICAgICB0YXJnZXRzLmRlY3JlYXNlLWluZGVudCA7CisgICAgICAgIHJldHVybiAkKHVzYWdlLXJlcXVpcmVtZW50cykgWyBzZXF1ZW5jZS51bmlxdWUgJCh0YXJnZXRzKSBdIDsKKyAgICB9CisKKyAgICAjIENvbXB1dGVzIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBhYnN0cmFjdC10YXJnZXQgaW5zdGFuY2VzIHdoaWNoIG11c3QgYmUKKyAgICAjIGJ1aWx0IHdoZW4gdGhpcyBwcm9qZWN0IGlzIGJ1aWx0LgorICAgICMKKyAgICBydWxlIHRhcmdldHMtdG8tYnVpbGQgKCApCisgICAgeworICAgICAgICBsb2NhbCByZXN1bHQgOworCisgICAgICAgIGlmICEgJChzZWxmLmJ1aWx0LW1haW4tdGFyZ2V0cykKKyAgICAgICAgeworICAgICAgICAgICAgYnVpbGQtbWFpbi10YXJnZXRzIDsKKyAgICAgICAgfQorCisgICAgICAgICMgQ29sbGVjdCBhbGwgbWFpbiB0YXJnZXRzIGhlcmUsIGV4Y2VwdCBmb3IgImV4cGxpY2l0IiBvbmVzLgorICAgICAgICBmb3IgbG9jYWwgdCBpbiAkKHNlbGYubWFpbi10YXJnZXRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAhIFsgJCh0KS5uYW1lIF0gaW4gJChzZWxmLmV4cGxpY2l0LXRhcmdldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQodCkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBDb2xsZWN0IGFsbCBwcm9qZWN0cyByZWZlcmVuY2VkIHZpYSAicHJvamVjdHMtdG8tYnVpbGQiIGF0dHJpYnV0ZS4KKyAgICAgICAgbG9jYWwgc2VsZi1sb2NhdGlvbiA9IFsgZ2V0IGxvY2F0aW9uIF0gOworICAgICAgICBmb3IgbG9jYWwgcG4gaW4gWyBnZXQgcHJvamVjdHMtdG8tYnVpbGQgXQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gWyBmaW5kICQocG4pLyBdIDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworICAgIH0KKworICAgICMgQWRkICd0YXJnZXQnIHRvIHRoZSBsaXN0IG9mIHRhcmdldHMgaW4gdGhpcyBwcm9qZWN0IHRoYXQgc2hvdWxkIGJlIGJ1aWxkCisgICAgIyBvbmx5IGJ5IGV4cGxpY2l0IHJlcXVlc3QKKyAgICAjCisgICAgcnVsZSBtYXJrLXRhcmdldC1hcy1leHBsaWNpdCAoIHRhcmdldC1uYW1lICogKQorICAgIHsKKyAgICAgICAgIyBSZWNvcmQgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCwgbm90IGluc3RhbmNlLCBzaW5jZSB0aGlzIHJ1bGUgaXMgY2FsbGVkCisgICAgICAgICMgYmVmb3JlIG1haW4gdGFyZ2V0IGluc3RhbmNlcyBhcmUgY3JlYXRlZC4KKyAgICAgICAgc2VsZi5leHBsaWNpdC10YXJnZXRzICs9ICQodGFyZ2V0LW5hbWUpIDsKKyAgICB9CisKKyAgICBydWxlIG1hcmstdGFyZ2V0LWFzLWFsd2F5cyAoIHRhcmdldC1uYW1lICogKQorICAgIHsKKyAgICAgICAgIyBSZWNvcmQgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCwgbm90IGluc3RhbmNlLCBzaW5jZSB0aGlzIHJ1bGUgaXMgY2FsbGVkCisgICAgICAgICMgYmVmb3JlIG1haW4gdGFyZ2V0IGluc3RhbmNlcyBhcmUgY3JlYXRlZC4KKyAgICAgICAgc2VsZi5hbHdheXMtdGFyZ2V0cyArPSAkKHRhcmdldC1uYW1lKSA7CisgICAgfQorCisgICAgIyBBZGQgbmV3IHRhcmdldCBhbHRlcm5hdGl2ZQorICAgICMKKyAgICBydWxlIGFkZC1hbHRlcm5hdGl2ZSAoIHRhcmdldC1pbnN0YW5jZSApCisgICAgeworICAgICAgICBpZiAkKHNlbGYuYnVpbHQtbWFpbi10YXJnZXRzKQorICAgICAgICB7CisgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDogZXJyb3IgOiBlcnJvcnMuZXJyb3IgOworICAgICAgICAgICAgZXJyb3JzLmVycm9yIGFkZC1hbHRlcm5hdGl2ZSBjYWxsZWQgd2hlbiBtYWluIHRhcmdldHMgYXJlIGFscmVhZHkKKyAgICAgICAgICAgICAgICBjcmVhdGVkLiA6IGluIHByb2plY3QgWyBmdWxsLW5hbWUgXSA7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hbHRlcm5hdGl2ZXMgKz0gJCh0YXJnZXQtaW5zdGFuY2UpIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgYSAnbWFpbi10YXJnZXQnIGNsYXNzIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gJ25hbWUnLgorICAgICMKKyAgICBydWxlIG1haW4tdGFyZ2V0ICggbmFtZSApCisgICAgeworICAgICAgICBpZiAhICQoc2VsZi5idWlsdC1tYWluLXRhcmdldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1aWxkLW1haW4tdGFyZ2V0cyA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQoc2VsZi5tYWluLXRhcmdldC4kKG5hbWUpKSA7CisgICAgfQorCisgICAgIyBSZXR1cm5zIHdoZXRoZXIgYSBtYWluIHRhcmdldCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBleGlzdHMuCisgICAgIworICAgIHJ1bGUgaGFzLW1haW4tdGFyZ2V0ICggbmFtZSApCisgICAgeworICAgICAgICBpZiAhICQoc2VsZi5idWlsdC1tYWluLXRhcmdldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1aWxkLW1haW4tdGFyZ2V0cyA7CisgICAgICAgIH0KKworICAgICAgICBpZiAkKHNlbGYubWFpbi10YXJnZXQuJChuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWUgOworICAgICAgICB9CisgICAgfQorCisgICAgIyBXb3JrZXIgZnVuY3Rpb24gZm9yIHRoZSBmaW5kIHJ1bGUgbm90IGltcGxlbWVudGluZyBhbnkgY2FjaGluZyBhbmQgc2ltcGx5CisgICAgIyByZXR1cm5pbmcgbm90aGluZyBpbiBjYXNlIHRoZSB0YXJnZXQgY2FuIG5vdCBiZSBmb3VuZC4KKyAgICAjCisgICAgcnVsZSBmaW5kLXJlYWxseSAoIGlkICkKKyAgICB7CisgICAgICAgIGxvY2FsIHJlc3VsdCA7CisgICAgICAgIGxvY2FsIGN1cnJlbnQtbG9jYXRpb24gPSBbIGdldCBsb2NhdGlvbiBdIDsKKworICAgICAgICBsb2NhbCBzcGxpdCA9IFsgTUFUQ0ggXiguKikvLyguKikkIDogJChpZCkgXSA7CisgICAgICAgIGxvY2FsIHByb2plY3QtcGFydCA9ICQoc3BsaXRbMV0pIDsKKyAgICAgICAgbG9jYWwgdGFyZ2V0LXBhcnQgPSAkKHNwbGl0WzJdKSA7CisKKyAgICAgICAgbG9jYWwgZXh0cmEtZXJyb3ItbWVzc2FnZSA7CisgICAgICAgIGlmICQocHJvamVjdC1wYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICAjIFRoZXJlIGlzIGFuIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHByb2plY3QgcGFydCBpbiBpZC4gTG9va3MgdXAgdGhlCisgICAgICAgICAgICAjIHByb2plY3QgYW5kIHBhc3NlcyB0aGUgcmVxdWVzdCB0byBpdC4KKyAgICAgICAgICAgIGxvY2FsIHBtID0gWyBwcm9qZWN0LmZpbmQgJChwcm9qZWN0LXBhcnQpIDogJChjdXJyZW50LWxvY2F0aW9uKSBdIDsKKyAgICAgICAgICAgIGlmICQocG0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvamVjdC10YXJnZXQgPSBbIHByb2plY3QudGFyZ2V0ICQocG0pIF0gOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsgJChwcm9qZWN0LXRhcmdldCkuZmluZCAkKHRhcmdldC1wYXJ0KSA6IG5vLWVycm9yIF0gOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4dHJhLWVycm9yLW1lc3NhZ2UgPSBjb3VsZCBub3QgcmVzb2x2ZSBwcm9qZWN0IHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAnJChwcm9qZWN0LXBhcnQpJyA7CisgICAgICAgICAgICAgICAgaWYgISBbIHBhdGguaXMtcm9vdGVkICQocHJvamVjdC1wYXJ0KSBdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NhbCByb290ZWQgPSBbIHBhdGgucm9vdCAkKHByb2plY3QtcGFydCkgLyBdIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgWyBwcm9qZWN0LmlzLXJlZ2lzdGVyZWQtaWQgJChyb290ZWQpIF0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEtZXJyb3ItbWVzc2FnZSArPSAtIHBvc3NpYmx5IG1pc3NpbmcgYSBsZWFkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xhc2ggKCcvJykgY2hhcmFjdGVyLiA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAjIEludGVycHJldCB0YXJnZXQtbmFtZSBhcyBuYW1lIG9mIG1haW4gdGFyZ2V0LiBOZWVkIHRvIGRvIHRoaXMKKyAgICAgICAgICAgICMgYmVmb3JlIGNoZWNraW5nIGZvciBmaWxlLiBDb25zaWRlciB0aGUgZm9sbG93aW5nIHNjZW5hcmlvIHdpdGggYQorICAgICAgICAgICAgIyB0b29sc2V0IG5vdCBtb2RpZnlpbmcgaXRzIGV4ZWN1dGFibGUncyBuYW1lcywgZS5nLiBnY2Mgb24KKyAgICAgICAgICAgICMgVW5peC1saWtlIHBsYXRmb3JtczoKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgIGV4ZSB0ZXN0IDogdGVzdC5jcHAgOworICAgICAgICAgICAgIyAgaW5zdGFsbCBzIDogdGVzdCA6IDxsb2NhdGlvbj4uIDsKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgQWZ0ZXIgdGhlIGZpcnN0IGJ1aWxkIHdlIHdvdWxkIGhhdmUgYSB0YXJnZXQgbmFtZWQgJ3Rlc3QnIGluIHRoZQorICAgICAgICAgICAgIyBKYW1maWxlIGFuZCBhIGZpbGUgbmFtZWQgJ3Rlc3QnIG9uIHRoZSBkaXNrLiBXZSBuZWVkIHRoZSB0YXJnZXQgdG8KKyAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIGZpbGUuCisgICAgICAgICAgICByZXN1bHQgPSBbIG1haW4tdGFyZ2V0ICQoaWQpIF0gOworCisgICAgICAgICAgICAjIEludGVycHJldCBpZCBhcyBhbiBleGlzdGluZyBmaWxlIHJlZmVyZW5jZS4KKyAgICAgICAgICAgIGlmICEgJChyZXN1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gWyBuZXcgZmlsZS1yZWZlcmVuY2UgWyBwYXRoLm1ha2UgJChpZCkgXSA6CisgICAgICAgICAgICAgICAgICAgICQoc2VsZi5wcm9qZWN0KSBdIDsKKyAgICAgICAgICAgICAgICBpZiAhIFsgJChyZXN1bHQpLmV4aXN0cyBdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjIEludGVycHJldCBpZCBhcyBwcm9qZWN0LWlkLgorICAgICAgICAgICAgaWYgISAkKHJlc3VsdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBwcm9qZWN0LW1vZHVsZSA9IFsgcHJvamVjdC5maW5kICQoaWQpIDoKKyAgICAgICAgICAgICAgICAgICAgJChjdXJyZW50LWxvY2F0aW9uKSBdIDsKKyAgICAgICAgICAgICAgICBpZiAkKHByb2plY3QtbW9kdWxlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gWyBwcm9qZWN0LnRhcmdldCAkKHByb2plY3QtbW9kdWxlKSBdIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJChyZXN1bHQ6RT0iIikgJChleHRyYS1lcnJvci1tZXNzYWdlKSA7CisgICAgfQorCisgICAgIyBGaW5kIGFuZCByZXR1cm4gdGhlIHRhcmdldCB3aXRoIHRoZSBzcGVjaWZpZWQgaWQsIHRyZWF0ZWQgcmVsYXRpdmUgdG8KKyAgICAjIHNlbGYuIElkIG1heSBzcGVjaWZ5IGVpdGhlciBhIHRhcmdldCBvciBhIGZpbGUgbmFtZSB3aXRoIHRoZSB0YXJnZXQgdGFraW5nCisgICAgIyBwcmlvcml0eS4gTWF5IHJlcG9ydCBhbiBlcnJvciBvciByZXR1cm4gbm90aGluZyBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBmb3VuZAorICAgICMgZGVwZW5kaW5nIG9uIHRoZSAnbm8tZXJyb3InIHBhcmFtZXRlci4KKyAgICAjCisgICAgcnVsZSBmaW5kICggaWQgOiBuby1lcnJvciA/ICkKKyAgICB7CisgICAgICAgIGxvY2FsIHYgPSAkKC5pZC4kKGlkKSkgOworICAgICAgICBsb2NhbCBleHRyYS1lcnJvci1tZXNzYWdlIDsKKyAgICAgICAgaWYgISAkKHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHIgPSBbIGZpbmQtcmVhbGx5ICQoaWQpIF0gOworICAgICAgICAgICAgdiA9ICQoclsxXSkgOworICAgICAgICAgICAgZXh0cmEtZXJyb3ItbWVzc2FnZSA9ICQoclsyLV0pIDsKKyAgICAgICAgICAgIGlmICEgJCh2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHYgPSBub25lIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC5pZC4kKGlkKSA9ICQodikgOworICAgICAgICB9CisKKyAgICAgICAgaWYgJCh2KSAhPSBub25lCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAkKHYpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICEgJChuby1lcnJvcikKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgY3VycmVudC1sb2NhdGlvbiA9IFsgZ2V0IGxvY2F0aW9uIF0gOworICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA6IHVzZXItZXJyb3IgOiBlcnJvcnMudXNlci1lcnJvciA7CisgICAgICAgICAgICBlcnJvcnMudXNlci1lcnJvciBVbmFibGUgdG8gZmluZCBmaWxlIG9yIHRhcmdldCBuYW1lZAorICAgICAgICAgICAgICAgIDogIiAgICIgJyQoaWQpJworICAgICAgICAgICAgICAgIDogcmVmZXJyZWQgdG8gZnJvbSBwcm9qZWN0IGF0CisgICAgICAgICAgICAgICAgOiAiICAgIiAnJChjdXJyZW50LWxvY2F0aW9uKScKKyAgICAgICAgICAgICAgICA6ICQoZXh0cmEtZXJyb3ItbWVzc2FnZSkgOworICAgICAgICB9CisgICAgfQorCisgICAgcnVsZSBidWlsZC1tYWluLXRhcmdldHMgKCApCisgICAgeworICAgICAgICBzZWxmLmJ1aWx0LW1haW4tdGFyZ2V0cyA9IHRydWUgOworICAgICAgICBmb3IgbG9jYWwgYSBpbiAkKHNlbGYuYWx0ZXJuYXRpdmVzKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBuYW1lID0gWyAkKGEpLm5hbWUgXSA7CisgICAgICAgICAgICBsb2NhbCB0YXJnZXQgPSAkKHNlbGYubWFpbi10YXJnZXQuJChuYW1lKSkgOworICAgICAgICAgICAgaWYgISAkKHRhcmdldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCB0ID0gWyBuZXcgbWFpbi10YXJnZXQgJChuYW1lKSA6ICQoc2VsZi5wcm9qZWN0KSBdIDsKKyAgICAgICAgICAgICAgICBzZWxmLm1haW4tdGFyZ2V0LiQobmFtZSkgPSAkKHQpIDsKKyAgICAgICAgICAgICAgICBzZWxmLm1haW4tdGFyZ2V0cyArPSAkKHQpIDsKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSAkKHNlbGYubWFpbi10YXJnZXQuJChuYW1lKSkgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAkKG5hbWUpIGluICQoc2VsZi5hbHdheXMtdGFyZ2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkKGEpLmFsd2F5cyA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICQodGFyZ2V0KS5hZGQtYWx0ZXJuYXRpdmUgJChhKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIEFjY2Vzc29yLCBhZGQgYSBjb25zdGFudC4KKyAgICAjCisgICAgcnVsZSBhZGQtY29uc3RhbnQgKAorICAgICAgICBuYW1lICAgICAgICMgVmFyaWFibGUgbmFtZSBvZiB0aGUgY29uc3RhbnQuCisgICAgICAgIDogdmFsdWUgKyAgIyBWYWx1ZSBvZiB0aGUgY29uc3RhbnQuCisgICAgICAgIDogdHlwZSA/ICAgIyBPcHRpb25hbCB0eXBlIG9mIHZhbHVlLgorICAgICAgICApCisgICAgeworICAgICAgICBzd2l0Y2ggJCh0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHBhdGggOgorICAgICAgICAgICAgICBsb2NhbCByIDsKKyAgICAgICAgICAgICAgZm9yIGxvY2FsIHYgaW4gJCh2YWx1ZSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsIGwgPSAkKHNlbGYubG9jYXRpb24pIDsKKyAgICAgICAgICAgICAgICBpZiAhICQobCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICMgUHJvamVjdCBjb3JyZXNwb25kaW5nIHRvIGNvbmZpZyBmaWxlcyBkbyBub3QgaGF2ZQorICAgICAgICAgICAgICAgICAgICAjICdsb2NhdGlvbicgYXR0cmlidXRlLCBidXQgZG8gaGF2ZSBzb3VyY2UgbG9jYXRpb24uIEl0CisgICAgICAgICAgICAgICAgICAgICMgbWlnaHQgYmUgbW9yZSByZWFzb25hYmxlIHRvIG1ha2UgZXZlcnkgcHJvamVjdCBoYXZlIGEKKyAgICAgICAgICAgICAgICAgICAgIyBsb2NhdGlvbiBhbmQgdXNlIHNvbWUgb3RoZXIgYXBwcm9hY2ggdG8gcHJldmVudCBidWlsZGFibGUKKyAgICAgICAgICAgICAgICAgICAgIyB0YXJnZXRzIGluIGNvbmZpZyBmaWxlcywgYnV0IHRoYXQgaGFzIGJlZW4gbGVmdCBmb3IgbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgIGwgPSBbIGdldCBzb3VyY2UtbG9jYXRpb24gXSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHYgPSBbIHBhdGgucm9vdCBbIHBhdGgubWFrZSAkKHYpIF0gJChsKSBdIDsKKyAgICAgICAgICAgICAgICAjIE5vdyBtYWtlIHRoZSB2YWx1ZSBhYnNvbHV0ZSBwYXRoLgorICAgICAgICAgICAgICAgIHYgPSBbIHBhdGgucm9vdCAkKHYpIFsgcGF0aC5wd2QgXSBdIDsKKyAgICAgICAgICAgICAgICAjIENvbnN0YW50cyBzaG91bGQgYmUgaW4gcGxhdGZvcm0tbmF0aXZlIGZvcm0uCisgICAgICAgICAgICAgICAgdiA9IFsgcGF0aC5uYXRpdmUgJCh2KSBdIDsKKyAgICAgICAgICAgICAgICByICs9ICQodikgOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHZhbHVlID0gJChyKSA7CisgICAgICAgIH0KKyAgICAgICAgaWYgISAkKG5hbWUpIGluICQoc2VsZi5jb25zdGFudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbGYuY29uc3RhbnRzICs9ICQobmFtZSkgOworICAgICAgICB9CisgICAgICAgIHNlbGYuY29uc3RhbnQuJChuYW1lKSA9ICQodmFsdWUpIDsKKyAgICAgICAgIyBJbmplY3QgdGhlIGNvbnN0YW50IGluIHRoZSBzY29wZSBvZiB0aGUgSmFtcm9vdCBtb2R1bGUuCisgICAgICAgIG1vZHVsZXMucG9rZSAkKHNlbGYucHJvamVjdC1tb2R1bGUpIDogJChuYW1lKSA6ICQodmFsdWUpIDsKKyAgICB9CisKKyAgICBydWxlIGluaGVyaXQgKCBwYXJlbnQgKQorICAgIHsKKyAgICAgICAgZm9yIGxvY2FsIGMgaW4gWyBtb2R1bGVzLnBlZWsgJChwYXJlbnQpIDogc2VsZi5jb25zdGFudHMgXQorICAgICAgICB7CisgICAgICAgICAgICAjIE5vIG5lZWQgdG8gcGFzcyB0aGUgdHlwZS4gUGF0aCBjb25zdGFudHMgd2VyZSBjb252ZXJ0ZWQgdG8KKyAgICAgICAgICAgICMgYWJzb2x1dGUgcGF0aHMgYWxyZWFkeSBieSBwYXJlbnQuCisgICAgICAgICAgICBhZGQtY29uc3RhbnQgJChjKSA6IFsgbW9kdWxlcy5wZWVrICQocGFyZW50KSA6IHNlbGYuY29uc3RhbnQuJChjKSBdCisgICAgICAgICAgICAgICAgOworICAgICAgICB9CisKKyAgICAgICAgIyBJbXBvcnQgcnVsZXMgZnJvbSBwYXJlbnQuCisgICAgICAgIGxvY2FsIHRoaXMtbW9kdWxlID0gWyBwcm9qZWN0LW1vZHVsZSBdIDsKKyAgICAgICAgbG9jYWwgcGFyZW50LW1vZHVsZSA9IFsgJChwYXJlbnQpLnByb2plY3QtbW9kdWxlIF0gOworICAgICAgICAjIERvIG5vdCBpbXBvcnQgcnVsZXMgY29taW5nIGZyb20gJ3Byb2plY3QtcnVsZXMnIGFzIHRoZXkgbXVzdCBiZQorICAgICAgICAjIGltcG9ydGVkIGxvY2FsaXplZC4KKyAgICAgICAgbG9jYWwgdXNlci1ydWxlcyA9IFsgc2V0LmRpZmZlcmVuY2UKKyAgICAgICAgICAgIFsgUlVMRU5BTUVTICQocGFyZW50LW1vZHVsZSkgXSA6CisgICAgICAgICAgICBbIFJVTEVOQU1FUyBwcm9qZWN0LXJ1bGVzIF0gXSA7CisgICAgICAgIElNUE9SVCAkKHBhcmVudC1tb2R1bGUpIDogJCh1c2VyLXJ1bGVzKSA6ICQodGhpcy1tb2R1bGUpIDogJCh1c2VyLXJ1bGVzKQorICAgICAgICAgICAgOworICAgICAgICBFWFBPUlQgJCh0aGlzLW1vZHVsZSkgOiAkKHVzZXItcnVsZXMpIDsKKyAgICB9Cit9CisKKworIyBIZWxwZXIgcnVsZXMgdG8gZGV0ZWN0IGN5Y2xlcyBpbiBtYWluIHRhcmdldCByZWZlcmVuY2VzLgorIworbG9jYWwgcnVsZSBzdGFydC1idWlsZGluZyAoIG1haW4tdGFyZ2V0LWluc3RhbmNlICkKK3sKKyAgICBpZiAkKG1haW4tdGFyZ2V0LWluc3RhbmNlKSBpbiAkKC50YXJnZXRzLWJlaW5nLWJ1aWx0KQorICAgIHsKKyAgICAgICAgbG9jYWwgbmFtZXMgOworICAgICAgICBmb3IgbG9jYWwgdCBpbiAkKC50YXJnZXRzLWJlaW5nLWJ1aWx0KSAkKG1haW4tdGFyZ2V0LWluc3RhbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBuYW1lcyArPSBbICQodCkuZnVsbC1uYW1lIF0gOworICAgICAgICB9CisKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciAiUmVjdXJzaW9uIGluIG1haW4gdGFyZ2V0IHJlZmVyZW5jZXMiCisgICAgICAgICAgOiAidGhlIGZvbGxvd2luZyB0YXJnZXQgYXJlIGJlaW5nIGJ1aWx0IGN1cnJlbnRseToiCisgICAgICAgICAgOiAkKG5hbWVzKSA7CisgICAgfQorICAgIC50YXJnZXRzLWJlaW5nLWJ1aWx0ICs9ICQobWFpbi10YXJnZXQtaW5zdGFuY2UpIDsKK30KKworCitsb2NhbCBydWxlIGVuZC1idWlsZGluZyAoIG1haW4tdGFyZ2V0LWluc3RhbmNlICkKK3sKKyAgICAudGFyZ2V0cy1iZWluZy1idWlsdCA9ICQoLnRhcmdldHMtYmVpbmctYnVpbHRbMS0tMl0pIDsKK30KKworCisjIEEgbmFtZWQgdG9wLWxldmVsIHRhcmdldCBpbiBKYW1maWxlLgorIworY2xhc3MgbWFpbi10YXJnZXQgOiBhYnN0cmFjdC10YXJnZXQKK3sKKyAgICBpbXBvcnQgYXNzZXJ0IDsKKyAgICBpbXBvcnQgZmVhdHVyZSA7CisgICAgaW1wb3J0IHByaW50IDsKKyAgICBpbXBvcnQgcHJvcGVydHktc2V0IDsKKyAgICBpbXBvcnQgc2VxdWVuY2UgOworICAgIGltcG9ydCB0YXJnZXRzIDogc3RhcnQtYnVpbGRpbmcgZW5kLWJ1aWxkaW5nIDsKKworICAgIHJ1bGUgX19pbml0X18gKCBuYW1lIDogcHJvamVjdCApCisgICAgeworICAgICAgICBhYnN0cmFjdC10YXJnZXQuX19pbml0X18gJChuYW1lKSA6ICQocHJvamVjdCkgOworICAgIH0KKworICAgICMgQWRkIGEgbmV3IGFsdGVybmF0aXZlIGZvciB0aGlzIHRhcmdldAorICAgIHJ1bGUgYWRkLWFsdGVybmF0aXZlICggdGFyZ2V0ICkKKyAgICB7CisgICAgICAgIGxvY2FsIGQgPSBbICQodGFyZ2V0KS5kZWZhdWx0LWJ1aWxkIF0gOworICAgICAgICBpZiAkKHNlbGYuYWx0ZXJuYXRpdmVzKSAmJiAoICQoc2VsZi5kZWZhdWx0LWJ1aWxkKSAhPSAkKGQpICkKKyAgICAgICAgeworICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA6IGVycm9yIDogZXJyb3JzLmVycm9yIDsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciAiZGVmYXVsdCBidWlsZCBtdXN0IGJlIGlkZW50aWNhbCBpbiBhbGwgYWx0ZXJuYXRpdmVzIgorICAgICAgICAgICAgICAgIDogIm1haW4gdGFyZ2V0IGlzIiBbIGZ1bGwtbmFtZSBdCisgICAgICAgICAgICAgICAgOiAid2l0aCIgWyAkKGQpLnJhdyBdCisgICAgICAgICAgICAgICAgOiAiZGlmZmVyaW5nIGZyb20gcHJldmlvdXMgZGVmYXVsdCBidWlsZCIKKyAgICAgICAgICAgICAgICAgICAgWyAkKHNlbGYuZGVmYXVsdC1idWlsZCkucmF3IF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZi5kZWZhdWx0LWJ1aWxkID0gJChkKSA7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hbHRlcm5hdGl2ZXMgKz0gJCh0YXJnZXQpIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdGhlIGJlc3QgdmlhYmxlIGFsdGVybmF0aXZlIGZvciB0aGlzIHByb3BlcnR5LXNldC4gU2VlIHRoZQorICAgICMgZG9jdW1lbnRhdGlvbiBmb3Igc2VsZWN0aW9uIHJ1bGVzLgorICAgICMKKyAgICBsb2NhbCBydWxlIHNlbGVjdC1hbHRlcm5hdGl2ZXMgKCBwcm9wZXJ0eS1zZXQgZGVidWcgPyApCisgICAgeworICAgICAgICAjIFdoZW4gc2VsZWN0aW5nIGFsdGVybmF0aXZlcyB3ZSBoYXZlIHRvIGNvbnNpZGVyIGRlZmF1bHRzLCBmb3IgZXhhbXBsZToKKyAgICAgICAgIyAgICBsaWIgbCA6IGwuY3BwIDogPHZhcmlhbnQ+ZGVidWcgOworICAgICAgICAjICAgIGxpYiBsIDogbF9vcHQuY3BwIDogPHZhcmlhbnQ+cmVsZWFzZSA7CisgICAgICAgICMgd2lsbCBub3Qgd29yayB1bmxlc3Mgd2UgYWRkIGRlZmF1bHQgdmFsdWUgPHZhcmlhbnQ+ZGVidWcuCisgICAgICAgIHByb3BlcnR5LXNldCA9IFsgJChwKS5hZGQtZGVmYXVsdHMgXSA7CisKKyAgICAgICAgIyBUaGUgYWxnb3JpdGhtOiB3ZSBrZWVwIHRoZSBjdXJyZW50IGJlc3QgdmlhYmxlIGFsdGVybmF0aXZlLiBXaGVuIHdlCisgICAgICAgICMgZW5jb3VudGVyIGEgbmV3IGJlc3QgdmlhYmxlIGFsdGVybmF0aXZlLCB3ZSBjb21wYXJlIGl0IHdpdGggdGhlCisgICAgICAgICMgY3VycmVudCBvbmUuCisKKyAgICAgICAgbG9jYWwgYmVzdCA7CisgICAgICAgIGxvY2FsIGJlc3QtcHJvcGVydGllcyA7CisKKyAgICAgICAgaWYgJChzZWxmLmFsdGVybmF0aXZlc1syLV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGJhZCA7CisgICAgICAgICAgICBsb2NhbCB3b3JrbGlzdCA9ICQoc2VsZi5hbHRlcm5hdGl2ZXMpIDsKKyAgICAgICAgICAgIHdoaWxlICQod29ya2xpc3QpICYmICEgJChiYWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWwgdiA9ICQod29ya2xpc3RbMV0pIDsKKyAgICAgICAgICAgICAgICBsb2NhbCBwcm9wZXJ0aWVzID0gWyAkKHYpLm1hdGNoICQocHJvcGVydHktc2V0KSAkKGRlYnVnKSBdIDsKKworICAgICAgICAgICAgICAgIGlmICQocHJvcGVydGllcykgIT0gbm8tbWF0Y2gKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICEgJChiZXN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0ID0gJCh2KSA7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0LXByb3BlcnRpZXMgPSAkKHByb3BlcnRpZXMpIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICQocHJvcGVydGllcykgPSAkKGJlc3QtcHJvcGVydGllcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgJChwcm9wZXJ0aWVzKSBpbiAkKGJlc3QtcHJvcGVydGllcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIERvIG5vdGhpbmcsIHRoaXMgYWx0ZXJuYXRpdmUgaXMgd29yc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgJChiZXN0LXByb3BlcnRpZXMpIGluICQocHJvcGVydGllcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0ID0gJCh2KSA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdC1wcm9wZXJ0aWVzID0gJChwcm9wZXJ0aWVzKSA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkID0gdHJ1ZSA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29ya2xpc3QgPSAkKHdvcmtsaXN0WzItXSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgISAkKGJhZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gJChiZXN0KSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gJChzZWxmLmFsdGVybmF0aXZlcykgOworICAgICAgICB9CisgICAgfQorCisgICAgcnVsZSBhcHBseS1kZWZhdWx0LWJ1aWxkICggcHJvcGVydHktc2V0ICkKKyAgICB7CisgICAgICAgIHJldHVybiBbIHRhcmdldHMuYXBwbHktZGVmYXVsdC1idWlsZCAkKHByb3BlcnR5LXNldCkgOgorICAgICAgICAgICAgJChzZWxmLmRlZmF1bHQtYnVpbGQpIF0gOworICAgIH0KKworICAgICMgU2VsZWN0IGFuIGFsdGVybmF0aXZlIGZvciB0aGlzIG1haW4gdGFyZ2V0LCBieSBmaW5kaW5nIGFsbCBhbHRlcm5hdGl2ZXMKKyAgICAjIHdob3NlIHJlcXVpcmVtZW50cyBhcmUgc2F0aXNmaWVkIGJ5ICdwcm9wZXJ0aWVzJyBhbmQgcGlja2luZyB0aGUgb25lIHdpdGgKKyAgICAjIHRoZSBsb25nZXN0IHJlcXVpcmVtZW50cyBzZXQuIFJldHVybnMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nICdnZW5lcmF0ZScgb24KKyAgICAjIHRoYXQgYWx0ZXJuYXRpdmUuCisgICAgIworICAgIHJ1bGUgZ2VuZXJhdGUgKCBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgc3RhcnQtYnVpbGRpbmcgJChfX25hbWVfXykgOworCisgICAgICAgICMgV2Ugd2FudCBjb21wb3NpdGUgcHJvcGVydGllcyBpbiB0aGUgYnVpbGQgcmVxdWVzdCB0byBhY3QgYXMgaWYgYWxsIHRoZQorICAgICAgICAjIHByb3BlcnRpZXMgdGhleSBleHBhbmQgdG8gaGF2ZSBiZWVuIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICAgICAgICBwcm9wZXJ0eS1zZXQgPSBbICQocHJvcGVydHktc2V0KS5leHBhbmQgXSA7CisKKyAgICAgICAgbG9jYWwgYWxsLXByb3BlcnR5LXNldHMgPSBbIGFwcGx5LWRlZmF1bHQtYnVpbGQgJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICBsb2NhbCB1c2FnZS1yZXF1aXJlbWVudHMgPSBbIHByb3BlcnR5LXNldC5lbXB0eSBdIDsKKyAgICAgICAgbG9jYWwgcmVzdWx0IDsKKyAgICAgICAgZm9yIGxvY2FsIHAgaW4gJChhbGwtcHJvcGVydHktc2V0cykKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgciA9IFsgZ2VuZXJhdGUtcmVhbGx5ICQocCkgXSA7CisgICAgICAgICAgICBpZiAkKHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNhZ2UtcmVxdWlyZW1lbnRzID0gWyAkKHVzYWdlLXJlcXVpcmVtZW50cykuYWRkICQoclsxXSkgXSA7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoclsyLV0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbmQtYnVpbGRpbmcgJChfX25hbWVfXykgOworICAgICAgICByZXR1cm4gJCh1c2FnZS1yZXF1aXJlbWVudHMpIFsgc2VxdWVuY2UudW5pcXVlICQocmVzdWx0KSBdIDsKKyAgICB9CisKKyAgICAjIEdlbmVyYXRlcyB0aGUgbWFpbiB0YXJnZXQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkgc2V0IGFuZCByZXR1cm5zIGEgbGlzdAorICAgICMgd2hpY2ggZmlyc3QgZWxlbWVudCBpcyBwcm9wZXJ0eS1zZXQgb2JqZWN0IGNvbnRhaW5pbmcgdXNhZ2UtcmVxdWlyZW1lbnRzCisgICAgIyBvZiBnZW5lcmF0ZWQgdGFyZ2V0IGFuZCB3aXRoIGdlbmVyYXRlZCB2aXJ0dWFsIHRhcmdldCBpbiBvdGhlciBlbGVtZW50cy4KKyAgICAjIEl0IGlzIHBvc3NpYmxlIHRoYXQgbm8gdGFyZ2V0cyBhcmUgZ2VuZXJhdGVkLgorICAgICMKKyAgICBsb2NhbCBydWxlIGdlbmVyYXRlLXJlYWxseSAoIHByb3BlcnR5LXNldCApCisgICAgeworICAgICAgICBsb2NhbCBiZXN0LWFsdGVybmF0aXZlcyA9IFsgc2VsZWN0LWFsdGVybmF0aXZlcyAkKHByb3BlcnR5LXNldCkgXSA7CisgICAgICAgIGlmICEgJChiZXN0LWFsdGVybmF0aXZlcykKKyAgICAgICAgeworICAgICAgICAgICAgRUNITyAiZXJyb3I6IE5vIGJlc3QgYWx0ZXJuYXRpdmUgZm9yIiBbIGZ1bGwtbmFtZSBdIDsKKyAgICAgICAgICAgIHNlbGVjdC1hbHRlcm5hdGl2ZXMgJChwcm9wZXJ0eS1zZXQpIGRlYnVnIDsKKyAgICAgICAgICAgIHJldHVybiBbIHByb3BlcnR5LXNldC5lbXB0eSBdIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICMgTm93IHJldHVybiB2aXJ0dWFsIHRhcmdldHMgZm9yIHRoZSBvbmx5IGFsdGVybmF0aXZlLgorICAgICAgICAgICAgcmV0dXJuIFsgJChiZXN0LWFsdGVybmF0aXZlcykuZ2VuZXJhdGUgJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICB9CisgICAgfQorCisgICAgcnVsZSByZW5hbWUgKCBuZXctbmFtZSApCisgICAgeworICAgICAgICBhYnN0cmFjdC10YXJnZXQucmVuYW1lICQobmV3LW5hbWUpIDsKKyAgICAgICAgZm9yIGxvY2FsIGEgaW4gJChzZWxmLmFsdGVybmF0aXZlcykKKyAgICAgICAgeworICAgICAgICAgICAgJChhKS5yZW5hbWUgJChuZXctbmFtZSkgOworICAgICAgICB9CisgICAgfQorfQorCisKKyMgQWJzdHJhY3QgdGFyZ2V0IHJlZmVycmluZyB0byBhIHNvdXJjZSBmaWxlLiBUaGlzIGlzIGFuIGFydGlmaWNpYWwgZW50aXR5CisjIGFsbG93aW5nIHNvdXJjZXMgdG8gYSB0YXJnZXQgdG8gYmUgcmVwcmVzZW50ZWQgdXNpbmcgYSBsaXN0IG9mIGFic3RyYWN0IHRhcmdldAorIyBpbnN0YW5jZXMuCisjCitjbGFzcyBmaWxlLXJlZmVyZW5jZSA6IGFic3RyYWN0LXRhcmdldAoreworICAgIGltcG9ydCB2aXJ0dWFsLXRhcmdldCA7CisgICAgaW1wb3J0IHByb3BlcnR5LXNldCA7CisgICAgaW1wb3J0IHBhdGggOworCisgICAgcnVsZSBfX2luaXRfXyAoIGZpbGUgOiBwcm9qZWN0ICkKKyAgICB7CisgICAgICAgIGFic3RyYWN0LXRhcmdldC5fX2luaXRfXyAkKGZpbGUpIDogJChwcm9qZWN0KSA7CisgICAgfQorCisgICAgcnVsZSBnZW5lcmF0ZSAoIHByb3BlcnRpZXMgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFsgcHJvcGVydHktc2V0LmVtcHR5IF0gWyB2aXJ0dWFsLXRhcmdldC5mcm9tLWZpbGUgJChzZWxmLm5hbWUpIDoKKyAgICAgICAgICAgIFsgbG9jYXRpb24gXSA6ICQoc2VsZi5wcm9qZWN0KSBdIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVmZXJyZWQgZmlsZSByZWFsbHkgZXhpc3RzLgorICAgIHJ1bGUgZXhpc3RzICggKQorICAgIHsKKyAgICAgICAgbG9jYXRpb24gOworICAgICAgICByZXR1cm4gJChzZWxmLmZpbGUtcGF0aCkgOworICAgIH0KKworICAgICMgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGFyZ2V0LiBOZWVkZWQgYnkgJ3Rlc3RpbmcuamFtJy4KKyAgICBydWxlIGxvY2F0aW9uICggKQorICAgIHsKKyAgICAgICAgaWYgISAkKHNlbGYuZmlsZS1sb2NhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgc291cmNlLWxvY2F0aW9uID0gWyAkKHNlbGYucHJvamVjdCkuZ2V0IHNvdXJjZS1sb2NhdGlvbiBdIDsKKyAgICAgICAgICAgIGZvciBsb2NhbCBzcmMtZGlyIGluICQoc291cmNlLWxvY2F0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICEgJChzZWxmLmZpbGUtbG9jYXRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NhbCBsb2NhdGlvbiA9IFsgcGF0aC5yb290ICQoc2VsZi5uYW1lKSAkKHNyYy1kaXIpIF0gOworICAgICAgICAgICAgICAgICAgICBpZiBbIENIRUNLX0lGX0ZJTEUgWyBwYXRoLm5hdGl2ZSAkKGxvY2F0aW9uKSBdIF0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZS1sb2NhdGlvbiA9ICQoc3JjLWRpcikgOworICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZS1wYXRoID0gJChsb2NhdGlvbikgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHNlbGYuZmlsZS1sb2NhdGlvbikgOworICAgIH0KK30KKworCisjIEdpdmVuIGEgdGFyZ2V0LXJlZmVyZW5jZSwgbWFkZSBpbiBjb250ZXh0IG9mICdwcm9qZWN0JywgcmV0dXJucyB0aGUKKyMgYWJzdHJhY3QtdGFyZ2V0IGluc3RhbmNlIHRoYXQgaXMgcmVmZXJyZWQgdG8sIGFzIHdlbGwgYXMgcHJvcGVydGllcyBleHBsaWNpdGx5CisjIHNwZWNpZmllZCBmb3IgdGhpcyByZWZlcmVuY2UuCisjCitydWxlIHJlc29sdmUtcmVmZXJlbmNlICggdGFyZ2V0LXJlZmVyZW5jZSA6IHByb2plY3QgKQoreworICAgICMgU2VwYXJhdGUgdGFyZ2V0IG5hbWUgZnJvbSBwcm9wZXJ0aWVzIG92ZXJyaWRlLgorICAgIGxvY2FsIHNwbGl0ID0gWyBNQVRDSCAiXihbXjxdKikoLyg8LiopKT8kIiA6ICQodGFyZ2V0LXJlZmVyZW5jZSkgXSA7CisgICAgbG9jYWwgaWQgPSAkKHNwbGl0WzFdKSA7CisgICAgbG9jYWwgc3Byb3BlcnRpZXMgPSA7CisgICAgaWYgJChzcGxpdFszXSkKKyAgICB7CisgICAgICAgIHNwcm9wZXJ0aWVzID0gWyBwcm9wZXJ0eS5tYWtlIFsgZmVhdHVyZS5zcGxpdCAkKHNwbGl0WzNdKSBdIF0gOworICAgICAgICBzcHJvcGVydGllcyA9IFsgZmVhdHVyZS5leHBhbmQtY29tcG9zaXRlcyAkKHNwcm9wZXJ0aWVzKSBdIDsKKyAgICB9CisKKyAgICAjIEZpbmQgdGhlIHRhcmdldC4KKyAgICBsb2NhbCB0YXJnZXQgPSBbICQocHJvamVjdCkuZmluZCAkKGlkKSBdIDsKKworICAgIHJldHVybiAkKHRhcmdldCkgWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQoc3Byb3BlcnRpZXMpIF0gOworfQorCisKKyMgQXR0ZW1wdHMgdG8gZ2VuZXJhdGUgdGhlIHRhcmdldCBnaXZlbiBieSB0YXJnZXQgcmVmZXJlbmNlLCB3aGljaCBjYW4gcmVmZXIKKyMgYm90aCB0byBhIG1haW4gdGFyZ2V0IG9yIHRvIGEgZmlsZS4gUmV0dXJucyBhIGxpc3QgY29uc2lzdGluZyBvZgorIyAtIHVzYWdlIHJlcXVpcmVtZW50cworIyAtIGdlbmVyYXRlZCB2aXJ0dWFsIHRhcmdldHMsIGlmIGFueQorIworcnVsZSBnZW5lcmF0ZS1mcm9tLXJlZmVyZW5jZSAoCisgICAgdGFyZ2V0LXJlZmVyZW5jZSAgIyBUYXJnZXQgcmVmZXJlbmNlLgorICAgIDogcHJvamVjdCAgICAgICAgICMgUHJvamVjdCB3aGVyZSB0aGUgcmVmZXJlbmNlIGlzIG1hZGUuCisgICAgOiBwcm9wZXJ0eS1zZXQgICAgIyBQcm9wZXJ0aWVzIG9mIHRoZSBtYWluIHRhcmdldCB0aGF0IG1ha2VzIHRoZSByZWZlcmVuY2UuCispCit7CisgICAgbG9jYWwgciA9IFsgcmVzb2x2ZS1yZWZlcmVuY2UgJCh0YXJnZXQtcmVmZXJlbmNlKSA6ICQocHJvamVjdCkgXSA7CisgICAgbG9jYWwgdGFyZ2V0ID0gJChyWzFdKSA7CisgICAgbG9jYWwgc3Byb3BlcnRpZXMgPSAkKHJbMl0pIDsKKworICAgICMgVGFrZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBwcm9wYWdhdGVkIGFuZCByZWZpbmUgdGhlbSB3aXRoCisgICAgIyBzb3VyY2Utc3BlY2lmaWMgcmVxdWlyZW1lbnRzLgorICAgIGxvY2FsIHByb3BhZ2F0ZWQgPSBbICQocHJvcGVydHktc2V0KS5wcm9wYWdhdGVkIF0gOworICAgIGxvY2FsIHJwcm9wZXJ0aWVzID0gWyAkKHByb3BhZ2F0ZWQpLnJlZmluZSAkKHNwcm9wZXJ0aWVzKSBdIDsKKyAgICBpZiAkKHJwcm9wZXJ0aWVzWzFdKSA9ICJAZXJyb3IiCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgZXJyb3JzLmVycm9yCisgICAgICAgICAgICAiV2hlbiBidWlsZGluZyIgWyBmdWxsLW5hbWUgXSAiIHdpdGggcHJvcGVydGllcyAiICQocHJvcGVydGllcykgOgorICAgICAgICAgICAgIkludmFsaWQgcHJvcGVydGllcyBzcGVjaWZpZWQgZm9yICIgJChzb3VyY2UpICI6IgorICAgICAgICAgICAgJChycHJvcGVydGllc1syLV0pIDsKKyAgICB9CisgICAgcmV0dXJuIFsgJCh0YXJnZXQpLmdlbmVyYXRlICQocnByb3BlcnRpZXMpIF0gOworfQorCisKK3J1bGUgYXBwbHktZGVmYXVsdC1idWlsZCAoIHByb3BlcnR5LXNldCA6IGRlZmF1bHQtYnVpbGQgKQoreworICAgICMgMS4gRmlyc3QsIHNlZSB3aGF0IHByb3BlcnRpZXMgZnJvbSBkZWZhdWx0LWJ1aWxkIGFyZSBhbHJlYWR5IHByZXNlbnQgaW4KKyAgICAjIHByb3BlcnR5LXNldC4KKworICAgIGxvY2FsIHJhdyA9IFsgJChwcm9wZXJ0eS1zZXQpLnJhdyBdIDsKKyAgICBsb2NhbCBzcGVjaWZpZWQtZmVhdHVyZXMgPSAkKHJhdzpHKSA7CisKKyAgICBsb2NhbCBkZWZhdWx0cy10by1hcHBseSA7CisgICAgZm9yIGxvY2FsIGQgaW4gWyAkKGRlZmF1bHQtYnVpbGQpLnJhdyBdCisgICAgeworICAgICAgICBpZiAhICQoZDpHKSBpbiAkKHNwZWNpZmllZC1mZWF0dXJlcykKKyAgICAgICAgeworICAgICAgICAgICAgZGVmYXVsdHMtdG8tYXBwbHkgKz0gJChkKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIDIuIElmIHRoZXJlIGFyZSBhbnkgZGVmYXVsdHMgdG8gYmUgYXBwbGllZCwgZm9ybSBhIG5ldyBidWlsZCByZXF1ZXN0LiBQYXNzCisgICAgIyBpdCB0aHJvdWdoIHRvICdleHBhbmQtbm8tZGVmYXVsdHMnIHNpbmNlIGRlZmF1bHQtYnVpbGQgbWlnaHQgY29udGFpbgorICAgICMgInJlbGVhc2UgZGVidWciIHJlc3VsdGluZyBpbiB0d28gcHJvcGVydHktc2V0cy4KKyAgICBsb2NhbCByZXN1bHQgOworICAgIGlmICQoZGVmYXVsdHMtdG8tYXBwbHkpCisgICAgeworICAgICAgICAjIFdlIGhhdmUgdG8gY29tcHJlc3Mgc3VicHJvcGVydGllcyBoZXJlIHRvIHByZXZlbnQgcHJvcGVydHkgbGlzdHMgbGlrZToKKyAgICAgICAgIyAgICA8dG9vbHNldD5tc3ZjIDx0b29sc2V0LW1zdmM6dmVyc2lvbj43LjEgPHRocmVhZGluZz5tdWx0aQorICAgICAgICAjCisgICAgICAgICMgZnJvbSBiZWluZyBleHBhbmRlZCBpbnRvOgorICAgICAgICAjICAgIDx0b29sc2V0LW1zdmM6dmVyc2lvbj43LjEvPHRocmVhZGluZz5tdWx0aQorICAgICAgICAjICAgIDx0b29sc2V0Pm1zdmMvPHRvb2xzZXQtbXN2Yzp2ZXJzaW9uPjcuMS88dGhyZWFkaW5nPm11bHRpCisgICAgICAgICMKKyAgICAgICAgIyBkdWUgdG8gYSBjcm9zcy1wcm9kdWN0IHByb3BlcnR5IGNvbWJpbmF0aW9uLiBUaGF0IG1heSBiZSBhbiBpbmRpY2F0aW9uCisgICAgICAgICMgdGhhdCBidWlsZC1yZXF1ZXN0LmV4cGFuZC1uby1kZWZhdWx0cyBpcyB0aGUgd3JvbmcgcnVsZSB0byB1c2UgaGVyZS4KKyAgICAgICAgcHJvcGVydGllcyA9IFsgYnVpbGQtcmVxdWVzdC5leHBhbmQtbm8tZGVmYXVsdHMKKyAgICAgICAgICAgIFsgZmVhdHVyZS5jb21wcmVzcy1zdWJwcm9wZXJ0aWVzICQocmF3KSBdICQoZGVmYXVsdHMtdG8tYXBwbHkpIF0gOworCisgICAgICAgIGlmICQocHJvcGVydGllcykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIGxvY2FsIHAgaW4gJChwcm9wZXJ0aWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbIHByb3BlcnR5LXNldC5jcmVhdGUKKyAgICAgICAgICAgICAgICAgICAgWyBmZWF0dXJlLmV4cGFuZCBbIGZlYXR1cmUuc3BsaXQgJChwKSBdIF0gXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBbIHByb3BlcnR5LXNldC5lbXB0eSBdIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgPSAkKHByb3BlcnR5LXNldCkgOworICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIEdpdmVuIGEgYnVpbGQgcmVxdWVzdCBhbmQgcmVxdWlyZW1lbnRzLCByZXR1cm4gcHJvcGVydGllcyBjb21tb24gdG8gZGVwZW5kZW5jeQorIyBidWlsZCByZXF1ZXN0IGFuZCB0YXJnZXQgcmVxdWlyZW1lbnRzLgorIworIyBUT0RPOiBEb2N1bWVudCBleGFjdGx5IHdoYXQgJ2NvbW1vbiBwcm9wZXJ0aWVzJyBhcmUsIHdoZXRoZXIgdGhleSBzaG91bGQKKyMgaW5jbHVkZSBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcywgd2hldGhlciB0aGV5IHNob3VsZCBjb250YWluIGFueSBjb25kaXRpb25hbAorIyBwcm9wZXJ0aWVzIG9yIHNob3VsZCB0aG9zZSBiZSBhbHJlYWR5IHByb2Nlc3NlZCwgZXRjLiBTZWUgd2hldGhlciB0aGVyZSBhcmUKKyMgYW55IGRpZmZlcmVuY2VzIGJldHdlZW4gdXNlIGNhc2VzIHdpdGggZW1wdHkgYW5kIG5vbi1lbXB0eSBidWlsZC1yZXF1ZXN0IGFzCisjIHdlbGwgYXMgd2l0aCByZXF1aXJlbWVudHMgY29udGFpbmluZyBhbmQgdGhvc2Ugbm90IGNvbnRhaW5pbmcgYW55IG5vbi1mcmVlCisjIGZlYXR1cmVzLgorIworcnVsZSBjb21tb24tcHJvcGVydGllcyAoIGJ1aWxkLXJlcXVlc3QgcmVxdWlyZW1lbnRzICkKK3sKKyAgICAjIEZvciBvcHRpbWl6YXRpb24sIHdlIGFkZCBmcmVlIHJlcXVpcmVtZW50cyBkaXJlY3RseSwgd2l0aG91dCB1c2luZyBhCisgICAgIyBjb21wbGV4IGFsZ29yaXRobS4gVGhpcyBnaXZlcyB0aGUgY29tcGxleCBhbGdvcml0aG0gYSBiZXR0ZXIgY2hhbmNlIG9mCisgICAgIyBjYWNoaW5nIHJlc3VsdHMuCisgICAgbG9jYWwgZnJlZSA9IFsgJChyZXF1aXJlbWVudHMpLmZyZWUgXSA7CisgICAgbG9jYWwgbm9uLWZyZWUgPSBbIHByb3BlcnR5LXNldC5jcmVhdGUgWyAkKHJlcXVpcmVtZW50cykuYmFzZSBdCisgICAgICAgIFsgJChyZXF1aXJlbWVudHMpLmluY2lkZW50YWwgXSBdIDsKKworICAgIGxvY2FsIGtleSA9IC5ycC4kKGJ1aWxkLXJlcXVlc3QpLSQobm9uLWZyZWUpIDsKKyAgICBpZiAhICQoJChrZXkpKQorICAgIHsKKyAgICAgICAgJChrZXkpID0gWyBjb21tb24tcHJvcGVydGllczIgJChidWlsZC1yZXF1ZXN0KSAkKG5vbi1mcmVlKSBdIDsKKyAgICB9CisgICAgcmV0dXJuIFsgJCgkKGtleSkpLmFkZC1yYXcgJChmcmVlKSBdIDsKK30KKworCisjIEdpdmVuIGEgJ2NvbnRleHQnIC0tIGEgc2V0IG9mIGFscmVhZHkgcHJlc2VudCBwcm9wZXJ0aWVzLCBhbmQgJ3JlcXVpcmVtZW50cycsCisjIGRlY2lkZSB3aGljaCBleHRyYSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBhcHBsaWVkIHRvICdjb250ZXh0Jy4gRm9yIGNvbmRpdGlvbmFsCisjIHJlcXVpcmVtZW50cywgdGhpcyBtZWFucyBldmFsdWF0aW5nIHRoZSBjb25kaXRpb24uIEZvciBpbmRpcmVjdCBjb25kaXRpb25hbAorIyByZXF1aXJlbWVudHMsIHRoaXMgbWVhbnMgY2FsbGluZyBhIHJ1bGUuIE9yZGluYXJ5IHJlcXVpcmVtZW50cyBhcmUgYWx3YXlzCisjIGFwcGxpZWQuCisjCisjIEhhbmRsZXMgdGhlIHNpdHVhdGlvbiB3aGVyZSBldmFsdWF0aW5nIG9uZSBjb25kaXRpb25hbCByZXF1aXJlbWVudCBhZmZlY3RzCisjIGNvbmRpdGlvbnMgb2YgYW5vdGhlciBjb25kaXRpb25hbCByZXF1aXJlbWVudHMsIHN1Y2ggYXM6CisjICAgICA8dG9vbHNldD5nY2M6PHZhcmlhbnQ+cmVsZWFzZSA8dmFyaWFudD5yZWxlYXNlOjxkZWZpbmU+UkVMRUFTRQorIworIyBJZiAnd2hhdCcgaXMgJ3JlZmluZWQnIHJldHVybnMgY29udGV4dCByZWZpbmVkIHdpdGggbmV3IHJlcXVpcmVtZW50cy4gSWYKKyMgJ3doYXQnIGlzICdhZGRlZCcgcmV0dXJucyBqdXN0IHRoZSByZXF1aXJlbWVudHMgdG8gYmUgYXBwbGllZC4KKyMKK3J1bGUgZXZhbHVhdGUtcmVxdWlyZW1lbnRzICggcmVxdWlyZW1lbnRzIDogY29udGV4dCA6IHdoYXQgKQoreworICAgICMgQXBwbHkgbm9uLWNvbmRpdGlvbmFsIHJlcXVpcmVtZW50cy4gSXQgaXMgcG9zc2libGUgdGhhdCBmdXJ0aGVyCisgICAgIyBjb25kaXRpb25hbCByZXF1aXJlbWVudCBjaGFuZ2UgYSB2YWx1ZSBzZXQgYnkgbm9uLWNvbmRpdGlvbmFsCisgICAgIyByZXF1aXJlbWVudHMuIEZvciBleGFtcGxlOgorICAgICMKKyAgICAjICAgIGV4ZSBhIDogYS5jcHAgOiA8dGhyZWFkaW5nPnNpbmdsZSA8dG9vbHNldD5mb286PHRocmVhZGluZz5tdWx0aSA7CisgICAgIworICAgICMgSSBhbSBub3Qgc3VyZSBpZiB0aGlzIHNob3VsZCBiZSBhbiBlcnJvciwgb3Igbm90LCBlc3BlY2lhbGx5IGdpdmVuIHRoYXQKKyAgICAjCisgICAgIyAgICA8dGhyZWFkaW5nPnNpbmdsZQorICAgICMKKyAgICAjIG1pZ2h0IGNvbWUgZnJvbSBwcm9qZWN0J3MgcmVxdWlyZW1lbnRzLgorCisgICAgbG9jYWwgdW5jb25kaXRpb25hbCA9IFsgZmVhdHVyZS5leHBhbmQgWyAkKHJlcXVpcmVtZW50cykubm9uLWNvbmRpdGlvbmFsIF0gXQorICAgICAgICA7CisKKyAgICBsb2NhbCByYXcgPSBbICQoY29udGV4dCkucmF3IF0gOworICAgIHJhdyA9IFsgcHJvcGVydHkucmVmaW5lICQocmF3KSA6ICQodW5jb25kaXRpb25hbCkgXSA7CisKKyAgICAjIFdlIGhhdmUgY29sbGVjdGVkIHByb3BlcnRpZXMgdGhhdCBzdXJlbHkgbXVzdCBiZSBwcmVzZW50IGluIGNvbW1vbgorICAgICMgcHJvcGVydGllcy4gV2Ugbm93IHRyeSB0byBmaWd1cmUgb3V0IHdoYXQgb3RoZXIgcHJvcGVydGllcyBzaG91bGQgYmUgYWRkZWQKKyAgICAjIGluIG9yZGVyIHRvIHNhdGlzZnkgcnVsZXMgKDQpLSg2KSBmcm9tIHRoZSBkb2NzLgorCisgICAgbG9jYWwgY29uZGl0aW9uYWxzID0gWyAkKHJlcXVpcmVtZW50cykuY29uZGl0aW9uYWwgXSA7CisgICAgIyBUaGUgJ2NvdW50JyB2YXJpYWJsZSBoYXMgb25lIGVsZW1lbnQgZm9yIGVhY2ggY29uZGl0aW9uYWwgZmVhdHVyZSBhbmQgZm9yCisgICAgIyBlYWNoIG9jY3VycmVuY2Ugb2YgJzxpbmRpcmVjdC1jb25kaXRpb25hbD4nIGZlYXR1cmUuIEl0IGlzIHVzZWQgYXMgYSBsb29wCisgICAgIyBjb3VudGVyOiBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGhlIGxvb3AgYmVmb3JlIHdlIHJlbW92ZSBvbmUgZWxlbWVudCBhbmQKKyAgICAjIHRoZSBwcm9wZXJ0eSBzZXQgc2hvdWxkIHN0YWJpbGl6ZSBiZWZvcmUgd2UgYXJlIGRvbmUuIEl0IGlzIGFzc3VtZWQgdGhhdAorICAgICMgI2NvbmRpdGlvbmFscyBpdGVyYXRpb25zIHNob3VsZCBiZSBlbm91Z2ggZm9yIHByb3BlcnRpZXMgdG8gcHJvcGFnYXRlCisgICAgIyBhbG9uZyBjb25kaXRpb25zIGluIGFueSBkaXJlY3Rpb24uCisgICAgbG9jYWwgY291bnQgPSAkKGNvbmRpdGlvbmFscykgWyAkKHJlcXVpcmVtZW50cykuZ2V0IDxjb25kaXRpb25hbD4gXQorICAgICAgICBhbmQtb25jZS1tb3JlIDsKKworICAgIGxvY2FsIGFkZGVkLXJlcXVpcmVtZW50cyA7CisKKyAgICBsb2NhbCBjdXJyZW50ID0gJChyYXcpIDsKKworICAgICMgSXQgaXMgYXNzdW1lZCB0aGF0IG9yZGluYXJ5IGNvbmRpdGlvbmFsIHJlcXVpcmVtZW50cyBjYW4gbm90IGFkZAorICAgICMgPGNvbmRpdGlvbmFsPiBwcm9wZXJ0aWVzIChhLmsuYS4gaW5kaXJlY3QgY29uZGl0aW9uYWwgcHJvcGVydGllcyksIGFuZAorICAgICMgdGhhdCBydWxlcyByZWZlcnJlZCB0byBieSA8Y29uZGl0aW9uYWw+IHByb3BlcnRpZXMgY2FuIG5vdCBhZGQgbmV3CisgICAgIyA8Y29uZGl0aW9uYWw+IHByb3BlcnRpZXMuIFNvIHRoZSBsaXN0IG9mIGluZGlyZWN0IGNvbmRpdGlvbmFscyBkb2VzIG5vdAorICAgICMgY2hhbmdlLgorICAgIGxvY2FsIGluZGlyZWN0ID0gWyAkKHJlcXVpcmVtZW50cykuZ2V0IDxjb25kaXRpb25hbD4gXSA7CisgICAgaW5kaXJlY3QgPSBbIE1BVENIIF5AKC4qKSA6ICQoaW5kaXJlY3QpIF0gOworCisgICAgbG9jYWwgb2sgOworICAgIHdoaWxlICQoY291bnQpCisgICAgeworICAgICAgICAjIEV2YWx1YXRlIGNvbmRpdGlvbmFscyBpbiBjb250ZXh0IG9mIGN1cnJlbnQgcHJvcGVydGllcy4KKyAgICAgICAgbG9jYWwgZSA9IFsgcHJvcGVydHkuZXZhbHVhdGUtY29uZGl0aW9uYWxzLWluLWNvbnRleHQgJChjb25kaXRpb25hbHMpIDoKKyAgICAgICAgICAgICQoY3VycmVudCkgXSA7CisKKyAgICAgICAgIyBFdmFsdWF0ZSBpbmRpcmVjdCBjb25kaXRpb25hbHMuCisgICAgICAgIGZvciBsb2NhbCBpIGluICQoaW5kaXJlY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHQgPSBbIGN1cnJlbnQgXSA7CisgICAgICAgICAgICBsb2NhbCBwID0gWyAkKHQpLnByb2plY3QgXSA7CisgICAgICAgICAgICBsb2NhbCBuZXcgPSBbIGluZGlyZWN0LmNhbGwgJChpKSAkKGN1cnJlbnQpIF0gOworICAgICAgICAgICAgZSArPSBbIHByb3BlcnR5LnRyYW5zbGF0ZS1wYXRocyAkKG5ldykgOiBbICQocCkubG9jYXRpb24gXSBdIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICQoZSkgPSAkKGFkZGVkLXJlcXVpcmVtZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgIyBJZiB3ZSBnb3QgdGhlIHNhbWUgcmVzdWx0LCB3ZSBoYXZlIGZvdW5kIHRoZSBmaW5hbCBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgY291bnQgPSA7CisgICAgICAgICAgICBvayA9IHRydWUgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgIyBPb3BzLCBjb25kaXRpb25hbCBldmFsdWF0aW9uIHJlc3VsdHMgaGF2ZSBjaGFuZ2VkLiBBbHNvICdjdXJyZW50JworICAgICAgICAgICAgIyBjb250YWlucyBsZWZ0b3ZlcnMgZnJvbSBhIHByZXZpb3VzIGV2YWx1YXRpb24uIFJlY29tcHV0ZSAnY3VycmVudCcKKyAgICAgICAgICAgICMgdXNpbmcgaW5pdGlhbCBwcm9wZXJ0aWVzIGFuZCBjb25kaXRpb25hbCByZXF1aXJlbWVudHMuCisgICAgICAgICAgICBhZGRlZC1yZXF1aXJlbWVudHMgPSAkKGUpIDsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBbIHByb3BlcnR5LnJlZmluZSAkKHJhdykgOiBbIGZlYXR1cmUuZXhwYW5kICQoZSkgXSBdIDsKKyAgICAgICAgfQorICAgICAgICBjb3VudCA9ICQoY291bnRbMi1dKSA7CisgICAgfQorICAgIGlmICEgJChvaykKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgQ2FuIG5vdCBldmFsdWF0ZSBjb25kaXRpb25hbCBwcm9wZXJ0aWVzICQoY29uZGl0aW9uYWxzKSA7CisgICAgfQorCisgICAgaWYgJCh3aGF0KSA9IGFkZGVkCisgICAgeworICAgICAgICByZXR1cm4gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQodW5jb25kaXRpb25hbCkgJChhZGRlZC1yZXF1aXJlbWVudHMpIF0gOworICAgIH0KKyAgICBlbHNlIGlmICQod2hhdCkgPSByZWZpbmVkCisgICAgeworICAgICAgICByZXR1cm4gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQoY3VycmVudCkgXSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgIkludmFsaWQgdmFsdWUgb2YgdGhlICd3aGF0JyBwYXJhbWV0ZXIuIiA7CisgICAgfQorfQorCisKK3J1bGUgY29tbW9uLXByb3BlcnRpZXMyICggYnVpbGQtcmVxdWVzdCByZXF1aXJlbWVudHMgKQoreworICAgICMgVGhpcyBndWFyYW50ZWVzIHRoYXQgZGVmYXVsdCBwcm9wZXJ0aWVzIGFyZSBwcmVzZW50IGluIHRoZSByZXN1bHQsIHVubGVzcworICAgICMgdGhleSBhcmUgb3ZlcnJpZGVuIGJ5IHNvbWUgcmVxdWlyZW1lbnQuIEZJWE1FOiBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQKKyAgICAjIHdlIGhhdmUgYWRkZWQgPGZvbz5iYXIsIHdoaWNoIGlzIGNvbXBvc2l0ZSBhbmQgZXhwYW5kcyB0byA8Zm9vMj5iYXIyLCBidXQKKyAgICAjIGRlZmF1bHQgdmFsdWUgb2YgPGZvbzI+IGlzIG5vdCBiYXIyLCBpbiB3aGljaCBjYXNlIGl0IGlzIG5vdCBjbGVhciB3aGF0IHRvCisgICAgIyBkby4KKyAgICAjCisgICAgYnVpbGQtcmVxdWVzdCA9IFsgJChidWlsZC1yZXF1ZXN0KS5hZGQtZGVmYXVsdHMgXSA7CisgICAgIyBGZWF0dXJlcyBhZGRlZCBieSAnYWRkLWRlZmF1bHRzJyBjYW4gYmUgY29tcG9zaXRlIGFuZCBleHBhbmQgdG8gZmVhdHVyZXMKKyAgICAjIHdpdGhvdXQgZGVmYXVsdCB2YWx1ZXMgLS0gd2hpY2ggdGhlcmVmb3JlIGhhdmUgbm90IGJlZW4gYWRkZWQgeWV0LiBJdAorICAgICMgY291bGQgYmUgY2xlYXJlci9mYXN0ZXIgdG8gZXhwYW5kIG9ubHkgbmV3bHkgYWRkZWQgcHJvcGVydGllcyBidXQgdGhhdCBpcworICAgICMgbm90IGNyaXRpY2FsLgorICAgIGJ1aWxkLXJlcXVlc3QgPSBbICQoYnVpbGQtcmVxdWVzdCkuZXhwYW5kIF0gOworCisgICAgcmV0dXJuIFsgZXZhbHVhdGUtcmVxdWlyZW1lbnRzICQocmVxdWlyZW1lbnRzKSA6ICQoYnVpbGQtcmVxdWVzdCkgOgorICAgICAgICByZWZpbmVkIF0gOworfQorCisKK3J1bGUgcHVzaC10YXJnZXQgKCB0YXJnZXQgKQoreworICAgIC50YXJnZXRzID0gJCh0YXJnZXQpICQoLnRhcmdldHMpIDsKK30KKworcnVsZSBwb3AtdGFyZ2V0ICggKQoreworICAgIC50YXJnZXRzID0gJCgudGFyZ2V0c1syLV0pIDsKK30KKworIyBSZXR1cm4gdGhlIG1ldGF0YXJnZXQgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgZ2VuZXJhdGVkLgorcnVsZSBjdXJyZW50ICggKQoreworICAgIHJldHVybiAkKC50YXJnZXRzWzFdKSA7Cit9CisKKworIyBJbXBsZW1lbnRzIHRoZSBtb3N0IHN0YW5kYXJkIHdheSBvZiBjb25zdHJ1Y3RpbmcgbWFpbiB0YXJnZXQgYWx0ZXJuYXRpdmUgZnJvbQorIyBzb3VyY2VzLiBBbGxvd3Mgc291cmNlcyB0byBiZSBlaXRoZXIgZmlsZSBvciBvdGhlciBtYWluIHRhcmdldCBhbmQgaGFuZGxlcworIyBnZW5lcmF0aW9uIG9mIHRob3NlIGRlcGVuZGVuY3kgdGFyZ2V0cy4KKyMKK2NsYXNzIGJhc2ljLXRhcmdldCA6IGFic3RyYWN0LXRhcmdldAoreworICAgIGltcG9ydCBidWlsZC1yZXF1ZXN0IDsKKyAgICBpbXBvcnQgYnVpbGQtc3lzdGVtIDsKKyAgICBpbXBvcnQgImNsYXNzIiA6IG5ldyA7CisgICAgaW1wb3J0IGZlYXR1cmUgOworICAgIGltcG9ydCBwcm9wZXJ0eSA7CisgICAgaW1wb3J0IHByb3BlcnR5LXNldCA7CisgICAgaW1wb3J0IHNlcXVlbmNlIDsKKyAgICBpbXBvcnQgc2V0IDsKKyAgICBpbXBvcnQgdGFyZ2V0cyA7CisgICAgaW1wb3J0IHZpcnR1YWwtdGFyZ2V0IDsKKworICAgIHJ1bGUgX19pbml0X18gKCBuYW1lIDogcHJvamVjdCA6IHNvdXJjZXMgKiA6IHJlcXVpcmVtZW50cyAqIDoKKyAgICAgICAgZGVmYXVsdC1idWlsZCAqIDogdXNhZ2UtcmVxdWlyZW1lbnRzICogKQorICAgIHsKKyAgICAgICAgYWJzdHJhY3QtdGFyZ2V0Ll9faW5pdF9fICQobmFtZSkgOiAkKHByb2plY3QpIDsKKworICAgICAgICBzZWxmLnNvdXJjZXMgPSAkKHNvdXJjZXMpIDsKKyAgICAgICAgaWYgISAkKHJlcXVpcmVtZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgcmVxdWlyZW1lbnRzID0gWyBwcm9wZXJ0eS1zZXQuZW1wdHkgXSA7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi5yZXF1aXJlbWVudHMgPSAkKHJlcXVpcmVtZW50cykgOworICAgICAgICBpZiAhICQoZGVmYXVsdC1idWlsZCkKKyAgICAgICAgeworICAgICAgICAgICAgZGVmYXVsdC1idWlsZCA9IFsgcHJvcGVydHktc2V0LmVtcHR5IF0gOworICAgICAgICB9CisgICAgICAgIHNlbGYuZGVmYXVsdC1idWlsZCA9ICQoZGVmYXVsdC1idWlsZCkgOworICAgICAgICBpZiAhICQodXNhZ2UtcmVxdWlyZW1lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICB1c2FnZS1yZXF1aXJlbWVudHMgPSBbIHByb3BlcnR5LXNldC5lbXB0eSBdIDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLnVzYWdlLXJlcXVpcmVtZW50cyA9ICQodXNhZ2UtcmVxdWlyZW1lbnRzKSA7CisKKyAgICAgICAgaWYgJChzb3VyY2VzOkcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOiB1c2VyLWVycm9yIDogZXJyb3JzLnVzZXItZXJyb3IgOworICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgcHJvcGVydGllcyBmb3VuZCAiaW4iIHRoZSAnc291cmNlcycgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgImZvciIgWyBmdWxsLW5hbWUgXSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBydWxlIGFsd2F5cyAoICkKKyAgICB7CisgICAgICAgIHNlbGYuYWx3YXlzID0gMSA7CisgICAgfQorCisgICAgIyBSZXR1cm5zIHRoZSBsaXN0IG9mIGFic3RyYWN0LXRhcmdldHMgd2hpY2ggYXJlIHVzZWQgYXMgc291cmNlcy4gVGhlIGV4dHJhCisgICAgIyBwcm9wZXJ0aWVzIHNwZWNpZmllZCBmb3Igc291cmNlcyBhcmUgbm90IHJlcHJlc2VudGVkLiBUaGUgb25seSB1c2VyIGZvcgorICAgICMgdGhpcyBydWxlIGF0IHRoZSBtb21lbnQgaXMgdGhlICItLWR1bXAtdGVzdHMiIGZlYXR1cmUgb2YgdGhlIHRlc3Qgc3lzdGVtLgorICAgICMKKyAgICBydWxlIHNvdXJjZXMgKCApCisgICAgeworICAgICAgICBpZiAhICQoc2VsZi5zb3VyY2UtdGFyZ2V0cykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIGxvY2FsIHMgaW4gJChzZWxmLnNvdXJjZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZi5zb3VyY2UtdGFyZ2V0cyArPSBbIHRhcmdldHMucmVzb2x2ZS1yZWZlcmVuY2UgJChzKSA6CisgICAgICAgICAgICAgICAgICAgICQoc2VsZi5wcm9qZWN0KSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChzZWxmLnNvdXJjZS10YXJnZXRzKSA7CisgICAgfQorCisgICAgcnVsZSByZXF1aXJlbWVudHMgKCApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLnJlcXVpcmVtZW50cykgOworICAgIH0KKworICAgIHJ1bGUgZGVmYXVsdC1idWlsZCAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYuZGVmYXVsdC1idWlsZCkgOworICAgIH0KKworICAgICMgUmV0dXJucyB0aGUgYWx0ZXJuYXRpdmUgY29uZGl0aW9uIGZvciB0aGlzIGFsdGVybmF0aXZlLCBpZiB0aGUgY29uZGl0aW9uCisgICAgIyBpcyBzYXRpc2ZpZWQgYnkgJ3Byb3BlcnR5LXNldCcuCisgICAgIworICAgIHJ1bGUgbWF0Y2ggKCBwcm9wZXJ0eS1zZXQgZGVidWcgPyApCisgICAgeworICAgICAgICAjIFRoZSBjb25kaXRpb24gaXMgY29tcG9zZWQgb2YgYWxsIGJhc2Ugbm9uLWNvbmRpdGlvbmFsIHByb3BlcnRpZXMuIEl0CisgICAgICAgICMgaXMgbm90IGNsZWFyIGlmIHdlIHNob3VsZCBleHBhbmQgJ3NlbGYucmVxdWlyZW1lbnRzJyBvciBub3QuIEZvciBvbmUKKyAgICAgICAgIyB0aGluZywgaXQgd291bGQgYmUgbmljZSB0byBiZSBhYmxlIHRvIHB1dAorICAgICAgICAjICAgIDx0b29sc2V0Pm1zdmMtNi4wCisgICAgICAgICMgaW4gcmVxdWlyZW1lbnRzLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgaGF2ZSA8dmFyaWFudD5yZWxlYXNlIGFzIGEKKyAgICAgICAgIyBjb25kaXRpb24gaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byByZXF1aXJlIDxvcHRpbWl6YXRpb24+ZnVsbCB0byBiZQorICAgICAgICAjIGluIHRoZSBidWlsZCByZXF1ZXN0IGp1c3QgdG8gc2VsZWN0IHRoaXMgdmFyaWFudC4KKyAgICAgICAgbG9jYWwgYmNvbmRpdGlvbiA9IFsgJChzZWxmLnJlcXVpcmVtZW50cykuYmFzZSBdIDsKKyAgICAgICAgbG9jYWwgY2NvbmRpdGlvbiA9IFsgJChzZWxmLnJlcXVpcmVtZW50cykuY29uZGl0aW9uYWwgXSA7CisgICAgICAgIGxvY2FsIGNvbmRpdGlvbiA9IFsgc2V0LmRpZmZlcmVuY2UgJChiY29uZGl0aW9uKSA6ICQoY2NvbmRpdGlvbikgXSA7CisgICAgICAgIGlmICQoZGVidWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gIiAgICBuZXh0IGFsdGVybmF0aXZlOiByZXF1aXJlZCBwcm9wZXJ0aWVzOiIKKyAgICAgICAgICAgICAgICAkKGNvbmRpdGlvbjpFPShlbXB0eSkpIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICQoY29uZGl0aW9uKSBpbiBbICQocHJvcGVydHktc2V0KS5yYXcgXQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKGRlYnVnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIiAgICAgICAgbWF0Y2hlZCIgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICQoY29uZGl0aW9uKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKGRlYnVnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIiAgICAgICAgbm90IG1hdGNoZWQiIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuby1tYXRjaCA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFRha2VzIGEgdGFyZ2V0IHJlZmVyZW5jZSwgd2hpY2ggbWlnaHQgYmUgZWl0aGVyIHRhcmdldCBpZCBvciBhIGRlcGVuZGVuY3kKKyAgICAjIHByb3BlcnR5LCBhbmQgZ2VuZXJhdGVzIHRoYXQgdGFyZ2V0IHVzaW5nICdwcm9wZXJ0eS1zZXQnIGFzIGEgYnVpbGQKKyAgICAjIHJlcXVlc3QuCisgICAgIworICAgICMgVGhlIHJlc3VsdHMgYXJlIGFkZGVkIHRvIHRoZSB2YXJpYWJsZSBjYWxsZWQgJ3Jlc3VsdC12YXInLiBVc2FnZQorICAgICMgcmVxdWlyZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUgdmFyaWFibGUgY2FsbGVkICd1c2FnZS1yZXF1aXJlbWVudHMtdmFyJy4KKyAgICAjCisgICAgcnVsZSBnZW5lcmF0ZS1kZXBlbmRlbmNpZXMgKCBkZXBlbmRlbmNpZXMgKiA6IHByb3BlcnR5LXNldCA6IHJlc3VsdC12YXIKKyAgICAgICAgdXNhZ2UtcmVxdWlyZW1lbnRzLXZhciApCisgICAgeworICAgICAgICBmb3IgbG9jYWwgZGVwZW5kZW5jeSBpbiAkKGRlcGVuZGVuY2llcykKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgZ3Jpc3QgPSAkKGRlcGVuZGVuY3k6RykgOworICAgICAgICAgICAgbG9jYWwgaWQgPSAkKGRlcGVuZGVuY3k6Rz0pIDsKKyAgICAgICAgICAgIGxvY2FsIHJlc3VsdCA9IFsgdGFyZ2V0cy5nZW5lcmF0ZS1mcm9tLXJlZmVyZW5jZSAkKGlkKSA6CisgICAgICAgICAgICAgICAgJChzZWxmLnByb2plY3QpIDogJChwcm9wZXJ0eS1zZXQpIF0gOworCisgICAgICAgICAgICAkKHJlc3VsdC12YXIpICs9ICQocmVzdWx0WzItXTpHPSQoZ3Jpc3QpKSA7CisgICAgICAgICAgICAkKHVzYWdlLXJlcXVpcmVtZW50cy12YXIpICs9IFsgJChyZXN1bHRbMV0pLnJhdyBdIDsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgRGV0ZXJtaW5lcyBmaW5hbCBidWlsZCBwcm9wZXJ0aWVzLCBnZW5lcmF0ZXMgc291cmNlcywgYW5kIGNhbGxzCisgICAgIyAnY29uc3RydWN0Jy4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBvdmVycmlkZGVuLgorICAgICMKKyAgICBydWxlIGdlbmVyYXRlICggcHJvcGVydHktc2V0ICkKKyAgICB7CisgICAgICAgIGlmIFsgbW9kdWxlcy5wZWVrIDogLmRlYnVnLWJ1aWxkaW5nIF0KKyAgICAgICAgeworICAgICAgICAgICAgRUNITyA7CisgICAgICAgICAgICBsb2NhbCBmbiA9IFsgZnVsbC1uYW1lIF0gOworICAgICAgICAgICAgRUNITyBbIHRhcmdldHMuaW5kZW50IF0gIkJ1aWxkaW5nIHRhcmdldCAnJChmbiknIiA7CisgICAgICAgICAgICB0YXJnZXRzLmluY3JlYXNlLWluZGVudCA7CisgICAgICAgICAgICBFQ0hPIFsgdGFyZ2V0cy5pbmRlbnQgXSBCdWlsZCByZXF1ZXN0OiAkKHByb3BlcnR5LXNldCkKKyAgICAgICAgICAgICAgICBbICQocHJvcGVydHktc2V0KS5yYXcgXSA7CisgICAgICAgICAgICBsb2NhbCBjZiA9IFsgYnVpbGQtc3lzdGVtLmNvbW1hbmQtbGluZS1mcmVlLWZlYXR1cmVzIF0gOworICAgICAgICAgICAgRUNITyBbIHRhcmdldHMuaW5kZW50IF0gQ29tbWFuZCBsaW5lIGZyZWUgZmVhdHVyZXM6IFsgJChjZikucmF3IF0gOworICAgICAgICAgICAgRUNITyBbIHRhcmdldHMuaW5kZW50IF0gVGFyZ2V0IHJlcXVpcmVtZW50czoKKyAgICAgICAgICAgICAgICBbICQoc2VsZi5yZXF1aXJlbWVudHMpLnJhdyBdIDsKKyAgICAgICAgfQorICAgICAgICB0YXJnZXRzLnB1c2gtdGFyZ2V0ICQoX19uYW1lX18pIDsKKworICAgICAgICAjIEFwcGx5IGZyZWUgZmVhdHVyZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiBJZiB1c2VyIHNhaWQKKyAgICAgICAgIyAgIGRlZmluZT1GT08KKyAgICAgICAgIyBoZSBtb3N0IGxpa2VseSB3YW50cyB0aGlzIGRlZmluZSB0byBiZSBzZXQgZm9yIGFsbCBjb21waWxlcy4KKyAgICAgICAgIyBNYWtlIGl0IGJlZm9yZSBjaGVjayBmb3IgYWxyZWFkeSBidWlsdC4KKyAgICAgICAgcHJvcGVydHktc2V0ID0gWyAkKHByb3BlcnR5LXNldCkucmVmaW5lCisgICAgICAgICAgICBbIGJ1aWxkLXN5c3RlbS5jb21tYW5kLWxpbmUtZnJlZS1mZWF0dXJlcyBdIF0gOworCisgICAgICAgIGlmICEgJChzZWxmLmdlbmVyYXRlZC4kKHByb3BlcnR5LXNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHJwcm9wZXJ0aWVzID0gWyB0YXJnZXRzLmNvbW1vbi1wcm9wZXJ0aWVzICQocHJvcGVydHktc2V0KQorICAgICAgICAgICAgICAgICQoc2VsZi5yZXF1aXJlbWVudHMpIF0gOworCisgICAgICAgICAgICBpZiBbIG1vZHVsZXMucGVlayA6IC5kZWJ1Zy1idWlsZGluZyBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyA7CisgICAgICAgICAgICAgICAgRUNITyBbIHRhcmdldHMuaW5kZW50IF0gIkNvbW1vbiBwcm9wZXJ0aWVzOiAiCisgICAgICAgICAgICAgICAgICAgIFsgJChycHJvcGVydGllcykucmF3IF0gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICQocnByb3BlcnRpZXNbMV0pICE9ICJAZXJyb3IiICkgJiYgKCBbICQocnByb3BlcnRpZXMpLmdldAorICAgICAgICAgICAgICAgIDxidWlsZD4gXSAhPSBubyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWwgc291cmNlLXRhcmdldHMgOworICAgICAgICAgICAgICAgIGxvY2FsIHByb3BlcnRpZXMgPSBbICQocnByb3BlcnRpZXMpLm5vbi1kZXBlbmRlbmN5IF0gOworICAgICAgICAgICAgICAgIGxvY2FsIHVzYWdlLXJlcXVpcmVtZW50cyA7CisKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZS1kZXBlbmRlbmNpZXMgWyAkKHJwcm9wZXJ0aWVzKS5kZXBlbmRlbmN5IF0gOgorICAgICAgICAgICAgICAgICAgICAkKHJwcm9wZXJ0aWVzKSA6IHByb3BlcnRpZXMgdXNhZ2UtcmVxdWlyZW1lbnRzIDsKKworICAgICAgICAgICAgICAgIGdlbmVyYXRlLWRlcGVuZGVuY2llcyAkKHNlbGYuc291cmNlcykgOiAkKHJwcm9wZXJ0aWVzKSA6CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS10YXJnZXRzIHVzYWdlLXJlcXVpcmVtZW50cyA7CisKKyAgICAgICAgICAgICAgICBpZiBbIG1vZHVsZXMucGVlayA6IC5kZWJ1Zy1idWlsZGluZyBdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFQ0hPIDsKKyAgICAgICAgICAgICAgICAgICAgRUNITyBbIHRhcmdldHMuaW5kZW50IF0gIlVzYWdlIHJlcXVpcmVtZW50cyBmb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYubmFtZSkiOiAiICQodXNhZ2UtcmVxdWlyZW1lbnRzKSA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnByb3BlcnRpZXMgPSBbIHByb3BlcnR5LXNldC5jcmVhdGUgJChwcm9wZXJ0aWVzKQorICAgICAgICAgICAgICAgICAgICAkKHVzYWdlLXJlcXVpcmVtZW50cykgXSA7CisgICAgICAgICAgICAgICAgdXNhZ2UtcmVxdWlyZW1lbnRzID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQodXNhZ2UtcmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgICAgICAgICBdIDsKKworICAgICAgICAgICAgICAgIGlmIFsgbW9kdWxlcy5wZWVrIDogLmRlYnVnLWJ1aWxkaW5nIF0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVDSE8gWyB0YXJnZXRzLmluZGVudCBdICJCdWlsZCBwcm9wZXJ0aWVzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICBbICQocnByb3BlcnRpZXMpLnJhdyBdIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsb2NhbCBleHRyYSA9IFsgJChycHJvcGVydGllcykuZ2V0IDxzb3VyY2U+IF0gOworICAgICAgICAgICAgICAgIHNvdXJjZS10YXJnZXRzICs9ICQoZXh0cmE6Rz0pIDsKKyAgICAgICAgICAgICAgICAjIFdlIG1pZ2h0IGdldCBkdXBsaWNhdGUgc291cmNlcywgZm9yIGV4YW1wbGUgaWYgd2UgbGluayB0byB0d28KKyAgICAgICAgICAgICAgICAjIGxpYnJhcmllcyBoYXZpbmcgdGhlIHNhbWUgPGxpYnJhcnk+IHVzYWdlIHJlcXVpcmVtZW50LiBVc2UKKyAgICAgICAgICAgICAgICAjIHN0YWJsZSBzb3J0LCBzaW5jZSBmb3Igc29tZSB0YXJnZXRzIHRoZSBvcmRlciBpcyBpbXBvcnRhbnQsCisgICAgICAgICAgICAgICAgIyBlLmcuIFJVTl9QWSB0YXJnZXRzIG5lZWQgYSBweXRob24gc291cmNlIHRvIGNvbWUgZmlyc3QuCisgICAgICAgICAgICAgICAgc291cmNlLXRhcmdldHMgPSBbIHNlcXVlbmNlLnVuaXF1ZSAkKHNvdXJjZS10YXJnZXRzKSA6IHN0YWJsZSBdCisgICAgICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgICAgIGxvY2FsIHJlc3VsdCA9IFsgY29uc3RydWN0ICQoc2VsZi5uYW1lKSA6ICQoc291cmNlLXRhcmdldHMpIDoKKyAgICAgICAgICAgICAgICAgICAgJChycHJvcGVydGllcykgXSA7CisKKyAgICAgICAgICAgICAgICBpZiAkKHJlc3VsdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsIGd1ciA9ICQocmVzdWx0WzFdKSA7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICQocmVzdWx0WzItXSkgOworCisgICAgICAgICAgICAgICAgICAgIGlmICQoc2VsZi5hbHdheXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb2NhbCB0IGluICQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodCkuYWx3YXlzIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxvY2FsIHMgPSBbIGNyZWF0ZS1zdWJ2YXJpYW50ICQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgOiBbIHZpcnR1YWwtdGFyZ2V0LnJlY2VudC10YXJnZXRzIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogJChwcm9wZXJ0eS1zZXQpIDogJChzb3VyY2UtdGFyZ2V0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIDogJChycHJvcGVydGllcykgOiAkKHVzYWdlLXJlcXVpcmVtZW50cykgXSA7CisgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwtdGFyZ2V0LmNsZWFyLXJlY2VudC10YXJnZXRzIDsKKworICAgICAgICAgICAgICAgICAgICBsb2NhbCB1ciA9IFsgY29tcHV0ZS11c2FnZS1yZXF1aXJlbWVudHMgJChzKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgdXIgPSBbICQodXIpLmFkZCAkKGd1cikgXSA7CisgICAgICAgICAgICAgICAgICAgICQocykuc2V0LXVzYWdlLXJlcXVpcmVtZW50cyAkKHVyKSA7CisgICAgICAgICAgICAgICAgICAgIGlmIFsgbW9kdWxlcy5wZWVrIDogLmRlYnVnLWJ1aWxkaW5nIF0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRUNITyBbIHRhcmdldHMuaW5kZW50IF0gIlVzYWdlIHJlcXVpcmVtZW50cyBmcm9tIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5uYW1lKSI6ICIgWyAkKHVyKS5yYXcgXSA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzZWxmLmdlbmVyYXRlZC4kKHByb3BlcnR5LXNldCkgPSAkKHVyKSAkKHJlc3VsdCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAkKHJwcm9wZXJ0aWVzWzFdKSA9ICJAZXJyb3IiCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFQ0hPIFsgdGFyZ2V0cy5pbmRlbnQgXSAiU2tpcHBpbmcgYnVpbGQgb2Y6IiBbIGZ1bGwtbmFtZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbXB1dGUgY29tbW9uIHByb3BlcnRpZXMiIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiBbICQocnByb3BlcnRpZXMpLmdldCA8YnVpbGQ+IF0gPSBubworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIyBJZiB3ZSBqdXN0IHNlZSA8YnVpbGQ+bm8sIHdlIGNhbm5vdCBwcm9kdWNlIGFueSByZWFzb25hYmxlCisgICAgICAgICAgICAgICAgICAgICMgZGlhZ25vc3RpY3MuIFRoZSBjb2RlIHRoYXQgYWRkcyB0aGlzIHByb3BlcnR5IGlzIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICMgdG8gZXhwbGFpbiB3aHkgYSB0YXJnZXQgaXMgbm90IGJ1aWx0LCBmb3IgZXhhbXBsZSB1c2luZworICAgICAgICAgICAgICAgICAgICAjIHRoZSBjb25maWd1cmUubG9nLWNvbXBvbmVudC1jb25maWd1cmF0aW9uIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFQ0hPIFsgdGFyZ2V0cy5pbmRlbnQgXSAiU2tpcHBpbmcgYnVpbGQgb2Y6ICIgWyBmdWxsLW5hbWUgXQorICAgICAgICAgICAgICAgICAgICAgICAgIiB1bmtub3duIHJlYXNvbiIgOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgV2UgYXJlIGhlcmUgZWl0aGVyIGJlY2F1c2UgdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IgY29tcHV0aW5nCisgICAgICAgICAgICAgICAgIyBwcm9wZXJ0aWVzIG9yIHRoZXJlIGlzIDxidWlsZD5ubyBpbiBwcm9wZXJ0aWVzLiBJbiB0aGUgbGF0dGVyCisgICAgICAgICAgICAgICAgIyBjYXNlIHdlIGRvIG5vdCB3YW50IGFueSBkaWFnbm9zdGljLiBJbiB0aGUgZm9ybWVyIGNhc2UsIHdlCisgICAgICAgICAgICAgICAgIyBuZWVkIGRpYWdub3N0aWNzLiBGSVhNRQorCisgICAgICAgICAgICAgICAgIyBJZiB0aGlzIHRhcmdldCBmYWlscyB0byBidWlsZCwgYWRkIDxidWlsZD5ubyB0byBwcm9wZXJ0aWVzIHRvCisgICAgICAgICAgICAgICAgIyBjYXVzZSBhbnkgcGFyZW50IHRhcmdldCB0byBmYWlsIHRvIGJ1aWxkLiBFeGNlcHQgdGhhdCBpdAorICAgICAgICAgICAgICAgICMgLSBkb2VzIG5vdCB3b3JrIG5vdywgc2luY2Ugd2UgY2hlY2sgZm9yIDxidWlsZD5ubyBvbmx5IGluCisgICAgICAgICAgICAgICAgIyAgIGNvbW1vbiBwcm9wZXJ0aWVzLCBidXQgbm90IGluIHByb3BlcnRpZXMgdGhhdCBjYW1lIGZyb20KKyAgICAgICAgICAgICAgICAjICAgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgIyAtIGl0IGlzIG5vdCBjbGVhciBpZiB0aGF0IGlzIGEgZ29vZCBpZGVhIGFueXdheS4gVGhlIGFsaWFzCisgICAgICAgICAgICAgICAgIyAgIHRhcmdldCwgZm9yIGV4YW1wbGUsIHNob3VsZCBub3QgZmFpbCB0byBidWlsZCBpZiBhCisgICAgICAgICAgICAgICAgIyAgIGRlcGVuZGVuY3kgZmFpbHMuCisgICAgICAgICAgICAgICAgc2VsZi5nZW5lcmF0ZWQuJChwcm9wZXJ0eS1zZXQpID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlIDxidWlsZD5ubworICAgICAgICAgICAgICAgICAgICBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIFsgbW9kdWxlcy5wZWVrIDogLmRlYnVnLWJ1aWxkaW5nIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFQ0hPIFsgdGFyZ2V0cy5pbmRlbnQgXSAiQWxyZWFkeSBidWlsdCIgOworICAgICAgICAgICAgICAgIGxvY2FsIHVyID0gJChzZWxmLmdlbmVyYXRlZC4kKHByb3BlcnR5LXNldCkpIDsKKyAgICAgICAgICAgICAgICB1ciA9ICQodXJbMF0pIDsKKyAgICAgICAgICAgICAgICB0YXJnZXRzLmluY3JlYXNlLWluZGVudCA7CisgICAgICAgICAgICAgICAgRUNITyBbIHRhcmdldHMuaW5kZW50IF0gIlVzYWdlIHJlcXVpcmVtZW50cyBmcm9tIgorICAgICAgICAgICAgICAgICAgICAkKHNlbGYubmFtZSkiOiAiIFsgJCh1cikucmF3IF0gOworICAgICAgICAgICAgICAgIHRhcmdldHMuZGVjcmVhc2UtaW5kZW50IDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRhcmdldHMucG9wLXRhcmdldCA7CisgICAgICAgIHRhcmdldHMuZGVjcmVhc2UtaW5kZW50IDsKKyAgICAgICAgcmV0dXJuICQoc2VsZi5nZW5lcmF0ZWQuJChwcm9wZXJ0eS1zZXQpKSA7CisgICAgfQorCisgICAgIyBHaXZlbiB0aGUgc2V0IG9mIGdlbmVyYXRlZCB0YXJnZXRzLCBhbmQgcmVmaW5lZCBidWlsZCBwcm9wZXJ0aWVzLAorICAgICMgZGV0ZXJtaW5lcyBhbmQgc2V0cyBhcHByb3ByaWF0ZSB1c2FnZSByZXF1aXJlbWVudHMgb24gdGhvc2UgdGFyZ2V0cy4KKyAgICAjCisgICAgcnVsZSBjb21wdXRlLXVzYWdlLXJlcXVpcmVtZW50cyAoIHN1YnZhcmlhbnQgKQorICAgIHsKKyAgICAgICAgbG9jYWwgcnByb3BlcnRpZXMgPSBbICQoc3VidmFyaWFudCkuYnVpbGQtcHJvcGVydGllcyBdIDsKKyAgICAgICAgeHVzYWdlLXJlcXVpcmVtZW50cyA9IFsgdGFyZ2V0cy5ldmFsdWF0ZS1yZXF1aXJlbWVudHMKKyAgICAgICAgICAgICQoc2VsZi51c2FnZS1yZXF1aXJlbWVudHMpIDogJChycHJvcGVydGllcykgOiBhZGRlZCBdIDsKKworICAgICAgICAjIFdlIGdlbmVyYXRlIGFsbCBkZXBlbmRlbmN5IHByb3BlcnRpZXMgYW5kIGFkZCB0aGVtLCBhcyB3ZWxsIGFzIHRoZWlyCisgICAgICAgICMgdXNhZ2UgcmVxdWlyZW1lbnRzLCB0byB0aGUgcmVzdWx0LgorICAgICAgICBsb2NhbCBleHRyYSA7CisgICAgICAgIGdlbmVyYXRlLWRlcGVuZGVuY2llcyBbICQoeHVzYWdlLXJlcXVpcmVtZW50cykuZGVwZW5kZW5jeSBdIDoKKyAgICAgICAgICAgICQocnByb3BlcnRpZXMpIDogZXh0cmEgZXh0cmEgOworCisgICAgICAgIGxvY2FsIHJlc3VsdCA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZQorICAgICAgICAgICAgWyAkKHh1c2FnZS1yZXF1aXJlbWVudHMpLm5vbi1kZXBlbmRlbmN5IF0gJChleHRyYSkgXSA7CisKKyAgICAgICAgIyBQcm9wYWdhdGUgdXNhZ2UgcmVxdWlyZW1lbnRzIHdlIGdvdCBmcm9tIHNvdXJjZXMsIGV4Y2VwdCBmb3IgdGhlCisgICAgICAgICMgPHBjaC1oZWFkZXI+IGFuZCA8cGNoLWZpbGU+IGZlYXR1cmVzLgorICAgICAgICAjCisgICAgICAgICMgVGhhdCBmZWF0dXJlIHNwZWNpZmllcyB3aGljaCBwY2ggZmlsZSB0byB1c2UsIGFuZCBzaG91bGQgYXBwbHkgb25seSB0bworICAgICAgICAjIGRpcmVjdCBkZXBlbmRlbnRzLiBDb25zaWRlcjoKKyAgICAgICAgIworICAgICAgICAjICAgcGNoIHBjaDEgOiAuLi4KKyAgICAgICAgIyAgIGxpYiBsaWIxIDogLi4uLi4gcGNoMSA7CisgICAgICAgICMgICBwY2ggcGNoMiA6CisgICAgICAgICMgICBsaWIgbGliMiA6IHBjaDIgbGliMSA7CisgICAgICAgICMKKyAgICAgICAgIyBIZXJlLCBsaWIyIHNob3VsZCBub3QgZ2V0IDxwY2gtaGVhZGVyPiBwcm9wZXJ0eSBmcm9tIHBjaDEuCisgICAgICAgICMKKyAgICAgICAgIyBFc3NlbnRpYWxseSwgd2hlbiB0aG9zZSB0d28gZmVhdHVyZXMgYXJlIGluIHVzYWdlIHJlcXVpcmVtZW50cywgdGhleQorICAgICAgICAjIGFyZSBwcm9wYWdhdGVkIG9ubHkgdG8gZGlyZWN0IGRlcGVuZGVudHMuIFdlIG1pZ2h0IG5lZWQgYSBtb3JlIGdlbmVyYWwKKyAgICAgICAgIyBtZWNoYW5pc20sIGJ1dCBmb3Igbm93LCBvbmx5IHRob3NlIHR3byBmZWF0dXJlcyBhcmUgc3BlY2lhbC4KKyAgICAgICAgIworICAgICAgICAjIFRPRE8gLSBBY3R1YWxseSB0aGVyZSBhcmUgbW9yZSBwb3NzaWJsZSBjYW5kaWRhdGVzIGxpa2UgZm9yIGluc3RhbmNlCisgICAgICAgICMgd2hlbiBsaXN0aW5nIHN0YXRpYyBsaWJyYXJ5IFggYXMgYSBzb3VyY2UgZm9yIGFub3RoZXIgc3RhdGljIGxpYnJhcnkuCisgICAgICAgICMgVGhlbiBzdGF0aWMgbGlicmFyeSBYIHdpbGwgYmUgYWRkZWQgYXMgYSA8c291cmNlPiBwcm9wZXJ0eSB0byB0aGUKKyAgICAgICAgIyBzZWNvbmQgbGlicmFyeSdzIHVzYWdlIHJlcXVpcmVtZW50cyBidXQgdGhvc2UgcmVxdWlyZW1lbnRzIHNob3VsZCBsYXN0CisgICAgICAgICMgb25seSB1cCB0byB0aGUgZmlyc3QgZXhlY3V0YWJsZSBvciBzaGFyZWQgbGlicmFyeSB0aGF0IGFjdHVhbGx5IGxpbmtzCisgICAgICAgICMgdG8gaXQuCisgICAgICAgIGxvY2FsIHJhdyA9IFsgJChzdWJ2YXJpYW50KS5zb3VyY2VzLXVzYWdlLXJlcXVpcmVtZW50cyBdIDsKKyAgICAgICAgcmF3ID0gWyAkKHJhdykucmF3IF0gOworICAgICAgICByYXcgPSBbIHByb3BlcnR5LmNoYW5nZSAkKHJhdykgOiA8cGNoLWhlYWRlcj4gXSA7CisgICAgICAgIHJhdyA9IFsgcHJvcGVydHkuY2hhbmdlICQocmF3KSA6IDxwY2gtZmlsZT4gXSA7CisgICAgICAgIHJldHVybiBbICQocmVzdWx0KS5hZGQgWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQocmF3KSBdIF0gOworICAgIH0KKworICAgICMgQ3JlYXRlcyBuZXcgc3VidmFyaWFudCBpbnN0YW5jZXMgZm9yICd0YXJnZXRzJy4KKyAgICAjICdyb290LXRhcmdldHMnICAtIHZpcnR1YWwgdGFyZ2V0cyB0byBiZSByZXR1cm5lZCB0byBkZXBlbmRhbnRzCisgICAgIyAnYWxsLXRhcmdldHMnICAgLSB2aXJ0dWFsIHRhcmdldHMgY3JlYXRlZCB3aGlsZSBidWlsZGluZyB0aGlzIG1haW4gdGFyZ2V0CisgICAgIyAnYnVpbGQtcmVxdWVzdCcgLSBwcm9wZXJ0eS1zZXQgaW5zdGFuY2Ugd2l0aCByZXF1ZXN0ZWQgYnVpbGQgcHJvcGVydGllcworICAgICMKKyAgICBsb2NhbCBydWxlIGNyZWF0ZS1zdWJ2YXJpYW50ICggcm9vdC10YXJnZXRzICogOiBhbGwtdGFyZ2V0cyAqIDoKKyAgICAgICAgYnVpbGQtcmVxdWVzdCA6IHNvdXJjZXMgKiA6IHJwcm9wZXJ0aWVzIDogdXNhZ2UtcmVxdWlyZW1lbnRzICkKKyAgICB7CisgICAgICAgIGZvciBsb2NhbCBlIGluICQocm9vdC10YXJnZXRzKQorICAgICAgICB7CisgICAgICAgICAgICAkKGUpLnJvb3QgdHJ1ZSA7CisgICAgICAgIH0KKworICAgICAgICAjIFByb2Nlc3MgYWxsIHZpcnR1YWwgdGFyZ2V0cyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBpZiB0aGlzIG1haW4gdGFyZ2V0CisgICAgICAgICMgaXMgY3JlYXRlZC4KKyAgICAgICAgbG9jYWwgcyA9IFsgbmV3IHN1YnZhcmlhbnQgJChfX25hbWVfXykgOiAkKGJ1aWxkLXJlcXVlc3QpIDogJChzb3VyY2VzKSA6CisgICAgICAgICAgICAkKHJwcm9wZXJ0aWVzKSA6ICQodXNhZ2UtcmVxdWlyZW1lbnRzKSA6ICQoYWxsLXRhcmdldHMpIF0gOworICAgICAgICBmb3IgbG9jYWwgdiBpbiAkKGFsbC10YXJnZXRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAhIFsgJCh2KS5jcmVhdGluZy1zdWJ2YXJpYW50IF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkKHYpLmNyZWF0aW5nLXN1YnZhcmlhbnQgJChzKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQocykgOworICAgIH0KKworICAgICMgQ29uc3RydWN0cyB2aXJ0dWFsIHRhcmdldHMgZm9yIHRoaXMgYWJzdHJhY3QgdGFyZ2V0IGFuZCB0aGUgZGVwZW5kZW5jeQorICAgICMgZ3JhcGguIFJldHVybnMgYSB1c2FnZS1yZXF1aXJlbWVudHMgcHJvcGVydHktc2V0IGFuZCBhIGxpc3Qgb2YgdmlydHVhbAorICAgICMgdGFyZ2V0cy4gU2hvdWxkIGJlIG92ZXJyaWRlbiBpbiBkZXJpdmVkIGNsYXNzZXMuCisgICAgIworICAgIHJ1bGUgY29uc3RydWN0ICggbmFtZSA6IHNvdXJjZS10YXJnZXRzICogOiBwcm9wZXJ0aWVzICogKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA6IGVycm9yIDogZXJyb3JzLmVycm9yIDsKKyAgICAgICAgZXJyb3JzLmVycm9yICJtZXRob2Qgc2hvdWxkIGJlIGRlZmluZWQgaW4gZGVyaXZlZCBjbGFzc2VzIiA7CisgICAgfQorfQorCisKK2NsYXNzIHR5cGVkLXRhcmdldCA6IGJhc2ljLXRhcmdldAoreworICAgIGltcG9ydCBnZW5lcmF0b3JzIDsKKworICAgIHJ1bGUgX19pbml0X18gKCBuYW1lIDogcHJvamVjdCA6IHR5cGUgOiBzb3VyY2VzICogOiByZXF1aXJlbWVudHMgKiA6CisgICAgICAgICBkZWZhdWx0LWJ1aWxkICogOiB1c2FnZS1yZXF1aXJlbWVudHMgKiApCisgICAgeworICAgICAgICBiYXNpYy10YXJnZXQuX19pbml0X18gJChuYW1lKSA6ICQocHJvamVjdCkgOiAkKHNvdXJjZXMpIDoKKyAgICAgICAgICAgICQocmVxdWlyZW1lbnRzKSA6ICQoZGVmYXVsdC1idWlsZCkgOiAkKHVzYWdlLXJlcXVpcmVtZW50cykgOworCisgICAgICAgIHNlbGYudHlwZSA9ICQodHlwZSkgOworICAgIH0KKworICAgIHJ1bGUgdHlwZSAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYudHlwZSkgOworICAgIH0KKworICAgIHJ1bGUgY29uc3RydWN0ICggbmFtZSA6IHNvdXJjZS10YXJnZXRzICogOiBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgbG9jYWwgciA9IFsgZ2VuZXJhdG9ycy5jb25zdHJ1Y3QgJChzZWxmLnByb2plY3QpICQobmFtZTpTPSkKKyAgICAgICAgICAgIDogJChzZWxmLnR5cGUpCisgICAgICAgICAgICA6IFsgcHJvcGVydHktc2V0LmNyZWF0ZSBbICQocHJvcGVydHktc2V0KS5yYXcgXQorICAgICAgICAgICAgICAgIDxtYWluLXRhcmdldC10eXBlPiQoc2VsZi50eXBlKSBdCisgICAgICAgICAgICA6ICQoc291cmNlLXRhcmdldHMpIDogdHJ1ZSBdIDsKKyAgICAgICAgaWYgISAkKHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gIndhcm46IFVuYWJsZSB0byBjb25zdHJ1Y3QiIFsgZnVsbC1uYW1lIF0gOworCisgICAgICAgICAgICAjIEFyZSB0aGVyZSBhbnkgdG9wLWxldmVsIGdlbmVyYXRvcnMgZm9yIHRoaXMgdHlwZS9wcm9wZXJ0eSBzZXQuCisgICAgICAgICAgICBpZiAhIFsgZ2VuZXJhdG9ycy5maW5kLXZpYWJsZS1nZW5lcmF0b3JzICQoc2VsZi50eXBlKSA6CisgICAgICAgICAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFQ0hPICJlcnJvcjogbm8gZ2VuZXJhdG9ycyB3ZXJlIGZvdW5kIGZvciB0eXBlICckKHNlbGYudHlwZSknIiA7CisgICAgICAgICAgICAgICAgRUNITyAiZXJyb3I6IGFuZCB0aGUgcmVxdWVzdGVkIHByb3BlcnRpZXMiIDsKKyAgICAgICAgICAgICAgICBFQ0hPICJlcnJvcjogbWFrZSBzdXJlIHlvdSd2ZSBjb25maWd1cmVkIHRoZSBuZWVkZWQgdG9vbHMiIDsKKyAgICAgICAgICAgICAgICBFQ0hPICJTZWUgaHR0cDovL2Jvb3N0Lm9yZy9ib29zdC1idWlsZDIvZG9jL2h0bWwvYmJ2Mi9hZHZhbmNlZC9jb25maWd1cmF0aW9uLmh0bWwiIDsKKyAgICAgICAgICAgICAgICBFWElUICJUbyBkZWJ1ZyB0aGlzIHByb2JsZW0sIHRyeSB0aGUgLS1kZWJ1Zy1nZW5lcmF0b3JzIG9wdGlvbi4iCisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChyKSA7CisgICAgfQorfQorCisKKyMgUmV0dXJuIHRoZSBsaXN0IG9mIHNvdXJjZXMgdG8gdXNlLCBpZiBtYWluIHRhcmdldCBydWxlIGlzIGludm9rZWQgd2l0aAorIyAnc291cmNlcycuIElmIHRoZXJlIGFyZSBhbnkgb2JqZWN0cyBpbiAnc291cmNlcycsIHRoZXkgYXJlIHRyZWF0ZWQgYXMgbWFpbgorIyB0YXJnZXQgaW5zdGFuY2VzLCBhbmQgdGhlIG5hbWUgb2Ygc3VjaCB0YXJnZXRzIGFyZSBhZGp1c3RlZCB0byBiZQorIyAnPG5hbWVfb2ZfdGhpc190YXJnZXQ+X188bmFtZV9vZl9zb3VyY2VfdGFyZ2V0PicuIFN1Y2ggcmVuYW1pbmcgaXMgZGlzYWJsZWQgaWYKKyMgYSBub24tZW1wdHkgdmFsdWUgaXMgcGFzc2VkIGFzIHRoZSAnbm8tcmVuYW1pbmcnIHBhcmFtZXRlci4KKyMKK3J1bGUgbWFpbi10YXJnZXQtc291cmNlcyAoIHNvdXJjZXMgKiA6IG1haW4tdGFyZ2V0LW5hbWUgOiBuby1yZW5hbWluZyA/ICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGZvciBsb2NhbCB0IGluICQoc291cmNlcykKKyAgICB7CisgICAgICAgIGlmIFsgY2xhc3MuaXMtaW5zdGFuY2UgJCh0KSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIG5hbWUgPSBbICQodCkubmFtZSBdIDsKKyAgICAgICAgICAgIGlmICEgJChuby1yZW5hbWluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gJChtYWluLXRhcmdldC1uYW1lKV9fJChuYW1lKSA7CisgICAgICAgICAgICAgICAgJCh0KS5yZW5hbWUgJChuYW1lKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjIElubGluZSB0YXJnZXRzIGFyZSBub3QgYnVpbHQgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIGxvY2FsIHAgPSBbICQodCkucHJvamVjdCBdIDsKKyAgICAgICAgICAgICQocCkubWFyay10YXJnZXQtYXMtZXhwbGljaXQgJChuYW1lKSA7CisgICAgICAgICAgICByZXN1bHQgKz0gJChuYW1lKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gJCh0KSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBSZXR1cm5zIHRoZSByZXF1aXJlbWVudHMgdG8gdXNlIHdoZW4gZGVjbGFyaW5nIGEgbWFpbiB0YXJnZXQsIG9idGFpbmVkIGJ5CisjIHRyYW5zbGF0aW5nIGFsbCBzcGVjaWZpZWQgcHJvcGVydHkgcGF0aHMgYW5kIHJlZmluaW5nIHByb2plY3QgcmVxdWlyZW1lbnRzCisjIHdpdGggdGhlIG9uZXMgc3BlY2lmaWVkIGZvciB0aGUgdGFyZ2V0LgorIworcnVsZSBtYWluLXRhcmdldC1yZXF1aXJlbWVudHMgKAorICAgIHNwZWNpZmljYXRpb24gKiAgIyBQcm9wZXJ0aWVzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGZvciB0aGUgbWFpbiB0YXJnZXQuCisgICAgOiBwcm9qZWN0ICAgICAgICAjIFByb2plY3Qgd2hlcmUgdGhlIG1haW4gdGFyZ2V0IGlzIHRvIGJlIGRlY2xhcmVkLgorKQoreworICAgIGxvY2FsIHJlcXVpcmVtZW50cyA9IFsgcHJvcGVydHktc2V0LnJlZmluZS1mcm9tLXVzZXItaW5wdXQKKyAgICAgICAgWyAkKHByb2plY3QpLmdldCByZXF1aXJlbWVudHMgXSA6ICQoc3BlY2lmaWNhdGlvbikgOgorICAgICAgICBbICQocHJvamVjdCkucHJvamVjdC1tb2R1bGUgXSA6IFsgJChwcm9qZWN0KS5nZXQgbG9jYXRpb24gXSBdIDsKKyAgICBpZiAkKHJlcXVpcmVtZW50c1sxXSkgPSAiQGVycm9yIgorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciAiQ29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzIGZvciB0YXJnZXQ6IiAkKHJlcXVpcmVtZW50cykgOworICAgIH0KKyAgICByZXR1cm4gWyAkKHJlcXVpcmVtZW50cykuYWRkIFsgdG9vbHNldC5yZXF1aXJlbWVudHMgXSBdIDsKK30KKworCisjIFJldHVybnMgdGhlIHVzYWdlIHJlcXVpcmVtZW50cyB0byB1c2Ugd2hlbiBkZWNsYXJpbmcgYSBtYWluIHRhcmdldCwgd2hpY2ggYXJlCisjIG9idGFpbmVkIGJ5IHRyYW5zbGF0aW5nIGFsbCBzcGVjaWZpZWQgcHJvcGVydHkgcGF0aHMgYW5kIGFkZGluZyBwcm9qZWN0J3MKKyMgdXNhZ2UgcmVxdWlyZW1lbnRzLgorIworcnVsZSBtYWluLXRhcmdldC11c2FnZS1yZXF1aXJlbWVudHMgKAorICAgIHNwZWNpZmljYXRpb24gKiAgIyBVc2UtcHJvcGVydGllcyBleHBsaWNpdGx5IHNwZWNpZmllZCBmb3IgYSBtYWluIHRhcmdldC4KKyAgICA6IHByb2plY3QgICAgICAgICMgUHJvamVjdCB3aGVyZSB0aGUgbWFpbiB0YXJnZXQgaXMgdG8gYmUgZGVjbGFyZWQuCispCit7CisgICAgbG9jYWwgcHJvamVjdC11c2FnZS1yZXF1aXJlbWVudHMgPSBbICQocHJvamVjdCkuZ2V0IHVzYWdlLXJlcXVpcmVtZW50cyBdIDsKKworICAgICMgV2UgZG8gbm90IHVzZSAncmVmaW5lLWZyb20tdXNlci1pbnB1dCcgYmVjYXVzZToKKyAgICAjIC0gSSBhbSBub3Qgc3VyZSBpZiByZW1vdmluZyBwYXJlbnQncyB1c2FnZSByZXF1aXJlbWVudHMgbWFrZXMgc2Vuc2UKKyAgICAjIC0gcmVmaW5pbmcgdXNhZ2UgcmVxdWlyZW1lbnRzIGlzIG5vdCBuZWVkZWQsIHNpbmNlIHVzYWdlIHJlcXVpcmVtZW50cyBhcmUKKyAgICAjICAgYWx3YXlzIGZyZWUuCisgICAgbG9jYWwgdXNhZ2UtcmVxdWlyZW1lbnRzID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlLWZyb20tdXNlci1pbnB1dAorICAgICAgICAkKHNwZWNpZmljYXRpb24pCisgICAgICAgIDogWyAkKHByb2plY3QpLnByb2plY3QtbW9kdWxlIF0gWyAkKHByb2plY3QpLmdldCBsb2NhdGlvbiBdIF0gOworCisgICAgcmV0dXJuIFsgJChwcm9qZWN0LXVzYWdlLXJlcXVpcmVtZW50cykuYWRkICQodXNhZ2UtcmVxdWlyZW1lbnRzKSBdIDsKK30KKworCisjIFJldHVybiB0aGUgZGVmYXVsdCBidWlsZCB2YWx1ZSB0byB1c2Ugd2hlbiBkZWNsYXJpbmcgYSBtYWluIHRhcmdldCwgd2hpY2ggaXMKKyMgb2J0YWluZWQgYnkgdXNpbmcgdGhlIHNwZWNpZmllZCB2YWx1ZSBpZiBub3QgZW1wdHkgYW5kIHBhcmVudCdzIGRlZmF1bHQgYnVpbGQKKyMgYXR0cmlidXRlIG90aGVyd2lzZS4KKyMKK3J1bGUgbWFpbi10YXJnZXQtZGVmYXVsdC1idWlsZCAoCisgICAgc3BlY2lmaWNhdGlvbiAqICAjIERlZmF1bHQgYnVpbGQgZXhwbGljaXRseSBzcGVjaWZpZWQgZm9yIGEgbWFpbiB0YXJnZXQuCisgICAgOiBwcm9qZWN0ICAgICAgICAjIFByb2plY3Qgd2hlcmUgdGhlIG1haW4gdGFyZ2V0IGlzIHRvIGJlIGRlY2xhcmVkLgorKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgaWYgJChzcGVjaWZpY2F0aW9uKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gJChzcGVjaWZpY2F0aW9uKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IFsgJChwcm9qZWN0KS5nZXQgZGVmYXVsdC1idWlsZCBdIDsKKyAgICB9CisgICAgcmV0dXJuIFsgcHJvcGVydHktc2V0LmNyZWF0ZS13aXRoLXZhbGlkYXRpb24gJChyZXN1bHQpIF0gOworfQorCisKKyMgUmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGFzIGEgbWFpbiB0YXJnZXQgYWx0ZXJuYXRpdmUgYW5kIHJldHVybnMgaXQuCisjCitydWxlIG1haW4tdGFyZ2V0LWFsdGVybmF0aXZlICggdGFyZ2V0ICkKK3sKKyAgICBsb2NhbCBwdGFyZ2V0ID0gWyAkKHRhcmdldCkucHJvamVjdCBdIDsKKyAgICAkKHB0YXJnZXQpLmFkZC1hbHRlcm5hdGl2ZSAkKHRhcmdldCkgOworICAgIHJldHVybiAkKHRhcmdldCkgOworfQorCisKKyMgQ3JlYXRlcyBhIG1ldGF0YXJnZXQgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMsIHVzaW5nICdrbGFzcycgYXMgdGhlCisjIGNsYXNzLiBUaGUgJ25hbWUnLCAnc291cmNlcycsICdyZXF1aXJlbWVudHMnLCAnZGVmYXVsdC1idWlsZCcgYW5kCisjICd1c2FnZS1yZXF1aXJlbWVudHMnIGFyZSBhc3N1bWVkIHRvIGJlIGluIHRoZSBmb3JtIHNwZWNpZmllZCBieSB0aGUgdXNlciBpbgorIyB0aGUgSmFtZmlsZSBjb3JyZXNwb25kaW5nIHRvICdwcm9qZWN0Jy4KKyMKK3J1bGUgY3JlYXRlLW1ldGF0YXJnZXQgKCBrbGFzcyA6IHByb2plY3QgOiBuYW1lIDogc291cmNlcyAqIDogcmVxdWlyZW1lbnRzICogOgorICAgIGRlZmF1bHQtYnVpbGQgKiA6IHVzYWdlLXJlcXVpcmVtZW50cyAqICkKK3sKKyAgICByZXR1cm4gWyB0YXJnZXRzLm1haW4tdGFyZ2V0LWFsdGVybmF0aXZlIFsgbmV3ICQoa2xhc3MpICQobmFtZSkgOiAkKHByb2plY3QpCisgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LXNvdXJjZXMgJChzb3VyY2VzKSA6ICQobmFtZSkgXQorICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1yZXF1aXJlbWVudHMgJChyZXF1aXJlbWVudHMpIDogJChwcm9qZWN0KSBdCisgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LWRlZmF1bHQtYnVpbGQgJChkZWZhdWx0LWJ1aWxkKSA6ICQocHJvamVjdCkgXQorICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC11c2FnZS1yZXF1aXJlbWVudHMgJCh1c2FnZS1yZXF1aXJlbWVudHMpIDoKKyAgICAgICAgICAgICQocHJvamVjdCkgXSBdIF0gOworfQorCisKKyMgQ3JlYXRlcyBhIHR5cGVkLXRhcmdldCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4gVGhlICduYW1lJywgJ3NvdXJjZXMnLAorIyAncmVxdWlyZW1lbnRzJywgJ2RlZmF1bHQtYnVpbGQnIGFuZCAndXNhZ2UtcmVxdWlyZW1lbnRzJyBhcmUgYXNzdW1lZCB0byBiZSBpbgorIyB0aGUgZm9ybSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgaW4gdGhlIEphbWZpbGUgY29ycmVzcG9uZGluZyB0byAncHJvamVjdCcuCisjCitydWxlIGNyZWF0ZS10eXBlZC10YXJnZXQgKCB0eXBlIDogcHJvamVjdCA6IG5hbWUgOiBzb3VyY2VzICogOiByZXF1aXJlbWVudHMgKiA6CisgICAgZGVmYXVsdC1idWlsZCAqIDogdXNhZ2UtcmVxdWlyZW1lbnRzICogKQoreworICAgIHJldHVybiBbIHRhcmdldHMubWFpbi10YXJnZXQtYWx0ZXJuYXRpdmUgWyBuZXcgdHlwZWQtdGFyZ2V0ICQobmFtZSkgOgorICAgICAgICAkKHByb2plY3QpIDogJCh0eXBlKQorICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1zb3VyY2VzICQoc291cmNlcykgOiAkKG5hbWUpIF0KKyAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtcmVxdWlyZW1lbnRzICQocmVxdWlyZW1lbnRzKSA6ICQocHJvamVjdCkgXQorICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1kZWZhdWx0LWJ1aWxkICQoZGVmYXVsdC1idWlsZCkgOiAkKHByb2plY3QpIF0KKyAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtdXNhZ2UtcmVxdWlyZW1lbnRzICQodXNhZ2UtcmVxdWlyZW1lbnRzKSA6CisgICAgICAgICAgICAkKHByb2plY3QpIF0gXSBdIDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvdG9vbHNldC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL3Rvb2xzZXQuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWI5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL3Rvb2xzZXQuamFtCkBAIC0wLDAgKzEsNTgyIEBACisjIENvcHlyaWdodCAyMDAzIERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDUgUmVuZSBSaXZlcmEKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjICBTdXBwb3J0IGZvciB0b29sc2V0IGRlZmluaXRpb24uCisKK2ltcG9ydCBlcnJvcnMgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IG51bWJlcnMgOworaW1wb3J0IHBhdGggOworaW1wb3J0IHByb3BlcnR5IDsKK2ltcG9ydCByZWdleCA7CitpbXBvcnQgc2VxdWVuY2UgOworaW1wb3J0IHNldCA7CitpbXBvcnQgcHJvcGVydHktc2V0IDsKKworCisuZmxhZy1ubyA9IDEgOworCisuaWdub3JlLXJlcXVpcmVtZW50cyA9IDsKKworIyBUaGlzIGlzIHVzZWQgb25seSBmb3IgdGVzdGluZywgdG8gbWFrZSBzdXJlIHdlIGRvIG5vdCBnZXQgcmFuZG9tIGV4dHJhCisjIGVsZW1lbnRzIGluIHBhdGhzLgoraWYgLS1pZ25vcmUtdG9vbHNldC1yZXF1aXJlbWVudHMgaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0KK3sKKyAgICAuaWdub3JlLXJlcXVpcmVtZW50cyA9IDEgOworfQorCisKKyMgSW5pdGlhbGl6ZXMgYW4gYWRkaXRpb25hbCB0b29sc2V0LWxpa2UgbW9kdWxlLiBGaXJzdCBsb2FkIHRoZSAndG9vbHNldC1tb2R1bGUnCisjIGFuZCB0aGVuIGNhbGxzIGl0cyAnaW5pdCcgcnVsZSB3aXRoIHRyYWlsaW5nIGFyZ3VtZW50cy4KKyMKK3J1bGUgdXNpbmcgKCB0b29sc2V0LW1vZHVsZSA6ICogKQoreworICAgIGltcG9ydCAkKHRvb2xzZXQtbW9kdWxlKSA7CisgICAgJCh0b29sc2V0LW1vZHVsZSkuaW5pdCAkKDIpIDogJCgzKSA6ICQoNCkgOiAkKDUpIDogJCg2KSA6ICQoNykgOiAkKDgpIDogJCg5KQorICAgICAgICA7Cit9CisKKworIyBFeHBhbmRzIHN1YmZlYXR1cmVzIGluIGVhY2ggcHJvcGVydHkgc2V0cywgZS5nLiAnPHRvb2xzZXQ+Z2NjLTMuMicgd2lsbCBiZQorIyBjb252ZXJ0ZWQgdG8gJzx0b29sc2V0PmdjYy88dG9vbHNldC12ZXJzaW9uPjMuMicuCisjCitsb2NhbCBydWxlIG5vcm1hbGl6ZS1jb25kaXRpb24gKCBwcm9wZXJ0eS1zZXRzICogKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgZm9yIGxvY2FsIHAgaW4gJChwcm9wZXJ0eS1zZXRzKQorICAgIHsKKyAgICAgICAgbG9jYWwgc3BsaXQgPSBbIGZlYXR1cmUuc3BsaXQgJChwKSBdIDsKKyAgICAgICAgbG9jYWwgZXhwYW5kZWQgPSBbIGZlYXR1cmUuZXhwYW5kLXN1YmZlYXR1cmVzIFsgZmVhdHVyZS5zcGxpdCAkKHApIF0gXSA7CisgICAgICAgIHJlc3VsdCArPSAkKGV4cGFuZGVkOko9LykgOworICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIFNwZWNpZmllcyBpZiB0aGUgJ2ZsYWdzJyBydWxlIHNob3VsZCBjaGVjayB0aGF0IHRoZSBpbnZva2luZyBtb2R1bGUgaXMgdGhlCisjIHNhbWUgYXMgdGhlIG1vZHVsZSB3ZSBhcmUgc2V0dGluZyB0aGUgZmxhZyBmb3IuICd2JyBjYW4gYmUgZWl0aGVyICdjaGVja2VkJyBvcgorIyAndW5jaGVja2VkJy4gU3Vic2VxdWVudCBjYWxsIHRvICdwb3AtY2hlY2tpbmctZm9yLWZsYWdzLW1vZHVsZScgd2lsbCByZXN0b3JlCisjIHRoZSBzZXR0aW5nIHRoYXQgd2FzIGluIGVmZmVjdCBiZWZvcmUgY2FsbGluZyB0aGlzIHJ1bGUuCisjCitydWxlIHB1c2gtY2hlY2tpbmctZm9yLWZsYWdzLW1vZHVsZSAoIHYgKQoreworICAgIC5mbGFncy1tb2R1bGUtY2hlY2tpbmcgPSAkKHYpICQoLmZsYWdzLW1vZHVsZS1jaGVja2luZykgOworfQorCitydWxlIHBvcC1jaGVja2luZy1mb3ItZmxhZ3MtbW9kdWxlICggKQoreworICAgIC5mbGFncy1tb2R1bGUtY2hlY2tpbmcgPSAkKC5mbGFncy1tb2R1bGUtY2hlY2tpbmdbMi1dKSA7Cit9CisKKworIyBTcGVjaWZpZXMgdGhlIGZsYWdzICh2YXJpYWJsZXMpIHRoYXQgbXVzdCBiZSBzZXQgb24gdGFyZ2V0cyB1bmRlciBjZXJ0YWluCisjIGNvbmRpdGlvbnMsIGRlc2NyaWJlZCBieSBhcmd1bWVudHMuCisjCitydWxlIGZsYWdzICgKKyAgICBydWxlLW9yLW1vZHVsZSAgICMgSWYgY29udGFpbnMgYSBkb3QsIHNob3VsZCBiZSBhIHJ1bGUgbmFtZS4gVGhlIGZsYWdzIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICMgYmUgYXBwbGllZCB3aGVuIHRoYXQgcnVsZSBpcyB1c2VkIHRvIHNldCB1cCBidWlsZAorICAgICAgICAgICAgICAgICAgICAgIyBhY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICAgICAgIyBJZiBkb2VzIG5vdCBjb250YWluIGRvdCwgc2hvdWxkIGJlIGEgbW9kdWxlIG5hbWUuIFRoZQorICAgICAgICAgICAgICAgICAgICAgIyBmbGFnIHdpbGwgYmUgYXBwbGllZCBmb3IgYWxsIHJ1bGVzIGluIHRoYXQgbW9kdWxlLiBJZgorICAgICAgICAgICAgICAgICAgICAgIyBtb2R1bGUgZm9yIHJ1bGUgaXMgZGlmZmVyZW50IGZyb20gdGhlIGNhbGxpbmcgbW9kdWxlLCBhbgorICAgICAgICAgICAgICAgICAgICAgIyBlcnJvciBpcyBpc3N1ZWQuCisKKyAgICB2YXJpYWJsZS1uYW1lICAgICMgVmFyaWFibGUgdGhhdCBzaG91bGQgYmUgc2V0IG9uIHRhcmdldC4KKyAgICBjb25kaXRpb24gKiA6ICAgICMgQSBjb25kaXRpb24gd2hlbiB0aGlzIGZsYWcgc2hvdWxkIGJlIGFwcGxpZWQuIFNob3VsZCBiZSBhCisgICAgICAgICAgICAgICAgICAgICAjIHNldCBvZiBwcm9wZXJ0eSBzZXRzLiBJZiBvbmUgb2YgdGhvc2UgcHJvcGVydHkgc2V0cyBpcworICAgICAgICAgICAgICAgICAgICAgIyBjb250YWluZWQgaW4gdGhlIGJ1aWxkIHByb3BlcnRpZXMsIHRoZSBmbGFnIHdpbGwgYmUgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICMgSW1wbGllZCB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkOiAiPHRvb2xzZXQ+Z2NjIiBzaG91bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICMgdXNlZCwgbm90IGp1c3QgImdjYyIuIFN1YmZlYXR1cmVzLCBsaWtlIGluCisgICAgICAgICAgICAgICAgICAgICAjICI8dG9vbHNldD5nY2MtMy4yIiBhcmUgYWxsb3dlZC4gSWYgbGVmdCBlbXB0eSwgdGhlIGZsYWcKKyAgICAgICAgICAgICAgICAgICAgICMgd2lsbCBiZSB1c2VkIHVuY29uZGl0aW9uYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAgICAgICMgUHJvcGVyeSBzZXRzIG1heSB1c2UgdmFsdWUtbGVzcyBwcm9wZXJ0aWVzICgnPGE+JyAgdnMuCisgICAgICAgICAgICAgICAgICAgICAjICc8YT52YWx1ZScpIHRvIG1hdGNoIGFic2VudCBwcm9wZXJ0aWVzLiBUaGlzIGFsbG93cyB0bworICAgICAgICAgICAgICAgICAgICAgIyBzZXBhcmF0ZWx5IG1hdGNoOgorICAgICAgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICAgICAgIyAgIDxhcmNoaXRlY3R1cmU+LzxhZGRyZXNzLW1vZGVsPjY0CisgICAgICAgICAgICAgICAgICAgICAjICAgPGFyY2hpdGVjdHVyZT5pYTY0LzxhZGRyZXNzLW1vZGVsPgorICAgICAgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICAgICAgIyBXaGVyZSBib3RoIGZlYXR1cmVzIGFyZSBvcHRpb25hbC4gV2l0aG91dCB0aGlzIHN5bnRheAorICAgICAgICAgICAgICAgICAgICAgIyB3ZSB3b3VsZCBiZSBmb3JjZWQgdG8gZGVmaW5lICJkZWZhdWx0IiB2YWx1ZXMuCisKKyAgICB2YWx1ZXMgKiA6ICAgICAgICMgVGhlIHZhbHVlIHRvIGFkZCB0byB2YXJpYWJsZS4gSWYgPGZlYXR1cmU+IGlzIHNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICMgdGhlbiB0aGUgdmFsdWUgb2YgJ2ZlYXR1cmUnIHdpbGwgYmUgYWRkZWQuCisgICAgdW5jaGVja2VkID8gICAgICAjIElmIHZhbHVlICd1bmNoZWNrZWQnIGlzIHBhc3NlZCwgd2lsbCBub3QgdGVzdCB0aGF0IGZsYWdzCisgICAgICAgICAgICAgICAgICAgICAjIGFyZSBzZXQgZm9yIHRoZSBjYWxsaW5nIG1vZHVsZS4KKyAgICA6IGhhY2staGFjayA/ICAgICMgRm9yCisgICAgICAgICAgICAgICAgICAgICAjICAgZmxhZ3MgcnVsZSBPUFRJT05TIDxjeHgtYWJpPiA6IC1tb2RlbCBhbnNpCisgICAgICAgICAgICAgICAgICAgICAjIFRyZWF0IDxjeHgtYWJpPiBhcyBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICMgRklYTUU6IHVnbHkgaGFjay4KKykKK3sKKyAgICBsb2NhbCBjYWxsZXIgPSBbIENBTExFUl9NT0RVTEUgXSA7CisgICAgaWYgISBbIE1BVENIICIuKihbLl0pLioiIDogJChydWxlLW9yLW1vZHVsZSkgXQorICAgICAgICYmIFsgTUFUQ0ggIihKYW1maWxlPC4qKSIgOiAkKGNhbGxlcikgXQorICAgIHsKKyAgICAgICAgIyBVbnF1YWxpZmllZCBydWxlIG5hbWUsIHVzZWQgaW5zaWRlIEphbWZpbGUuIE1vc3QgbGlrZWx5IHVzZWQgd2l0aAorICAgICAgICAjICdtYWtlJyBvciAnbm90ZmlsZScgcnVsZXMuIFRoaXMgcHJldmVudHMgc2V0dGluZyBmbGFncyBvbiB0aGUgZW50aXJlCisgICAgICAgICMgSmFtZmlsZSBtb2R1bGUgKHRoaXMgd2lsbCBiZSBjb25zaWRlcmVkIGFzIHJ1bGUpLCBidXQgd2hvIGNhcmVzPworICAgICAgICAjIFByb2JhYmx5LCAnZmxhZ3MnIHJ1bGUgc2hvdWxkIGJlIHNwbGl0IGludG8gJ2ZsYWdzJyBhbmQKKyAgICAgICAgIyAnZmxhZ3Mtb24tbW9kdWxlJy4KKyAgICAgICAgcnVsZS1vci1tb2R1bGUgPSAkKGNhbGxlcikuJChydWxlLW9yLW1vZHVsZSkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsb2NhbCBtb2R1bGVfID0gWyBNQVRDSCAiKFteLl0qKS4qIiA6ICQocnVsZS1vci1tb2R1bGUpIF0gOworICAgICAgICBpZiAkKHVuY2hlY2tlZCkgIT0gdW5jaGVja2VkCisgICAgICAgICAgICAmJiAkKC5mbGFncy1tb2R1bGUtY2hlY2tpbmdbMV0pICE9IHVuY2hlY2tlZAorICAgICAgICAgICAgJiYgJChtb2R1bGVfKSAhPSAkKGNhbGxlcikKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3JzLmVycm9yICJNb2R1bGUgJChjYWxsZXIpIGF0dGVtcHRlZCB0byBzZXQgZmxhZ3MgZm9yIG1vZHVsZSAkKG1vZHVsZV8pIiA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAkKGNvbmRpdGlvbikgJiYgISAkKGNvbmRpdGlvbjpHPSkgJiYgISAkKGhhY2staGFjaykKKyAgICB7CisgICAgICAgICMgV2UgaGF2ZSBjb25kaXRpb24gaW4gdGhlIGZvcm0gJzxmZWF0dXJlPicsIHRoYXQgaXMsIHdpdGhvdXQgdmFsdWUuCisgICAgICAgICMgVGhhdCBpcyBhbiBvbGRlciBzeW50YXg6CisgICAgICAgICMgICBmbGFncyBnY2MubGluayBSUEFUSCA8ZGxsLXBhdGg+IDsKKyAgICAgICAgIyBmb3IgY29tcGF0aWJpbGl0eSwgY29udmVydCBpdCB0bworICAgICAgICAjICAgZmxhZ3MgZ2NjLmxpbmsgUlBBVEggOiA8ZGxsLXBhdGg+IDsKKyAgICAgICAgdmFsdWVzID0gJChjb25kaXRpb24pIDsKKyAgICAgICAgY29uZGl0aW9uID0gOworICAgIH0KKworICAgIGlmICQoY29uZGl0aW9uKQorICAgIHsKKyAgICAgICAgcHJvcGVydHkudmFsaWRhdGUtcHJvcGVydHktc2V0cyAkKGNvbmRpdGlvbikgOworICAgICAgICBjb25kaXRpb24gPSBbIG5vcm1hbGl6ZS1jb25kaXRpb24gJChjb25kaXRpb24pIF0gOworICAgIH0KKworICAgIGFkZC1mbGFnICQocnVsZS1vci1tb2R1bGUpIDogJCh2YXJpYWJsZS1uYW1lKSA6ICQoY29uZGl0aW9uKSA6ICQodmFsdWVzKSA7Cit9CisKKworIyBBZGRzIGEgbmV3IGZsYWcgc2V0dGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLiBEb2VzIG5vIGNoZWNraW5nLgorIworbG9jYWwgcnVsZSBhZGQtZmxhZyAoIHJ1bGUtb3ItbW9kdWxlIDogdmFyaWFibGUtbmFtZSA6IGNvbmRpdGlvbiAqIDogdmFsdWVzICogKQoreworICAgIC4kKHJ1bGUtb3ItbW9kdWxlKS5mbGFncyArPSAkKC5mbGFnLW5vKSA7CisKKyAgICAjIFN0b3JlIGFsbCBmbGFncyBmb3IgYSBtb2R1bGUuCisgICAgbG9jYWwgbW9kdWxlXyA9IFsgTUFUQ0ggIihbXi5dKikuKiIgOiAkKHJ1bGUtb3ItbW9kdWxlKSBdIDsKKyAgICAubW9kdWxlLWZsYWdzLiQobW9kdWxlXykgKz0gJCguZmxhZy1ubykgOworICAgICMgU3RvcmUgZmxhZy1ubyAtPiBydWxlLW9yLW1vZHVsZSBtYXBwaW5nLgorICAgIC5ydWxlLW9yLW1vZHVsZS4kKC5mbGFnLW5vKSA9ICQocnVsZS1vci1tb2R1bGUpIDsKKworICAgIC4kKHJ1bGUtb3ItbW9kdWxlKS52YXJpYWJsZS4kKC5mbGFnLW5vKSArPSAkKHZhcmlhYmxlLW5hbWUpIDsKKyAgICAuJChydWxlLW9yLW1vZHVsZSkudmFsdWVzLiQoLmZsYWctbm8pICs9ICQodmFsdWVzKSA7CisgICAgLiQocnVsZS1vci1tb2R1bGUpLmNvbmRpdGlvbi4kKC5mbGFnLW5vKSArPSAkKGNvbmRpdGlvbikgOworCisgICAgLmZsYWctbm8gPSBbIG51bWJlcnMuaW5jcmVtZW50ICQoLmZsYWctbm8pIF0gOworfQorCisKKyMgUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiAncHJvcGVydHktc2V0cycgd2hpY2ggaXMgYSBzdWJzZXQgb2YKKyMgJ3Byb3BlcnRpZXMnIG9yIGFuIGVtcHR5IGxpc3QgaWYgbm8gc3VjaCBlbGVtZW50IGV4aXN0cy4KKyMKK3J1bGUgZmluZC1wcm9wZXJ0eS1zdWJzZXQgKCBwcm9wZXJ0eS1zZXRzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgICMgQ3V0IHByb3BlcnR5IHZhbHVlcyBvZmYuCisgICAgbG9jYWwgcHJvcC1rZXlzID0gJChwcm9wZXJ0aWVzOkcpIDsKKworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgZm9yIGxvY2FsIHMgaW4gJChwcm9wZXJ0eS1zZXRzKQorICAgIHsKKyAgICAgICAgaWYgISAkKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgIyBIYW5kbGUgdmFsdWUtbGVzcyBwcm9wZXJ0aWVzIGxpa2UgJzxhcmNoaXRlY3R1cmU+JyAoY29tcGFyZSB3aXRoCisgICAgICAgICAgICAjICc8YXJjaGl0ZWN0dXJlPng4NicpLgorCisgICAgICAgICAgICBsb2NhbCBzZXQgPSBbIGZlYXR1cmUuc3BsaXQgJChzKSBdIDsKKworICAgICAgICAgICAgIyBGaW5kIHRoZSBzZXQgb2YgZmVhdHVyZXMgdGhhdAorICAgICAgICAgICAgIyAtIGhhdmUgbm8gcHJvcGVydHkgc3BlY2lmaWVkIGluIHJlcXVpcmVkIHByb3BlcnR5IHNldAorICAgICAgICAgICAgIyAtIGFyZSBvbWl0dGVkIGluIHRoZSBidWlsZCBwcm9wZXJ0eSBzZXQuCisgICAgICAgICAgICBsb2NhbCBkZWZhdWx0LXByb3BzIDsKKyAgICAgICAgICAgIGZvciBsb2NhbCBpIGluICQoc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgSWYgJChpKSBpcyBhIHZhbHVlLWxlc3MgcHJvcGVydHkgaXQgc2hvdWxkIG1hdGNoIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICAgICAjIG9mIGFuIG9wdGlvbmFsIHByb3BlcnR5LiBTZWUgdGhlIGZpcnN0IGxpbmUgaW4gdGhlIGV4YW1wbGUKKyAgICAgICAgICAgICAgICAjIGJlbG93OgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjICBwcm9wZXJ0eSBzZXQgICAgIHByb3BlcnRpZXMgICAgIHJlc3VsdAorICAgICAgICAgICAgICAgICMgPGE+IDxiPmZvbyAgICAgIDxiPmZvbyAgICAgICAgICAgbWF0Y2gKKyAgICAgICAgICAgICAgICAjIDxhPiA8Yj5mb28gICAgICA8YT5mb28gPGI+Zm9vICAgIG5vIG1hdGNoCisgICAgICAgICAgICAgICAgIyA8YT5mb28gPGI+Zm9vICAgPGI+Zm9vICAgICAgICAgICBubyBtYXRjaAorICAgICAgICAgICAgICAgICMgPGE+Zm9vIDxiPmZvbyAgIDxhPmZvbyA8Yj5mb28gICAgbWF0Y2gKKyAgICAgICAgICAgICAgICBpZiAhICggJChpOkc9KSB8fCAoICQoaTpHKSBpbiAkKHByb3Ata2V5cykgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LXByb3BzICs9ICQoaSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgJChzZXQpIGluICQocHJvcGVydGllcykgJChkZWZhdWx0LXByb3BzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9ICQocykgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgUmV0dXJucyBhIHZhbHVlIHRvIGJlIGFkZGVkIHRvIHNvbWUgZmxhZyBmb3Igc29tZSB0YXJnZXQgYmFzZWQgb24gdGhlIGZsYWcncworIyB2YWx1ZSBkZWZpbml0aW9uIGFuZCB0aGUgZ2l2ZW4gdGFyZ2V0J3MgcHJvcGVydHkgc2V0LgorIworcnVsZSBoYW5kbGUtZmxhZy12YWx1ZSAoIHZhbHVlICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgaWYgJCh2YWx1ZTpHKQorICAgIHsKKyAgICAgICAgbG9jYWwgbWF0Y2hlcyA9IFsgcHJvcGVydHkuc2VsZWN0ICQodmFsdWUpIDogJChwcm9wZXJ0aWVzKSBdIDsKKyAgICAgICAgZm9yIGxvY2FsIHAgaW4gJChtYXRjaGVzKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBhdHQgPSBbIGZlYXR1cmUuYXR0cmlidXRlcyAkKHA6RykgXSA7CisgICAgICAgICAgICBpZiBkZXBlbmRlbmN5IGluICQoYXR0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgVGhlIHZhbHVlIG9mIGEgZGVwZW5kZW5jeSBmZWF0dXJlIGlzIGEgdGFyZ2V0IGFuZCBuZWVkcyB0byBiZQorICAgICAgICAgICAgICAgICMgYWN0dWFsaXplZC4KKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gWyAkKHA6Rz0pLmFjdHVhbGl6ZSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgcGF0aCBpbiAkKGF0dCkgfHwgZnJlZSBpbiAkKGF0dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCB2YWx1ZXMgOworICAgICAgICAgICAgICAgICMgVHJlYXQgZmVhdHVyZXMgd2l0aCAmJiBpbiB0aGUgdmFsdWUgc3BlY2lhbGx5IC0tIGVhY2gKKyAgICAgICAgICAgICAgICAjICYmLXNlcGFyYXRlZCBlbGVtZW50IGlzIGNvbnNpZGVyZWQgYSBzZXBhcmF0ZSB2YWx1ZS4gVGhpcyBpcworICAgICAgICAgICAgICAgICMgbmVlZGVkIHRvIGhhbmRsZSBzZWFyY2hlZCBsaWJyYXJpZXMgb3IgaW5jbHVkZSBwYXRocywgd2hpY2gKKyAgICAgICAgICAgICAgICAjIG1heSBuZWVkIHRvIGJlIGluIGEgc3BlY2lmaWMgb3JkZXIuCisgICAgICAgICAgICAgICAgaWYgISBbIE1BVENIICgmJikgOiAkKHA6Rz0pIF0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9ICQocDpHPSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbIHJlZ2V4LnNwbGl0ICQocDpHPSkgIiYmIiBdIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgcGF0aCBpbiAkKGF0dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbIHNlcXVlbmNlLnRyYW5zZm9ybSBwYXRoLm5hdGl2ZSA6ICQodmFsdWVzKSBdIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQodmFsdWVzKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAkKHA6Rz0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgKz0gJCh2YWx1ZSkgOworICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIEdpdmVuIGEgcnVsZSBuYW1lIGFuZCBhIHByb3BlcnR5IHNldCwgcmV0dXJucyBhIGxpc3Qgb2YgaW50ZXJsZWF2ZWQgdmFyaWFibGVzCisjIG5hbWVzIGFuZCB2YWx1ZXMgd2hpY2ggbXVzdCBiZSBzZXQgb24gdGFyZ2V0cyBmb3IgdGhhdCBydWxlL3Byb3BlcnR5LXNldAorIyBjb21iaW5hdGlvbi4KKyMKK3J1bGUgc2V0LXRhcmdldC12YXJpYWJsZXMtYXV4ICggcnVsZS1vci1tb2R1bGUgOiBwcm9wZXJ0eS1zZXQgKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgcHJvcGVydGllcyA9IFsgJChwcm9wZXJ0eS1zZXQpLnJhdyBdIDsKKyAgICBmb3IgbG9jYWwgZiBpbiAkKC4kKHJ1bGUtb3ItbW9kdWxlKS5mbGFncykKKyAgICB7CisgICAgICAgIGxvY2FsIHZhcmlhYmxlID0gJCguJChydWxlLW9yLW1vZHVsZSkudmFyaWFibGUuJChmKSkgOworICAgICAgICBsb2NhbCBjb25kaXRpb24gPSAkKC4kKHJ1bGUtb3ItbW9kdWxlKS5jb25kaXRpb24uJChmKSkgOworICAgICAgICBsb2NhbCB2YWx1ZXMgPSAkKC4kKHJ1bGUtb3ItbW9kdWxlKS52YWx1ZXMuJChmKSkgOworCisgICAgICAgIGlmICEgJChjb25kaXRpb24pIHx8CisgICAgICAgICAgICBbIGZpbmQtcHJvcGVydHktc3Vic2V0ICQoY29uZGl0aW9uKSA6ICQocHJvcGVydGllcykgXQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBwcm9jZXNzZWQgOworICAgICAgICAgICAgZm9yIGxvY2FsIHYgaW4gJCh2YWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBUaGUgdmFsdWUgbWlnaHQgYmUgPGZlYXR1cmUtbmFtZT4gc28gbmVlZHMgc3BlY2lhbCB0cmVhdG1lbnQuCisgICAgICAgICAgICAgICAgcHJvY2Vzc2VkICs9IFsgaGFuZGxlLWZsYWctdmFsdWUgJCh2KSA6ICQocHJvcGVydGllcykgXSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgbG9jYWwgciBpbiAkKHByb2Nlc3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gJCh2YXJpYWJsZSkgJChyKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFN0cmlwIGF3YXkgbGFzdCBkb3Qgc2VwYXJhdGVkIHBhcnQgYW5kIHJlY3Vyc2UuCisgICAgbG9jYWwgbmV4dCA9IFsgTUFUQ0ggXiguKylcXC4oW15cXC5dKSogOiAkKHJ1bGUtb3ItbW9kdWxlKSBdIDsKKyAgICBpZiAkKG5leHQpCisgICAgeworICAgICAgICByZXN1bHQgKz0gWyBzZXQtdGFyZ2V0LXZhcmlhYmxlcy1hdXggJChuZXh0WzFdKSA6ICQocHJvcGVydHktc2V0KSBdIDsKKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKK3J1bGUgcmVsZXZhbnQtZmVhdHVyZXMgKCBydWxlLW9yLW1vZHVsZSApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBpZiAhICQoLnJlbGV2YW50LWZlYXR1cmVzLiQocnVsZS1vci1tb2R1bGUpKQorICAgIHsKKyAgICAgICAgZm9yIGxvY2FsIGYgaW4gJCguJChydWxlLW9yLW1vZHVsZSkuZmxhZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGNvbmRpdGlvbiA9ICQoLiQocnVsZS1vci1tb2R1bGUpLmNvbmRpdGlvbi4kKGYpKSA7CisgICAgICAgICAgICBsb2NhbCB2YWx1ZXMgPSAkKC4kKHJ1bGUtb3ItbW9kdWxlKS52YWx1ZXMuJChmKSkgOworCisgICAgICAgICAgICBmb3IgbG9jYWwgYyBpbiAkKGNvbmRpdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgbG9jYWwgcCBpbiBbIGZlYXR1cmUuc3BsaXQgJChjKSBdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAkKHA6RykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQocDpHKSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCB0ZW1wID0gWyBmZWF0dXJlLmV4cGFuZC1zdWJmZWF0dXJlcyAkKHApIF0gOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQodGVtcDpHKSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciBsb2NhbCB2IGluICQodmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICQodjpHKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQodjpHKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBTdHJpcCBhd2F5IGxhc3QgZG90IHNlcGFyYXRlZCBwYXJ0IGFuZCByZWN1cnNlLgorICAgICAgICBsb2NhbCBuZXh0ID0gWyBNQVRDSCBeKC4rKVxcLihbXlxcLl0pKiA6ICQocnVsZS1vci1tb2R1bGUpIF0gOworICAgICAgICBpZiAkKG5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSBbIHJlbGV2YW50LWZlYXR1cmVzICQobmV4dFsxXSkgXSA7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gWyBzZXF1ZW5jZS51bmlxdWUgJChyZXN1bHQpIF0gOworICAgICAgICBpZiAkKHJlc3VsdFsxXSkgPSAiIgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSAkKHJlc3VsdCkgOworICAgICAgICB9CisgICAgICAgIC5yZWxldmFudC1mZWF0dXJlcy4kKHJ1bGUtb3ItbW9kdWxlKSA9ICQocmVzdWx0KSA7CisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gJCgucmVsZXZhbnQtZmVhdHVyZXMuJChydWxlLW9yLW1vZHVsZSkpIDsKKyAgICB9Cit9CisKK3J1bGUgZmlsdGVyLXByb3BlcnR5LXNldCAoIHJ1bGUtb3ItbW9kdWxlIDogcHJvcGVydHktc2V0ICkKK3sKKyAgICBsb2NhbCBrZXkgPSAuZmlsdGVyZWQucHJvcGVydHktc2V0LiQocnVsZS1vci1tb2R1bGUpLiQocHJvcGVydHktc2V0KSA7CisgICAgaWYgISAkKCQoa2V5KSkKKyAgICB7CisgICAgICAgIGxvY2FsIHJlbGV2YW50ID0gWyByZWxldmFudC1mZWF0dXJlcyAkKHJ1bGUtb3ItbW9kdWxlKSBdIDsKKyAgICAgICAgbG9jYWwgcmVzdWx0IDsKKyAgICAgICAgZm9yIGxvY2FsIHAgaW4gWyAkKHByb3BlcnR5LXNldCkucmF3IF0KKyAgICAgICAgeworICAgICAgICAgICAgaWYgJChwOkcpIGluICQocmVsZXZhbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQocCkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICQoa2V5KSA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZSAkKHJlc3VsdCkgXSA7CisgICAgfQorICAgIHJldHVybiAkKCQoa2V5KSkgOworfQorCitydWxlIHNldC10YXJnZXQtdmFyaWFibGVzICggcnVsZS1vci1tb2R1bGUgdGFyZ2V0cyArIDogcHJvcGVydHktc2V0ICkKK3sKKyAgICBwcm9wZXJ0eS1zZXQgPSBbIGZpbHRlci1wcm9wZXJ0eS1zZXQgJChydWxlLW9yLW1vZHVsZSkgOiAkKHByb3BlcnR5LXNldCkgXSA7CisgICAgbG9jYWwga2V5ID0gLnN0di4kKHJ1bGUtb3ItbW9kdWxlKS4kKHByb3BlcnR5LXNldCkgOworICAgIGxvY2FsIHNldHRpbmdzID0gJCgkKGtleSkpIDsKKyAgICBpZiAhICQoc2V0dGluZ3MpCisgICAgeworICAgICAgICBzZXR0aW5ncyA9IFsgc2V0LXRhcmdldC12YXJpYWJsZXMtYXV4ICQocnVsZS1vci1tb2R1bGUpIDoKKyAgICAgICAgICAgICQocHJvcGVydHktc2V0KSBdIDsKKworICAgICAgICBpZiAhICQoc2V0dGluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldHRpbmdzID0gbm9uZSA7CisgICAgICAgIH0KKyAgICAgICAgJChrZXkpID0gJChzZXR0aW5ncykgOworICAgIH0KKworICAgIGlmICQoc2V0dGluZ3MpICE9IG5vbmUKKyAgICB7CisgICAgICAgIGxvY2FsIHZhci1uYW1lID0gOworICAgICAgICBmb3IgbG9jYWwgbmFtZS1vci12YWx1ZSBpbiAkKHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKHZhci1uYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICQodmFyLW5hbWUpIG9uICQodGFyZ2V0cykgKz0gJChuYW1lLW9yLXZhbHVlKSA7CisgICAgICAgICAgICAgICAgdmFyLW5hbWUgPSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyLW5hbWUgPSAkKG5hbWUtb3ItdmFsdWUpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisjIE1ha2UgdG9vbHNldCAndG9vbHNldCcsIGRlZmluZWQgaW4gYSBtb2R1bGUgb2YgdGhlIHNhbWUgbmFtZSwgaW5oZXJpdCBmcm9tCisjICdiYXNlJy4KKyMgMS4gVGhlICdpbml0JyBydWxlIGZyb20gJ2Jhc2UnIGlzIGltcG9ydGVkIGludG8gJ3Rvb2xzZXQnIHdpdGggZnVsbCBuYW1lLgorIyAgICBBbm90aGVyICdpbml0JyBpcyBjYWxsZWQsIHdoaWNoIGZvcndhcmRzIHRvIHRoZSBiYXNlIG9uZS4KKyMgMi4gQWxsIGdlbmVyYXRvcnMgZnJvbSAnYmFzZScgYXJlIGNsb25lZC4gVGhlIGlkcyBhcmUgYWRqdXN0ZWQgYW5kIDx0b29sc2V0PgorIyAgICBwcm9wZXJ0eSBpbiByZXF1aXJlcyBpcyBhZGp1c3RlZCB0b28uCisjIDMuIEFsbCBmbGFncyBhcmUgaW5oZXJpdGVkLgorIyA0LiBBbGwgcnVsZXMgYXJlIGltcG9ydGVkLgorIworcnVsZSBpbmhlcml0ICggdG9vbHNldCA6IGJhc2UgKQoreworICAgIGltcG9ydCAkKGJhc2UpIDsKKyAgICBpbmhlcml0LWdlbmVyYXRvcnMgJCh0b29sc2V0KSA6ICQoYmFzZSkgOworICAgIGluaGVyaXQtZmxhZ3MgICAgICAkKHRvb2xzZXQpIDogJChiYXNlKSA7CisgICAgaW5oZXJpdC1ydWxlcyAgICAgICQodG9vbHNldCkgOiAkKGJhc2UpIDsKK30KKworCitydWxlIGluaGVyaXQtZ2VuZXJhdG9ycyAoIHRvb2xzZXQgcHJvcGVydGllcyAqIDogYmFzZSA6IGdlbmVyYXRvcnMtdG8taWdub3JlICogKQoreworICAgIHByb3BlcnRpZXMgPz0gPHRvb2xzZXQ+JCh0b29sc2V0KSA7CisgICAgbG9jYWwgYmFzZS1nZW5lcmF0b3JzID0gWyBnZW5lcmF0b3JzLmdlbmVyYXRvcnMtZm9yLXRvb2xzZXQgJChiYXNlKSBdIDsKKyAgICBmb3IgbG9jYWwgZyBpbiAkKGJhc2UtZ2VuZXJhdG9ycykKKyAgICB7CisgICAgICAgIGxvY2FsIGlkID0gWyAkKGcpLmlkIF0gOworCisgICAgICAgIGlmICEgJChpZCkgaW4gJChnZW5lcmF0b3JzLXRvLWlnbm9yZSkKKyAgICAgICAgeworICAgICAgICAgICAgIyBTb21lIGdlbmVyYXRvciBuYW1lcyBoYXZlIG11bHRpcGxlIHBlcmlvZHMgaW4gdGhlaXIgbmFtZSwgc28KKyAgICAgICAgICAgICMgJChpZDpCPSQodG9vbHNldCkpIGRvZXMgbm90IGdlbmVyYXRlIHRoZSByaWdodCBuZXctaWQgbmFtZS4gRS5nLgorICAgICAgICAgICAgIyBpZiBpZCA9IGdjYy5jb21waWxlLmMrKyB0aGVuICQoaWQ6Qj1kYXJ3aW4pID0gZGFyd2luLmMrKywgd2hpY2ggaXMKKyAgICAgICAgICAgICMgbm90IHdoYXQgd2Ugd2FudC4gTWFudWFsbHkgcGFyc2UgdGhlIGJhc2UgYW5kIHN1ZmZpeC4gSWYgdGhlcmUgaXMKKyAgICAgICAgICAgICMgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIEkgd291bGQgbG92ZSB0byBzZWUgaXQuIFNlZSBhbHNvIHRoZQorICAgICAgICAgICAgIyByZWdpc3RlcigpIHJ1bGUgaW4gdGhlIGdlbmVyYXRvcnMgbW9kdWxlLgorICAgICAgICAgICAgbG9jYWwgYmFzZSA9ICQoaWQpIDsKKyAgICAgICAgICAgIGxvY2FsIHN1ZmZpeCA9ICIiIDsKKyAgICAgICAgICAgIHdoaWxlICQoYmFzZTpTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICQoYmFzZTpTKSQoc3VmZml4KSA7CisgICAgICAgICAgICAgICAgYmFzZSA9ICQoYmFzZTpCKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NhbCBuZXctaWQgPSAkKHRvb2xzZXQpJChzdWZmaXgpIDsKKworICAgICAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3RlciBbICQoZykuY2xvbmUgJChuZXctaWQpIDogJChwcm9wZXJ0aWVzKSBdIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIEJyaW5ncyBhbGwgZmxhZyBkZWZpbml0aW9ucyBmcm9tIHRoZSAnYmFzZScgdG9vbHNldCBpbnRvIHRoZSAndG9vbHNldCcKKyMgdG9vbHNldC4gRmxhZyBkZWZpbml0aW9ucyB3aG9zZSBjb25kaXRpb25zIG1ha2UgdXNlIG9mIHByb3BlcnRpZXMgaW4KKyMgJ3Byb2hpYml0ZWQtcHJvcGVydGllcycgYXJlIGlnbm9yZWQuIERvIG5vdCBjb25mdXNlIHByb3BlcnR5IGFuZCBmZWF0dXJlLCBmb3IKKyMgZXhhbXBsZSA8ZGVidWctc3ltYm9scz5vbiBhbmQgPGRlYnVnLXN5bWJvbHM+b2ZmLCBzbyBibG9ja2luZyBvbmUgb2YgdGhlbSBkb2VzCisjIG5vdCBibG9jayB0aGUgb3RoZXIgb25lLgorIworIyBUaGUgZmxhZyBjb25kaXRpb25zIGFyZSBub3QgYWx0ZXJlZCBhdCBhbGwsIHNvIGlmIGEgY29uZGl0aW9uIGluY2x1ZGVzIGEgbmFtZSwKKyMgb3IgdmVyc2lvbiBvZiBhIGJhc2UgdG9vbHNldCwgaXQgd2lsbCBub3QgZXZlciBtYXRjaCB0aGUgaW5oZXJpdGluZyB0b29sc2V0LgorIyBXaGVuIHN1Y2ggZmxhZyBzZXR0aW5ncyBtdXN0IGJlIGluaGVyaXRlZCwgZGVmaW5lIGEgcnVsZSBpbiBiYXNlIHRvb2xzZXQKKyMgbW9kdWxlIGFuZCBjYWxsIGl0IGFzIG5lZWRlZC4KKyMKK3J1bGUgaW5oZXJpdC1mbGFncyAoIHRvb2xzZXQgOiBiYXNlIDogcHJvaGliaXRlZC1wcm9wZXJ0aWVzICogOiBwcm9oaWJpdGVkLXZhcnMgKiApCit7CisgICAgZm9yIGxvY2FsIGYgaW4gJCgubW9kdWxlLWZsYWdzLiQoYmFzZSkpCisgICAgeworICAgICAgICBsb2NhbCBydWxlLW9yLW1vZHVsZSA9ICQoLnJ1bGUtb3ItbW9kdWxlLiQoZikpIDsKKyAgICAgICAgaWYgKCBbIHNldC5kaWZmZXJlbmNlCisgICAgICAgICAgICAkKC4kKHJ1bGUtb3ItbW9kdWxlKS5jb25kaXRpb24uJChmKSkgOgorICAgICAgICAgICAgICAgICAgJChwcm9oaWJpdGVkLXByb3BlcnRpZXMpIF0KKyAgICAgICAgICAgICAgICAgIHx8ICEgJCguJChydWxlLW9yLW1vZHVsZSkuY29uZGl0aW9uLiQoZikpCisgICAgICAgICkgJiYgKCAhICQoLiQocnVsZS1vci1tb2R1bGUpLnZhcmlhYmxlLiQoZikpIGluICQocHJvaGliaXRlZC12YXJzKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHJ1bGVfID0gWyBNQVRDSCAiW14uXSpcLiguKikiIDogJChydWxlLW9yLW1vZHVsZSkgXSA7CisgICAgICAgICAgICBsb2NhbCBuZXctcnVsZS1vci1tb2R1bGUgOworICAgICAgICAgICAgaWYgJChydWxlXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXctcnVsZS1vci1tb2R1bGUgPSAkKHRvb2xzZXQpLiQocnVsZV8pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXctcnVsZS1vci1tb2R1bGUgPSAkKHRvb2xzZXQpIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWRkLWZsYWcKKyAgICAgICAgICAgICAgICAkKG5ldy1ydWxlLW9yLW1vZHVsZSkKKyAgICAgICAgICAgICAgICA6ICQoLiQocnVsZS1vci1tb2R1bGUpLnZhcmlhYmxlLiQoZikpCisgICAgICAgICAgICAgICAgOiAkKC4kKHJ1bGUtb3ItbW9kdWxlKS5jb25kaXRpb24uJChmKSkKKyAgICAgICAgICAgICAgICA6ICQoLiQocnVsZS1vci1tb2R1bGUpLnZhbHVlcy4kKGYpKSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworcnVsZSBpbmhlcml0LXJ1bGVzICggdG9vbHNldCA6IGJhc2UgOiBsb2NhbGl6ZSA/ICkKK3sKKyAgICAjIEl0IGFwcGVhcnMgdGhhdCAiYWN0aW9uIiBjcmVhdGVzIGEgbG9jYWwgcnVsZS4KKyAgICBsb2NhbCBiYXNlLWdlbmVyYXRvcnMgPSBbIGdlbmVyYXRvcnMuZ2VuZXJhdG9ycy1mb3ItdG9vbHNldCAkKGJhc2UpIF0gOworICAgIGxvY2FsIHJ1bGVzIDsKKyAgICBmb3IgbG9jYWwgZyBpbiAkKGJhc2UtZ2VuZXJhdG9ycykKKyAgICB7CisgICAgICAgIHJ1bGVzICs9IFsgTUFUQ0ggIlteLl0qXC4oLiopIiA6IFsgJChnKS5ydWxlLW5hbWUgXSBdIDsKKyAgICB9CisgICAgcnVsZXMgPSBbIHNlcXVlbmNlLnVuaXF1ZSAkKHJ1bGVzKSBdIDsKKyAgICBJTVBPUlQgJChiYXNlKSA6ICQocnVsZXMpIDogJCh0b29sc2V0KSA6ICQocnVsZXMpIDogJChsb2NhbGl6ZSkgOworICAgIElNUE9SVCAkKHRvb2xzZXQpIDogJChydWxlcykgOiA6ICQodG9vbHNldCkuJChydWxlcykgOworfQorCisucmVxdWlyZW1lbnRzID0gWyBwcm9wZXJ0eS1zZXQuZW1wdHkgXSA7CisKKyMgUmV0dXJuIHRoZSBsaXN0IG9mIGdsb2JhbCAndG9vbHNldCByZXF1aXJlbWVudHMnLiBUaG9zZSByZXF1aXJlbWVudHMgd2lsbCBiZQorIyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgYW55IG1haW4gdGFyZ2V0LgorIworcnVsZSByZXF1aXJlbWVudHMgKCApCit7CisgICAgcmV0dXJuICQoLnJlcXVpcmVtZW50cykgOworfQorCisKKyMgQWRkcyBlbGVtZW50cyB0byB0aGUgbGlzdCBvZiBnbG9iYWwgJ3Rvb2xzZXQgcmVxdWlyZW1lbnRzJy4gVGhlIHJlcXVpcmVtZW50cworIyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHJlcXVpcmVtZW50cyBmb3IgYWxsIG1haW4gdGFyZ2V0cywgYXMgaWYKKyMgdGhleSB3ZXJlIHNwZWNpZmllZCBsaXRlcmFsbHkuIEZvciBiZXN0IHJlc3VsdHMsIGFsbCByZXF1aXJlbWVudHMgYWRkZWQgc2hvdWxkCisjIGJlIGNvbmRpdGlvbmFsIG9yIGluZGlyZWN0IGNvbmRpdGlvbmFsLgorIworcnVsZSBhZGQtcmVxdWlyZW1lbnRzICggcmVxdWlyZW1lbnRzICogKQoreworICAgIGlmICEgJCguaWdub3JlLXJlcXVpcmVtZW50cykKKyAgICB7CisgICAgICAgIHJlcXVpcmVtZW50cyA9IFsgcHJvcGVydHkudHJhbnNsYXRlLWluZGlyZWN0ICQoc3BlY2lmaWNhdGlvbikgOiBbIENBTExFUl9NT0RVTEUgXSBdIDsKKyAgICAgICAgcmVxdWlyZW1lbnRzID0gWyBwcm9wZXJ0eS5leHBhbmQtc3ViZmVhdHVyZXMtaW4tY29uZGl0aW9ucyAkKHJlcXVpcmVtZW50cykgXSA7CisgICAgICAgIHJlcXVpcmVtZW50cyA9IFsgcHJvcGVydHkubWFrZSAkKHJlcXVpcmVtZW50cykgXSA7CisgICAgICAgIC5yZXF1aXJlbWVudHMgPSBbICQoLnJlcXVpcmVtZW50cykuYWRkLXJhdyAkKHJlcXVpcmVtZW50cykgXSA7CisgICAgfQorfQorCisKK3J1bGUgX190ZXN0X18gKCApCit7CisgICAgaW1wb3J0IGFzc2VydCA7CisgICAgbG9jYWwgcCA9IDxiPjAgPGM+MSA8ZD4yIDxlPjMgPGY+NCA7CisgICAgYXNzZXJ0LnJlc3VsdCA8Yz4xLzxkPjIvPGU+MyA6IGZpbmQtcHJvcGVydHktc3Vic2V0IDxjPjEvPGQ+Mi88ZT4zIDxhPjAvPGI+MC88Yz4xIDxkPjIvPGU+NSA8YT45IDogJChwKSA7CisgICAgYXNzZXJ0LnJlc3VsdCA6IGZpbmQtcHJvcGVydHktc3Vic2V0IDxhPjAvPGI+MC88Yz45LzxkPjkvPGU+NSA8YT45IDogJChwKSA7CisKKyAgICBsb2NhbCBwLXNldCA9IDxhPi88Yj4gPGE+MC88Yj4gPGE+LzxiPjEgPGE+MC88Yj4xIDsKKyAgICBhc3NlcnQucmVzdWx0IDxhPi88Yj4gICA6IGZpbmQtcHJvcGVydHktc3Vic2V0ICQocC1zZXQpIDogICAgICAgICAgICAgICAgOworICAgIGFzc2VydC5yZXN1bHQgPGE+MC88Yj4gIDogZmluZC1wcm9wZXJ0eS1zdWJzZXQgJChwLXNldCkgOiA8YT4wICAgICAgPGM+MiA7CisgICAgYXNzZXJ0LnJlc3VsdCA8YT4vPGI+MSAgOiBmaW5kLXByb3BlcnR5LXN1YnNldCAkKHAtc2V0KSA6IDxiPjEgICAgICA8Yz4yIDsKKyAgICBhc3NlcnQucmVzdWx0IDxhPjAvPGI+MSA6IGZpbmQtcHJvcGVydHktc3Vic2V0ICQocC1zZXQpIDogPGE+MCA8Yj4xICAgICAgOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC90eXBlLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvdHlwZS5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjYzQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvdHlwZS5qYW0KQEAgLTAsMCArMSw0MDEgQEAKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMgRGF2ZSBBYnJhaGFtcworIyBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBWbGFkaW1pciBQcnVzCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjICBEZWFscyB3aXRoIHRhcmdldCB0eXBlIGRlY2xhcmF0aW9uIGFuZCBkZWZpbmVzIHRhcmdldCBjbGFzcyB3aGljaCBzdXBwb3J0cworIyAgdHlwZWQgdGFyZ2V0cy4KKworaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IGdlbmVyYXRvcnMgOiAqIDsKK2ltcG9ydCBvcyA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IHNjYW5uZXIgOworCisjIFRoZSBmb2xsb3dpbmcgaW1wb3J0IHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyIGRlcGVuZGVuY3k6CisjIHByb2plY3QgLT4gcHJvamVjdC1yb290IC0+IGJ1aWx0aW4gLT4gdHlwZSAtPiB0YXJnZXRzIC0+IHByb2plY3QKKyMgaW1wb3J0IHRhcmdldHMgOworCisjIFRoZSBmZWF0dXJlIGlzIG9wdGlvbmFsIHNvIGl0IHdvdWxkIG5ldmVyIGdldCBhZGRlZCBpbXBsaWNpdGx5LiBJdCBpcyB1c2VkCisjIG9ubHkgZm9yIGludGVybmFsIHB1cnBvc2VzIGFuZCBpbiBhbGwgY2FzZXMgd2Ugd2FudCB0byB1c2UgaXQgZXhwbGljaXRseS4KK2ZlYXR1cmUuZmVhdHVyZSB0YXJnZXQtdHlwZSA6IDogY29tcG9zaXRlIG9wdGlvbmFsIDsKKworZmVhdHVyZS5mZWF0dXJlIG1haW4tdGFyZ2V0LXR5cGUgOiA6IG9wdGlvbmFsIGluY2lkZW50YWwgOworZmVhdHVyZS5mZWF0dXJlIGJhc2UtdGFyZ2V0LXR5cGUgOiA6IGNvbXBvc2l0ZSBvcHRpb25hbCBmcmVlIDsKKworCisjIFJlZ2lzdGVycyBhIHRhcmdldCB0eXBlLCBwb3NzaWJsZSBkZXJpdmVkIGZyb20gYSAnYmFzZS10eXBlJy4gUHJvdmlkaW5nIGEgbGlzdAorIyBvZiAnc3VmZml4ZXMnIGhlcmUgaXMgYSBzaG9ydGN1dCBmb3Igc2VwYXJhdGVseSBjYWxsaW5nIHRoZSByZWdpc3Rlci1zdWZmaXhlcworIyBydWxlIHdpdGggdGhlIGdpdmVuIHN1ZmZpeGVzIGFuZCB0aGUgc2V0LWdlbmVyYXRlZC10YXJnZXQtc3VmZml4IHJ1bGUgd2l0aCB0aGUKKyMgZmlyc3QgZ2l2ZW4gc3VmZml4LgorIworcnVsZSByZWdpc3RlciAoIHR5cGUgOiBzdWZmaXhlcyAqIDogYmFzZS10eXBlID8gKQoreworICAgICMgVHlwZSBuYW1lcyBjYW5ub3QgY29udGFpbiBoeXBoZW5zLCBiZWNhdXNlIHdoZW4gdXNlZCBhcyBmZWF0dXJlLXZhbHVlcworICAgICMgdGhleSB3b3VsZCBiZSBpbnRlcnByZXRlZCBhcyBjb21wb3NpdGUgZmVhdHVyZXMgd2hpY2ggbmVlZCB0byBiZQorICAgICMgZGVjb21wb3NlZC4KKyAgICBzd2l0Y2ggJCh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSAqLSogOgorICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICBlcnJvcnMuZXJyb3IgInR5cGUgbmFtZSBcIiQodHlwZSlcIiBjb250YWlucyBhIGh5cGhlbiIgOworICAgIH0KKworICAgIGlmICQodHlwZSkgaW4gJCgudHlwZXMpCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgZXJyb3JzLmVycm9yICJUeXBlICQodHlwZSkgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiIgOworICAgIH0KKworICAgIHsKKyAgICAgICAgLnR5cGVzICs9ICQodHlwZSkgOworICAgICAgICAuYmFzZS4kKHR5cGUpID0gJChiYXNlLXR5cGUpIDsKKyAgICAgICAgLmRlcml2ZWQuJChiYXNlLXR5cGUpICs9ICQodHlwZSkgOworICAgICAgICAuYmFzZXMuJCh0eXBlKSA9ICQodHlwZSkgJCguYmFzZXMuJChiYXNlLXR5cGUpKSA7CisKKyAgICAgICAgIyBTdG9yZSBzdWZmaXhlcyBmb3IgZ2VuZXJhdGVkIHRhcmdldHMuCisgICAgICAgIC5zdWZmaXhlcy4kKHR5cGUpID0gWyBuZXcgcHJvcGVydHktbWFwIF0gOworCisgICAgICAgICMgU3RvcmUgcHJlZml4ZXMgZm9yIGdlbmVyYXRlZCB0YXJnZXRzIChlLmcuICJsaWIiIGZvciBsaWJyYXJ5KS4KKyAgICAgICAgLnByZWZpeGVzLiQodHlwZSkgPSBbIG5ldyBwcm9wZXJ0eS1tYXAgXSA7CisKKyAgICAgICAgaWYgJChzdWZmaXhlcyktaXMtZGVmaW5lZAorICAgICAgICB7CisgICAgICAgICAgICAjIFNwZWNpZnkgbWFwcGluZyBmcm9tIHN1ZmZpeGVzIHRvIHR5cGUuCisgICAgICAgICAgICByZWdpc3Rlci1zdWZmaXhlcyAkKHN1ZmZpeGVzKSA6ICQodHlwZSkgOworICAgICAgICAgICAgIyBCeSBkZWZhdWx0IGdlbmVyYXRlZCB0YXJnZXRzIG9mICd0eXBlJyB3aWxsIHVzZSB0aGUgZmlyc3Qgb2YKKyAgICAgICAgICAgICMnc3VmZml4ZXMnLiBUaGlzIG1heSBiZSBvdmVycmlkZW4uCisgICAgICAgICAgICBzZXQtZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXggJCh0eXBlKSA6IDogJChzdWZmaXhlc1sxXSkgOworICAgICAgICB9CisKKyAgICAgICAgZmVhdHVyZS5leHRlbmQgdGFyZ2V0LXR5cGUgICAgICA6ICQodHlwZSkgOworICAgICAgICBmZWF0dXJlLmV4dGVuZCBtYWluLXRhcmdldC10eXBlIDogJCh0eXBlKSA7CisgICAgICAgIGZlYXR1cmUuZXh0ZW5kIGJhc2UtdGFyZ2V0LXR5cGUgOiAkKHR5cGUpIDsKKworICAgICAgICBmZWF0dXJlLmNvbXBvc2UgPHRhcmdldC10eXBlPiQodHlwZSkgOiAkKGJhc2UtdHlwZTpHPTxiYXNlLXRhcmdldC10eXBlPikgOworICAgICAgICBmZWF0dXJlLmNvbXBvc2UgPGJhc2UtdGFyZ2V0LXR5cGU+JCh0eXBlKSA6IDxiYXNlLXRhcmdldC10eXBlPiQoYmFzZS10eXBlKSA7CisKKyAgICAgICAgIyBXZSB1c2VkIHRvIGRlY2xhcmUgdGhlIG1haW4gdGFyZ2V0IHJ1bGUgb25seSB3aGVuIGEgJ21haW4nIHBhcmFtZXRlcgorICAgICAgICAjIGhhcyBiZWVuIHNwZWNpZmllZC4gSG93ZXZlciwgaXQgaXMgaGFyZCB0byBkZWNpZGUgdGhhdCBhIHR5cGUgd2lsbAorICAgICAgICAjICpuZXZlciogbmVlZCBhIG1haW4gdGFyZ2V0IHJ1bGUgYW5kIHNvIGZyb20gdGltZSB0byB0aW1lIHdlIG5lZWRlZCB0bworICAgICAgICAjIG1ha2UgeWV0IGFub3RoZXIgdHlwZSAnbWFpbicuIFNvIG5vdyBhIG1haW4gdGFyZ2V0IHJ1bGUgaXMgZGVmaW5lZCBmb3IKKyAgICAgICAgIyBlYWNoIHR5cGUuCisgICAgICAgIG1haW4tcnVsZS1uYW1lID0gWyB0eXBlLXRvLXJ1bGUtbmFtZSAkKHR5cGUpIF0gOworICAgICAgICAubWFpbi10YXJnZXQtdHlwZS4kKG1haW4tcnVsZS1uYW1lKSA9ICQodHlwZSkgOworICAgICAgICBJTVBPUlQgJChfX25hbWVfXykgOiBtYWluLXRhcmdldC1ydWxlIDogOiAkKG1haW4tcnVsZS1uYW1lKSA7CisKKyAgICAgICAgIyBBZGRpbmcgYSBuZXcgZGVyaXZlZCB0eXBlIGFmZmVjdHMgZ2VuZXJhdG9yIHNlbGVjdGlvbiBzbyB3ZSBuZWVkIHRvCisgICAgICAgICMgbWFrZSB0aGUgZ2VuZXJhdG9yIHNlbGVjdGlvbiBtb2R1bGUgdXBkYXRlIGFueSBvZiBpdHMgY2FjaGVkCisgICAgICAgICMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBhIG5ldyBkZXJpdmVkIHR5cGUgYmVpbmcgZGVmaW5lZC4KKyAgICAgICAgZ2VuZXJhdG9ycy51cGRhdGUtY2FjaGVkLWluZm9ybWF0aW9uLXdpdGgtYS1uZXctdHlwZSAkKHR5cGUpIDsKKyAgICB9Cit9CisKKworIyBHaXZlbiBhIHR5cGUsIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG1haW4gdGFyZ2V0IHJ1bGUgd2hpY2ggY3JlYXRlcyB0YXJnZXRzCisjIG9mIHRoYXQgdHlwZS4KKyMKK3J1bGUgdHlwZS10by1ydWxlLW5hbWUgKCB0eXBlICkKK3sKKyAgICAjIExvd2VyY2FzZSBldmVyeXRoaW5nLiBDb252ZXJ0IHVuZGVyc2NvcmVzIHRvIGRhc2hlcy4KKyAgICBpbXBvcnQgcmVnZXggOworICAgIGxvY2FsIG4gPSBbIHJlZ2V4LnNwbGl0ICQodHlwZTpMKSAiXyIgXSA7CisgICAgcmV0dXJuICQobjpKPS0pIDsKK30KKworCisjIEdpdmVuIGEgbWFpbiB0YXJnZXQgcnVsZSBuYW1lLCByZXR1cm5zIHRoZSB0eXBlIGZvciB3aGljaCBpdCBjcmVhdGVzIHRhcmdldHMuCisjCitydWxlIHR5cGUtZnJvbS1ydWxlLW5hbWUgKCBydWxlLW5hbWUgKQoreworICAgIHJldHVybiAkKC5tYWluLXRhcmdldC10eXBlLiQocnVsZS1uYW1lKSkgOworfQorCisKKyMgU3BlY2lmaWVzIHRoYXQgZmlsZXMgd2l0aCBzdWZmaXggZnJvbSAnc3VmZml4ZXMnIGJlIHJlY29nbml6ZWQgYXMgdGFyZ2V0cyBvZgorIyB0eXBlICd0eXBlJy4gSXNzdWVzIGFuIGVycm9yIGlmIGEgZGlmZmVyZW50IHR5cGUgaXMgYWxyZWFkeSBzcGVjaWZpZWQgZm9yIGFueQorIyBvZiB0aGUgc3VmZml4ZXMuCisjCitydWxlIHJlZ2lzdGVyLXN1ZmZpeGVzICggc3VmZml4ZXMgKyA6IHR5cGUgKQoreworICAgIGZvciBsb2NhbCBzIGluICQoc3VmZml4ZXMpCisgICAgeworICAgICAgICBpZiAhICQoLnR5cGUuJChzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLnR5cGUuJChzKSA9ICQodHlwZSkgOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgJCgudHlwZS4kKHMpKSAhPSAkKHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICAgICAgZXJyb3JzLmVycm9yIEF0dGVtcHRpbmcgdG8gc3BlY2lmeSBtdWx0aXBsZSB0eXBlcyBmb3Igc3VmZml4CisgICAgICAgICAgICAgICAgXCIkKHMpXCIgOiAiT2xkIHR5cGUgJCgudHlwZS4kKHMpKSwgTmV3IHR5cGUgJCh0eXBlKSIgOworICAgICAgICB9CisgICAgfQorfQorCisKKyMgUmV0dXJucyB0cnVlIGlmZiB0eXBlIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCisjCitydWxlIHJlZ2lzdGVyZWQgKCB0eXBlICkKK3sKKyAgICBpZiAkKHR5cGUpIGluICQoLnR5cGVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWUgOworICAgIH0KK30KKworCisjIElzc3VlcyBhbiBlcnJvciBpZiAndHlwZScgaXMgdW5rbm93bi4KKyMKK3J1bGUgdmFsaWRhdGUgKCB0eXBlICkKK3sKKyAgICBpZiAhIFsgcmVnaXN0ZXJlZCAkKHR5cGUpIF0KKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgIlVua25vd24gdGFyZ2V0IHR5cGUgJCh0eXBlKSIgOworICAgIH0KK30KKworCisjIFNldHMgYSBzY2FubmVyIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGlzICd0eXBlJy4KKyMKK3J1bGUgc2V0LXNjYW5uZXIgKCB0eXBlIDogc2Nhbm5lciApCit7CisgICAgdmFsaWRhdGUgJCh0eXBlKSA7CisgICAgLnNjYW5uZXIuJCh0eXBlKSA9ICQoc2Nhbm5lcikgOworfQorCisKKyMgUmV0dXJucyBhIHNjYW5uZXIgaW5zdGFuY2UgYXBwcm9wcmlhdGUgdG8gJ3R5cGUnIGFuZCAncHJvcGVydGllcycuCisjCitydWxlIGdldC1zY2FubmVyICggdHlwZSA6IHByb3BlcnR5LXNldCApCit7CisgICAgaWYgJCguc2Nhbm5lci4kKHR5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFsgc2Nhbm5lci5nZXQgJCguc2Nhbm5lci4kKHR5cGUpKSA6ICQocHJvcGVydHktc2V0KSBdIDsKKyAgICB9Cit9CisKKworIyBSZXR1cm5zIGEgYmFzZSB0eXBlIGZvciB0aGUgZ2l2ZW4gdHlwZSBvciBub3RoaW5nIGluIGNhc2UgdGhlIGdpdmVuIHR5cGUgaXMKKyMgbm90IGRlcml2ZWQuCisjCitydWxlIGJhc2UgKCB0eXBlICkKK3sKKyAgICByZXR1cm4gJCguYmFzZS4kKHR5cGUpKSA7Cit9CisKKworIyBSZXR1cm5zIHRoZSBnaXZlbiB0eXBlIGFuZCBhbGwgb2YgaXRzIGJhc2UgdHlwZXMgaW4gb3JkZXIgb2YgdGhlaXIgZGlzdGFuY2UKKyMgZnJvbSB0eXBlLgorIworcnVsZSBhbGwtYmFzZXMgKCB0eXBlICkKK3sKKyAgICByZXR1cm4gJCguYmFzZXMuJCh0eXBlKSkgOworfQorCisKKyMgUmV0dXJucyB0aGUgZ2l2ZW4gdHlwZSBhbmQgYWxsIG9mIGl0cyBkZXJpdmVkIHR5cGVzIGluIG9yZGVyIG9mIHRoZWlyIGRpc3RhbmNlCisjIGZyb20gdHlwZS4KKyMKK3J1bGUgYWxsLWRlcml2ZWQgKCB0eXBlICkKK3sKKyAgICBsb2NhbCByZXN1bHQgPSAkKHR5cGUpIDsKKyAgICBmb3IgbG9jYWwgZCBpbiAkKC5kZXJpdmVkLiQodHlwZSkpCisgICAgeworICAgICAgICByZXN1bHQgKz0gWyBhbGwtZGVyaXZlZCAkKGQpIF0gOworICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIFJldHVybnMgdHJ1ZSBpZiAndHlwZScgaXMgZXF1YWwgdG8gJ2Jhc2UnIG9yIGhhcyAnYmFzZScgYXMgaXRzIGRpcmVjdCBvcgorIyBpbmRpcmVjdCBiYXNlLgorIworcnVsZSBpcy1kZXJpdmVkICggdHlwZSBiYXNlICkKK3sKKyAgICBpZiAkKGJhc2UpIGluICQoLmJhc2VzLiQodHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgfQorfQorCisjIFJldHVybnMgdHJ1ZSBpZiAndHlwZScgaXMgZWl0aGVyIGRlcml2ZWQgZnJvbSBvciBpcyBlcXVhbCB0byAnYmFzZScuCisjCisjIFRPRE86IEl0IG1pZ2h0IGJlIHRoYXQgaXMtZGVyaXZlZCBhbmQgaXMtc3VidHlwZSB3ZXJlIG1lYW50IHRvIGJlIGRpZmZlcmVudAorIyBydWxlcyAtIG9uZSByZXR1cm5pbmcgdHJ1ZSBmb3IgdHlwZSA9IGJhc2UgYW5kIG9uZSBub3QsIGJ1dCBhcyBjdXJyZW50bHkKKyMgaW1wbGVtZW50ZWQgdGhleSBhcmUgYWN0dWFsbHkgdGhlIHNhbWUuIENsZWFuIHRoaXMgdXAuCisjCitydWxlIGlzLXN1YnR5cGUgKCB0eXBlIGJhc2UgKQoreworICAgIHJldHVybiBbIGlzLWRlcml2ZWQgJCh0eXBlKSAkKGJhc2UpIF0gOworfQorCisKKworCisjIFNldHMgYSBmaWxlIHN1ZmZpeCB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBhIHRhcmdldCBvZiAndHlwZScgd2l0aCB0aGUKKyMgc3BlY2lmaWVkIHByb3BlcnRpZXMuIENhbiBiZSBjYWxsZWQgd2l0aCBubyBwcm9wZXJ0aWVzIGlmIG5vIHN1ZmZpeCBoYXMKKyMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCBmb3IgdGhlICd0eXBlJy4gVGhlICdzdWZmaXgnIHBhcmFtZXRlciBjYW4gYmUgYW4gZW1wdHkKKyMgc3RyaW5nICgiIikgdG8gaW5kaWNhdGUgdGhhdCBubyBzdWZmaXggc2hvdWxkIGJlIHVzZWQuCisjCisjIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGNhdXNlIGZpbGVzIHdpdGggJ3N1ZmZpeCcgdG8gYmUgYXV0b21hdGljYWxseQorIyByZWNvZ25pemVkIGFzIGJlaW5nIG9mICd0eXBlJy4gVHdvIGRpZmZlcmVudCB0eXBlcyBjYW4gdXNlIHRoZSBzYW1lIHN1ZmZpeCBmb3IKKyMgdGhlaXIgZ2VuZXJhdGVkIGZpbGVzIGJ1dCBvbmx5IG9uZSB0eXBlIGNhbiBiZSBhdXRvLWRldGVjdGVkIGZvciBhIGZpbGUgd2l0aAorIyB0aGF0IHN1ZmZpeC4gVXNlciBzaG91bGQgZXhwbGljaXRseSBzcGVjaWZ5IHdoaWNoIG9uZSB1c2luZyB0aGUKKyMgcmVnaXN0ZXItc3VmZml4ZXMgcnVsZS4KKyMKK3J1bGUgc2V0LWdlbmVyYXRlZC10YXJnZXQtc3VmZml4ICggdHlwZSA6IHByb3BlcnRpZXMgKiA6IHN1ZmZpeCApCit7CisgICAgc2V0LWdlbmVyYXRlZC10YXJnZXQtcHMgc3VmZml4IDogJCh0eXBlKSA6ICQocHJvcGVydGllcykgOiAkKHN1ZmZpeCkgOworfQorCisKKyMgQ2hhbmdlIHRoZSBzdWZmaXggcHJldmlvdXNseSByZWdpc3RlcmVkIGZvciB0aGlzIHR5cGUvcHJvcGVydGllcyBjb21iaW5hdGlvbi4KKyMgSWYgc3VmZml4IGlzIG5vdCB5ZXQgc3BlY2lmaWVkLCBzZXRzIGl0LgorIworcnVsZSBjaGFuZ2UtZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXggKCB0eXBlIDogcHJvcGVydGllcyAqIDogc3VmZml4ICkKK3sKKyAgICBjaGFuZ2UtZ2VuZXJhdGVkLXRhcmdldC1wcyBzdWZmaXggOiAkKHR5cGUpIDogJChwcm9wZXJ0aWVzKSA6ICQoc3VmZml4KSA7Cit9CisKKworIyBSZXR1cm5zIHRoZSBzdWZmaXggdXNlZCB3aGVuIGdlbmVyYXRpbmcgYSBmaWxlIG9mICd0eXBlJyB3aXRoIHRoZSBnaXZlbgorIyBwcm9wZXJ0aWVzLgorIworcnVsZSBnZW5lcmF0ZWQtdGFyZ2V0LXN1ZmZpeCAoIHR5cGUgOiBwcm9wZXJ0eS1zZXQgKQoreworICAgIHJldHVybiBbIGdlbmVyYXRlZC10YXJnZXQtcHMgc3VmZml4IDogJCh0eXBlKSA6ICQocHJvcGVydHktc2V0KSBdIDsKK30KKworCisjIFNldHMgYSB0YXJnZXQgcHJlZml4IHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRhcmdldHMgb2YgJ3R5cGUnCisjIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzLiBDYW4gYmUgY2FsbGVkIHdpdGggZW1wdHkgcHJvcGVydGllcyBpZiBubworIyBwcmVmaXggZm9yICd0eXBlJyBoYXMgYmVlbiBzcGVjaWZpZWQgeWV0LgorIworIyBUaGUgJ3ByZWZpeCcgcGFyYW1ldGVyIGNhbiBiZSBlbXB0eSBzdHJpbmcgKCIiKSB0byBpbmRpY2F0ZSB0aGF0IG5vIHByZWZpeAorIyBzaG91bGQgYmUgdXNlZC4KKyMKKyMgVXNhZ2UgZXhhbXBsZTogbGlicmFyeSBuYW1lcyB1c2UgdGhlICJsaWIiIHByZWZpeCBvbiB1bml4LgorIworcnVsZSBzZXQtZ2VuZXJhdGVkLXRhcmdldC1wcmVmaXggKCB0eXBlIDogcHJvcGVydGllcyAqIDogcHJlZml4ICkKK3sKKyAgICBzZXQtZ2VuZXJhdGVkLXRhcmdldC1wcyBwcmVmaXggOiAkKHR5cGUpIDogJChwcm9wZXJ0aWVzKSA6ICQocHJlZml4KSA7Cit9CisKKworIyBDaGFuZ2UgdGhlIHByZWZpeCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZS9wcm9wZXJ0aWVzIGNvbWJpbmF0aW9uLgorIyBJZiBwcmVmaXggaXMgbm90IHlldCBzcGVjaWZpZWQsIHNldHMgaXQuCisjCitydWxlIGNoYW5nZS1nZW5lcmF0ZWQtdGFyZ2V0LXByZWZpeCAoIHR5cGUgOiBwcm9wZXJ0aWVzICogOiBwcmVmaXggKQoreworICAgIGNoYW5nZS1nZW5lcmF0ZWQtdGFyZ2V0LXBzIHByZWZpeCA6ICQodHlwZSkgOiAkKHByb3BlcnRpZXMpIDogJChwcmVmaXgpIDsKK30KKworCitydWxlIGdlbmVyYXRlZC10YXJnZXQtcHJlZml4ICggdHlwZSA6IHByb3BlcnR5LXNldCApCit7CisgICAgcmV0dXJuIFsgZ2VuZXJhdGVkLXRhcmdldC1wcyBwcmVmaXggOiAkKHR5cGUpIDogJChwcm9wZXJ0eS1zZXQpIF0gOworfQorCisKKyMgQ29tbW9uIHJ1bGVzIGZvciBwcmVmaXgvc3VmZml4IHByb3Zpc2lvbmluZyBmb2xsb3cuCisKK2xvY2FsIHJ1bGUgc2V0LWdlbmVyYXRlZC10YXJnZXQtcHMgKCBwcyA6IHR5cGUgOiBwcm9wZXJ0aWVzICogOiBwc3ZhbCApCit7CisgICAgJCguJChwcyllcy4kKHR5cGUpKS5pbnNlcnQgJChwcm9wZXJ0aWVzKSA6ICQocHN2YWwpIDsKK30KKworCitsb2NhbCBydWxlIGNoYW5nZS1nZW5lcmF0ZWQtdGFyZ2V0LXBzICggcHMgOiB0eXBlIDogcHJvcGVydGllcyAqIDogcHN2YWwgKQoreworICAgIGxvY2FsIHByZXYgPSBbICQoLiQocHMpZXMuJCh0eXBlKSkuZmluZC1yZXBsYWNlICQocHJvcGVydGllcykgOiAkKHBzdmFsKSBdIDsKKyAgICBpZiAhICQocHJldikKKyAgICB7CisgICAgICAgIHNldC1nZW5lcmF0ZWQtdGFyZ2V0LXBzICQocHMpIDogJCh0eXBlKSA6ICQocHJvcGVydGllcykgOiAkKHBzdmFsKSA7CisgICAgfQorfQorCisKKyMgUmV0dXJucyBlaXRoZXIgcHJlZml4IG9yIHN1ZmZpeCAoYXMgaW5kaWNhdGVkIGJ5ICdwcycpIHRoYXQgc2hvdWxkIGJlIHVzZWQKKyMgd2hlbiBnZW5lcmF0aW5nIGEgdGFyZ2V0IG9mICd0eXBlJyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4gUGFyYW1ldGVyCisjICdwcycgY2FuIGJlIGVpdGhlciAicHJlZml4IiBvciAic3VmZml4Ii4gIElmIG5vIHByZWZpeC9zdWZmaXggaXMgc3BlY2lmaWVkIGZvcgorIyAndHlwZScsIHJldHVybnMgcHJlZml4L3N1ZmZpeCBmb3IgYmFzZSB0eXBlLCBpZiBhbnkuCisjCitsb2NhbCBydWxlIGdlbmVyYXRlZC10YXJnZXQtcHMgKCBwcyA6IHR5cGUgOiBwcm9wZXJ0eS1zZXQgKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgbG9jYWwgZm91bmQgOworICAgIHdoaWxlICQodHlwZSkgJiYgISAkKGZvdW5kKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gWyAkKC4kKHBzKWVzLiQodHlwZSkpLmZpbmQgJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICAjIElmIHRoZSBwcmVmaXgvc3VmZml4IGlzIGV4cGxpY2l0bHkgc2V0IHRvIGFuIGVtcHR5IHN0cmluZywgd2UgY29uc2lkZXIKKyAgICAgICAgIyBwcmVmaXgvc3VmZml4IHRvIGJlIGZvdW5kLiBJZiB3ZSB3ZXJlIG5vdCB0byBjb21wYXJlIHdpdGggIiIsIHRoZXJlCisgICAgICAgICMgd291bGQgYmUgbm8gd2F5IHRvIHNwZWNpZnkgYW4gZW1wdHkgcHJlZml4L3N1ZmZpeC4KKyAgICAgICAgaWYgJChyZXN1bHQpLWlzLWRlZmluZWQKKyAgICAgICAgeworICAgICAgICAgICAgZm91bmQgPSB0cnVlIDsKKyAgICAgICAgfQorICAgICAgICB0eXBlID0gJCguYmFzZS4kKHR5cGUpKSA7CisgICAgfQorICAgIGlmICQocmVzdWx0KSA9ICIiCisgICAgeworICAgICAgICByZXN1bHQgPSA7CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgUmV0dXJucyBmaWxlIHR5cGUgZ2l2ZW4gaXRzIG5hbWUuIElmIHRoZXJlIGFyZSBzZXZlcmFsIGRvdHMgaW4gZmlsZW5hbWUsIHRyaWVzCisjIGVhY2ggc3VmZml4LiBFLmcuIGZvciBuYW1lIG9mICJmaWxlLnNvLjEuMiIgc3VmZml4ZXMgIjIiLCAiMSIsIGFuZCAic28iIHdpbGwKKyMgYmUgdHJpZWQuCisjCitydWxlIHR5cGUgKCBmaWxlbmFtZSApCit7CisgICAgaWYgWyBvcy5uYW1lIF0gaW4gTlQgQ1lHV0lOCisgICAgeworICAgICAgICBmaWxlbmFtZSA9ICQoZmlsZW5hbWU6TCkgOworICAgIH0KKyAgICBsb2NhbCB0eXBlIDsKKyAgICB3aGlsZSAhICQodHlwZSkgJiYgJChmaWxlbmFtZTpTKQorICAgIHsKKyAgICAgICAgbG9jYWwgc3VmZml4ID0gJChmaWxlbmFtZTpTKSA7CisgICAgICAgIHR5cGUgPSAkKC50eXBlJChzdWZmaXgpKSA7CisgICAgICAgIGZpbGVuYW1lID0gJChmaWxlbmFtZTpTPSkgOworICAgIH0KKyAgICByZXR1cm4gJCh0eXBlKSA7Cit9CisKKworIyBSdWxlIHVzZWQgdG8gY29uc3RydWN0IGFsbCBtYWluIHRhcmdldHMuIE5vdGUgdGhhdCB0aGlzIHJ1bGUgZ2V0cyBpbXBvcnRlZAorIyBpbnRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHVuZGVyIGRpZmZlcmVudCBhbGlhcyBuYW1lcyBhbmQgdGhlIGV4YWN0IHRhcmdldAorIyB0eXBlIHRvIGNvbnN0cnVjdCBpcyBzZWxlY3RlZCBiYXNlZCBvbiB0aGUgYWxpYXMgdXNlZCB0byBhY3R1YWxseSBpbnZva2UgdGhpcworIyBydWxlLgorIworcnVsZSBtYWluLXRhcmdldC1ydWxlICggbmFtZSA6IHNvdXJjZXMgKiA6IHJlcXVpcmVtZW50cyAqIDogZGVmYXVsdC1idWlsZCAqIDoKKyAgICB1c2FnZS1yZXF1aXJlbWVudHMgKiApCit7CisgICAgIyBGaXJzdCBkaXNjb3ZlciB0aGUgcmVxdWlyZWQgdGFyZ2V0IHR5cGUgYmFzZWQgb24gdGhlIGV4YWN0IGFsaWFzIHVzZWQgdG8KKyAgICAjIGludm9rZSB0aGlzIHJ1bGUuCisgICAgbG9jYWwgYnQgPSBbIEJBQ0tUUkFDRSAxIF0gOworICAgIGxvY2FsIHJ1bGVuYW1lID0gJChidFs0XSkgOworICAgIGxvY2FsIHRhcmdldC10eXBlID0gWyB0eXBlLWZyb20tcnVsZS1uYW1lICQocnVsZW5hbWUpIF0gOworCisgICAgIyBUaGlzIGlzIGEgY2lyY3VsYXIgbW9kdWxlIGRlcGVuZGVuY3kgYW5kIHNvIG11c3QgYmUgaW1wb3J0ZWQgaGVyZS4KKyAgICBpbXBvcnQgdGFyZ2V0cyA7CisKKyAgICByZXR1cm4gWyB0YXJnZXRzLmNyZWF0ZS10eXBlZC10YXJnZXQgJCh0YXJnZXQtdHlwZSkgOiBbIHByb2plY3QuY3VycmVudCBdIDoKKyAgICAgICAgJChuYW1lKSA6ICQoc291cmNlcykgOiAkKHJlcXVpcmVtZW50cykgOiAkKGRlZmF1bHQtYnVpbGQpIDoKKyAgICAgICAgJCh1c2FnZS1yZXF1aXJlbWVudHMpIF0gOworfQorCisKK3J1bGUgX190ZXN0X18gKCApCit7CisgICAgaW1wb3J0IGFzc2VydCA7CisKKyAgICAjIFRPRE86IEFkZCB0ZXN0cyBmb3IgYWxsIHRoZSBpcy1kZXJpdmVkLCBpcy1iYXNlICYgcmVsYXRlZCB0eXBlIHJlbGF0aW9uCisgICAgIyBjaGVja2luZyBydWxlcy4KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvYnVpbGQvdmVyc2lvbi5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL3ZlcnNpb24uamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Yjc4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL3ZlcnNpb24uamFtCkBAIC0wLDAgKzEsMTY1IEBACisjIENvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA2IFZsYWRpbWlyIFBydXMKKyMgQ29weXJpZ2h0IDIwMDgsIDIwMTIgSnVya28gR29zcG9kbmV0aWMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2ltcG9ydCBudW1iZXJzIDsKKworCisubWFqb3IgPSAiMjAxMSIgOworLm1pbm9yID0gIjEyIiA7CisKKworcnVsZSBib29zdC1idWlsZCAoICkKK3sKKyAgICByZXR1cm4gIiQoLm1ham9yKS4kKC5taW5vciktc3ZuIiA7Cit9CisKKworcnVsZSBwcmludCAoICkKK3sKKyAgICBpZiBbIHZlcmlmeS1lbmdpbmUtdmVyc2lvbiBdCisgICAgeyAgICAgICAgCisgICAgICAgIEVDSE8gIkJvb3N0LkJ1aWxkIiBbIGJvb3N0LWJ1aWxkIF0gOworICAgIH0gICAgCit9CisKKworcnVsZSB2ZXJpZnktZW5naW5lLXZlcnNpb24gKCApCit7CisgICAgbG9jYWwgdiA9IFsgbW9kdWxlcy5wZWVrIDogSkFNX1ZFUlNJT04gXSA7CisgICAgCisgICAgaWYgJCh2WzFdKSAhPSAkKC5tYWpvcikgfHwgJCh2WzJdKSAhPSAkKC5taW5vcikKKyAgICB7CisgICAgICAgIGxvY2FsIGFyZ3YgPSBbIG1vZHVsZXMucGVlayA6IEFSR1YgXSA7CisgICAgICAgIGxvY2FsIGUgPSAkKGFyZ3ZbMV0pIDsKKyAgICAgICAgbG9jYWwgbCA9IFsgbW9kdWxlcy5iaW5kaW5nIHZlcnNpb24gXSA7CisgICAgICAgIGwgPSAkKGw6RCkgOworICAgICAgICBsID0gJChsOkQpIDsKKyAgICAgICAgRUNITyAid2FybmluZzogbWlzbWF0Y2hlZCB2ZXJzaW9ucyBvZiBCb29zdC5CdWlsZCBlbmdpbmUgYW5kIGNvcmUiIDsKKyAgICAgICAgRUNITyAid2FybmluZzogQm9vc3QuQnVpbGQgZW5naW5lICgkKGUpKSBpcyAkKHY6Sj0uKSIgOworICAgICAgICBFQ0hPICJ3YXJuaW5nOiBCb29zdC5CdWlsZCBjb3JlIChhdCAkKGwpKSBpcyIgWyBib29zdC1idWlsZCBdIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWUgOworICAgIH0gICAgCit9CisKKworIyBVdGlsaXR5IHJ1bGUgZm9yIHRlc3Rpbmcgd2hldGhlciBhbGwgZWxlbWVudHMgaW4gYSBzZXF1ZW5jZSBhcmUgZXF1YWwgdG8gMC4KKyMKK2xvY2FsIHJ1bGUgaXMtYWxsLXplcm9lcyAoIHNlcXVlbmNlICogKQoreworICAgIGxvY2FsIHJlc3VsdCA9ICJ0cnVlIiA7CisgICAgZm9yIGxvY2FsIGUgaW4gJChzZXF1ZW5jZSkKKyAgICB7CisgICAgICAgIGlmICQoZSkgIT0gIjAiCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICIiIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIFJldHVybnMgInRydWUiIGlmIHRoZSBmaXJzdCB2ZXJzaW9uIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kIG9uZS4KKyMKK3J1bGUgdmVyc2lvbi1sZXNzICggbGhzICsgOiByaHMgKyApCit7CisgICAgbnVtYmVycy5jaGVjayAkKGxocykgOworICAgIG51bWJlcnMuY2hlY2sgJChyaHMpIDsKKworICAgIGxvY2FsIGRvbmUgOworICAgIGxvY2FsIHJlc3VsdCA7CisKKyAgICB3aGlsZSAhICQoZG9uZSkgJiYgJChsaHMpICYmICQocmhzKQorICAgIHsKKyAgICAgICAgaWYgWyBudW1iZXJzLmxlc3MgJChsaHNbMV0pICQocmhzWzFdKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvbmUgPSAidHJ1ZSIgOworICAgICAgICAgICAgcmVzdWx0ID0gInRydWUiIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIFsgbnVtYmVycy5sZXNzICQocmhzWzFdKSAkKGxoc1sxXSkgIF0KKyAgICAgICAgeworICAgICAgICAgICAgZG9uZSA9ICJ0cnVlIiA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsaHMgPSAkKGxoc1syLV0pIDsKKyAgICAgICAgICAgIHJocyA9ICQocmhzWzItXSkgOworICAgICAgICB9CisgICAgfQorICAgIGlmICggISAkKGRvbmUpICYmICEgJChsaHMpICYmICEgWyBpcy1hbGwtemVyb2VzICQocmhzKSBdICkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9ICJ0cnVlIiA7CisgICAgfQorICAgIAorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgUmV0dXJucyAidHJ1ZSIgaWYgdGhlIGN1cnJlbnQgSkFNIHZlcnNpb24gdmVyc2lvbiBpcyBhdCBsZWFzdCB0aGUgZ2l2ZW4KKyMgdmVyc2lvbi4KKyMKK3J1bGUgY2hlY2stamFtLXZlcnNpb24gKCB2ZXJzaW9uICsgKQoreworICAgIGxvY2FsIHZlcnNpb24tdGFnID0gJCh2ZXJzaW9uOko9LikgOworICAgIGlmICEgJCh2ZXJzaW9uLXRhZykKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgSW52YWxpZCB2ZXJzaW9uIHNwZWNpZmllcjogOiAkKHZlcnNpb246RT0iKHVuZGVmaW5lZCkiKSA7CisgICAgfQorCisgICAgaWYgISAkKC5qYW0tdmVyc2lvbi1jaGVjay4kKHZlcnNpb24tdGFnKSktaXMtZGVmaW5lZAorICAgIHsKKyAgICAgICAgbG9jYWwgamFtLXZlcnNpb24gPSBbIG1vZHVsZXMucGVlayA6IEpBTV9WRVJTSU9OIF0gOworICAgICAgICBpZiAhICQoamFtLXZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICAgICAgZXJyb3JzLmVycm9yICJVbmFibGUgdG8gZGVkdWNlIEJvb3N0IEphbSB2ZXJzaW9uLiBZb3VyIEJvb3N0IEphbSIKKyAgICAgICAgICAgICAgICAiaW5zdGFsbGF0aW9uIGlzIG1vc3QgbGlrZWx5IHRlcnJpYmx5IG91dGRhdGVkLiIgOworICAgICAgICB9CisgICAgICAgIC5qYW0tdmVyc2lvbi1jaGVjay4kKHZlcnNpb24tdGFnKSA9ICJ0cnVlIiA7CisgICAgICAgIGlmIFsgdmVyc2lvbi1sZXNzIFsgbW9kdWxlcy5wZWVrIDogSkFNX1ZFUlNJT04gXSA6ICQodmVyc2lvbikgXQorICAgICAgICB7CisgICAgICAgICAgICAuamFtLXZlcnNpb24tY2hlY2suJCh2ZXJzaW9uLXRhZykgPSAiIiA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQoLmphbS12ZXJzaW9uLWNoZWNrLiQodmVyc2lvbi10YWcpKSA7Cit9CisKKworcnVsZSBfX3Rlc3RfXyAoICkKK3sKKyAgICBpbXBvcnQgYXNzZXJ0IDsKKyAgICAKKyAgICBsb2NhbCBqYW0tdmVyc2lvbiA9IFsgbW9kdWxlcy5wZWVrIDogSkFNX1ZFUlNJT04gXSA7CisgICAgbG9jYWwgZnV0dXJlLXZlcnNpb24gPSAkKGphbS12ZXJzaW9uKSA7CisgICAgZnV0dXJlLXZlcnNpb24gKz0gIjEiIDsKKworICAgIGFzc2VydC50cnVlICBjaGVjay1qYW0tdmVyc2lvbiAkKGphbS12ZXJzaW9uKSAgICA7CisgICAgYXNzZXJ0LmZhbHNlIGNoZWNrLWphbS12ZXJzaW9uICQoZnV0dXJlLXZlcnNpb24pIDsKKworICAgIGFzc2VydC50cnVlICB2ZXJzaW9uLWxlc3MgIDAgICAgICAgICAgOiAgMSAgICAgICAgICA7CisgICAgYXNzZXJ0LmZhbHNlIHZlcnNpb24tbGVzcyAgMCAgICAgICAgICA6ICAwICAgICAgICAgIDsKKyAgICBhc3NlcnQudHJ1ZSAgdmVyc2lvbi1sZXNzICAxICAgICAgICAgIDogIDIgICAgICAgICAgOworICAgIGFzc2VydC5mYWxzZSB2ZXJzaW9uLWxlc3MgIDEgICAgICAgICAgOiAgMSAgICAgICAgICA7CisgICAgYXNzZXJ0LmZhbHNlIHZlcnNpb24tbGVzcyAgMiAgICAgICAgICA6ICAxICAgICAgICAgIDsKKyAgICBhc3NlcnQudHJ1ZSAgdmVyc2lvbi1sZXNzICAzIDEgMjAgICAgIDogIDMgNCAxMCAgICAgOworICAgIGFzc2VydC5mYWxzZSB2ZXJzaW9uLWxlc3MgIDMgMSAxMCAgICAgOiAgMyAxIDEwICAgICA7CisgICAgYXNzZXJ0LmZhbHNlIHZlcnNpb24tbGVzcyAgMyA0IDEwICAgICA6ICAzIDEgMjAgICAgIDsKKyAgICBhc3NlcnQudHJ1ZSAgdmVyc2lvbi1sZXNzICAzIDEgMjAgNSAxIDogIDMgNCAxMCAgICAgOworICAgIGFzc2VydC5mYWxzZSB2ZXJzaW9uLWxlc3MgIDMgMSAxMCA1IDEgOiAgMyAxIDEwICAgICA7CisgICAgYXNzZXJ0LmZhbHNlIHZlcnNpb24tbGVzcyAgMyA0IDEwIDUgMSA6ICAzIDEgMjAgICAgIDsKKyAgICBhc3NlcnQudHJ1ZSAgdmVyc2lvbi1sZXNzICAzIDEgMjAgICAgIDogIDMgNCAxMCA1IDEgOworICAgIGFzc2VydC50cnVlICB2ZXJzaW9uLWxlc3MgIDMgMSAxMCAgICAgOiAgMyAxIDEwIDUgMSA7CisgICAgYXNzZXJ0LmZhbHNlIHZlcnNpb24tbGVzcyAgMyA0IDEwICAgICA6ICAzIDEgMjAgNSAxIDsKKyAgICBhc3NlcnQuZmFsc2UgdmVyc2lvbi1sZXNzICAzIDEgMTAgICAgIDogIDMgMSAxMCAwIDAgOworICAgIGFzc2VydC5mYWxzZSB2ZXJzaW9uLWxlc3MgIDMgMSAxMCAwIDAgOiAgMyAxIDEwICAgICA7CisgICAgYXNzZXJ0LmZhbHNlIHZlcnNpb24tbGVzcyAgMyAxIDEwIDAgICA6ICAzIDEgMTAgMCAwIDsKKyAgICBhc3NlcnQuZmFsc2UgdmVyc2lvbi1sZXNzICAzIDEgMTAgMCAgIDogMDMgMSAxMCAwIDAgOworICAgIGFzc2VydC5mYWxzZSB2ZXJzaW9uLWxlc3MgMDMgMSAxMCAwICAgOiAgMyAxIDEwIDAgMCA7CisKKyAgICAjIFRPRE86IEFkZCB0ZXN0cyBmb3IgaW52YWxpZCBpbnB1dCBkYXRhIGJlaW5nIHNlbnQgdG8gdmVyc2lvbi1sZXNzLgorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC92aXJ0dWFsLXRhcmdldC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2J1aWxkL3ZpcnR1YWwtdGFyZ2V0LmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJlYWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9idWlsZC92aXJ0dWFsLXRhcmdldC5qYW0KQEAgLTAsMCArMSwxMzM5IEBACisjIENvcHlyaWdodCAyMDAzIERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDUsIDIwMDYgUmVuZSBSaXZlcmEKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIEltcGxlbWVudHMgdmlydHVhbCB0YXJnZXRzLCB3aGljaCBjb3JyZXNwb25kIHRvIGFjdHVhbCBmaWxlcyBjcmVhdGVkIGR1cmluZyBhCisjIGJ1aWxkLCBidXQgYXJlIG5vdCB5ZXQgdGFyZ2V0cyBpbiBKYW0gc2Vuc2UuIFRoZXkgYXJlIG5lZWRlZCwgZm9yIGV4YW1wbGUsCisjIHdoZW4gc2VhcmNoaW5nIGZvciBwb3NzaWJsZSB0cmFuc2Zvcm1hdGlvbiBzZXF1ZW5jZXMsIHdoZW4gaXQgaXMgbm90IHlldCBrbm93bgorIyB3aGV0aGVyIGEgcGFydGljdWxhciB0YXJnZXQgc2hvdWxkIGJlIGNyZWF0ZWQgYXQgYWxsLgorIworIyAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIyAgICAgICAgICAgICAgICAgICAgICAgfCB2aXJ0dWFsLXRhcmdldCAgICAgICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09PT09KworIyAgICAgICAgICAgICAgICAgICAgICAgfCBhY3R1YWxpemUgICAgICAgICAgICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIyAgICAgICAgICAgICAgICAgICAgICAgfCBhY3R1YWxpemUtYWN0aW9uKCkgPSAwICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgfCBhY3R1YWxpemUtbG9jYXRpb24oKSA9IDAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIFwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstKy0rCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyMgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICstLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworIyAgICB8IGFjdGlvbiAgICAgICAgICAgICAgfCAgICAgfCBhYnN0cmFjdC1maWxlLXRhcmdldCB8CisjICAgICs9PT09PT09PT09PT09PT09PT09PT18ICAgKiArPT09PT09PT09PT09PT09PT09PT09PSsKKyMgICAgfCBhY3Rpb24tbmFtZSAgICAgICAgIHwgICstLSsgYWN0aW9uICAgICAgICAgICAgICAgfAorIyAgICB8IHByb3BlcnRpZXMgICAgICAgICAgfCAgfCAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisjICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0rICB8IGFjdHVhbGl6ZS1hY3Rpb24oKSAgIHwKKyMgICAgfCBhY3R1YWxpemUoKSAgICAgICAgIHwwLi4xICstLS0tLS0tLS0tLSstLS0tLS0tLS0tKworIyAgICB8IHBhdGgoKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfAorIyAgICB8IGFkanVzdC1wcm9wZXJ0aWVzKCkgfCBzb3VyY2VzICAgICAgICAgfAorIyAgICB8IGFjdHVhbGl6ZS1zb3VyY2VzKCkgfCB0YXJnZXRzICAgICAgICAgfAorIyAgICArLS0tLS0tKy0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgXgorIyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIFwKKyMgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLSstKworIyAgICAgICAgICAvIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIyAgICAgICAgICstKy0rICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCisjICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyMgICAgICAgICAgIHwgICAgICAgICAgICstLS0tLS0rLS0tLS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCisjICAgICAgICAgICB8ICAgICAgICAgICB8IGZpbGUtdGFyZ2V0ICAgICAgICAgIHwgIHwgc2VhcmNoZWQtbGliLXRhcmdldCAgfAorIyAgICAgICAgICAgfCAgICAgICAgICAgKz09PT09PT09PT09PT09PT09PT09PT0rICArPT09PT09PT09PT09PT09PT09PT09PSsKKyMgICAgICAgICAgIHwgICAgICAgICAgIHwgYWN0dWFsaXplLWxvY2F0aW9uKCkgfCAgfCBhY3R1YWxpemUtbG9jYXRpb24oKSB8CisjICAgICAgICAgICB8ICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIyAgICAgICAgICAgfAorIyAgICAgICAgICstKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyMgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgICstLS0tKy0tLS0tLS0tLS0tLS0tLS0rICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworIyAgICB8IGNvbXBpbGUtYWN0aW9uICAgICAgfCAgICAgfCBsaW5rLWFjdGlvbiAgICAgICAgIHwKKyMgICAgKz09PT09PT09PT09PT09PT09PT09PSsgICAgICs9PT09PT09PT09PT09PT09PT09PT0rCisjICAgIHwgYWRqdXN0LXByb3BlcnRpZXMoKSB8ICAgICB8IGFkanVzdC1wcm9wZXJ0aWVzKCkgfAorIyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgfCBhY3R1YWxpemUtc291cmNlcygpIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisjCisjIFRoZSAnY29tcGlsZS1hY3Rpb24nIGFuZCAnbGluay1hY3Rpb24nIGNsYXNzZXMgYXJlIG5vdCBkZWZpbmVkIGhlcmUgYnV0IGluCisjIGJ1aWx0aW4uamFtIG1vZHVsZXMuIFRoZXkgYXJlIHNob3duIGluIHRoZSBkaWFncmFtIHRvIGdpdmUgdGhlIGJpZyBwaWN0dXJlLgorCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgcGF0aCA7CitpbXBvcnQgc2VxdWVuY2UgOworaW1wb3J0IHNldCA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgdXRpbGl0eSA7CisKKworIyBNb2RlbHMgYSBwb3RlbnRpYWwgdGFyZ2V0LiBJdCBjYW4gYmUgY29udmVydGVkIGludG8gYSBKYW0gdGFyZ2V0IGFuZCB1c2VkIGluCisjIGJ1aWxkaW5nLCBpZiBuZWVkZWQuIEhvd2V2ZXIsIGl0IGNhbiBiZSBhbHNvIGRyb3BwZWQsIHdoaWNoIGFsbG93cyB1cyB0bworIyBzZWFyY2ggZm9yIGRpZmZlcmVudCB0cmFuc2Zvcm1hdGlvbnMgYW5kIHNlbGVjdCBvbmx5IG9uZS4KKyMKK2NsYXNzIHZpcnR1YWwtdGFyZ2V0Cit7CisgICAgaW1wb3J0IHNjYW5uZXIgOworICAgIGltcG9ydCBzZXF1ZW5jZSA7CisgICAgaW1wb3J0IHV0aWxpdHkgOworICAgIGltcG9ydCB2aXJ0dWFsLXRhcmdldCA7CisKKyAgICBydWxlIF9faW5pdF9fICgKKyAgICAgICAgICBuYW1lICAgICAjIFRhcmdldC9wcm9qZWN0IG5hbWUuCisgICAgICAgIDogcHJvamVjdCAgIyBQcm9qZWN0IHRvIHdoaWNoIHRoaXMgdGFyZ2V0IGJlbG9uZ3MuCisgICAgKQorICAgIHsKKyAgICAgICAgc2VsZi5uYW1lID0gJChuYW1lKSA7CisgICAgICAgIHNlbGYucHJvamVjdCA9ICQocHJvamVjdCkgOworICAgICAgICBzZWxmLmRlcGVuZGVuY2llcyA9IDsKKyAgICB9CisKKyAgICAjIE5hbWUgb2YgdGhpcyB0YXJnZXQuCisgICAgIworICAgIHJ1bGUgbmFtZSAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYubmFtZSkgOworICAgIH0KKworICAgICMgUHJvamVjdCBvZiB0aGlzIHRhcmdldC4KKyAgICAjCisgICAgcnVsZSBwcm9qZWN0ICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi5wcm9qZWN0KSA7CisgICAgfQorCisgICAgIyBBZGRzIGFkZGl0aW9uYWwgJ3ZpcnR1YWwtdGFyZ2V0JyBpbnN0YW5jZXMgdGhpcyBvbmUgZGVwZW5kcyBvbi4KKyAgICAjCisgICAgcnVsZSBkZXBlbmRzICggZCArICkKKyAgICB7CisgICAgICAgIHNlbGYuZGVwZW5kZW5jaWVzID0gWyBzZXF1ZW5jZS5tZXJnZSAkKHNlbGYuZGVwZW5kZW5jaWVzKSA6CisgICAgICAgICAgICBbIHNlcXVlbmNlLmluc2VydGlvbi1zb3J0ICQoZCkgXSBdIDsKKyAgICB9CisKKyAgICBydWxlIGRlcGVuZGVuY2llcyAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYuZGVwZW5kZW5jaWVzKSA7CisgICAgfQorCisgICAgcnVsZSBhbHdheXMgKCApCisgICAgeworICAgICAgICAuYWx3YXlzID0gMSA7CisgICAgfQorCisgICAgIyBHZW5lcmF0ZXMgYWxsIHRoZSBhY3R1YWwgdGFyZ2V0cyBhbmQgc2V0cyB1cCBidWlsZCBhY3Rpb25zIGZvciB0aGlzCisgICAgIyB0YXJnZXQuCisgICAgIworICAgICMgSWYgJ3NjYW5uZXInIGlzIHNwZWNpZmllZCwgY3JlYXRlcyBhbiBhZGRpdGlvbmFsIHRhcmdldCB3aXRoIHRoZSBzYW1lCisgICAgIyBsb2NhdGlvbiBhcyB0aGUgYWN0dWFsIHRhcmdldCwgd2hpY2ggd2lsbCBkZXBlbmQgb24gdGhlIGFjdHVhbCB0YXJnZXQgYW5kCisgICAgIyBiZSBhc3NvY2lhdGVkIHdpdGggYSAnc2Nhbm5lcicuIFRoYXQgYWRkaXRpb25hbCB0YXJnZXQgaXMgcmV0dXJuZWQuIFNlZQorICAgICMgdGhlIGRvY3MgKCNkZXBlbmRlbmN5X3NjYW5uaW5nKSBmb3IgcmF0aW9uYWxlLiBUYXJnZXQgbXVzdCBjb3JyZXNwb25kIHRvIGEKKyAgICAjIGZpbGUgaWYgJ3NjYW5uZXInIGlzIHNwZWNpZmllZC4KKyAgICAjCisgICAgIyBJZiBzY2FubmVyIGlzIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUgYWN0dWFsIHRhcmdldCBpcyByZXR1cm5lZC4KKyAgICAjCisgICAgcnVsZSBhY3R1YWxpemUgKCBzY2FubmVyID8gKQorICAgIHsKKyAgICAgICAgbG9jYWwgYWN0dWFsLW5hbWUgPSBbIGFjdHVhbGl6ZS1uby1zY2FubmVyIF0gOworCisgICAgICAgIGlmICQoLmFsd2F5cykKKyAgICAgICAgeworICAgICAgICAgICAgQUxXQVlTICQoYWN0dWFsLW5hbWUpIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICEgJChzY2FubmVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gJChhY3R1YWwtbmFtZSkgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgIyBBZGQgdGhlIHNjYW5uZXIgaW5zdGFuY2UgdG8gdGhlIGdyaXN0IGZvciBuYW1lLgorICAgICAgICAgICAgbG9jYWwgZyA9IFsgc2VxdWVuY2Uuam9pbiBbIHV0aWxpdHkudW5ncmlzdCAkKGFjdHVhbC1uYW1lOkcpIF0KKyAgICAgICAgICAgICAgICAkKHNjYW5uZXIpIDogLSBdIDsKKyAgICAgICAgICAgIGxvY2FsIG5hbWUgPSAkKGFjdHVhbC1uYW1lOkc9JChnKSkgOworCisgICAgICAgICAgICBpZiAhICQoc2VsZi5tYWRlLiQoc2Nhbm5lcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZi5tYWRlLiQoc2Nhbm5lcikgPSB0cnVlIDsKKyAgICAgICAgICAgICAgICBhY3R1YWxpemUtbG9jYXRpb24gJChuYW1lKSA7CisgICAgICAgICAgICAgICAgc2Nhbm5lci5pbnN0YWxsICQoc2Nhbm5lcikgOiAkKG5hbWUpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAkKG5hbWUpIDsKKyAgICAgICAgfQorICAgIH0KKworIyBwcml2YXRlOiAob3ZlcnJpZGFibGVzKQorCisgICAgIyBTZXRzIHVwIGJ1aWxkIGFjdGlvbnMgZm9yICd0YXJnZXQnLiBTaG91bGQgY2FsbCBhcHByb3ByaWF0ZSBydWxlcyBhbmQgc2V0CisgICAgIyB0YXJnZXQgdmFyaWFibGVzLgorICAgICMKKyAgICBydWxlIGFjdHVhbGl6ZS1hY3Rpb24gKCB0YXJnZXQgKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA6IGVycm9yIDogZXJyb3JzLmVycm9yIDsKKyAgICAgICAgZXJyb3JzLmVycm9yICJtZXRob2Qgc2hvdWxkIGJlIGRlZmluZWQgaW4gZGVyaXZlZCBjbGFzc2VzIiA7CisgICAgfQorCisgICAgIyBTZXRzIHVwIHZhcmlhYmxlcyBvbiAndGFyZ2V0JyB3aGljaCBzcGVjaWZ5IGl0cyBsb2NhdGlvbi4KKyAgICAjCisgICAgcnVsZSBhY3R1YWxpemUtbG9jYXRpb24gKCB0YXJnZXQgKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA6IGVycm9yIDogZXJyb3JzLmVycm9yIDsKKyAgICAgICAgZXJyb3JzLmVycm9yICJtZXRob2Qgc2hvdWxkIGJlIGRlZmluZWQgaW4gZGVyaXZlZCBjbGFzc2VzIiA7CisgICAgfQorCisgICAgIyBJZiB0aGUgdGFyZ2V0IGlzIGEgZ2VuZXJhdGVkIG9uZSwgcmV0dXJucyB0aGUgcGF0aCB3aGVyZSBpdCB3aWxsIGJlCisgICAgIyBnZW5lcmF0ZWQuIE90aGVyd2lzZSwgcmV0dXJucyBhbiBlbXB0eSBsaXN0LgorICAgICMKKyAgICBydWxlIHBhdGggKCApCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDogZXJyb3IgOiBlcnJvcnMuZXJyb3IgOworICAgICAgICBlcnJvcnMuZXJyb3IgIm1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBkZXJpdmVkIGNsYXNzZXMiIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdGhlIGFjdHVhbCB0YXJnZXQgbmFtZSB0byBiZSB1c2VkIGluIGNhc2Ugd2hlbiBubyBzY2FubmVyIGlzCisgICAgIyBpbnZvbHZlZC4KKyAgICAjCisgICAgcnVsZSBhY3R1YWwtbmFtZSAoICkKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOiBlcnJvciA6IGVycm9ycy5lcnJvciA7CisgICAgICAgIGVycm9ycy5lcnJvciAibWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIGluIGRlcml2ZWQgY2xhc3NlcyIgOworICAgIH0KKworIyBpbXBsZW1lbnRhdGlvbgorICAgIHJ1bGUgYWN0dWFsaXplLW5vLXNjYW5uZXIgKCApCisgICAgeworICAgICAgICAjIEluIGZhY3QsIHdlIGp1c3QgbmVlZCB0byBtZXJnZSB2aXJ0dWFsLXRhcmdldCB3aXRoCisgICAgICAgICMgYWJzdHJhY3QtZmlsZS10YXJnZXQgYXMgdGhlIGxhdHRlciBpcyB0aGUgb25seSBjbGFzcyBkZXJpdmVkIGZyb20gdGhlCisgICAgICAgICMgZm9ybWVyLiBCdXQgdGhhdCBoYXMgYmVlbiBsZWZ0IGZvciBsYXRlci4KKworICAgICAgICBpbXBvcnQgZXJyb3JzIDogZXJyb3IgOiBlcnJvcnMuZXJyb3IgOworICAgICAgICBlcnJvcnMuZXJyb3IgIm1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBkZXJpdmVkIGNsYXNzZXMiIDsKKyAgICB9Cit9CisKKworIyBUYXJnZXQgY29ycmVzcG9uZGluZyB0byBhIGZpbGUuIFRoZSBleGFjdCBtYXBwaW5nIGZvciBmaWxlIGlzIG5vdCB5ZXQKKyMgc3BlY2lmaWVkIGluIHRoaXMgY2xhc3MuIChUT0RPOiBBY3R1YWxseSwgdGhlIGNsYXNzIG5hbWUgY291bGQgYmUgYmV0dGVyLi4uKQorIworIyBNYXkgYmUgYSBzb3VyY2UgZmlsZSAod2hlbiBubyBhY3Rpb24gaXMgc3BlY2lmaWVkKSBvciBhIGRlcml2ZWQgZmlsZQorIyAob3RoZXJ3aXNlKS4KKyMKKyMgVGhlIHRhcmdldCdzIGdyaXN0IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiBpdHMgcHJvamVjdCdzIGxvY2F0aW9uLCBhY3Rpb24KKyMgcHJvcGVydGllcyAoZm9yIGRlcml2ZWQgdGFyZ2V0cykgYW5kLCBvcHRpb25hbGx5LCB2YWx1ZSBpZGVudGlmeWluZyB0aGUgbWFpbgorIyB0YXJnZXQuCisjCitjbGFzcyBhYnN0cmFjdC1maWxlLXRhcmdldCA6IHZpcnR1YWwtdGFyZ2V0Cit7CisgICAgaW1wb3J0IHByb2plY3QgOworICAgIGltcG9ydCByZWdleCA7CisgICAgaW1wb3J0IHNlcXVlbmNlIDsKKyAgICBpbXBvcnQgcGF0aCA7CisgICAgaW1wb3J0IHR5cGUgOworICAgIGltcG9ydCBwcm9wZXJ0eS1zZXQgOworICAgIGltcG9ydCBpbmRpcmVjdCA7CisKKyAgICBydWxlIF9faW5pdF9fICgKKyAgICAgICAgIG5hbWUgICAgICMgVGFyZ2V0J3MgbmFtZS4KKyAgICAgICAgIGV4YWN0ID8gICMgSWYgbm9uLWVtcHR5LCB0aGUgbmFtZSBpcyBleGFjdGx5IHRoZSBuYW1lIGNyZWF0ZWQgZmlsZQorICAgICAgICAgICAgICAgICAgIyBzaG91bGQgaGF2ZS4gT3RoZXJ3aXNlLCB0aGUgJ19faW5pdF9fJyBtZXRob2Qgd2lsbCBhZGQgYQorICAgICAgICAgICAgICAgICAgIyBzdWZmaXggb2J0YWluZWQgZnJvbSAndHlwZScgYnkgY2FsbGluZworICAgICAgICAgICAgICAgICAgIyAndHlwZS5nZW5lcmF0ZWQtdGFyZ2V0LXN1ZmZpeCcuCisgICAgICAgIDogdHlwZSA/ICAjIFRhcmdldCdzIHR5cGUuCisgICAgICAgIDogcHJvamVjdAorICAgICAgICA6IGFjdGlvbiA/CisgICAgKQorICAgIHsKKyAgICAgICAgdmlydHVhbC10YXJnZXQuX19pbml0X18gJChuYW1lKSA6ICQocHJvamVjdCkgOworCisgICAgICAgIHNlbGYudHlwZSA9ICQodHlwZSkgOworICAgICAgICBzZWxmLmFjdGlvbiA9ICQoYWN0aW9uKSA7CisgICAgICAgIGlmICQoYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAkKGFjdGlvbikuYWRkLXRhcmdldHMgJChfX25hbWVfXykgOworCisgICAgICAgICAgICBpZiAkKHNlbGYudHlwZSkgJiYgISAkKGV4YWN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9hZGp1c3QtbmFtZSAkKG5hbWUpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJ1bGUgdHlwZSAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYudHlwZSkgOworICAgIH0KKworICAgICMgU2V0cyB0aGUgcGF0aC4gV2hlbiBnZW5lcmF0aW5nIHRhcmdldCBuYW1lLCBpdCB3aWxsIG92ZXJyaWRlIGFueSBwYXRoCisgICAgIyBjb21wdXRhdGlvbiBmcm9tIHByb3BlcnRpZXMuCisgICAgIworICAgIHJ1bGUgc2V0LXBhdGggKCBwYXRoICkKKyAgICB7CisgICAgICAgIHNlbGYucGF0aCA9IFsgcGF0aC5uYXRpdmUgJChwYXRoKSBdIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZXQgYWN0aW9uLgorICAgICMKKyAgICBydWxlIGFjdGlvbiAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYuYWN0aW9uKSA7CisgICAgfQorCisgICAgIyBTZXRzL2dldHMgdGhlICdyb290JyBmbGFnLiBUYXJnZXQgaXMgcm9vdCBpZiBpdCBkaXJlY3RseSBjb3JyZXNwb25kcyB0bworICAgICMgc29tZSB2YXJpYW50IG9mIGEgbWFpbiB0YXJnZXQuCisgICAgIworICAgIHJ1bGUgcm9vdCAoIHNldCA/ICkKKyAgICB7CisgICAgICAgIGlmICQoc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLnJvb3QgPSB0cnVlIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChzZWxmLnJvb3QpIDsKKyAgICB9CisKKyAgICAjIEdldHMgb3Igc2V0cyB0aGUgc3VidmFyaWFudCB3aGljaCBjcmVhdGVkIHRoaXMgdGFyZ2V0LiBTdWJ2YXJpYW50IGlzIHNldAorICAgICMgd2hlbiB0YXJnZXQgaXMgYnJvdWdodCBpbnRvIGV4aXN0YW5jZSBhbmQgaXMgbmV2ZXIgY2hhbmdlZCBhZnRlciB0aGF0LiBJbgorICAgICMgcGFydGljdWxhciwgaWYgYSB0YXJnZXQgaXMgc2hhcmVkIGJ5IG11bHRpcGxlIHN1YnZhcmlhbnRzLCBvbmx5IHRoZSBmaXJzdAorICAgICMgb25lIGlzIHN0b3JlZC4KKyAgICAjCisgICAgcnVsZSBjcmVhdGluZy1zdWJ2YXJpYW50ICggcyA/ICAjIElmIHNwZWNpZmllZCwgc3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdoaWNoIHNob3VsZCBiZSBhICdzdWJ2YXJpYW50JyBjbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgIHsKKyAgICAgICAgaWYgJChzKSAmJiAhICQoc2VsZi5jcmVhdGluZy1zdWJ2YXJpYW50KQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLmNyZWF0aW5nLXN1YnZhcmlhbnQgPSAkKHMpIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChzZWxmLmNyZWF0aW5nLXN1YnZhcmlhbnQpIDsKKyAgICB9CisKKyAgICBydWxlIGFjdHVhbGl6ZS1hY3Rpb24gKCB0YXJnZXQgKQorICAgIHsKKyAgICAgICAgaWYgJChzZWxmLmFjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgJChzZWxmLmFjdGlvbikuYWN0dWFsaXplIDsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgUmV0dXJuIGEgaHVtYW4tcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0YXJnZXQuIElmIHRoaXMgdGFyZ2V0IGhhcworICAgICMgYW4gYWN0aW9uLCB0aGF0IGlzOgorICAgICMKKyAgICAjICAgIHsgPGFjdGlvbi1uYW1lPi08c2VsZi5uYW1lPi48c2VsZi50eXBlPiA8YWN0aW9uLXNvdXJjZXM+Li4uIH0KKyAgICAjCisgICAgIyBvdGhlcndpc2UsIGl0IGlzOgorICAgICMKKyAgICAjICAgIHsgPHNlbGYubmFtZT4uPHNlbGYudHlwZT4gfQorICAgICMKKyAgICBydWxlIHN0ciAoICkKKyAgICB7CisgICAgICAgIGxvY2FsIGFjdGlvbiA9IFsgYWN0aW9uIF0gOworICAgICAgICBsb2NhbCBuYW1lLWRvdC10eXBlID0gWyBzZXF1ZW5jZS5qb2luICQoc2VsZi5uYW1lKSAiLiIgJChzZWxmLnR5cGUpIF0gOworCisgICAgICAgIGlmICQoYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBzb3VyY2VzICAgICA9IFsgJChhY3Rpb24pLnNvdXJjZXMgICAgIF0gOworICAgICAgICAgICAgbG9jYWwgYWN0aW9uLW5hbWUgPSBbICQoYWN0aW9uKS5hY3Rpb24tbmFtZSBdIDsKKworICAgICAgICAgICAgbG9jYWwgc3MgOworICAgICAgICAgICAgZm9yIGxvY2FsIHMgaW4gJChzb3VyY2VzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzICs9IFsgJChzKS5zdHIgXSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAieyIgJChhY3Rpb24tbmFtZSktJChuYW1lLWRvdC10eXBlKSAkKHNzKSAifSIgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJ7IiAkKG5hbWUtZG90LXR5cGUpICJ9IiA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBydWxlIGxlc3MgKCBhICkKKyAgICB7CisgICAgICAgIGlmIFsgc3RyIF0gPCBbICQoYSkuc3RyIF0KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWUgOworICAgICAgICB9CisgICAgfQorCisgICAgcnVsZSBlcXVhbCAoIGEgKQorICAgIHsKKyAgICAgICAgaWYgWyBzdHIgXSA9IFsgJChhKS5zdHIgXQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgICAgIH0KKyAgICB9CisKKyMgcHJpdmF0ZToKKyAgICBydWxlIGFjdHVhbC1uYW1lICggKQorICAgIHsKKyAgICAgICAgaWYgISAkKHNlbGYuYWN0dWFsLW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGdyaXN0ID0gWyBncmlzdCBdIDsKKyAgICAgICAgICAgIGxvY2FsIGJhc2VuYW1lID0gWyBwYXRoLm5hdGl2ZSAkKHNlbGYubmFtZSkgXSA7CisgICAgICAgICAgICBzZWxmLmFjdHVhbC1uYW1lID0gPCQoZ3Jpc3QpPiQoYmFzZW5hbWUpIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChzZWxmLmFjdHVhbC1uYW1lKSA7CisgICAgfQorCisgICAgIyBIZWxwZXIgdG8gJ2FjdHVhbC1uYW1lJywgYWJvdmUuIENvbXB1dGVzIGEgdW5pcXVlIHByZWZpeCB1c2VkIHRvCisgICAgIyBkaXN0aW5ndWlzaCB0aGlzIHRhcmdldCBmcm9tIG90aGVyIHRhcmdldHMgd2l0aCB0aGUgc2FtZSBuYW1lIGNyZWF0aW5nCisgICAgIyBkaWZmZXJlbnQgZmlsZXMuCisgICAgIworICAgIHJ1bGUgZ3Jpc3QgKCApCisgICAgeworICAgICAgICAjIERlcGVuZGluZyBvbiB0YXJnZXQsIHRoZXJlIG1heSBiZSBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byBnZW5lcmF0aW5nCisgICAgICAgICMgdW5pcXVlIHByZWZpeGVzLiBXZSBnZW5lcmF0ZSBwcmVmaXhlcyBpbiB0aGUgZm9ybToKKyAgICAgICAgIyA8b25lIGxldHRlciBhcHByb2FjaCBjb2RlPiA8dGhlIGFjdHVhbCBwcmVmaXg+CisgICAgICAgIGxvY2FsIHBhdGggPSBbIHBhdGggXSA7CisgICAgICAgIGlmICQocGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgIyBUaGUgdGFyZ2V0IHdpbGwgYmUgZ2VuZXJhdGVkIHRvIGEga25vd24gcGF0aC4gSnVzdCB1c2UgdGhlIHBhdGgKKyAgICAgICAgICAgICMgZm9yIGlkZW50aWZpY2F0aW9uLCBzaW5jZSBwYXRoIGlzIGFzIHVuaXF1ZSBhcyBpdCBjYW4gZ2V0LgorICAgICAgICAgICAgcmV0dXJuIHAkKHBhdGgpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICMgRmlsZSBpcyBlaXRoZXIgc291cmNlLCB3aGljaCB3aWxsIGJlIHNlYXJjaGVkIGZvciwgb3IgaXMgbm90IGEKKyAgICAgICAgICAgICMgZmlsZSBhdCBhbGwuIFVzZSB0aGUgbG9jYXRpb24gb2YgcHJvamVjdCBmb3IgZGlzdGluZ3Vpc2hpbmcuCisgICAgICAgICAgICBsb2NhbCBwcm9qZWN0LWxvY2F0aW9uID0gWyAkKHNlbGYucHJvamVjdCkuZ2V0IGxvY2F0aW9uIF0gOworICAgICAgICAgICAgbG9jYWwgbG9jYXRpb24tZ3Jpc3QgPSBbIHNlcXVlbmNlLmpvaW4gWyByZWdleC5zcGxpdAorICAgICAgICAgICAgICAgICQocHJvamVjdC1sb2NhdGlvbikgIi8iIF0gOiAiISIgXSA7CisKKyAgICAgICAgICAgIGlmICQoc2VsZi5hY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWwgcHMgPSBbICQoc2VsZi5hY3Rpb24pLnByb3BlcnRpZXMgXSA7CisgICAgICAgICAgICAgICAgbG9jYWwgcHJvcGVydHktZ3Jpc3QgPSBbICQocHMpLmFzLXBhdGggXSA7CisgICAgICAgICAgICAgICAgIyAncHJvcGVydHktZ3Jpc3QnIGNhbiBiZSBlbXB0eSB3aGVuICdwcycgaXMgYW4gZW1wdHkgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAjIHNldC4KKyAgICAgICAgICAgICAgICBpZiAkKHByb3BlcnR5LWdyaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24tZ3Jpc3QgPSAkKGxvY2F0aW9uLWdyaXN0KS8kKHByb3BlcnR5LWdyaXN0KSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbCQobG9jYXRpb24tZ3Jpc3QpIDsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgR2l2ZW4gdGhlIHRhcmdldCBuYW1lIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3RvciwgcmV0dXJucyB0aGUgbmFtZSB3aGljaAorICAgICMgc2hvdWxkIGJlIHJlYWxseSB1c2VkLCBieSBsb29raW5nIGF0IHRoZSA8dGFnPiBwcm9wZXJ0aWVzLiBUYWcgcHJvcGVydGllcworICAgICMgbmVlZCB0byBiZSBzcGVjaWZpZWQgYXMgPHRhZz5AcnVsZS1uYW1lLiBUaGlzIG1ha2VzIEJvb3N0IEJ1aWxkIGNhbGwgdGhlCisgICAgIyBzcGVjaWZpZWQgcnVsZSB3aXRoIHRoZSB0YXJnZXQgbmFtZSwgdHlwZSBhbmQgcHJvcGVydGllcyB0byBnZXQgdGhlIG5ldworICAgICMgbmFtZS4gSWYgbm8gPHRhZz4gcHJvcGVydHkgaXMgc3BlY2lmaWVkIG9yIHRoZSBydWxlIHNwZWNpZmllZCBieSA8dGFnPgorICAgICMgcmV0dXJucyBub3RoaW5nLCByZXR1cm5zIHRoZSByZXN1bHQgb2YgY2FsbGluZworICAgICMgdmlydHVhbC10YXJnZXQuYWRkLXByZWZpeC1hbmQtc3VmZml4LgorICAgICMKKyAgICBydWxlIF9hZGp1c3QtbmFtZSAoIHNwZWNpZmllZC1uYW1lICkKKyAgICB7CisgICAgICAgIGxvY2FsIHBzIDsKKyAgICAgICAgaWYgJChzZWxmLmFjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcHMgPSBbICQoc2VsZi5hY3Rpb24pLnByb3BlcnRpZXMgXSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcyA9IFsgcHJvcGVydHktc2V0LmVtcHR5IF0gOworICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgdGFnID0gWyAkKHBzKS5nZXQgPHRhZz4gXSA7CisKKyAgICAgICAgaWYgJCh0YWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHJ1bGUtbmFtZSA9IFsgTUFUQ0ggXkAoLiopIDogJCh0YWcpIF0gOworICAgICAgICAgICAgaWYgJChydWxlLW5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgJCh0YWdbMl0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDogZXJyb3IgOiBlcnJvcnMuZXJyb3IgOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuZXJyb3IgPHRhZz5AcnVsZW5hbWUgaXMgcHJlc2VudCBidXQgaXMgbm90IHRoZSBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICA8dGFnPiBmZWF0dXJlLiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2VsZi5uYW1lID0gWyBpbmRpcmVjdC5jYWxsICQocnVsZS1uYW1lKSAkKHNwZWNpZmllZC1uYW1lKQorICAgICAgICAgICAgICAgICAgICA6ICQoc2VsZi50eXBlKSA6ICQocHMpIF0gOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOiBlcnJvciA6IGVycm9ycy5lcnJvciA7CisgICAgICAgICAgICAgICAgZXJyb3JzLmVycm9yIDx0YWc+IHByb3BlcnR5IHZhbHVlIG11c3QgYmUgJ0BydWxlLW5hbWUnLiA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjIElmIHRoZXJlIGlzIG5vIHRhZyBvciB0aGUgdGFnIHJ1bGUgcmV0dXJuZWQgbm90aGluZy4KKyAgICAgICAgaWYgISAkKHRhZykgfHwgISAkKHNlbGYubmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZi5uYW1lID0gWyB2aXJ0dWFsLXRhcmdldC5hZGQtcHJlZml4LWFuZC1zdWZmaXggJChzcGVjaWZpZWQtbmFtZSkKKyAgICAgICAgICAgICAgICA6ICQoc2VsZi50eXBlKSA6ICQocHMpIF0gOworICAgICAgICB9CisgICAgfQorCisgICAgcnVsZSBhY3R1YWxpemUtbm8tc2Nhbm5lciAoICkKKyAgICB7CisgICAgICAgIGxvY2FsIG5hbWUgPSBbIGFjdHVhbC1uYW1lIF0gOworCisgICAgICAgICMgRG8gYW55dGhpbmcgb25seSBvbiB0aGUgZmlyc3QgaW52b2NhdGlvbi4KKyAgICAgICAgaWYgISAkKHNlbGYubWFkZS1uby1zY2FubmVyKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLm1hZGUtbm8tc2Nhbm5lciA9IHRydWUgOworCisgICAgICAgICAgICBpZiAkKHNlbGYuYWN0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgRm9yIG5vbi1kZXJpdmVkIHRhcmdldCwgd2UgZG8gbm90IGNhcmUgaWYgdGhlcmUgYXJlIHNldmVyYWwKKyAgICAgICAgICAgICAgICAjIHZpcnR1YWwgdGFyZ2V0cyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIG5hbWUuIE9uZSBjYXNlIHdoZW4KKyAgICAgICAgICAgICAgICAjIHRoaXMgaXMgdW5hdm9pZGFibGUgaXMgd2hlbiB0aGUgZmlsZSBuYW1lIGlzIG1haW4uY3BwIGFuZCB0d28KKyAgICAgICAgICAgICAgICAjIHRhcmdldHMgaGF2ZSB0eXBlcyBDUFAgKGZvciBjb21waWxpbmcpIGFuZCBNT0NDQUJMRV9DUFAgKGZvcgorICAgICAgICAgICAgICAgICMgY29udmVyc2lvbiB0byBIIHZpYSBRdCB0b29scykuCisgICAgICAgICAgICAgICAgdmlydHVhbC10YXJnZXQucmVnaXN0ZXItYWN0dWFsLW5hbWUgJChuYW1lKSA6ICQoX19uYW1lX18pIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIGxvY2FsIGkgaW4gJChzZWxmLmRlcGVuZGVuY2llcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERVBFTkRTICQobmFtZSkgOiBbICQoaSkuYWN0dWFsaXplIF0gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhY3R1YWxpemUtbG9jYXRpb24gJChuYW1lKSA7CisgICAgICAgICAgICBhY3R1YWxpemUtYWN0aW9uICQobmFtZSkgOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKG5hbWUpIDsKKyAgICB9Cit9CisKKworIyBBcHBlbmRzIHRoZSBzdWZmaXggYXBwcm9wcmlhdGUgdG8gJ3R5cGUvcHJvcGVydHktc2V0JyBjb21iaW5hdGlvbiB0byB0aGUKKyMgc3BlY2lmaWVkIG5hbWUgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyMKK3J1bGUgYWRkLXByZWZpeC1hbmQtc3VmZml4ICggc3BlY2lmaWVkLW5hbWUgOiB0eXBlID8gOiBwcm9wZXJ0eS1zZXQgKQoreworICAgIGxvY2FsIHN1ZmZpeCA9IFsgdHlwZS5nZW5lcmF0ZWQtdGFyZ2V0LXN1ZmZpeCAkKHR5cGUpIDogJChwcm9wZXJ0eS1zZXQpIF0gOworCisgICAgIyBIYW5kbGUgc3VmZml4ZXMgZm9yIHdoaWNoIG5vIGxlYWRpbmcgZG90IGlzIGRlc2lyZWQuIFRob3NlIGFyZSBzcGVjaWZpZWQKKyAgICAjIGJ5IGVuY2xvc2luZyB0aGVtIGluIDwuLi4+LiAgTmVlZGVkIGJ5IHB5dGhvbiBzbyBpdCBjYW4gY3JlYXRlICJfZC5zbyIKKyAgICAjIGV4dGVuc2lvbnMsIGZvciBleGFtcGxlLgorICAgIGlmICQoc3VmZml4OkcpCisgICAgeworICAgICAgICBzdWZmaXggPSBbIHV0aWxpdHkudW5ncmlzdCAkKHN1ZmZpeCkgXSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN1ZmZpeCA9IC4kKHN1ZmZpeCkgOworICAgIH0KKworICAgIGxvY2FsIHByZWZpeCA9IFsgdHlwZS5nZW5lcmF0ZWQtdGFyZ2V0LXByZWZpeCAkKHR5cGUpIDogJChwcm9wZXJ0eS1zZXQpIF0gOworCisgICAgaWYgIFsgTUFUQ0ggXigkKHByZWZpeCkpIDogJChzcGVjaWZpZWQtbmFtZSkgXQorICAgIHsKKyAgICAgICAgcHJlZml4ID0gOworICAgIH0KKyAgICByZXR1cm4gJChwcmVmaXg6RT0iIikkKHNwZWNpZmllZC1uYW1lKSQoc3VmZml4OkU9IiIpIDsKK30KKworCisjIEZpbGUgdGFyZ2V0cyB3aXRoIGV4cGxpY2l0bHkga25vd24gbG9jYXRpb24uCisjCisjIFRoZSBmaWxlIHBhdGggaXMgZGV0ZXJtaW5lZCBhcworIyAgICAqIFZhbHVlIHBhc3NlZCB0byB0aGUgJ3NldC1wYXRoJyBtZXRob2QsIGlmIGFueS4KKyMgICAgKiBGb3IgZGVyaXZlZCBmaWxlcywgcHJvamVjdCdzIGJ1aWxkIGRpciwgam9pbmVkIHdpdGggY29tcG9uZW50cyB0aGF0CisjICAgICAgZGVzY3JpYmUgYWN0aW9uIHByb3BlcnRpZXMuIElmIGZyZWUgcHJvcGVydGllcyBhcmUgbm90IGVxdWFsIHRvIHRoZQorIyAgICAgIHByb2plY3QncyByZWZlcmVuY2UgcHJvcGVydGllcyBhbiBlbGVtZW50IHdpdGggdGhlIG5hbWUgb2YgdGhlIG1haW4KKyMgICAgICB0YXJnZXQgaXMgYWRkZWQuCisjICAgICogRm9yIHNvdXJjZSBmaWxlcywgcHJvamVjdCdzIHNvdXJjZSBkaXIuCisjCisjIFRoZSBmaWxlIHN1ZmZpeCBpcyBkZXRlcm1pbmVkIGFzOgorIyAgICAgKiBUaGUgdmFsdWUgcGFzc2VkIHRvIHRoZSAnc3VmZml4JyBtZXRob2QsIGlmIGFueS4KKyMgICAgICogVGhlIHN1ZmZpeCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YXJnZXQncyB0eXBlLgorIworY2xhc3MgZmlsZS10YXJnZXQgOiBhYnN0cmFjdC1maWxlLXRhcmdldAoreworICAgIGltcG9ydCAiY2xhc3MiIDogbmV3IDsKKyAgICBpbXBvcnQgY29tbW9uIDsKKworICAgIHJ1bGUgX19pbml0X18gKAorICAgICAgICBuYW1lIGV4YWN0ID8KKyAgICAgICAgOiB0eXBlID8gICMgT3B0aW9uYWwgdHlwZSBmb3IgdGhpcyB0YXJnZXQuCisgICAgICAgIDogcHJvamVjdAorICAgICAgICA6IGFjdGlvbiA/CisgICAgICAgIDogcGF0aCA/CisgICAgKQorICAgIHsKKyAgICAgICAgYWJzdHJhY3QtZmlsZS10YXJnZXQuX19pbml0X18gJChuYW1lKSAkKGV4YWN0KSA6ICQodHlwZSkgOiAkKHByb2plY3QpIDoKKyAgICAgICAgICAgICQoYWN0aW9uKSA7CisKKyAgICAgICAgc2VsZi5wYXRoID0gJChwYXRoKSA7CisgICAgfQorCisgICAgcnVsZSBjbG9uZS13aXRoLWRpZmZlcmVudC10eXBlICggbmV3LXR5cGUgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFsgbmV3IGZpbGUtdGFyZ2V0ICQoc2VsZi5uYW1lKSBleGFjdCA6ICQobmV3LXR5cGUpIDoKKyAgICAgICAgICAgICQoc2VsZi5wcm9qZWN0KSA6ICQoc2VsZi5hY3Rpb24pIDogJChzZWxmLnBhdGgpIF0gOworICAgIH0KKworICAgIHJ1bGUgYWN0dWFsaXplLWxvY2F0aW9uICggdGFyZ2V0ICkKKyAgICB7CisgICAgICAgICMgU2Nhbm5lciB0YXJnZXRzIGFyZSBhbHdheXMgYm91bmQgdG8gYWxyZWFkeSBleGlzdGluZyBmaWxlcyBpbiBhbHJlYWR5CisgICAgICAgICMgZXhpc3RpbmcgZm9sZGVyLiBUaGV5IG5lZWQgdG8gYmUgbWFya2VkIGFzIGRlcGVuZGluZyBvbiB0aGVpciBiYXNlCisgICAgICAgICMgdGFyZ2V0IChpLmUuIHRoZSB0YXJnZXQgYmVpbmcgc2Nhbm5lZCkgYnV0LCB1bmxpa2UgcmVndWxhcgorICAgICAgICAjIGRlcGVuZGVuY2llcyBzZXQgdXAgYnkgdGhlIERFUEVORFMgcnVsZSwgdGhleSBtdXN0IG5vdCBkZXBlbmQgb24gYW55CisgICAgICAgICMgdGFyZ2V0cyBhbHJlYWR5IG1hcmtlZCBhcyBpbmNsdWRlZCBieSB0aGUgYmFzZSB0YXJnZXQuIE90aGVyd2lzZSBzdWNoCisgICAgICAgICMgYW4gaW5jbHVkZWQgZmlsZSBiZWluZyBuZXdlciB0aGFuIHRoZSBmaWxlIGJlaW5nIHNjYW5uZWQgd291bGQgY2F1c2UKKyAgICAgICAgIyB0aGUgc2Nhbm5lciB0YXJnZXQgdG8gYmUgdXBkYXRlZCwgZnVydGhlciBjYXVzaW5nIGFueSB0YXJnZXQgZGVwZW5kaW5nCisgICAgICAgICMgb24gdGhhdCBzY2FubmVyIHRhcmdldCB0byBiZSByZWJ1aWx0LiBUaGlzIGlzIHRoZSBleGFjdCByZWxhdGlvbnNoaXAKKyAgICAgICAgIyBhcyBzZXQgdXAgYnkgQm9vc3QgSmFtJ3MgU0VBUkNIIGJpbmRpbmcgbWV0aG9kIChuZWVkZWQgdG8gc3VwcG9ydAorICAgICAgICAjIHNlYXJjaGluZyBmb3IgZ2VuZXJhdGVkIHRhcmdldHMpIHNvIHdlIHdhbnQgdG8gYmluZCBzY2FubmVyIHRhcmdldHMKKyAgICAgICAgIyB1c2luZyB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIGV4cGxpY2l0bHkgc3BlY2lmeWluZyB0aGVpciBsb2NhdGlvbgorICAgICAgICAjIHVzaW5nIExPQ0FURS4KKyAgICAgICAgIworICAgICAgICAjIEZJWE1FOiBXZSByZWNvZ25pemUgc2Nhbm5lciB0YXJnZXRzIGJ5IHRoZWlyIGdpdmVuIG5hbWUgYmVpbmcKKyAgICAgICAgIyBkaWZmZXJlbnQgZnJvbSB0aGlzIHRhcmdldCdzIGFjdHVhbCBuYW1lLiBUaGlzIGlzIGEgaGFjayBhbmQgc2hvdWxkIGJlCisgICAgICAgICMgY2xlYW5lZCB1cCBieSByZW9yZ2FuaXppbmcgd2hvIGtub3dzIGFib3V0IHNjYW5uZXJzIGluIHRoZQorICAgICAgICAjIHZpcnR1YWwtdGFyZ2V0L2Fic3RyYWN0LWZpbGUtdGFyZ2V0L2ZpbGUtdGFyZ2V0L25vdGZpbGUtdGFyZ2V0LworICAgICAgICAjIHNlYXJjaGVkLWxpYi10YXJnZXQvLi4uIGNsYXNzIGhpZXJhcmNoeS4KKyAgICAgICAgbG9jYWwgaXMtc2Nhbm5lci10YXJnZXQgOworICAgICAgICBpZiAkKHRhcmdldCkgIT0gWyBhY3R1YWwtbmFtZSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGlzLXNjYW5uZXItdGFyZ2V0ID0gdHJ1ZSA7CisgICAgICAgIH0KKworICAgICAgICBpZiAkKHNlbGYuYWN0aW9uKSAmJiAhICQoaXMtc2Nhbm5lci10YXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgVGhpcyBpcyBhIGRlcml2ZWQgZmlsZS4KKyAgICAgICAgICAgIGxvY2FsIHBhdGggPSBbIHBhdGggXSA7CisgICAgICAgICAgICBMT0NBVEUgb24gJCh0YXJnZXQpID0gJChwYXRoKSA7CisKKyAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBwYXRoIGV4aXN0cy4KKyAgICAgICAgICAgIERFUEVORFMgJCh0YXJnZXQpIDogJChwYXRoKSA7CisgICAgICAgICAgICBjb21tb24uTWtEaXIgJChwYXRoKSA7CisKKyAgICAgICAgICAgICMgSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgdGFyZ2V0IG5hbWUgaW5jbHVkZXMgYSBkaXJlY3RvcnkgdG9vLCBmb3IKKyAgICAgICAgICAgICMgZXhhbXBsZSB3aGVuIGluc3RhbGxpbmcgaGVhZGVycy4gQ3JlYXRlIHRoYXQgZGlyZWN0b3J5LgorICAgICAgICAgICAgaWYgJCh0YXJnZXQ6RCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBkID0gJCh0YXJnZXQ6RCkgOworICAgICAgICAgICAgICAgIGQgPSAkKGQ6Uj0kKHBhdGgpKSA7CisgICAgICAgICAgICAgICAgREVQRU5EUyAkKHRhcmdldCkgOiAkKGQpIDsKKyAgICAgICAgICAgICAgICBjb21tb24uTWtEaXIgJChkKSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgRm9yIGEgcmVhbCBmaWxlIHRhcmdldCwgd2UgY3JlYXRlIGEgZmFrZSB0YXJnZXQgZGVwZW5kaW5nIG9uIHRoZQorICAgICAgICAgICAgIyByZWFsIHRhcmdldC4gVGhpcyBhbGxvd3MgdXMgdG8gcnVuCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjICAgIGIyIGhlbGxvLm8KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgd2l0aG91dCB0cnlpbmcgdG8gZ3Vlc3MgdGhlIG5hbWUgb2YgdGhlIHJlYWwgdGFyZ2V0LiBOb3RlIHRoYXQgdGhlCisgICAgICAgICAgICAjIHRhcmdldCBoYXMgbm8gZGlyZWN0b3J5IG5hbWUgYW5kIHVzZXMgYSBzcGVjaWFsIDxlPiBncmlzdC4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgRmlyc3QsIHRoYXQgbWVhbnMgdGhhdCAiYjIgaGVsbG8ubyIgd2lsbCBidWlsZCBhbGwga25vd24gaGVsbG8ubworICAgICAgICAgICAgIyB0YXJnZXRzLiBTZWNvbmQsIHRoZSA8ZT4gZ3Jpc3QgbWFrZXMgc3VyZSB0aGlzIHRhcmdldCB3aWxsIG5vdCBiZQorICAgICAgICAgICAgIyBjb25mdXNlZCB3aXRoIG90aGVyIHRhcmdldHMsIGZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIHN1YmRpciAndGVzdCcKKyAgICAgICAgICAgICMgd2l0aCB0YXJnZXQgJ3Rlc3QnIGluIGl0IHRoYXQgaW5jbHVkZXMgYSAndGVzdC5vJyBmaWxlLCB0aGVuIHRoZQorICAgICAgICAgICAgIyB0YXJnZXQgZm9yIGRpcmVjdG9yeSB3aWxsIGJlIGp1c3QgJ3Rlc3QnIHRoZSB0YXJnZXQgZm9yIHRlc3QubworICAgICAgICAgICAgIyB3aWxsIGJlIDxwdGVzdC9iaW4vZ2NjL2RlYnVnPnRlc3QubyBhbmQgdGhlIHRhcmdldCB3ZSBjcmVhdGUgYmVsb3cKKyAgICAgICAgICAgICMgd2lsbCBiZSA8ZT50ZXN0Lm8KKyAgICAgICAgICAgIERFUEVORFMgJCh0YXJnZXQ6Rz1lKSA6ICQodGFyZ2V0KSA7CisgICAgICAgICAgICAjIEFsbG93IGIyIDxwYXRoLXRvLWZpbGU+LzxmaWxlPiB0byB3b3JrLiBUaGlzIHdpbGwgbm90IGNhdGNoIGFsbAorICAgICAgICAgICAgIyBwb3NzaWJsZSB3YXlzIHRvIHJlZmVyIHRvIHRoZSBwYXRoIChyZWxhdGl2ZS9hYnNvbHV0ZSwgZXh0cmEgIi4iLAorICAgICAgICAgICAgIyB2YXJpb3VzICIuLiIsIGJ1dCBzaG91bGQgaGVscCBpbiBvYnZpb3VzIGNhc2VzLgorICAgICAgICAgICAgREVQRU5EUyAkKHRhcmdldDpHPWU6Uj0kKHBhdGgpKSA6ICQodGFyZ2V0KSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTRUFSQ0ggb24gJCh0YXJnZXQpID0gWyBwYXRoLm5hdGl2ZSAkKHNlbGYucGF0aCkgXSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFJldHVybnMgdGhlIGRpcmVjdG9yeSBmb3IgdGhpcyB0YXJnZXQuCisgICAgIworICAgIHJ1bGUgcGF0aCAoICkKKyAgICB7CisgICAgICAgIGlmICEgJChzZWxmLnBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQoc2VsZi5hY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWwgcCA9IFsgJChzZWxmLmFjdGlvbikucHJvcGVydGllcyBdIDsKKyAgICAgICAgICAgICAgICBsb2NhbCBwYXRoLHJlbGF0aXZlLXRvLWJ1aWxkLWRpciA9IFsgJChwKS50YXJnZXQtcGF0aCBdIDsKKyAgICAgICAgICAgICAgICBsb2NhbCBwYXRoID0gJChwYXRoLHJlbGF0aXZlLXRvLWJ1aWxkLWRpclsxXSkgOworICAgICAgICAgICAgICAgIGxvY2FsIHJlbGF0aXZlLXRvLWJ1aWxkLWRpciA9ICQocGF0aCxyZWxhdGl2ZS10by1idWlsZC1kaXJbMl0pIDsKKworICAgICAgICAgICAgICAgIGlmICQocmVsYXRpdmUtdG8tYnVpbGQtZGlyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFsgcGF0aC5qb2luIFsgJChzZWxmLnByb2plY3QpLmJ1aWxkLWRpciBdICQocGF0aCkgXSA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gWyBwYXRoLm5hdGl2ZSAkKHBhdGgpIF0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHNlbGYucGF0aCkgOworICAgICB9Cit9CisKKworY2xhc3Mgbm90ZmlsZS10YXJnZXQgOiBhYnN0cmFjdC1maWxlLXRhcmdldAoreworICAgIHJ1bGUgX19pbml0X18gKCBuYW1lIDogcHJvamVjdCA6IGFjdGlvbiA/ICkKKyAgICB7CisgICAgICAgIGFic3RyYWN0LWZpbGUtdGFyZ2V0Ll9faW5pdF9fICQobmFtZSkgOiA6ICQocHJvamVjdCkgOiAkKGFjdGlvbikgOworICAgIH0KKworICAgICMgUmV0dXJucyBub3RoaW5nIHRvIGluZGljYXRlIHRoYXQgdGhlIHRhcmdldCdzIHBhdGggaXMgbm90IGtub3duLgorICAgICMKKyAgICBydWxlIHBhdGggKCApCisgICAgeworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHJ1bGUgYWN0dWFsaXplLWxvY2F0aW9uICggdGFyZ2V0ICkKKyAgICB7CisgICAgICAgIE5PVEZJTEUgJCh0YXJnZXQpIDsKKyAgICAgICAgQUxXQVlTICQodGFyZ2V0KSA7CisgICAgICAgICMgVEVNUE9SQVJZICQodGFyZ2V0KSA7CisgICAgICAgIE5PVVBEQVRFICQodGFyZ2V0KSA7CisgICAgfQorfQorCisKKyMgQ2xhc3MgcmVwcmVzZW50aW5nIGFuIGFjdGlvbi4gQm90aCAndGFyZ2V0cycgYW5kICdzb3VyY2VzJyBzaG91bGQgbGlzdAorIyBpbnN0YW5jZXMgb2YgJ3ZpcnR1YWwtdGFyZ2V0Jy4gQWN0aW9uIG5hbWUgc2hvdWxkIG5hbWUgYSBydWxlIHdpdGggdGhpcworIyBwcm90b3R5cGU6CisjICAgICBydWxlIGFjdGlvbi1uYW1lICggdGFyZ2V0cyArIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKKyMgVGFyZ2V0cyBhbmQgc291cmNlcyBhcmUgcGFzc2VkIGFzIGFjdHVhbCBKYW0gdGFyZ2V0cy4gVGhlIHJ1bGUgbWF5IG5vdAorIyBlc3RhYmxpc2ggYWRkaXRpb25hbCBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMuCisjCitjbGFzcyBhY3Rpb24KK3sKKyAgICBpbXBvcnQgImNsYXNzIiA7CisgICAgaW1wb3J0IGluZGlyZWN0IDsKKyAgICBpbXBvcnQgcGF0aCA7CisgICAgaW1wb3J0IHByb3BlcnR5LXNldCA7CisgICAgaW1wb3J0IHNldCA6IGRpZmZlcmVuY2UgOworICAgIGltcG9ydCB0b29sc2V0IDsKKyAgICBpbXBvcnQgdHlwZSA7CisKKyAgICBydWxlIF9faW5pdF9fICggc291cmNlcyAqIDogYWN0aW9uLW5hbWUgKyA6IHByb3BlcnR5LXNldCA/ICkKKyAgICB7CisgICAgICAgIHNlbGYuc291cmNlcyA9ICQoc291cmNlcykgOworCisgICAgICAgIHNlbGYuYWN0aW9uLW5hbWUgPSBbIGluZGlyZWN0Lm1ha2UtcXVhbGlmaWVkICQoYWN0aW9uLW5hbWUpIF0gOworCisgICAgICAgIGlmICEgJChwcm9wZXJ0eS1zZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3BlcnR5LXNldCA9IFsgcHJvcGVydHktc2V0LmVtcHR5IF0gOworICAgICAgICB9CisKKyAgICAgICAgaWYgISBbIGNsYXNzLmlzLWluc3RhbmNlICQocHJvcGVydHktc2V0KSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOiBlcnJvciA6IGVycm9ycy5lcnJvciA7CisgICAgICAgICAgICBlcnJvcnMuZXJyb3IgIlByb3BlcnR5IHNldCBpbnN0YW5jZSByZXF1aXJlZCIgOworICAgICAgICB9CisKKyAgICAgICAgc2VsZi5wcm9wZXJ0aWVzID0gJChwcm9wZXJ0eS1zZXQpIDsKKyAgICB9CisKKyAgICBydWxlIGFkZC10YXJnZXRzICggdGFyZ2V0cyAqICkKKyAgICB7CisgICAgICAgIHNlbGYudGFyZ2V0cyArPSAkKHRhcmdldHMpIDsKKyAgICB9CisKKyAgICBydWxlIHJlcGxhY2UtdGFyZ2V0cyAoIG9sZC10YXJnZXRzICogOiBuZXctdGFyZ2V0cyAqICkKKyAgICB7CisgICAgICAgIHNlbGYudGFyZ2V0cyA9IFsgc2V0LmRpZmZlcmVuY2UgJChzZWxmLnRhcmdldHMpIDogJChvbGQtdGFyZ2V0cykgXSA7CisgICAgICAgIHNlbGYudGFyZ2V0cyArPSAkKG5ldy10YXJnZXRzKSA7CisgICAgfQorCisgICAgcnVsZSB0YXJnZXRzICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi50YXJnZXRzKSA7CisgICAgfQorCisgICAgcnVsZSBzb3VyY2VzICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi5zb3VyY2VzKSA7CisgICAgfQorCisgICAgcnVsZSBhY3Rpb24tbmFtZSAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYuYWN0aW9uLW5hbWUpIDsKKyAgICB9CisKKyAgICBydWxlIHByb3BlcnRpZXMgKCApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLnByb3BlcnRpZXMpIDsKKyAgICB9CisKKyAgICAjIEdlbmVyYXRlcyBhY3R1YWwgYnVpbGQgaW5zdHJ1Y3Rpb25zLgorICAgICMKKyAgICBydWxlIGFjdHVhbGl6ZSAoICkKKyAgICB7CisgICAgICAgIGlmICEgJChzZWxmLmFjdHVhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbGYuYWN0dWFsaXplZCA9IHRydWUgOworCisgICAgICAgICAgICBsb2NhbCBwcyA9IFsgcHJvcGVydGllcyBdIDsKKyAgICAgICAgICAgIGxvY2FsIHByb3BlcnRpZXMgPSBbIGFkanVzdC1wcm9wZXJ0aWVzICQocHMpIF0gOworCisgICAgICAgICAgICBsb2NhbCBhY3R1YWwtdGFyZ2V0cyA7CisgICAgICAgICAgICBmb3IgbG9jYWwgaSBpbiBbIHRhcmdldHMgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFjdHVhbC10YXJnZXRzICs9IFsgJChpKS5hY3R1YWxpemUgXSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFjdHVhbGl6ZS1zb3VyY2VzIFsgc291cmNlcyBdIDogJChwcm9wZXJ0aWVzKSA7CisKKyAgICAgICAgICAgIERFUEVORFMgJChhY3R1YWwtdGFyZ2V0cykgOiAkKHNlbGYuYWN0dWFsLXNvdXJjZXMpCisgICAgICAgICAgICAgICAgJChzZWxmLmRlcGVuZGVuY3ktb25seS1zb3VyY2VzKSA7CisKKyAgICAgICAgICAgICMgQWN0aW9uIG5hbWUgY2FuIGluY2x1ZGUgYWRkaXRpb25hbCBydWxlIGFyZ3VtZW50cywgd2hpY2ggc2hvdWxkCisgICAgICAgICAgICAjIG5vdCBiZSBwYXNzZWQgdG8gJ3NldC10YXJnZXQtdmFyaWFibGVzJy4KKyAgICAgICAgICAgIHRvb2xzZXQuc2V0LXRhcmdldC12YXJpYWJsZXMKKyAgICAgICAgICAgICAgICBbIGluZGlyZWN0LmdldC1ydWxlICQoc2VsZi5hY3Rpb24tbmFtZVsxXSkgXSAkKGFjdHVhbC10YXJnZXRzKQorICAgICAgICAgICAgICAgIDogJChwcm9wZXJ0aWVzKSA7CisKKyAgICAgICAgICAgICMgUmVmbGVjdCBvdXJzZWx2ZXMgaW4gYSB2YXJpYWJsZSBmb3IgdGhlIHRhcmdldC4gVGhpcyBhbGxvd3MKKyAgICAgICAgICAgICMgbG9va2luZyB1cCBhZGRpdGlvbmFsIGluZm8gZm9yIHRoZSBhY3Rpb24gZ2l2ZW4gdGhlIHJhdyB0YXJnZXQuCisgICAgICAgICAgICAjIEZvciBleGFtcGxlIHRvIGRlYnVnIG9yIG91dHB1dCBhY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBhY3Rpb24KKyAgICAgICAgICAgICMgcnVsZXMuCisgICAgICAgICAgICAuYWN0aW9uIG9uICQoYWN0dWFsLXRhcmdldHMpID0gJChfX25hbWVfXykgOworCisgICAgICAgICAgICBpbmRpcmVjdC5jYWxsICQoc2VsZi5hY3Rpb24tbmFtZSkgJChhY3R1YWwtdGFyZ2V0cykKKyAgICAgICAgICAgICAgICA6ICQoc2VsZi5hY3R1YWwtc291cmNlcykgOiBbICQocHJvcGVydGllcykucmF3IF0gOworCisgICAgICAgICAgICAjIFNpbmNlIHdlIHNldCB1cCB0aGUgY3JlYXRpbmcgYWN0aW9uIGhlcmUsIHdlIHNldCB1cCB0aGUgYWN0aW9uIGZvcgorICAgICAgICAgICAgIyBjbGVhbmluZyB1cCBhcyB3ZWxsLgorICAgICAgICAgICAgY29tbW9uLkNsZWFuIGNsZWFuLWFsbCA6ICQoYWN0dWFsLXRhcmdldHMpIDsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgSGVscGVyIGZvciAnYWN0dWFsaXplLXNvdXJjZXMnLiBGb3IgZWFjaCBwYXNzZWQgc291cmNlLCBhY3R1YWxpemVzIGl0IHdpdGgKKyAgICAjIHRoZSBhcHByb3ByaWF0ZSBzY2FubmVyLiBSZXR1cm5zIHRoZSBhY3R1YWxpemVkIHZpcnR1YWwgdGFyZ2V0cy4KKyAgICAjCisgICAgcnVsZSBhY3R1YWxpemUtc291cmNlLXR5cGUgKCBzb3VyY2VzICogOiBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgbG9jYWwgcmVzdWx0ID0gOworICAgICAgICBmb3IgbG9jYWwgaSBpbiAkKHNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHNjYW5uZXIgOworICAgICAgICAgICAgaWYgWyAkKGkpLnR5cGUgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjYW5uZXIgPSBbIHR5cGUuZ2V0LXNjYW5uZXIgWyAkKGkpLnR5cGUgXSA6ICQocHJvcGVydHktc2V0KSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCArPSBbICQoaSkuYWN0dWFsaXplICQoc2Nhbm5lcikgXSA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQocmVzdWx0KSA7CisgICAgfQorCisgICAgIyBDcmVhdGVzIGFjdHVhbCBKYW0gdGFyZ2V0cyBmb3Igc291cmNlcy4gSW5pdGlhbGl6ZXMgdGhlIGZvbGxvd2luZyBtZW1iZXIKKyAgICAjIHZhcmlhYmxlczoKKyAgICAjICAgJ3NlbGYuYWN0dWFsLXNvdXJjZXMnICAgICAgICAgIC0tIHNvdXJjZXMgcGFzc2VkIHRvIHRoZSB1cGRhdGluZyBhY3Rpb24uCisgICAgIyAgICdzZWxmLmRlcGVuZGVuY3ktb25seS1zb3VyY2VzJyAtLSBzb3VyY2VzIG1hcmtlZCBhcyBkZXBlbmRlbmNpZXMsIGJ1dAorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG5vdCB1c2VkIG90aGVyd2lzZS4KKyAgICAjCisgICAgIyBOZXcgdmFsdWVzIHdpbGwgYmUgKmFwcGVuZGVkKiB0byB0aGUgdmFyaWFibGVzLiBUaGV5IG1heSBiZSBub24tZW1wdHkgaWYKKyAgICAjIGNhbGxlciB3YW50cyBpdC4KKyAgICAjCisgICAgcnVsZSBhY3R1YWxpemUtc291cmNlcyAoIHNvdXJjZXMgKiA6IHByb3BlcnR5LXNldCApCisgICAgeworICAgICAgICBsb2NhbCBkZXBlbmRlbmNpZXMgPSBbICQoc2VsZi5wcm9wZXJ0aWVzKS5nZXQgPGRlcGVuZGVuY3k+IF0gOworCisgICAgICAgIHNlbGYuZGVwZW5kZW5jeS1vbmx5LXNvdXJjZXMgKz0KKyAgICAgICAgICAgIFsgYWN0dWFsaXplLXNvdXJjZS10eXBlICQoZGVwZW5kZW5jaWVzKSA6ICQocHJvcGVydHktc2V0KSBdIDsKKyAgICAgICAgc2VsZi5hY3R1YWwtc291cmNlcyArPQorICAgICAgICAgICAgWyBhY3R1YWxpemUtc291cmNlLXR5cGUgJChzb3VyY2VzKSA6ICQocHJvcGVydHktc2V0KSBdIDsKKworICAgICAgICAjIFRoaXMgaXMgdXNlZCB0byBoZWxwIGIyIGZpbmQgZGVwZW5kZW5jaWVzIGluIGdlbmVyYXRlZCBoZWFkZXJzIGFuZAorICAgICAgICAjIG90aGVyIG1haW4gdGFyZ2V0cywgZS5nLiBpbjoKKyAgICAgICAgIworICAgICAgICAjICAgbWFrZSBhLmggOiAuLi4uLi4uIDsKKyAgICAgICAgIyAgIGV4ZSBoZWxsbyA6IGhlbGxvLmNwcCA6IDxpbXBsaWNpdC1kZXBlbmRlbmN5PmEuaCA7CisgICAgICAgICMKKyAgICAgICAgIyBGb3IgYjIgdG8gZmluZCB0aGUgZGVwZW5kZW5jeSB0aGUgZ2VuZXJhdGVkIHRhcmdldCBtdXN0IGJlCisgICAgICAgICMgYWN0dWFsaXplZCAoaS5lLiBoYXZlIGl0cyBKYW0gdGFyZ2V0IGNvbnN0cnVjdGVkKS4gSW4gdGhlIGFib3ZlIGNhc2UsCisgICAgICAgICMgaWYgd2UgYXJlIGJ1aWxkaW5nIGp1c3QgaGVsbG8gKCJiMiBoZWxsbyIpLCAnYS5oJyB3aWxsIG5vdCBiZQorICAgICAgICAjIGFjdHVhbGl6ZWQgdW5sZXNzIHdlIGRvIGl0IGhlcmUuCisgICAgICAgIGxvY2FsIGltcGxpY2l0ID0gWyAkKHNlbGYucHJvcGVydGllcykuZ2V0IDxpbXBsaWNpdC1kZXBlbmRlbmN5PiBdIDsKKyAgICAgICAgZm9yIGxvY2FsIGkgaW4gJChpbXBsaWNpdCkKKyAgICAgICAgeworICAgICAgICAgICAgJChpOkc9KS5hY3R1YWxpemUgOworICAgICAgICB9CisgICAgfQorCisgICAgIyBEZXRlcm1pbmVzIHJlYWwgcHJvcGVydGllcyB3aGVuIHRyeWluZyB0byBidWlsZCB3aXRoICdwcm9wZXJ0aWVzJy4gVGhpcyBpcworICAgICMgdGhlIGxhc3QgY2hhbmNlIHRvIGZpeCBwcm9wZXJ0aWVzLCBmb3IgZXhhbXBsZSB0byBhZGp1c3QgaW5jbHVkZXMgdG8gZ2V0CisgICAgIyBnZW5lcmF0ZWQgaGVhZGVycyBjb3JyZWN0bHkuIERlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgaXRzCisgICAgIyBhcmd1bWVudC4KKyAgICAjCisgICAgcnVsZSBhZGp1c3QtcHJvcGVydGllcyAoIHByb3BlcnR5LXNldCApCisgICAgeworICAgICAgICByZXR1cm4gJChwcm9wZXJ0eS1zZXQpIDsKKyAgICB9Cit9CisKKworIyBBY3Rpb24gY2xhc3Mgd2hpY2ggZG9lcyBub3RoaW5nIC0tLSBpdCBwcm9kdWNlcyB0aGUgdGFyZ2V0cyB3aXRoIHNwZWNpZmljCisjIHByb3BlcnRpZXMgb3V0IG9mIG5vd2hlcmUuIEl0IGlzIG5lZWRlZCB0byBkaXN0aW5ndWlzaCB2aXJ0dWFsIHRhcmdldHMgd2l0aAorIyBkaWZmZXJlbnQgcHJvcGVydGllcyB0aGF0IGFyZSBrbm93biB0byBleGlzdCBhbmQgaGF2ZSBubyBhY3Rpb25zIHdoaWNoIGNyZWF0ZQorIyB0aGVtLgorIworY2xhc3MgbnVsbC1hY3Rpb24gOiBhY3Rpb24KK3sKKyAgICBydWxlIF9faW5pdF9fICggcHJvcGVydHktc2V0ID8gKQorICAgIHsKKyAgICAgICAgYWN0aW9uLl9faW5pdF9fIDogLm5vLWFjdGlvbiA6ICQocHJvcGVydHktc2V0KSA7CisgICAgfQorCisgICAgcnVsZSBhY3R1YWxpemUgKCApCisgICAgeworICAgICAgICBpZiAhICQoc2VsZi5hY3R1YWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLmFjdHVhbGl6ZWQgPSB0cnVlIDsKKyAgICAgICAgICAgIGZvciBsb2NhbCBpIGluIFsgdGFyZ2V0cyBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJChpKS5hY3R1YWxpemUgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKyMgQ2xhc3Mgd2hpY2ggYWN0cyBleGFjdGx5IGxpa2UgJ2FjdGlvbicsIGV4Y2VwdCB0aGF0IGl0cyBzb3VyY2VzIGFyZSBub3QKKyMgc2Nhbm5lZCBmb3IgZGVwZW5kZW5jaWVzLgorIworY2xhc3Mgbm9uLXNjYW5uaW5nLWFjdGlvbiA6IGFjdGlvbgoreworICAgIHJ1bGUgX19pbml0X18gKCBzb3VyY2VzICogOiBhY3Rpb24tbmFtZSArIDogcHJvcGVydHktc2V0ID8gKQorICAgIHsKKyAgICAgICAgYWN0aW9uLl9faW5pdF9fICQoc291cmNlcykgOiAkKGFjdGlvbi1uYW1lKSA6ICQocHJvcGVydHktc2V0KSA7CisgICAgfQorCisgICAgcnVsZSBhY3R1YWxpemUtc291cmNlLXR5cGUgKCBzb3VyY2VzICogOiBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgbG9jYWwgcmVzdWx0IDsKKyAgICAgICAgZm9yIGxvY2FsIGkgaW4gJChzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gWyAkKGkpLmFjdHVhbGl6ZSBdIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChyZXN1bHQpIDsKKyAgICB9Cit9CisKKworIyBDcmVhdGVzIGEgdmlydHVhbCB0YXJnZXQgd2l0aCBhbiBhcHByb3ByaWF0ZSBuYW1lIGFuZCB0eXBlIGZyb20gJ2ZpbGUnLiBJZiBhCisjIHRhcmdldCB3aXRoIHRoYXQgbmFtZSBpbiB0aGF0IHByb2plY3QgYWxyZWFkeSBleGlzdHMsIHJldHVybnMgdGhhdCBhbHJlYWR5CisjIGNyZWF0ZWQgdGFyZ2V0LgorIworIyBGSVhNRTogYSBtb3JlIGNvcnJlY3Qgd2F5IHdvdWxkIGJlIHRvIGNvbXB1dGUgdGhlIHBhdGggdG8gdGhlIGZpbGUsIGJhc2VkIG9uCisjIG5hbWUgYW5kIHNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIHByb2plY3QsIGFuZCB1c2UgdGhhdCBwYXRoIHRvIGRldGVybWluZSBpZgorIyB0aGUgdGFyZ2V0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZC4gVGhpcyBsb2dpYyBzaG91bGQgYmUgc2hhcmVkIHdpdGggaG93IHdlCisjIHVzdWFsbHkgZmluZCB0YXJnZXRzIGlkZW50aWZpZWQgYnkgYSBzcGVjaWZpYyB0YXJnZXQgaWQuIEl0IHNob3VsZCBhbHNvIGJlCisjIHVwZGF0ZWQgdG8gd29yayBjb3JyZWN0bHkgd2hlbiB0aGUgZmlsZSBpcyBzcGVjaWZpZWQgdXNpbmcgYm90aCByZWxhdGl2ZSBhbmQKKyMgYWJzb2x1dGUgcGF0aHMuCisjCisjIFRPRE86IHBhc3NpbmcgYSBwcm9qZWN0IHdpdGggYWxsIHZpcnR1YWwgdGFyZ2V0cyBpcyBzdGFydGluZyB0byBiZSBhbm5veWluZy4KKyMKK3J1bGUgZnJvbS1maWxlICggZmlsZSA6IGZpbGUtbG9jIDogcHJvamVjdCApCit7CisgICAgaW1wb3J0IHR5cGUgOyAgIyBIYWQgdG8gZG8gdGhpcyBoZXJlIHRvIGJyZWFrIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS4KKworICAgICMgQ2hlY2sgd2hldGhlciB3ZSBhbHJlYWR5IGNyZWF0ZWQgYSB0YXJnZXQgY29ycmVzcG9uZGluZyB0byB0aGlzIGZpbGUuCisgICAgbG9jYWwgcGF0aCA9IFsgcGF0aC5yb290IFsgcGF0aC5yb290ICQoZmlsZSkgJChmaWxlLWxvYykgXSBbIHBhdGgucHdkIF0gXSA7CisKKyAgICBpZiAkKC5maWxlcy4kKHBhdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoLmZpbGVzLiQocGF0aCkpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbG9jYWwgbmFtZSA9IFsgcGF0aC5tYWtlICQoZmlsZSkgXSA7CisgICAgICAgIGxvY2FsIHR5cGUgPSBbIHR5cGUudHlwZSAkKGZpbGUpIF0gOworICAgICAgICBsb2NhbCByZXN1bHQgOworCisgICAgICAgIHJlc3VsdCA9IFsgbmV3IGZpbGUtdGFyZ2V0ICQoZmlsZSkgOiAkKHR5cGUpIDogJChwcm9qZWN0KSA6IDoKKyAgICAgICAgICAgICQoZmlsZS1sb2MpIF0gOworCisgICAgICAgIC5maWxlcy4kKHBhdGgpID0gJChyZXN1bHQpIDsKKyAgICAgICAgcmV0dXJuICQocmVzdWx0KSA7CisgICAgfQorfQorCisKKyMgUmVnaXN0ZXJzIGEgbmV3IHZpcnR1YWwgdGFyZ2V0LiBDaGVja3MgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlZ2lzdGVyZWQgdGFyZ2V0CisjIHdpdGggdGhlIHNhbWUgbmFtZSwgdHlwZSwgcHJvamVjdCBhbmQgc3VidmFyaWFudCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdGhlCisjIHNhbWUgc291cmNlcyBhbmQgZXF1YWwgYWN0aW9uLiBJZiBzdWNoIHRhcmdldCBpcyBmb3VuZCBpdCBpcyByZXR1cm5lZCBhbmQgYQorIyBuZXcgJ3RhcmdldCcgaXMgbm90IHJlZ2lzdGVyZWQuIE90aGVyd2lzZSwgJ3RhcmdldCcgaXMgcmVnaXN0ZXJlZCBhbmQKKyMgcmV0dXJuZWQuCisjCitydWxlIHJlZ2lzdGVyICggdGFyZ2V0ICkKK3sKKyAgICBsb2NhbCBzaWduYXR1cmUgPSBbIHNlcXVlbmNlLmpvaW4gWyAkKHRhcmdldCkucGF0aCBdIFsgJCh0YXJnZXQpLm5hbWUgXSA6IC0KKyAgICAgICAgXSA7CisKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGZvciBsb2NhbCB0IGluICQoLmNhY2hlLiQoc2lnbmF0dXJlKSkKKyAgICB7CisgICAgICAgIGxvY2FsIGExID0gWyAkKHQpLmFjdGlvbiBdIDsKKyAgICAgICAgbG9jYWwgYTIgPSBbICQodGFyZ2V0KS5hY3Rpb24gXSA7CisKKyAgICAgICAgaWYgISAkKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgISAkKGExKSAmJiAhICQoYTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gJCh0KSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICQoYTEpICYmICQoYTIpICYmCisgICAgICAgICAgICAgICAgKCBbICQoYTEpLmFjdGlvbi1uYW1lIF0gPSBbICQoYTIpLmFjdGlvbi1uYW1lIF0gKSAmJgorICAgICAgICAgICAgICAgICggWyAkKGExKS5zb3VyY2VzICAgICBdID0gWyAkKGEyKS5zb3VyY2VzICAgICBdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBwczEgPSBbICQoYTEpLnByb3BlcnRpZXMgXSA7CisgICAgICAgICAgICAgICAgbG9jYWwgcHMyID0gWyAkKGEyKS5wcm9wZXJ0aWVzIF0gOworICAgICAgICAgICAgICAgIGxvY2FsIHAxID0gWyAkKHBzMSkuYmFzZSBdIFsgJChwczEpLmZyZWUgXSBbIHNldC5kaWZmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIFsgJChwczEpLmRlcGVuZGVuY3kgXSA6IFsgJChwczEpLmluY2lkZW50YWwgXSBdIDsKKyAgICAgICAgICAgICAgICBsb2NhbCBwMiA9IFsgJChwczIpLmJhc2UgXSBbICQocHMyKS5mcmVlIF0gWyBzZXQuZGlmZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBbICQocHMyKS5kZXBlbmRlbmN5IF0gOiBbICQocHMyKS5pbmNpZGVudGFsIF0gXSA7CisgICAgICAgICAgICAgICAgaWYgJChwMSkgPSAkKHAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJCh0KSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgISAkKHJlc3VsdCkKKyAgICB7CisgICAgICAgIC5jYWNoZS4kKHNpZ25hdHVyZSkgKz0gJCh0YXJnZXQpIDsKKyAgICAgICAgcmVzdWx0ID0gJCh0YXJnZXQpIDsKKyAgICB9CisKKyAgICAucmVjZW50LXRhcmdldHMgKz0gJChyZXN1bHQpIDsKKyAgICAuYWxsLXRhcmdldHMgKz0gJChyZXN1bHQpIDsKKworICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgRWFjaCB0YXJnZXQgcmV0dXJuZWQgYnkgJ3JlZ2lzdGVyJyBpcyBhZGRlZCB0byB0aGUgLnJlY2VudC10YXJnZXRzIGxpc3QsCisjIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRoaXMgYWxsb3dzIHVzIHRvIGZpbmQgYWxsIHZpcnR1YWwgdGFyZ2V0cyBjcmVhdGVkCisjIHdoZW4gYnVpbGRpbmcgYSBzcGVjaWZpYyBtYWluIHRhcmdldCwgZXZlbiB0aG9zZSBjb25zdHJ1Y3RlZCBvbmx5IGFzCisjIGludGVybWVkaWF0ZSB0YXJnZXRzLgorIworcnVsZSByZWNlbnQtdGFyZ2V0cyAoICkKK3sKKyAgICByZXR1cm4gJCgucmVjZW50LXRhcmdldHMpIDsKK30KKworCitydWxlIGNsZWFyLXJlY2VudC10YXJnZXRzICggKQoreworICAgIC5yZWNlbnQtdGFyZ2V0cyA9IDsKK30KKworCisjIFJldHVybnMgYWxsIHZpcnR1YWwgdGFyZ2V0cyBldmVyIGNyZWF0ZWQuCisjCitydWxlIGFsbC10YXJnZXRzICggKQoreworICAgIHJldHVybiAkKC5hbGwtdGFyZ2V0cykgOworfQorCisKKyMgUmV0dXJucyBhbGwgdGFyZ2V0cyBmcm9tICd0YXJnZXRzJyB3aXRoIHR5cGVzIGVxdWFsIHRvICd0eXBlJyBvciBkZXJpdmVkIGZyb20KKyMgaXQuCisjCitydWxlIHNlbGVjdC1ieS10eXBlICggdHlwZSA6IHRhcmdldHMgKiApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBmb3IgbG9jYWwgdCBpbiAkKHRhcmdldHMpCisgICAgeworICAgICAgICBpZiBbIHR5cGUuaXMtc3VidHlwZSBbICQodCkudHlwZSBdICQodHlwZSkgXQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gJCh0KSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworcnVsZSByZWdpc3Rlci1hY3R1YWwtbmFtZSAoIGFjdHVhbC1uYW1lIDogdmlydHVhbC10YXJnZXQgKQoreworICAgIGlmICQoLmFjdHVhbC4kKGFjdHVhbC1uYW1lKSkKKyAgICB7CisgICAgICAgIGxvY2FsIGNzMSA9IFsgJCguYWN0dWFsLiQoYWN0dWFsLW5hbWUpKS5jcmVhdGluZy1zdWJ2YXJpYW50IF0gOworICAgICAgICBsb2NhbCBjbXQxLW5hbWUgOworICAgICAgICBpZiAkKGNzMSktaXMtZGVmaW5lZAorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBjbXQxID0gWyAkKGNzMSkubWFpbi10YXJnZXQgXSA7CisgICAgICAgICAgICBjbXQxLW5hbWUgPSBbICQoY210MSkuZnVsbC1uYW1lIF0gOworICAgICAgICB9CisgICAgICAgIGxvY2FsIGNzMiA9IFsgJCh2aXJ0dWFsLXRhcmdldCkuY3JlYXRpbmctc3VidmFyaWFudCBdIDsKKyAgICAgICAgbG9jYWwgY210Mi1uYW1lIDsKKyAgICAgICAgaWYgJChjczIpLWlzLWRlZmluZWQKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgY210MiA9IFsgJChjczIpLm1haW4tdGFyZ2V0IF0gOworICAgICAgICAgICAgY210Mi1uYW1lID0gWyAkKGNtdDIpLmZ1bGwtbmFtZSBdIDsKKyAgICAgICAgfQorICAgICAgICBsb2NhbCBleHRyYS1lcnJvci1pbmZvcm1hdGlvbiA7CisgICAgICAgIGlmICEgJChjczEpLWlzLWRlZmluZWQgfHwgISAkKGNzMiktaXMtZGVmaW5lZAorICAgICAgICB7CisgICAgICAgICAgICBleHRyYS1lcnJvci1pbmZvcm1hdGlvbiA9IEVuY291bnRlcmVkIGEgdmlydHVhbC10YXJnZXQgd2l0aG91dCBhCisgICAgICAgICAgICAgICAgY3JlYXRpbmcgc3VidmFyaWFudC4gSXQgY291bGQgYmUgdGhlIHZpcnR1YWwgdGFyZ2V0IGhhcyBub3QgYmVlbgorICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgdmlhIHRoZSB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciBydWxlLiA7CisgICAgICAgIH0KKworICAgICAgICBsb2NhbCBhY3Rpb24xID0gWyAkKC5hY3R1YWwuJChhY3R1YWwtbmFtZSkpLmFjdGlvbiBdIDsKKyAgICAgICAgbG9jYWwgYWN0aW9uMiA9IFsgJCh2aXJ0dWFsLXRhcmdldCkuYWN0aW9uIF0gOworICAgICAgICBsb2NhbCBwcm9wZXJ0aWVzLWFkZGVkIDsKKyAgICAgICAgbG9jYWwgcHJvcGVydGllcy1yZW1vdmVkIDsKKyAgICAgICAgaWYgJChhY3Rpb24xKSAmJiAkKGFjdGlvbjIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHAxID0gWyAkKGFjdGlvbjEpLnByb3BlcnRpZXMgXSA7CisgICAgICAgICAgICBwMSA9IFsgJChwMSkucmF3IF0gOworICAgICAgICAgICAgbG9jYWwgcDIgPSBbICQoYWN0aW9uMikucHJvcGVydGllcyBdIDsKKyAgICAgICAgICAgIHAyID0gWyAkKHAyKS5yYXcgXSA7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLXJlbW92ZWQgPSBbIHNldC5kaWZmZXJlbmNlICQocDEpIDogJChwMikgXSA7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLXJlbW92ZWQgPz0gIm5vbmUiIDsKKyAgICAgICAgICAgIHByb3BlcnRpZXMtYWRkZWQgPSBbIHNldC5kaWZmZXJlbmNlICQocDIpIDogJChwMSkgXSA7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLWFkZGVkID89ICJub25lIiA7CisgICAgICAgIH0KKyAgICAgICAgaW1wb3J0IGVycm9ycyA6IGVycm9yIDogZXJyb3JzLmVycm9yIDsKKyAgICAgICAgZXJyb3JzLmVycm9yICJEdXBsaWNhdGUgbmFtZSBvZiBhY3R1YWwgdGFyZ2V0OiIgJChhY3R1YWwtbmFtZSkKKyAgICAgICAgICAgIDogInByZXZpb3VzIHZpcnR1YWwgdGFyZ2V0IiBbICQoLmFjdHVhbC4kKGFjdHVhbC1uYW1lKSkuc3RyIF0KKyAgICAgICAgICAgIDogImNyZWF0ZWQgZnJvbSIgICAgICAgICAgICAkKGNtdDEtbmFtZSkKKyAgICAgICAgICAgIDogImFub3RoZXIgdmlydHVhbCB0YXJnZXQiICBbICQodmlydHVhbC10YXJnZXQpLnN0ciBdCisgICAgICAgICAgICA6ICJjcmVhdGVkIGZyb20iICAgICAgICAgICAgJChjbXQyLW5hbWUpCisgICAgICAgICAgICA6ICJhZGRlZCBwcm9wZXJ0aWVzOiIgICAgICAgJChwcm9wZXJ0aWVzLWFkZGVkKQorICAgICAgICAgICAgOiAicmVtb3ZlZCBwcm9wZXJ0aWVzOiIgICAgICQocHJvcGVydGllcy1yZW1vdmVkKQorICAgICAgICAgICAgOiAkKGV4dHJhLWVycm9yLWluZm9ybWF0aW9uKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC5hY3R1YWwuJChhY3R1YWwtbmFtZSkgPSAkKHZpcnR1YWwtdGFyZ2V0KSA7CisgICAgfQorfQorCisKKyMgVHJhdmVyc2VzIHRoZSBkZXBlbmRlbmN5IGdyYXBoIG9mICd0YXJnZXQnIGFuZCByZXR1cm4gYWxsIHRhcmdldHMgdGhhdCB3aWxsIGJlCisjIGNyZWF0ZWQgYmVmb3JlIHRoaXMgb25lIGlzIGNyZWF0ZWQuIElmIHRoZSByb290IG9mIHNvbWUgZGVwZW5kZW5jeSBncmFwaCBpcworIyBmb3VuZCBkdXJpbmcgdHJhdmVyc2FsLCBpdCBpcyBlaXRoZXIgaW5jbHVkZWQgb3Igbm90LCBkZXBlbmRpbmcgb24gdGhlCisjICdpbmNsdWRlLXJvb3RzJyB2YWx1ZS4gSW4gZWl0aGVyIGNhc2UgdHJhdmVyc2FsIHN0b3BzIGF0IHJvb3QgdGFyZ2V0cywgaS5lLgorIyByb290IHRhcmdldCBzb3VyY2VzIGFyZSBub3QgdHJhdmVyc2VkLgorIworcnVsZSB0cmF2ZXJzZSAoIHRhcmdldCA6IGluY2x1ZGUtcm9vdHMgPyA6IGluY2x1ZGUtc291cmNlcyA/ICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGlmIFsgJCh0YXJnZXQpLmFjdGlvbiBdCisgICAgeworICAgICAgICBsb2NhbCBhY3Rpb24gPSBbICQodGFyZ2V0KS5hY3Rpb24gXSA7CisgICAgICAgICMgVGhpcyBpbmNsdWRlcyB0aGUgJ3RhcmdldCcgYXMgd2VsbC4KKyAgICAgICAgcmVzdWx0ICs9IFsgJChhY3Rpb24pLnRhcmdldHMgXSA7CisKKyAgICAgICAgZm9yIGxvY2FsIHQgaW4gWyAkKGFjdGlvbikuc291cmNlcyBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICEgWyAkKHQpLnJvb3QgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbIHRyYXZlcnNlICQodCkgOiAkKGluY2x1ZGUtcm9vdHMpIDoKKyAgICAgICAgICAgICAgICAgICAgJChpbmNsdWRlLXNvdXJjZXMpIF0gOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAkKGluY2x1ZGUtcm9vdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQodCkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgJChpbmNsdWRlLXNvdXJjZXMpCisgICAgeworICAgICAgICByZXN1bHQgPSAkKHRhcmdldCkgOworICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIFRha2VzIGFuICdhY3Rpb24nIGluc3RhbmNlIGFuZCBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGl0IGFuZCBhbGwgdGFyZ2V0cworIyBwcm9kdWNlZCBieSB0aGUgYWN0aW9uLiBUaGUgcnVsZS1uYW1lIGFuZCBwcm9wZXJ0aWVzIGFyZSBzZXQgdG8KKyMgJ25ldy1ydWxlLW5hbWUnIGFuZCAnbmV3LXByb3BlcnRpZXMnLCBpZiB0aG9zZSBhcmUgc3BlY2lmaWVkLiBSZXR1cm5zIHRoZQorIyBjbG9uZWQgYWN0aW9uLgorIworcnVsZSBjbG9uZS1hY3Rpb24gKCBhY3Rpb24gOiBuZXctcHJvamVjdCA6IG5ldy1hY3Rpb24tbmFtZSA/IDogbmV3LXByb3BlcnRpZXMgPworICAgICkKK3sKKyAgICBpZiAhICQobmV3LWFjdGlvbi1uYW1lKQorICAgIHsKKyAgICAgICAgbmV3LWFjdGlvbi1uYW1lID0gWyAkKGFjdGlvbikuYWN0aW9uLW5hbWUgXSA7CisgICAgfQorICAgIGlmICEgJChuZXctcHJvcGVydGllcykKKyAgICB7CisgICAgICAgIG5ldy1wcm9wZXJ0aWVzID0gWyAkKGFjdGlvbikucHJvcGVydGllcyBdIDsKKyAgICB9CisKKyAgICBsb2NhbCBhY3Rpb24tY2xhc3MgPSBbIG1vZHVsZXMucGVlayAkKGFjdGlvbikgOiBfX2NsYXNzX18gXSA7CisgICAgbG9jYWwgY2xvbmVkLWFjdGlvbiA9IFsgY2xhc3MubmV3ICQoYWN0aW9uLWNsYXNzKQorICAgICAgICBbICQoYWN0aW9uKS5zb3VyY2VzIF0gOiAkKG5ldy1hY3Rpb24tbmFtZSkgOiAkKG5ldy1wcm9wZXJ0aWVzKSBdIDsKKworICAgIGxvY2FsIGNsb25lZC10YXJnZXRzIDsKKyAgICBmb3IgbG9jYWwgdGFyZ2V0IGluIFsgJChhY3Rpb24pLnRhcmdldHMgXQorICAgIHsKKyAgICAgICAgbG9jYWwgbiA9IFsgJCh0YXJnZXQpLm5hbWUgXSA7CisgICAgICAgICMgRG8gbm90IG1vZGlmeSBwcm9kdWNlZCB0YXJnZXQgbmFtZXMuCisgICAgICAgIGxvY2FsIGNsb25lZC10YXJnZXQgPSBbIGNsYXNzLm5ldyBmaWxlLXRhcmdldCAkKG4pIGV4YWN0IDoKKyAgICAgICAgICAgIFsgJCh0YXJnZXQpLnR5cGUgXSA6ICQobmV3LXByb2plY3QpIDogJChjbG9uZWQtYWN0aW9uKSBdIDsKKyAgICAgICAgbG9jYWwgZCA9IFsgJCh0YXJnZXQpLmRlcGVuZGVuY2llcyBdIDsKKyAgICAgICAgaWYgJChkKQorICAgICAgICB7CisgICAgICAgICAgICAkKGNsb25lZC10YXJnZXQpLmRlcGVuZHMgJChkKSA7CisgICAgICAgIH0KKyAgICAgICAgJChjbG9uZWQtdGFyZ2V0KS5yb290IFsgJCh0YXJnZXQpLnJvb3QgXSA7CisgICAgICAgICQoY2xvbmVkLXRhcmdldCkuY3JlYXRpbmctc3VidmFyaWFudCBbICQodGFyZ2V0KS5jcmVhdGluZy1zdWJ2YXJpYW50IF0gOworCisgICAgICAgIGNsb25lZC10YXJnZXRzICs9ICQoY2xvbmVkLXRhcmdldCkgOworICAgIH0KKworICAgIHJldHVybiAkKGNsb25lZC1hY3Rpb24pIDsKK30KKworCitjbGFzcyBzdWJ2YXJpYW50Cit7CisgICAgaW1wb3J0IHNlcXVlbmNlIDsKKyAgICBpbXBvcnQgdHlwZSA7CisKKyAgICBydWxlIF9faW5pdF9fICggbWFpbi10YXJnZXQgICAgICAgIyBUaGUgaW5zdGFuY2Ugb2YgbWFpbi10YXJnZXQgY2xhc3MuCisgICAgICAgIDogcHJvcGVydHktc2V0ICAgICAgICAgICAgICAgICMgUHJvcGVydGllcyByZXF1ZXN0ZWQgZm9yIHRoaXMgdGFyZ2V0LgorICAgICAgICA6IHNvdXJjZXMgKgorICAgICAgICA6IGJ1aWxkLXByb3BlcnRpZXMgICAgICAgICAgICAjIEFjdHVhbGx5IHVzZWQgcHJvcGVydGllcy4KKyAgICAgICAgOiBzb3VyY2VzLXVzYWdlLXJlcXVpcmVtZW50cyAgIyBQcm9wZXJ0aWVzIHByb3BhZ2F0ZWQgZnJvbSBzb3VyY2VzLgorICAgICAgICA6IGNyZWF0ZWQtdGFyZ2V0cyAqICkgICAgICAgICAjIFRvcC1sZXZlbCBjcmVhdGVkIHRhcmdldHMuCisgICAgeworICAgICAgICBzZWxmLm1haW4tdGFyZ2V0ID0gJChtYWluLXRhcmdldCkgOworICAgICAgICBzZWxmLnByb3BlcnRpZXMgPSAkKHByb3BlcnR5LXNldCkgOworICAgICAgICBzZWxmLnNvdXJjZXMgPSAkKHNvdXJjZXMpIDsKKyAgICAgICAgc2VsZi5idWlsZC1wcm9wZXJ0aWVzID0gJChidWlsZC1wcm9wZXJ0aWVzKSA7CisgICAgICAgIHNlbGYuc291cmNlcy11c2FnZS1yZXF1aXJlbWVudHMgPSAkKHNvdXJjZXMtdXNhZ2UtcmVxdWlyZW1lbnRzKSA7CisgICAgICAgIHNlbGYuY3JlYXRlZC10YXJnZXRzID0gJChjcmVhdGVkLXRhcmdldHMpIDsKKworICAgICAgICAjIFByZS1jb21wb3NlIGEgbGlzdCBvZiBvdGhlciBkZXBlbmRlbmN5IGdyYXBocyB0aGlzIG9uZSBkZXBlbmRzIG9uLgorICAgICAgICBsb2NhbCBkZXBzID0gWyAkKGJ1aWxkLXByb3BlcnRpZXMpLmdldCA8aW1wbGljaXQtZGVwZW5kZW5jeT4gXSA7CisgICAgICAgIGZvciBsb2NhbCBkIGluICQoZGVwcykKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZi5vdGhlci1kZyArPSBbICQoZDpHPSkuY3JlYXRpbmctc3VidmFyaWFudCBdIDsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGYub3RoZXItZGcgPSBbIHNlcXVlbmNlLnVuaXF1ZSAkKHNlbGYub3RoZXItZGcpIF0gOworICAgIH0KKworICAgIHJ1bGUgbWFpbi10YXJnZXQgKCApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLm1haW4tdGFyZ2V0KSA7CisgICAgfQorCisgICAgcnVsZSBjcmVhdGVkLXRhcmdldHMgKCApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLmNyZWF0ZWQtdGFyZ2V0cykgOworICAgIH0KKworICAgIHJ1bGUgcmVxdWVzdGVkLXByb3BlcnRpZXMgKCApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLnByb3BlcnRpZXMpIDsKKyAgICB9CisKKyAgICBydWxlIGJ1aWxkLXByb3BlcnRpZXMgKCApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLmJ1aWxkLXByb3BlcnRpZXMpIDsKKyAgICB9CisKKyAgICBydWxlIHNvdXJjZXMtdXNhZ2UtcmVxdWlyZW1lbnRzICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi5zb3VyY2VzLXVzYWdlLXJlcXVpcmVtZW50cykgOworICAgIH0KKworICAgIHJ1bGUgc2V0LXVzYWdlLXJlcXVpcmVtZW50cyAoIHVzYWdlLXJlcXVpcmVtZW50cyApCisgICAgeworICAgICAgICBzZWxmLnVzYWdlLXJlcXVpcmVtZW50cyA9ICQodXNhZ2UtcmVxdWlyZW1lbnRzKSA7CisgICAgfQorCisgICAgcnVsZSB1c2FnZS1yZXF1aXJlbWVudHMgKCApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLnVzYWdlLXJlcXVpcmVtZW50cykgOworICAgIH0KKworICAgICMgUmV0dXJucyBhbGwgdGFyZ2V0cyByZWZlcmVuY2VkIGJ5IHRoaXMgc3VidmFyaWFudCwgZWl0aGVyIGRpcmVjdGx5IG9yCisgICAgIyBpbmRpcmVjdGx5LCBhbmQgZWl0aGVyIGFzIHNvdXJjZXMsIG9yIGFzIGRlcGVuZGVuY3kgcHJvcGVydGllcy4gVGFyZ2V0cworICAgICMgcmVmZXJyZWQgdG8gdXNpbmcgdGhlIGRlcGVuZGVuY3kgcHJvcGVydHkgYXJlIHJldHVybmVkIGFzIHByb3BlcnRpZXMsIG5vdAorICAgICMgdGFyZ2V0cy4KKyAgICAjCisgICAgcnVsZSBhbGwtcmVmZXJlbmNlZC10YXJnZXRzICggdGhlc2V0ICkKKyAgICB7CisgICAgICAgICMgRmluZCBkaXJlY3RseSByZWZlcmVuY2VkIHRhcmdldHMuCisgICAgICAgIGxvY2FsIGRlcHMgPSBbICQoc2VsZi5idWlsZC1wcm9wZXJ0aWVzKS5kZXBlbmRlbmN5IF0gOworICAgICAgICBsb2NhbCBhbGwtdGFyZ2V0cyA9ICQoc2VsZi5zb3VyY2VzKSAkKGRlcHMpIDsKKworICAgICAgICAjIEZpbmQgb3RoZXIgc3VidmFyaWFudHMuCisgICAgICAgIGxvY2FsIHIgOworICAgICAgICBmb3IgbG9jYWwgdCBpbiAkKGFsbC10YXJnZXRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAhIFsgJCh0aGVzZXQpLmNvbnRhaW5zICQodCkgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICQodGhlc2V0KS5hZGQgJCh0KSA7CisgICAgICAgICAgICAgICAgciArPSBbICQodDpHPSkuY3JlYXRpbmctc3VidmFyaWFudCBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByID0gWyBzZXF1ZW5jZS51bmlxdWUgJChyKSBdIDsKKyAgICAgICAgZm9yIGxvY2FsIHMgaW4gJChyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKHMpICE9ICQoX19uYW1lX18pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJChzKS5hbGwtcmVmZXJlbmNlZC10YXJnZXRzICQodGhlc2V0KSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFJldHVybnMgdGhlIHByb3BlcnRpZXMgc3BlY2lmeWluZyBpbXBsaWNpdCBpbmNsdWRlIHBhdGhzIHRvIGdlbmVyYXRlZAorICAgICMgaGVhZGVycy4gVGhpcyB0cmF2ZXJzZXMgYWxsIHRhcmdldHMgaW4gdGhpcyBzdWJ2YXJpYW50IGFuZCBzdWJ2YXJpYW50cworICAgICMgcmVmZXJyZWQgYnkgPGltcGxpY2l0LWRlcGVuZGVjeT4gcHJvcGVydGllcy4gRm9yIGFsbCB0YXJnZXRzIG9mIHR5cGUKKyAgICAjICd0YXJnZXQtdHlwZScgKG9yIGZvciBhbGwgdGFyZ2V0cywgaWYgJ3RhcmdldC10eXBlJyBpcyBub3Qgc3BlY2lmaWVkKSwgdGhlCisgICAgIyByZXN1bHQgd2lsbCBjb250YWluIDwkKGZlYXR1cmUpPnBhdGgtdG8tdGhhdC10YXJnZXQuCisgICAgIworICAgIHJ1bGUgaW1wbGljaXQtaW5jbHVkZXMgKCBmZWF0dXJlIDogdGFyZ2V0LXR5cGUgPyApCisgICAgeworICAgICAgICBsb2NhbCBrZXkgPSBpaSQoZmVhdHVyZSktJCh0YXJnZXQtdHlwZTpFPSIiKSA7CisgICAgICAgIGlmICEgJCgkKGtleSkpLWlzLW5vdC1lbXB0eQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCB0YXJnZXQtcGF0aHMgPSBbIGFsbC10YXJnZXQtZGlyZWN0b3JpZXMgJCh0YXJnZXQtdHlwZSkgXSA7CisgICAgICAgICAgICB0YXJnZXQtcGF0aHMgPSBbIHNlcXVlbmNlLnVuaXF1ZSAkKHRhcmdldC1wYXRocykgXSA7CisgICAgICAgICAgICBsb2NhbCByZXN1bHQgPSAkKHRhcmdldC1wYXRoczpHPSQoZmVhdHVyZSkpIDsKKyAgICAgICAgICAgIGlmICEgJChyZXN1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIiIgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJChrZXkpID0gJChyZXN1bHQpIDsKKyAgICAgICAgfQorICAgICAgICBpZiAkKCQoa2V5KSkgPSAiIgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICQoJChrZXkpKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBydWxlIGFsbC10YXJnZXQtZGlyZWN0b3JpZXMgKCB0YXJnZXQtdHlwZSA/ICkKKyAgICB7CisgICAgICAgIGlmICEgJChzZWxmLnRhcmdldC1kaXJlY3RvcmllcykKKyAgICAgICAgeworICAgICAgICAgICAgY29tcHV0ZS10YXJnZXQtZGlyZWN0b3JpZXMgJCh0YXJnZXQtdHlwZSkgOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHNlbGYudGFyZ2V0LWRpcmVjdG9yaWVzKSA7CisgICAgfQorCisgICAgcnVsZSBjb21wdXRlLXRhcmdldC1kaXJlY3RvcmllcyAoIHRhcmdldC10eXBlID8gKQorICAgIHsKKyAgICAgICAgbG9jYWwgcmVzdWx0IDsKKyAgICAgICAgZm9yIGxvY2FsIHQgaW4gJChzZWxmLmNyZWF0ZWQtdGFyZ2V0cykKKyAgICAgICAgeworICAgICAgICAgICAgIyBTa2lwIHRhcmdldHMgb2YgdGhlIHdyb25nIHR5cGUuCisgICAgICAgICAgICBpZiAhICQodGFyZ2V0LXR5cGUpIHx8CisgICAgICAgICAgICAgICAgWyB0eXBlLmlzLWRlcml2ZWQgWyAkKHQpLnR5cGUgXSAkKHRhcmdldC10eXBlKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gWyBzZXF1ZW5jZS5tZXJnZSAkKHJlc3VsdCkgOiBbICQodCkucGF0aCBdIF0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciBsb2NhbCBkIGluICQoc2VsZi5vdGhlci1kZykKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9IFsgJChkKS5hbGwtdGFyZ2V0LWRpcmVjdG9yaWVzICQodGFyZ2V0LXR5cGUpIF0gOworICAgICAgICB9CisgICAgICAgIHNlbGYudGFyZ2V0LWRpcmVjdG9yaWVzID0gJChyZXN1bHQpIDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2tlcm5lbC9ib29zdC1idWlsZC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2tlcm5lbC9ib29zdC1idWlsZC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3ZjZlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQva2VybmVsL2Jvb3N0LWJ1aWxkLmphbQpAQCAtMCwwICsxLDUgQEAKKyMgQ29weXJpZ2h0IDIwMDMgRGF2ZSBBYnJhaGFtcyAKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAKKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworYm9vc3QtYnVpbGQgLiA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2tlcm5lbC9ib290c3RyYXAuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9rZXJuZWwvYm9vdHN0cmFwLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDMyMGRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9rZXJuZWwvYm9vdHN0cmFwLmphbQpAQCAtMCwwICsxLDI2NiBAQAorIyBDb3B5cmlnaHQgMjAwMyBEYXZlIEFicmFoYW1zCisjIENvcHlyaWdodCAyMDAzLCAyMDA1LCAyMDA2IFJlbmUgUml2ZXJhCisjIENvcHlyaWdodCAyMDAzLCAyMDA1LCAyMDA2IFZsYWRpbWlyIFBydXMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBGaXJzdCBvZiBhbGwsIGNoZWNrIHRoZSBqYW0gdmVyc2lvbi4KK2lmICQoSkFNX1ZFUlNJT046Sj0iIikgPCAwMzAxMTIKK3sKKyAgICBFQ0hPICJlcnJvcjogQm9vc3QuSmFtIHZlcnNpb24gMy4xLjEyIG9yIGxhdGVyIHJlcXVpcmVkIiA7CisgICAgRVhJVCA7Cit9CisKK2xvY2FsIHJlcXVpcmVkLXJ1bGVzID0gR0xPQi1SRUNVUlNJVkVMWSBIQVNfTkFUSVZFX1JVTEUgOworZm9yIGxvY2FsIHIgaW4gJChyZXF1aXJlZC1ydWxlcykKK3sKKyAgICBpZiAhICQocikgaW4gWyBSVUxFTkFNRVMgXQorICAgIHsKKyAgICAgICAgRUNITyAiZXJyb3I6IGJ1aWx0aW4gcnVsZSAnJChyKScgaXMgbm90IHByZXNlbnQiIDsKKyAgICAgICAgRUNITyAiZXJyb3I6IHlvdXIgdmVyc2lvbiBvZiBiamFtIGlzIGxpa2VseSBvdXQgb2YgZGF0ZSIgOworICAgICAgICBFQ0hPICJlcnJvcjogcGxlYXNlIGdldCBhIGZyZXNoIHZlcnNpb24gZnJvbSBTVk4uIiA7CisgICAgICAgIEVYSVQgOworICAgIH0KK30KKworbG9jYWwgbmF0aXZlID0gcmVnZXggdHJhbnNmb3JtIDIgOword2hpbGUgJChuYXRpdmUpCit7CisgICAgaWYgISBbIEhBU19OQVRJVkVfUlVMRSAkKG5hdGl2ZVsxXSkgOiAkKG5hdGl2ZVsyXSkgOiAkKG5hdGl2ZVszXSkgXQorICAgIHsKKyAgICAgICAgRUNITyAiZXJyb3I6IG1pc3NpbmcgbmF0aXZlIHJ1bGUgJyQobmF0aXZlWzFdKS4kKG5hdGl2ZVsyXSknIiA7CisgICAgICAgIEVDSE8gImVycm9yOiBvciBpbnRlcmZhY2UgdmVyc2lvbiBvZiB0aGF0IHJ1bGUgaXMgdG9vIGxvdyIgOworICAgICAgICBFQ0hPICJlcnJvcjogeW91ciB2ZXJzaW9uIG9mIGJqYW0gaXMgbGlrZWx5IG91dCBvZiBkYXRlIiA7CisgICAgICAgIEVDSE8gImVycm9yOiBwbGVhc2UgZ2V0IGEgZnJlc2ggdmVyc2lvbiBmcm9tIFNWTi4iIDsKKyAgICAgICAgRVhJVCA7CisgICAgfQorICAgIG5hdGl2ZSA9ICQobmF0aXZlWzQtXSkgOworfQorCisKKyMgQ2hlY2sgdGhhdCB0aGUgYnVpbHRpbiAuRU5WSVJPTiBtb2R1bGUgaXMgcHJlc2VudC4gV2UgZG8gbm90IGhhdmUgYSBidWlsdGluIHRvCisjIGNoZWNrIHRoYXQgYSBtb2R1bGUgaXMgcHJlc2VudCwgc28gd2UgYXNzdW1lIHRoYXQgdGhlIFBBVEggZW52aXJvbm1lbnQKKyMgdmFyaWFibGUgaXMgYWx3YXlzIHNldCBhbmQgdmVyaWZ5IHRoYXQgdGhlIC5FTlZJUk9OIG1vZHVsZSBoYXMgYSBub24tZW1wdHkKKyMgdmFsdWUgb2YgdGhhdCB2YXJpYWJsZS4KK21vZHVsZSAuRU5WSVJPTgoreworICAgIGxvY2FsIHAgPSAkKFBBVEgpICQoUGF0aCkgJChwYXRoKSA7CisgICAgaWYgISAkKHApCisgICAgeworICAgICAgICBFQ0hPICJlcnJvcjogbm8gYnVpbHRpbiBtb2R1bGUgLkVOVklST04gaXMgZm91bmQiIDsKKyAgICAgICAgRUNITyAiZXJyb3I6IHlvdXIgdmVyc2lvbiBvZiBiamFtIGlzIGxpa2VseSBvdXQgb2YgZGF0ZSIgOworICAgICAgICBFQ0hPICJlcnJvcjogcGxlYXNlIGdldCBhIGZyZXNoIHZlcnNpb24gZnJvbSBTVk4uIiA7CisgICAgICAgIEVYSVQgOworICAgIH0KK30KKworIyBDaGVjayB0aGF0IEAoKSBmdW5jdGlvbmFsaXR5IGlzIHByZXNlbnQuIFNpbWlsYXJseSB0byBtb2R1bGVzLCB3ZSBkbyBub3QgaGF2ZQorIyBhIHdheSB0byB0ZXN0IHRoaXMgZGlyZWN0bHkuIEluc3RlYWQgd2UgY2hlY2sgdGhhdCAkKFRNUE5BTUUpIGZ1bmN0aW9uYWxpdHkgaXMKKyMgcHJlc2VudCB3aGljaCB3YXMgYWRkZWQgYXQgcm91Z2hseSB0aGUgc2FtZSB0aW1lIChtb3JlIHByZWNpc2VseSwgaXQgd2FzIGFkZGVkCisjIGp1c3QgYmVmb3JlKS4KK3sKKyAgICBpZiAhICQoVE1QTkFNRSkKKyAgICB7CisgICAgICAgIEVDSE8gImVycm9yOiBubyBAKCkgZnVuY3Rpb25hbGl0eSBmb3VuZCIgOworICAgICAgICBFQ0hPICJlcnJvcjogeW91ciB2ZXJzaW9uIG9mIGIyIGlzIGxpa2VseSBvdXQgb2YgZGF0ZSIgOworICAgICAgICBFQ0hPICJlcnJvcjogcGxlYXNlIGdldCBhIGZyZXNoIHZlcnNpb24gZnJvbSBTVk4uIiA7CisgICAgICAgIEVYSVQgOworICAgIH0KK30KKworIyBNYWtlIHN1cmUgdGhhdCBcbiBlc2NhcGUgaXMgYXZhaWFibGUuCitpZiAiXG4iID0gIm4iCit7CisgICAgaWYgJChPUykgPSBDWUdXSU4KKyAgICB7CisgICAgICAgIEVDSE8gIndhcm5pbmc6IGVzY2FwZSBzZXF1ZW5jZXMgYXJlIG5vdCBzdXBwb3J0ZWQiIDsKKyAgICAgICAgRUNITyAid2FybmluZzogdGhpcyB3aWxsIGNhdXNlIG1ham9yIG1pc2JlaGF2aW91ciBvbiBjeWd3aW4iIDsKKyAgICAgICAgRUNITyAid2FybmluZzogeW91ciB2ZXJzaW9uIG9mIGIyIGlzIGxpa2VseSBvdXQgb2YgZGF0ZSIgOworICAgICAgICBFQ0hPICJ3YXJuaW5nOiBwbGVhc2UgZ2V0IGEgZnJlc2ggdmVyc2lvbiBmcm9tIFNWTi4iIDsKKyAgICB9Cit9CisKKworIyBCb290c3RyYXAgdGhlIG1vZHVsZSBzeXN0ZW0uIFRoZW4gYnJpbmcgdGhlIGltcG9ydCBydWxlIGludG8gdGhlIGdsb2JhbCBtb2R1bGUuCisjCitTRUFSQ0ggb24gPG1vZHVsZUA+bW9kdWxlcy5qYW0gPSAkKC5ib290c3RyYXAtZmlsZTpEKSA7Cittb2R1bGUgbW9kdWxlcyB7IGluY2x1ZGUgPG1vZHVsZUA+bW9kdWxlcy5qYW0gOyB9CitJTVBPUlQgbW9kdWxlcyA6IGltcG9ydCA6IDogaW1wb3J0IDsKKworeworICAgICMgQWRkIG1vZHVsZSBzdWJkaXJlY3RvcmllcyB0byB0aGUgQk9PU1RfQlVJTERfUEFUSCwgd2hpY2ggYWxsb3dzIHVzIHRvIG1ha2UKKyAgICAjIGluY3JlbWVudGFsIHJlZmFjdG9yaW5nIHN0ZXBzIGJ5IG1vdmluZyBtb2R1bGVzIHRvIGFwcHJvcHJpYXRlCisgICAgIyBzdWJkaXJlY3RvcmllcywgdGhlcmVieSBhY2hpZXZpbmcgc29tZSBwaHlzaWNhbCBzZXBhcmF0aW9uIG9mIGRpZmZlcmVudAorICAgICMgbGF5ZXJzIHdpdGhvdXQgY2hhbmdpbmcgYWxsIG9mIG91ciBjb2RlIHRvIHNwZWNpZnkgc3ViZGlyZWN0b3JpZXMgaW4KKyAgICAjIGltcG9ydCBzdGF0ZW1lbnRzIG9yIHVzZSBhbiBleHRyYSBsZXZlbCBvZiBxdWFsaWZpY2F0aW9uIG9uIGltcG9ydGVkCisgICAgIyBuYW1lcy4KKworICAgIGxvY2FsIHN1YmRpcnMgPQorICAgICAgICBrZXJuZWwgICAgICAgICMgb25seSB0aGUgbW9zdC1pbnRyaW5zaWMgbW9kdWxlczogbW9kdWxlcywgZXJyb3JzCisgICAgICAgIHV0aWwgICAgICAgICAgIyBsb3ctbGV2ZWwgc3Vic3RyYXRlOiBzdHJpbmcvbnVtYmVyIGhhbmRsaW5nLCBldGMuCisgICAgICAgIGJ1aWxkICAgICAgICAgIyBlc3NlbnRpYWwgZWxlbWVudHMgb2YgdGhlIGJ1aWxkIHN5c3RlbSBhcmNoaXRlY3R1cmUKKyAgICAgICAgdG9vbHMgICAgICAgICAjIHRvb2xzZXRzIGZvciBoYW5kbGluZyBzcGVjaWZpYyBidWlsZCBqb2JzIGFuZCB0YXJnZXRzLgorICAgICAgICBjb250cmliICAgICAgICMgdXNlciBjb250cmlidXRlZCAodW5yZXZpZXdlZCkgbW9kdWxlcworICAgICAgICAuICAgICAgICAgICAgICMgYnVpbGQtc3lzdGVtLmphbSBsaXZlcyBoZXJlCisgICAgICAgIDsKKyAgICBsb2NhbCB3aGVyZWFtaSA9IFsgTk9STUFMSVpFX1BBVEggJCguYm9vdHN0cmFwLWZpbGU6RFQpIF0gOworICAgIEJPT1NUX0JVSUxEX1BBVEggKz0gJCh3aGVyZWFtaTpEKS8kKHN1YmRpcnMpIDsKKworICAgIG1vZHVsZXMucG9rZSAuRU5WSVJPTiA6IEJPT1NUX0JVSUxEX1BBVEggOiAkKEJPT1NUX0JVSUxEX1BBVEgpIDsKKworICAgIG1vZHVsZXMucG9rZSA6IEVYVFJBX1BZVEhPTlBBVEggOiAkKHdoZXJlYW1pKSA7Cit9CisKKyMgUmVsb2FkIHRoZSBtb2R1bGVzLCB0byBjbGVhbiB1cCB0aGluZ3MuIFRoZSBtb2R1bGVzIG1vZHVsZSBjYW4gdG9sZXJhdGUgYmVpbmcKKyMgaW1wb3J0ZWQgdHdpY2UuCisjCitpbXBvcnQgbW9kdWxlcyA7CisKKyMgUHJvY2VzcyBvcHRpb24gcGx1Z2lucyBmaXJzdCB0byBhbGxvdyB0aGVtIHRvIHByZXZlbnQgbG9hZGluZyB0aGUgcmVzdCBvZiB0aGUKKyMgYnVpbGQgc3lzdGVtLgorIworaW1wb3J0IG9wdGlvbiA7Citsb2NhbCBkb250LWJ1aWxkID0gWyBvcHRpb24ucHJvY2VzcyBdIDsKKworIyBTaG91bGQgd2Ugc2tpcCBidWlsZGluZywgaS5lLiBsb2FkaW5nIHRoZSBidWlsZCBzeXN0ZW0sIGFjY29yZGluZyB0byB0aGUKKyMgb3B0aW9ucyBwcm9jZXNzZWQ/CisjCitpZiAhICQoZG9udC1idWlsZCkKK3sKKyAgICBpZiAhIC0tcHl0aG9uIGluICQoQVJHVikKKyAgICB7CisgICAgICAgICMgQWxsb3cgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlIGJ1aWxkIHN5c3RlbSBmaWxlIGZyb20gdGhlIGNvbW1hbmQtbGluZQorICAgICAgICAjIChtb3N0bHkgZm9yIHRlc3RpbmcpLgorICAgICAgICBsb2NhbCBidWlsZC1zeXN0ZW0gPSBbIE1BVENIIC0tYnVpbGQtc3lzdGVtPSguKikgOiAkKEFSR1YpIF0gOworICAgICAgICBidWlsZC1zeXN0ZW0gPz0gYnVpbGQtc3lzdGVtIDsKKworICAgICAgICAjIFVzZSBsYXN0IGVsZW1lbnQgaW4gY2FzZSBvZiBtdWx0aXBsZSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKyAgICAgICAgaW1wb3J0ICQoYnVpbGQtc3lzdGVtWy0xXSkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBFQ0hPICJCb29zdC5CdWlsZCBWMiBQeXRob24gcG9ydCAoZXhwZXJpbWVudGFsKSIgOworCisgICAgICAgICMgRGVmaW5lIGFkZGl0aW9uYWwgaW50ZXJmYWNlIGV4cG9zZWQgdG8gUHl0aG9uIGNvZGUuIFB5dGhvbiBjb2RlIHdpbGwKKyAgICAgICAgIyBhbHNvIGhhdmUgYWNjZXNzIHRvIHNlbGVjdCBiamFtIGJ1aWx0aW5zIGluIHRoZSAnYmphbScgbW9kdWxlLCBidXQKKyAgICAgICAgIyBzb21lIHRoaW5ncyBhcmUgZWFzaWVyIHRvIGRlZmluZSBvdXRzaWRlIEMuCisgICAgICAgIG1vZHVsZSBweXRob25faW50ZXJmYWNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGUgbG9hZCAoIG1vZHVsZS1uYW1lIDogbG9jYXRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVTRVJfTU9EVUxFICQobW9kdWxlLW5hbWUpIDsKKyAgICAgICAgICAgICAgICAjIE1ha2UgYWxsIHJ1bGVzIGluIHRoZSBsb2FkZWQgbW9kdWxlIGF2YWlsYWJsZSBpbiB0aGUgZ2xvYmFsCisgICAgICAgICAgICAgICAgIyBuYW1lc3BhY2UsIHNvIHRoYXQgd2UgZG8gbm90IGhhdmUgdG8gYm90aGVyIHNwZWNpZnlpbmcgdGhlCisgICAgICAgICAgICAgICAgIyAiY29ycmVjdCIgbW9kdWxlIHdoZW4gY2FsbGluZyBmcm9tIFB5dGhvbi4KKyAgICAgICAgICAgICAgICBtb2R1bGUgJChtb2R1bGUtbmFtZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fbmFtZV9fID0gJCgxKSA7CisgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgJCgyKSA7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsIHJ1bGVzID0gWyBSVUxFTkFNRVMgJCgxKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUICQoMSkgOiAkKHJ1bGVzKSA6ICQoMSkgOiAkKDEpLiQocnVsZXMpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJ1bGUgcGVlayAoIG1vZHVsZS1uYW1lID8gOiB2YXJpYWJsZXMgKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbW9kdWxlICQoPCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKCQoPikpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJ1bGUgc2V0LXZhcmlhYmxlICggbW9kdWxlLW5hbWUgOiBuYW1lIDogdmFsdWUgKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbW9kdWxlICQoPCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICQoPikgPSAkKDMpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJ1bGUgc2V0LXRvcC1sZXZlbC10YXJnZXRzICggdGFyZ2V0cyAqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERVBFTkRTIGFsbCA6ICQodGFyZ2V0cykgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBydWxlIGNhbGwtaW4tbW9kdWxlICggbSA6IHJ1bGVuYW1lIDogKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbW9kdWxlICQobSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBbICQoMikgJCgzKSA6ICQoNCkgOiAkKDUpIDogJCg2KSA6ICQoNykgOiAkKDgpIDogJCg5KQorICAgICAgICAgICAgICAgICAgICAgICAgOiAkKDEwKSA6ICQoMTEpIDogJCgxMikgOiAkKDEzKSA6ICQoMTQpIDogJCgxNSkgOiAkKDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgOiAkKDE3KSA6ICQoMTgpIDogJCgxOSkgXSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHJ1bGUgc2V0LXVwZGF0ZS1hY3Rpb24gKCBhY3Rpb24gOiB0YXJnZXRzICogOiBzb3VyY2VzICogOgorICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJChhY3Rpb24pICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJ1bGUgc2V0LXVwZGF0ZS1hY3Rpb24taW4tbW9kdWxlICggbSA6IGFjdGlvbiA6IHRhcmdldHMgKiA6CisgICAgICAgICAgICAgICAgc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtb2R1bGUgJChtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJCgyKSAkKDMpIDogJCg0KSA6ICQoNSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcnVsZSBzZXQtdGFyZ2V0LXZhcmlhYmxlICggdGFyZ2V0cyArIDogdmFyaWFibGUgOiB2YWx1ZSAqIDogYXBwZW5kID8KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgJChhcHBlbmQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAkKHZhcmlhYmxlKSBvbiAkKHRhcmdldHMpICs9ICQodmFsdWUpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJCh2YXJpYWJsZSkgb24gJCh0YXJnZXRzKSA9ICQodmFsdWUpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJ1bGUgZ2V0LXRhcmdldC12YXJpYWJsZSAoIHRhcmdldHMgKyA6IHZhcmlhYmxlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWyBvbiAkKHRhcmdldHMpIHJldHVybiAkKCQodmFyaWFibGUpKSBdIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcnVsZSBpbXBvcnQtcnVsZXMtZnJvbS1wYXJlbnQgKCBwYXJlbnQtbW9kdWxlIDogdGhpcy1tb2R1bGUgOgorICAgICAgICAgICAgICAgIHVzZXItcnVsZXMgKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSU1QT1JUICQocGFyZW50LW1vZHVsZSkgOiAkKHVzZXItcnVsZXMpIDogJCh0aGlzLW1vZHVsZSkgOgorICAgICAgICAgICAgICAgICAgICAkKHVzZXItcnVsZXMpIDsKKyAgICAgICAgICAgICAgICBFWFBPUlQgJCh0aGlzLW1vZHVsZSkgOiAkKHVzZXItcnVsZXMpIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcnVsZSBtYXJrLWluY2x1ZGVkICggdGFyZ2V0cyAqIDogaW5jbHVkZXMgKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTk9DQVJFICQoaW5jbHVkZXMpIDsKKyAgICAgICAgICAgICAgICBJTkNMVURFUyAkKHRhcmdldHMpIDogJChpbmNsdWRlcykgOworICAgICAgICAgICAgICAgIElTRklMRSAkKGluY2x1ZGVzKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBQWVRIT05fSU1QT1JUX1JVTEUgYm9vdHN0cmFwIDogYm9vdHN0cmFwIDogUHlCQiA6IGJvb3RzdHJhcCA7CisgICAgICAgIG1vZHVsZXMucG9rZSBQeUJCIDogcm9vdCA6IFsgTk9STUFMSVpFX1BBVEggJCguYm9vdHN0cmFwLWZpbGU6RFQpLy4uIF0gOworCisgICAgICAgIG1vZHVsZSBQeUJCCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIG9rID0gWyBib290c3RyYXAgJChyb290KSBdIDsKKyAgICAgICAgICAgIGlmICEgJChvaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFWElUIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgI1BZVEhPTl9JTVBPUlRfUlVMRSBib29zdC5idWlsZC5idWlsZF9zeXN0ZW0gOiBtYWluIDogUHlCQiA6IG1haW4gOworCisgICAgICAgICNtb2R1bGUgUHlCQgorICAgICAgICAjeworICAgICAgICAjICAgIG1haW4gOworICAgICAgICAjfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQva2VybmVsL2NsYXNzLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQva2VybmVsL2NsYXNzLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDhhYjZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9rZXJuZWwvY2xhc3MuamFtCkBAIC0wLDAgKzEsNDIwIEBACisjIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAzIERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDUgUmVuZSBSaXZlcmEKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIFBvbHltb3JwaGljIGNsYXNzIHN5c3RlbSBidWlsdCBvbiB0b3Agb2YgY29yZSBKYW0gZmFjaWxpdGllcy4KKyMKKyMgQ2xhc3NlcyBhcmUgZGVmaW5lZCBieSAnY2xhc3MnIGtleXdvcmRzOgorIworIyAgICAgY2xhc3MgbXljbGFzcworIyAgICAgeworIyAgICAgICAgIHJ1bGUgX19pbml0X18gKCBhcmcxICkgICAgICMgY29uc3RydWN0b3IKKyMgICAgICAgICB7CisjICAgICAgICAgICAgIHNlbGYuYXR0cmlidXRlID0gJChhcmcxKSA7CisjICAgICAgICAgfQorIworIyAgICAgICAgIHJ1bGUgbWV0aG9kMSAoICkgICAgICAgICAgICMgbWV0aG9kCisjICAgICAgICAgeworIyAgICAgICAgICAgICByZXR1cm4gWyBtZXRob2QyIF0gOworIyAgICAgICAgIH0KKyMKKyMgICAgICAgICBydWxlIG1ldGhvZDIgKCApICAgICAgICAgICAjIG1ldGhvZAorIyAgICAgICAgIHsKKyMgICAgICAgICAgICAgcmV0dXJuICQoc2VsZi5hdHRyaWJ1dGUpIDsKKyMgICAgICAgICB9CisjICAgICB9CisjCisjIFRoZSBfX2luaXRfXyBydWxlIGlzIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHNldHMgbWVtYmVyIHZhcmlhYmxlcy4KKyMKKyMgTmV3IGluc3RhbmNlcyBhcmUgY3JlYXRlZCBieSBpbnZva2luZyBbIG5ldyA8Y2xhc3M+IDxhcmdzLi4uPiBdOgorIworIyAgICAgbG9jYWwgeCA9IFsgbmV3IG15Y2xhc3MgZm9vIF0gOyAgICAgICAgIyB4IGlzIGEgbmV3IG15Y2xhc3Mgb2JqZWN0CisjICAgICBhc3NlcnQucmVzdWx0IGZvbyA6IFsgJCh4KS5tZXRob2QxIF0gOyAjICQoeCkubWV0aG9kMSByZXR1cm5zICJmb28iCisjCisjIERlcml2ZWQgY2xhc3MgYXJlIGNyZWF0ZWQgYnkgbWVudGlvbmluZyBiYXNlIGNsYXNzZXMgaW4gdGhlIGRlY2xhcmF0aW9uOjoKKyMKKyMgICAgIGNsYXNzIGRlcml2ZWQgOiBteWNsYXNzCisjICAgICB7CisjICAgICAgICAgIHJ1bGUgX19pbml0X18gKCBhcmcgKQorIyAgICAgICAgICB7CisjICAgICAgICAgICAgICBteWNsYXNzLl9faW5pdF9fICQoYXJnKSA7ICAjIGNhbGwgYmFzZSBfX2luaXRfXworIworIyAgICAgICAgICB9CisjCisjICAgICAgICAgIHJ1bGUgbWV0aG9kMiAoICkgICAgICAgICAgICMgbWV0aG9kIG92ZXJyaWRlCisjICAgICAgICAgIHsKKyMgICAgICAgICAgICAgIHJldHVybiAkKHNlbGYuYXR0cmlidXRlKVhYWCA7CisjICAgICAgICAgIH0KKyMgICAgIH0KKyMKKyMgQWxsIG1ldGhvZHMgb3BlcmF0ZSB2aXJ0dWFsbHksIHJlcGxhY2luZyBiZWhhdmlvciBpbiB0aGUgYmFzZSBjbGFzc2VzLiBGb3IKKyMgZXhhbXBsZTo6CisjCisjICAgICBsb2NhbCB5ID0gWyBuZXcgZGVyaXZlZCBmb28gXSA7ICAgICAgICAgICAgIyB5IGlzIGEgbmV3IGRlcml2ZWQgb2JqZWN0CisjICAgICBhc3NlcnQucmVzdWx0IGZvb1hYWCA6IFsgJCh5KS5tZXRob2QxIF0gOyAgIyAkKHkpLm1ldGhvZDEgcmV0dXJucyAiZm9vIgorIworIyBFYWNoIGNsYXNzIGluc3RhbmNlIGlzIGl0cyBvd24gY29yZSBKYW0gbW9kdWxlLiBBbGwgaW5zdGFuY2UgYXR0cmlidXRlcyBhbmQKKyMgbWV0aG9kcyBhcmUgYWNjZXNzaWJsZSB3aXRob3V0IGFkZGl0aW9uYWwgcXVhbGlmaWNhdGlvbiBmcm9tIHdpdGhpbiB0aGUgY2xhc3MKKyMgaW5zdGFuY2UuIEFsbCBydWxlcyBpbXBvcnRlZCBpbiBjbGFzcyBkZWNsYXJhdGlvbiwgb3IgdmlzaWJsZSBpbiBiYXNlIGNsYXNzc2VzCisjIGFyZSBhbHNvIHZpc2libGUuIEJhc2UgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIGluIHF1YWxpZmllZCBmb3JtOgorIyBiYXNlLW5hbWUubWV0aG9kLW5hbWUuIEJ5IGNvbnZlbnRpb24sIGF0dHJpYnV0ZSBuYW1lcyBhcmUgcHJlZml4ZWQgd2l0aAorIyAic2VsZi4iLgorCitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgbnVtYmVycyA7CisKKworcnVsZSB4aW5pdCAoIGluc3RhbmNlIDogY2xhc3MgKQoreworICAgIG1vZHVsZSAkKGluc3RhbmNlKQorICAgIHsKKyAgICAgICAgX19jbGFzc19fID0gJCgyKSA7CisgICAgICAgIF9fbmFtZV9fID0gJCgxKSA7CisgICAgfQorfQorCisKK3J1bGUgbmV3ICggY2xhc3MgYXJncyAqIDogKiApCit7CisgICAgLm5leHQtaW5zdGFuY2UgPz0gMSA7CisgICAgbG9jYWwgaWQgPSBvYmplY3QoJChjbGFzcykpQCQoLm5leHQtaW5zdGFuY2UpIDsKKworICAgIElOU1RBTkNFICQoaWQpIDogY2xhc3NAJChjbGFzcykgOworICAgIHhpbml0ICQoaWQpIDogJChjbGFzcykgOworICAgIElNUE9SVF9NT0RVTEUgJChpZCkgOworICAgICQoaWQpLl9faW5pdF9fICQoYXJncykgOiAkKDIpIDogJCgzKSA6ICQoNCkgOiAkKDUpIDogJCg2KSA6ICQoNykgOiAkKDgpIDoKKyAgICAgICAgJCg5KSA6ICQoMTApIDogJCgxMSkgOiAkKDEyKSA6ICQoMTMpIDogJCgxNCkgOiAkKDE1KSA6ICQoMTYpIDogJCgxNykgOgorICAgICAgICAkKDE4KSA6ICQoMTkpIDsKKworICAgICMgQnVtcCB0aGUgbmV4dCB1bmlxdWUgb2JqZWN0IG5hbWUuCisgICAgLm5leHQtaW5zdGFuY2UgPSBbIG51bWJlcnMuaW5jcmVtZW50ICQoLm5leHQtaW5zdGFuY2UpIF0gOworCisgICAgIyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5ldyBpbnN0YW5jZS4KKyAgICByZXR1cm4gJChpZCkgOworfQorCisKK3J1bGUgYmFzZXMgKCBjbGFzcyApCit7CisgICAgbW9kdWxlIGNsYXNzQCQoY2xhc3MpCisgICAgeworICAgICAgICByZXR1cm4gJChfX2Jhc2VzX18pIDsKKyAgICB9Cit9CisKKworcnVsZSBpcy1kZXJpdmVkICggY2xhc3MgOiBiYXNlcyArICkKK3sKKyAgICBsb2NhbCBzdGFjayA9ICQoY2xhc3MpIDsKKyAgICBsb2NhbCB2aXNpdGVkIGZvdW5kIDsKKyAgICB3aGlsZSAhICQoZm91bmQpICYmICQoc3RhY2spCisgICAgeworICAgICAgICBsb2NhbCB0b3AgPSAkKHN0YWNrWzFdKSA7CisgICAgICAgIHN0YWNrID0gJChzdGFja1syLV0pIDsKKyAgICAgICAgaWYgISAoICQodG9wKSBpbiAkKHZpc2l0ZWQpICkKKyAgICAgICAgeworICAgICAgICAgICAgdmlzaXRlZCArPSAkKHRvcCkgOworICAgICAgICAgICAgc3RhY2sgKz0gWyBiYXNlcyAkKHRvcCkgXSA7CisKKyAgICAgICAgICAgIGlmICQoYmFzZXMpIGluICQodmlzaXRlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWUgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKGZvdW5kKSA7Cit9CisKKworIyBSZXR1cm5zIHRydWUgaWYgdGhlICd2YWx1ZScgaXMgYSBjbGFzcyBpbnN0YW5jZS4KKyMKK3J1bGUgaXMtaW5zdGFuY2UgKCB2YWx1ZSApCit7CisgICAgcmV0dXJuIFsgTUFUQ0ggIl4ob2JqZWN0XFwoKVteQF0rXFwpQC4qIiA6ICQodmFsdWUpIF0gOworfQorCisKKyMgQ2hlY2sgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIG9mIHRoZSBnaXZlbiB0eXBlLgorIworcnVsZSBpcy1hICgKKyAgICBpbnN0YW5jZSAgIyBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgOiB0eXBlICAjIFRoZSB0eXBlIHRvIHRlc3QgZm9yLgorKQoreworICAgIGlmIFsgaXMtaW5zdGFuY2UgJChpbnN0YW5jZSkgXQorICAgIHsKKyAgICAgICAgcmV0dXJuIFsgY2xhc3MuaXMtZGVyaXZlZCBbIG1vZHVsZXMucGVlayAkKGluc3RhbmNlKSA6IF9fY2xhc3NfXyBdIDogJCh0eXBlKSBdIDsKKyAgICB9Cit9CisKKworbG9jYWwgcnVsZSB0eXBlY2hlY2sgKCB4ICkKK3sKKyAgICBsb2NhbCBjbGFzcy1uYW1lID0gWyBNQVRDSCAiXlxcWyguKilcXF0kIiA6IFsgQkFDS1RSQUNFIDEgXSBdIDsKKyAgICBpZiAhIFsgaXMtYSAkKHgpIDogJChjbGFzcy1uYW1lKSBdCisgICAgeworICAgICAgICByZXR1cm4gIkV4cGVjdGVkIGFuIGluc3RhbmNlIG9mICIkKGNsYXNzLW5hbWUpIiBidXQgZ290IFwiIiQoeCkiXCIgZm9yIGFyZ3VtZW50IiA7CisgICAgfQorfQorCisKK3J1bGUgX190ZXN0X18gKCApCit7CisgICAgaW1wb3J0IGFzc2VydCA7CisgICAgaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworICAgIGltcG9ydCBlcnJvcnMgOiB0cnkgY2F0Y2ggOworCisgICAgIyBUaGlzIHdpbGwgYmUgdGhlIGNvbnN0cnVjdGlvbiBmdW5jdGlvbiBmb3IgYSBjbGFzcyBjYWxsZWQgJ215Y2xhc3MnLgorICAgICMKKyAgICBjbGFzcyBteWNsYXNzCisgICAgeworICAgICAgICBpbXBvcnQgYXNzZXJ0IDsKKworICAgICAgICBydWxlIF9faW5pdF9fICggeF8gKiA6IHlfICogKQorICAgICAgICB7CisgICAgICAgICAgICAjIFNldCBzb21lIGluc3RhbmNlIHZhcmlhYmxlcy4KKyAgICAgICAgICAgIHggPSAkKHhfKSA7CisgICAgICAgICAgICB5ID0gJCh5XykgOworICAgICAgICAgICAgZm9vICs9IDEwIDsKKyAgICAgICAgfQorCisgICAgICAgIHJ1bGUgc2V0LXggKCBuZXd4ICogKQorICAgICAgICB7CisgICAgICAgICAgICB4ID0gJChuZXd4KSA7CisgICAgICAgIH0KKworICAgICAgICBydWxlIGdldC14ICggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gJCh4KSA7CisgICAgICAgIH0KKworICAgICAgICBydWxlIHNldC15ICggbmV3eSAqICkKKyAgICAgICAgeworICAgICAgICAgICAgeSA9ICQobmV3eSkgOworICAgICAgICB9CisKKyAgICAgICAgcnVsZSBnZXQteSAoICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICQoeSkgOworICAgICAgICB9CisKKyAgICAgICAgcnVsZSBmICggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWyBnICQoeCkgXSA7CisgICAgICAgIH0KKworICAgICAgICBydWxlIGcgKCBhcmdzICogKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKHgpIGluICQoeSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gJCh4KSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICQoeSkgaW4gJCh4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAkKHkpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcnVsZSBnZXQtY2xhc3MgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAkKF9fY2xhc3NfXykgOworICAgICAgICB9CisKKyAgICAgICAgcnVsZSBnZXQtaW5zdGFuY2UgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAkKF9fbmFtZV9fKSA7CisgICAgICAgIH0KKworICAgICAgICBydWxlIGludmFyaWFudCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0LmVxdWFsIDEgOiAxIDsKKyAgICAgICAgfQorCisgICAgICAgIHJ1bGUgZ2V0LWZvbyAoICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICQoZm9vKSA7CisgICAgICAgIH0KKyAgICB9ICAjIGNsYXNzIG15Y2xhc3MgOworCisgICAgY2xhc3MgZGVyaXZlZDEgOiBteWNsYXNzCisgICAgeworICAgICAgICBydWxlIF9faW5pdF9fICggel8gKQorICAgICAgICB7CisgICAgICAgICAgICBteWNsYXNzLl9faW5pdF9fICQoel8pIDogWCA7CisgICAgICAgICAgICB6ID0gJCh6XykgOworICAgICAgICB9CisKKyAgICAgICAgIyBPdmVycmlkZSBnLgorICAgICAgICAjCisgICAgICAgIHJ1bGUgZyAoIGFyZ3MgKiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZXJpdmVkMS5nIDsKKyAgICAgICAgfQorCisgICAgICAgIHJ1bGUgaCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlcml2ZWQxLmggOworICAgICAgICB9CisKKyAgICAgICAgcnVsZSBnZXQteiAoICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICQoeikgOworICAgICAgICB9CisKKyAgICAgICAgIyBDaGVjayB0aGF0ICdhc3NlcnQuZXF1YWwnIHZpc2libGUgaW4gYmFzZSBjbGFzcyBpcyB2aXNpYmxlIGhlcmUuCisgICAgICAgICMKKyAgICAgICAgcnVsZSBpbnZhcmlhbnQyICggKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQuZXF1YWwgMiA6IDIgOworICAgICAgICB9CisKKyAgICAgICAgIyBDaGVjayB0aGF0ICdhc3NlcnQudmFyaWFibGUtbm90LWVtcHR5JyB2aXNpYmxlIGluIGJhc2UgY2xhc3MgaXMKKyAgICAgICAgIyB2aXNpYmxlIGhlcmUuCisgICAgICAgICMKKyAgICAgICAgcnVsZSBpbnZhcmlhbnQzICggKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCB2ID0gMTAgOworICAgICAgICAgICAgYXNzZXJ0LnZhcmlhYmxlLW5vdC1lbXB0eSB2IDsKKyAgICAgICAgfQorICAgIH0gICMgY2xhc3MgZGVyaXZlZDEgOiBteWNsYXNzIDsKKworICAgIGNsYXNzIGRlcml2ZWQyIDogbXljbGFzcworICAgIHsKKyAgICAgICAgcnVsZSBfX2luaXRfXyAoICkKKyAgICAgICAgeworICAgICAgICAgICAgbXljbGFzcy5fX2luaXRfXyAxIDogMiA7CisgICAgICAgIH0KKworICAgICAgICAjIE92ZXJyaWRlIGcuCisgICAgICAgICMKKyAgICAgICAgcnVsZSBnICggYXJncyAqICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlcml2ZWQyLmcgOworICAgICAgICB9CisKKyAgICAgICAgIyBUZXN0IHRoZSBhYmlsaXR5IHRvIGNhbGwgYmFzZSBjbGFzcyBmdW5jdGlvbnMgd2l0aCBxdWFsaWZpY2F0aW9uLgorICAgICAgICAjCisgICAgICAgIHJ1bGUgZ2V0LXggKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBbIG15Y2xhc3MuZ2V0LXggXSA7CisgICAgICAgIH0KKyAgICB9ICAjIGNsYXNzIGRlcml2ZWQyIDogbXljbGFzcyA7CisKKyAgICBjbGFzcyBkZXJpdmVkMmEgOiBkZXJpdmVkMgorICAgIHsKKyAgICAgICAgcnVsZSBfX2luaXRfXworICAgICAgICB7CisgICAgICAgICAgICBkZXJpdmVkMi5fX2luaXRfXyA7CisgICAgICAgIH0KKyAgICB9ICAjIGNsYXNzIGRlcml2ZWQyYSA6IGRlcml2ZWQyIDsKKworICAgIGxvY2FsIHJ1bGUgZXhwZWN0X2Rlcml2ZWQyICggW2Rlcml2ZWQyXSB4ICkgeyB9CisKKyAgICBsb2NhbCBhID0gWyBuZXcgbXljbGFzcyAzIDQgNSA6IDQgNSBdIDsKKyAgICBsb2NhbCBiID0gWyBuZXcgZGVyaXZlZDEgNCBdIDsKKyAgICBsb2NhbCBiMiA9IFsgbmV3IGRlcml2ZWQxIDQgXSA7CisgICAgbG9jYWwgYyA9IFsgbmV3IGRlcml2ZWQyIF0gOworICAgIGxvY2FsIGQgPSBbIG5ldyBkZXJpdmVkMiBdIDsKKyAgICBsb2NhbCBlID0gWyBuZXcgZGVyaXZlZDJhIF0gOworCisgICAgZXhwZWN0X2Rlcml2ZWQyICQoZCkgOworICAgIGV4cGVjdF9kZXJpdmVkMiAkKGUpIDsKKworICAgICMgQXJndW1lbnQgY2hlY2tpbmcgaXMgc2V0IHVwIHRvIGNhbGwgZXhpdCgxKSBkaXJlY3RseSBvbiBmYWlsdXJlLCBhbmQgd2UKKyAgICAjIGNhbiBub3QgaGlqYWNrIHRoYXQgd2l0aCB0cnksIHNvIHdlIHNob3VsZCBiZXR0ZXIgbm90IGRvIHRoaXMgdGVzdCBieQorICAgICMgZGVmYXVsdC4gV2UgY291bGQgZml4IHRoaXMgYnkgaGF2aW5nIGVycm9ycyBsb29rIHVwIGFuZCBpbnZva2UgdGhlIEVYSVQKKyAgICAjIHJ1bGUgaW5zdGVhZDsgRVhJVCBjYW4gYmUgaGlqYWNrZWQgKDstKQorICAgIGlmIC0tZmFpbC10eXBlY2hlY2sgaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0KKyAgICB7CisgICAgICAgIHRyeSA7CisgICAgICAgIHsKKyAgICAgICAgICAgIGV4cGVjdF9kZXJpdmVkMiAkKGEpIDsKKyAgICAgICAgfQorICAgICAgICBjYXRjaAorICAgICAgICAgICAgIkV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGRlcml2ZWQyIGJ1dCBnb3QiIGluc3RlYWQKKyAgICAgICAgICAgIDsKKyAgICB9CisKKyAgICAjdHJ5IDsKKyAgICAjeworICAgICMgICAgbmV3IGJhZF9zdWJjbGFzcyA7CisgICAgI30KKyAgICAjY2F0Y2gKKyAgICAjICAgIGJhZF9zdWJjbGFzcy5iYWRfc3ViY2xhc3MgZmFpbGVkIHRvIGNhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvcgorICAgICMgICAgICAgIG15Y2xhc3MuX19pbml0X18KKyAgICAjICA7CisKKyAgICAjdHJ5IDsKKyAgICAjeworICAgICMgICAgY2xhc3MgYmFkX3N1YmNsYXNzIDsKKyAgICAjfQorICAgICNjYXRjaCBiYWRfc3ViY2xhc3MgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZCA7CisKKyAgICBhc3NlcnQucmVzdWx0IDMgNCA1IDogJChhKS5nZXQteCA7CisgICAgYXNzZXJ0LnJlc3VsdCA0IDUgOiAkKGEpLmdldC15IDsKKyAgICBhc3NlcnQucmVzdWx0IDQgOiAkKGIpLmdldC14IDsKKyAgICBhc3NlcnQucmVzdWx0IFggOiAkKGIpLmdldC15IDsKKyAgICBhc3NlcnQucmVzdWx0IDQgOiAkKGIpLmdldC16IDsKKyAgICBhc3NlcnQucmVzdWx0IDEgOiAkKGMpLmdldC14IDsKKyAgICBhc3NlcnQucmVzdWx0IDIgOiAkKGMpLmdldC15IDsKKyAgICBhc3NlcnQucmVzdWx0IDQgNSA6ICQoYSkuZiA7CisgICAgYXNzZXJ0LnJlc3VsdCBkZXJpdmVkMS5nIDogJChiKS5mIDsKKyAgICBhc3NlcnQucmVzdWx0IGRlcml2ZWQyLmcgOiAkKGMpLmYgOworICAgIGFzc2VydC5yZXN1bHQgZGVyaXZlZDIuZyA6ICQoZCkuZiA7CisKKyAgICBhc3NlcnQucmVzdWx0IDEwIDogJChiKS5nZXQtZm9vIDsKKworICAgICQoYSkuaW52YXJpYW50IDsKKyAgICAkKGIpLmludmFyaWFudDIgOworICAgICQoYikuaW52YXJpYW50MyA7CisKKyAgICAjIENoZWNrIHRoYXQgdGhlIF9fY2xhc3NfXyBhdHRyaWJ1dGUgaXMgZ2V0dGluZyBwcm9wZXJseSBzZXQuCisgICAgYXNzZXJ0LnJlc3VsdCBteWNsYXNzIDogJChhKS5nZXQtY2xhc3MgOworICAgIGFzc2VydC5yZXN1bHQgZGVyaXZlZDEgOiAkKGIpLmdldC1jbGFzcyA7CisgICAgYXNzZXJ0LnJlc3VsdCAkKGEpIDogJChhKS5nZXQtaW5zdGFuY2UgOworCisgICAgJChhKS5zZXQteCBhLnggOworICAgICQoYikuc2V0LXggYi54IDsKKyAgICAkKGMpLnNldC14IGMueCA7CisgICAgJChkKS5zZXQteCBkLnggOworICAgIGFzc2VydC5yZXN1bHQgYS54IDogJChhKS5nZXQteCA7CisgICAgYXNzZXJ0LnJlc3VsdCBiLnggOiAkKGIpLmdldC14IDsKKyAgICBhc3NlcnQucmVzdWx0IGMueCA6ICQoYykuZ2V0LXggOworICAgIGFzc2VydC5yZXN1bHQgZC54IDogJChkKS5nZXQteCA7CisKKyAgICBjbGFzcyBkZXJpdmVkMyA6IGRlcml2ZWQxIGRlcml2ZWQyCisgICAgeworICAgICAgICBydWxlIF9faW5pdF9fICggKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQucmVzdWx0IDogYmFzZXMgbXljbGFzcyA7CisgICAgYXNzZXJ0LnJlc3VsdCBteWNsYXNzIDogYmFzZXMgZGVyaXZlZDEgOworICAgIGFzc2VydC5yZXN1bHQgbXljbGFzcyA6IGJhc2VzIGRlcml2ZWQyIDsKKyAgICBhc3NlcnQucmVzdWx0IGRlcml2ZWQxIGRlcml2ZWQyIDogYmFzZXMgZGVyaXZlZDMgOworCisgICAgYXNzZXJ0LnRydWUgaXMtZGVyaXZlZCBkZXJpdmVkMSA6IG15Y2xhc3MgOworICAgIGFzc2VydC50cnVlIGlzLWRlcml2ZWQgZGVyaXZlZDIgOiBteWNsYXNzIDsKKyAgICBhc3NlcnQudHJ1ZSBpcy1kZXJpdmVkIGRlcml2ZWQzIDogZGVyaXZlZDEgOworICAgIGFzc2VydC50cnVlIGlzLWRlcml2ZWQgZGVyaXZlZDMgOiBkZXJpdmVkMiA7CisgICAgYXNzZXJ0LnRydWUgaXMtZGVyaXZlZCBkZXJpdmVkMyA6IGRlcml2ZWQxIGRlcml2ZWQyIG15Y2xhc3MgOworICAgIGFzc2VydC50cnVlIGlzLWRlcml2ZWQgZGVyaXZlZDMgOiBteWNsYXNzIDsKKworICAgIGFzc2VydC5mYWxzZSBpcy1kZXJpdmVkIG15Y2xhc3MgOiBkZXJpdmVkMSA7CisKKyAgICBhc3NlcnQudHJ1ZSBpcy1pbnN0YW5jZSAkKGEpIDsKKyAgICBhc3NlcnQuZmFsc2UgaXMtaW5zdGFuY2UgYmFyIDsKKworICAgIGFzc2VydC50cnVlIGlzLWEgJChhKSA6IG15Y2xhc3MgOworICAgIGFzc2VydC50cnVlIGlzLWEgJChjKSA6IGRlcml2ZWQyIDsKKyAgICBhc3NlcnQudHJ1ZSBpcy1hICQoZCkgOiBteWNsYXNzIDsKKyAgICBhc3NlcnQuZmFsc2UgaXMtYSBsaXRlcmFsIDogbXljbGFzcyA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL2tlcm5lbC9lcnJvcnMuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9rZXJuZWwvZXJyb3JzLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTYzMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9rZXJuZWwvZXJyb3JzLmphbQpAQCAtMCwwICsxLDI4NyBAQAorIyBDb3B5cmlnaHQgMjAwMyBEYXZlIEFicmFoYW1zCisjIENvcHlyaWdodCAyMDA0IFZsYWRpbWlyIFBydXMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBQcmludCBhIHN0YWNrIGJhY2t0cmFjZSBsZWFkaW5nIHRvIHRoaXMgcnVsZSdzIGNhbGxlci4gRWFjaCBhcmd1bWVudAorIyByZXByZXNlbnRzIGEgbGluZSBvZiBvdXRwdXQgdG8gYmUgcHJpbnRlZCBhZnRlciB0aGUgZmlyc3QgbGluZSBvZiB0aGUKKyMgYmFja3RyYWNlLgorIworcnVsZSBiYWNrdHJhY2UgKCBza2lwLWZyYW1lcyBwcmVmaXggbWVzc2FnZXMgKiA6ICogKQoreworICAgIGxvY2FsIGZyYW1lLXNraXBzID0gNSA5IDEzIDE3IDIxIDI1IDI5IDMzIDM3IDQxIDQ1IDQ5IDUzIDU3IDYxIDY1IDY5IDczIDc3IDgxIDsKKyAgICBsb2NhbCBkcm9wLWVsZW1lbnRzID0gJChmcmFtZS1za2lwc1skKHNraXAtZnJhbWVzKV0pIDsKKyAgICBpZiAhICggJChza2lwLWZyYW1lcykgaW4gMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgKQorICAgIHsKKyAgICAgICAgRUNITyAid2FybmluZzogYmFja3RyYWNlIGRvZXNuJ3Qgc3VwcG9ydCBza2lwcGluZyAkKHNraXAtZnJhbWVzKSAiCisgICAgICAgICAgICAiZnJhbWVzOyB1c2luZyAxIGluc3RlYWQuIiA7CisgICAgICAgIGRyb3AtZWxlbWVudHMgPSA1IDsKKyAgICB9CisKKyAgICBsb2NhbCBhcmdzID0gJCguYXJncykgOworICAgIGlmICQoLnVzZXItbW9kdWxlcy1vbmx5KQorICAgIHsKKyAgICAgICAgbG9jYWwgYnQgPSBbIG5lYXJlc3QtdXNlci1sb2NhdGlvbiBdIDsKKyAgICAgICAgaWYgJChidCkKKyAgICAgICAgeworICAgICAgICAgICAgRUNITyAkKHByZWZpeCkgYXQgJChidCkgOworICAgICAgICB9CisgICAgICAgIGZvciBsb2NhbCBuIGluICQoYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJCgkKG4pKS1pcy1kZWZpbmVkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAkKHByZWZpeCkgJCgkKG4pKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgIyBHZXQgdGhlIHdob2xlIGJhY2t0cmFjZSwgdGhlbiBkcm9wIHRoZSBpbml0aWFsIHF1YWRydXBsZXMKKyAgICAgICAgIyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmcmFtZXMgdGhhdCBtdXN0IGJlIHNraXBwZWQuCisgICAgICAgIGxvY2FsIGJ0ID0gWyBCQUNLVFJBQ0UgXSA7CisgICAgICAgIGJ0ID0gJChidFskKGRyb3AtZWxlbWVudHMpLV0pIDsKKworICAgICAgICB3aGlsZSAkKGJ0KQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBtID0gWyBNQVRDSCBeKC4rKVxcLiQgOiAkKGJ0WzNdKSBdIDsKKyAgICAgICAgICAgIEVDSE8gJChidFsxXSk6JChidFsyXSk6ICJpbiIgJChidFs0XSkgImZyb20gbW9kdWxlIiAkKG0pIDsKKworICAgICAgICAgICAgIyBUaGUgZmlyc3QgdGltZSB0aHJvdWdoLCBwcmludCBlYWNoIGFyZ3VtZW50IG9uIGEgc2VwYXJhdGUgbGluZS4KKyAgICAgICAgICAgIGZvciBsb2NhbCBuIGluICQoYXJncykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAkKCQobikpLWlzLWRlZmluZWQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVDSE8gJChwcmVmaXgpICQoJChuKSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFyZ3MgPSA7ICAjIEtpbGwgYXJncyBzbyB0aGF0IHRoaXMgbmV2ZXIgaGFwcGVucyBhZ2Fpbi4KKworICAgICAgICAgICAgIyBNb3ZlIG9uIHRvIHRoZSBuZXh0IHF1YWRydXBsZS4KKyAgICAgICAgICAgIGJ0ID0gJChidFs1LV0pIDsKKyAgICAgICAgfQorICAgIH0KK30KKworLmFyZ3MgPz0gbWVzc2FnZXMgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDsKKy5kaXNhYmxlZCA/PSA7CisubGFzdC1lcnJvci0kKC5hcmdzKSA/PSA7CisKKworIyB0cnktY2F0Y2ggLS0KKyMKKyMgVGhpcyBpcyBub3QgcmVhbGx5IGFuIGV4Y2VwdGlvbi1oYW5kbGluZyBtZWNoYW5pc20sIGJ1dCBpdCBkb2VzIGFsbG93IHVzIHRvCisjIHBlcmZvcm0gc29tZSBlcnJvci1jaGVja2luZyBvbiBvdXIgZXJyb3ItY2hlY2tpbmcuIEVycm9ycyBhcmUgc3VwcHJlc3NlZCBhZnRlcgorIyBhIHRyeSwgYW5kIHRoZSBmaXJzdCBvbmUgaXMgcmVjb3JkZWQuIFVzZSBjYXRjaCB0byBjaGVjayB0aGF0IHRoZSBlcnJvcgorIyBtZXNzYWdlIG1hdGNoZWQgZXhwZWN0YXRpb25zLgorCisjIEJlZ2luIGxvb2tpbmcgZm9yIGVycm9yIG1lc3NhZ2VzLgorIworcnVsZSB0cnkgKCApCit7CisgICAgLmRpc2FibGVkICs9IHRydWUgOworICAgIC5sYXN0LWVycm9yLSQoLmFyZ3MpID0gOworfQorCisKKyMgU3RvcCBsb29raW5nIGZvciBlcnJvciBtZXNzYWdlczsgZ2VuZXJhdGUgYW4gZXJyb3IgaWYgYW4gYXJndW1lbnQgb2YgbWVzc2FnZXMKKyMgaXMgbm90IGZvdW5kIGluIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IGluIHRoZSBlcnJvciBjYWxsLgorIworcnVsZSBjYXRjaCAoIG1lc3NhZ2VzICogOiAqICkKK3sKKyAgICAuZGlzYWJsZWQgPSAkKC5kaXNhYmxlZFsyLV0pIDsgICMgUG9wIHRoZSBzdGFjay4KKworICAgIGltcG9ydCBzZXF1ZW5jZSA7CisKKyAgICBpZiAhICQoLmxhc3QtZXJyb3ItJCguYXJncykpLWlzLWRlZmluZWQKKyAgICB7CisgICAgICAgIGVycm9yLXNraXAtZnJhbWVzIDMgZXhwZWN0ZWQgYW4gZXJyb3IsIGJ1dCBub25lIG9jY3VycmVkIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIGxvY2FsIG4gaW4gJCguYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgISAkKCQobikpIGluICQoLmxhc3QtZXJyb3ItJChuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCB2ID0gWyBzZXF1ZW5jZS5qb2luICQoJChuKSkgOiAiICIgXSA7CisgICAgICAgICAgICAgICAgdiA/PSAiIiA7CisgICAgICAgICAgICAgICAgbG9jYWwgam9pbmVkID0gWyBzZXF1ZW5jZS5qb2luICQoLmxhc3QtZXJyb3ItJChuKSkgOiAiICIgXSA7CisKKyAgICAgICAgICAgICAgICAubGFzdC1lcnJvci0kKC5hcmdzKSA9IDsKKyAgICAgICAgICAgICAgICBlcnJvci1za2lwLWZyYW1lcyAzIGV4cGVjdGVkIFwiJCh2KVwiIGluIGFyZ3VtZW50ICQobikgb2YgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgOiBnb3QgXCIkKGpvaW5lZClcIiBpbnN0ZWFkIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCitydWxlIGVycm9yLXNraXAtZnJhbWVzICggc2tpcC1mcmFtZXMgbWVzc2FnZXMgKiA6ICogKQoreworICAgIGlmICEgJCguZGlzYWJsZWQpCisgICAgeworICAgICAgICBiYWNrdHJhY2UgJChza2lwLWZyYW1lcykgZXJyb3I6ICQobWVzc2FnZXMpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KQorICAgICAgICAgICAgOiAkKDYpIDogJCg3KSA6ICQoOCkgOiAkKDkpIDogJCgxMCkgOiAkKDExKSA6ICQoMTIpIDogJCgxMykgOiAkKDE0KQorICAgICAgICAgICAgOiAkKDE1KSA6ICQoMTYpIDogJCgxNykgOiAkKDE4KSA6ICQoMTkpIDsKKyAgICAgICAgRVhJVCA7CisgICAgfQorICAgIGVsc2UgaWYgISAkKC5sYXN0LWVycm9yLSQoLmFyZ3MpKQorICAgIHsKKyAgICAgICAgZm9yIGxvY2FsIG4gaW4gJCguYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgIyBBZGQgYW4gZXh0cmEgZW1wdHkgc3RyaW5nIHNvIHRoYXQgd2UgYWx3YXlzIGhhdmUgc29tZXRoaW5nIGluIHRoZQorICAgICAgICAgICAgIyBldmVudCBvZiBhbiBlcnJvci4KKyAgICAgICAgICAgIC5sYXN0LWVycm9yLSQobikgPSAkKCQobikpICIiIDsKKyAgICAgICAgfQorICAgIH0KK30KKworaWYgLS1uby1lcnJvci1iYWNrdHJhY2UgaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0KK3sKKyAgICAubm8tZXJyb3ItYmFja3RyYWNlID0gdHJ1ZSA7Cit9CisKKworIyBQcmludCBhbiBlcnJvciBtZXNzYWdlIHdpdGggYSBzdGFjayBiYWNrdHJhY2UgYW5kIGV4aXQuCisjCitydWxlIGVycm9yICggbWVzc2FnZXMgKiA6ICogKQoreworICAgIGlmICQoLm5vLWVycm9yLWJhY2t0cmFjZSkKKyAgICB7CisgICAgICAgIGxvY2FsIGZpcnN0LXByaW50ZWQgOworICAgICAgICAjIFByaW50IGVhY2ggYXJndW1lbnQgb24gYSBzZXBhcmF0ZSBsaW5lLgorICAgICAgICBmb3IgbG9jYWwgbiBpbiAkKC5hcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKCQobikpLWlzLWRlZmluZWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAhICQoZmlyc3QtcHJpbnRlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVDSE8gZXJyb3I6ICQoJChuKSkgOworICAgICAgICAgICAgICAgICAgICBmaXJzdC1wcmludGVkID0gdHJ1ZSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVDSE8gJCgkKG4pKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEVYSVQgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlcnJvci1za2lwLWZyYW1lcyAzICQoMSkgOiAkKDIpIDogJCgzKSA6ICQoNCkgOiAkKDUpIDogJCg2KSA6ICQoNykgOgorICAgICAgICAgICAgJCg4KSA6ICQoOSkgOiAkKDEwKSA6ICQoMTEpIDogJCgxMikgOiAkKDEzKSA6ICQoMTQpIDogJCgxNSkgOiAkKDE2KQorICAgICAgICAgICAgOiAkKDE3KSA6ICQoMTgpIDogJCgxOSkgOworICAgIH0KK30KKworCisjIFNhbWUgYXMgJ2Vycm9yJywgYnV0IHRoZSBnZW5lcmF0ZWQgYmFja3RyYWNlIHdpbGwgaW5jbHVkZSBvbmx5IHVzZXIgZmlsZXMuCisjCitydWxlIHVzZXItZXJyb3IgKCBtZXNzYWdlcyAqIDogKiApCit7CisgICAgLnVzZXItbW9kdWxlcy1vbmx5ID0gMSA7CisgICAgZXJyb3Itc2tpcC1mcmFtZXMgMyAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6CisgICAgICAgICQoOSkgOiAkKDEwKSA6ICQoMTEpIDogJCgxMikgOiAkKDEzKSA6ICQoMTQpIDogJCgxNSkgOiAkKDE2KSA6ICQoMTcpIDoKKyAgICAgICAgJCgxOCkgOiAkKDE5KSA7Cit9CisKKworIyBQcmludCBhIHdhcm5pbmcgbWVzc2FnZSB3aXRoIGEgc3RhY2sgYmFja3RyYWNlIGFuZCBleGl0LgorIworcnVsZSB3YXJuaW5nCit7CisgICAgYmFja3RyYWNlIDIgd2FybmluZzogJCgxKSA6ICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkgOgorICAgICAgICAkKDkpIDogJCgxMCkgOiAkKDExKSA6ICQoMTIpIDogJCgxMykgOiAkKDE0KSA6ICQoMTUpIDogJCgxNikgOiAkKDE3KSA6CisgICAgICAgICQoMTgpIDogJCgxOSkgOworfQorCisKKyMgQ29udmVydCBhbiBhcmJpdHJhcnkgYXJndW1lbnQgbGlzdCBpbnRvIGEgbGlzdCB3aXRoICI6IiBzZXBhcmF0b3JzIGFuZCBxdW90ZWQKKyMgZWxlbWVudHMgcmVwcmVzZW50aW5nIHRoZSBzYW1lIGluZm9ybWF0aW9uLiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yCisjIGZvcm1hdHRpbmcgZGVzY3JpcHRpb25zIG9mIGFyZ3VtZW50cyB3aXRoIHdoaWNoIGEgcnVsZSB3YXMgY2FsbGVkIHdoZW4KKyMgcmVwb3J0aW5nIGFuIGVycm9yLgorIworcnVsZSBsb2wtPmxpc3QgKCAqICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGxvY2FsIHJlbWFpbmluZyA9IDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDsKKyAgICB3aGlsZSAkKCQocmVtYWluaW5nKSkKKyAgICB7CisgICAgICAgIGxvY2FsIG4gPSAkKHJlbWFpbmluZ1sxXSkgOworICAgICAgICByZW1haW5pbmcgPSAkKHJlbWFpbmluZ1syLV0pIDsKKworICAgICAgICBpZiAkKG4pICE9IDEKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICI6IiA7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IFwiJCgkKG4pKVwiIDsKKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBSZXR1cm4gdGhlIGZpbGU6bGluZSBmb3IgdGhlIG5lYXJlc3QgZW50cnkgaW4gYmFja3RyYWNlIHdoaWNoIGNvcnJlc3BvbmQgdG8gYQorIyB1c2VyIG1vZHVsZS4KKyMKK3J1bGUgbmVhcmVzdC11c2VyLWxvY2F0aW9uICggKQoreworICAgIGxvY2FsIGJ0ID0gWyBCQUNLVFJBQ0UgXSA7CisKKyAgICBsb2NhbCByZXN1bHQgOworICAgIHdoaWxlICQoYnQpICYmICEgJChyZXN1bHQpCisgICAgeworICAgICAgICBsb2NhbCBtID0gWyBNQVRDSCBeKC4rKVxcLiQgOiAkKGJ0WzNdKSBdIDsKKyAgICAgICAgbG9jYWwgdXNlci1tb2R1bGVzID0gKFtKal1hbXJvb3QoLmphbXwudjJ8KXwoW0pqXWFtZmlsZSguamFtfC52MnwpfHVzZXItY29uZmlnLmphbXxzaXRlLWNvbmZpZy5qYW18cHJvamVjdC1jb25maWcuamFtfHByb2plY3Qtcm9vdC5qYW0pIDsKKworICAgICAgICBpZiBbIE1BVENIICQodXNlci1tb2R1bGVzKSA6ICQoYnRbMV06RD0pIF0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gJChidFsxXSk6JChidFsyXSkgOworICAgICAgICB9CisgICAgICAgIGJ0ID0gJChidFs1LV0pIDsKKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBJZiBvcHRpbWl6ZWQgcnVsZSBpcyBhdmFpbGFibGUgaW4gSmFtLCB1c2UgaXQuCitpZiBORUFSRVNUX1VTRVJfTE9DQVRJT04gaW4gWyBSVUxFTkFNRVMgXQoreworICAgIHJ1bGUgbmVhcmVzdC11c2VyLWxvY2F0aW9uICggKQorICAgIHsKKyAgICAgICAgbG9jYWwgciA9IFsgTkVBUkVTVF9VU0VSX0xPQ0FUSU9OIF0gOworICAgICAgICByZXR1cm4gJChyWzFdKTokKHJbMl0pIDsKKyAgICB9Cit9CisKKworcnVsZSBfX3Rlc3RfXyAoICkKK3sKKyAgICAjIFNob3cgdGhhdCB3ZSBjYW4gY29ycmVjdGx5IGNhdGNoIGFuIGV4cGVjdGVkIGVycm9yLgorICAgIHRyeSA7CisgICAgeworICAgICAgICBlcnJvciBhbiBlcnJvciBvY2N1cnJlZCA6IHNvbWV3aGVyZSA7CisgICAgfQorICAgIGNhdGNoIGFuIGVycm9yIG9jY3VycmVkIDogc29tZXdoZXJlIDsKKworICAgICMgU2hvdyB0aGF0IHVuZXhwZWN0ZWQgZXJyb3JzIGdlbmVyYXRlIHJlYWwgZXJyb3JzLgorICAgIHRyeSA7CisgICAgeworICAgICAgICB0cnkgOworICAgICAgICB7CisgICAgICAgICAgICBlcnJvciBhbiBlcnJvciBvY2N1cnJlZCA6IHNvbWV3aGVyZSA7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggYW4gZXJyb3Igb2NjdXJyZWQgOiBub3doZXJlIDsKKyAgICB9CisgICAgY2F0Y2ggZXhwZWN0ZWQgXCJub3doZXJlXCIgaW4gYXJndW1lbnQgMiA7CisKKyAgICAjIFNob3cgdGhhdCBub3QgY2F0Y2hpbmcgYW4gZXJyb3Igd2hlcmUgb25lIHdhcyBleHBlY3RlZCBpcyBhbiBlcnJvci4KKyAgICB0cnkgOworICAgIHsKKyAgICAgICAgdHJ5IDsKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGNhdGNoIDsKKyAgICB9CisgICAgY2F0Y2ggZXhwZWN0ZWQgYW4gZXJyb3IsIGJ1dCBub25lIG9jY3VycmVkIDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQva2VybmVsL21vZHVsZXMuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9rZXJuZWwvbW9kdWxlcy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI1ODIyNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQva2VybmVsL21vZHVsZXMuamFtCkBAIC0wLDAgKzEsMzU5IEBACisjIENvcHlyaWdodCAyMDAzIERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDMsIDIwMDUgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIEVzc2VudGlhbGx5IGFuIGluY2x1ZGUgZ3VhcmQ7IGVuc3VyZXMgdGhhdCBubyBtb2R1bGUgaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzLgorLmxvYWRlZCA/PSA7CisKKyMgQSBsaXN0IG9mIG1vZHVsZXMgY3VycmVudGx5IGJlaW5nIGxvYWRlZCBmb3IgZXJyb3IgcmVwb3J0aW5nIG9mIGNpcmN1bGFyCisjIGRlcGVuZGVuY2llcy4KKy5sb2FkaW5nID89IDsKKworIyBBIGxpc3Qgb2YgbW9kdWxlcyBuZWVkaW5nIHRvIGJlIHRlc3RlZCB1c2luZyB0aGVpciBfX3Rlc3RfXyBydWxlLgorLnVudGVzdGVkID89IDsKKworIyBBIGxpc3Qgb2YgbW9kdWxlcyB3aGljaCBoYXZlIGJlZW4gdGVzdGVkIHVzaW5nIHRoZWlyIF9fdGVzdF9fIHJ1bGUuCisudGVzdGVkID89IDsKKworCisjIFJ1bnMgaW50ZXJuYWwgQm9vc3QgQnVpbGQgdW5pdCB0ZXN0cyBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuIFRoZSBtb2R1bGUncworIyBfX3Rlc3RfXyBydWxlIGlzIGV4ZWN1dGVkIGluIGl0cyBvd24gbW9kdWxlIHRvIGVsaW1pbmF0ZSBhbnkgaW5hZHZlcnRlbnQKKyMgZWZmZWN0cyBvZiB0ZXN0aW5nIG1vZHVsZSBkZXBlbmRlbmNpZXMgKHN1Y2ggYXMgYXNzZXJ0KSBvbiB0aGUgbW9kdWxlIGl0c2VsZi4KKyMKK2xvY2FsIHJ1bGUgcnVuLW1vZHVsZS10ZXN0ICggbSApCit7CisgICAgbG9jYWwgdGVzdGVkLW1vZHVsZXMgPSBbIG1vZHVsZXMucGVlayBtb2R1bGVzIDogLnRlc3RlZCBdIDsKKworICAgIGlmICggISAkKG0pIGluICQodGVzdGVkLW1vZHVsZXMpICkgICMgQXZvaWQgcmVjdXJzaXZlIHRlc3QgaW52b2NhdGlvbnMuCisgICAgICAgICYmICggKCAtLWRlYnVnIGluICQoYXJndikgKSB8fCAoIC0tZGVidWctbW9kdWxlPSQobSkgaW4gJChhcmd2KSApICkKKyAgICB7CisgICAgICAgIG1vZHVsZXMucG9rZSBtb2R1bGVzIDogLnRlc3RlZCA6ICQodGVzdGVkLW1vZHVsZXMpICQobSkgOworCisgICAgICAgIGlmICEgKCBfX3Rlc3RfXyBpbiBbIFJVTEVOQU1FUyAkKG0pIF0gKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBhcmd2ID0gWyBwZWVrIDogQVJHViBdIDsKKyAgICAgICAgICAgIGlmICEgKCAtLXF1aWV0IGluICQoYXJndikgKSAmJiAoIC0tZGVidWctdGVzdHMgaW4gJChhcmd2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyB3YXJuaW5nOiBubyBfX3Rlc3RfXyBydWxlIGRlZmluZWQgaW4gbW9kdWxlICQobSkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgISAoIC0tcXVpZXQgaW4gJChhcmd2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyB0ZXN0aW5nIG1vZHVsZSAkKG0pLi4uIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9jYWwgdGVzdC1tb2R1bGUgPSBfX3Rlc3QtJChtKV9fIDsKKyAgICAgICAgICAgIElNUE9SVCAkKG0pIDogWyBSVUxFTkFNRVMgJChtKSBdIDogJCh0ZXN0LW1vZHVsZSkgOiBbIFJVTEVOQU1FUyAkKG0pCisgICAgICAgICAgICAgICAgXSA7CisgICAgICAgICAgICBJTVBPUlQgJChtKSA6IF9fdGVzdF9fIDogJCh0ZXN0LW1vZHVsZSkgOiBfX3Rlc3RfXyA6IExPQ0FMSVpFIDsKKyAgICAgICAgICAgIG1vZHVsZSAkKHRlc3QtbW9kdWxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fdGVzdF9fIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisjIFJldHVybiB0aGUgYmluZGluZyBvZiB0aGUgZ2l2ZW4gbW9kdWxlLgorIworcnVsZSBiaW5kaW5nICggbW9kdWxlICkKK3sKKyAgICByZXR1cm4gJCgkKG1vZHVsZSkuX19iaW5kaW5nX18pIDsKK30KKworCisjIFNldHMgdGhlIG1vZHVsZS1sb2NhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlLiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0bworIyBzZXQgYSBtb2R1bGUtbG9jYWwgdmFyaWFibGUgaW4gYSBkaWZmZXJlbnQgbW9kdWxlOyBpdCBlbGltaW5hdGVzIGlzc3VlcyBvZgorIyBuYW1lIHNoYWRvd2luZyBkdWUgdG8gZHluYW1pYyBzY29waW5nLgorIworcnVsZSBwb2tlICggbW9kdWxlLW5hbWUgPyA6IHZhcmlhYmxlcyArIDogdmFsdWUgKiApCit7CisgICAgbW9kdWxlICQoPCkKKyAgICB7CisgICAgICAgICQoPikgPSAkKDMpIDsKKyAgICB9Cit9CisKKworIyBSZXR1cm5zIHRoZSBtb2R1bGUtbG9jYWwgdmFsdWUgb2YgYSB2YXJpYWJsZS4gVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8KKyMgZXhhbWluZSBhIG1vZHVsZS1sb2NhbCB2YXJpYWJsZSBpbiBhIGRpZmZlcmVudCBtb2R1bGU7IGl0IGVsaW1pbmF0ZXMgaXNzdWVzIG9mCisjIG5hbWUgc2hhZG93aW5nIGR1ZSB0byBkeW5hbWljIHNjb3BpbmcuCisjCitydWxlIHBlZWsgKCBtb2R1bGUtbmFtZSA/IDogdmFyaWFibGVzICsgKQoreworICAgIG1vZHVsZSAkKDwpCisgICAgeworICAgICAgICByZXR1cm4gJCgkKD4pKSA7CisgICAgfQorfQorCisKKyMgQ2FsbCB0aGUgZ2l2ZW4gcnVsZSBsb2NhbGx5IGluIHRoZSBnaXZlbiBtb2R1bGUuIFVzZSB0aGlzIGZvciBydWxlcyBhY2NlcHRpbmcKKyMgcnVsZSBuYW1lcyBhcyBhcmd1bWVudHMsIHNvIHRoYXQgdGhlIHBhc3NlZCBydWxlIG1heSBiZSBpbnZva2VkIGluIHRoZSBjb250ZXh0CisjIG9mIHRoZSBydWxlJ3MgY2FsbGVyIChmb3IgZXhhbXBsZSwgaWYgdGhlIHJ1bGUgYWNjZXNzZXMgbW9kdWxlIGdsb2JhbHMgb3IgaXMgYQorIyBsb2NhbCBydWxlKS4gTm90ZSB0aGF0IHJ1bGVzIGNhbGxlZCB0aGlzIHdheSBtYXkgYWNjZXB0IGF0IG1vc3QgMTggcGFyYW1ldGVycy4KKyMKK3J1bGUgY2FsbC1pbiAoIG1vZHVsZS1uYW1lID8gOiBydWxlLW5hbWUgYXJncyAqIDogKiApCit7CisgICAgbW9kdWxlICQobW9kdWxlLW5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gWyAkKDIpIDogJCgzKSA6ICQoNCkgOiAkKDUpIDogJCg2KSA6ICQoNykgOiAkKDgpIDogJCg5KSA6ICQoMTApIDoKKyAgICAgICAgICAgICQoMTEpIDogJCgxMikgOiAkKDEzKSA6ICQoMTQpIDogJCgxNSkgOiAkKDE2KSA6ICQoMTcpIDogJCgxOCkgOgorICAgICAgICAgICAgJCgxOSkgXSA7CisgICAgfQorfQorCisKKyMgR2l2ZW4gYSBwb3NzaWJseSBxdWFsaWZpZWQgcnVsZSBuYW1lIGFuZCBhcmd1bWVudHMsIHJlbW92ZSBhbnkgaW5pdGlhbCBtb2R1bGUKKyMgcXVhbGlmaWNhdGlvbiBmcm9tIHRoZSBydWxlIGFuZCBpbnZva2UgaXQgaW4gdGhhdCBtb2R1bGUuIElmIHRoZXJlIGlzIG5vCisjIG1vZHVsZSBxdWFsaWZpY2F0aW9uLCB0aGUgcnVsZSBpcyBpbnZva2VkIGluIHRoZSBnbG9iYWwgbW9kdWxlLiBOb3RlIHRoYXQKKyMgcnVsZXMgY2FsbGVkIHRoaXMgd2F5IG1heSBhY2NlcHQgYXQgbW9zdCAxOCBwYXJhbWV0ZXJzLgorIworcnVsZSBjYWxsLWxvY2FsbHkgKCBxdWFsaWZpZWQtcnVsZS1uYW1lIGFyZ3MgKiA6ICogKQoreworICAgIGxvY2FsIG1vZHVsZS1ydWxlID0gWyBNQVRDSCAoLiopXFwuKC4qKSA6ICQocXVhbGlmaWVkLXJ1bGUtbmFtZSkgXSA7CisgICAgbG9jYWwgcnVsZS1uYW1lID0gJChtb2R1bGUtcnVsZVsyXSkgOworICAgIHJ1bGUtbmFtZSA/PSAkKHF1YWxpZmllZC1ydWxlLW5hbWUpIDsKKyAgICAjICAgV2UgcGFzcyBvbmx5IDE4IHBhcmFtZXRlcnMgaGVyZSBzaW5jZSBCb29zdCBKYW0gYWxsb3dzIGF0IG1vc3QgMTkgcnVsZQorICAgICMgcGFyYW1ldGVyIHBvc2l0aW9ucyBhbmQgdGhlIGNhbGwtaW4gcnVsZSBhbHJlYWR5IHVzZXMgdXAgdGhlIGluaXRpYWwKKyAgICAjIHBvc2l0aW9uIGZvciB0aGUgbW9kdWxlIG5hbWUuCisgICAgcmV0dXJuIFsgY2FsbC1pbiAkKG1vZHVsZS1ydWxlWzFdKSA6ICQocnVsZS1uYW1lKSAkKGFyZ3MpIDogJCgyKSA6ICQoMykgOgorICAgICAgICAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOiAkKDEwKSA6ICQoMTEpIDogJCgxMikgOiAkKDEzKQorICAgICAgICAkKDE0KSA6ICQoMTUpIDogJCgxNikgOiAkKDE3KSA6ICQoMTgpIDogJCgxOSkgXSA7Cit9CisKKworIyBMb2FkIHRoZSBpbmRpY2F0ZWQgbW9kdWxlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGxvYWRlZC4KKyMKK3J1bGUgbG9hZCAoCisgICAgICBtb2R1bGUtbmFtZSAgIyBOYW1lIG9mIG1vZHVsZSB0byBsb2FkLiBSdWxlcyB3aWxsIGJlIGRlZmluZWQgaW4gdGhpcworICAgICAgICAgICAgICAgICAgICMgbW9kdWxlLgorICAgIDogZmlsZW5hbWUgPyAgICMgKHBhcnRpYWwpIHBhdGggdG8gZmlsZTsgRGVmYXVsdHMgdG8gJChtb2R1bGUtbmFtZSkuamFtLgorICAgIDogc2VhcmNoICogICAgICMgRGlyZWN0b3JpZXMgaW4gd2hpY2ggdG8gc2VhcmNoIGZvciBmaWxlbmFtZS4gRGVmYXVsdHMgdG8KKyAgICAgICAgICAgICAgICAgICAjICQoQk9PU1RfQlVJTERfUEFUSCkuCispCit7CisgICAgIyBBdm9pZCBsb2FkaW5nIG1vZHVsZXMgdHdpY2UuCisgICAgaWYgISAoICQobW9kdWxlLW5hbWUpIGluICQoLmxvYWRlZCkgKQorICAgIHsKKyAgICAgICAgZmlsZW5hbWUgPz0gJChtb2R1bGUtbmFtZSkuamFtIDsKKworICAgICAgICAjIE1hcmsgdGhlIG1vZHVsZSBsb2FkZWQgc28gd2UgZG8gbm90IHRyeSB0byBsb2FkIGl0IHJlY3Vyc2l2ZWx5LgorICAgICAgICAubG9hZGVkICs9ICQobW9kdWxlLW5hbWUpIDsKKworICAgICAgICAjIFN1cHByZXNzIHRlc3RzIGlmIGFueSBtb2R1bGUgbG9hZHMgYXJlIGFscmVhZHkgaW4gcHJvZ3Jlc3MuCisgICAgICAgIGxvY2FsIHN1cHByZXNzLXRlc3QgPSAkKC5sb2FkaW5nWzFdKSA7CisKKyAgICAgICAgIyBQdXNoIHRoaXMgbW9kdWxlIG9uIHRoZSBsb2FkaW5nIHN0YWNrLgorICAgICAgICAubG9hZGluZyArPSAkKG1vZHVsZS1uYW1lKSA7CisKKyAgICAgICAgIyBSZW1lbWJlciB0aGF0IGl0IGlzIHVudGVzdGVkLgorICAgICAgICAudW50ZXN0ZWQgKz0gJChtb2R1bGUtbmFtZSkgOworCisgICAgICAgICMgSW5zZXJ0IHRoZSBuZXcgbW9kdWxlJ3MgX19uYW1lX18gYW5kIF9fZmlsZV9fIGdsb2JhbHMuCisgICAgICAgIHBva2UgJChtb2R1bGUtbmFtZSkgOiBfX25hbWVfXyA6ICQobW9kdWxlLW5hbWUpIDsKKyAgICAgICAgcG9rZSAkKG1vZHVsZS1uYW1lKSA6IF9fZmlsZV9fIDogJChmaWxlbmFtZSkgOworCisgICAgICAgIG1vZHVsZSAkKG1vZHVsZS1uYW1lKQorICAgICAgICB7CisgICAgICAgICAgICAjIEFkZCBzb21lIGdyaXN0IHNvIHRoYXQgdGhlIG1vZHVsZSB3aWxsIGhhdmUgYSB1bmlxdWUgdGFyZ2V0IG5hbWUuCisgICAgICAgICAgICBsb2NhbCBtb2R1bGUtdGFyZ2V0ID0gJChfX2ZpbGVfXzpHPW1vZHVsZUApIDsKKworICAgICAgICAgICAgbG9jYWwgc2VhcmNoID0gJCgzKSA7CisgICAgICAgICAgICBzZWFyY2ggPz0gWyBtb2R1bGVzLnBlZWsgOiBCT09TVF9CVUlMRF9QQVRIIF0gOworICAgICAgICAgICAgU0VBUkNIIG9uICQobW9kdWxlLXRhcmdldCkgPSAkKHNlYXJjaCkgOworICAgICAgICAgICAgQklORFJVTEUgb24gJChtb2R1bGUtdGFyZ2V0KSA9IG1vZHVsZXMucmVjb3JkLWJpbmRpbmcgOworCisgICAgICAgICAgICBpbmNsdWRlICQobW9kdWxlLXRhcmdldCkgOworCisgICAgICAgICAgICAjIEFsbG93IHRoZSBtb2R1bGUgdG8gc2VlIGl0cyBvd24gbmFtZXMgd2l0aCBmdWxsIHF1YWxpZmljYXRpb24uCisgICAgICAgICAgICBsb2NhbCBydWxlcyA9IFsgUlVMRU5BTUVTICQoX19uYW1lX18pIF0gOworICAgICAgICAgICAgSU1QT1JUICQoX19uYW1lX18pIDogJChydWxlcykgOiAkKF9fbmFtZV9fKSA6ICQoX19uYW1lX18pLiQocnVsZXMpIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICQobW9kdWxlLW5hbWUpICE9IG1vZHVsZXMgJiYgISBbIGJpbmRpbmcgJChtb2R1bGUtbmFtZSkgXQorICAgICAgICB7CisgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciAiQ291bGQgbm90IGZpbmQgbW9kdWxlIiAkKG1vZHVsZS1uYW1lKSBpbiAkKHNlYXJjaCkgOworICAgICAgICB9CisKKyAgICAgICAgIyBQb3AgdGhlIGxvYWRpbmcgc3RhY2suIE11c3QgaGFwcGVuIGJlZm9yZSB0ZXN0aW5nIG9yIHdlIHdpbGwgcnVuIGludG8KKyAgICAgICAgIyBhIGNpcmN1bGFyIGxvYWRpbmcgZGVwZW5kZW5jeS4KKyAgICAgICAgLmxvYWRpbmcgPSAkKC5sb2FkaW5nWzEtLTJdKSA7CisKKyAgICAgICAgIyBSdW4gYW55IHBlbmRpbmcgdGVzdHMgaWYgdGhpcyBpcyBhbiBvdXRlciBsb2FkLgorICAgICAgICBpZiAhICQoc3VwcHJlc3MtdGVzdCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgYXJndiA9IFsgcGVlayA6IEFSR1YgXSA7CisgICAgICAgICAgICBmb3IgbG9jYWwgbSBpbiAkKC51bnRlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBydW4tbW9kdWxlLXRlc3QgJChtKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAudW50ZXN0ZWQgPSA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAkKG1vZHVsZS1uYW1lKSBpbiAkKC5sb2FkaW5nKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciBsb2FkaW5nIFwiJChtb2R1bGUtbmFtZSlcIgorICAgICAgICAgICAgOiBjaXJjdWxhciBtb2R1bGUgbG9hZGluZyBkZXBlbmRlbmN5OgorICAgICAgICAgICAgOiAkKC5sb2FkaW5nKSIgLT4iICQobW9kdWxlLW5hbWUpIDsKKyAgICB9Cit9CisKKworIyBUaGlzIGhlbHBlciBpcyB1c2VkIGJ5IGxvYWQgKGFib3ZlKSB0byByZWNvcmQgdGhlIGJpbmRpbmcgKHBhdGgpIG9mIGVhY2gKKyMgbG9hZGVkIG1vZHVsZS4KKyMKK3J1bGUgcmVjb3JkLWJpbmRpbmcgKCBtb2R1bGUtdGFyZ2V0IDogYmluZGluZyApCit7CisgICAgJCgubG9hZGluZ1stMV0pLl9fYmluZGluZ19fID0gJChiaW5kaW5nKSA7Cit9CisKKworIyBUcmFuc2Zvcm0gZWFjaCBwYXRoIGluIHRoZSBsaXN0LCB3aXRoIGFsbCBiYWNrc2xhc2hlcyBjb252ZXJ0ZWQgdG8gZm9yd2FyZAorIyBzbGFzaGVzIGFuZCBhbGwgZGV0ZWN0YWJsZSByZWR1bmRhbmN5IHJlbW92ZWQuIFNvbWV0aGluZyBsaWtlIHRoaXMgaXMgcHJvYmFibHkKKyMgbmVlZGVkIGluIHBhdGguamFtLCBidXQgSSBhbSBub3Qgc3VyZSBvZiB0aGF0LCBJIGRvIG5vdCB1bmRlcnN0YW5kIGl0LCBhbmQgSQorIyBhbSBub3QgcmVhZHkgdG8gbW92ZSBhbGwgb2YgcGF0aC5qYW0gaW50byB0aGUga2VybmVsLgorIworbG9jYWwgcnVsZSBub3JtYWxpemUtcmF3LXBhdGhzICggcGF0aHMgKiApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBmb3IgcCBpbiAkKHBhdGhzOlQpCisgICAgeworICAgICAgICByZXN1bHQgKz0gWyBOT1JNQUxJWkVfUEFUSCAkKHApIF0gOworICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisuY3dkID0gWyBQV0QgXSA7CisKKworIyBMb2FkIHRoZSBpbmRpY2F0ZWQgbW9kdWxlIGFuZCBpbXBvcnQgcnVsZSBuYW1lcyBpbnRvIHRoZSBjdXJyZW50IG1vZHVsZS4gQW55CisjIG1lbWJlcnMgb2YgcnVsZXMtb3B0IHdpbGwgYmUgYXZhaWxhYmxlIHdpdGhvdXQgcXVhbGlmaWNhdGlvbiBpbiB0aGUgY2FsbGVyJ3MKKyMgbW9kdWxlLiBBbnkgbWVtYmVycyBvZiByZW5hbWUtb3B0IHdpbGwgYmUgdGFrZW4gYXMgdGhlIG5hbWVzIG9mIHRoZSBydWxlcyBpbgorIyB0aGUgY2FsbGVyJ3MgbW9kdWxlLCBpbiBwbGFjZSBvZiB0aGUgbmFtZXMgdGhleSBoYXZlIGluIHRoZSBpbXBvcnRlZCBtb2R1bGUuCisjIElmIHJ1bGVzLW9wdCA9ICcqJywgYWxsIHJ1bGVzIGZyb20gdGhlIGluZGljYXRlZCBtb2R1bGUgYXJlIGltcG9ydGVkIGludG8gdGhlCisjIGNhbGxlcidzIG1vZHVsZS4gSWYgcmVuYW1lLW9wdCBpcyBzdXBwbGllZCwgaXQgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZgorIyBlbGVtZW50cyBhcyBydWxlcy1vcHQuCisjCitydWxlIGltcG9ydCAoIG1vZHVsZS1uYW1lcyArIDogcnVsZXMtb3B0ICogOiByZW5hbWUtb3B0ICogKQoreworICAgIGlmICggJChydWxlcy1vcHQpID0gKiB8fCAhICQocnVsZXMtb3B0KSApICYmICQocmVuYW1lLW9wdCkKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgIlJ1bGUgYWxpYXNpbmcgaXMgb25seSBhdmFpbGFibGUgZm9yIGV4cGxpY2l0IGltcG9ydHMuIiA7CisgICAgfQorCisgICAgaWYgJChtb2R1bGUtbmFtZXNbMl0pICYmICggJChydWxlcy1vcHQpIHx8ICQocmVuYW1lLW9wdCkgKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciAiV2hlbiBsb2FkaW5nIG11bHRpcGxlIG1vZHVsZXMsIG5vIHNwZWNpZmljIHJ1bGVzIG9yIgorICAgICAgICAgICAgInJlbmFtaW5nIGlzIGFsbG93ZWQiIDsKKyAgICB9CisKKyAgICBsb2NhbCBjYWxsZXIgPSBbIENBTExFUl9NT0RVTEUgXSA7CisKKyAgICAjIEltcG9ydCBlYWNoIHNwZWNpZmllZCBtb2R1bGUKKyAgICBmb3IgbG9jYWwgbSBpbiAkKG1vZHVsZS1uYW1lcykKKyAgICB7CisgICAgICAgIGlmICEgJChtKSBpbiAkKC5sb2FkZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgSWYgdGhlIGltcG9ydGluZyBtb2R1bGUgaXMgbm90IGFscmVhZHkgaW4gdGhlIEJPT1NUX0JVSUxEX1BBVEgsCisgICAgICAgICAgICAjIHByZXBlbmQgaXQgdG8gdGhlIHBhdGguICBXZSBkbyBub3Qgd2FudCB0byBpbnZlcnQgdGhlIHNlYXJjaCBvcmRlcgorICAgICAgICAgICAgIyBvZiBtb2R1bGVzIHRoYXQgYXJlIGFscmVhZHkgdGhlcmUuCisKKyAgICAgICAgICAgIGxvY2FsIGNhbGxlci1sb2NhdGlvbiA7CisgICAgICAgICAgICBpZiAkKGNhbGxlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsZXItbG9jYXRpb24gPSBbIGJpbmRpbmcgJChjYWxsZXIpIF0gOworICAgICAgICAgICAgICAgIGNhbGxlci1sb2NhdGlvbiA9ICQoY2FsbGVyLWxvY2F0aW9uOkQpIDsKKyAgICAgICAgICAgICAgICBjYWxsZXItbG9jYXRpb24gPSBbIG5vcm1hbGl6ZS1yYXctcGF0aHMKKyAgICAgICAgICAgICAgICAgICAgJChjYWxsZXItbG9jYXRpb246Uj0kKC5jd2QpKSBdIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9jYWwgc2VhcmNoID0gWyBwZWVrIDogQk9PU1RfQlVJTERfUEFUSCBdIDsKKyAgICAgICAgICAgIHNlYXJjaCA9IFsgbm9ybWFsaXplLXJhdy1wYXRocyAkKHNlYXJjaDpSPSQoLmN3ZCkpIF0gOworCisgICAgICAgICAgICBpZiAkKGNhbGxlci1sb2NhdGlvbikgJiYgISAkKGNhbGxlci1sb2NhdGlvbikgaW4gJChzZWFyY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VhcmNoID0gJChjYWxsZXItbG9jYXRpb24pICQoc2VhcmNoKSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvYWQgJChtKSA6IDogJChzZWFyY2gpIDsKKyAgICAgICAgfQorCisgICAgICAgIElNUE9SVF9NT0RVTEUgJChtKSA6ICQoY2FsbGVyKSA7CisKKyAgICAgICAgaWYgJChydWxlcy1vcHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHNvdXJjZS1uYW1lcyA7CisgICAgICAgICAgICBpZiAkKHJ1bGVzLW9wdCkgPSAqCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWwgYWxsLXJ1bGVzID0gWyBSVUxFTkFNRVMgJChtKSBdIDsKKyAgICAgICAgICAgICAgICBzb3VyY2UtbmFtZXMgPSAkKGFsbC1ydWxlcykgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNvdXJjZS1uYW1lcyA9ICQocnVsZXMtb3B0KSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NhbCB0YXJnZXQtbmFtZXMgPSAkKHJlbmFtZS1vcHQpIDsKKyAgICAgICAgICAgIHRhcmdldC1uYW1lcyA/PSAkKHNvdXJjZS1uYW1lcykgOworICAgICAgICAgICAgSU1QT1JUICQobSkgOiAkKHNvdXJjZS1uYW1lcykgOiAkKGNhbGxlcikgOiAkKHRhcmdldC1uYW1lcykgOworICAgICAgICB9CisgICAgfQorfQorCisKKyMgRGVmaW5lIGV4cG9ydGVkIGNvcGllcyBpbiAkKHRhcmdldC1tb2R1bGUpIG9mIGFsbCBydWxlcyBleHBvcnRlZCBmcm9tCisjICQoc291cmNlLW1vZHVsZSkuIEFsc28gbWFrZSB0aGVtIGF2YWlsYWJsZSBpbiB0aGUgZ2xvYmFsIG1vZHVsZSB3aXRoCisjIHF1YWxpZmljYXRpb24sIHNvIHRoYXQgaXQgaXMganVzdCBhcyB0aG91Z2ggdGhlIHJ1bGVzIHdlcmUgZGVmaW5lZCBvcmlnaW5hbGx5CisjIGluICQodGFyZ2V0LW1vZHVsZSkuCisjCitydWxlIGNsb25lLXJ1bGVzICggc291cmNlLW1vZHVsZSB0YXJnZXQtbW9kdWxlICkKK3sKKyAgICBsb2NhbCByID0gWyBSVUxFTkFNRVMgJChzb3VyY2UtbW9kdWxlKSBdIDsKKyAgICBJTVBPUlQgJChzb3VyY2UtbW9kdWxlKSA6ICQocikgOiAkKHRhcmdldC1tb2R1bGUpIDogJChyKSA6IExPQ0FMSVpFIDsKKyAgICBFWFBPUlQgJCh0YXJnZXQtbW9kdWxlKSA6ICQocikgOworICAgIElNUE9SVCAkKHRhcmdldC1tb2R1bGUpIDogJChyKSA6IDogJCh0YXJnZXQtbW9kdWxlKS4kKHIpIDsKK30KKworCisjIFRoZXNlIHJ1bGVzIG5lZWQgdG8gYmUgYXZhaWxhYmxlIGluIGFsbCBtb2R1bGVzIHRvIGltcGxlbWVudCBtb2R1bGUgbG9hZGluZworIyBpdHNlbGYgYW5kIG90aGVyIGZ1bmRhbWVudGFsIG9wZXJhdGlvbnMuCitsb2NhbCBnbG9iYWxpemUgPSBwZWVrIHBva2UgcmVjb3JkLWJpbmRpbmcgOworSU1QT1JUIG1vZHVsZXMgOiAkKGdsb2JhbGl6ZSkgOiA6IG1vZHVsZXMuJChnbG9iYWxpemUpIDsKKworCitydWxlIF9fdGVzdF9fICggKQoreworICAgIGltcG9ydCBhc3NlcnQgOworICAgIGltcG9ydCBtb2R1bGVzIDogbm9ybWFsaXplLXJhdy1wYXRocyA7CisKKyAgICBtb2R1bGUgbW9kdWxlcy5fX3Rlc3RfXworICAgIHsKKyAgICAgICAgZm9vID0gYmFyIDsKKyAgICB9CisKKyAgICBhc3NlcnQucmVzdWx0IGJhciA6IHBlZWsgbW9kdWxlcy5fX3Rlc3RfXyA6IGZvbyA7CisKKyAgICBwb2tlIG1vZHVsZXMuX190ZXN0X18gOiBmb28gOiBiYXIgYmF6IDsKKyAgICBhc3NlcnQucmVzdWx0IGJhciBiYXogOiBwZWVrIG1vZHVsZXMuX190ZXN0X18gOiBmb28gOworCisgICAgYXNzZXJ0LnJlc3VsdCBjOi9mb28vYmFyIDogbm9ybWFsaXplLXJhdy1wYXRocyBjOi94Ly4uL2Zvby8uL3h4L3l5Ly4uLy4uL2JhciA7CisgICAgYXNzZXJ0LnJlc3VsdCAuICAgICAgICAgIDogbm9ybWFsaXplLXJhdy1wYXRocyAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgYXNzZXJ0LnJlc3VsdCAuLiAgICAgICAgIDogbm9ybWFsaXplLXJhdy1wYXRocyAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgYXNzZXJ0LnJlc3VsdCAuLi8uLiAgICAgIDogbm9ybWFsaXplLXJhdy1wYXRocyAuLi8uLiAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgYXNzZXJ0LnJlc3VsdCAuLiAgICAgICAgIDogbm9ybWFsaXplLXJhdy1wYXRocyAuLy4uICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgYXNzZXJ0LnJlc3VsdCAvIC8gICAgICAgIDogbm9ybWFsaXplLXJhdy1wYXRocyAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgYXNzZXJ0LnJlc3VsdCBhICAgICAgICAgIDogbm9ybWFsaXplLXJhdy1wYXRocyBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgYXNzZXJ0LnJlc3VsdCBhICAgICAgICAgIDogbm9ybWFsaXplLXJhdy1wYXRocyBhLyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgYXNzZXJ0LnJlc3VsdCAvYSAgICAgICAgIDogbm9ybWFsaXplLXJhdy1wYXRocyAvYS8gICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgYXNzZXJ0LnJlc3VsdCAvICAgICAgICAgIDogbm9ybWFsaXplLXJhdy1wYXRocyAvYS8uLiAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL29wdGlvbnMvaGVscC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL29wdGlvbnMvaGVscC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwN2UxZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvb3B0aW9ucy9oZWxwLmphbQpAQCAtMCwwICsxLDIxMiBAQAorIyBDb3B5cmlnaHQgMjAwMyBEYXZlIEFicmFoYW1zIAorIyBDb3B5cmlnaHQgMjAwMywgMjAwNiBSZW5lIFJpdmVyYSAKKyMgQ29weXJpZ2h0IDIwMDMsIDIwMDYgVmxhZGltaXIgUHJ1cyAKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAKKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworIyBUaGlzIG1vZHVsZSBpcyB0aGUgcGx1Zy1pbiBoYW5kbGVyIGZvciB0aGUgLS1oZWxwIGFuZCAtLWhlbHAtLioKKyMgY29tbWFuZC1saW5lIG9wdGlvbnMKK2ltcG9ydCBtb2R1bGVzIDsKK2ltcG9ydCBhc3NlcnQgOworaW1wb3J0IGRvYyA6IGRvLXNjYW4gc2V0LW9wdGlvbiBzZXQtb3V0cHV0IHNldC1vdXRwdXQtZmlsZSBwcmludC1oZWxwLXVzYWdlIHByaW50LWhlbHAtdG9wIDsKK2ltcG9ydCBzZXF1ZW5jZSA7CitpbXBvcnQgc2V0IDsKK2ltcG9ydCBwcm9qZWN0IDsKK2ltcG9ydCBwcmludCA7CitpbXBvcnQgb3MgOworaW1wb3J0IHZlcnNpb24gOworaW1wb3J0IHBhdGggOworCisjIExpc3Qgb2YgcG9zc2libGUgbW9kdWxlcywgYnV0IHdoaWNoIHJlYWxseSBhcmVuJ3QuCisjCisubm90LW1vZHVsZXMgPQorICAgIGJvb3N0LWJ1aWxkIGJvb3RzdHJhcCBzaXRlLWNvbmZpZyB0ZXN0IHVzZXItY29uZmlnCisgICAgLXRvb2xzIGFsbHlvdXJiYXNlIGJvb3N0LWJhc2UgZmVhdHVyZXMgcHl0aG9uIHN0bHBvcnQgdGVzdGluZyB1bml0LXRlc3RzIDsKKworIyBUaGUgaGVscCBzeXN0ZW0gb3B0aW9ucyBhcmUgcGFyc2VkIGhlcmUgYW5kIGhhbmRlZCBvZmYgdG8gdGhlIGRvYworIyBtb2R1bGUgdG8gdHJhbnNsYXRlIGludG8gZG9jdW1lbnRhdGlvbiByZXF1ZXN0cyBhbmQgYWN0aW9ucy4gVGhlCisjIHVuZGVyc3Rvb2Qgb3B0aW9ucyBhcmU6CisjCisjICAgIC0taGVscC1kaXNhYmxlLTxvcHRpb24+CisjICAgIC0taGVscC1kb2Mtb3B0aW9ucworIyAgICAtLWhlbHAtZW5hYmxlLTxvcHRpb24+CisjICAgIC0taGVscC1pbnRlcm5hbAorIyAgICAtLWhlbHAtb3B0aW9ucworIyAgICAtLWhlbHAtdXNhZ2UKKyMgICAgLS1oZWxwLW91dHB1dCA8dHlwZT4KKyMgICAgLS1oZWxwLW91dHB1dC1maWxlIDxmaWxlPgorIyAgICAtLWhlbHAgWzxtb2R1bGUtb3ItY2xhc3M+XQorIworcnVsZSBwcm9jZXNzICgKKyAgICBjb21tYW5kICMgVGhlIG9wdGlvbi4KKyAgICA6IHZhbHVlcyAqICMgVGhlIHZhbHVlcywgc3RhcnRpbmcgYWZ0ZXIgdGhlICI9Ii4KKyAgICApCit7CisgICAgYXNzZXJ0LnJlc3VsdCAtLWhlbHAgOiBNQVRDSCBeKC0taGVscCkuKiA6ICQoY29tbWFuZCkgOworICAgIGxvY2FsIGRpZC1oZWxwID0gOworICAgIHN3aXRjaCAkKGNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIC0taGVscC1pbnRlcm5hbCA6CisgICAgICAgIGxvY2FsIHBhdGgtdG8tbW9kdWxlcyA9IFsgbW9kdWxlcy5wZWVrIDogQk9PU1RfQlVJTERfUEFUSCBdIDsKKyAgICAgICAgcGF0aC10by1tb2R1bGVzID89IC4gOworICAgICAgICBsb2NhbCBwb3NzaWJsZS1tb2R1bGVzID0gWyBHTE9CICQocGF0aC10by1tb2R1bGVzKSA6ICpcXC5qYW0gXSA7CisgICAgICAgIGxvY2FsIG5vdC1tb2R1bGVzID0gWyBHTE9CICQocGF0aC10by1tb2R1bGVzKSA6ICokKC5ub3QtbW9kdWxlcylcXC5qYW0gXSA7CisgICAgICAgIGxvY2FsIG1vZHVsZXMtdG8tbGlzdCA9CisgICAgICAgICAgICBbIHNlcXVlbmNlLmluc2VydGlvbi1zb3J0CisgICAgICAgICAgICAgICAgWyBzZXQuZGlmZmVyZW5jZSAkKHBvc3NpYmxlLW1vZHVsZXM6RD06Uz0pIDogJChub3QtbW9kdWxlczpEPTpTPSkgXSBdIDsKKyAgICAgICAgbG9jYWwgbW9kdWxlcy10by1zY2FuIDsKKyAgICAgICAgZm9yIGxvY2FsIG0gaW4gJChtb2R1bGVzLXRvLWxpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIG1vZHVsZS1maWxlcyA9IFsgR0xPQiAkKHBhdGgtdG8tbW9kdWxlcykgOiAkKG0pXFwuamFtIF0gOworICAgICAgICAgICAgbW9kdWxlcy10by1zY2FuICs9ICQobW9kdWxlLWZpbGVzWzFdKSA7CisgICAgICAgIH0KKyAgICAgICAgZG8tc2NhbiAkKG1vZHVsZXMtdG8tc2NhbikgOiBwcmludC1oZWxwLWFsbCA7CisgICAgICAgIGRpZC1oZWxwID0gdHJ1ZSA7CisKKyAgICAgICAgY2FzZSAtLWhlbHAtZW5hYmxlLSogOgorICAgICAgICBsb2NhbCBvcHRpb24gPSBbIE1BVENIIC0taGVscC1lbmFibGUtKC4qKSA6ICQoY29tbWFuZCkgXSA7IG9wdGlvbiA9ICQob3B0aW9uOkwpIDsKKyAgICAgICAgc2V0LW9wdGlvbiAkKG9wdGlvbikgOiBlbmFibGVkIDsKKyAgICAgICAgZGlkLWhlbHAgPSB0cnVlIDsKKworICAgICAgICBjYXNlIC0taGVscC1kaXNhYmxlLSogOgorICAgICAgICBsb2NhbCBvcHRpb24gPSBbIE1BVENIIC0taGVscC1kaXNhYmxlLSguKikgOiAkKGNvbW1hbmQpIF0gOyBvcHRpb24gPSAkKG9wdGlvbjpMKSA7CisgICAgICAgIHNldC1vcHRpb24gJChvcHRpb24pIDsKKyAgICAgICAgZGlkLWhlbHAgPSB0cnVlIDsKKworICAgICAgICBjYXNlIC0taGVscC1vdXRwdXQgOgorICAgICAgICBzZXQtb3V0cHV0ICQodmFsdWVzWzFdKSA7CisgICAgICAgIGRpZC1oZWxwID0gdHJ1ZSA7CisKKyAgICAgICAgY2FzZSAtLWhlbHAtb3V0cHV0LWZpbGUgOgorICAgICAgICBzZXQtb3V0cHV0LWZpbGUgJCh2YWx1ZXNbMV0pIDsKKyAgICAgICAgZGlkLWhlbHAgPSB0cnVlIDsKKworICAgICAgICBjYXNlIC0taGVscC1kb2Mtb3B0aW9ucyA6CisgICAgICAgIGxvY2FsIGRvYy1tb2R1bGUtc3BlYyA9IFsgc3BsaXQtc3ltYm9sIGRvYyBdIDsKKyAgICAgICAgZG8tc2NhbiAkKGRvYy1tb2R1bGUtc3BlY1sxXSkgOiBwcmludC1oZWxwLW9wdGlvbnMgOworICAgICAgICBkaWQtaGVscCA9IHRydWUgOworCisgICAgICAgIGNhc2UgLS1oZWxwLW9wdGlvbnMgOgorICAgICAgICBwcmludC1oZWxwLXVzYWdlIDsKKyAgICAgICAgZGlkLWhlbHAgPSB0cnVlIDsKKworICAgICAgICBjYXNlIC0taGVscCA6CisgICAgICAgIGxvY2FsIHNwZWMgPSAkKHZhbHVlc1sxXSkgOworICAgICAgICBpZiAkKHNwZWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHNwZWMtcGFydHMgPSBbIHNwbGl0LXN5bWJvbCAkKHNwZWMpIF0gOworICAgICAgICAgICAgaWYgJChzcGVjLXBhcnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICQoc3BlYy1wYXJ0c1syXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvLXNjYW4gJChzcGVjLXBhcnRzWzFdKSA6IHByaW50LWhlbHAtY2xhc3NlcyAkKHNwZWMtcGFydHNbMl0pIDsKKyAgICAgICAgICAgICAgICAgICAgZG8tc2NhbiAkKHNwZWMtcGFydHNbMV0pIDogcHJpbnQtaGVscC1ydWxlcyAkKHNwZWMtcGFydHNbMl0pIDsKKyAgICAgICAgICAgICAgICAgICAgZG8tc2NhbiAkKHNwZWMtcGFydHNbMV0pIDogcHJpbnQtaGVscC12YXJpYWJsZXMgJChzcGVjLXBhcnRzWzJdKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvLXNjYW4gJChzcGVjLXBhcnRzWzFdKSA6IHByaW50LWhlbHAtbW9kdWxlIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVhJVCAiVW5yZWNvZ25pemVkIGhlbHAgb3B0aW9uICciJChjb21tYW5kKSIgIiQoc3BlYykiJy4iIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcnNpb24ucHJpbnQgOworICAgICAgICAgICAgRUNITyA7CisgICAgICAgICAgICAjIEZpcnN0IHByaW50IGRvY3VtZW50YXRpb24gZnJvbSB0aGUgY3VycmVudCBKYW1maWxlLCBpZiBhbnkuICAgICAgICAgICAgCisgICAgICAgICAgICAjIEZJWE1FOiBHZW5lcmFsbHksIHRoaXMgZHVwbGljYXRpb24gb2YgcHJvamVjdC5qYW0gbG9naWMgaXMgYmFkLgorICAgICAgICAgICAgbG9jYWwgbmFtZXMgPSBbIG1vZHVsZXMucGVlayBwcm9qZWN0IDogSkFNUk9PVCBdCisgICAgICAgICAgICAgIFsgbW9kdWxlcy5wZWVrIHByb2plY3QgOiBKQU1GSUxFIF0gOworICAgICAgICAgICAgbG9jYWwgcHJvamVjdC1maWxlID0gWyBwYXRoLmdsb2IgLiA6ICQobmFtZXMpIF0gOworICAgICAgICAgICAgaWYgISAkKHByb2plY3QtZmlsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm9qZWN0LWZpbGUgPSBbIHBhdGguZ2xvYi1pbi1wYXJlbnRzIC4gOiAkKG5hbWVzKSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIGxvY2FsIHAgaW4gJChwcm9qZWN0LWZpbGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG8tc2NhbiAkKHApIDogcHJpbnQtaGVscC1wcm9qZWN0ICQocCkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAjIE5leHQgYW55IHVzZXItY29uZmlnIGhlbHAuCisgICAgICAgICAgICBsb2NhbCB1c2VyLXBhdGggPSBbIG9zLmhvbWUtZGlyZWN0b3JpZXMgXSBbIG9zLmVudmlyb24gQk9PU1RfQlVJTERfUEFUSCBdIDsKKyAgICAgICAgICAgIGxvY2FsIHVzZXItY29uZmlnID0gWyBHTE9CICQodXNlci1wYXRoKSA6IHVzZXItY29uZmlnLmphbSBdIDsKKyAgICAgICAgICAgIGlmICQodXNlci1jb25maWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG8tc2NhbiAkKHVzZXItY29uZmlnWzFdKSA6IHByaW50LWhlbHAtY29uZmlnIHVzZXIgJCh1c2VyLWNvbmZpZ1sxXSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAjIE5leHQgYW55IHNpdGUtY29uZmlnIGhlbHAuCisgICAgICAgICAgICBsb2NhbCBzaXRlLWNvbmZpZyA9IFsgR0xPQiAkKHVzZXItcGF0aCkgOiBzaXRlLWNvbmZpZy5qYW0gXSA7CisgICAgICAgICAgICBpZiAkKHNpdGUtY29uZmlnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvLXNjYW4gJChzaXRlLWNvbmZpZ1sxXSkgOiBwcmludC1oZWxwLWNvbmZpZyBzaXRlICQoc2l0ZS1jb25maWdbMV0pIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBUaGVuIHRoZSBvdmVyYWxsIGhlbHAuCisgICAgICAgICAgICBwcmludC1oZWxwLXRvcCA7CisgICAgICAgIH0KKyAgICAgICAgZGlkLWhlbHAgPSB0cnVlIDsKKyAgICB9CisgICAgaWYgJChkaWQtaGVscCkKKyAgICB7CisgICAgICAgIFVQREFURSBhbGwgOworICAgICAgICBOT0NBUkUgYWxsIDsKKyAgICB9CisgICAgcmV0dXJuICQoZGlkLWhlbHApIDsKK30KKworIyBTcGxpdCBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBpbnRvIG1vZHVsZSBhbmQgc3ltYm9sIHBhcnRzLgorIworbG9jYWwgcnVsZSBzcGxpdC1zeW1ib2wgKAorICAgIHN5bWJvbCAjIFRoZSBzeW1ib2wgdG8gc3BsaXQuCisgICAgKQoreworICAgIGxvY2FsIHBhdGgtdG8tbW9kdWxlcyA9IFsgbW9kdWxlcy5wZWVrIDogQk9PU1RfQlVJTERfUEFUSCBdIDsKKyAgICBwYXRoLXRvLW1vZHVsZXMgPz0gLiA7CisgICAgbG9jYWwgbW9kdWxlLW5hbWUgPSAkKHN5bWJvbCkgOworICAgIGxvY2FsIHN5bWJvbC1uYW1lID0gOworICAgIGxvY2FsIHJlc3VsdCA9IDsKKyAgICB3aGlsZSAhICQocmVzdWx0KQorICAgIHsKKyAgICAgICAgbG9jYWwgbW9kdWxlLXBhdGggPSBbIEdMT0IgJChwYXRoLXRvLW1vZHVsZXMpIDogJChtb2R1bGUtbmFtZSlcXC5qYW0gXSA7CisgICAgICAgIGlmICQobW9kdWxlLXBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgVGhlICdtb2R1bGUtbmFtZScgaW4gZmFjdCByZWZlcnMgdG8gbW9kdWxlLiBSZXR1cm4gdGhlIGZ1bGwKKyAgICAgICAgICAgICMgbW9kdWxlIHBhdGggYW5kIGEgc3ltYm9sIHdpdGhpbiBpdC4gSWYgJ3N5bWJvbCcgcGFzc2VkIHRvIHRoaXMKKyAgICAgICAgICAgICMgcnVsZSBpcyBhbHJlYWR5IG1vZHVsZSwgJ3N5bWJvbC1uYW1lJyB3aWxsIGJlIGVtcHR5LiBPdGhlcndpc2UsCisgICAgICAgICAgICAjIGl0J3MgaW5pdGlhbGl6ZWQgb24gdGhlIHByZXZpb3VzIGxvb3AgaXRlcmF0aW9uLgorICAgICAgICAgICAgIyBJbiBjYXNlIHRoZXJlIGFyZSBzZXZlcmFsIG1vZHVsZXMgYnkgdGhpcyBuYW1lLAorICAgICAgICAgICAgIyB1c2UgdGhlIGZpcnN0IG9uZS4KKyAgICAgICAgICAgIHJlc3VsdCA9ICQobW9kdWxlLXBhdGhbMV0pICQoc3ltYm9sLW5hbWUpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICEgJChtb2R1bGUtbmFtZTpTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0gOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsIG5leHQtc3ltYm9sLXBhcnQgPSBbIE1BVENIIF4uKC4qKSA6ICQobW9kdWxlLW5hbWU6UykgXSA7CisgICAgICAgICAgICAgICAgaWYgJChzeW1ib2wtbmFtZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5bWJvbC1uYW1lID0gJChuZXh0LXN5bWJvbC1wYXJ0KS4kKHN5bWJvbC1uYW1lKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5bWJvbC1uYW1lID0gJChuZXh0LXN5bWJvbC1wYXJ0KSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1vZHVsZS1uYW1lID0gJChtb2R1bGUtbmFtZTpCKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgJChyZXN1bHQpICE9IC0KKyAgICB7CisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvc2l0ZS1jb25maWcuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC9zaXRlLWNvbmZpZy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmZTUyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvc2l0ZS1jb25maWcuamFtCkBAIC0wLDAgKzEsMTEgQEAKKyMgQ29weXJpZ2h0IDE5OTktMjAxMiBHZW50b28gRm91bmRhdGlvbgorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIAorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisjIERlZmluZSB0d28gbmV3IHZhcmlhbnRzIHRvIGJlIHVzZWQgd2hlbiBidWlsZGluZyBib29zdCAob3Igc2VwYXJhdGUgYm9vc3QtbGlicykKKyMgb24gR2VudG9vLiBUaGUgdHdvIHZhcmlhbnRzIG1ha2UgdXNlIG9mIEdlbnRvby1zcGVjaWZpYyBvcHRpbWl6YXRpb24gYW5kIGRlYnVnLXN5bWJvbHMKKyMgdmFsdWVzICJub25lIiB3aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIG9mZmljaWFsIGJvb3N0IGRpc3RyaWJ1dGlvbi4KKyMgRE8gTk9UIFJFTFkgT04gVEhFIEZPTExPV0lORyBWQVJJQU5UUyBUTyBCRSBQUkVTRU5UIE9OIE9USEVSIE9TIQordmFyaWFudCBnZW50b29yZWxlYXNlIDogcmVsZWFzZSA6IDxvcHRpbWl6YXRpb24+bm9uZSA8ZGVidWctc3ltYm9scz5ub25lIDxydW50aW1lLWxpbms+c2hhcmVkIDsKK3ZhcmlhbnQgZ2VudG9vZGVidWcgICA6IGRlYnVnICAgOiA8b3B0aW1pemF0aW9uPm5vbmUgPGRlYnVnLXN5bWJvbHM+b24gICA8cnVudGltZS1saW5rPnNoYXJlZCA7CisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvYWNjLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvYWNjLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDRjOWRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9hY2MuamFtCkBAIC0wLDAgKzEsMTE4IEBACisjIENvcHlyaWdodCBWbGFkaW1pciBQcnVzIDIwMDQuCisjIENvcHlyaWdodCBUb29uIEtuYXBlbiAyMDA0LgorIyBDb3B5cmlnaHQgQm9yaXMgR3ViZW5rbyAyMDA3LgorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0CisjIG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjCisjIEJvb3N0LkJ1aWxkIFYyIHRvb2xzZXQgZm9yIHRoZSBIUCBhQysrIGNvbXBpbGVyLgorIworCitpbXBvcnQgdG9vbHNldCA6IGZsYWdzIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBjb21tb24gOworCitmZWF0dXJlLmV4dGVuZCB0b29sc2V0IDogYWNjIDsKK3Rvb2xzZXQuaW5oZXJpdCBhY2MgOiB1bml4IDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgYnVpbHRpbi5saWItZ2VuZXJhdG9yIDogYWNjLnByZWJ1aWx0IDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgYWNjLnNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOiBzZWFyY2hlZC1saWItZ2VuZXJhdG9yIDsKKworIyBDb25maWd1cmVzIHRoZSBhY2MgdG9vbHNldC4KK3J1bGUgaW5pdCAoIHZlcnNpb24gPyA6IHVzZXItcHJvdmlkZWQtY29tbWFuZCAqIDogb3B0aW9ucyAqICkKK3sKKyAgICBsb2NhbCBjb25kaXRpb24gPSBbIGNvbW1vbi5jaGVjay1pbml0LXBhcmFtZXRlcnMgYWNjCisgICAgICAgIDogdmVyc2lvbiAkKHZlcnNpb24pIF0gOworCisgICAgbG9jYWwgY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgYWNjIDogYUNDCisgICAgICAgIDogJCh1c2VyLXByb3ZpZGVkLWNvbW1hbmQpIF0gOworCisgICAgY29tbW9uLmhhbmRsZS1vcHRpb25zIGFjYyA6ICQoY29uZGl0aW9uKSA6ICQoY29tbWFuZCkgOiAkKG9wdGlvbnMpIDsKK30KKworCisjIERlY2xhcmUgZ2VuZXJhdG9ycworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIGFjYy5jb21waWxlLmMgOiBDIDogT0JKIDogPHRvb2xzZXQ+YWNjIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBhY2MuY29tcGlsZS5jKysgOiBDUFAgOiBPQkogOiA8dG9vbHNldD5hY2MgOworCisjIERlY2xhcmUgZmxhZ3MuCitmbGFncyBhY2MgQ0ZMQUdTIDxvcHRpbWl6YXRpb24+b2ZmIDogOworZmxhZ3MgYWNjIENGTEFHUyA8b3B0aW1pemF0aW9uPnNwZWVkIDogLU8zIDsKK2ZsYWdzIGFjYyBDRkxBR1MgPG9wdGltaXphdGlvbj5zcGFjZSA6IC1PMiA7CisKK2ZsYWdzIGFjYyBDRkxBR1MgPGlubGluaW5nPm9mZiA6ICtkIDsKK2ZsYWdzIGFjYyBDRkxBR1MgPGlubGluaW5nPm9uIDogOworZmxhZ3MgYWNjIENGTEFHUyA8aW5saW5pbmc+ZnVsbCA6IDsKKworZmxhZ3MgYWNjIEMrK0ZMQUdTIDxleGNlcHRpb24taGFuZGxpbmc+b2ZmIDogOworZmxhZ3MgYWNjIEMrK0ZMQUdTIDxleGNlcHRpb24taGFuZGxpbmc+b24gOiA7CisKK2ZsYWdzIGFjYyBDKytGTEFHUyA8cnR0aT5vZmYgOiA7CitmbGFncyBhY2MgQysrRkxBR1MgPHJ0dGk+b24gOiA7CisKKyMgV2Ugd2FudCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBzb3VyY2VzIGluIHRoZSBkZWJ1ZyBzeW1ib2xzIGJlY2F1c2Ugb3RoZXJ3aXNlCisjIHRoZSBkZWJ1Z2dlciB3b24ndCBmaW5kIHRoZSBzb3VyY2VzIHdoZW4gd2UgdXNlIGJvb3N0LmJ1aWxkLgorZmxhZ3MgYWNjIENGTEFHUyA8ZGVidWctc3ltYm9scz5vbiA6IC1nIDsKK2ZsYWdzIGFjYyBMSU5LRkxBR1MgPGRlYnVnLXN5bWJvbHM+b24gOiAtZyA7CitmbGFncyBhY2MgTElOS0ZMQUdTIDxkZWJ1Zy1zeW1ib2xzPm9mZiA6IC1zIDsKKworIyBWMiBkb2VzIG5vdCBoYXZlIDxzaGFyZWQtbGlua2FibGU+LCBub3Qgc3VyZSB3aGF0IHRoaXMgbWVhbnQgaW4gVjEuCisjIGZsYWdzIGFjYyBDRkxBR1MgPHNoYXJlZC1saW5rYWJsZT50cnVlIDogK1ogOworCitmbGFncyBhY2MgQ0ZMQUdTIDxwcm9maWxpbmc+b24gOiAtcGcgOworZmxhZ3MgYWNjIExJTktGTEFHUyA8cHJvZmlsaW5nPm9uIDogLXBnIDsKKworZmxhZ3MgYWNjIENGTEFHUyA8YWRkcmVzcy1tb2RlbD42NCA6ICtERDY0IDsKK2ZsYWdzIGFjYyBMSU5LRkxBR1MgPGFkZHJlc3MtbW9kZWw+NjQgOiArREQ2NCA7CisKKyMgSXQgaXMgdW5rbm93biBpZiB0aGVyZSdzIHNlcGFyYXRlIG9wdGlvbiBmb3IgcnBhdGggdXNlZCBvbmx5CisjIGF0IGxpbmsgdGltZSwgc2ltaWxhciB0byAtcnBhdGgtbGluayBpbiBHTlUuIFdlJ2xsIHVzZSAtTC4KK2ZsYWdzIGFjYyBSUEFUSF9MSU5LIDogPHhkbGwtcGF0aD4gOworCitmbGFncyBhY2MgQ0ZMQUdTIDxjZmxhZ3M+IDsKK2ZsYWdzIGFjYyBDKytGTEFHUyA8Y3h4ZmxhZ3M+IDsKK2ZsYWdzIGFjYyBERUZJTkVTIDxkZWZpbmU+IDsKK2ZsYWdzIGFjYyBVTkRFRlMgPHVuZGVmPiA7CitmbGFncyBhY2MgSERSUyA8aW5jbHVkZT4gOworZmxhZ3MgYWNjIFNUREhEUlMgPHN5c2luY2x1ZGU+IDsKK2ZsYWdzIGFjYyBMSU5LRkxBR1MgPGxpbmtmbGFncz4gOworZmxhZ3MgYWNjIEFSRkxBR1MgPGFyZmxhZ3M+IDsKKworZmxhZ3MgYWNjIExJQlBBVEggPGxpYnJhcnktcGF0aD4gOworZmxhZ3MgYWNjIE5FRURMSUJTIDxsaWJyYXJ5LWZpbGU+IDsKK2ZsYWdzIGFjYyBGSU5ETElCUyA8ZmluZC1zaGFyZWQtbGlicmFyeT4gOworZmxhZ3MgYWNjIEZJTkRMSUJTIDxmaW5kLXN0YXRpYy1saWJyYXJ5PiA7CisKKyMgU2VsZWN0IHRoZSBjb21waWxlciBuYW1lIGFjY29yZGluZyB0byB0aGUgdGhyZWFkaW5nIG1vZGVsLgorZmxhZ3MgYWNjIENGTEFHUyA8dGhyZWFkaW5nPm11bHRpIDogLW10ICAgOworZmxhZ3MgYWNjIExJTktGTEFHUyA8dGhyZWFkaW5nPm11bHRpIDogLW10IDsKKworZmxhZ3MgYWNjLmNvbXBpbGUuYysrIFRFTVBMQVRFX0RFUFRIIDxjKystdGVtcGxhdGUtZGVwdGg+IDsKKworCithY3Rpb25zIGFjYy5saW5rIGJpbmQgTkVFRExJQlMKK3sKKyAgICAkKENPTkZJR19DT01NQU5EKSAtQUEgJChMSU5LRkxBR1MpIC1vICIkKDxbMV0pIiAtTCIkKFJQQVRIX0xJTkspIiAtTCQoTElCUEFUSCkgLUwkKFNURExJQlBBVEgpICIkKD4pIiAiJChORUVETElCUykiICIkKE5FRURMSUJTKSIgLWwkKEZJTkRMSUJTKSAkKE9QVElPTlMpCit9CisKK1NQQUNFID0gIiAiIDsKK2FjdGlvbnMgYWNjLmxpbmsuZGxsIGJpbmQgTkVFRExJQlMKK3sKKyAgICAkKENPTkZJR19DT01NQU5EKSAtQUEgLWIgJChMSU5LRkxBR1MpIC1vICIkKDxbMV0pIiAtTCIkKFJQQVRIX0xJTkspIiAtV2wsK2gkKDxbLTFdOkQ9KSAtTCQoTElCUEFUSCkgLUwkKFNURExJQlBBVEgpICIkKD4pIiAiJChORUVETElCUykiICIkKE5FRURMSUJTKSIgLWwkKEZJTkRMSUJTKSAkKE9QVElPTlMpCit9CisKK2FjdGlvbnMgYWNjLmNvbXBpbGUuYworeworICAgIGNjIC1jIC1JJChCT09TVF9ST09UKSAtVSQoVU5ERUZTKSAtRCQoREVGSU5FUykgJChDRkxBR1MpIC1JIiQoSERSUykiIC1JIiQoU1RESERSUykiIC1vICIkKDwpIiAiJCg+KSIgJChPUFRJT05TKQorfQorCithY3Rpb25zIGFjYy5jb21waWxlLmMrKworeworICAgICQoQ09ORklHX0NPTU1BTkQpIC1BQSAtYyAtV2MsLS1wZW5kaW5nX2luc3RhbnRpYXRpb25zPSQoVEVNUExBVEVfREVQVEgpIC1JJChCT09TVF9ST09UKSAtVSQoVU5ERUZTKSAtRCQoREVGSU5FUykgJChDRkxBR1MpICQoQysrRkxBR1MpIC1JIiQoSERSUykiIC1JIiQoU1RESERSUykiIC1vICIkKDwpIiAiJCg+KSIgJChPUFRJT05TKQorfQorCithY3Rpb25zIHVwZGF0ZWQgdG9nZXRoZXIgcGllY2VtZWFsIGFjYy5hcmNoaXZlCit7CisgICAgYXIgcnUkKEFSRkxBR1M6RT0iIikgIiQoPCkiICIkKD4pIgorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9hdXRvLWluZGV4LmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvYXV0by1pbmRleC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkMDQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvYXV0by1pbmRleC5qYW0KQEAgLTAsMCArMSwyMDQgQEAKKworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0ICJjbGFzcyIgOworaW1wb3J0IHRvb2xzZXQgOworaW1wb3J0IHRhcmdldHMgOworaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworaW1wb3J0IHByb2plY3QgOworCitmZWF0dXJlLmZlYXR1cmUgYXV0by1pbmRleCA6IG9mZiAib24iIDsKK2ZlYXR1cmUuZmVhdHVyZSBhdXRvLWluZGV4LWludGVybmFsIDogb2ZmICJvbiIgOworZmVhdHVyZS5mZWF0dXJlIGF1dG8taW5kZXgtdmVyYm9zZSA6IG9mZiAib24iIDsKK2ZlYXR1cmUuZmVhdHVyZSBhdXRvLWluZGV4LW5vLWR1cGxpY2F0ZXMgOiBvZmYgIm9uIiA7CitmZWF0dXJlLmZlYXR1cmUgYXV0by1pbmRleC1zY3JpcHQgOiA6IGZyZWUgcGF0aCA7CitmZWF0dXJlLmZlYXR1cmUgYXV0by1pbmRleC1wcmVmaXggOiA6IGZyZWUgcGF0aCA7CitmZWF0dXJlLmZlYXR1cmUgYXV0by1pbmRleC10eXBlIDogOiBmcmVlIDsKK2ZlYXR1cmUuZmVhdHVyZSBhdXRvLWluZGV4LXNlY3Rpb24tbmFtZXMgOiAib24iIG9mZiA7CisKK3Rvb2xzZXQuZmxhZ3MgYXV0by1pbmRleC5hdXRvLWluZGV4IEZMQUdTIDxhdXRvLWluZGV4LWludGVybmFsPm9uIDogLS1pbnRlcm5hbC1pbmRleCA7Cit0b29sc2V0LmZsYWdzIGF1dG8taW5kZXguYXV0by1pbmRleCBTQ1JJUFQgPGF1dG8taW5kZXgtc2NyaXB0PiA7Cit0b29sc2V0LmZsYWdzIGF1dG8taW5kZXguYXV0by1pbmRleCBQUkVGSVggPGF1dG8taW5kZXgtcHJlZml4PiA7Cit0b29sc2V0LmZsYWdzIGF1dG8taW5kZXguYXV0by1pbmRleCBJTkRFWF9UWVBFIDxhdXRvLWluZGV4LXR5cGU+IDsKK3Rvb2xzZXQuZmxhZ3MgYXV0by1pbmRleC5hdXRvLWluZGV4IEZMQUdTIDxhdXRvLWluZGV4LXZlcmJvc2U+b24gOiAtLXZlcmJvc2UgOwordG9vbHNldC5mbGFncyBhdXRvLWluZGV4LmF1dG8taW5kZXggRkxBR1MgPGF1dG8taW5kZXgtbm8tZHVwbGljYXRlcz5vbiA6IC0tbm8tZHVwbGljYXRlcyA7Cit0b29sc2V0LmZsYWdzIGF1dG8taW5kZXguYXV0by1pbmRleCBGTEFHUyA8YXV0by1pbmRleC1zZWN0aW9uLW5hbWVzPm9mZiA6IC0tbm8tc2VjdGlvbi1uYW1lcyA7CisKKyMgPGF1dG8taW5kZXgtYmluYXJ5PiBzaGVsbCBjb21tYW5kIHRvIHJ1biBBdXRvSW5kZXgKKyMgPGF1dG8taW5kZXgtYmluYXJ5LWRlcGVuZGVuY2llcz4gdGFyZ2V0cyB0byBidWlsZCBBdXRvSW5kZXggZnJvbSBzb3VyY2VzLgorZmVhdHVyZS5mZWF0dXJlIDxhdXRvLWluZGV4LWJpbmFyeT4gOiA6IGZyZWUgOworZmVhdHVyZS5mZWF0dXJlIDxhdXRvLWluZGV4LWJpbmFyeS1kZXBlbmRlbmNpZXM+IDogOiBmcmVlIGRlcGVuZGVuY3kgOworCitjbGFzcyBhdXRvLWluZGV4LWdlbmVyYXRvciA6IGdlbmVyYXRvcgoreworICAgIGltcG9ydCBjb21tb24gbW9kdWxlcyBwYXRoIHRhcmdldHMgYnVpbGQtc3lzdGVtIDsKKyAgICBydWxlIHJ1biAoIHByb2plY3QgbmFtZSA/IDogcHJvcGVydHktc2V0IDogc291cmNlcyAqICkKKyAgICB7CisgICAgICAgICMgQXV0b0luZGV4IGludm9jYXRpb24gY29tbWFuZCBhbmQgZGVwZW5kZW5jaWVzLgorICAgICAgICBsb2NhbCBhdXRvLWluZGV4LWJpbmFyeSA9IFsgbW9kdWxlcy5wZWVrIGF1dG8taW5kZXggOiAuY29tbWFuZCBdIDsKKyAgICAgICAgbG9jYWwgYXV0by1pbmRleC1iaW5hcnktZGVwZW5kZW5jaWVzIDsKKworICAgICAgICBpZiAkKGF1dG8taW5kZXgtYmluYXJ5KQorICAgICAgICB7CisgICAgICAgICAgICAjIFVzZSB1c2VyLXN1cHBsaWVkIGNvbW1hbmQuCisgICAgICAgICAgICBhdXRvLWluZGV4LWJpbmFyeSA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgYXV0by1pbmRleCA6IGF1dG8taW5kZXggOiAkKGF1dG8taW5kZXgtYmluYXJ5KSBdIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICMgU2VhcmNoIGZvciBBdXRvSW5kZXggc291cmNlcyBpbiBzZW5zaWJsZSBwbGFjZXMsIGxpa2UKKyAgICAgICAgICAgICMgICAkKEJPT1NUX1JPT1QpL3Rvb2xzL2F1dG9faW5kZXgKKyAgICAgICAgICAgICMgICAkKEJPT1NUX0JVSUxEX1BBVEgpLy4uLy4uL2F1dG9faW5kZXgKKworICAgICAgICAgICAgIyBBbmQgYnVpbGQgYXV0by1pbmRleCBleGVjdXRhYmxlIGZyb20gc291cmNlcy4KKworICAgICAgICAgICAgbG9jYWwgYm9vc3Qtcm9vdCA9IFsgbW9kdWxlcy5wZWVrIDogQk9PU1RfUk9PVCBdIDsKKyAgICAgICAgICAgIGxvY2FsIGJvb3N0LWJ1aWxkLXBhdGggPSBbIGJ1aWxkLXN5c3RlbS5sb2NhdGlvbiBdIDsKKyAgICAgICAgICAgIGxvY2FsIGJvb3N0LWJ1aWxkLXBhdGgyID0gWyBtb2R1bGVzLnBlZWsgOiBCT09TVF9CVUlMRF9QQVRIIF0gOworCisgICAgICAgICAgICBsb2NhbCBhdXRvLWluZGV4LWRpciA7CisKKyAgICAgICAgICAgIGlmICQoYm9vc3Qtcm9vdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdXRvLWluZGV4LWRpciArPSBbIHBhdGguam9pbiAkKGJvb3N0LXJvb3QpIHRvb2xzIF0gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAkKGJvb3N0LWJ1aWxkLXBhdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXV0by1pbmRleC1kaXIgKz0gJChib29zdC1idWlsZC1wYXRoKS8uLi8uLiA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAkKGJvb3N0LWJ1aWxkLXBhdGgyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF1dG8taW5kZXgtZGlyICs9ICQoYm9vc3QtYnVpbGQtcGF0aDIpLy4uIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI0VDSE8gJChhdXRvLWluZGV4LWRpcikgOworICAgICAgICAgICAgYXV0by1pbmRleC1kaXIgPSBbIHBhdGguZ2xvYiAkKGF1dG8taW5kZXgtZGlyKSA6IGF1dG9faW5kZXggXSA7CisgICAgICAgICAgICAjRUNITyAkKGF1dG8taW5kZXgtZGlyKSA7CisKKyAgICAgICAgICAgICMgSWYgdGhlIEF1dG9JbmRleCBzb3VyY2UgZGlyZWN0b3J5IHdhcyBmb3VuZCwgbWFyayBpdHMgbWFpbiB0YXJnZXQKKyAgICAgICAgICAgICMgYXMgYSBkZXBlbmRlbmN5IGZvciB0aGUgY3VycmVudCBwcm9qZWN0LiBPdGhlcndpc2UsIHRyeSB0byBmaW5kCisgICAgICAgICAgICAjICdhdXRvLWluZGV4JyBpbiB1c2VyJ3MgUEFUSAorICAgICAgICAgICAgaWYgJChhdXRvLWluZGV4LWRpcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdXRvLWluZGV4LWRpciA9IFsgcGF0aC5tYWtlICQoYXV0by1pbmRleC1kaXJbMV0pIF0gOworICAgICAgICAgICAgICAgIGF1dG8taW5kZXgtZGlyID0gJChhdXRvLWluZGV4LWRpcikvYnVpbGQgOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICNFQ0hPICQoYXV0by1pbmRleC1kaXIpIDsKKworICAgICAgICAgICAgICAgICMgR2V0IHRoZSBtYWluLXRhcmdldCBpbiBBdXRvSW5kZXggZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgIGxvY2FsIGF1dG8taW5kZXgtbWFpbi10YXJnZXQgPSBbIHRhcmdldHMucmVzb2x2ZS1yZWZlcmVuY2UgJChhdXRvLWluZGV4LWRpcikgOiAkKHByb2plY3QpIF0gOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICNFQ0hPICQoYXV0by1pbmRleC1tYWluLXRhcmdldCkgOworCisgICAgICAgICAgICAgICAgIyBUaGUgZmlyc3QgZWxlbWVudCBhcmUgYWN0dWFsIHRhcmdldHMsIHRoZSBzZWNvbmQgYXJlCisgICAgICAgICAgICAgICAgIyBwcm9wZXJ0aWVzIGZvdW5kIGluIHRhcmdldC1pZC4gV2UgZG8gbm90IGNhcmUgYWJvdXQgdGhlc2UKKyAgICAgICAgICAgICAgICAjIHNpbmNlIHdlIGhhdmUgcGFzc2VkIHRoZSBpZCBvdXJzZWx2ZXMuCisgICAgICAgICAgICAgICAgYXV0by1pbmRleC1tYWluLXRhcmdldCA9CisgICAgICAgICAgICAgICAgICAgIFsgJChhdXRvLWluZGV4LW1haW4tdGFyZ2V0WzFdKS5tYWluLXRhcmdldCBhdXRvX2luZGV4IF0gOworCisgICAgICAgICAgICAgICAgI0VDSE8gJChhdXRvLWluZGV4LW1haW4tdGFyZ2V0KSA7CisKKyAgICAgICAgICAgICAgICBhdXRvLWluZGV4LWJpbmFyeS1kZXBlbmRlbmNpZXMgPQorICAgICAgICAgICAgICAgICAgICBbICQoYXV0by1pbmRleC1tYWluLXRhcmdldCkuZ2VuZXJhdGUgWyAkKHByb3BlcnR5LXNldCkucHJvcGFnYXRlZCBdIF0gOworCisgICAgICAgICAgICAgICAgIyBJZ25vcmUgdXNhZ2UtcmVxdWlyZW1lbnRzIHJldHVybmVkIGFzIGZpcnN0IGVsZW1lbnQuCisgICAgICAgICAgICAgICAgYXV0by1pbmRleC1iaW5hcnktZGVwZW5kZW5jaWVzID0gJChhdXRvLWluZGV4LWJpbmFyeS1kZXBlbmRlbmNpZXNbMi1dKSA7CisKKyAgICAgICAgICAgICAgICAjIFNvbWUgdG9vbHNldHMgZ2VuZXJhdGUgZXh0cmEgdGFyZ2V0cyAoZS5nLiBSU1ApLiBXZSBtdXN0IG1hcmsKKyAgICAgICAgICAgICAgICAjIGFsbCB0YXJnZXRzIGFzIGRlcGVuZGVuY2llcyBmb3IgdGhlIHByb2plY3QsIGJ1dCB3ZSB3aWxsIG9ubHkKKyAgICAgICAgICAgICAgICAjIHVzZSB0aGUgRVhFIHRhcmdldCBmb3IgYXV0by1pbmRleC10by1ib29zdGJvb2sgdHJhbnNsYXRpb24uCisgICAgICAgICAgICAgICAgZm9yIGxvY2FsIHRhcmdldCBpbiAkKGF1dG8taW5kZXgtYmluYXJ5LWRlcGVuZGVuY2llcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIFsgJCh0YXJnZXQpLnR5cGUgXSA9IEVYRQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvLWluZGV4LWJpbmFyeSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgcGF0aC5uYXRpdmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgcGF0aC5qb2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICQodGFyZ2V0KS5wYXRoIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgJCh0YXJnZXQpLm5hbWUgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAiQXV0b0luZGV4IHdhcm5pbmc6IFRoZSBwYXRoIHRvIHRoZSBhdXRvLWluZGV4IGV4ZWN1dGFibGUgd2FzIiA7CisgICAgICAgICAgICAgICAgRUNITyAiICBub3QgcHJvdmlkZWQuIEFkZGl0aW9uYWxseSwgY291bGRuJ3QgZmluZCBBdXRvSW5kZXgiIDsKKyAgICAgICAgICAgICAgICBFQ0hPICIgIHNvdXJjZXMgc2VhcmNoaW5nIGluIiA7CisgICAgICAgICAgICAgICAgRUNITyAiICAgICogQk9PU1RfUk9PVC90b29scy9hdXRvLWluZGV4IiA7CisgICAgICAgICAgICAgICAgRUNITyAiICAgICogQk9PU1RfQlVJTERfUEFUSC8uLi8uLi9hdXRvLWluZGV4IiA7CisgICAgICAgICAgICAgICAgRUNITyAiICBXaWxsIG5vdyB0cnkgdG8gZmluZCBhIHByZWNvbXBpbGVkIGV4ZWN1dGFibGUgYnkgc2VhcmNoaW5nIiA7CisgICAgICAgICAgICAgICAgRUNITyAiICB0aGUgUEFUSCBmb3IgJ2F1dG8taW5kZXgnLiIgOworICAgICAgICAgICAgICAgIEVDSE8gIiAgVG8gZGlzYWJsZSB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgb3IgdG8gY29tcGxldGVseSIgOworICAgICAgICAgICAgICAgIEVDSE8gIiAgYXZvaWQgY29tcGlsYXRpb24gb2YgYXV0by1pbmRleCwgeW91IGNhbiBleHBsaWNpdGx5IHNldCB0aGUiIDsKKyAgICAgICAgICAgICAgICBFQ0hPICIgIHBhdGggdG8gYSBhdXRvLWluZGV4IGV4ZWN1dGFibGUgY29tbWFuZCBpbiB1c2VyLWNvbmZpZy5qYW0iIDsKKyAgICAgICAgICAgICAgICBFQ0hPICIgIG9yIHNpdGUtY29uZmlnLmphbSB3aXRoIHRoZSBjYWxsIiA7CisgICAgICAgICAgICAgICAgRUNITyAiICAgIHVzaW5nIGF1dG8taW5kZXggOiAvcGF0aC90by9hdXRvLWluZGV4IDsiIDsKKworICAgICAgICAgICAgICAgICMgQXMgYSBsYXN0IHJlc29ydCwgc2VhcmNoIGZvciAnYXV0by1pbmRleCcgY29tbWFuZCBpbiBwYXRoLiBOb3RlCisgICAgICAgICAgICAgICAgIyB0aGF0IGV2ZW4gaWYgdGhlICdhdXRvLWluZGV4JyBjb21tYW5kIGlzIG5vdCBmb3VuZCwKKyAgICAgICAgICAgICAgICAjIGdldC1pbnZvY2F0aW9uLWNvbW1hbmQgd2lsbCBzdGlsbCByZXR1cm4gJ2F1dG8taW5kZXgnIGFuZCBtaWdodAorICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgYW4gZXJyb3Igd2hpbGUgZ2VuZXJhdGluZyB0aGUgdmlydHVhbC10YXJnZXQuCisKKyAgICAgICAgICAgICAgICBhdXRvLWluZGV4LWJpbmFyeSA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgYXV0by1pbmRleCA6IGF1dG8taW5kZXggXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjIEFkZCAkKGF1dG8taW5kZXgtYmluYXJ5LWRlcGVuZGVuY2llcykgYXMgYSBkZXBlbmRlbmN5IG9mIHRoZSBjdXJyZW50CisgICAgICAgICMgcHJvamVjdCBhbmQgc2V0IGl0IGFzIHRoZSA8YXV0by1pbmRleC1iaW5hcnk+IGZlYXR1cmUgZm9yIHRoZQorICAgICAgICAjIGF1dG8taW5kZXgtdG8tYm9vc3Rib29rIHJ1bGUsIGJlbG93LgorICAgICAgICBwcm9wZXJ0eS1zZXQgPSBbICQocHJvcGVydHktc2V0KS5hZGQtcmF3CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4kKGF1dG8taW5kZXgtYmluYXJ5LWRlcGVuZGVuY2llcykKKyAgICAgICAgICAgIDxhdXRvLWluZGV4LWJpbmFyeT4kKGF1dG8taW5kZXgtYmluYXJ5KQorICAgICAgICAgICAgPGF1dG8taW5kZXgtYmluYXJ5LWRlcGVuZGVuY2llcz4kKGF1dG8taW5kZXgtYmluYXJ5LWRlcGVuZGVuY2llcykKKyAgICAgICAgXSA7CisgICAgICAgIAorICAgICAgICAjRUNITyAiYmluYXJ5ID0gIiAkKGF1dG8taW5kZXgtYmluYXJ5KSA7CisgICAgICAgICNFQ0hPICJkZXBlbmRlbmNpZXMgPSAiICQoYXV0by1pbmRleC1iaW5hcnktZGVwZW5kZW5jaWVzKSA7CisKKyAgICAgICAgcmV0dXJuIFsgZ2VuZXJhdG9yLnJ1biAkKHByb2plY3QpICQobmFtZSkgOiAkKHByb3BlcnR5LXNldCkgOiAkKHNvdXJjZXMpIF0gOworICAgIH0KK30KKworIyBJbml0aWFsaXphdGlvbiBvZiB0b29sc2V0LgorIworIyBQYXJhbWV0ZXJzOgorIyAgIGNvbW1hbmQgPyAgICAtPiBwYXRoIHRvIEF1dG9JbmRleCBleGVjdXRhYmxlLgorIworIyBXaGVuIGNvbW1hbmQgaXMgbm90IHN1cHBsaWVkIHRvb2xzZXQgd2lsbCBzZWFyY2ggZm9yIEF1dG9JbmRleCBkaXJlY3RvcnkgYW5kCisjIGNvbXBpbGUgdGhlIGV4ZWN1dGFibGUgZnJvbSBzb3VyY2UuIElmIHRoYXQgZmFpbHMgd2Ugc3RpbGwgc2VhcmNoIHRoZSBwYXRoIGZvcgorIyAnYXV0b19pbmRleCcuCisjCitydWxlIGluaXQgKAorICAgICAgICBjb21tYW5kID8gICAjIHBhdGggdG8gdGhlIEF1dG9JbmRleCBleGVjdXRhYmxlLgorICAgICkKK3sKKyAgICBpZiAhICQoLmluaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgLmluaXRpYWxpemVkID0gdHJ1ZSA7CisgICAgICAgIC5jb21tYW5kID0gJChjb21tYW5kKSA7CisgICAgfQorfQorCit0b29sc2V0LmZsYWdzIGF1dG8taW5kZXguYXV0by1pbmRleCBBSS1DT01NQU5EICAgICAgPGF1dG8taW5kZXgtYmluYXJ5PiA7Cit0b29sc2V0LmZsYWdzIGF1dG8taW5kZXguYXV0by1pbmRleCBBSS1ERVBFTkRFTkNJRVMgPGF1dG8taW5kZXgtYmluYXJ5LWRlcGVuZGVuY2llcz4gOworCitnZW5lcmF0b3JzLnJlZ2lzdGVyIFsgY2xhc3MubmV3IGF1dG8taW5kZXgtZ2VuZXJhdG9yIGF1dG8taW5kZXguYXV0by1pbmRleCA6IERPQ0JPT0sgOiBET0NCT09LKCUuYXV0b19pbmRleCkgOiA8YXV0by1pbmRleD5vbiBdIDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgYXV0by1pbmRleC5hdXRvLWluZGV4IDogYm9vc3Rib29rLmJvb3N0Ym9vay10by1kb2Nib29rIDsKKworcnVsZSBhdXRvLWluZGV4ICggdGFyZ2V0IDogc291cmNlIDogcHJvcGVydGllcyAqICkKK3sKKyAgICAjIFNpZ25hbCBkZXBlbmRlbmN5IG9mIGF1dG8taW5kZXggc291cmNlcyBvbiA8YXV0by1pbmRleC1iaW5hcnktZGVwZW5kZW5jaWVzPgorICAgICMgdXBvbiBpbnZvY2F0aW9uIG9mIGF1dG8taW5kZXgtdG8tYm9vc3Rib29rLgorICAgICNFQ0hPICJBSS1DT01NQU5EPSAiICQoQUktQ09NTUFORCkgOworICAgIERFUEVORFMgJCh0YXJnZXQpIDogWyBvbiAkKHRhcmdldCkgcmV0dXJuICQoQUktREVQRU5ERU5DSUVTKSBdIDsKKyAgICAjREVQRU5EUyAkKHRhcmdldCkgOiBbIG9uICQodGFyZ2V0KSByZXR1cm4gJChTQ1JJUFQpIF0gOworfQorCithY3Rpb25zIGF1dG8taW5kZXgKK3sKKyAgICAkKEFJLUNPTU1BTkQpICQoRkxBR1MpICItLXByZWZpeD0iJChQUkVGSVgpICItLXNjcmlwdD0iJChTQ1JJUFQpICItLWluZGV4LXR5cGU9IiQoSU5ERVhfVFlQRSkgIi0taW49IiQoPikgIi0tb3V0PSIkKDwpCit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9iaXNvbi5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2Jpc29uLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjg5ZDRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9iaXNvbi5qYW0KQEAgLTAsMCArMSwzMiBAQAorIyBDb3B5cmlnaHQgMjAwMyBWbGFkaW1pciBQcnVzIAorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIAorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgcHJvcGVydHkgOworCitmZWF0dXJlLmZlYXR1cmUgYmlzb24ucHJlZml4IDogOiBmcmVlIDsKK3R5cGUucmVnaXN0ZXIgWSA6IHkgOwordHlwZS5yZWdpc3RlciBZWSA6IHl5IDsKK2dlbmVyYXRvcnMucmVnaXN0ZXItc3RhbmRhcmQgYmlzb24uYmlzb24gOiBZIDogQyBIIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXItc3RhbmRhcmQgYmlzb24uYmlzb24gOiBZWSA6IENQUCBIUFAgOworCitydWxlIGluaXQgKCApCit7Cit9CisKK3J1bGUgYmlzb24gKCBkc3QgZHN0X2hlYWRlciA6IHNyYyA6IHByb3BlcnRpZXMgKiApCit7CisgICAgbG9jYWwgciA9IFsgcHJvcGVydHkuc2VsZWN0IGJpc29uLnByZWZpeCA6ICQocHJvcGVydGllcykgXSA7CisgICAgaWYgJChyKQorICAgIHsKKyAgICAgICAgUFJFRklYX09QVCBvbiAkKDwpID0gLXAgJChyOkc9KSA7CisgICAgfQorfQorCithY3Rpb25zIGJpc29uIAoreworICAgIGJpc29uICQoUFJFRklYX09QVCkgLWQgLW8gJCg8WzFdKSAkKD4pCit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2Jvb3N0Ym9vay1jb25maWcuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9ib29zdGJvb2stY29uZmlnLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTNmM2RkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9ib29zdGJvb2stY29uZmlnLmphbQpAQCAtMCwwICsxLDEzIEBACisjfiBDb3B5cmlnaHQgMjAwNSBSZW5lIFJpdmVyYS4KKyN+IERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyN+IChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBBdXRvbWF0aWMgY29uZmlndXJhdGlvbiBmb3IgQm9vc3RCb29rIHRvb2xzLiBUbyB1c2UsIGp1c3QgaW1wb3J0IHRoaXMgbW9kdWxlLgorIworIyBUaGlzIG1vZHVsZSBpcyBkZXByZWNhdGVkLgorIyAgIHVzaW5nIGJvb3N0Ym9vayA7CisjIHdpdGggbm8gYXJndW1lbnRzIG5vdyBzdWZmaWNlcy4KKworaW1wb3J0IHRvb2xzZXQgOiB1c2luZyA7CisKK3VzaW5nIGJvb3N0Ym9vayA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2Jvb3N0Ym9vay5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2Jvb3N0Ym9vay5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4M2RlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvYm9vc3Rib29rLmphbQpAQCAtMCwwICsxLDc3MyBAQAorIyBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNSBEYXZlIEFicmFoYW1zCisjIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1IERvdWdsYXMgR3JlZ29yCisjIENvcHlyaWdodCAyMDA1LCAyMDA2LCAyMDA3IFJlbmUgUml2ZXJhCisjIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1IFZsYWRpbWlyIFBydXMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBUaGlzIG1vZHVsZSBkZWZpbmVzIHJ1bGVzIHRvIGhhbmRsZSBnZW5lcmF0aW9uIG9mIGRvY3VtZW50YXRpb24gZnJvbSBCb29zdEJvb2sKKyMgc291cmNlcy4KKyMKKyMgVGhlIHR5cGUgb2Ygb3V0cHV0IGlzIGNvbnRyb2xsZWQgYnkgdGhlIDxmb3JtYXQ+IGZlYXR1cmUgd2hpY2ggY2FuIGhhdmUgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXM6CisjICAgKiBodG1sOiBHZW5lcmF0ZXMgaHRtbCBkb2N1bWVudGF0aW9uLiBUaGlzIGlzIHRoZSBkZWZhdWx0LgorIyAgICogeGh0bWw6IEdlbmVyYXRlcyB4aHRtbCBkb2N1bWVudGF0aW9uLgorIyAgICogaHRtbGhlbHA6IEdlbmVyYXRlcyBodG1sIGhlbHAgb3V0cHV0LgorIyAgICogb25laHRtbDogR2VuZXJhdGVzIGEgc2luZ2xlIGh0bWwgcGFnZS4KKyMgICAqIG1hbjogR2VuZXJhdGVzIG1hbiBwYWdlcy4KKyMgICAqIHBkZjogR2VuZXJhdGVzIHBkZiBkb2N1bWVudGF0aW9uLgorIyAgICogcHM6IEdlbmVyYXRlcyBwb3N0c2NyaXB0IG91dHB1dC4KKyMgICAqIGRvY2Jvb2s6IEdlbmVyYXRlcyBkb2Nib29rIFhNTC4KKyMgICAqIGZvOiBHZW5lcmF0ZXMgWFNMIGZvcm1hdGluZyBvYmplY3RzLgorIyAgICogdGVzdHM6IEV4dHJhY3RzIHRlc3QgY2FzZXMgZnJvbSB0aGUgYm9vc3Rib29rIFhNTC4KKyMKKyMgPGZvcm1hdD4gaXMgYW4gaW1wbGljaXQgZmVhdHVyZSwgc28gZm9yIGV4YW1wbGUsIHR5cGluZyBwZGYgb24gdGhlIGNvbW1hbmQKKyMgbGluZSBpcyBhIHNob3J0LWN1dCBmb3IgZm9ybWF0PXBkZi4KKworaW1wb3J0IGJ1aWxkLXN5c3RlbSA7CitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgY29tbW9uIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBtYWtlIDsKK2ltcG9ydCBtb2R1bGVzIDsKK2ltcG9ydCBvcyA7CitpbXBvcnQgcGF0aCA7CitpbXBvcnQgcHJpbnQgOworaW1wb3J0IHByb2plY3QgOworaW1wb3J0IHByb3BlcnR5IDsKK2ltcG9ydCBwcm9wZXJ0eS1zZXQgOworaW1wb3J0IHJlZ2V4IDsKK2ltcG9ydCBzY2FubmVyIDsKK2ltcG9ydCBzZXF1ZW5jZSA7CitpbXBvcnQgdGFyZ2V0cyA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgdmlydHVhbC10YXJnZXQgOworaW1wb3J0IHhzbHRwcm9jIDsKKworIyBNYWtlIHRoaXMgbW9kdWxlIGludG8gYSBwcm9qZWN0LgorcHJvamVjdC5pbml0aWFsaXplICQoX19uYW1lX18pIDsKK3Byb2plY3QgYm9vc3Rib29rIDsKKworLmRlYnVnLWNvbmZpZ3VyYXRpb24gPSBbIE1BVENIIF4oLS1kZWJ1Zy1jb25maWd1cmF0aW9uKSQgOiBbIG1vZHVsZXMucGVlayA6IEFSR1YKKyAgICBdIF0gOworCitmZWF0dXJlLmZlYXR1cmUgZm9ybWF0CisgICAgOiBodG1sIHhodG1sIGh0bWxoZWxwIG9uZWh0bWwgbWFuIHBkZiBwcyBkb2Nib29rIGZvIHRlc3RzCisgICAgOiBpbmNpZGVudGFsIGltcGxpY2l0IGNvbXBvc2l0ZSBwcm9wYWdhdGVkIDsKKwordHlwZS5yZWdpc3RlciBEVERYTUwgOiBkdGR4bWwgOwordHlwZS5yZWdpc3RlciBYTUwgOiB4bWwgOwordHlwZS5yZWdpc3RlciBCT09TVEJPT0sgOiBib29zdGJvb2sgOiBYTUwgOwordHlwZS5yZWdpc3RlciBET0NCT09LIDogZG9jYm9vayA6IFhNTCA7Cit0eXBlLnJlZ2lzdGVyIEZPIDogZm8gOiBYTUwgOwordHlwZS5yZWdpc3RlciBQREYgOiBwZGYgOwordHlwZS5yZWdpc3RlciBQUyA6IHBzIDsKK3R5cGUucmVnaXN0ZXIgWFNMVCA6IHhzbCA6IFhNTCA7Cit0eXBlLnJlZ2lzdGVyIEhUTUxESVIgOwordHlwZS5yZWdpc3RlciBYSFRNTERJUiA7Cit0eXBlLnJlZ2lzdGVyIEhUTUxIRUxQIDsKK3R5cGUucmVnaXN0ZXIgTUFOUEFHRVMgOwordHlwZS5yZWdpc3RlciBURVNUUyA6IHRlc3RzIDsKKworCisjIEluaXRpYWxpemUgQm9vc3RCb29rIHN1cHBvcnQuCisjCitydWxlIGluaXQgKAorICAgICAgZG9jYm9vay14c2wtZGlyID8gIyBUaGUgRG9jQm9vayBYU0wgc3R5bGVzaGVldCBkaXJlY3RvcnkuIElmIG5vdCBwcm92aWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgdXNlIERPQ0JPT0tfWFNMX0RJUiBmcm9tIHRoZSBlbnZpcm9ubWVudCAoaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYXZhaWxhYmxlKSBvciBsb29rIGluIHN0YW5kYXJkIGxvY2F0aW9ucy4gT3RoZXJ3aXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBsZXQgdGhlIFhNTCBwcm9jZXNzb3IgbG9hZCB0aGUgc3R5bGVzaGVldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3RlbHkuCisKKyAgICA6IGRvY2Jvb2stZHRkLWRpciA/ICMgVGhlIERvY0Jvb2sgRFREIGRpcmVjdG9yeS4gSWYgbm90IHByb3ZpZGVkLCB3ZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRE9DQk9PS19EVERfRElSIEZyb20gdGhlIGVudmlyb25tZW50IChpZiBhdmFpbGFibGUpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAjIGxvb2sgaW4gc3RhbmRhcmQgbG9jYXRpb25zLiBPdGhlcndpc2UsIHdlIGxldCB0aGUgWE1MCisgICAgICAgICAgICAgICAgICAgICAgICAjIHByb2Nlc3NvciBsb2FkIHRoZSBEVEQgcmVtb3RlbHkuCisKKyAgICA6IGJvb3N0Ym9vay1kaXIgPyAgICMgVGhlIEJvb3N0Qm9vayBkaXJlY3Rvcnkgd2l0aCB0aGUgRFREIGFuZCBYU0wgc3ViZGlycy4KKykKK3sKKyAgICBpZiAhICQoLmluaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgLmluaXRpYWxpemVkID0gdHJ1ZSA7CisKKyAgICAgICAgY2hlY2stYm9vc3Rib29rLWRpciAkKGJvb3N0Ym9vay1kaXIpIDsKKyAgICAgICAgZmluZC10b29scyAkKGRvY2Jvb2steHNsLWRpcikgOiAkKGRvY2Jvb2stZHRkLWRpcikgOiAkKGJvb3N0Ym9vay1kaXIpIDsKKworICAgICAgICAjIFJlZ2lzdGVyIGdlbmVyYXRvcnMgb25seSBpZiB3ZSB3ZXJlIGNhbGxlZCB2aWEgInVzaW5nIGJvb3N0Ym9vayA7IgorICAgICAgICBsb2NhbCByZWctZ2VuID0gZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCA7CisgICAgICAgICQocmVnLWdlbikgYm9vc3Rib29rLmR0ZHhtbC10by1ib29zdGJvb2sgIDogRFREWE1MICA6IFhNTCA7CisgICAgICAgICQocmVnLWdlbikgYm9vc3Rib29rLmJvb3N0Ym9vay10by1kb2Nib29rIDogWE1MICAgICA6IERPQ0JPT0sgOworICAgICAgICAkKHJlZy1nZW4pIGJvb3N0Ym9vay5ib29zdGJvb2stdG8tdGVzdHMgICA6IFhNTCAgICAgOiBURVNUUyA7CisgICAgICAgICQocmVnLWdlbikgYm9vc3Rib29rLmRvY2Jvb2stdG8tb25laHRtbCAgIDogRE9DQk9PSyA6IEhUTUwgOworICAgICAgICAkKHJlZy1nZW4pIGJvb3N0Ym9vay5kb2Nib29rLXRvLWh0bWxkaXIgICA6IERPQ0JPT0sgOiBIVE1MRElSIDsKKyAgICAgICAgJChyZWctZ2VuKSBib29zdGJvb2suZG9jYm9vay10by14aHRtbGRpciAgOiBET0NCT09LIDogWEhUTUxESVIgOworICAgICAgICAkKHJlZy1nZW4pIGJvb3N0Ym9vay5kb2Nib29rLXRvLWh0bWxoZWxwICA6IERPQ0JPT0sgOiBIVE1MSEVMUCA7CisgICAgICAgICQocmVnLWdlbikgYm9vc3Rib29rLmRvY2Jvb2stdG8tbWFucGFnZXMgIDogRE9DQk9PSyA6IE1BTlBBR0VTIDsKKyAgICAgICAgJChyZWctZ2VuKSBib29zdGJvb2suZG9jYm9vay10by1mbyAgICAgICAgOiBET0NCT09LIDogRk8gOworCisgICAgICAgICMgVGhlIHNhbWUgYWJvdXQgSmFtZmlsZSBtYWluIHRhcmdldCBydWxlcy4KKyAgICAgICAgSU1QT1JUICQoX19uYW1lX18pIDogYm9vc3Rib29rIDogOiBib29zdGJvb2sgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAkKGRvY2Jvb2steHNsLWRpcikKKyAgICAgICAgeworICAgICAgICAgICAgbW9kaWZ5LWNvbmZpZyA7CisgICAgICAgICAgICAuZG9jYm9vay14c2wtZGlyID0gWyBwYXRoLm1ha2UgJChkb2Nib29rLXhzbC1kaXIpIF0gOworICAgICAgICAgICAgY2hlY2stZG9jYm9vay14c2wtZGlyIDsKKyAgICAgICAgfQorICAgICAgICBpZiAkKGRvY2Jvb2stZHRkLWRpcikKKyAgICAgICAgeworICAgICAgICAgICAgbW9kaWZ5LWNvbmZpZyA7CisgICAgICAgICAgICAuZG9jYm9vay1kdGQtZGlyID0gWyBwYXRoLm1ha2UgJChkb2Nib29rLWR0ZC1kaXIpIF0gOworICAgICAgICAgICAgY2hlY2stZG9jYm9vay1kdGQtZGlyIDsKKyAgICAgICAgfQorICAgICAgICBpZiAkKGJvb3N0Ym9vay1kaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGlmeS1jb25maWcgOworICAgICAgICAgICAgY2hlY2stYm9vc3Rib29rLWRpciAkKGJvb3N0Ym9vay1kaXIpIDsKKyAgICAgICAgICAgIGxvY2FsIGJvb3N0Ym9vay14c2wtZGlyID0gWyBwYXRoLmdsb2IgJChib29zdGJvb2stZGlyKSA6IHhzbCBdIDsKKyAgICAgICAgICAgIGxvY2FsIGJvb3N0Ym9vay1kdGQtZGlyID0gWyBwYXRoLmdsb2IgJChib29zdGJvb2stZGlyKSA6IGR0ZCBdIDsKKyAgICAgICAgICAgIC5ib29zdGJvb2steHNsLWRpciA9ICQoYm9vc3Rib29rLXhzbC1kaXJbMV0pIDsKKyAgICAgICAgICAgIC5ib29zdGJvb2stZHRkLWRpciA9ICQoYm9vc3Rib29rLWR0ZC1kaXJbMV0pIDsKKyAgICAgICAgICAgIGNoZWNrLWJvb3N0Ym9vay14c2wtZGlyIDsKKyAgICAgICAgICAgIGNoZWNrLWJvb3N0Ym9vay1kdGQtZGlyIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitsb2NhbCBydWxlIGxvY2stY29uZmlnICggKQoreworICAgIGlmICEgJCguaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgQm9vc3RCb29rIGhhcyBub3QgYmVlbiBjb25maWd1cmVkLiA7CisgICAgfQorICAgIGlmICEgJCguY29uZmlnLWxvY2tlZCkKKyAgICB7CisgICAgICAgIC5jb25maWctbG9ja2VkID0gdHJ1ZSA7CisKKyAgICAgICAgaWYgJCguZXJyb3ItbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQtZXJyb3IgJCguZXJyb3ItbWVzc2FnZSkgOworICAgICAgICB9CisgICAgfQorfQorCisKK2xvY2FsIHJ1bGUgbW9kaWZ5LWNvbmZpZyAoICkKK3sKKyAgICBpZiAkKC5jb25maWctbG9ja2VkKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy51c2VyLWVycm9yIEJvb3N0Qm9vayBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGl0IGhhcworICAgICAgICAgICAgYmVlbiB1c2VkLiA7CisgICAgfQorfQorCitydWxlIHByaW50LWVycm9yICggbG9jYXRpb24gbWVzc2FnZSAqICkKK3sKKyAgICBFQ0hPIGVycm9yOiBhdCAkKGxvY2F0aW9uKSA7CisgICAgRUNITyBlcnJvcjogJChtZXNzYWdlKSA7CisgICAgRVhJVCA7Cit9CisKK3J1bGUgbWFrZS1lcnJvciAoIG1lc3NhZ2UgKiApCit7CisgICAgcmV0dXJuIFsgZXJyb3JzLm5lYXJlc3QtdXNlci1sb2NhdGlvbiBdICQobWVzc2FnZSkgOworfQorCisKK3J1bGUgZmluZC1ib29zdC1pbi1yZWdpc3RyeSAoIGtleXMgKiApCit7CisgICAgbG9jYWwgYm9vc3Qtcm9vdCA7CisgICAgZm9yIGxvY2FsIFIgaW4gJChrZXlzKQorICAgIHsKKyAgICAgICAgbG9jYWwgaW5zdGFsbGVkLWJvb3N0ID0gWyBXMzJfR0VUUkVHCisgICAgICAgICAgICAiSEtFWV9MT0NBTF9NQUNISU5FXFxTT0ZUV0FSRVxcJChSKSIgOiAiSW5zdGFsbFJvb3QiIF0gOworICAgICAgICBpZiAkKGluc3RhbGxlZC1ib29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vc3Qtcm9vdCArPSBbIHBhdGgubWFrZSAkKGluc3RhbGxlZC1ib29zdCkgXSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQoYm9vc3Qtcm9vdCkgOworfQorCisKK3J1bGUgY2hlY2stZG9jYm9vay14c2wtZGlyICggKQoreworICAgIGlmICQoLmRvY2Jvb2steHNsLWRpcikKKyAgICB7CisgICAgICAgIGlmICEgWyBwYXRoLmdsb2IgJCguZG9jYm9vay14c2wtZGlyKSA6IGNvbW1vbi9jb21tb24ueHNsIF0KKyAgICAgICAgeworICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICAuZXJyb3ItbWVzc2FnZSA9IFsgbWFrZS1lcnJvciBCb29zdEJvb2s6IGNvdWxkIG5vdCBmaW5kIGRvY2Jvb2sgWFNMIHN0eWxlc2hlZXRzCisgICAgICAgICAgICAgICAgaW46IFsgcGF0aC5uYXRpdmUgJCguZG9jYm9vay14c2wtZGlyKSBdIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgRUNITyBub3RpY2U6IEJvb3N0Qm9vazogZm91bmQgZG9jYm9vayBYU0wgc3R5bGVzaGVldHMgaW46IFsKKyAgICAgICAgICAgICAgICBwYXRoLm5hdGl2ZSAkKC5kb2Nib29rLXhzbC1kaXIpIF0gOworICAgICAgICB9CisgICAgfQorfQorCisKK3J1bGUgY2hlY2stZG9jYm9vay1kdGQtZGlyICggKQoreworICAgIGlmICQoLmRvY2Jvb2stZHRkLWRpcikKKyAgICB7CisgICAgICAgIGlmICEgWyBwYXRoLmdsb2IgJCguZG9jYm9vay1kdGQtZGlyKSA6IGRvY2Jvb2t4LmR0ZCBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICAgICAgLmVycm9yLW1lc3NhZ2UgPSBbIG1ha2UtZXJyb3IgQm9vc3RCb29rOiBjb3VsZCBub3QgZmluZCBkb2Nib29rIERURCBpbjogWworICAgICAgICAgICAgICAgIHBhdGgubmF0aXZlICQoLmRvY2Jvb2stZHRkLWRpcikgXSBdIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICQoLmRlYnVnLWNvbmZpZ3VyYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gbm90aWNlOiBCb29zdEJvb2s6IGZvdW5kIGRvY2Jvb2sgRFREIGluOiBbIHBhdGgubmF0aXZlCisgICAgICAgICAgICAgICAgJCguZG9jYm9vay1kdGQtZGlyKSBdIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitydWxlIGNoZWNrLWJvb3N0Ym9vay14c2wtZGlyICggKQoreworICAgIGlmICEgJCguYm9vc3Rib29rLXhzbC1kaXIpCisgICAgeworICAgICAgICAuZXJyb3ItbWVzc2FnZSA9IFsgbWFrZS1lcnJvciBCb29zdEJvb2s6IGNvdWxkIG5vdCBmaW5kIGJvb3N0Ym9vayBYU0wgc3R5bGVzaGVldHMuIF0gOworICAgIH0KKyAgICBlbHNlIGlmICEgWyBwYXRoLmdsb2IgJCguYm9vc3Rib29rLXhzbC1kaXIpIDogZG9jYm9vay54c2wgXQorICAgIHsKKyAgICAgICAgLmVycm9yLW1lc3NhZ2UgPSBbIG1ha2UtZXJyb3IgIEJvb3N0Qm9vazogY291bGQgbm90IGZpbmQgZG9jYm9vayBYU0wgc3R5bGVzaGVldHMgaW46CisgICAgICAgICAgICBbIHBhdGgubmF0aXZlICQoLmJvb3N0Ym9vay14c2wtZGlyKSBdIF0gOworICAgIH0KKyAgICBlbHNlIGlmICQoLmRlYnVnLWNvbmZpZ3VyYXRpb24pCisgICAgeworICAgICAgICBFQ0hPIG5vdGljZTogQm9vc3RCb29rOiBmb3VuZCBib29zdGJvb2sgWFNMIHN0eWxlc2hlZXRzIGluOiBbCisgICAgICAgICAgICBwYXRoLm5hdGl2ZSAkKC5ib29zdGJvb2steHNsLWRpcikgXSA7CisgICAgfQorfQorCisKK3J1bGUgY2hlY2stYm9vc3Rib29rLWR0ZC1kaXIgKCApCit7CisgICAgaWYgISAkKC5ib29zdGJvb2stZHRkLWRpcikKKyAgICB7CisgICAgICAgIC5lcnJvci1tZXNzYWdlID0gWyBtYWtlLWVycm9yIEJvb3N0Qm9vazogY291bGQgbm90IGZpbmQgYm9vc3Rib29rIERURC4gXSA7CisgICAgfQorICAgIGVsc2UgaWYgISBbIHBhdGguZ2xvYiAkKC5ib29zdGJvb2stZHRkLWRpcikgOiBib29zdGJvb2suZHRkIF0KKyAgICB7CisgICAgICAgIC5lcnJvci1tZXNzYWdlID0gWyBtYWtlLWVycm9yIEJvb3N0Qm9vazogY291bGQgbm90IGZpbmQgYm9vc3Rib29rIERURCBpbjogWworICAgICAgICAgICAgcGF0aC5uYXRpdmUgJCguYm9vc3Rib29rLWR0ZC1kaXIpIF0gXSA7CisgICAgfQorICAgIGVsc2UgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICB7CisgICAgICAgIEVDSE8gbm90aWNlOiBCb29zdEJvb2s6IGZvdW5kIGJvb3N0Ym9vayBEVEQgaW46IFsgcGF0aC5uYXRpdmUKKyAgICAgICAgICAgICQoLmJvb3N0Ym9vay1kdGQtZGlyKSBdIDsKKyAgICB9Cit9CisKKworcnVsZSBjaGVjay1ib29zdGJvb2stZGlyICggYm9vc3Rib29rLWRpciA/ICkKK3sKKyAgICBpZiAkKGJvb3N0Ym9vay1kaXIpICYmICEgWyBwYXRoLmdsb2IgJChib29zdGJvb2stZGlyKSA6IHhzbCBdCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgLmVycm9yLW1lc3NhZ2UgPSBbIG1ha2UtZXJyb3IgQm9vc3RCb29rOiBjb3VsZCBub3QgZmluZCBib29zdGJvb2sgaW46IFsgcGF0aC5uYXRpdmUKKyAgICAgICAgICAgICQoYm9vc3Rib29rLWRpcikgXSBdIDsKKyAgICB9Cit9CisKKworcnVsZSBmaW5kLXRvb2xzICggZG9jYm9vay14c2wtZGlyID8gOiBkb2Nib29rLWR0ZC1kaXIgPyA6IGJvb3N0Ym9vay1kaXIgPyApCit7CisgICAgZG9jYm9vay14c2wtZGlyID89IFsgbW9kdWxlcy5wZWVrIDogRE9DQk9PS19YU0xfRElSIF0gOworICAgIGRvY2Jvb2stZHRkLWRpciA/PSBbIG1vZHVsZXMucGVlayA6IERPQ0JPT0tfRFREX0RJUiBdIDsKKyAgICBib29zdGJvb2stZGlyID89IFsgbW9kdWxlcy5wZWVrIDogQk9PU1RCT09LX0RJUiBdIDsKKworICAgICMgTG9vayBmb3IgdGhlIGJvb3N0Ym9vayBzdHlsZXNoZWV0cyByZWxhdGl2ZSB0byBCT09TVF9ST09UIGFuZCBCb29zdC5CdWlsZC4KKyAgICBsb2NhbCBib29zdC1idWlsZC1yb290ID0gWyBwYXRoLm1ha2UgWyBidWlsZC1zeXN0ZW0ubG9jYXRpb24gXSBdIDsKKyAgICBsb2NhbCBib29zdGJvb2stc2VhcmNoLWRpcnMgPSBbIHBhdGguam9pbiAkKGJvb3N0LWJ1aWxkLXJvb3QpIC4uIC4uIF0gOworCisgICAgbG9jYWwgYm9vc3Qtcm9vdCA9IFsgbW9kdWxlcy5wZWVrIDogQk9PU1RfUk9PVCBdIDsKKyAgICBpZiAkKGJvb3N0LXJvb3QpCisgICAgeworICAgICAgICBib29zdGJvb2stc2VhcmNoLWRpcnMgKz0gWyBwYXRoLmpvaW4gWyBwYXRoLm1ha2UgJChib29zdC1yb290KSBdIHRvb2xzIF0KKyAgICAgICAgICAgIDsKKyAgICB9CisgICAgYm9vc3Rib29rLWRpciA/PSBbIHBhdGguZ2xvYiAkKGJvb3N0Ym9vay1zZWFyY2gtZGlycykgOiBib29zdGJvb2sqIF0gOworCisgICAgIyBUcnkgdG8gZmluZCB0aGUgdG9vbHMgaW4gcGxhdGZvcm0gc3BlY2lmaWMgbG9jYXRpb25zLgorICAgIGlmIFsgb3MubmFtZSBdID0gTlQKKyAgICB7CisgICAgICAgICMgSWYgaW5zdGFsbGVkIGJ5IHRoZSBCb29zdCBpbnN0YWxsZXIuCisgICAgICAgIGxvY2FsIGJvb3N0LXJvb3QgPSA7CisKKyAgICAgICAgbG9jYWwgYm9vc3QtaW5zdGFsbGVyLXZlcnNpb25zID0gc25hcHNob3QgY3ZzIDEuMzMuMCA7CisgICAgICAgIGxvY2FsIGJvb3N0LWNvbnN1bHRpbmctaW5zdGFsbGVyLXZlcnNpb25zID0gMS4zMy4xIDEuMzQuMCAxLjM0LjEgOworICAgICAgICBsb2NhbCBib29zdHByby1pbnN0YWxsZXItdmVyc2lvbnMgPQorICAgICAgICAgICAgMS4zNS4wIDEuMzYuMCAxLjM3LjAgMS4zOC4wIDEuMzkuMCAxLjQwLjAgMS40MS4wIDEuNDIuMAorICAgICAgICAgICAgMS40My4wIDEuNDQuMCAxLjQ1LjAgMS40Ni4wIDEuNDcuMCAxLjQ4LjAgMS40OS4wIDEuNTAuMCA7CisKKyAgICAgICAgbG9jYWwgb2xkLWluc3RhbGxlci1yb290ID0gWyBmaW5kLWJvb3N0LWluLXJlZ2lzdHJ5CisgICAgICAgICAgICBCb29zdC5vcmdcXCQoYm9vc3QtaW5zdGFsbGVyLXZlcnNpb25zKSBdIDsKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIGlzIHNlYXJjaGVkIGZvciBmaXJzdC4KKyAgICAgICAgYm9vc3Qtcm9vdCArPSBbIHNlcXVlbmNlLnJldmVyc2UgWyBmaW5kLWJvb3N0LWluLXJlZ2lzdHJ5CisgICAgICAgICAgICBCb29zdC1Db25zdWx0aW5nLmNvbVxcJChib29zdC1jb25zdWx0aW5nLWluc3RhbGxlci12ZXJzaW9ucykKKyAgICAgICAgICAgIGJvb3N0cHJvLmNvbVxcJChib29zdHByby1pbnN0YWxsZXItdmVyc2lvbnMpIF0gXSA7CisKKyAgICAgICAgIyBQbGF1c2libGUgbG9jYXRpb25zLgorICAgICAgICBsb2NhbCByb290ID0gWyBQV0QgXSA7CisgICAgICAgIHdoaWxlICQocm9vdCkgIT0gJChyb290OkQpIHsgcm9vdCA9ICQocm9vdDpEKSA7IH0KKyAgICAgICAgcm9vdCA9IFsgcGF0aC5tYWtlICQocm9vdCkgXSA7CisgICAgICAgIGxvY2FsIHNlYXJjaC1kaXJzIDsKKyAgICAgICAgbG9jYWwgZG9jYm9vay1zZWFyY2gtZGlycyA7CisgICAgICAgIGZvciBsb2NhbCBwIGluICQoYm9vc3Qtcm9vdCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VhcmNoLWRpcnMgKz0gWyBwYXRoLmpvaW4gJChwKSB0b29scyBdIDsKKyAgICAgICAgfQorICAgICAgICBmb3IgbG9jYWwgcCBpbiAkKG9sZC1pbnN0YWxsZXItcm9vdCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VhcmNoLWRpcnMgKz0gWyBwYXRoLmpvaW4gJChwKSBzaGFyZSBdIDsKKyAgICAgICAgICAgIGRvY2Jvb2stc2VhcmNoLWRpcnMgKz0gWyBwYXRoLmpvaW4gJChwKSBzaGFyZSBdIDsKKyAgICAgICAgfQorICAgICAgICBzZWFyY2gtZGlycyArPSBbIHBhdGguam9pbiAkKHJvb3QpIEJvb3N0IHRvb2xzIF0gOworICAgICAgICBzZWFyY2gtZGlycyArPSBbIHBhdGguam9pbiAkKHJvb3QpIEJvb3N0IHNoYXJlIF0gOworICAgICAgICBkb2Nib29rLXNlYXJjaC1kaXJzICs9IFsgcGF0aC5qb2luICQocm9vdCkgQm9vc3Qgc2hhcmUgXSA7CisKKyAgICAgICAgZG9jYm9vay14c2wtZGlyID89IFsgcGF0aC5nbG9iICQoZG9jYm9vay1zZWFyY2gtZGlycykgOiBkb2Nib29rLXhzbCogXSA7CisgICAgICAgIGRvY2Jvb2stZHRkLWRpciA/PSBbIHBhdGguZ2xvYiAkKGRvY2Jvb2stc2VhcmNoLWRpcnMpIDogZG9jYm9vay14bWwqIF0gOworICAgICAgICBib29zdGJvb2stZGlyID89IFsgcGF0aC5nbG9iICQoc2VhcmNoLWRpcnMpIDogYm9vc3Rib29rKiBdIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgIyBQbGF1c2libGUgbG9jYXRpb25zLgorCisgICAgICAgIGxvY2FsIHNoYXJlID0gL3Vzci9sb2NhbC9zaGFyZSAvdXNyL3NoYXJlIC9vcHQvc2hhcmUgL29wdC9sb2NhbC9zaGFyZSA7CisgICAgICAgIGxvY2FsIGR0ZC12ZXJzaW9ucyA9IDQuMiA7CisKKyAgICAgICAgZG9jYm9vay14c2wtZGlyID89IFsgcGF0aC5nbG9iICQoc2hhcmUpIDogZG9jYm9vay14c2wqIF0gOworICAgICAgICBkb2Nib29rLXhzbC1kaXIgPz0gWyBwYXRoLmdsb2IgJChzaGFyZSkvc2dtbC9kb2Nib29rIDogeHNsLXN0eWxlc2hlZXRzIF0KKyAgICAgICAgICAgIDsKKyAgICAgICAgZG9jYm9vay14c2wtZGlyID89IFsgcGF0aC5nbG9iICQoc2hhcmUpL3hzbCA6IGRvY2Jvb2sqIF0gOworCisgICAgICAgIGRvY2Jvb2stZHRkLWRpciA/PSBbIHBhdGguZ2xvYiAkKHNoYXJlKSA6IGRvY2Jvb2steG1sKiBdIDsKKyAgICAgICAgZG9jYm9vay1kdGQtZGlyID89IFsgcGF0aC5nbG9iICQoc2hhcmUpL3NnbWwvZG9jYm9vayA6CisgICAgICAgICAgICB4bWwtZHRkLSQoZHRkLXZlcnNpb25zKSogXSA7CisgICAgICAgIGRvY2Jvb2stZHRkLWRpciA/PSBbIHBhdGguZ2xvYiAkKHNoYXJlKS94bWwvZG9jYm9vayA6ICQoZHRkLXZlcnNpb25zKSBdCisgICAgICAgICAgICA7CisKKyAgICAgICAgYm9vc3Rib29rLWRpciA/PSBbIHBhdGguZ2xvYiAkKHNoYXJlKSA6IGJvb3N0Ym9vayogXSA7CisKKyAgICAgICAgIyBVYnVudHUgTGludXguCisgICAgICAgIGRvY2Jvb2steHNsLWRpciA/PSBbIHBhdGguZ2xvYiAvdXNyL3NoYXJlL3htbC9kb2Nib29rL3N0eWxlc2hlZXQgOgorICAgICAgICAgICAgbndhbHNoIF0gOworICAgICAgICBkb2Nib29rLWR0ZC1kaXIgPz0gWyBwYXRoLmdsb2IgL3Vzci9zaGFyZS94bWwvZG9jYm9vay9zY2hlbWEvZHRkIDoKKyAgICAgICAgICAgICQoZHRkLXZlcnNpb25zKSBdIDsKKworICAgICAgICAjIFNVU0UuCisgICAgICAgIGRvY2Jvb2steHNsLWRpciA/PSBbIHBhdGguZ2xvYiAvdXNyL3NoYXJlL3htbC9kb2Nib29rL3N0eWxlc2hlZXQvbndhbHNoCisgICAgICAgICAgICA6IGN1cnJlbnQgXSA7CisgICAgfQorCisgICAgaWYgJChkb2Nib29rLXhzbC1kaXIpCisgICAgeworICAgICAgICAuZG9jYm9vay14c2wtZGlyID0gWyBwYXRoLm1ha2UgJChkb2Nib29rLXhzbC1kaXJbMV0pIF0gOworICAgIH0KKyAgICBpZiAkKGRvY2Jvb2stZHRkLWRpcikKKyAgICB7CisgICAgICAgIC5kb2Nib29rLWR0ZC1kaXIgPSBbIHBhdGgubWFrZSAkKGRvY2Jvb2stZHRkLWRpclsxXSkgXSA7CisgICAgfQorCisgICAgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICB7CisgICAgICAgIEVDSE8gbm90aWNlOiBCb29zdC5Cb29rOiBzZWFyY2hpbmcgWFNML0RURCAiaW4iIDsKKyAgICAgICAgRUNITyBub3RpY2U6IFsgc2VxdWVuY2UudHJhbnNmb3JtIHBhdGgubmF0aXZlIDogJChib29zdGJvb2stZGlyKSBdIDsKKyAgICB9CisgICAgbG9jYWwgYm9vc3Rib29rLXhzbC1kaXIgOworICAgIGZvciBsb2NhbCBkaXIgaW4gJChib29zdGJvb2stZGlyKQorICAgIHsKKyAgICAgICAgYm9vc3Rib29rLXhzbC1kaXIgKz0gWyBwYXRoLmdsb2IgJChkaXIpIDogeHNsIF0gOworICAgIH0KKyAgICBsb2NhbCBib29zdGJvb2stZHRkLWRpciA7CisgICAgZm9yIGxvY2FsIGRpciBpbiAkKGJvb3N0Ym9vay1kaXIpCisgICAgeworICAgICAgICBib29zdGJvb2stZHRkLWRpciArPSBbIHBhdGguZ2xvYiAkKGRpcikgOiBkdGQgXSA7CisgICAgfQorICAgIC5ib29zdGJvb2steHNsLWRpciA9ICQoYm9vc3Rib29rLXhzbC1kaXJbMV0pIDsKKyAgICAuYm9vc3Rib29rLWR0ZC1kaXIgPSAkKGJvb3N0Ym9vay1kdGQtZGlyWzFdKSA7CisKKyAgICBjaGVjay1kb2Nib29rLXhzbC1kaXIgOworICAgIGNoZWNrLWRvY2Jvb2stZHRkLWRpciA7CisgICAgY2hlY2stYm9vc3Rib29rLXhzbC1kaXIgOworICAgIGNoZWNrLWJvb3N0Ym9vay1kdGQtZGlyIDsKK30KKworCitydWxlIHhzbC1kaXIKK3sKKyAgICBsb2NrLWNvbmZpZyA7CisgICAgcmV0dXJuICQoLmJvb3N0Ym9vay14c2wtZGlyKSA7Cit9CisKKworcnVsZSBkdGQtZGlyCit7CisgICAgbG9jay1jb25maWcgOworICAgIHJldHVybiAkKC5ib29zdGJvb2stZHRkLWRpcikgOworfQorCisKK3J1bGUgZG9jYm9vay14c2wtZGlyCit7CisgICAgbG9jay1jb25maWcgOworICAgIHJldHVybiAkKC5kb2Nib29rLXhzbC1kaXIpIDsKK30KKworCitydWxlIGRvY2Jvb2stZHRkLWRpcgoreworICAgIGxvY2stY29uZmlnIDsKKyAgICByZXR1cm4gJCguZG9jYm9vay1kdGQtZGlyKSA7Cit9CisKKworcnVsZSBkdGR4bWwtdG8tYm9vc3Rib29rICggdGFyZ2V0IDogc291cmNlIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NrLWNvbmZpZyA7CisgICAgeHNsdHByb2MueHNsdCAkKHRhcmdldCkgOiAkKHNvdXJjZSkKKyAgICAgICAgIiQoLmJvb3N0Ym9vay14c2wtZGlyKS9kdGQvZHRkMmJvb3N0Ym9vay54c2wiIDogJChwcm9wZXJ0aWVzKSA7Cit9CisKKworcnVsZSBib29zdGJvb2stdG8tZG9jYm9vayAoIHRhcmdldCA6IHNvdXJjZSA6IHByb3BlcnRpZXMgKiApCit7CisgICAgbG9jay1jb25maWcgOworICAgIGxvY2FsIHN0eWxlc2hlZXQgPSBbIHBhdGgubmF0aXZlICQoLmJvb3N0Ym9vay14c2wtZGlyKS9kb2Nib29rLnhzbCBdIDsKKyAgICB4c2x0cHJvYy54c2x0ICQodGFyZ2V0KSA6ICQoc291cmNlKSAkKHN0eWxlc2hlZXQpIDogJChwcm9wZXJ0aWVzKSA7Cit9CisKKworcnVsZSBkb2Nib29rLXRvLW9uZWh0bWwgKCB0YXJnZXQgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2stY29uZmlnIDsKKyAgICBsb2NhbCBzdHlsZXNoZWV0ID0gWyBwYXRoLm5hdGl2ZSAkKC5ib29zdGJvb2steHNsLWRpcikvaHRtbC1zaW5nbGUueHNsIF0gOworICAgIHhzbHRwcm9jLnhzbHQgJCh0YXJnZXQpIDogJChzb3VyY2UpICQoc3R5bGVzaGVldCkgOiAkKHByb3BlcnRpZXMpIDsKK30KKworCitydWxlIGRvY2Jvb2stdG8taHRtbGRpciAoIHRhcmdldCA6IHNvdXJjZSA6IHByb3BlcnRpZXMgKiApCit7CisgICAgbG9jay1jb25maWcgOworICAgIGxvY2FsIHN0eWxlc2hlZXQgPSBbIHBhdGgubmF0aXZlICQoLmJvb3N0Ym9vay14c2wtZGlyKS9odG1sLnhzbCBdIDsKKyAgICB4c2x0cHJvYy54c2x0LWRpciAkKHRhcmdldCkgOiAkKHNvdXJjZSkgJChzdHlsZXNoZWV0KSA6ICQocHJvcGVydGllcykgOiBodG1sCisgICAgICAgIDsKK30KKworCitydWxlIGRvY2Jvb2stdG8teGh0bWxkaXIgKCB0YXJnZXQgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2stY29uZmlnIDsKKyAgICBsb2NhbCBzdHlsZXNoZWV0ID0gWyBwYXRoLm5hdGl2ZSAkKC5ib29zdGJvb2steHNsLWRpcikveGh0bWwueHNsIF0gOworICAgIHhzbHRwcm9jLnhzbHQtZGlyICQodGFyZ2V0KSA6ICQoc291cmNlKSAkKHN0eWxlc2hlZXQpIDogJChwcm9wZXJ0aWVzKSA6CisgICAgICAgIHhodG1sIDsKK30KKworCitydWxlIGRvY2Jvb2stdG8taHRtbGhlbHAgKCB0YXJnZXQgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2stY29uZmlnIDsKKyAgICBsb2NhbCBzdHlsZXNoZWV0ID0gWyBwYXRoLm5hdGl2ZSAkKC5ib29zdGJvb2steHNsLWRpcikvaHRtbC1oZWxwLnhzbCBdIDsKKyAgICB4c2x0cHJvYy54c2x0LWRpciAkKHRhcmdldCkgOiAkKHNvdXJjZSkgJChzdHlsZXNoZWV0KSA6ICQocHJvcGVydGllcykgOgorICAgICAgICBodG1saGVscCA7Cit9CisKKworcnVsZSBkb2Nib29rLXRvLW1hbnBhZ2VzICggdGFyZ2V0IDogc291cmNlIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NrLWNvbmZpZyA7CisgICAgbG9jYWwgc3R5bGVzaGVldCA9IFsgcGF0aC5uYXRpdmUgJCguYm9vc3Rib29rLXhzbC1kaXIpL21hbnBhZ2VzLnhzbCBdIDsKKyAgICB4c2x0cHJvYy54c2x0LWRpciAkKHRhcmdldCkgOiAkKHNvdXJjZSkgJChzdHlsZXNoZWV0KSA6ICQocHJvcGVydGllcykgOiBtYW4KKyAgICAgICAgOworfQorCisKK3J1bGUgZG9jYm9vay10by1mbyAoIHRhcmdldCA6IHNvdXJjZSA6IHByb3BlcnRpZXMgKiApCit7CisgICAgbG9jay1jb25maWcgOworICAgIGxvY2FsIHN0eWxlc2hlZXQgPSBbIHBhdGgubmF0aXZlICQoLmJvb3N0Ym9vay14c2wtZGlyKS9mby54c2wgXSA7CisgICAgeHNsdHByb2MueHNsdCAkKHRhcmdldCkgOiAkKHNvdXJjZSkgJChzdHlsZXNoZWV0KSA6ICQocHJvcGVydGllcykgOworfQorCisKK3J1bGUgZm9ybWF0LWNhdGFsb2ctcGF0aCAoIHBhdGggKQoreworICAgIGxvY2FsIHJlc3VsdCA9ICQocGF0aCkgOworICAgIGlmIFsgeHNsdHByb2MuaXMtY3lnd2luIF0KKyAgICB7CisgICAgICAgIGlmIFsgb3MubmFtZSBdID0gTlQKKyAgICAgICAgeworICAgICAgICAgICAgZHJpdmUgPSBbIE1BVENIIF4vKC4pOiguKikkIDogJChwYXRoKSBdIDsKKyAgICAgICAgICAgIHJlc3VsdCA9IC9jeWdkcml2ZS8kKGRyaXZlWzFdKSQoZHJpdmVbMl0pIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiBbIG9zLm5hbWUgXSA9IENZR1dJTgorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBuYXRpdmUtcGF0aCA9IFsgcGF0aC5uYXRpdmUgJChwYXRoKSBdIDsKKyAgICAgICAgICAgIHJlc3VsdCA9IFsgcGF0aC5tYWtlICQobmF0aXZlLXBhdGg6VykgXSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFsgcmVnZXgucmVwbGFjZSAkKHJlc3VsdCkgIiAiICIlMjAiIF0gOworfQorCisKK3J1bGUgZ2VuZXJhdGUteG1sLWNhdGFsb2cgKCB0YXJnZXQgOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIHByaW50Lm91dHB1dCAkKHRhcmdldCkgOworCisgICAgIyBCb29zdEJvb2sgRFREIGNhdGFsb2cgZW50cnkuCisgICAgbG9jYWwgYm9vc3Rib29rLWR0ZC1kaXIgPSBbIGJvb3N0Ym9vay5kdGQtZGlyIF0gOworICAgIGlmICQoYm9vc3Rib29rLWR0ZC1kaXIpCisgICAgeworICAgICAgICBib29zdGJvb2stZHRkLWRpciA9IFsgZm9ybWF0LWNhdGFsb2ctcGF0aCAkKGJvb3N0Ym9vay1kdGQtZGlyKSBdIDsKKyAgICB9CisKKyAgICBwcmludC50ZXh0CisgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIKKyAgICAgICAgIjwhRE9DVFlQRSBjYXRhbG9nICIKKyAgICAgICAgIiAgUFVCTElDIFwiLS8vT0FTSVMvRFREIEVudGl0eSBSZXNvbHV0aW9uIFhNTCBDYXRhbG9nIFYxLjAvL0VOXCIiCisgICAgICAgICIgIFwiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9yZWxlYXNlLzEuMC9jYXRhbG9nLmR0ZFwiPiIKKyAgICAgICAgIjxjYXRhbG9nIHhtbG5zPVwidXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZ1wiPiIKKyAgICAgICAgIiAgPHJld3JpdGVVUkkgdXJpU3RhcnRTdHJpbmc9XCJodHRwOi8vd3d3LmJvb3N0Lm9yZy90b29scy9ib29zdGJvb2svZHRkL1wiIHJld3JpdGVQcmVmaXg9XCJmaWxlOi8vJChib29zdGJvb2stZHRkLWRpcikvXCIvPiIKKyAgICAgICAgOiB0cnVlIDsKKworICAgIGxvY2FsIGRvY2Jvb2steHNsLWRpciA9IFsgYm9vc3Rib29rLmRvY2Jvb2steHNsLWRpciBdIDsKKyAgICBpZiAhICQoZG9jYm9vay14c2wtZGlyKQorICAgIHsKKyAgICAgICAgRUNITyAiQm9vc3RCb29rIHdhcm5pbmc6IG5vIERvY0Jvb2sgWFNMIGRpcmVjdG9yeSBzcGVjaWZpZWQuIiA7CisgICAgICAgIEVDSE8gIiAgSWYgeW91IGhhdmUgdGhlIERvY0Jvb2sgWFNMIHN0eWxlc2hlZXRzIGluc3RhbGxlZCwgcGxlYXNlICIgOworICAgICAgICBFQ0hPICIgIHNldCBET0NCT09LX1hTTF9ESVIgdG8gdGhlIHN0eWxlc2hlZXQgZGlyZWN0b3J5IG9uIGVpdGhlciAiIDsKKyAgICAgICAgRUNITyAiICB0aGUgY29tbWFuZCBsaW5lICh2aWEgLXNET0NCT09LX1hTTF9ESVI9Li4uKSBvciBpbiBhICIgOworICAgICAgICBFQ0hPICIgIEJvb3N0LkphbSBjb25maWd1cmF0aW9uIGZpbGUuIFRoZSBEb2NCb29rIFhTTCBzdHlsZXNoZWV0cyAiIDsKKyAgICAgICAgRUNITyAiICBhcmUgYXZhaWxhYmxlIGhlcmU6IGh0dHA6Ly9kb2Nib29rLnNvdXJjZWZvcmdlLm5ldC8gIiA7CisgICAgICAgIEVDSE8gIiAgU3R5bGVzaGVldHMgd2lsbCBiZSBkb3dubG9hZGVkIG9uLXRoZS1mbHkgKHZlcnkgc2xvdyEpICIgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkb2Nib29rLXhzbC1kaXIgPSBbIGZvcm1hdC1jYXRhbG9nLXBhdGggJChkb2Nib29rLXhzbC1kaXIpIF0gOworICAgICAgICBwcmludC50ZXh0ICIgIDxyZXdyaXRlVVJJIHVyaVN0YXJ0U3RyaW5nPVwiaHR0cDovL2RvY2Jvb2suc291cmNlZm9yZ2UubmV0L3JlbGVhc2UveHNsL2N1cnJlbnQvXCIgcmV3cml0ZVByZWZpeD1cImZpbGU6Ly8kKGRvY2Jvb2steHNsLWRpcikvXCIvPiIgOworICAgIH0KKworICAgIGxvY2FsIGRvY2Jvb2stZHRkLWRpciA9IFsgYm9vc3Rib29rLmRvY2Jvb2stZHRkLWRpciBdIDsKKyAgICBpZiAhICQoZG9jYm9vay1kdGQtZGlyKQorICAgIHsKKyAgICAgICAgRUNITyAiQm9vc3RCb29rIHdhcm5pbmc6IG5vIERvY0Jvb2sgRFREIGRpcmVjdG9yeSBzcGVjaWZpZWQuIiA7CisgICAgICAgIEVDSE8gIiAgSWYgeW91IGhhdmUgdGhlIERvY0Jvb2sgRFREIGluc3RhbGxlZCwgcGxlYXNlIHNldCAiIDsKKyAgICAgICAgRUNITyAiICBET0NCT09LX0RURF9ESVIgdG8gdGhlIERURCBkaXJlY3Rvcnkgb24gZWl0aGVyICIgOworICAgICAgICBFQ0hPICIgIHRoZSBjb21tYW5kIGxpbmUgKHZpYSAtc0RPQ0JPT0tfRFREX0RJUj0uLi4pIG9yIGluIGEgIiA7CisgICAgICAgIEVDSE8gIiAgQm9vc3QuSmFtIGNvbmZpZ3VyYXRpb24gZmlsZS4gVGhlIERvY0Jvb2sgRFREIGlzIGF2YWlsYWJsZSAiIDsKKyAgICAgICAgRUNITyAiICBoZXJlOiBodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMi9pbmRleC5zaHRtbCIgOworICAgICAgICBFQ0hPICIgIFRoZSBEVEQgd2lsbCBiZSBkb3dubG9hZGVkIG9uLXRoZS1mbHkgKHZlcnkgc2xvdyEpICIgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkb2Nib29rLWR0ZC1kaXIgPSBbIGZvcm1hdC1jYXRhbG9nLXBhdGggJChkb2Nib29rLWR0ZC1kaXIpIF0gOworICAgICAgICBwcmludC50ZXh0ICIgIDxyZXdyaXRlVVJJIHVyaVN0YXJ0U3RyaW5nPVwiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjIvXCIgcmV3cml0ZVByZWZpeD1cImZpbGU6Ly8kKGRvY2Jvb2stZHRkLWRpcikvXCIvPiIgOworICAgIH0KKworICAgIHByaW50LnRleHQgIjwvY2F0YWxvZz4iIDsKK30KKworCisjIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdsb2JhbCBYTUwgY2F0YWxvZyB0YXJnZXQsIGNyZWF0aW5nIGl0IGxhemlseSBpZgorIyBuZWVkZWQuIFRvIGdldCB0aGUgZ2xvYmFsIGNhdGFsb2cgZ2VuZXJhdGVkIG9ubHkgb25jZSB3ZSBkbyBub3QgY3JlYXRlIGl0IGluCisjIGV2ZXJ5IHByb2plY3QgdGhhdCByZXF1ZXN0cyBpdCBidXQgaW5zdGVhZCBvbmx5IGNyZWF0ZSBpdCBiYXNlZCBvbiB0aGUgZmlyc3QKKyMgcHJvamVjdCByZXF1ZXN0aW5nIGl0IGFuZCB0aGVuIHJldXNlIGl0IGZyb20gdGhlcmUgZm9yIGFueSBsYXRlciByZXF1ZXN0cy4KKyMKKyMgVG8gZ2V0ICdhcyBjbG9zZSBhcyBwb3NzaWJsZScgdG8gaGF2aW5nIHRoZSBnbG9iYWwgY2F0YWxvZyBzdG9yZWQgaW4gdGhlIHNhbWUKKyMgbG9jYXRpb24gaW5kZXBlbmRlbnQgb2Ygd2hpY2ggZm9sZGVyIG91ciBidWlsZCB3YXMgcnVuIGZyb20sIHdlIGFzc2lnbiBpdHMKKyMgdGFyZ2V0IHRvIHRoZSBnaXZlbiBwcm9qZWN0J3MgYmFzZSBKYW1yb290IHByb2plY3QuIFRoaXMgd29ya3MgY29ycmVjdGx5IGFzCisjIGxvbmcgYXMgd2Uga25vdyB0aGUgcGFzc2VkIHByb2plY3QgaXMgbm90IHN0YW5kYWxvbmUgb3Igb25lIG9mIEJvb3N0IEJ1aWxkJ3MKKyMgY29uZmlndXJhdGlvbiBtb2R1bGUgcHJvamVjdHMsIGFzIHRob3NlIHRvIG5vdCBoYXZlIGEgSmFtcm9vdCBwcm9qZWN0IGluIHRoZWlyCisjIHBhcmVudCBjaGFpbi4gTm90ZSBhbHNvIHRoYXQgd2UgY2FuIHN0aWxsIGdldCBvdXIgdGFyZ2V0cyBnZW5lcmF0ZWQgaW4KKyMgZGlmZmVyZW50IGZvbGRlcnMgaW4gY2FzZSB3aGVuIG9uZSBidWlsZCBwcm9qZWN0IHJlZmVyZW5jZXMgYSB0YXJnZXQgZnJvbQorIyBhbm90aGVyIGJ1aWxkIHByb2plY3Qgd2l0aCBpdHMgb3duIHNlcGFyYXRlIEphbXJvb3QuCisjCisjIEZJWE1FOiBJZGVhbGx5IHRoZSBjYXRhbG9nIHRhcmdldCBzaG91bGQgYmUgY3JlYXRlZCBhcyBwYXJ0IG9mIHRoZSBib29zdGJvb2sKKyMgcHJvamVjdCBhbmQgc3RvcmVkIGluIHNvbWUgY2VudHJhbCBsb2NhdGlvbiBmb3IgYWxsIHVzZWQgc3RhbmRhbG9uZSBwb2plY3RzLAorIyBzaGFyZWQgYmV0d2VlbiBhbGwgYnVpbGRzIG1hZGUgb24gdGhhdCBzeXN0ZW0uIFRoaXMgaG93ZXZlciB3b3VsZCByZXF1aXJlIG11Y2gKKyMgbW9yZSB0aG91Z2ggdG8gYWRkIHRoZSBuZWNlc3NhcnkgY2hhbmdlcyB0byBCb29zdCBCdWlsZCdzIGludGVybmFsIGRlc2lnbi4KKyMKK2xvY2FsIHJ1bGUgeG1sLWNhdGFsb2cgKCBwcm9qZWN0ICkKK3sKKyAgICBpZiAhICQoLnhtbC1jYXRhbG9nKQorICAgIHsKKyAgICAgICAgbG9jYWwgcHJvamVjdC1tb2R1bGUgPSBbICQocHJvamVjdCkucHJvamVjdC1tb2R1bGUgXSA7CisgICAgICAgIGxvY2FsIHJvb3QtbW9kdWxlID0gWyBwcm9qZWN0LmdldC1qYW1yb290LW1vZHVsZSAkKHByb2plY3QtbW9kdWxlKSBdIDsKKyAgICAgICAgaWYgISAkKHJvb3QtbW9kdWxlKQorICAgICAgICB7CisgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgIGlmIFsgcHJvamVjdC5pcy1jb25maWctbW9kdWxlICQocHJvamVjdC1tb2R1bGUpIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMudXNlci1lcnJvciBib29zdGJvb2sgdGFyZ2V0cyBjYW4gbm90IGJlIGRlY2xhcmVkIGluIEJvb3N0CisgICAgICAgICAgICAgICAgICAgIEJ1aWxkJ3MgY29uZmlndXJhdGlvbiBtb2R1bGVzLiA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgYm9vc3Rib29rIHRhcmdldHMgY2FuIG5vdCBiZSBkZWNsYXJlZCBpbgorICAgICAgICAgICAgICAgICAgICBzdGFuZGFsb25lIHByb2plY3RzLiA6IHVzZSBhIEphbWZpbGUvSmFtcm9vdCBwcm9qZWN0CisgICAgICAgICAgICAgICAgICAgIGluc3RlYWQuIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2NhbCByb290LXByb2plY3QgPSBbIHByb2plY3QudGFyZ2V0ICQocm9vdC1tb2R1bGUpIF0gOworCisgICAgICAgIC54bWwtY2F0YWxvZyA9IFsgdmlydHVhbC10YXJnZXQucmVnaXN0ZXIgWyBuZXcgZmlsZS10YXJnZXQKKyAgICAgICAgICAgIGJvb3N0Ym9va19jYXRhbG9nIDogWE1MIDogJChyb290LXByb2plY3QpIDogWyBuZXcgYWN0aW9uIDoKKyAgICAgICAgICAgIGJvb3N0Ym9vay5nZW5lcmF0ZS14bWwtY2F0YWxvZyBdIF0gXSA7CisgICAgICAgIC54bWwtY2F0YWxvZy1maWxlID0gWyAkKC54bWwtY2F0YWxvZykucGF0aCBdIFsgJCgueG1sLWNhdGFsb2cpLm5hbWUgXSA7CisgICAgICAgIC54bWwtY2F0YWxvZy1maWxlID0gJCgueG1sLWNhdGFsb2ctZmlsZTpKPS8pIDsKKyAgICB9CisgICAgcmV0dXJuICQoLnhtbC1jYXRhbG9nKSAkKC54bWwtY2F0YWxvZy1maWxlKSA7Cit9CisKKworY2xhc3MgYm9vc3Rib29rLXRhcmdldC1jbGFzcyA6IGJhc2ljLXRhcmdldAoreworICAgIGltcG9ydCBnZW5lcmF0b3JzIDsKKyAgICBpbXBvcnQgcHJvcGVydHktc2V0IDsKKyAgICBpbXBvcnQgdmlydHVhbC10YXJnZXQgOworCisgICAgcnVsZSBjb25zdHJ1Y3QgKCBuYW1lIDogc291cmNlcyAqIDogcHJvcGVydHktc2V0ICkKKyAgICB7CisgICAgICAgICMgR2VuZXJhdGUgdGhlIGNhdGFsb2csIGJ1dCBvbmx5IG9uY2UuCisgICAgICAgIElNUE9SVCBib29zdGJvb2sgOiB4bWwtY2F0YWxvZyA6ICQoX19uYW1lX18pIDogYm9vc3Rib29rLnhtbC1jYXRhbG9nIDsKKyAgICAgICAgbG9jYWwgZ2xvYmFsLWNhdGFsb2cgPSBbIGJvb3N0Ym9vay54bWwtY2F0YWxvZyBbIHByb2plY3QgXSBdIDsKKyAgICAgICAgbG9jYWwgY2F0YWxvZyA9ICQoZ2xvYmFsLWNhdGFsb2dbMV0pIDsKKyAgICAgICAgbG9jYWwgY2F0YWxvZy1maWxlID0gJChnbG9iYWwtY2F0YWxvZ1syXSkgOworICAgICAgICBsb2NhbCB0YXJnZXRzIDsKKworICAgICAgICAjIEFkZCB0aGUgY2F0YWxvZyB0byB0aGUgcHJvcGVydHkgc2V0LgorICAgICAgICBwcm9wZXJ0eS1zZXQgPSBbICQocHJvcGVydHktc2V0KS5hZGQtcmF3IDxjYXRhbG9nPiQoY2F0YWxvZy1maWxlKSBdIDsKKworICAgICAgICBsb2NhbCB0eXBlID0gbm9uZSA7CisgICAgICAgIGxvY2FsIG1hbmlmZXN0IDsKKyAgICAgICAgbG9jYWwgZm9ybWF0ID0gWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxmb3JtYXQ+IF0gOworICAgICAgICBzd2l0Y2ggJChmb3JtYXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgaHRtbCAgICAgOiB0eXBlID0gSFRNTERJUiA7IG1hbmlmZXN0ID0gSFRNTC5tYW5pZmVzdCA7CisgICAgICAgICAgICBjYXNlIHhodG1sICAgIDogdHlwZSA9IFhIVE1MRElSIDsgbWFuaWZlc3QgPSBIVE1MLm1hbmlmZXN0IDsKKyAgICAgICAgICAgIGNhc2UgaHRtbGhlbHAgOiB0eXBlID0gSFRNTEhFTFAgOyBtYW5pZmVzdCA9IEhUTUwubWFuaWZlc3QgOworICAgICAgICAgICAgY2FzZSBvbmVodG1sICA6IHR5cGUgPSBIVE1MIDsKKyAgICAgICAgICAgIGNhc2UgbWFuICAgICAgOiB0eXBlID0gTUFOUEFHRVMgOyBtYW5pZmVzdCA9IG1hbi5tYW5pZmVzdCA7CisgICAgICAgICAgICBjYXNlIGRvY2Jvb2sgIDogdHlwZSA9IERPQ0JPT0sgOworICAgICAgICAgICAgY2FzZSBmbyAgICAgICA6IHR5cGUgPSBGTyA7CisgICAgICAgICAgICBjYXNlIHBkZiAgICAgIDogdHlwZSA9IFBERiA7CisgICAgICAgICAgICBjYXNlIHBzICAgICAgIDogdHlwZSA9IFBTIDsKKyAgICAgICAgICAgIGNhc2UgdGVzdHMgICAgOiB0eXBlID0gVEVTVFMgOworICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgdGFyZ2V0IDsKKyAgICAgICAgaWYgJChtYW5pZmVzdCkKKyAgICAgICAgeworICAgICAgICAgICAgIyBTb3VyY2VzIC0tPiBET0NCT09LLgorICAgICAgICAgICAgbG9jYWwgZG9jYm9vay10YXJnZXQgPSBbIGdlbmVyYXRvcnMuY29uc3RydWN0IFsgcHJvamVjdCBdIDogRE9DQk9PSworICAgICAgICAgICAgICAgIDogJChwcm9wZXJ0eS1zZXQpIDogJChzb3VyY2VzKSBdIDsKKyAgICAgICAgICAgIGRvY2Jvb2stdGFyZ2V0ID0gJChkb2Nib29rLXRhcmdldFsyXSkgOworICAgICAgICAgICAgJChkb2Nib29rLXRhcmdldCkuZGVwZW5kcyAkKGNhdGFsb2cpIDsKKworICAgICAgICAgICAgIyBET0NCT09LIC0tPiB0eXBlLgorICAgICAgICAgICAgdGFyZ2V0ID0gWyBnZW5lcmF0b3JzLmNvbnN0cnVjdCBbIHByb2plY3QgXSAkKG5hbWUpXyQobWFuaWZlc3QpIDoKKyAgICAgICAgICAgICAgICAkKHR5cGUpIDogWyAkKHByb3BlcnR5LXNldCkuYWRkLXJhdworICAgICAgICAgICAgICAgIDx4c2w6cGFyYW0+bWFuaWZlc3Q9JChuYW1lKV8kKG1hbmlmZXN0KSBdIDogJChkb2Nib29rLXRhcmdldCkgXQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIHRhcmdldCA9ICQodGFyZ2V0WzJdKSA7CisgICAgICAgICAgICBsb2NhbCBuYW1lID0gWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxuYW1lPiBdIDsKKyAgICAgICAgICAgIG5hbWUgPz0gJChmb3JtYXQpIDsKKyAgICAgICAgICAgICQodGFyZ2V0KS5zZXQtcGF0aCAkKG5hbWUpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICMgU291cmNlcyAtLT4gdHlwZS4KKyAgICAgICAgICAgIHRhcmdldCA9IFsgZ2VuZXJhdG9ycy5jb25zdHJ1Y3QgWyBwcm9qZWN0IF0gOiAkKHR5cGUpIDoKKyAgICAgICAgICAgICAgICAkKHByb3BlcnR5LXNldCkgOiAkKHNvdXJjZXMpIF0gOworICAgICAgICAgICAgdGFyZ2V0ID0gJCh0YXJnZXRbMl0pIDsKKyAgICAgICAgICAgIGlmICEgJCh0YXJnZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICAgICAgZXJyb3JzLmVycm9yIENhbm5vdCBidWlsZCBkb2N1bWVudGF0aW9uIHR5cGUgJyQoZm9ybWF0KScuIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkKHRhcmdldCkuZGVwZW5kcyAkKGNhdGFsb2cpIDsKKworICAgICAgICByZXR1cm4gWyBwcm9wZXJ0eS1zZXQuZW1wdHkgXSAkKHRhcmdldCkgOworICAgIH0KK30KKworCisjIERlY2xhcmUgYSBib29zdGJvb2sgdGFyZ2V0LgorIworcnVsZSBib29zdGJvb2sgKCB0YXJnZXQtbmFtZSA6IHNvdXJjZXMgKiA6IHJlcXVpcmVtZW50cyAqIDogZGVmYXVsdC1idWlsZCAqICkKK3sKKyAgICByZXR1cm4gWyB0YXJnZXRzLmNyZWF0ZS1tZXRhdGFyZ2V0IGJvb3N0Ym9vay10YXJnZXQtY2xhc3MgOgorICAgICAgICBbIHByb2plY3QuY3VycmVudCBdIDogJCh0YXJnZXQtbmFtZSkgOiAkKHNvdXJjZXMpIDogJChyZXF1aXJlbWVudHMpIDoKKyAgICAgICAgJChkZWZhdWx0LWJ1aWxkKSBdIDsKK30KKworCitydWxlIGJvb3N0Ym9vay10by10ZXN0cyAoIHRhcmdldCA6IHNvdXJjZSA6IHByb3BlcnRpZXMgKiApCit7CisgICAgbG9jay1jb25maWcgOworICAgIGxvY2FsIGJvb3N0X3Jvb3QgPSBbIG1vZHVsZXMucGVlayA6IEJPT1NUX1JPT1QgXSA7CisgICAgbG9jYWwgbmF0aXZlLXBhdGggPSBbIHBhdGgubmF0aXZlIFsgcGF0aC5qb2luICQoLmJvb3N0Ym9vay14c2wtZGlyKSB0ZXN0aW5nCisgICAgICAgIEphbWZpbGUgXSBdIDsKKyAgICBsb2NhbCBzdHlsZXNoZWV0ID0gJChuYXRpdmUtcGF0aDpTPS54c2wpIDsKKyAgICB4c2x0cHJvYy54c2x0ICQodGFyZ2V0KSA6ICQoc291cmNlKSAkKHN0eWxlc2hlZXQpIDogJChwcm9wZXJ0aWVzKQorICAgICAgICA8eHNsOnBhcmFtPmJvb3N0LnJvb3Q9JChib29zdF9yb290KSA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRGVwZW5kZW5jeSBzY2FubmVycworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgWEluY2x1ZGUgc2Nhbm5lci4gTW9zdGx5IHN0b2xlbiBmcm9tIGMtc2Nhbm5lci4gOikKKyMgTm90ZSB0aGF0IHRoaXMgYXNzdW1lcyBhbiAieGkiIHByZWZpeCBmb3IgWEluY2x1ZGVzLiBUaGlzIGlzIG5vdCBhbHdheXMgdGhlCisjIGNhc2UgZm9yIFhNTCBkb2N1bWVudHMsIGJ1dCB3ZSBhc3N1bWUgaXQgaXMgdHJ1ZSBmb3IgYW55dGhpbmcgd2UgZW5jb3VudGVyLgorIworY2xhc3MgeGluY2x1ZGUtc2Nhbm5lciA6IHNjYW5uZXIKK3sKKyAgICBpbXBvcnQgc2Nhbm5lciA7CisKKyAgICBydWxlIF9faW5pdF9fICggaW5jbHVkZXMgKiApCisgICAgeworICAgICAgICBzY2FubmVyLl9faW5pdF9fIDsKKyAgICAgICAgc2VsZi5pbmNsdWRlcyA9ICQoaW5jbHVkZXMpIDsKKyAgICB9CisKKyAgICBydWxlIHBhdHRlcm4gKCApCisgICAgeworICAgICAgICByZXR1cm4gInhpOmluY2x1ZGVbIF0qaHJlZj1cIihbXlwiXSopXCIiIDsKKyAgICB9CisKKyAgICBydWxlIHByb2Nlc3MgKCB0YXJnZXQgOiBtYXRjaGVzICogOiBiaW5kaW5nICkKKyAgICB7CisgICAgICAgIGxvY2FsIHRhcmdldF9wYXRoID0gWyBOT1JNQUxJWkVfUEFUSCAkKGJpbmRpbmc6RCkgXSA7CisKKyAgICAgICAgTk9DQVJFICQobWF0Y2hlcykgOworICAgICAgICBJTkNMVURFUyAkKHRhcmdldCkgOiAkKG1hdGNoZXMpIDsKKyAgICAgICAgU0VBUkNIIG9uICQobWF0Y2hlcykgPSAkKHRhcmdldF9wYXRoKSAkKHNlbGYuaW5jbHVkZXM6Rz0pIDsKKworICAgICAgICBzY2FubmVyLnByb3BhZ2F0ZSAkKF9fbmFtZV9fKSA6ICQobWF0Y2hlcykgOiAkKHRhcmdldCkgOworICAgIH0KK30KKworc2Nhbm5lci5yZWdpc3RlciB4aW5jbHVkZS1zY2FubmVyIDogeHNsOnBhdGggOwordHlwZS5zZXQtc2Nhbm5lciBYTUwgOiB4aW5jbHVkZS1zY2FubmVyIDsKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvYm9ybGFuZC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2JvcmxhbmQuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDNjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2JvcmxhbmQuamFtCkBAIC0wLDAgKzEsMjIwIEBACisjIENvcHlyaWdodCAyMDA1IERhdmUgQWJyYWhhbXMgCisjIENvcHlyaWdodCAyMDAzIFJlbmUgUml2ZXJhIAorIyBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNSBWbGFkaW1pciBQcnVzIAorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIAorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisjICBTdXBwb3J0IGZvciB0aGUgQm9ybGFuZCdzIGNvbW1hbmQgbGluZSBjb21waWxlcgorCitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IG9zIDsKK2ltcG9ydCB0b29sc2V0IDogZmxhZ3MgOworaW1wb3J0IGZlYXR1cmUgOiBnZXQtdmFsdWVzIDsKK2ltcG9ydCB0eXBlIDsKK2ltcG9ydCBjb21tb24gOworCitmZWF0dXJlLmV4dGVuZCB0b29sc2V0IDogYm9ybGFuZCA7CisKK3J1bGUgaW5pdCAoIHZlcnNpb24gPyA6IGNvbW1hbmQgKiA6IG9wdGlvbnMgKiApCit7CisgICAgbG9jYWwgY29uZGl0aW9uID0gWyBjb21tb24uY2hlY2staW5pdC1wYXJhbWV0ZXJzIGJvcmxhbmQgOgorICAgICAgICB2ZXJzaW9uICQodmVyc2lvbikgXSA7CisgICAgCisgICAgbG9jYWwgY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgYm9ybGFuZCA6IGJjYzMyLmV4ZSAKKyAgICAgICAgOiAkKGNvbW1hbmQpIF0gOworICAgICAKKyAgICBjb21tb24uaGFuZGxlLW9wdGlvbnMgYm9ybGFuZCA6ICQoY29uZGl0aW9uKSA6ICQoY29tbWFuZCkgOiAkKG9wdGlvbnMpIDsgICAgCisgICAgCisgICAgaWYgJChjb21tYW5kKQorICAgIHsKKyAgICAgICAgY29tbWFuZCA9IFsgY29tbW9uLmdldC1hYnNvbHV0ZS10b29sLXBhdGggJChjb21tYW5kWy0xXSkgXSA7CisgICAgfSAgIAorICAgIHJvb3QgPSAkKGNvbW1hbmQ6RCkgOyAgICAKKyAgICAKKyAgICBmbGFncyBib3JsYW5kLmNvbXBpbGUgU1RESERSUyAkKGNvbmRpdGlvbikgOiAkKHJvb3QpL2luY2x1ZGUvIDsKKyAgICBmbGFncyBib3JsYW5kLmxpbmsgU1RETElCUEFUSCAkKGNvbmRpdGlvbikgOiAkKHJvb3QpL2xpYiA7CisgICAgZmxhZ3MgYm9ybGFuZC5saW5rIFJVTl9QQVRIICQoY29uZGl0aW9uKSA6ICQocm9vdCkvYmluIDsKKyAgICBmbGFncyBib3JsYW5kIC5yb290ICQoY29uZGl0aW9uKSA6ICQocm9vdCkvYmluLyA7ICAgIAorfQorCisKKyMgQSBib3JsYW5kLXNwZWNpZmljIHRhcmdldCB0eXBlCit0eXBlLnJlZ2lzdGVyIEJPUkxBTkQuVERTIDogdGRzIDsKKworIyBEZWNsYXJlIGdlbmVyYXRvcnMKKworZ2VuZXJhdG9ycy5yZWdpc3Rlci1saW5rZXIgYm9ybGFuZC5saW5rIDogT0JKIFNFQVJDSEVEX0xJQiBTVEFUSUNfTElCIElNUE9SVF9MSUIgOiBFWEUgOiA8dG9vbHNldD5ib3JsYW5kIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXItbGlua2VyIGJvcmxhbmQubGluay5kbGwgOiBPQkogU0VBUkNIRURfTElCIFNUQVRJQ19MSUIgSU1QT1JUX0xJQiA6IFNIQVJFRF9MSUIgSU1QT1JUX0xJQiA6IDx0b29sc2V0PmJvcmxhbmQgOworCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWFyY2hpdmVyIGJvcmxhbmQuYXJjaGl2ZSA6IE9CSiA6IFNUQVRJQ19MSUIgOiA8dG9vbHNldD5ib3JsYW5kIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBib3JsYW5kLmNvbXBpbGUuYysrIDogQ1BQIDogT0JKIDogPHRvb2xzZXQ+Ym9ybGFuZCA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgYm9ybGFuZC5jb21waWxlLmMgOiBDIDogT0JKIDogPHRvb2xzZXQ+Ym9ybGFuZCA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIGJvcmxhbmQuYXNtIDogQVNNIDogT0JKIDogPHRvb2xzZXQ+Ym9ybGFuZCA7CisKKyMgRGVjbGFyZSBmbGFncyAKKworZmxhZ3MgYm9ybGFuZC5jb21waWxlIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b24gOiAtdiA7CitmbGFncyBib3JsYW5kLmxpbmsgT1BUSU9OUyA8ZGVidWctc3ltYm9scz5vbiA6IC12IDsKKworZmxhZ3MgYm9ybGFuZC5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5vZmYgOiAtT2QgOworZmxhZ3MgYm9ybGFuZC5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGVlZCA6IC1PMiA7CitmbGFncyBib3JsYW5kLmNvbXBpbGUgT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwYWNlIDogLU8xIDsKKworaWYgJCguQk9STEFORF9IQVNfRklYRURfSU5MSU5JTkdfQlVHUykKK3sKKyAgICBmbGFncyBib3JsYW5kIENGTEFHUyA8aW5saW5pbmc+b2ZmIDogLXZpLSA7CisgICAgZmxhZ3MgYm9ybGFuZCBDRkxBR1MgPGlubGluaW5nPm9uIDogLXZpIC13LWlubCA7CisgICAgZmxhZ3MgYm9ybGFuZCBDRkxBR1MgPGlubGluaW5nPmZ1bGwgOiAtdmkgLXctaW5sIDsKK30KK2Vsc2UKK3sKKyAgICBmbGFncyBib3JsYW5kIENGTEFHUyA6IC12aS0gOworfQorCitmbGFncyBib3JsYW5kLmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3M+b2ZmIDogLXctIDsKK2ZsYWdzIGJvcmxhbmQuY29tcGlsZSBPUFRJT05TIDx3YXJuaW5ncz5hbGwgOiAtdyA7CitmbGFncyBib3JsYW5kLmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3MtYXMtZXJyb3JzPm9uIDogLXchIDsKKworCisjIERlYWwgd2l0aCB2YXJpb3VzIHJ1bnRpbWUgY29uZmlncy4uLgorCisjIFRoaXMgc2hvdWxkIGJlIG5vdCBmb3IgRExMCitmbGFncyBib3JsYW5kIE9QVElPTlMgPHVzZXItaW50ZXJmYWNlPmNvbnNvbGUgOiAtdFdDIDsKKworIyAtdFdSIHNldHMgLXRXIGFzIHdlbGwsIHNvIHdlIHR1cm4gaXQgb2ZmIGhlcmUgYW5kIHRoZW4gdHVybiBpdCAKKyMgb24gYWdhaW4gbGF0ZXIgaWYgd2UgbmVlZCBpdDoKK2ZsYWdzIGJvcmxhbmQgT1BUSU9OUyA8cnVudGltZS1saW5rPnNoYXJlZCA6IC10V1IgLXRXQyA7CitmbGFncyBib3JsYW5kIE9QVElPTlMgPHVzZXItaW50ZXJmYWNlPmd1aSA6IC10VyA7CisKK2ZsYWdzIGJvcmxhbmQgT1BUSU9OUyA8bWFpbi10YXJnZXQtdHlwZT5MSUIvPGxpbms+c2hhcmVkIDogLXRXRCA7CisjIEhtbS4uIG5vdCBzdXJlIHdoYXQncyBnb2luZyBvbiBoZXJlLgorZmxhZ3MgYm9ybGFuZCBPUFRJT05TIDogLVdNLSA7CitmbGFncyBib3JsYW5kIE9QVElPTlMgPHRocmVhZGluZz5tdWx0aSA6IC10V00gOworCisKKworZmxhZ3MgYm9ybGFuZC5jb21waWxlIE9QVElPTlMgPGN4eGZsYWdzPiA7CitmbGFncyBib3JsYW5kLmNvbXBpbGUgREVGSU5FUyA8ZGVmaW5lPiA7CitmbGFncyBib3JsYW5kLmNvbXBpbGUgSU5DTFVERVMgPGluY2x1ZGU+IDsKKworZmxhZ3MgYm9ybGFuZCBORUVEX0lNUExJQiA8bWFpbi10YXJnZXQtdHlwZT5MSUIvPGxpbms+c2hhcmVkIDogIiIgOworCisjCisjIGZvciBDKysgY29tcGlsZXMgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSB0dXJuZWQgb24gYnkgZGVmYXVsdDoKKyMKKyMgLWo1ICAgIHN0b3BzIGFmdGVyIDUgZXJyb3JzCisjIC1nMjU1ICBhbGxvdyBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIHdhcm5pbmdzCisjIC1xICAgICBubyBiYW5uZXIKKyMgLWMgICAgIGNvbXBpbGUgdG8gb2JqZWN0CisjIC1QICAgICBDKysgY29kZSByZWdhcmRsZXNzIG9mIGZpbGUgZXh0ZW50aW9uCisjIC1hOCAgICA4IGJ5dGUgYWxpZ25tZW50LCB0aGlzIG9wdGlvbiBpcyBvbiBpbiB0aGUgSURFIGJ5IGRlZmF1bHQgCisjICAgICAgICBhbmQgZWZmZWN0cyBiaW5hcnkgY29tcGF0aWJpbGl0eS4KKyMKKworIyAtVSQoVU5ERUZTKSAtRCQoREVGSU5FUykgJChDRkxBR1MpICQoQysrRkxBR1MpIC1JIiQoSERSUykiICAtSSIkKFNUREhEUlMpIiAtbyIkKDwpIiAiJCg+KSIKKworCithY3Rpb25zIGNvbXBpbGUuYysrCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAtajUgLWcyNTUgLXEgLWMgLVAgLWE4IC1WeC0gLVZlLSAtYi0gJChPUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC1JIiQoU1RESERSUykiIC1vIiQoPCkiICIkKD4pIgorfQorCisjIEZvciBDLCB3ZSBkb24ndCBwYXNzIC1QIGZsYWcKK2FjdGlvbnMgY29tcGlsZS5jCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAtajUgLWcyNTUgLXEgLWMgLWE4IC1WeC0gLVZlLSAtYi0gJChPUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC1JIiQoU1RESERSUykiIC1vIiQoPCkiICIkKD4pIgorfQorCisKKyMgRGVjbGFyZSBmbGFncyBhbmQgYWN0aW9uIGZvciBsaW5raW5nCit0b29sc2V0LmZsYWdzIGJvcmxhbmQubGluayBPUFRJT05TIDxkZWJ1Zy1zeW1ib2xzPm9uIDogLXYgOwordG9vbHNldC5mbGFncyBib3JsYW5kLmxpbmsgTElCUkFSWV9QQVRIIDxsaWJyYXJ5LXBhdGg+IDsKK3Rvb2xzZXQuZmxhZ3MgYm9ybGFuZC5saW5rIEZJTkRMSUJTX1NUIDxmaW5kLXN0YXRpYy1saWJyYXJ5PiA7Cit0b29sc2V0LmZsYWdzIGJvcmxhbmQubGluayBGSU5ETElCU19TQSA8ZmluZC1zaGFyZWQtbGlicmFyeT4gOwordG9vbHNldC5mbGFncyBib3JsYW5kLmxpbmsgTElCUkFSSUVTIDxsaWJyYXJ5LWZpbGU+IDsKKworZmxhZ3MgYm9ybGFuZC5saW5rIE9QVElPTlMgPGxpbmtmbGFncz4gOworZmxhZ3MgYm9ybGFuZC5saW5rIE9QVElPTlMgPGxpbms+c2hhcmVkIDogLXRXRCA7CisKK2ZsYWdzIGJvcmxhbmQubGluayBMSUJSQVJZX1BBVEhfT1BUSU9OIDx0b29sc2V0PmJvcmxhbmQgOiAtTCA6IHVuY2hlY2tlZCA7CitmbGFncyBib3JsYW5kLmxpbmsgTElCUkFSWV9PUFRJT04gPHRvb2xzZXQ+Ym9ybGFuZCA6ICIiIDogdW5jaGVja2VkIDsKKworCisKKyMgYmNjMzIgbmVlZHMgdG8gaGF2ZSBpbGluazMyIGluIHRoZSBwYXRoIGluIG9yZGVyIHRvIGludm9rZSBpdCwgc28gZXhwbGljaXRseQorIyBzcGVjaWZ5aW5nICQoQkNDX1RPT0xfUEFUSCliY2MzMiBkb2Vzbid0IGhlbHAuIFlvdSBuZWVkIHRvIGFkZAorIyAkKEJDQ19UT09MX1BBVEgpIHRvIHRoZSBwYXRoCisjIFRoZSBORUVEX0lNUExJQiB2YXJpYWJsZSBjb250cm9scyB3aGV0aGVyIHdlIG5lZWQgdG8gaW52b2tlIGltcGxpYi4KKworZmxhZ3MgYm9ybGFuZC5hcmNoaXZlIEFST1BUSU9OUyA8YXJjaGl2ZWZsYWdzPiA7CisKKyMgRGVjbGFyZSBhY3Rpb24gZm9yIGFyY2hpdmVzLiBXZSBkb24ndCB1c2UgcmVzcG9uc2UgZmlsZQorIyBzaW5jZSBpdCdzIGhhcmQgdG8gZ2V0ICIrLSIgdGhlcmUuCisjIFRoZSAvUDI1NiBpbmNyZWFzZXMgJ3BhZ2UnIHNpemUgLS0gd2l0aCB0b28gbG93CisjIHZhbHVlcyB0bGliIGZhaWxzIHdoZW4gYnVpbGRpbmcgbGFyZ2UgYXBwbGljYXRpb25zLgorIyBDT05TSURFUjogZG9uJ3Qga25vdyB3aGF0ICd0b2dldGhlcicgaXMgZm9yLi4uCithY3Rpb25zIHVwZGF0ZWQgdG9nZXRoZXIgcGllY2VtZWFsIGFyY2hpdmUKK3sgCisgICAgJCguc2V0LXBhdGgpJCgucm9vdDpXKSQoLm9sZC1wYXRoKQorICAgIHRsaWIgJChBUk9QVElPTlMpIC9QMjU2IC91IC9hIC9DICIkKDw6VykiICstIiQoPjpXKSIKK30KKworCitpZiBbIG9zLm5hbWUgXSA9IENZR1dJTgoreworICAgIC5zZXQtcGF0aCA9ICJjbWQgL1MgL0Mgc2V0IFwiUEFUSD0iIDsKKyAgICAub2xkLXBhdGggPSAiOyVQQVRIJVwiIFwiJiZcIiIgOworICAgIAorCisgICAgIyBDb3VsZG4ndCBnZXQgVExJQiB0byBzdG9wIGJlaW5nIGNvbmZ1c2VkIGFib3V0IHBhdGhuYW1lcworICAgICMgY29udGFpbmluZyBkYXNoZXMgKGl0IHNlZW1lZCB0byB0cmVhdCB0aGVtIGFzIG9wdGlvbiBzZXBhcmF0b3JzCisgICAgIyB3aGVuIHBhc3NlZCB0aHJvdWdoIGZyb20gYmFzaCksIHNvIHdlIGV4cGxpY2l0bHkgd3JpdGUgdGhlCisgICAgIyBjb21tYW5kIGludG8gYSAuYmF0IGZpbGUgYW5kIGV4ZWN1dGUgdGhhdC4gIFRMSUIgaXMgYWxzbyBmaW5pY2t5CisgICAgIyBhYm91dCBwYXRobmFtZSBzdHlsZSEgRm9yd2FyZCBzbGFzaGVzLCB0b28sIGFyZSB0cmVhdGVkIGFzCisgICAgIyBvcHRpb25zLgorICAgIGFjdGlvbnMgdXBkYXRlZCB0b2dldGhlciBwaWVjZW1lYWwgYXJjaGl2ZQorICAgIHsgCisgICAgICAgY2hkaXIgJCg8OkQpCisgICAgICAgZWNobyArLSQoPjpCUykgPiAkKDw6QlMpLnJzcAorICAgICAgICQoLnNldC1wYXRoKSQoLnJvb3QpJCgub2xkLXBhdGgpICJ0bGliLmV4ZSIgJChBUk9QVElPTlMpIC9QMjU2IC9DICQoPDpCUykgQCQoPDpCUykucnNwICYmICQoUk0pICQoPDpCUykucnNwCisgICAgfSAgICAKK30KK2Vsc2UgaWYgWyBvcy5uYW1lIF0gPSBOVAoreworICAgIC5zZXQtcGF0aCA9ICJzZXQgXCJQQVRIPSIgOworICAgIC5vbGQtcGF0aCA9ICI7JVBBVEglXCIKKyAgICAgICIgOworfQorZWxzZQoreworICAgIC5zZXQtcGF0aCA9ICJQQVRIPVwiIiA7CisgICAgLm9sZC1wYXRoID0gIlwiOiRQQVRICisgICAgICBleHBvcnQgUEFUSAorICAgICAgIiA7Cit9CisKK1JNID0gWyBjb21tb24ucm0tY29tbWFuZCBdIDsKKworbmwgPSAiCisiIDsKKworYWN0aW9ucyBsaW5rCit7CisgICAgJCguc2V0LXBhdGgpJCgucm9vdDpXKSQoLm9sZC1wYXRoKSAiJChDT05GSUdfQ09NTUFORCkiIC12IC1xICQoT1BUSU9OUykgLUwiJChMSUJSQVJZX1BBVEg6VykiIC1MIiQoU1RETElCUEFUSDpXKSIgLWUiJCg8WzFdOlcpIiBAIkAoJCg8WzFdOlcpLnJzcDpFPSQobmwpIiQoPikiICQobmwpJChMSUJSQVJJRVMpICQobmwpIiQoTElCUkFSWV9PUFRJT04pJChGSU5ETElCU19TVDpTPS5saWIpIiAkKG5sKSIkKExJQlJBUllfT1BUSU9OKSQoRklORExJQlNfU0E6Uz0ubGliKSIpIgorfQorCisKK2FjdGlvbnMgbGluay5kbGwgYmluZCBMSUJSQVJJRVMgUlNQCit7CisgICAgJCguc2V0LXBhdGgpJCgucm9vdDpXKSQoLm9sZC1wYXRoKSAiJChDT05GSUdfQ09NTUFORCkiIC12IC1xICQoT1BUSU9OUykgLUwiJChMSUJSQVJZX1BBVEg6VykiIC1MIiQoU1RETElCUEFUSDpXKSIgLWUiJCg8WzFdOlcpIiBAIkAoJCg8WzFdOlcpLnJzcDpFPSQobmwpIiQoPikiICQobmwpJChMSUJSQVJJRVMpICQobmwpIiQoTElCUkFSWV9PUFRJT04pJChGSU5ETElCU19TVDpTPS5saWIpIiAkKG5sKSIkKExJQlJBUllfT1BUSU9OKSQoRklORExJQlNfU0E6Uz0ubGliKSIpIiAgJiYgIiQoLnJvb3QpaW1wbGliIiAiJCg8WzJdOlcpIiAiJCg8WzFdOlcpIgorfQorCisjIEl0IHNlZW1zIGltcG9zc2libGUgdG8gc3BlY2lmeSBvdXRwdXQgZmlsZSB3aXRoIGRpcmVjdG9yeSB3aGVuIGNvbXBpbGluZworIyBhc20gZmlsZXMgdXNpbmcgYmNjMzIsIHNvIHVzZSB0YXNtMzIgZGlyZWN0bHkuCisjIC9tbCBtYWtlcyBhbGwgc3ltYm9sIG5hbWVzIGNhc2Utc2Vuc2l0aXZlCithY3Rpb25zIGFzbQoreworICAgICQoLnNldC1wYXRoKSQoLnJvb3Q6VykkKC5vbGQtcGF0aCkgdGFzbTMyLmV4ZSAvbWwgIiQoPikiICIkKDwpIgorfQorCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2J1aWx0aW4uamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9idWlsdGluLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWM4MmYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9idWlsdGluLmphbQpAQCAtMCwwICsxLDk3NCBAQAorIyBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBEYXZlIEFicmFoYW1zCisjIENvcHlyaWdodCAyMDAyLCAyMDA1LCAyMDA2LCAyMDA3LCAyMDEwIFJlbmUgUml2ZXJhCisjIENvcHlyaWdodCAyMDA2IEp1ZXJnZW4gSHVub2xkCisjIENvcHlyaWdodCAyMDA1IFRvb24gS25hcGVuCisjIENvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IFZsYWRpbWlyIFBydXMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBEZWZpbmVzIHN0YW5kYXJkIGZlYXR1cmVzIGFuZCBydWxlcy4KKworaW1wb3J0IGFsaWFzIDsKK2ltcG9ydCAiY2xhc3MiIDogbmV3IDsKK2ltcG9ydCBlcnJvcnMgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IG51bWJlcnMgOworaW1wb3J0IG9zIDsKK2ltcG9ydCBwYXRoIDsKK2ltcG9ydCBwcmludCA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IHJlZ2V4IDsKK2ltcG9ydCBzY2FubmVyIDsKK2ltcG9ydCBzZXF1ZW5jZSA7CitpbXBvcnQgc3RhZ2UgOworaW1wb3J0IHN5bWxpbmsgOworaW1wb3J0IHRvb2xzZXQgOworaW1wb3J0IHR5cGUgOworaW1wb3J0IHRhcmdldHMgOworaW1wb3J0IHR5cGVzL3JlZ2lzdGVyIDsKK2ltcG9ydCB1dGlsaXR5IDsKK2ltcG9ydCB2aXJ0dWFsLXRhcmdldCA7CitpbXBvcnQgbWVzc2FnZSA7CitpbXBvcnQgY29udmVydCA7CisKKyMgRklYTUU6IHRoZSBmb2xsb3dpbmcgZ2VuZXJhdGUgbW9kdWxlIGltcG9ydCBpcyBub3QgbmVlZGVkIGhlcmUgYnV0IHJlbW92aW5nIGl0CisjIHRvbyBoYXN0bHkgd2lsbCBicmVhayB1c2luZyBjb2RlIChlLmcuIHRoZSBtYWluIEJvb3N0IGxpYnJhcnkgSmFtcm9vdCBmaWxlKQorIyB0aGF0IGZvcmdvdCB0byBpbXBvcnQgdGhlIGdlbmVyYXRlIG1vZHVsZSBiZWZvcmUgY2FsbGluZyB0aGUgZ2VuZXJhdGUgcnVsZS4KK2ltcG9ydCBnZW5lcmF0ZSA7CisKKworLm9zLW5hbWVzID0gYWl4IGJzZCBjeWd3aW4gZGFyd2luIGZyZWVic2QgaHB1eCBpcGhvbmUgbGludXggbmV0YnNkIG9wZW5ic2Qgb3NmCisgICAgcW54IHFueG50byBzZ2kgc29sYXJpcyB1bml4IHVuaXh3YXJlIHdpbmRvd3MKKyAgICBlbGYgICMgTm90IGFjdHVhbGx5IGFuIE9TIC0tIHVzZWQgZm9yIHRhcmdldGluZyBiYXJlIG1ldGFsIHdoZXJlIG9iamVjdAorICAgICAgICAgIyBmb3JtYXQgaXMgRUxGLiAgVGhpcyBjYXRjaGVzIGJvdGggLWVsZiBhbmQgLWVhYmkgZ2NjIHRhcmdldHMgYW5kIHdlbGwKKyAgICAgICAgICMgYXMgb3RoZXIgY29tcGlsZXJzIHRhcmdldGluZyBFTEYuIEl0IGlzIG5vdCBjbGVhciBob3cgb2Z0ZW4gd2UgbmVlZAorICAgICAgICAgIyB0aGUgJ2VsZicga2V5IGFzIG9wcG9zZWQgdG8gb3RoZXIgYmFyZSBtZXRhbCB0YXJnZXRzLCBidXQgbGV0IHVzCisgICAgICAgICAjIHN0aWNrIHdpdGggZ2NjIG5hbWluZy4KKyAgICA7CisKKyMgRmVhdHVyZSB1c2VkIHRvIGRldGVybWluZSB3aGljaCBPUyB3ZSdyZSBvbi4gTmV3IDx0YXJnZXQtb3M+IGFuZCA8aG9zdC1vcz4KKyMgZmVhdHVyZXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KK2xvY2FsIG9zID0gWyBtb2R1bGVzLnBlZWsgOiBPUyBdIDsKK2ZlYXR1cmUuZmVhdHVyZSBvcyA6ICQob3MpIDogcHJvcGFnYXRlZCBsaW5rLWluY29tcGF0aWJsZSA7CisKKworIyBUcmFuc2xhdGVzIGZyb20gYmphbSBjdXJyZW50IE9TIHRvIHRoZSBvcyB0YWdzIHVzZWQgaW4gaG9zdC1vcyBhbmQgdGFyZ2V0LW9zLAorIyBpLmUuIHJldHVybnMgdGhlIHJ1bm5pbmcgaG9zdC1vcy4KKyMKK2xvY2FsIHJ1bGUgZGVmYXVsdC1ob3N0LW9zICggKQoreworICAgIGxvY2FsIGhvc3Qtb3MgOworICAgIGlmIFsgb3MubmFtZSBdIGluICQoLm9zLW5hbWVzOlUpCisgICAgeworICAgICAgICBob3N0LW9zID0gWyBvcy5uYW1lIF0gOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzd2l0Y2ggWyBvcy5uYW1lIF0KKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBOVCAgICAgICAgICAgOiBob3N0LW9zID0gd2luZG93cyA7CisgICAgICAgICAgICBjYXNlIEFTNDAwICAgICAgICA6IGhvc3Qtb3MgPSB1bml4ICAgIDsKKyAgICAgICAgICAgIGNhc2UgTUlOR1cgICAgICAgIDogaG9zdC1vcyA9IHdpbmRvd3MgOworICAgICAgICAgICAgY2FzZSBCU0RJICAgICAgICAgOiBob3N0LW9zID0gYnNkICAgICA7CisgICAgICAgICAgICBjYXNlIENPSEVSRU5UICAgICA6IGhvc3Qtb3MgPSB1bml4ICAgIDsKKyAgICAgICAgICAgIGNhc2UgRFJBR09ORkxZQlNEIDogaG9zdC1vcyA9IGJzZCAgICAgOworICAgICAgICAgICAgY2FzZSBJUklYICAgICAgICAgOiBob3N0LW9zID0gc2dpICAgICA7CisgICAgICAgICAgICBjYXNlIE1BQ09TWCAgICAgICA6IGhvc3Qtb3MgPSBkYXJ3aW4gIDsKKyAgICAgICAgICAgIGNhc2UgS0ZSRUVCU0QgICAgIDogaG9zdC1vcyA9IGZyZWVic2QgOworICAgICAgICAgICAgY2FzZSBMSU5VWCAgICAgICAgOiBob3N0LW9zID0gbGludXggICA7CisgICAgICAgICAgICBjYXNlIFNVTk9TICAgICAgICA6CisgICAgICAgICAgICAgIEVDSE8gIlN1bk9TIGlzIG5vdCBhIHN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtLiIgOworICAgICAgICAgICAgICBFQ0hPICJXZSBiZWxpZXZlIGxhc3QgdmVyc2lvbiBvZiBTdW5PUyB3YXMgcmVsZWFzZWQgaW4gMTk5MiwgIiA7CisgICAgICAgICAgICAgIEVDSE8gInNvIGlmIHlvdSBnZXQgdGhpcyBtZXNzYWdlLCBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZyB3aXRoIGNvbmZpZ3VyYXRpb24gbG9naWMuICIgOworICAgICAgICAgICAgICBFQ0hPICJQbGVhc2UgcmVwb3J0IHRoaXMgYXMgYSBidWcuICIgOworICAgICAgICAgICAgICBFWElUIDsKKyAgICAgICAgICAgIGNhc2UgKiAgICAgICAgICAgIDogaG9zdC1vcyA9IHVuaXggICAgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKGhvc3Qtb3M6TCkgOworfQorCisKKyMgVGhlIHR3byBPUyBmZWF0dXJlcyBkZWZpbmUgYSBrbm93biBzZXQgb2YgYWJzdHJhY3QgT1MgbmFtZXMuIFRoZSBob3N0LW9zIGlzCisjIHRoZSBPUyB1bmRlciB3aGljaCBiamFtIGlzIHJ1bm5pbmcuIEV2ZW4gdGhvdWdoIHRoaXMgc2hvdWxkIHJlYWxseSBiZSBhIGZpeGVkCisjIHByb3BlcnR5IHdlIG5lZWQgdG8gbGlzdCBhbGwgdGhlIHZhbHVlcyB0byBwcmV2ZW50IHVua25vd24gdmFsdWUgZXJyb3JzLiBCb3RoCisjIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSB0byB0aGUgY3VycmVudCBPUyB0byBhY2NvdW50IGZvciB0aGUgZGVmYXVsdCB1c2UgY2FzZSBvZgorIyBidWlsZGluZyBvbiB0aGUgdGFyZ2V0IE9TLgorZmVhdHVyZS5mZWF0dXJlIGhvc3Qtb3MgOiAkKC5vcy1uYW1lcykgOworZmVhdHVyZS5zZXQtZGVmYXVsdCBob3N0LW9zIDogWyBkZWZhdWx0LWhvc3Qtb3MgXSA7CisKK2ZlYXR1cmUuZmVhdHVyZSB0YXJnZXQtb3MgOiAkKC5vcy1uYW1lcykgOiBwcm9wYWdhdGVkIGxpbmstaW5jb21wYXRpYmxlIDsKK2ZlYXR1cmUuc2V0LWRlZmF1bHQgdGFyZ2V0LW9zIDogWyBkZWZhdWx0LWhvc3Qtb3MgXSA7CisKKworZmVhdHVyZS5mZWF0dXJlIHRvb2xzZXQgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICA6IGltcGxpY2l0IHByb3BhZ2F0ZWQgc3ltbWV0cmljIDsKK2ZlYXR1cmUuZmVhdHVyZSBzdGRsaWIgICAgICAgICAgICAgOiBuYXRpdmUgICAgICAgICAgOiBwcm9wYWdhdGVkIGNvbXBvc2l0ZSA7CitmZWF0dXJlLmZlYXR1cmUgbGluayAgICAgICAgICAgICAgIDogc2hhcmVkIHN0YXRpYyAgIDogcHJvcGFnYXRlZCA7CitmZWF0dXJlLmZlYXR1cmUgcnVudGltZS1saW5rICAgICAgIDogc2hhcmVkIHN0YXRpYyAgIDogcHJvcGFnYXRlZCA7CitmZWF0dXJlLmZlYXR1cmUgcnVudGltZS1kZWJ1Z2dpbmcgIDogb24gb2ZmICAgICAgICAgIDogcHJvcGFnYXRlZCA7CitmZWF0dXJlLmZlYXR1cmUgb3B0aW1pemF0aW9uICAgICAgIDogb2ZmIHNwZWVkIHNwYWNlIG5vbmUgOiBwcm9wYWdhdGVkIDsKK2ZlYXR1cmUuZmVhdHVyZSBwcm9maWxpbmcgICAgICAgICAgOiBvZmYgb24gICAgICAgICAgOiBwcm9wYWdhdGVkIDsKK2ZlYXR1cmUuZmVhdHVyZSBpbmxpbmluZyAgICAgICAgICAgOiBvZmYgb24gZnVsbCAgICAgOiBwcm9wYWdhdGVkIDsKK2ZlYXR1cmUuZmVhdHVyZSB0aHJlYWRpbmcgICAgICAgICAgOiBzaW5nbGUgbXVsdGkgICAgOiBwcm9wYWdhdGVkIDsKK2ZlYXR1cmUuZmVhdHVyZSBydHRpICAgICAgICAgICAgICAgOiBvbiBvZmYgICAgICAgICAgOiBwcm9wYWdhdGVkIDsKK2ZlYXR1cmUuZmVhdHVyZSBleGNlcHRpb24taGFuZGxpbmcgOiBvbiBvZmYgICAgICAgICAgOiBwcm9wYWdhdGVkIDsKKworIyBXaGV0aGVyIHRoZXJlIGlzIHN1cHBvcnQgZm9yIGFzeW5jaHJvbm91cyBFSCAoZS5nLiBjYXRjaGluZyBTRUdWcykuCitmZWF0dXJlLmZlYXR1cmUgYXN5bmNoLWV4Y2VwdGlvbnMgIDogb2ZmIG9uICAgICAgICAgIDogcHJvcGFnYXRlZCA7CisKKyMgV2hldGhlciBhbGwgZXh0ZXJuICJDIiBmdW5jdGlvbnMgYXJlIGNvbnNpZGVyZWQgbm90aHJvdyBieSBkZWZhdWx0LgorZmVhdHVyZS5mZWF0dXJlIGV4dGVybi1jLW5vdGhyb3cgICA6IG9mZiBvbiAgICAgICAgICA6IHByb3BhZ2F0ZWQgOworCitmZWF0dXJlLmZlYXR1cmUgZGVidWctc3ltYm9scyAgICAgIDogb24gb2ZmIG5vbmUgICAgICAgICAgOiBwcm9wYWdhdGVkIDsKKyMgQ29udHJvbHMgd2hldGhlciB0aGUgYmluYXJ5IHNob3VsZCBiZSBzdHJpcHBlZCAtLSB0aGF0IGlzIGhhdmUKKyMgZXZlcnl0aGluZyBub3QgbmVjZXNzYXJ5IHRvIHJ1bm5pbmcgcmVtb3ZlZC4gVGhpcyBvcHRpb24gc2hvdWxkCisjIG5vdCBiZSB2ZXJ5IG9mdGVuIG5lZWRlZC4gQWxzbywgdGhpcyBmZWF0dXJlIHdpbGwgc2hvdyB1cCBpbgorIyB0YXJnZXQgcGF0aHMgb2YgZXZlcnl0aGluZywgbm90IGp1c3QgYmluYXJpZXMuIFNob3VsZCBmaXggdGhhdAorIyB3aGVuIGltcGVsZW1lbnRpbmcgZmVhdHVyZSByZWxldmFuY2UuCitmZWF0dXJlLmZlYXR1cmUgc3RyaXAgICAgICAgICAgICAgIDogb2ZmIG9uICAgICAgICAgIDogcHJvcGFnYXRlZCA7CitmZWF0dXJlLmZlYXR1cmUgZGVmaW5lICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgdW5kZWYgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgImluY2x1ZGUiICAgICAgICAgIDogICAgICAgICAgICAgICAgIDogZnJlZSBwYXRoIDsgI29yZGVyLXNlbnNpdGl2ZSA7CitmZWF0dXJlLmZlYXR1cmUgY2ZsYWdzICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgY3h4ZmxhZ3MgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgZmZsYWdzICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgYXNtZmxhZ3MgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgbGlua2ZsYWdzICAgICAgICAgIDogICAgICAgICAgICAgICAgIDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgYXJjaGl2ZWZsYWdzICAgICAgIDogICAgICAgICAgICAgICAgIDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgdmVyc2lvbiAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDogZnJlZSA7CisKKyMgR2VuZXJpYywgaS5lLiBub24tbGFuZ3VhZ2Ugc3BlY2lmaWMsIGZsYWdzIGZvciB0b29scy4KK2ZlYXR1cmUuZmVhdHVyZSBmbGFncyAgICAgICAgICAgOiA6IGZyZWUgOworZmVhdHVyZS5mZWF0dXJlIGxvY2F0aW9uLXByZWZpeCA6IDogZnJlZSA7CisKKworIyBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbmNpZGVudGFsIHNpbmNlIHRoZXkgaGF2ZSBubyBlZmZlY3Qgb24gYnVpbHQKKyMgcHJvZHVjdHMuIE5vdCBtYWtpbmcgdGhlbSBpbmNpZGVudGFsIHdpbGwgcmVzdWx0IGluIHByb2JsZW1zIGluIGNvcm5lciBjYXNlcywKKyMgZS5nLjoKKyMKKyMgICAgdW5pdC10ZXN0IGEgOiBhLmNwcCA6IDx1c2U+YiA7CisjICAgIGxpYiBiIDogYS5jcHAgYiA7CisjCisjIEhlcmUsIGlmIDx1c2U+IGlzIG5vdCBpbmNpZGVudGFsLCB3ZSB3b3VsZCBkZWNpZGUgd2UgaGF2ZSB0d28gdGFyZ2V0cyBmb3IKKyMgYS5vYmogd2l0aCBkaWZmZXJlbnQgcHJvcGVydGllcyBhbmQgY29tcGxhaW4gYWJvdXQgaXQuCisjCisjIE5vdGUgdGhhdCBtYWtpbmcgYSBmZWF0dXJlIGluY2lkZW50YWwgZG9lcyBub3QgbWVhbiBpdCBpcyBpZ25vcmVkLiBJdCBtYXkgYmUKKyMgaWdub3JlZCB3aGVuIGNyZWF0aW5nIGEgdmlydHVhbCB0YXJnZXQsIGJ1dCB0aGUgcmVzdCBvZiBidWlsZCBwcm9jZXNzIHdpbGwgdXNlCisjIHRoZW0uCitmZWF0dXJlLmZlYXR1cmUgdXNlICAgICAgICAgICAgICAgICA6IDogZnJlZSBkZXBlbmRlbmN5IGluY2lkZW50YWwgOworZmVhdHVyZS5mZWF0dXJlIGRlcGVuZGVuY3kgICAgICAgICAgOiA6IGZyZWUgZGVwZW5kZW5jeSBpbmNpZGVudGFsIDsKK2ZlYXR1cmUuZmVhdHVyZSBpbXBsaWNpdC1kZXBlbmRlbmN5IDogOiBmcmVlIGRlcGVuZGVuY3kgaW5jaWRlbnRhbCA7CisKK2ZlYXR1cmUuZmVhdHVyZSB3YXJuaW5ncyA6CisgICAgb24gICAgICAgICAjIEVuYWJsZSBkZWZhdWx0LyJyZWFzb25hYmxlIiB3YXJuaW5nIGxldmVsIGZvciB0aGUgdG9vbC4KKyAgICBhbGwgICAgICAgICMgRW5hYmxlIGFsbCBwb3NzaWJsZSB3YXJuaW5ncyBpc3N1ZWQgYnkgdGhlIHRvb2wuCisgICAgb2ZmICAgICAgICAjIERpc2FibGUgYWxsIHdhcm5pbmdzIGlzc3VlZCBieSB0aGUgdG9vbC4KKyAgOiBpbmNpZGVudGFsIHByb3BhZ2F0ZWQgOworCitmZWF0dXJlLmZlYXR1cmUgd2FybmluZ3MtYXMtZXJyb3JzIDoKKyAgICBvZmYgICAgICAgICMgRG8gbm90IGZhaWwgdGhlIGNvbXBpbGF0aW9uIGlmIHRoZXJlIGFyZSB3YXJuaW5ncy4KKyAgICBvbiAgICAgICAgICMgRmFpbCB0aGUgY29tcGlsYXRpb24gaWYgdGhlcmUgYXJlIHdhcm5pbmdzLgorICA6IGluY2lkZW50YWwgcHJvcGFnYXRlZCA7CisKKyMgRmVhdHVyZSB0aGF0IGFsbG93cyB1cyB0byBjb25maWd1cmUgdGhlIG1heGltYWwgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBkZXB0aAorIyBsZXZlbCBhbGxvd2VkIGJ5IGEgQysrIGNvbXBpbGVyLiBBcHBsaWVzIG9ubHkgdG8gQysrIHRvb2xzZXRzIHdob3NlIGNvbXBpbGVycworIyBhY3R1YWxseSBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbiBzZXR0aW5nLgorIworIyBOb3RlIHRoYXQgQm9vc3QgQnVpbGQgY3VycmVudGx5IGRvZXMgbm90IGFsbG93IGRlZmluaW5nIGZlYXR1cmVzIHRoYXQgdGFrZSBhbnkKKyMgcG9zaXRpdmUgaW50ZWdyYWwgdmFsdWUgYXMgYSBwYXJhbWV0ZXIsIHdoaWNoIGlzIHdoYXQgd2UgbmVlZCBoZXJlLCBzbyB3ZSBqdXN0CisjIGRlZmluZSBzb21lIG9mIHRoZSB2YWx1ZXMgaGVyZSBhbmQgbGVhdmUgaXQgdXAgdG8gdGhlIHVzZXIgdG8gZXh0ZW5kIHRoaXMgc2V0CisjIGFzIGhlIG5lZWRzIHVzaW5nIHRoZSBmZWF0dXJlLmV4dGVuZCBydWxlLgorIworIyBUT0RPOiBUaGlzIHNob3VsZCBiZSB1cGdyYWRlZCBhcyBzb29uIGFzIEJvb3N0IEJ1aWxkIGFkZHMgc3VwcG9ydCBmb3IgY3VzdG9tCisjIHZhbGlkYXRlZCBmZWF0dXJlIHZhbHVlcyBvciBhdCBsZWFzdCBmZWF0dXJlcyBhbGxvd2luZyBhbnkgcG9zaXRpdmUgaW50ZWdyYWwKKyMgdmFsdWUuIFNlZSByZWxhdGVkIEJvb3N0IEJ1aWxkIHJlbGF0ZWQgdHJhYyB0aWNrZXQgIzE5NC4KKyMKK2ZlYXR1cmUuZmVhdHVyZSBjKystdGVtcGxhdGUtZGVwdGgKKyAgICA6CisgICAgICAgIFsgbnVtYmVycy5yYW5nZSA2NCAxMDI0IDogNjQgXQorICAgICAgICBbIG51bWJlcnMucmFuZ2UgMjAgMTAwMCA6IDEwIF0KKyAgICAgICAgIyAgIE1heGltdW0gdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBkZXB0aCBndWFyYW50ZWVkIGZvciBBTlNJL0lTTyBDKysKKyAgICAgICAgIyBjb25mb3JtaW5nIHByb2dyYW1zLgorICAgICAgICAxNworICAgIDoKKyAgICAgICAgaW5jaWRlbnRhbCBvcHRpb25hbCBwcm9wYWdhdGVkIDsKKworZmVhdHVyZS5mZWF0dXJlIHNvdXJjZSAgICAgICAgICAgICAgOiAgICAgICAgICAgIDogZnJlZSBkZXBlbmRlbmN5IGluY2lkZW50YWwgOworZmVhdHVyZS5mZWF0dXJlIGxpYnJhcnkgICAgICAgICAgICAgOiAgICAgICAgICAgIDogZnJlZSBkZXBlbmRlbmN5IGluY2lkZW50YWwgOworZmVhdHVyZS5mZWF0dXJlIGZpbGUgICAgICAgICAgICAgICAgOiAgICAgICAgICAgIDogZnJlZSBkZXBlbmRlbmN5IGluY2lkZW50YWwgOworZmVhdHVyZS5mZWF0dXJlIGZpbmQtc2hhcmVkLWxpYnJhcnkgOiAgICAgICAgICAgIDogZnJlZSA7ICNvcmRlci1zZW5zaXRpdmUgOworZmVhdHVyZS5mZWF0dXJlIGZpbmQtc3RhdGljLWxpYnJhcnkgOiAgICAgICAgICAgIDogZnJlZSA7ICNvcmRlci1zZW5zaXRpdmUgOworZmVhdHVyZS5mZWF0dXJlIGxpYnJhcnktcGF0aCAgICAgICAgOiAgICAgICAgICAgIDogZnJlZSBwYXRoIDsgI29yZGVyLXNlbnNpdGl2ZSA7CisKKyMgSW50ZXJuYWwgZmVhdHVyZS4KK2ZlYXR1cmUuZmVhdHVyZSBsaWJyYXJ5LWZpbGUgICAgICAgIDogICAgICAgICAgICA6IGZyZWUgZGVwZW5kZW5jeSA7CisKK2ZlYXR1cmUuZmVhdHVyZSBuYW1lICAgICAgICAgICAgICAgIDogICAgICAgICAgICA6IGZyZWUgOworZmVhdHVyZS5mZWF0dXJlIHRhZyAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgIDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgc2VhcmNoICAgICAgICAgICAgICA6ICAgICAgICAgICAgOiBmcmVlIHBhdGggOyAjb3JkZXItc2Vuc2l0aXZlIDsKK2ZlYXR1cmUuZmVhdHVyZSBsb2NhdGlvbiAgICAgICAgICAgIDogICAgICAgICAgICA6IGZyZWUgcGF0aCA7CitmZWF0dXJlLmZlYXR1cmUgZGxsLXBhdGggICAgICAgICAgICA6ICAgICAgICAgICAgOiBmcmVlIHBhdGggOworZmVhdHVyZS5mZWF0dXJlIGhhcmRjb2RlLWRsbC1wYXRocyAgOiB0cnVlIGZhbHNlIDogaW5jaWRlbnRhbCA7CisKKworIyBBbiBpbnRlcm5hbCBmZWF0dXJlIHRoYXQgaG9sZHMgdGhlIHBhdGhzIG9mIGFsbCBkZXBlbmRlbmN5IHNoYXJlZCBsaWJyYXJpZXMuCisjIE9uIFdpbmRvd3MsIGl0IGlzIG5lZWRlZCBzbyB0aGF0IHdlIGNhbiBhZGQgYWxsIHRob3NlIHBhdGhzIHRvIFBBVEggd2hlbgorIyBydW5uaW5nIGFwcGxpY2F0aW9ucy4gT24gTGludXgsIGl0IGlzIG5lZWRlZCB0byBhZGQgcHJvcGVyIC1ycGF0aC1saW5rIGNvbW1hbmQKKyMgbGluZSBvcHRpb25zLgorZmVhdHVyZS5mZWF0dXJlIHhkbGwtcGF0aCA6IDogZnJlZSBwYXRoIDsKKworIyBQcm92aWRlcyBtZWFucyB0byBzcGVjaWZ5IGRlZi1maWxlIGZvciB3aW5kb3dzIERMTHMuCitmZWF0dXJlLmZlYXR1cmUgZGVmLWZpbGUgOiA6IGZyZWUgZGVwZW5kZW5jeSA7CisKK2ZlYXR1cmUuZmVhdHVyZSBzdXBwcmVzcy1pbXBvcnQtbGliIDogZmFsc2UgdHJ1ZSA6IGluY2lkZW50YWwgOworCisjIEludGVybmFsIGZlYXR1cmUgdXNlZCB0byBzdG9yZSB0aGUgbmFtZSBvZiBhIGJqYW0gYWN0aW9uIHRvIGNhbGwgd2hlbiBidWlsZGluZworIyBhIHRhcmdldC4KK2ZlYXR1cmUuZmVhdHVyZSBhY3Rpb24gOiA6IGZyZWUgOworCisjIFRoaXMgZmVhdHVyZSBpcyB1c2VkIHRvIGFsbG93IHNwZWNpZmljIGdlbmVyYXRvcnMgdG8gcnVuLiBGb3IgZXhhbXBsZSwgUVQKKyMgdG9vbHMgY2FuIG9ubHkgYmUgaW52b2tlZCB3aGVuIFFUIGxpYnJhcnkgaXMgdXNlZC4gSW4gdGhhdCBjYXNlLCA8YWxsb3c+cXQKKyMgd2lsbCBiZSBpbiB1c2FnZSByZXF1aXJlbWVudCBvZiB0aGUgbGlicmFyeS4KK2ZlYXR1cmUuZmVhdHVyZSBhbGxvdyA6IDogZnJlZSA7CisKKyMgVGhlIGFkZHJlc3NpbmcgbW9kZWwgdG8gZ2VuZXJhdGUgY29kZSBmb3IuIEN1cnJlbnRseSBhIGxpbWl0ZWQgc2V0IG9ubHkKKyMgc3BlY2lmeWluZyB0aGUgYml0IHNpemUgb2YgcG9pbnRlcnMuCitmZWF0dXJlLmZlYXR1cmUgYWRkcmVzcy1tb2RlbCA6IDE2IDMyIDY0IDMyXzY0IDogcHJvcGFnYXRlZCBvcHRpb25hbCA7CisKKyMgVHlwZSBvZiBDUFUgYXJjaGl0ZWN0dXJlIHRvIGNvbXBpbGUgZm9yLgorZmVhdHVyZS5mZWF0dXJlIGFyY2hpdGVjdHVyZSA6CisgICAgIyB4ODYgYW5kIHg4Ni02NAorICAgIHg4NgorCisgICAgIyBpYTY0CisgICAgaWE2NAorCisgICAgIyBTcGFyYworICAgIHNwYXJjCisKKyAgICAjIFJTLzYwMDAgJiBQb3dlclBDCisgICAgcG93ZXIKKworICAgICMgTUlQUy9TR0kKKyAgICBtaXBzMSBtaXBzMiBtaXBzMyBtaXBzNCBtaXBzMzIgbWlwczMycjIgbWlwczY0CisKKyAgICAjIEhQL1BBLVJJU0MKKyAgICBwYXJpc2MKKworICAgICMgQWR2YW5jZWQgUklTQyBNYWNoaW5lcworICAgIGFybQorCisgICAgIyBDb21iaW5lZCBhcmNoaXRlY3R1cmVzIGZvciBwbGF0Zm9ybXMvdG9vbHNldHMgdGhhdCBzdXBwb3J0IGJ1aWxkaW5nIGZvcgorICAgICMgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyBhdCBvbmNlLiAiY29tYmluZWQiIHdvdWxkIGJlIHRoZSBkZWZhdWx0IG11bHRpLWFyY2gKKyAgICAjIGZvciB0aGUgdG9vbHNldC4KKyAgICBjb21iaW5lZAorICAgIGNvbWJpbmVkLXg4Ni1wb3dlcgorCisgICAgOiBwcm9wYWdhdGVkIG9wdGlvbmFsIDsKKworIyBUaGUgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gc2V0IGluIGFuIGFyY2hpdGVjdHVyZSB0byBjb21waWxlLgorZmVhdHVyZS5mZWF0dXJlIGluc3RydWN0aW9uLXNldCA6CisgICAgIyB4ODYgYW5kIHg4Ni02NAorICAgIG5hdGl2ZSBpNDg2IGk1ODYgaTY4NiBwZW50aXVtIHBlbnRpdW0tbW14IHBlbnRpdW1wcm8gcGVudGl1bTIgcGVudGl1bTMKKyAgICBwZW50aXVtM20gcGVudGl1bS1tIHBlbnRpdW00IHBlbnRpdW00bSBwcmVzY290dCBub2NvbmEgY29yZTIgY29yZWk3IGNvcmVpNy1hdnggY29yZS1hdngtaQorICAgIGNvbnJvZSBjb25yb2UteGUgY29ucm9lLWwgYWxsZW5kYWxlIG1lcm9tIG1lcm9tLXhlIGtlbnRzZmllbGQga2VudHNmaWVsZC14ZSBwZW5yeW4gd29sZmRhbGUKKyAgICB5b3Jrc2ZpZWxkIG5laGFsZW0gc2FuZHktYnJpZGdlIGl2eS1icmlkZ2UgaGFzd2VsbCBrNiBrNi0yIGs2LTMgYXRobG9uIGF0aGxvbi10YmlyZCBhdGhsb24tNCBhdGhsb24teHAKKyAgICBhdGhsb24tbXAgazggb3B0ZXJvbiBhdGhsb242NCBhdGhsb24tZnggazgtc3NlMyBvcHRlcm9uLXNzZTMgYXRobG9uNjQtc3NlMyBhbWRmYW0xMCBiYXJjZWxvbmEKKyAgICBiZHZlcjEgYmR2ZXIyIGJkdmVyMyBidHZlcjEgYnR2ZXIyIHdpbmNoaXAtYzYgd2luY2hpcDIgYzMgYzMtMiBhdG9tCisKKyAgICAjIGlhNjQKKyAgICBpdGFuaXVtIGl0YW5pdW0xIG1lcmNlZCBpdGFuaXVtMiBtY2tpbmxleQorCisgICAgIyBTcGFyYworICAgIHY3IGN5cHJlc3Mgdjggc3VwZXJzcGFyYyBzcGFyY2xpdGUgaHlwZXJzcGFyYyBzcGFyY2xpdGU4NnggZjkzMCBmOTM0CisgICAgc3BhcmNsZXQgdHNjNzAxIHY5IHVsdHJhc3BhcmMgdWx0cmFzcGFyYzMKKworICAgICMgUlMvNjAwMCAmIFBvd2VyUEMKKyAgICA0MDEgNDAzIDQwNSA0MDVmcCA0NDAgNDQwZnAgNTA1IDYwMSA2MDIgNjAzIDYwM2UgNjA0IDYwNGUgNjIwIDYzMCA3NDAgNzQwMAorICAgIDc0NTAgNzUwIDgwMSA4MjEgODIzIDg2MCA5NzAgODU0MCBwb3dlci1jb21tb24gZWM2MDNlIGczIGc0IGc1IHBvd2VyIHBvd2VyMgorICAgIHBvd2VyMyBwb3dlcjQgcG93ZXI1IHBvd2VycGMgcG93ZXJwYzY0IHJpb3MgcmlvczEgcnNjIHJpb3MyIHJzNjRhCisKKyAgICAjIE1JUFMKKyAgICA0a2MgNGtwIDVrYyAyMGtjIG00ayByMjAwMCByMzAwMCByMzkwMCByNDAwMCByNDEwMCByNDMwMCByNDQwMCByNDYwMCByNDY1MAorICAgIHI2MDAwIHI4MDAwIHJtNzAwMCBybTkwMDAgb3Jpb24gc2IxIHZyNDEwMCB2cjQxMTEgdnI0MTIwIHZyNDEzMCB2cjQzMDAKKyAgICB2cjUwMDAgdnI1NDAwIHZyNTUwMAorCisgICAgIyBIUC9QQS1SSVNDCisgICAgNzAwIDcxMDAgNzEwMGxjIDcyMDAgNzMwMCA4MDAwCisKKyAgICAjIEFkdmFuY2VkIFJJU0MgTWFjaGluZXMKKyAgICBhcm12MiBhcm12MmEgYXJtdjMgYXJtdjNtIGFybXY0IGFybXY0dCBhcm12NSBhcm12NXQgYXJtdjV0ZSBhcm12NiBhcm12NmogaXdtbXh0IGVwOTMxMgorCWFybXY3IGFybXY3cworCisgICAgOiBwcm9wYWdhdGVkIG9wdGlvbmFsIDsKKworIyBVc2VkIHRvIHNlbGVjdCBhIHNwZWNpZmljIHZhcmlhbnQgb2YgQysrIEFCSSBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgc2V2ZXJhbC4KK2ZlYXR1cmUuZmVhdHVyZSBjKythYmkgOiA6IHByb3BhZ2F0ZWQgb3B0aW9uYWwgOworCitmZWF0dXJlLmZlYXR1cmUgY29uZGl0aW9uYWwgOiA6IGluY2lkZW50YWwgZnJlZSA7CisKKyMgVGhlIHZhbHVlIG9mICdubycgcHJldmVudHMgYnVpbGRpbmcgb2YgYSB0YXJnZXQuCitmZWF0dXJlLmZlYXR1cmUgYnVpbGQgOiB5ZXMgbm8gOiBvcHRpb25hbCA7CisKKyMgV2luZG93cy1zcGVjaWZpYyBmZWF0dXJlcworCitmZWF0dXJlLmZlYXR1cmUgdXNlci1pbnRlcmZhY2UgOiBjb25zb2xlIGd1aSB3aW5jZSBuYXRpdmUgYXV0byA7CisKK2ZlYXR1cmUuZmVhdHVyZSB2YXJpYW50IDogOiBpbXBsaWNpdCBjb21wb3NpdGUgcHJvcGFnYXRlZCBzeW1tZXRyaWMgOworCisKKyMgRGVjbGFyZXMgYSBuZXcgdmFyaWFudC4KKyMKKyMgRmlyc3QgZGV0ZXJtaW5lcyBleHBsaWNpdCBwcm9wZXJ0aWVzIGZvciB0aGlzIHZhcmlhbnQsIGJ5IHJlZmluaW5nIHBhcmVudHMnCisjIGV4cGxpY2l0IHByb3BlcnRpZXMgd2l0aCB0aGUgcGFzc2VkIGV4cGxpY2l0IHByb3BlcnRpZXMuIFRoZSByZXN1bHQgaXMKKyMgcmVtZW1iZXJlZCBhbmQgd2lsbCBiZSB1c2VkIGlmIHRoaXMgdmFyaWFudCBpcyB1c2VkIGFzIHBhcmVudC4KKyMKKyMgU2Vjb25kLCBkZXRlcm1pbmVzIHRoZSBmdWxsIHByb3BlcnR5IHNldCBmb3IgdGhpcyB2YXJpYW50IGJ5IGFkZGluZyB0byB0aGUKKyMgZXhwbGljaXQgcHJvcGVydGllcyBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG1pc3Npbmcgbm9uLXN5bW1ldHJpYyBwcm9wZXJ0aWVzLgorIworIyBMYXN0bHksIG1ha2VzIGFwcHJvcHJpYXRlIHZhbHVlIG9mICd2YXJpYW50JyBwcm9wZXJ0eSBleHBhbmQgdG8gdGhlIGZ1bGwKKyMgcHJvcGVydHkgc2V0LgorIworcnVsZSB2YXJpYW50ICggbmFtZSAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgdmFyaWFudAorICAgIDogcGFyZW50cy1vci1wcm9wZXJ0aWVzICogICMgU3BlY2lmaWVzIHBhcmVudCB2YXJpYW50cywgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICdleHBsaWNpdC1wcm9wZXJ0aWVzJyBhcmUgZ2l2ZW4sIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXhwbGljaXQtcHJvcGVydGllcyBvciBwYXJlbnRzIG90aGVyd2lzZS4KKyAgICA6IGV4cGxpY2l0LXByb3BlcnRpZXMgKiAgICAjIEV4cGxpY2l0IHByb3BlcnRpZXMuCisgICAgKQoreworICAgIGxvY2FsIHBhcmVudHMgOworICAgIGlmICEgJChleHBsaWNpdC1wcm9wZXJ0aWVzKQorICAgIHsKKyAgICAgICAgaWYgJChwYXJlbnRzLW9yLXByb3BlcnRpZXNbMV06RykKKyAgICAgICAgeworICAgICAgICAgICAgZXhwbGljaXQtcHJvcGVydGllcyA9ICQocGFyZW50cy1vci1wcm9wZXJ0aWVzKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwYXJlbnRzID0gJChwYXJlbnRzLW9yLXByb3BlcnRpZXMpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwYXJlbnRzID0gJChwYXJlbnRzLW9yLXByb3BlcnRpZXMpIDsKKyAgICB9CisKKyAgICAjIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2UgaGF2ZSB0byBjaGVjayBmb3IgY29uZmxpY3RzIGJldHdlZW4gYmFzZSB2YXJpYW50cy4KKyAgICBpZiAkKHBhcmVudHNbMl0pCisgICAgeworICAgICAgICBlcnJvcnMuZXJyb3IgIm11bHRpcGxlIGJhc2UgdmFyaWFudHMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIiA7CisgICAgfQorCisgICAgbG9jYWwgaW5oZXJpdGVkIDsKKyAgICAjIEFkZCBleHBsaWNpdGx5IHNwZWNpZmllZCBwcm9wZXJ0aWVzIGZvciBwYXJlbnRzLgorICAgIGZvciBsb2NhbCBwIGluICQocGFyZW50cykKKyAgICB7CisgICAgICAgICMgVE9ETzogVGhpcyBjaGVjayBtYXkgYmUgbWFkZSBzdHJpY3Rlci4KKyAgICAgICAgaWYgISBbIGZlYXR1cmUuaXMtaW1wbGljaXQtdmFsdWUgJChwKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciAiSW52YWxpZCBiYXNlIHZhcmlhbnQiICQocCkgIDsKKyAgICAgICAgfQorCisgICAgICAgIGluaGVyaXRlZCArPSAkKC5leHBsaWNpdC1wcm9wZXJ0aWVzLiQocCkpIDsKKyAgICB9CisgICAgcHJvcGVydHkudmFsaWRhdGUgJChleHBsaWNpdC1wcm9wZXJ0aWVzKSA7CisgICAgZXhwbGljaXQtcHJvcGVydGllcyA9IFsgcHJvcGVydHkucmVmaW5lICQoaW5oZXJpdGVkKQorICAgICAgICA6ICQoZXhwbGljaXQtcHJvcGVydGllcykgXSA7CisKKyAgICAjIFJlY29yZCBleHBsaWNpdGx5IHNwZWNpZmllZCBwcm9wZXJ0aWVzIGZvciB0aGlzIHZhcmlhbnQuIFdlIGRvIHRoaXMgYWZ0ZXIKKyAgICAjIGluaGVyaXRpbmcgcGFyZW50cycgcHJvcGVydGllcyBzbyB0aGV5IGFmZmVjdCBvdGhlciB2YXJpYW50cyBkZXJpdmVkIGZyb20KKyAgICAjIHRoaXMgb25lLgorICAgIC5leHBsaWNpdC1wcm9wZXJ0aWVzLiQobmFtZSkgPSAkKGV4cGxpY2l0LXByb3BlcnRpZXMpIDsKKworICAgIGZlYXR1cmUuZXh0ZW5kIHZhcmlhbnQgOiAkKG5hbWUpIDsKKyAgICBmZWF0dXJlLmNvbXBvc2UgPHZhcmlhbnQ+JChuYW1lKSA6ICQoZXhwbGljaXQtcHJvcGVydGllcykgOworfQorSU1QT1JUICQoX19uYW1lX18pIDogdmFyaWFudCA6IDogdmFyaWFudCA7CisKKwordmFyaWFudCBkZWJ1ZyAgIDogPG9wdGltaXphdGlvbj5vZmYgPGRlYnVnLXN5bWJvbHM+b24gPGlubGluaW5nPm9mZgorICAgICAgICAgICAgICAgICAgPHJ1bnRpbWUtZGVidWdnaW5nPm9uIDsKK3ZhcmlhbnQgcmVsZWFzZSA6IDxvcHRpbWl6YXRpb24+c3BlZWQgPGRlYnVnLXN5bWJvbHM+b2ZmIDxpbmxpbmluZz5mdWxsCisgICAgICAgICAgICAgICAgICA8cnVudGltZS1kZWJ1Z2dpbmc+b2ZmIDxkZWZpbmU+TkRFQlVHIDsKK3ZhcmlhbnQgcHJvZmlsZSA6IHJlbGVhc2UgOiA8cHJvZmlsaW5nPm9uIDxkZWJ1Zy1zeW1ib2xzPm9uIDsKKworCitjbGFzcyBzZWFyY2hlZC1saWItdGFyZ2V0IDogYWJzdHJhY3QtZmlsZS10YXJnZXQKK3sKKyAgICBydWxlIF9faW5pdF9fICggbmFtZQorICAgICAgICA6IHByb2plY3QKKyAgICAgICAgOiBzaGFyZWQgPworICAgICAgICA6IHNlYXJjaCAqCisgICAgICAgIDogYWN0aW9uCisgICAgKQorICAgIHsKKyAgICAgICAgYWJzdHJhY3QtZmlsZS10YXJnZXQuX19pbml0X18gJChuYW1lKSA6IFNFQVJDSEVEX0xJQiA6ICQocHJvamVjdCkKKyAgICAgICAgICA6ICQoYWN0aW9uKSA6IDsKKworICAgICAgICBzZWxmLnNoYXJlZCA9ICQoc2hhcmVkKSA7CisgICAgICAgIHNlbGYuc2VhcmNoID0gJChzZWFyY2gpIDsKKyAgICB9CisKKyAgICBydWxlIHNoYXJlZCAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYuc2hhcmVkKSA7CisgICAgfQorCisgICAgcnVsZSBzZWFyY2ggKCApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLnNlYXJjaCkgOworICAgIH0KKworICAgIHJ1bGUgYWN0dWFsaXplLWxvY2F0aW9uICggdGFyZ2V0ICkKKyAgICB7CisgICAgICAgIE5PVEZJTEUgJCh0YXJnZXQpIDsKKyAgICB9CisKKyAgICBydWxlIHBhdGggKCApCisgICAgeworICAgIH0KK30KKworCisjIFRoZSBnZW5lcmF0b3IgY2xhc3MgZm9yIGxpYnJhcmllcyAodGFyZ2V0IHR5cGUgTElCKS4gRGVwZW5kaW5nIG9uIHByb3BlcnRpZXMKKyMgaXQgd2lsbCByZXF1ZXN0IGJ1aWxkaW5nIG9mIHRoZSBhcHByb3ByaWF0ZSBzcGVjaWZpYyBsaWJyYXJ5IHR5cGUgLS0KKyMgLS0gU0hBUkVEX0xJQiwgU1RBVElDX0xJQiBvciBTSEFSRURfTElCLgorIworY2xhc3MgbGliLWdlbmVyYXRvciA6IGdlbmVyYXRvcgoreworICAgIHJ1bGUgX19pbml0X18gKCAqIDogKiApCisgICAgeworICAgICAgICBnZW5lcmF0b3IuX19pbml0X18gJCgxKSA6ICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkKKyAgICAgICAgICAgIDogJCg5KSA6ICQoMTApIDogJCgxMSkgOiAkKDEyKSA6ICQoMTMpIDogJCgxNCkgOiAkKDE1KSA6ICQoMTYpIDoKKyAgICAgICAgICAgICQoMTcpIDogJCgxOCkgOiAkKDE5KSA7CisgICAgfQorCisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKiApCisgICAgeworICAgICAgICAjIFRoZSBsaWIgZ2VuZXJhdG9yIGlzIGNvbXBvc2luZywgYW5kIGNhbiBiZSBvbmx5IGludm9rZWQgd2l0aCBhbgorICAgICAgICAjIGV4cGxpY2l0IG5hbWUuIFRoaXMgY2hlY2sgaXMgcHJlc2VudCBpbiBnZW5lcmF0b3IucnVuIChhbmQgc28gaW4KKyAgICAgICAgIyBidWlsdGluLmxpbmtpbmctZ2VuZXJhdG9yKSBidXQgZHVwbGljYXRlZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGV4dHJhCisgICAgICAgICMgd29yay4KKyAgICAgICAgaWYgJChuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBwcm9wZXJ0aWVzID0gWyAkKHByb3BlcnR5LXNldCkucmF3IF0gOworICAgICAgICAgICAgIyBEZXRlcm1pbmUgdGhlIG5lZWRlZCB0YXJnZXQgdHlwZS4KKyAgICAgICAgICAgIGxvY2FsIGFjdHVhbC10eXBlIDsKKyAgICAgICAgICAgICAgICAjIDxzb3VyY2U+ZmlsZXMgY2FuIGJlIGdlbmVyYXRlZCBieSA8Y29uZGl0aW9uYWw+QHJ1bGUgZmVhdHVyZQorICAgICAgICAgICAgICAgICMgaW4gd2hpY2ggY2FzZSB3ZSBkbyBub3QgY29uc2lkZXIgaXQgYSBTRUFSQ0hFRF9MSUIgdHlwZS4KKyAgICAgICAgICAgIGlmICEgPHNvdXJjZT4gaW4gJChwcm9wZXJ0aWVzOkcpICYmCisgICAgICAgICAgICAgICAoIDxzZWFyY2g+IGluICQocHJvcGVydGllczpHKSB8fCA8bmFtZT4gaW4gJChwcm9wZXJ0aWVzOkcpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3R1YWwtdHlwZSA9IFNFQVJDSEVEX0xJQiA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIDxmaWxlPiBpbiAkKHByb3BlcnRpZXM6RykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3R1YWwtdHlwZSA9IExJQiA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIDxsaW5rPnNoYXJlZCBpbiAkKHByb3BlcnRpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWN0dWFsLXR5cGUgPSBTSEFSRURfTElCIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3R1YWwtdHlwZSA9IFNUQVRJQ19MSUIgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvcGVydHktc2V0ID0gWyAkKHByb3BlcnR5LXNldCkuYWRkLXJhdyA8bWFpbi10YXJnZXQtdHlwZT5MSUIgXSA7CisgICAgICAgICAgICAjIENvbnN0cnVjdCB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgcmV0dXJuIFsgZ2VuZXJhdG9ycy5jb25zdHJ1Y3QgJChwcm9qZWN0KSAkKG5hbWUpIDogJChhY3R1YWwtdHlwZSkKKyAgICAgICAgICAgICAgICA6ICQocHJvcGVydHktc2V0KSA6ICQoc291cmNlcykgXSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBydWxlIHZpYWJsZS1zb3VyY2UtdHlwZXMgKCApCisgICAgeworICAgICAgICByZXR1cm4gKiA7CisgICAgfQorfQorCisKK2dlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgbGliLWdlbmVyYXRvciBidWlsdGluLmxpYi1nZW5lcmF0b3IgOiAgOiBMSUIgXSA7CisKKworIyBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICdsaWInIHJ1bGUuIEJleW9uZCBzdGFuZGFyZCBzeW50YXggdGhhdCBydWxlIGFsbG93cworIyBzaW1wbGlmaWVkOiAibGliIGEgYiBjIDsiLgorIworcnVsZSBsaWIgKCBuYW1lcyArIDogc291cmNlcyAqIDogcmVxdWlyZW1lbnRzICogOiBkZWZhdWx0LWJ1aWxkICogOgorICAgIHVzYWdlLXJlcXVpcmVtZW50cyAqICkKK3sKKyAgICBpZiAkKG5hbWVzWzJdKQorICAgIHsKKyAgICAgICAgaWYgPG5hbWU+IGluICQocmVxdWlyZW1lbnRzOkcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9ycy51c2VyLWVycm9yICJXaGVuIHNldmVyYWwgbmFtZXMgYXJlIGdpdmVuIHRvIHRoZSAnbGliJyBydWxlIiA6CisgICAgICAgICAgICAgICAgIml0IGlzIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgdGhlIDxuYW1lPiBmZWF0dXJlLiIgOworICAgICAgICB9CisgICAgICAgIGlmICQoc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgIldoZW4gc2V2ZXJhbCBuYW1lcyBhcmUgZ2l2ZW4gdG8gdGhlICdsaWInIHJ1bGUiIDoKKyAgICAgICAgICAgICAgICAiaXQgaXMgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSBzb3VyY2VzLiIgOworICAgICAgICB9CisgICAgfQorCisgICAgIyBUaGlzIGlzIGEgY2lyY3VsYXIgbW9kdWxlIGRlcGVuZGVuY3kgc28gaXQgbXVzdCBiZSBpbXBvcnRlZCBoZXJlLgorICAgIGltcG9ydCB0YXJnZXRzIDsKKworICAgIGxvY2FsIHByb2plY3QgPSBbIHByb2plY3QuY3VycmVudCBdIDsKKyAgICBsb2NhbCByZXN1bHQgOworCisgICAgZm9yIGxvY2FsIG5hbWUgaW4gJChuYW1lcykKKyAgICB7CisgICAgICAgIGxvY2FsIHIgPSAkKHJlcXVpcmVtZW50cykgOworICAgICAgICAjIFN1cHBvcnQgIiBsaWIgYSA7ICIgYW5kICIgbGliIGEgYiBjIDsgIiBzeW50YXguCisgICAgICAgIGlmICEgJChzb3VyY2VzKSAmJiAhIDxuYW1lPiBpbiAkKHJlcXVpcmVtZW50czpHKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgISA8ZmlsZT4gaW4gJChyZXF1aXJlbWVudHM6RykKKyAgICAgICAgeworICAgICAgICAgICAgciArPSA8bmFtZT4kKG5hbWUpIDsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gWyB0YXJnZXRzLm1haW4tdGFyZ2V0LWFsdGVybmF0aXZlCisgICAgICAgICAgICBbIG5ldyB0eXBlZC10YXJnZXQgJChuYW1lKSA6ICQocHJvamVjdCkgOiBMSUIKKyAgICAgICAgICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1zb3VyY2VzICQoc291cmNlcykgOiAkKG5hbWUpIF0KKyAgICAgICAgICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1yZXF1aXJlbWVudHMgJChyKSA6ICQocHJvamVjdCkgXQorICAgICAgICAgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LWRlZmF1bHQtYnVpbGQgJChkZWZhdWx0LWJ1aWxkKSA6ICQocHJvamVjdCkgXQorICAgICAgICAgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LXVzYWdlLXJlcXVpcmVtZW50cyAkKHVzYWdlLXJlcXVpcmVtZW50cykgOiAkKHByb2plY3QpIF0KKyAgICAgICAgICAgIF0gXSA7CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorSU1QT1JUICQoX19uYW1lX18pIDogbGliIDogOiBsaWIgOworCisKK2NsYXNzIHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOiBnZW5lcmF0b3IKK3sKKyAgICBpbXBvcnQgcHJvcGVydHktc2V0IDsKKworICAgIHJ1bGUgX19pbml0X18gKCApCisgICAgeworICAgICAgICAjIFRoZSByZXF1aXJlbWVudHMgY2F1c2UgdGhlIGdlbmVyYXRvcnMgdG8gYmUgdHJpZWQgKm9ubHkqIHdoZW4gd2UgYXJlCisgICAgICAgICMgYnVpbGRpbmcgYSBsaWIgdGFyZ2V0IHdpdGggYSAnc2VhcmNoJyBmZWF0dXJlLiBUaGlzIHNlZW1zIHVnbHkgLS0tIGFsbAorICAgICAgICAjIHdlIHdhbnQgaXMgdG8gbWFrZSBzdXJlIHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgaXMgbm90IGludm9rZWQgZGVlcAorICAgICAgICAjIGluc2lkZSB0cmFuc2Zvcm1hdGlvbiBzZWFyY2ggdG8gcHJvZHVjZSBpbnRlcm1lZGlhdGUgdGFyZ2V0cy4KKyAgICAgICAgZ2VuZXJhdG9yLl9faW5pdF9fIHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOiA6IFNFQVJDSEVEX0xJQiA7CisgICAgfQorCisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKiApCisgICAgeworICAgICAgICBpZiAkKG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgSWYgJ25hbWUnIGlzIGVtcHR5LCBpdCBtZWFucyB3ZSBoYXZlIG5vdCBiZWVuIGNhbGxlZCB0byBidWlsZCBhCisgICAgICAgICAgICAjIHRvcC1sZXZlbCB0YXJnZXQuIEluIHRoaXMgY2FzZSwgd2UganVzdCBmYWlsIGltbWVkaWF0ZWx5LCBiZWNhdXNlCisgICAgICAgICAgICAjIHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgY2Fubm90IGJlIHVzZWQgdG8gcHJvZHVjZSBpbnRlcm1lZGlhdGUKKyAgICAgICAgICAgICMgdGFyZ2V0cy4KKworICAgICAgICAgICAgbG9jYWwgcHJvcGVydGllcyA9IFsgJChwcm9wZXJ0eS1zZXQpLnJhdyBdIDsKKyAgICAgICAgICAgIGxvY2FsIHNoYXJlZCA7CisgICAgICAgICAgICBpZiA8bGluaz5zaGFyZWQgaW4gJChwcm9wZXJ0aWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNoYXJlZCA9IHRydWUgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2NhbCBzZWFyY2ggPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8c2VhcmNoPiA6ICQocHJvcGVydGllcykgXSA7CisKKyAgICAgICAgICAgIGxvY2FsIGEgPSBbIG5ldyBudWxsLWFjdGlvbiAkKHByb3BlcnR5LXNldCkgXSA7CisgICAgICAgICAgICBsb2NhbCBsaWItbmFtZSA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxuYW1lPiA6ICQocHJvcGVydGllcykgXSA7CisgICAgICAgICAgICBsaWItbmFtZSA/PSAkKG5hbWUpIDsKKyAgICAgICAgICAgIGxvY2FsIHQgPSBbIG5ldyBzZWFyY2hlZC1saWItdGFyZ2V0ICQobGliLW5hbWUpIDogJChwcm9qZWN0KQorICAgICAgICAgICAgICAgIDogJChzaGFyZWQpIDogJChzZWFyY2gpIDogJChhKSBdIDsKKyAgICAgICAgICAgICMgV2UgcmV0dXJuIHNvdXJjZXMgZm9yIGEgc2ltcGxlIHJlYXNvbi4gSWYgdGhlcmUgaXMKKyAgICAgICAgICAgICMgICAgbGliIHBuZyA6IHogOiA8bmFtZT5wbmcgOworICAgICAgICAgICAgIyB0aGUgJ3onIHRhcmdldCBzaG91bGQgYmUgcmV0dXJuZWQsIHNvIHRoYXQgYXBwcyBsaW5raW5nIHRvICdwbmcnCisgICAgICAgICAgICAjIHdpbGwgbGluayB0byAneicsIHRvby4KKyAgICAgICAgICAgIHJldHVybiBbIHByb3BlcnR5LXNldC5jcmVhdGUgPHhkbGwtcGF0aD4kKHNlYXJjaCkgXQorICAgICAgICAgICAgICAgICAgIFsgdmlydHVhbC10YXJnZXQucmVnaXN0ZXIgJCh0KSBdICQoc291cmNlcykgOworICAgICAgICB9CisgICAgfQorfQorCitnZW5lcmF0b3JzLnJlZ2lzdGVyIFsgbmV3IHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgXSA7CisKKworY2xhc3MgcHJlYnVpbHQtbGliLWdlbmVyYXRvciA6IGdlbmVyYXRvcgoreworICAgIHJ1bGUgX19pbml0X18gKCAqIDogKiApCisgICAgeworICAgICAgICBnZW5lcmF0b3IuX19pbml0X18gJCgxKSA6ICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkKKyAgICAgICAgICAgIDogJCg5KSA6ICQoMTApIDogJCgxMSkgOiAkKDEyKSA6ICQoMTMpIDogJCgxNCkgOiAkKDE1KSA6ICQoMTYpIDoKKyAgICAgICAgICAgICQoMTcpIDogJCgxOCkgOiAkKDE5KSA7CisgICAgfQorCisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKiApCisgICAgeworICAgICAgICBsb2NhbCBmID0gWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxmaWxlPiBdIDsKKyAgICAgICAgcmV0dXJuICQoZikgJChzb3VyY2VzKSA7CisgICAgfQorfQorCitnZW5lcmF0b3JzLnJlZ2lzdGVyCisgIFsgbmV3IHByZWJ1aWx0LWxpYi1nZW5lcmF0b3IgYnVpbHRpbi5wcmVidWlsdCA6IDogTElCIDogPGZpbGU+IF0gOworCitnZW5lcmF0b3JzLm92ZXJyaWRlIGJ1aWx0aW4ucHJlYnVpbHQgOiBidWlsdGluLmxpYi1nZW5lcmF0b3IgOworCitjbGFzcyBwcmVwcm9jZXNzZWQtdGFyZ2V0LWNsYXNzIDogYmFzaWMtdGFyZ2V0Cit7CisgICAgaW1wb3J0IGdlbmVyYXRvcnMgOworICAgIHJ1bGUgY29uc3RydWN0ICggbmFtZSA6IHNvdXJjZXMgKiA6IHByb3BlcnR5LXNldCApCisgICAgeworICAgICAgICBsb2NhbCByZXN1bHQgPSBbIGdlbmVyYXRvcnMuY29uc3RydWN0IFsgcHJvamVjdCBdCisgICAgICAgICAgICAkKG5hbWUpIDogUFJFUFJPQ0VTU0VEX0NQUCA6ICQocHJvcGVydHktc2V0KSA6ICQoc291cmNlcykgXSA7CisgICAgICAgIGlmICEgJChyZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFsgZ2VuZXJhdG9ycy5jb25zdHJ1Y3QgWyBwcm9qZWN0IF0KKyAgICAgICAgICAgICAgICAkKG5hbWUpIDogUFJFUFJPQ0VTU0VEX0MgOiAkKHByb3BlcnR5LXNldCkgOiAkKHNvdXJjZXMpIF0gOworICAgICAgICB9CisgICAgICAgIGlmICEgJChyZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHMgOworICAgICAgICAgICAgZm9yIHggaW4gJChzb3VyY2VzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMgKz0gWyAkKHgpLm5hbWUgXSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NhbCBwID0gWyBwcm9qZWN0IF0gOworICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IKKyAgICAgICAgICAgICAgICAiSW4gcHJvamVjdCIgWyAkKHApLm5hbWUgXSA6CisgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjb25zdHJ1Y3QgcHJlcHJvY2Vzc2VkIGZpbGUgXCIkKG5hbWUpXCIgZnJvbSAkKHM6Sj0sICkuIiA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQocmVzdWx0KSA7CisgICAgfQorfQorCitydWxlIHByZXByb2Nlc3NlZCAoIG5hbWUgOiBzb3VyY2VzICogOiByZXF1aXJlbWVudHMgKiA6IGRlZmF1bHQtYnVpbGQgKiA6CisgICAgdXNhZ2UtcmVxdWlyZW1lbnRzICogKQoreworICAgIGxvY2FsIHByb2plY3QgPSBbIHByb2plY3QuY3VycmVudCBdIDsKKyAgICByZXR1cm4gWyB0YXJnZXRzLm1haW4tdGFyZ2V0LWFsdGVybmF0aXZlCisgICAgICAgIFsgbmV3IHByZXByb2Nlc3NlZC10YXJnZXQtY2xhc3MgJChuYW1lKSA6ICQocHJvamVjdCkKKyAgICAgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LXNvdXJjZXMgJChzb3VyY2VzKSA6ICQobmFtZSkgXQorICAgICAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtcmVxdWlyZW1lbnRzICQocmVxdWlyZW1lbnRzKSA6ICQocHJvamVjdCkgXQorICAgICAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtZGVmYXVsdC1idWlsZCAkKGRlZmF1bHQtYnVpbGQpIDogJChwcm9qZWN0KSBdCisgICAgICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC11c2FnZS1yZXF1aXJlbWVudHMgJCh1c2FnZS1yZXF1aXJlbWVudHMpIDogJChwcm9qZWN0KSBdCisgICAgICAgIF0gXSA7Cit9CisKK0lNUE9SVCAkKF9fbmFtZV9fKSA6IHByZXByb2Nlc3NlZCA6IDogcHJlcHJvY2Vzc2VkIDsKKworY2xhc3MgY29tcGlsZS1hY3Rpb24gOiBhY3Rpb24KK3sKKyAgICBpbXBvcnQgc2VxdWVuY2UgOworCisgICAgcnVsZSBfX2luaXRfXyAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IGFjdGlvbi1uYW1lIDogcHJvcGVydGllcyAqICkKKyAgICB7CisgICAgICAgIGFjdGlvbi5fX2luaXRfXyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQoYWN0aW9uLW5hbWUpIDogJChwcm9wZXJ0aWVzKSA7CisgICAgfQorCisgICAgIyBGb3IgYWxsIHZpcnR1YWwgdGFyZ2V0cyBmb3IgdGhlIHNhbWUgZGVwZW5kZW5jeSBncmFwaCBhcyBzZWxmLCBpLmUuIHdoaWNoCisgICAgIyBiZWxvbmcgdG8gdGhlIHNhbWUgbWFpbiB0YXJnZXQsIGFkZCB0aGVpciBkaXJlY3RvcmllcyB0byB0aGUgaW5jbHVkZSBwYXRoLgorICAgICMKKyAgICBydWxlIGFkanVzdC1wcm9wZXJ0aWVzICggcHJvcGVydHktc2V0ICkKKyAgICB7CisgICAgICAgIGxvY2FsIHMgPSBbICQoc2VsZi50YXJnZXRzWzFdKS5jcmVhdGluZy1zdWJ2YXJpYW50IF0gOworICAgICAgICBpZiAkKHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBbICQocHJvcGVydHktc2V0KS5hZGQtcmF3CisgICAgICAgICAgICAgIFsgJChzKS5pbXBsaWNpdC1pbmNsdWRlcyAiaW5jbHVkZSIgOiBIIF0gXSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gJChwcm9wZXJ0eS1zZXQpIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIERlY2xhcmUgYSBzcGVjaWFsIGNvbXBpbGVyIGdlbmVyYXRvci4gVGhlIG9ubHkgdGhpbmcgaXQgZG9lcyBpcyBjaGFuZ2luZyB0aGUKKyMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCAnYWN0aW9uJyBpbiB0aGUgY29uc3RydWN0ZWQgZGVwZW5kZW5jeSBncmFwaCB0bworIyAnY29tcGlsZS1hY3Rpb24nLiBUaGF0IGNsYXNzIGluIHR1cm4gYWRkcyBhZGRpdGlvbmFsIGluY2x1ZGUgcGF0aHMgdG8gaGFuZGxlCisjIGNhc2VzIHdoZW4gYSBzb3VyY2UgZmlsZSBpbmNsdWRlcyBoZWFkZXJzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgdGhlbXNlbHZlcy4KKyMKK2NsYXNzIEMtY29tcGlsaW5nLWdlbmVyYXRvciA6IGdlbmVyYXRvcgoreworICAgIHJ1bGUgX19pbml0X18gKCBpZCA6IHNvdXJjZS10eXBlcyArIDogdGFyZ2V0LXR5cGVzICsgOiByZXF1aXJlbWVudHMgKgorICAgICAgICA6IG9wdGlvbmFsLXByb3BlcnRpZXMgKiApCisgICAgeworICAgICAgICBnZW5lcmF0b3IuX19pbml0X18gJChpZCkgOiAkKHNvdXJjZS10eXBlcykgOiAkKHRhcmdldC10eXBlcykgOgorICAgICAgICAgICAgJChyZXF1aXJlbWVudHMpIDogJChvcHRpb25hbC1wcm9wZXJ0aWVzKSA7CisgICAgfQorCisgICAgcnVsZSBhY3Rpb24tY2xhc3MgKCApCisgICAgeworICAgICAgICByZXR1cm4gY29tcGlsZS1hY3Rpb24gOworICAgIH0KK30KKworCitydWxlIHJlZ2lzdGVyLWMtY29tcGlsZXIgKCBpZCA6IHNvdXJjZS10eXBlcyArIDogdGFyZ2V0LXR5cGVzICsgOiByZXF1aXJlbWVudHMgKgorICAgIDogb3B0aW9uYWwtcHJvcGVydGllcyAqICkKK3sKKyAgICBnZW5lcmF0b3JzLnJlZ2lzdGVyIFsgbmV3IEMtY29tcGlsaW5nLWdlbmVyYXRvciAkKGlkKSA6ICQoc291cmNlLXR5cGVzKSA6CisgICAgICAgICQodGFyZ2V0LXR5cGVzKSA6ICQocmVxdWlyZW1lbnRzKSA6ICQob3B0aW9uYWwtcHJvcGVydGllcykgXSA7Cit9CisKKyMgRklYTUU6IHRoaXMgaXMgdWdseSwgc2hvdWxkIGZpbmQgYSBiZXR0ZXIgd2F5ICh3ZSB3b3VsZCBsaWtlIGNsaWVudCBjb2RlIHRvCisjIHJlZ2lzdGVyIGFsbCBnZW5lcmF0b3JzIGFzICJnZW5lcmF0b3JzLnNvbWUtcnVsZSIgaW5zdGVhZCBvZgorIyAic29tZS1tb2R1bGUuc29tZS1ydWxlIi4pCisjCitJTVBPUlQgJChfX25hbWVfXykgOiByZWdpc3Rlci1jLWNvbXBpbGVyIDogOiBnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgOworCisKKyMgVGhlIGdlbmVyYXRvciBjbGFzcyBmb3IgaGFuZGxpbmcgRVhFIGFuZCBTSEFSRURfTElCIGNyZWF0aW9uLgorIworY2xhc3MgbGlua2luZy1nZW5lcmF0b3IgOiBnZW5lcmF0b3IKK3sKKyAgICBpbXBvcnQgcGF0aCA7CisgICAgaW1wb3J0IHByb2plY3QgOworICAgIGltcG9ydCBwcm9wZXJ0eS1zZXQgOworICAgIGltcG9ydCB0eXBlIDsKKworICAgIHJ1bGUgX19pbml0X18gKCBpZAorICAgICAgICBjb21wb3NpbmcgPyAgICA6ICAjIFRoZSBnZW5lcmF0b3Igd2lsbCBiZSBjb21wb3NpbmcgaWYgYSBub24tZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdHJpbmcgaXMgcGFzc2VkIG9yIHRoZSBwYXJhbWV0ZXIgaXMgbm90IGdpdmVuLiBUbworICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ha2UgdGhlIGdlbmVyYXRvciBub24tY29tcG9zaW5nLCBwYXNzIGFuIGVtcHR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyaW5nICgiIikuCisgICAgICAgIHNvdXJjZS10eXBlcyArIDoKKyAgICAgICAgdGFyZ2V0LXR5cGVzICsgOgorICAgICAgICByZXF1aXJlbWVudHMgKiApCisgICAgeworICAgICAgICBjb21wb3NpbmcgPz0gdHJ1ZSA7CisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyAkKGlkKSAkKGNvbXBvc2luZykgOiAkKHNvdXJjZS10eXBlcykKKyAgICAgICAgICAgIDogJCh0YXJnZXQtdHlwZXMpIDogJChyZXF1aXJlbWVudHMpIDsKKyAgICB9CisKKyAgICBydWxlIHJ1biAoIHByb2plY3QgbmFtZSA/IDogcHJvcGVydHktc2V0IDogc291cmNlcyArICkKKyAgICB7CisgICAgICAgIHNvdXJjZXMgKz0gWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxsaWJyYXJ5PiAgXSA7CisKKyAgICAgICAgIyBBZGQgPGxpYnJhcnktcGF0aD4gcHJvcGVydGllcyBmb3IgYWxsIHNlYXJjaGVkIGxpYnJhcmllcy4KKyAgICAgICAgbG9jYWwgZXh0cmEgOworICAgICAgICBmb3IgbG9jYWwgcyBpbiAkKHNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIFsgJChzKS50eXBlIF0gPSBTRUFSQ0hFRF9MSUIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBzZWFyY2ggPSBbICQocykuc2VhcmNoIF0gOworICAgICAgICAgICAgICAgIGV4dHJhICs9IDxsaWJyYXJ5LXBhdGg+JChzZWFyY2gpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICMgSXQgaXMgcG9zc2libGUgdGhhdCBzb3VyY2VzIGluY2x1ZGUgc2hhcmVkIGxpYnJhcmllcyB0aGF0IGRpZCBub3QgY2FtZQorICAgICAgICAjIGZyb20gJ2xpYicgdGFyZ2V0cywgZS5nLiAuc28gZmlsZXMgc3BlY2lmaWVkIGFzIHNvdXJjZXMuIEluIHRoaXMgY2FzZQorICAgICAgICAjIHdlIGhhdmUgdG8gYWRkIGV4dHJhIGRsbC1wYXRoIHByb3BlcnRpZXMgYW5kIHByb3BhZ2F0ZSBleHRyYSB4ZGxsLXBhdGgKKyAgICAgICAgIyBwcm9wZXJ0aWVzIHNvIHRoYXQgYXBwbGljYXRpb24gbGlua2luZyB0byB1cyB3aWxsIGdldCB4ZGxsLXBhdGggdG8KKyAgICAgICAgIyB0aG9zZSBsaWJyYXJpZXMuCisgICAgICAgIGxvY2FsIGV4dHJhLXhkbGwtcGF0aHMgOworICAgICAgICBmb3IgbG9jYWwgcyBpbiAkKHNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIFsgdHlwZS5pcy1kZXJpdmVkIFsgJChzKS50eXBlIF0gU0hBUkVEX0xJQiBdICYmICEgWyAkKHMpLmFjdGlvbiBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBVbmZvcnR1bmF0ZWx5LCB3ZSBkbyBub3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIGZpbmQgdGhlIHBhdGggdG8gYQorICAgICAgICAgICAgICAgICMgZmlsZSwgc28gdXNlIHRoaXMgbmFzdHkgYXBwcm9hY2guCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgVE9ETzogVGhpcyBuZWVkcyB0byBiZSBkb25lIGJldHRlci4gT25lIHRoaW5nIHRoYXQgaXMgcmVhbGx5CisgICAgICAgICAgICAgICAgIyBicm9rZW4gd2l0aCB0aGlzIGlzIHRoYXQgaXQgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgd2l0aAorICAgICAgICAgICAgICAgICMgcHJvamVjdHMgaGF2aW5nIG11bHRpcGxlIHNvdXJjZSBsb2NhdGlvbnMuCisgICAgICAgICAgICAgICAgbG9jYWwgcCA9IFsgJChzKS5wcm9qZWN0IF0gOworICAgICAgICAgICAgICAgIGxvY2FsIGxvY2F0aW9uID0gWyBwYXRoLnJvb3QgWyAkKHMpLm5hbWUgXQorICAgICAgICAgICAgICAgICAgICBbICQocCkuZ2V0IHNvdXJjZS1sb2NhdGlvbiBdIF0gOworICAgICAgICAgICAgICAgIGV4dHJhLXhkbGwtcGF0aHMgKz0gWyBwYXRoLnBhcmVudCAkKGxvY2F0aW9uKSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICMgSGFyZGNvZGUgRExMIHBhdGhzIG9ubHkgd2hlbiBsaW5raW5nIGV4ZWN1dGFibGVzLgorICAgICAgICAjIFByb3M6IGRvIG5vdCBuZWVkIHRvIHJlbGluayBsaWJyYXJpZXMgd2hlbiBpbnN0YWxsaW5nLgorICAgICAgICAjIENvbnM6ICJzdGFuZGFsb25lIiBsaWJyYXJpZXMgKHBsdWdpbnMsIHB5dGhvbiBleHRlbnNpb25zKSBjYW4gbm90CisgICAgICAgICMgaGFyZGNvZGUgcGF0aHMgdG8gZGVwZW5kZW50IGxpYnJhcmllcy4KKyAgICAgICAgaWYgWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxoYXJkY29kZS1kbGwtcGF0aHM+IF0gPSB0cnVlCisgICAgICAgICAgICAmJiBbIHR5cGUuaXMtZGVyaXZlZCAkKHNlbGYudGFyZ2V0LXR5cGVzWzFdKSBFWEUgXQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCB4ZGxsLXBhdGggPSBbICQocHJvcGVydHktc2V0KS5nZXQgPHhkbGwtcGF0aD4gXSA7CisgICAgICAgICAgICBleHRyYSArPSA8ZGxsLXBhdGg+JCh4ZGxsLXBhdGgpIDxkbGwtcGF0aD4kKGV4dHJhLXhkbGwtcGF0aHMpIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICQoZXh0cmEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3BlcnR5LXNldCA9IFsgJChwcm9wZXJ0eS1zZXQpLmFkZC1yYXcgJChleHRyYSkgXSA7CisgICAgICAgIH0KKworICAgICAgICBsb2NhbCByZXN1bHQgPSBbIGdlbmVyYXRvci5ydW4gJChwcm9qZWN0KSAkKG5hbWUpIDogJChwcm9wZXJ0eS1zZXQpCisgICAgICAgICAgICA6ICQoc291cmNlcykgXSA7CisKKyAgICAgICAgbG9jYWwgdXIgOworICAgICAgICBpZiAkKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdXIgPSBbIGV4dHJhLXVzYWdlLXJlcXVpcmVtZW50cyAkKHJlc3VsdCkgOiAkKHByb3BlcnR5LXNldCkgXSA7CisgICAgICAgICAgICB1ciA9IFsgJCh1cikuYWRkCisgICAgICAgICAgICAgIFsgcHJvcGVydHktc2V0LmNyZWF0ZSA8eGRsbC1wYXRoPiQoZXh0cmEteGRsbC1wYXRocykgXSBdIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJCh1cikgJChyZXN1bHQpIDsKKyAgICB9CisKKyAgICBydWxlIGV4dHJhLXVzYWdlLXJlcXVpcmVtZW50cyAoIGNyZWF0ZWQtdGFyZ2V0cyAqIDogcHJvcGVydHktc2V0ICkKKyAgICB7CisgICAgICAgIGxvY2FsIHJlc3VsdCA9IFsgcHJvcGVydHktc2V0LmVtcHR5IF0gOworICAgICAgICBsb2NhbCBleHRyYSA7CisKKyAgICAgICAgIyBBZGQgYXBwcm9wcmljYXRlIDx4ZGxsLXBhdGg+IHVzYWdlIHJlcXVpcmVtZW50cy4KKyAgICAgICAgbG9jYWwgcmF3ID0gWyAkKHByb3BlcnR5LXNldCkucmF3IF0gOworICAgICAgICBpZiA8bGluaz5zaGFyZWQgaW4gJChyYXcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHBhdGhzIDsKKyAgICAgICAgICAgIGxvY2FsIHB3ZCA9IFsgcGF0aC5wd2QgXSA7CisgICAgICAgICAgICBmb3IgbG9jYWwgdCBpbiAkKGNyZWF0ZWQtdGFyZ2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiBbIHR5cGUuaXMtZGVyaXZlZCBbICQodCkudHlwZSBdIFNIQVJFRF9MSUIgXQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aHMgKz0gWyBwYXRoLnJvb3QgWyBwYXRoLm1ha2UgWyAkKHQpLnBhdGggXSBdICQocHdkKSBdIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHRyYSArPSAkKHBhdGhzOkc9PHhkbGwtcGF0aD4pIDsKKyAgICAgICAgfQorCisgICAgICAgICMgV2UgbmVlZCB0byBwYXNzIDx4ZGxsLXBhdGg+IGZlYXR1cmVzIHRoYXQgd2UndmUgZ290IGZyb20gc291cmNlcywKKyAgICAgICAgIyBiZWNhdXNlIGlmIGEgc2hhcmVkIGxpYnJhcnkgaXMgYnVpbHQsIGV4ZSB1c2luZyBpdCBuZWVkcyB0byBrbm93IHBhdGhzCisgICAgICAgICMgdG8gb3RoZXIgc2hhcmVkIGxpYnJhcmllcyB0aGlzIG9uZSBkZXBlbmRzIG9uIGluIG9yZGVyIHRvIGJlIGFibGUgdG8KKyAgICAgICAgIyBmaW5kIHRoZW0gYWxsIGF0IHJ1bnRpbWUuCisKKyAgICAgICAgIyBKdXN0IHBhc3MgYWxsIGZlYXR1cmVzIGluIHByb3BlcnR5LXNldCwgaXQgaXMgdGhlb3JpY2FsbHkgcG9zc2libGUKKyAgICAgICAgIyB0aGF0IHdlIHdpbGwgcHJvcGFnYXRlIDx4ZGxsLXBhdGg+IGZlYXR1cmVzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5CisgICAgICAgICMgdGhlIHVzZXIsIGJ1dCB0aGVuIHRoZSB1c2VyIGlzIHRvIGJsYWltIGZvciB1c2luZyBhbiBpbnRlcm5hbCBmZWF0dXJlLgorICAgICAgICBsb2NhbCB2YWx1ZXMgPSBbICQocHJvcGVydHktc2V0KS5nZXQgPHhkbGwtcGF0aD4gXSA7CisgICAgICAgIGV4dHJhICs9ICQodmFsdWVzOkc9PHhkbGwtcGF0aD4pIDsKKworICAgICAgICBpZiAkKGV4dHJhKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBbIHByb3BlcnR5LXNldC5jcmVhdGUgJChleHRyYSkgXSA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQocmVzdWx0KSA7CisgICAgfQorCisgICAgcnVsZSBnZW5lcmF0ZWQtdGFyZ2V0cyAoIHNvdXJjZXMgKyA6IHByb3BlcnR5LXNldCA6IHByb2plY3QgbmFtZSA/ICkKKyAgICB7CisgICAgICAgIGxvY2FsIHNvdXJjZXMyIDsgICAgICMgU291cmNlcyB0byBwYXNzIHRvIGluaGVyaXRlZCBydWxlLgorICAgICAgICBsb2NhbCBwcm9wZXJ0aWVzMiA7ICAjIFByb3BlcnRpZXMgdG8gcGFzcyB0byBpbmhlcml0ZWQgcnVsZS4KKyAgICAgICAgbG9jYWwgbGlicmFyaWVzIDsgICAgIyBMaWJyYXJ5IHNvdXJjZXMuCisKKyAgICAgICAgIyBTZWFyY2hlZCBsaWJyYXJpZXMgYXJlIG5vdCBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIHRoZSBsaW5rZXIgYnV0IHZpYQorICAgICAgICAjIHNvbWUgb3B0aW9uLiBTbywgd2UgcGFzcyB0aGVtIHRvIHRoZSBhY3Rpb24gdXNpbmcgYSBwcm9wZXJ0eS4KKyAgICAgICAgcHJvcGVydGllczIgPSBbICQocHJvcGVydHktc2V0KS5yYXcgXSA7CisgICAgICAgIGxvY2FsIGZzYSA7CisgICAgICAgIGxvY2FsIGZzdCA7CisgICAgICAgIGZvciBsb2NhbCBzIGluICQoc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgWyB0eXBlLmlzLWRlcml2ZWQgWyAkKHMpLnR5cGUgXSBTRUFSQ0hFRF9MSUIgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsIG5hbWUgPSBbICQocykubmFtZSBdIDsKKyAgICAgICAgICAgICAgICBpZiBbICQocykuc2hhcmVkIF0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZzYSArPSAkKG5hbWUpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnN0ICs9ICQobmFtZSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzb3VyY2VzMiArPSAkKHMpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcm9wZXJ0aWVzMiArPSA8ZmluZC1zaGFyZWQtbGlicmFyeT4kKGZzYTpKPSYmKQorICAgICAgICAgICAgICAgICAgICAgICA8ZmluZC1zdGF0aWMtbGlicmFyeT4kKGZzdDpKPSYmKSA7CisKKyAgICAgICAgcmV0dXJuIFsgZ2VuZXJhdG9yLmdlbmVyYXRlZC10YXJnZXRzICQoc291cmNlczIpCisgICAgICAgICAgICA6IFsgcHJvcGVydHktc2V0LmNyZWF0ZSAkKHByb3BlcnRpZXMyKSBdIDogJChwcm9qZWN0KSAkKG5hbWUpIF0gOworICAgIH0KK30KKworCitydWxlIHJlZ2lzdGVyLWxpbmtlciAoIGlkIGNvbXBvc2luZyA/IDogc291cmNlLXR5cGVzICsgOiB0YXJnZXQtdHlwZXMgKworICAgIDogcmVxdWlyZW1lbnRzICogKQoreworICAgIGdlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgbGlua2luZy1nZW5lcmF0b3IgJChpZCkgJChjb21wb3NpbmcpCisgICAgICAgIDogJChzb3VyY2UtdHlwZXMpIDogJCh0YXJnZXQtdHlwZXMpIDogJChyZXF1aXJlbWVudHMpIF0gOworfQorCisKKyMgVGhlIGdlbmVyYXRvciBjbGFzcyBmb3IgaGFuZGxpbmcgU1RBVElDX0xJQiBjcmVhdGlvbi4KKyMKK2NsYXNzIGFyY2hpdmUtZ2VuZXJhdG9yIDogZ2VuZXJhdG9yCit7CisgICAgaW1wb3J0IHByb3BlcnR5LXNldCA7CisKKyAgICBydWxlIF9faW5pdF9fICggaWQgY29tcG9zaW5nID8gOiBzb3VyY2UtdHlwZXMgKyA6IHRhcmdldC10eXBlcyArCisgICAgICAgIDogcmVxdWlyZW1lbnRzICogKQorICAgIHsKKyAgICAgICAgY29tcG9zaW5nID89IHRydWUgOworICAgICAgICBnZW5lcmF0b3IuX19pbml0X18gJChpZCkgJChjb21wb3NpbmcpIDogJChzb3VyY2UtdHlwZXMpCisgICAgICAgICAgICA6ICQodGFyZ2V0LXR5cGVzKSA6ICQocmVxdWlyZW1lbnRzKSA7CisgICAgfQorCisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKyApCisgICAgeworICAgICAgICBzb3VyY2VzICs9IFsgJChwcm9wZXJ0eS1zZXQpLmdldCA8bGlicmFyeT4gIF0gOworCisgICAgICAgIGxvY2FsIHJlc3VsdCA9IFsgZ2VuZXJhdG9yLnJ1biAkKHByb2plY3QpICQobmFtZSkgOiAkKHByb3BlcnR5LXNldCkKKyAgICAgICAgICAgIDogJChzb3VyY2VzKSBdIDsKKworICAgICAgICAjIEZvciBzdGF0aWMgbGlua2luZywgaWYgd2UgZ2V0IGEgbGlicmFyeSBpbiBzb3VyY2UsIHdlIGNhbiBub3QgZGlyZWN0bHkKKyAgICAgICAgIyBsaW5rIHRvIGl0IHNvIHdlIG5lZWQgdG8gY2F1c2Ugb3VyIGRlcGVuZGVuY2llcyB0byBsaW5rIHRvIHRoYXQKKyAgICAgICAgIyBsaWJyYXJ5LiBUaGVyZSBhcmUgdHdvIGFwcHJvYWNoZXM6CisgICAgICAgICMgLSBhZGRpbmcgdGhlIGxpYnJhcnkgdG8gdGhlIGxpc3Qgb2YgcmV0dXJuZWQgdGFyZ2V0cy4KKyAgICAgICAgIyAtIHVzaW5nIHRoZSA8bGlicmFyeT4gdXNhZ2UgcmVxdWlyZW1lbnRzLgorICAgICAgICAjIFRoZSBwcm9ibGVtIHdpdGggdGhlIGZpcnN0IGlzOgorICAgICAgICAjCisgICAgICAgICMgICAgIGxpYiBhMSA6IDogPGZpbGU+bGliYTEuYSA7CisgICAgICAgICMgICAgIGxpYiBhMiA6IGEyLmNwcCBhMSA6IDxsaW5rPnN0YXRpYyA7CisgICAgICAgICMgICAgIGluc3RhbGwgZGlzdCA6IGEyIDsKKyAgICAgICAgIworICAgICAgICAjIGhlcmUgd2Ugd2lsbCB0cnkgdG8gaW5zdGFsbCAnYTEnLCBldmVuIHRob3VnaCBpdCBpcyBub3QgbmVjZXNzYXJ5IGluCisgICAgICAgICMgdGhlIGdlbmVyYWwgY2FzZS4gV2l0aCB0aGUgc2Vjb25kIGFwcHJvYWNoLCBldmVuIGluZGlyZWN0IGRlcGVuZGFudHMKKyAgICAgICAgIyB3aWxsIGxpbmsgdG8gdGhlIGxpYnJhcnksIGJ1dCBpdCBzaG91bGQgbm90IGNhdXNlIGFueSBoYXJtLiBTbywgcmV0dXJuCisgICAgICAgICMgYWxsIExJQiBzb3VyY2VzIHRvZ2V0aGVyIHdpdGggY3JlYXRlZCB0YXJnZXRzLCBzbyB0aGF0IGRlcGVuZGFudHMgbGluaworICAgICAgICAjIHRvIHRoZW0uCisgICAgICAgIGxvY2FsIHVzYWdlLXJlcXVpcmVtZW50cyA7CisgICAgICAgIGlmIFsgJChwcm9wZXJ0eS1zZXQpLmdldCA8bGluaz4gXSA9IHN0YXRpYworICAgICAgICB7CisgICAgICAgICAgICBmb3IgbG9jYWwgdCBpbiAkKHNvdXJjZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgWyB0eXBlLmlzLWRlcml2ZWQgWyAkKHQpLnR5cGUgXSBMSUIgXQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UtcmVxdWlyZW1lbnRzICs9IDxsaWJyYXJ5PiQodCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVzYWdlLXJlcXVpcmVtZW50cyA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZSAkKHVzYWdlLXJlcXVpcmVtZW50cykgXSA7CisKKyAgICAgICAgcmV0dXJuICQodXNhZ2UtcmVxdWlyZW1lbnRzKSAkKHJlc3VsdCkgOworICAgIH0KK30KKworCitydWxlIHJlZ2lzdGVyLWFyY2hpdmVyICggaWQgY29tcG9zaW5nID8gOiBzb3VyY2UtdHlwZXMgKyA6IHRhcmdldC10eXBlcyArCisgICAgOiByZXF1aXJlbWVudHMgKiApCit7CisgICAgZ2VuZXJhdG9ycy5yZWdpc3RlciBbIG5ldyBhcmNoaXZlLWdlbmVyYXRvciAkKGlkKSAkKGNvbXBvc2luZykKKyAgICAgICAgOiAkKHNvdXJjZS10eXBlcykgOiAkKHRhcmdldC10eXBlcykgOiAkKHJlcXVpcmVtZW50cykgXSA7Cit9CisKKworIyBHZW5lcmF0b3IgdGhhdCBhY2NlcHRzIGV2ZXJ5dGhpbmcgYW5kIHByb2R1Y2VzIG5vdGhpbmcuIFVzZWZ1bCBhcyBhIGdlbmVyYWwKKyMgZmFsbGJhY2sgZm9yIHRvb2xzZXQtc3BlY2lmaWMgYWN0aW9ucyBsaWtlIFBDSCBnZW5lcmF0aW9uLgorIworY2xhc3MgZHVtbXktZ2VuZXJhdG9yIDogZ2VuZXJhdG9yCit7CisgICAgaW1wb3J0IHByb3BlcnR5LXNldCA7CisKKyAgICBydWxlIHJ1biAoIHByb2plY3QgbmFtZSA/IDogcHJvcGVydHktc2V0IDogc291cmNlcyArICkKKyAgICB7CisgICAgICAgIHJldHVybiBbIHByb3BlcnR5LXNldC5lbXB0eSBdIDsKKyAgICB9Cit9CisKK0lNUE9SVCAkKF9fbmFtZV9fKSA6IHJlZ2lzdGVyLWxpbmtlciByZWdpc3Rlci1hcmNoaXZlcgorICAgIDogOiBnZW5lcmF0b3JzLnJlZ2lzdGVyLWxpbmtlciBnZW5lcmF0b3JzLnJlZ2lzdGVyLWFyY2hpdmVyIDsKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY2FzdC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2Nhc3QuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjBhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2Nhc3QuamFtCkBAIC0wLDAgKzEsOTEgQEAKKyMgQ29weXJpZ2h0IDIwMDUgVmxhZGltaXIgUHJ1cy4KKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCisjIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBEZWZpbmVzIG1haW4gdGFyZ2V0ICdjYXN0JywgdXNlZCB0byBjaGFuZ2UgdHlwZSBmb3IgdGFyZ2V0LiBGb3IgZXhhbXBsZSwgaW4gUXQKKyMgbGlicmFyeSBvbmUgd2FudHMgdHdvIGtpbmRzIG9mIENQUCBmaWxlcyAtLSB0aG9zZSB0aGF0IGp1c3QgY29tcGlsZWQgYW5kIHRob3NlCisjIHRoYXQgYXJlIHBhc3NlZCB2aWEgdGhlIE1PQyB0b29sLgorIworIyBUaGlzIGlzIGRvbmUgd2l0aDoKKyMKKyMgICAgZXhlIG1haW4gOiBtYWluLmNwcCBbIGNhc3QgXyBtb2NjYWJsZS1jcHAgOiB3aWRnZXQuY3BwIF0gOworIworIyBCb29zdC5CdWlsZCB3aWxsIGFzc2lnbiB0YXJnZXQgdHlwZSBDUFAgdG8gYm90aCBtYWluLmNwcCBhbmQgd2lkZ2V0LmNwcC4gVGhlbiwKKyMgdGhlIGNhc3QgcnVsZSB3aWxsIGNoYW5nZSB0YXJnZXQgdHlwZSBvZiB3aWRnZXQuY3BwIHRvIE1PQ0NBQkxFLUNQUCwgYW5kIFF0CisjIHN1cHBvcnQgd2lsbCBydW4gdGhlIE1PQyB0b29sIGFzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MuCisjCisjIEF0IHRoZSBtb21lbnQsIHRoZSAnY2FzdCcgcnVsZSBvbmx5IHdvcmtzIGZvciBub24tZGVyaXZlZCAoc291cmNlKSB0YXJnZXRzLgorIworIyBUT0RPOiBUaGUgZm9sbG93aW5nIGNvbW1lbnQgaXMgdW5jbGVhciBvciBpbmNvcnJlY3QuIENsZWFuIGl0IHVwLgorIyA+IEFub3RoZXIgc29sdXRpb24gd291bGQgYmUgdG8gYWRkIGEgc2VwYXJhdGUgbWFpbiB0YXJnZXQgJ21vYy10aGVtJyB0aGF0CisjID4gd291bGQgbW9jIGFsbCB0aGUgcGFzc2VkIHNvdXJjZXMsIG5vIG1hdHRlciB3aGF0IHRoZWlyIHR5cGUgaXMsIGJ1dCBJIHByZWZlcgorIyA+IGNhc3QsIGFzIGRlZmluaW5nIGEgbmV3IHRhcmdldCB0eXBlICsgZ2VuZXJhdG9yIGZvciB0aGF0IHR5cGUgaXMgc29tZXdoYXQKKyMgPiBzaW1wbGVyIHRoYW4gZGVmaW5pbmcgYSBtYWluIHRhcmdldCBydWxlLgorCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgcHJvcGVydHktc2V0IDsKK2ltcG9ydCB0YXJnZXRzIDsKK2ltcG9ydCB0eXBlIDsKKworCitjbGFzcyBjYXN0LXRhcmdldC1jbGFzcyA6IHR5cGVkLXRhcmdldAoreworICAgIGltcG9ydCB0eXBlIDsKKworICAgIHJ1bGUgX19pbml0X18gKCBuYW1lIDogcHJvamVjdCA6IHR5cGUgOiBzb3VyY2VzICogOiByZXF1aXJlbWVudHMgKiA6CisgICAgICAgIGRlZmF1bHQtYnVpbGQgKiA6IHVzYWdlLXJlcXVpcmVtZW50cyAqICkKKyAgICB7CisgICAgICAgIHR5cGVkLXRhcmdldC5fX2luaXRfXyAkKG5hbWUpIDogJChwcm9qZWN0KSA6ICQodHlwZSkgOiAkKHNvdXJjZXMpIDoKKyAgICAgICAgICAgICQocmVxdWlyZW1lbnRzKSA6ICQoZGVmYXVsdC1idWlsZCkgOiAkKHVzYWdlLXJlcXVpcmVtZW50cykgOworICAgIH0KKworICAgIHJ1bGUgY29uc3RydWN0ICggbmFtZSA6IHNvdXJjZS10YXJnZXRzICogOiBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgbG9jYWwgcmVzdWx0IDsKKyAgICAgICAgZm9yIGxvY2FsIHMgaW4gJChzb3VyY2UtdGFyZ2V0cykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgISBbIGNsYXNzLmlzLWEgJChzKSA6IGZpbGUtdGFyZ2V0IF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDogdXNlci1lcnJvciA6IGVycm9ycy51c2VyLWVycm9yIDsKKyAgICAgICAgICAgICAgICBlcnJvcnMudXNlci1lcnJvciBTb3VyY2UgdG8gdGhlICdjYXN0JyBydWxlIGlzIG5vdCBhIGZpbGUhIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIFsgJChzKS5hY3Rpb24gXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOiB1c2VyLWVycm9yIDogZXJyb3JzLnVzZXItZXJyb3IgOworICAgICAgICAgICAgICAgIGVycm9ycy51c2VyLWVycm9yIE9ubHkgbm9uLWRlcml2ZWQgdGFyZ2V0IGFyZSBhbGxvd2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAnY2FzdCcuIDogd2hlbiBidWlsZGluZyBbIGZ1bGwtbmFtZSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2FsIHIgPSBbICQocykuY2xvbmUtd2l0aC1kaWZmZXJlbnQtdHlwZSAkKHNlbGYudHlwZSkgXSA7CisgICAgICAgICAgICByZXN1bHQgKz0gWyB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciAkKHIpIF0gOworICAgICAgICB9CisgICAgICAgIHJldHVybiBbIHByb3BlcnR5LXNldC5lbXB0eSBdICQocmVzdWx0KSA7CisgICAgfQorfQorCisKK3J1bGUgY2FzdCAoIG5hbWUgdHlwZSA6IHNvdXJjZXMgKiA6IHJlcXVpcmVtZW50cyAqIDogZGVmYXVsdC1idWlsZCAqIDoKKyAgICB1c2FnZS1yZXF1aXJlbWVudHMgKiApCit7CisgICAgbG9jYWwgcHJvamVjdCA9IFsgcHJvamVjdC5jdXJyZW50IF0gOworCisgICAgbG9jYWwgcmVhbC10eXBlID0gWyB0eXBlLnR5cGUtZnJvbS1ydWxlLW5hbWUgJCh0eXBlKSBdIDsKKyAgICBpZiAhICQocmVhbC10eXBlKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy51c2VyLWVycm9yIE5vIHR5cGUgY29ycmVzcG9uZHMgdG8gdGhlIG1haW4gdGFyZ2V0IHJ1bGUgbmFtZQorICAgICAgICAgICAgJyQodHlwZSknIDogIkhpbnQ6IHRyeSBhIGxvd2VyY2FzZSBuYW1lIiA7CisgICAgfQorCisgICAgdGFyZ2V0cy5tYWluLXRhcmdldC1hbHRlcm5hdGl2ZSBbIG5ldyBjYXN0LXRhcmdldC1jbGFzcyAkKG5hbWUpIDogJChwcm9qZWN0KQorICAgICAgICA6ICQocmVhbC10eXBlKQorICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1zb3VyY2VzICQoc291cmNlcykgOiAkKG5hbWUpIF0KKyAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtcmVxdWlyZW1lbnRzICQocmVxdWlyZW1lbnRzKSA6ICQocHJvamVjdCkgXQorICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1kZWZhdWx0LWJ1aWxkICQoZGVmYXVsdC1idWlsZCkgOiAkKHByb2plY3QpIF0KKyAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtdXNhZ2UtcmVxdWlyZW1lbnRzICQodXNhZ2UtcmVxdWlyZW1lbnRzKSA6CisgICAgICAgICAgICAkKHByb2plY3QpIF0gXSA7Cit9CisKKworSU1QT1JUICQoX19uYW1lX18pIDogY2FzdCA6IDogY2FzdCA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2NsYW5nLWRhcndpbi5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2NsYW5nLWRhcndpbi5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhYmM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY2xhbmctZGFyd2luLmphbQpAQCAtMCwwICsxLDE3MCBAQAorIyBDb3B5cmlnaHQgVmxhZGltaXIgUHJ1cyAyMDA0LgorIyBDb3B5cmlnaHQgTm9lbCBCZWxjb3VydCAyMDA3LgorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0CisjIG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgY2xhbmcgOworaW1wb3J0IGZlYXR1cmUgOiBmZWF0dXJlIDsKK2ltcG9ydCBvcyA7CitpbXBvcnQgdG9vbHNldCA7CitpbXBvcnQgdG9vbHNldCA6IGZsYWdzIDsKK2ltcG9ydCBnY2MgOworaW1wb3J0IGNvbW1vbiA7CitpbXBvcnQgZXJyb3JzIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKKworZmVhdHVyZS5leHRlbmQtc3ViZmVhdHVyZSB0b29sc2V0IGNsYW5nIDogcGxhdGZvcm0gOiBkYXJ3aW4gOworCit0b29sc2V0LmluaGVyaXQtZ2VuZXJhdG9ycyBjbGFuZy1kYXJ3aW4gCisgIDx0b29sc2V0PmNsYW5nIDx0b29sc2V0LWNsYW5nOnBsYXRmb3JtPmRhcndpbiAKKyAgOiBnY2MgCisgICMgRG9uJ3QgaW5oZXJpdCBQQ0ggZ2VuZXJhdG9ycy4gVGhleSB3ZXJlIG5vdCB0ZXN0ZWQsIGFuZCBwcm9iYWJseQorICAjIGRvbid0IHdvcmsgZm9yIHRoaXMgY29tcGlsZXIuCisgIDogZ2NjLm1pbmd3LmxpbmsgZ2NjLm1pbmd3LmxpbmsuZGxsIGdjYy5jb21waWxlLmMucGNoIGdjYy5jb21waWxlLmMrKy5wY2gKKyAgOworCitnZW5lcmF0b3JzLm92ZXJyaWRlIGNsYW5nLWRhcndpbi5wcmVidWlsdCA6IGJ1aWx0aW4ubGliLWdlbmVyYXRvciA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIGNsYW5nLWRhcndpbi5wcmVidWlsdCA6IGJ1aWx0aW4ucHJlYnVpbHQgOworZ2VuZXJhdG9ycy5vdmVycmlkZSBjbGFuZy1kYXJ3aW4uc2VhcmNoZWQtbGliLWdlbmVyYXRvciA6IHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOworCit0b29sc2V0LmluaGVyaXQtcnVsZXMgY2xhbmctZGFyd2luIDogZ2NjIDsKK3Rvb2xzZXQuaW5oZXJpdC1mbGFncyBjbGFuZy1kYXJ3aW4gOiBnY2MgCisgICAgICAgIDogPGlubGluaW5nPm9mZiA8aW5saW5pbmc+b24gPGlubGluaW5nPmZ1bGwgPG9wdGltaXphdGlvbj5zcGFjZSAKKyAgICAgICAgICA8d2FybmluZ3M+b2ZmIDx3YXJuaW5ncz5hbGwgPHdhcm5pbmdzPm9uCisgICAgICAgICAgPGFyY2hpdGVjdHVyZT54ODYvPGFkZHJlc3MtbW9kZWw+MzIKKyAgICAgICAgICA8YXJjaGl0ZWN0dXJlPng4Ni88YWRkcmVzcy1tb2RlbD42NAorICAgICAgICA7CisgICAgICAgIAoraWYgWyBNQVRDSCAoLS1kZWJ1Zy1jb25maWd1cmF0aW9uKSA6IFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIF0KK3sKKyAgICAuZGVidWctY29uZmlndXJhdGlvbiA9IHRydWUgOworfQorICAgICAgICAgICAgICAgICAgICAgICAKKyMgdmVjdG9yaXphdGlvbiBkaWFnbm9zdGljcworZmVhdHVyZSB2ZWN0b3JpemUgOiBvZmYgb24gZnVsbCA7CisKKyMgSW5pdGlhbGl6ZXMgdGhlIGNsYW5nLWRhcndpbiB0b29sc2V0CisjICAgdmVyc2lvbiBpbiBvcHRpb25hbAorIyAgIG5hbWUgKGRlZmF1bHQgY2xhbmcrKykgaXMgdXNlZCB0byBpbnZva2UgdGhlIHNwZWNpZmllZCBjbGFuZyBjb21wbGllcgorIyAgIGNvbXBpbGUgYW5kIGxpbmsgb3B0aW9ucyBhbGxvdyB5b3UgdG8gc3BlY2lmeSBhZGRpdGlvbiBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgZWFjaCB2ZXJzaW9uCitydWxlIGluaXQgKCB2ZXJzaW9uID8gOiAgY29tbWFuZCAqIDogb3B0aW9ucyAqICkKK3sKKyAgICBjb21tYW5kID0gWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBjbGFuZy1kYXJ3aW4gOiBjbGFuZysrIAorICAgICAgICA6ICQoY29tbWFuZCkgXSA7CisKKyAgICAjIERldGVybWluZSB0aGUgdmVyc2lvbgorICAgIGxvY2FsIGNvbW1hbmQtc3RyaW5nID0gJChjb21tYW5kOko9IiAiKSA7CisgICAgaWYgJChjb21tYW5kKQorICAgIHsgICAgCisgICAgICAgIHZlcnNpb24gPz0gWyBNQVRDSCAiXihbMC05Ll0rKSIKKyAgICAgICAgICAgIDogWyBTSEVMTCAiJChjb21tYW5kLXN0cmluZykgLWR1bXB2ZXJzaW9uIiBdIF0gOworICAgIH0KKworICAgIGxvY2FsIGNvbmRpdGlvbiA9IFsgY29tbW9uLmNoZWNrLWluaXQtcGFyYW1ldGVycyBjbGFuZy1kYXJ3aW4KKyAgICAgICAgOiB2ZXJzaW9uICQodmVyc2lvbikgXSA7ICAgIAorCisgICAgY29tbW9uLmhhbmRsZS1vcHRpb25zIGNsYW5nLWRhcndpbiA6ICQoY29uZGl0aW9uKSA6ICQoY29tbWFuZCkgOiAkKG9wdGlvbnMpIDsKKworICAgIGdjYy5pbml0LWxpbmstZmxhZ3MgY2xhbmctZGFyd2luIGRhcndpbiAkKGNvbmRpdGlvbikgOworCit9CisKK1NQQUNFID0gIiAiIDsKKworZmxhZ3MgY2xhbmctZGFyd2luLmNvbXBpbGUgT1BUSU9OUyA8Y2ZsYWdzPiA7CitmbGFncyBjbGFuZy1kYXJ3aW4uY29tcGlsZSBPUFRJT05TIDxjeHhmbGFncz4gOworIyBmbGFncyBjbGFuZy1kYXJ3aW4uY29tcGlsZSBJTkNMVURFUyA8aW5jbHVkZT4gOworCisjIERlY2xhcmUgZmxhZ3MgYW5kIGFjdGlvbiBmb3IgY29tcGlsYXRpb24uCit0b29sc2V0LmZsYWdzIGNsYW5nLWRhcndpbi5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5vZmYgICA6IC1PMCA7Cit0b29sc2V0LmZsYWdzIGNsYW5nLWRhcndpbi5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGVlZCA6IC1PMyA7Cit0b29sc2V0LmZsYWdzIGNsYW5nLWRhcndpbi5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGFjZSA6IC1PcyA7CisKK3Rvb2xzZXQuZmxhZ3MgY2xhbmctZGFyd2luLmNvbXBpbGUgT1BUSU9OUyA8aW5saW5pbmc+b2ZmICA6IC1mbm8taW5saW5lIDsKK3Rvb2xzZXQuZmxhZ3MgY2xhbmctZGFyd2luLmNvbXBpbGUgT1BUSU9OUyA8aW5saW5pbmc+b24gICA6IC1Xbm8taW5saW5lIDsKK3Rvb2xzZXQuZmxhZ3MgY2xhbmctZGFyd2luLmNvbXBpbGUgT1BUSU9OUyA8aW5saW5pbmc+ZnVsbCA6IC1maW5saW5lLWZ1bmN0aW9ucyAtV25vLWlubGluZSA7CisKK3Rvb2xzZXQuZmxhZ3MgY2xhbmctZGFyd2luLmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3M+b2ZmIDogLXcgOwordG9vbHNldC5mbGFncyBjbGFuZy1kYXJ3aW4uY29tcGlsZSBPUFRJT05TIDx3YXJuaW5ncz5vbiAgOiAtV2FsbCA7Cit0b29sc2V0LmZsYWdzIGNsYW5nLWRhcndpbi5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzPmFsbCA6IC1XYWxsIC1wZWRhbnRpYyA7Cit0b29sc2V0LmZsYWdzIGNsYW5nLWRhcndpbi5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzLWFzLWVycm9ycz5vbiA6IC1XZXJyb3IgOworCit0b29sc2V0LmZsYWdzIGNsYW5nLWRhcndpbi5jb21waWxlIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b24gOiAtZyA7Cit0b29sc2V0LmZsYWdzIGNsYW5nLWRhcndpbi5jb21waWxlIE9QVElPTlMgPHByb2ZpbGluZz5vbiA6IC1wZyA7Cit0b29sc2V0LmZsYWdzIGNsYW5nLWRhcndpbi5jb21waWxlIE9QVElPTlMgPHJ0dGk+b2ZmIDogLWZuby1ydHRpIDsKKworYWN0aW9ucyBjb21waWxlLmMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiIC14IGMgJChPUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC1jIC1vICIkKDwpIiAiJCg+KSIKK30KKworYWN0aW9ucyBjb21waWxlLmMrKworeworICAgICIkKENPTkZJR19DT01NQU5EKSIgLXggYysrICQoT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtYyAtbyAiJCg8KSIgIiQoPikiCit9CisKK2ZsYWdzIGNsYW5nLWRhcndpbiBBUkZMQUdTIDxhcmNoaXZlZmxhZ3M+IDsKKworIyBEZWZhdWx0IHZhbHVlLiBNb3N0bHkgZm9yIHRoZSBzYWtlIG9mIGNsYW5nLWxpbnV4CisjIHRoYXQgaW5oZXJpdHMgZnJvbSBnY2MsIGJ1dCBkb2VzIG5vdCBoYXMgdGhlIHNhbWUKKyMgbG9naWMgdG8gc2V0IHRoZSAuQVIgdmFyaWFibGUuIFdlIGNhbiBwdXQgdGhlIHNhbWUKKyMgbG9naWMgaW4gY2xhbmctbGludXgsIGJ1dCB0aGF0J3MgaGFyZGx5IHdvcnRoIHRoZSB0cm91YmxlCisjIGFzIG9uIExpbnV4LCAnYXInIGlzIGFsd2F5cyBhdmFpbGFibGUuCisuQVIgPSBhciA7CisKK3J1bGUgYXJjaGl2ZSAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICMgQWx3YXlzIHJlbW92ZSBhcmNoaXZlIGFuZCBzdGFydCBhZ2Fpbi4gSGVyZSdzIHJhdGlvbmFsZSBmcm9tCisgICMgQW5kcmUgSGVudHo6CisgICMKKyAgIyBJIGhhZCBhIGZpbGUsIHNheSBhMS5jLCB0aGF0IHdhcyBpbmNsdWRlZCBpbnRvIGxpYmEuYS4gCisgICMgSSBtb3ZlZCBhMS5jIHRvIGEyLmMsIHVwZGF0ZWQgbXkgSmFtZmlsZXMgYW5kIHJlYnVpbHQuIAorICAjIE15IHByb2dyYW0gd2FzIGNyYXNoaW5nIHdpdGggYWJzdXJkIGVycm9ycy4gCisgICMgQWZ0ZXIgc29tZSBkZWJ1Z2dpbmcgSSB0cmFjZWQgaXQgYmFjayB0byB0aGUgZmFjdCB0aGF0IGExLm8gd2FzICpzdGlsbCogCisgICMgaW4gbGliYS5hIAorICAjCisgICMgUmVuZSBSaXZlcmE6CisgICMKKyAgIyBPcmlnaW5hbGx5IHJlbW92aW5nIHRoZSBhcmNoaXZlIHdhcyBkb25lIGJ5IHNwbGljaW5nIGFuIFJNCisgICMgb250byB0aGUgYXJjaGl2ZSBhY3Rpb24uIFRoYXQgbWFrZXMgYXJjaGl2ZXMgZmFpbCB0byBidWlsZCBvbiBOVAorICAjIHdoZW4gdGhleSBoYXZlIG1hbnkgZmlsZXMgYmVjYXVzZSBpdCB3aWxsIG5vIGxvbmdlciBleGVjdXRlIHRoZQorICAjIGFjdGlvbiBkaXJlY3RseSBhbmQgYmxvdyB0aGUgbGluZSBsZW5ndGggbGltaXQuIEluc3RlYWQgd2UKKyAgIyByZW1vdmUgdGhlIGZpbGUgaW4gYSBkaWZmZXJlbnQgYWN0aW9uLCBqdXN0IGJlZm9yZSB0aGUgYnVpbGRpbmcKKyAgIyBvZiB0aGUgYXJjaGl2ZS4KKyAgIworICBsb2NhbCBjbGVhbi5hID0gJCh0YXJnZXRzWzFdKShjbGVhbikgOworICBURU1QT1JBUlkgJChjbGVhbi5hKSA7CisgIE5PQ0FSRSAkKGNsZWFuLmEpIDsKKyAgTE9DQVRFIG9uICQoY2xlYW4uYSkgPSBbIG9uICQodGFyZ2V0c1sxXSkgcmV0dXJuICQoTE9DQVRFKSBdIDsKKyAgREVQRU5EUyAkKGNsZWFuLmEpIDogJChzb3VyY2VzKSA7CisgIERFUEVORFMgJCh0YXJnZXRzKSA6ICQoY2xlYW4uYSkgOworICBjb21tb24uUm1UZW1wcyAkKGNsZWFuLmEpIDogJCh0YXJnZXRzKSA7Cit9CisKK2FjdGlvbnMgcGllY2VtZWFsIGFyY2hpdmUKK3sKKyAgIiQoLkFSKSIgJChBUk9QVElPTlMpIHJjICIkKDwpIiAiJCg+KSIKKyAgInJhbmxpYiIgLWNzICIkKDwpIgorfQorCitmbGFncyBjbGFuZy1kYXJ3aW4ubGluayBVU0VSX09QVElPTlMgPGxpbmtmbGFncz4gOworCisjIERlY2xhcmUgYWN0aW9ucyBmb3IgbGlua2luZworcnVsZSBsaW5rICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgU1BBQ0Ugb24gJCh0YXJnZXRzKSA9ICIgIiA7CisgICMgU2VyaWFsaXplIGV4ZWN1dGlvbiBvZiB0aGUgJ2xpbmsnIGFjdGlvbiwgc2luY2UKKyAgIyBydW5uaW5nIE4gbGlua3MgaW4gcGFyYWxsZWwgaXMganVzdCBzbG93ZXIuCisgIEpBTV9TRU1BUEhPUkUgb24gJCh0YXJnZXRzKSA9IDxzPmNsYW5nLWRhcndpbi1saW5rLXNlbWFwaG9yZSA7Cit9CisKK2FjdGlvbnMgbGluayBiaW5kIExJQlJBUklFUworeworICAgICIkKENPTkZJR19DT01NQU5EKSIgJChVU0VSX09QVElPTlMpIC1MIiQoTElOS1BBVEgpIiAtbyAiJCg8KSIgIiQoPikiICIkKExJQlJBUklFUykiIC1sJChGSU5ETElCUy1TQSkgLWwkKEZJTkRMSUJTLVNUKSAkKE9QVElPTlMpCit9CisKK2FjdGlvbnMgbGluay5kbGwgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoVVNFUl9PUFRJT05TKSAtTCIkKExJTktQQVRIKSIgLW8gIiQoPCkiIC1zaW5nbGVfbW9kdWxlIC1keW5hbWljbGliIC1pbnN0YWxsX25hbWUgIiQoPFsxXTpEPSkiICIkKD4pIiAgIiQoTElCUkFSSUVTKSIgLWwkKEZJTkRMSUJTLVNBKSAtbCQoRklORExJQlMtU1QpICQoT1BUSU9OUykKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY2xhbmctbGludXguamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jbGFuZy1saW51eC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5OWMyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY2xhbmctbGludXguamFtCkBAIC0wLDAgKzEsMTk2IEBACisjICBDb3B5cmlnaHQgKGMpIDIwMDMgICAgICBNaWNoYWVsIFN0ZXZlbnMKKyMgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIEJyeWNlIExlbGJhY2ggKGJsZWxiYWNoQGNjdC5sc3UuZWR1LCBtYWludGFpbmVyKQorIworIyAgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorIyAgTGljZW5zZSBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKKyMgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworaW1wb3J0IHRvb2xzZXQgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IHRvb2xzZXQgOiBmbGFncyA7CisKK2ltcG9ydCBjbGFuZyA7CitpbXBvcnQgZ2NjIDsKK2ltcG9ydCBjb21tb24gOworaW1wb3J0IGVycm9ycyA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgbnVtYmVycyA7CisKK2ZlYXR1cmUuZXh0ZW5kLXN1YmZlYXR1cmUgdG9vbHNldCBjbGFuZyA6IHBsYXRmb3JtIDogbGludXggOworCit0b29sc2V0LmluaGVyaXQtZ2VuZXJhdG9ycyBjbGFuZy1saW51eCAKKyAgICA8dG9vbHNldD5jbGFuZyA8dG9vbHNldC1jbGFuZzpwbGF0Zm9ybT5saW51eCA6IGdjYworICA6IGdjYy5taW5ndy5saW5rIGdjYy5taW5ndy5saW5rLmRsbCBnY2MuY3lnd2luLmxpbmsgZ2NjLmN5Z3dpbi5saW5rLmRsbCA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIGNsYW5nLWxpbnV4LnByZWJ1aWx0IDogYnVpbHRpbi5saWItZ2VuZXJhdG9yIDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgY2xhbmctbGludXgucHJlYnVpbHQgOiBidWlsdGluLnByZWJ1aWx0IDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgY2xhbmctbGludXguc2VhcmNoZWQtbGliLWdlbmVyYXRvciA6IHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOworCisjIE92ZXJyaWRlIGRlZmF1bHQgZG8tbm90aGluZyBnZW5lcmF0b3JzLgorZ2VuZXJhdG9ycy5vdmVycmlkZSBjbGFuZy1saW51eC5jb21waWxlLmMucGNoICAgOiBwY2guZGVmYXVsdC1jLXBjaC1nZW5lcmF0b3IgICA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIGNsYW5nLWxpbnV4LmNvbXBpbGUuYysrLnBjaCA6IHBjaC5kZWZhdWx0LWNwcC1wY2gtZ2VuZXJhdG9yIDsKKyAKK3R5cGUuc2V0LWdlbmVyYXRlZC10YXJnZXQtc3VmZml4IFBDSAorICA6IDx0b29sc2V0PmNsYW5nIDx0b29sc2V0LWNsYW5nOnBsYXRmb3JtPmxpbnV4IDogcHRoIDsKKwordG9vbHNldC5pbmhlcml0LXJ1bGVzIGNsYW5nLWxpbnV4IDogZ2NjIDsKK3Rvb2xzZXQuaW5oZXJpdC1mbGFncyBjbGFuZy1saW51eCA6IGdjYyAKKyAgOiA8aW5saW5pbmc+b2ZmIDxpbmxpbmluZz5vbiA8aW5saW5pbmc+ZnVsbAorICAgIDxvcHRpbWl6YXRpb24+c3BhY2UgPG9wdGltaXphdGlvbj5zcGVlZAorICAgIDx3YXJuaW5ncz5vZmYgPHdhcm5pbmdzPmFsbCA8d2FybmluZ3M+b24gOworICAgICAgICAKK2lmIFsgTUFUQ0ggKC0tZGVidWctY29uZmlndXJhdGlvbikgOiBbIG1vZHVsZXMucGVlayA6IEFSR1YgXSBdIHsKKyAgLmRlYnVnLWNvbmZpZ3VyYXRpb24gPSB0cnVlIDsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgCitydWxlIGluaXQgKCB2ZXJzaW9uID8gOiAgY29tbWFuZCAqIDogb3B0aW9ucyAqICkgeworICBjb21tYW5kID0gWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBjbGFuZy1saW51eCA6IGNsYW5nKysgCisgICAgOiAkKGNvbW1hbmQpIF0gOworICAgICAgICAgICAgICAgIAorICAjIERldGVybWluZSB0aGUgdmVyc2lvbgorICBsb2NhbCBjb21tYW5kLXN0cmluZyA9ICQoY29tbWFuZDpKPSIgIikgOworCisgIGlmICQoY29tbWFuZCkgeyAgICAKKyAgICB2ZXJzaW9uID89IFsgTUFUQ0ggInZlcnNpb24gKFswLTkuXSspIgorICAgICAgOiBbIFNIRUxMICIkKGNvbW1hbmQtc3RyaW5nKSAtLXZlcnNpb24iIF0gXSA7CisgIH0KKworICBsb2NhbCBjb25kaXRpb24gPSBbIGNvbW1vbi5jaGVjay1pbml0LXBhcmFtZXRlcnMgY2xhbmctbGludXgKKyAgICA6IHZlcnNpb24gJCh2ZXJzaW9uKSBdIDsKKyAgICAKKyAgY29tbW9uLmhhbmRsZS1vcHRpb25zIGNsYW5nLWxpbnV4IDogJChjb25kaXRpb24pIDogJChjb21tYW5kKSA6ICQob3B0aW9ucykgOworCisgIGdjYy5pbml0LWxpbmstZmxhZ3MgY2xhbmctbGludXggZ251ICQoY29uZGl0aW9uKSA7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRmxhZ3MKKwordG9vbHNldC5mbGFncyBjbGFuZy1saW51eC5jb21waWxlIE9QVElPTlMgPGNmbGFncz4gOwordG9vbHNldC5mbGFncyBjbGFuZy1saW51eC5jb21waWxlLmMrKyBPUFRJT05TIDxjeHhmbGFncz4gOworCit0b29sc2V0LmZsYWdzIGNsYW5nLWxpbnV4LmNvbXBpbGUgT1BUSU9OUyA8b3B0aW1pemF0aW9uPm9mZiAgIDogOwordG9vbHNldC5mbGFncyBjbGFuZy1saW51eC5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGVlZCA6IC1PMyA7Cit0b29sc2V0LmZsYWdzIGNsYW5nLWxpbnV4LmNvbXBpbGUgT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwYWNlIDogLU9zIDsKKworIyBub3RlOiBjbGFuZyBzaWxlbnRseSBpZ25vcmVzIHNvbWUgb2YgdGhlc2UgaW5saW5pbmcgb3B0aW9ucwordG9vbHNldC5mbGFncyBjbGFuZy1saW51eC5jb21waWxlIE9QVElPTlMgPGlubGluaW5nPm9mZiAgOiAtZm5vLWlubGluZSA7Cit0b29sc2V0LmZsYWdzIGNsYW5nLWxpbnV4LmNvbXBpbGUgT1BUSU9OUyA8aW5saW5pbmc+b24gICA6IC1Xbm8taW5saW5lIDsKK3Rvb2xzZXQuZmxhZ3MgY2xhbmctbGludXguY29tcGlsZSBPUFRJT05TIDxpbmxpbmluZz5mdWxsIDogLWZpbmxpbmUtZnVuY3Rpb25zIC1Xbm8taW5saW5lIDsKKwordG9vbHNldC5mbGFncyBjbGFuZy1saW51eC5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzPm9mZiA6IC13IDsKK3Rvb2xzZXQuZmxhZ3MgY2xhbmctbGludXguY29tcGlsZSBPUFRJT05TIDx3YXJuaW5ncz5vbiAgOiAtV2FsbCA7Cit0b29sc2V0LmZsYWdzIGNsYW5nLWxpbnV4LmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3M+YWxsIDogLVdhbGwgLXBlZGFudGljIDsKK3Rvb2xzZXQuZmxhZ3MgY2xhbmctbGludXguY29tcGlsZSBPUFRJT05TIDx3YXJuaW5ncy1hcy1lcnJvcnM+b24gOiAtV2Vycm9yIDsKKwordG9vbHNldC5mbGFncyBjbGFuZy1saW51eC5jb21waWxlIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b24gOiAtZyA7Cit0b29sc2V0LmZsYWdzIGNsYW5nLWxpbnV4LmNvbXBpbGUgT1BUSU9OUyA8cHJvZmlsaW5nPm9uIDogLXBnIDsKK3Rvb2xzZXQuZmxhZ3MgY2xhbmctbGludXguY29tcGlsZSBPUFRJT05TIDxydHRpPm9mZiA6IC1mbm8tcnR0aSA7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQyBhbmQgQysrIGNvbXBpbGF0aW9uCisKK3J1bGUgY29tcGlsZS5jKysgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKSB7CisgIGdjYy5zZXR1cC10aHJlYWRpbmcgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgZ2NjLnNldHVwLWZwaWMgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgZ2NjLnNldHVwLWFkZHJlc3MtbW9kZWwgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKworICBsb2NhbCBwdGgtZmlsZSA9IFsgb24gJCg8KSByZXR1cm4gJChQQ0hfRklMRSkgXSA7CisKKyAgaWYgJChwdGgtZmlsZSkgeworICAgIERFUEVORFMgJCg8KSA6ICQocHRoLWZpbGUpIDsKKyAgICBjbGFuZy1saW51eC5jb21waWxlLmMrKy53aXRoLXBjaCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA7CisgIH0KKyAgZWxzZSB7CisgICAgY2xhbmctbGludXguY29tcGlsZS5jKysud2l0aG91dC1wdGggJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOworICB9Cit9CisKK2FjdGlvbnMgY29tcGlsZS5jKysud2l0aG91dC1wdGggeworICAiJChDT05GSUdfQ09NTUFORCkiIC1jIC14IGMrKyAkKE9QVElPTlMpICQoVVNFUl9PUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC1vICIkKDwpIiAiJCg+KSIKK30KKworYWN0aW9ucyBjb21waWxlLmMrKy53aXRoLXBjaCBiaW5kIFBDSF9GSUxFCit7CisgICIkKENPTkZJR19DT01NQU5EKSIgLWMgLXggYysrICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLVhjbGFuZyAtaW5jbHVkZS1wdGggLVhjbGFuZyAiJChQQ0hfRklMRSkiIC1vICIkKDwpIiAiJCg+KSIKK30KKworcnVsZSBjb21waWxlLmMgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICBnY2Muc2V0dXAtdGhyZWFkaW5nICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgIGdjYy5zZXR1cC1mcGljICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgIGdjYy5zZXR1cC1hZGRyZXNzLW1vZGVsICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7ICAgIAorCisgIGxvY2FsIHB0aC1maWxlID0gWyBvbiAkKDwpIHJldHVybiAkKFBDSF9GSUxFKSBdIDsKKworICBpZiAkKHB0aC1maWxlKSB7CisgICAgREVQRU5EUyAkKDwpIDogJChwdGgtZmlsZSkgOworICAgIGNsYW5nLWxpbnV4LmNvbXBpbGUuYy53aXRoLXBjaCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA7CisgIH0KKyAgZWxzZSB7CisgICAgY2xhbmctbGludXguY29tcGlsZS5jLndpdGhvdXQtcHRoICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDsKKyAgfQorfQorCithY3Rpb25zIGNvbXBpbGUuYy53aXRob3V0LXB0aAoreworICAiJChDT05GSUdfQ09NTUFORCkiIC1jIC14IGMgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtYyAtbyAiJCg8KSIgIiQoPikiCit9CisKK2FjdGlvbnMgY29tcGlsZS5jLndpdGgtcGNoIGJpbmQgUENIX0ZJTEUKK3sKKyAgIiQoQ09ORklHX0NPTU1BTkQpIiAtYyAteCBjICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLVhjbGFuZyAtaW5jbHVkZS1wdGggLVhjbGFuZyAiJChQQ0hfRklMRSkiIC1jIC1vICIkKDwpIiAiJCg+KSIKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQQ0ggZW1pc3Npb24KKworcnVsZSBjb21waWxlLmMrKy5wY2ggKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKSB7CisgIGdjYy5zZXR1cC10aHJlYWRpbmcgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgZ2NjLnNldHVwLWZwaWMgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgZ2NjLnNldHVwLWFkZHJlc3MtbW9kZWwgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsgICAgCit9CisKK2FjdGlvbnMgY29tcGlsZS5jKysucGNoIHsKKyAgcm0gLWYgIiQoPCkiICYmICIkKENPTkZJR19DT01NQU5EKSIgLXggYysrLWhlYWRlciAkKE9QVElPTlMpICQoVVNFUl9PUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC1YY2xhbmcgLWVtaXQtcHRoIC1vICIkKDwpIiAiJCg+KSIKK30KKworcnVsZSBjb21waWxlLmMucGNoICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkgeworICBnY2Muc2V0dXAtdGhyZWFkaW5nICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgIGdjYy5zZXR1cC1mcGljICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgIGdjYy5zZXR1cC1hZGRyZXNzLW1vZGVsICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7ICAgIAorfQorCithY3Rpb25zIGNvbXBpbGUuYy5wY2gKK3sKKyAgcm0gLWYgIiQoPCkiICYmICIkKENPTkZJR19DT01NQU5EKSIgLXggYy1oZWFkZXIgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtWGNsYW5nIC1lbWl0LXB0aCAtbyAiJCg8KSIgIiQoPikiCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTGlua2luZworCitTUEFDRSA9ICIgIiA7CisKK3J1bGUgbGluayAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApIHsKKyAgZ2NjLnNldHVwLXRocmVhZGluZyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICBnY2Muc2V0dXAtYWRkcmVzcy1tb2RlbCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOyAgICAKKyAgU1BBQ0Ugb24gJCh0YXJnZXRzKSA9ICIgIiA7CisgIEpBTV9TRU1BUEhPUkUgb24gJCh0YXJnZXRzKSA9IDxzPmNsYW5nLWxpbnV4LWxpbmstc2VtYXBob3JlIDsKK30KKworYWN0aW9ucyBsaW5rIGJpbmQgTElCUkFSSUVTIHsKKyAgIiQoQ09ORklHX0NPTU1BTkQpIiAtTCIkKExJTktQQVRIKSIgLVdsLC1SJChTUEFDRSktV2wsIiQoUlBBVEgpIiAtV2wsLXJwYXRoLWxpbmskKFNQQUNFKS1XbCwiJChSUEFUSF9MSU5LKSIgLW8gIiQoPCkiICIkKD4pIiAiJChMSUJSQVJJRVMpIiAtbCQoRklORExJQlMtU0EpIC1sJChGSU5ETElCUy1TVCkgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykKK30KKworcnVsZSBsaW5rLmRsbCAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApIHsKKyAgZ2NjLnNldHVwLXRocmVhZGluZyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICBnY2Muc2V0dXAtYWRkcmVzcy1tb2RlbCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOyAgICAKKyAgU1BBQ0Ugb24gJCh0YXJnZXRzKSA9ICIgIiA7CisgIEpBTV9TRU1BUEhPUkUgb24gJCh0YXJnZXRzKSA9IDxzPmNsYW5nLWxpbnV4LWxpbmstc2VtYXBob3JlIDsKK30KKworIyBEaWZmZXIgZnJvbSAnbGluaycgYWJvdmUgb25seSBieSAtc2hhcmVkLgorYWN0aW9ucyBsaW5rLmRsbCBiaW5kIExJQlJBUklFUyB7CisgICIkKENPTkZJR19DT01NQU5EKSIgLUwiJChMSU5LUEFUSCkiIC1XbCwtUiQoU1BBQ0UpLVdsLCIkKFJQQVRIKSIgLW8gIiQoPCkiIC1XbCwtc29uYW1lJChTUEFDRSktV2wsJCg8WzFdOkQ9KSAtc2hhcmVkICIkKD4pIiAgIiQoTElCUkFSSUVTKSIgLWwkKEZJTkRMSUJTLVNBKSAtbCQoRklORExJQlMtU1QpICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpCit9CisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY2xhbmcuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jbGFuZy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhYzlhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY2xhbmcuamFtCkBAIC0wLDAgKzEsMjcgQEAKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dAorIyBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBUaGlzIGlzIGEgZ2VuZXJpYyAnY2xhbmcnIHRvb2xzZXQuIERlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzeXN0ZW0sIGl0CisjIGZvcndhcmRzIGVpdGhlciB0byAnY2xhbmctdW5peCcgb3IgJ2NsYW5nLWRhcndpbicgbW9kdWxlcy4KKworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IG9zIDsKK2ltcG9ydCB0b29sc2V0IDsKKworZmVhdHVyZS5leHRlbmQgdG9vbHNldCA6IGNsYW5nIDsKK2ZlYXR1cmUuc3ViZmVhdHVyZSB0b29sc2V0IGNsYW5nIDogcGxhdGZvcm0gOiA6IHByb3BhZ2F0ZWQgbGluay1pbmNvbXBhdGlibGUgOworCitydWxlIGluaXQgKCAqIDogKiApCit7CisgICAgaWYgWyBvcy5uYW1lIF0gPSBNQUNPU1gKKyAgICB7CisgICAgICAgIHRvb2xzZXQudXNpbmcgY2xhbmctZGFyd2luIDogCisgICAgICAgICAgJCgxKSA6ICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkgOiAkKDkpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG9vbHNldC51c2luZyBjbGFuZy1saW51eCA6IAorICAgICAgICAgICQoMSkgOiAkKDIpIDogJCgzKSA6ICQoNCkgOiAkKDUpIDogJCg2KSA6ICQoNykgOiAkKDgpIDogJCg5KSA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jb21tb24uamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jb21tb24uamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZGYyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2NvbW1vbi5qYW0KQEAgLTAsMCArMSw5ODggQEAKKyMgQ29weXJpZ2h0IDIwMDMsIDIwMDUgRGF2ZSBBYnJhaGFtcworIyBDb3B5cmlnaHQgMjAwNSwgMjAwNiBSZW5lIFJpdmVyYQorIyBDb3B5cmlnaHQgMjAwNSBUb29uIEtuYXBlbgorIyBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBWbGFkaW1pciBQcnVzCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjICAgUHJvdmlkZXMgYWN0aW9ucyBjb21tb24gdG8gYWxsIHRvb2xzZXRzLCBzdWNoIGFzIGNyZWF0aW5nIGRpcmVjdG9yaWVzIGFuZAorIyByZW1vdmluZyBmaWxlcy4KKworaW1wb3J0IG9zIDsKK2ltcG9ydCBtb2R1bGVzIDsKK2ltcG9ydCB1dGlsaXR5IDsKK2ltcG9ydCBwcmludCA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgZXJyb3JzIDsKK2ltcG9ydCBwYXRoIDsKK2ltcG9ydCBzZXF1ZW5jZSA7CitpbXBvcnQgdG9vbHNldCA7CitpbXBvcnQgdmlydHVhbC10YXJnZXQgOworCitpZiBbIE1BVENIICgtLWRlYnVnLWNvbmZpZ3VyYXRpb24pIDogWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0gXQoreworICAgIC5kZWJ1Zy1jb25maWd1cmF0aW9uID0gdHJ1ZSA7Cit9CitpZiBbIE1BVENIICgtLXNob3ctY29uZmlndXJhdGlvbikgOiBbIG1vZHVsZXMucGVlayA6IEFSR1YgXSBdCit7CisgICAgLnNob3ctY29uZmlndXJhdGlvbiA9IHRydWUgOworfQorCisjIENvbmZpZ3VyYXRpb25zCisjCisjIFRoZSBmb2xsb3dpbmcgY2xhc3MgaGVscHMgdG8gbWFuYWdlIHRvb2xzZXQgY29uZmlndXJhdGlvbnMuIEVhY2ggY29uZmlndXJhdGlvbgorIyBoYXMgYSB1bmlxdWUgSUQgYW5kIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuIEEgdHlwaWNhbCBleGFtcGxlIG9mIGEgdW5pcXVlIElECisjIGlzIGEgY29uZGl0aW9uIGdlbmVyYXRlZCBieSAnY29tbW9uLmNoZWNrLWluaXQtcGFyYW1ldGVycycgcnVsZS4gT3RoZXIga2luZHMKKyMgb2YgSURzIGNhbiBiZSB1c2VkLiBQYXJhbWV0ZXJzIG1heSBpbmNsdWRlIGFueSBkZXRhaWxzIGFib3V0IHRoZSBjb25maWd1cmF0aW9uCisjIGxpa2UgJ2NvbW1hbmQnLCAncGF0aCcsIGV0Yy4KKyMKKyMgQSB0b29sc2V0IGNvbmZpZ3VyYXRpb24gbWF5IGJlIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0YXRlczoKKyMKKyMgICAtIHJlZ2lzdGVyZWQKKyMgICAgICAgQ29uZmlndXJhdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkIChlLmcuIGV4cGxpY2l0bHkgb3IgYnkgYXV0by1kZXRlY3Rpb24KKyMgICAgICAgY29kZSkgYnV0IGhhcyBub3QgeWV0IGJlZW4gbWFya2VkIGFzIHVzZWQsIGkuZS4gJ3Rvb2xzZXQudXNpbmcnIHJ1bGUgaGFzCisjICAgICAgIG5vdCB5ZXQgYmVlbiBjYWxsZWQgZm9yIGl0LgorIyAgIC0gdXNlZAorIyAgICAgICBPbmNlIGNhbGxlZCAndG9vbHNldC51c2luZycgcnVsZSBtYXJrcyB0aGUgY29uZmlndXJhdGlvbiBhcyAndXNlZCcuCisjCisjIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3RhdGVzIGFib3ZlIGlzIHRoYXQgd2hpbGUgYSBjb25maWd1cmF0aW9uIGlzCisjICdyZWdpc3RlcmVkJyBpdHMgb3B0aW9ucyBjYW4gYmUgZnJlZWx5IGNoYW5nZWQuIFRoaXMgaXMgdXNlZnVsIGluIHBhcnRpY3VsYXIKKyMgZm9yIGF1dG9kZXRlY3Rpb24gY29kZSAtIGFsbCBkZXRlY3RlZCBjb25maWd1cmF0aW9ucyBtYXkgYmUgc2FmZWx5IG92ZXJ3cml0dGVuCisjIGJ5IHVzZXIgY29kZS4KKworY2xhc3MgY29uZmlndXJhdGlvbnMKK3sKKyAgICBpbXBvcnQgZXJyb3JzIDsKKworICAgIHJ1bGUgX19pbml0X18gKCApCisgICAgeworICAgIH0KKworICAgICMgUmVnaXN0ZXJzIGEgY29uZmlndXJhdGlvbi4KKyAgICAjCisgICAgIyBSZXR1cm5zICd0cnVlJyBpZiB0aGUgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBhZGRlZCBhbmQgYW4gZW1wdHkgdmFsdWUgaWYKKyAgICAjIGl0IGFscmVhZHkgZXhpc3RzLiBSZXBvcnRzIGFuIGVycm9yIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzICd1c2VkJy4KKyAgICAjCisgICAgcnVsZSByZWdpc3RlciAoIGlkICkKKyAgICB7CisgICAgICAgIGlmICQoaWQpIGluICQoc2VsZi51c2VkKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcnMuZXJyb3IgImNvbW1vbjogdGhlIGNvbmZpZ3VyYXRpb24gJyQoaWQpJyBpcyBpbiB1c2UiIDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIHJldHZhbCA7CisKKyAgICAgICAgaWYgISAkKGlkKSBpbiAkKHNlbGYuYWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLmFsbCArPSAkKGlkKSA7CisKKyAgICAgICAgICAgICMgSW5kaWNhdGUgdGhhdCBhIG5ldyBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGFkZGVkLgorICAgICAgICAgICAgcmV0dmFsID0gdHJ1ZSA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJChyZXR2YWwpIDsKKyAgICB9CisKKyAgICAjIE1hcmsgYSBjb25maWd1cmF0aW9uIGFzICd1c2VkJy4KKyAgICAjCisgICAgIyBSZXR1cm5zICd0cnVlJyBpZiB0aGUgc3RhdGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gY2hhbmdlZCB0bworICAgICMgJ3VzZWQnIGFuZCBhbiBlbXB0eSB2YWx1ZSBpZiBpdCB0aGUgc3RhdGUgaGFzIG5vdCBiZWVuIGNoYW5nZWQuIFJlcG9ydHMgYW4KKyAgICAjIGVycm9yIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBrbm93bi4KKyAgICAjCisgICAgcnVsZSB1c2UgKCBpZCApCisgICAgeworICAgICAgICBpZiAhICQoaWQpIGluICQoc2VsZi5hbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciAiY29tbW9uOiB0aGUgY29uZmlndXJhdGlvbiAnJChpZCknIGlzIG5vdCBrbm93biIgOworICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgcmV0dmFsIDsKKworICAgICAgICBpZiAhICQoaWQpIGluICQoc2VsZi51c2VkKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLnVzZWQgKz0gJChpZCkgOworCisgICAgICAgICAgICAjIEluZGljYXRlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gbWFya2VkIGFzICd1c2VkJy4KKyAgICAgICAgICAgIHJldHZhbCA9IHRydWUgOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICQocmV0dmFsKSA7CisgICAgfQorCisgICAgIyBSZXR1cm4gYWxsIHJlZ2lzdGVyZWQgY29uZmlndXJhdGlvbnMuCisgICAgIworICAgIHJ1bGUgYWxsICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi5hbGwpIDsKKyAgICB9CisKKyAgICAjIFJldHVybiBhbGwgdXNlZCBjb25maWd1cmF0aW9ucy4KKyAgICAjCisgICAgcnVsZSB1c2VkICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi51c2VkKSA7CisgICAgfQorCisgICAgIyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLgorICAgICMKKyAgICBydWxlIGdldCAoIGlkIDogcGFyYW0gKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi4kKHBhcmFtKS4kKGlkKSkgOworICAgIH0KKworICAgICMgU2V0cyB0aGUgdmFsdWUgb2YgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4KKyAgICAjCisgICAgcnVsZSBzZXQgKCBpZCA6IHBhcmFtIDogdmFsdWUgKiApCisgICAgeworICAgICAgICBzZWxmLiQocGFyYW0pLiQoaWQpID0gJCh2YWx1ZSkgOworICAgIH0KK30KKworCisjIFRoZSBydWxlIGZvciBjaGVja2luZyB0b29sc2V0IHBhcmFtZXRlcnMuIFRyYWlsaW5nIHBhcmFtZXRlcnMgc2hvdWxkIGFsbCBiZQorIyBwYXJhbWV0ZXIgbmFtZS92YWx1ZSBwYWlycy4gVGhlIHJ1bGUgd2lsbCBjaGVjayB0aGF0IGVhY2ggcGFyYW1ldGVyIGVpdGhlciBoYXMKKyMgYSB2YWx1ZSBpbiBlYWNoIGludm9jYXRpb24gb3IgaGFzIG5vIHZhbHVlIGluIGVhY2ggaW52b2NhdGlvbi4gQWxzbywgdGhlIHJ1bGUKKyMgd2lsbCBjaGVjayB0aGF0IHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgcGFyYW1ldGVyIHZhbHVlcyBpcyB1bmlxdWUgaW4gYWxsCisjIGludm9jYXRpb25zLgorIworIyBFYWNoIHBhcmFtZXRlciBuYW1lIGNvcnJlc3BvbmRzIHRvIGEgc3ViZmVhdHVyZS4gVGhpcyBydWxlIHdpbGwgZGVjbGFyZSBhCisjIHN1YmZlYXR1cmUgdGhlIGZpcnN0IHRpbWUgYSBub24tZW1wdHkgcGFyYW1ldGVyIHZhbHVlIGlzIHBhc3NlZCBhbmQgd2lsbAorIyBleHRlbmQgaXQgd2l0aCBhbGwgdGhlIHZhbHVlcy4KKyMKKyMgVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgcnVsZSBpcyBhIGNvbmRpdGlvbiB0byBiZSB1c2VkIGZvciBmbGFncyBzZXR0aW5ncy4KKyMKK3J1bGUgY2hlY2staW5pdC1wYXJhbWV0ZXJzICggdG9vbHNldCByZXF1aXJlbWVudCAqIDogKiApCit7CisgICAgbG9jYWwgc2lnID0gJCh0b29sc2V0KSA7CisgICAgbG9jYWwgY29uZGl0aW9uID0gPHRvb2xzZXQ+JCh0b29sc2V0KSA7CisgICAgbG9jYWwgc3ViY29uZGl0aW9uIDsKKyAgICBmb3IgbG9jYWwgaW5kZXggaW4gMiAzIDQgNSA2IDcgOCA5CisgICAgeworICAgICAgICBsb2NhbCBuYW1lID0gJCgkKGluZGV4KVsxXSkgOworICAgICAgICBsb2NhbCB2YWx1ZSA9ICQoJChpbmRleClbMl0pIDsKKworICAgICAgICBpZiAkKHZhbHVlKS1pcy1ub3QtZW1wdHkKKyAgICAgICAgeworICAgICAgICAgICAgY29uZGl0aW9uID0gJChjb25kaXRpb24pLSQodmFsdWUpIDsKKyAgICAgICAgICAgIGlmICQoLmhhZC11bnNwZWNpZmllZC12YWx1ZS4kKHRvb2xzZXQpLiQobmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgIiQodG9vbHNldCkgaW5pdGlhbGl6YXRpb246IHBhcmFtZXRlciAnJChuYW1lKSciCisgICAgICAgICAgICAgICAgICAgICJpbmNvbnNpc3RlbnQiIDogIm5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gZWFybGllciIKKyAgICAgICAgICAgICAgICAgICAgImluaXRpYWxpemF0aW9uIiA6ICJhbiBleHBsaWNpdCB2YWx1ZSBpcyBzcGVjaWZpZWQgbm93IiA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjIFRoZSBiZWxvdyBsb2dpYyBpcyBmb3IgaW50ZWwgY29tcGlsZXIuIEl0IGNhbGxzIHRoaXMgcnVsZSB3aXRoCisgICAgICAgICAgICAjICdpbnRlbC1saW51eCcgYW5kICdpbnRlbC13aW4nIGFzIHRvb2xzZXQsIHNvIHdlIG5lZWQgdG8gZ2V0IHRoZQorICAgICAgICAgICAgIyBiYXNlIHBhcnQgb2YgdG9vbHNldCBuYW1lLiBXZSBjYW4gbm90IHBhc3MgJ2ludGVsJyBhcyB0b29sc2V0CisgICAgICAgICAgICAjIGJlY2F1c2UgaW4gdGhhdCBjYXNlIGl0IHdpbGwgYmUgaW1wb3NzaWJsZSB0byByZWdpc3RlciB2ZXJzaW9ubGVzcworICAgICAgICAgICAgIyBpbnRlbC1saW51eCBhbmQgaW50ZWwtd2luIHRvb2xzZXRzIG9mIGEgc3BlY2lmaWMgdmVyc2lvbi4KKyAgICAgICAgICAgIGxvY2FsIHQgPSAkKHRvb2xzZXQpIDsKKyAgICAgICAgICAgIGxvY2FsIG0gPSBbIE1BVENIIChbXi1dKiktIDogJCh0b29sc2V0KSBdIDsKKyAgICAgICAgICAgIGlmICQobSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gJChtWzFdKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAhICQoLmhhZC12YWx1ZS4kKHRvb2xzZXQpLiQobmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgISAkKC5kZWNsYXJlZC1zdWJmZWF0dXJlLiQodCkuJChuYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuc3ViZmVhdHVyZSB0b29sc2V0ICQodCkgOiAkKG5hbWUpIDogOiBwcm9wYWdhdGVkIDsKKyAgICAgICAgICAgICAgICAgICAgLmRlY2xhcmVkLXN1YmZlYXR1cmUuJCh0KS4kKG5hbWUpID0gdHJ1ZSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC5oYWQtdmFsdWUuJCh0b29sc2V0KS4kKG5hbWUpID0gdHJ1ZSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZWF0dXJlLmV4dGVuZC1zdWJmZWF0dXJlIHRvb2xzZXQgJCh0KSA6ICQobmFtZSkgOiAkKHZhbHVlKSA7CisgICAgICAgICAgICBzdWJjb25kaXRpb24gKz0gPHRvb2xzZXQtJCh0KTokKG5hbWUpPiQodmFsdWUpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQoLmhhZC12YWx1ZS4kKHRvb2xzZXQpLiQobmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgIiQodG9vbHNldCkgaW5pdGlhbGl6YXRpb246IHBhcmFtZXRlciAnJChuYW1lKSciCisgICAgICAgICAgICAgICAgICAgICJpbmNvbnNpc3RlbnQiIDogImFuIGV4cGxpY2l0IHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYW4iCisgICAgICAgICAgICAgICAgICAgICJlYXJsaWVyIGluaXRpYWxpemF0aW9uIiA6ICJubyB2YWx1ZSBpcyBzcGVjaWZpZWQgbm93IiA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAuaGFkLXVuc3BlY2lmaWVkLXZhbHVlLiQodG9vbHNldCkuJChuYW1lKSA9IHRydWUgOworICAgICAgICB9CisgICAgICAgIHNpZyA9ICQoc2lnKSQodmFsdWU6RT0iIiktIDsKKyAgICB9CisgICAgaWYgJChzaWcpIGluICQoLmFsbC1zaWduYXR1cmVzKQorICAgIHsKKyAgICAgICAgbG9jYWwgbWVzc2FnZSA9CisgICAgICAgICAgICAiZHVwbGljYXRlIGluaXRpYWxpemF0aW9uIG9mICQodG9vbHNldCkgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6ICIgOworICAgICAgICBmb3IgbG9jYWwgaW5kZXggaW4gMiAzIDQgNSA2IDcgOCA5CisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHAgPSAkKCQoaW5kZXgpKSA7CisgICAgICAgICAgICBpZiAkKHApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVzc2FnZSArPSAiJChwWzFdKSA9ICQocFsyXTpFPTx1bnNwZWNpZmllZD4pIiA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWVzc2FnZSArPSAicHJldmlvdXMgaW5pdGlhbGl6YXRpb24gYXQgJCguaW5pdC1sb2MuJChzaWcpKSIgOworICAgICAgICBlcnJvcnMudXNlci1lcnJvcgorICAgICAgICAgICAgJChtZXNzYWdlWzFdKSA6ICQobWVzc2FnZVsyXSkgOiAkKG1lc3NhZ2VbM10pIDogJChtZXNzYWdlWzRdKSA6CisgICAgICAgICAgICAkKG1lc3NhZ2VbNV0pIDogJChtZXNzYWdlWzZdKSA6ICQobWVzc2FnZVs3XSkgOiAkKG1lc3NhZ2VbOF0pIDsKKyAgICB9CisgICAgLmFsbC1zaWduYXR1cmVzICs9ICQoc2lnKSA7CisgICAgLmluaXQtbG9jLiQoc2lnKSA9IFsgZXJyb3JzLm5lYXJlc3QtdXNlci1sb2NhdGlvbiBdIDsKKworICAgICMgSWYgd2UgaGF2ZSBhIHJlcXVpcmVtZW50LCB0aGlzIHZlcnNpb24gc2hvdWxkIG9ubHkgYmUgYXBwbGllZCB1bmRlciB0aGF0CisgICAgIyBjb25kaXRpb24uIFRvIGFjY29tcGxpc2ggdGhpcyB3ZSBhZGQgYSB0b29sc2V0IHJlcXVpcmVtZW50IHRoYXQgaW1wb3NlcworICAgICMgdGhlIHRvb2xzZXQgc3ViY29uZGl0aW9uLCB3aGljaCBlbmNvZGVzIHRoZSB2ZXJzaW9uLgorICAgIGlmICQocmVxdWlyZW1lbnQpCisgICAgeworICAgICAgICBsb2NhbCByID0gPHRvb2xzZXQ+JCh0b29sc2V0KSAkKHJlcXVpcmVtZW50KSA7CisgICAgICAgIHIgPSAkKHI6Sj0sKSA7CisgICAgICAgIHRvb2xzZXQuYWRkLXJlcXVpcmVtZW50cyAkKHIpOiQoc3ViY29uZGl0aW9uKSA7CisgICAgfQorCisgICAgIyBXZSBhZGQgdGhlIHJlcXVpcmVtZW50cywgaWYgYW55LCB0byB0aGUgY29uZGl0aW9uIHRvIHNjb3BlIHRoZSB0b29sc2V0CisgICAgIyB2YXJpYWJsZXMgYW5kIG9wdGlvbnMgdG8gdGhpcyBzcGVjaWZpYyB2ZXJzaW9uLgorICAgIGNvbmRpdGlvbiArPSAkKHJlcXVpcmVtZW50KSA7CisKKyAgICBpZiAkKC5zaG93LWNvbmZpZ3VyYXRpb24pCisgICAgeworICAgICAgICBFQ0hPIG5vdGljZTogJChjb25kaXRpb24pIDsKKyAgICB9CisgICAgcmV0dXJuICQoY29uZGl0aW9uOko9LykgOworfQorCisKKyMgQSBoZWxwZXIgcnVsZSB0byBnZXQgdGhlIGNvbW1hbmQgdG8gaW52b2tlIHNvbWUgdG9vbC4gSWYKKyMgJ3VzZXItcHJvdmlkZWQtY29tbWFuZCcgaXMgbm90IGdpdmVuLCB0cmllcyB0byBmaW5kIGJpbmFyeSBuYW1lZCAndG9vbCcgaW4KKyMgUEFUSCBhbmQgaW4gdGhlIHBhc3NlZCAnYWRkaXRpb25hbC1wYXRoJy4gT3RoZXJ3aXNlLCB2ZXJpZmllcyB0aGF0IHRoZSBmaXJzdAorIyBlbGVtZW50IG9mICd1c2VyLXByb3ZpZGVkLWNvbW1hbmQnIGlzIGFuIGV4aXN0aW5nIHByb2dyYW0uCisjCisjIFRoaXMgcnVsZSByZXR1cm5zIHRoZSBjb21tYW5kIHRvIGJlIHVzZWQgd2hlbiBpbnZva2luZyB0aGUgdG9vbC4gSWYgd2UgY2FuIG5vdAorIyBmaW5kIHRoZSB0b29sLCBhIHdhcm5pbmcgaXMgaXNzdWVkLiBJZiAncGF0aC1sYXN0JyBpcyBzcGVjaWZpZWQsIFBBVEggaXMKKyMgY2hlY2tlZCBhZnRlciAnYWRkaXRpb25hbC1wYXRocycgd2hlbiBzZWFyY2hpbmcgZm9yICd0b29sJy4KKyMKK3J1bGUgZ2V0LWludm9jYXRpb24tY29tbWFuZC1ub2RlZmF1bHQgKCB0b29sc2V0IDogdG9vbCA6CisgICAgdXNlci1wcm92aWRlZC1jb21tYW5kICogOiBhZGRpdGlvbmFsLXBhdGhzICogOiBwYXRoLWxhc3QgPyApCit7CisgICAgbG9jYWwgY29tbWFuZCA7CisgICAgaWYgISAkKHVzZXItcHJvdmlkZWQtY29tbWFuZCkKKyAgICB7CisgICAgICAgIGNvbW1hbmQgPSBbIGZpbmQtdG9vbCAkKHRvb2wpIDogJChhZGRpdGlvbmFsLXBhdGhzKSA6ICQocGF0aC1sYXN0KSBdIDsKKyAgICAgICAgaWYgISAkKGNvbW1hbmQpICYmICQoLmRlYnVnLWNvbmZpZ3VyYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gd2FybmluZzogdG9vbHNldCAkKHRvb2xzZXQpIGluaXRpYWxpemF0aW9uOiBjYW4gbm90IGZpbmQgdG9vbAorICAgICAgICAgICAgICAgICQodG9vbCkgOworICAgICAgICAgICAgRUNITyB3YXJuaW5nOiBpbml0aWFsaXplZCBmcm9tIFsgZXJyb3JzLm5lYXJlc3QtdXNlci1sb2NhdGlvbiBdIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb21tYW5kID0gWyBjaGVjay10b29sICQodXNlci1wcm92aWRlZC1jb21tYW5kKSBdIDsKKyAgICAgICAgaWYgISAkKGNvbW1hbmQpICYmICQoLmRlYnVnLWNvbmZpZ3VyYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gd2FybmluZzogdG9vbHNldCAkKHRvb2xzZXQpIGluaXRpYWxpemF0aW9uOiA7CisgICAgICAgICAgICBFQ0hPIHdhcm5pbmc6IGNhbiBub3QgZmluZCB1c2VyLXByb3ZpZGVkIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAnJCh1c2VyLXByb3ZpZGVkLWNvbW1hbmQpJyA7CisgICAgICAgICAgICBFQ0hPIHdhcm5pbmc6IGluaXRpYWxpemVkIGZyb20gWyBlcnJvcnMubmVhcmVzdC11c2VyLWxvY2F0aW9uIF0gOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICQoY29tbWFuZCkgOworfQorCisKKyMgU2FtZSBhcyBnZXQtaW52b2NhdGlvbi1jb21tYW5kLW5vZGVmYXVsdCwgZXhjZXB0IHRoYXQgaWYgbm8gdG9vbCBpcyBmb3VuZCwKKyMgcmV0dXJucyBlaXRoZXIgdGhlIHVzZXItcHJvdmlkZWQtY29tbWFuZCwgaWYgcHJlc2VudCwgb3IgdGhlICd0b29sJyBwYXJhbWV0ZXIuCisjCitydWxlIGdldC1pbnZvY2F0aW9uLWNvbW1hbmQgKCB0b29sc2V0IDogdG9vbCA6IHVzZXItcHJvdmlkZWQtY29tbWFuZCAqIDoKKyAgICBhZGRpdGlvbmFsLXBhdGhzICogOiBwYXRoLWxhc3QgPyApCit7CisgICAgbG9jYWwgcmVzdWx0ID0gWyBnZXQtaW52b2NhdGlvbi1jb21tYW5kLW5vZGVmYXVsdCAkKHRvb2xzZXQpIDogJCh0b29sKSA6CisgICAgICAgICQodXNlci1wcm92aWRlZC1jb21tYW5kKSA6ICQoYWRkaXRpb25hbC1wYXRocykgOiAkKHBhdGgtbGFzdCkgXSA7CisKKyAgICBpZiAhICQocmVzdWx0KQorICAgIHsKKyAgICAgICAgaWYgJCh1c2VyLXByb3ZpZGVkLWNvbW1hbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICQodXNlci1wcm92aWRlZC1jb21tYW5kKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSAkKHRvb2wpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIEdpdmVuIGFuIGludm9jYXRpb24gY29tbWFuZCByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGNvbW1hbmQuIFRoaXMKKyMgd29ya3MgZXZlbiBpZiBjb21tYW5kIGhhcyBubyBwYXRoIGVsZW1lbnQgYW5kIHdhcyBmb3VuZCBvbiB0aGUgUEFUSC4KKyMKK3J1bGUgZ2V0LWFic29sdXRlLXRvb2wtcGF0aCAoIGNvbW1hbmQgKQoreworICAgIGlmICQoY29tbWFuZDpEKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoY29tbWFuZDpEKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxvY2FsIG0gPSBbIEdMT0IgWyBtb2R1bGVzLnBlZWsgOiBQQVRIIFBhdGggcGF0aCBdIDogJChjb21tYW5kKQorICAgICAgICAgICAgJChjb21tYW5kKS5leGUgXSA7CisgICAgICAgIHJldHVybiAkKG1bMV06RCkgOworICAgIH0KK30KKworCisjIEF0dGVtcHRzIHRvIGZpbmQgdG9vbCAoYmluYXJ5KSBuYW1lZCAnbmFtZScgaW4gUEFUSCBhbmQgaW4gJ2FkZGl0aW9uYWwtcGF0aHMnLgorIyBJZiBmb3VuZCBpbiBQQVRILCByZXR1cm5zICduYW1lJyBhbmQgaWYgZm91bmQgaW4gYWRkaXRpb25hbCBwYXRocywgcmV0dXJucworIyBhYnNvbHV0ZSBuYW1lLiBJZiB0aGUgdG9vbCBpcyBmb3VuZCBpbiBzZXZlcmFsIGRpcmVjdG9yaWVzLCByZXR1cm5zIHRoZSBmaXJzdAorIyBwYXRoIGZvdW5kLiBPdGhlcndpc2UsIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiBJZiAncGF0aC1sYXN0JyBpcyBzcGVjaWZpZWQsCisjIFBBVEggaXMgc2VhcmNoZWQgYWZ0ZXIgJ2FkZGl0aW9uYWwtcGF0aHMnLgorIworcnVsZSBmaW5kLXRvb2wgKCBuYW1lIDogYWRkaXRpb25hbC1wYXRocyAqIDogcGF0aC1sYXN0ID8gKQoreworICAgIGxvY2FsIHBhdGggPSBbIHBhdGgucHJvZ3JhbXMtcGF0aCBdIDsKKyAgICBsb2NhbCBtYXRjaCA9IFsgcGF0aC5nbG9iICQocGF0aCkgOiAkKG5hbWUpICQobmFtZSkuZXhlIF0gOworICAgIGxvY2FsIGFkZGl0aW9uYWwtbWF0Y2ggPSBbIHBhdGguZ2xvYiAkKGFkZGl0aW9uYWwtcGF0aHMpIDogJChuYW1lKQorICAgICAgICAkKG5hbWUpLmV4ZSBdIDsKKworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgaWYgJChwYXRoLWxhc3QpCisgICAgeworICAgICAgICByZXN1bHQgPSAkKGFkZGl0aW9uYWwtbWF0Y2gpIDsKKyAgICAgICAgaWYgISAkKHJlc3VsdCkgJiYgJChtYXRjaCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gJChuYW1lKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgJChtYXRjaCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gJChuYW1lKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSAkKGFkZGl0aW9uYWwtbWF0Y2gpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAkKHJlc3VsdCkKKyAgICB7CisgICAgICAgIHJldHVybiBbIHBhdGgubmF0aXZlICQocmVzdWx0WzFdKSBdIDsKKyAgICB9Cit9CisKKyMgQ2hlY2tzIGlmICdjb21tYW5kJyBjYW4gYmUgZm91bmQgZWl0aGVyIGluIHBhdGggb3IgaXMgYSBmdWxsIG5hbWUgdG8gYW4KKyMgZXhpc3RpbmcgZmlsZS4KKyMKK2xvY2FsIHJ1bGUgY2hlY2stdG9vbC1hdXggKCBjb21tYW5kICkKK3sKKyAgICBpZiAkKGNvbW1hbmQ6RCkKKyAgICB7CisgICAgICAgIGlmIFsgcGF0aC5leGlzdHMgJChjb21tYW5kKSBdCisgICAgICAgICAgICAjIEJvdGggTlQgYW5kIEN5Z3dpbiB3aWxsIHJ1biAuZXhlIGZpbGVzIGJ5IHRoZWlyIHVucXVhbGlmaWVkIG5hbWVzLgorICAgICAgICAgICAgfHwgKCBbIG9zLm9uLXdpbmRvd3MgXSAmJiBbIHBhdGguZXhpc3RzICQoY29tbWFuZCkuZXhlIF0gKQorICAgICAgICAgICAgIyBPbmx5IE5UIHdpbGwgcnVuIC5iYXQgJiAuY21kIGZpbGVzIGJ5IHRoZWlyIHVucXVhbGlmaWVkIG5hbWVzLgorICAgICAgICAgICAgfHwgKCAoIFsgb3MubmFtZSBdID0gTlQgKSAmJiAoIFsgcGF0aC5leGlzdHMgJChjb21tYW5kKS5iYXQgXSB8fAorICAgICAgICAgICAgICAgIFsgcGF0aC5leGlzdHMgJChjb21tYW5kKS5jbWQgXSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICQoY29tbWFuZCkgOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIFsgR0xPQiBbIG1vZHVsZXMucGVlayA6IFBBVEggUGF0aCBwYXRoIF0gOiAkKGNvbW1hbmQpIF0KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICQoY29tbWFuZCkgOworICAgICAgICB9CisgICAgfQorfQorCisKKyMgQ2hlY2tzIHRoYXQgYSB0b29sIGNhbiBiZSBpbnZva2VkIGJ5ICdjb21tYW5kJy4gSWYgY29tbWFuZCBpcyBub3QgYW4gYWJzb2x1dGUKKyMgcGF0aCwgY2hlY2tzIGlmIGl0IGNhbiBiZSBmb3VuZCBpbiAncGF0aCcuIElmIGNvbWFuZCBpcyBhbiBhYnNvbHV0ZSBwYXRoLAorIyBjaGVjayB0aGF0IGl0IGV4aXN0cy4gUmV0dXJucyAnY29tbWFuZCcgaWYgb2sgb3IgZW1wdHkgc3RyaW5nIG90aGVyd2lzZS4KKyMKK2xvY2FsIHJ1bGUgY2hlY2stdG9vbCAoIHhjb21tYW5kICsgKQoreworICAgIGlmIFsgY2hlY2stdG9vbC1hdXggJCh4Y29tbWFuZFsxXSkgXSB8fAorICAgICAgIFsgY2hlY2stdG9vbC1hdXggJCh4Y29tbWFuZFstMV0pIF0KKyAgICB7CisgICAgICAgIHJldHVybiAkKHhjb21tYW5kKSA7CisgICAgfQorfQorCisKKyMgSGFuZGxlIGNvbW1vbiBvcHRpb25zIGZvciB0b29sc2V0LCBzcGVjaWZpY2FsbHkgc2V0cyB0aGUgZm9sbG93aW5nIGZsYWcKKyMgdmFyaWFibGVzOgorIyAtIENPTkZJR19DT01NQU5EIHRvICQoY29tbWFuZCkKKyMgLSBPUFRJT05TIGZvciBjb21waWxlICAgICAgICAgdG8gdGhlIHZhbHVlIG9mIDxjb21waWxlZmxhZ3M+IGluICQob3B0aW9ucykKKyMgLSBPUFRJT05TIGZvciBjb21waWxlLmMgICAgICAgdG8gdGhlIHZhbHVlIG9mIDxjZmxhZ3M+ICAgICAgIGluICQob3B0aW9ucykKKyMgLSBPUFRJT05TIGZvciBjb21waWxlLmMrKyAgICAgdG8gdGhlIHZhbHVlIG9mIDxjeHhmbGFncz4gICAgIGluICQob3B0aW9ucykKKyMgLSBPUFRJT05TIGZvciBjb21waWxlLmZvcnRyYW4gdG8gdGhlIHZhbHVlIG9mIDxmZmxhZ3M+ICAgICAgIGluICQob3B0aW9ucykKKyMgLSBPUFRJT05TIGZvciBsaW5rICAgICAgICAgICAgdG8gdGhlIHZhbHVlIG9mIDxsaW5rZmxhZ3M+ICAgIGluICQob3B0aW9ucykKKyMKK3J1bGUgaGFuZGxlLW9wdGlvbnMgKCB0b29sc2V0IDogY29uZGl0aW9uICogOiBjb21tYW5kICogOiBvcHRpb25zICogKQoreworICAgIGlmICQoLmRlYnVnLWNvbmZpZ3VyYXRpb24pCisgICAgeworICAgICAgICBFQ0hPIG5vdGljZTogd2lsbCB1c2UgJyQoY29tbWFuZCknIGZvciAkKHRvb2xzZXQpLCBjb25kaXRpb24KKyAgICAgICAgICAgICQoY29uZGl0aW9uOkU9KGVtcHR5KSkgOworICAgIH0KKworICAgICMgICBUaGUgbGFzdCBwYXJhbWV0ZXIgKCd1bmNoZWNrZWQnKSBzYXlzIGl0IGlzIE9LIHRvIHNldCBmbGFncyBmb3IgYW5vdGhlcgorICAgICMgbW9kdWxlLgorICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KSBDT05GSUdfQ09NTUFORCAkKGNvbmRpdGlvbikgOiAkKGNvbW1hbmQpCisgICAgICAgIDogdW5jaGVja2VkIDsKKworICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5jb21waWxlICAgICAgICAgT1BUSU9OUyAkKGNvbmRpdGlvbikgOgorICAgICAgICBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8Y29tcGlsZWZsYWdzPiA6ICQob3B0aW9ucykgXSA6IHVuY2hlY2tlZCA7CisKKyAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkuY29tcGlsZS5jICAgICAgIE9QVElPTlMgJChjb25kaXRpb24pIDoKKyAgICAgICAgWyBmZWF0dXJlLmdldC12YWx1ZXMgPGNmbGFncz4gICAgICAgOiAkKG9wdGlvbnMpIF0gOiB1bmNoZWNrZWQgOworCisgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUuYysrICAgICBPUFRJT05TICQoY29uZGl0aW9uKSA6CisgICAgICAgIFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxjeHhmbGFncz4gICAgIDogJChvcHRpb25zKSBdIDogdW5jaGVja2VkIDsKKworICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5jb21waWxlLmZvcnRyYW4gT1BUSU9OUyAkKGNvbmRpdGlvbikgOgorICAgICAgICBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8ZmZsYWdzPiAgICAgICA6ICQob3B0aW9ucykgXSA6IHVuY2hlY2tlZCA7CisKKyAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayAgICAgICAgICAgIE9QVElPTlMgJChjb25kaXRpb24pIDoKKyAgICAgICAgWyBmZWF0dXJlLmdldC12YWx1ZXMgPGxpbmtmbGFncz4gICAgOiAkKG9wdGlvbnMpIF0gOiB1bmNoZWNrZWQgOworfQorCisKKyMgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlICJwcm9ncmFtIGZpbGVzIiBkaXJlY3Rvcnkgb24gYSBXaW5kb3dzIHBsYXRmb3JtLgorIworcnVsZSBnZXQtcHJvZ3JhbS1maWxlcy1kaXIgKCApCit7CisgICAgbG9jYWwgUHJvZ3JhbUZpbGVzID0gWyBtb2R1bGVzLnBlZWsgOiBQcm9ncmFtRmlsZXMgXSA7CisgICAgaWYgJChQcm9ncmFtRmlsZXMpCisgICAgeworICAgICAgICBQcm9ncmFtRmlsZXMgPSAiJChQcm9ncmFtRmlsZXM6Sj0gKSIgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQcm9ncmFtRmlsZXMgPSAiYzpcXFByb2dyYW0gRmlsZXMiIDsKKyAgICB9CisgICAgcmV0dXJuICQoUHJvZ3JhbUZpbGVzKSA7Cit9CisKKworaWYgWyBvcy5uYW1lIF0gPSBOVAoreworICAgIFJNID0gZGVsIC9mIC9xIDsKKyAgICBDUCA9IGNvcHkgL2IgOworICAgIElHTk9SRSA9ICIyPm51bCA+bnVsICYgc2V0bG9jYWwiIDsKKyAgICBMTiA/PSAkKENQKSA7CisgICAgIyBVZ2x5IGhhY2sgdG8gY29udmluY2UgY29weSB0byBzZXQgdGhlIHRpbWVzdGFtcCBvZiB0aGUgZGVzdGluYXRpb24gdG8gdGhlCisgICAgIyBjdXJyZW50IHRpbWUgYnkgY29uY2F0ZW5hdGluZyB0aGUgc291cmNlIHdpdGggYSBub25leGlzdGVudCBmaWxlLiBOb3RlCisgICAgIyB0aGF0IHRoaXMgcmVxdWlyZXMgL2IgKGJpbmFyeSkgYXMgdGhlIGRlZmF1bHQgd2hlbiBjb25jYXRlbmF0aW5nIGZpbGVzIGlzCisgICAgIyAvYSAoYXNjaWkpLgorICAgIFdJTkRPV1MtQ1AtSEFDSyA9ICIrIHRoaXMtZmlsZS1kb2VzLW5vdC1leGlzdC1BNjk4RUU3ODA2ODk5RTY5IiA7Cit9CitlbHNlCit7CisgICAgUk0gPSBybSAtZiA7CisgICAgQ1AgPSBjcCA7CisgICAgTE4gPSBsbiA7Cit9CisKKworcnVsZSBybS1jb21tYW5kICggKQoreworICAgIHJldHVybiAkKFJNKSA7Cit9CisKKworcnVsZSBjb3B5LWNvbW1hbmQgKCApCit7CisgICAgcmV0dXJuICQoQ1ApIDsKK30KKworCitpZiAiXG4iID0gIm4iCit7CisgICAgIyBFc2NhcGUgY2hhcmFjdGVycyBub3Qgc3VwcG9ydGVkIHNvIHVzZSB1Z2x5IGhhY2tzLiBXaWxsIG5vdCB3b3JrIG9uIEN5Z3dpbgorICAgICMgLSBzZWUgYmVsb3cuCisgICAgbmwgPSAiCisiIDsKKyAgICBxID0gIiIgOworfQorZWxzZQoreworICAgIG5sID0gIlxuIiA7CisgICAgcSA9ICJcIiIgOworfQorCisjIFJldHVybnMgdGhlIGNvbW1hbmQgbmVlZGVkIHRvIHNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvbiB0aGUgY3VycmVudAorIyBwbGF0Zm9ybS4gVGhlIHZhcmlhYmxlIHNldHRpbmcgcGVyc2lzdHMgdGhyb3VnaCBhbGwgZm9sbG93aW5nIGNvbW1hbmRzIGFuZCBpcworIyB2aXNpYmxlIGluIHRoZSBlbnZpcm9ubWVudCBzZWVuIGJ5IHN1YnNlcXVlbnRseSBleGVjdXRlZCBjb21tYW5kcy4gSW4gb3RoZXIKKyMgd29yZHMsIG9uIFVuaXggc3lzdGVtcywgdGhlIHZhcmlhYmxlIGlzIGV4cG9ydGVkLCB3aGljaCBpcyBjb25zaXN0ZW50IHdpdGggdGhlCisjIG9ubHkgcG9zc2libGUgYmVoYXZpb3Igb24gV2luZG93cyBzeXN0ZW1zLgorIworcnVsZSB2YXJpYWJsZS1zZXR0aW5nLWNvbW1hbmQgKCB2YXJpYWJsZSA6IHZhbHVlICkKK3sKKyAgICBpZiBbIG9zLm5hbWUgXSA9IE5UCisgICAgeworICAgICAgICByZXR1cm4gInNldCAkKHZhcmlhYmxlKT0kKHZhbHVlKSQobmwpIiA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICMgSWYgd2UgZG8gbm90IGhhdmUgZXNjYXBlIGNoYXJhY3RlciBzdXBwb3J0IGluIGJqYW0sIHRoZSBjb2QgYmVsb3cKKyAgICAgICAgIyBibG93cyB1cCBvbiBDWUdXSU4sIHNpbmNlIHRoZSAkKG5sKSB2YXJpYWJsZSBob2xkcyBhIFdpbmRvd3MgbmV3LWxpbmUKKyAgICAgICAgIyBcclxuIHNlcXVlbmNlIHRoYXQgbWVzc2VzIHVwIHRoZSBleGVjdXRlZCBleHBvcnQgY29tbWFuZCB3aGljaCB0aGVuCisgICAgICAgICMgcmVwb3J0cyB0aGF0IHRoZSBwYXNzZWQgdmFyaWFibGUgbmFtZSBpcyBpbmNvcnJlY3QuCisgICAgICAgICMgQnV0IHdlIGhhdmUgYSBjaGVjayBmb3IgY3lnd2luIGluIGtlcm5lbC9ib290c3RyYXAuamFtIGFscmVhZHkuCisgICAgICAgIHJldHVybiAiJCh2YXJpYWJsZSk9JChxKSQodmFsdWUpJChxKSQobmwpZXhwb3J0ICQodmFyaWFibGUpJChubCkiIDsKKyAgICB9Cit9CisKKworIyBSZXR1cm5zIGEgY29tbWFuZCB0byBzZXRzIGEgbmFtZWQgc2hlbGwgcGF0aCB2YXJpYWJsZSB0byB0aGUgZ2l2ZW4gTkFUSVZFCisjIHBhdGhzIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorIworcnVsZSBwYXRoLXZhcmlhYmxlLXNldHRpbmctY29tbWFuZCAoIHZhcmlhYmxlIDogcGF0aHMgKiApCit7CisgICAgbG9jYWwgc2VwID0gWyBvcy5wYXRoLXNlcGFyYXRvciBdIDsKKyAgICByZXR1cm4gWyB2YXJpYWJsZS1zZXR0aW5nLWNvbW1hbmQgJCh2YXJpYWJsZSkgOiAkKHBhdGhzOko9JChzZXApKSBdIDsKK30KKworCisjIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcHJlcGVuZHMgdGhlIGdpdmVuIHBhdGhzIHRvIHRoZSBuYW1lZCBwYXRoIHZhcmlhYmxlIG9uCisjIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorIworcnVsZSBwcmVwZW5kLXBhdGgtdmFyaWFibGUtY29tbWFuZCAoIHZhcmlhYmxlIDogcGF0aHMgKiApCit7CisgICAgcmV0dXJuIFsgcGF0aC12YXJpYWJsZS1zZXR0aW5nLWNvbW1hbmQgJCh2YXJpYWJsZSkKKyAgICAgICAgOiAkKHBhdGhzKSBbIG9zLmV4cGFuZC12YXJpYWJsZSAkKHZhcmlhYmxlKSBdIF0gOworfQorCisKKyMgUmV0dXJuIGEgY29tbWFuZCB3aGljaCBjYW4gY3JlYXRlIGEgZmlsZS4gSWYgJ3InIGlzIHJlc3VsdCBvZiBpbnZvY2F0aW9uLCB0aGVuCisjICdyIGZvb2Jhcicgd2lsbCBjcmVhdGUgZm9vYmFyIHdpdGggdW5zcGVjaWZpZWQgY29udGVudC4gV2hhdCBoYXBwZW5zIGlmIGZpbGUKKyMgYWxyZWFkeSBleGlzdHMgaXMgdW5zcGVjaWZpZWQuCisjCitydWxlIGZpbGUtY3JlYXRpb24tY29tbWFuZCAoICkKK3sKKyAgICBpZiBbIG9zLm5hbWUgXSA9IE5UCisgICAgeworICAgICAgICAjIEEgZmV3IGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9ucyBvbiBXaW5kb3dzOgorICAgICAgICAjCisgICAgICAgICMgICAndHlwZSBOVUwgPj4gJworICAgICAgICAjICAgICAgICBUaGF0IHdvdWxkIGNvbnN0cnVjdCBhbiBlbXB0eSBmaWxlIGluc3RlYWQgb2YgYSBmaWxlIGNvbnRhaW5pbmcKKyAgICAgICAgIyAgICAgIGEgc3BhY2UgYW5kIGFuIGVuZC1vZi1saW5lIG1hcmtlciBidXQgaXQgd291bGQgYWxzbyBub3QgY2hhbmdlCisgICAgICAgICMgICAgICB0aGUgdGFyZ2V0J3MgdGltZXN0YW1wIGluIGNhc2UgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMuCisgICAgICAgICMKKyAgICAgICAgIyAgICd0eXBlIE5VTCA+ICcKKyAgICAgICAgIyAgICAgICAgVGhhdCB3b3VsZCBjb25zdHJ1Y3QgYW4gZW1wdHkgZmlsZSBpbnN0ZWFkIG9mIGEgZmlsZSBjb250YWluaW5nCisgICAgICAgICMgICAgICBhIHNwYWNlIGFuZCBhbiBlbmQtb2YtbGluZSBtYXJrZXIgYnV0IGl0IHdvdWxkIGFsc28gZGVzdHJveSBhbgorICAgICAgICAjICAgICAgYWxyZWFkeSBleGlzdGluZyBmaWxlIGJ5IG92ZXJ3cml0aW5nIGl0IHdpdGggYW4gZW1wdHkgb25lLgorICAgICAgICAjCisgICAgICAgICMgICBJIGd1ZXNzIHRoZSBiZXN0IHNvbHV0aW9uIHdvdWxkIGJlIHRvIGFsbG93IEJvb3N0IEphbSB0byBkZWZpbmUKKyAgICAgICAgIyBidWlsdC1pbiBmdW5jdGlvbnMgc3VjaCBhcyAnY3JlYXRlIGEgZmlsZScsICd0b3VjaCBhIGZpbGUnIG9yICdjb3B5IGEKKyAgICAgICAgIyBmaWxlJyB3aGljaCBjb3VsZCBiZSB1c2VkIGZyb20gaW5zaWRlIGFjdGlvbiBjb2RlLiBUaGF0IHdvdWxkIGFsbG93CisgICAgICAgICMgY29tcGxldGVseSBwb3J0YWJsZSBvcGVyYXRpb25zIHdpdGhvdXQgdGhpcyBraW5kIG9mIGtsdWRnZS4KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIyLjAyLjIwMDkuKSAoSnVya28pCisgICAgICAgIHJldHVybiAiZWNoby4gPiAiIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuICJ0b3VjaCAiIDsKKyAgICB9Cit9CisKKworIyBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IG1heSBiZSB1c2VkIGZvciAndG91Y2hpbmcnIGZpbGVzLiBJdCBpcyBub3QgYSByZWFsCisjICd0b3VjaCcgY29tbWFuZCBvbiBOVCBiZWNhdXNlIGl0IGFkZHMgYW4gZW1wdHkgbGluZSBhdCB0aGUgZW5kIG9mIGZpbGUgYnV0IGl0CisjIHdvcmtzIHdpdGggc291cmNlIGZpbGVzLgorIworcnVsZSBmaWxlLXRvdWNoLWNvbW1hbmQgKCApCit7CisgICAgaWYgWyBvcy5uYW1lIF0gPSBOVAorICAgIHsKKyAgICAgICAgcmV0dXJuICJlY2hvLiA+PiAiIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuICJ0b3VjaCAiIDsKKyAgICB9Cit9CisKKworcnVsZSBNa0RpcgoreworICAgICMgSWYgZGlyIGV4aXN0cywgZG8gbm90IHVwZGF0ZSBpdC4gRG8gdGhpcyBldmVuIGZvciAkKERPVCkuCisgICAgTk9VUERBVEUgJCg8KSA7CisKKyAgICBpZiAkKDwpICE9ICQoRE9UKSAmJiAhICQoJCg8KS1ta2RpcikKKyAgICB7CisgICAgICAgICMgQ2hlZXN5IGdhdGUgdG8gcHJldmVudCBtdWx0aXBsZSBpbnZvY2F0aW9ucyBvbiBzYW1lIGRpci4KKyAgICAgICAgJCg8KS1ta2RpciA9IHRydWUgOworCisgICAgICAgICMgU2NoZWR1bGUgdGhlIG1rZGlyIGJ1aWxkIGFjdGlvbi4KKyAgICAgICAgY29tbW9uLm1rZGlyICQoPCkgOworCisgICAgICAgICMgUHJlcGFyZSBhIEphbSAnZGlycycgdGFyZ2V0IHRoYXQgY2FuIGJlIHVzZWQgdG8gbWFrZSB0aGUgYnVpbGQgb25seQorICAgICAgICAjIGNvbnN0cnVjdCBhbGwgdGhlIHRhcmdldCBkaXJlY3Rvcmllcy4KKyAgICAgICAgREVQRU5EUyBkaXJzIDogJCg8KSA7CisKKyAgICAgICAgIyBSZWN1cnNpdmVseSBjcmVhdGUgcGFyZW50IGRpcmVjdG9yaWVzLiAkKDw6UCkgPSAkKDwpJ3MgcGFyZW50ICYgd2UKKyAgICAgICAgIyByZWN1cnNlIHVudGlsIHJvb3QuCisKKyAgICAgICAgbG9jYWwgcyA9ICQoPDpQKSA7CisgICAgICAgIGlmIFsgb3MubmFtZSBdID0gTlQKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICQocykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICo6ICAgOiBzID0gOworICAgICAgICAgICAgICAgIGNhc2UgKjpcXCA6IHMgPSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAkKHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQocykgIT0gJCg8KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERFUEVORFMgJCg8KSA6ICQocykgOworICAgICAgICAgICAgICAgIE1rRGlyICQocykgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5PVEZJTEUgJChzKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworI2FjdGlvbnMgTWtEaXIxCisjeworIyAgICBta2RpciAiJCg8KSIKKyN9CisKKyMgICBUaGUgZm9sbG93aW5nIHF1aWNrLWZpeCBhY3Rpb25zIHNob3VsZCBiZSByZXBsYWNlZCB1c2luZyB0aGUgb3JpZ2luYWwgTWtEaXIxCisjIGFjdGlvbiBvbmNlIEJvb3N0IEphbSBnZXRzIHVwZGF0ZWQgdG8gY29ycmVjdGx5IGRldGVjdCBkaWZmZXJlbnQgcGF0aHMgbGVhZGluZworIyB1cCB0byB0aGUgc2FtZSBmaWxlc3lzdGVtIHRhcmdldCBhbmQgdHJpZ2dlcnMgdGhlaXIgYnVpbGQgYWN0aW9uIG9ubHkgb25jZS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9kbykgKDA0LjA3LjIwMDguKSAoSnVya28pCisKK2lmIFsgb3MubmFtZSBdID0gTlQKK3sKKyAgICBhY3Rpb25zIG1rZGlyCisgICAgeworICAgICAgICBpZiBub3QgZXhpc3QgIiQoPClcXCIgbWtkaXIgIiQoPCkiCisgICAgfQorfQorZWxzZQoreworICAgIGFjdGlvbnMgbWtkaXIKKyAgICB7CisgICAgICAgIG1rZGlyIC1wICIkKDwpIgorICAgIH0KK30KKworYWN0aW9ucyBwaWVjZW1lYWwgdG9nZXRoZXIgZXhpc3RpbmcgQ2xlYW4KK3sKKyAgICAkKFJNKSAiJCg+KSIKK30KKworCitydWxlIGNvcHkKK3sKK30KKworCithY3Rpb25zIGNvcHkKK3sKKyAgICAkKENQKSAiJCg+KSIgJChXSU5ET1dTLUNQLUhBQ0spICIkKDwpIgorfQorCisKK3J1bGUgUm1UZW1wcworeworfQorCisKK2FjdGlvbnMgcXVpZXRseSB1cGRhdGVkIHBpZWNlbWVhbCB0b2dldGhlciBSbVRlbXBzCit7CisgICAgJChSTSkgIiQoPikiICQoSUdOT1JFKQorfQorCisKK2FjdGlvbnMgaGFyZC1saW5rCit7CisgICAgJChSTSkgIiQoPCkiIDIkKE5VTExfT1VUKSAkKE5VTExfT1VUKQorICAgICQoTE4pICIkKD4pIiAiJCg8KSIgJChOVUxMX09VVCkKK30KKworCisjIEdpdmVuIGEgdGFyZ2V0LCBhcyBnaXZlbiB0byBhIGN1c3RvbSB0YWcgcnVsZSwgcmV0dXJucyBhIHN0cmluZyBmb3JtYXR0ZWQKKyMgYWNjb3JkaW5nIHRvIHRoZSBwYXNzZWQgZm9ybWF0LiBGb3JtYXQgaXMgYSBsaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBpcworIyByZXByZXNlbnRlZCBpbiB0aGUgcmVzdWx0LiBGb3IgZWFjaCBlbGVtZW50IG9mIGZvcm1hdCB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXQKKyMgaW5mb3JtYXRpb24gaXMgb2J0YWluZWQgYW5kIGFkZGVkIHRvIHRoZSByZXN1bHQgc3RyaW5nLiBGb3IgYWxsLCBidXQgdGhlCisjIGxpdGVyYWwsIHRoZSBmb3JtYXQgdmFsdWUgaXMgdGFrZW4gYXMgdGhlIGFzIHN0cmluZyB0byBwcmVwZW5kIHRvIHRoZSBvdXRwdXQKKyMgdG8gam9pbiB0aGUgaXRlbSB0byB0aGUgcmVzdCBvZiB0aGUgcmVzdWx0LiBJZiBub3QgZ2l2ZW4gIi0iIGlzIHVzZWQgYXMgYQorIyBqb2luZXIuCisjCisjIFRoZSBmb3JtYXQgb3B0aW9ucyBjYW4gYmU6CisjCisjICAgPGJhc2U+W2pvaW5lcl0KKyMgICAgICAgOjogIFRoZSBiYXNlbmFtZSBvZiB0aGUgdGFyZ2V0IG5hbWUuCisjICAgPHRvb2xzZXQ+W2pvaW5lcl0KKyMgICAgICAgOjogIFRoZSBhYmJyZXZpYXRlZCB0b29sc2V0IHRhZyBiZWluZyB1c2VkIHRvIGJ1aWxkIHRoZSB0YXJnZXQuCisjICAgPHRocmVhZGluZz5bam9pbmVyXQorIyAgICAgICA6OiAgSW5kaWNhdGlvbiBvZiBhIG11bHRpLXRocmVhZGVkIGJ1aWxkLgorIyAgIDxydW50aW1lPltqb2luZXJdCisjICAgICAgIDo6ICBDb2xsZWN0aXZlIHRhZyBvZiB0aGUgYnVpbGQgcnVudGltZS4KKyMgICA8dmVyc2lvbjovdmVyc2lvbi1mZWF0dXJlIHwgWC5ZWy5aXS8+W2pvaW5lcl0KKyMgICAgICAgOjogIFNob3J0IHZlcnNpb24gdGFnIHRha2VuIGZyb20gdGhlIGdpdmVuICJ2ZXJzaW9uLWZlYXR1cmUiIGluIHRoZQorIyAgICAgICAgICAgYnVpbGQgcHJvcGVydGllcy4gT3IgaWYgbm90IHByZXNlbnQsIHRoZSBsaXRlcmFsIHZhbHVlIGFzIHRoZQorIyAgICAgICAgICAgdmVyc2lvbiBudW1iZXIuCisjICAgPHByb3BlcnR5Oi9wcm9wZXJ0eS1uYW1lLz5bam9pbmVyXQorIyAgICAgICA6OiAgRGlyZWN0IGxvb2t1cCBvZiB0aGUgZ2l2ZW4gcHJvcGVydHktbmFtZSB2YWx1ZSBpbiB0aGUgYnVpbGQKKyMgICAgICAgICAgIHByb3BlcnRpZXMuIC9wcm9wZXJ0eS1uYW1lLyBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gRS5nLgorIyAgICAgICAgICAgPHByb3BlcnR5OnRvb2xzZXQtLio6Zmxhdm9yPiB3aWxsIG1hdGNoIGV2ZXJ5IHRvb2xzZXQuCisjICAgL290aGVyd2lzZS8KKyMgICAgICAgOjogIFRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBmb3JtYXQgYXJndW1lbnQuCisjCisjIEZvciBleGFtcGxlIHRoaXMgZm9ybWF0OgorIworIyAgIGJvb3N0XyA8YmFzZT4gPHRvb2xzZXQ+IDx0aHJlYWRpbmc+IDxydW50aW1lPiA8dmVyc2lvbjpib29zdC12ZXJzaW9uPgorIworIyBNaWdodCByZXR1cm46CisjCisjICAgYm9vc3RfdGhyZWFkLXZjODAtbXQtZ2QtMV8zMy5kbGwsIG9yCisjICAgYm9vc3RfcmVnZXgtdmM4MC1nZC0xXzMzLmRsbAorIworIyBUaGUgcmV0dXJuZWQgbmFtZSBhbHNvIGhhcyB0aGUgdGFyZ2V0IHR5cGUgc3BlY2lmaWMgcHJlZml4IGFuZCBzdWZmaXggd2hpY2gKKyMgcHV0cyBpdCBpbiBhIHJlYWR5IGZvcm0gdG8gdXNlIGFzIHRoZSB2YWx1ZSBmcm9tIGEgY3VzdG9tIHRhZyBydWxlLgorIworcnVsZSBmb3JtYXQtbmFtZSAoIGZvcm1hdCAqIDogbmFtZSA6IHR5cGUgPyA6IHByb3BlcnR5LXNldCApCit7CisgICAgbG9jYWwgcmVzdWx0ID0gIiIgOworICAgIGZvciBsb2NhbCBmIGluICQoZm9ybWF0KQorICAgIHsKKyAgICAgICAgc3dpdGNoICQoZjpHKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDxiYXNlPiA6CisJCWxvY2FsIG1hdGNoZWQgPSBbIE1BVENIICJeKGJvb3N0LipweXRob24pLS4qIiA6ICQobmFtZSkgXSA7CisJCWlmICQobWF0Y2hlZCkgPSBib29zdF9weXRob24gfHwgJChtYXRjaGVkKSA9IGJvb3N0X21waV9weXRob24KKwkJeworCQkJcmVzdWx0ICs9ICQobmFtZSkgOworCQl9CisJCWVsc2UKKwkJeworCQkJcmVzdWx0ICs9ICQobmFtZTpCKSA7CisJCX0KKworICAgICAgICAgICAgY2FzZSA8dG9vbHNldD4gOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbIGpvaW4tdGFnICQoZjpHPSkgOiBbIHRvb2xzZXQtdGFnICQobmFtZSkgOiAkKHR5cGUpIDoKKyAgICAgICAgICAgICAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0gXSA7CisKKyAgICAgICAgICAgIGNhc2UgPHRocmVhZGluZz4gOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbIGpvaW4tdGFnICQoZjpHPSkgOiBbIHRocmVhZGluZy10YWcgJChuYW1lKSA6ICQodHlwZSkKKyAgICAgICAgICAgICAgICAgICAgOiAkKHByb3BlcnR5LXNldCkgXSBdIDsKKworICAgICAgICAgICAgY2FzZSA8cnVudGltZT4gOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbIGpvaW4tdGFnICQoZjpHPSkgOiBbIHJ1bnRpbWUtdGFnICQobmFtZSkgOiAkKHR5cGUpIDoKKyAgICAgICAgICAgICAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0gXSA7CisKKyAgICAgICAgICAgIGNhc2UgPHF0PiA6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFsgam9pbi10YWcgJChmOkc9KSA6IFsgcXQtdGFnICQobmFtZSkgOiAkKHR5cGUpIDoKKyAgICAgICAgICAgICAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0gXSA7CisKKyAgICAgICAgICAgIGNhc2UgPGFkZHJlc3MtbW9kZWw+IDoKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gWyBqb2luLXRhZyAkKGY6Rz0pIDogWyBhZGRyZXNzLW1vZGVsLXRhZyAkKG5hbWUpIDoKKyAgICAgICAgICAgICAgICAgICAgJCh0eXBlKSA6ICQocHJvcGVydHktc2V0KSBdIF0gOworCisgICAgICAgICAgICBjYXNlIDx2ZXJzaW9uOio+IDoKKyAgICAgICAgICAgICAgICBsb2NhbCBrZXkgPSBbIE1BVENIIDx2ZXJzaW9uOiguKik+IDogJChmOkcpIF0gOworICAgICAgICAgICAgICAgIGxvY2FsIHZlcnNpb24gPSBbICQocHJvcGVydHktc2V0KS5nZXQgPCQoa2V5KT4gXSA7CisgICAgICAgICAgICAgICAgdmVyc2lvbiA/PSAkKGtleSkgOworICAgICAgICAgICAgICAgIHZlcnNpb24gPSBbIE1BVENIICJeKFteLl0rKVsuXShbXi5dKylbLl0/KFteLl0qKSIgOiAkKHZlcnNpb24pIF0gOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbIGpvaW4tdGFnICQoZjpHPSkgOiAkKHZlcnNpb25bMV0pXyQodmVyc2lvblsyXSkgXSA7CisKKyAgICAgICAgICAgIGNhc2UgPHByb3BlcnR5Oio+IDoKKyAgICAgICAgICAgICAgICBsb2NhbCBrZXkgPSBbIE1BVENIIDxwcm9wZXJ0eTooLiopPiA6ICQoZjpHKSBdIDsKKyAgICAgICAgICAgICAgICBsb2NhbCBwMCA9IFsgTUFUQ0ggPCgkKGtleSkpPiA6IFsgJChwcm9wZXJ0eS1zZXQpLnJhdyBdIF0gOworICAgICAgICAgICAgICAgIGlmICQocDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NhbCBwID0gWyAkKHByb3BlcnR5LXNldCkuZ2V0IDwkKHAwKT4gXSA7CisgICAgICAgICAgICAgICAgICAgIGlmICQocCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFsgam9pbi10YWcgJChmOkc9KSA6ICQocCkgXSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgKiA6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoZjpHPSkgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBbIHZpcnR1YWwtdGFyZ2V0LmFkZC1wcmVmaXgtYW5kLXN1ZmZpeCAkKHJlc3VsdDpKPSkgOiAkKHR5cGUpIDoKKyAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0gOworfQorCisKK2xvY2FsIHJ1bGUgam9pbi10YWcgKCBqb2luZXIgPyA6IHRhZyA/ICkKK3sKKyAgICBpZiAhICQoam9pbmVyKSB7IGpvaW5lciA9IC0gOyB9CisgICAgcmV0dXJuICQoam9pbmVyKSQodGFnKSA7Cit9CisKKworbG9jYWwgcnVsZSB0b29sc2V0LXRhZyAoIG5hbWUgOiB0eXBlID8gOiBwcm9wZXJ0eS1zZXQgKQoreworICAgIGxvY2FsIHRhZyA9IDsKKworICAgIGxvY2FsIHByb3BlcnRpZXMgPSBbICQocHJvcGVydHktc2V0KS5yYXcgXSA7CisgICAgc3dpdGNoIFsgJChwcm9wZXJ0eS1zZXQpLmdldCA8dG9vbHNldD4gXQorICAgIHsKKyAgICAgICAgY2FzZSBib3JsYW5kKiA6IHRhZyArPSBiY2IgOworICAgICAgICBjYXNlIGNsYW5nKiA6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCBbICQocHJvcGVydHktc2V0KS5nZXQgPHRvb2xzZXQtY2xhbmc6cGxhdGZvcm0+IF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgZGFyd2luIDogdGFnICs9IGNsYW5nLWRhcndpbiA7CisgICAgICAgICAgICAgICBjYXNlIGxpbnV4ICA6IHRhZyArPSBjbGFuZyA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBjb21vKiA6IHRhZyArPSBjb21vIDsKKyAgICAgICAgY2FzZSBjdyA6IHRhZyArPSBjdyA7CisgICAgICAgIGNhc2UgZGFyd2luKiA6IHRhZyArPSB4Z2NjIDsKKyAgICAgICAgY2FzZSBlZGcqIDogdGFnICs9IGVkZyA7CisgICAgICAgIGNhc2UgZ2NjKiA6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCBbICQocHJvcGVydHktc2V0KS5nZXQgPHRvb2xzZXQtZ2NjOmZsYXZvcj4gXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgKm1pbmd3KiA6IHRhZyArPSBtZ3cgOworICAgICAgICAgICAgICAgIGNhc2UgKiA6IHRhZyArPSBnY2MgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhc2UgaW50ZWwgOgorICAgICAgICBpZiBbICQocHJvcGVydHktc2V0KS5nZXQgPHRvb2xzZXQtaW50ZWw6cGxhdGZvcm0+IF0gPSB3aW4KKyAgICAgICAgeworICAgICAgICAgICAgdGFnICs9IGl3IDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRhZyArPSBpbCA7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrY2MqIDogdGFnICs9IGtjYyA7CisgICAgICAgIGNhc2Uga3lsaXgqIDogdGFnICs9IGJjayA7CisgICAgICAgICNjYXNlIG1ldHJvd2Vya3MqIDogdGFnICs9IGN3IDsKKyAgICAgICAgI2Nhc2UgbWluZ3cqIDogdGFnICs9IG1ndyA7CisgICAgICAgIGNhc2UgbWlwc3BybyogOiB0YWcgKz0gbXAgOworICAgICAgICBjYXNlIG1zdmMqIDogdGFnICs9IHZjIDsKKyAgICAgICAgY2FzZSBxY2MqIDogdGFnICs9IHFjYyA7CisgICAgICAgIGNhc2Ugc3VuKiA6IHRhZyArPSBzdyA7CisgICAgICAgIGNhc2UgdHJ1NjRjeHgqIDogdGFnICs9IHRydSA7CisgICAgICAgIGNhc2UgdmFjcHAqIDogdGFnICs9IHhsYyA7CisgICAgfQorICAgIGxvY2FsIHZlcnNpb24gPSBbIE1BVENIIDx0b29sc2V0Lip2ZXJzaW9uPihbMDEyMzQ1Njc4OV0rKVsuXShbMDEyMzQ1Njc4OV0qKQorICAgICAgICA6ICQocHJvcGVydGllcykgXSA7CisgICAgIyBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB2YzYuMCBhbmQgdmM3LjAgdXNlIGRpZmZlcmVudCBuYW1pbmcuCisgICAgaWYgJCh0YWcpID0gdmMKKyAgICB7CisgICAgICAgIGlmICQodmVyc2lvblsxXSkgPSA2CisgICAgICAgIHsKKyAgICAgICAgICAgICMgQ2FuY2VsIG1pbm9yIHZlcnNpb24uCisgICAgICAgICAgICB2ZXJzaW9uID0gNiA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAkKHZlcnNpb25bMV0pID0gNyAmJiAkKHZlcnNpb25bMl0pID0gMAorICAgICAgICB7CisgICAgICAgICAgICB2ZXJzaW9uID0gNyA7CisgICAgICAgIH0KKyAgICB9CisgICAgIyBPbiBpbnRlbCwgdmVyc2lvbiBpcyBub3QgYWRkZWQsIGJlY2F1c2UgaXQgZG9lcyBub3QgbWF0dGVyIGFuZCBpdCBpcyB0aGUKKyAgICAjIHZlcnNpb24gb2YgdmMgdXNlZCBhcyBiYWNrZW5kIHRoYXQgbWF0dGVycy4gSWRlYWxseSwgd2Ugc2hvdWxkIGVuY29kZSB0aGUKKyAgICAjIGJhY2tlbmQgdmVyc2lvbiBidXQgdGhhdCB3b3VsZCBicmVhayBjb21wYXRpYmlsaXR5IHdpdGggVjEuCisgICAgaWYgJCh0YWcpID0gaXcKKyAgICB7CisgICAgICAgIHZlcnNpb24gPSA7CisgICAgfQorCisgICAgIyBPbiBib3JsYW5kLCB2ZXJzaW9uIGlzIG5vdCBhZGRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFYxLgorICAgIGlmICQodGFnKSA9IGJjYgorICAgIHsKKyAgICAgICAgdmVyc2lvbiA9IDsKKyAgICB9CisKKyAgICB0YWcgKz0gJCh2ZXJzaW9uKSA7CisKKyAgICByZXR1cm4gJCh0YWc6Sj0pIDsKK30KKworCitsb2NhbCBydWxlIHRocmVhZGluZy10YWcgKCBuYW1lIDogdHlwZSA/IDogcHJvcGVydHktc2V0ICkKK3sKKyAgICBpZiA8dGhyZWFkaW5nPm11bHRpIGluIFsgJChwcm9wZXJ0eS1zZXQpLnJhdyBdCisgICAgeworICAgICAgICByZXR1cm4gbXQgOworICAgIH0KK30KKworCitsb2NhbCBydWxlIHJ1bnRpbWUtdGFnICggbmFtZSA6IHR5cGUgPyA6IHByb3BlcnR5LXNldCApCit7CisgICAgbG9jYWwgdGFnID0gOworCisgICAgbG9jYWwgcHJvcGVydGllcyA9IFsgJChwcm9wZXJ0eS1zZXQpLnJhdyBdIDsKKyAgICBpZiA8cnVudGltZS1saW5rPnN0YXRpYyBpbiAkKHByb3BlcnRpZXMpIHsgdGFnICs9IHMgOyB9CisKKyAgICAjIFRoaXMgaXMgYW4gdWdseSB0aGluZy4gSW4gVjEsIHRoZXJlIGlzIGNvZGUgdG8gYXV0b21hdGljYWxseSBkZXRlY3Qgd2hpY2gKKyAgICAjIHByb3BlcnRpZXMgYWZmZWN0IGEgdGFyZ2V0LiBTbywgaWYgPHJ1bnRpbWUtZGVidWdnaW5nPiBkb2VzIG5vdCBhZmZlY3QgZ2NjCisgICAgIyB0b29sc2V0LCB0aGUgdGFnIHJ1bGVzIHdpbGwgbm90IGV2ZW4gc2VlIDxydW50aW1lLWRlYnVnZ2luZz4uIFNpbWlsYXIKKyAgICAjIGZ1bmN0aW9uYWxpdHkgaW4gVjIgaXMgbm90IGltcGxlbWVudGVkIHlldCwgc28gd2UganVzdCBjaGVjayBmb3IgdG9vbHNldHMKKyAgICAjIGtub3duIHRvIGNhcmUgYWJvdXQgcnVudGltZSBkZWJ1Z2dpbmcuCisgICAgaWYgKCA8dG9vbHNldD5tc3ZjIGluICQocHJvcGVydGllcykgKSB8fAorICAgICAgICAoIDxzdGRsaWI+c3RscG9ydCBpbiAkKHByb3BlcnRpZXMpICkgfHwKKyAgICAgICAgKCA8dG9vbHNldC1pbnRlbDpwbGF0Zm9ybT53aW4gaW4gJChwcm9wZXJ0aWVzKSApCisgICAgeworICAgICAgICBpZiA8cnVudGltZS1kZWJ1Z2dpbmc+b24gaW4gJChwcm9wZXJ0aWVzKSB7IHRhZyArPSBnIDsgfQorICAgIH0KKworICAgIGlmIDxweXRob24tZGVidWdnaW5nPm9uIGluICQocHJvcGVydGllcykgeyB0YWcgKz0geSA7IH0KKyAgICBpZiA8dmFyaWFudD5kZWJ1ZyBpbiAkKHByb3BlcnRpZXMpIHsgdGFnICs9IGQgOyB9CisgICAgaWYgPHN0ZGxpYj5zdGxwb3J0IGluICQocHJvcGVydGllcykgeyB0YWcgKz0gcCA7IH0KKyAgICBpZiA8c3RkbGliLXN0bHBvcnQ6aW9zdHJlYW0+aG9zdGlvcyBpbiAkKHByb3BlcnRpZXMpIHsgdGFnICs9IG4gOyB9CisKKyAgICByZXR1cm4gJCh0YWc6Sj0pIDsKK30KKworCisjIENyZWF0ZSBhIHRhZyBmb3IgdGhlIFF0IGxpYnJhcnkgdmVyc2lvbgorIyAiPHF0PjQuNi4wIiB3aWxsIHJlc3VsdCBpbiB0YWcgInF0NDYwIgorbG9jYWwgcnVsZSBxdC10YWcgKCBuYW1lIDogdHlwZSA/IDogcHJvcGVydHktc2V0ICkKK3sKKyAgICBsb2NhbCB2ID0gWyBNQVRDSCAoWzAxMjM0NTY3ODldKylbLl0/KFswMTIzNDU2Nzg5XSopWy5dPyhbMDEyMzQ1Njc4OV0qKSA6CisgICAgICAgIFsgJChwcm9wZXJ0eS1zZXQpLmdldCA8cXQ+IF0gXSA7CisgICAgcmV0dXJuIHF0JCh2Oko9KSA7Cit9CisKKworIyBDcmVhdGUgYSB0YWcgZm9yIHRoZSBhZGRyZXNzLW1vZGVsCisjIDxhZGRyZXNzLW1vZGVsPjY0IHdpbGwgc2ltcGx5IGdlbmVyYXRlICI2NCIKK2xvY2FsIHJ1bGUgYWRkcmVzcy1tb2RlbC10YWcgKCBuYW1lIDogdHlwZSA/IDogcHJvcGVydHktc2V0ICkKK3sKKyAgICByZXR1cm4gWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxhZGRyZXNzLW1vZGVsPiBdIDsKK30KKworCitydWxlIF9fdGVzdF9fICggKQoreworICAgIGltcG9ydCBhc3NlcnQgOworCisgICAgbG9jYWwgc2F2ZS1vcyA9IFsgbW9kdWxlcy5wZWVrIG9zIDogLm5hbWUgXSA7CisKKyAgICBtb2R1bGVzLnBva2Ugb3MgOiAubmFtZSA6IExJTlVYIDsKKyAgICBhc3NlcnQucmVzdWx0ICJQQVRIPVwiZm9vOmJhcjpiYXpcIlxuZXhwb3J0IFBBVEhcbiIKKyAgICAgICAgOiBwYXRoLXZhcmlhYmxlLXNldHRpbmctY29tbWFuZCBQQVRIIDogZm9vIGJhciBiYXogOworICAgIGFzc2VydC5yZXN1bHQgIlBBVEg9XCJmb286YmFyOiRQQVRIXCJcbmV4cG9ydCBQQVRIXG4iCisgICAgICAgIDogcHJlcGVuZC1wYXRoLXZhcmlhYmxlLWNvbW1hbmQgUEFUSCA6IGZvbyBiYXIgOworCisgICAgbW9kdWxlcy5wb2tlIG9zIDogLm5hbWUgOiBOVCA7CisgICAgYXNzZXJ0LnJlc3VsdCAic2V0IFBBVEg9Zm9vO2JhcjtiYXpcbiIKKyAgICAgICAgOiBwYXRoLXZhcmlhYmxlLXNldHRpbmctY29tbWFuZCBQQVRIIDogZm9vIGJhciBiYXogOworICAgIGFzc2VydC5yZXN1bHQgInNldCBQQVRIPWZvbztiYXI7JVBBVEglXG4iCisgICAgICAgIDogcHJlcGVuZC1wYXRoLXZhcmlhYmxlLWNvbW1hbmQgUEFUSCA6IGZvbyBiYXIgOworCisgICAgbW9kdWxlcy5wb2tlIG9zIDogLm5hbWUgOiAkKHNhdmUtb3MpIDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY29tby1saW51eC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2NvbW8tbGludXguamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTU0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2NvbW8tbGludXguamFtCkBAIC0wLDAgKzEsMTAzIEBACisjIENvcHlyaWdodCAyMDA0LCAyMDA1LCAyMDA2IFZsYWRpbWlyIFBydXMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgVGhlIGZvbGxvd2luZyAjLy8gbGluZSB3aWxsIGJlIHVzZWQgYnkgdGhlIHJlZ3Jlc3Npb24gdGVzdCB0YWJsZSBnZW5lcmF0aW9uCisjIHByb2dyYW0gYXMgdGhlIGNvbHVtbiBoZWFkaW5nIGZvciBIVE1MIHRhYmxlcy4gTXVzdCBub3QgaW5jbHVkZSBhIHZlcnNpb24KKyMgbnVtYmVyLgorIy8vPGEgaHJlZj0iaHR0cDovL3d3dy5jb21lYXVjb21wdXRpbmcuY29tLyI+Q29tZWF1PGJyPkMrKzwvYT4KKworaW1wb3J0IHRvb2xzZXQgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IHRvb2xzZXQgOiBmbGFncyA7CitpbXBvcnQgY29tbW9uIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKKworaW1wb3J0IHVuaXggOworaW1wb3J0IGNvbW8gOworCitmZWF0dXJlLmV4dGVuZC1zdWJmZWF0dXJlIHRvb2xzZXQgY29tbyA6IHBsYXRmb3JtIDogbGludXggOworCit0b29sc2V0LmluaGVyaXQtZ2VuZXJhdG9ycyBjb21vLWxpbnV4CisgICAgIDx0b29sc2V0PmNvbW8gPHRvb2xzZXQtY29tbzpwbGF0Zm9ybT5saW51eCA6IHVuaXggOworZ2VuZXJhdG9ycy5vdmVycmlkZSBjb21vLWxpbnV4LnByZWJ1aWx0IDogYnVpbHRpbi5saWItZ2VuZXJhdG9yIDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgY29tby1saW51eC5zZWFyY2hlZC1saWItZ2VuZXJhdG9yIDogc2VhcmNoZWQtbGliLWdlbmVyYXRvciA7Cit0b29sc2V0LmluaGVyaXQtZmxhZ3MgY29tby1saW51eCA6IHVuaXggOwordG9vbHNldC5pbmhlcml0LXJ1bGVzIGNvbW8tbGludXggOiBnY2MgOworCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgY29tby1saW51eC5jb21waWxlLmMrKyA6IENQUCA6IE9CSgorICAgIDogPHRvb2xzZXQ+Y29tbyA8dG9vbHNldC1jb21vOnBsYXRmb3JtPmxpbnV4IDsKK2dlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBjb21vLWxpbnV4LmNvbXBpbGUuYyA6IEMgOiBPQkoKKyAgICA6IDx0b29sc2V0PmNvbW8gPHRvb2xzZXQtY29tbzpwbGF0Zm9ybT5saW51eCA7CisKKworcnVsZSBpbml0ICggdmVyc2lvbiA/IDogY29tbWFuZCAqIDogb3B0aW9ucyAqICkKK3sKKyAgICBsb2NhbCBjb25kaXRpb24gPSBbIGNvbW1vbi5jaGVjay1pbml0LXBhcmFtZXRlcnMgY29tby1saW51eAorICAgICAgICA6IHZlcnNpb24gJCh2ZXJzaW9uKSBdIDsKKworICAgIGNvbW1hbmQgPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kIGNvbW8tbGludXggOiBjb21vCisgICAgICAgIDogJChjb21tYW5kKSBdIDsKKworICAgIGNvbW1vbi5oYW5kbGUtb3B0aW9ucyBjb21vLWxpbnV4IDogJChjb25kaXRpb24pIDogJChjb21tYW5kKSA6ICQob3B0aW9ucykgOworfQorCisKK2ZsYWdzIGNvbW8tbGludXggQysrRkxBR1MgPGV4Y2VwdGlvbi1oYW5kbGluZz5vZmYgOiAtLW5vX2V4Y2VwdGlvbnMgOworZmxhZ3MgY29tby1saW51eCBDKytGTEFHUyA8ZXhjZXB0aW9uLWhhbmRsaW5nPm9uIDogLS1leGNlcHRpb25zIDsKKworZmxhZ3MgY29tby1saW51eCBDRkxBR1MgPGlubGluaW5nPm9mZiA6IC0tbm9faW5saW5pbmcgOworZmxhZ3MgY29tby1saW51eCBDRkxBR1MgPGlubGluaW5nPm9uIDxpbmxpbmluZz5mdWxsIDogLS1pbmxpbmluZyA7CisKK2ZsYWdzIGNvbW8tbGludXggQ0ZMQUdTIDxvcHRpbWl6YXRpb24+b2ZmIDogLU8wIDsKK2ZsYWdzIGNvbW8tbGludXggQ0ZMQUdTIDxvcHRpbWl6YXRpb24+c3BlZWQgOiAtTzMgOworZmxhZ3MgY29tby1saW51eCBDRkxBR1MgPG9wdGltaXphdGlvbj5zcGFjZSA6IC1PcyA7CisKK2ZsYWdzIGNvbW8tbGludXggQ0ZMQUdTIDxkZWJ1Zy1zeW1ib2xzPm9uIDogLWcgOworZmxhZ3MgY29tby1saW51eCBMSU5LRkxBR1MgPGRlYnVnLXN5bWJvbHM+b24gOiAtZyA7CisKK2ZsYWdzIGNvbW8tbGludXggRklORExJQlMgOiBtIDsKK2ZsYWdzIGNvbW8tbGludXggRklORExJQlMgOiBydCA7CisKK2ZsYWdzIGNvbW8tbGludXggQ0ZMQUdTIDxjZmxhZ3M+IDsKK2ZsYWdzIGNvbW8tbGludXggQysrRkxBR1MgPGN4eGZsYWdzPiA7CitmbGFncyBjb21vLWxpbnV4IERFRklORVMgPGRlZmluZT4gOworZmxhZ3MgY29tby1saW51eCBVTkRFRlMgPHVuZGVmPiA7CitmbGFncyBjb21vLWxpbnV4IEhEUlMgPGluY2x1ZGU+IDsKK2ZsYWdzIGNvbW8tbGludXggU1RESERSUyA8c3lzaW5jbHVkZT4gOworZmxhZ3MgY29tby1saW51eCBMSU5LRkxBR1MgPGxpbmtmbGFncz4gOworZmxhZ3MgY29tby1saW51eCBBUkZMQUdTIDxhcmZsYWdzPiA7CisKK2ZsYWdzIGNvbW8tbGludXgubGluayBMSUJSQVJJRVMgPGxpYnJhcnktZmlsZT4gOworZmxhZ3MgY29tby1saW51eC5saW5rIExJTktQQVRIIDxsaWJyYXJ5LXBhdGg+IDsKK2ZsYWdzIGNvbW8tbGludXgubGluayBGSU5ETElCUy1TVCA8ZmluZC1zdGF0aWMtbGlicmFyeT4gOworZmxhZ3MgY29tby1saW51eC5saW5rIEZJTkRMSUJTLVNBIDxmaW5kLXNoYXJlZC1saWJyYXJ5PiA7CisKK2ZsYWdzIGNvbW8tbGludXgubGluayBSUEFUSCA8ZGxsLXBhdGg+IDsKK2ZsYWdzIGNvbW8tbGludXgubGluayBSUEFUSF9MSU5LIDx4ZGxsLXBhdGg+IDsKKworCithY3Rpb25zIGxpbmsgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAkKENPTkZJR19DT01NQU5EKSAkKExJTktGTEFHUykgLW8gIiQoPFsxXSkiICIkKD4pIiAtTCIkKExJTktQQVRIKSIgLVdsLC1SJChTUEFDRSktV2wsIiQoUlBBVEgpIiAtV2wsLXJwYXRoLWxpbmskKFNQQUNFKS1XbCwiJChSUEFUSF9MSU5LKSIgICIkKExJQlJBUklFUykiICAiJChMSUJSQVJJRVMpIiAtbCQoRklORExJQlMtU0EpIC1sJChGSU5ETElCUy1TVCkgMj4mMQorfQorCithY3Rpb25zIGxpbmsuZGxsIGJpbmQgTElCUkFSSUVTCit7CisgICAgJChDT05GSUdfQ09NTUFORCkgJChMSU5LRkxBR1MpIC1zaGFyZWQgLW8gIiQoPFsxXSkiICIkKD4pIiAtTCIkKExJTktQQVRIKSIgLVdsLC1SJChTUEFDRSktV2wsIiQoUlBBVEgpIiAtV2wsLXJwYXRoLWxpbmskKFNQQUNFKS1XbCwiJChSUEFUSF9MSU5LKSIgIiQoTElCUkFSSUVTKSIgICIkKExJQlJBUklFUykiIC1sJChGSU5ETElCUy1TQSkgLWwkKEZJTkRMSUJTLVNUKSAyPiYxCit9CisKK2FjdGlvbnMgY29tcGlsZS5jCit7CisgICAgJChDT05GSUdfQ09NTUFORCkgLWMgLS1jOTkgLS1sb25nX2xvbmcgLVUkKFVOREVGUykgLUQkKERFRklORVMpICQoQ0ZMQUdTKSAtSSIkKEhEUlMpIiAtSSIkKFNUREhEUlMpIiAtbyAiJCg8KSIgIiQoPikiIDI+JjEKK30KKworYWN0aW9ucyBjb21waWxlLmMrKworeworICAgICQoQ09ORklHX0NPTU1BTkQpIC10dXNlZCAtYyAtLWxvbmdfbG9uZyAtVSQoVU5ERUZTKSAtRCQoREVGSU5FUykgJChDRkxBR1MpICQoQysrRkxBR1MpIC1JIiQoSERSUykiIC1JIiQoU1RESERSUykiICAtbyAiJCg8KSIgIiQoPikiIDI+JjEKK30KKworYWN0aW9ucyBhcmNoaXZlCit7CisgICAgYXIgcmN1ICQoPCkgJCg+KQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jb21vLXdpbi5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2NvbW8td2luLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjFhNzBkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jb21vLXdpbi5qYW0KQEAgLTAsMCArMSwxMTcgQEAKKyMgKEMpIENvcHlyaWdodCBEYXZpZCBBYnJhaGFtcyAyMDAxLgorIyAoQykgQ29weXJpZ2h0IE1ldGFDb21tdW5pY2F0aW9ucywgSW5jLiAyMDA0LgorCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQorIyBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgVGhlIGZvbGxvd2luZyAjLy8gbGluZSB3aWxsIGJlIHVzZWQgYnkgdGhlIHJlZ3Jlc3Npb24gdGVzdCB0YWJsZSBnZW5lcmF0aW9uCisjIHByb2dyYW0gYXMgdGhlIGNvbHVtbiBoZWFkaW5nIGZvciBIVE1MIHRhYmxlcy4gTXVzdCBub3QgaW5jbHVkZSBhIHZlcnNpb24KKyMgbnVtYmVyLgorIy8vPGEgaHJlZj0iaHR0cDovL3d3dy5jb21lYXVjb21wdXRpbmcuY29tLyI+Q29tZWF1PGJyPkMrKzwvYT4KKworaW1wb3J0IGNvbW1vbiA7CitpbXBvcnQgY29tbyA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgdG9vbHNldCA6IGZsYWdzIDsKKworZmVhdHVyZS5leHRlbmQtc3ViZmVhdHVyZSB0b29sc2V0IGNvbW8gOiBwbGF0Zm9ybSA6IHdpbiA7CisKKworIyBJbml0aWFsaXplcyB0aGUgQ29tZWF1IHRvb2xzZXQgZm9yIHdpbmRvd3MuIFRoZSBjb21tYW5kIGlzIHRoZSBjb21tYW5kIHdoaWNoCisjIGludm9rZXMgdGhlIGNvbXBpbGVyLiBZb3Ugc2hvdWxkIGVpdGhlciBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGUKKyMgQ09NT19YWFhfSU5DTFVERSB3aGVyZSBYWFggaXMgdGhlIHVzZWQgYmFja2VuZCAoYXMgZGVzY3JpYmVkIGluIHRoZQorIyBkb2N1bWVudGF0aW9uKSwgb3IgcGFzcyB0aGF0IGFzIHBhcnQgb2YgY29tbWFuZCwgZS5nOgorIworIyAgIHVzaW5nIGNvbW8td2luIDogNC4zIDogInNldCBDT01PX0JDQ19JTkNMVURFPUM6L2luY2x1ZGUgJiYiIGNvbW8uZXhlIDsKKyMKK3J1bGUgaW5pdCAoIHZlcnNpb24gPyA6IGNvbW1hbmQgKiA6IG9wdGlvbnMgKiApCit7CisgICAgbG9jYWwgY29uZGl0aW9uID0gWyAgY29tbW9uLmNoZWNrLWluaXQtcGFyYW1ldGVycyBjb21vLXdpbgorICAgICAgICA6IHZlcnNpb24gJCh2ZXJzaW9uKSBdIDsKKworICAgIGNvbW1hbmQgPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kIGNvbW8td2luIDogY29tby5leGUgOgorICAgICAgICAkKGNvbW1hbmQpIF0gOworCisgICAgY29tbW9uLmhhbmRsZS1vcHRpb25zIGNvbW8td2luIDogJChjb25kaXRpb24pIDogJChjb21tYW5kKSA6ICQob3B0aW9ucykgOworfQorCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgY29tby13aW4uY29tcGlsZS5jKysgOiBDUFAgOiBPQkoKKyAgICA6IDx0b29sc2V0PmNvbW8gPHRvb2xzZXQtY29tbzpwbGF0Zm9ybT53aW4gOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIGNvbW8td2luLmNvbXBpbGUuYyA6IEMgOiBPQkoKKyAgICA6IDx0b29sc2V0PmNvbW8gPHRvb2xzZXQtY29tbzpwbGF0Zm9ybT53aW4gOworCisKK2dlbmVyYXRvcnMucmVnaXN0ZXItbGlua2VyIGNvbW8td2luLmxpbmsKKyAgICA6IE9CSiBTRUFSQ0hFRF9MSUIgU1RBVElDX0xJQiBJTVBPUlRfTElCCisgICAgOiBFWEUKKyAgICA6IDx0b29sc2V0PmNvbW8gPHRvb2xzZXQtY29tbzpwbGF0Zm9ybT53aW4gOworCisjIE5vdGUgdGhhdCBzdGF0dXMgb2Ygc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0IGlzIG5vdCBjbGVhciwgc28gd2UgZG8gbm90IGRlZmluZQorIyB0aGUgbGluay5kbGwgZ2VuZXJhdG9yLgorZ2VuZXJhdG9ycy5yZWdpc3Rlci1hcmNoaXZlciBjb21vLXdpbi5hcmNoaXZlCisgICAgOiBPQkogOiBTVEFUSUNfTElCCisgICAgOiA8dG9vbHNldD5jb21vIDx0b29sc2V0LWNvbW86cGxhdGZvcm0+d2luIDsKKworCitmbGFncyBjb21vLXdpbiBDKytGTEFHUyA8ZXhjZXB0aW9uLWhhbmRsaW5nPm9mZiA6IC0tbm9fZXhjZXB0aW9ucyA7CitmbGFncyBjb21vLXdpbiBDKytGTEFHUyA8ZXhjZXB0aW9uLWhhbmRsaW5nPm9uIDogLS1leGNlcHRpb25zIDsKKworZmxhZ3MgY29tby13aW4gQ0ZMQUdTIDxpbmxpbmluZz5vZmYgOiAtLW5vX2lubGluaW5nIDsKK2ZsYWdzIGNvbW8td2luIENGTEFHUyA8aW5saW5pbmc+b24gPGlubGluaW5nPmZ1bGwgOiAtLWlubGluaW5nIDsKKworCisjIFRoZSBmb2xsb3dpbmcgc2VlbXMgdG8gYmUgVkMtc3BlY2lmaWMgb3B0aW9ucy4gQXQgbGVhc3QsIHdoZW4gSSB1bmNvbW1lbnQKKyMgdGhlbiwgQ29tZWF1IHdpdGggYmNjIGFzIGJhY2tlbmQgcmVwb3J0cyB0aGF0IGJjYzMyIGludm9jYXRpb24gZmFpbGVkLgorIworI2ZsYWdzIGNvbW8td2luIENGTEFHUyA8ZGVidWctc3ltYm9scz5vbiA6IC9aaSA7CisjZmxhZ3MgY29tby13aW4gQ0ZMQUdTIDxvcHRpbWl6YXRpb24+b2ZmIDogL09kIDsKKworCitmbGFncyBjb21vLXdpbiBDRkxBR1MgPGNmbGFncz4gOworZmxhZ3MgY29tby13aW4gQ0ZMQUdTIDogLURfV0lOMzIgOyAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBnZXQgdGhlIEJvb3N0IFdpbjMyIHBsYXRmb3JtIGNvbmZpZyBoZWFkZXIuCitmbGFncyBjb21vLXdpbiBDRkxBR1MgPHRocmVhZGluZz5tdWx0aSA6IC1EX01UIDsgICMgTWFrZSBzdXJlIHRoYXQgb3VyIGNvbmZpZyBrbm93cyB0aGF0IHRocmVhZGluZyBpcyBvbi4KK2ZsYWdzIGNvbW8td2luIEMrK0ZMQUdTIDxjeHhmbGFncz4gOworZmxhZ3MgY29tby13aW4gREVGSU5FUyA8ZGVmaW5lPiA7CitmbGFncyBjb21vLXdpbiBVTkRFRlMgPHVuZGVmPiA7CitmbGFncyBjb21vLXdpbiBIRFJTIDxpbmNsdWRlPiA7CitmbGFncyBjb21vLXdpbiBTWVNIRFJTIDxzeXNpbmNsdWRlPiA7CitmbGFncyBjb21vLXdpbiBMSU5LRkxBR1MgPGxpbmtmbGFncz4gOworZmxhZ3MgY29tby13aW4gQVJGTEFHUyA8YXJmbGFncz4gOworZmxhZ3MgY29tby13aW4gTk9fV0FSTiA8bm8td2Fybj4gOworCisjZmxhZ3MgY29tby13aW4gU1RESERSUyA6ICQoQ09NT19JTkNMVURFX1BBVEgpIDsKKyNmbGFncyBjb21vLXdpbiBTVERMSUJfUEFUSCA6ICQoQ09NT19TVERMSUJfUEFUSCkkKFNMQVNIKSA7CisKK2ZsYWdzIGNvbW8td2luIExJQlBBVEggPGxpYnJhcnktcGF0aD4gOworZmxhZ3MgY29tby13aW4gTElCUkFSSUVTIDxsaWJyYXJ5LWZpbGU+IDsKK2ZsYWdzIGNvbW8td2luIEZJTkRMSUJTIDxmaW5kLXNoYXJlZC1saWJyYXJ5PiA7CitmbGFncyBjb21vLXdpbiBGSU5ETElCUyA8ZmluZC1zdGF0aWMtbGlicmFyeT4gOworCitubCA9ICIKKyIgOworCisKKyMgRm9yIGNvbW8sIHdlIHJlcGVhdCBhbGwgbGlicmFyaWVzIHNvIHRoYXQgZGVwZW5kZW5jaWVzIGFyZSBhbHdheXMgcmVzb2x2ZWQuCisjCithY3Rpb25zIGxpbmsgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAkKENPTkZJR19DT01NQU5EKSAtLW5vX3ZlcnNpb24gLS1ub19wcmVsaW5rX3ZlcmJvc2UgJChMSU5LRkxBR1MpIC1vICIkKDxbMV06Uz0pIiBAIkAoJCg8WzFdOlcpLnJzcDpFPSQobmwpIiQoPikiKSIgIiQoTElCUkFSSUVTKSIgIiQoRklORExJQlM6Uz0ubGliKSIKK30KKworYWN0aW9ucyBjb21waWxlLmMKK3sKKyAgICAkKENPTkZJR19DT01NQU5EKSAtYyAtLWM5OSAtZTUgLS1ub192ZXJzaW9uIC0tZGlzcGxheV9lcnJvcl9udW1iZXIgLS1kaWFnX3N1cHByZXNzPTksMjEsMTYxLDc0OCw5NDAsOTYyIC1VJChVTkRFRlMpIC1EJChERUZJTkVTKSAkKFdBUk4pICQoQ0ZMQUdTKSAtSSIkKEhEUlMpIiAtSSIkKFNUREhEUlMpIiAtSSIkKFNZU0hEUlMpIiAtbyAiJCg8OkQ9KSIgIiQoPikiCit9CisKK2FjdGlvbnMgY29tcGlsZS5jKysKK3sKKyAgICAkKENPTkZJR19DT01NQU5EKSAtYyAtZTUgLS1ub192ZXJzaW9uIC0tbm9fcHJlbGlua192ZXJib3NlIC0tZGlzcGxheV9lcnJvcl9udW1iZXIgLS1sb25nX2xvbmcgLS1kaWFnX3N1cHByZXNzPTksMjEsMTYxLDc0OCw5NDAsOTYyIC0tZGlhZ19lcnJvcj00NjEgLURfX1NUTF9MT05HX0xPTkcgLVUkKFVOREVGUykgLUQkKERFRklORVMpICQoV0FSTikgJChDRkxBR1MpICQoQysrRkxBR1MpIC1JIiQoSERSUykiIC1JIiQoU1RESERSUykiIC1JIiQoU1lTSERSUykiIC1vICIkKDwpIiAiJCg+KSIKK30KKworYWN0aW9ucyBhcmNoaXZlCit7CisgICAgJChDT05GSUdfQ09NTUFORCkgLS1ub192ZXJzaW9uIC0tbm9fcHJlbGlua192ZXJib3NlIC0tcHJlbGlua19vYmplY3QgQCJAKCQoPFsxXTpXKS5yc3A6RT0kKG5sKSIkKD4pIikiCisgICAgbGliICQoQVJGTEFHUykgL25vbG9nbyAvb3V0OiIkKDw6Uz0ubGliKSIgQCJAKCQoPFsxXTpXKS5yc3A6RT0kKG5sKSIkKD4pIikiCit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2NvbW8uamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jb21vLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGEwNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jb21vLmphbQpAQCAtMCwwICsxLDI5IEBACisjIENvcHlyaWdodCBWbGFkaW1pciBQcnVzIDIwMDQuCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQKKyMgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgVGhpcyBpcyBhIGdlbmVyaWMgJ2NvbW8nIHRvb2xzZXQuIERlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzeXN0ZW0sIGl0CisjIGZvcndhcmRzIGVpdGhlciB0byAnY29tby1saW51eCcgb3IgJ2NvbW8td2luJyBtb2R1bGVzLgorCitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgb3MgOworaW1wb3J0IHRvb2xzZXQgOworCitmZWF0dXJlLmV4dGVuZCB0b29sc2V0IDogY29tbyA7CitmZWF0dXJlLnN1YmZlYXR1cmUgdG9vbHNldCBjb21vIDogcGxhdGZvcm0gOiA6IHByb3BhZ2F0ZWQgbGluay1pbmNvbXBhdGlibGUgOworCitydWxlIGluaXQgKCAqIDogKiApCit7CisgICAgaWYgWyBvcy5uYW1lIF0gPSBMSU5VWAorICAgIHsKKyAgICAgICAgdG9vbHNldC51c2luZyBjb21vLWxpbnV4IDogCisgICAgICAgICAgJCgxKSA6ICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkgOiAkKDkpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG9vbHNldC51c2luZyBjb21vLXdpbiA6CisgICAgICAgICAgJCgxKSA6ICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkgOiAkKDkpIDsKKworICAgIH0gICAgICAgIAorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jb252ZXJ0LmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY29udmVydC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxZDcwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY29udmVydC5qYW0KQEAgLTAsMCArMSw2MiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDkgVmxhZGltaXIgUHJ1cworIworIyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlCisjIExpY2Vuc2UgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yCisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBJbXBsZW1lbnRzICdjb252ZXJ0JyB0YXJnZXQgdGhhdCB0YWtlcyBhIGJ1bmNoIG9mIHNvdXJjZSBhbmQKKyMgdHJpZXMgdG8gY29udmVydCBlYWNoIG9uZSB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisjCisjIEZvciBleGFtcGxlOgorIworIyAgIGNvbnZlcnQgb2JqZWN0cyBvYmogOiBhLmNwcCBiLmNwcCA7CisjCisKK2ltcG9ydCB0YXJnZXRzIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBwcm9qZWN0IDsKK2ltcG9ydCB0eXBlIDsKK2ltcG9ydCAiY2xhc3MiIDogbmV3IDsKKworY2xhc3MgY29udmVydC10YXJnZXQtY2xhc3MgOiB0eXBlZC10YXJnZXQKK3sKKyAgICBydWxlIF9faW5pdF9fICggbmFtZSA6IHByb2plY3QgOiB0eXBlCisgICAgOiBzb3VyY2VzICogOiByZXF1aXJlbWVudHMgKiA6IGRlZmF1bHQtYnVpbGQgKiA6IHVzYWdlLXJlcXVpcmVtZW50cyAqICkKKyAgICB7CisgICAgICAgIHR5cGVkLXRhcmdldC5fX2luaXRfXyAkKG5hbWUpIDogJChwcm9qZWN0KSA6ICQodHlwZSkKKyAgICAgICAgICA6ICQoc291cmNlcykgOiAkKHJlcXVpcmVtZW50cykgOiAkKGRlZmF1bHQtYnVpbGQpIDogJCh1c2FnZS1yZXF1aXJlbWVudHMpIDsKKyAgICB9CisKKyAgICBydWxlIGNvbnN0cnVjdCAoIG5hbWUgOiBzb3VyY2UtdGFyZ2V0cyAqIDogcHJvcGVydHktc2V0ICkKKyAgICB7CisgICAgICAgIGxvY2FsIHIgPSBbIGdlbmVyYXRvcnMuY29uc3RydWN0ICQoc2VsZi5wcm9qZWN0KSA6ICQoc2VsZi50eXBlKQorICAgICAgICAgIDogWyBwcm9wZXJ0eS1zZXQuY3JlYXRlIFsgJChwcm9wZXJ0eS1zZXQpLnJhdyBdICMgWyBmZWF0dXJlLmV4cGFuZAorICAgICAgICAgICAgICA8bWFpbi10YXJnZXQtdHlwZT4kKHNlbGYudHlwZSkgXQorICAgICAgICAgICMgXQorICAgICAgICAgICAgOiAkKHNvdXJjZS10YXJnZXRzKSBdIDsKKyAgICAgICAgaWYgISAkKHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciAidW5hYmxlIHRvIGNvbnN0cnVjdCIgWyBmdWxsLW5hbWUgXSA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJChyKSA7CisgICAgfQorCit9CisKK3J1bGUgY29udmVydCAoIG5hbWUgdHlwZSA6IHNvdXJjZXMgKiA6IHJlcXVpcmVtZW50cyAqIDogZGVmYXVsdC1idWlsZCAqCisgICAgOiB1c2FnZS1yZXF1aXJlbWVudHMgKiApCit7CisgICAgbG9jYWwgcHJvamVjdCA9IFsgcHJvamVjdC5jdXJyZW50IF0gOworCisgICAgIyBUaGlzIGlzIGEgY2lyY3VsYXIgbW9kdWxlIGRlcGVuZGVuY3ksIHNvIGl0IG11c3QgYmUgaW1wb3J0ZWQgaGVyZQorICAgIG1vZHVsZXMuaW1wb3J0IHRhcmdldHMgOworICAgIHRhcmdldHMubWFpbi10YXJnZXQtYWx0ZXJuYXRpdmUKKyAgICAgIFsgbmV3IGNvbnZlcnQtdGFyZ2V0LWNsYXNzICQobmFtZSkgOiAkKHByb2plY3QpIDogWyB0eXBlLnR5cGUtZnJvbS1ydWxlLW5hbWUgJCh0eXBlKSBdCisgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LXNvdXJjZXMgJChzb3VyY2VzKSA6ICQobmFtZSkgXQorICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1yZXF1aXJlbWVudHMgJChyZXF1aXJlbWVudHMpIDogJChwcm9qZWN0KSBdCisgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LWRlZmF1bHQtYnVpbGQgJChkZWZhdWx0LWJ1aWxkKSA6ICQocHJvamVjdCkgXQorICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC11c2FnZS1yZXF1aXJlbWVudHMgJCh1c2FnZS1yZXF1aXJlbWVudHMpIDogJChwcm9qZWN0KSBdCisgICAgICBdIDsKK30KK0lNUE9SVCAkKF9fbmFtZV9fKSA6IGNvbnZlcnQgOiA6IGNvbnZlcnQgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jcmF5LmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY3JheS5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3ZmUyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY3JheS5qYW0KQEAgLTAsMCArMSwxMTUgQEAKKyMgQ29weXJpZ2h0IDIwMDEgRGF2aWQgQWJyYWhhbXMuCisjIENvcHlyaWdodCAyMDA0LCAyMDA1IE1hcmt1cyBTY2hvZXBmbGluLgorIyBDb3B5cmlnaHQgMjAxMSwgSm9obiBNYWRkb2NrCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjCisjIENyYXkgQysrIENvbXBpbGVyCisjIFNlZSBodHRwOi8vZG9jcy5jcmF5LmNvbS9ib29rcy9TLTIxNzktNTAvaHRtbC1TLTIxNzktNTAvUy0yMTc5LTUwLXRvYy5odG1sCisjCisKK2ltcG9ydCBmZWF0dXJlIGdlbmVyYXRvcnMgY29tbW9uIDsKK2ltcG9ydCB0b29sc2V0IDogZmxhZ3MgOworCitmZWF0dXJlLmV4dGVuZCB0b29sc2V0IDogY3JheSA7CisKKyMgSW5oZXJpdCBmcm9tIFVuaXggdG9vbHNldCB0byBnZXQgbGlicmFyeSBvcmRlcmluZyBtYWdpYy4KK3Rvb2xzZXQuaW5oZXJpdCAgY3JheSA6IHVuaXggOworCitnZW5lcmF0b3JzLm92ZXJyaWRlIGNyYXkucHJlYnVpbHQgOiBidWlsdGluLmxpYi1nZW5lcmF0b3IgOworZ2VuZXJhdG9ycy5vdmVycmlkZSBjcmF5LnByZWJ1aWx0IDogYnVpbHRpbi5wcmVidWlsdCA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIGNyYXkuc2VhcmNoZWQtbGliLWdlbmVyYXRvciA6IHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOworCisKK3J1bGUgaW5pdCAoIHZlcnNpb24gPyA6IGNvbW1hbmQgKiA6IG9wdGlvbnMgKiApCit7CisgICAgbG9jYWwgY29uZGl0aW9uID0gWyBjb21tb24uY2hlY2staW5pdC1wYXJhbWV0ZXJzIGNyYXkgOiB2ZXJzaW9uICQodmVyc2lvbikgXSA7CisgICAgCisgICAgbG9jYWwgY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgY3JheSA6IENDIDogJChjb21tYW5kKSBdIDsKKyAgICAKKyAgICBpZiAkKGNvbW1hbmQpCisgICAgeworICAgICAgICBsb2NhbCByb290ID0gWyBjb21tb24uZ2V0LWFic29sdXRlLXRvb2wtcGF0aCAkKGNvbW1hbmRbLTFdKSBdIDsKKworICAgICAgICBpZiAkKHJvb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsYWdzIGNyYXkgLnJvb3QgJChjb25kaXRpb24pIDogIlwiJChyb290KVwiLyIgOworICAgICAgICB9ICAgICAgICAKKyAgICB9ICAgICAgCisgICAgIyBJZiB3ZSBjYW4ndCBmaW5kICdDQycgYW55d2F5LCBhdCBsZWFzdCBzaG93ICdDQycgaW4gdGhlIGNvbW1hbmRzCisgICAgY29tbWFuZCA/PSBDQyA7CisgICAgICAgIAorICAgIGNvbW1vbi5oYW5kbGUtb3B0aW9ucyBjcmF5IDogJChjb25kaXRpb24pIDogJChjb21tYW5kKSA6ICQob3B0aW9ucykgOyAgICAgICAgICAgICAgIAorfQorCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgY3JheS5jb21waWxlLmMrKyA6IENQUCA6IE9CSiA6IDx0b29sc2V0PmNyYXkgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIGNyYXkuY29tcGlsZS5jIDogQyA6IE9CSiA6IDx0b29sc2V0PmNyYXkgOworCisKKworIyBObyBzdGF0aWMgbGlua2luZyBhcyBmYXIgYXMgSSBjYW4gdGVsbC4KKyMgZmxhZ3MgY3h4IExJTktGTEFHUyA8cnVudGltZS1saW5rPnN0YXRpYyA6IC1ic3RhdGljIDsKK2ZsYWdzIGNyYXkuY29tcGlsZSBPUFRJT05TIDxkZWJ1Zy1zeW1ib2xzPm9uIDogLUduIDsKK2ZsYWdzIGNyYXkubGluayBPUFRJT05TIDxkZWJ1Zy1zeW1ib2xzPm9uIDogLUduIDsKKworZmxhZ3MgY3JheS5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5vZmYgOiAtTzAgOworZmxhZ3MgY3JheS5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGVlZCA6IC1PMyA7CitmbGFncyBjcmF5LmNvbXBpbGUgT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwYWNlIDogLU8xIDsKKworZmxhZ3MgY3JheS5jb21waWxlIE9QVElPTlMgPGNmbGFncz4gOworZmxhZ3MgY3JheS5jb21waWxlLmMrKyBPUFRJT05TIDxjeHhmbGFncz4gOworZmxhZ3MgY3JheS5jb21waWxlIERFRklORVMgPGRlZmluZT4gOworZmxhZ3MgY3JheS5jb21waWxlIElOQ0xVREVTIDxpbmNsdWRlPiA7CitmbGFncyBjcmF5LmxpbmsgT1BUSU9OUyA8bGlua2ZsYWdzPiA7CisKK2ZsYWdzIGNyYXkuY29tcGlsZSBPUFRJT05TIDxsaW5rPnNoYXJlZCA6IC1mUElDIDsKK2ZsYWdzIGNyYXkubGluayBPUFRJT05TIDxsaW5rPnNoYXJlZCA6IC1mUElDIDsKKworZmxhZ3MgY3JheS5saW5rIExJQlBBVEggPGxpYnJhcnktcGF0aD4gOworZmxhZ3MgY3JheS5saW5rIExJQlJBUklFUyA8bGlicmFyeS1maWxlPiA7CitmbGFncyBjcmF5LmxpbmsgRklORExJQlMtU1QgPGZpbmQtc3RhdGljLWxpYnJhcnk+IDsKK2ZsYWdzIGNyYXkubGluayBGSU5ETElCUy1TQSA8ZmluZC1zaGFyZWQtbGlicmFyeT4gOworCithY3Rpb25zIGxpbmsgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAkKENPTkZJR19DT01NQU5EKSAkKE9QVElPTlMpIC1vICIkKDwpIiAtTCQoTElCUEFUSCkgIiQoPikiICIkKExJQlJBUklFUykiIC1sJChGSU5ETElCUy1TVCkgLWwkKEZJTkRMSUJTLVNBKQorfQorCisjIFdoZW4gY3JlYXRpbmcgZHluYW1pYyBsaWJyYXJpZXMsIHdlIGRvbid0IHdhbnQgdG8gYmUgd2FybmVkIGFib3V0IHVucmVzb2x2ZWQKKyMgc3ltYm9scywgdGhlcmVmb3JlIGFsbCB1bnJlc29sdmVkIHN5bWJvbHMgYXJlIG1hcmtlZCBhcyBleHBlY3RlZCBieQorIyAnLWV4cGVjdF91bnJlc29sdmVkIConLiBUaGlzIGFsc28gbWlycm9ycyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBHTlUgdG9vbAorIyBjaGFpbi4KKworYWN0aW9ucyBsaW5rLmRsbCBiaW5kIExJQlJBUklFUworeworICAgICQoQ09ORklHX0NPTU1BTkQpIC1zaGFyZWQgJChPUFRJT05TKSAtbyAiJCg8WzFdKSIgLUwkKExJQlBBVEgpICAiJCg+KSIgIiQoTElCUkFSSUVTKSIgLWwkKEZJTkRMSUJTLVNUKSAtbCQoRklORExJQlMtU0EpCit9CisKKworIyBOb3RlOiBSZWxheGVkIEFOU0kgbW9kZSAoLXN0ZCkgaXMgdXNlZCBmb3IgY29tcGlsYXRpb24gYmVjYXVzZSBpbiBzdHJpY3QgQU5TSQorIyBDODkgbW9kZSAoLXN0ZDEpIHRoZSBjb21waWxlciBkb2Vzbid0IGFjY2VwdCBDKysgY29tbWVudHMgaW4gQyBmaWxlcy4gQXMgLXN0ZAorIyBpcyB0aGUgZGVmYXVsdCwgbm8gc3BlY2lhbCBmbGFnIGlzIG5lZWRlZC4KK2FjdGlvbnMgY29tcGlsZS5jCit7CisgICAgJCgucm9vdDpFPSljYyAtYyAkKE9QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLW8gIiQoPCkiICIkKD4pIgorfQorCisjIE5vdGU6IFRoZSBjb21waWxlciBpcyBmb3JjZWQgdG8gY29tcGlsZSB0aGUgZmlsZXMgYXMgQysrICgteCBjeHgpIGJlY2F1c2UKKyMgb3RoZXJ3aXNlIGl0IHdpbGwgc2lsZW50bHkgaWdub3JlIGZpbGVzIHdpdGggbm8gZmlsZSBleHRlbnNpb24uCisjCisjIE5vdGU6IFdlIGRlbGliZXJhdGVseSBkb24ndCBzdXBwcmVzcyBhbnkgd2FybmluZ3Mgb24gdGhlIGNvbXBpbGVyIGNvbW1hbmQKKyMgbGluZSwgdGhlIHVzZXIgY2FuIGFsd2F5cyBkbyB0aGlzIGluIGEgY3VzdG9taXplZCB0b29sc2V0IGxhdGVyIG9uLgorCithY3Rpb25zIGNvbXBpbGUuYysrCit7CisgICAgJChDT05GSUdfQ09NTUFORCkgLWMgLWggZ251ICQoT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtbyAiJCg8KSIgIiQoPikiCit9CisKKyMgQWx3YXlzIGNyZWF0ZSBhcmNoaXZlIGZyb20gc2NyYXRjaC4gU2VlIHRoZSBnY2MgdG9vbGV0IGZvciByYXRpb25hbGUuCitSTSA9IFsgY29tbW9uLnJtLWNvbW1hbmQgXSA7CithY3Rpb25zIHRvZ2V0aGVyIHBpZWNlbWVhbCBhcmNoaXZlCit7CisgICQoUk0pICIkKDwpIgorICBhciByYyAkKDwpICQoPikKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY3ctY29uZmlnLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY3ctY29uZmlnLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjExYjdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jdy1jb25maWcuamFtCkBAIC0wLDAgKzEsMzQgQEAKKyN+IENvcHlyaWdodCAyMDA1IFJlbmUgUml2ZXJhLgorI34gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorI34gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIEF1dG9tYXRpYyBjb25maWd1cmF0aW9uIGZvciBDb2RlV2FycmlvciB0b29sc2V0LiBUbyB1c2UsIGp1c3QgaW1wb3J0IHRoaXMgbW9kdWxlLgorCitpbXBvcnQgb3MgOworaW1wb3J0IHRvb2xzZXQgOiB1c2luZyA7CisKK2lmIFsgb3MubmFtZSBdID0gTlQKK3sKKyAgICBmb3IgbG9jYWwgUiBpbiA5IDggNworICAgIHsKKyAgICAgICAgbG9jYWwgY3ctcGF0aCA9IFsgVzMyX0dFVFJFRworICAgICAgICAgICAgIkhLRVlfTE9DQUxfTUFDSElORVxcU09GVFdBUkVcXE1ldHJvd2Vya3NcXENvZGVXYXJyaW9yXFxQcm9kdWN0IFZlcnNpb25zXFxDb2RlV2FycmlvciBmb3IgV2luZG93cyBSJChSKSIKKyAgICAgICAgICAgIDogIlBBVEgiIF0gOworICAgICAgICBsb2NhbCBjdy12ZXJzaW9uID0gWyBXMzJfR0VUUkVHCisgICAgICAgICAgICAiSEtFWV9MT0NBTF9NQUNISU5FXFxTT0ZUV0FSRVxcTWV0cm93ZXJrc1xcQ29kZVdhcnJpb3JcXFByb2R1Y3QgVmVyc2lvbnNcXENvZGVXYXJyaW9yIGZvciBXaW5kb3dzIFIkKFIpIgorICAgICAgICAgICAgOiAiVkVSU0lPTiIgXSA7CisgICAgICAgIGN3LXBhdGggPz0gWyBXMzJfR0VUUkVHCisgICAgICAgICAgICAiSEtFWV9MT0NBTF9NQUNISU5FXFxTT0ZUV0FSRVxcTWV0cm93ZXJrc1xcQ29kZVdhcnJpb3IgZm9yIFdpbmRvd3NcXCQoUikuMCIKKyAgICAgICAgICAgIDogIlBBVEgiIF0gOworICAgICAgICBjdy12ZXJzaW9uID89ICQoUikuMCA7CisgICAgICAgIAorICAgICAgICBpZiAkKGN3LXBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIC0tZGVidWctY29uZmlndXJhdGlvbiBpbiBbIG1vZHVsZXMucGVlayA6IEFSR1YgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIm5vdGljZToiIHVzaW5nIGN3ICI6IiAkKGN3LXZlcnNpb24pICI6IiAiJChjdy1wYXRoKVxcT3RoZXIgTWV0cm93ZXJrcyBUb29sc1xcQ29tbWFuZCBMaW5lIFRvb2xzXFxtd2NjLmV4ZSIgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXNpbmcgY3cgOiAkKGN3LXZlcnNpb24pIDogIiQoY3ctcGF0aClcXE90aGVyIE1ldHJvd2Vya3MgVG9vbHNcXENvbW1hbmQgTGluZSBUb29sc1xcbXdjYy5leGUiIDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY3cuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9jdy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjYmZlYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvY3cuamFtCkBAIC0wLDAgKzEsMjQ2IEBACisjIENvcHlyaWdodCAoQykgUmVlY2UgSCBEdW5uIDIwMDQKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBiYXNlZCBvbiB0aGUgbXN2Yy5qYW0gdG9vbHNldAorCitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IG9zIDsKK2ltcG9ydCB0eXBlIDsKK2ltcG9ydCB0b29sc2V0IDogZmxhZ3MgOworaW1wb3J0IGVycm9ycyA6IGVycm9yIDsKK2ltcG9ydCBmZWF0dXJlIDogZmVhdHVyZSBnZXQtdmFsdWVzIDsKK2ltcG9ydCBwYXRoIDsKK2ltcG9ydCBzZXF1ZW5jZSA6IHVuaXF1ZSA7CitpbXBvcnQgY29tbW9uIDsKKworaWYgWyBNQVRDSCAoLS1kZWJ1Zy1jb25maWd1cmF0aW9uKSA6IFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIF0KK3sKKyAgIC5kZWJ1Zy1jb25maWd1cmF0aW9uID0gdHJ1ZSA7Cit9CisKK2ZlYXR1cmUuZXh0ZW5kIHRvb2xzZXQgOiBjdyA7CisKK3Rvb2xzZXQuYWRkLXJlcXVpcmVtZW50cyA8dG9vbHNldD5jdyw8cnVudGltZS1saW5rPnNoYXJlZDo8dGhyZWFkaW5nPm11bHRpIDsKKworbmwgPSAiCisiIDsKKworcnVsZSBpbml0ICggdmVyc2lvbiA/IDogY29tbWFuZCAqIDogb3B0aW9ucyAqICkKK3sKKyAgICMgVE9ETzogZml4IHRoZSAkKGNvbW1hbmRbMV0pID0gJChjb21waWxlcikgaXNzdWUKKyAgICAKKyAgICBzZXR1cCA9IFsgZ2V0LXZhbHVlcyA8c2V0dXA+IDogJChvcHRpb25zKSBdIDsKKyAgICBzZXR1cCAgICA/PSBjd2Vudi5iYXQgOworICAgIGNvbXBpbGVyID0gWyBnZXQtdmFsdWVzIDxjb21waWxlcj4gOiAkKG9wdGlvbnMpIF0gOworICAgIGNvbXBpbGVyID89IG13Y2MgOworICAgIGxpbmtlciA9IFsgZ2V0LXZhbHVlcyA8bGlua2VyPiA6ICQob3B0aW9ucykgXSA7CisgICAgbGlua2VyICAgPz0gbXdsZCA7CisKKyAgICBsb2NhbCBjb25kaXRpb24gPSBbIGNvbW1vbi5jaGVjay1pbml0LXBhcmFtZXRlcnMgY3cgOgorICAgICAgICB2ZXJzaW9uICQodmVyc2lvbikgXSA7CisKKyAgICBjb21tYW5kID0gWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBjdyA6IG13Y2MuZXhlIDogJChjb21tYW5kKSA6CisgICAgICAgIFsgZGVmYXVsdC1wYXRocyAkKHZlcnNpb24pIF0gXSA7CisgICAgCisgICAgY29tbW9uLmhhbmRsZS1vcHRpb25zIGN3IDogJChjb25kaXRpb24pIDogJChjb21tYW5kKSA6ICQob3B0aW9ucykgOworCisgICAgbG9jYWwgcm9vdCA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxyb290PiA6ICQob3B0aW9ucykgXSA7ICAgIAorICAgIGlmICQoY29tbWFuZCkKKyAgICB7CisgICAgICAgIGNvbW1hbmQgPSBbIGNvbW1vbi5nZXQtYWJzb2x1dGUtdG9vbC1wYXRoICQoY29tbWFuZFstMV0pIF0gOworICAgIH0KKyAgICBsb2NhbCB0b29sLXJvb3QgPSAkKGNvbW1hbmQpIDsKKworICAgIHNldHVwID0gJCh0b29sLXJvb3QpXFwkKHNldHVwKSA7CisKKyAgICMgbWFwIHRoZSBiYXRjaCBmaWxlIGluIHNldHVwIHNvIGl0IGNhbiBiZSBleGVjdXRlZAorCisgICAgb3RoZXItdG9vbHMgPSAkKHRvb2wtcm9vdDpEKSA7CisgICAgcm9vdCA/PSAkKG90aGVyLXRvb2xzOkQpIDsKKyAgICAKKyAgICBmbGFncyBjdy5saW5rIFJVTl9QQVRIICQoY29uZGl0aW9uKSA6IAorICAgICAgICAiJChyb290KVxcV2luMzIteDg2IFN1cHBvcnRcXExpYnJhcmllc1xcUnVudGltZSIKKyAgICAgICAgIiQocm9vdClcXFdpbjMyLXg4NiBTdXBwb3J0XFxMaWJyYXJpZXNcXFJ1bnRpbWVcXExpYnNcXE1TTF9BbGwtRExMcyIgOyAgICAgIAorICAgIAorICAgIHNldHVwID0gInNldCBcIkNXRk9MREVSPSIkKHJvb3QpIlwiICYmIGNhbGwgXCIiJChzZXR1cCkiXCIgPiBudWwgIiA7CisKKyAgIGlmIFsgb3MubmFtZSBdID0gTlQKKyAgIHsKKyAgICAgIHNldHVwID0gJChzZXR1cCkiCisiIDsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHNldHVwID0gImNtZCAvUyAvQyAiJChzZXR1cCkiIFwiJiZcIiAiIDsKKyAgIH0KKworICAgIyBiaW5kIHRoZSBzZXR1cCBjb21tYW5kIHRvIHRoZSB0b29sIHNvIGl0IGNhbiBiZSBleGVjdXRlZCBiZWZvcmUgdGhlCisgICAjIGNvbW1hbmQKKworICAgbG9jYWwgcHJlZml4ID0gJChzZXR1cCkgOworCisgICBmbGFncyBjdy5jb21waWxlIC5DQyAkKGNvbmRpdGlvbikgOiAkKHByZWZpeCkkKGNvbXBpbGVyKSA7CisgICBmbGFncyBjdy5saW5rIC5MRCAkKGNvbmRpdGlvbikgOiAkKHByZWZpeCkkKGxpbmtlcikgOworICAgZmxhZ3MgY3cuYXJjaGl2ZSAuTEQgJChjb25kaXRpb24pIDogJChwcmVmaXgpJChsaW5rZXIpIDsKKworICAgIGlmIFsgTUFUQ0ggXihbODldXFwuKSA6ICQodmVyc2lvbikgXSAgIAorICAgIHsKKyAgICAgICAgaWYgWyBvcy5uYW1lIF0gPSBOVAorICAgICAgICB7CisgICAgICAgICMgVGhlIHJ1bnRpbWUgbGlicmFyaWVzCisgICAgICAgIGZsYWdzIGN3LmNvbXBpbGUgQ0ZMQUdTIDxydW50aW1lLWxpbms+c3RhdGljLzx0aHJlYWRpbmc+c2luZ2xlLzxydW50aW1lLWRlYnVnZ2luZz5vZmYgOiAtcnVudGltZSBzcyA7CisgICAgICAgIGZsYWdzIGN3LmNvbXBpbGUgQ0ZMQUdTIDxydW50aW1lLWxpbms+c3RhdGljLzx0aHJlYWRpbmc+c2luZ2xlLzxydW50aW1lLWRlYnVnZ2luZz5vbiA6IC1ydW50aW1lIHNzZCA7CisgICAgICAgIAorICAgICAgICBmbGFncyBjdy5jb21waWxlIENGTEFHUyA8cnVudGltZS1saW5rPnN0YXRpYy88dGhyZWFkaW5nPm11bHRpLzxydW50aW1lLWRlYnVnZ2luZz5vZmYgOiAtcnVudGltZSBzbSA7CisgICAgICAgIGZsYWdzIGN3LmNvbXBpbGUgQ0ZMQUdTIDxydW50aW1lLWxpbms+c3RhdGljLzx0aHJlYWRpbmc+bXVsdGkvPHJ1bnRpbWUtZGVidWdnaW5nPm9uIDogLXJ1bnRpbWUgc21kIDsKKyAgICAgICAgCisgICAgICAgIGZsYWdzIGN3LmNvbXBpbGUgQ0ZMQUdTIDxydW50aW1lLWxpbms+c2hhcmVkLzxydW50aW1lLWRlYnVnZ2luZz5vZmYgOiAtcnVudGltZSBkbSA7CisgICAgICAgIGZsYWdzIGN3LmNvbXBpbGUgQ0ZMQUdTIDxydW50aW1lLWxpbms+c2hhcmVkLzxydW50aW1lLWRlYnVnZ2luZz5vbiA6IC1ydW50aW1lIGRtZCA7CisgICAgICAgIH0gICAgICAgIAorICAgIH0gICAgCit9CisKKworbG9jYWwgcnVsZSBkZWZhdWx0LXBhdGhzICggdmVyc2lvbiA/ICkgICMgRklYTUUKK3sKKyAgIGxvY2FsIHBvc3NpYmxlLXBhdGhzIDsKKyAgIGxvY2FsIFByb2dyYW1GaWxlcyA9IFsgY29tbW9uLmdldC1wcm9ncmFtLWZpbGVzLWRpciBdIDsKKworICAgIyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgY3c4IGFuZCBjdzkgZGV0ZWN0aW9uCisKKyAgIGxvY2FsIHZlcnNpb24tNi1wYXRoID0gJChQcm9ncmFtRmlsZXMpIlxcTWV0cm93ZXJrc1xcQ29kZVdhcnJpb3IiIDsKKyAgIHBvc3NpYmxlLXBhdGhzICs9ICQodmVyc2lvbi02LXBhdGgpIDsKKworICAgIyBwZXJmb3JtIHBvc3QtcHJvY2Vzc2luZworCisgICBwb3NzaWJsZS1wYXRocworICAgICAgPSAkKHBvc3NpYmxlLXBhdGhzKSJcXE90aGVyIE1ldHJvd2Vya3MgVG9vbHNcXENvbW1hbmQgTGluZSBUb29scyIgOworCisgICBwb3NzaWJsZS1wYXRocyArPSBbIG1vZHVsZXMucGVlayA6IFBBVEggUGF0aCBwYXRoIF0gOworCisgICByZXR1cm4gJChwb3NzaWJsZS1wYXRocykgOworfQorCisKKworCisjIyBkZWNsYXJlIGdlbmVyYXRvcnMKKworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIGN3LmNvbXBpbGUuYysrIDogQ1BQIDogT0JKIDogPHRvb2xzZXQ+Y3cgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIGN3LmNvbXBpbGUuYyA6IEMgOiBPQkogOiA8dG9vbHNldD5jdyA7CisKK2dlbmVyYXRvcnMucmVnaXN0ZXItbGlua2VyIGN3LmxpbmsKKyAgIDogT0JKIFNFQVJDSEVEX0xJQiBTVEFUSUNfTElCIElNUE9SVF9MSUIKKyAgIDogRVhFCisgICA6IDx0b29sc2V0PmN3CisgICA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLWxpbmtlciBjdy5saW5rLmRsbAorICAgOiBPQkogU0VBUkNIRURfTElCIFNUQVRJQ19MSUIgSU1QT1JUX0xJQgorICAgOiBTSEFSRURfTElCIElNUE9SVF9MSUIKKyAgIDogPHRvb2xzZXQ+Y3cKKyAgIDsKKworZ2VuZXJhdG9ycy5yZWdpc3Rlci1hcmNoaXZlciBjdy5hcmNoaXZlCisgICA6IE9CSgorICAgOiBTVEFUSUNfTElCCisgICA6IDx0b29sc2V0PmN3CisgICA7CisKKyMjIGNvbXBpbGF0aW9uIHBoYXNlCisKK2ZsYWdzIGN3IFdIQVRFVkVSIDx0b29sc2V0LWN3OnZlcnNpb24+IDsKKworZmxhZ3MgY3cuY29tcGlsZSBDRkxBR1MgPGRlYnVnLXN5bWJvbHM+b24gOiAtZyA7CitmbGFncyBjdy5jb21waWxlIENGTEFHUyA8b3B0aW1pemF0aW9uPm9mZiA6IC1PMCA7CitmbGFncyBjdy5jb21waWxlIENGTEFHUyA8b3B0aW1pemF0aW9uPnNwZWVkIDogLU80LHAgOworZmxhZ3MgY3cuY29tcGlsZSBDRkxBR1MgPG9wdGltaXphdGlvbj5zcGFjZSA6IC1PNCxzIDsKK2ZsYWdzIGN3LmNvbXBpbGUgQ0ZMQUdTIDxpbmxpbmluZz5vZmYgOiAtaW5saW5lIG9mZiA7CitmbGFncyBjdy5jb21waWxlIENGTEFHUyA8aW5saW5pbmc+b24gOiAtaW5saW5lIG9uIDsKK2ZsYWdzIGN3LmNvbXBpbGUgQ0ZMQUdTIDxpbmxpbmluZz5mdWxsIDogLWlubGluZSBhbGwgOworZmxhZ3MgY3cuY29tcGlsZSBDRkxBR1MgPGV4Y2VwdGlvbi1oYW5kbGluZz5vZmYgOiAtQ3BwX2V4Y2VwdGlvbnMgb2ZmIDsKKworCitmbGFncyBjdy5jb21waWxlIENGTEFHUyA8cnR0aT5vbiA6IC1SVFRJIG9uIDsKK2ZsYWdzIGN3LmNvbXBpbGUgQ0ZMQUdTIDxydHRpPm9mZiA6IC1SVFRJIG9mZiA7CisKK2ZsYWdzIGN3LmNvbXBpbGUgQ0ZMQUdTIDx3YXJuaW5ncz5vbiA6IC13IG9uIDsKK2ZsYWdzIGN3LmNvbXBpbGUgQ0ZMQUdTIDx3YXJuaW5ncz5vZmYgOiAtdyBvZmYgOworZmxhZ3MgY3cuY29tcGlsZSBDRkxBR1MgPHdhcm5pbmdzPmFsbCA6IC13IGFsbCA7CitmbGFncyBjdy5jb21waWxlIENGTEFHUyA8d2FybmluZ3MtYXMtZXJyb3JzPm9uIDogLXcgZXJyb3IgOworCitmbGFncyBjdy5jb21waWxlIFVTRVJfQ0ZMQUdTIDxjZmxhZ3M+IDogOworZmxhZ3MgY3cuY29tcGlsZS5jKysgVVNFUl9DRkxBR1MgPGN4eGZsYWdzPiA6IDsKKworZmxhZ3MgY3cuY29tcGlsZSBERUZJTkVTIDxkZWZpbmU+IDsKK2ZsYWdzIGN3LmNvbXBpbGUgVU5ERUZTIDx1bmRlZj4gOworZmxhZ3MgY3cuY29tcGlsZSBJTkNMVURFUyA8aW5jbHVkZT4gOworCithY3Rpb25zIGNvbXBpbGUuYworeworICAgJCguQ0MpIC1jIC1jd2QgaW5jbHVkZSAtbGFuZyBjIC1VJChVTkRFRlMpICQoQ0ZMQUdTKSAkKFVTRVJfQ0ZMQUdTKSAtSS0gLW8gIiQoPCkiIEAiQCgkKDxbMV06VykucnNwOkU9JChubCkiJCg+KSIgJChubCktRCQoREVGSU5FUykgJChubCkiLUkkKElOQ0xVREVTKSIpIgorfQorYWN0aW9ucyBjb21waWxlLmMrKworeworICAgJCguQ0MpIC1jIC1jd2QgaW5jbHVkZSAtbGFuZyBjKysgLVUkKFVOREVGUykgJChDRkxBR1MpICQoVVNFUl9DRkxBR1MpIC1JLSAtbyAiJCg8KSIgQCJAKCQoPFsxXTpXKS5yc3A6RT0kKG5sKSIkKD4pIiAkKG5sKS1EJChERUZJTkVTKSAkKG5sKSItSSQoSU5DTFVERVMpIikiCit9CisKKyMjIGxpbmtpbmcgcGhhc2UKKworZmxhZ3MgY3cubGluayBERUZfRklMRSA8ZGVmLWZpbGU+IDsKKworZmxhZ3MgY3cgTElOS0ZMQUdTIDogLXNlYXJjaCA7CitmbGFncyBjdyBMSU5LRkxBR1MgPGRlYnVnLXN5bWJvbHM+b24gOiAtZyA7CitmbGFncyBjdyBMSU5LRkxBR1MgPHVzZXItaW50ZXJmYWNlPmNvbnNvbGUgOiAtc3Vic3lzdGVtIGNvbnNvbGUgOworZmxhZ3MgY3cgTElOS0ZMQUdTIDx1c2VyLWludGVyZmFjZT5ndWkgOiAtc3Vic3lzdGVtIHdpbmRvd3MgOworZmxhZ3MgY3cgTElOS0ZMQUdTIDx1c2VyLWludGVyZmFjZT53aW5jZSA6IC1zdWJzeXN0ZW0gd2luY2UgOworZmxhZ3MgY3cgTElOS0ZMQUdTIDx1c2VyLWludGVyZmFjZT5uYXRpdmUgOiAtc3Vic3lzdGVtIG5hdGl2ZSA7CitmbGFncyBjdyBMSU5LRkxBR1MgPHVzZXItaW50ZXJmYWNlPmF1dG8gOiAtc3Vic3lzdGVtIGF1dG8gOworCitmbGFncyBjdyBMSU5LRkxBR1MgPG1haW4tdGFyZ2V0LXR5cGU+TElCLzxsaW5rPnN0YXRpYyA6IC1saWJyYXJ5IDsKKworZmxhZ3MgY3cubGluayBVU0VSX0xJTktGTEFHUyA8bGlua2ZsYWdzPiA7CitmbGFncyBjdy5saW5rIExJTktQQVRIIDxsaWJyYXJ5LXBhdGg+IDsKKworZmxhZ3MgY3cubGluayBGSU5ETElCU19TVCA8ZmluZC1zdGF0aWMtbGlicmFyeT4gOworZmxhZ3MgY3cubGluayBGSU5ETElCU19TQSA8ZmluZC1zaGFyZWQtbGlicmFyeT4gOworZmxhZ3MgY3cubGluayBMSUJSQVJZX09QVElPTiA8dG9vbHNldD5jdyA6ICIiIDogdW5jaGVja2VkIDsKK2ZsYWdzIGN3LmxpbmsgTElCUkFSSUVTX01FTlRJT05FRF9CWV9GSUxFIDogPGxpYnJhcnktZmlsZT4gOworCitydWxlIGxpbmsuZGxsICggdGFyZ2V0cyArIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBERVBFTkRTICQoPCkgOiBbIG9uICQoPCkgcmV0dXJuICQoREVGX0ZJTEUpIF0gOworfQorCitpZiBbIG9zLm5hbWUgXSBpbiBOVAoreworICAgYWN0aW9ucyBhcmNoaXZlCisgICB7CisgICAgICBpZiBleGlzdCAiJCg8WzFdKSIgREVMICIkKDxbMV0pIgorICAgICAgJCguTEQpIC1saWJyYXJ5IC1vICIkKDxbMV0pIiBAIkAoJCg8WzFdOlcpLnJzcDpFPSQobmwpIiQoPikiICQobmwpJChMSUJSQVJJRVNfTUVOVElPTkVEX0JZX0ZJTEUpICQobmwpIiQoTElCUkFSWV9PUFRJT04pJChGSU5ETElCU19TVDpTPS5saWIpIiAkKG5sKSIkKExJQlJBUllfT1BUSU9OKSQoRklORExJQlNfU0E6Uz0ubGliKSIpIgorICAgfQorfQorZWxzZSAjIGN5Z3dpbgoreworICAgYWN0aW9ucyBhcmNoaXZlCisgICB7CisgICAgICBfYmJ2Ml9vdXRfPSIkKDwpIgorICAgICAgaWYgdGVzdCAtZiAiJF9iYnYyX291dF8iIDsgdGhlbgorICAgICAgICAgX2JidjJfZXhpc3RpbmdfPSIkKDw6VykiCisgICAgICBmaQorICAgICAgJCguTEQpIC1saWJyYXJ5IC1vICIkKDw6VykiICRfYmJ2Ml9leGlzdGluZ18gQCJAKCQoPFsxXTpXKS5yc3A6RT0kKG5sKSIkKD4pIiAkKG5sKSQoTElCUkFSSUVTX01FTlRJT05FRF9CWV9GSUxFKSAkKG5sKSIkKExJQlJBUllfT1BUSU9OKSQoRklORExJQlNfU1Q6Uz0ubGliKSIgJChubCkiJChMSUJSQVJZX09QVElPTikkKEZJTkRMSUJTX1NBOlM9LmxpYikiKSIKKyAgIH0KK30KKworYWN0aW9ucyBsaW5rIGJpbmQgREVGX0ZJTEUKK3sKKyAgICQoLkxEKSAtbyAiJCg8WzFdOlcpIiAtTCIkKExJTktQQVRIKSIgJChMSU5LRkxBR1MpICQoVVNFUl9MSU5LRkxBR1MpIEAiQCgkKDxbMV06VykucnNwOkU9JChubCkiJCg+KSIgJChubCkkKExJQlJBUklFU19NRU5USU9ORURfQllfRklMRSkgJChubCkiJChMSUJSQVJZX09QVElPTikkKEZJTkRMSUJTX1NUOlM9LmxpYikiICQobmwpIiQoTElCUkFSWV9PUFRJT04pJChGSU5ETElCU19TQTpTPS5saWIpIikiCit9CisKK2FjdGlvbnMgbGluay5kbGwgYmluZCBERUZfRklMRQoreworICAgJCguTEQpIC1zaGFyZWQgLW8gIiQoPFsxXTpXKSIgLWltcGxpYiAiJCg8WzJdOlcpIiAtTCIkKExJTktQQVRIKSIgJChMSU5LRkxBR1MpIC1mIiQoREVGX0ZJTEUpIiAkKFVTRVJfTElOS0ZMQUdTKSBAIkAoJCg8WzFdOlcpLnJzcDpFPSQobmwpIiQoPikiICQobmwpJChMSUJSQVJJRVNfTUVOVElPTkVEX0JZX0ZJTEUpICQobmwpIiQoTElCUkFSWV9PUFRJT04pJChGSU5ETElCU19TVDpTPS5saWIpIiAkKG5sKSIkKExJQlJBUllfT1BUSU9OKSQoRklORExJQlNfU0E6Uz0ubGliKSIpIgorfQorCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2Rhcndpbi5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2Rhcndpbi5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3N2ZmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZGFyd2luLmphbQpAQCAtMCwwICsxLDU5MiBAQAorIyBDb3B5cmlnaHQgMjAwMyBDaHJpc3RvcGhlciBDdXJyaWUKKyMgQ29weXJpZ2h0IDIwMDYgRGF2ZSBBYnJhaGFtcyAKKyMgQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgVmxhZGltaXIgUHJ1cyAKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNyBNYXQgTWFyY3VzCisjIENvcHlyaWdodCAyMDA1LTIwMDcgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQKKyMgQ29weXJpZ2h0IDIwMDctMjAxMCBSZW5lIFJpdmVyYQorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIAorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisjICBQbGVhc2Ugc2VlIGh0dHA6Ly9hcnRpY2xlLmdtYW5lLm9yZy9nbWFuZS5jb21wLmxpYi5ib29zdC5idWlsZC8zMzg5LworIyAgZm9yIGV4cGxhbmF0aW9uIHdoeSBpdCdzIGEgc2VwYXJhdGUgdG9vbHNldC4KKworaW1wb3J0IGZlYXR1cmUgOiBmZWF0dXJlIDsKK2ltcG9ydCB0b29sc2V0IDogZmxhZ3MgOworaW1wb3J0IHR5cGUgOworaW1wb3J0IGNvbW1vbiA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgcGF0aCA6IGJhc2VuYW1lIDsKK2ltcG9ydCB2ZXJzaW9uIDsKK2ltcG9ydCBwcm9wZXJ0eS1zZXQgOworaW1wb3J0IHJlZ2V4IDsKK2ltcG9ydCBlcnJvcnMgOworCisjIyBVc2UgYSBmcmFtZXdvcmsuCitmZWF0dXJlIGZyYW1ld29yayA6IDogZnJlZSA7CisKKyMjIFRoZSBNYWNPU1ggdmVyc2lvbiB0byBjb21waWxlIGZvciwgd2hpY2ggbWFwcyB0byB0aGUgU0RLIHRvIHVzZSAoc3lzcm9vdCkuCitmZWF0dXJlIG1hY29zeC12ZXJzaW9uIDogOiBwcm9wYWdhdGVkIGxpbmstaW5jb21wYXRpYmxlIHN5bW1ldHJpYyBvcHRpb25hbCA7CisKKyMjIFRoZSBtaW5pbWFsIE1hY09TWCB2ZXJzaW9uIHRvIHRhcmdldC4KK2ZlYXR1cmUgbWFjb3N4LXZlcnNpb24tbWluIDogOiBwcm9wYWdhdGVkIG9wdGlvbmFsIDsKKworIyMgQSBkZXBlbmRlbmN5LCB0aGF0IGlzIGZvcmNlZCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbGluay4KK2ZlYXR1cmUgZm9yY2UtbG9hZCA6IDogZnJlZSBkZXBlbmRlbmN5IGluY2lkZW50YWwgOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitfID0gIiAiIDsKKworaWYgWyBNQVRDSCAoLS1kZWJ1Zy1jb25maWd1cmF0aW9uKSA6IFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIF0KK3sKKyAgICAuZGVidWctY29uZmlndXJhdGlvbiA9IHRydWUgOworfQorCitmZWF0dXJlLmV4dGVuZCB0b29sc2V0IDogZGFyd2luIDsKK2ltcG9ydCBnY2MgOwordG9vbHNldC5pbmhlcml0LWdlbmVyYXRvcnMgZGFyd2luIDogZ2NjIDogZ2NjLm1pbmd3LmxpbmsgZ2NjLm1pbmd3LmxpbmsuZGxsIDsKKworZ2VuZXJhdG9ycy5vdmVycmlkZSBkYXJ3aW4ucHJlYnVpbHQgOiBidWlsdGluLnByZWJ1aWx0IDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgZGFyd2luLnNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOiBzZWFyY2hlZC1saWItZ2VuZXJhdG9yIDsKKworIyBPdmVycmlkZSBkZWZhdWx0IGRvLW5vdGhpbmcgZ2VuZXJhdG9ycy4KK2dlbmVyYXRvcnMub3ZlcnJpZGUgZGFyd2luLmNvbXBpbGUuYy5wY2ggICA6IHBjaC5kZWZhdWx0LWMtcGNoLWdlbmVyYXRvciAgIDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgZGFyd2luLmNvbXBpbGUuYysrLnBjaCA6IHBjaC5kZWZhdWx0LWNwcC1wY2gtZ2VuZXJhdG9yIDsKKwordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXggUENIIDogPHRvb2xzZXQ+ZGFyd2luIDogZ2NoIDsKKwordG9vbHNldC5pbmhlcml0LXJ1bGVzIGRhcndpbiA6IGdjYyA6IGxvY2FsaXplIDsKK3Rvb2xzZXQuaW5oZXJpdC1mbGFncyBkYXJ3aW4gOiBnY2MgICAgIAorICA6ICA8cnVudGltZS1saW5rPnN0YXRpYworICAgICA8YXJjaGl0ZWN0dXJlPmFybS88YWRkcmVzcy1tb2RlbD4zMgorICAgICA8YXJjaGl0ZWN0dXJlPmFybS88YWRkcmVzcy1tb2RlbD42NAorICAgICA8YXJjaGl0ZWN0dXJlPmFybS88aW5zdHJ1Y3Rpb24tc2V0PgorICAgICA8YXJjaGl0ZWN0dXJlPng4Ni88YWRkcmVzcy1tb2RlbD4zMgorICAgICA8YXJjaGl0ZWN0dXJlPng4Ni88YWRkcmVzcy1tb2RlbD42NAorICAgICA8YXJjaGl0ZWN0dXJlPng4Ni88aW5zdHJ1Y3Rpb24tc2V0PgorICAgICA8YXJjaGl0ZWN0dXJlPnBvd2VyLzxhZGRyZXNzLW1vZGVsPjMyCisgICAgIDxhcmNoaXRlY3R1cmU+cG93ZXIvPGFkZHJlc3MtbW9kZWw+NjQKKyAgICAgPGFyY2hpdGVjdHVyZT5wb3dlci88aW5zdHJ1Y3Rpb24tc2V0PiAgOworCisjIE9wdGlvbnM6CisjCisjICAgPHJvb3Q+UEFUSAorIyAgICAgICBQbGF0Zm9ybSByb290IHBhdGguIFRoZSBjb21tb24gYXV0b2RldGVjdGlvbiB3aWxsIHNldCB0aGlzIHRvCisjICAgICAgICIvRGV2ZWxvcGVyIi4gQW5kIHdoZW4gYSBjb21tYW5kIGlzIGdpdmVuIGl0IHdpbGwgYmUgc2V0IHRvCisjICAgICAgIHRoZSBjb3JyZXNwb25kaW5nICIqLnBsYXRmb3JtL0RldmVsb3BlciIgZGlyZWN0b3J5LgorIworcnVsZSBpbml0ICggdmVyc2lvbiA/IDogY29tbWFuZCAqIDogb3B0aW9ucyAqIDogcmVxdWlyZW1lbnQgKiApCit7CisgICAgIyBGaXJzdCB0aW1lIGFyb3VuZCwgZmlndXJlIHdoYXQgaXMgaG9zdCBPU1ggdmVyc2lvbgorICAgIGlmICEgJCguaG9zdC1vc3gtdmVyc2lvbikgIAorICAgIHsKKyAgICAgICAgLmhvc3Qtb3N4LXZlcnNpb24gPSBbIE1BVENIICJeKFswLTkuXSspIgorICAgICAgICAgIDogWyBTSEVMTCAiL3Vzci9iaW4vc3dfdmVycyAtcHJvZHVjdFZlcnNpb24iIF0gXSA7CisgICAgICAgIGlmICQoLmRlYnVnLWNvbmZpZ3VyYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gbm90aWNlOiBPU1ggdmVyc2lvbiBvbiB0aGlzIG1hY2hpbmUgaXMgJCguaG9zdC1vc3gtdmVyc2lvbikgOworICAgICAgICB9CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICMgLSBUaGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHRvb2wgaW5zdGFsbC4KKyAgICBsb2NhbCByb290ID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPHJvb3Q+IDogJChvcHRpb25zKSBdIDsKKyAgICAKKyAgICAjIC0gVGhlIGJpbiBkaXJlY3Rvcnkgd2hlcmUgdG8gZmluZCB0aGUgY29tbWFuZHMgdG8gZXhlY3V0ZS4KKyAgICBsb2NhbCBiaW4gOworICAgIAorICAgICMgLSBUaGUgY29uZmlndXJlZCBjb21waWxlIGRyaXZlciBjb21tYW5kLgorICAgIGxvY2FsIGNvbW1hbmQgPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kIGRhcndpbiA6IGcrKyA6ICQoY29tbWFuZCkgXSA7CisgICAgCisgICAgIyBUaGUgdmVyc2lvbiBhcyByZXBvcnRlZCBieSB0aGUgY29tcGlsZXIKKyAgICBsb2NhbCByZWFsLXZlcnNpb24gOworICAgIAorICAgICMgLSBBdXRvZGV0ZWN0IHRoZSByb290IGFuZCBiaW4gZGlyIGlmIG5vdCBnaXZlbi4KKyAgICBpZiAkKGNvbW1hbmQpCisgICAgeworICAgICAgICBiaW4gPz0gWyBjb21tb24uZ2V0LWFic29sdXRlLXRvb2wtcGF0aCAkKGNvbW1hbmRbMV0pIF0gOworICAgICAgICBpZiAkKGJpbikgPSAiL3Vzci9iaW4iCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvb3QgPz0gL0RldmVsb3BlciA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCByID0gJChiaW46RCkgOworICAgICAgICAgICAgciA9ICQocjpEKSA7CisgICAgICAgICAgICByb290ID89ICQocikgOworICAgICAgICB9CisgICAgfQorICAgIAorICAgICMgLSBBdXRvZGV0ZWN0IHRoZSB2ZXJzaW9uIGlmIG5vdCBnaXZlbi4KKyAgICBpZiAkKGNvbW1hbmQpCisgICAgeworICAgICAgICAjIC0gVGhlICdjb21tYW5kJyB2YXJpYWJsZSBjYW4gaGF2ZSBtdWx0aXBsZSBlbGVtZW50cy4gV2hlbiBjYWxsaW5nCisgICAgICAgICMgICB0aGUgU0hFTEwgYnVpbHRpbiB3ZSBuZWVkIGEgc2luZ2xlIHN0cmluZy4KKyAgICAgICAgbG9jYWwgY29tbWFuZC1zdHJpbmcgPSAkKGNvbW1hbmQ6Sj0iICIpIDsKKyAgICAgICAgcmVhbC12ZXJzaW9uID0gWyBNQVRDSCAiXihbMC05Ll0rKSIKKyAgICAgICAgICAgIDogWyBTSEVMTCAiJChjb21tYW5kLXN0cmluZykgLWR1bXB2ZXJzaW9uIiBdIF0gOworICAgICAgICB2ZXJzaW9uID89ICQocmVhbC12ZXJzaW9uKSA7CisgICAgfQorICAgIAorICAgIC5yZWFsLXZlcnNpb24uJCh2ZXJzaW9uKSA9ICQocmVhbC12ZXJzaW9uKSA7CisgICAgCisgICAgIyAtIERlZmluZSB0aGUgY29uZGl0aW9uIGZvciB0aGlzIHRvb2xzZXQgaW5zdGFuY2UuCisgICAgbG9jYWwgY29uZGl0aW9uID0KKyAgICAgICAgWyBjb21tb24uY2hlY2staW5pdC1wYXJhbWV0ZXJzIGRhcndpbiAkKHJlcXVpcmVtZW50KSA6IHZlcnNpb24gJCh2ZXJzaW9uKSBdIDsKKyAgICAKKyAgICAjIC0gU2V0IHRoZSB0b29sc2V0IGdlbmVyaWMgY29tbW9uIG9wdGlvbnMuCisgICAgY29tbW9uLmhhbmRsZS1vcHRpb25zIGRhcndpbiA6ICQoY29uZGl0aW9uKSA6ICQoY29tbWFuZCkgOiAkKG9wdGlvbnMpIDsKKyAgICAKKyAgICAjIC0gR0NDIDQuMCBhbmQgaGlnaGVyIGluIERhcndpbiBkb2VzIG5vdCBoYXZlIC1mY29hbGVzY2UtdGVtcGxhdGVzLgorICAgIGlmICQocmVhbC12ZXJzaW9uKSA8ICI0LjAuMCIKKyAgICB7CisgICAgICAgIGZsYWdzIGRhcndpbi5jb21waWxlLmMrKyBPUFRJT05TICQoY29uZGl0aW9uKSA6IC1mY29hbGVzY2UtdGVtcGxhdGVzIDsKKyAgICB9CisgICAgIyAtIEdDQyA0LjIgYW5kIGhpZ2hlciBpbiBEYXJ3aW4gZG9lcyBub3QgaGF2ZSAtV25vLWxvbmctZG91YmxlLgorICAgIGlmICQocmVhbC12ZXJzaW9uKSA8ICI0LjIuMCIKKyAgICB7CisgICAgICAgIGZsYWdzIGRhcndpbi5jb21waWxlIE9QVElPTlMgJChjb25kaXRpb24pIDogLVduby1sb25nLWRvdWJsZSA7CisgICAgfQorCisgICAgIyAtIFNldCB0aGUgbGluayBmbGFncyBjb21tb24gd2l0aCB0aGUgR0NDIHRvb2xzZXQuCisgICAgZ2NjLmluaXQtbGluay1mbGFncyBkYXJ3aW4gZGFyd2luICQoY29uZGl0aW9uKSA7CisKKyAgICAjIC0gVGhlIHN5bWJvbCBzdHJpcCBwcm9ncmFtLgorICAgIGxvY2FsIHN0cmlwIDsKKyAgICBpZiA8c3RyaXBlcj4gaW4gJChvcHRpb25zKQorICAgIHsKKyAgICAgICAgIyBXZSBjYW4gdHVybiBvZmYgc3RyaXAgYnkgc3BlY2lmeWluZyBpdCBhcyBlbXB0eS4gSW4gd2hpY2gKKyAgICAgICAgIyBjYXNlIHdlIHN3aXRjaCB0byB1c2luZyB0aGUgbGlua2VyIHRvIGRvIHRoZSBzdHJpcC4KKyAgICAgICAgZmxhZ3MgZGFyd2luLmxpbmsuZGxsIE9QVElPTlMKKyAgICAgICAgICAgICQoY29uZGl0aW9uKS88bWFpbi10YXJnZXQtdHlwZT5MSUIvPGxpbms+c2hhcmVkLzxhZGRyZXNzLW1vZGVsPjMyLzxzdHJpcD5vbiA6IC1XbCwteCA7CisgICAgICAgIGZsYWdzIGRhcndpbi5saW5rLmRsbCBPUFRJT05TCisgICAgICAgICAgICAkKGNvbmRpdGlvbikvPG1haW4tdGFyZ2V0LXR5cGU+TElCLzxsaW5rPnNoYXJlZC88YWRkcmVzcy1tb2RlbD4vPHN0cmlwPm9uIDogLVdsLC14IDsKKyAgICAgICAgZmxhZ3MgZGFyd2luLmxpbmsgT1BUSU9OUworICAgICAgICAgICAgJChjb25kaXRpb24pLzxtYWluLXRhcmdldC10eXBlPkVYRS88YWRkcmVzcy1tb2RlbD4zMi88c3RyaXA+b24gOiAtcyA7CisgICAgICAgIGZsYWdzIGRhcndpbi5saW5rIE9QVElPTlMKKyAgICAgICAgICAgICQoY29uZGl0aW9uKS88bWFpbi10YXJnZXQtdHlwZT5FWEUvPGFkZHJlc3MtbW9kZWw+LzxzdHJpcD5vbiA6IC1zIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgIyBPdGhlcndpc2Ugd2UgbmVlZCB0byBmaW5kIGEgc3RyaXAgcHJvZ3JhbSB0byB1c2UuIEFuZCBoZW5jZQorICAgICAgICAjIGFsc28gdGVsbCB0aGUgbGluayBhY3Rpb24gdGhhdCB3ZSBuZWVkIHRvIHVzZSBhIHN0cmlwCisgICAgICAgICMgcG9zdC1wcm9jZXNzLgorICAgICAgICBmbGFncyBkYXJ3aW4ubGluayBORUVEX1NUUklQICQoY29uZGl0aW9uKS88c3RyaXA+b24gOiAiIiA7CisgICAgICAgIHN0cmlwID0KKyAgICAgICAgICAgIFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgZGFyd2luCisgICAgICAgICAgICAgICAgOiBzdHJpcCA6IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxzdHJpcGVyPiA6ICQob3B0aW9ucykgXSA6ICQoYmluKSA6IHNlYXJjaC1wYXRoIF0gOworICAgICAgICBmbGFncyBkYXJ3aW4ubGluayAuU1RSSVAgJChjb25kaXRpb24pIDogJChzdHJpcFsxXSkgOworICAgICAgICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBFQ0hPIG5vdGljZTogdXNpbmcgc3RyaXAgZm9yICQoY29uZGl0aW9uKSBhdCAkKHN0cmlwWzFdKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIC0gVGhlIGFyY2hpdmUgYnVpbGRlciAobGlidG9vbCBpcyB0aGUgZGVmYXVsdCBhcyBjcmVhdGluZworICAgICMgICBhcmNoaXZlcyBpbiBkYXJ3aW4gaXMgY29tcGxpY2F0ZWQuCisgICAgbG9jYWwgYXJjaGl2ZXIgPQorICAgICAgICBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kIGRhcndpbgorICAgICAgICAgICAgOiBsaWJ0b29sIDogWyBmZWF0dXJlLmdldC12YWx1ZXMgPGFyY2hpdmVyPiA6ICQob3B0aW9ucykgXSA6ICQoYmluKSA6IHNlYXJjaC1wYXRoIF0gOworICAgIGZsYWdzIGRhcndpbi5hcmNoaXZlIC5MSUJUT09MICQoY29uZGl0aW9uKSA6ICQoYXJjaGl2ZXJbMV0pIDsKKyAgICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKQorICAgIHsKKyAgICAgICAgRUNITyBub3RpY2U6IHVzaW5nIGFyY2hpdmVyIGZvciAkKGNvbmRpdGlvbikgYXQgJChhcmNoaXZlclsxXSkgOworICAgIH0KKyAgICAKKyAgICAjIC0gSW5pdGlhbGl6ZSB0aGUgU0RLcyBhdmFpbGFibGUgaW4gdGhlIHJvb3QgZm9yIHRoaXMgdG9vbC4KKyAgICBsb2NhbCBzZGtzID0gWyBpbml0LWF2YWlsYWJsZS1zZGstdmVyc2lvbnMgJChjb25kaXRpb24pIDogJChyb290KSBdIDsKKyAgICAKKyAgICAjfiBFQ0hPIC0tLSA7CisgICAgI34gRUNITyAtLS0gYmluIDo6ICQoYmluKSA7CisgICAgI34gRUNITyAtLS0gcm9vdCA6OiAkKHJvb3QpIDsKKyAgICAjfiBFQ0hPIC0tLSB2ZXJzaW9uIDo6ICQodmVyc2lvbikgOworICAgICN+IEVDSE8gLS0tIGNvbmRpdGlvbiA6OiAkKGNvbmRpdGlvbikgOworICAgICN+IEVDSE8gLS0tIHN0cmlwIDo6ICQoc3RyaXApIDsKKyAgICAjfiBFQ0hPIC0tLSBhcmNoaXZlciA6OiAkKGFyY2hpdmVyKSA7CisgICAgI34gRUNITyAtLS0gc2RrcyA6OiAkKHNka3MpIDsKKyAgICAjfiBFQ0hPIC0tLSA7CisgICAgI34gRVhJVCA7Cit9CisKKyMgQWRkIGFuZCBzZXQgb3B0aW9ucyBmb3IgYSBkaXNjb3ZlcmVkIFNESyB2ZXJzaW9uLgorbG9jYWwgcnVsZSBpbml0LXNkayAoIGNvbmRpdGlvbiAqIDogcm9vdCA/IDogdmVyc2lvbiArIDogdmVyc2lvbi1mZWF0dXJlID8gKQoreworICAgIGxvY2FsIHJ1bGUgdmVyc2lvbi10by1mZWF0dXJlICggdmVyc2lvbiArICkKKyAgICB7CisgICAgICAgIHN3aXRjaCAkKHZlcnNpb25bMV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgaXBob25lKiA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICQodmVyc2lvblsxXSktJCh2ZXJzaW9uWzItXTpKPS4pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgbWFjKiA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICQodmVyc2lvblsyLV06Sj0uKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlICogOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAkKHZlcnNpb246Sj0uKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgIyBsZWF2ZSBjb21waWxlciBmbGFncyBldGMuIHVwIHRvIHRoZSB0b29sY2hhaW4KKyAgICByZXR1cm4gJCh2ZXJzaW9uLWZlYXR1cmUpIDsKKworICAgIGlmICQodmVyc2lvbi1mZWF0dXJlKQorICAgIHsKKyAgICAgICAgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgRUNITyBub3RpY2U6IGF2YWlsYWJsZSBzZGsgZm9yICQoY29uZGl0aW9uKS88bWFjb3N4LXZlcnNpb24+JCh2ZXJzaW9uLWZlYXR1cmUpIGF0ICQocm9vdCkgOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAjIEFkZCB0aGUgdmVyc2lvbiB0byB0aGUgZmVhdHVyZXMgZm9yIHNwZWNpZnlpbmcgdGhlbS4KKyAgICAgICAgaWYgISAkKHZlcnNpb24tZmVhdHVyZSkgaW4gWyBmZWF0dXJlLnZhbHVlcyBtYWNvc3gtdmVyc2lvbiBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGZlYXR1cmUuZXh0ZW5kIG1hY29zeC12ZXJzaW9uIDogJCh2ZXJzaW9uLWZlYXR1cmUpIDsKKyAgICAgICAgfQorICAgICAgICBpZiAhICQodmVyc2lvbi1mZWF0dXJlKSBpbiBbIGZlYXR1cmUudmFsdWVzIG1hY29zeC12ZXJzaW9uLW1pbiBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGZlYXR1cmUuZXh0ZW5kIG1hY29zeC12ZXJzaW9uLW1pbiA6ICQodmVyc2lvbi1mZWF0dXJlKSA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICMgU2V0IHRoZSBmbGFncyB0aGUgdmVyc2lvbiBuZWVkcyB0byBjb21waWxlIHdpdGgsIGZpcnN0CisgICAgICAgICMgZ2VuZXJpYyBvcHRpb25zLgorICAgICAgICBmbGFncyBkYXJ3aW4uY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88bWFjb3N4LXZlcnNpb24+JCh2ZXJzaW9uLWZlYXR1cmUpCisgICAgICAgICAgICA6IC1pc3lzcm9vdCAkKHJvb3QpIDsKKyAgICAgICAgZmxhZ3MgZGFyd2luLmxpbmsgT1BUSU9OUyAkKGNvbmRpdGlvbikvPG1hY29zeC12ZXJzaW9uPiQodmVyc2lvbi1mZWF0dXJlKQorICAgICAgICAgICAgOiAtaXN5c3Jvb3QgJChyb290KSA7CisgICAgICAgIAorICAgICAgICAjIFRoZW4gZGV2aWNlIHZhcmlhdGlvbiBvcHRpb25zLgorICAgICAgICBzd2l0Y2ggJCh2ZXJzaW9uWzFdKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGlwaG9uZXNpbSogOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsIE4gPSAkKHZlcnNpb25bMl0pIDsKKyAgICAgICAgICAgICAgICBpZiAhICQodmVyc2lvblszXSkgeyBOICs9IDAwIDsgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgWyByZWdleC5tYXRjaCAoLi4pIDogJCh2ZXJzaW9uWzNdKSBdIHsgTiArPSAkKHZlcnNpb25bM10pIDsgfQorICAgICAgICAgICAgICAgIGVsc2UgeyBOICs9IDAkKHZlcnNpb25bM10pIDsgfQorICAgICAgICAgICAgICAgIGlmICEgJCh2ZXJzaW9uWzRdKSB7IE4gKz0gMDAgOyB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiBbIHJlZ2V4Lm1hdGNoICguLikgOiAkKHZlcnNpb25bNF0pIF0geyBOICs9ICQodmVyc2lvbls0XSkgOyB9CisgICAgICAgICAgICAgICAgZWxzZSB7IE4gKz0gMCQodmVyc2lvbls0XSkgOyB9CisgICAgICAgICAgICAgICAgTiA9ICQoTjpKPSkgOworICAgICAgICAgICAgICAgIGZsYWdzIGRhcndpbi5jb21waWxlIE9QVElPTlMgPG1hY29zeC12ZXJzaW9uLW1pbj4kKHZlcnNpb24tZmVhdHVyZSkKKyAgICAgICAgICAgICAgICAgICAgOiAtRF9fSVBIT05FX09TX1ZFUlNJT05fTUlOX1JFUVVJUkVEPSQoTikgOworICAgICAgICAgICAgICAgIGZsYWdzIGRhcndpbi5saW5rIE9QVElPTlMgPG1hY29zeC12ZXJzaW9uLW1pbj4kKHZlcnNpb24tZmVhdHVyZSkKKyAgICAgICAgICAgICAgICAgICAgOiAtRF9fSVBIT05FX09TX1ZFUlNJT05fTUlOX1JFUVVJUkVEPSQoTikgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIGlwaG9uZSogOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsYWdzIGRhcndpbi5jb21waWxlIE9QVElPTlMgPG1hY29zeC12ZXJzaW9uLW1pbj4kKHZlcnNpb24tZmVhdHVyZSkKKyAgICAgICAgICAgICAgICAgICAgOiAtbWlwaG9uZW9zLXZlcnNpb24tbWluPSQodmVyc2lvblsyLV06Sj0uKSA7CisgICAgICAgICAgICAgICAgZmxhZ3MgZGFyd2luLmxpbmsgT1BUSU9OUyA8bWFjb3N4LXZlcnNpb24tbWluPiQodmVyc2lvbi1mZWF0dXJlKQorICAgICAgICAgICAgICAgICAgICA6IC1taXBob25lb3MtdmVyc2lvbi1taW49JCh2ZXJzaW9uWzItXTpKPS4pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBtYWMqIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbGFncyBkYXJ3aW4uY29tcGlsZSBPUFRJT05TIDxtYWNvc3gtdmVyc2lvbi1taW4+JCh2ZXJzaW9uLWZlYXR1cmUpCisgICAgICAgICAgICAgICAgICAgIDogLW1tYWNvc3gtdmVyc2lvbi1taW49JCh2ZXJzaW9uWzItXTpKPS4pIDsKKyAgICAgICAgICAgICAgICBmbGFncyBkYXJ3aW4ubGluayBPUFRJT05TIDxtYWNvc3gtdmVyc2lvbi1taW4+JCh2ZXJzaW9uLWZlYXR1cmUpCisgICAgICAgICAgICAgICAgICAgIDogLW1tYWNvc3gtdmVyc2lvbi1taW49JCh2ZXJzaW9uWzItXTpKPS4pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgJCh2ZXJzaW9uWzNdKSA+IDAKKyAgICAgICAgeworICAgICAgICAgICAgIyBXZSBoYXZlIGEgbWlub3IgdmVyc2lvbiBvZiBhbiBTREsuIFdlIHdhbnQgdG8gc2V0IHVwCisgICAgICAgICAgICAjIHByZXZpb3VzIG1pbm9yIHZlcnNpb25zLCBwbHVzIHRoZSBjdXJyZW50IG1pbm9yIHZlcnNpb24uCisgICAgICAgICAgICAjIFNvIHdlIHJlY3Vyc2UgdG8gc2V0IHVwIHRoZSBwcmV2aW91cyBtaW5vciB2ZXJzaW9ucywgdXAgdG8KKyAgICAgICAgICAgICMgdGhlIGN1cnJlbnQgdmVyc2lvbi4KKyAgICAgICAgICAgIGxvY2FsIG1pbm9yLW1pbnVzLTEgPSBbIENBTEMgJCh2ZXJzaW9uWzNdKSAtIDEgXSA7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBbIGluaXQtc2RrICQoY29uZGl0aW9uKSA6ICQocm9vdCkKKyAgICAgICAgICAgICAgICAgICAgOiAkKHZlcnNpb25bMS0yXSkgJChtaW5vci1taW51cy0xKSA6IFsgdmVyc2lvbi10by1mZWF0dXJlICQodmVyc2lvblsxLTJdKSAkKG1pbm9yLW1pbnVzLTEpIF0gXQorICAgICAgICAgICAgICAgICQodmVyc2lvbi1mZWF0dXJlKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gJCh2ZXJzaW9uLWZlYXR1cmUpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICQodmVyc2lvbls0XSkKKyAgICB7CisgICAgICAgICMgV2UgaGF2ZSBhIHBhdGNoIHZlcnNpb24gb2YgYW4gU0RLLiBXZSB3YW50IHRvIHNldCB1cAorICAgICAgICAjIGJvdGggdGhlIHNwZWNpZmljIHBhdGNoIHZlcnNpb24sIGFuZCB0aGUgbWlub3IgdmVyc2lvbi4KKyAgICAgICAgIyBTbyB3ZSByZWN1cnNlIHRvIHNldCB1cCB0aGUgcGF0Y2ggdmVyc2lvbi4gUGx1cyB0aGUgbWlub3IgdmVyc2lvbi4KKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBbIGluaXQtc2RrICQoY29uZGl0aW9uKSA6ICQocm9vdCkKKyAgICAgICAgICAgICAgICA6ICQodmVyc2lvblsxLTNdKSA6IFsgdmVyc2lvbi10by1mZWF0dXJlICQodmVyc2lvblsxLTNdKSBdIF0KKyAgICAgICAgICAgIFsgaW5pdC1zZGsgJChjb25kaXRpb24pIDogJChyb290KQorICAgICAgICAgICAgICAgIDogJCh2ZXJzaW9uKSA6IFsgdmVyc2lvbi10by1mZWF0dXJlICQodmVyc2lvbikgXSBdIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgIyBZZXMsIHRoaXMgaXMgaW50ZW50aW9uYWxseSByZWN1cnNpdmUuCisgICAgICAgIHJldHVybgorICAgICAgICAgICAgWyBpbml0LXNkayAkKGNvbmRpdGlvbikgOiAkKHJvb3QpCisgICAgICAgICAgICAgICAgOiAkKHZlcnNpb24pIDogWyB2ZXJzaW9uLXRvLWZlYXR1cmUgJCh2ZXJzaW9uKSBdIF0gOworICAgIH0KK30KKworIyBEZXRlcm1pbmUgdGhlIE1hY09TWCBTREsgdmVyc2lvbnMgaW5zdGFsbGVkIGFuZCB0aGVpciBsb2NhdGlvbnMuCitsb2NhbCBydWxlIGluaXQtYXZhaWxhYmxlLXNkay12ZXJzaW9ucyAoIGNvbmRpdGlvbiAqIDogcm9vdCA/ICkKK3sKKyAgICByb290ID89IC9EZXZlbG9wZXIgOworICAgIGxvY2FsIHNka3Mtcm9vdCA9ICQocm9vdCkvU0RLcyA7CisgICAgbG9jYWwgc2RrcyA9IFsgR0xPQiAkKHNka3Mtcm9vdCkgOiBNYWNPU1gqLnNkayBpUGhvbmVPUyouc2RrIGlQaG9uZVNpbXVsYXRvciouc2RrIF0gOworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgZm9yIGxvY2FsIHNkayBpbiAkKHNka3MpCisgICAgeworICAgICAgICBsb2NhbCBzZGstbWF0Y2ggPSBbIE1BVENIIChbXjAtOV0rKShbMC05XSspWy5dKFswLTl4XSspWy5dPyhbMC05eF0rKT8gOiAkKHNkazpEPSkgXSA7CisgICAgICAgIGxvY2FsIHNkay1wbGF0Zm9ybSA9ICQoc2RrLW1hdGNoWzFdOkwpIDsKKyAgICAgICAgbG9jYWwgc2RrLXZlcnNpb24gPSAkKHNkay1tYXRjaFsyLV0pIDsKKyAgICAgICAgaWYgJChzZGstdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICQoc2RrLXBsYXRmb3JtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgbWFjb3N4IDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNkay12ZXJzaW9uID0gbWFjICQoc2RrLXZlcnNpb24pIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBpcGhvbmVvcyA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZGstdmVyc2lvbiA9IGlwaG9uZSAkKHNkay12ZXJzaW9uKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgaXBob25lc2ltdWxhdG9yIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNkay12ZXJzaW9uID0gaXBob25lc2ltICQoc2RrLXZlcnNpb24pIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAqIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNkay12ZXJzaW9uID0gJChzZGstdmVyc2lvbjpKPS0pIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgKz0gWyBpbml0LXNkayAkKGNvbmRpdGlvbikgOiAkKHNkaykgOiAkKHNkay12ZXJzaW9uKSBdIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworIyBHZW5lcmljIG9wdGlvbnMuCitmbGFncyBkYXJ3aW4uY29tcGlsZSBPUFRJT05TIDxmbGFncz4gOworCisjIFRoZSBmb2xsb3dpbmcgYWRkcyBvYmplY3RpdmUtYyBzdXBwb3J0IHRvIGRhcndpbi4KKyMgVGhhbmtzIHRvIGh0dHA6Ly90aHJlYWQuZ21hbmUub3JnL2dtYW5lLmNvbXAubGliLmJvb3N0LmJ1aWxkLzEzNzU5CisKK2dlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBkYXJ3aW4uY29tcGlsZS5tIDogT0JKRUNUSVZFX0MgOiBPQkogOiA8dG9vbHNldD5kYXJ3aW4gOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIGRhcndpbi5jb21waWxlLm1tIDogT0JKRUNUSVZFX0NQUCA6IE9CSiA6IDx0b29sc2V0PmRhcndpbiA7CisKK3J1bGUgc2V0dXAtYWRkcmVzcy1tb2RlbCAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgbG9jYWwgcHMgPSBbIHByb3BlcnR5LXNldC5jcmVhdGUgJChwcm9wZXJ0aWVzKSBdIDsKKyAgICBsb2NhbCBhcmNoID0gWyAkKHBzKS5nZXQgPGFyY2hpdGVjdHVyZT4gXSA7CisgICAgbG9jYWwgaW5zdHJ1Y3Rpb24tc2V0ID0gWyAkKHBzKS5nZXQgPGluc3RydWN0aW9uLXNldD4gXSA7CisgICAgbG9jYWwgYWRkcmVzcy1tb2RlbCA9IFsgJChwcykuZ2V0IDxhZGRyZXNzLW1vZGVsPiBdIDsKKyAgICBsb2NhbCBvc3gtdmVyc2lvbiA9IFsgJChwcykuZ2V0IDxtYWNvc3gtdmVyc2lvbj4gXSA7CisgICAgbG9jYWwgZ2NjLXZlcnNpb24gPSBbICQocHMpLmdldCA8dG9vbHNldC1kYXJ3aW46dmVyc2lvbj4gXSA7CisgICAgZ2NjLXZlcnNpb24gPSAkKC5yZWFsLXZlcnNpb24uJChnY2MtdmVyc2lvbikpIDsKKyAgICBsb2NhbCBvcHRpb25zIDsKKyAgICAKKyAgICBsb2NhbCBzdXBwb3J0LXBwYzY0ID0gMSA7CisgICAgCisgICAgb3N4LXZlcnNpb24gPz0gJCguaG9zdC1vc3gtdmVyc2lvbikgOworCisgICAgc3dpdGNoICQob3N4LXZlcnNpb24pCisgICAgeworICAgICAgICBjYXNlIGlwaG9uZSogOgorICAgICAgICB7CisgICAgICAgICAgICBzdXBwb3J0LXBwYzY0ID0gOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjYXNlICogOgorICAgICAgICBpZiAkKG9zeC12ZXJzaW9uKSAmJiAhIFsgdmVyc2lvbi52ZXJzaW9uLWxlc3MgWyByZWdleC5zcGxpdCAkKG9zeC12ZXJzaW9uKSBcXC4gXSA6IDEwIDYgXQorICAgICAgICB7CisgICAgICAgICAgICAjIFdoZW4gdGFyZ2V0aW5nIDEwLjY6CisgICAgICAgICAgICAjIC0gZ2NjIDQuMiB3aWxsIGdpdmUgYSBjb21waWxlciBlcnJpciBpZiBwcGM2NCBjb21waWxhdGlvbiBpcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgICMgLSBnY2MgNC4wIHdpbGwgY29tcGlsZSBmaW5lLCBzb21laG93LCBidXQgdGhlbiBmYWlsIGF0IGxpbmsgdGltZQorICAgICAgICAgICAgc3VwcG9ydC1wcGM2NCA9IDsKKyAgICAgICAgfQorICAgIH0KKyAgICAjIEdlbnRvbyBQcmVmaXggdG9vbGNoYWluIGRvZXNuJ3QgZG8gbXVsdGktYXJjaCwgc28gZG9uJ3QgdHJ5IGVpdGhlcgorICAgIHN3aXRjaCAkKGRvbm90YWRkYXJjaHBsZWFzZVhYWGFyY2gpCisgICAgeworICAgICAgICBjYXNlIGNvbWJpbmVkIDogCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQoYWRkcmVzcy1tb2RlbCkgPSAzMl82NCB7CisgICAgICAgICAgICAgICAgaWYgJChzdXBwb3J0LXBwYzY0KSB7CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAtYXJjaCBpMzg2IC1hcmNoIHBwYyAtYXJjaCB4ODZfNjQgLWFyY2ggcHBjNjQgOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIyBCdWlsZCAzLXdheSBiaW5hcnkKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IC1hcmNoIGkzODYgLWFyY2ggcHBjIC1hcmNoIHg4Nl82NCA7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgJChhZGRyZXNzLW1vZGVsKSA9IDY0IHsKKyAgICAgICAgICAgICAgICBpZiAkKHN1cHBvcnQtcHBjNjQpIHsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IC1hcmNoIHg4Nl82NCAtYXJjaCBwcGM2NCA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgIjY0LWJpdCBQUEMgY29tcGlsYXRpb24gaXMgbm90IHN1cHBvcnRlZCB3aGVuIHRhcmdldGluZyBPU1ggMTAuNiBvciBsYXRlciIgOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAtYXJjaCBpMzg2IC1hcmNoIHBwYyA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNhc2UgeDg2IDogCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQoYWRkcmVzcy1tb2RlbCkgPSAzMl82NCB7CisgICAgICAgICAgICAgICAgb3B0aW9ucyA9IC1hcmNoIGkzODYgLWFyY2ggeDg2XzY0IDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAkKGFkZHJlc3MtbW9kZWwpID0gNjQgeworICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAtYXJjaCB4ODZfNjQgOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcHRpb25zID0gLWFyY2ggaTM4NiA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAKKyAgICAgICAgY2FzZSBwb3dlciA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICEgJChzdXBwb3J0LXBwYzY0KSAKKyAgICAgICAgICAgICAgJiYgKCAgJChhZGRyZXNzLW1vZGVsKSA9IDMyXzY0IHx8ICQoYWRkcmVzcy1tb2RlbCkgPSA2NCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgIjY0LWJpdCBQUEMgY29tcGlsYXRpb24gaXMgbm90IHN1cHBvcnRlZCB3aGVuIHRhcmdldGluZyBPU1ggMTAuNiBvciBsYXRlciIgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAkKGFkZHJlc3MtbW9kZWwpID0gMzJfNjQgeworICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAtYXJjaCBwcGMgLWFyY2ggcHBjNjQgOworICAgICAgICAgICAgfSBlbHNlIGlmICQoYWRkcmVzcy1tb2RlbCkgPSA2NCB7CisgICAgICAgICAgICAgICAgb3B0aW9ucyA9IC1hcmNoIHBwYzY0IDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3B0aW9ucyA9IC1hcmNoIHBwYyA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNhc2UgYXJtIDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJChpbnN0cnVjdGlvbi1zZXQpIHsKKyAgICAgICAgICAgICAgICBvcHRpb25zID0gLWFyY2gkKF8pJChpbnN0cnVjdGlvbi1zZXQpIDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3B0aW9ucyA9IC1hcmNoIGFybSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgJChvcHRpb25zKQorICAgIHsKKyAgICAgICAgT1BUSU9OUyBvbiAkKHRhcmdldHMpICs9ICQob3B0aW9ucykgOworICAgIH0gICAgICAgICAgICAKK30KKworcnVsZSBzZXR1cC10aHJlYWRpbmcgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIGdjYy5zZXR1cC10aHJlYWRpbmcgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKK30KKworcnVsZSBzZXR1cC1mcGljICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBnY2Muc2V0dXAtZnBpYyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworfQorCitydWxlIGNvbXBpbGUubSAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgTEFORyBvbiAkKDwpID0gIi14IG9iamVjdGl2ZS1jIiA7CisgICAgZ2NjLnNldHVwLWZwaWMgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBzZXR1cC1hZGRyZXNzLW1vZGVsICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7Cit9CisKK2FjdGlvbnMgY29tcGlsZS5tCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAkKExBTkcpICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCitydWxlIGNvbXBpbGUubW0gICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBMQU5HIG9uICQoPCkgPSAiLXggb2JqZWN0aXZlLWMrKyIgOworICAgIGdjYy5zZXR1cC1mcGljICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgICAgc2V0dXAtYWRkcmVzcy1tb2RlbCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworfQorCithY3Rpb25zIGNvbXBpbGUubW0KK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoTEFORykgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtYyAtbyAiJCg8KSIgIiQoPikiCit9CisKKyMgU2V0IHRoZSBtYXggaGVhZGVyIHBhZGRpbmcgdG8gYWxsb3cgcmVuYW1pbmcgb2YgbGlicyBmb3IgaW5zdGFsbGF0aW9uLgorZmxhZ3MgZGFyd2luLmxpbmsuZGxsIE9QVElPTlMgOiAtaGVhZGVycGFkX21heF9pbnN0YWxsX25hbWVzIDsKKworIyBUbyBsaW5rIHRoZSBzdGF0aWMgcnVudGltZSB3ZSBuZWVkIHRvIGxpbmsgdG8gYWxsIHRoZSBjb3JlIHJ1bnRpbWUgbGlicmFyaWVzLgorZmxhZ3MgZGFyd2luLmxpbmsgT1BUSU9OUyA8cnVudGltZS1saW5rPnN0YXRpYworICAgIDogLW5vZGVmYXVsdGxpYnMgLXNoYXJlZC1saWJnY2MgLWxzdGRjKystc3RhdGljIC1sZ2NjX2VoIC1sZ2NjIC1sU3lzdGVtIDsKKworIyBTdHJpcCBhcyBtdWNoIGFzIHBvc3NpYmxlIHdoZW4gb3B0aW1pemluZy4KK2ZsYWdzIGRhcndpbi5saW5rIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGVlZCA6IC1XbCwtZGVhZF9zdHJpcCAtbm9fZGVhZF9zdHJpcF9pbml0c19hbmRfdGVybXMgOworZmxhZ3MgZGFyd2luLmxpbmsgT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwYWNlIDogLVdsLC1kZWFkX3N0cmlwIC1ub19kZWFkX3N0cmlwX2luaXRzX2FuZF90ZXJtcyA7CisKKyMgRHluYW1pYy9zaGFyZWQgbGlua2luZy4KK2ZsYWdzIGRhcndpbi5jb21waWxlIE9QVElPTlMgPGxpbms+c2hhcmVkIDogLWR5bmFtaWMgOworCisjIE1pc2Mgb3B0aW9ucy4KK2ZsYWdzIGRhcndpbi5jb21waWxlIE9QVElPTlMgOiAtZ2R3YXJmLTIgLWZleGNlcHRpb25zIDsKKyN+IGZsYWdzIGRhcndpbi5saW5rIE9QVElPTlMgOiAtZmV4Y2VwdGlvbnMgOworCisjIEFkZCB0aGUgZnJhbWV3b3JrIG5hbWVzIHRvIHVzZS4KK2ZsYWdzIGRhcndpbi5saW5rIEZSQU1FV09SSyA8ZnJhbWV3b3JrPiA7CisKKyMKK2ZsYWdzIGRhcndpbi5saW5rIEZPUkNFX0xPQUQgPGZvcmNlLWxvYWQ+IDsKKworIyBUaGlzIGlzIGZsYWcgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgdGhlIGxpbmsgc3RlcAorIyB1bmNvbW1lbnQgdG8gc2VlIHdoYXQgbGlidG9vbCBpcyBkb2luZyB1bmRlciB0aGUgaG9vZAorI34gZmxhZ3MgZGFyd2luLmxpbmsuZGxsIE9QVElPTlMgOiAtV2wsLXYgOworCisjIHNldCB1cCB0aGUgLUYgb3B0aW9uIHRvIGluY2x1ZGUgdGhlIHBhdGhzIHRvIGFueSBmcmFtZXdvcmtzIHVzZWQuCitsb2NhbCBydWxlIHByZXBhcmUtZnJhbWV3b3JrLXBhdGggKCB0YXJnZXQgKyApCit7CisgICAgIyBUaGUgLWZyYW1ld29yayBvcHRpb24gb25seSB0YWtlcyBiYXNlbmFtZSBvZiB0aGUgZnJhbWV3b3JrLgorICAgICMgVGhlIC1GIG9wdGlvbiBzcGVjaWZpZXMgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIGEgZnJhbWV3b3JrCisgICAgIyBpcyBzZWFyY2hlZCBmb3IuICBTbywgaWYgd2UgZmluZCA8ZnJhbWV3b3JrPiBmZWF0dXJlCisgICAgIyB3aXRoIHNvbWUgcGF0aCwgd2UgbmVlZCB0byBnZW5lcmF0ZSBwcm9wZXJ0eSAtRiBvcHRpb24uCisgICAgbG9jYWwgZnJhbWV3b3JrLXBhdGhzID0gWyBvbiAkKHRhcmdldCkgcmV0dXJuICQoRlJBTUVXT1JLOkQpIF0gOworCisgICAgIyBCZSBzdXJlIHRvIGdlbmVyYXRlIG5vIC1GIGlmIHRoZXJlJ3Mgbm8gcGF0aC4KKyAgICBmb3IgbG9jYWwgZnJhbWV3b3JrLXBhdGggaW4gJChmcmFtZXdvcmstcGF0aHMpCisgICAgeworICAgICAgICBpZiAkKGZyYW1ld29yay1wYXRoKSAhPSAiIgorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVdPUktfUEFUSCBvbiAkKHRhcmdldCkgKz0gLUYkKGZyYW1ld29yay1wYXRoKSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3J1bGUgbGluayAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgREVQRU5EUyAkKHRhcmdldHMpIDogWyBvbiAkKHRhcmdldHMpIHJldHVybiAkKEZPUkNFX0xPQUQpIF0gOworICAgIHNldHVwLWFkZHJlc3MtbW9kZWwgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBwcmVwYXJlLWZyYW1ld29yay1wYXRoICQoPCkgOworfQorCisjIE5vdGUgdGhhdCB1c2luZyBzdHJpcCB3aXRob3V0IGFueSBvcHRpb25zIHdhcyByZXBvcnRlZCB0byByZXN1bHQgaW4gYnJva2VuCisjIGJpbmFyaWVzLCBhdCBsZWFzdCBvbiBPUyBYIDEwLjUuNSwgc2VlOgorIyAgICBodHRwOi8vc3ZuLmJvb3N0Lm9yZy90cmFjL2Jvb3N0L3RpY2tldC8yMzQ3CisjIFNvIHdlIHBhc3MgLVMgLXguCithY3Rpb25zIGxpbmsgYmluZCBMSUJSQVJJRVMgRk9SQ0VfTE9BRAoreworICAgICIkKENPTkZJR19DT01NQU5EKSIgLUwiJChMSU5LUEFUSCkiIC1vICIkKDwpIiAiJCg+KSIgLVdsLC1mb3JjZV9sb2FkJChfKSIkKEZPUkNFX0xPQUQpIiAiJChMSUJSQVJJRVMpIiAtbCQoRklORExJQlMtU0EpIC1sJChGSU5ETElCUy1TVCkgJChGUkFNRVdPUktfUEFUSCkgLWZyYW1ld29yayQoXykkKEZSQU1FV09SSzpEPTpTPSkgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykKKyAgICAkKE5FRURfU1RSSVApIiQoLlNUUklQKSIgJChORUVEX1NUUklQKS1TICQoTkVFRF9TVFJJUCkteCAkKE5FRURfU1RSSVApIiQoPCkiCit9CisKK3J1bGUgbGluay5kbGwgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIHNldHVwLWFkZHJlc3MtbW9kZWwgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBwcmVwYXJlLWZyYW1ld29yay1wYXRoICQoPCkgOworfQorCithY3Rpb25zIGxpbmsuZGxsIGJpbmQgTElCUkFSSUVTCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAtZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgLWluc3RhbGxfbmFtZSAiJCg8OkIpJCg8OlMpIiAtTCIkKExJTktQQVRIKSIgLW8gIiQoPCkiICIkKD4pIiAiJChMSUJSQVJJRVMpIiAtbCQoRklORExJQlMtU0EpIC1sJChGSU5ETElCUy1TVCkgJChGUkFNRVdPUktfUEFUSCkgLWZyYW1ld29yayQoXykkKEZSQU1FV09SSzpEPTpTPSkgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykKK30KKworIyBXZSB1c2UgbGlidG9vbCBpbnN0ZWFkIG9mIGFyIHRvIHN1cHBvcnQgdW5pdmVyc2FsIGJpbmFyeSBsaW5raW5nCisjIFRPRE86IEZpbmQgYSB3YXkgdG8gdXNlIHRoZSB1bmRlcmx5aW5nIHRvb2xzLCBpLmUuIGxpcG8sIHRvIGRvIHRoaXMuCithY3Rpb25zIHBpZWNlbWVhbCBhcmNoaXZlCit7CisgICAgIiQoLkxJQlRPT0wpIiAtc3RhdGljIC1vICIkKDw6VCkiICAkKEFSRkxBR1MpICAiJCg+OlQpIgorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9kbWMuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9kbWMuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZjg3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2RtYy5qYW0KQEAgLTAsMCArMSwxMzQgQEAKKyMgRGlnaXRhbCBNYXJzIEMrKworCisjIChDKSBDb3B5cmlnaHQgQ2hyaXN0b2YgTWVlcndhbGQgMjAwMy4KKyMgKEMpIENvcHlyaWdodCBBbGVrc2V5IEd1cnRvdm95IDIwMDQuCisjIChDKSBDb3B5cmlnaHQgQXJqYW4gS25lcHBlciAyMDA2LgorIworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKyMgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIFRoZSBmb2xsb3dpbmcgIy8vIGxpbmUgd2lsbCBiZSB1c2VkIGJ5IHRoZSByZWdyZXNzaW9uIHRlc3QgdGFibGUgZ2VuZXJhdGlvbgorIyBwcm9ncmFtIGFzIHRoZSBjb2x1bW4gaGVhZGluZyBmb3IgSFRNTCB0YWJsZXMuIE11c3Qgbm90IGluY2x1ZGUgdmVyc2lvbiBudW1iZXIuCisjLy88YSBocmVmPSJodHRwOi8vd3d3LmRpZ2l0YWxtYXJzLmNvbS8iPkRpZ2l0YWw8YnI+TWFycyBDKys8L2E+CisKK2ltcG9ydCBmZWF0dXJlIGdlbmVyYXRvcnMgY29tbW9uIDsKK2ltcG9ydCB0b29sc2V0IDogZmxhZ3MgOworaW1wb3J0IHNlcXVlbmNlIHJlZ2V4IDsKKworZmVhdHVyZS5leHRlbmQgdG9vbHNldCA6IGRtYyA7CisKK3J1bGUgaW5pdCAoIHZlcnNpb24gPyA6IGNvbW1hbmQgKiA6IG9wdGlvbnMgKiApCit7CisgICAgbG9jYWwgY29uZGl0aW9uID0gWyBjb21tb24uY2hlY2staW5pdC1wYXJhbWV0ZXJzIGRtYyA6IHZlcnNpb24gJCh2ZXJzaW9uKSBdIDsKKyAgICAKKyAgICBsb2NhbCBjb21tYW5kID0gWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBkbWMgOiBkbWMgOiAkKGNvbW1hbmQpIF0gOworICAgIGNvbW1hbmQgPz0gZG1jIDsKKworICAgIGNvbW1vbi5oYW5kbGUtb3B0aW9ucyBkbWMgOiAkKGNvbmRpdGlvbikgOiAkKGNvbW1hbmQpIDogJChvcHRpb25zKSA7ICAgCisgICAgCisgICAgaWYgJChjb21tYW5kKQorICAgIHsKKyAgICAgICAgY29tbWFuZCA9IFsgY29tbW9uLmdldC1hYnNvbHV0ZS10b29sLXBhdGggJChjb21tYW5kWy0xXSkgXSA7CisgICAgfSAgIAorICAgIHJvb3QgPSAkKGNvbW1hbmQ6RCkgOyAgICAKKyAgICAKKyAgICBpZiAkKHJvb3QpCisgICAgeyAgICAgICAgCisgICAgICAgICMgRE1DIGxpbmtlciBpcyBzZW5zaXRpdmUgdGhlIHRoZSBkaXJlY3Rpb24gb2Ygc2xhc2hlcywgYW5kCisgICAgICAgICMgd29uJ3QgbGluayBpZiBmb3J3YXJkIHNsYXNoZXMgYXJlIHVzZWQgaW4gY29tbWFuZC4KKyAgICAgICAgcm9vdCA9IFsgc2VxdWVuY2Uuam9pbiBbIHJlZ2V4LnNwbGl0ICQocm9vdCkgIi8iIF0gOiAiXFwiIF0gOworICAgICAgICBmbGFncyBkbWMgLnJvb3QgJChjb25kaXRpb24pIDogJChyb290KVxcYmluXFwgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmbGFncyBkbWMgLnJvb3QgJChjb25kaXRpb24pIDogIiIgOworICAgIH0gICAgCit9CisKKworIyBEZWNsYXJlIGdlbmVyYXRvcnMKK2dlbmVyYXRvcnMucmVnaXN0ZXItbGlua2VyIGRtYy5saW5rIDogT0JKIFNFQVJDSEVEX0xJQiBTVEFUSUNfTElCIElNUE9SVF9MSUIgOiBFWEUgOiA8dG9vbHNldD5kbWMgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1saW5rZXIgZG1jLmxpbmsuZGxsIDogT0JKIFNFQVJDSEVEX0xJQiBTVEFUSUNfTElCIElNUE9SVF9MSUIgOiBTSEFSRURfTElCIElNUE9SVF9MSUIgOiA8dG9vbHNldD5kbWMgOworCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWFyY2hpdmVyIGRtYy5hcmNoaXZlIDogT0JKIDogU1RBVElDX0xJQiA6IDx0b29sc2V0PmRtYyA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgZG1jLmNvbXBpbGUuYysrIDogQ1BQIDogT0JKIDogPHRvb2xzZXQ+ZG1jIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBkbWMuY29tcGlsZS5jIDogQyA6IE9CSiA6IDx0b29sc2V0PmRtYyA7CisKKworIyBEZWNsYXJlIGZsYWdzCisjIGRtYyBvcHRsaW5rIGhhcyBzb21lIGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCBvZiBkZWJ1Zy1pbmZvIGluY2x1ZGVkLiBUaGVyZWZvcmUgb25seSBsaW5lbnVtYmVycyBhcmUgZW5hYmxlZCBpbiBkZWJ1ZyBidWlsZHMuCisjIGZsYWdzIGRtYy5jb21waWxlIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b24gOiAtZyA7CitmbGFncyBkbWMuY29tcGlsZSBPUFRJT05TIDxkZWJ1Zy1zeW1ib2xzPm9uIDogLWdsIDsKK2ZsYWdzIGRtYy5saW5rIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b24gOiAvQ08gL05PUEFDS0YgL0RFQlVHTEkgOworZmxhZ3MgZG1jLmxpbmsgT1BUSU9OUyA8ZGVidWctc3ltYm9scz5vZmYgOiAvUEFDS0YgOworCitmbGFncyBkbWMuY29tcGlsZSBPUFRJT05TIDxvcHRpbWl6YXRpb24+b2ZmIDogLVMgLW8rbm9uZSA7CitmbGFncyBkbWMuY29tcGlsZSBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BlZWQgOiAtbyt0aW1lIDsKK2ZsYWdzIGRtYy5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGFjZSA6IC1vK3NwYWNlIDsKK2ZsYWdzIGRtYy5jb21waWxlIE9QVElPTlMgPGV4Y2VwdGlvbi1oYW5kbGluZz5vbiA6IC1BZSA7CitmbGFncyBkbWMuY29tcGlsZSBPUFRJT05TIDxydHRpPm9uIDogLUFyIDsKKyMgRklYTUU6CisjIENvbXBpbGluZyBzb3VyY2VzIHRvIGJlIGxpbmtlZCBpbnRvIGEgc2hhcmVkIGxpYiAoZGxsKSB0aGUgLVdEIGNmbGFnIHNob3VsZCBiZSB1c2VkCisjIENvbXBpbGluZyBzb3VyY2VzIHRvIGJlIGxpbmtlZCBpbnRvIGEgc3RhdGljIGxpYiAobGliKSBvciBleGVjdXRhYmxlIHRoZSAtV0EgY2ZsYWcgc2hvdWxkIGJlIHVzZWQKKyMgQnV0IGZvciBzb21lIHJlYXNvbiB0aGUgLVdEIGNmbGFnIGlzIGFsd2F5cyBpbiB1c2UuCisjIGZsYWdzIGRtYy5jb21waWxlIE9QVElPTlMgPGxpbms+c2hhcmVkIDogLVdEIDsKKyMgZmxhZ3MgZG1jLmNvbXBpbGUgT1BUSU9OUyA8bGluaz5zdGF0aWMgOiAtV0EgOworCisjIE5vdGUgdGhhdCB0aGVzZSB0d28gb3B0aW9ucyBhY3R1YWxseSBpbXBseSBtdWx0aXRocmVhZGluZyBzdXBwb3J0IG9uIERNQworIyBiZWNhdXNlIHRoZXJlIGlzIG5vIHNpbmdsZS10aHJlYWRlZCBkeW5hbWljIHJ1bnRpbWUgbGlicmFyeS4gU3BlY2lmeWluZworIyA8dGhyZWFkaW5nPm11bHRpIHdvdWxkIGJlIGEgYmFkIGlkZWEsIHRob3VnaCwgYmVjYXVzZSBubyBvcHRpb24gd291bGQgYmUKKyMgbWF0Y2hlZCB3aGVuIHRoZSBidWlsZCB1c2VzIHRoZSBkZWZhdWx0IHNldHRpbmdzIG9mIDxydW50aW1lLWxpbms+ZHluYW1pYworIyBhbmQgPHRocmVhZGluZz5zaW5nbGUuCitmbGFncyBkbWMuY29tcGlsZSBPUFRJT05TIDxydW50aW1lLWRlYnVnZ2luZz5vZmYvPHJ1bnRpbWUtbGluaz5zaGFyZWQgOiAtTkQgOworZmxhZ3MgZG1jLmNvbXBpbGUgT1BUSU9OUyA8cnVudGltZS1kZWJ1Z2dpbmc+b24vPHJ1bnRpbWUtbGluaz5zaGFyZWQgOiAtTkQgOworCitmbGFncyBkbWMuY29tcGlsZSBPUFRJT05TIDxydW50aW1lLWRlYnVnZ2luZz5vZmYvPHJ1bnRpbWUtbGluaz5zdGF0aWMvPHRocmVhZGluZz5zaW5nbGUgOiA7CitmbGFncyBkbWMuY29tcGlsZSBPUFRJT05TIDxydW50aW1lLWRlYnVnZ2luZz5vbi88cnVudGltZS1saW5rPnN0YXRpYy88dGhyZWFkaW5nPnNpbmdsZSA6IDsKK2ZsYWdzIGRtYy5jb21waWxlIE9QVElPTlMgPHJ1bnRpbWUtZGVidWdnaW5nPm9mZi88cnVudGltZS1saW5rPnN0YXRpYy88dGhyZWFkaW5nPm11bHRpIDogLURfTVQgOworZmxhZ3MgZG1jLmNvbXBpbGUgT1BUSU9OUyA8cnVudGltZS1kZWJ1Z2dpbmc+b24vPHJ1bnRpbWUtbGluaz5zdGF0aWMvPHRocmVhZGluZz5tdWx0aSA6IC1EX01UIDsKKworZmxhZ3MgZG1jLmNvbXBpbGUgT1BUSU9OUyA6IDxjZmxhZ3M+IDsKK2ZsYWdzIGRtYy5jb21waWxlLmMrKyBPUFRJT05TIDogPGN4eGZsYWdzPiA7CisKK2ZsYWdzIGRtYy5jb21waWxlIERFRklORVMgOiA8ZGVmaW5lPiA7CitmbGFncyBkbWMuY29tcGlsZSBJTkNMVURFUyA6IDxpbmNsdWRlPiA7CisKK2ZsYWdzIGRtYy5saW5rIDxsaW5rZmxhZ3M+IDsKK2ZsYWdzIGRtYy5hcmNoaXZlIE9QVElPTlMgPGFyZmxhZ3M+IDsKKworZmxhZ3MgZG1jIExJQlBBVEggPGxpYnJhcnktcGF0aD4gOworZmxhZ3MgZG1jIExJQlJBUklFUyA8bGlicmFyeS1maWxlPiA7CitmbGFncyBkbWMgRklORExJQlMgPGZpbmQtbGlicmFyeS1zYT4gOworZmxhZ3MgZG1jIEZJTkRMSUJTIDxmaW5kLWxpYnJhcnktc3Q+IDsKKworYWN0aW9ucyB0b2dldGhlciBsaW5rIGJpbmQgTElCUkFSSUVTCit7CisgICAgIiQoLnJvb3QpbGluayIgJChPUFRJT05TKSAvTk9JIC9ERSAvWE4gIiQoPikiICwgIiQoPFsxXSkiICwsICQoTElCUkFSSUVTKSB1c2VyMzIubGliIGtlcm5lbDMyLmxpYiAiJChGSU5ETElCUzpTPS5saWIpIiAsICIkKDxbMl06QikuZGVmIgorfQorCithY3Rpb25zIHRvZ2V0aGVyIGxpbmsuZGxsIGJpbmQgTElCUkFSSUVTCit7CisgICAgZWNobyBMSUJSQVJZICIkKDxbMV0pIiA+ICQoPFsyXTpCKS5kZWYKKyAgICBlY2hvIERFU0NSSVBUSU9OICdBIExpYnJhcnknID4+ICQoPFsyXTpCKS5kZWYKKyAgICBlY2hvIEVYRVRZUEUgTlQgPj4gJCg8WzJdOkIpLmRlZgorICAgIGVjaG8gU1VCU1lTVEVNIFdJTkRPV1MgPj4gJCg8WzJdOkIpLmRlZgorICAgIGVjaG8gQ09ERQlFWEVDVVRFIFJFQUQgPj4gJCg8WzJdOkIpLmRlZgorICAgIGVjaG8gREFUQQlSRUFEIFdSSVRFID4+ICQoPFsyXTpCKS5kZWYKKyAgICAiJCgucm9vdClsaW5rIiAkKE9QVElPTlMpIC9OT0kgL0RFIC9YTiAvRU5UUlk6X0RsbE1haW5DUlRTdGFydHVwIC9JTVBMSUI6IiQoPFsyXSkiICIkKD4pIiAkKExJQlJBUklFUykgLCAiJCg8WzFdKSIgLCwgdXNlcjMyLmxpYiBrZXJuZWwzMi5saWIgIiQoRklORExJQlM6Uz0ubGliKSIgLCAiJCg8WzJdOkIpLmRlZiIKK30KKworYWN0aW9ucyBjb21waWxlLmMKK3sKKyAgICAiJCgucm9vdClkbWMiICAtYyAkKE9QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLW8iJCg8KSIgIiQoPikiCit9CisKK2FjdGlvbnMgY29tcGlsZS5jKysKK3sKKyAgICAiJCgucm9vdClkbWMiIC1jcHAgLWMgLUFiICQoT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtbyIkKDwpIiAiJCg+KSIKK30KKworYWN0aW9ucyB0b2dldGhlciBwaWVjZW1lYWwgYXJjaGl2ZQoreworICAgICIkKC5yb290KWxpYiIgJChPUFRJT05TKSAtYyAtbiAtcDI1NiAiJCg8KSIgIiQoPikiCit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2RvY3V0aWxzLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZG9jdXRpbHMuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzc1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2RvY3V0aWxzLmphbQpAQCAtMCwwICsxLDg1IEBACisjIENvcHlyaWdodCBEYXZpZCBBYnJhaGFtcyAyMDA0LiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QKKyMgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCisjIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIFN1cHBvcnQgZm9yIGRvY3V0aWxzIFJlU3RydWN0dXJlZFRleHQgcHJvY2Vzc2luZy4KKworaW1wb3J0IHR5cGUgOworaW1wb3J0IHNjYW5uZXIgOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IG9zIDsKK2ltcG9ydCBjb21tb24gOworaW1wb3J0IHRvb2xzZXQgOworaW1wb3J0IHBhdGggOworaW1wb3J0IGZlYXR1cmUgOiBmZWF0dXJlIDsKK2ltcG9ydCBwcm9wZXJ0eSA7CisKKy5pbml0aWFsaXplZCA9IDsKKwordHlwZS5yZWdpc3RlciBSZVNUIDogcnN0IDsKKworY2xhc3MgcnN0LXNjYW5uZXIgOiBjb21tb24tc2Nhbm5lcgoreworICAgIHJ1bGUgX19pbml0X18gKCBwYXRocyAqICkKKyAgICB7CisgICAgICAgIGNvbW1vbi1zY2FubmVyLl9faW5pdF9fIC4gJChwYXRocykgOworICAgIH0KKyAgICAKKyAgICBydWxlIHBhdHRlcm4gKCApCisgICAgeworICAgICAgICAgcmV0dXJuICJeWyAJXSpcXC5cXC5bIAldK2luY2x1ZGU6OlsgCV0rKFteCitdKykiCisgICAgICAgICJeWyAJXSpcXC5cXC5bIAldK2ltYWdlOjpbIAldKyhbXgorXSspIgorICAgICAgICAiXlsgCV0qXFwuXFwuWyAJXStmaWd1cmU6OlsgCV0rKFteCitdKykiCisgICAgICAgIDsKKyAgICB9Cit9CisKK3NjYW5uZXIucmVnaXN0ZXIgcnN0LXNjYW5uZXIgOiBpbmNsdWRlIDsKK3R5cGUuc2V0LXNjYW5uZXIgUmVTVCA6IHJzdC1zY2FubmVyIDsKKworZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCBkb2N1dGlscy5odG1sIDogUmVTVCA6IEhUTUwgOworCitydWxlIGluaXQgKCBkb2N1dGlscy1kaXIgPyA6IHRvb2xzLWRpciA/ICkKK3sKKyAgICBkb2N1dGlscy1kaXIgPz0gWyBtb2R1bGVzLnBlZWsgOiBET0NVVElMU19ESVIgXSA7CisgICAgdG9vbHMtZGlyID89ICQoZG9jdXRpbHMtZGlyKS90b29scyA7CisKKyAgICBpZiAhICQoLmluaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgLmluaXRpYWxpemVkID0gdHJ1ZSA7CisgICAgICAgIC5kb2N1dGlscy1kaXIgPSAkKGRvY3V0aWxzLWRpcikgOworICAgICAgICAudG9vbHMtZGlyID0gJCh0b29scy1kaXI6Uj0iIikgOworICAgICAgIAorICAgICAgICAuc2V0dXAgPSBbIAorICAgICAgICAgIGNvbW1vbi5wcmVwZW5kLXBhdGgtdmFyaWFibGUtY29tbWFuZCBQWVRIT05QQVRIIAorICAgICAgICAgICAgOiAkKC5kb2N1dGlscy1kaXIpICQoLmRvY3V0aWxzLWRpcikvZXh0cmFzIF0gOworCVJTVDJYWFggPSBbIGNvbW1vbi5maW5kLXRvb2wgcnN0Mmh0bWwgXSA7CisgICAgfQorfQorCitydWxlIGh0bWwgKCB0YXJnZXQgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICogICkKK3sKKyAgICBpZiAhIFsgb24gJCh0YXJnZXQpIHJldHVybiAkKFJTVDJYWFgpIF0KKyAgICB7CisgICAgICAgIGxvY2FsIHB5dGhvbi1jbWQgPSBbIHByb3BlcnR5LnNlbGVjdCA8cHl0aG9uLmludGVycHJldGVyPiA6ICQocHJvcGVydGllcykgXSA7CisgICAgICAgIFJTVDJYWFggb24gJCh0YXJnZXQpID0gJChweXRob24tY21kOkc9OkU9InB5dGhvbiIpICQoLnRvb2xzLWRpcikvcnN0Mmh0bWwucHkgOworICAgIH0KK30KKworCitmZWF0dXJlIGRvY3V0aWxzIDogOiBmcmVlIDsKK2ZlYXR1cmUgZG9jdXRpbHMtaHRtbCA6IDogZnJlZSA7CitmZWF0dXJlIGRvY3V0aWxzLWNtZCA6IDogZnJlZSA7Cit0b29sc2V0LmZsYWdzIGRvY3V0aWxzIENPTU1PTi1GTEFHUyA6IDxkb2N1dGlscz4gOwordG9vbHNldC5mbGFncyBkb2N1dGlscyBIVE1MLUZMQUdTIDogPGRvY3V0aWxzLWh0bWw+IDsKK3Rvb2xzZXQuZmxhZ3MgZG9jdXRpbHMgUlNUMlhYWCA6IDxkb2N1dGlscy1jbWQ+IDsKKyAgCithY3Rpb25zIGh0bWwKK3sKKyAgICAkKC5zZXR1cCkKKyAgICAiJChSU1QyWFhYKSIgJChDT01NT04tRkxBR1MpICQoSFRNTC1GTEFHUykgJCg+KSAkKDwpCit9CisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZG94eWdlbi1jb25maWcuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9kb3h5Z2VuLWNvbmZpZy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkMmNjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZG94eWdlbi1jb25maWcuamFtCkBAIC0wLDAgKzEsMTEgQEAKKyN+IENvcHlyaWdodCAyMDA1LCAyMDA2IFJlbmUgUml2ZXJhLgorI34gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorI34gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIEF1dG9tYXRpYyBjb25maWd1cmF0aW9uIGZvciBEb3h5Z2VuIHRvb2xzLiBUbyB1c2UsIGp1c3QgaW1wb3J0IHRoaXMgbW9kdWxlLgorCitpbXBvcnQgdG9vbHNldCA6IHVzaW5nIDsKKworRUNITyAid2FybmluZzogZG94eWdlbi1jb25maWcuamFtIGlzIGRlcHJlY2F0ZWQuIFVzZSAndXNpbmcgZG94eWdlbiA7JyBpbnN0ZWFkLiIgOworCit1c2luZyBkb3h5Z2VuIDsKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZG94eWdlbi5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2RveHlnZW4uamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTZjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2RveHlnZW4uamFtCkBAIC0wLDAgKzEsNzc1IEBACisjIENvcHlyaWdodCAyMDAzLCAyMDA0IERvdWdsYXMgR3JlZ29yCisjIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1IFZsYWRpbWlyIFBydXMKKyMgQ29weXJpZ2h0IDIwMDYgUmVuZSBSaXZlcmEKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBUaGlzIG1vZHVsZSBkZWZpbmVzIHJ1bGVzIHRvIGhhbmRsZSBnZW5lcmF0aW9uIG9mIHZhcmlvdXMgb3V0cHV0cyBmcm9tIHNvdXJjZQorIyBmaWxlcyBkb2N1bWVudGVkIHdpdGggZG94eWdlbiBjb21tZW50cy4gVGhlIHN1cHBvcnRlZCB0cmFuc2Zvcm1hdGlvbnMgYXJlOgorIworIyAqIFNvdXJjZSAtPiBEb3h5Z2VuIFhNTCAtPiBCb29zdEJvb2sgWE1MCisjICogU291cmNlIC0+IERveHlnZW4gSFRNTAorIworIyBUaGUgdHlwZSBvZiB0cmFuc2Zvcm1hdGlvbiBpcyBzZWxlY3RlZCBiYXNlZCBvbiB0aGUgdGFyZ2V0IHJlcXVlc3RlZC4gRm9yCisjIEJvb3N0Qm9vayBYTUwsIHRoZSBkZWZhdWx0LCBzcGVjaWZ5aW5nIGEgdGFyZ2V0IHdpdGggYW4gIi54bWwiIHN1ZmZpeCwgb3IgYW4KKyMgZW1wdHkgc3VmZml4LCB3aWxsIHByb2R1Y2UgYSA8dGFyZ2V0Pi54bWwgYW5kIDx0YXJnZXQ+LmJvb3N0Ym9vay4gRm9yIERveHlnZW4KKyMgSFRNTCBzcGVjaWZ5aW5nIGEgdGFyZ2V0IHdpdGggYW4gIi5odG1sIiBzdWZmaXggd2lsbCBwcm9kdWNlIGEgZGlyZWN0b3J5CisjIDx0YXJnZXQ+IHdpdGggdGhlIERveHlnZW4gaHRtbCBmaWxlcywgYW5kIGEgPHRhcmdldD4uaHRtbCBmaWxlIHJlZGlyZWN0aW5nIHRvCisjIHRoYXQgZGlyZWN0b3J5LgorCitpbXBvcnQgYWxpYXMgOworaW1wb3J0IGJvb3N0Ym9vayA7CitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgY29tbW9uIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBtYWtlIDsKK2ltcG9ydCBtb2R1bGVzIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBvcyA7CitpbXBvcnQgcGF0aCA7CitpbXBvcnQgcHJpbnQgOworaW1wb3J0IHByb2plY3QgOworaW1wb3J0IHByb3BlcnR5IDsKK2ltcG9ydCBzdGFnZSA7CitpbXBvcnQgdGFyZ2V0cyA7CitpbXBvcnQgdG9vbHNldCA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgdXRpbGl0eSA7CitpbXBvcnQgeHNsdHByb2MgOworaW1wb3J0IHZpcnR1YWwtdGFyZ2V0IDsKKworCisjIFVzZSB0byBzcGVjaWZ5IGV4dHJhIGNvbmZpZ3VyYXRpb24gcGFyYW10ZXJzLiBUaGVzZSBnZXQgdHJhbnNsYXRlZCBpbnRvIGEKKyMgZG94eWZpbGUgd2hpY2ggY29uZmlndXJlcyB0aGUgYnVpbGRpbmcgb2YgdGhlIGRvY3MuCitmZWF0dXJlLmZlYXR1cmUgZG94eWdlbjpwYXJhbSA6IDogZnJlZSA7CisKKyMgU3BlY2lmeSB0aGUgIjx4c2w6cGFyYW0+Ym9vc3QuZG94eWdlbi5oZWFkZXIucHJlZml4IiBYU0xUIG9wdGlvbi4KK2ZlYXR1cmUuZmVhdHVyZSBwcmVmaXggOiA6IGZyZWUgOworCisjIFNwZWNpZnkgdGhlICI8eHNsOnBhcmFtPmJvb3N0LmRveHlnZW4ucmVmdGl0bGUiIFhTTFQgb3B0aW9uLgorZmVhdHVyZS5mZWF0dXJlIHJlZnRpdGxlIDogOiBmcmVlIDsKKworIyBXaGljaCBwcm9jZXNzb3IgdG8gdXNlIGZvciB2YXJpb3VzIHRyYW5zbGF0aW9ucyBmcm9tIERveHlnZW4uCitmZWF0dXJlLmZlYXR1cmUgZG94eWdlbi5wcm9jZXNzb3IgOiB4c2x0cHJvYyBkb3hwcm9jIDogcHJvcGFnYXRlZCBpbXBsaWNpdCA7CisKKyMgVG8gZ2VuZXJhdGUsIG9yIG5vdCwgaW5kZXggc2VjdGlvbnMuCitmZWF0dXJlLmZlYXR1cmUgZG94eWdlbi5kb3hwcm9jLmluZGV4IDogbm8geWVzIDogcHJvcGFnYXRlZCBpbmNpZGVudGFsIDsKKworIyBUaGUgSUQgZm9yIHRoZSByZXN1bHRpbmcgQm9vc3RCb29rIHJlZmVyZW5jZSBzZWN0aW9uLgorZmVhdHVyZS5mZWF0dXJlIGRveHlnZW4uZG94cHJvYy5pZCA6IDogZnJlZSA7CisKKyMgVGhlIHRpdGxlIGZvciB0aGUgcmVzdWx0aW5nIEJvb3N0Qm9vayByZWZlcmVuY2Ugc2VjdGlvbi4KK2ZlYXR1cmUuZmVhdHVyZSBkb3h5Z2VuLmRveHByb2MudGl0bGUgOiA6IGZyZWUgOworCisjIExvY2F0aW9uIGZvciBpbWFnZXMgd2hlbiBnZW5lcmF0aW5nIFhNTAorZmVhdHVyZS5mZWF0dXJlIGRveHlnZW46eG1sLWltYWdlZGlyIDogOiBmcmVlIDsKKworIyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW50aXJlIGRpcmVjdG9yeSBzaG91bGQgYmUgZGVsZXRlZAorZmVhdHVyZS5mZWF0dXJlIGRveHlnZW4ucm1kaXIgOiBvZmYgb24gOiBvcHRpb25hbCBpbmNpZGVudGFsIDsKKworIyBEb3h5Z2VuIGNvbmZpZ3VyYXRpb24gaW5wdXQgZmlsZS4KK3R5cGUucmVnaXN0ZXIgRE9YWUZJTEUgOiBkb3h5ZmlsZSA7CisKKyMgRG94eWdlbiBYTUwgbXVsdGktZmlsZSBvdXRwdXQuCit0eXBlLnJlZ2lzdGVyIERPWFlHRU5fWE1MX01VTFRJRklMRSA6IHhtbC1kaXIgOiBYTUwgOworCisjIERveHlnZW4gWE1MIGNvYWxsZXNlZCBvdXRwdXQuCit0eXBlLnJlZ2lzdGVyIERPWFlHRU5fWE1MIDogZG94eWdlbiA6IFhNTCA7CisKKyMgRG94eWdlbiBIVE1MIG11bHRpZmlsZSBkaXJlY3RvcnkuCit0eXBlLnJlZ2lzdGVyIERPWFlHRU5fSFRNTF9NVUxUSUZJTEUgOiBodG1sLWRpciA6IEhUTUwgOworCisjIFJlZGlyZWN0aW9uIEhUTUwgZmlsZSB0byBIVE1MIG11bHRpZmlsZSBkaXJlY3RvcnkuCit0eXBlLnJlZ2lzdGVyIERPWFlHRU5fSFRNTCA6IDogSFRNTCA7CisKK3R5cGUucmVnaXN0ZXIgRE9YWUdFTl9YTUxfSU1BR0VTIDogZG94eWdlbi14bWwtaW1hZ2VzIDsKKworCisjIEluaXRpYWxpemUgdGhlIERveHlnZW4gbW9kdWxlLiBQYXJhbWV0ZXJzIGFyZToKKyMgICBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgJ2RveHlnZW4nIGV4ZWN1dGFibGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lCisjICAgICAgICAgJ2RveHlnZW4nIHdpbGwgYmUgdXNlZAorIworcnVsZSBpbml0ICggbmFtZSA/ICkKK3sKKyAgICBpZiAhICQoLmluaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgLmluaXRpYWxpemVkID0gdHJ1ZSA7CisKKyAgICAgICAgLmRveHByb2MgPSBbIG1vZHVsZXMuYmluZGluZyAkKF9fbmFtZV9fKSBdIDsKKyAgICAgICAgLmRveHByb2MgPSAkKC5kb3hwcm9jOkQpL2RveHByb2MucHkgOworCisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXItY29tcG9zaW5nIGRveHlnZW4uaGVhZGVycy10by1kb3h5ZmlsZQorICAgICAgICAgICAgOiBIIEhQUCBDUFAgOiBET1hZRklMRSA7CisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXItc3RhbmRhcmQgZG94eWdlbi5ydW4KKyAgICAgICAgICAgIDogRE9YWUZJTEUgOiBET1hZR0VOX1hNTF9NVUxUSUZJTEUgOworICAgICAgICBnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIGRveHlnZW4ueG1sLWRpci10by1ib29zdGJvb2sKKyAgICAgICAgICAgIDogRE9YWUdFTl9YTUxfTVVMVElGSUxFIDogQk9PU1RCT09LIDogPGRveHlnZW4ucHJvY2Vzc29yPmRveHByb2MgOworICAgICAgICBnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIGRveHlnZW4ueG1sLXRvLWJvb3N0Ym9vaworICAgICAgICAgICAgOiBET1hZR0VOX1hNTCA6IEJPT1NUQk9PSyA6IDxkb3h5Z2VuLnByb2Nlc3Nvcj54c2x0cHJvYyA7CisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXItc3RhbmRhcmQgZG94eWdlbi5jb2xsZWN0CisgICAgICAgICAgICA6IERPWFlHRU5fWE1MX01VTFRJRklMRSA6IERPWFlHRU5fWE1MIDsKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCBkb3h5Z2VuLnJ1bgorICAgICAgICAgICAgOiBET1hZRklMRSA6IERPWFlHRU5fSFRNTF9NVUxUSUZJTEUgOworICAgICAgICBnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIGRveHlnZW4uaHRtbC1yZWRpcmVjdAorICAgICAgICAgICAgOiBET1hZR0VOX0hUTUxfTVVMVElGSUxFIDogRE9YWUdFTl9IVE1MIDsKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCBkb3h5Z2VuLmNvcHktbGF0ZXgtcG5ncworICAgICAgICAgICAgOiBET1hZR0VOX0hUTUwgOiBET1hZR0VOX1hNTF9JTUFHRVMgOworCisgICAgICAgIElNUE9SVCAkKF9fbmFtZV9fKSA6IGRveHlnZW4gOiA6IGRveHlnZW4gOworICAgIH0KKworICAgIGlmICQobmFtZSkKKyAgICB7CisgICAgICAgIG1vZGlmeS1jb25maWcgOworICAgICAgICAuZG94eWdlbiA9ICQobmFtZSkgOworICAgICAgICBjaGVjay1kb3h5Z2VuIDsKKyAgICB9CisKKyAgICBpZiAhICQoLmRveHlnZW4pCisgICAgeworICAgICAgICBjaGVjay1kb3h5Z2VuIDsKKyAgICB9Cit9CisKKworbG9jYWwgcnVsZSBmcmVlemUtY29uZmlnICggKQoreworICAgIGlmICEgJCguaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgZG94eWdlbiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4gOworICAgIH0KKyAgICBpZiAhICQoLmNvbmZpZy1mcm96ZW4pCisgICAgeworICAgICAgICAuY29uZmlnLWZyb3plbiA9IHRydWUgOworICAgICAgICBpZiBbIC5pcy1jeWd3aW4gXQorICAgICAgICB7CisgICAgICAgICAgICAuaXMtY3lnd2luID0gdHJ1ZSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworbG9jYWwgcnVsZSBtb2RpZnktY29uZmlnICggKQoreworICAgIGlmICQoLmNvbmZpZy1mcm96ZW4pCisgICAgeworICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgIkNhbm5vdCBjaGFuZ2UgZG94eWdlbiBhZnRlciBpdCBoYXMgYmVlbiB1c2VkLiIgOworICAgIH0KK30KKworCitsb2NhbCBydWxlIGNoZWNrLWRveHlnZW4gKCApCit7CisgICAgaWYgLS1kZWJ1Zy1jb25maWd1cmF0aW9uIGluIFsgbW9kdWxlcy5wZWVrIDogQVJHViBdCisgICAgeworICAgICAgICBFQ0hPICJub3RpY2U6IiB1c2luZyBkb3h5Z2VuICI6IiAkKC5kb3h5Z2VuKSA7CisgICAgfQorICAgIGxvY2FsIGV4dHJhLXBhdGhzIDsKKyAgICBpZiBbIG9zLm5hbWUgXSA9IE5UCisgICAgeworICAgICAgICBsb2NhbCBQcm9ncmFtRmlsZXMgPSBbIG1vZHVsZXMucGVlayA6IFByb2dyYW1GaWxlcyBdIDsKKyAgICAgICAgaWYgJChQcm9ncmFtRmlsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4dHJhLXBhdGhzID0gIiQoUHJvZ3JhbUZpbGVzOko9ICkiIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4dHJhLXBhdGhzID0gIkM6XFxQcm9ncmFtIEZpbGVzIiA7CisgICAgICAgIH0KKyAgICB9CisgICAgLmRveHlnZW4gPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kIGRveHlnZW4gOiBkb3h5Z2VuIDogJCguZG94eWdlbikgOgorICAgICAgICAkKGV4dHJhLXBhdGhzKSBdIDsKK30KKworCitydWxlIG5hbWUgKCApCit7CisgICAgZnJlZXplLWNvbmZpZyA7CisgICAgcmV0dXJuICQoLmRveHlnZW4pIDsKK30KKworCitsb2NhbCBydWxlIC5pcy1jeWd3aW4gKCApCit7CisgICAgaWYgWyBvcy5vbi13aW5kb3dzIF0KKyAgICB7CisgICAgICAgIGxvY2FsIGZpbGUgPSBbIHBhdGgubWFrZSBbIG1vZHVsZXMuYmluZGluZyAkKF9fbmFtZV9fKSBdIF0gOworICAgICAgICBsb2NhbCBkaXIgPSBbIHBhdGgubmF0aXZlIFsgcGF0aC5qb2luIFsgcGF0aC5wYXJlbnQgJChmaWxlKSBdIGRveHlnZW4gXQorICAgICAgICAgICAgXSA7CisgICAgICAgIGxvY2FsIGNvbW1hbmQgPSBjZCBcIiQoZGlyKVwiICImJiIgXCIkKC5kb3h5Z2VuKVwiCisgICAgICAgICAgICB3aW5kb3dzLXBhdGhzLWNoZWNrLmRveHlmaWxlIDI+JjEgOworICAgICAgICBjb21tYW5kID0gJChjb21tYW5kOko9IiAiKSA7CisgICAgICAgIHJlc3VsdCA9IFsgU0hFTEwgJChjb21tYW5kKSBdIDsKKyAgICAgICAgaWYgWyBNQVRDSCAiKFBhcnNpbmcgZmlsZSAvKSIgOiAkKHJlc3VsdCkgXQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyBSdW5zIERveHlnZW4gb24gdGhlIGdpdmVuIERveHlnZW4gY29uZmlndXJhdGlvbiBmaWxlICh0aGUgc291cmNlKSB0byBnZW5lcmF0ZQorIyB0aGUgRG94eWdlbiBmaWxlcy4gVGhlIG91dHB1dCBpcyBkdW1wZWQgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbiB0aGUKKyMgRG94eWdlbiBjb25maWd1cmF0aW9uIGZpbGUsIG5vdCBhY2NvcmRpbmcgdG8gdGhlIHRhcmdldCEgQmVjYXVzZSBvZiB0aGlzLCB3ZQorIyBlc3NlbnRpYWxseSAidG91Y2giIHRoZSB0YXJnZXQgZmlsZSwgaW4gZWZmZWN0IG1ha2luZyBpdCBsb29rIGxpa2Ugd2UgaGF2ZQorIyByZWFsbHkgd3JpdHRlbiBzb21ldGhpbmcgdXNlZnVsIHRvIGl0LiBBbnlvbmUgdGhhdCB1c2VzIHRoaXMgYWN0aW9uIG11c3QgZGVhbAorIyB3aXRoIHRoaXMgYmVoYXZpb3IuCisjCithY3Rpb25zIGRveHlnZW4tYWN0aW9uCit7CisgICAgJChSTSkgIiQoKi5YTUwpIiAmICIkKE5BTUU6RT1kb3h5Z2VuKSIgIiQoPikiICYmIGVjaG8gIlN0YW1wZWQiID4gIiQoPCkiCit9CisKKworIyBSdW5zIHRoZSBQeXRob24gZG94cHJvYyBYTUwgcHJvY2Vzc29yLgorIworYWN0aW9ucyBkb3hwcm9jCit7CisgICAgcHl0aG9uICIkKERPWFBST0MpIiAiLS14bWxkaXI9JCg+KSIgIi0tb3V0cHV0PSQoPCkiICIkKE9QVElPTlMpIiAiLS1pZD0kKElEKSIgIi0tdGl0bGU9JChUSVRMRSkiCit9CisKKworcnVsZSB0cmFuc2xhdGUtcGF0aCAoIHBhdGggKQoreworICAgIGZyZWV6ZS1jb25maWcgOworICAgIGlmIFsgb3Mub24td2luZG93cyBdCisgICAgeworICAgICAgICBpZiBbIG9zLm5hbWUgXSA9IENZR1dJTgorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKC5pcy1jeWd3aW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICQocGF0aCkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAkKHBhdGg6VykgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJCguaXMtY3lnd2luKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hdGNoID0gWyBNQVRDSCBeKC4pOiguKikgOiAkKHBhdGgpIF0gOworICAgICAgICAgICAgICAgIGlmICQobWF0Y2gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gL2N5Z2RyaXZlLyQobWF0Y2hbMV0pJChtYXRjaFsyXTpUKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKHBhdGg6VCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gJChwYXRoKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuICQocGF0aCkgOworICAgIH0KK30KKworCisjIEdlbmVyYXRlcyBhIGRveHlnZW4gY29uZmlndXJhdGlvbiBmaWxlIChkb3h5ZmlsZSkgZ2l2ZW4gYSBzZXQgb2YgQysrIHNvdXJjZXMKKyMgYW5kIGEgcHJvcGVydHkgbGlzdCB0aGF0IG1heSBjb250YWluIDxkb3h5Z2VuOnBhcmFtPiBmZWF0dXJlcy4KKyMKK3J1bGUgaGVhZGVycy10by1kb3h5ZmlsZSAoIHRhcmdldCA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgbG9jYWwgdGV4dCA9ICIjIEdlbmVyYXRlZCBieSBCb29zdC5CdWlsZCB2ZXJzaW9uIDIiIDsKKworICAgIGxvY2FsIG91dHB1dC1kaXIgOworCisgICAgIyBUcmFuc2xhdGUgPGRveHlnZW46cGFyYW0+IGludG8gY29tbWFuZCBsaW5lIGZsYWdzLgorICAgIGZvciBsb2NhbCBwYXJhbSBpbiBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8ZG94eWdlbjpwYXJhbT4gOiAkKHByb3BlcnRpZXMpIF0KKyAgICB7CisgICAgICAgIGxvY2FsIG5hbWV2YWx1ZSA9IFsgTUFUQ0ggKFtePV0qKT0oLiopIDogJChwYXJhbSkgXSA7CisgICAgICAgIGlmICQobmFtZXZhbHVlWzFdKSA9IE9VVFBVVF9ESVJFQ1RPUlkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0LWRpciA9IFsgdHJhbnNsYXRlLXBhdGggWyB1dGlsaXR5LnVucXVvdGUgJChuYW1ldmFsdWVbMl0pIF0gXQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIHRleHQgKz0gIk9VVFBVVF9ESVJFQ1RPUlkgPSBcIiQob3V0cHV0LWRpcilcIiIgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGV4dCArPSAiJChuYW1ldmFsdWVbMV0pID0gJChuYW1ldmFsdWVbMl0pIiA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAhICQob3V0cHV0LWRpcikKKyAgICB7CisgICAgICAgIG91dHB1dC1kaXIgPSBbIHRyYW5zbGF0ZS1wYXRoIFsgb24gJCh0YXJnZXQpIHJldHVybiAkKExPQ0FURSkgXSBdIDsKKyAgICAgICAgdGV4dCArPSAiT1VUUFVUX0RJUkVDVE9SWSA9IFwiJChvdXRwdXQtZGlyKVwiIiA7CisgICAgfQorCisgICAgbG9jYWwgaGVhZGVycyA7CisgICAgZm9yIGxvY2FsIGhlYWRlciBpbiAkKHNvdXJjZXM6Rz0pCisgICAgeworICAgICAgICBoZWFkZXIgPSBbIHRyYW5zbGF0ZS1wYXRoICQoaGVhZGVyKSBdIDsKKyAgICAgICAgaGVhZGVycyArPSBcIiQoaGVhZGVyKVwiIDsKKyAgICB9CisKKyAgICAjIERveHlnZW4gZ2VuZXJhdGVzIExhVGV4IGJ5IGRlZmF1bHQuIFNvIGRpc2FibGUgaXQgdW5jb25kaXRpb25hbGx5LCBvciBhdAorICAgICMgbGVhc3QgdW50aWwgc29tZW9uZSBuZWVkcywgYW5kIGhlbmNlIHdyaXRlcyBzdXBwb3J0IGZvciwgTGFUZXggb3V0cHV0LgorICAgIHRleHQgKz0gIkdFTkVSQVRFX0xBVEVYID0gTk8iIDsKKyAgICB0ZXh0ICs9ICJJTlBVVCA9ICQoaGVhZGVyczpKPSApIiA7CisgICAgcHJpbnQub3V0cHV0ICQodGFyZ2V0KSBwbGFpbiA7CisgICAgcHJpbnQudGV4dCAkKHRleHQpIDogdHJ1ZSA7Cit9CisKKworIyBSdW4gRG94eWdlbi4gU2VlIGRveHlnZW4tYWN0aW9uIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJhbmdlIHByb3BlcnRpZXMgb2YKKyMgdGhpcyBydWxlLgorIworcnVsZSBydW4gKCB0YXJnZXQgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICogKQoreworICAgIGZyZWV6ZS1jb25maWcgOworICAgIGlmIDxkb3h5Z2VuLnJtZGlyPm9uIGluICQocHJvcGVydGllcykKKyAgICB7CisgICAgICAgIGxvY2FsIG91dHB1dC1kaXIgPSBbIHBhdGgubWFrZSBbIE1BVENICisgICAgICAgICAgICA8ZG94eWdlbjpwYXJhbT5PVVRQVVRfRElSRUNUT1JZPVwiPyhbXlwiXSopIDogJChwcm9wZXJ0aWVzKSBdIF0gOworICAgICAgICBsb2NhbCBodG1sLWRpciA9IFsgcGF0aC5tYWtlIFsgTUFUQ0ggPGRveHlnZW46cGFyYW0+SFRNTF9PVVRQVVQ9KC4qKSA6CisgICAgICAgICAgICAkKHByb3BlcnRpZXMpIF0gXSA7CisgICAgICAgIGlmICQob3V0cHV0LWRpcikgJiYgJChodG1sLWRpcikgJiYKKyAgICAgICAgICAgIFsgcGF0aC5nbG9iICQob3V0cHV0LWRpcikgOiAkKGh0bWwtZGlyKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIEhUTUxESVIgb24gJCh0YXJnZXQpID0gWyBwYXRoLm5hdGl2ZSBbIHBhdGguam9pbiAkKG91dHB1dC1kaXIpCisgICAgICAgICAgICAgICAgJChodG1sLWRpcikgXSBdIDsKKyAgICAgICAgICAgIHJtLWh0bWxkaXIgJCh0YXJnZXQpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBkb3h5Z2VuLWFjdGlvbiAkKHRhcmdldCkgOiAkKHNvdXJjZSkgOworICAgIE5BTUUgb24gJCh0YXJnZXQpID0gJCguZG94eWdlbikgOworICAgIFJNIG9uICQodGFyZ2V0KSA9IFsgbW9kdWxlcy5wZWVrIGNvbW1vbiA6IFJNIF0gOworICAgICouWE1MIG9uICQodGFyZ2V0KSA9IFsgcGF0aC5uYXRpdmUgWyBwYXRoLmpvaW4gWyBwYXRoLm1ha2UgWyBvbiAkKHRhcmdldCkKKyAgICAgICAgcmV0dXJuICQoTE9DQVRFKSBdIF0gJCh0YXJnZXQ6QjpTPSkgKi54bWwgXSBdIDsKK30KKworCitpZiBbIG9zLm5hbWUgXSA9IE5UCit7CisgICAgUk1ESVIgPSBybWRpciAvcyAvcSA7Cit9CitlbHNlCit7CisgICAgUk1ESVIgPSBybSAtcmYgOworfQorCithY3Rpb25zIHF1aWV0bHkgcm0taHRtbGRpcgoreworICAgICQoUk1ESVIpICQoSFRNTERJUikKK30KKworCisjIFRoZSBydWxlcyBiZWxvdyByZXF1aXJlIEJvb3N0Qm9vayBzdHlsZXNoZWV0cywgc28gd2UgbmVlZCBzb21lIGNvZGUgdG8gY2hlY2sKKyMgdGhhdCB0aGUgYm9vc3Rib29rIG1vZHVsZSBoYXMgYWN0dWFseSBiZWVuIGluaXRpYWxpemVkLgorIworcnVsZSBjaGVjay1ib29zdGJvb2sgKCApCit7CisgICAgaWYgISBbIG1vZHVsZXMucGVlayBib29zdGJvb2sgOiAuaW5pdGlhbGl6ZWQgXQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy51c2VyLWVycm9yCisgICAgICAgICAgICA6IFRoZSBib29zdGJvb2sgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZCB5b3UgaGF2ZSBhdHRlbXB0ZWQgdG8gdXNlCisgICAgICAgICAgICA6IHRoZSAnZG94eWdlbicgdG9vbHNldCwgd2hpY2ggcmVxdWlyZXMgQm9vc3RCb29rLCBidXQgbmV2ZXIKKyAgICAgICAgICAgIDogaW5pdGlhbGl6ZWQgQm9vc3RCb29rLgorICAgICAgICAgICAgOiBIaW50OiBhZGQgJ3VzaW5nIGJvb3N0Ym9vayA7JyB0byB5b3VyIHVzZXItY29uZmlnLmphbS4gOworICAgIH0KK30KKworCisjIENvbGxlY3QgdGhlIHNldCBvZiBEb3h5Z2VuIFhNTCBmaWxlcyBpbnRvIGEgc2luZ2xlIFhNTCBzb3VyY2UgZmlsZSB0aGF0IGNhbiBiZQorIyBoYW5kbGVkIGJ5IGFuIFhTTFQgcHJvY2Vzc29yLiBUaGUgc291cmNlIGlzIGNvbXBsZXRlbHkgaWdub3JlZCAoc2VlCisjIGRveHlnZW4tYWN0aW9uKSwgYmVjYXVzZSB0aGlzIGFjdGlvbiBwaWNrcyB1cCB0aGUgRG94eWdlbiBYTUwgaW5kZXggZmlsZSB4bWwvCisjIGluZGV4LnhtbC4gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbiBub3QgdGVhY2ggRG94eWdlbiB0byBhY3QgbGlrZSBhIE5PUk1BTAorIyBwcm9ncmFtIGFuZCB0YWtlIGEgIi1vIG91dHB1dC54bWwiIGFyZ3VtZW50IChncnJycikuIFRoZSB0YXJnZXQgb2YgdGhlCisjIGNvbGxlY3Rpb24gd2lsbCBiZSBhIHNpbmdsZSBEb3h5Z2VuIFhNTCBmaWxlLgorIworcnVsZSBjb2xsZWN0ICggdGFyZ2V0IDogc291cmNlIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBjaGVjay1ib29zdGJvb2sgOworICAgIGxvY2FsIGNvbGxlY3QteHNsLWRpcgorICAgICAgICA9IFsgcGF0aC5uYXRpdmUgWyBwYXRoLmpvaW4gWyBib29zdGJvb2sueHNsLWRpciBdIGRveHlnZW4gY29sbGVjdCBdIF0gOworICAgIGxvY2FsIHNvdXJjZS1wYXRoCisgICAgICAgID0gWyBwYXRoLm1ha2UgWyBvbiAkKHNvdXJjZSkgcmV0dXJuICQoTE9DQVRFKSBdIF0gOworICAgIGxvY2FsIGNvbGxlY3QtcGF0aAorICAgICAgICA9IFsgcGF0aC5yb290IFsgcGF0aC5qb2luICQoc291cmNlLXBhdGgpICQoc291cmNlOkIpIF0gWyBwYXRoLnB3ZCBdIF0gOworICAgIGxvY2FsIG5hdGl2ZS1wYXRoCisgICAgICAgID0gWyBwYXRoLm5hdGl2ZSAkKGNvbGxlY3QtcGF0aCkgXSA7CisgICAgbG9jYWwgcmVhbC1zb3VyY2UKKyAgICAgICAgPSBbIHBhdGgubmF0aXZlIFsgcGF0aC5qb2luICQoY29sbGVjdC1wYXRoKSBpbmRleC54bWwgXSBdIDsKKyAgICB4c2x0cHJvYy54c2x0ICQodGFyZ2V0KSA6ICQocmVhbC1zb3VyY2UpICQoY29sbGVjdC14c2wtZGlyOlM9LnhzbCkKKyAgICAgICAgOiA8eHNsOnBhcmFtPmRveHlnZW4ueG1sLnBhdGg9JChuYXRpdmUtcGF0aCkgOworfQorCisKKyMgVHJhbnNsYXRlIERveHlnZW4gWE1MIGludG8gQm9vc3RCb29rLgorIworcnVsZSB4bWwtdG8tYm9vc3Rib29rICggdGFyZ2V0IDogc291cmNlIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBjaGVjay1ib29zdGJvb2sgOworICAgIGxvY2FsIHhzbC1kaXIgPSBbIGJvb3N0Ym9vay54c2wtZGlyIF0gOworICAgIGxvY2FsIGQyYi14c2wgPSBbIHBhdGgubmF0aXZlIFsgcGF0aC5qb2luIFsgYm9vc3Rib29rLnhzbC1kaXIgXSBkb3h5Z2VuCisgICAgICAgIGRveHlnZW4yYm9vc3Rib29rLnhzbCBdIF0gOworCisgICAgbG9jYWwgeHNsdC1wcm9wZXJ0aWVzID0gJChwcm9wZXJ0aWVzKSA7CisgICAgZm9yIGxvY2FsIHByZWZpeCBpbiBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8cHJlZml4PiA6ICQocHJvcGVydGllcykgXQorICAgIHsKKyAgICAgICAgeHNsdC1wcm9wZXJ0aWVzICs9ICI8eHNsOnBhcmFtPmJvb3N0LmRveHlnZW4uaGVhZGVyLnByZWZpeD0kKHByZWZpeCkiIDsKKyAgICB9CisgICAgZm9yIGxvY2FsIHRpdGxlIGluIFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxyZWZ0aXRsZT4gOiAkKHByb3BlcnRpZXMpIF0KKyAgICB7CisgICAgICAgIHhzbHQtcHJvcGVydGllcyArPSAiPHhzbDpwYXJhbT5ib29zdC5kb3h5Z2VuLnJlZnRpdGxlPSQodGl0bGUpIiA7CisgICAgfQorCisgICAgeHNsdHByb2MueHNsdCAkKHRhcmdldCkgOiAkKHNvdXJjZSkgJChkMmIteHNsKSA6ICQoeHNsdC1wcm9wZXJ0aWVzKSA7Cit9CisKKwordG9vbHNldC5mbGFncyBkb3h5Z2VuLnhtbC1kaXItdG8tYm9vc3Rib29rIE9QVElPTlMgPGRveHlnZW4uZG94cHJvYy5pbmRleD55ZXMgOgorICAgIC0tZW5hYmxlLWluZGV4IDsKK3Rvb2xzZXQuZmxhZ3MgZG94eWdlbi54bWwtZGlyLXRvLWJvb3N0Ym9vayBJRCA8ZG94eWdlbi5kb3hwcm9jLmlkPiA7Cit0b29sc2V0LmZsYWdzIGRveHlnZW4ueG1sLWRpci10by1ib29zdGJvb2sgVElUTEUgPGRveHlnZW4uZG94cHJvYy50aXRsZT4gOworCisKK3J1bGUgeG1sLWRpci10by1ib29zdGJvb2sgKCB0YXJnZXQgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICogKQoreworICAgIERPWFBST0Mgb24gJCh0YXJnZXQpID0gJCguZG94cHJvYykgOworICAgIExPQ0FURSBvbiAkKHNvdXJjZTpTPSkgPSBbIG9uICQoc291cmNlKSByZXR1cm4gJChMT0NBVEUpIF0gOworICAgIGRveHlnZW4uZG94cHJvYyAkKHRhcmdldCkgOiAkKHNvdXJjZTpTPSkgOworfQorCisKKyMgR2VuZXJhdGUgdGhlIEhUTUwgcmVkaXJlY3QgdG8gSFRNTCBkaXIgaW5kZXguaHRtbCBmaWxlLgorIworcnVsZSBodG1sLXJlZGlyZWN0ICggdGFyZ2V0IDogc291cmNlIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NhbCB1cmkgPSAiJCh0YXJnZXQ6QikvaW5kZXguaHRtbCIgOworICAgIHByaW50Lm91dHB1dCAkKHRhcmdldCkgcGxhaW4gOworICAgIHByaW50LnRleHQKKyI8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiCisgICAgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkXCI+Cis8aHRtbCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PVwicmVmcmVzaFwiIGNvbnRlbnQ9XCIwOyBVUkw9JCh1cmkpXCIgLz4KKworICA8dGl0bGU+PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisgIEF1dG9tYXRpYyByZWRpcmVjdGlvbiBmYWlsZWQsIHBsZWFzZSBnbyB0byA8YSBocmVmPQorICBcIiQodXJpKVwiPiQodXJpKTwvYT4uCis8L2JvZHk+Cis8L2h0bWw+CisiCisgICAgICAgIDogdHJ1ZSA7Cit9CisKK3J1bGUgY29weS1sYXRleC1wbmdzICggdGFyZ2V0IDogc291cmNlIDogcmVxdWlyZW1lbnRzICogKQoreworICAgIGxvY2FsIGRpcmVjdG9yeSA9IFsgcGF0aC5uYXRpdmUgWyBmZWF0dXJlLmdldC12YWx1ZXMgPGRveHlnZW46eG1sLWltYWdlZGlyPgorICAgICAgICA6ICQocmVxdWlyZW1lbnRzKSBdIF0gOworICAgIGxvY2FsIGxvY2F0aW9uID0gWyBvbiAkKHRhcmdldCkgcmV0dXJuICQoTE9DQVRFKSBdIDsKKworICAgIGxvY2FsIHBkZi1sb2NhdGlvbiA9IFsgcGF0aC5uYXRpdmUgWyBwYXRoLmpvaW4gWyBwYXRoLm1ha2UgJChsb2NhdGlvbikgXQorICAgICAgICBbIHBhdGgubWFrZSAkKGRpcmVjdG9yeSkgXSBdIF0gOworICAgIGxvY2FsIGh0bWwtbG9jYXRpb24gPSBbIHBhdGgubmF0aXZlIFsgcGF0aC5qb2luIC4gaHRtbCBbIHBhdGgubWFrZQorICAgICAgICAkKGRpcmVjdG9yeSkgXSBdIF0gOworCisgICAgY29tbW9uLk1rRGlyICQocGRmLWxvY2F0aW9uKSA7CisgICAgY29tbW9uLk1rRGlyICQoaHRtbC1sb2NhdGlvbikgOworCisgICAgREVQRU5EUyAkKHRhcmdldCkgOiAkKHBkZi1sb2NhdGlvbikgJChodG1sLWxvY2F0aW9uKSA7CisKKyAgICBpZiBbIG9zLm5hbWUgXSA9IE5UCisgICAgeworICAgICAgICBDUCBvbiAkKHRhcmdldCkgPSBjb3B5IC95IDsKKyAgICAgICAgRlJPTSBvbiAkKHRhcmdldCkgPSBcXCoucG5nIDsKKyAgICAgICAgVE9IVE1MIG9uICQodGFyZ2V0KSA9IC5cXGh0bWxcXCQoZGlyZWN0b3J5KSA7CisgICAgICAgIFRPUERGIG9uICQodGFyZ2V0KSA9IFxcJChkaXJlY3RvcnkpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1Agb24gJCh0YXJnZXQpID0gY3AgOworICAgICAgICBGUk9NIG9uICQodGFyZ2V0KSA9IC8qLnBuZyA7CisgICAgICAgIFRPSFRNTCBvbiAkKHRhcmdldCkgPSAuL2h0bWwvJChkaXJlY3RvcnkpIDsKKyAgICAgICAgVE9QREYgb24gJCh0YXJnZXQpID0gJCh0YXJnZXQ6RCkvJChkaXJlY3RvcnkpIDsKKyAgICB9Cit9CisKK2FjdGlvbnMgY29weS1sYXRleC1wbmdzCit7CisgICAgJChDUCkgJCg+OlM9KSQoRlJPTSkgJChUT0hUTUwpCisgICAgJChDUCkgJCg+OlM9KSQoRlJPTSkgJCg8OkQpJChUT1BERikKKyAgICBlY2hvICJTdGFtcGVkIiA+ICIkKDwpIgorfQorCisKKyMgQnVpbGRpbmcgbGF0ZXggaW1hZ2VzIGZvciBkb3h5Z2VuIFhNTCBkZXBlbmRzIG9uIGxhdGV4LCBkdmlwcywgYW5kIGdzIGJlaW5nIGluCisjIHlvdXIgUEFUSC4gVGhpcyBpcyB0cnVlIGZvciBtb3N0IFVuaXggaW5zdGFsbHMsIGJ1dCBub3Qgb24gV2luMzIsIHdoZXJlIHlvdQorIyB3aWxsIG5lZWQgdG8gaW5zdGFsbCBNa1RleCBhbmQgR2hvc3RzY3JpcHQgYW5kIGFkZCB0aGVzZSB0b29scyB0byB5b3VyIHBhdGguCisKK2FjdGlvbnMgY2hlY2stbGF0ZXgKK3sKKyAgICBsYXRleCAtdmVyc2lvbiA+JCg8KQorfQorCithY3Rpb25zIGNoZWNrLWR2aXBzCit7CisgICAgZHZpcHMgLXZlcnNpb24gPiQoPCkKK30KKworaWYgWyBvcy5uYW1lIF0gPSAiTlQiCit7CisgICAgYWN0aW9ucyBjaGVjay1ncworICAgIHsKKyAgICAgICAgZ3N3aW4zMmMgLXZlcnNpb24gPiQoPCkKKyAgICB9Cit9CitlbHNlCit7CisgICAgYWN0aW9ucyBjaGVjay1ncworICAgIHsKKyAgICAgICAgZ3MgLXZlcnNpb24gPiQoPCkKKyAgICB9Cit9CisKKworbG9jYWwgcnVsZSBjaGVjay10b29scy10YXJnZXRzICggcHJvamVjdCApCit7CisgICAgaWYgISAkKC5jaGVjay10b29scy10YXJnZXRzKQorICAgIHsKKyAgICAgICAgIyBGaW5kIHRoZSByb290IHByb2plY3QuCisgICAgICAgICMKKyAgICAgICAgIyBUaGlzIGlzIGEgYmVzdCBlZmZvcnQgYXR0ZW1wdCB0byBhdm9pZCB1c2luZyBkaWZmZXJlbnQgbG9jYXRpb25zIGZvcgorICAgICAgICAjIHN0b3JpbmcgKi5jaGVjayBmaWxlcyBkZXBlbmRpbmcgb24gd2hpY2ggcHJvamVjdCBpbXBvcnRlZCB0aGUgZG94eWdlbgorICAgICAgICAjIHRvb2xzZXQgZmlyc3QuIFRoZSBmaWxlcyBhcmUgc3RvcmVkIGluIGEgbG9jYXRpb24gcmVsYXRlZCB0byB0aGUKKyAgICAgICAgIyBwcm9qZWN0J3Mgcm9vdCBwcm9qZWN0LiBOb3RlIHRoYXQgdGhpcyBsb2NhdGlvbiBtYXkgY2hhbmdlIGRlcGVuZGluZworICAgICAgICAjIG9uIHRoZSBmb2xkZXIgdGhlIGJ1aWxkIHdhcyBydW4gZnJvbSBpbiBjYXNlIHRoZSBidWlsZCB1c2VzIG11bHRpcGxlCisgICAgICAgICMgcmVsYXRlZCBwcm9qZWN0cyB3aXRoIHRoZWlyIG93biBKYW1yb290IHNlcGFyYXRlIG1vZHVsZXMuCisgICAgICAgIGxvY2FsIHByb2plY3QtbW9kdWxlID0gWyAkKHByb2plY3QpLnByb2plY3QtbW9kdWxlIF0gOworICAgICAgICBsb2NhbCByb290LW1vZHVsZSA9IFsgcHJvamVjdC5nZXQtamFtcm9vdC1tb2R1bGUgJChwcm9qZWN0LW1vZHVsZSkgXSA7CisgICAgICAgIGlmICEgJChyb290LW1vZHVsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICBpZiBbIHByb2plY3QuaXMtY29uZmlnLW1vZHVsZSAkKHByb2plY3QtbW9kdWxlKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgZG94eWdlbiB0YXJnZXRzIGNhbiBub3QgYmUgZGVjbGFyZWQgaW4gQm9vc3QKKyAgICAgICAgICAgICAgICAgICAgQnVpbGQncyBjb25maWd1cmF0aW9uIG1vZHVsZXMuIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMudXNlci1lcnJvciBkb3h5Z2VuIHRhcmdldHMgY2FuIG5vdCBiZSBkZWNsYXJlZCBpbgorICAgICAgICAgICAgICAgICAgICBzdGFuZGFsb25lIHByb2plY3RzLiA6IHVzZSBhIEphbWZpbGUvSmFtcm9vdCBwcm9qZWN0CisgICAgICAgICAgICAgICAgICAgIGluc3RlYWQuIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2NhbCByb290LXByb2plY3QgPSBbIHByb2plY3QudGFyZ2V0ICQocm9vdC1tb2R1bGUpIF0gOworCisgICAgICAgIGxvY2FsIHRhcmdldHMgPQorICAgICAgICAgICAgWyBuZXcgZmlsZS10YXJnZXQgbGF0ZXguY2hlY2sgOiA6ICQocm9vdC1wcm9qZWN0KSA6IFsgbmV3IGFjdGlvbiA6CisgICAgICAgICAgICAgICAgZG94eWdlbi5jaGVjay1sYXRleCBdIF0KKyAgICAgICAgICAgIFsgbmV3IGZpbGUtdGFyZ2V0IGR2aXBzLmNoZWNrIDogOiAkKHJvb3QtcHJvamVjdCkgOiBbIG5ldyBhY3Rpb24gOgorICAgICAgICAgICAgICAgIGRveHlnZW4uY2hlY2stZHZpcHMgXSBdCisgICAgICAgICAgICBbIG5ldyBmaWxlLXRhcmdldCBncy5jaGVjayA6IDogJChyb290LXByb2plY3QpIDogWyBuZXcgYWN0aW9uIDoKKyAgICAgICAgICAgICAgICBkb3h5Z2VuLmNoZWNrLWdzIF0gXSA7CisKKyAgICAgICAgZm9yIGxvY2FsIHRhcmdldCBpbiAkKHRhcmdldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC5jaGVjay10b29scy10YXJnZXRzICs9IFsgdmlydHVhbC10YXJnZXQucmVnaXN0ZXIgJCh0YXJnZXQpIF0gOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKC5jaGVjay10b29scy10YXJnZXRzKSA7Cit9CisKKworcHJvamVjdC5pbml0aWFsaXplICQoX19uYW1lX18pIDsKK3Byb2plY3QgZG94eWdlbiA7CisKK2NsYXNzIGRveHlnZW4tY2hlY2stdG9vbHMtdGFyZ2V0LWNsYXNzIDogYmFzaWMtdGFyZ2V0Cit7CisgICAgcnVsZSBjb25zdHJ1Y3QgKCBuYW1lIDogc291cmNlcyAqIDogcHJvcGVydHktc2V0ICkKKyAgICB7CisgICAgICAgIElNUE9SVCBkb3h5Z2VuIDogY2hlY2stdG9vbHMtdGFyZ2V0cyA6ICQoX19uYW1lX18pIDoKKyAgICAgICAgICAgIGRveHlnZW4uY2hlY2stdG9vbHMtdGFyZ2V0cyA7CisgICAgICAgIHJldHVybiBbIHByb3BlcnR5LXNldC5lbXB0eSBdIFsgZG94eWdlbi5jaGVjay10b29scy10YXJnZXRzIFsgcHJvamVjdCBdCisgICAgICAgICAgICBdIDsKKyAgICB9Cit9CisKKworIyBEZWNsYXJlcyBhIG1ldGF0YXJnZXQgZm9yIGNvbGxlY3RpbmcgdmVyc2lvbiBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgZXh0ZXJuYWwKKyMgdG9vbHMgdXNlZCBpbiB0aGlzIG1vZHVsZS4KKyMKK3J1bGUgY2hlY2stdG9vbHMgKCB0YXJnZXQgKQoreworICAgIGZyZWV6ZS1jb25maWcgOworICAgIHRhcmdldHMuY3JlYXRlLW1ldGF0YXJnZXQgZG94eWdlbi1jaGVjay10b29scy10YXJnZXQtY2xhc3MgOgorICAgICAgICBbIHByb2plY3QuY3VycmVudCBdIDogJCh0YXJnZXQpIDsKK30KKworCisjIFVzZXItbGV2ZWwgcnVsZSB0byBnZW5lcmF0ZSBIVE1MIGZpbGVzIG9yIEJvb3N0Qm9vayBYTUwgZnJvbSBhIHNldCBvZiBoZWFkZXJzCisjIHZpYSBEb3h5Z2VuLgorIworcnVsZSBkb3h5Z2VuICggdGFyZ2V0IDogc291cmNlcyArIDogcmVxdWlyZW1lbnRzICogOiBkZWZhdWx0LWJ1aWxkICogOgorICAgIHVzYWdlLXJlcXVpcmVtZW50cyAqICkKK3sKKyAgICBmcmVlemUtY29uZmlnIDsKKyAgICBsb2NhbCBwcm9qZWN0ID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7CisKKyAgICBpZiAkKHRhcmdldDpTKSA9IC5odG1sCisgICAgeworICAgICAgICAjIEJ1aWxkIGFuIEhUTUwgZGlyZWN0b3J5IGZyb20gdGhlIHNvdXJjZXMuCisgICAgICAgIGxvY2FsIGh0bWwtbG9jYXRpb24gPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8bG9jYXRpb24+IDogJChyZXF1aXJlbWVudHMpCisgICAgICAgICAgICBdIDsKKyAgICAgICAgbG9jYWwgb3V0cHV0LWRpciA7CisgICAgICAgIGlmIFsgJChwcm9qZWN0KS5nZXQgYnVpbGQtZGlyIF0KKyAgICAgICAgeworICAgICAgICAgICAgIyBFeHBsaWNpdGx5IHNwZWNpZmllZCBidWlsZCBkaXIuIEFkZCBodG1sIGF0IHRoZSBlbmQuCisgICAgICAgICAgICBvdXRwdXQtZGlyID0gWyBwYXRoLmpvaW4gWyAkKHByb2plY3QpLmJ1aWxkLWRpciBdCisgICAgICAgICAgICAgICAgJChodG1sLWxvY2F0aW9uOkU9aHRtbCkgXSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAjIFRyaW0gJ2JpbicgZnJvbSBpbXBsaWNpdCBidWlsZCBkaXIsIGZvciBubyBvdGhlciByZWFzb24gdGhhbgorICAgICAgICAgICAgIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgb3V0cHV0LWRpciA9IFsgcGF0aC5qb2luIFsgcGF0aC5wYXJlbnQgWyAkKHByb2plY3QpLmJ1aWxkLWRpciBdIF0KKyAgICAgICAgICAgICAgICAkKGh0bWwtbG9jYXRpb246RT1odG1sKSBdIDsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQtZGlyID0gWyBwYXRoLnJvb3QgJChvdXRwdXQtZGlyKSBbIHBhdGgucHdkIF0gXSA7CisgICAgICAgIGxvY2FsIG91dHB1dC1kaXItbmF0aXZlID0gWyBwYXRoLm5hdGl2ZSAkKG91dHB1dC1kaXIpIF0gOworICAgICAgICByZXF1aXJlbWVudHMgPSBbIHByb3BlcnR5LmNoYW5nZSAkKHJlcXVpcmVtZW50cykgOiA8bG9jYXRpb24+IF0gOworCisgICAgICAgICMgVGhlIGRveHlnZW4gY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAgICB0YXJnZXRzLmNyZWF0ZS10eXBlZC10YXJnZXQgRE9YWUZJTEUgOiAkKHByb2plY3QpIDogJCh0YXJnZXQ6Uz0udGFnKQorICAgICAgICAgICAgOiAkKHNvdXJjZXMpCisgICAgICAgICAgICA6ICQocmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgICAgIDxkb3h5Z2VuOnBhcmFtPkdFTkVSQVRFX0hUTUw9WUVTCisgICAgICAgICAgICAgICAgPGRveHlnZW46cGFyYW0+R0VORVJBVEVfWE1MPU5PCisgICAgICAgICAgICAgICAgPGRveHlnZW46cGFyYW0+Ik9VVFBVVF9ESVJFQ1RPUlk9XCIkKG91dHB1dC1kaXItbmF0aXZlKVwiIgorICAgICAgICAgICAgICAgIDxkb3h5Z2VuOnBhcmFtPkhUTUxfT1VUUFVUPSQodGFyZ2V0OkIpCisgICAgICAgICAgICA6ICQoZGVmYXVsdC1idWlsZCkgOworICAgICAgICAkKHByb2plY3QpLm1hcmstdGFyZ2V0LWFzLWV4cGxpY2l0ICQodGFyZ2V0OlM9LnRhZykgOworCisgICAgICAgICMgVGhlIGh0bWwgZGlyZWN0b3J5IHRvIGdlbmVyYXRlIGJ5IHJ1bm5pbmcgZG94eWdlbi4KKyAgICAgICAgdGFyZ2V0cy5jcmVhdGUtdHlwZWQtdGFyZ2V0IERPWFlHRU5fSFRNTF9NVUxUSUZJTEUgOiAkKHByb2plY3QpCisgICAgICAgICAgICA6ICQodGFyZ2V0OlM9LmRpcikgICMgTmFtZS4KKyAgICAgICAgICAgIDogJCh0YXJnZXQ6Uz0udGFnKSAgIyBTb3VyY2VzLgorICAgICAgICAgICAgOiAkKHJlcXVpcmVtZW50cykKKyAgICAgICAgICAgICAgICA8ZG94eWdlbjpwYXJhbT4iT1VUUFVUX0RJUkVDVE9SWT1cIiQob3V0cHV0LWRpci1uYXRpdmUpXCIiCisgICAgICAgICAgICAgICAgPGRveHlnZW46cGFyYW0+SFRNTF9PVVRQVVQ9JCh0YXJnZXQ6QikKKyAgICAgICAgICAgIDogJChkZWZhdWx0LWJ1aWxkKSA7CisgICAgICAgICQocHJvamVjdCkubWFyay10YXJnZXQtYXMtZXhwbGljaXQgJCh0YXJnZXQ6Uz0uZGlyKSA7CisKKyAgICAgICAgIyBUaGUgcmVkaXJlY3QgaHRtbCBmaWxlIGludG8gdGhlIGdlbmVyYXRlZCBodG1sLgorICAgICAgICB0YXJnZXRzLmNyZWF0ZS10eXBlZC10YXJnZXQgRE9YWUdFTl9IVE1MIDogJChwcm9qZWN0KSA6ICQodGFyZ2V0KQorICAgICAgICAgICAgOiAkKHRhcmdldDpTPS5kaXIpICAjIFNvdXJjZXMuCisgICAgICAgICAgICA6ICQocmVxdWlyZW1lbnRzKSA8bG9jYXRpb24+JChvdXRwdXQtZGlyKQorICAgICAgICAgICAgOiAkKGRlZmF1bHQtYnVpbGQpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgIyBCdWlsZCBhIEJvb3N0Qm9vayBYTUwgZmlsZSBmcm9tIHRoZSBzb3VyY2VzLgorICAgICAgICBsb2NhbCBsb2NhdGlvbi14bWwgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8bG9jYXRpb24+IDogJChyZXF1aXJlbWVudHMpIF0KKyAgICAgICAgICAgIDsKKyAgICAgICAgcmVxdWlyZW1lbnRzID0gWyBwcm9wZXJ0eS5jaGFuZ2UgJChyZXF1aXJlbWVudHMpIDogPGxvY2F0aW9uPiBdIDsKKyAgICAgICAgbG9jYWwgdGFyZ2V0LXhtbCA9ICQodGFyZ2V0OkI9JCh0YXJnZXQ6QikteG1sKSA7CisKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gYnVpbGQgaW1hZ2VzLgorICAgICAgICBsb2NhbCBpbWFnZXMtbG9jYXRpb24gPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8ZG94eWdlbjp4bWwtaW1hZ2VkaXI+IDoKKyAgICAgICAgICAgICQocmVxdWlyZW1lbnRzKSBdIDsKKyAgICAgICAgaWYgJChpbWFnZXMtbG9jYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgICMgUHJlcGFyZSBhIG1ldGF0YXJnZXQgZm9yIGNvbGxlY3RpbmcgdXNlZCBleHRlcm5hbCB0b29sIHZlcnNpb24KKyAgICAgICAgICAgICMgaW5mb3JtYXRpb24uIFdlIHVzZSBvbmx5IG9uZSBzdWNoIG1ldGF0YXJnZXQgYXMgdGhleSBhbHdheXMKKyAgICAgICAgICAgICMgcHJvZHVjZSB0aGUgc2FtZSBmaWxlcyBhbmQgd2UgZG8gbm90IHdhbnQgdG8gZGVhbCB3aXRoIG11bHRpcGxlCisgICAgICAgICAgICAjIG1ldGF0YXJnZXRzIGhhdmluZyBtYXRjaGluZyBuYW1lcywgY2F1c2luZyAnYW1iaWd1b3VzIHZhcmlhbnRzJworICAgICAgICAgICAgIyBlcnJvcnMuCisgICAgICAgICAgICBpZiAhICQoLmNoZWNrLXRvb2xzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgRklYTUU6IFNpbmNlIHdlIGhhdmUgdGhlIGNoZWNrLXRvb2xzIHRhcmdldCBvYmplY3QgcmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICMgc2VlIGhvdyB3ZSBjYW4gdXNlIHRoYXQgaW5zdGVhZCBvZiBoYXZpbmcgdG8gY29uc3RydWN0IGEgdmFsaWQKKyAgICAgICAgICAgICAgICAjIHRhcmdldCByZWZlcmVuY2Ugc3RyaW5nIGZvciB1c2UgaW4gPGRlcGVuZGVuY3k+IHByb3BlcnR5CisgICAgICAgICAgICAgICAgIyB2YWx1ZXMuCisgICAgICAgICAgICAgICAgbG9jYWwgcHJvamVjdC1pZCA9IC0tZG94eWdlbi5jaGVjay10b29scy1wcm9qZWN0LS0gOworICAgICAgICAgICAgICAgIGxvY2FsIHRhcmdldC1pZCA9IC0tZG94eWdlbi5jaGVjay10b29scy0tIDsKKyAgICAgICAgICAgICAgICBsb2NhbCBwbSA9IFsgJChwcm9qZWN0KS5wcm9qZWN0LW1vZHVsZSBdIDsKKyAgICAgICAgICAgICAgICBwcm9qZWN0LnJlZ2lzdGVyLWlkICQocHJvamVjdC1pZCkgOiAkKHBtKSA7CisgICAgICAgICAgICAgICAgY2hlY2stdG9vbHMgJCh0YXJnZXQtaWQpIDsKKyAgICAgICAgICAgICAgICAuY2hlY2stdG9vbHMgPSAvJChwcm9qZWN0LWlkKS8vJCh0YXJnZXQtaWQpIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZG94eWdlbiAkKHRhcmdldCkuZG94eWdlbi14bWwtaW1hZ2VzLmh0bWwgOiAkKHNvdXJjZXMpIDoKKyAgICAgICAgICAgICAgICAkKHJlcXVpcmVtZW50cykKKyAgICAgICAgICAgICAgICA8ZG94eWdlbi5ybWRpcj5vbgorICAgICAgICAgICAgICAgIDxkb3h5Z2VuOnBhcmFtPlFVSUVUPVlFUworICAgICAgICAgICAgICAgIDxkb3h5Z2VuOnBhcmFtPldBUk5JTkdTPU5PCisgICAgICAgICAgICAgICAgPGRveHlnZW46cGFyYW0+V0FSTl9JRl9VTkRPQ1VNRU5URUQ9Tk8KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4kKC5jaGVjay10b29scykgOworICAgICAgICAgICAgJChwcm9qZWN0KS5tYXJrLXRhcmdldC1hcy1leHBsaWNpdCAkKHRhcmdldCkuZG94eWdlbi14bWwtaW1hZ2VzLmh0bWwKKyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgICAgIHRhcmdldHMuY3JlYXRlLXR5cGVkLXRhcmdldCBET1hZR0VOX1hNTF9JTUFHRVMgOiAkKHByb2plY3QpCisgICAgICAgICAgICAgICAgOiAkKHRhcmdldCkuZG94eWdlbi14bWwtaW1hZ2VzICAjIE5hbWUuCisgICAgICAgICAgICAgICAgOiAkKHRhcmdldCkuZG94eWdlbi14bWwtaW1hZ2VzLmh0bWwgICMgU291cmNlcy4KKyAgICAgICAgICAgICAgICA6ICQocmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgICAgIDogJChkZWZhdWx0LWJ1aWxkKSA7CisgICAgICAgICAgICAkKHByb2plY3QpLm1hcmstdGFyZ2V0LWFzLWV4cGxpY2l0ICQodGFyZ2V0KS5kb3h5Z2VuLXhtbC1pbWFnZXMgOworCisgICAgICAgICAgICBpZiAhIFsgTUFUQ0ggKC8pJCA6ICQoaW1hZ2VzLWxvY2F0aW9uKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW1hZ2VzLWxvY2F0aW9uID0gJChpbWFnZXMtbG9jYXRpb24pLyA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcXVpcmVtZW50cyArPQorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PiQodGFyZ2V0KS5kb3h5Z2VuLXhtbC1pbWFnZXMKKyAgICAgICAgICAgICAgICA8eHNsOnBhcmFtPmJvb3N0LmRveHlnZW4uZm9ybXVsYWRpcj0kKGltYWdlcy1sb2NhdGlvbikgOworICAgICAgICB9CisKKyAgICAgICAgIyBUaGUgZG94eWdlbiBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICAgIHRhcmdldHMuY3JlYXRlLXR5cGVkLXRhcmdldCBET1hZRklMRSA6ICQocHJvamVjdCkgOiAkKHRhcmdldC14bWw6Uz0udGFnKQorICAgICAgICAgICAgOiAkKHNvdXJjZXMpCisgICAgICAgICAgICA6ICQocmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgICAgIDxkb3h5Z2VuOnBhcmFtPkdFTkVSQVRFX0hUTUw9Tk8KKyAgICAgICAgICAgICAgICA8ZG94eWdlbjpwYXJhbT5HRU5FUkFURV9YTUw9WUVTCisgICAgICAgICAgICAgICAgPGRveHlnZW46cGFyYW0+WE1MX09VVFBVVD0kKHRhcmdldC14bWwpCisgICAgICAgICAgICA6ICQoZGVmYXVsdC1idWlsZCkgOworICAgICAgICAkKHByb2plY3QpLm1hcmstdGFyZ2V0LWFzLWV4cGxpY2l0ICQodGFyZ2V0LXhtbDpTPS50YWcpIDsKKworICAgICAgICAjIFRoZSBEb3h5Z2VuIFhNTCBkaXJlY3RvcnkgZm9yIHRoZSBwcm9jZXNzZWQgc291cmNlIGZpbGVzLgorICAgICAgICB0YXJnZXRzLmNyZWF0ZS10eXBlZC10YXJnZXQgRE9YWUdFTl9YTUxfTVVMVElGSUxFIDogJChwcm9qZWN0KQorICAgICAgICAgICAgOiAkKHRhcmdldC14bWw6Uz0uZGlyKSAgIyBOYW1lLgorICAgICAgICAgICAgOiAkKHRhcmdldC14bWw6Uz0udGFnKSAgIyBTb3VyY2VzLgorICAgICAgICAgICAgOiAkKHJlcXVpcmVtZW50cykKKyAgICAgICAgICAgIDogJChkZWZhdWx0LWJ1aWxkKSA7CisgICAgICAgICQocHJvamVjdCkubWFyay10YXJnZXQtYXMtZXhwbGljaXQgJCh0YXJnZXQteG1sOlM9LmRpcikgOworCisgICAgICAgICMgVGhlIHJlc3VsdGluZyBCb29zdEJvb2sgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIHByb2Nlc3NvciB0b29sLiBUaGUKKyAgICAgICAgIyB0b29sIGNhbiBiZSBlaXRoZXIgdGhlIHhzbHRwcm9jIHBsdXMgYWNjb21wYW55aW5nIFhTTCBzY3JpcHRzLiBPciBpdAorICAgICAgICAjIGNhbiBiZSB0aGUgcHl0aG9uIGRveHByb2MucHkgc2NyaXB0LgorICAgICAgICB0YXJnZXRzLmNyZWF0ZS10eXBlZC10YXJnZXQgQk9PU1RCT09LIDogJChwcm9qZWN0KSA6ICQodGFyZ2V0LXhtbCkKKyAgICAgICAgICAgIDogJCh0YXJnZXQteG1sOlM9LmRpcikgICMgU291cmNlcy4KKyAgICAgICAgICAgIDogJChyZXF1aXJlbWVudHMpCisgICAgICAgICAgICA6ICQoZGVmYXVsdC1idWlsZCkgOworICAgICAgICAkKHByb2plY3QpLm1hcmstdGFyZ2V0LWFzLWV4cGxpY2l0ICQodGFyZ2V0LXhtbCkgOworCisgICAgICAgIHN0YWdlICQodGFyZ2V0OlM9LnhtbCkgICMgTmFtZS4KKyAgICAgICAgICAgIDogJCh0YXJnZXQteG1sKSAgIyBTb3VyY2VzLgorICAgICAgICAgICAgOiAkKHJlcXVpcmVtZW50cykKKyAgICAgICAgICAgICAgICA8bG9jYXRpb24+JChsb2NhdGlvbi14bWw6RT0uKQorICAgICAgICAgICAgICAgIDxuYW1lPiQodGFyZ2V0OlM9LnhtbCkKKyAgICAgICAgICAgIDogJChkZWZhdWx0LWJ1aWxkKSA7CisgICAgICAgICQocHJvamVjdCkubWFyay10YXJnZXQtYXMtZXhwbGljaXQgJCh0YXJnZXQ6Uz0ueG1sKSA7CisKKyAgICAgICAgIyBUT0RPOiBTZWUgd2h5IHRoaXMgYWxpYXMgdGFyZ2V0IGlzIHVzZWQgaGVyZSBpbnN0ZWFkIG9mIHNpbXBseSBuYW1pbmcKKyAgICAgICAgIyB0aGUgcHJldmlvdXMgc3RhZ2UgdGFyZ2V0ICQodGFyZ2V0KSBhbmQgaGF2aW5nIGl0IHNwZWNpZnkgdGhlIGFsaWFzCisgICAgICAgICMgdGFyZ2V0J3MgdXNhZ2UgcmVxdWlyZW1lbnRzIGRpcmVjdGx5LgorICAgICAgICBhbGlhcyAkKHRhcmdldCkgOiA6ICQocmVxdWlyZW1lbnRzKSA6ICQoZGVmYXVsdC1idWlsZCkgOgorICAgICAgICAgICAgJCh1c2FnZS1yZXF1aXJlbWVudHMpIDxkZXBlbmRlbmN5PiQodGFyZ2V0OlM9LnhtbCkgOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZG94eWdlbi93aW5kb3dzLXBhdGhzLWNoZWNrLmRveHlmaWxlIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9kb3h5Z2VuL3dpbmRvd3MtcGF0aHMtY2hlY2suZG94eWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5NjlkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZG94eWdlbi93aW5kb3dzLXBhdGhzLWNoZWNrLmRveHlmaWxlCkBAIC0wLDAgKzEsMyBAQAorSU5QVVQgPSB3aW5kb3dzLXBhdGhzLWNoZWNrLmhwcAorR0VORVJBVEVfSFRNTCA9IE5PCitHRU5FUkFURV9MQVRFWCA9IE5PCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL01HSVpBLy50bV9wcm9qZWN0Mi5jYWNoZSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZG94eWdlbi93aW5kb3dzLXBhdGhzLWNoZWNrLmhwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9NR0laQS8udG1fcHJvamVjdDIuY2FjaGUKcmVuYW1lIHRvIHNyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZG94eWdlbi93aW5kb3dzLXBhdGhzLWNoZWNrLmhwcApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9mb3AuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9mb3AuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNGI4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2ZvcC5qYW0KQEAgLTAsMCArMSw2OSBAQAorIyAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgRG91ZyBHcmVnb3IgYW5kIERhdmUgQWJyYWhhbXMuIERpc3RyaWJ1dGVkCisjIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyMgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisjCisjICBUaGlzIG1vZHVsZSBkZWZpbmVzIHJ1bGVzIHRvIGhhbmRsZSBnZW5lcmF0aW9uIG9mIFBERiBhbmQKKyMgIFBvc3RTY3JpcHQgZmlsZXMgZnJvbSBYU0wgRm9ybWF0dGluZyBPYmplY3RzIHZpYSBBcGFjaGUgRk9QCisKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBjb21tb24gOworaW1wb3J0IGJvb3N0Ym9vayA7CisKK2dlbmVyYXRvcnMucmVnaXN0ZXItc3RhbmRhcmQgZm9wLnJlbmRlci5wZGYgOiBGTyA6IFBERiA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIGZvcC5yZW5kZXIucHMgOiBGTyA6IFBTIDsKKworIyBJbml0aWFsaXplcyB0aGUgZm9wIHRvb2xzZXQuCisjCitydWxlIGluaXQgKCBmb3AtY29tbWFuZCA/IDogamF2YS1ob21lID8gOiBqYXZhID8gKQoreworICAgIGxvY2FsIGhhcy1jb21tYW5kID0gJCguaGFzLWNvbW1hbmQpIDsKKworICAgIGlmICQoZm9wLWNvbW1hbmQpCisgICAgeworICAgICAgICAuaGFzLWNvbW1hbmQgPSB0cnVlIDsKKyAgICB9CisKKyAgICBpZiAkKGZvcC1jb21tYW5kKSB8fCAhICQoaGFzLWNvbW1hbmQpCisgICAgeworICAgICAgICBmb3AtY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgZm9wIDogZm9wIDogJChmb3AtY29tbWFuZCkgCisgICAgICAgICAgOiBbIG1vZHVsZXMucGVlayA6IEZPUF9ESVIgXSBdIDsKKyAgICB9CisgICAgCisgICAgaWYgJChmb3AtY29tbWFuZCkKKyAgICB7CisgICAgICAgIC5GT1BfQ09NTUFORCA9ICQoZm9wLWNvbW1hbmQpIDsKKyAgICB9CisKKyAgICBpZiAkKGphdmEtaG9tZSkgfHwgJChqYXZhKQorICAgIHsKKyAgICAgICAgLkZPUF9TRVRVUCA9IDsKKworICAgIAorICAgICAgICAjIEpBVkFfSE9NRSBpcyB0aGUgbG9jYXRpb24gdGhhdCBqYXZhIHdhcyBpbnN0YWxsZWQgdG8uCisgICAgCisgICAgICAgIGlmICQoamF2YS1ob21lKQorICAgICAgICB7CisgICAgICAgICAgICAuRk9QX1NFVFVQICs9IFsgY29tbW9uLnZhcmlhYmxlLXNldHRpbmctY29tbWFuZCBKQVZBX0hPTUUgOiAkKGphdmEtaG9tZSkgXSA7CisgICAgICAgIH0KKworICAgICAgICAjIEpBVkFDTUQgaXMgdGhlIGxvY2F0aW9uIHRoYXQgb2YgdGhlIGphdmEgZXhlY3V0YWJsZSwgdXNlZnVsIGZvciBhCisgICAgICAgICMgbm9uLXN0YW5kYXJkIGphdmEgaW5zdGFsbGF0aW9uLCB3aGVyZSB0aGUgZXhlY3V0YWJsZSBpc24ndCBhdAorICAgICAgICAjICRKQVZBX0hPTUUvYmluL2phdmEuCisgICAgCisgICAgICAgIGlmICQoamF2YSkKKyAgICAgICAgeworICAgICAgICAgICAgLkZPUF9TRVRVUCArPSBbIGNvbW1vbi52YXJpYWJsZS1zZXR0aW5nLWNvbW1hbmQgSkFWQUNNRCA6ICQoamF2YSkgXSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2FjdGlvbnMgcmVuZGVyLnBkZgoreworICAgICQoLkZPUF9TRVRVUCkgJCguRk9QX0NPTU1BTkQ6RT1mb3ApICQoPikgJCg8KQorfQorCithY3Rpb25zIHJlbmRlci5wcworeworICAgICQoLkZPUF9TRVRVUCkgJCguRk9QX0NPTU1BTkQ6RT1mb3ApICQoPikgLXBzICQoPCkKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZm9ydHJhbi5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2ZvcnRyYW4uamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjY1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2ZvcnRyYW4uamFtCkBAIC0wLDAgKzEsNTUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA0IFRvb24gS25hcGVuCisjCisjICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlCisjICBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjCisjIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gc2V0dGluZ3MgZm9yIGFsbCBmb3J0cmFuIHRvb2xzCisjCisKK2ltcG9ydCAiY2xhc3MiIDogbmV3IDsKK2ltcG9ydCBmZWF0dXJlIDogZmVhdHVyZSA7CisKK2ltcG9ydCB0eXBlIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBjb21tb24gOworCit0eXBlLnJlZ2lzdGVyIEZPUlRSQU4gOiBmIEYgZm9yIGY3NyA7Cit0eXBlLnJlZ2lzdGVyIEZPUlRSQU45MCA6IGY5MCBGOTAgOworCitmZWF0dXJlIGZvcnRyYW4gOiA6IGZyZWUgOworZmVhdHVyZSBmb3J0cmFuOTAgOiA6IGZyZWUgOworCitjbGFzcyBmb3J0cmFuLWNvbXBpbGluZy1nZW5lcmF0b3IgOiBnZW5lcmF0b3IKK3sKKyAgICBydWxlIF9faW5pdF9fICggaWQgOiBzb3VyY2UtdHlwZXMgKyA6IHRhcmdldC10eXBlcyArIDogcmVxdWlyZW1lbnRzICogOiBvcHRpb25hbC1wcm9wZXJ0aWVzICogKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdG9yLl9faW5pdF9fICQoaWQpIDogJChzb3VyY2UtdHlwZXMpIDogJCh0YXJnZXQtdHlwZXMpIDogJChyZXF1aXJlbWVudHMpIDogJChvcHRpb25hbC1wcm9wZXJ0aWVzKSA7CisgICAgfQorfQorCitydWxlIHJlZ2lzdGVyLWZvcnRyYW4tY29tcGlsZXIgKCBpZCA6IHNvdXJjZS10eXBlcyArIDogdGFyZ2V0LXR5cGVzICsgOiByZXF1aXJlbWVudHMgKiA6IG9wdGlvbmFsLXByb3BlcnRpZXMgKiApCit7CisgICAgbG9jYWwgZyA9IFsgbmV3IGZvcnRyYW4tY29tcGlsaW5nLWdlbmVyYXRvciAkKGlkKSA6ICQoc291cmNlLXR5cGVzKSA6ICQodGFyZ2V0LXR5cGVzKSA6ICQocmVxdWlyZW1lbnRzKSA6ICQob3B0aW9uYWwtcHJvcGVydGllcykgXSA7CisgICAgZ2VuZXJhdG9ycy5yZWdpc3RlciAkKGcpIDsKK30KKworY2xhc3MgZm9ydHJhbjkwLWNvbXBpbGluZy1nZW5lcmF0b3IgOiBnZW5lcmF0b3IKK3sKKyAgICBydWxlIF9faW5pdF9fICggaWQgOiBzb3VyY2UtdHlwZXMgKyA6IHRhcmdldC10eXBlcyArIDogcmVxdWlyZW1lbnRzICogOiBvcHRpb25hbC1wcm9wZXJ0aWVzICogKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdG9yLl9faW5pdF9fICQoaWQpIDogJChzb3VyY2UtdHlwZXMpIDogJCh0YXJnZXQtdHlwZXMpIDogJChyZXF1aXJlbWVudHMpIDogJChvcHRpb25hbC1wcm9wZXJ0aWVzKSA7CisgICAgfQorfQorCitydWxlIHJlZ2lzdGVyLWZvcnRyYW45MC1jb21waWxlciAoIGlkIDogc291cmNlLXR5cGVzICsgOiB0YXJnZXQtdHlwZXMgKyA6IHJlcXVpcmVtZW50cyAqIDogb3B0aW9uYWwtcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NhbCBnID0gWyBuZXcgZm9ydHJhbjkwLWNvbXBpbGluZy1nZW5lcmF0b3IgJChpZCkgOiAkKHNvdXJjZS10eXBlcykgOiAkKHRhcmdldC10eXBlcykgOiAkKHJlcXVpcmVtZW50cykgOiAkKG9wdGlvbmFsLXByb3BlcnRpZXMpIF0gOworICAgIGdlbmVyYXRvcnMucmVnaXN0ZXIgJChnKSA7Cit9CisKKyMgRklYTUU6IHRoaXMgaXMgdWdseSwgc2hvdWxkIGZpbmQgYSBiZXR0ZXIgd2F5ICh3ZSdkIHdhbnQgY2xpZW50IGNvZGUgdG8KKyMgcmVnaXN0ZXIgYWxsIGdlbmVyYXRvcnMgYXMgImdlbmVyYXRvci5zb21lLXJ1bGUiLCBub3Qgd2l0aCAic29tZS1tb2R1bGUuc29tZS1ydWxlIi4pCitJTVBPUlQgJChfX25hbWVfXykgOiByZWdpc3Rlci1mb3J0cmFuLWNvbXBpbGVyIDogOiBnZW5lcmF0b3JzLnJlZ2lzdGVyLWZvcnRyYW4tY29tcGlsZXIgOworSU1QT1JUICQoX19uYW1lX18pIDogcmVnaXN0ZXItZm9ydHJhbjkwLWNvbXBpbGVyIDogOiBnZW5lcmF0b3JzLnJlZ2lzdGVyLWZvcnRyYW45MC1jb21waWxlciA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2djYy5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2djYy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5MGYwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZ2NjLmphbQpAQCAtMCwwICsxLDExODQgQEAKKyMgQ29weXJpZ2h0IDIwMDEgRGF2aWQgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDItMjAwNiBSZW5lIFJpdmVyYQorIyBDb3B5cmlnaHQgMjAwMi0yMDAzIFZsYWRpbWlyIFBydXMKKyMgQ29weXJpZ2h0IDIwMDUgUmVlY2UgSC4gRHVubgorIyBDb3B5cmlnaHQgMjAwNiBJbHlhIFNva29sb3YKKyMgQ29weXJpZ2h0IDIwMDcgUm9sYW5kIFNjaHdhcnoKKyMgQ29weXJpZ2h0IDIwMDcgQm9yaXMgR3ViZW5rbworIworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjICAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgICAgICAgICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgY29tbW9uIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBmb3J0cmFuIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBvcyA7CitpbXBvcnQgcGNoIDsKK2ltcG9ydCBwcm9wZXJ0eSA7CitpbXBvcnQgcHJvcGVydHktc2V0IDsKK2ltcG9ydCByYyA7CitpbXBvcnQgcmVnZXggOworaW1wb3J0IHNldCA7CitpbXBvcnQgdG9vbHNldCA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgdW5peCA7CisKKworaWYgWyBNQVRDSCAoLS1kZWJ1Zy1jb25maWd1cmF0aW9uKSA6IFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIF0KK3sKKyAgICAuZGVidWctY29uZmlndXJhdGlvbiA9IHRydWUgOworfQorCisKK2ZlYXR1cmUuZXh0ZW5kIHRvb2xzZXQgOiBnY2MgOworIyBmZWF0dXJlLnN1YmZlYXR1cmUgdG9vbHNldCBnY2MgOiBmbGF2b3IgOiA6IG9wdGlvbmFsIDsKKwordG9vbHNldC5pbmhlcml0LWdlbmVyYXRvcnMgZ2NjIDogdW5peCA6IHVuaXgubGluayB1bml4LmxpbmsuZGxsIDsKK3Rvb2xzZXQuaW5oZXJpdC1mbGFncyBnY2MgOiB1bml4IDsKK3Rvb2xzZXQuaW5oZXJpdC1ydWxlcyBnY2MgOiB1bml4IDsKKworZ2VuZXJhdG9ycy5vdmVycmlkZSBnY2MucHJlYnVpbHQgOiBidWlsdGluLnByZWJ1aWx0IDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgZ2NjLnNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOiBzZWFyY2hlZC1saWItZ2VuZXJhdG9yIDsKKworIyBNYWtlIGdjYyB0b29sc2V0IG9iamVjdCBmaWxlcyB1c2UgdGhlICJvIiBzdWZmaXggb24gYWxsIHBsYXRmb3Jtcy4KK3R5cGUuc2V0LWdlbmVyYXRlZC10YXJnZXQtc3VmZml4IE9CSiA6IDx0b29sc2V0PmdjYyA6IG8gOwordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXggT0JKIDogPHRvb2xzZXQ+Z2NjIDx0YXJnZXQtb3M+d2luZG93cyA6IG8gOwordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXggT0JKIDogPHRvb2xzZXQ+Z2NjIDx0YXJnZXQtb3M+Y3lnd2luIDogbyA7CisKKworIyBJbml0aWFsaXplcyB0aGUgZ2NjIHRvb2xzZXQgZm9yIHRoZSBnaXZlbiB2ZXJzaW9uLiBJZiBuZWNlc3NhcnksIGNvbW1hbmQgbWF5CisjIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgY29tcGlsZXIgaXMgbG9jYXRlZC4gVGhlIHBhcmFtZXRlciAnb3B0aW9ucycgaXMgYQorIyBzcGFjZS1kZWxpbWl0ZWQgbGlzdCBvZiBvcHRpb25zLCBlYWNoIG9uZSBzcGVjaWZpZWQgYXMKKyMgPG9wdGlvbi1uYW1lPm9wdGlvbi12YWx1ZS4gVmFsaWQgb3B0aW9uIG5hbWVzIGFyZTogY3h4ZmxhZ3MsIGxpbmtmbGFncyBhbmQKKyMgbGlua2VyLXR5cGUuIEFjY2VwdGVkIGxpbmtlci10eXBlIHZhbHVlcyBhcmUgYWl4LCBkYXJ3aW4sIGdudSwgaHB1eCwgb3NmIG9yCisjIHN1biBhbmQgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBzZWxlY3RlZCBiYXNlZCBvbiB0aGUgY3VycmVudCBPUy4KKyMgRXhhbXBsZToKKyMgICB1c2luZyBnY2MgOiAzLjQgOiA6IDxjeHhmbGFncz5mb28gPGxpbmtmbGFncz5iYXIgPGxpbmtlci10eXBlPnN1biA7CisjCisjIFRoZSBjb21waWxlciBjb21tYW5kIHRvIHVzZSBpcyBkZXRlY3RlZCBpbiB0aHJlZSBzdGVwczoKKyMgMSkgSWYgYW4gZXhwbGljaXQgY29tbWFuZCBpcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIGl0IHdpbGwgYmUgdXNlZCBhbmQgbXVzdAorIyAgICBiZSBhdmFpbGFibGUuCisjIDIpIElmIG9ubHkgYSBjZXJ0YWluIHZlcnNpb24gaXMgc3BlY2lmaWVkLCBpdCBpcyBlbmZvcmNlZDoKKyMgICAgLSBlaXRoZXIgdGhlICdnKystVkVSU0lPTicgY29tbWFuZCBtdXN0IGJlIGF2YWlsYWJsZQorIyAgICAtIG9yIHRoZSBkZWZhdWx0IGNvbW1hbmQgJ2crKycgbXVzdCBiZSBhdmFpbGFibGUgYW5kIG1hdGNoIHRoZSBleGFjdAorIyAgICAgIHZlcnNpb24uCisjIDMpIFdpdGhvdXQgdXNlci1wcm92aWRlZCByZXN0cmljdGlvbnMgdXNlIGRlZmF1bHQgJ2crKycuCisjCitydWxlIGluaXQgKCB2ZXJzaW9uID8gOiBjb21tYW5kICogOiBvcHRpb25zICogKQoreworICAgICMxKTogdXNlIHVzZXItcHJvdmlkZWQgY29tbWFuZAorICAgIGxvY2FsIHRvb2wtY29tbWFuZCA9IDsKKyAgICBpZiAkKGNvbW1hbmQpCisgICAgeworICAgICAgICB0b29sLWNvbW1hbmQgPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kLW5vZGVmYXVsdCBnY2MgOiBnKysgOgorICAgICAgICAgICAgJChjb21tYW5kKSBdIDsKKyAgICAgICAgaWYgISAkKHRvb2wtY29tbWFuZCkKKyAgICAgICAgeworICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICBlcnJvcnMuZXJyb3IgdG9vbHNldCBnY2MgaW5pdGlhbGl6YXRpb246CisgICAgICAgICAgICAgICAgOiBwcm92aWRlZCBjb21tYW5kICckKGNvbW1hbmQpJyBub3QgZm91bmQKKyAgICAgICAgICAgICAgICA6IGluaXRpYWxpemVkIGZyb20gWyBlcnJvcnMubmVhcmVzdC11c2VyLWxvY2F0aW9uIF0gOworICAgICAgICB9CisgICAgfQorICAgICMyKTogZW5mb3JjZSB1c2VyLXByb3ZpZGVkIHZlcnNpb24KKyAgICBlbHNlIGlmICQodmVyc2lvbikKKyAgICB7CisgICAgICAgIHRvb2wtY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQtbm9kZWZhdWx0IGdjYyA6CisgICAgICAgICAgICAiZysrLSQodmVyc2lvblsxXSkiIF0gOworCisgICAgICAgICMyLjEpIGZhbGxiYWNrOiBjaGVjayB3aGV0aGVyICJnKysiIHJlcG9ydHMgdGhlIHJlcXVlc3RlZCB2ZXJzaW9uCisgICAgICAgIGlmICEgJCh0b29sLWNvbW1hbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRvb2wtY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQtbm9kZWZhdWx0IGdjYyA6IGcrKyBdCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgaWYgJCh0b29sLWNvbW1hbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWwgdG9vbC1jb21tYW5kLXN0cmluZyA9ICQodG9vbC1jb21tYW5kOko9IiAiKSA7CisgICAgICAgICAgICAgICAgbG9jYWwgdG9vbC12ZXJzaW9uID0gWyBNQVRDSCAiXihbMC05Ll0rKSIgOgorICAgICAgICAgICAgICAgICAgICBbIFNIRUxMICIkKHRvb2wtY29tbWFuZC1zdHJpbmcpIC1kdW1wdmVyc2lvbiIgXSBdIDsKKyAgICAgICAgICAgICAgICBpZiAkKHRvb2wtdmVyc2lvbikgIT0gJCh2ZXJzaW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIyBQZXJtaXQgYSBtYXRjaCBiZXR3ZW4gYSB0d28tZGlnaXQgdmVyc2lvbiBzcGVjaWZpZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICMgdXNlciAoZS5nLiA0LjQpIGFuZCBhIDMtZGlnaXQgdmVyc2lvbiByZXBvcnRlZCBieSBnY2MuCisgICAgICAgICAgICAgICAgICAgICMgU2luY2Ugb25seSB0d28gZGlnaXRzIGFyZSBwcmVzZW50IGluIHRoZSBiaW5hcnkgbmFtZQorICAgICAgICAgICAgICAgICAgICAjIGFueXdheSwgaW5zaXN0aW5nIHRoYXQgdXNlciBzcGVjaWZ5IHRoZSAzLWRpZ2l0IHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgIyB3aGVuIGNvbmZpZ3VyaW5nIEJvb3N0LkJ1aWxkLCB3aGlsZSBpdCBpcyBub3QgcmVxdWlyZWQgb24KKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgY29tbWFuZCBsaW5lLCB3b3VsZCBiZSBzdHJhbmdlLgorICAgICAgICAgICAgICAgICAgICBsb2NhbCBzdHJpcHBlZCA9IFsgTUFUQ0ggIl4oWzAtOV0rXC5bMC05XSspLioiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICQodG9vbC12ZXJzaW9uKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgJChzdHJpcHBlZCkgIT0gJCh2ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5lcnJvciB0b29sc2V0IGdjYyBpbml0aWFsaXphdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZlcnNpb24gJyQodmVyc2lvbiknIHJlcXVlc3RlZCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2crKy0kKHZlcnNpb24pJyBub3QgZm91bmQgYW5kIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyQodG9vbC12ZXJzaW9uKScgb2YgZGVmYXVsdCAnJCh0b29sLWNvbW1hbmQpJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW5pdGlhbGl6ZWQgZnJvbSBbIGVycm9ycy5uZWFyZXN0LXVzZXItbG9jYXRpb24gXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvb2wtY29tbWFuZCA9IDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjIFVzZSBmdWxsIDMtZGlnaXQgdmVyc2lvbiB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICMgJ3VzaW5nIGdjYyA7JyBjYXNlCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSAkKHRvb2wtdmVyc2lvbikgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgICAgICBlcnJvcnMuZXJyb3IgdG9vbHNldCBnY2MgaW5pdGlhbGl6YXRpb246CisgICAgICAgICAgICAgICAgICAgIDogdmVyc2lvbiAnJCh2ZXJzaW9uKScgcmVxdWVzdGVkIGJ1dCBuZWl0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAnZysrLSQodmVyc2lvbiknIG5vciBkZWZhdWx0ICdnKysnIGZvdW5kCisgICAgICAgICAgICAgICAgICAgIDogaW5pdGlhbGl6ZWQgZnJvbSBbIGVycm9ycy5uZWFyZXN0LXVzZXItbG9jYXRpb24gXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgIzMpIGRlZmF1bHQ6IG5vIGNvbW1hbmQgYW5kIG5vIHZlcnNpb24gc3BlY2lmaWVkLCB0cnkgdXNpbmcgImcrKyIKKyAgICBlbHNlCisgICAgeworICAgICAgICB0b29sLWNvbW1hbmQgPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kLW5vZGVmYXVsdCBnY2MgOiBnKysgXSA7CisgICAgICAgIGlmICEgJCh0b29sLWNvbW1hbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICAgICAgZXJyb3JzLmVycm9yIHRvb2xzZXQgZ2NjIGluaXRpYWxpemF0aW9uOgorICAgICAgICAgICAgICAgIDogbm8gY29tbWFuZCBwcm92aWRlZCwgZGVmYXVsdCBjb21tYW5kICdnKysnIG5vdCBmb3VuZAorICAgICAgICAgICAgICAgIDogaW5pdGlhbGl6ZWQgZnJvbSBbIGVycm9ycy5uZWFyZXN0LXVzZXItbG9jYXRpb24gXSA7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGdjYyBjb21tYW5kLi4uCisgICAgIyAgIFRoZSBjb21tYW5kLgorICAgIGxvY2FsIGNvbW1hbmQgPSAkKHRvb2wtY29tbWFuZCkgOworICAgICMgICBUaGUgJ2NvbW1hbmQnIHZhcmlhYmxlIGNhbiBoYXZlIG11bHRpcGxlIGVsZW1lbnRzIGJ1dCB3aGVuIGNhbGxpbmcgdGhlCisgICAgIyBTSEVMTCBidWlsdGluIHdlIG5lZWQgYSBzaW5nbGUgc3RyaW5nLgorICAgIGxvY2FsIGNvbW1hbmQtc3RyaW5nID0gJChjb21tYW5kOko9IiAiKSA7CisgICAgIyAgIFRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgdG9vbCBpbnN0YWxsLgorICAgIGxvY2FsIHJvb3QgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8cm9vdD4gOiAkKG9wdGlvbnMpIF0gOworICAgICMgICBUaGUgYmluIGRpcmVjdG9yeSB3aGVyZSB0byBmaW5kIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCisgICAgbG9jYWwgYmluIDsKKyAgICAjICAgVGhlIGNvbXBpbGVyIGZsYXZvci4KKyAgICBsb2NhbCBmbGF2b3IgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8Zmxhdm9yPiA6ICQob3B0aW9ucykgXSA7CisgICAgIyAgIEF1dG9kZXRlY3QgdGhlIHJvb3QgYW5kIGJpbiBkaXIgaWYgbm90IGdpdmVuLgorICAgIGlmICQoY29tbWFuZCkKKyAgICB7CisgICAgICAgIGJpbiA/PSBbIGNvbW1vbi5nZXQtYWJzb2x1dGUtdG9vbC1wYXRoICQoY29tbWFuZFstMV0pIF0gOworICAgICAgICByb290ID89ICQoYmluOkQpIDsKKyAgICB9CisgICAgIyAgIEF1dG9kZXRlY3QgdGhlIHZlcnNpb24gYW5kIGZsYXZvciBpZiBub3QgZ2l2ZW4uCisgICAgaWYgJChjb21tYW5kKQorICAgIHsKKyAgICAgICAgbG9jYWwgbWFjaGluZSA9IFsgTUFUQ0ggIl4oW14gXSspIiA6CisgICAgICAgICAgICBbIFNIRUxMICIkKGNvbW1hbmQtc3RyaW5nKSAtZHVtcG1hY2hpbmUiIF0gXSA7CisgICAgICAgIHZlcnNpb24gPz0gWyBNQVRDSCAiXihbMC05Ll0rKSIgOgorICAgICAgICAgICAgWyBTSEVMTCAiJChjb21tYW5kLXN0cmluZykgLWR1bXB2ZXJzaW9uIiBdIF0gOworICAgICAgICBzd2l0Y2ggJChtYWNoaW5lOkwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgKm1pbmd3KiA6IGZsYXZvciA/PSBtaW5ndyA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsb2NhbCBjb25kaXRpb24gOworICAgIGlmICQoZmxhdm9yKQorICAgIHsKKyAgICAgICAgY29uZGl0aW9uID0gZmxhdm9yICQoZmxhdm9yKSA7CisgICAgfQorICAgIGNvbmRpdGlvbiA9IFsgY29tbW9uLmNoZWNrLWluaXQtcGFyYW1ldGVycyBnY2MgOiB2ZXJzaW9uICQodmVyc2lvbikKKyAgICAgICAgOiAkKGNvbmRpdGlvbikgXSA7CisKKyAgICBjb21tb24uaGFuZGxlLW9wdGlvbnMgZ2NjIDogJChjb25kaXRpb24pIDogJChjb21tYW5kKSA6ICQob3B0aW9ucykgOworCisgICAgbG9jYWwgbGlua2VyID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPGxpbmtlci10eXBlPiA6ICQob3B0aW9ucykgXSA7CisgICAgIyBUT0RPOiBUaGUgbG9naWMgYmVsb3cgc2hvdWxkIGFjdHVhbGx5IGJlIGtleWVkIG9uIDx0YXJnZXQtb3M+LgorICAgIGlmICEgJChsaW5rZXIpCisgICAgeworICAgICAgICBzd2l0Y2ggWyBvcy5uYW1lIF0KKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBPU0YgICAgIDogbGlua2VyID0gb3NmIDsKKyAgICAgICAgICAgIGNhc2UgSFBVWCAgICA6IGxpbmtlciA9IGhwdXggOworICAgICAgICAgICAgY2FzZSBBSVggICAgIDogbGlua2VyID0gYWl4IDsKKyAgICAgICAgICAgIGNhc2UgU09MQVJJUyA6IGxpbmtlciA9IHN1biA7CisgICAgICAgICAgICBjYXNlICogICAgICAgOiBsaW5rZXIgPSBnbnUgOworICAgICAgICB9CisgICAgfQorICAgIGluaXQtbGluay1mbGFncyBnY2MgJChsaW5rZXIpICQoY29uZGl0aW9uKSA7CisKKyAgICAjIElmIGdjYyBpcyBpbnN0YWxsZWQgaW4gYSBub24tc3RhbmRhcmQgbG9jYXRpb24sIHdlIHdvdWxkIG5lZWQgdG8gYWRkCisgICAgIyBMRF9MSUJSQVJZX1BBVEggd2hlbiBydW5uaW5nIHByb2dyYW1zIGNyZWF0ZWQgd2l0aCBpdCAoZm9yIHVuaXQtdGVzdC9ydW4KKyAgICAjIHJ1bGVzKS4KKyAgICBpZiAkKGNvbW1hbmQpCisgICAgeworICAgICAgICAjIE9uIG11bHRpbGliIDY0LWJpdCBib3hlcywgdGhlcmUgYXJlIGJvdGggMzItYml0IGFuZCA2NC1iaXQgbGlicmFyaWVzCisgICAgICAgICMgYW5kIGFsbCBtdXN0IGJlIGFkZGVkIHRvIExEX0xJQlJBUllfUEFUSC4gVGhlIGxpbmtlciB3aWxsIHBpY2sgdGhlCisgICAgICAgICMgcmlnaHQgb25jZXMuIE5vdGUgdGhhdCB3ZSBkbyBub3QgcHJvdmlkZSBhIGNsZWFuIHdheSB0byBidWlsZCBhIDMyLWJpdAorICAgICAgICAjIGJpbmFyeSB1c2luZyBhIDY0LWJpdCBjb21waWxlciwgYnV0IHVzZXIgY2FuIGFsd2F5cyBwYXNzIC1tMzIKKyAgICAgICAgIyBtYW51YWxseS4KKyAgICAgICAgbG9jYWwgbGliX3BhdGggPSAkKHJvb3QpL2JpbiAkKHJvb3QpL2xpYiAkKHJvb3QpL2xpYjMyICQocm9vdCkvbGliNjQgOworICAgICAgICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBFQ0hPIG5vdGljZTogdXNpbmcgZ2NjIGxpYnJhcmllcyA6OiAkKGNvbmRpdGlvbikgOjogJChsaWJfcGF0aCkgOworICAgICAgICB9CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgZ2NjLmxpbmsgUlVOX1BBVEggJChjb25kaXRpb24pIDogJChsaWJfcGF0aCkgOworICAgIH0KKworICAgICMgSWYgd2UgYXJlIG5vdCB1c2luZyBhIHN5c3RlbSBnY2MgaW5zdGFsbGF0aW9uIHdlIHNob3VsZCBhZGp1c3QgdGhlIHZhcmlvdXMKKyAgICAjIHByb2dyYW1zIGFzIG5lZWRlZCB0byBwcmVmZXIgdXNpbmcgdGhlaXIgaW5zdGFsbGF0aW9uIHNwZWNpZmljIHZlcnNpb25zLgorICAgICMgVGhpcyBpcyBlc3NlbnRpYWwgZm9yIGNvcnJlY3QgdXNlIG9mIE1pbkdXIGFuZCBmb3IgY3Jvc3MtY29tcGlsaW5nLgorCisgICAgbG9jYWwgbmwgPSAiCisiIDsKKworICAgICMgLSBBcmNoaXZlIGJ1aWxkZXIuCisgICAgbG9jYWwgYXJjaGl2ZXIgPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kIGdjYworICAgICAgICA6IFsgTk9STUFMSVpFX1BBVEggWyBNQVRDSCAiKC4qKVskKG5sKV0rIiA6CisgICAgICAgICAgICBbIFNIRUxMICIkKGNvbW1hbmQtc3RyaW5nKSAtcHJpbnQtcHJvZy1uYW1lPWFyIiBdIF0gXQorICAgICAgICA6IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxhcmNoaXZlcj4gOiAkKG9wdGlvbnMpIF0KKyAgICAgICAgOiAkKGJpbikKKyAgICAgICAgOiBzZWFyY2gtcGF0aCBdIDsKKyAgICB0b29sc2V0LmZsYWdzIGdjYy5hcmNoaXZlIC5BUiAkKGNvbmRpdGlvbikgOiAkKGFyY2hpdmVyWzFdKSA7CisgICAgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICB7CisgICAgICAgIEVDSE8gbm90aWNlOiB1c2luZyBnY2MgYXJjaGl2ZXIgOjogJChjb25kaXRpb24pIDo6ICQoYXJjaGl2ZXJbMV0pIDsKKyAgICB9CisKKyAgICAjIC0gUmFubGliLgorICAgIGxvY2FsIHJhbmxpYiA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgZ2NjCisgICAgICAgIDogWyBOT1JNQUxJWkVfUEFUSCBbIE1BVENIICIoLiopWyQobmwpXSsiIDoKKyAgICAgICAgICAgIFsgU0hFTEwgIiQoY29tbWFuZC1zdHJpbmcpIC1wcmludC1wcm9nLW5hbWU9cmFubGliIiBdIF0gXQorICAgICAgICA6IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxyYW5saWI+IDogJChvcHRpb25zKSBdCisgICAgICAgIDogJChiaW4pCisgICAgICAgIDogc2VhcmNoLXBhdGggXSA7CisgICAgdG9vbHNldC5mbGFncyBnY2MuYXJjaGl2ZSAuUkFOTElCICQoY29uZGl0aW9uKSA6ICQocmFubGliWzFdKSA7CisgICAgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICB7CisgICAgICAgIEVDSE8gbm90aWNlOiB1c2luZyBnY2MgcmFubGliIDo6ICQoY29uZGl0aW9uKSA6OiAkKHJhbmxpYlsxXSkgOworICAgIH0KKworICAgICMgLSBSZXNvdXJjZSBjb21waWxlci4KKyAgICBsb2NhbCByYyA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQtbm9kZWZhdWx0IGdjYyA6IHdpbmRyZXMgOgorICAgICAgICBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8cmM+IDogJChvcHRpb25zKSBdIDogJChiaW4pIDogc2VhcmNoLXBhdGggXSA7CisgICAgbG9jYWwgcmMtdHlwZSA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxyYy10eXBlPiA6ICQob3B0aW9ucykgXSA7CisgICAgcmMtdHlwZSA/PSB3aW5kcmVzIDsKKyAgICBpZiAhICQocmMpCisgICAgeworICAgICAgICAjIElmIHdlIGNhbiBub3QgZmluZCBhbiBSQyBjb21waWxlciB3ZSBmYWxsYmFjayB0byBhIG51bGwgb25lIHRoYXQKKyAgICAgICAgIyBjcmVhdGVzIGVtcHR5IG9iamVjdCBmaWxlcy4gVGhpcyBhbGxvd3MgdGhlIHNhbWUgSmFtZmlsZXMgdG8gd29yaworICAgICAgICAjIGFjcm9zcyB0aGUgYm9hcmQuIFRoZSBudWxsIFJDIHVzZXMgYXNzZW1ibGVyIHRvIGNyZWF0ZSB0aGUgZW1wdHkKKyAgICAgICAgIyBvYmplY3RzLCBzbyBjb25maWd1cmUgdGhhdC4KKyAgICAgICAgcmMgPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kIGdjYyA6IGFzIDogOiAkKGJpbikgOiBzZWFyY2gtcGF0aCBdCisgICAgICAgICAgICA7CisgICAgICAgIHJjLXR5cGUgPSBudWxsIDsKKyAgICB9CisgICAgcmMuY29uZmlndXJlICQocmMpIDogJChjb25kaXRpb24pIDogPHJjLXR5cGU+JChyYy10eXBlKSA7Cit9CisKK2lmIFsgb3MubmFtZSBdID0gTlQKK3sKKyAgICAjIFRoaXMgY2F1c2VzIHNpbmdsZS1saW5lIGNvbW1hbmQgaW52b2NhdGlvbiB0byBub3QgZ28gdGhyb3VnaCAuYmF0IGZpbGVzLAorICAgICMgdGh1cyBhdm9pZGluZyBjb21tYW5kLWxpbmUgbGVuZ3RoIGxpbWl0YXRpb25zLgorICAgICMgVE9ETzogU2V0IEpBTVNIRUxMIG9uIHNwZWNpZmljIHRhcmdldHMgaW5zdGVhZCBvZiBnbG9iYWxseS4KKyAgICBKQU1TSEVMTCA9ICUgOworfQorCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgZ2NjLmNvbXBpbGUuYysrLnByZXByb2Nlc3MgOiBDUFAgOiBQUkVQUk9DRVNTRURfQ1BQIDogPHRvb2xzZXQ+Z2NjIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBnY2MuY29tcGlsZS5jLnByZXByb2Nlc3MgICA6IEMgICA6IFBSRVBST0NFU1NFRF9DICAgOiA8dG9vbHNldD5nY2MgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIGdjYy5jb21waWxlLmMrKyA6IENQUCA6IE9CSiA6IDx0b29sc2V0PmdjYyA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgZ2NjLmNvbXBpbGUuYyAgIDogQyAgIDogT0JKIDogPHRvb2xzZXQ+Z2NjIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBnY2MuY29tcGlsZS5hc20gOiBBU00gOiBPQkogOiA8dG9vbHNldD5nY2MgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1mb3J0cmFuLWNvbXBpbGVyIGdjYy5jb21waWxlLmZvcnRyYW4gOiBGT1JUUkFOIEZPUlRSQU45MCA6IE9CSiA6IDx0b29sc2V0PmdjYyA7CisKKyMgcGNoIHN1cHBvcnQKKworIyBUaGUgY29tcGlsZXIgbG9va3MgZm9yIGEgcHJlY29tcGlsZWQgaGVhZGVyIGluIGVhY2ggZGlyZWN0b3J5IGp1c3QgYmVmb3JlIGl0CisjIGxvb2tzIGZvciB0aGUgaW5jbHVkZSBmaWxlIGluIHRoYXQgZGlyZWN0b3J5LiBUaGUgbmFtZSBzZWFyY2hlZCBmb3IgaXMgdGhlCisjIG5hbWUgc3BlY2lmaWVkIGluIHRoZSAjaW5jbHVkZSBkaXJlY3RpdmUgd2l0aCAiLmdjaCIgc3VmZml4IGFwcGVuZGVkLiBUaGUKKyMgbG9naWMgaW4gZ2NjLXBjaC1nZW5lcmF0b3Igd2lsbCBtYWtlIHN1cmUgdGhhdCB0aGUgQkFTRV9QQ0ggc3VmZml4IGlzIGFwcGVuZGVkCisjIHRvIHRoZSBmdWxsIGhlYWRlciBuYW1lLgorCit0eXBlLnNldC1nZW5lcmF0ZWQtdGFyZ2V0LXN1ZmZpeCBQQ0ggOiA8dG9vbHNldD5nY2MgOiBnY2ggOworCisjIEdDQy1zcGVjaWZpYyBwY2ggZ2VuZXJhdG9yLgorY2xhc3MgZ2NjLXBjaC1nZW5lcmF0b3IgOiBwY2gtZ2VuZXJhdG9yCit7CisgICAgaW1wb3J0IHByb2plY3QgOworICAgIGltcG9ydCBwcm9wZXJ0eS1zZXQgOworICAgIGltcG9ydCB0eXBlIDsKKworICAgIHJ1bGUgcnVuLXBjaCAoIHByb2plY3QgbmFtZSA/IDogcHJvcGVydHktc2V0IDogc291cmNlcyArICkKKyAgICB7CisgICAgICAgICMgRmluZCB0aGUgaGVhZGVyIGluIHNvdXJjZXMuIElnbm9yZSBhbnkgQ1BQIHNvdXJjZXMuCisgICAgICAgIGxvY2FsIGhlYWRlciA7CisgICAgICAgIGZvciBsb2NhbCBzIGluICQoc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgWyB0eXBlLmlzLWRlcml2ZWQgWyAkKHMpLnR5cGUgXSBIIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSAkKHMpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICMgRXJyb3IgaGFuZGxpbmc6IGJhc2UgaGVhZGVyIGZpbGUgbmFtZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGJhc2UKKyAgICAgICAgIyBwcmVjb21waWxlZCBoZWFkZXIgbmFtZS4KKyAgICAgICAgbG9jYWwgaGVhZGVyLW5hbWUgPSBbICQoaGVhZGVyKS5uYW1lIF0gOworICAgICAgICBsb2NhbCBoZWFkZXItYmFzZW5hbWUgPSAkKGhlYWRlci1uYW1lOkIpIDsKKyAgICAgICAgaWYgJChoZWFkZXItYmFzZW5hbWUpICE9ICQobmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgbG9jYXRpb24gPSBbICQocHJvamVjdCkucHJvamVjdC1tb2R1bGUgXSA7CisgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDogdXNlci1lcnJvciA6IGVycm9ycy51c2VyLWVycm9yIDsKKyAgICAgICAgICAgIGVycm9ycy51c2VyLWVycm9yICJpbiIgJChsb2NhdGlvbik6IHBjaCB0YXJnZXQgbmFtZSAnJChuYW1lKScgc2hvdWxkCisgICAgICAgICAgICAgICAgYmUgdGhlIHNhbWUgYXMgdGhlIGJhc2UgbmFtZSBvZiBoZWFkZXIgZmlsZSAnJChoZWFkZXItbmFtZSknIDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIHBjaC1maWxlID0gWyBnZW5lcmF0b3IucnVuICQocHJvamVjdCkgJChuYW1lKSA6ICQocHJvcGVydHktc2V0KQorICAgICAgICAgICAgOiAkKGhlYWRlcikgXSA7CisKKyAgICAgICAgIyBSZXR1cm4gcmVzdWx0IG9mIGJhc2UgY2xhc3MgYW5kIHBjaC1maWxlIHByb3BlcnR5IGFzCisgICAgICAgICMgdXNhZ2UtcmVxdWlyZW1lbnRzLgorICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIFsgcHJvcGVydHktc2V0LmNyZWF0ZSA8cGNoLWZpbGU+JChwY2gtZmlsZSkgPGNmbGFncz4tV2ludmFsaWQtcGNoIF0KKyAgICAgICAgICAgICQocGNoLWZpbGUpCisgICAgICAgICAgOworICAgIH0KKworICAgICMgQ2FsbHMgdGhlIGJhc2UgdmVyc2lvbiBzcGVjaWZ5aW5nIHNvdXJjZSdzIG5hbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGNyZWF0ZWQKKyAgICAjIHRhcmdldC4gQXMgYSByZXN1bHQsIHRoZSBQQ0ggd2lsbCBiZSBuYW1lZCB3aGF0ZXZlci5ocHAuZ2NoLCBhbmQgbm90CisgICAgIyB3aGF0ZXZlci5nY2guCisgICAgcnVsZSBnZW5lcmF0ZWQtdGFyZ2V0cyAoIHNvdXJjZXMgKyA6IHByb3BlcnR5LXNldCA6IHByb2plY3QgbmFtZSA/ICkKKyAgICB7CisgICAgICAgIG5hbWUgPSBbICQoc291cmNlc1sxXSkubmFtZSBdIDsKKyAgICAgICAgcmV0dXJuIFsgZ2VuZXJhdG9yLmdlbmVyYXRlZC10YXJnZXRzICQoc291cmNlcykKKyAgICAgICAgICA6ICQocHJvcGVydHktc2V0KSA6ICQocHJvamVjdCkgJChuYW1lKSBdIDsKKyAgICB9Cit9CisKKyMgTm90ZTogdGhlICdIJyBzb3VyY2UgdHlwZSB3aWxsIGNhdGNoIGJvdGggJy5oJyBoZWFkZXIgYW5kICcuaHBwJyBoZWFkZXIuIFRoZQorIyBsYXR0ZXIgaGF2ZSBIUFAgdHlwZSwgYnV0IEhQUCB0eXBlIGlzIGRlcml2ZWQgZnJvbSBILiBUaGUgdHlwZSBvZiBjb21waWxhdGlvbgorIyBpcyBkZXRlcm1pbmVkIGVudGlyZWx5IGJ5IHRoZSBkZXN0aW5hdGlvbiB0eXBlLgorZ2VuZXJhdG9ycy5yZWdpc3RlciBbIG5ldyBnY2MtcGNoLWdlbmVyYXRvciBnY2MuY29tcGlsZS5jLnBjaCAgIDogSCA6ICAgQ19QQ0ggOiA8cGNoPm9uIDx0b29sc2V0PmdjYyBdIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgZ2NjLXBjaC1nZW5lcmF0b3IgZ2NjLmNvbXBpbGUuYysrLnBjaCA6IEggOiBDUFBfUENIIDogPHBjaD5vbiA8dG9vbHNldD5nY2MgXSA7CisKKyMgT3ZlcnJpZGUgZGVmYXVsdCBkby1ub3RoaW5nIGdlbmVyYXRvcnMuCitnZW5lcmF0b3JzLm92ZXJyaWRlIGdjYy5jb21waWxlLmMucGNoICAgOiBwY2guZGVmYXVsdC1jLXBjaC1nZW5lcmF0b3IgICA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIGdjYy5jb21waWxlLmMrKy5wY2ggOiBwY2guZGVmYXVsdC1jcHAtcGNoLWdlbmVyYXRvciA7CisKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmNvbXBpbGUgUENIX0ZJTEUgPHBjaD5vbiA6IDxwY2gtZmlsZT4gOworCisjIERlY2xhcmUgZmxhZ3MgYW5kIGFjdGlvbiBmb3IgY29tcGlsYXRpb24uCit0b29sc2V0LmZsYWdzIGdjYy5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5vZmYgICA6IC1PMCA7Cit0b29sc2V0LmZsYWdzIGdjYy5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGVlZCA6IC1PMyA7Cit0b29sc2V0LmZsYWdzIGdjYy5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGFjZSA6IC1PcyA7CisKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmNvbXBpbGUgT1BUSU9OUyA8aW5saW5pbmc+b2ZmICA6IC1mbm8taW5saW5lIDsKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmNvbXBpbGUgT1BUSU9OUyA8aW5saW5pbmc+b24gICA6IC1Xbm8taW5saW5lIDsKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmNvbXBpbGUgT1BUSU9OUyA8aW5saW5pbmc+ZnVsbCA6IC1maW5saW5lLWZ1bmN0aW9ucyAtV25vLWlubGluZSA7CisKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3M+b2ZmIDogLXcgOwordG9vbHNldC5mbGFncyBnY2MuY29tcGlsZSBPUFRJT05TIDx3YXJuaW5ncz5vbiAgOiAtV2FsbCA7Cit0b29sc2V0LmZsYWdzIGdjYy5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzPmFsbCA6IC1XYWxsIC1wZWRhbnRpYyA7Cit0b29sc2V0LmZsYWdzIGdjYy5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzLWFzLWVycm9ycz5vbiA6IC1XZXJyb3IgOworCit0b29sc2V0LmZsYWdzIGdjYy5jb21waWxlIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b24gOiAtZyA7Cit0b29sc2V0LmZsYWdzIGdjYy5jb21waWxlIE9QVElPTlMgPHByb2ZpbGluZz5vbiA6IC1wZyA7CisKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmNvbXBpbGUuYysrIE9QVElPTlMgPHJ0dGk+b2ZmIDogLWZuby1ydHRpIDsKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmNvbXBpbGUuYysrIE9QVElPTlMgPGV4Y2VwdGlvbi1oYW5kbGluZz5vZmYgOiAtZm5vLWV4Y2VwdGlvbnMgOworCitydWxlIHNldHVwLWZwaWMgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2FsIGxpbmsgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyBsaW5rIDogJChwcm9wZXJ0aWVzKSBdIDsKKyAgICBpZiAkKGxpbmspID0gc2hhcmVkCisgICAgeworICAgICAgICBsb2NhbCB0YXJnZXQgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyB0YXJnZXQtb3MgOiAkKHByb3BlcnRpZXMpIF0gOworCisgICAgICAgICMgVGhpcyBsb2dpYyB3aWxsIGFkZCAtZlBJQyBmb3IgYWxsIGNvbXBpbGF0aW9uczoKKyAgICAgICAgIworICAgICAgICAjIGxpYiBhIDogYS5jcHAgYiA7CisgICAgICAgICMgb2JqIGIgOiBiLmNwcCA7CisgICAgICAgICMgZXhlIGMgOiBjLmNwcCBhIGQgOworICAgICAgICAjIG9iaiBkIDogZC5jcHAgOworICAgICAgICAjCisgICAgICAgICMgVGhpcyBhbGwgaXMgZmluZSwgZXhjZXB0IHRoYXQgJ2QnIHdpbGwgYmUgY29tcGlsZWQgd2l0aCAtZlBJQyBldmVuCisgICAgICAgICMgdGhvdWdoIGl0IGlzIG5vdCBuZWVkZWQsIGFzICdkJyBpcyB1c2VkIG9ubHkgaW4gZXhlLiBIb3dldmVyLCBpdCBpcworICAgICAgICAjIGhhcmQgdG8gZGV0ZWN0IHdoZXJlIGEgdGFyZ2V0IGlzIGdvaW5nIHRvIGJlIHVzZWQuIEFsdGVybmF0aXZlbHksIHdlCisgICAgICAgICMgY2FuIHNldCAtZlBJQyBvbmx5IHdoZW4gbWFpbiB0YXJnZXQgdHlwZSBpcyBMSUIgYnV0IHRoYW4gJ2InIHdvdWxkIGJlCisgICAgICAgICMgY29tcGlsZWQgd2l0aG91dCAtZlBJQyB3aGljaCB3b3VsZCBsZWFkIHRvIGxpbmsgZXJyb3JzIG9uIHg4Ni02NC4gU28sCisgICAgICAgICMgY29tcGlsZSBldmVyeXRoaW5nIHdpdGggLWZQSUMuCisgICAgICAgICMKKyAgICAgICAgIyBZZXQgYW5vdGhlciBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBjcmVhdGUgYSBwcm9wYWdhdGVkIDxzaGFyZWRhYmxlPgorICAgICAgICAjIGZlYXR1cmUgYW5kIHNldCBpdCB3aGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCB0aGF0IHdvdWxkIGJlCisgICAgICAgICMgaGFyZCB0byBpbXBsZW1lbnQgYW5kIHdvdWxkIGluY3JlYXNlIHRoZSB0YXJnZXQgcGF0aCBsZW5ndGggZXZlbiBtb3JlLgorCisgICAgICAgICMgT24gV2luZG93cywgZlBJQyBpcyB0aGUgZGVmYXVsdCwgYW5kIHNwZWNpZnlpbmcgLWZQSUMgZXhwbGljaXRseSBsZWFkcworICAgICAgICAjIHRvIGEgd2FybmluZy4KKyAgICAgICAgaWYgISAkKHRhcmdldCkgaW4gY3lnd2luIHdpbmRvd3MKKyAgICAgICAgeworICAgICAgICAgICAgT1BUSU9OUyBvbiAkKHRhcmdldHMpICs9IC1mUElDIDsKKyAgICAgICAgfQorICAgIH0KK30KKworcnVsZSBzZXR1cC1hZGRyZXNzLW1vZGVsICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NhbCBtb2RlbCA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIGFkZHJlc3MtbW9kZWwgOiAkKHByb3BlcnRpZXMpIF0gOworICAgIGlmICQobW9kZWwpCisgICAgeworICAgICAgICBsb2NhbCBvcHRpb24gOworICAgICAgICBsb2NhbCBvcyA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIHRhcmdldC1vcyA6ICQocHJvcGVydGllcykgXSA7CisgICAgICAgIGlmICQob3MpID0gYWl4CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQobW9kZWwpID0gMzIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcHRpb24gPSAtbWFpeDMyIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcHRpb24gPSAtbWFpeDY0IDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICQob3MpID0gaHB1eAorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKG1vZGVsKSA9IDMyCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3B0aW9uID0gLW1pbHAzMiA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3B0aW9uID0gLW1scDY0IDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIGFyY2ggPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyBhcmNoaXRlY3R1cmUgOiAkKHByb3BlcnRpZXMpIF0gOworICAgICAgICAgICAgaWYgJChhcmNoKSAhPSBhcm0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAkKG1vZGVsKSA9IDMyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAtbTMyIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAkKG1vZGVsKSA9IDY0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAtbTY0IDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjIEZvciBkYXJ3aW4sIHRoZSBtb2RlbCBjYW4gYmUgMzJfNjQuIGRhcndpbi5qYW0gd2lsbCBoYW5kbGUgdGhhdAorICAgICAgICAgICAgIyBvbiBpdHMgb3duLgorICAgICAgICB9CisgICAgICAgIE9QVElPTlMgb24gJCh0YXJnZXRzKSArPSAkKG9wdGlvbikgOworICAgIH0KK30KKworCisjIEZJWE1FOiB0aGlzIHNob3VsZCBub3QgdXNlIG9zLm5hbWUuCitpZiAhIFsgb3MubmFtZSBdIGluIE5UIE9TRiBIUFVYIEFJWAoreworICAgICMgT1NGIGRvZXMgaGF2ZSBhbiBvcHRpb24gY2FsbGVkIC1zb25hbWUgYnV0IGl0IGRvZXMgbm90IHNlZW0gdG8gd29yayBhcworICAgICMgZXhwZWN0ZWQsIHRoZXJlZm9yZSBpdCBoYXMgYmVlbiBkaXNhYmxlZC4KKyAgICBIQVZFX1NPTkFNRSAgID0gIiIgOworICAgIFNPTkFNRV9PUFRJT04gPSAtaCA7Cit9CisKKyMgSFBVWCwgZm9yIHNvbWUgcmVhc29uLCBzZWVtcyB0byB1c2UgJytoJyBpbnN0ZWFkIG9mICctaCcuCitpZiBbIG9zLm5hbWUgXSA9IEhQVVgKK3sKKyAgICBIQVZFX1NPTkFNRSAgID0gIiIgOworICAgIFNPTkFNRV9PUFRJT04gPSAraCA7Cit9CisKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmNvbXBpbGUgVVNFUl9PUFRJT05TIDxjZmxhZ3M+IDsKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmNvbXBpbGUuYysrIFVTRVJfT1BUSU9OUyA8Y3h4ZmxhZ3M+IDsKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmNvbXBpbGUgREVGSU5FUyA8ZGVmaW5lPiA7Cit0b29sc2V0LmZsYWdzIGdjYy5jb21waWxlIElOQ0xVREVTIDxpbmNsdWRlPiA7Cit0b29sc2V0LmZsYWdzIGdjYy5jb21waWxlLmMrKyBURU1QTEFURV9ERVBUSCA8YysrLXRlbXBsYXRlLWRlcHRoPiA7Cit0b29sc2V0LmZsYWdzIGdjYy5jb21waWxlLmZvcnRyYW4gVVNFUl9PUFRJT05TIDxmZmxhZ3M+IDsKKworcnVsZSBjb21waWxlLmMrKy5wY2ggKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIHNldHVwLXRocmVhZGluZyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIHNldHVwLWZwaWMgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBzZXR1cC1hZGRyZXNzLW1vZGVsICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7Cit9CisKK2FjdGlvbnMgY29tcGlsZS5jKysucGNoCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAteCBjKystaGVhZGVyICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCitydWxlIGNvbXBpbGUuYy5wY2ggKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIHNldHVwLXRocmVhZGluZyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIHNldHVwLWZwaWMgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBzZXR1cC1hZGRyZXNzLW1vZGVsICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7Cit9CisKK2FjdGlvbnMgY29tcGlsZS5jLnBjaAoreworICAgICIkKENPTkZJR19DT01NQU5EKSIgLXggYy1oZWFkZXIgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtYyAtbyAiJCg8KSIgIiQoPikiCit9CisKK3J1bGUgY29tcGlsZS5jKysucHJlcHJvY2VzcyAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgc2V0dXAtdGhyZWFkaW5nICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgICAgc2V0dXAtZnBpYyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIHNldHVwLWFkZHJlc3MtbW9kZWwgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKworICAgICMgU29tZSBleHRlbnNpb25zIGFyZSBjb21waWxlZCBhcyBDKysgYnkgZGVmYXVsdC4gRm9yIG90aGVycywgd2UgbmVlZCB0bworICAgICMgcGFzcyAteCBjKysuIFdlIGNvdWxkIGFsd2F5cyBwYXNzIC14IGMrKyBidXQgZGlzdGNjIGRvZXMgbm90IHdvcmsgd2l0aCBpdC4KKyAgICBpZiAhICQoPjpTKSBpbiAuY2MgLmNwIC5jeHggLmNwcCAuYysrIC5DCisgICAgeworICAgICAgICBMQU5HIG9uICQoPCkgPSAiLXggYysrIiA7CisgICAgfQorICAgIERFUEVORFMgJCg8KSA6IFsgb24gJCg8KSByZXR1cm4gJChQQ0hfRklMRSkgXSA7Cit9CisKK3J1bGUgY29tcGlsZS5jLnByZXByb2Nlc3MgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIHNldHVwLXRocmVhZGluZyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIHNldHVwLWZwaWMgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBzZXR1cC1hZGRyZXNzLW1vZGVsICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisKKyAgICAjIElmIHdlIHVzZSB0aGUgbmFtZSBnKysgdGhlbiBkZWZhdWx0IGZpbGUgc3VmZml4IC0+IGxhbmd1YWdlIG1hcHBpbmcgZG9lcworICAgICMgbm90IHdvcmsuIFNvIGhhdmUgdG8gcGFzcyAteCBvcHRpb24uIE1heWJlLCB3ZSBjYW4gd29yayBhcm91bmQgdGhpcyBieQorICAgICMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3BlY2lmeSBib3RoIEMgYW5kIEMrKyBjb21waWxlciBuYW1lcy4KKyAgICAjaWYgJCg+OlMpICE9IC5jCisgICAgI3sKKyAgICAgICAgTEFORyBvbiAkKDwpID0gIi14IGMiIDsKKyAgICAjfQorICAgIERFUEVORFMgJCg8KSA6IFsgb24gJCg8KSByZXR1cm4gJChQQ0hfRklMRSkgXSA7Cit9CisKK3J1bGUgY29tcGlsZS5jKysgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIHNldHVwLXRocmVhZGluZyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIHNldHVwLWZwaWMgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBzZXR1cC1hZGRyZXNzLW1vZGVsICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisKKyAgICAjIFNvbWUgZXh0ZW5zaW9ucyBhcmUgY29tcGlsZWQgYXMgQysrIGJ5IGRlZmF1bHQuIEZvciBvdGhlcnMsIHdlIG5lZWQgdG8KKyAgICAjIHBhc3MgLXggYysrLiBXZSBjb3VsZCBhbHdheXMgcGFzcyAteCBjKysgYnV0IGRpc3RjYyBkb2VzIG5vdCB3b3JrIHdpdGggaXQuCisgICAgaWYgISAkKD46UykgaW4gLmNjIC5jcCAuY3h4IC5jcHAgLmMrKyAuQworICAgIHsKKyAgICAgICAgTEFORyBvbiAkKDwpID0gIi14IGMrKyIgOworICAgIH0KKyAgICBERVBFTkRTICQoPCkgOiBbIG9uICQoPCkgcmV0dXJuICQoUENIX0ZJTEUpIF0gOworCisgICAgIyBIZXJlIHdlIHdhbnQgdG8gcmFpc2UgdGhlIHRlbXBsYXRlLWRlcHRoIHBhcmFtZXRlciB2YWx1ZSB0byBzb21ldGhpbmcKKyAgICAjIGhpZ2hlciB0aGFuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDE3LiBOb3RlIHRoYXQgd2UgY291bGQgZG8gdGhpcyB1c2luZyB0aGUKKyAgICAjIGZlYXR1cmUuc2V0LWRlZmF1bHQgcnVsZSBidXQgd2UgZG8gbm90IHdhbnQgdG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvcgorICAgICMgYWxsIHRvb2xzZXRzIGFzIHdlbGwuCisgICAgIworICAgICMgVE9ETzogVGhpcyAnbW9kaWZpZWQgZGVmYXVsdCcgaGFzIGJlZW4gaW5oZXJpdGVkIGZyb20gc29tZSAnb2xkZXIgQm9vc3QKKyAgICAjIEJ1aWxkIGltcGxlbWVudGF0aW9uJyBhbmQgaGFzIG1vc3QgbGlrZWx5IGJlZW4gYWRkZWQgdG8gbWFrZSBzb21lIEJvb3N0CisgICAgIyBsaWJyYXJ5IHBhcnRzIGNvbXBpbGUgY29ycmVjdGx5LiBXZSBzaG91bGQgc2VlIHdoYXQgZXhhY3RseSBwcm9tcHRlZCB0aGlzCisgICAgIyBhbmQgd2hldGhlciB3ZSBjYW4gZ2V0IGFyb3VuZCB0aGUgcHJvYmxlbSBtb3JlIGxvY2FsbHkuCisgICAgbG9jYWwgdGVtcGxhdGUtZGVwdGggPSBbIG9uICQoPCkgcmV0dXJuICQoVEVNUExBVEVfREVQVEgpIF0gOworICAgIGlmICEgJCh0ZW1wbGF0ZS1kZXB0aCkKKyAgICB7CisgICAgICAgIFRFTVBMQVRFX0RFUFRIIG9uICQoPCkgPSAxMjggOworICAgIH0KK30KKworcnVsZSBjb21waWxlLmMgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIHNldHVwLXRocmVhZGluZyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIHNldHVwLWZwaWMgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBzZXR1cC1hZGRyZXNzLW1vZGVsICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisKKyAgICAjIElmIHdlIHVzZSB0aGUgbmFtZSBnKysgdGhlbiBkZWZhdWx0IGZpbGUgc3VmZml4IC0+IGxhbmd1YWdlIG1hcHBpbmcgZG9lcworICAgICMgbm90IHdvcmsuIFNvIGhhdmUgdG8gcGFzcyAteCBvcHRpb24uIE1heWJlLCB3ZSBjYW4gd29yayBhcm91bmQgdGhpcyBieQorICAgICMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3BlY2lmeSBib3RoIEMgYW5kIEMrKyBjb21waWxlciBuYW1lcy4KKyAgICAjaWYgJCg+OlMpICE9IC5jCisgICAgI3sKKyAgICAgICAgTEFORyBvbiAkKDwpID0gIi14IGMiIDsKKyAgICAjfQorICAgIERFUEVORFMgJCg8KSA6IFsgb24gJCg8KSByZXR1cm4gJChQQ0hfRklMRSkgXSA7Cit9CisKK3J1bGUgY29tcGlsZS5mb3J0cmFuICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBzZXR1cC10aHJlYWRpbmcgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBzZXR1cC1mcGljICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgICAgc2V0dXAtYWRkcmVzcy1tb2RlbCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworfQorCithY3Rpb25zIGNvbXBpbGUuYysrIGJpbmQgUENIX0ZJTEUKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoTEFORykgLWZ0ZW1wbGF0ZS1kZXB0aC0kKFRFTVBMQVRFX0RFUFRIKSAkKE9QVElPTlMpICQoVVNFUl9PUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChQQ0hfRklMRTpEKSIgLUkiJChJTkNMVURFUykiIC1jIC1vICIkKDw6VykiICIkKD46VykiCit9CisKK2FjdGlvbnMgY29tcGlsZS5jIGJpbmQgUENIX0ZJTEUKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoTEFORykgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoUENIX0ZJTEU6RCkiIC1JIiQoSU5DTFVERVMpIiAtYyAtbyAiJCg8KSIgIiQoPikiCit9CisKK2FjdGlvbnMgY29tcGlsZS5jKysucHJlcHJvY2VzcyBiaW5kIFBDSF9GSUxFCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAkKExBTkcpIC1mdGVtcGxhdGUtZGVwdGgtJChURU1QTEFURV9ERVBUSCkgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoUENIX0ZJTEU6RCkiIC1JIiQoSU5DTFVERVMpIiAiJCg+OlcpIiAtRSA+IiQoPDpXKSIKK30KKworYWN0aW9ucyBjb21waWxlLmMucHJlcHJvY2VzcyBiaW5kIFBDSF9GSUxFCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAkKExBTkcpICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKFBDSF9GSUxFOkQpIiAtSSIkKElOQ0xVREVTKSIgIiQoPikiIC1FID4kKDwpCit9CisKK2FjdGlvbnMgY29tcGlsZS5mb3J0cmFuCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAkKExBTkcpICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKFBDSF9GSUxFOkQpIiAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCitydWxlIGNvbXBpbGUuYXNtICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBzZXR1cC1mcGljICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgICAgc2V0dXAtYWRkcmVzcy1tb2RlbCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIExBTkcgb24gJCg8KSA9ICIteCBhc3NlbWJsZXItd2l0aC1jcHAiIDsKK30KKworYWN0aW9ucyBjb21waWxlLmFzbQoreworICAgICIkKENPTkZJR19DT01NQU5EKSIgJChMQU5HKSAkKE9QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCisjIENsYXNzIGNoZWNraW5nIHRoYXQgd2UgZG8gbm90IHRyeSB0byB1c2UgdGhlIDxydW50aW1lLWxpbms+c3RhdGljIHByb3BlcnR5CisjIHdoaWxlIGNyZWF0aW5nIG9yIHVzaW5nIGEgc2hhcmVkIGxpYnJhcnksIHNpbmNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkKKyMgZ2NjL2xpYmMuCitjbGFzcyBnY2MtbGlua2luZy1nZW5lcmF0b3IgOiB1bml4LWxpbmtpbmctZ2VuZXJhdG9yCit7CisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKyApCisgICAgeworICAgICAgICAjIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoIHRoZSB1c2Ugb2YgYSB0YXJnZXQtb3MgcHJvcGVydHkuCisgICAgICAgIGxvY2FsIG5vLXN0YXRpYy1saW5rID0gOworICAgICAgICBpZiBbIG1vZHVsZXMucGVlayA6IFVOSVggXQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggWyBtb2R1bGVzLnBlZWsgOiBKQU1VTkFNRSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAqIDogbm8tc3RhdGljLWxpbmsgPSB0cnVlIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIHByb3BlcnRpZXMgPSBbICQocHJvcGVydHktc2V0KS5yYXcgXSA7CisgICAgICAgIGxvY2FsIHJlYXNvbiA7CisgICAgICAgIGlmICQobm8tc3RhdGljLWxpbmspICYmIDxydW50aW1lLWxpbms+c3RhdGljIGluICQocHJvcGVydGllcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgPGxpbms+c2hhcmVkIGluICQocHJvcGVydGllcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWFzb24gPSBPbiBnY2MsIERMTHMgY2FuIG5vdCBiZSBidWlsdCB3aXRoCisgICAgICAgICAgICAgICAgICAgICc8cnVudGltZS1saW5rPnN0YXRpYycuIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgWyB0eXBlLmlzLWRlcml2ZWQgJChzZWxmLnRhcmdldC10eXBlc1sxXSkgRVhFIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgbG9jYWwgcyBpbiAkKHNvdXJjZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NhbCB0eXBlID0gWyAkKHMpLnR5cGUgXSA7CisgICAgICAgICAgICAgICAgICAgIGlmICQodHlwZSkgJiYgWyB0eXBlLmlzLWRlcml2ZWQgJCh0eXBlKSBTSEFSRURfTElCIF0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uID0gT24gZ2NjLCB1c2luZyBETExzIHRvZ2V0aGVyIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxydW50aW1lLWxpbms+c3RhdGljJyBvcHRpb24gaXMgbm90IHBvc3NpYmxlLiA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgJChyZWFzb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gd2FybmluZzogJChyZWFzb24pIDsKKyAgICAgICAgICAgIEVDSE8gd2FybmluZzogSXQgaXMgc3VnZ2VzdGVkIHRvIHVzZSAnPHJ1bnRpbWUtbGluaz5zdGF0aWMnIHRvZ2V0aGVyCisgICAgICAgICAgICAgICAgd2l0aCAnPGxpbms+c3RhdGljJy4gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFsgdW5peC1saW5raW5nLWdlbmVyYXRvci5ydW4gJChwcm9qZWN0KSAkKG5hbWUpIDoKKyAgICAgICAgICAgICAgICAkKHByb3BlcnR5LXNldCkgOiAkKHNvdXJjZXMpIF0gOworICAgICAgICB9CisgICAgfQorfQorCisjIFRoZSBzZXQgb2YgcGVybWlzc2libGUgaW5wdXQgdHlwZXMgaXMgZGlmZmVyZW50IG9uIG1pbmd3LiBTbywgZGVmaW5lIHR3byBzZXRzCisjIG9mIGdlbmVyYXRvcnMsIHdpdGggbWluZ3cgZ2VuZXJhdG9ycyBzZWxlY3RlZCB3aGVuIHRhcmdldC1vcz13aW5kb3dzLgorCitsb2NhbCBnIDsKK2cgPSBbIG5ldyBnY2MtbGlua2luZy1nZW5lcmF0b3IgZ2NjLm1pbmd3LmxpbmsKKyAgICAgIDogT0JKIFNFQVJDSEVEX0xJQiBTVEFUSUNfTElCIElNUE9SVF9MSUIKKyAgICAgIDogRVhFCisgICAgICA6IDx0b29sc2V0PmdjYyA8dGFyZ2V0LW9zPndpbmRvd3MgXSA7CiskKGcpLnNldC1ydWxlLW5hbWUgZ2NjLmxpbmsgOworZ2VuZXJhdG9ycy5yZWdpc3RlciAkKGcpIDsKKworZyA9IFsgbmV3IGdjYy1saW5raW5nLWdlbmVyYXRvciBnY2MubWluZ3cubGluay5kbGwKKyAgICAgIDogT0JKIFNFQVJDSEVEX0xJQiBTVEFUSUNfTElCIElNUE9SVF9MSUIKKyAgICAgIDogSU1QT1JUX0xJQiBTSEFSRURfTElCCisgICAgICA6IDx0b29sc2V0PmdjYyA8dGFyZ2V0LW9zPndpbmRvd3MgXSA7CiskKGcpLnNldC1ydWxlLW5hbWUgZ2NjLmxpbmsuZGxsIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXIgJChnKSA7CisKK2dlbmVyYXRvcnMucmVnaXN0ZXIKKyAgWyBuZXcgZ2NjLWxpbmtpbmctZ2VuZXJhdG9yIGdjYy5saW5rCisgICAgICA6IExJQiBPQkoKKyAgICAgIDogRVhFCisgICAgICA6IDx0b29sc2V0PmdjYyBdIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXIKKyAgWyBuZXcgZ2NjLWxpbmtpbmctZ2VuZXJhdG9yIGdjYy5saW5rLmRsbAorICAgICAgOiBMSUIgT0JKCisgICAgICA6IFNIQVJFRF9MSUIKKyAgICAgIDogPHRvb2xzZXQ+Z2NjIF0gOworCitnZW5lcmF0b3JzLm92ZXJyaWRlIGdjYy5taW5ndy5saW5rIDogZ2NjLmxpbmsgOworZ2VuZXJhdG9ycy5vdmVycmlkZSBnY2MubWluZ3cubGluay5kbGwgOiBnY2MubGluay5kbGwgOworCisjIEN5Z3dpbiBpcyBzaW1pbGFyIHRvIG1zdmMgYW5kIG1pbmd3IGluIHRoYXQgaXQgdXNlcyBpbXBvcnQgbGlicmFyaWVzLiBXaGlsZSBpbgorIyBzaW1wbGUgY2FzZXMsIGl0IGNhbiBkaXJlY3RseSBsaW5rIHRvIGEgc2hhcmVkIGxpYnJhcnksIGl0IGlzIGJlbGlldmVkIHRvIGJlCisjIHNsb3dlciwgYW5kIG5vdCBhbHdheXMgcG9zc2libGUuIERlZmluZSBjeWd3aW4tc3BlY2lmaWMgZ2VuZXJhdG9ycyBoZXJlLgorCitnID0gWyBuZXcgZ2NjLWxpbmtpbmctZ2VuZXJhdG9yIGdjYy5jeWd3aW4ubGluaworICAgICAgOiBPQkogU0VBUkNIRURfTElCIFNUQVRJQ19MSUIgSU1QT1JUX0xJQgorICAgICAgOiBFWEUKKyAgICAgIDogPHRvb2xzZXQ+Z2NjIDx0YXJnZXQtb3M+Y3lnd2luIF0gOworJChnKS5zZXQtcnVsZS1uYW1lIGdjYy5saW5rIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXIgJChnKSA7CisKK2cgPSBbIG5ldyBnY2MtbGlua2luZy1nZW5lcmF0b3IgZ2NjLmN5Z3dpbi5saW5rLmRsbAorICAgICAgOiBPQkogU0VBUkNIRURfTElCIFNUQVRJQ19MSUIgSU1QT1JUX0xJQgorICAgICAgOiBJTVBPUlRfTElCIFNIQVJFRF9MSUIKKyAgICAgIDogPHRvb2xzZXQ+Z2NjIDx0YXJnZXQtb3M+Y3lnd2luIF0gOworJChnKS5zZXQtcnVsZS1uYW1lIGdjYy5saW5rLmRsbCA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyICQoZykgOworCitnZW5lcmF0b3JzLm92ZXJyaWRlIGdjYy5jeWd3aW4ubGluayA6IGdjYy5saW5rIDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgZ2NjLmN5Z3dpbi5saW5rLmRsbCA6IGdjYy5saW5rLmRsbCA7CisKKyMgRGVjbGFyZSBmbGFncyBmb3IgbGlua2luZy4KKyMgRmlyc3QsIHRoZSBjb21tb24gZmxhZ3MuCit0b29sc2V0LmZsYWdzIGdjYy5saW5rIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b24gOiAtZyA7Cit0b29sc2V0LmZsYWdzIGdjYy5saW5rIE9QVElPTlMgPHByb2ZpbGluZz5vbiA6IC1wZyA7Cit0b29sc2V0LmZsYWdzIGdjYy5saW5rIFVTRVJfT1BUSU9OUyA8bGlua2ZsYWdzPiA7Cit0b29sc2V0LmZsYWdzIGdjYy5saW5rIExJTktQQVRIIDxsaWJyYXJ5LXBhdGg+IDsKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmxpbmsgRklORExJQlMtU1QgPGZpbmQtc3RhdGljLWxpYnJhcnk+IDsKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmxpbmsgRklORExJQlMtU0EgPGZpbmQtc2hhcmVkLWxpYnJhcnk+IDsKK3Rvb2xzZXQuZmxhZ3MgZ2NjLmxpbmsgTElCUkFSSUVTIDxsaWJyYXJ5LWZpbGU+IDsKKwordG9vbHNldC5mbGFncyBnY2MubGluay5kbGwgLklNUExJQi1DT01NQU5EIDx0YXJnZXQtb3M+d2luZG93cyA6ICItV2wsLS1vdXQtaW1wbGliLCIgOwordG9vbHNldC5mbGFncyBnY2MubGluay5kbGwgLklNUExJQi1DT01NQU5EIDx0YXJnZXQtb3M+Y3lnd2luIDogIi1XbCwtLW91dC1pbXBsaWIsIiA7CisKKyMgRm9yIDxydW50aW1lLWxpbms+c3RhdGljIHdlIG1hZGUgc3VyZSB0aGVyZSBhcmUgbm8gZHluYW1pYyBsaWJyYXJpZXMgaW4gdGhlCisjIGxpbmsuIE9uIEhQLVVYIG5vdCBhbGwgc3lzdGVtIGxpYnJhcmllcyBleGlzdCBhcyBhcmNoaXZlZCBsaWJyYXJpZXMgKGZvcgorIyBleGFtcGxlLCB0aGVyZSBpcyBubyBsaWJ1bndpbmQuYSksIHNvLCBvbiB0aGlzIHBsYXRmb3JtLCB0aGUgLXN0YXRpYyBvcHRpb24KKyMgY2Fubm90IGJlIHNwZWNpZmllZC4KK2lmIFsgb3MubmFtZSBdICE9IEhQVVgKK3sKKyAgICB0b29sc2V0LmZsYWdzIGdjYy5saW5rIE9QVElPTlMgPHJ1bnRpbWUtbGluaz5zdGF0aWMgOiAtc3RhdGljIDsKK30KKworIyBOb3csIHRoZSB2ZW5kb3Igc3BlY2lmaWMgZmxhZ3MuCisjIFRoZSBwYXJhbWV0ZXIgbGlua2VyIGNhbiBiZSBlaXRoZXIgYWl4LCBkYXJ3aW4sIGdudSwgaHB1eCwgb3NmIG9yIHN1bi4KK3J1bGUgaW5pdC1saW5rLWZsYWdzICggdG9vbHNldCBsaW5rZXIgY29uZGl0aW9uICkKK3sKKyAgICBzd2l0Y2ggJChsaW5rZXIpCisgICAgeworICAgIGNhc2UgYWl4IDoKKyAgICAgICAgIyBPbiBBSVggd2UgKmhhdmUqIHRvIHVzZSB0aGUgbmF0aXZlIGxpbmtlci4KKyAgICAgICAgIworICAgICAgICAjIFVzaW5nIC1icnRsLCB0aGUgQUlYIGxpbmtlciB3aWxsIGxvb2sgZm9yIGxpYnJhcmllcyB3aXRoIGJvdGggdGhlIC5hCisgICAgICAgICMgYW5kIC5zbyBleHRlbnNpb25zLCBzdWNoIGFzIGxpYmZvby5hIGFuZCBsaWJmb28uc28uIFdpdGhvdXQgLWJydGwsIHRoZQorICAgICAgICAjIEFJWCBsaW5rZXIgbG9va3Mgb25seSBmb3IgbGliZm9vLmEuIE5vdGUgdGhhdCBsaWJmb28uYSBpcyBhbiBhcmNoaXZlZAorICAgICAgICAjIGZpbGUgdGhhdCBtYXkgY29udGFpbiBzaGFyZWQgb2JqZWN0cyBhbmQgaXMgZGlmZmVyZW50IGZyb20gc3RhdGljIGxpYnMKKyAgICAgICAgIyBhcyBvbiBMaW51eC4KKyAgICAgICAgIworICAgICAgICAjIFRoZSAtYm5vaXBhdGggc3RyaXBzIHRoZSBwcmVwZW5kaW5nIChyZWxhdGl2ZSkgcGF0aCBvZiBsaWJyYXJpZXMgZnJvbQorICAgICAgICAjIHRoZSBsb2FkZXIgc2VjdGlvbiBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkgb3IgZXhlY3V0YWJsZS4gSGVuY2UsIGR1cmluZworICAgICAgICAjIGxvYWQtdGltZSBMSUJQQVRIIChpZGVudGljYWwgdG8gTERfTElCUkFSWV9QQVRIKSBvciBhIGhhcmQtY29kZWQKKyAgICAgICAgIyAtYmxpYnBhdGggKCpzaW1pbGFyKiB0byAtbHJwYXRoLy1scnBhdGgtbGluaykgaXMgc2VhcmNoZWQuIFdpdGhvdXQKKyAgICAgICAgIyB0aGlzIG9wdGlvbiwgdGhlIHByZXBlbmRpbmcgKHJlbGF0aXZlKSBwYXRoICsgbGlicmFyeSBuYW1lIGlzCisgICAgICAgICMgaGFyZC1jb2RlZCBpbiB0aGUgbG9hZGVyIHNlY3Rpb24sIGNhdXNpbmcgKm9ubHkqIHRoaXMgcGF0aCB0byBiZQorICAgICAgICAjIHNlYXJjaGVkIGR1cmluZyBsb2FkLXRpbWUuIE5vdGUgdGhhdCB0aGUgQUlYIGxpbmtlciBkb2VzIG5vdCBoYXZlIGFuCisgICAgICAgICMgLXNvbmFtZSBlcXVpdmFsZW50LCB0aGlzIGlzIGFzIGNsb3NlIGFzIGl0IGdldHMuCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgYWJvdmUgb3B0aW9ucyBhcmUgZGVmaW5hdGVseSBmb3IgQUlYIDUueCwgYW5kIG1vc3QgbGlrZWx5IGFsc28gZm9yCisgICAgICAgICMgQUlYIDQueCBhbmQgQUlYIDYueC4gRm9yIGRldGFpbHMgYWJvdXQgdGhlIEFJWCBsaW5rZXIgc2VlOgorICAgICAgICAjIGh0dHA6Ly9kb3dubG9hZC5ib3VsZGVyLmlibS5jb20vaWJtZGwvcHViL3NvZnR3YXJlL2R3L2FpeC9lcy1haXhfbGwucGRmCisgICAgICAgICMKKworICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBPUFRJT05TIDogLVdsLC1icnRsIC1XbCwtYm5vaXBhdGgKKyAgICAgICAgICAgIDogdW5jaGVja2VkIDsKKworICAgIGNhc2UgZGFyd2luIDoKKyAgICAgICAgIyBPbiBEYXJ3aW4sIHRoZSAtcyBvcHRpb24gdG8gbGQgZG9lcyBub3Qgd29yayB1bmxlc3Mgd2UgcGFzcyAtc3RhdGljLAorICAgICAgICAjIGFuZCBwYXNzaW5nIC1zdGF0aWMgdW5jb25kaXRpb25hbGx5IGlzIGEgYmFkIGlkZWEuIFNvLCBkbyBub3QgcGFzcyAtcworICAgICAgICAjIGF0IGFsbCBhbmQgZGFyd2luLmphbSB3aWxsIHVzZSBhIHNlcGFyYXRlICdzdHJpcCcgaW52b2NhdGlvbi4KKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmxpbmsgUlBBVEggJChjb25kaXRpb24pIDogPGRsbC1wYXRoPiA6CisgICAgICAgICAgICB1bmNoZWNrZWQgOworICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBSUEFUSF9MSU5LICQoY29uZGl0aW9uKSA6IDx4ZGxsLXBhdGg+IDoKKyAgICAgICAgICAgIHVuY2hlY2tlZCA7CisKKyAgICBjYXNlIGdudSA6CisgICAgICAgICMgU3RyaXAgdGhlIGJpbmFyeSB3aGVuIG5vIGRlYnVnZ2luZyBpcyBuZWVkZWQuIFdlIHVzZSAtLXN0cmlwLWFsbCBmbGFnCisgICAgICAgICMgYXMgb3Bwb3NlZCB0byAtcyBzaW5jZSBpY2MgKGludGVsJ3MgY29tcGlsZXIpIGlzIGdlbmVyYWxseQorICAgICAgICAjIG9wdGlvbi1jb21wYXRpYmxlIHdpdGggYW5kIGluaGVyaXRzIGZyb20gdGhlIGdjYyB0b29sc2V0LCBidXQgZG9lcyBub3QKKyAgICAgICAgIyBzdXBwb3J0IC1zLgorICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBPUFRJT05TICAgICAkKGNvbmRpdGlvbikvPHN0cmlwPm9uIDogLVdsLC0tc3RyaXAtYWxsICAgOiB1bmNoZWNrZWQgOworICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBSUEFUSCAgICAgICAkKGNvbmRpdGlvbikgICAgICAgICAgIDogPGRsbC1wYXRoPiAgICAgICAgOiB1bmNoZWNrZWQgOworICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBSUEFUSF9MSU5LICAkKGNvbmRpdGlvbikgICAgICAgICAgIDogPHhkbGwtcGF0aD4gICAgICAgOiB1bmNoZWNrZWQgOworICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBTVEFSVC1HUk9VUCAkKGNvbmRpdGlvbikgICAgICAgICAgIDogLVdsLC0tc3RhcnQtZ3JvdXAgOiB1bmNoZWNrZWQgOworICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBFTkQtR1JPVVAgICAkKGNvbmRpdGlvbikgICAgICAgICAgIDogLVdsLC0tZW5kLWdyb3VwICAgOiB1bmNoZWNrZWQgOworCisgICAgICAgICMgZ251IGxkIGhhcyB0aGUgYWJpbGl0eSB0byBjaGFuZ2UgdGhlIHNlYXJjaCBiZWhhdmlvdXIgZm9yIGxpYnJhcmllcworICAgICAgICAjIHJlZmVyZW5jZWQgYnkgdGhlIC1sIHN3aXRjaC4gVGhlc2UgbW9kaWZpZXJzIGFyZSAtQnN0YXRpYyBhbmQKKyAgICAgICAgIyAtQmR5bmFtaWMgYW5kIGNoYW5nZSBzZWFyY2ggZm9yIC1sIHN3aXRjaGVzIHRoYXQgZm9sbG93IHRoZW0uIFRoZQorICAgICAgICAjIGZvbGxvd2luZyBsaXN0IHNob3dzIHRoZSB0cmllZCB2YXJpYW50cy4gU2VhcmNoIHN0b3BzIGF0IHRoZSBmaXJzdAorICAgICAgICAjIHZhcmlhbnQgdGhhdCBoYXMgYSBtYXRjaC4KKyAgICAgICAgIworICAgICAgICAjICpuaXg6IC1Cc3RhdGljIC1seHh4CisgICAgICAgICMgICAgbGlieHh4LmEKKyAgICAgICAgIworICAgICAgICAjICpuaXg6IC1CZHluYW1pYyAtbHh4eAorICAgICAgICAjICAgIGxpYnh4eC5zbworICAgICAgICAjICAgIGxpYnh4eC5hCisgICAgICAgICMKKyAgICAgICAgIyB3aW5kb3dzIChtaW5ndywgY3lnd2luKSAtQnN0YXRpYyAtbHh4eAorICAgICAgICAjICAgIGxpYnh4eC5hCisgICAgICAgICMgICAgeHh4LmxpYgorICAgICAgICAjCisgICAgICAgICMgd2luZG93cyAobWluZ3csIGN5Z3dpbikgLUJkeW5hbWljIC1seHh4CisgICAgICAgICMgICAgbGlieHh4LmRsbC5hCisgICAgICAgICMgICAgeHh4LmRsbC5hCisgICAgICAgICMgICAgbGlieHh4LmEKKyAgICAgICAgIyAgICB4eHgubGliCisgICAgICAgICMgICAgY3lneHh4LmRsbCAoKikKKyAgICAgICAgIyAgICBsaWJ4eHguZGxsCisgICAgICAgICMgICAgeHh4LmRsbAorICAgICAgICAjICAgIGxpYnh4eC5hCisgICAgICAgICMKKyAgICAgICAgIyAoKikgVGhpcyBpcyBmb3IgY3lnd2luCisgICAgICAgICMgUGxlYXNlIG5vdGUgdGhhdCAtQnN0YXRpYyBhbmQgLUJkeW5hbWljIGFyZSBub3QgYSBndWFyYW50ZWUgdGhhdCBhCisgICAgICAgICMgc3RhdGljIG9yIGR5bmFtaWMgbGliIGluZGVlZCBnZXRzIGxpbmtlZCBpbi4gVGhlIHN3aXRjaGVzIG9ubHkgY2hhbmdlCisgICAgICAgICMgc2VhcmNoIHBhdHRlcm5zIQorCisgICAgICAgICMgT24gKm5peCBtaXhpbmcgc2hhcmVkIGxpYnMgd2l0aCBzdGF0aWMgcnVudGltZSBpcyBub3QgYSBnb29kIGlkZWEuCisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5saW5rIEZJTkRMSUJTLVNULVBGWAorICAgICAgICAgICAgJChjb25kaXRpb24pLzxydW50aW1lLWxpbms+c2hhcmVkIDogLVdsLC1Cc3RhdGljIDogdW5jaGVja2VkIDsKKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmxpbmsgRklORExJQlMtU0EtUEZYCisgICAgICAgICAgICAkKGNvbmRpdGlvbikvPHJ1bnRpbWUtbGluaz5zaGFyZWQgOiAtV2wsLUJkeW5hbWljIDogdW5jaGVja2VkIDsKKworICAgICAgICAjIE9uIHdpbmRvd3MgYWxsb3cgbWl4aW5nIG9mIHN0YXRpYyBhbmQgZHluYW1pYyBsaWJzIHdpdGggc3RhdGljCisgICAgICAgICMgcnVudGltZSBpcyBub3QgYSBnb29kIGlkZWEuCisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5saW5rIEZJTkRMSUJTLVNULVBGWAorICAgICAgICAgICAgJChjb25kaXRpb24pLzxydW50aW1lLWxpbms+c3RhdGljLzx0YXJnZXQtb3M+d2luZG93cyA6IC1XbCwtQnN0YXRpYworICAgICAgICAgICAgOiB1bmNoZWNrZWQgOworICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBGSU5ETElCUy1TQS1QRlgKKyAgICAgICAgICAgICQoY29uZGl0aW9uKS88cnVudGltZS1saW5rPnN0YXRpYy88dGFyZ2V0LW9zPndpbmRvd3MgOiAtV2wsLUJkeW5hbWljCisgICAgICAgICAgICA6IHVuY2hlY2tlZCA7CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5saW5rIE9QVElPTlMKKyAgICAgICAgICAgICQoY29uZGl0aW9uKS88cnVudGltZS1saW5rPnN0YXRpYy88dGFyZ2V0LW9zPndpbmRvd3MgOiAtV2wsLUJzdGF0aWMKKyAgICAgICAgICAgIDogdW5jaGVja2VkIDsKKworICAgIGNhc2UgaHB1eCA6CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5saW5rIE9QVElPTlMgJChjb25kaXRpb24pLzxzdHJpcD5vbiA6IC1XbCwtcyA6CisgICAgICAgICAgICB1bmNoZWNrZWQgOworICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBPUFRJT05TICQoY29uZGl0aW9uKS88bGluaz5zaGFyZWQgOiAtZlBJQworICAgICAgICAgICAgOiB1bmNoZWNrZWQgOworCisgICAgY2FzZSBvc2YgOgorICAgICAgICAjIE5vIC0tc3RyaXAtYWxsLCBqdXN0IC1zLgorICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBPUFRJT05TICQoY29uZGl0aW9uKS88c3RyaXA+b24gOiAtV2wsLXMgOgorICAgICAgICAgICAgdW5jaGVja2VkIDsKKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmxpbmsgUlBBVEggJChjb25kaXRpb24pIDogPGRsbC1wYXRoPiA6CisgICAgICAgICAgICB1bmNoZWNrZWQgOworICAgICAgICAjIFRoaXMgZG9lcyBub3Qgc3VwcG9ydCAtUi4KKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmxpbmsgUlBBVEhfT1BUSU9OICQoY29uZGl0aW9uKSA6IC1ycGF0aCA6CisgICAgICAgICAgICB1bmNoZWNrZWQgOworICAgICAgICAjIC1ycGF0aC1saW5rIGlzIG5vdCBzdXBwb3J0ZWQgYXQgYWxsLgorCisgICAgY2FzZSBzdW4gOgorICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBPUFRJT05TICQoY29uZGl0aW9uKS88c3RyaXA+b24gOiAtV2wsLXMgOgorICAgICAgICAgICAgdW5jaGVja2VkIDsKKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmxpbmsgUlBBVEggJChjb25kaXRpb24pIDogPGRsbC1wYXRoPiA6CisgICAgICAgICAgICB1bmNoZWNrZWQgOworICAgICAgICAjIFNvbGFyaXMgbGlua2VyIGRvZXMgbm90IGhhdmUgYSBzZXBhcmF0ZSAtcnBhdGgtbGluaywgYnV0IGFsbG93cyB1c2luZworICAgICAgICAjIC1MIGZvciB0aGUgc2FtZSBwdXJwb3NlLgorICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBMSU5LUEFUSCAkKGNvbmRpdGlvbikgOiA8eGRsbC1wYXRoPiA6CisgICAgICAgICAgICB1bmNoZWNrZWQgOworCisgICAgICAgICMgVGhpcyBwZXJtaXRzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCBub24tUElDIGNvZGUgb24gU29sYXJpcy4KKyAgICAgICAgIyBWUCwgMjAwNC8wOS8wNzogTm93IHRoYXQgd2UgaGF2ZSAtZlBJQyBoYXJkY29kZSBpbiBsaW5rLmRsbCwgdGhlCisgICAgICAgICMgZm9sbG93aW5nIGlzIG5vdCBuZWVkZWQuIFdoZXRoZXIgLWZQSUMgc2hvdWxkIGJlIGhhcmRjb2RlZCwgaXMgYQorICAgICAgICAjIHNlcGFyYXRlIHF1ZXN0aW9uLgorICAgICAgICAjIEFILCAyMDA0LzEwLzE2OiBpdCBpcyBzdGlsbCBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIHRlc3RzIGxpbmsgYWdhaW5zdAorICAgICAgICAjIHN0YXRpYyBsaWJyYXJpZXMgdGhhdCB3ZXJlIGNvbXBpbGVkIHdpdGhvdXQgUElDLgorICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkubGluayBPUFRJT05TICQoY29uZGl0aW9uKS88bGluaz5zaGFyZWQgOgorICAgICAgICAgICAgLW1pbXB1cmUtdGV4dCA6IHVuY2hlY2tlZCA7CisKKyAgICBjYXNlICogOgorICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgJCh0b29sc2V0KSBpbml0aWFsaXphdGlvbjogaW52YWxpZCBsaW5rZXIgJyQobGlua2VyKScKKyAgICAgICAgICAgIDogVGhlIHZhbHVlICckKGxpbmtlciknIHNwZWNpZmllZCBmb3IgPGxpbmtlcj4gaXMgbm90IHJlY29nbml6ZWQuCisgICAgICAgICAgICA6IFBvc3NpYmxlIHZhbHVlcyBhcmUgJ2FpeCcsICdkYXJ3aW4nLCAnZ251JywgJ2hwdXgnLCAnb3NmJyBvciAnc3VuJworICAgICAgICAgICAgOworICAgIH0KK30KKworCisjIEVuY2xvc2UgdGhlIFJQQVRIIHZhcmlhYmxlIG9uICd0YXJnZXRzJyBpbiBkb3VibGUgcXVvdGVzLCB1bmxlc3MgaXQgaXMgYWxyZWFkeQorIyBlbmNsb3NlZCBpbiBzaW5nbGUgcXVvdGVzLiBUaGlzIHNwZWNpYWwgY2FzaW5nIGlzIGRvbmUgYmVjYXVzZSBpdCBpcyBjb21tb24gdG8KKyMgcGFzcyAnJE9SSUdJTicgdG8gbGlua2VyIC0tIGFuZCBpdCBoYXMgdG8gaGF2ZSBzaW5nbGUgcXVvdGVzIHRvIHByZXZlbnQgc2hlbGwKKyMgZXhwYW5zaW9uIC0tIGFuZCBpZiB3ZSBhZGQgZG91YmxlIHF1b3RlcyB0aGVuIHRoZSBwcmV2ZW50aW5nIHByb3BlcnRpZXMgb2YKKyMgc2luZ2xlIHF1b3RlcyBkaXNhcHBlYXIuCisjCitydWxlIHF1b3RlLXJwYXRoICggdGFyZ2V0cyAqICkKK3sKKyAgICBsb2NhbCByID0gWyBvbiAkKHRhcmdldHNbMV0pIHJldHVybiAkKFJQQVRIKSBdIDsKKyAgICBpZiAhIFsgTUFUQ0ggKCcuKicpIDogJChyKSBdCisgICAgeworICAgICAgICByID0gXCIkKHIpXCIgOworICAgIH0KKyAgICBSUEFUSCBvbiAkKHRhcmdldHMpID0gJChyKSA7Cit9CisKKyMgRGVjbGFyZSBhY3Rpb25zIGZvciBsaW5raW5nLgorcnVsZSBsaW5rICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBzZXR1cC10aHJlYWRpbmcgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBzZXR1cC1hZGRyZXNzLW1vZGVsICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgICAgU1BBQ0Ugb24gJCh0YXJnZXRzKSA9ICIgIiA7CisgICAgIyBTZXJpYWxpemUgZXhlY3V0aW9uIG9mIHRoZSAnbGluaycgYWN0aW9uLCBzaW5jZSBydW5uaW5nIE4gbGlua3MgaW4KKyAgICAjIHBhcmFsbGVsIGlzIGp1c3Qgc2xvd2VyLiBGb3Igbm93LCBzZXJpYWxpemUgb25seSBnY2MgbGlua3MsIGl0IG1pZ2h0IGJlIGEKKyAgICAjIGdvb2QgaWRlYSB0byBzZXJpYWxpemUgYWxsIGxpbmtzLgorICAgIEpBTV9TRU1BUEhPUkUgb24gJCh0YXJnZXRzKSA9IDxzPmdjYy1saW5rLXNlbWFwaG9yZSA7CisgICAgcXVvdGUtcnBhdGggJCh0YXJnZXRzKSA7Cit9CisKK2FjdGlvbnMgbGluayBiaW5kIExJQlJBUklFUworeworICAgICIkKENPTkZJR19DT01NQU5EKSIgLUwiJChMSU5LUEFUSCkiIC1XbCwkKFJQQVRIX09QVElPTjpFPS1SKSQoU1BBQ0UpLVdsLCQoUlBBVEgpIC1XbCwtcnBhdGgtbGluayQoU1BBQ0UpLVdsLCIkKFJQQVRIX0xJTkspIiAtbyAiJCg8KSIgJChTVEFSVC1HUk9VUCkgIiQoPikiICIkKExJQlJBUklFUykiICQoRklORExJQlMtU1QtUEZYKSAtbCQoRklORExJQlMtU1QpICQoRklORExJQlMtU0EtUEZYKSAtbCQoRklORExJQlMtU0EpICQoRU5ELUdST1VQKSAkKE9QVElPTlMpICQoVVNFUl9PUFRJT05TKQorfQorCisKKyMgRGVmYXVsdCB2YWx1ZS4gTW9zdGx5IGZvciB0aGUgc2FrZSBvZiBpbnRlbC1saW51eCB0aGF0IGluaGVyaXRzIGZyb20gZ2NjLCBidXQKKyMgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBsb2dpYyB0byBzZXQgdGhlIC5BUiB2YXJpYWJsZS4gV2UgY2FuIHB1dCB0aGUgc2FtZQorIyBsb2dpYyBpbiBpbnRlbC1saW51eCwgYnV0IHRoYXQgaXMgaGFyZGx5IHdvcnRoIHRoZSB0cm91YmxlIGFzIG9uIExpbnV4LCAnYXInCisjIGlzIGFsd2F5cyBhdmFpbGFibGUuCisuQVIgPSBhciA7CisuUkFOTElCID0gcmFubGliIDsKKwordG9vbHNldC5mbGFncyBnY2MuYXJjaGl2ZSBBUk9QVElPTlMgPGFyY2hpdmVmbGFncz4gOworCitydWxlIGFyY2hpdmUgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgICMgQWx3YXlzIHJlbW92ZSBhcmNoaXZlIGFuZCBzdGFydCBhZ2Fpbi4gSGVyZSBpcyB0aGUgcmF0aW9uYWxlIGZyb20KKyAgICAjCisgICAgIyBBbmRyZSBIZW50ejoKKyAgICAjCisgICAgIyBJIGhhZCBhIGZpbGUsIHNheSBhMS5jLCB0aGF0IHdhcyBpbmNsdWRlZCBpbnRvIGxpYmEuYS4gSSBtb3ZlZCBhMS5jIHRvCisgICAgIyBhMi5jLCB1cGRhdGVkIG15IEphbWZpbGVzIGFuZCByZWJ1aWx0LiBNeSBwcm9ncmFtIHdhcyBjcmFzaGluZyB3aXRoIGFic3VyZAorICAgICMgZXJyb3JzLiBBZnRlciBzb21lIGRlYnVnZ2luZyBJIHRyYWNlZCBpdCBiYWNrIHRvIHRoZSBmYWN0IHRoYXQgYTEubyB3YXMKKyAgICAjICpzdGlsbCogaW4gbGliYS5hCisgICAgIworICAgICMgUmVuZSBSaXZlcmE6CisgICAgIworICAgICMgT3JpZ2luYWxseSByZW1vdmluZyB0aGUgYXJjaGl2ZSB3YXMgZG9uZSBieSBzcGxpY2luZyBhbiBSTSBvbnRvIHRoZQorICAgICMgYXJjaGl2ZSBhY3Rpb24uIFRoYXQgbWFrZXMgYXJjaGl2ZXMgZmFpbCB0byBidWlsZCBvbiBOVCB3aGVuIHRoZXkgaGF2ZQorICAgICMgbWFueSBmaWxlcyBiZWNhdXNlIGl0IHdpbGwgbm8gbG9uZ2VyIGV4ZWN1dGUgdGhlIGFjdGlvbiBkaXJlY3RseSBhbmQgYmxvdworICAgICMgdGhlIGxpbmUgbGVuZ3RoIGxpbWl0LiBJbnN0ZWFkIHdlIHJlbW92ZSB0aGUgZmlsZSBpbiBhIGRpZmZlcmVudCBhY3Rpb24sCisgICAgIyBqdXN0IGJlZm9yZSBidWlsZGluZyB0aGUgYXJjaGl2ZS4KKyAgICAjCisgICAgbG9jYWwgY2xlYW4uYSA9ICQodGFyZ2V0c1sxXSkoY2xlYW4pIDsKKyAgICBURU1QT1JBUlkgJChjbGVhbi5hKSA7CisgICAgTk9DQVJFICQoY2xlYW4uYSkgOworICAgIExPQ0FURSBvbiAkKGNsZWFuLmEpID0gWyBvbiAkKHRhcmdldHNbMV0pIHJldHVybiAkKExPQ0FURSkgXSA7CisgICAgREVQRU5EUyAkKGNsZWFuLmEpIDogJChzb3VyY2VzKSA7CisgICAgREVQRU5EUyAkKHRhcmdldHMpIDogJChjbGVhbi5hKSA7CisgICAgY29tbW9uLlJtVGVtcHMgJChjbGVhbi5hKSA6ICQodGFyZ2V0cykgOworfQorCisjIERlY2xhcmUgYWN0aW9uIGZvciBjcmVhdGluZyBzdGF0aWMgbGlicmFyaWVzLgorIyBUaGUgbGV0dGVyICdyJyBtZWFucyB0byBhZGQgZmlsZXMgdG8gdGhlIGFyY2hpdmUgd2l0aCByZXBsYWNlbWVudC4gU2luY2Ugd2UKKyMgcmVtb3ZlIGFyY2hpdmUsIHdlIGRvIG5vdCBjYXJlIGFib3V0IHJlcGxhY2VtZW50LCBidXQgdGhlcmUgaXMgbm8gb3B0aW9uICJhZGQKKyMgd2l0aG91dCByZXBsYWNlbWVudCIuCisjIFRoZSBsZXR0ZXIgJ2MnIHN1cHByZXNzZXMgdGhlIHdhcm5pbmcgaW4gY2FzZSB0aGUgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdHMgeWV0LgorIyBUaGF0IHdhcm5pbmcgaXMgcHJvZHVjZWQgb25seSBvbiBzb21lIHBsYXRmb3JtcywgZm9yIHdoYXRldmVyIHJlYXNvbnMuCisjCithY3Rpb25zIHBpZWNlbWVhbCBhcmNoaXZlCit7CisgICAgIiQoLkFSKSIgJChBUk9QVElPTlMpIHJjICIkKDwpIiAiJCg+KSIKKyAgICAiJCguUkFOTElCKSIgIiQoPCkiCit9CisKK3J1bGUgbGluay5kbGwgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIHNldHVwLXRocmVhZGluZyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIHNldHVwLWFkZHJlc3MtbW9kZWwgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBTUEFDRSBvbiAkKHRhcmdldHMpID0gIiAiIDsKKyAgICBKQU1fU0VNQVBIT1JFIG9uICQodGFyZ2V0cykgPSA8cz5nY2MtbGluay1zZW1hcGhvcmUgOworICAgIHF1b3RlLXJwYXRoICQodGFyZ2V0cykgOworfQorCisjIERpZmZlcnMgZnJvbSAnbGluaycgYWJvdmUgb25seSBieSAtc2hhcmVkLgorYWN0aW9ucyBsaW5rLmRsbCBiaW5kIExJQlJBUklFUworeworICAgICIkKENPTkZJR19DT01NQU5EKSIgLUwiJChMSU5LUEFUSCkiIC1XbCwkKFJQQVRIX09QVElPTjpFPS1SKSQoU1BBQ0UpLVdsLCQoUlBBVEgpICIkKC5JTVBMSUItQ09NTUFORCkkKDxbMV0pIiAtbyAiJCg8Wy0xXSkiICQoSEFWRV9TT05BTUUpLVdsLCQoU09OQU1FX09QVElPTikkKFNQQUNFKS1XbCwkKDxbLTFdOkQ9KSAtc2hhcmVkICQoU1RBUlQtR1JPVVApICIkKD4pIiAiJChMSUJSQVJJRVMpIiAkKEZJTkRMSUJTLVNULVBGWCkgLWwkKEZJTkRMSUJTLVNUKSAkKEZJTkRMSUJTLVNBLVBGWCkgLWwkKEZJTkRMSUJTLVNBKSAkKEVORC1HUk9VUCkgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykKK30KKworcnVsZSBzZXR1cC10aHJlYWRpbmcgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2FsIHRocmVhZGluZyA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIHRocmVhZGluZyA6ICQocHJvcGVydGllcykgXSA7CisgICAgaWYgJCh0aHJlYWRpbmcpID0gbXVsdGkKKyAgICB7CisgICAgICAgIGxvY2FsIHRhcmdldCA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIHRhcmdldC1vcyA6ICQocHJvcGVydGllcykgXSA7CisgICAgICAgIGxvY2FsIG9wdGlvbiA7CisgICAgICAgIGxvY2FsIGxpYnMgOworCisgICAgICAgIHN3aXRjaCAkKHRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB3aW5kb3dzIDogb3B0aW9uID0gLW10aHJlYWRzIDsKKyAgICAgICAgICAgIGNhc2UgY3lnd2luICA6IG9wdGlvbiA9IC1tdGhyZWFkcyA7CisgICAgICAgICAgICBjYXNlIHNvbGFyaXMgOiBvcHRpb24gPSAtcHRocmVhZHMgOyBsaWJzID0gcnQgOworICAgICAgICAgICAgY2FzZSBiZW9zICAgIDogIyBObyB0aHJlYWRpbmcgb3B0aW9ucy4KKyAgICAgICAgICAgIGNhc2UgKmJzZCAgICA6IG9wdGlvbiA9IC1wdGhyZWFkIDsgICMgVGhlcmUgaXMgbm8gLWxydCBvbiBCU0QuCisgICAgICAgICAgICBjYXNlIHNnaSAgICAgOiAjIGdjYyBvbiBJUklYIGRvZXMgbm90IHN1cHBvcnQgbXVsdGktdGhyZWFkaW5nLgorICAgICAgICAgICAgY2FzZSBkYXJ3aW4gIDogIyBObyB0aHJlYWRpbmcgb3B0aW9ucy4KKyAgICAgICAgICAgIGNhc2UgKiAgICAgICA6IG9wdGlvbiA9IC1wdGhyZWFkIDsgbGlicyA9IHJ0IDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICQob3B0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBPUFRJT05TIG9uICQodGFyZ2V0cykgKz0gJChvcHRpb24pIDsKKyAgICAgICAgfQorICAgICAgICBpZiAkKGxpYnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZJTkRMSUJTLVNBIG9uICQodGFyZ2V0cykgKz0gJChsaWJzKSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworbG9jYWwgcnVsZSBjcHUtZmxhZ3MgKCB0b29sc2V0IHZhcmlhYmxlIDogYXJjaGl0ZWN0dXJlIDogaW5zdHJ1Y3Rpb24tc2V0ICsgOgorICAgIHZhbHVlcyArIDogZGVmYXVsdCA/ICkKK3sKKyAgICBpZiAkKGRlZmF1bHQpCisgICAgeworICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkgJCh2YXJpYWJsZSkKKyAgICAgICAgICAgIDxhcmNoaXRlY3R1cmU+JChhcmNoaXRlY3R1cmUpLzxpbnN0cnVjdGlvbi1zZXQ+IDogJCh2YWx1ZXMpIDsKKyAgICB9CisgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpICQodmFyaWFibGUpCisgICAgICAgIDxhcmNoaXRlY3R1cmU+LzxpbnN0cnVjdGlvbi1zZXQ+JChpbnN0cnVjdGlvbi1zZXQpCisgICAgICAgIDxhcmNoaXRlY3R1cmU+JChhcmNoaXRlY3R1cmUpLzxpbnN0cnVjdGlvbi1zZXQ+JChpbnN0cnVjdGlvbi1zZXQpCisgICAgICAgIDogJCh2YWx1ZXMpIDsKK30KKworCisjIFNldCBhcmNoaXRlY3R1cmUvaW5zdHJ1Y3Rpb24tc2V0IG9wdGlvbnMuCisjCisjIHg4NiBhbmQgY29tcGF0aWJsZQorIyBUaGUgJ25hdGl2ZScgb3B0aW9uIGFwcGVhcmVkIGluIGdjYyA0LjIgc28gd2UgY2Fubm90IHNhZmVseSB1c2UgaXQgYXMgZGVmYXVsdC4KKyMgVXNlIGk2ODYgaW5zdGVhZCBmb3IgMzItYml0LgordG9vbHNldC5mbGFncyBnY2MgT1BUSU9OUyA8YXJjaGl0ZWN0dXJlPng4Ni88YWRkcmVzcy1tb2RlbD4zMi88aW5zdHJ1Y3Rpb24tc2V0PiA6IC1tYXJjaD1pNjg2IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IG5hdGl2ZSA6IC1tYXJjaD1uYXRpdmUgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogaTQ4NiA6IC1tYXJjaD1pNDg2IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGk1ODYgOiAtbWFyY2g9aTU4NiA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBpNjg2IDogLW1hcmNoPWk2ODYgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogcGVudGl1bSA6IC1tYXJjaD1wZW50aXVtIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IHBlbnRpdW0tbW14IDogLW1hcmNoPXBlbnRpdW0tbW14IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IHBlbnRpdW1wcm8gOiAtbWFyY2g9cGVudGl1bXBybyA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBwZW50aXVtMiA6IC1tYXJjaD1wZW50aXVtMiA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBwZW50aXVtMyA6IC1tYXJjaD1wZW50aXVtMyA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBwZW50aXVtM20gOiAtbWFyY2g9cGVudGl1bTNtIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IHBlbnRpdW0tbSA6IC1tYXJjaD1wZW50aXVtLW0gOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogcGVudGl1bTQgOiAtbWFyY2g9cGVudGl1bTQgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogcGVudGl1bTRtIDogLW1hcmNoPXBlbnRpdW00bSA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBwcmVzY290dCA6IC1tYXJjaD1wcmVzY290dCA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBub2NvbmEgOiAtbWFyY2g9bm9jb25hIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGNvcmUyIDogLW1hcmNoPWNvcmUyIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGNvbnJvZSA6IC1tYXJjaD1jb3JlMiA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBjb25yb2UteGUgOiAtbWFyY2g9Y29yZTIgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogY29ucm9lLWwgOiAtbWFyY2g9Y29yZTIgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogYWxsZW5kYWxlIDogLW1hcmNoPWNvcmUyIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IHdvbGZkYWxlIDogLW1hcmNoPWNvcmUyIC1tc3NlNC4xIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IG1lcm9tIDogLW1hcmNoPWNvcmUyIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IG1lcm9tLXhlIDogLW1hcmNoPWNvcmUyIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGtlbnRzZmllbGQgOiAtbWFyY2g9Y29yZTIgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDoga2VudHNmaWVsZC14ZSA6IC1tYXJjaD1jb3JlMiA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiB5b3Jrc2ZpZWxkIDogLW1hcmNoPWNvcmUyIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IHBlbnJ5biA6IC1tYXJjaD1jb3JlMiA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBjb3JlaTcgOiAtbWFyY2g9Y29yZWk3IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IG5laGFsZW0gOiAtbWFyY2g9Y29yZWk3IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGNvcmVpNy1hdnggOiAtbWFyY2g9Y29yZWk3LWF2eCA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBzYW5keS1icmlkZ2UgOiAtbWFyY2g9Y29yZWk3LWF2eCA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBjb3JlLWF2eC1pIDogLW1hcmNoPWNvcmUtYXZ4LWkgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogaXZ5LWJyaWRnZSA6IC1tYXJjaD1jb3JlLWF2eC1pIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGhhc3dlbGwgOiAtbWFyY2g9Y29yZS1hdngtaSAtbWF2eDIgLW1mbWEgLW1ibWkgLW1ibWkyIC1tbHpjbnQgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogazYgOiAtbWFyY2g9azYgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogazYtMiA6IC1tYXJjaD1rNi0yIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGs2LTMgOiAtbWFyY2g9azYtMyA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBhdGhsb24gOiAtbWFyY2g9YXRobG9uIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGF0aGxvbi10YmlyZCA6IC1tYXJjaD1hdGhsb24tdGJpcmQgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogYXRobG9uLTQgOiAtbWFyY2g9YXRobG9uLTQgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogYXRobG9uLXhwIDogLW1hcmNoPWF0aGxvbi14cCA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBhdGhsb24tbXAgOiAtbWFyY2g9YXRobG9uLW1wIDsKKyMjCitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBrOCA6IC1tYXJjaD1rOCA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBvcHRlcm9uIDogLW1hcmNoPW9wdGVyb24gOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogYXRobG9uNjQgOiAtbWFyY2g9YXRobG9uNjQgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogYXRobG9uLWZ4IDogLW1hcmNoPWF0aGxvbi1meCA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBrOC1zc2UzIDogLW1hcmNoPWs4LXNzZTMgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogb3B0ZXJvbi1zc2UzIDogLW1hcmNoPW9wdGVyb24tc3NlMyA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBhdGhsb242NC1zc2UzIDogLW1hcmNoPWF0aGxvbjY0LXNzZTMgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogYW1kZmFtMTAgOiAtbWFyY2g9YW1kZmFtMTAgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogYmFyY2Vsb25hIDogLW1hcmNoPWJhcmNlbG9uYSA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBiZHZlcjEgOiAtbWFyY2g9YmR2ZXIxIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGJkdmVyMiA6IC1tYXJjaD1iZHZlcjIgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogYmR2ZXIzIDogLW1hcmNoPWJkdmVyMyA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiB4ODYgOiBidHZlcjEgOiAtbWFyY2g9YnR2ZXIxIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGJ0dmVyMiA6IC1tYXJjaD1idHZlcjIgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogd2luY2hpcC1jNiA6IC1tYXJjaD13aW5jaGlwLWM2IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IHdpbmNoaXAyIDogLW1hcmNoPXdpbmNoaXAyIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGMzIDogLW1hcmNoPWMzIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHg4NiA6IGMzLTIgOiAtbWFyY2g9YzMtMiA7CisjIworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogeDg2IDogYXRvbSA6IC1tYXJjaD1hdG9tIDsKKyMgU3BhcmMKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHNwYXJjIDogYzMgOiAtbWNwdT1jMyA6IGRlZmF1bHQgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogc3BhcmMgOiB2NyA6IC1tY3B1PXY3IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHNwYXJjIDogY3lwcmVzcyA6IC1tY3B1PWN5cHJlc3MgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogc3BhcmMgOiB2OCA6IC1tY3B1PXY4IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHNwYXJjIDogc3VwZXJzcGFyYyA6IC1tY3B1PXN1cGVyc3BhcmMgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogc3BhcmMgOiBzcGFyY2xpdGUgOiAtbWNwdT1zcGFyY2xpdGUgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogc3BhcmMgOiBoeXBlcnNwYXJjIDogLW1jcHU9aHlwZXJzcGFyYyA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiBzcGFyYyA6IHNwYXJjbGl0ZTg2eCA6IC1tY3B1PXNwYXJjbGl0ZTg2eCA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiBzcGFyYyA6IGY5MzAgOiAtbWNwdT1mOTMwIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHNwYXJjIDogZjkzNCA6IC1tY3B1PWY5MzQgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogc3BhcmMgOiBzcGFyY2xldCA6IC1tY3B1PXNwYXJjbGV0IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHNwYXJjIDogdHNjNzAxIDogLW1jcHU9dHNjNzAxIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHNwYXJjIDogdjkgOiAtbWNwdT12OSA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiBzcGFyYyA6IHVsdHJhc3BhcmMgOiAtbWNwdT11bHRyYXNwYXJjIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHNwYXJjIDogdWx0cmFzcGFyYzMgOiAtbWNwdT11bHRyYXNwYXJjMyA7CisjIFJTLzYwMDAgJiBQb3dlclBDCitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiBwb3dlciA6IDQwMyA6IC1tY3B1PTQwMyA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiBwb3dlciA6IDUwNSA6IC1tY3B1PTUwNSA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiBwb3dlciA6IDYwMSA6IC1tY3B1PTYwMSA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiBwb3dlciA6IDYwMiA6IC1tY3B1PTYwMiA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiBwb3dlciA6IDYwMyA6IC1tY3B1PTYwMyA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiBwb3dlciA6IDYwM2UgOiAtbWNwdT02MDNlIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogNjA0IDogLW1jcHU9NjA0IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogNjA0ZSA6IC1tY3B1PTYwNGUgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogcG93ZXIgOiA2MjAgOiAtbWNwdT02MjAgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogcG93ZXIgOiA2MzAgOiAtbWNwdT02MzAgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogcG93ZXIgOiA3NDAgOiAtbWNwdT03NDAgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogcG93ZXIgOiA3NDAwIDogLW1jcHU9NzQwMCA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiBwb3dlciA6IDc0NTAgOiAtbWNwdT03NDUwIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogNzUwIDogLW1jcHU9NzUwIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogODAxIDogLW1jcHU9ODAxIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogODIxIDogLW1jcHU9ODIxIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogODIzIDogLW1jcHU9ODIzIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogODYwIDogLW1jcHU9ODYwIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogOTcwIDogLW1jcHU9OTcwIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogODU0MCA6IC1tY3B1PTg1NDAgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogcG93ZXIgOiBwb3dlciA6IC1tY3B1PXBvd2VyIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogcG93ZXIyIDogLW1jcHU9cG93ZXIyIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogcG93ZXIzIDogLW1jcHU9cG93ZXIzIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogcG93ZXI0IDogLW1jcHU9cG93ZXI0IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogcG93ZXI1IDogLW1jcHU9cG93ZXI1IDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogcG93ZXJwYyA6IC1tY3B1PXBvd2VycGMgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogcG93ZXIgOiBwb3dlcnBjNjQgOiAtbWNwdT1wb3dlcnBjNjQgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogcG93ZXIgOiByaW9zIDogLW1jcHU9cmlvcyA7CitjcHUtZmxhZ3MgZ2NjIE9QVElPTlMgOiBwb3dlciA6IHJpb3MxIDogLW1jcHU9cmlvczEgOworY3B1LWZsYWdzIGdjYyBPUFRJT05TIDogcG93ZXIgOiByaW9zMiA6IC1tY3B1PXJpb3MyIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogcnNjIDogLW1jcHU9cnNjIDsKK2NwdS1mbGFncyBnY2MgT1BUSU9OUyA6IHBvd2VyIDogcnM2NGEgOiAtbWNwdT1yczY0IDsKKyMgQUlYIHZhcmlhbnQgb2YgUlMvNjAwMCAmIFBvd2VyUEMKK3Rvb2xzZXQuZmxhZ3MgZ2NjIEFST1BUSU9OUyA8YWRkcmVzcy1tb2RlbD42NC88dGFyZ2V0LW9zPmFpeCA6ICItWCA2NCIgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9nZW5lcmF0ZS5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2dlbmVyYXRlLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMyZmEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9nZW5lcmF0ZS5qYW0KQEAgLTAsMCArMSwxMDggQEAKKyMgQ29weXJpZ2h0IDIwMDYgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBEZWNsYXJlcyBtYWluIHRhcmdldCAnZ2VuZXJhdGUnIHVzZWQgdG8gcHJvZHVjZSB0YXJnZXRzIGJ5IGNhbGxpbmcgYQorIyB1c2VyLXByb3ZpZGVkIHJ1bGUgdGhhdCB0YWtlcyBhbmQgcHJvZHVjZXMgdmlydHVhbCB0YXJnZXRzLgorCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgZXJyb3JzIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBwcm9qZWN0IDsKK2ltcG9ydCBwcm9wZXJ0eSA7CitpbXBvcnQgcHJvcGVydHktc2V0IDsKK2ltcG9ydCB0YXJnZXRzIDsKK2ltcG9ydCByZWdleCA7CisKKworZmVhdHVyZS5mZWF0dXJlIGdlbmVyYXRpbmctcnVsZSA6IDogZnJlZSA7CisKKworY2xhc3MgZ2VuZXJhdGVkLXRhcmdldC1jbGFzcyA6IGJhc2ljLXRhcmdldAoreworICAgIGltcG9ydCBlcnJvcnMgOworICAgIGltcG9ydCBpbmRpcmVjdCA7CisgICAgaW1wb3J0IHZpcnR1YWwtdGFyZ2V0IDsKKworICAgIHJ1bGUgX19pbml0X18gKCBuYW1lIDogcHJvamVjdCA6IHNvdXJjZXMgKiA6IHJlcXVpcmVtZW50cyAqCisgICAgICAgIDogZGVmYXVsdC1idWlsZCAqIDogdXNhZ2UtcmVxdWlyZW1lbnRzICogKQorICAgIHsKKyAgICAgICAgYmFzaWMtdGFyZ2V0Ll9faW5pdF9fICQobmFtZSkgOiAkKHByb2plY3QpIDogJChzb3VyY2VzKQorICAgICAgICAgICAgOiAkKHJlcXVpcmVtZW50cykgOiAkKGRlZmF1bHQtYnVpbGQpIDogJCh1c2FnZS1yZXF1aXJlbWVudHMpIDsKKworICAgICAgICBpZiAhIFsgJChzZWxmLnJlcXVpcmVtZW50cykuZ2V0IDxnZW5lcmF0aW5nLXJ1bGU+IF0KKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgIlRoZSBnZW5lcmF0ZSBydWxlIHJlcXVpcmVzIHRoZSA8Z2VuZXJhdGluZy1ydWxlPiIKKyAgICAgICAgICAgICAgICAicHJvcGVydHkgdG8gYmUgc2V0IiA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBydWxlIGNvbnN0cnVjdCAoIG5hbWUgOiBzb3VyY2VzICogOiBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgbG9jYWwgcmVzdWx0IDsKKyAgICAgICAgbG9jYWwgZ3IgPSBbICQocHJvcGVydHktc2V0KS5nZXQgPGdlbmVyYXRpbmctcnVsZT4gXSA7CisKKyAgICAgICAgIyBGSVhNRTogdGhpcyBpcyBhIGNvcHktcGFzdGUgZnJvbSB2aXJ0dWFsLXRhcmdldC5qYW0uIFdlIHNob3VsZCBhZGQgYQorICAgICAgICAjIHV0aWxpdHkgcnVsZSB0byBjYWxsIGEgcnVsZSBsaWtlIHRoaXMuCisgICAgICAgIGxvY2FsIHJ1bGUtbmFtZSA9IFsgTUFUQ0ggXkAoLiopIDogJChncikgXSA7CisgICAgICAgIGlmICQocnVsZS1uYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKGdyWzJdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsIHRhcmdldC1uYW1lID0gWyBmdWxsLW5hbWUgXSA7CisgICAgICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgIk11bHRpcGxlIDxnZW5lcmF0aW5nLXJ1bGU+IHByb3BlcnRpZXMiCisgICAgICAgICAgICAgICAgICAgICJlbmNvdW50ZXJlZCBmb3IgdGFyZ2V0ICQodGFyZ2V0LW5hbWUpLiIgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQgPSBbIGluZGlyZWN0LmNhbGwgJChydWxlLW5hbWUpICQoc2VsZi5wcm9qZWN0KSAkKG5hbWUpCisgICAgICAgICAgICAgICAgOiAkKHByb3BlcnR5LXNldCkgOiAkKHNvdXJjZXMpIF0gOworCisgICAgICAgICAgICBpZiAhICQocmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIndhcm5pbmc6IFVuYWJsZSB0byBjb25zdHJ1Y3QiIFsgZnVsbC1uYW1lIF0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgdXIgOworICAgICAgICBsb2NhbCB0YXJnZXRzIDsKKworICAgICAgICBpZiAkKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgIFsgY2xhc3MuaXMtYSAkKHJlc3VsdFsxXSkgOiBwcm9wZXJ0eS1zZXQgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVyID0gJChyZXN1bHRbMV0pIDsKKyAgICAgICAgICAgICAgICB0YXJnZXRzID0gJChyZXN1bHRbMi1dKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXIgPSBbIHByb3BlcnR5LXNldC5lbXB0eSBdIDsKKyAgICAgICAgICAgICAgICB0YXJnZXRzID0gJChyZXN1bHQpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjIEZJWE1FOiB0aGUgZm9sbG93aW5nIGxvb3Agc2hvdWxkIGJlIGRvYWJsZSB1c2luZyBzZXF1ZW5jZS50cmFuc2Zvcm0gb3IKKyAgICAgICAgIyBzb21lIHNpbWlsYXIgdXRpbGl0eSBydWxlLgorICAgICAgICBsb2NhbCBydCA7CisgICAgICAgIGZvciBsb2NhbCB0IGluICQodGFyZ2V0cykKKyAgICAgICAgeworICAgICAgICAgICAgcnQgKz0gWyB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciAkKHQpIF0gOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHVyKSAkKHJ0KSA7CisgICAgfQorfQorCisKK3J1bGUgZ2VuZXJhdGUgKCBuYW1lIDogc291cmNlcyAqIDogcmVxdWlyZW1lbnRzICogOiBkZWZhdWx0LWJ1aWxkICoKKyAgICA6IHVzYWdlLXJlcXVpcmVtZW50cyAqICkKK3sKKyAgICBsb2NhbCBwcm9qZWN0ID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7CisKKyAgICB0YXJnZXRzLm1haW4tdGFyZ2V0LWFsdGVybmF0aXZlCisgICAgICAgIFsgbmV3IGdlbmVyYXRlZC10YXJnZXQtY2xhc3MgJChuYW1lKSA6ICQocHJvamVjdCkKKyAgICAgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LXNvdXJjZXMgJChzb3VyY2VzKSA6ICQobmFtZSkgXQorICAgICAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtcmVxdWlyZW1lbnRzICQocmVxdWlyZW1lbnRzKSA6ICQocHJvamVjdCkgXQorICAgICAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtZGVmYXVsdC1idWlsZCAkKGRlZmF1bHQtYnVpbGQpIDogJChwcm9qZWN0KSBdCisgICAgICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC11c2FnZS1yZXF1aXJlbWVudHMgJCh1c2FnZS1yZXF1aXJlbWVudHMpIDogJChwcm9qZWN0KSBdCisgICAgICAgIF0gOworfQorCitJTVBPUlQgJChfX25hbWVfXykgOiBnZW5lcmF0ZSA6IDogZ2VuZXJhdGUgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9nZXR0ZXh0LmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZ2V0dGV4dC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhNDNmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvZ2V0dGV4dC5qYW0KQEAgLTAsMCArMSwyMzAgQEAKKyMgQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyAgVGhpcyBtb2R1bGUgc3VwcG9ydCBHTlUgZ2V0dGV4dCBpbnRlcm5hdGlvbmFsaXphdGlvbiB1dGlsaXRpZXMuCisjCisjICBJdCBwcm92aWRlcyB0d28gbWFpbiB0YXJnZXQgcnVsZXM6ICdnZXR0ZXh0LmNhdGFsb2cnLCB1c2VkIGZvcgorIyAgY3JlYXRpbmcgbWFjaGluZS1yZWFkYWJsZSBjYXRhbG9ncyBmcm9tIHRyYW5zbGF0aW9ucyBmaWxlcywgYW5kCisjICAnZ2V0dGV4dC51cGRhdGUnLCB1c2VkIGZvciB1cGRhdGUgdHJhbnNsYXRpb24gZmlsZXMgZnJvbSBtb2RpZmllZAorIyAgc291cmNlcy4KKyMKKyMgIFRvIGFkZCBpMThuIHN1cHBvcnQgdG8geW91ciBhcHBsaWNhdGlvbiB5b3Ugc2hvdWxkIGZvbGxvdyB0aGVzZQorIyAgc3RlcHMuCisjCisjICAtIERlY2lkZSBvbiBhIGZpbGUgbmFtZSB3aGljaCB3aWxsIGNvbnRhaW4gdHJhbnNsYXRpb25zIGFuZAorIyAgd2hhdCBtYWluIHRhcmdldCBuYW1lIHdpbGwgYmUgdXNlZCB0byB1cGRhdGUgaXQuIEZvciBleGFtcGxlOjoKKyMKKyMgICAgZ2V0dGV4dC51cGRhdGUgdXBkYXRlLXJ1c3NpYW4gOiBydXNzaWFuLnBvIGEuY3BwIG15X2FwcCA7CisjCisjICAtIENyZWF0ZSB0aGUgaW5pdGlhbCB0cmFuc2xhdGlvbiBmaWxlIGJ5IHJ1bm5pbmc6OgorIworIyAgICBiamFtIHVwZGF0ZS1ydXNzaWFuCisjCisjICAtIEVkaXQgcnVzc2lhbi5wby4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBjaGFuZ2UgZmllbGRzIGxpa2UgTGFzdFRyYW5zbGF0b3IuCisjCisjICAtIENyZWF0ZSBhIG1haW4gdGFyZ2V0IGZvciBmaW5hbCBtZXNzYWdlIGNhdGFsb2c6OgorIworIyAgICBnZXR0ZXh0LmNhdGFsb2cgcnVzc2lhbiA6IHJ1c3NpYW4ucG8gOworIworIyAgVGhlIG1hY2hpbmUtcmVhZGFibGUgY2F0YWxvZyB3aWxsIGJlIHVwZGF0ZWQgd2hlbmV2ZXIgeW91IHVwZGF0ZQorIyAgInJ1c3NpYW4ucG8iLiBUaGUgInJ1c3NpYW4ucG8iIGZpbGUgd2lsbCBiZSB1cGRhdGVkIG9ubHkgb24gZXhwbGljaXQKKyMgIHJlcXVlc3QuIFdoZW4geW91J3JlIHJlYWR5IHRvIHVwZGF0ZSB0cmFuc2xhdGlvbnMsIHlvdSBzaG91bGQKKyMKKyMgIC0gUnVuOjoKKyMKKyMgICAgYmphbSB1cGRhdGUtcnVzc2lhbgorIworIyAgLSBFZGl0ICJydXNzaWFuLnBvIiBpbiBhcHByb3ByaWF0ZSBlZGl0b3IuCisjCisjICBUaGUgbmV4dCBiamFtIHJ1biB3aWxsIGNvbnZlcnQgInJ1c3NpYW4ucG8iIGludG8gbWFjaGluZS1yZWFkYWJsZSBmb3JtLgorIworIyAgQnkgZGVmYXVsdCwgdHJhbnNsYXRpb25zIGFyZSBtYXJrZWQgYnkgJ2kxOG4nIGNhbGwuIFRoZSAnZ2V0dGV4dC5rZXl3b3JkJworIyAgZmVhdHVyZSBjYW4gYmUgdXNlZCB0byBhbHRlciB0aGlzLgorCisKK2ltcG9ydCB0YXJnZXRzIDsKK2ltcG9ydCBwcm9wZXJ0eS1zZXQgOworaW1wb3J0IHZpcnR1YWwtdGFyZ2V0IDsKK2ltcG9ydCAiY2xhc3MiIDogbmV3IDsKK2ltcG9ydCBwcm9qZWN0IDsKK2ltcG9ydCB0eXBlIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBlcnJvcnMgOworaW1wb3J0IGZlYXR1cmUgOiBmZWF0dXJlIDsKK2ltcG9ydCB0b29sc2V0IDogZmxhZ3MgOworaW1wb3J0IHJlZ2V4IDsKKworLnBhdGggPSAiIiA7CisKKyMgSW5pdGlhbGl6ZXMgdGhlIGdldHRleHQgbW9kdWxlLgorcnVsZSBpbml0ICggcGF0aCA/ICMgUGF0aCB3aGVyZSBhbGwgdG9vbHMgYXJlIGxvY2F0ZWQuIElmIG5vdCBzcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgIyB0aGV5IHNob3VsZCBiZSBpbiBQQVRILgorICAgICAgICAgICkKK3sKKyAgICBpZiAkKC5pbml0aWFsaXplZCkgJiYgJCgucGF0aCkgIT0gJChwYXRoKQorICAgIHsKKyAgICAgICAgZXJyb3JzLmVycm9yICJBdHRlbXB0IHRvIHJlY29uZmlndXJlIHdpdGggZGlmZmVyZW50IHBhdGgiIDsKKyAgICB9CisgICAgLmluaXRpYWxpemVkID0gdHJ1ZSA7CisgICAgaWYgJChwYXRoKQorICAgIHsKKyAgICAgICAgLnBhdGggPSAkKHBhdGgpLyA7CisgICAgfQorfQorCisjIENyZWF0ZXMgYSBtYWluIHRhcmdldCAnbmFtZScsIHdoaWNoLCB3aGVuIHVwZGF0ZWQsIHdpbGwgY2F1c2UKKyMgZmlsZSAnZXhpc3RpbmctdHJhbnNsYXRpb24nIHRvIGJlIHVwZGF0ZWQgd2l0aCB0cmFuc2xhdGlvbnMKKyMgZXh0cmFjdGVkIGZyb20gJ3NvdXJjZXMnLiBJdCdzIHBvc3NpYmxlIHRvIHNwZWNpZnkgbWFpbiB0YXJnZXQKKyMgaW4gc291cmNlcyAtLS0gaXQgd2hpY2ggY2FzZSBhbGwgdGFyZ2V0IGZyb20gZGVwZW5kZW5jeSBncmFwaAorIyBvZiB0aG9zZSBtYWluIHRhcmdldHMgd2lsbCBiZSBzY2FubmVkLCBwcm92aWRlZCB0aGV5IGFyZSBvZgorIyBhcHByb3ByaWNhdGUgdHlwZS4gVGhlICdnZXR0ZXh0LnR5cGVzJyBmZWF0dXJlIGNhbiBiZSB1c2VkIHRvCisjIGNvbnRyb2wgdGhlIHR5cGVzLgorIworIyBUaGUgdGFyZ2V0IHdpbGwgYmUgdXBkYXRlZCBvbmx5IGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkIG9uIHRoZQorIyBjb21tYW5kIGxpbmUuCitydWxlIHVwZGF0ZSAoIG5hbWUgOiBleGlzdGluZy10cmFuc2xhdGlvbiBzb3VyY2VzICsgOiByZXF1aXJlbWVudHMgKiApCit7CisgICAgbG9jYWwgcHJvamVjdCA9IFsgcHJvamVjdC5jdXJyZW50IF0gOworCisgICAgdGFyZ2V0cy5tYWluLXRhcmdldC1hbHRlcm5hdGl2ZQorICAgICAgWyBuZXcgdHlwZWQtdGFyZ2V0ICQobmFtZSkgOiAkKHByb2plY3QpIDogZ2V0dGV4dC5VUERBVEUgOgorICAgICAgICAkKGV4aXN0aW5nLXRyYW5zbGF0aW9uKSAkKHNvdXJjZXMpCisgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LXJlcXVpcmVtZW50cyAkKHJlcXVpcmVtZW50cykgOiAkKHByb2plY3QpIF0KKyAgICAgIF0gOworICAgICQocHJvamVjdCkubWFyay10YXJnZXQtYXMtZXhwbGljaXQgJChuYW1lKSA7Cit9CisKKworIyBUaGUgaHVtYW4gZWRpdGFibGUgc291cmNlLCBjb250YWluaW5nIHRyYW5zbGF0aW9uLgordHlwZS5yZWdpc3RlciBnZXR0ZXh0LlBPIDogcG8gOworIyBUaGUgbWFjaGluZSByZWFkYWJsZSBtZXNzYWdlIGNhdGFsb2cuCit0eXBlLnJlZ2lzdGVyIGdldHRleHQuY2F0YWxvZyA6IG1vIDsKKyMgSW50ZXJtZWRpYXRlIHR5cGUgcHJvZHVjZSBieSBleHRyYWN0aW5nIHRyYW5zbGF0aW9ucyBmcm9tCisjIHNvdXJjZXMuCit0eXBlLnJlZ2lzdGVyIGdldHRleHQuUE9UIDogcG90IDsKKyMgUHNldWRvIHR5cGUgdXNlZCB0byBpbnZva2UgdXBkYXRlLXRyYW5zbGF0aW9ucyBnZW5lcmF0b3IKK3R5cGUucmVnaXN0ZXIgZ2V0dGV4dC5VUERBVEUgOworCisjIElkZW50aWZpZXMgdGhlIGtleXdvcmQgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHNjYW5uaW5nIHNvdXJjZXMuCisjIERlZmF1bHQ6IGkxOG4KK2ZlYXR1cmUgZ2V0dGV4dC5rZXl3b3JkIDogOiBmcmVlIDsKKyMgQ29udGFpbnMgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2Ygc291cmNlcyB0eXBlcyB3aGljaCBzaG91bGQgYmUgc2Nhbm5lZC4KKyMgRGVmYXVsdDogIkMgQ1BQIgorZmVhdHVyZSBnZXR0ZXh0LnR5cGVzIDogOiBmcmVlIDsKKworZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCBnZXR0ZXh0LmNvbXBpbGUgOiBnZXR0ZXh0LlBPIDogZ2V0dGV4dC5jYXRhbG9nIDsKKworY2xhc3MgdXBkYXRlLXRyYW5zbGF0aW9ucy1nZW5lcmF0b3IgOiBnZW5lcmF0b3IKK3sKKyAgICBpbXBvcnQgcmVnZXggOiBzcGxpdCA7CisgICAgaW1wb3J0IHByb3BlcnR5LXNldCA7CisKKyAgICBydWxlIF9faW5pdF9fICggKiA6ICogKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdG9yLl9faW5pdF9fICQoMSkgOiAkKDIpIDogJCgzKSA6ICQoNCkgOiAkKDUpIDogJCg2KSA6ICQoNykgOiAkKDgpIDogJCg5KSA7CisgICAgfQorCisgICAgIyBUaGUgcnVsZSBzaG91bGQgYmUgY2FsbGVkIHdpdGggYXQgbGVhc3QgdHdvIHNvdXJjZXMuIFRoZSBmaXJzdCBzb3VyY2UKKyAgICAjIGlzIHRoZSB0cmFuc2xhdGlvbiAoLnBvKSBmaWxlIHRvIHVwZGF0ZS4gVGhlIHJlbWFpbmluZyBzb3VyY2VzIGFyZSB0YXJnZXRzCisgICAgIyB3aGljaCBzaG91bGQgYmUgc2Nhbm5lZCBmb3IgbmV3IG1lc3NhZ2VzLiBBbGwgc291cmNlcyBmaWxlcyBmb3IgdGhvc2UgdGFyZ2V0cworICAgICMgd2lsbCBiZSBmb3VuZCBhbmQgcGFzc2VkIHRvIHRoZSAneGdldHRleHQnIHV0aWxpdHksIHdoaWNoIGV4dHJhY3RzIHRoZQorICAgICMgbWVzc2FnZXMgZm9yIGxvY2FsaXphdGlvbi4gVGhvc2UgbWVzc2FnZXMgd2lsbCBiZSBtZXJnZWQgdG8gdGhlIC5wbyBmaWxlLgorICAgIHJ1bGUgcnVuICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICogOiBtdWx0aXBsZSA/ICkKKyAgICB7CisgICAgICAgIGxvY2FsIHR5cGVzID0gWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxnZXR0ZXh0LnR5cGVzPiBdIDsKKyAgICAgICAgdHlwZXMgPz0gIkMgQ1BQIiA7CisgICAgICAgIHR5cGVzID0gWyByZWdleC5zcGxpdCAkKHR5cGVzKSAiICIgXSA7CisKKyAgICAgICAgbG9jYWwga2V5d29yZHMgPSBbICQocHJvcGVydHktc2V0KS5nZXQgPGdldHRleHQua2V5d29yZD4gXSA7CisgICAgICAgIHByb3BlcnR5LXNldCA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZSAkKGtleXdvcmRzOkc9PGdldHRleHQua2V5d29yZD4pIF0gOworCisgICAgICAgICMgRmlyc3QgZGV0ZXJpbWUgdGhlIGxpc3Qgb2Ygc291cmNlcyB0aGF0IG11c3QgYmUgc2Nhbm5lZCBmb3IKKyAgICAgICAgIyBtZXNzYWdlcy4KKyAgICAgICAgbG9jYWwgYWxsLXNvdXJjZXMgOworICAgICAgICAjIENPTlNJREVSOiBJJ20gbm90IHN1cmUgaWYgdGhlIGxvZ2ljIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBmb3IgJ3N0YWdlJzoKKyAgICAgICAgIyBpLmUuIGZvbGxvd2luZyBkZXBlbmRlbmN5IHByb3BlcnRpZXMgYXMgd2VsbC4KKyAgICAgICAgZm9yIGxvY2FsIHMgaW4gJChzb3VyY2VzWzItXSkKKyAgICAgICAgeworICAgICAgICAgICAgYWxsLXNvdXJjZXMgKz0gWyB2aXJ0dWFsLXRhcmdldC50cmF2ZXJzZSAkKHMpIDogOiBpbmNsdWRlLXNvdXJjZXMgXSA7CisgICAgICAgIH0KKyAgICAgICAgbG9jYWwgcmlnaHQtc291cmNlcyA7CisgICAgICAgIGZvciBsb2NhbCBzIGluICQoYWxsLXNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIFsgJChzKS50eXBlIF0gaW4gJCh0eXBlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByaWdodC1zb3VyY2VzICs9ICQocykgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgLmNvbnN0cnVjdGVkIDsKKyAgICAgICAgaWYgJChyaWdodC1zb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgICAjIENyZWF0ZSB0aGUgUE9UIGZpbGUsIHdoaWNoIHdpbGwgY29udGFpbiBsaXN0IG9mIG1lc3NhZ2VzIGV4dHJhY3RlZAorICAgICAgICAgICAgIyBmcm9tIHRoZSBzb3VyY2VzLgorICAgICAgICAgICAgbG9jYWwgZXh0cmFjdCA9CisgICAgICAgICAgICAgIFsgbmV3IGFjdGlvbiAkKHJpZ2h0LXNvdXJjZXMpIDogZ2V0dGV4dC5leHRyYWN0IDogJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICAgICAgbG9jYWwgbmV3LW1lc3NhZ2VzID0gWyBuZXcgZmlsZS10YXJnZXQgJChuYW1lKSA6IGdldHRleHQuUE9UCisgICAgICAgICAgICAgIDogJChwcm9qZWN0KSA6ICQoZXh0cmFjdCkgXSA7CisKKyAgICAgICAgICAgICMgQ3JlYXRlIGEgbm90ZmlsZSB0YXJnZXQgd2hpY2ggd2lsbCB1cGRhdGUgdGhlIGV4aXN0aW5nIHRyYW5zbGF0aW9uIGZpbGUKKyAgICAgICAgICAgICMgd2l0aCBuZXcgbWVzc2FnZXMuCisgICAgICAgICAgICBsb2NhbCBhID0gWyBuZXcgYWN0aW9uICQoc291cmNlc1sxXSkgJChuZXctbWVzc2FnZXMpCisgICAgICAgICAgICAgIDogZ2V0dGV4dC51cGRhdGUtcG8tZGlzcGF0Y2ggXSA7CisgICAgICAgICAgICBsb2NhbCByID0gWyBuZXcgbm90ZmlsZS10YXJnZXQgJChuYW1lKSA6ICQocHJvamVjdCkgOiAkKGEpIF0gOworICAgICAgICAgICAgLmNvbnN0cnVjdGVkID0gWyB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciAkKHIpIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3JzLmVycm9yICJObyBzb3VyY2UgY291bGQgYmUgc2Nhbm5lZCBieSBnZXR0ZXh0IHRvb2xzIiA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQoLmNvbnN0cnVjdGVkKSA7CisgICAgfQorfQorZ2VuZXJhdG9ycy5yZWdpc3RlciBbIG5ldyB1cGRhdGUtdHJhbnNsYXRpb25zLWdlbmVyYXRvciBnZXR0ZXh0LnVwZGF0ZSA6IDogZ2V0dGV4dC5VUERBVEUgXSA7CisKK2ZsYWdzIGdldHRleHQuZXh0cmFjdCBLRVlXT1JEIDxnZXR0ZXh0LmtleXdvcmQ+IDsKK2FjdGlvbnMgZXh0cmFjdAoreworICAgICQoLnBhdGgpeGdldHRleHQgLWskKEtFWVdPUkQ6RT1pMThuKSAtbyAkKDwpICQoPikKK30KKworIyBEb2VzIHJlYWx5IHVwZGF0aW5nIG9mIHBvIGZpbGUuIFRoZSB0cmlja3kgcGFydCBpcyB0aGF0CisjIHdlJ3JlIGFjdHVhbGx5IHVwZGF0aW5nIG9uZSBvZiB0aGUgc291cmNlczoKKyMgJCg8KSBpcyB0aGUgTk9URklMRSB0YXJnZXQgd2UncmUgdXBkYXRpbmcKKyMgJCg+WzFdKSBpcyB0aGUgUE8gZmlsZSB0byBiZSByZWFsbHkgdXBkYXRlZC4KKyMgJCg+WzJdKSBpcyB0aGUgUE8gZmlsZSBjcmVhdGVkIGZyb20gc291cmNlcy4KKyMKKyMgV2hlbiBmaWxlIHRvIGJlIHVwZGF0ZWQgZG9lcyBub3QgZXhpc3QgKGR1cmluZyB0aGUKKyMgZmlyc3QgcnVuKSwgd2UgbmVlZCB0byBjb3B5IHRoZSBmaWxlIGNyZWF0ZWQgZnJvbSBzb3VyY2VzLgorIyBJbiBhbGwgb3RoZXIgY2FzZXMsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBmaWxlLgorcnVsZSB1cGRhdGUtcG8tZGlzcGF0Y2gKK3sKKyAgICBOT0NBUkUgJCg+WzFdKSA7CisgICAgZ2V0dGV4dC5jcmVhdGUtcG8gJCg8KSA6ICQoPikgOworICAgIGdldHRleHQudXBkYXRlLXBvICQoPCkgOiAkKD4pIDsKKyAgICBfIG9uICQoPCkgPSAiICIgOworICAgIG9rIG9uICQoPCkgPSAiIiA7CisgICAgRVhJU1RJTkdfUE8gb24gJCg8KSA9ICQoPlsxXSkgOworfQorCisjIER1ZSB0byBmYW5jeSBpbnRlcmFjdGlvbiBvZiBleGlzdGluZyBhbmQgdXBkYXRlZCwgdGhpcyBydWxlIGNhbiBiZSBjYWxsZWQgd2l0aAorIyBvbmUgc291cmNlLCBpbiB3aGljaCBjYXNlIHdlIGNvcHkgdGhlIGxvbmVseSBzb3VyY2UgaW50byBFWElTVElOR19QTywgb3Igd2l0aAorIyB0d28gc291cmNlcywgaW4gd2hpY2ggY2FzZSB0aGUgYWN0aW9uIGJvZHkgZXhwYW5kcyB0byBub3RoaW5nLiBJJ2QgcmVhbGx5IGxpa2UKKyMgdG8gaGF2ZSAibWlzc2luZyIgYWN0aW9uIG1vZGlmaWVyLgorYWN0aW9ucyBxdWlldGx5IGV4aXN0aW5nIHVwZGF0ZWQgY3JlYXRlLXBvIGJpbmQgRVhJU1RJTkdfUE8KK3sKKyAgICBjcCQoXykiJCg+WzFdKSIkKF8pIiQoRVhJU1RJTkdfUE8pIiQoJCg+WzJdOkU9b2spKQorfQorCithY3Rpb25zIHVwZGF0ZWQgdXBkYXRlLXBvIGJpbmQgRVhJU1RJTkdfUE8KK3sKKyAgICAkKC5wYXRoKW1zZ21lcmdlJChfKS1VJChfKSIkKEVYSVNUSU5HX1BPKSIkKF8pIiQoPlsxXSkiCit9CisKK2FjdGlvbnMgZ2V0dGV4dC5jb21waWxlCit7CisgICAgJCgucGF0aCltc2dmbXQgLW8gJCg8KSAkKD4pCit9CisKK0lNUE9SVCAkKF9fbmFtZV9fKSA6IHVwZGF0ZSA6IDogZ2V0dGV4dC51cGRhdGUgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9nZm9ydHJhbi5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2dmb3J0cmFuLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE2OWI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9nZm9ydHJhbi5qYW0KQEAgLTAsMCArMSwzOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDQgVG9vbiBLbmFwZW4KKyMKKyMgIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKKyMgIExpY2Vuc2UgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yCisjICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2ltcG9ydCB0b29sc2V0IDogZmxhZ3MgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IGZvcnRyYW4gOworCitydWxlIGluaXQgKCB2ZXJzaW9uID8gOiBjb21tYW5kICogOiBvcHRpb25zICogKQoreworfQorCisjIERlY2xhcmUgZmxhZ3MgYW5kIGFjdGlvbiBmb3IgY29tcGlsYXRpb24KK2ZsYWdzIGdmb3J0cmFuIE9QVElPTlMgPGZmbGFncz4gOworCitmbGFncyBnZm9ydHJhbiBPUFRJT05TIDxvcHRpbWl6YXRpb24+b2ZmIDogLU8wIDsKK2ZsYWdzIGdmb3J0cmFuIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGVlZCA6IC1PMyA7CitmbGFncyBnZm9ydHJhbiBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BhY2UgOiAtT3MgOworCitmbGFncyBnZm9ydHJhbiBPUFRJT05TIDxkZWJ1Zy1zeW1ib2xzPm9uIDogLWcgOworZmxhZ3MgZ2ZvcnRyYW4gT1BUSU9OUyA8cHJvZmlsaW5nPm9uIDogLXBnIDsKKworZmxhZ3MgZ2ZvcnRyYW4gT1BUSU9OUyA8bGluaz5zaGFyZWQvPG1haW4tdGFyZ2V0LXR5cGU+TElCIDogLWZQSUMgOworCitmbGFncyBnZm9ydHJhbiBERUZJTkVTIDxkZWZpbmU+IDsKK2ZsYWdzIGdmb3J0cmFuIElOQ0xVREVTIDxpbmNsdWRlPiA7CisKK3J1bGUgY29tcGlsZS5mb3J0cmFuCit7Cit9CisKK2FjdGlvbnMgY29tcGlsZS5mb3J0cmFuCit7CisgIGdjYyAtV2FsbCAkKE9QVElPTlMpIC1EJChERUZJTkVTKSAtSSQoSU5DTFVERVMpIC1jIC1vICIkKDwpIiAiJCg+KSIgCit9CisKK2dlbmVyYXRvcnMucmVnaXN0ZXItZm9ydHJhbi1jb21waWxlciBnZm9ydHJhbi5jb21waWxlLmZvcnRyYW4gOiBGT1JUUkFOIEZPUlRSQU45MCA6IE9CSiA7IApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9ocF9jeHguamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9ocF9jeHguamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Y2Q3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2hwX2N4eC5qYW0KQEAgLTAsMCArMSwxODEgQEAKKyMgQ29weXJpZ2h0IDIwMDEgRGF2aWQgQWJyYWhhbXMuCisjIENvcHlyaWdodCAyMDA0LCAyMDA1IE1hcmt1cyBTY2hvZXBmbGluLgorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIworIyBIUCBDWFggY29tcGlsZXIKKyMgU2VlIGh0dHA6Ly9oMzAwOTcud3d3My5ocC5jb20vY3BsdXMvP2p1bXBpZD1yZWdfUjEwMDJfVVNFTgorIworIworIyBOb3RlcyBvbiB0aGlzIHRvb2xzZXQ6CisjCisjIC0gQmVjYXVzZSBvZiB2ZXJ5IHN1YnRsZSBpc3N1ZXMgd2l0aCB0aGUgZGVmYXVsdCBhbnNpIG1vZGUsIHN0cmljdF9hbnNpIG1vZGUKKyMgICBpcyB1c2VkIGZvciBjb21waWxhdGlvbi4gT25lIGV4YW1wbGUgb2YgdGhpbmdzIHRoYXQgZG9uJ3Qgd29yayBjb3JyZWN0bHkgaW4KKyMgICB0aGUgZGVmYXVsdCBhbnNpIG1vZGUgaXMgb3ZlcmxvYWQgcmVzb2x1dGlvbiBvZiBmdW5jdGlvbiB0ZW1wbGF0ZXMgd2hlbgorIyAgIG1peGVkIHdpdGggbm9uLXRlbXBsYXRlIGZ1bmN0aW9ucy4KKyMKKyMgLSBGb3IgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiAiLXRpbXBsaWNpdF9sb2NhbCIgaXMgdXNlZC4gUHJldmlvdXNseSwKKyMgICAiLXRsb2NhbCIgaGFzIGJlZW4gdHJpZWQgdG8gYXZvaWQgdGhlIG5lZWQgZm9yIGEgdGVtcGxhdGUgcmVwb3NpdG9yeQorIyAgIGJ1dCB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoIG1hbnVhbGx5IGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMuICItdHdlYWsiCisjICAgaGFzIG5vdCBiZWVuIHVzZWQgdG8gYXZvaWQgdGhlIHN0cmVhbSBvZiB3YXJuaW5nIG1lc3NhZ2VzIGlzc3VlZCBieQorIyAgIGFyIG9yIGxkIHdoZW4gY3JlYXRpbmcgYSBsaWJyYXJ5IG9yIGxpbmtpbmcgYW4gYXBwbGljYXRpb24uCisjCisjIC0gRGVidWcgc3ltYm9scyBhcmUgZ2VuZXJhdGVkIHdpdGggIi1nMyIsIGFzIHRoaXMgd29ya3MgYm90aCBpbiBkZWJ1ZyBhbmQKKyMgICByZWxlYXNlIG1vZGUuIFdoZW4gY29tcGlsaW5nIEMrKyBjb2RlIHdpdGhvdXQgb3B0aW1pemF0aW9uLCB3ZSBhZGRpdGlvbmFsbHkKKyMgICB1c2UgIi1nYWxsIiwgd2hpY2ggZ2VuZXJhdGVzIGZ1bGwgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGZvciBhbGwgY2xhc3NlcywKKyMgICBzdHJ1Y3RzLCBhbmQgdW5pb25zLiBBcyB0aGlzIHR1cm5zIG9mZiBvcHRpbWl6YXRpb24sIGl0IGNhbid0IGJlIHVzZWQgd2hlbgorIyAgIG9wdGltaXphdGlvbiBpcyBuZWVkZWQuCisjCisKK2ltcG9ydCBmZWF0dXJlIGdlbmVyYXRvcnMgY29tbW9uIDsKK2ltcG9ydCB0b29sc2V0IDogZmxhZ3MgOworCitmZWF0dXJlLmV4dGVuZCB0b29sc2V0IDogaHBfY3h4IDsKK2ZlYXR1cmUuZXh0ZW5kIGMrK2FiaSA6IGN4eGFybSA7CisKKyMgSW5oZXJpdCBmcm9tIFVuaXggdG9vbHNldCB0byBnZXQgbGlicmFyeSBvcmRlcmluZyBtYWdpYy4KK3Rvb2xzZXQuaW5oZXJpdCAgaHBfY3h4IDogdW5peCA7CisKK2dlbmVyYXRvcnMub3ZlcnJpZGUgaHBfY3h4LnByZWJ1aWx0IDogYnVpbHRpbi5saWItZ2VuZXJhdG9yIDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgaHBfY3h4LnByZWJ1aWx0IDogYnVpbHRpbi5wcmVidWlsdCA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIGhwX2N4eC5zZWFyY2hlZC1saWItZ2VuZXJhdG9yIDogc2VhcmNoZWQtbGliLWdlbmVyYXRvciA7CisKKworcnVsZSBpbml0ICggdmVyc2lvbiA/IDogY29tbWFuZCAqIDogb3B0aW9ucyAqICkKK3sKKyAgICBsb2NhbCBjb25kaXRpb24gPSBbIGNvbW1vbi5jaGVjay1pbml0LXBhcmFtZXRlcnMgaHBfY3h4IDogdmVyc2lvbiAkKHZlcnNpb24pIF0gOworICAgIAorICAgIGxvY2FsIGNvbW1hbmQgPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kIGhwX2N4eCA6IGN4eCA6ICQoY29tbWFuZCkgXSA7CisgICAgCisgICAgaWYgJChjb21tYW5kKQorICAgIHsKKyAgICAgICAgbG9jYWwgcm9vdCA9IFsgY29tbW9uLmdldC1hYnNvbHV0ZS10b29sLXBhdGggJChjb21tYW5kWy0xXSkgXSA7CisKKyAgICAgICAgaWYgJChyb290KQorICAgICAgICB7CisgICAgICAgICAgICBmbGFncyBocF9jeHggLnJvb3QgJChjb25kaXRpb24pIDogIlwiJChyb290KVwiLyIgOworICAgICAgICB9ICAgICAgICAKKyAgICB9ICAgICAgCisgICAgIyBJZiB3ZSBjYW4ndCBmaW5kICdjeHgnIGFueXdheSwgYXQgbGVhc3Qgc2hvdyAnY3h4JyBpbiB0aGUgY29tbWFuZHMKKyAgICBjb21tYW5kID89IGN4eCA7CisgICAgICAgIAorICAgIGNvbW1vbi5oYW5kbGUtb3B0aW9ucyBocF9jeHggOiAkKGNvbmRpdGlvbikgOiAkKGNvbW1hbmQpIDogJChvcHRpb25zKSA7ICAgICAgICAgICAgICAgCit9CisKK2dlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBocF9jeHguY29tcGlsZS5jKysgOiBDUFAgOiBPQkogOiA8dG9vbHNldD5ocF9jeHggOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIGhwX2N4eC5jb21waWxlLmMgOiBDIDogT0JKIDogPHRvb2xzZXQ+aHBfY3h4IDsKKworCisKKyMgTm8gc3RhdGljIGxpbmtpbmcgYXMgZmFyIGFzIEkgY2FuIHRlbGwuCisjIGZsYWdzIGN4eCBMSU5LRkxBR1MgPHJ1bnRpbWUtbGluaz5zdGF0aWMgOiAtYnN0YXRpYyA7CitmbGFncyBocF9jeHguY29tcGlsZSBPUFRJT05TIDxkZWJ1Zy1zeW1ib2xzPm9uIDogLWczIDsKK2ZsYWdzIGhwX2N4eC5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5vZmYvPGRlYnVnLXN5bWJvbHM+b24gOiAtZ2FsbCA7CitmbGFncyBocF9jeHgubGluayBPUFRJT05TIDxkZWJ1Zy1zeW1ib2xzPm9uIDogLWcgOworZmxhZ3MgaHBfY3h4LmxpbmsgT1BUSU9OUyA8ZGVidWctc3ltYm9scz5vZmYgOiAtcyA7CisKK2ZsYWdzIGhwX2N4eC5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5vZmYgOiAtTzAgOworZmxhZ3MgaHBfY3h4LmNvbXBpbGUgT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwZWVkLzxpbmxpbmluZz5vbiA6IC1PMiA7CitmbGFncyBocF9jeHguY29tcGlsZSBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BlZWQgOiAtTzIgOworCisjIFRoaXMgKHVuZG9jdW1lbnRlZCkgbWFjcm8gbmVlZHMgdG8gYmUgZGVmaW5lZCB0byBnZXQgYWxsIEMgZnVuY3Rpb24KKyMgb3ZlcmxvYWRzIHJlcXVpcmVkIGJ5IHRoZSBDKysgc3RhbmRhcmQuCitmbGFncyBocF9jeHguY29tcGlsZS5jKysgT1BUSU9OUyA6IC1EX19DTkFNRV9PVkVSTE9BRFMgOworCisjIEFkZGVkIGZvciB0aHJlYWRpbmcgc3VwcG9ydAorZmxhZ3MgaHBfY3h4LmNvbXBpbGUgT1BUSU9OUyA8dGhyZWFkaW5nPm11bHRpIDogLXB0aHJlYWQgOworZmxhZ3MgaHBfY3h4LmxpbmsgT1BUSU9OUyA8dGhyZWFkaW5nPm11bHRpIDogLXB0aHJlYWQgOworCitmbGFncyBocF9jeHguY29tcGlsZSBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BhY2UvPGlubGluaW5nPm9uIDogPGlubGluaW5nPnNpemUgOworZmxhZ3MgaHBfY3h4LmNvbXBpbGUgT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwYWNlIDogLU8xIDsKK2ZsYWdzIGhwX2N4eC5jb21waWxlIE9QVElPTlMgPGlubGluaW5nPm9mZiA6IC1pbmxpbmUgbm9uZSA7CisKKyMgVGhlIGNvbXBpbGVyIHZlcnNpb25zIHRyaWVkICh1cCB0byBWNi41LTA0MCkgaGFuZyB3aGVuIGNvbXBpbGluZyBCb29zdCBjb2RlCisjIHdpdGggZnVsbCBpbmxpbmluZyBlbmFibGVkLiBTbyBsZWF2ZSBpdCBhdCB0aGUgZGVmYXVsdCBsZXZlbCBmb3Igbm93LgorIworIyBmbGFncyBocF9jeHguY29tcGlsZSBPUFRJT05TIDxpbmxpbmluZz5mdWxsIDogLWlubGluZSBhbGwgOworCitmbGFncyBocF9jeHguY29tcGlsZSBPUFRJT05TIDxwcm9maWxpbmc+b24gOiAtcGcgOworZmxhZ3MgaHBfY3h4LmxpbmsgT1BUSU9OUyA8cHJvZmlsaW5nPm9uIDogLXBnIDsKKworIyBTZWxlY3Rpb24gb2YgdGhlIG9iamVjdCBtb2RlbC4gVGhpcyBmbGFnIGlzIG5lZWRlZCBvbiBib3RoIHRoZSBDKysgY29tcGlsZXIKKyMgYW5kIGxpbmtlciBjb21tYW5kIGxpbmUuCisKKyMgVW5zcGVjaWZpZWQgQUJJIHRyYW5zbGF0ZXMgdG8gJy1tb2RlbCBhbnNpJyBhcyBtb3N0CisjIHN0YW5kYXJkLWNvbmZvcm1pbmcuCitmbGFncyBocF9jeHguY29tcGlsZS5jKysgT1BUSU9OUyA8YysrYWJpPiA6IC1tb2RlbCBhbnNpIDogOiBoYWNrLWhhY2sgOworZmxhZ3MgaHBfY3h4LmNvbXBpbGUuYysrIE9QVElPTlMgPGMrK2FiaT5jeHhhcm0gOiAtbW9kZWwgYXJtIDsKK2ZsYWdzIGhwX2N4eC5saW5rIE9QVElPTlMgPGMrK2FiaT4gOiAtbW9kZWwgYW5zaSA6IDogaGFjay1oYWNrIDsKK2ZsYWdzIGhwX2N4eC5saW5rIE9QVElPTlMgPGMrK2FiaT5jeHhhcm0gOiAtbW9kZWwgYXJtIDsKKworIyBEaXNwbGF5IGEgZGVzY3JpcHRpdmUgdGFnIHRvZ2V0aGVyIHdpdGggZWFjaCBjb21waWxlciBtZXNzYWdlLiBUaGlzIHRhZyBjYW4KKyMgYmUgdXNlZCBieSB0aGUgdXNlciB0byBleHBsaWNpdGVseSBzdXBwcmVzcyB0aGUgY29tcGlsZXIgbWVzc2FnZS4KK2ZsYWdzIGhwX2N4eC5jb21waWxlIE9QVElPTlMgOiAtbXNnX2Rpc3BsYXlfdGFnIDsKKworZmxhZ3MgaHBfY3h4LmNvbXBpbGUgT1BUSU9OUyA8Y2ZsYWdzPiA7CitmbGFncyBocF9jeHguY29tcGlsZS5jKysgT1BUSU9OUyA8Y3h4ZmxhZ3M+IDsKK2ZsYWdzIGhwX2N4eC5jb21waWxlIERFRklORVMgPGRlZmluZT4gOworZmxhZ3MgaHBfY3h4LmNvbXBpbGUgSU5DTFVERVMgPGluY2x1ZGU+IDsKK2ZsYWdzIGhwX2N4eC5saW5rIE9QVElPTlMgPGxpbmtmbGFncz4gOworCitmbGFncyBocF9jeHgubGluayBMSUJQQVRIIDxsaWJyYXJ5LXBhdGg+IDsKK2ZsYWdzIGhwX2N4eC5saW5rIExJQlJBUklFUyA8bGlicmFyeS1maWxlPiA7CitmbGFncyBocF9jeHgubGluayBGSU5ETElCUy1TVCA8ZmluZC1zdGF0aWMtbGlicmFyeT4gOworZmxhZ3MgaHBfY3h4LmxpbmsgRklORExJQlMtU0EgPGZpbmQtc2hhcmVkLWxpYnJhcnk+IDsKKworZmxhZ3MgaHBfY3h4LmNvbXBpbGUuYysrIFRFTVBMQVRFX0RFUFRIIDxjKystdGVtcGxhdGUtZGVwdGg+IDsKKworYWN0aW9ucyBsaW5rIGJpbmQgTElCUkFSSUVTCit7CisgICAgJChDT05GSUdfQ09NTUFORCkgLW5vaW1wbGljaXRfaW5jbHVkZSAkKE9QVElPTlMpIC1vICIkKDwpIiAtTCQoTElCUEFUSCkgIiQoPikiICIkKExJQlJBUklFUykiIC1sJChGSU5ETElCUy1TVCkgLWwkKEZJTkRMSUJTLVNBKSAtbHJ0IC1sbQorfQorCisjIFdoZW4gY3JlYXRpbmcgZHluYW1pYyBsaWJyYXJpZXMsIHdlIGRvbid0IHdhbnQgdG8gYmUgd2FybmVkIGFib3V0IHVucmVzb2x2ZWQKKyMgc3ltYm9scywgdGhlcmVmb3JlIGFsbCB1bnJlc29sdmVkIHN5bWJvbHMgYXJlIG1hcmtlZCBhcyBleHBlY3RlZCBieQorIyAnLWV4cGVjdF91bnJlc29sdmVkIConLiBUaGlzIGFsc28gbWlycm9ycyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBHTlUgdG9vbAorIyBjaGFpbi4KKworYWN0aW9ucyBsaW5rLmRsbCBiaW5kIExJQlJBUklFUworeworICAgICQoQ09ORklHX0NPTU1BTkQpIC1zaGFyZWQgLWV4cGVjdF91bnJlc29sdmVkIFwqIC1ub2ltcGxpY2l0X2luY2x1ZGUgJChPUFRJT05TKSAtbyAiJCg8WzFdKSIgLUwkKExJQlBBVEgpICAiJCg+KSIgIiQoTElCUkFSSUVTKSIgLWwkKEZJTkRMSUJTLVNUKSAtbCQoRklORExJQlMtU0EpIC1sbQorfQorCisKKyMgTm90ZTogUmVsYXhlZCBBTlNJIG1vZGUgKC1zdGQpIGlzIHVzZWQgZm9yIGNvbXBpbGF0aW9uIGJlY2F1c2UgaW4gc3RyaWN0IEFOU0kKKyMgQzg5IG1vZGUgKC1zdGQxKSB0aGUgY29tcGlsZXIgZG9lc24ndCBhY2NlcHQgQysrIGNvbW1lbnRzIGluIEMgZmlsZXMuIEFzIC1zdGQKKyMgaXMgdGhlIGRlZmF1bHQsIG5vIHNwZWNpYWwgZmxhZyBpcyBuZWVkZWQuCithY3Rpb25zIGNvbXBpbGUuYworeworICAgICQoLnJvb3Q6RT0pY2MgLWMgJChPUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC1vICIkKDwpIiAiJCg+KSIKK30KKworIyBOb3RlOiBUaGUgY29tcGlsZXIgaXMgZm9yY2VkIHRvIGNvbXBpbGUgdGhlIGZpbGVzIGFzIEMrKyAoLXggY3h4KSBiZWNhdXNlCisjIG90aGVyd2lzZSBpdCB3aWxsIHNpbGVudGx5IGlnbm9yZSBmaWxlcyB3aXRoIG5vIGZpbGUgZXh0ZW5zaW9uLgorIworIyBOb3RlOiBXZSBkZWxpYmVyYXRlbHkgZG9uJ3Qgc3VwcHJlc3MgYW55IHdhcm5pbmdzIG9uIHRoZSBjb21waWxlciBjb21tYW5kCisjIGxpbmUsIHRoZSB1c2VyIGNhbiBhbHdheXMgZG8gdGhpcyBpbiBhIGN1c3RvbWl6ZWQgdG9vbHNldCBsYXRlciBvbi4KKworcnVsZSBjb21waWxlLmMrKworeworICAgICMgV2UgcHJlcHJvY2VzcyB0aGUgVEVNUExBVEVfREVQVEggY29tbWFuZCBsaW5lIG9wdGlvbiBoZXJlIGJlY2F1c2Ugd2UgZm91bmQKKyAgICAjIG5vIHdheSB0byBkbyBpdCBjb3JyZWN0bHkgaW4gdGhlIGFjdHVhbCBhY3Rpb24gY29kZS4gVGhlcmUgd2UgZWl0aGVyIGdldAorICAgICMgdGhlIC1wZW5kaW5nX2luc3RhbnRpYXRpb25zIHBhcmFtZXRlciB3aGVuIG5vIGMrKy10ZW1wbGF0ZS1kZXB0aCBwcm9wZXJ0eQorICAgICMgaGFzIGJlZW4gc3BlY2lmaWVkIG9yIHdlIGdldCBhZGRpdGlvbmFsIHF1b3RlcyBhcm91bmQKKyAgICAjICItcGVuZGluZ19pbnN0YW50aWF0aW9ucyAiLgorICAgIGxvY2FsIHRlbXBsYXRlLWRlcHRoID0gWyBvbiAkKDEpIHJldHVybiAkKFRFTVBMQVRFX0RFUFRIKSBdIDsKKyAgICBURU1QTEFURV9ERVBUSCBvbiAkKDEpID0gIi1wZW5kaW5nX2luc3RhbnRpYXRpb25zICIkKHRlbXBsYXRlLWRlcHRoKSA7Cit9CisKK2FjdGlvbnMgY29tcGlsZS5jKysKK3sKKyAgICAkKENPTkZJR19DT01NQU5EKSAteCBjeHggLWMgLXN0ZCBzdHJpY3RfYW5zaSAtbm9wdXJlX2NuYW1lIC1ub2ltcGxpY2l0X2luY2x1ZGUgLXRpbXBsaWNpdF9sb2NhbCAtcHRyICIkKDxbMV06RCkvY3h4X3JlcG9zaXRvcnkiICQoT1BUSU9OUykgJChURU1QTEFURV9ERVBUSCkgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtbyAiJCg8KSIgIiQoPikiCit9CisKKyMgQWx3YXlzIGNyZWF0ZSBhcmNoaXZlIGZyb20gc2NyYXRjaC4gU2VlIHRoZSBnY2MgdG9vbGV0IGZvciByYXRpb25hbGUuCitSTSA9IFsgY29tbW9uLnJtLWNvbW1hbmQgXSA7CithY3Rpb25zIHRvZ2V0aGVyIHBpZWNlbWVhbCBhcmNoaXZlCit7CisgICQoUk0pICIkKDwpIgorICBhciByYyAkKDwpICQoPikKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvaHBmb3J0cmFuLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvaHBmb3J0cmFuLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmU4ZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9ocGZvcnRyYW4uamFtCkBAIC0wLDAgKzEsMzUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA0IFRvb24gS25hcGVuCisjCisjICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlCisjICBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgdG9vbHNldCA6IGZsYWdzIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBmb3J0cmFuIDsKKworcnVsZSBpbml0ICggdmVyc2lvbiA/IDogY29tbWFuZCAqIDogb3B0aW9ucyAqICkKK3sKK30KKworIyBEZWNsYXJlIGZsYWdzIGFuZCBhY3Rpb24gZm9yIGNvbXBpbGF0aW9uCitmbGFncyBocGZvcnRyYW4gT1BUSU9OUyA8b3B0aW1pemF0aW9uPm9mZiA6IC1PMCA7CitmbGFncyBocGZvcnRyYW4gT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwZWVkIDogLU8zIDsKK2ZsYWdzIGhwZm9ydHJhbiBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BhY2UgOiAtTzEgOworCitmbGFncyBocGZvcnRyYW4gT1BUSU9OUyA8ZGVidWctc3ltYm9scz5vbiA6IC1nIDsKK2ZsYWdzIGhwZm9ydHJhbiBPUFRJT05TIDxwcm9maWxpbmc+b24gOiAtcGcgOworCitmbGFncyBocGZvcnRyYW4gREVGSU5FUyA8ZGVmaW5lPiA7CitmbGFncyBocGZvcnRyYW4gSU5DTFVERVMgPGluY2x1ZGU+IDsKKworcnVsZSBjb21waWxlLmZvcnRyYW4KK3sKK30KKworYWN0aW9ucyBjb21waWxlLmZvcnRyYW4KK3sKKyAgZjc3ICtERDY0ICQoT1BUSU9OUykgLUQkKERFRklORVMpIC1JJChJTkNMVURFUykgLWMgLW8gIiQoPCkiICIkKD4pIiAKK30KKworZ2VuZXJhdG9ycy5yZWdpc3Rlci1mb3J0cmFuLWNvbXBpbGVyIGhwZm9ydHJhbi5jb21waWxlLmZvcnRyYW4gOiBGT1JUUkFOIDogT0JKIDsgCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2lmb3J0LmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvaWZvcnQuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViN2MxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2lmb3J0LmphbQpAQCAtMCwwICsxLDQ0IEBACisjIENvcHlyaWdodCAoQykgMjAwNCBUb29uIEtuYXBlbgorIworIyAgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorIyAgTGljZW5zZSBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKKyMgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworaW1wb3J0IHRvb2xzZXQgOiBmbGFncyA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgZm9ydHJhbiA7CisKK3J1bGUgaW5pdCAoIHZlcnNpb24gPyA6IGNvbW1hbmQgKiA6IG9wdGlvbnMgKiApCit7Cit9CisKKyMgRGVjbGFyZSBmbGFncyBhbmQgYWN0aW9uIGZvciBjb21waWxhdGlvbgorZmxhZ3MgaWZvcnQgT1BUSU9OUyA8ZmZsYWdzPiA7CisKK2ZsYWdzIGlmb3J0IE9QVElPTlMgPG9wdGltaXphdGlvbj5vZmYgOiAvT2QgOworZmxhZ3MgaWZvcnQgT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwZWVkIDogL08zIDsKK2ZsYWdzIGlmb3J0IE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGFjZSA6IC9PMSA7CisKK2ZsYWdzIGlmb3J0IE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b24gOiAvZGVidWc6ZnVsbCA7CitmbGFncyBpZm9ydCBPUFRJT05TIDxwcm9maWxpbmc+b24gOiAvUXByb2ZfZ2VuIDsKKworZmxhZ3MgaWZvcnQuY29tcGlsZSBGRkxBR1MgPHJ1bnRpbWUtZGVidWdnaW5nPm9mZi88cnVudGltZS1saW5rPnNoYXJlZCA6IC9NRCA7CitmbGFncyBpZm9ydC5jb21waWxlIEZGTEFHUyA8cnVudGltZS1kZWJ1Z2dpbmc+b24vPHJ1bnRpbWUtbGluaz5zaGFyZWQgOiAvTURkIDsKK2ZsYWdzIGlmb3J0LmNvbXBpbGUgRkZMQUdTIDxydW50aW1lLWRlYnVnZ2luZz5vZmYvPHJ1bnRpbWUtbGluaz5zdGF0aWMvPHRocmVhZGluZz5zaW5nbGUgOiAvTUwgOworZmxhZ3MgaWZvcnQuY29tcGlsZSBGRkxBR1MgPHJ1bnRpbWUtZGVidWdnaW5nPm9uLzxydW50aW1lLWxpbms+c3RhdGljLzx0aHJlYWRpbmc+c2luZ2xlIDogL01MZCA7CitmbGFncyBpZm9ydC5jb21waWxlIEZGTEFHUyA8cnVudGltZS1kZWJ1Z2dpbmc+b2ZmLzxydW50aW1lLWxpbms+c3RhdGljLzx0aHJlYWRpbmc+bXVsdGkgOiAvTVQgOworZmxhZ3MgaWZvcnQuY29tcGlsZSBGRkxBR1MgPHJ1bnRpbWUtZGVidWdnaW5nPm9uLzxydW50aW1lLWxpbms+c3RhdGljLzx0aHJlYWRpbmc+bXVsdGkgOiAvTVRkIDsKKworZmxhZ3MgaWZvcnQgREVGSU5FUyA8ZGVmaW5lPiA7CitmbGFncyBpZm9ydCBJTkNMVURFUyA8aW5jbHVkZT4gOworCitydWxlIGNvbXBpbGUuZm9ydHJhbgoreworfQorCithY3Rpb25zIGNvbXBpbGUuZm9ydHJhbgoreworICBpZm9ydCAkKEZGTEFHUykgJChPUFRJT05TKSAvbmFtZXM6bG93ZXJjYXNlIC9EJChERUZJTkVTKSAvSSIkKElOQ0xVREVTKSIgL2MgL29iamVjdDoiJCg8KSIgIiQoPikiIAorfQorCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWZvcnRyYW4tY29tcGlsZXIgaWZvcnQuY29tcGlsZS5mb3J0cmFuIDogRk9SVFJBTiA6IE9CSiA7IApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9pbnRlbC1kYXJ3aW4uamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9pbnRlbC1kYXJ3aW4uamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ODJhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2ludGVsLWRhcndpbi5qYW0KQEAgLTAsMCArMSwyMjcgQEAKKyMgQ29weXJpZ2h0IFZsYWRpbWlyIFBydXMgMjAwNC4KKyMgQ29weXJpZ2h0IE5vZWwgQmVsY291cnQgMjAwNy4KKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dAorIyBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworaW1wb3J0IGludGVsIDsKK2ltcG9ydCBmZWF0dXJlIDogZmVhdHVyZSA7CitpbXBvcnQgb3MgOworaW1wb3J0IHRvb2xzZXQgOworaW1wb3J0IHRvb2xzZXQgOiBmbGFncyA7CitpbXBvcnQgZ2NjIDsKK2ltcG9ydCBjb21tb24gOworaW1wb3J0IGVycm9ycyA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CisKK2ZlYXR1cmUuZXh0ZW5kLXN1YmZlYXR1cmUgdG9vbHNldCBpbnRlbCA6IHBsYXRmb3JtIDogZGFyd2luIDsKKwordG9vbHNldC5pbmhlcml0LWdlbmVyYXRvcnMgaW50ZWwtZGFyd2luIAorICA8dG9vbHNldD5pbnRlbCA8dG9vbHNldC1pbnRlbDpwbGF0Zm9ybT5kYXJ3aW4gCisgIDogZ2NjIAorICAjIERvbid0IGluaGVyaXQgUENIIGdlbmVyYXRvcnMuIFRoZXkgd2VyZSBub3QgdGVzdGVkLCBhbmQgcHJvYmFibHkKKyAgIyBkb24ndCB3b3JrIGZvciB0aGlzIGNvbXBpbGVyLgorICA6IGdjYy5taW5ndy5saW5rIGdjYy5taW5ndy5saW5rLmRsbCBnY2MuY29tcGlsZS5jLnBjaCBnY2MuY29tcGlsZS5jKysucGNoCisgIDsKKworZ2VuZXJhdG9ycy5vdmVycmlkZSBpbnRlbC1kYXJ3aW4ucHJlYnVpbHQgOiBidWlsdGluLmxpYi1nZW5lcmF0b3IgOworZ2VuZXJhdG9ycy5vdmVycmlkZSBpbnRlbC1kYXJ3aW4ucHJlYnVpbHQgOiBidWlsdGluLnByZWJ1aWx0IDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgaW50ZWwtZGFyd2luLnNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOiBzZWFyY2hlZC1saWItZ2VuZXJhdG9yIDsKKwordG9vbHNldC5pbmhlcml0LXJ1bGVzIGludGVsLWRhcndpbiA6IGdjYyA7Cit0b29sc2V0LmluaGVyaXQtZmxhZ3MgaW50ZWwtZGFyd2luIDogZ2NjIAorICAgICAgICA6IDxpbmxpbmluZz5vZmYgPGlubGluaW5nPm9uIDxpbmxpbmluZz5mdWxsIDxvcHRpbWl6YXRpb24+c3BhY2UgCisgICAgICAgICAgPHdhcm5pbmdzPm9mZiA8d2FybmluZ3M+YWxsIDx3YXJuaW5ncz5vbgorICAgICAgICAgIDxhcmNoaXRlY3R1cmU+eDg2LzxhZGRyZXNzLW1vZGVsPjMyCisgICAgICAgICAgPGFyY2hpdGVjdHVyZT54ODYvPGFkZHJlc3MtbW9kZWw+NjQKKyAgICAgICAgOworICAgICAgICAKK2lmIFsgTUFUQ0ggKC0tZGVidWctY29uZmlndXJhdGlvbikgOiBbIG1vZHVsZXMucGVlayA6IEFSR1YgXSBdCit7CisgICAgLmRlYnVnLWNvbmZpZ3VyYXRpb24gPSB0cnVlIDsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgCisjIHZlY3Rvcml6YXRpb24gZGlhZ25vc3RpY3MKK2ZlYXR1cmUgdmVjdG9yaXplIDogb2ZmIG9uIGZ1bGwgOworCisjIEluaXRpYWxpemVzIHRoZSBpbnRlbC1kYXJ3aW4gdG9vbHNldAorIyAgIHZlcnNpb24gaW4gbWFuZGF0b3J5CisjICAgbmFtZSAoZGVmYXVsdCBpY2MpIGlzIHVzZWQgdG8gaW52b2tlIHRoZSBzcGVjaWZpZWQgaW50ZWwgY29tcGxpZXIKKyMgICBjb21waWxlIGFuZCBsaW5rIG9wdGlvbnMgYWxsb3cgeW91IHRvIHNwZWNpZnkgYWRkaXRpb24gY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIGVhY2ggdmVyc2lvbgorcnVsZSBpbml0ICggdmVyc2lvbiA/IDogIGNvbW1hbmQgKiA6IG9wdGlvbnMgKiApCit7CisgICAgbG9jYWwgY29uZGl0aW9uID0gWyBjb21tb24uY2hlY2staW5pdC1wYXJhbWV0ZXJzIGludGVsLWRhcndpbgorICAgICAgICA6IHZlcnNpb24gJCh2ZXJzaW9uKSBdIDsKKyAgICAKKyAgICBjb21tYW5kID0gWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBpbnRlbC1kYXJ3aW4gOiBpY2MgCisgICAgICAgIDogJChjb21tYW5kKSA6IC9vcHQvaW50ZWxfY2NfODAvYmluIF0gOworCisgICAgY29tbW9uLmhhbmRsZS1vcHRpb25zIGludGVsLWRhcndpbiA6ICQoY29uZGl0aW9uKSA6ICQoY29tbWFuZCkgOiAkKG9wdGlvbnMpIDsKKworICAgIGdjYy5pbml0LWxpbmstZmxhZ3MgaW50ZWwtZGFyd2luIGRhcndpbiAkKGNvbmRpdGlvbikgOworCisgICAgIyBoYW5kbGUgPGxpYnJhcnktcGF0aD4KKyAgICAjIGxvY2FsIGxpYnJhcnktcGF0aCA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxsaWJyYXJ5LXBhdGg+IDogJChvcHRpb25zKSBdIDsKKyAgICAjIGZsYWdzIGludGVsLWRhcndpbi5saW5rIFVTRVJfT1BUSU9OUyAkKGNvbmRpdGlvbikgOiBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8ZGxsLXBhdGg+IDogJChvcHRpb25zKSBdIDsKKworICAgIGxvY2FsIHJvb3QgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8cm9vdD4gOiAkKG9wdGlvbnMpIF0gOworICAgIGxvY2FsIGJpbiA7CisgICAgaWYgJChjb21tYW5kKSB8fCAkKHJvb3QpCisgICAgeworICAgICAgICBiaW4gPz0gWyBjb21tb24uZ2V0LWFic29sdXRlLXRvb2wtcGF0aCAkKGNvbW1hbmRbLTFdKSBdIDsKKyAgICAgICAgcm9vdCA/PSAkKGJpbjpEKSA7CisgICAgCisgICAgICAgIGlmICQocm9vdCkKKyAgICAgICAgeworICAgICAgICAgICAgIyBMaWJyYXJpZXMgcmVxdWlyZWQgdG8gcnVuIHRoZSBleGVjdXRhYmxlIG1heSBiZSBpbiBlaXRoZXIKKyAgICAgICAgICAgICMgJChyb290KS9saWIgKDEwLjEgYW5kIGVhcmxpZXIpIAorICAgICAgICAgICAgIyAgICAgb3IgCisgICAgICAgICAgICAjICQocm9vdCkvbGliL2FyY2hpdGVjdHVyZS1uYW1lICgxMS4wIGFuZCBsYXRlcjoKKyAgICAgICAgICAgIGxvY2FsIGxpYl9wYXRoID0gJChyb290KS9saWIgJChyb290OlApL2xpYi8kKGJpbjpCKSA7CisgICAgICAgICAgICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gbm90aWNlOiB1c2luZyBpbnRlbCBsaWJyYXJpZXMgOjogJChjb25kaXRpb24pIDo6ICQobGliX3BhdGgpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsYWdzIGludGVsLWRhcndpbi5saW5rIFJVTl9QQVRIICQoY29uZGl0aW9uKSA6ICQobGliX3BhdGgpIDsKKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIGxvY2FsIG0gPSBbIE1BVENIICguLikuKiA6ICQodmVyc2lvbikgXSA7CisgICAgbG9jYWwgbiA9IFsgTUFUQ0ggKC4pXFwuIDogJChtKSBdIDsKKyAgICBpZiAkKG4pIHsKKyAgICAgIG0gPSAkKG4pIDsKKyAgICB9CisKKyAgICBsb2NhbCBtYWpvciA9ICQobSkgOworICAgIAorICAgIGlmICQobWFqb3IpID0gIjkiIHsKKyAgICAgIGZsYWdzIGludGVsLWRhcndpbi5jb21waWxlIE9QVElPTlMgJChjb25kaXRpb24pLzxpbmxpbmluZz5vZmYgOiAtT2IwIDsKKyAgICAgIGZsYWdzIGludGVsLWRhcndpbi5jb21waWxlIE9QVElPTlMgJChjb25kaXRpb24pLzxpbmxpbmluZz5vbiA6IC1PYjEgIDsKKyAgICAgIGZsYWdzIGludGVsLWRhcndpbi5jb21waWxlIE9QVElPTlMgJChjb25kaXRpb24pLzxpbmxpbmluZz5mdWxsIDogLU9iMiAgOworICAgICAgZmxhZ3MgaW50ZWwtZGFyd2luLmNvbXBpbGUgT1BUSU9OUyAkKGNvbmRpdGlvbikvPHZlY3Rvcml6ZT5vZmYgOiAtdmVjLXJlcG9ydDAgOworICAgICAgZmxhZ3MgaW50ZWwtZGFyd2luLmNvbXBpbGUgT1BUSU9OUyAkKGNvbmRpdGlvbikvPHZlY3Rvcml6ZT5vbiA6IC12ZWMtcmVwb3J0MSA7CisgICAgICBmbGFncyBpbnRlbC1kYXJ3aW4uY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88dmVjdG9yaXplPmZ1bGwgOiAtdmVjLXJlcG9ydDUgOworICAgICAgZmxhZ3MgaW50ZWwtZGFyd2luLmxpbmsgT1BUSU9OUyAkKGNvbmRpdGlvbikvPHJ1bnRpbWUtbGluaz5zdGF0aWMgOiAtc3RhdGljIC1zdGF0aWMtbGliY3hhIC1sc3RkYysrIC1scHRocmVhZCA7CisgICAgICBmbGFncyBpbnRlbC1kYXJ3aW4ubGluayBPUFRJT05TICQoY29uZGl0aW9uKS88cnVudGltZS1saW5rPnNoYXJlZCA6IC1zaGFyZWQtbGliY3hhIC1sc3RkYysrIC1scHRocmVhZCA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZmxhZ3MgaW50ZWwtZGFyd2luLmNvbXBpbGUgT1BUSU9OUyAkKGNvbmRpdGlvbikvPGlubGluaW5nPm9mZiA6IC1pbmxpbmUtbGV2ZWw9MCA7CisgICAgICBmbGFncyBpbnRlbC1kYXJ3aW4uY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88aW5saW5pbmc+b24gOiAtaW5saW5lLWxldmVsPTEgIDsKKyAgICAgIGZsYWdzIGludGVsLWRhcndpbi5jb21waWxlIE9QVElPTlMgJChjb25kaXRpb24pLzxpbmxpbmluZz5mdWxsIDogLWlubGluZS1sZXZlbD0yICA7CisgICAgICBmbGFncyBpbnRlbC1kYXJ3aW4uY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88dmVjdG9yaXplPm9mZiA6IC12ZWMtcmVwb3J0MCA7CisgICAgICBmbGFncyBpbnRlbC1kYXJ3aW4uY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88dmVjdG9yaXplPm9uIDogLXZlYy1yZXBvcnQxIDsKKyAgICAgIGZsYWdzIGludGVsLWRhcndpbi5jb21waWxlIE9QVElPTlMgJChjb25kaXRpb24pLzx2ZWN0b3JpemU+ZnVsbCA6IC12ZWMtcmVwb3J0NSA7CisgICAgICBmbGFncyBpbnRlbC1kYXJ3aW4ubGluayBPUFRJT05TICQoY29uZGl0aW9uKS88cnVudGltZS1saW5rPnN0YXRpYyA6IC1zdGF0aWMgLXN0YXRpYy1pbnRlbCAtbHN0ZGMrKyAtbHB0aHJlYWQgOworICAgICAgZmxhZ3MgaW50ZWwtZGFyd2luLmxpbmsgT1BUSU9OUyAkKGNvbmRpdGlvbikvPHJ1bnRpbWUtbGluaz5zaGFyZWQgOiAtc2hhcmVkLWludGVsIC1sc3RkYysrIC1scHRocmVhZCA7CisgICAgfQorCisgICAgbG9jYWwgbWlub3IgPSBbIE1BVENIICIuKlxcLiguKS4qIiA6ICQodmVyc2lvbikgXSA7CisKKyAgICAjIHdjaGFyX3QgY2hhcl90cmFpdHMgd29ya2Fyb3VuZCBmb3IgY29tcGlsZXJzIG9sZGVyIHRoYW4gMTAuMgorICAgIGlmICQobWFqb3IpID0gIjkiIHx8ICggJChtYWpvcikgPSAiMTAiICYmICggJChtaW5vcikgPSAiMCIgfHwgJChtaW5vcikgPSAiMSIgKSApIHsKKyAgICAgICAgZmxhZ3MgaW50ZWwtZGFyd2luLmNvbXBpbGUgREVGSU5FUyAkKGNvbmRpdGlvbikgOiBfX1dJTlRfVFlQRV9fPWludCA6IHVuY2hlY2tlZCA7CisgICAgfQorfQorCitTUEFDRSA9ICIgIiA7CisKK2ZsYWdzIGludGVsLWRhcndpbi5jb21waWxlIE9QVElPTlMgPGNmbGFncz4gOworZmxhZ3MgaW50ZWwtZGFyd2luLmNvbXBpbGUgT1BUSU9OUyA8Y3h4ZmxhZ3M+IDsKKyMgZmxhZ3MgaW50ZWwtZGFyd2luLmNvbXBpbGUgSU5DTFVERVMgPGluY2x1ZGU+IDsKKworZmxhZ3MgaW50ZWwtZGFyd2luLmNvbXBpbGUgT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwYWNlIDogLU8xIDsgIyBubyBzcGVjaWZpYyBzcGFjZSBvcHRpbWl6YXRpb24gZmxhZyBpbiBpY2MKKworIyAKKy5jcHUtdHlwZS1lbTY0dCAgICA9IHByZXNjb3R0IG5vY29uYSBjb3JlMiBjb3JlaTcgY29yZWk3LWF2eCBjb3JlLWF2eC1pCisgICAgICAgICAgICAgICAgICAgICBjb25yb2UgY29ucm9lLXhlIGNvbnJvZS1sIGFsbGVuZGFsZSBtZXJvbQorICAgICAgICAgICAgICAgICAgICAgbWVyb20teGUga2VudHNmaWVsZCBrZW50c2ZpZWxkLXhlIHBlbnJ5biB3b2xmZGFsZQorICAgICAgICAgICAgICAgICAgICAgeW9ya3NmaWVsZCBuZWhhbGVtIHNhbmR5LWJyaWRnZSBpdnktYnJpZGdlIGhhc3dlbGwgOworLmNwdS10eXBlLWFtZDY0ICAgID0gazggb3B0ZXJvbiBhdGhsb242NCBhdGhsb24tZnggazgtc3NlMyBvcHRlcm9uLXNzZTMKKyAgICAgICAgICAgICAgICAgICAgIGF0aGxvbjY0LXNzZTMgYW1kZmFtMTAgYmFyY2Vsb25hIGJkdmVyMSBiZHZlcjIgYmR2ZXIzIGJ0dmVyMSBidHZlcjIgOworLmNwdS10eXBlLXg4Ni02NCAgID0gJCguY3B1LXR5cGUtZW02NHQpICQoLmNwdS10eXBlLWFtZDY0KSA7CisKK2ZsYWdzIGludGVsLWRhcndpbi5jb21waWxlIE9QVElPTlMgPGluc3RydWN0aW9uLXNldD4kKC5jcHUtdHlwZS14ODYtNjQpLzxhZGRyZXNzLW1vZGVsPjMyIDogLW0zMiA7ICMgLW1jbW9kZWw9c21hbGwgOworZmxhZ3MgaW50ZWwtZGFyd2luLmNvbXBpbGUgT1BUSU9OUyA8aW5zdHJ1Y3Rpb24tc2V0PiQoLmNwdS10eXBlLXg4Ni02NCkvPGFkZHJlc3MtbW9kZWw+NjQgOiAtbTY0IDsgIyAtbWNtb2RlbD1sYXJnZSA7CisKK2ZsYWdzIGludGVsLWRhcndpbi5jb21waWxlLmMgT1BUSU9OUyA8d2FybmluZ3M+b2ZmIDogLXcwIDsKK2ZsYWdzIGludGVsLWRhcndpbi5jb21waWxlLmMgT1BUSU9OUyA8d2FybmluZ3M+b24gOiAtdzEgOworZmxhZ3MgaW50ZWwtZGFyd2luLmNvbXBpbGUuYyBPUFRJT05TIDx3YXJuaW5ncz5hbGwgOiAtdzIgOworCitmbGFncyBpbnRlbC1kYXJ3aW4uY29tcGlsZS5jKysgT1BUSU9OUyA8d2FybmluZ3M+b2ZmIDogLXcwIDsKK2ZsYWdzIGludGVsLWRhcndpbi5jb21waWxlLmMrKyBPUFRJT05TIDx3YXJuaW5ncz5vbiA6IC13MSA7CitmbGFncyBpbnRlbC1kYXJ3aW4uY29tcGlsZS5jKysgT1BUSU9OUyA8d2FybmluZ3M+YWxsIDogLXcyIDsKKworYWN0aW9ucyBjb21waWxlLmMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiIC14YyAkKE9QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCithY3Rpb25zIGNvbXBpbGUuYysrCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAteGMrKyAkKE9QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCitmbGFncyBpbnRlbC1kYXJ3aW4gQVJGTEFHUyA8YXJjaGl2ZWZsYWdzPiA7CisKKyMgRGVmYXVsdCB2YWx1ZS4gTW9zdGx5IGZvciB0aGUgc2FrZSBvZiBpbnRlbC1saW51eAorIyB0aGF0IGluaGVyaXRzIGZyb20gZ2NjLCBidXQgZG9lcyBub3QgaGFzIHRoZSBzYW1lCisjIGxvZ2ljIHRvIHNldCB0aGUgLkFSIHZhcmlhYmxlLiBXZSBjYW4gcHV0IHRoZSBzYW1lCisjIGxvZ2ljIGluIGludGVsLWxpbnV4LCBidXQgdGhhdCdzIGhhcmRseSB3b3J0aCB0aGUgdHJvdWJsZQorIyBhcyBvbiBMaW51eCwgJ2FyJyBpcyBhbHdheXMgYXZhaWxhYmxlLgorLkFSID0gYXIgOworCitydWxlIGFyY2hpdmUgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAjIEFsd2F5cyByZW1vdmUgYXJjaGl2ZSBhbmQgc3RhcnQgYWdhaW4uIEhlcmUncyByYXRpb25hbGUgZnJvbQorICAjIEFuZHJlIEhlbnR6OgorICAjCisgICMgSSBoYWQgYSBmaWxlLCBzYXkgYTEuYywgdGhhdCB3YXMgaW5jbHVkZWQgaW50byBsaWJhLmEuIAorICAjIEkgbW92ZWQgYTEuYyB0byBhMi5jLCB1cGRhdGVkIG15IEphbWZpbGVzIGFuZCByZWJ1aWx0LiAKKyAgIyBNeSBwcm9ncmFtIHdhcyBjcmFzaGluZyB3aXRoIGFic3VyZCBlcnJvcnMuIAorICAjIEFmdGVyIHNvbWUgZGVidWdnaW5nIEkgdHJhY2VkIGl0IGJhY2sgdG8gdGhlIGZhY3QgdGhhdCBhMS5vIHdhcyAqc3RpbGwqIAorICAjIGluIGxpYmEuYSAKKyAgIworICAjIFJlbmUgUml2ZXJhOgorICAjCisgICMgT3JpZ2luYWxseSByZW1vdmluZyB0aGUgYXJjaGl2ZSB3YXMgZG9uZSBieSBzcGxpY2luZyBhbiBSTQorICAjIG9udG8gdGhlIGFyY2hpdmUgYWN0aW9uLiBUaGF0IG1ha2VzIGFyY2hpdmVzIGZhaWwgdG8gYnVpbGQgb24gTlQKKyAgIyB3aGVuIHRoZXkgaGF2ZSBtYW55IGZpbGVzIGJlY2F1c2UgaXQgd2lsbCBubyBsb25nZXIgZXhlY3V0ZSB0aGUKKyAgIyBhY3Rpb24gZGlyZWN0bHkgYW5kIGJsb3cgdGhlIGxpbmUgbGVuZ3RoIGxpbWl0LiBJbnN0ZWFkIHdlCisgICMgcmVtb3ZlIHRoZSBmaWxlIGluIGEgZGlmZmVyZW50IGFjdGlvbiwganVzdCBiZWZvcmUgdGhlIGJ1aWxkaW5nCisgICMgb2YgdGhlIGFyY2hpdmUuCisgICMKKyAgbG9jYWwgY2xlYW4uYSA9ICQodGFyZ2V0c1sxXSkoY2xlYW4pIDsKKyAgVEVNUE9SQVJZICQoY2xlYW4uYSkgOworICBOT0NBUkUgJChjbGVhbi5hKSA7CisgIExPQ0FURSBvbiAkKGNsZWFuLmEpID0gWyBvbiAkKHRhcmdldHNbMV0pIHJldHVybiAkKExPQ0FURSkgXSA7CisgIERFUEVORFMgJChjbGVhbi5hKSA6ICQoc291cmNlcykgOworICBERVBFTkRTICQodGFyZ2V0cykgOiAkKGNsZWFuLmEpIDsKKyAgY29tbW9uLlJtVGVtcHMgJChjbGVhbi5hKSA6ICQodGFyZ2V0cykgOworfQorCithY3Rpb25zIHBpZWNlbWVhbCBhcmNoaXZlCit7CisgICIkKC5BUikiICQoQVJPUFRJT05TKSByYyAiJCg8KSIgIiQoPikiCisgICJyYW5saWIiIC1jcyAiJCg8KSIKK30KKworZmxhZ3MgaW50ZWwtZGFyd2luLmxpbmsgVVNFUl9PUFRJT05TIDxsaW5rZmxhZ3M+IDsKKworIyBEZWNsYXJlIGFjdGlvbnMgZm9yIGxpbmtpbmcKK3J1bGUgbGluayAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgIFNQQUNFIG9uICQodGFyZ2V0cykgPSAiICIgOworICAjIFNlcmlhbGl6ZSBleGVjdXRpb24gb2YgdGhlICdsaW5rJyBhY3Rpb24sIHNpbmNlCisgICMgcnVubmluZyBOIGxpbmtzIGluIHBhcmFsbGVsIGlzIGp1c3Qgc2xvd2VyLgorICBKQU1fU0VNQVBIT1JFIG9uICQodGFyZ2V0cykgPSA8cz5pbnRlbC1kYXJ3aW4tbGluay1zZW1hcGhvcmUgOworfQorCithY3Rpb25zIGxpbmsgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoVVNFUl9PUFRJT05TKSAtTCIkKExJTktQQVRIKSIgLW8gIiQoPCkiICIkKD4pIiAiJChMSUJSQVJJRVMpIiAtbCQoRklORExJQlMtU0EpIC1sJChGSU5ETElCUy1TVCkgJChPUFRJT05TKQorfQorCithY3Rpb25zIGxpbmsuZGxsIGJpbmQgTElCUkFSSUVTCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAkKFVTRVJfT1BUSU9OUykgLUwiJChMSU5LUEFUSCkiIC1vICIkKDwpIiAtc2luZ2xlX21vZHVsZSAtZHluYW1pY2xpYiAtaW5zdGFsbF9uYW1lICIkKDxbMV06RD0pIiAiJCg+KSIgICIkKExJQlJBUklFUykiIC1sJChGSU5ETElCUy1TQSkgLWwkKEZJTkRMSUJTLVNUKSAkKE9QVElPTlMpCit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2ludGVsLWxpbnV4LmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvaW50ZWwtbGludXguamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MTY0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2ludGVsLWxpbnV4LmphbQpAQCAtMCwwICsxLDI1MCBAQAorIyAgQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgU3RldmVucworIyAgQ29weXJpZ2h0IChjKSAyMDExIEJyeWNlIExlbGJhY2gKKyMKKyMgIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKKyMgIExpY2Vuc2UgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yCisjICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2ltcG9ydCB0b29sc2V0IDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCB0b29sc2V0IDogZmxhZ3MgOworCitpbXBvcnQgaW50ZWwgOworaW1wb3J0IGdjYyA7CitpbXBvcnQgY29tbW9uIDsKK2ltcG9ydCBlcnJvcnMgOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IHR5cGUgOworaW1wb3J0IG51bWJlcnMgOworCitmZWF0dXJlLmV4dGVuZC1zdWJmZWF0dXJlIHRvb2xzZXQgaW50ZWwgOiBwbGF0Zm9ybSA6IGxpbnV4IDsKKwordG9vbHNldC5pbmhlcml0LWdlbmVyYXRvcnMgaW50ZWwtbGludXggCisgICAgIDx0b29sc2V0PmludGVsIDx0b29sc2V0LWludGVsOnBsYXRmb3JtPmxpbnV4IDogZ2NjIDogZ2NjLm1pbmd3LmxpbmsgZ2NjLm1pbmd3LmxpbmsuZGxsIDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgaW50ZWwtbGludXgucHJlYnVpbHQgOiBidWlsdGluLmxpYi1nZW5lcmF0b3IgOworZ2VuZXJhdG9ycy5vdmVycmlkZSBpbnRlbC1saW51eC5wcmVidWlsdCA6IGJ1aWx0aW4ucHJlYnVpbHQgOworZ2VuZXJhdG9ycy5vdmVycmlkZSBpbnRlbC1saW51eC5zZWFyY2hlZC1saWItZ2VuZXJhdG9yIDogc2VhcmNoZWQtbGliLWdlbmVyYXRvciA7CisKKyMgT3ZlcnJpZGUgZGVmYXVsdCBkby1ub3RoaW5nIGdlbmVyYXRvcnMuCitnZW5lcmF0b3JzLm92ZXJyaWRlIGludGVsLWxpbnV4LmNvbXBpbGUuYy5wY2ggICA6IHBjaC5kZWZhdWx0LWMtcGNoLWdlbmVyYXRvciAgIDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgaW50ZWwtbGludXguY29tcGlsZS5jKysucGNoIDogcGNoLmRlZmF1bHQtY3BwLXBjaC1nZW5lcmF0b3IgOworIAordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXggUENIIDogPHRvb2xzZXQ+aW50ZWwgPHRvb2xzZXQtaW50ZWw6cGxhdGZvcm0+bGludXggOiBwY2hpIDsKKwordG9vbHNldC5pbmhlcml0LXJ1bGVzIGludGVsLWxpbnV4IDogZ2NjIDsKK3Rvb2xzZXQuaW5oZXJpdC1mbGFncyBpbnRlbC1saW51eCA6IGdjYyAKKyAgICAgICAgOiA8aW5saW5pbmc+b2ZmIDxpbmxpbmluZz5vbiA8aW5saW5pbmc+ZnVsbAorICAgICAgICAgIDxvcHRpbWl6YXRpb24+c3BhY2UgPG9wdGltaXphdGlvbj5zcGVlZAorICAgICAgICAgIDx3YXJuaW5ncz5vZmYgPHdhcm5pbmdzPmFsbCA8d2FybmluZ3M+b24KKyAgICAgICAgOworICAgICAgICAKK2lmIFsgTUFUQ0ggKC0tZGVidWctY29uZmlndXJhdGlvbikgOiBbIG1vZHVsZXMucGVlayA6IEFSR1YgXSBdCit7CisgICAgLmRlYnVnLWNvbmZpZ3VyYXRpb24gPSB0cnVlIDsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgCisjIEluaXRpYWxpemVzIHRoZSBpbnRlbC1saW51eCB0b29sc2V0CisjICAgdmVyc2lvbiBpbiBtYW5kYXRvcnkKKyMgICBuYW1lIChkZWZhdWx0IGljcGMpIGlzIHVzZWQgdG8gaW52b2tlIHRoZSBzcGVjaWZpZWQgaW50ZWwtbGludXggY29tcGxpZXIKKyMgICBjb21waWxlIGFuZCBsaW5rIG9wdGlvbnMgYWxsb3cgeW91IHRvIHNwZWNpZnkgYWRkaXRpb24gY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIGVhY2ggdmVyc2lvbgorcnVsZSBpbml0ICggdmVyc2lvbiA/IDogIGNvbW1hbmQgKiA6IG9wdGlvbnMgKiApCit7CisgICAgbG9jYWwgY29uZGl0aW9uID0gWyBjb21tb24uY2hlY2staW5pdC1wYXJhbWV0ZXJzIGludGVsLWxpbnV4CisgICAgICAgIDogdmVyc2lvbiAkKHZlcnNpb24pIF0gOworICAgIAorICAgIGlmICQoLmRlYnVnLWNvbmZpZ3VyYXRpb24pCisgICAgeworICAgICAgICBFQ0hPICJub3RpY2U6IGludGVsLWxpbnV4IHZlcnNpb24gaXMiICQodmVyc2lvbikgOworICAgIH0KKworICAgIGxvY2FsIGRlZmF1bHRfcGF0aCA7CisKKyAgICAjIEludGVsIEMrKyBDb21wb3NlciBYRSAyMDExIGZvciBMaW51eCwgYWthIEludGVsIEMrKyBDb21waWxlciBYRSAxMi4wLAorICAgICMgYWthIGludGVsLWxpbnV4LTEyLjAuIEluIHRoaXMgdmVyc2lvbiwgSW50ZWwgdGhhbmtmdWxseSBkZWNpZGVzIHRvIGluc3RhbGwKKyAgICAjIHRvIGEgc2FuZSAnaW50ZWwnIGZvbGRlciBpbiAvb3B0LgorICAgIGlmIFsgTUFUQ0ggIigxMlsuXTB8MTIpIiA6ICQodmVyc2lvbikgXQorICAgICAgICB7IGRlZmF1bHRfcGF0aCA9IC9vcHQvaW50ZWwvYmluIDsgfQorICAgICMgSW50ZWwgQysrIENvbXBpbGVyIDExLjEuIAorICAgIGVsc2UgaWYgWyBNQVRDSCAiKDExWy5dMSkiIDogJCh2ZXJzaW9uKSBdCisgICAgICAgIHsgZGVmYXVsdF9wYXRoID0gL29wdC9pbnRlbF9jY2VfMTEuMS4wNjQueDg2XzY0L2JpbiA7IH0KKyAgICAjIEludGVsIEMrKyBDb21waWxlciAxMS4wLiAKKyAgICBlbHNlIGlmIFsgTUFUQ0ggIigxMVsuXTB8MTEpIiA6ICQodmVyc2lvbikgXQorICAgICAgICB7IGRlZmF1bHRfcGF0aCA9IC9vcHQvaW50ZWxfY2NlXzExLjAuMDc0Lng4Nl82NC9iaW4gOyB9CisgICAgIyBJbnRlbCBDKysgQ29tcGlsZXIgMTAuMS4gCisgICAgZWxzZSBpZiBbIE1BVENIICIoMTBbLl0xKSIgOiAkKHZlcnNpb24pIF0KKyAgICAgICAgeyBkZWZhdWx0X3BhdGggPSAvb3B0L2ludGVsX2NjZV8xMC4xLjAxM194NjQvYmluIDsgfQorICAgICMgSW50ZWwgQysrIENvbXBpbGVyIDkuMS4gCisgICAgZWxzZSBpZiBbIE1BVENIICIoOVsuXTEpIiA6ICQodmVyc2lvbikgXQorICAgICAgICB7IGRlZmF1bHRfcGF0aCA9IC9vcHQvaW50ZWxfY2NfOTEvYmluIDsgfQorICAgICMgSW50ZWwgQysrIENvbXBpbGVyIDkuMC4gCisgICAgZWxzZSBpZiBbIE1BVENIICIoOVsuXTB8OSkiIDogJCh2ZXJzaW9uKSBdCisgICAgICAgIHsgZGVmYXVsdF9wYXRoID0gL29wdC9pbnRlbF9jY185MC9iaW4gOyB9CisgICAgIyBJbnRlbCBDKysgQ29tcGlsZXIgOC4xLiAKKyAgICBlbHNlIGlmIFsgTUFUQ0ggIig4Wy5dMSkiIDogJCh2ZXJzaW9uKSBdCisgICAgICAgIHsgZGVmYXVsdF9wYXRoID0gL29wdC9pbnRlbF9jY184MS9iaW4gOyB9CisgICAgIyBJbnRlbCBDKysgQ29tcGlsZXIgOC4wIC0gdGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0LCBzbyBub3cgaXQncyB0aGUKKyAgICAjIGZhbGxiYWNrLiAKKyAgICBlbHNlIAorICAgICAgICB7IGRlZmF1bHRfcGF0aCA9IC9vcHQvaW50ZWxfY2NfODAvYmluIDsgfQorICAgICAgICAgICAgCisgICAgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICB7CisgICAgICAgIEVDSE8gIm5vdGljZTogZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgaW50ZWwtbGludXggaXMiICQoZGVmYXVsdF9wYXRoKSA7CisgICAgfQorCisgICAgY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgaW50ZWwtbGludXggOiBpY3BjIAorICAgICAgICA6ICQoY29tbWFuZCkgOiAkKGRlZmF1bHRfcGF0aCkgXSA7CisgICAgICAgICAgICAgICAgCisgICAgY29tbW9uLmhhbmRsZS1vcHRpb25zIGludGVsLWxpbnV4IDogJChjb25kaXRpb24pIDogJChjb21tYW5kKSA6ICQob3B0aW9ucykgOworCisgICAgZ2NjLmluaXQtbGluay1mbGFncyBpbnRlbC1saW51eCBnbnUgJChjb25kaXRpb24pIDsKKyAgICAKKyAgICBsb2NhbCByb290ID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPHJvb3Q+IDogJChvcHRpb25zKSBdIDsKKyAgICBsb2NhbCBiaW4gOworICAgIGlmICQoY29tbWFuZCkgfHwgJChyb290KQorICAgIHsKKyAgICAgICAgYmluID89IFsgY29tbW9uLmdldC1hYnNvbHV0ZS10b29sLXBhdGggJChjb21tYW5kWy0xXSkgXSA7CisgICAgICAgIHJvb3QgPz0gJChiaW46RCkgOworICAgICAgICAKKyAgICAgICAgbG9jYWwgY29tbWFuZC1zdHJpbmcgPSAkKGNvbW1hbmQ6Sj0iICIpIDsKKyAgICAgICAgbG9jYWwgdmVyc2lvbi1vdXRwdXQgPSBbIFNIRUxMICIkKGNvbW1hbmQtc3RyaW5nKSAtLXZlcnNpb24iIF0gOworICAgICAgICBsb2NhbCByZWFsLXZlcnNpb24gPSBbIE1BVENIICIoWzAtOS5dKykiIDogJCh2ZXJzaW9uLW91dHB1dCkgXSA7CisgICAgICAgIGxvY2FsIG1ham9yID0gWyBNQVRDSCAiKFswLTldKykuKiIgOiAkKHJlYWwtdmVyc2lvbikgXSA7CisgICAgICAgIAorICAgICAgICAjIElmIHdlIGZhaWxlZCB0byBkZXRlcm1pbmUgbWFqb3IgdmVyc2lvbiwgdXNlIHRoZSBiZWhhdmlvdXIgZm9yCisgICAgICAgICMgdGhlIGN1cnJlbnQgY29tcGlsZXIuCisgICAgICAgIGlmICQobWFqb3IpICYmIFsgbnVtYmVycy5sZXNzICQobWFqb3IpIDEwIF0KKyAgICAgICAgeworICAgICAgICAgICAgZmxhZ3MgaW50ZWwtbGludXguY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88aW5saW5pbmc+b2ZmIDogIi1PYjAiIDsKKyAgICAgICAgICAgIGZsYWdzIGludGVsLWxpbnV4LmNvbXBpbGUgT1BUSU9OUyAkKGNvbmRpdGlvbikvPGlubGluaW5nPm9uIDogIi1PYjEiIDsKKyAgICAgICAgICAgIGZsYWdzIGludGVsLWxpbnV4LmNvbXBpbGUgT1BUSU9OUyAkKGNvbmRpdGlvbikvPGlubGluaW5nPmZ1bGwgOiAiLU9iMiIgOyAgICAgICAgICAgIAorICAgICAgICAgICAgZmxhZ3MgaW50ZWwtbGludXguY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88b3B0aW1pemF0aW9uPnNwYWNlIDogIi1PMSIgOworICAgICAgICAgICAgZmxhZ3MgaW50ZWwtbGludXguY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88b3B0aW1pemF0aW9uPnNwZWVkIDogIi1PMyAtaXAiIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICQobWFqb3IpICYmIFsgbnVtYmVycy5sZXNzICQobWFqb3IpIDExIF0KKyAgICAgICAgeworICAgICAgICAgICAgZmxhZ3MgaW50ZWwtbGludXguY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88aW5saW5pbmc+b2ZmIDogIi1pbmxpbmUtbGV2ZWw9MCIgOyAKKyAgICAgICAgICAgIGZsYWdzIGludGVsLWxpbnV4LmNvbXBpbGUgT1BUSU9OUyAkKGNvbmRpdGlvbikvPGlubGluaW5nPm9uIDogIi1pbmxpbmUtbGV2ZWw9MSIgOyAKKyAgICAgICAgICAgIGZsYWdzIGludGVsLWxpbnV4LmNvbXBpbGUgT1BUSU9OUyAkKGNvbmRpdGlvbikvPGlubGluaW5nPmZ1bGwgOiAiLWlubGluZS1sZXZlbD0yIiA7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZmxhZ3MgaW50ZWwtbGludXguY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88b3B0aW1pemF0aW9uPnNwYWNlIDogIi1PMSIgOworICAgICAgICAgICAgZmxhZ3MgaW50ZWwtbGludXguY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88b3B0aW1pemF0aW9uPnNwZWVkIDogIi1PMyAtaXAiIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlICMgbmV3ZXIgdmVyc2lvbiBvZiBpbnRlbCBkbyBoYXZlIC1PcyAoYXQgbGVhc3QgMTErLCBkb24ndCBrbm93IGFib3V0IDEwKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBmbGFncyBpbnRlbC1saW51eC5jb21waWxlIE9QVElPTlMgJChjb25kaXRpb24pLzxpbmxpbmluZz5vZmYgOiAiLWlubGluZS1sZXZlbD0wIiA7IAorICAgICAgICAgICAgZmxhZ3MgaW50ZWwtbGludXguY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88aW5saW5pbmc+b24gOiAiLWlubGluZS1sZXZlbD0xIiA7IAorICAgICAgICAgICAgZmxhZ3MgaW50ZWwtbGludXguY29tcGlsZSBPUFRJT05TICQoY29uZGl0aW9uKS88aW5saW5pbmc+ZnVsbCA6ICItaW5saW5lLWxldmVsPTIiIDsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBmbGFncyBpbnRlbC1saW51eC5jb21waWxlIE9QVElPTlMgJChjb25kaXRpb24pLzxvcHRpbWl6YXRpb24+c3BhY2UgOiAiLU9zIiA7CisgICAgICAgICAgICBmbGFncyBpbnRlbC1saW51eC5jb21waWxlIE9QVElPTlMgJChjb25kaXRpb24pLzxvcHRpbWl6YXRpb24+c3BlZWQgOiAiLU8zIC1pcCIgOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgICAgCisgICAgICAgIGlmICQocm9vdCkKKyAgICAgICAgeworICAgICAgICAgICAgIyBMaWJyYXJpZXMgcmVxdWlyZWQgdG8gcnVuIHRoZSBleGVjdXRhYmxlIG1heSBiZSBpbiBlaXRoZXIKKyAgICAgICAgICAgICMgJChyb290KS9saWIgKDEwLjEgYW5kIGVhcmxpZXIpIAorICAgICAgICAgICAgIyAgICAgb3IgCisgICAgICAgICAgICAjICQocm9vdCkvbGliL2FyY2hpdGVjdHVyZS1uYW1lICgxMS4wIGFuZCBsYXRlcjoKKyAgICAgICAgICAgIGxvY2FsIGxpYl9wYXRoID0gJChyb290KS9saWIgJChyb290OlApL2xpYi8kKGJpbjpCKSA7CisgICAgICAgICAgICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gbm90aWNlOiB1c2luZyBpbnRlbCBsaWJyYXJpZXMgOjogJChjb25kaXRpb24pIDo6ICQobGliX3BhdGgpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsYWdzIGludGVsLWxpbnV4LmxpbmsgUlVOX1BBVEggJChjb25kaXRpb24pIDogJChsaWJfcGF0aCkgOworICAgICAgICB9ICAgCisgICAgfQorfQorCitTUEFDRSA9ICIgIiA7CisKK2ZsYWdzIGludGVsLWxpbnV4LmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3M+b2ZmIDogLXcwIDsKK2ZsYWdzIGludGVsLWxpbnV4LmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3M+b24gOiAtdzEgOworZmxhZ3MgaW50ZWwtbGludXguY29tcGlsZSBPUFRJT05TIDx3YXJuaW5ncz5hbGwgOiAtdzIgOworCitydWxlIGNvbXBpbGUuYysrICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBnY2Muc2V0dXAtdGhyZWFkaW5nICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgICAgZ2NjLnNldHVwLWZwaWMgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBnY2Muc2V0dXAtYWRkcmVzcy1tb2RlbCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIERFUEVORFMgJCg8KSA6IFsgb24gJCg8KSByZXR1cm4gJChQQ0hfRklMRSkgXSA7Cit9CisKK2FjdGlvbnMgY29tcGlsZS5jKysgYmluZCBQQ0hfRklMRQoreworICAgICIkKENPTkZJR19DT01NQU5EKSIgLWMgLXhjKysgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAgLXVzZS1wY2giJChQQ0hfRklMRSkiIC1jIC1vICIkKDwpIiAiJCg+KSIKK30KKworcnVsZSBjb21waWxlLmMgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIGdjYy5zZXR1cC10aHJlYWRpbmcgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBnY2Muc2V0dXAtZnBpYyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIGdjYy5zZXR1cC1hZGRyZXNzLW1vZGVsICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7ICAgIAorICAgIERFUEVORFMgJCg8KSA6IFsgb24gJCg8KSByZXR1cm4gJChQQ0hfRklMRSkgXSA7Cit9CisKK2FjdGlvbnMgY29tcGlsZS5jIGJpbmQgUENIX0ZJTEUKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiIC1jIC14YyAkKE9QVElPTlMpICQoVVNFUl9PUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC11c2UtcGNoIiQoUENIX0ZJTEUpIiAtYyAtbyAiJCg8KSIgIiQoPikiCit9CisKK3J1bGUgY29tcGlsZS5jKysucGNoICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBnY2Muc2V0dXAtdGhyZWFkaW5nICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgICAgZ2NjLnNldHVwLWZwaWMgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBnY2Muc2V0dXAtYWRkcmVzcy1tb2RlbCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOyAgICAKK30KKyMKKyMgQ29tcGlsaW5nIGEgcGNoIGZpcnN0IGRlbGV0ZXMgYW55IGV4aXN0aW5nICoucGNoaSBmaWxlLCBhcyBJbnRlbCdzIGNvbXBpbGVyCisjIHdvbid0IG92ZXItd3JpdGUgYW4gZXhpc3RpbmcgcGNoOiBpbnN0ZWFkIGl0IGNyZWF0ZXMgZmlsZW5hbWUkMS5wY2hpLCBmaWxlbmFtZSQyLnBjaGkKKyMgZXRjIC0gd2hpY2ggYXBwZWFyIG5vdCB0byBkbyBhbnl0aGluZyBleGNlcHQgdGFrZSB1cCBkaXNrIHNwYWNlIDotKAorIworYWN0aW9ucyBjb21waWxlLmMrKy5wY2gKK3sKKyAgICBybSAtZiAiJCg8KSIgJiYgIiQoQ09ORklHX0NPTU1BTkQpIiAteCBjKystaGVhZGVyICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLXBjaC1jcmVhdGUgIiQoPCkiICIkKD4pIgorfQorCithY3Rpb25zIGNvbXBpbGUuZm9ydHJhbgoreworICAgICJpZm9ydCIgLWMgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtYyAtbyAiJCg8KSIgIiQoPikiCit9CisKK3J1bGUgY29tcGlsZS5jLnBjaCAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgZ2NjLnNldHVwLXRocmVhZGluZyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIGdjYy5zZXR1cC1mcGljICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgICAgZ2NjLnNldHVwLWFkZHJlc3MtbW9kZWwgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsgICAgCit9CisKK2FjdGlvbnMgY29tcGlsZS5jLnBjaAoreworICAgIHJtIC1mICIkKDwpIiAmJiAiJChDT05GSUdfQ09NTUFORCkiIC14IGMtaGVhZGVyICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLXBjaC1jcmVhdGUgIiQoPCkiICIkKD4pIgorfQorCitydWxlIGxpbmsgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIGdjYy5zZXR1cC10aHJlYWRpbmcgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBnY2Muc2V0dXAtYWRkcmVzcy1tb2RlbCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOyAgICAKKyAgICBTUEFDRSBvbiAkKHRhcmdldHMpID0gIiAiIDsKKyAgICBKQU1fU0VNQVBIT1JFIG9uICQodGFyZ2V0cykgPSA8cz5pbnRlbC1saW51eC1saW5rLXNlbWFwaG9yZSA7Cit9CisKK2FjdGlvbnMgbGluayBiaW5kIExJQlJBUklFUworeworICAgICIkKENPTkZJR19DT01NQU5EKSIgLUwiJChMSU5LUEFUSCkiIC1XbCwtUiQoU1BBQ0UpLVdsLCIkKFJQQVRIKSIgLVdsLC1ycGF0aC1saW5rJChTUEFDRSktV2wsIiQoUlBBVEhfTElOSykiIC1vICIkKDwpIiAiJCg+KSIgIiQoTElCUkFSSUVTKSIgLWwkKEZJTkRMSUJTLVNBKSAtbCQoRklORExJQlMtU1QpICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpCit9CisKK3J1bGUgbGluay5kbGwgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIGdjYy5zZXR1cC10aHJlYWRpbmcgJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOiAkKHByb3BlcnRpZXMpIDsKKyAgICBnY2Muc2V0dXAtYWRkcmVzcy1tb2RlbCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOyAgICAKKyAgICBTUEFDRSBvbiAkKHRhcmdldHMpID0gIiAiIDsKKyAgICBKQU1fU0VNQVBIT1JFIG9uICQodGFyZ2V0cykgPSA8cz5pbnRlbC1saW51eC1saW5rLXNlbWFwaG9yZSA7Cit9CisKKyMgRGlmZmVyIGZyb20gJ2xpbmsnIGFib3ZlIG9ubHkgYnkgLXNoYXJlZC4KK2FjdGlvbnMgbGluay5kbGwgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiIC1MIiQoTElOS1BBVEgpIiAtV2wsLVIkKFNQQUNFKS1XbCwiJChSUEFUSCkiIC1vICIkKDwpIiAtV2wsLXNvbmFtZSQoU1BBQ0UpLVdsLCQoPFsxXTpEPSkgLXNoYXJlZCAiJCg+KSIgICIkKExJQlJBUklFUykiIC1sJChGSU5ETElCUy1TQSkgLWwkKEZJTkRMSUJTLVNUKSAkKE9QVElPTlMpICQoVVNFUl9PUFRJT05TKQorfQorCisKKwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9pbnRlbC13aW4uamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9pbnRlbC13aW4uamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YWRhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2ludGVsLXdpbi5qYW0KQEAgLTAsMCArMSwxODQgQEAKKyMgQ29weXJpZ2h0IFZsYWRpbWlyIFBydXMgMjAwNC4KKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dAorIyBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBJbXBvcnRpbmcgY29tbW9uIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBydWxlcyB3ZSBpbmhlcml0IGhlcmUgZGVwZW5kIG9uIGl0LgorIyBUaGF0IGlzIG5hc3R5LgoraW1wb3J0IGNvbW1vbiA7CitpbXBvcnQgZXJyb3JzIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBpbnRlbCA7CitpbXBvcnQgbXN2YyA7CitpbXBvcnQgb3MgOworaW1wb3J0IHRvb2xzZXQgOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IHR5cGUgOworCitmZWF0dXJlLmV4dGVuZC1zdWJmZWF0dXJlIHRvb2xzZXQgaW50ZWwgOiBwbGF0Zm9ybSA6IHdpbiA7CisKK3Rvb2xzZXQuaW5oZXJpdC1nZW5lcmF0b3JzIGludGVsLXdpbiA8dG9vbHNldD5pbnRlbCA8dG9vbHNldC1pbnRlbDpwbGF0Zm9ybT53aW4gOiBtc3ZjIDsKK3Rvb2xzZXQuaW5oZXJpdC1mbGFncyBpbnRlbC13aW4gOiBtc3ZjIDogOiBZTE9QVElPTiA7Cit0b29sc2V0LmluaGVyaXQtcnVsZXMgaW50ZWwtd2luIDogbXN2YyA7CisKKyMgT3ZlcnJpZGUgZGVmYXVsdCBkby1ub3RoaW5nIGdlbmVyYXRvcnMuCitnZW5lcmF0b3JzLm92ZXJyaWRlIGludGVsLXdpbi5jb21waWxlLmMucGNoICAgOiBwY2guZGVmYXVsdC1jLXBjaC1nZW5lcmF0b3IgICA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIGludGVsLXdpbi5jb21waWxlLmMrKy5wY2ggOiBwY2guZGVmYXVsdC1jcHAtcGNoLWdlbmVyYXRvciA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIGludGVsLXdpbi5jb21waWxlLnJjIDogcmMuY29tcGlsZS5yZXNvdXJjZSA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIGludGVsLXdpbi5jb21waWxlLm1jIDogbWMuY29tcGlsZSA7CisKK3Rvb2xzZXQuZmxhZ3MgaW50ZWwtd2luLmNvbXBpbGUgUENIX1NPVVJDRSA8cGNoPm9uIDogPHBjaC1zb3VyY2U+IDsKKwordG9vbHNldC5hZGQtcmVxdWlyZW1lbnRzIDx0b29sc2V0PmludGVsLXdpbiw8cnVudGltZS1saW5rPnNoYXJlZDo8dGhyZWFkaW5nPm11bHRpIDsKKworIyBJbml0aWFsaXplcyB0aGUgaW50ZWwgdG9vbHNldCBmb3Igd2luZG93cworcnVsZSBpbml0ICggdmVyc2lvbiA/IDogICAgICMgdGhlIGNvbXBpbGVyIHZlcnNpb24KKyAgICAgICAgICAgIGNvbW1hbmQgKiA6ICAgICAjIHRoZSBjb21tYW5kIHRvIGludm9rZSB0aGUgY29tcGlsZXIgaXRzZWxmCisgICAgICAgICAgICBvcHRpb25zICogICAgICAgIyBBZGRpdGlvbmFsIG9wdGlvbjogPGNvbXBhdGliaWxpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlaXRoZXIgJ3ZjNicsICd2YzcnLCAndmM3LjEnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvciAnbmF0aXZlJyhkZWZhdWx0KS4KKyAgICAgICAgICApCit7CisgICAgbG9jYWwgY29tcGF0aWJpbGl0eSA9CisgICAgICBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8Y29tcGF0aWJpbGl0eT4gOiAkKG9wdGlvbnMpIF0gOworICAgIGxvY2FsIGNvbmRpdGlvbiA9IFsgIGNvbW1vbi5jaGVjay1pbml0LXBhcmFtZXRlcnMgaW50ZWwtd2luCisgICAgICAgIDogdmVyc2lvbiAkKHZlcnNpb24pIDogY29tcGF0aWJpbGl0eSAkKGNvbXBhdGliaWxpdHkpIF0gOworCisgICAgY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgaW50ZWwtd2luIDogaWNsLmV4ZSA6CisgICAgICAgICQoY29tbWFuZCkgXSA7CisKKyAgICBjb21tb24uaGFuZGxlLW9wdGlvbnMgaW50ZWwtd2luIDogJChjb25kaXRpb24pIDogJChjb21tYW5kKSA6ICQob3B0aW9ucykgOworCisgICAgbG9jYWwgcm9vdCA7CisgICAgaWYgJChjb21tYW5kKQorICAgIHsKKyAgICAgICAgcm9vdCA9IFsgY29tbW9uLmdldC1hYnNvbHV0ZS10b29sLXBhdGggJChjb21tYW5kWy0xXSkgXSA7CisgICAgICAgIHJvb3QgPSAkKHJvb3QpLyA7CisgICAgfQorCisgICAgbG9jYWwgc2V0dXAgOworICAgIHNldHVwID0gWyBHTE9CICQocm9vdCkgOiBpY2x2YXJzXyouYmF0IF0gOworICAgIGlmICEgJChzZXR1cCkKKyAgICB7CisgICAgICAgc2V0dXAgPSAkKHJvb3QpL2ljbHZhcnMuYmF0IDsKKyAgICB9CisgICAgc2V0dXAgPSAiY2FsbCBcIiIkKHNldHVwKSJcIiA+IG51bCAiIDsKKworICAgIGlmIFsgb3MubmFtZSBdID0gTlQKKyAgICB7CisgICAgICAgIHNldHVwID0gJChzZXR1cCkiCisiIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2V0dXAgPSAiY21kIC9TIC9DICIkKHNldHVwKSIgXCImJlwiICIgOworICAgIH0KKworICAgIHRvb2xzZXQuZmxhZ3MgaW50ZWwtd2luLmNvbXBpbGUgLkNDICQoY29uZGl0aW9uKSA6ICQoc2V0dXApaWNsIDsKKyAgICB0b29sc2V0LmZsYWdzIGludGVsLXdpbi5saW5rIC5MRCAkKGNvbmRpdGlvbikgOiAkKHNldHVwKXhpbGluayA7CisgICAgdG9vbHNldC5mbGFncyBpbnRlbC13aW4uYXJjaGl2ZSAuTEQgJChjb25kaXRpb24pIDogJChzZXR1cCl4aWxpbmsgL2xpYiA7CisgICAgdG9vbHNldC5mbGFncyBpbnRlbC13aW4ubGluayAuTVQgJChjb25kaXRpb24pIDogJChzZXR1cCltdCAtbm9sb2dvIDsKKyAgICB0b29sc2V0LmZsYWdzIGludGVsLXdpbi5jb21waWxlIC5NQyAkKGNvbmRpdGlvbikgOiAkKHNldHVwKW1jIDsKKyAgICB0b29sc2V0LmZsYWdzIGludGVsLXdpbi5jb21waWxlIC5SQyAkKGNvbmRpdGlvbikgOiAkKHNldHVwKXJjIDsKKworICAgIGxvY2FsIG0gPSBbIE1BVENIICguKS4qIDogJCh2ZXJzaW9uKSBdIDsKKyAgICBsb2NhbCBtYWpvciA9ICQobVsxXSkgOworCisgICAgbG9jYWwgQysrRkxBR1MgOworCisgICAgQysrRkxBR1MgKz0gL25vbG9nbyA7CisKKyAgICAjIFJlZHVjZSB0aGUgbnVtYmVyIG9mIHNwdXJpb3VzIGVycm9yIG1lc3NhZ2VzCisgICAgQysrRkxBR1MgKz0gL1F3bjUgL1F3ZDk4NSA7CisKKyAgICAjIEVuYWJsZSBBREwKKyAgICBDKytGTEFHUyArPSAtUW9wdGlvbixjLC0tYXJnX2RlcF9sb29rdXAgOyAjImMiIHdvcmtzIGZvciBDKyssIHRvbworCisgICAgIyBEaXNhYmxlIE1pY3Jvc29mdCAic2VjdXJlIiBvdmVybG9hZHMgaW4gRGlua3Vtd2FyZSBsaWJyYXJpZXMgc2luY2UgdGhleQorICAgICMgY2F1c2UgY29tcGlsZSBlcnJvcnMgd2l0aCBJbnRlbCB2ZXJzaW9ucyA5IGFuZCAxMC4KKyAgICBDKytGTEFHUyArPSAtRF9TRUNVUkVfU0NMPTAgOworCisgICAgaWYgJChtYWpvcikgPiA1CisgICAgeworICAgICAgICBDKytGTEFHUyArPSAvWmM6Zm9yU2NvcGUgOyAgIyBBZGQgc3VwcG9ydCBmb3IgY29ycmVjdCBmb3IgbG9vcCBzY29waW5nLgorICAgIH0KKworICAgICMgQWRkIG9wdGlvbnMgcmVjb2duaXplZCBvbmx5IGJ5IGludGVsNyBhbmQgYWJvdmUuCisgICAgaWYgJChtYWpvcikgPj0gNworICAgIHsKKyAgICAgICAgQysrRkxBR1MgKz0gL1FhbnNpX2FsaWFzIDsKKyAgICB9CisKKyAgICBpZiAkKGNvbXBhdGliaWxpdHkpID0gdmM2CisgICAgeworICAgICAgICBDKytGTEFHUyArPQorICAgICAgICAgICMgRW11bGF0ZSBWQzYKKyAgICAgICAgICAvUXZjNgorCisgICAgICAgICAgIyBObyB3Y2hhcl90IHN1cHBvcnQgaW4gdmM2IGRpbmt1bSBsaWJyYXJ5LiAgRnVydGhlcm1vcmUsIGluIHZjNgorICAgICAgICAgICMgY29tcGF0aWJpbGl0eS1tb2RlLCB3Y2hhcl90IGlzIG5vdCBhIGRpc3RpbmN0IHR5cGUgZnJvbSB1bnNpZ25lZAorICAgICAgICAgICMgc2hvcnQuCisgICAgICAgICAgLURCT09TVF9OT19JTlRSSU5TSUNfV0NIQVJfVAorICAgICAgICAgIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgJChtYWpvcikgPiA1CisgICAgICAgIHsKKyAgICAgICAgICAgICMgQWRkIHN1cHBvcnQgZm9yIHdjaGFyX3QKKyAgICAgICAgICAgIEMrK0ZMQUdTICs9IC9aYzp3Y2hhcl90CisgICAgICAgICAgICAgICMgVGVsbCB0aGUgZGlua3Vtd2FyZSBsaWJyYXJ5IGFib3V0IGl0LgorICAgICAgICAgICAgICAtRF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVECisgICAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICQoY29tcGF0aWJpbGl0eSkgJiYgJChjb21wYXRpYmlsaXR5KSAhPSBuYXRpdmUKKyAgICB7CisgICAgICAgIEMrK0ZMQUdTICs9IC9RJChiYXNlLXZjKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEMrK0ZMQUdTICs9CisgICAgICAgICAgLVFvcHRpb24sY3BwLC0tYXJnX2RlcF9sb29rdXAKKyAgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3ZXJlIGludGVuZGVkIHRvIGRpc2FibGUgdGhlIEludGVsIGNvbXBpbGVyJ3MKKyAgICAgICAgICAjICdidWctZW11bGF0aW9uJyBtb2RlLCBidXQgd2VyZSBsYXRlciByZXBvcnRlZCB0byBiZSBjYXVzaW5nIElDRSB3aXRoCisgICAgICAgICAgIyBJbnRlbC1XaW4gOS4wLiBJdCBpcyBub3QgeWV0IGNsZWFyIHdoaWNoIG9wdGlvbnMgY2FuIGJlIHNhZmVseSB1c2VkLgorICAgICAgICAgICMgLVFvcHRpb24sY3BwLC0tY29uc3Rfc3RyaW5nX2xpdGVyYWxzCisgICAgICAgICAgIyAtUW9wdGlvbixjcHAsLS1uZXdfZm9yX2luaXQKKyAgICAgICAgICAjIC1Rb3B0aW9uLGNwcCwtLW5vX2ltcGxpY2l0X3R5cGVuYW1lCisgICAgICAgICAgIyAtUW9wdGlvbixjcHAsLS1ub19mcmllbmRfaW5qZWN0aW9uCisgICAgICAgICAgIyAtUW9wdGlvbixjcHAsLS1ub19taWNyb3NvZnRfYnVncworICAgICAgICAgIDsKKyAgICB9CisKKyAgICB0b29sc2V0LmZsYWdzIGludGVsLXdpbiBDRkxBR1MgJChjb25kaXRpb24pIDogJChDKytGTEFHUykgOworICAgICMgQnkgZGVmYXVsdCwgd2hlbiBjcmVhdGluZyBQQ0gsIGludGVsIGFkZHMgJ2knIHRvIHRoZSBleHBsaWNpdGx5CisgICAgIyBzcGVjaWZpZWQgbmFtZSBvZiB0aGUgUENIIGZpbGUuIE9mIGNvdXJzZSwgQm9vc3QuQnVpbGQgaXMgbm90CisgICAgIyBoYXBweSB3aGVuIGNvbXBpbGVyIHByb2R1Y2VzIG5vdCB0aGUgZmlsZSBpdCB3YXMgYXNrZWQgZm9yLgorICAgICMgVGhlIG9wdGlvbiBiZWxvdyBzdG9wcyB0aGlzIGJlaGF2aW91ci4KKyAgICB0b29sc2V0LmZsYWdzIGludGVsLXdpbiBDRkxBR1MgOiAtUXBjaGktIDsKKworICAgIGlmICEgJChjb21wYXRpYmlsaXR5KQorICAgIHsKKyAgICAgICAgIyBJZiB0aGVyZSdzIG5vIGJhY2tlbmQgdmVyc2lvbiwgYXNzdW1lIDEwLgorICAgICAgICBjb21wYXRpYmlsaXR5ID0gdmMxMCA7CisgICAgfQorCisgICAgbG9jYWwgZXh0cmFjdC12ZXJzaW9uID0gWyBNQVRDSCBedmMoLiopIDogJChjb21wYXRpYmlsaXR5KSBdIDsKKyAgICBpZiAhICQoZXh0cmFjdC12ZXJzaW9uKQorICAgIHsKKyAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgIkludmFsaWQgdmFsdWUgZm9yIGNvbXBhdGliaWxpdHkgb3B0aW9uOiIKKyAgICAgICAgICAgICQoY29tcGF0aWJpbGl0eSkgOworICAgIH0KKworICAgICMgRGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5ncywgcnVubmluZyBvZiB0ZXN0cyByZXF1aXJlIHNvbWUgcnVudGltZSBETExzLgorICAgIHRvb2xzZXQuZmxhZ3MgaW50ZWwtd2luIFJVTl9QQVRIICQoY29uZGl0aW9uKSA6ICQocm9vdCkgOworCisgICAgbXN2Yy5jb25maWd1cmUtdmVyc2lvbi1zcGVjaWZpYyBpbnRlbC13aW4gOiAkKGV4dHJhY3QtdmVyc2lvblsxXSkgOiAkKGNvbmRpdGlvbikgOworfQorCit0b29sc2V0LmZsYWdzIGludGVsLXdpbi5saW5rIExJQlJBUllfT1BUSU9OIDx0b29sc2V0PmludGVsIDogIiIgOworCit0b29sc2V0LmZsYWdzIGludGVsLXdpbiBZTE9QVElPTiA7CisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvaW50ZWwuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9pbnRlbC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwMzhhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvaW50ZWwuamFtCkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJpZ2h0IFZsYWRpbWlyIFBydXMgMjAwNC4KKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dAorIyBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBUaGlzIGlzIGEgZ2VuZXJpYyAnaW50ZWwnIHRvb2xzZXQuIERlcGVuZGluZyBvbiB0aGUgY3VycmVudAorIyBzeXN0ZW0sIGl0IGZvcndhcmRzIGVpdGhlciB0byAnaW50ZWwtbGludXgnIG9yICdpbnRlbC13aW4nCisjIG1vZHVsZXMuCisKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBvcyA7CitpbXBvcnQgdG9vbHNldCA7CisKK2ZlYXR1cmUuZXh0ZW5kIHRvb2xzZXQgOiBpbnRlbCA7CitmZWF0dXJlLnN1YmZlYXR1cmUgdG9vbHNldCBpbnRlbCA6IHBsYXRmb3JtIDogOiBwcm9wYWdhdGVkIGxpbmstaW5jb21wYXRpYmxlIDsKKworcnVsZSBpbml0ICggKiA6ICogKQoreworICAgIGlmIFsgb3MubmFtZSBdID0gTElOVVgKKyAgICB7CisgICAgICAgIHRvb2xzZXQudXNpbmcgaW50ZWwtbGludXggOiAKKyAgICAgICAgICAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOworICAgIH0KKyAgICBlbHNlIGlmIFsgb3MubmFtZSBdID0gTUFDT1NYCisgICAgeworICAgICAgICB0b29sc2V0LnVzaW5nIGludGVsLWRhcndpbiA6IAorICAgICAgICAgICQoMSkgOiAkKDIpIDogJCgzKSA6ICQoNCkgOiAkKDUpIDogJCg2KSA6ICQoNykgOiAkKDgpIDogJCg5KSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRvb2xzZXQudXNpbmcgaW50ZWwtd2luIDoKKyAgICAgICAgICAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOworICAgIH0gICAgICAgIAorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9qcGVnLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvanBlZy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4YWI2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvanBlZy5qYW0KQEAgLTAsMCArMSwyMzMgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEwIFZsYWRpbWlyIFBydXMuCisjIENvcHlyaWdodCAoYykgMjAxMyBTdGV2ZW4gV2F0YW5hYmUKKyMKKyMgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorIyBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgU3VwcG9ydHMgdGhlIGxpYmpwZWcgbGlicmFyeQorIworIyBBZnRlciAndXNpbmcgbGlianBlZycsIHRoZSBmb2xsb3dpbmcgdGFyZ2V0cyBhcmUgYXZhaWxhYmxlOgorIworIyAvbGlianBlZy8vbGlianBlZyAtLSBUaGUgbGlianBlZyBsaWJyYXJ5CisKK2ltcG9ydCBwcm9qZWN0IDsKK2ltcG9ydCBhYyA7CitpbXBvcnQgZXJyb3JzIDsKK2ltcG9ydCAiY2xhc3MiIDogbmV3IDsKK2ltcG9ydCB0YXJnZXRzIDsgCitpbXBvcnQgcGF0aCA7CitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgZXJyb3JzIDsKK2ltcG9ydCBpbmRpcmVjdCA7CitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IHByb3BlcnR5LXNldCA7CisKK2hlYWRlciA9ICAgIGpjb25maWcuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBqcGVnaW50LmgganBlZ2xpYi5oCisgICAgICAgICAgICBqdmVyc2lvbi5oIDsKKworbmFtZXMgPSBsaWJqcGVnIDsKKworc291cmNlcyA9ICAgamFyaWNvbS5jIGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2FyaXRoLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMKKyAgICAgICAgamNkY3RtZ3IuYyBqY2h1ZmYuYyBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYworICAgICAgICBqY29tYXBpLmMgamNwYXJhbS5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYworICAgICAgICBqZGFwaXN0ZC5jIGpkYXJpdGguYyBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMKKyAgICAgICAgamRkY3RtZ3IuYyBqZGh1ZmYuYyBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMKKyAgICAgICAgamRtZXJnZS5jIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYworICAgICAgICBqZmRjdGZzdC5jIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMganF1YW50MS5jIDsKKworbGlicmFyeS1pZCA9IDAgOworCitpZiAtLWRlYnVnLWNvbmZpZ3VyYXRpb24gaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0KK3sKKyAgICAuZGVidWcgPSAgdHJ1ZSA7Cit9CisKKyMgSW5pdGlhbGl6ZXMgdGhlIGxpYmpwZWcgbGlicmFyeS4KKyMKKyMgbGlianBlZyBjYW4gYmUgY29uZmlndXJlZCBlaXRoZXIgdG8gdXNlIHByZS1leGlzdGluZyBiaW5hcmllcworIyBvciB0byBidWlsZCB0aGUgbGlicmFyeSBmcm9tIHNvdXJjZS4KKyMKKyMgT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSBwcmVidWlsdCBsaWJqcGVnOjoKKyMKKyMgICA8c2VhcmNoPgorIyAgICAgICBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpYmpwZWcgYmluYXJpZXMuCisjICAgPG5hbWU+CisjICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBsaWJyYXJ5IG5hbWUuCisjICAgPGluY2x1ZGU+CisjICAgICAgIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbGlianBlZyBoZWFkZXJzLgorIworIyBJZiBub25lIG9mIHRoZXNlIG9wdGlvbnMgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBlbnZpcm9ubWVudGFsCisjIHZhcmlhYmxlcyBMSUJKUEVHX0xJQlJBUllfUEFUSCwgTElCSlBFR19OQU1FLCBhbmQgTElCSlBFR19JTkNMVURFIHdpbGwKKyMgYmUgdXNlZCBpbnN0ZWFkLgorIworIyBPcHRpb25zIGZvciBidWlsZGluZyBsaWJqcGVnIGZyb20gc291cmNlOjoKKyMKKyMgICA8c291cmNlPgorIyAgICAgICBUaGUgbGlianBlZyBzb3VyY2UgZGlyZWN0b3J5LiAgRGVmYXVsdHMgdG8gdGhlIGVudmlyb25tZW50YWwgdmFyaWFibGUKKyMgICAgICAgTElCSlBFR19TT1VSQ0UuCisjICAgPHRhZz4KKyMgICAgICAgQSBydWxlIHdoaWNoIGNvbXB1dGVzIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgY29tcGlsZWQKKyMgICAgICAgbGlicmFyaWVzIGJhc2VkIG9uIHRoZSBidWlsZCBwcm9wZXJ0aWVzLiAgSWdub3JlZAorIyAgICAgICB3aGVuIHVzaW5nIHByZWNvbXBpbGVkIGJpbmFyaWVzLgorIyAgIDxidWlsZC1uYW1lPgorIyAgICAgICBUaGUgYmFzZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGNvbXBpbGVkIGxpYnJhcnkuICBJZ25vcmVkCisjICAgICAgIHdoZW4gdXNpbmcgcHJlY29tcGlsZWQgYmluYXJpZXMuCisjCisjIEV4YW1wbGVzOjoKKyMKKyMgICAjIEZpbmQgbGlianBlZyBpbiB0aGUgZGVmYXVsdCBzeXN0ZW0gbG9jYXRpb24KKyMgICB1c2luZyBsaWJqcGVnIDsKKyMgICAjIEJ1aWxkIGxpYmpwZWcgZnJvbSBzb3VyY2UKKyMgICB1c2luZyBsaWJqcGVnIDogOGMgOiA8c291cmNlPi9ob21lL3N0ZXZlbi9saWJqcGVnLThjIDsKKyMgICAjIEZpbmQgbGlianBlZyBpbiAvdXNyL2xvY2FsCisjICAgdXNpbmcgbGlianBlZyA6IDhjCisjICAgICA6IDxpbmNsdWRlPi91c3IvbG9jYWwvaW5jbHVkZSA8c2VhcmNoPi91c3IvbG9jYWwvbGliIDsKKyMgICAjIEJ1aWxkIGxpYmpwZWcgZnJvbSBzb3VyY2UgZm9yIG1zdmMgYW5kIGZpbmQKKyMgICAjIHByZWJ1aWx0IGJpbmFyaWVzIGZvciBnY2MuCisjICAgdXNpbmcgbGlianBlZyA6IDhjIDogPHNvdXJjZT5DOi9EZXZlbC9zcmMvbGlianBlZy04YyA6IDx0b29sc2V0Pm1zdmMgOworIyAgIHVzaW5nIGxpYmpwZWcgOiA4YyA6IDogPHRvb2xzZXQ+Z2NjIDsKKyMKK3J1bGUgaW5pdCAoCisgICAgdmVyc2lvbiA/CisgICAgIyBUaGUgbGlianBlZyB2ZXJzaW9uIChjdXJyZW50bHkgaWdub3JlZCkKKworICAgIDogb3B0aW9ucyAqCisgICAgIyBBIGxpc3Qgb2YgdGhlIG9wdGlvbnMgdG8gdXNlCisKKyAgICA6IHJlcXVpcmVtZW50cyAqCisgICAgIyBUaGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgbGlianBlZyB0YXJnZXQKKworICAgIDogaXMtZGVmYXVsdCA/CisgICAgIyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25zIGFyZSBvbmx5IHVzZWQgd2hlbiBsaWJqcGVnCisgICAgIyBoYXMgbm90IHlldCBiZWVuIGNvbmZpZ3VyZWQuCisgICAgKQoreworICAgIGxvY2FsIGNhbGxlciA9IFsgcHJvamVjdC5jdXJyZW50IF0gOworCisgICAgaWYgISAkKC5pbml0aWFsaXplZCkKKyAgICB7CisgICAgICAgIC5pbml0aWFsaXplZCA9IHRydWUgOworCisgICAgICAgIHByb2plY3QuaW5pdGlhbGl6ZSAkKF9fbmFtZV9fKSA7CisgICAgICAgIC5wcm9qZWN0ID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7CisgICAgICAgIHByb2plY3QgbGlianBlZyA7CisgICAgfQorCisgICAgbG9jYWwgbGlicmFyeS1wYXRoID0gWyBwcm9wZXJ0eS5zZWxlY3QgPHNlYXJjaD4gOiAkKG9wdGlvbnMpIF0gOworICAgIGxpYnJhcnktcGF0aCA9ICQobGlicmFyeS1wYXRoOkc9KSA7CisgICAgbG9jYWwgaW5jbHVkZS1wYXRoID0gWyBwcm9wZXJ0eS5zZWxlY3QgPGluY2x1ZGU+IDogJChvcHRpb25zKSBdIDsKKyAgICBpbmNsdWRlLXBhdGggPSAkKGluY2x1ZGUtcGF0aDpHPSkgOworICAgIGxvY2FsIHNvdXJjZS1wYXRoID0gWyBwcm9wZXJ0eS5zZWxlY3QgPHNvdXJjZT4gOiAkKG9wdGlvbnMpIF0gOworICAgIHNvdXJjZS1wYXRoID0gJChzb3VyY2UtcGF0aDpHPSkgOworICAgIGxvY2FsIGxpYnJhcnktbmFtZSA9IFsgcHJvcGVydHkuc2VsZWN0IDxuYW1lPiA6ICQob3B0aW9ucykgXSA7CisgICAgbGlicmFyeS1uYW1lID0gJChsaWJyYXJ5LW5hbWU6Rz0pIDsKKyAgICBsb2NhbCB0YWcgPSBbIHByb3BlcnR5LnNlbGVjdCA8dGFnPiA6ICQob3B0aW9ucykgXSA7CisgICAgdGFnID0gJCh0YWc6Rz0pIDsKKyAgICBsb2NhbCBidWlsZC1uYW1lID0gWyBwcm9wZXJ0eS5zZWxlY3QgPGJ1aWxkLW5hbWU+IDogJChvcHRpb25zKSBdIDsKKyAgICBidWlsZC1uYW1lID0gJChidWlsZC1uYW1lOkc9KSA7CisKKyAgICBjb25kaXRpb24gPSBbIHByb3BlcnR5LXNldC5jcmVhdGUgJChyZXF1aXJlbWVudHMpIF0gOworICAgIGNvbmRpdGlvbiA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZSBbICQoY29uZGl0aW9uKS5iYXNlIF0gXSA7CisKKyAgICBsb2NhbCBuby1idWlsZC1mcm9tLXNvdXJjZSA7CisgICAgIyBJZ25vcmUgZW52aXJvbm1lbnRhbCBaTElCX1NPVVJDRSBpZiB0aGlzIGluaXRpYWxpemF0aW9uCisgICAgIyByZXF1ZXN0ZWQgdG8gc2VhcmNoIGZvciBhIHNwZWNpZmljIHByZS1idWlsdCBsaWJyYXJ5LgorICAgIGlmICQobGlicmFyeS1wYXRoKSB8fCAkKGluY2x1ZGUtcGF0aCkgfHwgJChsaWJyYXJ5LW5hbWUpCisgICAgeworICAgICAgICBpZiAkKHNvdXJjZS1wYXRoKSB8fCAkKHRhZykgfHwgJChidWlsZC1uYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcnMudXNlci1lcnJvciAiaW5jb21wYXRpYmxlIG9wdGlvbnMgZm9yIGxpYmpwZWc6IgorICAgICAgICAgICAgICAgIFsgcHJvcGVydHkuc2VsZWN0IDxzZWFyY2g+IDxpbmNsdWRlPiA8bmFtZT4gOiAkKG9wdGlvbnMpIF0gImFuZCIKKyAgICAgICAgICAgICAgICBbIHByb3BlcnR5LnNlbGVjdCA8c291cmNlPiA8dGFnPiA8YnVpbGQtbmFtZT4gOiAkKG9wdGlvbnMpIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm8tYnVpbGQtZnJvbS1zb3VyY2UgPSB0cnVlIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNvdXJjZS1wYXRoID89IFsgbW9kdWxlcy5wZWVrIDogWkxJQl9TT1VSQ0UgXSA7CisKKyAgICBpZiAkKC5jb25maWd1cmVkLiQoY29uZGl0aW9uKSkKKyAgICB7CisgICAgICAgIGlmICQoaXMtZGVmYXVsdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJCguZGVidWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAibm90aWNlOiBbbGlianBlZ10gbGlianBlZyBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQiIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9ycy51c2VyLWVycm9yICJsaWJqcGVnIGlzIGFscmVhZHkgY29uZmlndXJlZCIgOworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIGVsc2UgaWYgJChzb3VyY2UtcGF0aCkgJiYgISAkKG5vLWJ1aWxkLWZyb20tc291cmNlKQorICAgIHsKKyAgICAgICAgYnVpbGQtbmFtZSA/PSB6IDsKKyAgICAgICAgbGlicmFyeS1pZCA9IFsgQ0FMQyAkKGxpYnJhcnktaWQpICsgMSBdIDsKKyAgICAgICAgdGFnID0gWyBNQVRDSCBeQD8oLiopJCA6ICQodGFnKSBdIDsKKyAgICAgICAgaWYgJCh0YWcpICYmICEgWyBNQVRDSCBeKFteJV0qKSUoW14lXSspJCA6ICQodGFnKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHRhZyA9IFsgaW5kaXJlY3QubWFrZSAkKHRhZykgOiBbICQoY2FsbGVyKS5wcm9qZWN0LW1vZHVsZSBdIF0gOworICAgICAgICB9CisgICAgICAgIHNvdXJjZXMgPSBbIHBhdGguZ2xvYiAkKHNvdXJjZS1wYXRoKSA6ICQoc291cmNlcykgXSA7CisgICAgICAgIGlmICQoLmRlYnVnKQorICAgICAgICB7CisgICAgICAgICAgICBFQ0hPICJub3RpY2U6IFtsaWJqcGVnXSBCdWlsZGluZyBsaWJqcGVnIGZyb20gc291cmNlIGFzICQoYnVpbGQtbmFtZSkiIDsKKyAgICAgICAgICAgIGlmICQoY29uZGl0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIm5vdGljZTogW2xpYmpwZWddIENvbmRpdGlvbiIgWyAkKGNvbmRpdGlvbikucmF3IF0gOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgJChzb3VyY2VzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIm5vdGljZTogW2xpYmpwZWddIGZvdW5kIGxpYmpwZWcgc291cmNlIGluICQoc291cmNlLXBhdGgpIiA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAid2FybmluZzogW2xpYmpwZWddIGNvdWxkIG5vdCBmaW5kIGxpYmpwZWcgc291cmNlIGluICQoc291cmNlLXBhdGgpIiA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9jYWwgdGFyZ2V0IDsKKyAgICAgICAgaWYgJChzb3VyY2VzKSB7CisgICAgICAgICAgICB0YXJnZXQgPSBbIHRhcmdldHMuY3JlYXRlLXR5cGVkLXRhcmdldCBMSUIgOiAkKC5wcm9qZWN0KQorICAgICAgICAgICAgICA6ICQoYnVpbGQtbmFtZSkuJChsaWJyYXJ5LWlkKQorICAgICAgICAgICAgICA6ICQoc291cmNlcykKKyAgICAgICAgICAgICAgOiAkKHJlcXVpcmVtZW50cykKKyAgICAgICAgICAgICAgICA8dGFnPkAkKHRhZykKKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4kKHNvdXJjZS1wYXRoKQorICAgICAgICAgICAgICAgIDx0b29sc2V0Pm1zdmM6PGRlZmluZT5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyAgICAgICAgICAgICAgICA8dG9vbHNldD5tc3ZjOjxkZWZpbmU+X1NDTF9TRUNVUkVfTk9fREVQUkVDQVRFCisgICAgICAgICAgICAgICAgPGxpbms+c2hhcmVkOjxkZWZpbmU+WkxJQl9ETEwKKyAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICA6IDxpbmNsdWRlPiQoc291cmNlLXBhdGgpIF0gOworICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgbXQgPSBbIG5ldyBhYy1saWJyYXJ5IGxpYmpwZWcgOiAkKC5wcm9qZWN0KSA6ICQoY29uZGl0aW9uKSBdIDsKKyAgICAgICAgJChtdCkuc2V0LWhlYWRlciAkKGhlYWRlcikgOworICAgICAgICAkKG10KS5zZXQtZGVmYXVsdC1uYW1lcyAkKG5hbWVzKSA7CisgICAgICAgIGlmICQodGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICAkKG10KS5zZXQtdGFyZ2V0ICQodGFyZ2V0KSA7CisgICAgICAgIH0KKyAgICAgICAgdGFyZ2V0cy5tYWluLXRhcmdldC1hbHRlcm5hdGl2ZSAkKG10KSA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgJCguZGVidWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gIm5vdGljZTogW2xpYmpwZWddIFVzaW5nIHByZS1pbnN0YWxsZWQgbGlicmFyeSIgOworICAgICAgICAgICAgaWYgJChjb25kaXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAibm90aWNlOiBbbGlianBlZ10gQ29uZGl0aW9uIiBbICQoY29uZGl0aW9uKS5yYXcgXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb2NhbCBtdCA9IFsgbmV3IGFjLWxpYnJhcnkgbGlianBlZyA6ICQoLnByb2plY3QpIDogJChjb25kaXRpb24pIDoKKyAgICAgICAgICAgICQoaW5jbHVkZS1wYXRoKSA6ICQobGlicmFyeS1wYXRoKSA6ICQobGlicmFyeS1uYW1lKSA6ICQocm9vdCkgXSA7CisgICAgICAgICQobXQpLnNldC1oZWFkZXIgJChoZWFkZXIpIDsKKyAgICAgICAgJChtdCkuc2V0LWRlZmF1bHQtbmFtZXMgJChuYW1lcykgOworICAgICAgICB0YXJnZXRzLm1haW4tdGFyZ2V0LWFsdGVybmF0aXZlICQobXQpIDsKKyAgICB9CisgICAgLmNvbmZpZ3VyZWQuJChjb25kaXRpb24pID0gdHJ1ZSA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2xleC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL2xleC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkNjQxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvbGV4LmphbQpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAyMDAzIFZsYWRpbWlyIFBydXMgCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkgCisKK2ltcG9ydCB0eXBlIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBwcm9wZXJ0eSA7CisKKworZmVhdHVyZS5mZWF0dXJlIGZsZXgucHJlZml4IDogOiBmcmVlIDsKK3R5cGUucmVnaXN0ZXIgTEVYIDogbCA7Cit0eXBlLnJlZ2lzdGVyIExFWCsrIDogbGwgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCBsZXgubGV4IDogTEVYIDogQyA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIGxleC5sZXggOiBMRVgrKyA6IENQUCA7CisKK3J1bGUgaW5pdCAoICkKK3sKK30KKworcnVsZSBsZXggKCB0YXJnZXQgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICogKQoreyAgIAorICAgIGxvY2FsIHIgPSBbIHByb3BlcnR5LnNlbGVjdCBmbGV4LnByZWZpeCA6ICQocHJvcGVydGllcykgXSA7CisgICAgaWYgJChyKQorICAgIHsKKyAgICAgICAgUFJFRklYIG9uICQoPCkgPSAkKHI6Rz0pIDsKKyAgICB9Cit9CisKK2FjdGlvbnMgbGV4IAoreworICAgIGZsZXggLVAkKFBSRUZJWCkgLW8kKDwpICQoPikgICAgCit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL21ha2UuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9tYWtlLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGI1OWZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9tYWtlLmphbQpAQCAtMCwwICsxLDYzIEBACisjIENvcHlyaWdodCAyMDAzIERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDMgRG91Z2xhcyBHcmVnb3IKKyMgQ29weXJpZ2h0IDIwMDYgUmVuZSBSaXZlcmEKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlICdtYWtlJyBtYWluIHRhcmdldCBydWxlLgorCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgcHJvcGVydHktc2V0IDsKK2ltcG9ydCB0YXJnZXRzIDsKKworCitjbGFzcyBtYWtlLXRhcmdldC1jbGFzcyA6IGJhc2ljLXRhcmdldAoreworICAgIGltcG9ydCAiY2xhc3MiIDogbmV3IDsKKyAgICBpbXBvcnQgdHlwZSA7CisgICAgaW1wb3J0IHZpcnR1YWwtdGFyZ2V0IDsKKworICAgIHJ1bGUgX19pbml0X18gKCBuYW1lIDogcHJvamVjdCA6IHNvdXJjZXMgKiA6IHJlcXVpcmVtZW50cyAqCisgICAgICAgIDogZGVmYXVsdC1idWlsZCAqIDogdXNhZ2UtcmVxdWlyZW1lbnRzICogKQorICAgIHsKKyAgICAgICAgYmFzaWMtdGFyZ2V0Ll9faW5pdF9fICQobmFtZSkgOiAkKHByb2plY3QpIDogJChzb3VyY2VzKSA6CisgICAgICAgICAgICAkKHJlcXVpcmVtZW50cykgOiAkKGRlZmF1bHQtYnVpbGQpIDogJCh1c2FnZS1yZXF1aXJlbWVudHMpIDsKKyAgICB9CisKKyAgICBydWxlIGNvbnN0cnVjdCAoIG5hbWUgOiBzb3VyY2UtdGFyZ2V0cyAqIDogcHJvcGVydHktc2V0ICkKKyAgICB7CisgICAgICAgIGxvY2FsIGFjdGlvbi1uYW1lID0gWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxhY3Rpb24+IF0gOworICAgICAgICAjICdtJyB3aWxsIGFsd2F5cyBiZSBzZXQgLS0gd2UgYWRkICdAJyBvdXJzZWx2ZXMgaW4gdGhlICdtYWtlJyBydWxlCisgICAgICAgICMgYmVsb3cuCisgICAgICAgIGxvY2FsIG0gPSBbIE1BVENIIF5AKC4qKSA6ICQoYWN0aW9uLW5hbWUpIF0gOworCisgICAgICAgIGxvY2FsIGEgPSBbIG5ldyBhY3Rpb24gJChzb3VyY2UtdGFyZ2V0cykgOiAkKG1bMV0pIDogJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICBsb2NhbCB0ID0gWyBuZXcgZmlsZS10YXJnZXQgJChzZWxmLm5hbWUpIGV4YWN0IDogWyB0eXBlLnR5cGUKKyAgICAgICAgICAgICQoc2VsZi5uYW1lKSBdIDogJChzZWxmLnByb2plY3QpIDogJChhKSBdIDsKKyAgICAgICAgcmV0dXJuIFsgcHJvcGVydHktc2V0LmVtcHR5IF0gWyB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciAkKHQpIF0gOworICAgIH0KK30KKworCisjIERlY2xhcmVzIHRoZSAnbWFrZScgbWFpbiB0YXJnZXQuCisjCitydWxlIG1ha2UgKCB0YXJnZXQtbmFtZSA6IHNvdXJjZXMgKiA6IGdlbmVyYXRpbmctcnVsZSArIDogcmVxdWlyZW1lbnRzICogOgorICAgIHVzYWdlLXJlcXVpcmVtZW50cyAqICkKK3sKKyAgICAjIFRoZSAnQCcgc2lnbiBjYXVzZXMgdGhlIGZlYXR1cmUuamFtIG1vZHVsZSB0byBxdWFsaWZ5IHJ1bGUgbmFtZSB3aXRoIHRoZQorICAgICMgbW9kdWxlIG5hbWUgb2YgY3VycmVudCBwcm9qZWN0LCBpZiBuZWVkZWQuCisgICAgbG9jYWwgbSA9IFsgTUFUQ0ggXihAKS4qIDogJChnZW5lcmF0aW5nLXJ1bGUpIF0gOworICAgIGlmICEgJChtKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGluZy1ydWxlID0gQCQoZ2VuZXJhdGluZy1ydWxlKSA7CisgICAgfQorICAgIHRhcmdldHMuY3JlYXRlLW1ldGF0YXJnZXQgbWFrZS10YXJnZXQtY2xhc3MgOiBbIHByb2plY3QuY3VycmVudCBdIDoKKyAgICAgICAgJCh0YXJnZXQtbmFtZSkgOiAkKHNvdXJjZXMpIDogJChyZXF1aXJlbWVudHMpIDxhY3Rpb24+JChnZW5lcmF0aW5nLXJ1bGUpCisgICAgICAgIDogOiAkKHVzYWdlLXJlcXVpcmVtZW50cykgOworfQorCisKK0lNUE9SVCAkKF9fbmFtZV9fKSA6IG1ha2UgOiA6IG1ha2UgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9tYy5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL21jLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzgzNzc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9tYy5qYW0KQEAgLTAsMCArMSw0NCBAQAorI34gQ29weXJpZ2h0IDIwMDUgQWxleGV5IFBha2h1bm92LgorI34gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorI34gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjICBTdXBwb3J0IGZvciBNaWNyb3NvZnQgbWVzc2FnZSBjb21waWxlciB0b29sLgorIyAgTm90ZXM6CisjICAtIHRoZXJlJ3MganVzdCBtZXNzYWdlIGNvbXBpbGVyIHRvb2wsIHRoZXJlJ3Mgbm8gdG9vbCBmb3IgCisjICAgIGV4dHJhY3RpbmcgbWVzc2FnZSBzdHJpbmdzIGZyb20gc291cmNlcworIyAgLSBUaGlzIGZpbGUgYWxsb3dzIHRvIHVzZSBNaWNyb3NvZnQgbWVzc2FnZSBjb21waWxlcgorIyAgICB3aXRoIGFueSB0b29sc2V0LiBJbiBtc3ZjLmphbSwgdGhlcmUncyBtb3JlIHNwZWNpZmljCisjICAgIG1lc3NhZ2UgY29tcGlsaW5nIGFjdGlvbi4KKworaW1wb3J0IGNvbW1vbiA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgZmVhdHVyZSA6IGZlYXR1cmUgZ2V0LXZhbHVlcyA7CitpbXBvcnQgdG9vbHNldCA6IGZsYWdzIDsKK2ltcG9ydCB0eXBlIDsKK2ltcG9ydCByYyA7CisKK3J1bGUgaW5pdCAoICkKK3sKK30KKwordHlwZS5yZWdpc3RlciBNQyA6IG1jIDsKKworCisjIENvbW1hbmQgbGluZSBvcHRpb25zCitmZWF0dXJlIG1jLWlucHV0LWVuY29kaW5nIDogYW5zaSB1bmljb2RlIDogZnJlZSA7CitmZWF0dXJlIG1jLW91dHB1dC1lbmNvZGluZyA6IHVuaWNvZGUgYW5zaSA6IGZyZWUgOworZmVhdHVyZSBtYy1zZXQtY3VzdG9tZXItYml0IDogbm8geWVzIDogZnJlZSA7CisKK2ZsYWdzIG1jLmNvbXBpbGUgTUNGTEFHUyA8bWMtaW5wdXQtZW5jb2Rpbmc+YW5zaSA6IC1hIDsKK2ZsYWdzIG1jLmNvbXBpbGUgTUNGTEFHUyA8bWMtaW5wdXQtZW5jb2Rpbmc+dW5pY29kZSA6IC11IDsKK2ZsYWdzIG1jLmNvbXBpbGUgTUNGTEFHUyA8bWMtb3V0cHV0LWVuY29kaW5nPmFuc2kgOiAtQSA7CitmbGFncyBtYy5jb21waWxlIE1DRkxBR1MgPG1jLW91dHB1dC1lbmNvZGluZz51bmljb2RlIDogLVUgOworZmxhZ3MgbWMuY29tcGlsZSBNQ0ZMQUdTIDxtYy1zZXQtY3VzdG9tZXItYml0Pm5vIDogOworZmxhZ3MgbWMuY29tcGlsZSBNQ0ZMQUdTIDxtYy1zZXQtY3VzdG9tZXItYml0PnllcyA6IC1jIDsKKworZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCBtYy5jb21waWxlIDogTUMgOiBIIFJDIDsKKworYWN0aW9ucyBjb21waWxlCit7CisgICAgbWMgJChNQ0ZMQUdTKSAtaCAiJCg8WzFdOkRXKSIgLXIgIiQoPFsyXTpEVykiICIkKD46VykiCit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL21lc3NhZ2UuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9tZXNzYWdlLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzJiNmUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9tZXNzYWdlLmphbQpAQCAtMCwwICsxLDYyIEBACisjIENvcHlyaWdodCAyMDA4IFZsYWRpbWlyIFBydXMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgRGVmaW5lcyBtYWluIHRhcmdldCB0eXBlICdtZXNzYWdlJywgdGhhdCBwcmludHMgYSBtZXNzYWdlIHdoZW4gYnVpbHQgZm9yIHRoZQorIyBmaXJzdCB0aW1lLgorCitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgdGFyZ2V0cyA7CitpbXBvcnQgcHJvcGVydHktc2V0IDsKKworY2xhc3MgbWVzc2FnZS10YXJnZXQtY2xhc3MgOiBiYXNpYy10YXJnZXQKK3sKKyAgICBydWxlIHNldC1tZXNzYWdlICggKiApCisgICAgeworICAgICAgICBzZWxmLjEgPSAkKDEpIDsKKyAgICAgICAgc2VsZi4yID0gJCgyKSA7CisgICAgICAgIHNlbGYuMyA9ICQoMykgOworICAgICAgICBzZWxmLjQgPSAkKDQpIDsKKyAgICAgICAgc2VsZi41ID0gJCg1KSA7CisgICAgICAgIHNlbGYuNiA9ICQoNikgOworICAgICAgICBzZWxmLjcgPSAkKDcpIDsKKyAgICAgICAgc2VsZi44ID0gJCg4KSA7ICAgICAgICAKKyAgICAgICAgc2VsZi45ID0gJCg5KSA7ICAgICAgCisgICAgICAgIHNlbGYuYnVpbHQgPSA7CisgICAgfQorICAgIAorICAgIHJ1bGUgY29uc3RydWN0ICggbmFtZSA6IHNvdXJjZS10YXJnZXRzICogOiBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgaWYgISAkKHNlbGYuYnVpbHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciBpIGluIDEgMiAzIDQgNSA2IDcgOCA5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgJChzZWxmLiQoaSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFQ0hPICQoc2VsZi4kKGkpKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZi5idWlsdCA9IDEgOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gWyBwcm9wZXJ0eS1zZXQuZW1wdHkgXSA7CisgICAgfQorfQorCisKK3J1bGUgbWVzc2FnZSAoIG5hbWUgOiAqICkKK3sKKyAgICBsb2NhbCBwcm9qZWN0ID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7CisKKyAgICBsb2NhbCByZXN1bHQgPSBbIHRhcmdldHMubWFpbi10YXJnZXQtYWx0ZXJuYXRpdmUKKyAgICAgICAgWyBuZXcgbWVzc2FnZS10YXJnZXQtY2xhc3MgJChuYW1lKSA6ICQocHJvamVjdCkKKyAgICAgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LXNvdXJjZXMgOiAkKG5hbWUpIF0KKyAgICAgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LXJlcXVpcmVtZW50cyA6ICQocHJvamVjdCkgXQorICAgICAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtZGVmYXVsdC1idWlsZCA6ICQocHJvamVjdCkgXQorICAgICAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtdXNhZ2UtcmVxdWlyZW1lbnRzIDogJChwcm9qZWN0KSBdCisgICAgICAgIF0gXSA7CisgICAgJChyZXN1bHQpLnNldC1tZXNzYWdlICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkgOiAkKDkpIDsKKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KK0lNUE9SVCAkKF9fbmFtZV9fKSA6IG1lc3NhZ2UgOiA6IG1lc3NhZ2UgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9taWRsLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvbWlkbC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhNWRkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvbWlkbC5qYW0KQEAgLTAsMCArMSwxNDIgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEFsZXhleSBQYWtodW5vdi4KKyMKKyMgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorIyBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgTWljcm9zb2Z0IEludGVyZmFjZSBEZWZpbml0aW9uIExhbmd1YWdlIChNSURMKSByZWxhdGVkIHJvdXRpbmVzCisKK2ltcG9ydCBjb21tb24gOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IGZlYXR1cmUgOiBmZWF0dXJlIGdldC12YWx1ZXMgOworaW1wb3J0IG9zIDsKK2ltcG9ydCBzY2FubmVyIDsKK2ltcG9ydCB0b29sc2V0IDogZmxhZ3MgOworaW1wb3J0IHR5cGUgOworCitydWxlIGluaXQgKCApCit7Cit9CisKK3R5cGUucmVnaXN0ZXIgSURMIDogaWRsIDsKKworIyBBIHR5cGUgbGlicmFyeSAoLnRsYikgaXMgZ2VuZXJhdGVkIGJ5IE1JREwgY29tcGlsZXIgYW5kIGNhbiBiZSBpbmNsdWRlZAorIyB0byByZXNvdXJjZXMgb2YgYW4gYXBwbGljYXRpb24gKC5yYykuIEluIG9yZGVyIHRvIGJlIGZvdW5kIGJ5IGEgcmVzb3VyY2UgCisjIGNvbXBpbGVyIGl0cyB0YXJnZXQgdHlwZSBzaG91bGQgYmUgZGVyaXZlZCBmcm9tICdIJyAtIG90aGVyd2lzZQorIyB0aGUgcHJvcGVydHkgJzxpbXBsaWNpdC1kZXBlbmRlbmN5Picgd2lsbCBiZSBpZ25vcmVkLgordHlwZS5yZWdpc3RlciBNU1RZUEVMSUIgOiB0bGIgOiBIIDsKKworCisjIFJlZ2lzdGVyIHNjYW5uZXIgZm9yIE1JREwgZmlsZXMKK2NsYXNzIG1pZGwtc2Nhbm5lciA6IHNjYW5uZXIgCit7CisgICAgaW1wb3J0IHBhdGggcHJvcGVydHktc2V0IHJlZ2V4IHNjYW5uZXIgdHlwZSB2aXJ0dWFsLXRhcmdldCA7CisgICAgCisgICAgcnVsZSBfX2luaXRfXyAoIGluY2x1ZGVzICogKQorICAgIHsKKyAgICAgICAgc2Nhbm5lci5fX2luaXRfXyA7CisgICAgCisgICAgICAgIHNlbGYuaW5jbHVkZXMgPSAkKGluY2x1ZGVzKSA7CisKKyAgICAgICAgIyBMaXN0IG9mIHF1b3RlZCBzdHJpbmdzIAorICAgICAgICBzZWxmLnJlLXN0cmluZ3MgPSAiWyBcdF0qXCIoW15cIl0qKVwiKFsgXHRdKixbIFx0XSpcIihbXlwiXSopXCIpKlsgXHRdKiIgOworCisgICAgICAgICMgJ2ltcG9ydCcgYW5kICdpbXBvcnRsaWInIGRpcmVjdGl2ZXMgCisgICAgICAgIHNlbGYucmUtaW1wb3J0ICAgID0gImltcG9ydCIkKHNlbGYucmUtc3RyaW5ncykiWyBcdF0qOyIgOworICAgICAgICBzZWxmLnJlLWltcG9ydGxpYiA9ICJpbXBvcnRsaWJbIFx0XSpbKF0iJChzZWxmLnJlLXN0cmluZ3MpIlspXVsgXHRdKjsiIDsKKworICAgICAgICAjIEMgcHJlcHJvY2Vzc29yICdpbmNsdWRlJyBkaXJlY3RpdmUKKyAgICAgICAgc2VsZi5yZS1pbmNsdWRlLWFuZ2xlICA9ICIjWyBcdF0qaW5jbHVkZVsgXHRdKjwoLiopPiIgOworICAgICAgICBzZWxmLnJlLWluY2x1ZGUtcXVvdGVkID0gIiNbIFx0XSppbmNsdWRlWyBcdF0qXCIoLiopXCIiIDsKKyAgICB9ICAgIAorCisgICAgcnVsZSBwYXR0ZXJuICggKQorICAgIHsKKyAgICAgICAgIyBNYXRjaCAnI2luY2x1ZGUnLCAnaW1wb3J0JyBhbmQgJ2ltcG9ydGxpYicgZGlyZWN0aXZlcworICAgICAgICByZXR1cm4gIigoI1sgXHRdKmluY2x1ZGV8aW1wb3J0KGxpYik/KS4rKDwoLiopPnxcIiguKilcIikuKykiIDsKKyAgICB9CisKKyAgICBydWxlIHByb2Nlc3MgKCB0YXJnZXQgOiBtYXRjaGVzICogOiBiaW5kaW5nICkKKyAgICB7CisgICAgICAgIGxvY2FsIGluY2x1ZGVkLWFuZ2xlICA9IFsgcmVnZXgudHJhbnNmb3JtICQobWF0Y2hlcykgOiAkKHNlbGYucmUtaW5jbHVkZS1hbmdsZSkgIDogMSBdIDsKKyAgICAgICAgbG9jYWwgaW5jbHVkZWQtcXVvdGVkID0gWyByZWdleC50cmFuc2Zvcm0gJChtYXRjaGVzKSA6ICQoc2VsZi5yZS1pbmNsdWRlLXF1b3RlZCkgOiAxIF0gOworICAgICAgICBsb2NhbCBpbXBvcnRlZCAgICAgICAgPSBbIHJlZ2V4LnRyYW5zZm9ybSAkKG1hdGNoZXMpIDogJChzZWxmLnJlLWltcG9ydCkgICAgICAgICA6IDEgMyBdIDsKKyAgICAgICAgbG9jYWwgaW1wb3J0ZWRfdGxicyAgID0gWyByZWdleC50cmFuc2Zvcm0gJChtYXRjaGVzKSA6ICQoc2VsZi5yZS1pbXBvcnRsaWIpICAgICAgOiAxIDMgXSA7CisKKyAgICAgICAgIyBDT05TSURFUjogdGhlIG5ldyBzY29waW5nIHJ1bGUgc2VlbSB0byBkZWZlYXQgIm9uIHRhcmdldCIgdmFyaWFibGVzLgorICAgICAgICBsb2NhbCBnID0gWyBvbiAkKHRhcmdldCkgcmV0dXJuICQoSERSR1JJU1QpIF0gOyAgCisgICAgICAgIGxvY2FsIGIgPSBbIE5PUk1BTElaRV9QQVRIICQoYmluZGluZzpEKSBdIDsKKworICAgICAgICAjIEF0dGFjaCBiaW5kaW5nIG9mIGluY2x1ZGluZyBmaWxlIHRvIGluY2x1ZGVkIHRhcmdldHMuCisgICAgICAgICMgV2hlbiB0YXJnZXQgaXMgZGlyZWN0bHkgY3JlYXRlZCBmcm9tIHZpcnR1YWwgdGFyZ2V0CisgICAgICAgICMgdGhpcyBleHRyYSBpbmZvcm1hdGlvbiBpcyB1bm5lY2Vzc2FyeS4gQnV0IGluIG90aGVyCisgICAgICAgICMgY2FzZXMsIGl0IGFsbG93cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHR3byBoZWFkZXJzIG9mIHRoZSAKKyAgICAgICAgIyBzYW1lIG5hbWUgaW5jbHVkZWQgZnJvbSBkaWZmZXJlbnQgcGxhY2VzLiAgICAgIAorICAgICAgICBsb2NhbCBnMiA9ICQoZykiIyIkKGIpIDsKKworICAgICAgICBpbmNsdWRlZC1hbmdsZSA9ICQoaW5jbHVkZWQtYW5nbGU6Rz0kKGcpKSA7CisgICAgICAgIGluY2x1ZGVkLXF1b3RlZCA9ICQoaW5jbHVkZWQtcXVvdGVkOkc9JChnMikpIDsKKyAgICAgICAgaW1wb3J0ZWQgPSAkKGltcG9ydGVkOkc9JChnMikpIDsKKyAgICAgICAgaW1wb3J0ZWRfdGxicyA9ICQoaW1wb3J0ZWRfdGxiczpHPSQoZzIpKSA7CisKKyAgICAgICAgbG9jYWwgYWxsID0gJChpbmNsdWRlZC1hbmdsZSkgJChpbmNsdWRlZC1xdW90ZWQpICQoaW1wb3J0ZWQpIDsKKworICAgICAgICBJTkNMVURFUyAkKHRhcmdldCkgOiAkKGFsbCkgOworICAgICAgICBERVBFTkRTICQodGFyZ2V0KSA6ICQoaW1wb3J0ZWRfdGxicykgOworICAgICAgICBOT0NBUkUgJChhbGwpICQoaW1wb3J0ZWRfdGxicykgOworICAgICAgICBTRUFSQ0ggb24gJChpbmNsdWRlZC1hbmdsZSkgID0gJChzZWxmLmluY2x1ZGVzOkc9KSA7CisgICAgICAgIFNFQVJDSCBvbiAkKGluY2x1ZGVkLXF1b3RlZCkgPSAkKGIpICQoc2VsZi5pbmNsdWRlczpHPSkgOworICAgICAgICBTRUFSQ0ggb24gJChpbXBvcnRlZCkgICAgICAgID0gJChiKSAkKHNlbGYuaW5jbHVkZXM6Rz0pIDsKKyAgICAgICAgU0VBUkNIIG9uICQoaW1wb3J0ZWRfdGxicykgICA9ICQoYikgJChzZWxmLmluY2x1ZGVzOkc9KSA7CisgICAgICAgIAorICAgICAgICBzY2FubmVyLnByb3BhZ2F0ZSAKKyAgICAgICAgICAgIFsgdHlwZS5nZXQtc2Nhbm5lciBDUFAgOiBbIHByb3BlcnR5LXNldC5jcmVhdGUgJChzZWxmLmluY2x1ZGVzKSBdIF0gOiAKKyAgICAgICAgICAgICQoaW5jbHVkZWQtYW5nbGUpICQoaW5jbHVkZWQtcXVvdGVkKSA6ICQodGFyZ2V0KSA7CisKKyAgICAgICAgc2Nhbm5lci5wcm9wYWdhdGUgJChfX25hbWVfXykgOiAkKGltcG9ydGVkKSA6ICQodGFyZ2V0KSA7CisgICAgfSAgICAgICAgCit9CisKK3NjYW5uZXIucmVnaXN0ZXIgbWlkbC1zY2FubmVyIDogaW5jbHVkZSA7Cit0eXBlLnNldC1zY2FubmVyIElETCA6IG1pZGwtc2Nhbm5lciA7CisKKworIyBDb21tYW5kIGxpbmUgb3B0aW9ucworZmVhdHVyZSBtaWRsLXN0dWJsZXNzLXByb3h5IDogeWVzIG5vIDogcHJvcGFnYXRlZCA7CitmZWF0dXJlIG1pZGwtcm9idXN0IDogeWVzIG5vIDogcHJvcGFnYXRlZCA7CisKK2ZsYWdzIG1pZGwuY29tcGlsZS5pZGwgTUlETEZMQUdTIDxtaWRsLXN0dWJsZXNzLXByb3h5PnllcyA6IC9PaWNmIDsKK2ZsYWdzIG1pZGwuY29tcGlsZS5pZGwgTUlETEZMQUdTIDxtaWRsLXN0dWJsZXNzLXByb3h5Pm5vIDogL09pYyA7CitmbGFncyBtaWRsLmNvbXBpbGUuaWRsIE1JRExGTEFHUyA8bWlkbC1yb2J1c3Q+eWVzIDogL3JvYnVzdCA7CitmbGFncyBtaWRsLmNvbXBpbGUuaWRsIE1JRExGTEFHUyA8bWlkbC1yb2J1c3Q+bm8gOiAvbm9fcm9idXN0IDsKKworIyBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgb3B0aW9ucworYXJjaGl0ZWN0dXJlLXg4NiA9IDxhcmNoaXRlY3R1cmU+IDxhcmNoaXRlY3R1cmU+eDg2IDsKK2FkZHJlc3MtbW9kZWwtMzIgPSA8YWRkcmVzcy1tb2RlbD4gPGFkZHJlc3MtbW9kZWw+MzIgOworYWRkcmVzcy1tb2RlbC02NCA9IDxhZGRyZXNzLW1vZGVsPiA8YWRkcmVzcy1tb2RlbD42NCA7CisKK2ZsYWdzIG1pZGwuY29tcGlsZS5pZGwgTUlETEZMQUdTICQoYXJjaGl0ZWN0dXJlLXg4NikvJChhZGRyZXNzLW1vZGVsLTMyKSA6IC93aW4zMiA7CitmbGFncyBtaWRsLmNvbXBpbGUuaWRsIE1JRExGTEFHUyAkKGFyY2hpdGVjdHVyZS14ODYpLzxhZGRyZXNzLW1vZGVsPjY0IDogL3g2NCA7CitmbGFncyBtaWRsLmNvbXBpbGUuaWRsIE1JRExGTEFHUyA8YXJjaGl0ZWN0dXJlPmlhNjQvJChhZGRyZXNzLW1vZGVsLTY0KSA6IC9pYTY0IDsKKworCitmbGFncyBtaWRsLmNvbXBpbGUuaWRsIERFRklORVMgPGRlZmluZT4gOworZmxhZ3MgbWlkbC5jb21waWxlLmlkbCBVTkRFRlMgPHVuZGVmPiA7CitmbGFncyBtaWRsLmNvbXBpbGUuaWRsIElOQ0xVREVTIDxpbmNsdWRlPiA7CisKKworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIG1pZGwuY29tcGlsZS5pZGwgOiBJREwgOiBNU1RZUEVMSUIgSCBDKCVfaSkgQyglX3Byb3h5KSBDKCVfZGxsZGF0YSkgOworCisKKyMgTUlETCBkb2VzIG5vdCBhbHdheXMgZ2VuZXJhdGUgJyVfcHJveHkuYycgYW5kICclX2RsbGRhdGEuYycuIFRoaXMgYmVoYXZpb3IgCisjIGRlcGVuZHMgb24gY29udGVudHMgb2YgdGhlIHNvdXJjZSBJREwgZmlsZS4gQ2FsbGluZyBUT1VDSF9GSUxFIGJlbG93IGVuc3VyZXMKKyMgdGhhdCBib3RoIGZpbGVzIHdpbGwgYmUgY3JlYXRlZCBzbyBiamFtIHdpbGwgbm90IHRyeSB0byByZWNyZWF0ZSB0aGVtIAorIyBjb25zdGFudGx5LgorVE9VQ0hfRklMRSA9IFsgY29tbW9uLmZpbGUtdG91Y2gtY29tbWFuZCBdIDsKKworYWN0aW9ucyBjb21waWxlLmlkbAoreworICAgIG1pZGwgL25vbG9nbyBAIkAoJCg8WzFdOlcpLnJzcDpFPSQobmwpIiQoPjpXKSIgJChubCktRCQoREVGSU5FUykgJChubCkiLUkkKElOQ0xVREVTKSIgJChubCktVSQoVU5ERUZTKSAkKG5sKSQoTUlETEZMQUdTKSAkKG5sKS90bGIgIiQoPFsxXTpXKSIgJChubCkvaCAiJCg8WzJdOlcpIiAkKG5sKS9paWQgIiQoPFszXTpXKSIgJChubCkvcHJveHkgIiQoPFs0XTpXKSIgJChubCkvZGxsZGF0YSAiJCg8WzVdOlcpIikiCisgICAgJChUT1VDSF9GSUxFKSAiJCg8WzRdOlcpIiAgCisgICAgJChUT1VDSF9GSUxFKSAiJCg8WzVdOlcpIiAgCit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL21pcHNwcm8uamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9taXBzcHJvLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdlYWVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9taXBzcHJvLmphbQpAQCAtMCwwICsxLDE0NSBAQAorIyAgQ29weXJpZ2h0IE5vZWwgQmVsY291cnQgMjAwNy4KKyMgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyAgICAgICAgICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2ltcG9ydCBwcm9wZXJ0eSA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgb3MgOworaW1wb3J0IHRvb2xzZXQgOiBmbGFncyA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgZm9ydHJhbiA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgY29tbW9uIDsKKworZmVhdHVyZS5leHRlbmQgdG9vbHNldCA6IG1pcHNwcm8gOwordG9vbHNldC5pbmhlcml0IG1pcHNwcm8gOiB1bml4IDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgbWlwc3Byby5wcmVidWlsdCA6IGJ1aWx0aW4ubGliLWdlbmVyYXRvciA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIG1pcHNwcm8uc2VhcmNoZWQtbGliLWdlbmVyYXRvciA6IHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOworCisjICBEb2N1bWVudGF0aW9uIGFuZCB0b29sY2hhaW4gZGVzY3JpcHRpb24gbG9jYXRlZAorIyAgaHR0cDovL3d3dy5zZ2kuY29tL3Byb2R1Y3RzL3NvZnR3YXJlL2lyaXgvdG9vbHMvCisKK3J1bGUgaW5pdCAoIHZlcnNpb24gPyA6IGNvbW1hbmQgKiA6IG9wdGlvbnMgKiApIAoreworICBsb2NhbCBjb25kaXRpb24gPSBbIAorICAgIGNvbW1vbi5jaGVjay1pbml0LXBhcmFtZXRlcnMgbWlwc3BybyA6IHZlcnNpb24gJCh2ZXJzaW9uKSBdIDsKKworICBjb21tYW5kID0gWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBtaXBzcHJvIDogQ0MgOiAkKGNvbW1hbmQpIF0gOworCisgIGNvbW1vbi5oYW5kbGUtb3B0aW9ucyBtaXBzcHJvIDogJChjb25kaXRpb24pIDogJChjb21tYW5kKSA6ICQob3B0aW9ucykgOworICAgIAorICBjb21tYW5kX2MgPSAkKGNvbW1hbmRfY1sxLS0yXSkgJChjb21tYW5kWy0xXTpCPWNjKSA7CisKKyAgdG9vbHNldC5mbGFncyBtaXBzcHJvIENPTkZJR19DX0NPTU1BTkQgJChjb25kaXRpb24pIDogJChjb21tYW5kX2MpIDsKKworICAjIGZvcnRyYW4gc3VwcG9ydAorICBsb2NhbCBjb21tYW5kID0gWyAKKyAgICBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBtaXBzcHJvIDogZjc3IDogJChjb21tYW5kKSA6ICQoaW5zdGFsbF9kaXIpIF0gOworCisgIGNvbW1hbmRfZiA9ICQoY29tbWFuZF9mWzEtLTJdKSAkKGNvbW1hbmRbLTFdOkI9Zjc3KSA7CisgIHRvb2xzZXQuZmxhZ3MgbWlwc3BybyBDT05GSUdfRl9DT01NQU5EICQoY29uZGl0aW9uKSA6ICQoY29tbWFuZF9mKSA7CisKKyAgIyBzZXQgbGluayBmbGFncworICBmbGFncyBtaXBzcHJvLmxpbmsgRklORExJQlMtU1QgOiBbIAorICAgIGZlYXR1cmUuZ2V0LXZhbHVlcyA8ZmluZC1zdGF0aWMtbGlicmFyeT4gOiAkKG9wdGlvbnMpIF0gOiB1bmNoZWNrZWQgOworCisgIGZsYWdzIG1pcHNwcm8ubGluayBGSU5ETElCUy1TQSA6IFsgCisgICAgZmVhdHVyZS5nZXQtdmFsdWVzIDxmaW5kLXNoYXJlZC1saWJyYXJ5PiA6ICQob3B0aW9ucykgXSA6IHVuY2hlY2tlZCA7Cit9CisKKyMgRGVjbGFyZSBnZW5lcmF0b3JzCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgbWlwc3Byby5jb21waWxlLmMgOiBDIDogT0JKIDogPHRvb2xzZXQ+bWlwc3BybyA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgbWlwc3Byby5jb21waWxlLmMrKyA6IENQUCA6IE9CSiA6IDx0b29sc2V0Pm1pcHNwcm8gOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1mb3J0cmFuLWNvbXBpbGVyIG1pcHNwcm8uY29tcGlsZS5mb3J0cmFuIDogRk9SVFJBTiA6IE9CSiA6IDx0b29sc2V0Pm1pcHNwcm8gOworCitjcHUtYXJjaC0zMiA9CisgIDxhcmNoaXRlY3R1cmU+LzxhZGRyZXNzLW1vZGVsPgorICA8YXJjaGl0ZWN0dXJlPi88YWRkcmVzcy1tb2RlbD4zMiA7CisKK2NwdS1hcmNoLTY0ID0KKyAgPGFyY2hpdGVjdHVyZT4vPGFkZHJlc3MtbW9kZWw+NjQgOworCitmbGFncyBtaXBzcHJvLmNvbXBpbGUgT1BUSU9OUyAkKGNwdS1hcmNoLTMyKSA6IC1uMzIgOworZmxhZ3MgbWlwc3Byby5jb21waWxlIE9QVElPTlMgJChjcHUtYXJjaC02NCkgOiAtNjQgOworCisjIERlY2xhcmUgZmxhZ3MgYW5kIGFjdGlvbnMgZm9yIGNvbXBpbGF0aW9uCitmbGFncyBtaXBzcHJvLmNvbXBpbGUgT1BUSU9OUyA8ZGVidWctc3ltYm9scz5vbiA6IC1nIDsgCisjIGZsYWdzIG1pcHNwcm8uY29tcGlsZSBPUFRJT05TIDxwcm9maWxpbmc+b24gOiAteHByb2ZpbGU9dGNvdiA7CitmbGFncyBtaXBzcHJvLmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3M+b2ZmIDogLXcgOworZmxhZ3MgbWlwc3Byby5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzPm9uIDogLWFuc2lXIC1kaWFnX3N1cHByZXNzIDE0MjkgOyAjIHN1cHByZXNzIGxvbmcgbG9uZyBpcyBub25zdGFuZGFyZCB3YXJuaW5nCitmbGFncyBtaXBzcHJvLmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3M+YWxsIDogLWZ1bGx3YXJuIDsKK2ZsYWdzIG1pcHNwcm8uY29tcGlsZSBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BlZWQgOiAtT2Zhc3QgOworZmxhZ3MgbWlwc3Byby5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGFjZSA6IC1PMiA7CitmbGFncyBtaXBzcHJvLmNvbXBpbGUgT1BUSU9OUyA8Y2ZsYWdzPiA6IC1MQU5HOnN0ZCA7CitmbGFncyBtaXBzcHJvLmNvbXBpbGUuYysrIE9QVElPTlMgPGlubGluaW5nPm9mZiA6IC1JTkxJTkU6bm9uZSA7CitmbGFncyBtaXBzcHJvLmNvbXBpbGUuYysrIE9QVElPTlMgPGN4eGZsYWdzPiA7CitmbGFncyBtaXBzcHJvLmNvbXBpbGUgREVGSU5FUyA8ZGVmaW5lPiA7CitmbGFncyBtaXBzcHJvLmNvbXBpbGUgSU5DTFVERVMgPGluY2x1ZGU+IDsKKworCitmbGFncyBtaXBzcHJvLmNvbXBpbGUuZm9ydHJhbiBPUFRJT05TIDxmZmxhZ3M+IDsKKworYWN0aW9ucyBjb21waWxlLmMKK3sKKyAgICAiJChDT05GSUdfQ19DT01NQU5EKSIgJChPUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC1jIC1vICIkKDwpIiAiJCg+KSIKK30KKworYWN0aW9ucyBjb21waWxlLmMrKworeworICAgICIkKENPTkZJR19DT01NQU5EKSIgLUZFOnRlbXBsYXRlX2luX2VsZl9zZWN0aW9uIC1wdHVzZWQgJChPUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC1jIC1vICIkKDwpIiAiJCg+KSIKK30KKworYWN0aW9ucyBjb21waWxlLmZvcnRyYW4KK3sKKyAgICAiJChDT05GSUdfRl9DT01NQU5EKSIgJChPUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC1jIC1vICIkKDwpIiAiJCg+KSIKK30KKworIyBEZWNsYXJlIGZsYWdzIGFuZCBhY3Rpb25zIGZvciBsaW5raW5nCitmbGFncyBtaXBzcHJvLmxpbmsgT1BUSU9OUyA8ZGVidWctc3ltYm9scz5vbiA6IC1nIDsKKyMgU3RyaXAgdGhlIGJpbmFyeSB3aGVuIG5vIGRlYnVnZ2luZyBpcyBuZWVkZWQKKyMgZmxhZ3MgbWlwc3Byby5saW5rIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b2ZmIDogLXMgOworIyBmbGFncyBtaXBzcHJvLmxpbmsgT1BUSU9OUyA8cHJvZmlsaW5nPm9uIDogLXhwcm9maWxlPXRjb3YgOworIyBmbGFncyBtaXBzcHJvLmxpbmsgT1BUSU9OUyA8dGhyZWFkaW5nPm11bHRpIDogLW10IDsKKworZmxhZ3MgbWlwc3Byby5saW5rIE9QVElPTlMgJChjcHUtYXJjaC0zMikgOiAtbjMyIDsKK2ZsYWdzIG1pcHNwcm8ubGluayBPUFRJT05TICQoY3B1LWFyY2gtNjQpIDogLTY0IDsKKworZmxhZ3MgbWlwc3Byby5saW5rIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGVlZCA6IC1PZmFzdCA7CitmbGFncyBtaXBzcHJvLmxpbmsgT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwYWNlIDogLU8yIDsKK2ZsYWdzIG1pcHNwcm8ubGluayBPUFRJT05TIDxsaW5rZmxhZ3M+IDsKK2ZsYWdzIG1pcHNwcm8ubGluayBMSU5LUEFUSCA8bGlicmFyeS1wYXRoPiA7CitmbGFncyBtaXBzcHJvLmxpbmsgRklORExJQlMtU1QgPGZpbmQtc3RhdGljLWxpYnJhcnk+IDsKK2ZsYWdzIG1pcHNwcm8ubGluayBGSU5ETElCUy1TQSA8ZmluZC1zaGFyZWQtbGlicmFyeT4gOworZmxhZ3MgbWlwc3Byby5saW5rIEZJTkRMSUJTLVNBIDx0aHJlYWRpbmc+bXVsdGkgOiBwdGhyZWFkIDsKK2ZsYWdzIG1pcHNwcm8ubGluayBMSUJSQVJJRVMgPGxpYnJhcnktZmlsZT4gOworZmxhZ3MgbWlwc3Byby5saW5rIExJTkstUlVOVElNRSA8cnVudGltZS1saW5rPnN0YXRpYyA6IHN0YXRpYyA7CitmbGFncyBtaXBzcHJvLmxpbmsgTElOSy1SVU5USU1FIDxydW50aW1lLWxpbms+c2hhcmVkIDogZHluYW1pYyA7CitmbGFncyBtaXBzcHJvLmxpbmsgUlBBVEggPGRsbC1wYXRoPiA7CisKK3J1bGUgbGluayAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgU1BBQ0Ugb24gJCh0YXJnZXRzKSA9ICIgIiA7Cit9CisKK2FjdGlvbnMgbGluayBiaW5kIExJQlJBUklFUworeworICAgICIkKENPTkZJR19DT01NQU5EKSIgLUZFOnRlbXBsYXRlX2luX2VsZl9zZWN0aW9uIC1wdHVzZWQgJChPUFRJT05TKSAtTCIkKExJTktQQVRIKSIgLVIiJChSUEFUSCkiIC1vICIkKDwpIiAiJCg+KSIgIiQoTElCUkFSSUVTKSIgLUJkeW5hbWljIC1sJChGSU5ETElCUy1TQSkgLUJzdGF0aWMgLWwkKEZJTkRMSUJTLVNUKSAtQiQoTElOSy1SVU5USU1FKSAtbG0KK30KKworIyBTbGlnaHQgbW9kcyBmb3IgZGxscworcnVsZSBsaW5rLmRsbCAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgU1BBQ0Ugb24gJCh0YXJnZXRzKSA9ICIgIiA7Cit9CisKK2FjdGlvbnMgbGluay5kbGwgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoT1BUSU9OUykgLUwiJChMSU5LUEFUSCkiIC1SIiQoUlBBVEgpIiAtbyAiJCg8KSIgIiQoPikiICIkKExJQlJBUklFUykiIC1CZHluYW1pYyAtbCQoRklORExJQlMtU0EpIC1Cc3RhdGljIC1sJChGSU5ETElCUy1TVCkgLUIkKExJTkstUlVOVElNRSkKK30KKworIyBEZWNsYXJlIGFjdGlvbiBmb3IgY3JlYXRpbmcgc3RhdGljIGxpYnJhcmllcworYWN0aW9ucyBwaWVjZW1lYWwgYXJjaGl2ZQoreworICAgIGFyIC1jciAiJCg8KSIgIiQoPikiCit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL21waS5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL21waS5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlNDkwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvbXBpLmphbQpAQCAtMCwwICsxLDU4MyBAQAorIyBTdXBwb3J0IGZvciB0aGUgTWVzc2FnZSBQYXNzaW5nIEludGVyZmFjZSAoTVBJKQorIworIyAoQykgQ29weXJpZ2h0IDIwMDUsIDIwMDYgVHJ1c3RlZXMgb2YgSW5kaWFuYSBVbml2ZXJzaXR5CisjIChDKSBDb3B5cmlnaHQgMjAwNSBEb3VnbGFzIEdyZWdvcgorIworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIAorIyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dC4pCisjCisjIEF1dGhvcnM6IERvdWdsYXMgR3JlZ29yCisjICAgICAgICAgIEFuZHJldyBMdW1zZGFpbmUKKyMKKyMgPT09PSBNUEkgQ29uZmlndXJhdGlvbiA9PT09CisjIAorIyBGb3IgbWFueSB1c2VycywgTVBJIHN1cHBvcnQgY2FuIGJlIGVuYWJsZWQgc2ltcGx5IGJ5IGFkZGluZyB0aGUgZm9sbG93aW5nIAorIyBsaW5lIHRvIHlvdXIgdXNlci1jb25maWcuamFtIGZpbGU6CisjCisjICAgdXNpbmcgbXBpIDsKKyMKKyMgVGhpcyBzaG91bGQgYXV0by1kZXRlY3QgTVBJIHNldHRpbmdzIGJhc2VkIG9uIHRoZSBNUEkgd3JhcHBlciBjb21waWxlciBpbiAKKyMgeW91ciBwYXRoLCBlLmcuLCAibXBpYysrIi4gSWYgdGhlIHdyYXBwZXIgY29tcGlsZXIgaXMgbm90IGluIHlvdXIgcGF0aCwgb3IKKyMgaGFzIGEgZGlmZmVyZW50IG5hbWUsIHlvdSBjYW4gcGFzcyB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlciBjb21waWxlciBhcyB0aGUKKyMgZmlyc3QgYXJndW1lbnQgdG8gdGhlIG1waSBtb2R1bGU6CisjCisjICAgdXNpbmcgbXBpIDogL29wdC9tcGljaDItMS4wLjQvYmluL21waUNDIDsKKyMKKyMgSWYgeW91ciBNUEkgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGF2ZSBhIHdyYXBwZXIgY29tcGlsZXIsIG9yIHRoZSBNUEkgCisjIGF1dG8tZGV0ZWN0aW9uIGNvZGUgZG9lcyBub3Qgd29yayB3aXRoIHlvdXIgTVBJJ3Mgd3JhcHBlciBjb21waWxlciwKKyMgeW91IGNhbiBwYXNzIE1QSS1yZWxhdGVkIG9wdGlvbnMgZXhwbGljaXRseSB2aWEgdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gdGhlIAorIyBtcGkgbW9kdWxlOgorIworIyAgICB1c2luZyBtcGkgOiA6IDxmaW5kLXNoYXJlZC1saWJyYXJ5PmxhbW1waW8gPGZpbmQtc2hhcmVkLWxpYnJhcnk+bGFtbXBpKysKKyMgICAgICAgICAgICAgICAgICA8ZmluZC1zaGFyZWQtbGlicmFyeT5tcGkgPGZpbmQtc2hhcmVkLWxpYnJhcnk+bGFtIAorIyAgICAgICAgICAgICAgICAgIDxmaW5kLXNoYXJlZC1saWJyYXJ5PmRsIDsKKyMKKyMgVG8gc2VlIHRoZSByZXN1bHRzIG9mIE1QSSBhdXRvLWRldGVjdGlvbiwgcGFzcyAiLS1kZWJ1Zy1jb25maWd1cmF0aW9uIiBvbgorIyB0aGUgYmphbSBjb21tYW5kIGxpbmUuCisjCisjIFRoZSAob3B0aW9uYWwpIGZvdXJ0aCBhcmd1bWVudCBjb25maWd1cmVzIEJvb3N0Lk1QSSBmb3IgcnVubmluZworIyByZWdyZXNzaW9uIHRlc3RzLiBUaGVzZSBwYXJhbWV0ZXJzIHNwZWNpZnkgdGhlIGV4ZWN1dGFibGUgdXNlZCB0bworIyBsYXVuY2ggam9icyAoZGVmYXVsdDogIm1waXJ1biIpIGZvbGxvd2VkIGJ5IGFueSBuZWNlc3NhcnkgYXJndW1lbnRzCisjIHRvIHRoaXMgdG8gcnVuIHRlc3RzIGFuZCB0ZWxsIHRoZSBwcm9ncmFtIHRvIGV4cGVjdCB0aGUgbnVtYmVyIG9mCisjIHByb2Nlc3NvcnMgdG8gZm9sbG93IChkZWZhdWx0OiAiLW5wIikuICBXaXRoIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMsCisjIGZvciBpbnN0YW5jZSwgdGhlIHRlc3QgaGFybmVzcyB3aWxsIGV4ZWN1dGUsIGUuZy4sCisjICAKKyMgICAgbXBpcnVuIC1ucCA0IGFsbF9nYXRoZXJfdGVzdAorIworIyA9PT09IExpbmtpbmcgQWdhaW5zdCB0aGUgTVBJIExpYnJhcmllcyA9PT0KKyMKKyMgVG8gbGluayBhZ2FpbnN0IHRoZSBNUEkgbGlicmFyaWVzLCBpbXBvcnQgdGhlICJtcGkiIG1vZHVsZSBhbmQgYWRkIHRoZSAKKyMgZm9sbG93aW5nIHJlcXVpcmVtZW50IHRvIHlvdXIgdGFyZ2V0OgorIyAKKyMgICA8bGlicmFyeT4vbXBpLy9tcGkgCisjCisjIFNpbmNlIE1QSSBzdXBwb3J0IGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlLCB5b3Ugc2hvdWxkIGNoZWNrIAorIyAibXBpLmNvbmZpZ3VyZWQiIGJlZm9yZSB0cnlpbmcgdG8gbGluayBhZ2FpbnN0IHRoZSBNUEkgbGlicmFyaWVzLgorCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgY29tbW9uIDsKK2ltcG9ydCBmZWF0dXJlIDogZmVhdHVyZSA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgb3MgOworaW1wb3J0IHByb2plY3QgOworaW1wb3J0IHByb3BlcnR5IDsKK2ltcG9ydCB0ZXN0aW5nIDsKK2ltcG9ydCB0b29sc2V0IDsKK2ltcG9ydCB0eXBlIDsKK2ltcG9ydCBwYXRoIDsKKworIyBNYWtlIHRoaXMgbW9kdWxlIGEgcHJvamVjdAorcHJvamVjdC5pbml0aWFsaXplICQoX19uYW1lX18pIDsKK3Byb2plY3QgbXBpIDsKKworaWYgWyBNQVRDSCAoLS1kZWJ1Zy1jb25maWd1cmF0aW9uKSA6IFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIF0KK3sKKyAgLmRlYnVnLWNvbmZpZ3VyYXRpb24gPSB0cnVlIDsKK30KKworIyBBc3N1bWluZyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgY29tbWFuZCBsaW5lIGlzIHRoZSBnaXZlbiBwcmVmaXgKKyMgZm9sbG93ZWQgYnkgc29tZSBub24tZW1wdHkgdmFsdWUsIHJlbW92ZSB0aGUgZmlyc3QgYXJndW1lbnQuIFJldHVybnMKKyMgZWl0aGVyIG5vdGhpbmcgKGlmIHRoZXJlIHdhcyBubyBwcmVmaXggb3Igbm8gdmFsdWUpIG9yIGEgcGFpcgorIworIyAgIDxuYW1lPnZhbHVlIHJlc3Qtb2YtY21kbGluZQorIworIyBUaGlzIGlzIGEgc3Vicm91dGluZSBvZiBjbWRsaW5lX3RvX2ZlYXR1cmVzCitydWxlIGFkZF9mZWF0dXJlICggcHJlZml4IG5hbWUgY21kbGluZSApIAoreworICAgIGxvY2FsIG1hdGNoID0gWyBNQVRDSCAiXiQocHJlZml4KShbXlwiIF0rfFwiW15cIl0rXCIpICooLiopJCIgOiAkKGNtZGxpbmUpIF0gOworCisgICAgIyBJZiB0aGVyZSB3YXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVmaXgsIGFib3J0CisgICAgaWYgISAkKG1hdGNoKSB7CisgICAgICByZXR1cm4gOworICAgIH0KKworICAgIGxvY2FsIHZhbHVlID0gJChtYXRjaFsxXSkgOworCisgICAgaWYgWyBNQVRDSCAiICsiIDogJCh2YWx1ZSkgXSB7CisgICAgICB2YWx1ZSA9ICJcIiQodmFsdWUpXCIiIDsKKyAgICB9CisKKyAgICByZXR1cm4gIjwkKG5hbWUpPiQodmFsdWUpIiAkKG1hdGNoWzJdKSA7Cit9CisKKyMgU3RyaXAgYW55IGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgb2ZmIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybiB0aGUKKyMgcmVzdWx0LgorcnVsZSBzdHJpcC1lb2wgKCBzdHJpbmcgKQoreworICBsb2NhbCBtYXRjaCA9IFsgTUFUQ0ggIl4oKFtBLVphLXowLTl+YFwuIUAjJCVeJiooKV8rPXt9OzonXCIsLjw+Lz9cXHwgLV18W3xdKSopLiokIiA6ICQoc3RyaW5nKSBdIDsKKworICBpZiAkKG1hdGNoKQorICB7CisgICAgcmV0dXJuICQobWF0Y2hbMV0pIDsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gJChzdHJpbmcpIDsKKyAgfQorfQorCisjIFNwbGl0IGEgY29tbWFuZC1saW5lIGludG8gYSBzZXQgb2YgZmVhdHVyZXMuIENlcnRhaW4ga2luZHMgb2YKKyMgY29tcGlsZXIgZmxhZ3MgYXJlIHJlY29nbml6ZWQgKGUuZy4sIC1JLCAtRCwgLUwsIC1sKSBhbmQgcmVwbGFjZWQKKyMgd2l0aCB0aGVpciBCb29zdC5CdWlsZCBlcXVpdmFsZW50cyAoZS5nLiwgPGluY2x1ZGU+LCA8ZGVmaW5lPiwKKyMgPGxpYnJhcnktcGF0aD4sIDxmaW5kLWxpYnJhcnk+KS4gQWxsIG90aGVyIGFyZ3VtZW50cyBhcmUgaW50cm9kdWNlZAorIyB1c2luZyB0aGUgZmVhdHVyZXMgaW4gdGhlIHVua25vd24tZmVhdHVyZXMgcGFyYW1ldGVyLCBiZWNhdXNlIHdlCisjIGRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aCB0aGVtLiBGb3IgaW5zdGFuY2UsIGlmIHlvdXIgY29tcGlsZSBhbmQKKyMgY29ycmVjdC4gVGhlIGluY29taW5nIGNvbW1hbmQgbGluZSBzaG91bGQgYmUgYSBzdHJpbmcgc3RhcnRpbmcgd2l0aAorIyBhbiBleGVjdXRhYmxlIChlLmcuLCBnKysgLUkvaW5jbHVkZS9wYXRoIikgYW5kIG1heSBjb250YWluIGFueQorIyBudW1iZXIgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0aGVyZWFmdGVyLiBUaGUgcmVzdWx0IGlzIGEgbGlzdCBvZgorIyBmZWF0dXJlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjb21tYW5kIGxpbmUsIGlnbm9yaW5nIHRoZQorIyBleGVjdXRhYmxlLgorcnVsZSBjbWRsaW5lX3RvX2ZlYXR1cmVzICggY21kbGluZSA6IHVua25vd24tZmVhdHVyZXMgPyApCit7CisgICAgbG9jYWwgZXhlY3V0YWJsZSA7CisgICAgbG9jYWwgZmVhdHVyZXMgOworICAgIGxvY2FsIG90aGVyZmxhZ3MgOworICAgIGxvY2FsIHJlc3VsdCA7CisKKyAgICB1bmtub3duLWZlYXR1cmVzID89IDxjeHhmbGFncz4gPGxpbmtmbGFncz4gOworCisgICAgIyBQdWxsIHRoZSBleGVjdXRhYmxlIG91dCBvZiB0aGUgY29tbWFuZCBsaW5lLiBBdCB0aGlzIHBvaW50LCB0aGUKKyAgICAjIGV4ZWN1dGFibGUgaXMganVzdCB0aHJvd24gYXdheS4KKyAgICBsb2NhbCBtYXRjaCA9IFsgTUFUQ0ggIl4oW15cIiBdK3xcIlteXCJdK1wiKSAqKC4qKSQiIDogJChjbWRsaW5lKSBdIDsKKyAgICBleGVjdXRhYmxlID0gJChtYXRjaFsxXSkgOworICAgIGNtZGxpbmUgPSAkKG1hdGNoWzJdKSA7CisKKyAgICAjIExpc3QgdGhlIHByZWZpeC9mZWF0dXJlIHBhaXJzIHRoYXQgd2Ugd2lsbCBiZSBhYmxlIHRvIHRyYW5zZm9ybS4gCisgICAgIyBFdmVyeSBraW5kIG9mIHBhcmFtZXRlciBub3QgbWVudGlvbmVkIGhlcmUgd2lsbCBiZSBwbGFjZWQgaW4gYm90aAorICAgICMgY3h4ZmxhZ3MgYW5kIGxpbmtmbGFncywgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoZXJlIHRoZXkgc2hvdWxkIGdvLgorICAgIGxvY2FsIGZlYXR1cmVfa2luZHMtRCA9ICJkZWZpbmUiIDsKKyAgICBsb2NhbCBmZWF0dXJlX2tpbmRzLUkgPSAiaW5jbHVkZSIgOworICAgIGxvY2FsIGZlYXR1cmVfa2luZHMtTCA9ICJsaWJyYXJ5LXBhdGgiIDsKKyAgICBsb2NhbCBmZWF0dXJlX2tpbmRzLWwgPSAiZmluZC1zaGFyZWQtbGlicmFyeSIgOworCisgICAgd2hpbGUgJChjbWRsaW5lKSB7CisKKyAgICAgICAgIyBDaGVjayBmb3Igb25lIG9mIHRoZSBmZWF0dXJlIHByZWZpeGVzIHdlIGtub3cgYWJvdXQuIElmIHdlCisgICAgICAgICMgZmluZCBvbmUgKGFuZCB0aGUgYXNzb2NpYXRlZCB2YWx1ZSBpcyBub25lbXB0eSksIGNvbnZlcnQgaXQKKyAgICAgICAgIyBpbnRvIGEgZmVhdHVyZS4KKyAgICAgICAgbG9jYWwgbWF0Y2ggPSBbIE1BVENIICJeKC0uKSguKikiIDogJChjbWRsaW5lKSBdIDsKKyAgICAgICAgbG9jYWwgbWF0Y2hlZCA7CisgICAgICAgIGlmICQobWF0Y2gpICYmICQobWF0Y2hbMl0pIHsKKyAgICAgICAgICAgbG9jYWwgcHJlZml4ID0gJChtYXRjaFsxXSkgOworICAgICAgICAgICBpZiAkKGZlYXR1cmVfa2luZHMkKHByZWZpeCkpIHsKKyAgICAgICAgICAgICAgIGxvY2FsIG5hbWUgPSAkKGZlYXR1cmVfa2luZHMkKHByZWZpeCkpIDsKKyAgICAgICAgICAgICAgIGxvY2FsIGFkZCA9IFsgYWRkX2ZlYXR1cmUgJChwcmVmaXgpICQobmFtZSkgJChjbWRsaW5lKSBdIDsKKworICAgICAgICAgICAgICAgaWYgJChhZGQpIHsKKworICAgICAgICAgICAgICAgICAgaWYgJChhZGRbMV0pID0gPGZpbmQtc2hhcmVkLWxpYnJhcnk+cHRocmVhZAorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICMgVWhtLiBJdCdzIG5vdCByZWFsbHkgbmljZSB0aGF0IHRoaXMgTVBJIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgIyB1c2VzIC1scHRocmVhZCBhcyBvcHBvc2VkIHRvIC1wdGhyZWFkLiBXZSBkbyB3YW50IHRvCisgICAgICAgICAgICAgICAgICAgICAgIyBzZXQgPHRocmVhZGluZz5tdWx0aSwgaW5zdGVhZCBvZiAtbHB0aHJlYWQuCisgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICI8dGhyZWFkaW5nPm11bHRpIiA7CisgICAgICAgICAgICAgICAgICAgICAgTVBJX0VYVFJBX1JFUVVJUkVNRU5UUyArPSAiPHRocmVhZGluZz5tdWx0aSIgOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoYWRkWzFdKSA7ICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBjbWRsaW5lID0gJChhZGRbMl0pIDsKKyAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB5ZXMgOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjIElmIHdlIGhhdmVuJ3QgbWF0Y2hlZCBhIGZlYXR1cmUgcHJlZml4LCBqdXN0IGdyYWIgdGhlIGNvbW1hbmQtbGluZQorICAgICAgICAjIGFyZ3VtZW50IGl0c2VsZi4gSWYgd2UgY2FuIG1hcCB0aGlzIGFyZ3VtZW50IHRvIGEgZmVhdHVyZQorICAgICAgICAjIChlLmcuLCAtcHRocmVhZCAtPiA8dGhyZWFkaW5nPm11bHRpKSwgdGhlbiBkbyBzbzsgb3RoZXJ3aXNlLAorICAgICAgICAjIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgIm90aGVyIiBmbGFncyB0aGF0IHdlIGRvbid0CisgICAgICAgICMgdW5kZXJzdGFuZC4KKyAgICAgICAgaWYgISAkKG1hdGNoZWQpIHsKKyAgICAgICAgICAgbWF0Y2ggPSBbIE1BVENIICJeKFteXCIgXSt8XCJbXlwiXStcIikgKiguKikkIiA6ICQoY21kbGluZSkgXSA7CisgICAgICAgICAgIGxvY2FsIHZhbHVlID0gJChtYXRjaFsxXSkgOworICAgICAgICAgICBjbWRsaW5lID0gJChtYXRjaFsyXSkgOworCisgICAgICAgICAgICMgQ2hlY2sgZm9yIG11bHRpdGhyZWFkaW5nIHN1cHBvcnQKKyAgICAgICAgICAgaWYgJCh2YWx1ZSkgPSAiLXB0aHJlYWQiIHx8ICQodmFsdWUpID0gIi1wdGhyZWFkcyIKKyAgICAgICAgICAgeworICAgICAgICAgICAgIHJlc3VsdCArPSAiPHRocmVhZGluZz5tdWx0aSIgOworCisgICAgICAgICAgICAgIyBEUEc6IFRoaXMgaXMgYSBoYWNrIGludGVuZGVkIHRvIHdvcmsgYXJvdW5kIGEgQkJ2MiBidWcgd2hlcmUKKyAgICAgICAgICAgICAjIHJlcXVpcmVtZW50cyBwcm9wYWdhdGVkIGZyb20gbGlicmFyaWVzIGFyZSBub3QgY2hlY2tlZCBmb3IKKyAgICAgICAgICAgICAjIGNvbmZsaWN0cyB3aGVuIEJCdjIgZGV0ZXJtaW5lcyB3aGljaCAiY29tbW9uIiBwcm9wZXJ0aWVzIHRvCisgICAgICAgICAgICAgIyBhcHBseSB0byBhIHRhcmdldC4gSW4gb3VyIGNhc2UsIHRoZSA8dGhyZWFkaW5nPnNpbmdsZSBwcm9wZXJ0eQorICAgICAgICAgICAgICMgZ2V0cyBwcm9wYWdhdGVkIGZyb20gdGhlIGNvbW1vbiBwcm9wZXJ0aWVzIHRvIEJvb3N0Lk1QSQorICAgICAgICAgICAgICMgdGFyZ2V0cywgZXZlbiB0aG91Z2ggPHRocmVhZGluZz5tdWx0aSBpcyBpbiB0aGUgdXNhZ2UgCisgICAgICAgICAgICAgIyByZXF1aXJlbWVudHMgb2YgPGxpYnJhcnk+L21waS8vbXBpLgorICAgICAgICAgICAgIE1QSV9FWFRSQV9SRVFVSVJFTUVOVFMgKz0gIjx0aHJlYWRpbmc+bXVsdGkiIDsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlIGlmIFsgTUFUQ0ggIiguKlthLXpBLVowLTk8Pj8tXS4qKSIgOiAkKHZhbHVlKSBdIHsKKyAgICAgICAgICAgICAgb3RoZXJmbGFncyArPSAkKHZhbHVlKSA7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICMgSWYgdGhlcmUgYXJlIG90aGVyIGZsYWdzIHRoYXQgd2UgZG9uJ3QgdW5kZXJzdGFuZCwgYWRkIHRoZW0gdG8gdGhlCisgICAgIyByZXN1bHQgYXMgYm90aCA8Y3h4ZmxhZ3M+IGFuZCA8bGlua2ZsYWdzPgorICAgIGlmICQob3RoZXJmbGFncykgeworICAgICAgIGZvciB1bmtub3duIGluICQodW5rbm93bi1mZWF0dXJlcykKKyAgICAgICB7CisgICAgICAgICByZXN1bHQgKz0gIiQodW5rbm93bikkKG90aGVyZmxhZ3M6Sj0gKSIgOworICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworIyBEZXRlcm1pbmUgaWYgaXQgaXMgc2FmZSB0byBleGVjdXRlIHRoZSBnaXZlbiBzaGVsbCBjb21tYW5kIGJ5IHRyeWluZworIyB0byBleGVjdXRlIGl0IGFuZCBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBleGl0IGNvZGUgaXMgemVybyBvcgorIyBub3QuIFJldHVybnMgdHJ1ZSBmb3IgYW4gZXhpdCBjb2RlIG9mIHplcm8sIGZhbHNlIG90aGVyd2lzZS4KK2xvY2FsIHJ1bGUgc2FmZS1zaGVsbC1jb21tYW5kICggY21kbGluZSApCit7CisgIGxvY2FsIHJlc3VsdCA9IFsgU0hFTEwgIiQoY21kbGluZSkgPiAvZGV2L251bGwgMj4vZGV2L251bGw7IGlmIFsgIiQ/IiAtZXEgIjAiIF07IHRoZW4gZWNobyBTU0NPSzsgZmkiIF0gOworICByZXR1cm4gWyBNQVRDSCAiLiooU1NDT0spLioiIDogJChyZXN1bHQpIF0gOworfQorCisjIEluaXRpYWxpemUgdGhlIE1QSSBtb2R1bGUuICAKK3J1bGUgaW5pdCAoIG1waWN4eCA/IDogb3B0aW9ucyAqIDogbXBpcnVuLXdpdGgtb3B0aW9ucyAqICkKK3sKKyAgaWYgISAkKG9wdGlvbnMpICYmICQoLmRlYnVnLWNvbmZpZ3VyYXRpb24pCisgIHsKKyAgICBFQ0hPICI9PT09PT09PT09PT09PT1NUEkgQXV0by1jb25maWd1cmF0aW9uPT09PT09PT09PT09PT09IiA7CisgIH0KKyAgICAKKyAgaWYgISAkKG1waWN4eCkgJiYgWyBvcy5vbi13aW5kb3dzIF0KKyAgeyAgCisgICAgIyBUcnkgdG8gYXV0by1jb25maWd1cmUgdG8gdGhlIE1pY3Jvc29mdCBDb21wdXRlIENsdXN0ZXIgUGFjaworICAgIGxvY2FsIGNsdXN0ZXJfcGFja19wYXRoX25hdGl2ZSA9ICJDOlxcUHJvZ3JhbSBGaWxlc1xcTWljcm9zb2Z0IENvbXB1dGUgQ2x1c3RlciBQYWNrIiA7CisgICAgbG9jYWwgY2x1c3Rlcl9wYWNrX3BhdGggPSBbIHBhdGgubWFrZSAkKGNsdXN0ZXJfcGFja19wYXRoX25hdGl2ZSkgXSA7CisgICAgaWYgWyBHTE9CICQoY2x1c3Rlcl9wYWNrX3BhdGhfbmF0aXZlKVxcSW5jbHVkZSA6IG1waS5oIF0KKyAgICB7CisgICAgICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKQorICAgICAgeworICAgICAgICBFQ0hPICJGb3VuZCBNaWNyb3NvZnQgQ29tcHV0ZSBDbHVzdGVyIFBhY2s6ICQoY2x1c3Rlcl9wYWNrX3BhdGhfbmF0aXZlKSIgOworICAgICAgfQorICAgICAgCisgICAgICAjIFBpY2sgdXAgZWl0aGVyIHRoZSAzMi1iaXQgb3IgNjQtYml0IGxpYnJhcnksIGRlcGVuZGluZyBvbiB3aGljaCBhZGRyZXNzCisgICAgICAjIG1vZGVsIHRoZSB1c2VyIGhhcyBzZWxlY3RlZC4gRGVmYXVsdCB0byAzMi1iaXQuCisgICAgICBvcHRpb25zID0gPGluY2x1ZGU+JChjbHVzdGVyX3BhY2tfcGF0aCkvSW5jbHVkZSAKKyAgICAgICAgICAgICAgICA8YWRkcmVzcy1tb2RlbD42NDo8bGlicmFyeS1wYXRoPiQoY2x1c3Rlcl9wYWNrX3BhdGgpL0xpYi9hbWQ2NAorICAgICAgICAgICAgICAgIDxsaWJyYXJ5LXBhdGg+JChjbHVzdGVyX3BhY2tfcGF0aCkvTGliL2kzODYKKyAgICAgICAgICAgICAgICA8ZmluZC1zdGF0aWMtbGlicmFyeT5tc21waQorICAgICAgICAgICAgICAgIDx0b29sc2V0Pm1zdmM6PGRlZmluZT5fU0VDVVJFX1NDTD0wCisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgCisgICAgICAjIFNldHVwIHRoZSAibXBpcnVuIiBlcXVpdmFsZW50IChtcGlleGVjKQorICAgICAgLm1waXJ1biA9ICJcIiQoY2x1c3Rlcl9wYWNrX3BhdGhfbmF0aXZlKVxcQmluXFxtcGlleGVjLmV4ZSJcIiA7CisgICAgICAubXBpcnVuX2ZsYWdzID0gLW4gOworICAgIH0KKyAgICBlbHNlIGlmICQoLmRlYnVnLWNvbmZpZ3VyYXRpb24pCisgICAgeworICAgICAgRUNITyAiRGlkIG5vdCBmaW5kIE1pY3Jvc29mdCBDb21wdXRlIENsdXN0ZXIgUGFjayBpbiAkKGNsdXN0ZXJfcGFja19wYXRoX25hdGl2ZSkuIiA7CisgICAgfQorICB9IAorICAgCisgIGlmICEgJChvcHRpb25zKQorICB7IAorICAgICMgVHJ5IHRvIGF1dG8tZGV0ZWN0IG9wdGlvbnMgYmFzZWQgb24gdGhlIHdyYXBwZXIgY29tcGlsZXIKKyAgICBsb2NhbCBjb21tYW5kID0gWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBtcGkgOiBtcGljKysgOiAkKG1waWN4eCkgXSA7CisKKyAgICBpZiAhICQobXBpY3h4KSAmJiAhICQoY29tbWFuZCkgCisgICAgeworICAgICAgIyBUcnkgIm1waUNDIiwgd2hpY2ggaXMgdXNlZCBieSBNUElDSCAKKyAgICAgIGNvbW1hbmQgPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kIG1waSA6IG1waUNDIF0gOworICAgIH0KKworICAgIGlmICEgJChtcGljeHgpICYmICEgJChjb21tYW5kKSAKKyAgICB7CisgICAgICAjIFRyeSAibXBpY3h4Iiwgd2hpY2ggaXMgdXNlZCBieSBPcGVuTVBJIGFuZCBNUElDSDIKKyAgICAgIGNvbW1hbmQgPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kIG1waSA6IG1waWN4eCBdIDsKKyAgICB9CisKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGxvY2FsIGNvbXBpbGVfZmxhZ3MgOworICAgIGxvY2FsIGxpbmtfZmxhZ3MgOworCisgICAgaWYgISAkKGNvbW1hbmQpCisgICAgeyAKKyAgICAgICMgRG8gbm90aGluZzogd2UnbGwgY29tcGxhaW4gbGF0ZXIKKyAgICB9CisgICAgIyBPcGVuTVBJIGFuZCBuZXdlciB2ZXJzaW9ucyBvZiBMQU0tTVBJIGhhdmUgLXNob3dtZTpjb21waWxlIGFuZCAKKyAgICAjIC1zaG93bWU6bGluay4KKyAgICBlbHNlIGlmIFsgc2FmZS1zaGVsbC1jb21tYW5kICIkKGNvbW1hbmQpIC1zaG93bWU6Y29tcGlsZSIgXSAmJgorICAgICAgICAgICAgICBbIHNhZmUtc2hlbGwtY29tbWFuZCAiJChjb21tYW5kKSAtc2hvd21lOmxpbmsiIF0KKyAgICB7CisgICAgICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKQorICAgICAgeworICAgICAgICBFQ0hPICJGb3VuZCByZWNlbnQgTEFNLU1QSSBvciBPcGVuIE1QSSB3cmFwcGVyIGNvbXBpbGVyOiAkKGNvbW1hbmQpIiA7CisgICAgICB9CisKKyAgICAgIGNvbXBpbGVfZmxhZ3MgPSBbIFNIRUxMICIkKGNvbW1hbmQpIC1zaG93bWU6Y29tcGlsZSIgXSA7CisgICAgICBsaW5rX2ZsYWdzID0gWyBTSEVMTCAiJChjb21tYW5kKSAtc2hvd21lOmxpbmsiIF0gOworICAgCisgICAgICAjIFByZXBlbmQgQ09NUElMRVIgYXMgdGhlIGV4ZWN1dGFibGUgbmFtZSwgdG8gbWF0Y2ggdGhlIGZvcm1hdCBvZiAKKyAgICAgICMgb3RoZXIgY29tcGlsYXRpb24gY29tbWFuZHMuCisgICAgICBjb21waWxlX2ZsYWdzID0gIkNPTVBJTEVSICQoY29tcGlsZV9mbGFncykiIDsKKyAgICAgIGxpbmtfZmxhZ3MgPSAiQ09NUElMRVIgJChsaW5rX2ZsYWdzKSIgOworICAgIH0KKyAgICAjIExvb2sgZm9yIExBTS1NUEkncyAtc2hvd21lCisgICAgZWxzZSBpZiBbIHNhZmUtc2hlbGwtY29tbWFuZCAiJChjb21tYW5kKSAtc2hvd21lIiBdCisgICAgeworICAgICAgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICAgIHsKKyAgICAgICAgRUNITyAiRm91bmQgb2xkZXIgTEFNLU1QSSB3cmFwcGVyIGNvbXBpbGVyOiAkKGNvbW1hbmQpIiA7CisgICAgICB9CisKKyAgICAgIHJlc3VsdCA9IFsgU0hFTEwgIiQoY29tbWFuZCkgLXNob3dtZSIgXSA7CisgICAgfQorICAgICMgTG9vayBmb3IgTVBJQ0gKKyAgICBlbHNlIGlmIFsgc2FmZS1zaGVsbC1jb21tYW5kICIkKGNvbW1hbmQpIC1zaG93IiBdCisgICAgeworICAgICAgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICAgIHsKKyAgICAgICAgRUNITyAiRm91bmQgTVBJQ0ggd3JhcHBlciBjb21waWxlcjogJChjb21tYW5kKSIgOworICAgICAgfQorICAgICAgY29tcGlsZV9mbGFncyA9IFsgU0hFTEwgIiQoY29tbWFuZCkgLWNvbXBpbGVfaW5mbyIgXSA7CisgICAgICBsaW5rX2ZsYWdzID0gWyBTSEVMTCAiJChjb21tYW5kKSAtbGlua19pbmZvIiBdIDsKKyAgICB9CisgICAgIyBTdW4gSFBDIGFuZCBJYm0gUE9FCisgICAgZWxzZSBpZiBbIFNIRUxMICIkKGNvbW1hbmQpIC12IDI+L2Rldi9udWxsIiBdCisgICAgeworICAgICAgY29tcGlsZV9mbGFncyA9IFsgU0hFTEwgIiQoY29tbWFuZCkgLWMgLXYgLXh0YXJnZXQ9bmF0aXZlNjQgMj4vZGV2L251bGwiIF0gOworCisgICAgICBsb2NhbCBiYWNrID0gWyBNQVRDSCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0oLiopIiA6ICQoY29tcGlsZV9mbGFncykgXSA7CisgICAgICBpZiAkKGJhY2spCisgICAgICB7CisgICAgICAgICMgU3VuIEhQQworICAgICAgICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgRUNITyAiRm91bmQgU3VuIE1QSSB3cmFwcGVyIGNvbXBpbGVyOiAkKGNvbW1hbmQpIiA7CisgICAgICAgIH0KKworICAgICAgICBjb21waWxlX2ZsYWdzID0gWyBNQVRDSCAiKC4qKS0tLS0tLS0tLS0tLS0tLS0tLS0tIiA6ICQoYmFjaykgXSA7CisgICAgICAgIGNvbXBpbGVfZmxhZ3MgPSBbIE1BVENIICIoLiopLXYiIDogICQoY29tcGlsZV9mbGFncykgXSA7CisgICAgICAgIGxpbmtfZmxhZ3MgPSBbIFNIRUxMICIkKGNvbW1hbmQpIC12IC14dGFyZ2V0PW5hdGl2ZTY0IDI+L2Rldi9udWxsIiBdIDsKKyAgICAgICAgbGlua19mbGFncyA9IFsgTUFUQ0ggIi0tLS0tLS0tLS0tLS0tLS0tLS0tKC4qKSIgOiAkKGxpbmtfZmxhZ3MpIF0gOworICAgICAgICBsaW5rX2ZsYWdzID0gWyBNQVRDSCAiKC4qKS0tLS0tLS0tLS0tLS0tLS0tLS0tIiA6ICQobGlua19mbGFncykgXSA7CisKKyAgICAgICAgIyBzdHJpcCBvdXQgLXYgZnJvbSBjb21waWxlIG9wdGlvbnMKKyAgICAgICAgbG9jYWwgZnJvbnQgPSBbIE1BVENIICIoLiopLXYiIDogICQobGlua19mbGFncykgXSA7CisgICAgICAgIGxvY2FsIGJhY2sgPSBbIE1BVENIICItdiguKikiIDogICQobGlua19mbGFncykgXSA7CisgICAgICAgIGxpbmtfZmxhZ3MgPSAiJChmcm9udCkgJChiYWNrKSIgOworICAgICAgICBmcm9udCA9IFsgTUFUQ0ggIiguKikteHRhcmdldD1uYXRpdmU2NCIgOiAgJChsaW5rX2ZsYWdzKSBdIDsKKyAgICAgICAgYmFjayA9IFsgTUFUQ0ggIi14dGFyZ2V0PW5hdGl2ZTY0KC4qKSIgOiAgJChsaW5rX2ZsYWdzKSBdIDsKKyAgICAgICAgbGlua19mbGFncyA9ICIkKGZyb250KSAkKGJhY2spIiA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICMgSWJtIFBPRQorICAgICAgICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgRUNITyAiRm91bmQgSUJNIE1QSSB3cmFwcGVyIGNvbXBpbGVyOiAkKGNvbW1hbmQpIiA7CisgICAgICAgIH0KKworICAgICAgICAjIAorICAgICAgICBjb21waWxlX2ZsYWdzID0gWyBTSEVMTCAiJChjb21tYW5kKSAtYyAtdiAyPi9kZXYvbnVsbCIgXSA7CisgICAgICAgIGNvbXBpbGVfZmxhZ3MgPSBbIE1BVENIICIoLiopZXhlYzogZXhwb3J0LioiIDogJChjb21waWxlX2ZsYWdzKSBdIDsKKyAgICAgICAgbG9jYWwgZnJvbnQgPSBbIE1BVENIICIoLiopLXYiIDogICQoY29tcGlsZV9mbGFncykgXSA7CisgICAgICAgIGxvY2FsIGJhY2sgPSBbIE1BVENIICItdiguKikiIDogICQoY29tcGlsZV9mbGFncykgXSA7CisgICAgICAgIGNvbXBpbGVfZmxhZ3MgPSAiJChmcm9udCkgJChiYWNrKSIgOworICAgICAgICBmcm9udCA9IFsgTUFUQ0ggIiguKiktYyIgOiAgJChjb21waWxlX2ZsYWdzKSBdIDsKKyAgICAgICAgYmFjayA9IFsgTUFUQ0ggIi1jKC4qKSIgOiAgJChjb21waWxlX2ZsYWdzKSBdIDsKKyAgICAgICAgY29tcGlsZV9mbGFncyA9ICIkKGZyb250KSAkKGJhY2spIiA7CisgICAgICAgIGxpbmtfZmxhZ3MgPSAkKGNvbXBpbGVfZmxhZ3MpIDsKKworICAgICAgICAjIGdldCBsb2NhdGlvbiBvZiBtcGlmLmggZnJvbSBtcHhsZgorICAgICAgICBsb2NhbCBmX2ZsYWdzID0gWyBTSEVMTCAibXB4bGYgLXYgMj4vZGV2L251bGwiIF0gOworICAgICAgICBmX2ZsYWdzID0gWyBNQVRDSCAiKC4qKWV4ZWM6IGV4cG9ydC4qIiA6ICQoZl9mbGFncykgXSA7CisgICAgICAgIGZyb250ID0gWyBNQVRDSCAiKC4qKS12IiA6ICAkKGZfZmxhZ3MpIF0gOworICAgICAgICBiYWNrID0gWyBNQVRDSCAiLXYoLiopIiA6ICAkKGZfZmxhZ3MpIF0gOworICAgICAgICBmX2ZsYWdzID0gIiQoZnJvbnQpICQoYmFjaykiIDsKKyAgICAgICAgZl9mbGFncyA9IFsgTUFUQ0ggInhsZl9yKC4qKSIgOiAkKGZfZmxhZ3MpIF0gOworICAgICAgICBmX2ZsYWdzID0gWyBNQVRDSCAiLUY6bXB4bGZfciguKikiIDogJChmX2ZsYWdzKSBdIDsKKyAgICAgICAgY29tcGlsZV9mbGFncyA9IFsgc3RyaXAtZW9sICQoY29tcGlsZV9mbGFncykgXSA7CisgICAgICAgIGNvbXBpbGVfZmxhZ3MgPSAiJChjb21waWxlX2ZsYWdzKSAkKGZfZmxhZ3MpIiA7CisgICAgICB9CisgICAgfQorCisgICAgaWYgJChyZXN1bHQpIHx8ICQoY29tcGlsZV9mbGFncykgJiYgJChsaW5rX2ZsYWdzKQorICAgIHsKKyAgICAgIGlmICQocmVzdWx0KQorICAgICAgeworICAgICAgICAgcmVzdWx0ID0gWyBzdHJpcC1lb2wgJChyZXN1bHQpIF0gOworICAgICAgICAgb3B0aW9ucyA9IFsgY21kbGluZV90b19mZWF0dXJlcyAkKHJlc3VsdCkgXSA7CisgICAgICB9CisgICAgICBlbHNlIAorICAgICAgeyAKKyAgICAgICAgIGNvbXBpbGVfZmxhZ3MgPSBbIHN0cmlwLWVvbCAkKGNvbXBpbGVfZmxhZ3MpIF0gOworICAgICAgICAgbGlua19mbGFncyA9IFsgc3RyaXAtZW9sICQobGlua19mbGFncykgXSA7CisKKyAgICAgICAgICMgU2VwYXJhdGVseSBwcm9jZXNzIGNvbXBpbGF0aW9uIGFuZCBsaW5rIGZlYXR1cmVzLCB0aGVuIGNvbWJpbmUKKyAgICAgICAgICMgdGhlbSBhdCB0aGUgZW5kLgorICAgICAgICAgbG9jYWwgY29tcGlsZV9mZWF0dXJlcyA9IFsgY21kbGluZV90b19mZWF0dXJlcyAkKGNvbXBpbGVfZmxhZ3MpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI8Y3h4ZmxhZ3M+IiBdIDsgCisgICAgICAgICBsb2NhbCBsaW5rX2ZlYXR1cmVzID0gWyBjbWRsaW5lX3RvX2ZlYXR1cmVzICQobGlua19mbGFncykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjxsaW5rZmxhZ3M+IiBdIDsgCisgICAgICAgICBvcHRpb25zID0gJChjb21waWxlX2ZlYXR1cmVzKSAkKGxpbmtfZmVhdHVyZXMpIDsKKyAgICAgIH0KKworICAgICAgIyBJZiByZXF1ZXN0ZWQsIGRpc3BsYXkgTVBJIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICAgICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKQorICAgICAgeworICAgICAgICBpZiAkKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgIEVDSE8gIiAgV3JhcHBlciBjb21waWxlciBjb21tYW5kIGxpbmU6ICQocmVzdWx0KSIgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCSAgbG9jYWwgbWF0Y2ggPSBbIE1BVENIICJeKFteXCIgXSt8XCJbXlwiXStcIikgKiguKikkIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAkKGNvbXBpbGVfZmxhZ3MpIF0gOworICAgICAgICAgIEVDSE8gIk1QSSBjb21waWxhdGlvbiBmbGFnczogJChtYXRjaFsyXSkiIDsKKwkgIGxvY2FsIG1hdGNoID0gWyBNQVRDSCAiXihbXlwiIF0rfFwiW15cIl0rXCIpICooLiopJCIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJChsaW5rX2ZsYWdzKSBdIDsKKyAgICAgICAgICBFQ0hPICJNUEkgbGluayBmbGFnczogJChtYXRjaFsyXSkiIDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gCisgICAgZWxzZSAKKyAgICB7CisgICAgICBpZiAkKGNvbW1hbmQpCisgICAgICB7CisgICAgICAgIEVDSE8gIk1QSSBhdXRvLWRldGVjdGlvbiBmYWlsZWQ6IHVua25vd24gd3JhcHBlciBjb21waWxlciAkKGNvbW1hbmQpIiA7CisgICAgICAgIEVDSE8gIlBsZWFzZSByZXBvcnQgdGhpcyBlcnJvciB0byB0aGUgQm9vc3QgbWFpbGluZyBsaXN0OiBodHRwOi8vd3d3LmJvb3N0Lm9yZyIgOworICAgICAgfSAgICAgCisgICAgICBlbHNlIGlmICQobXBpY3h4KQorICAgICAgeworICAgICAgICBFQ0hPICJNUEkgYXV0by1kZXRlY3Rpb24gZmFpbGVkOiB1bmFibGUgdG8gZmluZCB3cmFwcGVyIGNvbXBpbGVyICQobXBpY3h4KSIgOworICAgICAgfSAKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgRUNITyAiTVBJIGF1dG8tZGV0ZWN0aW9uIGZhaWxlZDogdW5hYmxlIHRvIGZpbmQgd3JhcHBlciBjb21waWxlciBgbXBpYysrJyBvciBgbXBpQ0MnIiA7CisgICAgICB9CisgICAgICBFQ0hPICJZb3Ugd2lsbCBuZWVkIHRvIG1hbnVhbGx5IGNvbmZpZ3VyZSBNUEkgc3VwcG9ydC4iIDsKKyAgICB9CisgCisgIH0KKworICAjIEZpbmQgbXBpcnVuIChvciBpdHMgZXF1aXZhbGVudCkgYW5kIGl0cyBmbGFncworICBpZiAhICQoLm1waXJ1bikKKyAgeworICAgIC5tcGlydW4gPSAKKyAgICAgICAgWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBtcGkgOiBtcGlydW4gOiAkKG1waXJ1bi13aXRoLW9wdGlvbnNbMV0pIF0gOworICAgIC5tcGlydW5fZmxhZ3MgPSAkKG1waXJ1bi13aXRoLW9wdGlvbnNbMi1dKSA7CisgICAgLm1waXJ1bl9mbGFncyA/PSAtbnAgOworICB9CisgIAorICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKQorICB7CisgICAgaWYgJChvcHRpb25zKQorICAgIHsKKyAgICAgIGVjaG8gIk1QSSBidWlsZCBmZWF0dXJlczogIiA7CisgICAgICBFQ0hPICQob3B0aW9ucykgOworICAgIH0KKworICAgIGlmICQoLm1waXJ1bikKKyAgICB7CisgICAgICBlY2hvICJNUEkgbGF1bmNoZXI6ICQoLm1waXJ1bikgJCgubXBpcnVuX2ZsYWdzKSIgOworICAgIH0KKyAgICAgICAgCisgICAgRUNITyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIgOworICB9CisKKyAgaWYgJChvcHRpb25zKSAgCisgIHsKKyAgICAuY29uZmlndXJlZCA9IHRydWUgOworCisgICAgIyBTZXQgdXAgdGhlICJtcGkiIGFsaWFzIAorICAgIGFsaWFzIG1waSA6IDogOiA6ICQob3B0aW9ucykgOworICB9Cit9CisKKyMgU3RhdGVzIHdoZXRoZXIgTVBJIGhhcyBiZWUgY29uZmlndXJlZAorcnVsZSBjb25maWd1cmVkICggKQoreworICByZXR1cm4gJCguY29uZmlndXJlZCkgOworfQorCisjIFJldHVycyB0aGUgImV4dHJhIiByZXF1aXJlbWVudHMgbmVlZGVkIHRvIGJ1aWxkIE1QSS4gVGhlc2UgcmVxdWlyZW1lbnRzIGFyZQorIyBwYXJ0IG9mIHRoZSAvbXBpLy9tcGkgbGlicmFyeSB0YXJnZXQsIGJ1dCB0aGV5IG5lZWQgdG8gYmUgYWRkZWQgdG8gYW55dGhpbmcKKyMgdGhhdCB1c2VzIE1QSSBkaXJlY3RseSB0byB3b3JrIGFyb3VuZCBidWdzIGluIEJCdjIncyBwcm9wYWdhdGlvbiBvZgorIyByZXF1aXJlbWVudHMuCitydWxlIGV4dHJhLXJlcXVpcmVtZW50cyAoICkKK3sKKyAgcmV0dXJuICQoTVBJX0VYVFJBX1JFUVVJUkVNRU5UUykgOworfQorCisjIFN1cHBvcnQgZm9yIHRlc3Rpbmc7IGJvcnJvd2VkIGZyb20gUHl0aG9uCit0eXBlLnJlZ2lzdGVyIFJVTl9NUElfT1VUUFVUIDsKK3R5cGUucmVnaXN0ZXIgUlVOX01QSSA6IDogVEVTVCA7CisKK2NsYXNzIG1waS10ZXN0LWdlbmVyYXRvciA6IGdlbmVyYXRvcgoreworICAgIGltcG9ydCBwcm9wZXJ0eS1zZXQgOworCisgICAgcnVsZSBfX2luaXRfXyAoICogOiAqICkKKyAgICB7CisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOworICAgICAgICBzZWxmLmNvbXBvc2luZyA9IHRydWUgOworICAgIH0KKworICAgIHJ1bGUgcnVuICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICogOiBtdWx0aXBsZSA/ICkKKyAgICB7ICAKKyAgICAgICMgR2VuZXJhdGUgYW4gZXhlY3V0YWJsZSBmcm9tIHRoZSBzb3VyY2VzLiBUaGlzIGlzIHRoZSBleGVjdXRhYmxlIHdlIHdpbGwgcnVuLgorICAgICAgbG9jYWwgZXhlY3V0YWJsZSA9IAorICAgICAgICBbIGdlbmVyYXRvcnMuY29uc3RydWN0ICQocHJvamVjdCkgJChuYW1lKSA6IEVYRSA6ICQocHJvcGVydHktc2V0KSA6ICQoc291cmNlcykgXSA7CisKKyAgICAgIHJlc3VsdCA9IAorICAgICAgICBbIGNvbnN0cnVjdC1yZXN1bHQgJChleGVjdXRhYmxlWzItXSkgOiAkKHByb2plY3QpICQobmFtZSktcnVuIDogJChwcm9wZXJ0eS1zZXQpIF0gOworICAgIH0KK30KKworIyBVc2UgbXBpLXRlc3QtZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIE1QSSB0ZXN0cyBmcm9tIHNvdXJjZXMKK2dlbmVyYXRvcnMucmVnaXN0ZXIgCisgIFsgbmV3IG1waS10ZXN0LWdlbmVyYXRvciBtcGkuY2FwdHVyZS1vdXRwdXQgOiA6IFJVTl9NUElfT1VUUFVUIF0gOworCitnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIHRlc3RpbmcuZXhwZWN0LXN1Y2Nlc3MgCisgIDogUlVOX01QSV9PVVRQVVQgOiBSVU5fTVBJIDsKKworIyBUaGUgbnVtYmVyIG9mIHByb2Nlc3NlcyB0byBzcGF3biB3aGVuIGV4ZWN1dGluZyBhbiBNUEkgdGVzdC4KK2ZlYXR1cmUgbXBpOnByb2Nlc3NlcyA6IDogZnJlZSBpbmNpZGVudGFsIDsKKworIyBUaGUgZmxhZyBzZXR0aW5ncyBvbiB0ZXN0aW5nLmNhcHR1cmUtb3V0cHV0IGRvIG5vdAorIyBhcHBseSB0byBtcGkuY2FwdHVyZSBvdXRwdXQgYXQgdGhlIG1vbWVudC4KKyMgUmVkbyB0aGlzIGV4cGxpY2l0bHkuCit0b29sc2V0LmZsYWdzIG1waS5jYXB0dXJlLW91dHB1dCBBUkdTIDx0ZXN0aW5nLmFyZz4gOworcnVsZSBjYXB0dXJlLW91dHB1dCAoIHRhcmdldCA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgIyBVc2UgdGhlIHN0YW5kYXJkIGNhcHR1cmUtb3V0cHV0IHJ1bGUgdG8gcnVuIHRoZSB0ZXN0cworICAgIHRlc3RpbmcuY2FwdHVyZS1vdXRwdXQgJCh0YXJnZXQpIDogJChzb3VyY2VzWzFdKSA6ICQocHJvcGVydGllcykgOworCisgICAgIyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBwcm9jZXNzZXMgd2Ugc2hvdWxkIHJ1biBvbi4KKyAgICBsb2NhbCBudW1fcHJvY2Vzc2VzID0gWyBwcm9wZXJ0eS5zZWxlY3QgPG1waTpwcm9jZXNzZXM+IDogJChwcm9wZXJ0aWVzKSBdIDsKKyAgICBudW1fcHJvY2Vzc2VzID0gJChudW1fcHJvY2Vzc2VzOkc9KSA7CisKKyAgICAjIHNlcmlhbGl6ZSB0aGUgTVBJIHRlc3RzIHRvIGF2b2lkIG92ZXJsb2FkaW5nIHN5c3RlbXMKKyAgICBKQU1fU0VNQVBIT1JFIG9uICQodGFyZ2V0KSA9IDxzPm1waS1ydW4tc2VtYXBob3JlIDsKKworICAgICMgV2UgbGF1bmNoIE1QSSBwcm9jZXNzZXMgdXNpbmcgdGhlICJtcGlydW4iIGVxdWl2YWxlbnQgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICAgIExBVU5DSEVSIG9uICQodGFyZ2V0KSA9ICAKKyAgICAgIFsgb24gJCh0YXJnZXQpIHJldHVybiAkKC5tcGlydW4pICQoLm1waXJ1bl9mbGFncykgJChudW1fcHJvY2Vzc2VzKSBdIDsKK30KKworIyBDcmVhdGVzIGEgc2V0IG9mIHRlc3QgY2FzZXMgdG8gYmUgcnVuIHRocm91Z2ggdGhlIE1QSSBsYXVuY2hlci4gVGhlIG5hbWUsIHNvdXJjZXMsIAorIyBhbmQgcmVxdWlyZW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYW55IG90aGVyIHRlc3QgZ2VuZXJhdG9yLiBIb3dldmVyLCBzY2hlZHVsZSBpcyAKKyMgYSBsaXN0IG9mIG51bWJlcnMsIHdoaWNoIGluZGljYXRlcyBob3cgbWFueSBwcm9jZXNzZXMgZWFjaCB0ZXN0IHJ1biB3aWxsIHVzZS4gRm9yIAorIyBleGFtcGxlLCBwYXNzaW5nIDEgMiA3IHdpbGwgcnVuIHRoZSB0ZXN0IHdpdGggMSBwcm9jZXNzLCB0aGVuIDIgcHJvY2Vzc2VzLCB0aGVuIDcKKyMgNyBwcm9jZXNzZXMuIFRoZSBuYW1lIHByb3ZpZGVkIGlzIGp1c3QgdGhlIGJhc2UgbmFtZTogdGhlIGFjdHVhbCB0ZXN0cyB3aWxsIGJlIAorIyB0aGUgbmFtZSBmb2xsb3dlZCBieSBhIGh5cGVuLCB0aGVuIHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzLiAKK3J1bGUgbXBpLXRlc3QgKCBuYW1lIDogc291cmNlcyAqIDogcmVxdWlyZW1lbnRzICogOiBzY2hlZHVsZSAqICkKK3sgICAgICAgIAorICAgIHNvdXJjZXMgPz0gJChuYW1lKS5jcHAgOworICAgIHNjaGVkdWxlID89IDEgMiAzIDQgNyA4IDEzIDE3IDsKKworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgZm9yIHByb2Nlc3NlcyBpbiAkKHNjaGVkdWxlKQorICAgIHsgIAorICAgICAgcmVzdWx0ICs9IFsgdGVzdGluZy5tYWtlLXRlc3QgCisgICAgICAgIHJ1bi1tcGkgOiAkKHNvdXJjZXMpIC9ib29zdC9tcGkvL2Jvb3N0X21waQorICAgICAgICAgIDogJChyZXF1aXJlbWVudHMpIDx0b29sc2V0Pm1zdmM6PGxpbms+c3RhdGljIDxtcGk6cHJvY2Vzc2VzPiQocHJvY2Vzc2VzKSA6ICQobmFtZSktJChwcm9jZXNzZXMpIF0gOworICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvbXN2Yy1jb25maWcuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9tc3ZjLWNvbmZpZy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3MWUzYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvbXN2Yy1jb25maWcuamFtCkBAIC0wLDAgKzEsMTIgQEAKKyN+IENvcHlyaWdodCAyMDA1IFJlbmUgUml2ZXJhLgorI34gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorI34gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIEF1dG9tYXRpYyBjb25maWd1cmF0aW9uIGZvciBWaXN1YWxTdHVkaW8gdG9vbHNldC4gVG8gdXNlLCBqdXN0IGltcG9ydCB0aGlzIG1vZHVsZS4KKworaW1wb3J0IHRvb2xzZXQgOiB1c2luZyA7CisKK0VDSE8gIndhcm5pbmc6IG1zdmMtY29uZmlnLmphbSBpcyBkZXByZWNhdGVkLiBVc2UgJ3VzaW5nIG1zdmMgOiBhbGwgOycgaW5zdGVhZC4iIDsKKwordXNpbmcgbXN2YyA6IGFsbCA7CisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvbXN2Yy5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL21zdmMuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlY2QwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL21zdmMuamFtCkBAIC0wLDAgKzEsMTQzNSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDMgRGF2aWQgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IFZsYWRpbWlyIFBydXMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEFsZXhleSBQYWtodW5vdgorIyBDb3B5cmlnaHQgKGMpIDIwMDYgQm9qYW4gUmVzbmlrCisjIENvcHlyaWdodCAoYykgMjAwNiBJbHlhIFNva29sb3YKKyMgQ29weXJpZ2h0IChjKSAyMDA3IFJlbmUgUml2ZXJhCisjIENvcHlyaWdodCAoYykgMjAwOCBKdXJrbyBHb3Nwb2RuZXRpYworIworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNU1ZDIEJvb3N0IEJ1aWxkIHRvb2xzZXQgbW9kdWxlLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBBbGwgdG9vbHNldCB2ZXJzaW9ucyBuZWVkIHRvIGhhdmUgdGhlaXIgbG9jYXRpb24gZWl0aGVyIGF1dG8tZGV0ZWN0ZWQgb3IKKyMgZXhwbGljaXRseSBzcGVjaWZpZWQgZXhjZXB0IGZvciB0aGUgc3BlY2lhbCAnZGVmYXVsdCcgdmVyc2lvbiB0aGF0IGV4cGVjdHMgdGhlCisjIGVudmlyb25tZW50IHRvIGZpbmQgdGhlIG5lZWRlZCB0b29scyBvciByZXBvcnQgYW4gZXJyb3IuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgY29tbW9uIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBtYyA7CitpbXBvcnQgbWlkbCA7CitpbXBvcnQgb3MgOworaW1wb3J0IHBhdGggOworaW1wb3J0IHBjaCA7CitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IHJjIDsKK2ltcG9ydCB0b29sc2V0IDsKK2ltcG9ydCB0eXBlIDsKKworCit0eXBlLnJlZ2lzdGVyIE1BTklGRVNUIDogbWFuaWZlc3QgOworZmVhdHVyZS5mZWF0dXJlIGVtYmVkLW1hbmlmZXN0IDogb24gb2ZmIDogaW5jaWRlbnRhbCBwcm9wYWdhdGVkIDsKKwordHlwZS5yZWdpc3RlciBQREIgOiBwZGIgOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFB1YmxpYyBydWxlcy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW5pdGlhbGl6ZSBhIHNwZWNpZmljIHRvb2xzZXQgdmVyc2lvbiBjb25maWd1cmF0aW9uLiBBcyB0aGUgcmVzdWx0LCBwYXRoIHRvCisjIGNvbXBpbGVyIGFuZCwgcG9zc2libGUsIHByb2dyYW0gbmFtZXMgYXJlIHNldCB1cCwgYW5kIHdpbGwgYmUgdXNlZCB3aGVuIHRoYXQKKyMgdmVyc2lvbiBvZiBjb21waWxlciBpcyByZXF1ZXN0ZWQuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZToKKyMKKyMgICAgdXNpbmcgbXN2YyA6IDYuNSA6IGNsLmV4ZSA7CisjICAgIHVzaW5nIG1zdmMgOiA3LjAgOiBZOi9mb28vYmFyL2NsLmV4ZSA7CisjCisjIFRoZSB2ZXJzaW9uIHBhcmFtZXRlciBtYXkgYmUgb21taXRlZDoKKyMKKyMgICAgdXNpbmcgbXN2YyA6IDogWjovZm9vL2Jhci9jbC5leGUgOworIworIyBUaGUgZm9sbG93aW5nIGtleXdvcmRzIGhhdmUgc3BlY2lhbCBtZWFuaW5ncyB3aGVuIHNwZWNpZmllZCBhcyB2ZXJzaW9uczoKKyMgICAtIGFsbCAgICAgLSBhbGwgZGV0ZWN0ZWQgYnV0IG5vdCB5ZXQgdXNlZCB2ZXJzaW9ucyB3aWxsIGJlIG1hcmtlZCBhcyB1c2VkCisjICAgICAgICAgICAgICAgd2l0aCB0aGVpciBkZWZhdWx0IG9wdGlvbnMuCisjICAgLSBkZWZhdWx0IC0gdGhpcyBpcyBhbiBlcXVpdmFsZW50IHRvIGFuIGVtcHR5IHZlcnNpb24uCisjCisjIERlcGVuZGluZyBvbiBhIHN1cHBsaWVkIHZlcnNpb24sIGRldGVjdGVkIGNvbmZpZ3VyYXRpb25zIGFuZCBwcmVzZW5jZSAnY2wuZXhlJworIyBpbiB0aGUgcGF0aCBkaWZmZXJlbnQgcmVzdWx0cyBtYXkgYmUgYWNoaWV2ZWQuIFRoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzCisjIHRoZSBwb3NzaWJsZSBzY2VuYXJpb3M6CisjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RoaW5nICAgICAgICAgICAgIngueSIKKyMgUGFzc2VkICAgTm90aGluZyAgICAgICAieC55IiAgICAgICAgIGRldGVjdGVkLCAgICAgICAgICBkZXRlY3RlZCwKKyMgdmVyc2lvbiAgZGV0ZWN0ZWQgICAgICBkZXRlY3RlZCAgICAgIGNsLmV4ZSBpbiBwYXRoICAgICBjbC5leGUgaW4gcGF0aAorIworIyBkZWZhdWx0ICBFcnJvciAgICAgICAgIFVzZSAieC55IiAgICAgQ3JlYXRlICJkZWZhdWx0IiAgIFVzZSAieC55IgorIyBhbGwgICAgICBOb25lICAgICAgICAgIFVzZSBhbGwgICAgICAgTm9uZSAgICAgICAgICAgICAgIFVzZSBhbGwKKyMgeC55ICAgICAgLSAgICAgICAgICAgICBVc2UgIngueSIgICAgIC0gICAgICAgICAgICAgICAgICBVc2UgIngueSIKKyMgYS5iICAgICAgRXJyb3IgICAgICAgICBFcnJvciAgICAgICAgIENyZWF0ZSAiYS5iIiAgICAgICBDcmVhdGUgImEuYiIKKyMKKyMgIngueSIgLSByZWZlcnMgdG8gYSBkZXRlY3RlZCB2ZXJzaW9uOworIyAiYS5iIiAtIHJlZmVycyB0byBhbiB1bmRldGVjdGVkIHZlcnNpb24uCisjCisjIEZJWE1FOiBDdXJyZW50bHkgdGhlIGNvbW1hbmQgcGFyYW1ldGVyIGFuZCB0aGUgPGNvbXBpbGVyPiBwcm9wZXJ0eSBwYXJhbWV0ZXIKKyMgc2VlbSB0byBvdmVybGFwIGluIGR1dGllcy4gUmVtb3ZlIHRoaXMgZHVwbGljYXRpb24uIFRoaXMgc2VlbXMgdG8gYmUgcmVsYXRlZAorIyB0byB3aHkgc29tZW9uZSBzdGFydGVkIHByZXBhcmluZyB0byByZXBsYWNlIGluaXQgd2l0aCBjb25maWd1cmUgcnVsZXMuCisjCitydWxlIGluaXQgKAorICAgICMgVGhlIG1zdmMgdmVyc2lvbiBiZWluZyBjb25maWd1cmVkLiBXaGVuIG9taXR0ZWQgdGhlIHRvb2xzIGludm9rZWQgd2hlbiBubworICAgICMgZXhwbGljaXQgdmVyc2lvbiBpcyBnaXZlbiB3aWxsIGJlIGNvbmZpZ3VyZWQuCisgICAgdmVyc2lvbiA/CisKKyAgICAjIFRoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIHRoZSBjb21waWxlci4gSWYgbm90IHNwZWNpZmllZDoKKyAgICAjICAgLSBpZiB2ZXJzaW9uIGlzIGdpdmVuLCBkZWZhdWx0IGxvY2F0aW9uIGZvciB0aGF0IHZlcnNpb24gd2lsbCBiZQorICAgICMgICAgIHNlYXJjaGVkCisgICAgIworICAgICMgICAtIGlmIHZlcnNpb24gaXMgbm90IGdpdmVuLCBkZWZhdWx0IGxvY2F0aW9ucyBmb3IgTVNWQyA5LjAsIDguMCwgNy4xLCA3LjAKKyAgICAjICAgICBhbmQgNi4qIHdpbGwgYmUgc2VhcmNoZWQKKyAgICAjCisgICAgIyAgIC0gaWYgY29tcGlsZXIgaXMgbm90IGZvdW5kIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9ucywgUEFUSCB3aWxsIGJlCisgICAgIyAgICAgc2VhcmNoZWQuCisgICAgOiBjb21tYW5kICoKKworICAgICMgT3B0aW9ucyBtYXkgaW5jbHVkZToKKyAgICAjCisgICAgIyAgICAgQWxsIG9wdGlvbnMgc2hhcmVkIGJ5IG11bHRpcGxlIHRvb2xzZXQgdHlwZXMgYXMgaGFuZGxlZCBieSB0aGUKKyAgICAjICAgY29tbW9uLmhhbmRsZS1vcHRpb25zKCkgcnVsZSwgZS5nLiA8Y2ZsYWdzPiwgPGNvbXBpbGVmbGFncz4sIDxjeHhmbGFncz4sCisgICAgIyAgIDxmZmxhZ3M+ICYgPGxpbmtmbGFncz4uCisgICAgIworICAgICMgICA8YXNzZW1ibGVyPgorICAgICMgICA8Y29tcGlsZXI+CisgICAgIyAgIDxpZGwtY29tcGlsZXI+CisgICAgIyAgIDxsaW5rZXI+CisgICAgIyAgIDxtYy1jb21waWxlcj4KKyAgICAjICAgPHJlc291cmNlLWNvbXBpbGVyPgorICAgICMgICAgICAgRXhhY3QgdG9vbCBuYW1lcyB0byBiZSB1c2VkIGJ5IHRoaXMgbXN2YyB0b29sc2V0IGNvbmZpZ3VyYXRpb24uCisgICAgIworICAgICMgICA8Y29tcGlsZXItZmlsdGVyPgorICAgICMgICAgICAgQ29tbWFuZCB0aHJvdWdoIHdoaWNoIHRvIHBpcGUgdGhlIG91dHB1dCBvZiBydW5uaW5nIHRoZSBjb21waWxlci4KKyAgICAjICAgICBGb3IgZXhhbXBsZSB0byBwYXNzIHRoZSBvdXRwdXQgdG8gU1RMZmlsdC4KKyAgICAjCisgICAgIyAgIDxzZXR1cD4KKyAgICAjICAgICAgIEdsb2JhbCBzZXR1cCBjb21tYW5kIHRvIGludm9rZSBiZWZvcmUgcnVubmluZyBhbnkgb2YgdGhlIG1zdmMgdG9vbHMuCisgICAgIyAgICAgSXQgd2lsbCBiZSBwYXNzZWQgYWRkaXRpb25hbCBvcHRpb24gcGFyYW1ldGVycyBkZXBlbmRpbmcgb24gdGhlIGFjdHVhbAorICAgICMgICAgIHRhcmdldCBwbGF0Zm9ybS4KKyAgICAjCisgICAgIyAgIDxzZXR1cC1hbWQ2ND4KKyAgICAjICAgPHNldHVwLWkzODY+CisgICAgIyAgIDxzZXR1cC1pYTY0PgorICAgICMgICA8c2V0dXAtYXJtPgorICAgICMgICAgICAgUGxhdGZvcm0gc3BlY2lmaWMgc2V0dXAgY29tbWFuZCB0byBpbnZva2UgYmVmb3JlIHJ1bm5pbmcgYW55IG9mIHRoZQorICAgICMgICAgIG1zdmMgdG9vbHMgdXNlZCB3aGVuIGJ1aWxpbmcgYSB0YXJnZXQgZm9yIGEgc3BlY2lmaWMgcGxhdGZvcm0sIGUuZy4KKyAgICAjICAgICB3aGVuIGJ1aWxkaW5nIGEgMzIgb3IgNjQgYml0IGV4ZWN1dGFibGUuCisgICAgOiBvcHRpb25zICoKKykKK3sKKyAgICBpZiAkKGNvbW1hbmQpCisgICAgeworICAgICAgICBvcHRpb25zICs9IDxjb21tYW5kPiQoY29tbWFuZCkgOworICAgIH0KKyAgICBjb25maWd1cmUgJCh2ZXJzaW9uKSA6ICQob3B0aW9ucykgOworfQorCisKKyMgJ2NvbmZpZ3VyZScgaXMgYSBuZXdlciB2ZXJzaW9uIG9mICdpbml0Jy4gVGhlIHBhcmFtZXRlciAnY29tbWFuZCcgaXMgcGFzc2VkIGFzCisjIGEgcGFydCBvZiB0aGUgJ29wdGlvbnMnIGxpc3QuIFNlZSB0aGUgJ2luaXQnIHJ1bGUgY29tbWVudCBmb3IgbW9yZSBkZXRhaWxlZAorIyBpbmZvcm1hdGlvbi4KKyMKK3J1bGUgY29uZmlndXJlICggdmVyc2lvbiA/IDogb3B0aW9ucyAqICkKK3sKKyAgICBzd2l0Y2ggJCh2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgY2FzZSAiYWxsIiA6CisgICAgICAgICAgICBpZiAkKG9wdGlvbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICAgICAgZXJyb3JzLmVycm9yICJNU1ZDIHRvb2xzZXQgY29uZmlndXJhdGlvbjogb3B0aW9ucyBzaG91bGQgYmUiCisgICAgICAgICAgICAgICAgICAgICJlbXB0eSB3aGVuICckKHZlcnNpb24pJyBpcyBzcGVjaWZpZWQuIiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgQ29uZmlndXJlIChpLmUuIG1hcmsgYXMgdXNlZCkgYWxsIHJlZ2lzdGVyZWQgdmVyc2lvbnMuCisgICAgICAgICAgICBsb2NhbCBhbGwtdmVyc2lvbnMgPSBbICQoLnZlcnNpb25zKS5hbGwgXSA7CisgICAgICAgICAgICBpZiAhICQoYWxsLXZlcnNpb25zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICQoLmRlYnVnLWNvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFQ0hPICJub3RpY2U6IFttc3ZjLWNmZ10gQXNrZWQgdG8gY29uZmlndXJlIGFsbCByZWdpc3RlcmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIm1zdmMgdG9vbHNldCB2ZXJzaW9ucyB3aGVuIHRoZXJlIGFyZSBub25lIGN1cnJlbnRseSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkLiIgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgbG9jYWwgdiBpbiAkKGFsbC12ZXJzaW9ucykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICMgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIG5lZWQgdG8gc2tpcCBhbHJlYWR5IGNvbmZpZ3VyZWQKKyAgICAgICAgICAgICAgICAgICAgIyB2ZXJzaW9ucyBoZXJlIGFzIHRoaXMgd2lsbCByZXF1ZXN0IGNvbmZpZ3VyZS1yZWFsbHkgcnVsZQorICAgICAgICAgICAgICAgICAgICAjIHRvIGNvbmZpZ3VyZSB0aGUgdmVyc2lvbiB1c2luZyBkZWZhdWx0IG9wdGlvbnMgd2hpY2ggd2lsbAorICAgICAgICAgICAgICAgICAgICAjIGluIHR1cm4gY2F1c2UgaXQgdG8gc2ltcGx5IGRvIG5vdGhpbmcgaW4gY2FzZSB0aGUgdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAjIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlLXJlYWxseSAkKHYpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSAiZGVmYXVsdCIgOgorICAgICAgICAgICAgY29uZmlndXJlLXJlYWxseSA6ICQob3B0aW9ucykgOworCisgICAgICAgIGNhc2UgKiA6CisgICAgICAgICAgICBjb25maWd1cmUtcmVhbGx5ICQodmVyc2lvbikgOiAkKG9wdGlvbnMpIDsKKyAgICB9Cit9CisKKworIyBTZXRzIHVwIGZsYWcgZGVmaW5pdGlvbnMgZGVwZW5kZW50IG9uIHRoZSBjb21waWxlciB2ZXJzaW9uIHVzZWQuCisjIC0gJ3ZlcnNpb24nIGlzIHRoZSB2ZXJzaW9uIG9mIGNvbXBpbGVyIGluIE4uTSBmb3JtYXQuCisjIC0gJ2NvbmRpdGlvbnMnIGlzIHRoZSBwcm9wZXJ0eSBzZXQgdG8gYmUgdXNlZCBhcyBmbGFnIGNvbmRpdGlvbnMuCisjIC0gJ3Rvb2xzZXQnIGlzIHRoZSB0b29sc2V0IGZvciB3aGljaCBmbGFnIHNldHRpbmdzIGFyZSB0byBiZSBkZWZpbmVkLgorIyAgIFRoaXMgbWFrZXMgdGhlIHJ1bGUgcmV1c2FibGUgZm9yIG90aGVyIG1zdmMtb3B0aW9uLWNvbXBhdGlibGUgY29tcGlsZXJzLgorIworcnVsZSBjb25maWd1cmUtdmVyc2lvbi1zcGVjaWZpYyAoIHRvb2xzZXQgOiB2ZXJzaW9uIDogY29uZGl0aW9ucyApCit7CisgICAgdG9vbHNldC5wdXNoLWNoZWNraW5nLWZvci1mbGFncy1tb2R1bGUgdW5jaGVja2VkIDsKKyAgICAjIFN0YXJ0aW5nIHdpdGggdmVyc2lvbnMgNy4wLCB0aGUgbXN2YyBjb21waWxlciBoYXZlIHRoZSAvWmM6Zm9yU2NvcGUgYW5kCisgICAgIyAvWmM6d2NoYXJfdCBvcHRpb25zIHRoYXQgaW1wcm92ZSBDKysgc3RhbmRhcmQgY29uZm9ybWFuY2UsIGJ1dCB0aG9zZQorICAgICMgb3B0aW9ucyBhcmUgb2ZmIGJ5IGRlZmF1bHQuIElmIHdlIGFyZSBzdXJlIHRoYXQgdGhlIG1zdmMgdmVyc2lvbiBpcyBhdAorICAgICMgNy4qLCBhZGQgdGhvc2Ugb3B0aW9ucyBleHBsaWNpdGx5LiBXZSBjYW4gYmUgc3VyZSBlaXRoZXIgaWYgdXNlciBzcGVjaWZpZWQKKyAgICAjIHZlcnNpb24gNy4qIGV4cGxpY2l0bHkgb3IgaWYgd2UgYXV0by1kZXRlY3RlZCB0aGUgdmVyc2lvbiBvdXJzZWx2ZXMuCisgICAgaWYgISBbIE1BVENIIF4oNlxcLikgOiAkKHZlcnNpb24pIF0KKyAgICB7CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5jb21waWxlIENGTEFHUyAkKGNvbmRpdGlvbnMpIDogL1pjOmZvclNjb3BlIC9aYzp3Y2hhcl90IDsKKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUuYysrIEMrK0ZMQUdTICQoY29uZGl0aW9ucykgOiAvd2Q0Njc1IDsKKworICAgICAgICAjIEV4cGxpY2l0bHkgZGlzYWJsZSB0aGUgJ2Z1bmN0aW9uIGlzIGRlcHJlY2F0ZWQnIHdhcm5pbmcuIFNvbWUgbXN2YworICAgICAgICAjIHZlcnNpb25zIGhhdmUgYSBidWcsIGNhdXNpbmcgdGhlbSB0byBlbWl0IHRoZSBkZXByZWNhdGlvbiB3YXJuaW5nIGV2ZW4KKyAgICAgICAgIyB3aXRoIC9XMC4KKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUgQ0ZMQUdTICQoY29uZGl0aW9ucykvPHdhcm5pbmdzPm9mZiA6IC93ZDQ5OTYgOworCisgICAgICAgIGlmIFsgTUFUQ0ggXihbNzhdXFwuKSA6ICQodmVyc2lvbikgXQorICAgICAgICB7CisgICAgICAgICAgICAjIDY0LWJpdCBjb21wYXRpYmlsaXR5IHdhcm5pbmcgZGVwcmVjYXRlZCBzaW5jZSA5LjAsIHNlZQorICAgICAgICAgICAgIyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkveXQ0eHc4ZmguYXNweAorICAgICAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUgQ0ZMQUdTICQoY29uZGl0aW9ucykvPHdhcm5pbmdzPmFsbCA6IC9XcDY0IDsKKyAgICAgICAgfQorICAgIH0KKworICAgICMKKyAgICAjIFByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpbWl6YXRpb24uCisgICAgIworCisgICAgaWYgWyBNQVRDSCBeKFs2N10pIDogJCh2ZXJzaW9uKSBdCisgICAgeworICAgICAgICAjIDguMCBkZXByZWNhdGVzIHNvbWUgb2YgdGhlIG9wdGlvbnMuCisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5jb21waWxlIENGTEFHUyAkKGNvbmRpdGlvbnMpLzxvcHRpbWl6YXRpb24+c3BlZWQgJChjb25kaXRpb25zKS88b3B0aW1pemF0aW9uPnNwYWNlIDogL09naXkgL0dzIDsKKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUgQ0ZMQUdTICQoY29uZGl0aW9ucykvPG9wdGltaXphdGlvbj5zcGVlZCA6IC9PdCA7CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5jb21waWxlIENGTEFHUyAkKGNvbmRpdGlvbnMpLzxvcHRpbWl6YXRpb24+c3BhY2UgOiAvT3MgOworCisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5jb21waWxlIENGTEFHUyAkKGNvbmRpdGlvbnMpLyQoLmNwdS1hcmNoLWkzODYpLzxpbnN0cnVjdGlvbi1zZXQ+IDogL0dCIDsKKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUgQ0ZMQUdTICQoY29uZGl0aW9ucykvJCguY3B1LWFyY2gtaTM4NikvPGluc3RydWN0aW9uLXNldD5pNDg2IDogL0c0IDsKKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUgQ0ZMQUdTICQoY29uZGl0aW9ucykvJCguY3B1LWFyY2gtaTM4NikvPGluc3RydWN0aW9uLXNldD4kKC5jcHUtdHlwZS1nNSkgOiAvRzUgOworICAgICAgICB0b29sc2V0LmZsYWdzICQodG9vbHNldCkuY29tcGlsZSBDRkxBR1MgJChjb25kaXRpb25zKS8kKC5jcHUtYXJjaC1pMzg2KS88aW5zdHJ1Y3Rpb24tc2V0PiQoLmNwdS10eXBlLWc2KSA6IC9HNiA7CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5jb21waWxlIENGTEFHUyAkKGNvbmRpdGlvbnMpLyQoLmNwdS1hcmNoLWkzODYpLzxpbnN0cnVjdGlvbi1zZXQ+JCguY3B1LXR5cGUtZzcpIDogL0c3IDsKKworICAgICAgICAjIEltcHJvdmUgZmxvYXRpbmctcG9pbnQgYWNjdXJhY3kuIE90aGVyd2lzZSwgc29tZSBvZiBDKysgQm9vc3QncyAibWF0aCIKKyAgICAgICAgIyB0ZXN0cyB3aWxsIGZhaWwuCisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5jb21waWxlIENGTEFHUyAkKGNvbmRpdGlvbnMpIDogL09wIDsKKworICAgICAgICAjIDcuMSBhbmQgYmVsb3cgaGF2ZSBzaW5nbGUtdGhyZWFkZWQgc3RhdGljIFJUTC4KKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUgQ0ZMQUdTICQoY29uZGl0aW9ucykvPHJ1bnRpbWUtZGVidWdnaW5nPm9mZi88cnVudGltZS1saW5rPnN0YXRpYy88dGhyZWFkaW5nPnNpbmdsZSA6IC9NTCA7CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5jb21waWxlIENGTEFHUyAkKGNvbmRpdGlvbnMpLzxydW50aW1lLWRlYnVnZ2luZz5vbi88cnVudGltZS1saW5rPnN0YXRpYy88dGhyZWFkaW5nPnNpbmdsZSA6IC9NTGQgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAjIDguMCBhbmQgYWJvdmUgYWRkcyBzb21lIG1vcmUgb3B0aW9ucy4KKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUgQ0ZMQUdTICQoY29uZGl0aW9ucykvJCguY3B1LWFyY2gtYW1kNjQpLzxpbnN0cnVjdGlvbi1zZXQ+IDogL2Zhdm9yOmJsZW5kIDsKKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUgQ0ZMQUdTICQoY29uZGl0aW9ucykvJCguY3B1LWFyY2gtYW1kNjQpLzxpbnN0cnVjdGlvbi1zZXQ+JCguY3B1LXR5cGUtZW02NHQpIDogL2Zhdm9yOkVNNjRUIDsKKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUgQ0ZMQUdTICQoY29uZGl0aW9ucykvJCguY3B1LWFyY2gtYW1kNjQpLzxpbnN0cnVjdGlvbi1zZXQ+JCguY3B1LXR5cGUtYW1kNjQpIDogL2Zhdm9yOkFNRDY0IDsKKworICAgICAgICAjIDguMCBhbmQgYWJvdmUgb25seSBoYXMgbXVsdGktdGhyZWFkZWQgc3RhdGljIFJUTC4KKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmNvbXBpbGUgQ0ZMQUdTICQoY29uZGl0aW9ucykvPHJ1bnRpbWUtZGVidWdnaW5nPm9mZi88cnVudGltZS1saW5rPnN0YXRpYy88dGhyZWFkaW5nPnNpbmdsZSA6IC9NVCA7CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5jb21waWxlIENGTEFHUyAkKGNvbmRpdGlvbnMpLzxydW50aW1lLWRlYnVnZ2luZz5vbi88cnVudGltZS1saW5rPnN0YXRpYy88dGhyZWFkaW5nPnNpbmdsZSA6IC9NVGQgOworCisgICAgICAgICMgU3BlY2lmeSB0YXJnZXQgbWFjaGluZSB0eXBlIHNvIHRoZSBsaW5rZXIgd2lsbCBub3QgbmVlZCB0byBndWVzcy4KKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmxpbmsgTElOS0ZMQUdTICQoY29uZGl0aW9ucykvJCguY3B1LWFyY2gtYW1kNjQpIDogL01BQ0hJTkU6WDY0IDsKKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmxpbmsgTElOS0ZMQUdTICQoY29uZGl0aW9ucykvJCguY3B1LWFyY2gtaTM4NikgIDogL01BQ0hJTkU6WDg2IDsKKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmxpbmsgTElOS0ZMQUdTICQoY29uZGl0aW9ucykvJCguY3B1LWFyY2gtaWE2NCkgIDogL01BQ0hJTkU6SUE2NCA7CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgJCh0b29sc2V0KS5saW5rIExJTktGTEFHUyAkKGNvbmRpdGlvbnMpLyQoLmNwdS1hcmNoLWFybSkgICA6IC9NQUNISU5FOkFSTSA7CisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBtYW5pZmVzdCB3aWxsIGJlIGdlbmVyYXRlZCBldmVuIGlmIHRoZXJlIGlzIG5vCisgICAgICAgICMgZGVwZW5kZW5jaWVzIHRvIHB1dCB0aGVyZS4KKyAgICAgICAgdG9vbHNldC5mbGFncyAkKHRvb2xzZXQpLmxpbmsgTElOS0ZMQUdTICQoY29uZGl0aW9ucykgOiAvTUFOSUZFU1QgOworICAgIH0KKyAgICB0b29sc2V0LnBvcC1jaGVja2luZy1mb3ItZmxhZ3MtbW9kdWxlIDsKK30KKworCisjIFJlZ2lzdGVycyB0aGlzIHRvb2xzZXQgaW5jbHVkaW5nIGFsbCBvZiBpdHMgZmxhZ3MsIGZlYXR1cmVzICYgZ2VuZXJhdG9ycy4gRG9lcworIyBub3RoaW5nIG9uIHJlcGVhdGVkIGNhbGxzLgorIworcnVsZSByZWdpc3Rlci10b29sc2V0ICggKQoreworICAgIGlmICEgbXN2YyBpbiBbIGZlYXR1cmUudmFsdWVzIHRvb2xzZXQgXQorICAgIHsKKyAgICAgICAgcmVnaXN0ZXItdG9vbHNldC1yZWFsbHkgOworICAgIH0KK30KKworCisjIERlY2xhcmUgYWN0aW9uIGZvciBjcmVhdGluZyBzdGF0aWMgbGlicmFyaWVzLiBJZiBsaWJyYXJ5IGV4aXN0cywgcmVtb3ZlIGl0CisjIGJlZm9yZSBhZGRpbmcgZmlsZXMuIFNlZQorIyBodHRwOi8vYXJ0aWNsZS5nbWFuZS5vcmcvZ21hbmUuY29tcC5saWIuYm9vc3QuYnVpbGQvNDI0MSBmb3IgcmF0aW9uYWxlLgoraWYgWyBvcy5uYW1lIF0gaW4gTlQKK3sKKyAgICAjIFRoZSAnREVMJyBjb21tYW5kIHdvdWxkIGlzc3VlIGEgbWVzc2FnZSB0byBzdGRvdXQgaWYgdGhlIGZpbGUgZG9lcyBub3QKKyAgICAjIGV4aXN0LCBzbyBuZWVkIGEgY2hlY2suCisgICAgYWN0aW9ucyBhcmNoaXZlCisgICAgeworICAgICAgICBpZiBleGlzdCAiJCg8WzFdKSIgREVMICIkKDxbMV0pIgorICAgICAgICAkKC5MRCkgJChBUk9QVElPTlMpIC9vdXQ6IiQoPFsxXSkiIEAiQCgkKDxbMV06VykucnNwOkU9JCgubmwpIiQoPikiICQoLm5sKSQoTElCUkFSSUVTX01FTlRJT05FRF9CWV9GSUxFKSAkKC5ubCkiJChMSUJSQVJZX09QVElPTikkKEZJTkRMSUJTX1NUKS5saWIiICQoLm5sKSIkKExJQlJBUllfT1BUSU9OKSQoRklORExJQlNfU0EpLmxpYiIpIgorICAgIH0KK30KK2Vsc2UKK3sKKyAgICBhY3Rpb25zIGFyY2hpdmUKKyAgICB7CisgICAgICAgICQoLlJNKSAiJCg8WzFdKSIKKyAgICAgICAgJCguTEQpICQoQVJPUFRJT05TKSAvb3V0OiIkKDxbMV0pIiBAIkAoJCg8WzFdOlcpLnJzcDpFPSQoLm5sKSIkKD4pIiAkKC5ubCkkKExJQlJBUklFU19NRU5USU9ORURfQllfRklMRSkgJCgubmwpIiQoTElCUkFSWV9PUFRJT04pJChGSU5ETElCU19TVCkubGliIiAkKC5ubCkiJChMSUJSQVJZX09QVElPTikkKEZJTkRMSUJTX1NBKS5saWIiKSIKKyAgICB9Cit9CisKKworIyBGb3IgdGhlIGFzc2VtYmxlciB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHR1cm5lZCBvbiBieSBkZWZhdWx0OgorIworIyAgIC1acDQgICBhbGlnbiBzdHJ1Y3R1cmVzIHRvIDQgYnl0ZXMKKyMgICAtQ3AgICAgcHJlc2VydmUgY2FzZSBvZiB1c2VyIGlkZW50aWZpZXJzCisjICAgLUN4ICAgIHByZXNlcnZlIGNhc2UgaW4gcHVibGljcywgZXh0ZXJucworIworYWN0aW9ucyBjb21waWxlLmFzbQoreworICAgICQoLkFTTSkgLWMgLVpwNCAtQ3AgLUN4IC1EJChERUZJTkVTKSAkKEFTTUZMQUdTKSAkKFVTRVJfQVNNRkxBR1MpIC1GbyAiJCg8OlcpIiAiJCg+OlcpIgorfQorCisKK3J1bGUgY29tcGlsZS5jICggdGFyZ2V0cyArIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBDKytGTEFHUyBvbiAkKHRhcmdldHNbMV0pID0gOworICAgIGdldC1yc3BsaW5lICQodGFyZ2V0cykgOiAtVEMgOworICAgIGNvbXBpbGUtYy1jKysgJCg8KSA6ICQoPikgWyBvbiAkKDwpIHJldHVybiAkKFBDSF9GSUxFKSBdIFsgb24gJCg8KSByZXR1cm4gJChQQ0hfSEVBREVSKSBdIDsKK30KKworCitydWxlIGNvbXBpbGUuYy5wcmVwcm9jZXNzICggdGFyZ2V0cyArIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBDKytGTEFHUyBvbiAkKHRhcmdldHNbMV0pID0gOworICAgIGdldC1yc3BsaW5lICQodGFyZ2V0cykgOiAtVEMgOworICAgIHByZXByb2Nlc3MtYy1jKysgJCg8KSA6ICQoPikgWyBvbiAkKDwpIHJldHVybiAkKFBDSF9GSUxFKSBdIFsgb24gJCg8KSByZXR1cm4gJChQQ0hfSEVBREVSKSBdIDsKK30KKworCitydWxlIGNvbXBpbGUuYy5wY2ggKCB0YXJnZXRzICsgOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIEMrK0ZMQUdTIG9uICQodGFyZ2V0c1sxXSkgPSA7CisgICAgZ2V0LXJzcGxpbmUgJCh0YXJnZXRzWzFdKSA6IC1UQyA7CisgICAgZ2V0LXJzcGxpbmUgJCh0YXJnZXRzWzJdKSA6IC1UQyA7CisgICAgbG9jYWwgcGNoLXNvdXJjZSA9IFsgb24gJCg8KSByZXR1cm4gJChQQ0hfU09VUkNFKSBdIDsKKyAgICBpZiAkKHBjaC1zb3VyY2UpCisgICAgeworICAgICAgICBERVBFTkRTICQoPCkgOiAkKHBjaC1zb3VyY2UpIDsKKyAgICAgICAgY29tcGlsZS1jLWMrKy1wY2gtcyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSAkKHBjaC1zb3VyY2UpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29tcGlsZS1jLWMrKy1wY2ggJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOworICAgIH0KK30KKwordG9vbHNldC5mbGFncyBtc3ZjIFlMT1BUSU9OIDogIi1ZbCIgOworCisjIEFjdGlvbiBmb3IgcnVubmluZyB0aGUgQy9DKysgY29tcGlsZXIgd2l0aG91dCB1c2luZyBwcmVjb21waWxlZCBoZWFkZXJzLgorIworIyBXQVJOSU5HOiBTeW5jaHJvbml6ZSBhbnkgY2hhbmdlcyB0aGlzIGluIGFjdGlvbiB3aXRoIGludGVsLXdpbgorIworIyBOb3RlcyByZWdhcmRpbmcgUERCIGdlbmVyYXRpb24sIGZvciB3aGVuIHdlIHVzZQorIyA8ZGVidWctc3ltYm9scz5vbi88ZGVidWctc3RvcmU+ZGF0YWJhc2U6CisjCisjIDEuIFBEQl9DRkxBRyBpcyBvbmx5IHNldCBmb3IgPGRlYnVnLXN5bWJvbHM+b24vPGRlYnVnLXN0b3JlPmRhdGFiYXNlLCBlbnN1cmluZworIyAgICB0aGF0IHRoZSAvRmQgZmxhZyBpcyBkcm9wcGVkIGlmIFBEQl9DRkxBRyBpcyBlbXB0eS4KKyMKKyMgMi4gV2hlbiBjb21waWxpbmcgZXhlY3V0YWJsZXMncyBzb3VyY2UgZmlsZXMsIFBEQl9OQU1FIGlzIHNldCBvbiBhIHBlci1zb3VyY2UKKyMgICAgZmlsZSBiYXNpcyBieSBydWxlIGNvbXBpbGUtYy1jKysuIFRoZSBsaW5rZXIgd2lsbCBwdWxsIHRoZXNlIGludG8gdGhlCisjICAgIGV4ZWN1dGFibGUncyBQREIuCisjCisjIDMuIFdoZW4gY29tcGlsaW5nIGxpYnJhcnkncyBzb3VyY2UgZmlsZXMsIFBEQl9OQU1FIGlzIHVwZGF0ZWQgdG8gPGxpYm5hbWU+LnBkYgorIyAgICBmb3IgZWFjaCBzb3VyY2UgZmlsZSBieSBydWxlIGFyY2hpdmUsIGFzIGluIHRoaXMgY2FzZSBjb21waWxlciBtdXN0IGJlIHVzZWQKKyMgICAgdG8gY3JlYXRlIGEgc2luZ2xlIFBEQiBmb3Igb3VyIGxpYnJhcnkuCisjCithY3Rpb25zIGNvbXBpbGUtYy1jKysgYmluZCBQREJfTkFNRQoreworICAgICQoLkNDKSBAIkAoJCg8WzFdOlcpLnJzcDpFPSIkKD5bMV06VykiIC1GbyIkKDxbMV06VykiICQoUERCX0NGTEFHKSIkKFBEQl9OQU1FKSIgLVl1IiQoPlszXTpEPSkiIC1GcCIkKD5bMl06VykiICQoQ0NfUlNQTElORSkpIiAkKC5DQy5GSUxURVIpCit9CisKK2FjdGlvbnMgcHJlcHJvY2Vzcy1jLWMrKyBiaW5kIFBEQl9OQU1FCit7CisgICAgJCguQ0MpIEAiQCgkKDxbMV06VykucnNwOkU9IiQoPlsxXTpXKSIgLUUgJChQREJfQ0ZMQUcpIiQoUERCX05BTUUpIiAtWXUiJCg+WzNdOkQ9KSIgLUZwIiQoPlsyXTpXKSIgJChDQ19SU1BMSU5FKSkiID4iJCg8WzFdOlcpIgorfQorCitydWxlIGNvbXBpbGUtYy1jKysgKCB0YXJnZXRzICsgOiBzb3VyY2VzICogKQoreworICAgIERFUEVORFMgJCg8WzFdKSA6IFsgb24gJCg8WzFdKSByZXR1cm4gJChQQ0hfSEVBREVSKSBdIDsKKyAgICBERVBFTkRTICQoPFsxXSkgOiBbIG9uICQoPFsxXSkgcmV0dXJuICQoUENIX0ZJTEUpIF0gOworICAgIFBEQl9OQU1FIG9uICQoPCkgPSAkKDxbMV06Uz0ucGRiKSA7CisgICAgTE9DQVRFIG9uICQoPFsxXTpTPS5wZGIpID0gWyBvbiAkKDxbMV0pIHJldHVybiAkKExPQ0FURSkgXSA7Cit9CisKK3J1bGUgcHJlcHJvY2Vzcy1jLWMrKyAoIHRhcmdldHMgKyA6IHNvdXJjZXMgKiApCit7CisgICAgREVQRU5EUyAkKDxbMV0pIDogWyBvbiAkKDxbMV0pIHJldHVybiAkKFBDSF9IRUFERVIpIF0gOworICAgIERFUEVORFMgJCg8WzFdKSA6IFsgb24gJCg8WzFdKSByZXR1cm4gJChQQ0hfRklMRSkgXSA7CisgICAgUERCX05BTUUgb24gJCg8KSA9ICQoPDpTPS5wZGIpIDsKKyAgICBMT0NBVEUgb24gJCg8WzFdOlM9LnBkYikgPSBbIG9uICQoPFsxXSkgcmV0dXJuICQoTE9DQVRFKSBdIDsKK30KKworIyBBY3Rpb24gZm9yIHJ1bm5pbmcgdGhlIEMvQysrIGNvbXBpbGVyIHVzaW5nIHByZWNvbXBpbGVkIGhlYWRlcnMuIEluIGFkZGl0aW9uCisjIHRvIHdoYXRldmVyIGVsc2UgaXQgbmVlZHMgdG8gY29tcGlsZSwgdGhpcyBhY3Rpb24gYWxzbyBhZGRzIGEgdGVtcG9yYXJ5IHNvdXJjZQorIyAuY3BwIGZpbGUgdXNlZCB0byBjb21waWxlIHRoZSBwcmVjb21waWxlZCBoZWFkZXJzIHRoZW1zZWx2ZXMuCisjCisjIFRoZSBnbG9iYWwgLmVzY2FwZWQtZG91YmxlLXF1b3RlIHZhcmlhYmxlIGlzIHVzZWQgdG8gYXZvaWQgbWVzc2luZyB1cCBFbWFjcworIyBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBtZXNzeSBOLXF1b3RlZCBjb2RlIGJlbG93LgorYWN0aW9ucyBjb21waWxlLWMtYysrLXBjaAoreworICAgICQoLkNDKSBAIkAoJCg8WzFdOlcpLnJzcDpFPSIkKD5bMl06VykiIC1GbyIkKDxbMl06VykiIC1ZYyIkKD5bMV06RD0pIiAkKFlMT1BUSU9OKSJfX2JqYW1fcGNoX3N5bWJvbF8kKD5bMV06RD0pIiAtRnAiJCg8WzFdOlcpIiAkKENDX1JTUExJTkUpKSIgIkAoJCg8WzFdOlcpLmNwcDpFPSNpbmNsdWRlICQoLmVzY2FwZWQtZG91YmxlLXF1b3RlKSQoPlsxXTpEPSkkKC5lc2NhcGVkLWRvdWJsZS1xdW90ZSkkKC5ubCkpIiAkKC5DQy5GSUxURVIpCit9CisKKworIyBBY3Rpb24gZm9yIHJ1bm5pbmcgdGhlIEMvQysrIGNvbXBpbGVyIHVzaW5nIHByZWNvbXBpbGVkIGhlYWRlcnMuIEFuIGFscmVhZHkKKyMgYnVpbHQgc291cmNlIGZpbGUgZm9yIGNvbXBpbGluZyB0aGUgcHJlY29tcGlsZWQgaGVhZGVycyBpcyBleHBlY3RlZCB0byBiZQorIyBnaXZlbiBhcyBvbmUgb2YgdGhlIHNvdXJjZSBwYXJhbWV0ZXJzLgorYWN0aW9ucyBjb21waWxlLWMtYysrLXBjaC1zCit7CisgICAgJCguQ0MpIEAiQCgkKDxbMV06VykucnNwOkU9IiQoPlsyXTpXKSIgLUZvIiQoPFsyXTpXKSIgLVljIiQoPlsxXTpEPSkiICQoWUxPUFRJT04pIl9fYmphbV9wY2hfc3ltYm9sXyQoPlsxXTpEPSkiIC1GcCIkKDxbMV06VykiICQoQ0NfUlNQTElORSkpIiAkKC5DQy5GSUxURVIpCit9CisKKworcnVsZSBjb21waWxlLmMrKyAoIHRhcmdldHMgKyA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgZ2V0LXJzcGxpbmUgJCh0YXJnZXRzKSA6IC1UUCA7CisgICAgY29tcGlsZS1jLWMrKyAkKDwpIDogJCg+KSBbIG9uICQoPCkgcmV0dXJuICQoUENIX0ZJTEUpIF0gWyBvbiAkKDwpIHJldHVybiAkKFBDSF9IRUFERVIpIF0gOworfQorCitydWxlIGNvbXBpbGUuYysrLnByZXByb2Nlc3MgKCB0YXJnZXRzICsgOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIGdldC1yc3BsaW5lICQodGFyZ2V0cykgOiAtVFAgOworICAgIHByZXByb2Nlc3MtYy1jKysgJCg8KSA6ICQoPikgWyBvbiAkKDwpIHJldHVybiAkKFBDSF9GSUxFKSBdIFsgb24gJCg8KSByZXR1cm4gJChQQ0hfSEVBREVSKSBdIDsKK30KKworCitydWxlIGNvbXBpbGUuYysrLnBjaCAoIHRhcmdldHMgKyA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgZ2V0LXJzcGxpbmUgJCh0YXJnZXRzWzFdKSA6IC1UUCA7CisgICAgZ2V0LXJzcGxpbmUgJCh0YXJnZXRzWzJdKSA6IC1UUCA7CisgICAgbG9jYWwgcGNoLXNvdXJjZSA9IFsgb24gJCg8KSByZXR1cm4gJChQQ0hfU09VUkNFKSBdIDsKKyAgICBpZiAkKHBjaC1zb3VyY2UpCisgICAgeworICAgICAgICBERVBFTkRTICQoPCkgOiAkKHBjaC1zb3VyY2UpIDsKKyAgICAgICAgY29tcGlsZS1jLWMrKy1wY2gtcyAkKHRhcmdldHMpIDogJChzb3VyY2VzKSAkKHBjaC1zb3VyY2UpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29tcGlsZS1jLWMrKy1wY2ggJCh0YXJnZXRzKSA6ICQoc291cmNlcykgOworICAgIH0KK30KKworCisjIFNlZSBtaWRsLmphbSBmb3IgZGV0YWlscy4KKyMKK2FjdGlvbnMgY29tcGlsZS5pZGwKK3sKKyAgICAkKC5JREwpIC9ub2xvZ28gQCJAKCQoPFsxXTpXKS5yc3A6RT0kKC5ubCkiJCg+OlcpIiAkKC5ubCktRCQoREVGSU5FUykgJCgubmwpIi1JJChJTkNMVURFUzpXKSIgJCgubmwpLVUkKFVOREVGUykgJCgubmwpJChNSURMRkxBR1MpICQoLm5sKS90bGIgIiQoPFsxXTpXKSIgJCgubmwpL2ggIiQoPFsyXTpXKSIgJCgubmwpL2lpZCAiJCg8WzNdOlcpIiAkKC5ubCkvcHJveHkgIiQoPFs0XTpXKSIgJCgubmwpL2RsbGRhdGEgIiQoPFs1XTpXKSIpIgorICAgICQoLlRPVUNIX0ZJTEUpICIkKDxbNF06VykiCisgICAgJCguVE9VQ0hfRklMRSkgIiQoPFs1XTpXKSIKK30KKworCithY3Rpb25zIGNvbXBpbGUubWMKK3sKKyAgICAkKC5NQykgJChNQ0ZMQUdTKSAtaCAiJCg8WzFdOkRXKSIgLXIgIiQoPFsyXTpEVykiICIkKD46VykiCit9CisKKworYWN0aW9ucyBjb21waWxlLnJjCit7CisgICAgJCguUkMpIC1sIDB4NDA5IC1VJChVTkRFRlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTOlcpIiAtZm8gIiQoPDpXKSIgIiQoPjpXKSIKK30KKworCitydWxlIGxpbmsgKCB0YXJnZXRzICsgOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIGlmIDxlbWJlZC1tYW5pZmVzdD5vbiBpbiAkKHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBtc3ZjLm1hbmlmZXN0ICQodGFyZ2V0cykgOiAkKHNvdXJjZXMpIDogJChwcm9wZXJ0aWVzKSA7CisgICAgfQorfQorCitydWxlIGxpbmsuZGxsICggdGFyZ2V0cyArIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBERVBFTkRTICQoPCkgOiBbIG9uICQoPCkgcmV0dXJuICQoREVGX0ZJTEUpIF0gOworICAgIGlmIDxlbWJlZC1tYW5pZmVzdD5vbiBpbiAkKHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBtc3ZjLm1hbmlmZXN0LmRsbCAkKHRhcmdldHMpIDogJChzb3VyY2VzKSA6ICQocHJvcGVydGllcykgOworICAgIH0KK30KKworIyBJbmNyZW1lbnRhbCBsaW5raW5nIGEgRExMIGNhdXNlcyBubyBlbmQgb2YgcHJvYmxlbXM6IGlmIHRoZSBhY3R1YWwgZXhwb3J0cyBkbworIyBub3QgY2hhbmdlLCB0aGUgaW1wb3J0IC5saWIgZmlsZSBpcyBuZXZlciB1cGRhdGVkLiBUaGVyZWZvcmUsIHRoZSAubGliIGlzCisjIGFsd2F5cyBvdXQtb2YtZGF0ZSBhbmQgZ2V0cyByZWJ1aWx0IGV2ZXJ5IHRpbWUuIEkgYW0gbm90IHN1cmUgdGhhdCBpbmNyZW1lbnRhbAorIyBsaW5raW5nIGlzIHN1Y2ggYSBncmVhdCBpZGVhIGluIGdlbmVyYWwsIGJ1dCBpbiB0aGlzIGNhc2UgSSBhbSBzdXJlIHdlIGRvIG5vdAorIyB3YW50IGl0LgorCisjIFdpbmRvd3MgbWFuaWZlc3QgaXMgYSBuZXcgd2F5IHRvIHNwZWNpZnkgZGVwZW5kZW5jaWVzIG9uIG1hbmFnZWQgRG90TmV0CisjIGFzc2VtYmxpZXMgYW5kIFdpbmRvd3MgbmF0aXZlIERMTHMuIFRoZSBtYW5pZmVzdHMgYXJlIGVtYmVkZGVkIGFzIHJlc291cmNlcworIyBhbmQgYXJlIHVzZWZ1bCBpbiBhbnkgUEUgdGFyZ2V0IChib3RoIERMTCBhbmQgRVhFKS4KKworaWYgWyBvcy5uYW1lIF0gaW4gTlQKK3sKKyAgICBhY3Rpb25zIGxpbmsgYmluZCBERUZfRklMRSBMSUJSQVJJRVNfTUVOVElPTkVEX0JZX0ZJTEUKKyAgICB7CisgICAgICAgICQoLkxEKSAkKExJTktGTEFHUykgL291dDoiJCg8WzFdOlcpIiAvTElCUEFUSDoiJChMSU5LUEFUSDpXKSIgJChPUFRJT05TKSBAIkAoJCg8WzFdOlcpLnJzcDpFPSQoLm5sKSIkKD4pIiAkKC5ubCkkKExJQlJBUklFU19NRU5USU9ORURfQllfRklMRSkgJCgubmwpJChMSUJSQVJJRVMpICQoLm5sKSIkKExJQlJBUllfT1BUSU9OKSQoRklORExJQlNfU1QpLmxpYiIgJCgubmwpIiQoTElCUkFSWV9PUFRJT04pJChGSU5ETElCU19TQSkubGliIikiCisgICAgICAgIGlmICVFUlJPUkxFVkVMJSBORVEgMCBFWElUICVFUlJPUkxFVkVMJQorICAgIH0KKworICAgIGFjdGlvbnMgbWFuaWZlc3QKKyAgICB7CisgICAgICAgIGlmIGV4aXN0ICIkKDxbMV0pLm1hbmlmZXN0IiAoCisgICAgICAgICAgICAkKC5NVCkgLW1hbmlmZXN0ICIkKDxbMV0pLm1hbmlmZXN0IiAiLW91dHB1dHJlc291cmNlOiQoPFsxXSk7MSIKKyAgICAgICAgKQorICAgIH0KKworICAgIGFjdGlvbnMgbGluay5kbGwgYmluZCBERUZfRklMRSBMSUJSQVJJRVNfTUVOVElPTkVEX0JZX0ZJTEUKKyAgICB7CisgICAgICAgICQoLkxEKSAvRExMICQoTElOS0ZMQUdTKSAvb3V0OiIkKDxbMV06VykiIC9JTVBMSUI6IiQoPFsyXTpXKSIgL0xJQlBBVEg6IiQoTElOS1BBVEg6VykiIC9kZWY6IiQoREVGX0ZJTEUpIiAkKE9QVElPTlMpIEAiQCgkKDxbMV06VykucnNwOkU9JCgubmwpIiQoPikiICQoLm5sKSQoTElCUkFSSUVTX01FTlRJT05FRF9CWV9GSUxFKSAkKC5ubCkkKExJQlJBUklFUykgJCgubmwpIiQoTElCUkFSWV9PUFRJT04pJChGSU5ETElCU19TVCkubGliIiAkKC5ubCkiJChMSUJSQVJZX09QVElPTikkKEZJTkRMSUJTX1NBKS5saWIiKSIKKyAgICAgICAgaWYgJUVSUk9STEVWRUwlIE5FUSAwIEVYSVQgJUVSUk9STEVWRUwlCisgICAgfQorCisgICAgYWN0aW9ucyBtYW5pZmVzdC5kbGwKKyAgICB7CisgICAgICAgIGlmIGV4aXN0ICIkKDxbMV0pLm1hbmlmZXN0IiAoCisgICAgICAgICAgICAkKC5NVCkgLW1hbmlmZXN0ICIkKDxbMV0pLm1hbmlmZXN0IiAiLW91dHB1dHJlc291cmNlOiQoPFsxXSk7MiIKKyAgICAgICAgKQorICAgIH0KK30KK2Vsc2UKK3sKKyAgICBhY3Rpb25zIGxpbmsgYmluZCBERUZfRklMRSBMSUJSQVJJRVNfTUVOVElPTkVEX0JZX0ZJTEUKKyAgICB7CisgICAgICAgICQoLkxEKSAkKExJTktGTEFHUykgL291dDoiJCg8WzFdOlcpIiAvTElCUEFUSDoiJChMSU5LUEFUSDpXKSIgJChPUFRJT05TKSBAIkAoJCg8WzFdOlcpLnJzcDpFPSQoLm5sKSIkKD4pIiAkKC5ubCkkKExJQlJBUklFU19NRU5USU9ORURfQllfRklMRSkgJCgubmwpJChMSUJSQVJJRVMpICQoLm5sKSIkKExJQlJBUllfT1BUSU9OKSQoRklORExJQlNfU1QpLmxpYiIgJCgubmwpIiQoTElCUkFSWV9PUFRJT04pJChGSU5ETElCU19TQSkubGliIikiCisgICAgfQorCisgICAgYWN0aW9ucyBtYW5pZmVzdAorICAgIHsKKyAgICAgICAgaWYgdGVzdCAtZSAiJCg8WzFdKS5tYW5pZmVzdCI7IHRoZW4KKyAgICAgICAgICAgICQoLk1UKSAtbWFuaWZlc3QgIiQoPFsxXTpXKS5tYW5pZmVzdCIgIi1vdXRwdXRyZXNvdXJjZTokKDxbMV06Vyk7MSIKKyAgICAgICAgZmkKKyAgICB9CisKKyAgICBhY3Rpb25zIGxpbmsuZGxsIGJpbmQgREVGX0ZJTEUgTElCUkFSSUVTX01FTlRJT05FRF9CWV9GSUxFCisgICAgeworICAgICAgICAkKC5MRCkgL0RMTCAkKExJTktGTEFHUykgL291dDoiJCg8WzFdOlcpIiAvSU1QTElCOiIkKDxbMl06VykiIC9MSUJQQVRIOiIkKExJTktQQVRIOlcpIiAvZGVmOiIkKERFRl9GSUxFKSIgJChPUFRJT05TKSBAIkAoJCg8WzFdOlcpLnJzcDpFPSQoLm5sKSIkKD4pIiAkKC5ubCkkKExJQlJBUklFU19NRU5USU9ORURfQllfRklMRSkgJCgubmwpJChMSUJSQVJJRVMpICQoLm5sKSIkKExJQlJBUllfT1BUSU9OKSQoRklORExJQlNfU1QpLmxpYiIgJCgubmwpIiQoTElCUkFSWV9PUFRJT04pJChGSU5ETElCU19TQSkubGliIikiCisgICAgfQorCisgICAgYWN0aW9ucyBtYW5pZmVzdC5kbGwKKyAgICB7CisgICAgICAgIGlmIHRlc3QgLWUgIiQoPFsxXSkubWFuaWZlc3QiOyB0aGVuCisgICAgICAgICAgICAkKC5NVCkgLW1hbmlmZXN0ICIkKDxbMV06VykubWFuaWZlc3QiICItb3V0cHV0cmVzb3VyY2U6JCg8WzFdOlcpOzIiCisgICAgICAgIGZpCisgICAgfQorfQorCisjIFRoaXMgcnVsZSBzZXRzIHVwIHRoZSBwZGIgZmlsZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgc3RhdGljCisjIGxpYnJhcmllcyBhbmQgdGhlIGRlYnVnLXN0b3JlIG9wdGlvbiBpcyBkYXRhYmFzZSwgc28gdGhhdCB0aGUgY29tcGlsZXIgcHV0cworIyBhbGwgdGhlIGRlYnVnIGluZm8gaW50byBhIHNpbmdsZSAucGRiIGZpbGUgbmFtZWQgYWZ0ZXIgdGhlIGxpYnJhcnkuCisjCisjIFBva2luZyBhdCBzb3VyY2UgdGFyZ2V0cyB0aGlzIHdheSBpcyBwcm9iYWJseSBub3QgY2xlYW4sIGJ1dCBpdCBpcyB0aGUKKyMgZWFzaWVzdCBhcHByb2FjaC4KKyMKK3J1bGUgYXJjaGl2ZSAoIHRhcmdldHMgKyA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgUERCX05BTUUgb24gJCg+KSA9ICQoPFsxXTpTPS5wZGIpIDsKKyAgICBMT0NBVEUgb24gJCg8WzFdOlM9LnBkYikgPSBbIG9uICQoPFsxXSkgcmV0dXJuICQoTE9DQVRFKSBdIDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDbGFzc2VzLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgbXN2Yy1wY2gtZ2VuZXJhdG9yIDogcGNoLWdlbmVyYXRvcgoreworICAgIGltcG9ydCBwcm9wZXJ0eS1zZXQgOworCisgICAgcnVsZSBydW4tcGNoICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICogKQorICAgIHsKKyAgICAgICAgIyBTZWFyY2hpbmcgZm9yIHRoZSBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlIGluIHRoZSBzb3VyY2VzLgorICAgICAgICBsb2NhbCBwY2gtaGVhZGVyIDsKKyAgICAgICAgbG9jYWwgcGNoLXNvdXJjZSA7CisgICAgICAgIGZvciBsb2NhbCBzIGluICQoc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgWyB0eXBlLmlzLWRlcml2ZWQgWyAkKHMpLnR5cGUgXSBIIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwY2gtaGVhZGVyID0gJChzKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmCisgICAgICAgICAgICAgICAgWyB0eXBlLmlzLWRlcml2ZWQgWyAkKHMpLnR5cGUgXSBDUFAgXSB8fAorICAgICAgICAgICAgICAgIFsgdHlwZS5pcy1kZXJpdmVkIFsgJChzKS50eXBlIF0gQyBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGNoLXNvdXJjZSA9ICQocykgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgISAkKHBjaC1oZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOiB1c2VyLWVycm9yIDogZXJyb3JzLnVzZXItZXJyb3IgOworICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgImNhbiBub3QgYnVpbGQgcGNoIHdpdGhvdXQgcGNoLWhlYWRlciIgOworICAgICAgICB9CisKKyAgICAgICAgIyBJZiB3ZSBkbyBub3QgaGF2ZSB0aGUgUENIIHNvdXJjZSAtIHRoYXQgaXMgZmluZS4gV2Ugd2lsbCBqdXN0IGNyZWF0ZSBhCisgICAgICAgICMgdGVtcG9yYXJ5IC5jcHAgZmlsZSBpbiB0aGUgYWN0aW9uLgorCisgICAgICAgIGxvY2FsIGdlbmVyYXRlZCA9IFsgZ2VuZXJhdG9yLnJ1biAkKHByb2plY3QpICQobmFtZSkKKyAgICAgICAgICAgIDogWyBwcm9wZXJ0eS1zZXQuY3JlYXRlCisgICAgICAgICAgICAgICAgIyBQYXNzaW5nIG9mIDxwY2gtc291cmNlPiBpcyBhIGRpcnR5IHRyaWNrLCBuZWVkZWQgYmVjYXVzZQorICAgICAgICAgICAgICAgICMgbm9uLWNvbXBvc2luZyBnZW5lcmF0b3JzIHdpdGggbXVsdGlwbGUgaW5wdXRzIGFyZSBzdWJ0bHkKKyAgICAgICAgICAgICAgICAjIGJyb2tlbi4gRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlOgorICAgICAgICAgICAgICAgICMgaHR0cHM6Ly96aWd6YWcuY3MubXN1LnN1Ojc4MTMvYm9vc3QuYnVpbGQvdGlja2V0LzExMQorICAgICAgICAgICAgICAgIDxwY2gtc291cmNlPiQocGNoLXNvdXJjZSkKKyAgICAgICAgICAgICAgICBbICQocHJvcGVydHktc2V0KS5yYXcgXSBdCisgICAgICAgICAgICA6ICQocGNoLWhlYWRlcikgXSA7CisKKyAgICAgICAgbG9jYWwgcGNoLWZpbGUgOworICAgICAgICBmb3IgbG9jYWwgZyBpbiAkKGdlbmVyYXRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgWyB0eXBlLmlzLWRlcml2ZWQgWyAkKGcpLnR5cGUgXSBQQ0ggXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBjaC1maWxlID0gJChnKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlIDxwY2gtaGVhZGVyPiQocGNoLWhlYWRlcikKKyAgICAgICAgICAgIDxwY2gtZmlsZT4kKHBjaC1maWxlKSBdICQoZ2VuZXJhdGVkKSA7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIExvY2FsIHJ1bGVzLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBEZXRlY3RzIHZlcnNpb25zIGxpc3RlZCBhcyAnLmtub3duLXZlcnNpb25zJyBieSBjaGVja2luZyByZWdpc3RyeSBpbmZvcm1hdGlvbiwKKyMgZW52aXJvbm1lbnQgdmFyaWFibGVzICYgZGVmYXVsdCBwYXRocy4gU3VwcG9ydHMgYm90aCBuYXRpdmUgV2luZG93cyBhbmQKKyMgQ3lnd2luLgorIworbG9jYWwgcnVsZSBhdXRvLWRldGVjdC10b29sc2V0LXZlcnNpb25zICggKQoreworICAgIGlmIFsgb3MubmFtZSBdIGluIE5UIENZR1dJTgorICAgIHsKKyAgICAgICAgIyBHZXQgaW5zdGFsbGF0aW9uIHBhdGhzIGZyb20gdGhlIHJlZ2lzdHJ5LgorICAgICAgICBmb3IgbG9jYWwgaSBpbiAkKC5rbm93bi12ZXJzaW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJCgudmVyc2lvbi0kKGkpLXJlZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCB2Yy1wYXRoIDsKKyAgICAgICAgICAgICAgICBmb3IgbG9jYWwgeCBpbiAiIiAiV293NjQzMk5vZGVcXCIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZjLXBhdGggKz0gWyBXMzJfR0VUUkVHCisgICAgICAgICAgICAgICAgICAgICAgICAiSEtFWV9MT0NBTF9NQUNISU5FXFxTT0ZUV0FSRVxcIiQoeCkiXFxNaWNyb3NvZnRcXCIkKC52ZXJzaW9uLSQoaSktcmVnKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiUHJvZHVjdERpciIgXSA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgJCh2Yy1wYXRoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmMtcGF0aCA9IFsgcGF0aC5qb2luIFsgcGF0aC5tYWtlLU5UICQodmMtcGF0aFsxXSkgXSAiYmluIiBdIDsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXItY29uZmlndXJhdGlvbiAkKGkpIDogWyBwYXRoLm5hdGl2ZSAkKHZjLXBhdGhbMV0pIF0gOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICMgQ2hlY2sgZW52aXJvbm1lbnQgYW5kIGRlZmF1bHQgaW5zdGFsbGF0aW9uIHBhdGhzLgorICAgIGZvciBsb2NhbCBpIGluICQoLmtub3duLXZlcnNpb25zKQorICAgIHsKKyAgICAgICAgaWYgISAkKGkpIGluIFsgJCgudmVyc2lvbnMpLmFsbCBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyLWNvbmZpZ3VyYXRpb24gJChpKSA6IFsgZGVmYXVsdC1wYXRoICQoaSkgXSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyBXb3JrZXIgcnVsZSBmb3IgdG9vbHNldCB2ZXJzaW9uIGNvbmZpZ3VyYXRpb24uIFRha2VzIGFuIGV4cGxpY2l0IHZlcnNpb24gaWQgb3IKKyMgbm90aGluZyBpbiBjYXNlIGl0IHNob3VsZCBjb25maWd1cmUgdGhlIGRlZmF1bHQgdG9vbHNldCB2ZXJzaW9uICh0aGUgZmlyc3QKKyMgcmVnaXN0ZXJlZCBvbmUgb3IgYSBuZXcgJ2RlZmF1bHQnIG9uZSBpbiBjYXNlIG5vIHRvb2xzZXQgdmVyc2lvbnMgaGF2ZSBiZWVuCisjIHJlZ2lzdGVyZWQgeWV0KS4KKyMKK2xvY2FsIHJ1bGUgY29uZmlndXJlLXJlYWxseSAoIHZlcnNpb24gPyA6IG9wdGlvbnMgKiApCit7CisgICAgbG9jYWwgdiA9ICQodmVyc2lvbikgOworCisgICAgIyBEZWNpZGUgd2hhdCB0aGUgJ2RlZmF1bHQnIHZlcnNpb24gaXMuCisgICAgaWYgISAkKHYpCisgICAgeworICAgICAgICAjIFRha2UgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgKGkuZS4gYXV0by1kZXRlY3RlZCkgdmVyc2lvbi4KKyAgICAgICAgdmVyc2lvbiA9IFsgJCgudmVyc2lvbnMpLmFsbCBdIDsKKyAgICAgICAgdmVyc2lvbiA9ICQodmVyc2lvblsxXSkgOworICAgICAgICB2ID0gJCh2ZXJzaW9uKSA7CisKKyAgICAgICAgIyBOb3RlOiAndmVyc2lvbicgY2FuIHN0aWxsIGJlIGVtcHR5IGF0IHRoaXMgcG9pbnQgaWYgbm8gdmVyc2lvbnMgaGF2ZQorICAgICAgICAjIGJlZW4gYXV0by1kZXRlY3RlZC4KKyAgICAgICAgdmVyc2lvbiA/PSAiZGVmYXVsdCIgOworICAgIH0KKworICAgICMgVmVyc2lvbiBhbGlhcyAtPiByZWFsIHZlcnNpb24gbnVtYmVyLgorICAgIGlmICQoLnZlcnNpb24tYWxpYXMtJCh2ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHZlcnNpb24gPSAkKC52ZXJzaW9uLWFsaWFzLSQodmVyc2lvbikpIDsKKyAgICB9CisKKyAgICAjIENoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaXMgYWxyZWFkeSBpbiB1c2UuCisgICAgaWYgJCh2ZXJzaW9uKSBpbiBbICQoLnZlcnNpb25zKS51c2VkIF0KKyAgICB7CisgICAgICAgICMgQWxsb3cgbXVsdGlwbGUgJ3Rvb2xzZXQudXNpbmcnIGNhbGxzIGZvciB0aGUgc2FtZSBjb25maWd1cmF0aW9uIGlmIHRoZQorICAgICAgICAjIGlkZW50aWNhbCBzZXRzIG9mIG9wdGlvbnMgYXJlIHVzZWQuCisgICAgICAgIGlmICQob3B0aW9ucykgJiYgKCAkKG9wdGlvbnMpICE9IFsgJCgudmVyc2lvbnMpLmdldCAkKHZlcnNpb24pIDogb3B0aW9ucyBdICkKKyAgICAgICAgeworICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICBlcnJvcnMuZXJyb3IgIk1TVkMgdG9vbHNldCBjb25maWd1cmF0aW9uOiBUb29sc2V0IHZlcnNpb24iCisgICAgICAgICAgICAgICAgIickKHZlcnNpb24pJyBhbHJlYWR5IGNvbmZpZ3VyZWQuIiA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgIyBSZWdpc3RlciBhIG5ldyBjb25maWd1cmF0aW9uLgorICAgICAgICAkKC52ZXJzaW9ucykucmVnaXN0ZXIgJCh2ZXJzaW9uKSA7CisKKyAgICAgICAgIyBBZGQgdXNlci1zdXBwbGllZCB0byBhdXRvLWRldGVjdGVkIG9wdGlvbnMuCisgICAgICAgIG9wdGlvbnMgPSBbICQoLnZlcnNpb25zKS5nZXQgJCh2ZXJzaW9uKSA6IG9wdGlvbnMgXSAkKG9wdGlvbnMpIDsKKworICAgICAgICAjIE1hcmsgdGhlIGNvbmZpZ3VyYXRpb24gYXMgJ3VzZWQnLgorICAgICAgICAkKC52ZXJzaW9ucykudXNlICQodmVyc2lvbikgOworCisgICAgICAgICMgR2VuZXJhdGUgY29uZGl0aW9ucyBhbmQgc2F2ZSB0aGVtLgorICAgICAgICBsb2NhbCBjb25kaXRpb25zID0gWyBjb21tb24uY2hlY2staW5pdC1wYXJhbWV0ZXJzIG1zdmMgOiB2ZXJzaW9uICQodikgXQorICAgICAgICAgICAgOworCisgICAgICAgICQoLnZlcnNpb25zKS5zZXQgJCh2ZXJzaW9uKSA6IGNvbmRpdGlvbnMgOiAkKGNvbmRpdGlvbnMpIDsKKworICAgICAgICBsb2NhbCBjb21tYW5kID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPGNvbW1hbmQ+IDogJChvcHRpb25zKSBdIDsKKworICAgICAgICAjIElmIHZlcnNpb24gaXMgc3BlY2lmaWVkLCB3ZSB0cnkgdG8gc2VhcmNoIGZpcnN0IGluIGRlZmF1bHQgcGF0aHMsIGFuZAorICAgICAgICAjIG9ubHkgdGhlbiBpbiBQQVRILgorICAgICAgICBjb21tYW5kID0gWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBtc3ZjIDogY2wuZXhlIDogJChjb21tYW5kKSA6CisgICAgICAgICAgICBbIGRlZmF1bHQtcGF0aHMgJCh2ZXJzaW9uKSBdIDogJCh2ZXJzaW9uKSBdIDsKKworICAgICAgICBjb21tb24uaGFuZGxlLW9wdGlvbnMgbXN2YyA6ICQoY29uZGl0aW9ucykgOiAkKGNvbW1hbmQpIDogJChvcHRpb25zKSA7CisKKyAgICAgICAgaWYgISAkKHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgICMgRXZlbiBpZiB2ZXJzaW9uIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCwgdHJ5IHRvIGRldGVjdCB0aGUKKyAgICAgICAgICAgICMgdmVyc2lvbiBmcm9tIHRoZSBwYXRoLgorICAgICAgICAgICAgIyBGSVhNRTogV2UgY3VycmVudGx5IGRldGVjdCBib3RoIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDkuMCBhbmQKKyAgICAgICAgICAgICMgOS4wZXhwcmVzcyBhcyA5LjAgaGVyZS4KKyAgICAgICAgICAgIGlmIFsgTUFUQ0ggIihNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMikiIDogJChjb21tYW5kKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IDEyLjAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiBbIE1BVENIICIoTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTEpIiA6ICQoY29tbWFuZCkgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZlcnNpb24gPSAxMS4wIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgWyBNQVRDSCAiKE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDEwKSIgOiAkKGNvbW1hbmQpIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gMTAuMCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIFsgTUFUQ0ggIihNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyA5KSIgOiAkKGNvbW1hbmQpIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gOS4wIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgWyBNQVRDSCAiKE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDgpIiA6ICQoY29tbWFuZCkgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZlcnNpb24gPSA4LjAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiBbIE1BVENIICIoTkVUIDIwMDNbXC9cXF1WQzcpIiA6ICQoY29tbWFuZCkgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZlcnNpb24gPSA3LjEgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiBbIE1BVENIICIoTWljcm9zb2Z0IFZpc3VhbCBDXFwrXFwrIFRvb2xraXQgMjAwMykiIDoKKyAgICAgICAgICAgICAgICAkKGNvbW1hbmQpIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gNy4xdG9vbGtpdCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIFsgTUFUQ0ggIiguTkVUW1wvXFxdVkM3KSIgOiAkKGNvbW1hbmQpIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gNy4wIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gNi4wIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICMgR2VuZXJhdGUgYW5kIHJlZ2lzdGVyIHNldHVwIGNvbW1hbmQuCisKKyAgICAgICAgbG9jYWwgYmVsb3ctOC4wID0gWyBNQVRDSCBeKFs2N11cXC4pIDogJCh2ZXJzaW9uKSBdIDsKKworICAgICAgICBsb2NhbCBjcHUgPSBpMzg2IGFtZDY0IGlhNjQgYXJtIDsKKyAgICAgICAgaWYgJChiZWxvdy04LjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwdSA9IGkzODYgOworICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgc2V0dXAtYW1kNjQgOworICAgICAgICBsb2NhbCBzZXR1cC1pMzg2IDsKKyAgICAgICAgbG9jYWwgc2V0dXAtaWE2NCA7CisgICAgICAgIGxvY2FsIHNldHVwLWFybSA7CisKKyAgICAgICAgaWYgJChjb21tYW5kKQorICAgICAgICB7CisgICAgICAgICAgICAjIFRPRE86IE5vdGUgdGhhdCBpZiB3ZSBzcGVjaWZ5IGEgbm9uLWV4aXN0YW50IHRvb2xzZXQgdmVyc2lvbiB0aGVuCisgICAgICAgICAgICAjIHRoaXMgcnVsZSBtYXkgZmluZCBhbmQgdXNlIGEgY29ycmVzcG9uZGluZyBjb21waWxlciBleGVjdXRhYmxlCisgICAgICAgICAgICAjIGJlbG9uZ2luZyB0byBhbiBpbmNvcnJlY3QgdG9vbHNldCB2ZXJzaW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91CisgICAgICAgICAgICAjIGhhdmUgb25seSBNU1ZDIDcuMSBpbnN0YWxsZWQsIGhhdmUgaXRzIGV4ZWN1dGFibGUgb24gdGhlIHBhdGggYW5kCisgICAgICAgICAgICAjIHNwZWNpZnkgeW91IHdhbnQgQm9vc3QgQnVpbGQgdG8gdXNlIE1TVkMgOS4wLCB0aGVuIHlvdSB3YW50IEJvb3N0CisgICAgICAgICAgICAjIEJ1aWxkIHRvIHJlcG9ydCBhbiBlcnJvciBidXQgdGhpcyBtYXkgY2F1c2UgaXQgdG8gc2lsZW50bHkgdXNlIHRoZQorICAgICAgICAgICAgIyBNU1ZDIDcuMSBjb21waWxlciBldmVuIHRob3VnaCBpdCB0aGlua3MgaXQgaXMgdXNpbmcgdGhlIG1zdmMtOS4wCisgICAgICAgICAgICAjIHRvb2xzZXQgdmVyc2lvbi4KKyAgICAgICAgICAgIGNvbW1hbmQgPSBbIGNvbW1vbi5nZXQtYWJzb2x1dGUtdG9vbC1wYXRoICQoY29tbWFuZFstMV0pIF0gOworICAgICAgICB9CisKKyAgICAgICAgaWYgJChjb21tYW5kKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBwYXJlbnQgPSBbIHBhdGgubWFrZSAkKGNvbW1hbmQpIF0gOworICAgICAgICAgICAgcGFyZW50ID0gWyBwYXRoLnBhcmVudCAkKHBhcmVudCkgXSA7CisgICAgICAgICAgICBwYXJlbnQgPSBbIHBhdGgubmF0aXZlICQocGFyZW50KSBdIDsKKworICAgICAgICAgICAgIyBTZXR1cCB3aWxsIGJlIHVzZWQgaWYgdGhlIGNvbW1hbmQgbmFtZSBoYXMgYmVlbiBzcGVjaWZpZWQuIElmCisgICAgICAgICAgICAjIHNldHVwIGlzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSB0aGVuIGEgZGVmYXVsdCBzZXR1cCBzY3JpcHQgd2lsbAorICAgICAgICAgICAgIyBiZSB1c2VkIGluc3RlYWQuIFNldHVwIHNjcmlwdHMgbWF5IGJlIGdsb2JhbCBvciBhcmhpdGVjdHVyZS8KKyAgICAgICAgICAgICMgL3BsYXRmb3JtL2NwdSBzcGVjaWZpYy4gU2V0dXAgb3B0aW9ucyBhcmUgdXNlZCBvbmx5IGluIGNhc2Ugb2YKKyAgICAgICAgICAgICMgZ2xvYmFsIHNldHVwIHNjcmlwdHMuCisKKyAgICAgICAgICAgICMgRGVmYXVsdCBzZXR1cCBzY3JpcHRzIHByb3ZpZGVkIHdpdGggZGlmZmVyZW50IFZDIGRpc3RyaWJ1dGlvbnM6CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjICAgVkMgNy4xIGhhZCBvbmx5IHRoZSB2Y3ZhcnMzMi5iYXQgc2NyaXB0IHNwZWNpZmljIHRvIDMyIGJpdCBpMzg2CisgICAgICAgICAgICAjIGJ1aWxkcy4gSXQgd2FzIGxvY2F0ZWQgaW4gdGhlIGJpbiBmb2xkZXIgZm9yIHRoZSByZWd1bGFyIHZlcnNpb24KKyAgICAgICAgICAgICMgYW5kIGluIHRoZSByb290IGZvbGRlciBmb3IgdGhlIGZyZWUgVkMgNy4xIHRvb2xzLgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyAgIExhdGVyIDguMCAmIDkuMCB2ZXJzaW9ucyBpbnRyb2R1Y2Ugc2VwYXJhdGUgcGxhdGZvcm0gc3BlY2lmaWMKKyAgICAgICAgICAgICMgdmN2YXJzKi5iYXQgc2NyaXB0cyAoZS5nLiAzMiBiaXQsIDY0IGJpdCBBTUQgb3IgNjQgYml0IEl0YW5pdW0pCisgICAgICAgICAgICAjIGxvY2F0ZWQgaW4gb3IgdW5kZXIgdGhlIGJpbiBmb2xkZXIuIE1vc3QgYWxzbyBpbmNsdWRlIGEgZ2xvYmFsCisgICAgICAgICAgICAjIHZjdmFyc2FsbC5iYXQgaGVscGVyIHNjcmlwdCBsb2NhdGVkIGluIHRoZSByb290IGZvbGRlciB3aGljaCBydW5zCisgICAgICAgICAgICAjIG9uZSBvZiB0aGUgYWZvcmVtZW50aW9uZWQgdmN2YXJzKi5iYXQgc2NyaXB0cyBiYXNlZCBvbiB0aGUgb3B0aW9ucworICAgICAgICAgICAgIyBwYXNzZWQgdG8gaXQuIFNvIGZhciBvbmx5IHRoZSB2ZXJzaW9uIGNvbWluZyB3aXRoIHNvbWUgUGxhdGZvcm1TREsKKyAgICAgICAgICAgICMgZGlzdHJpYnV0aW9ucyBkb2VzIG5vdCBpbmNsdWRlIHRoaXMgdG9wIGxldmVsIHNjcmlwdCBidXQgdG8KKyAgICAgICAgICAgICMgc3VwcG9ydCB0aG9zZSB3ZSBuZWVkIHRvIGZhbGwgYmFjayB0byB1c2luZyB0aGUgd29ya2VyIHNjcmlwdHMKKyAgICAgICAgICAgICMgZGlyZWN0bHkgaW4gY2FzZSB0aGUgdG9wIGxldmVsIHNjcmlwdCBjYW4gbm90IGJlIGZvdW5kLgorCisgICAgICAgICAgICBsb2NhbCBnbG9iYWwtc2V0dXAgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8c2V0dXA+IDogJChvcHRpb25zKSBdIDsKKyAgICAgICAgICAgIGdsb2JhbC1zZXR1cCA9ICQoZ2xvYmFsLXNldHVwWzFdKSA7CisgICAgICAgICAgICBpZiAhICQoYmVsb3ctOC4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdsb2JhbC1zZXR1cCA/PSBbIGxvY2F0ZS1kZWZhdWx0LXNldHVwICQoY29tbWFuZCkgOiAkKHBhcmVudCkgOgorICAgICAgICAgICAgICAgICAgICB2Y3ZhcnNhbGwuYmF0IF0gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2NhbCBkZWZhdWx0LXNldHVwLWFtZDY0ID0gdmN2YXJzeDg2X2FtZDY0LmJhdCA7CisgICAgICAgICAgICBsb2NhbCBkZWZhdWx0LXNldHVwLWkzODYgID0gdmN2YXJzMzIuYmF0IDsKKyAgICAgICAgICAgIGxvY2FsIGRlZmF1bHQtc2V0dXAtaWE2NCAgPSB2Y3ZhcnN4ODZfaWE2NC5iYXQgOworICAgICAgICAgICAgbG9jYWwgZGVmYXVsdC1zZXR1cC1hcm0gICA9IHZjdmFyc3g4Nl9hcm0uYmF0IDsKKworICAgICAgICAgICAgIyBodHRwOi8vbXNkbjIubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3g0ZDJjMDlzKFZTLjgwKS5hc3B4IGFuZAorICAgICAgICAgICAgIyBodHRwOi8vbXNkbjIubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3g0ZDJjMDlzKHZzLjkwKS5hc3B4CisgICAgICAgICAgICAjIG1lbnRpb24gYW4geDg2X0lQRiBvcHRpb24sIHRoYXQgc2VlbXMgdG8gYmUgYSBkb2N1bWVudGF0aW9uIGJ1ZworICAgICAgICAgICAgIyBhbmQgeDg2X2lhNjQgaXMgdGhlIGNvcnJlY3Qgb3B0aW9uLgorICAgICAgICAgICAgbG9jYWwgZGVmYXVsdC1nbG9iYWwtc2V0dXAtb3B0aW9ucy1hbWQ2NCA9IHg4Nl9hbWQ2NCA7CisgICAgICAgICAgICBsb2NhbCBkZWZhdWx0LWdsb2JhbC1zZXR1cC1vcHRpb25zLWkzODYgID0geDg2IDsKKyAgICAgICAgICAgIGxvY2FsIGRlZmF1bHQtZ2xvYmFsLXNldHVwLW9wdGlvbnMtaWE2NCAgPSB4ODZfaWE2NCA7CisgICAgICAgICAgICBsb2NhbCBkZWZhdWx0LWdsb2JhbC1zZXR1cC1vcHRpb25zLWFybSAgID0geDg2X2FybSA7CisKKyAgICAgICAgICAgICMgV2hlbiB1c2luZyA2NC1iaXQgV2luZG93cywgYW5kIHRhcmdldGluZyA2NC1iaXQsIGl0IGlzIHBvc3NpYmxlIHRvCisgICAgICAgICAgICAjIHVzZSBhIG5hdGl2ZSA2NC1iaXQgY29tcGlsZXIsIHNlbGVjdGVkIGJ5IHRoZSAiYW1kNjQiICYgImlhNjQiCisgICAgICAgICAgICAjIHBhcmFtZXRlcnMgdG8gdmN2YXJzYWxsLmJhdC4gVGhlcmUgYXJlIHR3byB2YXJpYWJsZXMgd2UgY2FuIHVzZSAtLQorICAgICAgICAgICAgIyBQUk9DRVNTT1JfQVJDSElURUNUVVJFIGFuZCBQUk9DRVNTT1JfSURFTlRJRklFUi4gVGhlIGZpcnN0IGlzCisgICAgICAgICAgICAjICd4ODYnIHdoZW4gcnVubmluZyAzMi1iaXQgV2luZG93cywgbm8gbWF0dGVyIHdoaWNoIHByb2Nlc3NvciBpcworICAgICAgICAgICAgIyB1c2VkLCBhbmQgJ0FNRDY0JyBvbiA2NC1iaXQgd2luZG93cyBvbiB4ODYgKGVpdGhlciBBTUQ2NCBvciBFTTY0VCkKKyAgICAgICAgICAgICMgV2luZG93cy4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIGlmIFsgTUFUQ0ggXihBTUQ2NCkgOiBbIG9zLmVudmlyb24gUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRSBdIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0LWdsb2JhbC1zZXR1cC1vcHRpb25zLWFtZDY0ID0gYW1kNjQgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgIyBUT0RPOiBUaGUgc2FtZSAnbmF0aXZlIGNvbXBpbGVyIHVzYWdlJyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgZm9yCisgICAgICAgICAgICAjIHRoZSBJdGFuaXVtIHBsYXRmb3JtIGJ5IHVzaW5nIHRoZSAiaWE2NCIgcGFyYW1ldGVyLiBGb3IgdGhpcworICAgICAgICAgICAgIyB0aG91Z2ggd2UgbmVlZCBzb21lb25lIHdpdGggYWNjZXNzIHRvIHRoaXMgcGxhdGZvcm0gd2hvIGNhbiBmaW5kCisgICAgICAgICAgICAjIG91dCBob3cgdG8gY29ycmVjdGx5IGRldGVjdCB0aGlzIGNhc2UuCisgICAgICAgICAgICBlbHNlIGlmICQoc29tZWhvdy1kZXRlY3QtdGhlLWl0YW5pdW0tcGxhdGZvcm0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVmYXVsdC1nbG9iYWwtc2V0dXAtb3B0aW9ucy1pYTY0ID0gaWE2NCA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvY2FsIHNldHVwLXByZWZpeCA9ICJjYWxsICIgOworICAgICAgICAgICAgbG9jYWwgc2V0dXAtc3VmZml4ID0gIiA+bnVsIiQoLm5sKSA7CisgICAgICAgICAgICBpZiAhIFsgb3MubmFtZSBdIGluIE5UCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0dXAtcHJlZml4ID0gImNtZC5leGUgL1MgL0MgY2FsbCAiIDsKKyAgICAgICAgICAgICAgICBzZXR1cC1zdWZmaXggPSAiIFwiPm51bFwiIFwiJiZcIiAiIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIGxvY2FsIGMgaW4gJChjcHUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWwgc2V0dXAtb3B0aW9ucyA7CisKKyAgICAgICAgICAgICAgICBzZXR1cC0kKGMpID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPHNldHVwLSQoYyk+IDogJChvcHRpb25zKSBdIDsKKworICAgICAgICAgICAgICAgIGlmICEgJChzZXR1cC0kKGMpKS1pcy1ub3QtZW1wdHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICQoZ2xvYmFsLXNldHVwKS1pcy1ub3QtZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAtJChjKSA9ICQoZ2xvYmFsLXNldHVwKSA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgbmVlZGVkIHdlIGNhbiBlYXNpbHkgYWRkIHVzaW5nIGNvbmZpZ3VyYXRpb24gZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaGVyZSBmb3Igb3ZlcnJpZGluZyB3aGljaCBvcHRpb25zIGdldCBwYXNzZWQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGdsb2JhbCBzZXR1cCBjb21tYW5kIGZvciB3aGljaCB0YXJnZXQgcGxhdGZvcm06CisgICAgICAgICAgICAgICAgICAgICAgICAjIHNldHVwLW9wdGlvbnMgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8c2V0dXAtb3B0aW9ucy0kKGMpPiA6ICQob3B0aW9ucykgXSA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLW9wdGlvbnMgPz0gJChkZWZhdWx0LWdsb2JhbC1zZXR1cC1vcHRpb25zLSQoYykpIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLSQoYykgPSBbIGxvY2F0ZS1kZWZhdWx0LXNldHVwICQoY29tbWFuZCkgOiAkKHBhcmVudCkgOiAkKGRlZmF1bHQtc2V0dXAtJChjKSkgXSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAjIEN5Z3dpbiB0byBXaW5kb3dzIHBhdGggdHJhbnNsYXRpb24uCisgICAgICAgICAgICAgICAgc2V0dXAtJChjKSA9ICJcIiIkKHNldHVwLSQoYyk6VykiXCIiIDsKKworICAgICAgICAgICAgICAgICMgQXBwZW5kIHNldHVwIG9wdGlvbnMgdG8gdGhlIHNldHVwIG5hbWUgYW5kIGFkZCB0aGUgZmluYWwgc2V0dXAKKyAgICAgICAgICAgICAgICAjIHByZWZpeCAmIHN1ZmZpeC4KKyAgICAgICAgICAgICAgICBzZXR1cC1vcHRpb25zID89ICIiIDsKKyAgICAgICAgICAgICAgICBzZXR1cC0kKGMpID0gJChzZXR1cC1wcmVmaXgpJChzZXR1cC0kKGMpOko9IiAiKSIgIiQoc2V0dXAtb3B0aW9uczpKPSIgIikkKHNldHVwLXN1ZmZpeCkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBHZXQgdG9vbCBuYW1lcyAoaWYgYW55KSBhbmQgZmluaXNoIHNldHVwLgorCisgICAgICAgIGNvbXBpbGVyID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPGNvbXBpbGVyPiA6ICQob3B0aW9ucykgXSA7CisgICAgICAgIGNvbXBpbGVyID89IGNsIDsKKworICAgICAgICBsaW5rZXIgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8bGlua2VyPiA6ICQob3B0aW9ucykgXSA7CisgICAgICAgIGxpbmtlciA/PSBsaW5rIDsKKworICAgICAgICByZXNvdXJjZS1jb21waWxlciA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxyZXNvdXJjZS1jb21waWxlcj4gOiAkKG9wdGlvbnMpIF0gOworICAgICAgICByZXNvdXJjZS1jb21waWxlciA/PSByYyA7CisKKyAgICAgICAgIyBUdXJuIG9uIHNvbWUgb3B0aW9ucyBmb3IgaTM4NiBhc3NlbWJsZXIKKyAgICAgICAgIyAgLWNvZmYgIGdlbmVyYXRlIENPRkYgZm9ybWF0IG9iamVjdCBmaWxlIChjb21wYXRpYmxlIHdpdGggY2wuZXhlIG91dHB1dCkKKyAgICAgICAgbG9jYWwgZGVmYXVsdC1hc3NlbWJsZXItYW1kNjQgPSBtbDY0IDsKKyAgICAgICAgbG9jYWwgZGVmYXVsdC1hc3NlbWJsZXItaTM4NiAgPSAibWwgLWNvZmYiIDsKKyAgICAgICAgbG9jYWwgZGVmYXVsdC1hc3NlbWJsZXItaWE2NCAgPSBpYXMgOworICAgICAgICBsb2NhbCBkZWZhdWx0LWFzc2VtYmxlci1pYTY0ICA9IGFybWFzbSA7CisKKyAgICAgICAgYXNzZW1ibGVyID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPGFzc2VtYmxlcj4gOiAkKG9wdGlvbnMpIF0gOworCisgICAgICAgIGlkbC1jb21waWxlciA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxpZGwtY29tcGlsZXI+IDogJChvcHRpb25zKSBdIDsKKyAgICAgICAgaWRsLWNvbXBpbGVyID89IG1pZGwgOworCisgICAgICAgIG1jLWNvbXBpbGVyID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPG1jLWNvbXBpbGVyPiA6ICQob3B0aW9ucykgXSA7CisgICAgICAgIG1jLWNvbXBpbGVyID89IG1jIDsKKworICAgICAgICBtYW5pZmVzdC10b29sID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPG1hbmlmZXN0LXRvb2w+IDogJChvcHRpb25zKSBdIDsKKyAgICAgICAgbWFuaWZlc3QtdG9vbCA/PSBtdCA7CisKKyAgICAgICAgbG9jYWwgY2MtZmlsdGVyID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPGNvbXBpbGVyLWZpbHRlcj4gOiAkKG9wdGlvbnMpIF0KKyAgICAgICAgICAgIDsKKworICAgICAgICBmb3IgbG9jYWwgYyBpbiAkKGNwdSkKKyAgICAgICAgeworICAgICAgICAgICAgIyBTZXR1cCBzY3JpcHQgaXMgbm90IHJlcXVpcmVkIGluIHNvbWUgY29uZmlndXJhdGlvbnMuCisgICAgICAgICAgICBzZXR1cC0kKGMpID89ICIiIDsKKworICAgICAgICAgICAgbG9jYWwgY3B1LWNvbmRpdGlvbnMgPSAkKGNvbmRpdGlvbnMpLyQoLmNwdS1hcmNoLSQoYykpIDsKKworICAgICAgICAgICAgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgbG9jYWwgY3B1LWNvbmRpdGlvbiBpbiAkKGNwdS1jb25kaXRpb25zKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRUNITyAibm90aWNlOiBbbXN2Yy1jZmddIGNvbmRpdGlvbjogJyQoY3B1LWNvbmRpdGlvbiknLCBzZXR1cDogJyQoc2V0dXAtJChjKSknIiA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2NhbCBjcHUtYXNzZW1ibGVyID0gJChhc3NlbWJsZXIpIDsKKyAgICAgICAgICAgIGNwdS1hc3NlbWJsZXIgPz0gJChkZWZhdWx0LWFzc2VtYmxlci0kKGMpKSA7CisKKyAgICAgICAgICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIC5DQyAgJChjcHUtY29uZGl0aW9ucykgOiAkKHNldHVwLSQoYykpJChjb21waWxlcikgL1ptODAwIC1ub2xvZ28gOworICAgICAgICAgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgLlJDICAkKGNwdS1jb25kaXRpb25zKSA6ICQoc2V0dXAtJChjKSkkKHJlc291cmNlLWNvbXBpbGVyKSA7CisgICAgICAgICAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZSAuQVNNICQoY3B1LWNvbmRpdGlvbnMpIDogJChzZXR1cC0kKGMpKSQoY3B1LWFzc2VtYmxlcikgLW5vbG9nbyA7CisgICAgICAgICAgICB0b29sc2V0LmZsYWdzIG1zdmMubGluayAgICAuTEQgICQoY3B1LWNvbmRpdGlvbnMpIDogJChzZXR1cC0kKGMpKSQobGlua2VyKSAvTk9MT0dPIC9JTkNSRU1FTlRBTDpOTyA7CisgICAgICAgICAgICB0b29sc2V0LmZsYWdzIG1zdmMuYXJjaGl2ZSAuTEQgICQoY3B1LWNvbmRpdGlvbnMpIDogJChzZXR1cC0kKGMpKSQobGlua2VyKSAvbGliIC9OT0xPR08gIDsKKyAgICAgICAgICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIC5JREwgJChjcHUtY29uZGl0aW9ucykgOiAkKHNldHVwLSQoYykpJChpZGwtY29tcGlsZXIpIDsKKyAgICAgICAgICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIC5NQyAgJChjcHUtY29uZGl0aW9ucykgOiAkKHNldHVwLSQoYykpJChtYy1jb21waWxlcikgOworCisgICAgICAgICAgICB0b29sc2V0LmZsYWdzIG1zdmMubGluayAuTVQgJChjcHUtY29uZGl0aW9ucykgOiAkKHNldHVwLSQoYykpJChtYW5pZmVzdC10b29sKSAtbm9sb2dvIDsKKworICAgICAgICAgICAgaWYgJChjYy1maWx0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9vbHNldC5mbGFncyBtc3ZjIC5DQy5GSUxURVIgJChjcHUtY29uZGl0aW9ucykgOiAifCIgJChjYy1maWx0ZXIpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICMgU2V0IHZlcnNpb24tc3BlY2lmaWMgZmxhZ3MuCisgICAgICAgIGNvbmZpZ3VyZS12ZXJzaW9uLXNwZWNpZmljIG1zdmMgOiAkKHZlcnNpb24pIDogJChjb25kaXRpb25zKSA7CisgICAgfQorfQorCisKKyMgUmV0dXJucyB0aGUgZGVmYXVsdCBpbnN0YWxsYXRpb24gcGF0aCBmb3IgdGhlIGdpdmVuIHZlcnNpb24uCisjCitsb2NhbCBydWxlIGRlZmF1bHQtcGF0aCAoIHZlcnNpb24gKQoreworICAgICMgVXNlIGF1dG8tZGV0ZWN0ZWQgcGF0aCBpZiBwb3NzaWJsZS4KKyAgICBsb2NhbCBwYXRoID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPGNvbW1hbmQ+IDogWyAkKC52ZXJzaW9ucykuZ2V0ICQodmVyc2lvbikKKyAgICAgICAgOiBvcHRpb25zIF0gXSA7CisKKyAgICBpZiAkKHBhdGgpCisgICAgeworICAgICAgICBwYXRoID0gJChwYXRoOkQpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgIyBDaGVjayBlbnZpcm9ubWVudC4KKyAgICAgICAgaWYgJCgudmVyc2lvbi0kKHZlcnNpb24pLWVudikKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgdmMtcGF0aCA9IFsgb3MuZW52aXJvbiAkKC52ZXJzaW9uLSQodmVyc2lvbiktZW52KSBdIDsKKyAgICAgICAgICAgIGlmICQodmMtcGF0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2Yy1wYXRoID0gWyBwYXRoLm1ha2UgJCh2Yy1wYXRoKSBdIDsKKyAgICAgICAgICAgICAgICB2Yy1wYXRoID0gWyBwYXRoLmpvaW4gJCh2Yy1wYXRoKSAkKC52ZXJzaW9uLSQodmVyc2lvbiktZW52cGF0aCkgXSA7CisgICAgICAgICAgICAgICAgdmMtcGF0aCA9IFsgcGF0aC5uYXRpdmUgJCh2Yy1wYXRoKSBdIDsKKworICAgICAgICAgICAgICAgIHBhdGggPSAkKHZjLXBhdGgpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICMgQ2hlY2sgZGVmYXVsdCBwYXRoLgorICAgICAgICBpZiAhICQocGF0aCkgJiYgJCgudmVyc2lvbi0kKHZlcnNpb24pLXBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhdGggPSBbIHBhdGgubmF0aXZlIFsgcGF0aC5qb2luICQoLlByb2dyYW1GaWxlcykgJCgudmVyc2lvbi0kKHZlcnNpb24pLXBhdGgpIF0gXSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gJChwYXRoKSA7Cit9CisKKworIyBSZXR1cm5zIGVpdGhlciB0aGUgZGVmYXVsdCBpbnN0YWxsYXRpb24gcGF0aCAoaWYgJ3ZlcnNpb24nIGlzIG5vdCBlbXB0eSkgb3IKKyMgbGlzdCBvZiBhbGwga25vd24gZGVmYXVsdCBwYXRocyAoaWYgbm8gdmVyc2lvbiBpcyBnaXZlbikKKyMKK2xvY2FsIHJ1bGUgZGVmYXVsdC1wYXRocyAoIHZlcnNpb24gPyApCit7CisgICAgbG9jYWwgcG9zc2libGUtcGF0aHMgOworCisgICAgaWYgJCh2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcG9zc2libGUtcGF0aHMgKz0gWyBkZWZhdWx0LXBhdGggJCh2ZXJzaW9uKSBdIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIGxvY2FsIGkgaW4gJCgua25vd24tdmVyc2lvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvc3NpYmxlLXBhdGhzICs9IFsgZGVmYXVsdC1wYXRoICQoaSkgXSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gJChwb3NzaWJsZS1wYXRocykgOworfQorCisKK3J1bGUgZ2V0LXJzcGxpbmUgKCB0YXJnZXQgOiBsYW5nLW9wdCApCit7CisgICAgQ0NfUlNQTElORSBvbiAkKHRhcmdldCkgPSBbIG9uICQodGFyZ2V0KSByZXR1cm4gJChsYW5nLW9wdCkgLVUkKFVOREVGUykKKyAgICAgICAgJChDRkxBR1MpICQoQysrRkxBR1MpICQoT1BUSU9OUykgLWMgJCgubmwpLUQkKERFRklORVMpCisgICAgICAgICQoLm5sKVwiLUkkKElOQ0xVREVTOlcpXCIgXSA7Cit9CisKK2NsYXNzIG1zdmMtbGlua2luZy1nZW5lcmF0b3IgOiBsaW5raW5nLWdlbmVyYXRvcgoreworICAgICMgQ2FsbHMgdGhlIGJhc2UgdmVyc2lvbi4gIElmIG5lY2Vzc2FyeSwgYWxzbyBjcmVhdGUgYSB0YXJnZXQgZm9yIHRoZQorICAgICMgbWFuaWZlc3QgZmlsZS5zcGVjaWZ5aW5nIHNvdXJjZSdzIG5hbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGNyZWF0ZWQKKyAgICAjIHRhcmdldC4gQXMgcmVzdWx0LCB0aGUgUENIIHdpbGwgYmUgbmFtZWQgd2hhdGV2ZXIuaHBwLmdjaCwgYW5kIG5vdAorICAgICMgd2hhdGV2ZXIuZ2NoLgorICAgIHJ1bGUgZ2VuZXJhdGVkLXRhcmdldHMgKCBzb3VyY2VzICsgOiBwcm9wZXJ0eS1zZXQgOiBwcm9qZWN0IG5hbWUgPyApCisgICAgeworICAgICAgICBsb2NhbCByZXN1bHQgPSBbIGxpbmtpbmctZ2VuZXJhdG9yLmdlbmVyYXRlZC10YXJnZXRzICQoc291cmNlcykKKyAgICAgICAgICA6ICQocHJvcGVydHktc2V0KSA6ICQocHJvamVjdCkgJChuYW1lKSBdIDsKKworICAgICAgICBpZiAkKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgbmFtZS1tYWluID0gWyAkKHJlc3VsdFswXSkubmFtZSBdIDsKKyAgICAgICAgICAgIGxvY2FsIGFjdGlvbiA9IFsgJChyZXN1bHRbMF0pLmFjdGlvbiBdIDsKKworICAgICAgICAgICAgaWYgWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxkZWJ1Zy1zeW1ib2xzPiBdID0gIm9uIgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgV2UgZm9yY2UgdGhlIGV4YWN0IG5hbWUgb24gUERCLiBUaGUgcmVhc29uIGlzIHRhZ2dpbmcgLS0gdGhlCisgICAgICAgICAgICAgICAgIyB0YWcgcnVsZSBtYXkgcmVhc29uYWJseSBzcGVjaWFsIGNhc2Ugc29tZSB0YXJnZXQgdHlwZXMsIGxpa2UKKyAgICAgICAgICAgICAgICAjIFNIQVJFRF9MSUIuIFRoZSB0YWcgcnVsZSB3aWxsIG5vdCBjYXRjaCBQREJzLCBhbmQgaXQgY2Fubm90CisgICAgICAgICAgICAgICAgIyBldmVuIGVhc2lseSBmaWd1cmUgb3V0IGlmIGEgUERCIGlzIHBhaXJlZCB3aXRoIGEgU0hBUkVEX0xJQiwKKyAgICAgICAgICAgICAgICAjIEVYRSBvciBzb21ldGhpbmcgZWxzZS4gQmVjYXVzZSBQREJzIGFsd2F5cyBnZXQgdGhlIHNhbWUgbmFtZQorICAgICAgICAgICAgICAgICMgYXMgdGhlIG1haW4gdGFyZ2V0LCB3aXRoIC5wZGIgYXMgZXh0ZW5zaW9uLCBqdXN0IGZvcmNlIGl0LgorICAgICAgICAgICAgICAgIGxvY2FsIHRhcmdldCA9IFsgY2xhc3MubmV3IGZpbGUtdGFyZ2V0ICQobmFtZS1tYWluOlM9LnBkYikgZXhhY3QKKyAgICAgICAgICAgICAgICAgICAgOiBQREIgOiAkKHByb2plY3QpIDogJChhY3Rpb24pIF0gOworICAgICAgICAgICAgICAgIGxvY2FsIHJlZ2lzdGVyZWQtdGFyZ2V0ID0gWyB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciAkKHRhcmdldCkgXQorICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgaWYgJCh0YXJnZXQpICE9ICQocmVnaXN0ZXJlZC10YXJnZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbikucmVwbGFjZS10YXJnZXRzICQodGFyZ2V0KSA6ICQocmVnaXN0ZXJlZC10YXJnZXQpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQocmVnaXN0ZXJlZC10YXJnZXQpIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxlbWJlZC1tYW5pZmVzdD4gXSA9ICJvZmYiCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBNYW5pZmVzdCBpcyBhbiBldmlsIHRhcmdldC4gSXQgaGFzIC5tYW5pZmVzdCBhcHBlbmVkIHRvIHRoZQorICAgICAgICAgICAgICAgICMgbmFtZSBvZiB0aGUgbWFpbiB0YXJnZXQsIGluY2x1ZGluZyBleHRlbnNpb24sIGUuZy4KKyAgICAgICAgICAgICAgICAjIGEuZXhlLm1hbmlmZXN0LiBXZSB1c2UgdGhlICdleGFjdCcgbmFtZSB0byBhY2hpZXZlIHRoaXMKKyAgICAgICAgICAgICAgICAjIGVmZmVjdC4KKyAgICAgICAgICAgICAgICBsb2NhbCB0YXJnZXQgPSBbIGNsYXNzLm5ldyBmaWxlLXRhcmdldCAkKG5hbWUtbWFpbikubWFuaWZlc3QKKyAgICAgICAgICAgICAgICAgICAgZXhhY3QgOiBNQU5JRkVTVCA6ICQocHJvamVjdCkgOiAkKGFjdGlvbikgXSA7CisgICAgICAgICAgICAgICAgbG9jYWwgcmVnaXN0ZXJlZC10YXJnZXQgPSBbIHZpcnR1YWwtdGFyZ2V0LnJlZ2lzdGVyICQodGFyZ2V0KSBdCisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICBpZiAkKHRhcmdldCkgIT0gJChyZWdpc3RlcmVkLXRhcmdldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uKS5yZXBsYWNlLXRhcmdldHMgJCh0YXJnZXQpIDogJChyZWdpc3RlcmVkLXRhcmdldCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gJChyZWdpc3RlcmVkLXRhcmdldCkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworICAgIH0KK30KKworCisjIFVuc2FmZSB3b3JrZXIgcnVsZSBmb3IgdGhlIHJlZ2lzdGVyLXRvb2xzZXQoKSBydWxlLiBNdXN0IG5vdCBiZSBjYWxsZWQKKyMgbXVsdGlwbGUgdGltZXMuCisjCitsb2NhbCBydWxlIHJlZ2lzdGVyLXRvb2xzZXQtcmVhbGx5ICggKQoreworICAgIGZlYXR1cmUuZXh0ZW5kIHRvb2xzZXQgOiBtc3ZjIDsKKworICAgICMgSW50ZWwgYW5kIG1zdmMgc3VwcG9zZWRseSBoYXZlIGxpbmstY29tcGF0aWJsZSBvYmplY3RzLgorICAgIGZlYXR1cmUuc3ViZmVhdHVyZSB0b29sc2V0IG1zdmMgOiB2ZW5kb3IgOiBpbnRlbCA6IHByb3BhZ2F0ZWQgb3B0aW9uYWwgOworCisgICAgIyBJbmhlcml0IE1JREwgZmxhZ3MuCisgICAgdG9vbHNldC5pbmhlcml0LWZsYWdzIG1zdmMgOiBtaWRsIDsKKworICAgICMgSW5oZXJpdCBNQyBmbGFncy4KKyAgICB0b29sc2V0LmluaGVyaXQtZmxhZ3MgbXN2YyA6IG1jIDsKKworICAgICMgRHluYW1pYyBydW50aW1lIGNvbWVzIG9ubHkgaW4gTVQgZmxhdm91ci4KKyAgICB0b29sc2V0LmFkZC1yZXF1aXJlbWVudHMKKyAgICAgICAgPHRvb2xzZXQ+bXN2Yyw8cnVudGltZS1saW5rPnNoYXJlZDo8dGhyZWFkaW5nPm11bHRpIDsKKworICAgICMgRGVjbGFyZSBtc3ZjIHRvb2xzZXQgc3BlY2lmaWMgZmVhdHVyZXMuCisgICAgeworICAgICAgICBmZWF0dXJlLmZlYXR1cmUgZGVidWctc3RvcmUgOiBvYmplY3QgZGF0YWJhc2UgOiBwcm9wYWdhdGVkIDsKKyAgICAgICAgZmVhdHVyZS5mZWF0dXJlIHBjaC1zb3VyY2UgIDogICAgICAgICAgICAgICAgIDogZGVwZW5kZW5jeSBmcmVlIDsKKyAgICB9CisKKyAgICAjIERlY2xhcmUgZ2VuZXJhdG9ycy4KKyAgICB7CisgICAgICAgICMgVE9ETzogSXMgaXQgcG9zc2libGUgdG8gY29tYmluZSB0aGVzZT8gTWFrZSB0aGUgZ2VuZXJhdG9ycworICAgICAgICAjIG5vbi1jb21wb3Npbmcgc28gdGhhdCB0aGV5IGRvIG5vdCBjb252ZXJ0IGVhY2ggc291cmNlIGludG8gYSBzZXBhcmF0ZQorICAgICAgICAjIC5yc3AgZmlsZS4KKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3RlciBbIG5ldyBtc3ZjLWxpbmtpbmctZ2VuZXJhdG9yIG1zdmMubGluayA6CisgICAgICAgICAgICBPQkogU0VBUkNIRURfTElCIFNUQVRJQ19MSUIgSU1QT1JUX0xJQiA6IEVYRSA6IDx0b29sc2V0Pm1zdmMgXSA7CisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgbXN2Yy1saW5raW5nLWdlbmVyYXRvciBtc3ZjLmxpbmsuZGxsIDoKKyAgICAgICAgICAgIE9CSiBTRUFSQ0hFRF9MSUIgU1RBVElDX0xJQiBJTVBPUlRfTElCIDogU0hBUkVEX0xJQiBJTVBPUlRfTElCIDoKKyAgICAgICAgICAgIDx0b29sc2V0Pm1zdmMgXSA7CisKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3Rlci1hcmNoaXZlciBtc3ZjLmFyY2hpdmUgOiBPQkogOiBTVEFUSUNfTElCIDogPHRvb2xzZXQ+bXN2YyA7CisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBtc3ZjLmNvbXBpbGUuYysrIDogQ1BQIDogT0JKIDogPHRvb2xzZXQ+bXN2YyA7CisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBtc3ZjLmNvbXBpbGUuYyA6IEMgOiBPQkogOiA8dG9vbHNldD5tc3ZjIDsKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIG1zdmMuY29tcGlsZS5jKysucHJlcHJvY2VzcyA6IENQUCA6IFBSRVBST0NFU1NFRF9DUFAgOiA8dG9vbHNldD5tc3ZjIDsKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIG1zdmMuY29tcGlsZS5jLnByZXByb2Nlc3MgOiBDIDogUFJFUFJPQ0VTU0VEX0MgOiA8dG9vbHNldD5tc3ZjIDsKKworICAgICAgICAjIFVzaW5nICdyZWdpc3Rlci1jLWNvbXBpbGVyJyBhZGRzIHRoZSBidWlsZCBkaXJlY3RvcnkgdG8gSU5DTFVERVMuCisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBtc3ZjLmNvbXBpbGUucmMgOiBSQyA6IE9CSiglX3JlcykgOiA8dG9vbHNldD5tc3ZjIDsKKyAgICAgICAgZ2VuZXJhdG9ycy5vdmVycmlkZSBtc3ZjLmNvbXBpbGUucmMgOiByYy5jb21waWxlLnJlc291cmNlIDsKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCBtc3ZjLmNvbXBpbGUuYXNtIDogQVNNIDogT0JKIDogPHRvb2xzZXQ+bXN2YyA7CisKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIG1zdmMuY29tcGlsZS5pZGwgOiBJREwgOiBNU1RZUEVMSUIgSCBDKCVfaSkgQyglX3Byb3h5KSBDKCVfZGxsZGF0YSkgOiA8dG9vbHNldD5tc3ZjIDsKKyAgICAgICAgZ2VuZXJhdG9ycy5vdmVycmlkZSBtc3ZjLmNvbXBpbGUuaWRsIDogbWlkbC5jb21waWxlLmlkbCA7CisKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCBtc3ZjLmNvbXBpbGUubWMgOiBNQyA6IEggUkMgOiA8dG9vbHNldD5tc3ZjIDsKKyAgICAgICAgZ2VuZXJhdG9ycy5vdmVycmlkZSBtc3ZjLmNvbXBpbGUubWMgOiBtYy5jb21waWxlIDsKKworICAgICAgICAjIE5vdGU6IHRoZSAnSCcgc291cmNlIHR5cGUgd2lsbCBjYXRjaCBib3RoICcuaCcgYW5kICcuaHBwJyBoZWFkZXJzIGFzCisgICAgICAgICMgdGhlIGxhdHRlciBoYXZlIHRoZWlyIEhQUCB0eXBlIGRlcml2ZWQgZnJvbSBILiBUaGUgdHlwZSBvZiBjb21waWxhdGlvbgorICAgICAgICAjIGlzIGRldGVybWluZWQgZW50aXJlbHkgYnkgdGhlIGRlc3RpbmF0aW9uIHR5cGUuCisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgbXN2Yy1wY2gtZ2VuZXJhdG9yIG1zdmMuY29tcGlsZS5jLnBjaCAgIDogSCA6ICAgQ19QQ0ggT0JKIDogPHBjaD5vbiA8dG9vbHNldD5tc3ZjIF0gOworICAgICAgICBnZW5lcmF0b3JzLnJlZ2lzdGVyIFsgbmV3IG1zdmMtcGNoLWdlbmVyYXRvciBtc3ZjLmNvbXBpbGUuYysrLnBjaCA6IEggOiBDUFBfUENIIE9CSiA6IDxwY2g+b24gPHRvb2xzZXQ+bXN2YyBdIDsKKworICAgICAgICBnZW5lcmF0b3JzLm92ZXJyaWRlIG1zdmMuY29tcGlsZS5jLnBjaCAgIDogcGNoLmRlZmF1bHQtYy1wY2gtZ2VuZXJhdG9yIDsKKyAgICAgICAgZ2VuZXJhdG9ycy5vdmVycmlkZSBtc3ZjLmNvbXBpbGUuYysrLnBjaCA6IHBjaC5kZWZhdWx0LWNwcC1wY2gtZ2VuZXJhdG9yIDsKKyAgICB9CisKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZSBQQ0hfRklMRSAgIDxwY2g+b24gOiA8cGNoLWZpbGU+ICAgOworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIFBDSF9TT1VSQ0UgPHBjaD5vbiA6IDxwY2gtc291cmNlPiA7CisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgUENIX0hFQURFUiA8cGNoPm9uIDogPHBjaC1oZWFkZXI+IDsKKworICAgICMKKyAgICAjIERlY2xhcmUgZmxhZ3MgZm9yIGNvbXBpbGF0aW9uLgorICAgICMKKworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIENGTEFHUyA8b3B0aW1pemF0aW9uPnNwZWVkIDogL08yIDsKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZSBDRkxBR1MgPG9wdGltaXphdGlvbj5zcGFjZSA6IC9PMSA7CisKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZSBDRkxBR1MgJCguY3B1LWFyY2gtaWE2NCkvPGluc3RydWN0aW9uLXNldD4kKC5jcHUtdHlwZS1pdGFuaXVtKSA6IC9HMSA7CisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgQ0ZMQUdTICQoLmNwdS1hcmNoLWlhNjQpLzxpbnN0cnVjdGlvbi1zZXQ+JCguY3B1LXR5cGUtaXRhbml1bTIpIDogL0cyIDsKKworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIENGTEFHUyA8ZGVidWctc3ltYm9scz5vbi88ZGVidWctc3RvcmU+b2JqZWN0IDogL1o3IDsKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZSBDRkxBR1MgPGRlYnVnLXN5bWJvbHM+b24vPGRlYnVnLXN0b3JlPmRhdGFiYXNlIDogL1ppIDsKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZSBDRkxBR1MgPG9wdGltaXphdGlvbj5vZmYgOiAvT2QgOworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIENGTEFHUyA8aW5saW5pbmc+b2ZmIDogL09iMCA7CisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgQ0ZMQUdTIDxpbmxpbmluZz5vbiA6IC9PYjEgOworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIENGTEFHUyA8aW5saW5pbmc+ZnVsbCA6IC9PYjIgOworCisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgQ0ZMQUdTIDx3YXJuaW5ncz5vbiA6IC9XMyA7CisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgQ0ZMQUdTIDx3YXJuaW5ncz5vZmYgOiAvVzAgOworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIENGTEFHUyA8d2FybmluZ3M+YWxsIDogL1c0IDsKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZSBDRkxBR1MgPHdhcm5pbmdzLWFzLWVycm9ycz5vbiA6IC9XWCA7CisKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZSBDKytGTEFHUyAgPGV4Y2VwdGlvbi1oYW5kbGluZz5vbi88YXN5bmNoLWV4Y2VwdGlvbnM+b2ZmLzxleHRlcm4tYy1ub3Rocm93Pm9mZiA6IC9FSHMgOworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIEMrK0ZMQUdTICA8ZXhjZXB0aW9uLWhhbmRsaW5nPm9uLzxhc3luY2gtZXhjZXB0aW9ucz5vZmYvPGV4dGVybi1jLW5vdGhyb3c+b24gOiAvRUhzYyA7CisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgQysrRkxBR1MgIDxleGNlcHRpb24taGFuZGxpbmc+b24vPGFzeW5jaC1leGNlcHRpb25zPm9uLzxleHRlcm4tYy1ub3Rocm93Pm9mZiA6IC9FSGEgOworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIEMrK0ZMQUdTICA8ZXhjZXB0aW9uLWhhbmRsaW5nPm9uLzxhc3luY2gtZXhjZXB0aW9ucz5vbi88ZXh0ZXJuLWMtbm90aHJvdz5vbiA6IC9FSGFjIDsKKworICAgICMgQnkgZGVmYXVsdCA4LjAgZW5hYmxlcyBydHRpIHN1cHBvcnQgd2hpbGUgcHJpb3IgdmVyc2lvbnMgZGlzYWJsZWQgaXQuIFdlCisgICAgIyBzaW1wbHkgZW5hYmxlIG9yIGRpc2FibGUgaXQgZXhwbGljaXRseSBzbyB3ZSBkbyBub3QgaGF2ZSB0byBkZXBlbmQgb24gdGhpcworICAgICMgZGVmYXVsdCBiZWhhdmlvdXIuCisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgQ0ZMQUdTIDxydHRpPm9uIDogL0dSIDsKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZSBDRkxBR1MgPHJ0dGk+b2ZmIDogL0dSLSA7CisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgQ0ZMQUdTIDxydW50aW1lLWRlYnVnZ2luZz5vZmYvPHJ1bnRpbWUtbGluaz5zaGFyZWQgOiAvTUQgOworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIENGTEFHUyA8cnVudGltZS1kZWJ1Z2dpbmc+b24vPHJ1bnRpbWUtbGluaz5zaGFyZWQgOiAvTURkIDsKKworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIENGTEFHUyA8cnVudGltZS1kZWJ1Z2dpbmc+b2ZmLzxydW50aW1lLWxpbms+c3RhdGljLzx0aHJlYWRpbmc+bXVsdGkgOiAvTVQgOworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlIENGTEFHUyA8cnVudGltZS1kZWJ1Z2dpbmc+b24vPHJ1bnRpbWUtbGluaz5zdGF0aWMvPHRocmVhZGluZz5tdWx0aSA6IC9NVGQgOworCisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgT1BUSU9OUyA8Y2ZsYWdzPiA6IDsKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZS5jKysgT1BUSU9OUyA8Y3h4ZmxhZ3M+IDogOworCisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgUERCX0NGTEFHIDxkZWJ1Zy1zeW1ib2xzPm9uLzxkZWJ1Zy1zdG9yZT5kYXRhYmFzZSA6IC9GZCA7CisKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZSBERUZJTkVTIDxkZWZpbmU+IDsKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZSBVTkRFRlMgPHVuZGVmPiA7CisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUgSU5DTFVERVMgPGluY2x1ZGU+IDsKKworICAgICMgRGVjbGFyZSBmbGFncyBmb3IgdGhlIGFzc2VtYmxlci4KKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZS5hc20gVVNFUl9BU01GTEFHUyA8YXNtZmxhZ3M+IDsKKworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlLmFzbSBBU01GTEFHUyA8ZGVidWctc3ltYm9scz5vbiA6ICIvWmkgL1pkIiA7CisKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZS5hc20gQVNNRkxBR1MgPHdhcm5pbmdzPm9uIDogL1czIDsKKyAgICB0b29sc2V0LmZsYWdzIG1zdmMuY29tcGlsZS5hc20gQVNNRkxBR1MgPHdhcm5pbmdzPm9mZiA6IC9XMCA7CisgICAgdG9vbHNldC5mbGFncyBtc3ZjLmNvbXBpbGUuYXNtIEFTTUZMQUdTIDx3YXJuaW5ncz5hbGwgOiAvVzQgOworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlLmFzbSBBU01GTEFHUyA8d2FybmluZ3MtYXMtZXJyb3JzPm9uIDogL1dYIDsKKworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5jb21waWxlLmFzbSBERUZJTkVTIDxkZWZpbmU+IDsKKworICAgICMgRGVjbGFyZSBmbGFncyBmb3IgbGlua2luZy4KKyAgICB7CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5saW5rIFBEQl9MSU5LRkxBRyA8ZGVidWctc3ltYm9scz5vbi88ZGVidWctc3RvcmU+ZGF0YWJhc2UgOiAvUERCOiA7ICAjIG5vdCB1c2VkIHlldAorICAgICAgICB0b29sc2V0LmZsYWdzIG1zdmMubGluayBMSU5LRkxBR1MgPGRlYnVnLXN5bWJvbHM+b24gOiAvREVCVUcgOworICAgICAgICB0b29sc2V0LmZsYWdzIG1zdmMubGluayBERUZfRklMRSA8ZGVmLWZpbGU+IDsKKworICAgICAgICAjIFRoZSBsaW5rZXIgZGlzYWJsZXMgdGhlIGRlZmF1bHQgb3B0aW1pemF0aW9ucyB3aGVuIHVzaW5nIC9ERUJVRyBzbyB3ZQorICAgICAgICAjIGhhdmUgdG8gZW5hYmxlIHRoZW0gbWFudWFsbHkgZm9yIHJlbGVhc2UgYnVpbGRzIHdpdGggZGVidWcgc3ltYm9scy4KKyAgICAgICAgdG9vbHNldC5mbGFncyBtc3ZjIExJTktGTEFHUyA8ZGVidWctc3ltYm9scz5vbi88cnVudGltZS1kZWJ1Z2dpbmc+b2ZmIDogL09QVDpSRUYsSUNGIDsKKworICAgICAgICB0b29sc2V0LmZsYWdzIG1zdmMgTElOS0ZMQUdTIDx1c2VyLWludGVyZmFjZT5jb25zb2xlIDogL3N1YnN5c3RlbTpjb25zb2xlIDsKKyAgICAgICAgdG9vbHNldC5mbGFncyBtc3ZjIExJTktGTEFHUyA8dXNlci1pbnRlcmZhY2U+Z3VpIDogL3N1YnN5c3RlbTp3aW5kb3dzIDsKKyAgICAgICAgdG9vbHNldC5mbGFncyBtc3ZjIExJTktGTEFHUyA8dXNlci1pbnRlcmZhY2U+d2luY2UgOiAvc3Vic3lzdGVtOndpbmRvd3NjZSA7CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgbXN2YyBMSU5LRkxBR1MgPHVzZXItaW50ZXJmYWNlPm5hdGl2ZSA6IC9zdWJzeXN0ZW06bmF0aXZlIDsKKyAgICAgICAgdG9vbHNldC5mbGFncyBtc3ZjIExJTktGTEFHUyA8dXNlci1pbnRlcmZhY2U+YXV0byA6IC9zdWJzeXN0ZW06cG9zaXggOworCisgICAgICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5saW5rIE9QVElPTlMgPGxpbmtmbGFncz4gOworICAgICAgICB0b29sc2V0LmZsYWdzIG1zdmMubGluayBMSU5LUEFUSCA8bGlicmFyeS1wYXRoPiA7CisKKyAgICAgICAgdG9vbHNldC5mbGFncyBtc3ZjLmxpbmsgRklORExJQlNfU1QgPGZpbmQtc3RhdGljLWxpYnJhcnk+IDsKKyAgICAgICAgdG9vbHNldC5mbGFncyBtc3ZjLmxpbmsgRklORExJQlNfU0EgPGZpbmQtc2hhcmVkLWxpYnJhcnk+IDsKKyAgICAgICAgdG9vbHNldC5mbGFncyBtc3ZjLmxpbmsgTElCUkFSWV9PUFRJT04gPHRvb2xzZXQ+bXN2YyA6ICIiIDogdW5jaGVja2VkIDsKKyAgICAgICAgdG9vbHNldC5mbGFncyBtc3ZjLmxpbmsgTElCUkFSSUVTX01FTlRJT05FRF9CWV9GSUxFIDogPGxpYnJhcnktZmlsZT4gOworICAgIH0KKworICAgIHRvb2xzZXQuZmxhZ3MgbXN2Yy5hcmNoaXZlIEFST1BUSU9OUyA8YXJjaGl2ZWZsYWdzPiA7Cit9CisKKworIyBMb2NhdGVzIHRoZSByZXF1ZXN0ZWQgc2V0dXAgc2NyaXB0IHVuZGVyIHRoZSBnaXZlbiBmb2xkZXIgYW5kIHJldHVybnMgaXRzIGZ1bGwKKyMgcGF0aCBvciBub3RoaW5nIGluIGNhc2UgdGhlIHNjcmlwdCBjYW4gbm90IGJlIGZvdW5kLiBJbiBjYXNlIG11bHRpcGxlIHNjcmlwdHMKKyMgYXJlIGZvdW5kIG9ubHkgdGhlIGZpcnN0IG9uZSBpcyByZXR1cm5lZC4KKyMKKyMgVE9ETzogVGhlcmUgdXNlZCB0byBleGlzdCBhIGNvZGUgY29tbWVudCBmb3IgdGhlIG1zdmMuaW5pdCBydWxlIHN0YXRpbmcgdGhhdAorIyB3ZSBkbyBub3QgY29ycmVjdGx5IGRldGVjdCB0aGUgbG9jYXRpb24gb2YgdGhlIHZjdmFyczMyLmJhdCBzZXR1cCBzY3JpcHQgZm9yCisjIHRoZSBmcmVlIFZDNy4xIHRvb2xzIGluIGNhc2UgdXNlciBleHBsaWNpdGx5IHByb3ZpZGVzIGEgcGF0aC4gVGhpcyBzaG91bGQgYmUKKyMgdGVzdGVkIG9yIHNpbXBseSByZW1vdmUgdGhpcyB3aG9sZSBjb21tZW50IGluIGNhc2UgdGhpcyB0b29sc2V0IHZlcnNpb24gaXMgbm8KKyMgbG9uZ2VyIGltcG9ydGFudC4KKyMKK2xvY2FsIHJ1bGUgbG9jYXRlLWRlZmF1bHQtc2V0dXAgKCBjb21tYW5kIDogcGFyZW50IDogc2V0dXAtbmFtZSApCit7CisgICAgbG9jYWwgcmVzdWx0ID0gWyBHTE9CICQoY29tbWFuZCkgJChwYXJlbnQpIDogJChzZXR1cC1uYW1lKSBdIDsKKyAgICBpZiAkKHJlc3VsdFsxXSkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHJlc3VsdFsxXSkgOworICAgIH0KK30KKworCisjIFZhbGlkYXRlcyBnaXZlbiBwYXRoLCByZWdpc3RlcnMgZm91bmQgY29uZmlndXJhdGlvbiBhbmQgcHJpbnRzIGRlYnVnCisjIGluZm9ybWF0aW9uIGFib3V0IGl0LgorIworbG9jYWwgcnVsZSByZWdpc3Rlci1jb25maWd1cmF0aW9uICggdmVyc2lvbiA6IHBhdGggPyApCit7CisgICAgaWYgJChwYXRoKQorICAgIHsKKyAgICAgICAgbG9jYWwgY29tbWFuZCA9IFsgR0xPQiAkKHBhdGgpIDogY2wuZXhlIF0gOworCisgICAgICAgIGlmICQoY29tbWFuZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFQ0hPIG5vdGljZTogW21zdmMtY2ZnXSBtc3ZjLSQodmVyc2lvbikgZGV0ZWN0ZWQsIGNvbW1hbmQ6CisgICAgICAgICAgICAgICAgICAgICckKGNvbW1hbmQpJyA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICQoLnZlcnNpb25zKS5yZWdpc3RlciAkKHZlcnNpb24pIDsKKyAgICAgICAgICAgICQoLnZlcnNpb25zKS5zZXQgJCh2ZXJzaW9uKSA6IG9wdGlvbnMgOiA8Y29tbWFuZD4kKGNvbW1hbmQpIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgIFN0YXJ0dXAgY29kZSBleGVjdXRlZCB3aGVuIGxvYWRpbmcgdGhpcyBtb2R1bGUuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiBbIE1BVENIICgtLWRlYnVnLWNvbmZpZ3VyYXRpb24pIDogWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0gXQoreworICAgIC5kZWJ1Zy1jb25maWd1cmF0aW9uID0gdHJ1ZSA7Cit9CisKKyMgTWlzY2VsbGFuZW91cyBjb25zdGFudHMuCisuUk0gPSBbIGNvbW1vbi5ybS1jb21tYW5kIF0gOworLm5sID0gIgorIiA7CisuUHJvZ3JhbUZpbGVzID0gWyBwYXRoLm1ha2UgWyBjb21tb24uZ2V0LXByb2dyYW0tZmlsZXMtZGlyIF0gXSA7CisuZXNjYXBlZC1kb3VibGUtcXVvdGUgPSAiXCIiIDsKKy5UT1VDSF9GSUxFID0gWyBjb21tb24uZmlsZS10b3VjaC1jb21tYW5kIF0gOworCisjIExpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgY29uZmlndXJhdGlvbnMuCisudmVyc2lvbnMgPSBbIG5ldyBjb25maWd1cmF0aW9ucyBdIDsKKworIyBTdXBwb3J0ZWQgQ1BVIGFyY2hpdGVjdHVyZXMuCisuY3B1LWFyY2gtaTM4NiA9CisgICAgPGFyY2hpdGVjdHVyZT4vPGFkZHJlc3MtbW9kZWw+CisgICAgPGFyY2hpdGVjdHVyZT4vPGFkZHJlc3MtbW9kZWw+MzIKKyAgICA8YXJjaGl0ZWN0dXJlPng4Ni88YWRkcmVzcy1tb2RlbD4KKyAgICA8YXJjaGl0ZWN0dXJlPng4Ni88YWRkcmVzcy1tb2RlbD4zMiA7CisKKy5jcHUtYXJjaC1hbWQ2NCA9CisgICAgPGFyY2hpdGVjdHVyZT4vPGFkZHJlc3MtbW9kZWw+NjQKKyAgICA8YXJjaGl0ZWN0dXJlPng4Ni88YWRkcmVzcy1tb2RlbD42NCA7CisKKy5jcHUtYXJjaC1pYTY0ID0KKyAgICA8YXJjaGl0ZWN0dXJlPmlhNjQvPGFkZHJlc3MtbW9kZWw+CisgICAgPGFyY2hpdGVjdHVyZT5pYTY0LzxhZGRyZXNzLW1vZGVsPjY0IDsKKworLmNwdS1hcmNoLWFybSA9CisgICAgPGFyY2hpdGVjdHVyZT5hcm0vPGFkZHJlc3MtbW9kZWw+MzIgOworCisKKyMgU3VwcG9ydGVkIENQVSB0eXBlcyAob25seSBJdGFuaXVtIG9wdGltaXphdGlvbiBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgZnJvbQorIyBWQysrIDIwMDUgb24pLiBTZWUKKyMgaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9oNjZzNXMwZSh2cy45MCkuYXNweCBmb3IgbW9yZQorIyBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KKy5jcHUtdHlwZS1nNSAgICAgICA9IGk1ODYgcGVudGl1bSBwZW50aXVtLW1teCA7CisuY3B1LXR5cGUtZzYgICAgICAgPSBpNjg2IHBlbnRpdW1wcm8gcGVudGl1bTIgcGVudGl1bTMgcGVudGl1bTNtIHBlbnRpdW0tbSBrNgorICAgICAgICAgICAgICAgICAgICAgazYtMiBrNi0zIHdpbmNoaXAtYzYgd2luY2hpcDIgYzMgYzMtMiA7CisuY3B1LXR5cGUtZW02NHQgICAgPSBwcmVzY290dCBub2NvbmEgY29yZTIgY29yZWk3IGNvcmVpNy1hdnggY29yZS1hdngtaQorICAgICAgICAgICAgICAgICAgICAgY29ucm9lIGNvbnJvZS14ZSBjb25yb2UtbCBhbGxlbmRhbGUgbWVyb20KKyAgICAgICAgICAgICAgICAgICAgIG1lcm9tLXhlIGtlbnRzZmllbGQga2VudHNmaWVsZC14ZSBwZW5yeW4gd29sZmRhbGUKKyAgICAgICAgICAgICAgICAgICAgIHlvcmtzZmllbGQgbmVoYWxlbSBzYW5keS1icmlkZ2UgaXZ5LWJyaWRnZSBoYXN3ZWxsIDsKKy5jcHUtdHlwZS1hbWQ2NCAgICA9IGs4IG9wdGVyb24gYXRobG9uNjQgYXRobG9uLWZ4IGs4LXNzZTMgb3B0ZXJvbi1zc2UzCisgICAgICAgICAgICAgICAgICAgICBhdGhsb242NC1zc2UzIGFtZGZhbTEwIGJhcmNlbG9uYSBiZHZlcjEgYmR2ZXIyIGJkdmVyMyBidHZlcjEgYnR2ZXIyIDsKKy5jcHUtdHlwZS1nNyAgICAgICA9IHBlbnRpdW00IHBlbnRpdW00bSBhdGhsb24gYXRobG9uLXRiaXJkIGF0aGxvbi00IGF0aGxvbi14cAorICAgICAgICAgICAgICAgICAgICAgYXRobG9uLW1wICQoLmNwdS10eXBlLWVtNjR0KSAkKC5jcHUtdHlwZS1hbWQ2NCkgOworLmNwdS10eXBlLWl0YW5pdW0gID0gaXRhbml1bSBpdGFuaXVtMSBtZXJjZWQgOworLmNwdS10eXBlLWl0YW5pdW0yID0gaXRhbml1bTIgbWNraW5sZXkgOworCisKKyMgS25vd24gdG9vbHNldCB2ZXJzaW9ucywgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KKy5rbm93bi12ZXJzaW9ucyA9IDEyLjAgMTEuMCAxMC4wIDEwLjBleHByZXNzIDkuMCA5LjBleHByZXNzIDguMCA4LjBleHByZXNzIDcuMQorICAgIDcuMXRvb2xraXQgNy4wIDYuMCA7CisKKyMgVmVyc2lvbiBhbGlhc2VzLgorLnZlcnNpb24tYWxpYXMtNiA9IDYuMCA7CisudmVyc2lvbi1hbGlhcy02LjUgPSA2LjAgOworLnZlcnNpb24tYWxpYXMtNyA9IDcuMCA7CisudmVyc2lvbi1hbGlhcy04ID0gOC4wIDsKKy52ZXJzaW9uLWFsaWFzLTkgPSA5LjAgOworLnZlcnNpb24tYWxpYXMtMTAgPSAxMC4wIDsKKy52ZXJzaW9uLWFsaWFzLTExID0gMTEuMCA7CisudmVyc2lvbi1hbGlhcy0xMiA9IDEyLjAgOworCisjIE5hbWVzIG9mIHJlZ2lzdHJ5IGtleXMgY29udGFpbmluZyB0aGUgVmlzdWFsIEMrKyBpbnN0YWxsYXRpb24gcGF0aCAocmVsYXRpdmUKKyMgdG8gIkhLRVlfTE9DQUxfTUFDSElORVxTT0ZUV0FSRVxcTWljcm9zb2Z0IikuCisudmVyc2lvbi02LjAtcmVnID0gIlZpc3VhbFN0dWRpb1xcNi4wXFxTZXR1cFxcTWljcm9zb2Z0IFZpc3VhbCBDKysiIDsKKy52ZXJzaW9uLTcuMC1yZWcgPSAiVmlzdWFsU3R1ZGlvXFw3LjBcXFNldHVwXFxWQyIgOworLnZlcnNpb24tNy4xLXJlZyA9ICJWaXN1YWxTdHVkaW9cXDcuMVxcU2V0dXBcXFZDIiA7CisudmVyc2lvbi04LjAtcmVnID0gIlZpc3VhbFN0dWRpb1xcOC4wXFxTZXR1cFxcVkMiIDsKKy52ZXJzaW9uLTguMGV4cHJlc3MtcmVnID0gIlZDRXhwcmVzc1xcOC4wXFxTZXR1cFxcVkMiIDsKKy52ZXJzaW9uLTkuMC1yZWcgPSAiVmlzdWFsU3R1ZGlvXFw5LjBcXFNldHVwXFxWQyIgOworLnZlcnNpb24tOS4wZXhwcmVzcy1yZWcgPSAiVkNFeHByZXNzXFw5LjBcXFNldHVwXFxWQyIgOworLnZlcnNpb24tMTAuMC1yZWcgPSAiVmlzdWFsU3R1ZGlvXFwxMC4wXFxTZXR1cFxcVkMiIDsKKy52ZXJzaW9uLTEwLjBleHByZXNzLXJlZyA9ICJWQ0V4cHJlc3NcXDEwLjBcXFNldHVwXFxWQyIgOworLnZlcnNpb24tMTEuMC1yZWcgPSAiVmlzdWFsU3R1ZGlvXFwxMS4wXFxTZXR1cFxcVkMiIDsKKy52ZXJzaW9uLTEyLjAtcmVnID0gIlZpc3VhbFN0dWRpb1xcMTIuMFxcU2V0dXBcXFZDIiA7CisKKyMgVmlzdWFsIEMrKyBUb29sa2l0IDIwMDMgZG9lcyBub3Qgc3RvcmUgaXRzIGluc3RhbGxhdGlvbiBwYXRoIGluIHRoZSByZWdpc3RyeS4KKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlICdWQ1Rvb2xraXRJbnN0YWxsRGlyJyBhbmQgdGhlIGRlZmF1bHQgaW5zdGFsbGF0aW9uCisjIHBhdGggd2lsbCBiZSBjaGVja2VkIGluc3RlYWQuCisudmVyc2lvbi03LjF0b29sa2l0LXBhdGggICAgPSAiTWljcm9zb2Z0IFZpc3VhbCBDKysgVG9vbGtpdCAyMDAzIiAiYmluIiA7CisudmVyc2lvbi03LjF0b29sa2l0LWVudiAgICAgPSBWQ1Rvb2xraXRJbnN0YWxsRGlyIDsKKworIyBQYXRoIHRvIHRoZSBmb2xkZXIgY29udGFpbmluZyAiY2wuZXhlIiByZWxhdGl2ZSB0byB0aGUgdmFsdWUgb2YgdGhlCisjIGNvcnJlc3BvbmRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuCisudmVyc2lvbi03LjF0b29sa2l0LWVudnBhdGggPSAiYmluIiA7CisKKworIyBBdXRvLWRldGVjdCBhbGwgdGhlIGF2YWlsYWJsZSBtc3ZjIGluc3RhbGxhdGlvbnMgb24gdGhlIHN5c3RlbS4KK2F1dG8tZGV0ZWN0LXRvb2xzZXQtdmVyc2lvbnMgOworCisKKyMgQW5kIGZpbmFsbHkgdHJpZ2dlciB0aGUgYWN0dWFsIEJvb3N0IEJ1aWxkIHRvb2xzZXQgcmVnaXN0cmF0aW9uLgorcmVnaXN0ZXItdG9vbHNldCA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL25vdGZpbGUuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9ub3RmaWxlLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDA5ODViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9ub3RmaWxlLmphbQpAQCAtMCwwICsxLDY1IEBACisjIENvcHlyaWdodCAoYykgMjAwNSBWbGFkaW1pciBQcnVzLgorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgdGFyZ2V0cyA7CitpbXBvcnQgdG9vbHNldCA7CitpbXBvcnQgdHlwZSA7CisKKwordHlwZS5yZWdpc3RlciBOT1RGSUxFX01BSU4gOworCisKK2NsYXNzIG5vdGZpbGUtZ2VuZXJhdG9yIDogZ2VuZXJhdG9yCit7CisgICAgcnVsZSBfX2luaXRfXyAoICogOiAqICkKKyAgICB7CisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KQorICAgICAgICAgICAgOiAkKDkpIDogJCgxMCkgOiAkKDExKSA6ICQoMTIpIDogJCgxMykgOiAkKDE0KSA6ICQoMTUpIDogJCgxNikgOgorICAgICAgICAgICAgJCgxNykgOiAkKDE4KSA6ICQoMTkpIDsKKyAgICB9CisKKyAgICBydWxlIHJ1biAoIHByb2plY3QgbmFtZSA/IDogcHJvcGVydHktc2V0IDogc291cmNlcyAqIDogbXVsdGlwbGUgPyApCisgICAgeworICAgICAgICBsb2NhbCBhY3Rpb24gOworICAgICAgICBsb2NhbCBhY3Rpb24tbmFtZSA9IFsgJChwcm9wZXJ0eS1zZXQpLmdldCA8YWN0aW9uPiBdIDsKKyAgICAgICAgbG9jYWwgbSA9IFsgTUFUQ0ggXkAoLiopIDogJChhY3Rpb24tbmFtZSkgXSA7CisgICAgICAgIGlmICQobSkKKyAgICAgICAgeworICAgICAgICAgICAgYWN0aW9uID0gWyBuZXcgYWN0aW9uICQoc291cmNlcykgOiAkKG1bMV0pIDogJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYWN0aW9uID0gWyBuZXcgYWN0aW9uICQoc291cmNlcykgOiBub3RmaWxlLnJ1biA6ICQocHJvcGVydHktc2V0KSBdIDsKKyAgICAgICAgfQorICAgICAgICBsb2NhbCB0ID0gWyBuZXcgbm90ZmlsZS10YXJnZXQgJChuYW1lKSA6ICQocHJvamVjdCkgOiAkKGFjdGlvbikgXSA7CisgICAgICAgIHJldHVybiBbIHZpcnR1YWwtdGFyZ2V0LnJlZ2lzdGVyICQodCkgXSA7CisgICAgfQorfQorCisKK2dlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgbm90ZmlsZS1nZW5lcmF0b3Igbm90ZmlsZS5tYWluIDogOiBOT1RGSUxFX01BSU4gXSA7CisKKwordG9vbHNldC5mbGFncyBub3RmaWxlLnJ1biBBQ1RJT04gOiA8YWN0aW9uPiA7CisKKworYWN0aW9ucyBydW4KK3sKKyAgICAkKEFDVElPTikKK30KKworCitydWxlIG5vdGZpbGUgKCB0YXJnZXQtbmFtZSA6IGFjdGlvbiArIDogc291cmNlcyAqIDogcmVxdWlyZW1lbnRzICogOgorICAgIGRlZmF1bHQtYnVpbGQgKiApCit7CisgICAgdGFyZ2V0cy5jcmVhdGUtdHlwZWQtdGFyZ2V0IE5PVEZJTEVfTUFJTiA6IFsgcHJvamVjdC5jdXJyZW50IF0gOgorICAgICAgICAkKHRhcmdldC1uYW1lKSA6ICQoc291cmNlcykgOiAkKHJlcXVpcmVtZW50cykgPGFjdGlvbj4kKGFjdGlvbikgOgorICAgICAgICAkKGRlZmF1bHQtYnVpbGQpIDsKK30KKworSU1QT1JUICQoX19uYW1lX18pIDogbm90ZmlsZSA6IDogbm90ZmlsZSA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3BhY2thZ2UuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9wYWNrYWdlLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThjMjIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9wYWNrYWdlLmphbQpAQCAtMCwwICsxLDE2NSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDUgVmxhZGltaXIgUHJ1cy4KKyMgQ29weXJpZ2h0IDIwMDYgUmVuZSBSaXZlcmEuCisjCisjIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKKyMgTGljZW5zZSBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIFByb3ZpZGVzIG1lY2hhbmlzbSBmb3IgaW5zdGFsbGluZyB3aG9sZSBwYWNrYWdlcyBpbnRvIGEgc3BlY2lmaWMgZGlyZWN0b3J5CisjIHN0cnVjdHVyZS4gVGhpcyBpcyBvcHBvc2VkIHRvIHRoZSAnaW5zdGFsbCcgcnVsZSwgdGhhdCBpbnN0YWxscyBhIG51bWJlciBvZgorIyB0YXJnZXRzIHRvIGEgc2luZ2xlIGRpcmVjdG9yeSwgYW5kIGRvZXMgbm90IGNhcmUgYWJvdXQgZGlyZWN0b3J5IHN0cnVjdHVyZSBhdAorIyBhbGwuCisKKyMgRXhhbXBsZSB1c2FnZToKKyMKKyMgICBwYWNrYWdlLmluc3RhbGwgYm9vc3QgOiA8cHJvcGVydGllcz4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgOiA8YmluYXJpZXM+CisjICAgICAgICAgICAgICAgICAgICAgICAgIDogPGxpYnJhcmllcz4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgOiA8aGVhZGVycz4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgOworIworIyBUaGlzIHdpbGwgaW5zdGFsbCBiaW5hcmllcywgbGlicmFyaWVzIGFuZCBoZWFkZXJzIHRvIHRoZSAncHJvcGVyJyBsb2NhdGlvbiwKKyMgZ2l2ZW4gYnkgY29tbWFuZCBsaW5lIG9wdGlvbnMgLS1wcmVmaXgsIC0tZXhlYy1wcmVmaXgsIC0tYmluZGlyLCAtLWxpYmRpciBhbmQKKyMgLS1pbmNsdWRlZGlyLgorIworIyBUaGUgcnVsZSBpcyBqdXN0IGEgY29udmVuaWVudCB3cmFwcGVyLCBhdm9pZGluZyB0aGUgbmVlZCB0byBkZWZpbmUgc2V2ZXJhbAorIyAnaW5zdGFsbCcgdGFyZ2V0cy4KKyMKKyMgVGhlIG9ubHkgaW5zdGFsbC1yZWxhdGVkIGZlYXR1cmUgaXMgPGluc3RhbGwtc291cmNlLXJvb3Q+LiBJdCB3aWxsIGFwcGx5IHRvCisjIGhlYWRlcnMgb25seSBhbmQgaWYgcHJlc2VudCwgcGF0aHMgb2YgaGVhZGVycyByZWxhdGl2ZWx5IHRvIHNvdXJjZSByb290IHdpbGwKKyMgYmUgcmV0YWluZWQgYWZ0ZXIgaW5zdGFsbGluZy4gSWYgaXQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiAiLiIgaXMgYXNzdW1lZCwgc28KKyMgcmVsYXRpdmUgcGF0aHMgaW4gaGVhZGVycyBhcmUgYWx3YXlzIHByZXNlcnZlZC4KKworaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworaW1wb3J0IG9wdGlvbiA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IHN0YWdlIDsKK2ltcG9ydCB0YXJnZXRzIDsKK2ltcG9ydCBtb2R1bGVzIDsKKworZmVhdHVyZS5mZWF0dXJlIGluc3RhbGwtZGVmYXVsdC1wcmVmaXggOiA6IGZyZWUgaW5jaWRlbnRhbCA7CisKK3J1bGUgaW5zdGFsbCAoIG5hbWUgcGFja2FnZS1uYW1lID8gOiByZXF1aXJlbWVudHMgKiA6IGJpbmFyaWVzICogOiBsaWJyYXJpZXMgKiA6IGhlYWRlcnMgKiApCit7CisgICAgcGFja2FnZS1uYW1lID89ICQobmFtZSkgOworICAgIGlmIFsgTUFUQ0ggLS1wcmVmaXg9KC4qKSA6IFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIF0KKyAgICB7CisgICAgICAgICMgSWYgLS1wcmVmaXggaXMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwKKyAgICAgICAgIyB0aGVuIHdlIG5lZWQgd2lwZSBhd2F5IGFueSBzZXR0aW5ncyBvZiBsaWJkaXIvaW5jbHVkaXIgdGhhdAorICAgICAgICAjIGlzIHNwZWNpZmllZCB2aWEgb3B0aW9ucyBpbiBjb25maWcgZmlsZXMuCisgICAgICAgIG9wdGlvbi5zZXQgYmluZGlyIDogOworICAgICAgICBvcHRpb24uc2V0IGxpYmRpciA6IDsKKyAgICAgICAgb3B0aW9uLnNldCBpbmNsdWRlZGlyIDogOworICAgIH0KKyAgICAgICAgICAgIAorICAgICMgSWYgPGluc3RhbGwtc291cmNlLXJvb3Q+IGlzIG5vdCBzcGVjaWZpZWQsIGFsbCBoZWFkZXJzIGFyZSBpbnN0YWxsZWQgdG8KKyAgICAjIHByZWZpeC9pbmNsdWRlLCBubyBtYXR0ZXIgd2hhdCB0aGVpciByZWxhdGl2ZSBwYXRoIGlzLiBTb21ldGltZXMgdGhhdCBpcworICAgICMgd2hhdCBpcyBuZWVkZWQuCisgICAgbG9jYWwgaW5zdGFsbC1zb3VyY2Utcm9vdCA9IFsgcHJvcGVydHkuc2VsZWN0IDxpbnN0YWxsLXNvdXJjZS1yb290PiA6CisgICAgICAgICQocmVxdWlyZW1lbnRzKSBdIDsKKyAgICBpbnN0YWxsLXNvdXJjZS1yb290ID0gJChpbnN0YWxsLXNvdXJjZS1yb290Okc9KSA7CisgICAgcmVxdWlyZW1lbnRzID0gWyBwcm9wZXJ0eS5jaGFuZ2UgJChyZXF1aXJlbWVudHMpIDogPGluc3RhbGwtc291cmNlLXJvb3Q+IF0gOworCisgICAgbG9jYWwgaW5zdGFsbC1oZWFkZXItc3ViZGlyID0gWyBwcm9wZXJ0eS5zZWxlY3QgPGluc3RhbGwtaGVhZGVyLXN1YmRpcj4gOgorICAgICAgICAkKHJlcXVpcmVtZW50cykgXSA7CisgICAgaW5zdGFsbC1oZWFkZXItc3ViZGlyID0gLyQoaW5zdGFsbC1oZWFkZXItc3ViZGlyOkc9KSA7CisgICAgaW5zdGFsbC1oZWFkZXItc3ViZGlyID89ICIiIDsKKyAgICByZXF1aXJlbWVudHMgPSBbIHByb3BlcnR5LmNoYW5nZSAkKHJlcXVpcmVtZW50cykgOiA8aW5zdGFsbC1oZWFkZXItc3ViZGlyPiBdCisgICAgICAgIDsKKworICAgICMgRmlyc3QsIGZpZ3VyZSBvdXQgYWxsIGxvY2F0aW9ucy4gVXNlIHRoZSBkZWZhdWx0IGlmIG5vIHByZWZpeCBvcHRpb24KKyAgICAjIGdpdmVuLgorICAgIGxvY2FsIHByZWZpeCA9IFsgZ2V0LXByZWZpeCAkKG5hbWUpIDogJChyZXF1aXJlbWVudHMpIF0gOworCisgICAgIyBBcmNoaXRlY3R1cmUgZGVwZW5kZW50IGZpbGVzLgorICAgIGxvY2FsIGV4ZWMtbG9jYXRlID0gWyBvcHRpb24uZ2V0IGV4ZWMtcHJlZml4IDogJChwcmVmaXgpIF0gOworCisgICAgIyBCaW5hcmllcy4KKyAgICBsb2NhbCBiaW4tbG9jYXRlID0gWyBvcHRpb24uZ2V0IGJpbmRpciA6ICQocHJlZml4KS9iaW4gXSA7CisKKyAgICAjIE9iamVjdCBjb2RlIGxpYnJhcmllcy4KKyAgICBsb2NhbCBsaWItbG9jYXRlID0gWyBvcHRpb24uZ2V0IGxpYmRpciA6ICQocHJlZml4KS9saWIgXSA7CisKKyAgICAjIFNvdXJjZSBoZWFkZXIgZmlsZXMuCisgICAgbG9jYWwgaW5jbHVkZS1sb2NhdGUgPSBbIG9wdGlvbi5nZXQgaW5jbHVkZWRpciA6ICQocHJlZml4KS9pbmNsdWRlIF0gOworCisgICAgc3RhZ2UuaW5zdGFsbCAkKG5hbWUpLWJpbiA6ICQoYmluYXJpZXMpIDogJChyZXF1aXJlbWVudHMpCisgICAgICAgIDxsb2NhdGlvbj4kKGJpbi1sb2NhdGUpIDsKKyAgICBhbGlhcyAkKG5hbWUpLWxpYiA6ICQobmFtZSktbGliLXNoYXJlZCAkKG5hbWUpLWxpYi1zdGF0aWMgOworICAgIAorICAgICMgU2luY2UgdGhlIGluc3RhbGwgbG9jYXRpb24gb2Ygc2hhcmVkIGxpYnJhcmllcyBkaWZmZXJzIG9uIHVuaXZlcnNlCisgICAgIyBhbmQgY3lnd2luLCB1c2UgdGFyZ2V0IGFsdGVybmF0aXZlcyB0byBtYWtlIGRpZmZlcmVudCB0YXJnZXRzLgorICAgICMgV2Ugc2hvdWxkIGhhdmUgdXNlZCBpbmRpcmVjdGlvbiBjb25kaXRpb2FubCByZXF1aXJlbWVudHMsIGJ1dCBpdCdzCisgICAgIyBhd2t3YXJkIHRvIHBhc3MgYmluLWxvY2F0ZSBhbmQgbGliLWxvY2F0ZSBmcm9tIHRoZXJlIHRvIGFub3RoZXIgcnVsZS4KKyAgICBhbGlhcyAkKG5hbWUpLWxpYi1zaGFyZWQgOiAkKG5hbWUpLWxpYi1zaGFyZWQtdW5pdmVyc2UgOworICAgIGFsaWFzICQobmFtZSktbGliLXNoYXJlZCA6ICQobmFtZSktbGliLXNoYXJlZC1jeWd3aW4gOiA8dGFyZ2V0LW9zPmN5Z3dpbiA7CisgICAgCisgICAgIyBGb3Igc2hhcmVkIGxpYnJhcmllcywgd2UgaW5zdGFsbCBib3RoIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uZSBhbmQgdGhlCisgICAgIyBzaGFyZWQgbGlicmFyaWVzIHRoYXQgdGhlIGluc3RhbGxlZCBleGVjdXRhYmxlcyBkZXBlbmQgb24uCisgICAgc3RhZ2UuaW5zdGFsbCAkKG5hbWUpLWxpYi1zaGFyZWQtdW5pdmVyc2UgOiAkKGJpbmFyaWVzKSAkKGxpYnJhcmllcykgOiAkKHJlcXVpcmVtZW50cykKKyAgICAgIDxsb2NhdGlvbj4kKGxpYi1sb2NhdGUpIDxpbnN0YWxsLWRlcGVuZGVuY2llcz5vbiA8aW5zdGFsbC10eXBlPlNIQVJFRF9MSUIgOworICAgIHN0YWdlLmluc3RhbGwgJChuYW1lKS1saWItc2hhcmVkLWN5Z3dpbiA6ICQoYmluYXJpZXMpICQobGlicmFyaWVzKSA6ICQocmVxdWlyZW1lbnRzKQorICAgICAgPGxvY2F0aW9uPiQoYmluLWxvY2F0ZSkgPGluc3RhbGwtZGVwZW5kZW5jaWVzPm9uIDxpbnN0YWxsLXR5cGU+U0hBUkVEX0xJQiA7CisKKyAgICAjIEZvciBzdGF0aWMgbGlicmFyaWVzLCB3ZSBkbyBub3QgY2FyZSBhYm91dCBleGVjdXRhYmxlIGRlcGVuZGVuY2llcywgc2luY2UKKyAgICAjIHN0YXRpYyBsaWJyYXJpZXMgYXJlIGFscmVhZHkgaW5jb3Jwb3JhdGVkIGludG8gdGhlbS4KKyAgICBzdGFnZS5pbnN0YWxsICQobmFtZSktbGliLXN0YXRpYyA6ICQobGlicmFyaWVzKSA6ICQocmVxdWlyZW1lbnRzKQorICAgICAgICA8bG9jYXRpb24+JChsaWItbG9jYXRlKSA8aW5zdGFsbC1kZXBlbmRlbmNpZXM+b24gPGluc3RhbGwtdHlwZT5TVEFUSUNfTElCIDsKKyAgICBzdGFnZS5pbnN0YWxsICQobmFtZSktaGVhZGVycyA6ICQoaGVhZGVycykgOiAkKHJlcXVpcmVtZW50cykKKyAgICAgICAgPGxvY2F0aW9uPiQoaW5jbHVkZS1sb2NhdGUpJChpbnN0YWxsLWhlYWRlci1zdWJkaXIpCisgICAgICAgIDxpbnN0YWxsLXNvdXJjZS1yb290PiQoaW5zdGFsbC1zb3VyY2Utcm9vdCkgOworICAgIGFsaWFzICQobmFtZSkgOiAkKG5hbWUpLWJpbiAkKG5hbWUpLWxpYiAkKG5hbWUpLWhlYWRlcnMgOworCisgICAgbG9jYWwgYyA9IFsgcHJvamVjdC5jdXJyZW50IF0gOworICAgIGxvY2FsIHByb2plY3QtbW9kdWxlID0gWyAkKGMpLnByb2plY3QtbW9kdWxlIF0gOworICAgIG1vZHVsZSAkKHByb2plY3QtbW9kdWxlKQorICAgIHsKKyAgICAgICAgZXhwbGljaXQgJCgxKS1iaW4gJCgxKS1saWIgJCgxKS1oZWFkZXJzICQoMSkgJCgxKS1saWItc2hhcmVkICQoMSktbGliLXN0YXRpYyAKKyAgICAgICAgICAkKDEpLWxpYi1zaGFyZWQtdW5pdmVyc2UgJCgxKS1saWItc2hhcmVkLWN5Z3dpbiA7CisgICAgfQorfQorCitydWxlIGluc3RhbGwtZGF0YSAoIHRhcmdldC1uYW1lIDogcGFja2FnZS1uYW1lIDogZGF0YSAqIDogcmVxdWlyZW1lbnRzICogKQoreworICAgIHBhY2thZ2UtbmFtZSA/PSB0YXJnZXQtbmFtZSA7CisgICAgaWYgWyBNQVRDSCAtLXByZWZpeD0oLiopIDogWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0gXQorICAgIHsKKyAgICAgICAgIyBJZiAtLXByZWZpeCBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLAorICAgICAgICAjIHRoZW4gd2UgbmVlZCB3aXBlIGF3YXkgYW55IHNldHRpbmdzIG9mIGRhdGFyb290ZGlyCisgICAgICAgIG9wdGlvbi5zZXQgZGF0YXJvb3RkaXIgOiA7CisgICAgfSAgIAorICAgIAorICAgIGxvY2FsIHByZWZpeCA9IFsgZ2V0LXByZWZpeCAkKHBhY2thZ2UtbmFtZSkgOiAkKHJlcXVpcmVtZW50cykgXSA7CisgICAgbG9jYWwgZGF0YWRpciA9IFsgb3B0aW9uLmdldCBkYXRhcm9vdGRpciA6ICQocHJlZml4KS9zaGFyZSBdIDsKKworICAgIHN0YWdlLmluc3RhbGwgJCh0YXJnZXQtbmFtZSkgCisgICAgICAgIDogJChkYXRhKQorICAgICAgICA6ICQocmVxdWlyZW1lbnRzKSA8bG9jYXRpb24+JChkYXRhZGlyKS8kKHBhY2thZ2UtbmFtZSkKKyAgICAgICAgOworICAgIAorICAgIGxvY2FsIGMgPSBbIHByb2plY3QuY3VycmVudCBdIDsKKyAgICBsb2NhbCBwcm9qZWN0LW1vZHVsZSA9IFsgJChjKS5wcm9qZWN0LW1vZHVsZSBdIDsKKyAgICBtb2R1bGUgJChwcm9qZWN0LW1vZHVsZSkKKyAgICB7CisgICAgICAgIGV4cGxpY2l0ICQoMSkgOworICAgIH0KK30KKworbG9jYWwgcnVsZSBnZXQtcHJlZml4ICggcGFja2FnZS1uYW1lIDogcmVxdWlyZW1lbnRzICogKQoreworICAgIGxvY2FsIHByZWZpeCA9IFsgb3B0aW9uLmdldCBwcmVmaXggOiBbIHByb3BlcnR5LnNlbGVjdAorICAgICAgICA8aW5zdGFsbC1kZWZhdWx0LXByZWZpeD4gOiAkKHJlcXVpcmVtZW50cykgXSBdIDsKKyAgICBwcmVmaXggPSAkKHByZWZpeDpHPSkgOworICAgIHJlcXVpcmVtZW50cyA9IFsgcHJvcGVydHkuY2hhbmdlICQocmVxdWlyZW1lbnRzKSA6IDxpbnN0YWxsLWRlZmF1bHQtcHJlZml4PgorICAgICAgICBdIDsKKyAgICAjIE9yIHNvbWUgbGlrZWx5IGRlZmF1bHRzIGlmIG5laXRoZXIgaXMgZ2l2ZW4uCisgICAgaWYgISAkKHByZWZpeCkKKyAgICB7CisgICAgICAgIGlmIFsgbW9kdWxlcy5wZWVrIDogTlQgXSB7IHByZWZpeCA9IEM6XFwkKHBhY2thZ2UtbmFtZSkgOyB9CisgICAgICAgIGVsc2UgaWYgWyBtb2R1bGVzLnBlZWsgOiBVTklYIF0geyBwcmVmaXggPSAvdXNyL2xvY2FsIDsgfSAgICAgICAgCisgICAgfQorICAgIHJldHVybiAkKHByZWZpeCkgOworfSAgICAgICAgICAgCisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcGF0aHNjYWxlLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcGF0aHNjYWxlLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGFiY2YxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9wYXRoc2NhbGUuamFtCkBAIC0wLDAgKzEsMTc4IEBACisjICBDb3B5cmlnaHQgMjAwNiBOb2VsIEJlbGNvdXJ0CisjICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjICAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgICAgICAgICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IHRvb2xzZXQgOiBmbGFncyA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgb3MgOworaW1wb3J0IGNvbW1vbiA7CitpbXBvcnQgZm9ydHJhbiA7CisKK2ZlYXR1cmUuZXh0ZW5kIHRvb2xzZXQgOiBwYXRoc2NhbGUgOwordG9vbHNldC5pbmhlcml0IHBhdGhzY2FsZSA6IHVuaXggOworZ2VuZXJhdG9ycy5vdmVycmlkZSBwYXRoc2NhbGUucHJlYnVpbHQgOiBidWlsdGluLnByZWJ1aWx0IDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgcGF0aHNjYWxlLnNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOiBzZWFyY2hlZC1saWItZ2VuZXJhdG9yIDsKKworIyBEb2N1bWVudGF0aW9uIGFuZCB0b29sY2hhaW4gZGVzY3JpcHRpb24gbG9jYXRlZAorIyBodHRwOi8vd3d3LnBhdGhzY2FsZS5jb20vZG9jcy5odG1sCisKK3J1bGUgaW5pdCAoIHZlcnNpb24gPyA6IGNvbW1hbmQgKiA6IG9wdGlvbnMgKiApIAoreworICBjb21tYW5kID0gWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBwYXRoc2NhbGUgOiBwYXRoQ0MgOiAkKGNvbW1hbmQpIAorICAgIDogL29wdC9la29wYXRoL2JpbiBdIDsKKyAgCisgICMgRGV0ZXJtaW5lIHRoZSB2ZXJzaW9uCisgIGxvY2FsIGNvbW1hbmQtc3RyaW5nID0gJChjb21tYW5kOko9IiAiKSA7CisgIGlmICQoY29tbWFuZCkKKyAgeyAgICAKKyAgICAgIHZlcnNpb24gPz0gWyBNQVRDSCAiXihbMC05Ll0rKSIKKyAgICAgICAgICA6IFsgU0hFTEwgIiQoY29tbWFuZC1zdHJpbmcpIC1kdW1wdmVyc2lvbiIgXSBdIDsKKyAgfQorICAKKyAgbG9jYWwgY29uZGl0aW9uID0gWyBjb21tb24uY2hlY2staW5pdC1wYXJhbWV0ZXJzIHBhdGhzY2FsZQorICAgIDogdmVyc2lvbiAkKHZlcnNpb24pIF0gOworCisgIGNvbW1vbi5oYW5kbGUtb3B0aW9ucyBwYXRoc2NhbGUgOiAkKGNvbmRpdGlvbikgOiAkKGNvbW1hbmQpIDogJChvcHRpb25zKSA7CisgICAgCisgIHRvb2xzZXQuZmxhZ3MgcGF0aHNjYWxlLmNvbXBpbGUuZm9ydHJhbjkwIE9QVElPTlMgJChjb25kaXRpb24pIDoKKyAgICBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8ZmZsYWdzPiA6ICQob3B0aW9ucykgXSA6IHVuY2hlY2tlZCA7CisKKyAgY29tbWFuZF9jID0gJChjb21tYW5kX2NbMS0tMl0pICQoY29tbWFuZFstMV06Qj1wYXRoY2MpIDsKKworICB0b29sc2V0LmZsYWdzIHBhdGhzY2FsZSBDT05GSUdfQ19DT01NQU5EICQoY29uZGl0aW9uKSA6ICQoY29tbWFuZF9jKSA7CisKKyAgIyBmb3J0cmFuIHN1cHBvcnQKKyAgbG9jYWwgZi1jb21tYW5kID0gWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBwYXRoc2NhbGUgOiBwYXRoZjkwIDogJChjb21tYW5kKSBdIDsKKyAgbG9jYWwgY29tbWFuZF9mID0gJChjb21tYW5kX2ZbMS0tMl0pICQoZi1jb21tYW5kWy0xXTpCPXBhdGhmOTApIDsKKyAgbG9jYWwgY29tbWFuZF9mOTAgPSAkKGNvbW1hbmRfZlsxLS0yXSkgJChmLWNvbW1hbmRbLTFdOkI9cGF0aGY5MCkgOworCisgIHRvb2xzZXQuZmxhZ3MgcGF0aHNjYWxlIENPTkZJR19GX0NPTU1BTkQgJChjb25kaXRpb24pIDogJChjb21tYW5kX2YpIDsKKyAgdG9vbHNldC5mbGFncyBwYXRoc2NhbGUgQ09ORklHX0Y5MF9DT01NQU5EICQoY29uZGl0aW9uKSA6ICQoY29tbWFuZF9mOTApIDsKKworICAjIGFsd2F5cyBsaW5rIGxpYiBydCB0byByZXNvbHZlIGNsb2NrX2dldHRpbWUoKQorICBmbGFncyBwYXRoc2NhbGUubGluayBGSU5ETElCUy1TQSA6IHJ0IDogdW5jaGVja2VkIDsKKworICBzd2l0Y2ggWyBvcy5uYW1lIF0KKyAgeworICAgIGNhc2UgU09MQVJJUyA6CisgICAgICAgIHRvb2xzZXQuZmxhZ3MgcGF0aHNjYWxlLmxpbmsgUlBBVEhfT1BUSU9OICQoY29uZGl0aW9uKSA6IC1XbCwtUiwgLVdsLCA6IHVuY2hlY2tlZCA7CisKKyAgICBjYXNlICogOiAjIEdOVQorICAgICAgICB0b29sc2V0LmZsYWdzIHBhdGhzY2FsZS5saW5rIFJQQVRIX09QVElPTiAkKGNvbmRpdGlvbikgOiAtV2wsLXJwYXRoPSAgOiB1bmNoZWNrZWQgOworICB9Cit9CisKKyMgRGVjbGFyZSBnZW5lcmF0b3JzCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgcGF0aHNjYWxlLmNvbXBpbGUuYyA6IEMgOiBPQkogOiA8dG9vbHNldD5wYXRoc2NhbGUgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIHBhdGhzY2FsZS5jb21waWxlLmMrKyA6IENQUCA6IE9CSiA6IDx0b29sc2V0PnBhdGhzY2FsZSA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLWZvcnRyYW4tY29tcGlsZXIgcGF0aHNjYWxlLmNvbXBpbGUuZm9ydHJhbiA6IEZPUlRSQU4gOiBPQkogOiA8dG9vbHNldD5wYXRoc2NhbGUgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1mb3J0cmFuOTAtY29tcGlsZXIgcGF0aHNjYWxlLmNvbXBpbGUuZm9ydHJhbjkwIDogRk9SVFJBTjkwIDogT0JKIDogPHRvb2xzZXQ+cGF0aHNjYWxlIDsKKworIyBEZWNsYXJlIGZsYWdzIGFuZCBhY3Rpb25zIGZvciBjb21waWxhdGlvbgorZmxhZ3MgcGF0aHNjYWxlLmNvbXBpbGUgT1BUSU9OUyA8b3B0aW1pemF0aW9uPm9mZiAgIDogLU8wIDsKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGVlZCA6IC1PMyA7CitmbGFncyBwYXRoc2NhbGUuY29tcGlsZSBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BhY2UgOiAtT3MgOworCitmbGFncyBwYXRoc2NhbGUuY29tcGlsZSBPUFRJT05TIDxpbmxpbmluZz5vZmYgIDogLW5vaW5saW5lIDsKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlIE9QVElPTlMgPGlubGluaW5nPm9uICAgOiAtaW5saW5lIDsKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlIE9QVElPTlMgPGlubGluaW5nPmZ1bGwgOiAtaW5saW5lIDsKKworZmxhZ3MgcGF0aHNjYWxlLmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3M+b2ZmICAgICAgICAgICA6IC13b2ZmYWxsIDsKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzPm9uICAgICAgICAgICAgOiAtV2FsbCA7CitmbGFncyBwYXRoc2NhbGUuY29tcGlsZSBPUFRJT05TIDx3YXJuaW5ncz5hbGwgICAgICAgICAgIDogLVdhbGwgLXBlZGFudGljIDsKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzLWFzLWVycm9ycz5vbiAgOiAtV2Vycm9yIDsKKworZmxhZ3MgcGF0aHNjYWxlLmNvbXBpbGUgT1BUSU9OUyA8ZGVidWctc3ltYm9scz5vbiA6IC1nZ2RiIDsKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlIE9QVElPTlMgPHByb2ZpbGluZz5vbiAgICAgOiAtcGcgOworZmxhZ3MgcGF0aHNjYWxlLmNvbXBpbGUgT1BUSU9OUyA8bGluaz5zaGFyZWQgICAgICA6IC1mUElDIDsKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlIE9QVElPTlMgPGFkZHJlc3MtbW9kZWw+MzIgOiAtbTMyIDsKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlIE9QVElPTlMgPGFkZHJlc3MtbW9kZWw+NjQgOiAtbTY0IDsKKworZmxhZ3MgcGF0aHNjYWxlLmNvbXBpbGUgVVNFUl9PUFRJT05TIDxjZmxhZ3M+IDsKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlLmMrKyBVU0VSX09QVElPTlMgPGN4eGZsYWdzPiA7CitmbGFncyBwYXRoc2NhbGUuY29tcGlsZSBERUZJTkVTIDxkZWZpbmU+IDsKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlIElOQ0xVREVTIDxpbmNsdWRlPiA7CisKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlLmZvcnRyYW4gVVNFUl9PUFRJT05TIDxmZmxhZ3M+IDsKK2ZsYWdzIHBhdGhzY2FsZS5jb21waWxlLmZvcnRyYW45MCBVU0VSX09QVElPTlMgPGZmbGFncz4gOworCithY3Rpb25zIGNvbXBpbGUuYworeworICAgICIkKENPTkZJR19DX0NPTU1BTkQpIiAkKE9QVElPTlMpICQoVVNFUl9PUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC1jIC1vICIkKDwpIiAiJCg+KSIKK30KKworYWN0aW9ucyBjb21waWxlLmMrKworeworICAgICIkKENPTkZJR19DT01NQU5EKSIgJChPUFRJT05TKSAkKFVTRVJfT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtYyAtbyAiJCg8KSIgIiQoPikiCit9CisKK2FjdGlvbnMgY29tcGlsZS5mb3J0cmFuCit7CisgICAgIiQoQ09ORklHX0ZfQ09NTUFORCkiICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCitydWxlIGNvbXBpbGUuZm9ydHJhbjkwICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgIyB0aGUgc3BhY2UgcnVsZSBpbnNlcnRzIHNwYWNlcyBiZXR3ZWVuIHRhcmdldHMgYW5kIGl0J3MgbmVjZXNzYXJ5CisgIFNQQUNFIG9uICQodGFyZ2V0cykgPSAiICIgOworICAjIFNlcmlhbGl6ZSBleGVjdXRpb24gb2YgdGhlIGNvbXBpbGUuZm9ydHJhbjkwIGFjdGlvbgorICAjIEY5MCBzb3VyY2UgbXVzdCBiZSBjb21waWxlZCBpbiBhIHBhcnRpY3VsYXIgb3JkZXIgc28gd2UKKyAgIyBzZXJpYWxpemUgdGhlIGJ1aWxkIGFzIGEgcGFyYWxsZWwgRjkwIGNvbXBpbGUgbWlnaHQgZmFpbAorICBKQU1fU0VNQVBIT1JFIG9uICQodGFyZ2V0cykgPSA8cz5wYXRoc2NhbGUtZjkwLXNlbWFwaG9yZSA7Cit9CisKK2FjdGlvbnMgY29tcGlsZS5mb3J0cmFuOTAKK3sKKyAgICAiJChDT05GSUdfRjkwX0NPTU1BTkQpIiAkKE9QVElPTlMpICQoVVNFUl9PUFRJT05TKSAtRCQoREVGSU5FUykgLUkiJChJTkNMVURFUykiIC1tb2R1bGUgJCg8WzFdOkQpIC1jIC1vICIkKDwpIiAiJCg+KSIKK30KKworIyBEZWNsYXJlIGZsYWdzIGFuZCBhY3Rpb25zIGZvciBsaW5raW5nCitmbGFncyBwYXRoc2NhbGUubGluayBPUFRJT05TIDxkZWJ1Zy1zeW1ib2xzPm9uIDogLWdnZGIgLXJkeW5hbWljIDsKKyMgU3RyaXAgdGhlIGJpbmFyeSB3aGVuIG5vIGRlYnVnZ2luZyBpcyBuZWVkZWQKK2ZsYWdzIHBhdGhzY2FsZS5saW5rIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b2ZmIDogLWcwIDsKK2ZsYWdzIHBhdGhzY2FsZS5saW5rIE9QVElPTlMgPHByb2ZpbGluZz5vbiA6IC1wZyA7CitmbGFncyBwYXRoc2NhbGUubGluayBVU0VSX09QVElPTlMgPGxpbmtmbGFncz4gOworZmxhZ3MgcGF0aHNjYWxlLmxpbmsgTElOS1BBVEggPGxpYnJhcnktcGF0aD4gOworZmxhZ3MgcGF0aHNjYWxlLmxpbmsgRklORExJQlMtU1QgPGZpbmQtc3RhdGljLWxpYnJhcnk+IDsKK2ZsYWdzIHBhdGhzY2FsZS5saW5rIEZJTkRMSUJTLVNBIDxmaW5kLXNoYXJlZC1saWJyYXJ5PiA7CitmbGFncyBwYXRoc2NhbGUubGluayBGSU5ETElCUy1TQSA8dGhyZWFkaW5nPm11bHRpIDogcHRocmVhZCA7CitmbGFncyBwYXRoc2NhbGUubGluayBMSUJSQVJJRVMgPGxpYnJhcnktZmlsZT4gOworZmxhZ3MgcGF0aHNjYWxlLmxpbmsgTElOSy1SVU5USU1FIDxydW50aW1lLWxpbms+c3RhdGljIDogc3RhdGljIDsKK2ZsYWdzIHBhdGhzY2FsZS5saW5rIExJTkstUlVOVElNRSA8cnVudGltZS1saW5rPnNoYXJlZCA6IGR5bmFtaWMgOworZmxhZ3MgcGF0aHNjYWxlLmxpbmsgUlBBVEggPGRsbC1wYXRoPiA7CisjIE9uIGdjYywgdGhlcmUgYXJlIHNlcGFyYXRlIG9wdGlvbnMgZm9yIGRsbCBwYXRoIGF0IHJ1bnRpbWUgYW5kCisjIGxpbmsgdGltZS4gT24gU29sYXJpcywgdGhlcmUncyBvbmx5IG9uZTogLVIsIHNvIHdlIGhhdmUgdG8gdXNlCisjIGl0LCBldmVuIHRob3VnaCBpdCdzIGJhZCBpZGVhLgorZmxhZ3MgcGF0aHNjYWxlLmxpbmsgUlBBVEggPHhkbGwtcGF0aD4gOworCitydWxlIGxpbmsgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIFNQQUNFIG9uICQodGFyZ2V0cykgPSAiICIgOworfQorCithY3Rpb25zIGxpbmsgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1MIiQoTElOS1BBVEgpIiAkKFJQQVRIX09QVElPTjpFPS1XbCwtcnBhdGg9KSIkKFJQQVRIKSIgLW8gIiQoPCkiICIkKD4pIiAiJChMSUJSQVJJRVMpIiAtbCQoRklORExJQlMtU0EpIC1sJChGSU5ETElCUy1TVCkKK30KKworIyBTbGlnaHQgbW9kcyBmb3IgZGxscworcnVsZSBsaW5rLmRsbCAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgU1BBQ0Ugb24gJCh0YXJnZXRzKSA9ICIgIiA7Cit9CisKK2FjdGlvbnMgbGluay5kbGwgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1MIiQoTElOS1BBVEgpIiAkKFJQQVRIX09QVElPTjpFPS1XbCwtcnBhdGg9KSIkKFJQQVRIKSIgLW8gIiQoPCkiIC1XbCwtc29uYW1lJChTUEFDRSktV2wsJCg8WzFdOkQ9KSAtc2hhcmVkICIkKD4pIiAiJChMSUJSQVJJRVMpIiAtbCQoRklORExJQlMtU0EpIC1sJChGSU5ETElCUy1TVCkKK30KKworIyBEZWNsYXJlIGFjdGlvbiBmb3IgY3JlYXRpbmcgc3RhdGljIGxpYnJhcmllcworIyAiJChDT05GSUdfQ09NTUFORCkiIC1hciAtbyAiJCg8KSIgIiQoPikiCithY3Rpb25zIHBpZWNlbWVhbCBhcmNoaXZlCit7CisgICAgYXIgJChBUkZMQUdTKSBydSAiJCg8KSIgIiQoPikiCit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3BjaC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3BjaC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2ZTk4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcGNoLmphbQpAQCAtMCwwICsxLDk1IEBACisjIENvcHlyaWdodCAoYykgMjAwNSBSZWVjZSBILiBEdW5uLgorIyBDb3B5cmlnaHQgMjAwNiBJbHlhIFNva29sb3YKKyMKKyMgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorIyBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMjIyMjIFVzaW5nIFByZWNvbXBpbGVkIEhlYWRlcnMgKFF1aWNrIEd1aWRlKSAjIyMjIworIworIyBNYWtlIHByZWNvbXBpbGVkIG15cGNoLmhwcDoKKyMKKyMgICAgaW1wb3J0IHBjaCA7CisjCisjICAgIGNwcC1wY2ggbXlwY2gKKyMgICAgICA6ICMgc291cmNlcworIyAgICAgICAgbXlwY2guaHBwCisjICAgICAgOiAjIHJlcXVpcmVtbnRzCisjICAgICAgICA8dG9vbHNldD5tc3ZjOjxzb3VyY2U+bXlwY2guY3BwCisjICAgICAgOworIworIyBBZGQgY3BwLXBjaCB0byBzb3VyY2VzOgorIworIyAgICBleGUgaGVsbG8KKyMgICAgICA6IG1haW4uY3BwIGhlbGxvLmNwcCBteXBjaAorIyAgICAgIDsKKworaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworaW1wb3J0IHR5cGUgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IGdlbmVyYXRvcnMgOworCit0eXBlLnJlZ2lzdGVyICAgICBQQ0ggOiBwY2ggOworCit0eXBlLnJlZ2lzdGVyICAgQ19QQ0ggOiA6IFBDSCA7Cit0eXBlLnJlZ2lzdGVyIENQUF9QQ0ggOiA6IFBDSCA7CisKKyMgQ29udHJvbCBwcmVjb21waWxlZCBoZWFkZXIgKFBDSCkgZ2VuZXJhdGlvbi4KK2ZlYXR1cmUuZmVhdHVyZSBwY2ggOgorICAgICAgb24KKyAgICAgIG9mZgorICAgIDogcHJvcGFnYXRlZCA7CisKKworZmVhdHVyZS5mZWF0dXJlIHBjaC1oZWFkZXIgOiA6IGZyZWUgZGVwZW5kZW5jeSA7CitmZWF0dXJlLmZlYXR1cmUgcGNoLWZpbGUgICA6IDogZnJlZSBkZXBlbmRlbmN5IDsKKworIyBCYXNlIFBDSCBnZW5lcmF0b3IuIFRoZSAncnVuJyBtZXRob2QgaGFzIHRoZSBsb2dpYyB0byBwcmV2ZW50IHRoaXMgZ2VuZXJhdG9yCisjIGZyb20gYmVpbmcgcnVuIHVubGVzcyBpdCdzIGJlaW5nIHVzZWQgZm9yIGEgdG9wLWxldmVsIFBDSCB0YXJnZXQuCitjbGFzcyBwY2gtZ2VuZXJhdG9yIDogZ2VuZXJhdG9yCit7CisgICAgaW1wb3J0IHByb3BlcnR5LXNldCA7CisKKyAgICBydWxlIGFjdGlvbi1jbGFzcyAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBjb21waWxlLWFjdGlvbiA7CisgICAgfQorCisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKyApCisgICAgeworICAgICAgICBpZiAhICQobmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgIyBVbmxlc3MgdGhpcyBnZW5lcmF0b3IgaXMgaW52b2tlZCBhcyB0aGUgdG9wLW1vc3QgZ2VuZXJhdG9yIGZvciBhCisgICAgICAgICAgICAjIG1haW4gdGFyZ2V0LCBmYWlsLiBUaGlzIGFsbG93cyB1c2luZyAnSCcgdHlwZSBhcyBpbnB1dCB0eXBlIGZvcgorICAgICAgICAgICAgIyB0aGlzIGdlbmVyYXRvciwgd2hpbGUgcHJldmVudGluZyBCb29zdC5CdWlsZCB0byB0cnkgdGhpcyBnZW5lcmF0b3IKKyAgICAgICAgICAgICMgd2hlbiBub3QgZXhwbGljaXRseSBhc2tlZCBmb3IuCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIE9uZSBiYWQgZXhhbXBsZSBpcyBtc3ZjLCB3aGVyZSBwY2ggZ2VuZXJhdG9yIHByb2R1Y2VzIGJvdGggUENICisgICAgICAgICAgICAjIHRhcmdldCBhbmQgT0JKIHRhcmdldCwgc28gaWYgdGhlcmUncyBhbnkgaGVhZGVyIGdlbmVyYXRlZCAobGlrZSBieQorICAgICAgICAgICAgIyBiaXNvbiwgb3IgYnkgbXNpZGwpLCB3ZSdkIHRyeSB0byB1c2UgcGNoIGdlbmVyYXRvciB0byBnZXQgT0JKIGZyb20KKyAgICAgICAgICAgICMgdGhhdCBILCB3aGljaCBpcyBjb21wbGV0ZWx5IHdyb25nLiBCeSByZXN0cmljdGluZyB0aGlzIGdlbmVyYXRvcgorICAgICAgICAgICAgIyBvbmx5IHRvIHBjaCBtYWluIHRhcmdldCwgc3VjaCBwcm9ibGVtIGlzIHNvbHZlZC4KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHIgPSBbIHJ1bi1wY2ggJChwcm9qZWN0KSAkKG5hbWUpCisgICAgICAgICAgICAgIDogWyAkKHByb3BlcnR5LXNldCkuYWRkLXJhdyA8ZGVmaW5lPkJPT1NUX0JVSUxEX1BDSF9FTkFCTEVEIF0KKyAgICAgICAgICAgICAgOiAkKHNvdXJjZXMpIF0gOworICAgICAgICAgICAgcmV0dXJuIFsgZ2VuZXJhdG9ycy5hZGQtdXNhZ2UtcmVxdWlyZW1lbnRzICQocikKKyAgICAgICAgICAgICAgOiA8ZGVmaW5lPkJPT1NUX0JVSUxEX1BDSF9FTkFCTEVEIF0gOworICAgICAgICB9CisgICAgfQorCisgICAgIyBUaGlzIHJ1bGUgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBkZXJpdmVkIGNsYXNzZXMuCisgICAgcnVsZSBydW4tcGNoICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICsgKQorICAgIHsKKyAgICB9Cit9CisKKworIyBOT1RFOiByZXF1aXJlbWVudHMgYXJlIGVtcHR5LCBkZWZhdWx0IHBjaCBnZW5lcmF0b3IgY2FuIGJlIGFwcGxpZWQgd2hlbgorIyBwY2g9b2ZmLgorZ2VuZXJhdG9ycy5yZWdpc3RlcgorICAgIFsgbmV3IGR1bW15LWdlbmVyYXRvciBwY2guZGVmYXVsdC1jLXBjaC1nZW5lcmF0b3IgICA6IDogICBDX1BDSCBdIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXIKKyAgICBbIG5ldyBkdW1teS1nZW5lcmF0b3IgcGNoLmRlZmF1bHQtY3BwLXBjaC1nZW5lcmF0b3IgOiA6IENQUF9QQ0ggXSA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3BnaS5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3BnaS5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlODI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcGdpLmphbQpAQCAtMCwwICsxLDE0NyBAQAorIyAgQ29weXJpZ2h0IE5vZWwgQmVsY291cnQgMjAwNy4KKyMgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyAgICAgICAgICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2ltcG9ydCBwcm9wZXJ0eSA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgb3MgOworaW1wb3J0IHRvb2xzZXQgOiBmbGFncyA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgZm9ydHJhbiA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgY29tbW9uIDsKK2ltcG9ydCBnY2MgOworCitmZWF0dXJlLmV4dGVuZCB0b29sc2V0IDogcGdpIDsKK3Rvb2xzZXQuaW5oZXJpdCBwZ2kgOiB1bml4IDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgcGdpLnByZWJ1aWx0IDogYnVpbHRpbi5saWItZ2VuZXJhdG9yIDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgcGdpLnNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOiBzZWFyY2hlZC1saWItZ2VuZXJhdG9yIDsKKworIyBEb2N1bWVudGF0aW9uIGFuZCB0b29sY2hhaW4gZGVzY3JpcHRpb24gbG9jYXRlZAorIyBodHRwOi8vd3d3LnBncm91cC5jb20vcmVzb3VyY2VzL2RvY3MuaHRtCisKK3J1bGUgaW5pdCAoIHZlcnNpb24gPyA6IGNvbW1hbmQgKiA6IG9wdGlvbnMgKiApIAoreworICBsb2NhbCBjb25kaXRpb24gPSBbIGNvbW1vbi5jaGVjay1pbml0LXBhcmFtZXRlcnMgcGdpIDogdmVyc2lvbiAkKHZlcnNpb24pIF0gOworCisgIGxvY2FsIGxfY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgcGdpIDogcGdDQyA6ICQoY29tbWFuZCkgXSA7CisKKyAgY29tbW9uLmhhbmRsZS1vcHRpb25zIHBnaSA6ICQoY29uZGl0aW9uKSA6ICQobF9jb21tYW5kKSA6ICQob3B0aW9ucykgOworICAgIAorICBjb21tYW5kX2MgPSAkKGNvbW1hbmRfY1sxLS0yXSkgJChsX2NvbW1hbmRbLTFdOkI9cGdjYykgOworCisgIHRvb2xzZXQuZmxhZ3MgcGdpIENPTkZJR19DX0NPTU1BTkQgJChjb25kaXRpb24pIDogJChjb21tYW5kX2MpIDsKKworICBmbGFncyBwZ2kuY29tcGlsZSBERUZJTkVTICQoY29uZGl0aW9uKSA6CisgICAgWyBmZWF0dXJlLmdldC12YWx1ZXMgPGRlZmluZT4gOiAkKG9wdGlvbnMpIF0gOiB1bmNoZWNrZWQgOworCisgICMgSU9WX01BWCBzdXBwb3J0CisgIGZsYWdzIHBnaS5jb21waWxlIERFRklORVMgJChjb25kaXRpb24pIDogX19uZWVkX0lPVl9NQVggOiB1bmNoZWNrZWQgOworCisgICMgc2V0IGxpbmsgZmxhZ3MKKyAgZmxhZ3MgcGdpLmxpbmsgRklORExJQlMtU1QgOiBbCisgICAgZmVhdHVyZS5nZXQtdmFsdWVzIDxmaW5kLXN0YXRpYy1saWJyYXJ5PiA6ICQob3B0aW9ucykgXSA6IHVuY2hlY2tlZCA7CisKKyAgIyBhbHdheXMgbGluayBsaWIgcnQgdG8gcmVzb2x2ZSBjbG9ja19nZXR0aW1lKCkKKyAgZmxhZ3MgcGdpLmxpbmsgRklORExJQlMtU0EgOiBydCBbCisgICAgZmVhdHVyZS5nZXQtdmFsdWVzIDxmaW5kLXNoYXJlZC1saWJyYXJ5PiA6ICQob3B0aW9ucykgXSA6IHVuY2hlY2tlZCA7CisKKyAgZ2NjLmluaXQtbGluay1mbGFncyBwZ2kgZ251ICQoY29uZGl0aW9uKSA7Cit9CisKKyMgRGVjbGFyZSBnZW5lcmF0b3JzCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgcGdpLmNvbXBpbGUuYyA6IEMgOiBPQkogOiA8dG9vbHNldD5wZ2kgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIHBnaS5jb21waWxlLmMrKyA6IENQUCA6IE9CSiA6IDx0b29sc2V0PnBnaSA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLWZvcnRyYW4tY29tcGlsZXIgcGdpLmNvbXBpbGUuZm9ydHJhbiA6IEZPUlRSQU4gOiBPQkogOiA8dG9vbHNldD5wZ2kgOworCisjIERlY2xhcmUgZmxhZ3MgYW5kIGFjdGlvbnMgZm9yIGNvbXBpbGF0aW9uCitmbGFncyBwZ2kuY29tcGlsZSBPUFRJT05TIDogLUtpZWVlIDsKK2ZsYWdzIHBnaS5jb21waWxlIE9QVElPTlMgPGxpbms+c2hhcmVkIDogLWZwaWMgLWZQSUMgOworZmxhZ3MgcGdpLmNvbXBpbGUgT1BUSU9OUyA8ZGVidWctc3ltYm9scz5vbiA6IC1nb3B0IDsKK2ZsYWdzIHBnaS5jb21waWxlIE9QVElPTlMgPHByb2ZpbGluZz5vbiA6IC14cHJvZmlsZT10Y292IDsKK2ZsYWdzIHBnaS5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5zcGVlZCA6IC1mYXN0IC1NeCw4LDB4MTAwMDAwMDAgOworZmxhZ3MgcGdpLmNvbXBpbGUgT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwYWNlIDogLXhPMiAteHNwYWNlIDsKKyMgZmxhZ3MgcGdpLmNvbXBpbGUgT1BUSU9OUyA8dGhyZWFkaW5nPm11bHRpIDogLW10IDsKKworZmxhZ3MgcGdpLmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3M+b2ZmIDogLU1pbmZvcm09c2V2ZXJlIDsKK2ZsYWdzIHBnaS5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzPm9uIDogLU1pbmZvcm09d2FybiA7CisKK2ZsYWdzIHBnaS5jb21waWxlLmMrKyBPUFRJT05TIDxpbmxpbmluZz5vZmYgOiAtSU5MSU5FOm5vbmUgOworCitmbGFncyBwZ2kuY29tcGlsZSBPUFRJT05TIDxjZmxhZ3M+IDsKK2ZsYWdzIHBnaS5jb21waWxlLmMrKyBPUFRJT05TIDxjeHhmbGFncz4gOworZmxhZ3MgcGdpLmNvbXBpbGUgREVGSU5FUyA8ZGVmaW5lPiA7CitmbGFncyBwZ2kuY29tcGlsZSBJTkNMVURFUyA8aW5jbHVkZT4gOworCitmbGFncyBwZ2kuY29tcGlsZS5mb3J0cmFuIE9QVElPTlMgPGZmbGFncz4gOworCithY3Rpb25zIGNvbXBpbGUuYworeworICAgICIkKENPTkZJR19DX0NPTU1BTkQpIiAkKE9QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCithY3Rpb25zIGNvbXBpbGUuYysrCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAkKE9QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCithY3Rpb25zIGNvbXBpbGUuZm9ydHJhbgoreworICAgICIkKENPTkZJR19GX0NPTU1BTkQpIiAkKE9QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCisjIERlY2xhcmUgZmxhZ3MgYW5kIGFjdGlvbnMgZm9yIGxpbmtpbmcKK2ZsYWdzIHBnaS5saW5rIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b24gOiAtZ29wdCA7CisjIFN0cmlwIHRoZSBiaW5hcnkgd2hlbiBubyBkZWJ1Z2dpbmcgaXMgbmVlZGVkCitmbGFncyBwZ2kubGluayBPUFRJT05TIDxkZWJ1Zy1zeW1ib2xzPm9mZiA6IC1zIDsKK2ZsYWdzIHBnaS5saW5rIE9QVElPTlMgPHByb2ZpbGluZz5vbiA6IC14cHJvZmlsZT10Y292IDsKK2ZsYWdzIHBnaS5saW5rIE9QVElPTlMgPGxpbmtmbGFncz4gOworZmxhZ3MgcGdpLmxpbmsgT1BUSU9OUyA8bGluaz5zaGFyZWQgOiAtZnBpYyAtZlBJQyA7CitmbGFncyBwZ2kubGluayBMSU5LUEFUSCA8bGlicmFyeS1wYXRoPiA7CitmbGFncyBwZ2kubGluayBGSU5ETElCUy1TVCA8ZmluZC1zdGF0aWMtbGlicmFyeT4gOworZmxhZ3MgcGdpLmxpbmsgRklORExJQlMtU0EgPGZpbmQtc2hhcmVkLWxpYnJhcnk+IDsKK2ZsYWdzIHBnaS5saW5rIEZJTkRMSUJTLVNBIDx0aHJlYWRpbmc+bXVsdGkgOiBwdGhyZWFkIHJ0IDsKK2ZsYWdzIHBnaS5saW5rIExJQlJBUklFUyA8bGlicmFyeS1maWxlPiA7CitmbGFncyBwZ2kubGluayBMSU5LLVJVTlRJTUUgPHJ1bnRpbWUtbGluaz5zdGF0aWMgOiBzdGF0aWMgOworZmxhZ3MgcGdpLmxpbmsgTElOSy1SVU5USU1FIDxydW50aW1lLWxpbms+c2hhcmVkIDogZHluYW1pYyA7CitmbGFncyBwZ2kubGluayBSUEFUSCA8ZGxsLXBhdGg+IDsKKworIyBPbiBnY2MsIHRoZXJlIGFyZSBzZXBhcmF0ZSBvcHRpb25zIGZvciBkbGwgcGF0aCBhdCBydW50aW1lIGFuZAorIyBsaW5rIHRpbWUuIE9uIFNvbGFyaXMsIHRoZXJlJ3Mgb25seSBvbmU6IC1SLCBzbyB3ZSBoYXZlIHRvIHVzZQorIyBpdCwgZXZlbiB0aG91Z2ggaXQncyBiYWQgaWRlYS4KK2ZsYWdzIHBnaS5saW5rIFJQQVRIIDx4ZGxsLXBhdGg+IDsKKworcnVsZSBsaW5rICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBTUEFDRSBvbiAkKHRhcmdldHMpID0gIiAiIDsKK30KKworIyByZWRkaXNoIGNhbiBvbmx5IGxpbmsgc3RhdGljYWxseSBhbmQsIHNvbWVob3csIHRoZSBwcmVzZW5jZSBvZiAtQmR5bmFtaWMgb24gdGhlIGxpbmsgbGluZSAKKyMgbWFya3MgdGhlIGV4ZWN1dGFibGUgYXMgYSBkeW5hbWljYWxseSBsaW5rZWQgZXhlYyBldmVuIHRob3VnaCBubyBkeW5hbWljIGxpYnJhcmllcyBhcmUgc3VwcGxpZWQuCisjIFlvZCBvbiByZWRzdG9ybSByZWZ1c2VzIHRvIGxvYWQgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGR5bmFtaWNhbGx5IGxpbmtlZC4KKyMgcmVtb3ZpbmcgdGhlIGR5bmFtaWMgbGluayBvcHRpb25zIHNob3VsZCBnZXQgdXMgd2hlcmUgd2UgbmVlZCB0byBiZSBvbiByZWRzdG9ybS4KKyMgIiQoQ09ORklHX0NPTU1BTkQpIiAkKE9QVElPTlMpIC1MIiQoTElOS1BBVEgpIiAtUiIkKFJQQVRIKSIgLW8gIiQoPCkiICIkKD4pIiAiJChMSUJSQVJJRVMpIiAtQmR5bmFtaWMgLWwkKEZJTkRMSUJTLVNBKSAtQnN0YXRpYyAtbCQoRklORExJQlMtU1QpIC1CJChMSU5LLVJVTlRJTUUpCithY3Rpb25zIGxpbmsgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoT1BUSU9OUykgLUwiJChMSU5LUEFUSCkiIC1SIiQoUlBBVEgpIiAtbyAiJCg8KSIgIiQoPikiICIkKExJQlJBUklFUykiIC1Cc3RhdGljIC1sJChGSU5ETElCUy1TVCkgLUJkeW5hbWljIC1sJChGSU5ETElCUy1TQSkgLUIkKExJTkstUlVOVElNRSkKK30KKworIyBTbGlnaHQgbW9kcyBmb3IgZGxscworcnVsZSBsaW5rLmRsbCAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgU1BBQ0Ugb24gJCh0YXJnZXRzKSA9ICIgIiA7Cit9CisKKyMgIiQoQ09ORklHX0NPTU1BTkQpIiAkKE9QVElPTlMpIC1MIiQoTElOS1BBVEgpIiAtUiIkKFJQQVRIKSIgLW8gIiQoPCkiIC1oJCg8WzFdOkQ9KSAtRyAiJCg+KSIgIiQoTElCUkFSSUVTKSIgLUJkeW5hbWljIC1sJChGSU5ETElCUy1TQSkgLUJzdGF0aWMgLWwkKEZJTkRMSUJTLVNUKSAtQiQoTElOSy1SVU5USU1FKQorCithY3Rpb25zIGxpbmsuZGxsIGJpbmQgTElCUkFSSUVTCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAkKE9QVElPTlMpIC1zaGFyZWQgLUwiJChMSU5LUEFUSCkiIC1SIiQoUlBBVEgpIiAtbyAiJCg8KSIgIiQoPikiIC1XbCwtaCAtV2wsJCg8WzFdOkQ9KSAiJChMSUJSQVJJRVMpIiAtQmR5bmFtaWMgLWwkKEZJTkRMSUJTLVNBKSAtQnN0YXRpYyAtbCQoRklORExJQlMtU1QpIC1CJChMSU5LLVJVTlRJTUUpCit9CisKK2FjdGlvbnMgdXBkYXRlZCB0b2dldGhlciBwaWVjZW1lYWwgcGdpLmFyY2hpdmUKK3sKKyAgICBhciAtcmMkKEFSRkxBR1M6RT0pICIkKDwpIiAiJCg+KSIKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9wbmcuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9wbmcuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDRmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3BuZy5qYW0KQEAgLTAsMCArMSwyMjYgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEwIFZsYWRpbWlyIFBydXMuCisjIENvcHlyaWdodCAoYykgMjAxMyBTdGV2ZW4gV2F0YW5hYmUKKyMKKyMgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorIyBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgU3VwcG9ydHMgdGhlIGxpYnBuZyBsaWJyYXJ5CisjCisjIEFmdGVyICd1c2luZyBsaWJwbmcnLCB0aGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIGF2YWlsYWJsZToKKyMKKyMgL2xpYnBuZy8vbGlicG5nIC0tIFRoZSBsaWJwbmcgbGlicmFyeQorCitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgYWMgOworaW1wb3J0IGVycm9ycyA7CitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgdGFyZ2V0cyA7IAoraW1wb3J0IHBhdGggOworaW1wb3J0IG1vZHVsZXMgOworaW1wb3J0IGVycm9ycyA7CitpbXBvcnQgaW5kaXJlY3QgOworaW1wb3J0IHByb3BlcnR5IDsKK2ltcG9ydCBwcm9wZXJ0eS1zZXQgOworCitoZWFkZXIgPSBwbmcuaCA7CituYW1lcyA9IGxpYnBuZyA7CisKK3NvdXJjZXMgPSAgIHBuZy5jIHBuZ2Vycm9yLmMgcG5nZ2V0LmMgcG5nbWVtLmMgcG5ncHJlYWQuYyBwbmdyZWFkLmMgcG5ncmlvLmMgcG5ncnRyYW4uYyBwbmdydXRpbC5jCisgICAgICAgICAgICBwbmdzZXQuYyBwbmd0cmFucy5jIHBuZ3dpby5jIHBuZ3dyaXRlLmMgcG5nd3RyYW4uYyBwbmd3dXRpbC5jIDsKKworbGlicmFyeS1pZCA9IDAgOworCitpZiAtLWRlYnVnLWNvbmZpZ3VyYXRpb24gaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0KK3sKKyAgICAuZGVidWcgPSAgdHJ1ZSA7Cit9CisKKyMgSW5pdGlhbGl6ZXMgdGhlIGxpYnBuZyBsaWJyYXJ5LgorIworIyBsaWJwbmcgY2FuIGJlIGNvbmZpZ3VyZWQgZWl0aGVyIHRvIHVzZSBwcmUtZXhpc3RpbmcgYmluYXJpZXMKKyMgb3IgdG8gYnVpbGQgdGhlIGxpYnJhcnkgZnJvbSBzb3VyY2UuCisjCisjIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgcHJlYnVpbHQgbGlicG5nOjoKKyMKKyMgICA8c2VhcmNoPgorIyAgICAgICBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpYnBuZyBiaW5hcmllcy4KKyMgICA8bmFtZT4KKyMgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGxpYnJhcnkgbmFtZS4KKyMgICA8aW5jbHVkZT4KKyMgICAgICAgVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBsaWJwbmcgaGVhZGVycy4KKyMKKyMgSWYgbm9uZSBvZiB0aGVzZSBvcHRpb25zIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgZW52aXJvbm1lbnRhbAorIyB2YXJpYWJsZXMgTElCUE5HX0xJQlJBUllfUEFUSCwgTElCUE5HX05BTUUsIGFuZCBMSUJQTkdfSU5DTFVERSB3aWxsCisjIGJlIHVzZWQgaW5zdGVhZC4KKyMKKyMgT3B0aW9ucyBmb3IgYnVpbGRpbmcgbGlicG5nIGZyb20gc291cmNlOjoKKyMKKyMgICA8c291cmNlPgorIyAgICAgICBUaGUgbGlicG5nIHNvdXJjZSBkaXJlY3RvcnkuICBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnRhbCB2YXJpYWJsZQorIyAgICAgICBMSUJQTkdfU09VUkNFLgorIyAgIDx0YWc+CisjICAgICAgIEEgcnVsZSB3aGljaCBjb21wdXRlcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIGNvbXBpbGVkCisjICAgICAgIGxpYnJhcmllcyBiYXNlZCBvbiB0aGUgYnVpbGQgcHJvcGVydGllcy4gIElnbm9yZWQKKyMgICAgICAgd2hlbiB1c2luZyBwcmVjb21waWxlZCBiaW5hcmllcy4KKyMgICA8YnVpbGQtbmFtZT4KKyMgICAgICAgVGhlIGJhc2UgbmFtZSB0byB1c2UgZm9yIHRoZSBjb21waWxlZCBsaWJyYXJ5LiAgSWdub3JlZAorIyAgICAgICB3aGVuIHVzaW5nIHByZWNvbXBpbGVkIGJpbmFyaWVzLgorIworIyBFeGFtcGxlczo6CisjCisjICAgIyBGaW5kIGxpYnBuZyBpbiB0aGUgZGVmYXVsdCBzeXN0ZW0gbG9jYXRpb24KKyMgICB1c2luZyBsaWJwbmcgOworIyAgICMgQnVpbGQgbGlicG5nIGZyb20gc291cmNlCisjICAgdXNpbmcgbGlicG5nIDogMS41LjQgOiA8c291cmNlPi9ob21lL3N0ZXZlbi9saWJwbmctMS41LjQgOworIyAgICMgRmluZCBsaWJwbmcgaW4gL3Vzci9sb2NhbAorIyAgIHVzaW5nIGxpYnBuZyA6IDEuNS40CisjICAgICA6IDxpbmNsdWRlPi91c3IvbG9jYWwvaW5jbHVkZSA8c2VhcmNoPi91c3IvbG9jYWwvbGliIDsKKyMgICAjIEJ1aWxkIGxpYnBuZyBmcm9tIHNvdXJjZSBmb3IgbXN2YyBhbmQgZmluZAorIyAgICMgcHJlYnVpbHQgYmluYXJpZXMgZm9yIGdjYy4KKyMgICB1c2luZyBsaWJwbmcgOiAxLjUuNCA6IDxzb3VyY2U+QzovRGV2ZWwvc3JjL2xpYnBuZy0xLjUuNCA6IDx0b29sc2V0Pm1zdmMgOworIyAgIHVzaW5nIGxpYnBuZyA6IDEuNS40IDogOiA8dG9vbHNldD5nY2MgOworIworcnVsZSBpbml0ICgKKyAgICB2ZXJzaW9uID8KKyAgICAjIFRoZSBsaWJwbmcgdmVyc2lvbiAoY3VycmVudGx5IGlnbm9yZWQpCisKKyAgICA6IG9wdGlvbnMgKgorICAgICMgQSBsaXN0IG9mIHRoZSBvcHRpb25zIHRvIHVzZQorCisgICAgOiByZXF1aXJlbWVudHMgKgorICAgICMgVGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGxpYnBuZyB0YXJnZXQKKworICAgIDogaXMtZGVmYXVsdCA/CisgICAgIyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25zIGFyZSBvbmx5IHVzZWQgd2hlbiBsaWJwbmcKKyAgICAjIGhhcyBub3QgeWV0IGJlZW4gY29uZmlndXJlZC4KKyAgICApCit7CisgICAgbG9jYWwgY2FsbGVyID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7CisKKyAgICBpZiAhICQoLmluaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgLmluaXRpYWxpemVkID0gdHJ1ZSA7CisKKyAgICAgICAgcHJvamVjdC5pbml0aWFsaXplICQoX19uYW1lX18pIDsKKyAgICAgICAgLnByb2plY3QgPSBbIHByb2plY3QuY3VycmVudCBdIDsKKyAgICAgICAgcHJvamVjdCBsaWJwbmcgOworICAgIH0KKworICAgIGxvY2FsIGxpYnJhcnktcGF0aCA9IFsgcHJvcGVydHkuc2VsZWN0IDxzZWFyY2g+IDogJChvcHRpb25zKSBdIDsKKyAgICBsaWJyYXJ5LXBhdGggPSAkKGxpYnJhcnktcGF0aDpHPSkgOworICAgIGxvY2FsIGluY2x1ZGUtcGF0aCA9IFsgcHJvcGVydHkuc2VsZWN0IDxpbmNsdWRlPiA6ICQob3B0aW9ucykgXSA7CisgICAgaW5jbHVkZS1wYXRoID0gJChpbmNsdWRlLXBhdGg6Rz0pIDsKKyAgICBsb2NhbCBzb3VyY2UtcGF0aCA9IFsgcHJvcGVydHkuc2VsZWN0IDxzb3VyY2U+IDogJChvcHRpb25zKSBdIDsKKyAgICBzb3VyY2UtcGF0aCA9ICQoc291cmNlLXBhdGg6Rz0pIDsKKyAgICBsb2NhbCBsaWJyYXJ5LW5hbWUgPSBbIHByb3BlcnR5LnNlbGVjdCA8bmFtZT4gOiAkKG9wdGlvbnMpIF0gOworICAgIGxpYnJhcnktbmFtZSA9ICQobGlicmFyeS1uYW1lOkc9KSA7CisgICAgbG9jYWwgdGFnID0gWyBwcm9wZXJ0eS5zZWxlY3QgPHRhZz4gOiAkKG9wdGlvbnMpIF0gOworICAgIHRhZyA9ICQodGFnOkc9KSA7CisgICAgbG9jYWwgYnVpbGQtbmFtZSA9IFsgcHJvcGVydHkuc2VsZWN0IDxidWlsZC1uYW1lPiA6ICQob3B0aW9ucykgXSA7CisgICAgYnVpbGQtbmFtZSA9ICQoYnVpbGQtbmFtZTpHPSkgOworCisgICAgY29uZGl0aW9uID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQocmVxdWlyZW1lbnRzKSBdIDsKKyAgICBjb25kaXRpb24gPSBbIHByb3BlcnR5LXNldC5jcmVhdGUgWyAkKGNvbmRpdGlvbikuYmFzZSBdIF0gOworCisgICAgbG9jYWwgbm8tYnVpbGQtZnJvbS1zb3VyY2UgOworICAgICMgSWdub3JlIGVudmlyb25tZW50YWwgWkxJQl9TT1VSQ0UgaWYgdGhpcyBpbml0aWFsaXphdGlvbgorICAgICMgcmVxdWVzdGVkIHRvIHNlYXJjaCBmb3IgYSBzcGVjaWZpYyBwcmUtYnVpbHQgbGlicmFyeS4KKyAgICBpZiAkKGxpYnJhcnktcGF0aCkgfHwgJChpbmNsdWRlLXBhdGgpIHx8ICQobGlicmFyeS1uYW1lKQorICAgIHsKKyAgICAgICAgaWYgJChzb3VyY2UtcGF0aCkgfHwgJCh0YWcpIHx8ICQoYnVpbGQtbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgImluY29tcGF0aWJsZSBvcHRpb25zIGZvciBsaWJwbmc6IgorICAgICAgICAgICAgICAgIFsgcHJvcGVydHkuc2VsZWN0IDxzZWFyY2g+IDxpbmNsdWRlPiA8bmFtZT4gOiAkKG9wdGlvbnMpIF0gImFuZCIKKyAgICAgICAgICAgICAgICBbIHByb3BlcnR5LnNlbGVjdCA8c291cmNlPiA8dGFnPiA8YnVpbGQtbmFtZT4gOiAkKG9wdGlvbnMpIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm8tYnVpbGQtZnJvbS1zb3VyY2UgPSB0cnVlIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNvdXJjZS1wYXRoID89IFsgbW9kdWxlcy5wZWVrIDogWkxJQl9TT1VSQ0UgXSA7CisKKyAgICBpZiAkKC5jb25maWd1cmVkLiQoY29uZGl0aW9uKSkKKyAgICB7CisgICAgICAgIGlmICQoaXMtZGVmYXVsdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJCguZGVidWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAibm90aWNlOiBbbGlicG5nXSBsaWJwbmcgaXMgYWxyZWFkeSBjb25maWd1cmVkIiA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcnMudXNlci1lcnJvciAibGlicG5nIGlzIGFscmVhZHkgY29uZmlndXJlZCIgOworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIGVsc2UgaWYgJChzb3VyY2UtcGF0aCkgJiYgISAkKG5vLWJ1aWxkLWZyb20tc291cmNlKQorICAgIHsKKyAgICAgICAgYnVpbGQtbmFtZSA/PSB6IDsKKyAgICAgICAgbGlicmFyeS1pZCA9IFsgQ0FMQyAkKGxpYnJhcnktaWQpICsgMSBdIDsKKyAgICAgICAgdGFnID0gWyBNQVRDSCBeQD8oLiopJCA6ICQodGFnKSBdIDsKKyAgICAgICAgaWYgJCh0YWcpICYmICEgWyBNQVRDSCBeKFteJV0qKSUoW14lXSspJCA6ICQodGFnKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHRhZyA9IFsgaW5kaXJlY3QubWFrZSAkKHRhZykgOiBbICQoY2FsbGVyKS5wcm9qZWN0LW1vZHVsZSBdIF0gOworICAgICAgICB9CisgICAgICAgIHNvdXJjZXMgPSBbIHBhdGguZ2xvYiAkKHNvdXJjZS1wYXRoKSA6ICQoc291cmNlcykgXSA7CisgICAgICAgIGlmICQoLmRlYnVnKQorICAgICAgICB7CisgICAgICAgICAgICBFQ0hPICJub3RpY2U6IFtsaWJwbmddIEJ1aWxkaW5nIGxpYnBuZyBmcm9tIHNvdXJjZSBhcyAkKGJ1aWxkLW5hbWUpIiA7CisgICAgICAgICAgICBpZiAkKGNvbmRpdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFQ0hPICJub3RpY2U6IFtsaWJwbmddIENvbmRpdGlvbiIgWyAkKGNvbmRpdGlvbikucmF3IF0gOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgJChzb3VyY2VzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIm5vdGljZTogW2xpYnBuZ10gZm91bmQgbGlicG5nIHNvdXJjZSBpbiAkKHNvdXJjZS1wYXRoKSIgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIndhcm5pbmc6IFtsaWJwbmddIGNvdWxkIG5vdCBmaW5kIGxpYnBuZyBzb3VyY2UgaW4gJChzb3VyY2UtcGF0aCkiIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2NhbCB0YXJnZXQgOworICAgICAgICBpZiAkKHNvdXJjZXMpIHsKKyAgICAgICAgICAgIHRhcmdldCA9IFsgdGFyZ2V0cy5jcmVhdGUtdHlwZWQtdGFyZ2V0IExJQiA6ICQoLnByb2plY3QpCisgICAgICAgICAgICAgIDogJChidWlsZC1uYW1lKS4kKGxpYnJhcnktaWQpCisgICAgICAgICAgICAgIDogJChzb3VyY2VzKQorICAgICAgICAgICAgICA6ICQocmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgICAgIDx0YWc+QCQodGFnKQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPiQoc291cmNlLXBhdGgpCisgICAgICAgICAgICAgICAgPHRvb2xzZXQ+bXN2Yzo8ZGVmaW5lPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorICAgICAgICAgICAgICAgIDx0b29sc2V0Pm1zdmM6PGRlZmluZT5fU0NMX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyAgICAgICAgICAgICAgICA8bGluaz5zaGFyZWQ6PGRlZmluZT5aTElCX0RMTAorICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgIDogPGluY2x1ZGU+JChzb3VyY2UtcGF0aCkgXSA7CisgICAgICAgIH0KKworICAgICAgICBsb2NhbCBtdCA9IFsgbmV3IGFjLWxpYnJhcnkgbGlicG5nIDogJCgucHJvamVjdCkgOiAkKGNvbmRpdGlvbikgXSA7CisgICAgICAgICQobXQpLnNldC1oZWFkZXIgJChoZWFkZXIpIDsKKyAgICAgICAgJChtdCkuc2V0LWRlZmF1bHQtbmFtZXMgJChuYW1lcykgOworICAgICAgICBpZiAkKHRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgJChtdCkuc2V0LXRhcmdldCAkKHRhcmdldCkgOworICAgICAgICB9CisgICAgICAgIHRhcmdldHMubWFpbi10YXJnZXQtYWx0ZXJuYXRpdmUgJChtdCkgOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICQoLmRlYnVnKQorICAgICAgICB7CisgICAgICAgICAgICBFQ0hPICJub3RpY2U6IFtsaWJwbmddIFVzaW5nIHByZS1pbnN0YWxsZWQgbGlicmFyeSIgOworICAgICAgICAgICAgaWYgJChjb25kaXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAibm90aWNlOiBbbGlicG5nXSBDb25kaXRpb24iIFsgJChjb25kaXRpb24pLnJhdyBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIG10ID0gWyBuZXcgYWMtbGlicmFyeSBsaWJwbmcgOiAkKC5wcm9qZWN0KSA6ICQoY29uZGl0aW9uKSA6CisgICAgICAgICAgICAkKGluY2x1ZGUtcGF0aCkgOiAkKGxpYnJhcnktcGF0aCkgOiAkKGxpYnJhcnktbmFtZSkgOiAkKHJvb3QpIF0gOworICAgICAgICAkKG10KS5zZXQtaGVhZGVyICQoaGVhZGVyKSA7CisgICAgICAgICQobXQpLnNldC1kZWZhdWx0LW5hbWVzICQobmFtZXMpIDsKKyAgICAgICAgdGFyZ2V0cy5tYWluLXRhcmdldC1hbHRlcm5hdGl2ZSAkKG10KSA7CisgICAgfQorICAgIC5jb25maWd1cmVkLiQoY29uZGl0aW9uKSA9IHRydWUgOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9weXRob24tY29uZmlnLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcHl0aG9uLWNvbmZpZy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBhYTgyNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcHl0aG9uLWNvbmZpZy5qYW0KQEAgLTAsMCArMSwyNyBAQAorI34gQ29weXJpZ2h0IDIwMDUgUmVuZSBSaXZlcmEuCisjfiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjfiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgQXV0b21hdGljIGNvbmZpZ3VyYXRpb24gZm9yIFB5dGhvbiB0b29scyBhbmQgbGlicnJpZXMuIFRvIHVzZSwganVzdCBpbXBvcnQgdGhpcyBtb2R1bGUuCisKK2ltcG9ydCBvcyA7CitpbXBvcnQgdG9vbHNldCA6IHVzaW5nIDsKKworaWYgWyBvcy5uYW1lIF0gPSBOVAoreworICAgIGZvciBsb2NhbCBSIGluIDIuNCAyLjMgMi4yCisgICAgeworICAgICAgICBsb2NhbCBweXRob24tcGF0aCA9IFsgVzMyX0dFVFJFRworICAgICAgICAgICAgIkhLRVlfTE9DQUxfTUFDSElORVxcU09GVFdBUkVcXFB5dGhvblxcUHl0aG9uQ29yZVxcJChSKVxcSW5zdGFsbFBhdGgiIF0gOworICAgICAgICBsb2NhbCBweXRob24tdmVyc2lvbiA9ICQoUikgOworICAgICAgICAKKyAgICAgICAgaWYgJChweXRob24tcGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgLS1kZWJ1Zy1jb25maWd1cmF0aW9uIGluIFsgbW9kdWxlcy5wZWVrIDogQVJHViBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAibm90aWNlOiIgdXNpbmcgcHl0aG9uICI6IiAkKHB5dGhvbi12ZXJzaW9uKSAiOiIgJChweXRob24tcGF0aCkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXNpbmcgcHl0aG9uIDogJChweXRob24tdmVyc2lvbikgOiAkKHB5dGhvbi1wYXRoKSA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3B5dGhvbi5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3B5dGhvbi5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwYTUxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcHl0aG9uLmphbQpAQCAtMCwwICsxLDEyNTggQEAKKyMgQ29weXJpZ2h0IDIwMDQgVmxhZGltaXIgUHJ1cy4KKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCisjIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBTdXBwb3J0IGZvciBQeXRob24gYW5kIHRoZSB0aGUgQm9vc3QuUHl0aG9uIGxpYnJhcnkuCisjCisjIFRoaXMgbW9kdWxlIGRlZmluZXMKKyMKKyMgLSBhIHByb2plY3QgJ3B5dGhvbicgd2l0aCBhIHRhcmdldCAncHl0aG9uJyBpbiBpdCwgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKKyMgICBweXRob24gbGlicmFyeQorIworIyAtIGEgbWFpbiB0YXJnZXQgcnVsZSAncHl0aG9uLWV4dGVuc2lvbicgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBweXRob24KKyMgICBleHRlbnNpb24uCisjCisjIEV4dGVuc2lvbnMgdGhhdCB1c2UgQm9vc3QuUHl0aG9uIG11c3QgZXhwbGljaXRseSBsaW5rIHRvIGl0LgorCitpbXBvcnQgdHlwZSA7CitpbXBvcnQgdGVzdGluZyA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgZXJyb3JzIDsKK2ltcG9ydCB0YXJnZXRzIDsKK2ltcG9ydCAiY2xhc3MiIDogbmV3IDsKK2ltcG9ydCBvcyA7CitpbXBvcnQgY29tbW9uIDsKK2ltcG9ydCB0b29sc2V0IDsKK2ltcG9ydCByZWdleCA7CitpbXBvcnQgbnVtYmVycyA7CitpbXBvcnQgc3RyaW5nIDsKK2ltcG9ydCBwcm9wZXJ0eSA7CitpbXBvcnQgc2VxdWVuY2UgOworaW1wb3J0IHBhdGggOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IHNldCA7CitpbXBvcnQgYnVpbHRpbiA7CisKKworIyBNYWtlIHRoaXMgbW9kdWxlIGEgcHJvamVjdC4KK3Byb2plY3QuaW5pdGlhbGl6ZSAkKF9fbmFtZV9fKSA7Citwcm9qZWN0IHB5dGhvbiA7CisKKyMgU2F2ZSB0aGUgcHJvamVjdCBzbyB0aGF0IGlmICdpbml0JyBpcyBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB3ZSBkZWZpbmUgbmV3CisjIHRhcmdldHMgaW4gdGhlIHB5dGhvbiBwcm9qZWN0LCBub3QgaW4gd2hhdGV2ZXIgcHJvamVjdCB3ZSB3ZXJlIGNhbGxlZCBieS4KKy5wcm9qZWN0ID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7CisKKyMgRHluYW1pYyBsaW5rZXIgbGliLiBOZWNlc3NhcnkgdG8gc3BlY2lmeSBpdCBleHBsaWNpdGx5IG9uIHNvbWUgcGxhdGZvcm1zLgorbGliIGRsIDsKKyMgVGhpcyBjb250YWlucyAnb3BlbnB0eScgZnVuY3Rpb24gbmVlZCBieSBweXRob24uIEFnYWluLCBvbiBzb21lIHN5c3RlbSBuZWVkIHRvCisjIHBhc3MgdGhpcyB0byBsaW5rZXIgZXhwbGljaXRseS4KK2xpYiB1dGlsIDsKKyMgUHl0aG9uIHVzZXMgcHRocmVhZCBzeW1ib2xzLgorbGliIHB0aHJlYWQgOworIyBFeHRyYSBsaWJyYXJ5IG5lZWRlZCBieSBwaHRyZWFkIG9uIHNvbWUgcGxhdGZvcm1zLgorbGliIHJ0IDsKKworIyBUaGUgcHl0aG9ucGF0aCBmZWF0dXJlIHNwZWNpZmllcyBhZGRpdGlvbmFsIGVsZW1lbnRzIGZvciB0aGUgUFlUSE9OUEFUSAorIyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgc2V0IGJ5IHJ1bi1weWQuIEZvciBleGFtcGxlLCBweXRob25wYXRoIGNhbiBiZSB1c2VkIHRvCisjIGFjY2VzcyBQeXRob24gbW9kdWxlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBwcm9kdWN0IGJlaW5nIGJ1aWx0LCBidXQgYXJlIG5vdAorIyBpbnN0YWxsZWQgaW4gdGhlIGRldmVsb3BtZW50IHN5c3RlbSdzIGRlZmF1bHQgcGF0aHMuCitmZWF0dXJlLmZlYXR1cmUgcHl0aG9ucGF0aCA6IDogZnJlZSBvcHRpb25hbCBwYXRoIDsKKworIyBJbml0aWFsaXplcyB0aGUgUHl0aG9uIHRvb2xzZXQuIE5vdGUgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwuCisjCisjIC0gdmVyc2lvbiAtLSB0aGUgdmVyc2lvbiBvZiBQeXRob24gdG8gdXNlLiBTaG91bGQgYmUgaW4gTWFqb3IuTWlub3IgZm9ybWF0LAorIyAgIGZvciBleGFtcGxlIDIuMy4gIERvIG5vdCBpbmNsdWRlIHRoZSBzdWJtaW5vciB2ZXJzaW9uLgorIworIyAtIGNtZC1vci1wcmVmaXg6IFByZWZlcmFibHksIGEgY29tbWFuZCB0aGF0IGludm9rZXMgYSBQeXRob24gaW50ZXJwcmV0ZXIuCisjICAgQWx0ZXJuYXRpdmVseSwgdGhlIGluc3RhbGxhdGlvbiBwcmVmaXggZm9yIFB5dGhvbiBsaWJyYXJpZXMgYW5kIGluY2x1ZGVzLiBJZgorIyAgIGVtcHR5LCB3aWxsIGJlIGd1ZXNzZWQgZnJvbSB0aGUgdmVyc2lvbiwgdGhlIHBsYXRmb3JtJ3MgaW5zdGFsbGF0aW9uCisjICAgcGF0dGVybnMsIGFuZCB0aGUgcHl0aG9uIGV4ZWN1dGFibGVzIHRoYXQgY2FuIGJlIGZvdW5kIGluIFBBVEguCisjCisjIC0gaW5jbHVkZXM6IHRoZSBpbmNsdWRlIHBhdGggdG8gUHl0aG9uIGhlYWRlcnMuIElmIGVtcHR5LCB3aWxsIGJlIGd1ZXNzZWQuCisjCisjIC0gbGlicmFyaWVzOiB0aGUgcGF0aCB0byBQeXRob24gbGlicmFyeSBiaW5hcmllcy4gSWYgZW1wdHksIHdpbGwgYmUgZ3Vlc3NlZC4KKyMgICBPbiBNYWNPUy9EYXJ3aW4sIHlvdSBjYW4gYWxzbyBwYXNzIHRoZSBwYXRoIG9mIHRoZSBQeXRob24gZnJhbWV3b3JrLgorIworIyAtIGNvbmRpdGlvbjogaWYgc3BlY2lmaWVkLCBzaG91bGQgYmUgYSBzZXQgb2YgcHJvcGVydGllcyB0aGF0IGFyZSBtYXRjaGVkCisjICAgYWdhaW5zdCB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiB3aGVuIEJvb3N0LkJ1aWxkIHNlbGVjdHMgYSBQeXRob24KKyMgICBjb25maWd1cmF0aW9uIHRvIHVzZS4KKyMKKyMgLSBleHRlbnNpb24tc3VmZml4OiBBIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIG5hbWUgb2YgZXh0ZW5zaW9uIG1vZHVsZXMgYmVmb3JlCisjICAgdGhlIHRydWUgZmlsZW5hbWUgZXh0ZW5zaW9uLiAgT3JkaW5hcmlseSB3ZSB3b3VsZCBqdXN0IGNvbXB1dGUgdGhpcyBiYXNlZCBvbgorIyAgIHRoZSB2YWx1ZSBvZiB0aGUgPHB5dGhvbi1kZWJ1Z2dpbmc+IGZlYXR1cmUuIEhvd2V2ZXIgdWJ1bnR1J3MgcHl0aG9uLWRiZworIyAgIHBhY2thZ2UgdXNlcyB0aGUgd2luZG93cyBjb252ZW50aW9uIG9mIGFwcGVuZGluZyBfZCB0byBkZWJ1Zy1idWlsZCBleHRlbnNpb24KKyMgICBtb2R1bGVzLiBXZSBoYXZlIG5vIHdheSBvZiBkZXRlY3RpbmcgdWJ1bnR1LCBvciBvZiBwcm9iaW5nIHB5dGhvbiBmb3IgdGhlCisjICAgIl9kIiByZXF1aXJlbWVudCwgYW5kIGlmIHlvdSBjb25maWd1cmUgYW5kIGJ1aWxkIHB5dGhvbiB1c2luZworIyAgIC0td2l0aC1weWRlYnVnLCB5b3UnbGwgYmUgdXNpbmcgdGhlIHN0YW5kYXJkICpuaXggY29udmVudGlvbi4gRGVmYXVsdHMgdG8gIiIKKyMgICAob3IgIl9kIiB3aGVuIHRhcmdldGluZyB3aW5kb3dzIGFuZCA8cHl0aG9uLWRlYnVnZ2luZz4gaXMgc2V0KS4KKyMKKyMgRXhhbXBsZSB1c2FnZToKKyMKKyMgICB1c2luZyBweXRob24gOiAyLjMgOworIyAgIHVzaW5nIHB5dGhvbiA6IDIuMyA6IC91c3IvbG9jYWwvYmluL3B5dGhvbiA7CisjCitydWxlIGluaXQgKCB2ZXJzaW9uID8gOiBjbWQtb3ItcHJlZml4ID8gOiBpbmNsdWRlcyAqIDogbGlicmFyaWVzID8KKyAgICA6IGNvbmRpdGlvbiAqIDogZXh0ZW5zaW9uLXN1ZmZpeCA/ICkKK3sKKyAgICBwcm9qZWN0LnB1c2gtY3VycmVudCAkKC5wcm9qZWN0KSA7CisKKyAgICBkZWJ1Zy1tZXNzYWdlIENvbmZpZ3VyaW5nIHB5dGhvbi4uLiA7CisgICAgZm9yIGxvY2FsIHYgaW4gdmVyc2lvbiBjbWQtb3ItcHJlZml4IGluY2x1ZGVzIGxpYnJhcmllcyBjb25kaXRpb24KKyAgICB7CisgICAgICAgIGlmICQoJCh2KSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVidWctbWVzc2FnZSAiICB1c2VyLXNwZWNpZmllZCAiJCh2KTogXCIkKCQodikpXCIgOworICAgICAgICB9CisgICAgfQorCisgICAgY29uZmlndXJlICQodmVyc2lvbikgOiAkKGNtZC1vci1wcmVmaXgpIDogJChpbmNsdWRlcykgOiAkKGxpYnJhcmllcykgOiAkKGNvbmRpdGlvbikgOiAkKGV4dGVuc2lvbi1zdWZmaXgpIDsKKworICAgIHByb2plY3QucG9wLWN1cnJlbnQgOworfQorCisjIEEgc2ltcGxlciB2ZXJzaW9uIG9mIFNIRUxMIHRoYXQgZ3JhYnMgc3RkZXJyIGFzIHdlbGwgYXMgc3Rkb3V0LCBidXQgcmV0dXJucworIyBub3RoaW5nIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KKyMKK2xvY2FsIHJ1bGUgc2hlbGwtY21kICggY21kICkKK3sKKyAgICBkZWJ1Zy1tZXNzYWdlIHJ1bm5pbmcgY29tbWFuZCAnJChjbWQpIiAyPiYxIicgOworICAgIHggPSBbIFNIRUxMICQoY21kKSIgMj4mMSIgOiBleGl0LXN0YXR1cyBdIDsKKyAgICBpZiAkKHhbMl0pID0gMAorICAgIHsKKyAgICAgICAgcmV0dXJuICQoeFsxXSkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gOworICAgIH0KK30KKworCisjIFRyeSB0byBpZGVudGlmeSBDeWd3aW4gc3ltbGlua3MuIEludm9raW5nIHN1Y2ggYSBmaWxlIGRpcmVjdGx5IGFzIGFuIE5UCisjIGV4ZWN1dGFibGUgZnJvbSBhIG5hdGl2ZSBXaW5kb3dzIGJ1aWxkIG9mIGJqYW0gd291bGQgYmUgZmF0YWwgdG8gdGhlIGJqYW0KKyMgcHJvY2Vzcy4gT25lIC9jYW4vIGludm9rZSB0aGVtIHRocm91Z2ggc2guZXhlIG9yIGJhc2guZXhlLCBpZiB5b3UgY2FuIHByb3ZlCisjIHRoYXQgdGhvc2UgYXJlIG5vdCBhbHNvIHN5bWxpbmtzLiA7LSkKKyMKKyMgSWYgYSBzeW1saW5rIGlzIGZvdW5kIHJldHVybnMgbm9uLWVtcHR5OyB3ZSB0cnkgdG8gZXh0cmFjdCB0aGUgdGFyZ2V0IG9mIHRoZQorIyBzeW1saW5rIGZyb20gdGhlIGZpbGUgYW5kIHJldHVybiB0aGF0LgorIworIyBOb3RlOiAxLiBvbmx5IHdvcmtzIG9uIE5UICAyLiBwYXRoIGlzIGEgbmF0aXZlIHBhdGguCitsb2NhbCBydWxlIGlzLWN5Z3dpbi1zeW1saW5rICggcGF0aCApCit7CisgICAgbG9jYWwgaXMtc3ltbGluayA9IDsKKworICAgICMgTG9vayBmb3IgYSBmaWxlIHdpdGggdGhlIGdpdmVuIHBhdGggaGF2aW5nIHRoZSBTIGF0dHJpYnV0ZSBzZXQsIGFzIGN5Z3dpbgorICAgICMgc3ltbGlua3MgZG8uIC8tQyBtZWFucyAiZG8gbm90IHVzZSB0aG91c2FuZHMgc2VwYXJhdG9ycyBpbiBmaWxlIHNpemVzLiIKKyAgICBsb2NhbCBkaXItbGlzdGluZyA9IFsgc2hlbGwtY21kICJESVIgLy1DIC9BOlMgXCIiJChwYXRoKSJcIiIgXSA7CisKKyAgICBpZiAkKGRpci1saXN0aW5nKQorICAgIHsKKyAgICAgICAgIyBFc2NhcGUgYW55IHNwZWNpYWwgcmVnZXggY2hhcmFjdGVycyBpbiB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBwYXRoLgorICAgICAgICBsb2NhbCBiYXNlLXBhdCA9IFsgcmVnZXguZXNjYXBlICQocGF0aDpEPSkgOiBdLlsoKSorP3xcXCReIDogXFwgXSA7CisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaWxlJ3Mgc2l6ZSBmcm9tIHRoZSBkaXJlY3RvcnkgbGlzdGluZy4KKyAgICAgICAgbG9jYWwgc2l6ZS1vZi1zeXN0ZW0tZmlsZSA9IFsgTUFUQ0ggIihbMC05XSspICIkKGJhc2UtcGF0KSA6ICQoZGlyLWxpc3RpbmcpIDogMSBdIDsKKworICAgICAgICAjIElmIHRoZSBmaWxlIGhhcyBhIHJlYXNvbmFibHkgc21hbGwgc2l6ZSwgbG9vayBmb3IgdGhlIHNwZWNpYWwgc3ltbGluaworICAgICAgICAjIGlkZW50aWZpY2F0aW9uIHRleHQuCisgICAgICAgIGlmICQoc2l6ZS1vZi1zeXN0ZW0tZmlsZSkgJiYgWyBudW1iZXJzLmxlc3MgJChzaXplLW9mLXN5c3RlbS1maWxlKSAxMDAwIF0KKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgbGluayA9IFsgU0hFTEwgIkZJTkQgL09GRiBcIiE8c3ltbGluaz5cIiBcIiIkKHBhdGgpIlwiIDI+JjEiIF0gOworICAgICAgICAgICAgaWYgJChsaW5rWzJdKSAhPSAwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWwgbmwgPSAiCisKKyIgOworICAgICAgICAgICAgICAgIGlzLXN5bWxpbmsgPSBbIE1BVENIICIuKiE8c3ltbGluaz4oW14iJChubCkiXSopIiA6ICQobGlua1sxXSkgOiAxIF0gOworICAgICAgICAgICAgICAgIGlmICQoaXMtc3ltbGluaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlzLXN5bWxpbmsgPSBbICpuaXgtcGF0aC10by1uYXRpdmUgJChpcy1zeW1saW5rKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgaXMtc3ltbGluayA9ICQoaXMtc3ltbGluazpSPSQocGF0aDpEKSkgOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKGlzLXN5bWxpbmspIDsKK30KKworCisjIEFwcGVuZCBleHQgdG8gZWFjaCBtZW1iZXIgb2YgbmFtZXMgdGhhdCBkb2VzIG5vdCBjb250YWluICcuJy4KKyMKK2xvY2FsIHJ1bGUgZGVmYXVsdC1leHRlbnNpb24gKCBuYW1lcyAqIDogZXh0ICogKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgZm9yIGxvY2FsIG4gaW4gJChuYW1lcykKKyAgICB7CisgICAgICAgIHN3aXRjaCAkKG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgKi4qIDogcmVzdWx0ICs9ICQobikgOworICAgICAgICAgICAgY2FzZSAqIDogcmVzdWx0ICs9ICQobikkKGV4dCkgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgVHJpZXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaW52b2tpbmcgImNtZCIgd291bGQgYWN0dWFsbHkgYXR0ZW1wdCB0byBsYXVuY2ggYQorIyBjeWd3aW4gc3ltbGluay4KKyMKKyMgTm90ZTogb25seSB3b3JrcyBvbiBOVC4KKyMKK2xvY2FsIHJ1bGUgaW52b2tlcy1jeWd3aW4tc3ltbGluayAoIGNtZCApCit7CisgICAgbG9jYWwgZGlycyA9ICQoY21kOkQpIDsKKyAgICBpZiAhICQoZGlycykKKyAgICB7CisgICAgICAgIGRpcnMgPSAuIFsgb3MuZXhlY3V0YWJsZS1wYXRoIF0gOworICAgIH0KKyAgICBsb2NhbCBiYXNlID0gWyBkZWZhdWx0LWV4dGVuc2lvbiAkKGNtZDpEPSkgOiAuZXhlIC5jbWQgLmJhdCBdIDsKKyAgICBsb2NhbCBwYXRocyA9IFsgR0xPQiAkKGRpcnMpIDogJChiYXNlKSBdIDsKKyAgICBpZiAkKHBhdGhzKQorICAgIHsKKyAgICAgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBub3QgcnVuIGludG8gYSBDeWd3aW4gc3ltbGluay4gSW52b2tpbmcgc3VjaCBhIGZpbGUKKyAgICAgICAgIyBhcyBhbiBOVCBleGVjdXRhYmxlIHdvdWxkIGJlIGZhdGFsIGZvciB0aGUgYmphbSBwcm9jZXNzLgorICAgICAgICByZXR1cm4gWyBpcy1jeWd3aW4tc3ltbGluayAkKHBhdGhzWzFdKSBdIDsKKyAgICB9Cit9CisKKworbG9jYWwgcnVsZSBkZWJ1Zy1tZXNzYWdlICggbWVzc2FnZSAqICkKK3sKKyAgICBpZiAtLWRlYnVnLWNvbmZpZ3VyYXRpb24gaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0KKyAgICB7CisgICAgICAgIEVDSE8gbm90aWNlOiBbcHl0aG9uLWNmZ10gJChtZXNzYWdlKSA7CisgICAgfQorfQorCisKKyMgTGlrZSBXMzJfR0VUUkVHLCBleGNlcHQgcHJlcGVuZCBIS0VZX0NVUlJFTlRfVVNFUlxTT0ZUV0FSRSBhbmQKKyMgSEtFWV9MT0NBTF9NQUNISU5FXFNPRlRXQVJFIHRvIHRoZSBmaXJzdCBhcmd1bWVudCwgcmV0dXJuaW5nIHRoZSBmaXJzdCByZXN1bHQKKyMgZm91bmQuIEFsc28gYWNjb3VudHMgZm9yIHRoZSBmYWN0IHRoYXQgb24gNjQtYml0IG1hY2hpbmVzLCAzMi1iaXQgc29mdHdhcmUgaGFzCisjIGl0cyBvd24gYXJlYSwgdW5kZXIgU09GVFdBUkVcV293NjQzMm5vZGUuCisjCitsb2NhbCBydWxlIHNvZnR3YXJlLXJlZ2lzdHJ5LXZhbHVlICggcGF0aCA6IGRhdGEgPyApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBmb3IgbG9jYWwgcm9vdCBpbiBIS0VZX0NVUlJFTlRfVVNFUiBIS0VZX0xPQ0FMX01BQ0hJTkUKKyAgICB7CisgICAgICAgIGZvciBsb2NhbCB4NjRlbHQgaW4gIiIgV293NjQzMm5vZGVcXCAjIEFjY291bnQgZm9yIDY0LWJpdCB3aW5kb3dzCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICEgJChyZXN1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gWyBXMzJfR0VUUkVHICQocm9vdClcXFNPRlRXQVJFXFwkKHg2NGVsdCkkKHBhdGgpIDogJChkYXRhKSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKy53aW5kb3dzLWRyaXZlLWxldHRlci1yZSA9IF4oW0EtWmEtel0pOltcXC9dKC4qKSA7CisuY3lnd2luLWRyaXZlLWxldHRlci1yZSA9IF4vY3lnZHJpdmUvKFthLXpdKS8oLiopIDsKKworLndvcmtpbmctZGlyZWN0b3J5ID0gWyBQV0QgXSA7Cisud29ya2luZy1kcml2ZS1sZXR0ZXIgPSBbIFNVQlNUICQoLndvcmtpbmctZGlyZWN0b3J5KSAkKC53aW5kb3dzLWRyaXZlLWxldHRlci1yZSkgJDEgXSA7Cisud29ya2luZy1kcml2ZS1sZXR0ZXIgPz0gWyBTVUJTVCAkKC53b3JraW5nLWRpcmVjdG9yeSkgJCguY3lnd2luLWRyaXZlLWxldHRlci1yZSkgJDEgXSA7CisKKworbG9jYWwgcnVsZSB3aW5kb3dzLXRvLWN5Z3dpbi1wYXRoICggcGF0aCApCit7CisgICAgIyBJZiBwYXRoIGlzIHJvb3RlZCB3aXRoIGEgZHJpdmUgbGV0dGVyLCByZXdyaXRlIGl0IHVzaW5nIHRoZSAvY3lnZHJpdmUKKyAgICAjIG1vdW50cG9pbnQuCisgICAgbG9jYWwgcCA9IFsgU1VCU1QgJChwYXRoOlQpICQoLndpbmRvd3MtZHJpdmUtbGV0dGVyLXJlKSAvY3lnZHJpdmUvJDEvJDIgXSA7CisKKyAgICAjIEVsc2UgaWYgcGF0aCBpcyByb290ZWQgd2l0aG91dCBhIGRyaXZlIGxldHRlciwgdXNlIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICBwID89IFsgU1VCU1QgJChwYXRoOlQpIF4vKC4qKSAvY3lnZHJpdmUvJCgud29ya2luZy1kcml2ZS1sZXR0ZXI6TCkvJDIgXSA7CisKKyAgICAjIEVsc2UgcmV0dXJuIHRoZSBwYXRoIHVuY2hhbmdlZC4KKyAgICByZXR1cm4gJChwOkU9JChwYXRoOlQpKSA7Cit9CisKKworIyA6VyBvbmx5IHdvcmtzIGluIEN5Z3dpbiBidWlsZHMgb2YgYmphbS4gIFRoaXMgb25lIHdvcmtzIG9uIE5UIGJ1aWxkcyBhcyB3ZWxsLgorIworbG9jYWwgcnVsZSBjeWd3aW4tdG8td2luZG93cy1wYXRoICggcGF0aCApCit7CisgICAgcGF0aCA9ICQocGF0aDpSPSIiKSA7ICMgc3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoCisKKyAgICBsb2NhbCBkcml2ZS1sZXR0ZXIgPSBbIFNVQlNUICQocGF0aCkgJCguY3lnd2luLWRyaXZlLWxldHRlci1yZSkgJDE6LyQyIF0gOworICAgIGlmICQoZHJpdmUtbGV0dGVyKQorICAgIHsKKyAgICAgICAgcGF0aCA9ICQoZHJpdmUtbGV0dGVyKSA7CisgICAgfQorICAgIGVsc2UgaWYgJChwYXRoOlI9L3gpID0gJChwYXRoKSAjIGFscmVhZHkgcm9vdGVkPworICAgIHsKKyAgICAgICAgIyBMb29rIGZvciBhIGN5Z3dpbiBtb3VudCB0aGF0IGluY2x1ZGVzIGVhY2ggaGVhZCBzZXF1ZW5jZSBpbiAkKHBhdGgpLgorICAgICAgICBsb2NhbCBoZWFkID0gJChwYXRoKSA7CisgICAgICAgIGxvY2FsIHRhaWwgPSAiIiA7CisKKyAgICAgICAgd2hpbGUgJChoZWFkKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCByb290ID0gWyBzb2Z0d2FyZS1yZWdpc3RyeS12YWx1ZQorICAgICAgICAgICAgICAgICJDeWdudXMgU29sdXRpb25zXFxDeWd3aW5cXG1vdW50cyB2MlxcIiQoaGVhZCkgOiBuYXRpdmUgXSA7CisKKyAgICAgICAgICAgIGlmICQocm9vdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gJCh0YWlsOlI9JChyb290KSkgOworICAgICAgICAgICAgICAgIGhlYWQgPSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YWlsID0gJCh0YWlsOlI9JChoZWFkOkQ9KSkgOworCisgICAgICAgICAgICBpZiAkKGhlYWQpID0gLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhlYWQgPSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVhZCA9ICQoaGVhZDpEKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFsgcmVnZXgucmVwbGFjZSAkKHBhdGg6Uj0iIikgLyBcXCBdIDsKK30KKworCisjIENvbnZlcnQgYSAqbml4IHBhdGggdG8gbmF0aXZlLgorIworbG9jYWwgcnVsZSAqbml4LXBhdGgtdG8tbmF0aXZlICggcGF0aCApCit7CisgICAgaWYgWyBvcy5uYW1lIF0gPSBOVAorICAgIHsKKyAgICAgICAgcGF0aCA9IFsgY3lnd2luLXRvLXdpbmRvd3MtcGF0aCAkKHBhdGgpIF0gOworICAgIH0KKyAgICByZXR1cm4gJChwYXRoKSA7Cit9CisKKworIyBDb252ZXJ0IGFuIE5UIHBhdGggdG8gbmF0aXZlLgorIworbG9jYWwgcnVsZSB3aW5kb3dzLXBhdGgtdG8tbmF0aXZlICggcGF0aCApCit7CisgICAgaWYgWyBvcy5uYW1lIF0gPSBOVAorICAgIHsKKyAgICAgICAgcmV0dXJuICQocGF0aCkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gWyB3aW5kb3dzLXRvLWN5Z3dpbi1wYXRoICQocGF0aCkgXSA7CisgICAgfQorfQorCisKKyMgUmV0dXJuIG5vbmVtcHR5IGlmIHBhdGggbG9va3MgbGlrZSBhIHdpbmRvd3MgcGF0aCwgaS5lLiBpdCBzdGFydHMgd2l0aCBhIGRyaXZlCisjIGxldHRlciBvciBjb250YWlucyBiYWNrc2xhc2hlcy4KKyMKK2xvY2FsIHJ1bGUgZ3Vlc3Mtd2luZG93cy1wYXRoICggcGF0aCApCit7CisgICAgcmV0dXJuIFsgU1VCU1QgJChwYXRoKSAoJCgud2luZG93cy1kcml2ZS1sZXR0ZXItcmUpfC4qKFtcXF0pLiopICQxIF0gOworfQorCisKK2xvY2FsIHJ1bGUgcGF0aC10by1uYXRpdmUgKCBwYXRocyAqICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworCisgICAgZm9yIGxvY2FsIHAgaW4gJChwYXRocykKKyAgICB7CisgICAgICAgIGlmIFsgZ3Vlc3Mtd2luZG93cy1wYXRoICQocCkgXQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gWyB3aW5kb3dzLXBhdGgtdG8tbmF0aXZlICQocCkgXSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gWyAqbml4LXBhdGgtdG8tbmF0aXZlICQocDpUKSBdIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIFZhbGlkYXRlIHRoZSB2ZXJzaW9uIHN0cmluZyBhbmQgZXh0cmFjdCB0aGUgbWFqb3IvbWlub3IgcGFydCB3ZSBjYXJlIGFib3V0LgorIworbG9jYWwgcnVsZSBzcGxpdC12ZXJzaW9uICggdmVyc2lvbiApCit7CisgICAgbG9jYWwgbWFqb3ItbWlub3IgPSBbIE1BVENIIF4oWzAtOV0rKVwuKFswLTldKykoLiopJCA6ICQodmVyc2lvbikgOiAxIDIgMyBdIDsKKyAgICBpZiAhICQobWFqb3ItbWlub3JbMl0pIHx8ICQobWFqb3ItbWlub3JbM10pCisgICAgeworICAgICAgICBFQ0hPICJXYXJuaW5nOiBcInVzaW5nIHB5dGhvblwiIGV4cGVjdHMgYSB0d28gcGFydCAobWFqb3IsIG1pbm9yKSB2ZXJzaW9uIG51bWJlcjsgZ290IiAkKHZlcnNpb24pIGluc3RlYWQgOworCisgICAgICAgICMgQWRkIGEgemVybyB0byBhY2NvdW50IGZvciB0aGUgbWlzc2luZyBkaWdpdCBpZiBuZWNlc3NhcnkuCisgICAgICAgIG1ham9yLW1pbm9yICs9IDAgOworICAgIH0KKworICAgIHJldHVybiAkKG1ham9yLW1pbm9yWzFdKSAkKG1ham9yLW1pbm9yWzJdKSA7Cit9CisKKworIyBCdWlsZCBhIGxpc3Qgb2YgdmVyc2lvbnMgZnJvbSAzLjAgZG93biB0byAxLjUuIEJlY2F1c2UgYmphbSBjYW4gbm90IGVudW1lcmF0ZQorIyByZWdpc3RyeSBzdWIta2V5cywgd2UgaGF2ZSBubyB3YXkgb2YgZmluZGluZyBhIHZlcnNpb24gd2l0aCBhIDItZGlnaXQgbWlub3IKKyMgdmVyc2lvbiwgZS5nLiAyLjEwIC0tIGxldCB1cyBob3BlIHRoYXQgbmV2ZXIgaGFwcGVucy4KKyMKKy52ZXJzaW9uLWNvdW50ZG93biA9IDsKK2ZvciBsb2NhbCB2IGluIFsgbnVtYmVycy5yYW5nZSAxNSAzMCBdCit7CisgICAgLnZlcnNpb24tY291bnRkb3duID0gWyBTVUJTVCAkKHYpICguKSguKikgJDEuJDIgXSAkKC52ZXJzaW9uLWNvdW50ZG93bikgOworfQorCisKK2xvY2FsIHJ1bGUgd2luZG93cy1pbnN0YWxsZWQtcHl0aG9ucyAoIHZlcnNpb24gPyApCit7CisgICAgdmVyc2lvbiA/PSAkKC52ZXJzaW9uLWNvdW50ZG93bikgOworICAgIGxvY2FsIGludGVycHJldGVycyA7CisKKyAgICBmb3IgbG9jYWwgdiBpbiAkKHZlcnNpb24pCisgICAgeworICAgICAgICBsb2NhbCBpbnN0YWxsLXBhdGggPSBbCisgICAgICAgICAgc29mdHdhcmUtcmVnaXN0cnktdmFsdWUgIlB5dGhvblxcUHl0aG9uQ29yZVxcIiQodikiXFxJbnN0YWxsUGF0aCIgXSA7CisKKyAgICAgICAgaWYgJChpbnN0YWxsLXBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluc3RhbGwtcGF0aCA9IFsgd2luZG93cy1wYXRoLXRvLW5hdGl2ZSAkKGluc3RhbGwtcGF0aCkgXSA7CisgICAgICAgICAgICBkZWJ1Zy1tZXNzYWdlIFJlZ2lzdHJ5IGluZGljYXRlcyBQeXRob24gJCh2KSBpbnN0YWxsZWQgYXQgXCIkKGluc3RhbGwtcGF0aClcIiA7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcnByZXRlcnMgKz0gJCg6RT1weXRob246Uj0kKGluc3RhbGwtcGF0aCkpIDsKKyAgICB9CisgICAgcmV0dXJuICQoaW50ZXJwcmV0ZXJzKSA7Cit9CisKKworbG9jYWwgcnVsZSBkYXJ3aW4taW5zdGFsbGVkLXB5dGhvbnMgKCB2ZXJzaW9uID8gKQoreworICAgIHZlcnNpb24gPz0gJCgudmVyc2lvbi1jb3VudGRvd24pIDsKKworICAgIGxvY2FsIHByZWZpeAorICAgICAgPSBbIEdMT0IgL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MgL0xpYnJhcnkvRnJhbWV3b3JrcworICAgICAgICAgIDogUHl0aG9uLmZyYW1ld29yayBdIDsKKworICAgIHJldHVybiAkKHByZWZpeCkvVmVyc2lvbnMvJCh2ZXJzaW9uKS9iaW4vcHl0aG9uIDsKK30KKworCisjIEFzc3VtZSAicHl0aG9uLWNtZCIgaW52b2tlcyBhIHB5dGhvbiBpbnRlcnByZXRlciBhbmQgaW52b2tlIGl0IHRvIGV4dHJhY3QgYWxsCisjIHRoZSBpbmZvcm1hdGlvbiB3ZSBjYXJlIGFib3V0IGZyb20gaXRzICJzeXMiIG1vZHVsZS4gUmV0dXJucyB2b2lkIGlmCisjIHVuc3VjY2Vzc2Z1bC4KKyMKK2xvY2FsIHJ1bGUgcHJvYmUgKCBweXRob24tY21kICkKK3sKKyAgICAjIEF2b2lkIGludm9raW5nIGEgQ3lnd2luIHN5bWxpbmsgb24gTlQuCisgICAgbG9jYWwgc2tpcC1zeW1saW5rIDsKKyAgICBpZiBbIG9zLm5hbWUgXSA9IE5UCisgICAgeworICAgICAgICBza2lwLXN5bWxpbmsgPSBbIGludm9rZXMtY3lnd2luLXN5bWxpbmsgJChweXRob24tY21kKSBdIDsKKyAgICB9CisKKyAgICBpZiAkKHNraXAtc3ltbGluaykKKyAgICB7CisgICAgICAgIGRlYnVnLW1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gOworICAgICAgICBkZWJ1Zy1tZXNzYWdlIFwiJChweXRob24tY21kKVwiIHdvdWxkIGF0dGVtcHQgdG8gaW52b2tlIGEgQ3lnd2luIHN5bWxpbmssIDsKKyAgICAgICAgZGVidWctbWVzc2FnZSBjYXVzaW5nIGEgYmphbSBidWlsdCBmb3IgV2luZG93cyB0byBoYW5nLiA7CisgICAgICAgIGRlYnVnLW1lc3NhZ2UgOworICAgICAgICBkZWJ1Zy1tZXNzYWdlIElmIHlvdSBpbnRlbmQgdG8gdGFyZ2V0IGEgQ3lnd2luIGJ1aWxkIG9mIFB5dGhvbiwgcGxlYXNlIDsKKyAgICAgICAgZGVidWctbWVzc2FnZSByZXBsYWNlIHRoZSBwYXRoIHRvIHRoZSBsaW5rIHdpdGggdGhlIHBhdGggdG8gYSByZWFsIGV4ZWN1dGFibGUgOworICAgICAgICBkZWJ1Zy1tZXNzYWdlIChndWVzc2luZzogXCIkKHNraXAtc3ltbGluaylcIikgImluIiB5b3VyICd1c2luZyBweXRob24nIGxpbmUgOworICAgICAgICBkZWJ1Zy1tZXNzYWdlICJpbiIgdXNlci1jb25maWcuamFtIG9yIHNpdGUtY29uZmlnLmphbS4gRG8gbm90IGZvcmdldCB0byBlc2NhcGUgOworICAgICAgICBkZWJ1Zy1tZXNzYWdlIGJhY2tzbGFzaGVzIDsKKyAgICAgICAgZGVidWctbWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICMgUHJlcGFyZSBhIExpc3Qgb2YgUHl0aG9uIGZvcm1hdCBzdHJpbmdzIGFuZCBleHByZXNzaW9ucyB0aGF0IGNhbiBiZQorICAgICAgICAjIHVzZWQgdG8gcHJpbnQgdGhlIGNvbnN0YW50cyB3ZSB3YW50IGZyb20gdGhlIHN5cyBtb2R1bGUuCisKKyAgICAgICAgIyBXZSBkbyBub3QgcmVhbGx5IHdhbnQgc3lzLnZlcnNpb24gc2luY2UgdGhhdCBpcyBhIGNvbXBsaWNhdGVkIHN0cmluZywKKyAgICAgICAgIyBzbyBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gc3lzLnZlcnNpb25faW5mbyBpbnN0ZWFkLgorICAgICAgICBsb2NhbCBmb3JtYXQgPSAidmVyc2lvbj0lZC4lZCIgOworICAgICAgICBsb2NhbCBleHBycyA9ICJ2ZXJzaW9uX2luZm9bMF0iICJ2ZXJzaW9uX2luZm9bMV0iIDsKKworICAgICAgICBmb3IgbG9jYWwgcyBpbiAkKHN5cy1lbGVtZW50c1syLV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcm1hdCArPSAkKHMpPSVzIDsKKyAgICAgICAgICAgIGV4cHJzICs9ICQocykgOworICAgICAgICB9CisKKyAgICAgICAgIyBJbnZva2UgUHl0aG9uIGFuZCBhc2sgaXQgZm9yIGFsbCB0aG9zZSB2YWx1ZXMuCisgICAgICAgIGxvY2FsIGZ1bGwtY21kID0KKyAgICAgICAgICAgICQocHl0aG9uLWNtZCkiIC1jIFwiZnJvbSBzeXMgaW1wb3J0ICo7IHByaW50KCciJChmb3JtYXQ6Sj1cXG4pIicgJSAoIiQoZXhwcnM6Sj0sKSIpKVwiIiA7CisKKyAgICAgICAgbG9jYWwgb3V0cHV0ID0gWyBzaGVsbC1jbWQgJChmdWxsLWNtZCkgXSA7CisgICAgICAgIGlmICQob3V0cHV0KQorICAgICAgICB7CisgICAgICAgICAgICAjIFBhcnNlIHRoZSBvdXRwdXQgdG8gZ2V0IGFsbCB0aGUgcmVzdWx0cy4KKyAgICAgICAgICAgIGxvY2FsIG5sID0gIgorCisiIDsKKyAgICAgICAgICAgIGZvciBzIGluICQoc3lzLWVsZW1lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgVGhlc2UgdmFyaWFibGVzIGFyZSBleHBlY3RlZCB0byBiZSBkZWNsYXJlZCBsb2NhbCBpbiB0aGUKKyAgICAgICAgICAgICAgICAjIGNhbGxlciwgc28gSmFtJ3MgZHluYW1pYyBzY29waW5nIHdpbGwgc2V0IHRoZWlyIHZhbHVlcyB0aGVyZS4KKyAgICAgICAgICAgICAgICBzeXMuJChzKSA9IFsgU1VCU1QgJChvdXRwdXQpIFxcPCQocyk9KFteJChubCldKykgJDEgXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQob3V0cHV0KSA7CisgICAgfQorfQorCisKKyMgTWFrZSBzdXJlIHRoZSAibGlicmFyaWVzIiBhbmQgImluY2x1ZGVzIiB2YXJpYWJsZXMgKGluIGFuIGVuY2xvc2luZyBzY29wZSkKKyMgaGF2ZSBhIHZhbHVlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBnaXZlbi4KKyMKK2xvY2FsIHJ1bGUgY29tcHV0ZS1kZWZhdWx0LXBhdGhzICggdGFyZ2V0LW9zIDogdmVyc2lvbiA/IDogcHJlZml4ID8gOgorICAgIGV4ZWMtcHJlZml4ID8gKQoreworICAgIGV4ZWMtcHJlZml4ID89ICQocHJlZml4KSA7CisKKyAgICBpZiAkKHRhcmdldC1vcykgPSB3aW5kb3dzCisgICAgeworICAgICAgICAjIFRoZSBleGVjX3ByZWZpeCBpcyB3aGVyZSB5b3UncmUgc3VwcG9zZWQgdG8gbG9vayBmb3IgbWFjaGluZS1zcGVjaWZpYworICAgICAgICAjIGxpYnJhcmllcy4KKyAgICAgICAgbG9jYWwgZGVmYXVsdC1saWJyYXJ5LXBhdGggPSAkKGV4ZWMtcHJlZml4KVxcbGlicyA7CisgICAgICAgIGxvY2FsIGRlZmF1bHQtaW5jbHVkZS1wYXRoID0gJCg6RT1JbmNsdWRlOlI9JChwcmVmaXgpKSA7CisKKyAgICAgICAgIyBJZiB0aGUgaW50ZXJwcmV0ZXIgd2FzIGZvdW5kIGluIGEgZGlyZWN0b3J5IGNhbGxlZCAiUENCdWlsZCIgb3IKKyAgICAgICAgIyAiUENCdWlsZDgsIiBhc3N1bWUgd2UncmUgbG9va2luZyBhdCBhIFB5dGhvbiBidWlsdCBmcm9tIHRoZSBzb3VyY2UKKyAgICAgICAgIyBkaXN0cm8sIGFuZCBnbyB1cCBvbmUgYWRkaXRpb25hbCBsZXZlbCB0byB0aGUgZGVmYXVsdCByb290LiBPdGhlcndpc2UsCisgICAgICAgICMgdGhlIGRlZmF1bHQgcm9vdCBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBpbnRlcnByZXRlciB3YXMgZm91bmQuCisKKyAgICAgICAgIyBXZSBhc2sgUHl0aG9uIGl0c2VsZiB3aGF0IHRoZSBleGVjdXRhYmxlIHBhdGggaXMgaW4gY2FzZSBvZgorICAgICAgICAjIGludGVybWVkaWF0ZSBzeW1saW5rcyBvciBzaGVsbCBzY3JpcHRzLgorICAgICAgICBsb2NhbCBleGVjdXRhYmxlLWRpciA9ICQoc3lzLmV4ZWN1dGFibGU6RCkgOworCisgICAgICAgIGlmIFsgTUFUQ0ggXihQQ0J1aWxkKSA6ICQoZXhlY3V0YWJsZS1kaXI6RD0pIF0KKyAgICAgICAgeworICAgICAgICAgICAgZGVidWctbWVzc2FnZSAiVGhpcyBQeXRob24gYXBwZWFycyB0byByZXNpZGUgaW4gYSBzb3VyY2UgZGlzdHJpYnV0aW9uOyIgOworICAgICAgICAgICAgZGVidWctbWVzc2FnZSAicHJlcGVuZGluZyBcIiIkKGV4ZWN1dGFibGUtZGlyKSJcIiB0byBkZWZhdWx0IGxpYnJhcnkgc2VhcmNoIHBhdGgiIDsKKworICAgICAgICAgICAgZGVmYXVsdC1saWJyYXJ5LXBhdGggPSAkKGV4ZWN1dGFibGUtZGlyKSAkKGRlZmF1bHQtbGlicmFyeS1wYXRoKSA7CisKKyAgICAgICAgICAgIGRlZmF1bHQtaW5jbHVkZS1wYXRoID0gJCg6RT1QQzpSPSQoZXhlY3V0YWJsZS1kaXI6RCkpICQoZGVmYXVsdC1pbmNsdWRlLXBhdGgpIDsKKworICAgICAgICAgICAgZGVidWctbWVzc2FnZSAiYW5kIFwiIiQoZGVmYXVsdC1pbmNsdWRlLXBhdGhbMV0pIlwiIHRvIGRlZmF1bHQgI2luY2x1ZGUgcGF0aCIgOworICAgICAgICB9CisKKyAgICAgICAgbGlicmFyaWVzID89ICQoZGVmYXVsdC1saWJyYXJ5LXBhdGgpIDsKKyAgICAgICAgaW5jbHVkZXMgPz0gJChkZWZhdWx0LWluY2x1ZGUtcGF0aCkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmNsdWRlcyA/PSAkKHByZWZpeCkvaW5jbHVkZS9weXRob24kKHZlcnNpb24pIDsKKworICAgICAgICBsb2NhbCBsaWIgPSAkKGV4ZWMtcHJlZml4KS9saWIgOworICAgICAgICBsaWJyYXJpZXMgPz0gJChsaWIpL3B5dGhvbiQodmVyc2lvbikvY29uZmlnICQobGliKSA7CisgICAgfQorfQorCisjIFRoZSB2ZXJzaW9uIG9mIHRoZSBweXRob24gaW50ZXJwcmV0ZXIgdG8gdXNlLgorZmVhdHVyZS5mZWF0dXJlIHB5dGhvbiA6IDogcHJvcGFnYXRlZCA7CitmZWF0dXJlLmZlYXR1cmUgcHl0aG9uLmludGVycHJldGVyIDogOiBmcmVlIDsKKwordG9vbHNldC5mbGFncyBweXRob24uY2FwdHVyZS1vdXRwdXQgUFlUSE9OIDogPHB5dGhvbi5pbnRlcnByZXRlcj4gOworCisjCisjIFN1cHBvcnQgZm9yIFB5dGhvbiBjb25maWd1cmVkIC0td2l0aC1weWRlYnVnCisjCitmZWF0dXJlLmZlYXR1cmUgcHl0aG9uLWRlYnVnZ2luZyA6IG9mZiBvbiA6IHByb3BhZ2F0ZWQgOworYnVpbHRpbi52YXJpYW50IGRlYnVnLXB5dGhvbiA6IGRlYnVnIDogPHB5dGhvbi1kZWJ1Z2dpbmc+b24gOworCisKKyMgUmV0dXJuIGEgbGlzdCBvZiBjYW5kaWRhdGUgY29tbWFuZHMgdG8gdHJ5IHdoZW4gbG9va2luZyBmb3IgYSBQeXRob24KKyMgaW50ZXJwcmV0ZXIuIHByZWZpeCBpcyBleHBlY3RlZCB0byBiZSBhIG5hdGl2ZSBwYXRoLgorIworbG9jYWwgcnVsZSBjYW5kaWRhdGUtaW50ZXJwcmV0ZXJzICggdmVyc2lvbiA/IDogcHJlZml4ID8gOiB0YXJnZXQtb3MgKQoreworICAgIGxvY2FsIGJpbi1wYXRoID0gYmluIDsKKyAgICBpZiAkKHRhcmdldC1vcykgPSB3aW5kb3dzCisgICAgeworICAgICAgICAjIE9uIFdpbmRvd3MsIGxvb2sgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGl0c2VsZiBhbmQsIHRvIHdvcmsgd2l0aCB0aGUKKyAgICAgICAgIyByZXN1bHQgb2YgYSBidWlsZC1mcm9tLXNvdXJjZSwgdGhlIFBDQnVpbGQgZGlyZWN0b3J5LgorICAgICAgICBiaW4tcGF0aCA9IFBDQnVpbGQ4IFBDQnVpbGQgIiIgOworICAgIH0KKworICAgIGJpbi1wYXRoID0gJChiaW4tcGF0aDpSPSQocHJlZml4KSkgOworCisgICAgaWYgJCh0YXJnZXQtb3MpIGluIHdpbmRvd3MgZGFyd2luCisgICAgeworICAgICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2VhcmNoOgorICAgICAgICAgICAgJCg6RT1weXRob246Uj0kKGJpbi1wYXRoKSkgICAgICAgICAgICAgICAgICAgICMgICBSZWxhdGl2ZSB0byB0aGUgcHJlZml4LCBpZiBhbnkKKyAgICAgICAgICAgIHB5dGhvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgSW4gdGhlIFBBVEgKKyAgICAgICAgICAgIFsgJCh0YXJnZXQtb3MpLWluc3RhbGxlZC1weXRob25zICQodmVyc2lvbikgXSAjICAgU3RhbmRhcmQgaW5zdGFsbCBsb2NhdGlvbnMKKyAgICAgICAgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAjIFNlYXJjaCByZWxhdGl2ZSB0byB0aGUgcHJlZml4LCBvciBpZiBub25lIHN1cHBsaWVkLCBpbiBQQVRILgorICAgICAgICBsb2NhbCB1bnZlcnNpb25lZCA9ICQoOkU9cHl0aG9uOlI9JChiaW4tcGF0aDpFPSkpIDsKKworICAgICAgICAjIElmIGEgdmVyc2lvbiB3YXMgc3BlY2lmaWVkLCBsb29rIGZvciBhIHB5dGhvbiB3aXRoIHRoYXQgc3BlY2lmaWMKKyAgICAgICAgIyB2ZXJzaW9uIGFwcGVuZGVkIGJlZm9yZSBsb29raW5nIGZvciBvbmUgY2FsbGVkLCBzaW1wbHksICJweXRob24iCisgICAgICAgIHJldHVybiAkKHVudmVyc2lvbmVkKSQodmVyc2lvbikgJCh1bnZlcnNpb25lZCkgOworICAgIH0KK30KKworCisjIENvbXB1dGUgc3lzdGVtIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGZvciB0YXJnZXRzIGxpbmtpbmcgd2l0aCBzdGF0aWMgUHl0aG9uCisjIGxpYnJhcmllcy4KKyMKKyMgT24gbWFueSBzeXN0ZW1zLCBQeXRob24gdXNlcyBsaWJyYXJpZXMgc3VjaCBhcyBwdGhyZWFkcyBvciBsaWJkbC4gU2luY2Ugc3RhdGljCisjIGxpYnJhcmllcyBjYXJyeSBubyBsaWJyYXJ5IGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gb2YgdGhlaXIgb3duIHRoYXQgdGhlIGxpbmtlcgorIyBjYW4gZXh0cmFjdCwgdGhlc2UgZXh0cmEgZGVwZW5kZW5jaWVzIGhhdmUgdG8gYmUgZ2l2ZW4gZXhwbGljaXRseSBvbiB0aGUgbGluaworIyBsaW5lIG9mIHRoZSBjbGllbnQuICBUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgZGVwZW5kZW5jaWVzIGlzIHBhY2thZ2VkIGludG8KKyMgdGhlICJweXRob24iIHRhcmdldCBiZWxvdy4KKyMKKyMgRXZlbiB3aGVyZSBQeXRob24gaXRzZWxmIHVzZXMgcHRocmVhZHMsIGl0IG5ldmVyIGFsbG93cyBleHRlbnNpb24gbW9kdWxlcyB0bworIyBiZSBlbnRlcmVkIGNvbmN1cnJlbnRseSAodW5sZXNzIHRoZXkgZXhwbGljaXRseSBnaXZlIHVwIHRoZSBpbnRlcnByZXRlciBsb2NrKS4KKyMgVGhlcmVmb3JlLCBleHRlbnNpb24gbW9kdWxlcyBkbyBub3QgbmVlZCB0aGUgZWZmaWNpZW5jeSBvdmVyaGVhZCBvZiB0aHJlYWRzYWZlCisjIGNvZGUgYXMgcHJvZHVjZWQgYnkgPHRocmVhZGluZz5tdWx0aSwgYW5kIHdlIGhhbmRsZSBsaWJwdGhyZWFkIGFsb25nIHdpdGgKKyMgb3RoZXIgbGlicmFyaWVzIGhlcmUuIE5vdGU6IHRoaXMgb3B0aW1pemF0aW9uIGlzIGJhc2VkIG9uIGFuIGFzc3VtcHRpb24gdGhhdAorIyB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIGxpbmstY29tcGF0aWJsZSBjb2RlIGluIGJvdGggdGhlIHNpbmdsZS0gYW5kCisjIG11bHRpLXRocmVhZGVkIGNhc2VzLCBhbmQgdGhhdCBzeXN0ZW0gbGlicmFyaWVzIGRvIG5vdCBjaGFuZ2UgdGhlaXIgQUJJcworIyBlaXRoZXIuCisjCisjIFJldHVybnMgYSBsaXN0IG9mIHVzYWdlLXJlcXVpcmVtZW50cyB0aGF0IGxpbmsgdG8gdGhlIG5lY2Vzc2FyeSBzeXN0ZW0KKyMgbGlicmFyaWVzLgorIworbG9jYWwgcnVsZSBzeXN0ZW0tbGlicmFyeS1kZXBlbmRlbmNpZXMgKCB0YXJnZXQtb3MgKQoreworICAgIHN3aXRjaCAkKHRhcmdldC1vcykKKyAgICB7CisgICAgICAgIGNhc2Ugc1t1b11bbmxdKiA6ICMgc29sYXJpcywgc3VuLCBzdW5vcworICAgICAgICAgICAgIyBBZGQgYSBsaWJydCBkZXBlbmRlbmN5IGZvciB0aGUgZ2NjIHRvb2xzZXQgb24gU3VuT1MgKHRoZSBzdW4KKyAgICAgICAgICAgICMgdG9vbHNldCBhZGRzIC1scnQgdW5jb25kaXRpb25hbGx5KS4gV2hpbGUgdGhpcyBhcHBlYXJzIHRvCisgICAgICAgICAgICAjIGR1cGxpY2F0ZSB0aGUgbG9naWMgYWxyZWFkeSBpbiBnY2MuamFtLCBpdCBkb2VzIG5vdCBhcyBsb25nIGFzCisgICAgICAgICAgICAjIHdlIGFyZSBub3QgZm9yY2luZyA8dGhyZWFkaW5nPm11bHRpLgorCisgICAgICAgICAgICAjIE9uIHNvbGFyaXMgMTAsIGRpc3R1dGlscy5zeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0xJQlMnKSB5aWVsZHMKKyAgICAgICAgICAgICMgJy1scmVzb2x2IC1sc29ja2V0IC1sbnNsIC1scnQgLWxkbCcuIEhvd2V2ZXIsIHRoYXQgZG9lcyBub3Qgc2VlbQorICAgICAgICAgICAgIyB0byBiZSB0aGUgcmlnaHQgbGlzdCBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMuIEZvciBleGFtcGxlLCBvbiBteQorICAgICAgICAgICAgIyBpbnN0YWxsYXRpb24sIGFkZGluZyAtbGRsIGNhdXNlcyBhdCBsZWFzdCBvbmUgdGVzdCB0byBmYWlsIGJlY2F1c2UKKyAgICAgICAgICAgICMgdGhlIGxpYnJhcnkgY2FuIG5vdCBiZSBmb3VuZCBhbmQgcmVtb3ZpbmcgaXQgY2F1c2VzIG5vIGZhaWx1cmVzLgorCisgICAgICAgICAgICAjIEFwcGFyZW50bHksIHRob3VnaCwgd2UgbmVlZCB0byBhZGQgLWxydCBmb3IgZ2NjLgorICAgICAgICAgICAgcmV0dXJuIDx0b29sc2V0PmdjYzo8bGlicmFyeT5ydCA7CisKKyAgICAgICAgY2FzZSBvc2YgOiByZXR1cm4gIDxsaWJyYXJ5PnB0aHJlYWQgPHRvb2xzZXQ+Z2NjOjxsaWJyYXJ5PnJ0IDsKKworICAgICAgICBjYXNlIHFueCogOiByZXR1cm4gOworICAgICAgICBjYXNlIGRhcndpbiA6IHJldHVybiA7CisgICAgICAgIGNhc2Ugd2luZG93cyA6IHJldHVybiA7CisKKyAgICAgICAgY2FzZSBocHV4IDogcmV0dXJuICA8bGlicmFyeT5ydCA7CisgICAgICAgIGNhc2UgKmJzZCA6IHJldHVybiAgPGxpYnJhcnk+cHRocmVhZCA8dG9vbHNldD5nY2M6PGxpYnJhcnk+dXRpbCA7CisKKyAgICAgICAgY2FzZSBhaXggOiByZXR1cm4gIDxsaWJyYXJ5PnB0aHJlYWQgPGxpYnJhcnk+ZGwgOworCisgICAgICAgIGNhc2UgKiA6IHJldHVybiAgPGxpYnJhcnk+cHRocmVhZCA8bGlicmFyeT5kbAorICAgICAgICAgICAgPHRvb2xzZXQ+Z2NjOjxsaWJyYXJ5PnV0aWwgPHRvb2xzZXQtaW50ZWw6cGxhdGZvcm0+bGludXg6PGxpYnJhcnk+dXRpbCA7CisgICAgfQorfQorCisKKyMgRGVjbGFyZSBhIHRhcmdldCB0byByZXByZXNlbnQgUHl0aG9uJ3MgbGlicmFyeS4KKyMKK2xvY2FsIHJ1bGUgZGVjbGFyZS1saWJweXRob24tdGFyZ2V0ICggdmVyc2lvbiA/IDogcmVxdWlyZW1lbnRzICogKQoreworICAgICMgQ29tcHV0ZSB0aGUgcmVwcmVzZW50YXRpb24gb2YgUHl0aG9uIHZlcnNpb24gaW4gdGhlIG5hbWUgb2YgUHl0aG9uJ3MKKyAgICAjIGxpYnJhcnkgZmlsZS4KKyAgICBsb2NhbCBsaWItdmVyc2lvbiA9ICQodmVyc2lvbikgOworICAgIGlmIDx0YXJnZXQtb3M+d2luZG93cyBpbiAkKHJlcXVpcmVtZW50cykKKyAgICB7CisgICAgICAgIGxvY2FsIG1ham9yLW1pbm9yID0gWyBzcGxpdC12ZXJzaW9uICQodmVyc2lvbikgXSA7CisgICAgICAgIGxpYi12ZXJzaW9uID0gJChtYWpvci1taW5vcjpKPSIiKSA7CisgICAgICAgIGlmIDxweXRob24tZGVidWdnaW5nPm9uIGluICQocmVxdWlyZW1lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBsaWItdmVyc2lvbiA9ICQobGliLXZlcnNpb24pX2QgOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgISAkKGxpYi12ZXJzaW9uKQorICAgIHsKKyAgICAgICAgRUNITyAqKiogd2FybmluZzogY291bGQgbm90IGRldGVybWluZSBQeXRob24gdmVyc2lvbiwgd2hpY2ggd2lsbCA7CisgICAgICAgIEVDSE8gKioqIHdhcm5pbmc6IHByb2JhYmx5IHByZXZlbnQgdXMgZnJvbSBsaW5raW5nIHdpdGggdGhlIHB5dGhvbiA7CisgICAgICAgIEVDSE8gKioqIHdhcm5pbmc6IGxpYnJhcnkuICBDb25zaWRlciBleHBsaWNpdGx5IHBhc3NpbmcgdGhlIHZlcnNpb24gOworICAgICAgICBFQ0hPICoqKiB3YXJuaW5nOiB0byAndXNpbmcgcHl0aG9uJy4gOworICAgIH0KKworICAgICMgRGVjbGFyZSBpdC4KKyAgICBsaWIgcHl0aG9uLmxpYiA6IDogPG5hbWU+cHl0aG9uJChsaWItdmVyc2lvbikgJChyZXF1aXJlbWVudHMpIDsKK30KKworCisjIEltcGxlbWVudGF0aW9uIG9mIGluaXQuCitsb2NhbCBydWxlIGNvbmZpZ3VyZSAoIHZlcnNpb24gPyA6IGNtZC1vci1wcmVmaXggPyA6IGluY2x1ZGVzICogOiBsaWJyYXJpZXMgPyA6CisgICAgY29uZGl0aW9uICogOiBleHRlbnNpb24tc3VmZml4ID8gKQoreworICAgIGxvY2FsIHByZWZpeCA7CisgICAgbG9jYWwgZXhlYy1wcmVmaXggOworICAgIGxvY2FsIGNtZHMtdG8tdHJ5IDsKKyAgICBsb2NhbCBpbnRlcnByZXRlci1jbWQgOworCisgICAgbG9jYWwgdGFyZ2V0LW9zID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgdGFyZ2V0LW9zIDogJChjb25kaXRpb24pIF0gOworICAgIHRhcmdldC1vcyA/PSBbIGZlYXR1cmUuZGVmYXVsdHMgdGFyZ2V0LW9zIF0gOworICAgIHRhcmdldC1vcyA9ICQodGFyZ2V0LW9zOkc9KSA7CisKKyAgICBpZiAkKHRhcmdldC1vcykgPSB3aW5kb3dzICYmIDxweXRob24tZGVidWdnaW5nPm9uIGluICQoY29uZGl0aW9uKQorICAgIHsKKyAgICAgICAgZXh0ZW5zaW9uLXN1ZmZpeCA/PSBfZCA7CisgICAgfQorICAgIGV4dGVuc2lvbi1zdWZmaXggPz0gIiIgOworCisgICAgIyBOb3JtYWxpemUgYW5kIGRpc3NlY3QgYW55IHZlcnNpb24gbnVtYmVyLgorICAgIGxvY2FsIG1ham9yLW1pbm9yIDsKKyAgICBpZiAkKHZlcnNpb24pCisgICAgeworICAgICAgICBtYWpvci1taW5vciA9IFsgc3BsaXQtdmVyc2lvbiAkKHZlcnNpb24pIF0gOworICAgICAgICB2ZXJzaW9uID0gJChtYWpvci1taW5vcjpKPS4pIDsKKyAgICB9CisKKyAgICBsb2NhbCBjbWRzLXRvLXRyeSA7CisKKyAgICBpZiAhICQoY21kLW9yLXByZWZpeCkgfHwgWyBHTE9CICQoY21kLW9yLXByZWZpeCkgOiAqIF0KKyAgICB7CisgICAgICAgICMgSWYgdGhlIHVzZXIgZGlkIG5vdCBwYXNzIGEgY29tbWFuZCwgd2hhdGV2ZXIgd2UgZ290IHdhcyBhIHByZWZpeC4KKyAgICAgICAgcHJlZml4ID0gJChjbWQtb3ItcHJlZml4KSA7CisgICAgICAgIGNtZHMtdG8tdHJ5ID0gWyBjYW5kaWRhdGUtaW50ZXJwcmV0ZXJzICQodmVyc2lvbikgOiAkKHByZWZpeCkgOiAkKHRhcmdldC1vcykgXSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICMgV29yayB3aXRoIHRoZSBjb21tYW5kIHRoZSB1c2VyIGdhdmUgdXMuCisgICAgICAgIGNtZHMtdG8tdHJ5ID0gJChjbWQtb3ItcHJlZml4KSA7CisKKyAgICAgICAgIyBPbiBXaW5kb3dzLCBkbyBub3QgbmFpbCBkb3duIHRoZSBpbnRlcnByZXRlciBjb21tYW5kIGp1c3QgeWV0IGluIGNhc2UKKyAgICAgICAgIyB0aGUgdXNlciBzcGVjaWZpZWQgc29tZXRoaW5nIHRoYXQgdHVybnMgb3V0IHRvIGJlIGEgY3lnd2luIHN5bWxpbmssCisgICAgICAgICMgd2hpY2ggY291bGQgYnJpbmcgZG93biBiamFtIGlmIHdlIGludm9rZSBpdC4KKyAgICAgICAgaWYgJCh0YXJnZXQtb3MpICE9IHdpbmRvd3MKKyAgICAgICAgeworICAgICAgICAgICAgaW50ZXJwcmV0ZXItY21kID0gJChjbWQtb3ItcHJlZml4KSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFZhbHVlcyB0byB1c2UgaW4gY2FzZSB3ZSBjYW4gbm90IHJlYWxseSBmaW5kIGFueXRoaW5nIGluIHRoZSBzeXN0ZW0uCisgICAgbG9jYWwgZmFsbGJhY2stY21kID0gJChjbWRzLXRvLXRyeVsxXSkgOworICAgIGxvY2FsIGZhbGxiYWNrLXZlcnNpb24gOworCisgICAgIyBBbnl0aGluZyBsZWZ0IHRvIGZpbmQgb3IgY2hlY2s/CisgICAgaWYgISAoICQoaW50ZXJwcmV0ZXItY21kKSAmJiAkKGluY2x1ZGVzKSAmJiAkKGxpYnJhcmllcykgKQorICAgIHsKKyAgICAgICAgIyBWYWx1ZXMgdG8gYmUgZXh0cmFjdGVkIGZyb20gcHl0aG9uJ3Mgc3lzIG1vZHVsZS4gVGhlc2Ugd2lsbCBiZSBzZXQgYnkKKyAgICAgICAgIyB0aGUgcHJvYmUgcnVsZSwgYWJvdmUsIHVzaW5nIEphbSdzIGR5bmFtaWMgc2NvcGluZy4KKyAgICAgICAgbG9jYWwgc3lzLWVsZW1lbnRzID0gdmVyc2lvbiBwbGF0Zm9ybSBwcmVmaXggZXhlY19wcmVmaXggZXhlY3V0YWJsZSA7CisgICAgICAgIGxvY2FsIHN5cy4kKHN5cy1lbGVtZW50cykgOworCisgICAgICAgICMgQ29tcHV0ZSB0aGUgc3RyaW5nIFB5dGhvbidzIHN5cy5wbGF0Zm9ybSBuZWVkcyB0byBtYXRjaC4gSWYgbm90CisgICAgICAgICMgdGFyZ2V0aW5nIFdpbmRvd3Mgb3IgY3lnd2luIHdlIHdpbGwgYXNzdW1lIG9ubHkgbmF0aXZlIGJ1aWxkcyBjYW4KKyAgICAgICAgIyBwb3NzaWJseSBydW4sIHNvIHdlIHdpbGwgbm90IHJlcXVpcmUgYSBtYXRjaCBhbmQgd2UgbGVhdmUgc3lzLnBsYXRmb3JtCisgICAgICAgICMgYmxhbmsuCisgICAgICAgIGxvY2FsIHBsYXRmb3JtIDsKKyAgICAgICAgc3dpdGNoICQodGFyZ2V0LW9zKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHdpbmRvd3MgOiBwbGF0Zm9ybSA9IHdpbjMyIDsKKyAgICAgICAgICAgIGNhc2UgY3lnd2luIDogcGxhdGZvcm0gPSBjeWd3aW4gOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgJChjbWRzLXRvLXRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgIyBQb3AgdG9wIGNvbW1hbmQuCisgICAgICAgICAgICBsb2NhbCBjbWQgPSAkKGNtZHMtdG8tdHJ5WzFdKSA7CisgICAgICAgICAgICBjbWRzLXRvLXRyeSA9ICQoY21kcy10by10cnlbMi1dKSA7CisKKyAgICAgICAgICAgIGRlYnVnLW1lc3NhZ2UgQ2hlY2tpbmcgaW50ZXJwcmV0ZXIgY29tbWFuZCBcIiQoY21kKVwiLi4uIDsKKyAgICAgICAgICAgIGlmIFsgcHJvYmUgJChjbWQpIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYWxsYmFjay12ZXJzaW9uID89ICQoc3lzLnZlcnNpb24pIDsKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIHZlcnNpb24vcGxhdGZvcm0gdmFsaWRpdHkuCisgICAgICAgICAgICAgICAgZm9yIGxvY2FsIHggaW4gdmVyc2lvbiBwbGF0Zm9ybQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgJCgkKHgpKSAmJiAkKCQoeCkpICE9ICQoc3lzLiQoeCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLW1lc3NhZ2UgLi4uJCh4KSAibWlzbWF0Y2ggKGxvb2tpbmcgZm9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJCh4KSkgYnV0IGZvdW5kICQoc3lzLiQoeCkpIikiIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9IDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICQoY21kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWctbWVzc2FnZSAuLi5yZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiBtYXRjaGVkISA7CisKKyAgICAgICAgICAgICAgICAgICAgZXhlYy1wcmVmaXggPSAkKHN5cy5leGVjX3ByZWZpeCkgOworCisgICAgICAgICAgICAgICAgICAgIGNvbXB1dGUtZGVmYXVsdC1wYXRocyAkKHRhcmdldC1vcykgOiAkKHN5cy52ZXJzaW9uKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAkKHN5cy5wcmVmaXgpIDogJChzeXMuZXhlY19wcmVmaXgpIDsKKworICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJChzeXMudmVyc2lvbikgOworICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRlci1jbWQgPz0gJChjbWQpIDsKKyAgICAgICAgICAgICAgICAgICAgY21kcy10by10cnkgPSA7ICAjIEFsbCBkb25lLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWJ1Zy1tZXNzYWdlIC4uLmRvZXMgbm90IGludm9rZSBhIHdvcmtpbmcgaW50ZXJwcmV0ZXIgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgIyBBbnl0aGluZyBsZWZ0IHRvIGNvbXB1dGU/CisgICAgaWYgJChpbmNsdWRlcykgJiYgJChsaWJyYXJpZXMpCisgICAgeworICAgICAgICAuY29uZmlndXJlZCA9IHRydWUgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2ZXJzaW9uID89ICQoZmFsbGJhY2stdmVyc2lvbikgOworICAgICAgICB2ZXJzaW9uID89IDIuNSA7CisgICAgICAgIGV4ZWMtcHJlZml4ID89ICQocHJlZml4KSA7CisgICAgICAgIGNvbXB1dGUtZGVmYXVsdC1wYXRocyAkKHRhcmdldC1vcykgOiAkKHZlcnNpb24pIDogJChwcmVmaXg6RT0pIDsKKyAgICB9CisKKyAgICBpZiAhICQoaW50ZXJwcmV0ZXItY21kKQorICAgIHsKKyAgICAgICAgZmFsbGJhY2stY21kID89IHB5dGhvbiA7CisgICAgICAgIGRlYnVnLW1lc3NhZ2UgTm8gd29ya2luZyBQeXRob24gaW50ZXJwcmV0ZXIgZm91bmQuIDsKKyAgICAgICAgaWYgWyBvcy5uYW1lIF0gIT0gTlQgfHwgISBbIGludm9rZXMtY3lnd2luLXN5bWxpbmsgJChmYWxsYmFjay1jbWQpIF0KKyAgICAgICAgeworICAgICAgICAgICAgaW50ZXJwcmV0ZXItY21kID0gJChmYWxsYmFjay1jbWQpIDsKKyAgICAgICAgICAgIGRlYnVnLW1lc3NhZ2UgZmFsbGluZyBiYWNrIHRvIFwiJChpbnRlcnByZXRlci1jbWQpXCIgOworICAgICAgICB9CisgICAgfQorCisgICAgaW5jbHVkZXMgPSBbIHBhdGgtdG8tbmF0aXZlICQoaW5jbHVkZXMpIF0gOworICAgIGxpYnJhcmllcyA9IFsgcGF0aC10by1uYXRpdmUgJChsaWJyYXJpZXMpIF0gOworCisgICAgZGVidWctbWVzc2FnZSAiRGV0YWlscyBvZiB0aGlzIFB5dGhvbiBjb25maWd1cmF0aW9uOiIgOworICAgIGRlYnVnLW1lc3NhZ2UgIiAgaW50ZXJwcmV0ZXIgY29tbWFuZDoiIFwiJChpbnRlcnByZXRlci1jbWQ6RT08ZW1wdHk+KVwiIDsKKyAgICBkZWJ1Zy1tZXNzYWdlICIgIGluY2x1ZGUgcGF0aDoiIFwiJChpbmNsdWRlczpFPTxlbXB0eT4pXCIgOworICAgIGRlYnVnLW1lc3NhZ2UgIiAgbGlicmFyeSBwYXRoOiIgXCIkKGxpYnJhcmllczpFPTxlbXB0eT4pXCIgOworICAgIGlmICQodGFyZ2V0LW9zKSA9IHdpbmRvd3MKKyAgICB7CisgICAgICAgIGRlYnVnLW1lc3NhZ2UgIiAgRExMIHNlYXJjaCBwYXRoOiIgXCIkKGV4ZWMtcHJlZml4OkU9PGVtcHR5PilcIiA7CisgICAgfQorCisgICAgIworICAgICMgRW5kIGF1dG9jb25maWd1cmF0aW9uIHNlcXVlbmNlLgorICAgICMKKyAgICBsb2NhbCB0YXJnZXQtcmVxdWlyZW1lbnRzID0gJChjb25kaXRpb24pIDsKKworICAgICMgQWRkIHRoZSB2ZXJzaW9uLCBpZiBhbnksIHRvIHRoZSB0YXJnZXQgcmVxdWlyZW1lbnRzLgorICAgIGlmICQodmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmICEgJCh2ZXJzaW9uKSBpbiBbIGZlYXR1cmUudmFsdWVzIHB5dGhvbiBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGZlYXR1cmUuZXh0ZW5kIHB5dGhvbiA6ICQodmVyc2lvbikgOworICAgICAgICB9CisgICAgICAgIHRhcmdldC1yZXF1aXJlbWVudHMgKz0gPHB5dGhvbj4kKHZlcnNpb246RT1kZWZhdWx0KSA7CisgICAgfQorCisgICAgdGFyZ2V0LXJlcXVpcmVtZW50cyArPSA8dGFyZ2V0LW9zPiQodGFyZ2V0LW9zKSA7CisKKyAgICAjIFNlZSBpZiB3ZSBjYW4gZmluZCBhIGZyYW1ld29yayBkaXJlY3Rvcnkgb24gZGFyd2luLgorICAgIGxvY2FsIGZyYW1ld29yay1kaXJlY3RvcnkgOworICAgIGlmICQodGFyZ2V0LW9zKSA9IGRhcndpbgorICAgIHsKKyAgICAgICAgIyBTZWFyY2ggdXB3YXJkIGZvciB0aGUgZnJhbWV3b3JrIGRpcmVjdG9yeS4KKyAgICAgICAgbG9jYWwgZnJhbWV3b3JrLWRpcmVjdG9yeSA9ICQobGlicmFyaWVzWy0xXSkgOworICAgICAgICB3aGlsZSAkKGZyYW1ld29yay1kaXJlY3Rvcnk6RD0pICYmICQoZnJhbWV3b3JrLWRpcmVjdG9yeTpEPSkgIT0gUHl0aG9uLmZyYW1ld29yaworICAgICAgICB7CisgICAgICAgICAgICBmcmFtZXdvcmstZGlyZWN0b3J5ID0gJChmcmFtZXdvcmstZGlyZWN0b3J5OkQpIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICQoZnJhbWV3b3JrLWRpcmVjdG9yeTpEPSkgPSBQeXRob24uZnJhbWV3b3JrCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlYnVnLW1lc3NhZ2UgZnJhbWV3b3JrIGRpcmVjdG9yeSBpcyBcIiQoZnJhbWV3b3JrLWRpcmVjdG9yeSlcIiA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkZWJ1Zy1tZXNzYWdlICJubyBmcmFtZXdvcmsgZGlyZWN0b3J5IGZvdW5kOyB1c2luZyBsaWJyYXJ5IHBhdGgiIDsKKyAgICAgICAgICAgIGZyYW1ld29yay1kaXJlY3RvcnkgPSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsb2NhbCBkbGwtcGF0aCA9ICQobGlicmFyaWVzKSA7CisKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIGNhbiBmaW5kIHRoZSBQeXRob24gRExMIG9uIFdpbmRvd3MuCisgICAgaWYgKCAkKHRhcmdldC1vcykgPSB3aW5kb3dzICkgJiYgJChleGVjLXByZWZpeCkKKyAgICB7CisgICAgICAgIGRsbC1wYXRoICs9ICQoZXhlYy1wcmVmaXgpIDsKKyAgICB9CisKKyAgICAjCisgICAgIyBQcmVwYXJlIHVzYWdlIHJlcXVpcmVtZW50cy4KKyAgICAjCisgICAgbG9jYWwgdXNhZ2UtcmVxdWlyZW1lbnRzID0gWyBzeXN0ZW0tbGlicmFyeS1kZXBlbmRlbmNpZXMgJCh0YXJnZXQtb3MpIF0gOworICAgIHVzYWdlLXJlcXVpcmVtZW50cyArPSA8aW5jbHVkZT4kKGluY2x1ZGVzKSA8cHl0aG9uLmludGVycHJldGVyPiQoaW50ZXJwcmV0ZXItY21kKSA7CisgICAgaWYgPHB5dGhvbi1kZWJ1Z2dpbmc+b24gaW4gJChjb25kaXRpb24pCisgICAgeworICAgICAgICBpZiAkKHRhcmdldC1vcykgPSB3aW5kb3dzCisgICAgICAgIHsKKyAgICAgICAgICAgICMgSW4gcHljb25maWcuaCwgUHlfREVCVUcgaXMgc2V0IGlmIF9ERUJVRyBpcyBzZXQuIElmIHdlIGRlZmluZQorICAgICAgICAgICAgIyBQeV9ERUJVRyB3ZSB3aWxsIGdldCBtdWx0aXBsZSBkZWZpbml0aW9uIHdhcm5pbmdzLgorICAgICAgICAgICAgdXNhZ2UtcmVxdWlyZW1lbnRzICs9IDxkZWZpbmU+X0RFQlVHIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYWdlLXJlcXVpcmVtZW50cyArPSA8ZGVmaW5lPlB5X0RFQlVHIDsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgR2xvYmFsLCBidXQgY29uZGl0aW9uYWwsIHJlcXVpcmVtZW50cyB0byBnaXZlIGFjY2VzcyB0byB0aGUgaW50ZXJwcmV0ZXIKKyAgICAjIGZvciBnZW5lcmFsIHV0aWxpdGllcywgbGlrZSBvdGhlciB0b29sc2V0cywgdGhhdCBydW4gUHl0aG9uIHNjcmlwdHMuCisgICAgdG9vbHNldC5hZGQtcmVxdWlyZW1lbnRzCisgICAgICAgICQodGFyZ2V0LXJlcXVpcmVtZW50czpKPSwpOjxweXRob24uaW50ZXJwcmV0ZXI+JChpbnRlcnByZXRlci1jbWQpIDsKKworICAgICMgUmVnaXN0ZXIgdGhlIHJpZ2h0IHN1ZmZpeCBmb3IgZXh0ZW5zaW9ucy4KKyAgICByZWdpc3Rlci1leHRlbnNpb24tc3VmZml4ICQoZXh0ZW5zaW9uLXN1ZmZpeCkgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKworICAgICMKKyAgICAjIERlY2xhcmUgdGhlICJweXRob24iIHRhcmdldC4gVGhpcyBzaG91bGQgcmVhbGx5IGJlIGNhbGxlZAorICAgICMgcHl0aG9uX2Zvcl9lbWJlZGRpbmcuCisgICAgIworCisgICAgaWYgJChmcmFtZXdvcmstZGlyZWN0b3J5KQorICAgIHsKKyAgICAgICAgYWxpYXMgcHl0aG9uCisgICAgICAgICAgOgorICAgICAgICAgIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKQorICAgICAgICAgIDoKKyAgICAgICAgICA6ICQodXNhZ2UtcmVxdWlyZW1lbnRzKSA8ZnJhbWV3b3JrPiQoZnJhbWV3b3JrLWRpcmVjdG9yeSkKKyAgICAgICAgICA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRlY2xhcmUtbGlicHl0aG9uLXRhcmdldCAkKHZlcnNpb24pIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisKKyAgICAgICAgIyBUaGlzIGlzIGFuIGV2aWwgaGFjay4gIE9uLCBXaW5kb3dzLCB3aGVuIFB5dGhvbiBpcyBlbWJlZGRlZCwgbm90aGluZworICAgICAgICAjIHNlZW1zIHRvIHNldCB1cCBzeXMucGF0aCB0byBpbmNsdWRlIFB5dGhvbidzIHN0YW5kYXJkIGxpYnJhcnkKKyAgICAgICAgIyAoaHR0cDovL2FydGljbGUuZ21hbmUub3JnL2dtYW5lLmNvbXAucHl0aG9uLmdlbmVyYWwvNTQ0OTg2KS4gVGhlIGV2aWwKKyAgICAgICAgIyBoZXJlLCBhc2lkZSBmcm9tIHRoZSB3b3JrYXJvdW5kIG5lY2Vzc2l0YXRlZCBieSBQeXRob24ncyBidWcsIGlzIHRoYXQ6CisgICAgICAgICMKKyAgICAgICAgIyBhLiB3ZSdyZSBndWVzc2luZyB0aGUgbG9jYXRpb24gb2YgdGhlIHB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5IGZyb20gdGhlCisgICAgICAgICMgICAgbG9jYXRpb24gb2YgcHl0aG9uWFgubGliCisgICAgICAgICMKKyAgICAgICAgIyBiLiB3ZSdyZSBoaWphY2tpbmcgdGhlIDx0ZXN0aW5nLmxhdW5jaGVyPiBwcm9wZXJ0eSB0byBnZXQgdGhlCisgICAgICAgICMgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IHVwLCBhbmQgdGhlIHVzZXIgbWF5IHdhbnQgdG8gdXNlIGl0IGZvcgorICAgICAgICAjICAgIHNvbWV0aGluZyBlbHNlIChlLmcuIGxhdW5jaCB0aGUgZGVidWdnZXIpLgorICAgICAgICBsb2NhbCBzZXQtUFlUSE9OUEFUSCA7CisgICAgICAgIGlmICQodGFyZ2V0LW9zKSA9IHdpbmRvd3MKKyAgICAgICAgeworICAgICAgICAgICAgc2V0LVBZVEhPTlBBVEggPSBbIGNvbW1vbi5wcmVwZW5kLXBhdGgtdmFyaWFibGUtY29tbWFuZCBQWVRIT05QQVRIIDoKKyAgICAgICAgICAgICAgICAkKGxpYnJhcmllczpEKS9MaWIgXSA7CisgICAgICAgIH0KKworICAgICAgICBhbGlhcyBweXRob24KKyAgICAgICAgICA6CisgICAgICAgICAgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpCisgICAgICAgICAgOgorICAgICAgICAgICAgIyBXaHkgcHl0aG9uLmxpYiBtdXN0IGJlIGxpc3RlZCBoZXJlIGluc3RlYWQgb2YgYWxvbmcgd2l0aCB0aGUKKyAgICAgICAgICAgICMgc3lzdGVtIGxpYnMgaXMgYSBteXN0ZXJ5LCBidXQgaWYgd2UgZG8gbm90IGRvIGl0LCBvbiBjeWd3aW4sCisgICAgICAgICAgICAjIC1scHl0aG9uWC5ZIG5ldmVyIGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZSAoYWx0aG91Z2ggaXQgZG9lcyBvbgorICAgICAgICAgICAgIyBsaW51eCkuCisgICAgICAgICAgOiAkKHVzYWdlLXJlcXVpcmVtZW50cykKKyAgICAgICAgICAgIDx0ZXN0aW5nLmxhdW5jaGVyPiQoc2V0LVBZVEhPTlBBVEgpCisgICAgICAgICAgICAgIDxsaWJyYXJ5LXBhdGg+JChsaWJyYXJpZXMpIDxsaWJyYXJ5PnB5dGhvbi5saWIKKyAgICAgICAgICA7CisgICAgfQorCisgICAgIyBPbiAqbml4LCB3ZSBkbyBub3Qgd2FudCB0byBsaW5rIGVpdGhlciBCb29zdC5QeXRob24gb3IgUHl0aG9uIGV4dGVuc2lvbnMKKyAgICAjIHRvIGxpYnB5dGhvbiwgYmVjYXVzZSB0aGUgUHl0aG9uIGludGVycHJldGVyIGl0c2VsZiBwcm92aWRlcyBhbGwgdGhvc2UKKyAgICAjIHN5bWJvbHMuIElmIHdlIGxpbmtlZCB0byBsaWJweXRob24sIHdlIHdvdWxkIGdldCBkdXBsaWNhdGUgc3ltYm9scy4gU28KKyAgICAjIGRlY2xhcmUgdHdvIHRhcmdldHMgLS0gb25lIGZvciBidWlsZGluZyBleHRlbnNpb25zIGFuZCBhbm90aGVyIGZvcgorICAgICMgZW1iZWRkaW5nLgorICAgICMKKyAgICAjIFVubGlrZSBtb3N0ICpuaXggc3lzdGVtcywgTWFjIE9TIFgncyBsaW5rZXIgZG9lcyBub3QgcGVybWl0IHVuZGVmaW5lZAorICAgICMgc3ltYm9scyB3aGVuIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4gU28sIHdlIHN0aWxsIG5lZWQgdG8gbGluayBhZ2FpbnN0CisgICAgIyB0aGUgUHl0aG9uIGZyYW1ld29yaywgZXZlbiB3aGVuIGJ1aWxkaW5nIGV4dGVuc2lvbnMuIE5vdGUgdGhhdCBmcmFtZXdvcmsKKyAgICAjIGJ1aWxkcyBvZiBQeXRob24gYWx3YXlzIHVzZSBzaGFyZWQgbGlicmFyaWVzLCBzbyB3ZSBkbyBub3QgbmVlZCB0byB3b3JyeQorICAgICMgYWJvdXQgZHVwbGljYXRlIFB5dGhvbiBzeW1ib2xzLgorICAgIGlmICQodGFyZ2V0LW9zKSBpbiB3aW5kb3dzIGN5Z3dpbiBkYXJ3aW4KKyAgICB7CisgICAgICAgIGFsaWFzIHB5dGhvbl9mb3JfZXh0ZW5zaW9ucyA6IHB5dGhvbiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworICAgIH0KKyAgICAjIE9uIEFJWCB3ZSBuZWVkIFB5dGhvbiBleHRlbnNpb25zIGFuZCBCb29zdC5QeXRob24gdG8gaW1wb3J0IHN5bWJvbHMgZnJvbQorICAgICMgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4gRHluYW1pYyBsaWJyYXJpZXMgb3BlbmVkIHdpdGggZGxvcGVuKCkgZG8gbm90CisgICAgIyBpbmhlcml0IHRoZSBzeW1ib2xzIGZyb20gdGhlIFB5dGhvbiBpbnRlcnByZXRlci4KKyAgICBlbHNlIGlmICQodGFyZ2V0LW9zKSA9IGFpeAorICAgIHsKKyAgICAgICAgYWxpYXMgcHl0aG9uX2Zvcl9leHRlbnNpb25zCisgICAgICAgICAgICA6CisgICAgICAgICAgICA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIDogJCh1c2FnZS1yZXF1aXJlbWVudHMpIDxsaW5rZmxhZ3M+LVdsLC1iSTokKGxpYnJhcmllc1sxXSkvcHl0aG9uLmV4cAorICAgICAgICAgICAgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhbGlhcyBweXRob25fZm9yX2V4dGVuc2lvbnMKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgOgorICAgICAgICAgICAgOiAkKHVzYWdlLXJlcXVpcmVtZW50cykKKyAgICAgICAgICAgIDsKKyAgICB9Cit9CisKKworcnVsZSBjb25maWd1cmVkICggKQoreworICAgICByZXR1cm4gJCguY29uZmlndXJlZCkgOworfQorCisKK3R5cGUucmVnaXN0ZXIgUFlUSE9OX0VYVEVOU0lPTiA6IDogU0hBUkVEX0xJQiA7CisKKworbG9jYWwgcnVsZSByZWdpc3Rlci1leHRlbnNpb24tc3VmZml4ICggcm9vdCA6IGNvbmRpdGlvbiAqICkKK3sKKyAgICBsb2NhbCBzdWZmaXggOworCisgICAgc3dpdGNoIFsgZmVhdHVyZS5nZXQtdmFsdWVzIHRhcmdldC1vcyA6ICQoY29uZGl0aW9uKSBdCisgICAgeworICAgICAgICBjYXNlIHdpbmRvd3MgOiBzdWZmaXggPSBweWQgOworICAgICAgICBjYXNlIGN5Z3dpbiA6IHN1ZmZpeCA9IGRsbCA7CisgICAgICAgIGNhc2UgaHB1eCA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIFsgZmVhdHVyZS5nZXQtdmFsdWVzIHB5dGhvbiA6ICQoY29uZGl0aW9uKSBdIGluIDEuNSAxLjYgMi4wIDIuMSAyLjIgMi4zIDIuNAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHNsIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdWZmaXggPSBzbyA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAqIDogc3VmZml4ID0gc28gOworICAgIH0KKworICAgIHR5cGUuc2V0LWdlbmVyYXRlZC10YXJnZXQtc3VmZml4IFBZVEhPTl9FWFRFTlNJT04gOiAkKGNvbmRpdGlvbikgOiA8JChyb290KS4kKHN1ZmZpeCk+IDsKK30KKworCisjIFVuc2V0ICdsaWInIHByZWZpeCBmb3IgUFlUSE9OX0VYVEVOU0lPTgordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1wcmVmaXggUFlUSE9OX0VYVEVOU0lPTiA6IDogIiIgOworCisKK3J1bGUgcHl0aG9uLWV4dGVuc2lvbiAoIG5hbWUgOiBzb3VyY2VzICogOiByZXF1aXJlbWVudHMgKiA6IGRlZmF1bHQtYnVpbGQgKiA6CisgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZS1yZXF1aXJlbWVudHMgKiApCit7CisgICAgaWYgWyBjb25maWd1cmVkIF0KKyAgICB7CisgICAgICAgIHJlcXVpcmVtZW50cyArPSA8dXNlPi9weXRob24vL3B5dGhvbl9mb3JfZXh0ZW5zaW9ucyA7CisgICAgfQorICAgIHJlcXVpcmVtZW50cyArPSA8c3VwcHJlc3MtaW1wb3J0LWxpYj50cnVlIDsKKworICAgIGxvY2FsIHByb2plY3QgPSBbIHByb2plY3QuY3VycmVudCBdIDsKKworICAgIHRhcmdldHMubWFpbi10YXJnZXQtYWx0ZXJuYXRpdmUKKyAgICAgICAgWyBuZXcgdHlwZWQtdGFyZ2V0ICQobmFtZSkgOiAkKHByb2plY3QpIDogUFlUSE9OX0VYVEVOU0lPTgorICAgICAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtc291cmNlcyAkKHNvdXJjZXMpIDogJChuYW1lKSBdCisgICAgICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1yZXF1aXJlbWVudHMgJChyZXF1aXJlbWVudHMpIDogJChwcm9qZWN0KSBdCisgICAgICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1kZWZhdWx0LWJ1aWxkICQoZGVmYXVsdC1idWlsZCkgOiAkKHByb2plY3QpIF0KKyAgICAgICAgXSA7Cit9CisKK0lNUE9SVCBweXRob24gOiBweXRob24tZXh0ZW5zaW9uIDogOiBweXRob24tZXh0ZW5zaW9uIDsKKworcnVsZSBweTJ0bzMKK3sKKyAgICBjb21tb24uY29weSAkKD4pICQoPCkgOworICAgIDJ0bzMgJCg8KSA7Cit9CisKK2FjdGlvbnMgMnRvMworeworICAgIDJ0bzMgLXduICIkKDwpIgorICAgIDJ0bzMgLWR3biAiJCg8KSIKK30KKworCisjIFN1cHBvcnQgZm9yIHRlc3RpbmcuCit0eXBlLnJlZ2lzdGVyIFBZIDogcHkgOwordHlwZS5yZWdpc3RlciBSVU5fUFlEX09VVFBVVCA7Cit0eXBlLnJlZ2lzdGVyIFJVTl9QWUQgOiA6IFRFU1QgOworCisKK2NsYXNzIHB5dGhvbi10ZXN0LWdlbmVyYXRvciA6IGdlbmVyYXRvcgoreworICAgIGltcG9ydCBzZXQgOworCisgICAgcnVsZSBfX2luaXRfXyAoICogOiAqICkKKyAgICB7CisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOworICAgICAgICBzZWxmLmNvbXBvc2luZyA9IHRydWUgOworICAgIH0KKworICAgIHJ1bGUgcnVuICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICogOiBtdWx0aXBsZSA/ICkKKyAgICB7CisgICAgICAgIGxvY2FsIHB5dmVyc2lvbiA9IFsgJChwcm9wZXJ0eS1zZXQpLmdldCA8cHl0aG9uPiBdIDsKKyAgICAgICAgbG9jYWwgcHl0aG9uIDsKKyAgICAgICAgbG9jYWwgb3RoZXItcHl0aG9ucyA7CisKKyAgICAgICAgIyBNYWtlIG5ldyB0YXJnZXQgdGhhdCBjb252ZXJ0aW5nIFB5dGhvbiBzb3VyY2UgYnkgMnRvMyB3aGVuIHJ1bm5pbmcgd2l0aCBQeXRob24gMy4KKyAgICAgICAgbG9jYWwgcnVsZSBtYWtlLTJ0bzMtc291cmNlICggc291cmNlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJChweXZlcnNpb24pID49IDMuMAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsIGEgPSBbIG5ldyBhY3Rpb24gJChzb3VyY2UpIDogcHl0aG9uLnB5MnRvMyA6ICQocHJvcGVydHktc2V0KSBdIDsKKyAgICAgICAgICAgICAgICBsb2NhbCB0ID0gIFsgdXRpbGl0eS5iYXNlbmFtZSBbICQocykubmFtZSBdIF0gOworICAgICAgICAgICAgICAgIGxvY2FsIHAgPSBbIG5ldyBmaWxlLXRhcmdldCAkKHQpIDogUFkgOiAkKHByb2plY3QpIDogJChhKSBdIDsKKyAgICAgICAgICAgICAgICByZXR1cm4gJChwKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICQoc291cmNlKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgbG9jYWwgcyBpbiAkKHNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIFsgJChzKS50eXBlIF0gPSBQWQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICEgJChweXRob24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjIEZpcnN0IFB5dGhvbiBzb3VyY2UgZW5kcyB1cCBvbiBjb21tYW5kIGxpbmUuCisgICAgICAgICAgICAgICAgICAgIHB5dGhvbiA9IFsgbWFrZS0ydG8zLXNvdXJjZSAkKHMpIF0gOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICMgT3RoZXIgUHl0aG9uIHNvdXJjZXMgYmVjb21lIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgICAgICAgICAgb3RoZXItcHl0aG9ucyArPSBbIG1ha2UtMnRvMy1zb3VyY2UgJChzKSBdIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb2NhbCBleHRlbnNpb25zIDsKKyAgICAgICAgZm9yIGxvY2FsIHMgaW4gJChzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiBbICQocykudHlwZSBdID0gUFlUSE9OX0VYVEVOU0lPTgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgKz0gJChzKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb2NhbCBsaWJzIDsKKyAgICAgICAgZm9yIGxvY2FsIHMgaW4gJChzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiBbIHR5cGUuaXMtZGVyaXZlZCBbICQocykudHlwZSBdIExJQiBdCisgICAgICAgICAgICAgICYmICEgJChzKSBpbiAkKGV4dGVuc2lvbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlicyArPSAkKHMpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIG5ldy1zb3VyY2VzIDsKKyAgICAgICAgZm9yIGxvY2FsIHMgaW4gJChzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiBbIHR5cGUuaXMtZGVyaXZlZCBbICQocykudHlwZSBdIENQUCBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWwgbmFtZSA9IFsgdXRpbGl0eS5iYXNlbmFtZSBbICQocykubmFtZSBdIF0gOworICAgICAgICAgICAgICAgIGlmICQobmFtZSkgPSBbIHV0aWxpdHkuYmFzZW5hbWUgWyAkKHB5dGhvbikubmFtZSBdIF0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAkKG5hbWUpX2V4dCA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvY2FsIGV4dGVuc2lvbiA9IFsgZ2VuZXJhdG9ycy5jb25zdHJ1Y3QgJChwcm9qZWN0KSAkKG5hbWUpIDoKKyAgICAgICAgICAgICAgICAgIFBZVEhPTl9FWFRFTlNJT04gOiAkKHByb3BlcnR5LXNldCkgOiAkKHMpICQobGlicykgXSA7CisKKyAgICAgICAgICAgICAgICAjIFRoZSBpbXBvcnRhbnQgcGFydCBvZiB1c2FnZSByZXF1aXJlbWVudHMgcmV0dXJuZWQgZnJvbQorICAgICAgICAgICAgICAgICMgUFlUSE9OX0VYVEVOU0lPTiBnZW5lcmF0b3IgYXJlIHhkbGwtcGF0aCBwcm9wZXJ0aWVzIHRoYXQgd2lsbAorICAgICAgICAgICAgICAgICMgYWxsb3cgdXMgdG8gZmluZCB0aGUgcHl0aG9uIGV4dGVuc2lvbiBhdCBydW50aW1lLgorICAgICAgICAgICAgICAgIHByb3BlcnR5LXNldCA9IFsgJChwcm9wZXJ0eS1zZXQpLmFkZCAkKGV4dGVuc2lvblsxXSkgXSA7CisKKyAgICAgICAgICAgICAgICAjIElnbm9yZSB1c2FnZSByZXF1aXJlbWVudHMuIFdlJ3JlIGEgdG9wLWxldmVsIGdlbmVyYXRvciBhbmQKKyAgICAgICAgICAgICAgICAjIG5vYm9keSBpcyBnb2luZyB0byB1c2Ugd2hhdCB3ZSBnZW5lcmF0ZS4KKyAgICAgICAgICAgICAgICBuZXctc291cmNlcyArPSAkKGV4dGVuc2lvblsyLV0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3BlcnR5LXNldCA9IFsgJChwcm9wZXJ0eS1zZXQpLmFkZC1yYXcgPGRlcGVuZGVuY3k+JChvdGhlci1weXRob25zKSBdIDsKKworICAgICAgICByZXR1cm4gWyBjb25zdHJ1Y3QtcmVzdWx0ICQocHl0aG9uKSAkKGV4dGVuc2lvbnMpICQobmV3LXNvdXJjZXMpIDoKKyAgICAgICAgICAgICQocHJvamVjdCkgJChuYW1lKSA6ICQocHJvcGVydHktc2V0KSBdIDsKKyAgICB9Cit9CisKKworZ2VuZXJhdG9ycy5yZWdpc3RlcgorICBbIG5ldyBweXRob24tdGVzdC1nZW5lcmF0b3IgcHl0aG9uLmNhcHR1cmUtb3V0cHV0IDogOiBSVU5fUFlEX09VVFBVVCBdIDsKKworZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCB0ZXN0aW5nLmV4cGVjdC1zdWNjZXNzCisgIDogUlVOX1BZRF9PVVRQVVQgOiBSVU5fUFlEIDsKKworCisjIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHdheXMgb2Ygc3BlbGxpbmcgT1MgbmFtZXMuIE9uZSBpcyB1c2VkIGZvciBbIG9zLm5hbWUgXQorIyBhbmQgdGhlIG90aGVyIGlzIHVzZWQgZm9yIHRoZSA8aG9zdC1vcz4gYW5kIDx0YXJnZXQtb3M+IHByb3BlcnRpZXMuIFVudGlsIHRoYXQKKyMgaXMgcmVtZWRpZWQsIHRoaXMgc2V0cyB1cCBhIGNydWRlIG1hcHBpbmcgZnJvbSB0aGUgbGF0dGVyIHRvIHRoZSBmb3JtZXIsIHRoYXQKKyMgd2lsbCB3b3JrICpmb3IgdGhlIHB1cnBvc2VzIG9mIGN5Z3dpbi9OVCBjcm9zcy1idWlsZHMgb25seSouIENvdWxkIG5vdCB0aGluaworIyBvZiBhIGJldHRlciBuYW1lIHRoYW4gInRyYW5zbGF0ZSIuCisjCisudHJhbnNsYXRlLW9zLXdpbmRvd3MgPSBOVCA7CisudHJhbnNsYXRlLW9zLWN5Z3dpbiA9IENZR1dJTiA7Citsb2NhbCBydWxlIHRyYW5zbGF0ZS1vcyAoIHNyYy1vcyApCit7CisgICAgbG9jYWwgeCA9ICQoLnRyYW5zbGF0ZS1vcy0kKHNyYy1vcykpIFsgb3MubmFtZSBdIDsKKyAgICByZXR1cm4gJCh4WzFdKSA7Cit9CisKKworIyBFeHRyYWN0IHRoZSBwYXRoIHRvIGEgc2luZ2xlICIucHlkIiBzb3VyY2UuIFRoaXMgaXMgdXNlZCB0byBidWlsZCB0aGUKKyMgUFlUSE9OUEFUSCBmb3IgcnVubmluZyBicGwgdGVzdHMuCisjCitsb2NhbCBydWxlIHB5ZC1weXRob25wYXRoICggc291cmNlICkKK3sKKyAgICByZXR1cm4gWyBvbiAkKHNvdXJjZSkgcmV0dXJuICQoTE9DQVRFKSAkKFNFQVJDSCkgXSA7Cit9CisKKworIyBUaGUgZmxhZyBzZXR0aW5ncyBvbiB0ZXN0aW5nLmNhcHR1cmUtb3V0cHV0IGRvIG5vdCBhcHBseSB0byBweXRob24uY2FwdHVyZQorIyBvdXRwdXQgYXQgdGhlIG1vbWVudC4gUmVkbyB0aGlzIGV4cGxpY2l0bHkuCit0b29sc2V0LmZsYWdzIHB5dGhvbi5jYXB0dXJlLW91dHB1dCBBUkdTIDx0ZXN0aW5nLmFyZz4gOworCisKK3J1bGUgY2FwdHVyZS1vdXRwdXQgKCB0YXJnZXQgOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgICMgU2V0dXAgdXAgYSBwcm9wZXIgRExMIHNlYXJjaCBwYXRoLiBIZXJlLCAkKHNvdXJjZXNbMV0pIGlzIGEgcHl0aG9uIG1vZHVsZQorICAgICMgYW5kICQoc291cmNlc1syXSkgaXMgYSBETEwuIE9ubHkgJChzb3VyY2VzWzFdKSBpcyBwYXNzZWQgdG8KKyAgICAjIHRlc3RpbmcuY2FwdHVyZS1vdXRwdXQsIHNvIFJVTl9QQVRIIHZhcmlhYmxlIG9uICQoc291cmNlc1syXSkgaXMgbm90CisgICAgIyBjb25zdWx0ZWQuIE1vdmUgaXQgb3ZlciBleHBsaWNpdGx5LgorICAgIFJVTl9QQVRIIG9uICQoc291cmNlc1sxXSkgPSBbIG9uICQoc291cmNlc1syLV0pIHJldHVybiAkKFJVTl9QQVRIKSBdIDsKKworICAgIFBZVEhPTlBBVEggID0gWyBzZXF1ZW5jZS50cmFuc2Zvcm0gcHlkLXB5dGhvbnBhdGggOiAkKHNvdXJjZXNbMi1dKSBdIDsKKyAgICBQWVRIT05QQVRIICs9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIHB5dGhvbnBhdGggOiAkKHByb3BlcnRpZXMpIF0gOworCisgICAgIyBBZnRlciB0ZXN0IGlzIHJ1biwgd2UgcmVtb3ZlIHRoZSBQeXRob24gbW9kdWxlLCBidXQgbm90IHRoZSBQeXRob24gc2NyaXB0LgorICAgIHRlc3RpbmcuY2FwdHVyZS1vdXRwdXQgJCh0YXJnZXQpIDogJChzb3VyY2VzWzFdKSA6ICQocHJvcGVydGllcykgOgorICAgICAgICAkKHNvdXJjZXNbMi1dKSA7CisKKyAgICAjIFBZVEhPTlBBVEggaXMgZGlmZmVyZW50OyBpdCB3aWxsIGJlIGludGVycHJldGVkIGJ5IHdoaWNoZXZlciBQeXRob24gaXMKKyAgICAjIGludm9rZWQgYW5kIHNvIG11c3QgZm9sbG93IHBhdGggcnVsZXMgZm9yIHRoZSB0YXJnZXQgb3MuIFRoZSBvbmx5IE9TZXMKKyAgICAjIHdoZXJlIHdlIGNhbiBydW4gcHl0aG9uIGZvciBvdGhlciBPU2VzIGN1cnJlbnRseSBhcmUgTlQgYW5kIENZR1dJTiBzbyB3ZQorICAgICMgb25seSBuZWVkIHRvIGhhbmRsZSB0aG9zZSBjYXNlcy4KKyAgICBsb2NhbCB0YXJnZXQtb3MgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyB0YXJnZXQtb3MgOiAkKHByb3BlcnRpZXMpIF0gOworICAgICMgT2RkbHksIGhvc3Qtb3MgaXMgbm90IGluIHByb3BlcnRpZXMsIHNvIGdyYWIgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgbG9jYWwgaG9zdC1vcyA9IFsgZmVhdHVyZS5kZWZhdWx0cyBob3N0LW9zIF0gOworICAgIGhvc3Qtb3MgPSAkKGhvc3Qtb3M6Rz0pIDsKKyAgICBpZiAkKHRhcmdldC1vcykgIT0gJChob3N0LW9zKQorICAgIHsKKyAgICAgICAgUFlUSE9OUEFUSCA9IFsgc2VxdWVuY2UudHJhbnNmb3JtICQoaG9zdC1vcyktdG8tJCh0YXJnZXQtb3MpLXBhdGggOgorICAgICAgICAgICAgJChQWVRIT05QQVRIKSBdIDsKKyAgICB9CisgICAgbG9jYWwgcGF0aC1zZXBhcmF0b3IgPSBbIG9zLnBhdGgtc2VwYXJhdG9yIFsgdHJhbnNsYXRlLW9zICQodGFyZ2V0LW9zKSBdIF0gOworICAgIGxvY2FsIHNldC1QWVRIT05QQVRIID0gWyBjb21tb24udmFyaWFibGUtc2V0dGluZy1jb21tYW5kIFBZVEhPTlBBVEggOgorICAgICAgICAkKFBZVEhPTlBBVEg6Sj0kKHBhdGgtc2VwYXJhdG9yKSkgXSA7CisgICAgTEFVTkNIRVIgb24gJCh0YXJnZXQpID0gJChzZXQtUFlUSE9OUEFUSCkgWyBvbiAkKHRhcmdldCkgcmV0dXJuIFwiJChQWVRIT04pXCIgXSA7Cit9CisKKworcnVsZSBicGwtdGVzdCAoIG5hbWUgOiBzb3VyY2VzICogOiByZXF1aXJlbWVudHMgKiApCit7CisgICAgbG9jYWwgcyA7CisgICAgc291cmNlcyA/PSAkKG5hbWUpLnB5ICQobmFtZSkuY3BwIDsKKyAgICByZXR1cm4gWyB0ZXN0aW5nLm1ha2UtdGVzdCBydW4tcHlkIDogJChzb3VyY2VzKSAvYm9vc3QvcHl0aG9uLy9ib29zdF9weXRob24KKyAgICAgICAgOiAkKHJlcXVpcmVtZW50cykgOiAkKG5hbWUpIF0gOworfQorCisKK0lNUE9SVCAkKF9fbmFtZV9fKSA6IGJwbC10ZXN0IDogOiBicGwtdGVzdCA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3FjYy5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3FjYy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzNTU3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcWNjLmphbQpAQCAtMCwwICsxLDIzOCBAQAorIyAgQ29weXJpZ2h0IChjKSAyMDAxIERhdmlkIEFicmFoYW1zLgorIyAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgUmVuZSBSaXZlcmEuCisjICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBWbGFkaW1pciBQcnVzLgorIworIyAgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorIyAgTGljZW5zZSBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKKyMgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworaW1wb3J0IGNvbW1vbiA7CitpbXBvcnQgZXJyb3JzIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBvcyA7CitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IHNldCA7CitpbXBvcnQgdG9vbHNldCA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgdW5peCA7CisKK2ZlYXR1cmUuZXh0ZW5kIHRvb2xzZXQgOiBxY2MgOworCit0b29sc2V0LmluaGVyaXQtZ2VuZXJhdG9ycyBxY2MgOiB1bml4IDogdW5peC5saW5rIHVuaXgubGluay5kbGwgOworZ2VuZXJhdG9ycy5vdmVycmlkZSBidWlsdGluLmxpYi1nZW5lcmF0b3IgOiBxY2MucHJlYnVpbHQgOwordG9vbHNldC5pbmhlcml0LWZsYWdzIHFjYyA6IHVuaXggOwordG9vbHNldC5pbmhlcml0LXJ1bGVzIHFjYyA6IHVuaXggOworCisjIEluaXRpYWxpemVzIHRoZSBxY2MgdG9vbHNldCBmb3IgdGhlIGdpdmVuIHZlcnNpb24uIElmIG5lY2Vzc2FyeSwgY29tbWFuZCBtYXkKKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBjb21waWxlciBpcyBsb2NhdGVkLiBUaGUgcGFyYW1ldGVyICdvcHRpb25zJyBpcyBhCisjIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIG9wdGlvbnMsIGVhY2ggb25lIGJlaW5nIHNwZWNpZmllZCBhcworIyA8b3B0aW9uLW5hbWU+b3B0aW9uLXZhbHVlLiBWYWxpZCBvcHRpb24gbmFtZXMgYXJlOiBjeHhmbGFncywgbGlua2ZsYWdzIGFuZAorIyBsaW5rZXItdHlwZS4gQWNjZXB0ZWQgdmFsdWVzIGZvciBsaW5rZXItdHlwZSBhcmUgZ251IGFuZCBzdW4sIGdudSBiZWluZyB0aGUKKyMgZGVmYXVsdC4KKyMKKyMgRXhhbXBsZToKKyMgICB1c2luZyBxY2MgOiAzLjQgOiA6IDxjeHhmbGFncz5mb28gPGxpbmtmbGFncz5iYXIgPGxpbmtlci10eXBlPnN1biA7CisjCitydWxlIGluaXQgKCB2ZXJzaW9uID8gOiBjb21tYW5kICogOiBvcHRpb25zICogKQoreworICAgIGxvY2FsIGNvbmRpdGlvbiA9IFsgY29tbW9uLmNoZWNrLWluaXQtcGFyYW1ldGVycyBxY2MgOiB2ZXJzaW9uICQodmVyc2lvbikgXSA7CisgICAgbG9jYWwgY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgcWNjIDogUUNDIDogJChjb21tYW5kKSBdIDsKKyAgICBjb21tb24uaGFuZGxlLW9wdGlvbnMgcWNjIDogJChjb25kaXRpb24pIDogJChjb21tYW5kKSA6ICQob3B0aW9ucykgOworfQorCisKK2dlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciBxY2MuY29tcGlsZS5jKysgOiBDUFAgOiBPQkogOiA8dG9vbHNldD5xY2MgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIHFjYy5jb21waWxlLmMgICA6IEMgICA6IE9CSiA6IDx0b29sc2V0PnFjYyA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgcWNjLmNvbXBpbGUuYXNtIDogQVNNIDogT0JKIDogPHRvb2xzZXQ+cWNjIDsKKworCisjIERlY2xhcmUgZmxhZ3MgZm9yIGNvbXBpbGF0aW9uLgordG9vbHNldC5mbGFncyBxY2MuY29tcGlsZSBPUFRJT05TIDxkZWJ1Zy1zeW1ib2xzPm9uIDogLWdzdGFicysgOworCisjIERlY2xhcmUgZmxhZ3MgYW5kIGFjdGlvbiBmb3IgY29tcGlsYXRpb24uCit0b29sc2V0LmZsYWdzIHFjYy5jb21waWxlIE9QVElPTlMgPG9wdGltaXphdGlvbj5vZmYgOiAtTzAgOwordG9vbHNldC5mbGFncyBxY2MuY29tcGlsZSBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BlZWQgOiAtTzMgOwordG9vbHNldC5mbGFncyBxY2MuY29tcGlsZSBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BhY2UgOiAtT3MgOworCit0b29sc2V0LmZsYWdzIHFjYy5jb21waWxlIE9QVElPTlMgPGlubGluaW5nPm9mZiA6IC1XYywtZm5vLWlubGluZSA7Cit0b29sc2V0LmZsYWdzIHFjYy5jb21waWxlIE9QVElPTlMgPGlubGluaW5nPm9uIDogLVdjLC1Xbm8taW5saW5lIDsKK3Rvb2xzZXQuZmxhZ3MgcWNjLmNvbXBpbGUgT1BUSU9OUyA8aW5saW5pbmc+ZnVsbCA6IC1XYywtZmlubGluZS1mdW5jdGlvbnMgLVdjLC1Xbm8taW5saW5lIDsKKwordG9vbHNldC5mbGFncyBxY2MuY29tcGlsZSBPUFRJT05TIDx3YXJuaW5ncz5vZmYgOiAtdyA7Cit0b29sc2V0LmZsYWdzIHFjYy5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzPmFsbCA6IC1XYywtV2FsbCA7Cit0b29sc2V0LmZsYWdzIHFjYy5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzLWFzLWVycm9ycz5vbiA6IC1XYywtV2Vycm9yIDsKKwordG9vbHNldC5mbGFncyBxY2MuY29tcGlsZSBPUFRJT05TIDxwcm9maWxpbmc+b24gOiAtcCA7CisKK3Rvb2xzZXQuZmxhZ3MgcWNjLmNvbXBpbGUgT1BUSU9OUyA8Y2ZsYWdzPiA7Cit0b29sc2V0LmZsYWdzIHFjYy5jb21waWxlLmMrKyBPUFRJT05TIDxjeHhmbGFncz4gOwordG9vbHNldC5mbGFncyBxY2MuY29tcGlsZSBERUZJTkVTIDxkZWZpbmU+IDsKK3Rvb2xzZXQuZmxhZ3MgcWNjLmNvbXBpbGUgSU5DTFVERVMgPGluY2x1ZGU+IDsKKwordG9vbHNldC5mbGFncyBxY2MuY29tcGlsZSBPUFRJT05TIDxsaW5rPnNoYXJlZCA6IC1zaGFyZWQgOworCit0b29sc2V0LmZsYWdzIHFjYy5jb21waWxlLmMrKyBURU1QTEFURV9ERVBUSCA8YysrLXRlbXBsYXRlLWRlcHRoPiA7CisKKworcnVsZSBjb21waWxlLmMrKworeworICAgICMgSGVyZSB3ZSB3YW50IHRvIHJhaXNlIHRoZSB0ZW1wbGF0ZS1kZXB0aCBwYXJhbWV0ZXIgdmFsdWUgdG8gc29tZXRoaW5nCisgICAgIyBoaWdoZXIgdGhhbiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAxNy4gTm90ZSB0aGF0IHdlIGNvdWxkIGRvIHRoaXMgdXNpbmcgdGhlCisgICAgIyBmZWF0dXJlLnNldC1kZWZhdWx0IHJ1bGUgYnV0IHdlIGRvIG5vdCB3YW50IHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IKKyAgICAjIGFsbCB0b29sc2V0cyBhcyB3ZWxsLgorICAgICMKKyAgICAjIFRPRE86IFRoaXMgJ21vZGlmaWVkIGRlZmF1bHQnIGhhcyBiZWVuIGluaGVyaXRlZCBmcm9tIHNvbWUgJ29sZGVyIEJvb3N0CisgICAgIyBCdWlsZCBpbXBsZW1lbnRhdGlvbicgYW5kIGhhcyBtb3N0IGxpa2VseSBiZWVuIGFkZGVkIHRvIG1ha2Ugc29tZSBCb29zdAorICAgICMgbGlicmFyeSBwYXJ0cyBjb21waWxlIGNvcnJlY3RseS4gV2Ugc2hvdWxkIHNlZSB3aGF0IGV4YWN0bHkgcHJvbXB0ZWQgdGhpcworICAgICMgYW5kIHdoZXRoZXIgd2UgY2FuIGdldCBhcm91bmQgdGhlIHByb2JsZW0gbW9yZSBsb2NhbGx5LgorICAgIGxvY2FsIHRlbXBsYXRlLWRlcHRoID0gWyBvbiAkKDEpIHJldHVybiAkKFRFTVBMQVRFX0RFUFRIKSBdIDsKKyAgICBpZiAhICQodGVtcGxhdGUtZGVwdGgpCisgICAgeworICAgICAgICBURU1QTEFURV9ERVBUSCBvbiAkKDEpID0gMTI4IDsKKyAgICB9Cit9CisKK2FjdGlvbnMgY29tcGlsZS5jKysKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiIC1XYywtZnRlbXBsYXRlLWRlcHRoLSQoVEVNUExBVEVfREVQVEgpICQoT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtYyAtbyAiJCg8KSIgIiQoPikiCit9CisKK2FjdGlvbnMgY29tcGlsZS5jCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAkKE9QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCithY3Rpb25zIGNvbXBpbGUuYXNtCit7CisgICAgIiQoQ09ORklHX0NPTU1BTkQpIiAkKE9QVElPTlMpIC1EJChERUZJTkVTKSAtSSIkKElOQ0xVREVTKSIgLWMgLW8gIiQoPCkiICIkKD4pIgorfQorCisKKyMgVGhlIGNsYXNzIGNoZWNraW5nIHRoYXQgd2UgZG8gbm90IHRyeSB0byB1c2UgdGhlIDxydW50aW1lLWxpbms+c3RhdGljIHByb3BlcnR5CisjIHdoaWxlIGNyZWF0aW5nIG9yIHVzaW5nIGEgc2hhcmVkIGxpYnJhcnksIHNpbmNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgcWNjLworIyAvbGliYy4KKyMKK2NsYXNzIHFjYy1saW5raW5nLWdlbmVyYXRvciA6IHVuaXgtbGlua2luZy1nZW5lcmF0b3IKK3sKKyAgICBydWxlIGdlbmVyYXRlZC10YXJnZXRzICggc291cmNlcyArIDogcHJvcGVydHktc2V0IDogcHJvamVjdCBuYW1lID8gKQorICAgIHsKKyAgICAgICAgaWYgPHJ1bnRpbWUtbGluaz5zdGF0aWMgaW4gWyAkKHByb3BlcnR5LXNldCkucmF3IF0KKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgbSA7CisgICAgICAgICAgICBpZiBbIGlkIF0gPSAicWNjLmxpbmsuZGxsIgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG0gPSAib24gcWNjLCBETEwgY2FuJ3QgYmUgYnVpbGQgd2l0aCA8cnVudGltZS1saW5rPnN0YXRpYyIgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgISAkKG0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIGxvY2FsIHMgaW4gJChzb3VyY2VzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwgdHlwZSA9IFsgJChzKS50eXBlIF0gOworICAgICAgICAgICAgICAgICAgICBpZiAkKHR5cGUpICYmIFsgdHlwZS5pcy1kZXJpdmVkICQodHlwZSkgU0hBUkVEX0xJQiBdCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gPSAib24gcWNjLCB1c2luZyBETExTIHRvZ2V0aGVyIHdpdGggdGhlIDxydW50aW1lLWxpbms+c3RhdGljIG9wdGlvbnMgaXMgbm90IHBvc3NpYmxlICIgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgJChtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycm9ycy51c2VyLWVycm9yICQobSkgOiAiSXQgaXMgc3VnZ2VzdGVkIHRvIHVzZSIKKyAgICAgICAgICAgICAgICAgICAgIjxydW50aW1lLWxpbms+c3RhdGljIHRvZ2V0aGVyIHdpdGggPGxpbms+c3RhdGljLiIgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFsgdW5peC1saW5raW5nLWdlbmVyYXRvci5nZW5lcmF0ZWQtdGFyZ2V0cworICAgICAgICAgICAgJChzb3VyY2VzKSA6ICQocHJvcGVydHktc2V0KSA6ICQocHJvamVjdCkgJChuYW1lKSBdIDsKKyAgICB9Cit9CisKK2dlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgcWNjLWxpbmtpbmctZ2VuZXJhdG9yIHFjYy5saW5rIDogTElCIE9CSiA6IEVYRQorICAgIDogPHRvb2xzZXQ+cWNjIF0gOworCitnZW5lcmF0b3JzLnJlZ2lzdGVyIFsgbmV3IHFjYy1saW5raW5nLWdlbmVyYXRvciBxY2MubGluay5kbGwgOiBMSUIgT0JKCisgICAgOiBTSEFSRURfTElCIDogPHRvb2xzZXQ+cWNjIF0gOworCitnZW5lcmF0b3JzLm92ZXJyaWRlIHFjYy5wcmVidWlsdCA6IGJ1aWx0aW4ucHJlYnVpbHQgOworZ2VuZXJhdG9ycy5vdmVycmlkZSBxY2Muc2VhcmNoZWQtbGliLWdlbmVyYXRvciA6IHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOworCisKKyMgRGVjbGFyZSBmbGFncyBmb3IgbGlua2luZy4KKyMgRmlyc3QsIHRoZSBjb21tb24gZmxhZ3MuCit0b29sc2V0LmZsYWdzIHFjYy5saW5rIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b24gOiAtZ3N0YWJzKyA7Cit0b29sc2V0LmZsYWdzIHFjYy5saW5rIE9QVElPTlMgPHByb2ZpbGluZz5vbiA6IC1wIDsKK3Rvb2xzZXQuZmxhZ3MgcWNjLmxpbmsgT1BUSU9OUyA8bGlua2ZsYWdzPiA7Cit0b29sc2V0LmZsYWdzIHFjYy5saW5rIExJTktQQVRIIDxsaWJyYXJ5LXBhdGg+IDsKK3Rvb2xzZXQuZmxhZ3MgcWNjLmxpbmsgRklORExJQlMtU1QgPGZpbmQtc3RhdGljLWxpYnJhcnk+IDsKK3Rvb2xzZXQuZmxhZ3MgcWNjLmxpbmsgRklORExJQlMtU0EgPGZpbmQtc2hhcmVkLWxpYnJhcnk+IDsKK3Rvb2xzZXQuZmxhZ3MgcWNjLmxpbmsgTElCUkFSSUVTIDxsaWJyYXJ5LWZpbGU+IDsKKwordG9vbHNldC5mbGFncyBxY2MubGluayBGSU5ETElCUy1TQSA6IG0gOworCisjIEZvciA8cnVudGltZS1saW5rPnN0YXRpYyB3ZSBtYWRlIHN1cmUgdGhlcmUgYXJlIG5vIGR5bmFtaWMgbGlicmFyaWVzIGluIHRoZQorIyBsaW5rLgordG9vbHNldC5mbGFncyBxY2MubGluayBPUFRJT05TIDxydW50aW1lLWxpbms+c3RhdGljIDogLXN0YXRpYyA7CisKKyMgQXNzdW1pbmcgdGhpcyBpcyBqdXN0IGxpa2Ugd2l0aCBnY2MuCit0b29sc2V0LmZsYWdzIHFjYy5saW5rIFJQQVRIIDogPGRsbC1wYXRoPiA6IHVuY2hlY2tlZCA7Cit0b29sc2V0LmZsYWdzIHFjYy5saW5rIFJQQVRIX0xJTksgOiA8eGRsbC1wYXRoPiA6IHVuY2hlY2tlZCA7CisKKworIyBEZWNsYXJlIGFjdGlvbnMgZm9yIGxpbmtpbmcuCisjCitydWxlIGxpbmsgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIFNQQUNFIG9uICQodGFyZ2V0cykgPSAiICIgOworICAgICMgU2VyaWFsaXplIGV4ZWN1dGlvbiBvZiB0aGUgJ2xpbmsnIGFjdGlvbiwgc2luY2UgcnVubmluZyBOIGxpbmtzIGluCisgICAgIyBwYXJhbGxlbCBpcyBqdXN0IHNsb3dlci4gRm9yIG5vdywgc2VyaWFsaXplIG9ubHkgcWNjIGxpbmtzIHdoaWxlIGl0IG1pZ2h0CisgICAgIyBiZSBhIGdvb2QgaWRlYSB0byBzZXJpYWxpemUgYWxsIGxpbmtzLgorICAgIEpBTV9TRU1BUEhPUkUgb24gJCh0YXJnZXRzKSA9IDxzPnFjYy1saW5rLXNlbWFwaG9yZSA7Cit9CisKK2FjdGlvbnMgbGluayBiaW5kIExJQlJBUklFUworeworICAgICIkKENPTkZJR19DT01NQU5EKSIgLUwiJChMSU5LUEFUSCkiIC1XbCwtUiQoU1BBQ0UpLVdsLCIkKFJQQVRIKSIgLVdsLC1ycGF0aC1saW5rJChTUEFDRSktV2wsIiQoUlBBVEhfTElOSykiIC1vICIkKDwpIiAiJCg+KSIgIiQoTElCUkFSSUVTKSIgLWwkKEZJTkRMSUJTLVNUKSAtbCQoRklORExJQlMtU0EpICQoT1BUSU9OUykKK30KKworCisjIEFsd2F5cyByZW1vdmUgYXJjaGl2ZSBhbmQgc3RhcnQgYWdhaW4uIEhlcmUgaXMgdGhlIHJhdGlvbmFsZSBmcm9tIEFuZHJlIEhlbnR6OgorIyBJIGhhZCBhIGZpbGUsIHNheSBhMS5jLCB0aGF0IHdhcyBpbmNsdWRlZCBpbnRvIGxpYmEuYS4gSSBtb3ZlZCBhMS5jIHRvIGEyLmMsCisjIHVwZGF0ZWQgbXkgSmFtZmlsZXMgYW5kIHJlYnVpbHQuIE15IHByb2dyYW0gd2FzIGNyYXNoaW5nIHdpdGggYWJzdXJkIGVycm9ycy4KKyMgQWZ0ZXIgc29tZSBkZWJ1Z2dpbmcgSSB0cmFjZWQgaXQgYmFjayB0byB0aGUgZmFjdCB0aGF0IGExLm8gd2FzICpzdGlsbCogaW4KKyMgbGliYS5hCitSTSA9IFsgY29tbW9uLnJtLWNvbW1hbmQgXSA7CitpZiBbIG9zLm5hbWUgXSA9IE5UCit7CisgICAgUk0gPSAiaWYgZXhpc3QgXCIkKDxbMV0pXCIgREVMIFwiJCg8WzFdKVwiIiAgOworfQorCisKKyMgRGVjbGFyZSBhY3Rpb24gZm9yIGNyZWF0aW5nIHN0YXRpYyBsaWJyYXJpZXMuIFRoZSAncicgbGV0dGVyIG1lYW5zIHRvIGFkZAorIyBmaWxlcyB0byB0aGUgYXJjaGl2ZSB3aXRoIHJlcGxhY2VtZW50LiBTaW5jZSB3ZSByZW1vdmUgdGhlIGFyY2hpdmUsIHdlIGRvIG5vdAorIyBjYXJlIGFib3V0IHJlcGxhY2VtZW50LCBidXQgdGhlcmUgaXMgbm8gb3B0aW9uIHRvICJhZGQgd2l0aG91dCByZXBsYWNlbWVudCIuCisjIFRoZSAnYycgbGV0dGVyIHN1cHByZXNzZXMgd2FybmluZ3MgaW4gY2FzZSB0aGUgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdHMgeWV0LgorIyBUaGF0IHdhcm5pbmcgaXMgcHJvZHVjZWQgb25seSBvbiBzb21lIHBsYXRmb3JtcywgZm9yIHdoYXRldmVyIHJlYXNvbnMuCisjCisjIFVzZSBxY2MgZHJpdmVyIHRvIGNyZWF0ZSBhcmNoaXZlLCBzZWUKKyMgICAgIGh0dHA6Ly93d3cucW54LmNvbS9kZXZlbG9wZXJzL2RvY3MvNi4zLjIvbmV1dHJpbm8vdXRpbGl0aWVzL3EvcWNjLmh0bWwKK2FjdGlvbnMgcGllY2VtZWFsIGFyY2hpdmUKK3sKKyAgICAkKFJNKSAiJCg8KSIKKyAgICAiJChDT05GSUdfQ09NTUFORCkiIC1BICIkKDwpIiAiJCg+KSIKK30KKworCitydWxlIGxpbmsuZGxsICggdGFyZ2V0cyAqIDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBTUEFDRSBvbiAkKHRhcmdldHMpID0gIiAiIDsKKyAgICBKQU1fU0VNQVBIT1JFIG9uICQodGFyZ2V0cykgPSA8cz5xY2MtbGluay1zZW1hcGhvcmUgOworfQorCisKKyMgRGlmZmVyIGZyb20gJ2xpbmsnIGFib3ZlIG9ubHkgYnkgLXNoYXJlZC4KKyMKK2FjdGlvbnMgbGluay5kbGwgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiIC1MIiQoTElOS1BBVEgpIiAtV2wsLVIkKFNQQUNFKS1XbCwiJChSUEFUSCkiIC1vICIkKDwpIiAkKEhBVkVfU09OQU1FKS1XbCwtaCQoU1BBQ0UpLVdsLCQoPFsxXTpEPSkgLXNoYXJlZCAiJCg+KSIgICIkKExJQlJBUklFUykiIC1sJChGSU5ETElCUy1TVCkgLWwkKEZJTkRMSUJTLVNBKSAkKE9QVElPTlMpCit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3F0LmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcXQuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYTdjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3F0LmphbQpAQCAtMCwwICsxLDE3IEBACisjICBDb3B5cmlnaHQgKGMpIDIwMDYgVmxhZGltaXIgUHJ1cy4KKyMKKyMgIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKKyMgIExpY2Vuc2UgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yCisjICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgIEZvcndhcm5pbmcgdG9vbHNldCBmaWxlIHRvIFF0IEdVSSBsaWJyYXJ5LiBGb3J3YXJkcyB0byB0aGUgdG9vbHNldCBmaWxlCisjICBmb3IgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBRdC4KKworaW1wb3J0IHF0NCA7CisKK3J1bGUgaW5pdCAoIHByZWZpeCA6IGZ1bGxfYmluID8gOiBmdWxsX2luYyA/IDogZnVsbF9saWIgPyA6IHZlcnNpb24gPyA6IGNvbmRpdGlvbiAqICkKK3sKKyAgICBxdDQuaW5pdCAkKHByZWZpeCkgOiAkKGZ1bGxfYmluKSAgOiAkKGZ1bGxfaW5jKSA6ICQoZnVsbF9saWIpIDogJCh2ZXJzaW9uKSA6ICQoY29uZGl0aW9uKSA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9xdDMuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9xdDMuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MmNmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3F0My5qYW0KQEAgLTAsMCArMSwyMDkgQEAKKyMgQ29weXJpZ2h0IDIwMDYgVmxhZGltaXIgUHJ1cyAKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAKKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworIyBTdXBwb3J0IGZvciB0aGUgUXQgR1VJIGxpYnJhcnkgdmVyc2lvbiAzCisjIChodHRwOi8vd3d3LnRyb2xsdGVjaC5jb20vcHJvZHVjdHMvcXQzL2luZGV4Lmh0bWwpLgorIyBGb3IgbmV3IGRldmVsb3BtZW50cywgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIFF0NCB2aWEgdGhlIHF0NCBCb29zdC5CdWlsZAorIyBtb2R1bGUuCisKK2ltcG9ydCBtb2R1bGVzIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBlcnJvcnMgOworaW1wb3J0IHR5cGUgOworaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IHByb2plY3QgOworaW1wb3J0IHRvb2xzZXQgOiBmbGFncyA7CisKKyMgQ29udmVydCB0aGlzIG1vZHVsZSBpbnRvIGEgcHJvamVjdCwgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0YXJnZXRzIGhlcmUuCitwcm9qZWN0LmluaXRpYWxpemUgJChfX25hbWVfXykgOworcHJvamVjdCBxdDMgOworCisKKyMgSW5pdGlhbGl6ZWQgdGhlIFFUIHN1cHBvcnQgbW9kdWxlLiBUaGUgJ3ByZWZpeCcgcGFyYW1ldGVyIHRlbGxzIHdoZXJlIFFUIGlzCisjIGluc3RhbGxlZC4gV2hlbiBub3QgZ2l2ZW4sIGVudmlyb25tZW50YWwgdmFyaWFibGUgUVRESVIgc2hvdWxkIGJlIHNldC4KKyMKK3J1bGUgaW5pdCAoIHByZWZpeCA/ICkKK3sKKyAgICBpZiAhICQocHJlZml4KQorICAgIHsKKyAgICAgICAgcHJlZml4ID0gWyBtb2R1bGVzLnBlZWsgOiBRVERJUiBdIDsKKyAgICAgICAgaWYgISAkKHByZWZpeCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9ycy5lcnJvciAKKyAgICAgICAgICAgICAgIlFUIGluc3RhbGxhdGlvbiBwcmVmaXggbm90IGdpdmVuIGFuZCBRVERJUiB2YXJpYWJsZSBpcyBlbXB0eSIgOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisgCisgICAgaWYgJCguaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgICBpZiAkKHByZWZpeCkgIT0gJCgucHJlZml4KQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcnMuZXJyb3IgCisgICAgICAgICAgICAgICJBdHRlbXB0IHRoZSByZWluaXRpYWxpemUgUVQgd2l0aCBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCIgOworICAgICAgICB9ICAgICAgICAKKyAgICB9IAorICAgIGVsc2UKKyAgICB7ICAgICAgICAgICAgCisgICAgICAgIC5pbml0aWFsaXplZCA9IHRydWUgOworICAgICAgICAucHJlZml4ID0gJChwcmVmaXgpIDsKKyAgICAgICAgCisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXItc3RhbmRhcmQgcXQzLm1vYyA6IEggOiBDUFAobW9jXyUpIDogPGFsbG93PnF0MyA7CisgICAgICAgICMgTm90ZTogdGhlIE9CSiB0YXJnZXQgdHlwZSBoZXJlIGlzIGZha2UsIHRha2UgYSBsb29rIGF0CisgICAgICAgICMgcXQ0LmphbS91aWMtaC1nZW5lcmF0b3IgZm9yIGV4cGxhbmF0aW9ucyB0aGF0IGFwcGx5IGluIHRoaXMgY2FzZSBhcworICAgICAgICAjIHdlbGwuCisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgbW9jLWgtZ2VuZXJhdG9yLXF0MyAKKyAgICAgICAgICAgIHF0My5tb2MuY3BwIDogTU9DQ0FCTEVfQ1BQIDogT0JKIDogPGFsbG93PnF0MyBdIDsKKyAgICAgICAgCisgICAgICAgICMgVGhlIFVJIHR5cGUgaXMgZGVmaW5lZCBpbiB0eXBlcy9xdC5qYW0sIGFuZCBVSUNfSCBpcyBvbmx5IHVzZWQgaW4KKyAgICAgICAgIyBxdC5qYW0sIGJ1dCBub3QgaW4gcXQ0LmphbSwgc28gZGVmaW5lIGl0IGhlcmUuCisgICAgICAgIHR5cGUucmVnaXN0ZXIgVUlDX0ggOiA6IEggOworICAgICAgICAKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCBxdDMudWljLWggOiBVSSA6IFVJQ19IIDogPGFsbG93PnF0MyA7CisgICAgICAgIAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgZ2VuZXJhdG9yIGlzIHVzZWQgdG8gY29udmVydCBVSSBmaWxlcyB0byBDUFAuIEl0IGNyZWF0ZXMKKyAgICAgICAgIyBVSUNfSCBmcm9tIFVJLCBhbmQgY29uc3RydWN0cyBDUFAgZnJvbSBVSS9VSUNfSC4gSW4gYWRkaXRpb24sIGl0IGFsc28KKyAgICAgICAgIyByZXR1cm5zIFVJQ19IIHRhcmdldCwgc28gdGhhdCBpdCBjYW4gYmUgbW9jY2VkLgorICAgICAgICBjbGFzcyBxdDo6dWljLWNwcC1nZW5lcmF0b3IgOiBnZW5lcmF0b3IKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZSBfX2luaXRfXyAoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0b3IuX19pbml0X18gcXQzLnVpYy1jcHAgOiBVSSBVSUNfSCA6IENQUCA6IDxhbGxvdz5xdDMgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBydWxlIHJ1biAoIHByb2plY3QgbmFtZSA/IDogcHJvcGVydGllcyAqIDogc291cmNlcyArICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIENvbnNpZGVyIHRoaXM6CisgICAgICAgICAgICAgICAgIyAgICBvYmogdGVzdCA6IHRlc3RfYS5jcHAgOiA8b3B0aW1pemF0aW9uPm9mZiA7CisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgVGhpcyBnZW5lcmF0b3Igd2lsbCBzb21laG93IGJlIGNhbGxlZCBpbiB0aGlzIGNhc2UsIGFuZCwKKyAgICAgICAgICAgICAgICAjIHdpbGwgZmFpbCAtLSB3aGljaCBpcyBva2F5LiBIb3dldmVyLCBpZiB0aGVyZSBhcmUgPGxpYnJhcnk+CisgICAgICAgICAgICAgICAgIyBwcm9wZXJ0aWVzIHRoZXkgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc291cmNlcywgc28gdGhlIHNpemUgb2YgCisgICAgICAgICAgICAgICAgIyAnc291cmNlcycgd2lsbCBiZSBtb3JlIHRoYW4gMS4gSW4gdGhpcyBjYXNlLCB0aGUgYmFzZSBnZW5lcmF0b3IKKyAgICAgICAgICAgICAgICAjIHdpbGwganVzdCBjcmFzaCAtLSBhbmQgdGhhdCdzIG5vdCBnb29kLiBKdXN0IHVzZSBhIHF1aWNrIHRlc3QKKyAgICAgICAgICAgICAgICAjIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGxvY2FsIHJlc3VsdCA7CisgICAgICAgICAgICAgICAgaWYgISAkKHNvdXJjZXNbMl0pCisgICAgICAgICAgICAgICAgeyAgICAKKyAgICAgICAgICAgICAgICAgICAgIyBDb25zdHJ1Y3QgQ1BQIGFzIHVzdWFsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsgZ2VuZXJhdG9yLnJ1biAkKHByb2plY3QpICQobmFtZSkgCisgICAgICAgICAgICAgICAgICAgICAgOiAkKHByb3BlcnRpZXMpIDogJChzb3VyY2VzKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICMgSWYgT0ssIHByb2Nlc3MgVUlDX0ggd2l0aCBtb2MuIEl0J3MgcHJldHR5IGNsZWFyIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgb2JqZWN0IGdlbmVyYXRlZCB3aXRoIFVJQyB3aWxsIGhhdmUgUV9PQkpFQ1QgbWFjcm8uCisgICAgICAgICAgICAgICAgICAgIGlmICQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCBhY3Rpb24gPSBbICQocmVzdWx0WzFdKS5hY3Rpb24gXSA7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCBzb3VyY2VzID0gWyAkKGFjdGlvbikuc291cmNlcyBdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsIG1vY2NlZCA9IFsgZ2VuZXJhdG9ycy5jb25zdHJ1Y3QgJChwcm9qZWN0KSAkKG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ1BQIDogJChwcm9wZXJ0aWVzKSA6ICQoc291cmNlc1syXSkgXSA7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJChtb2NjZWRbMi1dKSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuICQocmVzdWx0KSA7CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3RlciBbIG5ldyBxdDo6dWljLWNwcC1nZW5lcmF0b3IgXSA7CisgICAgICAgIAorICAgICAgICAjIEZpbmFsbHksIGRlY2xhcmUgcHJlYnVpbHQgdGFyZ2V0IGZvciBRVCBsaWJyYXJ5LgorICAgICAgICBsb2NhbCB1c2FnZS1yZXF1aXJlbWVudHMgPSAKKyAgICAgICAgICAgICA8aW5jbHVkZT4kKC5wcmVmaXgpL2luY2x1ZGUgCisgICAgICAgICAgICAgPGRsbC1wYXRoPiQoLnByZWZpeCkvbGliCisgICAgICAgICAgICAgPGxpYnJhcnktcGF0aD4kKC5wcmVmaXgpL2xpYiAgICAgCisgICAgICAgICAgICAgPGFsbG93PnF0MworICAgICAgICAgICAgIDsgIAorICAgICAgICBsaWIgcXQgOiA6IDxuYW1lPnF0LW10IDx0aHJlYWRpbmc+bXVsdGkgOiA6ICQodXNhZ2UtcmVxdWlyZW1lbnRzKSA7CisgICAgICAgIGxpYiBxdCA6IDogPG5hbWU+cXQgPHRocmVhZGluZz5zaW5nbGUgOiA6ICQodXNhZ2UtcmVxdWlyZW1lbnRzKSA7ICAgICAgICAKKyAgICB9Cit9CisKK2NsYXNzIG1vYy1oLWdlbmVyYXRvci1xdDMgOiBnZW5lcmF0b3IKK3sKKyAgICBydWxlIF9faW5pdF9fICggKiA6ICogKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdG9yLl9faW5pdF9fICQoMSkgOiAkKDIpIDogJCgzKSA6ICQoNCkgOiAkKDUpIDogJCg2KSA6ICQoNykgOiAkKDgpIDogJCg5KSA7CisgICAgfQorCisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKiApCisgICAgeyAgICAgICAKKyAgICAgICAgaWYgISAkKHNvdXJjZXNbMl0pICYmIFsgJChzb3VyY2VzWzFdKS50eXBlIF0gPSBNT0NDQUJMRV9DUFAKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgbmFtZSA9IFsgJChzb3VyY2VzWzFdKS5uYW1lIF0gOworICAgICAgICAgICAgbmFtZSA9ICQobmFtZTpCKSA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxvY2FsIGEgPSBbIG5ldyBhY3Rpb24gJChzb3VyY2VzWzFdKSA6IHF0My5tb2MuY3BwIDoKKyAgICAgICAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICAgICAgCisgICAgICAgICAgICBsb2NhbCB0YXJnZXQgPSBbIAorICAgICAgICAgICAgICBuZXcgZmlsZS10YXJnZXQgJChuYW1lKSA6IE1PQyA6ICQocHJvamVjdCkgOiAkKGEpIF0gOworICAgICAgICAgICAgCisgICAgICAgICAgICBsb2NhbCByID0gWyB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciAkKHRhcmdldCkgXSA7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgIyBTaW5jZSB0aGlzIGdlbmVyYXRvciB3aWxsIHJldHVybiBhIEggdGFyZ2V0LCB0aGUgbGlua2luZyBnZW5lcmF0b3IKKyAgICAgICAgICAgICMgd29uJ3QgdXNlIGl0IGF0IGFsbCwgYW5kIHdvbid0IHNldCBhbnkgZGVwZW5kZW5jeSBvbiBpdC4gSG93ZXZlciwgCisgICAgICAgICAgICAjIHdlIG5lZWQgdGhlIHRhcmdldCB0byBiZSBzZWVuIGJ5IGJqYW0sIHNvIHRoYXQgdGhlIGRlcGVuZGVuY3kgZnJvbQorICAgICAgICAgICAgIyBzb3VyY2VzIHRvIHRoaXMgZ2VuZXJhdGVkIGhlYWRlciBpcyBkZXRlY3RlZCAtLSBpZiBKYW0gZG9lcyBub3QKKyAgICAgICAgICAgICMga25vdyBhYm91dCB0aGlzIHRhcmdldCwgaXQgd29uJ3QgZG8gYW55dGhpbmcuCisgICAgICAgICAgICBERVBFTkRTIGFsbCA6IFsgJChyKS5hY3R1YWxpemUgXSA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiAkKHIpIDsgICAgICAgICAgICAKKyAgICAgICAgfSAgICAgICAgCisgICAgfSAgICAKK30KKworCisjIFF1ZXJ5IHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiBUaGlzIGlzIG5lZWRlZCBpbiBhdCBsZWFzdCB0d28gc2NlbmFyaW9zLgorIyBGaXJzdCwgd2hlbiByZS11c2luZyBzb3VyY2VzIGZyb20gdGhlIFF0LVRyZWUuIFNlY29uZCwgdG8gImluc3RhbGwiIGN1c3RvbSBRdAorIyBwbHVnaW5zIHRvIHRoZSBRdC1UcmVlLgorIworcnVsZSBkaXJlY3RvcnkgCit7IAorICAgIHJldHVybiAkKC5wcmVmaXgpIDsgCit9IAorCisjIC1mIGZvcmNlcyBtb2MgdG8gaW5jbHVkZSB0aGUgcHJvY2Vzc2VkIHNvdXJjZSBmaWxlLiBXaXRob3V0IGl0LCBpdCB3b3VsZCB0aGluaworIyB0aGF0IC5xcHAgaXMgbm90IGEgaGVhZGVyIGFuZCB3b3VsZCBub3QgaW5jbHVkZSBpdCBmcm9tIHRoZSBnZW5lcmF0ZWQgZmlsZS4KKyMKK2FjdGlvbnMgbW9jIAoreworICAgICQoLnByZWZpeCkvYmluL21vYyAtZiAkKD4pIC1vICQoPCkKK30KKworIyBXaGVuIG1vY2NpbmcgLmNwcCBmaWxlcywgd2UgZG9uJ3QgbmVlZCAtZiwgb3RoZXJ3aXNlIGdlbmVyYXRlZCBjb2RlIHdpbGwKKyMgaW5jbHVkZSAuY3BwIGFuZCB3ZSdsbCBnZXQgZHVwbGljYXRlZCBzeW1ib2xzLgorIworYWN0aW9ucyBtb2MuY3BwCit7CisgICAgJCgucHJlZml4KS9iaW4vbW9jICQoPikgLW8gJCg8KQorfQorCisKK3NwYWNlID0gIiAiIDsKKworIyBTb21ldGltZXMgaXQncyByZXF1aXJlZCB0byBtYWtlICdwbHVnaW5zJyBhdmFpbGFibGUgZHVyaW5nIHVpYyBpbnZvY2F0aW9uLiBUbworIyBoZWxwIHdpdGggdGhpcyB3ZSBhZGQgcGF0aHMgdG8gYWxsIGRlcGVuZGVuY3kgbGlicmFyaWVzIHRvIHVpYyBjb21tYW5lIGxpbmUuCisjIFRoZSBpbnRlbnRpb24gaXMgdGhhdCBpdCdzIHBvc3NpYmxlIHRvIHdyaXRlCisjICAgIAorIyAgICAgZXhlIGEgOiAuLi4gYS51aSAuLi4gOiA8dXNlcz5zb21lX3BsdWdpbiA7IAorIyAKKyMgYW5kIGhhdmUgZXZlcnl0aGluZyB3b3JrLiBXZSdkIGFkZCBxdWl0ZSBhIGJ1bmNoIG9mIHVucmVsYXRlZCBwYXRocyBidXQgaXQKKyMgd29uJ3QgaHVydC4KKyMKK2ZsYWdzIHF0My51aWMtaCBMSUJSQVJZX1BBVEggPHhkbGwtcGF0aD4gOworYWN0aW9ucyB1aWMtaAoreworICAgICQoLnByZWZpeCkvYmluL3VpYyAkKD4pIC1vICQoPCkgLUwkKHNwYWNlKSQoTElCUkFSWV9QQVRIKQorfQorCisKK2ZsYWdzIHF0My51aWMtY3BwIExJQlJBUllfUEFUSCA8eGRsbC1wYXRoPiA7CisjIFRoZSBzZWNvbmQgdGFyZ2V0IGlzIHVpYy1nZW5lcmF0ZWQgaGVhZGVyIG5hbWUuIEl0J3MgcGxhY2VkIGluIGJ1aWxkIGRpciwgYnV0CisjIHdlIHdhbnQgdG8gaW5jbHVkZSBpdCB1c2luZyBvbmx5IGJhc2VuYW1lLgorYWN0aW9ucyB1aWMtY3BwCit7CisgICAgJCgucHJlZml4KS9iaW4vdWljICQoPlsxXSkgLWkgJCg+WzJdOkQ9KSAtbyAkKDwpIC1MJChzcGFjZSkkKExJQlJBUllfUEFUSCkKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcXQ0LmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcXQ0LmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2FhYzYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9xdDQuamFtCkBAIC0wLDAgKzEsNzU1IEBACisjIENvcHlyaWdodCAyMDAyLTIwMDYgVmxhZGltaXIgUHJ1cworIyBDb3B5cmlnaHQgMjAwNSBBbG8gU2FydgorIyBDb3B5cmlnaHQgMjAwNS0yMDA5IEp1ZXJnZW4gSHVub2xkCisjCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQorIyBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgUXQ0IGxpYnJhcnkgc3VwcG9ydCBtb2R1bGUKKyMKKyMgVGhlIG1vZHVsZSBhdHRlbXB0cyB0byBhdXRvLWRldGVjdCBRVCBpbnN0YWxsYXRpb24gbG9jYXRpb24gZnJvbSBRVERJUgorIyBlbnZpcm9ubWVudCB2YXJpYWJsZTsgZmFpbGluZyB0aGF0LCBpbnN0YWxsYXRpb24gbG9jYXRpb24gY2FuIGJlIHBhc3NlZCBhcworIyBhcmd1bWVudDoKKyMKKyMgdG9vbHNldC51c2luZyBxdDQgOiAvdXNyL2xvY2FsL1Ryb2xsdGVjaC9RdC00LjAuMCA7CisjCisjIFRoZSBtb2R1bGUgc3VwcG9ydHMgY29kZSBnZW5lcmF0aW9uIGZyb20gLnVpIGFuZCAucXJjIGZpbGVzLCBhcyB3ZWxsIGFzCisjIHJ1bm5pbmcgdGhlIG1vYyBwcmVwcm9jZXNzb3Igb24gaGVhZGVycy4gTm90ZSB0aGF0IHlvdSBtdXN0IGxpc3QgYWxsIHlvdXIKKyMgbW9jLWFibGUgaGVhZGVycyBpbiBzb3VyY2VzLgorIworIyBFeGFtcGxlOgorIworIyAgICAgZXhlIG15YXBwIDogbXlhcHAuY3BwIG15YXBwLmggbXlhcHAudWkgbXlhcHAucXJjCisjICAgICAgICAgICAgICAgICAvcXQ0Ly9RdEd1aSAvcXQ0Ly9RdE5ldHdvcmsgOworIworIyBJdCdzIGFsc28gcG9zc2libGUgdG8gcnVuIG1vYyBvbiBjcHAgc291cmNlczoKKyMKKyMgICBpbXBvcnQgY2FzdCA7CisjCisjICAgZXhlIG15YXBwIDogbXlhcHAuY3BwIFsgY2FzdCBfIG1vY2NhYmxlLWNwcCA6IG15YXBwLmNwcCBdIC9xdDQvL1F0R3VpIDsKKyMKKyMgV2hlbiBtb2NjaW5nIHNvdXJjZSBmaWxlIG15YXBwLmNwcCB5b3UgbmVlZCB0byBpbmNsdWRlICJteWFwcC5tb2MiIGZyb20KKyMgbXlhcHAuY3BwLiBXaGVuIG1vY2NpbmcgLmggZmlsZXMsIHRoZSBvdXRwdXQgb2YgbW9jIHdpbGwgYmUgYXV0b21hdGljYWxseQorIyBjb21waWxlZCBhbmQgbGlua2VkIGluLCB5b3UgZG9uJ3QgbmVlZCBhbnkgaW5jbHVkZXMuCisjCisjIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIFF0IGd1aWRlbGluZXM6CisjIGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L21vYy5odG1sCisjCisjIFRoZSAucXJjIHByb2Nlc3NpbmcgdXRpbGl0eSBzdXBwb3J0cyB2YXJpb3VzIGNvbW1hbmQgbGluZSBvcHRpb24gKHNlZQorIyBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9yY2MuaHRtbCBmb3IgYSBjb21wbGV0ZSBsaXN0KS4gVGhlCisjIG1vZHVsZSBwcm92aWRlcyBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgdGhlICJvdXRwdXQgZmlsZSIgYW5kCisjICJpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBuYW1lIiBvcHRpb25zLiBPdGhlciBvcHRpb25zIGNhbiBiZSBzZXQgdGhyb3VnaAorIyB0aGUgPHJjY2ZsYWdzPiBidWlsZCBwcm9wZXJ0eS4gRS5nLiBpZiB5b3Ugd2lzaCB0aGUgY29tcHJlc3Npb24gc2V0dGluZ3MKKyMgdG8gYmUgbW9yZSBhZ2dyZXNzaXZlIHRoYW4gdGhlIGRlZmF1bHRzLCB5b3UgY2FuIGFwcGx5IHRoZW0gdG9vIGFsbCAucXJjCisjIGZpbGVzIGxpa2UgdGhpczoKKyMKKyMgICBwcm9qZWN0IG15LXF0LXByb2plY3QgOgorIyAgICAgICAgICAgICAgIHJlcXVpcmVtZW50cworIyAgICAgICAgICAgICAgIDxyY2NmbGFncz4iLWNvbXByZXNzIDkgLXRocmVzaG9sZCAxMCIKKyMgICAgICAgICAgIDsKKyMKKyMgT2YgY291cnNlLCB0aGlzIHByb3BlcnR5IGNhbiBhbHNvIGJlIHNwZWNpZmllZCBvbiBpbmRpdmlkdWFsIHRhcmdldHMuCisKKworaW1wb3J0IG1vZHVsZXMgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IGVycm9ycyA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgdG9vbHNldCA6IGZsYWdzIDsKK2ltcG9ydCBvcyA7CitpbXBvcnQgdmlydHVhbC10YXJnZXQgOworaW1wb3J0IHNjYW5uZXIgOworCisjIFF0M1N1cHBvcnQgY29udHJvbCBmZWF0dXJlCisjCisjIFF0NCBjb25maWd1cmUgZGVmYXVsdHMgdG8gYnVpbGQgUXQ0IGxpYnJhcmllcyB3aXRoIFF0M1N1cHBvcnQuCisjIFRoZSBhdXRvZGV0ZWN0aW9uIGlzIG1pc3NpbmcsIHNvIHdlIGRlZmF1bHQgdG8gZGlzYWJsZSBRdDNTdXBwb3J0LgorIyBUaGlzIHByZXZlbnRzIHRoZSB1c2VyIGZyb20gaW5hZHZlcnRlZGx5IHVzaW5nIGEgZGVwcmVjYXRlZCBBUEkuCisjCisjIFRoZSBRdDNTdXBwb3J0IGxpYnJhcnkgY2FuIGJlIGFjdGl2YXRlZCBieSBhZGRpbmcKKyMgIjxxdDNzdXBwb3J0Pm9uIiB0byByZXF1aXJlbWVudHMKKyMKKyMgVXNlICI8cXQzc3VwcG9ydD5vbjo8ZGVmaW5lPlFUM19TVVBQT1JUX1dBUk5JTkdTIgorIyB0byBnZXQgd2FybmluZ3MgYWJvdXQgZGVwcmVjYXRlZCBRdDMgc3VwcG9ydCBmdW50aW9ucyBhbmQgY2xhc3Nlcy4KKyMgRmlsZXMgcG9ydGVkIGJ5IHRoZSAicXQzdG80IiBjb252ZXJzaW9uIHRvb2wgY29udGFpbiBfdG9uc18gb2YKKyMgd2FybmluZ3MsIHNvIHRoaXMgZGVmaW5lIGlzIG5vdCBzZXQgYXMgZGVmYXVsdC4KKyMKKyMgVG9kbzogRGV0ZWN0IFF0M1N1cHBvcnQgZnJvbSBRdCdzIGNvbmZpZ3VyZSBkYXRhLgorIyAgICAgICBPciBhZGQgbW9yZSBhdXRvLWNvbmZpZ3VyYXRpb24gKGxpa2UgcHl0aG9uKS4KK2ZlYXR1cmUuZmVhdHVyZSBxdDNzdXBwb3J0IDogb2ZmIG9uIDogcHJvcGFnYXRlZCBsaW5rLWluY29tcGF0aWJsZSA7CisKKyMgVGhlIFF0IHZlcnNpb24gdXNlZCBmb3IgcmVxdWlyZW1lbnRzCisjIFZhbGlkIGFyZSA8cXQ+NC40IG9yIDxxdD40LjUuMAorIyBBdXRvLWRldGVjdGlvbiB2aWEgcW1ha2Ugc2V0cyAnPHF0Pm1ham9yLm1pbm9yLnBhdGNoJworZmVhdHVyZS5mZWF0dXJlIHF0IDogOiBwcm9wYWdhdGVkIDsKKworIyBFeHRyYSBmbGFncyBmb3IgcmNjCitmZWF0dXJlLmZlYXR1cmUgcmNjZmxhZ3MgOiA6IGZyZWUgOworCitwcm9qZWN0LmluaXRpYWxpemUgJChfX25hbWVfXykgOworcHJvamVjdCBxdCA7CisKKyMgU2F2ZSB0aGUgcHJvamVjdCBzbyB0aGF0IHdlIHRvbGVyYXRlICdpbXBvcnQgKyB1c2luZycgY29tYm8uCisucHJvamVjdCA9IFsgcHJvamVjdC5jdXJyZW50IF0gOworCisjIEhlbHBlciB1dGlscyBmb3IgZWFzeSBkZWJ1ZyBvdXRwdXQKK2lmIFsgTUFUQ0ggKC0tZGVidWctY29uZmlndXJhdGlvbikgOiBbIG1vZHVsZXMucGVlayA6IEFSR1YgXSBdCit7CisgICAgLmRlYnVnLWNvbmZpZ3VyYXRpb24gPSBUUlVFIDsKK30KKworbG9jYWwgcnVsZSBkZWJ1Zy1tZXNzYWdlICggbWVzc2FnZSAqICkKK3sKKyAgICBpZiAkKC5kZWJ1Zy1jb25maWd1cmF0aW9uKSA9IFRSVUUKKyAgICB7CisgICAgICAgIEVDSE8gbm90aWNlOiBbcXQ0LWNmZ10gJChtZXNzYWdlKSA7CisgICAgfQorfQorCisjIENhcHR1cmUgcW1ha2Ugb3V0cHV0IGxpbmUgYnkgbGluZQorbG9jYWwgcnVsZSByZWFkLW91dHB1dCAoIGNvbnRlbnQgKQoreworICAgIGxvY2FsIGxpbmVzIDsKKyAgICBsb2NhbCBubCA9ICIKKyIgOworICAgIGxvY2FsIDw8ID0gIihbXiQobmwpXSopWyQobmwpXSguKikiIDsKKyAgICBsb2NhbCBsaW5lKyA9IFsgTUFUQ0ggIiQoPDwpIiA6ICIkKGNvbnRlbnQpIiBdIDsKKyAgICB3aGlsZSAkKGxpbmUrKQorICAgIHsKKyAgICAgICAgbGluZXMgKz0gJChsaW5lK1sxXSkgOworICAgICAgICBsaW5lKyA9IFsgTUFUQ0ggIiQoPDwpIiA6ICIkKGxpbmUrWzJdKSIgXSA7CisgICAgfQorICAgIHJldHVybiAkKGxpbmVzKSA7Cit9CisKKyMgQ2FwdHVyZSBRdCB2ZXJzaW9uIGZyb20gcW1ha2UKK2xvY2FsIHJ1bGUgY2hlY2stdmVyc2lvbiAoIGJpbl9wcmVmaXggKQoreworICAgIGZ1bGwtY21kID0gJChiaW5fcHJlZml4KSIvcW1ha2UgLXYiIDsKKyAgICBkZWJ1Zy1tZXNzYWdlIFJ1bm5pbmcgJyQoZnVsbC1jbWQpJyA7CisgICAgbG9jYWwgb3V0cHV0ID0gWyBTSEVMTCAkKGZ1bGwtY21kKSBdIDsKKyAgICBmb3IgbGluZSBpbiBbIHJlYWQtb3V0cHV0ICQob3V0cHV0KSBdCisgICAgeworICAgICAgICAjIFBhcnNlIHRoZSBvdXRwdXQgdG8gZ2V0IGFsbCB0aGUgcmVzdWx0cy4KKyAgICAgICAgaWYgWyBNQVRDSCAiUU1ha2UiIDogJChsaW5lKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgICMgU2tpcCBmaXJzdCBsaW5lIG9mIG91dHB1dAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA9IFsgTUFUQ0ggIihbMC05XSopXFwuKFswLTldKilcXC4oWzAtOV0qKSIgOiAkKGxpbmUpIF0gOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHRlbXApIDsKK30KKworIyBWYWxpZGF0ZSB0aGUgdmVyc2lvbiBzdHJpbmcgYW5kIGV4dHJhY3QgdGhlIG1ham9yL21pbm9yIHBhcnQgd2UgY2FyZSBhYm91dC4KKyMKK2xvY2FsIHJ1bGUgc3BsaXQtdmVyc2lvbiAoIHZlcnNpb24gKQoreworICAgIGxvY2FsIG1ham9yLW1pbm9yID0gWyBNQVRDSCBeKFswLTldKylcLihbMC05XSspKC4qKSQgOiAkKHZlcnNpb24pIDogMSAyIDMgXSA7CisgICAgaWYgISAkKG1ham9yLW1pbm9yWzJdKSB8fCAkKG1ham9yLW1pbm9yWzNdKQorICAgIHsKKyAgICAgICAgRUNITyAiV2FybmluZzogJ3VzaW5nIHF0JyBleHBlY3RzIGEgdHdvIHBhcnQgKG1ham9yLCBtaW5vcikgdmVyc2lvbiBudW1iZXI7IGdvdCIgJCh2ZXJzaW9uKSBpbnN0ZWFkIDsKKworICAgICAgICAjIEFkZCBhIHplcm8gdG8gYWNjb3VudCBmb3IgdGhlIG1pc3NpbmcgZGlnaXQgaWYgbmVjZXNzYXJ5LgorICAgICAgICBtYWpvci1taW5vciArPSAwIDsKKyAgICB9CisKKyAgICByZXR1cm4gJChtYWpvci1taW5vclsxXSkgJChtYWpvci1taW5vclsyXSkgOworfQorCisjIEluaXRpYWxpemUgdGhlIFFUIHN1cHBvcnQgbW9kdWxlLgorIyBQYXJhbWV0ZXJzOgorIyAtICdwcmVmaXgnICAgIHBhcmFtZXRlciB0ZWxscyB3aGVyZSBRdCBpcyBpbnN0YWxsZWQuCisjIC0gJ2Z1bGxfYmluJyAgb3B0aW9uYWwgZnVsbCBwYXRoIHRvIFF0IGJpbmFyaWVzIChxbWFrZSxtb2MsdWljLHJjYykKKyMgLSAnZnVsbF9pbmMnICBvcHRpb25hbCBmdWxsIHBhdGggdG8gUXQgdG9wLWxldmVsIGluY2x1ZGUgZGlyZWN0b3J5CisjIC0gJ2Z1bGxfbGliJyAgb3B0aW9uYWwgZnVsbCBwYXRoIHRvIFF0IGxpYnJhcnkgZGlyZWN0b3J5CisjIC0gJ3ZlcnNpb24nICAgb3B0aW9uYWwgdmVyc2lvbiBvZiBRdCwgZWxzZSBhdXRvZGV0ZWN0ZWQgdmlhICdxbWFrZSAtdicKKyMgLSAnY29uZGl0aW9uJyBvcHRpb25hbCByZXF1aXJlbWVudHMKK3J1bGUgaW5pdCAoIHByZWZpeCA6IGZ1bGxfYmluID8gOiBmdWxsX2luYyA/IDogZnVsbF9saWIgPyA6IHZlcnNpb24gPyA6IGNvbmRpdGlvbiAqICkKK3sKKyAgICBwcm9qZWN0LnB1c2gtY3VycmVudCAkKC5wcm9qZWN0KSA7CisKKyAgICBkZWJ1Zy1tZXNzYWdlICI9PT09IENvbmZpZ3VyaW5nIFF0IC4uLiA9PT09IiA7CisgICAgZm9yIGxvY2FsIHYgaW4gdmVyc2lvbiBjbWQtb3ItcHJlZml4IGluY2x1ZGVzIGxpYnJhcmllcyBjb25kaXRpb24KKyAgICB7CisgICAgICAgIGlmICQoJCh2KSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVidWctbWVzc2FnZSAiICB1c2VyLXNwZWNpZmllZCAiJCh2KTogJyQoJCh2KSknIDsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgTmVlZGVkIGFzIGRlZmF1bHQgdmFsdWUKKyAgICAucHJlZml4ID0gJChwcmVmaXgpIDsKKworICAgICMgcHJlLWJ1aWxkIHBhdGhzIHRvIGRldGVjdCByZWluaXRpYWxpemF0aW9ucyBjaGFuZ2VzCisgICAgbG9jYWwgaW5jX3ByZWZpeCBsaWJfcHJlZml4IGJpbl9wcmVmaXggOworICAgIGlmICQoZnVsbF9pbmMpCisgICAgeworICAgICAgICBpbmNfcHJlZml4ID0gJChmdWxsX2luYykgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmNfcHJlZml4ID0gJChwcmVmaXgpL2luY2x1ZGUgOworICAgIH0KKyAgICBpZiAkKGZ1bGxfbGliKQorICAgIHsKKyAgICAgICAgbGliX3ByZWZpeCA9ICQoZnVsbF9saWIpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGliX3ByZWZpeCA9ICQocHJlZml4KS9saWIgOworICAgIH0KKyAgICBpZiAkKGZ1bGxfYmluKQorICAgIHsKKyAgICAgICAgYmluX3ByZWZpeCA9ICQoZnVsbF9iaW4pIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmluX3ByZWZpeCA9ICQocHJlZml4KS9iaW4gOworICAgIH0KKworICAgICMgR2xvYmFsbHkgbmVlZGVkIHZhcmlhYmxlcworICAgIC5pbmNwcmVmaXggPSAkKGluY19wcmVmaXgpIDsKKyAgICAubGlicHJlZml4ID0gJChsaWJfcHJlZml4KSA7CisgICAgLmJpbnByZWZpeCA9ICQoYmluX3ByZWZpeCkgOworCisgICAgaWYgISAkKC5pbml0aWFsaXplZCkKKyAgICB7CisgICAgICAgICMgTWFrZSBzdXJlIHRoaXMgaXMgaW5pdGlhbGlzZWQgb25seSBvbmNlCisgICAgICAgIC5pbml0aWFsaXplZCA9IHRydWUgOworCisgICAgICAgICMgR2VuZXJhdGVzIGNwcCBmaWxlcyBmcm9tIGhlYWRlciBmaWxlcyB1c2luZyAibW9jIiB0b29sCisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXItc3RhbmRhcmQgcXQ0Lm1vYyA6IEggOiBDUFAobW9jXyUpIDogPGFsbG93PnF0NCA7CisKKyAgICAgICAgIyBUaGUgT0JKIHJlc3VsdCB0eXBlIGlzIGEgZmFrZSwgJ0gnIHdpbGwgYmUgcmVhbGx5IHByb2R1Y2VkLiBTZWUKKyAgICAgICAgIyBjb21tZW50cyBvbiB0aGUgZ2VuZXJhdG9yIGNsYXNzLCBkZWZpbmVkIGJlbG93IHRoZSAnaW5pdCcgZnVuY3Rpb24uCisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgdWljLWdlbmVyYXRvciBxdDQudWljIDogVUkgOiBPQkogOgorICAgICAgICAgICAgPGFsbG93PnF0NCAgXSA7CisKKyAgICAgICAgIyBUaGUgT0JKIHJlc3VsdCB0eXBlIGlzIGEgZmFrZSBoZXJlIHRvby4KKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3RlciBbIG5ldyBtb2MtaC1nZW5lcmF0b3IKKyAgICAgICAgICAgIHF0NC5tb2MuaW5jIDogTU9DQ0FCTEVfQ1BQIDogT0JKIDogPGFsbG93PnF0NCBdIDsKKworICAgICAgICBnZW5lcmF0b3JzLnJlZ2lzdGVyIFsgbmV3IG1vYy1pbmMtZ2VuZXJhdG9yCisgICAgICAgICAgICBxdDQubW9jLmluYyA6IE1PQ0NBQkxFX0ggOiBPQkogOiA8YWxsb3c+cXQ0IF0gOworCisgICAgICAgICMgR2VuZXJhdGVzIC5jcHAgZmlsZXMgZnJvbSAucXJjIGZpbGVzLgorICAgICAgICBnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIHF0NC5yY2MgOiBRUkMgOiBDUFAocXJjXyUpIDogPGFsbG93PnF0NCA7CisKKyAgICAgICAgIyBkZXBlbmRlbmN5IHNjYW5uZXIgZm9yIHdyYXBwZWQgZmlsZXMuCisgICAgICAgIHR5cGUuc2V0LXNjYW5uZXIgUVJDIDogcXJjLXNjYW5uZXIgOworCisgICAgICAgICMgU2F2ZSB2YWx1ZSBvZiBmaXJzdCBvY2N1cmluZyBwcmVmaXgKKyAgICAgICAgLlBSRUZJWCA9ICQocHJlZml4KSA7CisgICAgfQorCisgICAgaWYgJCh2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgbWFqb3ItbWlub3IgPSBbIHNwbGl0LXZlcnNpb24gJCh2ZXJzaW9uKSBdIDsKKyAgICAgICAgdmVyc2lvbiA9ICQobWFqb3ItbWlub3I6Sj0uKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZlcnNpb24gPSBbIGNoZWNrLXZlcnNpb24gJChiaW5fcHJlZml4KSBdIDsKKyAgICAgICAgaWYgJCh2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJzaW9uID0gJCh2ZXJzaW9uOko9LikgOworICAgICAgICB9CisgICAgICAgIGRlYnVnLW1lc3NhZ2UgRGV0ZWN0ZWQgdmVyc2lvbiAnJCh2ZXJzaW9uKScgOworICAgIH0KKworICAgIGxvY2FsIHRhcmdldC1yZXF1aXJlbWVudHMgPSAkKGNvbmRpdGlvbikgOworCisgICAgIyBBZGQgdGhlIHZlcnNpb24sIGlmIGFueSwgdG8gdGhlIHRhcmdldCByZXF1aXJlbWVudHMuCisgICAgaWYgJCh2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgISAkKHZlcnNpb24pIGluIFsgZmVhdHVyZS52YWx1ZXMgcXQgXQorICAgICAgICB7CisgICAgICAgICAgICBmZWF0dXJlLmV4dGVuZCBxdCA6ICQodmVyc2lvbikgOworICAgICAgICB9CisgICAgICAgIHRhcmdldC1yZXF1aXJlbWVudHMgKz0gPHF0PiQodmVyc2lvbjpFPWRlZmF1bHQpIDsKKyAgICB9CisKKyAgICBsb2NhbCB0YXJnZXQtb3MgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyB0YXJnZXQtb3MgOiAkKGNvbmRpdGlvbikgXSA7CisgICAgaWYgISAkKHRhcmdldC1vcykKKyAgICB7CisgICAgICAgIHRhcmdldC1vcyA/PSBbIGZlYXR1cmUuZGVmYXVsdHMgdGFyZ2V0LW9zIF0gOworICAgICAgICB0YXJnZXQtb3MgPSAkKHRhcmdldC1vczpHPSkgOworICAgICAgICB0YXJnZXQtcmVxdWlyZW1lbnRzICs9IDx0YXJnZXQtb3M+JCh0YXJnZXQtb3MpIDsKKyAgICB9CisKKyAgICAjIEJ1aWxkIGV4YWN0IHJlcXVpcmVtZW50cyBmb3IgdGhlIHRvb2xzCisgICAgbG9jYWwgdG9vbHMtcmVxdWlyZW1lbnRzID0gJCh0YXJnZXQtcmVxdWlyZW1lbnRzOko9LykgOworCisgICAgZGVidWctbWVzc2FnZSAiRGV0YWlscyBvZiB0aGlzIFF0IGNvbmZpZ3VyYXRpb246IiA7CisgICAgZGVidWctbWVzc2FnZSAiICBwcmVmaXg6ICAgICAgIiAnJChwcmVmaXg6RT08ZW1wdHk+KScgOworICAgIGRlYnVnLW1lc3NhZ2UgIiAgYmluYXJ5IHBhdGg6ICIgJyQoYmluX3ByZWZpeDpFPTxlbXB0eT4pJyA7CisgICAgZGVidWctbWVzc2FnZSAiICBpbmNsdWRlIHBhdGg6IiAnJChpbmNfcHJlZml4OkU9PGVtcHR5PiknIDsKKyAgICBkZWJ1Zy1tZXNzYWdlICIgIGxpYnJhcnkgcGF0aDoiICckKGxpYl9wcmVmaXg6RT08ZW1wdHk+KScgOworICAgIGRlYnVnLW1lc3NhZ2UgIiAgdGFyZ2V0IHJlcXVpcmVtZW50czoiICckKHRhcmdldC1yZXF1aXJlbWVudHMpJyA7CisgICAgZGVidWctbWVzc2FnZSAiICB0b29sIHJlcXVpcmVtZW50czogICIgJyQodG9vbHMtcmVxdWlyZW1lbnRzKScgOworCisgICAgIyBzZXR1cCB0aGUgcGF0aHMgZm9yIHRoZSB0b29scworICAgIHRvb2xzZXQuZmxhZ3MgcXQ0Lm1vYyAuQklOUFJFRklYICQodG9vbHMtcmVxdWlyZW1lbnRzKSA6ICQoYmluX3ByZWZpeCkgOworICAgIHRvb2xzZXQuZmxhZ3MgcXQ0LnJjYyAuQklOUFJFRklYICQodG9vbHMtcmVxdWlyZW1lbnRzKSA6ICQoYmluX3ByZWZpeCkgOworICAgIHRvb2xzZXQuZmxhZ3MgcXQ0LnVpYyAuQklOUFJFRklYICQodG9vbHMtcmVxdWlyZW1lbnRzKSA6ICQoYmluX3ByZWZpeCkgOworCisgICAgIyBUT0RPOiAyMDA5LTAyLTEyOiBCZXR0ZXIgc3VwcG9ydCBmb3IgZGlyZWN0b3JpZXMKKyAgICAjIE1vc3QgbGlrZWx5IG5lZWRlZCBhcmUgc2VwYXJhdGUgZ2V0dGVycyBmb3I6IGluY2x1ZGUsbGlicmFyaWVzLGJpbmFyaWVzIGFuZCBzb3VyY2VzLgorICAgIHRvb2xzZXQuZmxhZ3MgcXQ0LmRpcmVjdG9yeSAuUFJFRklYICQodG9vbHMtcmVxdWlyZW1lbnRzKSA6ICQocHJlZml4KSA7CisKKyAgICAjIFRlc3QgZm9yIGEgYnVpbGRhYmxlIFF0LgorICAgIGlmIFsgZ2xvYiAkKC5wcmVmaXgpL0phbXJvb3QgXQorICAgIHsKKyAgICAgICAuYmphbS1xdCA9IHRydWUKKworICAgICAgICMgdGhpcyB3aWxsIGRlY2xhcmUgUXRDb3JlIChhbmQgcXRtYWluIG9uIDx0YXJnZXQtb3M+d2luZG93cykKKyAgICAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRDb3JlIDsKKyAgIH0KKyAgIGVsc2UKKyAgICMgU2V0dXAgY29tbW9uIHByZS1idWlsdCBRdC4KKyAgICMgU3BlY2lhbCBzZXR1cCBmb3IgUXRDb3JlIG9uIHdoaWNoIGV2ZXJ5dGhpbmcgZGVwZW5kcworICAgeworICAgICAgIGxvY2FsIGxpbmsgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyBsaW5rIDogJChjb25kaXRpb24pIF0gOworCisgICAgICAgbG9jYWwgdXNhZ2UtcmVxdWlyZW1lbnRzID0KKyAgICAgICAgICAgPGluY2x1ZGU+JCguaW5jcHJlZml4KQorICAgICAgICAgICA8bGlicmFyeS1wYXRoPiQoLmxpYnByZWZpeCkKKyAgICAgICAgICAgPHRocmVhZGluZz5tdWx0aQorICAgICAgICAgICA8YWxsb3c+cXQ0IDsKKworICAgICAgIGlmICQobGluaykgaW4gc2hhcmVkCisgICAgICAgeworICAgICAgICAgICB1c2FnZS1yZXF1aXJlbWVudHMgKz0gPGRsbC1wYXRoPiQoLmxpYnByZWZpeCkgOworICAgICAgIH0KKworICAgICAgIGxvY2FsIHN1ZmZpeCA7CisKKyAgICAgICAjIFNpbmNlIFF0LTQuMiwgZGVidWcgdmVyc2lvbnMgb24gdW5peCBoYXZlIHRvIGJlIGJ1aWx0CisgICAgICAgIyBzZXBhcmF0ZWx5IGFuZCB0aGVyZWZvcmUgaGF2ZSBubyBzdWZmaXguCisgICAgICAgLnN1ZmZpeF92ZXJzaW9uID0gIiIgOworICAgICAgIC5zdWZmaXhfZGVidWcgPSAiIiA7CisKKyAgICAgICAjIENvbnRyb2wgZmxhZyBmb3IgYXV0by1jb25maWd1cmF0aW9uIG9mIHRoZSBkZWJ1ZyBsaWJyYXJpZXMuCisgICAgICAgIyBUaGlzIHNldHVwIHJlcXVpcmVzIFF0ICdjb25maWd1cmUgLWRlYnVnLWFuZC1yZWxlYXNlJy4KKyAgICAgICAjIE9ubHkgYXZhaWxhYmxlIG9uIHNvbWUgcGxhdGZvcm1zLgorICAgICAgICMgVG9EbzogMjAwOS0wMi0xMjogTWF5YmUgdGhyb3cgdGhpcyBhd2F5IGFuZAorICAgICAgICMgcmVxdWlyZSBzZXBhcmF0ZSBzZXR1cCB3aXRoIDx2YXJpYW50PmRlYnVnIGFzIGNvbmRpdGlvbi4KKyAgICAgICAuaGF2ZV9zZXBhcmF0ZV9kZWJ1ZyA9IEZBTFNFIDsKKworICAgICAgICMgU2V0dXAgb3RoZXIgcGxhdGZvcm1zCisgICAgICAgaWYgJCh0YXJnZXQtb3MpIGluIHdpbmRvd3MgY3lnd2luCisgICAgICAgeworICAgICAgICAgICAuaGF2ZV9zZXBhcmF0ZV9kZWJ1ZyA9IFRSVUUgOworCisgICAgICAgICAgICMgT24gTlQsIHRoZSBzaGFyZWQgbGlicyBoYXZlICI0IiBzdWZmaXgsIGFuZCAiZCIgc3VmZml4IGluIGRlYnVnIGJ1aWxkcy4KKyAgICAgICAgICAgaWYgJChsaW5rKSBpbiBzaGFyZWQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5zdWZmaXhfdmVyc2lvbiA9ICI0IiA7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgLnN1ZmZpeF9kZWJ1ZyA9ICJkIiA7CisKKyAgICAgICAgICAgIyBPbiBXaW5kb3dzIHdlIG11c3QgbGluayBhZ2FpbnN0IHRoZSBxdG1haW4gbGlicmFyeQorICAgICAgICAgICBsaWIgcXRtYWluCisgICAgICAgICAgICAgICA6ICMgc291cmNlcworICAgICAgICAgICAgICAgOiAjIHJlcXVpcmVtZW50cworICAgICAgICAgICAgICAgICAgPG5hbWU+cXRtYWluJCguc3VmZml4X2RlYnVnKQorICAgICAgICAgICAgICAgICAgPHZhcmlhbnQ+ZGVidWcKKyAgICAgICAgICAgICAgICAgICQodGFyZ2V0LXJlcXVpcmVtZW50cykKKyAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICBsaWIgcXRtYWluCisgICAgICAgICAgICAgICA6ICMgc291cmNlcworICAgICAgICAgICAgICAgOiAjIHJlcXVpcmVtZW50cworICAgICAgICAgICAgICAgICAgIDxuYW1lPnF0bWFpbgorICAgICAgICAgICAgICAgICAgICQodGFyZ2V0LXJlcXVpcmVtZW50cykKKyAgICAgICAgICAgICAgIDsKKyAgICAgICB9CisgICAgICAgZWxzZSBpZiAkKHRhcmdldC1vcykgPSBkYXJ3aW4KKyAgICAgICB7CisgICAgICAgICAgICMgT24gTWFjT1MgWCwgYm90aCBkZWJ1ZyBhbmQgcmVsZWFzZSBsaWJyYXJpZXMgYXJlIGF2YWlsYWJsZS4KKyAgICAgICAgICAgLnN1ZmZpeF9kZWJ1ZyA9ICJfZGVidWciIDsKKworICAgICAgICAgICAuaGF2ZV9zZXBhcmF0ZV9kZWJ1ZyA9IFRSVUUgOworCisgICAgICAgICAgIGFsaWFzIHF0bWFpbiA7CisgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICAgIGFsaWFzIHF0bWFpbiA6IDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisgICAgICAgfQorCisgICAgICAgbGliIFF0Q29yZSA6IHF0bWFpbgorICAgICAgICAgICA6ICMgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgPG5hbWU+UXRDb3JlJCguc3VmZml4X3ZlcnNpb24pCisgICAgICAgICAgICAgJCh0YXJnZXQtcmVxdWlyZW1lbnRzKQorICAgICAgICAgICA6ICMgZGVmYXVsdC1idWlsZAorICAgICAgICAgICA6ICMgdXNhZ2UtcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgPGRlZmluZT5RVF9DT1JFX0xJQgorICAgICAgICAgICAgIDxkZWZpbmU+UVRfTk9fREVCVUcKKyAgICAgICAgICAgICA8aW5jbHVkZT4kKC5pbmNwcmVmaXgpL1F0Q29yZQorICAgICAgICAgICAgICQodXNhZ2UtcmVxdWlyZW1lbnRzKQorICAgICAgICAgICA7CisKKyAgICAgICBpZiAkKC5oYXZlX3NlcGFyYXRlX2RlYnVnKSA9IFRSVUUKKyAgICAgICB7CisgICAgICAgICAgIGRlYnVnLW1lc3NhZ2UgQ29uZmlndXJlIGRlYnVnIGxpYnJhcmllcyB3aXRoIHN1ZmZpeCAnJCguc3VmZml4X2RlYnVnKScgOworCisgICAgICAgICAgIGxpYiBRdENvcmUgOiAkKG1haW4pCisgICAgICAgICAgICAgICA6ICMgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgICAgIDxuYW1lPlF0Q29yZSQoLnN1ZmZpeF9kZWJ1ZykkKC5zdWZmaXhfdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgPHZhcmlhbnQ+ZGVidWcKKyAgICAgICAgICAgICAgICAgJCh0YXJnZXQtcmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgICAgOiAjIGRlZmF1bHQtYnVpbGQKKyAgICAgICAgICAgICAgIDogIyB1c2FnZS1yZXF1aXJlbWVudHMKKyAgICAgICAgICAgICAgICAgPGRlZmluZT5RVF9DT1JFX0xJQgorICAgICAgICAgICAgICAgICA8aW5jbHVkZT4kKC5pbmNwcmVmaXgpL1F0Q29yZQorICAgICAgICAgICAgICAgICAkKHVzYWdlLXJlcXVpcmVtZW50cykKKyAgICAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgSW5pdGlhbGlzaW5nIHRoZSByZW1haW5pbmcgbGlicmFyaWVzIGlzIGNhbm9uaWNhbAorICAgICMgcGFyYW1ldGVycyAnbW9kdWxlJyA6ICdkZXBlbmRzLW9uJyA6ICd1c2FnZS1kZWZpbmUnIDogJ3JlcXVpcmVtZW50cycgOiAnaW5jbHVkZScKKyAgICAjICdpbmNsdWRlJyBvbmx5IGZvciBub24tY2Fub25pY2FsIGluY2x1ZGUgcGF0aHMuCisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0R3VpICAgICA6IFF0Q29yZSA6IFFUX0dVSV9MSUIgICAgIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0TmV0d29yayA6IFF0Q29yZSA6IFFUX05FVFdPUktfTElCIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0U3FsICAgICA6IFF0Q29yZSA6IFFUX1NRTF9MSUIgICAgIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0WG1sICAgICA6IFF0Q29yZSA6IFFUX1hNTF9MSUIgICAgIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXQzU3VwcG9ydCA6IFF0R3VpIFF0TmV0d29yayBRdFhtbCBRdFNxbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUVRfUVQzU1VQUE9SVF9MSUIgUVQzX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDxxdDNzdXBwb3J0Pm9uICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgIyBEdW1teSB0YXJnZXQgdG8gZW5hYmxlICI8cXQzc3VwcG9ydD5vZmYiIGFuZAorICAgICMgIjxsaWJyYXJ5Pi9xdC8vUXQzU3VwcG9ydCIgYXQgdGhlIHNhbWUgdGltZS4gVGhpcyBlbmFibGVzIHF1aWNrCisgICAgIyBzd2l0Y2hpbmcgZnJvbSBvbmUgdG8gdGhlIG90aGVyIGZvciB0ZXN0L3BvcnRpbmcgcHVycG9zZXMuCisgICAgYWxpYXMgUXQzU3VwcG9ydCA6IDogPHF0M3N1cHBvcnQ+b2ZmICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgIyBPcGVuR2wgU3VwcG9ydAorICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdE9wZW5HTCA6IFF0R3VpIDogUVRfT1BFTkdMX0xJQiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgIyBTVkctU3VwcG9ydCAoUXQgNC4xKQorICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdFN2ZyA6IFF0WG1sIFF0T3BlbkdMIDogUVRfU1ZHX0xJQiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgIyBUZXN0LVN1cHBvcnQgKFF0IDQuMSkKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRUZXN0IDogUXRDb3JlIDogOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKworICAgICMgUXQgZGVzaWduZXIgbGlicmFyeQorICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdERlc2lnbmVyIDogUXRHdWkgUXRYbWwgOiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdERlc2lnbmVyQ29tcG9uZW50cyA6IFF0R3VpIFF0WG1sIDogOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKworICAgICMgU3VwcG9ydCBmb3IgZHluYW1pYyBXaWRnZXRzIChRdCA0LjEpCisgICAgYWRkLXN0YXRpYy1saWJyYXJ5ICBRdFVpVG9vbHMgOiBRdEd1aSBRdFhtbCA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgIyBEQnVzLVN1cHBvcnQgKFF0IDQuMikKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXREQnVzIDogUXRYbWwgOiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgIyBTY3JpcHQtRW5naW5lIChRdCA0LjMpCisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0U2NyaXB0IDogUXRHdWkgUXRYbWwgOiBRVF9TQ1JJUFRfTElCIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisKKyAgICAjIFRvb2xzIGZvciB0aGUgU2NyaXB0LUVuZ2luZSAoUXQgNC41KQorICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdFNjcmlwdFRvb2xzIDogUXRTY3JpcHQgOiBRVF9TQ1JJUFRUT09MU19MSUIgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKworICAgICMgV2ViS2l0IChRdCA0LjQpCisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0V2ViS2l0IDogUXRHdWkgOiBRVF9XRUJLSVRfTElCIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisKKyAgICAjIFBob25vbiBNdWx0aW1lZGlhIChRdCA0LjQpCisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IHBob25vbiA6IFF0R3VpIFF0WG1sIDogUVRfUEhPTk9OX0xJQiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgIyBNdWx0aW1lZGlhIGVuZ2luZSAoUXQgNC42KQorICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdE11bHRpbWVkaWEgOiBRdEd1aSA6IFFUX01VTFRJTUVESUFfTElCIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisKKyAgICAjIFhtbFBhdHRlcm5zLUVuZ2luZSAoUXQgNC40KQorICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdFhtbFBhdHRlcm5zIDogUXROZXR3b3JrIDogUVRfWE1MUEFUVEVSTlNfTElCIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisKKyAgICAjIEhlbHAtRW5naW5lIChRdCA0LjQpCisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0SGVscCAgICA6IFF0R3VpIFF0U3FsIFF0WG1sIDogOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRDTHVjZW5lIDogUUNvcmUgUXRTcWwgUXRYbWwgOiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgIyBRTUwtRW5naW5lIChRdCA0LjcpCisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0RGVjbGFyYXRpdmUgOiBRdEd1aSBRdFhtbCA6IDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisKKyAgICAjIEFzc2lzdGFudENsaWVudCBTdXBwb3J0CisgICAgIyBDb21wYXQgbGlicmFyeSByZW1vdmVkIGluIDQuNy4wCisgICAgIyBQcmUtNC40IGhlbHAgc3lzdGVtLCB1c2UgUXRIZWxwIGZvciBuZXcgcHJvZ3JhbXMKKyAgICBpZiAkKHZlcnNpb24pIDwgIjQuNyIKKyAgICB7CisgICAgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0QXNzaXN0YW50Q2xpZW50IDogUXRHdWkgOiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOiBRdEFzc2lzdGFudCA7CisgICAgfQorICAgIGRlYnVnLW1lc3NhZ2UgIj09PT0gQ29uZmlndXJlZCBRdC0kKHZlcnNpb24pID09PT0iIDsKKworICAgIHByb2plY3QucG9wLWN1cnJlbnQgOworfQorCitydWxlIGluaXRpYWxpemVkICggKQoreworICAgIHJldHVybiAkKC5pbml0aWFsaXplZCkgOworfQorCisKKworIyBUaGlzIGN1c3RvbSBnZW5lcmF0b3IgaXMgbmVlZGVkIGJlY2F1c2UgaW4gUVQ0LCBVSSBmaWxlcyBhcmUgdHJhbnNsYXRlZCBvbmx5CisjIGludG8gSCBmaWxlcywgYW5kIG5vIEMrKyBmaWxlcyBhcmUgY3JlYXRlZC4gRnVydGhlciwgdGhlIEggZmlsZXMgbmVlZCBub3QgYmUKKyMgcGFzc2VkIHZpYSBNT0MuIFRoZSBoZWFkZXIgaXMgdXNlZCBvbmx5IHZpYSBpbmNsdXNpb24uIElmIHdlIGRlZmluZSBhIHN0YW5kYXJkCisjIFVJIC0+IEggZ2VuZXJhdG9yLCBCb29zdC5CdWlsZCB3aWxsIHJ1biBNT0Mgb24gSCwgYW5kIHRoZW4gY29tcGlsZSB0aGUKKyMgcmVzdWx0aW5nIGNwcC4gSXQgd2lsbCBnaXZlIGEgd2FybmluZywgc2luY2Ugb3V0cHV0IGZyb20gbW9jIHdpbGwgYmUgZW1wdHkuCisjCisjIFRoaXMgZ2VuZXJhdG9yIGlzIGRlY2xhcmVkIHdpdGggYSBVSSAtPiBPQkogc2lnbmF0dXJlLCBzbyBpdCBnZXRzIGludm9rZWQgd2hlbgorIyBsaW5raW5nIGdlbmVyYXRvciB0cmllcyB0byBjb252ZXJ0IHNvdXJjZXMgdG8gT0JKLCBidXQgaXQgcHJvZHVjZXMgdGFyZ2V0IG9mCisjIHR5cGUgSC4gVGhpcyBpcyBub24tc3RhbmRhcmQsIGJ1dCBhbGxvd2VkLiBUaGF0IGhlYWRlciB3b24ndCBiZSBtb2NjZWQuCisjCitjbGFzcyB1aWMtZ2VuZXJhdG9yIDogZ2VuZXJhdG9yCit7CisgICAgcnVsZSBfX2luaXRfXyAoICogOiAqICkKKyAgICB7CisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOworICAgIH0KKworICAgIHJ1bGUgcnVuICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICogKQorICAgIHsKKyAgICAgICAgaWYgISAkKG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5hbWUgPSBbICQoc291cmNlc1swXSkubmFtZSBdIDsKKyAgICAgICAgICAgIG5hbWUgPSAkKG5hbWU6QikgOworICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgYSA9IFsgbmV3IGFjdGlvbiAkKHNvdXJjZXNbMV0pIDogcXQ0LnVpYyA6ICQocHJvcGVydHktc2V0KSBdIDsKKworICAgICAgICAjIFRoZSAndWlfJyBwcmVmaXggaXMgdG8gbWF0Y2ggcW1ha2UncyBkZWZhdWx0IGJlaGF2aW9yLgorICAgICAgICBsb2NhbCB0YXJnZXQgPSBbIG5ldyBmaWxlLXRhcmdldCB1aV8kKG5hbWUpIDogSCA6ICQocHJvamVjdCkgOiAkKGEpIF0gOworCisgICAgICAgIGxvY2FsIHIgPSBbIHZpcnR1YWwtdGFyZ2V0LnJlZ2lzdGVyICQodGFyZ2V0KSBdIDsKKworICAgICAgICAjIFNpbmNlIHRoaXMgZ2VuZXJhdG9yIHdpbGwgcmV0dXJuIGEgSCB0YXJnZXQsIHRoZSBsaW5raW5nIGdlbmVyYXRvcgorICAgICAgICAjIHdvbid0IHVzZSBpdCBhdCBhbGwsIGFuZCB3b24ndCBzZXQgYW55IGRlcGVuZGVuY3kgb24gaXQuIEhvd2V2ZXIsIHdlCisgICAgICAgICMgbmVlZCB0aGUgdGFyZ2V0IHRvIGJlIHNlZW4gYnkgYmphbSwgc28gdGhhdCBkZXBlbmRlbmN5IGZyb20gc291cmNlcyB0bworICAgICAgICAjIHRoaXMgZ2VuZXJhdGVkIGhlYWRlciBpcyBkZXRlY3RlZCAtLSBpZiBqYW0gZG9lcyBub3Qga25vdyBhYm91dCB0aGlzCisgICAgICAgICMgdGFyZ2V0LCBpdCB3b24ndCBkbyBhbnl0aGluZy4KKyAgICAgICAgREVQRU5EUyBhbGwgOiBbICQocikuYWN0dWFsaXplIF0gOworCisgICAgICAgIHJldHVybiAkKHIpIDsKKyAgICB9Cit9CisKKworY2xhc3MgbW9jLWgtZ2VuZXJhdG9yIDogZ2VuZXJhdG9yCit7CisgICAgcnVsZSBfX2luaXRfXyAoICogOiAqICkKKyAgICB7CisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOworICAgIH0KKworICAgIHJ1bGUgcnVuICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICogKQorICAgIHsKKyAgICAgICAgaWYgISAkKHNvdXJjZXNbMl0pICYmIFsgJChzb3VyY2VzWzFdKS50eXBlIF0gPSBNT0NDQUJMRV9DUFAKKyAgICAgICAgeworICAgICAgICAgICAgbmFtZSA9IFsgJChzb3VyY2VzWzBdKS5uYW1lIF0gOworICAgICAgICAgICAgbmFtZSA9ICQobmFtZTpCKSA7CisKKyAgICAgICAgICAgIGxvY2FsIGEgPSBbIG5ldyBhY3Rpb24gJChzb3VyY2VzWzFdKSA6IHF0NC5tb2MuaW5jIDoKKyAgICAgICAgICAgICAgICAkKHByb3BlcnR5LXNldCkgXSA7CisKKyAgICAgICAgICAgIGxvY2FsIHRhcmdldCA9IFsgbmV3IGZpbGUtdGFyZ2V0ICQobmFtZSkgOiBNT0MgOiAkKHByb2plY3QpIDogJChhKQorICAgICAgICAgICAgICAgIF0gOworCisgICAgICAgICAgICBsb2NhbCByID0gWyB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciAkKHRhcmdldCkgXSA7CisKKyAgICAgICAgICAgICMgU2luY2UgdGhpcyBnZW5lcmF0b3Igd2lsbCByZXR1cm4gYSBIIHRhcmdldCwgdGhlIGxpbmtpbmcgZ2VuZXJhdG9yCisgICAgICAgICAgICAjIHdvbid0IHVzZSBpdCBhdCBhbGwsIGFuZCB3b24ndCBzZXQgYW55IGRlcGVuZGVuY3kgb24gaXQuIEhvd2V2ZXIsCisgICAgICAgICAgICAjIHdlIG5lZWQgdGhlIHRhcmdldCB0byBiZSBzZWVuIGJ5IGJqYW0sIHNvIHRoYXQgZGVwZW5kZW5jeSBmcm9tCisgICAgICAgICAgICAjIHNvdXJjZXMgdG8gdGhpcyBnZW5lcmF0ZWQgaGVhZGVyIGlzIGRldGVjdGVkIC0tIGlmIGphbSBkb2VzIG5vdAorICAgICAgICAgICAgIyBrbm93IGFib3V0IHRoaXMgdGFyZ2V0LCBpdCB3b24ndCBkbyBhbnl0aGluZy4KKyAgICAgICAgICAgIERFUEVORFMgYWxsIDogWyAkKHIpLmFjdHVhbGl6ZSBdIDsKKworICAgICAgICAgICAgcmV0dXJuICQocikgOworICAgICAgICB9CisgICAgfQorfQorCisKK2NsYXNzIG1vYy1pbmMtZ2VuZXJhdG9yIDogZ2VuZXJhdG9yCit7CisgICAgcnVsZSBfX2luaXRfXyAoICogOiAqICkKKyAgICB7CisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOworICAgIH0KKworICAgIHJ1bGUgcnVuICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICogKQorICAgIHsKKyAgICAgICAgaWYgISAkKHNvdXJjZXNbMl0pICYmIFsgJChzb3VyY2VzWzFdKS50eXBlIF0gPSBNT0NDQUJMRV9ICisgICAgICAgIHsKKyAgICAgICAgICAgIG5hbWUgPSBbICQoc291cmNlc1swXSkubmFtZSBdIDsKKyAgICAgICAgICAgIG5hbWUgPSAkKG5hbWU6QikgOworCisgICAgICAgICAgICBsb2NhbCBhID0gWyBuZXcgYWN0aW9uICQoc291cmNlc1sxXSkgOiBxdDQubW9jLmluYyA6CisgICAgICAgICAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0gOworCisgICAgICAgICAgICBsb2NhbCB0YXJnZXQgPSBbIG5ldyBmaWxlLXRhcmdldCBtb2NfJChuYW1lKSA6IENQUCA6ICQocHJvamVjdCkgOgorICAgICAgICAgICAgICAgICQoYSkgXSA7CisKKyAgICAgICAgICAgICMgU2luY2UgdGhpcyBnZW5lcmF0b3Igd2lsbCByZXR1cm4gYSBIIHRhcmdldCwgdGhlIGxpbmtpbmcgZ2VuZXJhdG9yCisgICAgICAgICAgICAjIHdvbid0IHVzZSBpdCBhdCBhbGwsIGFuZCB3b24ndCBzZXQgYW55IGRlcGVuZGVuY3kgb24gaXQuIEhvd2V2ZXIsCisgICAgICAgICAgICAjIHdlIG5lZWQgdGhlIHRhcmdldCB0byBiZSBzZWVuIGJ5IGJqYW0sIHNvIHRoYXQgZGVwZW5kZW5jeSBmcm9tCisgICAgICAgICAgICAjIHNvdXJjZXMgdG8gdGhpcyBnZW5lcmF0ZWQgaGVhZGVyIGlzIGRldGVjdGVkIC0tIGlmIGphbSBkb2VzIG5vdAorICAgICAgICAgICAgIyBrbm93IGFib3V0IHRoaXMgdGFyZ2V0LCBpdCB3b24ndCBkbyBhbnl0aGluZy4KKyAgICAgICAgICAgIERFUEVORFMgYWxsIDogWyAkKHRhcmdldCkuYWN0dWFsaXplIF0gOworCisgICAgICAgICAgICByZXR1cm4gWyB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciAkKHRhcmdldCkgXSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyBRdWVyeSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gVGhpcyBpcyBuZWVkZWQgaW4gYXQgbGVhc3QgdHdvIHNjZW5hcmlvcy4KKyMgRmlyc3QsIHdoZW4gcmUtdXNpbmcgc291cmNlcyBmcm9tIHRoZSBRdC1UcmVlLiBTZWNvbmQsIHRvICJpbnN0YWxsIiBjdXN0b20gUXQKKyMgcGx1Z2lucyB0byB0aGUgUXQtVHJlZS4KKyMKK3J1bGUgZGlyZWN0b3J5Cit7CisgICAgcmV0dXJuICQoLlBSRUZJWCkgOworfQorCisjIEFkZCBhIHNoYXJlZCBRdCBsaWJyYXJ5LgorcnVsZSBhZGQtc2hhcmVkLWxpYnJhcnkgKCBsaWItbmFtZSA6IGRlcGVuZHMtb24gKiA6IHVzYWdlLWRlZmluZXMgKiA6IHJlcXVpcmVtZW50cyAqIDogIGluY2x1ZGUgPyApCit7CisgICAgIGFkZC1saWJyYXJ5ICQobGliLW5hbWUpIDogJCguc3VmZml4X3ZlcnNpb24pIDogJChkZXBlbmRzLW9uKSA6ICQodXNhZ2UtZGVmaW5lcykgOiAkKHJlcXVpcmVtZW50cykgOiAkKGluY2x1ZGUpIDsKK30KKworIyBBZGQgYSBzdGF0aWMgUXQgbGlicmFyeS4KK3J1bGUgYWRkLXN0YXRpYy1saWJyYXJ5ICggbGliLW5hbWUgOiBkZXBlbmRzLW9uICogOiB1c2FnZS1kZWZpbmVzICogOiByZXF1aXJlbWVudHMgKiA6IGluY2x1ZGUgPyApCit7CisgICAgIGFkZC1saWJyYXJ5ICQobGliLW5hbWUpIDogOiAkKGRlcGVuZHMtb24pIDogJCh1c2FnZS1kZWZpbmVzKSA6ICQocmVxdWlyZW1lbnRzKSA6ICQoaW5jbHVkZSkgOworfQorCisjIEFkZCBhIFF0IGxpYnJhcnkuCisjIFN0YXRpYyBsaWJzIGFyZSB1bnZlcnNpb25lZCwgd2hlcmVhcyBzaGFyZWQgbGlicyBoYXZlIHRoZSBtYWpvciBudW1iZXIgYXMgc3VmZml4LgorIyBDcmVhdGVzIGJvdGggcmVsZWFzZSBhbmQgZGVidWcgdmVyc2lvbnMgb24gcGxhdGZvcm1zIHdoZXJlIGJvdGggYXJlIGVuYWJsZWQgYnkgUXQgY29uZmlndXJlLgorIyBGbGFnczoKKyMgLSBsaWItbmFtZSBRdCBsaWJyYXJ5IE5hbWUKKyMgLSB2ZXJzaW9uICBRdCBtYWpvciBudW1iZXIgdXNlZCBhcyBzaGFyZWQgbGlicmFyeSBzdWZmaXggKFF0Q29yZTQuc28pCisjIC0gZGVwZW5kcy1vbiBvdGhlciBRdCBsaWJyYXJpZXMKKyMgLSB1c2FnZS1kZWZpbmVzIHRob3NlIGFyZSBzZXQgYnkgcW1ha2UsIHNvIHNldCB0aGVtIHdoZW4gdXNpbmcgdGhpcyBsaWJyYXJ5CisjIC0gcmVxdWlyZW1lbnRzIGFkZGlvbmFsIHJlcXVpcmVtZW50cworIyAtIGluY2x1ZGUgbm9uLWNhbm9uaWNhbCBpbmNsdWRlIHBhdGguIFRoZSBjYW5vbmljYWwgcGF0aCBpcyAkKC5pbmNwcmVmaXgpLyQobGliLW5hbWUpLgorcnVsZSBhZGQtbGlicmFyeSAoIGxpYi1uYW1lIDogdmVyc2lvbiA/IDogZGVwZW5kcy1vbiAqIDogdXNhZ2UtZGVmaW5lcyAqIDogcmVxdWlyZW1lbnRzICogOiBpbmNsdWRlID8gKQoreworICAgIGlmICQoLmJqYW0tcXQpCisgICAgeworICAgICAgICAjIEltcG9ydCBRdCBtb2R1bGUKKyAgICAgICAgIyBFdmV5dGhpbmcgd2lsbCBiZSBzZXR1cCB0aGVyZQorICAgICAgICBhbGlhcyAkKGxpYi1uYW1lKQorICAgICAgICAgICA6ICQoLnByZWZpeCkvLyQobGliLW5hbWUpCisgICAgICAgICAgIDoKKyAgICAgICAgICAgOgorICAgICAgICAgICA6IDxhbGxvdz5xdDQgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsb2NhbCByZWFsX2luY2x1ZGUgOworICAgICAgICByZWFsX2luY2x1ZGUgPz0gJChpbmNsdWRlKSA7CisgICAgICAgIHJlYWxfaW5jbHVkZSA/PSAkKGxpYi1uYW1lKSA7CisKKyAgICAgICAgbGliICQobGliLW5hbWUpCisgICAgICAgICAgIDogIyBzb3VyY2VzCisgICAgICAgICAgICAgJChkZXBlbmRzLW9uKQorICAgICAgICAgICA6ICMgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgPG5hbWU+JChsaWItbmFtZSkkKHZlcnNpb24pCisgICAgICAgICAgICAgJChyZXF1aXJlbWVudHMpCisgICAgICAgICAgIDogIyBkZWZhdWx0LWJ1aWxkCisgICAgICAgICAgIDogIyB1c2FnZS1yZXF1aXJlbWVudHMKKyAgICAgICAgICAgICA8ZGVmaW5lPiQodXNhZ2UtZGVmaW5lcykKKyAgICAgICAgICAgICA8aW5jbHVkZT4kKC5pbmNwcmVmaXgpLyQocmVhbF9pbmNsdWRlKQorICAgICAgICAgICA7CisKKyAgICAgICAgaWYgJCguaGF2ZV9zZXBhcmF0ZV9kZWJ1ZykgPSBUUlVFCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpYiAkKGxpYi1uYW1lKQorICAgICAgICAgICAgICAgOiAjIHNvdXJjZXMKKyAgICAgICAgICAgICAgICAgJChkZXBlbmRzLW9uKQorICAgICAgICAgICAgICAgOiAjIHJlcXVpcmVtZW50cworICAgICAgICAgICAgICAgICA8bmFtZT4kKGxpYi1uYW1lKSQoLnN1ZmZpeF9kZWJ1ZykkKHZlcnNpb24pCisgICAgICAgICAgICAgICAgICQocmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgICAgICA8dmFyaWFudD5kZWJ1ZworICAgICAgICAgICAgICAgOiAjIGRlZmF1bHQtYnVpbGQKKyAgICAgICAgICAgICAgIDogIyB1c2FnZS1yZXF1aXJlbWVudHMKKyAgICAgICAgICAgICAgICAgPGRlZmluZT4kKHVzYWdlLWRlZmluZXMpCisgICAgICAgICAgICAgICAgIDxpbmNsdWRlPiQoLmluY3ByZWZpeCkvJChyZWFsX2luY2x1ZGUpCisgICAgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIE1ha2UgbGlicmFyeSBleHBsaWNpdCBzbyB0aGF0IGEgc2ltcGxlIDx1c2U+cXQ0IHdpbGwgbm90IGJyaW5nIGluIGV2ZXJ5dGhpbmcuCisgICAgIyBBbmQgc29tZSBjb21wb25lbnRzIGxpa2UgUXREQnVzL1Bob25vbiBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zLgorICAgIGV4cGxpY2l0ICQobGliLW5hbWUpIDsKK30KKworIyBVc2UgJCguQklOUFJFRklYWy0xXSkgZm9yIHRoZSBwYXRocyBhcyBzZXZlcmFsIHRvb2xzLXJlcXVpcmVtZW50cyBjYW4gbWF0Y2guCisjIFRoZSBleGFjdCBtYXRjaCBpcyB0aGUgbGFzdCBvbmUuCisKKyMgR2V0IDxpbmNsdWRlPiBhbmQgPGRlZmluZXM+IGZyb20gY3VycmVudCB0b29sc2V0LgorZmxhZ3MgcXQ0Lm1vYyBJTkNMVURFUyA8aW5jbHVkZT4gOworZmxhZ3MgcXQ0Lm1vYyBERUZJTkVTIDxkZWZpbmU+IDsKKworIyBuZWVkIGEgbmV3bGluZSBmb3IgZXhwYW5zaW9uIG9mIERFRklORVMgYW5kIElOQ0xVREVTIGluIHRoZSByZXNwb25zZSBmaWxlLgorLm5sICA9ICIKKyIgOworCisjIFByb2Nlc3NlcyBoZWFkZXJzIHRvIGNyZWF0ZSBRdCBNZXRhT2JqZWN0IGluZm9ybWF0aW9uLiBRdDQtbW9jIGhhcyBpdHMKKyMgYysrLXBhcnNlciwgc28gcGFzcyBJTkNMVURFUyBhbmQgREVGSU5FUy4KKyMgV2UgdXNlIHJlc3BvbnNlIGZpbGUgd2l0aCBvbmUgSU5DTFVERS9ERUZJTkUgcGVyIGxpbmUKKyMKK2FjdGlvbnMgbW9jCit7CisgICAgJCguQklOUFJFRklYWy0xXSkvbW9jIC1mICQoPikgLW8gJCg8KSBAIkAoJCg8KS5yc3A6RT0tRCQoREVGSU5FUykkKC5ubCkgLUkkKElOQ0xVREVTOlQpJCgubmwpKSIKK30KKworIyBXaGVuIG1vY2NpbmcgZmlsZXMgZm9yIGluY2x1ZGUgb25seSwgd2UgZG9uJ3QgbmVlZCAtZiwgb3RoZXJ3aXNlIHRoZSBnZW5lcmF0ZWQKKyMgY29kZSB3aWxsIGluY2x1ZGUgdGhlIC5jcHAgYW5kIHdlJ2xsIGdldCBkdXBsaWNhdGVkIHN5bWJvbHMuCisjCithY3Rpb25zIG1vYy5pbmMKK3sKKyAgICAkKC5CSU5QUkVGSVhbLTFdKS9tb2MgJCg+KSAtbyAkKDwpIEAiQCgkKDwpLnJzcDpFPS1EJChERUZJTkVTKSQoLm5sKSAtSSQoSU5DTFVERVM6VCkkKC5ubCkpIgorfQorCisKKyMgR2V0IGV4dHJhIG9wdGlvbnMgZm9yIFJDQworZmxhZ3MgcXQ0LnJjYyBSQ0NfT1BUSU9OUyA8cmNjZmxhZ3M+IDsKKworIyBHZW5lcmF0ZXMgc291cmNlIGZpbGVzIGZyb20gcmVzb3VyY2UgZmlsZXMuCisjCithY3Rpb25zIHJjYworeworICAgICQoLkJJTlBSRUZJWFstMV0pL3JjYyAkKD4pIC1uYW1lICQoPjpCKSAkKFJDQ19PUFRJT05TKSAtbyAkKDwpCit9CisKKworIyBHZW5lcmF0ZXMgdXNlci1pbnRlcmZhY2Ugc291cmNlIGZyb20gLnVpIGZpbGVzLgorIworYWN0aW9ucyB1aWMKK3sKKyAgICAkKC5CSU5QUkVGSVhbLTFdKS91aWMgJCg+KSAtbyAkKDwpCit9CisKKworIyBTY2FubmVyIGZvciAucXJjIGZpbGVzLiBMb29rIGZvciB0aGUgQ0RBVEEgc2VjdGlvbiBvZiB0aGUgPGZpbGU+IHRhZy4gSWdub3JlCisjIHRoZSAiYWxpYXMiIGF0dHJpYnV0ZS4gU2VlIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdC9yZXNvdXJjZXMuaHRtbCBmb3IKKyMgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiB0aGUgUXQgUmVzb3VyY2UgU3lzdGVtLgorIworY2xhc3MgcXJjLXNjYW5uZXIgOiBjb21tb24tc2Nhbm5lcgoreworICAgIHJ1bGUgcGF0dGVybiAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAiPGZpbGUuKj4oLiopPC9maWxlPiIgOworICAgIH0KK30KKworCisjIFdyYXBwZWQgZmlsZXMgYXJlICJpbmNsdWRlZCIuCitzY2FubmVyLnJlZ2lzdGVyIHFyYy1zY2FubmVyIDogaW5jbHVkZSA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3F0NS5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3F0NS5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmZGY3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcXQ1LmphbQpAQCAtMCwwICsxLDcyOCBAQAorIyBDb3B5cmlnaHQgMjAwMi0yMDA2IFZsYWRpbWlyIFBydXMKKyMgQ29weXJpZ2h0IDIwMDUgQWxvIFNhcnYKKyMgQ29weXJpZ2h0IDIwMDUtMjAxMiBKdWVyZ2VuIEh1bm9sZAorIworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKyMgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIFF0NSBsaWJyYXJ5IHN1cHBvcnQgbW9kdWxlCisjCisjIFRoZSBtb2R1bGUgYXR0ZW1wdHMgdG8gYXV0by1kZXRlY3QgUVQgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIGZyb20gUVRESVIKKyMgZW52aXJvbm1lbnQgdmFyaWFibGU7IGZhaWxpbmcgdGhhdCwgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIGNhbiBiZSBwYXNzZWQgYXMKKyMgYXJndW1lbnQ6CisjCisjIHRvb2xzZXQudXNpbmcgcXQ1IDogL3Vzci9sb2NhbC9Ucm9sbHRlY2gvUXQtNS4wLjAgOworIworIyBUaGUgbW9kdWxlIHN1cHBvcnRzIGNvZGUgZ2VuZXJhdGlvbiBmcm9tIC51aSBhbmQgLnFyYyBmaWxlcywgYXMgd2VsbCBhcworIyBydW5uaW5nIHRoZSBtb2MgcHJlcHJvY2Vzc29yIG9uIGhlYWRlcnMuIE5vdGUgdGhhdCB5b3UgbXVzdCBsaXN0IGFsbCB5b3VyCisjIG1vYy1hYmxlIGhlYWRlcnMgaW4gc291cmNlcy4KKyMKKyMgRXhhbXBsZToKKyMKKyMgICAgIGV4ZSBteWFwcCA6IG15YXBwLmNwcCBteWFwcC5oIG15YXBwLnVpIG15YXBwLnFyYworIyAgICAgICAgICAgICAgICAgL3F0NS8vUXRHdWkgL3F0NS8vUXROZXR3b3JrIDsKKyMKKyMgSXQncyBhbHNvIHBvc3NpYmxlIHRvIHJ1biBtb2Mgb24gY3BwIHNvdXJjZXM6CisjCisjICAgaW1wb3J0IGNhc3QgOworIworIyAgIGV4ZSBteWFwcCA6IG15YXBwLmNwcCBbIGNhc3QgXyBtb2NjYWJsZS1jcHAgOiBteWFwcC5jcHAgXSAvcXQ1Ly9RdEd1aSA7CisjCisjIFdoZW4gbW9jY2luZyBzb3VyY2UgZmlsZSBteWFwcC5jcHAgeW91IG5lZWQgdG8gaW5jbHVkZSAibXlhcHAubW9jIiBmcm9tCisjIG15YXBwLmNwcC4gV2hlbiBtb2NjaW5nIC5oIGZpbGVzLCB0aGUgb3V0cHV0IG9mIG1vYyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKyMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbiwgeW91IGRvbid0IG5lZWQgYW55IGluY2x1ZGVzLgorIworIyBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBRdCBndWlkZWxpbmVzOgorIyBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTUuMC9tb2MuaHRtbAorCisjIFRoZSAucXJjIHByb2Nlc3NpbmcgdXRpbGl0eSBzdXBwb3J0cyB2YXJpb3VzIGNvbW1hbmQgbGluZSBvcHRpb24gKHNlZQorIyBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTUuMC9yY2MuaHRtbCBmb3IgYSBjb21wbGV0ZSBsaXN0KS4gVGhlCisjIG1vZHVsZSBwcm92aWRlcyBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgdGhlICJvdXRwdXQgZmlsZSIgYW5kCisjICJpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBuYW1lIiBvcHRpb25zLiBPdGhlciBvcHRpb25zIGNhbiBiZSBzZXQgdGhyb3VnaAorIyB0aGUgPHJjY2ZsYWdzPiBidWlsZCBwcm9wZXJ0eS4gRS5nLiBpZiB5b3Ugd2lzaCB0aGUgY29tcHJlc3Npb24gc2V0dGluZ3MKKyMgdG8gYmUgbW9yZSBhZ2dyZXNzaXZlIHRoYW4gdGhlIGRlZmF1bHRzLCB5b3UgY2FuIGFwcGx5IHRoZW0gdG9vIGFsbCAucXJjCisjIGZpbGVzIGxpa2UgdGhpczoKKyMKKyMgICBwcm9qZWN0IG15LXF0LXByb2plY3QgOgorIyAgICAgICAgICAgICAgIHJlcXVpcmVtZW50cworIyAgICAgICAgICAgICAgIDxyY2NmbGFncz4iLWNvbXByZXNzIDkgLXRocmVzaG9sZCAxMCIKKyMgICAgICAgICAgIDsKKyMKKyMgT2YgY291cnNlLCB0aGlzIHByb3BlcnR5IGNhbiBhbHNvIGJlIHNwZWNpZmllZCBvbiBpbmRpdmlkdWFsIHRhcmdldHMuCisKKworaW1wb3J0IG1vZHVsZXMgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IGVycm9ycyA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgdG9vbHNldCA6IGZsYWdzIDsKK2ltcG9ydCBvcyA7CitpbXBvcnQgdmlydHVhbC10YXJnZXQgOworaW1wb3J0IHNjYW5uZXIgOworCisjIFRoZSBRdCB2ZXJzaW9uIHVzZWQgZm9yIHJlcXVpcmVtZW50cworIyBWYWxpZCBhcmUgPHF0PjUuMCBvciA8cXQ+NS4xLjAKKyMgQXV0by1kZXRlY3Rpb24gdmlhIHFtYWtlIHNldHMgJzxxdD5tYWpvci5taW5vci5wYXRjaCcKK2ZlYXR1cmUuZmVhdHVyZSBxdDUgOiA6IHByb3BhZ2F0ZWQgOworCisjIEV4dHJhIGZsYWdzIGZvciByY2MKKyMgJFRPRE86IGZpZ3VyZSBvdXQgaG93IHRvIGRlY2xhcmUgdGhpcyBvbmx5IG9uY2UKKyMgZmVhdHVyZS5mZWF0dXJlIHJjY2ZsYWdzIDogOiBmcmVlIDsKKworcHJvamVjdC5pbml0aWFsaXplICQoX19uYW1lX18pIDsKK3Byb2plY3QgcXQ1IDsKKworIyBTYXZlIHRoZSBwcm9qZWN0IHNvIHRoYXQgd2UgdG9sZXJhdGUgJ2ltcG9ydCArIHVzaW5nJyBjb21iby4KKy5wcm9qZWN0ID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7CisKKyMgSGVscGVyIHV0aWxzIGZvciBlYXN5IGRlYnVnIG91dHB1dAoraWYgWyBNQVRDSCAoLS1kZWJ1Zy1jb25maWd1cmF0aW9uKSA6IFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIF0KK3sKKyAgICAuZGVidWctY29uZmlndXJhdGlvbiA9IFRSVUUgOworfQorCitsb2NhbCBydWxlIGRlYnVnLW1lc3NhZ2UgKCBtZXNzYWdlICogKQoreworICAgIGlmICQoLmRlYnVnLWNvbmZpZ3VyYXRpb24pID0gVFJVRQorICAgIHsKKyAgICAgICAgRUNITyBub3RpY2U6IFtxdDUtY2ZnXSAkKG1lc3NhZ2UpIDsKKyAgICB9Cit9CisKKyMgQ2FwdHVyZSBxbWFrZSBvdXRwdXQgbGluZSBieSBsaW5lCitsb2NhbCBydWxlIHJlYWQtb3V0cHV0ICggY29udGVudCApCit7CisgICAgbG9jYWwgbGluZXMgOworICAgIGxvY2FsIG5sID0gIgorIiA7CisgICAgbG9jYWwgPDwgPSAiKFteJChubCldKilbJChubCldKC4qKSIgOworICAgIGxvY2FsIGxpbmUrID0gWyBNQVRDSCAiJCg8PCkiIDogIiQoY29udGVudCkiIF0gOworICAgIHdoaWxlICQobGluZSspCisgICAgeworICAgICAgICBsaW5lcyArPSAkKGxpbmUrWzFdKSA7CisgICAgICAgIGxpbmUrID0gWyBNQVRDSCAiJCg8PCkiIDogIiQobGluZStbMl0pIiBdIDsKKyAgICB9CisgICAgcmV0dXJuICQobGluZXMpIDsKK30KKworIyBDYXB0dXJlIFF0IHZlcnNpb24gZnJvbSBxbWFrZQorbG9jYWwgcnVsZSBjaGVjay12ZXJzaW9uICggYmluX3ByZWZpeCApCit7CisgICAgZnVsbC1jbWQgPSAkKGJpbl9wcmVmaXgpIi9xbWFrZSAtdiIgOworICAgIGRlYnVnLW1lc3NhZ2UgUnVubmluZyAnJChmdWxsLWNtZCknIDsKKyAgICBsb2NhbCBvdXRwdXQgPSBbIFNIRUxMICQoZnVsbC1jbWQpIF0gOworICAgIGZvciBsaW5lIGluIFsgcmVhZC1vdXRwdXQgJChvdXRwdXQpIF0KKyAgICB7CisgICAgICAgICMgUGFyc2UgdGhlIG91dHB1dCB0byBnZXQgYWxsIHRoZSByZXN1bHRzLgorICAgICAgICBpZiBbIE1BVENIICJRTWFrZSIgOiAkKGxpbmUpIF0KKyAgICAgICAgeworICAgICAgICAgICAgIyBTa2lwIGZpcnN0IGxpbmUgb2Ygb3V0cHV0CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gWyBNQVRDSCAiKFswLTldKilcXC4oWzAtOV0qKVxcLihbMC05XSopIiA6ICQobGluZSkgXSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQodGVtcCkgOworfQorCisjIFZhbGlkYXRlIHRoZSB2ZXJzaW9uIHN0cmluZyBhbmQgZXh0cmFjdCB0aGUgbWFqb3IvbWlub3IgcGFydCB3ZSBjYXJlIGFib3V0LgorIworbG9jYWwgcnVsZSBzcGxpdC12ZXJzaW9uICggdmVyc2lvbiApCit7CisgICAgbG9jYWwgbWFqb3ItbWlub3IgPSBbIE1BVENIIF4oWzAtOV0rKVwuKFswLTldKykoLiopJCA6ICQodmVyc2lvbikgOiAxIDIgMyBdIDsKKyAgICBpZiAhICQobWFqb3ItbWlub3JbMl0pIHx8ICQobWFqb3ItbWlub3JbM10pCisgICAgeworICAgICAgICBFQ0hPICJXYXJuaW5nOiAndXNpbmcgcXQnIGV4cGVjdHMgYSB0d28gcGFydCAobWFqb3IsIG1pbm9yKSB2ZXJzaW9uIG51bWJlcjsgZ290IiAkKHZlcnNpb24pIGluc3RlYWQgOworCisgICAgICAgICMgQWRkIGEgemVybyB0byBhY2NvdW50IGZvciB0aGUgbWlzc2luZyBkaWdpdCBpZiBuZWNlc3NhcnkuCisgICAgICAgIG1ham9yLW1pbm9yICs9IDAgOworICAgIH0KKworICAgIHJldHVybiAkKG1ham9yLW1pbm9yWzFdKSAkKG1ham9yLW1pbm9yWzJdKSA7Cit9CisKKyMgSW5pdGlhbGl6ZSB0aGUgUVQgc3VwcG9ydCBtb2R1bGUuCisjIFBhcmFtZXRlcnM6CisjIC0gJ3ByZWZpeCcgICAgcGFyYW1ldGVyIHRlbGxzIHdoZXJlIFF0IGlzIGluc3RhbGxlZC4KKyMgLSAndmVyc2lvbicgICBvcHRpb25hbCB2ZXJzaW9uIG9mIFF0LCBlbHNlIGF1dG9kZXRlY3RlZCB2aWEgJ3FtYWtlIC12JworIyAtICdjb25kaXRpb24nIG9wdGlvbmFsIHJlcXVpcmVtZW50cworIyAtICduYW1lc3BhY2UnIG9wdGlvbmFsIHN1cHBvcnQgZm9yIGNvbmZpZ3VyZSAtcXRuYW1lc3BhY2UKKyMgLSAnaW5maXgnICAgICBvcHRpb25hbCBzdXBwb3J0IGZvciBjb25maWd1cmUgLXF0bGliaW5maXgKKyMgLSAnZnVsbF9iaW4nICBvcHRpb25hbCBmdWxsIHBhdGggdG8gUXQgYmluYXJpZXMgKHFtYWtlLG1vYyx1aWMscmNjKQorIyAtICdmdWxsX2luYycgIG9wdGlvbmFsIGZ1bGwgcGF0aCB0byBRdCB0b3AtbGV2ZWwgaW5jbHVkZSBkaXJlY3RvcnkKKyMgLSAnZnVsbF9saWInICBvcHRpb25hbCBmdWxsIHBhdGggdG8gUXQgbGlicmFyeSBkaXJlY3RvcnkKK3J1bGUgaW5pdCAoIHByZWZpeCA6IHZlcnNpb24gPyA6IGNvbmRpdGlvbiAqIDogbmFtZXNwYWNlID8gOiBpbmZpeCA/IDogZnVsbF9iaW4gPyA6IGZ1bGxfaW5jID8gOiBmdWxsX2xpYiA/ICkKK3sKKyAgICBwcm9qZWN0LnB1c2gtY3VycmVudCAkKC5wcm9qZWN0KSA7CisKKyAgICBkZWJ1Zy1tZXNzYWdlICI9PT09IENvbmZpZ3VyaW5nIFF0IC4uLiA9PT09IiA7CisgICAgZm9yIGxvY2FsIHYgaW4gdmVyc2lvbiBwcmVmaXggY29uZGl0aW9uIG5hbWVzcGFjZSBpbmZpeCBmdWxsX2JpbiBmdWxsX2luYyBmdWxsX2xpYgorICAgIHsKKyAgICAgICAgaWYgJCgkKHYpKQorICAgICAgICB7CisgICAgICAgICAgICBkZWJ1Zy1tZXNzYWdlICIgIHVzZXItc3BlY2lmaWVkICIkKHYpOiAnJCgkKHYpKScgOworICAgICAgICB9CisgICAgfQorCisgICAgIyBOZWVkZWQgYXMgZGVmYXVsdCB2YWx1ZQorICAgIC5wcmVmaXggPSAkKHByZWZpeCkgOworCisgICAgIyBwcmUtYnVpbGQgcGF0aHMgdG8gZGV0ZWN0IHJlaW5pdGlhbGl6YXRpb25zIGNoYW5nZXMKKyAgICBsb2NhbCBpbmNfcHJlZml4IGxpYl9wcmVmaXggYmluX3ByZWZpeCA7CisgICAgaWYgJChmdWxsX2luYykKKyAgICB7CisgICAgICAgIGluY19wcmVmaXggPSAkKGZ1bGxfaW5jKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluY19wcmVmaXggPSAkKHByZWZpeCkvaW5jbHVkZSA7CisgICAgfQorICAgIGlmICQoZnVsbF9saWIpCisgICAgeworICAgICAgICBsaWJfcHJlZml4ID0gJChmdWxsX2xpYikgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaWJfcHJlZml4ID0gJChwcmVmaXgpL2xpYiA7CisgICAgfQorICAgIGlmICQoZnVsbF9iaW4pCisgICAgeworICAgICAgICBiaW5fcHJlZml4ID0gJChmdWxsX2JpbikgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiaW5fcHJlZml4ID0gJChwcmVmaXgpL2JpbiA7CisgICAgfQorCisgICAgIyBHbG9iYWxseSBuZWVkZWQgdmFyaWFibGVzCisgICAgLmluY3ByZWZpeCA9ICQoaW5jX3ByZWZpeCkgOworICAgIC5saWJwcmVmaXggPSAkKGxpYl9wcmVmaXgpIDsKKyAgICAuYmlucHJlZml4ID0gJChiaW5fcHJlZml4KSA7CisKKyAgICBpZiAhICQoLmluaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhpcyBpcyBpbml0aWFsaXNlZCBvbmx5IG9uY2UKKyAgICAgICAgLmluaXRpYWxpemVkID0gdHJ1ZSA7CisKKyAgICAgICAgIyBHZW5lcmF0ZXMgY3BwIGZpbGVzIGZyb20gaGVhZGVyIGZpbGVzIHVzaW5nICJtb2MiIHRvb2wKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCBxdDUubW9jIDogSCA6IENQUChtb2NfJSkgOiA8YWxsb3c+cXQ1IDsKKworICAgICAgICAjIFRoZSBPQkogcmVzdWx0IHR5cGUgaXMgYSBmYWtlLCAnSCcgd2lsbCBiZSByZWFsbHkgcHJvZHVjZWQuIFNlZQorICAgICAgICAjIGNvbW1lbnRzIG9uIHRoZSBnZW5lcmF0b3IgY2xhc3MsIGRlZmluZWQgYmVsb3cgdGhlICdpbml0JyBmdW5jdGlvbi4KKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3RlciBbIG5ldyB1aWMtNS1nZW5lcmF0b3IgcXQ1LnVpYyA6IFVJIDogT0JKIDoKKyAgICAgICAgICAgIDxhbGxvdz5xdDUgIF0gOworCisgICAgICAgICMgVGhlIE9CSiByZXN1bHQgdHlwZSBpcyBhIGZha2UgaGVyZSB0b28uCisgICAgICAgIGdlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgbW9jLWgtNS1nZW5lcmF0b3IKKyAgICAgICAgICAgIHF0NS5tb2MuaW5jIDogTU9DQ0FCTEU1X0NQUCA6IE9CSiA6IDxhbGxvdz5xdDUgXSA7CisKKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3RlciBbIG5ldyBtb2MtaW5jLTUtZ2VuZXJhdG9yCisgICAgICAgICAgICBxdDUubW9jLmluYyA6IE1PQ0NBQkxFNV9IIDogT0JKIDogPGFsbG93PnF0NSBdIDsKKworICAgICAgICAjIEdlbmVyYXRlcyAuY3BwIGZpbGVzIGZyb20gLnFyYyBmaWxlcy4KKyAgICAgICAgZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCBxdDUucmNjIDogUVJDIDogQ1BQKHFyY18lKSA6IDxhbGxvdz5xdDUgOworCisgICAgICAgICMgZGVwZW5kZW5jeSBzY2FubmVyIGZvciB3cmFwcGVkIGZpbGVzLgorICAgICAgICB0eXBlLnNldC1zY2FubmVyIFFSQyA6IHFyYy01LXNjYW5uZXIgOworCisgICAgICAgICMgU2F2ZSB2YWx1ZSBvZiBmaXJzdCBvY2N1cmluZyBwcmVmaXgKKyAgICAgICAgLlBSRUZJWCA9ICQocHJlZml4KSA7CisgICAgfQorCisgICAgaWYgJCh2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgbWFqb3ItbWlub3IgPSBbIHNwbGl0LXZlcnNpb24gJCh2ZXJzaW9uKSBdIDsKKyAgICAgICAgdmVyc2lvbiA9ICQobWFqb3ItbWlub3I6Sj0uKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZlcnNpb24gPSBbIGNoZWNrLXZlcnNpb24gJChiaW5fcHJlZml4KSBdIDsKKyAgICAgICAgaWYgJCh2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJzaW9uID0gJCh2ZXJzaW9uOko9LikgOworICAgICAgICB9CisgICAgICAgIGRlYnVnLW1lc3NhZ2UgRGV0ZWN0ZWQgdmVyc2lvbiAnJCh2ZXJzaW9uKScgOworICAgIH0KKworICAgIGxvY2FsIHRhcmdldC1yZXF1aXJlbWVudHMgPSAkKGNvbmRpdGlvbikgOworCisgICAgIyBBZGQgdGhlIHZlcnNpb24sIGlmIGFueSwgdG8gdGhlIHRhcmdldCByZXF1aXJlbWVudHMuCisgICAgaWYgJCh2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgISAkKHZlcnNpb24pIGluIFsgZmVhdHVyZS52YWx1ZXMgcXQ1IF0KKyAgICAgICAgeworICAgICAgICAgICAgZmVhdHVyZS5leHRlbmQgcXQ1IDogJCh2ZXJzaW9uKSA7CisgICAgICAgIH0KKyAgICAgICAgdGFyZ2V0LXJlcXVpcmVtZW50cyArPSA8cXQ1PiQodmVyc2lvbjpFPWRlZmF1bHQpIDsKKyAgICB9CisKKyAgICBsb2NhbCB0YXJnZXQtb3MgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyB0YXJnZXQtb3MgOiAkKGNvbmRpdGlvbikgXSA7CisgICAgaWYgISAkKHRhcmdldC1vcykKKyAgICB7CisgICAgICAgIHRhcmdldC1vcyA/PSBbIGZlYXR1cmUuZGVmYXVsdHMgdGFyZ2V0LW9zIF0gOworICAgICAgICB0YXJnZXQtb3MgPSAkKHRhcmdldC1vczpHPSkgOworICAgICAgICB0YXJnZXQtcmVxdWlyZW1lbnRzICs9IDx0YXJnZXQtb3M+JCh0YXJnZXQtb3MpIDsKKyAgICB9CisKKyAgICAjIEJ1aWxkIGV4YWN0IHJlcXVpcmVtZW50cyBmb3IgdGhlIHRvb2xzCisgICAgbG9jYWwgdG9vbHMtcmVxdWlyZW1lbnRzID0gJCh0YXJnZXQtcmVxdWlyZW1lbnRzOko9LykgOworCisgICAgZGVidWctbWVzc2FnZSAiRGV0YWlscyBvZiB0aGlzIFF0IGNvbmZpZ3VyYXRpb246IiA7CisgICAgZGVidWctbWVzc2FnZSAiICBwcmVmaXg6ICAgICAgIiAnJChwcmVmaXg6RT08ZW1wdHk+KScgOworICAgIGRlYnVnLW1lc3NhZ2UgIiAgYmluYXJ5IHBhdGg6ICIgJyQoYmluX3ByZWZpeDpFPTxlbXB0eT4pJyA7CisgICAgZGVidWctbWVzc2FnZSAiICBpbmNsdWRlIHBhdGg6IiAnJChpbmNfcHJlZml4OkU9PGVtcHR5PiknIDsKKyAgICBkZWJ1Zy1tZXNzYWdlICIgIGxpYnJhcnkgcGF0aDoiICckKGxpYl9wcmVmaXg6RT08ZW1wdHk+KScgOworICAgIGRlYnVnLW1lc3NhZ2UgIiAgdGFyZ2V0IHJlcXVpcmVtZW50czoiICckKHRhcmdldC1yZXF1aXJlbWVudHMpJyA7CisgICAgZGVidWctbWVzc2FnZSAiICB0b29sIHJlcXVpcmVtZW50czogICIgJyQodG9vbHMtcmVxdWlyZW1lbnRzKScgOworCisgICAgIyBzZXR1cCB0aGUgcGF0aHMgZm9yIHRoZSB0b29scworICAgIHRvb2xzZXQuZmxhZ3MgcXQ1Lm1vYyAuQklOUFJFRklYICQodG9vbHMtcmVxdWlyZW1lbnRzKSA6ICQoYmluX3ByZWZpeCkgOworICAgIHRvb2xzZXQuZmxhZ3MgcXQ1LnJjYyAuQklOUFJFRklYICQodG9vbHMtcmVxdWlyZW1lbnRzKSA6ICQoYmluX3ByZWZpeCkgOworICAgIHRvb2xzZXQuZmxhZ3MgcXQ1LnVpYyAuQklOUFJFRklYICQodG9vbHMtcmVxdWlyZW1lbnRzKSA6ICQoYmluX3ByZWZpeCkgOworCisgICAgIyBUT0RPOiAyMDA5LTAyLTEyOiBCZXR0ZXIgc3VwcG9ydCBmb3IgZGlyZWN0b3JpZXMKKyAgICAjIE1vc3QgbGlrZWx5IG5lZWRlZCBhcmUgc2VwYXJhdGUgZ2V0dGVycyBmb3I6IGluY2x1ZGUsbGlicmFyaWVzLGJpbmFyaWVzIGFuZCBzb3VyY2VzLgorICAgIHRvb2xzZXQuZmxhZ3MgcXQ1LmRpcmVjdG9yeSAuUFJFRklYICQodG9vbHMtcmVxdWlyZW1lbnRzKSA6ICQocHJlZml4KSA7CisKKyAgICAjIFRlc3QgZm9yIGEgYnVpbGRhYmxlIFF0LgorICAgIGlmIFsgZ2xvYiAkKC5wcmVmaXgpL0phbXJvb3QgXQorICAgIHsKKyAgICAgICAuYmphbS1xdCA9IHRydWUKKworICAgICAgICMgdGhpcyB3aWxsIGRlY2xhcmUgUXRDb3JlIChhbmQgcXRtYWluIG9uIDx0YXJnZXQtb3M+d2luZG93cykKKyAgICAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRDb3JlIDsKKyAgIH0KKyAgIGVsc2UKKyAgICMgU2V0dXAgY29tbW9uIHByZS1idWlsdCBRdC4KKyAgICMgU3BlY2lhbCBzZXR1cCBmb3IgUXRDb3JlIG9uIHdoaWNoIGV2ZXJ5dGhpbmcgZGVwZW5kcworICAgeworICAgICAgIGxvY2FsIGxpbmsgPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyBsaW5rIDogJChjb25kaXRpb24pIF0gOworCisgICAgICAgbG9jYWwgdXNhZ2UtcmVxdWlyZW1lbnRzID0KKyAgICAgICAgICAgPGluY2x1ZGU+JCguaW5jcHJlZml4KQorICAgICAgICAgICA8bGlicmFyeS1wYXRoPiQoLmxpYnByZWZpeCkKKyAgICAgICAgICAgPHRocmVhZGluZz5tdWx0aQorICAgICAgICAgICA8YWxsb3c+cXQ1IDsKKworICAgICAgIGlmICQobGluaykgaW4gc2hhcmVkCisgICAgICAgeworICAgICAgICAgICB1c2FnZS1yZXF1aXJlbWVudHMgKz0gPGRsbC1wYXRoPiQoLmxpYnByZWZpeCkgOworICAgICAgIH0KKworICAgICAgIGxvY2FsIHN1ZmZpeCA7CisKKyAgICAgICAjIGRlYnVnIHZlcnNpb25zIG9uIHVuaXggaGF2ZSB0byBiZSBidWlsdAorICAgICAgICMgc2VwYXJhdGVseSBhbmQgdGhlcmVmb3JlIGhhdmUgbm8gc3VmZml4LgorICAgICAgIC5pbmZpeF92ZXJzaW9uID0gIiIgOworICAgICAgIC5zdWZmaXhfZGVidWcgPSAiIiA7CisKKyAgICAgICAjIENvbnRyb2wgZmxhZyBmb3IgYXV0by1jb25maWd1cmF0aW9uIG9mIHRoZSBkZWJ1ZyBsaWJyYXJpZXMuCisgICAgICAgIyBUaGlzIHNldHVwIHJlcXVpcmVzIFF0ICdjb25maWd1cmUgLWRlYnVnLWFuZC1yZWxlYXNlJy4KKyAgICAgICAjIE9ubHkgYXZhaWxhYmxlIG9uIHNvbWUgcGxhdGZvcm1zLgorICAgICAgICMgVG9EbzogMjAwOS0wMi0xMjogTWF5YmUgdGhyb3cgdGhpcyBhd2F5IGFuZAorICAgICAgICMgcmVxdWlyZSBzZXBhcmF0ZSBzZXR1cCB3aXRoIDx2YXJpYW50PmRlYnVnIGFzIGNvbmRpdGlvbi4KKyAgICAgICAuaGF2ZV9zZXBhcmF0ZV9kZWJ1ZyA9IEZBTFNFIDsKKworICAgICAgICMgU2V0dXAgb3RoZXIgcGxhdGZvcm1zCisgICAgICAgaWYgJCh0YXJnZXQtb3MpIGluIHdpbmRvd3MgY3lnd2luCisgICAgICAgeworICAgICAgICAgICAuaGF2ZV9zZXBhcmF0ZV9kZWJ1ZyA9IFRSVUUgOworCisgICAgICAgICAgICMgT24gTlQsIHRoZSBsaWJzIGhhdmUgImQiIHN1ZmZpeCBpbiBkZWJ1ZyBidWlsZHMuCisgICAgICAgICAgIC5zdWZmaXhfZGVidWcgPSAiZCIgOworCisgICAgICAgICAgIC5pbmZpeF92ZXJzaW9uID0gIjUiIDsKKworICAgICAgICAgICAjIE9uIFdpbmRvd3Mgd2UgbXVzdCBsaW5rIGFnYWluc3QgdGhlIHF0bWFpbiBsaWJyYXJ5CisgICAgICAgICAgIGxpYiBxdG1haW4KKyAgICAgICAgICAgICAgIDogIyBzb3VyY2VzCisgICAgICAgICAgICAgICA6ICMgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgICAgICA8bmFtZT5xdG1haW4kKC5zdWZmaXhfZGVidWcpCisgICAgICAgICAgICAgICAgICA8dmFyaWFudD5kZWJ1ZworICAgICAgICAgICAgICAgICAgJCh0YXJnZXQtcmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgICAgOworCisgICAgICAgICAgIGxpYiBxdG1haW4KKyAgICAgICAgICAgICAgIDogIyBzb3VyY2VzCisgICAgICAgICAgICAgICA6ICMgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgICAgICAgPG5hbWU+cXRtYWluCisgICAgICAgICAgICAgICAgICAgJCh0YXJnZXQtcmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgICAgOworICAgICAgIH0KKyAgICAgICBlbHNlIGlmICQodGFyZ2V0LW9zKSA9IGRhcndpbgorICAgICAgIHsKKyAgICAgICAgICAgIyBPbiBNYWNPUyBYLCBib3RoIGRlYnVnIGFuZCByZWxlYXNlIGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlLgorICAgICAgICAgICAuc3VmZml4X2RlYnVnID0gIl9kZWJ1ZyIgOworCisgICAgICAgICAgIC5oYXZlX3NlcGFyYXRlX2RlYnVnID0gVFJVRSA7CisKKyAgICAgICAgICAgYWxpYXMgcXRtYWluIDsKKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgIHsKKyAgICAgICAgICAgYWxpYXMgcXRtYWluIDogOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKyAgICAgICAgICAgLmluZml4X3ZlcnNpb24gPSAiNSIgOworICAgICAgIH0KKworICAgICAgIGxpYiBRdENvcmUgOiBxdG1haW4KKyAgICAgICAgICAgOiAjIHJlcXVpcmVtZW50cworICAgICAgICAgICAgIDxuYW1lPlF0JCguaW5maXhfdmVyc2lvbilDb3JlCisgICAgICAgICAgICAgJCh0YXJnZXQtcmVxdWlyZW1lbnRzKQorICAgICAgICAgICA6ICMgZGVmYXVsdC1idWlsZAorICAgICAgICAgICA6ICMgdXNhZ2UtcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgPGRlZmluZT5RVF9DT1JFX0xJQgorICAgICAgICAgICAgIDxkZWZpbmU+UVRfTk9fREVCVUcKKyAgICAgICAgICAgICA8aW5jbHVkZT4kKC5pbmNwcmVmaXgpL1F0Q29yZQorICAgICAgICAgICAgICQodXNhZ2UtcmVxdWlyZW1lbnRzKQorICAgICAgICAgICA7CisKKyAgICAgICBpZiAkKC5oYXZlX3NlcGFyYXRlX2RlYnVnKSA9IFRSVUUKKyAgICAgICB7CisgICAgICAgICAgIGRlYnVnLW1lc3NhZ2UgQ29uZmlndXJlIGRlYnVnIGxpYnJhcmllcyB3aXRoIHN1ZmZpeCAnJCguc3VmZml4X2RlYnVnKScgOworCisgICAgICAgICAgIGxpYiBRdENvcmUgOiAkKG1haW4pCisgICAgICAgICAgICAgICA6ICMgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgICAgIDxuYW1lPlF0JCguaW5maXhfdmVyc2lvbilDb3JlJCguc3VmZml4X2RlYnVnKQorICAgICAgICAgICAgICAgICA8dmFyaWFudD5kZWJ1ZworICAgICAgICAgICAgICAgICAkKHRhcmdldC1yZXF1aXJlbWVudHMpCisgICAgICAgICAgICAgICA6ICMgZGVmYXVsdC1idWlsZAorICAgICAgICAgICAgICAgOiAjIHVzYWdlLXJlcXVpcmVtZW50cworICAgICAgICAgICAgICAgICA8ZGVmaW5lPlFUX0NPUkVfTElCCisgICAgICAgICAgICAgICAgIDxpbmNsdWRlPiQoLmluY3ByZWZpeCkvUXRDb3JlCisgICAgICAgICAgICAgICAgICQodXNhZ2UtcmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgICAgOworICAgICAgICB9CisgICAgfQorCisgICAgIyBJbml0aWFsaXNpbmcgdGhlIHJlbWFpbmluZyBsaWJyYXJpZXMgaXMgY2Fub25pY2FsCisgICAgIyBwYXJhbWV0ZXJzICdtb2R1bGUnIDogJ2RlcGVuZHMtb24nIDogJ3VzYWdlLWRlZmluZScgOiAncmVxdWlyZW1lbnRzJyA6ICdpbmNsdWRlJworICAgICMgJ2luY2x1ZGUnIG9ubHkgZm9yIG5vbi1jYW5vbmljYWwgaW5jbHVkZSBwYXRocy4KKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRHdWkgICAgIDogUXRDb3JlIDogUVRfR1VJX0xJQiAgICAgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRXaWRnZXRzIDogUXRHdWkgIDogUVRfV0lER0VUU19MSUIgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXROZXR3b3JrIDogUXRDb3JlIDogUVRfTkVUV09SS19MSUIgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRTcWwgICAgIDogUXRDb3JlIDogUVRfU1FMX0xJQiAgICAgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRYbWwgICAgIDogUXRDb3JlIDogUVRfWE1MX0xJQiAgICAgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRQcmludFN1cHBvcnQgOiBRdEd1aSA6IFFUX1BSSU5UU1VQUE9SVF9MSUIgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRDb25jdXJyZW50IDogUXRDb3JlIDogUVRfQ09OQ1VSUkVOVF9MSUIgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKworICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdE9wZW5HTCA6IFF0R3VpIDogUVRfT1BFTkdMX0xJQiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdFN2ZyA6IFF0WG1sIFF0T3BlbkdMIDogUVRfU1ZHX0xJQiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0VGVzdCA6IFF0Q29yZSA6IDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisKKyAgICAjIFF0IGRlc2lnbmVyIGxpYnJhcnkgZXQuIGFsLgorICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdERlc2lnbmVyIDogUXRHdWkgUXRYbWwgOiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdERlc2lnbmVyQ29tcG9uZW50cyA6IFF0R3VpIFF0WG1sIDogOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKyAgICBhZGQtc3RhdGljLWxpYnJhcnkgUXRVaVRvb2xzIDogUXRHdWkgUXRYbWwgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKworICAgICMgREJ1cy1TdXBwb3J0CisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0REJ1cyA6IFF0WG1sIDogOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKworICAgICMgU2NyaXB0LUVuZ2luZSBhbmQgVG9vbHMKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRTY3JpcHQgOiBRdEd1aSBRdFhtbCA6IFFUX1NDUklQVF9MSUIgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRTY3JpcHRUb29scyA6IFF0U2NyaXB0IDogUVRfU0NSSVBUVE9PTFNfTElCIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisKKyAgICAjIFdlYktpdAorICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdFdlYktpdCAgICAgICAgOiBRdEd1aSA6IFFUX1dFQktJVF9MSUIgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRXZWJLaXRXaWRnZXRzIDogUXRHdWkgOiBRVF9XRUJLSVRXSURHRVRTX0xJQiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgIyBNdWx0aW1lZGlhIGVuZ2luZQorICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdE11bHRpbWVkaWEgOiBRdEd1aSA6IFFUX01VTFRJTUVESUFfTElCIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0TXVsdGltZWRpYVdpZGdldHMgOiBRdE11bHRpbWVkaWEgOiBRVF9NVUxUSU1FRElBV0lER0VUU19MSUIgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKworICAgICMgCisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0WG1sUGF0dGVybnMgOiBRdE5ldHdvcmsgOiBRVF9YTUxQQVRURVJOU19MSUIgOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKworICAgICMgSGVscC1FbmdpbmUKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRIZWxwICAgIDogUXRHdWkgUXRTcWwgUXRYbWwgOiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdENMdWNlbmUgOiBRQ29yZSBRdFNxbCBRdFhtbCA6IDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisKKyAgICAjIFF0UXVpY2sKKyAgICBhZGQtc2hhcmVkLWxpYnJhcnkgUXRRbWwgICAgICAgICAgICA6IFF0Q29yZSBRdE5ldHdvcmsgUXRHdWkgOiBRVF9RTUxfTElCIDogJCh0YXJnZXQtcmVxdWlyZW1lbnRzKSA7CisgICAgYWRkLXNoYXJlZC1saWJyYXJ5IFF0UXVpY2sgICAgICAgICAgOiBRdFFtbCA6IFFUX1FVSUNLX0xJQiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdFF1aWNrUGFydGljbGVzIDogUXRRbWwgOiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdFF1aWNrVGVzdCAgICAgIDogUXRRbWwgOiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgIyBSZWd1bGFyIGV4cHJlc3Npb24gc3VwcG9ydAorICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdFY4IDogUXRDb3JlIDogOiAkKHRhcmdldC1yZXF1aXJlbWVudHMpIDsKKworICAgICMgUU1MLUVuZ2luZSB2ZXJzaW9uMQorICAgIGFkZC1zaGFyZWQtbGlicmFyeSBRdERlY2xhcmF0aXZlIDogUXRYbWwgOiA6ICQodGFyZ2V0LXJlcXVpcmVtZW50cykgOworCisgICAgZGVidWctbWVzc2FnZSAiPT09PSBDb25maWd1cmVkIFF0LSQodmVyc2lvbikgPT09PSIgOworCisgICAgcHJvamVjdC5wb3AtY3VycmVudCA7Cit9CisKK3J1bGUgaW5pdGlhbGl6ZWQgKCApCit7CisgICAgcmV0dXJuICQoLmluaXRpYWxpemVkKSA7Cit9CisKKworCisjIFRoaXMgY3VzdG9tIGdlbmVyYXRvciBpcyBuZWVkZWQgYmVjYXVzZSBpbiBRVDUsIFVJIGZpbGVzIGFyZSB0cmFuc2xhdGVkIG9ubHkKKyMgaW50byBIIGZpbGVzLCBhbmQgbm8gQysrIGZpbGVzIGFyZSBjcmVhdGVkLiBGdXJ0aGVyLCB0aGUgSCBmaWxlcyBuZWVkIG5vdCBiZQorIyBwYXNzZWQgdmlhIE1PQy4gVGhlIGhlYWRlciBpcyB1c2VkIG9ubHkgdmlhIGluY2x1c2lvbi4gSWYgd2UgZGVmaW5lIGEgc3RhbmRhcmQKKyMgVUkgLT4gSCBnZW5lcmF0b3IsIEJvb3N0LkJ1aWxkIHdpbGwgcnVuIE1PQyBvbiBILCBhbmQgdGhlbiBjb21waWxlIHRoZQorIyByZXN1bHRpbmcgY3BwLiBJdCB3aWxsIGdpdmUgYSB3YXJuaW5nLCBzaW5jZSBvdXRwdXQgZnJvbSBtb2Mgd2lsbCBiZSBlbXB0eS4KKyMKKyMgVGhpcyBnZW5lcmF0b3IgaXMgZGVjbGFyZWQgd2l0aCBhIFVJIC0+IE9CSiBzaWduYXR1cmUsIHNvIGl0IGdldHMgaW52b2tlZCB3aGVuCisjIGxpbmtpbmcgZ2VuZXJhdG9yIHRyaWVzIHRvIGNvbnZlcnQgc291cmNlcyB0byBPQkosIGJ1dCBpdCBwcm9kdWNlcyB0YXJnZXQgb2YKKyMgdHlwZSBILiBUaGlzIGlzIG5vbi1zdGFuZGFyZCwgYnV0IGFsbG93ZWQuIFRoYXQgaGVhZGVyIHdvbid0IGJlIG1vY2NlZC4KKyMKK2NsYXNzIHVpYy01LWdlbmVyYXRvciA6IGdlbmVyYXRvcgoreworICAgIHJ1bGUgX19pbml0X18gKCAqIDogKiApCisgICAgeworICAgICAgICBnZW5lcmF0b3IuX19pbml0X18gJCgxKSA6ICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkgOiAkKDkpIDsKKyAgICB9CisKKyAgICBydWxlIHJ1biAoIHByb2plY3QgbmFtZSA/IDogcHJvcGVydHktc2V0IDogc291cmNlcyAqICkKKyAgICB7CisgICAgICAgIGlmICEgJChuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBuYW1lID0gWyAkKHNvdXJjZXNbMF0pLm5hbWUgXSA7CisgICAgICAgICAgICBuYW1lID0gJChuYW1lOkIpIDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIGEgPSBbIG5ldyBhY3Rpb24gJChzb3VyY2VzWzFdKSA6IHF0NS51aWMgOiAkKHByb3BlcnR5LXNldCkgXSA7CisKKyAgICAgICAgIyBUaGUgJ3VpXycgcHJlZml4IGlzIHRvIG1hdGNoIHFtYWtlJ3MgZGVmYXVsdCBiZWhhdmlvci4KKyAgICAgICAgbG9jYWwgdGFyZ2V0ID0gWyBuZXcgZmlsZS10YXJnZXQgdWlfJChuYW1lKSA6IEggOiAkKHByb2plY3QpIDogJChhKSBdIDsKKworICAgICAgICBsb2NhbCByID0gWyB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciAkKHRhcmdldCkgXSA7CisKKyAgICAgICAgIyBTaW5jZSB0aGlzIGdlbmVyYXRvciB3aWxsIHJldHVybiBhIEggdGFyZ2V0LCB0aGUgbGlua2luZyBnZW5lcmF0b3IKKyAgICAgICAgIyB3b24ndCB1c2UgaXQgYXQgYWxsLCBhbmQgd29uJ3Qgc2V0IGFueSBkZXBlbmRlbmN5IG9uIGl0LiBIb3dldmVyLCB3ZQorICAgICAgICAjIG5lZWQgdGhlIHRhcmdldCB0byBiZSBzZWVuIGJ5IGJqYW0sIHNvIHRoYXQgZGVwZW5kZW5jeSBmcm9tIHNvdXJjZXMgdG8KKyAgICAgICAgIyB0aGlzIGdlbmVyYXRlZCBoZWFkZXIgaXMgZGV0ZWN0ZWQgLS0gaWYgamFtIGRvZXMgbm90IGtub3cgYWJvdXQgdGhpcworICAgICAgICAjIHRhcmdldCwgaXQgd29uJ3QgZG8gYW55dGhpbmcuCisgICAgICAgIERFUEVORFMgYWxsIDogWyAkKHIpLmFjdHVhbGl6ZSBdIDsKKworICAgICAgICByZXR1cm4gJChyKSA7CisgICAgfQorfQorCisKK2NsYXNzIG1vYy1oLTUtZ2VuZXJhdG9yIDogZ2VuZXJhdG9yCit7CisgICAgcnVsZSBfX2luaXRfXyAoICogOiAqICkKKyAgICB7CisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOworICAgIH0KKworICAgIHJ1bGUgcnVuICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICogKQorICAgIHsKKyAgICAgICAgaWYgISAkKHNvdXJjZXNbMl0pICYmIFsgJChzb3VyY2VzWzFdKS50eXBlIF0gPSBNT0NDQUJMRTVfQ1BQCisgICAgICAgIHsKKyAgICAgICAgICAgIG5hbWUgPSBbICQoc291cmNlc1swXSkubmFtZSBdIDsKKyAgICAgICAgICAgIG5hbWUgPSAkKG5hbWU6QikgOworCisgICAgICAgICAgICBsb2NhbCBhID0gWyBuZXcgYWN0aW9uICQoc291cmNlc1sxXSkgOiBxdDUubW9jLmluYyA6CisgICAgICAgICAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0gOworCisgICAgICAgICAgICBsb2NhbCB0YXJnZXQgPSBbIG5ldyBmaWxlLXRhcmdldCAkKG5hbWUpIDogTU9DIDogJChwcm9qZWN0KSA6ICQoYSkKKyAgICAgICAgICAgICAgICBdIDsKKworICAgICAgICAgICAgbG9jYWwgciA9IFsgdmlydHVhbC10YXJnZXQucmVnaXN0ZXIgJCh0YXJnZXQpIF0gOworCisgICAgICAgICAgICAjIFNpbmNlIHRoaXMgZ2VuZXJhdG9yIHdpbGwgcmV0dXJuIGEgSCB0YXJnZXQsIHRoZSBsaW5raW5nIGdlbmVyYXRvcgorICAgICAgICAgICAgIyB3b24ndCB1c2UgaXQgYXQgYWxsLCBhbmQgd29uJ3Qgc2V0IGFueSBkZXBlbmRlbmN5IG9uIGl0LiBIb3dldmVyLAorICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSB0YXJnZXQgdG8gYmUgc2VlbiBieSBiamFtLCBzbyB0aGF0IGRlcGVuZGVuY3kgZnJvbQorICAgICAgICAgICAgIyBzb3VyY2VzIHRvIHRoaXMgZ2VuZXJhdGVkIGhlYWRlciBpcyBkZXRlY3RlZCAtLSBpZiBqYW0gZG9lcyBub3QKKyAgICAgICAgICAgICMga25vdyBhYm91dCB0aGlzIHRhcmdldCwgaXQgd29uJ3QgZG8gYW55dGhpbmcuCisgICAgICAgICAgICBERVBFTkRTIGFsbCA6IFsgJChyKS5hY3R1YWxpemUgXSA7CisKKyAgICAgICAgICAgIHJldHVybiAkKHIpIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitjbGFzcyBtb2MtaW5jLTUtZ2VuZXJhdG9yIDogZ2VuZXJhdG9yCit7CisgICAgcnVsZSBfX2luaXRfXyAoICogOiAqICkKKyAgICB7CisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOworICAgIH0KKworICAgIHJ1bGUgcnVuICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICogKQorICAgIHsKKyAgICAgICAgaWYgISAkKHNvdXJjZXNbMl0pICYmIFsgJChzb3VyY2VzWzFdKS50eXBlIF0gPSBNT0NDQUJMRTVfSAorICAgICAgICB7CisgICAgICAgICAgICBuYW1lID0gWyAkKHNvdXJjZXNbMF0pLm5hbWUgXSA7CisgICAgICAgICAgICBuYW1lID0gJChuYW1lOkIpIDsKKworICAgICAgICAgICAgbG9jYWwgYSA9IFsgbmV3IGFjdGlvbiAkKHNvdXJjZXNbMV0pIDogcXQ1Lm1vYy5pbmMgOgorICAgICAgICAgICAgICAgICQocHJvcGVydHktc2V0KSBdIDsKKworICAgICAgICAgICAgbG9jYWwgdGFyZ2V0ID0gWyBuZXcgZmlsZS10YXJnZXQgbW9jXyQobmFtZSkgOiBDUFAgOiAkKHByb2plY3QpIDoKKyAgICAgICAgICAgICAgICAkKGEpIF0gOworCisgICAgICAgICAgICAjIFNpbmNlIHRoaXMgZ2VuZXJhdG9yIHdpbGwgcmV0dXJuIGEgSCB0YXJnZXQsIHRoZSBsaW5raW5nIGdlbmVyYXRvcgorICAgICAgICAgICAgIyB3b24ndCB1c2UgaXQgYXQgYWxsLCBhbmQgd29uJ3Qgc2V0IGFueSBkZXBlbmRlbmN5IG9uIGl0LiBIb3dldmVyLAorICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSB0YXJnZXQgdG8gYmUgc2VlbiBieSBiamFtLCBzbyB0aGF0IGRlcGVuZGVuY3kgZnJvbQorICAgICAgICAgICAgIyBzb3VyY2VzIHRvIHRoaXMgZ2VuZXJhdGVkIGhlYWRlciBpcyBkZXRlY3RlZCAtLSBpZiBqYW0gZG9lcyBub3QKKyAgICAgICAgICAgICMga25vdyBhYm91dCB0aGlzIHRhcmdldCwgaXQgd29uJ3QgZG8gYW55dGhpbmcuCisgICAgICAgICAgICBERVBFTkRTIGFsbCA6IFsgJCh0YXJnZXQpLmFjdHVhbGl6ZSBdIDsKKworICAgICAgICAgICAgcmV0dXJuIFsgdmlydHVhbC10YXJnZXQucmVnaXN0ZXIgJCh0YXJnZXQpIF0gOworICAgICAgICB9CisgICAgfQorfQorCisKKyMgUXVlcnkgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuIFRoaXMgaXMgbmVlZGVkIGluIGF0IGxlYXN0IHR3byBzY2VuYXJpb3MuCisjIEZpcnN0LCB3aGVuIHJlLXVzaW5nIHNvdXJjZXMgZnJvbSB0aGUgUXQtVHJlZS4gU2Vjb25kLCB0byAiaW5zdGFsbCIgY3VzdG9tIFF0CisjIHBsdWdpbnMgdG8gdGhlIFF0LVRyZWUuCisjCitydWxlIGRpcmVjdG9yeQoreworICAgIHJldHVybiAkKC5QUkVGSVgpIDsKK30KKworIyBBZGQgYSBzaGFyZWQgUXQgbGlicmFyeS4KK3J1bGUgYWRkLXNoYXJlZC1saWJyYXJ5ICggbGliLW5hbWUgOiBkZXBlbmRzLW9uICogOiB1c2FnZS1kZWZpbmVzICogOiByZXF1aXJlbWVudHMgKiA6ICBpbmNsdWRlID8gKQoreworICAgICBhZGQtbGlicmFyeSAkKGxpYi1uYW1lKSA6ICQoLmluZml4X3ZlcnNpb24pIDogJChkZXBlbmRzLW9uKSA6ICQodXNhZ2UtZGVmaW5lcykgOiAkKHJlcXVpcmVtZW50cykgOiAkKGluY2x1ZGUpIDsKK30KKworIyBBZGQgYSBzdGF0aWMgUXQgbGlicmFyeS4KK3J1bGUgYWRkLXN0YXRpYy1saWJyYXJ5ICggbGliLW5hbWUgOiBkZXBlbmRzLW9uICogOiB1c2FnZS1kZWZpbmVzICogOiByZXF1aXJlbWVudHMgKiA6IGluY2x1ZGUgPyApCit7CisgICAgIGFkZC1saWJyYXJ5ICQobGliLW5hbWUpIDogJCguaW5maXhfdmVyc2lvbikgOiAkKGRlcGVuZHMtb24pIDogJCh1c2FnZS1kZWZpbmVzKSA6ICQocmVxdWlyZW1lbnRzKSA6ICQoaW5jbHVkZSkgOworfQorCisjIEFkZCBhIFF0IGxpYnJhcnkuCisjIFN0YXRpYyBsaWJzIGFyZSB1bnZlcnNpb25lZCwgd2hlcmVhcyBzaGFyZWQgbGlicyBoYXZlIHRoZSBtYWpvciBudW1iZXIgYXMgc3VmZml4LgorIyBDcmVhdGVzIGJvdGggcmVsZWFzZSBhbmQgZGVidWcgdmVyc2lvbnMgb24gcGxhdGZvcm1zIHdoZXJlIGJvdGggYXJlIGVuYWJsZWQgYnkgUXQgY29uZmlndXJlLgorIyBGbGFnczoKKyMgLSBsaWItbmFtZSBRdCBsaWJyYXJ5IE5hbWUKKyMgLSB2ZXJzaW9uICBRdCBtYWpvciBudW1iZXIgdXNlZCBhcyBzaGFyZWQgbGlicmFyeSBzdWZmaXggKFF0Q29yZTUuc28pCisjIC0gZGVwZW5kcy1vbiBvdGhlciBRdCBsaWJyYXJpZXMKKyMgLSB1c2FnZS1kZWZpbmVzIHRob3NlIGFyZSBzZXQgYnkgcW1ha2UsIHNvIHNldCB0aGVtIHdoZW4gdXNpbmcgdGhpcyBsaWJyYXJ5CisjIC0gcmVxdWlyZW1lbnRzIGFkZGlvbmFsIHJlcXVpcmVtZW50cworIyAtIGluY2x1ZGUgbm9uLWNhbm9uaWNhbCBpbmNsdWRlIHBhdGguIFRoZSBjYW5vbmljYWwgcGF0aCBpcyAkKC5pbmNwcmVmaXgpLyQobGliLW5hbWUpLgorcnVsZSBhZGQtbGlicmFyeSAoIGxpYi1uYW1lIDogdmVyc2lvbiA/IDogZGVwZW5kcy1vbiAqIDogdXNhZ2UtZGVmaW5lcyAqIDogcmVxdWlyZW1lbnRzICogOiBpbmNsdWRlID8gKQoreworICAgIGlmICQoLmJqYW0tcXQpCisgICAgeworICAgICAgICAjIEltcG9ydCBRdCBtb2R1bGUKKyAgICAgICAgIyBFdmV5dGhpbmcgd2lsbCBiZSBzZXR1cCB0aGVyZQorICAgICAgICBhbGlhcyAkKGxpYi1uYW1lKQorICAgICAgICAgICA6ICQoLnByZWZpeCkvLyQobGliLW5hbWUpCisgICAgICAgICAgIDoKKyAgICAgICAgICAgOgorICAgICAgICAgICA6IDxhbGxvdz5xdDUgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsb2NhbCByZWFsX2luY2x1ZGUgOworICAgICAgICByZWFsX2luY2x1ZGUgPz0gJChpbmNsdWRlKSA7CisgICAgICAgIHJlYWxfaW5jbHVkZSA/PSAkKGxpYi1uYW1lKSA7CisKKyAgICAgICAgbG9jYWwgcmVhbF9uYW1lID0gWyBNQVRDSCBeUXQoLiopIDogJChsaWItbmFtZSkgXSA7CisKKyAgICAgICAgbGliICQobGliLW5hbWUpCisgICAgICAgICAgIDogIyBzb3VyY2VzCisgICAgICAgICAgICAgJChkZXBlbmRzLW9uKQorICAgICAgICAgICA6ICMgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgPG5hbWU+UXQkKHZlcnNpb24pJChyZWFsX25hbWUpCisgICAgICAgICAgICAgJChyZXF1aXJlbWVudHMpCisgICAgICAgICAgIDogIyBkZWZhdWx0LWJ1aWxkCisgICAgICAgICAgIDogIyB1c2FnZS1yZXF1aXJlbWVudHMKKyAgICAgICAgICAgICA8ZGVmaW5lPiQodXNhZ2UtZGVmaW5lcykKKyAgICAgICAgICAgICA8aW5jbHVkZT4kKC5pbmNwcmVmaXgpLyQocmVhbF9pbmNsdWRlKQorICAgICAgICAgICA7CisKKyAgICAgICAgaWYgJCguaGF2ZV9zZXBhcmF0ZV9kZWJ1ZykgPSBUUlVFCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpYiAkKGxpYi1uYW1lKQorICAgICAgICAgICAgICAgOiAjIHNvdXJjZXMKKyAgICAgICAgICAgICAgICAgJChkZXBlbmRzLW9uKQorICAgICAgICAgICAgICAgOiAjIHJlcXVpcmVtZW50cworICAgICAgICAgICAgICAgICA8bmFtZT5RdCQodmVyc2lvbikkKHJlYWxfbmFtZSkkKC5zdWZmaXhfZGVidWcpCisgICAgICAgICAgICAgICAgICQocmVxdWlyZW1lbnRzKQorICAgICAgICAgICAgICAgICA8dmFyaWFudD5kZWJ1ZworICAgICAgICAgICAgICAgOiAjIGRlZmF1bHQtYnVpbGQKKyAgICAgICAgICAgICAgIDogIyB1c2FnZS1yZXF1aXJlbWVudHMKKyAgICAgICAgICAgICAgICAgPGRlZmluZT4kKHVzYWdlLWRlZmluZXMpCisgICAgICAgICAgICAgICAgIDxpbmNsdWRlPiQoLmluY3ByZWZpeCkvJChyZWFsX2luY2x1ZGUpCisgICAgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIE1ha2UgbGlicmFyeSBleHBsaWNpdCBzbyB0aGF0IGEgc2ltcGxlIDx1c2U+cXQ1IHdpbGwgbm90IGJyaW5nIGluIGV2ZXJ5dGhpbmcuCisgICAgIyBBbmQgc29tZSBjb21wb25lbnRzIGxpa2UgUXREQnVzL1Bob25vbiBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zLgorICAgIGV4cGxpY2l0ICQobGliLW5hbWUpIDsKK30KKworIyBVc2UgJCguQklOUFJFRklYWy0xXSkgZm9yIHRoZSBwYXRocyBhcyBzZXZlcmFsIHRvb2xzLXJlcXVpcmVtZW50cyBjYW4gbWF0Y2guCisjIFRoZSBleGFjdCBtYXRjaCBpcyB0aGUgbGFzdCBvbmUuCisKKyMgR2V0IDxpbmNsdWRlPiBhbmQgPGRlZmluZXM+IGZyb20gY3VycmVudCB0b29sc2V0LgorZmxhZ3MgcXQ1Lm1vYyBJTkNMVURFUyA8aW5jbHVkZT4gOworZmxhZ3MgcXQ1Lm1vYyBERUZJTkVTIDxkZWZpbmU+IDsKKworIyBuZWVkIGEgbmV3bGluZSBmb3IgZXhwYW5zaW9uIG9mIERFRklORVMgYW5kIElOQ0xVREVTIGluIHRoZSByZXNwb25zZSBmaWxlLgorLm5sICA9ICIKKyIgOworCisjIFByb2Nlc3NlcyBoZWFkZXJzIHRvIGNyZWF0ZSBRdCBNZXRhT2JqZWN0IGluZm9ybWF0aW9uLiBRdDUtbW9jIGhhcyBpdHMKKyMgYysrLXBhcnNlciwgc28gcGFzcyBJTkNMVURFUyBhbmQgREVGSU5FUy4KKyMgV2UgdXNlIHJlc3BvbnNlIGZpbGUgd2l0aCBvbmUgSU5DTFVERS9ERUZJTkUgcGVyIGxpbmUKKyMKK2FjdGlvbnMgbW9jCit7CisgICAgJCguQklOUFJFRklYWy0xXSkvbW9jIC1mICQoPikgLW8gJCg8KSBAIkAoJCg8KS5yc3A6RT0tRCQoREVGSU5FUykkKC5ubCkgLUkkKElOQ0xVREVTOlQpJCgubmwpKSIKK30KKworIyBXaGVuIG1vY2NpbmcgZmlsZXMgZm9yIGluY2x1ZGUgb25seSwgd2UgZG9uJ3QgbmVlZCAtZiwgb3RoZXJ3aXNlIHRoZSBnZW5lcmF0ZWQKKyMgY29kZSB3aWxsIGluY2x1ZGUgdGhlIC5jcHAgYW5kIHdlJ2xsIGdldCBkdXBsaWNhdGVkIHN5bWJvbHMuCisjCithY3Rpb25zIG1vYy5pbmMKK3sKKyAgICAkKC5CSU5QUkVGSVhbLTFdKS9tb2MgJCg+KSAtbyAkKDwpIEAiQCgkKDwpLnJzcDpFPS1EJChERUZJTkVTKSQoLm5sKSAtSSQoSU5DTFVERVM6VCkkKC5ubCkpIgorfQorCisKKyMgR2V0IGV4dHJhIG9wdGlvbnMgZm9yIFJDQworZmxhZ3MgcXQ1LnJjYyBSQ0NfT1BUSU9OUyA8cmNjZmxhZ3M+IDsKKworIyBHZW5lcmF0ZXMgc291cmNlIGZpbGVzIGZyb20gcmVzb3VyY2UgZmlsZXMuCisjCithY3Rpb25zIHJjYworeworICAgICQoLkJJTlBSRUZJWFstMV0pL3JjYyAkKD4pIC1uYW1lICQoPjpCKSAkKFJDQ19PUFRJT05TKSAtbyAkKDwpCit9CisKKworIyBHZW5lcmF0ZXMgdXNlci1pbnRlcmZhY2Ugc291cmNlIGZyb20gLnVpIGZpbGVzLgorIworYWN0aW9ucyB1aWMKK3sKKyAgICAkKC5CSU5QUkVGSVhbLTFdKS91aWMgJCg+KSAtbyAkKDwpCit9CisKKworIyBTY2FubmVyIGZvciAucXJjIGZpbGVzLiBMb29rIGZvciB0aGUgQ0RBVEEgc2VjdGlvbiBvZiB0aGUgPGZpbGU+IHRhZy4gSWdub3JlCisjIHRoZSAiYWxpYXMiIGF0dHJpYnV0ZS4gU2VlIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdC9yZXNvdXJjZXMuaHRtbCBmb3IKKyMgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiB0aGUgUXQgUmVzb3VyY2UgU3lzdGVtLgorIworY2xhc3MgcXJjLTUtc2Nhbm5lciA6IGNvbW1vbi1zY2FubmVyCit7CisgICAgcnVsZSBwYXR0ZXJuICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICI8ZmlsZS4qPiguKik8L2ZpbGU+IiA7CisgICAgfQorfQorCisKKyMgV3JhcHBlZCBmaWxlcyBhcmUgImluY2x1ZGVkIi4KK3NjYW5uZXIucmVnaXN0ZXIgcXJjLTUtc2Nhbm5lciA6IGluY2x1ZGUgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9xdWlja2Jvb2stY29uZmlnLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcXVpY2tib29rLWNvbmZpZy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4M2E3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcXVpY2tib29rLWNvbmZpZy5qYW0KQEAgLTAsMCArMSw0NCBAQAorI34gQ29weXJpZ2h0IDIwMDUgUmVuZSBSaXZlcmEuCisjfiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjfiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgQXV0b21hdGljIGNvbmZpZ3VyYXRpb24gZm9yIEJvb3N0Qm9vayB0b29scy4gVG8gdXNlLCBqdXN0IGltcG9ydCB0aGlzIG1vZHVsZS4KKworaW1wb3J0IG9zIDsKK2ltcG9ydCB0b29sc2V0IDogdXNpbmcgOworCitpZiBbIG9zLm5hbWUgXSA9IE5UCit7CisgICAgbG9jYWwgYm9vc3QtZGlyID0gOworICAgIGZvciBsb2NhbCBSIGluIHNuYXBzaG90IGN2cyAxLjMzLjAKKyAgICB7CisgICAgICAgIGJvb3N0LWRpciArPSBbIFczMl9HRVRSRUcKKyAgICAgICAgICAgICJIS0VZX0xPQ0FMX01BQ0hJTkVcXFNPRlRXQVJFXFxCb29zdC5vcmdcXCQoUikiCisgICAgICAgICAgICA6ICJJbnN0YWxsUm9vdCIgXSA7CisgICAgfQorICAgIGxvY2FsIHF1aWNrYm9vay1wYXRoID0gWyBHTE9CICIkKGJvb3N0LWRpcilcXGJpbiIgIlxcQm9vc3RcXGJpbiIgOiBxdWlja2Jvb2suZXhlIF0gOworICAgIHF1aWNrYm9vay1wYXRoID0gJChxdWlja2Jvb2stcGF0aFsxXSkgOworICAgIAorICAgIGlmICQocXVpY2tib29rLXBhdGgpCisgICAgeworICAgICAgICBpZiAtLWRlYnVnLWNvbmZpZ3VyYXRpb24gaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0KKyAgICAgICAgeworICAgICAgICAgICAgRUNITyAibm90aWNlOiIgdXNpbmcgcXVpY2tib29rICI6IiAkKHF1aWNrYm9vay1wYXRoKSA7CisgICAgICAgIH0KKyAgICAgICAgdXNpbmcgcXVpY2tib29rIDogJChxdWlja2Jvb2stcGF0aCkgOworICAgIH0KK30KK2Vsc2UKK3sKKyAgICBsb2NhbCBxdWlja2Jvb2stcGF0aCA9IFsgR0xPQiAiL3Vzci9sb2NhbC9iaW4iICIvdXNyL2JpbiIgIi9vcHQvYmluIiA6IHF1aWNrYm9vayBdIDsKKyAgICBxdWlja2Jvb2stcGF0aCA9ICQocXVpY2tib29rLXBhdGhbMV0pIDsKKyAgICAKKyAgICBpZiAkKHF1aWNrYm9vay1wYXRoKQorICAgIHsKKyAgICAgICAgaWYgLS1kZWJ1Zy1jb25maWd1cmF0aW9uIGluIFsgbW9kdWxlcy5wZWVrIDogQVJHViBdCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gIm5vdGljZToiIHVzaW5nIHF1aWNrYm9vayAiOiIgJChxdWlja2Jvb2stcGF0aCkgOworICAgICAgICB9CisgICAgICAgIHVzaW5nIHF1aWNrYm9vayA6ICQocXVpY2tib29rLXBhdGgpIDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3F1aWNrYm9vay5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3F1aWNrYm9vay5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlMmQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvcXVpY2tib29rLmphbQpAQCAtMCwwICsxLDM2MSBAQAorIworIyAgIENvcHlyaWdodCAoYykgMjAwNSBKb+NvIEFiZWNhc2lzCisjICAgQ29weXJpZ2h0IChjKSAyMDA1IFZsYWRpbWlyIFBydXMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDYgUmVuZSBSaXZlcmEKKyMKKyMgICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKyMgICBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyAgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyMKKworIyBUaGlzIHRvb2xzZXQgZGVmaW5lcyBhIGdlbmVyYXRvciB0byB0cmFuc2xhdGUgUXVpY2tCb29rIHRvIEJvb3N0Qm9vay4gSXQgY2FuCisjIGJlIHVzZWQgdG8gZ2VuZXJhdGUgbmljZSAoISkgdXNlciBkb2N1bWVudGF0aW9uIGluIGRpZmZlcmVudCBmb3JtYXRzCisjIChwZGYvaHRtbC8uLi4pLCBmcm9tIGEgc2luZ2xlIHRleHQgZmlsZSB3aXRoIHNpbXBsZSBtYXJrdXAuCisjCisjIFRoZSB0b29sc2V0IGRlZmluZXMgdGhlIFFVSUNLQk9PSyB0eXBlIChmaWxlIGV4dGVuc2lvbiAncWJrJykgYW5kCisjIGEgUVVJQ0tCT09LIHRvIFhNTCAoQk9PU1RCT09LKSBnZW5lcmF0b3IuCisjCisjCisjICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgUSAmIEEKKyMgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMgYWxsIGFib3V0LCBzb21lIFEgJiBBIHdpbGwgaG9wZWZ1bGx5IGdldCB5b3UKKyMgICB1cCB0byBzcGVlZCB3aXRoIFF1aWNrQm9vayBhbmQgdGhpcyB0b29sc2V0LgorIworIworIyAgIFdoYXQgaXMgUXVpY2tCb29rID8KKyMKKyMgICAgICAgUXVpY2tCb29rIGlzIGEgV2lraVdpa2kgc3R5bGUgZG9jdW1lbnRhdGlvbiB0b29sIGdlYXJlZCB0b3dhcmRzIEMrKworIyAgICAgICBkb2N1bWVudGF0aW9uIHVzaW5nIHNpbXBsZSBydWxlcyBhbmQgbWFya3VwIGZvciBzaW1wbGUgZm9ybWF0dGluZyB0YXNrcy4KKyMgICAgICAgUXVpY2tCb29rIGV4dGVuZHMgdGhlIFdpa2lXaWtpIGNvbmNlcHQuIExpa2UgdGhlIFdpa2lXaWtpLCBRdWlja0Jvb2sKKyMgICAgICAgZG9jdW1lbnRzIGFyZSBzaW1wbGUgdGV4dCBmaWxlcy4gQSBzaW5nbGUgUXVpY2tCb29rIGRvY3VtZW50IGNhbgorIyAgICAgICBnZW5lcmF0ZSBhIGZ1bGx5IGxpbmtlZCBzZXQgb2YgbmljZSBIVE1MIGFuZCBQb3N0U2NyaXB0L1BERiBkb2N1bWVudHMKKyMgICAgICAgY29tcGxldGUgd2l0aCBpbWFnZXMgYW5kIHN5bnRheC1jb2xvcml6ZWQgc291cmNlIGNvZGUuCisjCisjCisjICAgV2hlcmUgY2FuIEkgZ2V0IFF1aWNrQm9vayA/CisjCisjICAgICAgIFF1aWNrYm9vayBjYW4gYmUgZm91bmQgaW4gQm9vc3QncyByZXBvc2l0b3J5LCB1bmRlciB0aGUgdG9vbHMvcXVpY2tib29rCisjICAgICAgIGRpcmVjdG9yeSBpdCB3YXMgYWRkZWQgdGhlcmUgb24gSmFuIDIwMDUsIHNvbWUgdGltZSBhZnRlciB0aGUgcmVsZWFzZSBvZgorIyAgICAgICBCb29zdCB2MS4zMi4wIGFuZCBoYXMgYmVlbiBhbiBpbnRlZ3JhbCBwYXJ0IG9mIHRoZSBCb29zdCBkaXN0cmlidXRpb24KKyMgICAgICAgc2luY2UgdjEuMzMuCisjCisjICAgICAgIEhlcmUncyBhIGxpbmsgdG8gdGhlIFNWTiByZXBvc2l0b3J5OgorIyAgICAgICAgICAgaHR0cHM6Ly9zdm4uYm9vc3Qub3JnL3N2bi9ib29zdC90cnVuay90b29scy9xdWlja2Jvb2sKKyMKKyMgICAgICAgQW5kIHRvIFF1aWNrQm9vaydzIFF1aWNrQm9vay1nZW5lcmF0ZWQgZG9jczoKKyMgICAgICAgICAgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL2RvYy9saWJzL3JlbGVhc2UvdG9vbHMvcXVpY2tib29rL2luZGV4Lmh0bWwKKyMKKyMKKyMgICBIb3cgZG8gSSB1c2UgUXVpY2tCb29rIGFuZCB0aGlzIHRvb2xzZXQgaW4gbXkgcHJvamVjdHMgPworIworIyAgICAgICBUaGUgbWluaW1hbCBleGFtcGxlIGlzOgorIworIyAgICAgICAgICAgdXNpbmcgYm9vc3Rib29rIDsKKyMgICAgICAgICAgIGltcG9ydCBxdWlja2Jvb2sgOworIworIyAgICAgICAgICAgYm9vc3Rib29rIG15X2RvY3MgOiBteV9kb2NzX3NvdXJjZS5xYmsgOworIworIyAgICAgICB3aGVyZSBteV9kb2NzIGlzIGEgdGFyZ2V0IG5hbWUgYW5kIG15X2RvY3Nfc291cmNlLnFiayBpcyBhIFF1aWNrQm9vaworIyAgICAgICBmaWxlLiBUaGUgZG9jdW1lbnRhdGlvbiBmb3JtYXQgdG8gYmUgZ2VuZXJhdGVkIGlzIGRldGVybWluZWQgYnkgdGhlCisjICAgICAgIGJvb3N0Ym9vayB0b29sc2V0LiBCeSBkZWZhdWx0IGh0bWwgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkLAorIyAgICAgICBidXQgeW91IHNob3VsZCBjaGVjayBCb29zdEJvb2sncyBkb2NzIHRvIGJlIHN1cmUuCisjCisjCisjICAgV2hhdCBkbyBJIG5lZWQgPworIworIyAgICAgICBZb3Ugc2hvdWxkIHN0YXJ0IGJ5IHNldHRpbmcgdXAgdGhlIEJvb3N0Qm9vayB0b29sc2V0LiBQbGVhc2UgcmVmZXIgdG8KKyMgICAgICAgYm9vc3Rib29rLmphbSBhbmQgdGhlIEJvb3N0Qm9vayBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8KKyMgICAgICAgZG8gdGhpcy4KKyMKKyMgICAgICAgQSBRdWlja0Jvb2sgZXhlY3V0YWJsZSBpcyBhbHNvIG5lZWRlZC4gVGhlIHRvb2xzZXQgd2lsbCBnZW5lcmF0ZSB0aGlzCisjICAgICAgIGV4ZWN1dGFibGUgaWYgaXQgY2FuIGZpbmQgdGhlIFF1aWNrQm9vayBzb3VyY2VzLiBUaGUgZm9sbG93aW5nCisjICAgICAgIGRpcmVjdG9yaWVzIHdpbGwgYmUgc2VhcmNoZWQ6CisjCisjICAgICAgICAgICBCT09TVF9ST09UL3Rvb2xzL3F1aWNrYm9vay8KKyMgICAgICAgICAgIEJPT1NUX0JVSUxEX1BBVEgvLi4vLi4vcXVpY2tib29rLworIworIyAgICAgICAoQk9PU1RfUk9PVCBhbmQgQk9PU1RfQlVJTERfUEFUSCBhcmUgZW52aXJvbm1lbnQgdmFyaWFibGVzKQorIworIyAgICAgICBJZiBRdWlja0Jvb2sgc291cmNlcyBhcmUgbm90IGZvdW5kIHRoZSB0b29sc2V0IHdpbGwgdGhlbiB0cnkgdG8gdXNlCisjICAgICAgIHRoZSBzaGVsbCBjb21tYW5kICdxdWlja2Jvb2snLgorIworIworIyAgIEhvdyBkbyBJIHByb3ZpZGUgYSBjdXN0b20gUXVpY2tCb29rIGV4ZWN1dGFibGUgPworIworIyAgICAgICBZb3UgbWF5IHB1dCB0aGUgZm9sbG93aW5nIGluIHlvdXIgdXNlci1jb25maWcuamFtIG9yIHNpdGUtY29uZmlnLmphbToKKyMKKyMgICAgICAgICAgIHVzaW5nIHF1aWNrYm9vayA6IC9wYXRoL3RvL3F1aWNrYm9vayA7CisjCisjICAgICAgIG9yLCBpZiAncXVpY2tib29rJyBjYW4gYmUgZm91bmQgaW4geW91ciBQQVRILAorIworIyAgICAgICAgICAgdXNpbmcgcXVpY2tib29rIDogcXVpY2tib29rIDsKKyMKKyMKKyMgICBGb3IgY29udmVuaWVuY2UgdGhyZWUgYWx0ZXJuYXRpdmVzIGFyZSB0cmllZCB0byBnZXQgYSBRdWlja0Jvb2sgZXhlY3V0YWJsZToKKyMKKyMgICAgICAgMS4gIElmIHRoZSB1c2VyIHBvaW50cyB1cyB0byB0aGUgYSBRdWlja0Jvb2sgZXhlY3V0YWJsZSwgdGhhdCBpcyB1c2VkLgorIworIyAgICAgICAyLiAgT3RoZXJ3aXNlLCB3ZSBzZWFyY2ggZm9yIHRoZSBRdWlja0Jvb2sgc291cmNlcyBhbmQgY29tcGlsZSBRdWlja0Jvb2sKKyMgICAgICAgICAgIHVzaW5nIHRoZSBkZWZhdWx0IHRvb2xzZXQuCisjCisjICAgICAgIDMuICBBcyBhIGxhc3QgcmVzb3J0LCB3ZSByZWx5IG9uIHRoZSBzaGVsbCBmb3IgZmluZGluZyAncXVpY2tib29rJy4KKyMKKworaW1wb3J0IGJvb3N0Ym9vayA7CitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgdG9vbHNldCA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgc2Nhbm5lciA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgdGFyZ2V0cyA7CitpbXBvcnQgYnVpbGQtc3lzdGVtIDsKK2ltcG9ydCBwYXRoIDsKK2ltcG9ydCBjb21tb24gOworaW1wb3J0IGVycm9ycyA7CisKKyMgVGhlIG9uZSBhbmQgb25seSBRVUlDS0JPT0sgdHlwZSEKK3R5cGUucmVnaXN0ZXIgUVVJQ0tCT09LIDogcWJrIDsKKworIyA8cXVpY2tib29rLWJpbmFyeT4gc2hlbGwgY29tbWFuZCB0byBydW4gUXVpY2tCb29rCisjIDxxdWlja2Jvb2stYmluYXJ5LWRlcGVuZGVuY2llcz4gdGFyZ2V0cyB0byBidWlsZCBRdWlja0Jvb2sgZnJvbSBzb3VyY2VzLgorZmVhdHVyZS5mZWF0dXJlIDxxdWlja2Jvb2stYmluYXJ5PiA6IDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgPHF1aWNrYm9vay1iaW5hcnktZGVwZW5kZW5jaWVzPiA6IDogZnJlZSBkZXBlbmRlbmN5IDsKK2ZlYXR1cmUuZmVhdHVyZSA8cXVpY2tib29rLWRlZmluZT4gOiA6IGZyZWUgOworZmVhdHVyZS5mZWF0dXJlIDxxdWlja2Jvb2staW5kZW50PiA6IDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgPHF1aWNrYm9vay1saW5lLXdpZHRoPiA6IDogZnJlZSA7CisKKworIyBxdWlja2Jvb2stYmluYXJ5LWdlbmVyYXRvciBoYW5kbGVzIGdlbmVyYXRpb24gb2YgdGhlIFF1aWNrQm9vayBleGVjdXRhYmxlLCBieQorIyBtYXJraW5nIGl0IGFzIGEgZGVwZW5kZW5jeSBmb3IgUXVpY2tCb29rIGRvY3MuCisjCisjIElmIHRoZSB1c2VyIHN1cHBsaWVkIHRoZSBRdWlja0Jvb2sgY29tbWFuZCB0aGF0IHdpbGwgYmUgdXNlZC4KKyMKKyMgT3RoZXJ3aXNlIHdlIHNlYXJjaCBzb21lIHNlbnNpYmxlIHBsYWNlcyBmb3IgdGhlIFF1aWNrQm9vayBzb3VyY2VzIGFuZCBjb21waWxlCisjIGZyb20gc2NyYXRjaCB1c2luZyB0aGUgZGVmYXVsdCB0b29sc2V0LgorIworIyBBcyBhIGxhc3QgcmVzb3J0IHdlIHJlbHkgb24gdGhlIHNoZWxsIHRvIGZpbmQgJ3F1aWNrYm9vaycuCisjCitjbGFzcyBxdWlja2Jvb2stYmluYXJ5LWdlbmVyYXRvciA6IGdlbmVyYXRvcgoreworICAgIGltcG9ydCBtb2R1bGVzIHBhdGggdGFyZ2V0cyBxdWlja2Jvb2sgOworCisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKiA6IG11bHRpcGxlID8gKQorICAgIHsKKyAgICAgICAgcXVpY2tib29rLmZyZWV6ZS1jb25maWcgOworICAgICAgICAjIFF1aWNrQm9vayBpbnZvY2F0aW9uIGNvbW1hbmQgYW5kIGRlcGVuZGVuY2llcy4KKyAgICAgICAgbG9jYWwgcXVpY2tib29rLWJpbmFyeSA9IFsgbW9kdWxlcy5wZWVrIHF1aWNrYm9vayA6IC5xdWlja2Jvb2stYmluYXJ5IF0gOworICAgICAgICBsb2NhbCBxdWlja2Jvb2stYmluYXJ5LWRlcGVuZGVuY2llcyA7CisKKyAgICAgICAgaWYgISAkKHF1aWNrYm9vay1iaW5hcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgSWYgdGhlIFF1aWNrQm9vayBzb3VyY2UgZGlyZWN0b3J5IHdhcyBmb3VuZCwgbWFyayBpdHMgbWFpbiB0YXJnZXQKKyAgICAgICAgICAgICMgYXMgYSBkZXBlbmRlbmN5IGZvciB0aGUgY3VycmVudCBwcm9qZWN0LiBPdGhlcndpc2UsIHRyeSB0byBmaW5kCisgICAgICAgICAgICAjICdxdWlja2Jvb2snIGluIHVzZXIncyBQQVRICisgICAgICAgICAgICBsb2NhbCBxdWlja2Jvb2stZGlyID0gWyBtb2R1bGVzLnBlZWsgcXVpY2tib29rIDogLnF1aWNrYm9vay1kaXIgXSA7CisgICAgICAgICAgICBpZiAkKHF1aWNrYm9vay1kaXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBHZXQgdGhlIG1haW4tdGFyZ2V0IGluIFF1aWNrQm9vayBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgbG9jYWwgcXVpY2tib29rLW1haW4tdGFyZ2V0ID0gWyB0YXJnZXRzLnJlc29sdmUtcmVmZXJlbmNlICQocXVpY2tib29rLWRpcikgOiAkKHByb2plY3QpIF0gOworCisgICAgICAgICAgICAgICAgIyBUaGUgZmlyc3QgZWxlbWVudCBhcmUgYWN0dWFsIHRhcmdldHMsIHRoZSBzZWNvbmQgYXJlCisgICAgICAgICAgICAgICAgIyBwcm9wZXJ0aWVzIGZvdW5kIGluIHRhcmdldC1pZC4gV2UgZG8gbm90IGNhcmUgYWJvdXQgdGhlc2UKKyAgICAgICAgICAgICAgICAjIHNpbmNlIHdlIGhhdmUgcGFzc2VkIHRoZSBpZCBvdXJzZWx2ZXMuCisgICAgICAgICAgICAgICAgcXVpY2tib29rLW1haW4tdGFyZ2V0ID0KKyAgICAgICAgICAgICAgICAgICAgWyAkKHF1aWNrYm9vay1tYWluLXRhcmdldFsxXSkubWFpbi10YXJnZXQgcXVpY2tib29rIF0gOworCisgICAgICAgICAgICAgICAgcXVpY2tib29rLWJpbmFyeS1kZXBlbmRlbmNpZXMgPQorICAgICAgICAgICAgICAgICAgICBbICQocXVpY2tib29rLW1haW4tdGFyZ2V0KS5nZW5lcmF0ZSBbICQocHJvcGVydHktc2V0KS5wcm9wYWdhdGVkIF0gXSA7CisKKyAgICAgICAgICAgICAgICAjIElnbm9yZSB1c2FnZS1yZXF1aXJlbWVudHMgcmV0dXJuZWQgYXMgZmlyc3QgZWxlbWVudC4KKyAgICAgICAgICAgICAgICBxdWlja2Jvb2stYmluYXJ5LWRlcGVuZGVuY2llcyA9ICQocXVpY2tib29rLWJpbmFyeS1kZXBlbmRlbmNpZXNbMi1dKSA7CisKKyAgICAgICAgICAgICAgICAjIFNvbWUgdG9vbHNldHMgZ2VuZXJhdGUgZXh0cmEgdGFyZ2V0cyAoZS5nLiBSU1ApLiBXZSBtdXN0IG1hcmsKKyAgICAgICAgICAgICAgICAjIGFsbCB0YXJnZXRzIGFzIGRlcGVuZGVuY2llcyBmb3IgdGhlIHByb2plY3QsIGJ1dCB3ZSB3aWxsIG9ubHkKKyAgICAgICAgICAgICAgICAjIHVzZSB0aGUgRVhFIHRhcmdldCBmb3IgcXVpY2tib29rLXRvLWJvb3N0Ym9vayB0cmFuc2xhdGlvbi4KKyAgICAgICAgICAgICAgICBmb3IgbG9jYWwgdGFyZ2V0IGluICQocXVpY2tib29rLWJpbmFyeS1kZXBlbmRlbmNpZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiBbICQodGFyZ2V0KS50eXBlIF0gPSBFWEUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcXVpY2tib29rLWJpbmFyeSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgcGF0aC5uYXRpdmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgcGF0aC5qb2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICQodGFyZ2V0KS5wYXRoIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgJCh0YXJnZXQpLm5hbWUgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjIEFkZCAkKHF1aWNrYm9vay1iaW5hcnktZGVwZW5kZW5jaWVzKSBhcyBhIGRlcGVuZGVuY3kgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgIyBwcm9qZWN0IGFuZCBzZXQgaXQgYXMgdGhlIDxxdWlja2Jvb2stYmluYXJ5PiBmZWF0dXJlIGZvciB0aGUKKyAgICAgICAgIyBxdWlja2Jvb2stdG8tYm9vc3Rib29rIHJ1bGUsIGJlbG93LgorICAgICAgICBwcm9wZXJ0eS1zZXQgPSBbICQocHJvcGVydHktc2V0KS5hZGQtcmF3CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4kKHF1aWNrYm9vay1iaW5hcnktZGVwZW5kZW5jaWVzKQorICAgICAgICAgICAgPHF1aWNrYm9vay1iaW5hcnk+JChxdWlja2Jvb2stYmluYXJ5KQorICAgICAgICAgICAgPHF1aWNrYm9vay1iaW5hcnktZGVwZW5kZW5jaWVzPiQocXVpY2tib29rLWJpbmFyeS1kZXBlbmRlbmNpZXMpCisgICAgICAgIF0gOworCisgICAgICAgIHJldHVybiBbIGdlbmVyYXRvci5ydW4gJChwcm9qZWN0KSAkKG5hbWUpIDogJChwcm9wZXJ0eS1zZXQpIDogJChzb3VyY2VzKSA6ICQobXVsdGlwbGUpIF0gOworICAgIH0KK30KKworCisjIERlZmluZSBhIHNjYW5uZXIgZm9yIHRyYWNraW5nIFFCSyBpbmNsdWRlIGRlcGVuZGVuY2llcy4KKyMKK2NsYXNzIHFiay1zY2FubmVyIDogY29tbW9uLXNjYW5uZXIKK3sKKyAgICBydWxlIHBhdHRlcm4gKCApCisgICAgeworICAgICAgICByZXR1cm4gIlxcW1sgXSppbmNsdWRlWyBdKyhbXl1dKylcXF0iIAorICAgICAgICAiXFxbWyBdKmluY2x1ZGU6W2EtekEtWjAtOV9dK1sgXSsoW15dXSspXFxdIiAKKyAgICAgICAgIlxcW1sgXSppbXBvcnRbIF0rKFteXV0rKVxcXSIgOworICAgIH0KK30KKworCitzY2FubmVyLnJlZ2lzdGVyIHFiay1zY2FubmVyIDogaW5jbHVkZSA7CisKK3R5cGUuc2V0LXNjYW5uZXIgUVVJQ0tCT09LIDogcWJrLXNjYW5uZXIgOworCisKKyMgSW5pdGlhbGl6YXRpb24gb2YgdG9vbHNldC4KKyMKKyMgUGFyYW1ldGVyczoKKyMgICBjb21tYW5kID8gICAgLT4gcGF0aCB0byBRdWlja0Jvb2sgZXhlY3V0YWJsZS4KKyMKKyMgV2hlbiBjb21tYW5kIGlzIG5vdCBzdXBwbGllZCB0b29sc2V0IHdpbGwgc2VhcmNoIGZvciBRdWlja0Jvb2sgZGlyZWN0b3J5IGFuZAorIyBjb21waWxlIHRoZSBleGVjdXRhYmxlIGZyb20gc291cmNlLiBJZiB0aGF0IGZhaWxzIHdlIHN0aWxsIHNlYXJjaCB0aGUgcGF0aCBmb3IKKyMgJ3F1aWNrYm9vaycuCisjCitydWxlIGluaXQgKAorICAgICAgICBjb21tYW5kID8gICAjIHBhdGggdG8gdGhlIFF1aWNrQm9vayBleGVjdXRhYmxlLgorICAgICkKK3sKKyAgICBpZiAkKGNvbW1hbmQpCisgICAgeworICAgICAgICBpZiAkKC5jb25maWctZnJvemVuKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcnMudXNlci1lcnJvciAicXVpY2tib29rOiBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGl0IGhhcyBiZWVuIHVzZWQuIiA7CisgICAgICAgIH0KKyAgICAgICAgLmNvbW1hbmQgPSAkKGNvbW1hbmQpIDsKKyAgICB9Cit9CisKK3J1bGUgZnJlZXplLWNvbmZpZyAoICkKK3sKKyAgICBpZiAhICQoLmNvbmZpZy1mcm96ZW4pCisgICAgeworICAgICAgICAuY29uZmlnLWZyb3plbiA9IHRydWUgOworCisgICAgICAgICMgUXVpY2tCb29rIGludm9jYXRpb24gY29tbWFuZCBhbmQgZGVwZW5kZW5jaWVzLgorCisgICAgICAgIC5xdWlja2Jvb2stYmluYXJ5ID0gJCguY29tbWFuZCkgOworCisgICAgICAgIGlmICQoLnF1aWNrYm9vay1iaW5hcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgVXNlIHVzZXItc3VwcGxpZWQgY29tbWFuZC4KKyAgICAgICAgICAgIC5xdWlja2Jvb2stYmluYXJ5ID0gWyBjb21tb24uZ2V0LWludm9jYXRpb24tY29tbWFuZCBxdWlja2Jvb2sgOiBxdWlja2Jvb2sgOiAkKC5xdWlja2Jvb2stYmluYXJ5KSBdIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICMgU2VhcmNoIGZvciBRdWlja0Jvb2sgc291cmNlcyBpbiBzZW5zaWJsZSBwbGFjZXMsIGxpa2UKKyAgICAgICAgICAgICMgICAkKEJPT1NUX1JPT1QpL3Rvb2xzL3F1aWNrYm9vaworICAgICAgICAgICAgIyAgICQoQk9PU1RfQlVJTERfUEFUSCkvLi4vLi4vcXVpY2tib29rCisKKyAgICAgICAgICAgICMgQW5kIGJ1aWxkIHF1aWNrYm9vayBleGVjdXRhYmxlIGZyb20gc291cmNlcy4KKworICAgICAgICAgICAgbG9jYWwgYm9vc3Qtcm9vdCA9IFsgbW9kdWxlcy5wZWVrIDogQk9PU1RfUk9PVCBdIDsKKyAgICAgICAgICAgIGxvY2FsIGJvb3N0LWJ1aWxkLXBhdGggPSBbIGJ1aWxkLXN5c3RlbS5sb2NhdGlvbiBdIDsKKworICAgICAgICAgICAgaWYgJChib29zdC1yb290KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5xdWlja2Jvb2stZGlyICs9IFsgcGF0aC5qb2luICQoYm9vc3Qtcm9vdCkgdG9vbHMgXSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICQoYm9vc3QtYnVpbGQtcGF0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAucXVpY2tib29rLWRpciArPSAkKGJvb3N0LWJ1aWxkLXBhdGgpLy4uLy4uIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLnF1aWNrYm9vay1kaXIgPSBbIHBhdGguZ2xvYiAkKC5xdWlja2Jvb2stZGlyKSA6IHF1aWNrYm9vayBdIDsKKworICAgICAgICAgICAgIyBJZiB0aGUgUXVpY2tCb29rIHNvdXJjZSBkaXJlY3Rvcnkgd2FzIGZvdW5kLCBtYXJrIGl0cyBtYWluIHRhcmdldAorICAgICAgICAgICAgIyBhcyBhIGRlcGVuZGVuY3kgZm9yIHRoZSBjdXJyZW50IHByb2plY3QuIE90aGVyd2lzZSwgdHJ5IHRvIGZpbmQKKyAgICAgICAgICAgICMgJ3F1aWNrYm9vaycgaW4gdXNlcidzIFBBVEgKKyAgICAgICAgICAgIGlmICQoLnF1aWNrYm9vay1kaXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLnF1aWNrYm9vay1kaXIgPSBbIHBhdGgubWFrZSAkKC5xdWlja2Jvb2stZGlyWzFdKSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFQ0hPICJRdWlja0Jvb2sgd2FybmluZzogVGhlIHBhdGggdG8gdGhlIHF1aWNrYm9vayBleGVjdXRhYmxlIHdhcyIgOworICAgICAgICAgICAgICAgIEVDSE8gIiAgbm90IHByb3ZpZGVkLiBBZGRpdGlvbmFsbHksIGNvdWxkbid0IGZpbmQgUXVpY2tCb29rIiA7CisgICAgICAgICAgICAgICAgRUNITyAiICBzb3VyY2VzIHNlYXJjaGluZyBpbiIgOworICAgICAgICAgICAgICAgIEVDSE8gIiAgICAqIEJPT1NUX1JPT1QvdG9vbHMvcXVpY2tib29rIiA7CisgICAgICAgICAgICAgICAgRUNITyAiICAgICogQk9PU1RfQlVJTERfUEFUSC8uLi8uLi9xdWlja2Jvb2siIDsKKyAgICAgICAgICAgICAgICBFQ0hPICIgIFdpbGwgbm93IHRyeSB0byBmaW5kIGEgcHJlY29tcGlsZWQgZXhlY3V0YWJsZSBieSBzZWFyY2hpbmciIDsKKyAgICAgICAgICAgICAgICBFQ0hPICIgIHRoZSBQQVRIIGZvciAncXVpY2tib29rJy4iIDsKKyAgICAgICAgICAgICAgICBFQ0hPICIgIFRvIGRpc2FibGUgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIG9yIHRvIGNvbXBsZXRlbHkiIDsKKyAgICAgICAgICAgICAgICBFQ0hPICIgIGF2b2lkIGNvbXBpbGF0aW9uIG9mIHF1aWNrYm9vaywgeW91IGNhbiBleHBsaWNpdGx5IHNldCB0aGUiIDsKKyAgICAgICAgICAgICAgICBFQ0hPICIgIHBhdGggdG8gYSBxdWlja2Jvb2sgZXhlY3V0YWJsZSBjb21tYW5kIGluIHVzZXItY29uZmlnLmphbSIgOworICAgICAgICAgICAgICAgIEVDSE8gIiAgb3Igc2l0ZS1jb25maWcuamFtIHdpdGggdGhlIGNhbGwiIDsKKyAgICAgICAgICAgICAgICBFQ0hPICIgICAgdXNpbmcgcXVpY2tib29rIDogL3BhdGgvdG8vcXVpY2tib29rIDsiIDsKKworICAgICAgICAgICAgICAgICMgQXMgYSBsYXN0IHJlc29ydCwgc2VhcmNoIGZvciAncXVpY2tib29rJyBjb21tYW5kIGluIHBhdGguIE5vdGUKKyAgICAgICAgICAgICAgICAjIHRoYXQgZXZlbiBpZiB0aGUgJ3F1aWNrYm9vaycgY29tbWFuZCBpcyBub3QgZm91bmQsCisgICAgICAgICAgICAgICAgIyBnZXQtaW52b2NhdGlvbi1jb21tYW5kIHdpbGwgc3RpbGwgcmV0dXJuICdxdWlja2Jvb2snIGFuZCBtaWdodAorICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgYW4gZXJyb3Igd2hpbGUgZ2VuZXJhdGluZyB0aGUgdmlydHVhbC10YXJnZXQuCisKKyAgICAgICAgICAgICAgICAucXVpY2tib29rLWJpbmFyeSA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgcXVpY2tib29rIDogcXVpY2tib29rIF0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK2dlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgcXVpY2tib29rLWJpbmFyeS1nZW5lcmF0b3IgcXVpY2tib29rLnF1aWNrYm9vay10by1ib29zdGJvb2sgOiBRVUlDS0JPT0sgOiBYTUwgXSA7CisKKworIyA8cXVpY2tib29rLWJpbmFyeT4gc2hlbGwgY29tbWFuZCB0byBydW4gUXVpY2tCb29rCisjIDxxdWlja2Jvb2stYmluYXJ5LWRlcGVuZGVuY2llcz4gdGFyZ2V0cyB0byBidWlsZCBRdWlja0Jvb2sgZnJvbSBzb3VyY2VzLgordG9vbHNldC5mbGFncyBxdWlja2Jvb2sucXVpY2tib29rLXRvLWJvb3N0Ym9vayBRQi1DT01NQU5EICAgICAgPHF1aWNrYm9vay1iaW5hcnk+IDsKK3Rvb2xzZXQuZmxhZ3MgcXVpY2tib29rLnF1aWNrYm9vay10by1ib29zdGJvb2sgUUItREVQRU5ERU5DSUVTIDxxdWlja2Jvb2stYmluYXJ5LWRlcGVuZGVuY2llcz4gOwordG9vbHNldC5mbGFncyBxdWlja2Jvb2sucXVpY2tib29rLXRvLWJvb3N0Ym9vayBJTkNMVURFUyAgICAgICAgPGluY2x1ZGU+IDsKK3Rvb2xzZXQuZmxhZ3MgcXVpY2tib29rLnF1aWNrYm9vay10by1ib29zdGJvb2sgUUItREVGSU5FUyAgICAgIDxxdWlja2Jvb2stZGVmaW5lPiA7Cit0b29sc2V0LmZsYWdzIHF1aWNrYm9vay5xdWlja2Jvb2stdG8tYm9vc3Rib29rIFFCLUlOREVOVCAgICAgICA8cXVpY2tib29rLWluZGVudD4gOwordG9vbHNldC5mbGFncyBxdWlja2Jvb2sucXVpY2tib29rLXRvLWJvb3N0Ym9vayBRQi1MSU5FLVdJRFRIICAgPHF1aWNrYm9vay1saW5lLXdpZHRoPiA7CisKKworcnVsZSBxdWlja2Jvb2stdG8tYm9vc3Rib29rICggdGFyZ2V0IDogc291cmNlIDogcHJvcGVydGllcyAqICkKK3sKKyAgICAjIFNpZ25hbCBkZXBlbmRlbmN5IG9mIHF1aWNrYm9vayBzb3VyY2VzIG9uIDxxdWlja2Jvb2stYmluYXJ5LWRlcGVuZGVuY2llcz4KKyAgICAjIHVwb24gaW52b2NhdGlvbiBvZiBxdWlja2Jvb2stdG8tYm9vc3Rib29rLgorICAgIERFUEVORFMgJCh0YXJnZXQpIDogWyBvbiAkKHRhcmdldCkgcmV0dXJuICQoUUItREVQRU5ERU5DSUVTKSBdIDsKK30KKworCithY3Rpb25zIHF1aWNrYm9vay10by1ib29zdGJvb2sKK3sKKyAgICAiJChRQi1DT01NQU5EKSIgLUkiJChJTkNMVURFUykiIC1EIiQoUUItREVGSU5FUykiIC0taW5kZW50PSIkKFFCLUlOREVOVCkiIC0tbGluZXdpZHRoPSIkKFFCLUxJTkUtV0lEVEgpIiAtLW91dHB1dC1maWxlPSIkKDEpIiAiJCgyKSIKK30KKworCisjIERlY2xhcmUgYSBtYWluIHRhcmdldCB0byBjb252ZXJ0IGEgcXVpY2tib29rIHNvdXJjZSBpbnRvIGEgYm9vc3Rib29rIFhNTCBmaWxlLgorIworcnVsZSB0by1ib29zdGJvb2sgKCB0YXJnZXQtbmFtZSA6IHNvdXJjZXMgKiA6IHJlcXVpcmVtZW50cyAqIDogZGVmYXVsdC1idWlsZCAqICkKK3sgCisgIGxvY2FsIHByb2plY3QgPSBbIHByb2plY3QuY3VycmVudCBdIDsKKyAgICAKKyAgdGFyZ2V0cy5tYWluLXRhcmdldC1hbHRlcm5hdGl2ZSAKKyAgICBbIG5ldyB0eXBlZC10YXJnZXQgJCh0YXJnZXQtbmFtZSkgOiAkKHByb2plY3QpIDogWE1MCisgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LXNvdXJjZXMgJChzb3VyY2VzKSA6ICQodGFyZ2V0LW5hbWUpIF0gCisgICAgICAgIDogWyB0YXJnZXRzLm1haW4tdGFyZ2V0LXJlcXVpcmVtZW50cyAkKHJlcXVpcmVtZW50cykgOiAkKHByb2plY3QpIF0KKyAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtZGVmYXVsdC1idWlsZCAkKGRlZmF1bHQtYnVpbGQpIDogJChwcm9qZWN0KSBdIAorICAgIF0gOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9yYy5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3JjLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTQwNzFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9yYy5qYW0KQEAgLTAsMCArMSwxNTUgQEAKKyMgIENvcHlyaWdodCAoQykgQW5kcmUgSGVudHogMjAwMy4gUGVybWlzc2lvbiB0byBjb3B5LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQKKyMgIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluCisjICBhbGwgY29waWVzLiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKyMgIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgorIworIyAgQ29weXJpZ2h0IChjKSAyMDA2IFJlbmUgUml2ZXJhLgorIworIyAgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorIyAgTGljZW5zZSBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKKyMgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IHNjYW5uZXIgOworaW1wb3J0IHRvb2xzZXQgOiBmbGFncyA7CitpbXBvcnQgdHlwZSA7CisKK2lmIFsgTUFUQ0ggKC0tZGVidWctY29uZmlndXJhdGlvbikgOiBbIG1vZHVsZXMucGVlayA6IEFSR1YgXSBdCit7CisgICAgLmRlYnVnLWNvbmZpZ3VyYXRpb24gPSB0cnVlIDsKK30KKwordHlwZS5yZWdpc3RlciBSQyA6IHJjIDsKKworcnVsZSBpbml0ICggKQoreworfQorCisjIENvbmZpZ3VyZXMgYSBuZXcgcmVzb3VyY2UgY29tcGlsYXRpb24gY29tbWFuZCBzcGVjaWZpYyB0byBhIGNvbmRpdGlvbiwKKyMgdXN1YWxseSBhIHRvb2xzZXQgc2VsZWN0aW9uIGNvbmRpdGlvbi4gVGhlIHBvc3NpYmxlIG9wdGlvbnMgYXJlOgorIworIyAgICAgKiA8cmMtdHlwZT4ocmN8d2luZHJlcykgLSBJbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygb3B0aW9ucyB0aGUgY29tbWFuZAorIyAgICAgICBhY2NlcHRzLgorIworIyBFdmVuIHRob3VnaCB0aGUgYXJndW1lbnRzIGFyZSBhbGwgb3B0aW9uYWwsIG9ubHkgd2hlbiBhIGNvbW1hbmQsIGNvbmRpdGlvbiwKKyMgYW5kIGF0IG1pbmltdW0gdGhlIHJjLXR5cGUgb3B0aW9uIGFyZSBnaXZlbiB3aWxsIHRoZSBjb21tYW5kIGJlIGNvbmZpZ3VyZWQuCisjIFRoaXMgaXMgc28gdGhhdCBjYWxsZXJzIGRvbid0IGhhdmUgdG8gY2hlY2sgYXV0by1jb25maWd1cmF0aW9uIHZhbHVlcyBiZWZvcmUKKyMgY2FsbGluZyB0aGlzLiBBbmQgc3RpbGwgZ2V0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIGJ1aWxkIGZhaWx1cmVzIHdoZW4gdGhlCisjIHJlc291cmNlIGNvbXBpbGVyIGNhbiBub3QgYmUgZm91bmQuCisjCitydWxlIGNvbmZpZ3VyZSAoIGNvbW1hbmQgPyA6IGNvbmRpdGlvbiA/IDogb3B0aW9ucyAqICkKK3sKKyAgICBsb2NhbCByYy10eXBlID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPHJjLXR5cGU+IDogJChvcHRpb25zKSBdIDsKKworICAgIGlmICQoY29tbWFuZCkgJiYgJChjb25kaXRpb24pICYmICQocmMtdHlwZSkKKyAgICB7CisgICAgICAgIGZsYWdzIHJjLmNvbXBpbGUucmVzb3VyY2UgLlJDICQoY29uZGl0aW9uKSA6ICQoY29tbWFuZCkgOworICAgICAgICBmbGFncyByYy5jb21waWxlLnJlc291cmNlIC5SQ19UWVBFICQoY29uZGl0aW9uKSA6ICQocmMtdHlwZTpMKSA7CisgICAgICAgIGZsYWdzIHJjLmNvbXBpbGUucmVzb3VyY2UgREVGSU5FUyA8ZGVmaW5lPiA7CisgICAgICAgIGZsYWdzIHJjLmNvbXBpbGUucmVzb3VyY2UgSU5DTFVERVMgPGluY2x1ZGU+IDsKKyAgICAgICAgaWYgJCguZGVidWctY29uZmlndXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgRUNITyBub3RpY2U6IHVzaW5nIHJjIGNvbXBpbGVyIDo6ICQoY29uZGl0aW9uKSA6OiAkKGNvbW1hbmQpIDsKKyAgICAgICAgfQorICAgIH0KK30KKworcnVsZSBjb21waWxlLnJlc291cmNlICggdGFyZ2V0IDogc291cmNlcyAqIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NhbCByYy10eXBlID0gWyBvbiAkKHRhcmdldCkgcmV0dXJuICQoLlJDX1RZUEUpIF0gOworICAgIHJjLXR5cGUgPz0gbnVsbCA7CisgICAgY29tcGlsZS5yZXNvdXJjZS4kKHJjLXR5cGUpICQodGFyZ2V0KSA6ICQoc291cmNlc1sxXSkgOworfQorCithY3Rpb25zIGNvbXBpbGUucmVzb3VyY2UucmMKK3sKKyAgICAiJCguUkMpIiAtbCAweDQwOSAiLVUkKFVOREVGUykiICItRCQoREVGSU5FUykiIC1JIiQoPjpEKSIgLUkiJCg8OkQpIiAtSSIkKElOQ0xVREVTKSIgLWZvICIkKDwpIiAiJCg+KSIKK30KKworYWN0aW9ucyBjb21waWxlLnJlc291cmNlLndpbmRyZXMKK3sKKyAgICAiJCguUkMpIiAiLVUkKFVOREVGUykiICItRCQoREVGSU5FUykiIC1JIiQoPjpEKSIgLUkiJCg8OkQpIiAtSSIkKElOQ0xVREVTKSIgLW8gIiQoPCkiIC1pICIkKD4pIgorfQorCithY3Rpb25zIHF1aWV0bHkgY29tcGlsZS5yZXNvdXJjZS5udWxsCit7CisgICAgYXMgL2Rldi9udWxsIC1vICIkKDwpIgorfQorCisjIFNpbmNlIGl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byB3cml0ZQorIyAgIGV4ZSBoZWxsbyA6IGhlbGxvLmNwcCBoZWxsby5yYworIyB3ZSBjaGFuZ2UgdGhlIG5hbWUgb2Ygb2JqZWN0IGNyZWF0ZWQgZnJvbSBSQyBmaWxlLCB0byBhdm9pZCBjb25mbGljdCB3aXRoCisjIGhlbGxvLmNwcC4gVGhlIHJlYXNvbiB3ZSBnZW5lcmF0ZSBPQkogYW5kIG5vdCBSRVMsIGlzIHRoYXQgZ2NjIGRvZXMgbm90IHNlZW0KKyMgdG8gbGlrZSBSRVMgZmlsZXMsIGJ1dCB3b3JrcyBPSyB3aXRoIE9CSiAoc2VlCisjIGh0dHA6Ly9hcnRpY2xlLmdtYW5lLm9yZy9nbWFuZS5jb21wLmxpYi5ib29zdC5idWlsZC81NjQzKS4KKyMKKyMgVXNpbmcgJ3JlZ2lzdGVyLWMtY29tcGlsZXInIGFkZHMgdGhlIGJ1aWxkIGRpcmVjdG9yeSB0byBJTkNMVURFUworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIHJjLmNvbXBpbGUucmVzb3VyY2UgOiBSQyA6IE9CSiglX3JlcykgOworCisjIFJlZ2lzdGVyIHNjYW5uZXIgZm9yIHJlc291cmNlcworY2xhc3MgcmVzLXNjYW5uZXIgOiBzY2FubmVyCit7CisgICAgaW1wb3J0IHBhdGggOworICAgIGltcG9ydCByZWdleCA7CisgICAgaW1wb3J0IHNjYW5uZXIgOworICAgIGltcG9ydCB2aXJ0dWFsLXRhcmdldCA7CisKKyAgICBydWxlIF9faW5pdF9fICggaW5jbHVkZXMgKiApCisgICAgeworICAgICAgICBzY2FubmVyLl9faW5pdF9fIDsKKyAgICAgICAgc2VsZi5pbmNsdWRlcyA9ICQoaW5jbHVkZXMpIDsKKyAgICB9CisKKyAgICBydWxlIHBhdHRlcm4gKCApCisgICAgeworICAgICAgICByZXR1cm4gIigoW14gXStbIF0rKEJJVE1BUHxDVVJTT1J8Rk9OVHxJQ09OfE1FU1NBR0VUQUJMRXxSVF9NQU5JRkVTVClbIF0rKFteIFwiXSt8XCJbXlwiXStcIikpfCgjaW5jbHVkZVsgXSooPFtePF0rPnxcIlteXCJdK1wiKSkpIiA7CisgICAgfQorCisgICAgcnVsZSBwcm9jZXNzICggdGFyZ2V0IDogbWF0Y2hlcyAqIDogYmluZGluZyApCisgICAgeworICAgICAgICBsb2NhbCBhbmdsZSA9IFsgcmVnZXgudHJhbnNmb3JtICQobWF0Y2hlcykgOiAiI2luY2x1ZGVbIF0qPChbXjxdKyk+IiBdIDsKKyAgICAgICAgbG9jYWwgcXVvdGVkID0gWyByZWdleC50cmFuc2Zvcm0gJChtYXRjaGVzKSA6ICIjaW5jbHVkZVsgXSpcIihbXlwiXSspXCIiIF0gOworICAgICAgICBsb2NhbCByZXMgPSBbIHJlZ2V4LnRyYW5zZm9ybSAkKG1hdGNoZXMpIDogIlteIF0rWyBdKyhCSVRNQVB8Q1VSU09SfEZPTlR8SUNPTnxNRVNTQUdFVEFCTEV8UlRfTUFOSUZFU1QpWyBdKygoW14gXCJdKyl8XCIoW15cIl0rKVwiKSIgOiAzIDQgXSA7CisKKyAgICAgICAgIyBJY29ucyBhbmQgb3RoZXIgaW5jbHVkZXMgbWF5IGJlIHJlZmVyZW5jZWQgYXMKKyAgICAgICAgIworICAgICAgICAjIElEUl9NQUlORlJBTUUgSUNPTiAicmVzXFxpY29uLmljbyIKKyAgICAgICAgIworICAgICAgICAjIHNvIHdlIGhhdmUgdG8gcmVwbGFjZSBkb3VibGUgYmFja3NsYXNoZXMgd2l0aCBzaW5nbGUgb25lcy4KKyAgICAgICAgcmVzID0gWyByZWdleC5yZXBsYWNlLWxpc3QgJChyZXMpIDogIlxcXFxcXFxcIiA6ICIvIiBdIDsKKworICAgICAgICAjIENPTlNJREVSOiB0aGUgbmV3IHNjb3BpbmcgcnVsZXMgc2VlbSB0byBkZWZlYXQgIm9uIHRhcmdldCIgdmFyaWFibGVzLgorICAgICAgICBsb2NhbCBnID0gWyBvbiAkKHRhcmdldCkgcmV0dXJuICQoSERSR1JJU1QpIF0gOworICAgICAgICBsb2NhbCBiID0gWyBOT1JNQUxJWkVfUEFUSCAkKGJpbmRpbmc6RCkgXSA7CisKKyAgICAgICAgIyBBdHRhY2ggYmluZGluZyBvZiBpbmNsdWRpbmcgZmlsZSB0byBpbmNsdWRlZCB0YXJnZXRzLiBXaGVuIGEgdGFyZ2V0IGlzCisgICAgICAgICMgZGlyZWN0bHkgY3JlYXRlZCBmcm9tIGEgdmlydHVhbCB0YXJnZXQgdGhpcyBleHRyYSBpbmZvcm1hdGlvbiBpcworICAgICAgICAjIHVubmVjZXNzYXJ5LiBCdXQgaW4gb3RoZXIgY2FzZXMsIGl0IGFsbG93cyB1cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgICAgICAgICMgdHdvIGhlYWRlcnMgb2YgdGhlIHNhbWUgbmFtZSBpbmNsdWRlZCBmcm9tIGRpZmZlcmVudCBwbGFjZXMuIFdlIGRvIG5vdAorICAgICAgICAjIG5lZWQgdGhpcyBleHRyYSBpbmZvcm1hdGlvbiBmb3IgYW5nbGUgaW5jbHVkZXMsIHNpbmNlIHRoZXkgc2hvdWxkIG5vdAorICAgICAgICAjIGRlcGVuZCBvbiB0aGUgaW5jbHVkaW5nIGZpbGUgKHdlIGNhbiBub3QgZ2V0IGxpdGVyYWwgIi4iIGluIHRoZQorICAgICAgICAjIGluY2x1ZGUgcGF0aCkuCisgICAgICAgIGxvY2FsIGcyID0gJChnKSIjIiQoYikgOworCisgICAgICAgIGFuZ2xlID0gJChhbmdsZTpHPSQoZykpIDsKKyAgICAgICAgcXVvdGVkID0gJChxdW90ZWQ6Rz0kKGcyKSkgOworICAgICAgICByZXMgPSAkKHJlczpHPSQoZzIpKSA7CisKKyAgICAgICAgbG9jYWwgYWxsID0gJChhbmdsZSkgJChxdW90ZWQpICQocmVzKSA7CisKKyAgICAgICAgSU5DTFVERVMgJCh0YXJnZXQpIDogJChhbGwpIDsKKyAgICAgICAgTk9DQVJFICQoYWxsKSA7CisgICAgICAgIFNFQVJDSCBvbiAkKGFuZ2xlKSA9ICQoc2VsZi5pbmNsdWRlczpHPSkgOworICAgICAgICBTRUFSQ0ggb24gJChxdW90ZWQpICQocmVzKSA9ICQoYikgJChzZWxmLmluY2x1ZGVzOkc9KSA7CisKKyAgICAgICAgIyBKdXN0IHByb3BhZ2F0ZSB0aGUgY3VycmVudCBzY2FubmVyIHRvIGluY2x1ZGVzLCBpbiBob3BlIHRoYXQgaW5jbHVkZXMKKyAgICAgICAgIyBkbyBub3QgY2hhbmdlIHNjYW5uZXJzLgorICAgICAgICBzY2FubmVyLnByb3BhZ2F0ZSAkKF9fbmFtZV9fKSA6ICQoYW5nbGUpICQocXVvdGVkKSA6ICQodGFyZ2V0KSA7CisKKyAgICAgICAgSVNGSUxFICQoYWxsKSA7CisgICAgfQorfQorCitzY2FubmVyLnJlZ2lzdGVyIHJlcy1zY2FubmVyIDogaW5jbHVkZSA7Cit0eXBlLnNldC1zY2FubmVyIFJDIDogcmVzLXNjYW5uZXIgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9zdGFnZS5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3N0YWdlLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAwNWFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9zdGFnZS5qYW0KQEAgLTAsMCArMSw1MTkgQEAKKyMgQ29weXJpZ2h0IDIwMDMgRGF2ZSBBYnJhaGFtcworIyBDb3B5cmlnaHQgMjAwNSwgMjAwNiBSZW5lIFJpdmVyYQorIyBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBWbGFkaW1pciBQcnVzCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgJ2luc3RhbGwnIHJ1bGUsIHVzZWQgdG8gY29weSBhIHNldCBvZiB0YXJnZXRzIHRvIGEKKyMgc2luZ2xlIGxvY2F0aW9uLgorCitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgcGF0aCA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgdGFyZ2V0cyA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgdHlwZXMvcmVnaXN0ZXIgOworaW1wb3J0IHZpcnR1YWwtdGFyZ2V0IDsKKworCitmZWF0dXJlLmZlYXR1cmUgPGluc3RhbGwtZGVwZW5kZW5jaWVzPiA6IG9mZiBvbiA6IGluY2lkZW50YWwgICAgICA7CitmZWF0dXJlLmZlYXR1cmUgPGluc3RhbGwtdHlwZT4gICAgICAgICA6ICAgICAgICA6IGZyZWUgaW5jaWRlbnRhbCA7CitmZWF0dXJlLmZlYXR1cmUgPGluc3RhbGwtc291cmNlLXJvb3Q+ICA6ICAgICAgICA6IGZyZWUgcGF0aCAgICAgICA7CitmZWF0dXJlLmZlYXR1cmUgPHNvLXZlcnNpb24+ICAgICAgICAgICA6ICAgICAgICA6IGZyZWUgaW5jaWRlbnRhbCA7CisKKyMgSWYgJ29uJywgdmVyc2lvbiBzeW1saW5rcyBmb3Igc2hhcmVkIGxpYnJhcmllcyB3aWxsIG5vdCBiZSBjcmVhdGVkLiBBZmZlY3RzCisjIFVuaXggYnVpbGRzIG9ubHkuCitmZWF0dXJlLmZlYXR1cmUgPGluc3RhbGwtbm8tdmVyc2lvbi1zeW1saW5rcz4gOiBvbiA6IG9wdGlvbmFsIGluY2lkZW50YWwgOworCisKK2NsYXNzIGluc3RhbGwtdGFyZ2V0LWNsYXNzIDogYmFzaWMtdGFyZ2V0Cit7CisgICAgaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworICAgIGltcG9ydCBmZWF0dXJlIDsKKyAgICBpbXBvcnQgZ2VuZXJhdG9ycyA7CisgICAgaW1wb3J0IHBhdGggOworICAgIGltcG9ydCBwcm9qZWN0IDsKKyAgICBpbXBvcnQgcHJvcGVydHkgOworICAgIGltcG9ydCBwcm9wZXJ0eS1zZXQgOworICAgIGltcG9ydCBzdGFnZSA7CisgICAgaW1wb3J0IHR5cGUgOworCisgICAgcnVsZSBfX2luaXRfXyAoIG5hbWUtYW5kLWRpciA6IHByb2plY3QgOiBzb3VyY2VzICogOiByZXF1aXJlbWVudHMgKiA6CisgICAgICAgIGRlZmF1bHQtYnVpbGQgKiA6IHVzYWdlLXJlcXVpcmVtZW50cyAqICkKKyAgICB7CisgICAgICAgICMgVGhlIHVzYWdlLXJlcXVpcmVtZW50cyBzcGVjaWZpZWQgaGVyZSBhcmUgaWdub3JlZCBidXQgYXJlIHRha2VuIGFzIGEKKyAgICAgICAgIyBwYXJhbWV0ZXIgdG8gaGF2ZSB0aGlzIG1ldGF0YXJnZXQgY2xhc3MgaGF2ZSB0aGUgc2FtZSBzdGFuZGFyZAorICAgICAgICAjIGluc3RhbnRpYXRpb24gaW50ZXJmYWNlIGFzIGFsbCB0aGUgb3RoZXIgQm9vc3QgQnVpbGQgbWV0YXRhcmdldAorICAgICAgICAjIGNsYXNzZXMuCisgICAgICAgIGJhc2ljLXRhcmdldC5fX2luaXRfXyAkKG5hbWUtYW5kLWRpcikgOiAkKHByb2plY3QpIDogJChzb3VyY2VzKSA6CisgICAgICAgICAgICAkKHJlcXVpcmVtZW50cykgOiAkKGRlZmF1bHQtYnVpbGQpIDsKKyAgICB9CisKKyAgICAjIElmIDxsb2NhdGlvbj4gaXMgbm90IHNldCwgc2V0cyBpdCBiYXNlZCBvbiB0aGUgcHJvamVjdCBkYXRhLgorICAgICMKKyAgICBydWxlIHVwZGF0ZS1sb2NhdGlvbiAoIHByb3BlcnR5LXNldCApCisgICAgeworICAgICAgICBsb2NhbCBsb2MgPSBbICQocHJvcGVydHktc2V0KS5nZXQgPGxvY2F0aW9uPiBdIDsKKyAgICAgICAgaWYgISAkKGxvYykKKyAgICAgICAgeworICAgICAgICAgICAgbG9jID0gWyBwYXRoLnJvb3QgJChzZWxmLm5hbWUpIFsgJChzZWxmLnByb2plY3QpLmdldCBsb2NhdGlvbiBdIF0gOworICAgICAgICAgICAgcHJvcGVydHktc2V0ID0gWyAkKHByb3BlcnR5LXNldCkuYWRkLXJhdyAkKGxvYzpHPTxsb2NhdGlvbj4pIF0gOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICQocHJvcGVydHktc2V0KSA7CisgICAgfQorCisgICAgIyBUYWtlcyBhIHRhcmdldCB0aGF0IGlzIGluc3RhbGxlZCBhbmQgYSBwcm9wZXJ0eSBzZXQgd2hpY2ggaXMgdXNlZCB3aGVuCisgICAgIyBpbnN0YWxsaW5nLgorICAgICMKKyAgICBydWxlIGFkanVzdC1wcm9wZXJ0aWVzICggdGFyZ2V0IDogYnVpbGQtcHJvcGVydHktc2V0ICkKKyAgICB7CisgICAgICAgIGxvY2FsIHBzLXJhdyA7CisgICAgICAgIGxvY2FsIGEgPSBbICQodGFyZ2V0KS5hY3Rpb24gXSA7CisgICAgICAgIGlmICQoYSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgcHMgPSBbICQoYSkucHJvcGVydGllcyBdIDsKKyAgICAgICAgICAgIHBzLXJhdyA9IFsgJChwcykucmF3IF0gOworCisgICAgICAgICAgICAjIFVubGVzcyA8aGFyZGNvZGUtZGxsLXBhdGhzPnRydWUgaXMgaW4gcHJvcGVydGllcywgd2hpY2ggY2FuIGhhcHBlbgorICAgICAgICAgICAgIyBvbmx5IGlmIHRoZSB1c2VyIGhhcyBleHBsaWNpdGx5IHJlcXVlc3RlZCBpdCwgbnVrZSBhbGwgPGRsbC1wYXRoPgorICAgICAgICAgICAgIyBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgaWYgWyAkKGJ1aWxkLXByb3BlcnR5LXNldCkuZ2V0IDxoYXJkY29kZS1kbGwtcGF0aHM+IF0gIT0gdHJ1ZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBzLXJhdyA9IFsgcHJvcGVydHkuY2hhbmdlICQocHMtcmF3KSA6IDxkbGwtcGF0aD4gXSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgSWYgYW55IDxkbGwtcGF0aD4gcHJvcGVydGllcyB3ZXJlIHNwZWNpZmllZCBmb3IgaW5zdGFsbGluZywgYWRkCisgICAgICAgICAgICAjIHRoZW0uCisgICAgICAgICAgICBsb2NhbCBsID0gWyAkKGJ1aWxkLXByb3BlcnR5LXNldCkuZ2V0IDxkbGwtcGF0aD4gXSA7CisgICAgICAgICAgICBwcy1yYXcgKz0gJChsOkc9PGRsbC1wYXRoPikgOworCisgICAgICAgICAgICAjIEFsc28gY29weSA8bGlua2ZsYWdzPiBmZWF0dXJlIGZyb20gY3VycmVudCBidWlsZCBzZXQsIHRvIGJlIHVzZWQKKyAgICAgICAgICAgICMgZm9yIHJlbGlua2luZy4KKyAgICAgICAgICAgIGxvY2FsIGwgPSBbICQoYnVpbGQtcHJvcGVydHktc2V0KS5nZXQgPGxpbmtmbGFncz4gXSA7CisgICAgICAgICAgICBwcy1yYXcgKz0gJChsOkc9PGxpbmtmbGFncz4pIDsKKworICAgICAgICAgICAgIyBSZW1vdmUgdGhlIDx0YWc+IGZlYXR1cmUgb24gb3JpZ2luYWwgdGFyZ2V0cy4KKyAgICAgICAgICAgIHBzLXJhdyA9IFsgcHJvcGVydHkuY2hhbmdlICQocHMtcmF3KSA6IDx0YWc+IF0gOworCisgICAgICAgICAgICAjIEFuZCA8bG9jYXRpb24+LiBJZiBzdGFnZSB0YXJnZXQgaGFzIGFub3RoZXIgc3RhZ2UgdGFyZ2V0IGluCisgICAgICAgICAgICAjIHNvdXJjZXMsIHRoZW4gd2Ugc2hhbGwgZ2V0IHZpcnR1YWwgdGFyZ2V0cyB3aXRoIHRoZSA8bG9jYXRpb24+CisgICAgICAgICAgICAjIHByb3BlcnR5IHNldC4KKyAgICAgICAgICAgIHBzLXJhdyA9IFsgcHJvcGVydHkuY2hhbmdlICQocHMtcmF3KSA6IDxsb2NhdGlvbj4gXSA7CisgICAgICAgIH0KKworICAgICAgICBsb2NhbCBkID0gWyAkKGJ1aWxkLXByb3BlcnR5LXNldCkuZ2V0IDxkZXBlbmRlbmN5PiBdIDsKKyAgICAgICAgcHMtcmF3ICs9ICQoZDpHPTxkZXBlbmRlbmN5PikgOworCisgICAgICAgIGxvY2FsIGQgPSBbICQoYnVpbGQtcHJvcGVydHktc2V0KS5nZXQgPGxvY2F0aW9uPiBdIDsKKyAgICAgICAgcHMtcmF3ICs9ICQoZDpHPTxsb2NhdGlvbj4pIDsKKworICAgICAgICBsb2NhbCBucyA9IFsgJChidWlsZC1wcm9wZXJ0eS1zZXQpLmdldCA8aW5zdGFsbC1uby12ZXJzaW9uLXN5bWxpbmtzPiBdIDsKKyAgICAgICAgcHMtcmF3ICs9ICQobnM6Rz08aW5zdGFsbC1uby12ZXJzaW9uLXN5bWxpbmtzPikgOworCisgICAgICAgIGxvY2FsIGQgPSBbICQoYnVpbGQtcHJvcGVydHktc2V0KS5nZXQgPGluc3RhbGwtc291cmNlLXJvb3Q+IF0gOworICAgICAgICAjIE1ha2UgdGhlIHBhdGggYWJzb2x1dGU6IHdlIHNoYWxsIHVzZSBpdCB0byBjb21wdXRlIHJlbGF0aXZlIHBhdGhzIGFuZAorICAgICAgICAjIG1ha2luZyB0aGUgcGF0aCBhYnNvbHV0ZSB3aWxsIGhlbHAuCisgICAgICAgIGlmICQoZCkKKyAgICAgICAgeworICAgICAgICAgICAgZCA9IFsgcGF0aC5yb290ICQoZCkgWyBwYXRoLnB3ZCBdIF0gOworICAgICAgICAgICAgcHMtcmF3ICs9ICQoZDpHPTxpbnN0YWxsLXNvdXJjZS1yb290PikgOworICAgICAgICB9CisKKyAgICAgICAgaWYgJChwcy1yYXcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBbIHByb3BlcnR5LXNldC5jcmVhdGUgJChwcy1yYXcpIF0gIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBbIHByb3BlcnR5LXNldC5lbXB0eSBdIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJ1bGUgY29uc3RydWN0ICggbmFtZSA6IHNvdXJjZS10YXJnZXRzICogOiBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgc291cmNlLXRhcmdldHMgPSBbIHRhcmdldHMtdG8tc3RhZ2UgJChzb3VyY2UtdGFyZ2V0cykgOgorICAgICAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0gOworCisgICAgICAgIHByb3BlcnR5LXNldCA9IFsgdXBkYXRlLWxvY2F0aW9uICQocHJvcGVydHktc2V0KSBdIDsKKworICAgICAgICBsb2NhbCBlbmFtZSA9IFsgJChwcm9wZXJ0eS1zZXQpLmdldCA8bmFtZT4gXSA7CisKKyAgICAgICAgaWYgJChlbmFtZSkgJiYgJChzb3VyY2UtdGFyZ2V0c1syXSkKKyAgICAgICAgeworICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA6IGVycm9yIDogJChfX25hbWVfXykgOiBlcnJvcnMuZXJyb3IgOworICAgICAgICAgICAgZXJyb3JzLmVycm9yIFdoZW4gPG5hbWU+IHByb3BlcnR5IGlzIHVzZWQgImluIiAnaW5zdGFsbCcsIG9ubHkgb25lCisgICAgICAgICAgICAgICAgc291cmNlIGlzIGFsbG93ZWQuIDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIHJlc3VsdCA7CisgICAgICAgIGZvciBsb2NhbCBpIGluICQoc291cmNlLXRhcmdldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHN0YWdlZC10YXJnZXRzIDsKKworICAgICAgICAgICAgbG9jYWwgbmV3LXByb3BlcnRpZXMgPSBbIGFkanVzdC1wcm9wZXJ0aWVzICQoaSkgOgorICAgICAgICAgICAgICAgICQocHJvcGVydHktc2V0KSBdIDsKKworICAgICAgICAgICAgIyBTZWUgaWYgc29tZXRoaW5nIHNwZWNpYWwgc2hvdWxkIGJlIGRvbmUgd2hlbiBzdGFnaW5nIHRoaXMgdHlwZS4gSXQKKyAgICAgICAgICAgICMgaXMgaW5kaWNhdGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiBhIHNwZWNpYWwgIklOU1RBTExFRF8iIHR5cGUuCisgICAgICAgICAgICBsb2NhbCB0ID0gWyAkKGkpLnR5cGUgXSA7CisgICAgICAgICAgICBpZiAkKHQpICYmIFsgdHlwZS5yZWdpc3RlcmVkIElOU1RBTExFRF8kKHQpIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAkKGVuYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA6IGVycm9yIDogJChfX25hbWVfXykgOiBlcnJvcnMuZXJyb3IgOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuZXJyb3IgSW4gJ2luc3RhbGwnOiA8bmFtZT4gcHJvcGVydHkgc3BlY2lmaWVkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCB0aGF0IHJlcXVpcmVzIHJlbGlua2luZy4gOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NhbCB0YXJnZXRzID0gWyBnZW5lcmF0b3JzLmNvbnN0cnVjdCAkKHNlbGYucHJvamVjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICQobmFtZSkgOiBJTlNUQUxMRURfJCh0KSA6ICQobmV3LXByb3BlcnRpZXMpIDogJChpKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgc3RhZ2VkLXRhcmdldHMgKz0gJCh0YXJnZXRzWzItXSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGFnZWQtdGFyZ2V0cyA9IFsgc3RhZ2UuY29weS1maWxlICQoc2VsZi5wcm9qZWN0KSAkKGVuYW1lKSA6CisgICAgICAgICAgICAgICAgICAgICQoaSkgOiAkKG5ldy1wcm9wZXJ0aWVzKSBdIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgISAkKHN0YWdlZC10YXJnZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOiBlcnJvciA6ICQoX19uYW1lX18pIDogZXJyb3JzLmVycm9yIDsKKyAgICAgICAgICAgICAgICBlcnJvcnMuZXJyb3IgVW5hYmxlIHRvIGdlbmVyYXRlIHN0YWdlZCB2ZXJzaW9uIG9mCisgICAgICAgICAgICAgICAgICAgIFsgJChzb3VyY2UpLnN0ciBdIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIHQgaW4gJChzdGFnZWQtdGFyZ2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gWyB2aXJ0dWFsLXRhcmdldC5yZWdpc3RlciAkKHQpIF0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFsgcHJvcGVydHktc2V0LmVtcHR5IF0gJChyZXN1bHQpIDsKKyAgICB9CisKKyAgICAjIEdpdmVuIHRoZSBsaXN0IG9mIHNvdXJjZSB0YXJnZXRzIGV4cGxpY2l0bHkgcGFzc2VkIHRvICdzdGFnZScsIHJldHVybnMgdGhlCisgICAgIyBsaXN0IG9mIHRhcmdldHMgd2hpY2ggbXVzdCBiZSBzdGFnZWQuCisgICAgIworICAgIHJ1bGUgdGFyZ2V0cy10by1zdGFnZSAoIHNvdXJjZS10YXJnZXRzICogOiBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgbG9jYWwgcmVzdWx0IDsKKworICAgICAgICAjIFRyYXZlcnNlIHRoZSBkZXBlbmRlbmNpZXMsIGlmIG5lZWRlZC4KKyAgICAgICAgaWYgWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxpbnN0YWxsLWRlcGVuZGVuY2llcz4gXSA9ICJvbiIKKyAgICAgICAgeworICAgICAgICAgICAgc291cmNlLXRhcmdldHMgPSBbIGNvbGxlY3QtdGFyZ2V0cyAkKHNvdXJjZS10YXJnZXRzKSBdIDsKKyAgICAgICAgfQorCisgICAgICAgICMgRmlsdGVyIHRoZSB0YXJnZXQgdHlwZXMsIGlmIG5lZWRlZC4KKyAgICAgICAgbG9jYWwgaW5jbHVkZWQtdHlwZXMgPSBbICQocHJvcGVydHktc2V0KS5nZXQgPGluc3RhbGwtdHlwZT4gXSA7CisgICAgICAgIGZvciBsb2NhbCByIGluICQoc291cmNlLXRhcmdldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHR5ID0gWyAkKHIpLnR5cGUgXSA7CisgICAgICAgICAgICBpZiAkKHR5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgRG8gbm90IHN0YWdlIHNlYXJjaGVkIGxpYnMuCisgICAgICAgICAgICAgICAgaWYgJCh0eSkgIT0gU0VBUkNIRURfTElCCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAkKGluY2x1ZGVkLXR5cGVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBbIGluY2x1ZGUtdHlwZSAkKHR5KSA6ICQoaW5jbHVkZWQtdHlwZXMpIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJChyKSA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJChyKSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICEgJChpbmNsdWRlZC10eXBlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIERvIG5vdCBpbnN0YWxsIHR5cGVsZXNzIHRhcmdldHMgaWYgdGhlcmUgaXMgYW4gZXhwbGljaXQgbGlzdAorICAgICAgICAgICAgICAgICMgb2YgYWxsb3dlZCB0eXBlcy4KKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gJChyKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJChyZXN1bHQpIDsKKyAgICB9CisKKyAgICAjIENPTlNJREVSOiBmaWd1cmUgb3V0IHdoeSB3ZSBjYW4gbm90IHVzZSB2aXJ0dWFsLXRhcmdldC50cmF2ZXJzZSBoZXJlLgorICAgICMKKyAgICBydWxlIGNvbGxlY3QtdGFyZ2V0cyAoIHRhcmdldHMgKiApCisgICAgeworICAgICAgICAjIEZpbmQgc3VidmFyaWFudHMKKyAgICAgICAgbG9jYWwgcyA7CisgICAgICAgIGZvciBsb2NhbCB0IGluICQodGFyZ2V0cykKKyAgICAgICAgeworICAgICAgICAgICAgcyArPSBbICQodCkuY3JlYXRpbmctc3VidmFyaWFudCBdIDsKKyAgICAgICAgfQorICAgICAgICBzID0gWyBzZXF1ZW5jZS51bmlxdWUgJChzKSBdIDsKKworICAgICAgICBsb2NhbCByZXN1bHQgPSBbIG5ldyBzZXQgXSA7CisgICAgICAgICQocmVzdWx0KS5hZGQgJCh0YXJnZXRzKSA7CisKKyAgICAgICAgZm9yIGxvY2FsIGkgaW4gJChzKQorICAgICAgICB7CisgICAgICAgICAgICAkKGkpLmFsbC1yZWZlcmVuY2VkLXRhcmdldHMgJChyZXN1bHQpIDsKKyAgICAgICAgfQorICAgICAgICBsb2NhbCByZXN1bHQyIDsKKyAgICAgICAgZm9yIGxvY2FsIHIgaW4gWyAkKHJlc3VsdCkubGlzdCBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQocjpHKSAhPSA8dXNlPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdDIgKz0gJChyOkc9KSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgREVMRVRFX01PRFVMRSAkKHJlc3VsdCkgOworICAgICAgICByZXR1cm4gWyBzZXF1ZW5jZS51bmlxdWUgJChyZXN1bHQyKSBdIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdHJ1ZSBpZmYgJ3R5cGUnIGlzIHN1YnR5cGUgb2Ygc29tZSBlbGVtZW50IG9mICd0eXBlcy10by1pbmNsdWRlJy4KKyAgICAjCisgICAgbG9jYWwgcnVsZSBpbmNsdWRlLXR5cGUgKCB0eXBlIDogdHlwZXMtdG8taW5jbHVkZSAqICkKKyAgICB7CisgICAgICAgIGxvY2FsIGZvdW5kIDsKKyAgICAgICAgd2hpbGUgJCh0eXBlcy10by1pbmNsdWRlKSAmJiAhICQoZm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIFsgdHlwZS5pcy1zdWJ0eXBlICQodHlwZSkgJCh0eXBlcy10by1pbmNsdWRlWzFdKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGVzLXRvLWluY2x1ZGUgPSAkKHR5cGVzLXRvLWluY2x1ZGVbMi1dKSA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJChmb3VuZCkgOworICAgIH0KK30KKworCisjIENyZWF0ZXMgYSBjb3B5IG9mIHRhcmdldCAnc291cmNlJy4gVGhlICdwcm9wZXJ0aWVzJyBvYmplY3Qgc2hvdWxkIGhhdmUgYQorIyA8bG9jYXRpb24+IHByb3BlcnR5IHdoaWNoIHNwZWNpZmllcyB3aGVyZSB0aGUgdGFyZ2V0IG11c3QgYmUgcGxhY2VkLgorIworcnVsZSBjb3B5LWZpbGUgKCBwcm9qZWN0IG5hbWUgPyA6IHNvdXJjZSA6IHByb3BlcnRpZXMgKQoreworICAgIG5hbWUgPz0gWyAkKHNvdXJjZSkubmFtZSBdIDsKKyAgICBsb2NhbCByZWxhdGl2ZSA7CisKKyAgICBsb2NhbCBuZXctYSA9IFsgbmV3IG5vbi1zY2FubmluZy1hY3Rpb24gJChzb3VyY2UpIDogY29tbW9uLmNvcHkgOgorICAgICAgICAkKHByb3BlcnRpZXMpIF0gOworICAgIGxvY2FsIHNvdXJjZS1yb290ID0gWyAkKHByb3BlcnRpZXMpLmdldCA8aW5zdGFsbC1zb3VyY2Utcm9vdD4gXSA7CisgICAgaWYgJChzb3VyY2Utcm9vdCkKKyAgICB7CisgICAgICAgICMgR2V0IHRoZSByZWFsIHBhdGggb2YgdGhlIHRhcmdldC4gV2UgcHJvYmFibHkgbmVlZCB0byBzdHJpcCByZWxhdGl2ZQorICAgICAgICAjIHBhdGggZnJvbSB0aGUgdGFyZ2V0IG5hbWUgYXQgY29uc3RydWN0aW9uLgorICAgICAgICBsb2NhbCBwYXRoID0gWyAkKHNvdXJjZSkucGF0aCBdIDsKKyAgICAgICAgcGF0aCA9IFsgcGF0aC5yb290ICQobmFtZTpEKSAkKHBhdGgpIF0gOworICAgICAgICAjIE1ha2UgdGhlIHBhdGggYWJzb2x1dGUuIE90aGVyd2lzZSwgaXQgd291bGQgYmUgaGFyZCB0byBjb21wdXRlIHRoZQorICAgICAgICAjIHJlbGF0aXZlIHBhdGguIFRoZSAnc291cmNlLXJvb3QnIGlzIGFscmVhZHkgYWJzb2x1dGUsIHNlZSB0aGUKKyAgICAgICAgIyAnYWRqdXN0LXByb3BlcnRpZXMnIG1ldGhvZCBhYm92ZS4KKyAgICAgICAgcGF0aCA9IFsgcGF0aC5yb290ICQocGF0aCkgWyBwYXRoLnB3ZCBdIF0gOworCisgICAgICAgIHJlbGF0aXZlID0gWyBwYXRoLnJlbGF0aXZlLXRvICQoc291cmNlLXJvb3QpICQocGF0aCkgXSA7CisgICAgfQorCisgICAgIyBOb3RlOiBVc2luZyAkKG5hbWU6RD0kKHJlbGF0aXZlKSkgbWlnaHQgYmUgZmFzdGVyIGhlcmUsIGJ1dCB0aGVuIHdlIHdvdWxkCisgICAgIyBuZWVkIHRvIGV4cGxpY2l0bHkgY2hlY2sgdGhhdCByZWxhdGl2ZSBpcyBub3QgIi4iLCBvdGhlcndpc2Ugd2UgbWlnaHQgZ2V0CisgICAgIyBwYXRocyBsaWtlICc8cHJlZml4Pi9ib29zdC8uJywgdHJ5IHRvIGNyZWF0ZSBpdCBhbmQgbWtkaXIgd291bGQgb2J2aW91c2x5CisgICAgIyBmYWlsLgorICAgIG5hbWUgPSBbIHBhdGguam9pbiAkKHJlbGF0aXZlKSAkKG5hbWU6RD0pIF0gOworCisgICAgcmV0dXJuIFsgbmV3IGZpbGUtdGFyZ2V0ICQobmFtZSkgZXhhY3QgOiBbICQoc291cmNlKS50eXBlIF0gOiAkKHByb2plY3QpIDoKKyAgICAgICAgJChuZXctYSkgXSA7Cit9CisKKworcnVsZSBzeW1saW5rICggbmFtZSA6IHByb2plY3QgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICkKK3sKKyAgICBsb2NhbCBhID0gWyBuZXcgYWN0aW9uICQoc291cmNlKSA6IHN5bWxpbmsubG4gOiAkKHByb3BlcnRpZXMpIF0gOworICAgIGxvY2FsIHQgPSBbIG5ldyBmaWxlLXRhcmdldCAkKG5hbWUpIGV4YWN0IDogWyAkKHNvdXJjZSkudHlwZSBdIDogJChwcm9qZWN0KQorICAgICAgICA6ICQoYSkgXSA7CisgICAgcmV0dXJuIFsgdmlydHVhbC10YXJnZXQucmVnaXN0ZXIgJCh0KSBdIDsKK30KKworCitydWxlIHJlbGluay1maWxlICggcHJvamVjdCA6IHNvdXJjZSA6IHByb3BlcnR5LXNldCAgKQoreworICAgIGxvY2FsIGFjdGlvbiA9IFsgJChzb3VyY2UpLmFjdGlvbiBdIDsKKyAgICBsb2NhbCBjbG9uZWQtYWN0aW9uID0gWyB2aXJ0dWFsLXRhcmdldC5jbG9uZS1hY3Rpb24gJChhY3Rpb24pIDogJChwcm9qZWN0KSA6CisgICAgICAgICIiIDogJChwcm9wZXJ0eS1zZXQpIF0gOworICAgIHJldHVybiBbICQoY2xvbmVkLWFjdGlvbikudGFyZ2V0cyBdIDsKK30KKworCisjIERlY2xhcmUgaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhlIEVYRSB0eXBlLiBHZW5lcmF0b3IgZm9yIHRoaXMgdHlwZSB3aWxsIGNhdXNlCisjIHJlbGlua2luZyB0byB0aGUgbmV3IGxvY2F0aW9uLgordHlwZS5yZWdpc3RlciBJTlNUQUxMRURfRVhFIDogOiBFWEUgOworCisKK2NsYXNzIGluc3RhbGxlZC1leGUtZ2VuZXJhdG9yIDogZ2VuZXJhdG9yCit7CisgICAgaW1wb3J0IHR5cGUgOworICAgIGltcG9ydCBwcm9wZXJ0eS1zZXQgOworICAgIGltcG9ydCBtb2R1bGVzIDsKKyAgICBpbXBvcnQgc3RhZ2UgOworCisgICAgcnVsZSBfX2luaXRfXyAoICkKKyAgICB7CisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyBpbnN0YWxsLWV4ZSA6IEVYRSA6IElOU1RBTExFRF9FWEUgOworICAgIH0KKworICAgIHJ1bGUgcnVuICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2UgOiBtdWx0aXBsZSA/ICkKKyAgICB7CisgICAgICAgIGxvY2FsIHN0YWdlLXJ1bGUgPSBzdGFnZS5jb3B5LWZpbGUgOworCisgICAgICAgIGlmICEgWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxvcz4gXSBpbiBOVCBDWUdXSU4gJiYKKyAgICAgICAgICAgICEgWyAkKHByb3BlcnR5LXNldCkuZ2V0IDx0YXJnZXQtb3M+IF0gaW4gd2luZG93cyBjeWd3aW4KKyAgICAgICAgeworICAgICAgICAgICAgIyBJZiBkbGwtcGF0aCBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBjaGFuZ2VkIGZvciB0aGUgc3RhZ2UgdGFyZ2V0LAorICAgICAgICAgICAgIyByZWxpbmsgaW5zdGVhZCBvZiBjb3B5aW5nLgorICAgICAgICAgICAgbG9jYWwgYSA9IFsgJChzb3VyY2UpLmFjdGlvbiBdIDsKKyAgICAgICAgICAgIGxvY2FsIHAgPSBbICQoYSkucHJvcGVydGllcyBdIDsKKyAgICAgICAgICAgIGxvY2FsIG9yaWdpbmFsID0gWyAkKHApLmdldCA8ZGxsLXBhdGg+IF0gOworICAgICAgICAgICAgbG9jYWwgY3VycmVudCA9IFsgJChwcm9wZXJ0eS1zZXQpLmdldCA8ZGxsLXBhdGg+IF0gOworCisgICAgICAgICAgICBpZiAkKGN1cnJlbnQpICE9ICQob3JpZ2luYWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhZ2UtcnVsZSA9IHN0YWdlLnJlbGluay1maWxlIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBbICQoc3RhZ2UtcnVsZSkgJChwcm9qZWN0KSA6ICQoc291cmNlKSA6ICQocHJvcGVydHktc2V0KSBdIDsKKyAgICB9Cit9CisKKworZ2VuZXJhdG9ycy5yZWdpc3RlciBbIG5ldyBpbnN0YWxsZWQtZXhlLWdlbmVyYXRvciBdIDsKKworCisjIEluc3RhbGxpbmcgYSBzaGFyZWQgbGluayBvbiBVbml4IG1pZ2h0IGNhdXNlIGEgY3JlYXRpb24gb2YgdmVyc2lvbmVkIHN5bWJvbGljCisjIGxpbmtzLgordHlwZS5yZWdpc3RlciBJTlNUQUxMRURfU0hBUkVEX0xJQiA6IDogU0hBUkVEX0xJQiA7CisKKworY2xhc3MgaW5zdGFsbGVkLXNoYXJlZC1saWItZ2VuZXJhdG9yIDogZ2VuZXJhdG9yCit7CisgICAgaW1wb3J0IHR5cGUgOworICAgIGltcG9ydCBwcm9wZXJ0eS1zZXQgOworICAgIGltcG9ydCBtb2R1bGVzIDsKKyAgICBpbXBvcnQgc3RhZ2UgOworCisgICAgcnVsZSBfX2luaXRfXyAoICkKKyAgICB7CisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyBpbnN0YWxsLXNoYXJlZC1saWIgOiBTSEFSRURfTElCIDoKKyAgICAgICAgICAgIElOU1RBTExFRF9TSEFSRURfTElCIDsKKyAgICB9CisKKyAgICBydWxlIHJ1biAoIHByb2plY3QgbmFtZSA/IDogcHJvcGVydHktc2V0IDogc291cmNlIDogbXVsdGlwbGUgPyApCisgICAgeworICAgICAgICBpZiBbICQocHJvcGVydHktc2V0KS5nZXQgPG9zPiBdIGluIE5UIENZR1dJTiB8fAorICAgICAgICAgICAgWyAkKHByb3BlcnR5LXNldCkuZ2V0IDx0YXJnZXQtb3M+IF0gaW4gd2luZG93cyBjeWd3aW4KKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgY29waWVkID0gWyBzdGFnZS5jb3B5LWZpbGUgJChwcm9qZWN0KSA6ICQoc291cmNlKSA6CisgICAgICAgICAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICAgICAgcmV0dXJuIFsgdmlydHVhbC10YXJnZXQucmVnaXN0ZXIgJChjb3BpZWQpIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgYSA9IFsgJChzb3VyY2UpLmFjdGlvbiBdIDsKKyAgICAgICAgICAgIGxvY2FsIGNvcGllZCA7CisgICAgICAgICAgICBpZiAhICQoYSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIE5vbi1kZXJpdmVkIGZpbGUsIGp1c3QgY29weS4KKyAgICAgICAgICAgICAgICBjb3BpZWQgPSBbIHN0YWdlLmNvcHktZmlsZSAkKHByb2plY3QpIDogJChzb3VyY2UpIDoKKyAgICAgICAgICAgICAgICAgICAgJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsIGNwID0gWyAkKGEpLnByb3BlcnRpZXMgXSA7CisgICAgICAgICAgICAgICAgbG9jYWwgY3VycmVudC1kbGwtcGF0aCA9IFsgJChjcCkuZ2V0IDxkbGwtcGF0aD4gXSA7CisgICAgICAgICAgICAgICAgbG9jYWwgbmV3LWRsbC1wYXRoID0gWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxkbGwtcGF0aD4gXSA7CisKKyAgICAgICAgICAgICAgICBpZiAkKGN1cnJlbnQtZGxsLXBhdGgpICE9ICQobmV3LWRsbC1wYXRoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIyBScGF0aCBjaGFuZ2VkLCBuZWVkIHRvIHJlbGluay4KKyAgICAgICAgICAgICAgICAgICAgY29waWVkID0gWyBzdGFnZS5yZWxpbmstZmlsZSAkKHByb2plY3QpIDogJChzb3VyY2UpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICQocHJvcGVydHktc2V0KSBdIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29waWVkID0gWyBzdGFnZS5jb3B5LWZpbGUgJChwcm9qZWN0KSA6ICQoc291cmNlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAkKHByb3BlcnR5LXNldCkgXSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb3BpZWQgPSBbIHZpcnR1YWwtdGFyZ2V0LnJlZ2lzdGVyICQoY29waWVkKSBdIDsKKworICAgICAgICAgICAgbG9jYWwgcmVzdWx0ID0gJChjb3BpZWQpIDsKKyAgICAgICAgICAgICMgSWYgdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm0gTk5OLlhYWC5ZWVkuWlpaLCB3aGVyZSBhbGwgJ1gnLCAnWScgYW5kCisgICAgICAgICAgICAjICdaJyBhcmUgbnVtYmVycywgd2UgbmVlZCB0byBjcmVhdGUgTk5OLlhYWCBhbmQgTk5OLlhYWC5ZWVkKKyAgICAgICAgICAgICMgc3ltYm9saWMgbGlua3MuCisgICAgICAgICAgICBsb2NhbCBtID0gWyBNQVRDSAorICAgICAgICAgICAgICAgICguKilcXC4oWzAxMjM0NTY3ODldKylcXC4oWzAxMjM0NTY3ODldKylcXC4oWzAxMjM0NTY3ODldKykkIDoKKyAgICAgICAgICAgICAgICBbICQoY29waWVkKS5uYW1lIF0gXSA7CisgICAgICAgICAgICBpZiAkKG0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBTeW1saW5rIHdpdGhvdXQgdmVyc2lvbiBhdCBhbGwgaXMgdXNlZCB0byBtYWtlCisgICAgICAgICAgICAgICAgIyAtbHNvbWVfbGlicmFyeSB3b3JrLgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbIHN0YWdlLnN5bWxpbmsgJChtWzFdKSA6ICQocHJvamVjdCkgOiAkKGNvcGllZCkgOgorICAgICAgICAgICAgICAgICAgICAkKHByb3BlcnR5LXNldCkgXSA7CisKKyAgICAgICAgICAgICAgICAjIFN5bWxpbmtzIG9mIHNvbWUgbGliZm9vLk4gYW5kIGxpYmZvby5OLk0gYXJlIHVzZWQgc28gdGhhdAorICAgICAgICAgICAgICAgICMgbGlicmFyeSBjYW4gZm91bmQgYXQgcnVudGltZSwgaWYgbGliZm9vLk4uTS5YIGhhcyBzb25hbWUgb2YKKyAgICAgICAgICAgICAgICAjIGxpYmZvby5OLiBUaGF0IGhhcHBlbnMgd2hlbiB0aGUgbGlicmFyeSBtYWtlcyBzb21lIGJpbmFyeQorICAgICAgICAgICAgICAgICMgY29tcGF0aWJpbGl0eSBndWFyYW50ZWVzLiBJZiBub3QsIGl0IGlzIHBvc3NpYmxlIHRvIHNraXAgdGhvc2UKKyAgICAgICAgICAgICAgICAjIHN5bWxpbmtzLgorICAgICAgICAgICAgICAgIGxvY2FsIHN1cHByZXNzID0gWyAkKHByb3BlcnR5LXNldCkuZ2V0CisgICAgICAgICAgICAgICAgICAgIDxpbnN0YWxsLW5vLXZlcnNpb24tc3ltbGlua3M+IF0gOworCisgICAgICAgICAgICAgICAgaWYgJChzdXBwcmVzcykgIT0gIm9uIgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFsgc3RhZ2Uuc3ltbGluayAkKG1bMV0pLiQobVsyXSkgOiAkKHByb2plY3QpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICQoY29waWVkKSA6ICQocHJvcGVydHktc2V0KSBdIDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFsgc3RhZ2Uuc3ltbGluayAkKG1bMV0pLiQobVsyXSkuJChtWzNdKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAkKHByb2plY3QpIDogJChjb3BpZWQpIDogJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICQocmVzdWx0KSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2dlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgaW5zdGFsbGVkLXNoYXJlZC1saWItZ2VuZXJhdG9yIF0gOworCisKKyMgTWFpbiB0YXJnZXQgcnVsZSBmb3IgJ2luc3RhbGwnLgorIworcnVsZSBpbnN0YWxsICggbmFtZSA6IHNvdXJjZXMgKiA6IHJlcXVpcmVtZW50cyAqIDogZGVmYXVsdC1idWlsZCAqICkKK3sKKyAgICBsb2NhbCBwcm9qZWN0ID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7CisKKyAgICAjIFVubGVzcyB0aGUgdXNlciBoYXMgZXhwbGljaXRseSBhc2tlZCB1cyB0byBoYXJkY29kZSBkbGwgcGF0aHMsIGFkZAorICAgICMgPGhhcmRjb2RlLWRsbC1wYXRocz5mYWxzZSBpbiByZXF1aXJlbWVudHMsIHRvIG92ZXJyaWRlIGRlZmF1bHQgdmFsdWUuCisgICAgaWYgISA8aGFyZGNvZGUtZGxsLXBhdGhzPnRydWUgaW4gJChyZXF1aXJlbWVudHMpCisgICAgeworICAgICAgICByZXF1aXJlbWVudHMgKz0gPGhhcmRjb2RlLWRsbC1wYXRocz5mYWxzZSA7CisgICAgfQorCisgICAgaWYgPHRhZz4gaW4gJChyZXF1aXJlbWVudHM6RykKKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMudXNlci1lcnJvciBUaGUgPHRhZz4gcHJvcGVydHkgaXMgbm90IGFsbG93ZWQgZm9yIHRoZSAnaW5zdGFsbCcKKyAgICAgICAgICAgIHJ1bGUuIDsKKyAgICB9CisKKyAgICB0YXJnZXRzLmNyZWF0ZS1tZXRhdGFyZ2V0IGluc3RhbGwtdGFyZ2V0LWNsYXNzIDogJChwcm9qZWN0KSA6ICQobmFtZSkgOgorICAgICAgICAkKHNvdXJjZXMpIDogJChyZXF1aXJlbWVudHMpIDogJChkZWZhdWx0LWJ1aWxkKSA7Cit9CisKKworSU1QT1JUICQoX19uYW1lX18pIDogaW5zdGFsbCA6IDogaW5zdGFsbCA7CitJTVBPUlQgJChfX25hbWVfXykgOiBpbnN0YWxsIDogOiBzdGFnZSA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3N0bHBvcnQuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9zdGxwb3J0LmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDA5NDdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9zdGxwb3J0LmphbQpAQCAtMCwwICsxLDMwOSBAQAorIyBDb3B5cmlnaHQgR2VubmFkaXkgUm96ZW50YWwKKyMgQ29weXJpZ2h0IDIwMDYgUmVuZSBSaXZlcmEKKyMgQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDYgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBUaGUgU1RMUG9ydCBpcyB1c2FibGUgYnkgbWVhbnMgb2YgJ3N0ZGxpYicgZmVhdHVyZS4gV2hlbgorIyBzdGRsaWI9c3RscG9ydCBpcyBzcGVjaWZpZWQsIGRlZmF1bHQgdmVyc2lvbiBvZiBTVExQb3J0IHdpbGwgYmUgdXNlZCwKKyMgd2hpbGUgc3RkbGliPXN0bHBvcnQtNC41IHdpbGwgdXNlIHNwZWNpZmljIHZlcnNpb24uCisjIFRoZSBzdWJmZWF0dXJlIHZhbHVlICdob3N0aW9zJyBtZWFucyB0byB1c2UgaG9zdCBjb21waWxlcidzIGlvc3RyZWFtcy4KKyMKKyMgVGhlIHNwZWNpZmljIHZlcnNpb24gb2Ygc3RscG9ydCBpcyBzZWxlY3RlZCBieSBmZWF0dXJlczoKKyMgVGhlIDxydW50aW1lLWxpbms+IGZlYXR1cmUgc2VsZWN0cyBiZXR3ZWVuIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcnkKKyMgVGhlIDxydW50aW1lLWRlYnVnZ2luZz5vbiBzZWxlY3RzIFNUTFBvcnQgd2l0aCBkZWJ1ZyBzeW1ib2xzCisjIGFuZCBzdGwgZGVidWdnaW5nLgorIyBUaGVyZSdzIG5vIHdheSB0byB1c2UgU1RMUG9ydCB3aXRoIGRlYnVnIHN5bWJvbHMgYnV0IHdpdGhvdXQKKyMgc3RsIGRlYnVnZ2luZy4KKworIyBUT0RPOiBtdXN0IGltcGxlbWVudCBzZWxlY3Rpb24gb2YgZGlmZmVyZW50IFNUTFBvcnQgaW5zdGFsbGF0aW9ucyBiYXNlZAorIyBvbiB1c2VkIHRvb2xzZXQuCisjIEFsc28sIGZpbmlzaCB2YXJpb3VzIGZsYWdzOgorIworIyBUaGlzIGlzIGNvcGllZCBmcm9tIFYxIHRvb2xzZXQsICIrIiBtZWFucyAiaW1wbGVtZW50ZWQiCisjK2ZsYWdzICQoQ1VSUl9UT09MU0VUKSBERUZJTkVTIDxzdGxwb3J0LWlvc3RyZWFtPm9mZiA6IF9TVExQX05PX09XTl9JT1NUUkVBTVM9MSBfU1RMUF9IQVNfTk9fTkVXX0lPU1RSRUFNUz0xIDsKKyMrZmxhZ3MgJChDVVJSX1RPT0xTRVQpIERFRklORVMgPHN0bHBvcnQtZXh0ZW5zaW9ucz5vZmYgOiBfU1RMUF9OT19FWFRFTlNJT05TPTEgOworIyBmbGFncyAkKENVUlJfVE9PTFNFVCkgREVGSU5FUyA8c3RscG9ydC1hbmFjaHJvbmlzbXM+b2ZmIDogX1NUTFBfTk9fQU5BQ0hST05JU01TPTEgOworIyBmbGFncyAkKENVUlJfVE9PTFNFVCkgREVGSU5FUyA8c3RscG9ydC1jc3RkLW5hbWVzcGFjZT5nbG9iYWwgOiBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQ9MSA7CisjIGZsYWdzICQoQ1VSUl9UT09MU0VUKSBERUZJTkVTIDxleGNlcHRpb24taGFuZGxpbmc+b2ZmIDogX1NUTFBfTk9fRVhDRVBUSU9OUz0xIDsKKyMgZmxhZ3MgJChDVVJSX1RPT0xTRVQpIERFRklORVMgPHN0bHBvcnQtZGVidWctYWxsb2M+b24gOiBfU1RMUF9ERUJVR19BTExPQz0xIDsKKyMrZmxhZ3MgJChDVVJSX1RPT0xTRVQpIERFRklORVMgPHJ1bnRpbWUtYnVpbGQ+ZGVidWcgOiBfU1RMUF9ERUJVRz0xIF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQ9MSA7CisjK2ZsYWdzICQoQ1VSUl9UT09MU0VUKSBERUZJTkVTIDxydW50aW1lLWxpbms+ZHluYW1pYyA6IF9TVExQX1VTRV9EWU5BTUlDX0xJQj0xIDsKKworCitpbXBvcnQgZmVhdHVyZSA6IGZlYXR1cmUgc3ViZmVhdHVyZSA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgdGFyZ2V0cyA7CitpbXBvcnQgcHJvcGVydHktc2V0IDsKK2ltcG9ydCBjb21tb24gOworaW1wb3J0IHR5cGUgOworCisjIE1ha2UgdGhpcyBtb2R1bGUgaW50byBhIHByb2plY3QuCitwcm9qZWN0LmluaXRpYWxpemUgJChfX25hbWVfXykgOworcHJvamVjdCBzdGxwb3J0IDsKKworIyBUaGUgcHJvYmxlbTogaG93IHRvIHJlcXVlc3QgdG8gdXNlIGhvc3QgY29tcGlsZXIncyBpb3N0cmVhbXM/CisjCisjIFNvbHV0aW9uIDE6IEdsb2JhbCAnc3RscG9ydC1pb3N0cmVhbScgZmVhdHVyZS4KKyMgICAgVGhhdCdzIHVnbHkuIFN1YmZlYXR1cmUgbWFrZSBtb3JlIHNlbnNlIGZvciBzdGxwb3J0LXNwZWNpZmljIHRoaW5nLgorIyBTb2x1dGlvbiAyOiBVc2Ugc3ViZmVhdHVyZSB3aXRoIHR3byB2YWx1ZXMsIG9uZSBvZiB3aGljaCAoInVzZSBTVExQb3J0IGlvc3RyZWFtIikKKyMgICAgIGlzIGRlZmF1bHQuCisjICAgIFRoZSBwcm9ibGVtIGlzIHRoYXQgc3VjaCBzdWJmZWF0dXJlIHdpbGwgYXBwZWFyIGluIHRhcmdldCBwYXRocywgYW5kIHRoYXQncyB1Z2x5CisjIFNvbHV0aW9uIDM6IFVzZSBvcHRpb25hbCBzdWJmZWF0dXJlIHdpdGggb25seSBvbmUgdmFsdWUuCisKK2ZlYXR1cmUuZXh0ZW5kIHN0ZGxpYiA6IHN0bHBvcnQgOworZmVhdHVyZS5jb21wb3NlIDxzdGRsaWI+c3RscG9ydCA6IDxsaWJyYXJ5Pi9zdGxwb3J0Ly9zdGxwb3J0IDsKKworIyBTVExwb3J0IGlvc3RyZWFtcyBvciBuYXRpdmUgaW9zdHJlYW1zCitzdWJmZWF0dXJlIHN0ZGxpYiBzdGxwb3J0IDogaW9zdHJlYW0gOiBob3N0aW9zIDogb3B0aW9uYWwgcHJvcGFnYXRlZCAgOworCisjIFNUTHBvcnQgZXh0ZW5zaW9ucworc3ViZmVhdHVyZSBzdGRsaWIgc3RscG9ydCA6IGV4dGVuc2lvbnMgOiBub2V4dCA6IG9wdGlvbmFsIHByb3BhZ2F0ZWQgOworCisjIFNUTHBvcnQgYW5hY2hyb25pc21zIC0tIE5PVCBZRVQgU1VQUE9SVEVECisjIHN1YmZlYXR1cmUgc3RkbGliIHN0bHBvcnQgOiBhbmFjaHJvbmlzbXMgOiBvbiBvZmYgOworCisjIFNUTHBvcnQgZGVidWcgYWxsb2NhdGlvbiAtLSBOT1QgWUVUIFNVUFBPUlRFRAorI3N1YmZlYXR1cmUgc3RkbGliIHN0bHBvcnQgOiBkZWJ1Zy1hbGxvYyA6IG9mZiBvbiA7CisKKyMgRGVjbGFyZSBhIHNwZWNpYWwgdGFyZ2V0IGNsYXNzIHRvIGhhbmRsZSB0aGUgY3JlYXRpb24gb2Ygc2VhcmNoLWxpYi10YXJnZXQKKyMgaW5zdGFuY2VzIGZvciBTVExwb3J0LiBXZSBuZWVkIGEgc3BlY2lhbCBjbGFzcywgYmVjYXVzZSBvdGhlcndpc2Ugd2UnbGwgaGF2ZQorIyAtIGRlY2xhcmUgcHJlYnVpbHQgdGFyZ2V0cyBmb3IgYWxsIHBvc3NpYmxlIHRvb2xzZXRzLiBBbmQgYnkgdGhlIHRpbWUgJ2luaXQnCisjICAgaXMgY2FsbGVkIHdlIGRvbid0IGV2ZW4ga25vdyB0aGUgbGlzdCBvZiB0b29sc2V0cyB0aGF0IGFyZSByZWdpc3RlcmVkCisjIC0gd2hlbiBob3N0IGlvc3RyZWFtcyBhcmUgdXNlZCwgd2UgcmVhbGx5IHNob3VsZCBwcm9kdWNlIG5vdGhpbmcuIEl0IHdvdWxkCisjICAgYmUgaGFyZC9pbXBvc3NpYmxlIHRvIGFjaGlldmUgdGhpcyB1c2luZyBwcmVidWlsdCB0YXJnZXRzLgorCitjbGFzcyBzdGxwb3J0LXRhcmdldC1jbGFzcyA6IGJhc2ljLXRhcmdldAoreworICAgIGltcG9ydCBmZWF0dXJlIHByb2plY3QgdHlwZSBlcnJvcnMgZ2VuZXJhdG9ycyA7CisgICAgaW1wb3J0IHNldCA6IGRpZmZlcmVuY2UgOworCisgICAgcnVsZSBfX2luaXRfXyAoIHByb2plY3QgOiBoZWFkZXJzID8gOiBsaWJyYXJpZXMgKiA6ICB2ZXJzaW9uID8gKQorICAgIHsKKyAgICAgICAgYmFzaWMtdGFyZ2V0Ll9faW5pdF9fIHN0bHBvcnQgOiAkKHByb2plY3QpIDsKKyAgICAgICAgc2VsZi5oZWFkZXJzID0gJChoZWFkZXJzKSA7CisgICAgICAgIHNlbGYubGlicmFyaWVzID0gJChsaWJyYXJpZXMpIDsKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gJCh2ZXJzaW9uKSA7CisgICAgICAgIHNlbGYudmVyc2lvbi41ID0gWyBNQVRDSCAiXig1Wy5dWzAxMjM0NTY3ODldKykuKiIgOiAkKHZlcnNpb24pIF0gOworCisgICAgICAgIGxvY2FsIHJlcXVpcmVtZW50cyA7CisgICAgICAgIHJlcXVpcmVtZW50cyArPSA8c3RkbGliLXN0bHBvcnQ6dmVyc2lvbj4kKHNlbGYudmVyc2lvbikgOworICAgICAgICBzZWxmLnJlcXVpcmVtZW50cyA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZSAkKHJlcXVpcmVtZW50cykgXSA7CisgICAgfQorCisgICAgcnVsZSBnZW5lcmF0ZSAoIHByb3BlcnR5LXNldCApCisgICAgeworICAgICAgICAjIFNpbmNlIHRoaXMgdGFyZ2V0IGlzIGJ1aWx0IHdpdGggPHN0ZGxpYj5zdGxwb3J0LCBpdCB3aWxsIGFsc28KKyAgICAgICAgIyBoYXZlIDxsaWJyYXJ5Pi9zdGxwb3J0Ly9zdGxwb3J0IGluIHJlcXVpcmVtZW50cywgd2hpY2ggd2lsbAorICAgICAgICAjIGNhdXNlIGEgbG9vcCBpbiBtYWluIHRhcmdldCByZWZlcmVuY2VzLiBSZW1vdmUgdGhhdCBwcm9wZXJ0eQorICAgICAgICAjIG1hbnVhbGx5LgorCisgICAgICAgIHByb3BlcnR5LXNldCA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZQorICAgICAgICAgICAgWyBkaWZmZXJlbmNlCisgICAgICAgICAgICAgICAgWyAkKHByb3BlcnR5LXNldCkucmF3IF0gOgorICAgICAgICAgICAgICAgIDxsaWJyYXJ5Pi9zdGxwb3J0Ly9zdGxwb3J0CisgICAgICAgICAgICAgICAgPHN0ZGxpYj5zdGxwb3J0CisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgXSA7CisgICAgICAgIHJldHVybiBbIGJhc2ljLXRhcmdldC5nZW5lcmF0ZSAkKHByb3BlcnR5LXNldCkgXSA7CisgICAgfQorCisgICAgcnVsZSBjb25zdHJ1Y3QgKCBuYW1lIDogc291cmNlLXRhcmdldHMgKiA6IHByb3BlcnR5LXNldCApCisgICAgeworICAgICAgICAjIERlZHVjZSB0aGUgbmFtZSBvZiBzdGxwb3J0IGxpYnJhcnksIGJhc2VkIG9uIHRvb2xzZXQgYW5kCisgICAgICAgICMgZGVidWcgc2V0dGluZy4KKyAgICAgICAgbG9jYWwgcmF3ID0gWyAkKHByb3BlcnR5LXNldCkucmF3IF0gOworICAgICAgICBsb2NhbCBob3N0aW9zID0gWyBmZWF0dXJlLmdldC12YWx1ZXMgPHN0ZGxpYi1zdGxwb3J0Omlvc3RyZWFtPiA6ICQocmF3KSBdIDsKKyAgICAgICAgbG9jYWwgdG9vbHNldCA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDx0b29sc2V0PiA6ICQocmF3KSBdIDsKKworICAgICAgICBpZiAkKHNlbGYudmVyc2lvbi41KQorICAgICAgICB7CisgICAgICAgICAgICAjIFZlcnNpb24gNS54CisKKyAgICAgICAgICAgICMgU1RMcG9ydCBob3N0IElPIHN0cmVhbXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gU28gd2UgYWx3YXlzCisgICAgICAgICAgICAjIG5lZWQgbGlicmFyaWVzLgorCisgICAgICAgICAgICAjIG5hbWU6IHN0bHBvcnQoc3RsKT9bZGddPyhfc3RhdGljKT8uTS5SCisgICAgICAgICAgICBsb2NhbCBuYW1lID0gc3RscG9ydCA7CisgICAgICAgICAgICBpZiBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8cnVudGltZS1kZWJ1Z2dpbmc+IDogJChyYXcpIF0gPSAib24iCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmFtZSArPSBzdGwgOworICAgICAgICAgICAgICAgIHN3aXRjaCAkKHRvb2xzZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIGdjYyogOiBuYW1lICs9IGcgOworICAgICAgICAgICAgICAgICAgICBjYXNlIGRhcndpbiogOiBuYW1lICs9IGcgOworICAgICAgICAgICAgICAgICAgICBjYXNlICogOiBuYW1lICs9IGQgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgWyBmZWF0dXJlLmdldC12YWx1ZXMgPHJ1bnRpbWUtbGluaz4gOiAkKHJhdykgXSA9ICJzdGF0aWMiCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmFtZSArPSBfc3RhdGljIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBTdGFydGluZyB3aXRoIHZlcnNpb24gNS4yLjAsIHRoZSBTVExwb3J0IHN0YXRpYyBsaWJyYXJpZXMgbm8KKyAgICAgICAgICAgICMgbG9uZ2VyIGluY2x1ZGUgYSB2ZXJzaW9uIG51bWJlciBpbiB0aGVpciBuYW1lCisgICAgICAgICAgICBsb2NhbCB2ZXJzaW9uLnByZS41LjIgPSBbIE1BVENIICJeKDVbLl1bMDFdKykuKiIgOiAkKHZlcnNpb24pIF0gOworICAgICAgICAgICAgaWYgJCh2ZXJzaW9uLnByZS41LjIpIHx8IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxydW50aW1lLWxpbms+IDoKKyAgICAgICAgICAgICAgICAkKHJhdykgXSAhPSAic3RhdGljIgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5hbWUgKz0gLiQoc2VsZi52ZXJzaW9uLjUpIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmFtZSA9ICQobmFtZTpKPSkgOworCisgICAgICAgICAgICBpZiBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8aW5zdGFsbC1kZXBlbmRlbmNpZXM+IDogJChyYXcpIF0gPSAib24iCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI34gQWxsb3cgZXhwbGljaXRseSBhc2tpbmcgdG8gaW5zdGFsbCB0aGUgU1RMcG9ydCBsaWIgYnkKKyAgICAgICAgICAgICAgICAjfiByZWZlcnJpbmcgdG8gaXQgZGlyZWN0bHk6CisgICAgICAgICAgICAgICAgI34gICAvc3RscG9ydC8vc3RscG9ydC88aW5zdGFsbC1kZXBlbmRlbmNpZXM+b24KKyAgICAgICAgICAgICAgICAjfiBUaGlzIGFsbG93cyBmb3IgaW5zdGFsbCBwYWNrYWdpbmcgb2YgYWxsIGxpYnMgb25lIG1pZ2h0IG5lZWQKKyAgICAgICAgICAgICAgICAjfiBmb3IgYSBzdGFuZGFsb25lIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAgICAgICAgICBpbXBvcnQgcGF0aCA6IG1ha2UgOiBwYXRoLW1ha2UgOworICAgICAgICAgICAgICAgIGxvY2FsIHJ1bnRpbWUtbGluaworICAgICAgICAgICAgICAgICAgICA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxydW50aW1lLWxpbms+IDogJChyYXcpIF0gOworICAgICAgICAgICAgICAgIGxvY2FsIGxpYi1maWxlLnByb3BzCisgICAgICAgICAgICAgICAgICAgID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQocmF3KSA8bGluaz4kKHJ1bnRpbWUtbGluaykgXSA7CisgICAgICAgICAgICAgICAgbG9jYWwgbGliLWZpbGUucHJlZml4CisgICAgICAgICAgICAgICAgICAgID0gWyB0eXBlLmdlbmVyYXRlZC10YXJnZXQtcHJlZml4ICQocnVudGltZS1saW5rOlUpX0xJQiA6CisgICAgICAgICAgICAgICAgICAgICAgICAkKGxpYi1maWxlLnByb3BzKSBdIDsKKyAgICAgICAgICAgICAgICBsb2NhbCBsaWItZmlsZS5zdWZmaXgKKyAgICAgICAgICAgICAgICAgICAgPSBbIHR5cGUuZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXggJChydW50aW1lLWxpbms6VSlfTElCIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICQobGliLWZpbGUucHJvcHMpIF0gOworICAgICAgICAgICAgICAgIGxpYi1maWxlLnByZWZpeAorICAgICAgICAgICAgICAgICAgICA/PSAiIiAibGliIiA7CisgICAgICAgICAgICAgICAgbGliLWZpbGUuc3VmZml4CisgICAgICAgICAgICAgICAgICAgID89ICIiIDsKKyAgICAgICAgICAgICAgICBsb2NhbCBsaWItZmlsZQorICAgICAgICAgICAgICAgICAgICA9IFsgR0xPQiAkKHNlbGYubGlicmFyaWVzKSBbIG1vZHVsZXMucGVlayA6IFBBVEggXSA6CisgICAgICAgICAgICAgICAgICAgICAgICAkKGxpYi1maWxlLnByZWZpeCkkKG5hbWUpLiQobGliLWZpbGUuc3VmZml4KSBdIDsKKyAgICAgICAgICAgICAgICBsaWItZmlsZQorICAgICAgICAgICAgICAgICAgICA9IFsgbmV3IGZpbGUtcmVmZXJlbmNlIFsgcGF0aC1tYWtlICQobGliLWZpbGVbMV0pIF0gOgorICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLnByb2plY3QpIF0gOworICAgICAgICAgICAgICAgIGxpYi1maWxlCisgICAgICAgICAgICAgICAgICAgID0gWyAkKGxpYi1maWxlKS5nZW5lcmF0ZSAiIiBdIDsKKyAgICAgICAgICAgICAgICBsb2NhbCBsaWItZmlsZS5yZXF1aXJlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgPSBbIHRhcmdldHMubWFpbi10YXJnZXQtcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICBbICQobGliLWZpbGUucHJvcHMpLnJhdyBdIDxmaWxlPiQobGliLWZpbGVbLTFdKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAkKHNlbGYucHJvamVjdCkgXSA7CisgICAgICAgICAgICAgICAgcmV0dXJuIFsgZ2VuZXJhdG9ycy5jb25zdHJ1Y3QgJChzZWxmLnByb2plY3QpICQobmFtZSkgOiBMSUIgOgorICAgICAgICAgICAgICAgICAgICAkKGxpYi1maWxlLnJlcXVpcmVtZW50cykgXSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI34gT3RoZXJ3aXNlLCBpdCBpcyBqdXN0IHJlZ3VsYXIgbGlicmFyeSB1c2FnZS4KKyAgICAgICAgICAgICAgICByZXR1cm4gWyBnZW5lcmF0b3JzLmNvbnN0cnVjdAorICAgICAgICAgICAgICAgICAgICAkKHNlbGYucHJvamVjdCkgJChuYW1lKSA6IFNFQVJDSEVEX0xJQiA6ICQocHJvcGVydHktc2V0KSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICEgJChob3N0aW9zKSAmJiAkKHRvb2xzZXQpICE9IG1zdmMKKyAgICAgICAgeworICAgICAgICAgICAgIyBXZSBkb24ndCBuZWVkIGxpYnJhcmllcyBpZiBob3N0IGlzdHJlYW1zIGFyZSB1c2VkLiBGb3IKKyAgICAgICAgICAgICMgbXN2YywgYXV0b21hdGljIGxpYnJhcnkgc2VsZWN0aW9uIHdpbGwgYmUgdXNlZC4KKworICAgICAgICAgICAgIyBuYW1lOiBzdGxwb3J0Xzx0b29sc2V0Pihfc3RsZGVidWcpPworICAgICAgICAgICAgbG9jYWwgbmFtZSA9IHN0bHBvcnQgOworICAgICAgICAgICAgbmFtZSA9ICQobmFtZSlfJCh0b29sc2V0KSA7CisgICAgICAgICAgICBpZiBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8cnVudGltZS1kZWJ1Z2dpbmc+IDogJChyYXcpIF0gPSAib24iCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmFtZSA9ICQobmFtZSlfc3RsZGVidWcgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWyBnZW5lcmF0b3JzLmNvbnN0cnVjdAorICAgICAgICAgICAgICAgICQoc2VsZi5wcm9qZWN0KSAkKG5hbWUpIDogU0VBUkNIRURfTElCIDogJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFsgcHJvcGVydHktc2V0LmVtcHR5IF0gOworICAgICAgICB9CisgICAgfQorCisgICAgcnVsZSBjb21wdXRlLXVzYWdlLXJlcXVpcmVtZW50cyAoIHN1YnZhcmlhbnQgKQorICAgIHsKKyAgICAgICAgbG9jYWwgdXNhZ2UtcmVxdWlyZW1lbnRzID0KKyAgICAgICAgICAgIDxpbmNsdWRlPiQoc2VsZi5oZWFkZXJzKQorICAgICAgICAgICAgPGRsbC1wYXRoPiQoc2VsZi5saWJyYXJpZXMpCisgICAgICAgICAgICA8bGlicmFyeS1wYXRoPiQoc2VsZi5saWJyYXJpZXMpCisgICAgICAgICAgICA7CisKKyAgICAgICAgbG9jYWwgcnByb3BlcnRpZXMgPSBbICQoc3VidmFyaWFudCkuYnVpbGQtcHJvcGVydGllcyBdIDsKKyAgICAgICAgIyBDT05TSURFUjogc2hvdWxkIHRoaXMgImlmIiBzZXF1ZW5jZSBiZSByZXBsYWNlZCB3aXRoCisgICAgICAgICMgc29tZSB1c2Ugb2YgJ3Byb3BlcnR5LW1hcCcgY2xhc3M/CisgICAgICAgIGlmIFsgJChycHJvcGVydGllcykuZ2V0IDxydW50aW1lLWRlYnVnZ2luZz4gXSA9ICJvbiIKKyAgICAgICAgeworICAgICAgICAgICAgdXNhZ2UtcmVxdWlyZW1lbnRzICs9CisgICAgICAgICAgICAgICAgPGRlZmluZT5fU1RMUF9ERUJVRz0xCisgICAgICAgICAgICAgICAgPGRlZmluZT5fU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEPTEgOworICAgICAgICB9CisgICAgICAgIGlmIFsgJChycHJvcGVydGllcykuZ2V0IDxydW50aW1lLWxpbms+IF0gPSAic2hhcmVkIgorICAgICAgICB7CisgICAgICAgICAgICB1c2FnZS1yZXF1aXJlbWVudHMgKz0KKyAgICAgICAgICAgICAgICA8ZGVmaW5lPl9TVExQX1VTRV9EWU5BTUlDX0xJQj0xIDsKKyAgICAgICAgfQorICAgICAgICBpZiBbICQocnByb3BlcnRpZXMpLmdldCA8c3RkbGliLXN0bHBvcnQ6ZXh0ZW5zaW9ucz4gXSA9IG5vZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYWdlLXJlcXVpcmVtZW50cyArPQorICAgICAgICAgICAgICAgIDxkZWZpbmU+X1NUTFBfTk9fRVhURU5TSU9OUz0xIDsKKyAgICAgICAgfQorICAgICAgICBpZiBbICQocnByb3BlcnRpZXMpLmdldCA8c3RkbGliLXN0bHBvcnQ6aW9zdHJlYW0+IF0gPSBob3N0aW9zCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYWdlLXJlcXVpcmVtZW50cyArPQorICAgICAgICAgICAgICAgIDxkZWZpbmU+X1NUTFBfTk9fT1dOX0lPU1RSRUFNUz0xCisgICAgICAgICAgICAgICAgPGRlZmluZT5fU1RMUF9IQVNfTk9fTkVXX0lPU1RSRUFNUz0xIDsKKyAgICAgICAgfQorICAgICAgICBpZiAkKHNlbGYudmVyc2lvbi41KQorICAgICAgICB7CisgICAgICAgICAgICAjIFZlcnNpb24gNS54CisgICAgICAgICAgICBpZiBbICQocnByb3BlcnRpZXMpLmdldCA8dGhyZWFkaW5nPiBdID0gInNpbmdsZSIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIFNpbmNlIFNUTHBvcnQ1IGRvZXNuJ3Qgbm9ybWFsbHkgc3VwcG9ydCBzaW5nbGUtdGhyZWFkCisgICAgICAgICAgICAgICAgIyB3ZSBmb3JjZSBTVExwb3J0NSBpbnRvIHRoZSBtdWx0aS10aHJlYWQgbW9kZS4gSGVuY2UKKyAgICAgICAgICAgICAgICAjIGdldHRpbmcgd2hhdCBvdGhlciBsaWJzIHByb3ZpZGUgb2Ygc2luZ2xlLXRocmVhZCBjb2RlCisgICAgICAgICAgICAgICAgIyBsaW5raW5nIGFnYWluc3QgYSBtdWx0aS10aHJlYWQgbGliLgorICAgICAgICAgICAgICAgIHVzYWdlLXJlcXVpcmVtZW50cyArPQorICAgICAgICAgICAgICAgICAgICA8ZGVmaW5lPl9TVExQX1RIUkVBRFM9MSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQodXNhZ2UtcmVxdWlyZW1lbnRzKSBdIDsKKyAgICB9Cit9CisKK3J1bGUgc3RscG9ydC10YXJnZXQgKCBoZWFkZXJzID8gOiBsaWJyYXJpZXMgKiA6IHZlcnNpb24gPyApCit7CisgICAgbG9jYWwgcHJvamVjdCA9IFsgcHJvamVjdC5jdXJyZW50IF0gOworCisgICAgdGFyZ2V0cy5tYWluLXRhcmdldC1hbHRlcm5hdGl2ZQorICAgICAgWyBuZXcgc3RscG9ydC10YXJnZXQtY2xhc3MgICQocHJvamVjdCkgOiAkKGhlYWRlcnMpIDogJChsaWJyYXJpZXMpCisgICAgICAgIDogJCh2ZXJzaW9uKQorICAgICAgXSA7Cit9CisKK2xvY2FsIC52ZXJzaW9uLXN1YmZlYXR1cmUtZGVmaW5lZCA7CisKKyMgSW5pdGlhbGl6ZSBzdGxwb3J0IHN1cHBvcnQuCitydWxlIGluaXQgKAorICAgIHZlcnNpb24gPyA6CisgICAgaGVhZGVycyAgIDogICAgICMgTG9jYXRpb24gb2YgaGVhZGVyIGZpbGVzCisgICAgbGlicmFyaWVzICogICAgICMgTG9jYXRpb24gb2YgbGlicmFyaWVzLCBsaWIgYW5kIGJpbiBzdWJkaXJzIG9mIFNUTHBvcnQuCisgICAgKQoreworICAgICMgRklYTUU6IG5lZWQgdG8gdXNlIGNvbW1vbi5jaGVjay1pbml0LXBhcmFtZXRlcnMgaGVyZS4KKyAgICAjIEF0IHRoZSBtb21lbnQsIHRoYXQgcnVsZSBhbHdheXMgdHJpZXMgdG8gZGVmaW5lIHN1YmZlYXR1cmUKKyAgICAjIG9mIHRoZSAndG9vbHNldCcgZmVhdHVyZSwgd2hpbGUgd2UgbmVlZCB0byBkZWZpbmUgc3ViZmVhdHVyZQorICAgICMgb2YgPHN0ZGxpYj5zdGxwb3J0LCBzbyB0d2Vha3MgdG8gY2hlY2staW5pdC1wYXJhbWV0ZXJzIGFyZSBuZWVkZWQuCisgICAgaWYgJCh2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgISAkKC52ZXJzaW9uLXN1YmZlYXR1cmUtZGVmaW5lZCkKKyAgICAgICAgeworICAgICAgICAgICAgZmVhdHVyZS5zdWJmZWF0dXJlIHN0ZGxpYiBzdGxwb3J0IDogdmVyc2lvbiA6IDogcHJvcGFnYXRlZCA7CisgICAgICAgICAgICAudmVyc2lvbi1zdWJmZWF0dXJlLWRlZmluZWQgPSB0cnVlIDsKKyAgICAgICAgfQorICAgICAgICBmZWF0dXJlLmV4dGVuZC1zdWJmZWF0dXJlIHN0ZGxpYiBzdGxwb3J0IDogdmVyc2lvbiA6ICQodmVyc2lvbikgOworICAgIH0KKworICAgICMgRGVjbGFyZSB0aGUgbWFpbiB0YXJnZXQgZm9yIHRoaXMgU1RMUG9ydCB2ZXJzaW9uLgorICAgIHN0bHBvcnQtdGFyZ2V0ICQoaGVhZGVycykgOiAkKGxpYnJhcmllcykgOiAkKHZlcnNpb24pIDsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9zdW4uamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9zdW4uamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTkyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3N1bi5qYW0KQEAgLTAsMCArMSwxNDIgQEAKKyMgIENvcHlyaWdodCAoQykgQ2hyaXN0b3BoZXIgQ3VycmllIDIwMDMuIFBlcm1pc3Npb24gdG8gY29weSwgdXNlLAorIyAgbW9kaWZ5LCBzZWxsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGlzCisjICBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZAorIyAgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eSwgYW5kIHdpdGggbm8gY2xhaW0gYXMKKyMgIHRvIGl0cyBzdWl0YWJpbGl0eSBmb3IgYW55IHB1cnBvc2UuCisKK2ltcG9ydCBwcm9wZXJ0eSA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgb3MgOworaW1wb3J0IHRvb2xzZXQgOiBmbGFncyA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgY29tbW9uIDsKKworZmVhdHVyZS5leHRlbmQgdG9vbHNldCA6IHN1biA7Cit0b29sc2V0LmluaGVyaXQgIHN1biA6IHVuaXggOworZ2VuZXJhdG9ycy5vdmVycmlkZSBzdW4ucHJlYnVpbHQgOiBidWlsdGluLmxpYi1nZW5lcmF0b3IgOworZ2VuZXJhdG9ycy5vdmVycmlkZSBzdW4ucHJlYnVpbHQgOiBidWlsdGluLnByZWJ1aWx0IDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgc3VuLnNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOiBzZWFyY2hlZC1saWItZ2VuZXJhdG9yIDsKKworZmVhdHVyZS5leHRlbmQgc3RkbGliIDogc3VuLXN0bHBvcnQgOworZmVhdHVyZS5jb21wb3NlIDxzdGRsaWI+c3VuLXN0bHBvcnQKKyAgICA6IDxjeHhmbGFncz4tbGlicmFyeT1zdGxwb3J0NCA8bGlua2ZsYWdzPi1saWJyYXJ5PXN0bHBvcnQ0CisgICAgOworCitydWxlIGluaXQgKCB2ZXJzaW9uID8gOiBjb21tYW5kICogOiBvcHRpb25zICogKSAKK3sKKyAgICBsb2NhbCBjb25kaXRpb24gPSBbIAorICAgICAgY29tbW9uLmNoZWNrLWluaXQtcGFyYW1ldGVycyBzdW4gOiB2ZXJzaW9uICQodmVyc2lvbikgXSA7CisgICAgCisgICAgY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgc3VuIDogQ0MgCisgICAgICAgIDogJChjb21tYW5kKSA6ICIvb3B0L1NVTldzcHJvL2JpbiIgXSA7CisKKyAgICAjIEV2ZW4gaWYgdGhlIHJlYWwgY29tcGlsZXIgaXMgbm90IGZvdW5kLCBwdXQgQ0MgdG8KKyAgICAjIGNvbW1hbmQgbGluZSBzbyB0aGF0IHVzZXIgc2VlIGNvbW1hbmQgbGluZSB0aGF0IHdvdWxkIGhhdmUgYmVpbmcgZXhlY3V0ZWQuCisgICAgY29tbWFuZCA/PSBDQyA7CisKKyAgICBjb21tb24uaGFuZGxlLW9wdGlvbnMgc3VuIDogJChjb25kaXRpb24pIDogJChjb21tYW5kKSA6ICQob3B0aW9ucykgOworICAgIAorICAgIGNvbW1hbmRfYyA9ICQoY29tbWFuZFsxLS0yXSkgJChjb21tYW5kWy0xXTpCPWNjKSA7CisKKyAgICB0b29sc2V0LmZsYWdzIHN1biBDT05GSUdfQ19DT01NQU5EICQoY29uZGl0aW9uKSA6ICQoY29tbWFuZF9jKSA7Cit9CisKKyMgRGVjbGFyZSBnZW5lcmF0b3JzCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWMtY29tcGlsZXIgc3VuLmNvbXBpbGUuYyA6IEMgOiBPQkogOiA8dG9vbHNldD5zdW4gOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIHN1bi5jb21waWxlLmMrKyA6IENQUCA6IE9CSiA6IDx0b29sc2V0PnN1biA7CisKKyMgRGVjbGFyZSBmbGFncyBhbmQgYWN0aW9ucyBmb3IgY29tcGlsYXRpb24KK2ZsYWdzIHN1bi5jb21waWxlIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b24gOiAtZyA7CitmbGFncyBzdW4uY29tcGlsZSBPUFRJT05TIDxwcm9maWxpbmc+b24gOiAteHByb2ZpbGU9dGNvdiA7CitmbGFncyBzdW4uY29tcGlsZSBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BlZWQgOiAteE80ICA7CitmbGFncyBzdW4uY29tcGlsZSBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BhY2UgOiAteE8yIC14c3BhY2UgOworZmxhZ3Mgc3VuLmNvbXBpbGUgT1BUSU9OUyA8dGhyZWFkaW5nPm11bHRpIDogLW10IDsKK2ZsYWdzIHN1bi5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzPm9mZiA6IC1lcnJvZmYgOworZmxhZ3Mgc3VuLmNvbXBpbGUgT1BUSU9OUyA8d2FybmluZ3M+b24gOiAtZXJyb2ZmPSVub25lIDsKK2ZsYWdzIHN1bi5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzPmFsbCAgOiAtZXJyb2ZmPSVub25lIDsKK2ZsYWdzIHN1bi5jb21waWxlIE9QVElPTlMgPHdhcm5pbmdzLWFzLWVycm9ycz5vbiA6IC1lcnJ3YXJuIDsKKworZmxhZ3Mgc3VuLmNvbXBpbGUuYysrIE9QVElPTlMgPGlubGluaW5nPm9mZiA6ICtkIDsKKworIyBUaGUgLW0zMiBhbmQgLW02NCBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgc3RhcnRpbmcKKyMgd2l0aCBTdW4gU3R1ZGlvIDEyLiAgT24gZWFybGllciBjb21waWxlcnMsIHRoZQorIyAnYWRkcmVzcy1tb2RlbCcgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgbm90CisjIGJlIHVzZWQuIEluc3RlYWQsIHVzZSAteGFyY2g9Z2VuZXJpYzY0IGNvbW1hbmQgbGluZQorIyBvcHRpb24uCisjIFNlZSBodHRwOi8vc3ZuLmJvb3N0Lm9yZy90cmFjL2Jvb3N0L3RpY2tldC8xMTg2CisjIGZvciBkZXRhaWxzLgorZmxhZ3Mgc3VuIE9QVElPTlMgPGFkZHJlc3MtbW9kZWw+MzIgOiAtbTMyIDsKK2ZsYWdzIHN1biBPUFRJT05TIDxhZGRyZXNzLW1vZGVsPjY0IDogLW02NCA7CisjIE9uIHNwYXJjLCB0aGVyZSdzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIC1LcGljCisjIGFuZCAtS1BJQy4gVGhlIGZpcnN0IGlzIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50LAorIyBidXQgaGFzIHRoZSBsaW1pdHMgb24gdGhlIHNpemUgb2YgR09UIHRhYmxlLgorIyBGb3IgbWluaW1hbCBmdXNzIG9uIHVzZXIgc2lkZSwgd2UgdXNlIC1LUElDIGhlcmUuCisjIFNlZSBodHRwOi8vc3ZuLmJvb3N0Lm9yZy90cmFjL2Jvb3N0L3RpY2tldC8xMTg2I2NvbW1lbnQ6NgorIyBmb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24uCitmbGFncyBzdW4gT1BUSU9OUyA8bGluaz5zaGFyZWQgOiAtS1BJQyA7CisKK2ZsYWdzIHN1bi5jb21waWxlIE9QVElPTlMgPGNmbGFncz4gOworZmxhZ3Mgc3VuLmNvbXBpbGUuYysrIE9QVElPTlMgPGN4eGZsYWdzPiA7CitmbGFncyBzdW4uY29tcGlsZSBERUZJTkVTIDxkZWZpbmU+IDsKK2ZsYWdzIHN1bi5jb21waWxlIElOQ0xVREVTIDxpbmNsdWRlPiA7CisKK2FjdGlvbnMgY29tcGlsZS5jCit7CisgICAgIiQoQ09ORklHX0NfQ09NTUFORCkiICQoT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtYyAtbyAiJCg8KSIgIiQoPikiCit9CisKK2FjdGlvbnMgY29tcGlsZS5jKysKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoT1BUSU9OUykgLUQkKERFRklORVMpIC1JIiQoSU5DTFVERVMpIiAtYyAtbyAiJCg8KSIgIiQoPikiCit9CisKKyMgRGVjbGFyZSBmbGFncyBhbmQgYWN0aW9ucyBmb3IgbGlua2luZworZmxhZ3Mgc3VuLmxpbmsgT1BUSU9OUyA8ZGVidWctc3ltYm9scz5vbiA6IC1nIDsKKyMgU3RyaXAgdGhlIGJpbmFyeSB3aGVuIG5vIGRlYnVnZ2luZyBpcyBuZWVkZWQKK2ZsYWdzIHN1bi5saW5rIE9QVElPTlMgPGRlYnVnLXN5bWJvbHM+b2ZmIDogLXMgOworZmxhZ3Mgc3VuLmxpbmsgT1BUSU9OUyA8cHJvZmlsaW5nPm9uIDogLXhwcm9maWxlPXRjb3YgOworZmxhZ3Mgc3VuLmxpbmsgT1BUSU9OUyA8dGhyZWFkaW5nPm11bHRpIDogLW10IDsKK2ZsYWdzIHN1bi5saW5rIE9QVElPTlMgPGxpbmtmbGFncz4gOworZmxhZ3Mgc3VuLmxpbmsgTElOS1BBVEggPGxpYnJhcnktcGF0aD4gOworZmxhZ3Mgc3VuLmxpbmsgRklORExJQlMtU1QgPGZpbmQtc3RhdGljLWxpYnJhcnk+IDsKK2ZsYWdzIHN1bi5saW5rIEZJTkRMSUJTLVNBIDxmaW5kLXNoYXJlZC1saWJyYXJ5PiA7CitmbGFncyBzdW4ubGluayBMSUJSQVJJRVMgPGxpYnJhcnktZmlsZT4gOworZmxhZ3Mgc3VuLmxpbmsgTElOSy1SVU5USU1FIDxydW50aW1lLWxpbms+c3RhdGljIDogc3RhdGljIDsKK2ZsYWdzIHN1bi5saW5rIExJTkstUlVOVElNRSA8cnVudGltZS1saW5rPnNoYXJlZCA6IGR5bmFtaWMgOworZmxhZ3Mgc3VuLmxpbmsgUlBBVEggPGRsbC1wYXRoPiA7CisjIE9uIGdjYywgdGhlcmUgYXJlIHNlcGFyYXRlIG9wdGlvbnMgZm9yIGRsbCBwYXRoIGF0IHJ1bnRpbWUgYW5kCisjIGxpbmsgdGltZS4gT24gU29sYXJpcywgdGhlcmUncyBvbmx5IG9uZTogLVIsIHNvIHdlIGhhdmUgdG8gdXNlCisjIGl0LCBldmVuIHRob3VnaCBpdCdzIGJhZCBpZGVhLgorZmxhZ3Mgc3VuLmxpbmsgUlBBVEggPHhkbGwtcGF0aD4gOworCisjIFRoZSBQT1NJWCByZWFsLXRpbWUgbGlicmFyeSBpcyBhbHdheXMgbmVlZGVkIChuYW5vc2xlZXAsIGNsb2NrX2dldHRpbWUgZXRjLikKK2ZsYWdzIHN1bi5saW5rIEZJTkRMSUJTLVNBIDogcnQgOworCitydWxlIGxpbmsgKCB0YXJnZXRzICogOiBzb3VyY2VzICogOiBwcm9wZXJ0aWVzICogKQoreworICAgIFNQQUNFIG9uICQodGFyZ2V0cykgPSAiICIgOworfQorCithY3Rpb25zIGxpbmsgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoT1BUSU9OUykgLUwiJChMSU5LUEFUSCkiIC1SIiQoUlBBVEgpIiAtbyAiJCg8KSIgIiQoPikiICIkKExJQlJBUklFUykiIC1CZHluYW1pYyAtbCQoRklORExJQlMtU0EpIC1Cc3RhdGljIC1sJChGSU5ETElCUy1TVCkgLUIkKExJTkstUlVOVElNRSkKK30KKworIyBTbGlnaHQgbW9kcyBmb3IgZGxscworcnVsZSBsaW5rLmRsbCAoIHRhcmdldHMgKiA6IHNvdXJjZXMgKiA6IHByb3BlcnRpZXMgKiApCit7CisgICAgU1BBQ0Ugb24gJCh0YXJnZXRzKSA9ICIgIiA7Cit9CisKK2FjdGlvbnMgbGluay5kbGwgYmluZCBMSUJSQVJJRVMKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiICQoT1BUSU9OUykgLUwiJChMSU5LUEFUSCkiIC1SIiQoUlBBVEgpIiAtbyAiJCg8KSIgLWgkKDxbMV06RD0pIC1HICIkKD4pIiAiJChMSUJSQVJJRVMpIiAtQmR5bmFtaWMgLWwkKEZJTkRMSUJTLVNBKSAtQnN0YXRpYyAtbCQoRklORExJQlMtU1QpIC1CJChMSU5LLVJVTlRJTUUpCit9CisKKyMgRGVjbGFyZSBhY3Rpb24gZm9yIGNyZWF0aW5nIHN0YXRpYyBsaWJyYXJpZXMKK2FjdGlvbnMgcGllY2VtZWFsIGFyY2hpdmUKK3sKKyAgICAiJChDT05GSUdfQ09NTUFORCkiIC14YXIgLW8gIiQoPCkiICIkKD4pIgorfQorCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3N5bWxpbmsuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9zeW1saW5rLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzNlODI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy9zeW1saW5rLmphbQpAQCAtMCwwICsxLDE0MCBAQAorIyBDb3B5cmlnaHQgMjAwMyBEYXZlIEFicmFoYW1zIAorIyBDb3B5cmlnaHQgMjAwMiwgMjAwMyBSZW5lIFJpdmVyYSAKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgVmxhZGltaXIgUHJ1cyAKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAKKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworIyBEZWZpbmVzIHRoZSAic3ltbGluayIgc3BlY2lhbCB0YXJnZXQuICdzeW1saW5rJyB0YXJnZXRzIG1ha2Ugc3ltYm9saWMgbGlua3MKKyMgdG8gdGhlIHNvdXJjZXMuCisKK2ltcG9ydCB0YXJnZXRzIG1vZHVsZXMgcGF0aCBjbGFzcyBvcyBmZWF0dXJlIHByb2plY3QgcHJvcGVydHktc2V0IDsKKworLmNvdW50ID0gMCA7CisKK2ZlYXR1cmUuZmVhdHVyZSBzeW1saW5rLWxvY2F0aW9uIDogcHJvamVjdC1yZWxhdGl2ZSBidWlsZC1yZWxhdGl2ZSA6IGluY2lkZW50YWwgOworCisjIFRoZSBjbGFzcyByZXByZXNlbnRpbmcgInN5bWxpbmsiIHRhcmdldHMuCisjCitjbGFzcyBzeW1saW5rLXRhcmdldHMgOiBiYXNpYy10YXJnZXQKK3sKKyAgICBpbXBvcnQgbnVtYmVycyBtb2R1bGVzIGNsYXNzIHByb3BlcnR5IHByb2plY3QgcGF0aCA7CisgICAgCisgICAgcnVsZSBfX2luaXRfXyAoCisgICAgICBwcm9qZWN0CisgICAgICAgIDogdGFyZ2V0cyAqCisgICAgICAgIDogc291cmNlcyAqCisgICAgKQorICAgIHsgICAgCisgICAgICAgICMgR2VuZXJhdGUgYSBmYWtlIG5hbWUgZm9yIG5vdy4gTmVlZCB1bm5hbWVkIHRhcmdldHMgZXZlbnR1YWxseS4KKyAgICAgICAgbG9jYWwgYyA9IFsgbW9kdWxlcy5wZWVrIHN5bWxpbmsgOiAuY291bnQgXSA7CisgICAgICAgIG1vZHVsZXMucG9rZSBzeW1saW5rIDogLmNvdW50IDogWyBudW1iZXJzLmluY3JlbWVudCAkKGMpIF0gOworICAgICAgICBsb2NhbCBmYWtlLW5hbWUgPSBzeW1saW5rIyQoYykgOworICAgIAorICAgICAgICAgIGJhc2ljLXRhcmdldC5fX2luaXRfXyAkKGZha2UtbmFtZSkgOiAkKHByb2plY3QpIDogJChzb3VyY2VzKSA7CisgICAgCisgICAgICAgICMgUmVtZW1iZXIgdGhlIHRhcmdldHMgdG8gbWFwIHRoZSBzb3VyY2VzIG9udG8uIFBhZCBvciB0cnVuY2F0ZQorICAgICAgICAjIHRvIGZpdCB0aGUgc291cmNlcyBnaXZlbi4KKyAgICAgICAgc2VsZi50YXJnZXRzID0gOworICAgICAgICBmb3IgbG9jYWwgc291cmNlIGluICQoc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJCh0YXJnZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0cyArPSAkKHRhcmdldHNbMV0pIDsKKyAgICAgICAgICAgICAgICB0YXJnZXRzID0gJCh0YXJnZXRzWzItXSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0cyArPSAkKHNvdXJjZSkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgCisgICAgICAgICMgVGhlIHZpcnR1YWwgdGFyZ2V0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB0YXJnZXRzLgorICAgICAgICBzZWxmLnZpcnR1YWwtdGFyZ2V0cyA9IDsKKyAgICB9ICAgIAorICAgIAorICAgIHJ1bGUgY29uc3RydWN0ICggbmFtZSA6IHNvdXJjZS10YXJnZXRzICogOiBwcm9wZXJ0eS1zZXQgKQorICAgIHsKKyAgICAgICAgbG9jYWwgaSA9IDEgOworICAgICAgICBmb3IgbG9jYWwgdCBpbiAkKHNvdXJjZS10YXJnZXRzKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBzID0gJChzZWxmLnRhcmdldHNbJChpKV0pIDsKKyAgICAgICAgICAgIGxvY2FsIGEgPSBbIGNsYXNzLm5ldyBhY3Rpb24gICQodCkgOiBzeW1saW5rLmxuIDogJChwcm9wZXJ0eS1zZXQpIF0gOworICAgICAgICAgICAgbG9jYWwgdnQgPSBbIGNsYXNzLm5ldyBmaWxlLXRhcmdldCAkKHM6RD0pIAorICAgICAgICAgICAgICA6IFsgJCh0KS50eXBlIF0gOiAkKHNlbGYucHJvamVjdCkgOiAkKGEpIF0gOworICAgICAgICAgICAgCisgICAgICAgICAgICAjIFBsYWNlIHRoZSBzeW1saW5rIGluIHRoZSBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QKKyAgICAgICAgICAgICMgbG9jYXRpb24sIGluc3RlYWQgb2YgcGxhY2luZyBpdCBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorICAgICAgICAgICAgaWYgWyBwcm9wZXJ0eS5zZWxlY3QgPHN5bWxpbmstbG9jYXRpb24+IDogWyAkKHByb3BlcnR5LXNldCkucmF3IF0gXSA9IDxzeW1saW5rLWxvY2F0aW9uPnByb2plY3QtcmVsYXRpdmUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkKHZ0KS5zZXQtcGF0aCBbIHBhdGgucm9vdCAkKHM6RCkgWyAkKHNlbGYucHJvamVjdCkuZ2V0IGxvY2F0aW9uIF0gXSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNlbGYudmlydHVhbC10YXJnZXRzICs9ICQodnQpIDsKKyAgICAgICAgICAgIGkgPSBbIG51bWJlcnMuaW5jcmVtZW50ICQoaSkgXSA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFsgcHJvcGVydHktc2V0LmVtcHR5IF0gJChzZWxmLnZpcnR1YWwtdGFyZ2V0cykgOworICAgIH0KK30KKworIyBDcmVhdGVzIGEgc3ltYm9saWMgbGluayBmcm9tIGEgc2V0IG9mIHRhcmdldHMgdG8gYSBzZXQgb2Ygc291cmNlcy4KKyMgVGhlIHRhcmdldHMgYW5kIHNvdXJjZXMgbWFwIG9uZSB0byBvbmUuIFRoZSBzeW1saW5rcyBnZW5lcmF0ZWQgYXJlCisjIGxpbWl0ZWQgdG8gYmUgdGhlIG9uZXMgZ2l2ZW4gYXMgdGhlIHNvdXJjZXMuIFRoYXQgaXMsIHRoZSB0YXJnZXRzCisjIGFyZSBlaXRoZXIgcGFkZGVkIG9yIHRyaW1tZWQgdG8gZXF1YXRlIHRvIHRoZSBzb3VyY2VzLiBUaGUgcGFkZGluZworIyBpcyBkb25lIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlLiBGb3IgZXhhbXBsZTo6CisjCisjICAgICBzeW1saW5rIDogb25lIHR3byA7CisjCisjIElzIGVxdWFsIHRvOjoKKyMKKyMgICAgIHN5bWxpbmsgb25lIHR3byA6IG9uZSB0d28gOworIworIyBOYW1lcyBmb3Igc3ltbGluayBhcmUgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QgbG9jYXRpb24uIFRoZXkgY2Fubm90CisjIGluY2x1ZGUgIi4uIiBwYXRoIGNvbXBvbmVudHMuCitydWxlIHN5bWxpbmsgKAorICAgIHRhcmdldHMgKgorICAgIDogc291cmNlcyAqCisgICAgKQoreworICAgIGxvY2FsIHByb2plY3QgPSBbIHByb2plY3QuY3VycmVudCBdIDsKKyAgICAKKyAgICByZXR1cm4gWyB0YXJnZXRzLm1haW4tdGFyZ2V0LWFsdGVybmF0aXZlCisgICAgICAgIFsgY2xhc3MubmV3IHN5bWxpbmstdGFyZ2V0cyAkKHByb2plY3QpIDogJCh0YXJnZXRzKSA6IAorICAgICAgICAgICMgTm90ZTogaW5saW5lIHRhcmdldHMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHN5bWxpbmssIGludGVudGlvbmFsbHksCisgICAgICAgICAgIyBzaW5jZSBpdCdzIHVzZWQgdG8gbGlua2luZyBleGlzdGluZyBub24tbG9jYWwgdGFyZ2V0cy4KKyAgICAgICAgICAkKHNvdXJjZXMpIF0gXSA7Cit9CisKK3J1bGUgbG4KK3sKKyAgICBsb2NhbCBvcyA7CisgICAgaWYgWyBtb2R1bGVzLnBlZWsgOiBVTklYIF0geyBvcyA9IFVOSVggOyB9CisgICAgZWxzZSB7IG9zID89IFsgb3MubmFtZSBdIDsgfQorICAgICMgUmVtZW1iZXIgdGhlIHBhdGggdG8gbWFrZSB0aGUgbGluayByZWxhdGl2ZSB0byB3aGVyZSB0aGUgc3ltbGluayBpcyBsb2NhdGVkLgorICAgIGxvY2FsIHBhdGgtdG8tc291cmNlID0gWyBwYXRoLnJlbGF0aXZlLXRvCisgICAgICAgIFsgcGF0aC5tYWtlIFsgb24gJCg8KSByZXR1cm4gJChMT0NBVEUpIF0gXQorICAgICAgICBbIHBhdGgubWFrZSBbIG9uICQoPikgcmV0dXJuICQoTE9DQVRFKSBdIF0gXSA7CisgICAgaWYgJChwYXRoLXRvLXNvdXJjZSkgPSAuCisgICAgeworICAgICAgICBQQVRIX1RPX1NPVVJDRSBvbiAkKDwpID0gIiIgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQQVRIX1RPX1NPVVJDRSBvbiAkKDwpID0gWyBwYXRoLm5hdGl2ZSAkKHBhdGgtdG8tc291cmNlKSBdIDsKKyAgICB9CisgICAgbG4tJChvcykgJCg8KSA6ICQoPikgOworfQorCithY3Rpb25zIGxuLVVOSVgKK3sKKyAgICBsbiAtZiAtcyAnJCg+OkQ9OlI9JChQQVRIX1RPX1NPVVJDRSkpJyAnJCg8KScKK30KKworIyB0aGVyZSBpcyBhIHdheSB0byBkbyB0aGlzOyB3ZSBmYWxsIGJhY2sgdG8gYSBjb3B5IGZvciBub3cKK2FjdGlvbnMgbG4tTlQKK3sKKyAgICBlY2hvICJOVCBzeW1saW5rcyBub3Qgc3VwcG9ydGVkIHlldCwgbWFraW5nIGNvcHkiCisgICAgZGVsIC9mIC9xICIkKDwpIiAyPm51bCA+bnVsCisgICAgY29weSAiJCg+KSIgIiQoPCkiICQoTlVMTF9PVVQpCit9CisKK0lNUE9SVCAkKF9fbmFtZV9fKSA6IHN5bWxpbmsgOiA6IHN5bWxpbmsgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy90ZXN0aW5nLWF1eC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3Rlc3RpbmctYXV4LmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGJhMDAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy90ZXN0aW5nLWF1eC5qYW0KQEAgLTAsMCArMSwyMjAgQEAKKyMgVGhpcyBtb2R1bGUgaXMgaW1wb3J0ZWQgYnkgdGVzdGluZy5weS4gVGhlIGRlZmluaXRpb25zIGhlcmUgYXJlCisjIHRvbyB0cmlja3kgdG8gZG8gaW4gUHl0aG9uCisKKyMgQ2F1c2VzIHRoZSAndGFyZ2V0JyB0byBleGlzdCBhZnRlciBiamFtIGludm9jYXRpb24gaWYgYW5kIG9ubHkgaWYgYWxsIHRoZQorIyBkZXBlbmRlbmNpZXMgd2VyZSBzdWNjZXNzZnVsbHkgYnVpbHQuCisjCitydWxlIGV4cGVjdC1zdWNjZXNzICggdGFyZ2V0IDogZGVwZW5kZW5jeSArIDogcmVxdWlyZW1lbnRzICogKQoreworICAgICoqcGFzc2VkKiogJCh0YXJnZXQpIDogJChzb3VyY2VzKSA7Cit9CitJTVBPUlQgdGVzdGluZyA6IGV4cGVjdC1zdWNjZXNzIDogOiB0ZXN0aW5nLmV4cGVjdC1zdWNjZXNzIDsKKworIyBDYXVzZXMgdGhlICd0YXJnZXQnIHRvIGV4aXN0IGFmdGVyIGJqYW0gaW52b2NhdGlvbiBpZiBhbmQgb25seSBpZiBhbGwgc29tZSBvZgorIyB0aGUgZGVwZW5kZW5jaWVzIHdlcmUgbm90IHN1Y2Nlc3NmdWxseSBidWlsdC4KKyMKK3J1bGUgZXhwZWN0LWZhaWx1cmUgKCB0YXJnZXQgOiBkZXBlbmRlbmN5ICsgOiBwcm9wZXJ0aWVzICogKQoreworICAgIGxvY2FsIGdyaXN0ID0gWyBNQVRDSCBePCguKik+IDogJChkZXBlbmRlbmN5OkcpIF0gOworICAgIGxvY2FsIG1hcmtlciA9ICQoZGVwZW5kZW5jeTpHPSQoZ3Jpc3QpKmZhaWwpIDsKKyAgICAoZmFpbGVkLWFzLWV4cGVjdGVkKSAkKG1hcmtlcikgOworICAgIEZBSUxfRVhQRUNURUQgJChkZXBlbmRlbmN5KSA7CisgICAgTE9DQVRFIG9uICQobWFya2VyKSA9IFsgb24gJChkZXBlbmRlbmN5KSByZXR1cm4gJChMT0NBVEUpIF0gOworICAgIFJNT0xEICQobWFya2VyKSA7CisgICAgREVQRU5EUyAkKG1hcmtlcikgOiAkKGRlcGVuZGVuY3kpIDsKKyAgICBERVBFTkRTICQodGFyZ2V0KSA6ICQobWFya2VyKSA7CisgICAgKipwYXNzZWQqKiAkKHRhcmdldCkgOiAkKG1hcmtlcikgOworfQorSU1QT1JUIHRlc3RpbmcgOiBleHBlY3QtZmFpbHVyZSA6IDogdGVzdGluZy5leHBlY3QtZmFpbHVyZSA7CisKKyMgVGhlIHJ1bGUvYWN0aW9uIGNvbWJpbmF0aW9uIHVzZWQgdG8gcmVwb3J0IHN1Y2Nlc3NmdWwgcGFzc2luZyBvZiBhIHRlc3QuCisjCitydWxlICoqcGFzc2VkKioKK3sKKyAgICAjIEZvcmNlIGRlbGV0aW9uIG9mIHRoZSB0YXJnZXQsIGluIGNhc2UgYW55IGRlcGVuZGVuY2llcyBmYWlsZWQgdG8gYnVpbGQuCisgICAgUk1PTEQgJCg8KSA7Cit9CisKKworIyBVc2VkIHRvIGNyZWF0ZSB0ZXN0IGZpbGVzIHNpZ25pZnlpbmcgcGFzc2VkIHRlc3RzLgorIworYWN0aW9ucyAqKnBhc3NlZCoqCit7CisgICAgZWNobyBwYXNzZWQgPiAiJCg8KSIKK30KKworCisjIFVzZWQgdG8gY3JlYXRlIHJlcGxhY2VtZW50IG9iamVjdCBmaWxlcyB0aGF0IGRvIG5vdCBnZXQgY3JlYXRlZCBkdXJpbmcgdGVzdHMKKyMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gZmFpbC4KKyMKK2FjdGlvbnMgKGZhaWxlZC1hcy1leHBlY3RlZCkKK3sKKyAgICBlY2hvIGZhaWxlZCBhcyBleHBlY3RlZCA+ICIkKDwpIgorfQorCisjIFJ1bnMgZXhlY3V0YWJsZSAnc291cmNlcycgYW5kIHN0b3JlcyBzdGRvdXQgaW4gZmlsZSAndGFyZ2V0Jy4gVW5sZXNzCisjIC0tcHJlc2VydmUtdGVzdC10YXJnZXRzIGNvbW1hbmQgbGluZSBvcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLCByZW1vdmVzIHRoZQorIyBleGVjdXRhYmxlLiBUaGUgJ3RhcmdldC10by1yZW1vdmUnIHBhcmFtZXRlciBjb250cm9scyB3aGF0IHNob3VsZCBiZSByZW1vdmVkOgorIyAgIC0gaWYgJ25vbmUnLCBkb2VzIG5vdCByZW1vdmUgYW55dGhpbmcsIGV2ZXIKKyMgICAtIGlmIGVtcHR5LCByZW1vdmVzICdzb3VyY2UnCisjICAgLSBpZiBub24tZW1wdHkgYW5kIG5vdCAnbm9uZScsIGNvbnRhaW5zIGEgbGlzdCBvZiBzb3VyY2VzIHRvIHJlbW92ZS4KKyMKK3J1bGUgY2FwdHVyZS1vdXRwdXQgKCB0YXJnZXQgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICogOiB0YXJnZXRzLXRvLXJlbW92ZSAqICkKK3sKKyAgICBvdXRwdXQtZmlsZSBvbiAkKHRhcmdldCkgPSAkKHRhcmdldDpTPS5vdXRwdXQpIDsKKyAgICBMT0NBVEUgb24gJCh0YXJnZXQ6Uz0ub3V0cHV0KSA9IFsgb24gJCh0YXJnZXQpIHJldHVybiAkKExPQ0FURSkgXSA7CisKKyAgICAjIFRoZSBJTkNMVURFUyBraWxsIGEgd2FybmluZyBhYm91dCBpbmRlcGVuZGVudCB0YXJnZXQuLi4KKyAgICBJTkNMVURFUyAkKHRhcmdldCkgOiAkKHRhcmdldDpTPS5vdXRwdXQpIDsKKyAgICAjIGJ1dCBpdCBhbHNvIHB1dHMgLm91dHB1dCBpbnRvIGRlcGVuZGVuY3kgZ3JhcGgsIHNvIHdlIG11c3QgdGVsbCBqYW0gaXQgaXMKKyAgICAjIE9LIGlmIGl0IGNhbm5vdCBmaW5kIHRoZSB0YXJnZXQgb3IgdXBkYXRpbmcgcnVsZS4KKyAgICBOT0NBUkUgJCh0YXJnZXQ6Uz0ub3V0cHV0KSA7CisKKyAgICAjIFRoaXMgaGFzIHR3by1mb2xkIGVmZmVjdC4gRmlyc3QgaXQgYWRkcyBpbnB1dCBmaWxlcyB0byB0aGUgZGVwZW5kZW5kZW5jeQorICAgICMgZ3JhcGgsIHByZXZlbnRpbmcgYSB3YXJuaW5nLiBTZWNvbmQsIGl0IGNhdXNlcyBpbnB1dCBmaWxlcyB0byBiZSBib3VuZAorICAgICMgYmVmb3JlIHRhcmdldCBpcyBjcmVhdGVkLiBUaGVyZWZvcmUsIHRoZXkgYXJlIGJvdW5kIHVzaW5nIFNFQVJDSCBzZXR0aW5nCisgICAgIyBvbiB0aGVtIGFuZCBub3QgTE9DQVRFIHNldHRpbmcgb2YgJCh0YXJnZXQpLCBhcyBpbiBvdGhlciBjYXNlIChkdWUgdG8gamFtCisgICAgIyBidWcpLgorICAgIERFUEVORFMgJCh0YXJnZXQpIDogWyBvbiAkKHRhcmdldCkgcmV0dXJuICQoSU5QVVRfRklMRVMpIF0gOworCisgICAgaWYgJCh0YXJnZXRzLXRvLXJlbW92ZSkgPSBub25lCisgICAgeworICAgICAgICB0YXJnZXRzLXRvLXJlbW92ZSA9IDsKKyAgICB9CisgICAgZWxzZSBpZiAhICQodGFyZ2V0cy10by1yZW1vdmUpCisgICAgeworICAgICAgICB0YXJnZXRzLXRvLXJlbW92ZSA9ICQoc291cmNlKSA7CisgICAgfQorCisgICAgaWYgWyBvbiAkKHRhcmdldCkgcmV0dXJuICQoUkVNT1ZFX1RFU1RfVEFSR0VUUykgXQorICAgIHsKKyAgICAgICAgVEVNUE9SQVJZICQodGFyZ2V0cy10by1yZW1vdmUpIDsKKyAgICAgICAgIyBTZXQgYSBzZWNvbmQgYWN0aW9uIG9uIHRhcmdldCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgY2FwdHVyZQorICAgICAgICAjIG91dHB1dCBhY3Rpb24uIFRoZSAnUm1UZW1wcycgcnVsZSBoYXMgdGhlICdpZ25vcmUnIG1vZGlmaWVyIHNvIGl0IGlzCisgICAgICAgICMgYWx3YXlzIGNvbnNpZGVyZWQgc3VjY2VlZGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgJ3J1bi1mYWlsJyB0ZXN0LiBGb3IKKyAgICAgICAgIyB0aGF0IHRlc3QgdGhlIHRhcmdldCB3aWxsIGJlIG1hcmtlZCB3aXRoIEZBSUxfRVhQRUNURUQsIGFuZCB3aXRob3V0CisgICAgICAgICMgJ2lnbm9yZScgc3VjY2Vzc2Z1bCBleGVjdXRpb24gd2lsbCBiZSBuZWdhdGVkIGFuZCBiZSByZXBvcnRlZCBhcworICAgICAgICAjIGZhaWx1cmUuIFdpdGggJ2lnbm9yZScgd2UgZG8gbm90IGRldGVjdCBhIGNhc2Ugd2hlcmUgcmVtb3ZpbmcgZmlsZXMKKyAgICAgICAgIyBmYWlscywgYnV0IGl0IGlzIG5vdCBsaWtlbHkgdG8gaGFwcGVuLgorICAgICAgICBSbVRlbXBzICQodGFyZ2V0KSA6ICQodGFyZ2V0cy10by1yZW1vdmUpIDsKKyAgICB9Cit9CisKKworaWYgWyBvcy5uYW1lIF0gPSBOVAoreworICAgIC5TVEFUVVMgICAgICAgID0gJXN0YXR1cyUgOworICAgIC5TRVRfU1RBVFVTICAgID0gInNldCBzdGF0dXM9JUVSUk9STEVWRUwlIiA7CisgICAgLlJVTl9PVVRQVVRfTkwgPSAiZWNoby4iIDsKKyAgICAuU1RBVFVTXzAgICAgICA9ICIlc3RhdHVzJSBFUVUgMCAoIiA7CisgICAgLlNUQVRVU19OT1RfMCAgPSAiJXN0YXR1cyUgTkVRIDAgKCIgOworICAgIC5WRVJCT1NFICAgICAgID0gIiV2ZXJib3NlJSBFUVUgMSAoIiA7CisgICAgLkVORElGICAgICAgICAgPSAiKSIgOworICAgIC5TSEVMTF9TRVQgICAgID0gInNldCAiIDsKKyAgICAuQ0FURU5BVEUgICAgICA9IHR5cGUgOworICAgIC5DUCAgICAgICAgICAgID0gY29weSA7Cit9CitlbHNlCit7CisgICAgLlNUQVRVUyAgICAgICAgPSAiJHN0YXR1cyIgOworICAgIC5TRVRfU1RBVFVTICAgID0gInN0YXR1cz0kPyIgOworICAgIC5SVU5fT1VUUFVUX05MID0gImVjaG8iIDsKKyAgICAuU1RBVFVTXzAgICAgICA9ICJ0ZXN0ICRzdGF0dXMgLWVxIDAgOyB0aGVuIiA7CisgICAgLlNUQVRVU19OT1RfMCAgPSAidGVzdCAkc3RhdHVzIC1uZSAwIDsgdGhlbiIgOworICAgIC5WRVJCT1NFICAgICAgID0gInRlc3QgJHZlcmJvc2UgLWVxIDEgOyB0aGVuIiA7CisgICAgLkVORElGICAgICAgICAgPSAiZmkiIDsKKyAgICAuU0hFTExfU0VUICAgICA9ICIiIDsKKyAgICAuQ0FURU5BVEUgICAgICA9IGNhdCA7CisgICAgLkNQICAgICAgICAgICAgPSBjcCA7Cit9CisKKworLlZFUkJPU0VfVEVTVCA9IDAgOworaWYgLS12ZXJib3NlLXRlc3QgaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0KK3sKKyAgICAuVkVSQk9TRV9URVNUID0gMSA7Cit9CisKKworLlJNID0gWyBjb21tb24ucm0tY29tbWFuZCBdIDsKKworCithY3Rpb25zIGNhcHR1cmUtb3V0cHV0IGJpbmQgSU5QVVRfRklMRVMgb3V0cHV0LWZpbGUKK3sKKyAgICAkKFBBVEhfU0VUVVApCisgICAgJChMQVVOQ0hFUikgIiQoPikiICQoQVJHUykgIiQoSU5QVVRfRklMRVMpIiA+ICIkKG91dHB1dC1maWxlKSIgMj4mMQorICAgICQoLlNFVF9TVEFUVVMpCisgICAgJCguUlVOX09VVFBVVF9OTCkgPj4gIiQob3V0cHV0LWZpbGUpIgorICAgIGVjaG8gRVhJVCBTVEFUVVM6ICQoLlNUQVRVUykgPj4gIiQob3V0cHV0LWZpbGUpIgorICAgIGlmICQoLlNUQVRVU18wKQorICAgICAgICAkKC5DUCkgIiQob3V0cHV0LWZpbGUpIiAiJCg8KSIKKyAgICAkKC5FTkRJRikKKyAgICAkKC5TSEVMTF9TRVQpdmVyYm9zZT0kKC5WRVJCT1NFX1RFU1QpCisgICAgaWYgJCguU1RBVFVTX05PVF8wKQorICAgICAgICAkKC5TSEVMTF9TRVQpdmVyYm9zZT0xCisgICAgJCguRU5ESUYpCisgICAgaWYgJCguVkVSQk9TRSkKKyAgICAgICAgZWNobyA9PT09PT0gQkVHSU4gT1VUUFVUID09PT09PQorICAgICAgICAkKC5DQVRFTkFURSkgIiQob3V0cHV0LWZpbGUpIgorICAgICAgICBlY2hvID09PT09PSBFTkQgT1VUUFVUID09PT09PQorICAgICQoLkVORElGKQorICAgIGV4aXQgJCguU1RBVFVTKQorfQorCitJTVBPUlQgdGVzdGluZyA6IGNhcHR1cmUtb3V0cHV0IDogOiB0ZXN0aW5nLmNhcHR1cmUtb3V0cHV0IDsKKworCithY3Rpb25zIHF1aWV0bHkgdXBkYXRlZCBpZ25vcmUgcGllY2VtZWFsIHRvZ2V0aGVyIFJtVGVtcHMKK3sKKyAgICAkKC5STSkgIiQoPikiCit9CisKKworLk1BS0VfRklMRSA9IFsgY29tbW9uLmZpbGUtY3JlYXRpb24tY29tbWFuZCBdIDsKKworYWN0aW9ucyB1bml0LXRlc3QKK3sKKyAgICAkKFBBVEhfU0VUVVApCisgICAgJChMQVVOQ0hFUikgIiQoPikiICQoQVJHUykgJiYgJCguTUFLRV9GSUxFKSAiJCg8KSIKK30KKworIyBOb3RlIHRoYXQgdGhpcyBydWxlIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgc2luZ2xlIHRhcmdldCBpbiBjYXNlCisjIHRoZXJlIGFyZSBtdWx0aXBsZSBhY3Rpb25zIG9wZXJhdGluZyBvbiB0aGUgc2FtZSB0YXJnZXQgaW4gc2VxdWVuY2UuIE9uZSBzdWNoCisjIGV4YW1wbGUgYXJlIG1zdmMgZXhlIHRhcmdldHMgZmlyc3QgY3JlYXRlZCBieSBhIGxpbmtlciBhY3Rpb24gYW5kIHRoZW4gdXBkYXRlZAorIyB3aXRoIGFuIGVtYmVkZGVkIG1hbmlmZXN0IGZpbGUgYnkgYSBzZXBhcmF0ZSBhY3Rpb24uCitydWxlIHJlY29yZC10aW1lICggdGFyZ2V0IDogc291cmNlIDogc3RhcnQgZW5kIHVzZXIgc3lzdGVtICkKK3sKKyAgICBsb2NhbCBzcmMtc3RyaW5nID0gWyQoc291cmNlOkc9Oko9IiwiKSJdICIgOworICAgIFVTRVJfVElNRSBvbiAkKHRhcmdldCkgKz0gJChzcmMtc3RyaW5nKSQodXNlcikgOworICAgIFNZU1RFTV9USU1FIG9uICQodGFyZ2V0KSArPSAkKHNyYy1zdHJpbmcpJChzeXN0ZW0pIDsKKworICAgICMgV2UgbmVlZCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBiZWNhdXNlIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSBzdWNoCisgICAgIyB2YXJpYWJsZSBleHBhbnNpb24gaW4gYWN0aW9ucyB3b3VsZCBub3Qgd29yayBkdWUgdG8gcXVvdGVzIGdldHRpbmcgdHJlYXRlZAorICAgICMgYXMgcmVndWxhciBjaGFyYWN0ZXJzLgorICAgIFVTRVJfVElNRV9TRUNPTkRTIG9uICQodGFyZ2V0KSArPSAkKHNyYy1zdHJpbmcpJCh1c2VyKSIgc2Vjb25kcyIgOworICAgIFNZU1RFTV9USU1FX1NFQ09ORFMgb24gJCh0YXJnZXQpICs9ICQoc3JjLXN0cmluZykkKHN5c3RlbSkiIHNlY29uZHMiIDsKK30KKworIyBDYWxsaW5nIHRoaXMgcnVsZSByZXF1ZXN0cyB0aGF0IEJvb3N0IEJ1aWxkIHRpbWUgaG93IGxvbmcgaXQgdGFrZXMgdG8gYnVpbGQKKyMgdGhlICdzb3VyY2UnIHRhcmdldCBhbmQgZGlzcGxheSB0aGUgcmVzdWx0cyBib3RoIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGluCisjIHRoZSAndGFyZ2V0JyBmaWxlLgorIworcnVsZSB0aW1lICggdGFyZ2V0IDogc291cmNlcyArIDogcHJvcGVydGllcyAqICApCit7CisgICAgIyBTZXQgdXAgcnVsZSBmb3IgcmVjb3JkaW5nIHRpbWluZyBpbmZvcm1hdGlvbi4KKyAgICBfX1RJTUlOR19SVUxFX18gb24gJChzb3VyY2VzKSA9IHRlc3RpbmcucmVjb3JkLXRpbWUgJCh0YXJnZXQpIDsKKworICAgICMgTWFrZSBzdXJlIHRoZSBzb3VyY2VzIGdldCByZWJ1aWx0IGFueSB0aW1lIHdlIG5lZWQgdG8gcmV0cmlldmUgdGhhdAorICAgICMgaW5mb3JtYXRpb24uCisgICAgUkVCVUlMRFMgJCh0YXJnZXQpIDogJChzb3VyY2VzKSA7Cit9CisKKworYWN0aW9ucyB0aW1lCit7CisgICAgZWNobyB1c2VyOiAkKFVTRVJfVElNRSkKKyAgICBlY2hvIHN5c3RlbTogJChTWVNURU1fVElNRSkKKworICAgIGVjaG8gdXNlcjogJChVU0VSX1RJTUVfU0VDT05EUykgPiAiJCg8KSIKKyAgICBlY2hvIHN5c3RlbTogJChTWVNURU1fVElNRV9TRUNPTkRTKSA+PiAiJCg8KSIKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdGVzdGluZy5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3Rlc3RpbmcuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTFiZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3Rlc3RpbmcuamFtCkBAIC0wLDAgKzEsNTk0IEBACisjIENvcHlyaWdodCAyMDA1IERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHJlZ3Jlc3Npb24gdGVzdGluZyBmcmFtZXdvcmsuIEl0IGRlY2xhcmVzIGEgbnVtYmVyIG9mCisjIG1haW4gdGFyZ2V0IHJ1bGVzIHdoaWNoIHBlcmZvcm0gc29tZSBhY3Rpb24gYW5kLCBpZiB0aGUgcmVzdWx0cyBhcmUgT0ssCisjIGNyZWF0ZXMgYW4gb3V0cHV0IGZpbGUuCisjCisjIFRoZSBleGFjdCBsaXN0IG9mIHJ1bGVzIGlzOgorIyAnY29tcGlsZScgICAgICAgLS0gY3JlYXRlcyAudGVzdCBmaWxlIGlmIGNvbXBpbGF0aW9uIG9mIHNvdXJjZXMgd2FzCisjICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsLgorIyAnY29tcGlsZS1mYWlsJyAgLS0gY3JlYXRlcyAudGVzdCBmaWxlIGlmIGNvbXBpbGF0aW9uIG9mIHNvdXJjZXMgZmFpbGVkLgorIyAncnVuJyAgICAgICAgICAgLS0gY3JlYXRlcyAudGVzdCBmaWxlIGlzIHJ1bm5pbmcgb2YgZXhlY3V0YWJsZSBwcm9kdWNlZCBmcm9tCisjICAgICAgICAgICAgICAgICAgICBzb3VyY2VzIHdhcyBzdWNjZXNzZnVsLiBBbHNvIGxlYXZlcyBiZWhpbmQgLm91dHB1dCBmaWxlCisjICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBvdXRwdXQgZnJvbSBwcm9ncmFtIHJ1bi4KKyMgJ3J1bi1mYWlsJyAgICAgIC0tIHNhbWUgYXMgYWJvdmUsIGJ1dCAudGVzdCBmaWxlIGlzIGNyZWF0ZWQgaWYgcnVubmluZyBmYWlscy4KKyMKKyMgSW4gYWxsIGNhc2VzLCBwcmVzZW5jZSBvZiAudGVzdCBmaWxlIGlzIGFuIGluZGljYXRpb24gdGhhdCB0aGUgdGVzdCBwYXNzZWQuCisjIEZvciBtb3JlIGNvbnZlbmllbnQgcmVwb3J0aW5nLCB5b3UgbWlnaHQgd2FudCB0byB1c2UgQysrIEJvb3N0IHJlZ3Jlc3Npb24KKyMgdGVzdGluZyB1dGlsaXRpZXMgKHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy9tb3JlL3JlZ3Jlc3Npb24uaHRtbCkuCisjCisjIEZvciBoaXN0b3JpY2FsIHJlYXNvbiwgYSAndW5pdC10ZXN0JyBydWxlIGlzIGF2YWlsYWJsZSB3aGljaCBoYXMgdGhlIHNhbWUKKyMgc3ludGF4IGFzICdleGUnIGFuZCBiZWhhdmVzIGp1c3QgbGlrZSAncnVuJy4KKworIyBUaGluZ3MgdG8gZG86CisjICAtIFRlYWNoIGNvbXBpbGVyX3N0YXR1cyBoYW5kbGUgSmFtZmlsZS52Mi4KKyMgTm90ZXM6CisjICAtIDxuby13YXJuPiBpcyBub3QgaW1wbGVtZW50ZWQsIHNpbmNlIGl0IGlzIENvbW8tc3BlY2lmaWMsIGFuZCBpdCBpcyBub3QKKyMgICAgY2xlYXIgaG93IHRvIGltcGxlbWVudCBpdAorIyAgLSBzdGQ6OmxvY2FsZS1zdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZCAoaXQgaXMgdXNlZCBpbiBvbmUgdGVzdCkuCisKKworaW1wb3J0IGFsaWFzIDsKK2ltcG9ydCAiY2xhc3MiIDsKK2ltcG9ydCBjb21tb24gOworaW1wb3J0IGVycm9ycyA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgb3MgOworaW1wb3J0IHBhdGggOworaW1wb3J0IHByb2plY3QgOworaW1wb3J0IHByb3BlcnR5IDsKK2ltcG9ydCBwcm9wZXJ0eS1zZXQgOworaW1wb3J0IHJlZ2V4IDsKK2ltcG9ydCBzZXF1ZW5jZSA7CitpbXBvcnQgdGFyZ2V0cyA7CitpbXBvcnQgdG9vbHNldCA7CitpbXBvcnQgdHlwZSA7CitpbXBvcnQgdmlydHVhbC10YXJnZXQgOworCisKK3J1bGUgaW5pdCAoICkKK3sKK30KKworCisjIEZlYXR1cmUgY29udHJvbGluZyB0aGUgY29tbWFuZCB1c2VkIHRvIGxhbmNoIHRlc3QgcHJvZ3JhbXMuCitmZWF0dXJlLmZlYXR1cmUgdGVzdGluZy5sYXVuY2hlciAgIDogOiBmcmVlIG9wdGlvbmFsIDsKKworZmVhdHVyZS5mZWF0dXJlIHRlc3QtaW5mbyAgICAgICAgICA6IDogZnJlZSBpbmNpZGVudGFsIDsKK2ZlYXR1cmUuZmVhdHVyZSB0ZXN0aW5nLmFyZyAgICAgICAgOiA6IGZyZWUgaW5jaWRlbnRhbCA7CitmZWF0dXJlLmZlYXR1cmUgdGVzdGluZy5pbnB1dC1maWxlIDogOiBmcmVlIGRlcGVuZGVuY3kgOworCitmZWF0dXJlLmZlYXR1cmUgcHJlc2VydmUtdGVzdC10YXJnZXRzIDogb24gb2ZmIDogaW5jaWRlbnRhbCBwcm9wYWdhdGVkIDsKKworIyBSZWdpc3RlciB0YXJnZXQgdHlwZXMuCit0eXBlLnJlZ2lzdGVyIFRFU1QgICAgICAgICA6IHRlc3QgICAgICAgICAgOwordHlwZS5yZWdpc3RlciBDT01QSUxFICAgICAgOiAgICAgICAgOiBURVNUIDsKK3R5cGUucmVnaXN0ZXIgQ09NUElMRV9GQUlMIDogICAgICAgIDogVEVTVCA7Cit0eXBlLnJlZ2lzdGVyIFJVTl9PVVRQVVQgICA6IHJ1biAgICAgICAgICAgOwordHlwZS5yZWdpc3RlciBSVU4gICAgICAgICAgOiAgICAgICAgOiBURVNUIDsKK3R5cGUucmVnaXN0ZXIgUlVOX0ZBSUwgICAgIDogICAgICAgIDogVEVTVCA7Cit0eXBlLnJlZ2lzdGVyIExJTktfRkFJTCAgICA6ICAgICAgICA6IFRFU1QgOwordHlwZS5yZWdpc3RlciBMSU5LICAgICAgICAgOiAgICAgICAgOiBURVNUIDsKK3R5cGUucmVnaXN0ZXIgVU5JVF9URVNUICAgIDogcGFzc2VkIDogVEVTVCA7CisKKworIyBEZWNsYXJlIHRoZSBydWxlcyB3aGljaCBjcmVhdGUgbWFpbiB0YXJnZXRzLiBXaGlsZSB0aGUgJ3R5cGUnIG1vZHVsZSBhbHJlYWR5CisjIGNyZWF0ZXMgcnVsZXMgd2l0aCB0aGUgc2FtZSBuYW1lcyBmb3IgdXMsIHdlIG5lZWQgZXh0cmEgY29udmVuaWVuY2U6IGRlZmF1bHQKKyMgbmFtZSBvZiBtYWluIHRhcmdldCwgc28gd3JpdGUgb3VyIG93biB2ZXJzaW9ucy4KKworIyBIZWxwZXIgcnVsZS4gQ3JlYXRlIGEgdGVzdCB0YXJnZXQsIHVzaW5nIGJhc2VuYW1lIG9mIGZpcnN0IHNvdXJjZSBpZiBubyB0YXJnZXQKKyMgbmFtZSBpcyBleHBsaWNpdGx5IHBhc3NlZC4gUmVtZW1iZXJzIHRoZSBjcmVhdGVkIHRhcmdldCBpbiBhIGdsb2JhbCB2YXJpYWJsZS4KKyMKK3J1bGUgbWFrZS10ZXN0ICggdGFyZ2V0LXR5cGUgOiBzb3VyY2VzICsgOiByZXF1aXJlbWVudHMgKiA6IHRhcmdldC1uYW1lID8gKQoreworICAgIHRhcmdldC1uYW1lID89ICQoc291cmNlc1sxXTpEPTpTPSkgOworCisgICAgIyBIYXZpbmcgcGVyaW9kcyAoIi4iKSBpbiB0aGUgdGFyZ2V0IG5hbWUgaXMgcHJvYmxlbWF0aWMgYmVjYXVzZSB0aGUgdHlwZWQKKyAgICAjIGdlbmVyYXRvciB3aWxsIHN0cmlwIHRoZSBzdWZmaXggYW5kIHVzZSB0aGUgYmFyZSBuYW1lIGZvciB0aGUgZmlsZQorICAgICMgdGFyZ2V0cy4gRXZlbiB0aG91Z2ggdGhlIGxvY2F0aW9uLXByZWZpeCBhdmVydHMgcHJvYmxlbXMgbW9zdCB0aW1lcyBpdAorICAgICMgZG9lcyBub3QgcHJldmVudCBhbWJpZ3VpdHkgaXNzdWVzIHdoZW4gcmVmZXJyaW5nIHRvIHRoZSB0ZXN0IHRhcmdldHMuIEZvcgorICAgICMgZXhhbXBsZSB3aGVuIHVzaW5nIHRoZSBYTUwgbG9nIG91dHB1dC4gU28gd2UgcmVuYW1lIHRoZSB0YXJnZXQgdG8gcmVtb3ZlCisgICAgIyB0aGUgcGVyaW9kcywgYW5kIHByb3ZpZGUgYW4gYWxpYXMgZm9yIHVzZXJzLgorICAgIGxvY2FsIHJlYWwtbmFtZSA9IFsgcmVnZXgucmVwbGFjZSAkKHRhcmdldC1uYW1lKSAiWy5dIiAifiIgXSA7CisKKyAgICBsb2NhbCBwcm9qZWN0ID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7CisgICAgIyBUaGUgPGxvY2F0aW9uLXByZWZpeD4gZm9yY2VzIHRoZSBidWlsZCBzeXN0ZW0gZm9yIGdlbmVyYXRlIHBhdGhzIGluIHRoZQorICAgICMgZm9ybSAnJGJ1aWxkX2Rpci9hcnJheTEudGVzdC9nY2MvZGVidWcnLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdworICAgICMgcG9zdC1wcm9jZXNzaW5nIHRvb2xzIHRvIHdvcmsuCisgICAgbG9jYWwgdCA9IFsgdGFyZ2V0cy5jcmVhdGUtdHlwZWQtdGFyZ2V0IFsgdHlwZS50eXBlLWZyb20tcnVsZS1uYW1lCisgICAgICAgICQodGFyZ2V0LXR5cGUpIF0gOiAkKHByb2plY3QpIDogJChyZWFsLW5hbWUpIDogJChzb3VyY2VzKSA6CisgICAgICAgICQocmVxdWlyZW1lbnRzKSA8bG9jYXRpb24tcHJlZml4PiQocmVhbC1uYW1lKS50ZXN0IF0gOworCisgICAgIyBUaGUgYWxpYXMgdG8gdGhlIHJlYWwgdGFyZ2V0LCBwZXIgcGVyaW9kIHJlcGxhY2VtZW50IGFib3ZlLgorICAgIGlmICQocmVhbC1uYW1lKSAhPSAkKHRhcmdldC1uYW1lKQorICAgIHsKKyAgICAgICAgYWxpYXMgJCh0YXJnZXQtbmFtZSkgOiAkKHQpIDsKKyAgICB9CisKKyAgICAjIFJlbWVtYmVyIHRoZSB0ZXN0IChmb3IgLS1kdW1wLXRlc3RzKS4gQSBnb29kIHdheSB3b3VsZCBiZSB0byBjb2xsZWN0IGFsbAorICAgICMgZ2l2ZW4gYSBwcm9qZWN0LiBUaGlzIGhhcyBzb21lIHRlY2huaWNhbCBwcm9ibGVtczogZS5nLiB3ZSBjYW4gbm90IGNhbGwKKyAgICAjIHRoaXMgZHVtcCBmcm9tIGEgSmFtZmlsZSBzaW5jZSBwcm9qZWN0cyByZWZlcnJlZCBieSAnYnVpbGQtcHJvamVjdCcgYXJlCisgICAgIyBub3QgYXZhaWxhYmxlIHVudGlsIHRoZSB3aG9sZSBKYW1maWxlIGhhcyBiZWVuIGxvYWRlZC4KKyAgICAuYWxsLXRlc3RzICs9ICQodCkgOworICAgIHJldHVybiAkKHQpIDsKK30KKworCisjIE5vdGU6IHBhc3NpbmcgbW9yZSB0aGF0IG9uZSBjcHAgZmlsZSBoZXJlIGlzIGtub3duIHRvIGZhaWwuIFBhc3NpbmcgYSBjcHAgZmlsZQorIyBhbmQgYSBsaWJyYXJ5IHRhcmdldCB3b3Jrcy4KKyMKK3J1bGUgY29tcGlsZSAoIHNvdXJjZXMgKyA6IHJlcXVpcmVtZW50cyAqIDogdGFyZ2V0LW5hbWUgPyApCit7CisgICAgcmV0dXJuIFsgbWFrZS10ZXN0IGNvbXBpbGUgOiAkKHNvdXJjZXMpIDogJChyZXF1aXJlbWVudHMpIDogJCh0YXJnZXQtbmFtZSkgXQorICAgICAgICA7Cit9CisKKworcnVsZSBjb21waWxlLWZhaWwgKCBzb3VyY2VzICsgOiByZXF1aXJlbWVudHMgKiA6IHRhcmdldC1uYW1lID8gKQoreworICAgIHJldHVybiBbIG1ha2UtdGVzdCBjb21waWxlLWZhaWwgOiAkKHNvdXJjZXMpIDogJChyZXF1aXJlbWVudHMpIDoKKyAgICAgICAgJCh0YXJnZXQtbmFtZSkgXSA7Cit9CisKKworcnVsZSBsaW5rICggc291cmNlcyArIDogcmVxdWlyZW1lbnRzICogOiB0YXJnZXQtbmFtZSA/ICkKK3sKKyAgICByZXR1cm4gWyBtYWtlLXRlc3QgbGluayA6ICQoc291cmNlcykgOiAkKHJlcXVpcmVtZW50cykgOiAkKHRhcmdldC1uYW1lKSBdIDsKK30KKworCitydWxlIGxpbmstZmFpbCAoIHNvdXJjZXMgKyA6IHJlcXVpcmVtZW50cyAqIDogdGFyZ2V0LW5hbWUgPyApCit7CisgICAgcmV0dXJuIFsgbWFrZS10ZXN0IGxpbmstZmFpbCA6ICQoc291cmNlcykgOiAkKHJlcXVpcmVtZW50cykgOiAkKHRhcmdldC1uYW1lKQorICAgICAgICBdIDsKK30KKworCitydWxlIGhhbmRsZS1pbnB1dC1maWxlcyAoIGlucHV0LWZpbGVzICogKQoreworICAgIGlmICQoaW5wdXQtZmlsZXNbMl0pCisgICAgeworICAgICAgICAjIENoZWNrIHRoYXQgc29ydGluZyBtYWRlIHdoZW4gY3JlYXRpbmcgcHJvcGVydHktc2V0IGluc3RhbmNlIHdpbGwgbm90CisgICAgICAgICMgY2hhbmdlIHRoZSBvcmRlcmluZy4KKyAgICAgICAgaWYgWyBzZXF1ZW5jZS5pbnNlcnRpb24tc29ydCAkKGlucHV0LWZpbGVzKSBdICE9ICQoaW5wdXQtZmlsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9ycy51c2VyLWVycm9yICJOYW1lcyBvZiBpbnB1dCBmaWxlcyBtdXN0IGJlIHNvcnRlZCBhbHBoYWJldGljYWxseSIKKyAgICAgICAgICAgICAgICA6ICJkdWUgdG8gaW50ZXJuYWwgbGltaXRhdGlvbnMiIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gPHRlc3RpbmcuaW5wdXQtZmlsZT4kKGlucHV0LWZpbGVzKSA7Cit9CisKKworcnVsZSBydW4gKCBzb3VyY2VzICsgOiBhcmdzICogOiBpbnB1dC1maWxlcyAqIDogcmVxdWlyZW1lbnRzICogOiB0YXJnZXQtbmFtZSA/IDoKKyAgICBkZWZhdWx0LWJ1aWxkICogKQoreworICAgIHJlcXVpcmVtZW50cyArPSA8dGVzdGluZy5hcmc+JChhcmdzOko9IiAiKSA7CisgICAgcmVxdWlyZW1lbnRzICs9IFsgaGFuZGxlLWlucHV0LWZpbGVzICQoaW5wdXQtZmlsZXMpIF0gOworICAgIHJldHVybiBbIG1ha2UtdGVzdCBydW4gOiAkKHNvdXJjZXMpIDogJChyZXF1aXJlbWVudHMpIDogJCh0YXJnZXQtbmFtZSkgXSA7Cit9CisKKworcnVsZSBydW4tZmFpbCAoIHNvdXJjZXMgKyA6IGFyZ3MgKiA6IGlucHV0LWZpbGVzICogOiByZXF1aXJlbWVudHMgKiA6CisgICAgdGFyZ2V0LW5hbWUgPyA6IGRlZmF1bHQtYnVpbGQgKiApCit7CisgICAgcmVxdWlyZW1lbnRzICs9IDx0ZXN0aW5nLmFyZz4kKGFyZ3M6Sj0iICIpIDsKKyAgICByZXF1aXJlbWVudHMgKz0gWyBoYW5kbGUtaW5wdXQtZmlsZXMgJChpbnB1dC1maWxlcykgXSA7CisgICAgcmV0dXJuIFsgbWFrZS10ZXN0IHJ1bi1mYWlsIDogJChzb3VyY2VzKSA6ICQocmVxdWlyZW1lbnRzKSA6ICQodGFyZ2V0LW5hbWUpCisgICAgICAgIF0gOworfQorCisKKyMgVXNlICd0ZXN0LXN1aXRlJyBhcyBhIHN5bm9ueW0gZm9yICdhbGlhcycsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorSU1QT1JUIDogYWxpYXMgOiA6IHRlc3Qtc3VpdGUgOworCisKKyMgRm9yIGFsbCBtYWluIHRhcmdldHMgaW4gJ3Byb2plY3QtbW9kdWxlJywgd2hpY2ggYXJlIHR5cGVkIHRhcmdldHMgd2l0aCB0eXBlCisjIGRlcml2ZWQgZnJvbSAnVEVTVCcsIHByb2R1Y2Ugc29tZSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbi4KKyMKK3J1bGUgZHVtcC10ZXN0cworeworICAgIGZvciBsb2NhbCB0IGluICQoLmFsbC10ZXN0cykKKyAgICB7CisgICAgICAgIGR1bXAtdGVzdCAkKHQpIDsKKyAgICB9Cit9CisKKworIyBHaXZlbiBhIHByb2plY3QgbG9jYXRpb24gaW4gbm9ybWFsaXplZCBmb3JtIChzbGFzaGVzIGFyZSBmb3J3YXJkKSwgY29tcHV0ZSB0aGUKKyMgbmFtZSBvZiB0aGUgQm9vc3QgbGlicmFyeS4KKyMKK2xvY2FsIHJ1bGUgZ2V0LWxpYnJhcnktbmFtZSAoIHBhdGggKQoreworICAgICMgUGF0aCBpcyBpbiBub3JtYWxpemVkIGZvcm0sIHNvIGFsbCBzbGFzaGVzIGFyZSBmb3J3YXJkLgorICAgIGxvY2FsIG1hdGNoMSA9IFsgTUFUQ0ggLyh0b29sc3xsaWJzKS8oLiopLyh0ZXN0fGV4YW1wbGUpIDogJChwYXRoKSBdIDsKKyAgICBsb2NhbCBtYXRjaDIgPSBbIE1BVENIIC8odG9vbHN8bGlicykvKC4qKSQgOiAkKHBhdGgpIF0gOworICAgIGxvY2FsIG1hdGNoMyA9IFsgTUFUQ0ggKC9zdGF0dXMkKSA6ICQocGF0aCkgXSA7CisKKyAgICBpZiAkKG1hdGNoMSkgeyByZXR1cm4gJChtYXRjaDFbMl0pIDsgfQorICAgIGVsc2UgaWYgJChtYXRjaDIpIHsgcmV0dXJuICQobWF0Y2gyWzJdKSA7IH0KKyAgICBlbHNlIGlmICQobWF0Y2gzKSB7IHJldHVybiAiIiA7IH0KKyAgICBlbHNlIGlmIC0tZHVtcC10ZXN0cyBpbiBbIG1vZHVsZXMucGVlayA6IEFSR1YgXQorICAgIHsKKyAgICAgICAgIyBUaGUgJ3J1bicgcnVsZSBhbmQgb3RoZXJzIG1pZ2h0IGJlIHVzZWQgb3V0c2lkZSBib29zdC4gSW4gdGhhdCBjYXNlLAorICAgICAgICAjIGp1c3QgcmV0dXJuIHRoZSBwYXRoLCBzaW5jZSB0aGUgJ2xpYnJhcnkgbmFtZScgbWFrZXMgbm8gc2Vuc2UuCisgICAgICAgIHJldHVybiAkKHBhdGgpIDsKKyAgICB9Cit9CisKKworIyBXYXMgYW4gWE1MIGR1bXAgcmVxdWVzdGVkPworLm91dC14bWwgPSBbIE1BVENIIC0tb3V0LXhtbD0oLiopIDogWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0gXSA7CisKKworIyBUYWtlcyBhIHRhcmdldCAoaW5zdGFuY2Ugb2YgJ2Jhc2ljLXRhcmdldCcpIGFuZCBwcmludHMKKyMgICAtIGl0cyB0eXBlCisjICAgLSBpdHMgbmFtZQorIyAgIC0gY29tbWVudHMgc3BlY2lmaWVkIHZpYSB0aGUgPHRlc3QtaW5mbz4gcHJvcGVydHkKKyMgICAtIHJlbGF0aXZlIGxvY2F0aW9uIG9mIGFsbCBzb3VyY2UgZnJvbSB0aGUgcHJvamVjdCByb290LgorIworcnVsZSBkdW1wLXRlc3QgKCB0YXJnZXQgKQoreworICAgIGxvY2FsIHR5cGUgPSBbICQodGFyZ2V0KS50eXBlIF0gOworICAgIGxvY2FsIG5hbWUgPSBbICQodGFyZ2V0KS5uYW1lIF0gOworICAgIGxvY2FsIHByb2plY3QgPSBbICQodGFyZ2V0KS5wcm9qZWN0IF0gOworCisgICAgbG9jYWwgcHJvamVjdC1yb290ID0gWyAkKHByb2plY3QpLmdldCBwcm9qZWN0LXJvb3QgXSA7CisgICAgbG9jYWwgbGlicmFyeSA9IFsgZ2V0LWxpYnJhcnktbmFtZSBbIHBhdGgucm9vdCBbICQocHJvamVjdCkuZ2V0IGxvY2F0aW9uIF0KKyAgICAgICAgWyBwYXRoLnB3ZCBdIF0gXSA7CisgICAgaWYgJChsaWJyYXJ5KQorICAgIHsKKyAgICAgICAgbmFtZSA9ICQobGlicmFyeSkvJChuYW1lKSA7CisgICAgfQorCisgICAgbG9jYWwgc291cmNlcyA9IFsgJCh0YXJnZXQpLnNvdXJjZXMgXSA7CisgICAgbG9jYWwgc291cmNlLWZpbGVzIDsKKyAgICBmb3IgbG9jYWwgcyBpbiAkKHNvdXJjZXMpCisgICAgeworICAgICAgICBpZiBbIGNsYXNzLmlzLWEgJChzKSA6IGZpbGUtcmVmZXJlbmNlIF0KKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgbG9jYXRpb24gPSBbIHBhdGgucm9vdCBbIHBhdGgucm9vdCBbICQocykubmFtZSBdCisgICAgICAgICAgICAgICAgWyAkKHMpLmxvY2F0aW9uIF0gXSBbIHBhdGgucHdkIF0gXSA7CisKKyAgICAgICAgICAgIHNvdXJjZS1maWxlcyArPSBbIHBhdGgucmVsYXRpdmUtdG8gWyBwYXRoLnJvb3QgJChwcm9qZWN0LXJvb3QpCisgICAgICAgICAgICAgICAgWyBwYXRoLnB3ZCBdIF0gJChsb2NhdGlvbikgXSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsb2NhbCB0YXJnZXQtbmFtZSA9IFsgJChwcm9qZWN0KS5nZXQgbG9jYXRpb24gXSAvLyBbICQodGFyZ2V0KS5uYW1lIF0gLnRlc3QKKyAgICAgICAgOworICAgIHRhcmdldC1uYW1lID0gJCh0YXJnZXQtbmFtZTpKPSkgOworCisgICAgbG9jYWwgciA9IFsgJCh0YXJnZXQpLnJlcXVpcmVtZW50cyBdIDsKKyAgICAjIEV4dHJhY3QgdmFsdWVzIG9mIHRoZSA8dGVzdC1pbmZvPiBmZWF0dXJlLgorICAgIGxvY2FsIHRlc3QtaW5mbyA9IFsgJChyKS5nZXQgPHRlc3QtaW5mbz4gXSA7CisKKyAgICAjIElmIHRoZSB1c2VyIHJlcXVlc3RlZCBYTUwgb3V0cHV0IG9uIHRoZSBjb21tYW5kLWxpbmUsIGFkZCB0aGUgdGVzdCBpbmZvIHRvCisgICAgIyB0aGF0IFhNTCBmaWxlIHJhdGhlciB0aGFuIGR1bXBpbmcgdGhlbSB0byBzdGRvdXQuCisgICAgaWYgJCgub3V0LXhtbCkKKyAgICB7CisgICAgICAgIGxvY2FsIG5sID0gIgorIiA7CisgICAgICAgIC5jb250ZW50cyBvbiAkKC5vdXQteG1sKSArPQorICAgICAgICAgICAgIiQobmwpICA8dGVzdCB0eXBlPVwiJCh0eXBlKVwiIG5hbWU9XCIkKG5hbWUpXCI+IgorICAgICAgICAgICAgIiQobmwpICAgIDx0YXJnZXQ+PCFbQ0RBVEFbJCh0YXJnZXQtbmFtZSldXT48L3RhcmdldD4iCisgICAgICAgICAgICAiJChubCkgICAgPGluZm8+PCFbQ0RBVEFbJCh0ZXN0LWluZm8pXV0+PC9pbmZvPiIKKyAgICAgICAgICAgICIkKG5sKSAgICA8c291cmNlPjwhW0NEQVRBWyQoc291cmNlLWZpbGVzKV1dPjwvc291cmNlPiIKKyAgICAgICAgICAgICIkKG5sKSAgPC90ZXN0PiIKKyAgICAgICAgICAgIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgIyBGb3JtYXQgdGhlbSBpbnRvIGEgc2luZ2xlIHN0cmluZyBvZiBxdW90ZWQgc3RyaW5ncy4KKyAgICAgICAgdGVzdC1pbmZvID0gXCIkKHRlc3QtaW5mbzpKPVwiXCBcIilcIiA7CisKKyAgICAgICAgRUNITyBib29zdC10ZXN0KCQodHlwZSkpIFwiJChuYW1lKVwiIFskKHRlc3QtaW5mbyldICI6IgorICAgICAgICAgICAgXCIkKHNvdXJjZS1maWxlcylcIiA7CisgICAgfQorfQorCisKKyMgUmVnaXN0ZXIgZ2VuZXJhdG9ycy4gRGVwZW5kaW5nIG9uIHRhcmdldCB0eXBlLCBlaXRoZXIgJ2V4cGVjdC1zdWNjZXNzJyBvcgorIyAnZXhwZWN0LWZhaWx1cmUnIHJ1bGUgd2lsbCBiZSB1c2VkLgorZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCB0ZXN0aW5nLmV4cGVjdC1zdWNjZXNzIDogT0JKICAgICAgICA6IENPTVBJTEUgICAgICA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIHRlc3RpbmcuZXhwZWN0LWZhaWx1cmUgOiBPQkogICAgICAgIDogQ09NUElMRV9GQUlMIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXItc3RhbmRhcmQgdGVzdGluZy5leHBlY3Qtc3VjY2VzcyA6IFJVTl9PVVRQVVQgOiBSVU4gICAgICAgICAgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCB0ZXN0aW5nLmV4cGVjdC1mYWlsdXJlIDogUlVOX09VVFBVVCA6IFJVTl9GQUlMICAgICA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIHRlc3RpbmcuZXhwZWN0LWZhaWx1cmUgOiBFWEUgICAgICAgIDogTElOS19GQUlMICAgIDsKK2dlbmVyYXRvcnMucmVnaXN0ZXItc3RhbmRhcmQgdGVzdGluZy5leHBlY3Qtc3VjY2VzcyA6IEVYRSAgICAgICAgOiBMSU5LICAgICAgICAgOworCisjIEdlbmVyYXRvciB3aGljaCBydW5zIGFuIEVYRSBhbmQgY2FwdHVyZXMgb3V0cHV0LgorZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCB0ZXN0aW5nLmNhcHR1cmUtb3V0cHV0IDogRVhFIDogUlVOX09VVFBVVCA7CisKKyMgR2VuZXJhdG9yIHdoaWNoIGNyZWF0ZXMgYSB0YXJnZXQgaWYgc291cmNlcyBydW4gc3VjY2Vzc2Z1bGx5LiBEaWZmZXJzIGZyb20gUlVOCisjIGluIHRoYXQgcnVuIG91dHB1dCBpcyBub3QgY2FwdHVyZWQuIFRoZSByZWFzb24gd2h5IGl0IGV4aXN0cyBpcyB0aGF0IHRoZSAncnVuJworIyBydWxlIGlzIG11Y2ggYmV0dGVyIGZvciBhdXRvbWF0ZWQgdGVzdGluZywgYnV0IGlzIG5vdCB1c2VyLWZyaWVuZGx5IChzZWUKKyMgaHR0cDovL2FydGljbGUuZ21hbmUub3JnL2dtYW5lLmNvbXAubGliLmJvb3N0LmJ1aWxkLzYzNTMpLgorZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCB0ZXN0aW5nLnVuaXQtdGVzdCA6IEVYRSA6IFVOSVRfVEVTVCA7CisKKworIyBUaGUgYWN0aW9uIHJ1bGVzIGNhbGxlZCBieSBnZW5lcmF0b3JzLgorCisjIENhdXNlcyB0aGUgJ3RhcmdldCcgdG8gZXhpc3QgYWZ0ZXIgYmphbSBpbnZvY2F0aW9uIGlmIGFuZCBvbmx5IGlmIGFsbCB0aGUKKyMgZGVwZW5kZW5jaWVzIHdlcmUgc3VjY2Vzc2Z1bGx5IGJ1aWx0LgorIworcnVsZSBleHBlY3Qtc3VjY2VzcyAoIHRhcmdldCA6IGRlcGVuZGVuY3kgKyA6IHJlcXVpcmVtZW50cyAqICkKK3sKKyAgICAqKnBhc3NlZCoqICQodGFyZ2V0KSA6ICQoc291cmNlcykgOworfQorCisKKyMgQ2F1c2VzIHRoZSAndGFyZ2V0JyB0byBleGlzdCBhZnRlciBiamFtIGludm9jYXRpb24gaWYgYW5kIG9ubHkgaWYgYWxsIHNvbWUgb2YKKyMgdGhlIGRlcGVuZGVuY2llcyB3ZXJlIG5vdCBzdWNjZXNzZnVsbHkgYnVpbHQuCisjCitydWxlIGV4cGVjdC1mYWlsdXJlICggdGFyZ2V0IDogZGVwZW5kZW5jeSArIDogcHJvcGVydGllcyAqICkKK3sKKyAgICBsb2NhbCBncmlzdCA9IFsgTUFUQ0ggXjwoLiopPiA6ICQoZGVwZW5kZW5jeTpHKSBdIDsKKyAgICBsb2NhbCBtYXJrZXIgPSAkKGRlcGVuZGVuY3k6Rz0kKGdyaXN0KSpmYWlsKSA7CisgICAgKGZhaWxlZC1hcy1leHBlY3RlZCkgJChtYXJrZXIpIDsKKyAgICBGQUlMX0VYUEVDVEVEICQoZGVwZW5kZW5jeSkgOworICAgIExPQ0FURSBvbiAkKG1hcmtlcikgPSBbIG9uICQoZGVwZW5kZW5jeSkgcmV0dXJuICQoTE9DQVRFKSBdIDsKKyAgICBSTU9MRCAkKG1hcmtlcikgOworICAgIERFUEVORFMgJChtYXJrZXIpIDogJChkZXBlbmRlbmN5KSA7CisgICAgREVQRU5EUyAkKHRhcmdldCkgOiAkKG1hcmtlcikgOworICAgICoqcGFzc2VkKiogJCh0YXJnZXQpIDogJChtYXJrZXIpIDsKK30KKworCisjIFRoZSBydWxlL2FjdGlvbiBjb21iaW5hdGlvbiB1c2VkIHRvIHJlcG9ydCBzdWNjZXNzZnVsIHBhc3Npbmcgb2YgYSB0ZXN0LgorIworcnVsZSAqKnBhc3NlZCoqCit7CisgICAgIyBEdW1wIGFsbCB0aGUgdGVzdHMsIGlmIG5lZWRlZC4gV2UgZG8gaXQgaGVyZSwgc2luY2UgZHVtcCBzaG91bGQgaGFwcGVuCisgICAgIyBvbmx5IGFmdGVyIGFsbCBKYW1maWxlcyBoYXZlIGJlZW4gcmVhZCwgYW5kIHRoZXJlIGlzIG5vIHN1Y2ggcGxhY2UKKyAgICAjIGN1cnJlbnRseSBkZWZpbmVkIChidXQgdGhlcmUgc2hvdWxkIGJlKS4KKyAgICBpZiAhICQoLmR1bXBlZC10ZXN0cykgJiYgKCAtLWR1bXAtdGVzdHMgaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0gKQorICAgIHsKKyAgICAgICAgLmR1bXBlZC10ZXN0cyA9IHRydWUgOworICAgICAgICBkdW1wLXRlc3RzIDsKKyAgICB9CisKKyAgICAjIEZvcmNlIGRlbGV0aW9uIG9mIHRoZSB0YXJnZXQsIGluIGNhc2UgYW55IGRlcGVuZGVuY2llcyBmYWlsZWQgdG8gYnVpbGQuCisgICAgUk1PTEQgJCg8KSA7Cit9CisKKworIyBVc2VkIHRvIGNyZWF0ZSB0ZXN0IGZpbGVzIHNpZ25pZnlpbmcgcGFzc2VkIHRlc3RzLgorIworYWN0aW9ucyAqKnBhc3NlZCoqCit7CisgICAgZWNobyBwYXNzZWQgPiAiJCg8KSIKK30KKworCisjIFVzZWQgdG8gY3JlYXRlIHJlcGxhY2VtZW50IG9iamVjdCBmaWxlcyB0aGF0IGRvIG5vdCBnZXQgY3JlYXRlZCBkdXJpbmcgdGVzdHMKKyMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gZmFpbC4KKyMKK2FjdGlvbnMgKGZhaWxlZC1hcy1leHBlY3RlZCkKK3sKKyAgICBlY2hvIGZhaWxlZCBhcyBleHBlY3RlZCA+ICIkKDwpIgorfQorCisKK3J1bGUgcnVuLXBhdGgtc2V0dXAgKCB0YXJnZXQgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICogKQoreworICAgICMgRm9yIHRlc3RpbmcsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIGR5bmFtaWMgbGlicmFyaWVzIG5lZWRlZCBieSB0aGUKKyAgICAjIHRlc3QgYXJlIGZvdW5kLiBTbywgd2UgY29sbGVjdCBhbGwgcGF0aHMgZnJvbSBkZXBlbmRlbmN5IGxpYnJhcmllcyAodmlhCisgICAgIyB4ZGxsLXBhdGggcHJvcGVydHkpIGFuZCBhZGQgd2hhdGV2ZXIgZXhwbGljaXQgZGxsLXBhdGggdXNlciBoYXMgc3BlY2lmaWVkLgorICAgICMgVGhlIHJlc3VsdGluZyBwYXRocyBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50IG9uIGVhY2ggdGVzdCBpbnZvY2F0aW9uLgorICAgIGxvY2FsIGRsbC1wYXRocyA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxkbGwtcGF0aD4gOiAkKHByb3BlcnRpZXMpIF0gOworICAgIGRsbC1wYXRocyArPSBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8eGRsbC1wYXRoPiA6ICQocHJvcGVydGllcykgXSA7CisgICAgZGxsLXBhdGhzICs9IFsgb24gJChzb3VyY2UpIHJldHVybiAkKFJVTl9QQVRIKSBdIDsKKyAgICBkbGwtcGF0aHMgPSBbIHNlcXVlbmNlLnVuaXF1ZSAkKGRsbC1wYXRocykgXSA7CisgICAgaWYgJChkbGwtcGF0aHMpCisgICAgeworICAgICAgICBkbGwtcGF0aHMgPSBbIHNlcXVlbmNlLnRyYW5zZm9ybSBwYXRoLm5hdGl2ZSA6ICQoZGxsLXBhdGhzKSBdIDsKKyAgICAgICAgUEFUSF9TRVRVUCBvbiAkKHRhcmdldCkgPSBbIGNvbW1vbi5wcmVwZW5kLXBhdGgtdmFyaWFibGUtY29tbWFuZAorICAgICAgICAgICAgWyBvcy5zaGFyZWQtbGlicmFyeS1wYXRoLXZhcmlhYmxlIF0gOiAkKGRsbC1wYXRocykgXSA7CisgICAgfQorfQorCisKK2xvY2FsIGFyZ3YgPSBbIG1vZHVsZXMucGVlayA6IEFSR1YgXSA7CisKK3Rvb2xzZXQuZmxhZ3MgdGVzdGluZy5jYXB0dXJlLW91dHB1dCBBUkdTIDx0ZXN0aW5nLmFyZz4gOwordG9vbHNldC5mbGFncyB0ZXN0aW5nLmNhcHR1cmUtb3V0cHV0IElOUFVUX0ZJTEVTIDx0ZXN0aW5nLmlucHV0LWZpbGU+IDsKK3Rvb2xzZXQuZmxhZ3MgdGVzdGluZy5jYXB0dXJlLW91dHB1dCBMQVVOQ0hFUiA8dGVzdGluZy5sYXVuY2hlcj4gOworCisKKyMgUnVucyBleGVjdXRhYmxlICdzb3VyY2VzJyBhbmQgc3RvcmVzIHN0ZG91dCBpbiBmaWxlICd0YXJnZXQnLiBVbmxlc3MKKyMgLS1wcmVzZXJ2ZS10ZXN0LXRhcmdldHMgY29tbWFuZCBsaW5lIG9wdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlbW92ZXMgdGhlCisjIGV4ZWN1dGFibGUuIFRoZSAndGFyZ2V0LXRvLXJlbW92ZScgcGFyYW1ldGVyIGNvbnRyb2xzIHdoYXQgc2hvdWxkIGJlIHJlbW92ZWQ6CisjICAgLSBpZiAnbm9uZScsIGRvZXMgbm90IHJlbW92ZSBhbnl0aGluZywgZXZlcgorIyAgIC0gaWYgZW1wdHksIHJlbW92ZXMgJ3NvdXJjZScKKyMgICAtIGlmIG5vbi1lbXB0eSBhbmQgbm90ICdub25lJywgY29udGFpbnMgYSBsaXN0IG9mIHNvdXJjZXMgdG8gcmVtb3ZlLgorIworcnVsZSBjYXB0dXJlLW91dHB1dCAoIHRhcmdldCA6IHNvdXJjZSA6IHByb3BlcnRpZXMgKiA6IHRhcmdldHMtdG8tcmVtb3ZlICogKQoreworICAgIG91dHB1dC1maWxlIG9uICQodGFyZ2V0KSA9ICQodGFyZ2V0OlM9Lm91dHB1dCkgOworICAgIExPQ0FURSBvbiAkKHRhcmdldDpTPS5vdXRwdXQpID0gWyBvbiAkKHRhcmdldCkgcmV0dXJuICQoTE9DQVRFKSBdIDsKKworICAgICMgVGhlIElOQ0xVREVTIGtpbGwgYSB3YXJuaW5nIGFib3V0IGluZGVwZW5kZW50IHRhcmdldC4uLgorICAgIElOQ0xVREVTICQodGFyZ2V0KSA6ICQodGFyZ2V0OlM9Lm91dHB1dCkgOworICAgICMgYnV0IGl0IGFsc28gcHV0cyAub3V0cHV0IGludG8gZGVwZW5kZW5jeSBncmFwaCwgc28gd2UgbXVzdCB0ZWxsIGphbSBpdCBpcworICAgICMgT0sgaWYgaXQgY2Fubm90IGZpbmQgdGhlIHRhcmdldCBvciB1cGRhdGluZyBydWxlLgorICAgIE5PQ0FSRSAkKHRhcmdldDpTPS5vdXRwdXQpIDsKKworICAgICMgVGhpcyBoYXMgdHdvLWZvbGQgZWZmZWN0LiBGaXJzdCBpdCBhZGRzIGlucHV0IGZpbGVzIHRvIHRoZSBkZXBlbmRlbmRlbmN5CisgICAgIyBncmFwaCwgcHJldmVudGluZyBhIHdhcm5pbmcuIFNlY29uZCwgaXQgY2F1c2VzIGlucHV0IGZpbGVzIHRvIGJlIGJvdW5kCisgICAgIyBiZWZvcmUgdGFyZ2V0IGlzIGNyZWF0ZWQuIFRoZXJlZm9yZSwgdGhleSBhcmUgYm91bmQgdXNpbmcgU0VBUkNIIHNldHRpbmcKKyAgICAjIG9uIHRoZW0gYW5kIG5vdCBMT0NBVEUgc2V0dGluZyBvZiAkKHRhcmdldCksIGFzIGluIG90aGVyIGNhc2UgKGR1ZSB0byBqYW0KKyAgICAjIGJ1ZykuCisgICAgREVQRU5EUyAkKHRhcmdldCkgOiBbIG9uICQodGFyZ2V0KSByZXR1cm4gJChJTlBVVF9GSUxFUykgXSA7CisKKyAgICBpZiAkKHRhcmdldHMtdG8tcmVtb3ZlKSA9IG5vbmUKKyAgICB7CisgICAgICAgIHRhcmdldHMtdG8tcmVtb3ZlID0gOworICAgIH0KKyAgICBlbHNlIGlmICEgJCh0YXJnZXRzLXRvLXJlbW92ZSkKKyAgICB7CisgICAgICAgIHRhcmdldHMtdG8tcmVtb3ZlID0gJChzb3VyY2UpIDsKKyAgICB9CisKKyAgICBydW4tcGF0aC1zZXR1cCAkKHRhcmdldCkgOiAkKHNvdXJjZSkgOiAkKHByb3BlcnRpZXMpIDsKKworICAgIGlmIFsgZmVhdHVyZS5nZXQtdmFsdWVzIHByZXNlcnZlLXRlc3QtdGFyZ2V0cyA6ICQocHJvcGVydGllcykgXSA9IG9mZgorICAgIHsKKyAgICAgICAgVEVNUE9SQVJZICQodGFyZ2V0cy10by1yZW1vdmUpIDsKKyAgICAgICAgIyBTZXQgYSBzZWNvbmQgYWN0aW9uIG9uIHRhcmdldCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgY2FwdHVyZQorICAgICAgICAjIG91dHB1dCBhY3Rpb24uIFRoZSAnUm1UZW1wcycgcnVsZSBoYXMgdGhlICdpZ25vcmUnIG1vZGlmaWVyIHNvIGl0IGlzCisgICAgICAgICMgYWx3YXlzIGNvbnNpZGVyZWQgc3VjY2VlZGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgJ3J1bi1mYWlsJyB0ZXN0LiBGb3IKKyAgICAgICAgIyB0aGF0IHRlc3QgdGhlIHRhcmdldCB3aWxsIGJlIG1hcmtlZCB3aXRoIEZBSUxfRVhQRUNURUQsIGFuZCB3aXRob3V0CisgICAgICAgICMgJ2lnbm9yZScgc3VjY2Vzc2Z1bCBleGVjdXRpb24gd2lsbCBiZSBuZWdhdGVkIGFuZCBiZSByZXBvcnRlZCBhcworICAgICAgICAjIGZhaWx1cmUuIFdpdGggJ2lnbm9yZScgd2UgZG8gbm90IGRldGVjdCBhIGNhc2Ugd2hlcmUgcmVtb3ZpbmcgZmlsZXMKKyAgICAgICAgIyBmYWlscywgYnV0IGl0IGlzIG5vdCBsaWtlbHkgdG8gaGFwcGVuLgorICAgICAgICBSbVRlbXBzICQodGFyZ2V0KSA6ICQodGFyZ2V0cy10by1yZW1vdmUpIDsKKyAgICB9Cit9CisKKworaWYgWyBvcy5uYW1lIF0gPSBOVAoreworICAgIC5TVEFUVVMgICAgICAgID0gJXN0YXR1cyUgOworICAgIC5TRVRfU1RBVFVTICAgID0gInNldCBzdGF0dXM9JUVSUk9STEVWRUwlIiA7CisgICAgLlJVTl9PVVRQVVRfTkwgPSAiZWNoby4iIDsKKyAgICAuU1RBVFVTXzAgICAgICA9ICIlc3RhdHVzJSBFUVUgMCAoIiA7CisgICAgLlNUQVRVU19OT1RfMCAgPSAiJXN0YXR1cyUgTkVRIDAgKCIgOworICAgIC5WRVJCT1NFICAgICAgID0gIiV2ZXJib3NlJSBFUVUgMSAoIiA7CisgICAgLkVORElGICAgICAgICAgPSAiKSIgOworICAgIC5TSEVMTF9TRVQgICAgID0gInNldCAiIDsKKyAgICAuQ0FURU5BVEUgICAgICA9IHR5cGUgOworICAgIC5DUCAgICAgICAgICAgID0gY29weSA7Cit9CitlbHNlCit7CisgICAgLlNUQVRVUyAgICAgICAgPSAiJHN0YXR1cyIgOworICAgIC5TRVRfU1RBVFVTICAgID0gInN0YXR1cz0kPyIgOworICAgIC5SVU5fT1VUUFVUX05MID0gImVjaG8iIDsKKyAgICAuU1RBVFVTXzAgICAgICA9ICJ0ZXN0ICRzdGF0dXMgLWVxIDAgOyB0aGVuIiA7CisgICAgLlNUQVRVU19OT1RfMCAgPSAidGVzdCAkc3RhdHVzIC1uZSAwIDsgdGhlbiIgOworICAgIC5WRVJCT1NFICAgICAgID0gInRlc3QgJHZlcmJvc2UgLWVxIDEgOyB0aGVuIiA7CisgICAgLkVORElGICAgICAgICAgPSAiZmkiIDsKKyAgICAuU0hFTExfU0VUICAgICA9ICIiIDsKKyAgICAuQ0FURU5BVEUgICAgICA9IGNhdCA7CisgICAgLkNQICAgICAgICAgICAgPSBjcCA7Cit9CisKKworLlZFUkJPU0VfVEVTVCA9IDAgOworaWYgLS12ZXJib3NlLXRlc3QgaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0KK3sKKyAgICAuVkVSQk9TRV9URVNUID0gMSA7Cit9CisKKworLlJNID0gWyBjb21tb24ucm0tY29tbWFuZCBdIDsKKworCithY3Rpb25zIGNhcHR1cmUtb3V0cHV0IGJpbmQgSU5QVVRfRklMRVMgb3V0cHV0LWZpbGUKK3sKKyAgICAkKFBBVEhfU0VUVVApCisgICAgJChMQVVOQ0hFUikgIiQoPikiICQoQVJHUykgIiQoSU5QVVRfRklMRVMpIiA+ICIkKG91dHB1dC1maWxlKSIgMj4mMQorICAgICQoLlNFVF9TVEFUVVMpCisgICAgJCguUlVOX09VVFBVVF9OTCkgPj4gIiQob3V0cHV0LWZpbGUpIgorICAgIGVjaG8gRVhJVCBTVEFUVVM6ICQoLlNUQVRVUykgPj4gIiQob3V0cHV0LWZpbGUpIgorICAgIGlmICQoLlNUQVRVU18wKQorICAgICAgICAkKC5DUCkgIiQob3V0cHV0LWZpbGUpIiAiJCg8KSIKKyAgICAkKC5FTkRJRikKKyAgICAkKC5TSEVMTF9TRVQpdmVyYm9zZT0kKC5WRVJCT1NFX1RFU1QpCisgICAgaWYgJCguU1RBVFVTX05PVF8wKQorICAgICAgICAkKC5TSEVMTF9TRVQpdmVyYm9zZT0xCisgICAgJCguRU5ESUYpCisgICAgaWYgJCguVkVSQk9TRSkKKyAgICAgICAgZWNobyA9PT09PT0gQkVHSU4gT1VUUFVUID09PT09PQorICAgICAgICAkKC5DQVRFTkFURSkgIiQob3V0cHV0LWZpbGUpIgorICAgICAgICBlY2hvID09PT09PSBFTkQgT1VUUFVUID09PT09PQorICAgICQoLkVORElGKQorICAgIGV4aXQgJCguU1RBVFVTKQorfQorCisKK2FjdGlvbnMgcXVpZXRseSB1cGRhdGVkIGlnbm9yZSBwaWVjZW1lYWwgdG9nZXRoZXIgUm1UZW1wcworeworICAgICQoLlJNKSAiJCg+KSIKK30KKworCisuTUFLRV9GSUxFID0gWyBjb21tb24uZmlsZS1jcmVhdGlvbi1jb21tYW5kIF0gOworCit0b29sc2V0LmZsYWdzIHRlc3RpbmcudW5pdC10ZXN0IExBVU5DSEVSIDx0ZXN0aW5nLmxhdW5jaGVyPiA7Cit0b29sc2V0LmZsYWdzIHRlc3RpbmcudW5pdC10ZXN0IEFSR1MgPHRlc3RpbmcuYXJnPiA7CisKKworcnVsZSB1bml0LXRlc3QgKCB0YXJnZXQgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICogKQoreworICAgIHJ1bi1wYXRoLXNldHVwICQodGFyZ2V0KSA6ICQoc291cmNlKSA6ICQocHJvcGVydGllcykgOworfQorCisKK2FjdGlvbnMgdW5pdC10ZXN0Cit7CisgICAgJChQQVRIX1NFVFVQKQorICAgICQoTEFVTkNIRVIpICIkKD4pIiAkKEFSR1MpICYmICQoLk1BS0VfRklMRSkgIiQoPCkiCit9CisKKworSU1QT1JUICQoX19uYW1lX18pIDogY29tcGlsZSBjb21waWxlLWZhaWwgcnVuIHJ1bi1mYWlsIGxpbmsgbGluay1mYWlsCisgICAgOiA6IGNvbXBpbGUgY29tcGlsZS1mYWlsIHJ1biBydW4tZmFpbCBsaW5rIGxpbmstZmFpbCA7CisKKworIyBUaGlzIGlzIGEgY29tcG9zaW5nIGdlbmVyYXRvciB0byBzdXBwb3J0IGNhc2VzIHdoZXJlIGEgZ2VuZXJhdG9yIGZvciB0aGUKKyMgc3BlY2lmaWVkIHRhcmdldCBjb25zdHJ1Y3RzIG90aGVyIHRhcmdldHMgYXMgd2VsbC4gT25lIHN1Y2ggZXhhbXBsZSBpcyBtc3ZjJ3MKKyMgZXhlIGdlbmVyYXRvciB0aGF0IGNvbnN0cnVjdHMgYm90aCBFWEUgYW5kIFBEQiB0YXJnZXRzLgordHlwZS5yZWdpc3RlciBUSU1FIDogdGltZSA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLWNvbXBvc2luZyB0ZXN0aW5nLnRpbWUgOiA6IFRJTUUgOworCisKKyMgTm90ZSB0aGF0IHRoaXMgcnVsZSBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBhIHNpbmdsZSB0YXJnZXQgaW4gY2FzZQorIyB0aGVyZSBhcmUgbXVsdGlwbGUgYWN0aW9ucyBvcGVyYXRpbmcgb24gdGhlIHNhbWUgdGFyZ2V0IGluIHNlcXVlbmNlLiBPbmUgc3VjaAorIyBleGFtcGxlIGFyZSBtc3ZjIGV4ZSB0YXJnZXRzIGZpcnN0IGNyZWF0ZWQgYnkgYSBsaW5rZXIgYWN0aW9uIGFuZCB0aGVuIHVwZGF0ZWQKKyMgd2l0aCBhbiBlbWJlZGRlZCBtYW5pZmVzdCBmaWxlIGJ5IGEgc2VwYXJhdGUgYWN0aW9uLgorcnVsZSByZWNvcmQtdGltZSAoIHRhcmdldCA6IHNvdXJjZSA6IHN0YXJ0IGVuZCB1c2VyIHN5c3RlbSApCit7CisgICAgbG9jYWwgc3JjLXN0cmluZyA9IFskKHNvdXJjZTpHPTpKPSIsIikiXSAiIDsKKyAgICBVU0VSX1RJTUUgb24gJCh0YXJnZXQpICs9ICQoc3JjLXN0cmluZykkKHVzZXIpIDsKKyAgICBTWVNURU1fVElNRSBvbiAkKHRhcmdldCkgKz0gJChzcmMtc3RyaW5nKSQoc3lzdGVtKSA7CisKKyAgICAjIFdlIG5lZWQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYmVjYXVzZSBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gc3VjaAorICAgICMgdmFyaWFibGUgZXhwYW5zaW9uIGluIGFjdGlvbnMgd291bGQgbm90IHdvcmsgZHVlIHRvIHF1b3RlcyBnZXR0aW5nIHRyZWF0ZWQKKyAgICAjIGFzIHJlZ3VsYXIgY2hhcmFjdGVycy4KKyAgICBVU0VSX1RJTUVfU0VDT05EUyBvbiAkKHRhcmdldCkgKz0gJChzcmMtc3RyaW5nKSQodXNlcikiIHNlY29uZHMiIDsKKyAgICBTWVNURU1fVElNRV9TRUNPTkRTIG9uICQodGFyZ2V0KSArPSAkKHNyYy1zdHJpbmcpJChzeXN0ZW0pIiBzZWNvbmRzIiA7Cit9CisKKworSU1QT1JUIHRlc3RpbmcgOiByZWNvcmQtdGltZSA6IDogdGVzdGluZy5yZWNvcmQtdGltZSA7CisKKworIyBDYWxsaW5nIHRoaXMgcnVsZSByZXF1ZXN0cyB0aGF0IEJvb3N0IEJ1aWxkIHRpbWUgaG93IGxvbmcgaXQgdGFrZXMgdG8gYnVpbGQKKyMgdGhlICdzb3VyY2UnIHRhcmdldCBhbmQgZGlzcGxheSB0aGUgcmVzdWx0cyBib3RoIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGluCisjIHRoZSAndGFyZ2V0JyBmaWxlLgorIworcnVsZSB0aW1lICggdGFyZ2V0IDogc291cmNlcyArIDogcHJvcGVydGllcyAqICApCit7CisgICAgIyBTZXQgdXAgcnVsZSBmb3IgcmVjb3JkaW5nIHRpbWluZyBpbmZvcm1hdGlvbi4KKyAgICBfX1RJTUlOR19SVUxFX18gb24gJChzb3VyY2VzKSA9IHRlc3RpbmcucmVjb3JkLXRpbWUgJCh0YXJnZXQpIDsKKworICAgICMgTWFrZSBzdXJlIHRoZSBzb3VyY2VzIGdldCByZWJ1aWx0IGFueSB0aW1lIHdlIG5lZWQgdG8gcmV0cmlldmUgdGhhdAorICAgICMgaW5mb3JtYXRpb24uCisgICAgUkVCVUlMRFMgJCh0YXJnZXQpIDogJChzb3VyY2VzKSA7Cit9CisKKworYWN0aW9ucyB0aW1lCit7CisgICAgZWNobyB1c2VyOiAkKFVTRVJfVElNRSkKKyAgICBlY2hvIHN5c3RlbTogJChTWVNURU1fVElNRSkKKworICAgIGVjaG8gdXNlcjogJChVU0VSX1RJTUVfU0VDT05EUykgPiAiJCg8KSIKKyAgICBlY2hvIHN5c3RlbTogJChTWVNURU1fVElNRV9TRUNPTkRTKSA+PiAiJCg8KSIKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdGlmZi5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3RpZmYuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZjIzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3RpZmYuamFtCkBAIC0wLDAgKzEsMjMwIEBACisjIENvcHlyaWdodCAoYykgMjAxMCBWbGFkaW1pciBQcnVzLgorIyBDb3B5cmlnaHQgKGMpIDIwMTMgU3RldmVuIFdhdGFuYWJlCisjCisjIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKKyMgTGljZW5zZSBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIFN1cHBvcnRzIHRoZSBsaWJ0aWZmIGxpYnJhcnkKKyMKKyMgQWZ0ZXIgJ3VzaW5nIGxpYnRpZmYnLCB0aGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIGF2YWlsYWJsZToKKyMKKyMgL2xpYnRpZmYvL2xpYnRpZmYgLS0gVGhlIGxpYnRpZmYgbGlicmFyeQorCitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgYWMgOworaW1wb3J0IGVycm9ycyA7CitpbXBvcnQgImNsYXNzIiA6IG5ldyA7CitpbXBvcnQgdGFyZ2V0cyA7IAoraW1wb3J0IHBhdGggOworaW1wb3J0IG1vZHVsZXMgOworaW1wb3J0IGVycm9ycyA7CitpbXBvcnQgaW5kaXJlY3QgOworaW1wb3J0IHByb3BlcnR5IDsKK2ltcG9ydCBwcm9wZXJ0eS1zZXQgOworCitoZWFkZXIgPSB0aWZmLmggdGlmZmlvLmh4eCA7CisKK25hbWVzID0gbGlidGlmZiA7CisKK3NvdXJjZXMgPSAgIHRpZl9hdXguYyB0aWZfY2xvc2UuYyB0aWZfY29kZWMuYyB0aWZfY29sb3IuYyB0aWZfY29tcHJlc3MuYyB0aWZfZGlyLmMgdGlmX2RpcmluZm8uYworCXRpZl9kaXJyZWFkLmMgdGlmX2RpcndyaXRlLmMgdGlmX2R1bXBtb2RlLmMgdGlmX2Vycm9yLmMgdGlmX2V4dGVuc2lvbi5jIHRpZl9mYXgzLmMgdGlmX2ZheDNzbS5jCisJdGlmX2dldGltYWdlLmMgdGlmX2piaWcuYyB0aWZfanBlZy5jIHRpZl9qcGVnXzEyLmMgdGlmX29qcGVnLmMgdGlmX2ZsdXNoLmMgdGlmX2x1di5jIHRpZl9sencuYworCXRpZl9uZXh0LmMgdGlmX29wZW4uYyB0aWZfcGFja2JpdHMuYyB0aWZfcGl4YXJsb2cuYyB0aWZfcHJlZGljdC5jIHRpZl9wcmludC5jIHRpZl9yZWFkLmMgdGlmX3N0cmVhbS5jeHgKKwl0aWZfc3dhYi5jIHRpZl9zdHJpcC5jIHRpZl90aHVuZGVyLmMgdGlmX3RpbGUuYyB0aWZfdmVyc2lvbi5jIHRpZl93YXJuaW5nLmMgdGlmX3dyaXRlLmMgdGlmX3ppcC5jIDsKKworbGlicmFyeS1pZCA9IDAgOworCitpZiAtLWRlYnVnLWNvbmZpZ3VyYXRpb24gaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0KK3sKKyAgICAuZGVidWcgPSAgdHJ1ZSA7Cit9CisKKyMgSW5pdGlhbGl6ZXMgdGhlIGxpYnRpZmYgbGlicmFyeS4KKyMKKyMgbGlidGlmZiBjYW4gYmUgY29uZmlndXJlZCBlaXRoZXIgdG8gdXNlIHByZS1leGlzdGluZyBiaW5hcmllcworIyBvciB0byBidWlsZCB0aGUgbGlicmFyeSBmcm9tIHNvdXJjZS4KKyMKKyMgT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSBwcmVidWlsdCBsaWJ0aWZmOjoKKyMKKyMgICA8c2VhcmNoPgorIyAgICAgICBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpYnRpZmYgYmluYXJpZXMuCisjICAgPG5hbWU+CisjICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBsaWJyYXJ5IG5hbWUuCisjICAgPGluY2x1ZGU+CisjICAgICAgIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbGlidGlmZiBoZWFkZXJzLgorIworIyBJZiBub25lIG9mIHRoZXNlIG9wdGlvbnMgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBlbnZpcm9ubWVudGFsCisjIHZhcmlhYmxlcyBMSUJUSUZGX0xJQlJBUllfUEFUSCwgTElCVElGRl9OQU1FLCBhbmQgTElCVElGRl9JTkNMVURFIHdpbGwKKyMgYmUgdXNlZCBpbnN0ZWFkLgorIworIyBPcHRpb25zIGZvciBidWlsZGluZyBsaWJ0aWZmIGZyb20gc291cmNlOjoKKyMKKyMgICA8c291cmNlPgorIyAgICAgICBUaGUgbGlidGlmZiBzb3VyY2UgZGlyZWN0b3J5LiAgRGVmYXVsdHMgdG8gdGhlIGVudmlyb25tZW50YWwgdmFyaWFibGUKKyMgICAgICAgTElCVElGRl9TT1VSQ0UuCisjICAgPHRhZz4KKyMgICAgICAgQSBydWxlIHdoaWNoIGNvbXB1dGVzIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgY29tcGlsZWQKKyMgICAgICAgbGlicmFyaWVzIGJhc2VkIG9uIHRoZSBidWlsZCBwcm9wZXJ0aWVzLiAgSWdub3JlZAorIyAgICAgICB3aGVuIHVzaW5nIHByZWNvbXBpbGVkIGJpbmFyaWVzLgorIyAgIDxidWlsZC1uYW1lPgorIyAgICAgICBUaGUgYmFzZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGNvbXBpbGVkIGxpYnJhcnkuICBJZ25vcmVkCisjICAgICAgIHdoZW4gdXNpbmcgcHJlY29tcGlsZWQgYmluYXJpZXMuCisjCisjIEV4YW1wbGVzOjoKKyMKKyMgICAjIEZpbmQgbGlidGlmZiBpbiB0aGUgZGVmYXVsdCBzeXN0ZW0gbG9jYXRpb24KKyMgICB1c2luZyBsaWJ0aWZmIDsKKyMgICAjIEJ1aWxkIGxpYnRpZmYgZnJvbSBzb3VyY2UKKyMgICB1c2luZyBsaWJ0aWZmIDogNC4wLjEgOiA8c291cmNlPi9ob21lL3N0ZXZlbi9saWJ0aWZmLTQuMC4xIDsKKyMgICAjIEZpbmQgbGlidGlmZiBpbiAvdXNyL2xvY2FsCisjICAgdXNpbmcgbGlidGlmZiA6IDQuMC4xCisjICAgICA6IDxpbmNsdWRlPi91c3IvbG9jYWwvaW5jbHVkZSA8c2VhcmNoPi91c3IvbG9jYWwvbGliIDsKKyMgICAjIEJ1aWxkIGxpYnRpZmYgZnJvbSBzb3VyY2UgZm9yIG1zdmMgYW5kIGZpbmQKKyMgICAjIHByZWJ1aWx0IGJpbmFyaWVzIGZvciBnY2MuCisjICAgdXNpbmcgbGlidGlmZiA6IDQuMC4xIDogPHNvdXJjZT5DOi9EZXZlbC9zcmMvbGlidGlmZi00LjAuMSA6IDx0b29sc2V0Pm1zdmMgOworIyAgIHVzaW5nIGxpYnRpZmYgOiA0LjAuMSA6IDogPHRvb2xzZXQ+Z2NjIDsKKyMKK3J1bGUgaW5pdCAoCisgICAgdmVyc2lvbiA/CisgICAgIyBUaGUgbGlidGlmZiB2ZXJzaW9uIChjdXJyZW50bHkgaWdub3JlZCkKKworICAgIDogb3B0aW9ucyAqCisgICAgIyBBIGxpc3Qgb2YgdGhlIG9wdGlvbnMgdG8gdXNlCisKKyAgICA6IHJlcXVpcmVtZW50cyAqCisgICAgIyBUaGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgbGlidGlmZiB0YXJnZXQKKworICAgIDogaXMtZGVmYXVsdCA/CisgICAgIyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25zIGFyZSBvbmx5IHVzZWQgd2hlbiBsaWJ0aWZmCisgICAgIyBoYXMgbm90IHlldCBiZWVuIGNvbmZpZ3VyZWQuCisgICAgKQoreworICAgIGxvY2FsIGNhbGxlciA9IFsgcHJvamVjdC5jdXJyZW50IF0gOworCisgICAgaWYgISAkKC5pbml0aWFsaXplZCkKKyAgICB7CisgICAgICAgIC5pbml0aWFsaXplZCA9IHRydWUgOworCisgICAgICAgIHByb2plY3QuaW5pdGlhbGl6ZSAkKF9fbmFtZV9fKSA7CisgICAgICAgIC5wcm9qZWN0ID0gWyBwcm9qZWN0LmN1cnJlbnQgXSA7CisgICAgICAgIHByb2plY3QgbGlidGlmZiA7CisgICAgfQorCisgICAgbG9jYWwgbGlicmFyeS1wYXRoID0gWyBwcm9wZXJ0eS5zZWxlY3QgPHNlYXJjaD4gOiAkKG9wdGlvbnMpIF0gOworICAgIGxpYnJhcnktcGF0aCA9ICQobGlicmFyeS1wYXRoOkc9KSA7CisgICAgbG9jYWwgaW5jbHVkZS1wYXRoID0gWyBwcm9wZXJ0eS5zZWxlY3QgPGluY2x1ZGU+IDogJChvcHRpb25zKSBdIDsKKyAgICBpbmNsdWRlLXBhdGggPSAkKGluY2x1ZGUtcGF0aDpHPSkgOworICAgIGxvY2FsIHNvdXJjZS1wYXRoID0gWyBwcm9wZXJ0eS5zZWxlY3QgPHNvdXJjZT4gOiAkKG9wdGlvbnMpIF0gOworICAgIHNvdXJjZS1wYXRoID0gJChzb3VyY2UtcGF0aDpHPSkgOworICAgIGxvY2FsIGxpYnJhcnktbmFtZSA9IFsgcHJvcGVydHkuc2VsZWN0IDxuYW1lPiA6ICQob3B0aW9ucykgXSA7CisgICAgbGlicmFyeS1uYW1lID0gJChsaWJyYXJ5LW5hbWU6Rz0pIDsKKyAgICBsb2NhbCB0YWcgPSBbIHByb3BlcnR5LnNlbGVjdCA8dGFnPiA6ICQob3B0aW9ucykgXSA7CisgICAgdGFnID0gJCh0YWc6Rz0pIDsKKyAgICBsb2NhbCBidWlsZC1uYW1lID0gWyBwcm9wZXJ0eS5zZWxlY3QgPGJ1aWxkLW5hbWU+IDogJChvcHRpb25zKSBdIDsKKyAgICBidWlsZC1uYW1lID0gJChidWlsZC1uYW1lOkc9KSA7CisKKyAgICBjb25kaXRpb24gPSBbIHByb3BlcnR5LXNldC5jcmVhdGUgJChyZXF1aXJlbWVudHMpIF0gOworICAgIGNvbmRpdGlvbiA9IFsgcHJvcGVydHktc2V0LmNyZWF0ZSBbICQoY29uZGl0aW9uKS5iYXNlIF0gXSA7CisKKyAgICBsb2NhbCBuby1idWlsZC1mcm9tLXNvdXJjZSA7CisgICAgIyBJZ25vcmUgZW52aXJvbm1lbnRhbCBaTElCX1NPVVJDRSBpZiB0aGlzIGluaXRpYWxpemF0aW9uCisgICAgIyByZXF1ZXN0ZWQgdG8gc2VhcmNoIGZvciBhIHNwZWNpZmljIHByZS1idWlsdCBsaWJyYXJ5LgorICAgIGlmICQobGlicmFyeS1wYXRoKSB8fCAkKGluY2x1ZGUtcGF0aCkgfHwgJChsaWJyYXJ5LW5hbWUpCisgICAgeworICAgICAgICBpZiAkKHNvdXJjZS1wYXRoKSB8fCAkKHRhZykgfHwgJChidWlsZC1uYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcnMudXNlci1lcnJvciAiaW5jb21wYXRpYmxlIG9wdGlvbnMgZm9yIGxpYnRpZmY6IgorICAgICAgICAgICAgICAgIFsgcHJvcGVydHkuc2VsZWN0IDxzZWFyY2g+IDxpbmNsdWRlPiA8bmFtZT4gOiAkKG9wdGlvbnMpIF0gImFuZCIKKyAgICAgICAgICAgICAgICBbIHByb3BlcnR5LnNlbGVjdCA8c291cmNlPiA8dGFnPiA8YnVpbGQtbmFtZT4gOiAkKG9wdGlvbnMpIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm8tYnVpbGQtZnJvbS1zb3VyY2UgPSB0cnVlIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNvdXJjZS1wYXRoID89IFsgbW9kdWxlcy5wZWVrIDogWkxJQl9TT1VSQ0UgXSA7CisKKyAgICBpZiAkKC5jb25maWd1cmVkLiQoY29uZGl0aW9uKSkKKyAgICB7CisgICAgICAgIGlmICQoaXMtZGVmYXVsdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJCguZGVidWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAibm90aWNlOiBbbGlidGlmZl0gbGlidGlmZiBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQiIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9ycy51c2VyLWVycm9yICJsaWJ0aWZmIGlzIGFscmVhZHkgY29uZmlndXJlZCIgOworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIGVsc2UgaWYgJChzb3VyY2UtcGF0aCkgJiYgISAkKG5vLWJ1aWxkLWZyb20tc291cmNlKQorICAgIHsKKyAgICAgICAgYnVpbGQtbmFtZSA/PSB6IDsKKyAgICAgICAgbGlicmFyeS1pZCA9IFsgQ0FMQyAkKGxpYnJhcnktaWQpICsgMSBdIDsKKyAgICAgICAgdGFnID0gWyBNQVRDSCBeQD8oLiopJCA6ICQodGFnKSBdIDsKKyAgICAgICAgaWYgJCh0YWcpICYmICEgWyBNQVRDSCBeKFteJV0qKSUoW14lXSspJCA6ICQodGFnKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHRhZyA9IFsgaW5kaXJlY3QubWFrZSAkKHRhZykgOiBbICQoY2FsbGVyKS5wcm9qZWN0LW1vZHVsZSBdIF0gOworICAgICAgICB9CisgICAgICAgIHNvdXJjZXMgPSBbIHBhdGguZ2xvYiAkKHNvdXJjZS1wYXRoKSA6ICQoc291cmNlcykgXSA7CisgICAgICAgIGlmICQoLmRlYnVnKQorICAgICAgICB7CisgICAgICAgICAgICBFQ0hPICJub3RpY2U6IFtsaWJ0aWZmXSBCdWlsZGluZyBsaWJ0aWZmIGZyb20gc291cmNlIGFzICQoYnVpbGQtbmFtZSkiIDsKKyAgICAgICAgICAgIGlmICQoY29uZGl0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIm5vdGljZTogW2xpYnRpZmZdIENvbmRpdGlvbiIgWyAkKGNvbmRpdGlvbikucmF3IF0gOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgJChzb3VyY2VzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIm5vdGljZTogW2xpYnRpZmZdIGZvdW5kIGxpYnRpZmYgc291cmNlIGluICQoc291cmNlLXBhdGgpIiA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAid2FybmluZzogW2xpYnRpZmZdIGNvdWxkIG5vdCBmaW5kIGxpYnRpZmYgc291cmNlIGluICQoc291cmNlLXBhdGgpIiA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9jYWwgdGFyZ2V0IDsKKyAgICAgICAgaWYgJChzb3VyY2VzKSB7CisgICAgICAgICAgICB0YXJnZXQgPSBbIHRhcmdldHMuY3JlYXRlLXR5cGVkLXRhcmdldCBMSUIgOiAkKC5wcm9qZWN0KQorICAgICAgICAgICAgICA6ICQoYnVpbGQtbmFtZSkuJChsaWJyYXJ5LWlkKQorICAgICAgICAgICAgICA6ICQoc291cmNlcykKKyAgICAgICAgICAgICAgOiAkKHJlcXVpcmVtZW50cykKKyAgICAgICAgICAgICAgICA8dGFnPkAkKHRhZykKKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4kKHNvdXJjZS1wYXRoKQorICAgICAgICAgICAgICAgIDx0b29sc2V0Pm1zdmM6PGRlZmluZT5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyAgICAgICAgICAgICAgICA8dG9vbHNldD5tc3ZjOjxkZWZpbmU+X1NDTF9TRUNVUkVfTk9fREVQUkVDQVRFCisgICAgICAgICAgICAgICAgPGxpbms+c2hhcmVkOjxkZWZpbmU+WkxJQl9ETEwKKyAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICA6IDxpbmNsdWRlPiQoc291cmNlLXBhdGgpIF0gOworICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgbXQgPSBbIG5ldyBhYy1saWJyYXJ5IGxpYnRpZmYgOiAkKC5wcm9qZWN0KSA6ICQoY29uZGl0aW9uKSBdIDsKKyAgICAgICAgJChtdCkuc2V0LWhlYWRlciAkKGhlYWRlcikgOworICAgICAgICAkKG10KS5zZXQtZGVmYXVsdC1uYW1lcyAkKG5hbWVzKSA7CisgICAgICAgIGlmICQodGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICAkKG10KS5zZXQtdGFyZ2V0ICQodGFyZ2V0KSA7CisgICAgICAgIH0KKyAgICAgICAgdGFyZ2V0cy5tYWluLXRhcmdldC1hbHRlcm5hdGl2ZSAkKG10KSA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgJCguZGVidWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gIm5vdGljZTogW2xpYnRpZmZdIFVzaW5nIHByZS1pbnN0YWxsZWQgbGlicmFyeSIgOworICAgICAgICAgICAgaWYgJChjb25kaXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUNITyAibm90aWNlOiBbbGlidGlmZl0gQ29uZGl0aW9uIiBbICQoY29uZGl0aW9uKS5yYXcgXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb2NhbCBtdCA9IFsgbmV3IGFjLWxpYnJhcnkgbGlidGlmZiA6ICQoLnByb2plY3QpIDogJChjb25kaXRpb24pIDoKKyAgICAgICAgICAgICQoaW5jbHVkZS1wYXRoKSA6ICQobGlicmFyeS1wYXRoKSA6ICQobGlicmFyeS1uYW1lKSA6ICQocm9vdCkgXSA7CisgICAgICAgICQobXQpLnNldC1oZWFkZXIgJChoZWFkZXIpIDsKKyAgICAgICAgJChtdCkuc2V0LWRlZmF1bHQtbmFtZXMgJChuYW1lcykgOworICAgICAgICB0YXJnZXRzLm1haW4tdGFyZ2V0LWFsdGVybmF0aXZlICQobXQpIDsKKyAgICB9CisgICAgLmNvbmZpZ3VyZWQuJChjb25kaXRpb24pID0gdHJ1ZSA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL2FzbS5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL2FzbS5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0MGRiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvYXNtLmphbQpAQCAtMCwwICsxLDQgQEAKKyMgQ29weXJpZ2h0IENyYWlnIFJvZHJpZ3VlcyAyMDA1LiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QKKyMgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCisjIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQordHlwZSBBU00gOiBzIFMgYXNtIDsKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvY3BwLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvY3BwLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQ4ZmFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy90eXBlcy9jcHAuamFtCkBAIC0wLDAgKzEsOTAgQEAKKyMgQ29weXJpZ2h0IDIwMDQgRGF2aWQgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgVmxhZGltaXIgUHJ1cworIyBDb3B5cmlnaHQgMjAxMCBSZW5lIFJpdmVyYQorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgc2Nhbm5lciA7CitpbXBvcnQgdHlwZSA7CisKKworY2xhc3MgYy1zY2FubmVyIDogc2Nhbm5lcgoreworICAgIGltcG9ydCBwYXRoIDsKKyAgICBpbXBvcnQgcmVnZXggOworICAgIGltcG9ydCBzY2FubmVyIDsKKyAgICBpbXBvcnQgc2VxdWVuY2UgOworICAgIGltcG9ydCB2aXJ0dWFsLXRhcmdldCA7CisKKyAgICBydWxlIF9faW5pdF9fICggaW5jbHVkZXMgKiApCisgICAgeworICAgICAgICBzY2FubmVyLl9faW5pdF9fIDsKKworICAgICAgICBmb3IgbG9jYWwgaSBpbiAkKGluY2x1ZGVzKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxmLmluY2x1ZGVzICs9IFsgc2VxdWVuY2UudHJhbnNmb3JtIHBhdGgubmF0aXZlIDogWyByZWdleC5zcGxpdAorICAgICAgICAgICAgICAgICQoaTpHPSkgIiYmIiBdIF0gOworICAgICAgICB9CisgICAgfQorCisgICAgcnVsZSBwYXR0ZXJuICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIjWyBcdF0qaW5jbHVkZVsgXSooPCguKik+fFwiKC4qKVwiKSIgOworICAgIH0KKworICAgIHJ1bGUgcHJvY2VzcyAoIHRhcmdldCA6IG1hdGNoZXMgKiA6IGJpbmRpbmcgKQorICAgIHsKKyAgICAgICAgbG9jYWwgYW5nbGUgPSBbIHJlZ2V4LnRyYW5zZm9ybSAkKG1hdGNoZXMpIDogIjwoLiopPiIgXSA7CisgICAgICAgIGFuZ2xlID0gWyBzZXF1ZW5jZS50cmFuc2Zvcm0gcGF0aC5uYXRpdmUgOiAkKGFuZ2xlKSBdIDsKKyAgICAgICAgbG9jYWwgcXVvdGVkID0gWyByZWdleC50cmFuc2Zvcm0gJChtYXRjaGVzKSA6ICJcIiguKilcIiIgXSA7CisgICAgICAgIHF1b3RlZCA9IFsgc2VxdWVuY2UudHJhbnNmb3JtIHBhdGgubmF0aXZlIDogJChxdW90ZWQpIF0gOworCisgICAgICAgICMgQ09OU0lERVI6IHRoZSBuZXcgc2NvcGluZyBydWxlcyBzZWVtIHRvIGRlZmVhdCAib24gdGFyZ2V0IiB2YXJpYWJsZXMuCisgICAgICAgIGxvY2FsIGcgPSBbIG9uICQodGFyZ2V0KSByZXR1cm4gJChIRFJHUklTVCkgXSA7CisgICAgICAgIGxvY2FsIGIgPSBbIE5PUk1BTElaRV9QQVRIICQoYmluZGluZzpEKSBdIDsKKworICAgICAgICAjIEF0dGFjaCBiaW5kaW5nIG9mIGluY2x1ZGluZyBmaWxlIHRvIGluY2x1ZGVkIHRhcmdldHMuIFdoZW4gYSB0YXJnZXQgaXMKKyAgICAgICAgIyBkaXJlY3RseSBjcmVhdGVkIGZyb20gYSB2aXJ0dWFsIHRhcmdldCB0aGlzIGV4dHJhIGluZm9ybWF0aW9uIGlzCisgICAgICAgICMgdW5uZWNlc3NhcnkuIEJ1dCBpbiBvdGhlciBjYXNlcywgaXQgYWxsb3dzIHVzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgICAgICAgIyB0d28gaGVhZGVycyBvZiB0aGUgc2FtZSBuYW1lIGluY2x1ZGVkIGZyb20gZGlmZmVyZW50IHBsYWNlcy4gV2UgZG8gbm90CisgICAgICAgICMgbmVlZCB0aGlzIGV4dHJhIGluZm9ybWF0aW9uIGZvciBhbmdsZSBpbmNsdWRlcywgc2luY2UgdGhleSBzaG91bGQgbm90CisgICAgICAgICMgZGVwZW5kIG9uIHRoZSBpbmNsdWRpbmcgZmlsZSAod2UgY2FuIG5vdCBnZXQgbGl0ZXJhbCAiLiIgaW4gdGhlCisgICAgICAgICMgaW5jbHVkZSBwYXRoKS4KKyAgICAgICAgbG9jYWwgZzIgPSAkKGcpIiMiJChiKSA7CisKKyAgICAgICAgYW5nbGUgPSAkKGFuZ2xlOkc9JChnKSkgOworICAgICAgICBxdW90ZWQgPSAkKHF1b3RlZDpHPSQoZzIpKSA7CisKKyAgICAgICAgbG9jYWwgYWxsID0gJChhbmdsZSkgJChxdW90ZWQpIDsKKworICAgICAgICBJTkNMVURFUyAkKHRhcmdldCkgOiAkKGFsbCkgOworICAgICAgICBOT0NBUkUgJChhbGwpIDsKKyAgICAgICAgU0VBUkNIIG9uICQoYW5nbGUpID0gJChzZWxmLmluY2x1ZGVzOkc9KSA7CisgICAgICAgIFNFQVJDSCBvbiAkKHF1b3RlZCkgPSAkKGIpICQoc2VsZi5pbmNsdWRlczpHPSkgOworCisgICAgICAgICMgSnVzdCBwcm9wYWdhdGUgdGhlIGN1cnJlbnQgc2Nhbm5lciB0byBpbmNsdWRlcywgaW4gaG9wZSB0aGF0IGluY2x1ZGVzCisgICAgICAgICMgZG8gbm90IGNoYW5nZSBzY2FubmVycy4KKyAgICAgICAgc2Nhbm5lci5wcm9wYWdhdGUgJChfX25hbWVfXykgOiAkKGFsbCkgOiAkKHRhcmdldCkgOworCisgICAgICAgIElTRklMRSAkKGFsbCkgOworICAgIH0KK30KKworc2Nhbm5lci5yZWdpc3RlciBjLXNjYW5uZXIgOiBpbmNsdWRlIDsKKwordHlwZS5yZWdpc3RlciBDUFAgOiBjcHAgY3h4IGNjIDsKK3R5cGUucmVnaXN0ZXIgSCAgIDogaCA7Cit0eXBlLnJlZ2lzdGVyIEhQUCA6IGhwcCA6IEggOwordHlwZS5yZWdpc3RlciBDICAgOiBjIDsKKworIyBJdCBtb3N0IGNhc2VzIHdoZXJlIGEgQ1BQIGZpbGUgb3IgYSBIIGZpbGUgaXMgYSBzb3VyY2Ugb2Ygc29tZSBhY3Rpb24sIHdlCisjIHNob3VsZCByZWJ1aWxkIHRoZSByZXN1bHQgaWYgYW55IG9mIGZpbGVzIGluY2x1ZGVkIGJ5IENQUC9IIGFyZSBjaGFuZ2VkLiBPbmUKKyMgY2FzZSB3aGVuIHRoaXMgaXMgbm90IG5lZWRlZCBpcyBpbnN0YWxsYXRpb24sIHdoaWNoIGlzIGhhbmRsZWQgc3BlY2lmaWNhbGx5LgordHlwZS5zZXQtc2Nhbm5lciBDUFAgOiBjLXNjYW5uZXIgOwordHlwZS5zZXQtc2Nhbm5lciBDICAgOiBjLXNjYW5uZXIgOworIyBPbmUgY2FzZSB3aGVyZSBzY2FubmluZyBvZiBIL0hQUCBmaWxlcyBpcyBuZWNlc3NhcnkgaXMgUENIIGdlbmVyYXRpb24gLS0gaWYKKyMgYW55IGhlYWRlciBpbmNsdWRlZCBieSBIUFAgYmVpbmcgcHJlY29tcGlsZWQgY2hhbmdlcywgd2UgbmVlZCB0byByZWNvbXBpbGUgdGhlCisjIGhlYWRlci4KK3R5cGUuc2V0LXNjYW5uZXIgSCAgIDogYy1zY2FubmVyIDsKK3R5cGUuc2V0LXNjYW5uZXIgSFBQIDogYy1zY2FubmVyIDsKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvZXhlLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvZXhlLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzEwOTUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy90eXBlcy9leGUuamFtCkBAIC0wLDAgKzEsOSBAQAorIyBDb3B5cmlnaHQgRGF2aWQgQWJyYWhhbXMgMjAwNC4gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0CisjIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworIyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworaW1wb3J0IHR5cGUgOworCit0eXBlLnJlZ2lzdGVyIEVYRSA7Cit0eXBlLnNldC1nZW5lcmF0ZWQtdGFyZ2V0LXN1ZmZpeCBFWEUgOiA8dGFyZ2V0LW9zPndpbmRvd3MgOiAiZXhlIiA7Cit0eXBlLnNldC1nZW5lcmF0ZWQtdGFyZ2V0LXN1ZmZpeCBFWEUgOiA8dGFyZ2V0LW9zPmN5Z3dpbiA6ICJleGUiIDsKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvaHRtbC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL2h0bWwuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDMzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL2h0bWwuamFtCkBAIC0wLDAgKzEsNCBAQAorIyBDb3B5cmlnaHQgRGF2aWQgQWJyYWhhbXMgMjAwNC4gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0CisjIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworIyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKK3R5cGUgSFRNTCA6IGh0bWwgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy90eXBlcy9saWIuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy90eXBlcy9saWIuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NGFiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL2xpYi5qYW0KQEAgLTAsMCArMSw3NCBAQAorIyBDb3B5cmlnaHQgRGF2aWQgQWJyYWhhbXMgMjAwNC4gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0CisjIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworIyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworaW1wb3J0IHR5cGUgOyAjIGZvciBzZXQtZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXgKK2ltcG9ydCBvcyA7CisKKyMgVGhlIGZvbGxvd2luZyBuYW1pbmcgc2NoZW1lIGlzIHVzZWQgZm9yIGxpYnJhcmllcy4KKyMKKyMgT24gKm5peDoKKyMgICAgIGxpYnh4eC5hICAgICAgIHN0YXRpYyBsaWJyYXJ5CisjICAgICBsaWJ4eHguc28gICAgICBzaGFyZWQgbGlicmFyeQorIworIyBPbiB3aW5kb3dzIChtc3ZjKQorIyAgICAgbGlieHh4LmxpYiAgICAgc3RhdGljIGxpYnJhcnkKKyMgICAgIHh4eC5kbGwgICAgICAgIERMTAorIyAgICAgeHh4LmxpYiAgICAgICAgaW1wb3J0IGxpYnJhcnkKKyMKKyMgT24gd2luZG93cyAobWluZ3cpOgorIyAgICAgbGlieHh4LmEgICAgICAgc3RhdGljIGxpYnJhcnkKKyMgICAgIGxpYnh4eC5kbGwgICAgIERMTAorIyAgICAgbGlieHh4LmRsbC5hICAgaW1wb3J0IGxpYnJhcnkKKyMKKyMgT24gY3lnd2luIGkuZS4gPHRhcmdldC1vcz5jeWd3aW4KKyMgICAgIGxpYnh4eC5hICAgICAgIHN0YXRpYyBsaWJyYXJ5CisjICAgICBjeWd4eHguZGxsICAgICBETEwKKyMgICAgIGxpYnh4eC5kbGwuYSAgIGltcG9ydCBsaWJyYXJ5CisjCisKK3R5cGUucmVnaXN0ZXIgTElCIDsKKworIyBGSVhNRTogc2hvdWxkIG5vdCByZWdpc3RlciBib3RoIGV4dGVuc2lvbnMgb24gYm90aCBwbGF0Zm9ybXMuCit0eXBlLnJlZ2lzdGVyIFNUQVRJQ19MSUIgOiBhIGxpYiA6IExJQiA7CisKKyMgVGhlICdsaWInIHByZWZpeCBpcyB1c2VkIGV2ZXJ5d2hlcmUKK3R5cGUuc2V0LWdlbmVyYXRlZC10YXJnZXQtcHJlZml4IFNUQVRJQ19MSUIgOiA6IGxpYiA7CisKKyMgVXNlICcubGliJyBzdWZmaXggZm9yIHdpbmRvd3MKK3R5cGUuc2V0LWdlbmVyYXRlZC10YXJnZXQtc3VmZml4IFNUQVRJQ19MSUIgOiA8dGFyZ2V0LW9zPndpbmRvd3MgOiBsaWIgOworCisjIEV4Y2VwdCB3aXRoIGdjYy4KK3R5cGUuc2V0LWdlbmVyYXRlZC10YXJnZXQtc3VmZml4IFNUQVRJQ19MSUIgOiA8dG9vbHNldD5nY2MgPHRhcmdldC1vcz53aW5kb3dzIDogYSA7CisKKyMgVXNlIHh4eC5saWIgZm9yIGltcG9ydCBsaWJzCit0eXBlIElNUE9SVF9MSUIgOiA6IFNUQVRJQ19MSUIgOwordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1wcmVmaXggSU1QT1JUX0xJQiA6IDogIiIgOwordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXggSU1QT1JUX0xJQiA6IDogbGliIDsKKworIyBFeGNlcHQgd2l0aCBnY2MgKG1pbmd3IG9yIGN5Z3dpbiksIHdoZXJlIHVzZSBsaWJ4eHguZGxsLmEKK3R5cGUuc2V0LWdlbmVyYXRlZC10YXJnZXQtcHJlZml4IElNUE9SVF9MSUIgOiA8dG9vbHNldD5nY2MgOiBsaWIgOwordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXggSU1QT1JUX0xJQiA6IDx0b29sc2V0PmdjYyA6IGRsbC5hIDsKKwordHlwZS5yZWdpc3RlciBTSEFSRURfTElCIDogc28gZGxsIGR5bGliIDogTElCIDsKKworIyBCb3RoIG1pbmd3IGFuZCBjeWd3aW4gdXNlIGxpYnh4eC5kbGwgbmFtaW5nIHNjaGVtZS4KKyMgT24gTGludXgsIHVzZSAibGliIiBwcmVmaXgKK3R5cGUuc2V0LWdlbmVyYXRlZC10YXJnZXQtcHJlZml4IFNIQVJFRF9MSUIgOiA6IGxpYiA7CisjIEJ1dCBkb24ndCB1c2UgaXQgb24gd2luZG93cwordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1wcmVmaXggU0hBUkVEX0xJQiA6IDx0YXJnZXQtb3M+d2luZG93cyA6ICIiIDsKKyMgQnV0IHVzZSBpdCBhZ2FpbiBvbiBtaW5ndwordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1wcmVmaXggU0hBUkVEX0xJQiA6IDx0b29sc2V0PmdjYyA8dGFyZ2V0LW9zPndpbmRvd3MgOiBsaWIgOworIyBBbmQgdXNlICdjeWcnIG9uIGN5Z3dpbgordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1wcmVmaXggU0hBUkVEX0xJQiA6IDx0YXJnZXQtb3M+Y3lnd2luIDogY3lnIDsKKworCit0eXBlLnNldC1nZW5lcmF0ZWQtdGFyZ2V0LXN1ZmZpeCBTSEFSRURfTElCIDogPHRhcmdldC1vcz53aW5kb3dzIDogZGxsIDsKK3R5cGUuc2V0LWdlbmVyYXRlZC10YXJnZXQtc3VmZml4IFNIQVJFRF9MSUIgOiA8dGFyZ2V0LW9zPmN5Z3dpbiA6IGRsbCA7Cit0eXBlLnNldC1nZW5lcmF0ZWQtdGFyZ2V0LXN1ZmZpeCBTSEFSRURfTElCIDogPHRhcmdldC1vcz5kYXJ3aW4gOiBkeWxpYiA7CisKK3R5cGUgU0VBUkNIRURfTElCIDogOiBMSUIgOworIyBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IHdoZW4gd2UgY3JlYXRlIGEgdGFyZ2V0IG9mIFNFQVJDSEVEX0xJQgorIyB0eXBlLCB0aGVyZSdzIG5vIHByZWZpeCBvciBzdWZmaXggYXV0b21hdGljYWxseSBhZGRlZC4KK3R5cGUuc2V0LWdlbmVyYXRlZC10YXJnZXQtcHJlZml4IFNFQVJDSEVEX0xJQiA6IDogIiIgOwordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXggU0VBUkNIRURfTElCIDogOiAiIiA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL29iai5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL29iai5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmYmNhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvb2JqLmphbQpAQCAtMCwwICsxLDkgQEAKKyMgQ29weXJpZ2h0IERhdmlkIEFicmFoYW1zIDIwMDQuIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdAorIyBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyMgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2ltcG9ydCB0eXBlIDsKKwordHlwZS5yZWdpc3RlciBPQkogOiBvIG9iaiA7Cit0eXBlLnNldC1nZW5lcmF0ZWQtdGFyZ2V0LXN1ZmZpeCBPQkogOiA8dGFyZ2V0LW9zPndpbmRvd3MgOiBvYmogOwordHlwZS5zZXQtZ2VuZXJhdGVkLXRhcmdldC1zdWZmaXggT0JKIDogPHRhcmdldC1vcz5jeWd3aW4gOiBvYmogOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy90eXBlcy9vYmpjLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvb2JqYy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5Y2JkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvb2JqYy5qYW0KQEAgLTAsMCArMSwyNiBAQAorIyBDb3B5cmlnaHQgUmVuZSBSaXZlcmEgMjAwOCwgMjAxMC4KKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworIyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKK2ltcG9ydCB0eXBlIDsKK2ltcG9ydCBzY2FubmVyIDsKK2ltcG9ydCB0eXBlcy9jcHAgOworCitjbGFzcyBvYmpjLXNjYW5uZXIgOiBjLXNjYW5uZXIKK3sKKyAgICBydWxlIF9faW5pdF9fICggaW5jbHVkZXMgKiApCisgICAgeworICAgICAgICBjLXNjYW5uZXIuX19pbml0X18gJChpbmNsdWRlcykgOworICAgIH0KKworICAgIHJ1bGUgcGF0dGVybiAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAiI1sgXHRdKmluY2x1ZGV8aW1wb3J0WyBdKig8KC4qKT58XCIoLiopXCIpIiA7CisgICAgfQorfQorCitzY2FubmVyLnJlZ2lzdGVyIG9iamMtc2Nhbm5lciA6IGluY2x1ZGUgOworCit0eXBlLnJlZ2lzdGVyIE9CSkVDVElWRV9DIDogbSA7Cit0eXBlLnJlZ2lzdGVyIE9CSkVDVElWRV9DUFAgOiBtbSA7Cit0eXBlLnNldC1zY2FubmVyIE9CSkVDVElWRV9DIDogb2JqYy1zY2FubmVyIDsKK3R5cGUuc2V0LXNjYW5uZXIgT0JKRUNUSVZFX0NQUCA6IG9iamMtc2Nhbm5lciA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL3ByZXByb2Nlc3NlZC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL3ByZXByb2Nlc3NlZC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxODdiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvcHJlcHJvY2Vzc2VkLmphbQpAQCAtMCwwICsxLDkgQEAKKyMgQ29weXJpZ2h0IFN0ZXZlbiBXYXRhbmFiZSAyMDExCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlCisjIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworaW1wb3J0IHR5cGUgOworCit0eXBlLnJlZ2lzdGVyIFBSRVBST0NFU1NFRF9DIDogaSA6IEMgOwordHlwZS5yZWdpc3RlciBQUkVQUk9DRVNTRURfQ1BQIDogaWkgOiBDUFAgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy90eXBlcy9xdC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL3F0LmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTUxMDYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy90eXBlcy9xdC5qYW0KQEAgLTAsMCArMSwxMiBAQAorIyBDb3B5cmlnaHQgVmxhZGltaXIgUHJ1cyAyMDA1LiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QKKyMgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCisjIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCit0eXBlIFVJIDogdWkgOwordHlwZSBRUkMgOiBxcmMgOwordHlwZSBNT0NDQUJMRV9DUFAgOwordHlwZSBNT0NDQUJMRV9IIDsKK3R5cGUgTU9DQ0FCTEU1X0NQUCA7Cit0eXBlIE1PQ0NBQkxFNV9IIDsKKyMgUmVzdWx0IG9mIHJ1bm5pbmcgbW9jLgordHlwZSBNT0MgOiBtb2MgOiBIIDsKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvcmVnaXN0ZXIuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy90eXBlcy9yZWdpc3Rlci5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzOTkyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvcmVnaXN0ZXIuamFtCkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0IERhdmlkIEFicmFoYW1zIDIwMDQuIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdAorIyBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyMgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgVGhpcyBtb2R1bGUncyBqb2IgaXMgdG8gYXV0b21hdGljYWxseSBpbXBvcnQgYWxsIHRoZSB0eXBlCisjIHJlZ2lzdHJhdGlvbiBtb2R1bGVzIGluIGl0cyBkaXJlY3RvcnkuCitpbXBvcnQgdHlwZSBvcyBwYXRoIG1vZHVsZXMgOworCisjIFJlZ2lzdGVyIHRoZSBnaXZlbiB0eXBlIG9uIHRoZSBzcGVjaWZpZWQgT1Nlcywgb3Igb24gcmVtYWluaW5nIE9TZXMKKyMgaWYgb3MgaXMgbm90IHNwZWNpZmllZC4gIFRoaXMgcnVsZSBpcyBpbmplY3RlZCBpbnRvIGVhY2ggb2YgdGhlIHR5cGUKKyMgbW9kdWxlcyBmb3IgdGhlIHNha2Ugb2YgY29udmVuaWVuY2UuCitsb2NhbCBydWxlIHR5cGUgKCB0eXBlIDogc3VmZml4ZXMgKiA6IGJhc2UtdHlwZSA/IDogb3MgKiApCit7CisgICAgaWYgISBbIHR5cGUucmVnaXN0ZXJlZCAkKHR5cGUpIF0KKyAgICB7CisgICAgICAgIGlmICggISAkKG9zKSApIHx8IFsgb3MubmFtZSBdIGluICQob3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGUucmVnaXN0ZXIgJCh0eXBlKSA6ICQoc3VmZml4ZXMpIDogJChiYXNlLXR5cGUpIDsKKyAgICAgICAgfQorICAgIH0KK30KKworLnRoaXMtbW9kdWxlJ3MtZmlsZSA9IFsgbW9kdWxlcy5iaW5kaW5nICQoX19uYW1lX18pIF0gOworLnRoaXMtbW9kdWxlJ3MtZGlyID0gWyBwYXRoLnBhcmVudCAkKC50aGlzLW1vZHVsZSdzLWZpbGUpIF0gOworLnNpYmxpbmctamFtZmlsZXMgPSAgWyBwYXRoLmdsb2IgJCgudGhpcy1tb2R1bGUncy1kaXIpIDogKi5qYW0gXSA7Cisuc2libGluZy1tb2R1bGVzID0gWyBNQVRDSCBeKC4qKVwuamFtJCA6ICQoLnNpYmxpbmctamFtZmlsZXMpIF0gOworCisjIEEgbG9vcCBvdmVyIGFsbCBtb2R1bGVzIGluIHRoaXMgZGlyZWN0b3J5Citmb3IgbSBpbiAkKC5zaWJsaW5nLW1vZHVsZXMpCit7CisgICAgbSA9IFsgcGF0aC5iYXNlbmFtZSAkKG0pIF0gOworICAgIG0gPSB0eXBlcy8kKG0pIDsKKyAgICAKKyAgICAjIEluamVjdCB0aGUgdHlwZSBydWxlIGludG8gdGhlIG5ldyBtb2R1bGUKKyAgICBJTVBPUlQgJChfX25hbWVfXykgOiB0eXBlIDogJChtKSA6IHR5cGUgOworICAgIGltcG9ydCAkKG0pIDsKK30KKworCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL3JzcC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3R5cGVzL3JzcC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmOGE3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdHlwZXMvcnNwLmphbQpAQCAtMCwwICsxLDQgQEAKKyMgQ29weXJpZ2h0IERhdmlkIEFicmFoYW1zIDIwMDQuIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdAorIyBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyMgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCit0eXBlIFJTUCA6IHJzcCA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3VuaXguamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy91bml4LmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTk0OTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy91bml4LmphbQpAQCAtMCwwICsxLDIyNCBAQAorIyAgQ29weXJpZ2h0IChjKSAyMDA0IFZsYWRpbWlyIFBydXMuCisjCisjICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlCisjICBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjICBUaGlzIGZpbGUgaW1wbGVtZW50cyBsaW5raW5nIHNlbWFudGljIGNvbW1vbiB0byBhbGwgdW5peGVzLiBPbiB1bml4LCBzdGF0aWMKKyMgIGxpYnJhcmllcyBtdXN0IGJlIHNwZWNpZmllZCBpbiBhIGZpeGVkIG9yZGVyIG9uIHRoZSBsaW5rZXIgY29tbWFuZCBsaW5lLiBHZW5lcmF0b3JzCisjICBkZWNsYXJlZCB0aGVyZSBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JkZXIgYW5kIHVzZSBpdCBwcm9wZXJ0eS4KKworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworaW1wb3J0IGdlbmVyYXRvcnMgOworaW1wb3J0IHR5cGUgOworaW1wb3J0IHNldCA7CitpbXBvcnQgb3JkZXIgOworaW1wb3J0IGJ1aWx0aW4gOworCitjbGFzcyB1bml4LWxpbmtpbmctZ2VuZXJhdG9yIDogbGlua2luZy1nZW5lcmF0b3IKK3sKKyAgICBpbXBvcnQgcHJvcGVydHktc2V0IDsKKyAgICBpbXBvcnQgdHlwZSA7CisgICAgaW1wb3J0IHVuaXggOworICAgIAorICAgIHJ1bGUgX19pbml0X18gKCBpZCAKKyAgICAgICAgY29tcG9zaW5nID8gOiAjIFNwZWNpZnkgaWYgZ2VuZXJhdG9yIGlzIGNvbXBvc2luZy4gVGhlIGdlbmVyYXRvciB3aWxsIGJlCisgICAgICAgICMgY29tcG9zaW5nIGlmIG5vbi1lbXB0eSBzdHJpbmcgaXMgcGFzc2VkLCBvciBwYXJhbWV0ZXIgaXMKKyAgICAgICAgIyBub3QgZ2l2ZW4uIFRvIG1ha2UgZ2VuZXJhdG9yIG5vbi1jb21wb3NpbmcsIHBhc3MgZW1wdHkKKyAgICAgICAgIyBzdHJpbmcgKCIiKQorICAgICAgICBzb3VyY2UtdHlwZXMgKyA6IHRhcmdldC10eXBlcyArIDogCisgICAgICAgIHJlcXVpcmVtZW50cyAqICkKKyAgICB7CisgICAgICAgIGNvbXBvc2luZyA/PSB0cnVlIDsKKyAgICAgICAgZ2VuZXJhdG9yLl9faW5pdF9fICQoaWQpICQoY29tcG9zaW5nKSA6ICQoc291cmNlLXR5cGVzKSA6ICQodGFyZ2V0LXR5cGVzKSA6CisgICAgICAgICAgJChyZXF1aXJlbWVudHMpIDsKKyAgICB9CisgICAgCisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKyApCisgICAgeyAgIAorICAgICAgICBsb2NhbCByZXN1bHQgPSBbIGxpbmtpbmctZ2VuZXJhdG9yLnJ1biAkKHByb2plY3QpICQobmFtZSkgOiAkKHByb3BlcnR5LXNldCkKKyAgICAgICAgICA6ICQoc291cmNlcykgXSA7CisgICAgICAgIAorICAgICAgICB1bml4LnNldC1saWJyYXJ5LW9yZGVyICQoc291cmNlcykgOiAkKHByb3BlcnR5LXNldCkgOiAkKHJlc3VsdFsyLV0pIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworICAgIH0KKyAgICAKKyAgICBydWxlIGdlbmVyYXRlZC10YXJnZXRzICggc291cmNlcyArIDogcHJvcGVydHktc2V0IDogcHJvamVjdCBuYW1lID8gKQorICAgIHsKKyAgICAgICAgbG9jYWwgc291cmNlczIgOworICAgICAgICBsb2NhbCBsaWJyYXJpZXMgOworICAgICAgICBmb3IgbG9jYWwgbCBpbiAkKHNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIFsgdHlwZS5pcy1kZXJpdmVkIFsgJChsKS50eXBlIF0gTElCIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaWJyYXJpZXMgKz0gJChsKSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc291cmNlczIgKz0gJChsKSA7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHNvdXJjZXMgPSAkKHNvdXJjZXMyKSBbIHVuaXgub3JkZXItbGlicmFyaWVzICQobGlicmFyaWVzKSBdIDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBbIGxpbmtpbmctZ2VuZXJhdG9yLmdlbmVyYXRlZC10YXJnZXRzICQoc291cmNlcykgOiAkKHByb3BlcnR5LXNldCkKKyAgICAgICAgICA6ICQocHJvamVjdCkgJChuYW1lKSBdIDsKKyAgICB9CisgICAgCit9IAorCitjbGFzcyB1bml4LWFyY2hpdmUtZ2VuZXJhdG9yIDogYXJjaGl2ZS1nZW5lcmF0b3IKK3sKKyAgICBpbXBvcnQgdW5peCA7IAorCisgICAgcnVsZSBfX2luaXRfXyAoIGlkIGNvbXBvc2luZyA/IDogc291cmNlLXR5cGVzICsgOiB0YXJnZXQtdHlwZXMgKyA6IAorICAgICAgICByZXF1aXJlbWVudHMgKiApCisgICAgeworICAgICAgICBjb21wb3NpbmcgPz0gdHJ1ZSA7CisgICAgICAgIGFyY2hpdmUtZ2VuZXJhdG9yLl9faW5pdF9fICQoaWQpICQoY29tcG9zaW5nKSA6ICQoc291cmNlLXR5cGVzKSA6ICQodGFyZ2V0LXR5cGVzKSA6CisgICAgICAgICAgJChyZXF1aXJlbWVudHMpIDsKKyAgICB9CisgICAgICAgIAorICAgIHJ1bGUgcnVuICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICsgKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBsb2NhbCByZXN1bHQgPSBbIGFyY2hpdmUtZ2VuZXJhdG9yLnJ1biAkKHByb2plY3QpICQobmFtZSkgOiAkKHByb3BlcnR5LXNldCkKKyAgICAgICAgICA6ICQoc291cmNlcykgXSA7CisgICAgICAgIAorICAgICAgICB1bml4LnNldC1saWJyYXJ5LW9yZGVyICQoc291cmNlcykgOiAkKHByb3BlcnR5LXNldCkgOiAkKHJlc3VsdFsyLV0pIDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworCisgICAgfSAgICAKK30KKworY2xhc3MgdW5peC1zZWFyY2hlZC1saWItZ2VuZXJhdG9yIDogc2VhcmNoZWQtbGliLWdlbmVyYXRvcgoreworICAgIGltcG9ydCB1bml4IDsKKyAgICBydWxlIF9faW5pdF9fICggKiA6ICogKQorICAgIHsgCisgICAgICAgIGdlbmVyYXRvci5fX2luaXRfXyAKKyAgICAgICAgICAkKDEpIDogJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOworICAgIH0KKyAgICAKKyAgICBydWxlIG9wdGlvbmFsLXByb3BlcnRpZXMgKCApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLnJlcXVpcmVtZW50cykgOworICAgIH0KKyAgICAgICAgICAgICAgCisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKiApCisgICAgeworICAgICAgICBsb2NhbCByZXN1bHQgPSBbIHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IucnVuICQocHJvamVjdCkgJChuYW1lKSAKKyAgICAgICAgICA6ICQocHJvcGVydHktc2V0KSA6ICQoc291cmNlcykgXSA7CisgICAgICAgIAorICAgICAgICB1bml4LnNldC1saWJyYXJ5LW9yZGVyICQoc291cmNlcykgOiAkKHByb3BlcnR5LXNldCkgOiAkKHJlc3VsdFsyLV0pIDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworICAgIH0gICAgCit9CisKK2NsYXNzIHVuaXgtcHJlYnVpbHQtbGliLWdlbmVyYXRvciA6IGdlbmVyYXRvcgoreworICAgIGltcG9ydCB1bml4IDsKKyAgICBydWxlIF9faW5pdF9fICggKiA6ICogKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdG9yLl9faW5pdF9fICQoMSkgOiAkKDIpIDogJCgzKSA6ICQoNCkgOiAkKDUpIDogJCg2KSA6ICQoNykgOiAkKDgpIDogJCg5KSA7CisgICAgfQorCisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZXMgKiApCisgICAgeworICAgICAgICBsb2NhbCBmID0gWyAkKHByb3BlcnR5LXNldCkuZ2V0IDxmaWxlPiBdIDsKKyAgICAgICAgdW5peC5zZXQtbGlicmFyeS1vcmRlci1hdXggJChmKSA6ICQoc291cmNlcykgOworICAgICAgICByZXR1cm4gJChmKSAkKHNvdXJjZXMpIDsKKyAgICB9ICAgIAorfQorCitnZW5lcmF0b3JzLnJlZ2lzdGVyIAorICBbIG5ldyB1bml4LXByZWJ1aWx0LWxpYi1nZW5lcmF0b3IgdW5peC5wcmVidWlsdCA6IDogTElCIAorICAgICAgOiA8ZmlsZT4gPHRvb2xzZXQ+dW5peCBdIDsKKworZ2VuZXJhdG9ycy5vdmVycmlkZSB1bml4LnByZWJ1aWx0IDogYnVpbHRpbi5saWItZ2VuZXJhdG9yIDsKKworCisjIERlY2xhcmUgZ2VuZXJhdG9ycworZ2VuZXJhdG9ycy5yZWdpc3RlciBbIG5ldyB1bml4LWxpbmtpbmctZ2VuZXJhdG9yIHVuaXgubGluayA6IExJQiBPQkogOiBFWEUgCisgICAgOiA8dG9vbHNldD51bml4IF0gOworCitnZW5lcmF0b3JzLnJlZ2lzdGVyIFsgbmV3IHVuaXgtYXJjaGl2ZS1nZW5lcmF0b3IgdW5peC5hcmNoaXZlIDogT0JKIDogU1RBVElDX0xJQiAKKyAgICA6IDx0b29sc2V0PnVuaXggXSA7CisKK2dlbmVyYXRvcnMucmVnaXN0ZXIgWyBuZXcgdW5peC1saW5raW5nLWdlbmVyYXRvciB1bml4LmxpbmsuZGxsIDogTElCIE9CSiA6IFNIQVJFRF9MSUIgCisgICAgOiA8dG9vbHNldD51bml4IF0gOworCitnZW5lcmF0b3JzLnJlZ2lzdGVyIFsgbmV3IHVuaXgtc2VhcmNoZWQtbGliLWdlbmVyYXRvciAKKyAgIHVuaXguc2VhcmNoZWQtbGliLWdlbmVyYXRvciA6IDogU0VBUkNIRURfTElCIDogPHRvb2xzZXQ+dW5peCBdIDsKKworCisjIFRoZSBkZXJpdmVkIHRvb2xzZXQgbXVzdCBzcGVjaWZ5IHRoZWlyIG93biBhY3Rpb25zLgorYWN0aW9ucyBsaW5rIHsKK30KKworYWN0aW9ucyBsaW5rLmRsbCB7Cit9CisKK2FjdGlvbnMgYXJjaGl2ZSB7ICAgIAorfQorCithY3Rpb25zIHNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgeyAgICAKK30KKworYWN0aW9ucyBwcmVidWlsdCB7Cit9CisKKyAgICAKKworCisKKy5vcmRlciA9IFsgbmV3IG9yZGVyIF0gOworCitydWxlIHNldC1saWJyYXJ5LW9yZGVyLWF1eCAoIGZyb20gKiA6IHRvICogKQoreyAgICAgICAgCisgICAgZm9yIGxvY2FsIGYgaW4gJChmcm9tKQorICAgIHsKKyAgICAgICAgZm9yIGxvY2FsIHQgaW4gJCh0bykKKyAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgJChmKSAhPSAkKHQpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICQoLm9yZGVyKS5hZGQtcGFpciAkKGYpICQodCkgOworICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAKKyAgICB9ICAgIAorfQorCitydWxlIHNldC1saWJyYXJ5LW9yZGVyICggc291cmNlcyAqIDogcHJvcGVydHktc2V0IDogcmVzdWx0ICogKQoreworICAgIGxvY2FsIHVzZWQtbGlicmFyaWVzIDsKKyAgICBsb2NhbCBkZXBzID0gWyAkKHByb3BlcnR5LXNldCkuZGVwZW5kZW5jeSBdIDsgICAgICAgIAorICAgIGZvciBsb2NhbCBsIGluICQoc291cmNlcykgJChkZXBzOkc9KSAgICAgICAgCisgICAgeworICAgICAgICBpZiBbICQobCkudHlwZSBdICYmIFsgdHlwZS5pcy1kZXJpdmVkIFsgJChsKS50eXBlIF0gTElCIF0KKyAgICAgICAgeworICAgICAgICAgICAgdXNlZC1saWJyYXJpZXMgKz0gJChsKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsb2NhbCBjcmVhdGVkLWxpYnJhcmllcyA7CisgICAgZm9yIGxvY2FsIGwgaW4gJChyZXN1bHQpCisgICAgeworICAgICAgICBpZiBbICQobCkudHlwZSBdICYmIFsgdHlwZS5pcy1kZXJpdmVkIFsgJChsKS50eXBlIF0gTElCIF0gCisgICAgICAgIHsKKyAgICAgICAgICAgIGNyZWF0ZWQtbGlicmFyaWVzICs9ICQobCkgOworICAgICAgICB9ICAgICAgICAgICAgCisgICAgfQorICAgIAorICAgIGNyZWF0ZWQtbGlicmFyaWVzID0gWyBzZXQuZGlmZmVyZW5jZSAkKGNyZWF0ZWQtbGlicmFyaWVzKSA6ICQodXNlZC1saWJyYXJpZXMpIF0gOworICAgIHNldC1saWJyYXJ5LW9yZGVyLWF1eCAkKGNyZWF0ZWQtbGlicmFyaWVzKSA6ICQodXNlZC1saWJyYXJpZXMpIDsKK30KKworcnVsZSBvcmRlci1saWJyYXJpZXMgKCBsaWJyYXJpZXMgKiApCit7CisgICAgbG9jYWwgciA9IFsgJCgub3JkZXIpLm9yZGVyICQobGlicmFyaWVzKSBdIDsKKyAgICByZXR1cm4gJChyKSA7Cit9CisgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdmFjcHAuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy92YWNwcC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwODBmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvdmFjcHAuamFtCkBAIC0wLDAgKzEsMTUwIEBACisjIENvcHlyaWdodCBWbGFkaW1pciBQcnVzIDIwMDQuCisjIENvcHlyaWdodCBUb29uIEtuYXBlbiAyMDA0LgorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0CisjIG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjCisjIEJvb3N0LkJ1aWxkIFYyIHRvb2xzZXQgZm9yIHRoZSBJQk0gWEwgQysrIGNvbXBpbGVyCisjCisKK2ltcG9ydCB0b29sc2V0IDogZmxhZ3MgOworaW1wb3J0IGZlYXR1cmUgOworaW1wb3J0IGNvbW1vbiA7CitpbXBvcnQgZ2VuZXJhdG9ycyA7CitpbXBvcnQgb3MgOworCitmZWF0dXJlLmV4dGVuZCB0b29sc2V0IDogdmFjcHAgOwordG9vbHNldC5pbmhlcml0IHZhY3BwIDogdW5peCA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIHZhY3BwLnByZWJ1aWx0IDogYnVpbHRpbi5wcmVidWlsdCA7CitnZW5lcmF0b3JzLm92ZXJyaWRlIHZhY3BwLnNlYXJjaGVkLWxpYi1nZW5lcmF0b3IgOiBzZWFyY2hlZC1saWItZ2VuZXJhdG9yIDsKKworIyBDb25maWd1cmUgdGhlIHZhY3BwIHRvb2xzZXQKK3J1bGUgaW5pdCAoIHZlcnNpb24gPyA6IGNvbW1hbmQgKiA6IG9wdGlvbnMgKiApCit7CisgICAgbG9jYWwgY29uZGl0aW9uID0gWyAKKyAgICAgICAgY29tbW9uLmNoZWNrLWluaXQtcGFyYW1ldGVycyB2YWNwcCA6IHZlcnNpb24gJCh2ZXJzaW9uKSBdIDsKKyAgICAgICAgICAgICAgCisgICAgY29tbWFuZCA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgdmFjcHAgOiB4bEMKKyAgICAgICAgOiAkKGNvbW1hbmQpIDogIi91c3IvdmFjcHAvYmluL3hsQyIgXSA7CisgICAgICAgIAorICAgIGNvbW1vbi5oYW5kbGUtb3B0aW9ucyB2YWNwcCA6ICQoY29uZGl0aW9uKSA6ICQoY29tbWFuZCkgOiAkKG9wdGlvbnMpIDsKK30KKworIyBEZWNsYXJlIGdlbmVyYXRvcnMKK2dlbmVyYXRvcnMucmVnaXN0ZXItYy1jb21waWxlciB2YWNwcC5jb21waWxlLmMgOiBDIDogT0JKIDogPHRvb2xzZXQ+dmFjcHAgOworZ2VuZXJhdG9ycy5yZWdpc3Rlci1jLWNvbXBpbGVyIHZhY3BwLmNvbXBpbGUuYysrIDogQ1BQIDogT0JKIDogPHRvb2xzZXQ+dmFjcHAgOworCisjIEFsbG93IEMrKyBzdHlsZSBjb21tZW50cyBpbiBDIGZpbGVzCitmbGFncyB2YWNwcCBDRkxBR1MgOiAtcWNwbHVzY210IDsKKworIyBEZWNsYXJlIGZsYWdzCitmbGFncyB2YWNwcCBDRkxBR1MgPG9wdGltaXphdGlvbj5vZmYgOiAtcU5PT1BUaW1pemUgOworZmxhZ3MgdmFjcHAgQ0ZMQUdTIDxvcHRpbWl6YXRpb24+c3BlZWQgOiAtTzMgLXFzdHJpY3QgOworZmxhZ3MgdmFjcHAgQ0ZMQUdTIDxvcHRpbWl6YXRpb24+c3BhY2UgOiAtTzIgLXFjb21wYWN0IDsKKworIyBEaXNjcmV0aW9uYXJ5IGlubGluaW5nIChub3QgcmVjb21tZW5kZWQpCitmbGFncyB2YWNwcCBDRkxBR1MgPGlubGluaW5nPm9mZiA6IC1xbm9pbmxpbmUgOworZmxhZ3MgdmFjcHAgQ0ZMQUdTIDxpbmxpbmluZz5vbiA6IC1xaW5saW5lIDsKKyNmbGFncyB2YWNwcCBDRkxBR1MgPGlubGluaW5nPmZ1bGwgOiAtcWlubGluZSA7CitmbGFncyB2YWNwcCBDRkxBR1MgPGlubGluaW5nPmZ1bGwgOiA7CisKKyMgRXhjZXB0aW9uIGhhbmRsaW5nCitmbGFncyB2YWNwcCBDKytGTEFHUyA8ZXhjZXB0aW9uLWhhbmRsaW5nPm9mZiA6IC1xbm9laCA7CitmbGFncyB2YWNwcCBDKytGTEFHUyA8ZXhjZXB0aW9uLWhhbmRsaW5nPm9uIDogLXFlaCA7CisKKyMgUnVuLXRpbWUgVHlwZSBJZGVudGlmaWNhdGlvbgorZmxhZ3MgdmFjcHAgQysrRkxBR1MgPHJ0dGk+b2ZmIDogLXFub3J0dGkgOworZmxhZ3MgdmFjcHAgQysrRkxBR1MgPHJ0dGk+b24gOiAtcXJ0dGkgOworCisjIEVuYWJsZSA2NC1iaXQgbWVtb3J5IGFkZHJlc3NpbmcgbW9kZWwKK2ZsYWdzIHZhY3BwIENGTEFHUyA8YWRkcmVzcy1tb2RlbD42NCA6IC1xNjQgOworZmxhZ3MgdmFjcHAgTElOS0ZMQUdTIDxhZGRyZXNzLW1vZGVsPjY0IDogLXE2NCA7CitmbGFncyB2YWNwcCBBUkZMQUdTIDx0YXJnZXQtb3M+YWl4LzxhZGRyZXNzLW1vZGVsPjY0IDogLVggNjQgOworCisjIFVzZSBhYnNvbHV0ZSBwYXRoIHdoZW4gZ2VuZXJhdGluZyBkZWJ1ZyBpbmZvcm1hdGlvbgorZmxhZ3MgdmFjcHAgQ0ZMQUdTIDxkZWJ1Zy1zeW1ib2xzPm9uIDogLWcgLXFmdWxscGF0aCA7CitmbGFncyB2YWNwcCBMSU5LRkxBR1MgPGRlYnVnLXN5bWJvbHM+b24gOiAtZyAtcWZ1bGxwYXRoIDsKK2ZsYWdzIHZhY3BwIExJTktGTEFHUyA8ZGVidWctc3ltYm9scz5vZmYgOiAtcyA7CisKK2lmIFsgb3MubmFtZSBdID0gQUlYCit7CisgICAgZmxhZ3MgdmFjcHAuY29tcGlsZSBDKytGTEFHUyA6IC1xZnVuY3NlY3QgOworCisgICAgIyBUaGUgLWJub2lwYXRoIHN0cmlwcyB0aGUgcHJlcGVuZGluZyAocmVsYXRpdmUpIHBhdGggb2YgbGlicmFyaWVzIGZyb20KKyAgICAjIHRoZSBsb2FkZXIgc2VjdGlvbiBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkgb3IgZXhlY3V0YWJsZS4gSGVuY2UsIGR1cmluZworICAgICMgbG9hZC10aW1lIExJQlBBVEggKGlkZW50aWNhbCB0byBMRF9MSUJSQVJZX1BBVEgpIG9yIGEgaGFyZC1jb2RlZAorICAgICMgLWJsaWJwYXRoICgqc2ltaWxhciogdG8gLWxycGF0aC8tbHJwYXRoLWxpbmspIGlzIHNlYXJjaGVkLiBXaXRob3V0CisgICAgIyB0aGlzIG9wdGlvbiwgdGhlIHByZXBlbmRpbmcgKHJlbGF0aXZlKSBwYXRoICsgbGlicmFyeSBuYW1lIGlzCisgICAgIyBoYXJkLWNvZGVkIGluIHRoZSBsb2FkZXIgc2VjdGlvbiwgY2F1c2luZyAqb25seSogdGhpcyBwYXRoIHRvIGJlCisgICAgIyBzZWFyY2hlZCBkdXJpbmcgbG9hZC10aW1lLiBOb3RlIHRoYXQgdGhlIEFJWCBsaW5rZXIgZG9lcyBub3QgaGF2ZSBhbgorICAgICMgLXNvbmFtZSBlcXVpdmFsZW50LCB0aGlzIGlzIGFzIGNsb3NlIGFzIGl0IGdldHMuCisgICAgIworICAgICMgVGhlIGFib3ZlIG9wdGlvbnMgYXJlIGRlZmluYXRlbHkgZm9yIEFJWCA1LngsIGFuZCBtb3N0IGxpa2VseSBhbHNvIGZvcgorICAgICMgQUlYIDQueCBhbmQgQUlYIDYueC4gRm9yIGRldGFpbHMgYWJvdXQgdGhlIEFJWCBsaW5rZXIgc2VlOgorICAgICMgaHR0cDovL2Rvd25sb2FkLmJvdWxkZXIuaWJtLmNvbS9pYm1kbC9wdWIvc29mdHdhcmUvZHcvYWl4L2VzLWFpeF9sbC5wZGYKKyAgICAjCisgICAgZmxhZ3MgdmFjcHAubGluayBMSU5LRkxBR1MgPGxpbms+c2hhcmVkIDogLWJub2lwYXRoIDsKKworICAgICMgUnVuLXRpbWUgbGlua2luZworICAgIGZsYWdzIHZhY3BwLmxpbmsgRVhFLUxJTktGTEFHUyA8bGluaz5zaGFyZWQgOiAtYnJ0bCA7Cit9CitlbHNlCit7CisgICAgIyBMaW51eCBQUEMKKyAgICBmbGFncyB2YWNwcC5jb21waWxlIENGTEFHUyA8bGluaz5zaGFyZWQgOiAtcXBpYz1sYXJnZSA7CisgICAgZmxhZ3MgdmFjcHAgRklORExJQlMgOiBydCA7Cit9CisKKyMgUHJvZmlsaW5nCitmbGFncyB2YWNwcCBDRkxBR1MgPHByb2ZpbGluZz5vbiA6IC1wZyA7CitmbGFncyB2YWNwcCBMSU5LRkxBR1MgPHByb2ZpbGluZz5vbiA6IC1wZyA7CisKK2ZsYWdzIHZhY3BwLmNvbXBpbGUgT1BUSU9OUyA8Y2ZsYWdzPiA7CitmbGFncyB2YWNwcC5jb21waWxlLmMrKyBPUFRJT05TIDxjeHhmbGFncz4gOworZmxhZ3MgdmFjcHAgREVGSU5FUyA8ZGVmaW5lPiA7CitmbGFncyB2YWNwcCBVTkRFRlMgPHVuZGVmPiA7CitmbGFncyB2YWNwcCBIRFJTIDxpbmNsdWRlPiA7CitmbGFncyB2YWNwcCBTVERIRFJTIDxzeXNpbmNsdWRlPiA7CitmbGFncyB2YWNwcC5saW5rIE9QVElPTlMgPGxpbmtmbGFncz4gOworZmxhZ3MgdmFjcHAgQVJGTEFHUyA8YXJmbGFncz4gOworCitmbGFncyB2YWNwcCBMSUJQQVRIIDxsaWJyYXJ5LXBhdGg+IDsKK2ZsYWdzIHZhY3BwIE5FRURMSUJTIDxsaWJyYXJ5LWZpbGU+IDsKK2ZsYWdzIHZhY3BwIEZJTkRMSUJTIDxmaW5kLXNoYXJlZC1saWJyYXJ5PiA7CitmbGFncyB2YWNwcCBGSU5ETElCUyA8ZmluZC1zdGF0aWMtbGlicmFyeT4gOworCisjIFNlbGVjdCB0aGUgY29tcGlsZXIgbmFtZSBhY2NvcmRpbmcgdG8gdGhlIHRocmVhZGluZyBtb2RlbC4KK2ZsYWdzIHZhY3BwIFZBX0NfQ09NUElMRVIgIDx0aHJlYWRpbmc+c2luZ2xlIDogeGxjICAgOworZmxhZ3MgdmFjcHAgVkFfQ19DT01QSUxFUiAgPHRocmVhZGluZz5tdWx0aSA6IHhsY19yIDsKK2ZsYWdzIHZhY3BwIFZBX0NYWF9DT01QSUxFUiA8dGhyZWFkaW5nPnNpbmdsZSA6IHhsQyAgIDsKK2ZsYWdzIHZhY3BwIFZBX0NYWF9DT01QSUxFUiA8dGhyZWFkaW5nPm11bHRpIDogeGxDX3IgOworCitTUEFDRSA9ICIgIiA7CisKK2ZsYWdzIHZhY3BwLmxpbmsuZGxsIEhBVkVfU09OQU1FIDx0YXJnZXQtb3M+bGludXggOiAiIiA7CisKK2FjdGlvbnMgdmFjcHAubGluayBiaW5kIE5FRURMSUJTCit7CisgICAgJChWQV9DWFhfQ09NUElMRVIpICQoRVhFLUxJTktGTEFHUykgJChMSU5LRkxBR1MpIC1vICIkKDxbMV0pIiAtTCQoTElCUEFUSCkgLUwkKFNURExJQlBBVEgpICIkKD4pIiAiJChORUVETElCUykiICIkKE5FRURMSUJTKSIgLWwkKEZJTkRMSUJTKSAkKE9QVElPTlMpICQoVVNFUl9PUFRJT05TKQorfQorCithY3Rpb25zIHZhY3BwLmxpbmsuZGxsIGJpbmQgTkVFRExJQlMKK3sKKyAgICB4bENfciAtRyAkKExJTktGTEFHUykgLW8gIiQoPFsxXSkiICQoSEFWRV9TT05BTUUpLVdsLC1zb25hbWUkKFNQQUNFKS1XbCwkKDxbLTFdOkQ9KSAtTCQoTElCUEFUSCkgLUwkKFNURExJQlBBVEgpICIkKD4pIiAiJChORUVETElCUykiICIkKE5FRURMSUJTKSIgLWwkKEZJTkRMSUJTKSAkKE9QVElPTlMpICQoVVNFUl9PUFRJT05TKSAKK30KKworYWN0aW9ucyB2YWNwcC5jb21waWxlLmMKK3sKKyAgICAkKFZBX0NfQ09NUElMRVIpIC1jICQoT1BUSU9OUykgJChVU0VSX09QVElPTlMpIC1JJChCT09TVF9ST09UKSAtVSQoVU5ERUZTKSAtRCQoREVGSU5FUykgJChDRkxBR1MpIC1JIiQoSERSUykiIC1JIiQoU1RESERSUykiIC1vICIkKDwpIiAiJCg+KSIKK30KKworYWN0aW9ucyB2YWNwcC5jb21waWxlLmMrKworeworICAgICQoVkFfQ1hYX0NPTVBJTEVSKSAtYyAkKE9QVElPTlMpICQoVVNFUl9PUFRJT05TKSAtSSQoQk9PU1RfUk9PVCkgLVUkKFVOREVGUykgLUQkKERFRklORVMpICQoQ0ZMQUdTKSAkKEMrK0ZMQUdTKSAtSSIkKEhEUlMpIiAtSSIkKFNUREhEUlMpIiAtbyAiJCg8KSIgIiQoPikiCit9CisKK2FjdGlvbnMgdXBkYXRlZCB0b2dldGhlciBwaWVjZW1lYWwgdmFjcHAuYXJjaGl2ZQoreworICAgIGFyICQoQVJGTEFHUykgcnUgIiQoPCkiICIkKD4pIgorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy93aGFsZS5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3doYWxlLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzM1ZmYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy93aGFsZS5qYW0KQEAgLTAsMCArMSwxMTYgQEAKKyMgIENvcHlyaWdodCAoQykgVmxhZGltaXIgUHJ1cyAyMDAyLTIwMDUuIAorCisjICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlCisjICBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjICBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIFdoYWxlL0RvbHBoaW4vV0QgcGFyc2VyL2xleGVyIHRvb2xzLiAKKyMgIFNlZSBodHRwOi8vd3d3LmNzLnF1ZWVuc3UuY2EvaG9tZS9va2hvdGluL3doYWxlLyBmb3IgZGV0YWlscy4KKyMKKyMgIFRoZXJlIGFyZSB0aHJlZSBpbnRlcmVzdGluZyB0YXJnZXQgdHlwZXM6CisjICAtIFdITCAodGhlIHBhcnNlciBzb3VyY2VzKSwgdGhhdCBhcmUgY29udmVydGVkIHRvIENQUCBhbmQgSAorIyAgLSBETFAgKHRoZSBsZXhlciBzb3VyY2VzKSwgdGhhdCBhcmUgY29udmVydGVkIHRvIENQUCBhbmQgSAorIyAgLSBXRCAoY29tYmluZWQgcGFyc2VyL2xleGVyIHNvdXJjZXMpLCB0aGF0IGFyZSBjb252ZXJ0ZWQgdG8gV0hMICsgRExQCisKK2ltcG9ydCB0eXBlIDsKK2ltcG9ydCBnZW5lcmF0b3JzIDsKK2ltcG9ydCBwYXRoIDsKK2ltcG9ydCAiY2xhc3MiIDogbmV3IDsKK2ltcG9ydCBlcnJvcnMgOworCitydWxlIGluaXQgKCBwYXRoICMgcGF0aCB0aGUgV2hhbGUvRG9scGhpbi9XRCBiaW5hcmllcyAKKyAgICAgICAgICApCit7CisgICAgaWYgJCguY29uZmlndXJlZCkgJiYgJCgucGF0aCkgIT0gJChwYXRoKQorICAgIHsKKyAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgIkF0dGVtcHQgdG8gcmVjb25maWd1cmUgV2hhbGUgc3VwcG9ydCIgOgorICAgICAgICAgICJQcmV2aW91c2x5IGNvbmZpZ3VyZWQgd2l0aCBwYXRoIFwiJCgucGF0aDpFPTxlbXB0eT4pXCIiIDoKKyAgICAgICAgICAiTm93IGNvbmZpZ3VyaW5nIHdpdGggcGF0aCBcIiQocGF0aDpFPTxlbXB0eT4pXCIiIDsKKworICAgIH0KKyAgICAuY29uZmlndXJlZCA9IHRydWUgOworICAgIC5wYXRoID0gJChwYXRoKSA7CisKKyAgICAud2hhbGUgPSBbIHBhdGguam9pbiAkKHBhdGgpIHdoYWxlIF0gOworICAgIC5kb2xwaGluID0gWyBwYXRoLmpvaW4gJChwYXRoKSBkb2xwaGluIF0gOworICAgIC53ZCA9IFsgcGF0aC5qb2luICQocGF0aCkgd2QgXSA7Cit9ICAgICAKKworCisjIERlY2xhcmUgdGhlIHR5cGVzLgordHlwZS5yZWdpc3RlciBXSEwgOiB3aGwgOwordHlwZS5yZWdpc3RlciBETFAgOiBkbHAgOwordHlwZS5yZWdpc3RlciBXSExfTFIwIDogbHIwIDsKK3R5cGUucmVnaXN0ZXIgV0QgOiB3ZCA7CisKKyMgRGVjbGFyZSBzdGFuZGFyZCBnZW5lcmF0b3JzLgorZ2VuZXJhdG9ycy5yZWdpc3Rlci1zdGFuZGFyZCB3aGFsZS53aGFsZSA6IFdITCA6IENQUCBIIEgoJV9zeW1ib2xzKSA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIHdoYWxlLmRvbHBoaW4gOiBETFAgOiBDUFAgSCA7CitnZW5lcmF0b3JzLnJlZ2lzdGVyLXN0YW5kYXJkIHdoYWxlLndkIDogV0QgOiBXSEwoJV9wYXJzZXIpIERMUCglX2xleGVyKSA7CisKKyMgVGhlIGNvbnZlcnNpb25zIGRlZmluZXMgYWJvdmUgYSBhbWJpZ3Vpb3VzIHdoZW4gd2UgZ2VuZXJhdGVkIENQUCBmcm9tIFdELgorIyBXZSBjYW4gZWl0aGVyIGdvIHZpYSBXSEwgdHlwZSwgb3IgdmlhIERMUCB0eXBlLgorIyBUaGUgZm9sbG93aW5nIGN1c3RvbSBnZW5lcmF0b3IgaGFuZGxlcyB0aGlzIGJ5IHJ1bm5pbmcgYm90aCBjb252ZXJzaW9ucy4KKworY2xhc3Mgd2QtdG8tY3BwIDogZ2VuZXJhdG9yCit7CisgICAgcnVsZSBfX2luaXRfXyAoICogOiAqIDogKiApCisgICAgeworICAgICAgICBnZW5lcmF0b3IuX19pbml0X18gJCgxKSA6ICQoMikgOiAkKDMpIDsKKyAgICB9CisgICAgCisgICAgcnVsZSBydW4gKCBwcm9qZWN0IG5hbWUgPyA6IHByb3BlcnR5LXNldCA6IHNvdXJjZSAqICkKKyAgICB7CisgICAgICAgIGlmICEgJChzb3VyY2VbMl0pCisgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBsb2NhbCBuZXctc291cmNlcyA7CisgICAgICAgICAgICBpZiAhIFsgJChzb3VyY2UpLnR5cGUgXSBpbiBXSEwgRExQCisgICAgICAgICAgICB7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbG9jYWwgcjEgPSBbIGdlbmVyYXRvcnMuY29uc3RydWN0ICQocHJvamVjdCkgJChuYW1lKSAKKyAgICAgICAgICAgICAgICAgIDogV0hMIDogJChwcm9wZXJ0eS1zZXQpIDogJChzb3VyY2UpIF0gOworICAgICAgICAgICAgICAgIGxvY2FsIHIyID0gWyBnZW5lcmF0b3JzLmNvbnN0cnVjdCAkKHByb2plY3QpICQobmFtZSkgCisgICAgICAgICAgICAgICAgICA6IERMUCA6ICQocHJvcGVydHktc2V0KSA6ICQoc291cmNlKSBdIDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBuZXctc291cmNlcyA9IFsgc2VxdWVuY2UudW5pcXVlICQocjFbMi1dKSAkKHIyWzItXSkgXSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3LXNvdXJjZXMgPSAkKHNvdXJjZSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBsb2NhbCByZXN1bHQgOworICAgICAgICAgICAgZm9yIGxvY2FsIGkgaW4gJChuZXctc291cmNlcykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYWwgdCA9IFsgZ2VuZXJhdG9ycy5jb25zdHJ1Y3QgJChwcm9qZWN0KSAkKG5hbWUpIDogQ1BQIAorICAgICAgICAgICAgICAgICAgOiAkKHByb3BlcnR5LXNldCkgOiAkKGkpIF0gOyAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gJCh0WzItXSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICQocmVzdWx0KSA7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICAKK30KKworCitnZW5lcmF0b3JzLm92ZXJyaWRlIHdoYWxlLndkLXRvLWNwcCA6IHdoYWxlLndoYWxlIDsKK2dlbmVyYXRvcnMub3ZlcnJpZGUgd2hhbGUud2QtdG8tY3BwIDogd2hhbGUuZG9scGhpbiA7CisKKworZ2VuZXJhdG9ycy5yZWdpc3RlciBbIG5ldyB3ZC10by1jcHAgd2hhbGUud2QtdG8tY3BwIDogOiBDUFAgXSA7CisKKworYWN0aW9ucyB3aGFsZSAKK3sKKyAgICAkKC53aGFsZSkgLWQgJCg8WzFdOkQpICQoPikgICAgICAKK30KKworYWN0aW9ucyBkb2xwaGluCit7ICAgIAorICAgICQoLmRvbHBoaW4pIC1kICQoPFsxXTpEKSAkKD4pCit9CisKK2FjdGlvbnMgd2QKK3sgICAgCisgICAgJCgud2QpIC1kICQoPFsxXTpEKSAtZyAkKD4pCit9CisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMveGxmLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMveGxmLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ZjYzYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy94bGYuamFtCkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA0IFRvb24gS25hcGVuCisjCisjICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlCisjICBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjCisjIHRvb2xzZXQgY29uZmlndXJhdGlvbiBmb3IgdGhlIElCTSBGb3J0cmFuIGNvbXBpbGVyICh4bGYpCisjIAorCitpbXBvcnQgdG9vbHNldCA6IGZsYWdzIDsKK2ltcG9ydCBmZWF0dXJlIDsKK2ltcG9ydCBmb3J0cmFuIDsKKworcnVsZSBpbml0ICggdmVyc2lvbiA/IDogY29tbWFuZCAqIDogb3B0aW9ucyAqICkKK3sKK30KKworIyBEZWNsYXJlIGZsYWdzIGFuZCBhY3Rpb24gZm9yIGNvbXBpbGF0aW9uCitmbGFncyB4bGYgT1BUSU9OUyA8b3B0aW1pemF0aW9uPm9mZiA6IC1PMCA7CitmbGFncyB4bGYgT1BUSU9OUyA8b3B0aW1pemF0aW9uPnNwZWVkIDogLU8zIDsKK2ZsYWdzIHhsZiBPUFRJT05TIDxvcHRpbWl6YXRpb24+c3BhY2UgOiAtT3MgOworCitmbGFncyB4bGYgT1BUSU9OUyA8ZGVidWctc3ltYm9scz5vbiA6IC1nIDsKK2ZsYWdzIHhsZiBPUFRJT05TIDxwcm9maWxpbmc+b24gOiAtcGcgOworCitmbGFncyB4bGYgREVGSU5FUyA8ZGVmaW5lPiA7CitmbGFncyB4bGYgSU5DTFVERVMgPGluY2x1ZGU+IDsKKworcnVsZSBjb21waWxlLWZvcnRyYW4KK3sKK30KKworYWN0aW9ucyBjb21waWxlLWZvcnRyYW4KK3sKKyAgeGxmICQoT1BUSU9OUykgLUkkKElOQ0xVREVTKSAtYyAtbyAiJCg8KSIgIiQoPikiIAorfQorCitnZW5lcmF0b3JzLnJlZ2lzdGVyLWZvcnRyYW4tY29tcGlsZXIgeGxmLmNvbXBpbGUtZm9ydHJhbiA6IEZPUlRSQU4gOiBPQkogOyAKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMveHNsdHByb2MtY29uZmlnLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMveHNsdHByb2MtY29uZmlnLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWJlMjVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy94c2x0cHJvYy1jb25maWcuamFtCkBAIC0wLDAgKzEsMzYgQEAKKyN+IENvcHlyaWdodCAyMDA1IFJlbmUgUml2ZXJhLgorI34gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorI34gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIEF1dG9tYXRpYyBjb25maWd1cmF0aW9uIGZvciB0aGUgeHNsdHByb2MgdG9vbHNldC4gVG8gdXNlLCBqdXN0IGltcG9ydCB0aGlzCisjIG1vZHVsZS4KKworaW1wb3J0IG9zIDsKK2ltcG9ydCB0b29sc2V0IDogdXNpbmcgOworCisKK2xvY2FsIHJ1bGUgbG9jYXRlLWV4ZWN1dGFibGUgKCBuYW1lICkKK3sKKyAgICBsb2NhbCBwYXRoID0gWyBtb2R1bGVzLnBlZWsgOiBQQVRIIF0gOworICAgIGxvY2FsIGV4ZSA7CisgICAgaWYgWyBvcy5uYW1lIF0gPSBOVAorICAgIHsKKyAgICAgICAgZXhlID0gWyBHTE9CICQocGF0aCkgIkM6XFxCb29zdFxcYmluIiA6ICQobmFtZSlcLmV4ZSBdIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXhlID0gWyBHTE9CICQocGF0aCkgOiAkKG5hbWUpIF0gOworICAgIH0KKyAgICByZXR1cm4gJChleGVbMV0pIDsKK30KKworCitsb2NhbCB4c2x0cHJvYy1leGUgPSBbIGxvY2F0ZS1leGVjdXRhYmxlIHhzbHRwcm9jIF0gOworaWYgJCh4c2x0cHJvYy1leGUpCit7CisgICAgaWYgLS1kZWJ1Zy1jb25maWd1cmF0aW9uIGluIFsgbW9kdWxlcy5wZWVrIDogQVJHViBdCisgICAgeworICAgICAgICBFQ0hPIG5vdGljZTogdXNpbmcgeHNsdHByb2MgIjoiICQoeHNsdHByb2MtZXhlKSA7CisgICAgfQorICAgIHVzaW5nIHhzbHRwcm9jIDogJCh4c2x0cHJvYy1leGUpIDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMveHNsdHByb2MuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy94c2x0cHJvYy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0NzY0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMveHNsdHByb2MuamFtCkBAIC0wLDAgKzEsMjA1IEBACisjIENvcHlyaWdodCAoQykgMjAwMyBEb3VnIEdyZWdvci4gUGVybWlzc2lvbiB0byBjb3B5LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQKKyMgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4KKyMgYWxsIGNvcGllcy4gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgorCisjIFRoaXMgbW9kdWxlIGRlZmluZXMgcnVsZXMgdG8gYXBwbHkgYW4gWFNMVCBzdHlsZXNoZWV0IHRvIGFuIFhNTCBmaWxlIHVzaW5nIHRoZQorIyB4c2x0cHJvYyBkcml2ZXIsIHBhcnQgb2YgbGlieHNsdC4KKworaW1wb3J0IGNvbW1vbiA7CitpbXBvcnQgZmVhdHVyZSA7CitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgb3MgOworaW1wb3J0IHBhdGggOworaW1wb3J0IHJlZ2V4IDsKK2ltcG9ydCBzZXF1ZW5jZSA7CisKKworZmVhdHVyZS5mZWF0dXJlIHhzbDpwYXJhbSA6IDogZnJlZSA7CitmZWF0dXJlLmZlYXR1cmUgeHNsOnBhdGggOiA6IGZyZWUgOworZmVhdHVyZS5mZWF0dXJlIGNhdGFsb2cgOiA6IGZyZWUgOworCisKKyMgSW5pdGlhbGl6ZSB4c2x0cHJvYyBzdXBwb3J0LiBUaGUgcGFyYW1ldGVycyBhcmU6CisjICAgeHNsdHByb2M6IFRoZSB4c2x0cHJvYyBleGVjdXRhYmxlCisjCitydWxlIGluaXQgKCB4c2x0cHJvYyA/ICkKK3sKKyAgICBpZiAkKHhzbHRwcm9jKQorICAgIHsKKyAgICAgICAgbW9kaWZ5LWNvbmZpZyA7CisgICAgICAgIC54c2x0cHJvYyA9ICQoeHNsdHByb2MpIDsKKyAgICAgICAgY2hlY2steHNsdHByb2MgOworICAgIH0KK30KKworCitydWxlIGZyZWV6ZS1jb25maWcgKCApCit7CisgICAgaWYgISAkKC5jb25maWctZnJvemVuKQorICAgIHsKKyAgICAgICAgLmNvbmZpZy1mcm96ZW4gPSB0cnVlIDsKKyAgICAgICAgLnhzbHRwcm9jID89IFsgbW9kdWxlcy5wZWVrIDogWFNMVFBST0MgXSA7CisgICAgICAgIC54c2x0cHJvYyA/PSB4c2x0cHJvYyA7CisgICAgICAgIGNoZWNrLXhzbHRwcm9jIDsKKyAgICAgICAgLmlzLWN5Z3dpbiA9IFsgLmlzLWN5Z3dpbiAkKC54c2x0cHJvYykgXSA7CisgICAgfQorfQorCisKK3J1bGUgbW9kaWZ5LWNvbmZpZyAoICkKK3sKKyAgICBpZiAkKC5jb25maWctZnJvemVuKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy51c2VyLWVycm9yCisgICAgICAgICAgICAieHNsdHByb2M6IENhbm5vdCBjaGFuZ2UgeHNsdHByb2MgY29tbWFuZCBhZnRlciBpdCBoYXMgYmVlbiB1c2VkLiIgOworICAgIH0KK30KKworCitydWxlIGNoZWNrLXhzbHRwcm9jICggKQoreworICAgIGlmICQoLnhzbHRwcm9jKQorICAgIHsKKyAgICAgICAgbG9jYWwgc3RhdHVzID0gWyBTSEVMTCAiXCIkKC54c2x0cHJvYylcIiAtViIgOiBuby1vdXRwdXQgOiBleGl0LXN0YXR1cyBdCisgICAgICAgICAgICA7CisgICAgICAgIGlmICQoc3RhdHVzWzJdKSAhPSAwCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgInhzbHRwcm9jOiBDb3VsZCBub3QgcnVuIFwiJCgueHNsdHByb2MpXCIgLVYuIiA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyBSZXR1cm5zIGEgbm9uLWVtcHR5IHN0cmluZyBpZiBhIGN5Z3dpbiB4c2x0cHJvYyBiaW5hcnkgd2FzIHNwZWNpZmllZC4KKyMKK3J1bGUgaXMtY3lnd2luICggKQoreworICAgIGZyZWV6ZS1jb25maWcgOworICAgIHJldHVybiAkKC5pcy1jeWd3aW4pIDsKK30KKworCitydWxlIC5pcy1jeWd3aW4gKCB4c2x0cHJvYyApCit7CisgICAgaWYgWyBvcy5vbi13aW5kb3dzIF0KKyAgICB7CisgICAgICAgIGxvY2FsIGZpbGUgPSBbIHBhdGgubWFrZSBbIG1vZHVsZXMuYmluZGluZyAkKF9fbmFtZV9fKSBdIF0gOworICAgICAgICBsb2NhbCBkaXIgPSBbIHBhdGgubmF0aXZlIFsgcGF0aC5qb2luIFsgcGF0aC5wYXJlbnQgJChmaWxlKSBdIHhzbHRwcm9jIF0KKyAgICAgICAgICAgIF0gOworICAgICAgICBpZiBbIG9zLm5hbWUgXSA9IENZR1dJTgorICAgICAgICB7CisgICAgICAgICAgICBkaXIgPSAkKGRpcjpXKSA7CisgICAgICAgIH0KKyAgICAgICAgbG9jYWwgY29tbWFuZCA9CisgICAgICAgICAgICAiXCIkKHhzbHRwcm9jKVwiIFwiJChkaXIpXFx0ZXN0LnhzbFwiIFwiJChkaXIpXFx0ZXN0LnhtbFwiIDI+JjEiIDsKKyAgICAgICAgbG9jYWwgc3RhdHVzID0gWyBTSEVMTCAkKGNvbW1hbmQpIDogbm8tb3V0cHV0IDogZXhpdC1zdGF0dXMgXSA7CisgICAgICAgIGlmICQoc3RhdHVzWzJdKSAhPSAiMCIKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWUgOworICAgICAgICB9CisgICAgfQorfQorCisKK3J1bGUgY29tcHV0ZS14c2x0LWZsYWdzICggdGFyZ2V0IDogcHJvcGVydGllcyAqICkKK3sKKyAgICAjIFJhdyBmbGFncy4KKyAgICBsb2NhbCBmbGFncyA9IFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxmbGFncz4gOiAkKHByb3BlcnRpZXMpIF0gOworCisgICAgIyBUcmFuc2xhdGUgPHhzbDpwYXJhbT4gaW50byBjb21tYW5kIGxpbmUgZmxhZ3MuCisgICAgZm9yIGxvY2FsIHBhcmFtIGluIFsgZmVhdHVyZS5nZXQtdmFsdWVzIDx4c2w6cGFyYW0+IDogJChwcm9wZXJ0aWVzKSBdCisgICAgeworICAgICAgICBsb2NhbCBuYW1ldmFsdWUgPSBbIHJlZ2V4LnNwbGl0ICQocGFyYW0pICI9IiBdIDsKKyAgICAgICAgZmxhZ3MgKz0gLS1zdHJpbmdwYXJhbSAkKG5hbWV2YWx1ZVsxXSkgXCIkKG5hbWV2YWx1ZVsyXSlcIiA7CisgICAgfQorCisgICAgIyBUcmFuc2xhdGUgPHhzbDpwYXRoPi4KKyAgICBmb3IgbG9jYWwgcGF0aCBpbiBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8eHNsOnBhdGg+IDogJChwcm9wZXJ0aWVzKSBdCisgICAgeworICAgICAgICBmbGFncyArPSAtLXBhdGggXCIkKHBhdGg6Rz0pXCIgOworICAgIH0KKworICAgICMgVGFrZSBjYXJlIG9mIGltcGxpY2l0IGRlcGVuZGVuY2llcy4KKyAgICBsb2NhbCBvdGhlci1kZXBzIDsKKyAgICBmb3IgbG9jYWwgZGVwIGluIFsgZmVhdHVyZS5nZXQtdmFsdWVzIDxpbXBsaWNpdC1kZXBlbmRlbmN5PiA6ICQocHJvcGVydGllcykKKyAgICAgICAgXQorICAgIHsKKyAgICAgICAgb3RoZXItZGVwcyArPSBbICQoZGVwOkc9KS5jcmVhdGluZy1zdWJ2YXJpYW50IF0gOworICAgIH0KKworICAgIGxvY2FsIGltcGxpY2l0LXRhcmdldC1kaXJlY3RvcmllcyA7CisgICAgZm9yIGxvY2FsIGRlcCBpbiBbIHNlcXVlbmNlLnVuaXF1ZSAkKG90aGVyLWRlcHMpIF0KKyAgICB7CisgICAgICAgIGltcGxpY2l0LXRhcmdldC1kaXJlY3RvcmllcyArPSBbICQoZGVwKS5hbGwtdGFyZ2V0LWRpcmVjdG9yaWVzIF0gOworICAgIH0KKworICAgIGZvciBsb2NhbCBkaXIgaW4gJChpbXBsaWNpdC10YXJnZXQtZGlyZWN0b3JpZXMpCisgICAgeworICAgICAgICBmbGFncyArPSAtLXBhdGggXCIkKGRpcjpUKVwiIDsKKyAgICB9CisKKyAgICByZXR1cm4gJChmbGFncykgOworfQorCisKK2xvY2FsIHJ1bGUgLnhzbHRwcm9jICggdGFyZ2V0IDogc291cmNlIHN0eWxlc2hlZXQgOiBwcm9wZXJ0aWVzICogOiBkaXJuYW1lID8gOgorICAgIGFjdGlvbiApCit7CisgICAgZnJlZXplLWNvbmZpZyA7CisgICAgU1RZTEVTSEVFVCBvbiAkKHRhcmdldCkgPSAkKHN0eWxlc2hlZXQpIDsKKyAgICBGTEFHUyBvbiAkKHRhcmdldCkgKz0gWyBjb21wdXRlLXhzbHQtZmxhZ3MgJCh0YXJnZXQpIDogJChwcm9wZXJ0aWVzKSBdIDsKKyAgICBOQU1FIG9uICQodGFyZ2V0KSA9ICQoLnhzbHRwcm9jKSA7CisKKyAgICBmb3IgbG9jYWwgY2F0YWxvZyBpbiBbIGZlYXR1cmUuZ2V0LXZhbHVlcyA8Y2F0YWxvZz4gOiAkKHByb3BlcnRpZXMpIF0KKyAgICB7CisgICAgICAgIENBVEFMT0cgPSBbIGNvbW1vbi52YXJpYWJsZS1zZXR0aW5nLWNvbW1hbmQgWE1MX0NBVEFMT0dfRklMRVMgOgorICAgICAgICAgICAgJChjYXRhbG9nOlQpIF0gOworICAgIH0KKworICAgIGlmIFsgb3Mub24td2luZG93cyBdICYmICEgWyBpcy1jeWd3aW4gXQorICAgIHsKKyAgICAgICAgYWN0aW9uID0gJChhY3Rpb24pLndpbmRvd3MgOworICAgIH0KKworICAgICQoYWN0aW9uKSAkKHRhcmdldCkgOiAkKHNvdXJjZSkgOworfQorCisKK3J1bGUgeHNsdCAoIHRhcmdldCA6IHNvdXJjZSBzdHlsZXNoZWV0IDogcHJvcGVydGllcyAqICkKK3sKKyAgICByZXR1cm4gWyAueHNsdHByb2MgJCh0YXJnZXQpIDogJChzb3VyY2UpICQoc3R5bGVzaGVldCkgOiAkKHByb3BlcnRpZXMpIDogOgorICAgICAgICB4c2x0LXhzbHRwcm9jIF0gOworfQorCisKK3J1bGUgeHNsdC1kaXIgKCB0YXJnZXQgOiBzb3VyY2Ugc3R5bGVzaGVldCA6IHByb3BlcnRpZXMgKiA6IGRpcm5hbWUgKQoreworICAgIHJldHVybiBbIC54c2x0cHJvYyAkKHRhcmdldCkgOiAkKHNvdXJjZSkgJChzdHlsZXNoZWV0KSA6ICQocHJvcGVydGllcykgOgorICAgICAgICAkKGRpcm5hbWUpIDogeHNsdC14c2x0cHJvYy1kaXIgXSA7Cit9CisKK2FjdGlvbnMgeHNsdC14c2x0cHJvYy53aW5kb3dzCit7CisgICAgJChDQVRBTE9HKSAiJChOQU1FOkU9eHNsdHByb2MpIiAkKEZMQUdTKSAtLXhpbmNsdWRlIC1vICIkKDwpIiAiJChTVFlMRVNIRUVUOlcpIiAiJCg+OlcpIgorfQorCisKK2FjdGlvbnMgeHNsdC14c2x0cHJvYyBiaW5kIFNUWUxFU0hFRVQKK3sKKyAgICAkKENBVEFMT0cpICIkKE5BTUU6RT14c2x0cHJvYykiICQoRkxBR1MpIC0teGluY2x1ZGUgLW8gIiQoPCkiICIkKFNUWUxFU0hFRVQ6VCkiICIkKD46VCkiCit9CisKKworYWN0aW9ucyB4c2x0LXhzbHRwcm9jLWRpci53aW5kb3dzIGJpbmQgU1RZTEVTSEVFVAoreworICAgICQoQ0FUQUxPRykgIiQoTkFNRTpFPXhzbHRwcm9jKSIgJChGTEFHUykgLS14aW5jbHVkZSAtbyAiJCg8OkQpLyIgIiQoU1RZTEVTSEVFVDpXKSIgIiQoPjpXKSIKK30KKworCithY3Rpb25zIHhzbHQteHNsdHByb2MtZGlyIGJpbmQgU1RZTEVTSEVFVAoreworICAgICQoQ0FUQUxPRykgIiQoTkFNRTpFPXhzbHRwcm9jKSIgJChGTEFHUykgLS14aW5jbHVkZSAtbyAiJCg8OkQpLyIgIiQoU1RZTEVTSEVFVDpUKSIgIiQoPjpUKSIKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMveHNsdHByb2MvaW5jbHVkZWQueHNsIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy94c2x0cHJvYy9pbmNsdWRlZC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4NjM5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMveHNsdHByb2MvaW5jbHVkZWQueHNsCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICBDb3B5cmlnaHQgKGMpIDIwMTAgU3RldmVuIFdhdGFuYWJlCisgIAorICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICAtLT4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMveHNsdHByb2MvdGVzdC54bWwgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3hzbHRwcm9jL3Rlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YzhiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3hzbHRwcm9jL3Rlc3QueG1sCkBAIC0wLDAgKzEsMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyb290Lz4KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMveHNsdHByb2MvdGVzdC54c2wgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3hzbHRwcm9jL3Rlc3QueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDJjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3Rvb2xzL3hzbHRwcm9jL3Rlc3QueHNsCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICBDb3B5cmlnaHQgKGMpIDIwMTAgU3RldmVuIFdhdGFuYWJlCisgIAorICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICAtLT4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgorICA8eHNsOmluY2x1ZGUgaHJlZj0iaW5jbHVkZWQueHNsIi8+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC90b29scy96bGliLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvemxpYi5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5NWVlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdG9vbHMvemxpYi5qYW0KQEAgLTAsMCArMSwyMjcgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEwIFZsYWRpbWlyIFBydXMuCisjIENvcHlyaWdodCAoYykgMjAxMyBTdGV2ZW4gV2F0YW5hYmUKKyMKKyMgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorIyBMaWNlbnNlIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgU3VwcG9ydHMgdGhlIHpsaWIgbGlicmFyeQorIworIyBBZnRlciAndXNpbmcgemxpYicsIHRoZSBmb2xsb3dpbmcgdGFyZ2V0cyBhcmUgYXZhaWxhYmxlOgorIworIyAvemxpYi8vemxpYiAtLSBUaGUgemxpYiBsaWJyYXJ5CisKK2ltcG9ydCBwcm9qZWN0IDsKK2ltcG9ydCBhYyA7CitpbXBvcnQgZXJyb3JzIDsKK2ltcG9ydCAiY2xhc3MiIDogbmV3IDsKK2ltcG9ydCB0YXJnZXRzIDsgCitpbXBvcnQgcGF0aCA7CitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgZXJyb3JzIDsKK2ltcG9ydCBpbmRpcmVjdCA7CitpbXBvcnQgcHJvcGVydHkgOworaW1wb3J0IHByb3BlcnR5LXNldCA7CisKK2hlYWRlciA9IHpsaWIuaCA7CituYW1lcyA9IHogemxpYiB6bGwgemRsbCA7CisKK3NvdXJjZXMgPSBhZGxlcjMyLmMgY29tcHJlc3MuYworICAgICBjcmMzMi5jIGRlZmxhdGUuYyBnemNsb3NlLmMgZ3ppby5jIGd6bGliLmMgZ3pyZWFkLmMgZ3p3cml0ZS5jCisgICAgIGluZmJhY2suYyBpbmZmYXN0LmMgaW5mbGF0ZS5jIGluZnRyZWVzLmMgdHJlZXMuYyB1bmNvbXByLmMgenV0aWwuYyA7CisKK2xpYnJhcnktaWQgPSAwIDsKKworaWYgLS1kZWJ1Zy1jb25maWd1cmF0aW9uIGluIFsgbW9kdWxlcy5wZWVrIDogQVJHViBdCit7CisgICAgLmRlYnVnID0gIHRydWUgOworfQorCisjIEluaXRpYWxpemVzIHRoZSB6bGliIGxpYnJhcnkuCisjCisjIHpsaWIgY2FuIGJlIGNvbmZpZ3VyZWQgZWl0aGVyIHRvIHVzZSBwcmUtZXhpc3RpbmcgYmluYXJpZXMKKyMgb3IgdG8gYnVpbGQgdGhlIGxpYnJhcnkgZnJvbSBzb3VyY2UuCisjCisjIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgcHJlYnVpbHQgemxpYjo6CisjCisjICAgPHNlYXJjaD4KKyMgICAgICAgVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB6bGliIGJpbmFyaWVzLgorIyAgIDxuYW1lPgorIyAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgbGlicmFyeSBuYW1lLgorIyAgIDxpbmNsdWRlPgorIyAgICAgICBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHpsaWIgaGVhZGVycy4KKyMKKyMgSWYgbm9uZSBvZiB0aGVzZSBvcHRpb25zIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgZW52aXJvbm1lbnRhbAorIyB2YXJpYWJsZXMgWkxJQl9MSUJSQVJZX1BBVEgsIFpMSUJfTkFNRSwgYW5kIFpMSUJfSU5DTFVERSB3aWxsCisjIGJlIHVzZWQgaW5zdGVhZC4KKyMKKyMgT3B0aW9ucyBmb3IgYnVpbGRpbmcgemxpYiBmcm9tIHNvdXJjZTo6CisjCisjICAgPHNvdXJjZT4KKyMgICAgICAgVGhlIHpsaWIgc291cmNlIGRpcmVjdG9yeS4gIERlZmF1bHRzIHRvIHRoZSBlbnZpcm9ubWVudGFsIHZhcmlhYmxlCisjICAgICAgIFpMSUJfU09VUkNFLgorIyAgIDx0YWc+CisjICAgICAgIEEgcnVsZSB3aGljaCBjb21wdXRlcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIGNvbXBpbGVkCisjICAgICAgIGxpYnJhcmllcyBiYXNlZCBvbiB0aGUgYnVpbGQgcHJvcGVydGllcy4gIElnbm9yZWQKKyMgICAgICAgd2hlbiB1c2luZyBwcmVjb21waWxlZCBiaW5hcmllcy4KKyMgICA8YnVpbGQtbmFtZT4KKyMgICAgICAgVGhlIGJhc2UgbmFtZSB0byB1c2UgZm9yIHRoZSBjb21waWxlZCBsaWJyYXJ5LiAgSWdub3JlZAorIyAgICAgICB3aGVuIHVzaW5nIHByZWNvbXBpbGVkIGJpbmFyaWVzLgorIworIyBFeGFtcGxlczo6CisjCisjICAgIyBGaW5kIHpsaWIgaW4gdGhlIGRlZmF1bHQgc3lzdGVtIGxvY2F0aW9uCisjICAgdXNpbmcgemxpYiA7CisjICAgIyBCdWlsZCB6bGliIGZyb20gc291cmNlCisjICAgdXNpbmcgemxpYiA6IDEuMi43IDogPHNvdXJjZT4vaG9tZS9zdGV2ZW4vemxpYi0xLjIuNyA7CisjICAgIyBGaW5kIHpsaWIgaW4gL3Vzci9sb2NhbAorIyAgIHVzaW5nIHpsaWIgOiAxLjIuNworIyAgICAgOiA8aW5jbHVkZT4vdXNyL2xvY2FsL2luY2x1ZGUgPHNlYXJjaD4vdXNyL2xvY2FsL2xpYiA7CisjICAgIyBCdWlsZCB6bGliIGZyb20gc291cmNlIGZvciBtc3ZjIGFuZCBmaW5kCisjICAgIyBwcmVidWlsdCBiaW5hcmllcyBmb3IgZ2NjLgorIyAgIHVzaW5nIHpsaWIgOiAxLjIuNyA6IDxzb3VyY2U+QzovRGV2ZWwvc3JjL3psaWItMS4yLjcgOiA8dG9vbHNldD5tc3ZjIDsKKyMgICB1c2luZyB6bGliIDogMS4yLjcgOiA6IDx0b29sc2V0PmdjYyA7CisjCitydWxlIGluaXQgKAorICAgIHZlcnNpb24gPworICAgICMgVGhlIHpsaWIgdmVyc2lvbiAoY3VycmVudGx5IGlnbm9yZWQpCisKKyAgICA6IG9wdGlvbnMgKgorICAgICMgQSBsaXN0IG9mIHRoZSBvcHRpb25zIHRvIHVzZQorCisgICAgOiByZXF1aXJlbWVudHMgKgorICAgICMgVGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHpsaWIgdGFyZ2V0CisKKyAgICA6IGlzLWRlZmF1bHQgPworICAgICMgRGVmYXVsdCBjb25maWd1cmF0aW9ucyBhcmUgb25seSB1c2VkIHdoZW4gemxpYgorICAgICMgaGFzIG5vdCB5ZXQgYmVlbiBjb25maWd1cmVkLgorICAgICkKK3sKKyAgICBsb2NhbCBjYWxsZXIgPSBbIHByb2plY3QuY3VycmVudCBdIDsKKworICAgIGlmICEgJCguaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgICAuaW5pdGlhbGl6ZWQgPSB0cnVlIDsKKworICAgICAgICBwcm9qZWN0LmluaXRpYWxpemUgJChfX25hbWVfXykgOworICAgICAgICAucHJvamVjdCA9IFsgcHJvamVjdC5jdXJyZW50IF0gOworICAgICAgICBwcm9qZWN0IHpsaWIgOworICAgIH0KKworICAgIGxvY2FsIGxpYnJhcnktcGF0aCA9IFsgcHJvcGVydHkuc2VsZWN0IDxzZWFyY2g+IDogJChvcHRpb25zKSBdIDsKKyAgICBsaWJyYXJ5LXBhdGggPSAkKGxpYnJhcnktcGF0aDpHPSkgOworICAgIGxvY2FsIGluY2x1ZGUtcGF0aCA9IFsgcHJvcGVydHkuc2VsZWN0IDxpbmNsdWRlPiA6ICQob3B0aW9ucykgXSA7CisgICAgaW5jbHVkZS1wYXRoID0gJChpbmNsdWRlLXBhdGg6Rz0pIDsKKyAgICBsb2NhbCBzb3VyY2UtcGF0aCA9IFsgcHJvcGVydHkuc2VsZWN0IDxzb3VyY2U+IDogJChvcHRpb25zKSBdIDsKKyAgICBzb3VyY2UtcGF0aCA9ICQoc291cmNlLXBhdGg6Rz0pIDsKKyAgICBsb2NhbCBsaWJyYXJ5LW5hbWUgPSBbIHByb3BlcnR5LnNlbGVjdCA8bmFtZT4gOiAkKG9wdGlvbnMpIF0gOworICAgIGxpYnJhcnktbmFtZSA9ICQobGlicmFyeS1uYW1lOkc9KSA7CisgICAgbG9jYWwgdGFnID0gWyBwcm9wZXJ0eS5zZWxlY3QgPHRhZz4gOiAkKG9wdGlvbnMpIF0gOworICAgIHRhZyA9ICQodGFnOkc9KSA7CisgICAgbG9jYWwgYnVpbGQtbmFtZSA9IFsgcHJvcGVydHkuc2VsZWN0IDxidWlsZC1uYW1lPiA6ICQob3B0aW9ucykgXSA7CisgICAgYnVpbGQtbmFtZSA9ICQoYnVpbGQtbmFtZTpHPSkgOworCisgICAgY29uZGl0aW9uID0gWyBwcm9wZXJ0eS1zZXQuY3JlYXRlICQocmVxdWlyZW1lbnRzKSBdIDsKKyAgICBjb25kaXRpb24gPSBbIHByb3BlcnR5LXNldC5jcmVhdGUgWyAkKGNvbmRpdGlvbikuYmFzZSBdIF0gOworCisgICAgbG9jYWwgbm8tYnVpbGQtZnJvbS1zb3VyY2UgOworICAgICMgSWdub3JlIGVudmlyb25tZW50YWwgWkxJQl9TT1VSQ0UgaWYgdGhpcyBpbml0aWFsaXphdGlvbgorICAgICMgcmVxdWVzdGVkIHRvIHNlYXJjaCBmb3IgYSBzcGVjaWZpYyBwcmUtYnVpbHQgbGlicmFyeS4KKyAgICBpZiAkKGxpYnJhcnktcGF0aCkgfHwgJChpbmNsdWRlLXBhdGgpIHx8ICQobGlicmFyeS1uYW1lKQorICAgIHsKKyAgICAgICAgaWYgJChzb3VyY2UtcGF0aCkgfHwgJCh0YWcpIHx8ICQoYnVpbGQtbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3JzLnVzZXItZXJyb3IgImluY29tcGF0aWJsZSBvcHRpb25zIGZvciB6bGliOiIKKyAgICAgICAgICAgICAgICBbIHByb3BlcnR5LnNlbGVjdCA8c2VhcmNoPiA8aW5jbHVkZT4gPG5hbWU+IDogJChvcHRpb25zKSBdICJhbmQiCisgICAgICAgICAgICAgICAgWyBwcm9wZXJ0eS5zZWxlY3QgPHNvdXJjZT4gPHRhZz4gPGJ1aWxkLW5hbWU+IDogJChvcHRpb25zKSBdIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vLWJ1aWxkLWZyb20tc291cmNlID0gdHJ1ZSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzb3VyY2UtcGF0aCA/PSBbIG1vZHVsZXMucGVlayA6IFpMSUJfU09VUkNFIF0gOworCisgICAgaWYgJCguY29uZmlndXJlZC4kKGNvbmRpdGlvbikpCisgICAgeworICAgICAgICBpZiAkKGlzLWRlZmF1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQoLmRlYnVnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIm5vdGljZTogW3psaWJdIHpsaWIgaXMgYWxyZWFkeSBjb25maWd1cmVkIiA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcnMudXNlci1lcnJvciAiemxpYiBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQiIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICBlbHNlIGlmICQoc291cmNlLXBhdGgpICYmICEgJChuby1idWlsZC1mcm9tLXNvdXJjZSkKKyAgICB7CisgICAgICAgIGJ1aWxkLW5hbWUgPz0geiA7CisgICAgICAgIGxpYnJhcnktaWQgPSBbIENBTEMgJChsaWJyYXJ5LWlkKSArIDEgXSA7CisgICAgICAgIHRhZyA9IFsgTUFUQ0ggXkA/KC4qKSQgOiAkKHRhZykgXSA7CisgICAgICAgIGlmICQodGFnKSAmJiAhIFsgTUFUQ0ggXihbXiVdKiklKFteJV0rKSQgOiAkKHRhZykgXQorICAgICAgICB7CisgICAgICAgICAgICB0YWcgPSBbIGluZGlyZWN0Lm1ha2UgJCh0YWcpIDogWyAkKGNhbGxlcikucHJvamVjdC1tb2R1bGUgXSBdIDsKKyAgICAgICAgfQorICAgICAgICBzb3VyY2VzID0gWyBwYXRoLmdsb2IgJChzb3VyY2UtcGF0aCkgOiAkKHNvdXJjZXMpIF0gOworICAgICAgICBpZiAkKC5kZWJ1ZykKKyAgICAgICAgeworICAgICAgICAgICAgRUNITyAibm90aWNlOiBbemxpYl0gQnVpbGRpbmcgemxpYiBmcm9tIHNvdXJjZSBhcyAkKGJ1aWxkLW5hbWUpIiA7CisgICAgICAgICAgICBpZiAkKGNvbmRpdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFQ0hPICJub3RpY2U6IFt6bGliXSBDb25kaXRpb24iIFsgJChjb25kaXRpb24pLnJhdyBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICQoc291cmNlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFQ0hPICJub3RpY2U6IFt6bGliXSBmb3VuZCB6bGliIHNvdXJjZSBpbiAkKHNvdXJjZS1wYXRoKSIgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIndhcm5pbmc6IFt6bGliXSBjb3VsZCBub3QgZmluZCB6bGliIHNvdXJjZSBpbiAkKHNvdXJjZS1wYXRoKSIgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvY2FsIHRhcmdldCA7CisgICAgICAgIGlmICQoc291cmNlcykgeworICAgICAgICAgICAgdGFyZ2V0ID0gWyB0YXJnZXRzLmNyZWF0ZS10eXBlZC10YXJnZXQgTElCIDogJCgucHJvamVjdCkKKyAgICAgICAgICAgICAgOiAkKGJ1aWxkLW5hbWUpLiQobGlicmFyeS1pZCkKKyAgICAgICAgICAgICAgOiAkKHNvdXJjZXMpCisgICAgICAgICAgICAgIDogJChyZXF1aXJlbWVudHMpCisgICAgICAgICAgICAgICAgPHRhZz5AJCh0YWcpCisgICAgICAgICAgICAgICAgPGluY2x1ZGU+JChzb3VyY2UtcGF0aCkKKyAgICAgICAgICAgICAgICA8dG9vbHNldD5tc3ZjOjxkZWZpbmU+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisgICAgICAgICAgICAgICAgPHRvb2xzZXQ+bXN2Yzo8ZGVmaW5lPl9TQ0xfU0VDVVJFX05PX0RFUFJFQ0FURQorICAgICAgICAgICAgICAgIDxsaW5rPnNoYXJlZDo8ZGVmaW5lPlpMSUJfRExMCisgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgOiA8aW5jbHVkZT4kKHNvdXJjZS1wYXRoKSBdIDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsIG10ID0gWyBuZXcgYWMtbGlicmFyeSB6bGliIDogJCgucHJvamVjdCkgOiAkKGNvbmRpdGlvbikgXSA7CisgICAgICAgICQobXQpLnNldC1oZWFkZXIgJChoZWFkZXIpIDsKKyAgICAgICAgJChtdCkuc2V0LWRlZmF1bHQtbmFtZXMgJChuYW1lcykgOworICAgICAgICBpZiAkKHRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgJChtdCkuc2V0LXRhcmdldCAkKHRhcmdldCkgOworICAgICAgICB9CisgICAgICAgIHRhcmdldHMubWFpbi10YXJnZXQtYWx0ZXJuYXRpdmUgJChtdCkgOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICQoLmRlYnVnKQorICAgICAgICB7CisgICAgICAgICAgICBFQ0hPICJub3RpY2U6IFt6bGliXSBVc2luZyBwcmUtaW5zdGFsbGVkIGxpYnJhcnkiIDsKKyAgICAgICAgICAgIGlmICQoY29uZGl0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVDSE8gIm5vdGljZTogW3psaWJdIENvbmRpdGlvbiIgWyAkKGNvbmRpdGlvbikucmF3IF0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9jYWwgbXQgPSBbIG5ldyBhYy1saWJyYXJ5IHpsaWIgOiAkKC5wcm9qZWN0KSA6ICQoY29uZGl0aW9uKSA6CisgICAgICAgICAgICAkKGluY2x1ZGUtcGF0aCkgOiAkKGxpYnJhcnktcGF0aCkgOiAkKGxpYnJhcnktbmFtZSkgOiAkKHJvb3QpIF0gOworICAgICAgICAkKG10KS5zZXQtaGVhZGVyICQoaGVhZGVyKSA7CisgICAgICAgICQobXQpLnNldC1kZWZhdWx0LW5hbWVzICQobmFtZXMpIDsKKyAgICAgICAgdGFyZ2V0cy5tYWluLXRhcmdldC1hbHRlcm5hdGl2ZSAkKG10KSA7CisgICAgfQorICAgIC5jb25maWd1cmVkLiQoY29uZGl0aW9uKSA9IHRydWUgOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91c2VyLWNvbmZpZy5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3VzZXItY29uZmlnLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmJmMTNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91c2VyLWNvbmZpZy5qYW0KQEAgLTAsMCArMSw5MiBAQAorIyBDb3B5cmlnaHQgMjAwMywgMjAwNSBEb3VnbGFzIEdyZWdvcgorIyBDb3B5cmlnaHQgMjAwNCBKb2huIE1hZGRvY2sKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDcgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyAgIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB5b3VyIEJvb3N0LkJ1aWxkIGluc3RhbGxhdGlvbi4gWW91IGNhbiBtb2RpZnkKKyMgdGhpcyBmaWxlIGluIHBsYWNlLCBvciB5b3UgY2FuIHBsYWNlIGl0IGluIGEgcGVybWFuZW50IGxvY2F0aW9uIHNvIHRoYXQgaXQKKyMgZG9lcyBub3QgZ2V0IG92ZXJ3cml0dGVuIHNob3VsZCB5b3UgZ2V0IGEgbmV3IHZlcnNpb24gb2YgQm9vc3QuQnVpbGQuIFNlZToKKyMKKyMgICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9ib29zdC1idWlsZDIvZG9jL2h0bWwvYmJ2Mi9vdmVydmlldy9jb25maWd1cmF0aW9uLmh0bWwKKyMKKyMgZm9yIGRvY3VtZW50YXRpb24gYWJvdXQgcG9zc2libGUgcGVybWFuZW50IGxvY2F0aW9ucy4KKworIyAgIFRoaXMgZmlsZSBzcGVjaWZpZXMgd2hpY2ggdG9vbHNldHMgKEMrKyBjb21waWxlcnMpLCBsaWJyYXJpZXMsIGFuZCBvdGhlcgorIyB0b29scyBhcmUgYXZhaWxhYmxlLiBPZnRlbiwgeW91IHNob3VsZCBiZSBhYmxlIHRvIGp1c3QgdW5jb21tZW50IGV4aXN0aW5nCisjIGV4YW1wbGUgbGluZXMgYW5kIGFkanVzdCB0aGVtIHRvIHRhc3RlLiBUaGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgdG9vbHMsCisjIGFuZCBjb25maWd1cmF0aW9uIGluc3RydWN0aW9ucyBjYW4gYmUgZm91bmQgYXQ6CisjCisjICAgaHR0cDovL2Jvb3N0Lm9yZy9ib29zdC1idWlsZDIvZG9jL2h0bWwvYmJ2Mi9yZWZlcmVuY2UvdG9vbHMuaHRtbAorIworCisjICAgVGhpcyBmaWxlIHVzZXMgSmFtIGxhbmd1YWdlIHN5bnRheCB0byBkZXNjcmliZSBhdmFpbGFibGUgdG9vbHMuIE1vc3RseSwKKyMgdGhlcmUgYXJlICd1c2luZycgbGluZXMsIHRoYXQgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUgdXNlZCB0b29scywgYW5kCisjIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aG9zZSB0b29scyAtLSB3aGVyZSBwYXJlbWV0ZXJzIGFyZSBzZXBhcmF0ZWQgYnkKKyMgc2VtaWNvbG9ucy4gSW1wb3J0YW50IHN5bnRheCBub3RlczoKKyMKKyMgICAtIEJvdGggJzonIGFuZCAnOycgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBvdGhlciB0b2tlbnMgYnkgd2hpdGVzcGFjZQorIyAgIC0gVGhlICdcJyBzeW1ib2wgaXMgYSBxdW90ZSBjaGFyYWN0ZXIsIHNvIHdoZW4gc3BlY2lmeWluZyBXaW5kb3dzIHBhdGhzIHlvdQorIyAgICAgc2hvdWxkIHVzZSAnLycgb3IgJ1xcJyBpbnN0ZWFkLgorIworIyBNb3JlIGRldGFpbHMgYWJvdXQgdGhlIHN5bnRheCBjYW4gYmUgZm91bmQgYXQ6CisjCisjICAgaHR0cDovL2Jvb3N0Lm9yZy9ib29zdC1idWlsZDIvZG9jL2h0bWwvYmJ2Mi9hZHZhbmNlZC5odG1sI2JidjIuYWR2YW5jZWQuamFtX2xhbmd1YWdlCisjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIEdDQyBjb25maWd1cmF0aW9uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKworIyBDb25maWd1cmUgZ2NjIChkZWZhdWx0IHZlcnNpb24pLgorIyB1c2luZyBnY2MgOworCisjIENvbmZpZ3VyZSBzcGVjaWZpYyBnY2MgdmVyc2lvbiwgZ2l2aW5nIGFsdGVybmF0aXZlIG5hbWUgdG8gdXNlLgorIyB1c2luZyBnY2MgOiAzLjIgOiBnKystMy4yIDsKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTVNWQyBjb25maWd1cmF0aW9uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgQ29uZmlndXJlIG1zdmMgKGRlZmF1bHQgdmVyc2lvbiwgc2VhcmNoZWQgZm9yIGluIHN0YW5kYXJkIGxvY2F0aW9ucyBhbmQgUEFUSCkuCisjIHVzaW5nIG1zdmMgOworCisjIENvbmZpZ3VyZSBzcGVjaWZpYyBtc3ZjIHZlcnNpb24gKHNlYXJjaGVkIGZvciBpbiBzdGFuZGFyZCBsb2NhdGlvbnMgYW5kIFBBVEgpLgorIyB1c2luZyBtc3ZjIDogOC4wIDsKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQm9ybGFuZCBjb25maWd1cmF0aW9uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHVzaW5nIGJvcmxhbmQgOworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTVExQb3J0IGNvbmZpZ3VyYXRpb24uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAgIENvbmZpZ3VyZSBzcGVjaWZ5aW5nIGxvY2F0aW9uIG9mIFNUTFBvcnQgaGVhZGVycy4gTGlicmFyaWVzIG11c3QgYmUgZWl0aGVyCisjIG5vdCBuZWVkZWQgb3IgYXZhaWxhYmxlIHRvIHRoZSBjb21waWxlciBieSBkZWZhdWx0LgorIyB1c2luZyBzdGxwb3J0IDogOiAvdXNyL2luY2x1ZGUvc3RscG9ydCA7CisKKyMgQ29uZmlndXJlIHNwZWNpZnlpbmcgbG9jYXRpb24gb2YgYm90aCBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgZXhwbGljaXRseS4KKyMgdXNpbmcgc3RscG9ydCA6IDogL3Vzci9pbmNsdWRlL3N0bHBvcnQgL3Vzci9saWIgOworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgUVQgY29uZmlndXJhdGlvbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0KKworIyBDb25maWd1cmUgYXNzdW1pbmcgUVRESVIgZ2l2ZXMgdGhlIGluc3RhbGxhdGlvbiBwcmVmaXguCisjIHVzaW5nIHF0IDsKKworIyBDb25maWd1cmUgd2l0aCBhbiBleHBsaWNpdCBpbnN0YWxsYXRpb24gcHJlZml4LgorIyB1c2luZyBxdCA6IC91c3Ivb3B0L3F0IDsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHl0aG9uIGNvbmZpZ3VyYXRpb24uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIENvbmZpZ3VyZSBzcGVjaWZpYyBQeXRob24gdmVyc2lvbi4KKyMgdXNpbmcgcHl0aG9uIDogMy4xIDogL3Vzci9iaW4vcHl0aG9uMyA6IC91c3IvaW5jbHVkZS9weXRob24zLjEgOiAvdXNyL2xpYiA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvYXNzZXJ0LmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9hc3NlcnQuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTg4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvYXNzZXJ0LmphbQpAQCAtMCwwICsxLDM0NiBAQAorIyBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwMyBEYXZlIEFicmFoYW1zCisjIENvcHlyaWdodCAyMDA2IFJlbmUgUml2ZXJhCisjIENvcHlyaWdodCAyMDAyLCAyMDAzIFZsYWRpbWlyIFBydXMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworaW1wb3J0IGVycm9ycyA7CitpbXBvcnQgbW9kdWxlcyA7CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBSdWxlIGFkZGVkIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSByZWd1bGFyIEphbSA9IG9wZXJhdG9yIGJ1dCB3aGljaCBkb2VzIG5vdAorIyBpZ25vcmUgdHJhaWxpbmcgZW1wdHkgc3RyaW5nIGVsZW1lbnRzLgorIworbG9jYWwgcnVsZSBleGFjdC1lcXVhbC10ZXN0ICggbGhzICogOiByaHMgKiApCit7CisgICAgbG9jYWwgbGhzX2V4dGVuZGVkID0gJChsaHMpIHh4eCA7CisgICAgbG9jYWwgcmhzX2V4dGVuZGVkID0gJChyaHMpIHh4eCA7CisgICAgaWYgJChsaHNfZXh0ZW5kZWQpID0gJChyaHNfZXh0ZW5kZWQpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgfQorfQorCisKKyMgVHdvIGxpc3RzIGFyZSBjb25zaWRlcmVkIHNldC1lcXVhbCBpZiB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMsIGlnbm9yaW5nCisjIGR1cGxpY2F0ZXMgYW5kIG9yZGVyaW5nLgorIworbG9jYWwgcnVsZSBzZXQtZXF1YWwtdGVzdCAoIHNldDEgKiA6IHNldDIgKiApCit7CisgICAgaWYgKCAkKHNldDEpIGluICQoc2V0MikgKSAmJiAoICQoc2V0MikgaW4gJChzZXQxKSApCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFB1YmxpYyBpbnRlcmZhY2UuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEFzc2VydCB0aGUgZXF1YWxpdHkgb2YgQSBhbmQgQiwgaWdub3JpbmcgdHJhaWxpbmcgZW1wdHkgc3RyaW5nIGVsZW1lbnRzLgorIworcnVsZSBlcXVhbCAoIGEgKiA6IGIgKiApCit7CisgICAgaWYgJChhKSAhPSAkKGIpCisgICAgeworICAgICAgICBlcnJvcnMuZXJyb3Itc2tpcC1mcmFtZXMgMyBhc3NlcnRpb24gZmFpbHVyZTogXCIkKGEpXCIgIj09IiBcIiQoYilcIgorICAgICAgICAgICAgKGlnbm9yaW5nIHRyYWlsaW5nIGVtcHR5IHN0cmluZ3MpIDsKKyAgICB9Cit9CisKKworIyBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgUlVMRS1OQU1FIG9uIHRoZSBnaXZlbiBhcmd1bWVudHMgaGFzIGEgZmFsc2UKKyMgbG9naWNhbCB2YWx1ZSAoaXMgZWl0aGVyIGFuIGVtcHR5IGxpc3Qgb3IgYWxsIGVtcHR5IHN0cmluZ3MpLgorIworcnVsZSBmYWxzZSAoIHJ1bGUtbmFtZSBhcmdzICogOiAqICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIG1vZHVsZSBbIENBTExFUl9NT0RVTEUgXQorICAgIHsKKyAgICAgICAgbW9kdWxlcy5wb2tlIGFzc2VydCA6IHJlc3VsdCA6IFsgJCgxKSA6ICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpCisgICAgICAgICAgICA6ICQoNykgOiAkKDgpIDogJCg5KSA6ICQoMTApIDogJCgxMSkgOiAkKDEyKSA6ICQoMTMpIDogJCgxNCkgOiAkKDE1KQorICAgICAgICAgICAgOiAkKDE2KSA6ICQoMTcpIDogJCgxOCkgOiAkKDE5KSBdIDsKKyAgICB9CisKKyAgICBpZiAkKHJlc3VsdCkKKyAgICB7CisgICAgICAgIGVycm9ycy5lcnJvci1za2lwLWZyYW1lcyAzIGFzc2VydGlvbiBmYWlsdXJlOiBFeHBlY3RlZCBmYWxzZSByZXN1bHQgZnJvbQorICAgICAgICAgICAgIlsiICQocnVsZS1uYW1lKSBbIGVycm9ycy5sb2wtPmxpc3QgJChhcmdzKSA6ICQoMikgOiAkKDMpIDogJCg0KSA6CisgICAgICAgICAgICAkKDUpIDogJCg2KSA6ICQoNykgOiAkKDgpIDogJCg5KSA6ICQoMTApIDogJCgxMSkgOiAkKDEyKSA6ICQoMTMpIDoKKyAgICAgICAgICAgICQoMTQpIDogJCgxNSkgOiAkKDE2KSA6ICQoMTcpIDogJCgxOCkgOiAkKDE5KSBdICJdIiA6IEdvdDogIlsiCisgICAgICAgICAgICBcIiQocmVzdWx0KVwiICJdIiA7CisgICAgfQorfQorCisKKyMgQXNzZXJ0IHRoYXQgRUxFTUVOVCBpcyBwcmVzZW50IGluIExJU1QuCisjCitydWxlICJpbiIgKCBlbGVtZW50IDogbGlzdCAqICkKK3sKKyAgICBpZiAhICQoZWxlbWVudCkgaW4gJChsaXN0KQorICAgIHsKKyAgICAgICAgZXJyb3JzLmVycm9yLXNraXAtZnJhbWVzIDMgYXNzZXJ0aW9uIGZhaWx1cmU6IEV4cGVjdGVkIFwiJChlbGVtZW50KVwiIGluCisgICAgICAgICAgICAiWyIgXCIkKGxpc3QpXCIgIl0iIDsKKyAgICB9Cit9CisKKworIyBBc3NlcnQgdGhlIGluZXF1YWxpdHkgb2YgQSBhbmQgQiwgaWdub3JpbmcgdHJhaWxpbmcgZW1wdHkgc3RyaW5nIGVsZW1lbnRzLgorIworcnVsZSBub3QtZXF1YWwgKCBhICogOiBiICogKQoreworICAgIGlmICQoYSkgPSAkKGIpCisgICAgeworICAgICAgICBlcnJvcnMuZXJyb3Itc2tpcC1mcmFtZXMgMyBhc3NlcnRpb24gZmFpbHVyZTogXCIkKGEpXCIgIiE9IiBcIiQoYilcIgorICAgICAgICAgICAgKGlnbm9yaW5nIHRyYWlsaW5nIGVtcHR5IHN0cmluZ3MpIDsKKyAgICB9Cit9CisKKworIyBBc3NlcnQgdGhhdCBFTEVNRU5UIGlzIG5vdCBwcmVzZW50IGluIExJU1QuCisjCitydWxlIG5vdC1pbiAoIGVsZW1lbnQgOiBsaXN0ICogKQoreworICAgIGlmICQoZWxlbWVudCkgaW4gJChsaXN0KQorICAgIHsKKyAgICAgICAgZXJyb3JzLmVycm9yLXNraXAtZnJhbWVzIDMgYXNzZXJ0aW9uIGZhaWx1cmU6IERpZCBub3QgZXhwZWN0CisgICAgICAgICAgICBcIiQoZWxlbWVudClcIiBpbiAiWyIgXCIkKGxpc3QpXCIgIl0iIDsKKyAgICB9Cit9CisKKworIyBBc3NlcnQgdGhlIGluZXF1YWxpdHkgb2YgQSBhbmQgQiBhcyBzZXRzLgorIworcnVsZSBub3Qtc2V0LWVxdWFsICggYSAqIDogYiAqICkKK3sKKyAgICBpZiBbIHNldC1lcXVhbC10ZXN0ICQoYSkgOiAkKGIpIF0KKyAgICB7CisgICAgICAgIGVycm9ycy5lcnJvci1za2lwLWZyYW1lcyAzIGFzc2VydGlvbiBmYWlsdXJlOiBFeHBlY3RlZCAiWyIgXCIkKGEpXCIgIl0iCisgICAgICAgICAgICBhbmQgIlsiIFwiJChiKVwiICJdIiB0byBub3QgYmUgZXF1YWwgYXMgc2V0cyA7CisgICAgfQorfQorCisKKyMgQXNzZXJ0IHRoYXQgQSBhbmQgQiBhcmUgbm90IGV4YWN0bHkgZXF1YWwsIG5vdCBpZ25vcmluZyB0cmFpbGluZyBlbXB0eSBzdHJpbmcKKyMgZWxlbWVudHMuCisjCitydWxlIG5vdC1leGFjdC1lcXVhbCAoIGEgKiA6IGIgKiApCit7CisgICAgaWYgWyBleGFjdC1lcXVhbC10ZXN0ICQoYSkgOiAkKGIpIF0KKyAgICB7CisgICAgICAgIGVycm9ycy5lcnJvci1za2lwLWZyYW1lcyAzIGFzc2VydGlvbiBmYWlsdXJlOiBcIiQoYSlcIiAiIT0iIFwiJChiKVwiIDsKKyAgICB9Cit9CisKKworIyBBc3NlcnQgdGhhdCBFWFBFQ1RFRCBpcyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgUlVMRS1OQU1FIHdpdGggdGhlIGdpdmVuCisjIGFyZ3VtZW50cy4KKyMKK3J1bGUgcmVzdWx0ICggZXhwZWN0ZWQgKiA6IHJ1bGUtbmFtZSBhcmdzICogOiAqICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIG1vZHVsZSBbIENBTExFUl9NT0RVTEUgXQorICAgIHsKKyAgICAgICAgbW9kdWxlcy5wb2tlIGFzc2VydCA6IHJlc3VsdCA6IFsgJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpCisgICAgICAgICAgICA6ICQoOCkgOiAkKDkpIDogJCgxMCkgOiAkKDExKSA6ICQoMTIpIDogJCgxMykgOiAkKDE0KSA6ICQoMTUpIDoKKyAgICAgICAgICAgICQoMTYpIDogJCgxNykgOiAkKDE4KSA6ICQoMTkpIF0gOworICAgIH0KKworICAgIGlmICEgWyBleGFjdC1lcXVhbC10ZXN0ICQocmVzdWx0KSA6ICQoZXhwZWN0ZWQpIF0KKyAgICB7CisgICAgICAgIGVycm9ycy5lcnJvci1za2lwLWZyYW1lcyAzIGFzc2VydGlvbiBmYWlsdXJlOiAiWyIgJChydWxlLW5hbWUpIFsKKyAgICAgICAgICAgIGVycm9ycy5sb2wtPmxpc3QgJChhcmdzKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6CisgICAgICAgICAgICAkKDkpIDogJCgxMCkgOiAkKDExKSA6ICQoMTIpIDogJCgxMykgOiAkKDE0KSA6ICQoMTUpIDogJCgxNikgOiAkKDE3KQorICAgICAgICAgICAgOiAkKDE4KSA6ICQoMTkpIF0gIl0iIDogRXhwZWN0ZWQ6ICJbIiBcIiQoZXhwZWN0ZWQpXCIgIl0iIDogR290OiAiWyIKKyAgICAgICAgICAgIFwiJChyZXN1bHQpXCIgIl0iIDsKKyAgICB9Cit9CisKKworIyBBc3NlcnQgdGhhdCBFWFBFQ1RFRCBpcyBzZXQtZXF1YWwgKGkuZS4gZHVwbGljYXRlcyBhbmQgb3JkZXJpbmcgYXJlIGlnbm9yZWQpCisjIHRvIHRoZSByZXN1bHQgb2YgY2FsbGluZyBSVUxFLU5BTUUgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBOb3RlIHRoYXQgcnVsZXMKKyMgY2FsbGVkIHRoaXMgd2F5IG1heSBhY2NlcHQgYXQgbW9zdCAxOCBwYXJhbWV0ZXJzLgorIworcnVsZSByZXN1bHQtc2V0LWVxdWFsICggZXhwZWN0ZWQgKiA6IHJ1bGUtbmFtZSBhcmdzICogOiAqICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIG1vZHVsZSBbIENBTExFUl9NT0RVTEUgXQorICAgIHsKKyAgICAgICAgbW9kdWxlcy5wb2tlIGFzc2VydCA6IHJlc3VsdCA6IFsgJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpCisgICAgICAgICAgICA6ICQoOCkgOiAkKDkpIDogJCgxMCkgOiAkKDExKSA6ICQoMTIpIDogJCgxMykgOiAkKDE0KSA6ICQoMTUpIDoKKyAgICAgICAgICAgICQoMTYpIDogJCgxNykgOiAkKDE4KSA6ICQoMTkpIF0gOworICAgIH0KKworICAgIGlmICEgWyBzZXQtZXF1YWwtdGVzdCAkKHJlc3VsdCkgOiAkKGV4cGVjdGVkKSBdCisgICAgeworICAgICAgICBlcnJvcnMuZXJyb3Itc2tpcC1mcmFtZXMgMyBhc3NlcnRpb24gZmFpbHVyZTogIlsiICQocnVsZS1uYW1lKSBbCisgICAgICAgICAgICBlcnJvcnMubG9sLT5saXN0ICQoYXJncykgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkgOgorICAgICAgICAgICAgJCg5KSA6ICQoMTApIDogJCgxMSkgOiAkKDEyKSA6ICQoMTMpIDogJCgxNCkgOiAkKDE1KSA6ICQoMTYpIDogJCgxNykKKyAgICAgICAgICAgIDogJCgxOCkgOiAkKDE5KSBdICJdIiA6IEV4cGVjdGVkOiAiWyIgXCIkKGV4cGVjdGVkKVwiICJdIiA6IEdvdDogIlsiCisgICAgICAgICAgICBcIiQocmVzdWx0KVwiICJdIiA7CisgICAgfQorfQorCisKKyMgQXNzZXJ0IHRoZSBlcXVhbGl0eSBvZiBBIGFuZCBCIGFzIHNldHMuCisjCitydWxlIHNldC1lcXVhbCAoIGEgKiA6IGIgKiApCit7CisgICAgaWYgISBbIHNldC1lcXVhbC10ZXN0ICQoYSkgOiAkKGIpIF0KKyAgICB7CisgICAgICAgIGVycm9ycy5lcnJvci1za2lwLWZyYW1lcyAzIGFzc2VydGlvbiBmYWlsdXJlOiBFeHBlY3RlZCAiWyIgXCIkKGEpXCIgIl0iCisgICAgICAgICAgICBhbmQgIlsiIFwiJChiKVwiICJdIiB0byBiZSBlcXVhbCBhcyBzZXRzIDsKKyAgICB9Cit9CisKKworIyBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgUlVMRS1OQU1FIG9uIHRoZSBnaXZlbiBhcmd1bWVudHMgaGFzIGEgdHJ1ZQorIyBsb2dpY2FsIHZhbHVlIChpcyBuZWl0aGVyIGFuIGVtcHR5IGxpc3Qgbm9yIGFsbCBlbXB0eSBzdHJpbmdzKS4KKyMKK3J1bGUgdHJ1ZSAoIHJ1bGUtbmFtZSBhcmdzICogOiAqICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIG1vZHVsZSBbIENBTExFUl9NT0RVTEUgXQorICAgIHsKKyAgICAgICAgbW9kdWxlcy5wb2tlIGFzc2VydCA6IHJlc3VsdCA6IFsgJCgxKSA6ICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpCisgICAgICAgICAgICA6ICQoNykgOiAkKDgpIDogJCg5KSA6ICQoMTApIDogJCgxMSkgOiAkKDEyKSA6ICQoMTMpIDogJCgxNCkgOiAkKDE1KQorICAgICAgICAgICAgOiAkKDE2KSA6ICQoMTcpIDogJCgxOCkgOiAkKDE5KSBdIDsKKyAgICB9CisKKyAgICBpZiAhICQocmVzdWx0KQorICAgIHsKKyAgICAgICAgZXJyb3JzLmVycm9yLXNraXAtZnJhbWVzIDMgYXNzZXJ0aW9uIGZhaWx1cmU6IEV4cGVjdGVkIHRydWUgcmVzdWx0IGZyb20KKyAgICAgICAgICAgICJbIiAkKHJ1bGUtbmFtZSkgWyBlcnJvcnMubG9sLT5saXN0ICQoYXJncykgOiAkKDIpIDogJCgzKSA6ICQoNCkgOgorICAgICAgICAgICAgJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgOiAkKDEwKSA6ICQoMTEpIDogJCgxMikgOiAkKDEzKSA6CisgICAgICAgICAgICAkKDE0KSA6ICQoMTUpIDogJCgxNikgOiAkKDE3KSA6ICQoMTgpIDogJCgxOSkgXSAiXSIgOworICAgIH0KK30KKworCisjIEFzc2VydCB0aGUgZXhhY3QgZXF1YWxpdHkgb2YgQSBhbmQgQiwgbm90IGlnbm9yaW5nIHRyYWlsaW5nIGVtcHR5IHN0cmluZworIyBlbGVtZW50cy4KKyMKK3J1bGUgZXhhY3QtZXF1YWwgKCBhICogOiBiICogKQoreworICAgIGlmICEgWyBleGFjdC1lcXVhbC10ZXN0ICQoYSkgOiAkKGIpIF0KKyAgICB7CisgICAgICAgIGVycm9ycy5lcnJvci1za2lwLWZyYW1lcyAzIGFzc2VydGlvbiBmYWlsdXJlOiBcIiQoYSlcIiAiPT0iIFwiJChiKVwiIDsKKyAgICB9Cit9CisKKworIyBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgbm90IGFuIGVtcHR5IGxpc3QuCisjCitydWxlIHZhcmlhYmxlLW5vdC1lbXB0eSAoIG5hbWUgKQoreworICAgIGxvY2FsIHZhbHVlID0gWyBtb2R1bGVzLnBlZWsgWyBDQUxMRVJfTU9EVUxFIF0gOiAkKG5hbWUpIF0gOworICAgIGlmICEgJCh2YWx1ZSktaXMtbm90LWVtcHR5CisgICAgeworICAgICAgICBlcnJvcnMuZXJyb3Itc2tpcC1mcmFtZXMgMyBhc3NlcnRpb24gZmFpbHVyZTogRXhwZWN0ZWQgdmFyaWFibGUKKyAgICAgICAgICAgIFwiJChuYW1lKVwiIG5vdCB0byBiZSBhbiBlbXB0eSBsaXN0IDsKKyAgICB9Cit9CisKKworcnVsZSBfX3Rlc3RfXyAoICkKK3sKKyAgICAjIEhlbHBlciBydWxlIHVzZWQgdG8gYXZvaWQgdGVzdCBkdXBsaWNhdGlvbiByZWxhdGVkIHRvIGRpZmZlcmVudCBsaXN0CisgICAgIyBlcXVhbGl0eSB0ZXN0IHJ1bGVzLgorICAgICMKKyAgICBsb2NhbCBydWxlIHJ1bi1lcXVhbGl0eS10ZXN0ICggZXF1YWxpdHktYXNzZXJ0IDogaWdub3JlLXRyYWlsaW5nLWVtcHR5LXN0cmluZ3MgPyApCisgICAgeworICAgICAgICBsb2NhbCBub3QtZXF1YWxpdHktYXNzZXJ0ID0gbm90LSQoZXF1YWxpdHktYXNzZXJ0KSA7CisKKyAgICAgICAgIyBXaGVuIHRoZSBnaXZlbiBlcXVhbGl0eSB0ZXN0IGlzIGV4cGVjdGVkIHRvIGlnbm9yZSB0cmFpbGluZyBlbXB0eQorICAgICAgICAjIHN0cmluZ3Mgc29tZSBvZiB0aGUgdGVzdCByZXN1bHRzIHNob3VsZCBiZSBpbnZlcnRlZC4KKyAgICAgICAgbG9jYWwgbm90LWVxdWFsaXR5LWFzc2VydC1pID0gbm90LSQoZXF1YWxpdHktYXNzZXJ0KSA7CisgICAgICAgIGlmICQoaWdub3JlLXRyYWlsaW5nLWVtcHR5LXN0cmluZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vdC1lcXVhbGl0eS1hc3NlcnQtaSA9ICQoZXF1YWxpdHktYXNzZXJ0KSA7CisgICAgICAgIH0KKworICAgICAgICAgICAgJChlcXVhbGl0eS1hc3NlcnQpICAgICAgICAgOiAgICAgICA7CisgICAgICAgICAgICAkKGVxdWFsaXR5LWFzc2VydCkgICAiIiAiIiA6ICIiICIiIDsKKyAgICAgICAgJChub3QtZXF1YWxpdHktYXNzZXJ0LWkpICAgICAgIDogIiIgIiIgOworICAgICAgICAgICAgJChlcXVhbGl0eS1hc3NlcnQpICAgeCAgICAgOiB4ICAgICA7CisgICAgICAgICQobm90LWVxdWFsaXR5LWFzc2VydCkgICAgICAgICA6IHggICAgIDsKKyAgICAgICAgJChub3QtZXF1YWxpdHktYXNzZXJ0KSAgICIiICAgIDogeCAgICAgOworICAgICAgICAkKG5vdC1lcXVhbGl0eS1hc3NlcnQpICAgIiIgIiIgOiB4ICAgICA7CisgICAgICAgICQobm90LWVxdWFsaXR5LWFzc2VydC1pKSB4ICAgICA6IHggIiIgIDsKKyAgICAgICAgICAgICQoZXF1YWxpdHktYXNzZXJ0KSAgIHggIiIgIDogeCAiIiAgOworICAgICAgICAkKG5vdC1lcXVhbGl0eS1hc3NlcnQpICAgeCAgICAgOiAiIiB4ICA7CisgICAgICAgICAgICAkKGVxdWFsaXR5LWFzc2VydCkgICAiIiB4ICA6ICIiIHggIDsKKworICAgICAgICAgICAgJChlcXVhbGl0eS1hc3NlcnQpIDEgMiAzIDogMSAyIDMgICA7CisgICAgICAgICQobm90LWVxdWFsaXR5LWFzc2VydCkgMSAyIDMgOiAzIDIgMSAgIDsKKyAgICAgICAgJChub3QtZXF1YWxpdHktYXNzZXJ0KSAxIDIgMyA6IDEgNSAzICAgOworICAgICAgICAkKG5vdC1lcXVhbGl0eS1hc3NlcnQpIDEgMiAzIDogMSAiIiAzICA7CisgICAgICAgICQobm90LWVxdWFsaXR5LWFzc2VydCkgMSAyIDMgOiAxIDEgMiAzIDsKKyAgICAgICAgJChub3QtZXF1YWxpdHktYXNzZXJ0KSAxIDIgMyA6IDEgMiAyIDMgOworICAgICAgICAkKG5vdC1lcXVhbGl0eS1hc3NlcnQpIDEgMiAzIDogNSA2IDcgICA7CisKKyAgICAgICAgIyBFeHRyYSB2YXJpYWJsZXMgdXNlZCBoZXJlIGp1c3QgdG8gbWFrZSBzdXJlIEJvb3N0IEphbSBvciBCb29zdCBCdWlsZAorICAgICAgICAjIGRvIG5vdCBoYW5kbGUgbGlzdHMgd2l0aCBlbXB0eSBzdHJpbmdzIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbgorICAgICAgICAjIHdoZXRoZXIgdGhleSBhcmUgbGl0ZXJhbHMgb3Igc3RvcmVkIGluIHZhcmlhYmxlcy4KKworICAgICAgICBsb2NhbCBlbXB0eSAgICAgICAgICAgPSAgICAgICAgIDsKKyAgICAgICAgbG9jYWwgZW1wdHktc3RyaW5ncyAgID0gIiIgIiIgICA7CisgICAgICAgIGxvY2FsIHgtZW1wdHktc3RyaW5ncyA9IHggIiIgIiIgOworICAgICAgICBsb2NhbCBlbXB0eS1zdHJpbmdzLXggPSAiIiAiIiB4IDsKKworICAgICAgICAgICAgJChlcXVhbGl0eS1hc3NlcnQpICAgICAgICAgICAgICAgICAgICAgIDogJChlbXB0eSkgICAgICAgICAgIDsKKyAgICAgICAgJChub3QtZXF1YWxpdHktYXNzZXJ0LWkpICIiICAgICAgICAgICAgICAgICA6ICQoZW1wdHkpICAgICAgICAgICA7CisgICAgICAgICQobm90LWVxdWFsaXR5LWFzc2VydC1pKSAiIiAiIiAgICAgICAgICAgICAgOiAkKGVtcHR5KSAgICAgICAgICAgOworICAgICAgICAkKG5vdC1lcXVhbGl0eS1hc3NlcnQtaSkgICAgICAgICAgICAgICAgICAgIDogJChlbXB0eS1zdHJpbmdzKSAgIDsKKyAgICAgICAgJChub3QtZXF1YWxpdHktYXNzZXJ0LWkpICIiICAgICAgICAgICAgICAgICA6ICQoZW1wdHktc3RyaW5ncykgICA7CisgICAgICAgICAgICAkKGVxdWFsaXR5LWFzc2VydCkgICAiIiAiIiAgICAgICAgICAgICAgOiAkKGVtcHR5LXN0cmluZ3MpICAgOworICAgICAgICAgICAgJChlcXVhbGl0eS1hc3NlcnQpICAgJChlbXB0eSkgICAgICAgICAgIDogJChlbXB0eSkgICAgICAgICAgIDsKKyAgICAgICAgICAgICQoZXF1YWxpdHktYXNzZXJ0KSAgICQoZW1wdHktc3RyaW5ncykgICA6ICQoZW1wdHktc3RyaW5ncykgICA7CisgICAgICAgICQobm90LWVxdWFsaXR5LWFzc2VydC1pKSAkKGVtcHR5KSAgICAgICAgICAgOiAkKGVtcHR5LXN0cmluZ3MpICAgOworICAgICAgICAgICAgJChlcXVhbGl0eS1hc3NlcnQpICAgJCh4LWVtcHR5LXN0cmluZ3MpIDogJCh4LWVtcHR5LXN0cmluZ3MpIDsKKyAgICAgICAgICAgICQoZXF1YWxpdHktYXNzZXJ0KSAgICQoZW1wdHktc3RyaW5ncy14KSA6ICQoZW1wdHktc3RyaW5ncy14KSA7CisgICAgICAgICQobm90LWVxdWFsaXR5LWFzc2VydCkgICAkKGVtcHR5LXN0cmluZ3MteCkgOiAkKHgtZW1wdHktc3RyaW5ncykgOworICAgICAgICAkKG5vdC1lcXVhbGl0eS1hc3NlcnQtaSkgeCAgICAgICAgICAgICAgICAgIDogJCh4LWVtcHR5LXN0cmluZ3MpIDsKKyAgICAgICAgJChub3QtZXF1YWxpdHktYXNzZXJ0KSAgIHggICAgICAgICAgICAgICAgICA6ICQoZW1wdHktc3RyaW5ncy14KSA7CisgICAgICAgICQobm90LWVxdWFsaXR5LWFzc2VydC1pKSB4ICAgICAgICAgICAgICAgICAgOiAkKHgtZW1wdHktc3RyaW5ncykgOworICAgICAgICAkKG5vdC1lcXVhbGl0eS1hc3NlcnQtaSkgeCAiIiAgICAgICAgICAgICAgIDogJCh4LWVtcHR5LXN0cmluZ3MpIDsKKyAgICAgICAgICAgICQoZXF1YWxpdHktYXNzZXJ0KSAgIHggIiIgIiIgICAgICAgICAgICA6ICQoeC1lbXB0eS1zdHJpbmdzKSA7CisgICAgICAgICQobm90LWVxdWFsaXR5LWFzc2VydCkgICB4ICAgICAgICAgICAgICAgICAgOiAkKGVtcHR5LXN0cmluZ3MteCkgOworICAgICAgICAkKG5vdC1lcXVhbGl0eS1hc3NlcnQpICAgIiIgeCAgICAgICAgICAgICAgIDogJChlbXB0eS1zdHJpbmdzLXgpIDsKKyAgICAgICAgICAgICQoZXF1YWxpdHktYXNzZXJ0KSAgICIiICIiIHggICAgICAgICAgICA6ICQoZW1wdHktc3RyaW5ncy14KSA7CisgICAgfQorCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLQorICAgICMgRXF1YWxpdHkgdGVzdHMuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0KKworICAgIHJ1bi1lcXVhbGl0eS10ZXN0IGVxdWFsIDogaWdub3JlLXRyYWlsaW5nLWVtcHR5LXN0cmluZ3MgOworICAgIHJ1bi1lcXVhbGl0eS10ZXN0IGV4YWN0LWVxdWFsIDsKKworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBhc3NlcnQuc2V0LWVxdWFsKCkgdGVzdHMuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgc2V0LWVxdWFsICAgICAgICAgOiAgICAgICAgIDsKKyAgICBub3Qtc2V0LWVxdWFsICIiICIiICAgOiAgICAgICAgIDsKKyAgICAgICAgc2V0LWVxdWFsICIiICIiICAgOiAiIiAgICAgIDsKKyAgICAgICAgc2V0LWVxdWFsICIiICIiICAgOiAiIiAiIiAgIDsKKyAgICAgICAgc2V0LWVxdWFsIGEgYiBjICAgOiBhIGIgYyAgIDsKKyAgICAgICAgc2V0LWVxdWFsIGEgYiBjICAgOiBiIGMgYSAgIDsKKyAgICAgICAgc2V0LWVxdWFsIGEgYiBjIGEgOiBhIGIgYyAgIDsKKyAgICAgICAgc2V0LWVxdWFsIGEgYiBjICAgOiBhIGIgYyBhIDsKKyAgICBub3Qtc2V0LWVxdWFsIGEgYiBjICAgOiBhIGIgYyBkIDsKKyAgICBub3Qtc2V0LWVxdWFsIGEgYiBjIGQgOiBhIGIgYyAgIDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9jb250YWluZXIuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91dGlsL2NvbnRhaW5lci5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0OTYzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9jb250YWluZXIuamFtCkBAIC0wLDAgKzEsMzM5IEBACisjIENvcHlyaWdodCAyMDAzIERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMgUmVuZSBSaXZlcmEKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBWYXJpb3VzIGNvbnRhaW5lciBjbGFzc2VzLgorCisjIEJhc2UgZm9yIGNvbnRhaW5lciBvYmplY3RzLiBUaGlzIGxldHMgdXMgY29uc3RydWN0IHJlY3Vyc2l2ZSBzdHJ1Y3R1cmVzLiBUaGF0CisjIGlzIGNvbnRhaW5lcnMgd2l0aCBjb250YWluZXJzIGluIHRoZW0sIHNwZWNpZmljYWxseSBzbyB3ZSBjYW4gdGVsbCBsaXRlcmFsCisjIHZhbHVlcyBmcm9tIG5vZGUgdmFsdWVzLgorIworY2xhc3Mgbm9kZQoreworICAgIHJ1bGUgX19pbml0X18gKAorICAgICAgICB2YWx1ZSA/ICAjIE9wdGlvbmFsIHZhbHVlIHRvIHNldCBub2RlIHRvIGluaXRpYWxseS4KKyAgICApCisgICAgeworICAgICAgICBzZWxmLnZhbHVlID0gJCh2YWx1ZSkgOworICAgIH0KKworICAgICMgU2V0IHRoZSB2YWx1ZSBvZiB0aGlzIG5vZGUsIHBhc3Npbmcgbm90aGluZyB3aWxsIGNsZWFyIGl0LgorICAgICMKKyAgICBydWxlIHNldCAoIHZhbHVlICogKQorICAgIHsKKyAgICAgICAgc2VsZi52YWx1ZSA9ICQodmFsdWUpIDsKKyAgICB9CisKKyAgICAjIEdldCB0aGUgdmFsdWUgb2YgdGhpcyBub2RlLgorICAgICMKKyAgICBydWxlIGdldCAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKHNlbGYudmFsdWUpIDsKKyAgICB9Cit9CisKKworIyBBIHNpbXBsZSB2ZWN0b3IuIEludGVyZmFjZSBtaW1pY3MgdGhlIEMrKyBzdGQ6OnZlY3RvciBhbmQgc3RkOjpsaXN0LCB3aXRoIHRoZQorIyBleGNlcHRpb24gdGhhdCBpbmRpY2VzIGFyZSBvbmUgKDEpIGJhc2VkIHRvIGZvbGxvdyBKYW0gc3RhbmRhcmQuCisjCisjIFRPRE86IFBvc3NpYmx5IGFkZCBhc3NlcnRpb24gY2hlY2tzLgorIworY2xhc3MgdmVjdG9yIDogbm9kZQoreworICAgIGltcG9ydCBudW1iZXJzIDsKKyAgICBpbXBvcnQgdXRpbGl0eSA7CisgICAgaW1wb3J0IHNlcXVlbmNlIDsKKworICAgIHJ1bGUgX19pbml0X18gKAorICAgICAgICB2YWx1ZXMgKiAgIyBJbml0aWFsIGNvbnRlbnRzIG9mIHZlY3Rvci4KKyAgICApCisgICAgeworICAgICAgICBub2RlLl9faW5pdF9fIDsKKyAgICAgICAgc2VsZi52YWx1ZSA9ICQodmFsdWVzKSA7CisgICAgfQorCisgICAgIyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50LgorICAgICMKKyAgICBydWxlIGZyb250ICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi52YWx1ZVsxXSkgOworICAgIH0KKworICAgICMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBlbGVtZW50LgorICAgICMKKyAgICBydWxlIGJhY2sgKCApCisgICAgeworICAgICAgICByZXR1cm4gJChzZWxmLnZhbHVlWy0xXSkgOworICAgIH0KKworICAgICMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXgsIG9uZSBiYXNlZC4gQWNjZXNzIHRvCisgICAgIyBlbGVtZW50cyBvZiByZWN1cnNpdmUgc3RydWN0dXJlcyBpcyBzdXBwb3J0ZWQgZGlyZWN0bHkuIFNwZWNpZnlpbmcKKyAgICAjIGFkZGl0aW9uYWwgaW5kZXggdmFsdWVzIHJlY3Vyc2l2ZWx5IGFjY2Vzc2VzIHRoZSBlbGVtZW50cyBhcyBjb250YWluZXJzLgorICAgICMgRm9yIGV4YW1wbGU6IFsgJCh2KS5hdCAxIDogMiBdIHdvdWxkIHJldHJpZXZlIHRoZSBzZWNvbmQgZWxlbWVudCBvZiBvdXIKKyAgICAjIGZpcnN0IGVsZW1lbnQsIGFzc3VtaW5nIHRoZSBmaXJzdCBlbGVtZW50IGlzIGEgY29udGFpbmVyLgorICAgICMKKyAgICBydWxlIGF0ICgKKyAgICAgICAgaW5kZXggICMgVGhlIGVsZW1lbnQgaW5kZXgsIG9uZSBiYXNlZC4KKyAgICAgICAgOiAqICAjIEFkZGl0aW9uYWwgaW5kaWNlcyB0byBhY2Nlc3MgcmVjdXJzaXZlbHkuCisgICAgKQorICAgIHsKKyAgICAgICAgbG9jYWwgciA9ICQoc2VsZi52YWx1ZVskKGluZGV4KV0pIDsKKyAgICAgICAgaWYgJCgyKQorICAgICAgICB7CisgICAgICAgICAgICByID0gWyAkKHIpLmF0ICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkgOiAkKDkpIF0gOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHIpIDsKKyAgICB9CisKKyAgICAjIEdldCB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBlbGVtZW50LiBUaGlzIGhhcyB0aGUgc2FtZQorICAgICMgZnVuY3Rpb25hbGl0eSBhbmQgaW50ZXJmYWNlIGFzICJhdCIgYnV0IGluIGFkZGl0aW9uIGdldHMgdGhlIHZhbHVlIG9mIHRoZQorICAgICMgcmVmZXJlbmNlZCBlbGVtZW50LCBhc3N1bWluZyBpdCBpcyBhICJub2RlIi4KKyAgICAjCisgICAgcnVsZSBnZXQtYXQgKAorICAgICAgICBpbmRleCAgIyBUaGUgZWxlbWVudCBpbmRleCwgb25lIGJhc2VkLgorICAgICAgICA6ICogICMgQWRkaXRpb25hbCBpbmRpY2VzIHRvIGFjY2VzcyByZWN1cnNpdmVseS4KKyAgICApCisgICAgeworICAgICAgICBsb2NhbCByID0gJChzZWxmLnZhbHVlWyQoaW5kZXgpXSkgOworICAgICAgICBpZiAkKDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHIgPSBbICQocikuYXQgJCgyKSA6ICQoMykgOiAkKDQpIDogJCg1KSA6ICQoNikgOiAkKDcpIDogJCg4KSA6ICQoOSkgXSA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFsgJChyKS5nZXQgXSA7CisgICAgfQorCisgICAgIyBJbnNlcnQgdGhlIGdpdmVuIHZhbHVlIGludG8gdGhlIGZyb250IG9mIHRoZSB2ZWN0b3IgcHVzaGluZyB0aGUgcmVzdCBvZgorICAgICMgdGhlIGVsZW1lbnRzIGJhY2suCisgICAgIworICAgIHJ1bGUgcHVzaC1mcm9udCAoCisgICAgICAgIHZhbHVlICAjIFZhbHVlIHRvIGJlY29tZSBmaXJzdCBlbGVtZW50LgorICAgICkKKyAgICB7CisgICAgICAgIHNlbGYudmFsdWUgPSAkKHZhbHVlKSAkKHNlbGYudmFsdWUpIDsKKyAgICB9CisKKyAgICAjIFJlbW92ZSB0aGUgZnJvbnQgZWxlbWVudCBmcm9tIHRoZSB2ZWN0b3IuIERvZXMgbm90IHJldHVybiB0aGUgdmFsdWUuIE5vCisgICAgIyBlZmZlY3QgaWYgdmVjdG9yIGlzIGVtcHR5LgorICAgICMKKyAgICBydWxlIHBvcC1mcm9udCAoICkKKyAgICB7CisgICAgICAgIHNlbGYudmFsdWUgPSAkKHNlbGYudmFsdWVbMi1dKSA7CisgICAgfQorCisgICAgIyBBZGQgdGhlIGdpdmVuIHZhbHVlIGF0IHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4KKyAgICAjCisgICAgcnVsZSBwdXNoLWJhY2sgKAorICAgICAgICB2YWx1ZSAgIyBWYWx1ZSB0byBiZWNvbWUgYmFjayBlbGVtZW50LgorICAgICkKKyAgICB7CisgICAgICAgIHNlbGYudmFsdWUgKz0gJCh2YWx1ZSkgOworICAgIH0KKworICAgICMgUmVtb3ZlIHRoZSBiYWNrIGVsZW1lbnQgZnJvbSB0aGUgdmVjdG9yLiBEb2VzIG5vdCByZXR1cm4gdGhlIHZhbHVlLiBObworICAgICMgZWZmZWN0IGlmIHZlY3RvciBpcyBlbXB0eS4KKyAgICAjCisgICAgcnVsZSBwb3AtYmFjayAoICkKKyAgICB7CisgICAgICAgIHNlbGYudmFsdWUgPSAkKHNlbGYudmFsdWVbMS0tMl0pIDsKKyAgICB9CisKKyAgICAjIEluc2VydCB0aGUgZ2l2ZW4gdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4LCBvbmUgYmFzZWQuIFRoZSB2YWx1ZXMgYXQgYW5kIHRvCisgICAgIyB0aGUgcmlnaHQgb2YgdGhlIGluZGV4IGFyZSBwdXNoZWQgYmFjayB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXcgdmFsdWUuCisgICAgIyBJZiB0aGUgaW5kZXggaXMgcGFzc2VkIHRoZSBlbmQgb2YgdGhlIHZlY3RvciB0aGUgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUKKyAgICAjIGVuZC4KKyAgICAjCisgICAgcnVsZSBpbnNlcnQgKAorICAgICAgICBpbmRleCAgIyBUaGUgaW5kZXggdG8gaW5zZXJ0IGF0LCBvbmUgYmFzZWQuCisgICAgICAgIDogdmFsdWUgICMgVGhlIHZhbHVlIHRvIGluc2VydC4KKyAgICApCisgICAgeworICAgICAgICBsb2NhbCBsZWZ0ID0gJChzZWxmLnZhbHVlWzEtJChpbmRleCldKSA7CisgICAgICAgIGxvY2FsIHJpZ2h0ID0gJChzZWxmLnZhbHVlWyQoaW5kZXgpLV0pIDsKKyAgICAgICAgaWYgJChyaWdodCktaXMtbm90LWVtcHR5CisgICAgICAgIHsKKyAgICAgICAgICAgIGxlZnQgPSAkKGxlZnRbMS0tMl0pIDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLnZhbHVlID0gJChsZWZ0KSAkKHZhbHVlKSAkKHJpZ2h0KSA7CisgICAgfQorCisgICAgIyBSZW1vdmUgb25lIG9yIG1vcmUgZWxlbWVudHMgZnJvbSB0aGUgdmVjdG9yLiBUaGUgcmFuZ2UgaXMgaW5jbHVzaXZlLCBhbmQKKyAgICAjIG5vdCBzcGVjaWZ5aW5nIGFuIGVuZCBpcyBlcXVpdmFsZW50IHRvIHRoZSBbc3RhcnQsIHN0YXJ0XSByYW5nZS4KKyAgICAjCisgICAgcnVsZSBlcmFzZSAoCisgICAgICAgIHN0YXJ0ICAjIEluZGV4IG9mIGZpcnN0IGVsZW1lbnQgdG8gcmVtb3ZlLgorICAgICAgICBlbmQgPyAgIyBPcHRpb25hbCwgaW5kZXggb2YgbGFzdCBlbGVtZW50IHRvIHJlbW92ZS4KKyAgICApCisgICAgeworICAgICAgICBlbmQgPz0gJChzdGFydCkgOworICAgICAgICBsb2NhbCBsZWZ0ID0gJChzZWxmLnZhbHVlWzEtJChzdGFydCldKSA7CisgICAgICAgIGxlZnQgPSAkKGxlZnRbMS0tMl0pIDsKKyAgICAgICAgbG9jYWwgcmlnaHQgPSAkKHNlbGYudmFsdWVbJChlbmQpLV0pIDsKKyAgICAgICAgcmlnaHQgPSAkKHJpZ2h0WzItXSkgOworICAgICAgICBzZWxmLnZhbHVlID0gJChsZWZ0KSAkKHJpZ2h0KSA7CisgICAgfQorCisgICAgIyBSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhlIHZlY3Rvci4KKyAgICAjCisgICAgcnVsZSBjbGVhciAoICkKKyAgICB7CisgICAgICAgIHNlbGYudmFsdWUgPSA7CisgICAgfQorCisgICAgIyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCisgICAgIworICAgIHJ1bGUgc2l6ZSAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBbIHNlcXVlbmNlLmxlbmd0aCAkKHNlbGYudmFsdWUpIF0gOworICAgIH0KKworICAgICMgUmV0dXJucyAidHJ1ZSIgaWYgdGhlcmUgYXJlIE5PIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IsIGVtcHR5IG90aGVyd2lzZS4KKyAgICAjCisgICAgcnVsZSBlbXB0eSAoICkKKyAgICB7CisgICAgICAgIGlmICEgJChzZWxmLnZhbHVlKS1pcy1ub3QtZW1wdHkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWUgOworICAgICAgICB9CisgICAgfQorCisgICAgIyBSZXR1cm5zIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGNvbnRlbnQuCisgICAgIworICAgIHJ1bGUgc3RyICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJbIiBbIHNlcXVlbmNlLnRyYW5zZm9ybSB1dGlsaXR5LnN0ciA6ICQoc2VsZi52YWx1ZSkgXSAiXSIgOworICAgIH0KKworICAgICMgU29ydHMgdGhlIHZlY3RvciBpbnBsYWNlLCBjYWxsaW5nICd1dGlsaXR5Lmxlc3MnIGZvciBjb21wYXJpc29ucy4KKyAgICAjCisgICAgcnVsZSBzb3J0ICggKQorICAgIHsKKyAgICAgICAgc2VsZi52YWx1ZSA9IFsgc2VxdWVuY2UuaW5zZXJ0aW9uLXNvcnQgJChzZWxmLnZhbHVlKSA6IHV0aWxpdHkubGVzcyBdIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiBjb250ZW50IGlzIGVxdWFsIHRvIHRoZSBjb250ZW50IG9mIG90aGVyIHZlY3Rvci4gVXNlcworICAgICMgJ3V0aWxpdHkuZXF1YWwnIGZvciBjb21wYXJpc29uLgorICAgICMKKyAgICBydWxlIGVxdWFsICggYW5vdGhlciApCisgICAgeworICAgICAgICBsb2NhbCBtaXNtYXRjaCA7CisgICAgICAgIGxvY2FsIHNpemUgPSBbIHNpemUgXSA7CisgICAgICAgIGlmICQoc2l6ZSkgPSBbICQoYW5vdGhlcikuc2l6ZSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciBsb2NhbCBpIGluIFsgbnVtYmVycy5yYW5nZSAxICQoc2l6ZSkgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICEgWyB1dGlsaXR5LmVxdWFsIFsgYXQgJChpKSBdIFsgJChhbm90aGVyKS5hdCAkKGkpIF0gXQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2ggPSB0cnVlIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtaXNtYXRjaCA9IHRydWUgOworICAgICAgICB9CisKKyAgICAgICAgaWYgISAkKG1pc21hdGNoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworcnVsZSBfX3Rlc3RfXyAoICkKK3sKKyAgICBpbXBvcnQgYXNzZXJ0IDsKKyAgICBpbXBvcnQgImNsYXNzIiA6IG5ldyA7CisKKyAgICBsb2NhbCB2MSA9IFsgbmV3IHZlY3RvciBdIDsKKyAgICBhc3NlcnQudHJ1ZSAkKHYxKS5lcXVhbCAkKHYxKSA7CisgICAgYXNzZXJ0LnRydWUgJCh2MSkuZW1wdHkgOworICAgIGFzc2VydC5yZXN1bHQgMCA6ICQodjEpLnNpemUgOworICAgIGFzc2VydC5yZXN1bHQgIlsiICJdIiA6ICQodjEpLnN0ciA7CisgICAgJCh2MSkucHVzaC1iYWNrIGIgOworICAgICQodjEpLnB1c2gtZnJvbnQgYSA7CisgICAgYXNzZXJ0LnJlc3VsdCAiWyIgYSBiICJdIiA6ICQodjEpLnN0ciA7CisgICAgYXNzZXJ0LnJlc3VsdCBhIDogJCh2MSkuZnJvbnQgOworICAgIGFzc2VydC5yZXN1bHQgYiA6ICQodjEpLmJhY2sgOworICAgICQodjEpLmluc2VydCAyIDogZCA7CisgICAgJCh2MSkuaW5zZXJ0IDIgOiBjIDsKKyAgICAkKHYxKS5pbnNlcnQgNCA6IGYgOworICAgICQodjEpLmluc2VydCA0IDogZSA7CisgICAgJCh2MSkucG9wLWJhY2sgOworICAgIGFzc2VydC5yZXN1bHQgNSA6ICQodjEpLnNpemUgOworICAgIGFzc2VydC5yZXN1bHQgZCA6ICQodjEpLmF0IDMgOworICAgICQodjEpLnBvcC1mcm9udCA7CisgICAgYXNzZXJ0LnJlc3VsdCBjIDogJCh2MSkuZnJvbnQgOworICAgIGFzc2VydC5mYWxzZSAkKHYxKS5lbXB0eSA7CisgICAgJCh2MSkuZXJhc2UgMyA0IDsKKyAgICBhc3NlcnQucmVzdWx0IDIgOiAkKHYxKS5zaXplIDsKKworICAgIGxvY2FsIHYyID0gWyBuZXcgdmVjdG9yIHEgdyBlIHIgdCB5IF0gOworICAgIGFzc2VydC5yZXN1bHQgNiA6ICQodjIpLnNpemUgOworICAgICQodjEpLnB1c2gtYmFjayAkKHYyKSA7CisgICAgYXNzZXJ0LnJlc3VsdCAzIDogJCh2MSkuc2l6ZSA7CisgICAgbG9jYWwgdjItYWxpYXMgPSBbICQodjEpLmJhY2sgXSA7CisgICAgYXNzZXJ0LnJlc3VsdCBlIDogJCh2Mi1hbGlhcykuYXQgMyA7CisgICAgJCh2MSkuY2xlYXIgOworICAgIGFzc2VydC50cnVlICQodjEpLmVtcHR5IDsKKyAgICBhc3NlcnQuZmFsc2UgJCh2Mi1hbGlhcykuZW1wdHkgOworICAgICQodjIpLnBvcC1iYWNrIDsKKyAgICBhc3NlcnQucmVzdWx0IHQgOiAkKHYyLWFsaWFzKS5iYWNrIDsKKworICAgIGxvY2FsIHYzID0gWyBuZXcgdmVjdG9yIF0gOworICAgICQodjMpLnB1c2gtYmFjayBbIG5ldyB2ZWN0b3IgMSAyIDMgNCA1IF0gOworICAgICQodjMpLnB1c2gtYmFjayBbIG5ldyB2ZWN0b3IgYSBiIGMgXSA7CisgICAgYXNzZXJ0LnJlc3VsdCAiWyIgIlsiIDEgMiAzIDQgNSAiXSIgIlsiIGEgYiBjICJdIiAiXSIgOiAkKHYzKS5zdHIgOworICAgICQodjMpLnB1c2gtYmFjayBbIG5ldyB2ZWN0b3IgWyBuZXcgdmVjdG9yIHggeSB6IF0gWyBuZXcgdmVjdG9yIDcgOCA5IF0gXSA7CisgICAgYXNzZXJ0LnJlc3VsdCAxIDogJCh2MykuYXQgMSA6IDEgOworICAgIGFzc2VydC5yZXN1bHQgYiA6ICQodjMpLmF0IDIgOiAyIDsKKyAgICBhc3NlcnQucmVzdWx0IGEgYiBjIDogJCh2MykuZ2V0LWF0IDIgOworICAgIGFzc2VydC5yZXN1bHQgNyA4IDkgOiAkKHYzKS5nZXQtYXQgMyA6IDIgOworCisgICAgbG9jYWwgdjQgPSBbIG5ldyB2ZWN0b3IgNCAzIDYgXSA7CisgICAgJCh2NCkuc29ydCA7CisgICAgYXNzZXJ0LnJlc3VsdCAzIDQgNiA6ICQodjQpLmdldCA7CisgICAgYXNzZXJ0LmZhbHNlICQodjQpLmVxdWFsICQodjMpIDsKKworICAgIGxvY2FsIHY1ID0gWyBuZXcgdmVjdG9yIDMgNCA2IF0gOworICAgIGFzc2VydC50cnVlICQodjQpLmVxdWFsICQodjUpIDsKKyAgICAjIENoZWNrIHRoYXQgdmVjdG9ycyBvZiBkaWZmZXJlbnQgc2l6ZXMgYXJlIGNvbnNpZGVyZWQgbm9uLWVxdWFsLgorICAgICQodjUpLnBvcC1iYWNrIDsKKyAgICBhc3NlcnQuZmFsc2UgJCh2NCkuZXF1YWwgJCh2NSkgOworCisgICAgbG9jYWwgdjYgPSBbIG5ldyB2ZWN0b3IgWyBuZXcgdmVjdG9yIDEgMiAzIF0gXSA7CisgICAgYXNzZXJ0LnRydWUgJCh2NikuZXF1YWwgWyBuZXcgdmVjdG9yIFsgbmV3IHZlY3RvciAxIDIgMyBdIF0gOworCisgICAgbG9jYWwgdjcgPSBbIG5ldyB2ZWN0b3IgMTExIDIyMiAzMzMgXSA7CisgICAgYXNzZXJ0LnRydWUgJCh2NykuZXF1YWwgJCh2NykgOworICAgICQodjcpLmluc2VydCA0IDogNDQ0IDsKKyAgICBhc3NlcnQucmVzdWx0IDExMSAyMjIgMzMzIDQ0NCA6ICQodjcpLmdldCA7CisgICAgJCh2NykuaW5zZXJ0IDk5OSA6IHh4eCA7CisgICAgYXNzZXJ0LnJlc3VsdCAxMTEgMjIyIDMzMyA0NDQgeHh4IDogJCh2NykuZ2V0IDsKKworICAgIGxvY2FsIHY4ID0gWyBuZXcgdmVjdG9yICIiICIiICIiIF0gOworICAgIGFzc2VydC50cnVlICQodjgpLmVxdWFsICQodjgpIDsKKyAgICBhc3NlcnQuZmFsc2UgJCh2OCkuZW1wdHkgOworICAgIGFzc2VydC5yZXN1bHQgMyAgOiAkKHY4KS5zaXplIDsKKyAgICBhc3NlcnQucmVzdWx0ICIiIDogJCh2OCkuYXQgMSA7CisgICAgYXNzZXJ0LnJlc3VsdCAiIiA6ICQodjgpLmF0IDIgOworICAgIGFzc2VydC5yZXN1bHQgIiIgOiAkKHY4KS5hdCAzIDsKKyAgICBhc3NlcnQucmVzdWx0ICAgIDogJCh2OCkuYXQgNCA7CisgICAgJCh2OCkuaW5zZXJ0IDIgOiAyMjIgOworICAgIGFzc2VydC5yZXN1bHQgNCA6ICQodjgpLnNpemUgOworICAgIGFzc2VydC5yZXN1bHQgIiIgMjIyICIiICIiIDogJCh2OCkuZ2V0IDsKKyAgICAkKHY4KS5pbnNlcnQgOTk5IDogIiIgOworICAgIGFzc2VydC5yZXN1bHQgNSA6ICQodjgpLnNpemUgOworICAgIGFzc2VydC5yZXN1bHQgIiIgMjIyICIiICIiICIiIDogJCh2OCkuZ2V0IDsKKyAgICAkKHY4KS5pbnNlcnQgOTk5IDogeHh4IDsKKyAgICBhc3NlcnQucmVzdWx0IDYgOiAkKHY4KS5zaXplIDsKKyAgICBhc3NlcnQucmVzdWx0ICIiIDIyMiAiIiAiIiAiIiB4eHggOiAkKHY4KS5nZXQgOworCisgICAgIyBSZWdyZXNzaW9uIHRlc3QgZm9yIGEgYnVnIGNhdXNpbmcgdmVjdG9yLmVxdWFsIHRvIGNvbXBhcmUgb25seSB0aGUgZmlyc3QKKyAgICAjIGFuZCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBnaXZlbiB2ZWN0b3JzLgorICAgIGxvY2FsIHY5ID0gWyBuZXcgdmVjdG9yIDExMSB4eHggMjIyIF0gOworICAgIGxvY2FsIHYxMCA9IFsgbmV3IHZlY3RvciAxMTEgeXl5IDIyMiBdIDsKKyAgICBhc3NlcnQuZmFsc2UgJCh2OSkuZXF1YWwgJCh2MTApIDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9kb2MuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91dGlsL2RvYy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmMmRmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9kb2MuamFtCkBAIC0wLDAgKzEsMTAwMiBAQAorIyBDb3B5cmlnaHQgMjAwMiwgMjAwNSBEYXZlIEFicmFoYW1zCisjIENvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDA2IFJlbmUgUml2ZXJhCisjIENvcHlyaWdodCAyMDAzIFZsYWRpbWlyIFBydXMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgRG9jdW1lbnRhdGlvbiBzeXN0ZW0sIGhhbmRsZXMgLS1oZWxwIHJlcXVlc3RzLgorIyBJdCBkZWZpbmVzIHJ1bGVzIHRoYXQgYXR0YWNoIGRvY3VtZW50YXRpb24gdG8gbW9kdWxlcywgcnVsZXMsIGFuZCB2YXJpYWJsZXMuCisjIENvbGxlY3RzIGFuZCBnZW5lcmF0ZXMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHZhcmlvdXMgcGFydHMgb2YgdGhlIGJ1aWxkCisjIHN5c3RlbS4gVGhlIGRvY3VtZW50YXRpb24gaXMgY29sbGVjdGVkIGZyb20gY29tbWVudHMgaW50ZWdyYXRlZCBpbnRvIHRoZSBjb2RlLgorCitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgcHJpbnQgOworaW1wb3J0IHNldCA7CitpbXBvcnQgY29udGFpbmVyIDsKK2ltcG9ydCAiY2xhc3MiIDsKK2ltcG9ydCBzZXF1ZW5jZSA7CitpbXBvcnQgcGF0aCA7CisKKworIyBUaGUgdHlwZSBvZiBvdXRwdXQgdG8gZ2VuZXJhdGUuCisjICJjb25zb2xlIiBpcyBmb3JtYXRlZCB0ZXh0IGVjaG9lZCB0byB0aGUgY29uc29sZSAodGhlIGRlZmF1bHQpOworIyAidGV4dCIgaXMgZm9ybWF0ZWQgdGV4dCBhcHBlbmRlZCB0byB0aGUgb3V0cHV0IGZpbGU7CisjICJodG1sIiBpcyBIVE1MIG91dHB1dCB0byB0aGUgZmlsZS4KKyMKK2hlbHAtb3V0cHV0ID0gY29uc29sZSA7CisKKworIyBUaGUgZmlsZSB0byBvdXRwdXQgZG9jdW1lbnRhdGlvbiB0byB3aGVuIGdlbmVyYXRpbmcgInRleHQiIG9yICJodG1sIiBoZWxwLgorIyBUaGlzIGlzIHdpdGhvdXQgZXh0ZW5zaW9uIGFzIHRoZSBleHRlbnNpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgdHlwZSBvZgorIyBvdXRwdXQuCisjCitoZWxwLW91dHB1dC1maWxlID0gaGVscCA7CisKKyMgV2hldGhlciB0byBpbmNsdWRlIGxvY2FsIHJ1bGVzIGluIGhlbHAgb3V0cHV0LgorIworLm9wdGlvbi5zaG93LWxvY2FscyA/PSA7CisKKyMgV2hlbiBzaG93aW5nIGRvY3VtZW50YXRpb24gZm9yIGEgbW9kdWxlLCB3aGV0aGVyIHRvIGFsc28gZ2VuZXJhdGUKKyMgYXV0b21hdGljYWxseSB0aGUgZGV0YWlsZWQgZG9jcyBmb3IgZWFjaCBpdGVtIGluIHRoZSBtb2R1bGUuCisjCisub3B0aW9uLmRldGFpbGVkID89IDsKKworIyBHZW5lcmF0ZSBkZWJ1ZyBvdXRwdXQgYXMgdGhlIGhlbHAgaXMgZ2VuZXJhdGVkIGFuZCBtb2R1bGVzIGFyZSBwYXJzZWQuCisjCisub3B0aW9uLmRlYnVnID89IDsKKworIyBFbmFibGUgb3IgZGlzYWJsZSBhIGRvY3VtZW50YXRpb24gb3B0aW9uLgorIworbG9jYWwgcnVsZSBzZXQtb3B0aW9uICgKKyAgICBvcHRpb24gICMgVGhlIG9wdGlvbiBuYW1lLgorICAgIDogdmFsdWUgPyAgIyBFbmFibGVkIChub24tZW1wdHkpLCBvciBkaXNhYmxlZCAoZW1wdHkpCispCit7CisgICAgLm9wdGlvbi4kKG9wdGlvbikgPSAkKHZhbHVlKSA7Cit9CisKKworIyBTZXQgdGhlIHR5cGUgb2Ygb3V0cHV0LgorIworbG9jYWwgcnVsZSBzZXQtb3V0cHV0ICggdHlwZSApCit7CisgICAgaGVscC1vdXRwdXQgPSAkKHR5cGUpIDsKK30KKworCisjIFNldCB0aGUgb3V0cHV0IHRvIGEgZmlsZS4KKyMKK2xvY2FsIHJ1bGUgc2V0LW91dHB1dC1maWxlICggZmlsZSApCit7CisgICAgaGVscC1vdXRwdXQtZmlsZSA9ICQoZmlsZSkgOworfQorCisKKyMgRXh0cmFjdHMgdGhlIGJyaWVmIGNvbW1lbnQgZnJvbSBhIGNvbXBsZXRlIGNvbW1lbnQuIFRoZSBicmllZiBjb21tZW50IGlzIHRoZQorIyBmaXJzdCBzZW50ZW5jZS4KKyMKK2xvY2FsIHJ1bGUgYnJpZWYtY29tbWVudCAoCisgICAgZG9jcyAqICAjIFRoZSBjb21tZW50IGRvY3VtZW50YXRpb24uCispCit7CisgICAgbG9jYWwgZCA9ICQoZG9jczpKPSIgIikgOworICAgIGxvY2FsIHAgPSBbIE1BVENIICIuKihbLl0pJCIgOiAkKGQpIF0gOworICAgIGlmICEgJChwKSB7IGQgPSAkKGQpIi4iIDsgfQorICAgIGQgPSAkKGQpIiAiIDsKKyAgICBsb2NhbCBtID0gWyBNQVRDSCAiXihbXi5dK1suXSkoLiopIiA6ICQoZCkgXSA7CisgICAgbG9jYWwgYnJpZWYgPSAkKG1bMV0pIDsKKyAgICB3aGlsZSAkKG1bMl0pICYmIFsgTUFUQ0ggIl4oW14gXSkiIDogJChtWzJdKSBdCisgICAgeworICAgICAgICBtID0gWyBNQVRDSCAiXihbXi5dK1suXSkoLiopIiA6ICQobVsyXSkgXSA7CisgICAgICAgIGJyaWVmICs9ICQobVsxXSkgOworICAgIH0KKyAgICByZXR1cm4gJChicmllZjpKPSIiKSA7Cit9CisKKworIyBTcGVjaWZpZXMgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IG1vZHVsZS4KKyMKK2xvY2FsIHJ1bGUgc2V0LW1vZHVsZS1kb2MgKAorICAgIG1vZHVsZS1uYW1lID8gICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBkb2N1bWVudC4KKyAgICA6IGRvY3MgKiAgIyBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG1vZHVsZS4KKykKK3sKKyAgICBtb2R1bGUtbmFtZSA/PSAqIDsKKworICAgICQobW9kdWxlLW5hbWUpLmJyaWVmID0gWyBicmllZi1jb21tZW50ICQoZG9jcykgXSA7CisgICAgJChtb2R1bGUtbmFtZSkuZG9jcyA9ICQoZG9jcykgOworCisgICAgaWYgISAkKG1vZHVsZS1uYW1lKSBpbiAkKGRvY3VtZW50ZWQtbW9kdWxlcykKKyAgICB7CisgICAgICAgIGRvY3VtZW50ZWQtbW9kdWxlcyArPSAkKG1vZHVsZS1uYW1lKSA7CisgICAgfQorfQorCisKKyMgU3BlY2lmaWVzIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgY3VycmVudCBtb2R1bGUuCisjCitsb2NhbCBydWxlIHNldC1tb2R1bGUtY29weXJpZ2h0ICgKKyAgICBtb2R1bGUtbmFtZSA/ICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gZG9jdW1lbnQuCisgICAgOiBjb3B5cmlnaHQgKiAgIyBUaGUgY29weXJpZ2h0IGZvciB0aGUgbW9kdWxlLgorKQoreworICAgIG1vZHVsZS1uYW1lID89ICogOworCisgICAgJChtb2R1bGUtbmFtZSkuY29weS1icmllZiA9IFsgYnJpZWYtY29tbWVudCAkKGNvcHlyaWdodCkgXSA7CisgICAgJChtb2R1bGUtbmFtZSkuY29weS1kb2NzID0gJChkb2NzKSA7CisKKyAgICBpZiAhICQobW9kdWxlLW5hbWUpIGluICQoZG9jdW1lbnRlZC1tb2R1bGVzKQorICAgIHsKKyAgICAgICAgZG9jdW1lbnRlZC1tb2R1bGVzICs9ICQobW9kdWxlLW5hbWUpIDsKKyAgICB9Cit9CisKKworIyBTcGVjaWZpZXMgdGhlIGRvY3VtZW50YXRpb24gZm9yIGEgcnVsZSBpbiB0aGUgY3VycmVudCBtb2R1bGUuIElmIGNhbGxlZCBpbiB0aGUKKyMgZ2xvYmFsIG1vZHVsZSwgdGhpcyBkb2N1bWVudHMgYSBnbG9iYWwgcnVsZS4KKyMKK2xvY2FsIHJ1bGUgc2V0LXJ1bGUtZG9jICgKKyAgICBuYW1lICAjIFRoZSBuYW1lIG9mIHRoZSBydWxlLgorICAgIG1vZHVsZS1uYW1lID8gICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBkb2N1bWVudC4KKyAgICBpcy1sb2NhbCA/ICAjIFdoZXRoZXIgdGhlIHJ1bGUgaXMgbG9jYWwgdG8gdGhlIG1vZHVsZS4KKyAgICA6IGRvY3MgKiAgIyBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHJ1bGUuCispCit7CisgICAgbW9kdWxlLW5hbWUgPz0gKiA7CisKKyAgICAkKG1vZHVsZS1uYW1lKS4kKG5hbWUpLmJyaWVmID0gWyBicmllZi1jb21tZW50ICQoZG9jcykgXSA7CisgICAgJChtb2R1bGUtbmFtZSkuJChuYW1lKS5kb2NzID0gJChkb2NzKSA7CisgICAgJChtb2R1bGUtbmFtZSkuJChuYW1lKS5pcy1sb2NhbCA9ICQoaXMtbG9jYWwpIDsKKworICAgIGlmICEgJChuYW1lKSBpbiAkKCQobW9kdWxlLW5hbWUpLnJ1bGVzKQorICAgIHsKKyAgICAgICAgJChtb2R1bGUtbmFtZSkucnVsZXMgKz0gJChuYW1lKSA7CisgICAgfQorfQorCisKKyMgU3BlY2lmeSBhIGNsYXNzLCB3aWxsIHR1cm4gYSBydWxlIGludG8gYSBjbGFzcy4KKyMKK2xvY2FsIHJ1bGUgc2V0LWNsYXNzLWRvYyAoCisgICAgbmFtZSAgIyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MuCisgICAgbW9kdWxlLW5hbWUgPyAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGRvY3VtZW50LgorICAgIDogc3VwZXItbmFtZSA/ICAjIFRoZSBzdXBlciBjbGFzcyBuYW1lLgorKQoreworICAgIG1vZHVsZS1uYW1lID89ICogOworCisgICAgJChtb2R1bGUtbmFtZSkuJChuYW1lKS5pcy1jbGFzcyA9IHRydWUgOworICAgICQobW9kdWxlLW5hbWUpLiQobmFtZSkuc3VwZXItbmFtZSA9ICQoc3VwZXItbmFtZSkgOworICAgICQobW9kdWxlLW5hbWUpLiQobmFtZSkuY2xhc3MtcnVsZXMgPQorICAgICAgICBbIE1BVENIICJeKCQobmFtZSlbLl0uKikiIDogJCgkKG1vZHVsZS1uYW1lKS5ydWxlcykgXSA7CisgICAgJChtb2R1bGUtbmFtZSkuJCgkKG1vZHVsZS1uYW1lKS4kKG5hbWUpLmNsYXNzLXJ1bGVzKS5pcy1jbGFzcy1ydWxlID0gdHJ1ZSA7CisKKyAgICAkKG1vZHVsZS1uYW1lKS5jbGFzc2VzICs9ICQobmFtZSkgOworICAgICQobW9kdWxlLW5hbWUpLmNsYXNzLXJ1bGVzICs9ICQoJChtb2R1bGUtbmFtZSkuJChuYW1lKS5jbGFzcy1ydWxlcykgOworICAgICQobW9kdWxlLW5hbWUpLnJ1bGVzID0KKyAgICAgICAgWyBzZXQuZGlmZmVyZW5jZSAkKCQobW9kdWxlLW5hbWUpLnJ1bGVzKSA6CisgICAgICAgICAgICAkKG5hbWUpICQoJChtb2R1bGUtbmFtZSkuJChuYW1lKS5jbGFzcy1ydWxlcykgXSA7Cit9CisKKworIyBTZXQgdGhlIGFyZ3VtZW50IGNhbGwgc2lnbmF0dXJlIG9mIGEgcnVsZS4KKyMKK2xvY2FsIHJ1bGUgc2V0LXJ1bGUtYXJndW1lbnRzLXNpZ25hdHVyZSAoCisgICAgbmFtZSAgIyBUaGUgbmFtZSBvZiB0aGUgcnVsZS4KKyAgICBtb2R1bGUtbmFtZSA/ICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gZG9jdW1lbnQuCisgICAgOiBzaWduYXR1cmUgKiAgIyBUaGUgYXJndW1lbnRzIHNpZ25hdHVyZS4KKykKK3sKKyAgICBtb2R1bGUtbmFtZSA/PSAqIDsKKworICAgICQobW9kdWxlLW5hbWUpLiQobmFtZSkuc2lnbmF0dXJlID0gJChzaWduYXR1cmUpIDsKK30KKworCisjIFNwZWNpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYW4gYXJndW1lbnQgb2YgYSBydWxlLgorIworbG9jYWwgcnVsZSBzZXQtYXJndW1lbnQtZG9jICgKKyAgICBuYW1lICAjIFRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudC4KKyAgICBxdWFsaWZpZXIgICMgQXJndW1lbnQgc3ludGF4IHF1YWxpZmllciwgIioiLCAiKyIsIGV0Yy4KKyAgICBydWxlLW5hbWUgICMgVGhlIG5hbWUgb2YgdGhlIHJ1bGUuCisgICAgbW9kdWxlLW5hbWUgPyAgIyBUSGUgb3B0aW9uYWwgbmFtZSBvZiB0aGUgbW9kdWxlLgorICAgIDogZG9jcyAqICAjIFRoZSBkb2N1bWVudGF0aW9uLgorKQoreworICAgIG1vZHVsZS1uYW1lID89ICogOworCisgICAgJChtb2R1bGUtbmFtZSkuJChydWxlLW5hbWUpLmFyZ3MuJChuYW1lKS5xdWFsaWZpZXIgPSAkKHF1YWxpZmllcikgOworICAgICQobW9kdWxlLW5hbWUpLiQocnVsZS1uYW1lKS5hcmdzLiQobmFtZSkuZG9jcyA9ICQoZG9jcykgOworCisgICAgaWYgISAkKG5hbWUpIGluICQoJChtb2R1bGUtbmFtZSkuJChydWxlLW5hbWUpLmFyZ3MpCisgICAgeworICAgICAgICAkKG1vZHVsZS1uYW1lKS4kKHJ1bGUtbmFtZSkuYXJncyArPSAkKG5hbWUpIDsKKyAgICB9Cit9CisKKworIyBTcGVjaWZpZXMgdGhlIGRvY3VtZW50YXRpb24gZm9yIGEgdmFyaWFibGUgaW4gdGhlIGN1cnJlbnQgbW9kdWxlLiBJZiBjYWxsZWQgaW4KKyMgdGhlIGdsb2JhbCBtb2R1bGUsIHRoZSBnbG9iYWwgdmFyaWFibGUgaXMgZG9jdW1lbnRlZC4KKyMKK2xvY2FsIHJ1bGUgc2V0LXZhcmlhYmxlLWRvYyAoCisgICAgbmFtZSAgIyBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuCisgICAgZGVmYXVsdCAgIyBUaGUgZGVmYXVsdCB2YWx1ZS4KKyAgICBpbml0aWFsICAjIFRoZSBpbml0aWFsIHZhbHVlLgorICAgIG1vZHVsZS1uYW1lID8gICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBkb2N1bWVudC4KKyAgICA6IGRvY3MgKiAgIyBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLgorKQoreworICAgIG1vZHVsZS1uYW1lID89ICogOworCisgICAgJChtb2R1bGUtbmFtZSkuJChuYW1lKS5icmllZiA9IFsgYnJpZWYtY29tbWVudCAkKGRvY3MpIF0gOworICAgICQobW9kdWxlLW5hbWUpLiQobmFtZSkuZGVmYXVsdCA9ICQoZGVmYXVsdCkgOworICAgICQobW9kdWxlLW5hbWUpLiQobmFtZSkuaW5pdGlhbCA9ICQoaW5pdGlhbCkgOworICAgICQobW9kdWxlLW5hbWUpLiQobmFtZSkuZG9jcyA9ICQoZG9jcykgOworCisgICAgaWYgISAkKG5hbWUpIGluICQoJChtb2R1bGUtbmFtZSkudmFyaWFibGVzKQorICAgIHsKKyAgICAgICAgJChtb2R1bGUtbmFtZSkudmFyaWFibGVzICs9ICQobmFtZSkgOworICAgIH0KK30KKworCisjIEdlbmVyYXRlcyBhIGdlbmVyYWwgZGVzY3JpcHRpb24gb2YgdGhlIGRvY3VtZW50YXRpb24gYW5kIGhlbHAgc3lzdGVtLgorIworbG9jYWwgcnVsZSBwcmludC1oZWxwLXRvcCAoICkKK3sKKyAgICBwcmludC5zZWN0aW9uICJHZW5lcmFsIGNvbW1hbmQgbGluZSB1c2FnZSIgOworCisgICAgcHJpbnQudGV4dCAiICAgIGIyIFtvcHRpb25zXSBbcHJvcGVydGllc10gW3RhcmdldHNdCisKKyAgT3B0aW9ucywgcHJvcGVydGllcyBhbmQgdGFyZ2V0cyBjYW4gYmUgc3BlY2lmaWVkIGluIGFueSBvcmRlci4KKyAgICAgICIgOworCisgICAgcHJpbnQuc2VjdGlvbiAiSW1wb3J0YW50IE9wdGlvbnMiIDsKKworICAgIHByaW50Lmxpc3Qtc3RhcnQgOworICAgIHByaW50Lmxpc3QtaXRlbSAiLS1jbGVhbiBSZW1vdmUgdGFyZ2V0cyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIiA7CisgICAgcHJpbnQubGlzdC1pdGVtICItYSBSZWJ1aWxkIGV2ZXJ5dGhpbmciIDsKKyAgICBwcmludC5saXN0LWl0ZW0gIi1uIERvbid0IGV4ZWN1dGUgdGhlIGNvbW1hbmRzLCBvbmx5IHByaW50IHRoZW0iIDsKKyAgICBwcmludC5saXN0LWl0ZW0gIi1kKzIgU2hvdyBjb21tYW5kcyBhcyB0aGV5IGFyZSBleGVjdXRlZCIgOworICAgIHByaW50Lmxpc3QtaXRlbSAiLWQwIFN1cHJlc3MgYWxsIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMiIDsKKyAgICBwcmludC5saXN0LWl0ZW0gIi1xIFN0b3AgYXQgZmlyc3QgZXJyb3IiIDsKKyAgICBwcmludC5saXN0LWl0ZW0gIi0tcmVjb25maWd1cmUgUmVydW4gYWxsIGNvbmZpZ3VyYXRpb24gY2hlY2tzIiA7CisgICAgcHJpbnQubGlzdC1pdGVtICItLWRlYnVnLWNvbmZpZ3VyYXRpb24gRGlhZ25vc2UgY29uZmlndXJhdGlvbiIgOworICAgIHByaW50Lmxpc3QtaXRlbSAiLS1kZWJ1Zy1idWlsZGluZyBSZXBvcnQgd2hpY2ggdGFyZ2V0cyBhcmUgYnVpbHQgd2l0aCB3aGF0IHByb3BlcnRpZXMiIDsKKyAgICBwcmludC5saXN0LWl0ZW0gIi0tZGVidWctZ2VuZXJhdG9yIERpYWdub3NlIGdlbmVyYXRvciBzZWFyY2gvZXhlY3V0aW9uIiA7CisgICAgcHJpbnQubGlzdC1lbmQgOworCisgICAgcHJpbnQuc2VjdGlvbiAiRnVydGhlciBIZWxwIgorICAgICAgICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgY2FuIGJlIHVzZWQgdG8gb2J0YWluIGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbi4KKyAgICAgIDsKKworICAgIHByaW50Lmxpc3Qtc3RhcnQgOworICAgIHByaW50Lmxpc3QtaXRlbSAiLS1oZWxwLW9wdGlvbnMgUHJpbnQgbW9yZSBvYnNjdXJlIGNvbW1hbmQgbGluZSBvcHRpb25zLiIgOworICAgIHByaW50Lmxpc3QtaXRlbSAiLS1oZWxwLWludGVybmFsIEJvb3N0LkJ1aWxkIGltcGxlbWVudGF0aW9uIGRldGFpbHMuIiA7CisgICAgcHJpbnQubGlzdC1pdGVtICItLWhlbHAtZG9jLW9wdGlvbnMgSW1wbGVtZW50YXRpb24gZGV0YWlscyBkb2MgZm9ybWF0dGluZy4iIDsKKyAgICBwcmludC5saXN0LWVuZCA7Cit9CisKKworIyBHZW5lcmF0ZSBKYW0vQm9vc3QuSmFtIGNvbW1hbmQgdXNhZ2UgaW5mb3JtYXRpb24uCisjCitsb2NhbCBydWxlIHByaW50LWhlbHAtdXNhZ2UgKCApCit7CisgICAgcHJpbnQuc2VjdGlvbiAiQm9vc3QuQnVpbGQgVXNhZ2UiCisgICAgICAgICJiMiBbIG9wdGlvbnMuLi4gXSB0YXJnZXRzLi4uIgorICAgICAgICA7CisgICAgcHJpbnQubGlzdC1zdGFydCA7CisgICAgcHJpbnQubGlzdC1pdGVtIC1hOworICAgICAgICBCdWlsZCBhbGwgdGFyZ2V0cywgZXZlbiBpZiB0aGV5IGFyZSBjdXJyZW50LiA7CisgICAgcHJpbnQubGlzdC1pdGVtIC1meDsKKyAgICAgICAgUmVhZCAnIngiJyBhcyB0aGUgSmFtZmlsZSBmb3IgYnVpbGRpbmcgaW5zdGVhZCBvZiBzZWFyY2hpbmcgZm9yIHRoZQorICAgICAgICBCb29zdC5CdWlsZCBzeXN0ZW0uIDsKKyAgICBwcmludC5saXN0LWl0ZW0gLWp4OworICAgICAgICBSdW4gdXAgdG8gJyJ4IicgY29tbWFuZHMgY29uY3VycmVudGx5LiA7CisgICAgcHJpbnQubGlzdC1pdGVtIC1uOworICAgICAgICBEbyBub3QgZXhlY3V0ZSBidWlsZCBjb21tYW5kcy4gSW5zdGVhZCBwcmludCBvdXQgdGhlIGNvbW1hbmRzIGFzIHRoZXkKKyAgICAgICAgd291bGQgYmUgZXhlY3V0ZWQgaWYgYnVpbGRpbmcuIDsKKyAgICBwcmludC5saXN0LWl0ZW0gLW94OworICAgICAgICBPdXRwdXQgdGhlIHVzZWQgYnVpbGQgY29tbWFuZHMgdG8gZmlsZSAnIngiJy4gOworICAgIHByaW50Lmxpc3QtaXRlbSAtcTsKKyAgICAgICAgUXVpdCBhcyBzb29uIGFzIGEgYnVpbGQgZmFpbHVyZSBpcyBlbmNvdW50ZXJlZC4gV2l0aG91dCB0aGlzIG9wdGlvbgorICAgICAgICBCb29zdC5KYW0gd2lsbCBjb250aW51ZSBidWlsZGluZyBhcyBtYW55IHRhcmdldHMgYXMgaXQgY2FuLiA7CisgICAgcHJpbnQubGlzdC1pdGVtIC1zeD15OworICAgICAgICBTZXRzIGEgSmFtIHZhcmlhYmxlICcieCInIHRvIHRoZSB2YWx1ZSAnInkiJywgb3ZlcnJpZGluZyBhbnkgdmFsdWUgdGhhdAorICAgICAgICB2YXJpYWJsZSB3b3VsZCBoYXZlIGZyb20gdGhlIGVudmlyb25tZW50LiA7CisgICAgcHJpbnQubGlzdC1pdGVtIC10eDsKKyAgICAgICAgUmVidWlsZCB0aGUgdGFyZ2V0ICcieCInLCBldmVuIGlmIGl0IGlzIHVwLXRvLWRhdGUuIDsKKyAgICBwcmludC5saXN0LWl0ZW0gLXY7CisgICAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gb2YgYjIuIDsKKyAgICBwcmludC5saXN0LWl0ZW0gLS14OworICAgICAgICBBbnkgb3B0aW9uIG5vdCBleHBsaWNpdGx5IGhhbmRsZWQgYnkgQm9vc3QuQnVpbGQgcmVtYWlucyBhdmFpbGFibGUgdG8KKyAgICAgICAgYnVpbGQgc2NyaXB0cyB1c2luZyB0aGUgJyJBUkdWIicgdmFyaWFibGUuIDsKKyAgICBwcmludC5saXN0LWl0ZW0gLS1hYmJyZXZpYXRlLXBhdGhzOworICAgICAgICBVc2UgYWJicmV2aWF0ZWQgcGF0aHMgZm9yIHRhcmdldHMuIDsKKyAgICBwcmludC5saXN0LWl0ZW0gLS1oYXNoOworICAgICAgICBTaG9ydGVuIHRhcmdldCBwYXRocyBieSB1c2luZyBhbiBNRDUgaGFzaC4gOworICAgIHByaW50Lmxpc3QtaXRlbSAtZG47CisgICAgICAgIEVuYWJsZXMgb3V0cHV0IG9mIGRpYWdub3N0aWMgbWVzc2FnZXMuIFRoZSBkZWJ1ZyBsZXZlbCAnIm4iJyBhbmQgYWxsCisgICAgICAgIGJlbG93IGl0IGFyZSBlbmFibGVkIGJ5IHRoaXMgb3B0aW9uLiA7CisgICAgcHJpbnQubGlzdC1pdGVtIC1kK247CisgICAgICAgIEVuYWJsZXMgb3V0cHV0IG9mIGRpYWdub3N0aWMgbWVzc2FnZXMuIE9ubHkgdGhlIG91dHB1dCBmb3IgZGVidWcgbGV2ZWwKKyAgICAgICAgJyJuIicgaXMgZW5hYmxlZC4gOworICAgIHByaW50Lmxpc3QtZW5kIDsKKyAgICBwcmludC5zZWN0aW9uICJEZWJ1ZyBMZXZlbHMiCisgICAgICAgIEVhY2ggZGVidWcgbGV2ZWwgc2hvd3MgYSBkaWZmZXJlbnQgc2V0IG9mIGluZm9ybWF0aW9uLiBVc3VhbGx5IHdpdGgKKyAgICAgICAgaGlnaGVyIGxldmVscyBwcm9kdWNpbmcgbW9yZSB2ZXJib3NlIGluZm9ybWF0aW9uLiBUaGUgZm9sbG93aW5nIGxldmVscworICAgICAgICBhcmUgc3VwcG9ydGVkOiA7CisgICAgcHJpbnQubGlzdC1zdGFydCA7CisgICAgcHJpbnQubGlzdC1pdGVtIDA7CisgICAgICAgIFR1cm4gb2ZmIGFsbCBkaWFnbm9zdGljIG91dHB1dC4gT25seSBlcnJvcnMgYXJlIHJlcG9ydGVkLiA7CisgICAgcHJpbnQubGlzdC1pdGVtIDE7CisgICAgICAgIFNob3cgdGhlIGFjdGlvbnMgdGFrZW4gZm9yIGJ1aWxkaW5nIHRhcmdldHMsIGFzIHRoZXkgYXJlIGV4ZWN1dGVkLiA7CisgICAgcHJpbnQubGlzdC1pdGVtIDI7CisgICAgICAgIFNob3cgInF1aWV0IiBhY3Rpb25zIGFuZCBkaXNwbGF5IGFsbCBhY3Rpb24gdGV4dCwgYXMgdGhleSBhcmUgZXhlY3V0ZWQuIDsKKyAgICBwcmludC5saXN0LWl0ZW0gMzsKKyAgICAgICAgU2hvdyBkZXBlbmRlbmN5IGFuYWx5c2lzLCBhbmQgdGFyZ2V0L3NvdXJjZSB0aW1lc3RhbXBzL3BhdGhzLiA7CisgICAgcHJpbnQubGlzdC1pdGVtIDQ7CisgICAgICAgIFNob3cgYXJndW1lbnRzIG9mIHNoZWxsIGludm9jYXRpb25zLiA7CisgICAgcHJpbnQubGlzdC1pdGVtIDU7CisgICAgICAgIFNob3cgcnVsZSBpbnZvY2F0aW9ucyBhbmQgdmFyaWFibGUgZXhwYW5zaW9ucy4gOworICAgIHByaW50Lmxpc3QtaXRlbSA2OworICAgICAgICBTaG93IGRpcmVjdG9yeS9oZWFkZXIgZmlsZS9hcmNoaXZlIHNjYW5zLCBhbmQgYXR0ZW1wdHMgYXQgYmluZGluZyB0byB0YXJnZXRzLiA7CisgICAgcHJpbnQubGlzdC1pdGVtIDc7CisgICAgICAgIFNob3cgdmFyaWFibGUgc2V0dGluZ3MuIDsKKyAgICBwcmludC5saXN0LWl0ZW0gODsKKyAgICAgICAgU2hvdyB2YXJpYWJsZSBmZXRjaGVzLCB2YXJpYWJsZSBleHBhbnNpb25zLCBhbmQgZXZhbHVhdGlvbiBvZiAnImlmIicgZXhwcmVzc2lvbnMuIDsKKyAgICBwcmludC5saXN0LWl0ZW0gOTsKKyAgICAgICAgU2hvdyB2YXJpYWJsZSBtYW5pcHVsYXRpb24sIHNjYW5uZXIgdG9rZW5zLCBhbmQgbWVtb3J5IHVzYWdlLiA7CisgICAgcHJpbnQubGlzdC1pdGVtIDEwOworICAgICAgICBTaG93IGV4ZWN1dGlvbiB0aW1lcyBmb3IgcnVsZXMuIDsKKyAgICBwcmludC5saXN0LWl0ZW0gMTE7CisgICAgICAgIFNob3cgcGFyc2luZyBwcm9ncmVzcyBvZiBKYW1maWxlcy4gOworICAgIHByaW50Lmxpc3QtaXRlbSAxMjsKKyAgICAgICAgU2hvdyBncmFwaCBmb3IgdGFyZ2V0IGRlcGVuZGVuY2llcy4gOworICAgIHByaW50Lmxpc3QtaXRlbSAxMzsKKyAgICAgICAgU2hvdyBjaGFuZ2VzIGluIHRhcmdldCBzdGF0dXMgKGZhdGUpLiA7CisgICAgcHJpbnQubGlzdC1lbmQgOworfQorCisKKyMgR2VuZXJhdGVzIGRlc2NyaXB0aW9uIG9mIG9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGhlbHAgc3lzdGVtLiBUaGlzCisjIGF1dG9tYXRpY2FsbHkgcmVhZHMgdGhlIG9wdGlvbnMgYXMgYWxsIHZhcmlhYmxlcyBpbiB0aGUgZG9jIG1vZHVsZSBvZiB0aGUgZm9ybQorIyAiLm9wdGlvbi4qIi4KKyMKK2xvY2FsIHJ1bGUgcHJpbnQtaGVscC1vcHRpb25zICgKKyAgICBtb2R1bGUtbmFtZSAgIyBUaGUgZG9jIG1vZHVsZS4KKykKK3sKKyAgICBwcmludC5zZWN0aW9uICJIZWxwIE9wdGlvbnMiCisgICAgICAgIFRoZXNlIGFyZSBhbGwgdGhlIG9wdGlvbnMgYXZhaWxhYmxlIGZvciBlbmFibGluZyBvciBkaXNhYmxpbmcgdG8gY29udHJvbAorICAgICAgICB0aGUgaGVscCBzeXN0ZW0gaW4gdmFyaW91cyB3YXlzLiBPcHRpb25zIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHdpdGgKKyAgICAgICAgJyItLWhlbHAtZW5hYmxlLTxvcHRpb24+IicsIGFuZCAiJy0taGVscC1kaXNhYmxlLTxvcHRpb24+JyIKKyAgICAgICAgcmVzcGVjdGl2ZWx5LgorICAgICAgICA7CisgICAgbG9jYWwgb3B0aW9ucy10by1saXN0ID0gWyBNQVRDSCBeWy5db3B0aW9uWy5dKC4qKSA6ICQoJChtb2R1bGUtbmFtZSkudmFyaWFibGVzKSBdIDsKKyAgICBpZiAkKG9wdGlvbnMtdG8tbGlzdCkKKyAgICB7CisgICAgICAgIHByaW50Lmxpc3Qtc3RhcnQgOworICAgICAgICBmb3IgbG9jYWwgb3B0aW9uIGluIFsgc2VxdWVuY2UuaW5zZXJ0aW9uLXNvcnQgJChvcHRpb25zLXRvLWxpc3QpIF0KKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgZGVmID0gZGlzYWJsZWQgOworICAgICAgICAgICAgaWYgJCgkKG1vZHVsZS1uYW1lKS4ub3B0aW9uLiQob3B0aW9uKS5kZWZhdWx0KSAhPSAiKGVtcHR5KSIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWYgPSBlbmFibGVkIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50Lmxpc3QtaXRlbSAkKG9wdGlvbik6ICQoJChtb2R1bGUtbmFtZSkuLm9wdGlvbi4kKG9wdGlvbikuZG9jcykKKyAgICAgICAgICAgICAgICBEZWZhdWx0IGlzICQoZGVmKS4gOworICAgICAgICB9CisgICAgICAgIHByaW50Lmxpc3QtZW5kIDsKKyAgICB9Cit9CisKKworIyBHZW5lcmF0ZSBicmllZiBkb2N1bWVudGF0aW9uIGZvciBhbGwgdGhlIGtub3duIGl0ZW1zIGluIHRoZSBzZWN0aW9uIGZvciBhCisjIG1vZHVsZS4gUG9zc2libGUgc2VjdGlvbnMgYXJlOiAicnVsZXMiLCBhbmQgInZhcmlhYmxlcyIuCisjCitsb2NhbCBydWxlIHByaW50LWhlbHAtbW9kdWxlLXNlY3Rpb24gKAorICAgIG1vZHVsZSAgIyBUaGUgbW9kdWxlIG5hbWUuCisgICAgc2VjdGlvbiAgIyBydWxlcyBvciB2YXJpYWJsZXMuCisgICAgOiBzZWN0aW9uLWhlYWQgICMgVGhlIHRpdGxlIG9mIHRoZSBzZWN0aW9uLgorICAgIHNlY3Rpb24tZGVzY3JpcHRpb24gKiAgIyBUaGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHNlY3Rpb24uCispCit7CisgICAgaWYgJCgkKG1vZHVsZSkuJChzZWN0aW9uKSkKKyAgICB7CisgICAgICAgIHByaW50LnNlY3Rpb24gJChzZWN0aW9uLWhlYWQpICQoc2VjdGlvbi1kZXNjcmlwdGlvbikgOworICAgICAgICBwcmludC5saXN0LXN0YXJ0IDsKKyAgICAgICAgZm9yIGxvY2FsIGl0ZW0gaW4gWyBzZXF1ZW5jZS5pbnNlcnRpb24tc29ydCAkKCQobW9kdWxlKS4kKHNlY3Rpb24pKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHNob3cgPSA7CisgICAgICAgICAgICBpZiAhICQoJChtb2R1bGUpLiQoaXRlbSkuaXMtbG9jYWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2hvdyA9IHllcyA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAkKC5vcHRpb24uc2hvdy1sb2NhbHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2hvdyA9IHllcyA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAkKHNob3cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnQubGlzdC1pdGVtICQoaXRlbSk6ICQoJChtb2R1bGUpLiQoaXRlbSkuYnJpZWYpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludC5saXN0LWVuZCA7CisgICAgfQorfQorCisKKyMgR2VuZXJhdGUgZG9jdW1lbnRhdGlvbiBmb3IgYWxsIHBvc3NpYmxlIG1vZHVsZXMuIFdlIGF0dGVtcHQgdG8gbGlzdCBhbGwga25vd24KKyMgbW9kdWxlcyB0b2dldGhlciB3aXRoIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgZWFjaC4KKyMKK2xvY2FsIHJ1bGUgcHJpbnQtaGVscC1hbGwgKAorICAgIGlnbm9yZWQgICMgVXN1YWxseSB0aGUgbW9kdWxlIG5hbWUsIGJ1dCBpcyBpZ25vcmVkIGhlcmUuCispCit7CisgICAgcHJpbnQuc2VjdGlvbiAiTW9kdWxlcyIKKyAgICAgICAgIlRoZXNlIGFyZSBhbGwgdGhlIGtub3duIG1vZHVsZXMuIFVzZSAtLWhlbHAgPG1vZHVsZT4gdG8gZ2V0IG1vcmUiCisgICAgICAgICJkZXRhaWxlZCBpbmZvcm1hdGlvbi4iCisgICAgICAgIDsKKyAgICBpZiAkKGRvY3VtZW50ZWQtbW9kdWxlcykKKyAgICB7CisgICAgICAgIHByaW50Lmxpc3Qtc3RhcnQgOworICAgICAgICBmb3IgbG9jYWwgbW9kdWxlLW5hbWUgaW4gWyBzZXF1ZW5jZS5pbnNlcnRpb24tc29ydCAkKGRvY3VtZW50ZWQtbW9kdWxlcykgXQorICAgICAgICB7CisgICAgICAgICAgICAjIFRoZSBicmllZiBkb2NzIGZvciBlYWNoIG1vZHVsZS4KKyAgICAgICAgICAgIHByaW50Lmxpc3QtaXRlbSAkKG1vZHVsZS1uYW1lKTogJCgkKG1vZHVsZS1uYW1lKS5icmllZikgOworICAgICAgICB9CisgICAgICAgIHByaW50Lmxpc3QtZW5kIDsKKyAgICB9CisgICAgIyBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgZWFjaCBtb2R1bGUgd2hlbiBkZXRhaWxzIGFyZSByZXF1ZXN0ZWQuCisgICAgaWYgJChkb2N1bWVudGVkLW1vZHVsZXMpICYmICQoLm9wdGlvbi5kZXRhaWxlZCkKKyAgICB7CisgICAgICAgIGZvciBsb2NhbCBtb2R1bGUtbmFtZSBpbiBbIHNlcXVlbmNlLmluc2VydGlvbi1zb3J0ICQoZG9jdW1lbnRlZC1tb2R1bGVzKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgICMgVGhlIGJyaWVmIGRvY3MgZm9yIGVhY2ggbW9kdWxlLgorICAgICAgICAgICAgcHJpbnQtaGVscC1tb2R1bGUgJChtb2R1bGUtbmFtZSkgOworICAgICAgICB9CisgICAgfQorfQorCisKKyMgR2VuZXJhdGUgZG9jdW1lbnRhdGlvbiBmb3IgYSBtb2R1bGUuIEJhc2ljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb2R1bGUgaXMKKyMgZ2VuZXJhdGVkLgorIworbG9jYWwgcnVsZSBwcmludC1oZWxwLW1vZHVsZSAoCisgICAgbW9kdWxlLW5hbWUgICMgVGhlIG1vZHVsZSB0byBnZW5lcmF0ZSBkb2NzIGZvci4KKykKK3sKKyAgICAjIFByaW50IHRoZSBkb2NzLgorICAgIHByaW50LnNlY3Rpb24gIk1vZHVsZSAnJChtb2R1bGUtbmFtZSknIiAkKCQobW9kdWxlLW5hbWUpLmRvY3MpIDsKKworICAgICMgUHJpbnQgb3V0IHRoZSBkb2N1bWVudGVkIGNsYXNzZXMuCisgICAgcHJpbnQtaGVscC1tb2R1bGUtc2VjdGlvbiAkKG1vZHVsZS1uYW1lKSBjbGFzc2VzIDogIk1vZHVsZSAnJChtb2R1bGUtbmFtZSknIGNsYXNzZXMiCisgICAgICAgIFVzZSAtLWhlbHAgJChtb2R1bGUtbmFtZSkuPGNsYXNzLW5hbWU+IHRvIGdldCBtb3JlIGluZm9ybWF0aW9uLiA7CisKKyAgICAjIFByaW50IG91dCB0aGUgZG9jdW1lbnRlZCBydWxlcy4KKyAgICBwcmludC1oZWxwLW1vZHVsZS1zZWN0aW9uICQobW9kdWxlLW5hbWUpIHJ1bGVzIDogIk1vZHVsZSAnJChtb2R1bGUtbmFtZSknIHJ1bGVzIgorICAgICAgICBVc2UgLS1oZWxwICQobW9kdWxlLW5hbWUpLjxydWxlLW5hbWU+IHRvIGdldCBtb3JlIGluZm9ybWF0aW9uLiA7CisKKyAgICAjIFByaW50IG91dCB0aGUgZG9jdW1lbnRlZCB2YXJpYWJsZXMuCisgICAgcHJpbnQtaGVscC1tb2R1bGUtc2VjdGlvbiAkKG1vZHVsZS1uYW1lKSB2YXJpYWJsZXMgOiAiTW9kdWxlICckKG1vZHVsZS1uYW1lKScgdmFyaWFibGVzIgorICAgICAgICBVc2UgLS1oZWxwICQobW9kdWxlLW5hbWUpLjx2YXJpYWJsZS1uYW1lPiB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbi4gOworCisgICAgIyBQcmludCBvdXQgYWxsIHRoZSBzYW1lIGluZm9ybWF0aW9uIGJ1dCBpbmRldGFpbGVkIGZvcm0uCisgICAgaWYgJCgub3B0aW9uLmRldGFpbGVkKQorICAgIHsKKyAgICAgICAgcHJpbnQtaGVscC1jbGFzc2VzICQobW9kdWxlLW5hbWUpIDsKKyAgICAgICAgcHJpbnQtaGVscC1ydWxlcyAkKG1vZHVsZS1uYW1lKSA7CisgICAgICAgIHByaW50LWhlbHAtdmFyaWFibGVzICQobW9kdWxlLW5hbWUpIDsKKyAgICB9Cit9CisKKworIyBHZW5lcmF0ZSBkb2N1bWVudGF0aW9uIGZvciBhIHNldCBvZiBydWxlcyBpbiBhIG1vZHVsZS4KKyMKK2xvY2FsIHJ1bGUgcHJpbnQtaGVscC1ydWxlcyAoCisgICAgbW9kdWxlLW5hbWUgICMgTW9kdWxlIG9mIHRoZSBydWxlcy4KKyAgICA6IG5hbWUgKiAgIyBPcHRpb25hbCBsaXN0IG9mIHJ1bGVzIHRvIGRlc2NyaWJlLgorKQoreworICAgIG5hbWUgPz0gJCgkKG1vZHVsZS1uYW1lKS5ydWxlcykgOworICAgIGlmIFsgc2V0LmludGVyc2VjdGlvbiAkKG5hbWUpIDogJCgkKG1vZHVsZS1uYW1lKS5ydWxlcykgJCgkKG1vZHVsZS1uYW1lKS5jbGFzcy1ydWxlcykgXQorICAgIHsKKyAgICAgICAgIyBQcmludCBvdXQgdGhlIGdpdmVuIHJ1bGVzLgorICAgICAgICBmb3IgbG9jYWwgcnVsZS1uYW1lIGluIFsgc2VxdWVuY2UuaW5zZXJ0aW9uLXNvcnQgJChuYW1lKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQoLm9wdGlvbi5zaG93LWxvY2FscykgfHwgISAkKCQobW9kdWxlLW5hbWUpLiQocnVsZS1uYW1lKS5pcy1sb2NhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBzaWduYXR1cmUgPSAkKCQobW9kdWxlLW5hbWUpLiQocnVsZS1uYW1lKS5zaWduYXR1cmU6Sj0iICIpIDsKKyAgICAgICAgICAgICAgICBzaWduYXR1cmUgPz0gIiIgOworICAgICAgICAgICAgICAgIHByaW50LnNlY3Rpb24gIlJ1bGUgJyQobW9kdWxlLW5hbWUpLiQocnVsZS1uYW1lKSAoICQoc2lnbmF0dXJlKSApJyIKKyAgICAgICAgICAgICAgICAgICAgJCgkKG1vZHVsZS1uYW1lKS4kKHJ1bGUtbmFtZSkuZG9jcykgOworICAgICAgICAgICAgICAgIGlmICQoJChtb2R1bGUtbmFtZSkuJChydWxlLW5hbWUpLmFyZ3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludC5saXN0LXN0YXJ0IDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIGxvY2FsIGFyZy1uYW1lIGluICQoJChtb2R1bGUtbmFtZSkuJChydWxlLW5hbWUpLmFyZ3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Lmxpc3QtaXRlbSAkKGFyZy1uYW1lKTogJCgkKG1vZHVsZS1uYW1lKS4kKHJ1bGUtbmFtZSkuYXJncy4kKGFyZy1uYW1lKS5kb2NzKSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnQubGlzdC1lbmQgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisjIEdlbmVyYXRlIGRvY3VtZW50YXRpb24gZm9yIGEgc2V0IG9mIGNsYXNzZXMgaW4gYSBtb2R1bGUuCisjCitsb2NhbCBydWxlIHByaW50LWhlbHAtY2xhc3NlcyAoCisgICAgbW9kdWxlLW5hbWUgICMgTW9kdWxlIG9mIHRoZSBjbGFzc2VzLgorICAgIDogbmFtZSAqICAjIE9wdGlvbmFsIGxpc3Qgb2YgY2xhc3NlcyB0byBkZXNjcmliZS4KKykKK3sKKyAgICBuYW1lID89ICQoJChtb2R1bGUtbmFtZSkuY2xhc3NlcykgOworICAgIGlmIFsgc2V0LmludGVyc2VjdGlvbiAkKG5hbWUpIDogJCgkKG1vZHVsZS1uYW1lKS5jbGFzc2VzKSBdCisgICAgeworICAgICAgICAjIFByaW50IG91dCB0aGUgZ2l2ZW4gY2xhc3Nlcy4KKyAgICAgICAgZm9yIGxvY2FsIGNsYXNzLW5hbWUgaW4gWyBzZXF1ZW5jZS5pbnNlcnRpb24tc29ydCAkKG5hbWUpIF0KKyAgICAgICAgeworICAgICAgICAgICAgaWYgJCgub3B0aW9uLnNob3ctbG9jYWxzKSB8fCAhICQoJChtb2R1bGUtbmFtZSkuJChjbGFzcy1uYW1lKS5pcy1sb2NhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBzaWduYXR1cmUgPSAkKCQobW9kdWxlLW5hbWUpLiQoY2xhc3MtbmFtZSkuc2lnbmF0dXJlOko9IiAiKSA7CisgICAgICAgICAgICAgICAgc2lnbmF0dXJlID89ICIiIDsKKyAgICAgICAgICAgICAgICBwcmludC5zZWN0aW9uICJDbGFzcyAnJChtb2R1bGUtbmFtZSkuJChjbGFzcy1uYW1lKSAoICQoc2lnbmF0dXJlKSApJyIKKyAgICAgICAgICAgICAgICAgICAgJCgkKG1vZHVsZS1uYW1lKS4kKGNsYXNzLW5hbWUpLmRvY3MpCisgICAgICAgICAgICAgICAgICAgIkluaGVyaXRzIGZyb20gJyIkKCQobW9kdWxlLW5hbWUpLiQoY2xhc3MtbmFtZSkuc3VwZXItbmFtZSkiJy4iIDsKKyAgICAgICAgICAgICAgICBpZiAkKCQobW9kdWxlLW5hbWUpLiQoY2xhc3MtbmFtZSkuYXJncykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50Lmxpc3Qtc3RhcnQgOworICAgICAgICAgICAgICAgICAgICBmb3IgbG9jYWwgYXJnLW5hbWUgaW4gJCgkKG1vZHVsZS1uYW1lKS4kKGNsYXNzLW5hbWUpLmFyZ3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Lmxpc3QtaXRlbSAkKGFyZy1uYW1lKTogJCgkKG1vZHVsZS1uYW1lKS4kKGNsYXNzLW5hbWUpLmFyZ3MuJChhcmctbmFtZSkuZG9jcykgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByaW50Lmxpc3QtZW5kIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgUHJpbnQgb3V0IHRoZSBkb2N1bWVudGVkIHJ1bGVzIG9mIHRoZSBjbGFzcy4KKyAgICAgICAgICAgIHByaW50LWhlbHAtbW9kdWxlLXNlY3Rpb24gJChtb2R1bGUtbmFtZSkgJChjbGFzcy1uYW1lKS5jbGFzcy1ydWxlcyA6ICJDbGFzcyAnJChtb2R1bGUtbmFtZSkuJChjbGFzcy1uYW1lKScgcnVsZXMiCisgICAgICAgICAgICAgICAgVXNlIC0taGVscCAkKG1vZHVsZS1uYW1lKS48cnVsZS1uYW1lPiB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbi4gOworCisgICAgICAgICAgICAjIFByaW50IG91dCBhbGwgdGhlIHJ1bGVzIGlmIGRldGFpbHMgYXJlIHJlcXVlc3RlZC4KKyAgICAgICAgICAgIGlmICQoLm9wdGlvbi5kZXRhaWxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludC1oZWxwLXJ1bGVzICQobW9kdWxlLW5hbWUpIDogJCgkKG1vZHVsZS1uYW1lKS4kKGNsYXNzLW5hbWUpLmNsYXNzLXJ1bGVzKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyBHZW5lcmF0ZSBkb2N1bWVudGF0aW9uIGZvciBhIHNldCBvZiB2YXJpYWJsZXMgaW4gYSBtb2R1bGUuCisjCitsb2NhbCBydWxlIHByaW50LWhlbHAtdmFyaWFibGVzICgKKyAgICBtb2R1bGUtbmFtZSA/ICAjIE1vZHVsZSBvZiB0aGUgdmFyaWFibGVzLgorICAgIDogbmFtZSAqICAjIE9wdGlvbmFsIGxpc3Qgb2YgdmFyaWFibGVzIHRvIGRlc2NyaWJlLgorKQoreworICAgIG5hbWUgPz0gJCgkKG1vZHVsZS1uYW1lKS52YXJpYWJsZXMpIDsKKyAgICBpZiBbIHNldC5pbnRlcnNlY3Rpb24gJChuYW1lKSA6ICQoJChtb2R1bGUtbmFtZSkudmFyaWFibGVzKSBdCisgICAgeworICAgICAgICAjIFByaW50IG91dCB0aGUgZ2l2ZW4gdmFyaWFibGVzLgorICAgICAgICBmb3IgbG9jYWwgdmFyaWFibGUtbmFtZSBpbiBbIHNlcXVlbmNlLmluc2VydGlvbi1zb3J0ICQobmFtZSkgXQorICAgICAgICB7CisgICAgICAgICAgICBwcmludC5zZWN0aW9uICJWYXJpYWJsZSAnJChtb2R1bGUtbmFtZSkuJCh2YXJpYWJsZS1uYW1lKSciICQoJChtb2R1bGUtbmFtZSkuJCh2YXJpYWJsZS1uYW1lKS5kb2NzKSA7CisgICAgICAgICAgICBpZiAkKCQobW9kdWxlLW5hbWUpLiQodmFyaWFibGUtbmFtZSkuZGVmYXVsdCkgfHwKKyAgICAgICAgICAgICAgICAkKCQobW9kdWxlLW5hbWUpLiQodmFyaWFibGUtbmFtZSkuaW5pdGlhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludC5saXN0LXN0YXJ0IDsKKyAgICAgICAgICAgICAgICBpZiAkKCQobW9kdWxlLW5hbWUpLiQodmFyaWFibGUtbmFtZSkuZGVmYXVsdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50Lmxpc3QtaXRlbSAiZGVmYXVsdCB2YWx1ZToiICckKCQobW9kdWxlLW5hbWUpLiQodmFyaWFibGUtbmFtZSkuZGVmYXVsdDpKPSIgIiknIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgJCgkKG1vZHVsZS1uYW1lKS4kKHZhcmlhYmxlLW5hbWUpLmluaXRpYWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludC5saXN0LWl0ZW0gImluaXRpYWwgdmFsdWU6IiAnJCgkKG1vZHVsZS1uYW1lKS4kKHZhcmlhYmxlLW5hbWUpLmluaXRpYWw6Sj0iICIpJyA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50Lmxpc3QtZW5kIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisjIEdlbmVyYXRlIGRvY3VtZW50YXRpb24gZm9yIGEgcHJvamVjdC4KKyMKK2xvY2FsIHJ1bGUgcHJpbnQtaGVscC1wcm9qZWN0ICgKKyAgICB1bnVzZWQgPworICAgIDogamFtZmlsZSAqICAjIFRoZSBwcm9qZWN0IEphbWZpbGUuCispCit7CisgICAgaWYgJChqYW1maWxlPCQoamFtZmlsZSk+LmRvY3MpCisgICAgeworICAgICAgICAjIFByaW50IHRoZSBkb2NzLgorICAgICAgICBwcmludC5zZWN0aW9uICJQcm9qZWN0LXNwZWNpZmljIGhlbHAiCisgICAgICAgICAgICBQcm9qZWN0IGhhcyBqYW1maWxlIGF0ICQoamFtZmlsZSkgOworCisgICAgICAgIHByaW50LmxpbmVzICQoamFtZmlsZTwkKGphbWZpbGUpPi5kb2NzKSAiIiA7CisgICAgfQorfQorCisKKyMgR2VuZXJhdGUgZG9jdW1lbnRhdGlvbiBmb3IgYSBjb25maWcgZmlsZS4KKyMKK2xvY2FsIHJ1bGUgcHJpbnQtaGVscC1jb25maWcgKAorICAgIHVudXNlZCA/CisgICAgOiB0eXBlICAjIFRoZSB0eXBlIG9mIGNvbmZpZ3VyYXRpb24gZmlsZSB1c2VyIG9yIHNpdGUuCisgICAgY29uZmlnLWZpbGUgICMgVGhlIGNvbmZpZ3VyYXRpb24gSmFtZmlsZS4KKykKK3sKKyAgICBpZiAkKGphbWZpbGU8JChjb25maWctZmlsZSk+LmRvY3MpCisgICAgeworICAgICAgICAjIFByaW50IHRoZSBkb2NzLgorICAgICAgICBwcmludC5zZWN0aW9uICJDb25maWd1cmF0aW9uIGhlbHAiCisgICAgICAgICAgICBDb25maWd1cmF0aW9uIGZpbGUgYXQgJChjb25maWctZmlsZSkgOworCisgICAgICAgIHByaW50LmxpbmVzICQoamFtZmlsZTwkKGNvbmZpZy1maWxlKT4uZG9jcykgIiIgOworICAgIH0KK30KKworCit3cyA9ICIJICIgOworCisjIEV4dHJhY3QgdGhlIHRleHQgZnJvbSBhIGJsb2NrIG9mIGNvbW1lbnRzLgorIworbG9jYWwgcnVsZSBleHRyYWN0LWNvbW1lbnQgKAorICAgIHZhciAgIyBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gZXh0cmFjdCBmcm9tLgorKQoreworICAgIGxvY2FsIGNvbW1lbnQgPSA7CisgICAgbG9jYWwgbGluZSA9ICQoJCh2YXIpWzFdKSA7CisgICAgbG9jYWwgbCA9IFsgTUFUQ0ggIl5bJCh3cyldKigjKSguKikkIiA6ICQobGluZSkgXSA7CisgICAgd2hpbGUgJChsWzFdKSAmJiAkKCQodmFyKSkKKyAgICB7CisgICAgICAgIGlmICQobFsyXSkgeyBjb21tZW50ICs9IFsgTUFUQ0ggIl5bJCh3cyldPyguKikkIiA6ICQobFsyXSkgXSA7IH0KKyAgICAgICAgZWxzZSB7IGNvbW1lbnQgKz0gIiIgOyB9CisgICAgICAgICQodmFyKSA9ICQoJCh2YXIpWzItXSkgOworICAgICAgICBsaW5lID0gJCgkKHZhcilbMV0pIDsKKyAgICAgICAgbCA9IFsgTUFUQ0ggIl5bJCh3cyldKigjKSguKikkIiA6ICQobGluZSkgXSA7CisgICAgfQorICAgIHJldHVybiAkKGNvbW1lbnQpIDsKK30KKworCisjIEV4dHJhY3QgcyBzaW5nbGUgbGluZSBvZiBKYW0gc3ludGF4LCBpZ25vcmluZyBhbnkgY29tbWVudHMuCisjCitsb2NhbCBydWxlIGV4dHJhY3Qtc3ludGF4ICgKKyAgICB2YXIgICMgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGV4dHJhY3QgZnJvbS4KKykKK3sKKyAgICBsb2NhbCBzeW50YXggPSA7CisgICAgbG9jYWwgbGluZSA9ICQoJCh2YXIpWzFdKSA7CisgICAgd2hpbGUgISAkKHN5bnRheCkgJiYgISBbIE1BVENIICJeWyQod3MpXSooIykiIDogJChsaW5lKSBdICYmICQoJCh2YXIpKQorICAgIHsKKyAgICAgICAgbG9jYWwgbSA9IFsgTUFUQ0ggIl5bJCh3cyldKiguKikkIiA6ICQobGluZSkgXSA7CisgICAgICAgIGlmICQobSkKKyAgICAgICAgeworICAgICAgICAgICAgc3ludGF4ID0gJChtKSA7CisgICAgICAgIH0KKyAgICAgICAgJCh2YXIpID0gJCgkKHZhcilbMi1dKSA7CisgICAgICAgIGxpbmUgPSAkKCQodmFyKVsxXSkgOworICAgIH0KKyAgICByZXR1cm4gJChzeW50YXgpIDsKK30KKworCisjIEV4dHJhY3QgdGhlIG5leHQgdG9rZW4sIHRoaXMgaXMgZWl0aGVyIGEgc2luZ2xlIEphbSBjb25zdHJ1Y3Qgb3IgYSBjb21tZW50IGFzCisjIGEgc2luZ2xlIHRva2VuLgorIworbG9jYWwgcnVsZSBleHRyYWN0LXRva2VuICgKKyAgICB2YXIgICMgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGV4dHJhY3QgZnJvbS4KKykKK3sKKyAgICBsb2NhbCBwYXJ0cyA9IDsKKyAgICB3aGlsZSAhICQocGFydHMpCisgICAgeworICAgICAgICBwYXJ0cyA9IFsgTUFUQ0ggIl5bJCh3cyldKihbXiQod3MpXSspWyQod3MpXSooLiopIiA6ICQoJCh2YXIpWzFdKSBdIDsKKyAgICAgICAgaWYgISAkKHBhcnRzKQorICAgICAgICB7CisgICAgICAgICAgICAkKHZhcikgPSAkKCQodmFyKVsyLV0pIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBsb2NhbCB0b2tlbiA9IDsKKyAgICBpZiBbIE1BVENIICJeKCMpIiA6ICQocGFydHNbMV0pIF0KKyAgICB7CisgICAgICAgIHRva2VuID0gJChwYXJ0czpKPSIgIikgOworICAgICAgICAkKHZhcikgPSAkKCQodmFyKVsyLV0pIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG9rZW4gPSAkKHBhcnRzWzFdKSA7CisgICAgICAgICQodmFyKSA9ICQocGFydHNbMi1dOko9IiAiKSAkKCQodmFyKVsyLV0pIDsKKyAgICB9CisgICAgcmV0dXJuICQodG9rZW4pIDsKK30KKworCisjIFNjYW4gZm9yIGEgcnVsZSBkZWNsYXJhdGlvbiBhcyB0aGUgbmV4dCBpdGVtIGluIHRoZSB2YXJpYWJsZS4KKyMKK2xvY2FsIHJ1bGUgc2Nhbi1ydWxlICgKKyAgICBzeW50YXggPyAgIyBUaGUgZmlyc3QgcGFydCBvZiB0aGUgdGV4dCB3aGljaCBjb250YWlucyB0aGUgcnVsZSBkZWNsYXJhdGlvbi4KKyAgICA6IHZhciAgIyBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gZXh0cmFjdCBmcm9tLgorKQoreworICAgIGxvY2FsIHJ1bGUtcGFydHMgPQorICAgICAgICBbIE1BVENIICJeWyQod3MpXSoocnVsZXxsb2NhbFskKHdzKV0qcnVsZSlbJCh3cyldKyhbXiQod3MpXSspWyQod3MpXSooLiopIiA6ICQoc3ludGF4Oko9IiAiKSBdIDsKKyAgICBpZiAkKHJ1bGUtcGFydHNbMV0pCisgICAgeworICAgICAgICAjIE1hcmsgYXMgZG9jIGZvciBydWxlLgorICAgICAgICBsb2NhbCBydWxlLW5hbWUgPSAkKHJ1bGUtcGFydHNbMl0pIDsKKyAgICAgICAgaWYgJChzY29wZS1uYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBydWxlLW5hbWUgPSAkKHNjb3BlLW5hbWUpLiQocnVsZS1uYW1lKSA7CisgICAgICAgIH0KKyAgICAgICAgbG9jYWwgaXMtbG9jYWwgPSBbIE1BVENIICJeKGxvY2FsKS4qIiA6ICQocnVsZS1wYXJ0c1sxXSkgXSA7CisgICAgICAgIGlmICQoY29tbWVudC1ibG9jaykKKyAgICAgICAgeworICAgICAgICAgICAgc2V0LXJ1bGUtZG9jICQocnVsZS1uYW1lKSAkKG1vZHVsZS1uYW1lKSAkKGlzLWxvY2FsKSA6ICQoY29tbWVudC1ibG9jaykgOworICAgICAgICB9CisgICAgICAgICMgUGFyc2UgYXJncyBvZiBydWxlLgorICAgICAgICAkKHZhcikgPSAkKHJ1bGUtcGFydHNbMy1dKSAkKCQodmFyKSkgOworICAgICAgICBzZXQtcnVsZS1hcmd1bWVudHMtc2lnbmF0dXJlICQocnVsZS1uYW1lKSAkKG1vZHVsZS1uYW1lKSA6IFsgc2Nhbi1ydWxlLWFyZ3VtZW50cyAkKHZhcikgXSA7CisgICAgICAgICMgU2NhbiB3aXRoaW4gdGhpcyBydWxlcyBzY29wZS4KKyAgICAgICAgbG9jYWwgc2NvcGUtbGV2ZWwgPSBbIGV4dHJhY3QtdG9rZW4gJCh2YXIpIF0gOworICAgICAgICBsb2NhbCBzY29wZS1uYW1lID0gJChydWxlLW5hbWUpIDsKKyAgICAgICAgd2hpbGUgJChzY29wZS1sZXZlbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgY29tbWVudC1ibG9jayA9IFsgZXh0cmFjdC1jb21tZW50ICQodmFyKSBdIDsKKyAgICAgICAgICAgIGxvY2FsIHN5bnRheC1ibG9jayA9IFsgZXh0cmFjdC1zeW50YXggJCh2YXIpIF0gOworICAgICAgICAgICAgaWYgWyBzY2FuLXJ1bGUgJChzeW50YXgtYmxvY2spIDogJCh2YXIpIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgWyBNQVRDSCAiXihcXHspIiA6ICQoc3ludGF4LWJsb2NrKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2NvcGUtbGV2ZWwgKz0gInsiIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgWyBNQVRDSCAiXlteXFx9XSooW1xcfV0pWyQod3MpXSokIiAgOiAkKHN5bnRheC1ibG9jaykgXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjb3BlLWxldmVsID0gJChzY29wZS1sZXZlbFsyLV0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlIDsKKyAgICB9Cit9CisKKworIyBTY2FuIHRoZSBhcmd1bWVudHMgb2YgYSBydWxlLgorIworbG9jYWwgcnVsZSBzY2FuLXJ1bGUtYXJndW1lbnRzICgKKyAgICB2YXIgICMgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGV4dHJhY3QgZnJvbS4KKykKK3sKKyAgICBsb2NhbCBhcmctc3ludGF4ID0gOworICAgIGxvY2FsIHRva2VuID0gWyBleHRyYWN0LXRva2VuICQodmFyKSBdIDsKKyAgICB3aGlsZSAkKHRva2VuKSAhPSAiKCIgJiYgJCh0b2tlbikgIT0gInsiCisgICAgeworICAgICAgICB0b2tlbiA9IFsgZXh0cmFjdC10b2tlbiAkKHZhcikgXSA7CisgICAgfQorICAgIGlmICQodG9rZW4pICE9ICJ7IgorICAgIHsKKyAgICAgICAgdG9rZW4gPSBbIGV4dHJhY3QtdG9rZW4gJCh2YXIpIF0gOworICAgIH0KKyAgICBsb2NhbCBhcmctc2lnbmF0dXJlID0gOworICAgIHdoaWxlICQodG9rZW4pICE9ICIpIiAmJiAkKHRva2VuKSAhPSAieyIKKyAgICB7CisgICAgICAgIGxvY2FsIGFyZy1uYW1lID0gOworICAgICAgICBsb2NhbCBhcmctcXVhbGlmaWVyID0gIiAiIDsKKyAgICAgICAgbG9jYWwgYXJnLWRvYyA9IDsKKyAgICAgICAgaWYgJCh0b2tlbikgPSAiOiIKKyAgICAgICAgeworICAgICAgICAgICAgYXJnLXNpZ25hdHVyZSArPSAkKHRva2VuKSA7CisgICAgICAgICAgICB0b2tlbiA9IFsgZXh0cmFjdC10b2tlbiAkKHZhcikgXSA7CisgICAgICAgIH0KKyAgICAgICAgYXJnLW5hbWUgPSAkKHRva2VuKSA7CisgICAgICAgIGFyZy1zaWduYXR1cmUgKz0gJCh0b2tlbikgOworICAgICAgICB0b2tlbiA9IFsgZXh0cmFjdC10b2tlbiAkKHZhcikgXSA7CisgICAgICAgIGlmIFsgTUFUQ0ggIl4oW1xcKlxcK1xcP10pIiA6ICQodG9rZW4pIF0KKyAgICAgICAgeworICAgICAgICAgICAgYXJnLXF1YWxpZmllciA9ICQodG9rZW4pIDsKKyAgICAgICAgICAgIGFyZy1zaWduYXR1cmUgKz0gJCh0b2tlbikgOworICAgICAgICAgICAgdG9rZW4gPSBbIGV4dHJhY3QtdG9rZW4gJCh2YXIpIF0gOworICAgICAgICB9CisgICAgICAgIGlmICQodG9rZW4pID0gIjoiCisgICAgICAgIHsKKyAgICAgICAgICAgIGFyZy1zaWduYXR1cmUgKz0gJCh0b2tlbikgOworICAgICAgICAgICAgdG9rZW4gPSBbIGV4dHJhY3QtdG9rZW4gJCh2YXIpIF0gOworICAgICAgICB9CisgICAgICAgIGlmIFsgTUFUQ0ggIl4oIykiIDogJCh0b2tlbikgXQorICAgICAgICB7CisgICAgICAgICAgICAkKHZhcikgPSAkKHRva2VuKSAkKCQodmFyKSkgOworICAgICAgICAgICAgYXJnLWRvYyA9IFsgZXh0cmFjdC1jb21tZW50ICQodmFyKSBdIDsKKyAgICAgICAgICAgIHRva2VuID0gWyBleHRyYWN0LXRva2VuICQodmFyKSBdIDsKKyAgICAgICAgfQorICAgICAgICBzZXQtYXJndW1lbnQtZG9jICQoYXJnLW5hbWUpICQoYXJnLXF1YWxpZmllcikgJChydWxlLW5hbWUpICQobW9kdWxlLW5hbWUpIDogJChhcmctZG9jKSA7CisgICAgfQorICAgIHdoaWxlICQodG9rZW4pICE9ICJ7IgorICAgIHsKKyAgICAgICAgdG9rZW4gPSBbIGV4dHJhY3QtdG9rZW4gJCh2YXIpIF0gOworICAgIH0KKyAgICAkKHZhcikgPSAieyIgJCgkKHZhcikpIDsKKyAgICBhcmctc2lnbmF0dXJlID89ICIiIDsKKyAgICByZXR1cm4gJChhcmctc2lnbmF0dXJlKSA7Cit9CisKKworIyBTY2FuIGZvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorIworbG9jYWwgcnVsZSBzY2FuLXZhcmlhYmxlICgKKyAgICBzeW50YXggPyAgIyBUaGUgZmlyc3QgcGFydCBvZiB0aGUgdGV4dCB3aGljaCBjb250YWlucyB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgICAgOiB2YXIgICMgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGV4dHJhY3QgZnJvbS4KKykKK3sKKyAgICAjIFsxXSA9IG5hbWUsIFsyXSA9IHZhbHVlKHMpCisgICAgbG9jYWwgdmFyLXBhcnRzID0KKyAgICAgICAgWyBNQVRDSCAiXlskKHdzKV0qKFteJCh3cyldKylbJCh3cyldKyhbXFw/XFw9XSopWyQod3MpXSsoW15cXDtdKilcXDsiIDogJChzeW50YXgpIF0gOworICAgIGlmICQodmFyLXBhcnRzKQorICAgIHsKKyAgICAgICAgbG9jYWwgdmFsdWUgPSBbIE1BVENIICJeKC4qKVsgXSQiIDogJCh2YXItcGFydHNbMy1dOko9IiAiKSBdIDsKKyAgICAgICAgbG9jYWwgZGVmYXVsdC12YWx1ZSA9ICIiIDsKKyAgICAgICAgbG9jYWwgaW5pdGlhbC12YWxpZSA9ICIiIDsKKyAgICAgICAgaWYgJCh2YXItcGFydHNbMl0pID0gIj89IgorICAgICAgICB7CisgICAgICAgICAgICBkZWZhdWx0LXZhbHVlID0gJCh2YWx1ZSkgOworICAgICAgICAgICAgZGVmYXVsdC12YWx1ZSA/PSAiKGVtcHR5KSIgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW5pdGlhbC12YWx1ZSA9ICQodmFsdWUpIDsKKyAgICAgICAgICAgIGluaXRpYWwtdmFsdWUgPz0gIihlbXB0eSkiIDsKKyAgICAgICAgfQorICAgICAgICBpZiAkKGNvbW1lbnQtYmxvY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldC12YXJpYWJsZS1kb2MgJCh2YXItcGFydHNbMV0pICQoZGVmYXVsdC12YWx1ZSkgJChpbml0aWFsLXZhbHVlKSAkKG1vZHVsZS1uYW1lKSA6ICQoY29tbWVudC1ibG9jaykgOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlIDsKKyAgICB9Cit9CisKKworIyBTY2FuIGEgY2xhc3MgZGVjbGFyYXRpb24uCisjCitsb2NhbCBydWxlIHNjYW4tY2xhc3MgKAorICAgIHN5bnRheCA/ICAjIFRoZSBzeW50YXggdGV4dCBmb3IgdGhlIGNsYXNzIGRlY2xhcmF0aW9uLgorKQoreworICAgICMgWzFdID0gY2xhc3M/LCBbMl0gPSBuYW1lLCBbM10gPSBzdXBlcmNsYXNzCisgICAgbG9jYWwgY2xhc3MtcGFydHMgPQorICAgICAgICBbIE1BVENIICJeWyQod3MpXSooW14kKHdzKV0rKVskKHdzKV0rKFteJCh3cyldKylbJCh3cyldKzoqWyQod3MpXSooW14kKHdzKTtdKikiIDogJChzeW50YXgpIF0gOworICAgIGlmICQoY2xhc3MtcGFydHNbMV0pID0gImNsYXNzIiB8fCAkKGNsYXNzLXBhcnRzWzFdKSA9ICJjbGFzcy5jbGFzcyIKKyAgICB7CisgICAgICAgIHNldC1jbGFzcy1kb2MgJChjbGFzcy1wYXJ0c1syXSkgJChtb2R1bGUtbmFtZSkgOiAkKGNsYXNzLXBhcnRzWzNdKSA7CisgICAgfQorfQorCisKKyMgU2NhbiBhIG1vZHVsZSBmaWxlIGZvciBkb2N1bWVudGF0aW9uIGNvbW1lbnRzLiBUaGlzIGFsc28gaW52b2tlcyBhbnkgYWN0aW9ucworIyBhc3NpZ25lZCB0byB0aGUgbW9kdWxlLiBUaGUgYWN0aW9ucyBhcmUgdGhlIHJ1bGVzIHRoYXQgZG8gdGhlIGFjdHVhbCBvdXRwdXQgb2YKKyMgdGhlIGRvY3VtZW50YXRpb24uIFRoaXMgcnVsZSBpcyBpbnZva2VkIGFzIHRoZSBoZWFkZXIgc2NhbiBydWxlIGZvciB0aGUgbW9kdWxlCisjIGZpbGUuCisjCitydWxlIHNjYW4tbW9kdWxlICgKKyAgICB0YXJnZXQgICMgVGhlIG1vZHVsZSBmaWxlLgorICAgIDogdGV4dCAqICAjIFRoZSB0ZXh0IGluIHRoZSBmaWxlLCBvbmUgaXRlbSBwZXIgbGluZS4KKyAgICA6IGFjdGlvbiAqICAjIFJ1bGUgdG8gY2FsbCB0byBvdXRwdXQgZG9jcyBmb3IgdGhlIG1vZHVsZS4KKykKK3sKKyAgICBpZiAkKC5vcHRpb24uZGVidWcpIHsgRUNITyAiSEVMUDoiIHNjYW5uaW5nIG1vZHVsZSB0YXJnZXQgJyQodGFyZ2V0KScgOyB9CisgICAgbG9jYWwgbW9kdWxlLW5hbWUgPSAkKHRhcmdldDpCKSA7CisgICAgbG9jYWwgbW9kdWxlLWRvY3VtZW50ZWQgPSA7CisgICAgbG9jYWwgY29tbWVudC1ibG9jayA9IDsKKyAgICBsb2NhbCBzeW50YXgtYmxvY2sgPSA7CisgICAgIyBUaGlzIGlzIGEgaGFjayBiZWNhdXNlIHdlIGNhbiBub3QgZ2V0IHRoZSBsaW5lIG9mIGEgZmlsZSBpZiBpdCBoYXBwZW5zIHRvCisgICAgIyBub3QgaGF2ZSBhIG5ldy1saW5lIHRlcm1pbmF0aW9uLgorICAgIHRleHQgKz0gIn0iIDsKKyAgICB3aGlsZSAkKHRleHQpCisgICAgeworICAgICAgICBjb21tZW50LWJsb2NrID0gWyBleHRyYWN0LWNvbW1lbnQgdGV4dCBdIDsKKyAgICAgICAgc3ludGF4LWJsb2NrID0gWyBleHRyYWN0LXN5bnRheCB0ZXh0IF0gOworICAgICAgICBpZiAkKC5vcHRpb24uZGVidWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVDSE8gIkhFTFA6IiBjb21tZW50IGJsb2NrOyAnJChjb21tZW50LWJsb2NrKScgOworICAgICAgICAgICAgRUNITyAiSEVMUDoiIHN5bnRheCBibG9jazsgJyQoc3ludGF4LWJsb2NrKScgOworICAgICAgICB9CisgICAgICAgIGlmIFsgc2Nhbi1ydWxlICQoc3ludGF4LWJsb2NrKSA6IHRleHQgXSB7IH0KKyAgICAgICAgZWxzZSBpZiBbIHNjYW4tdmFyaWFibGUgJChzeW50YXgtYmxvY2spIDogdGV4dCBdIHsgfQorICAgICAgICBlbHNlIGlmIFsgc2Nhbi1jbGFzcyAkKHN5bnRheC1ibG9jaykgXSB7IH0KKyAgICAgICAgZWxzZSBpZiBbIE1BVENIIC4qKFtjQ11vcHlyaWdodCkuKiA6ICQoY29tbWVudC1ibG9jazpKPSIgIikgXQorICAgICAgICB7CisgICAgICAgICAgICAjIG1hcmsgYXMgdGhlIGNvcHkgZm9yIHRoZSBtb2R1bGUuCisgICAgICAgICAgICBzZXQtbW9kdWxlLWNvcHlyaWdodCAkKG1vZHVsZS1uYW1lKSA6ICQoY29tbWVudC1ibG9jaykgOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgJChhY3Rpb25bMV0pIGluICJwcmludC1oZWxwLXByb2plY3QiICJwcmludC1oZWxwLWNvbmZpZyIKKyAgICAgICAgICAgICYmICEgJChqYW1maWxlPCQodGFyZ2V0KT4uZG9jcykKKyAgICAgICAgeworICAgICAgICAgICAgIyBzcGVjaWFsIG1vZHVsZSBkb2NzIGZvciB0aGUgcHJvamVjdCBqYW1maWxlLgorICAgICAgICAgICAgamFtZmlsZTwkKHRhcmdldCk+LmRvY3MgPSAkKGNvbW1lbnQtYmxvY2spIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICEgJChtb2R1bGUtZG9jdW1lbnRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgIyBkb2N1bWVudCB0aGUgbW9kdWxlLgorICAgICAgICAgICAgc2V0LW1vZHVsZS1kb2MgJChtb2R1bGUtbmFtZSkgOiAkKGNvbW1lbnQtYmxvY2spIDsKKyAgICAgICAgICAgIG1vZHVsZS1kb2N1bWVudGVkID0gdHJ1ZSA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgJChhY3Rpb24pCisgICAgeworICAgICAgICAkKGFjdGlvblsxXSkgJChtb2R1bGUtbmFtZSkgOiAkKGFjdGlvblsyLV0pIDsKKyAgICB9Cit9CisKKworIyBJbXBvcnQgc2Nhbi1tb2R1bGUgdG8gZ2xvYmFsIHNjb3BlLCBzbyB0aGF0IGl0IGlzIGF2YWlsYWJsZSBkdXJpbmcgaGVhZGVyCisjIHNjYW5uaW5nIHBoYXNlLgorIworSU1QT1JUICQoX19uYW1lX18pIDogc2Nhbi1tb2R1bGUgOiA6IGRvYy5zY2FuLW1vZHVsZSA7CisKKworIyBSZWFkIGluIGEgZmlsZSB1c2luZyB0aGUgU0hFTEwgYnVpbHRpbiBhbmQgcmV0dXJuIHRoZSBpbmRpdmlkdWFsIGxpbmVzIGFzCisjIHdvdWxkIGJlIGRvbmUgZm9yIGhlYWRlciBzY2FubmluZy4KKyMKK2xvY2FsIHJ1bGUgcmVhZC1maWxlICgKKyAgICBmaWxlICAjIFRoZSBmaWxlIHRvIHJlYWQgaW4uCispCit7CisgICAgZmlsZSA9IFsgcGF0aC5uYXRpdmUgWyBwYXRoLnJvb3QgWyBwYXRoLm1ha2UgJChmaWxlKSBdIFsgcGF0aC5wd2QgXSBdIF0gOworICAgIGlmICEgJCguZmlsZTwkKGZpbGUpPi5saW5lcykKKyAgICB7CisgICAgICAgIGxvY2FsIGNvbnRlbnQgOworICAgICAgICBzd2l0Y2ggWyBtb2R1bGVzLnBlZWsgOiBPUyBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTlQgOgorICAgICAgICAgICAgY29udGVudCA9IFsgU0hFTEwgIlRZUEUgXCIkKGZpbGUpXCIiIF0gOworCisgICAgICAgICAgICBjYXNlICogOgorICAgICAgICAgICAgY29udGVudCA9IFsgU0hFTEwgImNhdCBcIiQoZmlsZSlcIiIgXSA7CisgICAgICAgIH0KKyAgICAgICAgbG9jYWwgbGluZXMgOworICAgICAgICBsb2NhbCBubCA9ICIKKyIgOworICAgICAgICBsb2NhbCA8PCA9ICIoW14kKG5sKV0qKVskKG5sKV0oLiopIiA7CisgICAgICAgIGxvY2FsIGxpbmUrID0gWyBNQVRDSCAiJCg8PCkiIDogIiQoY29udGVudCkiIF0gOworICAgICAgICB3aGlsZSAkKGxpbmUrKQorICAgICAgICB7CisgICAgICAgICAgICBsaW5lcyArPSAkKGxpbmUrWzFdKSA7CisgICAgICAgICAgICBsaW5lKyA9IFsgTUFUQ0ggIiQoPDwpIiA6ICIkKGxpbmUrWzJdKSIgXSA7CisgICAgICAgIH0KKyAgICAgICAgLmZpbGU8JChmaWxlKT4ubGluZXMgPSAkKGxpbmVzKSA7CisgICAgfQorICAgIHJldHVybiAkKC5maWxlPCQoZmlsZSk+LmxpbmVzKSA7Cit9CisKKworIyBBZGQgYSBzY2FuIGFjdGlvbiB0byBwZXJmb3JtIHRvIGdlbmVyYXRlIHRoZSBoZWxwIGRvY3VtZW50YXRpb24uIFRoZSBhY3Rpb24KKyMgcnVsZSBpcyBwYXNzZWQgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuIFRoZSBzZWNvbmQKKyMgYXJndW1lbnQocykgYXJlIG9wdGlvbmFsIGFuZCBwYXNzZWQgZGlyZWN0bHkgYXMgc3BlY2lmaWVkIGhlcmUuCisjCitsb2NhbCBydWxlIGRvLXNjYW4gKAorICAgIG1vZHVsZXMgKyAgIyBUaGUgbW9kdWxlcyB0byBzY2FuIGFuZCBwZXJmb3JtIHRoZSBhY3Rpb24gb24uCisgICAgOiBhY3Rpb24gKiAgIyBUaGUgYWN0aW9uIHJ1bGUsIHBsdXMgdGhlIHNlY29uZGFyeSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYWN0aW9uIHJ1bGUuCispCit7CisgICAgaWYgJChoZWxwLW91dHB1dCkgPSB0ZXh0CisgICAgeworICAgICAgICBwcmludC5vdXRwdXQgJChoZWxwLW91dHB1dC1maWxlKS50eHQgcGxhaW4gOworICAgICAgICBBTFdBWVMgJChoZWxwLW91dHB1dC1maWxlKS50eHQgOworICAgICAgICBERVBFTkRTIGFsbCA6ICQoaGVscC1vdXRwdXQtZmlsZSkudHh0IDsKKyAgICB9CisgICAgaWYgJChoZWxwLW91dHB1dCkgPSBodG1sCisgICAgeworICAgICAgICBwcmludC5vdXRwdXQgJChoZWxwLW91dHB1dC1maWxlKS5odG1sIGh0bWwgOworICAgICAgICBBTFdBWVMgJChoZWxwLW91dHB1dC1maWxlKS5odG1sIDsKKyAgICAgICAgREVQRU5EUyBhbGwgOiAkKGhlbHAtb3V0cHV0LWZpbGUpLmh0bWwgOworICAgIH0KKyAgICBmb3IgbG9jYWwgbW9kdWxlLWZpbGUgaW4gJChtb2R1bGVzWzEtLTJdKQorICAgIHsKKyAgICAgICAgc2Nhbi1tb2R1bGUgJChtb2R1bGUtZmlsZSkgOiBbIHJlYWQtZmlsZSAkKG1vZHVsZS1maWxlKSBdIDsKKyAgICB9CisgICAgc2Nhbi1tb2R1bGUgJChtb2R1bGVzWy0xXSkgOiBbIHJlYWQtZmlsZSAkKG1vZHVsZXNbLTFdKSBdIDogJChhY3Rpb24pIDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9pbmRpcmVjdC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvaW5kaXJlY3QuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODg0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvaW5kaXJlY3QuamFtCkBAIC0wLDAgKzEsMTE3IEBACisjIENvcHlyaWdodCAyMDAzIERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDMgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgbnVtYmVycyA7CisKKworIyBUaGUgcGF0dGVybiB0aGF0IGluZGlyZWN0IHJ1bGVzIG11c3QgbWF0Y2g6IG1vZHVsZSVydWxlCisucGF0dGVybiA9IF4oW14lXSopJShbXiVdKykkIDsKKworCisjCisjIFR5cGUgY2hlY2tpbmcgcnVsZXMuCisjCitsb2NhbCBydWxlIGluZGlyZWN0LXJ1bGUgKCB4ICkKK3sKKyAgICBpZiAhIFsgTUFUQ0ggJCgucGF0dGVybikgOiAkKHgpIF0KKyAgICB7CisgICAgICAgIHJldHVybiAiZXhwZWN0ZWQgYSBzdHJpbmcgb2YgdGhlIGZvcm0gbW9kdWxlJXJ1bGUsIGJ1dCBnb3QgXCIiJCh4KSJcIiBmb3IgYXJndW1lbnQiIDsKKyAgICB9Cit9CisKKworIyBNYWtlIGFuIGluZGlyZWN0IHJ1bGUgd2hpY2ggY2FsbHMgdGhlIGdpdmVuIHJ1bGUuIElmIGNvbnRleHQgaXMgc3VwcGxpZWQgaXQgaXMKKyMgZXhwZWN0ZWQgdG8gYmUgdGhlIG1vZHVsZSBpbiB3aGljaCB0byBpbnZva2UgdGhlIHJ1bGUgYnkgdGhlICdjYWxsJyBydWxlCisjIGJlbG93LiBPdGhlcndpc2UsIHRoZSBydWxlIHdpbGwgYmUgaW52b2tlZCBpbiB0aGUgbW9kdWxlIG9mIHRoaXMgcnVsZSdzCisjIGNhbGxlci4KKyMKK3J1bGUgbWFrZSAoIHJ1bGVuYW1lIGJvdW5kLWFyZ3MgKiA6IGNvbnRleHQgPyApCit7CisgICAgY29udGV4dCA/PSBbIENBTExFUl9NT0RVTEUgXSA7CisgICAgY29udGV4dCA/PSAiIiA7CisgICAgcmV0dXJuICQoY29udGV4dCklJChydWxlbmFtZSkgJChib3VuZC1hcmdzKSA7Cit9CisKKworIyBNYWtlIGFuIGluZGlyZWN0IHJ1bGUgd2hpY2ggY2FsbHMgdGhlIGdpdmVuIHJ1bGUuICdydWxlbmFtZScgbWF5IGJlIGEKKyMgcXVhbGlmaWVkIHJ1bGU7IGlmIHNvIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4gT3RoZXJ3aXNlLCBpZiBmcmFtZXMgaXMgbm90CisjIHN1cHBsaWVkLCB0aGUgcmVzdWx0IHdpbGwgYmUgaW52b2tlZCAoYnkgJ2NhbGwnLCBiZWxvdykgaW4gdGhlIG1vZHVsZSBvZiB0aGUKKyMgY2FsbGVyLiBPdGhlcndpc2UsIGZyYW1lcyA+IDEgc3BlY2lmaWVzIGFkZGl0aW9uYWwgY2FsbCBmcmFtZXMgdG8gYmFjayB1cCBpbgorIyBvcmRlciB0byBmaW5kIHRoZSBtb2R1bGUgY29udGV4dC4KKyMKK3J1bGUgbWFrZS1xdWFsaWZpZWQgKCBydWxlbmFtZSBib3VuZC1hcmdzICogOiBmcmFtZXMgPyApCit7CisgICAgaWYgWyBNQVRDSCAkKC5wYXR0ZXJuKSA6ICQocnVsZW5hbWUpIF0KKyAgICB7CisgICAgICAgIHJldHVybiAkKHJ1bGVuYW1lKSAkKGJvdW5kLWFyZ3MpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZnJhbWVzID89IDEgOworICAgICAgICAjIElmIHRoZSBydWxlIG5hbWUgaW5jbHVkZXMgYSBKYW1maWxlIG1vZHVsZSwgZ3JhYiBpdC4KKyAgICAgICAgbG9jYWwgbW9kdWxlLWNvbnRleHQgPSBbIE1BVENIIF4oSmFtZmlsZTxbXj5dKj4pXFwuLiogOiAkKHJ1bGVuYW1lKSBdIDsKKworICAgICAgICBpZiAhICQobW9kdWxlLWNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgVGFrZSB0aGUgZmlyc3QgZG90LXNlcGFyYXRlZCBlbGVtZW50IGFzIG1vZHVsZSBuYW1lLiBUaGlzIGRpc2FsbG93cworICAgICAgICAgICAgIyBtb2R1bGUgbmFtZXMgd2l0aCBkb3RzLCBidXQgYWxsb3dzIHJ1bGUgbmFtZXMgd2l0aCBkb3RzLgorICAgICAgICAgICAgbW9kdWxlLWNvbnRleHQgPSBbIE1BVENIIF4oW14uXSopXFwuLiogOiAkKHJ1bGVuYW1lKSBdIDsKKyAgICAgICAgfQorICAgICAgICBtb2R1bGUtY29udGV4dCA/PSBbIENBTExFUl9NT0RVTEUgJChmcmFtZXMpIF0gOworICAgICAgICByZXR1cm4gWyBtYWtlICQocnVsZW5hbWUpICQoYm91bmQtYXJncykgOiAkKG1vZHVsZS1jb250ZXh0KSBdIDsKKyAgICB9Cit9CisKKworIyBSZXR1cm5zIHRoZSBtb2R1bGUgbmFtZSBpbiB3aGljaCB0aGUgZ2l2ZW4gaW5kaXJlY3QgcnVsZSB3aWxsIGJlIGludm9rZWQuCisjCitydWxlIGdldC1tb2R1bGUgKCBbaW5kaXJlY3QtcnVsZV0geCApCit7CisgICAgbG9jYWwgbSA9IFsgTUFUQ0ggJCgucGF0dGVybikgOiAkKHgpIF0gOworICAgIGlmICEgJChtWzFdKQorICAgIHsKKyAgICAgICAgbSA9IDsKKyAgICB9CisgICAgcmV0dXJuICQobVsxXSkgOworfQorCisKKyMgUmV0dXJucyB0aGUgcnVsZW5hbWUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHggaXMgaW52b2tlZC4KKyMKK3J1bGUgZ2V0LXJ1bGUgKCBbaW5kaXJlY3QtcnVsZV0geCApCit7CisgICAgbG9jYWwgbSA9IFsgTUFUQ0ggJCgucGF0dGVybikgOiAkKHgpIF0gOworICAgIHJldHVybiAkKG1bMl0pIDsKK30KKworCisjIEludm9rZSB0aGUgZ2l2ZW4gaW5kaXJlY3QtcnVsZS4KKyMKK3J1bGUgY2FsbCAoIFtpbmRpcmVjdC1ydWxlXSByIGFyZ3MgKiA6ICogKQoreworICAgIHJldHVybiBbIG1vZHVsZXMuY2FsbC1pbiBbIGdldC1tb2R1bGUgJChyKSBdIDogWyBnZXQtcnVsZSAkKHIpIF0gJChhcmdzKSA6CisgICAgICAgICQoMikgOiAkKDMpIDogJCg0KSA6ICQoNSkgOiAkKDYpIDogJCg3KSA6ICQoOCkgOiAkKDkpIDogJCgxMCkgOiAkKDExKSA6CisgICAgICAgICQoMTIpIDogJCgxMykgOiAkKDE0KSA6ICQoMTUpIDogJCgxNikgOiAkKDE3KSA6ICQoMTgpIDogJCgxOSkgXSA7Cit9CisKKworcnVsZSBfX3Rlc3RfXworeworICAgIGltcG9ydCBhc3NlcnQgOworCisgICAgcnVsZSBmb28tYmFyciEgKCB4ICkKKyAgICB7CisgICAgICAgIGFzc2VydC5lcXVhbCAkKHgpIDogeCA7CisgICAgfQorCisgICAgYXNzZXJ0LmVxdWFsIFsgZ2V0LXJ1bGUgWyBtYWtlIGZvby1iYXJyISBdIF0gOiBmb28tYmFyciEgOworICAgIGFzc2VydC5lcXVhbCBbIGdldC1tb2R1bGUgWyBtYWtlIGZvby1iYXJyISBdIF0gOiBbIENBTExFUl9NT0RVTEUgXSA7CisKKyAgICBjYWxsIFsgbWFrZSBmb28tYmFyciEgXSB4IDsKKyAgICBjYWxsIFsgbWFrZSBmb28tYmFyciEgeCBdIDsKKyAgICBjYWxsIFsgbWFrZSBmb28tYmFyciEgOiBbIENBTExFUl9NT0RVTEUgXSBdIHggOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91dGlsL251bWJlcnMuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91dGlsL251bWJlcnMuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTM0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvbnVtYmVycy5qYW0KQEAgLTAsMCArMSwyMTggQEAKKyMgQ29weXJpZ2h0IDIwMDEsIDIwMDIgRGF2ZSBBYnJhaGFtcworIyBDb3B5cmlnaHQgMjAwMiwgMjAwMyBWbGFkaW1pciBQcnVzCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgZXJyb3JzIDsKKworCitydWxlIHRyaW0tbGVhZGluZy16ZXJvZXMgKCB2YWx1ZSApCit7CisgICAgcmV0dXJuIFsgQ0FMQyAkKHZhbHVlKSArIDAgXSA7Cit9CisKKworcnVsZSBjaGVjayAoIG51bWJlcnMgKiApCit7CisgICAgZm9yIGxvY2FsIG4gaW4gJChudW1iZXJzKQorICAgIHsKKyAgICAgICAgc3dpdGNoICQobikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAqW14wLTldKiA6CisgICAgICAgICAgICAgICAgZXJyb3JzLmVycm9yICQobikgImluIiAkKG51bWJlcnMpIDogaXMgbm90IGEgbnVtYmVyIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitydWxlIGluY3JlbWVudCAoIG51bWJlciApCit7CisgICAgcmV0dXJuIFsgQ0FMQyAkKG51bWJlcikgKyAxIF0gOworfQorCisKK3J1bGUgZGVjcmVtZW50ICggbnVtYmVyICkKK3sKKyAgICByZXR1cm4gWyBDQUxDICQobnVtYmVyKSAtIDEgXSA7Cit9CisKKworcnVsZSByYW5nZSAoIHN0YXJ0IGZpbmlzaCA/IDogc3RlcCA/ICkKK3sKKyAgICBpZiAhICQoZmluaXNoKQorICAgIHsKKyAgICAgICAgZmluaXNoID0gJChzdGFydCkgOworICAgICAgICBzdGFydCA9IDEgOworICAgIH0KKyAgICBzdGVwID89IDEgOworCisgICAgY2hlY2sgJChzdGFydCkgJChmaW5pc2gpICQoc3RlcCkgOworCisgICAgaWYgJChmaW5pc2gpICE9IDAKKyAgICB7CisgICAgICAgIGxvY2FsIHJlc3VsdCA7CisgICAgICAgIHdoaWxlIFsgbGVzcyAkKHN0YXJ0KSAkKGZpbmlzaCkgXSB8fCAkKHN0YXJ0KSA9ICQoZmluaXNoKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gJChzdGFydCkgOworICAgICAgICAgICAgc3RhcnQgPSBbIENBTEMgJChzdGFydCkgKyAkKHN0ZXApIF0gOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworICAgIH0KK30KKworCitydWxlIGxlc3MgKCBuMSBuMiApCit7CisgICAgc3dpdGNoIFsgQ0FMQyAkKG4yKSAtICQobjEpIF0KKyAgICB7CisgICAgICAgIGNhc2UgWzEtOV0qIDogcmV0dXJuIHRydWUgOworICAgIH0KK30KKworCitydWxlIGxvZzEwICggbnVtYmVyICkKK3sKKyAgICBzd2l0Y2ggJChudW1iZXIpCisgICAgeworICAgICAgICBjYXNlICpbXjAtOV0qIDogZXJyb3JzLmVycm9yICQobnVtYmVyKSBpcyBub3QgYSBudW1iZXIgOworICAgICAgICBjYXNlIDAgOiBlcnJvcnMuZXJyb3IgY2FuJ3QgdGFrZSBsb2cgb2YgemVybyA7CisgICAgICAgIGNhc2UgWzEtOV0gOiByZXR1cm4gMCA7CisgICAgICAgIGNhc2UgWzEtOV0/IDogcmV0dXJuIDEgOworICAgICAgICBjYXNlIFsxLTldPz8gOiByZXR1cm4gMiA7CisgICAgICAgIGNhc2UgWzEtOV0/Pz8gOiByZXR1cm4gMyA7CisgICAgICAgIGNhc2UgWzEtOV0/Pz8/IDogcmV0dXJuIDQgOworICAgICAgICBjYXNlIFsxLTldPz8/Pz8gOiByZXR1cm4gNSA7CisgICAgICAgIGNhc2UgWzEtOV0/Pz8/Pz8gOiByZXR1cm4gNiA7CisgICAgICAgIGNhc2UgWzEtOV0/Pz8/Pz8/IDogcmV0dXJuIDcgOworICAgICAgICBjYXNlIFsxLTldPz8/Pz8/Pz8gOiByZXR1cm4gOCA7CisgICAgICAgIGNhc2UgWzEtOV0/Pz8/Pz8/Pz8gOiByZXR1cm4gOSA7CisgICAgICAgIGNhc2UgKiA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydCBzZXF1ZW5jZSA7CisgICAgICAgICAgICBpbXBvcnQgc3RyaW5nIDsKKyAgICAgICAgICAgIGxvY2FsIGNoYXJzID0gWyBzdHJpbmcuY2hhcnMgJChudW1iZXIpIF0gOworICAgICAgICAgICAgd2hpbGUgJChjaGFyc1sxXSkgPSAwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhcnMgPSAkKGNoYXJzWzItXSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgISAkKGNoYXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycm9ycy5lcnJvciBjYW4ndCB0YWtlIGxvZyBvZiB6ZXJvIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWyBkZWNyZW1lbnQgWyBzZXF1ZW5jZS5sZW5ndGggJChjaGFycykgXSBdIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCitydWxlIF9fdGVzdF9fICggKQoreworICAgIGltcG9ydCBhc3NlcnQgOworCisgICAgYXNzZXJ0LnJlc3VsdCAxIDogaW5jcmVtZW50IDAgOworICAgIGFzc2VydC5yZXN1bHQgMiA6IGluY3JlbWVudCAxIDsKKyAgICBhc3NlcnQucmVzdWx0IDEgOiBkZWNyZW1lbnQgMiA7CisgICAgYXNzZXJ0LnJlc3VsdCAwIDogZGVjcmVtZW50IDEgOworICAgIGFzc2VydC5yZXN1bHQgNTAgOiBpbmNyZW1lbnQgNDkgOworICAgIGFzc2VydC5yZXN1bHQgNDkgOiBkZWNyZW1lbnQgNTAgOworICAgIGFzc2VydC5yZXN1bHQgOTkgOiBpbmNyZW1lbnQgOTggOworICAgIGFzc2VydC5yZXN1bHQgOTkgOiBkZWNyZW1lbnQgMTAwIDsKKyAgICBhc3NlcnQucmVzdWx0IDEwMCA6IGluY3JlbWVudCA5OSA7CisgICAgYXNzZXJ0LnJlc3VsdCA5OTkgOiBkZWNyZW1lbnQgMTAwMCA7CisgICAgYXNzZXJ0LnJlc3VsdCAxMDAwIDogaW5jcmVtZW50IDk5OSA7CisKKyAgICBhc3NlcnQucmVzdWx0IDEgMiAzIDogcmFuZ2UgMyA7CisgICAgYXNzZXJ0LnJlc3VsdCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiA6IHJhbmdlIDEyIDsKKyAgICBhc3NlcnQucmVzdWx0IDMgNCA1IDYgNyA4IDkgMTAgMTEgOiByYW5nZSAzIDExIDsKKyAgICBhc3NlcnQucmVzdWx0IDogcmFuZ2UgMCA7CisgICAgYXNzZXJ0LnJlc3VsdCAxIDQgNyAxMCA6IHJhbmdlIDEwIDogMyA7CisgICAgYXNzZXJ0LnJlc3VsdCAyIDQgNiA4IDEwIDogcmFuZ2UgMiAxMCA6IDIgOworICAgIGFzc2VydC5yZXN1bHQgMjUgNTAgNzUgMTAwIDogcmFuZ2UgMjUgMTAwIDogMjUgOworCisgICAgYXNzZXJ0LnJlc3VsdCAwICAgICAgICAgICA6IHRyaW0tbGVhZGluZy16ZXJvZXMgMCAgICAgICAgICAgOworICAgIGFzc2VydC5yZXN1bHQgMTIzNCAgICAgICAgOiB0cmltLWxlYWRpbmctemVyb2VzIDEyMzQgICAgICAgIDsKKyAgICBhc3NlcnQucmVzdWx0IDEyMzQ1NiAgICAgIDogdHJpbS1sZWFkaW5nLXplcm9lcyAwMDAwMTIzNDU2ICA7CisgICAgYXNzZXJ0LnJlc3VsdCAxMDAwMTIzNDU2ICA6IHRyaW0tbGVhZGluZy16ZXJvZXMgMTAwMDEyMzQ1NiAgOworICAgIGFzc2VydC5yZXN1bHQgMTAwMDAgICAgICAgOiB0cmltLWxlYWRpbmctemVyb2VzIDEwMDAwICAgICAgIDsKKyAgICBhc3NlcnQucmVzdWx0IDEwMDAwICAgICAgIDogdHJpbS1sZWFkaW5nLXplcm9lcyAwMDAxMDAwMCAgICA7CisKKyAgICBhc3NlcnQudHJ1ZSAgbGVzcyAxIDIgOworICAgIGFzc2VydC50cnVlICBsZXNzIDEgMTIgOworICAgIGFzc2VydC50cnVlICBsZXNzIDEgMjEgOworICAgIGFzc2VydC50cnVlICBsZXNzIDAwNSAyMTcgOworICAgIGFzc2VydC5mYWxzZSBsZXNzIDAgMCA7CisgICAgYXNzZXJ0LmZhbHNlIGxlc3MgMDMgMyA7CisgICAgYXNzZXJ0LmZhbHNlIGxlc3MgMyAwMyA7CisgICAgYXNzZXJ0LnRydWUgIGxlc3MgMDA1IDIxNyA7CisgICAgYXNzZXJ0LnRydWUgIGxlc3MgMDAwNSAyMTcgOworICAgIGFzc2VydC50cnVlICBsZXNzIDUgMDAyMTcgOworCisgICAgIyBURU1QT1JBUlkgZGlzYWJsZWQsIGJlY2F1c2UgbmVzdGVkICJ0cnkiLyJjYXRjaCIgZG8gbm90IHdvcmsgYW5kIEkgZG8gbm8KKyAgICAjIGhhdmUgdGhlIHRpbWUgdG8gZml4IHRoYXQgcmlnaHQgbm93LgorICAgIGlmICQoMCkKKyAgICB7CisgICAgdHJ5IDsKKyAgICB7CisgICAgICAgIGRlY3JlbWVudCAwIDsKKyAgICB9CisgICAgY2F0Y2ggY2FuJ3QgZGVjcmVtZW50IHplcm8hIDsKKworICAgIHRyeSA7CisgICAgeworICAgICAgICBjaGVjayBmb28gOworICAgIH0KKyAgICBjYXRjaCA6IG5vdCBhIG51bWJlciA7CisKKyAgICB0cnkgOworICAgIHsKKyAgICAgICAgaW5jcmVtZW50IGZvbyA7CisgICAgfQorICAgIGNhdGNoIDogbm90IGEgbnVtYmVyIDsKKworICAgIHRyeSA7CisgICAgeworICAgICAgICBsb2cxMCAwIDsKKyAgICB9CisgICAgY2F0Y2ggY2FuJ3QgdGFrZSBsb2cgb2YgemVybyA7CisKKyAgICB0cnkgOworICAgIHsKKyAgICAgICAgbG9nMTAgMDAwIDsKKyAgICB9CisgICAgY2F0Y2ggY2FuJ3QgdGFrZSBsb2cgb2YgemVybyA7CisKKyAgICB9CisKKyAgICBhc3NlcnQucmVzdWx0IDAgOiBsb2cxMCAxIDsKKyAgICBhc3NlcnQucmVzdWx0IDAgOiBsb2cxMCA5IDsKKyAgICBhc3NlcnQucmVzdWx0IDEgOiBsb2cxMCAxMCA7CisgICAgYXNzZXJ0LnJlc3VsdCAxIDogbG9nMTAgOTkgOworICAgIGFzc2VydC5yZXN1bHQgMiA6IGxvZzEwIDEwMCA7CisgICAgYXNzZXJ0LnJlc3VsdCAyIDogbG9nMTAgMTAxIDsKKyAgICBhc3NlcnQucmVzdWx0IDIgOiBsb2cxMCAxMjUgOworICAgIGFzc2VydC5yZXN1bHQgMiA6IGxvZzEwIDk5OSA7CisgICAgYXNzZXJ0LnJlc3VsdCAzIDogbG9nMTAgMTAwMCA7CisgICAgYXNzZXJ0LnJlc3VsdCAxMCA6IGxvZzEwIDEyMzQ1Njc4OTAxIDsKKworICAgIGZvciBsb2NhbCB4IGluIFsgcmFuZ2UgNzUgMTEwIDogNSBdCisgICAgeworICAgICAgICBmb3IgbG9jYWwgeSBpbiBbIHJhbmdlICQoeCkgMTExIDogMyBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQoeCkgIT0gJCh5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydC50cnVlIGxlc3MgJCh4KSAkKHkpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciBsb2NhbCB4IGluIFsgcmFuZ2UgOTAgMTEwIDogMiBdCisgICAgeworICAgICAgICBmb3IgbG9jYWwgeSBpbiBbIHJhbmdlIDgwICQoeCkgOiA0IF0KKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0LmZhbHNlIGxlc3MgJCh4KSAkKHkpIDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9vcHRpb24uamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91dGlsL29wdGlvbi5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkYzM3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9vcHRpb24uamFtCkBAIC0wLDAgKzEsMTA5IEBACisjICBDb3B5cmlnaHQgKGMpIDIwMDUgVmxhZGltaXIgUHJ1cy4KKyMKKyMgIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKKyMgIExpY2Vuc2UgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yCisjICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2ltcG9ydCBtb2R1bGVzIDsKKworIyBTZXQgYSB2YWx1ZSBmb3IgYSBuYW1lZCBvcHRpb24sIHRvIGJlIHVzZWQgd2hlbiBub3Qgb3ZlcnJpZGRlbiBvbiB0aGUgY29tbWFuZAorIyBsaW5lLgorcnVsZSBzZXQgKCBuYW1lIDogdmFsdWUgPyApCit7CisgICAgLm9wdGlvbi4kKG5hbWUpID0gJCh2YWx1ZSkgOworfQorCitydWxlIGdldCAoIG5hbWUgOiBkZWZhdWx0LXZhbHVlID8gOiBpbXBsaWVkLXZhbHVlID8gKQoreworICAgIGxvY2FsIG0gPSBbIE1BVENIIC0tJChuYW1lKT0oLiopIDogWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0gXSA7CisgICAgaWYgJChtKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQobVsxXSkgOworICAgIH0KKyAgICBlbHNlICAKKyAgICB7ICAgICAgICAKKyAgICAgICAgbSA9IFsgTUFUQ0ggKC0tJChuYW1lKSkgOiBbIG1vZHVsZXMucGVlayA6IEFSR1YgXSBdIDsKKyAgICAgICAgaWYgJChtKSAmJiAkKGltcGxpZWQtdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAkKGltcGxpZWQtdmFsdWUpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICQoLm9wdGlvbi4kKG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gJCgub3B0aW9uLiQobmFtZSkpIDsKKyAgICAgICAgfSAgICAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gJChkZWZhdWx0LXZhbHVlKSA7CisgICAgICAgIH0gICAgCisgICAgfSAgICAgICAgICAgICAgCit9CisKKworIyBDaGVjayBjb21tYW5kLWxpbmUgYXJncyBhcyBzb29uIGFzIHBvc3NpYmxlLiBGb3IgZWFjaCBvcHRpb24gdHJ5IHRvIGxvYWQKKyMgbW9kdWxlIG5hbWVkIGFmdGVyIG9wdGlvbi4gSXMgdGhhdCBzdWNjZWVkcywgaW52b2tlICdwcm9jZXNzJyBydWxlIGluIHRoZQorIyBtb2R1bGUuIFRoZSBydWxlIG1heSByZXR1cm4gInRydWUiIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlZ3VsYXIgYnVpbGQgcHJvY2VzcworIyBzaG91bGQgbm90IGJlIGF0dGVtcHRlZC4KKyMKKyMgT3B0aW9ucyB0YWtlIHRoZSBnZW5lcmFsIGZvcm0gb2Y6IC0tPG5hbWU+Wz08dmFsdWU+XSBbPHZhbHVlPl0KKyMKK3J1bGUgcHJvY2VzcyAoICkKK3sKKyAgICBsb2NhbCBBUkdWID0gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0gOworICAgIGxvY2FsIEJPT1NUX0JVSUxEX1BBVEggPSBbIG1vZHVsZXMucGVlayA6IEJPT1NUX0JVSUxEX1BBVEggXSA7CisKKyAgICBsb2NhbCBkb250LWJ1aWxkIDsKKyAgICBsb2NhbCBhcmdzID0gJChBUkdWKSA7CisgICAgd2hpbGUgJChhcmdzKQorICAgIHsKKyAgICAgICAgbG9jYWwgYXJnID0gWyBNQVRDSCBeLS0oLiopIDogJChhcmdzWzFdKSBdIDsKKyAgICAgICAgd2hpbGUgJChhcmdzWzItXSkgJiYgISAkKGFyZykKKyAgICAgICAgeworICAgICAgICAgICAgYXJncyA9ICQoYXJnc1syLV0pIDsKKyAgICAgICAgICAgIGFyZyA9IFsgTUFUQ0ggXi0tKC4qKSA6ICQoYXJnc1sxXSkgXSA7CisgICAgICAgIH0KKyAgICAgICAgYXJncyA9ICQoYXJnc1syLV0pIDsKKworICAgICAgICBpZiAkKGFyZykKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgc3BsaXQgPSBbIE1BVENIIF4oKFteLT1dKylbXj1dKikoPT8pKC4qKSQgOiAkKGFyZykgXSA7CisgICAgICAgICAgICBsb2NhbCBmdWxsLW5hbWUgPSAkKHNwbGl0WzFdKSA7CisgICAgICAgICAgICBsb2NhbCBwcmVmaXggPSAkKHNwbGl0WzJdKSA7CisgICAgICAgICAgICBsb2NhbCB2YWx1ZXMgOworCisgICAgICAgICAgICBpZiAkKHNwbGl0WzNdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlcyA9ICQoc3BsaXRbNF0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICQoYXJncykgJiYgISBbIE1BVENIIF4oLS0pLiogOiAkKGFyZ3NbMV0pIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMgKz0gJChhcmdzWzFdKSA7CisgICAgICAgICAgICAgICAgYXJncyA9ICQoYXJnc1syLV0pIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBKb29rIGluIG9wdGlvbnMgc3ViZGlyZWN0b3JpZXMgb2YgQk9PU1RfQlVJTERfUEFUSCBmb3IgbW9kdWxlcworICAgICAgICAgICAgIyBtYXRjaGluZyB0aGUgZnVsbCBvcHRpb24gbmFtZSBhbmQgdGhlbiBpdHMgcHJlZml4LgorICAgICAgICAgICAgbG9jYWwgcGx1Z2luLWRpciA9IG9wdGlvbnMgOworICAgICAgICAgICAgbG9jYWwgb3B0aW9uLWZpbGVzID0gWyBHTE9CICQocGx1Z2luLWRpcjpEPSQoQk9PU1RfQlVJTERfUEFUSCkpIDoKKyAgICAgICAgICAgICAgICAkKGZ1bGwtbmFtZSkuamFtICQocHJlZml4KS5qYW0gXSA7CisKKyAgICAgICAgICAgIGlmICQob3B0aW9uLWZpbGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgTG9hZCB0aGUgZmlsZSBpbnRvIGEgbW9kdWxlIG5hbWVkIGZvciB0aGUgb3B0aW9uLgorICAgICAgICAgICAgICAgIGxvY2FsIGYgPSAkKG9wdGlvbi1maWxlc1sxXSkgOworICAgICAgICAgICAgICAgIGxvY2FsIG1vZHVsZS1uYW1lID0gLS0kKGY6RD06Uz0pIDsKKyAgICAgICAgICAgICAgICBtb2R1bGVzLmxvYWQgJChtb2R1bGUtbmFtZSkgOiAkKGY6RD0pIDogJChmOkQpIDsKKworICAgICAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgYSBwcm9jZXNzIHJ1bGUsIGNhbGwgaXQgd2l0aCB0aGUgZnVsbCBvcHRpb24gbmFtZQorICAgICAgICAgICAgICAgICMgYW5kIGl0cyB2YWx1ZSAoaWYgYW55KS4gSWYgdGhlcmUgd2FzIG5vICI9IiBpbiB0aGUgb3B0aW9uLCB0aGUKKyAgICAgICAgICAgICAgICAjIHZhbHVlIHdpbGwgYmUgZW1wdHkuCisgICAgICAgICAgICAgICAgaWYgcHJvY2VzcyBpbiBbIFJVTEVOQU1FUyAkKG1vZHVsZS1uYW1lKSBdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb250LWJ1aWxkICs9IFsgbW9kdWxlcy5jYWxsLWluICQobW9kdWxlLW5hbWUpIDogcHJvY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgLS0kKGZ1bGwtbmFtZSkgOiAkKHZhbHVlcykgXSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICQoZG9udC1idWlsZCkgOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91dGlsL29yZGVyLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9vcmRlci5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0ZmM4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9vcmRlci5qYW0KQEAgLTAsMCArMSwxNjkgQEAKKyMgIENvcHlyaWdodCAoQykgMjAwMyBWbGFkaW1pciBQcnVzCisjICBVc2UsIG1vZGlmaWNhdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorIyAgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkKKyMgIGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyAgVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGNsYXNzIHdoaWNoIGFsbG93cyB0byBvcmRlciBhcmJpdHJhcnkgb2JqZWN0IHdpdGgKKyMgcmVnYXJkIHRvIGFyYml0cmFyeSBiaW5hcnkgcmVsYXRpb24uCisjCisjICBUaGUgcHJpbWFyeSB1c2UgY2FzZSBpcyB0aGUgZ2NjIHRvb2xzZXQsIHdoaWNoIGlzIHNlbnNpdGl2ZSB0byBsaWJyYXJ5IG9yZGVyOgorIyAgaWYgbGlicmFyeSAnYScgdXNlcyBzeW1ib2xzIGZyb20gbGlicmFyeSAnYicsIHRoZW4gJ2EnIG11c3QgYmUgcHJlc2VudCBiZWZvcmUKKyMgICdiJyBvbiB0aGUgbGlua2VyJ3MgY29tbWFuZCBsaW5lLgorIworIyAgVGhpcyByZXF1aXJlbWVudCBjYW4gYmUgbGlmdGVkIGZvciBnY2Mgd2l0aCBHTlUgbGQsIGJ1dCBmb3IgZ2NjIHdpdGggU29sYXJpcworIyAgTEQgKGFuZCBmb3IgU29sYXJpcyB0b29sc2V0IGFzIHdlbGwpLCB0aGUgb3JkZXIgYWx3YXlzIG1hdHRlcnMuCisjCisjICBTbywgd2UgbmVlZCB0byBzdG9yZSBvcmRlciByZXF1aXJlbWVudHMgYW5kIHRoZW4gb3JkZXIgbGlicmFyaWVzIGFjY29yZGluZyB0bworIyAgdGhlbS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgZGVwZW5kZW5jeSBncmFwaCBhcyBvcmRlciByZXF1aXJlbWVudHMuCisjICBXaGF0IHdlIG5lZWQgaXMgYSAidXNlIHN5bWJvbHMiIHJlbGF0aW9uc2hpcCB3aGlsZSBkZXBlbmRlbmN5IGdyYXBoIHByb3ZpZGVzCisjICB0aGUgIm5lZWRzIHRvIGJlIHVwZGF0ZWQiIHJlbGF0aW9uc2hpcC4KKyMKKyMgIEZvciBleGFtcGxlOjoKKyMgICAgbGliIGEgOiBhLmNwcCBiOworIyAgICBsaWIgYiA7CisjCisjICBGb3Igc3RhdGljIGxpbmtpbmcsIGxpYnJhcnkgJ2EnIG5lZWQgbm90IGRlcGVuZCBvbiAnYicuIEhvd2V2ZXIsIGl0IHNob3VsZAorIyAgc3RpbGwgY29tZSBiZWZvcmUgJ2InIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKK2NsYXNzIG9yZGVyCit7CisgICAgcnVsZSBfX2luaXRfXyAoICkKKyAgICB7CisgICAgfQorCisgICAgIyBBZGRzIHRoZSBjb25zdHJhaW50IHRoYXQgJ2ZpcnN0JyBzaG91bGQgcHJlY2VlZGUgJ3NlY29uZCcuCisgICAgcnVsZSBhZGQtcGFpciAoIGZpcnN0IHNlY29uZCApCisgICAgeworICAgICAgICAuY29uc3RyYWl0cyArPSAkKGZpcnN0KS0tJChzZWNvbmQpIDsKKyAgICB9CisgICAgTkFUSVZFX1JVTEUgY2xhc3NAb3JkZXIgOiBhZGQtcGFpciA7CisKKyAgICAjIEdpdmVuIGEgbGlzdCBvZiBvYmplY3RzLCByZW9yZGVyIHRoZW0gc28gdGhhdCB0aGUgY29uc3RyYWludHMgc3BlY2lmaWVkIGJ5CisgICAgIyAnYWRkLXBhaXInIGFyZSBzYXRpc2ZpZWQuCisgICAgIworICAgICMgVGhlIGFsZ29yaXRobSB3YXMgYWRvcHRlZCBmcm9tIGFuIGF3ayBzY3JpcHQgYnkgTmlraXRhIFlvdXNoY2hlbmtvCisgICAgIyAoeW91c2ggYXQgY3MgZG90IG1zdSBkb3Qgc3UpCisgICAgcnVsZSBvcmRlciAoIG9iamVjdHMgKiApCisgICAgeworICAgICAgICAjIFRoZSBhbGdvcml0aG0gdXNlZCBpcyB0aGUgc2FtZSBpcyBzdGFuZGFyZCB0cmFuc2l0aXZlIGNsb3N1cmUsIGV4Y2VwdAorICAgICAgICAjIHRoYXQgd2UncmUgbm90IGtlZXBpbmcgaW4tZGVncmVlIGZvciBhbGwgdmVydGljZXMsIGJ1dCByYXRoZXIgcmVtb3ZpbmcKKyAgICAgICAgIyBlZGdlcy4KKyAgICAgICAgbG9jYWwgcmVzdWx0IDsKKyAgICAgICAgaWYgJChvYmplY3RzKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBjb25zdHJhaW50cyA9IFsgZWxpbWluYXRlLXVudXNlZC1jb25zdHJhaXRzICQob2JqZWN0cykgXSA7CisKKyAgICAgICAgICAgICMgRmluZCBzb21lIGxpYnJhcnkgdGhhdCBub2JvZHkgZGVwZW5kcyB1cG9uIGFuZCBhZGQgaXQgdG8gdGhlCisgICAgICAgICAgICAjICdyZXN1bHQnIGFycmF5LgorICAgICAgICAgICAgbG9jYWwgb2JqIDsKKyAgICAgICAgICAgIHdoaWxlICQob2JqZWN0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbCBuZXdfb2JqZWN0cyA7CisgICAgICAgICAgICAgICAgd2hpbGUgJChvYmplY3RzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2JqID0gJChvYmplY3RzWzFdKSA7CisgICAgICAgICAgICAgICAgICAgIGlmIFsgaGFzLW5vLWRlcGVuZGVudHMgJChvYmopIDogJChjb25zdHJhaW50cykgXQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAjIEVtdWxhdGUgYnJlYWsgOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29iamVjdHMgKz0gJChvYmplY3RzWzItXSkgOworICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cyA9IDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vYmplY3RzICs9ICQob2JqKSA7CisgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSA7CisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzID0gJChvYmplY3RzWzItXSkgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgISAkKG9iaikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5lcnJvciAiQ2lyY3VsYXIgb3JkZXIgZGVwZW5kZW5jaWVzIiA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICMgTm8gcHJvYmxlbSB3aXRoIHBsYWNpbmcgZmlyc3QuCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQob2JqKSA7CisgICAgICAgICAgICAgICAgIyBSZW1vdmUgYWxsIGNvbnRyYWludHMgd2hlcmUgJ29iaicgY29tZXMgZmlyc3QsIHNpbmNlIHRoZXkgYXJlCisgICAgICAgICAgICAgICAgIyBhbHJlYWR5IHNhdGlzZmllZC4KKyAgICAgICAgICAgICAgICBjb25zdHJhaW50cyA9IFsgcmVtb3ZlLXNhdGlzZmllZCAkKGNvbnN0cmFpbnRzKSA6ICQob2JqKSBdIDsKKworICAgICAgICAgICAgICAgICMgQWRkIHRoZSByZW1haW5pbmcgb2JqZWN0cyBmb3IgZnVydGhlciBwcm9jZXNzaW5nIG9uIHRoZSBuZXh0CisgICAgICAgICAgICAgICAgIyBpdGVyYXRpb24KKyAgICAgICAgICAgICAgICBvYmplY3RzID0gJChuZXdfb2JqZWN0cykgOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQocmVzdWx0KSA7CisgICAgfQorICAgIE5BVElWRV9SVUxFIGNsYXNzQG9yZGVyIDogb3JkZXIgOworCisgICAgIyBFbGltaW5hdGUgY29uc3RyYWludHMgd2hpY2ggbWVudGlvbiBvYmplY3RzIG5vdCBpbiAnb2JqZWN0cycuIEluCisgICAgIyBncmFwaC10aGVvcnkgdGVybXMsIHRoaXMgaXMgZmluZGluZyBhIHN1YmdyYXBoIGluZHVjZWQgYnkgb3JkZXJlZAorICAgICMgdmVydGljZXMuCisgICAgcnVsZSBlbGltaW5hdGUtdW51c2VkLWNvbnN0cmFpdHMgKCBvYmplY3RzICogKQorICAgIHsKKyAgICAgICAgbG9jYWwgcmVzdWx0IDsKKyAgICAgICAgZm9yIGxvY2FsIGMgaW4gJCguY29uc3RyYWludHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIG0gPSBbIE1BVENIICguKiktLSguKikgOiAkKGMpIF0gOworICAgICAgICAgICAgaWYgJChtWzFdKSBpbiAkKG9iamVjdHMpICYmICQobVsyXSkgaW4gJChvYmplY3RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAkKGMpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJChyZXN1bHQpIDsKKyAgICB9CisKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSdzIG5vIGNvbnN0cmFpbnQgaW4gJ2NvbnN0YXJhaW50cycgd2hlcmUgJ29iaicgY29tZXMKKyAgICAjIHNlY29uZC4KKyAgICBydWxlIGhhcy1uby1kZXBlbmRlbnRzICggb2JqIDogY29uc3RyYWludHMgKiApCisgICAgeworICAgICAgICBsb2NhbCBmYWlsZWQgOworICAgICAgICB3aGlsZSAkKGNvbnN0cmFpbnRzKSAmJiAhICQoZmFpbGVkKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBjID0gJChjb25zdHJhaW50c1sxXSkgOworICAgICAgICAgICAgbG9jYWwgbSA9IFsgTUFUQ0ggKC4qKS0tKC4qKSA6ICQoYykgXSA7CisgICAgICAgICAgICBpZiAkKG1bMl0pID0gJChvYmopCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdHJhaW50cyA9ICQoY29uc3RyYWludHNbMi1dKSA7CisgICAgICAgIH0KKyAgICAgICAgaWYgISAkKGZhaWxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWUgOworICAgICAgICB9CisgICAgfQorCisgICAgcnVsZSByZW1vdmUtc2F0aXNmaWVkICggY29uc3RyYWludHMgKiA6IG9iaiApCisgICAgeworICAgICAgICBsb2NhbCByZXN1bHQgOworICAgICAgICBmb3IgbG9jYWwgYyBpbiAkKGNvbnN0cmFpbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBtID0gWyBNQVRDSCAoLiopLS0oLiopIDogJChjKSBdIDsKKyAgICAgICAgICAgIGlmICQobVsxXSkgIT0gJChvYmopCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoYykgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworICAgIH0KK30KKworCitydWxlIF9fdGVzdF9fICggKQoreworICAgIGltcG9ydCAiY2xhc3MiIDogbmV3IDsKKyAgICBpbXBvcnQgYXNzZXJ0IDsKKworICAgIGMxID0gWyBuZXcgb3JkZXIgXSA7CisgICAgJChjMSkuYWRkLXBhaXIgbDEgbDIgOworCisgICAgYXNzZXJ0LnJlc3VsdCBsMSBsMiA6ICQoYzEpLm9yZGVyIGwxIGwyIDsKKyAgICBhc3NlcnQucmVzdWx0IGwxIGwyIDogJChjMSkub3JkZXIgbDIgbDEgOworCisgICAgJChjMSkuYWRkLXBhaXIgbDIgbDMgOworICAgIGFzc2VydC5yZXN1bHQgbDEgbDIgOiAkKGMxKS5vcmRlciBsMiBsMSA7CisgICAgJChjMSkuYWRkLXBhaXIgeCBsMiA7CisgICAgYXNzZXJ0LnJlc3VsdCBsMSBsMiA6ICQoYzEpLm9yZGVyIGwyIGwxIDsKKyAgICBhc3NlcnQucmVzdWx0IGwxIGwyIGwzIDogJChjMSkub3JkZXIgbDIgbDMgbDEgOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91dGlsL29zLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9vcy5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlZjI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9vcy5qYW0KQEAgLTAsMCArMSwxNzEgQEAKKyMgQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgRGF2ZSBBYnJhaGFtcworIyBDb3B5cmlnaHQgMjAwNiBSZW5lIFJpdmVyYQorIyBDb3B5cmlnaHQgMjAwMywgMjAwNSBWbGFkaW1pciBQcnVzCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgc3RyaW5nIDsKKworCisjIFJldHVybiB0aGUgdmFsdWUocykgb2YgdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlKHMpIGF0IHRoZSB0aW1lIGJqYW0gd2FzCisjIGludm9rZWQuCitydWxlIGVudmlyb24gKCB2YXJpYWJsZS1uYW1lcyArICkKK3sKKyAgICByZXR1cm4gWyBtb2R1bGVzLnBlZWsgLkVOVklST04gOiAkKHZhcmlhYmxlLW5hbWVzKSBdIDsKK30KKworLm5hbWUgPSBbIG1vZHVsZXMucGVlayA6IE9TIF0gOworLnBsYXRmb3JtID0gWyBtb2R1bGVzLnBlZWsgOiBPU1BMQVQgXSA7CisudmVyc2lvbiA9IFsgbW9kdWxlcy5wZWVrIDogT1NWRVIgXSA7CisKKworbG9jYWwgcnVsZSBjb25zdGFudCAoIGMgOiBvcyA/ICkKK3sKKyAgICBvcyA/PSAkKC5uYW1lKSA7CisgICAgIyBGaXJzdCBsb29rIGZvciBhIHBsYXRmb3JtLXNwZWNpZmljIG5hbWUsIHRoZW4gdGhlIGdlbmVyYWwgdmFsdWUuCisgICAgbG9jYWwgdmFyaWFibGVzID0gLiQoYyktJChvcykgLiQoYykgOworICAgIGxvY2FsIHJlc3VsdCA9ICQoJCh2YXJpYWJsZXMpKSA7CisgICAgcmV0dXJuICQocmVzdWx0WzFdKSA7Cit9CisKK3J1bGUgZ2V0LWNvbnN0YW50ICggb3MgPyApCit7CisgICAgIyBGaW5kIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCBiZWluZyBhY2Nlc3NlZCwgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIG5hbWUKKyAgICAjIHVzZWQgdG8gaW52b2tlIHVzLgorICAgIGxvY2FsIGJ0ID0gWyBCQUNLVFJBQ0UgMSBdIDsKKyAgICBsb2NhbCBydWxlbmFtZSA9IFsgTUFUQ0ggKFteLl0qKSQgOiAkKGJ0WzRdKSBdIDsKKyAgICByZXR1cm4gWyBjb25zdGFudCAkKHJ1bGVuYW1lKSA6ICQob3MpIF0gOworfQorCisKKyMgZXhwb3J0IGFsbCB0aGUgY29tbW9uIGNvbnN0YW50cworLmNvbnN0YW50cyA9IG5hbWUgcGxhdGZvcm0gdmVyc2lvbiBzaGFyZWQtbGlicmFyeS1wYXRoLXZhcmlhYmxlIHBhdGgtc2VwYXJhdG9yIGV4ZWN1dGFibGUtcGF0aC12YXJpYWJsZSBleGVjdXRhYmxlLXN1ZmZpeCA7Citmb3IgbG9jYWwgY29uc3RhbnQgaW4gJCguY29uc3RhbnRzKQoreworICAgIElNUE9SVCAkKF9fbmFtZV9fKSA6IGdldC1jb25zdGFudCA6ICQoX19uYW1lX18pIDogJChjb25zdGFudCkgOworfQorRVhQT1JUICQoX19uYW1lX18pIDogJCguY29uc3RhbnRzKSA7CisKKy5leGVjdXRhYmxlLXBhdGgtdmFyaWFibGUtTlQgPSBQQVRIIDsKKyMgT24gV2luZG93cyB0aGUgY2FzZSBhbmQgY2FwaXRhbGl6YXRpb24gb2YgUEFUSCBpcyBub3QgYWx3YXlzIHByZWRpY3RhYmxlLCBzbworIyBsZXQncyBmaW5kIG91dCB3aGF0IHZhcmlhYmxlIG5hbWUgd2FzIHJlYWxseSBzZXQuCitpZiAkKC5uYW1lKSA9IE5UCit7CisgICAgZm9yIGxvY2FsIG4gaW4gWyBWQVJOQU1FUyAuRU5WSVJPTiBdCisgICAgeworICAgICAgICBpZiAkKG46TCkgPSBwYXRoCisgICAgICAgIHsKKyAgICAgICAgICAgIC5leGVjdXRhYmxlLXBhdGgtdmFyaWFibGUtTlQgPSAkKG4pIDsKKyAgICAgICAgfQorICAgIH0KK30KKworIyBTcGVjaWZpYyBjb25zdGFudHMgZm9yIHZhcmlvdXMgcGxhdGZvcm1zLiAgVGhlcmUncyBubyBuZWVkIHRvIGRlZmluZSBhbnkKKyMgY29uc3RhbnQgd2hvc2UgdmFsdWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQsIGJlbG93LgorLnNoYXJlZC1saWJyYXJ5LXBhdGgtdmFyaWFibGUtTlQgPSAkKC5leGVjdXRhYmxlLXBhdGgtdmFyaWFibGUtTlQpIDsKKy5wYXRoLXNlcGFyYXRvci1OVCA9ICI7IiA7CisuZXhwYW5kLXZhcmlhYmxlLXByZWZpeC1OVCA9ICUgOworLmV4cGFuZC12YXJpYWJsZS1zdWZmaXgtTlQgPSAlIDsKKy5leGVjdXRhYmxlLXN1ZmZpeC1OVCA9IC5leGUgOworCisuc2hhcmVkLWxpYnJhcnktcGF0aC12YXJpYWJsZS1DWUdXSU4gPSBQQVRIIDsKKworLnNoYXJlZC1saWJyYXJ5LXBhdGgtdmFyaWFibGUtTUFDT1NYID0gRFlMRF9MSUJSQVJZX1BBVEggOworCisuc2hhcmVkLWxpYnJhcnktcGF0aC12YXJpYWJsZS1BSVggPSBMSUJQQVRIIDsKKworIyBEZWZhdWx0IGNvbnN0YW50cworLnNoYXJlZC1saWJyYXJ5LXBhdGgtdmFyaWFibGUgPSBMRF9MSUJSQVJZX1BBVEggOworLnBhdGgtc2VwYXJhdG9yID0gIjoiIDsKKy5leHBhbmQtdmFyaWFibGUtcHJlZml4ID0gJCA7CisuZXhwYW5kLXZhcmlhYmxlLXN1ZmZpeCA9ICIiIDsKKy5leGVjdXRhYmxlLXBhdGgtdmFyaWFibGUgPSBQQVRIIDsKKy5leGVjdXRhYmxlLXN1ZmZpeCA9ICIiIDsKKworCisjIFJldHVybiBhIGxpc3Qgb2YgdGhlIGRpcmVjdG9yaWVzIGluIHRoZSBQQVRILiBZZXMsIHRoYXQgaW5mb3JtYXRpb24gaXMgKHNvcnQKKyMgb2YpIGF2YWlsYWJsZSBpbiB0aGUgZ2xvYmFsIG1vZHVsZSwgYnV0IGphbSBjb2RlIGNhbiBjaGFuZ2UgdGhvc2UgdmFsdWVzLCBhbmQKKyMgaXQgaXNuJ3QgYWx3YXlzIGNsZWFyIHdoYXQgY2FzZS9jYXBpdGFsaXphdGlvbiB0byB1c2Ugd2hlbiBsb29raW5nLiBUaGlzIHJ1bGUKKyMgaXMgYSBtb3JlIHJlbGlhYmxlIHdheSB0byBnZXQgdGhlcmUuCitydWxlIGV4ZWN1dGFibGUtcGF0aCAoICkKK3sKKyAgICByZXR1cm4gWyBzdHJpbmcud29yZHMgWyBlbnZpcm9uIFsgY29uc3RhbnQgZXhlY3V0YWJsZS1wYXRoLXZhcmlhYmxlIF0gXQorICAgICAgICA6IFsgY29uc3RhbnQgcGF0aC1zZXBhcmF0b3IgXSBdIDsKK30KKworCisjIEluaXRpYWxpemUgdGhlIGxpc3Qgb2YgaG9tZSBkaXJlY3RvcmllcyBmb3IgdGhlIGN1cnJlbnQgdXNlciBkZXBlbmRpbmcgb24gdGhlCisjIE9TLgoraWYgJCgubmFtZSkgPSBOVAoreworICAgIGxvY2FsIGhvbWUgPSBbIGVudmlyb24gSE9NRURSSVZFIEhPTUVQQVRIIF0gOworICAgIC5ob21lLWRpcmVjdG9yaWVzID0gJChob21lWzFdKSQoaG9tZVsyXSkgWyBlbnZpcm9uIEhPTUUgXSBbIGVudmlyb24gVVNFUlBST0ZJTEUgXSA7Cit9CitlbHNlCit7CisgICAgLmhvbWUtZGlyZWN0b3JpZXMgPSBbIGVudmlyb24gSE9NRSBdIDsKK30KKworCisjIENhbid0IHVzZSAnY29uc3RhbnQnIG1lY2hhbmlzbSBiZWNhdXNlIGl0IG9ubHkgcmV0dXJucyAxLWVsZW1lbnQgdmFsdWVzLgorcnVsZSBob21lLWRpcmVjdG9yaWVzICggKQoreworICAgIHJldHVybiAkKC5ob21lLWRpcmVjdG9yaWVzKSA7Cit9CisKKworIyBSZXR1cm4gdGhlIHN0cmluZyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBleHBhbnNpb24gb2YgdGhlIG5hbWVkIHNoZWxsCisjIHZhcmlhYmxlLgorcnVsZSBleHBhbmQtdmFyaWFibGUgKCB2YXJpYWJsZSApCit7CisgICAgbG9jYWwgcHJlZml4ID0gWyBjb25zdGFudCBleHBhbmQtdmFyaWFibGUtcHJlZml4IF0gOworICAgIGxvY2FsIHN1ZmZpeCA9IFsgY29uc3RhbnQgZXhwYW5kLXZhcmlhYmxlLXN1ZmZpeCBdIDsKKyAgICByZXR1cm4gJChwcmVmaXgpJCh2YXJpYWJsZSkkKHN1ZmZpeCkgOworfQorCisKKyMgUmV0dXJucyB0cnVlIGlmIHJ1bm5pbmcgb24gd2luZG93cywgd2hldGhlciBpbiBjeWd3aW4gb3Igbm90LgorcnVsZSBvbi13aW5kb3dzICggKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgaWYgWyBtb2R1bGVzLnBlZWsgOiBOVCBdCisgICAgeworICAgICAgICByZXN1bHQgPSB0cnVlIDsKKyAgICB9CisgICAgZWxzZSBpZiBbIG1vZHVsZXMucGVlayA6IFVOSVggXQorICAgIHsKKyAgICAgICAgc3dpdGNoIFsgbW9kdWxlcy5wZWVrIDogSkFNVU5BTUUgXQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIENZR1dJTiogOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKK2lmICEgWyBvbi13aW5kb3dzIF0KK3sKKyAgICAub24tdW5peCA9IDEgOworfQorCisKK3J1bGUgb24tdW5peAoreworICAgIHJldHVybiAkKC5vbi11bml4KSA7Cit9CisKKworcnVsZSBfX3Rlc3RfXworeworICAgIGltcG9ydCBhc3NlcnQgOworICAgIGlmICEgKCAtLXF1aWV0IGluIFsgbW9kdWxlcy5wZWVrIDogQVJHViBdICkKKyAgICB7CisgICAgICAgIEVDSE8gb3M6IG5hbWU9IFsgbmFtZSBdIDsKKyAgICAgICAgRUNITyBvczogdmVyc2lvbj0gWyB2ZXJzaW9uIF0gOworICAgIH0KKyAgICBhc3NlcnQudHJ1ZSBuYW1lIDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9wYXRoLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9wYXRoLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDVkODNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91dGlsL3BhdGguamFtCkBAIC0wLDAgKzEsOTEwIEBACisjIENvcHlyaWdodCAyMDAyLTIwMDYuIFZsYWRpbWlyIFBydXMKKyMgQ29weXJpZ2h0IDIwMDMtMjAwNC4gRGF2ZSBBYnJhaGFtcworIyBDb3B5cmlnaHQgMjAwMy0yMDA2LiBSZW5lIFJpdmVyYQorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIFBlcmZvcm1zIHZhcmlvdXMgcGF0aCBtYW5pcHVsYXRpb25zLiBQYXRocyBhcmUgYWx3YXlzIGluIGEgJ25vcm1hbGl6ZWQnCisjIHJlcHJlc2VudGF0aW9uLiBJbiBpdCwgYSBwYXRoIG1heSBiZSBlaXRoZXI6CisjCisjICAgICAtICcuJywgb3IKKyMKKyMgICAgIC0gWycvJ10gWyAoICcuLicgJy8nICkqICh0b2tlbiAnLycpKiB0b2tlbiBdCisjCisjIEluIHBsYWluIGVuZ2xpc2gsIHBhdGggY2FuIGJlIHJvb3RlZCwgJy4uJyBlbGVtZW50cyBhcmUgYWxsb3dlZCBvbmx5IGF0IHRoZQorIyBiZWdpbm5pbmcsIGFuZCBpdCBuZXZlciBlbmRzIGluIHNsYXNoLCBleGNlcHQgZm9yIHBhdGggY29uc2lzdGluZyBvZiBzbGFzaAorIyBvbmx5LgorCitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgcmVnZXggOworaW1wb3J0IHNlcXVlbmNlIDsKK2ltcG9ydCBzZXQgOworCisKK29zID0gWyBtb2R1bGVzLnBlZWsgOiBPUyBdIDsKK2lmIFsgbW9kdWxlcy5wZWVrIDogVU5JWCBdCit7CisgICAgbG9jYWwgdW5hbWUgPSBbIG1vZHVsZXMucGVlayA6IEpBTVVOQU1FIF0gOworICAgIHN3aXRjaCAkKHVuYW1lKQorICAgIHsKKyAgICAgICAgY2FzZSBDWUdXSU4qIDogb3MgPSBDWUdXSU4gOworICAgICAgICBjYXNlICogICAgICAgOiBvcyA9IFVOSVggOworICAgIH0KK30KKworCisjIENvbnZlcnRzIHRoZSBuYXRpdmUgcGF0aCBpbnRvIG5vcm1hbGl6ZWQgZm9ybS4KKyMKK3J1bGUgbWFrZSAoIG5hdGl2ZSApCit7CisgICAgcmV0dXJuIFsgbWFrZS0kKG9zKSAkKG5hdGl2ZSkgXSA7Cit9CisKKworIyBCdWlsZHMgbmF0aXZlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoLgorIworcnVsZSBuYXRpdmUgKCBwYXRoICkKK3sKKyAgICByZXR1cm4gWyBuYXRpdmUtJChvcykgJChwYXRoKSBdIDsKK30KKworCisjIFRlc3RzIGlmIGEgcGF0aCBpcyByb290ZWQuCisjCitydWxlIGlzLXJvb3RlZCAoIHBhdGggKQoreworICAgIHJldHVybiBbIE1BVENIICJeKC8pIiA6ICQocGF0aCkgXSA7Cit9CisKKworIyBUZXN0cyBpZiBhIHBhdGggaGFzIGEgcGFyZW50LgorIworcnVsZSBoYXMtcGFyZW50ICggcGF0aCApCit7CisgICAgaWYgJChwYXRoKSAhPSAvCisgICAgeworICAgICAgICByZXR1cm4gMSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiA7CisgICAgfQorfQorCisKKyMgUmV0dXJucyB0aGUgcGF0aCB3aXRob3V0IGFueSBkaXJlY3RvcnkgY29tcG9uZW50cy4KKyMKK3J1bGUgYmFzZW5hbWUgKCBwYXRoICkKK3sKKyAgICByZXR1cm4gWyBNQVRDSCAiKFteL10rKSQiIDogJChwYXRoKSBdIDsKK30KKworCisjIFJldHVybnMgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgcGF0aC4gSWYgbm8gcGFyZW50IGV4aXN0cywgZXJyb3IgaXMgaXNzdWVkLgorIworcnVsZSBwYXJlbnQgKCBwYXRoICkKK3sKKyAgICBpZiBbIGhhcy1wYXJlbnQgJChwYXRoKSBdCisgICAgeworICAgICAgICBpZiAkKHBhdGgpID0gLgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gLi4gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgIyBTdHJpcCBldmVyeXRoaW5nIGF0IHRoZSBlbmQgb2YgcGF0aCB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBsYXN0CisgICAgICAgICAgICAjIHNsYXNoLgorICAgICAgICAgICAgbG9jYWwgcmVzdWx0ID0gWyByZWdleC5tYXRjaCAiKCguKikvKT8oW14vXSspIiA6ICQocGF0aCkgOiAyIDMgXSA7CisKKyAgICAgICAgICAgICMgRGlkIHdlIHN0cmlwIHdoYXQgd2Ugc2hvdWxkbid0PworICAgICAgICAgICAgaWYgJChyZXN1bHRbMl0pID0gIi4uIgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAkKHBhdGgpLy4uIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAhICQocmVzdWx0WzFdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgWyBpcy1yb290ZWQgJChwYXRoKSBdCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC8gOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLiA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuICQocmVzdWx0WzFdKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciAiUGF0aCAnJChwYXRoKScgaGFzIG5vIHBhcmVudCIgOworICAgIH0KK30KKworCisjIFJldHVybnMgcGF0aDIgc3VjaCB0aGF0ICJbIGpvaW4gcGF0aCBwYXRoMiBdID0gLiIuIFRoZSBwYXRoIG1heSBub3QgY29udGFpbgorIyAiLi4iIGVsZW1lbnQgb3IgYmUgcm9vdGVkLgorIworcnVsZSByZXZlcnNlICggcGF0aCApCit7CisgICAgaWYgJChwYXRoKSA9IC4KKyAgICB7CisgICAgICAgIHJldHVybiAkKHBhdGgpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbG9jYWwgdG9rZW5zID0gWyByZWdleC5zcGxpdCAkKHBhdGgpIC8gXSA7CisgICAgICAgIGxvY2FsIHRva2VuczIgOworICAgICAgICBmb3IgbG9jYWwgaSBpbiAkKHRva2VucykKKyAgICAgICAgeworICAgICAgICAgICAgdG9rZW5zMiArPSAuLiA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFsgc2VxdWVuY2Uuam9pbiAkKHRva2VuczIpIDogLyBdIDsKKyAgICB9Cit9CisKKworIyBDb25jYXRlbmF0ZXMgdGhlIHBhc3NlZCBwYXRoIGVsZW1lbnRzLiBHZW5lcmF0ZXMgYW4gZXJyb3IgaWYgYW55IGVsZW1lbnQgb3RoZXIKKyMgdGhhbiB0aGUgZmlyc3Qgb25lIGlzIHJvb3RlZC4gU2tpcHMgYW55IGVtcHR5IG9yIHVuZGVmaW5lZCBwYXRoIGVsZW1lbnRzLgorIworcnVsZSBqb2luICggZWxlbWVudHMgKyApCit7CisgICAgaWYgISAkKGVsZW1lbnRzWzItXSkKKyAgICB7CisgICAgICAgIHJldHVybiAkKGVsZW1lbnRzWzFdKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciBsb2NhbCBlIGluICQoZWxlbWVudHNbMi1dKQorICAgICAgICB7CisgICAgICAgICAgICBpZiBbIGlzLXJvb3RlZCAkKGUpIF0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbXBvcnQgZXJyb3JzIDsKKyAgICAgICAgICAgICAgICBlcnJvcnMuZXJyb3Igb25seSB0aGUgZmlyc3QgZWxlbWVudCBtYXkgYmUgcm9vdGVkIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gWyBOT1JNQUxJWkVfUEFUSCAiJChlbGVtZW50cykiIF0gOworICAgIH0KK30KKworCisjIElmICdwYXRoJyBpcyByZWxhdGl2ZSwgaXQgaXMgcm9vdGVkIGF0ICdyb290Jy4gT3RoZXJ3aXNlLCBpdCBpcyB1bmNoYW5nZWQuCisjCitydWxlIHJvb3QgKCBwYXRoIHJvb3QgKQoreworICAgIGlmIFsgaXMtcm9vdGVkICQocGF0aCkgXQorICAgIHsKKyAgICAgICAgcmV0dXJuICQocGF0aCkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gWyBqb2luICQocm9vdCkgJChwYXRoKSBdIDsKKyAgICB9Cit9CisKKworIyBSZXR1cm5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorIworcnVsZSBwd2QgKCApCit7CisgICAgaWYgISAkKC5wd2QpCisgICAgeworICAgICAgICAucHdkID0gWyBtYWtlIFsgUFdEIF0gXSA7CisgICAgfQorICAgIHJldHVybiAkKC5wd2QpIDsKK30KKworCisjIFJldHVybnMgdGhlIGxpc3Qgb2YgZmlsZXMgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhdHRlcm4gaW4gdGhlIHNwZWNpZmllZAorIyBkaXJlY3RvcnkuIEJvdGggZGlyZWN0b3JpZXMgYW5kIHBhdHRlcm5zIGFyZSBzdXBwbGllZCBhcyBwb3J0YWJsZSBwYXRocy4gRWFjaAorIyBwYXR0ZXJuIHNob3VsZCBiZSBub24tYWJzb2x1dGUgcGF0aCwgYW5kIGNhbid0IGNvbnRhaW4gIi4iIG9yICIuLiIgZWxlbWVudHMuCisjIEVhY2ggc2xhc2ggc2VwYXJhdGVkIGVsZW1lbnQgb2YgcGF0dGVybiBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHNwZWNpYWwKKyMgY2hhcmFjdGVyczoKKyMgICAtICc/Jywgd2hpY2ggbWF0Y2ggYW55IGNoYXJhY3RlcgorIyAgIC0gJyonLCB3aGljaCBtYXRjaGVzIGFyYml0cmFyeSBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyMgQSBmaWxlICQoZCkvZTEvZTIvZTMgKHdoZXJlICdkJyBpcyBpbiAkKGRpcnMpKSBtYXRjaGVzIHBhdHRlcm4gcDEvcDIvcDMgaWYgYW5kCisjIG9ubHkgaWYgZTEgbWF0Y2hlcyBwMSwgZTIgbWF0Y2hlcyBwMiBhbmQgc28gb24uCisjCisjIEZvciBleGFtcGxlOgorIyAgIFsgZ2xvYiAuIDogKi5jcHAgXQorIyAgIFsgZ2xvYiAuIDogKi9idWlsZC9KYW1maWxlIF0KKyMKK3J1bGUgZ2xvYiAoIGRpcnMgKiA6IHBhdHRlcm5zICsgOiBleGNsdWRlLXBhdHRlcm5zICogKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgbG9jYWwgcmVhbC1wYXR0ZXJucyA7CisgICAgbG9jYWwgcmVhbC1leGNsdWRlLXBhdHRlcm5zIDsKKyAgICBmb3IgbG9jYWwgZCBpbiAkKGRpcnMpCisgICAgeworICAgICAgICBmb3IgbG9jYWwgcCBpbiAkKHBhdHRlcm5zKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBwYXR0ZXJuID0gWyBwYXRoLnJvb3QgJChwKSAkKGQpIF0gOworICAgICAgICAgICAgcmVhbC1wYXR0ZXJucyArPSBbIHBhdGgubmF0aXZlICQocGF0dGVybikgXSA7CisgICAgICAgIH0KKworICAgICAgICBmb3IgbG9jYWwgcCBpbiAkKGV4Y2x1ZGUtcGF0dGVybnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsIHBhdHRlcm4gPSBbIHBhdGgucm9vdCAkKHApICQoZCkgXSA7CisgICAgICAgICAgICByZWFsLWV4Y2x1ZGUtcGF0dGVybnMgKz0gWyBwYXRoLm5hdGl2ZSAkKHBhdHRlcm4pIF0gOworICAgICAgICB9CisgICAgfQorCisgICAgbG9jYWwgaW5jID0gWyBHTE9CLVJFQ1VSU0lWRUxZICQocmVhbC1wYXR0ZXJucykgXSA7CisgICAgaW5jID0gWyBzZXF1ZW5jZS50cmFuc2Zvcm0gTk9STUFMSVpFX1BBVEggOiAkKGluYykgXSA7CisgICAgbG9jYWwgZXhjID0gWyBHTE9CLVJFQ1VSU0lWRUxZICQocmVhbC1leGNsdWRlLXBhdHRlcm5zKSBdIDsKKyAgICBleGMgPSBbIHNlcXVlbmNlLnRyYW5zZm9ybSBOT1JNQUxJWkVfUEFUSCA6ICQoZXhjKSBdIDsKKworICAgIHJldHVybiBbIHNlcXVlbmNlLnRyYW5zZm9ybSBwYXRoLm1ha2UgOiBbIHNldC5kaWZmZXJlbmNlICQoaW5jKSA6ICQoZXhjKSBdIF0KKyAgICAgICAgOworfQorCisKKyMgUmVjdXJzaXZlIHZlcnNpb24gb2YgR0xPQi4gQnVpbGRzIHRoZSBnbG9iIG9mIGZpbGVzIHdoaWxlIGFsc28gc2VhcmNoaW5nIGluCisjIHRoZSBzdWJkaXJlY3RvcmllcyBvZiB0aGUgZ2l2ZW4gcm9vdHMuIEFuIG9wdGlvbmFsIHNldCBvZiBleGNsdXNpb24gcGF0dGVybnMKKyMgd2lsbCBmaWx0ZXIgb3V0IHRoZSBtYXRjaGluZyBlbnRyaWVzIGZyb20gdGhlIHJlc3VsdC4gVGhlIGV4Y2x1c2lvbnMgYWxzbworIyBhcHBseSB0byB0aGUgc3ViZGlyZWN0b3J5IHNjYW5uaW5nLCBzdWNoIHRoYXQgZGlyZWN0b3JpZXMgdGhhdCBtYXRjaCB0aGUKKyMgZXhjbHVzaW9uIHBhdHRlcm5zIHdpbGwgbm90IGJlIHNlYXJjaGVkLgorIworcnVsZSBnbG9iLXRyZWUgKCByb290cyAqIDogcGF0dGVybnMgKyA6IGV4Y2x1ZGUtcGF0dGVybnMgKiApCit7CisgICAgcmV0dXJuIFsgc2VxdWVuY2UudHJhbnNmb3JtIHBhdGgubWFrZSA6IFsgLmdsb2ItdHJlZSBbIHNlcXVlbmNlLnRyYW5zZm9ybQorICAgICAgICBwYXRoLm5hdGl2ZSA6ICQocm9vdHMpIF0gOiAkKHBhdHRlcm5zKSA6ICQoZXhjbHVkZS1wYXR0ZXJucykgXSBdIDsKK30KKworCitsb2NhbCBydWxlIC5nbG9iLXRyZWUgKCByb290cyAqIDogcGF0dGVybnMgKiA6IGV4Y2x1ZGUtcGF0dGVybnMgKiApCit7CisgICAgbG9jYWwgZXhjbHVkZWQgOworICAgIGlmICQoZXhjbHVkZS1wYXR0ZXJucykKKyAgICB7CisgICAgICAgIGV4Y2x1ZGVkID0gWyBHTE9CICQocm9vdHMpIDogJChleGNsdWRlLXBhdHRlcm5zKSBdIDsKKyAgICB9CisgICAgbG9jYWwgcmVzdWx0ID0gWyBzZXQuZGlmZmVyZW5jZSBbIEdMT0IgJChyb290cykgOiAkKHBhdHRlcm5zKSBdIDoKKyAgICAgICAgJChleGNsdWRlZCkgXSA7CisgICAgbG9jYWwgc3ViZGlycyA7CisgICAgZm9yIGxvY2FsIGQgaW4gWyBzZXQuZGlmZmVyZW5jZSBbIEdMT0IgJChyb290cykgOiAqIF0gOiAkKGV4Y2x1ZGVkKSBdCisgICAgeworICAgICAgICBpZiAhICggJChkOkQ9KSBpbiAuIC4uICkgJiYgISBbIENIRUNLX0lGX0ZJTEUgJChkKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1YmRpcnMgKz0gJChkKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgJChzdWJkaXJzKQorICAgIHsKKyAgICAgICAgcmVzdWx0ICs9IFsgLmdsb2ItdHJlZSAkKHN1YmRpcnMpIDogJChwYXR0ZXJucykgOiAkKGV4Y2x1ZGUtcGF0dGVybnMpIF0KKyAgICAgICAgICAgIDsKKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBSZXR1cm5zIHRydWUgaXMgdGhlIHNwZWNpZmllZCBmaWxlIGV4aXN0cy4KKyMKK3J1bGUgZXhpc3RzICggZmlsZSApCit7CisgICAgcmV0dXJuIFsgcGF0aC5nbG9iICQoZmlsZTpEKSA6ICQoZmlsZTpEPSkgXSA7Cit9CitOQVRJVkVfUlVMRSBwYXRoIDogZXhpc3RzIDsKKworCisjIEZpbmQgb3V0IHRoZSBhYnNvbHV0ZSBuYW1lIG9mIHBhdGggYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHRoZSBwYXJlbnRzLAorIyBzdGFydGluZyB3aXRoIHRoZSBpbW1lZGlhdGUgb25lLiBQYXJlbnRzIGFyZSByZXR1cm5lZCBhcyByZWxhdGl2ZSBuYW1lcy4gSWYKKyMgJ3VwcGVyX2xpbWl0JyBpcyBzcGVjaWZpZWQsIGRpcmVjdG9yaWVzIGFib3ZlIGl0IHdpbGwgYmUgcHJ1bmVkLgorIworcnVsZSBhbGwtcGFyZW50cyAoIHBhdGggOiB1cHBlcl9saW1pdCA/IDogY3dkID8gKQoreworICAgIGN3ZCA/PSBbIHB3ZCBdIDsKKyAgICBsb2NhbCBwYXRoX2VsZSA9IFsgcmVnZXguc3BsaXQgWyByb290ICQocGF0aCkgJChjd2QpIF0gLyBdIDsKKworICAgIGlmICEgJCh1cHBlcl9saW1pdCkKKyAgICB7CisgICAgICAgIHVwcGVyX2xpbWl0ID0gLyA7CisgICAgfQorICAgIGxvY2FsIHVwcGVyX2VsZSA9IFsgcmVnZXguc3BsaXQgWyByb290ICQodXBwZXJfbGltaXQpICQoY3dkKSBdIC8gXSA7CisKKyAgICAjIExlYXZlIG9ubHkgZWxlbWVudHMgaW4gJ3BhdGhfZWxlJyBiZWxvdyAndXBwZXJfZWxlJy4KKyAgICB3aGlsZSAkKHBhdGhfZWxlKSAmJiAoICQodXBwZXJfZWxlWzFdKSA9ICQocGF0aF9lbGVbMV0pICkKKyAgICB7CisgICAgICAgIHVwcGVyX2VsZSA9ICQodXBwZXJfZWxlWzItXSkgOworICAgICAgICBwYXRoX2VsZSA9ICQocGF0aF9lbGVbMi1dKSA7CisgICAgfQorCisgICAgIyBIYXZlIGFsbCB1cHBlciBlbGVtZW50cyBiZWVuIHJlbW92ZWQgPworICAgIGlmICQodXBwZXJfZWxlKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciAiJCh1cHBlcl9saW1pdCkgaXMgbm90IHByZWZpeCBvZiAkKHBhdGgpIiA7CisgICAgfQorCisgICAgIyBDcmVhdGUgdGhlIHJlbGF0aXZlIHBhdGhzIHRvIHBhcmVudHMsIG51bWJlciBvZiBlbGVtZW50cyBpbiAncGF0aF9lbGUnLgorICAgIGxvY2FsIHJlc3VsdCA7CisgICAgZm9yIGxvY2FsIGkgaW4gJChwYXRoX2VsZSkKKyAgICB7CisgICAgICAgIHBhdGggPSBbIHBhcmVudCAkKHBhdGgpIF0gOworICAgICAgICByZXN1bHQgKz0gJChwYXRoKSA7CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgU2VhcmNoIGZvciAncGF0dGVybicgaW4gcGFyZW50IGRpcmVjdG9yaWVzIG9mICdkaXInLCB1cCB0byBhbmQgaW5jbHVkaW5nCisjICd1cHBlcl9saW1pdCcsIGlmIGl0IGlzIHNwZWNpZmllZCwgb3IgdXAgdG8gdGhlIGZpbGVzeXN0ZW0gcm9vdCBvdGhlcndpc2UuCisjCitydWxlIGdsb2ItaW4tcGFyZW50cyAoIGRpciA6IHBhdHRlcm5zICsgOiB1cHBlci1saW1pdCA/ICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGxvY2FsIHBhcmVudC1kaXJzID0gWyBhbGwtcGFyZW50cyAkKGRpcikgOiAkKHVwcGVyLWxpbWl0KSBdIDsKKworICAgIHdoaWxlICQocGFyZW50LWRpcnMpICYmICEgJChyZXN1bHQpCisgICAgeworICAgICAgICByZXN1bHQgPSBbIGdsb2IgJChwYXJlbnQtZGlyc1sxXSkgOiAkKHBhdHRlcm5zKSBdIDsKKyAgICAgICAgcGFyZW50LWRpcnMgPSAkKHBhcmVudC1kaXJzWzItXSkgOworICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCisjIEFzc3VtaW5nICdjaGlsZCcgaXMgYSBzdWJkaXJlY3Rvcnkgb2YgJ3BhcmVudCcsIHJldHVybiB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tCisjICdwYXJlbnQnIHRvICdjaGlsZCcuCisjCitydWxlIHJlbGF0aXZlICggY2hpbGQgcGFyZW50IDogbm8tZXJyb3IgPyApCit7CisgICAgbG9jYWwgbm90LWEtY2hpbGQgOworICAgIGlmICQocGFyZW50KSA9ICIuIgorICAgIHsKKyAgICAgICAgcmV0dXJuICQoY2hpbGQpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbG9jYWwgc3BsaXQxID0gWyByZWdleC5zcGxpdCAkKHBhcmVudCkgLyBdIDsKKyAgICAgICAgbG9jYWwgc3BsaXQyID0gWyByZWdleC5zcGxpdCAkKGNoaWxkKSAvIF0gOworCisgICAgICAgIHdoaWxlICQoc3BsaXQxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKHNwbGl0MVsxXSkgPSAkKHNwbGl0MlsxXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcGxpdDEgPSAkKHNwbGl0MVsyLV0pIDsKKyAgICAgICAgICAgICAgICBzcGxpdDIgPSAkKHNwbGl0MlsyLV0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub3QtYS1jaGlsZCA9IHRydWUgOworICAgICAgICAgICAgICAgIHNwbGl0MSA9IDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAkKHNwbGl0MikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJChub3QtYS1jaGlsZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAkKG5vLWVycm9yKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vdC1hLWNoaWxkIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5lcnJvciAkKGNoaWxkKSBpcyBub3QgYSBzdWJkaXIgb2YgJChwYXJlbnQpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFsgam9pbiAkKHNwbGl0MikgXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIi4iIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIFJldHVybnMgdGhlIG1pbmltYWwgcGF0aCB0byBwYXRoMiB0aGF0IGlzIHJlbGF0aXZlIHRvIHBhdGgxLgorIworcnVsZSByZWxhdGl2ZS10byAoIHBhdGgxIHBhdGgyICkKK3sKKyAgICBsb2NhbCByb290XzEgPSBbIHJlZ2V4LnNwbGl0IFsgcmV2ZXJzZSAkKHBhdGgxKSBdIC8gXSA7CisgICAgbG9jYWwgc3BsaXQxID0gWyByZWdleC5zcGxpdCAkKHBhdGgxKSAvIF0gOworICAgIGxvY2FsIHNwbGl0MiA9IFsgcmVnZXguc3BsaXQgJChwYXRoMikgLyBdIDsKKworICAgIHdoaWxlICQoc3BsaXQxKSAmJiAkKHJvb3RfMSkKKyAgICB7CisgICAgICAgIGlmICQoc3BsaXQxWzFdKSA9ICQoc3BsaXQyWzFdKQorICAgICAgICB7CisgICAgICAgICAgICByb290XzEgPSAkKHJvb3RfMVsyLV0pIDsKKyAgICAgICAgICAgIHNwbGl0MSA9ICQoc3BsaXQxWzItXSkgOworICAgICAgICAgICAgc3BsaXQyID0gJChzcGxpdDJbMi1dKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzcGxpdDEgPSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFsgam9pbiAuICQocm9vdF8xKSAkKHNwbGl0MikgXSA7Cit9CisKKworIyBSZXR1cm5zIHRoZSBsaXN0IG9mIHBhdGhzIHVzZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZm9yIGxvb2tpbmcgdXAKKyMgcHJvZ3JhbXMuCisjCitydWxlIHByb2dyYW1zLXBhdGggKCApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBsb2NhbCByYXcgPSBbIG1vZHVsZXMucGVlayA6IFBBVEggUGF0aCBwYXRoIF0gOworICAgIGZvciBsb2NhbCBwIGluICQocmF3KQorICAgIHsKKyAgICAgICAgaWYgJChwKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gWyBwYXRoLm1ha2UgJChwKSBdIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCitydWxlIG1ha2VkaXJzICggcGF0aCApCit7CisgICAgbG9jYWwgcmVzdWx0ID0gdHJ1ZSA7CisgICAgbG9jYWwgbmF0aXZlID0gWyBuYXRpdmUgJChwYXRoKSBdIDsKKyAgICBpZiAhIFsgZXhpc3RzICQobmF0aXZlKSBdCisgICAgeworICAgICAgICBpZiBbIG1ha2VkaXJzIFsgcGFyZW50ICQocGF0aCkgXSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICEgWyBNQUtFRElSICQobmF0aXZlKSBdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICAgICAgZXJyb3JzLmVycm9yICJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSAnJChwYXRoKSciIDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBDb252ZXJ0cyBuYXRpdmUgV2luZG93cyBwYXRocyBpbnRvIG91ciBpbnRlcm5hbCBjYW5vbmljIHBhdGggcmVwcmVzZW50YXRpb24uCisjIFN1cHBvcnRzICdpbnZhbGlkJyBwYXRocyBjb250YWluaW5nIG11bHRpcGxlIHN1Y2Nlc3NpdmUgcGF0aCBzZXBhcmF0b3IKKyMgY2hhcmFjdGVycy4KKyMKKyMgVE9ETzogQ2hlY2sgYW5kIGlmIG5lZWRlZCBhZGQgc3VwcG9ydCBmb3IgV2luZG93cyAnWDpmaWxlJyBwYXRoIGZvcm1hdCB3aGVyZQorIyB0aGUgZmlsZSBpcyBsb2NhdGVkIGluIHRoZSBjdXJyZW50IGZvbGRlciBvbiBkcml2ZSBYLgorIworcnVsZSBtYWtlLU5UICggbmF0aXZlICkKK3sKKyAgICBsb2NhbCByZXN1bHQgPSBbIE5PUk1BTElaRV9QQVRIICQobmF0aXZlKSBdIDsKKworICAgICMgV2UgbmVlZCB0byBhZGQgYW4gZXh0cmEgJy8nIGluIGZyb250IGluIGNhc2UgdGhpcyBpcyBhIHJvb3RlZCBXaW5kb3dzIHBhdGgKKyAgICAjIHN0YXJ0aW5nIHdpdGggYSBkcml2ZSBsZXR0ZXIgYW5kIG5vdCBhIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlciBzaW5jZSB0aGUKKyAgICAjIGJ1aWx0aW4gTk9STUFMSVpFX1BBVEggcnVsZSBoYXMgbm8ga25vd2xlZGdlIG9mIHRoaXMgbGVhZGluZyBkcml2ZSBsZXR0ZXIKKyAgICAjIGFuZCB0cmVhdHMgaXQgYXMgYSByZWd1bGFyIGZvbGRlciBuYW1lLgorICAgIGlmIFsgcmVnZXgubWF0Y2ggIiheLjopIiA6ICQobmF0aXZlKSBdCisgICAgeworICAgICAgICByZXN1bHQgPSAvJChyZXN1bHQpIDsKKyAgICB9CisKKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCitydWxlIG5hdGl2ZS1OVCAoIHBhdGggKQoreworICAgIGxvY2FsIHJlbW92ZS1zbGFzaCA9IFsgTUFUQ0ggIl4vKC46LiopIiA6ICQocGF0aCkgXSA7CisgICAgaWYgJChyZW1vdmUtc2xhc2gpCisgICAgeworICAgICAgICBwYXRoID0gJChyZW1vdmUtc2xhc2gpIDsKKyAgICB9CisgICAgcmV0dXJuIFsgcmVnZXgucmVwbGFjZSAkKHBhdGgpIC8gXFwgXSA7Cit9CisKKworcnVsZSBtYWtlLVVOSVggKCBuYXRpdmUgKQoreworICAgICMgVlA6IEkgaGF2ZSBubyBpZGVhIG5vdyAnbmF0aXZlJyBjYW4gYmUgZW1wdHkgaGVyZSEgQnV0IGl0IGNhbiEKKyAgICBpZiAhICQobmF0aXZlKQorICAgIHsKKyAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgIGVycm9ycy5lcnJvciAiRW1wdHkgcGF0aCBwYXNzZWQgdG8gJ21ha2UtVU5JWCciIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFsgTk9STUFMSVpFX1BBVEggJChuYXRpdmU6VCkgXSA7CisgICAgfQorfQorCisKK3J1bGUgbmF0aXZlLVVOSVggKCBwYXRoICkKK3sKKyAgICByZXR1cm4gJChwYXRoKSA7Cit9CisKKworcnVsZSBtYWtlLUNZR1dJTiAoIHBhdGggKQoreworICAgIHJldHVybiBbIG1ha2UtTlQgJChwYXRoKSBdIDsKK30KKworCitydWxlIG5hdGl2ZS1DWUdXSU4gKCBwYXRoICkKK3sKKyAgICBsb2NhbCByZXN1bHQgPSAkKHBhdGgpIDsKKyAgICBpZiBbIHJlZ2V4Lm1hdGNoICIoXi8uOikiIDogJChwYXRoKSAgXSAgIyBXaW5kb3dzIGFic29sdXRlIHBhdGguCisgICAgeworICAgICAgICByZXN1bHQgPSBbIE1BVENIICJeLz8oLiopIiA6ICQocGF0aCkgXSA7ICAjIFJlbW92ZSBsZWFkaW5nICcvJy4KKyAgICB9CisgICAgcmV0dXJuIFsgbmF0aXZlLVVOSVggJChyZXN1bHQpIF0gOworfQorCisKKyMgc3BsaXQtcGF0aC1WTVM6IHNwbGl0cyBpbnB1dCBuYXRpdmUgcGF0aCBpbnRvIGRldmljZSBkaXIgZmlsZSAoZWFjaCBwYXJ0IGlzCisjIG9wdGlvbmFsKS4KKyMKKyMgZXhhbXBsZToKKyMKKyMgZGV2OltkaXJdZmlsZS5jID0+IGRldjogW2Rpcl0gZmlsZS5jCisjCitydWxlIHNwbGl0LXBhdGgtVk1TICggbmF0aXZlICkKK3sKKyAgICBsb2NhbCBtYXRjaGVzID0gWyBNQVRDSCAoW2EtekEtWjAtOV8tXSs6KT8oXFxbW15cXV0qXFxdKT8oLiopPyQgOiAkKG5hdGl2ZSkKKyAgICAgICAgXSA7CisgICAgbG9jYWwgZGV2aWNlID0gJChtYXRjaGVzWzFdKSA7CisgICAgbG9jYWwgZGlyID0gJChtYXRjaGVzWzJdKSA7CisgICAgbG9jYWwgZmlsZSA9ICQobWF0Y2hlc1szXSkgOworCisgICAgcmV0dXJuICQoZGV2aWNlKSAkKGRpcikgJChmaWxlKSA7Cit9CisKKworIyBDb252ZXJ0cyBhIG5hdGl2ZSBWTVMgcGF0aCBpbnRvIGEgcG9ydGFibGUgcGF0aCBzcGVjLgorIworIyBEb2VzIG5vdCBoYW5kbGUgY3VycmVudC1kZXZpY2UgYWJzb2x1dGUgcGF0aHMgc3VjaCBhcyAiW2Rpcl1GaWxlLmMiIGFzIGl0IGlzCisjIG5vdCBjbGVhciBob3cgdG8gcmVwcmVzZW50IHRoZW0gaW4gdGhlIHBvcnRhYmxlIHBhdGggbm90YXRpb24uCisjCisjIEFkZHMgYSB0cmFpbGluZyBkb3QgKCIuIikgdG8gdGhlIGZpbGUgcGFydCBpZiBubyBleHRlbnNpb24gaXMgcHJlc2VudCAoaGVscHMKKyMgd2hlbiBjb252ZXJ0aW5nIGl0IGJhY2sgaW50byBuYXRpdmUgcGF0aCkuCisjCitydWxlIG1ha2UtVk1TICggbmF0aXZlICkKK3sKKyAgICBpZiBbIE1BVENIIF4oXFxbW2EtekEtWjAtOV0pIDogJChuYXRpdmUpIF0KKyAgICB7CisgICAgICAgIGltcG9ydCBlcnJvcnMgOworICAgICAgICBlcnJvcnMuZXJyb3IgIkNhbid0IGhhbmRsZSBkZWZhdWx0LWRldmljZSBhYnNvbHV0ZSBwYXRoczogIiAkKG5hdGl2ZSkgOworICAgIH0KKworICAgIGxvY2FsIHBhcnRzID0gWyBzcGxpdC1wYXRoLVZNUyAkKG5hdGl2ZSkgXSA7CisgICAgbG9jYWwgZGV2aWNlID0gJChwYXJ0c1sxXSkgOworICAgIGxvY2FsIGRpciA9ICQocGFydHNbMl0pIDsKKyAgICBsb2NhbCBmaWxlID0gJChwYXJ0c1szXSkgOworICAgIGxvY2FsIGVsZW1zIDsKKworICAgIGlmICQoZGV2aWNlKQorICAgIHsKKyAgICAgICAgIworICAgICAgICAjIHJvb3RlZAorICAgICAgICAjCisgICAgICAgIGVsZW1zID0gLyQoZGV2aWNlKSA7CisgICAgfQorCisgICAgaWYgJChkaXIpID0gIltdIgorICAgIHsKKyAgICAgICAgIworICAgICAgICAjIFNwZWNpYWwgY2FzZTogY3VycmVudCBkaXJlY3RvcnkKKyAgICAgICAgIworICAgICAgICBlbGVtcyA9ICQoZWxlbXMpICIuIiA7CisgICAgfQorICAgIGVsc2UgaWYgJChkaXIpCisgICAgeworICAgICAgICBkaXIgPSBbIHJlZ2V4LnJlcGxhY2UgJChkaXIpICJcXFt8XFxdIiAiIiBdIDsKKyAgICAgICAgbG9jYWwgZGlyX3BhcnRzID0gWyByZWdleC5zcGxpdCAkKGRpcikgXFwuIF0gIDsKKworICAgICAgICBpZiAkKGRpcl9wYXJ0c1sxXSkgPSAiIgorICAgICAgICB7CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFJlbGF0aXZlIHBhdGgKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIGRpcl9wYXJ0cyA9ICQoZGlyX3BhcnRzWzItLTFdKSA7CisgICAgICAgIH0KKworICAgICAgICAjCisgICAgICAgICMgcmVwbGFjZSAicGFyZW50LWRpcmVjdG9yeSIgcGFydHMgKC0gPT4gLi4pCisgICAgICAgICMKKyAgICAgICAgZGlyX3BhcnRzID0gWyByZWdleC5yZXBsYWNlLWxpc3QgJChkaXJfcGFydHMpIDogLSA6IC4uIF0gOworCisgICAgICAgIGVsZW1zID0gJChlbGVtcykgJChkaXJfcGFydHMpIDsKKyAgICB9CisKKyAgICBpZiAkKGZpbGUpCisgICAgeworICAgICAgICBpZiAhIFsgTUFUQ0ggKFxcLikgOiAkKGZpbGUpIF0KKyAgICAgICAgeworICAgICAgICAgICAgIworICAgICAgICAgICAgIyBBbHdheXMgYWRkICIuIiB0byBlbmQgb2Ygbm9uLWV4dGVuc2lvbiBmaWxlLgorICAgICAgICAgICAgIworICAgICAgICAgICAgZmlsZSA9ICQoZmlsZSkuIDsKKyAgICAgICAgfQorICAgICAgICBlbGVtcyA9ICQoZWxlbXMpICQoZmlsZSkgOworICAgIH0KKworICAgIGxvY2FsIHBvcnRhYmxlID0gWyBwYXRoLmpvaW4gJChlbGVtcykgXSA7CisKKyAgICByZXR1cm4gJChwb3J0YWJsZSkgOworfQorCisKKyMgQ29udmVydHMgYSBwb3J0YWJsZSBwYXRoIHNwZWMgaW50byBhIG5hdGl2ZSBWTVMgcGF0aC4KKyMKKyMgUmVsaWVzIG9uIGhhdmluZyBhdCBsZWFzdCBvbmUgZG90ICgiLiIpIGluY2x1ZGVkIGluIHRoZSBmaWxlIG5hbWUgdG8gYmUgYWJsZQorIyB0byBkaWZmZXJlbnRpYXRlIGl0IGZyb20gdGhlIGRpcmVjdG9yeSBwYXJ0LgorIworcnVsZSBuYXRpdmUtVk1TICggcGF0aCApCit7CisgICAgbG9jYWwgZGV2aWNlID0gIiIgOworICAgIGxvY2FsIGRpciA9ICQocGF0aCkgOworICAgIGxvY2FsIGZpbGUgPSAiIiA7CisgICAgbG9jYWwgbmF0aXZlIDsKKyAgICBsb2NhbCBzcGxpdCA7CisKKyAgICAjCisgICAgIyBIYXMgZGV2aWNlID8KKyAgICAjCisgICAgaWYgWyBpcy1yb290ZWQgJChkaXIpIF0KKyAgICB7CisgICAgICAgIHNwbGl0ID0gWyBNQVRDSCBeLyhbXjpdKzopLz8oLiopIDogJChkaXIpIF0gOworICAgICAgICBkZXZpY2UgPSAkKHNwbGl0WzFdKSA7CisgICAgICAgIGRpciA9ICQoc3BsaXRbMl0pIDsKKyAgICB9CisKKyAgICAjCisgICAgIyBIYXMgZmlsZSA/CisgICAgIworICAgICMgVGhpcyBpcyBubyBleGFjdCBzY2llbmNlLCBqdXN0IGd1ZXNzIHdvcms6CisgICAgIworICAgICMgSWYgdGhlIGxhc3QgcGFydCBvZiB0aGUgY3VycmVudCBwYXRoIHNwZWMgaW5jbHVkZXMgc29tZSBjaGFycywgZm9sbG93ZWQgYnkKKyAgICAjIGEgZG90LCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IG1vcmUgY2hhcnMgLSB0aGVuIGl0IGlzIGEgZmlsZSAoa2VlcCB5b3VyCisgICAgIyBmaW5nZXJzIGNyb3NzZWQpLgorICAgICMKKyAgICBzcGxpdCA9IFsgcmVnZXguc3BsaXQgJChkaXIpIC8gXSA7CisgICAgbG9jYWwgbWF5YmVfZmlsZSA9ICQoc3BsaXRbLTFdKSA7CisKKyAgICBpZiBbIE1BVENIIF4oW14uXStcXC4uKikgOiAkKG1heWJlX2ZpbGUpIF0KKyAgICB7CisgICAgICAgIGZpbGUgPSAkKG1heWJlX2ZpbGUpIDsKKyAgICAgICAgZGlyID0gWyBzZXF1ZW5jZS5qb2luICQoc3BsaXRbMS0tMl0pIDogLyBdIDsKKyAgICB9CisKKyAgICAjCisgICAgIyBIYXMgZGlyIHNwZWMgPworICAgICMKKyAgICBpZiAkKGRpcikgPSAiLiIKKyAgICB7CisgICAgICAgIGRpciA9ICJbXSIgOworICAgIH0KKyAgICBlbHNlIGlmICQoZGlyKQorICAgIHsKKyAgICAgICAgZGlyID0gWyByZWdleC5yZXBsYWNlICQoZGlyKSBcXC5cXC4gLSBdIDsKKyAgICAgICAgZGlyID0gWyByZWdleC5yZXBsYWNlICQoZGlyKSAvIC4gXSA7CisKKyAgICAgICAgaWYgJChkZXZpY2UpID0gIiIKKyAgICAgICAgeworICAgICAgICAgICAgIworICAgICAgICAgICAgIyBSZWxhdGl2ZSBkaXJlY3RvcnkKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIGRpciA9ICIuIiQoZGlyKSA7CisgICAgICAgIH0KKyAgICAgICAgZGlyID0gIlsiJChkaXIpIl0iIDsKKyAgICB9CisKKyAgICBuYXRpdmUgPSBbIHNlcXVlbmNlLmpvaW4gJChkZXZpY2UpICQoZGlyKSAkKGZpbGUpIF0gOworCisgICAgcmV0dXJuICQobmF0aXZlKSA7Cit9CisKKyMgUmVtb3ZlIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbgorSU1QT1JUICQoX19uYW1lX18pIDogbWFrZS0kKG9zKSBuYXRpdmUtJChvcykgOiAkKF9fbmFtZV9fKSA6IG1ha2UgbmF0aXZlIDsKK0VYUE9SVCAkKF9fbmFtZV9fKSA6IG1ha2UgbmF0aXZlIDsKKworcnVsZSBfX3Rlc3RfXyAoICkKK3sKKyAgICBpbXBvcnQgYXNzZXJ0IDsKKyAgICBpbXBvcnQgZXJyb3JzIDogdHJ5IGNhdGNoIDsKKworICAgIGFzc2VydC50cnVlIGlzLXJvb3RlZCAiLyIgOworICAgIGFzc2VydC50cnVlIGlzLXJvb3RlZCAiL2ZvbyIgOworICAgIGFzc2VydC50cnVlIGlzLXJvb3RlZCAiL2Zvby9iYXIiIDsKKyAgICBhc3NlcnQucmVzdWx0IDogaXMtcm9vdGVkICIuIiA7CisgICAgYXNzZXJ0LnJlc3VsdCA6IGlzLXJvb3RlZCAiZm9vIiA7CisgICAgYXNzZXJ0LnJlc3VsdCA6IGlzLXJvb3RlZCAiZm9vL2JhciIgOworCisgICAgYXNzZXJ0LnRydWUgaGFzLXBhcmVudCAiZm9vIiA7CisgICAgYXNzZXJ0LnRydWUgaGFzLXBhcmVudCAiZm9vL2JhciIgOworICAgIGFzc2VydC50cnVlIGhhcy1wYXJlbnQgIi4iIDsKKyAgICBhc3NlcnQucmVzdWx0IDogaGFzLXBhcmVudCAiLyIgOworCisgICAgYXNzZXJ0LnJlc3VsdCAiLiIgOiBiYXNlbmFtZSAiLiIgOworICAgIGFzc2VydC5yZXN1bHQgIi4uIiA6IGJhc2VuYW1lICIuLiIgOworICAgIGFzc2VydC5yZXN1bHQgImZvbyIgOiBiYXNlbmFtZSAiZm9vIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZm9vIiA6IGJhc2VuYW1lICJiYXIvZm9vIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZm9vIiA6IGJhc2VuYW1lICJnYXovYmFyL2ZvbyIgOworICAgIGFzc2VydC5yZXN1bHQgImZvbyIgOiBiYXNlbmFtZSAiL2dhei9iYXIvZm9vIiA7CisKKyAgICBhc3NlcnQucmVzdWx0ICIuIiA6IHBhcmVudCAiZm9vIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiLyIgOiBwYXJlbnQgIi9mb28iIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28vYmFyIiA6IHBhcmVudCAiZm9vL2Jhci9naXoiIDsKKyAgICBhc3NlcnQucmVzdWx0ICIuLiIgOiBwYXJlbnQgIi4iIDsKKyAgICBhc3NlcnQucmVzdWx0ICIuLiIgOiBwYXJlbnQgIi4uL2ZvbyIgOworICAgIGFzc2VydC5yZXN1bHQgIi4uLy4uL2ZvbyIgOiBwYXJlbnQgIi4uLy4uL2Zvby9iYXIiIDsKKworICAgIGFzc2VydC5yZXN1bHQgIi4iIDogcmV2ZXJzZSAiLiIgOworICAgIGFzc2VydC5yZXN1bHQgIi4uIiA6IHJldmVyc2UgImZvbyIgOworICAgIGFzc2VydC5yZXN1bHQgIi4uLy4uLy4uIiA6IHJldmVyc2UgImZvby9iYXIvZ2l6IiA7CisKKyAgICBhc3NlcnQucmVzdWx0ICJmb28iIDogam9pbiAiZm9vIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiL2ZvbyIgOiBqb2luICIvIiAiZm9vIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZm9vL2JhciIgOiBqb2luICJmb28iICJiYXIiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28vYmFyIiA6IGpvaW4gImZvby9naXoiICIuLi9iYXIiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28vZ2l6IiA6IGpvaW4gImZvby9iYXIvYmF6IiAiLi4vLi4vZ2l6IiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiLi4iIDogam9pbiAiLiIgIi4uIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiLi4iIDogam9pbiAiZm9vIiAiLi4vLi4iIDsKKyAgICBhc3NlcnQucmVzdWx0ICIuLi8uLiIgOiBqb2luICIuLi9mb28iICIuLi8uLiIgOworICAgIGFzc2VydC5yZXN1bHQgIi9mb28iIDogam9pbiAiL2JhciIgIi4uL2ZvbyIgOworICAgIGFzc2VydC5yZXN1bHQgImZvby9naXoiIDogam9pbiAiZm9vL2dpeiIgIi4iIDsKKyAgICBhc3NlcnQucmVzdWx0ICIuIiA6IGpvaW4gbGliMiAiLi4iIDsKKyAgICBhc3NlcnQucmVzdWx0ICIvIiA6IGpvaW4gIi9hIiAiLi4iIDsKKworICAgIGFzc2VydC5yZXN1bHQgL2EvYiA6IGpvaW4gL2EvYi9jIC4uIDsKKworICAgIGFzc2VydC5yZXN1bHQgImZvby9iYXIvZ2l6IiA6IGpvaW4gImZvbyIgImJhciIgImdpeiIgOworICAgIGFzc2VydC5yZXN1bHQgImdpeiIgOiBqb2luICJmb28iICIuLiIgImdpeiIgOworICAgIGFzc2VydC5yZXN1bHQgImZvby9naXoiIDogam9pbiAiZm9vIiAiLiIgImdpeiIgOworCisgICAgdHJ5IDsKKyAgICB7CisgICAgICAgIGpvaW4gImEiICIvYiIgOworICAgIH0KKyAgICBjYXRjaCBvbmx5IGZpcnN0IGVsZW1lbnQgbWF5IGJlIHJvb3RlZCA7CisKKyAgICBsb2NhbCBDV0QgPSAiL2hvbWUvZ2hvc3QvYnVpbGQiIDsKKyAgICBhc3NlcnQucmVzdWx0IDogYWxsLXBhcmVudHMgLiA6IC4gOiAkKENXRCkgOworICAgIGFzc2VydC5yZXN1bHQgLiAuLiAuLi8uLiAuLi8uLi8uLiAgOiBhbGwtcGFyZW50cyAiSmFtZmlsZSIgOiAiIiA6ICQoQ1dEKSA7CisgICAgYXNzZXJ0LnJlc3VsdCBmb28gLiAuLiAuLi8uLiAuLi8uLi8uLiA6IGFsbC1wYXJlbnRzICJmb28vSmFtZmlsZSIgOiAiIiA6CisgICAgICAgICQoQ1dEKSA7CisgICAgYXNzZXJ0LnJlc3VsdCAuLi9Xb3JrIC4uIC4uLy4uIC4uLy4uLy4uIDogYWxsLXBhcmVudHMgIi4uL1dvcmsvSmFtZmlsZSIgOiAiIgorICAgICAgICA6ICQoQ1dEKSA7CisKKyAgICBsb2NhbCBDV0QgPSAiL2hvbWUvZ2hvc3QiIDsKKyAgICBhc3NlcnQucmVzdWx0IC4gLi4gOiBhbGwtcGFyZW50cyAiSmFtZmlsZSIgOiAiL2hvbWUiIDogJChDV0QpIDsKKyAgICBhc3NlcnQucmVzdWx0IC4gOiBhbGwtcGFyZW50cyAiSmFtZmlsZSIgOiAiL2hvbWUvZ2hvc3QiIDogJChDV0QpIDsKKworICAgIGFzc2VydC5yZXN1bHQgImMvZCIgOiByZWxhdGl2ZSAiYS9iL2MvZCIgImEvYiIgOworICAgIGFzc2VydC5yZXN1bHQgImZvbyIgOiByZWxhdGl2ZSAiZm9vIiAiLiIgOworCisgICAgbG9jYWwgc2F2ZS1vcyA9IFsgbW9kdWxlcy5wZWVrIHBhdGggOiBvcyBdIDsKKyAgICBtb2R1bGVzLnBva2UgcGF0aCA6IG9zIDogTlQgOworCisgICAgYXNzZXJ0LnJlc3VsdCAiZm9vL2Jhci9naXoiIDogbWFrZS1OVCAiZm9vL2Jhci9naXoiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28vYmFyL2dpeiIgOiBtYWtlLU5UICJmb29cXGJhclxcZ2l6IiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZm9vIiA6IG1ha2UtTlQgImZvby8iIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28iIDogbWFrZS1OVCAiZm9vXFwiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28iIDogbWFrZS1OVCAiZm9vLy4iIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28iIDogbWFrZS1OVCAiZm9vL2Jhci8uLiIgOworICAgIGFzc2VydC5yZXN1bHQgImZvbyIgOiBtYWtlLU5UICJmb28vYmFyLy4uLyIgOworICAgIGFzc2VydC5yZXN1bHQgImZvbyIgOiBtYWtlLU5UICJmb28vYmFyLy4uXFwiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28vYmFyIiA6IG1ha2UtTlQgImZvby8uLy4vLi8uL2JhciIgOworICAgIGFzc2VydC5yZXN1bHQgIi9mb28iIDogbWFrZS1OVCAiXFxmb28iIDsKKyAgICBhc3NlcnQucmVzdWx0ICIvRDovTXkgRG9jdW1lbnRzIiA6IG1ha2UtTlQgIkQ6XFxNeSBEb2N1bWVudHMiIDsKKyAgICBhc3NlcnQucmVzdWx0ICIvYzovYm9vc3QvdG9vbHMvYnVpbGQvbmV3L3Byb2plY3QuamFtIiA6IG1ha2UtTlQKKyAgICAgICAgImM6XFxib29zdFxcdG9vbHNcXGJ1aWxkXFx0ZXN0XFwuLlxcbmV3XFxwcm9qZWN0LmphbSIgOworCisgICAgIyBUZXN0IHByb2Nlc3NpbmcgJ2ludmFsaWQnIHBhdGhzIGNvbnRhaW5pbmcgbXVsdGlwbGUgc3VjY2Vzc2l2ZSBwYXRoCisgICAgIyBzZXBhcmF0b3JzLgorICAgIGFzc2VydC5yZXN1bHQgImZvbyIgOiBtYWtlLU5UICJmb28vLyIgOworICAgIGFzc2VydC5yZXN1bHQgImZvbyIgOiBtYWtlLU5UICJmb28vLy8iIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28iIDogbWFrZS1OVCAiZm9vXFxcXCIgOworICAgIGFzc2VydC5yZXN1bHQgImZvbyIgOiBtYWtlLU5UICJmb29cXFxcXFwiIDsKKyAgICBhc3NlcnQucmVzdWx0ICIvZm9vIiA6IG1ha2UtTlQgIi8vZm9vIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiL2ZvbyIgOiBtYWtlLU5UICIvLy9mb28iIDsKKyAgICBhc3NlcnQucmVzdWx0ICIvZm9vIiA6IG1ha2UtTlQgIlxcXFxmb28iIDsKKyAgICBhc3NlcnQucmVzdWx0ICIvZm9vIiA6IG1ha2UtTlQgIlxcXFxcXGZvbyIgOworICAgIGFzc2VydC5yZXN1bHQgIi9mb28iIDogbWFrZS1OVCAiXFwvXFwvZm9vIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZm9vL2JhciIgOiBtYWtlLU5UICJmb28vL1xcLy9cXFxcYmFyLy9cXC8vXFxcXFxcLy9cXC8vXFxcXCIgOworICAgIGFzc2VydC5yZXN1bHQgImZvbyIgOiBtYWtlLU5UICJmb28vYmFyLy8uLiIgOworICAgIGFzc2VydC5yZXN1bHQgImZvby9iYXIiIDogbWFrZS1OVCAiZm9vL2Jhci9naXovLy4uIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZm9vL2dpeiIgOiBtYWtlLU5UCisgICAgICAgICJmb28vL1xcLy9cXFxcYmFyLy8vXFxcXC8vXFxcXC8vLy9cXC8uLi8vL2dpelxcLy9cXFxcXFwvL1xcLy9cXFxcIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiLi4vLi4vLi4vZm9vIiA6IG1ha2UtTlQgIi4uLy8vLi8vLi4vLy8uLy8uLi8vLy9mb28vLy8iIDsKKworICAgICMgVGVzdCBwcm9jZXNzaW5nICdpbnZhbGlkJyByb290ZWQgcGF0aHMgd2l0aCB0b28gbWFueSAnLi4nIHBhdGggZWxlbWVudHMKKyAgICAjIHRoYXQgd291bGQgcGxhY2UgdGhlbSBiZWZvcmUgdGhlIHJvb3QuCisgICAgYXNzZXJ0LnJlc3VsdCA6IG1ha2UtTlQgIi8uLiIgOworICAgIGFzc2VydC5yZXN1bHQgOiBtYWtlLU5UICIvLi4vIiA7CisgICAgYXNzZXJ0LnJlc3VsdCA6IG1ha2UtTlQgIi8uLi8uIiA7CisgICAgYXNzZXJ0LnJlc3VsdCA6IG1ha2UtTlQgIi8uLi8uLyIgOworICAgIGFzc2VydC5yZXN1bHQgOiBtYWtlLU5UICIvZm9vLy4uL2Jhci9naXovLi4vLi8uLy4vLi4vLi4vLiIgOworICAgIGFzc2VydC5yZXN1bHQgOiBtYWtlLU5UICIvZm9vLy4uL2Jhci9naXovLi4vLi8uLy4vLi4vLi4vLi8iIDsKKyAgICBhc3NlcnQucmVzdWx0IDogbWFrZS1OVCAiLy9mb28vLi4vYmFyL2dpei8uLi8uLy4vLi8uLi8uLi8uIiA7CisgICAgYXNzZXJ0LnJlc3VsdCA6IG1ha2UtTlQgIi8vZm9vLy4uL2Jhci9naXovLi4vLi8uLy4vLi4vLi4vLi8iIDsKKyAgICBhc3NlcnQucmVzdWx0IDogbWFrZS1OVCAiXFxcXGZvby8uLi9iYXIvZ2l6Ly4uLy4vLi8uLy4uLy4uLy4iIDsKKyAgICBhc3NlcnQucmVzdWx0IDogbWFrZS1OVCAiXFxcXGZvby8uLi9iYXIvZ2l6Ly4uLy4vLi8uLy4uLy4uLy4vIiA7CisgICAgYXNzZXJ0LnJlc3VsdCA6IG1ha2UtTlQgIi8uLi8vLy4vLy4uLy8vLi8vLi4vLy8vZm9vLy8vIiA7CisKKyAgICBhc3NlcnQucmVzdWx0ICJmb29cXGJhclxcZ2l6IiA6IG5hdGl2ZS1OVCAiZm9vL2Jhci9naXoiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28iIDogbmF0aXZlLU5UICJmb28iIDsKKyAgICBhc3NlcnQucmVzdWx0ICJcXGZvbyIgOiBuYXRpdmUtTlQgIi9mb28iIDsKKyAgICBhc3NlcnQucmVzdWx0ICJEOlxcTXkgRG9jdW1lbnRzXFxXb3JrIiA6IG5hdGl2ZS1OVCAiL0Q6L015IERvY3VtZW50cy9Xb3JrIiA7CisKKyAgICBtb2R1bGVzLnBva2UgcGF0aCA6IG9zIDogVU5JWCA7CisKKyAgICBhc3NlcnQucmVzdWx0ICJmb28vYmFyL2dpeiIgOiBtYWtlLVVOSVggImZvby9iYXIvZ2l6IiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiL3N1YjEiIDogbWFrZS1VTklYICIvc3ViMS8uIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiL3N1YjEiIDogbWFrZS1VTklYICIvc3ViMS9zdWIyLy4uIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAic3ViMSIgOiBtYWtlLVVOSVggInN1YjEvLiIgOworICAgIGFzc2VydC5yZXN1bHQgInN1YjEiIDogbWFrZS1VTklYICJzdWIxL3N1YjIvLi4iIDsKKyAgICBhc3NlcnQucmVzdWx0ICIvZm9vL2JhciIgOiBuYXRpdmUtVU5JWCAiL2Zvby9iYXIiIDsKKworICAgIG1vZHVsZXMucG9rZSBwYXRoIDogb3MgOiBWTVMgOworCisgICAgIworICAgICMgRG8gbm90IHJlYWxseSBuZWVkIHRvIHBva2Ugb3MgYmVmb3JlIHRoZXNlCisgICAgIworICAgIGFzc2VydC5yZXN1bHQgImRpc2s6IiAiW2Rpcl0iICAiZmlsZSIgOiBzcGxpdC1wYXRoLVZNUyAiZGlzazpbZGlyXWZpbGUiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJkaXNrOiIgIltkaXJdIiAgIiIgICAgIDogc3BsaXQtcGF0aC1WTVMgImRpc2s6W2Rpcl0iIDsKKyAgICBhc3NlcnQucmVzdWx0ICJkaXNrOiIgIiIgICAgICAgIiIgICAgIDogc3BsaXQtcGF0aC1WTVMgImRpc2s6IiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZGlzazoiICIiICAgICAgICJmaWxlIiA6IHNwbGl0LXBhdGgtVk1TICJkaXNrOmZpbGUiIDsKKyAgICBhc3NlcnQucmVzdWx0ICIiICAgICAgIltkaXJdIiAgImZpbGUiIDogc3BsaXQtcGF0aC1WTVMgIltkaXJdZmlsZSIgOworICAgIGFzc2VydC5yZXN1bHQgIiIgICAgICAiW2Rpcl0iICAiIiAgICAgOiBzcGxpdC1wYXRoLVZNUyAiW2Rpcl0iIDsKKyAgICBhc3NlcnQucmVzdWx0ICIiICAgICAgIiIgICAgICAgImZpbGUiIDogc3BsaXQtcGF0aC1WTVMgImZpbGUiIDsKKyAgICBhc3NlcnQucmVzdWx0ICIiICAgICAgIiIgICAgICAgIiIgICAgIDogc3BsaXQtcGF0aC1WTVMgIiIgOworCisgICAgIworICAgICMgU3BlY2lhbCBjYXNlOiBjdXJyZW50IGRpcmVjdG9yeQorICAgICMKKyAgICBhc3NlcnQucmVzdWx0ICIiICAgICAgIltdIiAgICAgIiIgICAgIDogc3BsaXQtcGF0aC1WTVMgIltdIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZGlzazoiICJbXSIgICAgICIiICAgICA6IHNwbGl0LXBhdGgtVk1TICJkaXNrOltdIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiIiAgICAgICJbXSIgICAgICJmaWxlIiA6IHNwbGl0LXBhdGgtVk1TICJbXWZpbGUiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJkaXNrOiIgIltdIiAgICAgImZpbGUiIDogc3BsaXQtcGF0aC1WTVMgImRpc2s6W11maWxlIiA7CisKKyAgICAjCisgICAgIyBNYWtlIHBvcnRhYmxlIHBhdGhzCisgICAgIworICAgIGFzc2VydC5yZXN1bHQgIi9kaXNrOiIgOiBtYWtlLVZNUyAiZGlzazoiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28vYmFyL2dpeiIgOiBtYWtlLVZNUyAiWy5mb28uYmFyLmdpel0iIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28iIDogbWFrZS1WTVMgIlsuZm9vXSIgOworICAgIGFzc2VydC5yZXN1bHQgImZvbyIgOiBtYWtlLVZNUyAiWy5mb28uYmFyLi1dIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiLi4iIDogbWFrZS1WTVMgIlsuLV0iIDsKKyAgICBhc3NlcnQucmVzdWx0ICIuLiIgOiBtYWtlLVZNUyAiWy1dIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiLiIgOiBtYWtlLVZNUyAiW10iIDsKKyAgICBhc3NlcnQucmVzdWx0ICJnaXouaCIgOiBtYWtlLVZNUyAiZ2l6LmgiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJmb28vYmFyL2dpei5oIiA6IG1ha2UtVk1TICJbLmZvby5iYXJdZ2l6LmgiIDsKKyAgICBhc3NlcnQucmVzdWx0ICIvZGlzazovbXlfZG9jcyIgOiBtYWtlLVZNUyAiZGlzazpbbXlfZG9jc10iIDsKKyAgICBhc3NlcnQucmVzdWx0ICIvZGlzazovYm9vc3QvdG9vbHMvYnVpbGQvbmV3L3Byb2plY3QuamFtIiA6IG1ha2UtVk1TCisgICAgICAgICJkaXNrOltib29zdC50b29scy5idWlsZC50ZXN0Li0ubmV3XXByb2plY3QuamFtIiA7CisKKyAgICAjCisgICAgIyBTcGVjaWFsIGNhc2UgKGFkZHMgJy4nIHRvIGVuZCBvZiBmaWxlIHcvbyBleHRlbnNpb24gdG8gZGlzYW1iaWd1YXRlIGZyb20KKyAgICAjIGRpcmVjdG9yeSBpbiBwb3J0YWJsZSBwYXRoIHNwZWMpCisgICAgIworICAgIGFzc2VydC5yZXN1bHQgIkphbWZpbGUuIiA6IG1ha2UtVk1TICJKYW1maWxlIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZGlyL0phbWZpbGUuIiA6IG1ha2UtVk1TICJbLmRpcl1KYW1maWxlIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiL2Rpc2s6L2Rpci9KYW1maWxlLiIgOiBtYWtlLVZNUyAiZGlzazpbZGlyXUphbWZpbGUiIDsKKworICAgICMKKyAgICAjIE1ha2UgbmF0aXZlIHBhdGhzCisgICAgIworICAgIGFzc2VydC5yZXN1bHQgImRpc2s6IiA6IG5hdGl2ZS1WTVMgIi9kaXNrOiIgOworICAgIGFzc2VydC5yZXN1bHQgIlsuZm9vLmJhci5naXpdIiA6IG5hdGl2ZS1WTVMgImZvby9iYXIvZ2l6IiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiWy5mb29dIiA6IG5hdGl2ZS1WTVMgImZvbyIgOworICAgIGFzc2VydC5yZXN1bHQgIlsuLV0iIDogbmF0aXZlLVZNUyAiLi4iIDsKKyAgICBhc3NlcnQucmVzdWx0ICJbLmZvby4tXSIgOiBuYXRpdmUtVk1TICJmb28vLi4iIDsKKyAgICBhc3NlcnQucmVzdWx0ICJbXSIgOiBuYXRpdmUtVk1TICIuIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZGlzazpbbXlfZG9jcy53b3JrXSIgOiBuYXRpdmUtVk1TICIvZGlzazovbXlfZG9jcy93b3JrIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZ2l6LmgiIDogbmF0aXZlLVZNUyAiZ2l6LmgiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJkaXNrOkphbWZpbGUuIiA6IG5hdGl2ZS1WTVMgIi9kaXNrOkphbWZpbGUuIiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiZGlzazpbbXlfZG9jcy53b3JrXUphbWZpbGUuIiA6IG5hdGl2ZS1WTVMKKyAgICAgICAgIi9kaXNrOi9teV9kb2NzL3dvcmsvSmFtZmlsZS4iIDsKKworICAgIG1vZHVsZXMucG9rZSBwYXRoIDogb3MgOiAkKHNhdmUtb3MpIDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9wcmludC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvcHJpbnQuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NjdlNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvcHJpbnQuamFtCkBAIC0wLDAgKzEsNDg4IEBACisjIENvcHlyaWdodCAyMDAzIERvdWdsYXMgR3JlZ29yCisjIENvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDA1IFJlbmUgUml2ZXJhCisjIENvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFZsYWRpbWlyIFBydXMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgVXRpbGl0aWVzIGZvciBnZW5lcmF0aW5nIGZvcm1hdCBpbmRlcGVuZGVudCBvdXRwdXQuIFVzaW5nIHRoZXNlCisjIHdpbGwgaGVscCBpbiBnZW5lcmF0aW9uIG9mIGRvY3VtZW50YXRpb24gaW4gYXQgbWluaW11bSBwbGFpbi9jb25zb2xlCisjIGFuZCBodG1sLgorCitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgbnVtYmVycyA7CitpbXBvcnQgc3RyaW5nIDsKK2ltcG9ydCByZWdleCA7CitpbXBvcnQgImNsYXNzIiA7CitpbXBvcnQgc2Nhbm5lciA7CitpbXBvcnQgcGF0aCA7CisKKyMgVGhlIGN1cnJlbnQgb3V0cHV0IHRhcmdldC4gRGVmYXVsdHMgdG8gY29uc29sZS4KK291dHB1dC10YXJnZXQgPSBjb25zb2xlIDsKKworIyBUaGUgY3VycmVudCBvdXRwdXQgdHlwZS4gRGVmYXVsdHMgdG8gcGxhaW4uIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgImh0bWwiLgorb3V0cHV0LXR5cGUgPSBwbGFpbiA7CisKKyMgV2hpdGVzcGFjZS4KKy53aGl0ZXNwYWNlID0gWyBzdHJpbmcud2hpdGVzcGFjZSBdIDsKKworCisjIFNldCB0aGUgdGFyZ2V0IGFuZCB0eXBlIG9mIG91dHB1dCB0byBnZW5lcmF0ZS4gVGhpcyBzZXRzIGJvdGggdGhlIGRlc3RpbmF0aW9uCisjIG91dHB1dCBhbmQgdGhlIHR5cGUgb2YgZG9jcyB0byBnZW5lcmF0ZSB0byB0aGF0IG91dHB1dC4gVGhlIHRhcmdldCBjYW4gYmUKKyMgZWl0aGVyIGEgZmlsZSBvciAiY29uc29sZSIgZm9yIGVjaG9pbmcgdG8gdGhlIGNvbnNvbGUuIElmIHRoZSB0eXBlIG9mIG91dHB1dAorIyBpcyBub3Qgc3BlY2lmaWVkIGl0IGRlZmF1bHRzIHRvIHBsYWluIHRleHQuCisjCitydWxlIG91dHB1dCAoCisgICAgdGFyZ2V0ICAjIFRoZSB0YXJnZXQgZmlsZSBvciBkZXZpY2U7IGZpbGUgb3IgImNvbnNvbGUiLgorICAgIHR5cGUgPyAgIyBUaGUgdHlwZSBvZiBvdXRwdXQ7ICJwbGFpbiIgb3IgImh0bWwiLgorKQoreworICAgIHR5cGUgPz0gcGxhaW4gOworICAgIGlmICQob3V0cHV0LXRhcmdldCkgIT0gJCh0YXJnZXQpCisgICAgeworICAgICAgICBvdXRwdXQtdGFyZ2V0ID0gJCh0YXJnZXQpIDsKKyAgICAgICAgb3V0cHV0LXR5cGUgPSAkKHR5cGUpIDsKKyAgICAgICAgaWYgJChvdXRwdXQtdHlwZSkgPSBodG1sCisgICAgICAgIHsKKyAgICAgICAgICAgIHRleHQKKyAgICAgICAgICAgICAgICAiPCFET0NUWVBFIGh0bWwgUFVCTElDIFwiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU5cIj4iCisgICAgICAgICAgICAgICAgIjxodG1sPiIKKyAgICAgICAgICAgICAgICAiPGhlYWQ+IgorICAgICAgICAgICAgICAgICI8L2hlYWQ+IgorICAgICAgICAgICAgICAgICI8Ym9keSBsaW5rPVwiIzAwMDBmZlwiIHZsaW5rPVwiIzgwMDA4MFwiPiIKKyAgICAgICAgICAgICAgICA6IHRydWUKKyAgICAgICAgICAgICAgICA6IHByZWZpeCA7CisgICAgICAgICAgICB0ZXh0CisgICAgICAgICAgICAgICAgIjwvYm9keT4iCisgICAgICAgICAgICAgICAgIjwvaHRtbD4iCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIDogc3VmZml4IDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIEdlbmVyYXRlIGEgc2VjdGlvbiB3aXRoIGEgZGVzY3JpcHRpb24uIFRoZSB0eXBlIG9mIG91dHB1dCBjYW4gYmUgY29udHJvbGxlZCBieQorIyB0aGUgdmFsdWUgb2YgdGhlICdvdXRwdXQtdHlwZScgdmFyaWFibGUuCisjCitydWxlIHNlY3Rpb24gKAorICAgIG5hbWUgICMgVGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24uCisgICAgZGVzY3JpcHRpb24gKiAgIyBBIG51bWJlciBvZiBkZXNjcmlwdGlvbiBsaW5lcy4KKykKK3sKKyAgICBpZiAkKG91dHB1dC10eXBlKSA9IHBsYWluCisgICAgeworICAgICAgICBsaW5lcyBbIHNwbGl0LWF0LXdvcmRzICQobmFtZSk6IF0gOworICAgICAgICBsaW5lcyA7CisgICAgfQorICAgIGVsc2UgaWYgJChvdXRwdXQtdHlwZSkgPSBodG1sCisgICAgeworICAgICAgICBuYW1lID0gWyBlc2NhcGUtaHRtbCAkKG5hbWUpIF0gOworICAgICAgICB0ZXh0IDxoMz4kKG5hbWUpPC9oMz4gPHA+IDsKKyAgICB9CisgICAgbG9jYWwgcHJlID0gOworICAgIHdoaWxlICQoZGVzY3JpcHRpb24pCisgICAgeworICAgICAgICBsb2NhbCBwYXJhZ3JhcGggPSA7CisgICAgICAgIHdoaWxlICQoZGVzY3JpcHRpb24pICYmIFsgc3RyaW5nLmlzLXdoaXRlc3BhY2UgJChkZXNjcmlwdGlvblsxXSkgXSB7IGRlc2NyaXB0aW9uID0gJChkZXNjcmlwdGlvblsyLV0pIDsgfQorICAgICAgICBpZiAkKHByZSkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgJChkZXNjcmlwdGlvbikgJiYgKAorICAgICAgICAgICAgICAgICQocHJlKSA9ICIgJChkZXNjcmlwdGlvblsxXSkiIHx8CisgICAgICAgICAgICAgICAgKCAkKHByZSkgPCBbIHN0cmluZy5jaGFycyBbIE1BVENIICJeKFskKC53aGl0ZXNwYWNlKV0qKSIgOiAiICQoZGVzY3JpcHRpb25bMV0pIiBdIF0gKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB7IHBhcmFncmFwaCArPSAkKGRlc2NyaXB0aW9uWzFdKSA7IGRlc2NyaXB0aW9uID0gJChkZXNjcmlwdGlvblsyLV0pIDsgfQorICAgICAgICAgICAgd2hpbGUgWyBzdHJpbmcuaXMtd2hpdGVzcGFjZSAkKHBhcmFncmFwaFstMV0pIF0geyBwYXJhZ3JhcGggPSAkKHBhcmFncmFwaFsxLS0yXSkgOyB9CisgICAgICAgICAgICBwcmUgPSA7CisgICAgICAgICAgICBpZiAkKG91dHB1dC10eXBlKSA9IHBsYWluCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGluZXMgJChwYXJhZ3JhcGgpICIiIDogIiAgIiAiICAiIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgJChvdXRwdXQtdHlwZSkgPSBodG1sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGV4dCA8YmxvY2txdW90ZT4gOworICAgICAgICAgICAgICAgIGxpbmVzICQocGFyYWdyYXBoKSA7CisgICAgICAgICAgICAgICAgdGV4dCA8L2Jsb2NrcXVvdGU+IDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICQoZGVzY3JpcHRpb24pICYmICEgWyBzdHJpbmcuaXMtd2hpdGVzcGFjZSAkKGRlc2NyaXB0aW9uWzFdKSBdCisgICAgICAgICAgICAgICAgeyBwYXJhZ3JhcGggKz0gJChkZXNjcmlwdGlvblsxXSkgOyBkZXNjcmlwdGlvbiA9ICQoZGVzY3JpcHRpb25bMi1dKSA7IH0KKyAgICAgICAgICAgIGlmICQocGFyYWdyYXBoWzFdKSA9IDo6ICYmICEgJChwYXJhZ3JhcGhbMl0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJlID0gIiAiIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICQocGFyYWdyYXBoWzFdKSA9IDo6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgJChvdXRwdXQtdHlwZSkgPSBwbGFpbgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZXMgJChwYXJhZ3JhcGhbMi1dKSAiIiA6ICIgICIgIiAgIiA7CisgICAgICAgICAgICAgICAgICAgIGxpbmVzIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAkKG91dHB1dC10eXBlKSA9IGh0bWwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRleHQgPGJsb2NrcXVvdGU+IDsKKyAgICAgICAgICAgICAgICAgICAgbGluZXMgJChwYXJhZ3JhcGhbMi1dKSA7CisgICAgICAgICAgICAgICAgICAgIHRleHQgPC9ibG9ja3F1b3RlPiA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsIHAgPSBbIE1BVENIICIoLiopKDo6KSQiIDogJChwYXJhZ3JhcGhbLTFdKSBdIDsKKyAgICAgICAgICAgICAgICBsb2NhbCBwd3MgPSBbIE1BVENIICIoWyAJXSopJCIgOiAkKHBbMV0pIF0gOworICAgICAgICAgICAgICAgIHAgPSBbIE1BVENIICIoLiopKCQocHdzKSkoJChwWzJdKSkkIiA6ICAkKHBhcmFncmFwaFstMV0pIF0gOworICAgICAgICAgICAgICAgIGlmICQocFszXSkgPSA6OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlID0gWyBzdHJpbmcuY2hhcnMgWyBNQVRDSCAiXihbJCgud2hpdGVzcGFjZSldKikiIDogIiAkKHBbMV0pIiBdIF0gOworICAgICAgICAgICAgICAgICAgICBpZiAhICQocFsyXSkgfHwgJChwWzJdKSA9ICIiIHsgcGFyYWdyYXBoID0gJChwYXJhZ3JhcGhbMS0tMl0pICQocFsxXSk6IDsgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgcGFyYWdyYXBoID0gJChwYXJhZ3JhcGhbMS0tMl0pICQocFsxXSkgOyB9CisgICAgICAgICAgICAgICAgICAgIGlmICQob3V0cHV0LXR5cGUpID0gcGxhaW4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMgWyBzcGxpdC1hdC13b3JkcyAiICIgJChwYXJhZ3JhcGgpIF0gOiAiICAiICIgICIgOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgJChvdXRwdXQtdHlwZSkgPSBodG1sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPC9wPiA8cD4gWyBlc2NhcGUtaHRtbCAkKHBhcmFncmFwaCkgXSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgJChvdXRwdXQtdHlwZSkgPSBwbGFpbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcyBbIHNwbGl0LWF0LXdvcmRzICIgIiAkKHBhcmFncmFwaCkgXSA6ICIgICIgIiAgIiA7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcyA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAkKG91dHB1dC10eXBlKSA9IGh0bWwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA8L3A+IDxwPiBbIGVzY2FwZS1odG1sICQocGFyYWdyYXBoKSBdIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAkKG91dHB1dC10eXBlKSA9IGh0bWwKKyAgICB7CisgICAgICAgIHRleHQgPC9wPiA7CisgICAgfQorfQorCisKKyMgR2VuZXJhdGUgdGhlIHN0YXJ0IG9mIGEgbGlzdCBvZiBpdGVtcy4gVGhlIHR5cGUgb2Ygb3V0cHV0IGNhbiBiZSBjb250cm9sbGVkIGJ5CisjIHRoZSB2YWx1ZSBvZiB0aGUgJ291dHB1dC10eXBlJyB2YXJpYWJsZS4KKyMKK3J1bGUgbGlzdC1zdGFydCAoICkKK3sKKyAgICBpZiAkKG91dHB1dC10eXBlKSA9IHBsYWluCisgICAgeworICAgIH0KKyAgICBlbHNlIGlmICQob3V0cHV0LXR5cGUpID0gaHRtbAorICAgIHsKKyAgICAgICAgdGV4dCA8dWw+IDsKKyAgICB9Cit9CisKKworIyBHZW5lcmF0ZSBhbiBpdGVtIGluIGEgbGlzdC4gVGhlIHR5cGUgb2Ygb3V0cHV0IGNhbiBiZSBjb250cm9sbGVkIGJ5IHRoZSB2YWx1ZQorIyBvZiB0aGUgJ291dHB1dC10eXBlJyB2YXJpYWJsZS4KKyMKK3J1bGUgbGlzdC1pdGVtICgKKyAgICBpdGVtICsgICMgVGhlIGl0ZW0gdG8gbGlzdC4KKykKK3sKKyAgICBpZiAkKG91dHB1dC10eXBlKSA9IHBsYWluCisgICAgeworICAgICAgICBsaW5lcyBbIHNwbGl0LWF0LXdvcmRzICIqIiAkKGl0ZW0pIF0gOiAiICAgICIgIiAgIiA7CisgICAgfQorICAgIGVsc2UgaWYgJChvdXRwdXQtdHlwZSkgPSBodG1sCisgICAgeworICAgICAgICB0ZXh0IDxsaT4gWyBlc2NhcGUtaHRtbCAkKGl0ZW0pIF0gPC9saT4gOworICAgIH0KK30KKworCisjIEdlbmVyYXRlIHRoZSBlbmQgb2YgYSBsaXN0IG9mIGl0ZW1zLiBUaGUgdHlwZSBvZiBvdXRwdXQgY2FuIGJlIGNvbnRyb2xsZWQgYnkKKyMgdGhlIHZhbHVlIG9mIHRoZSAnb3V0cHV0LXR5cGUnIHZhcmlhYmxlLgorIworcnVsZSBsaXN0LWVuZCAoICkKK3sKKyAgICBpZiAkKG91dHB1dC10eXBlKSA9IHBsYWluCisgICAgeworICAgICAgICBsaW5lcyA7CisgICAgfQorICAgIGVsc2UgaWYgJChvdXRwdXQtdHlwZSkgPSBodG1sCisgICAgeworICAgICAgICB0ZXh0IDwvdWw+IDsKKyAgICB9Cit9CisKKworIyBTcGxpdCB0aGUgZ2l2ZW4gdGV4dCBpbnRvIHNlcGFyYXRlIGxpbmVzLCB3b3JkLXdyYXBwaW5nIHRvIGEgbWFyZ2luLiBUaGUKKyMgZGVmYXVsdCBtYXJnaW4gaXMgNzggY2hhcmFjdGVycy4KKyMKK3J1bGUgc3BsaXQtYXQtd29yZHMgKAorICAgIHRleHQgKyAgIyBUaGUgdGV4dCB0byBzcGxpdC4KKyAgICA6IG1hcmdpbiA/ICAjIEFuIG9wdGlvbmFsIG1hcmdpbiwgZGVmYXVsdCBpcyA3OC4KKykKK3sKKyAgICBsb2NhbCBsaW5lcyA9IDsKKyAgICB0ZXh0ID0gWyBzdHJpbmcud29yZHMgJCh0ZXh0Oko9IiAiKSBdIDsKKyAgICB0ZXh0ID0gJCh0ZXh0Oko9IiAiKSA7CisgICAgbWFyZ2luID89IDc4IDsKKyAgICBsb2NhbCBjaGFyLW1hdGNoLTEgPSAiLj8iIDsKKyAgICBsb2NhbCBjaGFyLW1hdGNoID0gIiIgOworICAgIHdoaWxlICQobWFyZ2luKSAhPSAwCisgICAgeworICAgICAgICBjaGFyLW1hdGNoID0gJChjaGFyLW1hdGNoKSQoY2hhci1tYXRjaC0xKSA7CisgICAgICAgIG1hcmdpbiA9IFsgbnVtYmVycy5kZWNyZW1lbnQgJChtYXJnaW4pIF0gOworICAgIH0KKyAgICB3aGlsZSAkKHRleHQpCisgICAgeworICAgICAgICBsb2NhbCBzID0gIiIgOworICAgICAgICBsb2NhbCB0ID0gIiIgOworICAgICAgICAjIGRpdmlkZSBzIGludG8gdGhlIGZpcnN0IFggY2hhcmFjdGVycyBhbmQgdGhlIHJlc3QKKyAgICAgICAgcyA9IFsgTUFUQ0ggIl4oJChjaGFyLW1hdGNoKSkoLiopIiA6ICQodGV4dCkgXSA7CisKKyAgICAgICAgaWYgJChzWzJdKQorICAgICAgICB7CisgICAgICAgICAgICAjIHNwbGl0IHRoZSBmaXJzdCBoYWxmIGF0IGEgc3BhY2UKKyAgICAgICAgICAgIHQgPSBbIE1BVENIICJeKC4qKVtcXCBdKFteXFwgXSopJCIgOiAkKHNbMV0pIF0gOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdCA9ICQocykgOworICAgICAgICB9CisKKyAgICAgICAgaWYgISAkKHRbMl0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHQgKz0gIiIgOworICAgICAgICB9CisKKyAgICAgICAgdGV4dCA9ICQodFsyXSkkKHNbMl0pIDsKKyAgICAgICAgbGluZXMgKz0gJCh0WzFdKSA7CisgICAgfQorICAgIHJldHVybiAkKGxpbmVzKSA7Cit9CisKKworIyBHZW5lcmF0ZSBhIHNldCBvZiBmaXhlZCBsaW5lcy4gRWFjaCBzaW5nbGUgaXRlbSBwYXNzZWQgaW4gaXMgb3V0cHV0IG9uIGEKKyMgc2VwYXJhdGUgbGluZS4gRm9yIGNvbnNvbGUgdGhpcyBqdXN0IGVjaG9zIGVhY2ggbGluZSwgYnV0IGZvciBodG1sIHRoaXMgd2lsbAorIyBzcGxpdCB0aGVtIHdpdGggPGJyPi4KKyMKK3J1bGUgbGluZXMgKAorICAgIHRleHQgKiAgICAgICMgVGhlIGxpbmVzIG9mIHRleHQuCisgICAgOiBpbmRlbnQgPyAgIyBPcHRpb25hbCBpbmRlbnRhdGlvbiBwcmVwZW5kZWQgdG8gZWFjaCBsaW5lIGFmdGVyIHRoZSBmaXJzdC4KKyAgICBvdXRkZW50ID8gICAjIE9wdGlvbmFsIGluZGVudGF0aW9uIHRvIHByZXBlbmQgdG8gdGhlIGZpcnN0IGxpbmUuCispCit7CisgICAgdGV4dCA/PSAiIiA7CisgICAgaW5kZW50ID89ICIiIDsKKyAgICBvdXRkZW50ID89ICIiIDsKKyAgICBpZiAkKG91dHB1dC10eXBlKSA9IHBsYWluCisgICAgeworICAgICAgICB0ZXh0ICQob3V0ZGVudCkkKHRleHRbMV0pICQoaW5kZW50KSQodGV4dFsyLV0pIDsKKyAgICB9CisgICAgZWxzZSBpZiAkKG91dHB1dC10eXBlKSA9IGh0bWwKKyAgICB7CisgICAgICAgIGxvY2FsIGluZGVudC1jaGFycyA9IFsgc3RyaW5nLmNoYXJzICQoaW5kZW50KSBdIDsKKyAgICAgICAgaW5kZW50ID0gIiIgOworICAgICAgICBmb3IgbG9jYWwgYyBpbiAkKGluZGVudC1jaGFycykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJChjKSA9ICIgIiB7IGMgPSAiJm5ic3A7IiA7IH0KKyAgICAgICAgICAgIGVsc2UgaWYgJChjKSA9ICIJIiB7IGMgPSAiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IiA7IH0KKyAgICAgICAgICAgIGluZGVudCA9ICQoaW5kZW50KSQoYykgOworICAgICAgICB9CisgICAgICAgIGxvY2FsIGh0bWwtdGV4dCA9IFsgZXNjYXBlLWh0bWwgJCh0ZXh0KSA6ICImbmJzcDsiIF0gOworICAgICAgICB0ZXh0ICQoaHRtbC10ZXh0WzFdKTxicj4gJChpbmRlbnQpJChodG1sLXRleHRbMi1dKTxicj4gOworICAgIH0KK30KKworCisjIE91dHB1dCB0ZXh0IGRpcmVjdGx5IHRvIHRoZSBjdXJyZW50IHRhcmdldC4gV2hlbiBkb2luZyBvdXRwdXQgdG8gYSBmaWxlLCBvbmUKKyMgY2FuIGluZGljYXRlIGlmIHRoZSB0ZXh0IHNob3VsZCBiZSBvdXRwdXQgdG8gInByZWZpeCIgaXQsIGFzIHRoZSAiYm9keSIKKyMgKGRlZmF1bHQpLCBvciAic3VmZml4IiBvZiB0aGUgZmlsZS4gVGhpcyBpcyBpbmRlcGVuZGFudCBvZiB0aGUgYWN0dWFsCisjIGV4ZWN1dGlvbiBvcmRlciBvZiB0aGUgdGV4dCBydWxlLiBUaGlzIHJ1bGUgaW52b2tlcyBhIHNpbmd1bGFyIGFjdGlvbiwgb25lCisjIGFjdGlvbiBvbmx5IG9uY2UsIHdoaWNoIGRvZXMgdGhlIGJ1aWxkIG9mIHRoZSBmaWxlLiBUaGVyZWZvcmUgYWN0aW9ucyBvbiB0aGUKKyMgdGFyZ2V0IG91dHNpZGUgb2YgdGhpcyBydWxlIHdpbGwgaGFwcGVuIGVudGlyZWx5IGJlZm9yZSBhbmQvb3IgYWZ0ZXIgYWxsCisjIG91dHB1dCB1c2luZyB0aGlzIHJ1bGUuCisjCitydWxlIHRleHQgKAorICAgIHN0cmluZ3MgKiAgICAgICAgICAgICAgICMgVGhlIHN0cmluZ3Mgb2YgdGV4dCB0byBvdXRwdXQuCisgICAgOiBvdmVyd3JpdGUgPyAgICAgICAgICAgIyBUcnVlIHRvIG92ZXJ3cml0ZSB0aGUgb3V0cHV0IChpZiBpdCBpcyBhIGZpbGUpLgorICAgIDogcHJlZml4LWJvZHktc3VmZml4ID8gICMgSW5kaWNhdGlvbiB0byBvdXRwdXQgcHJlZml4LCBib2R5LCBvciBzdWZmaXggKGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBmaWxlKS4KKykKK3sKKyAgICBwcmVmaXgtYm9keS1zdWZmaXggPz0gYm9keSA7CisgICAgaWYgJChvdXRwdXQtdGFyZ2V0KSA9IGNvbnNvbGUKKyAgICB7CisgICAgICAgIGlmICEgJChzdHJpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICBFQ0hPIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciBsb2NhbCBzIGluICQoc3RyaW5ncykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFQ0hPICQocykgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICEgJCgkKG91dHB1dC10YXJnZXQpLmRpZC1hY3Rpb24pCisgICAgeworICAgICAgICAkKG91dHB1dC10YXJnZXQpLmRpZC1hY3Rpb24gPSB5ZXMgOworICAgICAgICAkKG91dHB1dC10YXJnZXQpLnRleHQtcHJlZml4ID0gOworICAgICAgICAkKG91dHB1dC10YXJnZXQpLnRleHQtYm9keSA9IDsKKyAgICAgICAgJChvdXRwdXQtdGFyZ2V0KS50ZXh0LXN1ZmZpeCA9IDsKKworICAgICAgICBubCBvbiAkKG91dHB1dC10YXJnZXQpID0gIgorIiA7CisgICAgICAgIHRleHQtcmVkaXJlY3Qgb24gJChvdXRwdXQtdGFyZ2V0KSA9ICI+PiIgOworICAgICAgICBpZiAkKG92ZXJ3cml0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGV4dC1yZWRpcmVjdCBvbiAkKG91dHB1dC10YXJnZXQpID0gIj4iIDsKKyAgICAgICAgfQorICAgICAgICB0ZXh0LWNvbnRlbnQgb24gJChvdXRwdXQtdGFyZ2V0KSA9IDsKKworICAgICAgICB0ZXh0LWFjdGlvbiAkKG91dHB1dC10YXJnZXQpIDsKKworICAgICAgICBpZiAkKG92ZXJ3cml0ZSkgJiYgJChvdXRwdXQtdGFyZ2V0KSAhPSBjb25zb2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrLWZvci11cGRhdGUgJChvdXRwdXQtdGFyZ2V0KSA7CisgICAgICAgIH0KKyAgICB9CisgICAgJChvdXRwdXQtdGFyZ2V0KS50ZXh0LSQocHJlZml4LWJvZHktc3VmZml4KSArPSAkKHN0cmluZ3MpIDsKKyAgICB0ZXh0LWNvbnRlbnQgb24gJChvdXRwdXQtdGFyZ2V0KSA9CisgICAgICAgICQoJChvdXRwdXQtdGFyZ2V0KS50ZXh0LXByZWZpeCkKKyAgICAgICAgJCgkKG91dHB1dC10YXJnZXQpLnRleHQtYm9keSkKKyAgICAgICAgJCgkKG91dHB1dC10YXJnZXQpLnRleHQtc3VmZml4KSA7Cit9CisKKworIyBPdXRwdXRzIHRoZSB0ZXh0IHRvIHRoZSBjdXJyZW50IHRhcmdldHMsIGFmdGVyIHdvcmQtd3JhcHBpbmcgaXQuCisjCitydWxlIHdyYXBwZWQtdGV4dCAoIHRleHQgKyApCit7CisgICAgbG9jYWwgbGluZXMgPSBbIHNwbGl0LWF0LXdvcmRzICQodGV4dCkgXSA7CisgICAgdGV4dCAkKGxpbmVzKSA7Cit9CisKKworIyBFc2NhcGVzIHRleHQgaW50byBodG1sL3htbCBwcmludGFibGUgZXF1aXZhbGVudHMuIERvZXMgbm90IGtub3cgYWJvdXQgdGFncyBhbmQKKyMgdGhlcmVmb3JlIHRhZ3MgZmVkIGludG8gdGhpcyB3aWxsIGFsc28gYmUgZXNjYXBlZC4gQ3VycmVudGx5IGVzY2FwZXMgc3BhY2UsCisjICI8IiwgIj4iLCBhbmQgIiYiLgorIworcnVsZSBlc2NhcGUtaHRtbCAoCisgICAgdGV4dCArICAjIFRoZSB0ZXh0IHRvIGVzY2FwZS4KKyAgICA6IHNwYWNlID8gICMgV2hhdCB0byByZXBsYWNlIHNwYWNlcyB3aXRoLCBkZWZhdWx0cyB0byAiICIuCispCit7CisgICAgbG9jYWwgaHRtbC10ZXh0ID0gOworICAgIHdoaWxlICQodGV4dCkKKyAgICB7CisgICAgICAgIGxvY2FsIGh0bWwgPSAkKHRleHRbMV0pIDsKKyAgICAgICAgdGV4dCA9ICQodGV4dFsyLV0pIDsKKyAgICAgICAgaHRtbCA9IFsgcmVnZXgucmVwbGFjZSAkKGh0bWwpICImIiAiJmFtcDsiIF0gOworICAgICAgICBodG1sID0gWyByZWdleC5yZXBsYWNlICQoaHRtbCkgIjwiICImbHQ7IiBdIDsKKyAgICAgICAgaHRtbCA9IFsgcmVnZXgucmVwbGFjZSAkKGh0bWwpICI+IiAiJmd0OyIgXSA7CisgICAgICAgIGlmICQoc3BhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0bWwgPSBbIHJlZ2V4LnJlcGxhY2UgJChodG1sKSAiICIgIiQoc3BhY2UpIiBdIDsKKyAgICAgICAgfQorICAgICAgICBodG1sLXRleHQgKz0gJChodG1sKSA7CisgICAgfQorICAgIHJldHVybiAkKGh0bWwtdGV4dCkgOworfQorCisKKyMgT3V0cHV0cyB0aGUgdGV4dCBzdHJpbmdzIGNvbGxlY3RlZCBieSB0aGUgdGV4dCBydWxlIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyMKK2FjdGlvbnMgcXVpZXRseSB0ZXh0LWFjdGlvbgoreworICAgIEAoJChTVERPVVQpOkU9JCh0ZXh0LWNvbnRlbnQ6Sj0kKG5sKSkpICQodGV4dC1yZWRpcmVjdCkgIiQoPCkiCit9CisKKworcnVsZSBnZXQtc2Nhbm5lciAoICkKK3sKKyAgICBpZiAhICQoLnNjYW5uZXIpCisgICAgeworICAgICAgICAuc2Nhbm5lciA9IFsgY2xhc3MubmV3IHByaW50LXNjYW5uZXIgXSA7CisgICAgfQorICAgIHJldHVybiAkKC5zY2FubmVyKSA7Cit9CisKKworIyBUaGUgZm9sbG93aW5nIGNvZGUgdG8gdXBkYXRlIHByaW50IHRhcmdldHMgd2hlbiB0aGVpciBjb250ZW50cyBjaGFuZ2UgaXMgYQorIyBob3JyaWJsZSBoYWNrLiBJdCBiYXNpY2FsbHkgY3JlYXRlcyBhIHRhcmdldCB3aGljaCBiaW5kcyB0byB0aGlzIGZpbGUKKyMgKHByaW50LmphbSkgYW5kIGluc3RhbGxzIGEgc2Nhbm5lciBvbiBpdCB3aGljaCByZWFkcyB0aGUgdGFyZ2V0IGFuZCBjb21wYXJlcworIyBpdHMgY29udGVudHMgdG8gdGhlIG5ldyBjb250ZW50cyB0aGF0IHdlIGFyZSB3cml0aW5nLgorIworcnVsZSBjaGVjay1mb3ItdXBkYXRlICggdGFyZ2V0ICkKK3sKKyAgICBsb2NhbCBzY2FubmVyID0gWyBnZXQtc2Nhbm5lciBdIDsKKyAgICBsb2NhbCBmaWxlID0gWyBwYXRoLm5hdGl2ZSBbIG1vZHVsZXMuYmluZGluZyAkKF9fbmFtZV9fKSBdIF0gOworICAgIGxvY2FsIGcgPSBbIE1BVENIIDwoLiopPiA6ICQodGFyZ2V0OkcpIF0gOworICAgIGxvY2FsIGRlcGVuZGVuY3ktdGFyZ2V0ID0gJChfX2ZpbGVfXzpHPSQoZzpFPSktJCh0YXJnZXQ6Rz0pLSQoc2Nhbm5lcikpIDsKKyAgICBERVBFTkRTICQodGFyZ2V0KSA6ICQoZGVwZW5kZW5jeS10YXJnZXQpIDsKKyAgICBTRUFSQ0ggb24gJChkZXBlbmRlbmN5LXRhcmdldCkgPSAkKGZpbGU6RCkgOworICAgIElTRklMRSAkKGRlcGVuZGVuY3ktdGFyZ2V0KSA7CisgICAgTk9VUERBVEUgJChkZXBlbmRlbmN5LXRhcmdldCkgOworICAgIGJhc2Ugb24gJChkZXBlbmRlbmN5LXRhcmdldCkgPSAkKHRhcmdldCkgOworICAgIHNjYW5uZXIuaW5zdGFsbCAkKHNjYW5uZXIpIDogJChkZXBlbmRlbmN5LXRhcmdldCkgOworICAgIHJldHVybiAkKGRlcGVuZGVuY3ktdGFyZ2V0KSA7Cit9CisKKworY2xhc3MgcHJpbnQtc2Nhbm5lciA6IHNjYW5uZXIKK3sKKyAgICBpbXBvcnQgcGF0aCA7CisgICAgaW1wb3J0IG9zIDsKKworICAgIHJ1bGUgcGF0dGVybiAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAiKE9uZSBtYXRjaC4uLikiIDsKKyAgICB9CisKKyAgICBydWxlIHByb2Nlc3MgKCB0YXJnZXQgOiBtYXRjaGVzICogOiBiaW5kaW5nICkKKyAgICB7CisgICAgICAgIGxvY2FsIGJhc2UgPSBbIG9uICQodGFyZ2V0KSByZXR1cm4gJChiYXNlKSBdIDsKKyAgICAgICAgbG9jYWwgbmwgPSBbIG9uICQoYmFzZSkgcmV0dXJuICQobmwpIF0gOworICAgICAgICBsb2NhbCB0ZXh0LWNvbnRlbnQgPSBbIG9uICQoYmFzZSkgcmV0dXJuICQodGV4dC1jb250ZW50KSBdIDsKKyAgICAgICAgbG9jYWwgZGlyID0gWyBvbiAkKGJhc2UpIHJldHVybiAkKExPQ0FURSkgXSA7CisgICAgICAgIGlmICQoZGlyKQorICAgICAgICB7CisgICAgICAgICAgICBkaXIgPSBbIHBhdGgubWFrZSAkKGRpcikgXSA7CisgICAgICAgIH0KKyAgICAgICAgbG9jYWwgZmlsZSA9IFsgcGF0aC5uYXRpdmUgWyBwYXRoLmpvaW4gJChkaXIpICQoYmFzZTpHPSkgXSBdIDsKKyAgICAgICAgbG9jYWwgYWN0dWFsLWNvbnRlbnQgOworICAgICAgICBpZiBbIG9zLm5hbWUgXSA9IE5UCisgICAgICAgIHsKKyAgICAgICAgICAgIGFjdHVhbC1jb250ZW50ID0gWyBTSEVMTCAidHlwZSBcIiQoZmlsZSlcIiAyPm51bCIgXSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhY3R1YWwtY29udGVudCA9IFsgU0hFTEwgImNhdCBcIiQoZmlsZSlcIiAyPi9kZXYvbnVsbCIgXSA7CisgICAgICAgIH0KKyAgICAgICAgaWYgJCh0ZXh0LWNvbnRlbnQ6Sj0kKG5sKSkgIT0gJChhY3R1YWwtY29udGVudCkKKyAgICAgICAgeworICAgICAgICAgICAgQUxXQVlTICQoYmFzZSkgOworICAgICAgICB9CisgICAgfQorfQorCisKK3J1bGUgX190ZXN0X18gKCApCit7CisgICAgaW1wb3J0IGFzc2VydCA7CisKKyAgICBhc3NlcnQucmVzdWx0IG9uZSB0d28gdGhyZWUgICA6IHNwbGl0LWF0LXdvcmRzIG9uZSB0d28gdGhyZWUgOiA1IDsKKyAgICBhc3NlcnQucmVzdWx0ICJvbmUgdHdvIiB0aHJlZSA6IHNwbGl0LWF0LXdvcmRzIG9uZSB0d28gdGhyZWUgOiA4IDsKKyAgICBhc3NlcnQucmVzdWx0ICJvbmUgdHdvIiB0aHJlZSA6IHNwbGl0LWF0LXdvcmRzIG9uZSB0d28gdGhyZWUgOiA5IDsKKyAgICBhc3NlcnQucmVzdWx0ICJvbmUgdHdvIHRocmVlIiA6IHNwbGl0LWF0LXdvcmRzIG9uZSB0d28gdGhyZWUgOworCisgICAgIyBWUCwgMjAwNC0xMi0wMyBUaGUgZm9sbG93aW5nIHRlc3QgZmFpbHMgZm9yIHNvbWUgcmVhc29uLCBzbyBjb21tZW50aW5nIGl0CisgICAgIyBvdXQuCisgICAgI2Fzc2VydC5yZXN1bHQgIm9uZSZuYnNwO3R3byZuYnNwO3RocmVlIiAiJmFtcDsmbHQ7Jmd0OyIgOgorICAgICMgICAgZXNjYXBlLWh0bWwgIm9uZSB0d28gdGhyZWUiICImPD4iIDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9yZWdleC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvcmVnZXguamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOGIzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvcmVnZXguamFtCkBAIC0wLDAgKzEsMjAzIEBACisjIENvcHlyaWdodCAyMDAxLCAyMDAyIERhdmUgQWJyYWhhbXMKKyMgQ29weXJpZ2h0IDIwMDMgRG91Z2xhcyBHcmVnb3IKKyMgQ29weXJpZ2h0IDIwMDMgUmVuZSBSaXZlcmEKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgVmxhZGltaXIgUHJ1cworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjCisjICAgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGZvbGxvd2luZyBzdWJzdHJpbmdzOgorIyAgIDEpIGZyb20gYmVnaW5uaW5nIHRpbGwgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgJ3NlcGFyYXRvcicgb3IgdGlsbCB0aGUgZW5kLAorIyAgIDIpIGJldHdlZW4gZWFjaCBvY2N1cnJlbmNlIG9mICdzZXBhcmF0b3InIGFuZCB0aGUgbmV4dCBvY2N1cnJlbmNlLAorIyAgIDMpIGZyb20gdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiAnc2VwYXJhdG9yJyB0aWxsIHRoZSBlbmQuCisjICAgSWYgbm8gc2VwYXJhdG9yIGlzIHByZXNlbnQsIHRoZSByZXN1bHQgd2lsbCBjb250YWluIG9ubHkgb25lIGVsZW1lbnQuCisjCisKK3J1bGUgc3BsaXQgKCBzdHJpbmcgc2VwYXJhdG9yICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGxvY2FsIHMgPSAkKHN0cmluZykgOworCisgICAgIyBCcmVhayBwaWVhY2VzIG9mZiAncycgdW50aWwgaXQgaGFzIG5vIHNlcGFyYXRvcnMgbGVmdC4KKyAgICBsb2NhbCBtYXRjaCA9IDEgOworICAgIHdoaWxlICQobWF0Y2gpCisgICAgeworICAgICAgICBtYXRjaCA9IFsgTUFUQ0ggXiguKikoJChzZXBhcmF0b3IpKSguKikgOiAkKHMpIF0gOworICAgICAgICBpZiAkKG1hdGNoKQorICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCArPSAiIiA7ICAjIGluIGNhc2UgM3JkIGl0ZW0gd2FzIGVtcHR5IC0gd29ya3MgYXJvdW5kIE1BVENIIGJ1ZworICAgICAgICAgICAgcmVzdWx0ID0gJChtYXRjaFszXSkgJChyZXN1bHQpIDsKKyAgICAgICAgICAgIHMgPSAkKG1hdGNoWzFdKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgIyBDb21iaW5lIHRoZSByZW1haW5pbmcgcGFydCBhdCB0aGUgYmVnaW5uaW5nLCB3aGljaCBkb2VzIG5vdCBoYXZlCisgICAgIyBzZXBhcmF0b3JzLCB3aXRoIHRoZSBwaWVjZXMgYnJva2VuIG9mZi4gTm90ZSB0aGF0IHRoZSBydWxlJ3Mgc2lnbmF0dXJlCisgICAgIyBkb2VzIG5vdCBhbGxvdyB0aGUgaW5pdGlhbCBzIHRvIGJlIGVtcHR5LgorICAgIHJldHVybiAkKHMpICQocmVzdWx0KSA7Cit9CisKK2lmIFsgSEFTX05BVElWRV9SVUxFIHJlZ2V4IDogc3BsaXQgOiAxIF0KK3sKKyAgICBOQVRJVkVfUlVMRSByZWdleCA6IHNwbGl0IDsKK30KKworIyBSZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgcmVzdWx0cyBvZiBBcHBseWluZyByZWdleC5zcGxpdCB0byBldmVyeSBlbGVtZW50IG9mCisjIHRoZSBsaXN0IHVzaW5nIHRoZSBzZXBhcmF0b3IgcGF0dGVybi4KKyMKK3J1bGUgc3BsaXQtbGlzdCAoIGxpc3QgKiA6IHNlcGFyYXRvciApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBmb3IgcyBpbiAkKGxpc3QpCisgICAgeworICAgICAgICByZXN1bHQgKz0gWyBzcGxpdCAkKHMpICQoc2VwYXJhdG9yKSBdIDsKKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBNYXRjaCBzdHJpbmcgYWdhaW5zdCBwYXR0ZXJuLCBhbmQgcmV0dXJuIHRoZSBlbGVtZW50cyBpbmRpY2F0ZWQgYnkgaW5kaWNlcy4KKyMKK3J1bGUgbWF0Y2ggKCBwYXR0ZXJuIDogc3RyaW5nIDogaW5kaWNlcyAqICkKK3sKKyAgICBpbmRpY2VzID89IDEgMiAzIDQgNSA2IDcgOCA5IDsKKyAgICBsb2NhbCB4ID0gWyBNQVRDSCAkKHBhdHRlcm4pIDogJChzdHJpbmcpIF0gOworICAgIHJldHVybiAkKHhbJChpbmRpY2VzKV0pIDsKK30KKworCisjIE1hdGNoZXMgYWxsIGVsZW1lbnRzIG9mICdsaXN0JyBhZ2FpbnMgdGhlICdwYXR0ZXJuJyBhbmQgcmV0dXJucyBhIGxpc3Qgb2YKKyMgZWxlbWVudHMgaW5kaWNhdGVkIGJ5IGluZGljZXMgb2YgYWxsIHN1Y2Nlc3NmdWwgbWF0Y2hlcy4gSWYgJ2luZGljZXMnIGlzCisjIG9taXR0ZWQgcmV0dXJucyBhIGxpc3Qgb2YgZmlyc3QgcGFyZW50aGVzaXNlZCBncm91cHMgb2YgYWxsIHN1Y2Nlc3NmdWwKKyMgbWF0Y2hlcy4KKyMKK3J1bGUgdHJhbnNmb3JtICggbGlzdCAqIDogcGF0dGVybiA6IGluZGljZXMgKiApCit7CisgICAgaW5kaWNlcyA/PSAxIDsKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGZvciBsb2NhbCBlIGluICQobGlzdCkKKyAgICB7CisgICAgICAgIGxvY2FsIG0gPSBbIE1BVENIICQocGF0dGVybikgOiAkKGUpIF0gOworICAgICAgICBpZiAkKG0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAkKG1bJChpbmRpY2VzKV0pIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworTkFUSVZFX1JVTEUgcmVnZXggOiB0cmFuc2Zvcm0gOworCisKKyMgRXNjYXBlcyBhbGwgb2YgdGhlIGNoYXJhY3RlcnMgaW4gc3ltYm9scyB1c2luZyB0aGUgZXNjYXBlIHN5bWJvbCBlc2NhcGUtc3ltYm9sCisjIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLCBhbmQgcmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuCisjCitydWxlIGVzY2FwZSAoIHN0cmluZyA6IHN5bWJvbHMgOiBlc2NhcGUtc3ltYm9sICkKK3sKKyAgICBsb2NhbCByZXN1bHQgPSAiIiA7CisgICAgbG9jYWwgbSA9IDEgOworICAgIHdoaWxlICQobSkKKyAgICB7CisgICAgICAgIG0gPSBbIE1BVENIIF4oW14kKHN5bWJvbHMpXSopKFskKHN5bWJvbHMpXSkoLiopIDogJChzdHJpbmcpIF0gOworICAgICAgICBpZiAkKG0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG0gKz0gIiIgOyAgIyBTdXBwb3NlZGx5IGEgYnVnIGZpeDsgYm9ycm93ZWQgZnJvbSByZWdleC5zcGxpdAorICAgICAgICAgICAgcmVzdWx0ID0gIiQocmVzdWx0KSQobVsxXSkkKGVzY2FwZS1zeW1ib2wpJChtWzJdKSIgOworICAgICAgICAgICAgc3RyaW5nID0gJChtWzNdKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RyaW5nID89ICIiIDsKKyAgICByZXN1bHQgPSAiJChyZXN1bHQpJChzdHJpbmcpIiA7CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBSZXBsYWNlcyBvY2N1cnJlbmNlcyBvZiBhIG1hdGNoIHN0cmluZyBpbiBhIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgbmV3CisjIHN0cmluZy4gVGhlIG1hdGNoIHN0cmluZyBjYW4gYmUgYSByZWdleCBleHByZXNzaW9uLgorIworcnVsZSByZXBsYWNlICgKKyAgICBzdHJpbmcgICMgVGhlIHN0cmluZyB0byBtb2RpZnkuCisgICAgbWF0Y2ggICMgVGhlIGNoYXJhY3RlcnMgdG8gcmVwbGFjZS4KKyAgICByZXBsYWNlbWVudCAgIyBUaGUgc3RyaW5nIHRvIHJlcGxhY2Ugd2l0aC4KKyAgICApCit7CisgICAgbG9jYWwgcmVzdWx0ID0gIiIgOworICAgIGxvY2FsIHBhcnRzID0gMSA7CisgICAgd2hpbGUgJChwYXJ0cykKKyAgICB7CisgICAgICAgIHBhcnRzID0gWyBNQVRDSCBeKC4qKSgkKG1hdGNoKSkoLiopIDogJChzdHJpbmcpIF0gOworICAgICAgICBpZiAkKHBhcnRzKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJ0cyArPSAiIiA7CisgICAgICAgICAgICByZXN1bHQgPSAiJChyZXBsYWNlbWVudCkkKHBhcnRzWzNdKSQocmVzdWx0KSIgOworICAgICAgICAgICAgc3RyaW5nID0gJChwYXJ0c1sxXSkgOworICAgICAgICB9CisgICAgfQorICAgIHN0cmluZyA/PSAiIiA7CisgICAgcmVzdWx0ID0gIiQoc3RyaW5nKSQocmVzdWx0KSIgOworICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCitpZiBbIEhBU19OQVRJVkVfUlVMRSByZWdleCA6IHJlcGxhY2UgOiAxIF0KK3sKKyAgICBOQVRJVkVfUlVMRSByZWdleCA6IHJlcGxhY2UgOworfQorCisKKyMgUmVwbGFjZXMgb2NjdXJyZW5jZXMgb2YgYSBtYXRjaCBzdHJpbmcgaW4gYSBnaXZlbiBsaXN0IG9mIHN0cmluZ3MgYW5kIHJldHVybnMKKyMgYSBsaXN0IG9mIG5ldyBzdHJpbmdzLiBUaGUgbWF0Y2ggc3RyaW5nIGNhbiBiZSBhIHJlZ2V4IGV4cHJlc3Npb24uCisjCisjIGxpc3QgICAgICAgIC0gdGhlIGxpc3Qgb2Ygc3RyaW5ncyB0byBtb2RpZnkuCisjIG1hdGNoICAgICAgIC0gdGhlIHNlYXJjaCBleHByZXNzaW9uLgorIyByZXBsYWNlbWVudCAtIHRoZSBzdHJpbmcgdG8gcmVwbGFjZSB3aXRoLgorIworcnVsZSByZXBsYWNlLWxpc3QgKCBsaXN0ICogOiBtYXRjaCA6IHJlcGxhY2VtZW50ICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGZvciBsb2NhbCBlIGluICQobGlzdCkKKyAgICB7CisgICAgICAgIHJlc3VsdCArPSBbIHJlcGxhY2UgJChlKSAkKG1hdGNoKSAkKHJlcGxhY2VtZW50KSBdIDsKKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworcnVsZSBfX3Rlc3RfXyAoICkKK3sKKyAgICBpbXBvcnQgYXNzZXJ0IDsKKworICAgIGFzc2VydC5yZXN1bHQgYSBiIGMgOiBzcGxpdCAiYS9iL2MiIC8gOworICAgIGFzc2VydC5yZXN1bHQgIiIgYSBiIGMgOiBzcGxpdCAiL2EvYi9jIiAvIDsKKyAgICBhc3NlcnQucmVzdWx0ICIiICIiIGEgYiBjIDogc3BsaXQgIi8vYS9iL2MiIC8gOworICAgIGFzc2VydC5yZXN1bHQgIiIgYSAiIiBiIGMgOiBzcGxpdCAiL2EvL2IvYyIgLyA7CisgICAgYXNzZXJ0LnJlc3VsdCAiIiBhICIiIGIgYyAiIiA6IHNwbGl0ICIvYS8vYi9jLyIgLyA7CisgICAgYXNzZXJ0LnJlc3VsdCAiIiBhICIiIGIgYyAiIiAiIiA6IHNwbGl0ICIvYS8vYi9jLy8iIC8gOworCisgICAgYXNzZXJ0LnJlc3VsdCBhIGMgYiBkCisgICAgICAgIDogbWF0Y2ggKC4pKC4pKC4pKC4pIDogYWJjZCA6IDEgMyAyIDQgOworCisgICAgYXNzZXJ0LnJlc3VsdCBhIGIgYyBkCisgICAgICAgIDogbWF0Y2ggKC4pKC4pKC4pKC4pIDogYWJjZCA7CisKKyAgICBhc3NlcnQucmVzdWx0IGFiYWJhYiBjZGRjCisgICAgICAgIDogbWF0Y2ggKChhYikqKShbY2RdKykgOiBhYmFiYWJjZGRjIDogMSAzIDsKKworICAgIGFzc2VydC5yZXN1bHQgYS5oIGMuaAorICAgICAgICA6IHRyYW5zZm9ybSA8YS5oPiBcImIuaFwiIDxjLmg+IDogPCguKik+IDsKKworICAgIGFzc2VydC5yZXN1bHQgYS5oIGIuaCBjLmgKKyAgICAgICAgOiB0cmFuc2Zvcm0gPGEuaD4gXCJiLmhcIiA8Yy5oPiA6IDwoW14+XSopPnxcIihbXlwiXSopXCIgOiAxIDIgOworCisgICAgYXNzZXJ0LnJlc3VsdCAiXjw/eG1sIHZlcnNpb249XCIxLjBcIl4+IgorICAgICAgICA6IGVzY2FwZSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPiIgOiAiJnwoKTw+XiIgOiAiXiIgOworCisgICAgYXNzZXJ0LnJlc3VsdCAiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIj4iCisgICAgICAgIDogZXNjYXBlICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI+IiA6ICJcXFwiIiA6ICJcXCIgOworCisgICAgYXNzZXJ0LnJlc3VsdCAic3RyaW5nJm5ic3A7c3RyaW5nJm5ic3A7IiA6IHJlcGxhY2UgInN0cmluZyBzdHJpbmcgIiAiICIgIiZuYnNwOyIgOworICAgIGFzc2VydC5yZXN1bHQgIiZuYnNwO3N0cmluZyZuYnNwO3N0cmluZyIgOiByZXBsYWNlICIgc3RyaW5nIHN0cmluZyIgIiAiICImbmJzcDsiIDsKKyAgICBhc3NlcnQucmVzdWx0ICJzdHJpbmcmbmJzcDsmbmJzcDtzdHJpbmciIDogcmVwbGFjZSAic3RyaW5nICBzdHJpbmciICIgIiAiJm5ic3A7IiA7CisgICAgYXNzZXJ0LnJlc3VsdCAiLSIgOiByZXBsYWNlICImIiAiJiIgIi0iIDsKKworICAgIGFzc2VydC5yZXN1bHQgIi0iICJhLWIiIDogcmVwbGFjZS1saXN0ICImIiAiYSZiIiA6ICImIiA6ICItIiA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvc2VxdWVuY2UuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91dGlsL3NlcXVlbmNlLmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdlYjRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91dGlsL3NlcXVlbmNlLmphbQpAQCAtMCwwICsxLDMzOSBAQAorIyBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwMyBEYXZlIEFicmFoYW1zIAorIyBDb3B5cmlnaHQgMjAwNiBSZW5lIFJpdmVyYSAKKyMgQ29weXJpZ2h0IDIwMDIsIDIwMDMgVmxhZGltaXIgUHJ1cyAKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAKKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworaW1wb3J0IGFzc2VydCA7CitpbXBvcnQgbnVtYmVycyA7IAoraW1wb3J0IG1vZHVsZXMgOworCisKKyMgTm90ZSB0aGF0IGFsZ29yaXRobXMgaW4gdGhpcyBtb2R1bGUgZXhlY3V0ZSBsYXJnZWx5IGluIHRoZSBjYWxsZXIncyBtb2R1bGUKKyMgbmFtZXNwYWNlLCBzbyB0aGF0IGxvY2FsIHJ1bGVzIGNhbiBiZSB1c2VkIGFzIGZ1bmN0aW9uIG9iamVjdHMuIEFsc28gbm90ZSB0aGF0CisjIG1vc3QgcHJlZGljYXRlcyBjYW4gYmUgbXVsdGktZWxlbWVudCBsaXN0cy4gSW4gdGhhdCBjYXNlLCBhbGwgYnV0IHRoZSBmaXJzdAorIyBlbGVtZW50IGFyZSBwcmVwZW5kZWQgdG8gdGhlIGZpcnN0IGFyZ3VtZW50IHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgcnVsZSBuYW1lZAorIyBieSB0aGUgZmlyc3QgZWxlbWVudC4KKworCisjIFJldHVybiB0aGUgZWxlbWVudHMgZSBvZiAkKHNlcXVlbmNlKSBmb3Igd2hpY2ggWyAkKHByZWRpY2F0ZSkgZSBdIGhhcyBhCisjIG5vbi1udWxsIHZhbHVlLgorIworcnVsZSBmaWx0ZXIgKCBwcmVkaWNhdGUgKyA6IHNlcXVlbmNlICogKQoreworICAgIGxvY2FsIGNhbGxlciA9IFsgQ0FMTEVSX01PRFVMRSBdIDsKKyAgICBsb2NhbCByZXN1bHQgOworCisgICAgZm9yIGxvY2FsIGUgaW4gJChzZXF1ZW5jZSkKKyAgICB7CisgICAgICAgIGlmIFsgbW9kdWxlcy5jYWxsLWluICQoY2FsbGVyKSA6ICQocHJlZGljYXRlKSAkKGUpIF0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICQoZSkgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgUmV0dXJuIGEgbmV3IHNlcXVlbmNlIGNvbnNpc3Rpbmcgb2YgWyAkKGZ1bmN0aW9uKSAkKGUpIF0gZm9yIGVhY2ggZWxlbWVudCBlIG9mCisjICQoc2VxdWVuY2UpLgorIworcnVsZSB0cmFuc2Zvcm0gKCBmdW5jdGlvbiArIDogc2VxdWVuY2UgKiApCit7CisgICAgbG9jYWwgY2FsbGVyID0gWyBDQUxMRVJfTU9EVUxFIF0gOworICAgIGxvY2FsIHJlc3VsdCA7CisKKyAgICBmb3IgbG9jYWwgZSBpbiAkKHNlcXVlbmNlKQorICAgIHsKKyAgICAgICAgcmVzdWx0ICs9IFsgbW9kdWxlcy5jYWxsLWluICQoY2FsbGVyKSA6ICQoZnVuY3Rpb24pICQoZSkgXSA7CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCitpZiBbIEhBU19OQVRJVkVfUlVMRSBzZXF1ZW5jZSA6IHRyYW5zZm9ybSA6IDEgXQoreworICAgIE5BVElWRV9SVUxFIHNlcXVlbmNlIDogdHJhbnNmb3JtIDsKK30KKworcnVsZSByZXZlcnNlICggcyAqICkKK3sKKyAgICBsb2NhbCByIDsKKyAgICBmb3IgbG9jYWwgeCBpbiAkKHMpCisgICAgeworICAgICAgICByID0gJCh4KSAkKHIpIDsKKyAgICB9CisgICAgcmV0dXJuICQocikgOworfQorCisKK3J1bGUgbGVzcyAoIGEgYiApCit7CisgICAgaWYgJChhKSA8ICQoYikKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlIDsKKyAgICB9Cit9CisKKworIyBJbnNlcnRpb24tc29ydCBzIHVzaW5nIHRoZSBCaW5hcnlQcmVkaWNhdGUgb3JkZXJlZC4KKyMKK3J1bGUgaW5zZXJ0aW9uLXNvcnQgKCBzICogOiBvcmRlcmVkICogKQoreworICAgIGlmICEgJChvcmRlcmVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFsgU09SVCAkKHMpIF0gOworICAgIH0KKyAgICBlbHNlIAorICAgIHsgICAgICAgICAgIAorICAgICAgICBsb2NhbCBjYWxsZXIgPSBbIENBTExFUl9NT0RVTEUgXSA7CisgICAgICAgIG9yZGVyZWQgPz0gc2VxdWVuY2UubGVzcyA7CisgICAgICAgIGxvY2FsIHJlc3VsdCA9ICQoc1sxXSkgOworICAgICAgICBpZiAkKG9yZGVyZWQpID0gc2VxdWVuY2UubGVzcworICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCBoZWFkIHRhaWwgOworICAgICAgICAgICAgZm9yIGxvY2FsIHggaW4gJChzWzItXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZWFkID0gOworICAgICAgICAgICAgICAgIHRhaWwgPSAkKHJlc3VsdCkgOworICAgICAgICAgICAgICAgIHdoaWxlICQodGFpbCkgJiYgKCAkKHRhaWxbMV0pIDwgJCh4KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoZWFkICs9ICQodGFpbFsxXSkgOworICAgICAgICAgICAgICAgICAgICB0YWlsID0gJCh0YWlsWzItXSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAkKGhlYWQpICQoeCkgJCh0YWlsKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgbG9jYWwgeCBpbiAkKHNbMi1dKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsIGhlYWQgdGFpbCA7CisgICAgICAgICAgICAgICAgdGFpbCA9ICQocmVzdWx0KSA7CisgICAgICAgICAgICAgICAgd2hpbGUgJCh0YWlsKSAmJiBbIG1vZHVsZXMuY2FsbC1pbiAkKGNhbGxlcikgOiAkKG9yZGVyZWQpICQodGFpbFsxXSkgJCh4KSBdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoZWFkICs9ICQodGFpbFsxXSkgOworICAgICAgICAgICAgICAgICAgICB0YWlsID0gJCh0YWlsWzItXSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAkKGhlYWQpICQoeCkgJCh0YWlsKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworICAgIH0gICAgCit9CisKKworIyBNZXJnZSB0d28gb3JkZXJlZCBzZXF1ZW5jZXMgdXNpbmcgdGhlIEJpbmFyeVByZWRpY2F0ZSBvcmRlcmVkLgorIworcnVsZSBtZXJnZSAoIHMxICogOiBzMiAqIDogb3JkZXJlZCAqICkKK3sKKyAgICBvcmRlcmVkID89IHNlcXVlbmNlLmxlc3MgOworICAgIGxvY2FsIHJlc3VsdF9fIDsKKyAgICBsb2NhbCBjYWxsZXIgPSBbIENBTExFUl9NT0RVTEUgXSA7CisKKyAgICB3aGlsZSAkKHMxKSAmJiAkKHMyKQorICAgIHsKKyAgICAgICAgaWYgWyBtb2R1bGVzLmNhbGwtaW4gJChjYWxsZXIpIDogJChvcmRlcmVkKSAkKHMxWzFdKSAkKHMyWzFdKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdF9fICs9ICQoczFbMV0pIDsKKyAgICAgICAgICAgIHMxID0gJChzMVsyLV0pIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIFsgbW9kdWxlcy5jYWxsLWluICQoY2FsbGVyKSA6ICQob3JkZXJlZCkgJChzMlsxXSkgJChzMVsxXSkgXQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHRfXyArPSAkKHMyWzFdKSA7CisgICAgICAgICAgICBzMiA9ICQoczJbMi1dKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAKKyAgICAgICAgeyAgICAgICAgICAgCisgICAgICAgICAgICBzMiA9ICQoczJbMi1dKSA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIHJlc3VsdF9fICs9ICQoczEpIDsKKyAgICByZXN1bHRfXyArPSAkKHMyKSA7CisKKyAgICByZXR1cm4gJChyZXN1bHRfXykgOworfQorCisKKyMgSm9pbiB0aGUgZWxlbWVudHMgb2YgcyBpbnRvIG9uZSBsb25nIHN0cmluZy4gSWYgam9pbnQgaXMgc3VwcGxpZWQsIGl0IGlzIHVzZWQKKyMgYXMgYSBzZXBhcmF0b3IuCisjCitydWxlIGpvaW4gKCBzICogOiBqb2ludCA/ICkKK3sKKyAgICBqb2ludCA/PSAiIiA7CisgICAgcmV0dXJuICQoczpKPSQoam9pbnQpKSA7Cit9CisKKworIyBGaW5kIHRoZSBsZW5ndGggb2YgYW55IHNlcXVlbmNlLgorIworcnVsZSBsZW5ndGggKCBzICogKQoreworICAgIGxvY2FsIHJlc3VsdCA9IDAgOworICAgIGZvciBsb2NhbCBpIGluICQocykKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IFsgQ0FMQyAkKHJlc3VsdCkgKyAxIF0gOworICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKworCitydWxlIHVuaXF1ZSAoIGxpc3QgKiA6IHN0YWJsZSA/ICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGxvY2FsIHByZXYgOworICAgIGlmICQoc3RhYmxlKQorICAgIHsKKyAgICAgICAgZm9yIGxvY2FsIGYgaW4gJChsaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAhICQoZikgaW4gJChyZXN1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoZikgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciBsb2NhbCBpIGluIFsgU09SVCAkKGxpc3QpIF0KKyAgICAgICAgeworICAgICAgICAgICAgaWYgJChpKSAhPSAkKHByZXYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICQoaSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldiA9ICQoaSkgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgaW4gJ2VsZW1lbnRzJy4gVXNlcyAnb3JkZXJlZCcgZm9yIGNvbXBhcmlzb25zIG9yCisjICdudW1iZXJzLmxlc3MnIGlmIG5vbmUgaXMgcHJvdmlkZWQuCisjCitydWxlIG1heC1lbGVtZW50ICggZWxlbWVudHMgKyA6IG9yZGVyZWQgPyApCit7CisgICAgb3JkZXJlZCA/PSBudW1iZXJzLmxlc3MgOworCisgICAgbG9jYWwgbWF4ID0gJChlbGVtZW50c1sxXSkgOworICAgIGZvciBsb2NhbCBlIGluICQoZWxlbWVudHNbMi1dKSAKKyAgICB7CisgICAgICAgIGlmIFsgJChvcmRlcmVkKSAkKG1heCkgJChlKSBdIAorICAgICAgICB7CisgICAgICAgICAgICBtYXggPSAkKGUpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChtYXgpIDsgICAgICAgICAgIAorfQorCisKKyMgUmV0dXJucyBhbGwgb2YgJ2VsZW1lbnRzJyBmb3Igd2hpY2ggY29ycmVzcG9uZGluZyBlbGVtZW50IGluIHBhcmFsbGVsIGxpc3QKKyMgJ3JhbmsnIGlzIGVxdWFsIHRvIHRoZSBtYXhpbXVtIHZhbHVlIGluICdyYW5rJy4KKyMKK3J1bGUgc2VsZWN0LWhpZ2hlc3QtcmFua2VkICggZWxlbWVudHMgKiA6IHJhbmtzICogKQoreworICAgIGlmICQoZWxlbWVudHMpCisgICAgeyAgICAgICAgCisgICAgICAgIGxvY2FsIG1heC1yYW5rID0gWyBtYXgtZWxlbWVudCAkKHJhbmtzKSBdIDsKKyAgICAgICAgbG9jYWwgcmVzdWx0IDsKKyAgICAgICAgd2hpbGUgJChlbGVtZW50cykgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQocmFua3NbMV0pID0gJChtYXgtcmFuaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gJChlbGVtZW50c1sxXSkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxlbWVudHMgPSAkKGVsZW1lbnRzWzItXSkgOworICAgICAgICAgICAgcmFua3MgPSAkKHJhbmtzWzItXSkgOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkKHJlc3VsdCkgOworICAgIH0gICAgCit9CitOQVRJVkVfUlVMRSBzZXF1ZW5jZSA6IHNlbGVjdC1oaWdoZXN0LXJhbmtlZCA7CisKKworcnVsZSBfX3Rlc3RfXyAoICkKK3sKKyAgICAjIFVzZSBhIHVuaXF1ZSBtb2R1bGUgc28gd2UgY2FuIHRlc3QgdGhlIHVzZSBvZiBsb2NhbCBydWxlcy4KKyAgICBtb2R1bGUgc2VxdWVuY2UuX190ZXN0X18KKyAgICB7CisgICAgICAgIGltcG9ydCBhc3NlcnQgOworICAgICAgICBpbXBvcnQgc2VxdWVuY2UgOworICAgICAgICAKKyAgICAgICAgbG9jYWwgcnVsZSBpcy1ldmVuICggbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQobikgaW4gMCAyIDQgNiA4CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWUgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCA0IDYgNCAyIDggOiBzZXF1ZW5jZS5maWx0ZXIgaXMtZXZlbiA6IDEgNCA2IDMgNCA3IDIgMyA4IDsKKworICAgICAgICAjIFRlc3QgdGhhdCBhcmd1bWVudCBiaW5kaW5nIHdvcmtzLgorICAgICAgICBsb2NhbCBydWxlIGlzLWVxdWFsLXRlc3QgKCB4IHkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAkKHgpID0gJCh5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydC5yZXN1bHQgMyAzIDMgOiBzZXF1ZW5jZS5maWx0ZXIgaXMtZXF1YWwtdGVzdCAzIDogMSAyIDMgNCAzIDUgMyA1IDcgOworCisgICAgICAgIGxvY2FsIHJ1bGUgYXBwZW5kLXggKCBuICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICQobil4IDsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydC5yZXN1bHQgMXggMnggM3ggOiBzZXF1ZW5jZS50cmFuc2Zvcm0gYXBwZW5kLXggOiAxIDIgMyA7CisKKyAgICAgICAgbG9jYWwgcnVsZSByZXBlYXQyICggeCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAkKHgpICQoeCkgOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCAxIDEgMiAyIDMgMyA6IHNlcXVlbmNlLnRyYW5zZm9ybSByZXBlYXQyIDogMSAyIDMgOworCisgICAgICAgIGxvY2FsIHJ1bGUgdGVzdC1ncmVhdGVyICggYSBiICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgJChhKSA+ICQoYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0LnJlc3VsdCAxIDIgMyA0IDUgNiA3IDggOSA6IHNlcXVlbmNlLmluc2VydGlvbi1zb3J0IDkgNiA1IDMgOCA3IDEgMiA0IDsKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCA5IDggNyA2IDUgNCAzIDIgMSA6IHNlcXVlbmNlLmluc2VydGlvbi1zb3J0IDkgNiA1IDMgOCA3IDEgMiA0IDogdGVzdC1ncmVhdGVyIDsKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCAxIDIgMyA0IDUgNiA6ICBzZXF1ZW5jZS5tZXJnZSAxIDMgNSA6IDIgNCA2IDsKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCA2IDUgNCAzIDIgMSA6ICBzZXF1ZW5jZS5tZXJnZSA1IDMgMSA6IDYgNCAyIDogdGVzdC1ncmVhdGVyIDsKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCAxIDIgMyA6IHNlcXVlbmNlLm1lcmdlIDEgMiAzIDogOworICAgICAgICBhc3NlcnQucmVzdWx0IDEgOiBzZXF1ZW5jZS5tZXJnZSAxIDogMSA7CisKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCBmb28tYmFyLWJheiA6IHNlcXVlbmNlLmpvaW4gZm9vIGJhciBiYXogOiAtIDsKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCBzdWJzdGFuZGFyZCA6IHNlcXVlbmNlLmpvaW4gc3ViIHN0YW4gZGFyZCA7CisgICAgICAgIGFzc2VydC5yZXN1bHQgMy4wLjEgOiBzZXF1ZW5jZS5qb2luIDMuMC4xIDogLSA7CisKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCAwIDogc2VxdWVuY2UubGVuZ3RoIDsKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCAzIDogc2VxdWVuY2UubGVuZ3RoIGEgYiBjIDsKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCAxNyA6IHNlcXVlbmNlLmxlbmd0aCAxNyAxNiAxNSAxNCAxMyAxMiAxMSAxMCA5IDggNyA2IDUgNCAzIDIgMSA7CisKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCAxIDogc2VxdWVuY2UubGVuZ3RoIGEgOworICAgICAgICBhc3NlcnQucmVzdWx0IDEwIDogc2VxdWVuY2UubGVuZ3RoIGEgYiBjIGQgZSBmIGcgaCBpIGogOworICAgICAgICBhc3NlcnQucmVzdWx0IDExIDogc2VxdWVuY2UubGVuZ3RoIGEgYiBjIGQgZSBmIGcgaCBpIGogayA7CisgICAgICAgIGFzc2VydC5yZXN1bHQgMTIgOiBzZXF1ZW5jZS5sZW5ndGggYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgOworCisgICAgICAgIGxvY2FsIHAyID0geCA7CisgICAgICAgIGZvciBsb2NhbCBpIGluIDEgMiAzIDQgNSA2IDcgOAorICAgICAgICB7CisgICAgICAgICAgICBwMiA9ICQocDIpICQocDIpIDsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQucmVzdWx0IDI1NiA6IHNlcXVlbmNlLmxlbmd0aCAkKHAyKSA7CisKKyAgICAgICAgYXNzZXJ0LnJlc3VsdCAxIDIgMyA0IDUgOiBzZXF1ZW5jZS51bmlxdWUgMSAyIDMgMiA0IDMgMyA1IDUgNSA7CisgICAgICAgICAgICAgICAgCisgICAgICAgIGFzc2VydC5yZXN1bHQgNSA6IHNlcXVlbmNlLm1heC1lbGVtZW50IDEgMyA1IDAgNCA7CisgICAgICAgIAorICAgICAgICBhc3NlcnQucmVzdWx0IGUtMyBoLTMgOiBzZXF1ZW5jZS5zZWxlY3QtaGlnaGVzdC1yYW5rZWQgZS0xIGUtMyBoLTMgbS0yIDogMSAzIDMgMiA7CisgICAgICAgIAorICAgICAgICBhc3NlcnQucmVzdWx0IDcgNiA1IDQgMyAyIDEgOiBzZXF1ZW5jZS5yZXZlcnNlIDEgMiAzIDQgNSA2IDcgOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9zZXQuamFtIGIvc3JjL2tlbmxtL2phbS1maWxlcy9ib29zdC1idWlsZC91dGlsL3NldC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxNzkxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9zZXQuamFtCkBAIC0wLDAgKzEsOTMgQEAKKyMgQ29weXJpZ2h0IDIwMDEsIDIwMDIgRGF2ZSBBYnJhaGFtcworIyBDb3B5cmlnaHQgMjAwMyBWbGFkaW1pciBQcnVzCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitjbGFzcyBzZXQKK3sKKyAgICBydWxlIF9faW5pdF9fICggKQorICAgIHsKKyAgICB9ICAKKyAgICAKKyAgICBydWxlIGFkZCAoIGVsZW1lbnRzICogKQorICAgIHsKKyAgICAgICAgZm9yIGxvY2FsIGUgaW4gJChlbGVtZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgISAkKCQoZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJChlKSA9IDEgOworICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ICs9ICQoZSkgOworICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAKKyAgICB9ICAgIAorICAgIAorICAgIHJ1bGUgY29udGFpbnMgKCBlbGVtZW50ICkKKyAgICB7CisgICAgICAgIHJldHVybiAkKCQoZWxlbWVudCkpIDsKKyAgICB9CisgICAgCisgICAgcnVsZSBsaXN0ICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoc2VsZi5yZXN1bHQpIDsKKyAgICB9ICAgICAgICAgICAgCit9CisKKworCisjIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHNldDEgdGhhdCBhcmUgbm90IGluIHNldDIuCisjCitydWxlIGRpZmZlcmVuY2UgKCBzZXQxICogOiBzZXQyICogKQoreworICAgIGxvY2FsIHJlc3VsdCA9IDsKKyAgICBmb3IgbG9jYWwgZWxlbWVudCBpbiAkKHNldDEpCisgICAgeworICAgICAgICBpZiAhICggJChlbGVtZW50KSBpbiAkKHNldDIpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICQoZWxlbWVudCkgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCitOQVRJVkVfUlVMRSBzZXQgOiBkaWZmZXJlbmNlIDsKKworCisjIFJlbW92ZXMgYWxsIHRoZSBpdGVtcyBhcHBlYXJpbmcgaW4gYm90aCBzZXQxICYgc2V0Mi4KKyMKK3J1bGUgaW50ZXJzZWN0aW9uICggc2V0MSAqIDogc2V0MiAqICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGZvciBsb2NhbCB2IGluICQoc2V0MSkKKyAgICB7CisgICAgICAgIGlmICQodikgaW4gJChzZXQyKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gJCh2KSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBSZXR1cm5zIHdoZXRoZXIgc2V0MSAmIHNldDIgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cy4gTm90ZSB0aGF0IHRoaXMgaWdub3JlcworIyBhbnkgZWxlbWVudCBvcmRlcmluZyBkaWZmZXJlbmNlcyBhcyB3ZWxsIGFzIGFueSBlbGVtZW50IGR1cGxpY2F0aW9uLgorIworcnVsZSBlcXVhbCAoIHNldDEgKiA6IHNldDIgKiApCit7CisgICAgaWYgJChzZXQxKSBpbiAkKHNldDIpICYmICggJChzZXQyKSBpbiAkKHNldDEpICkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlIDsKKyAgICB9Cit9CisKKworcnVsZSBfX3Rlc3RfXyAoICkKK3sKKyAgICBpbXBvcnQgYXNzZXJ0IDsKKworICAgIGFzc2VydC5yZXN1bHQgMCAxIDQgNiA4IDkgOiBkaWZmZXJlbmNlICAgMCAxIDIgMyA0IDUgNiA3IDggOSA6IDIgMyA1IDcgOworICAgIGFzc2VydC5yZXN1bHQgMiA1IDcgICAgICAgOiBpbnRlcnNlY3Rpb24gMCAxIDIgICA0IDUgNiA3IDggOSA6IDIgMyA1IDcgOworCisgICAgYXNzZXJ0LnRydWUgIGVxdWFsICAgICAgICAgOiAgICAgICAgIDsKKyAgICBhc3NlcnQudHJ1ZSAgZXF1YWwgMSAxIDIgMyA6IDMgMiAyIDEgOworICAgIGFzc2VydC5mYWxzZSBlcXVhbCAyIDMgICAgIDogMyAyIDIgMSA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvc3RyaW5nLmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC9zdHJpbmcuamFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOWVkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvc3RyaW5nLmphbQpAQCAtMCwwICsxLDE4OSBAQAorIyBDb3B5cmlnaHQgMjAwMiBEYXZlIEFicmFoYW1zCisjIENvcHlyaWdodCAyMDAyLCAyMDAzIFJlbmUgUml2ZXJhCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitpbXBvcnQgcmVnZXggOworCisKKyMgQ2hhcmFjdGVycyBjb25zaWRlcmVkIHdoaXRlc3BhY2UsIGFzIGEgbGlzdC4KKy53aGl0ZXNwYWNlLWNoYXJzID0gIiAiICIJIiAiCisiIDsKKworIyBDaGFyYWN0ZXJzIGNvbnNpZGVyZWQgd2hpdGVzcGFjZSwgYXMgYSBzaW5nbGUgc3RyaW5nLgorLndoaXRlc3BhY2UgPSAkKC53aGl0ZXNwYWNlLWNoYXJzOko9IiIpIDsKKworCisjIFJldHVybnMgdGhlIGNhbm9uaWNhbCBzZXQgb2Ygd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLCBhcyBhIGxpc3QuCisjCitydWxlIHdoaXRlc3BhY2UtY2hhcnMgKCApCit7CisgICAgcmV0dXJuICQoLndoaXRlc3BhY2UtY2hhcnMpIDsKK30KKworCisjIFJldHVybnMgdGhlIGNhbm9uaWNhbCBzZXQgb2Ygd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLCBhcyBhIHNpbmdsZSBzdHJpbmcuCisjCitydWxlIHdoaXRlc3BhY2UgKCApCit7CisgICAgcmV0dXJuICQoLndoaXRlc3BhY2UpIDsKK30KKworCisjIFNwbGl0cyB0aGUgZ2l2ZW4gc3RyaW5nIGludG8gYSBsaXN0IG9mIHN0cmluZ3MgY29tcG9zZWQgb2YgZWFjaCBjaGFyYWN0ZXIgb2YKKyMgdGhlIHN0cmluZyBpbiBzZXF1ZW5jZS4KKyMKK3J1bGUgY2hhcnMgKAorICAgIHN0cmluZyAgIyBUaGUgc3RyaW5nIHRvIHNwbGl0LgorICAgICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIHdoaWxlICQoc3RyaW5nKQorICAgIHsKKyAgICAgICAgbG9jYWwgcyA9IFsgTUFUQ0ggKC4/KSguPykoLj8pKC4/KSguPykoLj8pKC4/KSguPykoLiopIDogJChzdHJpbmcpIF0gOworICAgICAgICBzdHJpbmcgPSAkKHNbOV0pIDsKKyAgICAgICAgcmVzdWx0ICs9ICQoc1sxLThdKSA7CisgICAgfQorCisgICAgIyBUcmltIG9mZiBlbXB0eSBzdHJpbmdzLgorICAgIHdoaWxlICQocmVzdWx0WzFdKSAmJiAhICQocmVzdWx0Wy0xXSkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9ICQocmVzdWx0WzEtLTJdKSA7CisgICAgfQorCisgICAgcmV0dXJuICQocmVzdWx0KSA7Cit9CisKKworIyBBcHBseSBhIHNldCBvZiBzdGFuZGFyZCB0cmFuc2Zvcm1hdGlvbnMgdG8gc3RyaW5nIHRvIHByb2R1Y2UgYW4gYWJicmV2aWF0aW9uCisjIG5vIG1vcmUgdGhhbiA1IGNoYXJhY3RlcnMgbG9uZy4KKyMKK3J1bGUgYWJicmV2aWF0ZSAoIHN0cmluZyApCit7CisgICAgbG9jYWwgciA9ICQoLmFiYnJldmlhdGVkLSQoc3RyaW5nKSkgOworICAgIGlmICQocikKKyAgICB7CisgICAgICAgIHJldHVybiAkKHIpIDsKKyAgICB9CisgICAgIyBBbnl0aGluZyBsZXNzIHRoYW4gNCBjaGFyYWN0ZXJzIGdldHMgbm8gYWJicmV2aWF0aW9uLgorICAgIGVsc2UgaWYgISBbIE1BVENIICguLi4uKSA6ICQoc3RyaW5nKSBdCisgICAgeworICAgICAgICAuYWJicmV2aWF0ZWQtJChzdHJpbmcpID0gJChzdHJpbmcpIDsKKyAgICAgICAgcmV0dXJuICQoc3RyaW5nKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICMgU2VwYXJhdGUgdGhlIGluaXRpYWwgbGV0dGVyIGluIGNhc2UgaXQncyBhIHZvd2VsLgorICAgICAgICBsb2NhbCBzMSA9IFsgTUFUQ0ggXiguKSguKikgOiAkKHN0cmluZykgXSA7CisKKyAgICAgICAgIyBEcm9wIHRyYWlsaW5nICJpbmciLgorICAgICAgICBsb2NhbCBzMiA9IFsgTUFUQ0ggXiguKilpbmckIDogJChzMVsyXSkgXSA7CisgICAgICAgIHMyID89ICQoczFbMl0pIDsKKworICAgICAgICAjIFJlZHVjZSBhbGwgZG91YmxlZCBjaGFyYWN0ZXJzIHRvIG9uZS4KKyAgICAgICAgbG9jYWwgbGFzdCA9ICIiIDsKKyAgICAgICAgZm9yIGxvY2FsIGMgaW4gWyBjaGFycyAkKHMyKSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICQoYykgIT0gJChsYXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIgKz0gJChjKSA7CisgICAgICAgICAgICAgICAgbGFzdCA9ICQoYykgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHMyID0gJChyOko9IiIpIDsKKworICAgICAgICAjIENob3AgYWxsIHZvd2VscyBvdXQgb2YgdGhlIHJlbWFpbmRlci4KKyAgICAgICAgczIgPSBbIHJlZ2V4LnJlcGxhY2UgJChzMikgW0FFSU9VYWVpb3VdICIiIF0gOworCisgICAgICAgICMgU2hvcnRlbiByZW1haW5pbmcgY29uc29uYW50cyB0byA0IGNoYXJhY3RlcnMuCisgICAgICAgIHMyID0gWyBNQVRDSCBeKC4/Lj8uPy4/KSA6ICQoczIpIF0gOworCisgICAgICAgICMgR2x1ZSB0aGUgaW5pdGlhbCBjaGFyYWN0ZXIgYmFjayBvbiB0byB0aGUgZnJvbnQuCisgICAgICAgIHMyID0gJChzMVsxXSkkKHMyKSA7CisKKyAgICAgICAgLmFiYnJldmlhdGVkLSQoc3RyaW5nKSA9ICQoczIpIDsKKyAgICAgICAgcmV0dXJuICQoczIpIDsKKyAgICB9Cit9CisKKworIyBDb25jYXRlbmF0ZXMgdGhlIGdpdmVuIHN0cmluZ3MsIGluc2VydGluZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yIGJldHdlZW4gZWFjaAorIyBzdHJpbmcuCisjCitydWxlIGpvaW4gKAorICAgIHN0cmluZ3MgKiAgIyBUaGUgc3RyaW5ncyB0byBqb2luLgorICAgIDogc2VwYXJhdG9yID8gICMgVGhlIG9wdGlvbmFsIHNlcGFyYXRvci4KKyAgICApCit7CisgICAgc2VwYXJhdG9yID89ICIiIDsKKyAgICByZXR1cm4gJChzdHJpbmdzOko9JChzZXBhcmF0b3IpKSA7Cit9CisKKworIyBTcGxpdCBhIHN0cmluZyBpbnRvIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLgorIworcnVsZSB3b3JkcyAoCisgICAgc3RyaW5nICAjIFRoZSBzdHJpbmcgdG8gc3BsaXQuCisgICAgOiB3aGl0ZXNwYWNlICogICMgT3B0aW9uYWwsIGNoYXJhY3RlcnMgdG8gY29uc2lkZXIgYXMgd2hpdGVzcGFjZS4KKyAgICApCit7CisgICAgd2hpdGVzcGFjZSA9ICQod2hpdGVzcGFjZTpKPSIiKSA7CisgICAgd2hpdGVzcGFjZSA/PSAkKC53aGl0ZXNwYWNlKSA7CisgICAgbG9jYWwgdyA9IDsKKyAgICB3aGlsZSAkKHN0cmluZykKKyAgICB7CisgICAgICAgIHN0cmluZyA9IFsgTUFUQ0ggIl5bJCh3aGl0ZXNwYWNlKV0qKFteJCh3aGl0ZXNwYWNlKV0qKSguKikiIDogJChzdHJpbmcpIF0gOworICAgICAgICBpZiAkKHN0cmluZ1sxXSkgJiYgJChzdHJpbmdbMV0pICE9ICIiCisgICAgICAgIHsKKyAgICAgICAgICAgIHcgKz0gJChzdHJpbmdbMV0pIDsKKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgPSAkKHN0cmluZ1syXSkgOworICAgIH0KKyAgICByZXR1cm4gJCh3KSA7Cit9CisKKworIyBDaGVjayB0aGF0IHRoZSBnaXZlbiBzdHJpbmcgaXMgY29tcG9zZWQgZW50aXJlbHkgb2Ygd2hpdGVzcGFjZS4KKyMKK3J1bGUgaXMtd2hpdGVzcGFjZSAoCisgICAgc3RyaW5nID8gICMgVGhlIHN0cmluZyB0byB0ZXN0LgorICAgICkKK3sKKyAgICBpZiAhICQoc3RyaW5nKSB7IHJldHVybiB0cnVlIDsgfQorICAgIGVsc2UgaWYgJChzdHJpbmcpID0gIiIgeyByZXR1cm4gdHJ1ZSA7IH0KKyAgICBlbHNlIGlmIFsgTUFUQ0ggIl4oWyQoLndoaXRlc3BhY2UpXSspJCIgOiAkKHN0cmluZykgXSB7IHJldHVybiB0cnVlIDsgfQorICAgIGVsc2UgeyByZXR1cm4gOyB9Cit9CisKK3J1bGUgX190ZXN0X18gKCApCit7CisgICAgaW1wb3J0IGFzc2VydCA7CisgICAgYXNzZXJ0LnJlc3VsdCBhIGIgYyA6IGNoYXJzIGFiYyA7CisKKyAgICBhc3NlcnQucmVzdWx0IHJudG0gOiBhYmJyZXZpYXRlIHJ1bnRpbWUgOworICAgIGFzc2VydC5yZXN1bHQgb3ZybGQgOiBhYmJyZXZpYXRlIG92ZXJsb2FkIDsKKyAgICBhc3NlcnQucmVzdWx0IGRiZyA6IGFiYnJldmlhdGUgZGVidWdnaW5nIDsKKyAgICBhc3NlcnQucmVzdWx0IGFzeW5jIDogYWJicmV2aWF0ZSBhc3luY2hyb25vdXMgOworICAgIGFzc2VydC5yZXN1bHQgcG9wIDogYWJicmV2aWF0ZSBwb3AgOworICAgIGFzc2VydC5yZXN1bHQgYWFhIDogYWJicmV2aWF0ZSBhYWEgOworICAgIGFzc2VydC5yZXN1bHQgcWNrIDogYWJicmV2aWF0ZSBxdWFjayA7CisgICAgYXNzZXJ0LnJlc3VsdCBzdHRjIDogYWJicmV2aWF0ZSBzdGF0aWMgOworCisgICAgIyBDaGVjayBib3VuZGFyeSBjYXNlcy4KKyAgICBhc3NlcnQucmVzdWx0IGEgOiBjaGFycyBhIDsKKyAgICBhc3NlcnQucmVzdWx0IDogY2hhcnMgIiIgOworICAgIGFzc2VydC5yZXN1bHQgYSBiIGMgZCBlIGYgZyBoIDogY2hhcnMgYWJjZGVmZ2ggOworICAgIGFzc2VydC5yZXN1bHQgYSBiIGMgZCBlIGYgZyBoIGkgOiBjaGFycyBhYmNkZWZnaGkgOworICAgIGFzc2VydC5yZXN1bHQgYSBiIGMgZCBlIGYgZyBoIGkgaiA6IGNoYXJzIGFiY2RlZmdoaWogOworICAgIGFzc2VydC5yZXN1bHQgYSBiIGMgZCBlIGYgZyBoIGkgaiBrIDogY2hhcnMgYWJjZGVmZ2hpamsgOworCisgICAgYXNzZXJ0LnJlc3VsdCBhLy9iL2MvZCA6IGpvaW4gYSAiIiBiIGMgZCA6IC8gOworICAgIGFzc2VydC5yZXN1bHQgYWJjZCA6IGpvaW4gIGEgIiIgYiBjIGQgOworCisgICAgYXNzZXJ0LnJlc3VsdCBhIGIgYyA6IHdvcmRzICJhIGIJYyIgOworCisgICAgYXNzZXJ0LnRydWUgaXMtd2hpdGVzcGFjZSAiICAgICAJIiA7CisgICAgYXNzZXJ0LmZhbHNlIGlzLXdoaXRlc3BhY2UgIiAgYSBiIGMJIiA7CisgICAgYXNzZXJ0LnRydWUgaXMtd2hpdGVzcGFjZSAiIiA7CisgICAgYXNzZXJ0LnRydWUgaXMtd2hpdGVzcGFjZSA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvdXRpbGl0eS5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2Jvb3N0LWJ1aWxkL3V0aWwvdXRpbGl0eS5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5ODFjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvYm9vc3QtYnVpbGQvdXRpbC91dGlsaXR5LmphbQpAQCAtMCwwICsxLDIzNSBAQAorIyBDb3B5cmlnaHQgMjAwMSwgMjAwMiBEYXZlIEFicmFoYW1zCisjIENvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFZsYWRpbWlyIFBydXMKKyMgQ29weXJpZ2h0IDIwMDggSnVya28gR29zcG9kbmV0aWMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2ltcG9ydCAiY2xhc3MiIDogaXMtaW5zdGFuY2UgOworCisKKyMgRm9yIGFsbCBlbGVtZW50cyBvZiAnbGlzdCcgd2hpY2ggZG8gbm90IGFscmVhZHkgaGF2ZSAnc3VmZml4JywgYWRkICdzdWZmaXgnLgorIworcnVsZSBhcHBseS1kZWZhdWx0LXN1ZmZpeCAoIHN1ZmZpeCA6IGxpc3QgKiApCit7CisgICAgbG9jYWwgcmVzdWx0IDsKKyAgICBmb3IgbG9jYWwgaSBpbiAkKGxpc3QpCisgICAgeworICAgICAgICBpZiAkKGk6UykgPSAkKHN1ZmZpeCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICQoaSkgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICQoaSkkKHN1ZmZpeCkgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgSWYgJ25hbWUnIGNvbnRhaW5zIGEgZG90LCByZXR1cm5zIHRoZSBwYXJ0IGJlZm9yZSB0aGUgbGFzdCBkb3QuIElmICduYW1lJworIyBjb250YWlucyBubyBkb3QsIHJldHVybnMgaXQgdW5tb2RpZmllZC4KKyMKK3J1bGUgYmFzZW5hbWUgKCBuYW1lICkKK3sKKyAgICBpZiAkKG5hbWU6UykKKyAgICB7CisgICAgICAgIG5hbWUgPSAkKG5hbWU6QikgOworICAgIH0KKyAgICByZXR1cm4gJChuYW1lKSA7Cit9CisKKworIyBSZXR1cm4gdGhlIGZpbGUgb2YgdGhlIGNhbGxlciBvZiB0aGUgcnVsZSB0aGF0IGNhbGxlZCBjYWxsZXItZmlsZS4KKyMKK3J1bGUgY2FsbGVyLWZpbGUgKCApCit7CisgICAgbG9jYWwgYnQgPSBbIEJBQ0tUUkFDRSBdIDsKKyAgICByZXR1cm4gJChidFs5XSkgOworfQorCisKKyMgVGVzdHMgaWYgJ2EnIGlzIGVxdWFsIHRvICdiJy4gSWYgJ2EnIGlzIGEgY2xhc3MgaW5zdGFuY2UsIGNhbGxzIGl0cyAnZXF1YWwnCisjIG1ldGhvZC4gVXNlcyBvcmRpbmFyeSBqYW0ncyBjb21wYXJpc29uIG90aGVyd2lzZS4KKyMKK3J1bGUgZXF1YWwgKCBhIGIgKQoreworICAgIGlmIFsgaXMtaW5zdGFuY2UgJChhKSBdCisgICAgeworICAgICAgICByZXR1cm4gWyAkKGEpLmVxdWFsICQoYikgXSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICQoYSkgPSAkKGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIFRlc3RzIGlmICdhJyBpcyBsZXNzIHRoYW4gJ2InLiBJZiAnYScgaXMgYSBjbGFzcyBpbnN0YW5jZSwgY2FsbHMgaXRzICdsZXNzJworIyBtZXRob2QuIFVzZXMgb3JkaW5hcnkgamFtJ3MgY29tcGFyaXNvbiBvdGhlcndpc2UuCisjCitydWxlIGxlc3MgKCBhIGIgKQoreworICAgIGlmIFsgaXMtaW5zdGFuY2UgJChhKSBdCisgICAgeworICAgICAgICByZXR1cm4gWyAkKGEpLmxlc3MgJChiKSBdIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgJChhKSA8ICQoYikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWUgOworICAgICAgICB9CisgICAgfQorfQorCisKKyMgUmV0dXJucyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBhcmd1bWVudC4gSWYgaXQgaXMgYSBjbGFzcyBpbnN0YW5jZSwKKyMgY2xhc3MgaXRzICdzdHInIG1ldGhvZC4gT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBhcmd1bWVudC4KKyMKK3J1bGUgc3RyICggdmFsdWUgKQoreworICAgIGlmIFsgaXMtaW5zdGFuY2UgJCh2YWx1ZSkgXQorICAgIHsKKyAgICAgICAgcmV0dXJuIFsgJCh2YWx1ZSkuc3RyIF0gOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gJCh2YWx1ZSkgOworICAgIH0KK30KKworCisjIEFjY2VwdHMgYSBsaXN0IG9mIGdyaXN0ZWQgdmFsdWVzIGFuZCByZXR1cm5zIHRoZW0gdW5ncmlzdGVkLiBSZXBvcnRzIGFuIGVycm9yCisjIGluIGNhc2UgYW55IG9mIHRoZSBwYXNzZWQgcGFyYW1ldGVycyBpcyBub3QgZ3Jpc3RlZCwgaS5lLiBzdXJyb3VuZGVkIGluIGFuZ2xlCisjIGJyYWNrZXRzIDwgYW5kID4uCisjCitydWxlIHVuZ3Jpc3QgKCBuYW1lcyAqICkKK3sKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGZvciBsb2NhbCBuYW1lIGluICQobmFtZXMpCisgICAgeworICAgICAgICBsb2NhbCBzdHJpcHBlZCA9IFsgTUFUQ0ggXjwoLiopPiQgOiAkKG5hbWUpIF0gOworICAgICAgICBpZiAhICQoc3RyaXBwZWQpLWRlZmluZWQKKyAgICAgICAgeworICAgICAgICAgICAgaW1wb3J0IGVycm9ycyA7CisgICAgICAgICAgICBsb2NhbCBxdW90ZWQtbmFtZXMgPSBcIiQobmFtZXMpXCIgOworICAgICAgICAgICAgZXJyb3JzLmVycm9yICJpbiIgdW5ncmlzdCAkKHF1b3RlZC1uYW1lczpKPSIgIik6IFwiJChuYW1lKVwiIGlzIG5vdAorICAgICAgICAgICAgICAgIG9mIHRoZSBmb3JtIDwuKj4gOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSAkKHN0cmlwcGVkKSA7CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorCisKKyMgSWYgdGhlIHBhc3NlZCB2YWx1ZSBpcyBxdW90ZWQsIHVucXVvdGVzIGl0LiBPdGhlcndpc2UgcmV0dXJucyB0aGUgdmFsdWUKKyMgdW5jaGFuZ2VkLgorIworcnVsZSB1bnF1b3RlICggdmFsdWUgPyApCit7CisgICAgbG9jYWwgbWF0Y2gtcmVzdWx0ID0gWyBNQVRDSCBeKFwiKSguKikoXCIpJCA6ICQodmFsdWUpIF0gOworICAgIGlmICQobWF0Y2gtcmVzdWx0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICQobWF0Y2gtcmVzdWx0WzJdKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAkKHZhbHVlKSA7CisgICAgfQorfQorCisKK3J1bGUgX190ZXN0X18gKCApCit7CisgICAgaW1wb3J0IGFzc2VydCA7CisgICAgaW1wb3J0ICJjbGFzcyIgOiBuZXcgOworICAgIGltcG9ydCBlcnJvcnMgOiB0cnkgY2F0Y2ggOworCisgICAgYXNzZXJ0LnJlc3VsdCAxMjMgOiBzdHIgMTIzIDsKKworICAgIGNsYXNzIHRlc3QtY2xhc3NfXworICAgIHsKKyAgICAgICAgcnVsZSBfX2luaXRfXyAoICAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgcnVsZSBzdHIgICAgICAoICAgKSB7IHJldHVybiAic3RyLXRlc3QtY2xhc3MiICA7IH0KKyAgICAgICAgcnVsZSBsZXNzICAgICAoIGEgKSB7IHJldHVybiAieWVzLCBvZiBjb3Vyc2UhIiA7IH0KKyAgICAgICAgcnVsZSBlcXVhbCAgICAoIGEgKSB7IHJldHVybiAibm90IHN1cmUiICAgICAgICA7IH0KKyAgICB9CisKKyAgICBhc3NlcnQucmVzdWx0ICJzdHItdGVzdC1jbGFzcyIgOiBzdHIgWyBuZXcgdGVzdC1jbGFzc19fIF0gOworICAgIGFzc2VydC50cnVlIGxlc3MgMSAyIDsKKyAgICBhc3NlcnQuZmFsc2UgbGVzcyAyIDEgOworICAgIGFzc2VydC5yZXN1bHQgInllcywgb2YgY291cnNlISIgOiBsZXNzIFsgbmV3IHRlc3QtY2xhc3NfXyBdIDEgOworICAgIGFzc2VydC50cnVlIGVxdWFsIDEgMSA7CisgICAgYXNzZXJ0LmZhbHNlIGVxdWFsIDEgMiA7CisgICAgYXNzZXJ0LnJlc3VsdCAibm90IHN1cmUiIDogZXF1YWwgWyBuZXcgdGVzdC1jbGFzc19fIF0gMSA7CisKKyAgICBhc3NlcnQucmVzdWx0IGZvby5saWIgZm9vLmxpYiA6IGFwcGx5LWRlZmF1bHQtc3VmZml4IC5saWIgOiBmb28ubGliIGZvby5saWIKKyAgICAgICAgOworCisgICAgYXNzZXJ0LnJlc3VsdCBmb28gOiBiYXNlbmFtZSBmb28gOworICAgIGFzc2VydC5yZXN1bHQgZm9vIDogYmFzZW5hbWUgZm9vLnNvIDsKKyAgICBhc3NlcnQucmVzdWx0IGZvby5zbyA6IGJhc2VuYW1lIGZvby5zby4xIDsKKworICAgIGFzc2VydC5yZXN1bHQgICAgICAgICA6IHVucXVvdGUgOworICAgIGFzc2VydC5yZXN1bHQgIiIgICAgICA6IHVucXVvdGUgIiIgOworICAgIGFzc2VydC5yZXN1bHQgIiIgICAgICA6IHVucXVvdGUgXCJcIiA7CisgICAgYXNzZXJ0LnJlc3VsdCBcIiAgICAgIDogdW5xdW90ZSBcIlwiXCIgOworICAgIGFzc2VydC5yZXN1bHQgXCJcIiAgICA6IHVucXVvdGUgXCJcIlwiXCIgOworICAgIGFzc2VydC5yZXN1bHQgZm9vICAgICA6IHVucXVvdGUgZm9vIDsKKyAgICBhc3NlcnQucmVzdWx0IFwiZm9vICAgOiB1bnF1b3RlIFwiZm9vIDsKKyAgICBhc3NlcnQucmVzdWx0IGZvb1wiICAgOiB1bnF1b3RlIGZvb1wiIDsKKyAgICBhc3NlcnQucmVzdWx0IGZvbyAgICAgOiB1bnF1b3RlIFwiZm9vXCIgOworICAgIGFzc2VydC5yZXN1bHQgXCJmb29cIiA6IHVucXVvdGUgXCJcImZvb1wiXCIgOworCisgICAgYXNzZXJ0LnJlc3VsdCAgICAgICAgIDogdW5ncmlzdCA7CisgICAgYXNzZXJ0LnJlc3VsdCAiIiAgICAgIDogdW5ncmlzdCA8PiA7CisgICAgYXNzZXJ0LnJlc3VsdCBmb28gICAgIDogdW5ncmlzdCA8Zm9vPiA7CisgICAgYXNzZXJ0LnJlc3VsdCA8Zm9vPiAgIDogdW5ncmlzdCA8PGZvbz4+IDsKKyAgICBhc3NlcnQucmVzdWx0IGZvbyBiYXIgOiB1bmdyaXN0IDxmb28+IDxiYXI+IDsKKworICAgIHRyeSA7CisgICAgeworICAgICAgICB1bmdyaXN0ICIiIDsKKyAgICB9CisgICAgY2F0Y2ggImluIiB1bmdyaXN0IFwiXCI6IFwiXCIgaXMgbm90IG9mIHRoZSBmb3JtIDwuKj4gOworCisgICAgdHJ5IDsKKyAgICB7CisgICAgICAgIHVuZ3Jpc3QgZm9vIDsKKyAgICB9CisgICAgY2F0Y2ggImluIiB1bmdyaXN0IFwiZm9vXCI6IFwiZm9vXCIgaXMgbm90IG9mIHRoZSBmb3JtIDwuKj4gOworCisgICAgdHJ5IDsKKyAgICB7CisgICAgICAgIHVuZ3Jpc3QgPGZvbyA7CisgICAgfQorICAgIGNhdGNoICJpbiIgdW5ncmlzdCBcIjxmb29cIjogXCI8Zm9vXCIgaXMgbm90IG9mIHRoZSBmb3JtIDwuKj4gOworCisgICAgdHJ5IDsKKyAgICB7CisgICAgICAgIHVuZ3Jpc3QgZm9vPiA7CisgICAgfQorICAgIGNhdGNoICJpbiIgdW5ncmlzdCBcImZvbz5cIjogXCJmb28+XCIgaXMgbm90IG9mIHRoZSBmb3JtIDwuKj4gOworCisgICAgdHJ5IDsKKyAgICB7CisgICAgICAgIHVuZ3Jpc3QgZm9vIGJhciA7CisgICAgfQorICAgIGNhdGNoICJpbiIgdW5ncmlzdCAiXCJmb29cIiBcImJhclwiIjogXCJmb29cIiBpcyBub3Qgb2YgdGhlIGZvcm0gPC4qPiA7CisKKyAgICB0cnkgOworICAgIHsKKyAgICAgICAgdW5ncmlzdCBmb28gPGJhcj4gOworICAgIH0KKyAgICBjYXRjaCAiaW4iIHVuZ3Jpc3QgIlwiZm9vXCIgXCI8YmFyPlwiIjogXCJmb29cIiBpcyBub3Qgb2YgdGhlIGZvcm0gPC4qPiA7CisKKyAgICB0cnkgOworICAgIHsKKyAgICAgICAgdW5ncmlzdCA8Zm9vPiBiYXIgOworICAgIH0KKyAgICBjYXRjaCAiaW4iIHVuZ3Jpc3QgIlwiPGZvbz5cIiBcImJhclwiIjogXCJiYXJcIiBpcyBub3Qgb2YgdGhlIGZvcm0gPC4qPiA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VtcHR5X3Rlc3RfbWFpbi5jYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW1wdHlfdGVzdF9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTcxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VtcHR5X3Rlc3RfbWFpbi5jYwpAQCAtMCwwICsxLDggQEAKKy8qIFByb2dyYW0gdG8gdmVyaWZ5IGNvbXBpbGF0aW9uIGFnYWluc3QgdGhlIHVuaXQgdGVzdCBmcmFtZXdvcmsgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBFbXB0eVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK25hbWVzcGFjZSB7CitCT09TVF9BVVRPX1RFU1RfQ0FTRShFbXB0eSkge30KK30gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9KYW1iYXNlIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvSmFtYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGY4ZmJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvSmFtYmFzZQpAQCAtMCwwICsxLDI0NzMgQEAKKyMKKyMgLytcCisjICtcICAgIENvcHlyaWdodCAxOTkzLCAyMDAwIENocmlzdG9waGVyIFNlaXdhbGQuCisjIFwrLworIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyMKKworIyBUaGlzIGZpbGUgaXMgQUxTTzoKKyMgQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyMgQ29weXJpZ2h0IDIwMDItMjAwNCBSZW5lIFJpdmVyYS4KKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2lmICQoTlQpCit7CisgICAgU0xBU0ggPz0gXFwgOworfQorU0xBU0ggPz0gLyA7CisKKworIyBHbG9iIGZvciBwYXR0ZXJucyBpbiB0aGUgZGlyZWN0b3JpZXMgc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gc3RhcnQgZGlyZWN0b3J5LAorIyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSByb290IG9mIHRoZSBmaWxlLXN5c3RlbS4gV2Ugc3RvcCBnbG9iYmluZyBhcyBzb29uIGFzCisjIHdlIGZpbmQgYXQgbGVhc3Qgb25lIG1hdGNoLgorIworcnVsZSBmaW5kLXRvLXJvb3QgKCBkaXIgOiBwYXR0ZXJucyArICkKK3sKKyAgICBsb2NhbCBnbG9icyA9IFsgR0xPQiAkKGRpcikgOiAkKHBhdHRlcm5zKSBdIDsKKyAgICB3aGlsZSAhICQoZ2xvYnMpICYmICQoZGlyOlApICE9ICQoZGlyKQorICAgIHsKKyAgICAgICAgZGlyID0gJChkaXI6UCkgOworICAgICAgICBnbG9icyA9IFsgR0xPQiAkKGRpcikgOiAkKHBhdHRlcm5zKSBdIDsKKyAgICB9CisgICAgcmV0dXJuICQoZ2xvYnMpIDsKK30KKworCisjIFRoaXMgZ2xvYmFsIHdpbGwgaG9sZCB0aGUgbG9jYXRpb24gb2YgdGhlIHVzZXIncyBib29zdC1idWlsZC5qYW0gZmlsZS4KKy5ib29zdC1idWlsZC1maWxlID0gOworCisjIFRoaXMgZ2xvYmFsIHdpbGwgaG9sZCB0aGUgbG9jYXRpb24gb2YgdGhlIGJ1aWxkIHN5c3RlbSBib290c3RyYXAgZmlsZS4KKy5ib290c3RyYXAtZmlsZSA9IDsKKworIyBSZW1lbWJlciB0aGUgdmFsdWUgb2YgJChCT09TVF9CVUlMRF9QQVRIKSBzdXBwbGllZCB0byB1cyBieSB0aGUgdXNlci4KK0JPT1NUX0JVSUxEX1BBVEgudXNlci12YWx1ZSA9ICQoQk9PU1RfQlVJTERfUEFUSCkgOworCisjIE9uIFVuaXggb25seSwgd2hlbiBCT09TVF9CVUlMRF9QQVRIIGlzIG5vdCBzdXBwbGllZCBieSB0aGUgdXNlciwgc2V0IGl0IHRvIGEKKyMgc2Vuc2libGUgZGVmYXVsdCB2YWx1ZS4gVGhpcyBhbGxvd3MgQm9vc3QuQnVpbGQgdG8gd29yayB3aXRob3V0IGFueQorIyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHdoaWNoIGlzIGdvb2QgaW4gaXRzZWxmIGFuZCBhbHNvIHJlcXVpcmVkIGJ5IHRoZSBEZWJpYW4KKyMgUG9saWN5LgoraWYgISAkKEJPT1NUX0JVSUxEX1BBVEgpICYmICQoVU5JWCkKK3sKKyAgICBCT09TVF9CVUlMRF9QQVRIID0gL3Vzci9zaGFyZS9ib29zdC1idWlsZCA7Cit9CisKKworcnVsZSBfcG9rZSAoIG1vZHVsZS1uYW1lID8gOiB2YXJpYWJsZXMgKyA6IHZhbHVlICogKQoreworICAgIG1vZHVsZSAkKDwpCisgICAgeworICAgICAgICAkKD4pID0gJCgzKSA7CisgICAgfQorfQorCisKKyMgVGhpcyBydWxlIGNhbiBiZSBpbnZva2VkIGZyb20gYW4gb3B0aW9uYWwgdXNlcidzIGJvb3N0LWJ1aWxkLmphbSBmaWxlIHRvIGJvdGgKKyMgaW5kaWNhdGUgd2hlcmUgdG8gZmluZCB0aGUgYnVpbGQgc3lzdGVtIGZpbGVzLCBhbmQgdG8gbG9hZCB0aGVtLiBUaGUgcGF0aAorIyBpbmRpY2F0ZWQgaXMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBib29zdC1idWlsZC5qYW0gZmlsZS4KKyMKK3J1bGUgYm9vc3QtYnVpbGQgKCBkaXIgPyApCit7CisgICAgaWYgJCguYm9vdHN0cmFwLWZpbGUpCisgICAgeworICAgICAgICBFQ0hPICJFcnJvcjogSWxsZWdhbCBhdHRlbXB0IHRvIHJlLWJvb3RzdHJhcCB0aGUgYnVpbGQgc3lzdGVtIGJ5IGludm9raW5nIiA7CisgICAgICAgIEVDSE8gOworICAgICAgICBFQ0hPICIgICAnYm9vc3QtYnVpbGQiICQoZGlyKSAiOyciIDsKKyAgICAgICAgRUNITyA7CisgICAgICAgIEVYSVQgIlBsZWFzZSBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGF0ICdodHRwOi8vd3d3LmJvb3N0Lm9yZycuIiA7CisgICAgfQorCisgICAgIyBBZGQgdGhlIGdpdmVuIGRpcmVjdG9yeSB0byB0aGUgcGF0aCBzbyB3ZSBjYW4gZmluZCB0aGUgYnVpbGQgc3lzdGVtLiBJZgorICAgICMgZGlyIGlzIGVtcHR5LCBoYXMgbm8gZWZmZWN0LgorICAgIEJPT1NUX0JVSUxEX1BBVEggPSAkKGRpcjpSPSQoLmJvb3N0LWJ1aWxkLWZpbGU6RCkpICQoQk9PU1RfQlVJTERfUEFUSCkgOworCisgICAgIyBXZSBtaWdodCBoYXZlIGp1c3QgbW9kaWZpZWQgdGhlICpnbG9iYWwqIHZhbHVlIG9mIEJPT1NUX0JVSUxEX1BBVEguIFRoZQorICAgICMgY29kZSB0aGF0IGxvYWRzIHRoZSByZXN0IG9mIEJvb3N0LkJ1aWxkLCBpbiBwYXJ0aWN1bGFyIHRoZSBzaXRlLWNvbmZpZy5qYW0KKyAgICAjIGFuZCB1c2VyLWNvbmZpZy5qYW0gY29uZmlndXJhdGlvbiBmaWxlcyB1c2VzIG9zLmVudmlyb24sIHNvIHdlIG5lZWQgdG8KKyAgICAjIHVwZGF0ZSB0aGUgdmFsdWUgdGhlcmUuCisgICAgX3Bva2UgLkVOVklST04gOiBCT09TVF9CVUlMRF9QQVRIIDogJChCT09TVF9CVUlMRF9QQVRIKSA7CisKKyAgICAjIFRyeSB0byBmaW5kIHRoZSBidWlsZCBzeXN0ZW0gYm9vdHN0cmFwIGZpbGUgJ2Jvb3RzdHJhcC5qYW0nLgorICAgIGxvY2FsIGJvb3RzdHJhcC1maWxlID0gWyBHTE9CICQoQk9PU1RfQlVJTERfUEFUSCkgOiBib290c3RyYXAuamFtIF0gOworICAgIC5ib290c3RyYXAtZmlsZSA9ICQoYm9vdHN0cmFwLWZpbGVbMV0pIDsKKworICAgICMgVGhlcmUgaXMgbm8gYm9vdHN0cmFwLmphbSB3ZSBjYW4gZmluZCwgZXhpdCB3aXRoIGFuIGVycm9yLgorICAgIGlmICEgJCguYm9vdHN0cmFwLWZpbGUpCisgICAgeworICAgICAgICBFQ0hPICJVbmFibGUgdG8gbG9hZCBCb29zdC5CdWlsZDogY291bGQgbm90IGZpbmQgYnVpbGQgc3lzdGVtLiIgOworICAgICAgICBFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA7CisgICAgICAgIEVDSE8gIiQoLmJvb3N0LWJ1aWxkLWZpbGUpIGF0dGVtcHRlZCB0byBsb2FkIHRoZSBidWlsZCBzeXN0ZW0gYnkgaW52b2tpbmciIDsKKyAgICAgICAgRUNITyA7CisgICAgICAgIEVDSE8gIiAgICdib29zdC1idWlsZCIgJChkaXIpICI7JyIgOworICAgICAgICBFQ0hPIDsKKyAgICAgICAgRUNITyAiYnV0IHdlIHdlcmUgdW5hYmxlIHRvIGZpbmQgXCJib290c3RyYXAuamFtXCIgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkiIDsKKyAgICAgICAgRUNITyAib3IgaW4gQk9PU1RfQlVJTERfUEFUSCAoc2VhcmNoaW5nICIkKEJPT1NUX0JVSUxEX1BBVEg6Sj0iLCAiKSIpLiIgOworICAgICAgICBFQ0hPIDsKKyAgICAgICAgRVhJVCAiUGxlYXNlIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gYXQgJ2h0dHA6Ly93d3cuYm9vc3Qub3JnJy4iIDsKKyAgICB9CisKKyAgICBpZiBbIE1BVENIIC4qKC0tZGVidWctY29uZmlndXJhdGlvbikuKiA6ICQoQVJHVikgXQorICAgIHsKKyAgICAgICAgRUNITyAibm90aWNlOiBsb2FkaW5nIEJvb3N0LkJ1aWxkIGZyb20iCisgICAgICAgICAgICBbIE5PUk1BTElaRV9QQVRIICQoLmJvb3RzdHJhcC1maWxlOkQpIF0gOworICAgIH0KKworICAgICMgTG9hZCB0aGUgYnVpbGQgc3lzdGVtLCBub3cgdGhhdCB3ZSBrbm93IHdoZXJlIHRvIHN0YXJ0IGZyb20uCisgICAgaW5jbHVkZSAkKC5ib290c3RyYXAtZmlsZSkgOworfQorCisKK2lmIFsgTUFUQ0ggLiooYjIpLiogOiAkKEFSR1ZbMV06QkwpIF0gCisgIHx8IFsgTUFUQ0ggLiooYmphbSkuKiA6ICQoQVJHVlsxXTpCTCkgXQorICB8fCAkKEJPT1NUX1JPT1QpICAgICMgQSB0ZW1wb3JhcnkgbWVhc3VyZSBzbyBKYW0gd29ya3Mgd2l0aCBCb29zdC5CdWlsZCB2MS4KK3sKKyAgICAjIFdlIGF0dGVtcHQgdG8gbG9hZCAiYm9vc3QtYnVpbGQuamFtIiBieSBzZWFyY2hpbmcgZnJvbSB0aGUgY3VycmVudAorICAgICMgaW52b2NhdGlvbiBkaXJlY3RvcnkgdXAgdG8gdGhlIHJvb3Qgb2YgdGhlIGZpbGUtc3lzdGVtLgorICAgICMKKyAgICAjIGJvb3N0LWJ1aWxkLmphbSBpcyBleHBlY3RlZCB0byBpbnZva2UgdGhlICJib29zdC1idWlsZCIgcnVsZSB0byBsb2FkIHRoZQorICAgICMgQm9vc3QuQnVpbGQgZmlsZXMuCisKKyAgICBsb2NhbCBzZWFyY2gtcGF0aCA9ICQoQk9PU1RfQlVJTERfUEFUSCkgJChCT09TVF9ST09UKSA7CisgICAgbG9jYWwgc2VsZiA9IFsgU0VMRl9QQVRIIF0gOworICAgIGxvY2FsIGJvb3N0LWJ1aWxkLXJlbGF0aXZlID0gLi4vLi4vc2hhcmUvYm9vc3QtYnVpbGQgOworICAgIGxvY2FsIHNlbGYtYmFzZWQtcGF0aCA9IFsgTk9STUFMSVpFX1BBVEggJChib29zdC1idWlsZC1yZWxhdGl2ZTpSPSQoc2VsZikpIF0gOworCisgICAgbG9jYWwgYm9vc3QtYnVpbGQtZmlsZXMgPQorICAgICAgICBbIGZpbmQtdG8tcm9vdCBbIFBXRCBdIDogYm9vc3QtYnVpbGQuamFtIF0KKyAgICAgICAgWyBHTE9CICQoc2VsZi1iYXNlZC1wYXRoKSA6IGJvb3N0LWJ1aWxkLmphbSBdCisgICAgICAgICMgQW5vdGhlciB0ZW1wb3JhcnkgbWVhc3VyZSBzbyBKYW0gd29ya3Mgd2l0aCBCb29zdC5CdWlsZCB2MS4KKyAgICAgICAgWyBHTE9CICQoc2VhcmNoLXBhdGgpIDogYm9vc3QtYnVpbGQuamFtIF0gOworCisgICAgLmJvb3N0LWJ1aWxkLWZpbGUgPSAkKGJvb3N0LWJ1aWxkLWZpbGVzWzFdKSA7CisKKyAgICAjIFRoZXJlIGlzIG5vIGJvb3N0LWJ1aWxkLmphbSB3ZSBjYW4gZmluZCwgZXhpdCB3aXRoIGFuIGVycm9yLCBhbmQKKyAgICAjIGluZm9ybWF0aW9uLgorICAgIGlmICEgJCguYm9vc3QtYnVpbGQtZmlsZSkKKyAgICB7CisgICAgICAgIEVDSE8gIlVuYWJsZSB0byBsb2FkIEJvb3N0LkJ1aWxkOiBjb3VsZCBub3QgZmluZCBcImJvb3N0LWJ1aWxkLmphbVwiIiA7CisgICAgICAgIEVDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDsKKworICAgICAgICBpZiAhIFsgTUFUQ0ggLiooYmphbSkuKiA6ICQoQVJHVlsxXTpCTCkgXQorICAgICAgICB7CisgICAgICAgICAgICBFQ0hPICJCT09TVF9ST09UIG11c3QgYmUgc2V0LCBlaXRoZXIgaW4gdGhlIGVudmlyb25tZW50LCBvciAiIDsKKyAgICAgICAgICAgIEVDSE8gIm9uIHRoZSBjb21tYW5kLWxpbmUgd2l0aCAtc0JPT1NUX1JPT1Q9Li4uLCB0byB0aGUgcm9vdCIgOworICAgICAgICAgICAgRUNITyAib2YgdGhlIGJvb3N0IGluc3RhbGxhdGlvbi4iIDsKKyAgICAgICAgICAgIEVDSE8gOworICAgICAgICB9CisKKyAgICAgICAgRUNITyAiQXR0ZW1wdGVkIHNlYXJjaCBmcm9tIiBbIFBXRCBdICJ1cCB0byB0aGUgcm9vdCIgOworICAgICAgICBFQ0hPICJhdCIgJChzZWxmLWJhc2VkLXBhdGgpIDsKKyAgICAgICAgRUNITyAiYW5kIGluIHRoZXNlIGRpcmVjdG9yaWVzIGZyb20gQk9PU1RfQlVJTERfUEFUSCBhbmQgQk9PU1RfUk9PVDogIiQoc2VhcmNoLXBhdGg6Sj0iLCAiKSIuIiA7CisgICAgICAgIEVYSVQgIlBsZWFzZSBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGF0ICdodHRwOi8vd3d3LmJvb3N0Lm9yZycuIiA7CisgICAgfQorCisgICAgaWYgWyBNQVRDSCAuKigtLWRlYnVnLWNvbmZpZ3VyYXRpb24pLiogOiAkKEFSR1YpIF0KKyAgICB7CisgICAgICAgIEVDSE8gIm5vdGljZTogZm91bmQgYm9vc3QtYnVpbGQuamFtIGF0IgorICAgICAgICAgICAgWyBOT1JNQUxJWkVfUEFUSCAkKC5ib29zdC1idWlsZC1maWxlKSBdIDsKKyAgICB9CisKKyAgICAjIE5vdyBsb2FkIHRoZSBib29zdC1idWlsZC5qYW0gdG8gZ2V0IHRoZSBidWlsZCBzeXN0ZW0gbG9hZGVkLiBUaGlzCisgICAgIyBpbmNpZGVudGFseSBsb2FkcyB0aGUgdXNlcnMgamFtZmlsZSBhbmQgYXR0ZW1wdHMgdG8gYnVpbGQgdGFyZ2V0cy4KKyAgICAjCisgICAgIyBXZSBhbHNvIHNldCBpdCB1cCBzbyB3ZSBjYW4gdGVsbCB3aGV0aGVyIHdlIGFyZSBsb2FkaW5nIHRoZSBuZXcgVjIgc3lzdGVtCisgICAgIyBvciB0aGUgdGhlIG9sZCBWMSBzeXN0ZW0uCisgICAgaW5jbHVkZSAkKC5ib29zdC1idWlsZC1maWxlKSA7CisKKyAgICAjIENoZWNrIHRoYXQsIGF0IG1pbmltdW0sIHRoZSBib290c3RyYXAgZmlsZSB3YXMgZm91bmQuCisgICAgaWYgISAkKC5ib290c3RyYXAtZmlsZSkKKyAgICB7CisgICAgICAgIEVDSE8gIlVuYWJsZSB0byBsb2FkIEJvb3N0LkJ1aWxkIiA7CisgICAgICAgIEVDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gOworICAgICAgICBFQ0hPICJcIiQoLmJvb3N0LWJ1aWxkLWZpbGUpXCIgd2FzIGZvdW5kIGJ5IHNlYXJjaGluZyBmcm9tIiBbIFBXRCBdICJ1cCB0byB0aGUgcm9vdCIgOworICAgICAgICBFQ0hPICJhbmQgaW4gdGhlc2UgZGlyZWN0b3JpZXMgZnJvbSBCT09TVF9CVUlMRF9QQVRIIGFuZCBCT09TVF9ST09UOiAiJChzZWFyY2gtcGF0aDpKPSIsICIpIi4iIDsKKyAgICAgICAgRUNITyA7CisgICAgICAgIEVDSE8gIkhvd2V2ZXIsIGl0IGZhaWxlZCB0byBjYWxsIHRoZSBcImJvb3N0LWJ1aWxkXCIgcnVsZSB0byBpbmRpY2F0ZSIgOworICAgICAgICBFQ0hPICJ0aGUgbG9jYXRpb24gb2YgdGhlIGJ1aWxkIHN5c3RlbS4iIDsKKyAgICAgICAgRUNITyA7CisgICAgICAgIEVYSVQgIlBsZWFzZSBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGF0ICdodHRwOi8vd3d3LmJvb3N0Lm9yZycuIiA7CisgICAgfQorfQorZWxzZQoreworCisjCisjIEpBTUJBU0UgLSBqYW0gMi4zIHJ1bGVzZXQgcHJvdmlkaW5nIG1ha2UoMSktbGlrZSBmdW5jdGlvbmFsaXR5CisjCisjIFN1cHBvcnRzIFVOSVgsIE5ULCBhbmQgVk1TLgorIworIyAxMi8yNy85MyAoc2Vpd2FsZCkgLSBwdXJ0dXJiIGxpYnJhcnkgc291cmNlcyB3aXRoIFNPVVJDRV9HUklTVAorIyAwNC8xOC85NCAoc2Vpd2FsZCkgLSB1c2UgJz89JyB3aGVuIHNldHRpbmcgT1Mgc3BlY2lmaWMgdmFycworIyAwNC8yMS85NCAoc2Vpd2FsZCkgLSBkbyBSbVRlbXBzIHRvZ2V0aGVyCisjIDA1LzA1Lzk0IChzZWl3YWxkKSAtIGFsbCBzdXBwb3J0ZWQgQyBjb21waWxlcnMgc3VwcG9ydCAtbzogcmVsZWdhdGUKKyMgICAgICAgICAgICAgIFJFTE9DQVRFIGFzIGFuIG9wdGlvbjsgc2V0IFJhbmxpYiB0byAiIiB0byBkaXNhYmxlIGl0CisjIDA2LzAxLzk0IChzZWl3YWxkKSAtIG5ldyAnYWN0aW9ucyBleGlzdGluZycgdG8gZG8gZXhpc3Rpbmcgc291cmNlcworIyAwOC8yNS85NCAoc2Vpd2FsZCkgLSBuZXcgT2JqZWN0Q2NGbGFncyBydWxlIHRvIGFwcGVuZCB0byBwZXItdGFyZ2V0IENDRkxBR1MKKyMgMDgvMjkvOTQgKHNlaXdhbGQpIC0gbmV3IE9iamVjdEhkcnMgcnVsZSB0byBhcHBlbmQgdG8gcGVyLXRhcmdldCBIRFJTCisjIDA5LzE5Lzk0IChzZWl3YWxkKSAtIExpbmtMaWJyYXJpZXMgYW5kIFVuZGVmcyBub3cgYXBwZW5kCisjICAgICAgICAgICAgLSBSdWxlIG5hbWVzIGRvd25zaGlmdGVkLgorIyAxMC8wNi85NCAoc2Vpd2FsZCkgLSBEdW1iIHl5YWNjIHN0dWZmIG1vdmVkIGludG8gSmFtZmlsZS4KKyMgMTAvMTQvOTQgKHNlaXdhbGQpIC0gKENydWRlKSBzdXBwb3J0IGZvciAucywgLkMsIC5jYywgLmNwcCwgYW5kIC5mIGZpbGVzLgorIyAwMS8wOC85NSAoc2Vpd2FsZCkgLSBTaGVsbCBub3cgaGFuZGxlZCB3aXRoIGF3aywgbm90IHNlZAorIyAwMS8wOS85NSAoc2Vpd2FsZCkgLSBJbnN0YWxsKiBub3cgdGFrZSBkZXN0IGRpcmVjdG9yeSBhcyB0YXJnZXQKKyMgMDEvMTAvOTUgKHNlaXdhbGQpIC0gQWxsIGVudHJpZXMgc29ydGVkLgorIyAwMS8xMC85NSAoc2Vpd2FsZCkgLSBOVCBzdXBwb3J0IG1vdmVkIGluLCB3aXRoIExhdXJhVydzIGhlbHAuCisjIDAxLzEwLzk1IChzZWl3YWxkKSAtIFZNUyBzdXBwb3J0IG1vdmVkIGluLgorIyAwMi8wNi85NSAoc2Vpd2FsZCkgLSBPYmplY3RDKytGbGFncyBhbmQgU3ViRGlyQysrRmxhZ3MgYWRkZWQuCisjIDAyLzA3Lzk1IChzZWl3YWxkKSAtIElyb24gb3V0IHdoZW4gSERSU0VBUkNIIHVzZXMgIiIgb3IgU0VBUkNIX1NPVVJDRS4KKyMgMDIvMDgvOTUgKHNlaXdhbGQpIC0gU3ViRGlyIHdvcmtzIG9uIFZNUy4KKyMgMDIvMTQvOTUgKHNlaXdhbGQpIC0gTWtEaXIgYW5kIGVudG91cmFnZS4KKyMgMDQvMzAvOTUgKHNlaXdhbGQpIC0gVXNlIGluc3RhbGwgLWMgZmxhZyBzbyB0aGF0IGl0IGNvcGllcywgbm90IG1vdmVzLgorIyAwNy8xMC85NSAodGF5bG9yKSAtIFN1cHBvcnQgZm9yIE1pY3Jvc29mdCBDKysuCisjIDExLzIxLzk2IChwZXRlcmspIC0gU3VwcG9ydCBmb3IgQmVPUworIyAwNy8xOS85OSAoc2lja2VsKSAtIFN1cHBvcnQgZm9yIE1hYyBPUyBYIFNlcnZlciAoYW5kIG1heWJlIGNsaWVudCkKKyMgMDIvMTgvMDAgKGJlbG1vbnRlKS0gU3VwcG9ydCBmb3IgQ3lnd2luLgorCisjIFNwZWNpYWwgdGFyZ2V0cyBkZWZpbmVkIGluIHRoaXMgZmlsZToKKyMKKyMgYWxsICAgICAgIC0gcGFyZW50IG9mIGZpcnN0LCBzaGVsbCwgZmlsZXMsIGxpYiwgZXhlCisjIGZpcnN0ICAgICAtIGZpcnN0IGRlcGVuZGVuY3kgb2YgJ2FsbCcsIGZvciBwb3RlbnRpYWwgaW5pdGlhbGl6YXRpb24KKyMgc2hlbGwgICAgIC0gcGFyZW50IG9mIGFsbCBTaGVsbCB0YXJnZXRzCisjIGZpbGVzICAgICAtIHBhcmVudCBvZiBhbGwgRmlsZSB0YXJnZXRzCisjIGxpYiAgICAgICAtIHBhcmVudCBvZiBhbGwgTGlicmFyeSB0YXJnZXRzCisjIGV4ZSAgICAgICAtIHBhcmVudCBvZiBhbGwgTWFpbiB0YXJnZXRzCisjIGRpcnMgICAgICAtIHBhcmVudCBvZiBhbGwgTWtEaXIgdGFyZ2V0cworIyBjbGVhbiAgICAgLSByZW1vdmVzIGFsbCBTaGVsbCwgRmlsZSwgTGlicmFyeSwgYW5kIE1haW4gdGFyZ2V0cworIyB1bmluc3RhbGwgLSByZW1vdmVzIGFsbCBJbnN0YWxsIHRhcmdldHMKKyMKKworIyBSdWxlcyBkZWZpbmVkIGJ5IHRoaXMgZmlsZToKKyMKKyMgYXMgb2JqLm8gOiBzb3VyY2UucyA7ICAgICAgICAgLnMgLT4gLm8KKyMgQnVsayBkaXIgOiBmaWxlcyA7ICAgICAgICAgICAgcG9wdWxhdGUgZGlyZWN0b3J5IHdpdGggbWFueSBmaWxlcworIyBDYyBvYmoubyA6IHNvdXJjZS5jIDsgICAgICAgICAuYyAtPiAubworIyBDKysgb2JqLm8gOiBzb3VyY2UuY2MgOyAgICAgICAuY2MgLT4gLm8KKyMgQ2xlYW4gY2xlYW4gOiBzb3VyY2VzIDsgICAgICAgcmVtb3ZlIHNvdXJjZXMgd2l0aCAnamFtIGNsZWFuJworIyBGaWxlIGRlc3QgOiBzb3VyY2UgOyAgICAgICAgICBjb3B5IGZpbGUKKyMgRm9ydHJhbiBvYmoubyA6IHNvdXJjZS5mIDsgICAgICAgIC5mIC0+IC5vCisjIEdlbkZpbGUgc291cmNlLmMgOiBwcm9ncmFtIGFyZ3MgOyBtYWtlIGN1c3RvbSBmaWxlCisjIEhhcmRsaW5rIHRhcmdldCA6IHNvdXJjZSA7ICAgICAgICBtYWtlIGxpbmsgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0CisjIEhkclJ1bGUgc291cmNlIDogaGVhZGVycyA7ICAgICAgICBoYW5kbGUgI2luY2x1ZGVzCisjIEluc3RhbGxJbnRvIGRpciA6IHNvdXJjZXMgOyAgICAgICBpbnN0YWxsIGFueSBmaWxlcworIyBJbnN0YWxsQmluIGRpciA6IHNvdXJjZXMgOyAgICAgICAgaW5zdGFsbCBiaW5hcmllcworIyBJbnN0YWxsTGliIGRpciA6IHNvdXJjZXMgOyAgICAgICAgaW5zdGFsbCBmaWxlcworIyBJbnN0YWxsRmlsZSBkaXIgOiBzb3VyY2VzIDsgICAgICAgaW5zdGFsbCBmaWxlcworIyBJbnN0YWxsTWFuIGRpciA6IHNvdXJjZXMgOyAgICAgICAgaW5zdGFsbCBtYW4gcGFnZXMKKyMgSW5zdGFsbFNoZWxsIGRpciA6IHNvdXJjZXMgOyAgICAgIGluc3RhbGwgc2hlbGwgc2NyaXB0cworIyBMZXggc291cmNlLmMgOiBzb3VyY2UubCA7ICAgICAubCAtPiAuYworIyBMaWJyYXJ5IGxpYiA6IHNvdXJjZSA7ICAgICAgICBhcmNoaXZlIGxpYnJhcnkgZnJvbSBjb21waWxlZCBzb3VyY2VzCisjIExpYnJhcnlGcm9tT2JqZWN0cyBsaWIgOiBvYmplY3RzIDsgICAgYXJjaGl2ZSBsaWJyYXJ5IGZyb20gb2JqZWN0cworIyBMaW5rTGlicmFyaWVzIGltYWdlcyA6IGxpYnJhcmllcyA7ICAgIGJhZyBsaWJyYXJpZXMgb250byBNYWlucworIyBNYWluIGltYWdlIDogc291cmNlIDsgICAgICAgICBsaW5rIGV4ZWN1dGFibGUgZnJvbSBjb21waWxlZCBzb3VyY2VzCisjIE1haW5Gcm9tT2JqZWN0cyBpbWFnZSA6IG9iamVjdHMgOyBsaW5rIGV4ZWN1dGFibGUgZnJvbSBvYmplY3RzCisjIE1rRGlyIGRpciA7ICAgICAgICAgICAgICAgbWFrZSBhIGRpcmVjdG9yeSwgaWYgbm90IHRoZXJlCisjIE9iamVjdCBvYmplY3QgOiBzb3VyY2UgOyAgICAgIGNvbXBpbGUgb2JqZWN0IGZyb20gc291cmNlCisjIE9iamVjdENjRmxhZ3Mgc291cmNlIDogZmxhZ3MgOyAgICBhZGQgY29tcGlsZXIgZmxhZ3MgZm9yIG9iamVjdAorIyBPYmplY3RDKytGbGFncyBzb3VyY2UgOiBmbGFncyA7ICAgYWRkIGNvbXBpbGVyIGZsYWdzIGZvciBvYmplY3QKKyMgT2JqZWN0SGRycyBzb3VyY2UgOiBkaXJzIDsgICAgICAgIGFkZCBpbmNsdWRlIGRpcmVjdG9yaWVzIGZvciBvYmplY3QKKyMgT2JqZWN0cyBzb3VyY2VzIDsgICAgICAgICBjb21waWxlIHNvdXJjZXMKKyMgUm1UZW1wcyB0YXJnZXQgOiBzb3VyY2VzIDsgICAgICAgIHJlbW92ZSB0ZW1wIHNvdXJjZXMgYWZ0ZXIgdGFyZ2V0IG1hZGUKKyMgU2V0dWlkIGltYWdlcyA7ICAgICAgICAgICBtYXJrIGV4ZWN1dGFibGVzIFNldHVpZAorIyBTdWJEaXIgVE9QIGQxIGQyIC4uLiA7ICAgICAgICBzdGFydCBhIHN1YmRpcmVjdG9yeSBKYW1maWxlCisjIFN1YkRpckNjRmxhZ3MgZmxhZ3MgOyAgICAgICAgIGFkZCBjb21waWxlciBmbGFncyB1bnRpbCBuZXh0IFN1YkRpcgorIyBTdWJEaXJDKytGbGFncyBmbGFncyA7ICAgICAgICBhZGQgY29tcGlsZXIgZmxhZ3MgdW50aWwgbmV4dCBTdWJEaXIKKyMgU3ViRGlySGRycyBkaXJzIDsgICAgICAgICBhZGQgaW5jbHVkZSBkaXJzIHVudGlsIG5leHQgU3ViRGlyCisjIFN1YkluY2x1ZGUgVE9QIGQxIGQyIC4uLiA7ICAgICAgICBpbmNsdWRlIGEgc3ViZGlyZWN0b3J5IEphbWZpbGUKKyMgU2hlbGwgZXhlIDogc291cmNlIDsgICAgICAgICAgbWFrZSBhIHNoZWxsIGV4ZWN1dGFibGUKKyMgVW5kZWZpbmVzIGltYWdlcyA6IHN5bWJvbHMgOyAgICAgIHNhdmUgdW5kZWYncyBmb3IgbGlua2luZworIyBVc2VyT2JqZWN0IG9iamVjdCA6IHNvdXJjZSA7ICAgICAgaGFuZGxlIHVua25vd24gc3VmZml4ZXMgZm9yIE9iamVjdAorIyBZYWNjIHNvdXJjZS5jIDogc291cmNlLnkgOyAgICAgICAgLnkgLT4gLmMKKyMKKyMgVXRpbGl0eSBydWxlcyB0aGF0IGhhdmUgbm8gc2lkZSBlZmZlY3RzIChub3Qgc3VwcG9ydGVkKToKKyMKKyMgRkFwcGVuZFN1ZmZpeCBmMSBmMiAuLi4gOiAkKFNVRikgOyAgICByZXR1cm4gJCg8KSB3aXRoIHN1ZmZpeGVzCisjIEZDb25jYXQgdmFsdWUgLi4uIDsgICAgICAgICAgICAgICByZXR1cm4gY29udGF0ZW5hdGVkIHZhbHVlcworIyBGRGlyTmFtZSBkMSBkMiAuLi4gOyAgICAgICAgICByZXR1cm4gcGF0aCBmcm9tIHJvb3QgdG8gZGlyCisjIEZHcmlzdCBkMSBkMiAuLi4gOyAgICAgICAgICAgIHJldHVybiBkMSFkMiEuLi4KKyMgRkdyaXN0RmlsZXMgdmFsdWUgOyAgICAgICAgICAgcmV0dXJuICQodmFsdWU6Rz0kKFNPVVJDRV9HUklTVCkpCisjIEZHcmlzdFNvdXJjZUZpbGVzIHZhbHVlIDsgICAgIHJldHVybiAkKHZhbHVlOkc9JChTT1VSQ0VfR1JJU1QpKQorIyBGUmVsUGF0aCBkMSA6IGQyIDsgICAgICAgICAgICByZXR1cm4gcmVsIHBhdGggZnJvbSBkMSB0byBkMgorIyBGU3ViRGlyIGQxIGQyIC4uLiA7ICAgICAgICAgICByZXR1cm4gcGF0aCB0byByb290CisjCisKKworIyBCcmllZiByZXZpZXcgb2YgdGhlIGphbSBsYW5ndWFnZToKKyMKKyMgU3RhdGVtZW50czoKKyMgICBydWxlIFJVTEUgLSBzdGF0ZW1lbnRzIHRvIHByb2Nlc3MgYSBydWxlCisjICAgYWN0aW9ucyBSVUxFIC0gc3lzdGVtIGNvbW1hbmRzIHRvIGNhcnJ5IG91dCB0YXJnZXQgdXBkYXRlCisjCisjIE1vZGlmaWVycyBvbiBhY3Rpb25zOgorIyAgIHRvZ2V0aGVyIC0gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHNhbWUgcnVsZSBvbiB0YXJnZXQgZ2V0IGV4ZWN1dGVkCisjICAgICAgICAgIG9uY2Ugd2l0aCB0aGVpciBzb3VyY2VzICgkKD4pKSBjb25jYXRlbmF0ZWQKKyMgICB1cGRhdGVkIC0gcmVmZXJzIHRvIHVwZGF0ZWQgc291cmNlcyAoJCg+KSkgb25seQorIyAgIGlnbm9yZSAtIGlnbm9yZSByZXR1cm4gc3RhdHVzIG9mIGNvbW1hbmQKKyMgICBxdWlldGx5IC0gZG9uJ3QgdHJhY2UgaXRzIGV4ZWN1dGlvbiB1bmxlc3MgdmVyYm9zZQorIyAgIHBpZWNlbWVhbCAtIGl0ZXJhdGUgY29tbWFuZCBlYWNoIHRpbWUgd2l0aCBhIHNtYWxsIHN1YnNldCBvZiAkKD4pCisjICAgZXhpc3RpbmcgLSByZWZlcnMgdG8gY3VycmVudGx5IGV4aXN0aW5nIHNvdXJjZXMgKCQoPikpIG9ubHkKKyMgICBiaW5kIHZhcnMgLSBzdWJqZWN0IHRvIGJpbmRpbmcgYmVmb3JlIGV4cGFuZGluZyBpbiBhY3Rpb25zCisjCisjIFNwZWNpYWwgcnVsZXM6CisjICAgQUxXQVlTIC0gYWx3YXlzIGJ1aWxkIGEgdGFyZ2V0CisjICAgREVQRU5EUyAtIGJ1aWxkcyB0aGUgZGVwZW5kZW5jeSBncmFwaAorIyAgIEVDSE8gLSBibHVydCBvdXQgdGFyZ2V0cyBvbiBzdGRvdXQKKyMgICBFWElUIC0gYmx1cnQgb3V0IHRhcmdldHMgYW5kIGV4aXQKKyMgICBJTkNMVURFUyAtIG1hcmtzIHNvdXJjZXMgYXMgaGVhZGVycyBmb3IgdGFyZ2V0IChhIGNvZGVwZW5kZW5jeSkKKyMgICBOT0NBUkUgLSBkb24ndCBwYW5pYyBpZiB0aGUgdGFyZ2V0IGNhbid0IGJlIGJ1aWx0CisjICAgTk9VUERBVEUgLSBjcmVhdGUgdGhlIHRhcmdldCBpZiBuZWVkZWQgYnV0IG5ldmVyIHVwZGF0ZSBpdAorIyAgIE5PVEZJTEUgLSBpZ25vcmUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgdGFyZ2V0IChpdCdzIG5vdCBhIGZpbGUpCisjICAgVEVNUE9SQVJZIC0gdGFyZ2V0IG5lZWQgbm90IGJlIHByZXNlbnQgaWYgc291cmNlcyBoYXZlbid0IGNoYW5nZWQKKyMKKyMgU3BlY2lhbCB2YXJpYWJsZXMgc2V0IGJ5IGphbToKKyMgICAkKDwpIC0gdGFyZ2V0cyBvZiBhIHJ1bGUgKHRvIHRoZSBsZWZ0IG9mIHRoZSA6KQorIyAgICQoPikgLSBzb3VyY2VzIG9mIGEgcnVsZSAodG8gdGhlIHJpZ2h0IG9mIHRoZSA6KQorIyAgICQoeHh4KSAtIHRydWUgb24geHh4IChVTklYLCBWTVMsIE5ULCBPUzIsIE1BQykKKyMgICAkKE9TKSAtIG5hbWUgb2YgT1MgLSB2YXJpZXMgd2lsZGx5CisjICAgJChKQU1WRVJTSU9OKSAtIHZlcnNpb24gbnVtYmVyICgyLjMpCisjCisjIFNwZWNpYWwgdmFyaWFibGVzIHVzZWQgYnkgamFtOgorIyAgIFNFQVJDSCAtIHdoZXJlIHRvIGZpbmQgc29tZXRoaW5nICh1c2VkIGR1cmluZyBiaW5kaW5nIGFuZCBhY3Rpb25zKQorIyAgIExPQ0FURSAtIHdoZXJlIHRvIHBsb3Agc29tZXRoaW5nIG5vdCBmb3VuZCB3aXRoIFNFQVJDSAorIyAgIEhEUlJVTEUgLSBydWxlIHRvIGNhbGwgdG8gaGFuZGxlIGluY2x1ZGUgZmlsZXMKKyMgICBIRFJTQ0FOIC0gZWdyZXAgcmVnZXggdG8gZXh0cmFjdCBpbmNsdWRlIGZpbGVzCisjCisjIFNwZWNpYWwgdGFyZ2V0czoKKyMgICBhbGwgLSBkZWZhdWx0IGlmIG5vbmUgZ2l2ZW4gb24gY29tbWFuZCBsaW5lCisjCisKKyMgSW5pdGlhbGl6ZSB2YXJpYWJsZXMKKyMKKworIworIyBPUyBzcGVjaWZpYyB2YXJpYWJsZSBzZXR0aW5ncworIworaWYgJChOVCkKK3sKKyAgICAjIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCB0b29sc2V0cyBvbiBXaW5kb3dzIE5UIGFuZCBXaW5kb3dzIDk1Lzk4CisgICAgIworICAgIGxvY2FsIFNVUFBPUlRFRF9UT09MU0VUUyA9ICJCT1JMQU5EQyIgIlZDNyIgIlZJU1VBTEMiICJWSVNVQUxDMTYiICJJTlRFTEMiICJXQVRDT00iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JTkdXIiAiTENDIiA7CisKKyAgICAjIHRoaXMgdmFyaWFibGUgaG9sZHMgdGhlIGN1cnJlbnQgdG9vbHNldAorICAgICMKKyAgICBUT09MU0VUID0gIiIgOworCisgICAgIyBpZiB0aGUgSkFNX1RPT0xTRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZGVmaW5lZCwgY2hlY2sgdGhhdCBpdCBpcworICAgICMgb25lIG9mIG91ciBzdXBwb3J0ZWQgdmFsdWVzCisgICAgIworICAgIGlmICQoSkFNX1RPT0xTRVQpCisgICAgeworICAgICAgbG9jYWwgdCA7CisKKyAgICAgIGZvciB0IGluICQoU1VQUE9SVEVEX1RPT0xTRVRTKQorICAgICAgeworICAgICAgICAkKHQpID0gJCgkKHQpOko9IiAiKSA7ICMgcmVjb25zdGl0dXRlIHBhdGhzIHdpdGggc3BhY2VzIGluIHRoZW0KKyAgICAgICAgaWYgJCh0KSA9ICQoSkFNX1RPT0xTRVQpIHsgVE9PTFNFVCA9ICQodCkgOyB9CisgICAgICB9CisKKyAgICAgIGlmICEgJChUT09MU0VUKQorICAgICAgeworICAgICAgICBFQ0hPICAiVGhlIEpBTV9UT09MU0VUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGRlZmluZWQgYnV0IGl0cyB2YWx1ZSIgOworICAgICAgICBFQ0hPICAiaXMgaW52YWxpZCwgcGxlYXNlIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoiIDsKKyAgICAgICAgRUNITyAgOworCisgICAgICAgIGZvciB0IGluICQoU1VQUE9SVEVEX1RPT0xTRVRTKSB7IEVDSE8gIiAgIiAkKHQpIDsgfQorICAgICAgICBFWElUIDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAjIGlmIFRPT0xTRVQgaXMgZW1wdHksIHdlJ2xsIHRyeSB0byBkZXRlY3QgdGhlIHRvb2xzZXQgZnJvbSBvdGhlcgorICAgICMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHJlbWFpbiBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIEphbSAyLjMKKyAgICAjCisgICAgaWYgISAkKFRPT0xTRVQpCisgICAgeworICAgICAgaWYgJChCQ0NST09UKQorICAgICAgeworICAgICAgICBUT09MU0VUICA9IEJPUkxBTkRDIDsKKyAgICAgICAgQk9STEFOREMgPSAkKEJDQ1JPT1Q6Sj0iICIpIDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgJChNU1ZDKQorICAgICAgeworICAgICAgICBUT09MU0VUICAgPSBWSVNVQUxDMTYgOworICAgICAgICBWSVNVQUxDMTYgPSAkKE1TVkM6Sj0iICIpIDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgJChNU1ZDTlQpCisgICAgICB7CisgICAgICAgIFRPT0xTRVQgPSBWSVNVQUxDIDsKKyAgICAgICAgVklTVUFMQyA9ICQoTVNWQ05UOko9IiAiKSA7CisgICAgICB9CisgICAgICBlbHNlIGlmICQoTVNWQ0RpcikKKyAgICAgIHsKKyAgICAgICAgVE9PTFNFVCA9IFZJU1VBTEMgOworICAgICAgICBWSVNVQUxDID0gJChNU1ZDRGlyOko9IiAiKSA7CisgICAgICB9CisgICAgICBlbHNlIGlmICQoTUlOR1cpCisgICAgICB7CisgICAgICAgIFRPT0xTRVQgPSBNSU5HVyA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIEVDSE8gICJKYW0gY2Fubm90IGJlIHJ1biBiZWNhdXNlLCBlaXRoZXI6IiA7CisgICAgICAgIEVDSE8gICIgICBhLiBZb3UgZGlkbid0IHNldCBCT09TVF9ST09UIHRvIGluZGljYXRlIHRoZSByb290IG9mIHlvdXIiIDsKKyAgICAgICAgRUNITyAgIiAgICAgIEJvb3N0IGluc3RhbGxhdGlvbi4iIDsKKyAgICAgICAgRUNITyAgIiAgIGIuIFlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBzdG9jayBKYW0gYnV0IGRpZG4ndCBpbmRpY2F0ZSB3aGljaCIgOworICAgICAgICBFQ0hPICAiICAgICAgY29tcGlsYXRpb24gdG9vbHNldCB0byB1c2UuIFRvIGRvIHNvLCBmb2xsb3cgdGhlc2Ugc2ltcGxlIiA7CisgICAgICAgIEVDSE8gICIgICAgICBpbnN0cnVjdGlvbnM6IiA7CisgICAgICAgIEVDSE8gIDsKKyAgICAgICAgRUNITyAgIiAgLSBkZWZpbmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdpdGggdGhlIiA7CisgICAgICAgIEVDSE8gICIgICAgYXBwcm9wcmlhdGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoaXMgbGlzdDoiIDsKKyAgICAgICAgRUNITyAgOworICAgICAgICBFQ0hPICAiICAgVmFyaWFibGUgICAgVG9vbHNldCAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiIgOworICAgICAgICBFQ0hPICA7CisgICAgICAgIEVDSE8gICIgICBCT1JMQU5EQyAgICBCb3JsYW5kIEMrKyAgICAgICAgICAgICAgICAgIEJDKysgaW5zdGFsbCBwYXRoIiA7CisgICAgICAgIEVDSE8gICIgICBWSVNVQUxDICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAgICAgICAgIFZDKysgaW5zdGFsbCBwYXRoIiA7CisgICAgICAgIEVDSE8gICIgICBWSVNVQUxDMTYgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAxNiBiaXQgIFZDKysgMTYgYml0IGluc3RhbGwiIDsKKyAgICAgICAgRUNITyAgIiAgIElOVEVMQyAgICAgIEludGVsIEMvQysrICAgICAgICAgICAgICAgICAgSUMrKyBpbnN0YWxsIHBhdGgiIDsKKyAgICAgICAgRUNITyAgIiAgIFdBVENPTSAgICAgIFdhdGNvbSBDL0MrKyAgICAgICAgICAgICAgICAgV2F0Y29tIGluc3RhbGwgcGF0aCIgOworICAgICAgICBFQ0hPICAiICAgTUlOR1cgICAgICAgTWluR1cgKGdjYykgICAgICAgICAgICAgICAgICBNaW5HVyBpbnN0YWxsIHBhdGgiIDsKKyAgICAgICAgRUNITyAgIiAgIExDQyAgICAgICAgIFdpbjMyLUxDQyAgICAgICAgICAgICAgICAgICAgTENDLVdpbjMyIGluc3RhbGwgcGF0aCIgOworICAgICAgICBFQ0hPICA7CisgICAgICAgIEVDSE8gICIgIC0gZGVmaW5lIHRoZSBKQU1fVE9PTFNFVCBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHRoZSAqbmFtZSoiIDsKKyAgICAgICAgRUNITyAgIiAgICBvZiB0aGUgdG9vbHNldCB2YXJpYWJsZSB5b3Ugd2FudCB0byB1c2UuIiA7CisgICAgICAgIEVDSE8gIDsKKyAgICAgICAgRUNITyAgIiAgZS5nLjogIHNldCBWSVNVQUxDPUM6XFxWaXN1YWw2IiA7CisgICAgICAgIEVDSE8gICIgICAgICAgICBzZXQgSkFNX1RPT0xTRVQ9VklTVUFMQyIgOworICAgICAgICBFWElUICA7CisgICAgICB9CisgICAgfQorCisgICAgQ1AgICAgICAgICAgPz0gY29weSA7CisgICAgUk0gICAgICAgICAgPz0gZGVsIC9mL3EgOworICAgIFNMQVNIICAgICAgID89IFxcIDsKKyAgICBTVUZMSUIgICAgICA/PSAubGliIDsKKyAgICBTVUZPQkogICAgICA/PSAub2JqIDsKKyAgICBTVUZFWEUgICAgICA/PSAuZXhlIDsKKworICAgIGlmICQoVE9PTFNFVCkgPSBCT1JMQU5EQworICAgIHsKKyAgICBFQ0hPICJDb21waWxlciBpcyBCb3JsYW5kIEMrKyIgOworCisgICAgQVIgICAgICAgICAgPz0gdGxpYiAvQyAvUDY0IDsKKyAgICBDQyAgICAgICAgICA/PSBiY2MzMiA7CisgICAgQ0NGTEFHUyAgICAgPz0gLXEgLXkgLWQgLXYgLXctcGFyIC13LWNjYyAtdy1yY2ggLXctcHJvIC13LWF1cyA7CisgICAgQysrICAgICAgICAgPz0gYmNjMzIgOworICAgIEMrK0ZMQUdTICAgID89IC1xIC15IC1kIC12IC13LXBhciAtdy1jY2MgLXctcmNoIC13LXBybyAtdy1hdXMgLVAgOworICAgIExJTksgICAgICAgID89ICQoQ0MpIDsKKyAgICBMSU5LRkxBR1MgICA/PSAkKENDRkxBR1MpIDsKKyAgICBTVERMSUJQQVRIICA/PSAkKEJPUkxBTkRDKVxcbGliIDsKKyAgICBTVERIRFJTICAgICA/PSAkKEJPUkxBTkRDKVxcaW5jbHVkZSA7CisgICAgTk9BUlNDQU4gICAgPz0gdHJ1ZSA7CisgICAgfQorICAgIGVsc2UgaWYgJChUT09MU0VUKSA9IFZJU1VBTEMxNgorICAgIHsKKyAgICBFQ0hPICJDb21waWxlciBpcyBNaWNyb3NvZnQgVmlzdWFsIEMrKyAxNiBiaXQiIDsKKworICAgIEFSICAgICAgICAgID89IGxpYiAvbm9sb2dvIDsKKyAgICBDQyAgICAgICAgICA/PSBjbCAvbm9sb2dvIDsKKyAgICBDQ0ZMQUdTICAgICA/PSAvRCBcIldJTlwiIDsKKyAgICBDKysgICAgICAgICA/PSAkKENDKSA7CisgICAgQysrRkxBR1MgICAgPz0gJChDQ0ZMQUdTKSA7CisgICAgTElOSyAgICAgICAgPz0gJChDQykgOworICAgIExJTktGTEFHUyAgID89ICQoQ0NGTEFHUykgOworICAgIExJTktMSUJTICAgID89CisgICAgICAgICAgICAgICAgXCIkKFZJU1VBTEMxNilcXGxpYlxcbWxpYmNlLmxpYlwiCisgICAgICAgICAgICAgICAgXCIkKFZJU1VBTEMxNilcXGxpYlxcb2xkbmFtZXMubGliXCIKKyAgICAgICAgICAgICAgICA7CisgICAgTElOS0xJQlMgICAgPz0gOworICAgIE5PQVJTQ0FOICAgID89IHRydWUgOworICAgIE9QVElNICAgICAgID89ICIiIDsKKyAgICBTVERIRFJTICAgICA/PSAkKFZJU1VBTEMxNilcXGluY2x1ZGUgOworICAgIFVOREVGRkxBRyAgID89ICIvdSBfIiA7CisgICAgfQorICAgIGVsc2UgaWYgJChUT09MU0VUKSA9IFZJU1VBTEMKKyAgICB7CisgICAgRUNITyAiQ29tcGlsZXIgaXMgTWljcm9zb2Z0IFZpc3VhbCBDKysiIDsKKworICAgIEFSICAgICAgICAgID89IGxpYiA7CisgICAgQVMgICAgICAgICAgPz0gbWFzbTM4NiA7CisgICAgQ0MgICAgICAgICAgPz0gY2wgL25vbG9nbyA7CisgICAgQ0NGTEFHUyAgICAgPz0gIiIgOworICAgIEMrKyAgICAgICAgID89ICQoQ0MpIDsKKyAgICBDKytGTEFHUyAgICA/PSAkKENDRkxBR1MpIDsKKyAgICBMSU5LICAgICAgICA/PSBsaW5rIC9ub2xvZ28gOworICAgIExJTktGTEFHUyAgID89ICIiIDsKKyAgICBMSU5LTElCUyAgICA/PSBcIiQoVklTVUFMQylcXGxpYlxcYWR2YXBpMzIubGliXCIKKyAgICAgICAgICAgICAgICAgICAjICQoVklTVUFMQylcXGxpYlxcbGliYy5saWIKKyAgICAgICAgICAgICAgICAgICAjICQoVklTVUFMQylcXGxpYlxcb2xkbmFtZXMubGliCisgICAgICAgICAgICAgICAgICAgXCIkKFZJU1VBTEMpXFxsaWJcXGdkaTMyLmxpYlwiCisgICAgICAgICAgICAgICAgICAgXCIkKFZJU1VBTEMpXFxsaWJcXHVzZXIzMi5saWJcIgorICAgICAgICAgICAgICAgICAgIFwiJChWSVNVQUxDKVxcbGliXFxrZXJuZWwzMi5saWJcIiA7CisgICAgT1BUSU0gICAgICAgPz0gIiIgOworICAgIFNUREhEUlMgICAgID89ICQoVklTVUFMQylcXGluY2x1ZGUgOworICAgIFVOREVGRkxBRyAgID89ICIvdSBfIiA7CisgICAgfQorICAgIGVsc2UgaWYgJChUT09MU0VUKSA9IFZDNworICAgIHsKKyAgICBFQ0hPICJDb21waWxlciBpcyBNaWNyb3NvZnQgVmlzdWFsIEMrKyAuTkVUIiA7CisKKyAgICBBUiAgICAgICAgICA/PSBsaWIgOworICAgIEFTICAgICAgICAgID89IG1hc20zODYgOworICAgIENDICAgICAgICAgID89IGNsIC9ub2xvZ28gOworICAgIENDRkxBR1MgICAgID89ICIiIDsKKyAgICBDKysgICAgICAgICA/PSAkKENDKSA7CisgICAgQysrRkxBR1MgICAgPz0gJChDQ0ZMQUdTKSA7CisgICAgTElOSyAgICAgICAgPz0gbGluayAvbm9sb2dvIDsKKyAgICBMSU5LRkxBR1MgICA/PSAiIiA7CisgICAgTElOS0xJQlMgICAgPz0gXCIkKFZJU1VBTEMpXFxQbGF0Zm9ybVNES1xcbGliXFxhZHZhcGkzMi5saWJcIgorICAgICAgICAgICAgICAgICAgICMgJChWSVNVQUxDKVxcbGliXFxsaWJjLmxpYgorICAgICAgICAgICAgICAgICAgICMgJChWSVNVQUxDKVxcbGliXFxvbGRuYW1lcy5saWIKKyAgICAgICAgICAgICAgICAgICBcIiQoVklTVUFMQylcXFBsYXRmb3JtU0RLXFxsaWJcXGdkaTMyLmxpYlwiCisgICAgICAgICAgICAgICAgICAgXCIkKFZJU1VBTEMpXFxQbGF0Zm9ybVNES1xcbGliXFx1c2VyMzIubGliXCIKKyAgICAgICAgICAgICAgICAgICBcIiQoVklTVUFMQylcXFBsYXRmb3JtU0RLXFxsaWJcXGtlcm5lbDMyLmxpYlwiIDsKKyAgICBPUFRJTSAgICAgICA/PSAiIiA7CisgICAgU1RESERSUyAgICAgPz0gXCIkKFZJU1VBTEMpXFxpbmNsdWRlXCIKKwkJCQkJCQkJCSBcIiQoVklTVUFMQylcXFBsYXRmb3JtU0RLXFxpbmNsdWRlXCIgOworICAgIFVOREVGRkxBRyAgID89ICIvdSBfIiA7CisgICAgfQorICAgIGVsc2UgaWYgJChUT09MU0VUKSA9IElOVEVMQworICAgIHsKKyAgICBFQ0hPICJDb21waWxlciBpcyBJbnRlbCBDL0MrKyIgOworCisgICAgICAgIGlmICEgJChWSVNVQUxDKQorICAgICAgICB7CisgICAgICAgICAgRUNITyAiQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB1c2luZyB0aGUgSW50ZWwgQysrIGNvbXBpbGVyLCB5b3UgbmVlZCIgOworICAgICAgICAgIEVDSE8gInRvIGRlZmluZSB0aGUgVklTVUFMQyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBpbmRpY2F0ZSB0aGUgbG9jYXRpb24iIDsKKyAgICAgICAgICBFQ0hPICJvZiB5b3VyIFZpc3VhbCBDKysgaW5zdGFsbGF0aW9uLiBBYm9ydGluZy4uIiA7CisgICAgICAgICAgRVhJVCA7CisgICAgICAgIH0KKworICAgIEFSICAgICAgICAgID89IGxpYiA7CisgICAgQVMgICAgICAgICAgPz0gbWFzbTM4NiA7CisgICAgQ0MgICAgICAgICAgPz0gaWNsIC9ub2xvZ28gOworICAgIENDRkxBR1MgICAgID89ICIiIDsKKyAgICBDKysgICAgICAgICA/PSAkKENDKSA7CisgICAgQysrRkxBR1MgICAgPz0gJChDQ0ZMQUdTKSA7CisgICAgTElOSyAgICAgICAgPz0gbGluayAvbm9sb2dvIDsKKyAgICBMSU5LRkxBR1MgICA/PSAiIiA7CisgICAgTElOS0xJQlMgICAgPz0gJChWSVNVQUxDKVxcbGliXFxhZHZhcGkzMi5saWIKKyAgICAgICAgICAgICAgICAgICAjICQoVklTVUFMQylcXGxpYlxcbGliYy5saWIKKyAgICAgICAgICAgICAgICAgICAjICQoVklTVUFMQylcXGxpYlxcb2xkbmFtZXMubGliCisgICAgICAgICAgICAgICAgICAgJChWSVNVQUxDKVxcbGliXFxrZXJuZWwzMi5saWIKKyAgICAgICAgICAgICAgICAgICA7CisgICAgT1BUSU0gICAgICAgPz0gIiIgOworICAgIFNUREhEUlMgICAgID89ICQoSU5URUxDKVxpbmNsdWRlICQoVklTVUFMQylcXGluY2x1ZGUgOworICAgIFVOREVGRkxBRyAgID89ICIvdSBfIiA7CisgICAgfQorICAgIGVsc2UgaWYgJChUT09MU0VUKSA9IFdBVENPTQorICAgIHsKKyAgICAgICAgRUNITyAiQ29tcGlsZXIgaXMgV2F0Y29tIEMvQysrIiA7CisKKyAgICBBUiAgICAgICAgICA/PSB3bGliIDsKKyAgICBDQyAgICAgICAgICA/PSB3Y2MzODYgOworICAgIENDRkxBR1MgICAgID89IC96cSAvRFdJTjMyIC9JJChXQVRDT00pXFxoIDsgIyB6cT1xdWlldAorICAgIEMrKyAgICAgICAgID89IHdwcDM4NiA7CisgICAgQysrRkxBR1MgICAgPz0gJChDQ0ZMQUdTKSA7CisgICAgQ1AgICAgICAgICAgPz0gY29weSA7CisgICAgRE9UICAgICAgICAgPz0gLiA7CisgICAgRE9URE9UICAgICAgPz0gLi4gOworICAgIExJTksgICAgICAgID89IHdjbDM4NiA7CisgICAgTElOS0ZMQUdTICAgPz0gL3pxIDsgIyB6cT1xdWlldAorICAgIExJTktMSUJTICAgID89IDsKKyAgICBNViAgICAgICAgICA/PSBtb3ZlIDsKKyAgICBOT0FSU0NBTiAgICA/PSB0cnVlIDsKKyAgICBPUFRJTSAgICAgICA/PSA7CisgICAgUk0gICAgICAgICAgPz0gZGVsIC9mIDsKKyAgICBTTEFTSCAgICAgICA/PSBcXCA7CisgICAgU1RESERSUyAgICAgPz0gJChXQVRDT00pXFxoICQoV0FUQ09NKVxcaFxcbnQgOworICAgIFNVRkVYRSAgICAgID89IC5leGUgOworICAgIFNVRkxJQiAgICAgID89IC5saWIgOworICAgIFNVRk9CSiAgICAgID89IC5vYmogOworICAgIFVOREVGRkxBRyAgID89ICIvdSBfIiA7CisgICAgfQorICAgIGVsc2UgaWYgJChUT09MU0VUKSA9IE1JTkdXCisgICAgeworICAgICAgICBFQ0hPICJDb21waWxlciBpcyBHQ0Mgd2l0aCBNaW5ndyIgOworCisgICAgICAgIEFSICAgICAgICAgICAgICA/PSBhciAtcnUgOworICAgICAgICBDQyAgICAgICAgICAgICAgPz0gZ2NjIDsKKyAgICAgICAgQ0NGTEFHUyAgICAgICAgID89ICIiIDsKKyAgICAgICAgQysrICAgICAgICAgICAgID89ICQoQ0MpIDsKKyAgICAgICAgQysrRkxBR1MgICAgICAgID89ICQoQ0NGTEFHUykgOworICAgICAgICBMSU5LICAgICAgICAgICAgPz0gJChDQykgOworICAgICAgICBMSU5LRkxBR1MgICAgICAgPz0gIiIgOworICAgICAgICBMSU5LTElCUyAgICAgICAgPz0gIiIgOworICAgICAgICBPUFRJTSAgICAgICAgICAgPz0gOworICAgICAgICBTVUZPQkogICAgICAgICAgID0gLm8gOworICAgICAgICBTVUZMSUIgICAgICAgICAgID0gLmEgOworICAgICAgICBTTEFTSCAgICAgICAgICAgID0gLyA7CisjICAgICAgIE5PQVJTQ0FOICAgICAgICA/PSB0cnVlIDsKKyAgICB9CisgICAgZWxzZSBpZiAkKFRPT0xTRVQpID0gTENDCisgICAgeworICAgICAgICBFQ0hPICJDb21waWxlciBpcyBXaW4zMi1MQ0MiIDsKKworICAgICAgICBBUiAgICAgICAgICAgICAgPz0gbGNjbGliIDsKKyAgICAgICAgQ0MgICAgICAgICAgICAgID89IGxjYyA7CisgICAgICAgIENDRkxBR1MgICAgICAgICA/PSAiIiA7CisgICAgICAgIEMrKyAgICAgICAgICAgICA/PSAkKENDKSA7CisgICAgICAgIEMrK0ZMQUdTICAgICAgICA/PSAkKENDRkxBR1MpIDsKKyAgICAgICAgTElOSyAgICAgICAgICAgID89IGxjY2xuayA7CisgICAgICAgIExJTktGTEFHUyAgICAgICA/PSAiIiA7CisgICAgICAgIExJTktMSUJTICAgICAgICA/PSAiIiA7CisgICAgICAgIE9QVElNICAgICAgICAgICA/PSA7CisgICAgICAgIE5PQVJTQ0FOICAgICAgICAgPSB0cnVlIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyMKKyMgWFhYOiBXZSBuZWVkIGJldHRlciBjb21tZW50cyBoZXJlICEhCisjCisgICAgRVhJVCBPbiBOVCwgc2V0IEJDQ1JPT1QsIE1TVkNOVCwgTUlOR1cgb3IgTVNWQyB0byB0aGUgcm9vdCBvZiB0aGUKKyAgICAgICAgQm9ybGFuZCBvciBNaWNyb3NvZnQgZGlyZWN0b3JpZXMuIDsKKyAgICB9CisKK30KK2Vsc2UgaWYgJChPUzIpCit7CisgICAgIyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgdG9vbHNldHMgb24gV2luZG93cyBOVCBhbmQgV2luZG93cyA5NS85OAorICAgICMKKyAgICBsb2NhbCBTVVBQT1JURURfVE9PTFNFVFMgPSAiRU1YIiAiV0FUQ09NIiA7CisKKyAgICAjIHRoaXMgdmFyaWFibGUgaG9sZHMgdGhlIGN1cnJlbnQgdG9vbHNldAorICAgICMKKyAgICBUT09MU0VUID0gIiIgOworCisgICAgIyBpZiB0aGUgSkFNX1RPT0xTRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZGVmaW5lZCwgY2hlY2sgdGhhdCBpdCBpcworICAgICMgb25lIG9mIG91ciBzdXBwb3J0ZWQgdmFsdWVzCisgICAgIworICAgIGlmICQoSkFNX1RPT0xTRVQpCisgICAgeworICAgICAgbG9jYWwgdCA7CisKKyAgICAgIGZvciB0IGluICQoU1VQUE9SVEVEX1RPT0xTRVRTKQorICAgICAgeworICAgICAgICAkKHQpID0gJCgkKHQpOko9IiAiKSA7ICMgcmVjb25zdGl0dXRlIHBhdGhzIHdpdGggc3BhY2VzIGluIHRoZW0KKyAgICAgICAgaWYgJCh0KSA9ICQoSkFNX1RPT0xTRVQpIHsgVE9PTFNFVCA9ICQodCkgOyB9CisgICAgICB9CisKKyAgICAgIGlmICEgJChUT09MU0VUKQorICAgICAgeworICAgICAgICBFQ0hPICAiVGhlIEpBTV9UT09MU0VUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGRlZmluZWQgYnV0IGl0cyB2YWx1ZSIgOworICAgICAgICBFQ0hPICAiaXMgaW52YWxpZCwgcGxlYXNlIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoiIDsKKyAgICAgICAgRUNITyAgOworCisgICAgICAgIGZvciB0IGluICQoU1VQUE9SVEVEX1RPT0xTRVRTKSB7IEVDSE8gIiAgIiAkKHQpIDsgfQorICAgICAgICBFWElUIDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAjIGlmIFRPT0xTRVQgaXMgZW1wdHksIHdlJ2xsIHRyeSB0byBkZXRlY3QgdGhlIHRvb2xzZXQgZnJvbSBvdGhlcgorICAgICMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHJlbWFpbiBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIEphbSAyLjMKKyAgICAjCisgICAgaWYgISAkKFRPT0xTRVQpCisgICAgeworICAgICAgaWYgJCh3YXRjb20pCisgICAgICB7CisgICAgICAgIFdBVENPTSAgID0gJCh3YXRjb206Sj0iICIpIDsKKyAgICAgICAgVE9PTFNFVCAgPSBXQVRDT00gOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBFQ0hPICAiSmFtIGNhbm5vdCBiZSBydW4gYmVjYXVzZSB5b3UgZGlkbid0IGluZGljYXRlIHdoaWNoIGNvbXBpbGF0aW9uIHRvb2xzZXQiIDsKKyAgICAgICAgRUNITyAgInRvIHVzZS4gVG8gZG8gc28sIGZvbGxvdyB0aGVzZSBzaW1wbGUgaW5zdHJ1Y3Rpb25zOiIgOworICAgICAgICBFQ0hPICA7CisgICAgICAgIEVDSE8gICIgIC0gZGVmaW5lIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aXRoIHRoZSIgOworICAgICAgICBFQ0hPICAiICAgIGFwcHJvcHJpYXRlIHZhbHVlIGFjY29yZGluZyB0byB0aGlzIGxpc3Q6IiA7CisgICAgICAgIEVDSE8gIDsKKyAgICAgICAgRUNITyAgIiAgIFZhcmlhYmxlICAgIFRvb2xzZXQgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24iIDsKKyAgICAgICAgRUNITyAgOworICAgICAgICBFQ0hPICAiICAgV0FUQ09NICAgICAgV2F0Y29tIEMvQysrICAgICAgICAgICAgICAgICBXYXRjb20gaW5zdGFsbCBwYXRoIiA7CisgICAgICAgIEVDSE8gICIgICBFTVggICAgICAgICBFTVggKGdjYykgICAgICAgICAgICAgICAgICAgIEVNWCBpbnN0YWxsIHBhdGgiIDsKKyAgICAgICAgRUNITyAgIiAgIFZJU1VBTEFHRSAgIElCTSBWaXN1YWwgQWdlIEMvQysrICAgICAgICAgVmlzdWFsQWdlIGluc3RhbGwgcGF0aCIgOworICAgICAgICBFQ0hPICA7CisgICAgICAgIEVDSE8gICIgIC0gZGVmaW5lIHRoZSBKQU1fVE9PTFNFVCBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHRoZSAqbmFtZSoiIDsKKyAgICAgICAgRUNITyAgIiAgICBvZiB0aGUgdG9vbHNldCB2YXJpYWJsZSB5b3Ugd2FudCB0byB1c2UuIiA7CisgICAgICAgIEVDSE8gIDsKKyAgICAgICAgRUNITyAgIiAgZS5nLjogIHNldCBXQVRDT009QzpcV0FUQ09NIiA7CisgICAgICAgIEVDSE8gICIgICAgICAgICBzZXQgSkFNX1RPT0xTRVQ9V0FUQ09NIiA7CisgICAgICAgIEVDSE8gIDsKKyAgICAgICAgRVhJVCAgOworICAgICAgfQorICAgIH0KKworICAgIFJNICAgICAgID0gZGVsIC9mIDsKKyAgICBDUCAgICAgICA9IGNvcHkgOworICAgIE1WICAgICAgPz0gbW92ZSA7CisgICAgRE9UICAgICA/PSAuIDsKKyAgICBET1RET1QgID89IC4uIDsKKyAgICBTVUZMSUIgID89IC5saWIgOworICAgIFNVRk9CSiAgPz0gLm9iaiA7CisgICAgU1VGRVhFICA/PSAuZXhlIDsKKworICAgIGlmICQoVE9PTFNFVCkgPSBXQVRDT00KKyAgICB7CisgICAgICAgQVIgICAgICAgICAgID89IHdsaWIgOworICAgICAgIEJJTkRJUiAgICAgICA/PSBcXG9zMlxcYXBwcyA7CisgICAgICAgQ0MgICAgICAgICAgID89IHdjYzM4NiA7CisgICAgICAgQ0NGTEFHUyAgICAgID89IC96cSAvRE9TMiAvSSQoV0FUQ09NKVxcaCA7ICMgenE9cXVpZXQKKyAgICAgICBDKysgICAgICAgICAgPz0gd3BwMzg2IDsKKyAgICAgICBDKytGTEFHUyAgICAgPz0gJChDQ0ZMQUdTKSA7CisgICAgICAgTElOSyAgICAgICAgID89IHdjbDM4NiA7CisgICAgICAgTElOS0ZMQUdTICAgID89IC96cSA7ICMgenE9cXVpZXQKKyAgICAgICBMSU5LTElCUyAgICAgPz0gOworICAgICAgIE5PQVJTQ0FOICAgICA/PSB0cnVlIDsKKyAgICAgICBPUFRJTSAgICAgICAgPz0gOworICAgICAgIFNMQVNIICAgICAgICA/PSBcXCA7CisgICAgICAgU1RESERSUyAgICAgID89ICQoV0FUQ09NKVxcaCA7CisgICAgICAgVU5ERUZGTEFHICAgID89ICIvdSBfIiA7CisgICAgfQorICAgIGVsc2UgaWYgJChUT09MU0VUKSA9IEVNWAorICAgIHsKKyAgICAgIEVDSE8gIkNvbXBpbGVyIGlzIEdDQy1FTVgiIDsKKyAgICAgIEFSICAgICAgICAgICAgPz0gYXIgLXJ1IDsKKyAgICAgIENDICAgICAgICAgICAgPz0gZ2NjIDsKKyAgICAgIENDRkxBR1MgICAgICAgPz0gIiIgOworICAgICAgQysrICAgICAgICAgICA/PSAkKENDKSA7CisgICAgICBDKytGTEFHUyAgICAgID89ICQoQ0NGTEFHUykgOworICAgICAgTElOSyAgICAgICAgICA/PSAkKENDKSA7CisgICAgICBMSU5LRkxBR1MgICAgID89ICIiIDsKKyAgICAgIExJTktMSUJTICAgICAgPz0gIiIgOworICAgICAgT1BUSU0gICAgICAgICA/PSA7CisgICAgICBTVUZPQkogICAgICAgICA9IC5vIDsKKyAgICAgIFNVRkxJQiAgICAgICAgID0gLmEgOworICAgICAgVU5ERUZGTEFHICAgICA/PSAiLVUiIDsKKyAgICAgIFNMQVNIICAgICAgICAgID0gLyA7CisjICAgICBOT0FSU0NBTiAgICAgID89IHRydWUgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICBFWElUICAiU29ycnksIGJ1dCB0aGUgJChKQU1fVE9PTFNFVCkgdG9vbHNldCBpc24ndCBzdXBwb3J0ZWQgZm9yIG5vdyIgOworICAgIH0KK30KK2Vsc2UgaWYgJChWTVMpCit7CisgICAgQysrICAgICAgICAgPz0gY3h4IDsKKyAgICBDKytGTEFHUyAgICA/PSA7CisgICAgQ0MgICAgICAgICAgPz0gY2MgOworICAgIENDRkxBR1MgICAgID89IDsKKyAgICBDSE1PRCAgICAgICA/PSBzZXQgZmlsZS9wcm90PSA7CisgICAgQ1AgICAgICAgICAgPz0gY29weS9yZXBsYWNlIDsKKyAgICBDUkVMSUIgICAgICA/PSB0cnVlIDsKKyAgICBET1QgICAgICAgICA/PSBbXSA7CisgICAgRE9URE9UICAgICAgPz0gWy1dIDsKKyAgICBFWEVNT0RFICAgICA/PSAodzplKSA7CisgICAgRklMRU1PREUgICAgPz0gKHc6cikgOworICAgIEhEUlMgICAgICAgID89IDsKKyAgICBMSU5LICAgICAgICA/PSBsaW5rIDsKKyAgICBMSU5LRkxBR1MgICA/PSAiIiA7CisgICAgTElOS0xJQlMgICAgPz0gOworICAgIE1LRElSICAgICAgID89IGNyZWF0ZS9kaXIgOworICAgIE1WICAgICAgICAgID89IHJlbmFtZSA7CisgICAgT1BUSU0gICAgICAgPz0gIiIgOworICAgIFJNICAgICAgICAgID89IGRlbGV0ZSA7CisgICAgUlVOVk1TICAgICAgPz0gbWNyIDsKKyAgICBTSEVMTE1PREUgICA/PSAodzplcikgOworICAgIFNMQVNIICAgICAgID89IC4gOworICAgIFNUREhEUlMgICAgID89IGRlY2MkbGlicmFyeV9pbmNsdWRlIDsKKyAgICBTVUZFWEUgICAgICA/PSAuZXhlIDsKKyAgICBTVUZMSUIgICAgICA/PSAub2xiIDsKKyAgICBTVUZPQkogICAgICA/PSAub2JqIDsKKworICAgIHN3aXRjaCAkKE9TKQorICAgIHsKKyAgICBjYXNlIE9QRU5WTVMgOiBDQ0ZMQUdTICA/PSAvc3RhbmQ9dmF4YyA7CisgICAgY2FzZSBWTVMgICAgIDogTElOS0xJQlMgPz0gc3lzJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliIDsKKyAgICB9Cit9CitlbHNlIGlmICQoTUFDKQoreworICAgIGxvY2FsIE9QVCA7CisKKyAgICBDVyAgPz0gIntDV30iIDsKKworICAgIE1BQ0hEUlMgPz0KKyAgICAgICAgIiQoVU1BQ0hEUlMpOlVuaXZlcnNhbDpJbnRlcmZhY2VzOkNJbmNsdWRlcyIKKyAgICAgICAgIiQoQ1cpOk1TTDpNU0xfQzpNU0xfQ29tbW9uOkluY2x1ZGUiCisgICAgICAgICIkKENXKTpNU0w6TVNMX0M6TVNMX01hY09TOkluY2x1ZGUiIDsKKworICAgIE1BQ0xJQlMgPz0KKyAgICAgICAgIiQoQ1cpOk1hY09TIFN1cHBvcnQ6VW5pdmVyc2FsOkxpYnJhcmllczpTdHViTGlicmFyaWVzOkludGVyZmFjZWxpYiIKKyAgICAgICAgIiQoQ1cpOk1hY09TIFN1cHBvcnQ6VW5pdmVyc2FsOkxpYnJhcmllczpTdHViTGlicmFyaWVzOk1hdGhsaWIiIDsKKworICAgIE1QV0xJQlMgPz0KKyAgICAgICAgIiQoQ1cpOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOlJ1bnRpbWU6UnVudGltZSBQUEM6TVNMIE1QV0NSdW50aW1lLmxpYiIKKyAgICAgICAgIiQoQ1cpOk1TTDpNU0xfQzpNU0xfTWFjT1M6TGliOlBQQzpNU0wgQy5QUEMgTVBXLkxpYiIgOworCisgICAgTVBXTkxMSUJTID89CisgICAgICAgICIkKENXKTpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpSdW50aW1lOlJ1bnRpbWUgUFBDOk1TTCBNUFdDUnVudGltZS5saWIiCisgICAgICAgICIkKENXKTpNU0w6TVNMX0M6TVNMX01hY09TOkxpYjpQUEM6TVNMIEMuUFBDIE1QVyhOTCkuTGliIiA7CisKKyAgICBTSU9VWEhEUlMgPz0gOworCisgICAgU0lPVVhMSUJTID89CisgICAgICAgICIkKENXKTpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpSdW50aW1lOlJ1bnRpbWUgUFBDOk1TTCBSdW50aW1lUFBDLmxpYiIKKyAgICAgICAgIiQoQ1cpOk1TTDpNU0xfQzpNU0xfTWFjT1M6TGliOlBQQzpNU0wgU0lPVVguUFBDLkxpYiIKKyAgICAgICAgIiQoQ1cpOk1TTDpNU0xfQzpNU0xfTWFjT1M6TGliOlBQQzpNU0wgQy5QUEMuTGliIiA7CisKKyAgICBDKysgICAgICAgICA/PSBtd2NwcGMgOworICAgIEMrK0ZMQUdTICAgID89IC13IG9mZiAtbm9tYXBjciA7CisgICAgQ0MgICAgICAgICAgPz0gbXdjcHBjIDsKKyAgICBDQ0ZMQUdTICAgICA/PSAtdyBvZmYgLW5vbWFwY3IgOworICAgIENQICAgICAgICAgID89IGR1cGxpY2F0ZSAteSA7CisgICAgRE9UICAgICAgICAgPz0gIjoiIDsKKyAgICBET1RET1QgICAgICA/PSAiOjoiIDsKKyAgICBIRFJTICAgICAgICA/PSAkKE1BQ0hEUlMpICQoTVBXSERSUykgOworICAgIExJTksgICAgICAgID89IG13bGlua3BwYyA7CisgICAgTElOS0ZMQUdTICAgPz0gLW1wd3Rvb2wgLXdhcm4gOworICAgIExJTktMSUJTICAgID89ICQoTUFDTElCUykgJChNUFdMSUJTKSA7CisgICAgTUtESVIgICAgICAgPz0gbmV3Zm9sZGVyIDsKKyAgICBNViAgICAgICAgICA/PSByZW5hbWUgLXkgOworICAgIE5PQVJTQ0FOICAgID89IHRydWUgOworICAgIE9QVElNICAgICAgID89IDsKKyAgICBSTSAgICAgICAgICA/PSBkZWxldGUgLXkgOworICAgIFNMQVNIICAgICAgID89ICI6IiA7CisgICAgU1RESERSUyAgICAgPz0gOworICAgIFNVRkxJQiAgICAgID89IC5saWIgOworICAgIFNVRk9CSiAgICAgID89IC5vIDsKK30KK2Vsc2UgaWYgJChPUykgPSBCRU9TICYmICQoTUVUUk9XRVJLUykKK3sKKyAgICBBUiAgICAgICAgICA/PSBtd2xkIC14bWwgLW8gOworICAgIEJJTkRJUiAgICAgID89IC9ib290L2FwcHMgOworICAgIENDICAgICAgICAgID89IG13Y2MgOworICAgIENDRkxBR1MgICAgID89IC1ub3N5c3BhdGggOworICAgIEMrKyAgICAgICAgID89ICQoQ0MpIDsKKyAgICBDKytGTEFHUyAgICA/PSAtbm9zeXNwYXRoIDsKKyAgICBGT1JUUkFOICAgICA/PSAiIiA7CisgICAgTElCRElSICAgICAgPz0gL2Jvb3QvZGV2ZWxvcC9saWJyYXJpZXMgOworICAgIExJTksgICAgICAgID89IG13bGQgOworICAgIExJTktGTEFHUyAgID89ICIiIDsKKyAgICBNQU5ESVIgICAgICA/PSAvYm9vdC9kb2N1bWVudGF0aW9uLyJTaGVsbCBUb29scyIvSFRNTCA7CisgICAgTk9BUlNDQU4gICAgPz0gdHJ1ZSA7CisgICAgU1RESERSUyAgICAgPz0gL2Jvb3QvZGV2ZWxvcC9oZWFkZXJzL3Bvc2l4IDsKK30KK2Vsc2UgaWYgJChPUykgPSBCRU9TCit7CisgICAgQklORElSICAgICAgPz0gL2Jvb3QvYXBwcyA7CisgICAgQ0MgICAgICAgICAgPz0gZ2NjIDsKKyAgICBDKysgICAgICAgICA/PSAkKENDKSA7CisgICAgRk9SVFJBTiAgICAgPz0gIiIgOworICAgIExJQkRJUiAgICAgID89IC9ib290L2RldmVsb3AvbGlicmFyaWVzIDsKKyAgICBMSU5LICAgICAgICA/PSBnY2MgOworICAgIExJTktMSUJTICAgID89IC1sbmV0IDsKKyAgICBOT0FSU0NBTiAgICA/PSB0cnVlIDsKKyAgICBTVERIRFJTICAgICA/PSAvYm9vdC9kZXZlbG9wL2hlYWRlcnMvcG9zaXggOworfQorZWxzZSBpZiAkKFVOSVgpCit7CisgICAgc3dpdGNoICQoT1MpCisgICAgeworICAgIGNhc2UgQUlYIDoKKyAgICBMSU5LTElCUyAgICA/PSAtbGJzZCA7CisKKyAgICBjYXNlIEFNSUdBIDoKKyAgICBDQyAgICAgICAgICA/PSBnY2MgOworICAgIFlBQ0MgICAgICAgID89ICJiaXNvbiAteSIgOworCisgICAgY2FzZSBDWUdXSU4gOgorICAgIENDICAgICAgICAgID89IGdjYyA7CisgICAgQ0NGTEFHUyAgICAgKz0gLURfX2N5Z3dpbl9fIDsKKyAgICBMRVggICAgICAgICA/PSBmbGV4IDsKKyAgICBSQU5MSUIgICAgICA/PSAiIiA7CisgICAgU1VGRVhFICAgICAgPz0gLmV4ZSA7CisgICAgWUFDQyAgICAgICAgPz0gImJpc29uIC15IiA7CisKKyAgICBjYXNlIERHVVggOgorICAgIFJBTkxJQiAgICAgID89ICIiIDsKKyAgICBSRUxPQ0FURSAgICA/PSB0cnVlIDsKKworICAgIGNhc2UgSFBVWCA6CisgICAgWUFDQyAgICAgICAgPSA7CisgICAgQ0ZMQUdTICAgICAgKz0gLUFlIDsKKyAgICBDQ0ZMQUdTICAgICArPSAtQWUgOworICAgIFJBTkxJQiAgICAgID89ICIiIDsKKworICAgIGNhc2UgSU5URVJJWCA6CisgICAgQ0MgICAgICAgICAgPz0gZ2NjIDsKKyAgICBSQU5MSUIgICAgICA/PSAiIiA7CisKKyAgICBjYXNlIElSSVggOgorICAgIFJBTkxJQiAgICAgID89ICIiIDsKKworICAgIGNhc2UgTVBFSVggOgorICAgIENDICAgICAgICAgID89IGdjYyA7CisgICAgQysrICAgICAgICAgPz0gZ2NjIDsKKyAgICBDQ0ZMQUdTICAgICArPSAtRF9QT1NJWF9TT1VSQ0UgOworICAgIEhEUlMgICAgICAgICs9IC91c3IvaW5jbHVkZSA7CisgICAgUkFOTElCICAgICAgPz0gIiIgOworICAgIE5PQVJTQ0FOICAgID89IHRydWUgOworICAgIE5PQVJVUERBVEUgID89IHRydWUgOworCisgICAgY2FzZSBNVlMgOgorICAgIFJBTkxJQiAgICAgID89ICIiIDsKKworICAgIGNhc2UgTkVYVCA6CisgICAgQVIgICAgICAgICAgPz0gbGlidG9vbCAtbyA7CisgICAgUkFOTElCICAgICAgPz0gIiIgOworCisgICAgY2FzZSBNQUNPU1ggOgorICAgIEFSICAgICAgICAgID89IGxpYnRvb2wgLW8gOworICAgIEMrKyAgICAgICAgID89IGMrKyA7CisgICAgTUFORElSICAgICAgPz0gL3Vzci9sb2NhbC9zaGFyZS9tYW4gOworICAgIFJBTkxJQiAgICAgID89ICIiIDsKKworICAgIGNhc2UgTkNSIDoKKyAgICBSQU5MSUIgICAgICA/PSAiIiA7CisKKyAgICBjYXNlIFBUWCA6CisgICAgUkFOTElCICAgICAgPz0gIiIgOworCisgICAgY2FzZSBRTlggOgorICAgIEFSICAgICAgICAgID89IHdsaWIgOworICAgIENDICAgICAgICAgID89IGNjIDsKKyAgICBDQ0ZMQUdTICAgICA/PSAtUSA7ICMgcXVpZXQKKyAgICBDKysgICAgICAgICA/PSAkKENDKSA7CisgICAgQysrRkxBR1MgICAgPz0gLVEgOyAjIHF1aWV0CisgICAgTElOSyAgICAgICAgPz0gJChDQykgOworICAgIExJTktGTEFHUyAgID89IC1RIDsgIyBxdWlldAorICAgIE5PQVJTQ0FOICAgID89IHRydWUgOworICAgIFJBTkxJQiAgICAgID89ICIiIDsKKworICAgIGNhc2UgU0NPIDoKKyAgICBSQU5MSUIgICAgICA/PSAiIiA7CisgICAgUkVMT0NBVEUgICAgPz0gdHJ1ZSA7CisKKyAgICBjYXNlIFNJTklYIDoKKyAgICBSQU5MSUIgICAgICA/PSAiIiA7CisKKyAgICBjYXNlIFNPTEFSSVMgOgorICAgIFJBTkxJQiAgICAgID89ICIiIDsKKyAgICBBUiAgICAgICAgICA/PSAiL3Vzci9jY3MvYmluL2FyIHJ1IiA7CisKKyAgICBjYXNlIFVOSUNPUyA6CisgICAgTk9BUlNDQU4gICAgPz0gdHJ1ZSA7CisgICAgT1BUSU0gICAgICAgPz0gLU8wIDsKKworICAgIGNhc2UgVU5JWFdBUkUgOgorICAgIFJBTkxJQiAgICAgID89ICIiIDsKKyAgICBSRUxPQ0FURSAgICA/PSB0cnVlIDsKKyAgICB9CisKKyAgICAjIFVOSVggZGVmYXVsdHMKKworICAgIENDRkxBR1MgICAgID89IDsKKyAgICBDKytGTEFHUyAgICA/PSAkKENDRkxBR1MpIDsKKyAgICBDSE1PRCAgICAgICA/PSBjaG1vZCA7CisgICAgQ0hHUlAgICAgICAgPz0gY2hncnAgOworICAgIENIT1dOICAgICAgID89IGNob3duIDsKKyAgICBMRVggICAgICAgICA/PSBsZXggOworICAgIExJTktGTEFHUyAgID89ICQoQ0NGTEFHUykgOworICAgIExJTktMSUJTICAgID89IDsKKyAgICBPUFRJTSAgICAgICA/PSAtTyA7CisgICAgUkFOTElCICAgICAgPz0gcmFubGliIDsKKyAgICBZQUNDICAgICAgICA/PSB5YWNjIDsKKyAgICBZQUNDRklMRVMgICA/PSB5LnRhYiA7CisgICAgWUFDQ0ZMQUdTICAgPz0gLWQgOworfQorCisjCisjIEdlbmVyYWwgZGVmYXVsdHM7IGEgbG90IGxpa2UgVU5JWAorIworCisgICAgQVIgICAgICAgICAgPz0gYXIgcnUgOworICAgIEFTICAgICAgICAgID89IGFzIDsKKyAgICBBU0ZMQUdTICAgICA/PSA7CisgICAgQVdLICAgICAgICAgPz0gYXdrIDsKKyAgICBCSU5ESVIgICAgICA/PSAvdXNyL2xvY2FsL2JpbiA7CisgICAgQysrICAgICAgICAgPz0gY2MgOworICAgIEMrK0ZMQUdTICAgID89IDsKKyAgICBDQyAgICAgICAgICA/PSBjYyA7CisgICAgQ0NGTEFHUyAgICAgPz0gOworICAgIENQICAgICAgICAgID89IGNwIC1mIDsKKyAgICBDUkVMSUIgICAgICA/PSA7CisgICAgRE9UICAgICAgICAgPz0gLiA7CisgICAgRE9URE9UICAgICAgPz0gLi4gOworICAgIEVYRU1PREUgICAgID89IDcxMSA7CisgICAgRklMRU1PREUgICAgPz0gNjQ0IDsKKyAgICBGT1JUUkFOICAgICA/PSBmNzcgOworICAgIEZPUlRSQU5GTEFHUyA/PSA7CisgICAgSERSUyAgICAgICAgPz0gOworICAgIElOU1RBTExHUklTVCA/PSBpbnN0YWxsZWQgOworICAgIEpBTUZJTEUgICAgID89IEphbWZpbGUgOworICAgIEpBTVJVTEVTICAgID89IEphbXJ1bGVzIDsKKyAgICBMRVggICAgICAgICA/PSA7CisgICAgTElCRElSICAgICAgPz0gL3Vzci9sb2NhbC9saWIgOworICAgIExJTksgICAgICAgID89ICQoQ0MpIDsKKyAgICBMSU5LRkxBR1MgICA/PSA7CisgICAgTElOS0xJQlMgICAgPz0gOworICAgIExOICAgICAgICAgID89IGxuIDsKKyAgICBNQU5ESVIgICAgICA/PSAvdXNyL2xvY2FsL21hbiA7CisgICAgTUtESVIgICAgICAgPz0gbWtkaXIgOworICAgIE1WICAgICAgICAgID89IG12IC1mIDsKKyAgICBPUFRJTSAgICAgICA/PSA7CisgICAgUkNQICAgICAgICAgPz0gcmNwIDsKKyAgICBSTSAgICAgICAgICA/PSBybSAtZiA7CisgICAgUlNIICAgICAgICAgPz0gcnNoIDsKKyAgICBTRUQgICAgICAgICA/PSBzZWQgOworICAgIFNIRUxMSEVBREVSID89ICIjIS9iaW4vc2giIDsKKyAgICBTSEVMTE1PREUgICA/PSA3NTUgOworICAgIFNMQVNIICAgICAgID89IC8gOworICAgIFNUREhEUlMgICAgID89IC91c3IvaW5jbHVkZSA7CisgICAgU1VGRVhFICAgICAgPz0gIiIgOworICAgIFNVRkxJQiAgICAgID89IC5hIDsKKyAgICBTVUZPQkogICAgICA/PSAubyA7CisgICAgVU5ERUZGTEFHICAgPz0gIi11IF8iIDsKKyAgICBZQUNDICAgICAgICA/PSA7CisgICAgWUFDQ0ZJTEVTICAgPz0gOworICAgIFlBQ0NGTEFHUyAgID89IDsKKworICAgIEhEUlBBVFRFUk4gPQorICAgICAgICAgICAgIl5bICAgICBdKiNbICAgIF0qaW5jbHVkZVsgIF0qWzxcIl0oW15cIj5dKilbXCI+XS4qJCIgOworCisgICAgT1NGVUxMID0gJChPUykkKE9TVkVSKSQoT1NQTEFUKSAkKE9TKSQoT1NQTEFUKSAkKE9TKSQoT1NWRVIpICQoT1MpIDsKKworCisjCisjIEJhc2UgZGVwZW5kZW5jaWVzIC0gZmlyc3QgZm9yICJib290c3RyYXAiIGtpbmRzIG9mIHJ1bGVzCisjCisKK0RFUEVORFMgYWxsIDogc2hlbGwgZmlsZXMgbGliIGV4ZSBvYmogOworREVQRU5EUyBhbGwgc2hlbGwgZmlsZXMgbGliIGV4ZSBvYmogOiBmaXJzdCA7CitOT1RGSUxFIGFsbCBmaXJzdCBzaGVsbCBmaWxlcyBsaWIgZXhlIG9iaiBkaXJzIGNsZWFuIHVuaW5zdGFsbCA7CitBTFdBWVMgY2xlYW4gdW5pbnN0YWxsIDsKKworIworIyBSdWxlcworIworCitydWxlIEFzCit7CisgICAgREVQRU5EUyAkKDwpIDogJCg+KSA7CisgICAgQVNGTEFHUyBvbiAkKDwpICs9ICQoQVNGTEFHUykgJChTVUJESVJBU0ZMQUdTKSA7Cit9CisKK3J1bGUgQnVsaworeworICAgIGxvY2FsIGkgOworCisgICAgZm9yIGkgaW4gJCg+KQorICAgIHsKKyAgICAgICAgRmlsZSAkKGk6RD0kKDwpKSA6ICQoaSkgOworICAgIH0KK30KKworcnVsZSBDYworeworICAgIGxvY2FsIF9oIDsKKworICAgIERFUEVORFMgJCg8KSA6ICQoPikgOworCisgICAgIyBKdXN0IHRvIGNsYXJpZnkgaGVyZTogdGhpcyBzZXRzIHRoZSBwZXItdGFyZ2V0IENDRkxBR1MgdG8KKyAgICAjIGJlIHRoZSBjdXJyZW50IHZhbHVlIG9mIChnbG9iYWwpIENDRkxBR1MgYW5kIFNVQkRJUkNDRkxBR1MuCisKKyAgICBDQ0ZMQUdTIG9uICQoPCkgKz0gJChDQ0ZMQUdTKSAkKFNVQkRJUkNDRkxBR1MpIDsKKworICAgICMgSWYgdGhlIGNvbXBpbGVyJ3MgLW8gZmxhZyBkb2Vzbid0IHdvcmssIHJlbG9jYXRlIHRoZSAubworCisgICAgaWYgJChSRUxPQ0FURSkKKyAgICB7CisgICAgICAgIENjTXYgJCg8KSA6ICQoPikgOworICAgIH0KKworICAgIF9oID0gJChTRUFSQ0hfU09VUkNFKSAkKEhEUlMpICQoU1VCRElSSERSUykgOworCisgICAgaWYgJChWTVMpICYmICQoX2gpCisgICAgeworICAgICAgICBTTEFTSElOQyBvbiAkKDwpID0gIi9pbmM9KCIgJChfaFsxXSkgLCQoX2hbMi1dKSAiKSIgOworICAgIH0KKyAgICBlbHNlIGlmICQoTUFDKSAmJiAkKF9oKQorICAgIHsKKyAgICAgICAgbG9jYWwgX2kgX2ogOworICAgICAgICBfaiA9ICQoX2hbMV0pIDsKKyAgICAgICAgZm9yIF9pIGluICQoX2hbMi1dKQorICAgICAgICB7CisgICAgICAgICAgICBfaiA9ICQoX2opLCQoX2kpIDsKKyAgICAgICAgfQorICAgICAgICBNQUNJTkMgb24gJCg8KSA9IFwiJChfailcIiA7CisgICAgfQorfQorCitydWxlIEMrKworeworICAgIGxvY2FsIF9oIDsKKworICAgIERFUEVORFMgJCg8KSA6ICQoPikgOworICAgIEMrK0ZMQUdTIG9uICQoPCkgKz0gJChDKytGTEFHUykgJChTVUJESVJDKytGTEFHUykgOworCisgICAgaWYgJChSRUxPQ0FURSkKKyAgICB7CisgICAgICAgIENjTXYgJCg8KSA6ICQoPikgOworICAgIH0KKworICAgIF9oID0gJChTRUFSQ0hfU09VUkNFKSAkKEhEUlMpICQoU1VCRElSSERSUykgOworCisgICAgaWYgJChWTVMpICYmICQoX2gpCisgICAgeworICAgICAgICBTTEFTSElOQyBvbiAkKDwpID0gIi9pbmM9KCIgJChfaFsxXSkgLCQoX2hbMi1dKSAiKSIgOworICAgIH0KKyAgICBlbHNlIGlmICQoTUFDKSAmJiAkKF9oKQorICAgIHsKKyAgICAgICAgbG9jYWwgX2kgX2ogOworICAgICAgICBfaiA9ICQoX2hbMV0pIDsKKyAgICAgICAgZm9yIF9pIGluICQoX2hbMi1dKQorICAgICAgICB7CisgICAgICAgICAgICBfaiA9ICQoX2opLCQoX2kpIDsKKyAgICAgICAgfQorICAgICAgICBNQUNJTkMgb24gJCg8KSA9IFwiJChfailcIiA7CisgICAgfQorfQorCitydWxlIENobW9kCit7CisgICAgaWYgJChDSE1PRCkgeyBDaG1vZDEgJCg8KSA7IH0KK30KKworcnVsZSBGaWxlCit7CisgICAgREVQRU5EUyBmaWxlcyA6ICQoPCkgOworICAgIERFUEVORFMgJCg8KSA6ICQoPikgOworICAgIFNFQVJDSCBvbiAkKD4pID0gJChTRUFSQ0hfU09VUkNFKSA7CisgICAgTU9ERSBvbiAkKDwpID0gJChGSUxFTU9ERSkgOworICAgIENobW9kICQoPCkgOworfQorCitydWxlIEZvcnRyYW4KK3sKKyAgICBERVBFTkRTICQoPCkgOiAkKD4pIDsKK30KKworcnVsZSBHZW5GaWxlCit7CisgICAgbG9jYWwgX3QgPSBbIEZHcmlzdFNvdXJjZUZpbGVzICQoPCkgXSA7CisgICAgbG9jYWwgX3MgPSBbIEZBcHBlbmRTdWZmaXggJCg+WzFdKSA6ICQoU1VGRVhFKSBdIDsKKyAgICBEZXBlbmRzICQoX3QpIDogJChfcykgJCg+WzItXSkgOworICAgIEdlbkZpbGUxICQoX3QpIDogJChfcykgJCg+WzItXSkgOworICAgIENsZWFuIGNsZWFuIDogJChfdCkgOworfQorCitydWxlIEdlbkZpbGUxCit7CisgICAgTWFrZUxvY2F0ZSAkKDwpIDogJChMT0NBVEVfU09VUkNFKSA7CisgICAgU0VBUkNIIG9uICQoPikgPSAkKFNFQVJDSF9TT1VSQ0UpIDsKK30KKworcnVsZSBIYXJkTGluaworeworICAgIERFUEVORFMgZmlsZXMgOiAkKDwpIDsKKyAgICBERVBFTkRTICQoPCkgOiAkKD4pIDsKKyAgICBTRUFSQ0ggb24gJCg+KSA9ICQoU0VBUkNIX1NPVVJDRSkgOworfQorCitydWxlIEhkck1hY3JvRmlsZQoreworICAjIEhkck1hY3JvRmlsZSBmaWxlIDsKKyAgIworICAjIHRoaXMgcnVsZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBnaXZlbiBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zCisgICMgZm9yIGZpbGVuYW1lIG1hY3JvcyAoZS5nLiAiI2RlZmluZSAgTVlGSUxFX0ggPG15ZmlsZS5oPiIpIHRoYXQgY2FuCisgICMgbGF0ZXIgYmUgdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIGluIHRoZSByZXN0IG9mIHRoZSBzb3VyY2UKKyAgIworICAjIHRoZXNlcyBmaWxlcyBtdXN0IGJlIHBhcnNlZCBiZWZvcmUgYW55IG1ha2UgaXMgdHJpZWQuLgorICAjCisgIEhEUk1BQ1JPICQoPCkgOworfQorCitydWxlIEhkclJ1bGUKK3sKKyAgICAjIEhkclJ1bGUgc291cmNlIDogaGVhZGVycyA7CisKKyAgICAjIE4uQi4gIFRoaXMgcnVsZSBpcyBjYWxsZWQgZHVyaW5nIGJpbmRpbmcsIHBvdGVudGlhbGx5IGFmdGVyCisgICAgIyB0aGUgZmF0ZSBvZiBtYW55IHRhcmdldHMgaGFzIGJlZW4gZGV0ZXJtaW5lZCwgYW5kIG11c3QgYmUKKyAgICAjIHVzZWQgd2l0aCBjYXV0aW9uOiBkb24ndCBhZGQgZGVwZW5kZW5jaWVzIHRvIHVucmVsYXRlZAorICAgICMgdGFyZ2V0cywgYW5kIGRvbid0IHNldCB2YXJpYWJsZXMgb24gJCg8KS4KKworICAgICMgVGVsbCBKYW0gdGhhdCBhbnl0aGluZyBkZXBlbmRpbmcgb24gJCg8KSBhbHNvIGRlcGVuZHMgb24gJCg+KSwKKyAgICAjIHNldCBTRUFSQ0ggc28gSmFtIGNhbiBmaW5kIHRoZSBoZWFkZXJzLCBidXQgdGhlbiBzYXkgd2UgZG9uJ3QKKyAgICAjIGNhcmUgaWYgd2UgY2FuJ3QgYWN0dWFsbHkgZmluZCB0aGUgaGVhZGVycyAodGhleSBtYXkgaGF2ZSBiZWVuCisgICAgIyB3aXRoaW4gaWZkZWZzKSwKKworICAgIGxvY2FsIHMgOworCisgICAgaWYgJChIRFJHUklTVCkKKyAgICB7CisgICAgICAgIHMgPSAkKD46Rz0kKEhEUkdSSVNUKSkgOworICAgIH0gZWxzZSB7CisgICAgICAgIHMgPSAkKD4pIDsKKyAgICB9CisKKyAgICBJTkNMVURFUyAkKDwpIDogJChzKSA7CisgICAgU0VBUkNIIG9uICQocykgPSAkKEhEUlNFQVJDSCkgOworICAgIE5PQ0FSRSAkKHMpIDsKKworICAgICMgUHJvcGFnYXRlIG9uICQoPCkgdG8gJCg+KQorCisgICAgSERSU0VBUkNIIG9uICQocykgPSAkKEhEUlNFQVJDSCkgOworICAgIEhEUlNDQU4gb24gJChzKSA9ICQoSERSU0NBTikgOworICAgIEhEUlJVTEUgb24gJChzKSA9ICQoSERSUlVMRSkgOworICAgIEhEUkdSSVNUIG9uICQocykgPSAkKEhEUkdSSVNUKSA7Cit9CisKK3J1bGUgSW5zdGFsbEludG8KK3sKKyAgICAjIEluc3RhbGxJbnRvIGRpciA6IHNvdXJjZXMgOworCisgICAgbG9jYWwgaSB0IDsKKworICAgIHQgPSAkKD46Rz0kKElOU1RBTExHUklTVCkpIDsKKworICAgICMgQXJyYW5nZSBmb3IgamFtIGluc3RhbGwKKyAgICAjIEFycmFuZ2UgZm9yIGphbSB1bmluc3RhbGwKKyAgICAjIHNvdXJjZXMgYXJlIGluIFNFQVJDSF9TT1VSQ0UKKyAgICAjIHRhcmdldHMgYXJlIGluIGRpcgorCisgICAgRGVwZW5kcyBpbnN0YWxsIDogJCh0KSA7CisgICAgQ2xlYW4gdW5pbnN0YWxsIDogJCh0KSA7CisgICAgU0VBUkNIIG9uICQoPikgPSAkKFNFQVJDSF9TT1VSQ0UpIDsKKyAgICBNYWtlTG9jYXRlICQodCkgOiAkKDwpIDsKKworICAgICMgRm9yIGVhY2ggc291cmNlLCBtYWtlIGdyaXN0ZWQgdGFyZ2V0IG5hbWUKKyAgICAjIGFuZCBJbnN0YWxsLCBDaG1vZCwgQ2hvd24sIGFuZCBDaGdycAorCisgICAgZm9yIGkgaW4gJCg+KQorICAgIHsKKyAgICAgICAgbG9jYWwgdHQgPSAkKGk6Rz0kKElOU1RBTExHUklTVCkpIDsKKworICAgICAgICBEZXBlbmRzICQodHQpIDogJChpKSA7CisgICAgICAgIEluc3RhbGwgJCh0dCkgOiAkKGkpIDsKKyAgICAgICAgQ2htb2QgJCh0dCkgOworCisgICAgICAgIGlmICQoT1dORVIpICYmICQoQ0hPV04pCisgICAgICAgIHsKKyAgICAgICAgQ2hvd24gJCh0dCkgOworICAgICAgICBPV05FUiBvbiAkKHR0KSA9ICQoT1dORVIpIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICQoR1JPVVApICYmICQoQ0hHUlApCisgICAgICAgIHsKKyAgICAgICAgQ2hncnAgJCh0dCkgOworICAgICAgICBHUk9VUCBvbiAkKHR0KSA9ICQoR1JPVVApIDsKKyAgICAgICAgfQorICAgIH0KK30KKworcnVsZSBJbnN0YWxsQmluCit7CisgICAgbG9jYWwgX3QgPSBbIEZBcHBlbmRTdWZmaXggJCg+KSA6ICQoU1VGRVhFKSBdIDsKKworICAgIEluc3RhbGxJbnRvICQoPCkgOiAkKF90KSA7CisgICAgTU9ERSBvbiAkKF90Okc9aW5zdGFsbGVkKSA9ICQoRVhFTU9ERSkgOworfQorCitydWxlIEluc3RhbGxGaWxlCit7CisgICAgSW5zdGFsbEludG8gJCg8KSA6ICQoPikgOworICAgIE1PREUgb24gJCg+Okc9aW5zdGFsbGVkKSA9ICQoRklMRU1PREUpIDsKK30KKworcnVsZSBJbnN0YWxsTGliCit7CisgICAgSW5zdGFsbEludG8gJCg8KSA6ICQoPikgOworICAgIE1PREUgb24gJCg+Okc9aW5zdGFsbGVkKSA9ICQoRklMRU1PREUpIDsKK30KKworcnVsZSBJbnN0YWxsTWFuCit7CisgICAgIyBSZWFsbHkgdGhpcyBqdXN0IHN0cmlwcyB0aGUgLiBmcm9tIHRoZSBzdWZmaXgKKworICAgIGxvY2FsIGkgcyBkIDsKKworICAgIGZvciBpIGluICQoPikKKyAgICB7CisgICAgICAgIHN3aXRjaCAkKGk6UykKKyAgICAgICAgeworICAgICAgICBjYXNlIC4xIDogcyA9IDEgOyBjYXNlIC4yIDogcyA9IDIgOyBjYXNlIC4zIDogcyA9IDMgOworICAgICAgICBjYXNlIC40IDogcyA9IDQgOyBjYXNlIC41IDogcyA9IDUgOyBjYXNlIC42IDogcyA9IDYgOworICAgICAgICBjYXNlIC43IDogcyA9IDcgOyBjYXNlIC44IDogcyA9IDggOyBjYXNlIC5sIDogcyA9IGwgOworICAgICAgICBjYXNlIC5uIDogcyA9IG4gOyBjYXNlIC5tYW4gOiBzID0gMSA7CisgICAgICAgIH0KKworICAgICAgICBkID0gbWFuJChzKSA7CisKKyAgICAgICAgSW5zdGFsbEludG8gJChkOlI9JCg8KSkgOiAkKGkpIDsKKyAgICB9CisKKyAgICBNT0RFIG9uICQoPjpHPWluc3RhbGxlZCkgPSAkKEZJTEVNT0RFKSA7Cit9CisKK3J1bGUgSW5zdGFsbFNoZWxsCit7CisgICAgSW5zdGFsbEludG8gJCg8KSA6ICQoPikgOworICAgIE1PREUgb24gJCg+Okc9aW5zdGFsbGVkKSA9ICQoU0hFTExNT0RFKSA7Cit9CisKK3J1bGUgTGV4Cit7CisgICAgTGV4TXYgJCg8KSA6ICQoPikgOworICAgIERFUEVORFMgJCg8KSA6ICQoPikgOworICAgIE1ha2VMb2NhdGUgJCg8KSA6ICQoTE9DQVRFX1NPVVJDRSkgOworICAgIENsZWFuIGNsZWFuIDogJCg8KSA7Cit9CisKK3J1bGUgTGlicmFyeQoreworICAgIExpYnJhcnlGcm9tT2JqZWN0cyAkKDwpIDogJCg+OlM9JChTVUZPQkopKSA7CisgICAgT2JqZWN0cyAkKD4pIDsKK30KKworcnVsZSBMaWJyYXJ5RnJvbU9iamVjdHMKK3sKKyAgICBsb2NhbCBfaSBfbCBfcyA7CisKKyAgICAjIEFkZCBncmlzdCB0byBmaWxlIG5hbWVzCisKKyAgICBfcyA9IFsgRkdyaXN0RmlsZXMgJCg+KSBdIDsKKyAgICBfbCA9ICQoPDpTPSQoU1VGTElCKSkgOworCisgICAgIyBsaWJyYXJ5IGRlcGVuZHMgb24gaXRzIG1lbWJlciBvYmplY3RzCisKKyAgICBpZiAkKEtFRVBPQkpTKQorICAgIHsKKyAgICAgICAgREVQRU5EUyBvYmogOiAkKF9zKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERFUEVORFMgbGliIDogJChfbCkgOworICAgIH0KKworICAgICMgU2V0IExPQ0FURSBmb3IgdGhlIGxpYnJhcnkgYW5kIGl0cyBjb250ZW50cy4gIFRoZSBib3VuZAorICAgICMgdmFsdWUgc2hvd3MgdXAgYXMgJChORUVETElCUykgb24gdGhlIExpbmsgYWN0aW9ucy4KKyAgICAjIEZvciBjb21wYXRpYmlsaXR5LCB3ZSBvbmx5IGRvIHRoaXMgaWYgdGhlIGxpYnJhcnkgZG9lc24ndAorICAgICMgYWxyZWFkeSBoYXZlIGEgcGF0aC4KKworICAgIGlmICEgJChfbDpEKQorICAgIHsKKyAgICAgICAgTWFrZUxvY2F0ZSAkKF9sKSAkKF9sKSgkKF9zOkJTKSkgOiAkKExPQ0FURV9UQVJHRVQpIDsKKyAgICB9CisKKyAgICBpZiAkKE5PQVJTQ0FOKQorICAgIHsKKyAgICAgICAgIyBJZiB3ZSBjYW4ndCBzY2FuIHRoZSBsaWJyYXJ5IHRvIHRpbWVzdGFtcCBpdHMgY29udGVudHMsCisgICAgICAgICMgd2UgaGF2ZSB0byBqdXN0IG1ha2UgdGhlIGxpYnJhcnkgZGVwZW5kIGRpcmVjdGx5IG9uIHRoZQorICAgICAgICAjIG9uLWRpc2sgb2JqZWN0IGZpbGVzLgorCisgICAgICAgIERFUEVORFMgJChfbCkgOiAkKF9zKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICMgSWYgd2UgY2FuIHNjYW4gdGhlIGxpYnJhcnksIHdlIG1ha2UgdGhlIGxpYnJhcnkgZGVwZW5kCisgICAgICAgICMgb24gaXRzIG1lbWJlcnMgYW5kIGVhY2ggbWVtYmVyIGRlcGVuZCBvbiB0aGUgb24tZGlzaworICAgICAgICAjIG9iamVjdCBmaWxlLgorCisgICAgICAgIERFUEVORFMgJChfbCkgOiAkKF9sKSgkKF9zOkJTKSkgOworCisgICAgICAgIGZvciBfaSBpbiAkKF9zKQorICAgICAgICB7CisgICAgICAgIERFUEVORFMgJChfbCkoJChfaTpCUykpIDogJChfaSkgOworICAgICAgICB9CisgICAgfQorCisgICAgQ2xlYW4gY2xlYW4gOiAkKF9sKSA7CisKKyAgICBpZiAkKENSRUxJQikgeyBDcmVMaWIgJChfbCkgOiAkKF9zWzFdKSA7IH0KKworICAgIEFyY2hpdmUgJChfbCkgOiAkKF9zKSA7CisKKyAgICBpZiAkKFJBTkxJQikgeyBSYW5saWIgJChfbCkgOyB9CisKKyAgICAjIElmIHdlIGNhbid0IHNjYW4gdGhlIGxpYnJhcnksIHdlIGhhdmUgdG8gbGVhdmUgdGhlIC5vJ3MgYXJvdW5kLgorCisgICAgaWYgISAoICQoTk9BUlNDQU4pIHx8ICQoS0VFUE9CSlMpICkgeyBSbVRlbXBzICQoX2wpIDogJChfcykgOyB9Cit9CisKK3J1bGUgTGluaworeworICAgIE1PREUgb24gJCg8KSA9ICQoRVhFTU9ERSkgOworICAgIENobW9kICQoPCkgOworfQorCitydWxlIExpbmtMaWJyYXJpZXMKK3sKKyAgICAjIG1ha2UgbGlicmFyeSBkZXBlbmRlbmNpZXMgb2YgdGFyZ2V0CisgICAgIyBzZXQgTkVFRExJQlMgdmFyaWFibGUgdXNlZCBieSAnYWN0aW9ucyBNYWluJworCisgICAgbG9jYWwgX3QgPSBbIEZBcHBlbmRTdWZmaXggJCg8KSA6ICQoU1VGRVhFKSBdIDsKKworICAgIERFUEVORFMgJChfdCkgOiAkKD46Uz0kKFNVRkxJQikpIDsKKyAgICBORUVETElCUyBvbiAkKF90KSArPSAkKD46Uz0kKFNVRkxJQikpIDsKK30KKworcnVsZSBNYWluCit7CisgICAgTWFpbkZyb21PYmplY3RzICQoPCkgOiAkKD46Uz0kKFNVRk9CSikpIDsKKyAgICBPYmplY3RzICQoPikgOworfQorCitydWxlIE1haW5Gcm9tT2JqZWN0cworeworICAgIGxvY2FsIF9zIF90IDsKKworICAgICMgQWRkIGdyaXN0IHRvIGZpbGUgbmFtZXMKKyAgICAjIEFkZCBzdWZmaXggdG8gZXhlCisKKyAgICBfcyA9IFsgRkdyaXN0RmlsZXMgJCg+KSBdIDsKKyAgICBfdCA9IFsgRkFwcGVuZFN1ZmZpeCAkKDwpIDogJChTVUZFWEUpIF0gOworCisgICAgaWYgJChfdCkgIT0gJCg8KQorICAgIHsKKyAgICAgICAgREVQRU5EUyAkKDwpIDogJChfdCkgOworICAgICAgICBOT1RGSUxFICQoPCkgOworICAgIH0KKworICAgICMgbWFrZSBjb21waWxlZCBzb3VyY2VzIGEgZGVwZW5kZW5jeSBvZiB0YXJnZXQKKworICAgIERFUEVORFMgZXhlIDogJChfdCkgOworICAgIERFUEVORFMgJChfdCkgOiAkKF9zKSA7CisgICAgTWFrZUxvY2F0ZSAkKF90KSA6ICQoTE9DQVRFX1RBUkdFVCkgOworCisgICAgQ2xlYW4gY2xlYW4gOiAkKF90KSA7CisKKyAgICBMaW5rICQoX3QpIDogJChfcykgOworfQorCitydWxlIE1ha2VMb2NhdGUKK3sKKyAgICBpZiAkKD4pCisgICAgeworICAgICAgICBMT0NBVEUgb24gJCg8KSA9ICQoPikgOworICAgICAgICBEZXBlbmRzICQoPCkgOiAkKD5bMV0pIDsKKyAgICAgICAgTWtEaXIgJCg+WzFdKSA7CisgICAgfQorfQorCitydWxlIE1rRGlyCit7CisgICAgIyBJZiBkaXIgZXhpc3RzLCBkb24ndCB1cGRhdGUgaXQKKyAgICAjIERvIHRoaXMgZXZlbiBmb3IgJChET1QpLgorCisgICAgTk9VUERBVEUgJCg8KSA7CisKKyAgICBpZiAkKDwpICE9ICQoRE9UKSAmJiAhICQoJCg8KS1ta2RpcikKKyAgICB7CisgICAgICAgIGxvY2FsIHMgOworCisgICAgICAgICMgQ2hlZXN5IGdhdGUgdG8gcHJldmVudCBtdWx0aXBsZSBpbnZvY2F0aW9ucyBvbiBzYW1lIGRpcgorICAgICAgICAjIE1rRGlyMSBoYXMgdGhlIGFjdGlvbnMKKyAgICAgICAgIyBBcnJhbmdlIGZvciBqYW0gZGlycworCisgICAgICAgICQoPCktbWtkaXIgPSB0cnVlIDsKKyAgICAgICAgTWtEaXIxICQoPCkgOworICAgICAgICBEZXBlbmRzIGRpcnMgOiAkKDwpIDsKKworICAgICAgICAjIFJlY3Vyc2l2ZWx5IG1ha2UgcGFyZW50IGRpcmVjdG9yaWVzLgorICAgICAgICAjICQoPDpQKSA9ICQoPCkncyBwYXJlbnQsICYgd2UgcmVjdXJzZSB1bnRpbCByb290CisKKyAgICAgICAgcyA9ICQoPDpQKSA7CisKKyAgICAgICAgaWYgJChOVCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICQocykKKyAgICAgICAgeworICAgICAgICBjYXNlICo6ICAgOiBzID0gOworICAgICAgICBjYXNlICo6XFwgOiBzID0gOworICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAkKHMpICYmICQocykgIT0gJCg8KQorICAgICAgICB7CisgICAgICAgIERlcGVuZHMgJCg8KSA6ICQocykgOworICAgICAgICBNa0RpciAkKHMpIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICQocykKKyAgICAgICAgeworICAgICAgICAgICAgTk9URklMRSAkKHMpIDsKKyAgICAgICAgfQorCisgICAgfQorfQorCitydWxlIE9iamVjdAoreworICAgIGxvY2FsIGggOworCisgICAgIyBsb2NhdGUgb2JqZWN0IGFuZCBzZWFyY2ggZm9yIHNvdXJjZSwgaWYgd2FudGVkCisKKyAgICBDbGVhbiBjbGVhbiA6ICQoPCkgOworCisgICAgTWFrZUxvY2F0ZSAkKDwpIDogJChMT0NBVEVfVEFSR0VUKSA7CisgICAgU0VBUkNIIG9uICQoPikgPSAkKFNFQVJDSF9TT1VSQ0UpIDsKKworICAgICMgU2F2ZSBIRFJTIGZvciAtSSQoSERSUykgb24gY29tcGlsZS4KKyAgICAjIFdlIHNob3VsZG4ndCBuZWVkIC1JJChTRUFSQ0hfU09VUkNFKSBhcyBjYyBjYW4gZmluZCBoZWFkZXJzCisgICAgIyBpbiB0aGUgLmMgZmlsZSdzIGRpcmVjdG9yeSwgYnV0IGdlbmVyYXRlZCAuYyBmaWxlcyAoZnJvbQorICAgICMgeWFjYywgbGV4LCBldGMpIGFyZSBsb2NhdGVkIGluICQoTE9DQVRFX1RBUkdFVCksIHBvc3NpYmx5CisgICAgIyBkaWZmZXJlbnQgZnJvbSAkKFNFQVJDSF9TT1VSQ0UpLgorCisgICAgSERSUyBvbiAkKDwpID0gJChTRUFSQ0hfU09VUkNFKSAkKEhEUlMpICQoU1VCRElSSERSUykgOworCisgICAgIyBoYW5kbGUgI2luY2x1ZGVzIGZvciBzb3VyY2U6IEphbSBzY2FucyBmb3IgaGVhZGVycyB3aXRoCisgICAgIyB0aGUgcmVnZXhwIHBhdHRlcm4gJChIRFJTQ0FOKSBhbmQgdGhlbiBpbnZva2VzICQoSERSUlVMRSkKKyAgICAjIHdpdGggdGhlIHNjYW5uZWQgZmlsZSBhcyB0aGUgdGFyZ2V0IGFuZCB0aGUgZm91bmQgaGVhZGVycworICAgICMgYXMgdGhlIHNvdXJjZXMuICBIRFJTRUFSQ0ggaXMgdGhlIHZhbHVlIG9mIFNFQVJDSCB1c2VkIGZvcgorICAgICMgdGhlIGZvdW5kIGhlYWRlciBmaWxlcy4gIEZpbmFsbHksIGlmIGphbSBtdXN0IGRlYWwgd2l0aAorICAgICMgaGVhZGVyIGZpbGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLAorICAgICMgdGhleSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCB3aXRoIEhEUkdSSVNULgorCisgICAgIyAkKGgpIGlzIHdoZXJlIGNjIGZpcnN0IGxvb2tzIGZvciAjaW5jbHVkZSAiZm9vLmgiIGZpbGVzLgorICAgICMgSWYgdGhlIHNvdXJjZSBmaWxlIGlzIGluIGEgZGlzdGFudCBkaXJlY3RvcnksIGxvb2sgdGhlcmUuCisgICAgIyBFbHNlLCBsb29rIGluICIiICh0aGUgY3VycmVudCBkaXJlY3RvcnkpLgorCisgICAgaWYgJChTRUFSQ0hfU09VUkNFKQorICAgIHsKKyAgICAgICAgaCA9ICQoU0VBUkNIX1NPVVJDRSkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoID0gIiIgOworICAgIH0KKworICAgIEhEUlJVTEUgb24gJCg+KSA9IEhkclJ1bGUgOworICAgIEhEUlNDQU4gb24gJCg+KSA9ICQoSERSUEFUVEVSTikgOworICAgIEhEUlNFQVJDSCBvbiAkKD4pID0gJChIRFJTKSAkKFNVQkRJUkhEUlMpICQoaCkgJChTVERIRFJTKSA7CisgICAgSERSR1JJU1Qgb24gJCg+KSA9ICQoSERSR1JJU1QpIDsKKworICAgICMgaWYgc291cmNlIGlzIG5vdCAuYywgZ2VuZXJhdGUgLmMgd2l0aCBzcGVjaWZpYyBydWxlCisKKyAgICBzd2l0Y2ggJCg+OlMpCisgICAgeworICAgICAgICBjYXNlIC5hc20gOiBBcyAkKDwpIDogJCg+KSA7CisgICAgICAgIGNhc2UgLmMgOiAgIENjICQoPCkgOiAkKD4pIDsKKyAgICAgICAgY2FzZSAuQyA6ICAgQysrICQoPCkgOiAkKD4pIDsKKyAgICAgICAgY2FzZSAuY2MgOiAgQysrICQoPCkgOiAkKD4pIDsKKyAgICAgICAgY2FzZSAuY3BwIDogQysrICQoPCkgOiAkKD4pIDsKKyAgICAgICAgY2FzZSAuZiA6ICAgRm9ydHJhbiAkKDwpIDogJCg+KSA7CisgICAgICAgIGNhc2UgLmwgOiAgIENjICQoPCkgOiAkKDw6Uz0uYykgOworICAgICAgICAgICAgICAgICAgICBMZXggJCg8OlM9LmMpIDogJCg+KSA7CisgICAgICAgIGNhc2UgLnMgOiAgIEFzICQoPCkgOiAkKD4pIDsKKyAgICAgICAgY2FzZSAueSA6ICAgQ2MgJCg8KSA6ICQoPDpTPS5jKSA7CisgICAgICAgICAgICAgICAgICAgIFlhY2MgJCg8OlM9LmMpIDogJCg+KSA7CisgICAgICAgIGNhc2UgKiA6ICAgIFVzZXJPYmplY3QgJCg8KSA6ICQoPikgOworICAgIH0KK30KKworCitydWxlIE9iamVjdENjRmxhZ3MKK3sKKyAgICBDQ0ZMQUdTIG9uIFsgRkdyaXN0RmlsZXMgJCg8OlM9JChTVUZPQkopKSBdICs9ICQoPikgOworfQorCitydWxlIE9iamVjdEMrK0ZsYWdzCit7CisgICAgQysrRkxBR1Mgb24gWyBGR3Jpc3RGaWxlcyAkKDw6Uz0kKFNVRk9CSikpIF0gKz0gJCg+KSA7Cit9CisKK3J1bGUgT2JqZWN0SGRycworeworICAgIEhEUlMgb24gWyBGR3Jpc3RGaWxlcyAkKDw6Uz0kKFNVRk9CSikpIF0gKz0gJCg+KSA7Cit9CisKK3J1bGUgT2JqZWN0cworeworICAgIGxvY2FsIF9pIDsKKworICAgIGZvciBfaSBpbiBbIEZHcmlzdEZpbGVzICQoPCkgXQorICAgIHsKKyAgICAgICAgT2JqZWN0ICQoX2k6Uz0kKFNVRk9CSikpIDogJChfaSkgOworICAgICAgICBERVBFTkRTIG9iaiA6ICQoX2k6Uz0kKFNVRk9CSikpIDsKKyAgICB9Cit9CisKK3J1bGUgUm1UZW1wcworeworICAgIFRFTVBPUkFSWSAkKD4pIDsKK30KKworcnVsZSBTZXR1aWQKK3sKKyAgICBNT0RFIG9uIFsgRkFwcGVuZFN1ZmZpeCAkKDwpIDogJChTVUZFWEUpIF0gPSA0NzExIDsKK30KKworcnVsZSBTaGVsbAoreworICAgIERFUEVORFMgc2hlbGwgOiAkKDwpIDsKKyAgICBERVBFTkRTICQoPCkgOiAkKD4pIDsKKyAgICBTRUFSQ0ggb24gJCg+KSA9ICQoU0VBUkNIX1NPVVJDRSkgOworICAgIE1PREUgb24gJCg8KSA9ICQoU0hFTExNT0RFKSA7CisgICAgQ2xlYW4gY2xlYW4gOiAkKDwpIDsKKyAgICBDaG1vZCAkKDwpIDsKK30KKworcnVsZSBTdWJEaXIKK3sKKyAgICBsb2NhbCBfciBfcyA7CisKKyAgICAjCisgICAgIyBTdWJEaXIgVE9QIGQxIFsgLi4uIF0KKyAgICAjCisgICAgIyBUaGlzIGludHJvZHVjZXMgYSBKYW1maWxlIHRoYXQgaXMgcGFydCBvZiBhIHByb2plY3QgdHJlZQorICAgICMgcm9vdGVkIGF0ICQoVE9QKS4gIEl0IChvbmx5IG9uY2UpIGluY2x1ZGVzIHRoZSBwcm9qZWN0LXNwZWNpZmljCisgICAgIyBydWxlcyBmaWxlICQoVE9QKS9KYW1ydWxlcyBhbmQgdGhlbiBzZXRzIHNlYXJjaCAmIGxvY2F0ZSBzdHVmZi4KKyAgICAjCisgICAgIyBJZiB0aGUgdmFyaWFibGUgJChUT1BSVUxFUykgaXMgc2V0ICh3aGVyZSBUT1AgaXMgdGhlIGZpcnN0IGFyZworICAgICMgdG8gU3ViRGlyKSwgdGhhdCBmaWxlIGlzIGluY2x1ZGVkIGluc3RlYWQgb2YgJChUT1ApL0phbXJ1bGVzLgorICAgICMKKyAgICAjIGQxIC4uLiBhcmUgdGhlIGRpcmVjdG9yeSBlbGVtZW50cyB0aGF0IGxlYWQgdG8gdGhpcyBkaXJlY3RvcnkKKyAgICAjIGZyb20gJChUT1ApLiAgV2UgY29uc3RydWN0IHRoZSBzeXN0ZW0gZGVwZW5kZW50IHBhdGggZnJvbSB0aGVzZQorICAgICMgZGlyZWN0b3J5IGVsZW1lbnRzIGluIG9yZGVyIHRvIHNldCBzZWFyY2ggJiBsb2NhdGUgc3R1ZmYuCisgICAgIworCisgICAgaWYgISAkKCQoPFsxXSkpCisgICAgeworICAgICAgICBpZiAhICQoPFsxXSkKKyAgICAgICAgeworICAgICAgICAgICAgRVhJVCBTdWJEaXIgc3ludGF4IGVycm9yIDsKKyAgICAgICAgfQorCisgICAgICAgICQoPFsxXSkgPSBbIEZTdWJEaXIgJCg8WzItXSkgXSA7CisgICAgfQorCisgICAgIworICAgICMgSWYgJChUT1ApL0phbXJ1bGVzIGhhc24ndCBiZWVuIGluY2x1ZGVkLCBkbyBzby4KKyAgICAjCisKKyAgICBpZiAhICQoJCg8WzFdKS1pbmNsdWRlZCkKKyAgICB7CisgICAgICAgICMgR2F0ZWQgZW50cnkuCisKKyAgICAgICAgJCg8WzFdKS1pbmNsdWRlZCA9IFRSVUUgOworCisgICAgICAgICMgRmlsZSBpcyAkKFRPUFJVTEVTKSBvciAkKFRPUCkvSmFtcnVsZXMuCisKKyAgICAgICAgX3IgPSAkKCQoPFsxXSlSVUxFUykgOworCisgICAgICAgIGlmICEgJChfcikKKyAgICAgICAgeworICAgICAgICBfciA9ICQoSkFNUlVMRVM6Uj0kKCQoPFsxXSkpKSA7CisgICAgICAgIH0KKworICAgICAgICAjIEluY2x1ZGUgaXQuCisKKyAgICAgICAgaW5jbHVkZSAkKF9yKSA7CisgICAgfQorCisgICAgIyBHZXQgcGF0aCB0byBjdXJyZW50IGRpcmVjdG9yeSBmcm9tIHJvb3QgdXNpbmcgU3ViRGlyLgorICAgICMgU2F2ZSBkaXIgdG9rZW5zIGZvciBvdGhlciBwb3RlbnRpYWwgdXNlcy4KKworICAgIF9zID0gWyBGRGlyTmFtZSAkKDxbMi1dKSBdIDsKKyAgICBTVUJESVIgPSAkKF9zOlI9JCgkKDxbMV0pKSkgOworICAgICAgICBTVUJESVJfVE9LRU5TID0gJCg8WzItXSkgOworCisgICAgIyBOb3cgc2V0IHVwIFNFQVJDSF9TT1VSQ0UsIExPQ0FURV9UQVJHRVQsIFNPVVJDRV9HUklTVAorICAgICMgVGhlc2UgY2FuIGJlIHJlc2V0IGlmIG5lZWRlZC4gIEZvciBleGFtcGxlLCBpZiB0aGUgc291cmNlCisgICAgIyBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBob2xkIG9iamVjdCBmaWxlcywgTE9DQVRFX1RBUkdFVCBjYW4KKyAgICAjIHN1YnNlcXVlbnRseSBiZSByZWRlZmluZWQuCisKKyAgICBTRUFSQ0hfU09VUkNFID0gJChTVUJESVIpIDsKKyAgICBMT0NBVEVfU09VUkNFID0gJChBTExfTE9DQVRFX1RBUkdFVCkgJChTVUJESVIpIDsKKyAgICBMT0NBVEVfVEFSR0VUID0gJChBTExfTE9DQVRFX1RBUkdFVCkgJChTVUJESVIpIDsKKyAgICBTT1VSQ0VfR1JJU1QgPSBbIEZHcmlzdCAkKDxbMi1dKSBdIDsKKworICAgICMgUmVzZXQgcGVyLWRpcmVjdG9yeSBjY2ZsYWdzLCBoZHJzCisKKyAgICBTVUJESVJDQ0ZMQUdTID0gOworICAgIFNVQkRJUkMrK0ZMQUdTID0gOworICAgIFNVQkRJUkhEUlMgPSA7Cit9CisKK3J1bGUgU3ViRGlyQ2NGbGFncworeworICAgIFNVQkRJUkNDRkxBR1MgKz0gJCg8KSA7Cit9CisKK3J1bGUgU3ViRGlyQysrRmxhZ3MKK3sKKyAgICBTVUJESVJDKytGTEFHUyArPSAkKDwpIDsKK30KKworcnVsZSBTdWJEaXJIZHJzCit7CisgICAgU1VCRElSSERSUyArPSAkKDwpIDsKK30KKworcnVsZSBTdWJJbmNsdWRlCit7CisgICAgbG9jYWwgX3MgOworCisgICAgIyBUaGF0J3MKKyAgICAjICAgU3ViSW5jbHVkZSBUT1AgZDEgWyBkMiBbIGQzIFsgZDQgXSBdIF0KKyAgICAjCisgICAgIyB0byBpbmNsdWRlIGEgc3ViZGlyZWN0b3J5J3MgSmFtZmlsZS4KKworICAgIGlmICEgJCgkKDxbMV0pKQorICAgIHsKKyAgICAgICAgRVhJVCBUb3AgbGV2ZWwgb2Ygc291cmNlIHRyZWUgaGFzIG5vdCBiZWVuIHNldCB3aXRoICQoPFsxXSkgOworICAgIH0KKworICAgIF9zID0gWyBGRGlyTmFtZSAkKDxbMi1dKSBdIDsKKworICAgIGluY2x1ZGUgJChKQU1GSUxFOkQ9JChfcyk6Uj0kKCQoPFsxXSkpKSA7Cit9CisKK3J1bGUgVW5kZWZpbmVzCit7CisgICAgVU5ERUZTIG9uIFsgRkFwcGVuZFN1ZmZpeCAkKDwpIDogJChTVUZFWEUpIF0gKz0gJChVTkRFRkZMQUcpJCg+KSA7Cit9CisKK3J1bGUgVXNlck9iamVjdAoreworICAgIEVYSVQgIlVua25vd24gc3VmZml4IG9uIiAkKD4pICItIHNlZSBVc2VyT2JqZWN0IHJ1bGUgaW4gSmFtZmlsZSg1KS4iIDsKK30KKworcnVsZSBZYWNjCit7CisgICAgbG9jYWwgX2ggOworCisgICAgX2ggPSAkKDw6QlM9LmgpIDsKKworICAgICMgU29tZSBwbGFjZXMgZG9uJ3QgaGF2ZSBhIHlhY2MuCisKKyAgICBNYWtlTG9jYXRlICQoPCkgJChfaCkgOiAkKExPQ0FURV9TT1VSQ0UpIDsKKworICAgIGlmICQoWUFDQykKKyAgICB7CisgICAgICAgIERFUEVORFMgJCg8KSAkKF9oKSA6ICQoPikgOworICAgICAgICBZYWNjMSAkKDwpICQoX2gpIDogJCg+KSA7CisgICAgICAgIFlhY2NNdiAkKDwpICQoX2gpIDogJCg+KSA7CisgICAgICAgIENsZWFuIGNsZWFuIDogJCg8KSAkKF9oKSA7CisgICAgfQorCisgICAgIyBNYWtlIHN1cmUgc29tZW9uZSBpbmNsdWRlcyAkKF9oKSBlbHNlIGl0IHdpbGwgYmUgYSBkZWFkbHkgaW5kZXBlbmRlbnQKKyAgICAjIHRhcmdldC4KKyAgICBJTkNMVURFUyAkKDwpIDogJChfaCkgOworfQorCisjCisjIFV0aWxpdHkgcnVsZXM7IG5vIHNpZGUgZWZmZWN0cyBvbiB0aGVzZS4KKyMKKworcnVsZSBGR3Jpc3QKK3sKKyAgICAjIFR1cm4gaW5kaXZpZHVhbCBlbGVtZW50cyBpbiAkKDwpIGludG8gZ3Jpc3QuCisKKyAgICBsb2NhbCBfZyBfaSA7CisKKyAgICBfZyA9ICQoPFsxXSkgOworCisgICAgZm9yIF9pIGluICQoPFsyLV0pCisgICAgeworICAgICAgICBfZyA9ICQoX2cpISQoX2kpIDsKKyAgICB9CisKKyAgICByZXR1cm4gJChfZykgOworfQorCitydWxlIEZHcmlzdEZpbGVzCit7CisgICAgaWYgISAkKFNPVVJDRV9HUklTVCkKKyAgICB7CisgICAgICAgIHJldHVybiAkKDwpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoPDpHPSQoU09VUkNFX0dSSVNUKSkgOworICAgIH0KK30KKworcnVsZSBGR3Jpc3RTb3VyY2VGaWxlcworeworICAgICMgUHJvZHVjZSBzb3VyY2UgZmlsZSBuYW1lIG5hbWUgd2l0aCBncmlzdCBpbiBpdCwKKyAgICAjIGlmIFNPVVJDRV9HUklTVCBpcyBzZXQuCisKKyAgICAjIExlYXZlIGhlYWRlciBmaWxlcyBhbG9uZSwgYmVjYXVzZSB0aGV5IGhhdmUgYSBnbG9iYWwKKyAgICAjIHZpc2liaWxpdHkuCisKKyAgICBpZiAhICQoU09VUkNFX0dSSVNUKQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoPCkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsb2NhbCBfaSBfbyA7CisKKyAgICAgICAgZm9yIF9pIGluICQoPCkKKyAgICAgICAgeworICAgICAgICBzd2l0Y2ggJChfaSkKKyAgICAgICAgeworICAgICAgICBjYXNlICouaCA6ICBfbyArPSAkKF9pKSA7CisgICAgICAgIGNhc2UgKiA6ICAgIF9vICs9ICQoX2k6Rz0kKFNPVVJDRV9HUklTVCkpIDsKKyAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICQoX28pIDsKKyAgICB9Cit9CisKK3J1bGUgRkNvbmNhdAoreworICAgICMgUHV0cyB0aGUgdmFyaWFibGVzIHRvZ2V0aGVyLCByZW1vdmluZyBzcGFjZXMuCisKKyAgICBsb2NhbCBfdCBfciA7CisKKyAgICAkKF9yKSA9ICQoPFsxXSkgOworCisgICAgZm9yIF90IGluICQoPFsyLV0pCisgICAgeworICAgICAgICAkKF9yKSA9ICQoX3IpJChfdCkgOworICAgIH0KKworICAgIHJldHVybiAkKF9yKSA7Cit9CisKK3J1bGUgRlN1YkRpcgoreworICAgIGxvY2FsIF9pIF9kIDsKKworICAgICMgSWYgJCg+KSBpcyB0aGUgcGF0aCB0byB0aGUgY3VycmVudCBkaXJlY3RvcnksIGNvbXB1dGUgdGhlCisgICAgIyBwYXRoICh1c2luZyAuLi8uLi8gZXRjKSBiYWNrIHRvIHRoYXQgcm9vdCBkaXJlY3RvcnkuCisgICAgIyBTZXRzIHJlc3VsdCBpbiAkKDwpCisKKyAgICBpZiAhICQoPFsxXSkKKyAgICB7CisgICAgICAgIF9kID0gJChET1QpIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX2QgPSAkKERPVERPVCkgOworCisgICAgICAgIGZvciBfaSBpbiAkKDxbMi1dKQorICAgICAgICB7CisgICAgICAgIF9kID0gJChfZDpSPSQoRE9URE9UKSkgOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICQoX2QpIDsKK30KKworcnVsZSBGRGlyTmFtZQoreworICAgIGxvY2FsIF9zIF9pIDsKKworICAgICMgVHVybiBpbmRpdmlkdWFsIGVsZW1lbnRzIGluICQoPCkgaW50byBhIHVzYWJsZSBwYXRoLgorCisgICAgaWYgISAkKDwpCisgICAgeworICAgICAgICBfcyA9ICQoRE9UKSA7CisgICAgfQorICAgIGVsc2UgaWYgJChWTVMpCisgICAgeworICAgICAgICAjIFRoaXMgaGFuZGxlcyB0aGUgZm9sbG93aW5nIGNhc2VzOgorICAgICAgICAjICAgYSAtPiBbLmFdCisgICAgICAgICMgICBhIGIgYyAtPiBbLmEuYi5jXQorICAgICAgICAjICAgeDogLT4geDoKKyAgICAgICAgIyAgIHg6IGEgLT4geDpbYV0KKyAgICAgICAgIyAgIHg6W2FdIGIgLT4geDpbYS5iXQorCisgICAgICAgIHN3aXRjaCAkKDxbMV0pCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAqOiogOiBfcyA9ICQoPFsxXSkgOworICAgICAgICBjYXNlIFxcWypcXF0gOiBfcyA9ICQoPFsxXSkgOworICAgICAgICBjYXNlICogOiBfcyA9IFsuJCg8WzFdKV0gOworICAgICAgICB9CisKKyAgICAgICAgZm9yIF9pIGluIFsuJCg8WzItXSldCisgICAgICAgIHsKKyAgICAgICAgX3MgPSAkKF9pOlI9JChfcykpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICQoTUFDKQorICAgIHsKKyAgICAgICAgX3MgPSAkKERPVCkgOworCisgICAgICAgIGZvciBfaSBpbiAkKDwpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zID0gJChfaTpSPSQoX3MpKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX3MgPSAkKDxbMV0pIDsKKworICAgICAgICBmb3IgX2kgaW4gJCg8WzItXSkKKyAgICAgICAgeworICAgICAgICBfcyA9ICQoX2k6Uj0kKF9zKSkgOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICQoX3MpIDsKK30KKworCitydWxlIF9tYWtlQ29tbW9uCit7CisgICAgIyBzdHJpcCBjb21tb24gaW5pdGlhbCBlbGVtZW50cworCisgICAgaWYgJCgkKDwpWzFdKSAmJiAkKCQoPClbMV0pID0gJCgkKD4pWzFdKQorICAgIHsKKyAgICAgICAgJCg8KSA9ICQoJCg8KVsyLV0pIDsKKyAgICAgICAgJCg+KSA9ICQoJCg+KVsyLV0pIDsKKyAgICAgICAgX21ha2VDb21tb24gJCg8KSA6ICQoPikgOworICAgIH0KK30KKworCitydWxlIEZSZWxQYXRoCit7CisgICAgbG9jYWwgX2wgX3IgOworCisgICAgIyBmaXJzdCBzdHJpcCBvZmYgY29tbW9uIHBhcnRzCisKKyAgICBfbCA9ICQoPCkgOworICAgIF9yID0gJCg+KSA7CisKKyAgICBfbWFrZUNvbW1vbiBfbCA6IF9yIDsKKworICAgICMgbm93IG1ha2UgcGF0aCB0byByb290IGFuZCBwYXRoIGRvd24KKworICAgIF9sID0gWyBGU3ViRGlyICQoX2wpIF0gOworICAgIF9yID0gWyBGRGlyTmFtZSAkKF9yKSBdIDsKKworICAgICMgQ29uY2F0ZW5hdGUgYW5kIHNhdmUKKworICAgICMgWFhYIFRoaXMgc2hvdWxkIGJlIGJldHRlcgorCisgICAgaWYgJChfcikgPSAkKERPVCkgeworICAgICAgICByZXR1cm4gJChfbCkgOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAkKF9yOlI9JChfbCkpIDsKKyAgICB9Cit9CisKK3J1bGUgRkFwcGVuZFN1ZmZpeAoreworICAgICAgICMgRS5nLiwgIkZBcHBlbmRTdWZmaXggeWFjYyBsZXggZm9vLmJhdCA6ICQoU1VGRVhFKSA7IgorICAgICAgICMgcmV0dXJucyAoeWFjYyxsZXgsZm9vLmJhdCkgb24gVW5peCBhbmQKKyAgICAgICAjICh5YWNjLmV4ZSxsZXguZXhlLGZvby5iYXQpIG9uIE5ULgorCisgICAgaWYgJCg+KQorICAgIHsKKyAgICAgICAgbG9jYWwgX2kgX28gOworCisgICAgICAgIGZvciBfaSBpbiAkKDwpCisgICAgICAgIHsKKyAgICAgICAgaWYgJChfaTpTKQorICAgICAgICB7CisgICAgICAgICAgICBfbyArPSAkKF9pKSA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfbyArPSAkKF9pOlM9JCg+KSkgOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICQoX28pIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuICQoPCkgOworICAgIH0KK30KKworcnVsZSB1bm1ha2VEaXIKK3sKKyAgICBpZiAkKD5bMV06RCkgJiYgJCg+WzFdOkQpICE9ICQoPlsxXSkgJiYgJCg+WzFdOkQpICE9IFxcXFwKKyAgICB7CisgICAgICAgIHVubWFrZURpciAkKDwpIDogJCg+WzFdOkQpICQoPlsxXTpCUykgJCg+WzItXSkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAkKDwpID0gJCg+KSA7CisgICAgfQorfQorCisKK3J1bGUgRkNvbnZlcnRUb1NsYXNoZXMKK3sKKyAgbG9jYWwgX2QsIF9zLCBfaSA7CisKKyAgdW5tYWtlRGlyIF9kIDogJCg8KSA7CisKKyAgX3MgPSAkKF9kWzFdKSA7CisgIGZvciBfaSBpbiAkKF9kWzItXSkKKyAgeworICAgIF9zID0gJChfcykvJChfaSkgOworICB9CisgIHJldHVybiAkKF9zKSA7Cit9CisKKworIworIyBBY3Rpb25zCisjCisKKyMKKyMgRmlyc3QgdGhlIGRlZmF1bHRzCisjCisKK2FjdGlvbnMgdXBkYXRlZCB0b2dldGhlciBwaWVjZW1lYWwgQXJjaGl2ZQoreworICAgICQoQVIpICQoPCkgJCg+KQorfQorCithY3Rpb25zIEFzCit7CisgICAgJChBUykgJChBU0ZMQUdTKSAtSSQoSERSUykgLW8gJCg8KSAkKD4pCit9CisKK2FjdGlvbnMgQysrCit7CisgICAgJChDKyspIC1jICQoQysrRkxBR1MpICQoT1BUSU0pIC1JJChIRFJTKSAtbyAkKDwpICQoPikKK30KKworYWN0aW9ucyBDYworeworICAgICQoQ0MpIC1jICQoQ0NGTEFHUykgJChPUFRJTSkgLUkkKEhEUlMpIC1vICQoPCkgJCg+KQorfQorCithY3Rpb25zIENoZ3JwCit7CisgICAgJChDSEdSUCkgJChHUk9VUCkgJCg8KQorfQorCithY3Rpb25zIENobW9kMQoreworICAgICQoQ0hNT0QpICQoTU9ERSkgJCg8KQorfQorCithY3Rpb25zIENob3duCit7CisgICAgJChDSE9XTikgJChPV05FUikgJCg8KQorfQorCithY3Rpb25zIHBpZWNlbWVhbCB0b2dldGhlciBleGlzdGluZyBDbGVhbgoreworICAgICQoUk0pICQoPikKK30KKworYWN0aW9ucyBGaWxlCit7CisgICAgJChDUCkgJCg+KSAkKDwpCit9CisKK2FjdGlvbnMgR2VuRmlsZTEKK3sKKyAgICAkKD5bMV0pICQoPCkgJCg+WzItXSkKK30KKworYWN0aW9ucyBGb3J0cmFuCit7CisgICAgJChGT1JUUkFOKSAkKEZPUlRSQU5GTEFHUykgLW8gJCg8KSAkKD4pCit9CisKK2FjdGlvbnMgSGFyZExpbmsKK3sKKyAgICAkKFJNKSAkKDwpICYmICQoTE4pICQoPikgJCg8KQorfQorCithY3Rpb25zIEluc3RhbGwKK3sKKyAgICAkKENQKSAkKD4pICQoPCkKK30KKworYWN0aW9ucyBMZXgKK3sKKyAgICAkKExFWCkgJCg+KQorfQorCithY3Rpb25zIExleE12Cit7CisgICAgJChNVikgbGV4Lnl5LmMgJCg8KQorfQorCithY3Rpb25zIExpbmsgYmluZCBORUVETElCUworeworICAgICQoTElOSykgJChMSU5LRkxBR1MpIC1vICQoPCkgJChVTkRFRlMpICQoPikgJChORUVETElCUykgJChMSU5LTElCUykKK30KKworYWN0aW9ucyBNa0RpcjEKK3sKKyAgICAkKE1LRElSKSAkKDwpCit9CisKK2FjdGlvbnMgdG9nZXRoZXIgUmFubGliCit7CisgICAgJChSQU5MSUIpICQoPCkKK30KKworYWN0aW9ucyBxdWlldGx5IHVwZGF0ZWQgcGllY2VtZWFsIHRvZ2V0aGVyIFJtVGVtcHMKK3sKKyAgICAkKFJNKSAkKD4pCit9CisKK2FjdGlvbnMgU2hlbGwKK3sKKyAgICAkKEFXSykgJworICAgICAgICBOUiA9PSAxIHsgcHJpbnQgIiQoU0hFTExIRUFERVIpIiB9CisgICAgICAgIE5SID09IDEgJiYgL15bIzpdLyB7IG5leHQgfQorICAgICAgICAvXiMjLyB7IG5leHQgfQorICAgICAgICB7IHByaW50IH0KKyAgICAnIDwgJCg+KSA+ICQoPCkKK30KKworYWN0aW9ucyBZYWNjMQoreworICAgICQoWUFDQykgJChZQUNDRkxBR1MpICQoPikKK30KKworYWN0aW9ucyBZYWNjTXYKK3sKKyAgICAkKE1WKSAkKFlBQ0NGSUxFUykuYyAkKDxbMV0pCisgICAgJChNVikgJChZQUNDRklMRVMpLmggJCg8WzJdKQorfQorCisjCisjIFJFTE9DQVRFIC0gZm9yIGNvbXBpbGVycyB3aXRoIGJyb2tlbiAtbyBmbGFncworIworCitpZiAkKFJFTE9DQVRFKQoreworICAgIGFjdGlvbnMgQysrCisgICAgeworICAgICQoQysrKSAtYyAkKEMrK0ZMQUdTKSAkKE9QVElNKSAtSSQoSERSUykgJCg+KQorICAgIH0KKworICAgIGFjdGlvbnMgQ2MKKyAgICB7CisgICAgJChDQykgLWMgJChDQ0ZMQUdTKSAkKE9QVElNKSAtSSQoSERSUykgJCg+KQorICAgIH0KKworICAgIGFjdGlvbnMgaWdub3JlIENjTXYKKyAgICB7CisgICAgWyAkKDwpICE9ICQoPjpCUz0kKFNVRk9CSikpIF0gJiYgJChNVikgJCg+OkJTPSQoU1VGT0JKKSkgJCg8KQorICAgIH0KK30KKworIworIyBOT0FSVVBEQVRFIC0gY2FuJ3QgdXBkYXRlIGFuIGFyY2hpdmUKKyMKKworaWYgJChOT0FSVVBEQVRFKQoreworICAgIGFjdGlvbnMgQXJjaGl2ZQorICAgIHsKKyAgICAkKEFSKSAkKDwpICQoPikKKyAgICB9Cit9CisKKyMKKyMgTlQgc3BlY2lmaWMgYWN0aW9ucworIworCitpZiAkKE5UKQoreworICBpZiAkKFRPT0xTRVQpID0gVklTVUFMQyB8fCAkKFRPT0xTRVQpID0gVkM3IHx8ICQoVE9PTFNFVCkgPSBJTlRFTEMKKyAgeworICAgIGFjdGlvbnMgdXBkYXRlZCB0b2dldGhlciBwaWVjZW1lYWwgQXJjaGl2ZQorICAgIHsKKyAgICBpZiBleGlzdCAkKDwpIHNldCBfJCg8OkIpXz0kKDwpCisgICAgJChBUikgL291dDokKDwpICVfJCg8OkIpXyUgJCg+KQorICAgIH0KKworICAgIGFjdGlvbnMgQXMKKyAgICB7CisgICAgJChBUykgL01sIC9wIC92IC93MiAkKD4pICQoPCkgLG51bCxudWw7CisgICAgfQorCisgICAgYWN0aW9ucyBDYworICAgIHsKKyAgICAkKENDKSAvYyAkKENDRkxBR1MpICQoT1BUSU0pIC9GbyQoPCkgL0kkKEhEUlMpIC9JJChTVERIRFJTKSAkKD4pCisgICAgfQorCisgICAgYWN0aW9ucyBDKysKKyAgICB7CisgICAgJChDKyspIC9jICQoQysrRkxBR1MpICQoT1BUSU0pIC9GbyQoPCkgL0kkKEhEUlMpIC9JJChTVERIRFJTKSAvVHAkKD4pCisgICAgfQorCisgICAgYWN0aW9ucyBMaW5rIGJpbmQgTkVFRExJQlMKKyAgICB7CisgICAgJChMSU5LKSAkKExJTktGTEFHUykgL291dDokKDwpICQoVU5ERUZTKSAkKD4pICQoTkVFRExJQlMpICQoTElOS0xJQlMpCisgICAgfQorICB9CisgIGVsc2UgaWYgJChUT09MU0VUKSA9IFZJU1VBTEMxNgorICB7CisgICAgYWN0aW9ucyB1cGRhdGVkIHRvZ2V0aGVyIHBpZWNlbWVhbCBBcmNoaXZlCisgICAgeworICAgICQoQVIpICQoPCkgLSskKD4pCisgICAgfQorCisgICAgYWN0aW9ucyBDYworICAgIHsKKyAgICAkKENDKSAvYyAkKENDRkxBR1MpICQoT1BUSU0pIC9GbyQoPCkgL0kkKEhEUlMpICQoPikKKyAgICB9CisKKyAgICBhY3Rpb25zIEMrKworICAgIHsKKyAgICAkKEMrKykgL2MgJChDKytGTEFHUykgJChPUFRJTSkgL0ZvJCg8KSAvSSQoSERSUykgL1RwJCg+KQorICAgIH0KKworICAgIGFjdGlvbnMgTGluayBiaW5kIE5FRURMSUJTCisgICAgeworICAgICQoTElOSykgJChMSU5LRkxBR1MpIC9vdXQ6JCg8KSAkKFVOREVGUykgJCg+KSAkKE5FRURMSUJTKSAkKExJTktMSUJTKQorICAgIH0KKyAgfQorICBlbHNlIGlmICQoVE9PTFNFVCkgPSBCT1JMQU5EQworICB7CisgICAgYWN0aW9ucyB1cGRhdGVkIHRvZ2V0aGVyIHBpZWNlbWVhbCBBcmNoaXZlCisgICAgeworICAgICQoQVIpICQoPCkgLSskKD4pCisgICAgfQorCisgICAgYWN0aW9ucyBMaW5rIGJpbmQgTkVFRExJQlMKKyAgICB7CisgICAgJChMSU5LKSAtZSQoPCkgJChMSU5LRkxBR1MpICQoVU5ERUZTKSAtTCQoTElOS0xJQlMpICQoTkVFRExJQlMpICQoPikKKyAgICB9CisKKyAgICBhY3Rpb25zIEMrKworICAgIHsKKyAgICAkKEMrKykgLWMgJChDKytGTEFHUykgJChPUFRJTSkgLUkkKEhEUlMpIC1vJCg8KSAkKD4pCisgICAgfQorCisgICAgYWN0aW9ucyBDYworICAgIHsKKyAgICAkKENDKSAtYyAkKENDRkxBR1MpICQoT1BUSU0pIC1JJChIRFJTKSAtbyQoPCkgJCg+KQorICAgIH0KKworICB9CisgIGVsc2UgaWYgJChUT09MU0VUKSA9IE1JTkdXCisgIHsKKyAgICBhY3Rpb25zIHRvZ2V0aGVyIHBpZWNlbWVhbCBBcmNoaXZlCisgICAgeworICAgICAgJChBUikgJCg8KSAkKD46VCkKKyAgICB9CisKKyAgICBhY3Rpb25zIENjCisgICAgeworICAgICQoQ0MpIC1jICQoQ0NGTEFHUykgJChPUFRJTSkgLUkkKEhEUlMpIC1vJCg8KSAkKD4pCisgICAgfQorCisgICAgYWN0aW9ucyBDKysKKyAgICB7CisgICAgJChDKyspIC1jICQoQysrRkxBR1MpICQoT1BUSU0pIC1JJChIRFJTKSAtbyQoPCkgJCg+KQorICAgIH0KKyAgfQorICBlbHNlIGlmICQoVE9PTFNFVCkgPSBXQVRDT00KKyAgeworICAgIGFjdGlvbnMgdG9nZXRoZXIgcGllY2VtZWFsIEFyY2hpdmUKKyAgICB7CisgICAgJChBUikgJCg8KSArLSQoPikKKyAgICB9CisKKyAgICBhY3Rpb25zIENjCisgICAgeworICAgICQoQ0MpICQoQ0NGTEFHUykgJChPUFRJTSkgL0ZvPSQoPCkgL0kkKEhEUlMpICQoPikKKyAgICB9CisKKyAgICBhY3Rpb25zIEMrKworICAgIHsKKyAgICAkKEMrKykgJChDKytGTEFHUykgJChPUFRJTSkgL0ZvPSQoPCkgL0kkKEhEUlMpICQoPikKKyAgICB9CisKKyAgICBhY3Rpb25zIExpbmsgYmluZCBORUVETElCUworICAgIHsKKyAgICAkKExJTkspICQoTElOS0ZMQUdTKSAvRmU9JCg8KSAkKFVOREVGUykgJCg+KSAkKE5FRURMSUJTKSAkKExJTktMSUJTKQorICAgIH0KKworICAgIGFjdGlvbnMgU2hlbGwKKyAgICB7CisgICAgJChDUCkgJCg+KSAkKDwpCisgICAgfQorICB9CisgIGVsc2UgaWYgJChUT09MU0VUKSA9IExDQworICB7CisgICAgYWN0aW9ucyB0b2dldGhlciBwaWVjZW1lYWwgQXJjaGl2ZQorICAgIHsKKyAgICAkKEFSKSAvb3V0OiQoPCkgJCg+KQorICAgIH0KKworICAgIGFjdGlvbnMgQ2MKKyAgICB7CisgICAgJChDQykgJChDQ0ZMQUdTKSAkKE9QVElNKSAtRm8kKDwpIC1JJChIRFJTKSAkKD4pCisgICAgfQorCisgICAgYWN0aW9ucyBMaW5rIGJpbmQgTkVFRExJQlMKKyAgICB7CisgICAgJChMSU5LKSAkKExJTktGTEFHUykgLW8gJCg8KSAkKFVOREVGUykgJCg+KSAkKE5FRURMSUJTKSAkKExJTktMSUJTKQorICAgIH0KKworICAgIGFjdGlvbnMgU2hlbGwKKyAgICB7CisgICAgJChDUCkgJCg+KSAkKDwpCisgICAgfQorICB9Cit9CisKKyMKKyMgT1MyIHNwZWNpZmljIGFjdGlvbnMKKyMKKworZWxzZSBpZiAkKE9TMikKK3sKKyAgaWYgJChUT09MU0VUKSA9IFdBVENPTQorICB7CisgICAgYWN0aW9ucyB0b2dldGhlciBwaWVjZW1lYWwgQXJjaGl2ZQorICAgIHsKKyAgICAkKEFSKSAkKDwpICstJCg+KQorICAgIH0KKworICAgIGFjdGlvbnMgQ2MKKyAgICB7CisgICAgJChDQykgJChDQ0ZMQUdTKSAkKE9QVElNKSAvRm89JCg8KSAvSSQoSERSUykgJCg+KQorICAgIH0KKworICAgIGFjdGlvbnMgQysrCisgICAgeworICAgICQoQysrKSAkKEMrK0ZMQUdTKSAkKE9QVElNKSAvRm89JCg8KSAvSSQoSERSUykgJCg+KQorICAgIH0KKworICAgIGFjdGlvbnMgTGluayBiaW5kIE5FRURMSUJTCisgICAgeworICAgICQoTElOSykgJChMSU5LRkxBR1MpIC9GZT0kKDwpICQoVU5ERUZTKSAkKD4pICQoTkVFRExJQlMpICQoTElOS0xJQlMpCisgICAgfQorCisgICAgYWN0aW9ucyBTaGVsbAorICAgIHsKKyAgICAkKENQKSAkKD4pICQoPCkKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAkKFRPT0xTRVQpID0gRU1YCisgIHsKKyAgICBhY3Rpb25zIHRvZ2V0aGVyIHBpZWNlbWVhbCBBcmNoaXZlCisgICAgeworICAgICAgJChBUikgJCg8KSAkKD46VCkKKyAgICB9CisKKyAgICBhY3Rpb25zIENjCisgICAgeworICAgICQoQ0MpIC1jICQoQ0NGTEFHUykgJChPUFRJTSkgLUkkKEhEUlMpIC1vJCg8KSAkKD4pCisgICAgfQorCisgICAgYWN0aW9ucyBDKysKKyAgICB7CisgICAgJChDKyspIC1jICQoQysrRkxBR1MpICQoT1BUSU0pIC1JJChIRFJTKSAtbyQoPCkgJCg+KQorICAgIH0KKyAgfQorfQorCisjCisjIFZNUyBzcGVjaWZpYyBhY3Rpb25zCisjCisKK2Vsc2UgaWYgJChWTVMpCit7CisgICAgYWN0aW9ucyB1cGRhdGVkIHRvZ2V0aGVyIHBpZWNlbWVhbCBBcmNoaXZlCisgICAgeworICAgIGxpYi9yZXBsYWNlICQoPCkgJCg+WzFdKSAsJCg+WzItXSkKKyAgICB9CisKKyAgICBhY3Rpb25zIENjCisgICAgeworICAgICQoQ0MpL29iaj0kKDwpICQoQ0NGTEFHUykgJChPUFRJTSkgJChTTEFTSElOQykgJCg+KQorICAgIH0KKworICAgIGFjdGlvbnMgQysrCisgICAgeworICAgICQoQysrKS9vYmo9JCg8KSAkKEMrK0ZMQUdTKSAkKE9QVElNKSAkKFNMQVNISU5DKSAkKD4pCisgICAgfQorCisgICAgYWN0aW9ucyBwaWVjZW1lYWwgdG9nZXRoZXIgZXhpc3RpbmcgQ2xlYW4KKyAgICB7CisgICAgJChSTSkgJCg+WzFdKTsqICwkKD5bMi1dKTsqCisgICAgfQorCisgICAgYWN0aW9ucyB0b2dldGhlciBxdWlldGx5IENyZUxpYgorICAgIHsKKyAgICBpZiBmJHNlYXJjaCgiJCg8KSIpIC5lcXMuICIiIHRoZW4gbGliL2NyZWF0ZSAkKDwpCisgICAgfQorCisgICAgYWN0aW9ucyBHZW5GaWxlMQorICAgIHsKKyAgICBtY3IgJCg+WzFdKSAkKDwpICQoPlsyLV0pCisgICAgfQorCisgICAgYWN0aW9ucyBMaW5rIGJpbmQgTkVFRExJQlMKKyAgICB7CisgICAgJChMSU5LKS9leGU9JCg8KSAkKExJTktGTEFHUykgJCg+WzFdKSAsJCg+WzItXSkgLCQoTkVFRExJQlMpL2xpYiAsJChMSU5LTElCUykKKyAgICB9CisKKyAgICBhY3Rpb25zIHF1aWV0bHkgdXBkYXRlZCBwaWVjZW1lYWwgdG9nZXRoZXIgUm1UZW1wcworICAgIHsKKyAgICAkKFJNKSAkKD5bMV0pOyogLCQoPlsyLV0pOyoKKyAgICB9CisKKyAgICBhY3Rpb25zIFNoZWxsCisgICAgeworICAgICQoQ1ApICQoPikgJCg8KQorICAgIH0KK30KKworIworIyBNYWMgc3BlY2lmYyBhY3Rpb25zCisjCisKK2Vsc2UgaWYgJChNQUMpCit7CisgICAgYWN0aW9ucyB0b2dldGhlciBBcmNoaXZlCisgICAgeworICAgICQoTElOSykgLWxpYnJhcnkgLW8gJCg8KSAkKD4pCisgICAgfQorCisgICAgYWN0aW9ucyBDYworICAgIHsKKyAgICBzZXQgLWUgTVdDaW5jbHVkZXMgJChNQUNJTkMpCisgICAgJChDQykgLW8gJCg8KSAkKENDRkxBR1MpICQoT1BUSU0pICQoPikKKyAgICB9CisKKyAgICBhY3Rpb25zIEMrKworICAgIHsKKyAgICBzZXQgLWUgTVdDaW5jbHVkZXMgJChNQUNJTkMpCisgICAgJChDQykgLW8gJCg8KSAkKEMrK0ZMQUdTKSAkKE9QVElNKSAkKD4pCisgICAgfQorCisgICAgYWN0aW9ucyBMaW5rIGJpbmQgTkVFRExJQlMKKyAgICB7CisgICAgJChMSU5LKSAtbyAkKDwpICQoTElOS0ZMQUdTKSAkKD4pICQoTkVFRExJQlMpICIkKExJTktMSUJTKSIKKyAgICB9Cit9CisKKyMKKyMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBqYW0gMSwgd2hlcmUgcnVsZXMgd2VyZSB1cHBlcmNhc2VkLgorIworCitydWxlIEJVTEsgeyBCdWxrICQoPCkgOiAkKD4pIDsgfQorcnVsZSBGSUxFIHsgRmlsZSAkKDwpIDogJCg+KSA7IH0KK3J1bGUgSERSUlVMRSB7IEhkclJ1bGUgJCg8KSA6ICQoPikgOyB9CitydWxlIElOU1RBTEwgeyBJbnN0YWxsICQoPCkgOiAkKD4pIDsgfQorcnVsZSBMSUJSQVJZIHsgTGlicmFyeSAkKDwpIDogJCg+KSA7IH0KK3J1bGUgTElCUyB7IExpbmtMaWJyYXJpZXMgJCg8KSA6ICQoPikgOyB9CitydWxlIExJTksgeyBMaW5rICQoPCkgOiAkKD4pIDsgfQorcnVsZSBNQUlOIHsgTWFpbiAkKDwpIDogJCg+KSA7IH0KK3J1bGUgU0VUVUlEIHsgU2V0dWlkICQoPCkgOyB9CitydWxlIFNIRUxMIHsgU2hlbGwgJCg8KSA6ICQoPikgOyB9CitydWxlIFVOREVGSU5FUyB7IFVuZGVmaW5lcyAkKDwpIDogJCg+KSA7IH0KKworIyBPbGQgSU5TVEFMTCogZGlkbid0IHRha2UgZGVzdCBkaXJlY3RvcnkuCisKK3J1bGUgSU5TVEFMTEJJTiB7IEluc3RhbGxCaW4gJChCSU5ESVIpIDogJCg8KSA7IH0KK3J1bGUgSU5TVEFMTExJQiB7IEluc3RhbGxMaWIgJChMSUJESVIpIDogJCg8KSA7IH0KK3J1bGUgSU5TVEFMTE1BTiB7IEluc3RhbGxNYW4gJChNQU5ESVIpIDogJCg8KSA7IH0KKworIyBDb21wYXRpYmlsaXR5IHdpdGggamFtIDIuMi4KKworcnVsZSBhZGREaXJOYW1lIHsgJCg8KSArPSBbIEZEaXJOYW1lICQoPikgXSA7IH0KK3J1bGUgbWFrZURpck5hbWUgeyAkKDwpID0gWyBGRGlyTmFtZSAkKD4pIF0gOyB9CitydWxlIG1ha2VHcmlzdGVkTmFtZSB7ICQoPCkgPSBbIEZHcmlzdFNvdXJjZUZpbGVzICQoPikgXSA7IH0KK3J1bGUgbWFrZVJlbFBhdGggeyAkKDxbMV0pID0gWyBGUmVsUGF0aCAkKDxbMi1dKSA6ICQoPikgXSA7IH0KK3J1bGUgbWFrZVN1ZmZpeGVkIHsgJCg8WzFdKSA9IFsgRkFwcGVuZFN1ZmZpeCAkKD4pIDogJCg8WzJdKSBdIDsgfQorCisjCisjIE5vdyBpbmNsdWRlIHRoZSB1c2VyJ3MgSmFtZmlsZS4KKyMKKworeworICAgIGlmICQoSkFNRklMRSkgeyBpbmNsdWRlICQoSkFNRklMRSkgOyB9Cit9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2Jvb3N0LWphbS5zcGVjIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvYm9vc3QtamFtLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1NzJmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2Jvb3N0LWphbS5zcGVjCkBAIC0wLDAgKzEsNjQgQEAKK05hbWU6IGJvb3N0LWphbQorVmVyc2lvbjogMy4xLjE5CitTdW1tYXJ5OiBCdWlsZCB0b29sCitSZWxlYXNlOiAxCitTb3VyY2U6ICV7bmFtZX0tJXt2ZXJzaW9ufS50Z3oKKworTGljZW5zZTogQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAKK0dyb3VwOiBEZXZlbG9wbWVudC9Ub29scworVVJMOiBodHRwOi8vd3d3LmJvb3N0Lm9yZworUGFja2FnZXI6IFJlbmUgUml2ZXJhIDxncmFmaWtAcmVkc2hpZnQtc29mdHdhcmUuY29tPgorQnVpbGRSb290OiAvdmFyL3RtcC8le25hbWV9LSV7dmVyc2lvbn0ucm9vdAorCislZGVzY3JpcHRpb24KK0Jvb3N0IEphbSBpcyBhIGJ1aWxkIHRvb2wgYmFzZWQgb24gRlRKYW0sIHdoaWNoIGluIHR1cm4gaXMgYmFzZWQgb24KK1BlcmZvcmNlIEphbS4gSXQgY29udGFpbnMgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnRzIG1hZGUgdG8gZmFjaWxpdGF0ZQoraXRzIHVzZSBpbiB0aGUgQm9vc3QgQnVpbGQgU3lzdGVtLCBidXQgc2hvdWxkIGJlIGJhY2t3YXJkIGNvbXBhdGlibGUKK3dpdGggUGVyZm9yY2UgSmFtLgorCitBdXRob3JzOgorICAgIFBlcmZvcmNlIEphbSA6IENyaXN0b3BoZXIgU2Vpd2FsZAorICAgIEZUIEphbSA6IERhdmlkIFR1cm5lcgorICAgIEJvb3N0IEphbSA6IERhdmlkIEFicmFoYW1zCisKK0NvcHlyaWdodDoKKyAgICAvK1wKKyAgICArXCAgQ29weXJpZ2h0IDE5OTMtMjAwMiBDaHJpc3RvcGhlciBTZWl3YWxkIGFuZCBQZXJmb3JjZSBTb2Z0d2FyZSwgSW5jLgorICAgIFwrLworICAgIExpY2Vuc2UgaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIHRoaXMgc29mdHdhcmUgYW5kIGRpc3RyaWJ1dGUgaXQKKyAgICBmcmVlbHksIGFzIGxvbmcgYXMgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGFuZCBtb2RpZmljYXRpb25zCisgICAgYXJlIGNsZWFybHkgbWFya2VkLgorICAgIEFMTCBXQVJSQU5USUVTIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4KKworQWxzbzoKKyAgICBDb3B5cmlnaHQgMjAwMS0yMDA2IERhdmlkIEFicmFoYW1zLgorICAgIENvcHlyaWdodCAyMDAyLTIwMDYgUmVuZSBSaXZlcmEuCisgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBWbGFkaW1pciBQcnVzLgorCisgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworJXByZXAKKyVzZXR1cCAtbiAle25hbWV9LSV7dmVyc2lvbn0KKworJWJ1aWxkCitMT0NBVEVfVEFSR0VUPWJpbiAuL2J1aWxkLnNoICRCT09TVF9KQU1fVE9PTFNFVAorCislaW5zdGFsbAorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorbWtkaXIgLXAgJFJQTV9CVUlMRF9ST09UJXtfYmluZGlyfQorbWtkaXIgLXAgJFJQTV9CVUlMRF9ST09UJXtfZG9jZGlyfS8le25hbWV9LSV7dmVyc2lvbn0KK2luc3RhbGwgLW0gNzU1IGJpbi9iamFtICRSUE1fQlVJTERfUk9PVCV7X2JpbmRpcn0vYmphbS0le3ZlcnNpb259CitsbiAtc2YgYmphbS0le3ZlcnNpb259ICRSUE1fQlVJTERfUk9PVCV7X2JpbmRpcn0vYmphbQorY3AgLVIgKi5odG1sICoucG5nICouY3NzIExJQ0VOU0UqLnR4dCBpbWFnZXMgamFtICRSUE1fQlVJTERfUk9PVCV7X2RvY2Rpcn0vJXtuYW1lfS0le3ZlcnNpb259CisKK2ZpbmQgJFJQTV9CVUlMRF9ST09UIC1uYW1lIENWUyAtdHlwZSBkIC1leGVjIHJtIC1yIHt9IFw7CisKKyVmaWxlcworJWRlZmF0dHIoLSxyb290LHJvb3QpCislYXR0cig3NTUscm9vdCxyb290KSAvdXNyL2Jpbi8qCislZG9jICV7X2RvY2Rpcn0vJXtuYW1lfS0le3ZlcnNpb259CisKKworJWNsZWFuCitybSAtcmYgJFJQTV9CVUlMRF9ST09UCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9ib29zdC1uby1pbnNwZWN0IGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvYm9vc3Qtbm8taW5zcGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA2ZjNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvYm9vc3Qtbm8taW5zcGVjdApAQCAtMCwwICsxIEBACit0aGlzIHJlYWxseSBvdXQgb2Ygb3VyIGhhbmRzLCBzbyB0ZWxsIGluc3BlY3QgdG8gaWdub3JlIGRpcmVjdG9yeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2J1aWxkLmJhdCBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2J1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDM1YzRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvYnVpbGQuYmF0CkBAIC0wLDAgKzEsNTkwIEBACitARUNITyBPRkYKKworUkVNIH4gQ29weXJpZ2h0IDIwMDItMjAwNyBSZW5lIFJpdmVyYS4KK1JFTSB+IERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KK1JFTSB+IChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworc2V0bG9jYWwKK2dvdG8gU3RhcnQKKworCis6U2V0X0Vycm9yCitjb2xvciAwMAorZ290byA6ZW9mCisKKworOkNsZWFyX0Vycm9yCit2ZXIgPm51bAorZ290byA6ZW9mCisKKworOkVycm9yX1ByaW50CitSRU0gT3V0cHV0IGFuIGVycm9yIG1lc3NhZ2UgYW5kIHNldCB0aGUgZXJyb3JsZXZlbCB0byBpbmRpY2F0ZSBmYWlsdXJlLgorc2V0bG9jYWwKK0VDSE8gIyMjCitFQ0hPICMjIyAlMQorRUNITyAjIyMKK0VDSE8gIyMjIFlvdSBjYW4gc3BlY2lmeSB0aGUgdG9vbHNldCBhcyB0aGUgYXJndW1lbnQsIGkuZS46CitFQ0hPICMjIyAgICAgLlxidWlsZC5iYXQgbXN2YworRUNITyAjIyMKK0VDSE8gIyMjIFRvb2xzZXRzIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdCBhcmU6IGJvcmxhbmQsIGNvbW8sIGdjYywgZ2NjLW5vY3lnd2luLAorRUNITyAjIyMgICAgIGludGVsLXdpbjMyLCBtZXRyb3dlcmtzLCBtaW5ndywgbXN2YywgdmM3LCB2YzgsIHZjOSwgdmMxMCwgdmMxMSwgdmMxMgorRUNITyAjIyMKK2NhbGwgOlNldF9FcnJvcgorZW5kbG9jYWwKK2dvdG8gOmVvZgorCisKKzpUZXN0X1BhdGgKK1JFTSBUZXN0cyBmb3IgdGhlIGdpdmVuIGZpbGUoZXhlY3V0YWJsZSkgcHJlc2VuY2UgaW4gdGhlIGRpcmVjdG9yaWVzIGluIHRoZSBQQVRICitSRU0gZW52aXJvbm1lbnQgdmFyaWFibGUuIEFkZGl0aW9uYWx5IHNldHMgRk9VTkRfUEFUSCB0byB0aGUgcGF0aCBvZiB0aGUKK1JFTSBmb3VuZCBmaWxlLgorY2FsbCA6Q2xlYXJfRXJyb3IKK3NldGxvY2FsCitzZXQgdGVzdD0lfiRQQVRIOjEKK2VuZGxvY2FsCitpZiBub3QgZXJyb3JsZXZlbCAxIHNldCBGT1VORF9QQVRIPSV+ZHAkUEFUSDoxCitnb3RvIDplb2YKKworCis6VGVzdF9PcHRpb24KK1JFTSBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBzdHJpbmcgaXMgaW4gdGhlIGZvcm0gb2YgYW4gb3B0aW9uOiAiLS0qIgorY2FsbCA6Q2xlYXJfRXJyb3IKK3NldGxvY2FsCitzZXQgdGVzdD0lMQoraWYgbm90IGRlZmluZWQgdGVzdCAoCisgICAgY2FsbCA6U2V0X0Vycm9yCisgICAgZ290byBUZXN0X09wdGlvbl9FbmQKKykKK3NldCB0ZXN0PSMjIyV0ZXN0JSMjIworc2V0IHRlc3Q9JXRlc3Q6IiMjIz0lCitzZXQgdGVzdD0ldGVzdDojIyMiPSUKK3NldCB0ZXN0PSV0ZXN0OiMjIz0lCitpZiBub3QgIi0iID09ICIldGVzdDp+MSwxJSIgY2FsbCA6U2V0X0Vycm9yCis6VGVzdF9PcHRpb25fRW5kCitlbmRsb2NhbAorZ290byA6ZW9mCisKKworOlRlc3RfRW1wdHkKK1JFTSBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBzdHJpbmcgaXMgbm90IGVtcHR5CitjYWxsIDpDbGVhcl9FcnJvcgorc2V0bG9jYWwKK3NldCB0ZXN0PSUxCitpZiBub3QgZGVmaW5lZCB0ZXN0ICgKKyAgICBjYWxsIDpDbGVhcl9FcnJvcgorICAgIGdvdG8gVGVzdF9FbXB0eV9FbmQKKykKK3NldCB0ZXN0PSMjIyV0ZXN0JSMjIworc2V0IHRlc3Q9JXRlc3Q6IiMjIz0lCitzZXQgdGVzdD0ldGVzdDojIyMiPSUKK3NldCB0ZXN0PSV0ZXN0OiMjIz0lCitpZiBub3QgIiIgPT0gIiV0ZXN0JSIgY2FsbCA6U2V0X0Vycm9yCis6VGVzdF9FbXB0eV9FbmQKK2VuZGxvY2FsCitnb3RvIDplb2YKKworCis6Q2FsbF9JZl9FeGlzdHMKK2lmIEVYSVNUICUxIGNhbGwgJSoKK2dvdG8gOmVvZgorCisKKzpHdWVzc19Ub29sc2V0CitSRU0gVHJ5IGFuZCBndWVzcyB0aGUgdG9vbHNldCB0byBib290c3RyYXAgdGhlIGJ1aWxkIHdpdGguLi4KK1JFTSBTZXRzIEJPT1NUX0pBTV9UT09MU0VUIHRvIHRoZSBmaXJzdCBmb3VuZCB0b29sc2V0LgorUkVNIE1heSBhbHNvIHNldCBCT09TVF9KQU1fVE9PTFNFVF9ST09UIHRvIHRoZQorUkVNIGxvY2F0aW9uIG9mIHRoZSBmb3VuZCB0b29sc2V0LgorCitjYWxsIDpDbGVhcl9FcnJvcgorY2FsbCA6VGVzdF9FbXB0eSAlUHJvZ3JhbUZpbGVzJQoraWYgbm90IGVycm9ybGV2ZWwgMSBzZXQgUHJvZ3JhbUZpbGVzPUM6XFByb2dyYW0gRmlsZXMKKworY2FsbCA6Q2xlYXJfRXJyb3IKK2lmIE5PVCAiXyVWUzEyMENPTU5UT09MUyVfIiA9PSAiX18iICgKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUPXZjMTIiCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVF9ST09UPSVWUzEyMENPTU5UT09MUyUuLlwuLlxWQ1wiCisgICAgZ290byA6ZW9mKQorY2FsbCA6Q2xlYXJfRXJyb3IKK2lmIEVYSVNUICIlUHJvZ3JhbUZpbGVzJVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMi4wXFZDXFZDVkFSU0FMTC5CQVQiICgKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUPXZjMTIiCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVF9ST09UPSVQcm9ncmFtRmlsZXMlXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDEyLjBcVkNcIgorICAgIGdvdG8gOmVvZikKK2NhbGwgOkNsZWFyX0Vycm9yCitpZiBOT1QgIl8lVlMxMTBDT01OVE9PTFMlXyIgPT0gIl9fIiAoCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVD12YzExIgorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lVlMxMTBDT01OVE9PTFMlLi5cLi5cVkNcIgorICAgIGdvdG8gOmVvZikKK2NhbGwgOkNsZWFyX0Vycm9yCitpZiBFWElTVCAiJVByb2dyYW1GaWxlcyVcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTEuMFxWQ1xWQ1ZBUlNBTEwuQkFUIiAoCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVD12YzExIgorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lUHJvZ3JhbUZpbGVzJVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMS4wXFZDXCIKKyAgICBnb3RvIDplb2YpCitjYWxsIDpDbGVhcl9FcnJvcgoraWYgTk9UICJfJVZTMTAwQ09NTlRPT0xTJV8iID09ICJfXyIgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVQ9dmMxMCIKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JVZTMTAwQ09NTlRPT0xTJS4uXC4uXFZDXCIKKyAgICBnb3RvIDplb2YpCitjYWxsIDpDbGVhcl9FcnJvcgoraWYgRVhJU1QgIiVQcm9ncmFtRmlsZXMlXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDEwLjBcVkNcVkNWQVJTQUxMLkJBVCIgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVQ9dmMxMCIKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JVByb2dyYW1GaWxlcyVcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTAuMFxWQ1wiCisgICAgZ290byA6ZW9mKQorY2FsbCA6Q2xlYXJfRXJyb3IKK2lmIE5PVCAiXyVWUzkwQ09NTlRPT0xTJV8iID09ICJfXyIgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVQ9dmM5IgorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lVlM5MENPTU5UT09MUyUuLlwuLlxWQ1wiCisgICAgZ290byA6ZW9mKQorY2FsbCA6Q2xlYXJfRXJyb3IKK2lmIEVYSVNUICIlUHJvZ3JhbUZpbGVzJVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyA5LjBcVkNcVkNWQVJTQUxMLkJBVCIgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVQ9dmM5IgorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lUHJvZ3JhbUZpbGVzJVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyA5LjBcVkNcIgorICAgIGdvdG8gOmVvZikKK2NhbGwgOkNsZWFyX0Vycm9yCitpZiBOT1QgIl8lVlM4MENPTU5UT09MUyVfIiA9PSAiX18iICgKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUPXZjOCIKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JVZTODBDT01OVE9PTFMlLi5cLi5cVkNcIgorICAgIGdvdG8gOmVvZikKK2NhbGwgOkNsZWFyX0Vycm9yCitpZiBFWElTVCAiJVByb2dyYW1GaWxlcyVcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gOFxWQ1xWQ1ZBUlNBTEwuQkFUIiAoCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVD12YzgiCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVF9ST09UPSVQcm9ncmFtRmlsZXMlXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDhcVkNcIgorICAgIGdvdG8gOmVvZikKK2NhbGwgOkNsZWFyX0Vycm9yCitpZiBOT1QgIl8lVlM3MUNPTU5UT09MUyVfIiA9PSAiX18iICgKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUPXZjNyIKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JVZTNzFDT01OVE9PTFMlXC4uXC4uXFZDN1wiCisgICAgZ290byA6ZW9mKQorY2FsbCA6Q2xlYXJfRXJyb3IKK2lmIE5PVCAiXyVWQ0lOU1RBTExESVIlXyIgPT0gIl9fIiAoCisgICAgUkVNICVWQ0lOU1RBTExESVIlIGlzIGFsc28gc2V0IGZvciBWQzkgKGFuZCBwcm9iYWJseSBWQzgpCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVD12YzciCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVF9ST09UPSVWQ0lOU1RBTExESVIlXFZDN1wiCisgICAgZ290byA6ZW9mKQorY2FsbCA6Q2xlYXJfRXJyb3IKK2lmIEVYSVNUICIlUHJvZ3JhbUZpbGVzJVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAuTkVUIDIwMDNcVkM3XGJpblxWQ1ZBUlMzMi5CQVQiICgKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUPXZjNyIKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JVByb2dyYW1GaWxlcyVcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzXFZDN1wiCisgICAgZ290byA6ZW9mKQorY2FsbCA6Q2xlYXJfRXJyb3IKK2lmIEVYSVNUICIlUHJvZ3JhbUZpbGVzJVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAuTkVUXFZDN1xiaW5cVkNWQVJTMzIuQkFUIiAoCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVD12YzciCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVF9ST09UPSVQcm9ncmFtRmlsZXMlXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIC5ORVRcVkM3XCIKKyAgICBnb3RvIDplb2YpCitjYWxsIDpDbGVhcl9FcnJvcgoraWYgTk9UICJfJU1TVkNEaXIlXyIgPT0gIl9fIiAoCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVD1tc3ZjIgorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lTVNWQ0RpciVcIgorICAgIGdvdG8gOmVvZikKK2NhbGwgOkNsZWFyX0Vycm9yCitpZiBFWElTVCAiJVByb2dyYW1GaWxlcyVcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW9cVkM5OFxiaW5cVkNWQVJTMzIuQkFUIiAoCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVD1tc3ZjIgorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lUHJvZ3JhbUZpbGVzJVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpb1xWQzk4XCIKKyAgICBnb3RvIDplb2YpCitjYWxsIDpDbGVhcl9FcnJvcgoraWYgRVhJU1QgIiVQcm9ncmFtRmlsZXMlXE1pY3Jvc29mdCBWaXN1YWwgQysrXFZDOThcYmluXFZDVkFSUzMyLkJBVCIgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVQ9bXN2YyIKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JVByb2dyYW1GaWxlcyVcTWljcm9zb2Z0IFZpc3VhbCBDKytcVkM5OFwiCisgICAgZ290byA6ZW9mKQorY2FsbCA6Q2xlYXJfRXJyb3IKK2NhbGwgOlRlc3RfUGF0aCBjbC5leGUKK2lmIG5vdCBlcnJvcmxldmVsIDEgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVQ9bXN2YyIKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JUZPVU5EX1BBVEglLi5cIgorICAgIGdvdG8gOmVvZikKK2NhbGwgOkNsZWFyX0Vycm9yCitjYWxsIDpUZXN0X1BhdGggdmN2YXJzMzIuYmF0CitpZiBub3QgZXJyb3JsZXZlbCAxICgKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUPW1zdmMiCisgICAgY2FsbCAiJUZPVU5EX1BBVEglVkNWQVJTMzIuQkFUIgorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lTVNWQ0RpciVcIgorICAgIGdvdG8gOmVvZikKK2NhbGwgOkNsZWFyX0Vycm9yCitpZiBFWElTVCAiQzpcQm9ybGFuZFxCQ0M1NVxCaW5cYmNjMzIuZXhlIiAoCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVD1ib3JsYW5kIgorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD1DOlxCb3JsYW5kXEJDQzU1XCIKKyAgICBnb3RvIDplb2YpCitjYWxsIDpDbGVhcl9FcnJvcgorY2FsbCA6VGVzdF9QYXRoIGJjYzMyLmV4ZQoraWYgbm90IGVycm9ybGV2ZWwgMSAoCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVD1ib3JsYW5kIgorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lRk9VTkRfUEFUSCUuLlwiCisgICAgZ290byA6ZW9mKQorY2FsbCA6Q2xlYXJfRXJyb3IKK2NhbGwgOlRlc3RfUGF0aCBpY2wuZXhlCitpZiBub3QgZXJyb3JsZXZlbCAxICgKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUPWludGVsLXdpbjMyIgorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lRk9VTkRfUEFUSCUuLlwiCisgICAgZ290byA6ZW9mKQorY2FsbCA6Q2xlYXJfRXJyb3IKK2lmIEVYSVNUICJDOlxNaW5HV1xiaW5cZ2NjLmV4ZSIgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVQ9bWluZ3ciCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVF9ST09UPUM6XE1pbkdXXCIKKyAgICBnb3RvIDplb2YpCitjYWxsIDpDbGVhcl9FcnJvcgoraWYgTk9UICJfJUNXRm9sZGVyJV8iID09ICJfXyIgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVQ9bWV0cm93ZXJrcyIKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JUNXRm9sZGVyJVwiCisgICAgZ290byA6ZW9mICkKK2NhbGwgOkNsZWFyX0Vycm9yCitjYWxsIDpUZXN0X1BhdGggbXdjYy5leGUKK2lmIG5vdCBlcnJvcmxldmVsIDEgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVQ9bWV0cm93ZXJrcyIKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JUZPVU5EX1BBVEglLi5cLi5cIgorICAgIGdvdG8gOmVvZikKK2NhbGwgOkNsZWFyX0Vycm9yCitjYWxsIDpFcnJvcl9QcmludCAiQ291bGQgbm90IGZpbmQgYSBzdWl0YWJsZSB0b29sc2V0LiIKK2dvdG8gOmVvZgorCisKKzpHdWVzc19ZYWNjCitSRU0gVHJpZXMgdG8gZmluZCBiaXNvbiBvciB5YWNjIGluIGNvbW1vbiBwbGFjZXMgc28gd2UgY2FuIGJ1aWxkIHRoZSBncmFtbWFyLgorY2FsbCA6Q2xlYXJfRXJyb3IKK2NhbGwgOlRlc3RfUGF0aCB5YWNjLmV4ZQoraWYgbm90IGVycm9ybGV2ZWwgMSAoCisgICAgc2V0ICJZQUNDPXlhY2MgLWQiCisgICAgZ290byA6ZW9mKQorY2FsbCA6Q2xlYXJfRXJyb3IKK2NhbGwgOlRlc3RfUGF0aCBiaXNvbi5leGUKK2lmIG5vdCBlcnJvcmxldmVsIDEgKAorICAgIHNldCAiWUFDQz1iaXNvbiAtZCAtLXlhY2MiCisgICAgZ290byA6ZW9mKQorY2FsbCA6Q2xlYXJfRXJyb3IKK2lmIEVYSVNUICJDOlxQcm9ncmFtIEZpbGVzXEdudVdpbjMyXGJpblxiaXNvbi5leGUiICgKKyAgICBzZXQgIllBQ0M9QzpcUHJvZ3JhbSBGaWxlc1xHbnVXaW4zMlxiaW5cYmlzb24uZXhlIiAtZCAtLXlhY2MKKyAgICBnb3RvIDplb2YpCitjYWxsIDpDbGVhcl9FcnJvcgorY2FsbCA6RXJyb3JfUHJpbnQgIkNvdWxkIG5vdCBmaW5kIFlhY2MgdG8gYnVpbGQgdGhlIEphbSBncmFtbWFyLiIKK2dvdG8gOmVvZgorCisKKzpTdGFydAorc2V0IEJPT1NUX0pBTV9UT09MU0VUPQorc2V0IEJPT1NUX0pBTV9BUkdTPQorCitSRU0gSWYgbm8gYXJndW1lbnRzIGd1ZXNzIHRoZSB0b29sc2V0OworUkVNIG9yIGlmIGZpcnN0IGFyZ3VtZW50IGlzIGFuIG9wdGlvbiBndWVzcyB0aGUgdG9vbHNldDsKK1JFTSBvdGhlcndpc2UgdGhlIGFyZ3VtZW50IGlzIHRoZSB0b29sc2V0IHRvIHVzZS4KK2NhbGwgOkNsZWFyX0Vycm9yCitjYWxsIDpUZXN0X0VtcHR5ICUxCitpZiBub3QgZXJyb3JsZXZlbCAxICgKKyAgICBjYWxsIDpHdWVzc19Ub29sc2V0CisgICAgaWYgbm90IGVycm9ybGV2ZWwgMSAoIGdvdG8gU2V0dXBfVG9vbHNldCApIGVsc2UgKCBnb3RvIEZpbmlzaCApCispCisKK2NhbGwgOkNsZWFyX0Vycm9yCitjYWxsIDpUZXN0X09wdGlvbiAlMQoraWYgbm90IGVycm9ybGV2ZWwgMSAoCisgICAgY2FsbCA6R3Vlc3NfVG9vbHNldAorICAgIGlmIG5vdCBlcnJvcmxldmVsIDEgKCBnb3RvIFNldHVwX1Rvb2xzZXQgKSBlbHNlICggZ290byBGaW5pc2ggKQorKQorCitjYWxsIDpDbGVhcl9FcnJvcgorc2V0IEJPT1NUX0pBTV9UT09MU0VUPSUxCitzaGlmdAorZ290byBTZXR1cF9Ub29sc2V0CisKKworOlNldHVwX1Rvb2xzZXQKK1JFTSBTZXR1cCB0aGUgdG9vbHNldCBjb21tYW5kIGFuZCBvcHRpb25zLiBUaGlzIGJpdCBvZiBjb2RlCitSRU0gbmVlZHMgdG8gYmUgZmxleGlibGUgZW5vdWdoIHRvIGhhbmRsZSBib3RoIHdoZW4KK1JFTSB0aGUgdG9vbHNldCB3YXMgZ3Vlc3NlZCBhdCBhbmQgZm91bmQsIG9yIHdoZW4gdGhlIHRvb2xzZXQKK1JFTSB3YXMgaW5kaWNhdGVkIGluIHRoZSBjb21tYW5kIGFyZ3VtZW50cy4KK1JFTSBOT1RFOiBUaGUgc3RyYW5nZSBtdWx0aXBsZSAiaWYgPz8gPT0gX3Rvb2xzZXRfIiB0ZXN0cyBhcmUgdGhhdCB3YXkKK1JFTSBiZWNhdXNlIGluIEJBVCB2YXJpYWJsZXMgYXJlIHN1YnNpdHV0ZWQgb25seSBvbmNlIGR1cmluZyBhIHNpbmdsZQorUkVNIGNvbW1hbmQuIEEgY29tcGxldGUgImlmIC4uLiAoIGNvbW1hbmRzICkgZWxzZSAoIGNvbW1hbmRzICkiCitSRU0gaXMgYSBzaW5nbGUgY29tbWFuZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBtdWx0aXBsZSBsaW5lcyBoZXJlLgorOlNldHVwX0FyZ3MKK2NhbGwgOkNsZWFyX0Vycm9yCitjYWxsIDpUZXN0X0VtcHR5ICUxCitpZiBub3QgZXJyb3JsZXZlbCAxIGdvdG8gQ29uZmlnX1Rvb2xzZXQKK2NhbGwgOkNsZWFyX0Vycm9yCitjYWxsIDpUZXN0X09wdGlvbiAlMQoraWYgZXJyb3JsZXZlbCAxICgKKyAgICBzZXQgQk9PU1RfSkFNX0FSR1M9JUJPT1NUX0pBTV9BUkdTJSAlMQorICAgIHNoaWZ0CisgICAgZ290byBTZXR1cF9BcmdzCispCis6Q29uZmlnX1Rvb2xzZXQKK2lmIE5PVCAiXyVCT09TVF9KQU1fVE9PTFNFVCVfIiA9PSAiX21ldHJvd2Vya3NfIiBnb3RvIFNraXBfTUVUUk9XRVJLUworaWYgTk9UICJfJUNXRm9sZGVyJV8iID09ICJfXyIgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lQ1dGb2xkZXIlXCIKKyAgICApCitzZXQgIlBBVEg9JUJPT1NUX0pBTV9UT09MU0VUX1JPT1QlT3RoZXIgTWV0cm93ZXJrcyBUb29sc1xDb21tYW5kIExpbmUgVG9vbHM7JVBBVEglIgorc2V0ICJCT09TVF9KQU1fQ0M9bXdjYyAtcnVudGltZSBzcyAtY3dkIGluY2x1ZGUgLUROVCAtbGtlcm5lbDMyLmxpYiAtbGFkdmFwaTMyLmxpYiAtbHVzZXIzMi5saWIiCitzZXQgIkJPT1NUX0pBTV9PUFRfSkFNPS1vIGJvb3RzdHJhcFxqYW0wLmV4ZSIKK3NldCAiQk9PU1RfSkFNX09QVF9NS0pBTUJBU0U9LW8gYm9vdHN0cmFwXG1ramFtYmFzZTAuZXhlIgorc2V0ICJCT09TVF9KQU1fT1BUX1lZQUNDPS1vIGJvb3RzdHJhcFx5eWFjYzAuZXhlIgorc2V0ICJfa25vd25fPTEiCis6U2tpcF9NRVRST1dFUktTCitpZiBOT1QgIl8lQk9PU1RfSkFNX1RPT0xTRVQlXyIgPT0gIl9tc3ZjXyIgZ290byBTa2lwX01TVkMKK2lmIE5PVCAiXyVNU1ZDRGlyJV8iID09ICJfXyIgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lTVNWQ0RpciVcIgorICAgICkKK2NhbGwgOkNhbGxfSWZfRXhpc3RzICIlQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCViaW5cVkNWQVJTMzIuQkFUIgoraWYgbm90ICJfJUJPT1NUX0pBTV9UT09MU0VUX1JPT1QlXyIgPT0gIl9fIiAoCisgICAgc2V0ICJQQVRIPSVCT09TVF9KQU1fVE9PTFNFVF9ST09UJWJpbjslUEFUSCUiCisgICAgKQorc2V0ICJCT09TVF9KQU1fQ0M9Y2wgL25vbG9nbyAvR1ogL1ppIC9NTGQgL0ZvYm9vdHN0cmFwLyAvRmRib290c3RyYXAvIC1ETlQgLURZWURFQlVHIGtlcm5lbDMyLmxpYiBhZHZhcGkzMi5saWIgdXNlcjMyLmxpYiIKK3NldCAiQk9PU1RfSkFNX09QVF9KQU09L0ZlYm9vdHN0cmFwXGphbTAiCitzZXQgIkJPT1NUX0pBTV9PUFRfTUtKQU1CQVNFPS9GZWJvb3RzdHJhcFxta2phbWJhc2UwIgorc2V0ICJCT09TVF9KQU1fT1BUX1lZQUNDPS9GZWJvb3RzdHJhcFx5eWFjYzAiCitzZXQgIl9rbm93bl89MSIKKzpTa2lwX01TVkMKK2lmIE5PVCAiXyVCT09TVF9KQU1fVE9PTFNFVCVfIiA9PSAiX3ZjN18iIGdvdG8gU2tpcF9WQzcKK2lmIE5PVCAiXyVWUzcxQ09NTlRPT0xTJV8iID09ICJfXyIgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lVlM3MUNPTU5UT09MUyUuLlwuLlxWQzdcIgorICAgICkKK2lmICJfJVZDSU5TVEFMTERJUiVfIiA9PSAiX18iIGNhbGwgOkNhbGxfSWZfRXhpc3RzICIlQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCViaW5cVkNWQVJTMzIuQkFUIgoraWYgTk9UICJfJUJPT1NUX0pBTV9UT09MU0VUX1JPT1QlXyIgPT0gIl9fIiAoCisgICAgaWYgIl8lVkNJTlNUQUxMRElSJV8iID09ICJfXyIgKAorICAgICAgICBzZXQgIlBBVEg9JUJPT1NUX0pBTV9UT09MU0VUX1JPT1QlYmluOyVQQVRIJSIKKyAgICAgICAgKSApCitzZXQgIkJPT1NUX0pBTV9DQz1jbCAvbm9sb2dvIC9HWiAvWmkgL01MZCAvRm9ib290c3RyYXAvIC9GZGJvb3RzdHJhcC8gLUROVCAtRFlZREVCVUcga2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiB1c2VyMzIubGliIgorc2V0ICJCT09TVF9KQU1fT1BUX0pBTT0vRmVib290c3RyYXBcamFtMCIKK3NldCAiQk9PU1RfSkFNX09QVF9NS0pBTUJBU0U9L0ZlYm9vdHN0cmFwXG1ramFtYmFzZTAiCitzZXQgIkJPT1NUX0pBTV9PUFRfWVlBQ0M9L0ZlYm9vdHN0cmFwXHl5YWNjMCIKK3NldCAiX2tub3duXz0xIgorOlNraXBfVkM3CitpZiBOT1QgIl8lQk9PU1RfSkFNX1RPT0xTRVQlXyIgPT0gIl92YzhfIiBnb3RvIFNraXBfVkM4CitpZiBOT1QgIl8lVlM4MENPTU5UT09MUyVfIiA9PSAiX18iICgKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JVZTODBDT01OVE9PTFMlLi5cLi5cVkNcIgorICAgICkKK2lmICJfJVZDSU5TVEFMTERJUiVfIiA9PSAiX18iIGNhbGwgOkNhbGxfSWZfRXhpc3RzICIlQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCVWQ1ZBUlNBTEwuQkFUIiAlQk9PU1RfSkFNX0FSR1MlCitpZiBOT1QgIl8lQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCVfIiA9PSAiX18iICgKKyAgICBpZiAiXyVWQ0lOU1RBTExESVIlXyIgPT0gIl9fIiAoCisgICAgICAgIHNldCAiUEFUSD0lQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCViaW47JVBBVEglIgorICAgICAgICApICkKK3NldCAiQk9PU1RfSkFNX0NDPWNsIC9ub2xvZ28gL1JUQzEgL1ppIC9NVGQgL0ZvYm9vdHN0cmFwLyAvRmRib290c3RyYXAvIC1ETlQgLURZWURFQlVHIC13ZDQ5OTYga2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiB1c2VyMzIubGliIgorc2V0ICJCT09TVF9KQU1fT1BUX0pBTT0vRmVib290c3RyYXBcamFtMCIKK3NldCAiQk9PU1RfSkFNX09QVF9NS0pBTUJBU0U9L0ZlYm9vdHN0cmFwXG1ramFtYmFzZTAiCitzZXQgIkJPT1NUX0pBTV9PUFRfWVlBQ0M9L0ZlYm9vdHN0cmFwXHl5YWNjMCIKK3NldCAiX2tub3duXz0xIgorOlNraXBfVkM4CitpZiBOT1QgIl8lQk9PU1RfSkFNX1RPT0xTRVQlXyIgPT0gIl92YzlfIiBnb3RvIFNraXBfVkM5CitpZiBOT1QgIl8lVlM5MENPTU5UT09MUyVfIiA9PSAiX18iICgKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JVZTOTBDT01OVE9PTFMlLi5cLi5cVkNcIgorICAgICkKK2lmICJfJVZDSU5TVEFMTERJUiVfIiA9PSAiX18iIGNhbGwgOkNhbGxfSWZfRXhpc3RzICIlQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCVWQ1ZBUlNBTEwuQkFUIiAlQk9PU1RfSkFNX0FSR1MlCitpZiBOT1QgIl8lQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCVfIiA9PSAiX18iICgKKyAgICBpZiAiXyVWQ0lOU1RBTExESVIlXyIgPT0gIl9fIiAoCisgICAgICAgIHNldCAiUEFUSD0lQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCViaW47JVBBVEglIgorICAgICAgICApICkKK3NldCAiQk9PU1RfSkFNX0NDPWNsIC9ub2xvZ28gL1JUQzEgL1ppIC9NVGQgL0ZvYm9vdHN0cmFwLyAvRmRib290c3RyYXAvIC1ETlQgLURZWURFQlVHIC13ZDQ5OTYga2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiB1c2VyMzIubGliIgorc2V0ICJCT09TVF9KQU1fT1BUX0pBTT0vRmVib290c3RyYXBcamFtMCIKK3NldCAiQk9PU1RfSkFNX09QVF9NS0pBTUJBU0U9L0ZlYm9vdHN0cmFwXG1ramFtYmFzZTAiCitzZXQgIkJPT1NUX0pBTV9PUFRfWVlBQ0M9L0ZlYm9vdHN0cmFwXHl5YWNjMCIKK3NldCAiX2tub3duXz0xIgorOlNraXBfVkM5CitpZiBOT1QgIl8lQk9PU1RfSkFNX1RPT0xTRVQlXyIgPT0gIl92YzEwXyIgZ290byBTa2lwX1ZDMTAKK2lmIE5PVCAiXyVWUzEwMENPTU5UT09MUyVfIiA9PSAiX18iICgKKyAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JVZTMTAwQ09NTlRPT0xTJS4uXC4uXFZDXCIKKyAgICApCitpZiAiXyVWQ0lOU1RBTExESVIlXyIgPT0gIl9fIiBjYWxsIDpDYWxsX0lmX0V4aXN0cyAiJUJPT1NUX0pBTV9UT09MU0VUX1JPT1QlVkNWQVJTQUxMLkJBVCIgJUJPT1NUX0pBTV9BUkdTJQoraWYgTk9UICJfJUJPT1NUX0pBTV9UT09MU0VUX1JPT1QlXyIgPT0gIl9fIiAoCisgICAgaWYgIl8lVkNJTlNUQUxMRElSJV8iID09ICJfXyIgKAorICAgICAgICBzZXQgIlBBVEg9JUJPT1NUX0pBTV9UT09MU0VUX1JPT1QlYmluOyVQQVRIJSIKKyAgICAgICAgKSApCitzZXQgIkJPT1NUX0pBTV9DQz1jbCAvbm9sb2dvIC9SVEMxIC9aaSAvTVRkIC9Gb2Jvb3RzdHJhcC8gL0ZkYm9vdHN0cmFwLyAtRE5UIC1EWVlERUJVRyAtd2Q0OTk2IGtlcm5lbDMyLmxpYiBhZHZhcGkzMi5saWIgdXNlcjMyLmxpYiIKK3NldCAiQk9PU1RfSkFNX09QVF9KQU09L0ZlYm9vdHN0cmFwXGphbTAiCitzZXQgIkJPT1NUX0pBTV9PUFRfTUtKQU1CQVNFPS9GZWJvb3RzdHJhcFxta2phbWJhc2UwIgorc2V0ICJCT09TVF9KQU1fT1BUX1lZQUNDPS9GZWJvb3RzdHJhcFx5eWFjYzAiCitzZXQgIl9rbm93bl89MSIKKzpTa2lwX1ZDMTAKK2lmIE5PVCAiXyVCT09TVF9KQU1fVE9PTFNFVCVfIiA9PSAiX3ZjMTFfIiBnb3RvIFNraXBfVkMxMQoraWYgTk9UICJfJVZTMTEwQ09NTlRPT0xTJV8iID09ICJfXyIgKAorICAgIHNldCAiQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0lVlMxMTBDT01OVE9PTFMlLi5cLi5cVkNcIgorICAgICkKK2lmICJfJVZDSU5TVEFMTERJUiVfIiA9PSAiX18iIGNhbGwgOkNhbGxfSWZfRXhpc3RzICIlQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCVWQ1ZBUlNBTEwuQkFUIiAlQk9PU1RfSkFNX0FSR1MlCitpZiBOT1QgIl8lQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCVfIiA9PSAiX18iICgKKyAgICBpZiAiXyVWQ0lOU1RBTExESVIlXyIgPT0gIl9fIiAoCisgICAgICAgIHNldCAiUEFUSD0lQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCViaW47JVBBVEglIgorICAgICAgICApICkKK3NldCAiQk9PU1RfSkFNX0NDPWNsIC9ub2xvZ28gL1JUQzEgL1ppIC9NVGQgL0ZvYm9vdHN0cmFwLyAvRmRib290c3RyYXAvIC1ETlQgLURZWURFQlVHIC13ZDQ5OTYga2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiB1c2VyMzIubGliIgorc2V0ICJCT09TVF9KQU1fT1BUX0pBTT0vRmVib290c3RyYXBcamFtMCIKK3NldCAiQk9PU1RfSkFNX09QVF9NS0pBTUJBU0U9L0ZlYm9vdHN0cmFwXG1ramFtYmFzZTAiCitzZXQgIkJPT1NUX0pBTV9PUFRfWVlBQ0M9L0ZlYm9vdHN0cmFwXHl5YWNjMCIKK3NldCAiX2tub3duXz0xIgorOlNraXBfVkMxMQoraWYgTk9UICJfJUJPT1NUX0pBTV9UT09MU0VUJV8iID09ICJfdmMxMl8iIGdvdG8gU2tpcF9WQzEyCitpZiBOT1QgIl8lVlMxMjBDT01OVE9PTFMlXyIgPT0gIl9fIiAoCisgICAgc2V0ICJCT09TVF9KQU1fVE9PTFNFVF9ST09UPSVWUzEyMENPTU5UT09MUyUuLlwuLlxWQ1wiCisgICAgKQoraWYgIl8lVkNJTlNUQUxMRElSJV8iID09ICJfXyIgY2FsbCA6Q2FsbF9JZl9FeGlzdHMgIiVCT09TVF9KQU1fVE9PTFNFVF9ST09UJVZDVkFSU0FMTC5CQVQiICVCT09TVF9KQU1fQVJHUyUKK2lmIE5PVCAiXyVCT09TVF9KQU1fVE9PTFNFVF9ST09UJV8iID09ICJfXyIgKAorICAgIGlmICJfJVZDSU5TVEFMTERJUiVfIiA9PSAiX18iICgKKyAgICAgICAgc2V0ICJQQVRIPSVCT09TVF9KQU1fVE9PTFNFVF9ST09UJWJpbjslUEFUSCUiCisgICAgICAgICkgKQorc2V0ICJCT09TVF9KQU1fQ0M9Y2wgL25vbG9nbyAvUlRDMSAvWmkgL01UZCAvRm9ib290c3RyYXAvIC9GZGJvb3RzdHJhcC8gLUROVCAtRFlZREVCVUcgLXdkNDk5NiBrZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHVzZXIzMi5saWIiCitzZXQgIkJPT1NUX0pBTV9PUFRfSkFNPS9GZWJvb3RzdHJhcFxqYW0wIgorc2V0ICJCT09TVF9KQU1fT1BUX01LSkFNQkFTRT0vRmVib290c3RyYXBcbWtqYW1iYXNlMCIKK3NldCAiQk9PU1RfSkFNX09QVF9ZWUFDQz0vRmVib290c3RyYXBceXlhY2MwIgorc2V0ICJfa25vd25fPTEiCis6U2tpcF9WQzEyCitpZiBOT1QgIl8lQk9PU1RfSkFNX1RPT0xTRVQlXyIgPT0gIl9ib3JsYW5kXyIgZ290byBTa2lwX0JPUkxBTkQKK2lmICJfJUJPT1NUX0pBTV9UT09MU0VUX1JPT1QlXyIgPT0gIl9fIiAoCisgICAgY2FsbCA6VGVzdF9QYXRoIGJjYzMyLmV4ZSApCitpZiAiXyVCT09TVF9KQU1fVE9PTFNFVF9ST09UJV8iID09ICJfXyIgKAorICAgIGlmIG5vdCBlcnJvcmxldmVsIDEgKAorICAgICAgICBzZXQgIkJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9JUZPVU5EX1BBVEglLi5cIgorICAgICAgICApICkKK2lmIG5vdCAiXyVCT09TVF9KQU1fVE9PTFNFVF9ST09UJV8iID09ICJfXyIgKAorICAgIHNldCAiUEFUSD0lQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCVCaW47JVBBVEglIgorICAgICkKK3NldCAiQk9PU1RfSkFNX0NDPWJjYzMyIC1XQyAtdy0gLXEgLUklQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCVJbmNsdWRlIC1MJUJPT1NUX0pBTV9UT09MU0VUX1JPT1QlTGliIC9ETlQgLW5ib290c3RyYXAiCitzZXQgIkJPT1NUX0pBTV9PUFRfSkFNPS1lamFtMCIKK3NldCAiQk9PU1RfSkFNX09QVF9NS0pBTUJBU0U9LWVta2phbWJhc2VqYW0wIgorc2V0ICJCT09TVF9KQU1fT1BUX1lZQUNDPS1leXlhY2MwIgorc2V0ICJfa25vd25fPTEiCis6U2tpcF9CT1JMQU5ECitpZiBOT1QgIl8lQk9PU1RfSkFNX1RPT0xTRVQlXyIgPT0gIl9jb21vXyIgZ290byBTa2lwX0NPTU8KK3NldCAiQk9PU1RfSkFNX0NDPWNvbW8gLUROVCIKK3NldCAiQk9PU1RfSkFNX09QVF9KQU09LW8gYm9vdHN0cmFwXGphbTAuZXhlIgorc2V0ICJCT09TVF9KQU1fT1BUX01LSkFNQkFTRT0tbyBib290c3RyYXBcbWtqYW1iYXNlMC5leGUiCitzZXQgIkJPT1NUX0pBTV9PUFRfWVlBQ0M9LW8gYm9vdHN0cmFwXHl5YWNjMC5leGUiCitzZXQgIl9rbm93bl89MSIKKzpTa2lwX0NPTU8KK2lmIE5PVCAiXyVCT09TVF9KQU1fVE9PTFNFVCVfIiA9PSAiX2djY18iIGdvdG8gU2tpcF9HQ0MKK3NldCAiQk9PU1RfSkFNX0NDPWdjYyAtRE5UIgorc2V0ICJCT09TVF9KQU1fT1BUX0pBTT0tbyBib290c3RyYXBcamFtMC5leGUiCitzZXQgIkJPT1NUX0pBTV9PUFRfTUtKQU1CQVNFPS1vIGJvb3RzdHJhcFxta2phbWJhc2UwLmV4ZSIKK3NldCAiQk9PU1RfSkFNX09QVF9ZWUFDQz0tbyBib290c3RyYXBceXlhY2MwLmV4ZSIKK3NldCAiX2tub3duXz0xIgorOlNraXBfR0NDCitpZiBOT1QgIl8lQk9PU1RfSkFNX1RPT0xTRVQlXyIgPT0gIl9nY2Mtbm9jeWd3aW5fIiBnb3RvIFNraXBfR0NDX05PQ1lHV0lOCitzZXQgIkJPT1NUX0pBTV9DQz1nY2MgLUROVCAtbW5vLWN5Z3dpbiIKK3NldCAiQk9PU1RfSkFNX09QVF9KQU09LW8gYm9vdHN0cmFwXGphbTAuZXhlIgorc2V0ICJCT09TVF9KQU1fT1BUX01LSkFNQkFTRT0tbyBib290c3RyYXBcbWtqYW1iYXNlMC5leGUiCitzZXQgIkJPT1NUX0pBTV9PUFRfWVlBQ0M9LW8gYm9vdHN0cmFwXHl5YWNjMC5leGUiCitzZXQgIl9rbm93bl89MSIKKzpTa2lwX0dDQ19OT0NZR1dJTgoraWYgTk9UICJfJUJPT1NUX0pBTV9UT09MU0VUJV8iID09ICJfaW50ZWwtd2luMzJfIiBnb3RvIFNraXBfSU5URUxfV0lOMzIKK3NldCAiQk9PU1RfSkFNX0NDPWljbCAtRE5UIC9ub2xvZ28ga2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiB1c2VyMzIubGliIgorc2V0ICJCT09TVF9KQU1fT1BUX0pBTT0vRmVib290c3RyYXBcamFtMCIKK3NldCAiQk9PU1RfSkFNX09QVF9NS0pBTUJBU0U9L0ZlYm9vdHN0cmFwXG1ramFtYmFzZTAiCitzZXQgIkJPT1NUX0pBTV9PUFRfWVlBQ0M9L0ZlYm9vdHN0cmFwXHl5YWNjMCIKK3NldCAiX2tub3duXz0xIgorOlNraXBfSU5URUxfV0lOMzIKK2lmIE5PVCAiXyVCT09TVF9KQU1fVE9PTFNFVCVfIiA9PSAiX21pbmd3XyIgZ290byBTa2lwX01JTkdXCitpZiBub3QgIl8lQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCVfIiA9PSAiX18iICgKKyAgICBzZXQgIlBBVEg9JUJPT1NUX0pBTV9UT09MU0VUX1JPT1QlYmluOyVQQVRIJSIKKyAgICApCitzZXQgIkJPT1NUX0pBTV9DQz1nY2MgLUROVCIKK3NldCAiQk9PU1RfSkFNX09QVF9KQU09LW8gYm9vdHN0cmFwXGphbTAuZXhlIgorc2V0ICJCT09TVF9KQU1fT1BUX01LSkFNQkFTRT0tbyBib290c3RyYXBcbWtqYW1iYXNlMC5leGUiCitzZXQgIkJPT1NUX0pBTV9PUFRfWVlBQ0M9LW8gYm9vdHN0cmFwXHl5YWNjMC5leGUiCitzZXQgIl9rbm93bl89MSIKKzpTa2lwX01JTkdXCitjYWxsIDpDbGVhcl9FcnJvcgoraWYgIl8lX2tub3duXyVfIiA9PSAiX18iICgKKyAgICBjYWxsIDpFcnJvcl9QcmludCAiVW5rbm93biB0b29sc2V0OiAlQk9PU1RfSkFNX1RPT0xTRVQlIgorKQoraWYgZXJyb3JsZXZlbCAxIGdvdG8gRmluaXNoCisKK2VjaG8gIyMjCitlY2hvICMjIyBVc2luZyAnJUJPT1NUX0pBTV9UT09MU0VUJScgdG9vbHNldC4KK2VjaG8gIyMjCisKK3NldCBZWUFDQ19TT1VSQ0VTPXl5YWNjLmMKK3NldCBNS0pBTUJBU0VfU09VUkNFUz1ta2phbWJhc2UuYworc2V0IEJKQU1fU09VUkNFUz0KK3NldCBCSkFNX1NPVVJDRVM9JUJKQU1fU09VUkNFUyUgY29tbWFuZC5jIGNvbXBpbGUuYyBjb25zdGFudHMuYyBkZWJ1Zy5jCitzZXQgQkpBTV9TT1VSQ0VTPSVCSkFNX1NPVVJDRVMlIGV4ZWNjbWQuYyBleGVjbnQuYyBmaWxlbnQuYyBmcmFtZXMuYyBmdW5jdGlvbi5jCitzZXQgQkpBTV9TT1VSQ0VTPSVCSkFNX1NPVVJDRVMlIGdsb2IuYyBoYXNoLmMgaGRybWFjcm8uYyBoZWFkZXJzLmMgamFtLmMKK3NldCBCSkFNX1NPVVJDRVM9JUJKQU1fU09VUkNFUyUgamFtYmFzZS5jIGphbWdyYW0uYyBsaXN0cy5jIG1ha2UuYyBtYWtlMS5jCitzZXQgQkpBTV9TT1VSQ0VTPSVCSkFNX1NPVVJDRVMlIG9iamVjdC5jIG9wdGlvbi5jIG91dHB1dC5jIHBhcnNlLmMgcGF0aG50LmMKK3NldCBCSkFNX1NPVVJDRVM9JUJKQU1fU09VUkNFUyUgcGF0aHN5cy5jIHJlZ2V4cC5jIHJ1bGVzLmMgc2Nhbi5jIHNlYXJjaC5jCitzZXQgQkpBTV9TT1VSQ0VTPSVCSkFNX1NPVVJDRVMlIHN1YnN0LmMgdGltZXN0YW1wLmMgdmFyaWFibGUuYyBtb2R1bGVzLmMKK3NldCBCSkFNX1NPVVJDRVM9JUJKQU1fU09VUkNFUyUgc3RyaW5ncy5jIGZpbGVzeXMuYyBidWlsdGlucy5jIG1kNS5jIGNsYXNzLmMKK3NldCBCSkFNX1NPVVJDRVM9JUJKQU1fU09VUkNFUyUgY3dkLmMgdzMyX2dldHJlZy5jIG5hdGl2ZS5jIG1vZHVsZXMvc2V0LmMKK3NldCBCSkFNX1NPVVJDRVM9JUJKQU1fU09VUkNFUyUgbW9kdWxlcy9wYXRoLmMgbW9kdWxlcy9yZWdleC5jCitzZXQgQkpBTV9TT1VSQ0VTPSVCSkFNX1NPVVJDRVMlIG1vZHVsZXMvcHJvcGVydHktc2V0LmMgbW9kdWxlcy9zZXF1ZW5jZS5jCitzZXQgQkpBTV9TT1VSQ0VTPSVCSkFNX1NPVVJDRVMlIG1vZHVsZXMvb3JkZXIuYworCitzZXQgQkpBTV9VUERBVEU9Cis6Q2hlY2tfVXBkYXRlCitjYWxsIDpUZXN0X0VtcHR5ICUxCitpZiBub3QgZXJyb3JsZXZlbCAxIGdvdG8gQ2hlY2tfVXBkYXRlX0VuZAorY2FsbCA6Q2xlYXJfRXJyb3IKK3NldGxvY2FsCitzZXQgdGVzdD0lMQorc2V0IHRlc3Q9IyMjJXRlc3QlIyMjCitzZXQgdGVzdD0ldGVzdDoiIyMjPSUKK3NldCB0ZXN0PSV0ZXN0OiMjIyI9JQorc2V0IHRlc3Q9JXRlc3Q6IyMjPSUKK2lmICIldGVzdCUiID09ICItLXVwZGF0ZSIgZ290byBGb3VuZF9VcGRhdGUKK2VuZGxvY2FsCitzaGlmdAoraWYgbm90ICJfJUJKQU1fVVBEQVRFJV8iID09ICJfdXBkYXRlXyIgZ290byBDaGVja19VcGRhdGUKKzpGb3VuZF9VcGRhdGUKK2VuZGxvY2FsCitzZXQgQkpBTV9VUERBVEU9dXBkYXRlCis6Q2hlY2tfVXBkYXRlX0VuZAoraWYgIl8lQkpBTV9VUERBVEUlXyIgPT0gIl91cGRhdGVfIiAoCisgICAgaWYgbm90IGV4aXN0ICIuXGJvb3RzdHJhcFxqYW0wLmV4ZSIgKAorICAgICAgICBzZXQgQkpBTV9VUERBVEU9CisgICAgKQorKQorCitAZWNobyBPTgorQGlmICJfJUJKQU1fVVBEQVRFJV8iID09ICJfdXBkYXRlXyIgZ290byBTa2lwX0Jvb3RzdHJhcAoraWYgZXhpc3QgYm9vdHN0cmFwIHJkIC9TIC9RIGJvb3RzdHJhcAorbWQgYm9vdHN0cmFwCitAaWYgbm90IGV4aXN0IGphbWdyYW0ueSBnb3RvIEJvb3RzdHJhcF9HcmFtbWFyUHJlcAorQGlmIG5vdCBleGlzdCBqYW1ncmFtdGFiLmggZ290byBCb290c3RyYXBfR3JhbW1hclByZXAKK0Bnb3RvIFNraXBfR3JhbW1hclByZXAKKzpCb290c3RyYXBfR3JhbW1hclByZXAKKyVCT09TVF9KQU1fQ0MlICVCT09TVF9KQU1fT1BUX1lZQUNDJSAlWVlBQ0NfU09VUkNFUyUKK0BpZiBub3QgZXhpc3QgIi5cYm9vdHN0cmFwXHl5YWNjMC5leGUiIGdvdG8gU2tpcF9HcmFtbWFyUHJlcAorLlxib290c3RyYXBceXlhY2MwIGphbWdyYW0ueSBqYW1ncmFtdGFiLmggamFtZ3JhbS55eQorOlNraXBfR3JhbW1hclByZXAKK0BpZiBub3QgZXhpc3QgamFtZ3JhbS5jIGdvdG8gQm9vdHN0cmFwX0dyYW1tYXJCdWlsZAorQGlmIG5vdCBleGlzdCBqYW1ncmFtLmggZ290byBCb290c3RyYXBfR3JhbW1hckJ1aWxkCitAZ290byBTa2lwX0dyYW1tYXJCdWlsZAorOkJvb3RzdHJhcF9HcmFtbWFyQnVpbGQKK0BlY2hvIE9GRgoraWYgIl8lWUFDQyVfIiA9PSAiX18iICgKKyAgICBjYWxsIDpHdWVzc19ZYWNjCispCitpZiBlcnJvcmxldmVsIDEgZ290byBGaW5pc2gKK0BlY2hvIE9OCislWUFDQyUgamFtZ3JhbS55CitAaWYgZXJyb3JsZXZlbCAxIGdvdG8gRmluaXNoCitkZWwgL2YgamFtZ3JhbS5jCityZW5hbWUgeS50YWIuYyBqYW1ncmFtLmMKK2RlbCAvZiBqYW1ncmFtLmgKK3JlbmFtZSB5LnRhYi5oIGphbWdyYW0uaAorOlNraXBfR3JhbW1hckJ1aWxkCitAZWNobyBPTgorQGlmIGV4aXN0IGphbWJhc2UuYyBnb3RvIFNraXBfSmFtYmFzZQorJUJPT1NUX0pBTV9DQyUgJUJPT1NUX0pBTV9PUFRfTUtKQU1CQVNFJSAlTUtKQU1CQVNFX1NPVVJDRVMlCitAaWYgbm90IGV4aXN0ICIuXGJvb3RzdHJhcFxta2phbWJhc2UwLmV4ZSIgZ290byBTa2lwX0phbWJhc2UKKy5cYm9vdHN0cmFwXG1ramFtYmFzZTAgamFtYmFzZS5jIEphbWJhc2UKKzpTa2lwX0phbWJhc2UKKyVCT09TVF9KQU1fQ0MlICVCT09TVF9KQU1fT1BUX0pBTSUgJUJKQU1fU09VUkNFUyUKKzpTa2lwX0Jvb3RzdHJhcAorQGlmIG5vdCBleGlzdCAiLlxib290c3RyYXBcamFtMC5leGUiIGdvdG8gU2tpcF9KYW0KK0BzZXQgYXJncz0lKgorQGVjaG8gT0ZGCis6U2V0X0FyZ3MKK3NldGxvY2FsCitjYWxsIDpUZXN0X0VtcHR5ICVhcmdzJQoraWYgbm90IGVycm9ybGV2ZWwgMSBnb3RvIFNldF9BcmdzX0VuZAorc2V0IHRlc3Q9IyMjJWFyZ3M6fjAsMiUjIyMKK3NldCB0ZXN0PSV0ZXN0OiIjIyM9JQorc2V0IHRlc3Q9JXRlc3Q6IyMjIj0lCitzZXQgdGVzdD0ldGVzdDojIyM9JQorc2V0IHRlc3Q9JXRlc3Q6fjAsMSUKK2lmICItIiA9PSAiJXRlc3QlIiBnb3RvIFNldF9BcmdzX0VuZAorZW5kbG9jYWwKK3NldCBhcmdzPSVhcmdzOn4xJQorZ290byBTZXRfQXJncworOlNldF9BcmdzX0VuZAorQGVjaG8gT04KK0BpZiAiXyVCSkFNX1VQREFURSVfIiA9PSAiX3VwZGF0ZV8iIGdvdG8gU2tpcF9DbGVhbgorLlxib290c3RyYXBcamFtMCAtZiBidWlsZC5qYW0gLS10b29sc2V0PSVCT09TVF9KQU1fVE9PTFNFVCUgIi0tdG9vbHNldC1yb290PSVCT09TVF9KQU1fVE9PTFNFVF9ST09UJSAiICVhcmdzJSBjbGVhbgorOlNraXBfQ2xlYW4KKy5cYm9vdHN0cmFwXGphbTAgLWYgYnVpbGQuamFtIC0tdG9vbHNldD0lQk9PU1RfSkFNX1RPT0xTRVQlICItLXRvb2xzZXQtcm9vdD0lQk9PU1RfSkFNX1RPT0xTRVRfUk9PVCUgIiAlYXJncyUKKzpTa2lwX0phbQorCis6RmluaXNoCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9idWlsZC5qYW0gYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9idWlsZC5qYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzZDk1MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2J1aWxkLmphbQpAQCAtMCwwICsxLDEwMjIgQEAKKyN+IENvcHlyaWdodCAyMDAyLTIwMDcgUmVuZSBSaXZlcmEuCisjfiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjfiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjfiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgQ2xlYW4gZW52IHZhcnMgb2YgYW55ICJleHRyYSIgZW1wdHkgdmFsdWVzLgorZm9yIGxvY2FsIHYgaW4gQVJHViBDQyBDRkxBR1MgTElCUworeworICAgIGxvY2FsIHZhbHVlcyA7CisgICAgZm9yIGxvY2FsIHggaW4gJCgkKHYpKQorICAgIHsKKyAgICAgICAgaWYgJCh4KSAhPSAiIgorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZXMgKz0gJCh4KSA7CisgICAgICAgIH0KKyAgICB9CisgICAgJCh2KSA9ICQodmFsdWVzKSA7Cit9CisKKyMgUGxhdGZvcm0gcmVsYXRlZCBzcGVjaWZpY3MuCitpZiAkKE9TKSA9IE5UIHsgcnVsZSAucGF0aCB7IHJldHVybiAiJCg8Oko9XFwpIiA7IH0gLi8gPSAiLyIgOyB9CitlbHNlIHsgcnVsZSAucGF0aCB7IHJldHVybiAiJCg8Oko9LykiIDsgfSB9CisKKy4gPSAiLiIgOworLi8gPz0gIiIgOworCisjIEluZm8gYWJvdXQgd2hhdCB3ZSBhcmUgYnVpbGRpbmcuCitfVkVSU0lPTl8gPSAzIDEgMTkgOworTkFNRSA9IGJvb3N0LWphbSA7CitWRVJTSU9OID0gJChfVkVSU0lPTl86Sj0kKC4pKSA7CitSRUxFQVNFID0gMSA7CitMSUNFTlNFID0gTElDRU5TRV8xXzAgOworCisjIEdlbmVyYXRlIGRldmVsb3BtZW50IGRlYnVnIGJpbmFyaWVzPworaWYgLS1kZWJ1ZyBpbiAkKEFSR1YpCit7CisgICAgZGVidWcgPSB0cnVlIDsKK30KKworaWYgLS1wcm9maWxlIGluICQoQVJHVikKK3sKKyAgICBwcm9maWxlID0gdHJ1ZSA7Cit9CisKKyMgQXR0ZW1wdCB0byBnZW5lcmF0ZSBhbmQvb3IgYnVpbGQgdGhlIGdyYW1tYXI/CitpZiAtLWdyYW1tYXIgaW4gJChBUkdWKQoreworICAgIGdyYW1tYXIgPSB0cnVlIDsKK30KKworIyBEbyB3ZSBuZWVkIHRvIGFkZCBhIGRlZmF1bHQgYnVpbGQgdHlwZSBhcmd1bWVudD8KK2lmICEgKCAtLXJlbGVhc2UgaW4gJChBUkdWKSApICYmCisgICAhICggLS1kZWJ1ZyBpbiAkKEFSR1YpICkgJiYKKyAgICEgKCAtLXByb2ZpbGUgaW4gJChBUkdWKSApCit7CisgICAgQVJHViArPSAtLXJlbGVhc2UgOworfQorCisjIEVuYWJsZSwgYW5kIGNvbmZpZ3VyZSwgUHl0aG9uIGhvb2tzLgord2l0aC1weXRob24gPSA7CitweXRob24tbG9jYXRpb24gPSBbIE1BVENIIC0td2l0aC1weXRob249KC4qKSA6ICQoQVJHVikgXSA7CitpZiAkKHB5dGhvbi1sb2NhdGlvbikKK3sKKyAgICB3aXRoLXB5dGhvbiA9IHRydWUgOworfQoraWYgJCh3aXRoLXB5dGhvbikKK3sKKyAgICBpZiAkKE9TKSA9IE5UCisgICAgeworICAgICAgICAtLXB5dGhvbi1pbmNsdWRlID0gWyAucGF0aCAkKHB5dGhvbi1sb2NhdGlvbikgaW5jbHVkZSBdIDsKKyAgICAgICAgLS1weXRob24tbGliID0gOworICAgICAgICBmb3IgbG9jYWwgdiBpbiAyNyAyNiAyNSAyNCAyMyAyMgorICAgICAgICB7CisgICAgICAgICAgICAtLXB5dGhvbi1saWIgPz0KKyAgICAgICAgICAgICAgICBbIEdMT0IgWyAucGF0aCAkKHB5dGhvbi1sb2NhdGlvbikgbGlicyBdIDogInB5dGhvbiQodikubGliIiBdCisgICAgICAgICAgICAgICAgWyBHTE9CICQocHl0aG9uLWxvY2F0aW9uKSBbIC5wYXRoICQocHl0aG9uLWxvY2F0aW9uKSBsaWJzIF0KKyAgICAgICAgICAgICAgICAgICAgJChQYXRoKSAkKFBBVEgpICQocGF0aCkgOiAicHl0aG9uJCh2KS5kbGwiIF0KKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBpZiAhICQoLS1weXRob24tbGliWzJdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC0tcHl0aG9uLWxpYiA9IDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAtLXB5dGhvbi1saWIgPSAkKC0tcHl0aG9uLWxpYlsxXSkgOworICAgIH0KKyAgICBlbHNlIGlmICQoT1MpID0gTUFDT1NYCisgICAgeworICAgICAgICAtLXB5dGhvbi1pbmNsdWRlID0gWyAucGF0aCAkKHB5dGhvbi1sb2NhdGlvbikgSGVhZGVycyBdIDsKKyAgICAgICAgLS1weXRob24tbGliID0gJChweXRob24tbG9jYXRpb24pIFB5dGhvbiA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC0tcHl0aG9uLWluY2x1ZGUgPSA7CisgICAgICAgIC0tcHl0aG9uLWxpYiA9IDsKKyAgICAgICAgZm9yIGxvY2FsIHYgaW4gMi43IDIuNiAyLjUgMi40IDIuMyAyLjIKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgaW5jID0gWyBHTE9CIFsgLnBhdGggJChweXRob24tbG9jYXRpb24pIGluY2x1ZGUgXSA6IHB5dGhvbiQodikgXSA7CisgICAgICAgICAgICBsb2NhbCBsaWIgPSBbIEdMT0IgWyAucGF0aCAkKHB5dGhvbi1sb2NhdGlvbikgbGliIF0gOiBsaWJweXRob24kKHYpKiBdIDsKKyAgICAgICAgICAgIGlmICQoaW5jKSAmJiAkKGxpYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAtLXB5dGhvbi1pbmNsdWRlID89ICQoaW5jKSA7CisgICAgICAgICAgICAgICAgLS1weXRob24tbGliID89ICQobGliWzFdOkQpIHB5dGhvbiQodikgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjIEJvZWhtIEdDPworaWYgLS1nYyBpbiAkKEFSR1YpCit7CisgICAgLS1ib2VobS1nYyA9IHRydWUgOworfQoraWYgJCgtLWJvZWhtLWdjKQoreworICAgIC0tZXh0cmEtaW5jbHVkZSArPSBbIC5wYXRoIFsgUFdEIF0gImJvZWhtX2djIiAiaW5jbHVkZSIgXSA7Cit9CisKKyMgRHVtYT8KK2lmIC0tZHVtYSBpbiAkKEFSR1YpCit7CisgICAgLS1kdW1hID0gdHJ1ZSA7Cit9CitpZiAkKC0tZHVtYSkKK3sKKyAgICAtLWV4dHJhLWluY2x1ZGUgKz0gWyAucGF0aCBbIFBXRCBdICJkdW1hIiBdIDsKK30KKworIyBBbiBleHBsaWNpdCByb290IGZvciB0aGUgdG9vbHNldD8gKHRyaW0gc3BhY2VzKQordG9vbHNldC1yb290ID0gWyBNQVRDSCAtLXRvb2xzZXQtcm9vdD0oLiopIDogJChBUkdWKSBdIDsKK3sKKyAgICBsb2NhbCB0ID0gWyBNQVRDSCAiWyBdKiguKikiIDogJCh0b29sc2V0LXJvb3Q6Sj0iICIpIF0gOworICAgIHRvb2xzZXQtcm9vdCA9IDsKKyAgICB3aGlsZSAkKHQpCisgICAgeworICAgICAgICB0ID0gWyBNQVRDSCAiKFteIF0rKShbIF0qKSguKikiIDogJCh0KSBdIDsKKyAgICAgICAgdG9vbHNldC1yb290ICs9ICQodFsxXSkgOworICAgICAgICBpZiAkKHRbM10pIHsgdG9vbHNldC1yb290ICs9ICQodFsyXSkgOyB9CisgICAgICAgIHQgPSAkKHRbM10pIDsKKyAgICB9CisgICAgdG9vbHNldC1yb290ID0gJCh0b29sc2V0LXJvb3Q6Sj0iIikgOworfQorCisjIENvbmZpZ3VyZSB0aGUgaW1wbGVtZW50ZWQgdG9vbHNldHMuIFRoZXNlIGFyZSBtaW5pbWFsIGNvbW1hbmRzIGFuZCBvcHRpb25zIHRvCisjIGNvbXBpbGUgdGhlIGZ1bGwgSmFtLiBXaGVuIGFkZGluZyBuZXcgdG9vbHNldHMgbWFrZSBzdXJlIHRvIGFkZCB0aGVtIHRvIHRoZQorIyAia25vd24iIGxpc3QgYWxzby4KKworcnVsZSB0b29sc2V0ICggbmFtZSBjb21tYW5kIC50eXBlID8gOiBvcHQub3V0ICsgOiBvcHQuZGVmaW5lICogOiBmbGFncyAqIDogbGlua2xpYnMgKiApCit7CisgICAgLnR5cGUgPz0gIiIgOworICAgIHRvb2wuJChuYW1lKSQoLnR5cGUpLmNjID89ICQoY29tbWFuZCkgOworICAgIHRvb2wuJChuYW1lKSQoLnR5cGUpLm9wdC5vdXQgPz0gJChvcHQub3V0KSA7CisgICAgdG9vbC4kKG5hbWUpJCgudHlwZSkub3B0LmRlZmluZSA/PSAkKG9wdC5kZWZpbmUpIDsKKyAgICB0b29sLiQobmFtZSkkKC50eXBlKS5mbGFncyA/PSAkKGZsYWdzKSA7CisgICAgdG9vbC4kKG5hbWUpJCgudHlwZSkubGlua2xpYnMgPz0gJChsaW5rbGlicykgOworICAgIGlmICEgJChuYW1lKSBpbiAkKHRvb2xzZXRzKSB7IHRvb2xzZXRzICs9ICQobmFtZSkgOyB9Cit9CisKK3J1bGUgaWYtb3MgKCBvcyArIDogeWVzLW9wdCAqIDogbm8tb3B0ICogKQorICAgIHsgaWYgJChvcykgaW4gJChPUykgeyByZXR1cm4gJCh5ZXMtb3B0KSA7IH0gZWxzZSB7IHJldHVybiAkKG5vLW9wdCkgOyB9IH0KKworcnVsZSBvcHQgKCB0eXBlIDogeWVzLW9wdCAqIDogbm8tb3B0ICogKQorICAgIHsgaWYgJCh0eXBlKSBpbiAkKEFSR1YpIHsgcmV0dXJuICQoeWVzLW9wdCkgOyB9IGVsc2UgeyByZXR1cm4gJChuby1vcHQpIDsgfSB9CisKKyMjIEhQLVVYIGFDQyBjb21waWxlcgordG9vbHNldCBhY2MgY2MgOiAiLW8gIiA6IC1ECisgICAgOiAtQWUKKyAgICBbIG9wdCAtLXJlbGVhc2UgOiAtcyAtTzMgXQorICAgIFsgb3B0IC0tZGVidWcgOiAtZyAtcGcgXQorICAgIC1JJCgtLXB5dGhvbi1pbmNsdWRlKSAtSSQoLS1leHRyYS1pbmNsdWRlKQorICAgIDogLUwkKC0tcHl0aG9uLWxpYlsxXSkgLWwkKC0tcHl0aG9uLWxpYlsyXSkgOworIyMgQm9ybGFuZCBDKysgNS41LngKK3Rvb2xzZXQgYm9ybGFuZCBiY2MzMiA6IC1lIC1uIDogL0QKKyAgICA6IC1XQyAtdy0gLXEgIi1JJCh0b29sc2V0LXJvb3QpSW5jbHVkZSIgIi1MJCh0b29sc2V0LXJvb3QpTGliIgorICAgIFsgb3B0IC0tcmVsZWFzZSA6IC1PMiAtdmkgLXctaW5sIF0KKyAgICBbIG9wdCAtLWRlYnVnIDogLXYgLU9kIC12aS0gXQorICAgIC1JJCgtLXB5dGhvbi1pbmNsdWRlKSAtSSQoLS1leHRyYS1pbmNsdWRlKQorICAgIDogJCgtLXB5dGhvbi1saWJbMV0pIDsKKyMjIEdlbmVyaWMgVW5peCBjYworaWYgISAkKENDKSB7IENDID0gY2MgOyB9Cit0b29sc2V0IGNjICQoQ0MpIDogIi1vICIgOiAtRAorICAgIDogJChDRkxBR1MpCisgICAgWyBvcHQgLS1yZWxlYXNlIDogLXMgLU8gXQorICAgIFsgb3B0IC0tZGVidWcgOiAtZyBdCisgICAgLUkkKC0tcHl0aG9uLWluY2x1ZGUpIC1JJCgtLWV4dHJhLWluY2x1ZGUpCisgICAgOiAkKExJQlMpIC1MJCgtLXB5dGhvbi1saWJbMV0pIC1sJCgtLXB5dGhvbi1saWJbMl0pIDsKKyMjIENvbWVhdSBDL0MrKyA0LngKK3Rvb2xzZXQgY29tbyBjb21vIDogIi1vICIgOiAtRAorICAgIDogLS1jCisgICAgWyBvcHQgLS1yZWxlYXNlIDogLS1pbmxpbmluZyBdCisgICAgWyBvcHQgLS1kZWJ1ZyA6IC0tbm9faW5saW5pbmcgXQorICAgIC1JJCgtLXB5dGhvbi1pbmNsdWRlKSAtSSQoLS1leHRyYS1pbmNsdWRlKQorICAgIDogLUwkKC0tcHl0aG9uLWxpYlsxXSkgLWwkKC0tcHl0aG9uLWxpYlsyXSkgOworIyMgQ2xhbmcgTGludXggMi44KwordG9vbHNldCBjbGFuZyBjbGFuZyA6ICAiLW8gIiA6IC1ECisgICAgOiAtV25vLXVudXNlZCAtV25vLWZvcm1hdAorICAgIFsgb3B0IC0tcmVsZWFzZSA6IC1PcyBdCisgICAgWyBvcHQgLS1kZWJ1ZyA6IC1nIC1PMCAtZm5vLWlubGluZSBdCisgICAgWyBvcHQgLS1wcm9maWxlIDogLWZpbmxpbmUtZnVuY3Rpb25zIC1nIF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkKKyAgICA6IC1MJCgtLXB5dGhvbi1saWJbMV0pIC1sJCgtLXB5dGhvbi1saWJbMl0pIDsKKyMjIE1hY09TWCBEYXJ3aW4sIHVzaW5nIEdDQyAyLjkueCwgMy54Cit0b29sc2V0IGRhcndpbiBjYyA6ICAiLW8gIiA6IC1ECisgICAgOgorICAgIFsgb3B0IC0tcmVsZWFzZSA6IC1XbCwteCAtTzMgLWZpbmxpbmUtZnVuY3Rpb25zIF0KKyAgICBbIG9wdCAtLWRlYnVnIDogLWcgLU8wIC1mbm8taW5saW5lIC1wZyBdCisgICAgWyBvcHQgLS1wcm9maWxlIDogLVdsLC14IC1PMyAtZmlubGluZS1mdW5jdGlvbnMgLWcgLXBnIF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkKKyAgICA6IC1MJCgtLXB5dGhvbi1saWJbMV0pIC1sJCgtLXB5dGhvbi1saWJbMl0pIDsKKyMjIEdDQyAyLngsIDMueCwgNC54Cit0b29sc2V0IGdjYyBnY2MgOiAiLW8gIiA6IC1ECisgICAgOiAtcGVkYW50aWMgLWZuby1zdHJpY3QtYWxpYXNpbmcKKyAgICBbIG9wdCAtLXJlbGVhc2UgOiBbIG9wdCAtLXN5bWJvbHMgOiAtZyA6IC1zIF0gLU8zIF0KKyAgICBbIG9wdCAtLWRlYnVnIDogLWcgLU8wIC1mbm8taW5saW5lIF0KKyAgICBbIG9wdCAtLXByb2ZpbGUgOiAtTzMgLWcgLXBnIF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkgLVduby1sb25nLWxvbmcKKyAgICA6IC1MJCgtLXB5dGhvbi1saWJbMV0pIC1sJCgtLXB5dGhvbi1saWJbMl0pIDsKKyMjIEdDQyAyLngsIDMueCBvbiBDWUdXSU4gYnV0IHdpdGhvdXQgY3lnd2luMS5kbGwKK3Rvb2xzZXQgZ2NjLW5vY3lnd2luIGdjYyA6ICItbyAiIDogLUQKKyAgICA6IC1zIC1PMyAtbW5vLWN5Z3dpbgorICAgIFsgb3B0IC0tcmVsZWFzZSA6IC1maW5saW5lLWZ1bmN0aW9ucyBdCisgICAgWyBvcHQgLS1kZWJ1ZyA6IC1zIC1PMyAtZm5vLWlubGluZSAtcGcgXQorICAgIC1JJCgtLXB5dGhvbi1pbmNsdWRlKSAtSSQoLS1leHRyYS1pbmNsdWRlKQorICAgIDogLUwkKC0tcHl0aG9uLWxpYlsxXSkgLWwkKC0tcHl0aG9uLWxpYlsyXSkgOworIyMgSW50ZWwgQy9DKysgZm9yIERhcndpbgordG9vbHNldCBpbnRlbC1kYXJ3aW4gaWNjIDogIi1vICIgOiAtRAorICAgIDoKKyAgICBbIG9wdCAtLXJlbGVhc2UgOiAtTzMgXQorICAgIFsgb3B0IC0tZGVidWcgOiAtZyAtTzAgLXAgXQorICAgIC1JJCgtLXB5dGhvbi1pbmNsdWRlKSAtSSQoLS1leHRyYS1pbmNsdWRlKQorICAgIDogLUwkKC0tcHl0aG9uLWxpYlsxXSkgLWwkKC0tcHl0aG9uLWxpYlsyXSkgOworIyMgSW50ZWwgQy9DKysgZm9yIExpbnV4Cit0b29sc2V0IGludGVsLWxpbnV4IGljYyA6ICItbyAiIDogLUQKKyAgICA6CisgICAgWyBvcHQgLS1yZWxlYXNlIDogLVhsaW5rZXIgLXMgLU8zIF0KKyAgICBbIG9wdCAtLWRlYnVnIDogLWcgLU8wIC1wIF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkKKyAgICA6IC1MJCgtLXB5dGhvbi1saWJbMV0pIC1sJCgtLXB5dGhvbi1saWJbMl0pIDsKKyMjIEludGVsIEMvQysrIGZvciBXaW4zMgordG9vbHNldCBpbnRlbC13aW4zMiBpY2wgOiAvRmUgOiAtRAorICAgIDogL25vbG9nbworICAgIFsgb3B0IC0tcmVsZWFzZSA6IC9NVCAvTzIgL09iMiAvR3kgL0dGIC9HQSAvR0IgXQorICAgIFsgb3B0IC0tZGVidWcgOiAvTVRkIC9ERUJVRyAvWjcgL09kIC9PYjAgXQorICAgIC1JJCgtLXB5dGhvbi1pbmNsdWRlKSAtSSQoLS1leHRyYS1pbmNsdWRlKQorICAgIDoga2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiB1c2VyMzIubGliICQoLS1weXRob24tbGliWzFdKSA7CisjIyBLQ0MgPwordG9vbHNldCBrY2MgS0NDIDogIi1vICIgOiAtRAorICAgIDoKKyAgICBbIG9wdCAtLXJlbGVhc2UgOiAtcyArSzIgXQorICAgIFsgb3B0IC0tZGVidWcgOiAtZyArSzAgXQorICAgIC1JJCgtLXB5dGhvbi1pbmNsdWRlKSAtSSQoLS1leHRyYS1pbmNsdWRlKQorICAgIDogLUwkKC0tcHl0aG9uLWxpYlsxXSkgLWwkKC0tcHl0aG9uLWxpYlsyXSkgOworIyMgQm9ybGFuZCBLeWxpeAordG9vbHNldCBreWxpeCBiYysrIDogLW8gOiAtRAorICAgIDogLXRDIC1xCisgICAgWyBvcHQgLS1yZWxlYXNlIDogLU8yIC12aSAtdy1pbmwgXQorICAgIFsgb3B0IC0tZGVidWcgOiAtdiAtT2QgLXZpLSBdCisgICAgLUkkKC0tcHl0aG9uLWluY2x1ZGUpIC1JJCgtLWV4dHJhLWluY2x1ZGUpCisgICAgOiAtTCQoLS1weXRob24tbGliWzFdKSAtbCQoLS1weXRob24tbGliWzJdKSA7CisjIyBNZXRyb3dlcmtzIENvZGVXYXJyaW9yIDgueAoreworICAgICMgRXZlbiB0aG91Z2ggQ1cgY2FuIGNvbXBpbGUgYWxsIGZpbGVzIGF0IG9uY2UsIGl0IGNyYXNoZXMgaWYgaXQgdHJpZXMgaW4KKyAgICAjIHRoZSBiamFtIGNhc2UuCisgICAgbG9jYWwgbXdjYyA7IGlmICQoT1MpICE9IE5UIHsgbXdjYyA9IG13YyQoT1NQTEFUOkwpIDsgfQorICAgIG13Y2MgPz0gbXdjYyA7CisgICAgdG9vbHNldCBtZXRyb3dlcmtzICQobXdjYykgOiAiLW8gIiA6IC1ECisgICAgICAgIDogLWMgLWxhbmcgYyAtc3Vic3lzdGVtIGNvbnNvbGUgLWN3ZCBpbmNsdWRlCisgICAgICAgIFsgb3B0IC0tcmVsZWFzZSA6IC1ydW50aW1lIHNzIC1vcHQgZnVsbCAtaW5saW5lIGFsbCBdCisgICAgICAgIFsgb3B0IC0tZGVidWcgOiAtcnVudGltZSBzc2QgLW9wdCBub25lIC1pbmxpbmUgb2ZmIF0KKyAgICAgICAgLUkkKC0tcHl0aG9uLWluY2x1ZGUpIC1JJCgtLWV4dHJhLWluY2x1ZGUpIDsKKyAgICB0b29sc2V0IG1ldHJvd2Vya3MgJChtd2NjKSAubGluayA6ICItbyAiIDoKKyAgICAgICAgOiAtc3Vic3lzdGVtIGNvbnNvbGUgLWxrZXJuZWwzMi5saWIgLWxhZHZhcGkzMi5saWIgLWx1c2VyMzIubGliCisgICAgICAgIFsgb3B0IC0tcmVsZWFzZSA6IC1ydW50aW1lIHNzIF0KKyAgICAgICAgWyBvcHQgLS1kZWJ1ZyA6IC1ydW50aW1lIHNzZCBdCisgICAgICAgIDogJCgtLXB5dGhvbi1saWJbMV0pIDsKK30KKyMjIE1JTkdXIEdDQwordG9vbHNldCBtaW5ndyBnY2MgOiAiLW8gIiA6IC1ECisgICAgOgorICAgIFsgb3B0IC0tcmVsZWFzZSA6IC1zIC1PMyAtZmlubGluZS1mdW5jdGlvbnMgXQorICAgIFsgb3B0IC0tZGVidWcgOiAtZyAtTzAgLWZuby1pbmxpbmUgLXBnIF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkKKyAgICA6ICQoLS1weXRob24tbGliWzJdKSA7CisjIyBNSVBTIFBybwordG9vbHNldCBtaXBzcHJvIGNjIDogIi1vICIgOiAtRAorICAgIDoKKyAgICBbIG9wdCAtLXJlbGVhc2UgOiAtcyAtTzMgLWcwIC1JTkxJTkU6bm9uZSBdCisgICAgWyBvcHQgLS1kZWJ1ZyA6IC1nIC1PMCAtSU5MSU5FIF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkKKyAgICA6IC1MJCgtLXB5dGhvbi1saWJbMV0pIC1sJCgtLXB5dGhvbi1saWJbMl0pIDsKKyMjIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIEMrKyA2LngKK3Rvb2xzZXQgbXN2YyBjbCA6IC9GZSAvRmUgL0ZkIC9GbyA6IC1ECisgICAgOiAvbm9sb2dvCisgICAgWyBvcHQgLS1yZWxlYXNlIDogL01MIC9PMiAvT2IyIC9HeSAvR0YgL0dBIC9HQiBdCisgICAgWyBvcHQgLS1kZWJ1ZyA6IC9NTGQgL0RFQlVHIC9aNyAvT2QgL09iMCBdCisgICAgLUkkKC0tcHl0aG9uLWluY2x1ZGUpIC1JJCgtLWV4dHJhLWluY2x1ZGUpCisgICAgOiBrZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHVzZXIzMi5saWIgJCgtLXB5dGhvbi1saWJbMV0pIDsKKyMjIFFOWCA2LnggR0NDIDMueC8yLjk1LjMKK3Rvb2xzZXQgcWNjIHFjYyA6ICItbyAiIDogLUQKKyAgICA6IC1XYywtcGVkYW50aWMgLVdjLC1mbm8tc3RyaWN0LWFsaWFzaW5nCisgICAgWyBvcHQgLS1yZWxlYXNlIDogWyBvcHQgLS1zeW1ib2xzIDogLWcgXSAtTzMgLVdjLC1maW5saW5lLWZ1bmN0aW9ucyBdCisgICAgWyBvcHQgLS1kZWJ1ZyA6IC1nIC1PMCAtV2MsLWZuby1pbmxpbmUgXQorICAgIC1JJCgtLXB5dGhvbi1pbmNsdWRlKSAtSSQoLS1leHRyYS1pbmNsdWRlKQorICAgIDogLUwkKC0tcHl0aG9uLWxpYlsxXSkgLWwkKC0tcHl0aG9uLWxpYlsyXSkgOworIyMgUWxvZ2ljIFBhdGhzY2FsZSAyLjQKK3Rvb2xzZXQgcGF0aHNjYWxlIHBhdGhjYyA6ICItbyAiIDogLUQKKyAgICA6CisgICAgWyBvcHQgLS1yZWxlYXNlIDogLXMgLU9mYXN0IC1PMyBdCisgICAgWyBvcHQgLS1kZWJ1ZyA6IC1nIF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkKKyAgICA6IC1MJCgtLXB5dGhvbi1saWJbMV0pIC1sJCgtLXB5dGhvbi1saWJbMl0pIDsKKyMjIFBvcnRsYW5kIEdyb3VwIFBnaSA2LjIKK3Rvb2xzZXQgcGdpIHBnY2MgOiAiLW8gIiA6IC1ECisgICAgOgorICAgIFsgb3B0IC0tcmVsZWFzZSA6IC1zIC1PMyBdCisgICAgWyBvcHQgLS1kZWJ1ZyA6IC1nIF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkKKyAgICA6IC1MJCgtLXB5dGhvbi1saWJbMV0pIC1sJCgtLXB5dGhvbi1saWJbMl0pIDsKKyMjIFN1biBXb3Jrc2hvcCA2IEMrKwordG9vbHNldCBzdW4gY2MgOiAiLW8gIiA6IC1ECisgICAgOgorICAgIFsgb3B0IC0tcmVsZWFzZSA6IC1zIC14TzMgXQorICAgIFsgb3B0IC0tZGVidWcgOiAtZyBdCisgICAgLUkkKC0tcHl0aG9uLWluY2x1ZGUpIC1JJCgtLWV4dHJhLWluY2x1ZGUpCisgICAgOiAtTCQoLS1weXRob24tbGliWzFdKSAtbCQoLS1weXRob24tbGliWzJdKSA7CisjIyBTdW4gV29ya3Nob3AgNiBDKysgKG9sZCBhbGlhcykKK3Rvb2xzZXQgc3VucHJvIGNjIDogIi1vICIgOiAtRAorICAgIDoKKyAgICBbIG9wdCAtLXJlbGVhc2UgOiAtcyAteE8zIF0KKyAgICBbIG9wdCAtLWRlYnVnIDogLWcgXQorICAgIC1JJCgtLXB5dGhvbi1pbmNsdWRlKSAtSSQoLS1leHRyYS1pbmNsdWRlKQorICAgIDogLUwkKC0tcHl0aG9uLWxpYlsxXSkgLWwkKC0tcHl0aG9uLWxpYlsyXSkgOworIyMgQ29tcGFxIEFscGhhIENYWAordG9vbHNldCB0cnU2NGN4eCBjYyA6ICItbyAiIDogLUQKKyAgICA6CisgICAgWyBvcHQgLS1yZWxlYXNlIDogLXMgLU81IC1pbmxpbmUgc3BlZWQgXQorICAgIFsgb3B0IC0tZGVidWcgOiAtZyAtTzAgLXBnIF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkKKyAgICA6IC1MJCgtLXB5dGhvbi1saWJbMV0pIC1sJCgtLXB5dGhvbi1saWJbMl0pIDsKKyMjIElCTSBWaXN1YWxBZ2UgQysrCit0b29sc2V0IHZhY3BwIHhsYyA6ICItbyAiIDogLUQKKyAgICA6CisgICAgWyBvcHQgLS1yZWxlYXNlIDogLXMgLU8zIC1xc3RyaWN0IC1xaW5saW5lIF0KKyAgICBbIG9wdCAtLWRlYnVnIDogLWcgLXFOT09QVGltaXplIC1xbm9pbmxpbmUgLXBnIF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkKKyAgICA6IC1MJCgtLXB5dGhvbi1saWJbMV0pIC1sJCgtLXB5dGhvbi1saWJbMl0pIFsgaWYtb3MgQUlYIDogLWJtYXhkYXRhOjB4NDAwMDAwMDAgXSA7CisjIyBNaWNyb3NvZnQgVmlzdWFsIEMrKyAuTkVUIDcueAordG9vbHNldCB2YzcgY2wgOiAvRmUgL0ZlIC9GZCAvRm8gOiAtRAorICAgIDogL25vbG9nbworICAgIFsgb3B0IC0tcmVsZWFzZSA6IC9NTCAvTzIgL09iMiAvR3kgL0dGIC9HQSAvR0IgXQorICAgIFsgb3B0IC0tZGVidWcgOiAvTUxkIC9ERUJVRyAvWjcgL09kIC9PYjAgXQorICAgIC1JJCgtLXB5dGhvbi1pbmNsdWRlKSAtSSQoLS1leHRyYS1pbmNsdWRlKQorICAgIDoga2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiB1c2VyMzIubGliICQoLS1weXRob24tbGliWzFdKSA7CisjIyBNaWNyb3NvZnQgVmlzdWFsIEMrKyAyMDA1Cit0b29sc2V0IHZjOCBjbCA6IC9GZSAvRmUgL0ZkIC9GbyA6IC1ECisgICAgOiAvbm9sb2dvCisgICAgWyBvcHQgLS1yZWxlYXNlIDogL01UIC9PMiAvT2IyIC9HeSAvR0YgL0dBIC93ZDQ5OTYgXQorICAgIFsgb3B0IC0tZGVidWcgOiAvTVRkIC9ERUJVRyAvWjcgL09kIC9PYjAgL3dkNDk5NiBdCisgICAgLUkkKC0tcHl0aG9uLWluY2x1ZGUpIC1JJCgtLWV4dHJhLWluY2x1ZGUpCisgICAgOiBrZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHVzZXIzMi5saWIgJCgtLXB5dGhvbi1saWJbMV0pIDsKKyMjIE1pY3Jvc29mdCBWaXN1YWwgQysrIDIwMDgKK3Rvb2xzZXQgdmM5IGNsIDogL0ZlIC9GZSAvRmQgL0ZvIDogLUQKKyAgICA6IC9ub2xvZ28KKyAgICBbIG9wdCAtLXJlbGVhc2UgOiAvTVQgL08yIC9PYjIgL0d5IC9HRiAvR0EgL3dkNDk5NiBdCisgICAgWyBvcHQgLS1kZWJ1ZyA6IC9NVGQgL0RFQlVHIC9aNyAvT2QgL09iMCAvd2Q0OTk2IF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkKKyAgICA6IGtlcm5lbDMyLmxpYiBhZHZhcGkzMi5saWIgdXNlcjMyLmxpYiAkKC0tcHl0aG9uLWxpYlsxXSkgOworIyMgTWljcm9zb2Z0IFZpc3VhbCBDKysgMjAxMAordG9vbHNldCB2YzEwIGNsIDogL0ZlIC9GZSAvRmQgL0ZvIDogLUQKKyAgICA6IC9ub2xvZ28KKyAgICBbIG9wdCAtLXJlbGVhc2UgOiAvTVQgL08yIC9PYjIgL0d5IC9HRiAvR0EgL3dkNDk5NiBdCisgICAgWyBvcHQgLS1kZWJ1ZyA6IC9NVGQgL0RFQlVHIC9aNyAvT2QgL09iMCAvd2Q0OTk2IF0KKyAgICAtSSQoLS1weXRob24taW5jbHVkZSkgLUkkKC0tZXh0cmEtaW5jbHVkZSkKKyAgICA6IGtlcm5lbDMyLmxpYiBhZHZhcGkzMi5saWIgdXNlcjMyLmxpYiAkKC0tcHl0aG9uLWxpYlsxXSkgOwordG9vbHNldCB2YzExIGNsIDogL0ZlIC9GZSAvRmQgL0ZvIDogLUQKKyAgICA6IC9ub2xvZ28KKyAgICBbIG9wdCAtLXJlbGVhc2UgOiAvR0wgL01UIC9PMiAvT2IyIC9HeSAvR0YgL0dBIC93ZDQ5OTYgXQorICAgIFsgb3B0IC0tZGVidWcgOiAvTVRkIC9ERUJVRyAvWjcgL09kIC9PYjAgL3dkNDk5NiBdCisgICAgLUkkKC0tcHl0aG9uLWluY2x1ZGUpIC1JJCgtLWV4dHJhLWluY2x1ZGUpCisgICAgOiBrZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHVzZXIzMi5saWIgJCgtLXB5dGhvbi1saWJbMV0pIDsKK3Rvb2xzZXQgdmMxMiBjbCA6IC9GZSAvRmUgL0ZkIC9GbyA6IC1ECisgICAgOiAvbm9sb2dvCisgICAgWyBvcHQgLS1yZWxlYXNlIDogL0dMIC9NVCAvTzIgL09iMiAvR3kgL0dGIC9HQSAvd2Q0OTk2IF0KKyAgICBbIG9wdCAtLWRlYnVnIDogL01UZCAvREVCVUcgL1o3IC9PZCAvT2IwIC93ZDQ5OTYgXQorICAgIC1JJCgtLXB5dGhvbi1pbmNsdWRlKSAtSSQoLS1leHRyYS1pbmNsdWRlKQorICAgIDoga2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiB1c2VyMzIubGliICQoLS1weXRob24tbGliWzFdKSA7CisKKyMgRmlyc3Qgc2V0IHRoZSBidWlsZCBjb21tYW5kcyBhbmQgb3B0aW9ucyBhY2NvcmRpbmcgdG8gdGhlCisjIHByZXNldCB0b29sc2V0LgordG9vbHNldCA9IFsgTUFUQ0ggLS10b29sc2V0PSguKikgOiAkKEFSR1YpIF0gOworaWYgISAkKHRvb2xzZXQpCit7CisgICAgIyBGb3Igc29tZSByZWFzb24sIHRoZSBmb2xsb3dpbmcgdGVzdCBkb2VzIG5vdCBjYXRjaCBlbXB0eSB0b29sc2V0LgorICAgIEVDSE8gIiMjIyIgOworICAgIEVDSE8gIiMjIyIgTm8gdG9vbHNldCBzcGVjaWZpZWQuIFBsZWFzZSB1c2UgLS10b29sc2V0IG9wdGlvbi4gOworICAgIEVDSE8gIiMjIyIgOworICAgIEVDSE8gIiMjIyIgS25vd24gdG9vbHNldHMgYXJlOiAkKHRvb2xzZXRzOko9IiwgIikgOworICAgIEVYSVQgIiMjIyIgOworfQoraWYgISAkKHRvb2xzZXQpIGluICQodG9vbHNldHMpCit7CisgICAgRUNITyAiIyMjIiA7CisgICAgRUNITyAiIyMjIiBVbmtub3duIHRvb2xzZXQ6ICQodG9vbHNldCkgOworICAgIEVDSE8gIiMjIyIgOworICAgIEVDSE8gIiMjIyIgS25vd24gdG9vbHNldHMgYXJlOiAkKHRvb2xzZXRzOko9IiwgIikgOworICAgIEVYSVQgIiMjIyIgOworfQorLS1jYyA9ICQodG9vbC4kKHRvb2xzZXQpLmNjKSA7CitpZiAkKHRvb2wuJCh0b29sc2V0KS5vcHQub3V0WzJdKQoreworICAgIGlmICQodG9vbC4kKHRvb2xzZXQpLm9wdC5vdXRbMV0pID0gJCh0b29sLiQodG9vbHNldCkub3B0Lm91dFsyXSkKKyAgICB7CisgICAgICAgIC0tb3V0ID0gJCh0b29sLiQodG9vbHNldCkub3B0Lm91dFsxXSkgOworICAgICAgICAtLWRpciA9ICQodG9vbC4kKHRvb2xzZXQpLm9wdC5vdXRbMy1dKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC0tYmluID0gJCh0b29sLiQodG9vbHNldCkub3B0Lm91dFsxXSkgOworICAgICAgICAtLWRpciA9ICQodG9vbC4kKHRvb2xzZXQpLm9wdC5vdXRbMi1dKSA7CisgICAgfQorfQorZWxzZQoreworICAgIC0tb3V0ID0gJCh0b29sLiQodG9vbHNldCkub3B0Lm91dCkgOworfQorLS1kZWYgPSAkKHRvb2wuJCh0b29sc2V0KS5vcHQuZGVmaW5lKSA7CistLWZsYWdzID0gJCh0b29sLiQodG9vbHNldCkuZmxhZ3MpIDsKKy0tZGVmcyA9ICQodG9vbC4kKHRvb2xzZXQpLmRlZmluZXMpIDsKKy0tbGlicyA9ICQodG9vbC4kKHRvb2xzZXQpLmxpbmtsaWJzKSA7CitpZiAkKHRvb2wuJCh0b29sc2V0KS5saW5rLmNjKQoreworICAgIC0tbGluayA9ICQodG9vbC4kKHRvb2xzZXQpLmxpbmsuY2MpIDsKKyAgICBpZiAkKHRvb2wuJCh0b29sc2V0KS5saW5rLm9wdC5vdXRbMl0pCisgICAgeworICAgICAgICBpZiAkKHRvb2wuJCh0b29sc2V0KS5saW5rLm9wdC5vdXRbMV0pID0gJCh0b29sLiQodG9vbHNldCkubGluay5vcHQub3V0WzJdKQorICAgICAgICB7CisgICAgICAgICAgICAtLWxpbmstb3V0ID0gJCh0b29sLiQodG9vbHNldCkubGluay5vcHQub3V0WzFdKSA7CisgICAgICAgICAgICAtLWxpbmstZGlyID0gJCh0b29sLiQodG9vbHNldCkubGluay5vcHQub3V0WzMtXSkgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLS1saW5rLWJpbiA9ICQodG9vbC4kKHRvb2xzZXQpLmxpbmsub3B0Lm91dFsxXSkgOworICAgICAgICAgICAgLS1saW5rLWRpciA9ICQodG9vbC4kKHRvb2xzZXQpLmxpbmsub3B0Lm91dFsyLV0pIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAtLWxpbmstb3V0ID0gJCh0b29sLiQodG9vbHNldCkubGluay5vcHQub3V0KSA7CisgICAgfQorICAgIC0tbGluay1kZWYgPSAkKHRvb2wuJCh0b29sc2V0KS5saW5rLm9wdC5kZWZpbmUpIDsKKyAgICAtLWxpbmstZmxhZ3MgPSAkKHRvb2wuJCh0b29sc2V0KS5saW5rLmZsYWdzKSA7CisgICAgLS1saW5rLWRlZnMgPSAkKHRvb2wuJCh0b29sc2V0KS5saW5rLmRlZmluZXMpIDsKKyAgICAtLWxpbmstbGlicyA9ICQodG9vbC4kKHRvb2xzZXQpLmxpbmsubGlua2xpYnMpIDsKK30KKworIyBQdXQgZXhlY3V0YWJsZXMgaW4gcGxhdGZvcm0tc3BlY2lmaWMgc3ViZGlyZWN0b3J5LgorbG9jYXRlLXRhcmdldCA9ICQoTE9DQVRFX1RBUkdFVCkgOworaWYgJChPU1BMQVQpCit7CisgICAgbG9jYXRlLXRhcmdldCA/PSBiaW4kKC4pJChPUzpMKSQoT1NQTEFUOkwpIDsKKyAgICBwbGF0Zm9ybSA9ICQoT1M6TCkkKE9TUExBVDpMKSA7Cit9CitlbHNlCit7CisgICAgbG9jYXRlLXRhcmdldCA/PSBiaW4kKC4pJChPUzpMKSA7CisgICAgcGxhdGZvcm0gPSAkKE9TOkwpIDsKK30KK2lmICQoZGVidWcpCit7CisgICAgbG9jYXRlLXRhcmdldCA9IFsgLnBhdGggJChsb2NhdGUtdGFyZ2V0KSQoLilkZWJ1ZyBdIDsKK30KK2lmICQocHJvZmlsZSkKK3sKKyAgICBsb2NhdGUtdGFyZ2V0ID0gWyAucGF0aCAkKGxvY2F0ZS10YXJnZXQpJCguKXByb2ZpbGUgXSA7Cit9CitlbHNlCit7CisgICAgbG9jYXRlLXRhcmdldCA9IFsgLnBhdGggJChsb2NhdGUtdGFyZ2V0KSBdIDsKK30KKworaWYgLS1zaG93LWxvY2F0ZS10YXJnZXQgaW4gJChBUkdWKQoreworICAgIEVDSE8gJChsb2NhdGUtdGFyZ2V0KSA7Cit9CisKKyMgV2UgaGF2ZSBzb21lIGRpZmZlcmVudCBmaWxlcyBmb3IgVU5JWCwgYW5kIE5ULgoramFtLnNvdXJjZSA9CisgICAgY29tbWFuZC5jIGNvbXBpbGUuYyBjb25zdGFudHMuYyBkZWJ1Zy5jIGV4ZWNjbWQuYyBmcmFtZXMuYyBmdW5jdGlvbi5jIGdsb2IuYworICAgIGhhc2guYyBoY2FjaGUuYyBoZWFkZXJzLmMgaGRybWFjcm8uYyBqYW0uYyBqYW1iYXNlLmMgamFtZ3JhbS5jIGxpc3RzLmMKKyAgICBtYWtlLmMgbWFrZTEuYyBtZW0uYyBvYmplY3QuYyBvcHRpb24uYyBvdXRwdXQuYyBwYXJzZS5jIHBhdGhzeXMuYyByZWdleHAuYworICAgIHJ1bGVzLmMgc2Nhbi5jIHNlYXJjaC5jIHN1YnN0LmMgdzMyX2dldHJlZy5jIHRpbWVzdGFtcC5jIHZhcmlhYmxlLmMKKyAgICBtb2R1bGVzLmMgc3RyaW5ncy5jIGZpbGVzeXMuYyBidWlsdGlucy5jIGNsYXNzLmMgY3dkLmMgbmF0aXZlLmMgbWQ1LmMKKyAgICBbIC5wYXRoIG1vZHVsZXMgc2V0LmMgXSBbIC5wYXRoIG1vZHVsZXMgcGF0aC5jIF0gWyAucGF0aCBtb2R1bGVzIHJlZ2V4LmMgXQorICAgIFsgLnBhdGggbW9kdWxlcyBwcm9wZXJ0eS1zZXQuYyBdIFsgLnBhdGggbW9kdWxlcyBzZXF1ZW5jZS5jIF0gWyAucGF0aCBtb2R1bGVzIG9yZGVyLmMgXSA7CitpZiAkKE9TKSA9IE5UCit7CisgICAgamFtLnNvdXJjZSArPSBleGVjbnQuYyBmaWxlbnQuYyBwYXRobnQuYyA7Cit9CitlbHNlCit7CisgICAgamFtLnNvdXJjZSArPSBleGVjdW5peC5jIGZpbGV1bml4LmMgcGF0aHVuaXguYyA7Cit9CisKKyMgRGVidWcgYXNzZXJ0aW9ucywgb3Igbm90LgoraWYgISAkKGRlYnVnKSB8fCAtLW5vYXNzZXJ0IGluICQoQVJHVikKK3sKKyAgICAtLWRlZnMgKz0gTkRFQlVHIDsKK30KKworIyBFbmFibGUgc29tZSBvcHRpb25hbCBmZWF0dXJlcy4KKy0tZGVmcyArPSBPUFRfSEVBREVSX0NBQ0hFX0VYVCA7CistLWRlZnMgKz0gT1BUX0dSQVBIX0RFQlVHX0VYVCA7CistLWRlZnMgKz0gT1BUX1NFTUFQSE9SRSA7CistLWRlZnMgKz0gT1BUX0FUX0ZJTEVTIDsKKy0tZGVmcyArPSBPUFRfREVCVUdfUFJPRklMRSA7CisKKyMgQnVnIGZpeGVzCistLWRlZnMgKz0gT1BUX0ZJWF9UQVJHRVRfVkFSSUFCTEVTX0VYVCA7CisjfiAtLWRlZnMgKz0gT1BUX05PX0VYVEVSTkFMX1ZBUklBQkxFX1NQTElUIDsKKworIyBJbXByb3ZlbWVudHMKKy0tZGVmcyArPSBPUFRfSU1QUk9WRURfUEFUSUVOQ0VfRVhUIDsKKworIyBVc2UgQm9laG0gR0MgbWVtb3J5IGFsbG9jYXRvcj8KK2lmICQoLS1ib2VobS1nYykKK3sKKyAgICAtLWRlZnMgKz0gT1BUX0JPRUhNX0dDIDsKKyAgICBpZiAkKGRlYnVnKQorICAgIHsKKyAgICAgICAgLS1kZWZzICs9IEdDX0RFQlVHIDsKKyAgICB9Cit9CisKK2lmICQoLS1kdW1hKQoreworICAgIC0tZGVmcyArPSBPUFRfRFVNQSA7Cit9CisKK2lmICggJChPUykgPSBOVCApICYmICEgTlQgaW4gJCgtLWRlZnMpCit7CisgICAgLS1kZWZzICs9IE5UIDsKK30KKy0tZGVmcyArPSBZWVNUQUNLU0laRT01MDAwIDsKKworaWYgJCh3aXRoLXB5dGhvbikKK3sKKyAgICAtLWRlZnMgKz0gSEFWRV9QWVRIT04gOworfQorCitpZiAkKGRlYnVnKQoreworICAgIC0tZGVmcyArPSBCSkFNX05FV1NUUl9OT19BTExPQ0FURSA7Cit9CisKKworIyBUaGUgYmFzaWMgc3ltYm9saWMgdGFyZ2V0cy4uLgorTk9URklMRSBhbGwgY2xlYW4gZGlzdCA7CitBTFdBWVMgY2xlYW4gOworCisjIFV0aWxpdHkgcnVsZXMgYW5kIGFjdGlvbnMuLi4KK3J1bGUgLmNsZWFuCit7CisgICAgW0RFTEVURV0gY2xlYW4gOiAkKDwpIDsKK30KK2lmICQoT1MpID0gTlQgeyBhY3Rpb25zIHBpZWNlbWVhbCB0b2dldGhlciBleGlzdGluZyBbREVMRVRFXSB7CisgICAgZGVsIC9GIC9RICIkKD4pIgorfSB9CitpZiAkKFVOSVgpID0gdHJ1ZSB7IGFjdGlvbnMgcGllY2VtZWFsIHRvZ2V0aGVyIGV4aXN0aW5nIFtERUxFVEVdIHsKKyAgICBybSAtZiAiJCg+KSIKK30gfQoraWYgJChPUykgPSBOVCB7CisgICAgLS1jaG1vZCt3ID0gImF0dHJpYiAtciAiIDsKK30KK2lmICQoVU5JWCkgPSB0cnVlIHsKKyAgICAtLWNobW9kK3cgPSAiY2htb2QgK3cgIiA7Cit9CisKK3J1bGUgLm1rZGlyCit7CisgICAgTk9VUERBVEUgJCg8KSA7CisgICAgaWYgJCg8OlApIHsgREVQRU5EUyAkKDwpIDogJCg8OlApIDsgLm1rZGlyICQoPDpQKSA7IH0KKyAgICBpZiAhICQobWQ8JCg8KT4pIHsgW01LRElSXSAkKDwpIDsgbWQ8JCg8KT4gPSAtIDsgfQorfQoraWYgJChPUykgPSBOVCB7IGFjdGlvbnMgW01LRElSXSB7CisgICAgbWQgIiQoPCkiCit9IH0KK2lmICQoVU5JWCkgPSB0cnVlIHsgYWN0aW9ucyBbTUtESVJdIHsKKyAgICBta2RpciAiJCg8KSIKK30gfQorCitydWxlIC5leGUKK3sKKyAgICBsb2NhbCBleGUgPSAkKDwpIDsKKyAgICBpZiAkKE9TKSA9IE5UIHx8ICggJChVTklYKSA9IHRydWUgJiYgJChPUykgPSBDWUdXSU4gKSB7IGV4ZSA9ICQoZXhlOlM9LmV4ZSkgOyB9CisgICAgTE9DQVRFIG9uICQoZXhlKSA9ICQobG9jYXRlLXRhcmdldCkgOworICAgIERFUEVORFMgYWxsIDogJChleGUpIDsKKyAgICAubWtkaXIgJChsb2NhdGUtdGFyZ2V0KSA7CisgICAgaWYgJCgtLWxpbmspCisgICAgeworICAgICAgICBsb2NhbCBvYmpzIDsKKyAgICAgICAgZm9yIGxvY2FsIHMgaW4gJCg+KQorICAgICAgICB7CisgICAgICAgICAgICAjIFRyYW5zbGF0ZSBhbnkgc3ViZGlyIGVsZW1lbnRzIGludG8gYSBzaW1wbGUgZmlsZSBuYW1lLgorICAgICAgICAgICAgbG9jYWwgbyA9IFsgTUFUQ0ggIihbXi9dKylbL10/KC4rKSIgOiAkKHMpIF0gOworICAgICAgICAgICAgbyA9ICQobzpKPV8pIDsKKyAgICAgICAgICAgIG8gPSAkKG86Uz0ubykgOworICAgICAgICAgICAgb2JqcyArPSAkKG8pIDsKKyAgICAgICAgICAgIExPQ0FURSBvbiAkKG8pID0gJChsb2NhdGUtdGFyZ2V0KSA7CisgICAgICAgICAgICBERVBFTkRTICQoZXhlKSA6ICQobykgOworICAgICAgICAgICAgREVQRU5EUyAkKG8pIDogJChzKSA7CisgICAgICAgICAgICBERVBFTkRTICQobykgOiAkKGxvY2F0ZS10YXJnZXQpIDsKKyAgICAgICAgICAgIFtDT01QSUxFXSAkKG8pIDogJChzKSA7CisgICAgICAgICAgICAuY2xlYW4gJChvKSA7CisgICAgICAgIH0KKyAgICAgICAgREVQRU5EUyAkKGV4ZSkgOiAkKG9ianMpIDsKKyAgICAgICAgREVQRU5EUyAkKGV4ZSkgOiAkKGxvY2F0ZS10YXJnZXQpIDsKKyAgICAgICAgW0NPTVBJTEUuTElOS10gJChleGUpIDogJChvYmpzKSA7CisgICAgICAgIC5jbGVhbiAkKGV4ZSkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBERVBFTkRTICQoZXhlKSA6ICQoPikgOworICAgICAgICBERVBFTkRTICQoZXhlKSA6ICQobG9jYXRlLXRhcmdldCkgOworICAgICAgICBbQ09NUElMRV0gJChleGUpIDogJCg+KSA7CisgICAgICAgIC5jbGVhbiAkKGV4ZSkgOworICAgIH0KKyAgICByZXR1cm4gJChleGUpIDsKK30KK2lmICEgJCgtLWRlZlsyXSkgeyBhY3Rpb25zIFtDT01QSUxFXSB7CisgICAgIiQoLS1jYykiICIkKC0tYmluKSQoPDpEPSkiICIkKC0tZGlyKSQoPDpEKSQoLi8pIiAkKC0tb3V0KSQoPCkgIiQoLS1kZWYpJCgtLWRlZnMpIiAiJCgtLWZsYWdzKSIgIiQoPikiICIkKC0tbGlicykiCit9IH0KK2Vsc2UgeyBhY3Rpb25zIFtDT01QSUxFXSB7CisgICAgIiQoLS1jYykiICIkKC0tYmluKSQoPDpEPSkiICIkKC0tZGlyKSQoPDpEKSQoLi8pIiAkKC0tb3V0KSQoPCkgIiQoLS1kZWZbMV0pJCgtLWRlZnM6Sj0kKC0tZGVmWzJdKSkkKC0tZGVmWzNdKSIgIiQoLS1mbGFncykiICAiJCg+KSIgIiQoLS1saWJzKSIKK30gfQorCithY3Rpb25zIFtDT01QSUxFLkxJTktdIHsKKyAgICAiJCgtLWxpbmspIiAiJCgtLWxpbmstYmluKSQoPDpEPSkiICIkKC0tbGluay1kaXIpJCg8OkQpJCguLykiICIkKC0tbGluay1vdXQpJCg8KSIgIiQoLS1saW5rLWRlZikkKC0tbGluay1kZWZzKSIgIiQoLS1saW5rLWZsYWdzKSIgICIkKD4pIiAiJCgtLWxpbmstbGlicykiCit9CisKK3J1bGUgLmxpbmsKK3sKKyAgICBERVBFTkRTIGFsbCA6ICQoPCkgOworICAgIERFUEVORFMgJCg8KSA6ICQoPikgOworICAgIFtMSU5LXSAkKDwpIDogJCg+KSA7CisgICAgLmNsZWFuICQoPCkgOworfQoraWYgJChPUykgPSBOVCB7IGFjdGlvbnMgW0xJTktdIHsKKyAgICBjb3B5ICIkKD4pIiAiJCg8KSIKK30gfQoraWYgJChVTklYKSA9IHRydWUgeyBhY3Rpb25zIFtMSU5LXSB7CisgICAgbG4gLWZzICIkKD4pIiAiJCg8KSIKK30gfQorCitydWxlIC5jb3B5Cit7CisgICAgREVQRU5EUyBhbGwgOiAkKDwpIDsKKyAgICBERVBFTkRTICQoPCkgOiAkKD4pIDsKKyAgICBbQ09QWV0gJCg8KSA6ICQoPikgOworICAgIC5jbGVhbiAkKDwpIDsKK30KKworIyBXaWxsIGJlIHJlZGVmaW5lZCBsYXRlci4KK2FjdGlvbnMgW0NPUFldCit7Cit9CisKKworcnVsZSAubW92ZQoreworICAgIERFUEVORFMgJCg8KSA6ICQoPikgOworICAgIFtNT1ZFXSAkKDwpIDogJCg+KSA7Cit9CitpZiAkKE9TKSA9IE5UIHsgYWN0aW9ucyBbTU9WRV0geworICAgIGRlbCAvZiAiJCg8KSIKKyAgICByZW5hbWUgIiQoPikiICIkKDwpIgorfSB9CitpZiAkKFVOSVgpID0gdHJ1ZSB7IGFjdGlvbnMgW01PVkVdIHsKKyAgICBtdiAtZiAiJCg+KSIgIiQoPCkiCit9IH0KKworIyBHZW5lcmF0ZSB0aGUgZ3JhbW1hciB0b2tlbnMgdGFibGUsIGFuZCB0aGUgcmVhbCB5YWNjIGdyYW1tYXIuCitydWxlIC55eWFjYworeworICAgIGxvY2FsIGV4ZSA9IFsgLmV4ZSB5eWFjYyA6IHl5YWNjLmMgXSA7CisgICAgTk9VUERBVEUgJChleGUpIDsKKyAgICBERVBFTkRTICQoPCkgOiAkKGV4ZSkgJCg+KSA7CisgICAgTEVBVkVTICQoPCkgOworICAgIHl5YWNjLmV4ZSBvbiAkKDwpID0gJChleGU6Uj0kKGxvY2F0ZS10YXJnZXQpKSA7CisgICAgW1lZQUNDXSAkKDwpIDogJCg+KSA7Cit9CithY3Rpb25zIFtZWUFDQ10geworICAgICQoLS1jaG1vZCt3KSQoPFsxXSkKKyAgICAkKC0tY2htb2QrdykkKDxbMl0pCisgICAgIiQoeXlhY2MuZXhlKSIgIiQoPCkiICIkKD4pIgorfQoraWYgJChncmFtbWFyKQoreworICAgIC55eWFjYyBqYW1ncmFtLnkgamFtZ3JhbXRhYi5oIDogamFtZ3JhbS55eSA7Cit9CitlbHNlIGlmICQoZGVidWcpCit7CisgICAgLmV4ZSB5eWFjYyA6IHl5YWNjLmMgOworfQorCisjIEhvdyB0byBidWlsZCB0aGUgZ3JhbW1hci4KK2lmICQoT1MpID0gTlQKK3sKKyAgICBTVUZFWEUgPSAuZXhlIDsKKyAgICAjIHRyeSBzb21lIG90aGVyIGxpa2VseSBzcGVsbGluZ3MuLi4KKyAgICBQQVRIID89ICQoUGF0aCkgOworICAgIFBBVEggPz0gJChwYXRoKSA7Cit9CitTVUZFWEUgPz0gIiIgOworCit5YWNjID89IFsgR0xPQiAkKFBBVEgpIDogeWFjYyQoU1VGRVhFKSBdIDsKK3lhY2MgPz0gWyBHTE9CICQoUEFUSCkgOiBiaXNvbiQoU1VGRVhFKSBdIDsKK3lhY2MgPz0gWyBHTE9CICIkKFByb2dyYW1GaWxlczpKPSApXFxHbnVXaW4zMlxcYmluIgorICAgICJDOlxcUHJvZ3JhbSBGaWxlc1xcR251V2luMzJcXGJpbiIgOiBiaXNvbiQoU1VGRVhFKSBdIDsKK3lhY2MgPSAkKHlhY2NbMV0pIDsKK3N3aXRjaCAkKHlhY2M6RD06Uz0pCit7CisgICAgY2FzZSBiaXNvbiA6IHlhY2MgKz0gLWQgLS15YWNjIDsKKyAgICBjYXNlIHlhY2MgIDogeWFjYyArPSAtZCA7Cit9CitpZiAkKGRlYnVnKSAmJiAkKHlhY2MpCit7CisgICAgeWFjYyArPSAtdCAtdiA7Cit9Cit5YWNjICs9ICQoWUFDQ0ZMQUdTKSA7CisKK3J1bGUgLnlhY2MKK3sKKyAgICBERVBFTkRTICQoPCkgOiAkKD4pIDsKKyAgICBMRUFWRVMgJCg8KSA7CisgICAgW1lBQ0NdICQoPCkgOiAkKD4pIDsKK30KK2lmICQoT1MpID0gTlQgeyBhY3Rpb25zIFtZQUNDXSB7CisgICAgIiQoeWFjYykiICIkKD4pIgorICAgIGlmIG5vdCBlcnJvcmxldmVsIDEgKAorICAgICAgICBkZWwgL2YgIiQoPFsxXSkiCisgICAgICAgIHJlbmFtZSB5LnRhYiQoPFsxXTpTKSAiJCg8WzFdKSIKKyAgICAgICAgZGVsIC9mICQoPFsyXSkKKyAgICAgICAgcmVuYW1lIHkudGFiJCg8WzJdOlMpICIkKDxbMl0pIgorICAgICkgZWxzZSBzZXQgX2Vycm9yXyA9Cit9IH0KK2lmICQoVU5JWCkgPSB0cnVlIHsgYWN0aW9ucyBbWUFDQ10geworICAgIGlmIGAgIiQoeWFjYykiICIkKD4pIiBgIDsgdGhlbgorICAgICAgICBtdiAtZiB5LnRhYiQoPFsxXTpTKSAiJCg8WzFdKSIKKyAgICAgICAgbXYgLWYgeS50YWIkKDxbMl06UykgIiQoPFsyXSkiCisgICAgZWxzZQorICAgICAgICBleGl0IDEKKyAgICBmaQorfSB9CitpZiAkKGdyYW1tYXIpICYmICEgJCh5YWNjKQoreworICAgIEVYSVQgQ291bGQgbm90IGZpbmQgdGhlICd5YWNjJyB0b29sLCBhbmQgdGhlcmVmb3JlIGNhbiBub3QgYnVpbGQgdGhlCisgICAgICAgIGdyYW1tYXIuIDsKK30KK2lmICQoZ3JhbW1hcikgJiYgJCh5YWNjKQoreworICAgIC55YWNjIGphbWdyYW0uYyBqYW1ncmFtLmggOiBqYW1ncmFtLnkgOworfQorCisjIEhvdyB0byBidWlsZCB0aGUgY29tcGlsZWQgaW4gamFtYmFzZS4KK3J1bGUgLm1ramFtYmFzZQoreworICAgIGxvY2FsIGV4ZSA9IFsgLmV4ZSBta2phbWJhc2UgOiBta2phbWJhc2UuYyBdIDsKKyAgICBERVBFTkRTICQoPCkgOiAkKGV4ZSkgJCg+KSA7CisgICAgTEVBVkVTICQoPCkgOworICAgIG1ramFtYmFzZS5leGUgb24gJCg8KSA9ICQoZXhlOlI9JChsb2NhdGUtdGFyZ2V0KSkgOworICAgIFtNS0pBTUJBU0VdICQoPCkgOiAkKD4pIDsKK30KK2FjdGlvbnMgW01LSkFNQkFTRV0geworICAgICQoLS1jaG1vZCt3KSQoPCkKKyAgICAkKG1ramFtYmFzZS5leGUpICIkKDwpIiAiJCg+KSIKK30KK2lmICQoZGVidWcpCit7CisgICAgLm1ramFtYmFzZSBqYW1iYXNlLmMgOiBKYW1iYXNlIDsKK30KKworIyBIb3cgdG8gYnVpbGQgSmFtLgorcnVsZSAuamFtCit7CisgICAgJCg+KS5leGUgPSBbIC5leGUgJCg+KSA6ICQoamFtLnNvdXJjZSkgXSA7CisgICAgREVQRU5EUyBhbGwgOiAkKCQoPikuZXhlKSA7CisKKyAgICAjIE1ha2UgYSBjb3B5IHVuZGVyIHRoZSBvbGQgbmFtZS4KKyAgICAkKDwpLmV4ZSA9ICQoPDpTPSQoJCg+KS5leGU6UykpIDsKKyAgICBMT0NBVEUgb24gJCgkKDwpLmV4ZSkgPSAkKGxvY2F0ZS10YXJnZXQpIDsKKyAgICAuY29weSAkKCQoPCkuZXhlKSA6ICQoJCg+KS5leGUpIDsKKyAgICBERVBFTkRTIGFsbCA6ICQoJCg8KS5leGUpIDsKK30KKy5qYW0gYmphbSA6IGIyIDsKKworCisjIFNjYW4gc291cmNlcyBmb3IgaGVhZGVyIGRlcGVuZGVuY2llcy4KKyMKKyMgSW4gb3JkZXIgdG8ga2VlcCB0aGluZ3Mgc2ltcGxlLCB3ZSBtYWRlIGEgc2xpZ2h0IGNvbXByb21pc2UgaGVyZSAtIHdlIG9ubHkKKyMgZGV0ZWN0IGNoYW5nZXMgaW4gaGVhZGVycyBpbmNsdWRlZCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBmb2xkZXIgYXMgb3Bwb3NlZAorIyB0byB0aG9zZSBpbmNsdWRlZCBmcm9tIHNvbWV3aGVyZSBvbiB0aGUgaW5jbHVkZSBwYXRoLgorcnVsZSAuc2NhbiAoIHRhcmdldHMgKyApCit7CisgICAgSERSUlVMRSBvbiAkKHRhcmdldHMpID0gLmhkci5zY2FuIDsKKyAgICBIRFJTQ0FOIG9uICQodGFyZ2V0cykgPSAiXlsgXHRdKiNbIFx0XSppbmNsdWRlWyBcdF0qXCIoW15cIl0qKVwiLiokIiA7Cit9CitydWxlIC5oZHIuc2NhbiAoIHRhcmdldCA6IGluY2x1ZGVzICogOiBiaW5kaW5nICkKK3sKKyAgICBsb2NhbCB0YXJnZXQtcGF0aCA9IFsgTk9STUFMSVpFX1BBVEggJChiaW5kaW5nOkQpIF0gOworICAgICMgRXh0cmEgZ3Jpc3QgcHJvdmlkZXMgdGFyZ2V0IG5hbWUgdW5pcXVlbmVzcyB3aGVuIHJlZmVyZW5jaW5nIHNhbWUgbmFtZQorICAgICMgaGVhZGVyIGZpbGVzIGZyb20gZGlmZmVyZW50IGZvbGRlcnMuCisgICAgbG9jYWwgaW5jbHVkZS10YXJnZXRzID0gPCQodGFyZ2V0LXBhdGgpPiQoaW5jbHVkZXMpIDsKKyAgICBOT0NBUkUgJChpbmNsdWRlLXRhcmdldHMpIDsKKyAgICBJTkNMVURFUyAkKHRhcmdldCkgOiAkKGluY2x1ZGUtdGFyZ2V0cykgOworICAgIFNFQVJDSCBvbiAkKGluY2x1ZGUtdGFyZ2V0cykgPSAkKHRhcmdldC1wYXRoKSA7CisgICAgSVNGSUxFICQoaW5jbHVkZS10YXJnZXRzKSA7CisgICAgLnNjYW4gJChpbmNsdWRlLXRhcmdldHMpIDsKK30KKy5zY2FuICQoamFtLnNvdXJjZSkgOworCisKKyMgRGlzdHJpYnV0aW9uIG1ha2luZyBmcm9tIGhlcmUgb24gb3V0LiBBc3N1bWVzIHRoYXQgdGhlIGRvY3MgYXJlIGFscmVhZHkgYnVpbHQKKyMgYXMgSFRNTCBhdCAuLi9kb2MvaHRtbC4gT3RoZXJ3aXNlIHRoZXkgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWx0CisjIGRpc3RyaWJ1dGlvbiBhcmNoaXZlLgorZGlzdC5saWNlbnNlID0KKyAgICBbIEdMT0IgLiA6ICQoTElDRU5TRSkudHh0IF0KKyAgICA7CitkaXN0LmxpY2Vuc2UgPSAkKGRpc3QubGljZW5zZTpEPSkKKyAgICBbIEdMT0IgWyAucGF0aCAuLiAuLiAuLiBdIDogJChMSUNFTlNFKS50eHQgXQorICAgIFsgR0xPQiBbIC5wYXRoIC4uIGJvb3N0IF0gOiAkKExJQ0VOU0UpLnR4dCBdIDsKK2Rpc3QuZG9jcyA9CisgICAgWyBHTE9CIC4gOiAqLnBuZyAqLmNzcyAqLmh0bWwgXQorICAgIDsKK2Rpc3QuZG9jcyA9ICQoZGlzdC5kb2NzOkQ9KQorICAgIFsgR0xPQiBbIC5wYXRoIGltYWdlcyBdIDogKi5wbmcgXQorICAgIFsgR0xPQiBbIC5wYXRoIGphbSBdIDogKi5odG1sIF0KKyAgICA7CitkaXN0LnNvdXJjZSA9CisgICAgWyBHTE9CIC4gOiAqLmMgKi5oIF0KKyAgICA7CitkaXN0LnNvdXJjZSA9ICQoZGlzdC5zb3VyY2U6RD0pCisgICAgJChkaXN0LmxpY2Vuc2VbMV0pCisgICAgJChkaXN0LmRvY3MpCisgICAgYnVpbGQuamFtIGJ1aWxkLmJhdCBidWlsZC5zaAorICAgIEphbWJhc2UKKyAgICBqYW1ncmFtLnkgamFtZ3JhbS55eQorICAgIFsgLnBhdGggbW9kdWxlcyBzZXQuYyBdCisgICAgWyAucGF0aCBtb2R1bGVzIHBhdGguYyBdCisgICAgWyAucGF0aCBtb2R1bGVzIHJlZ2V4LmMgXQorICAgIFsgLnBhdGggbW9kdWxlcyBwcm9wZXJ0eS1zZXQuYyBdCisgICAgWyAucGF0aCBtb2R1bGVzIHNlcXVlbmNlLmMgXQorICAgIFsgLnBhdGggbW9kdWxlcyBvcmRlci5jIF0KKyAgICBbIEdMT0IgWyAucGF0aCBib2VobV9nYyBdIDogKiBdCisgICAgWyBHTE9CIFsgLnBhdGggYm9laG1fZ2MgaW5jbHVkZSBdIDogKiBdCisgICAgWyBHTE9CIFsgLnBhdGggYm9laG1fZ2MgaW5jbHVkZSBwcml2YXRlIF0gOiAqIF0KKyAgICBbIEdMT0IgWyAucGF0aCBib2VobV9nYyBjb3JkIF0gOiAqIF0KKyAgICBbIEdMT0IgWyAucGF0aCBib2VobV9nYyBNYWNfZmlsZXMgXSA6ICogXQorICAgIFsgR0xPQiBbIC5wYXRoIGJvZWhtX2djIHRlc3RzIF0gOiAqIF0KKyAgICBbIEdMT0IgWyAucGF0aCBib2VobV9nYyBkb2MgXSA6ICogXQorICAgIDsKK2Rpc3QuYmluID0KKyAgICBiamFtCisgICAgOworZGlzdC5iaW4gPQorICAgICQoZGlzdC5saWNlbnNlWzFdKQorICAgICQoZGlzdC5iaW46Uz0kKGJqYW0uZXhlOlMpKQorICAgIDsKKworaWYgJChPUykgPSBOVAoreworICAgIHppcCA/PSBbIEdMT0IgIiQoUHJvZ3JhbUZpbGVzOko9IClcXDctWklQIiAiQzpcXFByb2dyYW0gRmlsZXNcXDctWklQIiA6ICI3ei5leGUiIF0gOworICAgIHppcCA/PSBbIEdMT0IgIiQoUHJvZ3JhbUZpbGVzOko9IClcXDctWklQIiAiQzpcXFByb2dyYW0gRmlsZXNcXDctWklQIiA6ICI3em4uZXhlIiBdIDsKKyAgICB6aXAgPz0gWyBHTE9CICQoUEFUSCkgOiB6aXAuZXhlIF0gOworICAgIHppcCA/PSB6aXAgOworICAgIHppcCA9ICQoemlwWzFdKSA7CisgICAgc3dpdGNoICQoemlwOkQ9OlM9KQorICAgIHsKKyAgICAgICAgY2FzZSA3eiogOiB6aXAgKz0gYSAtciAtdHppcCAtbXg9OSA7CisgICAgICAgIGNhc2UgemlwIDogemlwICs9IC05ciA7CisgICAgfQorICAgIGFjdGlvbnMgcGllY2VtZWFsIFtQQUNLXSB7CisgICAgICAgICIkKHppcCkiICIkKDwpIiAiJCg+KSIKKyAgICB9CisgICAgYWN0aW9ucyBwaWVjZW1lYWwgW1pJUF0geworICAgICAgICAiJCh6aXApIiAiJCg8KSIgIiQoPikiCisgICAgfQorICAgIGFjdGlvbnMgcGllY2VtZWFsIFtDT1BZXSB7CisgICAgICAgIGNvcHkgL1kgIiQoPikiICIkKDwpIiA+TlVMOgorICAgIH0KK30KK2lmICQoVU5JWCkgPSB0cnVlCit7CisgICAgdGFyID89IFsgR0xPQiAkKFBBVEgpIDogc3RhciBic2R0YXIgdGFyIF0gOworICAgIHRhciA9ICQodGFyWzFdKSA7CisgICAgc3dpdGNoICQodGFyOkQ9OlM9KQorICAgIHsKKyAgICAgICAgY2FzZSBzdGFyIDogdGFyICs9IC1jIGFydHlwZT1wYXggLUQgLWQgLXRvLXN0ZG91dCA7CisgICAgICAgIGNhc2UgKiA6IHRhciArPSAtYyAtZiAtIDsKKyAgICB9CisgICAgYWN0aW9ucyBbUEFDS10geworICAgICAgICAiJCh0YXIpIiAiJCg+KSIgfCBnemlwIC1jOSA+ICIkKDwpIgorICAgIH0KKyAgICAjfiBhY3Rpb25zIFtQQUNLXSB7CisgICAgI34gICAgIHRhciBjZiAiJCg8OlM9LnRhcikiICIkKD4pIgorICAgICN+IH0KKyAgICBhY3Rpb25zIFtaSVBdIHsKKyAgICBnemlwIC1jOSAiJCg+KSIgPiAiJCg8KSIKKyAgICB9CisgICAgYWN0aW9ucyBbQ09QWV0geworICAgICAgICBjcCAtUnBmICIkKD4pIiAiJCg8KSIKKyAgICB9Cit9CisKKyMgVGhlIHNpbmdsZSBiaW5hcnksIGNvbXByZXNzZWQuCitydWxlIC5iaW5hcnkKK3sKKyAgICBsb2NhbCB6aXAgOworICAgIGlmICQoT1MpID0gTlQgeyB6aXAgPSAkKCQoPCkuZXhlOlM9LnppcCkgOyB9CisgICAgaWYgJChVTklYKSA9IHRydWUgeyB6aXAgPSAkKCQoPCkuZXhlOlM9LnRneikgOyB9CisgICAgemlwID0gJCh6aXA6Uz0pLSQoVkVSU0lPTiktJChSRUxFQVNFKS0kKHBsYXRmb3JtKSQoemlwOlMpIDsKKyAgICBERVBFTkRTICQoemlwKSA6ICQoJCg8KS5leGUpIDsKKyAgICBERVBFTkRTIGRpc3QgOiAkKHppcCkgOworICAgICN+IExPQ0FURSBvbiAkKHppcCkgPSAkKGxvY2F0ZS10YXJnZXQpIDsKKyAgICBpZiAkKE9TKSA9IE5UIHsgW1pJUF0gJCh6aXApIDogJCgkKDwpLmV4ZSkgOyB9CisgICAgaWYgJChVTklYKSA9IHRydWUgeyBbUEFDS10gJCh6aXApIDogJCgkKDwpLmV4ZSkgOyB9CisgICAgLmNsZWFuICQoemlwKSA7Cit9CisKKyMgUGFja2FnZSBzb21lIGZpbGUuCitydWxlIC5wYWNrYWdlICggZHN0LWRpciA6IHNyYy1maWxlcyArICkKK3sKKyAgICBsb2NhbCBkc3QtZmlsZXMgOworICAgIGxvY2FsIHNyYy1maWxlcy1hY3R1YWwgOworICAgIGZvciBsb2NhbCBzcmMtcGF0aCBpbiAkKHNyYy1maWxlcykKKyAgICB7CisgICAgICAgIGlmICEgWyBHTE9CICQoc3JjLXBhdGg6UCkgOiAkKHNyYy1wYXRoOkIpIF0gfHwgWyBDSEVDS19JRl9GSUxFICQoc3JjLXBhdGgpIF0KKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgc3JjLXN1YmRpciA9ICQoc3JjLXBhdGg6RCkgOworICAgICAgICAgICAgbG9jYWwgc3JjLWZpbGUgPSAkKHNyYy1wYXRoKSA7CisgICAgICAgICAgICB3aGlsZSAkKHNyYy1zdWJkaXI6RCkgeyBzcmMtc3ViZGlyID0gJChzcmMtc3ViZGlyOkQpIDsgfQorICAgICAgICAgICAgaWYgJChzcmMtc3ViZGlyKSA9ICIuLiIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcmMtZmlsZSA9ICQoc3JjLWZpbGU6RD0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdC1maWxlcyArPSAkKHNyYy1maWxlOlI9JChkc3QtZGlyKSkgOworICAgICAgICAgICAgc3JjLWZpbGVzLWFjdHVhbCArPSAkKHNyYy1wYXRoKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsb2NhbCBwYWNrIDsKKyAgICBpZiAkKE9TKSA9IE5UIHsgcGFjayA9ICQoZHN0LWRpcikuemlwIDsgfQorICAgIGlmICQoVU5JWCkgPSB0cnVlIHsgcGFjayA9ICQoZHN0LWRpcikudGd6IDsgfQorCisgICAgREVQRU5EUyBkaXN0IDogJChwYWNrKSA7CisgICAgREVQRU5EUyAkKHBhY2spIDogJChkc3QtZmlsZXMpIDsKKworICAgIGxvY2FsIGRzdC1maWxlcy1xdWV1ZSA9ICQoZHN0LWZpbGVzKSA7CisgICAgZm9yIGxvY2FsIHNyYy1wYXRoIGluICQoc3JjLWZpbGVzLWFjdHVhbCkKKyAgICB7CisgICAgICAgIGxvY2FsIGRzdC1maWxlID0gJChkc3QtZmlsZXMtcXVldWVbMV0pIDsKKyAgICAgICAgZHN0LWZpbGVzLXF1ZXVlID0gJChkc3QtZmlsZXMtcXVldWVbMi1dKSA7CisgICAgICAgIERFUEVORFMgJChkc3QtZmlsZSkgOiAkKHNyYy1wYXRoKSAkKGRzdC1maWxlOkQpIDsKKyAgICAgICAgLm1rZGlyICQoZHN0LWZpbGU6RCkgOworCisgICAgICAgIFtDT1BZXSAkKGRzdC1maWxlKSA6ICQoc3JjLXBhdGgpIDsKKyAgICAgICAgLmNsZWFuICQoZHN0LWZpbGUpIDsKKyAgICB9CisKKyAgICBbUEFDS10gJChwYWNrKSA6ICQoZHN0LWZpbGVzKSA7CisgICAgLmNsZWFuICQocGFjaykgOworfQorCisjIFJQTSBkaXN0cm8gZmlsZS4KK3JwbS10b29sID0gWyBHTE9CICQoUEFUSCkgOiAicnBtYnVpbGQiIF0gOworcnBtLXRvb2wgPz0gWyBHTE9CICQoUEFUSCkgOiAicnBtIiBdIDsKK3JwbS10b29sID0gJChycG0tdG9vbFsxXSkgOworcnVsZSAucnBtICggbmFtZSA6IHNvdXJjZSApCit7CisgICAgbG9jYWwgcnBtLWFyY2ggOworICAgIHN3aXRjaCAkKE9TUExBVCkKKyAgICB7CisgICAgICAgIGNhc2UgWDg2ICAgICAgIDogcnBtLWFyY2ggPz0gaTM4NiA7CisgICAgICAgIGNhc2UgUFBDICAgICAgIDogcnBtLWFyY2ggPz0gcHBjIDsKKyAgICAgICAgY2FzZSBBWFAgICAgICAgOiBycG0tYXJjaCA/PSBhbHBoYSA7CisgICAgICAgICMgbm8gZ3VhcmFudHkgZm9yIHRoZXNlOgorICAgICAgICBjYXNlIElBNjQgICAgICA6IHJwbS1hcmNoID89IGlhNjQgOworICAgICAgICBjYXNlIEFSTSAgICAgICA6IHJwbS1hcmNoID89IGFybSA7CisgICAgICAgIGNhc2UgU1BBUkMgICAgIDogcnBtLWFyY2ggPz0gc3BhcmMgOworICAgICAgICBjYXNlICogICAgICAgICA6IHJwbS1hcmNoID89IG90aGVyIDsKKyAgICB9CisgICAgbG9jYWwgdGFyZ2V0ID0gJChuYW1lKS1ycG0gOworICAgIE5PVEZJTEUgJCh0YXJnZXQpIDsKKyAgICBERVBFTkRTIGRpc3QgOiAkKHRhcmdldCkgOworICAgIERFUEVORFMgJCh0YXJnZXQpIDogJChuYW1lKS4kKHJwbS1hcmNoKS5ycG0gJChuYW1lKS5zcmMucnBtIDsKKyAgICBERVBFTkRTICQobmFtZSkuJChycG0tYXJjaCkucnBtIDogJChzb3VyY2UpIDsKKyAgICBERVBFTkRTICQobmFtZSkuc3JjLnJwbSA6ICQobmFtZSkuJChycG0tYXJjaCkucnBtIDsKKyAgICBkb2NzIG9uICQodGFyZ2V0KSA9ICQoZGlzdC5kb2NzOko9IiAiKSA7CisgICAgYXJjaCBvbiAkKHRhcmdldCkgPSAkKHJwbS1hcmNoKSA7CisgICAgaWYgJChycG0tYXJjaCkgPSBwcGMgeyB0YXJnZXQtb3B0IG9uICQodGFyZ2V0KSA9IC0tdGFyZ2V0PSA7IH0KKyAgICBlbHNlIHsgdGFyZ2V0LW9wdCBvbiAkKHRhcmdldCkgPSAiLS10YXJnZXQgIiA7IH0KKyAgICBbUlBNXSAkKHRhcmdldCkgOiAkKHNvdXJjZSkgOworICAgIC5jbGVhbiAkKG5hbWUpLiQocnBtLWFyY2gpLnJwbSAkKG5hbWUpLnNyYy5ycG0gOworfQorYWN0aW9ucyBbUlBNXSB7CisgICAgc2V0IC1lCisgICAgZXhwb3J0IEJPT1NUX0pBTV9UT09MU0VUPSIkKHRvb2xzZXQpIgorICAgICQocnBtLXRvb2wpIC10YSAkKHRhcmdldC1vcHQpJChhcmNoKSAkKD4pIHwgdGVlIHJwbS5vdXQKKyAgICBjcCBgZ3JlcCAtZSAnXldyb3RlOicgcnBtLm91dCB8IHNlZCAncy9eV3JvdGU6IC8vJ2AgLgorICAgIHJtIC1mIHJwbS5vdXQKK30KKworIyBUaGUgZGlzdHJpYnV0aW9uIHRhcmdldHMuIERvIG5vdCBib3RoZXIgd2l0aCB0aGVtIHVubGVzcyB0aGlzIGlzIGEKKyMgZGlzdHJpYnV0aW9uIGJ1aWxkLgoraWYgZGlzdCBpbiAkKEFSR1YpCit7CisgICAgI34gLmJpbmFyeSBiamFtIDsKKyAgICAucGFja2FnZSAkKE5BTUUpLSQoVkVSU0lPTikgOiAkKGRpc3Quc291cmNlKSA7CisgICAgLnBhY2thZ2UgJChOQU1FKS0kKFZFUlNJT04pLSQoUkVMRUFTRSktJChwbGF0Zm9ybSkgOiAkKGRpc3QuYmluKSA7CisgICAgaWYgJChycG0tdG9vbCkKKyAgICB7CisgICAgICAgICN+IC5ycG0gJChOQU1FKS0kKFZFUlNJT04pLSQoUkVMRUFTRSkgOiAkKE5BTUUpLSQoVkVSU0lPTikudGd6IDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9idWlsZC5zaCBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ3MGVhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9idWlsZC5zaApAQCAtMCwwICsxLDMwMyBAQAorIyEvYmluL3NoCisKKyN+IENvcHlyaWdodCAyMDAyLTIwMDUgUmVuZSBSaXZlcmEuCisjfiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjfiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjfiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyMgUmVzZXQgdGhlIHRvb2xzZXQuCitCT09TVF9KQU1fVE9PTFNFVD0KKworIyBSdW4gYSBjb21tYW5kLCBhbmQgZWNobyBiZWZvcmUgZG9pbmcgc28uIEFsc28gY2hlY2tzIHRoZSBleGl0IHN0YXR1cyBhbmQgcXVpdHMKKyMgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgorZWNob19ydW4gKCkKK3sKKyAgICBlY2hvICIkQCIKKyAgICAkQAorICAgIHI9JD8KKyAgICBpZiB0ZXN0ICRyIC1uZSAwIDsgdGhlbgorICAgICAgICBleGl0ICRyCisgICAgZmkKK30KKworIyBQcmludCBhbiBlcnJvciBtZXNzYWdlLCBhbmQgZXhpdCB3aXRoIGEgc3RhdHVzIG9mIDEuCitlcnJvcl9leGl0ICgpCit7CisgICAgZWNobyAiIyMjIgorICAgIGVjaG8gIiMjIyIgIiRAIgorICAgIGVjaG8gIiMjIyIKKyAgICBlY2hvICIjIyMgWW91IGNhbiBzcGVjaWZ5IHRoZSB0b29sc2V0IGFzIHRoZSBhcmd1bWVudCwgaS5lLjoiCisgICAgZWNobyAiIyMjICAgICAuL2J1aWxkLnNoIGdjYyIKKyAgICBlY2hvICIjIyMiCisgICAgZWNobyAiIyMjIFRvb2xzZXRzIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdCBhcmU6IgorICAgIGVjaG8gIiMjIyAgICAgYWNjLCBjb21vLCBkYXJ3aW4sIGdjYywgaW50ZWwtZGFyd2luLCBpbnRlbC1saW51eCwga2NjLCBreWxpeCwiCisgICAgZWNobyAiIyMjICAgICBtaXBzcHJvLCBtaW5ndyhtc3lzKSwgcGF0aHNjYWxlLCBwZ2ksIHFjYywgc3VuLCBzdW5wcm8sIHRydTY0Y3h4LCB2YWNwcCIKKyAgICBlY2hvICIjIyMiCisgICAgZWNobyAiIyMjIEEgc3BlY2lhbCB0b29sc2V0OyBjYywgaXMgYXZhaWxhYmxlIHdoaWNoIGlzIHVzZWQgYXMgYSBmYWxsYmFjayIKKyAgICBlY2hvICIjIyMgd2hlbiBhIG1vcmUgc3BlY2lmaWMgdG9vbHNldCBpcyBub3QgZm91bmQgYW5kIHRoZSBjYyBjb21tYW5kIGlzIgorICAgIGVjaG8gIiMjIyBkZXRlY3RlZC4gVGhlICdjYycgdG9vbHNldCB3aWxsIHVzZSB0aGUgQ0MsIENGTEFHUywgYW5kIExJQlMiCisgICAgZWNobyAiIyMjIGVudmlyb25tZW50IHZhcmlhYmxlcywgaWYgcHJlc2VudC4iCisgICAgZWNobyAiIyMjIgorICAgIGV4aXQgMQorfQorCisjIENoZWNrIHRoYXQgYSBjb21tYW5kIGlzIGluIHRoZSBQQVRILgordGVzdF9wYXRoICgpCit7CisgICAgaWYgYGNvbW1hbmQgLXYgY29tbWFuZCAxPi9kZXYvbnVsbCAyPi9kZXYvbnVsbGA7IHRoZW4KKyAgICAgICAgY29tbWFuZCAtdiAkMSAxPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAorICAgIGVsc2UKKyAgICAgICAgaGFzaCAkMSAxPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAorICAgIGZpCit9CisKKyMgQ2hlY2sgdGhhdCB0aGUgT1MgbmFtZSwgYXMgcmV0dXJuZWQgYnkgInVuYW1lIiwgaXMgYXMgZ2l2ZW4uCit0ZXN0X3VuYW1lICgpCit7CisgICAgaWYgdGVzdF9wYXRoIHVuYW1lOyB0aGVuCisgICAgICAgIHRlc3QgYHVuYW1lYCA9ICQqCisgICAgZmkKK30KKworIyBUcnkgYW5kIGd1ZXNzIHRoZSB0b29sc2V0IHRvIGJvb3RzdHJhcCB0aGUgYnVpbGQgd2l0aC4uLgorR3Vlc3NfVG9vbHNldCAoKQoreworICAgIGlmIHRlc3QgLXIgL21pbmd3L2Jpbi9nY2MgOyB0aGVuCisgICAgICAgIEJPT1NUX0pBTV9UT09MU0VUPW1pbmd3CisgICAgICAgIEJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9L21pbmd3LworICAgIGVsaWYgdGVzdF91bmFtZSBEYXJ3aW4gOyB0aGVuIEJPT1NUX0pBTV9UT09MU0VUPWRhcndpbgorICAgIGVsaWYgdGVzdF91bmFtZSBJUklYIDsgdGhlbiBCT09TVF9KQU1fVE9PTFNFVD1taXBzcHJvCisgICAgZWxpZiB0ZXN0X3VuYW1lIElSSVg2NCA7IHRoZW4gQk9PU1RfSkFNX1RPT0xTRVQ9bWlwc3BybworICAgIGVsaWYgdGVzdF91bmFtZSBPU0YxIDsgdGhlbiBCT09TVF9KQU1fVE9PTFNFVD10cnU2NGN4eAorICAgIGVsaWYgdGVzdF91bmFtZSBRTlggJiYgdGVzdF9wYXRoIHFjYyA7IHRoZW4gQk9PU1RfSkFNX1RPT0xTRVQ9cWNjCisgICAgZWxpZiB0ZXN0X3BhdGggZ2NjIDsgdGhlbiBCT09TVF9KQU1fVE9PTFNFVD1nY2MKKyAgICBlbGlmIHRlc3RfcGF0aCBpY2MgOyB0aGVuIEJPT1NUX0pBTV9UT09MU0VUPWludGVsLWxpbnV4CisgICAgZWxpZiB0ZXN0IC1yIC9vcHQvaW50ZWwvY2MvOS4wL2Jpbi9pY2N2YXJzLnNoIDsgdGhlbgorICAgICAgICBCT09TVF9KQU1fVE9PTFNFVD1pbnRlbC1saW51eAorICAgICAgICBCT09TVF9KQU1fVE9PTFNFVF9ST09UPS9vcHQvaW50ZWwvY2MvOS4wCisgICAgZWxpZiB0ZXN0IC1yIC9vcHQvaW50ZWxfY2NfODAvYmluL2ljY3ZhcnMuc2ggOyB0aGVuCisgICAgICAgIEJPT1NUX0pBTV9UT09MU0VUPWludGVsLWxpbnV4CisgICAgICAgIEJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9L29wdC9pbnRlbF9jY184MAorICAgIGVsaWYgdGVzdCAtciAvb3B0L2ludGVsL2NvbXBpbGVyNzAvaWEzMi9iaW4vaWNjdmFycy5zaCA7IHRoZW4KKyAgICAgICAgQk9PU1RfSkFNX1RPT0xTRVQ9aW50ZWwtbGludXgKKyAgICAgICAgQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0vb3B0L2ludGVsL2NvbXBpbGVyNzAvaWEzMi8KKyAgICBlbGlmIHRlc3QgLXIgL29wdC9pbnRlbC9jb21waWxlcjYwL2lhMzIvYmluL2ljY3ZhcnMuc2ggOyB0aGVuCisgICAgICAgIEJPT1NUX0pBTV9UT09MU0VUPWludGVsLWxpbnV4CisgICAgICAgIEJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9L29wdC9pbnRlbC9jb21waWxlcjYwL2lhMzIvCisgICAgZWxpZiB0ZXN0IC1yIC9vcHQvaW50ZWwvY29tcGlsZXI1MC9pYTMyL2Jpbi9pY2N2YXJzLnNoIDsgdGhlbgorICAgICAgICBCT09TVF9KQU1fVE9PTFNFVD1pbnRlbC1saW51eAorICAgICAgICBCT09TVF9KQU1fVE9PTFNFVF9ST09UPS9vcHQvaW50ZWwvY29tcGlsZXI1MC9pYTMyLworICAgIGVsaWYgdGVzdF9wYXRoIHBnY2MgOyB0aGVuIEJPT1NUX0pBTV9UT09MU0VUPXBnaQorICAgIGVsaWYgdGVzdF9wYXRoIHBhdGhjYyA7IHRoZW4gQk9PU1RfSkFNX1RPT0xTRVQ9cGF0aHNjYWxlCisgICAgZWxpZiB0ZXN0X3BhdGggeGxjIDsgdGhlbiBCT09TVF9KQU1fVE9PTFNFVD12YWNwcAorICAgIGVsaWYgdGVzdF9wYXRoIGNvbW8gOyB0aGVuIEJPT1NUX0pBTV9UT09MU0VUPWNvbW8KKyAgICBlbGlmIHRlc3RfcGF0aCBLQ0MgOyB0aGVuIEJPT1NUX0pBTV9UT09MU0VUPWtjYworICAgIGVsaWYgdGVzdF9wYXRoIGJjKysgOyB0aGVuIEJPT1NUX0pBTV9UT09MU0VUPWt5bGl4CisgICAgZWxpZiB0ZXN0X3BhdGggYUNDIDsgdGhlbiBCT09TVF9KQU1fVE9PTFNFVD1hY2MKKyAgICBlbGlmIHRlc3RfdW5hbWUgSFAtVVggOyB0aGVuIEJPT1NUX0pBTV9UT09MU0VUPWFjYworICAgIGVsaWYgdGVzdCAtciAvb3B0L1NVTldzcHJvL2Jpbi9jYyA7IHRoZW4KKyAgICAgICAgQk9PU1RfSkFNX1RPT0xTRVQ9c3VucHJvCisgICAgICAgIEJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9L29wdC9TVU5Xc3Byby8KKyAgICAjIFRlc3QgZm9yICJjYyIgYXMgdGhlIGRlZmF1bHQgZmFsbGJhY2suCisgICAgZWxpZiB0ZXN0X3BhdGggJENDIDsgdGhlbiBCT09TVF9KQU1fVE9PTFNFVD1jYworICAgIGVsaWYgdGVzdF9wYXRoIGNjIDsgdGhlbgorICAgICAgICBCT09TVF9KQU1fVE9PTFNFVD1jYworICAgICAgICBDQz1jYworICAgIGZpCisgICAgaWYgdGVzdCAiJEJPT1NUX0pBTV9UT09MU0VUIiA9ICIiIDsgdGhlbgorICAgICAgICBlcnJvcl9leGl0ICJDb3VsZCBub3QgZmluZCBhIHN1aXRhYmxlIHRvb2xzZXQuIgorICAgIGZpCit9CisKKyMgVGhlIG9uZSBvcHRpb24gd2Ugc3VwcG9ydCBpbiB0aGUgaW52b2NhdGlvbgorIyBpcyB0aGUgbmFtZSBvZiB0aGUgdG9vbHNldCB0byBmb3JjZSBidWlsZGluZworIyB3aXRoLgorY2FzZSAiJDEiIGluCisgICAgLS1ndWVzcy10b29sc2V0KSBHdWVzc19Ub29sc2V0IDsgZWNobyAiJEJPT1NUX0pBTV9UT09MU0VUIiA7IGV4aXQgMSA7OworICAgIC0qKSBHdWVzc19Ub29sc2V0IDs7CisgICAgPyopIEJPT1NUX0pBTV9UT09MU0VUPSQxIDsgc2hpZnQgOzsKKyAgICAqKSBHdWVzc19Ub29sc2V0IDs7Citlc2FjCitCT09TVF9KQU1fT1BUX0pBTT0iLW8gYm9vdHN0cmFwL2phbTAiCitCT09TVF9KQU1fT1BUX01LSkFNQkFTRT0iLW8gYm9vdHN0cmFwL21ramFtYmFzZTAiCitCT09TVF9KQU1fT1BUX1lZQUNDPSItbyBib290c3RyYXAveXlhY2MwIgorY2FzZSAkQk9PU1RfSkFNX1RPT0xTRVQgaW4KKyAgICBtaW5ndykKKyAgICBpZiB0ZXN0IC1yICR7Qk9PU1RfSkFNX1RPT0xTRVRfUk9PVH1iaW4vZ2NjIDsgdGhlbgorICAgICAgICBleHBvcnQgUEFUSD0ke0JPT1NUX0pBTV9UT09MU0VUX1JPT1R9YmluOiRQQVRICisgICAgZmkKKyAgICBCT09TVF9KQU1fQ0M9ImdjYyAtRE5UIgorICAgIDs7CisKKyAgICBnY2MpCisgICAgQk9PU1RfSkFNX0NDPWdjYworICAgIDs7CisKKyAgICBkYXJ3aW4pCisgICAgQk9PU1RfSkFNX0NDPWNjCisgICAgOzsKKworICAgIGludGVsLWRhcndpbikKKyAgICBCT09TVF9KQU1fQ0M9aWNjCisgICAgOzsKKworICAgIGludGVsLWxpbnV4KQorICAgIGlmIHRlc3QgLXIgL29wdC9pbnRlbC9jYy85LjAvYmluL2ljY3ZhcnMuc2ggOyB0aGVuCisgICAgICAgIEJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9L29wdC9pbnRlbC9jYy85LjAvCisgICAgZWxpZiB0ZXN0IC1yIC9vcHQvaW50ZWxfY2NfODAvYmluL2ljY3ZhcnMuc2ggOyB0aGVuCisgICAgICAgIEJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9L29wdC9pbnRlbF9jY184MC8KKyAgICBlbGlmIHRlc3QgLXIgL29wdC9pbnRlbC9jb21waWxlcjcwL2lhMzIvYmluL2ljY3ZhcnMuc2ggOyB0aGVuCisgICAgICAgIEJPT1NUX0pBTV9UT09MU0VUX1JPT1Q9L29wdC9pbnRlbC9jb21waWxlcjcwL2lhMzIvCisgICAgZWxpZiB0ZXN0IC1yIC9vcHQvaW50ZWwvY29tcGlsZXI2MC9pYTMyL2Jpbi9pY2N2YXJzLnNoIDsgdGhlbgorICAgICAgICBCT09TVF9KQU1fVE9PTFNFVF9ST09UPS9vcHQvaW50ZWwvY29tcGlsZXI2MC9pYTMyLworICAgIGVsaWYgdGVzdCAtciAvb3B0L2ludGVsL2NvbXBpbGVyNTAvaWEzMi9iaW4vaWNjdmFycy5zaCA7IHRoZW4KKyAgICAgICAgQk9PU1RfSkFNX1RPT0xTRVRfUk9PVD0vb3B0L2ludGVsL2NvbXBpbGVyNTAvaWEzMi8KKyAgICBmaQorICAgIGlmIHRlc3QgLXIgJHtCT09TVF9KQU1fVE9PTFNFVF9ST09UfWJpbi9pY2N2YXJzLnNoIDsgdGhlbgorICAgICAgICAjIGljY3ZhcnMgZG9lcyBub3QgY2hhbmdlIExEX1JVTl9QQVRILiBXZSBhZGp1c3QgTERfUlVOX1BBVEggaGVyZSBpbgorICAgICAgICAjIG9yZGVyIG5vdCB0byBoYXZlIHRvIHJlbHkgb24gbGQuc28uY29uZiBrbm93aW5nIHRoZSBpY2MgbGlicmFyeQorICAgICAgICAjIGRpcmVjdG9yeS4gV2UgZG8gdGhpcyBiZWZvcmUgcnVubmluZyBpY2N2YXJzLnNoIGluIG9yZGVyIHRvIGFsbG93IGEKKyAgICAgICAgIyB1c2VyIHRvIGFkZCBtb2RpZmljYXRpb25zIHRvIExEX1JVTl9QQVRIIGluIGljY3ZhcnMuc2guCisgICAgICAgIGlmIHRlc3QgLXogIiR7TERfUlVOX1BBVEh9IjsgdGhlbgorICAgICAgICAgICAgTERfUlVOX1BBVEg9IiR7Qk9PU1RfSkFNX1RPT0xTRVRfUk9PVH1saWIiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExEX1JVTl9QQVRIPSIke0JPT1NUX0pBTV9UT09MU0VUX1JPT1R9bGliOiR7TERfUlVOX1BBVEh9IgorICAgICAgICBmaQorICAgICAgICBleHBvcnQgTERfUlVOX1BBVEgKKyAgICAgICAgLiAke0JPT1NUX0pBTV9UT09MU0VUX1JPT1R9YmluL2ljY3ZhcnMuc2gKKyAgICBmaQorICAgIEJPT1NUX0pBTV9DQz1pY2MKKyAgICA7OworCisgICAgdmFjcHApCisgICAgQk9PU1RfSkFNX0NDPXhsYworICAgIDs7CisKKyAgICBjb21vKQorICAgIEJPT1NUX0pBTV9DQz0iY29tbyAtLWMiCisgICAgOzsKKworICAgIGtjYykKKyAgICBCT09TVF9KQU1fQ0M9S0NDCisgICAgOzsKKworICAgIGt5bGl4KQorICAgIEJPT1NUX0pBTV9DQz1iYysrCisgICAgOzsKKworICAgIG1pcHNwcm8pCisgICAgQk9PU1RfSkFNX0NDPWNjCisgICAgOzsKKworICAgIHBhdGhzY2FsZSkKKyAgICBCT09TVF9KQU1fQ0M9cGF0aGNjCisgICAgOzsKKworICAgIHBnaSkKKyAgICBCT09TVF9KQU1fQ0M9cGdjYworICAgIDs7CisKKyAgICBzdW4qKQorICAgIGlmIHRlc3QgLXogIiR7Qk9PU1RfSkFNX1RPT0xTRVRfUk9PVH0iIC1hIC1yIC9vcHQvU1VOV3Nwcm8vYmluL2NjIDsgdGhlbgorICAgICAgICBCT09TVF9KQU1fVE9PTFNFVF9ST09UPS9vcHQvU1VOV3Nwcm8vCisgICAgZmkKKyAgICBpZiB0ZXN0IC1yICIke0JPT1NUX0pBTV9UT09MU0VUX1JPT1R9YmluL2NjIiA7IHRoZW4KKyAgICAgICAgUEFUSD0ke0JPT1NUX0pBTV9UT09MU0VUX1JPT1R9YmluOiR7UEFUSH0KKyAgICAgICAgZXhwb3J0IFBBVEgKKyAgICBmaQorICAgIEJPT1NUX0pBTV9DQz1jYworICAgIDs7CisKKyAgICBjbGFuZyopCisgICAgQk9PU1RfSkFNX0NDPSJjbGFuZyAtV25vLXVudXNlZCAtV25vLWZvcm1hdCIKKyAgICBCT09TVF9KQU1fVE9PTFNFVD1jbGFuZworICAgIDs7CisKKyAgICB0cnU2NGN4eCkKKyAgICBCT09TVF9KQU1fQ0M9Y2MKKyAgICA7OworCisgICAgYWNjKQorICAgIEJPT1NUX0pBTV9DQz0iY2MgLUFlIgorICAgIDs7CisKKyAgICBjYykKKyAgICBpZiB0ZXN0IC16ICIkQ0MiIDsgdGhlbiBDQz1jYyA7IGZpCisgICAgQk9PU1RfSkFNX0NDPSRDQworICAgIEJPT1NUX0pBTV9PUFRfSkFNPSIkQk9PU1RfSkFNX09QVF9KQU0gJENGTEFHUyAkTElCUyIKKyAgICBCT09TVF9KQU1fT1BUX01LSkFNQkFTRT0iJEJPT1NUX0pBTV9PUFRfTUtKQU1CQVNFICRDRkxBR1MgJExJQlMiCisgICAgQk9PU1RfSkFNX09QVF9ZWUFDQz0iJEJPT1NUX0pBTV9PUFRfWVlBQ0MgJENGTEFHUyAkTElCUyIKKyAgICA7OworCisgICAgcWNjKQorICAgIEJPT1NUX0pBTV9DQz1xY2MKKyAgICA7OworCisgICAgKikKKyAgICBlcnJvcl9leGl0ICJVbmtub3duIHRvb2xzZXQ6ICRCT09TVF9KQU1fVE9PTFNFVCIKKyAgICA7OworZXNhYworCitlY2hvICIjIyMiCitlY2hvICIjIyMgVXNpbmcgJyRCT09TVF9KQU1fVE9PTFNFVCcgdG9vbHNldC4iCitlY2hvICIjIyMiCisKK1lZQUNDX1NPVVJDRVM9Inl5YWNjLmMiCitNS0pBTUJBU0VfU09VUkNFUz0ibWtqYW1iYXNlLmMiCitCSkFNX1NPVVJDRVM9IlwKKyBjb21tYW5kLmMgY29tcGlsZS5jIGNvbnN0YW50cy5jIGRlYnVnLmMgZXhlY2NtZC5jIGZyYW1lcy5jIGZ1bmN0aW9uLmMgZ2xvYi5jXAorIGhhc2guYyBoZHJtYWNyby5jIGhlYWRlcnMuYyBqYW0uYyBqYW1iYXNlLmMgamFtZ3JhbS5jIGxpc3RzLmMgbWFrZS5jIG1ha2UxLmNcCisgb2JqZWN0LmMgb3B0aW9uLmMgb3V0cHV0LmMgcGFyc2UuYyBwYXRoc3lzLmMgcmVnZXhwLmMgcnVsZXMuY1wKKyBzY2FuLmMgc2VhcmNoLmMgc3Vic3QuYyB0aW1lc3RhbXAuYyB2YXJpYWJsZS5jIG1vZHVsZXMuYyBzdHJpbmdzLmMgZmlsZXN5cy5jXAorIGJ1aWx0aW5zLmMgY2xhc3MuYyBjd2QuYyBuYXRpdmUuYyBtZDUuYyB3MzJfZ2V0cmVnLmMgbW9kdWxlcy9zZXQuY1wKKyBtb2R1bGVzL3BhdGguYyBtb2R1bGVzL3JlZ2V4LmMgbW9kdWxlcy9wcm9wZXJ0eS1zZXQuYyBtb2R1bGVzL3NlcXVlbmNlLmNcCisgbW9kdWxlcy9vcmRlci5jIgorY2FzZSAkQk9PU1RfSkFNX1RPT0xTRVQgaW4KKyAgICBtaW5ndykKKyAgICBCSkFNX1NPVVJDRVM9IiR7QkpBTV9TT1VSQ0VTfSBleGVjbnQuYyBmaWxlbnQuYyBwYXRobnQuYyIKKyAgICA7OworCisgICAgKikKKyAgICBCSkFNX1NPVVJDRVM9IiR7QkpBTV9TT1VSQ0VTfSBleGVjdW5peC5jIGZpbGV1bml4LmMgcGF0aHVuaXguYyIKKyAgICA7OworZXNhYworCitCSkFNX1VQREFURT0KK2lmIHRlc3QgIiQxIiA9ICItLXVwZGF0ZSIgLW8gIiQyIiA9ICItLXVwZGF0ZSIgLW8gIiQzIiA9ICItLXVwZGF0ZSIgLW8gIiQ0IiA9ICItLXVwZGF0ZSIgOyB0aGVuCisgICAgQkpBTV9VUERBVEU9InVwZGF0ZSIKK2ZpCitpZiB0ZXN0ICIke0JKQU1fVVBEQVRFfSIgPSAidXBkYXRlIiAtYSAhIC14ICIuL2Jvb3RzdHJhcC9qYW0wIiA7IHRoZW4KKyAgICBCSkFNX1VQREFURT0KK2ZpCisKK2lmIHRlc3QgIiR7QkpBTV9VUERBVEV9IiAhPSAidXBkYXRlIiA7IHRoZW4KKyAgICBlY2hvX3J1biBybSAtcmYgYm9vdHN0cmFwCisgICAgZWNob19ydW4gbWtkaXIgYm9vdHN0cmFwCisgICAgaWYgdGVzdCAhIC1yIGphbWdyYW0ueSAtbyAhIC1yIGphbWdyYW10YWIuaCA7IHRoZW4KKyAgICAgICAgZWNob19ydW4gJHtCT09TVF9KQU1fQ0N9ICR7Qk9PU1RfSkFNX09QVF9ZWUFDQ30gJHtZWUFDQ19TT1VSQ0VTfQorICAgICAgICBpZiB0ZXN0IC14ICIuL2Jvb3RzdHJhcC95eWFjYzAiIDsgdGhlbgorICAgICAgICAgICAgZWNob19ydW4gLi9ib290c3RyYXAveXlhY2MwIGphbWdyYW0ueSBqYW1ncmFtdGFiLmggamFtZ3JhbS55eQorICAgICAgICBmaQorICAgIGZpCisgICAgaWYgdGVzdCAhIC1yIGphbWdyYW0uYyAtbyAhIC1yIGphbWdyYW0uaCA7IHRoZW4KKyAgICAgICAgaWYgdGVzdF9wYXRoIHlhY2MgOyB0aGVuIFlBQ0M9InlhY2MgLWQiCisgICAgICAgIGVsaWYgdGVzdF9wYXRoIGJpc29uIDsgdGhlbiBZQUNDPSJiaXNvbiAteSAtZCAtLXlhY2MiCisgICAgICAgIGZpCisgICAgICAgIGVjaG9fcnVuICRZQUNDIGphbWdyYW0ueQorICAgICAgICBtdiAtZiB5LnRhYi5jIGphbWdyYW0uYworICAgICAgICBtdiAtZiB5LnRhYi5oIGphbWdyYW0uaAorICAgIGZpCisgICAgaWYgdGVzdCAhIC1yIGphbWJhc2UuYyA7IHRoZW4KKyAgICAgICAgZWNob19ydW4gJHtCT09TVF9KQU1fQ0N9ICR7Qk9PU1RfSkFNX09QVF9NS0pBTUJBU0V9ICR7TUtKQU1CQVNFX1NPVVJDRVN9CisgICAgICAgIGlmIHRlc3QgLXggIi4vYm9vdHN0cmFwL21ramFtYmFzZTAiIDsgdGhlbgorICAgICAgICAgICAgZWNob19ydW4gLi9ib290c3RyYXAvbWtqYW1iYXNlMCBqYW1iYXNlLmMgSmFtYmFzZQorICAgICAgICBmaQorICAgIGZpCisgICAgZWNob19ydW4gJHtCT09TVF9KQU1fQ0N9ICR7Qk9PU1RfSkFNX09QVF9KQU19ICR7QkpBTV9TT1VSQ0VTfQorZmkKK2lmIHRlc3QgLXggIi4vYm9vdHN0cmFwL2phbTAiIDsgdGhlbgorICAgIGlmIHRlc3QgIiR7QkpBTV9VUERBVEV9IiAhPSAidXBkYXRlIiA7IHRoZW4KKyAgICAgICAgZWNob19ydW4gLi9ib290c3RyYXAvamFtMCAtZiBidWlsZC5qYW0gLS10b29sc2V0PSRCT09TVF9KQU1fVE9PTFNFVCAiLS10b29sc2V0LXJvb3Q9JEJPT1NUX0pBTV9UT09MU0VUX1JPT1QiICIkQCIgY2xlYW4KKyAgICBmaQorICAgIGVjaG9fcnVuIC4vYm9vdHN0cmFwL2phbTAgLWYgYnVpbGQuamFtIC0tdG9vbHNldD0kQk9PU1RfSkFNX1RPT0xTRVQgIi0tdG9vbHNldC1yb290PSRCT09TVF9KQU1fVE9PTFNFVF9ST09UIiAiJEAiCitmaQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvYnVpbHRpbnMuYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2J1aWx0aW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxMzBiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2J1aWx0aW5zLmMKQEAgLTAsMCArMSwyMzU0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTMtMjAwMiBDaHJpc3RvcGhlciBTZWl3YWxkIGFuZCBQZXJmb3JjZSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKyNpbmNsdWRlICJqYW0uaCIKKyNpbmNsdWRlICJidWlsdGlucy5oIgorCisjaW5jbHVkZSAiY29tcGlsZS5oIgorI2luY2x1ZGUgImNvbnN0YW50cy5oIgorI2luY2x1ZGUgImN3ZC5oIgorI2luY2x1ZGUgImZpbGVzeXMuaCIKKyNpbmNsdWRlICJmcmFtZXMuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAiaGRybWFjcm8uaCIKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgIm1ha2UuaCIKKyNpbmNsdWRlICJtZDUuaCIKKyNpbmNsdWRlICJuYXRpdmUuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJwYXJzZS5oIgorI2luY2x1ZGUgInBhdGhzeXMuaCIKKyNpbmNsdWRlICJydWxlcy5oIgorI2luY2x1ZGUgInN0cmluZ3MuaCIKKyNpbmNsdWRlICJzdWJzdC5oIgorI2luY2x1ZGUgInRpbWVzdGFtcC5oIgorI2luY2x1ZGUgInZhcmlhYmxlLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaWYgZGVmaW5lZChVU0VfRVhFQ1VOSVgpCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2Vsc2UKKy8qCisgKiBOVCBkb2VzIG5vdCBoYXZlIHdhaXQoKSBhbmQgYXNzb2NpYXRlZCBtYWNyb3MgYW5kIHVzZXMgdGhlIHN5c3RlbSgpIHJldHVybgorICogdmFsdWUgaW5zdGVhZC4gU3RhdHVzIGNvZGUgZ3JvdXAgYXJlIGRvY3VtZW50ZWQgYXQ6CisgKiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLWdiL2xpYnJhcnkvZmY1NjU0MzYuYXNweAorICovCisjIGRlZmluZSBXSUZFWElURUQodykgICgoKHcpICYgMFhGRkZGRkYwMCkgPT0gMCkKKyMgZGVmaW5lIFdFWElUU1RBVFVTKHcpKHcpCisjZW5kaWYKKworLyoKKyAqIGJ1aWx0aW5zLmMgLSBidWlsdGluIGphbSBydWxlcworICoKKyAqIEV4dGVybmFsIHJvdXRpbmVzOgorICogIGxvYWRfYnVpbHRpbnMoKSAgICAgICAgICAgICAgIC0gZGVmaW5lIGJ1aWx0aW4gcnVsZXMKKyAqICB1bmtub3duX3J1bGUoKSAgICAgICAgICAgICAgICAtIHJlcG9ydHMgYW4gdW5rbm93biBydWxlIG9jY3VycmVuY2UgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGFuZCBleGl0cworICoKKyAqIEludGVybmFsIHJvdXRpbmVzOgorICogIGFwcGVuZF9pZl9leGlzdHMoKSAgICAgICAgICAgIC0gaWYgZmlsZSBleGlzdHMsIGFwcGVuZCBpdCB0byB0aGUgbGlzdAorICogIGJ1aWx0aW5fY2FsYygpICAgICAgICAgICAgICAgIC0gQ0FMQyBydWxlCisgKiAgYnVpbHRpbl9kZWxldGVfbW9kdWxlKCkgICAgICAgLSBERUxFVEVfTU9EVUxFICggTU9EVUxFID8gKQorICogIGJ1aWx0aW5fZGVwZW5kcygpICAgICAgICAgICAgIC0gREVQRU5EUy9JTkNMVURFUyBydWxlCisgKiAgYnVpbHRpbl9lY2hvKCkgICAgICAgICAgICAgICAgLSBFQ0hPIHJ1bGUKKyAqICBidWlsdGluX2V4aXQoKSAgICAgICAgICAgICAgICAtIEVYSVQgcnVsZQorICogIGJ1aWx0aW5fZXhwb3J0KCkgICAgICAgICAgICAgIC0gRVhQT1JUICggTU9EVUxFID8gOiBSVUxFUyAqICkKKyAqICBidWlsdGluX2ZsYWdzKCkgICAgICAgICAgICAgICAtIE5PQ0FSRSwgTk9URklMRSwgVEVNUE9SQVJZIHJ1bGUKKyAqICBidWlsdGluX2dsb2IoKSAgICAgICAgICAgICAgICAtIEdMT0IgcnVsZQorICogIGJ1aWx0aW5fZ2xvYl9yZWN1cnNpdmUoKSAgICAgIC0gPz8/CisgKiAgYnVpbHRpbl9oZHJtYWNybygpICAgICAgICAgICAgLSA/Pz8KKyAqICBidWlsdGluX2ltcG9ydCgpICAgICAgICAgICAgICAtIElNUE9SVCBydWxlCisgKiAgYnVpbHRpbl9tYXRjaCgpICAgICAgICAgICAgICAgLSBNQVRDSCBydWxlLCByZWdleHAgbWF0Y2hpbmcKKyAqICBidWlsdGluX3JlYnVpbGRzKCkgICAgICAgICAgICAtIFJFQlVJTERTIHJ1bGUKKyAqICBidWlsdGluX3J1bGVuYW1lcygpICAgICAgICAgICAtIFJVTEVOQU1FUyAoIE1PRFVMRSA/ICkKKyAqICBidWlsdGluX3NwbGl0X2J5X2NoYXJhY3RlcnMoKSAtIHNwbGl0cyB0aGUgZ2l2ZW4gc3RyaW5nIGludG8gdG9rZW5zCisgKiAgYnVpbHRpbl92YXJuYW1lcygpICAgICAgICAgICAgLSBWQVJOQU1FUyAoIE1PRFVMRSA/ICkKKyAqICBnZXRfc291cmNlX2xpbmUoKSAgICAgICAgICAgICAtIGdldCBhIGZyYW1lJ3MgZmlsZSBhbmQgbGluZSBudW1iZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uCisgKi8KKworCisvKgorICogY29tcGlsZV9idWlsdGluKCkgLSBkZWZpbmUgYnVpbHRpbiBydWxlcworICovCisKKyNkZWZpbmUgUDAgKFBBUlNFICopMAorI2RlZmluZSBDMCAoT0JKRUNUICopMAorCisjaWYgZGVmaW5lZCggT1NfTlQgKSB8fCBkZWZpbmVkKCBPU19DWUdXSU4gKQorICAgIExJU1QgKiBidWlsdGluX3N5c3RlbV9yZWdpc3RyeSAgICAgICggRlJBTUUgKiwgaW50ICk7CisgICAgTElTVCAqIGJ1aWx0aW5fc3lzdGVtX3JlZ2lzdHJ5X25hbWVzKCBGUkFNRSAqLCBpbnQgKTsKKyNlbmRpZgorCitpbnQgZ2xvYiggY2hhciBjb25zdCAqIHMsIGNoYXIgY29uc3QgKiBjICk7CisKK3ZvaWQgYmFja3RyYWNlICAgICAgICAoIEZSQU1FICogKTsKK3ZvaWQgYmFja3RyYWNlX2xpbmUgICAoIEZSQU1FICogKTsKK3ZvaWQgcHJpbnRfc291cmNlX2xpbmUoIEZSQU1FICogKTsKKworCitSVUxFICogYmluZF9idWlsdGluKCBjaGFyIGNvbnN0ICogbmFtZV8sIExJU1QgKiAoKiBmKSggRlJBTUUgKiwgaW50IGZsYWdzICksCisgICAgaW50IGZsYWdzLCBjaGFyIGNvbnN0ICogKiBhcmdzICkKK3sKKyAgICBGVU5DVElPTiAqIGZ1bmM7CisgICAgUlVMRSAqIHJlc3VsdDsKKyAgICBPQkpFQ1QgKiBuYW1lID0gb2JqZWN0X25ldyggbmFtZV8gKTsKKworICAgIGZ1bmMgPSBmdW5jdGlvbl9idWlsdGluKCBmLCBmbGFncywgYXJncyApOworCisgICAgcmVzdWx0ID0gbmV3X3J1bGVfYm9keSggcm9vdF9tb2R1bGUoKSwgbmFtZSwgZnVuYywgMSApOworCisgICAgZnVuY3Rpb25fZnJlZSggZnVuYyApOworCisgICAgb2JqZWN0X2ZyZWUoIG5hbWUgKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworUlVMRSAqIGR1cGxpY2F0ZV9ydWxlKCBjaGFyIGNvbnN0ICogbmFtZV8sIFJVTEUgKiBvdGhlciApCit7CisgICAgT0JKRUNUICogbmFtZSA9IG9iamVjdF9uZXcoIG5hbWVfICk7CisgICAgUlVMRSAqIHJlc3VsdCA9IGltcG9ydF9ydWxlKCBvdGhlciwgcm9vdF9tb2R1bGUoKSwgbmFtZSApOworICAgIG9iamVjdF9mcmVlKCBuYW1lICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogIGxvYWRfYnVpbHRpbnMoKSAtIGRlZmluZSBidWlsdGluIHJ1bGVzCisgKi8KKwordm9pZCBsb2FkX2J1aWx0aW5zKCkKK3sKKyAgICBkdXBsaWNhdGVfcnVsZSggIkFsd2F5cyIsCisgICAgICBiaW5kX2J1aWx0aW4oICJBTFdBWVMiLAorICAgICAgICAgICAgICAgICAgICBidWlsdGluX2ZsYWdzLCBUX0ZMQUdfVE9VQ0hFRCwgMCApICk7CisKKyAgICBkdXBsaWNhdGVfcnVsZSggIkRlcGVuZHMiLAorICAgICAgYmluZF9idWlsdGluKCAiREVQRU5EUyIsCisgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fZGVwZW5kcywgMCwgMCApICk7CisKKyAgICBkdXBsaWNhdGVfcnVsZSggImVjaG8iLAorICAgIGR1cGxpY2F0ZV9ydWxlKCAiRWNobyIsCisgICAgICBiaW5kX2J1aWx0aW4oICJFQ0hPIiwKKyAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9lY2hvLCAwLCAwICkgKSApOworCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAibWVzc2FnZSIsICIqIiwgIjoiLCAicmVzdWx0LXZhbHVlIiwgIj8iLCAwIH07CisgICAgICAgIGR1cGxpY2F0ZV9ydWxlKCAiZXhpdCIsCisgICAgICAgIGR1cGxpY2F0ZV9ydWxlKCAiRXhpdCIsCisgICAgICAgICAgYmluZF9idWlsdGluKCAiRVhJVCIsCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX2V4aXQsIDAsIGFyZ3MgKSApICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAiZGlyZWN0b3JpZXMiLCAiKiIsICI6IiwgInBhdHRlcm5zIiwgIioiLCAiOiIsCisgICAgICAgICAgICAiY2FzZS1pbnNlbnNpdGl2ZSIsICI/IiwgMCB9OworICAgICAgICBkdXBsaWNhdGVfcnVsZSggIkdsb2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZF9idWlsdGluKCAiR0xPQiIsIGJ1aWx0aW5fZ2xvYiwgMCwgYXJncyApICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAicGF0dGVybnMiLCAiKiIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiR0xPQi1SRUNVUlNJVkVMWSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9nbG9iX3JlY3Vyc2l2ZSwgMCwgYXJncyApOworICAgIH0KKworICAgIGR1cGxpY2F0ZV9ydWxlKCAiSW5jbHVkZXMiLAorICAgICAgYmluZF9idWlsdGluKCAiSU5DTFVERVMiLAorICAgICAgICAgICAgICAgICAgICBidWlsdGluX2RlcGVuZHMsIDEsIDAgKSApOworCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAidGFyZ2V0cyIsICIqIiwgIjoiLCAidGFyZ2V0cy10by1yZWJ1aWxkIiwgIioiLAorICAgICAgICAgICAgMCB9OworICAgICAgICBiaW5kX2J1aWx0aW4oICJSRUJVSUxEUyIsCisgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9yZWJ1aWxkcywgMCwgYXJncyApOworICAgIH0KKworICAgIGR1cGxpY2F0ZV9ydWxlKCAiTGVhdmVzIiwKKyAgICAgIGJpbmRfYnVpbHRpbiggIkxFQVZFUyIsCisgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fZmxhZ3MsIFRfRkxBR19MRUFWRVMsIDAgKSApOworCisgICAgZHVwbGljYXRlX3J1bGUoICJNYXRjaCIsCisgICAgICBiaW5kX2J1aWx0aW4oICJNQVRDSCIsCisgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fbWF0Y2gsIDAsIDAgKSApOworCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAic3RyaW5nIiwgIjoiLCAiZGVsaW1pdGVycyIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiU1BMSVRfQllfQ0hBUkFDVEVSUyIsCisgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9zcGxpdF9ieV9jaGFyYWN0ZXJzLCAwLCBhcmdzICk7CisgICAgfQorCisgICAgZHVwbGljYXRlX3J1bGUoICJOb0NhcmUiLAorICAgICAgYmluZF9idWlsdGluKCAiTk9DQVJFIiwKKyAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9mbGFncywgVF9GTEFHX05PQ0FSRSwgMCApICk7CisKKyAgICBkdXBsaWNhdGVfcnVsZSggIk5PVElNRSIsCisgICAgZHVwbGljYXRlX3J1bGUoICJOb3RGaWxlIiwKKyAgICAgIGJpbmRfYnVpbHRpbiggIk5PVEZJTEUiLAorICAgICAgICAgICAgICAgICAgICBidWlsdGluX2ZsYWdzLCBUX0ZMQUdfTk9URklMRSwgMCApICkgKTsKKworICAgIGR1cGxpY2F0ZV9ydWxlKCAiTm9VcGRhdGUiLAorICAgICAgYmluZF9idWlsdGluKCAiTk9VUERBVEUiLAorICAgICAgICAgICAgICAgICAgICBidWlsdGluX2ZsYWdzLCBUX0ZMQUdfTk9VUERBVEUsIDAgKSApOworCisgICAgZHVwbGljYXRlX3J1bGUoICJUZW1wb3JhcnkiLAorICAgICAgYmluZF9idWlsdGluKCAiVEVNUE9SQVJZIiwKKyAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9mbGFncywgVF9GTEFHX1RFTVAsIDAgKSApOworCisgICAgICBiaW5kX2J1aWx0aW4oICJJU0ZJTEUiLAorICAgICAgICAgICAgICAgICAgICBidWlsdGluX2ZsYWdzLCBUX0ZMQUdfSVNGSUxFLCAwICk7CisKKyAgICBkdXBsaWNhdGVfcnVsZSggIkhkck1hY3JvIiwKKyAgICAgIGJpbmRfYnVpbHRpbiggIkhEUk1BQ1JPIiwKKyAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9oZHJtYWNybywgMCwgMCApICk7CisKKyAgICAvKiBGQUlMX0VYUEVDVEVEIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVzdWx0IG9mIGEgdGFyZ2V0IGJ1aWxkCisgICAgICogYWN0aW9uIHNob3VsZCBiZSBpbnZlcnRlZCAob2sgPD0+IGZhaWwpIHRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuCisgICAgICogcGVyZm9ybWluZyB0ZXN0IHJ1bnMgZnJvbSBKYW1maWxlcy4KKyAgICAgKi8KKyAgICBiaW5kX2J1aWx0aW4oICJGQUlMX0VYUEVDVEVEIiwKKyAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fZmxhZ3MsIFRfRkxBR19GQUlMX0VYUEVDVEVELCAwICk7CisKKyAgICBiaW5kX2J1aWx0aW4oICJSTU9MRCIsCisgICAgICAgICAgICAgICAgICBidWlsdGluX2ZsYWdzLCBUX0ZMQUdfUk1PTEQsIDAgKTsKKworICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgInRhcmdldHMiLCAiKiIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiVVBEQVRFIiwKKyAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX3VwZGF0ZSwgMCwgYXJncyApOworICAgIH0KKworICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgInRhcmdldHMiLCAiKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiLCAibG9nIiwgIj8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IiwgImlnbm9yZS1taW51cy1uIiwgIj8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IiwgImlnbm9yZS1taW51cy1xIiwgIj8iLCAwIH07CisgICAgICAgIGJpbmRfYnVpbHRpbiggIlVQREFURV9OT1ciLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fdXBkYXRlX25vdywgMCwgYXJncyApOworICAgIH0KKworICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgInN0cmluZyIsICJwYXR0ZXJuIiwgInJlcGxhY2VtZW50cyIsICIrIiwgMCB9OworICAgICAgICBkdXBsaWNhdGVfcnVsZSggInN1YnN0IiwKKyAgICAgICAgICBiaW5kX2J1aWx0aW4oICJTVUJTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX3N1YnN0LCAwLCBhcmdzICkgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJtb2R1bGUiLCAiPyIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiUlVMRU5BTUVTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9ydWxlbmFtZXMsIDAsIGFyZ3MgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJtb2R1bGUiLCAiPyIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiVkFSTkFNRVMiLAorICAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX3Zhcm5hbWVzLCAwLCBhcmdzICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAibW9kdWxlIiwgIj8iLCAwIH07CisgICAgICAgIGJpbmRfYnVpbHRpbiggIkRFTEVURV9NT0RVTEUiLAorICAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX2RlbGV0ZV9tb2R1bGUsIDAsIGFyZ3MgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJzb3VyY2VfbW9kdWxlIiwgIj8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IiwgInNvdXJjZV9ydWxlcyIsICIqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiIsICJ0YXJnZXRfbW9kdWxlIiwgIj8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IiwgInRhcmdldF9ydWxlcyIsICIqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiIsICJsb2NhbGl6ZSIsICI/IiwgMCB9OworICAgICAgICBiaW5kX2J1aWx0aW4oICJJTVBPUlQiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5faW1wb3J0LCAwLCBhcmdzICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAibW9kdWxlIiwgIj8iLCAiOiIsICJydWxlcyIsICIqIiwgMCB9OworICAgICAgICBiaW5kX2J1aWx0aW4oICJFWFBPUlQiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fZXhwb3J0LCAwLCBhcmdzICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAibGV2ZWxzIiwgIj8iLCAwIH07CisgICAgICAgIGJpbmRfYnVpbHRpbiggIkNBTExFUl9NT0RVTEUiLAorICAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX2NhbGxlcl9tb2R1bGUsIDAsIGFyZ3MgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJsZXZlbHMiLCAiPyIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiQkFDS1RSQUNFIiwKKyAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX2JhY2t0cmFjZSwgMCwgYXJncyApOworICAgIH0KKworICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgMCB9OworICAgICAgICBiaW5kX2J1aWx0aW4oICJQV0QiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fcHdkLCAwLCBhcmdzICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAibW9kdWxlc190b19pbXBvcnQiLCAiKyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiLCAidGFyZ2V0X21vZHVsZSIsICI/IiwgMCB9OworICAgICAgICBiaW5kX2J1aWx0aW4oICJJTVBPUlRfTU9EVUxFIiwKKyAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX2ltcG9ydF9tb2R1bGUsIDAsIGFyZ3MgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJtb2R1bGUiLCAiPyIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiSU1QT1JURURfTU9EVUxFUyIsCisgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9pbXBvcnRlZF9tb2R1bGVzLCAwLCBhcmdzICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAiaW5zdGFuY2VfbW9kdWxlIiwgIjoiLCAiY2xhc3NfbW9kdWxlIiwgMCB9OworICAgICAgICBiaW5kX2J1aWx0aW4oICJJTlNUQU5DRSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9pbnN0YW5jZSwgMCwgYXJncyApOworICAgIH0KKworICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgInNlcXVlbmNlIiwgIioiLCAwIH07CisgICAgICAgIGJpbmRfYnVpbHRpbiggIlNPUlQiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fc29ydCwgMCwgYXJncyApOworICAgIH0KKworICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgInBhdGhfcGFydHMiLCAiKiIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiTk9STUFMSVpFX1BBVEgiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fbm9ybWFsaXplX3BhdGgsIDAsIGFyZ3MgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJhcmdzIiwgIioiLCAwIH07CisgICAgICAgIGJpbmRfYnVpbHRpbiggIkNBTEMiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fY2FsYywgMCwgYXJncyApOworICAgIH0KKworICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgIm1vZHVsZSIsICI6IiwgInJ1bGUiLCAwIH07CisgICAgICAgIGJpbmRfYnVpbHRpbiggIk5BVElWRV9SVUxFIiwKKyAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX25hdGl2ZV9ydWxlLCAwLCBhcmdzICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAibW9kdWxlIiwgIjoiLCAicnVsZSIsICI6IiwgInZlcnNpb24iLCAwIH07CisgICAgICAgIGJpbmRfYnVpbHRpbiggIkhBU19OQVRJVkVfUlVMRSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9oYXNfbmF0aXZlX3J1bGUsIDAsIGFyZ3MgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJtb2R1bGUiLCAiKiIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiVVNFUl9NT0RVTEUiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fdXNlcl9tb2R1bGUsIDAsIGFyZ3MgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7IDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiTkVBUkVTVF9VU0VSX0xPQ0FUSU9OIiwKKyAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX25lYXJlc3RfdXNlcl9sb2NhdGlvbiwgMCwgYXJncyApOworICAgIH0KKworICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgImZpbGUiLCAwIH07CisgICAgICAgIGJpbmRfYnVpbHRpbiggIkNIRUNLX0lGX0ZJTEUiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fY2hlY2tfaWZfZmlsZSwgMCwgYXJncyApOworICAgIH0KKworI2lmZGVmIEhBVkVfUFlUSE9OCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAicHl0aG9uLW1vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiLCAiZnVuY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IiwgImphbS1tb2R1bGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IiwgInJ1bGUtbmFtZSIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiUFlUSE9OX0lNUE9SVF9SVUxFIiwKKyAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX3B5dGhvbl9pbXBvcnRfcnVsZSwgMCwgYXJncyApOworICAgIH0KKyNlbmRpZgorCisjIGlmIGRlZmluZWQoIE9TX05UICkgfHwgZGVmaW5lZCggT1NfQ1lHV0lOICkKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJrZXlfcGF0aCIsICI6IiwgImRhdGEiLCAiPyIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiVzMyX0dFVFJFRyIsCisgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9zeXN0ZW1fcmVnaXN0cnksIDAsIGFyZ3MgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJrZXlfcGF0aCIsICI6IiwgInJlc3VsdC10eXBlIiwgMCB9OworICAgICAgICBiaW5kX2J1aWx0aW4oICJXMzJfR0VUUkVHTkFNRVMiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fc3lzdGVtX3JlZ2lzdHJ5X25hbWVzLCAwLCBhcmdzICk7CisgICAgfQorIyBlbmRpZgorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAiY29tbWFuZCIsICI6IiwgIioiLCAwIH07CisgICAgICAgIGR1cGxpY2F0ZV9ydWxlKCAiU0hFTEwiLAorICAgICAgICAgIGJpbmRfYnVpbHRpbiggIkNPTU1BTkQiLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9zaGVsbCwgMCwgYXJncyApICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAic3RyaW5nIiwgMCB9OworICAgICAgICBiaW5kX2J1aWx0aW4oICJNRDUiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fbWQ1LCAwLCBhcmdzICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAibmFtZSIsICI6IiwgIm1vZGUiLCAwIH07CisgICAgICAgIGJpbmRfYnVpbHRpbiggIkZJTEVfT1BFTiIsCisgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9maWxlX29wZW4sIDAsIGFyZ3MgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJzdHJpbmciLCAiOiIsICJ3aWR0aCIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiUEFEIiwKKyAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX3BhZCwgMCwgYXJncyApOworICAgIH0KKworICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgInRhcmdldHMiLCAiKiIsIDAgfTsKKyAgICAgICAgYmluZF9idWlsdGluKCAiUFJFQ0lPVVMiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fcHJlY2lvdXMsIDAsIGFyZ3MgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzIFtdID0geyAwIH07CisgICAgICAgIGJpbmRfYnVpbHRpbiggIlNFTEZfUEFUSCIsIGJ1aWx0aW5fc2VsZl9wYXRoLCAwLCBhcmdzICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJncyBbXSA9IHsgInBhdGgiLCAwIH07CisgICAgICAgIGJpbmRfYnVpbHRpbiggIk1BS0VESVIiLCBidWlsdGluX21ha2VkaXIsIDAsIGFyZ3MgKTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGJ1aWx0aW4gbW9kdWxlcy4gKi8KKyAgICBpbml0X3NldCgpOworICAgIGluaXRfcGF0aCgpOworICAgIGluaXRfcmVnZXgoKTsKKyAgICBpbml0X3Byb3BlcnR5X3NldCgpOworICAgIGluaXRfc2VxdWVuY2UoKTsKKyAgICBpbml0X29yZGVyKCk7Cit9CisKKworLyoKKyAqIGJ1aWx0aW5fY2FsYygpIC0gQ0FMQyBydWxlCisgKgorICogUGVyZm9ybXMgc2ltcGxlIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zIG9uIHR3byBhcmd1bWVudHMuCisgKi8KKworTElTVCAqIGJ1aWx0aW5fY2FsYyggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBMSVNUICogYXJnID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsKKworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBsb25nIGxoc192YWx1ZTsKKyAgICBsb25nIHJoc192YWx1ZTsKKyAgICBsb25nIHJlc3VsdF92YWx1ZTsKKyAgICBjaGFyIGJ1ZmZlclsgMTYgXTsKKyAgICBjaGFyIGNvbnN0ICogbGhzOworICAgIGNoYXIgY29uc3QgKiBvcDsKKyAgICBjaGFyIGNvbnN0ICogcmhzOworICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCBhcmcgKTsKKyAgICBMSVNUSVRFUiBjb25zdCBlbmQgPSBsaXN0X2VuZCggYXJnICk7CisKKyAgICBpZiAoIGl0ZXIgPT0gZW5kICkgcmV0dXJuIEwwOworICAgIGxocyA9IG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICk7CisKKyAgICBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICk7CisgICAgaWYgKCBpdGVyID09IGVuZCApIHJldHVybiBMMDsKKyAgICBvcCA9IG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICk7CisKKyAgICBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICk7CisgICAgaWYgKCBpdGVyID09IGVuZCApIHJldHVybiBMMDsKKyAgICByaHMgPSBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApOworCisgICAgbGhzX3ZhbHVlID0gYXRvaSggbGhzICk7CisgICAgcmhzX3ZhbHVlID0gYXRvaSggcmhzICk7CisKKyAgICBpZiAoICFzdHJjbXAoICIrIiwgb3AgKSApCisgICAgICAgIHJlc3VsdF92YWx1ZSA9IGxoc192YWx1ZSArIHJoc192YWx1ZTsKKyAgICBlbHNlIGlmICggIXN0cmNtcCggIi0iLCBvcCApICkKKyAgICAgICAgcmVzdWx0X3ZhbHVlID0gbGhzX3ZhbHVlIC0gcmhzX3ZhbHVlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEwwOworCisgICAgc3ByaW50ZiggYnVmZmVyLCAiJWxkIiwgcmVzdWx0X3ZhbHVlICk7CisgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwgb2JqZWN0X25ldyggYnVmZmVyICkgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBidWlsdGluX2RlcGVuZHMoKSAtIERFUEVORFMvSU5DTFVERVMgcnVsZQorICoKKyAqIFRoZSBERVBFTkRTL0lOQ0xVREVTIGJ1aWx0aW4gcnVsZSBhcHBlbmRzIGVhY2ggb2YgdGhlIGxpc3RlZCBzb3VyY2VzIG9uIHRoZQorICogZGVwZW5kZW5jeS9pbmNsdWRlcyBsaXN0IG9mIGVhY2ggb2YgdGhlIGxpc3RlZCB0YXJnZXRzLiBJdCBiaW5kcyBib3RoIHRoZQorICogdGFyZ2V0cyBhbmQgc291cmNlcyBhcyBUQVJHRVRzLgorICovCisKK0xJU1QgKiBidWlsdGluX2RlcGVuZHMoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGNvbnN0IHRhcmdldHMgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIExJU1QgKiBjb25zdCBzb3VyY2VzID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDEgKTsKKworICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCB0YXJnZXRzICk7CisgICAgTElTVElURVIgZW5kID0gbGlzdF9lbmQoIHRhcmdldHMgKTsKKyAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgIHsKKyAgICAgICAgVEFSR0VUICogY29uc3QgdCA9IGJpbmR0YXJnZXQoIGxpc3RfaXRlbSggaXRlciApICk7CisKKyAgICAgICAgaWYgKCBmbGFncyApCisgICAgICAgICAgICB0YXJnZXRfaW5jbHVkZV9tYW55KCB0LCBzb3VyY2VzICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHQtPmRlcGVuZHMgPSB0YXJnZXRsaXN0KCB0LT5kZXBlbmRzLCBzb3VyY2VzICk7CisgICAgfQorCisgICAgLyogRW50ZXIgcmV2ZXJzZSBsaW5rcyAqLworICAgIGl0ZXIgPSBsaXN0X2JlZ2luKCBzb3VyY2VzICk7CisgICAgZW5kID0gbGlzdF9lbmQoIHNvdXJjZXMgKTsKKyAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgIHsKKyAgICAgICAgVEFSR0VUICogY29uc3QgcyA9IGJpbmR0YXJnZXQoIGxpc3RfaXRlbSggaXRlciApICk7CisgICAgICAgIGlmICggZmxhZ3MgKQorICAgICAgICB7CisgICAgICAgICAgICBMSVNUSVRFUiB0X2l0ZXIgPSBsaXN0X2JlZ2luKCB0YXJnZXRzICk7CisgICAgICAgICAgICBMSVNUSVRFUiBjb25zdCB0X2VuZCA9IGxpc3RfZW5kKCB0YXJnZXRzICk7CisgICAgICAgICAgICBmb3IgKCA7IHRfaXRlciAhPSB0X2VuZDsgdF9pdGVyID0gbGlzdF9uZXh0KCB0X2l0ZXIgKSApCisgICAgICAgICAgICAgICAgcy0+ZGVwZW5kYW50cyA9IHRhcmdldGVudHJ5KCBzLT5kZXBlbmRhbnRzLCBiaW5kdGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICBsaXN0X2l0ZW0oIHRfaXRlciApICktPmluY2x1ZGVzICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+ZGVwZW5kYW50cyA9IHRhcmdldGxpc3QoIHMtPmRlcGVuZGFudHMsIHRhcmdldHMgKTsKKyAgICB9CisKKyAgICByZXR1cm4gTDA7Cit9CisKKworLyoKKyAqIGJ1aWx0aW5fcmVidWlsZHMoKSAtIFJFQlVJTERTIHJ1bGUKKyAqCisgKiBBcHBlbmRzIGVhY2ggb2YgdGhlIHJlYnVpbGQtdGFyZ2V0cyBsaXN0ZWQgaW4gaXRzIHNlY29uZCBhcmd1bWVudCB0byB0aGUKKyAqIHJlYnVpbGRzIGxpc3QgZm9yIGVhY2ggb2YgdGhlIHRhcmdldHMgbGlzdGVkIGluIGl0cyBmaXJzdCBhcmd1bWVudC4KKyAqLworCitMSVNUICogYnVpbHRpbl9yZWJ1aWxkcyggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBMSVNUICogdGFyZ2V0cyA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgTElTVCAqIHJlYnVpbGRzID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDEgKTsKKyAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggdGFyZ2V0cyApOworICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCB0YXJnZXRzICk7CisgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICB7CisgICAgICAgIFRBUkdFVCAqIGNvbnN0IHQgPSBiaW5kdGFyZ2V0KCBsaXN0X2l0ZW0oIGl0ZXIgKSApOworICAgICAgICB0LT5yZWJ1aWxkcyA9IHRhcmdldGxpc3QoIHQtPnJlYnVpbGRzLCByZWJ1aWxkcyApOworICAgIH0KKyAgICByZXR1cm4gTDA7Cit9CisKKworLyoKKyAqIGJ1aWx0aW5fZWNobygpIC0gRUNITyBydWxlCisgKgorICogRWNob2VzIHRoZSB0YXJnZXRzIHRvIHRoZSB1c2VyLiBObyBvdGhlciBhY3Rpb25zIGFyZSB0YWtlbi4KKyAqLworCitMSVNUICogYnVpbHRpbl9lY2hvKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIGxpc3RfcHJpbnQoIGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICkgKTsKKyAgICBwcmludGYoICJcbiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworICAgIHJldHVybiBMMDsKK30KKworCisvKgorICogYnVpbHRpbl9leGl0KCkgLSBFWElUIHJ1bGUKKyAqCisgKiBFY2hvZXMgdGhlIHRhcmdldHMgdG8gdGhlIHVzZXIgYW5kIGV4aXRzIHRoZSBwcm9ncmFtIHdpdGggYSBmYWlsdXJlIHN0YXR1cy4KKyAqLworCitMSVNUICogYnVpbHRpbl9leGl0KCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiBjb25zdCBjb2RlID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDEgKTsKKyAgICBsaXN0X3ByaW50KCBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApICk7CisgICAgcHJpbnRmKCAiXG4iICk7CisgICAgaWYgKCAhbGlzdF9lbXB0eSggY29kZSApICkKKyAgICAgICAgZXhpdCggYXRvaSggb2JqZWN0X3N0ciggbGlzdF9mcm9udCggY29kZSApICkgKSApOworICAgIGVsc2UKKyAgICAgICAgZXhpdCggRVhJVEJBRCApOyAgLyogeWVlY2ggKi8KKyAgICByZXR1cm4gTDA7Cit9CisKKworLyoKKyAqIGJ1aWx0aW5fZmxhZ3MoKSAtIE5PQ0FSRSwgTk9URklMRSwgVEVNUE9SQVJZIHJ1bGUKKyAqCisgKiBNYXJrcyB0aGUgdGFyZ2V0IHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWcsIGZvciB1c2UgYnkgbWFrZTAoKS4gSXQgYmluZHMgZWFjaAorICogdGFyZ2V0IGFzIGEgVEFSR0VULgorICovCisKK0xJU1QgKiBidWlsdGluX2ZsYWdzKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiBjb25zdCB0YXJnZXRzID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsKKyAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggdGFyZ2V0cyApOworICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCB0YXJnZXRzICk7CisgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgYmluZHRhcmdldCggbGlzdF9pdGVtKCBpdGVyICkgKS0+ZmxhZ3MgfD0gZmxhZ3M7CisgICAgcmV0dXJuIEwwOworfQorCisKKy8qCisgKiBidWlsdGluX2dsb2IoKSAtIEdMT0IgcnVsZQorICovCisKK3N0cnVjdCBnbG9iYmluZworeworICAgIExJU1QgKiBwYXR0ZXJuczsKKyAgICBMSVNUICogcmVzdWx0czsKKyAgICBMSVNUICogY2FzZV9pbnNlbnNpdGl2ZTsKK307CisKKworc3RhdGljIHZvaWQgZG93bmNhc2VfaW5wbGFjZSggY2hhciAqIHAgKQoreworICAgIGZvciAoIDsgKnA7ICsrcCApCisgICAgICAgICpwID0gdG9sb3dlciggKnAgKTsKK30KKworCitzdGF0aWMgdm9pZCBidWlsdGluX2dsb2JfYmFjayggdm9pZCAqIGNsb3N1cmUsIE9CSkVDVCAqIGZpbGUsIGludCBzdGF0dXMsCisgICAgdGltZXN0YW1wIGNvbnN0ICogY29uc3QgdGltZSApCit7CisgICAgUFJPRklMRV9FTlRFUiggQlVJTFRJTl9HTE9CX0JBQ0sgKTsKKworICAgIHN0cnVjdCBnbG9iYmluZyAqIGNvbnN0IGdsb2JiaW5nID0gKHN0cnVjdCBnbG9iYmluZyAqKWNsb3N1cmU7CisgICAgUEFUSE5BTUUgZjsKKyAgICBzdHJpbmcgYnVmWyAxIF07CisgICAgTElTVElURVIgaXRlcjsKKyAgICBMSVNUSVRFUiBlbmQ7CisKKyAgICAvKiBOdWxsIG91dCBkaXJlY3RvcnkgZm9yIG1hdGNoaW5nLiBXZSB3aXNoIHdlIGhhZCBmaWxlX2RpcnNjYW4oKSBwYXNzIHVwIGEKKyAgICAgKiBQQVRITkFNRS4KKyAgICAgKi8KKyAgICBwYXRoX3BhcnNlKCBvYmplY3Rfc3RyKCBmaWxlICksICZmICk7CisgICAgZi5mX2Rpci5sZW4gPSAwOworCisgICAgLyogRm9yIGdsb2JiaW5nLCB3ZSB1bmNvbmRpdGlvbmFsbHkgaWdub3JlIGN1cnJlbnQgYW5kIHBhcmVudCBkaXJlY3RvcnkKKyAgICAgKiBpdGVtcy4gU2luY2UgdGhlc2UgaXRlbXMgYWx3YXlzIGV4aXN0LCB0aGVyZSBpcyBubyByZWFzb24gd2h5IGNhbGxlciBvZgorICAgICAqIEdMT0Igd291bGQgd2FudCB0byBzZWUgdGhlbS4gV2UgY291bGQgYWxzbyBjaGFuZ2UgZmlsZV9kaXJzY2FuKCksIGJ1dAorICAgICAqIHRoZW4gcGF0aHMgd2l0aCBlbWJlZGRlZCAiLiIgYW5kICIuLiIgd291bGQgbm90IHdvcmsgYW55d2hlcmUuCisgICAgKi8KKyAgICBpZiAoICFzdHJjbXAoIGYuZl9iYXNlLnB0ciwgIi4iICkgfHwgIXN0cmNtcCggZi5mX2Jhc2UucHRyLCAiLi4iICkgKQorICAgIHsKKyAgICAgICAgUFJPRklMRV9FWElUKCBCVUlMVElOX0dMT0JfQkFDSyApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyaW5nX25ldyggYnVmICk7CisgICAgcGF0aF9idWlsZCggJmYsIGJ1ZiApOworCisgICAgaWYgKCBnbG9iYmluZy0+Y2FzZV9pbnNlbnNpdGl2ZSApCisgICAgICAgIGRvd25jYXNlX2lucGxhY2UoIGJ1Zi0+dmFsdWUgKTsKKworICAgIGl0ZXIgPSBsaXN0X2JlZ2luKCBnbG9iYmluZy0+cGF0dGVybnMgKTsKKyAgICBlbmQgPSBsaXN0X2VuZCggZ2xvYmJpbmctPnBhdHRlcm5zICk7CisgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICB7CisgICAgICAgIGlmICggIWdsb2IoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICksIGJ1Zi0+dmFsdWUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsb2JiaW5nLT5yZXN1bHRzID0gbGlzdF9wdXNoX2JhY2soIGdsb2JiaW5nLT5yZXN1bHRzLCBvYmplY3RfY29weSgKKyAgICAgICAgICAgICAgICBmaWxlICkgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nX2ZyZWUoIGJ1ZiApOworCisgICAgUFJPRklMRV9FWElUKCBCVUlMVElOX0dMT0JfQkFDSyApOworfQorCisKK3N0YXRpYyBMSVNUICogZG93bmNhc2VfbGlzdCggTElTVCAqIGluICkKK3sKKyAgICBMSVNUICogcmVzdWx0ID0gTDA7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIGluICk7CisgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIGluICk7CisKKyAgICBzdHJpbmcgc1sgMSBdOworICAgIHN0cmluZ19uZXcoIHMgKTsKKworICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgeworICAgICAgICBzdHJpbmdfYXBwZW5kKCBzLCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApICk7CisgICAgICAgIGRvd25jYXNlX2lucGxhY2UoIHMtPnZhbHVlICk7CisgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIG9iamVjdF9uZXcoIHMtPnZhbHVlICkgKTsKKyAgICAgICAgc3RyaW5nX3RydW5jYXRlKCBzLCAwICk7CisgICAgfQorCisgICAgc3RyaW5nX2ZyZWUoIHMgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK0xJU1QgKiBidWlsdGluX2dsb2IoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGNvbnN0IGwgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIExJU1QgKiBjb25zdCByID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDEgKTsKKworICAgIExJU1RJVEVSIGl0ZXI7CisgICAgTElTVElURVIgZW5kOworICAgIHN0cnVjdCBnbG9iYmluZyBnbG9iYmluZzsKKworICAgIGdsb2JiaW5nLnJlc3VsdHMgPSBMMDsKKyAgICBnbG9iYmluZy5wYXR0ZXJucyA9IHI7CisKKyAgICBnbG9iYmluZy5jYXNlX2luc2Vuc2l0aXZlID0KKyMgaWYgZGVmaW5lZCggT1NfTlQgKSB8fCBkZWZpbmVkKCBPU19DWUdXSU4gKQorICAgICAgIGw7ICAvKiBBbHdheXMgY2FzZS1pbnNlbnNpdGl2ZSBpZiBhbnkgZmlsZXMgY2FuIGJlIGZvdW5kLiAqLworIyBlbHNlCisgICAgICAgbG9sX2dldCggZnJhbWUtPmFyZ3MsIDIgKTsKKyMgZW5kaWYKKworICAgIGlmICggZ2xvYmJpbmcuY2FzZV9pbnNlbnNpdGl2ZSApCisgICAgICAgIGdsb2JiaW5nLnBhdHRlcm5zID0gZG93bmNhc2VfbGlzdCggciApOworCisgICAgaXRlciA9IGxpc3RfYmVnaW4oIGwgKTsKKyAgICBlbmQgPSBsaXN0X2VuZCggbCApOworICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgIGZpbGVfZGlyc2NhbiggbGlzdF9pdGVtKCBpdGVyICksIGJ1aWx0aW5fZ2xvYl9iYWNrLCAmZ2xvYmJpbmcgKTsKKworICAgIGlmICggZ2xvYmJpbmcuY2FzZV9pbnNlbnNpdGl2ZSApCisgICAgICAgIGxpc3RfZnJlZSggZ2xvYmJpbmcucGF0dGVybnMgKTsKKworICAgIHJldHVybiBnbG9iYmluZy5yZXN1bHRzOworfQorCisKK3N0YXRpYyBpbnQgaGFzX3dpbGRjYXJkcyggY2hhciBjb25zdCAqIGNvbnN0IHN0ciApCit7CisgICAgcmV0dXJuIHN0clsgc3RyY3Nwbiggc3RyLCAiW10qPyIgKSBdID8gMSA6IDA7Cit9CisKKworLyoKKyAqIGFwcGVuZF9pZl9leGlzdHMoKSAtIGlmIGZpbGUgZXhpc3RzLCBhcHBlbmQgaXQgdG8gdGhlIGxpc3QKKyAqLworCitzdGF0aWMgTElTVCAqIGFwcGVuZF9pZl9leGlzdHMoIExJU1QgKiBsaXN0LCBPQkpFQ1QgKiBmaWxlICkKK3sKKyAgICByZXR1cm4gZmlsZV9xdWVyeSggZmlsZSApCisgICAgICAgID8gbGlzdF9wdXNoX2JhY2soIGxpc3QsIG9iamVjdF9jb3B5KCBmaWxlICkgKQorICAgICAgICA6IGxpc3QgOworfQorCisKK0xJU1QgKiBnbG9iMSggT0JKRUNUICogZGlybmFtZSwgT0JKRUNUICogcGF0dGVybiApCit7CisgICAgTElTVCAqIGNvbnN0IHBsaXN0ID0gbGlzdF9uZXcoIG9iamVjdF9jb3B5KCBwYXR0ZXJuICkgKTsKKyAgICBzdHJ1Y3QgZ2xvYmJpbmcgZ2xvYmJpbmc7CisKKyAgICBnbG9iYmluZy5yZXN1bHRzID0gTDA7CisgICAgZ2xvYmJpbmcucGF0dGVybnMgPSBwbGlzdDsKKworICAgIGdsb2JiaW5nLmNhc2VfaW5zZW5zaXRpdmUKKyMgaWYgZGVmaW5lZCggT1NfTlQgKSB8fCBkZWZpbmVkKCBPU19DWUdXSU4gKQorICAgICAgID0gcGxpc3Q7ICAvKiBhbHdheXMgY2FzZS1pbnNlbnNpdGl2ZSBpZiBhbnkgZmlsZXMgY2FuIGJlIGZvdW5kICovCisjIGVsc2UKKyAgICAgICA9IEwwOworIyBlbmRpZgorCisgICAgaWYgKCBnbG9iYmluZy5jYXNlX2luc2Vuc2l0aXZlICkKKyAgICAgICAgZ2xvYmJpbmcucGF0dGVybnMgPSBkb3duY2FzZV9saXN0KCBwbGlzdCApOworCisgICAgZmlsZV9kaXJzY2FuKCBkaXJuYW1lLCBidWlsdGluX2dsb2JfYmFjaywgJmdsb2JiaW5nICk7CisKKyAgICBpZiAoIGdsb2JiaW5nLmNhc2VfaW5zZW5zaXRpdmUgKQorICAgICAgICBsaXN0X2ZyZWUoIGdsb2JiaW5nLnBhdHRlcm5zICk7CisKKyAgICBsaXN0X2ZyZWUoIHBsaXN0ICk7CisKKyAgICByZXR1cm4gZ2xvYmJpbmcucmVzdWx0czsKK30KKworCitMSVNUICogZ2xvYl9yZWN1cnNpdmUoIGNoYXIgY29uc3QgKiBwYXR0ZXJuICkKK3sKKyAgICBMSVNUICogcmVzdWx0ID0gTDA7CisKKyAgICAvKiBDaGVjayBpZiB0aGVyZSdzIG1ldGFjaGFyYWN0ZXJzIGluIHBhdHRlcm4gKi8KKyAgICBpZiAoICFoYXNfd2lsZGNhcmRzKCBwYXR0ZXJuICkgKQorICAgIHsKKyAgICAgICAgLyogTm8gbWV0YWNoYXJhY3RlcnMuIENoZWNrIGlmIHRoZSBwYXRoIGV4aXN0cy4gKi8KKyAgICAgICAgT0JKRUNUICogY29uc3QgcCA9IG9iamVjdF9uZXcoIHBhdHRlcm4gKTsKKyAgICAgICAgcmVzdWx0ID0gYXBwZW5kX2lmX2V4aXN0cyggcmVzdWx0LCBwICk7CisgICAgICAgIG9iamVjdF9mcmVlKCBwICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEhhdmUgbWV0YWNoYXJhY3RlcnMgaW4gdGhlIHBhdHRlcm4uIFNwbGl0IGludG8gZGlyL25hbWUuICovCisgICAgICAgIFBBVEhOQU1FIHBhdGhbIDEgXTsKKyAgICAgICAgcGF0aF9wYXJzZSggcGF0dGVybiwgcGF0aCApOworCisgICAgICAgIGlmICggcGF0aC0+Zl9kaXIucHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqIGRpcnMgPSBMMDsKKyAgICAgICAgICAgIHN0cmluZyBkaXJuYW1lWyAxIF07CisgICAgICAgICAgICBzdHJpbmcgYmFzZW5hbWVbIDEgXTsKKyAgICAgICAgICAgIHN0cmluZ19uZXcoIGRpcm5hbWUgKTsKKyAgICAgICAgICAgIHN0cmluZ19uZXcoIGJhc2VuYW1lICk7CisKKyAgICAgICAgICAgIHN0cmluZ19hcHBlbmRfcmFuZ2UoIGRpcm5hbWUsIHBhdGgtPmZfZGlyLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC0+Zl9kaXIucHRyICsgcGF0aC0+Zl9kaXIubGVuICk7CisKKyAgICAgICAgICAgIHBhdGgtPmZfZ3Jpc3QucHRyID0gMDsKKyAgICAgICAgICAgIHBhdGgtPmZfZ3Jpc3QubGVuID0gMDsKKyAgICAgICAgICAgIHBhdGgtPmZfZGlyLnB0ciA9IDA7CisgICAgICAgICAgICBwYXRoLT5mX2Rpci5sZW4gPSAwOworICAgICAgICAgICAgcGF0aF9idWlsZCggcGF0aCwgYmFzZW5hbWUgKTsKKworICAgICAgICAgICAgZGlycyA9ICBoYXNfd2lsZGNhcmRzKCBkaXJuYW1lLT52YWx1ZSApCisgICAgICAgICAgICAgICAgPyBnbG9iX3JlY3Vyc2l2ZSggZGlybmFtZS0+dmFsdWUgKQorICAgICAgICAgICAgICAgIDogbGlzdF9wdXNoX2JhY2soIGRpcnMsIG9iamVjdF9uZXcoIGRpcm5hbWUtPnZhbHVlICkgKTsKKworICAgICAgICAgICAgaWYgKCBoYXNfd2lsZGNhcmRzKCBiYXNlbmFtZS0+dmFsdWUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT0JKRUNUICogY29uc3QgYiA9IG9iamVjdF9uZXcoIGJhc2VuYW1lLT52YWx1ZSApOworICAgICAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCBkaXJzICk7CisgICAgICAgICAgICAgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIGRpcnMgKTsKKyAgICAgICAgICAgICAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXN0X2FwcGVuZCggcmVzdWx0LCBnbG9iMSggbGlzdF9pdGVtKCBpdGVyICksIGIgKQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBvYmplY3RfZnJlZSggYiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCBkaXJzICk7CisgICAgICAgICAgICAgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIGRpcnMgKTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgZmlsZV9zdHJpbmdbIDEgXTsKKyAgICAgICAgICAgICAgICBzdHJpbmdfbmV3KCBmaWxlX3N0cmluZyApOworCisgICAgICAgICAgICAgICAgLyogTm8gd2lsZGNhcmQgaW4gYmFzZW5hbWUuICovCisgICAgICAgICAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9CSkVDVCAqIHA7CisgICAgICAgICAgICAgICAgICAgIHBhdGgtPmZfZGlyLnB0ciA9IG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICk7CisgICAgICAgICAgICAgICAgICAgIHBhdGgtPmZfZGlyLmxlbiA9IHN0cmxlbiggb2JqZWN0X3N0ciggbGlzdF9pdGVtKCBpdGVyICkgKSApOworICAgICAgICAgICAgICAgICAgICBwYXRoX2J1aWxkKCBwYXRoLCBmaWxlX3N0cmluZyApOworCisgICAgICAgICAgICAgICAgICAgIHAgPSBvYmplY3RfbmV3KCBmaWxlX3N0cmluZy0+dmFsdWUgKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBlbmRfaWZfZXhpc3RzKCByZXN1bHQsIHAgKTsKKworICAgICAgICAgICAgICAgICAgICBvYmplY3RfZnJlZSggcCApOworCisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190cnVuY2F0ZSggZmlsZV9zdHJpbmcsIDAgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdHJpbmdfZnJlZSggZmlsZV9zdHJpbmcgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyaW5nX2ZyZWUoIGRpcm5hbWUgKTsKKyAgICAgICAgICAgIHN0cmluZ19mcmVlKCBiYXNlbmFtZSApOworCisgICAgICAgICAgICBsaXN0X2ZyZWUoIGRpcnMgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5vIGRpcmVjdG9yeSwganVzdCBhIHBhdHRlcm4uICovCisgICAgICAgICAgICBPQkpFQ1QgKiBjb25zdCBwID0gb2JqZWN0X25ldyggcGF0dGVybiApOworICAgICAgICAgICAgcmVzdWx0ID0gbGlzdF9hcHBlbmQoIHJlc3VsdCwgZ2xvYjEoIGNvbnN0YW50X2RvdCwgcCApICk7CisgICAgICAgICAgICBvYmplY3RfZnJlZSggcCApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogYnVpbHRpbl9nbG9iX3JlY3Vyc2l2ZSgpIC0gPz8/CisgKi8KKworTElTVCAqIGJ1aWx0aW5fZ2xvYl9yZWN1cnNpdmUoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIHJlc3VsdCA9IEwwOworICAgIExJU1QgKiBjb25zdCBsID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsKKyAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggbCApOworICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCBsICk7CisgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgcmVzdWx0ID0gbGlzdF9hcHBlbmQoIHJlc3VsdCwgZ2xvYl9yZWN1cnNpdmUoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSgKKyAgICAgICAgICAgIGl0ZXIgKSApICkgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBidWlsdGluX21hdGNoKCkgLSBNQVRDSCBydWxlLCByZWdleHAgbWF0Y2hpbmcKKyAqLworCitMSVNUICogYnVpbHRpbl9tYXRjaCggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBMSVNUICogbDsKKyAgICBMSVNUICogcjsKKyAgICBMSVNUICogcmVzdWx0ID0gTDA7CisgICAgTElTVElURVIgbF9pdGVyOworICAgIExJU1RJVEVSIGxfZW5kOworICAgIExJU1RJVEVSIHJfaXRlcjsKKyAgICBMSVNUSVRFUiByX2VuZDsKKworICAgIHN0cmluZyBidWZbIDEgXTsKKyAgICBzdHJpbmdfbmV3KCBidWYgKTsKKworICAgIC8qIEZvciBlYWNoIHBhdHRlcm4gKi8KKworICAgIGwgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIGxfaXRlciA9IGxpc3RfYmVnaW4oIGwgKTsKKyAgICBsX2VuZCA9IGxpc3RfZW5kKCBsICk7CisgICAgZm9yICggOyBsX2l0ZXIgIT0gbF9lbmQ7IGxfaXRlciA9IGxpc3RfbmV4dCggbF9pdGVyICkgKQorICAgIHsKKyAgICAgICAgLyogUmVzdWx0IGlzIGNhY2hlZCBhbmQgaW50ZW50aW9uYWxseSBuZXZlciBmcmVlZC4gKi8KKyAgICAgICAgcmVnZXhwICogcmUgPSByZWdleF9jb21waWxlKCBsaXN0X2l0ZW0oIGxfaXRlciApICk7CisKKyAgICAgICAgLyogRm9yIGVhY2ggc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QuICovCisgICAgICAgIHIgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMSApOworICAgICAgICByX2l0ZXIgPSBsaXN0X2JlZ2luKCByICk7CisgICAgICAgIHJfZW5kID0gbGlzdF9lbmQoIHIgKTsKKyAgICAgICAgZm9yICggOyByX2l0ZXIgIT0gcl9lbmQ7IHJfaXRlciA9IGxpc3RfbmV4dCggcl9pdGVyICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHJlZ2V4ZWMoIHJlLCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIHJfaXRlciApICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgaW50IHRvcDsKKworICAgICAgICAgICAgICAgIC8qIEZpbmQgaGlnaGVzdCBwYXJhbWV0ZXIgKi8KKworICAgICAgICAgICAgICAgIGZvciAoIHRvcCA9IE5TVUJFWFA7IHRvcC0tID4gMTsgKQorICAgICAgICAgICAgICAgICAgICBpZiAoIHJlLT5zdGFydHBbIHRvcCBdICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyogQW5kIGFkZCBhbGwgcGFyYW1ldGVycyB1cCB0byBoaWdoZXN0IG9udG8gbGlzdC4gKi8KKyAgICAgICAgICAgICAgICAvKiBNdXN0IGhhdmUgcGFyYW1ldGVycyB0byBoYXZlIHJlc3VsdHMhICovCisgICAgICAgICAgICAgICAgZm9yICggaSA9IDE7IGkgPD0gdG9wOyArK2kgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZF9yYW5nZSggYnVmLCByZS0+c3RhcnRwWyBpIF0sIHJlLT5lbmRwWyBpIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwgb2JqZWN0X25ldyggYnVmLT52YWx1ZSApICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190cnVuY2F0ZSggYnVmLCAwICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nX2ZyZWUoIGJ1ZiApOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIGJ1aWx0aW5fc3BsaXRfYnlfY2hhcmFjdGVycygpIC0gc3BsaXRzIHRoZSBnaXZlbiBzdHJpbmcgaW50byB0b2tlbnMKKyAqLworCitMSVNUICogYnVpbHRpbl9zcGxpdF9ieV9jaGFyYWN0ZXJzKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiBsMSA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgTElTVCAqIGwyID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDEgKTsKKworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKworICAgIHN0cmluZyBidWZbIDEgXTsKKworICAgIGNoYXIgY29uc3QgKiBkZWxpbWl0ZXJzID0gb2JqZWN0X3N0ciggbGlzdF9mcm9udCggbDIgKSApOworICAgIGNoYXIgKiB0OworCisgICAgc3RyaW5nX2NvcHkoIGJ1Ziwgb2JqZWN0X3N0ciggbGlzdF9mcm9udCggbDEgKSApICk7CisKKyAgICB0ID0gc3RydG9rKCBidWYtPnZhbHVlLCBkZWxpbWl0ZXJzICk7CisgICAgd2hpbGUgKCB0ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIG9iamVjdF9uZXcoIHQgKSApOworICAgICAgICB0ID0gc3RydG9rKCBOVUxMLCBkZWxpbWl0ZXJzICk7CisgICAgfQorCisgICAgc3RyaW5nX2ZyZWUoIGJ1ZiApOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogYnVpbHRpbl9oZHJtYWNybygpIC0gPz8/CisgKi8KKworTElTVCAqIGJ1aWx0aW5faGRybWFjcm8oIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGNvbnN0IGwgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCBsICk7CisgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIGwgKTsKKworICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgeworICAgICAgICBUQVJHRVQgKiBjb25zdCB0ID0gYmluZHRhcmdldCggbGlzdF9pdGVtKCBpdGVyICkgKTsKKworICAgICAgICAvKiBTY2FuIGZpbGUgZm9yIGhlYWRlciBmaWxlbmFtZSBtYWNybyBkZWZpbml0aW9ucy4gKi8KKyAgICAgICAgaWYgKCBERUJVR19IRUFERVIgKQorICAgICAgICAgICAgcHJpbnRmKCAic2Nhbm5pbmcgJyVzJyBmb3IgaGVhZGVyIGZpbGUgbWFjcm8gZGVmaW5pdGlvbnNcbiIsCisgICAgICAgICAgICAgICAgb2JqZWN0X3N0ciggbGlzdF9pdGVtKCBpdGVyICkgKSApOworCisgICAgICAgIG1hY3JvX2hlYWRlcnMoIHQgKTsKKyAgICB9CisKKyAgICByZXR1cm4gTDA7Cit9CisKKworLyoKKyAqIGJ1aWx0aW5fcnVsZW5hbWVzKCkgLSBSVUxFTkFNRVMgKCBNT0RVTEUgPyApCisgKgorICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIG5vbi1sb2NhbCBydWxlIG5hbWVzIGluIHRoZSBnaXZlbiBNT0RVTEUuIElmIE1PRFVMRSBpcworICogbm90IHN1cHBsaWVkLCByZXR1cm5zIHRoZSBsaXN0IG9mIHJ1bGUgbmFtZXMgaW4gdGhlIGdsb2JhbCBtb2R1bGUuCisgKi8KKworc3RhdGljIHZvaWQgYWRkX3J1bGVfbmFtZSggdm9pZCAqIHJfLCB2b2lkICogcmVzdWx0XyApCit7CisgICAgUlVMRSAqIGNvbnN0IHIgPSAoUlVMRSAqKXJfOworICAgIExJU1QgKiAqIGNvbnN0IHJlc3VsdCA9IChMSVNUICogKilyZXN1bHRfOworICAgIGlmICggci0+ZXhwb3J0ZWQgKQorICAgICAgICAqcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soICpyZXN1bHQsIG9iamVjdF9jb3B5KCByLT5uYW1lICkgKTsKK30KKworCitMSVNUICogYnVpbHRpbl9ydWxlbmFtZXMoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGFyZzAgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBtb2R1bGVfdCAqIGNvbnN0IHNvdXJjZV9tb2R1bGUgPSBiaW5kbW9kdWxlKCBsaXN0X2VtcHR5KCBhcmcwICkKKyAgICAgICAgPyAwCisgICAgICAgIDogbGlzdF9mcm9udCggYXJnMCApICk7CisKKyAgICBpZiAoIHNvdXJjZV9tb2R1bGUtPnJ1bGVzICkKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggc291cmNlX21vZHVsZS0+cnVsZXMsIGFkZF9ydWxlX25hbWUsICZyZXN1bHQgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBidWlsdGluX3Zhcm5hbWVzKCkgLSBWQVJOQU1FUyAoIE1PRFVMRSA/ICkKKyAqCisgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgdmFyaWFibGUgbmFtZXMgaW4gdGhlIGdpdmVuIE1PRFVMRS4gSWYgTU9EVUxFIGlzIG5vdAorICogc3VwcGxpZWQsIHJldHVybnMgdGhlIGxpc3Qgb2YgdmFyaWFibGUgbmFtZXMgaW4gdGhlIGdsb2JhbCBtb2R1bGUuCisgKi8KKworLyogaGVscGVyIGZ1bmN0aW9uIGZvciBidWlsdGluX3Zhcm5hbWVzKCksIGJlbG93LiBVc2VkIHdpdGggaGFzaGVudW1lcmF0ZSwgd2lsbAorICogcHJlcGVuZCB0aGUga2V5IG9mIGVhY2ggZWxlbWVudCB0byB0aGUgbGlzdAorICovCitzdGF0aWMgdm9pZCBhZGRfaGFzaF9rZXkoIHZvaWQgKiBucCwgdm9pZCAqIHJlc3VsdF8gKQoreworICAgIExJU1QgKiAqIHJlc3VsdCA9IChMSVNUICogKilyZXN1bHRfOworICAgICpyZXN1bHQgPSBsaXN0X3B1c2hfYmFjayggKnJlc3VsdCwgb2JqZWN0X2NvcHkoICooT0JKRUNUICogKilucCApICk7Cit9CisKKworTElTVCAqIGJ1aWx0aW5fdmFybmFtZXMoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGFyZzAgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBtb2R1bGVfdCAqIHNvdXJjZV9tb2R1bGUgPSBiaW5kbW9kdWxlKCBsaXN0X2VtcHR5KCBhcmcwICkKKyAgICAgICAgPyAwCisgICAgICAgIDogbGlzdF9mcm9udCggYXJnMCApICk7CisKKyAgICBzdHJ1Y3QgaGFzaCAqIGNvbnN0IHZhcnMgPSBzb3VyY2VfbW9kdWxlLT52YXJpYWJsZXM7CisgICAgaWYgKCB2YXJzICkKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggdmFycywgYWRkX2hhc2hfa2V5LCAmcmVzdWx0ICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogYnVpbHRpbl9kZWxldGVfbW9kdWxlKCkgLSBERUxFVEVfTU9EVUxFICggTU9EVUxFID8gKQorICoKKyAqIENsZWFycyBhbGwgcnVsZXMgYW5kIHZhcmlhYmxlcyBmcm9tIHRoZSBnaXZlbiBtb2R1bGUuCisgKi8KKworTElTVCAqIGJ1aWx0aW5fZGVsZXRlX21vZHVsZSggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBMSVNUICogY29uc3QgYXJnMCA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgbW9kdWxlX3QgKiBjb25zdCBzb3VyY2VfbW9kdWxlID0gYmluZG1vZHVsZSggbGlzdF9lbXB0eSggYXJnMCApID8gMCA6CisgICAgICAgIGxpc3RfZnJvbnQoIGFyZzAgKSApOworICAgIGRlbGV0ZV9tb2R1bGUoIHNvdXJjZV9tb2R1bGUgKTsKKyAgICByZXR1cm4gTDA7Cit9CisKKworLyoKKyAqIHVua25vd25fcnVsZSgpIC0gcmVwb3J0cyBhbiB1bmtub3duIHJ1bGUgb2NjdXJyZW5jZSB0byB0aGUgdXNlciBhbmQgZXhpdHMKKyAqLworCit2b2lkIHVua25vd25fcnVsZSggRlJBTUUgKiBmcmFtZSwgY2hhciBjb25zdCAqIGtleSwgbW9kdWxlX3QgKiBtb2R1bGUsCisgICAgT0JKRUNUICogcnVsZV9uYW1lICkKK3sKKyAgICBiYWNrdHJhY2VfbGluZSggZnJhbWUtPnByZXYgKTsKKyAgICBpZiAoIGtleSApCisgICAgICAgIHByaW50ZigiJXMgZXJyb3IiLCBrZXkpOworICAgIGVsc2UKKyAgICAgICAgcHJpbnRmKCJFUlJPUiIpOworICAgIHByaW50ZiggIjogcnVsZSBcIiVzXCIgdW5rbm93biBpbiAiLCBvYmplY3Rfc3RyKCBydWxlX25hbWUgKSApOworICAgIGlmICggbW9kdWxlLT5uYW1lICkKKyAgICAgICAgcHJpbnRmKCAibW9kdWxlIFwiJXNcIi5cbiIsIG9iamVjdF9zdHIoIG1vZHVsZS0+bmFtZSApICk7CisgICAgZWxzZQorICAgICAgICBwcmludGYoICJyb290IG1vZHVsZS5cbiIgKTsKKyAgICBiYWNrdHJhY2UoIGZyYW1lLT5wcmV2ICk7CisgICAgZXhpdCggMSApOworfQorCisKKy8qCisgKiBidWlsdGluX2ltcG9ydCgpIC0gSU1QT1JUIHJ1bGUKKyAqCisgKiBJTVBPUlQKKyAqICgKKyAqICAgICBTT1VSQ0VfTU9EVUxFID8gOgorICogICAgIFNPVVJDRV9SVUxFUyAgKiA6CisgKiAgICAgVEFSR0VUX01PRFVMRSA/IDoKKyAqICAgICBUQVJHRVRfUlVMRVMgICogOgorICogICAgIExPQ0FMSVpFICAgICAgPworICogKQorICoKKyAqIEltcG9ydHMgcnVsZXMgZnJvbSB0aGUgU09VUkNFX01PRFVMRSBpbnRvIHRoZSBUQVJHRVRfTU9EVUxFIGFzIGxvY2FsIHJ1bGVzLgorICogSWYgZWl0aGVyIFNPVVJDRV9NT0RVTEUgb3IgVEFSR0VUX01PRFVMRSBpcyBub3Qgc3VwcGxpZWQsIGl0IHJlZmVycyB0byB0aGUKKyAqIGdsb2JhbCBtb2R1bGUuIFNPVVJDRV9SVUxFUyBzcGVjaWZpZXMgd2hpY2ggcnVsZXMgZnJvbSB0aGUgU09VUkNFX01PRFVMRSB0bworICogaW1wb3J0OyBUQVJHRVRfUlVMRVMgc3BlY2lmaWVzIHRoZSBuYW1lcyB0byBnaXZlIHRob3NlIHJ1bGVzIGluCisgKiBUQVJHRVRfTU9EVUxFLiBJZiBTT1VSQ0VfUlVMRVMgY29udGFpbnMgYSBuYW1lIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0bworICogYSBydWxlIGluIFNPVVJDRV9NT0RVTEUsIG9yIGlmIGl0IGNvbnRhaW5zIGEgZGlmZmVyZW50IG51bWJlciBvZiBpdGVtcyB0aGFuCisgKiBUQVJHRVRfUlVMRVMsIGFuIGVycm9yIGlzIGlzc3VlZC4gSWYgTE9DQUxJWkUgaXMgc3BlY2lmaWVkLCB0aGUgcnVsZXMgd2lsbCBiZQorICogZXhlY3V0ZWQgaW4gVEFSR0VUX01PRFVMRSwgd2l0aCBjb3JyZXNwb25kaW5nIGFjY2VzcyB0byBpdHMgbW9kdWxlIGxvY2FsCisgKiB2YXJpYWJsZXMuCisgKi8KKworTElTVCAqIGJ1aWx0aW5faW1wb3J0KCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiBzb3VyY2VfbW9kdWxlX2xpc3QgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIExJU1QgKiBzb3VyY2VfcnVsZXMgICAgICAgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMSApOworICAgIExJU1QgKiB0YXJnZXRfbW9kdWxlX2xpc3QgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMiApOworICAgIExJU1QgKiB0YXJnZXRfcnVsZXMgICAgICAgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMyApOworICAgIExJU1QgKiBsb2NhbGl6ZSAgICAgICAgICAgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgNCApOworCisgICAgbW9kdWxlX3QgKiB0YXJnZXRfbW9kdWxlID0gYmluZG1vZHVsZSggbGlzdF9lbXB0eSggdGFyZ2V0X21vZHVsZV9saXN0ICkKKyAgICAgICAgPyAwCisgICAgICAgIDogbGlzdF9mcm9udCggdGFyZ2V0X21vZHVsZV9saXN0ICkgKTsKKyAgICBtb2R1bGVfdCAqIHNvdXJjZV9tb2R1bGUgPSBiaW5kbW9kdWxlKCBsaXN0X2VtcHR5KCBzb3VyY2VfbW9kdWxlX2xpc3QgKQorICAgICAgICA/IDAKKyAgICAgICAgOiBsaXN0X2Zyb250KCBzb3VyY2VfbW9kdWxlX2xpc3QgKSApOworCisgICAgTElTVElURVIgc291cmNlX2l0ZXIgPSBsaXN0X2JlZ2luKCBzb3VyY2VfcnVsZXMgKTsKKyAgICBMSVNUSVRFUiBjb25zdCBzb3VyY2VfZW5kID0gbGlzdF9lbmQoIHNvdXJjZV9ydWxlcyApOworICAgIExJU1RJVEVSIHRhcmdldF9pdGVyID0gbGlzdF9iZWdpbiggdGFyZ2V0X3J1bGVzICk7CisgICAgTElTVElURVIgY29uc3QgdGFyZ2V0X2VuZCA9IGxpc3RfZW5kKCB0YXJnZXRfcnVsZXMgKTsKKworICAgIGZvciAoIDsKKyAgICAgICAgICBzb3VyY2VfaXRlciAhPSBzb3VyY2VfZW5kICYmIHRhcmdldF9pdGVyICE9IHRhcmdldF9lbmQ7CisgICAgICAgICAgc291cmNlX2l0ZXIgPSBsaXN0X25leHQoIHNvdXJjZV9pdGVyICksCisgICAgICAgICAgdGFyZ2V0X2l0ZXIgPSBsaXN0X25leHQoIHRhcmdldF9pdGVyICkgKQorICAgIHsKKyAgICAgICAgUlVMRSAqIHI7CisgICAgICAgIFJVTEUgKiBpbXBvcnRlZDsKKworICAgICAgICBpZiAoICFzb3VyY2VfbW9kdWxlLT5ydWxlcyB8fCAhKHIgPSAoUlVMRSAqKWhhc2hfZmluZCgKKyAgICAgICAgICAgIHNvdXJjZV9tb2R1bGUtPnJ1bGVzLCBsaXN0X2l0ZW0oIHNvdXJjZV9pdGVyICkgKSApICkKKyAgICAgICAgICAgIHVua25vd25fcnVsZSggZnJhbWUsICJJTVBPUlQiLCBzb3VyY2VfbW9kdWxlLCBsaXN0X2l0ZW0oIHNvdXJjZV9pdGVyCisgICAgICAgICAgICAgICAgKSApOworCisgICAgICAgIGltcG9ydGVkID0gaW1wb3J0X3J1bGUoIHIsIHRhcmdldF9tb2R1bGUsIGxpc3RfaXRlbSggdGFyZ2V0X2l0ZXIgKSApOworICAgICAgICBpZiAoICFsaXN0X2VtcHR5KCBsb2NhbGl6ZSApICkKKyAgICAgICAgICAgIHJ1bGVfbG9jYWxpemUoIGltcG9ydGVkLCB0YXJnZXRfbW9kdWxlICk7CisgICAgICAgIC8qIFRoaXMgcnVsZSBpcyByZWFsbHkgcGFydCBvZiBzb21lIG90aGVyIG1vZHVsZS4gSnVzdCByZWZlciB0byBpdCBoZXJlLAorICAgICAgICAgKiBidXQgZG8gbm90IGxldCBpdCBvdXQuCisgICAgICAgICAqLworICAgICAgICBpbXBvcnRlZC0+ZXhwb3J0ZWQgPSAwOworICAgIH0KKworICAgIGlmICggc291cmNlX2l0ZXIgIT0gc291cmNlX2VuZCB8fCB0YXJnZXRfaXRlciAhPSB0YXJnZXRfZW5kICkKKyAgICB7CisgICAgICAgIGJhY2t0cmFjZV9saW5lKCBmcmFtZS0+cHJldiApOworICAgICAgICBwcmludGYoICJpbXBvcnQgZXJyb3I6IGxlbmd0aCBvZiBzb3VyY2UgYW5kIHRhcmdldCBydWxlIG5hbWUgbGlzdHMgIgorICAgICAgICAgICAgImRvbid0IG1hdGNoIVxuIiApOworICAgICAgICBwcmludGYoICIgICAgc291cmNlOiAiICk7CisgICAgICAgIGxpc3RfcHJpbnQoIHNvdXJjZV9ydWxlcyApOworICAgICAgICBwcmludGYoICJcbiAgICB0YXJnZXQ6ICIgKTsKKyAgICAgICAgbGlzdF9wcmludCggdGFyZ2V0X3J1bGVzICk7CisgICAgICAgIHByaW50ZiggIlxuIiApOworICAgICAgICBiYWNrdHJhY2UoIGZyYW1lLT5wcmV2ICk7CisgICAgICAgIGV4aXQoIDEgKTsKKyAgICB9CisKKyAgICByZXR1cm4gTDA7Cit9CisKKworLyoKKyAqIGJ1aWx0aW5fZXhwb3J0KCkgLSBFWFBPUlQgKCBNT0RVTEUgPyA6IFJVTEVTICogKQorICoKKyAqIFRoZSBFWFBPUlQgcnVsZSBtYXJrcyBSVUxFUyBmcm9tIHRoZSBTT1VSQ0VfTU9EVUxFIGFzIG5vbi1sb2NhbCAoYW5kIHRodXMKKyAqIGV4cG9ydGFibGUpLiBJZiBhbiBlbGVtZW50IG9mIFJVTEVTIGRvZXMgbm90IG5hbWUgYSBydWxlIGluIE1PRFVMRSwgYW4gZXJyb3IKKyAqIGlzIGlzc3VlZC4KKyAqLworCitMSVNUICogYnVpbHRpbl9leHBvcnQoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGNvbnN0IG1vZHVsZV9saXN0ID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsKKyAgICBMSVNUICogY29uc3QgcnVsZXMgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMSApOworICAgIG1vZHVsZV90ICogY29uc3QgbSA9IGJpbmRtb2R1bGUoIGxpc3RfZW1wdHkoIG1vZHVsZV9saXN0ICkgPyAwIDogbGlzdF9mcm9udCgKKyAgICAgICAgbW9kdWxlX2xpc3QgKSApOworCisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIHJ1bGVzICk7CisgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIHJ1bGVzICk7CisgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICB7CisgICAgICAgIFJVTEUgKiByOworICAgICAgICBpZiAoICFtLT5ydWxlcyB8fCAhKCByID0gKFJVTEUgKiloYXNoX2ZpbmQoIG0tPnJ1bGVzLCBsaXN0X2l0ZW0oIGl0ZXIgKQorICAgICAgICAgICAgKSApICkKKyAgICAgICAgICAgIHVua25vd25fcnVsZSggZnJhbWUsICJFWFBPUlQiLCBtLCBsaXN0X2l0ZW0oIGl0ZXIgKSApOworICAgICAgICByLT5leHBvcnRlZCA9IDE7CisgICAgfQorICAgIHJldHVybiBMMDsKK30KKworCisvKgorICogZ2V0X3NvdXJjZV9saW5lKCkgLSBnZXQgYSBmcmFtZSdzIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBpcyB0aGUgZXhlY3V0aW9uIHRyYWNlYmFjayBpbmZvcm1hdGlvbiB0byBiZSBpbmRpY2F0ZWQgZm9yIGluIGRlYnVnCisgKiBvdXRwdXQgb3IgYW4gZXJyb3IgYmFja3RyYWNlLgorICovCisKK3N0YXRpYyB2b2lkIGdldF9zb3VyY2VfbGluZSggRlJBTUUgKiBmcmFtZSwgY2hhciBjb25zdCAqICogZmlsZSwgaW50ICogbGluZSApCit7CisgICAgaWYgKCBmcmFtZS0+ZmlsZSApCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogZiA9IG9iamVjdF9zdHIoIGZyYW1lLT5maWxlICk7CisgICAgICAgIGludCBsID0gZnJhbWUtPmxpbmU7CisgICAgICAgIGlmICggIXN0cmNtcCggZiwgIisiICkgKQorICAgICAgICB7CisgICAgICAgICAgICBmID0gImphbWJhc2UuYyI7CisgICAgICAgICAgICBsICs9IDM7CisgICAgICAgIH0KKyAgICAgICAgKmZpbGUgPSBmOworICAgICAgICAqbGluZSA9IGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpmaWxlID0gIihidWlsdGluKSI7CisgICAgICAgICpsaW5lID0gLTE7CisgICAgfQorfQorCisKK3ZvaWQgcHJpbnRfc291cmNlX2xpbmUoIEZSQU1FICogZnJhbWUgKQoreworICAgIGNoYXIgY29uc3QgKiBmaWxlOworICAgIGludCBsaW5lOworICAgIGdldF9zb3VyY2VfbGluZSggZnJhbWUsICZmaWxlLCAmbGluZSApOworICAgIGlmICggbGluZSA8IDAgKQorICAgICAgICBwcmludGYoICIoYnVpbHRpbik6IiApOworICAgIGVsc2UKKyAgICAgICAgcHJpbnRmKCAiJXM6JWQ6IiwgZmlsZSwgbGluZSApOworfQorCisKKy8qCisgKiBiYWNrdHJhY2VfbGluZSgpIC0gcHJpbnQgYSBzaW5nbGUgbGluZSBvZiBlcnJvciBiYWNrdHJhY2UgZm9yIHRoZSBnaXZlbgorICogZnJhbWUuCisgKi8KKwordm9pZCBiYWNrdHJhY2VfbGluZSggRlJBTUUgKiBmcmFtZSApCit7CisgICAgaWYgKCBmcmFtZSA9PSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIihubyBmcmFtZSk6IiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludF9zb3VyY2VfbGluZSggZnJhbWUgKTsKKyAgICAgICAgcHJpbnRmKCAiIGluICVzXG4iLCBmcmFtZS0+cnVsZW5hbWUgKTsKKyAgICB9Cit9CisKKworLyoKKyAqIGJhY2t0cmFjZSgpIC0gUHJpbnQgdGhlIGVudGlyZSBiYWNrdHJhY2UgZnJvbSB0aGUgZ2l2ZW4gZnJhbWUgdG8gdGhlIEphbWJhc2UKKyAqIHdoaWNoIGludm9rZWQgaXQuCisgKi8KKwordm9pZCBiYWNrdHJhY2UoIEZSQU1FICogZnJhbWUgKQoreworICAgIGlmICggIWZyYW1lICkgcmV0dXJuOworICAgIHdoaWxlICggKCBmcmFtZSA9IGZyYW1lLT5wcmV2ICkgKQorICAgICAgICBiYWNrdHJhY2VfbGluZSggZnJhbWUgKTsKK30KKworCisvKgorICogYnVpbHRpbl9iYWNrdHJhY2UoKSAtIEEgSmFtIHZlcnNpb24gb2YgdGhlIGJhY2t0cmFjZSBmdW5jdGlvbiwgdGFraW5nIG5vCisgKiBhcmd1bWVudHMgYW5kIHJldHVybmluZyBhIGxpc3Qgb2YgcXVhZHJ1cGxlczogRklMRU5BTUUgTElORSBNT0RVTEUuIFJVTEVOQU1FCisgKiBkZXNjcmliaW5nIGVhY2ggZnJhbWUuIE5vdGUgdGhhdCB0aGUgbW9kdWxlLW5hbWUgaXMgYWx3YXlzIGZvbGxvd2VkIGJ5IGEKKyAqIHBlcmlvZC4KKyAqLworCitMSVNUICogYnVpbHRpbl9iYWNrdHJhY2UoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGNvbnN0IGxldmVsc19hcmcgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIGludCBsZXZlbHMgPSBsaXN0X2VtcHR5KCBsZXZlbHNfYXJnICkKKyAgICAgICAgPyAoaW50KSggKHVuc2lnbmVkIGludCkoLTEpID4+IDEgKQorICAgICAgICA6IGF0b2koIG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIGxldmVsc19hcmcgKSApICk7CisKKyAgICBMSVNUICogcmVzdWx0ID0gTDA7CisgICAgZm9yICggOyAoIGZyYW1lID0gZnJhbWUtPnByZXYgKSAmJiBsZXZlbHM7IC0tbGV2ZWxzICkKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBmaWxlOworICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgY2hhciBidWZbIDMyIF07CisgICAgICAgIHN0cmluZyBtb2R1bGVfbmFtZVsgMSBdOworICAgICAgICBnZXRfc291cmNlX2xpbmUoIGZyYW1lLCAmZmlsZSwgJmxpbmUgKTsKKyAgICAgICAgc3ByaW50ZiggYnVmLCAiJWQiLCBsaW5lICk7CisgICAgICAgIHN0cmluZ19uZXcoIG1vZHVsZV9uYW1lICk7CisgICAgICAgIGlmICggZnJhbWUtPm1vZHVsZS0+bmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZ19hcHBlbmQoIG1vZHVsZV9uYW1lLCBvYmplY3Rfc3RyKCBmcmFtZS0+bW9kdWxlLT5uYW1lICkgKTsKKyAgICAgICAgICAgIHN0cmluZ19hcHBlbmQoIG1vZHVsZV9uYW1lLCAiLiIgKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBsaXN0X3B1c2hfYmFjayggcmVzdWx0LCBvYmplY3RfbmV3KCBmaWxlICkgKTsKKyAgICAgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwgb2JqZWN0X25ldyggYnVmICkgKTsKKyAgICAgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwgb2JqZWN0X25ldyggbW9kdWxlX25hbWUtPnZhbHVlICkgKTsKKyAgICAgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwgb2JqZWN0X25ldyggZnJhbWUtPnJ1bGVuYW1lICkgKTsKKyAgICAgICAgc3RyaW5nX2ZyZWUoIG1vZHVsZV9uYW1lICk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIGJ1aWx0aW5fY2FsbGVyX21vZHVsZSgpIC0gQ0FMTEVSX01PRFVMRSAoIGxldmVscyA/ICkKKyAqCisgKiBJZiBsZXZlbHMgaXMgbm90IHN1cHBsaWVkLCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgb2YgdGhlIHJ1bGUgd2hpY2gKKyAqIGNhbGxlZCB0aGUgb25lIGNhbGxpbmcgdGhpcyBvbmUuIElmIGxldmVscyBpcyBzdXBwbGllZCwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMKKyAqIGFuIGludGVnZXIgc3BlY2lmeWluZyBhIG51bWJlciBvZiBhZGRpdGlvbmFsIGxldmVscyBvZiBjYWxsIHN0YWNrIHRvIHRyYXZlcnNlCisgKiBpbiBvcmRlciB0byBsb2NhdGUgdGhlIG1vZHVsZSBpbiBxdWVzdGlvbi4gSWYgbm8gc3VjaCBtb2R1bGUgZXhpc3RzLCByZXR1cm5zCisgKiB0aGUgZW1wdHkgbGlzdC4gQWxzbyByZXR1cm5zIHRoZSBlbXB0eSBsaXN0IHdoZW4gdGhlIG1vZHVsZSBpbiBxdWVzdGlvbiBpcworICogdGhlIGdsb2JhbCBtb2R1bGUuIFRoaXMgcnVsZSBpcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyBtb2R1bGUgaW1wb3J0CisgKiBiZWhhdmlvci4KKyAqLworCitMSVNUICogYnVpbHRpbl9jYWxsZXJfbW9kdWxlKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiBjb25zdCBsZXZlbHNfYXJnID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsKKyAgICBpbnQgY29uc3QgbGV2ZWxzID0gbGlzdF9lbXB0eSggbGV2ZWxzX2FyZyApCisgICAgICAgID8gMAorICAgICAgICA6IGF0b2koIG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIGxldmVsc19hcmcgKSApICk7CisKKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgKCBpIDwgbGV2ZWxzICsgMiApICYmIGZyYW1lLT5wcmV2OyArK2kgKQorICAgICAgICBmcmFtZSA9IGZyYW1lLT5wcmV2OworCisgICAgcmV0dXJuIGZyYW1lLT5tb2R1bGUgPT0gcm9vdF9tb2R1bGUoKQorICAgICAgICA/IEwwCisgICAgICAgIDogbGlzdF9uZXcoIG9iamVjdF9jb3B5KCBmcmFtZS0+bW9kdWxlLT5uYW1lICkgKTsKK30KKworCisvKgorICogUmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICoKKyAqIFVzYWdlOiBwd2QgPSBbIFBXRCBdIDsKKyAqLworCitMSVNUICogYnVpbHRpbl9wd2QoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgcmV0dXJuIGxpc3RfbmV3KCBvYmplY3RfY29weSggY3dkKCkgKSApOworfQorCisKKy8qCisgKiBBZGRzIHRhcmdldHMgdG8gdGhlIGxpc3Qgb2YgdGFyZ2V0IHRoYXQgamFtIHdpbGwgYXR0ZW1wdCB0byB1cGRhdGUuCisgKi8KKworTElTVCAqIGJ1aWx0aW5fdXBkYXRlKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiByZXN1bHQgPSBsaXN0X2NvcHkoIHRhcmdldHNfdG9fdXBkYXRlKCkgKTsKKyAgICBMSVNUICogYXJnMSA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIGFyZzEgKSwgZW5kID0gbGlzdF9lbmQoIGFyZzEgKTsKKyAgICBjbGVhcl90YXJnZXRzX3RvX3VwZGF0ZSgpOworICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgIG1hcmtfdGFyZ2V0X2Zvcl91cGRhdGluZyggb2JqZWN0X2NvcHkoIGxpc3RfaXRlbSggaXRlciApICkgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitleHRlcm4gaW50IGFueWhvdzsKK2ludCBsYXN0X3VwZGF0ZV9ub3dfc3RhdHVzOworCisvKiBUYWtlcyBhIGxpc3Qgb2YgdGFyZ2V0IG5hbWVzIGFuZCBpbW1lZGlhdGVseSB1cGRhdGVzIHRoZW0uCisgKgorICogUGFyYW1ldGVyczoKKyAqICAxLiBUYXJnZXQgbGlzdC4KKyAqICAyLiBPcHRpb25hbCBmaWxlIGRlc2NyaXB0b3IgKGNvbnZlcnRlZCB0byBhIHN0cmluZykgZm9yIGEgbG9nIGZpbGUgd2hlcmUgYWxsCisgKiAgICAgdGhlIHJlbGF0ZWQgYnVpbGQgb3V0cHV0IHNob3VsZCBiZSByZWRpcmVjdGVkLgorICogIDMuIElmIHNwZWNpZmllZCwgbWFrZXMgdGhlIGJ1aWxkIHRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIC1uIG9wdGlvbiwgaS5lLgorICogICAgIGZvcmNlcyBhbGwgbmVlZGVkIG91dC1vZi1kYXRlIHRhcmdldHMgdG8gYmUgcmVidWlsdC4KKyAqICA0LiBJZiBzcGVjaWZpZWQsIG1ha2VzIHRoZSBidWlsZCB0ZW1wb3JhcmlseSBkaXNhYmxlIHRoZSAtcSBvcHRpb24sIGkuZS4KKyAqICAgICBmb3JjZXMgdGhlIGJ1aWxkIHRvIGNvbnRpbnVlIGV2ZW4gaWYgb25lIG9mIHRoZSB0YXJnZXRzIGZhaWxzIHRvIGJ1aWxkLgorICovCitMSVNUICogYnVpbHRpbl91cGRhdGVfbm93KCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiB0YXJnZXRzID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsKKyAgICBMSVNUICogbG9nID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDEgKTsKKyAgICBMSVNUICogZm9yY2UgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMiApOworICAgIExJU1QgKiBjb250aW51ZV8gPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMyApOworICAgIGludCBzdGF0dXM7CisgICAgaW50IG9yaWdpbmFsX3N0ZG91dCA9IDA7CisgICAgaW50IG9yaWdpbmFsX3N0ZGVyciA9IDA7CisgICAgaW50IG9yaWdpbmFsX25vZXhlYyA9IDA7CisgICAgaW50IG9yaWdpbmFsX3F1aXRxdWljayA9IDA7CisKKyAgICBpZiAoICFsaXN0X2VtcHR5KCBsb2cgKSApCisgICAgeworICAgICAgICAvKiBUZW1wb3JhcmlseSByZWRpcmVjdCBzdGRvdXQgYW5kIHN0ZGVyciB0byB0aGUgZ2l2ZW4gbG9nIGZpbGUuICovCisgICAgICAgIGludCBjb25zdCBmZCA9IGF0b2koIG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIGxvZyApICkgKTsKKyAgICAgICAgb3JpZ2luYWxfc3Rkb3V0ID0gZHVwKCAwICk7CisgICAgICAgIG9yaWdpbmFsX3N0ZGVyciA9IGR1cCggMSApOworICAgICAgICBkdXAyKCBmZCwgMCApOworICAgICAgICBkdXAyKCBmZCwgMSApOworICAgIH0KKworICAgIGlmICggIWxpc3RfZW1wdHkoIGZvcmNlICkgKQorICAgIHsKKyAgICAgICAgb3JpZ2luYWxfbm9leGVjID0gZ2xvYnMubm9leGVjOworICAgICAgICBnbG9icy5ub2V4ZWMgPSAwOworICAgIH0KKworICAgIGlmICggIWxpc3RfZW1wdHkoIGNvbnRpbnVlXyApICkKKyAgICB7CisgICAgICAgIG9yaWdpbmFsX3F1aXRxdWljayA9IGdsb2JzLnF1aXRxdWljazsKKyAgICAgICAgZ2xvYnMucXVpdHF1aWNrID0gMDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBtYWtlKCB0YXJnZXRzLCBhbnlob3cgKTsKKworICAgIGlmICggIWxpc3RfZW1wdHkoIGZvcmNlICkgKQorICAgIHsKKyAgICAgICAgZ2xvYnMubm9leGVjID0gb3JpZ2luYWxfbm9leGVjOworICAgIH0KKworICAgIGlmICggIWxpc3RfZW1wdHkoIGNvbnRpbnVlXyApICkKKyAgICB7CisgICAgICAgIGdsb2JzLnF1aXRxdWljayA9IG9yaWdpbmFsX3F1aXRxdWljazsKKyAgICB9CisKKyAgICBpZiAoICFsaXN0X2VtcHR5KCBsb2cgKSApCisgICAgeworICAgICAgICAvKiBGbHVzaCB3aGF0ZXZlciBzdGRpbyBtaWdodCBoYXZlIGJ1ZmZlcmVkLCB3aGlsZSBkZXNjcmlwdGlvbnMgMCBhbmQgMQorICAgICAgICAgKiBzdGlsbCByZWZlciB0byB0aGUgbG9nIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBmZmx1c2goIHN0ZG91dCApOworICAgICAgICBmZmx1c2goIHN0ZGVyciApOworICAgICAgICBkdXAyKCBvcmlnaW5hbF9zdGRvdXQsIDAgKTsKKyAgICAgICAgZHVwMiggb3JpZ2luYWxfc3RkZXJyLCAxICk7CisgICAgICAgIGNsb3NlKCBvcmlnaW5hbF9zdGRvdXQgKTsKKyAgICAgICAgY2xvc2UoIG9yaWdpbmFsX3N0ZGVyciApOworICAgIH0KKworICAgIGxhc3RfdXBkYXRlX25vd19zdGF0dXMgPSBzdGF0dXM7CisKKyAgICByZXR1cm4gc3RhdHVzID8gTDAgOiBsaXN0X25ldyggb2JqZWN0X2NvcHkoIGNvbnN0YW50X29rICkgKTsKK30KKworCitMSVNUICogYnVpbHRpbl9pbXBvcnRfbW9kdWxlKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiBjb25zdCBhcmcxID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsKKyAgICBMSVNUICogY29uc3QgYXJnMiA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAxICk7CisgICAgbW9kdWxlX3QgKiBjb25zdCBtID0gbGlzdF9lbXB0eSggYXJnMiApCisgICAgICAgID8gcm9vdF9tb2R1bGUoKQorICAgICAgICA6IGJpbmRtb2R1bGUoIGxpc3RfZnJvbnQoIGFyZzIgKSApOworICAgIGltcG9ydF9tb2R1bGUoIGFyZzEsIG0gKTsKKyAgICByZXR1cm4gTDA7Cit9CisKKworTElTVCAqIGJ1aWx0aW5faW1wb3J0ZWRfbW9kdWxlcyggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBMSVNUICogY29uc3QgYXJnMCA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgT0JKRUNUICogY29uc3QgbW9kdWxlID0gbGlzdF9lbXB0eSggYXJnMCApID8gMCA6IGxpc3RfZnJvbnQoIGFyZzAgKTsKKyAgICByZXR1cm4gaW1wb3J0ZWRfbW9kdWxlcyggYmluZG1vZHVsZSggbW9kdWxlICkgKTsKK30KKworCitMSVNUICogYnVpbHRpbl9pbnN0YW5jZSggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBMSVNUICogYXJnMSA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgTElTVCAqIGFyZzIgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMSApOworICAgIG1vZHVsZV90ICogY29uc3QgaW5zdGFuY2UgICAgID0gYmluZG1vZHVsZSggbGlzdF9mcm9udCggYXJnMSApICk7CisgICAgbW9kdWxlX3QgKiBjb25zdCBjbGFzc19tb2R1bGUgPSBiaW5kbW9kdWxlKCBsaXN0X2Zyb250KCBhcmcyICkgKTsKKyAgICBpbnN0YW5jZS0+Y2xhc3NfbW9kdWxlID0gY2xhc3NfbW9kdWxlOworICAgIG1vZHVsZV9zZXRfZml4ZWRfdmFyaWFibGVzKCBpbnN0YW5jZSwgY2xhc3NfbW9kdWxlLT5udW1fZml4ZWRfdmFyaWFibGVzICk7CisgICAgcmV0dXJuIEwwOworfQorCisKK0xJU1QgKiBidWlsdGluX3NvcnQoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgcmV0dXJuIGxpc3Rfc29ydCggbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKSApOworfQorCisKK0xJU1QgKiBidWlsdGluX25vcm1hbGl6ZV9wYXRoKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiBhcmcgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworCisgICAgLyogRmlyc3QsIHdlIGl0ZXJhdGUgb3ZlciBhbGwgJy8nLXNlcGFyYXRlZCBlbGVtZW50cywgc3RhcnRpbmcgZnJvbSB0aGUgZW5kCisgICAgICogb2Ygc3RyaW5nLiBJZiB3ZSBzZWUgYSAnLi4nLCB3ZSByZW1vdmUgYSBwcmVjZWVkaW5nIHBhdGggZWxlbWVudC4gSWYgd2UKKyAgICAgKiBzZWUgJy4nLCB3ZSByZW1vdmUgaXQuIFJlbW92YWwgaXMgZG9uZSBieSBvdmVyd3JpdGluZyBkYXRhIHVzaW5nICdcMScKKyAgICAgKiBjaGFyYWN0ZXJzLiBBZnRlciB0aGUgd2hvbGUgc3RyaW5nIGhhcyBiZWVuIHByb2Nlc3NlZCwgd2UgZG8gYSBzZWNvbmQKKyAgICAgKiBwYXNzLCByZW1vdmluZyBhbnkgZW50ZXJlZCAnXDEnIGNoYXJhY3RlcnMuCisgICAgICovCisKKyAgICBzdHJpbmcgICBpblsgMSBdOworICAgIHN0cmluZyAgIG91dFsgMSBdOworICAgIC8qIExhc3QgY2hhcmFjdGVyIG9mIHRoZSBwYXJ0IG9mIHN0cmluZyBzdGlsbCB0byBiZSBwcm9jZXNzZWQuICovCisgICAgY2hhciAgICogZW5kOworICAgIC8qIFdvcmtpbmcgcG9pbnRlci4gKi8KKyAgICBjaGFyICAgKiBjdXJyZW50OworICAgIC8qIE51bWJlciBvZiAnLi4nIGVsZW1lbnRzIHNlZW4gYW5kIG5vdCBwcm9jZXNzZWQgeWV0LiAqLworICAgIGludCAgICAgIGRvdGRvdHMgPSAwOworICAgIGludCAgICAgIHJvb3RlZCAgPSAwOworICAgIE9CSkVDVCAqIHJlc3VsdCAgPSAwOworICAgIExJU1RJVEVSIGFyZ19pdGVyID0gbGlzdF9iZWdpbiggYXJnICk7CisgICAgTElTVElURVIgYXJnX2VuZCA9IGxpc3RfZW5kKCBhcmcgKTsKKworICAgIC8qIE1ha2UgYSBjb3B5IG9mIGlucHV0OiB3ZSBzaG91bGQgbm90IGNoYW5nZSBpdC4gUHJlcGVuZCBhICcvJyBiZWZvcmUgaXQgYXMKKyAgICAgKiBhIGd1YXJkIGZvciB0aGUgYWxnb3JpdGhtIGxhdGVyIG9uIGFuZCByZW1lbWJlciB3aGV0aGVyIGl0IHdhcyBvcmlnaW5hbGx5CisgICAgICogcm9vdGVkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBzdHJpbmdfbmV3KCBpbiApOworICAgIHN0cmluZ19wdXNoX2JhY2soIGluLCAnLycgKTsKKyAgICBmb3IgKCA7IGFyZ19pdGVyICE9IGFyZ19lbmQ7IGFyZ19pdGVyID0gbGlzdF9uZXh0KCBhcmdfaXRlciApICkKKyAgICB7CisgICAgICAgIGlmICggb2JqZWN0X3N0ciggbGlzdF9pdGVtKCBhcmdfaXRlciApIClbIDAgXSAhPSAnXDAnICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpbi0+c2l6ZSA9PSAxICkKKyAgICAgICAgICAgICAgICByb290ZWQgPSAoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggYXJnX2l0ZXIgKSApWyAwIF0gPT0gJy8nICApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGFyZ19pdGVyICkgKVsgMCBdID09ICdcXCcgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdHJpbmdfYXBwZW5kKCBpbiwgIi8iICk7CisgICAgICAgICAgICBzdHJpbmdfYXBwZW5kKCBpbiwgb2JqZWN0X3N0ciggbGlzdF9pdGVtKCBhcmdfaXRlciApICkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENvbnZlcnQgXCBpbnRvIC8uIE9uIFdpbmRvd3MsIHBhdGhzIHVzaW5nIC8gYW5kIFwgYXJlIGVxdWl2YWxlbnQsIGFuZCB3ZQorICAgICAqIHdhbnQgdGhpcyBmdW5jdGlvbiB0byBvYnRhaW4gYSBjYW5vbmljIHJlcHJlc2VudGF0aW9uLgorICAgICAqLworICAgIGZvciAoIGN1cnJlbnQgPSBpbi0+dmFsdWUsIGVuZCA9IGluLT52YWx1ZSArIGluLT5zaXplOworICAgICAgICBjdXJyZW50IDwgZW5kOyArK2N1cnJlbnQgKQorICAgICAgICBpZiAoICpjdXJyZW50ID09ICdcXCcgKQorICAgICAgICAgICAgKmN1cnJlbnQgPSAnLyc7CisKKyAgICAvKiBOb3cgd2UgcmVtb3ZlIGFueSBleHRyYSBwYXRoIGVsZW1lbnRzIGJ5IG92ZXJ3cml0aW5nIHRoZW0gd2l0aCAnXDEnCisgICAgICogY2hhcmFjdGVycyBhbmQgY291bmQgaG93IG1hbnkgbW9yZSB1bnVzZWQgJy4uJyBwYXRoIGVsZW1lbnRzIHRoZXJlIGFyZQorICAgICAqIHJlbWFpbmluZy4gTm90ZSB0aGF0IGVhY2ggcmVtYWluaW5nIHBhdGggZWxlbWVudCB3aXRoIGFsd2F5cyBzdGFydHMgd2l0aAorICAgICAqIGEgJy8nIGNoYXJhY3Rlci4KKyAgICAgKi8KKyAgICBmb3IgKCBlbmQgPSBpbi0+dmFsdWUgKyBpbi0+c2l6ZSAtIDE7IGVuZCA+PSBpbi0+dmFsdWU7ICkKKyAgICB7CisgICAgICAgIC8qIFNldCAnY3VycmVudCcgdG8gdGhlIG5leHQgb2NjdXJlbmNlIG9mICcvJywgd2hpY2ggYWx3YXlzIGV4aXN0cy4gKi8KKyAgICAgICAgZm9yICggY3VycmVudCA9IGVuZDsgKmN1cnJlbnQgIT0gJy8nOyAtLWN1cnJlbnQgKTsKKworICAgICAgICBpZiAoIGN1cnJlbnQgPT0gZW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRm91bmQgYSB0cmFpbGluZyBvciBkdXBsaWNhdGUgJy8nLiBSZW1vdmUgaXQuICovCisgICAgICAgICAgICAqY3VycmVudCA9ICdcMSc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoICggZW5kIC0gY3VycmVudCA9PSAxICkgJiYgKCAqKCBjdXJyZW50ICsgMSApID09ICcuJyApICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRm91bmQgJy8uJy4gUmVtb3ZlIHRoZW0gYWxsLiAqLworICAgICAgICAgICAgKmN1cnJlbnQgPSAnXDEnOworICAgICAgICAgICAgKihjdXJyZW50ICsgMSkgPSAnXDEnOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAoIGVuZCAtIGN1cnJlbnQgPT0gMiApICYmICggKiggY3VycmVudCArIDEgKSA9PSAnLicgKSAmJgorICAgICAgICAgICAgKCAqKCBjdXJyZW50ICsgMiApID09ICcuJyApICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRm91bmQgJy8uLicuIFJlbW92ZSB0aGVtIGFsbC4gKi8KKyAgICAgICAgICAgICpjdXJyZW50ID0gJ1wxJzsKKyAgICAgICAgICAgICooY3VycmVudCArIDEpID0gJ1wxJzsKKyAgICAgICAgICAgICooY3VycmVudCArIDIpID0gJ1wxJzsKKyAgICAgICAgICAgICsrZG90ZG90czsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZG90ZG90cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldCggY3VycmVudCwgJ1wxJywgZW5kIC0gY3VycmVudCArIDEgKTsKKyAgICAgICAgICAgIC0tZG90ZG90czsKKyAgICAgICAgfQorICAgICAgICBlbmQgPSBjdXJyZW50IC0gMTsKKyAgICB9CisKKyAgICBzdHJpbmdfbmV3KCBvdXQgKTsKKworICAgIC8qIE5vdyB3ZSBrbm93IHRoYXQgd2UgbmVlZCB0byBhZGQgZXhhY3RseSBkb3Rkb3RzICcuLicgcGF0aCBlbGVtZW50cyB0byB0aGUKKyAgICAgKiBmcm9udCBhbmQgdGhhdCBvdXIgc3RyaW5nIGlzIGVpdGhlciBlbXB0eSBvciBoYXMgYSAnLycgYXMgaXRzIGZpcnN0CisgICAgICogc2lnbmlmaWNhbnQgY2hhcmFjdGVyLiBJZiB3ZSBoYXZlIGFueSBkb3Rkb3RzIHJlbWFpbmluZyB0aGVuIHRoZSBwYXNzZWQKKyAgICAgKiBwYXRoIG11c3Qgbm90IGhhdmUgYmVlbiByb290ZWQgb3IgZWxzZSBpdCBpcyBpbnZhbGlkIHdlIHJldHVybiBhbiBlbXB0eQorICAgICAqIGxpc3QuCisgICAgICovCisgICAgaWYgKCBkb3Rkb3RzICkKKyAgICB7CisgICAgICAgIGlmICggcm9vdGVkICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nX2ZyZWUoIG91dCApOworICAgICAgICAgICAgc3RyaW5nX2ZyZWUoIGluICk7CisgICAgICAgICAgICByZXR1cm4gTDA7CisgICAgICAgIH0KKyAgICAgICAgZG8KKyAgICAgICAgICAgIHN0cmluZ19hcHBlbmQoIG91dCwgIi8uLiIgKTsKKyAgICAgICAgd2hpbGUgKCAtLWRvdGRvdHMgKTsKKyAgICB9CisKKyAgICAvKiBOb3cgd2UgYWN0dWFsbHkgcmVtb3ZlIGFsbCB0aGUgcGF0aCBjaGFyYWN0ZXJzIG1hcmtlZCBmb3IgcmVtb3ZhbC4gKi8KKyAgICBmb3IgKCBjdXJyZW50ID0gaW4tPnZhbHVlOyAqY3VycmVudDsgKytjdXJyZW50ICkKKyAgICAgICAgaWYgKCAqY3VycmVudCAhPSAnXDEnICkKKyAgICAgICAgICAgIHN0cmluZ19wdXNoX2JhY2soIG91dCwgKmN1cnJlbnQgKTsKKworICAgIC8qIEhlcmUgd2Uga25vdyB0aGF0IG91ciBzdHJpbmcgY29udGFpbnMgbm8gJ1wxJyBjaGFyYWN0ZXJzIGFuZCBpcyBlaXRoZXIKKyAgICAgKiBlbXB0eSBvciBoYXMgYSAnLycgYXMgaXRzIGluaXRpYWwgY2hhcmFjdGVyLiBJZiB0aGUgb3JpZ2luYWwgcGF0aCB3YXMgbm90CisgICAgICogcm9vdGVkIGFuZCB3ZSBoYXZlIGEgbm9uLWVtcHR5IHBhdGggd2UgbmVlZCB0byBkcm9wIHRoZSBpbml0aWFsICcvJy4gSWYKKyAgICAgKiB0aGUgb3JpZ2luYWwgcGF0aCB3YXMgcm9vdGVkIGFuZCB3ZSBoYXZlIGFuIGVtcHR5IHBhdGggd2UgbmVlZCB0byBhZGQKKyAgICAgKiBiYWNrIHRoZSAnLycuCisgICAgICovCisgICAgcmVzdWx0ID0gb2JqZWN0X25ldyggb3V0LT5zaXplCisgICAgICAgID8gb3V0LT52YWx1ZSArICFyb290ZWQKKyAgICAgICAgOiAoIHJvb3RlZCA/ICIvIiA6ICIuIiApICk7CisKKyAgICBzdHJpbmdfZnJlZSggb3V0ICk7CisgICAgc3RyaW5nX2ZyZWUoIGluICk7CisKKyAgICByZXR1cm4gbGlzdF9uZXcoIHJlc3VsdCApOworfQorCisKK0xJU1QgKiBidWlsdGluX25hdGl2ZV9ydWxlKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiBtb2R1bGVfbmFtZSA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgTElTVCAqIHJ1bGVfbmFtZSA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAxICk7CisKKyAgICBtb2R1bGVfdCAqIG1vZHVsZSA9IGJpbmRtb2R1bGUoIGxpc3RfZnJvbnQoIG1vZHVsZV9uYW1lICkgKTsKKworICAgIG5hdGl2ZV9ydWxlX3QgKiBucDsKKyAgICBpZiAoIG1vZHVsZS0+bmF0aXZlX3J1bGVzICYmIChucCA9IChuYXRpdmVfcnVsZV90ICopaGFzaF9maW5kKAorICAgICAgICBtb2R1bGUtPm5hdGl2ZV9ydWxlcywgbGlzdF9mcm9udCggcnVsZV9uYW1lICkgKSApICkKKyAgICB7CisgICAgICAgIG5ld19ydWxlX2JvZHkoIG1vZHVsZSwgbnAtPm5hbWUsIG5wLT5wcm9jZWR1cmUsIDEgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmFja3RyYWNlX2xpbmUoIGZyYW1lLT5wcmV2ICk7CisgICAgICAgIHByaW50ZiggImVycm9yOiBubyBuYXRpdmUgcnVsZSBcIiVzXCIgZGVmaW5lZCBpbiBtb2R1bGUgXCIlcy5cIlxuIiwKKyAgICAgICAgICAgIG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIHJ1bGVfbmFtZSApICksIG9iamVjdF9zdHIoIG1vZHVsZS0+bmFtZSApICk7CisgICAgICAgIGJhY2t0cmFjZSggZnJhbWUtPnByZXYgKTsKKyAgICAgICAgZXhpdCggMSApOworICAgIH0KKyAgICByZXR1cm4gTDA7Cit9CisKKworTElTVCAqIGJ1aWx0aW5faGFzX25hdGl2ZV9ydWxlKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiBtb2R1bGVfbmFtZSA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgTElTVCAqIHJ1bGVfbmFtZSAgID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDEgKTsKKyAgICBMSVNUICogdmVyc2lvbiAgICAgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMiApOworCisgICAgbW9kdWxlX3QgKiBtb2R1bGUgPSBiaW5kbW9kdWxlKCBsaXN0X2Zyb250KCBtb2R1bGVfbmFtZSApICk7CisKKyAgICBuYXRpdmVfcnVsZV90ICogbnA7CisgICAgaWYgKCBtb2R1bGUtPm5hdGl2ZV9ydWxlcyAmJiAobnAgPSAobmF0aXZlX3J1bGVfdCAqKWhhc2hfZmluZCgKKyAgICAgICAgbW9kdWxlLT5uYXRpdmVfcnVsZXMsIGxpc3RfZnJvbnQoIHJ1bGVfbmFtZSApICkgKSApCisgICAgeworICAgICAgICBpbnQgZXhwZWN0ZWRfdmVyc2lvbiA9IGF0b2koIG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIHZlcnNpb24gKSApICk7CisgICAgICAgIGlmICggbnAtPnZlcnNpb24gPT0gZXhwZWN0ZWRfdmVyc2lvbiApCisgICAgICAgICAgICByZXR1cm4gbGlzdF9uZXcoIG9iamVjdF9jb3B5KCBjb25zdGFudF90cnVlICkgKTsKKyAgICB9CisgICAgcmV0dXJuIEwwOworfQorCisKK0xJU1QgKiBidWlsdGluX3VzZXJfbW9kdWxlKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiBjb25zdCBtb2R1bGVfbmFtZSA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIG1vZHVsZV9uYW1lICk7CisgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIG1vZHVsZV9uYW1lICk7CisgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgYmluZG1vZHVsZSggbGlzdF9pdGVtKCBpdGVyICkgKS0+dXNlcl9tb2R1bGUgPSAxOworICAgIHJldHVybiBMMDsKK30KKworCitMSVNUICogYnVpbHRpbl9uZWFyZXN0X3VzZXJfbG9jYXRpb24oIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgRlJBTUUgKiBjb25zdCBuZWFyZXN0X3VzZXJfZnJhbWUgPSBmcmFtZS0+bW9kdWxlLT51c2VyX21vZHVsZQorICAgICAgICA/IGZyYW1lCisgICAgICAgIDogZnJhbWUtPnByZXZfdXNlcjsKKyAgICBpZiAoICFuZWFyZXN0X3VzZXJfZnJhbWUgKQorICAgICAgICByZXR1cm4gTDA7CisKKyAgICB7CisgICAgICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICAgICAgY2hhciBjb25zdCAqIGZpbGU7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBjaGFyIGJ1ZlsgMzIgXTsKKworICAgICAgICBnZXRfc291cmNlX2xpbmUoIG5lYXJlc3RfdXNlcl9mcmFtZSwgJmZpbGUsICZsaW5lICk7CisgICAgICAgIHNwcmludGYoIGJ1ZiwgIiVkIiwgbGluZSApOworICAgICAgICByZXN1bHQgPSBsaXN0X3B1c2hfYmFjayggcmVzdWx0LCBvYmplY3RfbmV3KCBmaWxlICkgKTsKKyAgICAgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwgb2JqZWN0X25ldyggYnVmICkgKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKKworTElTVCAqIGJ1aWx0aW5fY2hlY2tfaWZfZmlsZSggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBMSVNUICogY29uc3QgbmFtZSA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgcmV0dXJuIGZpbGVfaXNfZmlsZSggbGlzdF9mcm9udCggbmFtZSApICkgPT0gMQorICAgICAgICA/IGxpc3RfbmV3KCBvYmplY3RfY29weSggY29uc3RhbnRfdHJ1ZSApICkKKyAgICAgICAgOiBMMDsKK30KKworCitMSVNUICogYnVpbHRpbl9tZDUoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGwgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIGNoYXIgY29uc3QgKiBzID0gb2JqZWN0X3N0ciggbGlzdF9mcm9udCggbCApICk7CisKKyAgICBtZDVfc3RhdGVfdCBzdGF0ZTsKKyAgICBtZDVfYnl0ZV90IGRpZ2VzdFsgMTYgXTsKKyAgICBjaGFyIGhleF9vdXRwdXRbIDE2ICogMiArIDEgXTsKKworICAgIGludCBkaTsKKworICAgIG1kNV9pbml0KCAmc3RhdGUgKTsKKyAgICBtZDVfYXBwZW5kKCAmc3RhdGUsIChtZDVfYnl0ZV90IGNvbnN0ICopcywgc3RybGVuKCBzICkgKTsKKyAgICBtZDVfZmluaXNoKCAmc3RhdGUsIGRpZ2VzdCApOworCisgICAgZm9yICggZGkgPSAwOyBkaSA8IDE2OyArK2RpICkKKyAgICAgICAgc3ByaW50ZiggaGV4X291dHB1dCArIGRpICogMiwgIiUwMngiLCBkaWdlc3RbIGRpIF0gKTsKKworICAgIHJldHVybiBsaXN0X25ldyggb2JqZWN0X25ldyggaGV4X291dHB1dCApICk7Cit9CisKKworTElTVCAqIGJ1aWx0aW5fZmlsZV9vcGVuKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIGNoYXIgY29uc3QgKiBuYW1lID0gb2JqZWN0X3N0ciggbGlzdF9mcm9udCggbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKSApICk7CisgICAgY2hhciBjb25zdCAqIG1vZGUgPSBvYmplY3Rfc3RyKCBsaXN0X2Zyb250KCBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMSApICkgKTsKKyAgICBpbnQgZmQ7CisgICAgY2hhciBidWZmZXJbIHNpemVvZiggIjQyOTQ5NjcyOTUiICkgXTsKKworICAgIGlmICggc3RyY21wKG1vZGUsICJ3IikgPT0gMCApCisgICAgICAgIGZkID0gb3BlbiggbmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCAwNjY2ICk7CisgICAgZWxzZQorICAgICAgICBmZCA9IG9wZW4oIG5hbWUsIE9fUkRPTkxZICk7CisKKyAgICBpZiAoIGZkICE9IC0xICkKKyAgICB7CisgICAgICAgIHNwcmludGYoIGJ1ZmZlciwgIiVkIiwgZmQgKTsKKyAgICAgICAgcmV0dXJuIGxpc3RfbmV3KCBvYmplY3RfbmV3KCBidWZmZXIgKSApOworICAgIH0KKyAgICByZXR1cm4gTDA7Cit9CisKKworTElTVCAqIGJ1aWx0aW5fcGFkKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIE9CSkVDVCAqIHN0cmluZyA9IGxpc3RfZnJvbnQoIGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICkgKTsKKyAgICBjaGFyIGNvbnN0ICogd2lkdGhfcyA9IG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAxICkgKSApOworCisgICAgaW50IGN1cnJlbnQgPSBzdHJsZW4oIG9iamVjdF9zdHIoIHN0cmluZyApICk7CisgICAgaW50IGRlc2lyZWQgPSBhdG9pKCB3aWR0aF9zICk7CisgICAgaWYgKCBjdXJyZW50ID49IGRlc2lyZWQgKQorICAgICAgICByZXR1cm4gbGlzdF9uZXcoIG9iamVjdF9jb3B5KCBzdHJpbmcgKSApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNoYXIgKiBidWZmZXIgPSBCSkFNX01BTExPQyggZGVzaXJlZCArIDEgKTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIExJU1QgKiByZXN1bHQ7CisKKyAgICAgICAgc3RyY3B5KCBidWZmZXIsIG9iamVjdF9zdHIoIHN0cmluZyApICk7CisgICAgICAgIGZvciAoIGkgPSBjdXJyZW50OyBpIDwgZGVzaXJlZDsgKytpICkKKyAgICAgICAgICAgIGJ1ZmZlclsgaSBdID0gJyAnOworICAgICAgICBidWZmZXJbIGRlc2lyZWQgXSA9ICdcMCc7CisgICAgICAgIHJlc3VsdCA9IGxpc3RfbmV3KCBvYmplY3RfbmV3KCBidWZmZXIgKSApOworICAgICAgICBCSkFNX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KKworCitMSVNUICogYnVpbHRpbl9wcmVjaW91cyggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBMSVNUICogdGFyZ2V0cyA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIHRhcmdldHMgKTsKKyAgICBMSVNUSVRFUiBjb25zdCBlbmQgPSBsaXN0X2VuZCggdGFyZ2V0cyApOworICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgIGJpbmR0YXJnZXQoIGxpc3RfaXRlbSggaXRlciApICktPmZsYWdzIHw9IFRfRkxBR19QUkVDSU9VUzsKKyAgICByZXR1cm4gTDA7Cit9CisKKworTElTVCAqIGJ1aWx0aW5fc2VsZl9wYXRoKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIGV4dGVybiBjaGFyIGNvbnN0ICogc2F2ZWRfYXJndjA7CisgICAgY2hhciAqIHAgPSBleGVjdXRhYmxlX3BhdGgoIHNhdmVkX2FyZ3YwICk7CisgICAgaWYgKCBwICkKKyAgICB7CisgICAgICAgIExJU1QgKiBjb25zdCByZXN1bHQgPSBsaXN0X25ldyggb2JqZWN0X25ldyggcCApICk7CisgICAgICAgIGZyZWUoIHAgKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIEwwOworfQorCisKK0xJU1QgKiBidWlsdGluX21ha2VkaXIoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGNvbnN0IHBhdGggPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIHJldHVybiBmaWxlX21rZGlyKCBvYmplY3Rfc3RyKCBsaXN0X2Zyb250KCBwYXRoICkgKSApCisgICAgICAgID8gTDAKKyAgICAgICAgOiBsaXN0X25ldyggb2JqZWN0X2NvcHkoIGxpc3RfZnJvbnQoIHBhdGggKSApICk7Cit9CisKKworI2lmZGVmIEhBVkVfUFlUSE9OCisKK0xJU1QgKiBidWlsdGluX3B5dGhvbl9pbXBvcnRfcnVsZSggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBzdGF0aWMgaW50IGZpcnN0X3RpbWUgPSAxOworICAgIGNoYXIgY29uc3QgKiBweXRob25fbW9kdWxlICAgPSBvYmplY3Rfc3RyKCBsaXN0X2Zyb250KCBsb2xfZ2V0KCBmcmFtZS0+YXJncywKKyAgICAgICAgMCApICkgKTsKKyAgICBjaGFyIGNvbnN0ICogcHl0aG9uX2Z1bmN0aW9uID0gb2JqZWN0X3N0ciggbGlzdF9mcm9udCggbG9sX2dldCggZnJhbWUtPmFyZ3MsCisgICAgICAgIDEgKSApICk7CisgICAgT0JKRUNUICAgICAqIGphbV9tb2R1bGUgICAgICA9IGxpc3RfZnJvbnQoIGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAyICkgKTsKKyAgICBPQkpFQ1QgICAgICogamFtX3J1bGUgICAgICAgID0gbGlzdF9mcm9udCggbG9sX2dldCggZnJhbWUtPmFyZ3MsIDMgKSApOworCisgICAgUHlPYmplY3QgKiBwTmFtZTsKKyAgICBQeU9iamVjdCAqIHBNb2R1bGU7CisgICAgUHlPYmplY3QgKiBwRGljdDsKKyAgICBQeU9iamVjdCAqIHBGdW5jOworCisgICAgaWYgKCBmaXJzdF90aW1lICkKKyAgICB7CisgICAgICAgIC8qIEF0IHRoZSBmaXJzdCBpbnZvY2F0aW9uLCB3ZSBhZGQgdGhlIHZhbHVlIG9mIHRoZSBnbG9iYWwKKyAgICAgICAgICogRVhUUkFfUFlUSE9OUEFUSCB0byB0aGUgc3lzLnBhdGggUHl0aG9uIHZhcmlhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgTElTVCAqIGV4dHJhID0gMDsKKyAgICAgICAgbW9kdWxlX3QgKiBvdXRlcl9tb2R1bGUgPSBmcmFtZS0+bW9kdWxlOworICAgICAgICBMSVNUSVRFUiBpdGVyLCBlbmQ7CisKKyAgICAgICAgZmlyc3RfdGltZSA9IDA7CisKKyAgICAgICAgZXh0cmEgPSB2YXJfZ2V0KCByb290X21vZHVsZSgpLCBjb25zdGFudF9leHRyYV9weXRob25wYXRoICk7CisKKyAgICAgICAgaXRlciA9IGxpc3RfYmVnaW4oIGV4dHJhICksIGVuZCA9IGxpc3RfZW5kKCBleHRyYSApOworICAgICAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgYnVmWyAxIF07CisgICAgICAgICAgICBzdHJpbmdfbmV3KCBidWYgKTsKKyAgICAgICAgICAgIHN0cmluZ19hcHBlbmQoIGJ1ZiwgImltcG9ydCBzeXNcbnN5cy5wYXRoLmFwcGVuZChcIiIgKTsKKyAgICAgICAgICAgIHN0cmluZ19hcHBlbmQoIGJ1Ziwgb2JqZWN0X3N0ciggbGlzdF9pdGVtKCBpdGVyICkgKSApOworICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggYnVmLCAiXCIpXG4iICk7CisgICAgICAgICAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoIGJ1Zi0+dmFsdWUgKTsKKyAgICAgICAgICAgIHN0cmluZ19mcmVlKCBidWYgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBOYW1lICAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCBweXRob25fbW9kdWxlICk7CisgICAgcE1vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydCggcE5hbWUgKTsKKyAgICBQeV9ERUNSRUYoIHBOYW1lICk7CisKKyAgICBpZiAoIHBNb2R1bGUgIT0gTlVMTCApCisgICAgeworICAgICAgICBwRGljdCA9IFB5TW9kdWxlX0dldERpY3QoIHBNb2R1bGUgKTsKKyAgICAgICAgcEZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyggcERpY3QsIHB5dGhvbl9mdW5jdGlvbiApOworCisgICAgICAgIGlmICggcEZ1bmMgJiYgUHlDYWxsYWJsZV9DaGVjayggcEZ1bmMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZHVsZV90ICogbSA9IGJpbmRtb2R1bGUoIGphbV9tb2R1bGUgKTsKKyAgICAgICAgICAgIG5ld19ydWxlX2JvZHkoIG0sIGphbV9ydWxlLCBmdW5jdGlvbl9weXRob24oIHBGdW5jLCAwICksIDAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggUHlFcnJfT2NjdXJyZWQoKSApCisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNhbm5vdCBmaW5kIGZ1bmN0aW9uIFwiJXNcIlxuIiwgcHl0aG9uX2Z1bmN0aW9uICk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKCBwTW9kdWxlICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkZhaWxlZCB0byBsb2FkIFwiJXNcIlxuIiwgcHl0aG9uX21vZHVsZSApOworICAgIH0KKyAgICByZXR1cm4gTDA7CisKK30KKworI2VuZGlmICAvKiAjaWZkZWYgSEFWRV9QWVRIT04gKi8KKworCit2b2lkIGxvbF9idWlsZCggTE9MICogbG9sLCBjaGFyIGNvbnN0ICogKiBlbGVtZW50cyApCit7CisgICAgTElTVCAqIGwgPSBMMDsKKyAgICBsb2xfaW5pdCggbG9sICk7CisKKyAgICB3aGlsZSAoIGVsZW1lbnRzICYmICplbGVtZW50cyApCisgICAgeworICAgICAgICBpZiAoICFzdHJjbXAoICplbGVtZW50cywgIjoiICkgKQorICAgICAgICB7CisgICAgICAgICAgICBsb2xfYWRkKCBsb2wsIGwgKTsKKyAgICAgICAgICAgIGwgPSBMMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGwgPSBsaXN0X3B1c2hfYmFjayggbCwgb2JqZWN0X25ldyggKmVsZW1lbnRzICkgKTsKKyAgICAgICAgfQorICAgICAgICArK2VsZW1lbnRzOworICAgIH0KKworICAgIGlmICggbCAhPSBMMCApCisgICAgICAgIGxvbF9hZGQoIGxvbCwgbCApOworfQorCisKKyNpZmRlZiBIQVZFX1BZVEhPTgorCisvKgorICogQ2FsbHMgdGhlIGJqYW0gcnVsZSBzcGVjaWZpZWQgYnkgbmFtZSBwYXNzZWQgaW4gJ2FyZ3MnLiBUaGUgbmFtZSBpcyBsb29rZWQgdXAKKyAqIGluIHRoZSBjb250ZXh0IG9mIGJqYW0ncyAncHl0aG9uX2ludGVyZmFjZScgbW9kdWxlLiBSZXR1cm5zIHRoZSBsaXN0IG9mCisgKiBzdHJpbmdzIHJldHVybmVkIGJ5IHRoZSBydWxlLgorICovCisKK1B5T2JqZWN0ICogYmphbV9jYWxsKCBQeU9iamVjdCAqIHNlbGYsIFB5T2JqZWN0ICogYXJncyApCit7CisgICAgRlJBTUUgICAgaW5uZXJbIDEgXTsKKyAgICBMSVNUICAgKiByZXN1bHQ7CisgICAgUEFSU0UgICogcDsKKyAgICBPQkpFQ1QgKiBydWxlbmFtZTsKKworICAgIC8qIEJ1aWxkIHVwIHRoZSBsaXN0IG9mIGFyZyBsaXN0cy4gKi8KKyAgICBmcmFtZV9pbml0KCBpbm5lciApOworICAgIGlubmVyLT5wcmV2ID0gMDsKKyAgICBpbm5lci0+cHJldl91c2VyID0gMDsKKyAgICBpbm5lci0+bW9kdWxlID0gYmluZG1vZHVsZSggY29uc3RhbnRfcHl0aG9uX2ludGVyZmFjZSApOworCisgICAgLyogRXh0cmFjdCB0aGUgcnVsZSBuYW1lIGFuZCBhcmd1bWVudHMgZnJvbSAnYXJncycuICovCisKKyAgICAvKiBQeVR1cGxlX0dldEl0ZW0gcmV0dXJucyBib3Jyb3dlZCByZWZlcmVuY2UuICovCisgICAgcnVsZW5hbWUgPSBvYmplY3RfbmV3KCBQeVN0cmluZ19Bc1N0cmluZyggUHlUdXBsZV9HZXRJdGVtKCBhcmdzLCAwICkgKSApOworICAgIHsKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBpbnQgc2l6ZSA9IFB5VHVwbGVfU2l6ZSggYXJncyApOworICAgICAgICBmb3IgKCA7IGkgPCBzaXplOyArK2kgKQorICAgICAgICB7CisgICAgICAgICAgICBQeU9iamVjdCAqIGEgPSBQeVR1cGxlX0dldEl0ZW0oIGFyZ3MsIGkgKTsKKyAgICAgICAgICAgIGlmICggUHlTdHJpbmdfQ2hlY2soIGEgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9sX2FkZCggaW5uZXItPmFyZ3MsIGxpc3RfbmV3KCBvYmplY3RfbmV3KAorICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyggYSApICkgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIFB5U2VxdWVuY2VfQ2hlY2soIGEgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTElTVCAqIGwgPSAwOworICAgICAgICAgICAgICAgIGludCBzID0gUHlTZXF1ZW5jZV9TaXplKCBhICk7CisgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgIGZvciAoIDsgaSA8IHM7ICsraSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBQeVNlcXVlbmNlX0dldEl0ZW0gcmV0dXJucyBuZXcgcmVmZXJlbmNlLiAqLworICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqIGUgPSBQeVNlcXVlbmNlX0dldEl0ZW0oIGEsIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqIHMgPSBQeVN0cmluZ19Bc1N0cmluZyggZSApOworICAgICAgICAgICAgICAgICAgICBpZiAoICFzICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiSW52YWxpZCBwYXJhbWV0ZXIgdHlwZSBwYXNzZWQgZnJvbSBQeXRob25cbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsID0gbGlzdF9wdXNoX2JhY2soIGwsIG9iamVjdF9uZXcoIHMgKSApOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoIGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9sX2FkZCggaW5uZXItPmFyZ3MsIGwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCA9IGV2YWx1YXRlX3J1bGUoIGJpbmRydWxlKCBydWxlbmFtZSwgaW5uZXItPm1vZHVsZSksIHJ1bGVuYW1lLCBpbm5lciApOworICAgIG9iamVjdF9mcmVlKCBydWxlbmFtZSApOworCisgICAgZnJhbWVfZnJlZSggaW5uZXIgKTsKKworICAgIC8qIENvbnZlcnQgdGhlIGJqYW0gbGlzdCBpbnRvIGEgUHl0aG9uIGxpc3QgcmVzdWx0LiAqLworICAgIHsKKyAgICAgICAgUHlPYmplY3QgKiBjb25zdCBweVJlc3VsdCA9IFB5TGlzdF9OZXcoIGxpc3RfbGVuZ3RoKCByZXN1bHQgKSApOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCByZXN1bHQgKTsKKyAgICAgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIHJlc3VsdCApOworICAgICAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgICAgICB7CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbSggcHlSZXN1bHQsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcoIG9iamVjdF9zdHIoCisgICAgICAgICAgICAgICAgbGlzdF9pdGVtKCBpdGVyICkgKSApICk7CisgICAgICAgICAgICBpICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgbGlzdF9mcmVlKCByZXN1bHQgKTsKKyAgICAgICAgcmV0dXJuIHB5UmVzdWx0OworICAgIH0KK30KKworCisvKgorICogQWNjZXB0cyBmb3VyIGFyZ3VtZW50czoKKyAqIC0gbW9kdWxlIG5hbWUKKyAqIC0gcnVsZSBuYW1lLAorICogLSBQeXRob24gY2FsbGFibGUuCisgKiAtIChvcHRpb25hbCkgYmphbSBsYW5ndWFnZSBmdW5jdGlvbiBzaWduYXR1cmUuCisgKiBDcmVhdGVzIGEgYmphbSBydWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBzcGVjaWZpZWQgbW9kdWxlLCB3aGljaAorICogd2lsbCBpbnZva2UgdGhlIFB5dGhvbiBjYWxsYWJsZS4KKyAqLworCitQeU9iamVjdCAqIGJqYW1faW1wb3J0X3J1bGUoIFB5T2JqZWN0ICogc2VsZiwgUHlPYmplY3QgKiBhcmdzICkKK3sKKyAgICBjaGFyICAgICAqIG1vZHVsZTsKKyAgICBjaGFyICAgICAqIHJ1bGU7CisgICAgUHlPYmplY3QgKiBmdW5jOworICAgIFB5T2JqZWN0ICogYmphbV9zaWduYXR1cmUgPSBOVUxMOworICAgIG1vZHVsZV90ICogbTsKKyAgICBSVUxFICAgICAqIHI7CisgICAgT0JKRUNUICAgKiBtb2R1bGVfbmFtZTsKKyAgICBPQkpFQ1QgICAqIHJ1bGVfbmFtZTsKKworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoIGFyZ3MsICJzc098TzppbXBvcnRfcnVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZHVsZSwgJnJ1bGUsICZmdW5jLCAmYmphbV9zaWduYXR1cmUgKSApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCAhUHlDYWxsYWJsZV9DaGVjayggZnVuYyApICkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyggUHlFeGNfUnVudGltZUVycm9yLCAiTm9uLWNhbGxhYmxlIG9iamVjdCBwYXNzZWQgdG8gIgorICAgICAgICAgICAgImJqYW0uaW1wb3J0X3J1bGUiICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1vZHVsZV9uYW1lID0gKm1vZHVsZSA/IG9iamVjdF9uZXcoIG1vZHVsZSApIDogMDsKKyAgICBtID0gYmluZG1vZHVsZSggbW9kdWxlX25hbWUgKTsKKyAgICBpZiAoIG1vZHVsZV9uYW1lICkKKyAgICAgICAgb2JqZWN0X2ZyZWUoIG1vZHVsZV9uYW1lICk7CisgICAgcnVsZV9uYW1lID0gb2JqZWN0X25ldyggcnVsZSApOworICAgIG5ld19ydWxlX2JvZHkoIG0sIHJ1bGVfbmFtZSwgZnVuY3Rpb25fcHl0aG9uKCBmdW5jLCBiamFtX3NpZ25hdHVyZSApLCAwICk7CisgICAgb2JqZWN0X2ZyZWUoIHJ1bGVfbmFtZSApOworCisgICAgUHlfSU5DUkVGKCBQeV9Ob25lICk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKKworLyoKKyAqIEFjY2VwdHMgZm91ciBhcmd1bWVudHM6CisgKiAgLSBhbiBhY3Rpb24gbmFtZQorICogIC0gYW4gYWN0aW9uIGJvZHkKKyAqICAtIGEgbGlzdCBvZiB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgYm91bmQgaW5zaWRlIHRoZSBhY3Rpb24KKyAqICAtIGludGVnZXIgZmxhZ3MuCisgKiAgRGVmaW5lcyBhbiBhY3Rpb24gb24gYmphbSBzaWRlLgorICovCisKK1B5T2JqZWN0ICogYmphbV9kZWZpbmVfYWN0aW9uKCBQeU9iamVjdCAqIHNlbGYsIFB5T2JqZWN0ICogYXJncyApCit7CisgICAgY2hhciAgICAgKiBuYW1lOworICAgIGNoYXIgICAgICogYm9keTsKKyAgICBtb2R1bGVfdCAqIG07CisgICAgUHlPYmplY3QgKiBiaW5kbGlzdF9weXRob247CisgICAgaW50ICAgICAgICBmbGFnczsKKyAgICBMSVNUICAgICAqIGJpbmRsaXN0ID0gTDA7CisgICAgaW50ICAgICAgICBuOworICAgIGludCAgICAgICAgaTsKKyAgICBPQkpFQ1QgICAqIG5hbWVfc3RyOworICAgIEZVTkNUSU9OICogYm9keV9mdW5jOworCisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZSggYXJncywgInNzTyFpOmRlZmluZV9hY3Rpb24iLCAmbmFtZSwgJmJvZHksCisgICAgICAgICZQeUxpc3RfVHlwZSwgJmJpbmRsaXN0X3B5dGhvbiwgJmZsYWdzICkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG4gPSBQeUxpc3RfU2l6ZSggYmluZGxpc3RfcHl0aG9uICk7CisgICAgZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKiBuZXh0ID0gUHlMaXN0X0dldEl0ZW0oIGJpbmRsaXN0X3B5dGhvbiwgaSApOworICAgICAgICBpZiAoICFQeVN0cmluZ19DaGVjayggbmV4dCApICkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKCBQeUV4Y19SdW50aW1lRXJyb3IsICJiaW5kIGxpc3QgaGFzIG5vbi1zdHJpbmcgIgorICAgICAgICAgICAgICAgICJ0eXBlIiApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYmluZGxpc3QgPSBsaXN0X3B1c2hfYmFjayggYmluZGxpc3QsIG9iamVjdF9uZXcoIFB5U3RyaW5nX0FzU3RyaW5nKCBuZXh0CisgICAgICAgICAgICApICkgKTsKKyAgICB9CisKKyAgICBuYW1lX3N0ciA9IG9iamVjdF9uZXcoIG5hbWUgKTsKKyAgICBib2R5X2Z1bmMgPSBmdW5jdGlvbl9jb21waWxlX2FjdGlvbnMoIGJvZHksIGNvbnN0YW50X2J1aWx0aW4sIC0xICk7CisgICAgbmV3X3J1bGVfYWN0aW9ucyggcm9vdF9tb2R1bGUoKSwgbmFtZV9zdHIsIGJvZHlfZnVuYywgYmluZGxpc3QsIGZsYWdzICk7CisgICAgZnVuY3Rpb25fZnJlZSggYm9keV9mdW5jICk7CisgICAgb2JqZWN0X2ZyZWUoIG5hbWVfc3RyICk7CisKKyAgICBQeV9JTkNSRUYoIFB5X05vbmUgKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworCisvKgorICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZSBpbiByb290IEphbSBtb2R1bGUuCisgKi8KKworUHlPYmplY3QgKiBiamFtX3ZhcmlhYmxlKCBQeU9iamVjdCAqIHNlbGYsIFB5T2JqZWN0ICogYXJncyApCit7CisgICAgY2hhciAgICAgKiBuYW1lOworICAgIExJU1QgICAgICogdmFsdWU7CisgICAgUHlPYmplY3QgKiByZXN1bHQ7CisgICAgaW50ICAgICAgICBpOworICAgIE9CSkVDVCAgICogdmFybmFtZTsKKyAgICBMSVNUSVRFUiAgIGl0ZXI7CisgICAgTElTVElURVIgICBlbmQ7CisKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKCBhcmdzLCAicyIsICZuYW1lICkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHZhcm5hbWUgPSBvYmplY3RfbmV3KCBuYW1lICk7CisgICAgdmFsdWUgPSB2YXJfZ2V0KCByb290X21vZHVsZSgpLCB2YXJuYW1lICk7CisgICAgb2JqZWN0X2ZyZWUoIHZhcm5hbWUgKTsKKyAgICBpdGVyID0gbGlzdF9iZWdpbiggdmFsdWUgKTsKKyAgICBlbmQgPSBsaXN0X2VuZCggdmFsdWUgKTsKKworICAgIHJlc3VsdCA9IFB5TGlzdF9OZXcoIGxpc3RfbGVuZ3RoKCB2YWx1ZSApICk7CisgICAgZm9yICggaSA9IDA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICksICsraSApCisgICAgICAgIFB5TGlzdF9TZXRJdGVtKCByZXN1bHQsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSgKKyAgICAgICAgICAgIGl0ZXIgKSApICkgKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworUHlPYmplY3QgKiBiamFtX2JhY2t0cmFjZSggUHlPYmplY3QgKiBzZWxmLCBQeU9iamVjdCAqIGFyZ3MgKQoreworICAgIFB5T2JqZWN0ICAgICAqIHJlc3VsdCA9IFB5TGlzdF9OZXcoIDAgKTsKKyAgICBzdHJ1Y3QgZnJhbWUgKiBmID0gZnJhbWVfYmVmb3JlX3B5dGhvbl9jYWxsOworCisgICAgZm9yICggOyBmID0gZi0+cHJldjsgKQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgICAqIHR1cGxlID0gUHlUdXBsZV9OZXcoIDQgKTsKKyAgICAgICAgY2hhciBjb25zdCAqIGZpbGU7CisgICAgICAgIGludCAgICAgICAgICBsaW5lOworICAgICAgICBjaGFyICAgICAgICAgYnVmWyAzMiBdOworICAgICAgICBzdHJpbmcgbW9kdWxlX25hbWVbIDEgXTsKKworICAgICAgICBnZXRfc291cmNlX2xpbmUoIGYsICZmaWxlLCAmbGluZSApOworICAgICAgICBzcHJpbnRmKCBidWYsICIlZCIsIGxpbmUgKTsKKyAgICAgICAgc3RyaW5nX25ldyggbW9kdWxlX25hbWUgKTsKKyAgICAgICAgaWYgKCBmLT5tb2R1bGUtPm5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmdfYXBwZW5kKCBtb2R1bGVfbmFtZSwgb2JqZWN0X3N0ciggZi0+bW9kdWxlLT5uYW1lICkgKTsKKyAgICAgICAgICAgIHN0cmluZ19hcHBlbmQoIG1vZHVsZV9uYW1lLCAiLiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFB5VHVwbGVfU2V0SXRlbSBzdGVhbHMgcmVmZXJlbmNlLiAqLworICAgICAgICBQeVR1cGxlX1NldEl0ZW0oIHR1cGxlLCAwLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCBmaWxlICkgKTsKKyAgICAgICAgUHlUdXBsZV9TZXRJdGVtKCB0dXBsZSwgMSwgUHlTdHJpbmdfRnJvbVN0cmluZyggYnVmICkgKTsKKyAgICAgICAgUHlUdXBsZV9TZXRJdGVtKCB0dXBsZSwgMiwgUHlTdHJpbmdfRnJvbVN0cmluZyggbW9kdWxlX25hbWUtPnZhbHVlICkgKTsKKyAgICAgICAgUHlUdXBsZV9TZXRJdGVtKCB0dXBsZSwgMywgUHlTdHJpbmdfRnJvbVN0cmluZyggZi0+cnVsZW5hbWUgKSApOworCisgICAgICAgIHN0cmluZ19mcmVlKCBtb2R1bGVfbmFtZSApOworCisgICAgICAgIFB5TGlzdF9BcHBlbmQoIHJlc3VsdCwgdHVwbGUgKTsKKyAgICAgICAgUHlfREVDUkVGKCB0dXBsZSApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitQeU9iamVjdCAqIGJqYW1fY2FsbGVyKCBQeU9iamVjdCAqIHNlbGYsIFB5T2JqZWN0ICogYXJncyApCit7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIGZyYW1lX2JlZm9yZV9weXRob25fY2FsbC0+cHJldi0+bW9kdWxlLT5uYW1lID8KKyAgICAgICAgb2JqZWN0X3N0ciggZnJhbWVfYmVmb3JlX3B5dGhvbl9jYWxsLT5wcmV2LT5tb2R1bGUtPm5hbWUgKSA6ICIiICk7Cit9CisKKyNlbmRpZiAgLyogI2lmZGVmIEhBVkVfUFlUSE9OICovCisKKworI2lmZGVmIEhBVkVfUE9QRU4KKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorICAgICNkZWZpbmUgcG9wZW4gd2luZG93c19wb3Blbl93cmFwcGVyCisgICAgI2RlZmluZSBwY2xvc2UgX3BjbG9zZQorCisgICAgLyoKKyAgICAgKiBUaGlzIHdyYXBwZXIgaXMgYSB3b3JrYXJvdW5kIGZvciBhIGZ1bm55IF9wb3BlbigpIGZlYXR1cmUgb24gV2luZG93cworICAgICAqIHdoZXJlIGl0IGVhdHMgZXh0ZXJuYWwgcXVvdGVzIGluIHNvbWUgY2FzZXMuIFRoZSBidWcgc2VlbXMgdG8gYmUgcmVsYXRlZAorICAgICAqIHRvIHRoZSBxdW90ZSBzdHJpcHBpbmcgZnVuY3Rpb25hbGl0eSB1c2VkIGJ5IHRoZSBXaW5kb3dzIGNtZC5leGUKKyAgICAgKiBpbnRlcnByZXRlciB3aGVuIGl0cyAvUyBpcyBub3Qgc3BlY2lmaWVkLgorICAgICAqCisgICAgICogQ2xlYW5lZCB1cCBxdW90ZSBmcm9tIHRoZSBjbWQuZXhlIGhlbHAgc2NyZWVuIGFzIGRpc3BsYXllZCBvbiBXaW5kb3dzIFhQCisgICAgICogU1AzOgorICAgICAqCisgICAgICogICAxLiBJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQsIHRoZW4gcXVvdGUgY2hhcmFjdGVycyBvbgorICAgICAqICAgICAgdGhlIGNvbW1hbmQgbGluZSBhcmUgcHJlc2VydmVkOgorICAgICAqCisgICAgICogICAgICAgLSBubyAvUyBzd2l0Y2gKKyAgICAgKiAgICAgICAtIGV4YWN0bHkgdHdvIHF1b3RlIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAtIG5vIHNwZWNpYWwgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSB0d28gcXVvdGUgY2hhcmFjdGVycywgd2hlcmUKKyAgICAgKiAgICAgICAgIHNwZWNpYWwgaXMgb25lIG9mOiAmPD4oKUBefAorICAgICAqICAgICAgIC0gdGhlcmUgYXJlIG9uZSBvciBtb3JlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSB0d28gcXVvdGUKKyAgICAgKiAgICAgICAgIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAtIHRoZSBzdHJpbmcgYmV0d2VlbiB0aGUgdHdvIHF1b3RlIGNoYXJhY3RlcnMgaXMgdGhlIG5hbWUgb2YgYW4KKyAgICAgKiAgICAgICAgIGV4ZWN1dGFibGUgZmlsZS4KKyAgICAgKgorICAgICAqICAgMi4gT3RoZXJ3aXNlLCBvbGQgYmVoYXZpb3IgaXMgdG8gc2VlIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBxdW90ZQorICAgICAqICAgICAgY2hhcmFjdGVyIGFuZCBpZiBzbywgc3RyaXAgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIGFuZCByZW1vdmUgdGhlIGxhc3QKKyAgICAgKiAgICAgIHF1b3RlIGNoYXJhY3RlciBvbiB0aGUgY29tbWFuZCBsaW5lLCBwcmVzZXJ2aW5nIGFueSB0ZXh0IGFmdGVyIHRoZQorICAgICAqICAgICAgbGFzdCBxdW90ZSBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBUaGlzIGNhdXNlcyBzb21lIGNvbW1hbmRzIGNvbnRhaW5pbmcgcXVvdGVzIG5vdCB0byBiZSBleGVjdXRlZCBjb3JyZWN0bHkuCisgICAgICogRm9yIGV4YW1wbGU6CisgICAgICoKKyAgICAgKiAgICJcTG9uZyBmb2xkZXIgbmFtZVxhYWEuZXhlIiAtLW5hbWU9Ikp1cmtvIiAtLW5vLXN1cm5hbWUKKyAgICAgKgorICAgICAqIHdvdWxkIGdldCBpdHMgb3V0ZXJtb3N0IHF1b3RlcyBzdHJpcHBlZCBhbmQgd291bGQgYmUgZXhlY3V0ZWQgYXM6CisgICAgICoKKyAgICAgKiAgIFxMb25nIGZvbGRlciBuYW1lXGFhYS5leGUiIC0tbmFtZT0iSnVya28gLS1uby1zdXJuYW1lCisgICAgICoKKyAgICAgKiB3aGljaCB3b3VsZCByZXBvcnQgYW4gZXJyb3IgYWJvdXQgJ1xMb25nJyBub3QgYmVpbmcgYSB2YWxpZCBjb21tYW5kLgorICAgICAqCisgICAgICogY21kLmV4ZSBoZWxwIHNlZW1zIHRvIGluZGljYXRlIGl0IHdvdWxkIGJlIGVub3VnaCB0byBhZGQgYW4gZXh0cmEgc3BhY2UKKyAgICAgKiBjaGFyYWN0ZXIgaW4gZnJvbnQgb2YgdGhlIGNvbW1hbmQgdG8gYXZvaWQgdGhpcyBidXQgdGhpcyBkb2VzIG5vdCB3b3JrLAorICAgICAqIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgc2hlbGwgZmlyc3Qgc3RyaXBwaW5nIGFsbCBsZWFkaW5nIHdoaXRlc3BhY2UKKyAgICAgKiBjaGFyYWN0ZXJzIGZyb20gdGhlIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBTb2x1dGlvbiBpbXBsZW1lbnRlZCBoZXJlIGlzIHRvIHF1b3RlIHRoZSB3aG9sZSBjb21tYW5kIGluIGNhc2UgaXQKKyAgICAgKiBjb250YWlucyBhbnkgcXVvdGUgY2hhcmFjdGVycy4gTm90ZSB0aG91Z2h0IHRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkKKyAgICAgKiBzaG91bGQgV2luZG93cyBldmVyICdmaXgnIHRoaXMgZmVhdHVyZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAzLjA2LjIwMDguKSAoSnVya28pCisgICAgICovCisgICAgc3RhdGljIEZJTEUgKiB3aW5kb3dzX3BvcGVuX3dyYXBwZXIoIGNoYXIgY29uc3QgKiBjb21tYW5kLAorICAgICAgICBjaGFyIGNvbnN0ICogbW9kZSApCisgICAgeworICAgICAgICBpbnQgY29uc3QgZXh0cmFfY29tbWFuZF9xdW90ZXNfbmVlZGVkID0gISFzdHJjaHIoIGNvbW1hbmQsICciJyApOworICAgICAgICBzdHJpbmcgcXVvdGVkX2NvbW1hbmQ7CisgICAgICAgIEZJTEUgKiByZXN1bHQ7CisKKyAgICAgICAgaWYgKCBleHRyYV9jb21tYW5kX3F1b3Rlc19uZWVkZWQgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmdfbmV3KCAmcXVvdGVkX2NvbW1hbmQgKTsKKyAgICAgICAgICAgIHN0cmluZ19hcHBlbmQoICZxdW90ZWRfY29tbWFuZCwgIlwiIiApOworICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggJnF1b3RlZF9jb21tYW5kLCBjb21tYW5kICk7CisgICAgICAgICAgICBzdHJpbmdfYXBwZW5kKCAmcXVvdGVkX2NvbW1hbmQsICJcIiIgKTsKKyAgICAgICAgICAgIGNvbW1hbmQgPSBxdW90ZWRfY29tbWFuZC52YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IF9wb3BlbiggY29tbWFuZCwgInIiICk7CisKKyAgICAgICAgaWYgKCBleHRyYV9jb21tYW5kX3F1b3Rlc19uZWVkZWQgKQorICAgICAgICAgICAgc3RyaW5nX2ZyZWUoICZxdW90ZWRfY29tbWFuZCApOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorI2VuZGlmICAvKiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykgKi8KKworCitzdGF0aWMgY2hhciAqIHJ0cmltKCBjaGFyICogY29uc3QgcyApCit7CisgICAgY2hhciAqIHAgPSBzOworICAgIHdoaWxlICggKnAgKSArK3A7CisgICAgZm9yICggLS1wOyBwID49IHMgJiYgaXNzcGFjZSggKnAgKTsgKnAtLSA9IDAgKTsKKyAgICByZXR1cm4gczsKK30KKworCitMSVNUICogYnVpbHRpbl9zaGVsbCggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBMSVNUICAgKiBjb21tYW5kID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsKKyAgICBMSVNUICAgKiByZXN1bHQgPSBMMDsKKyAgICBzdHJpbmcgICBzOworICAgIGludCAgICAgIHJldDsKKyAgICBjaGFyICAgICBidWZmZXJbIDEwMjQgXTsKKyAgICBGSUxFICAgKiBwID0gTlVMTDsKKyAgICBpbnQgICAgICBleGl0X3N0YXR1cyA9IC0xOworICAgIGludCAgICAgIGV4aXRfc3RhdHVzX29wdCA9IDA7CisgICAgaW50ICAgICAgbm9fb3V0cHV0X29wdCA9IDA7CisgICAgaW50ICAgICAgc3RyaXBfZW9sX29wdCA9IDA7CisKKyAgICAvKiBQcm9jZXNzIHRoZSB2YXJpYWJsZSBhcmdzIG9wdGlvbnMuICovCisgICAgeworICAgICAgICBpbnQgYSA9IDE7CisgICAgICAgIExJU1QgKiBhcmcgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgYSApOworICAgICAgICBmb3IgKCA7ICFsaXN0X2VtcHR5KCBhcmcgKTsgYXJnID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsICsrYSApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAhc3RyY21wKCAiZXhpdC1zdGF0dXMiLCBvYmplY3Rfc3RyKCBsaXN0X2Zyb250KCBhcmcgKSApICkgKQorICAgICAgICAgICAgICAgIGV4aXRfc3RhdHVzX29wdCA9IDE7CisgICAgICAgICAgICBlbHNlIGlmICggIXN0cmNtcCggIm5vLW91dHB1dCIsIG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIGFyZyApICkgKSApCisgICAgICAgICAgICAgICAgbm9fb3V0cHV0X29wdCA9IDE7CisgICAgICAgICAgICBlbHNlIGlmICggIXN0cmNtcCgic3RyaXAtZW9sIiwgb2JqZWN0X3N0ciggbGlzdF9mcm9udCggYXJnICkgKSApICkKKyAgICAgICAgICAgICAgICBzdHJpcF9lb2xfb3B0ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRoZSBmb2xsb3dpbmcgZmZsdXNoKCkgY2FsbCBzZWVtcyB0byBiZSBpbmRpY2F0ZWQgYXMgYSB3b3JrYXJvdW5kIGZvciBhCisgICAgICogcG9wZW4oKSBidWcgb24gUE9TSVggaW1wbGVtZW50YXRpb25zIHJlbGF0ZWQgdG8gc3luaHJvbml6aW5nIGlucHV0CisgICAgICogc3RyZWFtIHBvc2l0aW9ucyBmb3IgdGhlIGNhbGxlZCBhbmQgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBmZmx1c2goIE5VTEwgKTsKKworICAgIHAgPSBwb3Blbiggb2JqZWN0X3N0ciggbGlzdF9mcm9udCggY29tbWFuZCApICksICJyIiApOworICAgIGlmICggcCA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIEwwOworCisgICAgc3RyaW5nX25ldyggJnMgKTsKKworICAgIHdoaWxlICggKCByZXQgPSBmcmVhZCggYnVmZmVyLCBzaXplb2YoIGNoYXIgKSwgc2l6ZW9mKCBidWZmZXIgKSAtIDEsIHAgKSApID4KKyAgICAgICAgMCApCisgICAgeworICAgICAgICBidWZmZXJbIHJldCBdID0gMDsKKyAgICAgICAgaWYgKCAhbm9fb3V0cHV0X29wdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RyaXBfZW9sX29wdCApCisgICAgICAgICAgICAgICAgcnRyaW0oIGJ1ZmZlciApOworICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggJnMsIGJ1ZmZlciApOworICAgICAgICB9CisgICAgfQorCisgICAgZXhpdF9zdGF0dXMgPSBwY2xvc2UoIHAgKTsKKworICAgIC8qIFRoZSBjb21tYW5kIG91dHB1dCBpcyByZXR1cm5lZCBmaXJzdC4gKi8KKyAgICByZXN1bHQgPSBsaXN0X25ldyggb2JqZWN0X25ldyggcy52YWx1ZSApICk7CisgICAgc3RyaW5nX2ZyZWUoICZzICk7CisKKyAgICAvKiBUaGUgY29tbWFuZCBleGl0IHJlc3VsdCBuZXh0LiAqLworICAgIGlmICggZXhpdF9zdGF0dXNfb3B0ICkKKyAgICB7CisgICAgICAgIGlmICggV0lGRVhJVEVEKCBleGl0X3N0YXR1cyApICkKKyAgICAgICAgICAgIGV4aXRfc3RhdHVzID0gV0VYSVRTVEFUVVMoIGV4aXRfc3RhdHVzICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXRfc3RhdHVzID0gLTE7CisgICAgICAgIHNwcmludGYoIGJ1ZmZlciwgIiVkIiwgZXhpdF9zdGF0dXMgKTsKKyAgICAgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwgb2JqZWN0X25ldyggYnVmZmVyICkgKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjZWxzZSAgLyogI2lmZGVmIEhBVkVfUE9QRU4gKi8KKworTElTVCAqIGJ1aWx0aW5fc2hlbGwoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgcmV0dXJuIEwwOworfQorCisjZW5kaWYgIC8qICNpZmRlZiBIQVZFX1BPUEVOICovCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9idWlsdGlucy5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvYnVpbHRpbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2E5NjdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvYnVpbHRpbnMuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTMtMjAwMiBDaHJpc3RvcGhlciBTZWl3YWxkIGFuZCBQZXJmb3JjZSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKyNpZm5kZWYgSkFNX0JVSUxUSU5TX0gKKyMgZGVmaW5lIEpBTV9CVUlMVElOU19ICisKKyMgaW5jbHVkZSAiZnJhbWVzLmgiCisKKy8qCisgKiBidWlsdGlucy5oIC0gY29tcGlsZSBwYXJzZWQgamFtIHN0YXRlbWVudHMKKyAqLworCit2b2lkIGxvYWRfYnVpbHRpbnMoKTsKK3ZvaWQgaW5pdF9zZXQoKTsKK3ZvaWQgaW5pdF9wYXRoKCk7Cit2b2lkIGluaXRfcmVnZXgoKTsKK3ZvaWQgaW5pdF9wcm9wZXJ0eV9zZXQoKTsKK3ZvaWQgaW5pdF9zZXF1ZW5jZSgpOwordm9pZCBpbml0X29yZGVyKCk7CisKK3ZvaWQgcHJvcGVydHlfc2V0X2RvbmUoKTsKKworTElTVCAqYnVpbHRpbl9jYWxjKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fZGVwZW5kcyggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICk7CitMSVNUICpidWlsdGluX3JlYnVpbGRzKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fZWNobyggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICk7CitMSVNUICpidWlsdGluX2V4aXQoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9mbGFncyggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICk7CitMSVNUICpidWlsdGluX2dsb2IoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9nbG9iX3JlY3Vyc2l2ZSggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICk7CitMSVNUICpidWlsdGluX3N1YnN0KCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fbWF0Y2goIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9zcGxpdF9ieV9jaGFyYWN0ZXJzKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5faGRybWFjcm8oIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9ydWxlbmFtZXMoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl92YXJuYW1lcyggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICk7CitMSVNUICpidWlsdGluX2RlbGV0ZV9tb2R1bGUoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9pbXBvcnQoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9leHBvcnQoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9jYWxsZXJfbW9kdWxlKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fYmFja3RyYWNlKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fcHdkKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fdXBkYXRlKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fdXBkYXRlX25vdyggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICk7CitMSVNUICpidWlsdGluX2ltcG9ydF9tb2R1bGUoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9pbXBvcnRlZF9tb2R1bGVzKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5faW5zdGFuY2UoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9zb3J0KCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fbm9ybWFsaXplX3BhdGgoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9uYXRpdmVfcnVsZSggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICk7CitMSVNUICpidWlsdGluX2hhc19uYXRpdmVfcnVsZSggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICk7CitMSVNUICpidWlsdGluX3VzZXJfbW9kdWxlKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fbmVhcmVzdF91c2VyX2xvY2F0aW9uKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fY2hlY2tfaWZfZmlsZSggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICk7CitMSVNUICpidWlsdGluX3B5dGhvbl9pbXBvcnRfcnVsZSggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICk7CitMSVNUICpidWlsdGluX3NoZWxsKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fbWQ1KCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fZmlsZV9vcGVuKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fcGFkKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKK0xJU1QgKmJ1aWx0aW5fcHJlY2lvdXMoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9zZWxmX3BhdGgoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApOworTElTVCAqYnVpbHRpbl9tYWtlZGlyKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKTsKKwordm9pZCBiYWNrdHJhY2UoIEZSQU1FICpmcmFtZSApOworZXh0ZXJuIGludCBsYXN0X3VwZGF0ZV9ub3dfc3RhdHVzOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2J1bXBfdmVyc2lvbi5weSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2J1bXBfdmVyc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzcxNDIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvYnVtcF92ZXJzaW9uLnB5CkBAIC0wLDAgKzEsOTggQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBidW1wIHRoZSBiamFtIHZlcnNpb24uIEl0IHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50LCBlLmcKKyMKKyMgICAgLi9idW1wX3ZlcnNpb24ucHkgMy4xLjkKKyMKKyMgYW5kIHVwZGF0ZXMgYWxsIHRoZSBuZWNlc3NhcnkgZmlsZXMuCisjCisjIENvcHlyaWdodCAyMDA2IFJlbmUgUml2ZXJhLgorIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFZsYWRpbWlyIFBydXMuCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCByZQoraW1wb3J0IHN0cmluZworaW1wb3J0IHN5cworCitzcmNkaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK2RvY2RpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oc3JjZGlyLCAiLi4iLCAiZG9jIikpCisKKworZGVmIGVkaXQoZmlsZSwgKnJlcGxhY2VtZW50cyk6CisgICAgcHJpbnQoIiAgJyVzJy4uLiIgJSBmaWxlKQorICAgIGYgPSBvcGVuKGZpbGUsICdyJykKKyAgICB0ZXh0ID0gZi5yZWFkKCkKKyAgICBmLmNsb3NlKCkKKyAgICBmb3IgKHNvdXJjZSwgdGFyZ2V0KSBpbiByZXBsYWNlbWVudHM6CisgICAgICAgIHRleHQsIG4gPSByZS5jb21waWxlKHNvdXJjZSwgcmUuTVVMVElMSU5FKS5zdWJuKHRhcmdldCwgdGV4dCkKKyAgICAgICAgYXNzZXJ0IG4gPiAwCisgICAgZiA9IG9wZW4oZmlsZSwgJ3cnKQorICAgIGYud3JpdGUodGV4dCkKKyAgICBmLmNsb3NlKCkKKworCitkZWYgbWFrZV9lZGl0cyh2ZXIpOgorICAgIHZlcjAzID0gKGxpc3QodmVyKSArIFswXSAqIDMpWzA6M10KKyAgICB2ZXIwMiA9IHZlcjAzWzA6Ml0KKworICAgIGpvaW4gPSBsYW1iZGEgdiwgcyA6IHMuam9pbihzdHIoeCkgZm9yIHggaW4gdikKKyAgICBkb3RKb2luID0gbGFtYmRhIHYgOiBqb2luKHYsICIuIikKKworICAgIHByaW50KCJTZXR0aW5nIHZlcnNpb24gdG8gJXMiICUgc3RyKHZlcjAzKSkKKworICAgIGVkaXQob3MucGF0aC5qb2luKHNyY2RpciwgImJvb3N0LWphbS5zcGVjIiksCisgICAgICAgICgnXihWZXJzaW9uOikgLiokJywgJ1xcMSAlcycgJSBkb3RKb2luKHZlcjAzKSkpCisKKyAgICBlZGl0KG9zLnBhdGguam9pbihzcmNkaXIsICJidWlsZC5qYW0iKSwKKyAgICAgICAgKCdeKF9WRVJTSU9OXyA9KS4qIDskJywgJ1xcMSAlcyA7JyAlIGpvaW4odmVyMDMsICIgIikpKQorCisgICAgZWRpdChvcy5wYXRoLmpvaW4oZG9jZGlyLCAiYmphbS5xYmsiKSwKKyAgICAgICAgKCcoXFt2ZXJzaW9uKS4qKFxdKScsICdcXDE6ICVzXFwyJyAlIGRvdEpvaW4odmVyMDMpKSwKKyAgICAgICAgKCcoXFtkZWYgOnZlcnNpb246KS4qKFxdKScsICdcXDEgJXNcXDInICUgZG90Sm9pbih2ZXIwMykpKQorCisgICAgZWRpdChvcy5wYXRoLmpvaW4oc3JjZGlyLCAicGF0Y2hsZXZlbC5oIiksCisgICAgICAgICgnXigjZGVmaW5lIFZFUlNJT05fTUFKT1IpIC4qJCcsICdcXDEgJXMnICUgdmVyMDNbMF0pLAorICAgICAgICAoJ14oI2RlZmluZSBWRVJTSU9OX01JTk9SKSAuKiQnLCAnXFwxICVzJyAlIHZlcjAzWzFdKSwKKyAgICAgICAgKCdeKCNkZWZpbmUgVkVSU0lPTl9QQVRDSCkgLiokJywgJ1xcMSAlcycgJSB2ZXIwM1syXSksCisgICAgICAgICgnXigjZGVmaW5lIFZFUlNJT05fTUFKT1JfU1lNKSAuKiQnLCAnXFwxICIlMDJkIicgJSB2ZXIwM1swXSksCisgICAgICAgICgnXigjZGVmaW5lIFZFUlNJT05fTUlOT1JfU1lNKSAuKiQnLCAnXFwxICIlMDJkIicgJSB2ZXIwM1sxXSksCisgICAgICAgICgnXigjZGVmaW5lIFZFUlNJT05fUEFUQ0hfU1lNKSAuKiQnLCAnXFwxICIlMDJkIicgJSB2ZXIwM1syXSksCisgICAgICAgICgnXigjZGVmaW5lIFZFUlNJT04pIC4qJCcsICdcXDEgIiVzIicgJSBkb3RKb2luKHZlcikpLAorICAgICAgICAoJ14oI2RlZmluZSBKQU1WRVJTWU0pIC4qJCcsICdcXDEgIkpBTVZFUlNJT049JXMiJyAlIGRvdEpvaW4odmVyMDIpKSkKKworCitkZWYgbWFpbigpOgorICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgorICAgICAgICBwcmludCgiRXhwZWN0IG5ldyB2ZXJzaW9uIGFzIGFyZ3VtZW50LiIpCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDM6CisgICAgICAgIHByaW50KCJUb28gbWFueSBhcmd1bWVudHMuIikKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIHZlcnNpb24gPSBzeXMuYXJndlsxXS5zcGxpdCgiLiIpCisgICAgaWYgbGVuKHZlcnNpb24pID4gMzoKKyAgICAgICAgcHJpbnQoIkV4cGVjdCB2ZXJzaW9uIGFyZ3VtZW50IGluIHRoZSBmb3JtYXQ6IDxNQUpPUj4uPE1JTk9SPi48UEFUQ0g+IikKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIHRyeToKKyAgICAgICAgdmVyc2lvbiA9IGxpc3QoaW50KHgpIGZvciB4IGluIHZlcnNpb24pCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHByaW50KCJWZXJzaW9uIHZhbHVlcyBtdXN0IGJlIHZhbGlkIGludGVnZXJzLiIpCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICB3aGlsZSB2ZXJzaW9uIGFuZCB2ZXJzaW9uWy0xXSA9PSAwOgorICAgICAgICB2ZXJzaW9uLnBvcCgpCisKKyAgICBpZiBub3QgdmVyc2lvbjoKKyAgICAgICAgcHJpbnQoIkF0IGxlYXN0IG9uZSBvZiB0aGUgdmVyc2lvbiB2YWx1ZXMgbXVzdCBiZSBwb3NpdGl2ZS4iKQorICAgICAgICBzeXMuZXhpdCgpCisKKyAgICBtYWtlX2VkaXRzKHZlcnNpb24pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2NsYXNzLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jbGFzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWJmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jbGFzcy5jCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IFZsYWRpbWlyIFBydXMgMjAwMy4KKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyAqIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisjaW5jbHVkZSAiY2xhc3MuaCIKKworI2luY2x1ZGUgImNvbnN0YW50cy5oIgorI2luY2x1ZGUgImZyYW1lcy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisjaW5jbHVkZSAic3RyaW5ncy5oIgorI2luY2x1ZGUgInZhcmlhYmxlLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKK3N0YXRpYyBzdHJ1Y3QgaGFzaCAqIGNsYXNzZXMgPSAwOworCisKK3N0YXRpYyB2b2lkIGNoZWNrX2RlZmluZWQoIExJU1QgKiBjbGFzc19uYW1lcyApCit7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIGNsYXNzX25hbWVzICk7CisgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIGNsYXNzX25hbWVzICk7CisgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICB7CisgICAgICAgIGlmICggIWhhc2hfZmluZCggY2xhc3NlcywgbGlzdF9pdGVtKCBpdGVyICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZiggIkNsYXNzICVzIGlzIG5vdCBkZWZpbmVkXG4iLCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIE9CSkVDVCAqIGNsYXNzX21vZHVsZV9uYW1lKCBPQkpFQ1QgKiBkZWNsYXJlZF9uYW1lICkKK3sKKyAgICBzdHJpbmcgbmFtZVsgMSBdOworICAgIE9CSkVDVCAqIHJlc3VsdDsKKworICAgIHN0cmluZ19uZXcoIG5hbWUgKTsKKyAgICBzdHJpbmdfYXBwZW5kKCBuYW1lLCAiY2xhc3NAIiApOworICAgIHN0cmluZ19hcHBlbmQoIG5hbWUsIG9iamVjdF9zdHIoIGRlY2xhcmVkX25hbWUgKSApOworCisgICAgcmVzdWx0ID0gb2JqZWN0X25ldyggbmFtZS0+dmFsdWUgKTsKKyAgICBzdHJpbmdfZnJlZSggbmFtZSApOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdHJ1Y3QgaW1wb3J0X2Jhc2VfZGF0YQoreworICAgIE9CSkVDVCAgICogYmFzZV9uYW1lOworICAgIG1vZHVsZV90ICogYmFzZV9tb2R1bGU7CisgICAgbW9kdWxlX3QgKiBjbGFzc19tb2R1bGU7Cit9OworCisKK3N0YXRpYyB2b2lkIGltcG9ydF9iYXNlX3J1bGUoIHZvaWQgKiByXywgdm9pZCAqIGRfICkKK3sKKyAgICBSVUxFICogciA9IChSVUxFICopcl87CisgICAgUlVMRSAqIGlyMTsKKyAgICBSVUxFICogaXIyOworICAgIHN0cnVjdCBpbXBvcnRfYmFzZV9kYXRhICogZCA9IChzdHJ1Y3QgaW1wb3J0X2Jhc2VfZGF0YSAqKWRfOworICAgIE9CSkVDVCAqIHFuYW1lOworCisgICAgc3RyaW5nIHF1YWxpZmllZF9uYW1lWyAxIF07CisgICAgc3RyaW5nX25ldyAgICAgICggcXVhbGlmaWVkX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgc3RyaW5nX2FwcGVuZCAgICggcXVhbGlmaWVkX25hbWUsIG9iamVjdF9zdHIoIGQtPmJhc2VfbmFtZSApICk7CisgICAgc3RyaW5nX3B1c2hfYmFjayggcXVhbGlmaWVkX25hbWUsICcuJyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgc3RyaW5nX2FwcGVuZCAgICggcXVhbGlmaWVkX25hbWUsIG9iamVjdF9zdHIoIHItPm5hbWUgKSAgICAgICk7CisgICAgcW5hbWUgPSBvYmplY3RfbmV3KCBxdWFsaWZpZWRfbmFtZS0+dmFsdWUgKTsKKyAgICBzdHJpbmdfZnJlZSggcXVhbGlmaWVkX25hbWUgKTsKKworICAgIGlyMSA9IGltcG9ydF9ydWxlKCByLCBkLT5jbGFzc19tb2R1bGUsIHItPm5hbWUgKTsKKyAgICBpcjIgPSBpbXBvcnRfcnVsZSggciwgZC0+Y2xhc3NfbW9kdWxlLCBxbmFtZSApOworCisgICAgb2JqZWN0X2ZyZWUoIHFuYW1lICk7CisKKyAgICAvKiBDb3B5ICdleHBvcnRlZCcgZmxhZy4gKi8KKyAgICBpcjEtPmV4cG9ydGVkID0gaXIyLT5leHBvcnRlZCA9IHItPmV4cG9ydGVkOworCisgICAgLyogSWYgd2UgYXJlIGltcG9ydGluZyBhIGNsYXNzIG1ldGhvZCwgbG9jYWxpemUgaXQuICovCisgICAgaWYgKCAoIHItPm1vZHVsZSA9PSBkLT5iYXNlX21vZHVsZSApIHx8ICggci0+bW9kdWxlLT5jbGFzc19tb2R1bGUgJiYKKyAgICAgICAgKCByLT5tb2R1bGUtPmNsYXNzX21vZHVsZSA9PSBkLT5iYXNlX21vZHVsZSApICkgKQorICAgIHsKKyAgICAgICAgcnVsZV9sb2NhbGl6ZSggaXIxLCBkLT5jbGFzc19tb2R1bGUgKTsKKyAgICAgICAgcnVsZV9sb2NhbGl6ZSggaXIyLCBkLT5jbGFzc19tb2R1bGUgKTsKKyAgICB9Cit9CisKKworLyoKKyAqIEZvciBlYWNoIGV4cG9ydGVkIHJ1bGUgJ24nLCBkZWNsYXJlZCBpbiBjbGFzcyBtb2R1bGUgZm9yIGJhc2UsIGltcG9ydHMgdGhhdAorICogcnVsZSBpbiAnY2xhc3MnIGFzICduJyBhbmQgYXMgJ2Jhc2UubicuIEltcG9ydGVkIHJ1bGVzIGFyZSBsb2NhbGl6ZWQgYW5kCisgKiBtYXJrZWQgYXMgZXhwb3J0ZWQuCisgKi8KKworc3RhdGljIHZvaWQgaW1wb3J0X2Jhc2VfcnVsZXMoIG1vZHVsZV90ICogY2xhc3NfLCBPQkpFQ1QgKiBiYXNlICkKK3sKKyAgICBPQkpFQ1QgKiBtb2R1bGVfbmFtZSA9IGNsYXNzX21vZHVsZV9uYW1lKCBiYXNlICk7CisgICAgbW9kdWxlX3QgKiBiYXNlX21vZHVsZSA9IGJpbmRtb2R1bGUoIG1vZHVsZV9uYW1lICk7CisgICAgTElTVCAqIGltcG9ydGVkOworICAgIHN0cnVjdCBpbXBvcnRfYmFzZV9kYXRhIGQ7CisgICAgZC5iYXNlX25hbWUgPSBiYXNlOworICAgIGQuYmFzZV9tb2R1bGUgPSBiYXNlX21vZHVsZTsKKyAgICBkLmNsYXNzX21vZHVsZSA9IGNsYXNzXzsKKyAgICBvYmplY3RfZnJlZSggbW9kdWxlX25hbWUgKTsKKworICAgIGlmICggYmFzZV9tb2R1bGUtPnJ1bGVzICkKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggYmFzZV9tb2R1bGUtPnJ1bGVzLCBpbXBvcnRfYmFzZV9ydWxlLCAmZCApOworCisgICAgaW1wb3J0ZWQgPSBpbXBvcnRlZF9tb2R1bGVzKCBiYXNlX21vZHVsZSApOworICAgIGltcG9ydF9tb2R1bGUoIGltcG9ydGVkLCBjbGFzc18gKTsKKyAgICBsaXN0X2ZyZWUoIGltcG9ydGVkICk7Cit9CisKKworT0JKRUNUICogbWFrZV9jbGFzc19tb2R1bGUoIExJU1QgKiB4bmFtZSwgTElTVCAqIGJhc2VzLCBGUkFNRSAqIGZyYW1lICkKK3sKKyAgICBPQkpFQ1QgICAgICogbmFtZSA9IGNsYXNzX21vZHVsZV9uYW1lKCBsaXN0X2Zyb250KCB4bmFtZSApICk7CisgICAgT0JKRUNUICAgKiAqIHBwOworICAgIG1vZHVsZV90ICAgKiBjbGFzc19tb2R1bGUgPSAwOworICAgIG1vZHVsZV90ICAgKiBvdXRlcl9tb2R1bGUgPSBmcmFtZS0+bW9kdWxlOworICAgIGludCBmb3VuZDsKKworICAgIGlmICggIWNsYXNzZXMgKQorICAgICAgICBjbGFzc2VzID0gaGFzaGluaXQoIHNpemVvZiggT0JKRUNUICogKSwgImNsYXNzZXMiICk7CisKKyAgICBwcCA9IChPQkpFQ1QgKiAqKWhhc2hfaW5zZXJ0KCBjbGFzc2VzLCBsaXN0X2Zyb250KCB4bmFtZSApLCAmZm91bmQgKTsKKyAgICBpZiAoICFmb3VuZCApCisgICAgeworICAgICAgICAqcHAgPSBvYmplY3RfY29weSggbGlzdF9mcm9udCggeG5hbWUgKSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGYoICJDbGFzcyAlcyBhbHJlYWR5IGRlZmluZWRcbiIsIG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIHhuYW1lICkgKQorICAgICAgICAgICAgKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgY2hlY2tfZGVmaW5lZCggYmFzZXMgKTsKKworICAgIGNsYXNzX21vZHVsZSA9IGJpbmRtb2R1bGUoIG5hbWUgKTsKKworICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgIEluaXRpYWxpemUgdmFyaWFibGVzIHRoYXQgQm9vc3QuQnVpbGQgaW5zZXJ0cyBpbiBldmVyeSBvYmplY3QuCisgICAgICAgICAgICBXZSB3YW50IHRvIGF2b2lkIGNyZWF0aW5nIHRoZSBvYmplY3QncyBoYXNoIGlmIGl0IGlzbid0IG5lZWRlZC4KKyAgICAgICAgICovCisgICAgICAgIGludCBudW0gPSBjbGFzc19tb2R1bGUtPm51bV9maXhlZF92YXJpYWJsZXM7CisgICAgICAgIG1vZHVsZV9hZGRfZml4ZWRfdmFyKCBjbGFzc19tb2R1bGUsIGNvbnN0YW50X25hbWUsICZudW0gKTsKKyAgICAgICAgbW9kdWxlX2FkZF9maXhlZF92YXIoIGNsYXNzX21vZHVsZSwgY29uc3RhbnRfY2xhc3MsICZudW0gKTsKKyAgICAgICAgbW9kdWxlX3NldF9maXhlZF92YXJpYWJsZXMoIGNsYXNzX21vZHVsZSwgbnVtICk7CisgICAgfQorCisgICAgdmFyX3NldCggY2xhc3NfbW9kdWxlLCBjb25zdGFudF9uYW1lLCB4bmFtZSwgVkFSX1NFVCApOworICAgIHZhcl9zZXQoIGNsYXNzX21vZHVsZSwgY29uc3RhbnRfYmFzZXMsIGJhc2VzLCBWQVJfU0VUICk7CisKKyAgICB7CisgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCBiYXNlcyApOworICAgICAgICBMSVNUSVRFUiBjb25zdCBlbmQgPSBsaXN0X2VuZCggYmFzZXMgKTsKKyAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgIGltcG9ydF9iYXNlX3J1bGVzKCBjbGFzc19tb2R1bGUsIGxpc3RfaXRlbSggaXRlciApICk7CisgICAgfQorCisgICAgcmV0dXJuIG5hbWU7Cit9CisKKworc3RhdGljIHZvaWQgZnJlZV9jbGFzcyggdm9pZCAqIHhjbGFzcywgdm9pZCAqIGRhdGEgKQoreworICAgIG9iamVjdF9mcmVlKCAqKE9CSkVDVCAqICopeGNsYXNzICk7Cit9CisKKwordm9pZCBjbGFzc19kb25lKCB2b2lkICkKK3sKKyAgICBpZiAoIGNsYXNzZXMgKQorICAgIHsKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggY2xhc3NlcywgZnJlZV9jbGFzcywgKHZvaWQgKikwICk7CisgICAgICAgIGhhc2hkb25lKCBjbGFzc2VzICk7CisgICAgICAgIGNsYXNzZXMgPSAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2NsYXNzLmggYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jbGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NmQyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jbGFzcy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qIENvcHlyaWdodCBWbGFkaW1pciBQcnVzIDIwMDMuIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCAqLworLyogU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nICovCisvKiBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkgKi8KKworI2lmbmRlZiBDTEFTU19IX1ZQXzIwMDNfMDhfMDEKKyNkZWZpbmUgQ0xBU1NfSF9WUF8yMDAzXzA4XzAxCisKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgImZyYW1lcy5oIgorCitPQkpFQ1QgKiBtYWtlX2NsYXNzX21vZHVsZSggTElTVCAqIHhuYW1lLCBMSVNUICogYmFzZXMsIEZSQU1FICogZnJhbWUgKTsKK3ZvaWQgY2xhc3NfZG9uZSggdm9pZCApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2NvbW1hbmQuYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzFiOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvY29tbWFuZC5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NSBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qICBUaGlzIGZpbGUgaXMgQUxTTzoKKyAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IERhdmlkIEFicmFoYW1zLgorICogIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworLyoKKyAqIGNvbW1hbmQuYyAtIG1haW50YWluIGxpc3RzIG9mIGNvbW1hbmRzCisgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKworI2luY2x1ZGUgImxpc3RzLmgiCisjaW5jbHVkZSAicnVsZXMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisKKy8qCisgKiBjbWRfbmV3KCkgLSByZXR1cm4gYSBuZXcgQ01ELgorICovCisKK0NNRCAqIGNtZF9uZXcoIFJVTEUgKiBydWxlLCBMSVNUICogdGFyZ2V0cywgTElTVCAqIHNvdXJjZXMsIExJU1QgKiBzaGVsbCApCit7CisgICAgQ01EICogY21kID0gKENNRCAqKUJKQU1fTUFMTE9DKCBzaXplb2YoIENNRCApICk7CisgICAgRlJBTUUgZnJhbWVbIDEgXTsKKworICAgIGFzc2VydCggY21kICk7CisgICAgY21kLT5ydWxlID0gcnVsZTsKKyAgICBjbWQtPnNoZWxsID0gc2hlbGw7CisgICAgY21kLT5uZXh0ID0gMDsKKyAgICBjbWQtPm5vb3AgPSAwOworCisgICAgbG9sX2luaXQoICZjbWQtPmFyZ3MgKTsKKyAgICBsb2xfYWRkKCAmY21kLT5hcmdzLCB0YXJnZXRzICk7CisgICAgbG9sX2FkZCggJmNtZC0+YXJncywgc291cmNlcyApOworICAgIHN0cmluZ19uZXcoIGNtZC0+YnVmICk7CisKKyAgICBmcmFtZV9pbml0KCBmcmFtZSApOworICAgIGZyYW1lLT5tb2R1bGUgPSBydWxlLT5tb2R1bGU7CisgICAgbG9sX2luaXQoIGZyYW1lLT5hcmdzICk7CisgICAgbG9sX2FkZCggZnJhbWUtPmFyZ3MsIGxpc3RfY29weSggdGFyZ2V0cyApICk7CisgICAgbG9sX2FkZCggZnJhbWUtPmFyZ3MsIGxpc3RfY29weSggc291cmNlcyApICk7CisgICAgZnVuY3Rpb25fcnVuX2FjdGlvbnMoIHJ1bGUtPmFjdGlvbnMtPmNvbW1hbmQsIGZyYW1lLCBzdGFja19nbG9iYWwoKSwKKyAgICAgICAgY21kLT5idWYgKTsKKyAgICBmcmFtZV9mcmVlKCBmcmFtZSApOworCisgICAgcmV0dXJuIGNtZDsKK30KKworCisvKgorICogY21kX2ZyZWUoKSAtIGZyZWUgYSBDTUQKKyAqLworCit2b2lkIGNtZF9mcmVlKCBDTUQgKiBjbWQgKQoreworICAgIGxvbF9mcmVlKCAmY21kLT5hcmdzICk7CisgICAgbGlzdF9mcmVlKCBjbWQtPnNoZWxsICk7CisgICAgc3RyaW5nX2ZyZWUoIGNtZC0+YnVmICk7CisgICAgQkpBTV9GUkVFKCAodm9pZCAqKWNtZCApOworfQorCisKKy8qCisgKiBjbWRfcmVsZWFzZV90YXJnZXRzX2FuZF9zaGVsbCgpCisgKgorICogICBNYWtlcyB0aGUgQ01EIHJlbGVhc2UgaXRzIGhvbGQgb24gaXRzIHRhcmdldHMgJiBzaGVsbCBsaXN0cyBhbmQgZm9yZ2V0CisgKiBhYm91dCB0aGVtLiBVc2VmdWwgaW4gY2FzZSBjYWxsZXIgc3RpbGwgaGFzIHJlZmVyZW5jZXMgdG8gdGhvc2UgbGlzdHMgYW5kCisgKiB3YW50cyB0byByZXVzZSB0aGVtIGFmdGVyIGZyZWVpbmcgdGhlIENNRCBvYmplY3QuCisgKi8KKwordm9pZCBjbWRfcmVsZWFzZV90YXJnZXRzX2FuZF9zaGVsbCggQ01EICogY21kICkKK3sKKyAgICBjbWQtPmFyZ3MubGlzdFsgMCBdID0gTDA7ICAvKiB0YXJnZXRzICovCisgICAgY21kLT5zaGVsbCA9IEwwOyAgICAgICAgICAgLyogc2hlbGwgICAqLworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvY29tbWFuZC5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvY29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjU1NzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jb21tYW5kLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk0IENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyoKKyAqIGNvbW1hbmQuaCAtIHRoZSBDTUQgc3RydWN0dXJlIGFuZCByb3V0aW5lcyB0byBtYW5pcHVsYXRlIHRoZW0KKyAqCisgKiBCb3RoIEFDVElPTiBhbmQgQ01EIGNvbnRhaW4gYSBydWxlLCB0YXJnZXRzLCBhbmQgc291cmNlcy4gIEFuCisgKiBBQ1RJT04gZGVzY3JpYmVzIGEgcnVsZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBnaXZlbiB0YXJnZXRzIGFuZAorICogc291cmNlczsgYSBDTUQgaXMgd2hhdCBhY3R1YWxseSBnZXRzIGV4ZWN1dGVkIGJ5IHRoZSBzaGVsbC4gIFRoZQorICogZGlmZmVyZW5jZXMgYXJlIGR1ZSB0bzoKKyAqCisgKiAgQUNUSU9OUyBtdXN0IGJlIGNvbWJpbmVkIGlmICdhY3Rpb25zIHRvZ2V0aGVyJyBpcyBnaXZlbi4KKyAqICBBQ1RJT05TIG11c3QgYmUgc3BsaXQgaWYgJ2FjdGlvbnMgcGllY2VtZWFsJyBpcyBnaXZlbi4KKyAqICBBQ1RJT05TIG11c3QgaGF2ZSBjdXJyZW50IHNvdXJjZXMgb21pdHRlZCBmb3IgJ2FjdGlvbnMgdXBkYXRlZCcuCisgKgorICogVGhlIENNRCBkYXRhdHlwZSBob2xkcyBhIHNpbmdsZSBjb21tYW5kIHRoYXQgaXMgdG8gYmUgZXhlY3V0ZWQKKyAqIGFnYWluc3QgYSB0YXJnZXQsIGFuZCB0aGV5IGNhbiBjaGFpbiB0b2dldGhlciB0byByZXByZXNlbnQgdGhlCisgKiBmdWxsIGNvbGxlY3Rpb24gb2YgY29tbWFuZHMgdXNlZCB0byB1cGRhdGUgYSB0YXJnZXQuCisgKgorICogU3RydWN0dXJlczoKKyAqCisgKiAgQ01EIC0gYW4gYWN0aW9uLCByZWFkeSB0byBiZSBmb3JtYXR0ZWQgaW50byBhIGJ1ZmZlciBhbmQgZXhlY3V0ZWQuCisgKgorICogRXh0ZXJuYWwgcm91dGluZXM6CisgKgorICogIGNtZF9uZXcoKSAtIHJldHVybiBhIG5ldyBDTUQgb3IgMCBpZiB0b28gbWFueSBhcmdzLgorICogIGNtZF9mcmVlKCkgLSBkZWxldGUgQ01EIGFuZCBpdHMgcGFydHMuCisgKiAgY21kX25leHQoKSAtIHdhbGsgdGhlIENNRCBjaGFpbi4KKyAqICBjbWRfcmVsZWFzZV90YXJnZXRzX2FuZF9zaGVsbCgpIC0gQ01EIGZvcmdldHMgYWJvdXQgaXRzIHRhcmdldHMgJiBzaGVsbC4KKyAqLworCisKKy8qCisgKiBDTUQgLSBhbiBhY3Rpb24sIHJlYWR5IHRvIGJlIGZvcm1hdHRlZCBpbnRvIGEgYnVmZmVyIGFuZCBleGVjdXRlZC4KKyAqLworCisjaWZuZGVmIENPTU1BTkRfU1cyMDExMTExOF9ICisjZGVmaW5lIENPTU1BTkRfU1cyMDExMTExOF9ICisKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisjaW5jbHVkZSAic3RyaW5ncy5oIgorCisKK3R5cGVkZWYgc3RydWN0IF9jbWQgQ01EOworc3RydWN0IF9jbWQKK3sKKyAgICBDTUQgICogbmV4dDsKKyAgICBSVUxFICogcnVsZTsgICAgICAvKiBydWxlLT5hY3Rpb25zIGNvbnRhaW5zIHNoZWxsIHNjcmlwdCAqLworICAgIExJU1QgKiBzaGVsbDsgICAgIC8qICQoSkFNU0hFTEwpIHZhbHVlICovCisgICAgTE9MICAgIGFyZ3M7ICAgICAgLyogTElTVHMgZm9yICQoPCksICQoPikgKi8KKyAgICBzdHJpbmcgYnVmWyAxIF07ICAvKiBhY3R1YWwgY29tbWFuZHMgKi8KKyAgICBpbnQgICAgbm9vcDsgICAgICAvKiBuby1vcCBjb21tYW5kcyBzaG91bGQgYmUgZmFrZWQgaW5zdGVhZCBvZiBleGVjdXRlZCAqLworfTsKKworQ01EICogY21kX25ldworKAorICAgIFJVTEUgKiBydWxlLCAgICAgLyogcnVsZSAocmVmZXJlbmNlZCkgKi8KKyAgICBMSVNUICogdGFyZ2V0cywgIC8qICQoPCkgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCkgKi8KKyAgICBMSVNUICogc291cmNlcywgIC8qICQoPikgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCkgKi8KKyAgICBMSVNUICogc2hlbGwgICAgIC8qICQoSkFNU0hFTEwpIChvd25lcnNoaXAgdHJhbnNmZXJyZWQpICovCispOworCit2b2lkIGNtZF9yZWxlYXNlX3RhcmdldHNfYW5kX3NoZWxsKCBDTUQgKiApOworCit2b2lkIGNtZF9mcmVlKCBDTUQgKiApOworCisjZGVmaW5lIGNtZF9uZXh0KCBjICkgKChjKS0+bmV4dCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jb21waWxlLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jb21waWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI0NjkzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2NvbXBpbGUuYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAyMDAwIENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyogIFRoaXMgZmlsZSBpcyBBTFNPOgorICogIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisvKgorICogY29tcGlsZS5jIC0gY29tcGlsZSBwYXJzZWQgamFtIHN0YXRlbWVudHMKKyAqCisgKiBFeHRlcm5hbCByb3V0aW5lczoKKyAqICBldmFsdWF0ZV9ydWxlKCkgLSBleGVjdXRlIGEgcnVsZSBpbnZvY2F0aW9uCisgKgorICogSW50ZXJuYWwgcm91dGluZXM6CisgKiAgZGVidWdfY29tcGlsZSgpIC0gcHJpbnRmIHdpdGggaW5kZW50IHRvIHNob3cgcnVsZSBleHBhbnNpb24KKyAqLworCisjaW5jbHVkZSAiamFtLmgiCisjaW5jbHVkZSAiY29tcGlsZS5oIgorCisjaW5jbHVkZSAiYnVpbHRpbnMuaCIKKyNpbmNsdWRlICJjbGFzcy5oIgorI2luY2x1ZGUgImNvbnN0YW50cy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJoZHJtYWNyby5oIgorI2luY2x1ZGUgIm1ha2UuaCIKKyNpbmNsdWRlICJtb2R1bGVzLmgiCisjaW5jbHVkZSAicGFyc2UuaCIKKyNpbmNsdWRlICJydWxlcy5oIgorI2luY2x1ZGUgInNlYXJjaC5oIgorI2luY2x1ZGUgInN0cmluZ3MuaCIKKyNpbmNsdWRlICJ2YXJpYWJsZS5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKworc3RhdGljIHZvaWQgZGVidWdfY29tcGlsZSggaW50IHdoaWNoLCBjaGFyIGNvbnN0ICogcywgRlJBTUUgKiApOworCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgZnJvbSBidWlsdGlucy5jICovCit2b2lkIGJhY2t0cmFjZSggRlJBTUUgKiApOwordm9pZCBiYWNrdHJhY2VfbGluZSggRlJBTUUgKiApOwordm9pZCBwcmludF9zb3VyY2VfbGluZSggRlJBTUUgKiApOwordm9pZCB1bmtub3duX3J1bGUoIEZSQU1FICosIGNoYXIgY29uc3QgKiBrZXksIG1vZHVsZV90ICosIE9CSkVDVCAqIHJ1bGVfbmFtZSApOworCisKKy8qCisgKiBldmFsdWF0ZV9ydWxlKCkgLSBleGVjdXRlIGEgcnVsZSBpbnZvY2F0aW9uCisgKi8KKworTElTVCAqIGV2YWx1YXRlX3J1bGUoIFJVTEUgKiBydWxlLCBPQkpFQ1QgKiBydWxlbmFtZSwgRlJBTUUgKiBmcmFtZSApCit7CisgICAgTElTVCAgICAgICAgICAqIHJlc3VsdCA9IEwwOworICAgIHByb2ZpbGVfZnJhbWUgICBwcm9mWyAxIF07CisgICAgbW9kdWxlX3QgICAgICAqIHByZXZfbW9kdWxlID0gZnJhbWUtPm1vZHVsZTsKKworICAgIGlmICggREVCVUdfQ09NUElMRSApCisgICAgeworICAgICAgICAvKiBUcnkgaGFyZCB0byBpbmRpY2F0ZSBpbiB3aGljaCBtb2R1bGUgdGhlIHJ1bGUgaXMgZ29pbmcgdG8gZXhlY3V0ZS4gKi8KKyAgICAgICAgY2hhciBidWZbIDI1NiBdID0gIiI7CisgICAgICAgIGlmICggcnVsZS0+bW9kdWxlLT5uYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RybmNhdCggYnVmLCBvYmplY3Rfc3RyKCBydWxlLT5tb2R1bGUtPm5hbWUgKSwgc2l6ZW9mKCBidWYgKSAtCisgICAgICAgICAgICAgICAgMSApOworICAgICAgICAgICAgc3RybmNhdCggYnVmLCAiLiIsIHNpemVvZiggYnVmICkgLSAxICk7CisgICAgICAgICAgICBpZiAoIHN0cm5jbXAoIGJ1Ziwgb2JqZWN0X3N0ciggcnVsZS0+bmFtZSApLCBzdHJsZW4oIGJ1ZiApICkgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmWyAwIF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cm5jYXQoIGJ1Ziwgb2JqZWN0X3N0ciggcnVsZS0+bmFtZSApLCBzaXplb2YoIGJ1ZiApIC0gMSApOworICAgICAgICBkZWJ1Z19jb21waWxlKCAxLCBidWYsIGZyYW1lICk7CisKKyAgICAgICAgbG9sX3ByaW50KCBmcmFtZS0+YXJncyApOworICAgICAgICBwcmludGYoICJcbiIgKTsKKyAgICB9CisKKyAgICBpZiAoIHJ1bGUtPnByb2NlZHVyZSAmJiBydWxlLT5tb2R1bGUgIT0gcHJldl9tb2R1bGUgKQorICAgIHsKKyAgICAgICAgLyogUHJvcGFnYXRlIGN1cnJlbnQgbW9kdWxlIHRvIG5lc3RlZCBydWxlIGludm9jYXRpb25zLiAqLworICAgICAgICBmcmFtZS0+bW9kdWxlID0gcnVsZS0+bW9kdWxlOworICAgIH0KKworICAgIC8qIFJlY29yZCBjdXJyZW50IHJ1bGUgbmFtZSBpbiBmcmFtZS4gKi8KKyAgICBpZiAoIHJ1bGUtPnByb2NlZHVyZSApCisgICAgeworICAgICAgICBmcmFtZS0+cnVsZW5hbWUgPSBvYmplY3Rfc3RyKCBydWxlbmFtZSApOworICAgICAgICAvKiBBbmQgZW50ZXIgcmVjb3JkIHByb2ZpbGUgaW5mby4gKi8KKyAgICAgICAgaWYgKCBERUJVR19QUk9GSUxFICkKKyAgICAgICAgICAgIHByb2ZpbGVfZW50ZXIoIGZ1bmN0aW9uX3J1bGVuYW1lKCBydWxlLT5wcm9jZWR1cmUgKSwgcHJvZiApOworICAgIH0KKworICAgIC8qIENoZWNrIHRyYWRpdGlvbmFsIHRhcmdldHMgJCg8KSBhbmQgc291cmNlcyAkKD4pLiAqLworICAgIGlmICggIXJ1bGUtPmFjdGlvbnMgJiYgIXJ1bGUtPnByb2NlZHVyZSApCisgICAgICAgIHVua25vd25fcnVsZSggZnJhbWUsIE5VTEwsIGZyYW1lLT5tb2R1bGUsIHJ1bGUtPm5hbWUgKTsKKworICAgIC8qIElmIHRoaXMgcnVsZSB3aWxsIGJlIGV4ZWN1dGVkIGZvciB1cGRhdGluZyB0aGUgdGFyZ2V0cyB0aGVuIGNvbnN0cnVjdCB0aGUKKyAgICAgKiBhY3Rpb24gZm9yIG1ha2UoKS4KKyAgICAgKi8KKyAgICBpZiAoIHJ1bGUtPmFjdGlvbnMgKQorICAgIHsKKyAgICAgICAgVEFSR0VUUyAqIHQ7CisKKyAgICAgICAgLyogVGhlIGFjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZSBvZiB0aGlzIHJ1bGUuICovCisgICAgICAgIEFDVElPTiAqIGNvbnN0IGFjdGlvbiA9IChBQ1RJT04gKilCSkFNX01BTExPQyggc2l6ZW9mKCBBQ1RJT04gKSApOworICAgICAgICBtZW1zZXQoIChjaGFyICopYWN0aW9uLCAnXDAnLCBzaXplb2YoICphY3Rpb24gKSApOworCisgICAgICAgIGFjdGlvbi0+cnVsZSA9IHJ1bGU7CisgICAgICAgIGFjdGlvbi0+dGFyZ2V0cyA9IHRhcmdldGxpc3QoIChUQVJHRVRTICopMCwgbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKSApOworICAgICAgICBhY3Rpb24tPnNvdXJjZXMgPSB0YXJnZXRsaXN0KCAoVEFSR0VUUyAqKTAsIGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAxICkgKTsKKyAgICAgICAgYWN0aW9uLT5yZWZzID0gMTsKKworICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgZ3JvdXAgb2YgdGFyZ2V0cyBhbGwgYmVpbmcgYnVpbHQgdXNpbmcgdGhlIHNhbWUgYWN0aW9uCisgICAgICAgICAqIHRoZW4gd2UgbXVzdCBub3QgYWxsb3cgYW55IG9mIHRoZW0gdG8gYmUgdXNlZCBhcyBzb3VyY2VzIHVubGVzcyB0aGV5CisgICAgICAgICAqIGFyZSBhbGwgdXAgdG8gZGF0ZSBhbmQgdGhlaXIgYWN0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgcnVuIG9yIHRoZWlyCisgICAgICAgICAqIGFjdGlvbiBoYXMgaGFkIGEgY2hhbmNlIHRvIGZpbmlzaCBpdHMgd29yayBhbmQgYnVpbGQgYWxsIG9mIHRoZW0KKyAgICAgICAgICogYW5ldy4KKyAgICAgICAgICoKKyAgICAgICAgICogV2l0aG91dCB0aGlzIGl0IG1pZ2h0IGJlIHBvc3NpYmxlLCBpbiBjYXNlIG9mIGEgbXVsdGktcHJvY2VzcyBidWlsZCwKKyAgICAgICAgICogZm9yIHRoZWlyIGFjdGlvbiwgdHJpZ2dlcmVkIHRvIGJ1aWxkaW5nIG9uZSBvZiB0aGUgdGFyZ2V0cywgdG8gc3RpbGwKKyAgICAgICAgICogYmUgcnVubmluZyB3aGVuIGFub3RoZXIgdGFyZ2V0IGluIHRoZSBncm91cCByZXBvcnRzIGFzIGRvbmUgaW4gb3JkZXIKKyAgICAgICAgICogdG8gYXZvaWQgdHJpZ2dlcmluZyB0aGUgc2FtZSBhY3Rpb24gYWdhaW4gYW5kIGdldHMgdXNlZCBwcmVtYXR1cmVseS4KKyAgICAgICAgICoKKyAgICAgICAgICogQXMgYSBxdWljay1maXggdG8gYWNoaWV2ZSB0aGlzIGVmZmVjdCB3ZSBtYWtlIGFsbCB0aGUgdGFyZ2V0cyBsaXN0CisgICAgICAgICAqIGVhY2ggb3RoZXIgYXMgJ2luY2x1ZGVkIHRhcmdldHMnLiBNb3JlIHByZWNpc2VseSwgd2UgbWFyayB0aGUgZmlyc3QKKyAgICAgICAgICogbGlzdGVkIHRhcmdldCBhcyBpbmNsdWRpbmcgYWxsIHRoZSBvdGhlciB0YXJnZXRzIGluIHRoZSBsaXN0IGFuZCB2aWNlCisgICAgICAgICAqIHZlcnNhLiBUaGlzIG1ha2VzIGFueW9uZSBkZXBlbmRpbmcgb24gYW55IG9mIHRob3NlIHRhcmdldHMgaW1wbGljaXRseQorICAgICAgICAgKiBkZXBlbmQgb24gYWxsIG9mIHRoZW0sIHRodXMgbWFraW5nIHN1cmUgbm9uZSBvZiB0aG9zZSB0YXJnZXRzIGNhbiBiZQorICAgICAgICAgKiB1c2VkIGFzIHNvdXJjZXMgdW50aWwgYWxsIG9mIHRoZW0gaGF2ZSBiZWVuIGJ1aWx0LiBOb3RlIHRoYXQgZGlyZWN0CisgICAgICAgICAqIGRlcGVuZGVuY2llcyBjb3VsZCBub3QgaGF2ZSBiZWVuIHVzZWQgZHVlIHRvIHRoZSAnY2lyY3VsYXIKKyAgICAgICAgICogZGVwZW5kZW5jeScgaXNzdWUuCisgICAgICAgICAqCisgICAgICAgICAqIFRPRE86IEFsdGhvdWdoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHNvbHZlcyB0aGUgcHJvYmxlbSBvZiBvbmUKKyAgICAgICAgICogb2YgdGhlIHRhcmdldHMgZ2V0dGluZyB1c2VkIGJlZm9yZSBpdHMgYWN0aW9uIGNvbXBsZXRlcyBpdHMgd29yaywgaXQKKyAgICAgICAgICogYWxzbyBmb3JjZXMgdGhlIGFjdGlvbiB0byBydW4gd2hlbmV2ZXIgYW55IG9mIHRoZSB0YXJnZXRzIGluIHRoZQorICAgICAgICAgKiBncm91cCBpcyBub3QgdXAgdG8gZGF0ZSBldmVuIHRob3VnaCBzb21lIG9mIHRoZW0gbWlnaHQgbm90IGFjdHVhbGx5CisgICAgICAgICAqIGJlIHVzZWQgYnkgdGhlIHRhcmdldHMgYmVpbmcgYnVpbHQuIFdlIHNob3VsZCBzZWUgaG93IHdlIGNhbgorICAgICAgICAgKiBjb3JyZWN0bHkgcmVjb2duaXplIHN1Y2ggY2FzZXMgYW5kIHVzZSB0aGF0IHRvIGF2b2lkIHJ1bm5pbmcgdGhlCisgICAgICAgICAqIGFjdGlvbiBpZiBwb3NzaWJsZSBhbmQgbm90IHJlYnVpbGQgdGFyZ2V0cyBub3QgYWN0dWFsbHkgZGVwZW5kaW5nIG9uCisgICAgICAgICAqIHRhcmdldHMgdGhhdCBhcmUgbm90IHVwIHRvIGRhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIFRPRE86IEN1cnJlbnQgc29sdXRpb24gdXNpbmcgZmFrZSBJTkNMVURFUyByZWxhdGlvbnMgbWF5IGNhdXNlCisgICAgICAgICAqIGFjdGlvbnMgdG8gYmUgcnVuIHdoZW4gdGhlIGFmZmVjdGVkIHRhcmdldHMgYXJlIGJ1aWx0IGJ5IG11bHRpcGxlCisgICAgICAgICAqIGFjdGlvbnMuIEUuZy4gaWYgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIGFjdGlvbnMgcmVnaXN0ZXJlZCBpbiB0aGUKKyAgICAgICAgICogb3JkZXIgc3BlY2lmaWVkOgorICAgICAgICAgKiAgICAgKEkpIGJ1aWxkcyB0YXJnZXRzIEEgJiBCCisgICAgICAgICAqICAgICAoSUkpIGJ1aWxkcyB0YXJnZXQgQgorICAgICAgICAgKiBhbmQgd2Ugd2FudCB0byBidWlsZCBhIHRhcmdldCBkZXBlbmRpbmcgb24gdGFyZ2V0IEEsIHRoZW4gYm90aAorICAgICAgICAgKiBhY3Rpb25zIChJKSAmIChJSSkgd2lsbCBiZSBydW4sIGV2ZW4gdGhvdWdoIHRoZSBzZWNvbmQgb25lIGRvZXMgbm90CisgICAgICAgICAqIGhhdmUgYW55IGRpcmVjdCByZWxhdGlvbnNoaXAgdG8gdGFyZ2V0IEEuIENvbnNpZGVyIHdoZXRoZXIgdGhpcyBpcworICAgICAgICAgKiBkZXNpcmVkIGJlaGF2aW91ciBvciBub3QuIEl0IGNvdWxkIGJlIHRoYXQgQm9vc3QgQnVpbGQgc2hvdWxkIChvcgorICAgICAgICAgKiBwb3NzaWJseSBhbHJlYWR5IGRvZXMpIHJ1biBhbGwgYWN0aW9ucyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHRhcmdldAorICAgICAgICAgKiBpZiBhbnkgb2YgdGhlbSBuZWVkcyB0byBiZSBydW4gaW4gd2hpY2ggY2FzZSBvdXIgSU5DTFVERVMgcmVsYXRpb25zCisgICAgICAgICAqIGFyZSBub3QgYWN0dWFsbHkgY2F1c2luZyBhbnkgYWN0aW9ucyB0byBiZSBydW4gdGhhdCB3b3VsZCBub3QgaGF2ZQorICAgICAgICAgKiBiZWVuIHJ1biB3aXRob3V0IHRoZW0uCisgICAgICAgICAqLworICAgICAgICBpZiAoIGFjdGlvbi0+dGFyZ2V0cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRBUkdFVCAqIGNvbnN0IHQwID0gYWN0aW9uLT50YXJnZXRzLT50YXJnZXQ7CisgICAgICAgICAgICBmb3IgKCB0ID0gYWN0aW9uLT50YXJnZXRzLT5uZXh0OyB0OyB0ID0gdC0+bmV4dCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGFyZ2V0X2luY2x1ZGUoIHQtPnRhcmdldCwgdDAgKTsKKyAgICAgICAgICAgICAgICB0YXJnZXRfaW5jbHVkZSggdDAsIHQtPnRhcmdldCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQXBwZW5kIHRoaXMgYWN0aW9uIHRvIHRoZSBhY3Rpb25zIG9mIGVhY2ggdGFyZ2V0LiAqLworICAgICAgICBmb3IgKCB0ID0gYWN0aW9uLT50YXJnZXRzOyB0OyB0ID0gdC0+bmV4dCApCisgICAgICAgICAgICB0LT50YXJnZXQtPmFjdGlvbnMgPSBhY3Rpb25saXN0KCB0LT50YXJnZXQtPmFjdGlvbnMsIGFjdGlvbiApOworCisgICAgICAgIGFjdGlvbl9mcmVlKCBhY3Rpb24gKTsKKyAgICB9CisKKyAgICAvKiBOb3cgcmVjdXJzaXZlbHkgY29tcGlsZSBhbnkgcGFyc2UgdHJlZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBydWxlLgorICAgICAqIGZ1bmN0aW9uX3JlZmVyKCkvZnVuY3Rpb25fZnJlZSgpIGNhbGwgcGFpciBhZGRlZCB0byBlbnN1cmUgdGhlIHJ1bGUgZG9lcworICAgICAqIG5vdCBnZXQgZnJlZWQgd2hpbGUgaW4gdXNlLgorICAgICAqLworICAgIGlmICggcnVsZS0+cHJvY2VkdXJlICkKKyAgICB7CisgICAgICAgIEZVTkNUSU9OICogY29uc3QgZnVuY3Rpb24gPSBydWxlLT5wcm9jZWR1cmU7CisgICAgICAgIGZ1bmN0aW9uX3JlZmVyKCBmdW5jdGlvbiApOworICAgICAgICByZXN1bHQgPSBmdW5jdGlvbl9ydW4oIGZ1bmN0aW9uLCBmcmFtZSwgc3RhY2tfZ2xvYmFsKCkgKTsKKyAgICAgICAgZnVuY3Rpb25fZnJlZSggZnVuY3Rpb24gKTsKKyAgICB9CisKKyAgICBpZiAoIERFQlVHX1BST0ZJTEUgJiYgcnVsZS0+cHJvY2VkdXJlICkKKyAgICAgICAgcHJvZmlsZV9leGl0KCBwcm9mICk7CisKKyAgICBpZiAoIERFQlVHX0NPTVBJTEUgKQorICAgICAgICBkZWJ1Z19jb21waWxlKCAtMSwgMCwgZnJhbWUgKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIENhbGwgdGhlIGdpdmVuIHJ1bGUgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIFRoZSBwYXJhbWV0ZXJzIHNob3VsZCBiZQorICogb2YgdHlwZSBMSVNUKiBhbmQgZW5kIHdpdGggYSBOVUxMIHBvaW50ZXIuIFRoaXMgZGlmZmVycyBmcm9tICdldmFsdWF0ZV9ydWxlJworICogaW4gdGhhdCBmcmFtZSBmb3IgdGhlIGNhbGxlZCBydWxlIGlzIHByZXBhcmVkIGluc2lkZSAnY2FsbF9ydWxlJy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIGEgYnVpbHRpbiBydWxlIChpbiBDKSB3YW50cyB0byBjYWxsIGFub3RoZXIgcnVsZQorICogd2hpY2ggbWlnaHQgYmUgaW1wbGVtZW50ZWQgaW4gSmFtLgorICovCisKK0xJU1QgKiBjYWxsX3J1bGUoIE9CSkVDVCAqIHJ1bGVuYW1lLCBGUkFNRSAqIGNhbGxlcl9mcmFtZSwgLi4uICkKK3sKKyAgICB2YV9saXN0IHZhOworICAgIExJU1QgKiByZXN1bHQ7CisKKyAgICBGUkFNRSBpbm5lclsgMSBdOworICAgIGZyYW1lX2luaXQoIGlubmVyICk7CisgICAgaW5uZXItPnByZXYgPSBjYWxsZXJfZnJhbWU7CisgICAgaW5uZXItPnByZXZfdXNlciA9IGNhbGxlcl9mcmFtZS0+bW9kdWxlLT51c2VyX21vZHVsZQorICAgICAgICA/IGNhbGxlcl9mcmFtZQorICAgICAgICA6IGNhbGxlcl9mcmFtZS0+cHJldl91c2VyOworICAgIGlubmVyLT5tb2R1bGUgPSBjYWxsZXJfZnJhbWUtPm1vZHVsZTsKKworICAgIHZhX3N0YXJ0KCB2YSwgY2FsbGVyX2ZyYW1lICk7CisgICAgZm9yICggOyA7ICkKKyAgICB7CisgICAgICAgIExJU1QgKiBjb25zdCBsID0gdmFfYXJnKCB2YSwgTElTVCAqICk7CisgICAgICAgIGlmICggIWwgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxvbF9hZGQoIGlubmVyLT5hcmdzLCBsICk7CisgICAgfQorICAgIHZhX2VuZCggdmEgKTsKKworICAgIHJlc3VsdCA9IGV2YWx1YXRlX3J1bGUoIGJpbmRydWxlKCBydWxlbmFtZSwgaW5uZXItPm1vZHVsZSApLCBydWxlbmFtZSwgaW5uZXIgKTsKKworICAgIGZyYW1lX2ZyZWUoIGlubmVyICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBkZWJ1Z19jb21waWxlKCkgLSBwcmludGYgd2l0aCBpbmRlbnQgdG8gc2hvdyBydWxlIGV4cGFuc2lvbgorICovCisKK3N0YXRpYyB2b2lkIGRlYnVnX2NvbXBpbGUoIGludCB3aGljaCwgY2hhciBjb25zdCAqIHMsIEZSQU1FICogZnJhbWUgKQoreworICAgIHN0YXRpYyBpbnQgbGV2ZWwgPSAwOworICAgIHN0YXRpYyBjaGFyIGluZGVudFsgMzYgXSA9ICI+Pj4+fD4+Pj58Pj4+Pnw+Pj4+fD4+Pj58Pj4+Pnw+Pj4+fCI7CisKKyAgICBpZiAoIHdoaWNoID49IDAgKQorICAgIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgcHJpbnRfc291cmNlX2xpbmUoIGZyYW1lICk7CisKKyAgICAgICAgaSA9ICggbGV2ZWwgKyAxICkgKiAyOworICAgICAgICB3aGlsZSAoIGkgPiAzNSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwdXRzKCBpbmRlbnQsIHN0ZG91dCApOworICAgICAgICAgICAgaSAtPSAzNTsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZiggIiUqLipzICIsIGksIGksIGluZGVudCApOworICAgIH0KKworICAgIGlmICggcyApCisgICAgICAgIHByaW50ZiggIiVzICIsIHMgKTsKKworICAgIGxldmVsICs9IHdoaWNoOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvY29tcGlsZS5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvY29tcGlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MGY5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jb21waWxlLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAyMDAwIENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyogIFRoaXMgZmlsZSBpcyBBTFNPOgorICogIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisvKgorICogY29tcGlsZS5oIC0gY29tcGlsZSBwYXJzZWQgamFtIHN0YXRlbWVudHMKKyAqLworCisjaWZuZGVmIENPTVBJTEVfRFdBMjAwMTEwMjJfSAorI2RlZmluZSBDT01QSUxFX0RXQTIwMDExMDIyX0gKKworI2luY2x1ZGUgImZyYW1lcy5oIgorI2luY2x1ZGUgImxpc3RzLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAicnVsZXMuaCIKKwordm9pZCBjb21waWxlX2J1aWx0aW5zKCk7CisKK0xJU1QgKiBldmFsdWF0ZV9ydWxlKCBSVUxFICogcnVsZSwgT0JKRUNUICogcnVsZW5hbWUsIEZSQU1FICogKTsKK0xJU1QgKiBjYWxsX3J1bGUoIE9CSkVDVCAqIHJ1bGVuYW1lLCBGUkFNRSAqIGNhbGxlcl9mcmFtZSwgLi4uICk7CisKKy8qIEZsYWdzIGZvciBjb21waWxlX3NldCgpLCBldGMgKi8KKworI2RlZmluZSBBU1NJR05fU0VUICAgICAgMHgwMCAgLyogPSBhc3NpZ24gdmFyaWFibGUgKi8KKyNkZWZpbmUgQVNTSUdOX0FQUEVORCAgIDB4MDEgIC8qICs9IGFwcGVuZCB2YXJpYWJsZSAqLworI2RlZmluZSBBU1NJR05fREVGQVVMVCAgMHgwMiAgLyogc2V0IG9ubHkgaWYgdW5zZXQgKi8KKworLyogRmxhZ3MgZm9yIGNvbXBpbGVfc2V0ZXhlYygpICovCisKKyNkZWZpbmUgRVhFQ19VUERBVEVEICAgIDB4MDEgIC8qIGV4ZWN1dGVzIHVwZGF0ZWQgKi8KKyNkZWZpbmUgRVhFQ19UT0dFVEhFUiAgIDB4MDIgIC8qIGV4ZWN1dGVzIHRvZ2V0aGVyICovCisjZGVmaW5lIEVYRUNfSUdOT1JFICAgICAweDA0ICAvKiBleGVjdXRlcyBpZ25vcmUgKi8KKyNkZWZpbmUgRVhFQ19RVUlFVExZICAgIDB4MDggIC8qIGV4ZWN1dGVzIHF1aWV0bHkgKi8KKyNkZWZpbmUgRVhFQ19QSUVDRU1FQUwgIDB4MTAgIC8qIGV4ZWN1dGVzIHBpZWNlbWVhbCAqLworI2RlZmluZSBFWEVDX0VYSVNUSU5HICAgMHgyMCAgLyogZXhlY3V0ZXMgZXhpc3RpbmcgKi8KKworLyogQ29uZGl0aW9ucyBmb3IgY29tcGlsZV9pZigpICovCisKKyNkZWZpbmUgRVhQUl9OT1QgICAgIDAgICAvKiAhIGNvbmQgKi8KKyNkZWZpbmUgRVhQUl9BTkQgICAgIDEgICAvKiBjb25kICYmIGNvbmQgKi8KKyNkZWZpbmUgRVhQUl9PUiAgICAgIDIgICAvKiBjb25kIHx8IGNvbmQgKi8KKyNkZWZpbmUgRVhQUl9FWElTVFMgIDMgICAvKiBhcmcgKi8KKyNkZWZpbmUgRVhQUl9FUVVBTFMgIDQgICAvKiBhcmcgPSBhcmcgKi8KKyNkZWZpbmUgRVhQUl9OT1RFUSAgIDUgICAvKiBhcmcgIT0gYXJnICovCisjZGVmaW5lIEVYUFJfTEVTUyAgICA2ICAgLyogYXJnIDwgYXJnICAqLworI2RlZmluZSBFWFBSX0xFU1NFUSAgNyAgIC8qIGFyZyA8PSBhcmcgKi8KKyNkZWZpbmUgRVhQUl9NT1JFICAgIDggICAvKiBhcmcgPiBhcmcgICovCisjZGVmaW5lIEVYUFJfTU9SRUVRICA5ICAgLyogYXJnID49IGFyZyAqLworI2RlZmluZSBFWFBSX0lOICAgICAgMTAgIC8qIGFyZyBpbiBhcmcgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jb25zdGFudHMuYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2NvbnN0YW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MWQzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jb25zdGFudHMuYwpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFN0ZXZlbiBXYXRhbmFiZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qCisgKiBjb25zdGFudHMuYyAtIGNvbnN0YW50IG9iamVjdHMKKyAqCisgKiBFeHRlcm5hbCBmdW5jdGlvbnM6CisgKgorICogICAgY29uc3RhbnRzX2luaXQoKSAtIGluaXRpYWxpemUgY29uc3RhbnRzCisgKiAgICBjb25zdGFudHNfZG9uZSgpIC0gZnJlZSBjb25zdGFudHMKKyAqCisgKi8KKworI2luY2x1ZGUgImNvbnN0YW50cy5oIgorCisKK3ZvaWQgY29uc3RhbnRzX2luaXQoIHZvaWQgKQoreworICAgIGNvbnN0YW50X2VtcHR5ICAgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICIiICk7CisgICAgY29uc3RhbnRfZG90ICAgICAgICAgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIi4iICk7CisgICAgY29uc3RhbnRfcGx1cyAgICAgICAgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIisiICk7CisgICAgY29uc3RhbnRfc3RhciAgICAgICAgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIioiICk7CisgICAgY29uc3RhbnRfcXVlc3Rpb25fbWFyayAgICAgICAgICAgID0gb2JqZWN0X25ldyggIj8iICk7CisgICAgY29uc3RhbnRfb2sgICAgICAgICAgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIm9rIiApOworICAgIGNvbnN0YW50X3RydWUgICAgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJ0cnVlIiApOworICAgIGNvbnN0YW50X25hbWUgICAgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJfX25hbWVfXyIgKTsKKyAgICBjb25zdGFudF9iYXNlcyAgICAgICAgICAgICAgICAgICAgPSBvYmplY3RfbmV3KCAiX19iYXNlc19fIiApOworICAgIGNvbnN0YW50X2NsYXNzICAgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJfX2NsYXNzX18iICk7CisgICAgY29uc3RhbnRfdHlwZWNoZWNrICAgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIi50eXBlY2hlY2siICk7CisgICAgY29uc3RhbnRfYnVpbHRpbiAgICAgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIihidWlsdGluKSIgKTsKKyAgICBjb25zdGFudF9IQ0FDSEVGSUxFICAgICAgICAgICAgICAgPSBvYmplY3RfbmV3KCAiSENBQ0hFRklMRSIgKTsKKyAgICBjb25zdGFudF9IQ0FDSEVNQVhBR0UgICAgICAgICAgICAgPSBvYmplY3RfbmV3KCAiSENBQ0hFTUFYQUdFIiApOworICAgIGNvbnN0YW50X0hEUlNDQU4gICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJIRFJTQ0FOIiApOworICAgIGNvbnN0YW50X0hEUlJVTEUgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJIRFJSVUxFIiApOworICAgIGNvbnN0YW50X0JJTkRSVUxFICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJCSU5EUlVMRSIgKTsKKyAgICBjb25zdGFudF9MT0NBVEUgICAgICAgICAgICAgICAgICAgPSBvYmplY3RfbmV3KCAiTE9DQVRFIiApOworICAgIGNvbnN0YW50X1NFQVJDSCAgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJTRUFSQ0giICk7CisgICAgY29uc3RhbnRfSkFNX1NFTUFQSE9SRSAgICAgICAgICAgID0gb2JqZWN0X25ldyggIkpBTV9TRU1BUEhPUkUiICk7CisgICAgY29uc3RhbnRfVElNSU5HX1JVTEUgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIl9fVElNSU5HX1JVTEVfXyIgKTsKKyAgICBjb25zdGFudF9BQ1RJT05fUlVMRSAgICAgICAgICAgICAgPSBvYmplY3RfbmV3KCAiX19BQ1RJT05fUlVMRV9fIiApOworICAgIGNvbnN0YW50X0pBTVNIRUxMICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJKQU1TSEVMTCIgKTsKKyAgICBjb25zdGFudF9UTVBESVIgICAgICAgICAgICAgICAgICAgPSBvYmplY3RfbmV3KCAiVE1QRElSIiApOworICAgIGNvbnN0YW50X1RNUE5BTUUgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJUTVBOQU1FIiApOworICAgIGNvbnN0YW50X1RNUEZJTEUgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJUTVBGSUxFIiApOworICAgIGNvbnN0YW50X1NURE9VVCAgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJTVERPVVQiICk7CisgICAgY29uc3RhbnRfU1RERVJSICAgICAgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIlNUREVSUiIgKTsKKyAgICBjb25zdGFudF9KQU1EQVRFICAgICAgICAgICAgICAgICAgPSBvYmplY3RfbmV3KCAiSkFNREFURSIgKTsKKyAgICBjb25zdGFudF9KQU1fVElNRVNUQU1QX1JFU09MVVRJT04gPSBvYmplY3RfbmV3KCAiSkFNX1RJTUVTVEFNUF9SRVNPTFVUSU9OIiApOworICAgIGNvbnN0YW50X0pBTV9WRVJTSU9OICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJKQU1fVkVSU0lPTiIgKTsKKyAgICBjb25zdGFudF9KQU1VTkFNRSAgICAgICAgICAgICAgICAgPSBvYmplY3RfbmV3KCAiSkFNVU5BTUUiICk7CisgICAgY29uc3RhbnRfRU5WSVJPTiAgICAgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIi5FTlZJUk9OIiApOworICAgIGNvbnN0YW50X0FSR1YgICAgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJBUkdWIiApOworICAgIGNvbnN0YW50X2FsbCAgICAgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJhbGwiICk7CisgICAgY29uc3RhbnRfUEFSQUxMRUxJU00gICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIlBBUkFMTEVMSVNNIiApOworICAgIGNvbnN0YW50X0tFRVBfR09JTkcgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJLRUVQX0dPSU5HIiApOworICAgIGNvbnN0YW50X290aGVyICAgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJbT1RIRVJdIiApOworICAgIGNvbnN0YW50X3RvdGFsICAgICAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJbVE9UQUxdIiApOworICAgIGNvbnN0YW50X0ZJTEVfRElSU0NBTiAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJGSUxFX0RJUlNDQU4iICk7CisgICAgY29uc3RhbnRfTUFJTiAgICAgICAgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIk1BSU4iICk7CisgICAgY29uc3RhbnRfTUFJTl9NQUtFICAgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIk1BSU5fTUFLRSIgKTsKKyAgICBjb25zdGFudF9NQUtFX01BS0UwICAgICAgICAgICAgICAgPSBvYmplY3RfbmV3KCAiTUFLRV9NQUtFMCIgKTsKKyAgICBjb25zdGFudF9NQUtFX01BS0UxICAgICAgICAgICAgICAgPSBvYmplY3RfbmV3KCAiTUFLRV9NQUtFMSIgKTsKKyAgICBjb25zdGFudF9NQUtFX01BS0UwU09SVCAgICAgICAgICAgPSBvYmplY3RfbmV3KCAiTUFLRV9NQUtFMFNPUlQiICk7CisgICAgY29uc3RhbnRfQklORE1PRFVMRSAgICAgICAgICAgICAgID0gb2JqZWN0X25ldyggIkJJTkRNT0RVTEUiICk7CisgICAgY29uc3RhbnRfSU1QT1JUX01PRFVMRSAgICAgICAgICAgID0gb2JqZWN0X25ldyggIklNUE9SVF9NT0RVTEUiICk7CisgICAgY29uc3RhbnRfQlVJTFRJTl9HTE9CX0JBQ0sgICAgICAgID0gb2JqZWN0X25ldyggIkJVSUxUSU5fR0xPQl9CQUNLIiApOworICAgIGNvbnN0YW50X3RpbWVzdGFtcCAgICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJ0aW1lc3RhbXAiICk7CisgICAgY29uc3RhbnRfcHl0aG9uICAgICAgICAgICAgICAgICAgID0gb2JqZWN0X25ldygiX19weXRob25fXyIpOworICAgIGNvbnN0YW50X3B5dGhvbl9pbnRlcmZhY2UgICAgICAgICA9IG9iamVjdF9uZXcoICJweXRob25faW50ZXJmYWNlIiApOworICAgIGNvbnN0YW50X2V4dHJhX3B5dGhvbnBhdGggICAgICAgICA9IG9iamVjdF9uZXcoICJFWFRSQV9QWVRIT05QQVRIIiApOworICAgIGNvbnN0YW50X01BSU5fUFlUSE9OICAgICAgICAgICAgICA9IG9iamVjdF9uZXcoICJNQUlOX1BZVEhPTiIgKTsKK30KKwordm9pZCBjb25zdGFudHNfZG9uZSggdm9pZCApCit7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X2VtcHR5ICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X2RvdCApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9wbHVzICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X3N0YXIgKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfcXVlc3Rpb25fbWFyayApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9vayApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF90cnVlICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X25hbWUgKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfYmFzZXMgKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfY2xhc3MgKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfdHlwZWNoZWNrICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X2J1aWx0aW4gKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfSENBQ0hFRklMRSApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9IQ0FDSEVNQVhBR0UgKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfSERSU0NBTiApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9IRFJSVUxFICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X0JJTkRSVUxFICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X0xPQ0FURSApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9TRUFSQ0ggKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfSkFNX1NFTUFQSE9SRSApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9USU1JTkdfUlVMRSApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9BQ1RJT05fUlVMRSApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9KQU1TSEVMTCApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9UTVBESVIgKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfVE1QTkFNRSApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9UTVBGSUxFICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X1NURE9VVCApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9TVERFUlIgKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfSkFNREFURSApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9KQU1fVElNRVNUQU1QX1JFU09MVVRJT04gKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfSkFNX1ZFUlNJT04gKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfSkFNVU5BTUUgKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfRU5WSVJPTiApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9BUkdWICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X2FsbCApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9QQVJBTExFTElTTSApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9LRUVQX0dPSU5HICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X290aGVyICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X3RvdGFsICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X0ZJTEVfRElSU0NBTiApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9NQUlOICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X01BSU5fTUFLRSApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9NQUtFX01BS0UwICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X01BS0VfTUFLRTEgKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfTUFLRV9NQUtFMFNPUlQgKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfQklORE1PRFVMRSApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9JTVBPUlRfTU9EVUxFICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X0JVSUxUSU5fR0xPQl9CQUNLICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X3RpbWVzdGFtcCApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9weXRob24gKTsKKyAgICBvYmplY3RfZnJlZSggY29uc3RhbnRfcHl0aG9uX2ludGVyZmFjZSApOworICAgIG9iamVjdF9mcmVlKCBjb25zdGFudF9leHRyYV9weXRob25wYXRoICk7CisgICAgb2JqZWN0X2ZyZWUoIGNvbnN0YW50X01BSU5fUFlUSE9OICk7Cit9CisKK09CSkVDVCAqIGNvbnN0YW50X2VtcHR5OworT0JKRUNUICogY29uc3RhbnRfZG90OworT0JKRUNUICogY29uc3RhbnRfcGx1czsKK09CSkVDVCAqIGNvbnN0YW50X3N0YXI7CitPQkpFQ1QgKiBjb25zdGFudF9xdWVzdGlvbl9tYXJrOworT0JKRUNUICogY29uc3RhbnRfb2s7CitPQkpFQ1QgKiBjb25zdGFudF90cnVlOworT0JKRUNUICogY29uc3RhbnRfbmFtZTsKK09CSkVDVCAqIGNvbnN0YW50X2Jhc2VzOworT0JKRUNUICogY29uc3RhbnRfY2xhc3M7CitPQkpFQ1QgKiBjb25zdGFudF90eXBlY2hlY2s7CitPQkpFQ1QgKiBjb25zdGFudF9idWlsdGluOworT0JKRUNUICogY29uc3RhbnRfSENBQ0hFRklMRTsKK09CSkVDVCAqIGNvbnN0YW50X0hDQUNIRU1BWEFHRTsKK09CSkVDVCAqIGNvbnN0YW50X0hEUlNDQU47CitPQkpFQ1QgKiBjb25zdGFudF9IRFJSVUxFOworT0JKRUNUICogY29uc3RhbnRfQklORFJVTEU7CitPQkpFQ1QgKiBjb25zdGFudF9MT0NBVEU7CitPQkpFQ1QgKiBjb25zdGFudF9TRUFSQ0g7CitPQkpFQ1QgKiBjb25zdGFudF9KQU1fU0VNQVBIT1JFOworT0JKRUNUICogY29uc3RhbnRfVElNSU5HX1JVTEU7CitPQkpFQ1QgKiBjb25zdGFudF9BQ1RJT05fUlVMRTsKK09CSkVDVCAqIGNvbnN0YW50X0pBTVNIRUxMOworT0JKRUNUICogY29uc3RhbnRfVE1QRElSOworT0JKRUNUICogY29uc3RhbnRfVE1QTkFNRTsKK09CSkVDVCAqIGNvbnN0YW50X1RNUEZJTEU7CitPQkpFQ1QgKiBjb25zdGFudF9TVERPVVQ7CitPQkpFQ1QgKiBjb25zdGFudF9TVERFUlI7CitPQkpFQ1QgKiBjb25zdGFudF9KQU1EQVRFOworT0JKRUNUICogY29uc3RhbnRfSkFNX1ZFUlNJT047CitPQkpFQ1QgKiBjb25zdGFudF9KQU1VTkFNRTsKK09CSkVDVCAqIGNvbnN0YW50X0VOVklST047CitPQkpFQ1QgKiBjb25zdGFudF9BUkdWOworT0JKRUNUICogY29uc3RhbnRfYWxsOworT0JKRUNUICogY29uc3RhbnRfUEFSQUxMRUxJU007CitPQkpFQ1QgKiBjb25zdGFudF9LRUVQX0dPSU5HOworT0JKRUNUICogY29uc3RhbnRfb3RoZXI7CitPQkpFQ1QgKiBjb25zdGFudF90b3RhbDsKK09CSkVDVCAqIGNvbnN0YW50X0ZJTEVfRElSU0NBTjsKK09CSkVDVCAqIGNvbnN0YW50X01BSU47CitPQkpFQ1QgKiBjb25zdGFudF9NQUlOX01BS0U7CitPQkpFQ1QgKiBjb25zdGFudF9NQUtFX01BS0UwOworT0JKRUNUICogY29uc3RhbnRfTUFLRV9NQUtFMTsKK09CSkVDVCAqIGNvbnN0YW50X01BS0VfTUFLRTBTT1JUOworT0JKRUNUICogY29uc3RhbnRfQklORE1PRFVMRTsKK09CSkVDVCAqIGNvbnN0YW50X0lNUE9SVF9NT0RVTEU7CitPQkpFQ1QgKiBjb25zdGFudF9CVUlMVElOX0dMT0JfQkFDSzsKK09CSkVDVCAqIGNvbnN0YW50X3RpbWVzdGFtcDsKK09CSkVDVCAqIGNvbnN0YW50X0pBTV9USU1FU1RBTVBfUkVTT0xVVElPTjsKK09CSkVDVCAqIGNvbnN0YW50X3B5dGhvbjsKK09CSkVDVCAqIGNvbnN0YW50X3B5dGhvbl9pbnRlcmZhY2U7CitPQkpFQ1QgKiBjb25zdGFudF9leHRyYV9weXRob25wYXRoOworT0JKRUNUICogY29uc3RhbnRfTUFJTl9QWVRIT047CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jb25zdGFudHMuaCBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2NvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZDcwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9jb25zdGFudHMuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgU3RldmVuIFdhdGFuYWJlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyoKKyAqIGNvbnN0YW50cy5oIC0gY29uc3RhbnQgb2JqZWN0cworICovCisKKyNpZm5kZWYgQk9PU1RfSkFNX0NPTlNUQU5UU19ICisjZGVmaW5lIEJPT1NUX0pBTV9DT05TVEFOVFNfSAorCisjaW5jbHVkZSAib2JqZWN0LmgiCisKK3ZvaWQgY29uc3RhbnRzX2luaXQoIHZvaWQgKTsKK3ZvaWQgY29uc3RhbnRzX2RvbmUoIHZvaWQgKTsKKworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X2VtcHR5OyAgICAgICAgICAgICAgICAgICAgIC8qICIiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfZG90OyAgICAgICAgICAgICAgICAgICAgICAgLyogIi4iICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfcGx1czsgICAgICAgICAgICAgICAgICAgICAgLyogIisiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfc3RhcjsgICAgICAgICAgICAgICAgICAgICAgLyogIioiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfcXVlc3Rpb25fbWFyazsgICAgICAgICAgICAgLyogIj8iICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfb2s7ICAgICAgICAgICAgICAgICAgICAgICAgLyogIm9rIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X3RydWU7ICAgICAgICAgICAgICAgICAgICAgIC8qICJ0cnVlIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X25hbWU7ICAgICAgICAgICAgICAgICAgICAgIC8qICJfX25hbWVfXyIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9iYXNlczsgICAgICAgICAgICAgICAgICAgICAvKiAiX19iYXNlc19fIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X2NsYXNzOyAgICAgICAgICAgICAgICAgICAgIC8qICJfX2NsYXNzX18iICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfdHlwZWNoZWNrOyAgICAgICAgICAgICAgICAgLyogIi50eXBlY2hlY2siICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfYnVpbHRpbjsgICAgICAgICAgICAgICAgICAgLyogIihidWlsdGluKSIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9IQ0FDSEVGSUxFOyAgICAgICAgICAgICAgICAvKiAiSENBQ0hFRklMRSIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9IQ0FDSEVNQVhBR0U7ICAgICAgICAgICAgICAvKiAiSENBQ0hFTUFYQUdFIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X0hEUlNDQU47ICAgICAgICAgICAgICAgICAgIC8qICJIRFJTQ0FOIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X0hEUlJVTEU7ICAgICAgICAgICAgICAgICAgIC8qICJIRFJSVUxFIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X0JJTkRSVUxFOyAgICAgICAgICAgICAgICAgIC8qICJCSU5EUlVMRSIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9MT0NBVEU7ICAgICAgICAgICAgICAgICAgICAvKiAiTE9DQVRFIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X1NFQVJDSDsgICAgICAgICAgICAgICAgICAgIC8qICJTRUFSQ0giICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfSkFNX1NFTUFQSE9SRTsgICAgICAgICAgICAgLyogIkpBTV9TRU1BUEhPUkUiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfVElNSU5HX1JVTEU7ICAgICAgICAgICAgICAgLyogIl9fVElNSU5HX1JVTEVfXyIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9BQ1RJT05fUlVMRTsgICAgICAgICAgICAgICAvKiAiX19BQ1RJT05fUlVMRV9fIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X0pBTVNIRUxMOyAgICAgICAgICAgICAgICAgIC8qICJKQU1TSEVMTCIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9UTVBESVI7ICAgICAgICAgICAgICAgICAgICAvKiAiVE1QRElSIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X1RNUE5BTUU7ICAgICAgICAgICAgICAgICAgIC8qICJUTVBOQU1FIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X1RNUEZJTEU7ICAgICAgICAgICAgICAgICAgIC8qICJUTVBGSUxFIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X1NURE9VVDsgICAgICAgICAgICAgICAgICAgIC8qICJTVERPVVQiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfU1RERVJSOyAgICAgICAgICAgICAgICAgICAgLyogIlNUREVSUiIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9KQU1EQVRFOyAgICAgICAgICAgICAgICAgICAvKiAiSkFNREFURSIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9KQU1fVElNRVNUQU1QX1JFU09MVVRJT047ICAvKiAiSkFNX1RJTUVTVEFNUF9SRVNPTFVUSU9OIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X0pBTV9WRVJTSU9OOyAgICAgICAgICAgICAgIC8qICJKQU1fVkVSU0lPTiIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9KQU1VTkFNRTsgICAgICAgICAgICAgICAgICAvKiAiSkFNVU5BTUUiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfRU5WSVJPTjsgICAgICAgICAgICAgICAgICAgLyogIi5FTlZJUk9OIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X0FSR1Y7ICAgICAgICAgICAgICAgICAgICAgIC8qICJBUkdWIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X2FsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qICJhbGwiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfUEFSQUxMRUxJU007ICAgICAgICAgICAgICAgLyogIlBBUkFMTEVMSVNNIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X0tFRVBfR09JTkc7ICAgICAgICAgICAgICAgIC8qICJLRUVQX0dPSU5HIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X290aGVyOyAgICAgICAgICAgICAgICAgICAgIC8qICJbT1RIRVJdIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X3RvdGFsOyAgICAgICAgICAgICAgICAgICAgIC8qICJbVE9UQUxdIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X0ZJTEVfRElSU0NBTjsgICAgICAgICAgICAgIC8qICJGSUxFX0RJUlNDQU4iICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfTUFJTjsgICAgICAgICAgICAgICAgICAgICAgLyogIk1BSU4iICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfTUFJTl9NQUtFOyAgICAgICAgICAgICAgICAgLyogIk1BSU5fTUFLRSIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9NQUtFX01BS0UwOyAgICAgICAgICAgICAgICAvKiAiTUFLRV9NQUtFMCIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9NQUtFX01BS0UxOyAgICAgICAgICAgICAgICAvKiAiTUFLRV9NQUtFMSIgKi8KK2V4dGVybiBPQkpFQ1QgKiBjb25zdGFudF9NQUtFX01BS0UwU09SVDsgICAgICAgICAgICAvKiAiTUFLRV9NQUtFMFNPUlQiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfQklORE1PRFVMRTsgICAgICAgICAgICAgICAgLyogIkJJTkRNT0RVTEUiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfSU1QT1JUX01PRFVMRTsgICAgICAgICAgICAgLyogIklNUE9SVF9NT0RVTEUiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfQlVJTFRJTl9HTE9CX0JBQ0s7ICAgICAgICAgLyogIkJVSUxUSU5fR0xPQl9CQUNLIiAqLworZXh0ZXJuIE9CSkVDVCAqIGNvbnN0YW50X3RpbWVzdGFtcDsgICAgICAgICAgICAgICAgIC8qICJ0aW1lc3RhbXAiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfcHl0aG9uOyAgICAgICAgICAgICAgICAgICAgLyogIl9fcHl0aG9uX18iICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfcHl0aG9uX2ludGVyZmFjZTsgICAgICAgICAgLyogInB5dGhvbl9pbnRlcmZhY2UiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfZXh0cmFfcHl0aG9ucGF0aDsgICAgICAgICAgLyogIkVYVFJBX1BZVEhPTlBBVEgiICovCitleHRlcm4gT0JKRUNUICogY29uc3RhbnRfTUFJTl9QWVRIT047ICAgICAgICAgICAgICAgLyogIk1BSU5fUFlUSE9OIiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2N3ZC5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvY3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViZTk3MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2N3ZC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi4gVmxhZGltaXIgUHJ1cworICogQ29weXJpZ2h0IDIwMDUuIFJlbmUgUml2ZXJhCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgKiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworI2luY2x1ZGUgImN3ZC5oIgorCisjaW5jbHVkZSAiamFtLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAicGF0aHN5cy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworLyogTWluR1cgb24gV2luZG93cyBkZWNsYXJlcyBQQVRIX01BWCBpbiBsaW1pdHMuaCAqLworI2lmIGRlZmluZWQoIE5UICkgJiYgIWRlZmluZWQoIF9fR05VQ19fICkKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGRlZmluZSBQQVRIX01BWCBfTUFYX1BBVEgKKyNlbHNlCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpZiBkZWZpbmVkKCBfX0NPTU9fXyApCisjICBpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFBBVEhfTUFYCisjIGRlZmluZSBQQVRIX01BWCAxMDI0CisjZW5kaWYKKworCitzdGF0aWMgT0JKRUNUICogY3dkXzsKKworCit2b2lkIGN3ZF9pbml0KCB2b2lkICkKK3sKKyAgICBpbnQgYnVmZmVyX3NpemUgPSBQQVRIX01BWDsKKyAgICBjaGFyICogY3dkX2J1ZmZlciA9IDA7CisgICAgaW50IGVycm9yOworCisgICAgYXNzZXJ0KCAhY3dkXyApOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGNoYXIgKiBjb25zdCBidWZmZXIgPSBCSkFNX01BTExPQ19SQVcoIGJ1ZmZlcl9zaXplICk7CisgICAgICAgIGN3ZF9idWZmZXIgPSBnZXRjd2QoIGJ1ZmZlciwgYnVmZmVyX3NpemUgKTsKKyAgICAgICAgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgaWYgKCBjd2RfYnVmZmVyICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2Ugc3RvcmUgdGhlIHBhdGggdXNpbmcgaXRzIGNhbm9uaWNhbC9sb25nL2tleSBmb3JtYXQuICovCisgICAgICAgICAgICBPQkpFQ1QgKiBjb25zdCBjd2QgPSBvYmplY3RfbmV3KCBjd2RfYnVmZmVyICk7CisgICAgICAgICAgICBjd2RfID0gcGF0aF9hc19rZXkoIGN3ZCApOworICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIGN3ZCApOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlcl9zaXplICo9IDI7CisgICAgICAgIEJKQU1fRlJFRV9SQVcoIGJ1ZmZlciApOworICAgIH0KKyAgICB3aGlsZSAoICFjd2RfICYmIGVycm9yID09IEVSQU5HRSApOworCisgICAgaWYgKCAhY3dkXyApCisgICAgeworICAgICAgICBwZXJyb3IoICJjYW4gbm90IGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IiApOworICAgICAgICBleGl0KCBFWElUQkFEICk7CisgICAgfQorfQorCisKK09CSkVDVCAqIGN3ZCggdm9pZCApCit7CisgICAgYXNzZXJ0KCBjd2RfICk7CisgICAgcmV0dXJuIGN3ZF87Cit9CisKKwordm9pZCBjd2RfZG9uZSggdm9pZCApCit7CisgICAgYXNzZXJ0KCBjd2RfICk7CisgICAgb2JqZWN0X2ZyZWUoIGN3ZF8gKTsKKyAgICBjd2RfID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2N3ZC5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvY3dkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2NzE0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2N3ZC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi4gVmxhZGltaXIgUHJ1cworICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKy8qCisgKiBjd2QuaCAtIG1hbmFnZXMgdGhlIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgaW5mb3JtYXRpb24KKyAqLworCisjaWZuZGVmIENXRF9ICisjZGVmaW5lIENXRF9ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworCisvKiBjd2QoKSAtIHJldHVybnMgdGhlIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgKi8KK09CSkVDVCAqIGN3ZCggdm9pZCApOworCisvKiBjd2RfaW5pdCgpIC0gaW5pdGlhbGl6ZSB0aGUgY3dkIG1vZHVsZSBmdW5jdGlvbmFsaXR5CisgKgorICogICBUaGUgY3VycmVudCB3b3JraW5nIGZvbGRlciBjYW4gbm90IGNoYW5nZSBpbiBCb29zdCBKYW0gc28gdGhpcyBmdW5jdGlvbgorICogZ2V0cyB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBPUyBhbmQgc3RvcmVzIGl0CisgKiBpbnRlcm5hbGx5LgorICoKKyAqICAgRXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0IHByb2dyYW0gc3RhcnR1cCBiZWZvcmUgdGhlIHByb2dyYW0ncyBjdXJyZW50CisgKiB3b3JraW5nIGZvbGRlciBoYXMgYmVlbiBjaGFuZ2VkCisgKi8KK3ZvaWQgY3dkX2luaXQoIHZvaWQgKTsKKworLyogY3dkX2RvbmUoKSAtIGNsZWFucyB1cCB0aGUgY3dkIG1vZHVsZSBmdW5jdGlvbmFsaXR5ICovCit2b2lkIGN3ZF9kb25lKCB2b2lkICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZGViaWFuL2NoYW5nZWxvZyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2RlYmlhbi9jaGFuZ2Vsb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwODQyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2RlYmlhbi9jaGFuZ2Vsb2cKQEAgLTAsMCArMSw3MiBAQAorYmphbSAoMy4xLjEyLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIHJlbGVhc2UuCisKKyAtLSBSZW5lIFJpdmVyYSA8Z3JhZmlrQHJlZHNoaWZ0LXNvZnR3YXJlLmNvbT4gIFNhdCwgMDEgT2N0IDIwMDUgMDA6MDA6MDAgKzAwMDAKKworYmphbSAoMy4xLjExLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIHJlbGVhc2UuCisKKyAtLSBSZW5lIFJpdmVyYSA8Z3JhZmlrQHJlZHNoaWZ0LXNvZnR3YXJlLmNvbT4gIFNhdCwgMzAgQXByIDIwMDUgMDA6MDA6MDAgKzAwMDAKKworYmphbSAoMy4xLjEwLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIHJlbGVhc2UuCisKKyAtLSBSZW5lIFJpdmVyYSA8Z3JhZmlrQHJlZHNoaWZ0LXNvZnR3YXJlLmNvbT4gIFR1ZSwgMSBKdW4gMjAwNCAwNTo0MjozNSArMDAwMAorCitiamFtICgzLjEuOS0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIFVzZSBkZWZhdWx0IHZhbHVlIG9mIEJPT1NUX0JVSUxEX1BBVEggaXMgbm90IGlzIHNldCBpbiBlbnZpcm9ubWVudC4KKworIC0tIFZsYWRpbWlyIFBydXMgPGdob3N0QHppZ3phZy5sdmsuY3MubXN1LnN1PiAgV2VkLCAxNyBEZWMgMjAwMyAxNjo0NDozNSArMDMwMAorCitiamFtICgzLjEuOS0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIEltcGxlbWVudCBOQVRJVkVfRklMRSBidWlsdGluIGFuZCBzZXZlcmFsIG5hdGl2ZSBydWxlcy4KKworIC0tIFZsYWRpbWlyIFBydXMgPGdob3N0QHppZ3phZy5sdmsuY3MubXN1LnN1PiAgVGh1LCAxMSBEZWMgMjAwMyAxMzoxNToyNiArMDMwMAorCitiamFtICgzLjEuOC0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIE5ldyB1cHN0cmVhbSByZWxlYXNlLgorCisgLS0gVmxhZGltaXIgUHJ1cyA8Z2hvc3RAemlnemFnLmx2ay5jcy5tc3Uuc3U+ICBUdWUsICA0IE5vdiAyMDAzIDIwOjUwOjQzICswMzAwCisKK2JqYW0gKDMuMS43LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIHJlbGVhc2UuCisKKyAtLSBWbGFkaW1pciBQcnVzIDxnaG9zdEB6aWd6YWcubHZrLmNzLm1zdS5zdT4gIFRodSwgMTEgU2VwIDIwMDMgMTA6NDU6NDQgKzA0MDAKKworYmphbSAoMy4xLjYtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZS4KKworIC0tIFZsYWRpbWlyIFBydXMgPGdob3N0QHppZ3phZy5sdmsuY3MubXN1LnN1PiAgVHVlLCAgMSBKdWwgMjAwMyAwOToxMjoxOCArMDQwMAorCitiamFtICgzLjEuNS0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIE5ldyB1cHN0cmVhbSByZWxlYXNlLgorCisgLS0gVmxhZGltaXIgUHJ1cyA8Z2hvc3RAemlnemFnLmx2ay5jcy5tc3Uuc3U+ICBNb24sIDE5IE1heSAyMDAzIDE0OjA1OjEzICswNDAwCisKK2JqYW0gKDMuMS4zLTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogQ2hhbmdlZCBEZWJpYW4gcGFja2FnZSB0byBiZSBzaW1pbGFyIHRvIEphbSdzIHBhY2thZ2UuCisKKyAtLSBWbGFkaW1pciBQcnVzIDxnaG9zdEBjcy5tc3Uuc3U+ICBUaHUsIDEwIE9jdCAyMDAyIDE4OjQzOjI2ICswNDAwCisKK2JqYW0gKDMuMS4zLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIHJlbGVhc2UuCisKKyAtLSBWbGFkaW1pciBQcnVzIDxnaG9zdEB6aWd6YWcubHZrLmNzLm1zdS5zdT4gIEZyaSwgIDQgT2N0IDIwMDIgMTg6MTY6NTQgKzA0MDAKKworYmphbSAoMy4xLjItMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBJbml0aWFsIFJlbGVhc2UuCisKKyAtLSBWbGFkaW1pciBQcnVzIDxnaG9zdEBjcy5tc3Uuc3U+ICBXZWQsIDE0IEF1ZyAyMDAyIDE0OjA4OjAwICswNDAwCisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2RlYmlhbi9jb250cm9sIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZGViaWFuL2NvbnRyb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmMTUxOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2RlYmlhbi9jb250cm9sCkBAIC0wLDAgKzEsMTYgQEAKK1NvdXJjZTogYmphbQorU2VjdGlvbjogZGV2ZWwKK1ByaW9yaXR5OiBvcHRpb25hbAorTWFpbnRhaW5lcjogVmxhZGltaXIgUHJ1cyA8Z2hvc3RAY3MubXN1LnN1PgorQnVpbGQtRGVwZW5kczogZGViaGVscGVyICg+PiAzLjAuMCksIGRvY2Jvb2stdG8tbWFuLCBiaXNvbgorU3RhbmRhcmRzLVZlcnNpb246IDMuNS4yCisKK1BhY2thZ2U6IGJqYW0KK0FyY2hpdGVjdHVyZTogYW55CitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfQorRGVzY3JpcHRpb246IEJ1aWxkIHRvb2wgCisgQm9vc3QuSmFtIGlzIGEgcG9ydGFibGUgYnVpbGQgdG9vbCB3aXRoIGl0cyBvd24gaW50ZXJwcmV0ZWQgbGFuZ3VhZ2UsIHdoaWNoIAorIGFsbG93cyB0byBpbXBsZW1lbnQgcmF0aGVyIGNvbXBsZXggbG9naWMgaW4gYSByZWFkYWJsZSB3YXkgYW5kIHdpdGhvdXQgCisgcmVzb3J0aW5nIHRvIGV4dGVybmFsIHByb2dyYW1zLiBJdCBpcyBhIGRlc2NlbmRhbnQgb2YgSmFtL01SIHRvb2wgbW9kaWZpZWQgdG8gCisgc3VpdCB0aGUgbmVlZHMgb2YgQm9vc3QuQnVpbGQuIEluIHBhcnRpY3VsYXIsIG1vZHVsZXMgYW5kIHJ1bGUgcGFyYW1ldGVycworIHdlcmUgYWRkZWQsIGFzIHdlbGwgYXMgc2V2ZXJhbCBuZXcgYnVpbHRpbnMuCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9kZWJpYW4vY29weXJpZ2h0IGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZGViaWFuL2NvcHlyaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzJlNGUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZGViaWFuL2NvcHlyaWdodApAQCAtMCwwICsxLDI1IEBACitUaGlzIHBhY2thZ2Ugd2FzIGRlYmlhbml6ZWQgYnkgVmxhZGltaXIgUHJ1cyA8Z2hvc3RAY3MubXN1LnN1PiBvbgorV2VkLCAxNyBKdWx5IDIwMDIsIDE5OjI3OjAwICswNDAwLgorCitDb3B5cmlnaHQ6CisKKyAgICAvK1wKKyAgICArXAlDb3B5cmlnaHQgMTk5My0yMDAyIENocmlzdG9waGVyIFNlaXdhbGQgYW5kIFBlcmZvcmNlIFNvZnR3YXJlLCBJbmMuCisgICAgXCsvCisKKyAgICBUaGlzIGlzIFJlbGVhc2UgMi40IG9mIEphbS9NUiwgYSBtYWtlLWxpa2UgcHJvZ3JhbS4KKworICAgIExpY2Vuc2UgaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIHRoaXMgc29mdHdhcmUgYW5kIGRpc3RyaWJ1dGUgaXQKKyAgICBmcmVlbHksIGFzIGxvbmcgYXMgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGFuZCBtb2RpZmljYXRpb25zIAorICAgIGFyZSBjbGVhcmx5IG1hcmtlZC4KKworICAgIEFMTCBXQVJSQU5USUVTIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4KKworU29tZSBwb3J0aW9ucyBhcmUgYWxzbzoKKworICAgIENvcHlyaWdodCAyMDAxLTIwMDYgRGF2aWQgQWJyYWhhbXMuCisgICAgQ29weXJpZ2h0IDIwMDItMjAwNiBSZW5lIFJpdmVyYS4KKyAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFZsYWRpbWlyIFBydXMuCisgICAgCisgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2RlYmlhbi9qYW0ubWFuLnNnbWwgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9kZWJpYW4vamFtLm1hbi5zZ21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjFkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9kZWJpYW4vamFtLm1hbi5zZ21sCkBAIC0wLDAgKzEsMjM2IEBACis8IWRvY3R5cGUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgVjQuMS8vRU4iIFsKKworPCEtLSBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGRvY2Jvb2stdG8tbWFuIHRvIGdlbmVyYXRlIGFuIG5yb2ZmIG1hbnVhbAorICAgICBwYWdlOiBgZG9jYm9vay10by1tYW4gbWFucGFnZS5zZ21sID4gbWFucGFnZS4xJy4gIFlvdSBtYXkgdmlldworICAgICB0aGUgbWFudWFsIHBhZ2Ugd2l0aDogYGRvY2Jvb2stdG8tbWFuIG1hbnBhZ2Uuc2dtbCB8IG5yb2ZmIC1tYW4gfAorICAgICBsZXNzJy4gIEEgdHlwaWNhbCBlbnRyeSBpbiBhIE1ha2VmaWxlIG9yIE1ha2VmaWxlLmFtIGlzOgorCittYW5wYWdlLjE6IG1hbnBhZ2Uuc2dtbAorCWRvY2Jvb2stdG8tbWFuICQ8ID4gJEAKKyAgLS0+CisKKyAgPCFFTlRJVFkgZGhmaXJzdG5hbWUgIjxmaXJzdG5hbWU+WWFubjwvZmlyc3RuYW1lPiI+CisgIDwhRU5USVRZIGRoc3VybmFtZSAgICI8c3VybmFtZT5EaXJzb248L3N1cm5hbWU+Ij4KKyAgPCEtLSBQbGVhc2UgYWRqdXN0IHRoZSBkYXRlIHdoZW5ldmVyIHJldmlzaW5nIHRoZSBtYW5wYWdlLiAtLT4KKyAgPCFFTlRJVFkgZGhkYXRlICAgICAgIjxkYXRlPm1haSAyMywgMjAwMTwvZGF0ZT4iPgorICA8IUVOVElUWSBkaGVtYWlsICAgICAiPGVtYWlsPmRpcnNvbkBkZWJpYW4ub3JnPC9lbWFpbD4iPgorICA8IUVOVElUWSBkaHVzZXJuYW1lICAiWWFubiBEaXJzb24iPgorICA8IUVOVElUWSBkaHBhY2thZ2UgICAiamFtIj4KKworICA8IUVOVElUWSBkZWJpYW4gICAgICAiPHByb2R1Y3RuYW1lPkRlYmlhbiBHTlUvTGludXg8L3Byb2R1Y3RuYW1lPiI+CisgIDwhRU5USVRZIGdudSAgICAgICAgICI8YWNyb255bT5HTlU8L2Fjcm9ueW0+Ij4KK10+CisKKzxyZWZlbnRyeT4KKyAgPHJlZmVudHJ5aW5mbz4KKyAgICA8YWRkcmVzcz4KKyAgICAgICZkaGVtYWlsOworICAgIDwvYWRkcmVzcz4KKyAgICA8YXV0aG9yPgorICAgICAgJmRoZmlyc3RuYW1lOworICAgICAgJmRoc3VybmFtZTsKKyAgICA8L2F1dGhvcj4KKyAgICA8Y29weXJpZ2h0PgorICAgICAgPHllYXI+MjAwMTwveWVhcj4KKyAgICAgIDxob2xkZXI+JmRodXNlcm5hbWU7PC9ob2xkZXI+CisgICAgPC9jb3B5cmlnaHQ+CisgICAgJmRoZGF0ZTsKKyAgPC9yZWZlbnRyeWluZm8+CisKKyAgPHJlZm1ldGE+CisgICAgPHJlZmVudHJ5dGl0bGU+SkFNPC9yZWZlbnRyeXRpdGxlPgorICAgIDxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorICA8L3JlZm1ldGE+CisKKyAgPHJlZm5hbWVkaXY+CisgICAgPHJlZm5hbWU+SmFtL01SPC9yZWZuYW1lPgorICAgIDxyZWZwdXJwb3NlPk1ha2UoMSkgUmVkdXg8L3JlZnB1cnBvc2U+CisgIDwvcmVmbmFtZWRpdj4KKworICA8cmVmc3lub3BzaXNkaXY+CisgICAgPGNtZHN5bm9wc2lzPgorICAgICAgPGNvbW1hbmQ+amFtPC9jb21tYW5kPgorCisgICAgICA8YXJnPjxvcHRpb24+LWE8L29wdGlvbj48L2FyZz4KKyAgICAgIDxhcmc+PG9wdGlvbj4tbjwvb3B0aW9uPjwvYXJnPgorICAgICAgPGFyZz48b3B0aW9uPi12PC9vcHRpb24+PC9hcmc+CisKKyAgICAgIDxhcmc+PG9wdGlvbj4tZCA8cmVwbGFjZWFibGUvZGVidWcvPC9vcHRpb24+PC9hcmc+CisgICAgICA8YXJnPjxvcHRpb24+LWYgPHJlcGxhY2VhYmxlL2phbWJhc2UvPC9vcHRpb24+PC9hcmc+CisgICAgICA8YXJnPjxvcHRpb24+LWogPHJlcGxhY2VhYmxlL2pvYnMvPC9vcHRpb24+PC9hcmc+CisgICAgICA8YXJnPjxvcHRpb24+LW8gPHJlcGxhY2VhYmxlL2FjdGlvbnNmaWxlLzwvb3B0aW9uPjwvYXJnPgorICAgICAgPGFyZz48b3B0aW9uPi1zIDxyZXBsYWNlYWJsZS92YXIvPTxyZXBsYWNlYWJsZS92YWx1ZS88L29wdGlvbj48L2FyZz4KKyAgICAgIDxhcmc+PG9wdGlvbj4tdCA8cmVwbGFjZWFibGUvdGFyZ2V0Lzwvb3B0aW9uPjwvYXJnPgorCisgICAgICA8YXJnIHJlcGVhdD48b3B0aW9uPjxyZXBsYWNlYWJsZS90YXJnZXQvPC9vcHRpb24+PC9hcmc+CisgICAgPC9jbWRzeW5vcHNpcz4KKyAgPC9yZWZzeW5vcHNpc2Rpdj4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKworICAgIDxwYXJhPkphbSBpcyBhIHByb2dyYW0gY29uc3RydWN0aW9uIHRvb2wsIGxpa2UgbWFrZSgxKS48L3BhcmE+CisKKyAgICA8cGFyYT5KYW0gcmVjdXJzaXZlbHkgYnVpbGRzIHRhcmdldCBmaWxlcyBmcm9tIHNvdXJjZSBmaWxlcywgdXNpbmcKKyAgICBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGFuZCB1cGRhdGluZyBhY3Rpb25zIGV4cHJlc3NlZCBpbiB0aGUKKyAgICBKYW1iYXNlIGZpbGUsIHdoaWNoIGlzIHdyaXR0ZW4gaW4gamFtJ3Mgb3duIGludGVycHJldGVkIGxhbmd1YWdlLgorICAgIFRoZSBkZWZhdWx0IEphbWJhc2UgaXMgY29tcGlsZWQgaW50byBqYW0gYW5kIHByb3ZpZGVzIGEKKyAgICBib2lsZXJwbGF0ZSBmb3IgY29tbW9uIHVzZSwgcmVseWluZyBvbiBhIHVzZXItcHJvdmlkZSBmaWxlCisgICAgIkphbWZpbGUiIHRvIGVudW1lcmF0ZSBhY3R1YWwgdGFyZ2V0cyBhbmQgc291cmNlcy48L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5PUFRJT05TPC90aXRsZT4KKworICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uLy1hLzwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPkJ1aWxkIGFsbCB0YXJnZXRzIGFueXdheSwgZXZlbiBpZiB0aGV5IGFyZSB1cC10by1kYXRlLjwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi1kIDxyZXBsYWNlYWJsZS9uLzwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPkVuYWJsZSBjdW1tdWxhdGl2ZSBkZWJ1Z2dpbmcgbGV2ZWxzIGZyb20gMSB0bworCSAgICA8cmVwbGFjZWFibGUvbi8uIEludGVyZXN0aW5nIHZhbHVlcyBhcmU6CisKKwkgICAgPGdsb3NzbGlzdD4KKwkgICAgICA8Z2xvc3NlbnRyeT48Z2xvc3N0ZXJtLzEvIDxnbG9zc2RlZj48c2ltcGFyYS9TaG93CisJICAgICAgYWN0aW9ucyAodGhlIGRlZmF1bHQpLzwvZ2xvc3NkZWY+PC9nbG9zc2VudHJ5PgorCisJICAgICAgPGdsb3NzZW50cnk+PGdsb3NzdGVybS8yLyA8Z2xvc3NkZWY+PHNpbXBhcmEvU2hvdworCSAgICAgICJxdWlldCIgYWN0aW9ucyBhbmQgZGlzcGxheSBhbGwgYWN0aW9uCisJICAgICAgdGV4dC88L2dsb3NzZGVmPjwvZ2xvc3NlbnRyeT4KKworCSAgICAgIDxnbG9zc2VudHJ5PjxnbG9zc3Rlcm0vMy8gPGdsb3NzZGVmPjxzaW1wYXJhPlNob3cKKwkgICAgICBkZXBlbmRlbmN5IGFuYWx5c2lzLCBhbmQgdGFyZ2V0L3NvdXJjZQorCSAgICAgIHRpbWVzdGFtcHMvcGF0aHM8L3NpbXBhcmE+PC9nbG9zc2RlZj48L2dsb3NzZW50cnk+CisKKwkgICAgICA8Z2xvc3NlbnRyeT48Z2xvc3N0ZXJtLzQvIDxnbG9zc2RlZj48c2ltcGFyYS9TaG93IHNoZWxsCisJICAgICAgYXJndW1lbnRzLzwvZ2xvc3NkZWY+PC9nbG9zc2VudHJ5PgorCisJICAgICAgPGdsb3NzZW50cnk+PGdsb3NzdGVybS81LyA8Z2xvc3NkZWY+PHNpbXBhcmEvU2hvdyBydWxlCisJICAgICAgaW52b2NhdGlvbnMgYW5kIHZhcmlhYmxlCisJICAgICAgZXhwYW5zaW9ucy88L2dsb3NzZGVmPjwvZ2xvc3NlbnRyeT4KKworCSAgICAgIDxnbG9zc2VudHJ5PjxnbG9zc3Rlcm0vNi8gPGdsb3NzZGVmPjxzaW1wYXJhPlNob3cKKwkgICAgICBkaXJlY3RvcnkvaGVhZGVyIGZpbGUvYXJjaGl2ZQorCSAgICAgIHNjYW5zPC9zaW1wYXJhPjwvZ2xvc3NkZWY+PC9nbG9zc2VudHJ5PgorCisJICAgICAgPGdsb3NzZW50cnk+PGdsb3NzdGVybS83LyA8Z2xvc3NkZWY+PHNpbXBhcmEvU2hvdworCSAgICAgIHZhcmlhYmxlIHNldHRpbmdzLzwvZ2xvc3NkZWY+PC9nbG9zc2VudHJ5PgorCisJICAgICAgPGdsb3NzZW50cnk+PGdsb3NzdGVybS84LyA8Z2xvc3NkZWY+PHNpbXBhcmEvU2hvdworCSAgICAgIHZhcmlhYmxlIGZldGNoZXMvPC9nbG9zc2RlZj48L2dsb3NzZW50cnk+CisKKwkgICAgICA8Z2xvc3NlbnRyeT48Z2xvc3N0ZXJtLzkvIDxnbG9zc2RlZj48c2ltcGFyYS9TaG93CisJICAgICAgdmFyaWFibGUgbWFuaXB1bGF0aW9uLCBzY2FubmVyCisJICAgICAgdG9rZW5zLzwvZ2xvc3NkZWY+PC9nbG9zc2VudHJ5PgorCSAgICA8L2dsb3NzbGlzdD4KKwkgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi1kICs8cmVwbGFjZWFibGUvbi88L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT5FbmFibGUgZGVidWdnaW5nIGxldmVsIDxyZXBsYWNlYWJsZS9uLy48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbi8tZCAwLzwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPlR1cm4gb2ZmIGFsbCBkZWJ1Z2dpbmcgbGV2ZWxzLiBPbmx5IGVycm9ycyBhcmUgbm90CisgICAgICAgICAgc3VwcHJlc3NlZC48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tZiA8cmVwbGFjZWFibGUvamFtYmFzZS88L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT5SZWFkIDxyZXBsYWNlYWJsZS9qYW1iYXNlLyBpbnN0ZWFkIG9mIHVzaW5nIHRoZQorICAgICAgICAgIGJ1aWx0LWluIEphbWJhc2UuIE9ubHkgb25lIDxvcHRpb24vLWYvIGZsYWcgaXMgcGVybWl0dGVkLAorICAgICAgICAgIGJ1dCB0aGUgPHJlcGxhY2VhYmxlL2phbWJhc2UvIG1heSBleHBsaWNpdGx5IGluY2x1ZGUgb3RoZXIKKyAgICAgICAgICBmaWxlcy48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4taiA8cmVwbGFjZWFibGUvbi88L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT5SdW4gdXAgdG8gPHJlcGxhY2VhYmxlL24vIHNoZWxsIGNvbW1hbmRzIGNvbmN1cnJlbnRseQorICAgICAgICAgIChVTklYIGFuZCBOVCBvbmx5KS4gVGhlIGRlZmF1bHQgaXMgMS48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbi8tbi88L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT5Eb24ndCBhY3R1YWxseSBleGVjdXRlIHRoZSB1cGRhdGluZyBhY3Rpb25zLCBidXQgZG8KKyAgICAgICAgICBldmVyeXRoaW5nIGVsc2UuIFRoaXMgY2hhbmdlcyB0aGUgZGVidWcgbGV2ZWwgZGVmYXVsdCB0bworICAgICAgICAgIDxvcHRpb24vLWQyLy48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tbyA8cmVwbGFjZWFibGUvZmlsZS88L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT5Xcml0ZSB0aGUgdXBkYXRpbmcgYWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGZpbGUKKyAgICAgICAgICBpbnN0ZWFkIG9mIHJ1bm5pbmcgdGhlbSAob3Igb3V0cHV0dGluZyB0aGVtLCBhcyBvbiB0aGUKKyAgICAgICAgICBNYWMpLjwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi1zIDxyZXBsYWNlYWJsZS92YXIvPTxyZXBsYWNlYWJsZS92YWx1ZS88L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT5TZXQgdGhlIHZhcmlhYmxlIDxyZXBsYWNlYWJsZS92YXIvIHRvCisgICAgICAgICAgPHJlcGxhY2VhYmxlL3ZhbHVlLywgb3ZlcnJpZGluZyBib3RoIGludGVybmFsIHZhcmlhYmxlcyBhbmQKKyAgICAgICAgICB2YXJpYWJsZXMgaW1wb3J0ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQuIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi10IDxyZXBsYWNlYWJsZS90YXJnZXQvPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+UmVidWlsZCA8cmVwbGFjZWFibGUvdGFyZ2V0LyBhbmQgZXZlcnl0aGluZyB0aGF0CisgICAgICAgICAgZGVwZW5kcyBvbiBpdCwgZXZlbiBpZiBpdCBpcyB1cC10by1kYXRlLjwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uLy12LzwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPlByaW50IHRoZSB2ZXJzaW9uIG9mIGphbSBhbmQgZXhpdC48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgIDwvdmFyaWFibGVsaXN0PgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+U0VFIEFMU088L3RpdGxlPgorCisgICAgPHBhcmE+SmFtIGlzIGRvY3VtZW50ZWQgZnVsbHkgaW4gSFRNTCBwYWdlcyBhdmFpbGFibGUgb24gRGViaWFuCisgICAgc3lzdGVtcyBmcm9tCisgICAgPGZpbGVuYW1lPi91c3Ivc2hhcmUvZG9jL2phbS9KYW0uaHRtbDwvZmlsZW5hbWU+LjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkFVVEhPUjwvdGl0bGU+CisKKyAgICA8cGFyYT5UaGlzIG1hbnVhbCBwYWdlIHdhcyBjcmVhdGVkIGJ5ICZkaHVzZXJuYW1lOyAmZGhlbWFpbDsgZnJvbQorICAgIHRoZSA8ZmlsZW5hbWUvSmFtLmh0bWwvIGRvY3VtZW50YXRpb24sIGZvciB0aGUgJmRlYmlhbjsgc3lzdGVtCisgICAgKGJ1dCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKzwvcmVmZW50cnk+CisKKzwhLS0gS2VlcCB0aGlzIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZQorTG9jYWwgdmFyaWFibGVzOgorc2dtbC1vbWl0dGFnOnQKK3NnbWwtc2hvcnR0YWc6dAorRW5kOgorLS0+CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9kZWJpYW4vcnVsZXMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9kZWJpYW4vcnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzU2MDUyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2RlYmlhbi9ydWxlcwpAQCAtMCwwICsxLDczIEBACisjIS91c3IvYmluL21ha2UgLWYKKyMgU2FtcGxlIGRlYmlhbi9ydWxlcyB0aGF0IHVzZXMgZGViaGVscGVyLgorIyBHTlUgY29weXJpZ2h0IDE5OTcgdG8gMTk5OSBieSBKb2V5IEhlc3MuCisjIEdOVSBjb3B5cmlnaHQgMjAwMSBieSBZYW5uIERpcnNvbi4KKworIyBUaGlzIGlzIHRoZSBkZWJpYW4vcnVsZXMgZmlsZSBmb3IgcGFja2FnZXMgamFtIGFuZCBmdGphbQorIyBJdCBzaG91bGQgYmUgdXNhYmxlIHdpdGggYm90aCBwYWNrYWdlcyB3aXRob3V0IGFueSBjaGFuZ2UKKworIyBVbmNvbW1lbnQgdGhpcyB0byB0dXJuIG9uIHZlcmJvc2UgbW9kZS4KKyNleHBvcnQgREhfVkVSQk9TRT0xCisKKyMgVGhpcyBpcyB0aGUgZGViaGVscGVyIGNvbXBhdGFiaWxpdHkgdmVyc2lvbiB0byB1c2UuCitleHBvcnQgREhfQ09NUEFUPTMKKwordG9wZGlyPSQoc2hlbGwgcHdkKQorCitqYW09YmphbQorYmlubmFtZT1iamFtCisKK2J1aWxkOiBidWlsZC1zdGFtcAorYnVpbGQtc3RhbXA6IGRlYmlhbi9qYW0uMQorCWRoX3Rlc3RkaXIKKworCS4vYnVpbGQuc2gKKworCXRvdWNoIGJ1aWxkLXN0YW1wCisKKyUuMTogJS5tYW4uc2dtbAorCS91c3IvYmluL2RvY2Jvb2stdG8tbWFuICQ8ID4gJEAKKworY2xlYW46CisJZGhfdGVzdGRpcgorCWRoX3Rlc3Ryb290CisJcm0gLWYgYnVpbGQtc3RhbXAKKwlybSAtcmYgYmluLioKKwlybSAtZiBqYW0wIGRlYmlhbi9qYW0uMQorCWRoX2NsZWFuCisKK2luc3RhbGw6IGJ1aWxkCisJZGhfdGVzdGRpcgorCWRoX3Rlc3Ryb290CisJZGhfY2xlYW4gLWsKKwlkaF9pbnN0YWxsZGlycworCisJaW5zdGFsbCAtZCAke3RvcGRpcn0vZGViaWFuLyR7amFtfS91c3IvYmluCisJaW5zdGFsbCAtbTc1NSBiaW4ubGludXh4ODYvYmphbSAke3RvcGRpcn0vZGViaWFuLyR7amFtfS91c3IvYmluLworCWluc3RhbGwgLWQgJHt0b3BkaXJ9L2RlYmlhbi8ke2phbX0vdXNyL3NoYXJlL21hbi9tYW4xLworCWluc3RhbGwgLW02NDQgZGViaWFuL2phbS4xICR7dG9wZGlyfS9kZWJpYW4vJHtqYW19L3Vzci9zaGFyZS9tYW4vbWFuMS8ke2Jpbm5hbWV9LjEKKworCisjIEJ1aWxkIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBoZXJlLgorYmluYXJ5LWluZGVwOiBidWlsZCBpbnN0YWxsCisjIFdlIGhhdmUgbm90aGluZyB0byBkbyBieSBkZWZhdWx0LgorCisjIEJ1aWxkIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaGVyZS4KK2JpbmFyeS1hcmNoOiBidWlsZCBpbnN0YWxsCisJZGhfdGVzdGRpcgorCWRoX3Rlc3Ryb290CisJZGhfaW5zdGFsbGRvY3MgUkVBRE1FIFJFTE5PVEVTIEphbWJhc2UgKi5odG1sCisjCWRoX2luc3RhbGxlbWFjc2VuCisjCWRoX3VuZG9jdW1lbnRlZAorCWRoX2luc3RhbGxjaGFuZ2Vsb2dzIAorCWRoX3N0cmlwCisJZGhfY29tcHJlc3MKKwlkaF9maXhwZXJtcworCWRoX2luc3RhbGxkZWIKKwlkaF9zaGxpYmRlcHMKKwlkaF9nZW5jb250cm9sCisJZGhfbWQ1c3VtcworCWRoX2J1aWxkZGViCisKK2JpbmFyeTogYmluYXJ5LWluZGVwIGJpbmFyeS1hcmNoCisuUEhPTlk6IGJ1aWxkIGNsZWFuIGJpbmFyeS1pbmRlcCBiaW5hcnktYXJjaCBiaW5hcnkgaW5zdGFsbCBjb25maWd1cmUKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2RlYnVnLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNjU2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9kZWJ1Zy5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUuIFJlbmUgUml2ZXJhCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgKiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKyNpbmNsdWRlICJoYXNoLmgiCisKKworc3RhdGljIHByb2ZpbGVfZnJhbWUgKiBwcm9maWxlX3N0YWNrID0gMDsKK3N0YXRpYyBzdHJ1Y3QgaGFzaCAgICogcHJvZmlsZV9oYXNoICA9IDA7CitzdGF0aWMgcHJvZmlsZV9pbmZvICAgIHByb2ZpbGVfb3RoZXIgPSB7IDAgfTsKK3N0YXRpYyBwcm9maWxlX2luZm8gICAgcHJvZmlsZV90b3RhbCA9IHsgMCB9OworCisKK3Byb2ZpbGVfZnJhbWUgKiBwcm9maWxlX2luaXQoIE9CSkVDVCAqIHJ1bGVuYW1lLCBwcm9maWxlX2ZyYW1lICogZnJhbWUgKQoreworICAgIGlmICggREVCVUdfUFJPRklMRSApIHByb2ZpbGVfZW50ZXIoIHJ1bGVuYW1lLCBmcmFtZSApOworICAgIHJldHVybiBmcmFtZTsKK30KKworCit2b2lkIHByb2ZpbGVfZW50ZXIoIE9CSkVDVCAqIHJ1bGVuYW1lLCBwcm9maWxlX2ZyYW1lICogZnJhbWUgKQoreworICAgIGlmICggREVCVUdfUFJPRklMRSApCisgICAgeworICAgICAgICBjbG9ja190IHN0YXJ0ID0gY2xvY2soKTsKKyAgICAgICAgcHJvZmlsZV9pbmZvICogcDsKKworICAgICAgICBpZiAoICFwcm9maWxlX2hhc2ggJiYgcnVsZW5hbWUgKQorICAgICAgICAgICAgcHJvZmlsZV9oYXNoID0gaGFzaGluaXQoIHNpemVvZiggcHJvZmlsZV9pbmZvICksICJwcm9maWxlIiApOworCisgICAgICAgIGlmICggcnVsZW5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZm91bmQ7CisgICAgICAgICAgICBwID0gKHByb2ZpbGVfaW5mbyAqKWhhc2hfaW5zZXJ0KCBwcm9maWxlX2hhc2gsIHJ1bGVuYW1lLCAmZm91bmQgKTsKKyAgICAgICAgICAgIGlmICggIWZvdW5kICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwLT5uYW1lID0gcnVsZW5hbWU7CisgICAgICAgICAgICAgICAgcC0+Y3VtdWxhdGl2ZSA9IDA7CisgICAgICAgICAgICAgICAgcC0+bmV0ID0gMDsKKyAgICAgICAgICAgICAgICBwLT5udW1fZW50cmllcyA9IDA7CisgICAgICAgICAgICAgICAgcC0+c3RhY2tfY291bnQgPSAwOworICAgICAgICAgICAgICAgIHAtPm1lbW9yeSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgcCA9ICZwcm9maWxlX290aGVyOworICAgICAgICB9CisKKyAgICAgICAgKytwLT5udW1fZW50cmllczsKKyAgICAgICAgKytwLT5zdGFja19jb3VudDsKKworICAgICAgICBmcmFtZS0+aW5mbyA9IHA7CisKKyAgICAgICAgZnJhbWUtPmNhbGxlciA9IHByb2ZpbGVfc3RhY2s7CisgICAgICAgIHByb2ZpbGVfc3RhY2sgPSBmcmFtZTsKKworICAgICAgICBmcmFtZS0+ZW50cnlfdGltZSA9IGNsb2NrKCk7CisgICAgICAgIGZyYW1lLT5vdmVyaGVhZCA9IDA7CisgICAgICAgIGZyYW1lLT5zdWJydWxlcyA9IDA7CisKKyAgICAgICAgLyogY2FsbGVyIHBheXMgZm9yIHRoZSB0aW1lIGl0IHRha2VzIHRvIHBsYXkgd2l0aCB0aGUgaGFzaCB0YWJsZSAqLworICAgICAgICBpZiAoIGZyYW1lLT5jYWxsZXIgKQorICAgICAgICAgICAgZnJhbWUtPmNhbGxlci0+b3ZlcmhlYWQgKz0gZnJhbWUtPmVudHJ5X3RpbWUgLSBzdGFydDsKKyAgICB9Cit9CisKKwordm9pZCBwcm9maWxlX21lbW9yeSggbG9uZyBtZW0gKQoreworICAgIGlmICggREVCVUdfUFJPRklMRSApCisgICAgICAgIGlmICggcHJvZmlsZV9zdGFjayAmJiBwcm9maWxlX3N0YWNrLT5pbmZvICkKKyAgICAgICAgICAgIHByb2ZpbGVfc3RhY2stPmluZm8tPm1lbW9yeSArPSBtZW07Cit9CisKKwordm9pZCBwcm9maWxlX2V4aXQoIHByb2ZpbGVfZnJhbWUgKiBmcmFtZSApCit7CisgICAgaWYgKCBERUJVR19QUk9GSUxFICkKKyAgICB7CisgICAgICAgIC8qIEN1bXVsYXRpdmUgdGltZSBmb3IgdGhpcyBjYWxsLiAqLworICAgICAgICBjbG9ja190IGNvbnN0IHQgPSBjbG9jaygpIC0gZnJhbWUtPmVudHJ5X3RpbWUgLSBmcmFtZS0+b3ZlcmhlYWQ7CisgICAgICAgIC8qIElmIHRoaXMgcnVsZSBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHN0YWNrLCBkbyBub3QgYWRkIHRoZSB0aW1lIGZvcgorICAgICAgICAgKiB0aGlzIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCBmcmFtZS0+aW5mby0+c3RhY2tfY291bnQgPT0gMSApCisgICAgICAgICAgICBmcmFtZS0+aW5mby0+Y3VtdWxhdGl2ZSArPSB0OworICAgICAgICAvKiBOZXQgdGltZSBkb2VzIG5vdCBkZXBlbmQgb24gcHJlc2Vuc2Ugb2YgdGhlIHNhbWUgcnVsZSBpbiBjYWxsIHN0YWNrLgorICAgICAgICAgKi8KKyAgICAgICAgZnJhbWUtPmluZm8tPm5ldCArPSB0IC0gZnJhbWUtPnN1YnJ1bGVzOworCisgICAgICAgIGlmICggZnJhbWUtPmNhbGxlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGxlcidzIGN1bXVsYXRpdmUgdGltZSBtdXN0IGFjY291bnQgZm9yIHRoaXMgb3ZlcmhlYWQuICovCisgICAgICAgICAgICBmcmFtZS0+Y2FsbGVyLT5vdmVyaGVhZCArPSBmcmFtZS0+b3ZlcmhlYWQ7CisgICAgICAgICAgICBmcmFtZS0+Y2FsbGVyLT5zdWJydWxlcyArPSB0OworICAgICAgICB9CisgICAgICAgIC8qIFBvcCB0aGlzIHN0YWNrIGZyYW1lLiAqLworICAgICAgICAtLWZyYW1lLT5pbmZvLT5zdGFja19jb3VudDsKKyAgICAgICAgcHJvZmlsZV9zdGFjayA9IGZyYW1lLT5jYWxsZXI7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGR1bXBfcHJvZmlsZV9lbnRyeSggdm9pZCAqIHBfLCB2b2lkICogaWdub3JlZCApCit7CisgICAgcHJvZmlsZV9pbmZvICogcCA9IChwcm9maWxlX2luZm8gKilwXzsKKyAgICB1bnNpZ25lZCBsb25nIG1lbV9lYWNoID0gKCBwLT5tZW1vcnkgLyAoIHAtPm51bV9lbnRyaWVzID8gcC0+bnVtX2VudHJpZXMgOiAxCisgICAgICAgICkgKTsKKyAgICBkb3VibGUgY3VtdWxhdGl2ZSA9IHAtPmN1bXVsYXRpdmU7CisgICAgZG91YmxlIG5ldCA9IHAtPm5ldDsKKyAgICBkb3VibGUgcSA9IHAtPm5ldDsKKyAgICBxIC89ICggcC0+bnVtX2VudHJpZXMgPyBwLT5udW1fZW50cmllcyA6IDEgKTsKKyAgICBjdW11bGF0aXZlIC89IENMT0NLU19QRVJfU0VDOworICAgIG5ldCAvPSBDTE9DS1NfUEVSX1NFQzsKKyAgICBxIC89IENMT0NLU19QRVJfU0VDOworICAgIGlmICggIWlnbm9yZWQgKQorICAgIHsKKyAgICAgICAgcHJvZmlsZV90b3RhbC5jdW11bGF0aXZlICs9IHAtPm5ldDsKKyAgICAgICAgcHJvZmlsZV90b3RhbC5tZW1vcnkgKz0gcC0+bWVtb3J5OworICAgIH0KKyAgICBwcmludGYoICIlMTBsZCAlMTIuNmYgJTEyLjZmICUxMi44ZiAlMTBsZCAlMTBsZCAlc1xuIiwgcC0+bnVtX2VudHJpZXMsCisgICAgICAgIGN1bXVsYXRpdmUsIG5ldCwgcSwgcC0+bWVtb3J5LCBtZW1fZWFjaCwgb2JqZWN0X3N0ciggcC0+bmFtZSApICk7Cit9CisKKwordm9pZCBwcm9maWxlX2R1bXAoKQoreworICAgIGlmICggcHJvZmlsZV9oYXNoICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiUxMHMgJTEycyAlMTJzICUxMnMgJTEwcyAlMTBzICVzXG4iLCAiLS1jb3VudC0tIiwgIi0tZ3Jvc3MtLSIsCisgICAgICAgICAgICAiLS1uZXQtLSIsICItLWVhY2gtLSIsICItLW1lbS0tIiwgIi0tZWFjaC0tIiwgIi0tbmFtZS0tIiApOworICAgICAgICBoYXNoZW51bWVyYXRlKCBwcm9maWxlX2hhc2gsIGR1bXBfcHJvZmlsZV9lbnRyeSwgMCApOworICAgICAgICBwcm9maWxlX290aGVyLm5hbWUgPSBjb25zdGFudF9vdGhlcjsKKyAgICAgICAgZHVtcF9wcm9maWxlX2VudHJ5KCAmcHJvZmlsZV9vdGhlciwgMCApOworICAgICAgICBwcm9maWxlX3RvdGFsLm5hbWUgPSBjb25zdGFudF90b3RhbDsKKyAgICAgICAgZHVtcF9wcm9maWxlX2VudHJ5KCAmcHJvZmlsZV90b3RhbCwgKHZvaWQgKikxICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZGVidWcuaCBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1MWQyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2RlYnVnLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LiBSZW5lIFJpdmVyYQorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKyNpZm5kZWYgQkpBTV9ERUJVR19ICisjZGVmaW5lIEJKQU1fREVCVUdfSAorCisjaW5jbHVkZSAiY29uc3RhbnRzLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSA8dGltZS5oPgorCisKK3R5cGVkZWYgc3RydWN0IHByb2ZpbGVfaW5mbworeworICAgIC8qIG5hbWUgb2YgcnVsZSBiZWluZyBjYWxsZWQgKi8KKyAgICBPQkpFQ1QgKiBuYW1lOworICAgIC8qIGN1bXVsYXRpdmUgdGltZSBzcGVudCBpbiBydWxlICovCisgICAgY2xvY2tfdCBjdW11bGF0aXZlOworICAgIC8qIHRpbWUgc3BlbnQgaW4gcnVsZSBwcm9wZXIgKi8KKyAgICBjbG9ja190IG5ldDsKKyAgICAvKiBudW1iZXIgb2YgdGltZSBydWxlIHdhcyBlbnRlcmVkICovCisgICAgdW5zaWduZWQgbG9uZyBudW1fZW50cmllczsKKyAgICAvKiBudW1iZXIgb2YgdGhlIHRpbWVzIHRoaXMgZnVuY3Rpb24gaXMgcHJlc2VudCBpbiBzdGFjayAqLworICAgIHVuc2lnbmVkIGxvbmcgc3RhY2tfY291bnQ7CisgICAgLyogYnl0ZXMgb2YgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgY2FsbCAqLworICAgIHVuc2lnbmVkIGxvbmcgbWVtb3J5OworfSBwcm9maWxlX2luZm87CisKK3R5cGVkZWYgc3RydWN0IHByb2ZpbGVfZnJhbWUKK3sKKyAgICAvKiBwZXJtYW5lbnQgc3RvcmFnZSB3aGVyZSBkYXRhIGFjY3VtdWxhdGVzICovCisgICAgcHJvZmlsZV9pbmZvICogaW5mbzsKKyAgICAvKiBvdmVyaGVhZCBmb3IgcHJvZmlsaW5nIGluIHRoaXMgY2FsbCAqLworICAgIGNsb2NrX3Qgb3ZlcmhlYWQ7CisgICAgLyogdGltZSBvZiBsYXN0IGVudHJ5IHRvIHJ1bGUgKi8KKyAgICBjbG9ja190IGVudHJ5X3RpbWU7CisgICAgLyogc3RhY2sgZnJhbWUgb2YgY2FsbGVyICovCisgICAgc3RydWN0IHByb2ZpbGVfZnJhbWUgKiBjYWxsZXI7CisgICAgLyogdGltZSBzcGVudCBpbiBzdWJydWxlcyAqLworICAgIGNsb2NrX3Qgc3VicnVsZXM7Cit9IHByb2ZpbGVfZnJhbWU7CisKK3Byb2ZpbGVfZnJhbWUgKiBwcm9maWxlX2luaXQoIE9CSkVDVCAqIHJ1bGVuYW1lLCBwcm9maWxlX2ZyYW1lICogKTsKK3ZvaWQgcHJvZmlsZV9lbnRlciggT0JKRUNUICogcnVsZW5hbWUsIHByb2ZpbGVfZnJhbWUgKiApOwordm9pZCBwcm9maWxlX21lbW9yeSggbG9uZyBtZW0gKTsKK3ZvaWQgcHJvZmlsZV9leGl0KCBwcm9maWxlX2ZyYW1lICogKTsKK3ZvaWQgcHJvZmlsZV9kdW1wKCk7CisKKyNkZWZpbmUgUFJPRklMRV9FTlRFUiggc2NvcGUgKSBwcm9maWxlX2ZyYW1lIFBST0ZfICMjIHNjb3BlLCAqUFJPRl8gIyMgc2NvcGUgIyMgX3AgPSBwcm9maWxlX2luaXQoIGNvbnN0YW50XyAjIyBzY29wZSwgJlBST0ZfICMjIHNjb3BlICkKKyNkZWZpbmUgUFJPRklMRV9FWElUKCBzY29wZSApIHByb2ZpbGVfZXhpdCggUFJPRl8gIyMgc2NvcGUgIyMgX3AgKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2V4ZWNjbWQuYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2V4ZWNjbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzUxY2JmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZXhlY2NtZC5jCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTMsIDE5OTUgQ2hyaXN0b3BoZXIgU2Vpd2FsZC4KKyAqIENvcHlyaWdodCAyMDA3IE5vZWwgQmVsY291cnQuCisgKgorICogICBVdGlsaXR5IGZ1bmN0aW9ucyBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgZXhlYyouYyBwbGF0Zm9ybSBzcGVjaWZpYworICogaW1wbGVtZW50YXRpb24gbW9kdWxlcy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisjaW5jbHVkZSAiamFtLmgiCisjaW5jbHVkZSAiZXhlY2NtZC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCisvKiBJbnRlcm5hbCBpbnRlcnJ1cHQgY291bnRlci4gKi8KK3N0YXRpYyBpbnQgaW50cjsKKworCisvKiBDb25zdHJ1Y3RzIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgZWxlbWVudHMgdXNpbmcgdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgdGhlCisgKiBnaXZlbiBzaGVsbCBsaXN0LgorICoKKyAqIEdpdmVuIGFyZ3YgYXJyYXkgc2hvdWxkIGhhdmUgYXQgbGVhc3QgTUFYQVJHQyArIDEgZWxlbWVudHMuCisgKiBTbG90IG51bWJlcnMgbWF5IGJlIGJldHdlZW4gMCBhbmQgOTk4IChpbmNsdXNpdmUpLgorICoKKyAqIENvbnN0cnVjdGVkIGFyZ3YgbGlzdCB3aWxsIGJlIHplcm8gdGVybWluYXRlZC4gQ2hhcmFjdGVyIGFycmF5cyByZWZlcmVuY2VkIGJ5CisgKiB0aGUgYXJndiBzdHJ1Y3R1cmUgZWxlbWVudHMgd2lsbCBiZSBlaXRoZXIgZWxlbWVudHMgZnJvbSB0aGUgZ2l2ZSBzaGVsbCBsaXN0LAorICogaW50ZXJuYWwgc3RhdGljIGJ1ZmZlcnMgb3IgdGhlIGdpdmVuIGNvbW1hbmQgc3RyaW5nIGFuZCBzaG91bGQgdGh1cyBub3QKKyAqIGNvbnNpZGVyZWQgb3duZWQgYnkgb3IgcmVsZWFzZWQgdmlhIHRoZSBhcmd2IHN0cnVjdHVyZSBhbmQgc2hvdWxkIGJlCisgKiBjb25zaWRlcmVkIGludmFsaWRhdGVkIGJ5IHRoZSBuZXh0IGFyZ3ZfZnJvbV9zaGVsbCgpIGNhbGwuCisgKgorICogU2hlbGwgbGlzdCBlbGVtZW50czoKKyAqICAgLSBTdGFydGluZyB3aXRoICclJyAtIHJlcHJlc2VudCB0aGUgY29tbWFuZCBzdHJpbmcuCisgKiAgIC0gU3RhcnRpbmcgd2l0aCAnIScgLSByZXByZXNlbnQgdGhlIHNsb3QgbnVtYmVyIChpbmNyZWFzZWQgYnkgb25lKS4KKyAqICAgLSBBbnl0aGluZyBlbHNlIC0gdXNlZCBhcyBhIGxpdGVyYWwuCisgKiAgIC0gSWYgbm8gJyUnIGVsZW1lbnQgaXMgZm91bmQsIHRoZSBjb21tYW5kIHN0cmluZyBpcyBhcHBlbmRlZCBhcyBhbiBleHRyYS4KKyAqLworCit2b2lkIGFyZ3ZfZnJvbV9zaGVsbCggY2hhciBjb25zdCAqICogYXJndiwgTElTVCAqIHNoZWxsLCBjaGFyIGNvbnN0ICogY29tbWFuZCwKKyAgICBpbnQgY29uc3Qgc2xvdCApCit7CisgICAgc3RhdGljIGNoYXIgam9ibm9bIDQgXTsKKworICAgIGludCBpOworICAgIGludCBnb3RwZXJjZW50ID0gMDsKKyAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggc2hlbGwgKTsKKyAgICBMSVNUSVRFUiBlbmQgPSBsaXN0X2VuZCggc2hlbGwgKTsKKworICAgIGFzc2VydCggMCA8PSBzbG90ICk7CisgICAgYXNzZXJ0KCBzbG90IDwgOTk5ICk7CisgICAgc3ByaW50Ziggam9ibm8sICIlZCIsIHNsb3QgKyAxICk7CisKKyAgICBmb3IgKCBpID0gMDsgaXRlciAhPSBlbmQgJiYgaSA8IE1BWEFSR0M7ICsraSwgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApIClbIDAgXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJyUnOiBhcmd2WyBpIF0gPSBjb21tYW5kOyArK2dvdHBlcmNlbnQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnISc6IGFyZ3ZbIGkgXSA9IGpvYm5vOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQgOiBhcmd2WyBpIF0gPSBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAhZ290cGVyY2VudCApCisgICAgICAgIGFyZ3ZbIGkrKyBdID0gY29tbWFuZDsKKworICAgIGFyZ3ZbIGkgXSA9IE5VTEw7Cit9CisKKworLyogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjb21tYW5kIHN0cmluZyBjb250YWlucyBsaW5lcyBsb25nZXIgdGhhbiB0aGUgZ2l2ZW4KKyAqIG1heGltdW0uCisgKi8KK2ludCBjaGVja19jbWRfZm9yX3Rvb19sb25nX2xpbmVzKCBjaGFyIGNvbnN0ICogY29tbWFuZCwgaW50IGNvbnN0IG1heCwKKyAgICBpbnQgKiBjb25zdCBlcnJvcl9sZW5ndGgsIGludCAqIGNvbnN0IGVycm9yX21heF9sZW5ndGggKQoreworICAgIHdoaWxlICggKmNvbW1hbmQgKQorICAgIHsKKyAgICAgICAgc2l6ZV90IGNvbnN0IGwgPSBzdHJjc3BuKCBjb21tYW5kLCAiXG4iICk7CisgICAgICAgIGlmICggbCA+IG1heCApCisgICAgICAgIHsKKyAgICAgICAgICAgICplcnJvcl9sZW5ndGggPSBsOworICAgICAgICAgICAgKmVycm9yX21heF9sZW5ndGggPSBtYXg7CisgICAgICAgICAgICByZXR1cm4gRVhFQ19DSEVDS19MSU5FX1RPT19MT05HOworICAgICAgICB9CisgICAgICAgIGNvbW1hbmQgKz0gbDsKKyAgICAgICAgaWYgKCAqY29tbWFuZCApCisgICAgICAgICAgICArK2NvbW1hbmQ7CisgICAgfQorICAgIHJldHVybiBFWEVDX0NIRUNLX09LOworfQorCisKKy8qIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBzaGVsbCBsaXN0IGlzIGFjdHVhbGx5IGEgcmVxdWVzdCB0byBleGVjdXRlIHJhdworICogY29tbWFuZHMgd2l0aG91dCBhbiBleHRlcm5hbCBzaGVsbC4KKyAqLworaW50IGlzX3Jhd19jb21tYW5kX3JlcXVlc3QoIExJU1QgKiBzaGVsbCApCit7CisgICAgcmV0dXJuICFsaXN0X2VtcHR5KCBzaGVsbCApICYmCisgICAgICAgICFzdHJjbXAoIG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIHNoZWxsICkgKSwgIiUiICkgJiYKKyAgICAgICAgbGlzdF9uZXh0KCBsaXN0X2JlZ2luKCBzaGVsbCApICkgPT0gbGlzdF9lbmQoIHNoZWxsICk7Cit9CisKKworLyogUmV0dXJucyB3aGV0aGVyIGFuIGludGVycnVwdCBoYXMgYmVlbiBkZXRlY3RlZCBzbyBmYXIuICovCisKK2ludCBpbnRlcnJ1cHRlZCggdm9pZCApCit7CisgICAgcmV0dXJuIGludHIgIT0gMDsKK30KKworCisvKiBJbnRlcm5hbCBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KKwordm9pZCBvbmludHIoIGludCBkaXNwICkKK3sKKyAgICArK2ludHI7CisgICAgcHJpbnRmKCAiLi4uaW50ZXJydXB0ZWRcbiIgKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2V4ZWNjbWQuaCBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2V4ZWNjbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjE0NWFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZXhlY2NtZC5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTMsIDE5OTUgQ2hyaXN0b3BoZXIgU2Vpd2FsZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKgorICogZXhlY2NtZC5oIC0gZXhlY3V0ZSBhIHNoZWxsIHNjcmlwdC4KKyAqCisgKiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24KKyAqIG1vZHVsZXMgYXMgd2VsbCBhcyBkaWZmZXJlbnQgc2hhcmVkIHV0aWxpdHkgZnVuY3Rpb25zIHByZXBhcmVkIGluIHRoZQorICogZXhlY2NtZC5jIG1vZHVsZS4KKyAqLworCisjaWZuZGVmIEVYRUNDTURfSAorI2RlZmluZSBFWEVDQ01EX0gKKworI2luY2x1ZGUgImxpc3RzLmgiCisjaW5jbHVkZSAic3RyaW5ncy5oIgorI2luY2x1ZGUgInRpbWVzdGFtcC5oIgorCisKK3R5cGVkZWYgc3RydWN0IHRpbWluZ19pbmZvCit7CisgICAgZG91YmxlIHN5c3RlbTsKKyAgICBkb3VibGUgdXNlcjsKKyAgICB0aW1lc3RhbXAgc3RhcnQ7CisgICAgdGltZXN0YW1wIGVuZDsKK30gdGltaW5nX2luZm87CisKK3R5cGVkZWYgdm9pZCAoKiBFeGVjQ21kQ2FsbGJhY2spCisoCisgICAgdm9pZCAqIGNvbnN0IGNsb3N1cmUsCisgICAgaW50IGNvbnN0IHN0YXR1cywKKyAgICB0aW1pbmdfaW5mbyBjb25zdCAqIGNvbnN0LAorICAgIGNoYXIgY29uc3QgKiBjb25zdCBjbWRfc3Rkb3V0LAorICAgIGNoYXIgY29uc3QgKiBjb25zdCBjbWRfc3RkZXJyLAorICAgIGludCBjb25zdCBjbWRfZXhpdF9yZWFzb24KKyk7CisKKy8qIFN0YXR1cyBjb2RlcyBwYXNzZWQgdG8gRXhlY0NtZENhbGxiYWNrIHJvdXRpbmVzLiAqLworI2RlZmluZSBFWEVDX0NNRF9PSyAgICAwCisjZGVmaW5lIEVYRUNfQ01EX0ZBSUwgIDEKKyNkZWZpbmUgRVhFQ19DTURfSU5UUiAgMgorCitpbnQgZXhlY19jaGVjaworKAorICAgIHN0cmluZyBjb25zdCAqIGNvbW1hbmQsCisgICAgTElTVCAqICogcFNoZWxsLAorICAgIGludCAqIGVycm9yX2xlbmd0aCwKKyAgICBpbnQgKiBlcnJvcl9tYXhfbGVuZ3RoCispOworCisvKiBleGVjX2NoZWNrKCkgcmV0dXJuIGNvZGVzLiAqLworI2RlZmluZSBFWEVDX0NIRUNLX09LICAgICAgICAgICAgIDEwMQorI2RlZmluZSBFWEVDX0NIRUNLX05PT1AgICAgICAgICAgIDEwMgorI2RlZmluZSBFWEVDX0NIRUNLX0xJTkVfVE9PX0xPTkcgIDEwMworI2RlZmluZSBFWEVDX0NIRUNLX1RPT19MT05HICAgICAgIDEwNAorCit2b2lkIGV4ZWNfY21kCisoCisgICAgc3RyaW5nIGNvbnN0ICogY29tbWFuZCwKKyAgICBFeGVjQ21kQ2FsbGJhY2sgZnVuYywKKyAgICB2b2lkICogY2xvc3VyZSwKKyAgICBMSVNUICogc2hlbGwKKyk7CisKK3ZvaWQgZXhlY193YWl0KCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVXRpbGl0eSBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgZXhlY2NtZC5jIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29uc3RydWN0cyBhIGxpc3Qgb2YgY29tbWFuZC1saW5lIGVsZW1lbnRzIHVzaW5nIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZQorICogZ2l2ZW4gc2hlbGwgbGlzdC4KKyAqLwordm9pZCBhcmd2X2Zyb21fc2hlbGwoIGNoYXIgY29uc3QgKiAqIGFyZ3YsIExJU1QgKiBzaGVsbCwgY2hhciBjb25zdCAqIGNvbW1hbmQsCisgICAgaW50IGNvbnN0IHNsb3QgKTsKKworLyogSW50ZXJydXB0IHJvdXRpbmUgYnVtcGluZyB0aGUgaW50ZXJuYWwgaW50ZXJydXB0IGNvdW50ZXIuIE5lZWRzIHRvIGJlCisgKiByZWdpc3RlcmVkIGJ5IHBsYXRmb3JtIHNwZWNpZmljIGV4ZWMqLmMgbW9kdWxlcy4KKyAqLwordm9pZCBvbmludHIoIGludCBkaXNwICk7CisKKy8qIFJldHVybnMgd2hldGhlciBhbiBpbnRlcnJ1cHQgaGFzIGJlZW4gZGV0ZWN0ZWQgc28gZmFyLiAqLworaW50IGludGVycnVwdGVkKCB2b2lkICk7CisKKy8qIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBzaGVsbCBsaXN0IGlzIGFjdHVhbGx5IGEgcmVxdWVzdCB0byBleGVjdXRlIHJhdworICogY29tbWFuZHMgd2l0aG91dCBhbiBleHRlcm5hbCBzaGVsbC4KKyAqLworaW50IGlzX3Jhd19jb21tYW5kX3JlcXVlc3QoIExJU1QgKiBzaGVsbCApOworCisvKiBVdGlsaXR5IHdvcmtlciBmb3IgZXhlY19jaGVjaygpIGNoZWNraW5nIHdoZXRoZXIgYWxsIHRoZSBnaXZlbiBjb21tYW5kIGxpbmVzCisgKiBhcmUgdW5kZXIgdGhlIHNwZWNpZmllZCBsZW5ndGggbGltaXQuCisgKi8KK2ludCBjaGVja19jbWRfZm9yX3Rvb19sb25nX2xpbmVzKCBjaGFyIGNvbnN0ICogY29tbWFuZCwgaW50IGNvbnN0IG1heCwKKyAgICBpbnQgKiBjb25zdCBlcnJvcl9sZW5ndGgsIGludCAqIGNvbnN0IGVycm9yX21heF9sZW5ndGggKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9leGVjbnQuYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2V4ZWNudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODliZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9leGVjbnQuYwpAQCAtMCwwICsxLDEyMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NSBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qIFRoaXMgZmlsZSBpcyBBTFNPOgorICogQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyAqIENvcHlyaWdodCAyMDA3IFJlbmUgUml2ZXJhLgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKy8qCisgKiBleGVjbnQuYyAtIGV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kIG9uIFdpbmRvd3MgTlQKKyAqCisgKiBJZiAkKEpBTVNIRUxMKSBpcyBkZWZpbmVkLCB1c2VzIHRoYXQgdG8gZm9ybXVsYXRlIHRoZSBhY3R1YWwgY29tbWFuZC4gVGhlCisgKiBkZWZhdWx0IGlzOiBjbWQuZXhlIC9RL0MKKyAqCisgKiBJbiAkKEpBTVNIRUxMKSwgJSBleHBhbmRzIHRvIHRoZSBjb21tYW5kIHN0cmluZyBhbmQgISBleHBhbmRzIHRvIHRoZSBzbG90CisgKiBudW1iZXIgKHN0YXJ0aW5nIGF0IDEpIGZvciBtdWx0aXByb2Nlc3MgKC1qKSBpbnZvY2F0aW9ucy4gSWYgJChKQU1TSEVMTCkgZG9lcworICogbm90IGluY2x1ZGUgYSAlLCBpdCBpcyB0YWNrZWQgb24gYXMgdGhlIGxhc3QgYXJndW1lbnQuCisgKgorICogRWFjaCAkKEpBTVNIRUxMKSBwbGFjZWhvbGRlciBtdXN0IGJlIHNwZWNpZmllZCBhcyBhIHNlcGFyYXRlIGluZGl2aWR1YWwKKyAqIGVsZW1lbnQgaW4gYSBqYW0gdmFyaWFibGUgdmFsdWUuCisgKgorICogRG8gbm90IGp1c3Qgc2V0IEpBTVNIRUxMIHRvIGNtZC5leGUgLSBpdCB3aWxsIG5vdCB3b3JrIQorICoKKyAqIEV4dGVybmFsIHJvdXRpbmVzOgorICogIGV4ZWNfY2hlY2soKSAtIHByZXByb2Nlc3MgYW5kIHZhbGlkYXRlIHRoZSBjb21tYW5kCisgKiAgZXhlY19jbWQoKSAgIC0gbGF1bmNoIGFuIGFzeW5jIGNvbW1hbmQgZXhlY3V0aW9uCisgKiAgZXhlY193YWl0KCkgIC0gd2FpdCBmb3IgYW55IG9mIHRoZSBhc3luYyBjb21tYW5kIHByb2Nlc3NlcyB0byB0ZXJtaW5hdGUKKyAqCisgKiBJbnRlcm5hbCByb3V0aW5lczoKKyAqICBmaWxldGltZV90b19zZWNvbmRzKCkgLSBXaW5kb3dzIEZJTEVUSU1FIC0tPiBudW1iZXIgb2Ygc2Vjb25kcyBjb252ZXJzaW9uCisgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2lmZGVmIFVTRV9FWEVDTlQKKyNpbmNsdWRlICJleGVjY21kLmgiCisKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgInBhdGhzeXMuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjaW5jbHVkZSA8dGxoZWxwMzIuaD4KKworCisvKiBnZXQgdGhlIG1heGltdW0gc2hlbGwgY29tbWFuZCBsaW5lIGxlbmd0aCBhY2NvcmRpbmcgdG8gdGhlIE9TICovCitzdGF0aWMgaW50IG1heGxpbmUoKTsKKy8qIHZhbGlkIHJhdyBjb21tYW5kIHN0cmluZyBsZW5ndGggKi8KK3N0YXRpYyBsb25nIHJhd19jb21tYW5kX2xlbmd0aCggY2hhciBjb25zdCAqIGNvbW1hbmQgKTsKKy8qIGFkZCB0d28gNjQtYml0IHVuc2lnbmVkIG51bWJlcnMsIGgxbDEgYW5kIGgybDIgKi8KK3N0YXRpYyBGSUxFVElNRSBhZGRfNjQoCisgICAgdW5zaWduZWQgbG9uZyBoMSwgdW5zaWduZWQgbG9uZyBsMSwKKyAgICB1bnNpZ25lZCBsb25nIGgyLCB1bnNpZ25lZCBsb25nIGwyICk7CisvKiAqLworc3RhdGljIEZJTEVUSU1FIGFkZF9GSUxFVElNRSggRklMRVRJTUUgdDEsIEZJTEVUSU1FIHQyICk7CisvKiAqLworc3RhdGljIEZJTEVUSU1FIG5lZ2F0ZV9GSUxFVElNRSggRklMRVRJTUUgdCApOworLyogcmVjb3JkIHRoZSB0aW1pbmcgaW5mbyBmb3IgdGhlIHByb2Nlc3MgKi8KK3N0YXRpYyB2b2lkIHJlY29yZF90aW1lcyggSEFORExFIGNvbnN0LCB0aW1pbmdfaW5mbyAqIGNvbnN0ICk7CisvKiBjYWxjIHRoZSBjdXJyZW50IHJ1bm5pbmcgdGltZSBvZiBhbiAqYWN0aXZlKiBwcm9jZXNzICovCitzdGF0aWMgZG91YmxlIHJ1bm5pbmdfdGltZSggSEFORExFIGNvbnN0ICk7CisvKiB0ZXJtaW5hdGUgdGhlIGdpdmVuIHByb2Nlc3MsIGFmdGVyIHRlcm1pbmF0aW5nIGFsbCBpdHMgY2hpbGRyZW4gZmlyc3QgKi8KK3N0YXRpYyB2b2lkIGtpbGxfcHJvY2Vzc190cmVlKCBEV09SRCBjb25zdCBwcm9jZXNkSWQsIEhBTkRMRSBjb25zdCApOworLyogd2FpdHMgZm9yIGEgY29tbWFuZCB0byBjb21wbGV0ZSBvciB0aW1lIG91dCAqLworc3RhdGljIGludCB0cnlfd2FpdCggaW50IGNvbnN0IHRpbWVvdXRNaWxsaXMgKTsKKy8qIHJlYWRzIGFueSBwZW5kaW5nIG91dHB1dCBmb3IgcnVubmluZyBjb21tYW5kcyAqLworc3RhdGljIHZvaWQgcmVhZF9vdXRwdXQoKTsKKy8qIGNoZWNrcyBpZiBhIGNvbW1hbmQgcmFuIG91dCBvZiB0aW1lLCBhbmQga2lsbHMgaXQgKi8KK3N0YXRpYyBpbnQgdHJ5X2tpbGxfb25lKCk7CisvKiBpcyB0aGUgZmlyc3QgcHJvY2VzcyBhIHBhcmVudCAoZGlyZWN0IG9yIGluZGlyZWN0KSB0byB0aGUgc2Vjb25kIG9uZSAqLworc3RhdGljIGludCBpc19wYXJlbnRfY2hpbGQoIERXT1JEIGNvbnN0IHBhcmVudCwgRFdPUkQgY29uc3QgY2hpbGQgKTsKKy8qICovCitzdGF0aWMgdm9pZCBjbG9zZV9hbGVydCggUFJPQ0VTU19JTkZPUk1BVElPTiBjb25zdCAqIGNvbnN0ICk7CisvKiBjbG9zZSBhbnkgYWxlcnRzIGhhbmdpbmcgYXJvdW5kICovCitzdGF0aWMgdm9pZCBjbG9zZV9hbGVydHMoKTsKKy8qIHByZXBhcmUgYSBjb21tYW5kIGZpbGUgdG8gYmUgZXhlY3V0ZWQgdXNpbmcgYW4gZXh0ZXJuYWwgc2hlbGwgKi8KK3N0YXRpYyBjaGFyIGNvbnN0ICogcHJlcGFyZV9jb21tYW5kX2ZpbGUoIHN0cmluZyBjb25zdCAqIGNvbW1hbmQsIGludCBzbG90ICk7CisvKiBpbnZva2UgdGhlIGFjdHVhbCBleHRlcm5hbCBwcm9jZXNzIHVzaW5nIHRoZSBnaXZlbiBjb21tYW5kIGxpbmUgKi8KK3N0YXRpYyB2b2lkIGludm9rZV9jbWQoIGNoYXIgY29uc3QgKiBjb25zdCBjb21tYW5kLCBpbnQgY29uc3Qgc2xvdCApOworLyogZmluZCBhIGZyZWUgc2xvdCBpbiB0aGUgcnVubmluZyBjb21tYW5kcyB0YWJsZSAqLworc3RhdGljIGludCBnZXRfZnJlZV9jbWR0YWJfc2xvdCgpOworLyogcHV0IHRvZ2V0aGVyIHRoZSBmaW5hbCBjb21tYW5kIHN0cmluZyB3ZSBhcmUgdG8gcnVuICovCitzdGF0aWMgdm9pZCBzdHJpbmdfbmV3X2Zyb21fYXJndiggc3RyaW5nICogcmVzdWx0LCBjaGFyIGNvbnN0ICogY29uc3QgKiBhcmd2ICk7CisvKiBmcmVlcyBhbmQgcmVuZXdzIHRoZSBnaXZlbiBzdHJpbmcgKi8KK3N0YXRpYyB2b2lkIHN0cmluZ19yZW5ldyggc3RyaW5nICogY29uc3QgKTsKKy8qIHJlcG9ydHMgdGhlIGxhc3QgZmFpbGVkIFdpbmRvd3MgQVBJIHJlbGF0ZWQgZXJyb3IgbWVzc2FnZSAqLworc3RhdGljIHZvaWQgcmVwb3J0V2luZG93c0Vycm9yKCBjaGFyIGNvbnN0ICogY29uc3QgYXBpTmFtZSApOworLyogY2xvc2VzIGEgV2luZG93cyBIQU5ETEUgYW5kIHJlc2V0cyBpdHMgdmFyaWFibGUgdG8gMC4gKi8KK3N0YXRpYyB2b2lkIGNsb3NlV2luSGFuZGxlKCBIQU5ETEUgKiBjb25zdCBoYW5kbGUgKTsKKworLyogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAqLworCisvKiBDcmVhdGVQcm9jZXNzQSgpIFdpbmRvd3MgQVBJIHBsYWNlcyBhIGxpbWl0IG9mIDMyNzY4IGNoYXJhY3RlcnMgKGJ5dGVzKSBvbgorICogdGhlIGFsbG93ZWQgY29tbWFuZC1saW5lIGxlbmd0aCwgaW5jbHVkaW5nIGEgdHJhaWxpbmcgVW5pY29kZSAoMi1ieXRlKQorICogbnVsLXRlcm1pbmF0b3IgY2hhcmFjdGVyLgorICovCisjZGVmaW5lIE1BWF9SQVdfQ09NTUFORF9MRU5HVEggMzI3NjYKKworLyogV2UgaG9sZCBoYW5kbGVzIGZvciBwaXBlcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggY2hpbGQgcHJvY2Vzc2VzIGluIHR3bworICogZWxlbWVudCBhcnJheXMgaW5kZXhlZCBhcyBmb2xsb3dzLgorICovCisjZGVmaW5lIEVYRUNDTURfUElQRV9SRUFEIDAKKyNkZWZpbmUgRVhFQ0NNRF9QSVBFX1dSSVRFIDEKKworc3RhdGljIGludCBpbnRyX2luc3RhbGxlZDsKKworCisvKiBUaGUgbGlzdCBvZiBjb21tYW5kcyB3ZSBydW4uICovCitzdGF0aWMgc3RydWN0Cit7CisgICAgLyogVGVtcG9yYXJ5IGNvbW1hbmQgZmlsZSB1c2VkIHRvIGV4ZWN1dGUgdGhlIGFjdGlvbiB3aGVuIG5lZWRlZC4gKi8KKyAgICBzdHJpbmcgY29tbWFuZF9maWxlWyAxIF07CisKKyAgICAvKiBQaXBlcyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBjaGlsZCBwcm9jZXNzLiBQYXJlbnQgcmVhZHMgZnJvbSAoMCksCisgICAgICogY2hpbGQgd3JpdGVzIHRvICgxKS4KKyAgICAgKi8KKyAgICBIQU5ETEUgcGlwZV9vdXRbIDIgXTsKKyAgICBIQU5ETEUgcGlwZV9lcnJbIDIgXTsKKworICAgIHN0cmluZyBidWZmZXJfb3V0WyAxIF07ICAvKiBidWZmZXIgdG8gaG9sZCBzdGRvdXQsIGlmIGFueSAqLworICAgIHN0cmluZyBidWZmZXJfZXJyWyAxIF07ICAvKiBidWZmZXIgdG8gaG9sZCBzdGRlcnIsIGlmIGFueSAqLworCisgICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsgIC8qIHJ1bm5pbmcgcHJvY2VzcyBpbmZvcm1hdGlvbiAqLworCisgICAgLyogRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzLiAqLworICAgIEV4ZWNDbWRDYWxsYmFjayBmdW5jOworCisgICAgLyogT3BhcXVlIGRhdGEgcGFzc2VkIGJhY2sgdG8gdGhlICdmdW5jJyBjYWxsYmFjay4gKi8KKyAgICB2b2lkICogY2xvc3VyZTsKK30KK2NtZHRhYlsgTUFYSk9CUyBdID0geyB7IDAgfSB9OworCisKKy8qCisgKiBFeGVjdXRpb24gdW5pdCB0ZXN0cy4KKyAqLworCit2b2lkIGV4ZWNudF91bml0X3Rlc3QoKQoreworI2lmICFkZWZpbmVkKCBOREVCVUcgKQorICAgIC8qIHZjNiBwcmVwcm9jZXNzb3IgaXMgYnJva2VuLCBzbyBhc3NlcnQgd2l0aCB0aGVzZSBzdHJpbmdzIGdldHMgY29uZnVzZWQuCisgICAgICogVXNlIGEgdGFibGUgaW5zdGVhZC4KKyAgICAgKi8KKyAgICB7CisgICAgICAgIHR5cGVkZWYgc3RydWN0IHRlc3QgeyBjaGFyICogY29tbWFuZDsgaW50IHJlc3VsdDsgfSB0ZXN0OworICAgICAgICB0ZXN0IHRlc3RzW10gPSB7CisgICAgICAgICAgICB7ICIiLCAwIH0sCisgICAgICAgICAgICB7ICIgICIsIDAgfSwKKyAgICAgICAgICAgIHsgIngiLCAxIH0sCisgICAgICAgICAgICB7ICJcbngiLCAxIH0sCisgICAgICAgICAgICB7ICJ4XG4iLCAxIH0sCisgICAgICAgICAgICB7ICJcbnhcbiIsIDEgfSwKKyAgICAgICAgICAgIHsgIlxueCBcbiIsIDIgfSwKKyAgICAgICAgICAgIHsgIlxueCBcbiAiLCAyIH0sCisgICAgICAgICAgICB7ICIgXG5cdFx0XHZcclxyXG4gXHQgIHggIFx2IFx0XHRcclxuXG5cbiAgIFxuXG5cdlx0IiwgOCB9LAorICAgICAgICAgICAgeyAieFxueSIsIC0xIH0sCisgICAgICAgICAgICB7ICJ4XG5cbiB5IiwgLTEgfSwKKyAgICAgICAgICAgIHsgImVjaG8geCA+IGZvby5iYXIiLCAtMSB9LAorICAgICAgICAgICAgeyAiZWNobyB4IDwgZm9vLmJhciIsIC0xIH0sCisgICAgICAgICAgICB7ICJlY2hvIHggfCBmb28uYmFyIiwgLTEgfSwKKyAgICAgICAgICAgIHsgImVjaG8geCBcIj5cIiBmb28uYmFyIiwgMTggfSwKKyAgICAgICAgICAgIHsgImVjaG8geCAnPCcgZm9vLmJhciIsIDE4IH0sCisgICAgICAgICAgICB7ICJlY2hvIHggXCJ8XCIgZm9vLmJhciIsIDE4IH0sCisgICAgICAgICAgICB7ICJlY2hvIHggXFxcIj5cXFwiIGZvby5iYXIiLCAtMSB9LAorICAgICAgICAgICAgeyAiZWNobyB4IFxcXCI8XFxcIiBmb28uYmFyIiwgLTEgfSwKKyAgICAgICAgICAgIHsgImVjaG8geCBcXFwifFxcXCIgZm9vLmJhciIsIC0xIH0sCisgICAgICAgICAgICB7ICJcImVjaG8geCA+IGZvby5iYXJcIiIsIDE4IH0sCisgICAgICAgICAgICB7ICJlY2hvIHggXCInXCI8JyBmb28uYmFyIiwgLTEgfSwKKyAgICAgICAgICAgIHsgImVjaG8geCBcXFxcXCI8XFxcXFwiIGZvby5iYXIiLCAyMiB9LAorICAgICAgICAgICAgeyAiZWNobyB4IFxceFxcXCI8XFxcXFwiIGZvby5iYXIiLCAtMSB9LAorICAgICAgICAgICAgeyAwIH0gfTsKKyAgICAgICAgdGVzdCBjb25zdCAqIHQ7CisgICAgICAgIGZvciAoIHQgPSB0ZXN0czsgdC0+Y29tbWFuZDsgKyt0ICkKKyAgICAgICAgICAgIGFzc2VydCggcmF3X2NvbW1hbmRfbGVuZ3RoKCB0LT5jb21tYW5kICkgPT0gdC0+cmVzdWx0ICk7CisgICAgfQorCisgICAgeworICAgICAgICBpbnQgY29uc3QgbGVuZ3RoID0gbWF4bGluZSgpICsgOTsKKyAgICAgICAgY2hhciAqIGNvbnN0IGNtZCA9IChjaGFyICopQkpBTV9NQUxMT0NfQVRPTUlDKCBsZW5ndGggKyAxICk7CisgICAgICAgIG1lbXNldCggY21kLCAneCcsIGxlbmd0aCApOworICAgICAgICBjbWRbIGxlbmd0aCBdID0gMDsKKyAgICAgICAgYXNzZXJ0KCByYXdfY29tbWFuZF9sZW5ndGgoIGNtZCApID09IGxlbmd0aCApOworICAgICAgICBCSkFNX0ZSRUUoIGNtZCApOworICAgIH0KKyNlbmRpZgorfQorCisKKy8qCisgKiBleGVjX2NoZWNrKCkgLSBwcmVwcm9jZXNzIGFuZCB2YWxpZGF0ZSB0aGUgY29tbWFuZAorICovCisKK2ludCBleGVjX2NoZWNrCisoCisgICAgc3RyaW5nIGNvbnN0ICogY29tbWFuZCwKKyAgICBMSVNUICogKiBwU2hlbGwsCisgICAgaW50ICogZXJyb3JfbGVuZ3RoLAorICAgIGludCAqIGVycm9yX21heF9sZW5ndGgKKykKK3sKKyAgICAvKiBEZWZhdWx0IHNoZWxsIGRvZXMgbm90aGluZyB3aGVuIHRyaWdnZXJlZCB3aXRoIGFuIGVtcHR5IG9yIGEKKyAgICAgKiB3aGl0ZXNwYWNlLW9ubHkgY29tbWFuZCBzbyB3ZSBzaW1wbHkgc2tpcCBydW5uaW5nIGl0IGluIHRoYXQgY2FzZS4gV2UKKyAgICAgKiBzdGlsbCBwYXNzIHRoZW0gb24gdG8gbm9uLWRlZmF1bHQgc2hlbGxzIGFzIHdlIGRvIG5vdCByZWFsbHkga25vdyB3aGF0CisgICAgICogdGhleSBhcmUgZ29pbmcgdG8gZG8gd2l0aCBzdWNoIGNvbW1hbmRzLgorICAgICAqLworICAgIGlmICggbGlzdF9lbXB0eSggKnBTaGVsbCApICkKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBzID0gY29tbWFuZC0+dmFsdWU7CisgICAgICAgIHdoaWxlICggaXNzcGFjZSggKnMgKSApICsrczsKKyAgICAgICAgaWYgKCAhKnMgKQorICAgICAgICAgICAgcmV0dXJuIEVYRUNfQ0hFQ0tfTk9PUDsKKyAgICB9CisKKyAgICAvKiBDaGVjayBwcmVyZXF1aXNpdGVzIGZvciBleGVjdXRpbmcgcmF3IGNvbW1hbmRzLiAqLworICAgIGlmICggaXNfcmF3X2NvbW1hbmRfcmVxdWVzdCggKnBTaGVsbCApICkKKyAgICB7CisgICAgICAgIGludCBjb25zdCByYXdfY21kX2xlbmd0aCA9IHJhd19jb21tYW5kX2xlbmd0aCggY29tbWFuZC0+dmFsdWUgKTsKKyAgICAgICAgaWYgKCByYXdfY21kX2xlbmd0aCA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbnZhbGlkIGNoYXJhY3RlcnMgZGV0ZWN0ZWQgLSBmYWxsYmFjayB0byBkZWZhdWx0IHNoZWxsLiAqLworICAgICAgICAgICAgbGlzdF9mcmVlKCAqcFNoZWxsICk7CisgICAgICAgICAgICAqcFNoZWxsID0gTDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHJhd19jbWRfbGVuZ3RoID4gTUFYX1JBV19DT01NQU5EX0xFTkdUSCApCisgICAgICAgIHsKKyAgICAgICAgICAgICplcnJvcl9sZW5ndGggPSByYXdfY21kX2xlbmd0aDsKKyAgICAgICAgICAgICplcnJvcl9tYXhfbGVuZ3RoID0gTUFYX1JBV19DT01NQU5EX0xFTkdUSDsKKyAgICAgICAgICAgIHJldHVybiBFWEVDX0NIRUNLX1RPT19MT05HOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiByYXdfY21kX2xlbmd0aCA/IEVYRUNfQ0hFQ0tfT0sgOiBFWEVDX0NIRUNLX05PT1A7CisgICAgfQorCisgICAgLyogTm93IHdlIGtub3cgd2UgYXJlIHVzaW5nIGFuIGV4dGVybmFsIHNoZWxsLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCB0bworICAgICAqIGNoZWNrIGZvciB0b28gbG9uZyBjb21tYW5kIHN0cmluZ3Mgd2hlbiB1c2luZyBhbiBleHRlcm5hbCBzaGVsbCBzaW5jZSB3ZQorICAgICAqIHVzZSBhIGNvbW1hbmQgZmlsZSBhbmQgYXNzdW1lIG5vIG9uZSBpcyBnb2luZyB0byBzZXQgdXAgYSBKQU1TSEVMTCBmb3JtYXQKKyAgICAgKiBzdHJpbmcgbG9uZ2VyIHRoYW4gYSBmZXcgaHVuZHJlZCBieXRlcyBhdCBtb3N0IHdoaWNoIHNob3VsZCBiZSB3ZWxsIHVuZGVyCisgICAgICogdGhlIHRvdGFsIGNvbW1hbmQgc3RyaW5nIGxpbWl0LiBTaG91bGQgc29tZW9uZSBhY3R1YWxseSBjb25zdHJ1Y3Qgc3VjaCBhCisgICAgICogSkFNU0hFTEwgdmFsdWUgaXQgd2lsbCBnZXQgcmVwb3J0ZWQgYXMgYW4gJ2ludmFsaWQgcGFyYW1ldGVyJworICAgICAqIENyZWF0ZVByb2Nlc3NBKCkgV2luZG93cyBBUEkgZmFpbHVyZSB3aGljaCBzZWVtcyBsaWtlIGEgZ29vZCBlbm91Z2gKKyAgICAgKiByZXN1bHQgZm9yIHN1Y2ggaW50ZW50aW9uYWwgbWlzY2hpZWYuCisgICAgICovCisKKyAgICAvKiBDaGVjayBmb3IgdG9vIGxvbmcgY29tbWFuZCBsaW5lcy4gKi8KKyAgICByZXR1cm4gY2hlY2tfY21kX2Zvcl90b29fbG9uZ19saW5lcyggY29tbWFuZC0+dmFsdWUsIG1heGxpbmUoKSwKKyAgICAgICAgZXJyb3JfbGVuZ3RoLCBlcnJvcl9tYXhfbGVuZ3RoICk7Cit9CisKKworLyoKKyAqIGV4ZWNfY21kKCkgLSBsYXVuY2ggYW4gYXN5bmMgY29tbWFuZCBleGVjdXRpb24KKyAqCisgKiBXZSBhc3N1bWUgZXhlY19jaGVjaygpIGFscmVhZHkgdmVyaWZpZWQgdGhhdCB0aGUgZ2l2ZW4gY29tbWFuZCBjYW4gaGF2ZSBpdHMKKyAqIGNvbW1hbmQgc3RyaW5nIGNvbnN0cnVjdGVkIGFzIHJlcXVlc3RlZC4KKyAqLworCit2b2lkIGV4ZWNfY21kCisoCisgICAgc3RyaW5nIGNvbnN0ICogY21kX29yaWcsCisgICAgRXhlY0NtZENhbGxiYWNrIGZ1bmMsCisgICAgdm9pZCAqIGNsb3N1cmUsCisgICAgTElTVCAqIHNoZWxsCispCit7CisgICAgaW50IGNvbnN0IHNsb3QgPSBnZXRfZnJlZV9jbWR0YWJfc2xvdCgpOworICAgIGludCBjb25zdCBpc19yYXdfY21kID0gaXNfcmF3X2NvbW1hbmRfcmVxdWVzdCggc2hlbGwgKTsKKyAgICBzdHJpbmcgY21kX2xvY2FsWyAxIF07CisKKyAgICAvKiBJbml0aWFsaXplIGRlZmF1bHQgc2hlbGwgLSBhbnl0aGluZyBtb3JlIHRoYW4gL1EvQyBpcyBub24tcG9ydGFibGUuICovCisgICAgc3RhdGljIExJU1QgKiBkZWZhdWx0X3NoZWxsOworICAgIGlmICggIWRlZmF1bHRfc2hlbGwgKQorICAgICAgICBkZWZhdWx0X3NoZWxsID0gbGlzdF9uZXcoIG9iamVjdF9uZXcoICJjbWQuZXhlIC9RL0MiICkgKTsKKworICAgIC8qIFNwZWNpZnlpbmcgbm8gc2hlbGwgbWVhbnMgcmVxdWVzdGluZyB0aGUgZGVmYXVsdCBzaGVsbC4gKi8KKyAgICBpZiAoIGxpc3RfZW1wdHkoIHNoZWxsICkgKQorICAgICAgICBzaGVsbCA9IGRlZmF1bHRfc2hlbGw7CisKKyAgICBpZiAoIERFQlVHX0VYRUNDTUQgKQorICAgICAgICBpZiAoIGlzX3Jhd19jbWQgKQorICAgICAgICAgICAgcHJpbnRmKCAiRXhlY3V0aW5nIHJhdyBjb21tYW5kIGRpcmVjdGx5XG4iICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiRXhlY3V0aW5nIHVzaW5nIGEgY29tbWFuZCBmaWxlIGFuZCB0aGUgc2hlbGw6ICIgKTsKKyAgICAgICAgICAgIGxpc3RfcHJpbnQoIHNoZWxsICk7CisgICAgICAgICAgICBwcmludGYoICJcbiIgKTsKKyAgICAgICAgfQorCisgICAgLyogSWYgd2UgYXJlIHJ1bm5pbmcgYSByYXcgY29tbWFuZCBkaXJlY3RseSAtIHRyaW0gaXRzIGxlYWRpbmcgd2hpdGVzcGFjZXMKKyAgICAgKiBhcyB3ZWxsIGFzIGFueSB0cmFpbGluZyBhbGwtd2hpdGVzcGFjZSBsaW5lcyBidXQga2VlcCBhbnkgdHJhaWxpbmcKKyAgICAgKiB3aGl0ZXNwYWNlIGluIHRoZSBmaW5hbC9vbmx5IGxpbmUgY29udGFpbmluZyBzb21ldGhpbmcgb3RoZXIgdGhhbgorICAgICAqIHdoaXRlc3BhY2UpLgorICAgICAqLworICAgIGlmICggaXNfcmF3X2NtZCApCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogc3RhcnQgPSBjbWRfb3JpZy0+dmFsdWU7CisgICAgICAgIGNoYXIgY29uc3QgKiBwID0gY21kX29yaWctPnZhbHVlICsgY21kX29yaWctPnNpemU7CisgICAgICAgIGNoYXIgY29uc3QgKiBlbmQgPSBwOworICAgICAgICB3aGlsZSAoIGlzc3BhY2UoICpzdGFydCApICkgKytzdGFydDsKKyAgICAgICAgd2hpbGUgKCBwID4gc3RhcnQgJiYgaXNzcGFjZSggcFsgLTEgXSApICkKKyAgICAgICAgICAgIGlmICggKi0tcCA9PSAnXG4nICkKKyAgICAgICAgICAgICAgICBlbmQgPSBwOworICAgICAgICBzdHJpbmdfbmV3KCBjbWRfbG9jYWwgKTsKKyAgICAgICAgc3RyaW5nX2FwcGVuZF9yYW5nZSggY21kX2xvY2FsLCBzdGFydCwgZW5kICk7CisgICAgICAgIGFzc2VydCggY21kX2xvY2FsLT5zaXplID09IHJhd19jb21tYW5kX2xlbmd0aCggY21kX29yaWctPnZhbHVlICkgKTsKKyAgICB9CisgICAgLyogSWYgd2UgYXJlIG5vdCBydW5uaW5nIGEgcmF3IGNvbW1hbmQgZGlyZWN0bHksIHByZXBhcmUgYSBjb21tYW5kIGZpbGUgdG8KKyAgICAgKiBiZSBleGVjdXRlZCB1c2luZyBhbiBleHRlcm5hbCBzaGVsbCBhbmQgdGhlIGFjdHVhbCBjb21tYW5kIHN0cmluZyB1c2luZworICAgICAqIHRoYXQgY29tbWFuZCBmaWxlLgorICAgICAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBjbWRfZmlsZSA9IHByZXBhcmVfY29tbWFuZF9maWxlKCBjbWRfb3JpZywgc2xvdCApOworICAgICAgICBjaGFyIGNvbnN0ICogYXJndlsgTUFYQVJHQyArIDEgXTsgIC8qICsxIGZvciBOVUxMICovCisgICAgICAgIGFyZ3ZfZnJvbV9zaGVsbCggYXJndiwgc2hlbGwsIGNtZF9maWxlLCBzbG90ICk7CisgICAgICAgIHN0cmluZ19uZXdfZnJvbV9hcmd2KCBjbWRfbG9jYWwsIGFyZ3YgKTsKKyAgICB9CisKKyAgICAvKiBDYXRjaCBpbnRlcnJ1cHRzIHdoZW5ldmVyIGNvbW1hbmRzIGFyZSBydW5uaW5nLiAqLworICAgIGlmICggIWludHJfaW5zdGFsbGVkICkKKyAgICB7CisgICAgICAgIGludHJfaW5zdGFsbGVkID0gMTsKKyAgICAgICAgc2lnbmFsKCBTSUdJTlQsIG9uaW50ciApOworICAgIH0KKworICAgIC8qIFNhdmUgaW5wdXQgZGF0YSBpbnRvIHRoZSBzZWxlY3RlZCBydW5uaW5nIGNvbW1hbmRzIHRhYmxlIHNsb3QuICovCisgICAgY21kdGFiWyBzbG90IF0uZnVuYyA9IGZ1bmM7CisgICAgY21kdGFiWyBzbG90IF0uY2xvc3VyZSA9IGNsb3N1cmU7CisKKyAgICAvKiBJbnZva2UgdGhlIGFjdHVhbCBleHRlcm5hbCBwcm9jZXNzIHVzaW5nIHRoZSBjb25zdHJ1Y3RlZCBjb21tYW5kIGxpbmUuICovCisgICAgaW52b2tlX2NtZCggY21kX2xvY2FsLT52YWx1ZSwgc2xvdCApOworCisgICAgLyogRnJlZSBvdXIgbG9jYWwgY29tbWFuZCBzdHJpbmcgY29weS4gKi8KKyAgICBzdHJpbmdfZnJlZSggY21kX2xvY2FsICk7Cit9CisKKworLyoKKyAqIGV4ZWNfd2FpdCgpIC0gd2FpdCBmb3IgYW55IG9mIHRoZSBhc3luYyBjb21tYW5kIHByb2Nlc3NlcyB0byB0ZXJtaW5hdGUKKyAqCisgKiBXYWl0IGFuZCBkcml2ZSBhdCBtb3N0IG9uZSBleGVjdXRpb24gY29tcGxldGlvbiwgd2hpbGUgcHJvY2Vzc2luZyB0aGUgSS9PIGZvcgorICogYWxsIG9uZ29pbmcgY29tbWFuZHMuCisgKi8KKwordm9pZCBleGVjX3dhaXQoKQoreworICAgIGludCBpID0gLTE7CisgICAgaW50IGV4aXRfcmVhc29uOyAgLyogcmVhc29uIHdoeSBhIGNvbW1hbmQgY29tcGxldGVkICovCisKKyAgICAvKiBXYWl0IGZvciBhIGNvbW1hbmQgdG8gY29tcGxldGUsIHdoaWxlIHNuYXJmaW5nIHVwIGFueSBvdXRwdXQuICovCisgICAgd2hpbGUgKCAxICkKKyAgICB7CisgICAgICAgIC8qIENoZWNrIGZvciBhIGNvbXBsZXRlIGNvbW1hbmQsIGJyaWVmbHkuICovCisgICAgICAgIGkgPSB0cnlfd2FpdCggNTAwICk7CisgICAgICAgIC8qIFJlYWQgaW4gdGhlIG91dHB1dCBvZiBhbGwgcnVubmluZyBjb21tYW5kcy4gKi8KKyAgICAgICAgcmVhZF9vdXRwdXQoKTsKKyAgICAgICAgLyogQ2xvc2Ugb3V0IHBlbmRpbmcgZGVidWcgc3R5bGUgZGlhbG9ncy4gKi8KKyAgICAgICAgY2xvc2VfYWxlcnRzKCk7CisgICAgICAgIC8qIFByb2Nlc3MgdGhlIGNvbXBsZXRlZCBjb21tYW5kIHdlIGZvdW5kLiAqLworICAgICAgICBpZiAoIGkgPj0gMCApIHsgZXhpdF9yZWFzb24gPSBFWElUX09LOyBicmVhazsgfQorICAgICAgICAvKiBDaGVjayBpZiBhIGNvbW1hbmQgcmFuIG91dCBvZiB0aW1lLiAqLworICAgICAgICBpID0gdHJ5X2tpbGxfb25lKCk7CisgICAgICAgIGlmICggaSA+PSAwICkgeyBleGl0X3JlYXNvbiA9IEVYSVRfVElNRU9VVDsgYnJlYWs7IH0KKyAgICB9CisKKyAgICAvKiBXZSBoYXZlIGEgY29tbWFuZC4uLiBwcm9jZXNzIGl0LiAqLworICAgIHsKKyAgICAgICAgRFdPUkQgZXhpdF9jb2RlOworICAgICAgICB0aW1pbmdfaW5mbyB0aW1lOworICAgICAgICBpbnQgcnN0YXQ7CisKKyAgICAgICAgLyogVGhlIHRpbWUgZGF0YSBmb3IgdGhlIGNvbW1hbmQuICovCisgICAgICAgIHJlY29yZF90aW1lcyggY21kdGFiWyBpIF0ucGkuaFByb2Nlc3MsICZ0aW1lICk7CisKKyAgICAgICAgLyogUmVtb3ZlZCB0aGUgdXNlZCB0ZW1wb3JhcnkgY29tbWFuZCBmaWxlLiAqLworICAgICAgICBpZiAoIGNtZHRhYlsgaSBdLmNvbW1hbmRfZmlsZS0+c2l6ZSApCisgICAgICAgICAgICB1bmxpbmsoIGNtZHRhYlsgaSBdLmNvbW1hbmRfZmlsZS0+dmFsdWUgKTsKKworICAgICAgICAvKiBGaW5kIG91dCB0aGUgcHJvY2VzcyBleGl0IGNvZGUuICovCisgICAgICAgIEdldEV4aXRDb2RlUHJvY2VzcyggY21kdGFiWyBpIF0ucGkuaFByb2Nlc3MsICZleGl0X2NvZGUgKTsKKworICAgICAgICAvKiBUaGUgZGlzcG9zc2l0aW9uIG9mIHRoZSBjb21tYW5kLiAqLworICAgICAgICBpZiAoIGludGVycnVwdGVkKCkgKQorICAgICAgICAgICAgcnN0YXQgPSBFWEVDX0NNRF9JTlRSOworICAgICAgICBlbHNlIGlmICggZXhpdF9jb2RlICkKKyAgICAgICAgICAgIHJzdGF0ID0gRVhFQ19DTURfRkFJTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnN0YXQgPSBFWEVDX0NNRF9PSzsKKworICAgICAgICAvKiBDYWxsIHRoZSBjYWxsYmFjaywgbWF5IGNhbGwgYmFjayB0byBqYW0gcnVsZSBsYW5kLiAqLworICAgICAgICAoKmNtZHRhYlsgaSBdLmZ1bmMpKCBjbWR0YWJbIGkgXS5jbG9zdXJlLCByc3RhdCwgJnRpbWUsCisgICAgICAgICAgICBjbWR0YWJbIGkgXS5idWZmZXJfb3V0LT52YWx1ZSwgY21kdGFiWyBpIF0uYnVmZmVyX2Vyci0+dmFsdWUsCisgICAgICAgICAgICBleGl0X3JlYXNvbiApOworCisgICAgICAgIC8qIENsZWFuIHVwIG91ciBjaGlsZCBwcm9jZXNzIHRyYWNraW5nIGRhdGEuIE5vIG5lZWQgdG8gY2xlYXIgdGhlCisgICAgICAgICAqIHRlbXBvcmFyeSBjb21tYW5kIGZpbGUgbmFtZSBhcyBpdCBnZXRzIHJldXNlZC4KKyAgICAgICAgICovCisgICAgICAgIGNsb3NlV2luSGFuZGxlKCAmY21kdGFiWyBpIF0ucGkuaFByb2Nlc3MgKTsKKyAgICAgICAgY2xvc2VXaW5IYW5kbGUoICZjbWR0YWJbIGkgXS5waS5oVGhyZWFkICk7CisgICAgICAgIGNsb3NlV2luSGFuZGxlKCAmY21kdGFiWyBpIF0ucGlwZV9vdXRbIEVYRUNDTURfUElQRV9SRUFEIF0gKTsKKyAgICAgICAgY2xvc2VXaW5IYW5kbGUoICZjbWR0YWJbIGkgXS5waXBlX291dFsgRVhFQ0NNRF9QSVBFX1dSSVRFIF0gKTsKKyAgICAgICAgY2xvc2VXaW5IYW5kbGUoICZjbWR0YWJbIGkgXS5waXBlX2VyclsgRVhFQ0NNRF9QSVBFX1JFQUQgXSApOworICAgICAgICBjbG9zZVdpbkhhbmRsZSggJmNtZHRhYlsgaSBdLnBpcGVfZXJyWyBFWEVDQ01EX1BJUEVfV1JJVEUgXSApOworICAgICAgICBzdHJpbmdfcmVuZXcoIGNtZHRhYlsgaSBdLmJ1ZmZlcl9vdXQgKTsKKyAgICAgICAgc3RyaW5nX3JlbmV3KCBjbWR0YWJbIGkgXS5idWZmZXJfZXJyICk7CisgICAgfQorfQorCisKKy8qIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gKi8KKworLyoKKyAqIEludm9rZSB0aGUgYWN0dWFsIGV4dGVybmFsIHByb2Nlc3MgdXNpbmcgdGhlIGdpdmVuIGNvbW1hbmQgbGluZS4gVHJhY2sgdGhlCisgKiBwcm9jZXNzIGluIG91ciBydW5uaW5nIGNvbW1hbmRzIHRhYmxlLgorICovCisKK3N0YXRpYyB2b2lkIGludm9rZV9jbWQoIGNoYXIgY29uc3QgKiBjb25zdCBjb21tYW5kLCBpbnQgY29uc3Qgc2xvdCApCit7CisgICAgU0VDVVJJVFlfQVRUUklCVVRFUyBzYSA9IHsgc2l6ZW9mKCBTRUNVUklUWV9BVFRSSUJVVEVTICksIDAsIDAgfTsKKyAgICBTRUNVUklUWV9ERVNDUklQVE9SIHNkOworICAgIFNUQVJUVVBJTkZPIHNpID0geyBzaXplb2YoIFNUQVJUVVBJTkZPICksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworICAgIC8qIEluaXQgdGhlIHNlY3VyaXR5IGRhdGEuICovCisgICAgSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvciggJnNkLCBTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OICk7CisgICAgU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbCggJnNkLCBUUlVFLCBOVUxMLCBGQUxTRSApOworICAgIHNhLmxwU2VjdXJpdHlEZXNjcmlwdG9yID0gJnNkOworICAgIHNhLmJJbmhlcml0SGFuZGxlID0gVFJVRTsKKworICAgIC8qIENyZWF0ZSBwaXBlcyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBjaGlsZCBwcm9jZXNzLiAqLworICAgIGlmICggIUNyZWF0ZVBpcGUoICZjbWR0YWJbIHNsb3QgXS5waXBlX291dFsgRVhFQ0NNRF9QSVBFX1JFQUQgXSwKKyAgICAgICAgJmNtZHRhYlsgc2xvdCBdLnBpcGVfb3V0WyBFWEVDQ01EX1BJUEVfV1JJVEUgXSwgJnNhLCAwICkgKQorICAgIHsKKyAgICAgICAgcmVwb3J0V2luZG93c0Vycm9yKCAiQ3JlYXRlUGlwZSIgKTsKKyAgICAgICAgZXhpdCggRVhJVEJBRCApOworICAgIH0KKyAgICBpZiAoIGdsb2JzLnBpcGVfYWN0aW9uICYmICFDcmVhdGVQaXBlKCAmY21kdGFiWyBzbG90IF0ucGlwZV9lcnJbCisgICAgICAgIEVYRUNDTURfUElQRV9SRUFEIF0sICZjbWR0YWJbIHNsb3QgXS5waXBlX2VyclsgRVhFQ0NNRF9QSVBFX1dSSVRFIF0sCisgICAgICAgICZzYSwgMCApICkKKyAgICB7CisgICAgICAgIHJlcG9ydFdpbmRvd3NFcnJvciggIkNyZWF0ZVBpcGUiICk7CisgICAgICAgIGV4aXQoIEVYSVRCQUQgKTsKKyAgICB9CisKKyAgICAvKiBTZXQgaGFuZGxlIGluaGVyaXRhbmNlIG9mZiBmb3IgdGhlIHBpcGUgZW5kcyB0aGUgcGFyZW50IHJlYWRzIGZyb20uICovCisgICAgU2V0SGFuZGxlSW5mb3JtYXRpb24oIGNtZHRhYlsgc2xvdCBdLnBpcGVfb3V0WyBFWEVDQ01EX1BJUEVfUkVBRCBdLAorICAgICAgICBIQU5ETEVfRkxBR19JTkhFUklULCAwICk7CisgICAgaWYgKCBnbG9icy5waXBlX2FjdGlvbiApCisgICAgICAgIFNldEhhbmRsZUluZm9ybWF0aW9uKCBjbWR0YWJbIHNsb3QgXS5waXBlX2VyclsgRVhFQ0NNRF9QSVBFX1JFQUQgXSwKKyAgICAgICAgICAgIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDAgKTsKKworICAgIC8qIEhpZGUgdGhlIGNoaWxkIHdpbmRvdywgaWYgYW55LiAqLworICAgIHNpLmR3RmxhZ3MgfD0gU1RBUlRGX1VTRVNIT1dXSU5ET1c7CisgICAgc2kud1Nob3dXaW5kb3cgPSBTV19ISURFOworCisgICAgLyogUmVkaXJlY3QgdGhlIGNoaWxkJ3Mgb3V0cHV0IHN0cmVhbXMgdG8gb3VyIHBpcGVzLiAqLworICAgIHNpLmR3RmxhZ3MgfD0gU1RBUlRGX1VTRVNUREhBTkRMRVM7CisgICAgc2kuaFN0ZE91dHB1dCA9IGNtZHRhYlsgc2xvdCBdLnBpcGVfb3V0WyBFWEVDQ01EX1BJUEVfV1JJVEUgXTsKKyAgICBzaS5oU3RkRXJyb3IgPSBnbG9icy5waXBlX2FjdGlvbgorICAgICAgICA/IGNtZHRhYlsgc2xvdCBdLnBpcGVfZXJyWyBFWEVDQ01EX1BJUEVfV1JJVEUgXQorICAgICAgICA6IGNtZHRhYlsgc2xvdCBdLnBpcGVfb3V0WyBFWEVDQ01EX1BJUEVfV1JJVEUgXTsKKworICAgIC8qIExldCB0aGUgY2hpbGQgaW5oZXJpdCBzdGRpbiwgYXMgc29tZSBjb21tYW5kcyBhc3N1bWUgaXQgaXMgYXZhaWxhYmxlLiAqLworICAgIHNpLmhTdGRJbnB1dCA9IEdldFN0ZEhhbmRsZSggU1REX0lOUFVUX0hBTkRMRSApOworCisgICAgLyogQ3JlYXRlIG91dHB1dCBidWZmZXJzLiAqLworICAgIHN0cmluZ19uZXcoIGNtZHRhYlsgc2xvdCBdLmJ1ZmZlcl9vdXQgKTsKKyAgICBzdHJpbmdfbmV3KCBjbWR0YWJbIHNsb3QgXS5idWZmZXJfZXJyICk7CisKKyAgICBpZiAoIERFQlVHX0VYRUNDTUQgKQorICAgICAgICBwcmludGYoICJDb21tYW5kIHN0cmluZyBmb3IgQ3JlYXRlUHJvY2Vzc0EoKTogJyVzJ1xuIiwgY29tbWFuZCApOworCisgICAgLyogUnVuIHRoZSBjb21tYW5kIGJ5IGNyZWF0aW5nIGEgc3ViLXByb2Nlc3MgZm9yIGl0LiAqLworICAgIGlmICggIUNyZWF0ZVByb2Nlc3NBKAorICAgICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAsICAvKiBhcHBsaWNhdGlvbiBuYW1lICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgKGNoYXIgKiljb21tYW5kICAgICAgICAgLCAgLyogY29tbWFuZCBsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICwgIC8qIHByb2Nlc3MgYXR0cmlidXRlcyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAsICAvKiB0aHJlYWQgYXR0cmlidXRlcyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgLCAgLyogaW5oZXJpdCBoYW5kbGVzICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIENSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCwgIC8qIGNyZWF0ZSBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAsICAvKiBlbnYgdmFycywgbnVsbCBpbmhlcml0cyBlbnYgICAgICAgICAgKi8KKyAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgLCAgLyogY3VycmVudCBkaXIsIG51bGwgaXMgb3VyIGN1cnJlbnQgZGlyICovCisgICAgICAgICZzaSAgICAgICAgICAgICAgICAgICAgICwgIC8qIHN0YXJ0dXAgaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAmY21kdGFiWyBzbG90IF0ucGkgKSApICAgICAvKiBjaGlsZCBwcm9jZXNzIGluZm8sIGlmIGNyZWF0ZWQgICAgICAgKi8KKyAgICB7CisgICAgICAgIHJlcG9ydFdpbmRvd3NFcnJvciggIkNyZWF0ZVByb2Nlc3NBIiApOworICAgICAgICBleGl0KCBFWElUQkFEICk7CisgICAgfQorfQorCisKKy8qCisgKiBGb3IgbW9yZSBkZXRhaWxzIG9uIFdpbmRvd3MgY21kLmV4ZSBzaGVsbCBjb21tYW5kLWxpbmUgbGVuZ3RoIGxpbWl0YXRpb25zIHNlZQorICogdGhlIGZvbGxvd2luZyBNU0ROIGFydGljbGU6CisgKiAgICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9kZWZhdWx0LmFzcHg/c2NpZD1rYjtlbi11czs4MzA0NzMKKyAqLworCitzdGF0aWMgaW50IHJhd19tYXhsaW5lKCkKK3sKKyAgICBPU1ZFUlNJT05JTkZPIG9zX2luZm87CisgICAgb3NfaW5mby5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKCBvc19pbmZvICk7CisgICAgR2V0VmVyc2lvbkV4KCAmb3NfaW5mbyApOworCisgICAgaWYgKCBvc19pbmZvLmR3TWFqb3JWZXJzaW9uID49IDUgKSByZXR1cm4gODE5MTsgIC8qIFhQICAgICAgICovCisgICAgaWYgKCBvc19pbmZvLmR3TWFqb3JWZXJzaW9uID09IDQgKSByZXR1cm4gMjA0NzsgIC8qIE5UIDQueCAgICovCisgICAgcmV0dXJuIDk5NjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5UIDMuNS4xICovCit9CisKK3N0YXRpYyBpbnQgbWF4bGluZSgpCit7CisgICAgc3RhdGljIHJlc3VsdDsKKyAgICBpZiAoICFyZXN1bHQgKSByZXN1bHQgPSByYXdfbWF4bGluZSgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIENsb3NlcyBhIFdpbmRvd3MgSEFORExFIGFuZCByZXNldHMgaXRzIHZhcmlhYmxlIHRvIDAuCisgKi8KKworc3RhdGljIHZvaWQgY2xvc2VXaW5IYW5kbGUoIEhBTkRMRSAqIGNvbnN0IGhhbmRsZSApCit7CisgICAgaWYgKCAqaGFuZGxlICkKKyAgICB7CisgICAgICAgIENsb3NlSGFuZGxlKCAqaGFuZGxlICk7CisgICAgICAgICpoYW5kbGUgPSAwOworICAgIH0KK30KKworCisvKgorICogRnJlZXMgYW5kIHJlbmV3cyB0aGUgZ2l2ZW4gc3RyaW5nLgorICovCisKK3N0YXRpYyB2b2lkIHN0cmluZ19yZW5ldyggc3RyaW5nICogY29uc3QgcyApCit7CisgICAgc3RyaW5nX2ZyZWUoIHMgKTsKKyAgICBzdHJpbmdfbmV3KCBzICk7Cit9CisKKworLyoKKyAqIHJhd19jb21tYW5kX2xlbmd0aCgpIC0gdmFsaWQgcmF3IGNvbW1hbmQgc3RyaW5nIGxlbmd0aAorICoKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBjb21tYW5kIG1heSBiZSBleGVjdXRlZCBhcyBhIHJhdyBjb21tYW5kLiBJZiB5ZXMsCisgKiByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1hbmQgc3RyaW5nIGxlbmd0aC4gSWYgbm90LCByZXR1cm5zIC0xLgorICoKKyAqIFJ1bGVzIGZvciBjb25zdHJ1Y3RpbmcgcmF3IGNvbW1hbmQgc3RyaW5nczoKKyAqICAgLSBDb21tYW5kIG1heSBub3QgY29udGFpbiB1bnF1b3RlZCBzaGVsbCBJL08gcmVkaXJlY3Rpb24gY2hhcmFjdGVycy4KKyAqICAgLSBNYXkgaGF2ZSBhdCBtb3N0IG9uZSBjb21tYW5kIGxpbmUgd2l0aCBub24td2hpdGVzcGFjZSBjb250ZW50LgorICogICAtIExlYWRpbmcgd2hpdGVzcGFjZSB0cmltbWVkLgorICogICAtIFRyYWlsaW5nIGFsbC13aGl0ZXNwYWNlIGxpbmVzIHRyaW1tZWQuCisgKiAgIC0gVHJhaWxpbmcgd2hpdGVzcGFjZSBvbiB0aGUgc29sZSBjb21tYW5kIGxpbmUga2VwdCAobWF5IHRoZW9yZXRpY2FsbHkKKyAqICAgICBhZmZlY3QgdGhlIGV4ZWN1dGVkIGNvbW1hbmQpLgorICovCisKK3N0YXRpYyBsb25nIHJhd19jb21tYW5kX2xlbmd0aCggY2hhciBjb25zdCAqIGNvbW1hbmQgKQoreworICAgIGNoYXIgY29uc3QgKiBwOworICAgIGNoYXIgY29uc3QgKiBlc2NhcGUgPSAwOworICAgIGNoYXIgaW5xdW90ZSA9IDA7CisgICAgY2hhciBjb25zdCAqIG5ld2xpbmUgPSAwOworCisgICAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICovCisgICAgd2hpbGUgKCBpc3NwYWNlKCAqY29tbWFuZCApICkKKyAgICAgICAgKytjb21tYW5kOworCisgICAgcCA9IGNvbW1hbmQ7CisKKyAgICAvKiBMb29rIGZvciBuZXdsaW5lcyBhbmQgdW5xdW90ZWQgSS9PIHJlZGlyZWN0aW9uLiAqLworICAgIGRvCisgICAgeworICAgICAgICBwICs9IHN0cmNzcG4oIHAsICJcblwiJzw+fFxcIiApOworICAgICAgICBzd2l0Y2ggKCAqcCApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgLyogSWYgb3VyIGNvbW1hbmQgY29udGFpbnMgbm9uLXdoaXRlc3BhY2UgY29udGVudCBzcGxpdCBvdmVyCisgICAgICAgICAgICAgKiBtdWx0aXBsZSBsaW5lcyB3ZSBjYW4gbm90IGV4ZWN1dGUgaXQgZGlyZWN0bHkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG5ld2xpbmUgPSBwOworICAgICAgICAgICAgd2hpbGUgKCBpc3NwYWNlKCAqKytwICkgKTsKKyAgICAgICAgICAgIGlmICggKnAgKSByZXR1cm4gLTE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICBlc2NhcGUgPSBlc2NhcGUgJiYgZXNjYXBlID09IHAgLSAxID8gMCA6IHA7CisgICAgICAgICAgICArK3A7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgaWYgKCBlc2NhcGUgJiYgZXNjYXBlID09IHAgLSAxICkKKyAgICAgICAgICAgICAgICBlc2NhcGUgPSAwOworICAgICAgICAgICAgZWxzZSBpZiAoIGlucXVvdGUgPT0gKnAgKQorICAgICAgICAgICAgICAgIGlucXVvdGUgPSAwOworICAgICAgICAgICAgZWxzZSBpZiAoICFpbnF1b3RlICkKKyAgICAgICAgICAgICAgICBpbnF1b3RlID0gKnA7CisgICAgICAgICAgICArK3A7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgY2FzZSAnPic6CisgICAgICAgIGNhc2UgJ3wnOgorICAgICAgICAgICAgaWYgKCAhaW5xdW90ZSApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgKytwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKCAqcCApOworCisgICAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGUgY29tbWFuZCB3aWxsIG9jY3VweS4gKi8KKyAgICByZXR1cm4gKCBuZXdsaW5lID8gbmV3bGluZSA6IHAgKSAtIGNvbW1hbmQ7Cit9CisKKworLyogNjQtYml0IGFyaXRobWV0aWMgaGVscGVycy4gKi8KKworLyogQ29tcHV0ZSB0aGUgY2FycnkgYml0IGZyb20gdGhlIGFkZGl0aW9uIG9mIHR3byAzMi1iaXQgdW5zaWduZWQgbnVtYmVycy4gKi8KKyNkZWZpbmUgYWRkX2NhcnJ5X2JpdCggYSwgYiApICgoKChhKSB8IChiKSkgPj4gMzEpICYgKH4oKGEpICsgKGIpKSA+PiAzMSkgJiAweDEpCisKKy8qIENvbXB1dGUgdGhlIGhpZ2ggMzIgYml0cyBvZiB0aGUgYWRkaXRpb24gb2YgdHdvIDY0LWJpdCB1bnNpZ25lZCBudW1iZXJzLCBoMWwxCisgKiBhbmQgaDJsMi4KKyAqLworI2RlZmluZSBhZGRfNjRfaGkoIGgxLCBsMSwgaDIsIGwyICkgKChoMSkgKyAoaDIpICsgYWRkX2NhcnJ5X2JpdChsMSwgbDIpKQorCisKKy8qCisgKiBBZGQgdHdvIDY0LWJpdCB1bnNpZ25lZCBudW1iZXJzLCBoMWwxIGFuZCBoMmwyLgorICovCisKK3N0YXRpYyBGSUxFVElNRSBhZGRfNjQKKygKKyAgICB1bnNpZ25lZCBsb25nIGgxLCB1bnNpZ25lZCBsb25nIGwxLAorICAgIHVuc2lnbmVkIGxvbmcgaDIsIHVuc2lnbmVkIGxvbmcgbDIKKykKK3sKKyAgICBGSUxFVElNRSByZXN1bHQ7CisgICAgcmVzdWx0LmR3TG93RGF0ZVRpbWUgPSBsMSArIGwyOworICAgIHJlc3VsdC5kd0hpZ2hEYXRlVGltZSA9IGFkZF82NF9oaSggaDEsIGwxLCBoMiwgbDIgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBGSUxFVElNRSBhZGRfRklMRVRJTUUoIEZJTEVUSU1FIHQxLCBGSUxFVElNRSB0MiApCit7CisgICAgcmV0dXJuIGFkZF82NCggdDEuZHdIaWdoRGF0ZVRpbWUsIHQxLmR3TG93RGF0ZVRpbWUsIHQyLmR3SGlnaERhdGVUaW1lLAorICAgICAgICB0Mi5kd0xvd0RhdGVUaW1lICk7Cit9CisKKworc3RhdGljIEZJTEVUSU1FIG5lZ2F0ZV9GSUxFVElNRSggRklMRVRJTUUgdCApCit7CisgICAgLyogMnMgY29tcGxlbWVudCBuZWdhdGlvbiAqLworICAgIHJldHVybiBhZGRfNjQoIH50LmR3SGlnaERhdGVUaW1lLCB+dC5kd0xvd0RhdGVUaW1lLCAwLCAxICk7Cit9CisKKworLyoKKyAqIGZpbGV0aW1lX3RvX3NlY29uZHMoKSAtIFdpbmRvd3MgRklMRVRJTUUgLS0+IG51bWJlciBvZiBzZWNvbmRzIGNvbnZlcnNpb24KKyAqLworCitzdGF0aWMgZG91YmxlIGZpbGV0aW1lX3RvX3NlY29uZHMoIEZJTEVUSU1FIGNvbnN0IGZ0ICkKK3sKKyAgICByZXR1cm4gZnQuZHdIaWdoRGF0ZVRpbWUgKiAoIChkb3VibGUpKCAxVUwgPDwgMzEgKSAqIDIuMCAqIDEuMGUtNyApICsKKyAgICAgICAgZnQuZHdMb3dEYXRlVGltZSAqIDEuMGUtNzsKK30KKworCitzdGF0aWMgdm9pZCByZWNvcmRfdGltZXMoIEhBTkRMRSBjb25zdCBwcm9jZXNzLCB0aW1pbmdfaW5mbyAqIGNvbnN0IHRpbWUgKQoreworICAgIEZJTEVUSU1FIGNyZWF0aW9uOworICAgIEZJTEVUSU1FIGV4aXQ7CisgICAgRklMRVRJTUUga2VybmVsOworICAgIEZJTEVUSU1FIHVzZXI7CisgICAgaWYgKCBHZXRQcm9jZXNzVGltZXMoIHByb2Nlc3MsICZjcmVhdGlvbiwgJmV4aXQsICZrZXJuZWwsICZ1c2VyICkgKQorICAgIHsKKyAgICAgICAgdGltZS0+c3lzdGVtID0gZmlsZXRpbWVfdG9fc2Vjb25kcygga2VybmVsICk7CisgICAgICAgIHRpbWUtPnVzZXIgPSBmaWxldGltZV90b19zZWNvbmRzKCB1c2VyICk7CisgICAgICAgIHRpbWVzdGFtcF9mcm9tX2ZpbGV0aW1lKCAmdGltZS0+c3RhcnQsICZjcmVhdGlvbiApOworICAgICAgICB0aW1lc3RhbXBfZnJvbV9maWxldGltZSggJnRpbWUtPmVuZCwgJmV4aXQgKTsKKyAgICB9Cit9CisKKworI2RlZmluZSBJT19CVUZGRVJfU0laRSAoIDE2ICogMTAyNCApCisKK3N0YXRpYyBjaGFyIGlvQnVmZmVyWyBJT19CVUZGRVJfU0laRSArIDEgXTsKKworCitzdGF0aWMgdm9pZCByZWFkX3BpcGUKKygKKyAgICBIQU5ETEUgICBpbiwgIC8qIHRoZSBwaXBlIHRvIHJlYWQgZnJvbSAqLworICAgIHN0cmluZyAqIG91dAorKQoreworICAgIERXT1JEIGJ5dGVzSW5CdWZmZXIgPSAwOworICAgIERXT1JEIGJ5dGVzQXZhaWxhYmxlID0gMDsKKworICAgIGRvCisgICAgeworICAgICAgICAvKiBjaGVjayBpZiB3ZSBoYXZlIGFueSBkYXRhIHRvIHJlYWQgKi8KKyAgICAgICAgaWYgKCAhUGVla05hbWVkUGlwZSggaW4sIGlvQnVmZmVyLCBJT19CVUZGRVJfU0laRSwgJmJ5dGVzSW5CdWZmZXIsCisgICAgICAgICAgICAmYnl0ZXNBdmFpbGFibGUsIE5VTEwgKSApCisgICAgICAgICAgICBieXRlc0F2YWlsYWJsZSA9IDA7CisKKyAgICAgICAgLyogcmVhZCBpbiB0aGUgYXZhaWxhYmxlIGRhdGEgKi8KKyAgICAgICAgaWYgKCBieXRlc0F2YWlsYWJsZSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBvbmx5IHJlYWQgaW4gdGhlIGF2YWlsYWJsZSBieXRlcywgdG8gYXZvaWQgYmxvY2tpbmcgKi8KKyAgICAgICAgICAgIGlmICggUmVhZEZpbGUoIGluLCBpb0J1ZmZlciwgYnl0ZXNBdmFpbGFibGUgPD0gSU9fQlVGRkVSX1NJWkUgPworICAgICAgICAgICAgICAgIGJ5dGVzQXZhaWxhYmxlIDogSU9fQlVGRkVSX1NJWkUsICZieXRlc0luQnVmZmVyLCBOVUxMICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggYnl0ZXNJbkJ1ZmZlciA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ2xlYW4gdXAgc29tZSBpbGxlZ2FsIGNoYXJzLiAqLworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBieXRlc0luQnVmZmVyOyArK2kgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggKHVuc2lnbmVkIGNoYXIpaW9CdWZmZXJbIGkgXSA8IDEgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9CdWZmZXJbIGkgXSA9ICc/JzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBOdWxsLCB0ZXJtaW5hdGUuICovCisgICAgICAgICAgICAgICAgICAgIGlvQnVmZmVyWyBieXRlc0luQnVmZmVyIF0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICAvKiBBcHBlbmQgdG8gdGhlIG91dHB1dC4gKi8KKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggb3V0LCBpb0J1ZmZlciApOworICAgICAgICAgICAgICAgICAgICAvKiBTdWJ0cmFjdCB3aGF0IHdlIHJlYWQgaW4uICovCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzQXZhaWxhYmxlIC09IGJ5dGVzSW5CdWZmZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIExpa2VseSByZWFkIGEgZXJyb3IsIGJhaWwgb3V0LiAqLworICAgICAgICAgICAgICAgICAgICBieXRlc0F2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIERlZmluaXRlbHkgcmVhZCBhIGVycm9yLCBiYWlsIG91dC4gKi8KKyAgICAgICAgICAgICAgICBieXRlc0F2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKCBieXRlc0F2YWlsYWJsZSA+IDAgKTsKK30KKworCitzdGF0aWMgdm9pZCByZWFkX291dHB1dCgpCit7CisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBnbG9icy5qb2JzOyArK2kgKQorICAgICAgICBpZiAoIGNtZHRhYlsgaSBdLnBpLmhQcm9jZXNzICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVhZCBzdGRvdXQgZGF0YS4gKi8KKyAgICAgICAgICAgIGlmICggY21kdGFiWyBpIF0ucGlwZV9vdXRbIEVYRUNDTURfUElQRV9SRUFEIF0gKQorICAgICAgICAgICAgICAgIHJlYWRfcGlwZSggY21kdGFiWyBpIF0ucGlwZV9vdXRbIEVYRUNDTURfUElQRV9SRUFEIF0sCisgICAgICAgICAgICAgICAgICAgIGNtZHRhYlsgaSBdLmJ1ZmZlcl9vdXQgKTsKKyAgICAgICAgICAgIC8qIFJlYWQgc3RkZXJyIGRhdGEuICovCisgICAgICAgICAgICBpZiAoIGNtZHRhYlsgaSBdLnBpcGVfZXJyWyBFWEVDQ01EX1BJUEVfUkVBRCBdICkKKyAgICAgICAgICAgICAgICByZWFkX3BpcGUoIGNtZHRhYlsgaSBdLnBpcGVfZXJyWyBFWEVDQ01EX1BJUEVfUkVBRCBdLAorICAgICAgICAgICAgICAgICAgICBjbWR0YWJbIGkgXS5idWZmZXJfZXJyICk7CisgICAgICAgIH0KK30KKworCisvKgorICogV2FpdHMgZm9yIGEgc2luZ2xlIGNoaWxkIHByb2Nlc3MgY29tbWFuZCB0byBjb21wbGV0ZSwgb3IgdGhlIHRpbWVvdXQsCisgKiB3aGljaGV2ZXIgY29tZXMgZmlyc3QuIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjb21wbGV0ZWQgY29tbWFuZCBpbiB0aGUKKyAqIGNtZHRhYiBhcnJheSwgb3IgLTEuCisgKi8KKworc3RhdGljIGludCB0cnlfd2FpdCggaW50IGNvbnN0IHRpbWVvdXRNaWxsaXMgKQoreworICAgIGludCBpOworICAgIGludCBudW1fYWN0aXZlOworICAgIGludCB3YWl0X2FwaV9yZXN1bHQ7CisgICAgSEFORExFIGFjdGl2ZV9oYW5kbGVzWyBNQVhKT0JTIF07CisgICAgaW50IGFjdGl2ZV9wcm9jc1sgTUFYSk9CUyBdOworCisgICAgLyogUHJlcGFyZSBhIGxpc3Qgb2YgYWxsIGFjdGl2ZSBwcm9jZXNzZXMgdG8gd2FpdCBmb3IuICovCisgICAgZm9yICggbnVtX2FjdGl2ZSA9IDAsIGkgPSAwOyBpIDwgZ2xvYnMuam9iczsgKytpICkKKyAgICAgICAgaWYgKCBjbWR0YWJbIGkgXS5waS5oUHJvY2VzcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFjdGl2ZV9oYW5kbGVzWyBudW1fYWN0aXZlIF0gPSBjbWR0YWJbIGkgXS5waS5oUHJvY2VzczsKKyAgICAgICAgICAgIGFjdGl2ZV9wcm9jc1sgbnVtX2FjdGl2ZSBdID0gaTsKKyAgICAgICAgICAgICsrbnVtX2FjdGl2ZTsKKyAgICAgICAgfQorCisgICAgLyogV2FpdCBmb3IgYSBjaGlsZCB0byBjb21wbGV0ZSwgb3IgZm9yIG91ciB0aW1lb3V0IHdpbmRvdyB0byBleHBpcmUuICovCisgICAgd2FpdF9hcGlfcmVzdWx0ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyggbnVtX2FjdGl2ZSwgYWN0aXZlX2hhbmRsZXMsCisgICAgICAgIEZBTFNFLCB0aW1lb3V0TWlsbGlzICk7CisgICAgaWYgKCAoIFdBSVRfT0JKRUNUXzAgPD0gd2FpdF9hcGlfcmVzdWx0ICkgJiYKKyAgICAgICAgKCB3YWl0X2FwaV9yZXN1bHQgPCBXQUlUX09CSkVDVF8wICsgbnVtX2FjdGl2ZSApICkKKyAgICB7CisgICAgICAgIC8qIFRlcm1pbmF0ZWQgcHJvY2VzcyBkZXRlY3RlZCAtIHJldHVybiBpdHMgaW5kZXguICovCisgICAgICAgIHJldHVybiBhY3RpdmVfcHJvY3NbIHdhaXRfYXBpX3Jlc3VsdCAtIFdBSVRfT0JKRUNUXzAgXTsKKyAgICB9CisKKyAgICAvKiBUaW1lb3V0LiAqLworICAgIHJldHVybiAtMTsKK30KKworCitzdGF0aWMgaW50IHRyeV9raWxsX29uZSgpCit7CisgICAgLyogT25seSBuZWVkIHRvIGNoZWNrIGlmIGEgdGltZW91dCB3YXMgc3BlY2lmaWVkIHdpdGggdGhlIC1sIG9wdGlvbi4gKi8KKyAgICBpZiAoIGdsb2JzLnRpbWVvdXQgPiAwICkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGdsb2JzLmpvYnM7ICsraSApCisgICAgICAgICAgICBpZiAoIGNtZHRhYlsgaSBdLnBpLmhQcm9jZXNzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgY29uc3QgdCA9IHJ1bm5pbmdfdGltZSggY21kdGFiWyBpIF0ucGkuaFByb2Nlc3MgKTsKKyAgICAgICAgICAgICAgICBpZiAoIHQgPiAoZG91YmxlKWdsb2JzLnRpbWVvdXQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhlIGpvYiBtYXkgaGF2ZSBsZWZ0IGFuIGFsZXJ0IGRpYWxvZyBhcm91bmQsIHRyeSBhbmQgZ2V0CisgICAgICAgICAgICAgICAgICAgICAqIHJpZCBvZiBpdCBiZWZvcmUga2lsbGluZyB0aGUgam9iIGl0c2VsZi4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGNsb3NlX2FsZXJ0KCAmY21kdGFiWyBpIF0ucGkgKTsKKyAgICAgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBhICJydW5hd2F5IiBqb2IsIGtpbGwgaXQuICovCisgICAgICAgICAgICAgICAgICAgIGtpbGxfcHJvY2Vzc190cmVlKCBjbWR0YWJbIGkgXS5waS5kd1Byb2Nlc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZHRhYlsgaSBdLnBpLmhQcm9jZXNzICk7CisgICAgICAgICAgICAgICAgICAgIC8qIEFuZCByZXR1cm4gaXRzIHJ1bm5pbmcgY29tbWFuZHMgdGFibGUgc2xvdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKworc3RhdGljIHZvaWQgY2xvc2VfYWxlcnRzKCkKK3sKKyAgICAvKiBXZSBvbmx5IGF0dGVtcHQgdGhpcyBldmVyeSA1IHNlY29uZHMgb3Igc28sIGJlY2F1c2UgaXQgaXMgbm90IGEgY2hlYXAKKyAgICAgKiBvcGVyYXRpb24sIGFuZCB3ZSB3aWxsIGNhdGNoIHRoZSBhbGVydHMgZXZlbnR1YWxseS4gVGhpcyBjaGVjayB1c2VzCisgICAgICogZmxvYXRzIGFzIHNvbWUgY29tcGlsZXJzIGRlZmluZSBDTE9DS1NfUEVSX1NFQyBhcyBhIGZsb2F0IG9yIGRvdWJsZS4KKyAgICAgKi8KKyAgICBpZiAoICggKGZsb2F0KWNsb2NrKCkgLyAoZmxvYXQpKCBDTE9DS1NfUEVSX1NFQyAqIDUgKSApIDwgKCAxLjAgLyA1LjAgKSApCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBnbG9icy5qb2JzOyArK2kgKQorICAgICAgICAgICAgaWYgKCBjbWR0YWJbIGkgXS5waS5oUHJvY2VzcyApCisgICAgICAgICAgICAgICAgY2xvc2VfYWxlcnQoICZjbWR0YWJbIGkgXS5waSApOworICAgIH0KK30KKworCisvKgorICogQ2FsYyB0aGUgY3VycmVudCBydW5uaW5nIHRpbWUgb2YgYW4gKmFjdGl2ZSogcHJvY2Vzcy4KKyAqLworCitzdGF0aWMgZG91YmxlIHJ1bm5pbmdfdGltZSggSEFORExFIGNvbnN0IHByb2Nlc3MgKQoreworICAgIEZJTEVUSU1FIGNyZWF0aW9uOworICAgIEZJTEVUSU1FIGV4aXQ7CisgICAgRklMRVRJTUUga2VybmVsOworICAgIEZJTEVUSU1FIHVzZXI7CisgICAgaWYgKCBHZXRQcm9jZXNzVGltZXMoIHByb2Nlc3MsICZjcmVhdGlvbiwgJmV4aXQsICZrZXJuZWwsICZ1c2VyICkgKQorICAgIHsKKyAgICAgICAgLyogQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lLiAqLworICAgICAgICBGSUxFVElNRSBjdXJyZW50OworICAgICAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSggJmN1cnJlbnQgKTsKKyAgICAgICAgcmV0dXJuIGZpbGV0aW1lX3RvX3NlY29uZHMoIGFkZF9GSUxFVElNRSggY3VycmVudCwKKyAgICAgICAgICAgIG5lZ2F0ZV9GSUxFVElNRSggY3JlYXRpb24gKSApICk7CisgICAgfQorICAgIHJldHVybiAwLjA7Cit9CisKKworLyoKKyAqIE5vdCByZWFsbHkgb3B0aW1hbCwgb3IgZWZmaWNpZW50LCBidXQgaXQgaXMgZWFzaWVyIHRoaXMgd2F5LCBhbmQgaXQgaXMgbm90CisgKiBsaWtlIHdlIGFyZSBnb2luZyB0byBiZSBraWxsaW5nIHRob3VzYW5kcywgb3IgZXZlbiB0ZW5zIG9mIHByb2Nlc3Nlcy4KKyAqLworCitzdGF0aWMgdm9pZCBraWxsX3Byb2Nlc3NfdHJlZSggRFdPUkQgY29uc3QgcGlkLCBIQU5ETEUgY29uc3QgcHJvY2VzcyApCit7CisgICAgSEFORExFIGNvbnN0IHByb2Nlc3Nfc25hcHNob3RfaCA9IENyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdCgKKyAgICAgICAgVEgzMkNTX1NOQVBQUk9DRVNTLCAwICk7CisgICAgaWYgKCBJTlZBTElEX0hBTkRMRV9WQUxVRSAhPSBwcm9jZXNzX3NuYXBzaG90X2ggKQorICAgIHsKKyAgICAgICAgQk9PTCBvayA9IFRSVUU7CisgICAgICAgIFBST0NFU1NFTlRSWTMyIHBpbmZvOworICAgICAgICBwaW5mby5kd1NpemUgPSBzaXplb2YoIFBST0NFU1NFTlRSWTMyICk7CisgICAgICAgIGZvciAoCisgICAgICAgICAgICBvayA9IFByb2Nlc3MzMkZpcnN0KCBwcm9jZXNzX3NuYXBzaG90X2gsICZwaW5mbyApOworICAgICAgICAgICAgb2sgPT0gVFJVRTsKKyAgICAgICAgICAgIG9rID0gUHJvY2VzczMyTmV4dCggcHJvY2Vzc19zbmFwc2hvdF9oLCAmcGluZm8gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcGluZm8udGgzMlBhcmVudFByb2Nlc3NJRCA9PSBwaWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEZvdW5kIGEgY2hpbGQsIHJlY3Vyc2UgdG8ga2lsbCBpdCBhbmQgYW55dGhpbmcgZWxzZSBiZWxvdyBpdC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBIQU5ETEUgY29uc3QgcGggPSBPcGVuUHJvY2VzcyggUFJPQ0VTU19BTExfQUNDRVNTLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgcGluZm8udGgzMlByb2Nlc3NJRCApOworICAgICAgICAgICAgICAgIGlmICggcGggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga2lsbF9wcm9jZXNzX3RyZWUoIHBpbmZvLnRoMzJQcm9jZXNzSUQsIHBoICk7CisgICAgICAgICAgICAgICAgICAgIENsb3NlSGFuZGxlKCBwaCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDbG9zZUhhbmRsZSggcHJvY2Vzc19zbmFwc2hvdF9oICk7CisgICAgfQorICAgIC8qIE5vdyB0aGF0IHRoZSBjaGlsZHJlbiBhcmUgYWxsIGRlYWQsIGtpbGwgdGhlIHJvb3QuICovCisgICAgVGVybWluYXRlUHJvY2VzcyggcHJvY2VzcywgLTIgKTsKK30KKworCitzdGF0aWMgZG91YmxlIGNyZWF0aW9uX3RpbWUoIEhBTkRMRSBjb25zdCBwcm9jZXNzICkKK3sKKyAgICBGSUxFVElNRSBjcmVhdGlvbjsKKyAgICBGSUxFVElNRSBleGl0OworICAgIEZJTEVUSU1FIGtlcm5lbDsKKyAgICBGSUxFVElNRSB1c2VyOworICAgIHJldHVybiBHZXRQcm9jZXNzVGltZXMoIHByb2Nlc3MsICZjcmVhdGlvbiwgJmV4aXQsICZrZXJuZWwsICZ1c2VyICkKKyAgICAgICAgPyBmaWxldGltZV90b19zZWNvbmRzKCBjcmVhdGlvbiApCisgICAgICAgIDogMC4wOworfQorCisKKy8qCisgKiBSZWN1cnNpdmUgY2hlY2sgaWYgZmlyc3QgcHJvY2VzcyBpcyBwYXJlbnQgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIG9mIHRoZQorICogc2Vjb25kIG9uZS4gQm90aCBwcm9jZXNzZXMgYXJlIHBhc3NlZCBhcyBwcm9jZXNzIGlkcywgbm90IGhhbmRsZXMuIFNwZWNpYWwKKyAqIHJldHVybiB2YWx1ZSAyIG1lYW5zIHRoYXQgdGhlIHNlY29uZCBwcm9jZXNzIGlzIHNtc3MuZXhlIGFuZCBpdHMgcGFyZW50CisgKiBwcm9jZXNzIGlzIFN5c3RlbSAoZmlyc3QgYXJndW1lbnQgaXMgaWdub3JlZCkuCisgKi8KKworc3RhdGljIGludCBpc19wYXJlbnRfY2hpbGQoIERXT1JEIGNvbnN0IHBhcmVudCwgRFdPUkQgY29uc3QgY2hpbGQgKQoreworICAgIEhBTkRMRSBwcm9jZXNzX3NuYXBzaG90X2ggPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKworICAgIGlmICggIWNoaWxkICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBwYXJlbnQgPT0gY2hpbGQgKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHByb2Nlc3Nfc25hcHNob3RfaCA9IENyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdCggVEgzMkNTX1NOQVBQUk9DRVNTLCAwICk7CisgICAgaWYgKCBJTlZBTElEX0hBTkRMRV9WQUxVRSAhPSBwcm9jZXNzX3NuYXBzaG90X2ggKQorICAgIHsKKyAgICAgICAgQk9PTCBvayA9IFRSVUU7CisgICAgICAgIFBST0NFU1NFTlRSWTMyIHBpbmZvOworICAgICAgICBwaW5mby5kd1NpemUgPSBzaXplb2YoIFBST0NFU1NFTlRSWTMyICk7CisgICAgICAgIGZvciAoCisgICAgICAgICAgICBvayA9IFByb2Nlc3MzMkZpcnN0KCBwcm9jZXNzX3NuYXBzaG90X2gsICZwaW5mbyApOworICAgICAgICAgICAgb2sgPT0gVFJVRTsKKyAgICAgICAgICAgIG9rID0gUHJvY2VzczMyTmV4dCggcHJvY2Vzc19zbmFwc2hvdF9oLCAmcGluZm8gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcGluZm8udGgzMlByb2Nlc3NJRCA9PSBjaGlsZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVW5mb3J0dW5hdGVseSwgcHJvY2VzcyBpZHMgYXJlIG5vdCByZWFsbHkgdW5pcXVlLiBUaGVyZSBtaWdodAorICAgICAgICAgICAgICAgICAqIGJlIHNwdXJpb3VzICJwYXJlbnQgYW5kIGNoaWxkIiByZWxhdGlvbnNoaXAgbWF0Y2ggYmV0d2VlbiB0d28KKyAgICAgICAgICAgICAgICAgKiBub24tcmVsYXRlZCBwcm9jZXNzZXMgaWYgcmVhbCBwYXJlbnQgcHJvY2VzcyBvZiBhIGdpdmVuCisgICAgICAgICAgICAgICAgICogcHJvY2VzcyBoYXMgZXhpdGVkICh3aGlsZSBjaGlsZCBwcm9jZXNzIGtlcHQgcnVubmluZyBhcyBhbgorICAgICAgICAgICAgICAgICAqICJvcnBoYW4iKSBhbmQgdGhlIHByb2Nlc3MgaWQgb2Ygc3VjaCBwYXJlbnQgcHJvY2VzcyBoYXMgYmVlbgorICAgICAgICAgICAgICAgICAqIHJldXNlZCBieSBpbnRlcm5hbHMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2hlbiBjcmVhdGluZworICAgICAgICAgICAgICAgICAqIGFub3RoZXIgcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIFRodXMgYW4gYWRkaXRpb25hbCBjaGVjayBpcyBuZWVkZWQgLSBwcm9jZXNzIGNyZWF0aW9uIHRpbWUuCisgICAgICAgICAgICAgICAgICogVGhpcyBjaGVjayBtYXkgZmFpbCAoaS5lLiByZXR1cm4gMCkgZm9yIHN5c3RlbSBwcm9jZXNzZXMgZHVlCisgICAgICAgICAgICAgICAgICogdG8gaW5zdWZmaWNpZW50IHByaXZpbGVnZXMsIGFuZCB0aGF0IGlzIE9LLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGRvdWJsZSB0Y2hpbGQgPSAwLjA7CisgICAgICAgICAgICAgICAgZG91YmxlIHRwYXJlbnQgPSAwLjA7CisgICAgICAgICAgICAgICAgSEFORExFIGNvbnN0IGhjaGlsZCA9IE9wZW5Qcm9jZXNzKCBQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OLAorICAgICAgICAgICAgICAgICAgICBGQUxTRSwgcGluZm8udGgzMlByb2Nlc3NJRCApOworICAgICAgICAgICAgICAgIENsb3NlSGFuZGxlKCBwcm9jZXNzX3NuYXBzaG90X2ggKTsKKworICAgICAgICAgICAgICAgIC8qIGNzcnNzLmV4ZSBtYXkgZGlzcGxheSBtZXNzYWdlIGJveCBsaWtlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICAgKiAgIHh5ei5leGUgLSBVbmFibGUgVG8gTG9jYXRlIENvbXBvbmVudAorICAgICAgICAgICAgICAgICAqICAgVGhpcyBhcHBsaWNhdGlvbiBoYXMgZmFpbGVkIHRvIHN0YXJ0IGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgKiAgIGJvb3N0X2Zvby1iYXIuZGxsIHdhcyBub3QgZm91bmQuIFJlLWluc3RhbGxpbmcgdGhlCisgICAgICAgICAgICAgICAgICogICBhcHBsaWNhdGlvbiBtYXkgZml4IHRoZSBwcm9ibGVtCisgICAgICAgICAgICAgICAgICogVGhpcyBhY3R1YWxseSBoYXBwZW5zIHdoZW4gc3RhcnRpbmcgYSB0ZXN0IHByb2Nlc3MgdGhhdAorICAgICAgICAgICAgICAgICAqIGRlcGVuZHMgb24gYSBkeW5hbWljIGxpYnJhcnkgd2hpY2ggZmFpbGVkIHRvIGJ1aWxkLiBXZSB3YW50CisgICAgICAgICAgICAgICAgICogdG8gYXV0b21hdGljYWxseSBjbG9zZSB0aGVzZSBtZXNzYWdlIGJveGVzIGV2ZW4gdGhvdWdoCisgICAgICAgICAgICAgICAgICogY3Nyc3MuZXhlIGlzIG5vdCBvdXIgY2hpbGQgcHJvY2Vzcy4gV2UgbWF5IGRlcGVuZCBvbiB0aGUgZmFjdAorICAgICAgICAgICAgICAgICAqIHRoYXQgKGluIGFsbCBjdXJyZW50IHZlcnNpb25zIG9mIFdpbmRvd3MpIGNzcnNzLmV4ZSBpcyBhCisgICAgICAgICAgICAgICAgICogZGlyZWN0IGNoaWxkIG9mIHRoZSBzbXNzLmV4ZSBwcm9jZXNzLCB3aGljaCBpbiB0dXJuIGlzIGEKKyAgICAgICAgICAgICAgICAgKiBkaXJlY3QgY2hpbGQgb2YgdGhlIFN5c3RlbSBwcm9jZXNzLCB3aGljaCBhbHdheXMgaGFzIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgKiBpZCA9PSA0LiBUaGlzIGNoZWNrIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBjb21wYXJpbmcKKyAgICAgICAgICAgICAgICAgKiBwcm9jZXNzIGNyZWF0aW9uIHRpbWVzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICggIXN0cmljbXAoIHBpbmZvLnN6RXhlRmlsZSwgImNzcnNzLmV4ZSIgKSAmJgorICAgICAgICAgICAgICAgICAgICBpc19wYXJlbnRfY2hpbGQoIHBhcmVudCwgcGluZm8udGgzMlBhcmVudFByb2Nlc3NJRCApID09IDIgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBpZiAoICFzdHJpY21wKCBwaW5mby5zekV4ZUZpbGUsICJzbXNzLmV4ZSIgKSAmJgorICAgICAgICAgICAgICAgICAgICAoIHBpbmZvLnRoMzJQYXJlbnRQcm9jZXNzSUQgPT0gNCApICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisKKyAgICAgICAgICAgICAgICBpZiAoIGhjaGlsZCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBIQU5ETEUgaHBhcmVudCA9IE9wZW5Qcm9jZXNzKCBQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIHBpbmZvLnRoMzJQYXJlbnRQcm9jZXNzSUQgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBocGFyZW50ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGNoaWxkID0gY3JlYXRpb25fdGltZSggaGNoaWxkICk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cGFyZW50ID0gY3JlYXRpb25fdGltZSggaHBhcmVudCApOworICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoIGhwYXJlbnQgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDbG9zZUhhbmRsZSggaGNoaWxkICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogUmV0dXJuIDAgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKKyAgICAgICAgICAgICAgICAgKiAgMS4gd2UgZmFpbGVkIHRvIHJlYWQgcHJvY2VzcyBjcmVhdGlvbiB0aW1lCisgICAgICAgICAgICAgICAgICogIDIuIGNoaWxkIHdhcyBjcmVhdGVkIGJlZm9yZSBhbGxlZ2VkIHBhcmVudAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICggKCB0Y2hpbGQgPT0gMC4wICkgfHwgKCB0cGFyZW50ID09IDAuMCApIHx8CisgICAgICAgICAgICAgICAgICAgICggdGNoaWxkIDwgdHBhcmVudCApICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaXNfcGFyZW50X2NoaWxkKCBwYXJlbnQsIHBpbmZvLnRoMzJQYXJlbnRQcm9jZXNzSUQgKSAmIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBDbG9zZUhhbmRsZSggcHJvY2Vzc19zbmFwc2hvdF9oICk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENhbGxlZCBieSB0aGUgT1MgZm9yIGVhY2ggdG9wbW9zdCB3aW5kb3cuCisgKi8KKworQk9PTCBDQUxMQkFDSyBjbG9zZV9hbGVydF93aW5kb3dfZW51bSggSFdORCBod25kLCBMUEFSQU0gbFBhcmFtICkKK3sKKyAgICBjaGFyIGJ1ZlsgNyBdID0geyAwIH07CisgICAgUFJPQ0VTU19JTkZPUk1BVElPTiBjb25zdCAqIGNvbnN0IHBpID0gKFBST0NFU1NfSU5GT1JNQVRJT04gKilsUGFyYW07CisgICAgRFdPUkQgcGlkOworICAgIERXT1JEIHRpZDsKKworICAgIC8qIFdlIHdhbnQgdG8gZmluZCBhbmQgY2xvc2UgYW55IHdpbmRvdyB0aGF0OgorICAgICAqICAxLiBpcyB2aXNpYmxlIGFuZAorICAgICAqICAyLiBpcyBhIGRpYWxvZyBhbmQKKyAgICAgKiAgMy4gaXMgZGlzcGxheWVkIGJ5IGFueSBvZiBvdXIgY2hpbGQgcHJvY2Vzc2VzCisgICAgICovCisgICAgaWYgKAorICAgICAgICAvKiBXZSBhc3N1bWUgaGlkZGVuIHdpbmRvd3MgZG8gbm90IHJlcXVpcmUgdXNlciBpbnRlcmFjdGlvbi4gKi8KKyAgICAgICAgIUlzV2luZG93VmlzaWJsZSggaHduZCApCisgICAgICAgIC8qIEZhaWxlZCB0byByZWFkIGNsYXNzIG5hbWU7IHByZXN1bWUgaXQgaXMgbm90IGEgZGlhbG9nLiAqLworICAgICAgICB8fCAhR2V0Q2xhc3NOYW1lQSggaHduZCwgYnVmLCBzaXplb2YoIGJ1ZiApICkKKyAgICAgICAgLyogQWxsIFdpbmRvd3Mgc3lzdGVtIGRpYWxvZ3MgdXNlIHRoZSBzYW1lIFdpbmRvdyBjbGFzcyBuYW1lLiAqLworICAgICAgICB8fCBzdHJjbXAoIGJ1ZiwgIiMzMjc3MCIgKSApCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgLyogR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkKCkgcmV0dXJucyAwIG9uIGVycm9yLCBvdGhlcndpc2UgdGhyZWFkIGlkIG9mCisgICAgICogdGhlIHdpbmRvdydzIG1lc3NhZ2UgcHVtcCB0aHJlYWQuCisgICAgICovCisgICAgdGlkID0gR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkKCBod25kLCAmcGlkICk7CisgICAgaWYgKCAhdGlkIHx8ICFpc19wYXJlbnRfY2hpbGQoIHBpLT5kd1Byb2Nlc3NJZCwgcGlkICkgKQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgIC8qIEFzayByZWFsIG5pY2UuICovCisgICAgUG9zdE1lc3NhZ2VBKCBod25kLCBXTV9DTE9TRSwgMCwgMCApOworCisgICAgLyogV2FpdCBhbmQgc2VlIGlmIGl0IHdvcmtlZC4gSWYgbm90LCBpbnNpc3QuICovCisgICAgaWYgKCBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBwaS0+aFByb2Nlc3MsIDIwMCApID09IFdBSVRfVElNRU9VVCApCisgICAgeworICAgICAgICBQb3N0VGhyZWFkTWVzc2FnZUEoIHRpZCwgV01fUVVJVCwgMCwgMCApOworICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBwaS0+aFByb2Nlc3MsIDMwMCApOworICAgIH0KKworICAgIC8qIERvbmUsIHdlIGRvIG5vdCB3YW50IHRvIGNoZWNrIGFueSBvdGhlciB3aW5kb3dzIG5vdy4gKi8KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKworc3RhdGljIHZvaWQgY2xvc2VfYWxlcnQoIFBST0NFU1NfSU5GT1JNQVRJT04gY29uc3QgKiBjb25zdCBwaSApCit7CisgICAgRW51bVdpbmRvd3MoICZjbG9zZV9hbGVydF93aW5kb3dfZW51bSwgKExQQVJBTSlwaSApOworfQorCisKKy8qCisgKiBPcGVuIGEgY29tbWFuZCBmaWxlIHRvIHN0b3JlIHRoZSBjb21tYW5kIGludG8gZm9yIGV4ZWN1dGluZyB1c2luZyBhbiBleHRlcm5hbAorICogc2hlbGwuIFJldHVybnMgYSBwb2ludGVyIHRvIGEgRklMRSBvcGVuIGZvciB3cml0aW5nIG9yIDAgaW4gY2FzZSBzdWNoIGEgZmlsZQorICogY291bGQgbm90IGJlIG9wZW5lZC4gVGhlIGZpbGUgbmFtZSB1c2VkIGlzIHN0b3JlZCBiYWNrIGluIHRoZSBjb3JyZXNwb25kaW5nCisgKiBydW5uaW5nIGNvbW1hbmRzIHRhYmxlIHNsb3QuCisgKgorICogRXhwZWN0cyB0aGUgcnVubmluZyBjb21tYW5kcyB0YWJsZSBzbG90J3MgY29tbWFuZF9maWxlIGF0dHJpYnV0ZSB0byBjb250YWluCisgKiBlaXRoZXIgYSB6ZXJvZWQgb3V0IHN0cmluZyBvYmplY3Qgb3Igb25lIHByZXBhcmVkIHByZXZpb3VzbHkgYnkgdGhpcyBzYW1lCisgKiBmdW5jdGlvbi4KKyAqLworCitzdGF0aWMgRklMRSAqIG9wZW5fY29tbWFuZF9maWxlKCBpbnQgY29uc3Qgc2xvdCApCit7CisgICAgc3RyaW5nICogY29uc3QgY29tbWFuZF9maWxlID0gY21kdGFiWyBzbG90IF0uY29tbWFuZF9maWxlOworCisgICAgLyogSWYgdGhlIHRlbXBvcmFyeSBjb21tYW5kIGZpbGUgbmFtZSBoYXMgbm90IGFscmVhZHkgYmVlbiBwcmVwYXJlZCBmb3IgdGhpcworICAgICAqIHNsb3QgbnVtYmVyLCBwcmVwYXJlIGEgbmV3IG9uZSBjb250YWluaW5nIGEgJyMjJyBwbGFjZSBob2xkZXIgdGhhdCB3aWxsCisgICAgICogYmUgY2hhbmdlZCBsYXRlciBhbmQgbmVlZHMgdG8gYmUgbG9jYXRlZCBhdCBhIGZpeGVkIGRpc3RhbmNlIGZyb20gdGhlCisgICAgICogZW5kLgorICAgICAqLworICAgIGlmICggIWNvbW1hbmRfZmlsZS0+dmFsdWUgKQorICAgIHsKKyAgICAgICAgRFdPUkQgY29uc3QgcHJvY0lEID0gR2V0Q3VycmVudFByb2Nlc3NJZCgpOworICAgICAgICBzdHJpbmcgY29uc3QgKiBjb25zdCB0bXBkaXIgPSBwYXRoX3RtcGRpcigpOworICAgICAgICBzdHJpbmdfbmV3KCBjb21tYW5kX2ZpbGUgKTsKKyAgICAgICAgc3RyaW5nX3Jlc2VydmUoIGNvbW1hbmRfZmlsZSwgdG1wZGlyLT5zaXplICsgNjQgKTsKKyAgICAgICAgY29tbWFuZF9maWxlLT5zaXplID0gc3ByaW50ZiggY29tbWFuZF9maWxlLT52YWx1ZSwKKyAgICAgICAgICAgICIlc1xcamFtJWQtJTAyZC0jIy5iYXQiLCB0bXBkaXItPnZhbHVlLCBwcm9jSUQsIHNsb3QgKTsKKyAgICB9CisKKyAgICAvKiBGb3Igc29tZSByZWFzb24gb3BlbmluZyBhIGNvbW1hbmQgZmlsZSBjYW4gZmFpbCBpbnRlcm1pdHRlbnRseS4gQnV0IGRvaW5nCisgICAgICogc29tZSByZXRyaWVzIHdvcmtzLiBNb3N0IGxpa2VseSB0aGlzIGlzIGR1ZSB0byBhIHByZXZpb3VzbHkgZXhpc3RpbmcgZmlsZQorICAgICAqIG9mIHRoZSBzYW1lIG5hbWUgdGhhdCBoYXBwZW5zIHRvIHN0aWxsIGJlIG9wZW5lZCBieSBhbiBhY3RpdmUgdmlydXMKKyAgICAgKiBzY2FubmVyLiBPcmlnaW5hbGx5IHBvaW50ZWQgb3V0IGFuZCBmaXhlZCBieSBCcm9uZWsgS296aWNraS4KKyAgICAgKgorICAgICAqIFdlIGZpcnN0IHRyeSB0byBvcGVuIHNldmVyYWwgZGlmZmVyZW50bHkgbmFtZWQgZmlsZXMgdG8gYXZvaWQgaGF2aW5nIHRvCisgICAgICogd2FpdCBpZGx5IGlmIG5vdCBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4gT3VyIHRlbXBvcmFyeSBjb21tYW5kIGZpbGUgbmFtZXMKKyAgICAgKiBjb250YWluIGEgZml4ZWQgcG9zaXRpb24gcGxhY2UgaG9sZGVyIHdlIHVzZSBmb3IgZ2VuZXJhdGluZyBkaWZmZXJlbnQKKyAgICAgKiBmaWxlIG5hbWVzLgorICAgICAqLworICAgIHsKKyAgICAgICAgY2hhciAqIGNvbnN0IGluZGV4MSA9IGNvbW1hbmRfZmlsZS0+dmFsdWUgKyBjb21tYW5kX2ZpbGUtPnNpemUgLSA2OworICAgICAgICBjaGFyICogY29uc3QgaW5kZXgyID0gaW5kZXgxICsgMTsKKyAgICAgICAgaW50IHdhaXRzX3JlbWFpbmluZzsKKyAgICAgICAgYXNzZXJ0KCBjb21tYW5kX2ZpbGUtPnZhbHVlIDwgaW5kZXgxICk7CisgICAgICAgIGFzc2VydCggaW5kZXgyICsgMSA8IGNvbW1hbmRfZmlsZS0+dmFsdWUgKyBjb21tYW5kX2ZpbGUtPnNpemUgKTsKKyAgICAgICAgYXNzZXJ0KCBpbmRleDJbIDEgXSA9PSAnLicgKTsKKyAgICAgICAgZm9yICggd2FpdHNfcmVtYWluaW5nID0gMzsgOyAtLXdhaXRzX3JlbWFpbmluZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggIT0gMjA7ICsraW5kZXggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZJTEUgKiBmOworICAgICAgICAgICAgICAgICppbmRleDEgPSAnMCcgKyBpbmRleCAvIDEwOworICAgICAgICAgICAgICAgICppbmRleDIgPSAnMCcgKyBpbmRleCAlIDEwOworICAgICAgICAgICAgICAgIGYgPSBmb3BlbiggY29tbWFuZF9maWxlLT52YWx1ZSwgInciICk7CisgICAgICAgICAgICAgICAgaWYgKCBmICkgcmV0dXJuIGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoICF3YWl0c19yZW1haW5pbmcgKSBicmVhazsKKyAgICAgICAgICAgIFNsZWVwKCAyNTAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBQcmVwYXJlIGEgY29tbWFuZCBmaWxlIHRvIGJlIGV4ZWN1dGVkIHVzaW5nIGFuIGV4dGVybmFsIHNoZWxsLgorICovCisKK3N0YXRpYyBjaGFyIGNvbnN0ICogcHJlcGFyZV9jb21tYW5kX2ZpbGUoIHN0cmluZyBjb25zdCAqIGNvbW1hbmQsIGludCBzbG90ICkKK3sKKyAgICBGSUxFICogY29uc3QgZiA9IG9wZW5fY29tbWFuZF9maWxlKCBzbG90ICk7CisgICAgaWYgKCAhZiApCisgICAgeworICAgICAgICBwcmludGYoICJmYWlsZWQgdG8gd3JpdGUgY29tbWFuZCBmaWxlIVxuIiApOworICAgICAgICBleGl0KCBFWElUQkFEICk7CisgICAgfQorICAgIGZwdXRzKCBjb21tYW5kLT52YWx1ZSwgZiApOworICAgIGZjbG9zZSggZiApOworICAgIHJldHVybiBjbWR0YWJbIHNsb3QgXS5jb21tYW5kX2ZpbGUtPnZhbHVlOworfQorCisKKy8qCisgKiBGaW5kIGEgZnJlZSBzbG90IGluIHRoZSBydW5uaW5nIGNvbW1hbmRzIHRhYmxlLgorICovCisKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfY21kdGFiX3Nsb3QoKQoreworICAgIGludCBzbG90OworICAgIGZvciAoIHNsb3QgPSAwOyBzbG90IDwgTUFYSk9CUzsgKytzbG90ICkKKyAgICAgICAgaWYgKCAhY21kdGFiWyBzbG90IF0ucGkuaFByb2Nlc3MgKQorICAgICAgICAgICAgcmV0dXJuIHNsb3Q7CisgICAgcHJpbnRmKCAibm8gc2xvdHMgZm9yIGNoaWxkIVxuIiApOworICAgIGV4aXQoIEVYSVRCQUQgKTsKK30KKworCisvKgorICogUHV0IHRvZ2V0aGVyIHRoZSBmaW5hbCBjb21tYW5kIHN0cmluZyB3ZSBhcmUgdG8gcnVuLgorICovCisKK3N0YXRpYyB2b2lkIHN0cmluZ19uZXdfZnJvbV9hcmd2KCBzdHJpbmcgKiByZXN1bHQsIGNoYXIgY29uc3QgKiBjb25zdCAqIGFyZ3YgKQoreworICAgIGFzc2VydCggYXJndiApOworICAgIGFzc2VydCggYXJndlsgMCBdICk7CisgICAgc3RyaW5nX2NvcHkoIHJlc3VsdCwgKihhcmd2KyspICk7CisgICAgd2hpbGUgKCAqYXJndiApCisgICAgeworICAgICAgICBzdHJpbmdfcHVzaF9iYWNrKCByZXN1bHQsICcgJyApOworICAgICAgICBzdHJpbmdfYXBwZW5kKCByZXN1bHQsICooYXJndisrKSApOworICAgIH0KK30KKworCisvKgorICogUmVwb3J0cyB0aGUgbGFzdCBmYWlsZWQgV2luZG93cyBBUEkgcmVsYXRlZCBlcnJvciBtZXNzYWdlLgorICovCisKK3N0YXRpYyB2b2lkIHJlcG9ydFdpbmRvd3NFcnJvciggY2hhciBjb25zdCAqIGNvbnN0IGFwaU5hbWUgKQoreworICAgIGNoYXIgKiBlcnJvck1lc3NhZ2U7CisgICAgRFdPUkQgY29uc3QgZXJyb3JDb2RlID0gR2V0TGFzdEVycm9yKCk7CisgICAgRFdPUkQgYXBpUmVzdWx0ID0gRm9ybWF0TWVzc2FnZUEoCisgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8ICAvKiBfX2luICAgICAgRFdPUkQgZHdGbGFncyAgICAgICAqLworICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8CisgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAorICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogX19pbl9vcHQgIExQQ1ZPSUQgbHBTb3VyY2UgICAgKi8KKyAgICAgICAgZXJyb3JDb2RlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIF9faW4gICAgICBEV09SRCBkd01lc3NhZ2VJZCAgICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBfX2luICAgICAgRFdPUkQgZHdMYW5ndWFnZUlkICAqLworICAgICAgICAoTFBTVFIpJmVycm9yTWVzc2FnZSwgICAgICAgICAgICAgLyogX19vdXQgICAgIExQVFNUUiBscEJ1ZmZlciAgICAgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIF9faW4gICAgICBEV09SRCBuU2l6ZSAgICAgICAgICovCisgICAgICAgIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBfX2luX29wdCAgdmFfbGlzdCAqIEFyZ3VtZW50cyAqLworICAgIGlmICggIWFwaVJlc3VsdCApCisgICAgICAgIHByaW50ZiggIiVzKCkgV2luZG93cyBBUEkgZmFpbGVkOiAlZC5cbiIsIGFwaU5hbWUsIGVycm9yQ29kZSApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ZiggIiVzKCkgV2luZG93cyBBUEkgZmFpbGVkOiAlZCAtICVzXG4iLCBhcGlOYW1lLCBlcnJvckNvZGUsCisgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKTsKKyAgICAgICAgTG9jYWxGcmVlKCBlcnJvck1lc3NhZ2UgKTsKKyAgICB9Cit9CisKKworI2VuZGlmIC8qIFVTRV9FWEVDTlQgKi8KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2V4ZWN1bml4LmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9leGVjdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NWU1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9leGVjdW5peC5jCkBAIC0wLDAgKzEsNTU5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTMsIDE5OTUgQ2hyaXN0b3BoZXIgU2Vpd2FsZC4KKyAqIENvcHlyaWdodCAyMDA3IE5vZWwgQmVsY291cnQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgImV4ZWNjbWQuaCIKKworI2luY2x1ZGUgImxpc3RzLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAic3RyaW5ncy5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4gIC8qIHZmb3JrKCksIF9leGl0KCksIFNURE9VVF9GSUxFTk8gYW5kIHN1Y2ggKi8KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaWYgZGVmaW5lZChzdW4pIHx8IGRlZmluZWQoX19zdW4pCisgICAgI2luY2x1ZGUgPHdhaXQuaD4KKyNlbmRpZgorCisjaWZkZWYgVVNFX0VYRUNVTklYCisKKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorICAgICNkZWZpbmUgTk9fVkZPUksKKyNlbmRpZgorCisjaWZkZWYgTk9fVkZPUksKKyAgICAjZGVmaW5lIHZmb3JrKCkgZm9yaygpCisjZW5kaWYKKworCisvKgorICogZXhlY3VuaXguYyAtIGV4ZWN1dGUgYSBzaGVsbCBzY3JpcHQgb24gVU5JWC9PUzIvQW1pZ2FPUworICoKKyAqIElmICQoSkFNU0hFTEwpIGlzIGRlZmluZWQsIHVzZXMgdGhhdCB0byBmb3JtdWxhdGUgZXhlY3ZwKCkvc3Bhd252cCgpLiBUaGUKKyAqIGRlZmF1bHQgaXM6IC9iaW4vc2ggLWMKKyAqCisgKiBJbiAkKEpBTVNIRUxMKSwgJSBleHBhbmRzIHRvIHRoZSBjb21tYW5kIHN0cmluZyBhbmQgISBleHBhbmRzIHRvIHRoZSBzbG90CisgKiBudW1iZXIgKHN0YXJ0aW5nIGF0IDEpIGZvciBtdWx0aXByb2Nlc3MgKC1qKSBpbnZvY2F0aW9ucy4gSWYgJChKQU1TSEVMTCkgZG9lcworICogbm90IGluY2x1ZGUgYSAlLCBpdCBpcyB0YWNrZWQgb24gYXMgdGhlIGxhc3QgYXJndW1lbnQuCisgKgorICogRWFjaCB3b3JkIG11c3QgYmUgYW4gaW5kaXZpZHVhbCBlbGVtZW50IGluIGEgamFtIHZhcmlhYmxlIHZhbHVlLgorICoKKyAqIERvIG5vdCBqdXN0IHNldCBKQU1TSEVMTCB0byAvYmluL3NoIC0gaXQgd2lsbCBub3Qgd29yayEKKyAqCisgKiBFeHRlcm5hbCByb3V0aW5lczoKKyAqICBleGVjX2NoZWNrKCkgLSBwcmVwcm9jZXNzIGFuZCB2YWxpZGF0ZSB0aGUgY29tbWFuZC4KKyAqICBleGVjX2NtZCgpIC0gbGF1bmNoIGFuIGFzeW5jIGNvbW1hbmQgZXhlY3V0aW9uLgorICogIGV4ZWNfd2FpdCgpIC0gd2FpdCBmb3IgYW55IG9mIHRoZSBhc3luYyBjb21tYW5kIHByb2Nlc3NlcyB0byB0ZXJtaW5hdGUuCisgKi8KKworLyogZmluZCBhIGZyZWUgc2xvdCBpbiB0aGUgcnVubmluZyBjb21tYW5kcyB0YWJsZSAqLworc3RhdGljIGludCBnZXRfZnJlZV9jbWR0YWJfc2xvdCgpOworCisvKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ICovCisKK3N0YXRpYyBjbG9ja190IHRwczsKK3N0YXRpYyBpbnQgb2xkX3RpbWVfaW5pdGlhbGl6ZWQ7CitzdGF0aWMgc3RydWN0IHRtcyBvbGRfdGltZTsKKworLyogV2UgaG9sZCBzdGRvdXQgJiBzdGRlcnIgY2hpbGQgcHJvY2VzcyBpbmZvcm1hdGlvbiBpbiB0d28gZWxlbWVudCBhcnJheXMKKyAqIGluZGV4ZWQgYXMgZm9sbG93cy4KKyAqLworI2RlZmluZSBPVVQgMAorI2RlZmluZSBFUlIgMQorCitzdGF0aWMgc3RydWN0Cit7CisgICAgaW50ICAgICAgICAgIHBpZDsgICAgICAgICAgICAvKiBvbiB3aW4zMiwgYSByZWFsIHByb2Nlc3MgaGFuZGxlICovCisgICAgaW50ICAgICAgICAgIGZkWyAyIF07ICAgICAgICAvKiBmaWxlIGRlc2NyaXB0b3JzIGZvciBzdGRvdXQgYW5kIHN0ZGVyciAqLworICAgIEZJTEUgICAgICAqICBzdHJlYW1bIDIgXTsgICAgLyogY2hpbGQncyBzdGRvdXQgYW5kIHN0ZGVyciBmaWxlIHN0cmVhbXMgKi8KKyAgICBjbG9ja190ICAgICAgc3RhcnRfdGltZTsgICAgIC8qIHN0YXJ0IHRpbWUgb2YgY2hpbGQgcHJvY2VzcyAqLworICAgIGludCAgICAgICAgICBleGl0X3JlYXNvbjsgICAgLyogdGVybWluYXRpb24gc3RhdHVzICovCisgICAgY2hhciAgICAgICogIGJ1ZmZlclsgMiBdOyAgICAvKiBidWZmZXJzIHRvIGhvbGQgc3Rkb3V0IGFuZCBzdGRlcnIsIGlmIGFueSAqLworICAgIGludCAgICAgICAgICBidWZfc2l6ZVsgMiBdOyAgLyogYnVmZmVyIHNpemVzIGluIGJ5dGVzICovCisgICAgdGltZXN0YW1wICAgIHN0YXJ0X2R0OyAgICAgICAvKiBzdGFydCBvZiBjb21tYW5kIHRpbWVzdGFtcCAqLworCisgICAgLyogRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzLiAqLworICAgIEV4ZWNDbWRDYWxsYmFjayBmdW5jOworCisgICAgLyogT3BhcXVlIGRhdGEgcGFzc2VkIGJhY2sgdG8gdGhlICdmdW5jJyBjYWxsYmFjay4gKi8KKyAgICB2b2lkICogY2xvc3VyZTsKK30gY21kdGFiWyBNQVhKT0JTIF0gPSB7IHsgMCB9IH07CisKKworLyoKKyAqIGV4ZWNfY2hlY2soKSAtIHByZXByb2Nlc3MgYW5kIHZhbGlkYXRlIHRoZSBjb21tYW5kLgorICovCisKK2ludCBleGVjX2NoZWNrCisoCisgICAgc3RyaW5nIGNvbnN0ICogY29tbWFuZCwKKyAgICBMSVNUICogKiBwU2hlbGwsCisgICAgaW50ICogZXJyb3JfbGVuZ3RoLAorICAgIGludCAqIGVycm9yX21heF9sZW5ndGgKKykKK3sKKyAgICBpbnQgY29uc3QgaXNfcmF3X2NtZCA9IGlzX3Jhd19jb21tYW5kX3JlcXVlc3QoICpwU2hlbGwgKTsKKworICAgIC8qIFdlIGFsbG93IGVtcHR5IGNvbW1hbmRzIGZvciBub24tZGVmYXVsdCBzaGVsbHMgc2luY2Ugd2UgZG8gbm90IHJlYWxseQorICAgICAqIGtub3cgd2hhdCB0aGV5IGFyZSBnb2luZyB0byBkbyB3aXRoIHN1Y2ggY29tbWFuZHMuCisgICAgICovCisgICAgaWYgKCAhY29tbWFuZC0+c2l6ZSAmJiAoIGlzX3Jhd19jbWQgfHwgbGlzdF9lbXB0eSggKnBTaGVsbCApICkgKQorICAgICAgICByZXR1cm4gRVhFQ19DSEVDS19OT09QOworCisgICAgcmV0dXJuIGlzX3Jhd19jbWQKKyAgICAgICAgPyBFWEVDX0NIRUNLX09LCisgICAgICAgIDogY2hlY2tfY21kX2Zvcl90b29fbG9uZ19saW5lcyggY29tbWFuZC0+dmFsdWUsIE1BWExJTkUsIGVycm9yX2xlbmd0aCwKKyAgICAgICAgICAgIGVycm9yX21heF9sZW5ndGggKTsKK30KKworCisvKgorICogZXhlY19jbWQoKSAtIGxhdW5jaCBhbiBhc3luYyBjb21tYW5kIGV4ZWN1dGlvbi4KKyAqLworCisvKiBXZSBob2xkIGZpbGUgZGVzY3JpcHRvcnMgZm9yIHBpcGVzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBjaGlsZCBwcm9jZXNzZXMKKyAqIGluIHR3byBlbGVtZW50IGFycmF5cyBpbmRleGVkIGFzIGZvbGxvd3MuCisgKi8KKyNkZWZpbmUgRVhFQ0NNRF9QSVBFX1JFQUQgMAorI2RlZmluZSBFWEVDQ01EX1BJUEVfV1JJVEUgMQorCit2b2lkIGV4ZWNfY21kCisoCisgICAgc3RyaW5nIGNvbnN0ICogY29tbWFuZCwKKyAgICBFeGVjQ21kQ2FsbGJhY2sgZnVuYywKKyAgICB2b2lkICogY2xvc3VyZSwKKyAgICBMSVNUICogc2hlbGwKKykKK3sKKyAgICBpbnQgY29uc3Qgc2xvdCA9IGdldF9mcmVlX2NtZHRhYl9zbG90KCk7CisgICAgaW50IG91dFsgMiBdOworICAgIGludCBlcnJbIDIgXTsKKyAgICBpbnQgbGVuOworICAgIGNoYXIgY29uc3QgKiBhcmd2WyBNQVhBUkdDICsgMSBdOyAgLyogKzEgZm9yIE5VTEwgKi8KKworICAgIC8qIEluaXRpYWxpemUgZGVmYXVsdCBzaGVsbC4gKi8KKyAgICBzdGF0aWMgTElTVCAqIGRlZmF1bHRfc2hlbGw7CisgICAgaWYgKCAhZGVmYXVsdF9zaGVsbCApCisgICAgICAgIGRlZmF1bHRfc2hlbGwgPSBsaXN0X3B1c2hfYmFjayggbGlzdF9uZXcoCisgICAgICAgICAgICBvYmplY3RfbmV3KCAiL2Jpbi9zaCIgKSApLAorICAgICAgICAgICAgb2JqZWN0X25ldyggIi1jIiApICk7CisKKyAgICBpZiAoIGxpc3RfZW1wdHkoIHNoZWxsICkgKQorICAgICAgICBzaGVsbCA9IGRlZmF1bHRfc2hlbGw7CisKKyAgICAvKiBGb3J1bXVsYXRlIGFyZ3YuIElmIHNoZWxsIHdhcyBkZWZpbmVkLCBiZSBwcmVwYXJlZCBmb3IgJSBhbmQgISBzdWJzLgorICAgICAqIE90aGVyd2lzZSwgdXNlIHN0b2NrIC9iaW4vc2guCisgICAgICovCisgICAgYXJndl9mcm9tX3NoZWxsKCBhcmd2LCBzaGVsbCwgY29tbWFuZC0+dmFsdWUsIHNsb3QgKTsKKworICAgIGlmICggREVCVUdfRVhFQ0NNRCApCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgcHJpbnRmKCAiVXNpbmcgc2hlbGw6ICIgKTsKKyAgICAgICAgbGlzdF9wcmludCggc2hlbGwgKTsKKyAgICAgICAgcHJpbnRmKCAiXG4iICk7CisgICAgICAgIGZvciAoIGkgPSAwOyBhcmd2WyBpIF07ICsraSApCisgICAgICAgICAgICBwcmludGYoICIgICAgYXJndlslZF0gPSAnJXMnXG4iLCBpLCBhcmd2WyBpIF0gKTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgcGlwZXMgZm9yIGNvbGxlY3RpbmcgY2hpbGQgb3V0cHV0LiAqLworICAgIGlmICggcGlwZSggb3V0ICkgPCAwIHx8ICggZ2xvYnMucGlwZV9hY3Rpb24gJiYgcGlwZSggZXJyICkgPCAwICkgKQorICAgIHsKKyAgICAgICAgcGVycm9yKCAicGlwZSIgKTsKKyAgICAgICAgZXhpdCggRVhJVEJBRCApOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgb2xkX3RpbWUgb25seSBvbmNlLiAqLworICAgIGlmICggIW9sZF90aW1lX2luaXRpYWxpemVkICkKKyAgICB7CisgICAgICAgIHRpbWVzKCAmb2xkX3RpbWUgKTsKKyAgICAgICAgb2xkX3RpbWVfaW5pdGlhbGl6ZWQgPSAxOworICAgIH0KKworICAgIC8qIFN0YXJ0IHRoZSBjb21tYW5kICovCisKKyAgICB0aW1lc3RhbXBfY3VycmVudCggJmNtZHRhYlsgc2xvdCBdLnN0YXJ0X2R0ICk7CisKKyAgICBpZiAoIDAgPCBnbG9icy50aW1lb3V0ICkKKyAgICB7CisgICAgICAgIC8qIEhhbmRsZSBodW5nIHByb2Nlc3NlcyBieSBtYW51YWxseSB0cmFja2luZyBlbGFwc2VkIHRpbWUgYW5kIHNpZ25hbAorICAgICAgICAgKiBwcm9jZXNzIHdoZW4gdGltZSBsaW1pdCBleHBpcmVzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RydWN0IHRtcyBidWY7CisgICAgICAgIGNtZHRhYlsgc2xvdCBdLnN0YXJ0X3RpbWUgPSB0aW1lcyggJmJ1ZiApOworCisgICAgICAgIC8qIE1ha2UgYSBnbG9iYWwsIG9ubHkgZG8gdGhpcyBvbmNlLiAqLworICAgICAgICBpZiAoICF0cHMgKSB0cHMgPSBzeXNjb25mKCBfU0NfQ0xLX1RDSyApOworICAgIH0KKworICAgIC8qIENoaWxkIGRvZXMgbm90IG5lZWQgdGhlIHJlYWQgcGlwZSBlbmRzIHVzZWQgYnkgdGhlIHBhcmVudC4gKi8KKyAgICBmY250bCggb3V0WyBFWEVDQ01EX1BJUEVfUkVBRCBdLCBGX1NFVEZELCBGRF9DTE9FWEVDICk7CisgICAgaWYgKCBnbG9icy5waXBlX2FjdGlvbiApCisgICAgICAgIGZjbnRsKCBlcnJbIEVYRUNDTURfUElQRV9SRUFEIF0sIEZfU0VURkQsIEZEX0NMT0VYRUMgKTsKKworICAgIGlmICggKCBjbWR0YWJbIHNsb3QgXS5waWQgPSB2Zm9yaygpICkgPT0gLTEgKQorICAgIHsKKyAgICAgICAgcGVycm9yKCAidmZvcmsiICk7CisgICAgICAgIGV4aXQoIEVYSVRCQUQgKTsKKyAgICB9CisKKyAgICBpZiAoIGNtZHRhYlsgc2xvdCBdLnBpZCA9PSAwICkKKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogQ2hpbGQgcHJvY2VzcyAqLworICAgICAgICAvKioqKioqKioqKioqKioqKiovCisgICAgICAgIGludCBjb25zdCBwaWQgPSBnZXRwaWQoKTsKKworICAgICAgICAvKiBSZWRpcmVjdCBzdGRvdXQgYW5kIHN0ZGVyciB0byBwaXBlcyBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50LiAqLworICAgICAgICBkdXAyKCBvdXRbIEVYRUNDTURfUElQRV9XUklURSBdLCBTVERPVVRfRklMRU5PICk7CisgICAgICAgIGR1cDIoIGdsb2JzLnBpcGVfYWN0aW9uID8gZXJyWyBFWEVDQ01EX1BJUEVfV1JJVEUgXSA6CisgICAgICAgICAgICBvdXRbIEVYRUNDTURfUElQRV9XUklURSBdLCBTVERFUlJfRklMRU5PICk7CisgICAgICAgIGNsb3NlKCBvdXRbIEVYRUNDTURfUElQRV9XUklURSBdICk7CisgICAgICAgIGlmICggZ2xvYnMucGlwZV9hY3Rpb24gKQorICAgICAgICAgICAgY2xvc2UoIGVyclsgRVhFQ0NNRF9QSVBFX1dSSVRFIF0gKTsKKworICAgICAgICAvKiBNYWtlIHRoaXMgcHJvY2VzcyBhIHByb2Nlc3MgZ3JvdXAgbGVhZGVyIHNvIHRoYXQgd2hlbiB3ZSBraWxsIGl0LCBhbGwKKyAgICAgICAgICogY2hpbGQgcHJvY2Vzc2VzIG9mIHRoaXMgcHJvY2VzcyBhcmUgdGVybWluYXRlZCBhcyB3ZWxsLiBXZSB1c2UKKyAgICAgICAgICoga2lsbHBnKCBwaWQsIFNJR0tJTEwgKSB0byBraWxsIHRoZSBwcm9jZXNzIGdyb3VwIGxlYWRlciBhbmQgYWxsIGl0cworICAgICAgICAgKiBjaGlsZHJlbi4KKyAgICAgICAgICovCisgICAgICAgIGlmICggMCA8IGdsb2JzLnRpbWVvdXQgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgcmxpbWl0IHJfbGltaXQ7CisgICAgICAgICAgICByX2xpbWl0LnJsaW1fY3VyID0gZ2xvYnMudGltZW91dDsKKyAgICAgICAgICAgIHJfbGltaXQucmxpbV9tYXggPSBnbG9icy50aW1lb3V0OworICAgICAgICAgICAgc2V0cmxpbWl0KCBSTElNSVRfQ1BVLCAmcl9saW1pdCApOworICAgICAgICB9CisgICAgICAgIHNldHBnaWQoIHBpZCwgcGlkICk7CisgICAgICAgIGV4ZWN2cCggYXJndlsgMCBdLCAoY2hhciAqICopYXJndiApOworICAgICAgICBwZXJyb3IoICJleGVjdnAiICk7CisgICAgICAgIF9leGl0KCAxMjcgKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqLworICAgIC8qIFBhcmVudCBwcm9jZXNzICovCisgICAgLyoqKioqKioqKioqKioqKioqKi8KKyAgICBzZXRwZ2lkKCBjbWR0YWJbIHNsb3QgXS5waWQsIGNtZHRhYlsgc2xvdCBdLnBpZCApOworCisgICAgLyogUGFyZW50IG5vdCBuZWVkIHRoZSB3cml0ZSBwaXBlIGVuZHMgdXNlZCBieSB0aGUgY2hpbGQuICovCisgICAgY2xvc2UoIG91dFsgRVhFQ0NNRF9QSVBFX1dSSVRFIF0gKTsKKyAgICBpZiAoIGdsb2JzLnBpcGVfYWN0aW9uICkKKyAgICAgICAgY2xvc2UoIGVyclsgRVhFQ0NNRF9QSVBFX1dSSVRFIF0gKTsKKworICAgIC8qIFNldCBib3RoIHBpcGUgcmVhZCBmaWxlIGRlc2NyaXB0b3JzIHRvIG5vbi1ibG9ja2luZy4gKi8KKyAgICBmY250bCggb3V0WyBFWEVDQ01EX1BJUEVfUkVBRCBdLCBGX1NFVEZMLCBPX05PTkJMT0NLICk7CisgICAgaWYgKCBnbG9icy5waXBlX2FjdGlvbiApCisgICAgICAgIGZjbnRsKCBlcnJbIEVYRUNDTURfUElQRV9SRUFEIF0sIEZfU0VURkwsIE9fTk9OQkxPQ0sgKTsKKworICAgIC8qIFBhcmVudCByZWFkcyBmcm9tIG91dFsgRVhFQ0NNRF9QSVBFX1JFQUQgXS4gKi8KKyAgICBjbWR0YWJbIHNsb3QgXS5mZFsgT1VUIF0gPSBvdXRbIEVYRUNDTURfUElQRV9SRUFEIF07CisgICAgY21kdGFiWyBzbG90IF0uc3RyZWFtWyBPVVQgXSA9IGZkb3BlbiggY21kdGFiWyBzbG90IF0uZmRbIE9VVCBdLCAicmIiICk7CisgICAgaWYgKCAhY21kdGFiWyBzbG90IF0uc3RyZWFtWyBPVVQgXSApCisgICAgeworICAgICAgICBwZXJyb3IoICJmZG9wZW4iICk7CisgICAgICAgIGV4aXQoIEVYSVRCQUQgKTsKKyAgICB9CisKKyAgICAvKiBQYXJlbnQgcmVhZHMgZnJvbSBlcnJbIEVYRUNDTURfUElQRV9SRUFEIF0uICovCisgICAgaWYgKCBnbG9icy5waXBlX2FjdGlvbiApCisgICAgeworICAgICAgICBjbWR0YWJbIHNsb3QgXS5mZFsgRVJSIF0gPSBlcnJbIEVYRUNDTURfUElQRV9SRUFEIF07CisgICAgICAgIGNtZHRhYlsgc2xvdCBdLnN0cmVhbVsgRVJSIF0gPSBmZG9wZW4oIGNtZHRhYlsgc2xvdCBdLmZkWyBFUlIgXSwgInJiIiApOworICAgICAgICBpZiAoICFjbWR0YWJbIHNsb3QgXS5zdHJlYW1bIEVSUiBdICkKKyAgICAgICAgeworICAgICAgICAgICAgcGVycm9yKCAiZmRvcGVuIiApOworICAgICAgICAgICAgZXhpdCggRVhJVEJBRCApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2F2ZSBpbnB1dCBkYXRhIGludG8gdGhlIHNlbGVjdGVkIHJ1bm5pbmcgY29tbWFuZHMgdGFibGUgc2xvdC4gKi8KKyAgICBjbWR0YWJbIHNsb3QgXS5mdW5jID0gZnVuYzsKKyAgICBjbWR0YWJbIHNsb3QgXS5jbG9zdXJlID0gY2xvc3VyZTsKK30KKworI3VuZGVmIEVYRUNDTURfUElQRV9SRUFECisjdW5kZWYgRVhFQ0NNRF9QSVBFX1dSSVRFCisKKworLyogUmV0dXJucyAxIGlmIGZpbGUgZGVzY3JpcHRvciBpcyBjbG9zZWQsIG9yIDAgaWYgaXQgaXMgc3RpbGwgYWxpdmUuCisgKgorICogaSBpcyBpbmRleCBpbnRvIGNtZHRhYgorICoKKyAqIHMgKHN0cmVhbSkgaW5kZXhlczoKKyAqICAtIGNtZHRhYlsgaSBdLnN0cmVhbVsgcyBdCisgKiAgLSBjbWR0YWJbIGkgXS5idWZmZXJbIHMgXQorICogIC0gY21kdGFiWyBpIF0uZmQgICAgWyBzIF0KKyAqLworCitzdGF0aWMgaW50IHJlYWRfZGVzY3JpcHRvciggaW50IGksIGludCBzICkKK3sKKyAgICBpbnQgcmV0OworICAgIGNoYXIgYnVmZmVyWyBCVUZTSVogXTsKKworICAgIHdoaWxlICggMCA8ICggcmV0ID0gZnJlYWQoIGJ1ZmZlciwgc2l6ZW9mKCBjaGFyICksIEJVRlNJWiAtIDEsCisgICAgICAgIGNtZHRhYlsgaSBdLnN0cmVhbVsgcyBdICkgKSApCisgICAgeworICAgICAgICBidWZmZXJbIHJldCBdID0gMDsKKyAgICAgICAgaWYgKCAhY21kdGFiWyBpIF0uYnVmZmVyWyBzIF0gKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOZXZlciBiZWVuIGFsbG9jYXRlZC4gKi8KKyAgICAgICAgICAgIGlmICggZ2xvYnMubWF4X2J1ZiAmJiByZXQgPiBnbG9icy5tYXhfYnVmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBnbG9icy5tYXhfYnVmOworICAgICAgICAgICAgICAgIGJ1ZmZlclsgcmV0IF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY21kdGFiWyBpIF0uYnVmX3NpemVbIHMgXSA9IHJldCArIDE7CisgICAgICAgICAgICBjbWR0YWJbIGkgXS5idWZmZXJbIHMgXSA9IChjaGFyKilCSkFNX01BTExPQ19BVE9NSUMoIHJldCArIDEgKTsKKyAgICAgICAgICAgIG1lbWNweSggY21kdGFiWyBpIF0uYnVmZmVyWyBzIF0sIGJ1ZmZlciwgcmV0ICsgMSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogUHJldmlvdXNseSBhbGxvY2F0ZWQuICovCisgICAgICAgICAgICBpZiAoIGNtZHRhYlsgaSBdLmJ1Zl9zaXplWyBzIF0gPCBnbG9icy5tYXhfYnVmIHx8ICFnbG9icy5tYXhfYnVmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyICogdG1wID0gY21kdGFiWyBpIF0uYnVmZmVyWyBzIF07CisgICAgICAgICAgICAgICAgaW50IGNvbnN0IG9sZF9sZW4gPSBjbWR0YWJbIGkgXS5idWZfc2l6ZVsgcyBdIC0gMTsKKyAgICAgICAgICAgICAgICBpbnQgY29uc3QgbmV3X2xlbiA9IG9sZF9sZW4gKyByZXQgKyAxOworICAgICAgICAgICAgICAgIGNtZHRhYlsgaSBdLmJ1Zl9zaXplWyBzIF0gPSBuZXdfbGVuOworICAgICAgICAgICAgICAgIGNtZHRhYlsgaSBdLmJ1ZmZlclsgcyBdID0gKGNoYXIqKUJKQU1fTUFMTE9DX0FUT01JQyggbmV3X2xlbiApOworICAgICAgICAgICAgICAgIG1lbWNweSggY21kdGFiWyBpIF0uYnVmZmVyWyBzIF0sIHRtcCwgb2xkX2xlbiApOworICAgICAgICAgICAgICAgIG1lbWNweSggY21kdGFiWyBpIF0uYnVmZmVyWyBzIF0gKyBvbGRfbGVuLCBidWZmZXIsIHJldCArIDEgKTsKKyAgICAgICAgICAgICAgICBCSkFNX0ZSRUUoIHRtcCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgYnVmZmVyIGZ1bGwsIGVuc3VyZSBsYXN0IGJ1ZmZlciBjaGFyIGlzIG5ld2xpbmUgc28gdGhhdCBqYW0gbG9nCisgICAgICogY29udGFpbnMgdGhlIGNvbW1hbmQgc3RhdHVzIGF0IGJlZ2lubmluZyBvZiBpdCBvd24gbGluZSBpbnN0ZWFkIG9mCisgICAgICogYXBwZW5kZWQgdG8gZW5kIG9mIHRoZSBwcmV2aW91cyBvdXRwdXQuCisgICAgICovCisgICAgaWYgKCBnbG9icy5tYXhfYnVmICYmIGdsb2JzLm1heF9idWYgPD0gY21kdGFiWyBpIF0uYnVmX3NpemVbIHMgXSApCisgICAgICAgIGNtZHRhYlsgaSBdLmJ1ZmZlclsgcyBdWyBjbWR0YWJbIGkgXS5idWZfc2l6ZVsgcyBdIC0gMiBdID0gJ1xuJzsKKworICAgIHJldHVybiBmZW9mKCBjbWR0YWJbIGkgXS5zdHJlYW1bIHMgXSApOworfQorCisKKy8qCisgKiBjbG9zZV9zdHJlYW1zKCkgLSBDbG9zZSB0aGUgc3RyZWFtIGFuZCBwaXBlIGRlc2NyaXB0b3IuCisgKi8KKworc3RhdGljIHZvaWQgY2xvc2Vfc3RyZWFtcyggaW50IGNvbnN0IGksIGludCBjb25zdCBzICkKK3sKKyAgICBmY2xvc2UoIGNtZHRhYlsgaSBdLnN0cmVhbVsgcyBdICk7CisgICAgY21kdGFiWyBpIF0uc3RyZWFtWyBzIF0gPSAwOworCisgICAgY2xvc2UoIGNtZHRhYlsgaSBdLmZkWyBzIF0gKTsKKyAgICBjbWR0YWJbIGkgXS5mZFsgcyBdID0gMDsKK30KKworCisvKgorICogUG9wdWxhdGUgdGhlIGZpbGUgZGVzY3JpcHRvcnMgY29sbGVjdGlvbiBmb3IgdXNlIGluIHNlbGVjdCgpIGFuZCByZXR1cm4gdGhlCisgKiBtYXhpbWFsIGluY2x1ZGVkIGZpbGUgZGVzY3JpcHRvciB2YWx1ZS4KKyAqLworCitzdGF0aWMgaW50IHBvcHVsYXRlX2ZpbGVfZGVzY3JpcHRvcnMoIGZkX3NldCAqIGNvbnN0IGZkcyApCit7CisgICAgaW50IGk7CisgICAgaW50IGZkX21heCA9IDA7CisKKyAgICBGRF9aRVJPKCBmZHMgKTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGdsb2JzLmpvYnM7ICsraSApCisgICAgeworICAgICAgICBpbnQgZmQ7CisgICAgICAgIGlmICggKCBmZCA9IGNtZHRhYlsgaSBdLmZkWyBPVVQgXSApID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZmQgPiBmZF9tYXggKSBmZF9tYXggPSBmZDsKKyAgICAgICAgICAgIEZEX1NFVCggZmQsIGZkcyApOworICAgICAgICB9CisgICAgICAgIGlmICggZ2xvYnMucGlwZV9hY3Rpb24gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICggZmQgPSBjbWR0YWJbIGkgXS5mZFsgRVJSIF0gKSA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggZmQgPiBmZF9tYXggKSBmZF9tYXggPSBmZDsKKyAgICAgICAgICAgICAgICBGRF9TRVQoIGZkLCBmZHMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmRfbWF4OworfQorCisKKy8qCisgKiBleGVjX3dhaXQoKSAtIHdhaXQgZm9yIGFueSBvZiB0aGUgYXN5bmMgY29tbWFuZCBwcm9jZXNzZXMgdG8gdGVybWluYXRlLgorICoKKyAqIE1heSByZWdpc3RlciBtb3JlIHRoYW4gb25lIHRlcm1pbmF0ZWQgY2hpbGQgcHJvY2VzcyBidXQgd2lsbCBleGl0IGFzIHNvb24gYXMKKyAqIGF0IGxlYXN0IG9uZSBoYXMgYmVlbiByZWdpc3RlcmVkLgorICovCisKK3ZvaWQgZXhlY193YWl0KCkKK3sKKyAgICBpbnQgZmluaXNoZWQgPSAwOworCisgICAgLyogUHJvY2VzcyBjaGlsZHJlbiB0aGF0IHNpZ25hbGVkLiAqLworICAgIHdoaWxlICggIWZpbmlzaGVkICkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgKiBwdHYgPSBOVUxMOworICAgICAgICBpbnQgc2VsZWN0X3RpbWVvdXQgPSBnbG9icy50aW1lb3V0OworCisgICAgICAgIC8qIFByZXBhcmUgZmlsZSBkZXNjcmlwdG9yIGluZm9ybWF0aW9uIGZvciB1c2UgaW4gc2VsZWN0KCkuICovCisgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgIGludCBjb25zdCBmZF9tYXggPSBwb3B1bGF0ZV9maWxlX2Rlc2NyaXB0b3JzKCAmZmRzICk7CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIHRpbWVvdXRzOgorICAgICAgICAgKiAgIC0ga2lsbCBjaGlsZHJlbiB0aGF0IGFscmVhZHkgdGltZWQgb3V0CisgICAgICAgICAqICAgLSBkZWNpZGUgaG93IGxvbmcgdW50aWwgdGhlIG5leHQgb25lIHRpbWVzIG91dAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCBnbG9icy50aW1lb3V0ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCB0bXMgYnVmOworICAgICAgICAgICAgY2xvY2tfdCBjb25zdCBjdXJyZW50ID0gdGltZXMoICZidWYgKTsKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZ2xvYnMuam9iczsgKytpICkKKyAgICAgICAgICAgICAgICBpZiAoIGNtZHRhYlsgaSBdLnBpZCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjbG9ja190IGNvbnN0IGNvbnN1bWVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICggY3VycmVudCAtIGNtZHRhYlsgaSBdLnN0YXJ0X3RpbWUgKSAvIHRwczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjb25zdW1lZCA+PSBnbG9icy50aW1lb3V0ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAga2lsbHBnKCBjbWR0YWJbIGkgXS5waWQsIFNJR0tJTEwgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZHRhYlsgaSBdLmV4aXRfcmVhc29uID0gRVhJVF9USU1FT1VUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBnbG9icy50aW1lb3V0IC0gY29uc3VtZWQgPCBzZWxlY3RfdGltZW91dCApCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RfdGltZW91dCA9IGdsb2JzLnRpbWVvdXQgLSBjb25zdW1lZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIG5vdGhpbmcgZWxzZSBjYXVzZXMgb3VyIHNlbGVjdCgpIGNhbGwgdG8gZXhpdCwgZm9yY2UgaXQgYWZ0ZXIKKyAgICAgICAgICAgICAqIGhvd2V2ZXIgbG9uZyBpdCB0YWtlcyBmb3IgdGhlIG5leHQgb25lIG9mIG91ciBjaGlsZCBwcm9jZXNzZXMgdG8KKyAgICAgICAgICAgICAqIGNyb3NzZWQgaXRzIGFsbG90ZWQgcHJvY2Vzc2luZyB0aW1lIHNvIHdlIGNhbiB0ZXJtaW5hdGUgaXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHR2LnR2X3NlYyA9IHNlbGVjdF90aW1lb3V0OworICAgICAgICAgICAgdHYudHZfdXNlYyA9IDA7CisgICAgICAgICAgICBwdHYgPSAmdHY7CisgICAgICAgIH0KKworICAgICAgICAvKiBzZWxlY3QoKSB3aWxsIHdhaXQgZm9yIEkvTyBvbiBhIGRlc2NyaXB0b3IsIGEgc2lnbmFsLCBvciB0aW1lb3V0LiAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgd2hpbGUgKCAoIHJldCA9IHNlbGVjdCggZmRfbWF4ICsgMSwgJmZkcywgMCwgMCwgcHR2ICkgKSA9PSAtMSApCisgICAgICAgICAgICAgICAgaWYgKCBlcnJubyAhPSBFSU5UUiApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKCByZXQgPD0gMCApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGdsb2JzLmpvYnM7ICsraSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvdXRfZG9uZSA9IDA7CisgICAgICAgICAgICBpbnQgZXJyX2RvbmUgPSAwOworICAgICAgICAgICAgaWYgKCBGRF9JU1NFVCggY21kdGFiWyBpIF0uZmRbIE9VVCBdLCAmZmRzICkgKQorICAgICAgICAgICAgICAgIG91dF9kb25lID0gcmVhZF9kZXNjcmlwdG9yKCBpLCBPVVQgKTsKKworICAgICAgICAgICAgaWYgKCBnbG9icy5waXBlX2FjdGlvbiAmJiBGRF9JU1NFVCggY21kdGFiWyBpIF0uZmRbIEVSUiBdLCAmZmRzICkgKQorICAgICAgICAgICAgICAgIGVycl9kb25lID0gcmVhZF9kZXNjcmlwdG9yKCBpLCBFUlIgKTsKKworICAgICAgICAgICAgLyogSWYgZmVvZiBvbiBlaXRoZXIgZGVzY3JpcHRvciwgd2UgYXJlIGRvbmUuICovCisgICAgICAgICAgICBpZiAoIG91dF9kb25lIHx8IGVycl9kb25lICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcGlkOworICAgICAgICAgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgICAgICAgICAgaW50IHJzdGF0OworICAgICAgICAgICAgICAgIHRpbWluZ19pbmZvIHRpbWVfaW5mbzsKKworICAgICAgICAgICAgICAgIC8qIFdlIGZvdW5kIGEgdGVybWluYXRlZCBjaGlsZCBwcm9jZXNzIC0gb3VyIHNlYXJjaCBpcyBkb25lLiAqLworICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gMTsKKworICAgICAgICAgICAgICAgIC8qIENsb3NlIHRoZSBzdHJlYW0gYW5kIHBpcGUgZGVzY3JpcHRvcnMuICovCisgICAgICAgICAgICAgICAgY2xvc2Vfc3RyZWFtcyggaSwgT1VUICk7CisgICAgICAgICAgICAgICAgaWYgKCBnbG9icy5waXBlX2FjdGlvbiApCisgICAgICAgICAgICAgICAgICAgIGNsb3NlX3N0cmVhbXMoIGksIEVSUiApOworCisgICAgICAgICAgICAgICAgLyogUmVhcCB0aGUgY2hpbGQgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLiAqLworICAgICAgICAgICAgICAgIHdoaWxlICggKCBwaWQgPSB3YWl0cGlkKCBjbWR0YWJbIGkgXS5waWQsICZzdGF0dXMsIDAgKSApID09IC0xICkKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBlcnJubyAhPSBFSU5UUiApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoIHBpZCAhPSBjbWR0YWJbIGkgXS5waWQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAidW5rbm93biBwaWQgJWQgd2l0aCBlcnJubyA9ICVkXG4iLCBwaWQsIGVycm5vICk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoIEVYSVRCQUQgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBTZXQgcmVhc29uIGZvciBleGl0IGlmIG5vdCB0aW1lZCBvdXQuICovCisgICAgICAgICAgICAgICAgaWYgKCBXSUZFWElURUQoIHN0YXR1cyApICkKKyAgICAgICAgICAgICAgICAgICAgY21kdGFiWyBpIF0uZXhpdF9yZWFzb24gPSBXRVhJVFNUQVRVUyggc3RhdHVzICkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gRVhJVF9GQUlMCisgICAgICAgICAgICAgICAgICAgICAgICA6IEVYSVRfT0s7CisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0bXMgbmV3X3RpbWU7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzKCAmbmV3X3RpbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZV9pbmZvLnN5c3RlbSA9IChkb3VibGUpKCBuZXdfdGltZS50bXNfY3N0aW1lIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZF90aW1lLnRtc19jc3RpbWUgKSAvIENMT0NLU19QRVJfU0VDOworICAgICAgICAgICAgICAgICAgICB0aW1lX2luZm8udXNlciAgID0gKGRvdWJsZSkoIG5ld190aW1lLnRtc19jdXRpbWUgLQorICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3RpbWUudG1zX2N1dGltZSApIC8gQ0xPQ0tTX1BFUl9TRUM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcF9jb3B5KCAmdGltZV9pbmZvLnN0YXJ0LCAmY21kdGFiWyBpIF0uc3RhcnRfZHQgKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wX2N1cnJlbnQoICZ0aW1lX2luZm8uZW5kICk7CisgICAgICAgICAgICAgICAgICAgIG9sZF90aW1lID0gbmV3X3RpbWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogRHJpdmUgdGhlIGNvbXBsZXRpb24uICovCisgICAgICAgICAgICAgICAgaWYgKCBpbnRlcnJ1cHRlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgcnN0YXQgPSBFWEVDX0NNRF9JTlRSOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzdGF0dXMgKQorICAgICAgICAgICAgICAgICAgICByc3RhdCA9IEVYRUNfQ01EX0ZBSUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByc3RhdCA9IEVYRUNfQ01EX09LOworCisgICAgICAgICAgICAgICAgLyogQ2FsbCB0aGUgY2FsbGJhY2ssIG1heSBjYWxsIGJhY2sgdG8gamFtIHJ1bGUgbGFuZC4gKi8KKyAgICAgICAgICAgICAgICAoKmNtZHRhYlsgaSBdLmZ1bmMpKCBjbWR0YWJbIGkgXS5jbG9zdXJlLCByc3RhdCwgJnRpbWVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgY21kdGFiWyBpIF0uYnVmZmVyWyBPVVQgXSwgY21kdGFiWyBpIF0uYnVmZmVyWyBFUlIgXSwKKyAgICAgICAgICAgICAgICAgICAgY21kdGFiWyBpIF0uZXhpdF9yZWFzb24gKTsKKworICAgICAgICAgICAgICAgIC8qIENsZWFuIHVwIHRoZSBjb21tYW5kJ3MgcnVubmluZyBjb21tYW5kcyB0YWJsZSBzbG90LiAqLworICAgICAgICAgICAgICAgIEJKQU1fRlJFRSggY21kdGFiWyBpIF0uYnVmZmVyWyBPVVQgXSApOworICAgICAgICAgICAgICAgIGNtZHRhYlsgaSBdLmJ1ZmZlclsgT1VUIF0gPSAwOworICAgICAgICAgICAgICAgIGNtZHRhYlsgaSBdLmJ1Zl9zaXplWyBPVVQgXSA9IDA7CisKKyAgICAgICAgICAgICAgICBCSkFNX0ZSRUUoIGNtZHRhYlsgaSBdLmJ1ZmZlclsgRVJSIF0gKTsKKyAgICAgICAgICAgICAgICBjbWR0YWJbIGkgXS5idWZmZXJbIEVSUiBdID0gMDsKKyAgICAgICAgICAgICAgICBjbWR0YWJbIGkgXS5idWZfc2l6ZVsgRVJSIF0gPSAwOworCisgICAgICAgICAgICAgICAgY21kdGFiWyBpIF0ucGlkID0gMDsKKyAgICAgICAgICAgICAgICBjbWR0YWJbIGkgXS5mdW5jID0gMDsKKyAgICAgICAgICAgICAgICBjbWR0YWJbIGkgXS5jbG9zdXJlID0gMDsKKyAgICAgICAgICAgICAgICBjbWR0YWJbIGkgXS5zdGFydF90aW1lID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisvKgorICogRmluZCBhIGZyZWUgc2xvdCBpbiB0aGUgcnVubmluZyBjb21tYW5kcyB0YWJsZS4KKyAqLworCitzdGF0aWMgaW50IGdldF9mcmVlX2NtZHRhYl9zbG90KCkKK3sKKyAgICBpbnQgc2xvdDsKKyAgICBmb3IgKCBzbG90ID0gMDsgc2xvdCA8IE1BWEpPQlM7ICsrc2xvdCApCisgICAgICAgIGlmICggIWNtZHRhYlsgc2xvdCBdLnBpZCApCisgICAgICAgICAgICByZXR1cm4gc2xvdDsKKyAgICBwcmludGYoICJubyBzbG90cyBmb3IgY2hpbGQhXG4iICk7CisgICAgZXhpdCggRVhJVEJBRCApOworfQorCisjIGVuZGlmIC8qIFVTRV9FWEVDVU5JWCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZmlsZW50LmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9maWxlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGFjMzMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZmlsZW50LmMKQEAgLTAsMCArMSw0MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NSBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qIFRoaXMgZmlsZSBpcyBBTFNPOgorICogQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyAqIENvcHlyaWdodCAyMDA1IFJlbmUgUml2ZXJhLgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKy8qCisgKiBmaWxlbnQuYyAtIHNjYW4gZGlyZWN0b3JpZXMgYW5kIGFyY2hpdmVzIG9uIE5UCisgKgorICogRXh0ZXJuYWwgcm91dGluZXM6CisgKiAgZmlsZV9hcmNoc2NhbigpICAgICAgICAgICAgICAgICAtIHNjYW4gYW4gYXJjaGl2ZSBmb3IgZmlsZXMKKyAqICBmaWxlX21rZGlyKCkgICAgICAgICAgICAgICAgICAgIC0gY3JlYXRlIGEgZGlyZWN0b3J5CisgKiAgZmlsZV9zdXBwb3J0ZWRfZm10X3Jlc29sdXRpb24oKSAtIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCByZXNvbHV0aW9uCisgKgorICogRXh0ZXJuYWwgcm91dGluZXMgY2FsbGVkIG9ubHkgdmlhIHJvdXRpbmVzIGluIGZpbGVzeXMuYzoKKyAqICBmaWxlX2NvbGxlY3RfZGlyX2NvbnRlbnRfKCkgLSBjb2xsZWN0cyBkaXJlY3RvcnkgY29udGVudCBpbmZvcm1hdGlvbgorICogIGZpbGVfZGlyc2Nhbl8oKSAgICAgICAgICAgICAtIE9TIHNwZWNpZmljIGZpbGVfZGlyc2NhbigpIGltcGxlbWVudGF0aW9uCisgKiAgZmlsZV9xdWVyeV8oKSAgICAgICAgICAgICAgIC0gcXVlcnkgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXRoIGZyb20gdGhlIE9TCisgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2lmZGVmIE9TX05UCisjaW5jbHVkZSAiZmlsZXN5cy5oIgorCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAicGF0aHN5cy5oIgorI2luY2x1ZGUgInN0cmluZ3MuaCIKKworI2lmZGVmIF9fQk9STEFORENfXworIyB1bmRlZiBGSUxFTkFNRSAgLyogY3BwIG5hbWVzcGFjZSBjb2xsaXNpb24gKi8KKyNlbmRpZgorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGRpcmVjdC5oPgorI2luY2x1ZGUgPGlvLmg+CisKKworLyoKKyAqIGZpbGVfY29sbGVjdF9kaXJfY29udGVudF8oKSAtIGNvbGxlY3RzIGRpcmVjdG9yeSBjb250ZW50IGluZm9ybWF0aW9uCisgKi8KKworaW50IGZpbGVfY29sbGVjdF9kaXJfY29udGVudF8oIGZpbGVfaW5mb190ICogY29uc3QgZCApCit7CisgICAgUEFUSE5BTUUgZjsKKyAgICBzdHJpbmcgcGF0aHNwZWNbIDEgXTsKKyAgICBzdHJpbmcgcGF0aG5hbWVbIDEgXTsKKyAgICBMSVNUICogZmlsZXMgPSBMMDsKKyAgICBpbnQgZF9sZW5ndGg7CisKKyAgICBhc3NlcnQoIGQgKTsKKyAgICBhc3NlcnQoIGQtPmlzX2RpciApOworICAgIGFzc2VydCggbGlzdF9lbXB0eSggZC0+ZmlsZXMgKSApOworCisgICAgZF9sZW5ndGggPSBzdHJsZW4oIG9iamVjdF9zdHIoIGQtPm5hbWUgKSApOworCisgICAgbWVtc2V0KCAoY2hhciAqKSZmLCAnXDAnLCBzaXplb2YoIGYgKSApOworICAgIGYuZl9kaXIucHRyID0gb2JqZWN0X3N0ciggZC0+bmFtZSApOworICAgIGYuZl9kaXIubGVuID0gZF9sZW5ndGg7CisKKyAgICAvKiBQcmVwYXJlIGZpbGUgc2VhcmNoIHNwZWNpZmljYXRpb24gZm9yIHRoZSBGaW5kWFhYKCkgV2luZG93cyBBUEkuICovCisgICAgaWYgKCAhZF9sZW5ndGggKQorICAgICAgICBzdHJpbmdfY29weSggcGF0aHNwZWMsICIuXFwqIiApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFdlIGNhbiBub3Qgc2ltcGx5IGFzc3VtZSB0aGUgZ2l2ZW4gZm9sZGVyIG5hbWUgd2lsbCBuZXZlciBpbmNsdWRlIGl0cworICAgICAgICAgKiB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBvciBvdGhlcndpc2Ugd2Ugd291bGQgbm90IHN1cHBvcnQgdGhlIFdpbmRvd3MKKyAgICAgICAgICogcm9vdCBmb2xkZXIgc3BlY2lmaWVkIHdpdGhvdXQgaXRzIGRyaXZlIGxldHRlciwgaS5lLiAnXCcuCisgICAgICAgICAqLworICAgICAgICBjaGFyIGNvbnN0IHRyYWlsaW5nQ2hhciA9IG9iamVjdF9zdHIoIGQtPm5hbWUgKVsgZF9sZW5ndGggLSAxIF0gOworICAgICAgICBzdHJpbmdfY29weSggcGF0aHNwZWMsIG9iamVjdF9zdHIoIGQtPm5hbWUgKSApOworICAgICAgICBpZiAoICggdHJhaWxpbmdDaGFyICE9ICdcXCcgKSAmJiAoIHRyYWlsaW5nQ2hhciAhPSAnLycgKSApCisgICAgICAgICAgICBzdHJpbmdfYXBwZW5kKCBwYXRoc3BlYywgIlxcIiApOworICAgICAgICBzdHJpbmdfYXBwZW5kKCBwYXRoc3BlYywgIioiICk7CisgICAgfQorCisgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGZvciBjb2xsZWN0aW5nIGluZm9ybWF0aW9uIGFib3V0IGFsbCBmaWxlcyBpbiBhIGZvbGRlcgorICAgICAqIG5lZWRzIHRvIGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggaG93IHRoZSBmaWxlX3F1ZXJ5KCkgb3BlcmF0aW9uIGlzCisgICAgICogaW1wbGVtZW50ZWQgKGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGZpbGUpLgorICAgICAqLworICAgIHsKKyAgICAgICAgLyogRklYTUU6IEF2b2lkIGR1cGxpY2F0ZSBGaW5kWFhYIFdpbmRvd3MgQVBJIGNhbGxzIGhlcmUgYW5kIGluIHRoZSBjb2RlCisgICAgICAgICAqIGRldGVybWluaW5nIGEgbm9ybWFsaXplZCBwYXRoLgorICAgICAgICAgKi8KKyAgICAgICAgV0lOMzJfRklORF9EQVRBIGZpbmZvOworICAgICAgICBIQU5ETEUgY29uc3QgZmluZEhhbmRsZSA9IEZpbmRGaXJzdEZpbGVBKCBwYXRoc3BlYy0+dmFsdWUsICZmaW5mbyApOworICAgICAgICBpZiAoIGZpbmRIYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmdfZnJlZSggcGF0aHNwZWMgKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmluZ19uZXcoIHBhdGhuYW1lICk7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIE9CSkVDVCAqIHBhdGhuYW1lX29iajsKKworICAgICAgICAgICAgZi5mX2Jhc2UucHRyID0gZmluZm8uY0ZpbGVOYW1lOworICAgICAgICAgICAgZi5mX2Jhc2UubGVuID0gc3RybGVuKCBmaW5mby5jRmlsZU5hbWUgKTsKKworICAgICAgICAgICAgc3RyaW5nX3RydW5jYXRlKCBwYXRobmFtZSwgMCApOworICAgICAgICAgICAgcGF0aF9idWlsZCggJmYsIHBhdGhuYW1lICk7CisKKyAgICAgICAgICAgIHBhdGhuYW1lX29iaiA9IG9iamVjdF9uZXcoIHBhdGhuYW1lLT52YWx1ZSApOworICAgICAgICAgICAgcGF0aF9yZWdpc3Rlcl9rZXkoIHBhdGhuYW1lX29iaiApOworICAgICAgICAgICAgZmlsZXMgPSBsaXN0X3B1c2hfYmFjayggZmlsZXMsIHBhdGhuYW1lX29iaiApOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmb3VuZDsKKyAgICAgICAgICAgICAgICBmaWxlX2luZm9fdCAqIGNvbnN0IGZmID0gZmlsZV9pbmZvKCBwYXRobmFtZV9vYmosICZmb3VuZCApOworICAgICAgICAgICAgICAgIGZmLT5pc19kaXIgPSBmaW5mby5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZOworICAgICAgICAgICAgICAgIGZmLT5pc19maWxlID0gIWZmLT5pc19kaXI7CisgICAgICAgICAgICAgICAgZmYtPmV4aXN0cyA9IDE7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wX2Zyb21fZmlsZXRpbWUoICZmZi0+dGltZSwgJmZpbmZvLmZ0TGFzdFdyaXRlVGltZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlICggRmluZE5leHRGaWxlKCBmaW5kSGFuZGxlLCAmZmluZm8gKSApOworCisgICAgICAgIEZpbmRDbG9zZSggZmluZEhhbmRsZSApOworICAgIH0KKworICAgIHN0cmluZ19mcmVlKCBwYXRobmFtZSApOworICAgIHN0cmluZ19mcmVlKCBwYXRoc3BlYyApOworCisgICAgZC0+ZmlsZXMgPSBmaWxlczsKKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogZmlsZV9kaXJzY2FuXygpIC0gT1Mgc3BlY2lmaWMgZmlsZV9kaXJzY2FuKCkgaW1wbGVtZW50YXRpb24KKyAqLworCit2b2lkIGZpbGVfZGlyc2Nhbl8oIGZpbGVfaW5mb190ICogY29uc3QgZCwgc2NhbmJhY2sgZnVuYywgdm9pZCAqIGNsb3N1cmUgKQoreworICAgIGFzc2VydCggZCApOworICAgIGFzc2VydCggZC0+aXNfZGlyICk7CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgXCBvciBkOlwgOiBlbnRlciBpdCAqLworICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IG5hbWUgPSBvYmplY3Rfc3RyKCBkLT5uYW1lICk7CisgICAgICAgIGlmICggbmFtZVsgMCBdID09ICdcXCcgJiYgIW5hbWVbIDEgXSApCisgICAgICAgIHsKKyAgICAgICAgICAgICgqZnVuYykoIGNsb3N1cmUsIGQtPm5hbWUsIDEgLyogc3RhdCgpJ2VkICovLCAmZC0+dGltZSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBuYW1lWyAwIF0gJiYgbmFtZVsgMSBdID09ICc6JyAmJiBuYW1lWyAyIF0gJiYgIW5hbWVbIDMgXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdlIGhhdmUganVzdCBlbnRlcmVkIGEgMy1sZXR0ZXIgZHJpdmUgbmFtZSBzcGVsbGluZyAod2l0aCBhCisgICAgICAgICAgICAgKiB0cmFpbGluZyBzbGFzaCksIGludG8gdGhlIGhhc2ggdGFibGUuIE5vdyBlbnRlciBpdHMgdHdvLWxldHRlcgorICAgICAgICAgICAgICogdmFyaWFudCwgd2l0aG91dCB0aGUgdHJhaWxpbmcgc2xhc2gsIHNvIHRoYXQgaWYgd2UgdHJ5IHRvIGNoZWNrCisgICAgICAgICAgICAgKiB3aGV0aGVyICJjOiIgZXhpc3RzLCB3ZSBoaXQgaXQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogSmFtIGNvcmUgaGFzIHdvcmthcm91bmRzIGZvciB0aGF0LiBHaXZlbjoKKyAgICAgICAgICAgICAqICAgIHggPSBjOlx3aGF0ZXZlclxmb28gOworICAgICAgICAgICAgICogICAgcCA9ICQoeDpEKSA7CisgICAgICAgICAgICAgKiAgICBwMiA9ICQocDpEKSA7CisgICAgICAgICAgICAgKiBUaGVyZSB3aWxsIGJlIG5vIHRyYWlsaW5nIHNsYXNoIGluICQocCksIGJ1dCB0aGVyZSB3aWxsIGJlIG9uZSBpbgorICAgICAgICAgICAgICogJChwMikuIEJ1dCwgdGhhdCBzZWVtcyByYXRoZXIgZnJhZ2lsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgT0JKRUNUICogY29uc3QgZGlyX25vX3NsYXNoID0gb2JqZWN0X25ld19yYW5nZSggbmFtZSwgMiApOworICAgICAgICAgICAgKCpmdW5jKSggY2xvc3VyZSwgZC0+bmFtZSwgMSAvKiBzdGF0KCknZWQgKi8sICZkLT50aW1lICk7CisgICAgICAgICAgICAoKmZ1bmMpKCBjbG9zdXJlLCBkaXJfbm9fc2xhc2gsIDEgLyogc3RhdCgpJ2VkICovLCAmZC0+dGltZSApOworICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIGRpcl9ub19zbGFzaCApOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qCisgKiBmaWxlX21rZGlyKCkgLSBjcmVhdGUgYSBkaXJlY3RvcnkKKyAqLworCitpbnQgZmlsZV9ta2RpciggY2hhciBjb25zdCAqIGNvbnN0IHBhdGggKQoreworICAgIHJldHVybiBfbWtkaXIoIHBhdGggKTsKK30KKworCisvKgorICogZmlsZV9xdWVyeV8oKSAtIHF1ZXJ5IGluZm9ybWF0aW9uIGFib3V0IGEgcGF0aCBmcm9tIHRoZSBPUworICoKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBmb3IgY29sbGVjdGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBmaWxlIG5lZWRzIHRvIGJlCisgKiBrZXB0IHN5bmNocm9uaXplZCB3aXRoIGhvdyB0aGUgZmlsZV9jb2xsZWN0X2Rpcl9jb250ZW50XygpIG9wZXJhdGlvbiBpcworICogaW1wbGVtZW50ZWQgKGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IGFsbCBmaWxlcyBpbiBhIGZvbGRlcikuCisgKi8KKworaW50IHRyeV9maWxlX3F1ZXJ5X3Jvb3QoIGZpbGVfaW5mb190ICogY29uc3QgaW5mbyApCit7CisgICAgV0lOMzJfRklMRV9BVFRSSUJVVEVfREFUQSBmaWxlRGF0YTsKKyAgICBjaGFyIGJ1ZlsgNCBdOworICAgIGNoYXIgY29uc3QgKiBjb25zdCBwYXRoc3RyID0gb2JqZWN0X3N0ciggaW5mby0+bmFtZSApOworICAgIGlmICggIXBhdGhzdHJbIDAgXSApCisgICAgeworICAgICAgICBidWZbIDAgXSA9ICcuJzsKKyAgICAgICAgYnVmWyAxIF0gPSAwOworICAgIH0KKyAgICBlbHNlIGlmICggcGF0aHN0clsgMCBdID09ICdcXCcgJiYgISBwYXRoc3RyWyAxIF0gKQorICAgIHsKKyAgICAgICAgYnVmWyAwIF0gPSAnXFwnOworICAgICAgICBidWZbIDEgXSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UgaWYgKCBwYXRoc3RyWyAxIF0gPT0gJzonICkKKyAgICB7CisgICAgICAgIGlmICggIXBhdGhzdHJbIDIgXSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggIXBhdGhzdHJbIDIgXSB8fCAoIHBhdGhzdHJbIDIgXSA9PSAnXFwnICYmICFwYXRoc3RyWyAzIF0gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZlsgMCBdID0gcGF0aHN0clsgMCBdOworICAgICAgICAgICAgYnVmWyAxIF0gPSAnOic7CisgICAgICAgICAgICBidWZbIDIgXSA9ICdcXCc7CisgICAgICAgICAgICBidWZbIDMgXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgICAgIAorICAgIC8qIFdlIGhhdmUgYSByb290IHBhdGggKi8KKyAgICBpZiAoICFHZXRGaWxlQXR0cmlidXRlc0V4QSggYnVmLCBHZXRGaWxlRXhJbmZvU3RhbmRhcmQsICZmaWxlRGF0YSApICkKKyAgICB7CisgICAgICAgIGluZm8tPmlzX2RpciA9IDA7CisgICAgICAgIGluZm8tPmlzX2ZpbGUgPSAwOworICAgICAgICBpbmZvLT5leGlzdHMgPSAwOworICAgICAgICB0aW1lc3RhbXBfY2xlYXIoICZpbmZvLT50aW1lICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluZm8tPmlzX2RpciA9IGZpbGVEYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7CisgICAgICAgIGluZm8tPmlzX2ZpbGUgPSAhaW5mby0+aXNfZGlyOworICAgICAgICBpbmZvLT5leGlzdHMgPSAxOworICAgICAgICB0aW1lc3RhbXBfZnJvbV9maWxldGltZSggJmluZm8tPnRpbWUsICZmaWxlRGF0YS5mdExhc3RXcml0ZVRpbWUgKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZmlsZV9xdWVyeV8oIGZpbGVfaW5mb190ICogY29uc3QgaW5mbyApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IHBhdGhzdHIgPSBvYmplY3Rfc3RyKCBpbmZvLT5uYW1lICk7CisgICAgY29uc3QgY2hhciAqIGRpcjsKKyAgICBPQkpFQ1QgKiBwYXJlbnQ7CisgICAgZmlsZV9pbmZvX3QgKiBwYXJlbnRfaW5mbzsKKworICAgIGlmICggdHJ5X2ZpbGVfcXVlcnlfcm9vdCggaW5mbyApICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCAoIGRpciA9IHN0cnJjaHIoIHBhdGhzdHIsICdcXCcgKSApICkKKyAgICB7CisgICAgICAgIHBhcmVudCA9IG9iamVjdF9uZXdfcmFuZ2UoIHBhdGhzdHIsIGRpciAtIHBhdGhzdHIgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGFyZW50ID0gb2JqZWN0X2NvcHkoIGNvbnN0YW50X2VtcHR5ICk7CisgICAgfQorICAgIHBhcmVudF9pbmZvID0gZmlsZV9xdWVyeSggcGFyZW50ICk7CisgICAgb2JqZWN0X2ZyZWUoIHBhcmVudCApOworICAgIGlmICggIXBhcmVudF9pbmZvIHx8ICFwYXJlbnRfaW5mby0+aXNfZGlyICkKKyAgICB7CisgICAgICAgIGluZm8tPmlzX2RpciA9IDA7CisgICAgICAgIGluZm8tPmlzX2ZpbGUgPSAwOworICAgICAgICBpbmZvLT5leGlzdHMgPSAwOworICAgICAgICB0aW1lc3RhbXBfY2xlYXIoICZpbmZvLT50aW1lICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluZm8tPmlzX2RpciA9IDA7CisgICAgICAgIGluZm8tPmlzX2ZpbGUgPSAwOworICAgICAgICBpbmZvLT5leGlzdHMgPSAwOworICAgICAgICB0aW1lc3RhbXBfY2xlYXIoICZpbmZvLT50aW1lICk7CisgICAgICAgIGlmICggbGlzdF9lbXB0eSggcGFyZW50X2luZm8tPmZpbGVzICkgKQorICAgICAgICAgICAgZmlsZV9jb2xsZWN0X2Rpcl9jb250ZW50XyggcGFyZW50X2luZm8gKTsKKyAgICB9Cit9CisKKworLyoKKyAqIGZpbGVfc3VwcG9ydGVkX2ZtdF9yZXNvbHV0aW9uKCkgLSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgcmVzb2x1dGlvbgorICoKKyAqIFJldHVybnMgdGhlIG1pbmltdW0gZmlsZSBtb2RpZmljYXRpb24gdGltZXN0YW1wIHJlc29sdXRpb24gc3VwcG9ydGVkIGJ5IHRoaXMKKyAqIEJvb3N0IEphbSBpbXBsZW1lbnRhdGlvbi4gRmlsZSBtb2RpZmljYXRpb24gdGltZXN0YW1wIGNoYW5nZXMgb2YgbGVzcyB0aGFuCisgKiB0aGUgcmV0dXJuZWQgdmFsdWUgbWlnaHQgbm90IGJlIHJlY29nbml6ZWQuCisgKgorICogRG9lcyBub3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gYW55IE9TIG9yIGZpbGUgc3lzdGVtIHJlbGF0ZWQgcmVzdHJpY3Rpb25zLgorICoKKyAqIFJldHVybiB2YWx1ZSAwIGluZGljYXRlcyB0aGF0IGFueSB2YWx1ZSBzdXBwb3J0ZWQgYnkgdGhlIE9TIGlzIGFsc28gc3VwcG9ydGVkCisgKiBoZXJlLgorICovCisKK3ZvaWQgZmlsZV9zdXBwb3J0ZWRfZm10X3Jlc29sdXRpb24oIHRpbWVzdGFtcCAqIGNvbnN0IHQgKQoreworICAgIC8qIE9uIFdpbmRvd3Mgd2Ugc3VwcG9ydCBuYW5vLXNlY29uZCBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgcmVzb2x1dGlvbiwKKyAgICAgKiBqdXN0IHRoZSBzYW1lIGFzIHRoZSBXaW5kb3dzIE9TIGl0c2VsZi4KKyAgICAgKi8KKyAgICB0aW1lc3RhbXBfaW5pdCggdCwgMCwgMCApOworfQorCisKKy8qCisgKiBmaWxlX2FyY2hzY2FuKCkgLSBzY2FuIGFuIGFyY2hpdmUgZm9yIGZpbGVzCisgKi8KKworLyogU3RyYWlnaHQgZnJvbSBTdW5PUyAqLworCisjZGVmaW5lIEFSTUFHICAiITxhcmNoPlxuIgorI2RlZmluZSBTQVJNQUcgIDgKKworI2RlZmluZSBBUkZNQUcgICJgXG4iCisKK3N0cnVjdCBhcl9oZHIKK3sKKyAgICBjaGFyIGFyX25hbWVbIDE2IF07CisgICAgY2hhciBhcl9kYXRlWyAxMiBdOworICAgIGNoYXIgYXJfdWlkWyA2IF07CisgICAgY2hhciBhcl9naWRbIDYgXTsKKyAgICBjaGFyIGFyX21vZGVbIDggXTsKKyAgICBjaGFyIGFyX3NpemVbIDEwIF07CisgICAgY2hhciBhcl9mbWFnWyAyIF07Cit9OworCisjZGVmaW5lIFNBUkZNQUcgIDIKKyNkZWZpbmUgU0FSSERSICBzaXplb2YoIHN0cnVjdCBhcl9oZHIgKQorCit2b2lkIGZpbGVfYXJjaHNjYW4oIGNoYXIgY29uc3QgKiBhcmNoaXZlLCBzY2FuYmFjayBmdW5jLCB2b2lkICogY2xvc3VyZSApCit7CisgICAgc3RydWN0IGFyX2hkciBhcl9oZHI7CisgICAgY2hhciAqIHN0cmluZ190YWJsZSA9IDA7CisgICAgY2hhciBidWZbIE1BWEpQQVRIIF07CisgICAgbG9uZyBvZmZzZXQ7CisgICAgaW50IGNvbnN0IGZkID0gb3BlbiggYXJjaGl2ZSwgT19SRE9OTFkgfCBPX0JJTkFSWSwgMCApOworCisgICAgaWYgKCBmZCA8IDAgKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIHJlYWQoIGZkLCBidWYsIFNBUk1BRyApICE9IFNBUk1BRyB8fCBzdHJuY21wKCBBUk1BRywgYnVmLCBTQVJNQUcgKSApCisgICAgeworICAgICAgICBjbG9zZSggZmQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG9mZnNldCA9IFNBUk1BRzsKKworICAgIGlmICggREVCVUdfQklORFNDQU4gKQorICAgICAgICBwcmludGYoICJzY2FuIGFyY2hpdmUgJXNcbiIsIGFyY2hpdmUgKTsKKworICAgIHdoaWxlICggKCByZWFkKCBmZCwgJmFyX2hkciwgU0FSSERSICkgPT0gU0FSSERSICkgJiYKKyAgICAgICAgIW1lbWNtcCggYXJfaGRyLmFyX2ZtYWcsIEFSRk1BRywgU0FSRk1BRyApICkKKyAgICB7CisgICAgICAgIGxvbmcgbGFyX2RhdGU7CisgICAgICAgIGxvbmcgbGFyX3NpemU7CisgICAgICAgIGNoYXIgKiBuYW1lID0gMDsKKyAgICAgICAgY2hhciAqIGVuZG5hbWU7CisKKyAgICAgICAgc3NjYW5mKCBhcl9oZHIuYXJfZGF0ZSwgIiVsZCIsICZsYXJfZGF0ZSApOworICAgICAgICBzc2NhbmYoIGFyX2hkci5hcl9zaXplLCAiJWxkIiwgJmxhcl9zaXplICk7CisKKyAgICAgICAgbGFyX3NpemUgPSAoIGxhcl9zaXplICsgMSApICYgfjE7CisKKyAgICAgICAgaWYgKCBhcl9oZHIuYXJfbmFtZVsgMCBdID09ICcvJyAmJiBhcl9oZHIuYXJfbmFtZVsgMSBdID09ICcvJyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlICJzdHJpbmcgdGFibGUiIGVudHJ5IG9mIHRoZSBzeW1ib2wgdGFibGUsIGhvbGRpbmcKKyAgICAgICAgICAgICAqIGZpbGVuYW1lIHN0cmluZ3MgbG9uZ2VyIHRoYW4gMTUgY2hhcmFjdGVycywgaS5lLiB0aG9zZSB0aGF0IGRvCisgICAgICAgICAgICAgKiBub3QgZml0IGludG8gYXJfbmFtZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3RyaW5nX3RhYmxlID0gQkpBTV9NQUxMT0NfQVRPTUlDKCBsYXJfc2l6ZSArIDEgKTsKKyAgICAgICAgICAgIGlmICggcmVhZCggZmQsIHN0cmluZ190YWJsZSwgbGFyX3NpemUgKSAhPSBsYXJfc2l6ZSApCisgICAgICAgICAgICAgICAgcHJpbnRmKCAiZXJyb3IgcmVhZGluZyBzdHJpbmcgdGFibGVcbiIgKTsKKyAgICAgICAgICAgIHN0cmluZ190YWJsZVsgbGFyX3NpemUgXSA9ICdcMCc7CisgICAgICAgICAgICBvZmZzZXQgKz0gU0FSSERSICsgbGFyX3NpemU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggYXJfaGRyLmFyX25hbWVbIDAgXSA9PSAnLycgJiYgYXJfaGRyLmFyX25hbWVbIDEgXSAhPSAnICcgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBMb25nIGZpbGVuYW1lcyBhcmUgcmVjb2duaXplZCBieSAiL25ubm4iIHdoZXJlIG5ubm4gaXMgdGhlCisgICAgICAgICAgICAgKiBzdHJpbmcncyBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSByZXByZXNlbnRlZCBpbiBBU0NJSQorICAgICAgICAgICAgICogZGVjaW1hbHMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG5hbWUgPSBzdHJpbmdfdGFibGUgKyBhdG9pKCBhcl9oZHIuYXJfbmFtZSArIDEgKTsKKyAgICAgICAgICAgIGZvciAoIGVuZG5hbWUgPSBuYW1lOyAqZW5kbmFtZSAmJiAqZW5kbmFtZSAhPSAnXG4nOyArK2VuZG5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5vcm1hbCBuYW1lICovCisgICAgICAgICAgICBuYW1lID0gYXJfaGRyLmFyX25hbWU7CisgICAgICAgICAgICBlbmRuYW1lID0gbmFtZSArIHNpemVvZiggYXJfaGRyLmFyX25hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0cmlwIHRyYWlsaW5nIHdoaXRlLXNwYWNlLCBzbGFzaGVzLCBhbmQgYmFja3NsYXNoZXMgKi8KKworICAgICAgICB3aGlsZSAoIGVuZG5hbWUtLSA+IG5hbWUgKQorICAgICAgICAgICAgaWYgKCAhaXNzcGFjZSggKmVuZG5hbWUgKSAmJiAoICplbmRuYW1lICE9ICdcXCcgKSAmJiAoICplbmRuYW1lICE9CisgICAgICAgICAgICAgICAgJy8nICkgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAqKytlbmRuYW1lID0gMDsKKworICAgICAgICAvKiBzdHJpcCBsZWFkaW5nIGRpcmVjdG9yeSBuYW1lcywgYW4gTlQgc3BlY2lhbHR5ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKiBjOworICAgICAgICAgICAgaWYgKCBjID0gc3RycmNociggbmFtZSwgJy8nICkgKQorICAgICAgICAgICAgICAgIG5hbWUgPSBjICsgMTsKKyAgICAgICAgICAgIGlmICggYyA9IHN0cnJjaHIoIG5hbWUsICdcXCcgKSApCisgICAgICAgICAgICAgICAgbmFtZSA9IGMgKyAxOworICAgICAgICB9CisKKyAgICAgICAgc3ByaW50ZiggYnVmLCAiJXMoJS4qcykiLCBhcmNoaXZlLCBlbmRuYW1lIC0gbmFtZSwgbmFtZSApOworICAgICAgICB7CisgICAgICAgICAgICBPQkpFQ1QgKiBjb25zdCBtZW1iZXIgPSBvYmplY3RfbmV3KCBidWYgKTsKKyAgICAgICAgICAgIHRpbWVzdGFtcCB0aW1lOworICAgICAgICAgICAgdGltZXN0YW1wX2luaXQoICZ0aW1lLCAodGltZV90KWxhcl9kYXRlLCAwICk7CisgICAgICAgICAgICAoKmZ1bmMpKCBjbG9zdXJlLCBtZW1iZXIsIDEgLyogdGltZSB2YWxpZCAqLywgJnRpbWUgKTsKKyAgICAgICAgICAgIG9iamVjdF9mcmVlKCBtZW1iZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSBTQVJIRFIgKyBsYXJfc2l6ZTsKKyAgICAgICAgbHNlZWsoIGZkLCBvZmZzZXQsIDAgKTsKKyAgICB9CisKKyAgICBjbG9zZSggZmQgKTsKK30KKworI2VuZGlmICAvKiBPU19OVCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZmlsZXN5cy5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZmlsZXN5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZGFlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9maWxlc3lzLmMKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyAqICBDb3B5cmlnaHQgMjAwNSBSZW5lIFJpdmVyYS4KKyAqICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKy8qCisgKiBmaWxlc3lzLmMgLSBPUyBpbmRlcGVuZGFudCBmaWxlIHN5c3RlbSBtYW5pcHVsYXRpb24gc3VwcG9ydAorICoKKyAqIEV4dGVybmFsIHJvdXRpbmVzOgorICogIGZpbGVfYnVpbGQxKCkgICAgICAgIC0gY29uc3RydWN0IGEgcGF0aCBzdHJpbmcgYmFzZWQgb24gUEFUSE5BTUUgaW5mb3JtYXRpb24KKyAqICBmaWxlX2RpcnNjYW4oKSAgICAgICAtIHNjYW4gYSBkaXJlY3RvcnkgZm9yIGZpbGVzCisgKiAgZmlsZV9kb25lKCkgICAgICAgICAgLSBtb2R1bGUgY2xlYW51cCBjYWxsZWQgb24gc2h1dGRvd24KKyAqICBmaWxlX2luZm8oKSAgICAgICAgICAtIHJldHVybiBjYWNoZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXRoCisgKiAgZmlsZV9pc19maWxlKCkgICAgICAgLSByZXR1cm4gd2hldGhlciBhIHBhdGggaWRlbnRpZmllcyBhbiBleGlzdGluZyBmaWxlCisgKiAgZmlsZV9xdWVyeSgpICAgICAgICAgLSBnZXQgY2FjaGVkIGluZm9ybWF0aW9uIGFib3V0IGEgcGF0aCwgcXVlcnkgdGhlIE9TIGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQKKyAqICBmaWxlX3JlbW92ZV9hdGV4aXQoKSAtIHNjaGVkdWxlIGEgcGF0aCB0byBiZSByZW1vdmVkIG9uIHByb2dyYW0gZXhpdAorICogIGZpbGVfdGltZSgpICAgICAgICAgIC0gZ2V0IGEgZmlsZSB0aW1lc3RhbXAKKyAqCisgKiBFeHRlcm5hbCByb3V0aW5lcyAtIHV0aWxpdGVzIGZvciBPUyBzcGVjaWZpYyBtb2R1bGUgaW1wbGVtZW50YXRpb25zOgorICogIGZpbGVfcXVlcnlfcG9zaXhfKCkgIC0gcXVlcnkgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXRoIHVzaW5nIFBPU0lYIHN0YXQoKQorICoKKyAqIEludGVybmFsIHJvdXRpbmVzOgorICogIGZpbGVfZGlyc2Nhbl9pbXBsKCkgIC0gbm8tcHJvZmlsaW5nIHdvcmtlciBmb3IgZmlsZV9kaXJzY2FuKCkKKyAqLworCisKKyNpbmNsdWRlICJqYW0uaCIKKyNpbmNsdWRlICJmaWxlc3lzLmgiCisKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInBhdGhzeXMuaCIKKyNpbmNsdWRlICJzdHJpbmdzLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisKKy8qIEludGVybmFsIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGRldGFpbHMgLSBoYXZlIG5hbWVzIGVuZGluZyB3aXRoIGFuCisgKiB1bmRlcnNjb3JlIGFuZCBhcmUgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgaW4gYW4gT1Mgc3BlY2lmaWMgZmlsZVhYWC5jCisgKiBtb2R1bGUuCisgKi8KK3ZvaWQgZmlsZV9kaXJzY2FuXyggZmlsZV9pbmZvX3QgKiBjb25zdCBkaXIsIHNjYW5iYWNrIGZ1bmMsIHZvaWQgKiBjbG9zdXJlICk7CitpbnQgZmlsZV9jb2xsZWN0X2Rpcl9jb250ZW50XyggZmlsZV9pbmZvX3QgKiBjb25zdCBkaXIgKTsKK3ZvaWQgZmlsZV9xdWVyeV8oIGZpbGVfaW5mb190ICogY29uc3QgKTsKKworc3RhdGljIHZvaWQgZmlsZV9kaXJzY2FuX2ltcGwoIE9CSkVDVCAqIGRpciwgc2NhbmJhY2sgZnVuYywgdm9pZCAqIGNsb3N1cmUgKTsKK3N0YXRpYyB2b2lkIGZyZWVfZmlsZV9pbmZvKCB2b2lkICogeGZpbGUsIHZvaWQgKiBkYXRhICk7CitzdGF0aWMgdm9pZCByZW1vdmVfZmlsZXNfYXRleGl0KCB2b2lkICk7CisKKworc3RhdGljIHN0cnVjdCBoYXNoICogZmlsZWNhY2hlX2hhc2g7CisKKworLyoKKyAqIGZpbGVfYnVpbGQxKCkgLSBjb25zdHJ1Y3QgYSBwYXRoIHN0cmluZyBiYXNlZCBvbiBQQVRITkFNRSBpbmZvcm1hdGlvbgorICovCisKK3ZvaWQgZmlsZV9idWlsZDEoIFBBVEhOQU1FICogY29uc3QgZiwgc3RyaW5nICogZmlsZSApCit7CisgICAgaWYgKCBERUJVR19TRUFSQ0ggKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiYnVpbGQgZmlsZTogIiApOworICAgICAgICBpZiAoIGYtPmZfcm9vdC5sZW4gKQorICAgICAgICAgICAgcHJpbnRmKCAicm9vdCA9ICclLipzJyAiLCBmLT5mX3Jvb3QubGVuLCBmLT5mX3Jvb3QucHRyICk7CisgICAgICAgIGlmICggZi0+Zl9kaXIubGVuICkKKyAgICAgICAgICAgIHByaW50ZiggImRpciA9ICclLipzJyAiLCBmLT5mX2Rpci5sZW4sIGYtPmZfZGlyLnB0ciApOworICAgICAgICBpZiAoIGYtPmZfYmFzZS5sZW4gKQorICAgICAgICAgICAgcHJpbnRmKCAiYmFzZSA9ICclLipzJyAiLCBmLT5mX2Jhc2UubGVuLCBmLT5mX2Jhc2UucHRyICk7CisgICAgICAgIHByaW50ZiggIlxuIiApOworICAgIH0KKworICAgIC8qIFN0YXJ0IHdpdGggdGhlIGdyaXN0LiBJZiB0aGUgY3VycmVudCBncmlzdCBpcyBub3Qgc3Vycm91bmRlZCBieSA8PidzLCBhZGQKKyAgICAgKiB0aGVtLgorICAgICAqLworICAgIGlmICggZi0+Zl9ncmlzdC5sZW4gKQorICAgIHsKKyAgICAgICAgaWYgKCBmLT5mX2dyaXN0LnB0clsgMCBdICE9ICc8JyApCisgICAgICAgICAgICBzdHJpbmdfcHVzaF9iYWNrKCBmaWxlLCAnPCcgKTsKKyAgICAgICAgc3RyaW5nX2FwcGVuZF9yYW5nZSgKKyAgICAgICAgICAgIGZpbGUsIGYtPmZfZ3Jpc3QucHRyLCBmLT5mX2dyaXN0LnB0ciArIGYtPmZfZ3Jpc3QubGVuICk7CisgICAgICAgIGlmICggZmlsZS0+dmFsdWVbIGZpbGUtPnNpemUgLSAxIF0gIT0gJz4nICkKKyAgICAgICAgICAgIHN0cmluZ19wdXNoX2JhY2soIGZpbGUsICc+JyApOworICAgIH0KK30KKworCisvKgorICogZmlsZV9kaXJzY2FuKCkgLSBzY2FuIGEgZGlyZWN0b3J5IGZvciBmaWxlcworICovCisKK3ZvaWQgZmlsZV9kaXJzY2FuKCBPQkpFQ1QgKiBkaXIsIHNjYW5iYWNrIGZ1bmMsIHZvaWQgKiBjbG9zdXJlICkKK3sKKyAgICBQUk9GSUxFX0VOVEVSKCBGSUxFX0RJUlNDQU4gKTsKKyAgICBmaWxlX2RpcnNjYW5faW1wbCggZGlyLCBmdW5jLCBjbG9zdXJlICk7CisgICAgUFJPRklMRV9FWElUKCBGSUxFX0RJUlNDQU4gKTsKK30KKworCisvKgorICogZmlsZV9kb25lKCkgLSBtb2R1bGUgY2xlYW51cCBjYWxsZWQgb24gc2h1dGRvd24KKyAqLworCit2b2lkIGZpbGVfZG9uZSgpCit7CisgICAgcmVtb3ZlX2ZpbGVzX2F0ZXhpdCgpOworICAgIGlmICggZmlsZWNhY2hlX2hhc2ggKQorICAgIHsKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggZmlsZWNhY2hlX2hhc2gsIGZyZWVfZmlsZV9pbmZvLCAodm9pZCAqKTAgKTsKKyAgICAgICAgaGFzaGRvbmUoIGZpbGVjYWNoZV9oYXNoICk7CisgICAgfQorfQorCisKKy8qCisgKiBmaWxlX2luZm8oKSAtIHJldHVybiBjYWNoZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXRoCisgKgorICogUmV0dXJucyBhIGRlZmF1bHQgaW5pdGlhbGl6ZWQgc3RydWN0dXJlIGNvbnRhaW5pbmcgb25seSB0aGUgcGF0aCdzIG5vcm1hbGl6ZWQKKyAqIG5hbWUgaW4gY2FzZSB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoaXMgZmlsZSBzeXN0ZW0gZW50aXR5IGhhcyBiZWVuCisgKiByZWZlcmVuY2VkLgorICovCisKK2ZpbGVfaW5mb190ICogZmlsZV9pbmZvKCBPQkpFQ1QgKiBjb25zdCBwYXRoLCBpbnQgKiBmb3VuZCApCit7CisgICAgT0JKRUNUICogY29uc3QgcGF0aF9rZXkgPSBwYXRoX2FzX2tleSggcGF0aCApOworICAgIGZpbGVfaW5mb190ICogZmluZm87CisKKyAgICBpZiAoICFmaWxlY2FjaGVfaGFzaCApCisgICAgICAgIGZpbGVjYWNoZV9oYXNoID0gaGFzaGluaXQoIHNpemVvZiggZmlsZV9pbmZvX3QgKSwgImZpbGVfaW5mbyIgKTsKKworICAgIGZpbmZvID0gKGZpbGVfaW5mb190ICopaGFzaF9pbnNlcnQoIGZpbGVjYWNoZV9oYXNoLCBwYXRoX2tleSwgZm91bmQgKTsKKyAgICBpZiAoICEqZm91bmQgKQorICAgIHsKKyAgICAgICAgZmluZm8tPm5hbWUgPSBwYXRoX2tleTsKKyAgICAgICAgZmluZm8tPmZpbGVzID0gTDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgb2JqZWN0X2ZyZWUoIHBhdGhfa2V5ICk7CisKKyAgICByZXR1cm4gZmluZm87Cit9CisKKworLyoKKyAqIGZpbGVfaXNfZmlsZSgpIC0gcmV0dXJuIHdoZXRoZXIgYSBwYXRoIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZmlsZQorICovCisKK2ludCBmaWxlX2lzX2ZpbGUoIE9CSkVDVCAqIGNvbnN0IHBhdGggKQoreworICAgIGZpbGVfaW5mb190IGNvbnN0ICogY29uc3QgZmYgPSBmaWxlX3F1ZXJ5KCBwYXRoICk7CisgICAgcmV0dXJuIGZmID8gZmYtPmlzX2ZpbGUgOiAtMTsKK30KKworCisvKgorICogZmlsZV90aW1lKCkgLSBnZXQgYSBmaWxlIHRpbWVzdGFtcAorICovCisKK2ludCBmaWxlX3RpbWUoIE9CSkVDVCAqIGNvbnN0IHBhdGgsIHRpbWVzdGFtcCAqIGNvbnN0IHRpbWUgKQoreworICAgIGZpbGVfaW5mb190IGNvbnN0ICogY29uc3QgZmYgPSBmaWxlX3F1ZXJ5KCBwYXRoICk7CisgICAgaWYgKCAhZmYgKSByZXR1cm4gLTE7CisgICAgdGltZXN0YW1wX2NvcHkoIHRpbWUsICZmZi0+dGltZSApOworICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBmaWxlX3F1ZXJ5KCkgLSBnZXQgY2FjaGVkIGluZm9ybWF0aW9uIGFib3V0IGEgcGF0aCwgcXVlcnkgdGhlIE9TIGlmIG5lZWRlZAorICoKKyAqIFJldHVybnMgMCBpbiBjYXNlIHF1ZXJ5aW5nIHRoZSBPUyBhYm91dCB0aGUgZ2l2ZW4gcGF0aCBmYWlscywgZS5nLiBiZWNhdXNlCisgKiB0aGUgcGF0aCBkb2VzIG5vdCByZWZlcmVuY2UgYW4gZXhpc3RpbmcgZmlsZSBzeXN0ZW0gb2JqZWN0LgorICovCisKK2ZpbGVfaW5mb190ICogZmlsZV9xdWVyeSggT0JKRUNUICogY29uc3QgcGF0aCApCit7CisgICAgLyogRklYTUU6IEFkZCB0cmFja2luZyBmb3IgZGlzYXBwZWFyaW5nIGZpbGVzIChpLmUuIHRob3NlIHRoYXQgY2FuIG5vdCBiZQorICAgICAqIGRldGVjdGVkIGJ5IHN0YXQoKSBldmVuIHRob3VnaCB0aGV5IGhhZCBiZWVuIGRldGVjdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIGJlZm9yZSkgYW5kIHNlZSBob3cgdGhleSBzaG91bGQgYmUgaGFuZGxlZCBpbiB0aGUgcmVzdCBvZiBCb29zdCBKYW0gY29kZS4KKyAgICAgKiBQb3NzaWJseSBhbGxvdyBKYW1maWxlcyB0byBzcGVjaWZ5IHNvbWUgZmlsZXMgYXMgJ3ZvbGF0aWxlJyB3aGljaCB3b3VsZAorICAgICAqIG1ha2UgQm9vc3QgSmFtIGF2b2lkIGNhY2hpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhvc2UgZmlsZXMgYW5kIGluc3RlYWQKKyAgICAgKiBhc2sgdGhlIE9TIGFib3V0IHRoZW0gZXZlcnkgdGltZS4KKyAgICAgKi8KKyAgICBpbnQgZm91bmQ7CisgICAgZmlsZV9pbmZvX3QgKiBjb25zdCBmZiA9IGZpbGVfaW5mbyggcGF0aCwgJmZvdW5kICk7CisgICAgaWYgKCAhZm91bmQgKQorICAgIHsKKyAgICAgICAgZmlsZV9xdWVyeV8oIGZmICk7CisgICAgICAgIGlmICggZmYtPmV4aXN0cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgcGF0aCdzIHRpbWVzdGFtcCB0byAxIGluIGNhc2UgaXQgaXMgMCBvciB1bmRldGVjdGVkIHRvIGF2b2lkCisgICAgICAgICAgICAgKiBjb25mdXNpb24gd2l0aCBub24tZXhpc3RpbmcgcGF0aHMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggdGltZXN0YW1wX2VtcHR5KCAmZmYtPnRpbWUgKSApCisgICAgICAgICAgICAgICAgdGltZXN0YW1wX2luaXQoICZmZi0+dGltZSwgMSwgMCApOworICAgICAgICB9CisgICAgfQorICAgIGlmICggIWZmLT5leGlzdHMgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBmZjsKK30KKworCisvKgorICogZmlsZV9xdWVyeV9wb3NpeF8oKSAtIHF1ZXJ5IGluZm9ybWF0aW9uIGFib3V0IGEgcGF0aCB1c2luZyBQT1NJWCBzdGF0KCkKKyAqCisgKiBGYWxsYmFjayBmaWxlX3F1ZXJ5XygpIGltcGxlbWVudGF0aW9uIGZvciBPUyBzcGVjaWZpYyBtb2R1bGVzLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgV2luZG93cyBQT1NJWCBzdGF0KCkgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gc3VmZmVycyBmcm9tCisgKiBzZXZlcmFsIGlzc3VlczoKKyAqICAgKiBEb2VzIG5vdCBzdXBwb3J0IGZpbGUgdGltZXN0YW1wcyB3aXRoIHJlc29sdXRpb24gZmluZXIgdGhhbiAxIHNlY29uZCwKKyAqICAgICBtZWFuaW5nIGl0IGNhbiBub3QgYmUgdXNlZCB0byBkZXRlY3QgZmlsZSB0aW1lc3RhbXAgY2hhbmdlcyBvZiBsZXNzIHRoYW4KKyAqICAgICAxIHNlY29uZC4gT25lIHBvc3NpYmxlIGNvbnNlcXVlbmNlIGlzIHRoYXQgc29tZSBmYXN0LXBhY2VkIHRvdWNoIGNvbW1hbmRzCisgKiAgICAgKHN1Y2ggYXMgdGhvc2UgZG9uZSBieSBCb29zdCBCdWlsZCdzIGludGVybmFsIHRlc3Rpbmcgc3lzdGVtIGlmIGl0IGRvZXMKKyAqICAgICBub3QgZG8gc29tZSBleHRyYSB3YWl0aW5nKSB3aWxsIG5vdCBiZSBkZXRlY3RlZCBjb3JyZWN0bHkgYnkgdGhlIGJ1aWxkCisgKiAgICAgc3lzdGVtLgorICogICAqIFJldHVybnMgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgYXV0b21hdGljYWxseSBhZGp1c3RlZCBmb3IgZGF5bGlnaHQKKyAqICAgICBzYXZpbmdzIHRpbWUgZXZlbiB0aG91Z2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHNob3VsZCBoYXZlIG5vdGhpbmcgdG8gZG8KKyAqICAgICB3aXRoIGludGVybmFsIHRpbWUgcmVwcmVzZW50YXRpb24uCisgKi8KKwordm9pZCBmaWxlX3F1ZXJ5X3Bvc2l4XyggZmlsZV9pbmZvX3QgKiBjb25zdCBpbmZvICkKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGNoYXIgY29uc3QgKiBjb25zdCBwYXRoc3RyID0gb2JqZWN0X3N0ciggaW5mby0+bmFtZSApOworICAgIGNoYXIgY29uc3QgKiBjb25zdCBwYXRoc3BlYyA9ICpwYXRoc3RyID8gcGF0aHN0ciA6ICIuIjsKKworICAgIGlmICggc3RhdCggcGF0aHNwZWMsICZzdGF0YnVmICkgPCAwICkKKyAgICB7CisgICAgICAgIGluZm8tPmlzX2ZpbGUgPSAwOworICAgICAgICBpbmZvLT5pc19kaXIgPSAwOworICAgICAgICBpbmZvLT5leGlzdHMgPSAwOworICAgICAgICB0aW1lc3RhbXBfY2xlYXIoICZpbmZvLT50aW1lICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluZm8tPmlzX2ZpbGUgPSBzdGF0YnVmLnN0X21vZGUgJiBTX0lGUkVHID8gMSA6IDA7CisgICAgICAgIGluZm8tPmlzX2RpciA9IHN0YXRidWYuc3RfbW9kZSAmIFNfSUZESVIgPyAxIDogMDsKKyAgICAgICAgaW5mby0+ZXhpc3RzID0gMTsKKyAgICAgICAgdGltZXN0YW1wX2luaXQoICZpbmZvLT50aW1lLCBzdGF0YnVmLnN0X210aW1lLCAwICk7CisgICAgfQorfQorCisKKy8qCisgKiBmaWxlX3JlbW92ZV9hdGV4aXQoKSAtIHNjaGVkdWxlIGEgcGF0aCB0byBiZSByZW1vdmVkIG9uIHByb2dyYW0gZXhpdAorICovCisKK3N0YXRpYyBMSVNUICogZmlsZXNfdG9fcmVtb3ZlID0gTDA7CisKK3ZvaWQgZmlsZV9yZW1vdmVfYXRleGl0KCBPQkpFQ1QgKiBjb25zdCBwYXRoICkKK3sKKyAgICBmaWxlc190b19yZW1vdmUgPSBsaXN0X3B1c2hfYmFjayggZmlsZXNfdG9fcmVtb3ZlLCBvYmplY3RfY29weSggcGF0aCApICk7Cit9CisKKworLyoKKyAqIGZpbGVfZGlyc2Nhbl9pbXBsKCkgLSBuby1wcm9maWxpbmcgd29ya2VyIGZvciBmaWxlX2RpcnNjYW4oKQorICovCisKK3N0YXRpYyB2b2lkIGZpbGVfZGlyc2Nhbl9pbXBsKCBPQkpFQ1QgKiBkaXIsIHNjYW5iYWNrIGZ1bmMsIHZvaWQgKiBjbG9zdXJlICkKK3sKKyAgICBmaWxlX2luZm9fdCAqIGNvbnN0IGQgPSBmaWxlX3F1ZXJ5KCBkaXIgKTsKKyAgICBpZiAoICFkIHx8ICFkLT5pc19kaXIgKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBMYXp5IGNvbGxlY3QgdGhlIGRpcmVjdG9yeSBjb250ZW50IGluZm9ybWF0aW9uLiAqLworICAgIGlmICggbGlzdF9lbXB0eSggZC0+ZmlsZXMgKSApCisgICAgeworICAgICAgICBpZiAoIERFQlVHX0JJTkRTQ0FOICkKKyAgICAgICAgICAgIHByaW50ZiggInNjYW4gZGlyZWN0b3J5ICVzXG4iLCBvYmplY3Rfc3RyKCBkLT5uYW1lICkgKTsKKyAgICAgICAgaWYgKCBmaWxlX2NvbGxlY3RfZGlyX2NvbnRlbnRfKCBkICkgPCAwICkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBPUyBzcGVjaWZpYyBwYXJ0IG9mIHRoZSBmaWxlX2RpcnNjYW4gb3BlcmF0aW9uLiAqLworICAgIGZpbGVfZGlyc2Nhbl8oIGQsIGZ1bmMsIGNsb3N1cmUgKTsKKworICAgIC8qIFJlcG9ydCB0aGUgY29sbGVjdGVkIGRpcmVjdG9yeSBjb250ZW50LiAqLworICAgIHsKKyAgICAgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIGQtPmZpbGVzICk7CisgICAgICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCBkLT5maWxlcyApOworICAgICAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgICAgICB7CisgICAgICAgICAgICBPQkpFQ1QgKiBjb25zdCBwYXRoID0gbGlzdF9pdGVtKCBpdGVyICk7CisgICAgICAgICAgICBmaWxlX2luZm9fdCBjb25zdCAqIGNvbnN0IGZmcSA9IGZpbGVfcXVlcnkoIHBhdGggKTsKKyAgICAgICAgICAgIC8qIFVzaW5nIGEgZmlsZSBuYW1lIHJlYWQgZnJvbSBhIGZpbGVfaW5mb190IHN0cnVjdHVyZSBhbGxvd3MgT1MKKyAgICAgICAgICAgICAqIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucyB0byBzdG9yZSBzb21lIGtpbmQgb2YgYSBub3JtYWxpemVkIGZpbGUKKyAgICAgICAgICAgICAqIG5hbWUgdGhlcmUuIFVzaW5nIHN1Y2ggYSBub3JtYWxpemVkIGZpbGUgbmFtZSB0aGVuIGFsbG93cyB1cyB0bworICAgICAgICAgICAgICogY29ycmVjdGx5IHJlY29nbml6ZSBkaWZmZXJlbnQgZmlsZSBwYXRocyBhY3R1YWxseSBpZGVudGlmeWluZyB0aGUKKyAgICAgICAgICAgICAqIHNhbWUgZmlsZS4gRm9yIGluc3RhbmNlLCBhbiBpbXBsZW1lbnRhdGlvbiBtYXk6CisgICAgICAgICAgICAgKiAgLSBjb252ZXJ0IGFsbCBmaWxlIG5hbWVzIGludGVybmFsbHkgdG8gbG93ZXIgY2FzZSBvbiBhIGNhc2UKKyAgICAgICAgICAgICAqICAgIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtCisgICAgICAgICAgICAgKiAgLSBjb252ZXJ0IHRoZSBOVEZTIHBhdGhzIHRvIHRoZWlyIGxvbmcgcGF0aCB2YXJpYW50cyBhcyB0aGF0CisgICAgICAgICAgICAgKiAgICBmaWxlIHN5c3RlbSBlYWNoIGZpbGUgc3lzdGVtIGVudGl0eSBtYXkgaGF2ZSBhIGxvbmcgYW5kIGEKKyAgICAgICAgICAgICAqICAgIHNob3J0IHBhdGggdmFyaWFudCB0aHVzIGFsbG93aW5nIGZvciBtYW55IGRpZmZlcmVudCBwYXRoCisgICAgICAgICAgICAgKiAgICBzdHJpbmdzIGlkZW50aWZ5aW5nIHRoZSBzYW1lIGZpbGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICgqZnVuYykoIGNsb3N1cmUsIGZmcS0+bmFtZSwgMSAvKiBzdGF0KCknZWQgKi8sICZmZnEtPnRpbWUgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBmcmVlX2ZpbGVfaW5mbyggdm9pZCAqIHhmaWxlLCB2b2lkICogZGF0YSApCit7CisgICAgZmlsZV9pbmZvX3QgKiBjb25zdCBmaWxlID0gKGZpbGVfaW5mb190ICopeGZpbGU7CisgICAgb2JqZWN0X2ZyZWUoIGZpbGUtPm5hbWUgKTsKKyAgICBsaXN0X2ZyZWUoIGZpbGUtPmZpbGVzICk7Cit9CisKKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZpbGVzX2F0ZXhpdCggdm9pZCApCit7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIGZpbGVzX3RvX3JlbW92ZSApOworICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCBmaWxlc190b19yZW1vdmUgKTsKKyAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgICAgICByZW1vdmUoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICkgKTsKKyAgICBsaXN0X2ZyZWUoIGZpbGVzX3RvX3JlbW92ZSApOworICAgIGZpbGVzX3RvX3JlbW92ZSA9IEwwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZmlsZXN5cy5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZmlsZXN5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZmEzOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9maWxlc3lzLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLTIwMDIgQ2hyaXN0b3BoZXIgU2Vpd2FsZCBhbmQgUGVyZm9yY2UgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiAgVGhpcyBmaWxlIGlzIEFMU086CisgKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyAqICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKy8qCisgKiBmaWxlc3lzLmggLSBPUyBzcGVjaWZpYyBmaWxlIHJvdXRpbmVzCisgKi8KKworI2lmbmRlZiBGSUxFU1lTX0RXQTIwMDExMDI1X0gKKyNkZWZpbmUgRklMRVNZU19EV0EyMDAxMTAyNV9ICisKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAibGlzdHMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJwYXRoc3lzLmgiCisjaW5jbHVkZSAidGltZXN0YW1wLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgZmlsZV9pbmZvX3QKK3sKKyAgICBPQkpFQ1QgKiBuYW1lOworICAgIGNoYXIgaXNfZmlsZTsKKyAgICBjaGFyIGlzX2RpcjsKKyAgICBjaGFyIGV4aXN0czsKKyAgICB0aW1lc3RhbXAgdGltZTsKKyAgICBMSVNUICogZmlsZXM7Cit9IGZpbGVfaW5mb190OworCit0eXBlZGVmIHZvaWQgKCpzY2FuYmFjaykoIHZvaWQgKiBjbG9zdXJlLCBPQkpFQ1QgKiBwYXRoLCBpbnQgZm91bmQsCisgICAgdGltZXN0YW1wIGNvbnN0ICogY29uc3QgKTsKKworCit2b2lkIGZpbGVfYXJjaHNjYW4oIGNoYXIgY29uc3QgKiBhcmNoLCBzY2FuYmFjayBmdW5jLCB2b2lkICogY2xvc3VyZSApOwordm9pZCBmaWxlX2J1aWxkMSggUEFUSE5BTUUgKiBjb25zdCBmLCBzdHJpbmcgKiBmaWxlICkgOwordm9pZCBmaWxlX2RpcnNjYW4oIE9CSkVDVCAqIGRpciwgc2NhbmJhY2sgZnVuYywgdm9pZCAqIGNsb3N1cmUgKTsKK2ZpbGVfaW5mb190ICogZmlsZV9pbmZvKCBPQkpFQ1QgKiBjb25zdCBwYXRoLCBpbnQgKiBmb3VuZCApOworaW50IGZpbGVfaXNfZmlsZSggT0JKRUNUICogY29uc3QgcGF0aCApOworaW50IGZpbGVfbWtkaXIoIGNoYXIgY29uc3QgKiBjb25zdCBwYXRoICk7CitmaWxlX2luZm9fdCAqIGZpbGVfcXVlcnkoIE9CSkVDVCAqIGNvbnN0IHBhdGggKTsKK3ZvaWQgZmlsZV9yZW1vdmVfYXRleGl0KCBPQkpFQ1QgKiBjb25zdCBwYXRoICk7Cit2b2lkIGZpbGVfc3VwcG9ydGVkX2ZtdF9yZXNvbHV0aW9uKCB0aW1lc3RhbXAgKiBjb25zdCApOworaW50IGZpbGVfdGltZSggT0JKRUNUICogY29uc3QgcGF0aCwgdGltZXN0YW1wICogY29uc3QgKTsKKworLyogSW50ZXJuYWwgdXRpbGl0eSB3b3JrZXIgZnVuY3Rpb25zLiAqLwordm9pZCBmaWxlX3F1ZXJ5X3Bvc2l4XyggZmlsZV9pbmZvX3QgKiBjb25zdCApOworCit2b2lkIGZpbGVfZG9uZSgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2ZpbGV1bml4LmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9maWxldW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjNhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9maWxldW5peC5jCkBAIC0wLDAgKzEsNDY0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTMtMjAwMiBDaHJpc3RvcGhlciBTZWl3YWxkIGFuZCBQZXJmb3JjZSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qICBUaGlzIGZpbGUgaXMgQUxTTzoKKyAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IERhdmlkIEFicmFoYW1zLgorICogIENvcHlyaWdodCAyMDA1IFJlbmUgUml2ZXJhLgorICogIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworLyoKKyAqIGZpbGV1bml4LmMgLSBtYW5pcHVsYXRlIGZpbGUgbmFtZXMgYW5kIHNjYW4gZGlyZWN0b3JpZXMgb24gVU5JWC9BbWlnYU9TCisgKgorICogRXh0ZXJuYWwgcm91dGluZXM6CisgKiAgZmlsZV9hcmNoc2NhbigpICAgICAgICAgICAgICAgICAtIHNjYW4gYW4gYXJjaGl2ZSBmb3IgZmlsZXMKKyAqICBmaWxlX21rZGlyKCkgICAgICAgICAgICAgICAgICAgIC0gY3JlYXRlIGEgZGlyZWN0b3J5CisgKiAgZmlsZV9zdXBwb3J0ZWRfZm10X3Jlc29sdXRpb24oKSAtIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCByZXNvbHV0aW9uCisgKgorICogRXh0ZXJuYWwgcm91dGluZXMgY2FsbGVkIG9ubHkgdmlhIHJvdXRpbmVzIGluIGZpbGVzeXMuYzoKKyAqICBmaWxlX2NvbGxlY3RfZGlyX2NvbnRlbnRfKCkgLSBjb2xsZWN0cyBkaXJlY3RvcnkgY29udGVudCBpbmZvcm1hdGlvbgorICogIGZpbGVfZGlyc2Nhbl8oKSAgICAgICAgICAgICAtIE9TIHNwZWNpZmljIGZpbGVfZGlyc2NhbigpIGltcGxlbWVudGF0aW9uCisgKiAgZmlsZV9xdWVyeV8oKSAgICAgICAgICAgICAgIC0gcXVlcnkgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXRoIGZyb20gdGhlIE9TCisgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2lmZGVmIFVTRV9GSUxFVU5JWAorI2luY2x1ZGUgImZpbGVzeXMuaCIKKworI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInBhdGhzeXMuaCIKKyNpbmNsdWRlICJzdHJpbmdzLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+ICAvKiBuZWVkZWQgZm9yIG1rZGlyKCkgKi8KKworI2lmIGRlZmluZWQoIHN1biApIHx8IGRlZmluZWQoIF9fc3VuICkgfHwgZGVmaW5lZCggbGludXggKQorIyBpbmNsdWRlIDx1bmlzdGQuaD4gIC8qIG5lZWRlZCBmb3IgcmVhZCBhbmQgY2xvc2UgcHJvdG90eXBlICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoIE9TX1NFUVVFTlQgKSB8fCBcCisgICAgZGVmaW5lZCggT1NfREdVWCApIHx8IFwKKyAgICBkZWZpbmVkKCBPU19TQ08gKSB8fCBcCisgICAgZGVmaW5lZCggT1NfSVNDICkKKyMgZGVmaW5lIFBPUlRBUiAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoIE9TX1JIQVBTT0RZICkgfHwgZGVmaW5lZCggT1NfTUFDT1NYICkgfHwgZGVmaW5lZCggT1NfTkVYVCApCisjIGluY2x1ZGUgPHN5cy9kaXIuaD4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvKiBuZWVkIHVuaXN0ZCBmb3IgcmhhcHNvZHkncyBwcm9wZXIgbHNlZWsgKi8KKyMgZGVmaW5lIFNUUlVDVF9ESVJFTlQgc3RydWN0IGRpcmVjdAorI2Vsc2UKKyMgaW5jbHVkZSA8ZGlyZW50Lmg+CisjIGRlZmluZSBTVFJVQ1RfRElSRU5UIHN0cnVjdCBkaXJlbnQKKyNlbmRpZgorCisjaWZkZWYgT1NfQ09IRVJFTlQKKyMgaW5jbHVkZSA8YXJjb2ZmLmg+CisjIGRlZmluZSBIQVZFX0FSCisjZW5kaWYKKworI2lmIGRlZmluZWQoIE9TX01WUyApIHx8IGRlZmluZWQoIE9TX0lOVEVSSVggKQorI2RlZmluZSBBUk1BRyAgIiE8YXJjaD5cbiIKKyNkZWZpbmUgU0FSTUFHICA4CisjZGVmaW5lIEFSRk1BRyAgImBcbiIKKyNkZWZpbmUgSEFWRV9BUgorCitzdHJ1Y3QgYXJfaGRyICAvKiBhcmNoaXZlIGZpbGUgbWVtYmVyIGhlYWRlciAtIHByaW50YWJsZSBhc2NpaSAqLworeworICAgIGNoYXIgYXJfbmFtZVsgMTYgXTsgIC8qIGZpbGUgbWVtYmVyIG5hbWUgLSBgLycgdGVybWluYXRlZCAqLworICAgIGNoYXIgYXJfZGF0ZVsgMTIgXTsgIC8qIGZpbGUgbWVtYmVyIGRhdGUgLSBkZWNpbWFsICovCisgICAgY2hhciBhcl91aWRbIDYgXTsgICAgLyogZmlsZSBtZW1iZXIgdXNlciBpZCAtIGRlY2ltYWwgKi8KKyAgICBjaGFyIGFyX2dpZFsgNiBdOyAgICAvKiBmaWxlIG1lbWJlciBncm91cCBpZCAtIGRlY2ltYWwgKi8KKyAgICBjaGFyIGFyX21vZGVbIDggXTsgICAvKiBmaWxlIG1lbWJlciBtb2RlIC0gb2N0YWwgKi8KKyAgICBjaGFyIGFyX3NpemVbIDEwIF07ICAvKiBmaWxlIG1lbWJlciBzaXplIC0gZGVjaW1hbCAqLworICAgIGNoYXIgYXJfZm1hZ1sgMiBdOyAgIC8qIEFSRk1BRyAtIHN0cmluZyB0byBlbmQgaGVhZGVyICovCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKCBPU19RTlggKSB8fCBkZWZpbmVkKCBPU19CRU9TICkgfHwgZGVmaW5lZCggT1NfTVBFSVggKQorIyBkZWZpbmUgTk9fQVIKKyMgZGVmaW5lIEhBVkVfQVIKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfQVIKKyMgaWZkZWYgT1NfQUlYCisvKiBEZWZpbmUgdGhlc2UgZm9yIEFJWCB0byBnZXQgdGhlIGRlZmluaXRpb25zIGZvciBib3RoIHNtYWxsIGFuZCBiaWcgYXJjaGl2ZQorICogZmlsZSBmb3JtYXQgdmFyaWFudHMuCisgKi8KKyMgIGRlZmluZSBfX0FSX1NNQUxMX18KKyMgIGRlZmluZSBfX0FSX0JJR19fCisjIGVuZGlmCisjIGluY2x1ZGUgPGFyLmg+CisjZW5kaWYKKworCisvKgorICogZmlsZV9jb2xsZWN0X2Rpcl9jb250ZW50XygpIC0gY29sbGVjdHMgZGlyZWN0b3J5IGNvbnRlbnQgaW5mb3JtYXRpb24KKyAqLworCitpbnQgZmlsZV9jb2xsZWN0X2Rpcl9jb250ZW50XyggZmlsZV9pbmZvX3QgKiBjb25zdCBkICkKK3sKKyAgICBMSVNUICogZmlsZXMgPSBMMDsKKyAgICBQQVRITkFNRSBmOworICAgIERJUiAqIGRkOworICAgIFNUUlVDVF9ESVJFTlQgKiBkaXJlbnQ7CisgICAgc3RyaW5nIHBhdGhbIDEgXTsKKyAgICBjaGFyIGNvbnN0ICogZGlyc3RyOworCisgICAgYXNzZXJ0KCBkICk7CisgICAgYXNzZXJ0KCBkLT5pc19kaXIgKTsKKyAgICBhc3NlcnQoIGxpc3RfZW1wdHkoIGQtPmZpbGVzICkgKTsKKworICAgIGRpcnN0ciA9IG9iamVjdF9zdHIoIGQtPm5hbWUgKTsKKworICAgIG1lbXNldCggKGNoYXIgKikmZiwgJ1wwJywgc2l6ZW9mKCBmICkgKTsKKyAgICBmLmZfZGlyLnB0ciA9IGRpcnN0cjsKKyAgICBmLmZfZGlyLmxlbiA9IHN0cmxlbiggZGlyc3RyICk7CisKKyAgICBpZiAoICEqZGlyc3RyICkgZGlyc3RyID0gIi4iOworCisgICAgaWYgKCAhKCBkZCA9IG9wZW5kaXIoIGRpcnN0ciApICkgKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzdHJpbmdfbmV3KCBwYXRoICk7CisgICAgd2hpbGUgKCAoIGRpcmVudCA9IHJlYWRkaXIoIGRkICkgKSApCisgICAgeworICAgICAgICBPQkpFQ1QgKiBuYW1lOworICAgICAgICBmLmZfYmFzZS5wdHIgPSBkaXJlbnQtPmRfbmFtZQorICAgICAgICAjaWZkZWYgb2xkX3Npbml4CisgICAgICAgICAgICAtIDIgIC8qIEJyb2tlbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvbiBzaW5peC4gKi8KKyAgICAgICAgI2VuZGlmCisgICAgICAgICAgICA7CisgICAgICAgIGYuZl9iYXNlLmxlbiA9IHN0cmxlbiggZi5mX2Jhc2UucHRyICk7CisKKyAgICAgICAgc3RyaW5nX3RydW5jYXRlKCBwYXRoLCAwICk7CisgICAgICAgIHBhdGhfYnVpbGQoICZmLCBwYXRoICk7CisgICAgICAgIG5hbWUgPSBvYmplY3RfbmV3KCBwYXRoLT52YWx1ZSApOworICAgICAgICAvKiBJbW1lZGlhdGVseSBzdGF0IHRoZSBmaWxlIHRvIHByZXNlcnZlIGludmFyaWFudHMuICovCisgICAgICAgIGlmICggZmlsZV9xdWVyeSggbmFtZSApICkKKyAgICAgICAgICAgIGZpbGVzID0gbGlzdF9wdXNoX2JhY2soIGZpbGVzLCBuYW1lICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9iamVjdF9mcmVlKCBuYW1lICk7CisgICAgfQorICAgIHN0cmluZ19mcmVlKCBwYXRoICk7CisKKyAgICBjbG9zZWRpciggZGQgKTsKKworICAgIGQtPmZpbGVzID0gZmlsZXM7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGZpbGVfZGlyc2Nhbl8oKSAtIE9TIHNwZWNpZmljIGZpbGVfZGlyc2NhbigpIGltcGxlbWVudGF0aW9uCisgKi8KKwordm9pZCBmaWxlX2RpcnNjYW5fKCBmaWxlX2luZm9fdCAqIGNvbnN0IGQsIHNjYW5iYWNrIGZ1bmMsIHZvaWQgKiBjbG9zdXJlICkKK3sKKyAgICBhc3NlcnQoIGQgKTsKKyAgICBhc3NlcnQoIGQtPmlzX2RpciApOworCisgICAgLyogU3BlY2lhbCBjYXNlIC8gOiBlbnRlciBpdCAqLworICAgIGlmICggIXN0cmNtcCggb2JqZWN0X3N0ciggZC0+bmFtZSApLCAiLyIgKSApCisgICAgICAgICgqZnVuYykoIGNsb3N1cmUsIGQtPm5hbWUsIDEgLyogc3RhdCgpJ2VkICovLCAmZC0+dGltZSApOworfQorCisKKy8qCisgKiBmaWxlX21rZGlyKCkgLSBjcmVhdGUgYSBkaXJlY3RvcnkKKyAqLworCitpbnQgZmlsZV9ta2RpciggY2hhciBjb25zdCAqIGNvbnN0IHBhdGggKQoreworICAgIC8qIEV4cGxpY2l0IGNhc3QgdG8gcmVtb3ZlIGNvbnN0IG1vZGlmaWVycyBhbmQgYXZvaWQgcmVsYXRlZCBjb21waWxlcgorICAgICAqIHdhcm5pbmdzIGRpc3BsYXllZCB3aGVuIHVzaW5nIHRoZSBpbnRlbCBjb21waWxlci4KKyAgICAgKi8KKyAgICByZXR1cm4gbWtkaXIoIChjaGFyICopcGF0aCwgMDc3NyApOworfQorCisKKy8qCisgKiBmaWxlX3F1ZXJ5XygpIC0gcXVlcnkgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXRoIGZyb20gdGhlIE9TCisgKi8KKwordm9pZCBmaWxlX3F1ZXJ5XyggZmlsZV9pbmZvX3QgKiBjb25zdCBpbmZvICkKK3sKKyAgICBmaWxlX3F1ZXJ5X3Bvc2l4XyggaW5mbyApOworfQorCisKKy8qCisgKiBmaWxlX3N1cHBvcnRlZF9mbXRfcmVzb2x1dGlvbigpIC0gZmlsZSBtb2RpZmljYXRpb24gdGltZXN0YW1wIHJlc29sdXRpb24KKyAqCisgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCByZXNvbHV0aW9uIHN1cHBvcnRlZCBieSB0aGlzCisgKiBCb29zdCBKYW0gaW1wbGVtZW50YXRpb24uIEZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCBjaGFuZ2VzIG9mIGxlc3MgdGhhbgorICogdGhlIHJldHVybmVkIHZhbHVlIG1pZ2h0IG5vdCBiZSByZWNvZ25pemVkLgorICoKKyAqIERvZXMgbm90IHRha2UgaW50byBjb25zaWRlcmF0aW9uIGFueSBPUyBvciBmaWxlIHN5c3RlbSByZWxhdGVkIHJlc3RyaWN0aW9ucy4KKyAqCisgKiBSZXR1cm4gdmFsdWUgMCBpbmRpY2F0ZXMgdGhhdCBhbnkgdmFsdWUgc3VwcG9ydGVkIGJ5IHRoZSBPUyBpcyBhbHNvIHN1cHBvcnRlZAorICogaGVyZS4KKyAqLworCit2b2lkIGZpbGVfc3VwcG9ydGVkX2ZtdF9yZXNvbHV0aW9uKCB0aW1lc3RhbXAgKiBjb25zdCB0ICkKK3sKKyAgICAvKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcAorICAgICAqIHJlc29sdXRpb24gb2YgbGVzcyB0aGFuIG9uZSBzZWNvbmQuCisgICAgICovCisgICAgdGltZXN0YW1wX2luaXQoIHQsIDEsIDAgKTsKK30KKworCisvKgorICogZmlsZV9hcmNoc2NhbigpIC0gc2NhbiBhbiBhcmNoaXZlIGZvciBmaWxlcworICovCisKKyNpZm5kZWYgQUlBTUFHICAvKiBHb2QtZmVhcmluZyBVTklYICovCisKKyNkZWZpbmUgU0FSRk1BRyAgMgorI2RlZmluZSBTQVJIRFIgIHNpemVvZiggc3RydWN0IGFyX2hkciApCisKK3ZvaWQgZmlsZV9hcmNoc2NhbiggY2hhciBjb25zdCAqIGFyY2hpdmUsIHNjYW5iYWNrIGZ1bmMsIHZvaWQgKiBjbG9zdXJlICkKK3sKKyNpZm5kZWYgTk9fQVIKKyAgICBzdHJ1Y3QgYXJfaGRyIGFyX2hkcjsKKyAgICBjaGFyICogc3RyaW5nX3RhYmxlID0gMDsKKyAgICBjaGFyIGJ1ZlsgTUFYSlBBVEggXTsKKyAgICBsb25nIG9mZnNldDsKKyAgICBpbnQgZmQ7CisKKyAgICBpZiAoICggZmQgPSBvcGVuKCBhcmNoaXZlLCBPX1JET05MWSwgMCApICkgPCAwICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCByZWFkKCBmZCwgYnVmLCBTQVJNQUcgKSAhPSBTQVJNQUcgfHwKKyAgICAgICAgc3RybmNtcCggQVJNQUcsIGJ1ZiwgU0FSTUFHICkgKQorICAgIHsKKyAgICAgICAgY2xvc2UoIGZkICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvZmZzZXQgPSBTQVJNQUc7CisKKyAgICBpZiAoIERFQlVHX0JJTkRTQ0FOICkKKyAgICAgICAgcHJpbnRmKCAic2NhbiBhcmNoaXZlICVzXG4iLCBhcmNoaXZlICk7CisKKyAgICB3aGlsZSAoICggcmVhZCggZmQsICZhcl9oZHIsIFNBUkhEUiApID09IFNBUkhEUiApICYmCisgICAgICAgICEoIG1lbWNtcCggYXJfaGRyLmFyX2ZtYWcsIEFSRk1BRywgU0FSRk1BRyApCisjaWZkZWYgQVJGWk1BRworICAgICAgICAgICAgLyogT1NGIGFsc28gaGFzIGEgY29tcHJlc3NlZCBmb3JtYXQgKi8KKyAgICAgICAgICAgICYmIG1lbWNtcCggYXJfaGRyLmFyX2ZtYWcsIEFSRlpNQUcsIFNBUkZNQUcgKQorI2VuZGlmCisgICAgICAgICkgKQorICAgIHsKKyAgICAgICAgY2hhciAgIGxhcl9uYW1lX1sgMjU3IF07CisgICAgICAgIGNoYXIgKiBsYXJfbmFtZSA9IGxhcl9uYW1lXyArIDE7CisgICAgICAgIGxvbmcgICBsYXJfZGF0ZTsKKyAgICAgICAgbG9uZyAgIGxhcl9zaXplOworICAgICAgICBsb25nICAgbGFyX29mZnNldDsKKyAgICAgICAgY2hhciAqIGM7CisgICAgICAgIGNoYXIgKiBzcmM7CisgICAgICAgIGNoYXIgKiBkZXN0OworCisgICAgICAgIHN0cm5jcHkoIGxhcl9uYW1lLCBhcl9oZHIuYXJfbmFtZSwgc2l6ZW9mKCBhcl9oZHIuYXJfbmFtZSApICk7CisKKyAgICAgICAgc3NjYW5mKCBhcl9oZHIuYXJfZGF0ZSwgIiVsZCIsICZsYXJfZGF0ZSApOworICAgICAgICBzc2NhbmYoIGFyX2hkci5hcl9zaXplLCAiJWxkIiwgJmxhcl9zaXplICk7CisKKyAgICAgICAgaWYgKCBhcl9oZHIuYXJfbmFtZVsgMCBdID09ICcvJyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYXJfaGRyLmFyX25hbWVbIDEgXSA9PSAnLycgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlICJzdHJpbmcgdGFibGUiIGVudHJ5IG9mIHRoZSBzeW1ib2wgdGFibGUsIGhvbGRpbmcKKyAgICAgICAgICAgICAgICAgKiBmaWxlbmFtZSBzdHJpbmdzIGxvbmdlciB0aGFuIDE1IGNoYXJhY3RlcnMsIGkuZS4gdGhvc2UgdGhhdAorICAgICAgICAgICAgICAgICAqIGRvIG5vdCBmaXQgaW50byBhcl9uYW1lLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHN0cmluZ190YWJsZSA9IChjaGFyICopQkpBTV9NQUxMT0NfQVRPTUlDKCBsYXJfc2l6ZSApOworICAgICAgICAgICAgICAgIGxzZWVrKCBmZCwgb2Zmc2V0ICsgU0FSSERSLCAwICk7CisgICAgICAgICAgICAgICAgaWYgKCByZWFkKCBmZCwgc3RyaW5nX3RhYmxlLCBsYXJfc2l6ZSApICE9IGxhcl9zaXplICkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciByZWFkaW5nIHN0cmluZyB0YWJsZVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggc3RyaW5nX3RhYmxlICYmIGFyX2hkci5hcl9uYW1lWyAxIF0gIT0gJyAnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBMb25nIGZpbGVuYW1lcyBhcmUgcmVjb2duaXplZCBieSAiL25ubm4iIHdoZXJlIG5ubm4gaXMgdGhlCisgICAgICAgICAgICAgICAgICogb2Zmc2V0IG9mIHRoZSBzdHJpbmcgaW4gdGhlIHN0cmluZyB0YWJsZSByZXByZXNlbnRlZCBpbiBBU0NJSQorICAgICAgICAgICAgICAgICAqIGRlY2ltYWxzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGRlc3QgPSBsYXJfbmFtZTsKKyAgICAgICAgICAgICAgICBsYXJfb2Zmc2V0ID0gYXRvaSggbGFyX25hbWUgKyAxICk7CisgICAgICAgICAgICAgICAgc3JjID0gJnN0cmluZ190YWJsZVsgbGFyX29mZnNldCBdOworICAgICAgICAgICAgICAgIHdoaWxlICggKnNyYyAhPSAnLycgKQorICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKnNyYysrOworICAgICAgICAgICAgICAgICpkZXN0ID0gJy8nOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYyA9IGxhcl9uYW1lIC0gMTsKKyAgICAgICAgd2hpbGUgKCAoICorK2MgIT0gJyAnICkgJiYgKCAqYyAhPSAnLycgKSApOworICAgICAgICAqYyA9ICdcMCc7CisKKyAgICAgICAgaWYgKCBERUJVR19CSU5EU0NBTiApCisgICAgICAgICAgICBwcmludGYoICJhcmNoaXZlIG5hbWUgJXMgZm91bmRcbiIsIGxhcl9uYW1lICk7CisKKyAgICAgICAgc3ByaW50ZiggYnVmLCAiJXMoJXMpIiwgYXJjaGl2ZSwgbGFyX25hbWUgKTsKKworICAgICAgICB7CisgICAgICAgICAgICBPQkpFQ1QgKiBjb25zdCBtZW1iZXIgPSBvYmplY3RfbmV3KCBidWYgKTsKKyAgICAgICAgICAgIHRpbWVzdGFtcCB0aW1lOworICAgICAgICAgICAgdGltZXN0YW1wX2luaXQoICZ0aW1lLCAodGltZV90KWxhcl9kYXRlLCAwICk7CisgICAgICAgICAgICAoKmZ1bmMpKCBjbG9zdXJlLCBtZW1iZXIsIDEgLyogdGltZSB2YWxpZCAqLywgJnRpbWUgKTsKKyAgICAgICAgICAgIG9iamVjdF9mcmVlKCBtZW1iZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSBTQVJIRFIgKyAoICggbGFyX3NpemUgKyAxICkgJiB+MSApOworICAgICAgICBsc2VlayggZmQsIG9mZnNldCwgMCApOworICAgIH0KKworICAgIGlmICggc3RyaW5nX3RhYmxlICkKKyAgICAgICAgQkpBTV9GUkVFKCBzdHJpbmdfdGFibGUgKTsKKworICAgIGNsb3NlKCBmZCApOworI2VuZGlmICAvKiBOT19BUiAqLworfQorCisjZWxzZSAgLyogQUlBTUFHIC0gUlM2MDAwIEFJWCAqLworCitzdGF0aWMgdm9pZCBmaWxlX2FyY2hzY2FuX3NtYWxsKCBpbnQgZmQsIGNoYXIgY29uc3QgKiBhcmNoaXZlLCBzY2FuYmFjayBmdW5jLAorICAgIHZvaWQgKiBjbG9zdXJlICkKK3sKKyAgICBzdHJ1Y3QgZmxfaGRyIGZsX2hkcjsKKworICAgIHN0cnVjdCB7CisgICAgICAgIHN0cnVjdCBhcl9oZHIgaGRyOworICAgICAgICBjaGFyIHBhZFsgMjU2IF07CisgICAgfSBhcl9oZHIgOworCisgICAgY2hhciBidWZbIE1BWEpQQVRIIF07CisgICAgbG9uZyBvZmZzZXQ7CisKKyAgICBpZiAoIHJlYWQoIGZkLCAoY2hhciAqKSZmbF9oZHIsIEZMX0hTWiApICE9IEZMX0hTWiApCisgICAgICAgIHJldHVybjsKKworICAgIHNzY2FuZiggZmxfaGRyLmZsX2ZzdG1vZmYsICIlbGQiLCAmb2Zmc2V0ICk7CisKKyAgICBpZiAoIERFQlVHX0JJTkRTQ0FOICkKKyAgICAgICAgcHJpbnRmKCAic2NhbiBhcmNoaXZlICVzXG4iLCBhcmNoaXZlICk7CisKKyAgICB3aGlsZSAoIG9mZnNldCA+IDAgJiYgbHNlZWsoIGZkLCBvZmZzZXQsIDAgKSA+PSAwICYmCisgICAgICAgIHJlYWQoIGZkLCAmYXJfaGRyLCBzaXplb2YoIGFyX2hkciApICkgPj0gKGludClzaXplb2YoIGFyX2hkci5oZHIgKSApCisgICAgeworICAgICAgICBsb25nIGxhcl9kYXRlOworICAgICAgICBpbnQgbGFyX25hbWxlbjsKKworICAgICAgICBzc2NhbmYoIGFyX2hkci5oZHIuYXJfbmFtbGVuLCAiJWQiICwgJmxhcl9uYW1sZW4gKTsKKyAgICAgICAgc3NjYW5mKCBhcl9oZHIuaGRyLmFyX2RhdGUgICwgIiVsZCIsICZsYXJfZGF0ZSAgICk7CisgICAgICAgIHNzY2FuZiggYXJfaGRyLmhkci5hcl9ueHRtZW0sICIlbGQiLCAmb2Zmc2V0ICAgICApOworCisgICAgICAgIGlmICggIWxhcl9uYW1sZW4gKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYXJfaGRyLmhkci5fYXJfbmFtZS5hcl9uYW1lWyBsYXJfbmFtbGVuIF0gPSAnXDAnOworCisgICAgICAgIHNwcmludGYoIGJ1ZiwgIiVzKCVzKSIsIGFyY2hpdmUsIGFyX2hkci5oZHIuX2FyX25hbWUuYXJfbmFtZSApOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE9CSkVDVCAqIGNvbnN0IG1lbWJlciA9IG9iamVjdF9uZXcoIGJ1ZiApOworICAgICAgICAgICAgdGltZXN0YW1wIHRpbWU7CisgICAgICAgICAgICB0aW1lc3RhbXBfaW5pdCggJnRpbWUsICh0aW1lX3QpbGFyX2RhdGUsIDAgKTsKKyAgICAgICAgICAgICgqZnVuYykoIGNsb3N1cmUsIG1lbWJlciwgMSAvKiB0aW1lIHZhbGlkICovLCAmdGltZSApOworICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIG1lbWJlciApOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDaGVjayBmb3IgT1MgdmVyc2lvbnMgc3VwcG9ydGluZyB0aGUgYmlnIHZhcmlhbnQuICovCisjaWZkZWYgQVJfSFNaX0JJRworCitzdGF0aWMgdm9pZCBmaWxlX2FyY2hzY2FuX2JpZyggaW50IGZkLCBjaGFyIGNvbnN0ICogYXJjaGl2ZSwgc2NhbmJhY2sgZnVuYywKKyAgICB2b2lkICogY2xvc3VyZSApCit7CisgICAgc3RydWN0IGZsX2hkcl9iaWcgZmxfaGRyOworCisgICAgc3RydWN0IHsKKyAgICAgICAgc3RydWN0IGFyX2hkcl9iaWcgaGRyOworICAgICAgICBjaGFyIHBhZFsgMjU2IF07CisgICAgfSBhcl9oZHIgOworCisgICAgY2hhciBidWZbIE1BWEpQQVRIIF07CisgICAgbG9uZyBsb25nIG9mZnNldDsKKworICAgIGlmICggcmVhZCggZmQsIChjaGFyICopJmZsX2hkciwgRkxfSFNaX0JJRyApICE9IEZMX0hTWl9CSUcgKQorICAgICAgICByZXR1cm47CisKKyAgICBzc2NhbmYoIGZsX2hkci5mbF9mc3Rtb2ZmLCAiJWxsZCIsICZvZmZzZXQgKTsKKworICAgIGlmICggREVCVUdfQklORFNDQU4gKQorICAgICAgICBwcmludGYoICJzY2FuIGFyY2hpdmUgJXNcbiIsIGFyY2hpdmUgKTsKKworICAgIHdoaWxlICggb2Zmc2V0ID4gMCAmJiBsc2VlayggZmQsIG9mZnNldCwgMCApID49IDAgJiYKKyAgICAgICAgcmVhZCggZmQsICZhcl9oZHIsIHNpemVvZiggYXJfaGRyICkgKSA+PSBzaXplb2YoIGFyX2hkci5oZHIgKSApCisgICAgeworICAgICAgICBsb25nIGxhcl9kYXRlOworICAgICAgICBpbnQgbGFyX25hbWxlbjsKKworICAgICAgICBzc2NhbmYoIGFyX2hkci5oZHIuYXJfbmFtbGVuLCAiJWQiICAsICZsYXJfbmFtbGVuICk7CisgICAgICAgIHNzY2FuZiggYXJfaGRyLmhkci5hcl9kYXRlICAsICIlbGQiICwgJmxhcl9kYXRlICAgKTsKKyAgICAgICAgc3NjYW5mKCBhcl9oZHIuaGRyLmFyX254dG1lbSwgIiVsbGQiLCAmb2Zmc2V0ICAgICApOworCisgICAgICAgIGlmICggIWxhcl9uYW1sZW4gKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYXJfaGRyLmhkci5fYXJfbmFtZS5hcl9uYW1lWyBsYXJfbmFtbGVuIF0gPSAnXDAnOworCisgICAgICAgIHNwcmludGYoIGJ1ZiwgIiVzKCVzKSIsIGFyY2hpdmUsIGFyX2hkci5oZHIuX2FyX25hbWUuYXJfbmFtZSApOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE9CSkVDVCAqIGNvbnN0IG1lbWJlciA9IG9iamVjdF9uZXcoIGJ1ZiApOworICAgICAgICAgICAgdGltZXN0YW1wIHRpbWU7CisgICAgICAgICAgICB0aW1lc3RhbXBfaW5pdCggJnRpbWUsICh0aW1lX3QpbGFyX2RhdGUsIDAgKTsKKyAgICAgICAgICAgICgqZnVuYykoIGNsb3N1cmUsIG1lbWJlciwgMSAvKiB0aW1lIHZhbGlkICovLCAmdGltZSApOworICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIG1lbWJlciApOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYgIC8qIEFSX0hTWl9CSUcgKi8KKwordm9pZCBmaWxlX2FyY2hzY2FuKCBjaGFyIGNvbnN0ICogYXJjaGl2ZSwgc2NhbmJhY2sgZnVuYywgdm9pZCAqIGNsb3N1cmUgKQoreworICAgIGludCBmZDsKKyAgICBjaGFyIGZsX21hZ2ljWyBTQUlBTUFHIF07CisKKyAgICBpZiAoICggZmQgPSBvcGVuKCBhcmNoaXZlLCBPX1JET05MWSwgMCApICkgPCAwICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCByZWFkKCBmZCwgZmxfbWFnaWMsIFNBSUFNQUcgKSAhPSBTQUlBTUFHIHx8CisgICAgICAgIGxzZWVrKCBmZCwgMCwgU0VFS19TRVQgKSA9PSAtMSApCisgICAgeworICAgICAgICBjbG9zZSggZmQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggIXN0cm5jbXAoIEFJQU1BRywgZmxfbWFnaWMsIFNBSUFNQUcgKSApCisgICAgeworICAgICAgICAvKiByZWFkIHNtYWxsIHZhcmlhbnQgKi8KKyAgICAgICAgZmlsZV9hcmNoc2Nhbl9zbWFsbCggZmQsIGFyY2hpdmUsIGZ1bmMsIGNsb3N1cmUgKTsKKyAgICB9CisjaWZkZWYgQVJfSFNaX0JJRworICAgIGVsc2UgaWYgKCAhc3RybmNtcCggQUlBTUFHQklHLCBmbF9tYWdpYywgU0FJQU1BRyApICkKKyAgICB7CisgICAgICAgIC8qIHJlYWQgYmlnIHZhcmlhbnQgKi8KKyAgICAgICAgZmlsZV9hcmNoc2Nhbl9iaWcoIGZkLCBhcmNoaXZlLCBmdW5jLCBjbG9zdXJlICk7CisgICAgfQorI2VuZGlmCisKKyAgICBjbG9zZSggZmQgKTsKK30KKworI2VuZGlmICAvKiBBSUFNQUcgLSBSUzYwMDAgQUlYICovCisKKyNlbmRpZiAgLyogVVNFX0ZJTEVVTklYICovCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9mcmFtZXMuYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2ZyYW1lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTFjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9mcmFtZXMuYwpAQCAtMCwwICsxLDI5IEBACisvKgorICogIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisjaW5jbHVkZSAiamFtLmgiCisjaW5jbHVkZSAiZnJhbWVzLmgiCisKKworRlJBTUUgKiBmcmFtZV9iZWZvcmVfcHl0aG9uX2NhbGw7CisKKwordm9pZCBmcmFtZV9pbml0KCBGUkFNRSAqIGZyYW1lICkKK3sKKyAgICBmcmFtZS0+cHJldiA9IDA7CisgICAgZnJhbWUtPnByZXZfdXNlciA9IDA7CisgICAgbG9sX2luaXQoIGZyYW1lLT5hcmdzICk7CisgICAgZnJhbWUtPm1vZHVsZSA9IHJvb3RfbW9kdWxlKCk7CisgICAgZnJhbWUtPnJ1bGVuYW1lID0gIm1vZHVsZSBzY29wZSI7CisgICAgZnJhbWUtPmZpbGUgPSAwOworICAgIGZyYW1lLT5saW5lID0gLTE7Cit9CisKKwordm9pZCBmcmFtZV9mcmVlKCBGUkFNRSAqIGZyYW1lICkKK3sKKyAgICBsb2xfZnJlZSggZnJhbWUtPmFyZ3MgKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2ZyYW1lcy5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZnJhbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5OWYxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2ZyYW1lcy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA0IERhdmlkIEFicmFoYW1zLgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKyNpZm5kZWYgRlJBTUVTX0RXQTIwMDExMDIxX0gKKyNkZWZpbmUgRlJBTUVTX0RXQTIwMDExMDIxX0gKKworI2luY2x1ZGUgImxpc3RzLmgiCisjaW5jbHVkZSAibW9kdWxlcy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorCisKK3R5cGVkZWYgc3RydWN0IGZyYW1lIEZSQU1FOworCitzdHJ1Y3QgZnJhbWUKK3sKKyAgICBGUkFNRSAgICAgICogcHJldjsKKyAgICBGUkFNRSAgICAgICogcHJldl91c2VyOyAgLyogVGhlIG5lYXJlc3QgZW5jbG9zaW5nIGZyYW1lIGZvciB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPnVzZXJfbW9kdWxlIGlzIHRydWUuICovCisgICAgTE9MICAgICAgICAgIGFyZ3NbIDEgXTsKKyAgICBtb2R1bGVfdCAgICogbW9kdWxlOworICAgIE9CSkVDVCAgICAgKiBmaWxlOworICAgIGludCAgICAgICAgICBsaW5lOworICAgIGNoYXIgY29uc3QgKiBydWxlbmFtZTsKK307CisKKworLyogV2hlbiBhIGNhbGwgaW50byBQeXRob24gaXMgaW4gcHJvZ3Jlc3MsIHRoaXMgdmFyaWFibGUgcG9pbnRzIHRvIHRoZSBiamFtCisgKiBmcmFtZSB0aGF0IHdhcyBjdXJyZW50IGF0IHRoZSBtb21lbnQgb2YgdGhlIGNhbGwuIFdoZW4gdGhlIGNhbGwgY29tcGxldGVzLAorICogdGhlIHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkLiBGdXJ0aGVybW9yZSwgaWYgSmFtIGNhbGxzIFB5dGhvbiB3aGljaCBjYWxscyBKYW0KKyAqIGFuZCBzbyBvbiwgdGhpcyB2YXJpYWJsZSBvbmx5IGtlZXBzIHRoZSBtb3N0IHJlY2VudCBKYW0gZnJhbWUuCisgKi8KK2V4dGVybiBGUkFNRSAqIGZyYW1lX2JlZm9yZV9weXRob25fY2FsbDsKKworCit2b2lkIGZyYW1lX2luaXQoIEZSQU1FICogKTsKK3ZvaWQgZnJhbWVfZnJlZSggRlJBTUUgKiApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2Z1bmN0aW9uLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9mdW5jdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MDg1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9mdW5jdGlvbi5jCkBAIC0wLDAgKzEsNDg3MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFN0ZXZlbiBXYXRhbmFiZQorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKyNpbmNsdWRlICJqYW0uaCIKKyNpbmNsdWRlICJmdW5jdGlvbi5oIgorCisjaW5jbHVkZSAiY2xhc3MuaCIKKyNpbmNsdWRlICJjb21waWxlLmgiCisjaW5jbHVkZSAiY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiZmlsZXN5cy5oIgorI2luY2x1ZGUgImZyYW1lcy5oIgorI2luY2x1ZGUgImxpc3RzLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAicGF0aHN5cy5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisjaW5jbHVkZSAic2VhcmNoLmgiCisjaW5jbHVkZSAidmFyaWFibGUuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBPU19DWUdXSU4KKyMgaW5jbHVkZSA8Y3lnd2luL3ZlcnNpb24uaD4KKyMgaW5jbHVkZSA8c3lzL2N5Z3dpbi5oPgorIyBpZmRlZiBDWUdXSU5fVkVSU0lPTl9DWUdXSU5fQ09OVgorIyAgaW5jbHVkZSA8ZXJybm8uaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKK2ludCBnbG9iKCBjaGFyIGNvbnN0ICogcywgY2hhciBjb25zdCAqIGMgKTsKK3ZvaWQgYmFja3RyYWNlKCBGUkFNRSAqICk7Cit2b2lkIGJhY2t0cmFjZV9saW5lKCBGUkFNRSAqICk7CisKKyNkZWZpbmUgSU5TVFJfUFVTSF9FTVBUWSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOU1RSX1BVU0hfQ09OU1RBTlQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlNUUl9QVVNIX0FSRyAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSU5TVFJfUFVTSF9WQVIgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIElOU1RSX1BVU0hfVkFSX0ZJWEVEICAgICAgICAgICAgICAgNTcKKyNkZWZpbmUgSU5TVFJfUFVTSF9HUk9VUCAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElOU1RSX1BVU0hfUkVTVUxUICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBJTlNUUl9QVVNIX0FQUEVORCAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSU5TVFJfU1dBUCAgICAgICAgICAgICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgSU5TVFJfSlVNUF9FTVBUWSAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIElOU1RSX0pVTVBfTk9UX0VNUFRZICAgICAgICAgICAgICAgOQorCisjZGVmaW5lIElOU1RSX0pVTVAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgSU5TVFJfSlVNUF9MVCAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBJTlNUUl9KVU1QX0xFICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIElOU1RSX0pVTVBfR1QgICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgSU5TVFJfSlVNUF9HRSAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBJTlNUUl9KVU1QX0VRICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIElOU1RSX0pVTVBfTkUgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSU5TVFJfSlVNUF9JTiAgICAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBJTlNUUl9KVU1QX05PVF9JTiAgICAgICAgICAgICAgICAgIDE4CisKKyNkZWZpbmUgSU5TVFJfSlVNUF9OT1RfR0xPQiAgICAgICAgICAgICAgICAxOQorCisjZGVmaW5lIElOU1RSX0ZPUl9JTklUICAgICAgICAgICAgICAgICAgICAgNTYKKyNkZWZpbmUgSU5TVFJfRk9SX0xPT1AgICAgICAgICAgICAgICAgICAgICAyMAorCisjZGVmaW5lIElOU1RSX1NFVF9SRVNVTFQgICAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgSU5TVFJfUkVUVVJOICAgICAgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBJTlNUUl9QT1AgICAgICAgICAgICAgICAgICAgICAgICAgIDIzCisKKyNkZWZpbmUgSU5TVFJfUFVTSF9MT0NBTCAgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBJTlNUUl9QT1BfTE9DQUwgICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIElOU1RSX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgSU5TVFJfQVBQRU5EICAgICAgICAgICAgICAgICAgICAgICAyNworI2RlZmluZSBJTlNUUl9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgIDI4CisKKyNkZWZpbmUgSU5TVFJfUFVTSF9MT0NBTF9GSVhFRCAgICAgICAgICAgICA1OAorI2RlZmluZSBJTlNUUl9QT1BfTE9DQUxfRklYRUQgICAgICAgICAgICAgIDU5CisjZGVmaW5lIElOU1RSX1NFVF9GSVhFRCAgICAgICAgICAgICAgICAgICAgNjAKKyNkZWZpbmUgSU5TVFJfQVBQRU5EX0ZJWEVEICAgICAgICAgICAgICAgICA2MQorI2RlZmluZSBJTlNUUl9ERUZBVUxUX0ZJWEVEICAgICAgICAgICAgICAgIDYyCisKKyNkZWZpbmUgSU5TVFJfUFVTSF9MT0NBTF9HUk9VUCAgICAgICAgICAgICAyOQorI2RlZmluZSBJTlNUUl9QT1BfTE9DQUxfR1JPVVAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIElOU1RSX1NFVF9HUk9VUCAgICAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgSU5TVFJfQVBQRU5EX0dST1VQICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBJTlNUUl9ERUZBVUxUX0dST1VQICAgICAgICAgICAgICAgIDMzCisKKyNkZWZpbmUgSU5TVFJfUFVTSF9PTiAgICAgICAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBJTlNUUl9QT1BfT04gICAgICAgICAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIElOU1RSX1NFVF9PTiAgICAgICAgICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgSU5TVFJfQVBQRU5EX09OICAgICAgICAgICAgICAgICAgICAzNworI2RlZmluZSBJTlNUUl9ERUZBVUxUX09OICAgICAgICAgICAgICAgICAgIDM4CisjZGVmaW5lIElOU1RSX0dFVF9PTiAgICAgICAgICAgICAgICAgICAgICAgNjUKKworI2RlZmluZSBJTlNUUl9DQUxMX1JVTEUgICAgICAgICAgICAgICAgICAgIDM5CisjZGVmaW5lIElOU1RSX0NBTExfTUVNQkVSX1JVTEUgICAgICAgICAgICAgNjYKKworI2RlZmluZSBJTlNUUl9BUFBMWV9NT0RJRklFUlMgICAgICAgICAgICAgIDQwCisjZGVmaW5lIElOU1RSX0FQUExZX0lOREVYICAgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgSU5TVFJfQVBQTFlfSU5ERVhfTU9ESUZJRVJTICAgICAgICA0MgorI2RlZmluZSBJTlNUUl9BUFBMWV9NT0RJRklFUlNfR1JPVVAgICAgICAgIDQzCisjZGVmaW5lIElOU1RSX0FQUExZX0lOREVYX0dST1VQICAgICAgICAgICAgNDQKKyNkZWZpbmUgSU5TVFJfQVBQTFlfSU5ERVhfTU9ESUZJRVJTX0dST1VQICA0NQorI2RlZmluZSBJTlNUUl9DT01CSU5FX1NUUklOR1MgICAgICAgICAgICAgIDQ2CisjZGVmaW5lIElOU1RSX0dFVF9HUklTVCAgICAgICAgICAgICAgICAgICAgNjQKKworI2RlZmluZSBJTlNUUl9JTkNMVURFICAgICAgICAgICAgICAgICAgICAgIDQ3CisjZGVmaW5lIElOU1RSX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgNDgKKyNkZWZpbmUgSU5TVFJfQUNUSU9OUyAgICAgICAgICAgICAgICAgICAgICA0OQorI2RlZmluZSBJTlNUUl9QVVNIX01PRFVMRSAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIElOU1RSX1BPUF9NT0RVTEUgICAgICAgICAgICAgICAgICAgNTEKKyNkZWZpbmUgSU5TVFJfQ0xBU1MgICAgICAgICAgICAgICAgICAgICAgICA1MgorI2RlZmluZSBJTlNUUl9CSU5EX01PRFVMRV9WQVJJQUJMRVMgICAgICAgIDYzCisKKyNkZWZpbmUgSU5TVFJfQVBQRU5EX1NUUklOR1MgICAgICAgICAgICAgICA1MworI2RlZmluZSBJTlNUUl9XUklURV9GSUxFICAgICAgICAgICAgICAgICAgIDU0CisjZGVmaW5lIElOU1RSX09VVFBVVF9TVFJJTkdTICAgICAgICAgICAgICAgNTUKKwordHlwZWRlZiBzdHJ1Y3QgaW5zdHJ1Y3Rpb24KK3sKKyAgICB1bnNpZ25lZCBpbnQgb3BfY29kZTsKKyAgICBpbnQgYXJnOworfSBpbnN0cnVjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgX3N1YmZ1bmN0aW9uCit7CisgICAgT0JKRUNUICogbmFtZTsKKyAgICBGVU5DVElPTiAqIGNvZGU7CisgICAgaW50IGxvY2FsOworfSBTVUJGVU5DVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX3N1YmFjdGlvbgoreworICAgIE9CSkVDVCAqIG5hbWU7CisgICAgRlVOQ1RJT04gKiBjb21tYW5kOworICAgIGludCBmbGFnczsKK30gU1VCQUNUSU9OOworCisjZGVmaW5lIEZVTkNUSU9OX0JVSUxUSU4gICAgMAorI2RlZmluZSBGVU5DVElPTl9KQU0gICAgICAgIDEKKworc3RydWN0IGFyZ3VtZW50Cit7CisgICAgaW50IGZsYWdzOworI2RlZmluZSBBUkdfT05FIDAKKyNkZWZpbmUgQVJHX09QVElPTkFMIDEKKyNkZWZpbmUgQVJHX1BMVVMgMgorI2RlZmluZSBBUkdfU1RBUiAzCisjZGVmaW5lIEFSR19WQVJJQURJQyA0CisgICAgT0JKRUNUICogdHlwZV9uYW1lOworICAgIE9CSkVDVCAqIGFyZ19uYW1lOworICAgIGludCBpbmRleDsKK307CisKK3N0cnVjdCBhcmdfbGlzdAoreworICAgIGludCBzaXplOworICAgIHN0cnVjdCBhcmd1bWVudCAqIGFyZ3M7Cit9OworCitzdHJ1Y3QgX2Z1bmN0aW9uCit7CisgICAgaW50IHR5cGU7CisgICAgaW50IHJlZmVyZW5jZV9jb3VudDsKKyAgICBPQkpFQ1QgKiBydWxlbmFtZTsKKyAgICBzdHJ1Y3QgYXJnX2xpc3QgKiBmb3JtYWxfYXJndW1lbnRzOworICAgIGludCBudW1fZm9ybWFsX2FyZ3VtZW50czsKK307CisKK3R5cGVkZWYgc3RydWN0IF9idWlsdGluX2Z1bmN0aW9uCit7CisgICAgRlVOQ1RJT04gYmFzZTsKKyAgICBMSVNUICogKCAqIGZ1bmMgKSggRlJBTUUgKiwgaW50IGZsYWdzICk7CisgICAgaW50IGZsYWdzOworfSBCVUlMVElOX0ZVTkNUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfamFtX2Z1bmN0aW9uCit7CisgICAgRlVOQ1RJT04gYmFzZTsKKyAgICBpbnQgY29kZV9zaXplOworICAgIGluc3RydWN0aW9uICogY29kZTsKKyAgICBpbnQgbnVtX2NvbnN0YW50czsKKyAgICBPQkpFQ1QgKiAqIGNvbnN0YW50czsKKyAgICBpbnQgbnVtX3N1YmZ1bmN0aW9uczsKKyAgICBTVUJGVU5DVElPTiAqIGZ1bmN0aW9uczsKKyAgICBpbnQgbnVtX3N1YmFjdGlvbnM7CisgICAgU1VCQUNUSU9OICogYWN0aW9uczsKKyAgICBGVU5DVElPTiAqIGdlbmVyaWM7CisgICAgT0JKRUNUICogZmlsZTsKKyAgICBpbnQgbGluZTsKK30gSkFNX0ZVTkNUSU9OOworCisKKyNpZmRlZiBIQVZFX1BZVEhPTgorCisjZGVmaW5lIEZVTkNUSU9OX1BZVEhPTiAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBfcHl0aG9uX2Z1bmN0aW9uCit7CisgICAgRlVOQ1RJT04gYmFzZTsKKyAgICBQeU9iamVjdCAqIHB5dGhvbl9mdW5jdGlvbjsKK30gUFlUSE9OX0ZVTkNUSU9OOworCitzdGF0aWMgTElTVCAqIGNhbGxfcHl0aG9uX2Z1bmN0aW9uKCBQWVRIT05fRlVOQ1RJT04gKiwgRlJBTUUgKiApOworCisjZW5kaWYKKworCitzdHJ1Y3QgX3N0YWNrCit7CisgICAgdm9pZCAqIGRhdGE7Cit9OworCitzdGF0aWMgdm9pZCAqIHN0YWNrOworCitTVEFDSyAqIHN0YWNrX2dsb2JhbCgpCit7CisgICAgc3RhdGljIFNUQUNLIHJlc3VsdDsKKyAgICBpZiAoICFzdGFjayApCisgICAgeworICAgICAgICBpbnQgY29uc3Qgc2l6ZSA9IDEgPDwgMjE7CisgICAgICAgIHN0YWNrID0gQkpBTV9NQUxMT0MoIHNpemUgKTsKKyAgICAgICAgcmVzdWx0LmRhdGEgPSAoY2hhciAqKXN0YWNrICsgc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuICZyZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2FsaWdubWVudCggU1RBQ0sgKiBzICkKK3sKKyAgICBhc3NlcnQoIChzaXplX3Qpcy0+ZGF0YSAlIHNpemVvZiggTElTVCAqICkgPT0gMCApOworfQorCit2b2lkICogc3RhY2tfYWxsb2NhdGUoIFNUQUNLICogcywgaW50IHNpemUgKQoreworICAgIGNoZWNrX2FsaWdubWVudCggcyApOworICAgIHMtPmRhdGEgPSAoY2hhciAqKXMtPmRhdGEgLSBzaXplOworICAgIGNoZWNrX2FsaWdubWVudCggcyApOworICAgIHJldHVybiBzLT5kYXRhOworfQorCit2b2lkIHN0YWNrX2RlYWxsb2NhdGUoIFNUQUNLICogcywgaW50IHNpemUgKQoreworICAgIGNoZWNrX2FsaWdubWVudCggcyApOworICAgIHMtPmRhdGEgPSAoY2hhciAqKXMtPmRhdGEgKyBzaXplOworICAgIGNoZWNrX2FsaWdubWVudCggcyApOworfQorCit2b2lkIHN0YWNrX3B1c2goIFNUQUNLICogcywgTElTVCAqIGwgKQoreworICAgICooTElTVCAqICopc3RhY2tfYWxsb2NhdGUoIHMsIHNpemVvZiggTElTVCAqICkgKSA9IGw7Cit9CisKK0xJU1QgKiBzdGFja19wb3AoIFNUQUNLICogcyApCit7CisgICAgTElTVCAqIGNvbnN0IHJlc3VsdCA9ICooTElTVCAqICopcy0+ZGF0YTsKKyAgICBzdGFja19kZWFsbG9jYXRlKCBzLCBzaXplb2YoIExJU1QgKiApICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTElTVCAqIHN0YWNrX3RvcCggU1RBQ0sgKiBzICkKK3sKKyAgICBjaGVja19hbGlnbm1lbnQoIHMgKTsKKyAgICByZXR1cm4gKihMSVNUICogKilzLT5kYXRhOworfQorCitMSVNUICogc3RhY2tfYXQoIFNUQUNLICogcywgaW50IG4gKQoreworICAgIGNoZWNrX2FsaWdubWVudCggcyApOworICAgIHJldHVybiAqKCAoTElTVCAqICopcy0+ZGF0YSArIG4gKTsKK30KKwordm9pZCBzdGFja19zZXQoIFNUQUNLICogcywgaW50IG4sIExJU1QgKiB2YWx1ZSApCit7CisgICAgY2hlY2tfYWxpZ25tZW50KCBzICk7CisgICAgKigoTElTVCAqICopcy0+ZGF0YSArIG4pID0gdmFsdWU7Cit9CisKK3ZvaWQgKiBzdGFja19nZXQoIFNUQUNLICogcyApCit7CisgICAgY2hlY2tfYWxpZ25tZW50KCBzICk7CisgICAgcmV0dXJuIHMtPmRhdGE7Cit9CisKK0xJU1QgKiBmcmFtZV9nZXRfbG9jYWwoIEZSQU1FICogZnJhbWUsIGludCBpZHggKQoreworICAgIC8qIFRoZSBvbmx5IGxvY2FsIHZhcmlhYmxlcyBhcmUgdGhlIGFyZ3VtZW50cy4gKi8KKyAgICByZXR1cm4gbGlzdF9jb3B5KCBsb2xfZ2V0KCBmcmFtZS0+YXJncywgaWR4ICkgKTsKK30KKworc3RhdGljIE9CSkVDVCAqIGZ1bmN0aW9uX2dldF9jb25zdGFudCggSkFNX0ZVTkNUSU9OICogZnVuY3Rpb24sIGludCBpZHggKQoreworICAgIHJldHVybiBmdW5jdGlvbi0+Y29uc3RhbnRzWyBpZHggXTsKK30KKworc3RhdGljIExJU1QgKiBmdW5jdGlvbl9nZXRfdmFyaWFibGUoIEpBTV9GVU5DVElPTiAqIGZ1bmN0aW9uLCBGUkFNRSAqIGZyYW1lLAorICAgIGludCBpZHggKQoreworICAgIHJldHVybiBsaXN0X2NvcHkoIHZhcl9nZXQoIGZyYW1lLT5tb2R1bGUsIGZ1bmN0aW9uLT5jb25zdGFudHNbIGlkeCBdICkgKTsKK30KKworc3RhdGljIHZvaWQgZnVuY3Rpb25fc2V0X3ZhcmlhYmxlKCBKQU1fRlVOQ1RJT04gKiBmdW5jdGlvbiwgRlJBTUUgKiBmcmFtZSwKKyAgICBpbnQgaWR4LCBMSVNUICogdmFsdWUgKQoreworICAgIHZhcl9zZXQoIGZyYW1lLT5tb2R1bGUsIGZ1bmN0aW9uLT5jb25zdGFudHNbIGlkeCBdLCB2YWx1ZSwgVkFSX1NFVCApOworfQorCitzdGF0aWMgTElTVCAqIGZ1bmN0aW9uX3N3YXBfdmFyaWFibGUoIEpBTV9GVU5DVElPTiAqIGZ1bmN0aW9uLCBGUkFNRSAqIGZyYW1lLAorICAgIGludCBpZHgsIExJU1QgKiB2YWx1ZSApCit7CisgICAgcmV0dXJuIHZhcl9zd2FwKCBmcmFtZS0+bW9kdWxlLCBmdW5jdGlvbi0+Y29uc3RhbnRzWyBpZHggXSwgdmFsdWUgKTsKK30KKworc3RhdGljIHZvaWQgZnVuY3Rpb25fYXBwZW5kX3ZhcmlhYmxlKCBKQU1fRlVOQ1RJT04gKiBmdW5jdGlvbiwgRlJBTUUgKiBmcmFtZSwKKyAgICBpbnQgaWR4LCBMSVNUICogdmFsdWUgKQoreworICAgIHZhcl9zZXQoIGZyYW1lLT5tb2R1bGUsIGZ1bmN0aW9uLT5jb25zdGFudHNbIGlkeCBdLCB2YWx1ZSwgVkFSX0FQUEVORCApOworfQorCitzdGF0aWMgdm9pZCBmdW5jdGlvbl9kZWZhdWx0X3ZhcmlhYmxlKCBKQU1fRlVOQ1RJT04gKiBmdW5jdGlvbiwgRlJBTUUgKiBmcmFtZSwKKyAgICBpbnQgaWR4LCBMSVNUICogdmFsdWUgKQoreworICAgIHZhcl9zZXQoIGZyYW1lLT5tb2R1bGUsIGZ1bmN0aW9uLT5jb25zdGFudHNbIGlkeCBdLCB2YWx1ZSwgVkFSX0RFRkFVTFQgKTsKK30KKworc3RhdGljIHZvaWQgZnVuY3Rpb25fc2V0X3J1bGUoIEpBTV9GVU5DVElPTiAqIGZ1bmN0aW9uLCBGUkFNRSAqIGZyYW1lLAorICAgIFNUQUNLICogcywgaW50IGlkeCApCit7CisgICAgU1VCRlVOQ1RJT04gKiBzdWIgPSBmdW5jdGlvbi0+ZnVuY3Rpb25zICsgaWR4OworICAgIG5ld19ydWxlX2JvZHkoIGZyYW1lLT5tb2R1bGUsIHN1Yi0+bmFtZSwgc3ViLT5jb2RlLCAhc3ViLT5sb2NhbCApOworfQorCitzdGF0aWMgdm9pZCBmdW5jdGlvbl9zZXRfYWN0aW9ucyggSkFNX0ZVTkNUSU9OICogZnVuY3Rpb24sIEZSQU1FICogZnJhbWUsCisgICAgU1RBQ0sgKiBzLCBpbnQgaWR4ICkKK3sKKyAgICBTVUJBQ1RJT04gKiBzdWIgPSBmdW5jdGlvbi0+YWN0aW9ucyArIGlkeDsKKyAgICBMSVNUICogYmluZGxpc3QgPSBzdGFja19wb3AoIHMgKTsKKyAgICBuZXdfcnVsZV9hY3Rpb25zKCBmcmFtZS0+bW9kdWxlLCBzdWItPm5hbWUsIHN1Yi0+Y29tbWFuZCwgYmluZGxpc3QsCisgICAgICAgIHN1Yi0+ZmxhZ3MgKTsKK30KKworCisvKgorICogUmV0dXJucyB0aGUgaW5kZXggaWYgbmFtZSBpcyAiPCIsICI+IiwgIjEiLCAiMiIsIC4uLiBvciAiMTkiIG90aGVyd2lzZQorICogcmV0dXJucyAtMS4KKyAqLworCitzdGF0aWMgaW50IGdldF9hcmd1bWVudF9pbmRleCggY2hhciBjb25zdCAqIHMgKQoreworICAgIGlmICggc1sgMCBdICE9ICdcMCcpCisgICAgeworICAgICAgICBpZiAoIHNbIDEgXSA9PSAnXDAnICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICggc1sgMCBdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICc8JzogcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgY2FzZSAnPic6IHJldHVybiAxOworCisgICAgICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICAgICAgY2FzZSAnNCc6CisgICAgICAgICAgICAgICAgY2FzZSAnNSc6CisgICAgICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICAgICAgY2FzZSAnNyc6CisgICAgICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzWyAwIF0gLSAnMSc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHNbIDAgXSA9PSAnMScgJiYgc1sgMiBdID09ICdcMCcgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goIHNbIDEgXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgY2FzZSAnNSc6CisgICAgICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICBjYXNlICc5JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc1sgMSBdIC0gJzAnICsgMTAgLSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIExJU1QgKiBmdW5jdGlvbl9nZXRfbmFtZWRfdmFyaWFibGUoIEpBTV9GVU5DVElPTiAqIGZ1bmN0aW9uLAorICAgIEZSQU1FICogZnJhbWUsIE9CSkVDVCAqIG5hbWUgKQoreworICAgIGludCBjb25zdCBpZHggPSBnZXRfYXJndW1lbnRfaW5kZXgoIG9iamVjdF9zdHIoIG5hbWUgKSApOworICAgIHJldHVybiBpZHggPT0gLTEKKyAgICAgICAgPyBsaXN0X2NvcHkoIHZhcl9nZXQoIGZyYW1lLT5tb2R1bGUsIG5hbWUgKSApCisgICAgICAgIDogbGlzdF9jb3B5KCBsb2xfZ2V0KCBmcmFtZS0+YXJncywgaWR4ICkgKTsKK30KKworc3RhdGljIHZvaWQgZnVuY3Rpb25fc2V0X25hbWVkX3ZhcmlhYmxlKCBKQU1fRlVOQ1RJT04gKiBmdW5jdGlvbiwgRlJBTUUgKiBmcmFtZSwKKyAgICBPQkpFQ1QgKiBuYW1lLCBMSVNUICogdmFsdWUpCit7CisgICAgdmFyX3NldCggZnJhbWUtPm1vZHVsZSwgbmFtZSwgdmFsdWUsIFZBUl9TRVQgKTsKK30KKworc3RhdGljIExJU1QgKiBmdW5jdGlvbl9zd2FwX25hbWVkX3ZhcmlhYmxlKCBKQU1fRlVOQ1RJT04gKiBmdW5jdGlvbiwKKyAgICBGUkFNRSAqIGZyYW1lLCBPQkpFQ1QgKiBuYW1lLCBMSVNUICogdmFsdWUgKQoreworICAgIHJldHVybiB2YXJfc3dhcCggZnJhbWUtPm1vZHVsZSwgbmFtZSwgdmFsdWUgKTsKK30KKworc3RhdGljIHZvaWQgZnVuY3Rpb25fYXBwZW5kX25hbWVkX3ZhcmlhYmxlKCBKQU1fRlVOQ1RJT04gKiBmdW5jdGlvbiwKKyAgICBGUkFNRSAqIGZyYW1lLCBPQkpFQ1QgKiBuYW1lLCBMSVNUICogdmFsdWUpCit7CisgICAgdmFyX3NldCggZnJhbWUtPm1vZHVsZSwgbmFtZSwgdmFsdWUsIFZBUl9BUFBFTkQgKTsKK30KKworc3RhdGljIHZvaWQgZnVuY3Rpb25fZGVmYXVsdF9uYW1lZF92YXJpYWJsZSggSkFNX0ZVTkNUSU9OICogZnVuY3Rpb24sCisgICAgRlJBTUUgKiBmcmFtZSwgT0JKRUNUICogbmFtZSwgTElTVCAqIHZhbHVlICkKK3sKKyAgICB2YXJfc2V0KCBmcmFtZS0+bW9kdWxlLCBuYW1lLCB2YWx1ZSwgVkFSX0RFRkFVTFQgKTsKK30KKworc3RhdGljIExJU1QgKiBmdW5jdGlvbl9jYWxsX3J1bGUoIEpBTV9GVU5DVElPTiAqIGZ1bmN0aW9uLCBGUkFNRSAqIGZyYW1lLAorICAgIFNUQUNLICogcywgaW50IG5fYXJncywgY2hhciBjb25zdCAqIHVuZXhwYW5kZWQsIE9CSkVDVCAqIGZpbGUsIGludCBsaW5lICkKK3sKKyAgICBGUkFNRSBpbm5lclsgMSBdOworICAgIGludCBpOworICAgIExJU1QgKiBmaXJzdCA9IHN0YWNrX3BvcCggcyApOworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBPQkpFQ1QgKiBydWxlbmFtZTsKKyAgICBMSVNUICogdHJhaWxpbmc7CisKKyAgICBmcmFtZS0+ZmlsZSA9IGZpbGU7CisgICAgZnJhbWUtPmxpbmUgPSBsaW5lOworCisgICAgaWYgKCBsaXN0X2VtcHR5KCBmaXJzdCApICkKKyAgICB7CisgICAgICAgIGJhY2t0cmFjZV9saW5lKCBmcmFtZSApOworICAgICAgICBwcmludGYoICJ3YXJuaW5nOiBydWxlbmFtZSAlcyBleHBhbmRzIHRvIGVtcHR5IHN0cmluZ1xuIiwgdW5leHBhbmRlZCApOworICAgICAgICBiYWNrdHJhY2UoIGZyYW1lICk7CisgICAgICAgIGxpc3RfZnJlZSggZmlyc3QgKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBuX2FyZ3M7ICsraSApCisgICAgICAgICAgICBsaXN0X2ZyZWUoIHN0YWNrX3BvcCggcyApICk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcnVsZW5hbWUgPSBvYmplY3RfY29weSggbGlzdF9mcm9udCggZmlyc3QgKSApOworCisgICAgZnJhbWVfaW5pdCggaW5uZXIgKTsKKyAgICBpbm5lci0+cHJldiA9IGZyYW1lOworICAgIGlubmVyLT5wcmV2X3VzZXIgPSBmcmFtZS0+bW9kdWxlLT51c2VyX21vZHVsZSA/IGZyYW1lIDogZnJhbWUtPnByZXZfdXNlcjsKKyAgICBpbm5lci0+bW9kdWxlID0gZnJhbWUtPm1vZHVsZTsgIC8qIFRoaXMgZ2V0cyBmaXhlZCB1cCBpbiBldmFsdWF0ZV9ydWxlKCkuICovCisKKyAgICBmb3IgKCBpID0gMDsgaSA8IG5fYXJnczsgKytpICkKKyAgICAgICAgbG9sX2FkZCggaW5uZXItPmFyZ3MsIHN0YWNrX2F0KCBzLCBuX2FyZ3MgLSBpIC0gMSApICk7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IG5fYXJnczsgKytpICkKKyAgICAgICAgc3RhY2tfcG9wKCBzICk7CisKKyAgICB0cmFpbGluZyA9IGxpc3RfcG9wX2Zyb250KCBmaXJzdCApOworICAgIGlmICggdHJhaWxpbmcgKQorICAgIHsKKyAgICAgICAgaWYgKCBpbm5lci0+YXJncy0+Y291bnQgPT0gMCApCisgICAgICAgICAgICBsb2xfYWRkKCBpbm5lci0+YXJncywgdHJhaWxpbmcgKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMSVNUICogKiBjb25zdCBsID0gJmlubmVyLT5hcmdzLT5saXN0WyAwIF07CisgICAgICAgICAgICAqbCA9IGxpc3RfYXBwZW5kKCB0cmFpbGluZywgKmwgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCA9IGV2YWx1YXRlX3J1bGUoIGJpbmRydWxlKCBydWxlbmFtZSwgaW5uZXItPm1vZHVsZSApLCBydWxlbmFtZSwgaW5uZXIgKTsKKyAgICBmcmFtZV9mcmVlKCBpbm5lciApOworICAgIG9iamVjdF9mcmVlKCBydWxlbmFtZSApOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBMSVNUICogZnVuY3Rpb25fY2FsbF9tZW1iZXJfcnVsZSggSkFNX0ZVTkNUSU9OICogZnVuY3Rpb24sIEZSQU1FICogZnJhbWUsIFNUQUNLICogcywgaW50IG5fYXJncywgT0JKRUNUICogcnVsZW5hbWUsIE9CSkVDVCAqIGZpbGUsIGludCBsaW5lICkKK3sKKyAgICBGUkFNRSAgIGlubmVyWyAxIF07CisgICAgaW50IGk7CisgICAgTElTVCAqIGZpcnN0ID0gc3RhY2tfcG9wKCBzICk7CisgICAgTElTVCAqIHJlc3VsdCA9IEwwOworICAgIExJU1QgKiB0cmFpbGluZzsKKyAgICBSVUxFICogcnVsZTsKKyAgICBtb2R1bGVfdCAqIG1vZHVsZTsKKyAgICBPQkpFQ1QgKiByZWFsX3J1bGVuYW1lID0gMDsKKworICAgIGZyYW1lLT5maWxlID0gZmlsZTsKKyAgICBmcmFtZS0+bGluZSA9IGxpbmU7CisgICAgCisgICAgaWYgKCBsaXN0X2VtcHR5KCBmaXJzdCApICkKKyAgICB7CisgICAgICAgIGJhY2t0cmFjZV9saW5lKCBmcmFtZSApOworICAgICAgICBwcmludGYoICJ3YXJuaW5nOiBvYmplY3QgaXMgZW1wdHlcbiIgKTsKKyAgICAgICAgYmFja3RyYWNlKCBmcmFtZSApOworCisgICAgICAgIGxpc3RfZnJlZSggZmlyc3QgKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbl9hcmdzOyArK2kgKQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIHN0YWNrX3BvcCggcyApICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIEZJWE1FOiBoYW5kbGUgZ2VuZXJpYyBjYXNlICovCisgICAgYXNzZXJ0KCBsaXN0X2xlbmd0aCggZmlyc3QgKSA9PSAxICk7CisKKyAgICBtb2R1bGUgPSBiaW5kbW9kdWxlKCBsaXN0X2Zyb250KCBmaXJzdCApICk7CisgICAgaWYgKCBtb2R1bGUtPmNsYXNzX21vZHVsZSApCisgICAgeworICAgICAgICBydWxlID0gYmluZHJ1bGUoIHJ1bGVuYW1lLCBtb2R1bGUgKTsKKyAgICAgICAgcmVhbF9ydWxlbmFtZSA9IG9iamVjdF9jb3B5KCBmdW5jdGlvbl9ydWxlbmFtZSggcnVsZS0+cHJvY2VkdXJlICkgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RyaW5nIGJ1ZlsgMSBdOworICAgICAgICBzdHJpbmdfbmV3KCBidWYgKTsKKyAgICAgICAgc3RyaW5nX2FwcGVuZCggYnVmLCBvYmplY3Rfc3RyKCBsaXN0X2Zyb250KCBmaXJzdCApICkgKTsKKyAgICAgICAgc3RyaW5nX3B1c2hfYmFjayggYnVmLCAnLicgKTsKKyAgICAgICAgc3RyaW5nX2FwcGVuZCggYnVmLCBvYmplY3Rfc3RyKCBydWxlbmFtZSApICk7CisgICAgICAgIHJlYWxfcnVsZW5hbWUgPSBvYmplY3RfbmV3KCBidWYtPnZhbHVlICk7CisgICAgICAgIHN0cmluZ19mcmVlKCBidWYgKTsKKyAgICAgICAgcnVsZSA9IGJpbmRydWxlKCByZWFsX3J1bGVuYW1lLCBmcmFtZS0+bW9kdWxlICk7CisgICAgfQorCisgICAgZnJhbWVfaW5pdCggaW5uZXIgKTsKKworICAgIGlubmVyLT5wcmV2ID0gZnJhbWU7CisgICAgaW5uZXItPnByZXZfdXNlciA9IGZyYW1lLT5tb2R1bGUtPnVzZXJfbW9kdWxlID8gZnJhbWUgOiBmcmFtZS0+cHJldl91c2VyOworICAgIGlubmVyLT5tb2R1bGUgPSBmcmFtZS0+bW9kdWxlOyAgLyogVGhpcyBnZXRzIGZpeGVkIHVwIGluIGV2YWx1YXRlX3J1bGUoKSwgYmVsb3cuICovCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbl9hcmdzOyArK2kgKQorICAgIHsKKyAgICAgICAgbG9sX2FkZCggaW5uZXItPmFyZ3MsIHN0YWNrX2F0KCBzLCBuX2FyZ3MgLSBpIC0gMSApICk7CisgICAgfQorCisgICAgZm9yKCBpID0gMDsgaSA8IG5fYXJnczsgKytpICkKKyAgICB7CisgICAgICAgIHN0YWNrX3BvcCggcyApOworICAgIH0KKworICAgIGlmICggbGlzdF9sZW5ndGgoIGZpcnN0ICkgPiAxICkKKyAgICB7CisgICAgICAgIHN0cmluZyBidWZbIDEgXTsKKyAgICAgICAgTElTVCAqIHRyYWlsaW5nID0gTDA7CisgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCBmaXJzdCApLCBlbmQgPSBsaXN0X2VuZCggZmlyc3QgKTsKKyAgICAgICAgaXRlciA9IGxpc3RfbmV4dCggaXRlciApOworICAgICAgICBzdHJpbmdfbmV3KCBidWYgKTsKKyAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggYnVmLCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApICk7CisgICAgICAgICAgICBzdHJpbmdfcHVzaF9iYWNrKCBidWYsICcuJyApOworICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggYnVmLCBvYmplY3Rfc3RyKCBydWxlbmFtZSApICk7CisgICAgICAgICAgICB0cmFpbGluZyA9IGxpc3RfcHVzaF9iYWNrKCB0cmFpbGluZywgb2JqZWN0X25ldyggYnVmLT52YWx1ZSApICk7CisgICAgICAgICAgICBzdHJpbmdfdHJ1bmNhdGUoIGJ1ZiwgMCApOworICAgICAgICB9CisgICAgICAgIHN0cmluZ19mcmVlKCBidWYgKTsKKyAgICAgICAgaWYgKCBpbm5lci0+YXJncy0+Y291bnQgPT0gMCApCisgICAgICAgICAgICBsb2xfYWRkKCBpbm5lci0+YXJncywgdHJhaWxpbmcgKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMSVNUICogKiBjb25zdCBsID0gJmlubmVyLT5hcmdzLT5saXN0WyAwIF07CisgICAgICAgICAgICAqbCA9IGxpc3RfYXBwZW5kKCB0cmFpbGluZywgKmwgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCA9IGV2YWx1YXRlX3J1bGUoIHJ1bGUsIHJlYWxfcnVsZW5hbWUsIGlubmVyICk7CisgICAgZnJhbWVfZnJlZSggaW5uZXIgKTsKKyAgICBvYmplY3RfZnJlZSggcnVsZW5hbWUgKTsKKyAgICBvYmplY3RfZnJlZSggcmVhbF9ydWxlbmFtZSApOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogVmFyaWFibGUgZXhwYW5zaW9uICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IHN1YjE7CisgICAgaW50IHN1YjI7Cit9IHN1YnNjcmlwdF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFBBVEhOQU1FIGY7ICAgICAgICAgICAvKiA6R0RCU01SIC0tIHBpZWNlcyAqLworICAgIGNoYXIgICAgIHBhcmVudDsgICAgICAvKiA6UCAtLSBnbyB0byBwYXJlbnQgZGlyZWN0b3J5ICovCisgICAgY2hhciAgICAgZmlsZW1vZHM7ICAgIC8qIG9uZSBvZiB0aGUgYWJvdmUgYXBwbGllZCAqLworICAgIGNoYXIgICAgIGRvd25zaGlmdDsgICAvKiA6TCAtLSBkb3duc2hpZnQgcmVzdWx0ICovCisgICAgY2hhciAgICAgdXBzaGlmdDsgICAgIC8qIDpVIC0tIHVwc2hpZnQgcmVzdWx0ICovCisgICAgY2hhciAgICAgdG9fc2xhc2hlczsgIC8qIDpUIC0tIGNvbnZlcnQgIlwiIHRvICIvIiAqLworICAgIGNoYXIgICAgIHRvX3dpbmRvd3M7ICAvKiA6VyAtLSBjb252ZXJ0IGN5Z3dpbiB0byBuYXRpdmUgcGF0aHMgKi8KKyAgICBQQVRIUEFSVCBlbXB0eTsgICAgICAgLyogOkUgLS0gZGVmYXVsdCBmb3IgZW1wdGllcyAqLworICAgIFBBVEhQQVJUIGpvaW47ICAgICAgICAvKiA6SiAtLSBqb2luIGxpc3Qgd2l0aCBjaGFyICovCit9IFZBUl9FRElUUzsKKworc3RhdGljIExJU1QgKiBhcHBseV9tb2RpZmllcnNfaW1wbCggTElTVCAqIHJlc3VsdCwgc3RyaW5nICogYnVmLAorICAgIFZBUl9FRElUUyAqIGVkaXRzLCBpbnQgbiwgTElTVElURVIgaXRlciwgTElTVElURVIgZW5kICk7CitzdGF0aWMgdm9pZCBnZXRfaXRlcnMoIHN1YnNjcmlwdF90IGNvbnN0IHN1YnNjcmlwdCwgTElTVElURVIgKiBjb25zdCBmaXJzdCwKKyAgICBMSVNUSVRFUiAqIGNvbnN0IGxhc3QsIGludCBjb25zdCBsZW5ndGggKTsKKworCisvKgorICogdmFyX2VkaXRfcGFyc2UoKSAtIHBhcnNlIDogbW9kaWZpZXJzIGludG8gUEFUSE5BTUUgc3RydWN0dXJlCisgKgorICogVGhlIDogbW9kaWZpZXJzIGluIGEgJCh2YXJuYW1lOm1vZGlmaWVyKSBjdXJyZW50bHkgc3VwcG9ydCByZXBsYWNpbmcgb3IKKyAqIG9taXR0aW5nIGVsZW1lbnRzIG9mIGEgZmlsZW5hbWUsIGFuZCBzbyB0aGV5IGFyZSBwYXJzZWQgaW50byBhIFBBVEhOQU1FCisgKiBzdHJ1Y3R1cmUgKHdoaWNoIGNvbnRhaW5zIHBvaW50ZXJzIGludG8gdGhlIG9yaWdpbmFsIHN0cmluZykuCisgKgorICogTW9kaWZpZXJzIG9mIHRoZSBmb3JtICJYPXZhbHVlIiByZXBsYWNlIHRoZSBjb21wb25lbnQgWCB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KKyAqIE1vZGlmaWVycyB3aXRob3V0IHRoZSAiPXZhbHVlIiBjYXVzZSBldmVyeXRoaW5nIGJ1dCB0aGUgY29tcG9uZW50IFggdG8gYmUKKyAqIG9taXR0ZWQuIFggaXMgb25lIG9mOgorICoKKyAqICBHIDxncmlzdD4KKyAqICBEIGRpcmVjdG9yeSBuYW1lCisgKiAgQiBiYXNlIG5hbWUKKyAqICBTIC5zdWZmaXgKKyAqICBNIChtZW1iZXIpCisgKiAgUiByb290IGRpcmVjdG9yeSAtIHByZXBlbmRlZCB0byB3aG9sZSBwYXRoCisgKgorICogVGhpcyByb3V0aW5lIHNldHM6CisgKgorICogIGYtPmZfeHh4LnB0ciA9IDAKKyAqICBmLT5mX3h4eC5sZW4gPSAwCisgKiAgICAgIC0+IGxlYXZlIHRoZSBvcmlnaW5hbCBjb21wb25lbnQgeHh4CisgKgorICogIGYtPmZfeHh4LnB0ciA9IHN0cmluZworICogIGYtPmZfeHh4LmxlbiA9IHN0cmxlbiggc3RyaW5nICkKKyAqICAgICAgLT4gcmVwbGFjZSBjb21wb25lbnQgeHh4IHdpdGggc3RyaW5nCisgKgorICogIGYtPmZfeHh4LnB0ciA9ICIiCisgKiAgZi0+Zl94eHgubGVuID0gMAorICogICAgICAtPiBvbWl0IGNvbXBvbmVudCB4eHgKKyAqCisgKiB2YXJfZWRpdF9maWxlKCkgYmVsb3cgYW5kIHBhdGhfYnVpbGQoKSBvYmxpZ2luZ2x5IGZvbGxvdyB0aGlzIGNvbnZlbnRpb24uCisgKi8KKworc3RhdGljIGludCB2YXJfZWRpdF9wYXJzZSggY2hhciBjb25zdCAqIG1vZHMsIFZBUl9FRElUUyAqIGVkaXRzLCBpbnQgaGF2ZXplcm9lZAorICAgICkKK3sKKyAgICB3aGlsZSAoICptb2RzICkKKyAgICB7CisgICAgICAgIFBBVEhQQVJUICogZnA7CisKKyAgICAgICAgc3dpdGNoICggKm1vZHMrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJ0wnOiBlZGl0cy0+ZG93bnNoaWZ0ID0gMTsgY29udGludWU7CisgICAgICAgICAgICBjYXNlICdVJzogZWRpdHMtPnVwc2hpZnQgPSAxOyBjb250aW51ZTsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiBlZGl0cy0+cGFyZW50ID0gZWRpdHMtPmZpbGVtb2RzID0gMTsgY29udGludWU7CisgICAgICAgICAgICBjYXNlICdFJzogZnAgPSAmZWRpdHMtPmVtcHR5OyBnb3RvIHN0cnZhbDsKKyAgICAgICAgICAgIGNhc2UgJ0onOiBmcCA9ICZlZGl0cy0+am9pbjsgZ290byBzdHJ2YWw7CisgICAgICAgICAgICBjYXNlICdHJzogZnAgPSAmZWRpdHMtPmYuZl9ncmlzdDsgZ290byBmaWxldmFsOworICAgICAgICAgICAgY2FzZSAnUic6IGZwID0gJmVkaXRzLT5mLmZfcm9vdDsgZ290byBmaWxldmFsOworICAgICAgICAgICAgY2FzZSAnRCc6IGZwID0gJmVkaXRzLT5mLmZfZGlyOyBnb3RvIGZpbGV2YWw7CisgICAgICAgICAgICBjYXNlICdCJzogZnAgPSAmZWRpdHMtPmYuZl9iYXNlOyBnb3RvIGZpbGV2YWw7CisgICAgICAgICAgICBjYXNlICdTJzogZnAgPSAmZWRpdHMtPmYuZl9zdWZmaXg7IGdvdG8gZmlsZXZhbDsKKyAgICAgICAgICAgIGNhc2UgJ00nOiBmcCA9ICZlZGl0cy0+Zi5mX21lbWJlcjsgZ290byBmaWxldmFsOworICAgICAgICAgICAgY2FzZSAnVCc6IGVkaXRzLT50b19zbGFzaGVzID0gMTsgY29udGludWU7CisgICAgICAgICAgICBjYXNlICdXJzogZWRpdHMtPnRvX3dpbmRvd3MgPSAxOyBjb250aW51ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY29udGludWU7ICAvKiBTaG91bGQgY29tcGxhaW4sIGJ1dCBzbyB3aGF0Li4uICovCisgICAgICAgIH0KKworICAgIGZpbGV2YWw6CisgICAgICAgIC8qIEhhbmRsZSA6Q0hBUlMsIHdoZXJlIGVhY2ggY2hhciAod2l0aG91dCBhIGZvbGxvd2luZyA9KSBzZWxlY3RzIGEKKyAgICAgICAgICogcGFydGljdWxhciBmaWxlIHBhdGggZWxlbWVudC4gT24gdGhlIGZpcnN0IHN1Y2ggY2hhciwgd2UgZGVzZWxlY3QgYWxsCisgICAgICAgICAqIG90aGVycyAoYnkgc2V0dGluZyBwdHIgPSAiIiwgbGVuID0gMCkgYW5kIGZvciBlYWNoIGNoYXIgd2Ugc2VsZWN0CisgICAgICAgICAqIHRoYXQgZWxlbWVudCAoYnkgc2V0dGluZyBwdHIgPSAwKS4KKyAgICAgICAgICovCisgICAgICAgIGVkaXRzLT5maWxlbW9kcyA9IDE7CisKKyAgICAgICAgaWYgKCAqbW9kcyAhPSAnPScgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICFoYXZlemVyb2VkKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgNjsgKytpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVkaXRzLT5mLnBhcnRbIGkgXS5sZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBlZGl0cy0+Zi5wYXJ0WyBpIF0ucHRyID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcC0+cHRyID0gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICBzdHJ2YWw6CisgICAgICAgIC8qIEhhbmRsZSA6WD12YWx1ZSwgb3IgOlggKi8KKyAgICAgICAgaWYgKCAqbW9kcyAhPSAnPScgKQorICAgICAgICB7CisgICAgICAgICAgICBmcC0+cHRyID0gIiI7CisgICAgICAgICAgICBmcC0+bGVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwLT5wdHIgPSArK21vZHM7CisgICAgICAgICAgICBmcC0+bGVuID0gc3RybGVuKCBtb2RzICk7CisgICAgICAgICAgICBtb2RzICs9IGZwLT5sZW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaGF2ZXplcm9lZDsKK30KKworCisvKgorICogdmFyX2VkaXRfZmlsZSgpIC0gY29weSBpbnB1dCB0YXJnZXQgbmFtZSB0byBvdXRwdXQsIG1vZGlmeWluZyBmaWxlbmFtZS4KKyAqLworCitzdGF0aWMgdm9pZCB2YXJfZWRpdF9maWxlKCBjaGFyIGNvbnN0ICogaW4sIHN0cmluZyAqIG91dCwgVkFSX0VESVRTICogZWRpdHMgKQoreworICAgIGlmICggZWRpdHMtPmZpbGVtb2RzICkKKyAgICB7CisgICAgICAgIFBBVEhOQU1FIHBhdGhuYW1lOworCisgICAgICAgIC8qIFBhcnNlIGFwYXJ0IG9yaWdpbmFsIGZpbGVuYW1lLCBwdXR0aW5nIHBhcnRzIGludG8gInBhdGhuYW1lIi4gKi8KKyAgICAgICAgcGF0aF9wYXJzZSggaW4sICZwYXRobmFtZSApOworCisgICAgICAgIC8qIFJlcGxhY2UgYW55IHBhdGhuYW1lIHdpdGggZWRpdHMtPmYgKi8KKyAgICAgICAgaWYgKCBlZGl0cy0+Zi5mX2dyaXN0IC5wdHIgKSBwYXRobmFtZS5mX2dyaXN0ICA9IGVkaXRzLT5mLmZfZ3Jpc3Q7CisgICAgICAgIGlmICggZWRpdHMtPmYuZl9yb290ICAucHRyICkgcGF0aG5hbWUuZl9yb290ICAgPSBlZGl0cy0+Zi5mX3Jvb3Q7CisgICAgICAgIGlmICggZWRpdHMtPmYuZl9kaXIgICAucHRyICkgcGF0aG5hbWUuZl9kaXIgICAgPSBlZGl0cy0+Zi5mX2RpcjsKKyAgICAgICAgaWYgKCBlZGl0cy0+Zi5mX2Jhc2UgIC5wdHIgKSBwYXRobmFtZS5mX2Jhc2UgICA9IGVkaXRzLT5mLmZfYmFzZTsKKyAgICAgICAgaWYgKCBlZGl0cy0+Zi5mX3N1ZmZpeC5wdHIgKSBwYXRobmFtZS5mX3N1ZmZpeCA9IGVkaXRzLT5mLmZfc3VmZml4OworICAgICAgICBpZiAoIGVkaXRzLT5mLmZfbWVtYmVyLnB0ciApIHBhdGhuYW1lLmZfbWVtYmVyID0gZWRpdHMtPmYuZl9tZW1iZXI7CisKKyAgICAgICAgLyogSWYgcmVxdWVzdGVkLCBtb2RpZnkgcGF0aG5hbWUgdG8gcG9pbnQgdG8gcGFyZW50LiAqLworICAgICAgICBpZiAoIGVkaXRzLT5wYXJlbnQgKQorICAgICAgICAgICAgcGF0aF9wYXJlbnQoICZwYXRobmFtZSApOworCisgICAgICAgIC8qIFB1dCBmaWxlbmFtZSBiYWNrIHRvZ2V0aGVyLiAqLworICAgICAgICBwYXRoX2J1aWxkKCAmcGF0aG5hbWUsIG91dCApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHN0cmluZ19hcHBlbmQoIG91dCwgaW4gKTsKK30KKworLyoKKyAqIHZhcl9lZGl0X2N5ZzJ3aW4oKSAtIGNvbnZlcnNpb24gb2YgYSBjeWd3aW4gdG8gYSBXaW5kb3dzIHBhdGguCisgKgorICogRklYTUU6IHNraXAgZ3Jpc3QKKyAqLworCisjaWZkZWYgT1NfQ1lHV0lOCitzdGF0aWMgdm9pZCB2YXJfZWRpdF9jeWcyd2luKCBzdHJpbmcgKiBvdXQsIHNpemVfdCBwb3MsIFZBUl9FRElUUyAqIGVkaXRzICkKK3sKKyAgICBpZiAoIGVkaXRzLT50b193aW5kb3dzICkKKyAgICB7CisgICAgI2lmZGVmIENZR1dJTl9WRVJTSU9OX0NZR1dJTl9DT05WCisgICAgICAgIC8qIFVzZSBuZXcgQ3lnd2luIEFQSSBhZGRlZCB3aXRoIEN5Z3dpbiAxLjcuIE9sZCBvbmUgaGFkIG5vIGVycm9yCisgICAgICAgICAqIGhhbmRsaW5nIGFuZCBoYXMgYmVlbiBkZXByZWNhdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgY2hhciAqIGR5bmFtaWNCdWZmZXIgPSAwOworICAgICAgICBjaGFyIGJ1ZmZlclsgTUFYX1BBVEggKyAxMDAxIF07CisgICAgICAgIGNoYXIgY29uc3QgKiByZXN1bHQgPSBidWZmZXI7CisgICAgICAgIGN5Z3dpbl9jb252X3BhdGhfdCBjb25zdCBjb252X3R5cGUgPSBDQ1BfUE9TSVhfVE9fV0lOX0EgfCBDQ1BfUkVMQVRJVkU7CisgICAgICAgIHNzaXplX3QgY29uc3QgYXBpUmVzdWx0ID0gY3lnd2luX2NvbnZfcGF0aCggY29udl90eXBlLCBvdXQtPnZhbHVlICsgcG9zLAorICAgICAgICAgICAgYnVmZmVyLCBzaXplb2YoIGJ1ZmZlciApIC8gc2l6ZW9mKCAqYnVmZmVyICkgKTsKKyAgICAgICAgYXNzZXJ0KCBhcGlSZXN1bHQgPT0gMCB8fCBhcGlSZXN1bHQgPT0gLTEgKTsKKyAgICAgICAgYXNzZXJ0KCBhcGlSZXN1bHQgfHwgc3RybGVuKCByZXN1bHQgKSA8IHNpemVvZiggYnVmZmVyICkgLyBzaXplb2YoCisgICAgICAgICAgICAqYnVmZmVyICkgKTsKKyAgICAgICAgaWYgKCBhcGlSZXN1bHQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAgICAgaWYgKCBlcnJubyA9PSBFTk9TUEMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzaXplX3QgY29uc3Qgc2l6ZSA9IGN5Z3dpbl9jb252X3BhdGgoIGNvbnZfdHlwZSwgb3V0LT52YWx1ZSArCisgICAgICAgICAgICAgICAgICAgIHBvcywgTlVMTCwgMCApOworICAgICAgICAgICAgICAgIGFzc2VydCggc2l6ZSA+PSAtMSApOworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHluYW1pY0J1ZmZlciA9IChjaGFyICopQkpBTV9NQUxMT0NfQVRPTUlDKCBzaXplICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggZHluYW1pY0J1ZmZlciApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgY29uc3QgYXBpUmVzdWx0ID0gY3lnd2luX2NvbnZfcGF0aCggY29udl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+dmFsdWUgKyBwb3MsIGR5bmFtaWNCdWZmZXIsIHNpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCggYXBpUmVzdWx0ID09IDAgfHwgYXBpUmVzdWx0ID09IC0xICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICFhcGlSZXN1bHQgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGR5bmFtaWNCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCBzdHJsZW4oIHJlc3VsdCApIDwgc2l6ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgI2Vsc2UgIC8qIENZR1dJTl9WRVJTSU9OX0NZR1dJTl9DT05WICovCisgICAgICAgIC8qIFVzZSBvbGQgQ3lnd2luIEFQSSBkZXByZWNhdGVkIHdpdGggQ3lnd2luIDEuNy4gKi8KKyAgICAgICAgY2hhciByZXN1bHRbIE1BWF9QQVRIICsgMSBdOworICAgICAgICBjeWd3aW5fY29udl90b193aW4zMl9wYXRoKCBvdXQtPnZhbHVlICsgcG9zLCByZXN1bHQgKTsKKyAgICAgICAgYXNzZXJ0KCBzdHJsZW4oIHJlc3VsdCApIDw9IE1BWF9QQVRIICk7CisgICAgI2VuZGlmICAvKiBDWUdXSU5fVkVSU0lPTl9DWUdXSU5fQ09OViAqLworICAgICAgICBpZiAoIHJlc3VsdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZ190cnVuY2F0ZSggb3V0LCBwb3MgKTsKKyAgICAgICAgICAgIHN0cmluZ19hcHBlbmQoIG91dCwgcmVzdWx0ICk7CisgICAgICAgICAgICBlZGl0cy0+dG9fc2xhc2hlcyA9IDA7CisgICAgICAgIH0KKyAgICAjaWZkZWYgQ1lHV0lOX1ZFUlNJT05fQ1lHV0lOX0NPTlYKKyAgICAgICAgaWYgKCBkeW5hbWljQnVmZmVyICkKKyAgICAgICAgICAgIEJKQU1fRlJFRSggZHluYW1pY0J1ZmZlciApOworICAgICNlbmRpZgorICAgIH0KK30KKyNlbmRpZiAgLyogT1NfQ1lHV0lOICovCisKKworLyoKKyAqIHZhcl9lZGl0X3NoaWZ0KCkgLSBkbyB1cHNoaWZ0L2Rvd25zaGlmdCAmIG90aGVyIG1vZHMuCisgKi8KKworc3RhdGljIHZvaWQgdmFyX2VkaXRfc2hpZnQoIHN0cmluZyAqIG91dCwgc2l6ZV90IHBvcywgVkFSX0VESVRTICogZWRpdHMgKQoreworI2lmZGVmIE9TX0NZR1dJTgorICAgIHZhcl9lZGl0X2N5ZzJ3aW4oIG91dCwgcG9zLCBlZGl0cyApOworI2VuZGlmCisKKyAgICBpZiAoIGVkaXRzLT51cHNoaWZ0IHx8IGVkaXRzLT5kb3duc2hpZnQgfHwgZWRpdHMtPnRvX3NsYXNoZXMgKQorICAgIHsKKyAgICAgICAgLyogSGFuZGxlIHVwc2hpZnRpbmcsIGRvd25zaGlmdGluZyBhbmQgc2xhc2ggdHJhbnNsYXRpb24gbm93LiAqLworICAgICAgICBjaGFyICogcDsKKyAgICAgICAgZm9yICggcCA9IG91dC0+dmFsdWUgKyBwb3M7ICpwOyArK3AgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGVkaXRzLT51cHNoaWZ0ICkKKyAgICAgICAgICAgICAgICAqcCA9IHRvdXBwZXIoICpwICk7CisgICAgICAgICAgICBlbHNlIGlmICggZWRpdHMtPmRvd25zaGlmdCApCisgICAgICAgICAgICAgICAgKnAgPSB0b2xvd2VyKCAqcCApOworICAgICAgICAgICAgaWYgKCBlZGl0cy0+dG9fc2xhc2hlcyAmJiAoICpwID09ICdcXCcgKSApCisgICAgICAgICAgICAgICAgKnAgPSAnLyc7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoKKyAqIFJlYWRzIG4gTElTVHMgZnJvbSB0aGUgdG9wIG9mIHRoZSBTVEFDSyBhbmQgY29tYmluZXMgdGhlbSB0byBmb3JtIFZBUl9FRElUUy4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBWQVJfRURJVFMgcHVzaGVkIG9udG8gdGhlIFNUQUNLLgorICovCisKK3N0YXRpYyBpbnQgZXhwYW5kX21vZGlmaWVycyggU1RBQ0sgKiBzLCBpbnQgbiApCit7CisgICAgaW50IGk7CisgICAgaW50IHRvdGFsID0gMTsKKyAgICBMSVNUICogKiBhcmdzID0gc3RhY2tfZ2V0KCBzICk7CisgICAgZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQorICAgICAgICB0b3RhbCAqPSBsaXN0X2xlbmd0aCggYXJnc1sgaSBdICk7CisKKyAgICBpZiAoIHRvdGFsICE9IDAgKQorICAgIHsKKyAgICAgICAgVkFSX0VESVRTICogb3V0ID0gc3RhY2tfYWxsb2NhdGUoIHMsIHRvdGFsICogc2l6ZW9mKCBWQVJfRURJVFMgKSApOworICAgICAgICBMSVNUSVRFUiAqIGl0ZXIgPSBzdGFja19hbGxvY2F0ZSggcywgbiAqIHNpemVvZiggTElTVCAqICkgKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQorICAgICAgICAgICAgaXRlclsgaSBdID0gbGlzdF9iZWdpbiggYXJnc1sgaSBdICk7CisgICAgICAgIGkgPSAwOworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaGF2ZXplcm9lZDsKKyAgICAgICAgbG9vcDoKKyAgICAgICAgICAgIG1lbXNldCggb3V0LCAwLCBzaXplb2YoICpvdXQgKSApOworICAgICAgICAgICAgaGF2ZXplcm9lZCA9IDA7CisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG47ICsraSApCisgICAgICAgICAgICAgICAgaGF2ZXplcm9lZCA9IHZhcl9lZGl0X3BhcnNlKCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXJbIGkgXSApCisgICAgICAgICAgICAgICAgICAgICksIG91dCwgaGF2ZXplcm9lZCApOworICAgICAgICAgICAgKytvdXQ7CisgICAgICAgICAgICB3aGlsZSAoIC0taSA+PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGxpc3RfbmV4dCggaXRlclsgaSBdICkgIT0gbGlzdF9lbmQoIGFyZ3NbIGkgXSApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGl0ZXJbIGkgXSA9IGxpc3RfbmV4dCggaXRlclsgaSBdICk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXRlclsgaSBdID0gbGlzdF9iZWdpbiggYXJnc1sgaSBdICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhY2tfZGVhbGxvY2F0ZSggcywgbiAqIHNpemVvZiggTElTVCAqICkgKTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgTElTVCAqIGFwcGx5X21vZGlmaWVycyggU1RBQ0sgKiBzLCBpbnQgbiApCit7CisgICAgTElTVCAqIHZhbHVlID0gc3RhY2tfdG9wKCBzICk7CisgICAgTElTVCAqIHJlc3VsdCA9IEwwOworICAgIFZBUl9FRElUUyAqIGNvbnN0IGVkaXRzID0gKFZBUl9FRElUUyAqKSggKExJU1QgKiAqKXN0YWNrX2dldCggcyApICsgMSApOworICAgIHN0cmluZyBidWZbIDEgXTsKKyAgICBzdHJpbmdfbmV3KCBidWYgKTsKKyAgICByZXN1bHQgPSBhcHBseV9tb2RpZmllcnNfaW1wbCggcmVzdWx0LCBidWYsIGVkaXRzLCBuLCBsaXN0X2JlZ2luKCB2YWx1ZSApLAorICAgICAgICBsaXN0X2VuZCggdmFsdWUgKSApOworICAgIHN0cmluZ19mcmVlKCBidWYgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBQYXJzZSBhIHN0cmluZyBvZiB0aGUgZm9ybSAiMS0yIiwgIi0yLS0xIiwgIjItIiBhbmQgcmV0dXJuIHRoZSB0d28KKyAqIHN1YnNjcmlwdHMuCisgKi8KKworc3Vic2NyaXB0X3QgcGFyc2Vfc3Vic2NyaXB0KCBjaGFyIGNvbnN0ICogcyApCit7CisgICAgc3Vic2NyaXB0X3QgcmVzdWx0OworICAgIHJlc3VsdC5zdWIxID0gMDsKKyAgICByZXN1bHQuc3ViMiA9IDA7CisgICAgZG8gIC8qIHNvIHdlIGNhbiB1c2UgImJyZWFrIiAqLworICAgIHsKKyAgICAgICAgLyogQWxsb3cgbmVnYXRpdmUgc3Vic2NyaXB0cy4gKi8KKyAgICAgICAgaWYgKCAhaXNkaWdpdCggKnMgKSAmJiAoICpzICE9ICctJyApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0LnN1YjIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LnN1YjEgPSBhdG9pKCBzICk7CisKKyAgICAgICAgLyogU2tpcCBvdmVyIHRoZSBmaXJzdCBzeW1ib2wsIHdoaWNoIGlzIGVpdGhlciBhIGRpZ2l0IG9yIGRhc2guICovCisgICAgICAgICsrczsKKyAgICAgICAgd2hpbGUgKCBpc2RpZ2l0KCAqcyApICkgKytzOworCisgICAgICAgIGlmICggKnMgPT0gJ1wwJyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdC5zdWIyID0gcmVzdWx0LnN1YjE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKnMgIT0gJy0nICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0LnN1YjIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICArK3M7CisKKyAgICAgICAgaWYgKCAqcyA9PSAnXDAnICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0LnN1YjIgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAhaXNkaWdpdCggKnMgKSAmJiAoICpzICE9ICctJyApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0LnN1YjIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaXJzdCwgY29tcHV0ZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudC4gKi8KKyAgICAgICAgcmVzdWx0LnN1YjIgPSBhdG9pKCBzICk7CisgICAgICAgIHdoaWxlICggaXNkaWdpdCggKisrcyApICk7CisKKyAgICAgICAgaWYgKCAqcyAhPSAnXDAnICkKKyAgICAgICAgICAgIHJlc3VsdC5zdWIyID0gMDsKKworICAgIH0gd2hpbGUgKCAwICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIExJU1QgKiBhcHBseV9zdWJzY3JpcHQoIFNUQUNLICogcyApCit7CisgICAgTElTVCAqIHZhbHVlID0gc3RhY2tfdG9wKCBzICk7CisgICAgTElTVCAqIGluZGljZXMgPSBzdGFja19hdCggcywgMSApOworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBpbnQgbGVuZ3RoID0gbGlzdF9sZW5ndGgoIHZhbHVlICk7CisgICAgc3RyaW5nIGJ1ZlsgMSBdOworICAgIExJU1RJVEVSIGluZGljZXNfaXRlciA9IGxpc3RfYmVnaW4oIGluZGljZXMgKTsKKyAgICBMSVNUSVRFUiBjb25zdCBpbmRpY2VzX2VuZCA9IGxpc3RfZW5kKCBpbmRpY2VzICk7CisgICAgc3RyaW5nX25ldyggYnVmICk7CisgICAgZm9yICggOyBpbmRpY2VzX2l0ZXIgIT0gaW5kaWNlc19lbmQ7IGluZGljZXNfaXRlciA9IGxpc3RfbmV4dCggaW5kaWNlc19pdGVyCisgICAgICAgICkgKQorICAgIHsKKyAgICAgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIHZhbHVlICk7CisgICAgICAgIExJU1RJVEVSIGVuZCA9IGxpc3RfZW5kKCB2YWx1ZSApOworICAgICAgICBzdWJzY3JpcHRfdCBjb25zdCBzdWJzY3JpcHQgPSBwYXJzZV9zdWJzY3JpcHQoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSgKKyAgICAgICAgICAgIGluZGljZXNfaXRlciApICkgKTsKKyAgICAgICAgZ2V0X2l0ZXJzKCBzdWJzY3JpcHQsICZpdGVyLCAmZW5kLCBsZW5ndGggKTsKKyAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIG9iamVjdF9jb3B5KCBsaXN0X2l0ZW0oIGl0ZXIgKSApICk7CisgICAgfQorICAgIHN0cmluZ19mcmVlKCBidWYgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBSZWFkcyB0aGUgTElTVCBmcm9tIGZpcnN0IGFuZCBhcHBsaWVzIHN1YnNjcmlwdCB0byBpdC4gVGhlIHJlc3VsdHMgYXJlCisgKiB3cml0dGVuIHRvICpmaXJzdCBhbmQgKmxhc3QuCisgKi8KKworc3RhdGljIHZvaWQgZ2V0X2l0ZXJzKCBzdWJzY3JpcHRfdCBjb25zdCBzdWJzY3JpcHQsIExJU1RJVEVSICogY29uc3QgZmlyc3QsCisgICAgTElTVElURVIgKiBjb25zdCBsYXN0LCBpbnQgY29uc3QgbGVuZ3RoICkKK3sKKyAgICBpbnQgc3RhcnQ7CisgICAgaW50IHNpemU7CisgICAgTElTVElURVIgaXRlcjsKKyAgICBMSVNUSVRFUiBlbmQ7CisgICAgeworCisgICAgICAgIGlmICggc3Vic2NyaXB0LnN1YjEgPCAwICkKKyAgICAgICAgICAgIHN0YXJ0ID0gbGVuZ3RoICsgc3Vic2NyaXB0LnN1YjE7CisgICAgICAgIGVsc2UgaWYgKCBzdWJzY3JpcHQuc3ViMSA+IGxlbmd0aCApCisgICAgICAgICAgICBzdGFydCA9IGxlbmd0aDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhcnQgPSBzdWJzY3JpcHQuc3ViMSAtIDE7CisKKyAgICAgICAgc2l6ZSA9IHN1YnNjcmlwdC5zdWIyIDwgMAorICAgICAgICAgICAgPyBsZW5ndGggKyAxICsgc3Vic2NyaXB0LnN1YjIgLSBzdGFydAorICAgICAgICAgICAgOiBzdWJzY3JpcHQuc3ViMiAtIHN0YXJ0OworCisgICAgICAgIC8qCisgICAgICAgICAqIEhBQ0s6IFdoZW4gdGhlIGZpcnN0IHN1YnNjcmlwdCBpcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LCBpdAorICAgICAgICAgKiBtYWdpY2FsbHkgYmVjb21lcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LiBUaGlzIGlzIGluY29uc2lzdGVudCwKKyAgICAgICAgICogYnV0IG5lZWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAqLworICAgICAgICBpZiAoIHN0YXJ0IDwgMCApCisgICAgICAgICAgICBzdGFydCA9IDA7CisKKyAgICAgICAgLyogVGhlICJzdWIyIDwgMCIgdGVzdCBoYW5kbGVzIHRoZSBzZW1hbnRpYyBlcnJvciBvZiBzdWIyIDwgc3ViMS4gKi8KKyAgICAgICAgaWYgKCBzaXplIDwgMCApCisgICAgICAgICAgICBzaXplID0gMDsKKworICAgICAgICBpZiAoIHN0YXJ0ICsgc2l6ZSA+IGxlbmd0aCApCisgICAgICAgICAgICBzaXplID0gbGVuZ3RoIC0gc3RhcnQ7CisgICAgfQorCisgICAgaXRlciA9ICpmaXJzdDsKKyAgICB3aGlsZSAoIHN0YXJ0LS0gPiAwICkKKyAgICAgICAgaXRlciA9IGxpc3RfbmV4dCggaXRlciApOworCisgICAgZW5kID0gaXRlcjsKKyAgICB3aGlsZSAoIHNpemUtLSA+IDAgKQorICAgICAgICBlbmQgPSBsaXN0X25leHQoIGVuZCApOworCisgICAgKmZpcnN0ID0gaXRlcjsKKyAgICAqbGFzdCA9IGVuZDsKK30KKworc3RhdGljIExJU1QgKiBhcHBseV9tb2RpZmllcnNfZW1wdHkoIExJU1QgKiByZXN1bHQsIHN0cmluZyAqIGJ1ZiwKKyAgICBWQVJfRURJVFMgKiBlZGl0cywgaW50IG4gKQoreworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgbjsgKytpICkKKyAgICB7CisgICAgICAgIGlmICggZWRpdHNbIGkgXS5lbXB0eS5wdHIgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiogRklYTUU6IGlzIGVtcHR5LnB0ciBhbHdheXMgbnVsbC10ZXJtaW5hdGVkPyAqLworICAgICAgICAgICAgdmFyX2VkaXRfZmlsZSggZWRpdHNbIGkgXS5lbXB0eS5wdHIsIGJ1ZiwgZWRpdHMgKyBpICk7CisgICAgICAgICAgICB2YXJfZWRpdF9zaGlmdCggYnVmLCAwLCBlZGl0cyArIGkgKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIG9iamVjdF9uZXcoIGJ1Zi0+dmFsdWUgKSApOworICAgICAgICAgICAgc3RyaW5nX3RydW5jYXRlKCBidWYsIDAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgTElTVCAqIGFwcGx5X21vZGlmaWVyc19ub25fZW1wdHkoIExJU1QgKiByZXN1bHQsIHN0cmluZyAqIGJ1ZiwKKyAgICBWQVJfRURJVFMgKiBlZGl0cywgaW50IG4sIExJU1RJVEVSIGJlZ2luLCBMSVNUSVRFUiBlbmQgKQoreworICAgIGludCBpOworICAgIExJU1RJVEVSIGl0ZXI7CisgICAgZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQorICAgIHsKKyAgICAgICAgaWYgKCBlZGl0c1sgaSBdLmpvaW4ucHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyX2VkaXRfZmlsZSggb2JqZWN0X3N0ciggbGlzdF9pdGVtKCBiZWdpbiApICksIGJ1ZiwgZWRpdHMgKyBpICk7CisgICAgICAgICAgICB2YXJfZWRpdF9zaGlmdCggYnVmLCAwLCBlZGl0cyArIGkgKTsKKyAgICAgICAgICAgIGZvciAoIGl0ZXIgPSBsaXN0X25leHQoIGJlZ2luICk7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyCisgICAgICAgICAgICAgICAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggYnVmLCBlZGl0c1sgaSBdLmpvaW4ucHRyICk7CisgICAgICAgICAgICAgICAgc2l6ZSA9IGJ1Zi0+c2l6ZTsKKyAgICAgICAgICAgICAgICB2YXJfZWRpdF9maWxlKCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApLCBidWYsIGVkaXRzICsgaQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHZhcl9lZGl0X3NoaWZ0KCBidWYsIHNpemUsIGVkaXRzICsgaSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwgb2JqZWN0X25ldyggYnVmLT52YWx1ZSApICk7CisgICAgICAgICAgICBzdHJpbmdfdHJ1bmNhdGUoIGJ1ZiwgMCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaXRlciA9IGJlZ2luOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXJfZWRpdF9maWxlKCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApLCBidWYsIGVkaXRzICsgaSApOworICAgICAgICAgICAgICAgIHZhcl9lZGl0X3NoaWZ0KCBidWYsIDAsIGVkaXRzICsgaSApOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIG9iamVjdF9uZXcoIGJ1Zi0+dmFsdWUgKSApOworICAgICAgICAgICAgICAgIHN0cmluZ190cnVuY2F0ZSggYnVmLCAwICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIExJU1QgKiBhcHBseV9tb2RpZmllcnNfaW1wbCggTElTVCAqIHJlc3VsdCwgc3RyaW5nICogYnVmLAorICAgIFZBUl9FRElUUyAqIGVkaXRzLCBpbnQgbiwgTElTVElURVIgaXRlciwgTElTVElURVIgZW5kICkKK3sKKyAgICByZXR1cm4gaXRlciA9PSBlbmQKKyAgICAgICAgPyBhcHBseV9tb2RpZmllcnNfZW1wdHkoIHJlc3VsdCwgYnVmLCBlZGl0cywgbiApCisgICAgICAgIDogYXBwbHlfbW9kaWZpZXJzX25vbl9lbXB0eSggcmVzdWx0LCBidWYsIGVkaXRzLCBuLCBpdGVyLCBlbmQgKTsKK30KKworc3RhdGljIExJU1QgKiBhcHBseV9zdWJzY3JpcHRfYW5kX21vZGlmaWVycyggU1RBQ0sgKiBzLCBpbnQgbiApCit7CisgICAgTElTVCAqIGNvbnN0IHZhbHVlID0gc3RhY2tfdG9wKCBzICk7CisgICAgTElTVCAqIGNvbnN0IGluZGljZXMgPSBzdGFja19hdCggcywgMSApOworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBWQVJfRURJVFMgKiBjb25zdCBlZGl0cyA9IChWQVJfRURJVFMgKikoKExJU1QgKiAqKXN0YWNrX2dldCggcyApICsgMik7CisgICAgaW50IGNvbnN0IGxlbmd0aCA9IGxpc3RfbGVuZ3RoKCB2YWx1ZSApOworICAgIHN0cmluZyBidWZbIDEgXTsKKyAgICBMSVNUSVRFUiBpbmRpY2VzX2l0ZXIgPSBsaXN0X2JlZ2luKCBpbmRpY2VzICk7CisgICAgTElTVElURVIgY29uc3QgaW5kaWNlc19lbmQgPSBsaXN0X2VuZCggaW5kaWNlcyApOworICAgIHN0cmluZ19uZXcoIGJ1ZiApOworICAgIGZvciAoIDsgaW5kaWNlc19pdGVyICE9IGluZGljZXNfZW5kOyBpbmRpY2VzX2l0ZXIgPSBsaXN0X25leHQoIGluZGljZXNfaXRlcgorICAgICAgICApICkKKyAgICB7CisgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCB2YWx1ZSApOworICAgICAgICBMSVNUSVRFUiBlbmQgPSBsaXN0X2VuZCggdmFsdWUgKTsKKyAgICAgICAgc3Vic2NyaXB0X3QgY29uc3Qgc3ViID0gcGFyc2Vfc3Vic2NyaXB0KCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oCisgICAgICAgICAgICBpbmRpY2VzX2l0ZXIgKSApICk7CisgICAgICAgIGdldF9pdGVycyggc3ViLCAmaXRlciwgJmVuZCwgbGVuZ3RoICk7CisgICAgICAgIHJlc3VsdCA9IGFwcGx5X21vZGlmaWVyc19pbXBsKCByZXN1bHQsIGJ1ZiwgZWRpdHMsIG4sIGl0ZXIsIGVuZCApOworICAgIH0KKyAgICBzdHJpbmdfZnJlZSggYnVmICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogZXhwYW5kKCkgLSBleHBhbmRzIGEgbGlzdCBvZiBjb25jYXRlbmF0ZWQgc3RyaW5ncyBhbmQgdmFyaWFibGUgcmVmZXJlY2VzCisgKgorICogVGFrZXMgYSBsaXN0IG9mIGV4cGFuc2lvbiBpdGVtcyAtIGVhY2ggcmVwcmVzZW50aW5nIG9uZSBlbGVtZW50IHRvIGJlCisgKiBjb25jYXRlbmF0ZWQgYW5kIGVhY2ggY29udGFpbmluZyBhIGxpc3Qgb2YgaXRzIHZhbHVlcy4gUmV0dXJucyBhIGxpc3Qgb2YgYWxsCisgKiBwb3NzaWJsZSB2YWx1ZXMgY29uc3RydWN0ZWQgYnkgc2VsZWN0aW5nIGEgc2luZ2xlIHZhbHVlIGZyb20gZWFjaCBvZiB0aGUKKyAqIGVsZW1lbnRzIGFuZCBjb25jYXRlbmF0aW5nIHRoZW0gdG9nZXRoZXIuCisgKgorICogRm9yIGV4YW1wbGUsIGluIHRoZSBmb2xsb3dpbmcgY29kZToKKyAqCisgKiAgICAgbG9jYWwgYSA9IG9uZSB0d28gdGhyZWUgZm91ciA7CisgKiAgICAgbG9jYWwgYiA9IGZvbyBiYXIgOworICogICAgIEVDSE8gLyQoYSkvJChiKS8kKGEpLyA7CisgKgorICogICBXaGVuIGNvbnN0cnVjdGluZyB0aGUgcmVzdWx0IG9mIC8kKGEpLyQoYikvIHRoaXMgZnVuY3Rpb24gd291bGQgZ2V0IGNhbGxlZAorICogd2l0aCB0aGUgZm9sbG93aW5nIDcgZXhwYW5zaW9uIGl0ZW1zOgorICogICAgIDEuIC8KKyAqICAgICAyLiBvbmUgdHdvIHRocmVlIGZvdXIKKyAqICAgICAzLiAvCisgKiAgICAgNC4gZm9vIGJhcgorICogICAgIDUuIC8KKyAqICAgICA2LiBvbmUgdHdvIHRocmVlIGZvdXIKKyAqICAgICA3LiAvCisgKgorICogICBBbmQgd291bGQgcmVzdWx0IGluIGEgbGlzdCBjb250YWluaW5nIDMyIHZhbHVlczoKKyAqICAgICAxLiAvb25lL2Zvby9vbmUvCisgKiAgICAgMi4gL29uZS9mb28vdHdvLworICogICAgIDMuIC9vbmUvZm9vL3RocmVlLworICogICAgIDQuIC9vbmUvZm9vL2ZvdXIvCisgKiAgICAgNS4gL29uZS9iYXIvb25lLworICogICAgIC4uLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCBleHBhbnNpb25faXRlbQoreworICAgIC8qIEl0ZW0ncyB2YWx1ZSBsaXN0IGluaXRpYWxpemVkIHByaW9yIHRvIGNhbGxpbmcgZXhwYW5kKCkuICovCisgICAgTElTVCAqIHZhbHVlczsKKworICAgIC8qIEludGVybmFsIGRhdGEgaW5pdGlhbGl6ZWQgYW5kIHVzZWQgaW5zaWRlIGV4cGFuZCgpLiAqLworICAgIExJU1RJVEVSIGN1cnJlbnQ7ICAvKiBDdXJyZW50bHkgdXNlZCB2YWx1ZS4gKi8KKyAgICBpbnQgc2l6ZTsgICAgICAgICAgLyogQ29uY2F0ZW5hdGVkIHN0cmluZyBsZW5ndGggcHJpb3IgdG8gY29uY2F0ZW5hdGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICogaXRlbSdzIGN1cnJlbnQgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBleHBhbnNpb25faXRlbTsKKworc3RhdGljIExJU1QgKiBleHBhbmQoIGV4cGFuc2lvbl9pdGVtICogaXRlbXMsIGludCBjb25zdCBsZW5ndGggKQoreworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBzdHJpbmcgYnVmWyAxIF07CisgICAgaW50IHNpemUgPSAwOworICAgIGludCBpOworCisgICAgYXNzZXJ0KCBsZW5ndGggPiAwICk7CisgICAgZm9yICggaSA9IDA7IGkgPCBsZW5ndGg7ICsraSApCisgICAgeworICAgICAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggaXRlbXNbIGkgXS52YWx1ZXMgKTsKKyAgICAgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIGl0ZW1zWyBpIF0udmFsdWVzICk7CisKKyAgICAgICAgLyogSWYgYW55IG9mIHRoZSBpdGVtcyBoYXMgbm8gdmFsdWVzIC0gdGhlIHJlc3VsdCBpcyBhbiBlbXB0eSBsaXN0LiAqLworICAgICAgICBpZiAoIGl0ZXIgPT0gZW5kICkgcmV0dXJuIEwwOworCisgICAgICAgIC8qIFNldCBlYWNoIGl0ZW0ncyAnY3VycmVudCcgdG8gaXRzIGZpcnN0IGxpc3RlZCB2YWx1ZS4gVGhpcyBpbmRpY2F0ZXMKKyAgICAgICAgICogZWFjaCBpdGVtJ3MgbmV4dCB2YWx1ZSB0byBiZSB1c2VkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBsaXN0IG9mIGFsbAorICAgICAgICAgKiBwb3NzaWJsZSBjb25jYXRlbmF0ZWQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaXRlbXNbIGkgXS5jdXJyZW50ID0gaXRlcjsKKworICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIGxvbmdlc3QgY29uY2F0ZW5hdGVkIHN0cmluZyBsZW5ndGggLSB0byBrbm93IGhvdyBtdWNoCisgICAgICAgICAqIG1lbW9yeSB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFzIGEgYnVmZmVyIGZvciBob2xkaW5nIHRoZSBjb25jYXRlbmF0ZWQKKyAgICAgICAgICogc3RyaW5ncy4KKyAgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtYXggPSAwOworICAgICAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY29uc3QgbGVuID0gc3RybGVuKCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApICk7CisgICAgICAgICAgICAgICAgaWYgKCBsZW4gPiBtYXggKSBtYXggPSBsZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplICs9IG1heDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0cmluZ19uZXcoIGJ1ZiApOworICAgIHN0cmluZ19yZXNlcnZlKCBidWYsIHNpemUgKTsKKworICAgIGkgPSAwOworICAgIHdoaWxlICggaSA+PSAwICkKKyAgICB7CisgICAgICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgKytpICkKKyAgICAgICAgeworICAgICAgICAgICAgaXRlbXNbIGkgXS5zaXplID0gYnVmLT5zaXplOworICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggYnVmLCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZW1zWyBpIF0uY3VycmVudCApICkgKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBsaXN0X3B1c2hfYmFjayggcmVzdWx0LCBvYmplY3RfbmV3KCBidWYtPnZhbHVlICkgKTsKKyAgICAgICAgd2hpbGUgKCAtLWkgPj0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggbGlzdF9uZXh0KCBpdGVtc1sgaSBdLmN1cnJlbnQgKSAhPSBsaXN0X2VuZCggaXRlbXNbIGkgXS52YWx1ZXMKKyAgICAgICAgICAgICAgICApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpdGVtc1sgaSBdLmN1cnJlbnQgPSBsaXN0X25leHQoIGl0ZW1zWyBpIF0uY3VycmVudCApOworICAgICAgICAgICAgICAgIHN0cmluZ190cnVuY2F0ZSggYnVmLCBpdGVtc1sgaSBdLnNpemUgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpdGVtc1sgaSBdLmN1cnJlbnQgPSBsaXN0X2JlZ2luKCBpdGVtc1sgaSBdLnZhbHVlcyApOworICAgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nX2ZyZWUoIGJ1ZiApOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvbWJpbmVfc3RyaW5ncyggU1RBQ0sgKiBzLCBpbnQgbiwgc3RyaW5nICogb3V0ICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG47ICsraSApCisgICAgeworICAgICAgICBMSVNUICogY29uc3QgdmFsdWVzID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCB2YWx1ZXMgKTsKKyAgICAgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIHZhbHVlcyApOworICAgICAgICBpZiAoIGl0ZXIgIT0gZW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggb3V0LCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApICk7CisgICAgICAgICAgICBmb3IgKCBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICk7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyCisgICAgICAgICAgICAgICAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3B1c2hfYmFjayggb3V0LCAnICcgKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdfYXBwZW5kKCBvdXQsIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RfZnJlZSggdmFsdWVzICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0cnVjdCBkeW5hbWljX2FycmF5Cit7CisgICAgaW50IHNpemU7CisgICAgaW50IGNhcGFjaXR5OworICAgIHZvaWQgKiBkYXRhOworfTsKKworc3RhdGljIHZvaWQgZHluYW1pY19hcnJheV9pbml0KCBzdHJ1Y3QgZHluYW1pY19hcnJheSAqIGFycmF5ICkKK3sKKyAgICBhcnJheS0+c2l6ZSA9IDA7CisgICAgYXJyYXktPmNhcGFjaXR5ID0gMDsKKyAgICBhcnJheS0+ZGF0YSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGR5bmFtaWNfYXJyYXlfZnJlZSggc3RydWN0IGR5bmFtaWNfYXJyYXkgKiBhcnJheSApCit7CisgICAgQkpBTV9GUkVFKCBhcnJheS0+ZGF0YSApOworfQorCitzdGF0aWMgdm9pZCBkeW5hbWljX2FycmF5X3B1c2hfaW1wbCggc3RydWN0IGR5bmFtaWNfYXJyYXkgKiBjb25zdCBhcnJheSwKKyAgICB2b2lkIGNvbnN0ICogY29uc3QgdmFsdWUsIGludCBjb25zdCB1bml0X3NpemUgKQoreworICAgIGlmICggYXJyYXktPmNhcGFjaXR5ID09IDAgKQorICAgIHsKKyAgICAgICAgYXJyYXktPmNhcGFjaXR5ID0gMjsKKyAgICAgICAgYXJyYXktPmRhdGEgPSBCSkFNX01BTExPQyggYXJyYXktPmNhcGFjaXR5ICogdW5pdF9zaXplICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBhcnJheS0+Y2FwYWNpdHkgPT0gYXJyYXktPnNpemUgKQorICAgIHsKKyAgICAgICAgdm9pZCAqIG5ld19kYXRhOworICAgICAgICBhcnJheS0+Y2FwYWNpdHkgKj0gMjsKKyAgICAgICAgbmV3X2RhdGEgPSBCSkFNX01BTExPQyggYXJyYXktPmNhcGFjaXR5ICogdW5pdF9zaXplICk7CisgICAgICAgIG1lbWNweSggbmV3X2RhdGEsIGFycmF5LT5kYXRhLCBhcnJheS0+c2l6ZSAqIHVuaXRfc2l6ZSAgKTsKKyAgICAgICAgQkpBTV9GUkVFKCBhcnJheS0+ZGF0YSApOworICAgICAgICBhcnJheS0+ZGF0YSA9IG5ld19kYXRhOworICAgIH0KKyAgICBtZW1jcHkoIChjaGFyICopYXJyYXktPmRhdGEgKyBhcnJheS0+c2l6ZSAqIHVuaXRfc2l6ZSwgdmFsdWUsIHVuaXRfc2l6ZSApOworICAgICsrYXJyYXktPnNpemU7Cit9CisKKyNkZWZpbmUgZHluYW1pY19hcnJheV9wdXNoKCBhcnJheSwgdmFsdWUgKSAoZHluYW1pY19hcnJheV9wdXNoX2ltcGwoYXJyYXksICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisjZGVmaW5lIGR5bmFtaWNfYXJyYXlfYXQoIHR5cGUsIGFycmF5LCBpZHggKSAoKCh0eXBlICopKGFycmF5KS0+ZGF0YSlbaWR4XSkKKworCisvKgorICogc3RydWN0IGNvbXBpbGVyCisgKi8KKworc3RydWN0IGxhYmVsX2luZm8KK3sKKyAgICBpbnQgYWJzb2x1dGVfcG9zaXRpb247CisgICAgc3RydWN0IGR5bmFtaWNfYXJyYXkgdXNlc1sgMSBdOworfTsKKworc3RydWN0IHN0b3JlZF9ydWxlCit7CisgICAgT0JKRUNUICogbmFtZTsKKyAgICBQQVJTRSAqIHBhcnNlOworICAgIGludCBudW1fYXJndW1lbnRzOworICAgIHN0cnVjdCBhcmdfbGlzdCAqIGFyZ3VtZW50czsKKyAgICBpbnQgbG9jYWw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBjb21waWxlcgoreworICAgIHN0cnVjdCBkeW5hbWljX2FycmF5IGNvZGVbIDEgXTsKKyAgICBzdHJ1Y3QgZHluYW1pY19hcnJheSBjb25zdGFudHNbIDEgXTsKKyAgICBzdHJ1Y3QgZHluYW1pY19hcnJheSBsYWJlbHNbIDEgXTsKKyAgICBzdHJ1Y3QgZHluYW1pY19hcnJheSBydWxlc1sgMSBdOworICAgIHN0cnVjdCBkeW5hbWljX2FycmF5IGFjdGlvbnNbIDEgXTsKK30gY29tcGlsZXI7CisKK3N0YXRpYyB2b2lkIGNvbXBpbGVyX2luaXQoIGNvbXBpbGVyICogYyApCit7CisgICAgZHluYW1pY19hcnJheV9pbml0KCBjLT5jb2RlICk7CisgICAgZHluYW1pY19hcnJheV9pbml0KCBjLT5jb25zdGFudHMgKTsKKyAgICBkeW5hbWljX2FycmF5X2luaXQoIGMtPmxhYmVscyApOworICAgIGR5bmFtaWNfYXJyYXlfaW5pdCggYy0+cnVsZXMgKTsKKyAgICBkeW5hbWljX2FycmF5X2luaXQoIGMtPmFjdGlvbnMgKTsKK30KKworc3RhdGljIHZvaWQgY29tcGlsZXJfZnJlZSggY29tcGlsZXIgKiBjICkKK3sKKyAgICBpbnQgaTsKKyAgICBkeW5hbWljX2FycmF5X2ZyZWUoIGMtPmFjdGlvbnMgKTsKKyAgICBkeW5hbWljX2FycmF5X2ZyZWUoIGMtPnJ1bGVzICk7CisgICAgZm9yICggaSA9IDA7IGkgPCBjLT5sYWJlbHMtPnNpemU7ICsraSApCisgICAgICAgIGR5bmFtaWNfYXJyYXlfZnJlZSggZHluYW1pY19hcnJheV9hdCggc3RydWN0IGxhYmVsX2luZm8sIGMtPmxhYmVscywgaQorICAgICAgICAgICAgKS51c2VzICk7CisgICAgZHluYW1pY19hcnJheV9mcmVlKCBjLT5sYWJlbHMgKTsKKyAgICBkeW5hbWljX2FycmF5X2ZyZWUoIGMtPmNvbnN0YW50cyApOworICAgIGR5bmFtaWNfYXJyYXlfZnJlZSggYy0+Y29kZSApOworfQorCitzdGF0aWMgdm9pZCBjb21waWxlX2VtaXRfaW5zdHJ1Y3Rpb24oIGNvbXBpbGVyICogYywgaW5zdHJ1Y3Rpb24gaW5zdHIgKQoreworICAgIGR5bmFtaWNfYXJyYXlfcHVzaCggYy0+Y29kZSwgaW5zdHIgKTsKK30KKworc3RhdGljIGludCBjb21waWxlX25ld19sYWJlbCggY29tcGlsZXIgKiBjICkKK3sKKyAgICBpbnQgcmVzdWx0ID0gYy0+bGFiZWxzLT5zaXplOworICAgIHN0cnVjdCBsYWJlbF9pbmZvIGluZm87CisgICAgaW5mby5hYnNvbHV0ZV9wb3NpdGlvbiA9IC0xOworICAgIGR5bmFtaWNfYXJyYXlfaW5pdCggaW5mby51c2VzICk7CisgICAgZHluYW1pY19hcnJheV9wdXNoKCBjLT5sYWJlbHMsIGluZm8gKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBjb21waWxlX3NldF9sYWJlbCggY29tcGlsZXIgKiBjLCBpbnQgbGFiZWwgKQoreworICAgIHN0cnVjdCBsYWJlbF9pbmZvICogY29uc3QgbCA9ICZkeW5hbWljX2FycmF5X2F0KCBzdHJ1Y3QgbGFiZWxfaW5mbywKKyAgICAgICAgYy0+bGFiZWxzLCBsYWJlbCApOworICAgIGludCBjb25zdCBwb3MgPSBjLT5jb2RlLT5zaXplOworICAgIGludCBpOworICAgIGFzc2VydCggbC0+YWJzb2x1dGVfcG9zaXRpb24gPT0gLTEgKTsKKyAgICBsLT5hYnNvbHV0ZV9wb3NpdGlvbiA9IHBvczsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGwtPnVzZXMtPnNpemU7ICsraSApCisgICAgeworICAgICAgICBpbnQgaWQgPSBkeW5hbWljX2FycmF5X2F0KCBpbnQsIGwtPnVzZXMsIGkgKTsKKyAgICAgICAgaW50IG9mZnNldCA9IChpbnQpKCBwb3MgLSBpZCAtIDEgKTsKKyAgICAgICAgZHluYW1pY19hcnJheV9hdCggaW5zdHJ1Y3Rpb24sIGMtPmNvZGUsIGlkICkuYXJnID0gb2Zmc2V0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29tcGlsZV9lbWl0KCBjb21waWxlciAqIGMsIHVuc2lnbmVkIGludCBvcF9jb2RlLCBpbnQgYXJnICkKK3sKKyAgICBpbnN0cnVjdGlvbiBpbnN0cjsKKyAgICBpbnN0ci5vcF9jb2RlID0gb3BfY29kZTsKKyAgICBpbnN0ci5hcmcgPSBhcmc7CisgICAgY29tcGlsZV9lbWl0X2luc3RydWN0aW9uKCBjLCBpbnN0ciApOworfQorCitzdGF0aWMgdm9pZCBjb21waWxlX2VtaXRfYnJhbmNoKCBjb21waWxlciAqIGMsIHVuc2lnbmVkIGludCBvcF9jb2RlLCBpbnQgbGFiZWwgKQoreworICAgIHN0cnVjdCBsYWJlbF9pbmZvICogY29uc3QgbCA9ICZkeW5hbWljX2FycmF5X2F0KCBzdHJ1Y3QgbGFiZWxfaW5mbywKKyAgICAgICAgYy0+bGFiZWxzLCBsYWJlbCApOworICAgIGludCBjb25zdCBwb3MgPSBjLT5jb2RlLT5zaXplOworICAgIGluc3RydWN0aW9uIGluc3RyOworICAgIGluc3RyLm9wX2NvZGUgPSBvcF9jb2RlOworICAgIGlmICggbC0+YWJzb2x1dGVfcG9zaXRpb24gPT0gLTEgKQorICAgIHsKKyAgICAgICAgaW5zdHIuYXJnID0gMDsKKyAgICAgICAgZHluYW1pY19hcnJheV9wdXNoKCBsLT51c2VzLCBwb3MgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBpbnN0ci5hcmcgPSAoaW50KSggbC0+YWJzb2x1dGVfcG9zaXRpb24gLSBwb3MgLSAxICk7CisgICAgY29tcGlsZV9lbWl0X2luc3RydWN0aW9uKCBjLCBpbnN0ciApOworfQorCitzdGF0aWMgaW50IGNvbXBpbGVfZW1pdF9jb25zdGFudCggY29tcGlsZXIgKiBjLCBPQkpFQ1QgKiB2YWx1ZSApCit7CisgICAgT0JKRUNUICogY29weSA9IG9iamVjdF9jb3B5KCB2YWx1ZSApOworICAgIGR5bmFtaWNfYXJyYXlfcHVzaCggYy0+Y29uc3RhbnRzLCBjb3B5ICk7CisgICAgcmV0dXJuIGMtPmNvbnN0YW50cy0+c2l6ZSAtIDE7Cit9CisKK3N0YXRpYyBpbnQgY29tcGlsZV9lbWl0X3J1bGUoIGNvbXBpbGVyICogYywgT0JKRUNUICogbmFtZSwgUEFSU0UgKiBwYXJzZSwKKyAgICBpbnQgbnVtX2FyZ3VtZW50cywgc3RydWN0IGFyZ19saXN0ICogYXJndW1lbnRzLCBpbnQgbG9jYWwgKQoreworICAgIHN0cnVjdCBzdG9yZWRfcnVsZSBydWxlOworICAgIHJ1bGUubmFtZSA9IG9iamVjdF9jb3B5KCBuYW1lICk7CisgICAgcnVsZS5wYXJzZSA9IHBhcnNlOworICAgIHJ1bGUubnVtX2FyZ3VtZW50cyA9IG51bV9hcmd1bWVudHM7CisgICAgcnVsZS5hcmd1bWVudHMgPSBhcmd1bWVudHM7CisgICAgcnVsZS5sb2NhbCA9IGxvY2FsOworICAgIGR5bmFtaWNfYXJyYXlfcHVzaCggYy0+cnVsZXMsIHJ1bGUgKTsKKyAgICByZXR1cm4gKGludCkoIGMtPnJ1bGVzLT5zaXplIC0gMSApOworfQorCitzdGF0aWMgaW50IGNvbXBpbGVfZW1pdF9hY3Rpb25zKCBjb21waWxlciAqIGMsIFBBUlNFICogcGFyc2UgKQoreworICAgIFNVQkFDVElPTiBhOworICAgIGEubmFtZSA9IG9iamVjdF9jb3B5KCBwYXJzZS0+c3RyaW5nICk7CisgICAgYS5jb21tYW5kID0gZnVuY3Rpb25fY29tcGlsZV9hY3Rpb25zKCBvYmplY3Rfc3RyKCBwYXJzZS0+c3RyaW5nMSApLAorICAgICAgICBwYXJzZS0+ZmlsZSwgcGFyc2UtPmxpbmUgKTsKKyAgICBhLmZsYWdzID0gcGFyc2UtPm51bTsKKyAgICBkeW5hbWljX2FycmF5X3B1c2goIGMtPmFjdGlvbnMsIGEgKTsKKyAgICByZXR1cm4gKGludCkoIGMtPmFjdGlvbnMtPnNpemUgLSAxICk7Cit9CisKK3N0YXRpYyBKQU1fRlVOQ1RJT04gKiBjb21waWxlX3RvX2Z1bmN0aW9uKCBjb21waWxlciAqIGMgKQoreworICAgIEpBTV9GVU5DVElPTiAqIGNvbnN0IHJlc3VsdCA9IEJKQU1fTUFMTE9DKCBzaXplb2YoIEpBTV9GVU5DVElPTiApICk7CisgICAgaW50IGk7CisgICAgcmVzdWx0LT5iYXNlLnR5cGUgPSBGVU5DVElPTl9KQU07CisgICAgcmVzdWx0LT5iYXNlLnJlZmVyZW5jZV9jb3VudCA9IDE7CisgICAgcmVzdWx0LT5iYXNlLmZvcm1hbF9hcmd1bWVudHMgPSAwOworICAgIHJlc3VsdC0+YmFzZS5udW1fZm9ybWFsX2FyZ3VtZW50cyA9IDA7CisKKyAgICByZXN1bHQtPmJhc2UucnVsZW5hbWUgPSAwOworCisgICAgcmVzdWx0LT5jb2RlX3NpemUgPSBjLT5jb2RlLT5zaXplOworICAgIHJlc3VsdC0+Y29kZSA9IEJKQU1fTUFMTE9DKCBjLT5jb2RlLT5zaXplICogc2l6ZW9mKCBpbnN0cnVjdGlvbiApICk7CisgICAgbWVtY3B5KCByZXN1bHQtPmNvZGUsIGMtPmNvZGUtPmRhdGEsIGMtPmNvZGUtPnNpemUgKiBzaXplb2YoIGluc3RydWN0aW9uICkgKTsKKworICAgIHJlc3VsdC0+Y29uc3RhbnRzID0gQkpBTV9NQUxMT0MoIGMtPmNvbnN0YW50cy0+c2l6ZSAqIHNpemVvZiggT0JKRUNUICogKSApOworICAgIG1lbWNweSggcmVzdWx0LT5jb25zdGFudHMsIGMtPmNvbnN0YW50cy0+ZGF0YSwgYy0+Y29uc3RhbnRzLT5zaXplICogc2l6ZW9mKAorICAgICAgICBPQkpFQ1QgKiApICk7CisgICAgcmVzdWx0LT5udW1fY29uc3RhbnRzID0gYy0+Y29uc3RhbnRzLT5zaXplOworCisgICAgcmVzdWx0LT5udW1fc3ViZnVuY3Rpb25zID0gYy0+cnVsZXMtPnNpemU7CisgICAgcmVzdWx0LT5mdW5jdGlvbnMgPSBCSkFNX01BTExPQyggYy0+cnVsZXMtPnNpemUgKiBzaXplb2YoIFNVQkZVTkNUSU9OICkgKTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGMtPnJ1bGVzLT5zaXplOyArK2kgKQorICAgIHsKKyAgICAgICAgc3RydWN0IHN0b3JlZF9ydWxlICogY29uc3QgcnVsZSA9ICZkeW5hbWljX2FycmF5X2F0KCBzdHJ1Y3Qgc3RvcmVkX3J1bGUsCisgICAgICAgICAgICBjLT5ydWxlcywgaSApOworICAgICAgICByZXN1bHQtPmZ1bmN0aW9uc1sgaSBdLm5hbWUgPSBydWxlLT5uYW1lOworICAgICAgICByZXN1bHQtPmZ1bmN0aW9uc1sgaSBdLmNvZGUgPSBmdW5jdGlvbl9jb21waWxlKCBydWxlLT5wYXJzZSApOworICAgICAgICByZXN1bHQtPmZ1bmN0aW9uc1sgaSBdLmNvZGUtPm51bV9mb3JtYWxfYXJndW1lbnRzID0gcnVsZS0+bnVtX2FyZ3VtZW50czsKKyAgICAgICAgcmVzdWx0LT5mdW5jdGlvbnNbIGkgXS5jb2RlLT5mb3JtYWxfYXJndW1lbnRzID0gcnVsZS0+YXJndW1lbnRzOworICAgICAgICByZXN1bHQtPmZ1bmN0aW9uc1sgaSBdLmxvY2FsID0gcnVsZS0+bG9jYWw7CisgICAgfQorCisgICAgcmVzdWx0LT5hY3Rpb25zID0gQkpBTV9NQUxMT0MoIGMtPmFjdGlvbnMtPnNpemUgKiBzaXplb2YoIFNVQkFDVElPTiApICk7CisgICAgbWVtY3B5KCByZXN1bHQtPmFjdGlvbnMsIGMtPmFjdGlvbnMtPmRhdGEsIGMtPmFjdGlvbnMtPnNpemUgKiBzaXplb2YoCisgICAgICAgIFNVQkFDVElPTiApICk7CisgICAgcmVzdWx0LT5udW1fc3ViYWN0aW9ucyA9IGMtPmFjdGlvbnMtPnNpemU7CisKKyAgICByZXN1bHQtPmdlbmVyaWMgPSAwOworCisgICAgcmVzdWx0LT5maWxlID0gMDsKKyAgICByZXN1bHQtPmxpbmUgPSAtMTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFBhcnNpbmcgb2YgdmFyaWFibGUgZXhwYW5zaW9ucworICovCisKK3R5cGVkZWYgc3RydWN0IFZBUl9QQVJTRV9HUk9VUAoreworICAgIHN0cnVjdCBkeW5hbWljX2FycmF5IGVsZW1zWyAxIF07Cit9IFZBUl9QQVJTRV9HUk9VUDsKKwordHlwZWRlZiBzdHJ1Y3QgVkFSX1BBUlNFX0FDVElPTlMKK3sKKyAgICBzdHJ1Y3QgZHluYW1pY19hcnJheSBlbGVtc1sgMSBdOworfSBWQVJfUEFSU0VfQUNUSU9OUzsKKworI2RlZmluZSBWQVJfUEFSU0VfVFlQRV9WQVIgICAgICAwCisjZGVmaW5lIFZBUl9QQVJTRV9UWVBFX1NUUklORyAgIDEKKyNkZWZpbmUgVkFSX1BBUlNFX1RZUEVfRklMRSAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBfdmFyX3BhcnNlCit7CisgICAgaW50IHR5cGU7ICAvKiBzdHJpbmcsIHZhcmlhYmxlIG9yIGZpbGUgKi8KK30gVkFSX1BBUlNFOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFZBUl9QQVJTRSBiYXNlOworICAgIFZBUl9QQVJTRV9HUk9VUCAqIG5hbWU7CisgICAgVkFSX1BBUlNFX0dST1VQICogc3Vic2NyaXB0OworICAgIHN0cnVjdCBkeW5hbWljX2FycmF5IG1vZGlmaWVyc1sgMSBdOworfSBWQVJfUEFSU0VfVkFSOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFZBUl9QQVJTRSBiYXNlOworICAgIE9CSkVDVCAqIHM7Cit9IFZBUl9QQVJTRV9TVFJJTkc7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVkFSX1BBUlNFIGJhc2U7CisgICAgc3RydWN0IGR5bmFtaWNfYXJyYXkgZmlsZW5hbWVbIDEgXTsKKyAgICBzdHJ1Y3QgZHluYW1pY19hcnJheSBjb250ZW50c1sgMSBdOworfSBWQVJfUEFSU0VfRklMRTsKKworc3RhdGljIHZvaWQgdmFyX3BhcnNlX2ZyZWUoIFZBUl9QQVJTRSAqICk7CisKKworLyoKKyAqIFZBUl9QQVJTRV9HUk9VUAorICovCisKK3N0YXRpYyBWQVJfUEFSU0VfR1JPVVAgKiB2YXJfcGFyc2VfZ3JvdXBfbmV3KCkKK3sKKyAgICBWQVJfUEFSU0VfR1JPVVAgKiBjb25zdCByZXN1bHQgPSBCSkFNX01BTExPQyggc2l6ZW9mKCBWQVJfUEFSU0VfR1JPVVAgKSApOworICAgIGR5bmFtaWNfYXJyYXlfaW5pdCggcmVzdWx0LT5lbGVtcyApOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHZhcl9wYXJzZV9ncm91cF9mcmVlKCBWQVJfUEFSU0VfR1JPVVAgKiBncm91cCApCit7CisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBncm91cC0+ZWxlbXMtPnNpemU7ICsraSApCisgICAgICAgIHZhcl9wYXJzZV9mcmVlKCBkeW5hbWljX2FycmF5X2F0KCBWQVJfUEFSU0UgKiwgZ3JvdXAtPmVsZW1zLCBpICkgKTsKKyAgICBkeW5hbWljX2FycmF5X2ZyZWUoIGdyb3VwLT5lbGVtcyApOworICAgIEJKQU1fRlJFRSggZ3JvdXAgKTsKK30KKworc3RhdGljIHZvaWQgdmFyX3BhcnNlX2dyb3VwX2FkZCggVkFSX1BBUlNFX0dST1VQICogZ3JvdXAsIFZBUl9QQVJTRSAqIGVsZW0gKQoreworICAgIGR5bmFtaWNfYXJyYXlfcHVzaCggZ3JvdXAtPmVsZW1zLCBlbGVtICk7Cit9CisKK3N0YXRpYyB2b2lkIHZhcl9wYXJzZV9ncm91cF9tYXliZV9hZGRfY29uc3RhbnQoIFZBUl9QQVJTRV9HUk9VUCAqIGdyb3VwLAorICAgIGNoYXIgY29uc3QgKiBzdGFydCwgY2hhciBjb25zdCAqIGVuZCApCit7CisgICAgaWYgKCBzdGFydCAhPSBlbmQgKQorICAgIHsKKyAgICAgICAgc3RyaW5nIGJ1ZlsgMSBdOworICAgICAgICBWQVJfUEFSU0VfU1RSSU5HICogY29uc3QgdmFsdWUgPSAoVkFSX1BBUlNFX1NUUklORyAqKUJKQU1fTUFMTE9DKAorICAgICAgICAgICAgc2l6ZW9mKFZBUl9QQVJTRV9TVFJJTkcpICk7CisgICAgICAgIHZhbHVlLT5iYXNlLnR5cGUgPSBWQVJfUEFSU0VfVFlQRV9TVFJJTkc7CisgICAgICAgIHN0cmluZ19uZXcoIGJ1ZiApOworICAgICAgICBzdHJpbmdfYXBwZW5kX3JhbmdlKCBidWYsIHN0YXJ0LCBlbmQgKTsKKyAgICAgICAgdmFsdWUtPnMgPSBvYmplY3RfbmV3KCBidWYtPnZhbHVlICk7CisgICAgICAgIHN0cmluZ19mcmVlKCBidWYgKTsKKyAgICAgICAgdmFyX3BhcnNlX2dyb3VwX2FkZCggZ3JvdXAsIChWQVJfUEFSU0UgKil2YWx1ZSApOworICAgIH0KK30KKworVkFSX1BBUlNFX1NUUklORyAqIHZhcl9wYXJzZV9ncm91cF9hc19saXRlcmFsKCBWQVJfUEFSU0VfR1JPVVAgKiBncm91cCApCit7CisgICAgaWYgKCBncm91cC0+ZWxlbXMtPnNpemUgPT0gMSAgKQorICAgIHsKKyAgICAgICAgVkFSX1BBUlNFICogcmVzdWx0ID0gZHluYW1pY19hcnJheV9hdCggVkFSX1BBUlNFICosIGdyb3VwLT5lbGVtcywgMCApOworICAgICAgICBpZiAoIHJlc3VsdC0+dHlwZSA9PSBWQVJfUEFSU0VfVFlQRV9TVFJJTkcgKQorICAgICAgICAgICAgcmV0dXJuIChWQVJfUEFSU0VfU1RSSU5HICopcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogVkFSX1BBUlNFX0FDVElPTlMKKyAqLworCitzdGF0aWMgVkFSX1BBUlNFX0FDVElPTlMgKiB2YXJfcGFyc2VfYWN0aW9uc19uZXcoKQoreworICAgIFZBUl9QQVJTRV9BQ1RJT05TICogY29uc3QgcmVzdWx0ID0gKFZBUl9QQVJTRV9BQ1RJT05TICopQkpBTV9NQUxMT0MoCisgICAgICAgIHNpemVvZihWQVJfUEFSU0VfQUNUSU9OUykgKTsKKyAgICBkeW5hbWljX2FycmF5X2luaXQoIHJlc3VsdC0+ZWxlbXMgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCB2YXJfcGFyc2VfYWN0aW9uc19mcmVlKCBWQVJfUEFSU0VfQUNUSU9OUyAqIGFjdGlvbnMgKQoreworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgYWN0aW9ucy0+ZWxlbXMtPnNpemU7ICsraSApCisgICAgICAgIHZhcl9wYXJzZV9ncm91cF9mcmVlKCBkeW5hbWljX2FycmF5X2F0KCBWQVJfUEFSU0VfR1JPVVAgKiwKKyAgICAgICAgICAgIGFjdGlvbnMtPmVsZW1zLCBpICkgKTsKKyAgICBkeW5hbWljX2FycmF5X2ZyZWUoIGFjdGlvbnMtPmVsZW1zICk7CisgICAgQkpBTV9GUkVFKCBhY3Rpb25zICk7Cit9CisKKworLyoKKyAqIFZBUl9QQVJTRV9WQVIKKyAqLworCitzdGF0aWMgVkFSX1BBUlNFX1ZBUiAqIHZhcl9wYXJzZV92YXJfbmV3KCkKK3sKKyAgICBWQVJfUEFSU0VfVkFSICogcmVzdWx0ID0gQkpBTV9NQUxMT0MoIHNpemVvZiggVkFSX1BBUlNFX1ZBUiApICk7CisgICAgcmVzdWx0LT5iYXNlLnR5cGUgPSBWQVJfUEFSU0VfVFlQRV9WQVI7CisgICAgcmVzdWx0LT5uYW1lID0gdmFyX3BhcnNlX2dyb3VwX25ldygpOworICAgIHJlc3VsdC0+c3Vic2NyaXB0ID0gMDsKKyAgICBkeW5hbWljX2FycmF5X2luaXQoIHJlc3VsdC0+bW9kaWZpZXJzICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgdmFyX3BhcnNlX3Zhcl9mcmVlKCBWQVJfUEFSU0VfVkFSICogdmFyICkKK3sKKyAgICBpbnQgaTsKKyAgICB2YXJfcGFyc2VfZ3JvdXBfZnJlZSggdmFyLT5uYW1lICk7CisgICAgaWYgKCB2YXItPnN1YnNjcmlwdCApCisgICAgICAgIHZhcl9wYXJzZV9ncm91cF9mcmVlKCB2YXItPnN1YnNjcmlwdCApOworICAgIGZvciAoIGkgPSAwOyBpIDwgdmFyLT5tb2RpZmllcnMtPnNpemU7ICsraSApCisgICAgICAgIHZhcl9wYXJzZV9ncm91cF9mcmVlKCBkeW5hbWljX2FycmF5X2F0KCBWQVJfUEFSU0VfR1JPVVAgKiwKKyAgICAgICAgICAgIHZhci0+bW9kaWZpZXJzLCBpICkgKTsKKyAgICBkeW5hbWljX2FycmF5X2ZyZWUoIHZhci0+bW9kaWZpZXJzICk7CisgICAgQkpBTV9GUkVFKCB2YXIgKTsKK30KKworc3RhdGljIFZBUl9QQVJTRV9HUk9VUCAqIHZhcl9wYXJzZV92YXJfbmV3X21vZGlmaWVyKCBWQVJfUEFSU0VfVkFSICogdmFyICkKK3sKKyAgICBWQVJfUEFSU0VfR1JPVVAgKiByZXN1bHQgPSB2YXJfcGFyc2VfZ3JvdXBfbmV3KCk7CisgICAgZHluYW1pY19hcnJheV9wdXNoKCB2YXItPm1vZGlmaWVycywgcmVzdWx0ICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogVkFSX1BBUlNFX1NUUklORworICovCisKK3N0YXRpYyB2b2lkIHZhcl9wYXJzZV9zdHJpbmdfZnJlZSggVkFSX1BBUlNFX1NUUklORyAqIHN0cmluZyApCit7CisgICAgb2JqZWN0X2ZyZWUoIHN0cmluZy0+cyApOworICAgIEJKQU1fRlJFRSggc3RyaW5nICk7Cit9CisKKworLyoKKyAqIFZBUl9QQVJTRV9GSUxFCisgKi8KKworc3RhdGljIFZBUl9QQVJTRV9GSUxFICogdmFyX3BhcnNlX2ZpbGVfbmV3KCB2b2lkICkKK3sKKyAgICBWQVJfUEFSU0VfRklMRSAqIGNvbnN0IHJlc3VsdCA9IChWQVJfUEFSU0VfRklMRSAqKUJKQU1fTUFMTE9DKCBzaXplb2YoCisgICAgICAgIFZBUl9QQVJTRV9GSUxFICkgKTsKKyAgICByZXN1bHQtPmJhc2UudHlwZSA9IFZBUl9QQVJTRV9UWVBFX0ZJTEU7CisgICAgZHluYW1pY19hcnJheV9pbml0KCByZXN1bHQtPmZpbGVuYW1lICk7CisgICAgZHluYW1pY19hcnJheV9pbml0KCByZXN1bHQtPmNvbnRlbnRzICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgdmFyX3BhcnNlX2ZpbGVfZnJlZSggVkFSX1BBUlNFX0ZJTEUgKiBmaWxlICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGZpbGUtPmZpbGVuYW1lLT5zaXplOyArK2kgKQorICAgICAgICB2YXJfcGFyc2VfZ3JvdXBfZnJlZSggZHluYW1pY19hcnJheV9hdCggVkFSX1BBUlNFX0dST1VQICosCisgICAgICAgICAgICBmaWxlLT5maWxlbmFtZSwgaSApICk7CisgICAgZHluYW1pY19hcnJheV9mcmVlKCBmaWxlLT5maWxlbmFtZSApOworICAgIGZvciAoIGkgPSAwOyBpIDwgZmlsZS0+Y29udGVudHMtPnNpemU7ICsraSApCisgICAgICAgIHZhcl9wYXJzZV9ncm91cF9mcmVlKCBkeW5hbWljX2FycmF5X2F0KCBWQVJfUEFSU0VfR1JPVVAgKiwKKyAgICAgICAgICAgIGZpbGUtPmNvbnRlbnRzLCBpICkgKTsKKyAgICBkeW5hbWljX2FycmF5X2ZyZWUoIGZpbGUtPmNvbnRlbnRzICk7CisgICAgQkpBTV9GUkVFKCBmaWxlICk7Cit9CisKKworLyoKKyAqIFZBUl9QQVJTRQorICovCisKK3N0YXRpYyB2b2lkIHZhcl9wYXJzZV9mcmVlKCBWQVJfUEFSU0UgKiBwYXJzZSApCit7CisgICAgc3dpdGNoICggcGFyc2UtPnR5cGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBWQVJfUEFSU0VfVFlQRV9WQVI6CisgICAgICAgICAgICB2YXJfcGFyc2VfdmFyX2ZyZWUoIChWQVJfUEFSU0VfVkFSICopcGFyc2UgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVkFSX1BBUlNFX1RZUEVfU1RSSU5HOgorICAgICAgICAgICAgdmFyX3BhcnNlX3N0cmluZ19mcmVlKCAoVkFSX1BBUlNFX1NUUklORyAqKXBhcnNlICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZBUl9QQVJTRV9UWVBFX0ZJTEU6CisgICAgICAgICAgICB2YXJfcGFyc2VfZmlsZV9mcmVlKCAoVkFSX1BBUlNFX0ZJTEUgKilwYXJzZSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCggISJJbnZhbGlkIHR5cGUiICk7CisgICAgfQorfQorCisKKy8qCisgKiBDb21waWxlIFZBUl9QQVJTRQorICovCisKK3N0YXRpYyB2b2lkIHZhcl9wYXJzZV9ncm91cF9jb21waWxlKCBWQVJfUEFSU0VfR1JPVVAgY29uc3QgKiBwYXJzZSwKKyAgICBjb21waWxlciAqIGMgKTsKKworc3RhdGljIHZvaWQgdmFyX3BhcnNlX3Zhcl9jb21waWxlKCBWQVJfUEFSU0VfVkFSIGNvbnN0ICogcGFyc2UsIGNvbXBpbGVyICogYyApCit7CisgICAgaW50IGV4cGFuZF9uYW1lID0gMDsKKyAgICBpbnQgaXNfZ2V0X2dyaXN0ID0gMDsKKyAgICBpbnQgaGFzX21vZGlmaWVycyA9IDA7CisgICAgLyogU3BlY2lhbCBjYXNlIGNvbW1vbiBtb2RpZmllcnMgKi8KKyAgICBpZiAoIHBhcnNlLT5tb2RpZmllcnMtPnNpemUgPT0gMSApCisgICAgeworICAgICAgICBWQVJfUEFSU0VfR1JPVVAgKiBtb2QgPSBkeW5hbWljX2FycmF5X2F0KCBWQVJfUEFSU0VfR1JPVVAgKiwgcGFyc2UtPm1vZGlmaWVycywgMCApOworICAgICAgICBpZiAoIG1vZC0+ZWxlbXMtPnNpemUgPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZBUl9QQVJTRSAqIG1vZDEgPSBkeW5hbWljX2FycmF5X2F0KCBWQVJfUEFSU0UgKiwgbW9kLT5lbGVtcywgMCApOworICAgICAgICAgICAgaWYgKCBtb2QxLT50eXBlID09IFZBUl9QQVJTRV9UWVBFX1NUUklORyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT0JKRUNUICogcyA9ICggKFZBUl9QQVJTRV9TVFJJTkcgKiltb2QxICktPnM7CisgICAgICAgICAgICAgICAgaWYgKCAhIHN0cmNtcCAoIG9iamVjdF9zdHIoIHMgKSwgIkciICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXNfZ2V0X2dyaXN0ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogSWYgdGhlcmUgYXJlIG1vZGlmaWVycywgZW1pdCB0aGVtIGluIHJldmVyc2Ugb3JkZXIuICovCisgICAgaWYgKCBwYXJzZS0+bW9kaWZpZXJzLT5zaXplID4gMCAmJiAhaXNfZ2V0X2dyaXN0ICkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBoYXNfbW9kaWZpZXJzID0gMTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwYXJzZS0+bW9kaWZpZXJzLT5zaXplOyArK2kgKQorICAgICAgICAgICAgdmFyX3BhcnNlX2dyb3VwX2NvbXBpbGUoIGR5bmFtaWNfYXJyYXlfYXQoIFZBUl9QQVJTRV9HUk9VUCAqLAorICAgICAgICAgICAgICAgIHBhcnNlLT5tb2RpZmllcnMsIHBhcnNlLT5tb2RpZmllcnMtPnNpemUgLSBpIC0gMSApLCBjICk7CisgICAgfQorCisgICAgLyogSWYgdGhlcmUgaXMgYSBzdWJzY3JpcHQsIGVtaXQgaXQuICovCisgICAgaWYgKCBwYXJzZS0+c3Vic2NyaXB0ICkKKyAgICAgICAgdmFyX3BhcnNlX2dyb3VwX2NvbXBpbGUoIHBhcnNlLT5zdWJzY3JpcHQsIGMgKTsKKworICAgIC8qIElmIHRoZSB2YXJpYWJsZSBuYW1lIGlzIGVtcHR5LCBsb29rIGl0IHVwLiAqLworICAgIGlmICggcGFyc2UtPm5hbWUtPmVsZW1zLT5zaXplID09IDAgKQorICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1BVU0hfVkFSLCBjb21waWxlX2VtaXRfY29uc3RhbnQoIGMsCisgICAgICAgICAgICBjb25zdGFudF9lbXB0eSApICk7CisgICAgLyogSWYgdGhlIHZhcmlhYmxlIG5hbWUgZG9lcyBub3QgbmVlZCB0byBiZSBleHBhbmRlZCwgbG9vayBpdCB1cC4gKi8KKyAgICBlbHNlIGlmICggcGFyc2UtPm5hbWUtPmVsZW1zLT5zaXplID09IDEgJiYgZHluYW1pY19hcnJheV9hdCggVkFSX1BBUlNFICosCisgICAgICAgIHBhcnNlLT5uYW1lLT5lbGVtcywgMCApLT50eXBlID09IFZBUl9QQVJTRV9UWVBFX1NUUklORyApCisgICAgeworICAgICAgICBPQkpFQ1QgKiBjb25zdCBuYW1lID0gKCAoVkFSX1BBUlNFX1NUUklORyAqKWR5bmFtaWNfYXJyYXlfYXQoCisgICAgICAgICAgICBWQVJfUEFSU0UgKiwgcGFyc2UtPm5hbWUtPmVsZW1zLCAwICkgKS0+czsKKyAgICAgICAgaW50IGNvbnN0IGlkeCA9IGdldF9hcmd1bWVudF9pbmRleCggb2JqZWN0X3N0ciggbmFtZSApICk7CisgICAgICAgIGlmICggaWR4ICE9IC0xICkKKyAgICAgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfUFVTSF9BUkcsIGlkeCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1BVU0hfVkFSLCBjb21waWxlX2VtaXRfY29uc3RhbnQoIGMsIG5hbWUgKSApOworICAgIH0KKyAgICAvKiBPdGhlcndpc2UsIHB1c2ggdGhlIHZhciBuYW1lcyBhbmQgdXNlIHRoZSBncm91cCBpbnN0cnVjdGlvbi4gKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICB2YXJfcGFyc2VfZ3JvdXBfY29tcGlsZSggcGFyc2UtPm5hbWUsIGMgKTsKKyAgICAgICAgZXhwYW5kX25hbWUgPSAxOworICAgIH0KKworICAgIC8qKiBTZWxlY3QgdGhlIGluc3RydWN0aW9uIGZvciBleHBhbmRpbmcgdGhlIHZhcmlhYmxlLiAqLworICAgIGlmICggIWhhc19tb2RpZmllcnMgJiYgIXBhcnNlLT5zdWJzY3JpcHQgJiYgIWV4cGFuZF9uYW1lICkKKyAgICAgICAgOworICAgIGVsc2UgaWYgKCAhaGFzX21vZGlmaWVycyAmJiAhcGFyc2UtPnN1YnNjcmlwdCAmJiBleHBhbmRfbmFtZSApCisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfUFVTSF9HUk9VUCwgMCApOworICAgIGVsc2UgaWYgKCAhaGFzX21vZGlmaWVycyAmJiBwYXJzZS0+c3Vic2NyaXB0ICYmICFleHBhbmRfbmFtZSApCisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfQVBQTFlfSU5ERVgsIDAgKTsKKyAgICBlbHNlIGlmICggIWhhc19tb2RpZmllcnMgJiYgcGFyc2UtPnN1YnNjcmlwdCAmJiBleHBhbmRfbmFtZSApCisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfQVBQTFlfSU5ERVhfR1JPVVAsIDAgKTsKKyAgICBlbHNlIGlmICggaGFzX21vZGlmaWVycyAmJiAhcGFyc2UtPnN1YnNjcmlwdCAmJiAhZXhwYW5kX25hbWUgKQorICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX0FQUExZX01PRElGSUVSUywgcGFyc2UtPm1vZGlmaWVycy0+c2l6ZSApOworICAgIGVsc2UgaWYgKCBoYXNfbW9kaWZpZXJzICYmICFwYXJzZS0+c3Vic2NyaXB0ICYmIGV4cGFuZF9uYW1lICkKKyAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9BUFBMWV9NT0RJRklFUlNfR1JPVVAsIHBhcnNlLT5tb2RpZmllcnMtPnNpemUgKTsKKyAgICBlbHNlIGlmICggaGFzX21vZGlmaWVycyAmJiBwYXJzZS0+c3Vic2NyaXB0ICYmICFleHBhbmRfbmFtZSApCisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfQVBQTFlfSU5ERVhfTU9ESUZJRVJTLCBwYXJzZS0+bW9kaWZpZXJzLT5zaXplICk7CisgICAgZWxzZSBpZiAoIGhhc19tb2RpZmllcnMgJiYgcGFyc2UtPnN1YnNjcmlwdCAmJiBleHBhbmRfbmFtZSApCisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfQVBQTFlfSU5ERVhfTU9ESUZJRVJTX0dST1VQLAorICAgICAgICAgICAgcGFyc2UtPm1vZGlmaWVycy0+c2l6ZSApOworCisgICAgLyogTm93IGFwcGx5IGFueSBzcGVjaWFsIG1vZGlmaWVycyAqLworICAgIGlmICggaXNfZ2V0X2dyaXN0ICkKKyAgICB7CisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfR0VUX0dSSVNULCAwICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2YXJfcGFyc2Vfc3RyaW5nX2NvbXBpbGUoIFZBUl9QQVJTRV9TVFJJTkcgY29uc3QgKiBwYXJzZSwKKyAgICBjb21waWxlciAqIGMgKQoreworICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfUFVTSF9DT05TVEFOVCwgY29tcGlsZV9lbWl0X2NvbnN0YW50KCBjLCBwYXJzZS0+cyApCisgICAgICAgICk7Cit9CisKK3N0YXRpYyB2b2lkIHZhcl9wYXJzZV9maWxlX2NvbXBpbGUoIFZBUl9QQVJTRV9GSUxFIGNvbnN0ICogcGFyc2UsIGNvbXBpbGVyICogYyApCit7CisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBwYXJzZS0+ZmlsZW5hbWUtPnNpemU7ICsraSApCisgICAgICAgIHZhcl9wYXJzZV9ncm91cF9jb21waWxlKCBkeW5hbWljX2FycmF5X2F0KCBWQVJfUEFSU0VfR1JPVVAgKiwKKyAgICAgICAgICAgIHBhcnNlLT5maWxlbmFtZSwgcGFyc2UtPmZpbGVuYW1lLT5zaXplIC0gaSAtIDEgKSwgYyApOworICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfQVBQRU5EX1NUUklOR1MsIHBhcnNlLT5maWxlbmFtZS0+c2l6ZSApOworICAgIGZvciAoIGkgPSAwOyBpIDwgcGFyc2UtPmNvbnRlbnRzLT5zaXplOyArK2kgKQorICAgICAgICB2YXJfcGFyc2VfZ3JvdXBfY29tcGlsZSggZHluYW1pY19hcnJheV9hdCggVkFSX1BBUlNFX0dST1VQICosCisgICAgICAgICAgICBwYXJzZS0+Y29udGVudHMsIHBhcnNlLT5jb250ZW50cy0+c2l6ZSAtIGkgLSAxICksIGMgKTsKKyAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1dSSVRFX0ZJTEUsIHBhcnNlLT5jb250ZW50cy0+c2l6ZSApOworfQorCitzdGF0aWMgdm9pZCB2YXJfcGFyc2VfY29tcGlsZSggVkFSX1BBUlNFIGNvbnN0ICogcGFyc2UsIGNvbXBpbGVyICogYyApCit7CisgICAgc3dpdGNoICggcGFyc2UtPnR5cGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBWQVJfUEFSU0VfVFlQRV9WQVI6CisgICAgICAgICAgICB2YXJfcGFyc2VfdmFyX2NvbXBpbGUoIChWQVJfUEFSU0VfVkFSIGNvbnN0ICopcGFyc2UsIGMgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVkFSX1BBUlNFX1RZUEVfU1RSSU5HOgorICAgICAgICAgICAgdmFyX3BhcnNlX3N0cmluZ19jb21waWxlKCAoVkFSX1BBUlNFX1NUUklORyBjb25zdCAqKXBhcnNlLCBjICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZBUl9QQVJTRV9UWVBFX0ZJTEU6CisgICAgICAgICAgICB2YXJfcGFyc2VfZmlsZV9jb21waWxlKCAoVkFSX1BBUlNFX0ZJTEUgY29uc3QgKilwYXJzZSwgYyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCggISJVbmtub3duIHZhciBwYXJzZSB0eXBlLiIgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZhcl9wYXJzZV9ncm91cF9jb21waWxlKCBWQVJfUEFSU0VfR1JPVVAgY29uc3QgKiBwYXJzZSwgY29tcGlsZXIgKiBjCisgICAgKQoreworICAgIC8qIEVtaXQgdGhlIGVsZW1lbnRzIGluIHJldmVyc2Ugb3JkZXIuICovCisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBwYXJzZS0+ZWxlbXMtPnNpemU7ICsraSApCisgICAgICAgIHZhcl9wYXJzZV9jb21waWxlKCBkeW5hbWljX2FycmF5X2F0KCBWQVJfUEFSU0UgKiwgcGFyc2UtPmVsZW1zLAorICAgICAgICAgICAgcGFyc2UtPmVsZW1zLT5zaXplIC0gaSAtIDEgKSwgYyApOworICAgIC8qIElmIHRoZXJlIGFyZSBubyBlbGVtZW50cywgZW1pdCBhbiBlbXB0eSBzdHJpbmcuICovCisgICAgaWYgKCBwYXJzZS0+ZWxlbXMtPnNpemUgPT0gMCApCisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfUFVTSF9DT05TVEFOVCwgY29tcGlsZV9lbWl0X2NvbnN0YW50KCBjLAorICAgICAgICAgICAgY29uc3RhbnRfZW1wdHkgKSApOworICAgIC8qIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZWxlbWVudCwgY29tYmluZSB0aGVtLiAqLworICAgIGlmICggcGFyc2UtPmVsZW1zLT5zaXplID4gMSApCisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfQ09NQklORV9TVFJJTkdTLCBwYXJzZS0+ZWxlbXMtPnNpemUgKTsKK30KKworc3RhdGljIHZvaWQgdmFyX3BhcnNlX2FjdGlvbnNfY29tcGlsZSggVkFSX1BBUlNFX0FDVElPTlMgY29uc3QgKiBhY3Rpb25zLAorICAgIGNvbXBpbGVyICogYyApCit7CisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBhY3Rpb25zLT5lbGVtcy0+c2l6ZTsgKytpICkKKyAgICAgICAgdmFyX3BhcnNlX2dyb3VwX2NvbXBpbGUoIGR5bmFtaWNfYXJyYXlfYXQoIFZBUl9QQVJTRV9HUk9VUCAqLAorICAgICAgICAgICAgYWN0aW9ucy0+ZWxlbXMsIGFjdGlvbnMtPmVsZW1zLT5zaXplIC0gaSAtIDEgKSwgYyApOworICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfT1VUUFVUX1NUUklOR1MsIGFjdGlvbnMtPmVsZW1zLT5zaXplICk7Cit9CisKKworLyoKKyAqIFBhcnNlIFZBUl9QQVJTRV9WQVIKKyAqLworCitzdGF0aWMgVkFSX1BBUlNFICogcGFyc2VfYXRfZmlsZSggY2hhciBjb25zdCAqIHN0YXJ0LCBjaGFyIGNvbnN0ICogbWlkLAorICAgIGNoYXIgY29uc3QgKiBlbmQgKTsKK3N0YXRpYyBWQVJfUEFSU0UgKiBwYXJzZV92YXJpYWJsZSggY2hhciBjb25zdCAqICogc3RyaW5nICk7CitzdGF0aWMgaW50IHRyeV9wYXJzZV92YXJpYWJsZSggY2hhciBjb25zdCAqICogc18sIGNoYXIgY29uc3QgKiAqIHN0cmluZywKKyAgICBWQVJfUEFSU0VfR1JPVVAgKiBvdXQgKTsKK3N0YXRpYyB2b2lkIGJhbGFuY2VfcGFyZW50aGVzZXMoIGNoYXIgY29uc3QgKiAqIHNfLCBjaGFyIGNvbnN0ICogKiBzdHJpbmcsCisgICAgVkFSX1BBUlNFX0dST1VQICogb3V0ICk7CitzdGF0aWMgdm9pZCBwYXJzZV92YXJfc3RyaW5nKCBjaGFyIGNvbnN0ICogZmlyc3QsIGNoYXIgY29uc3QgKiBsYXN0LAorICAgIHN0cnVjdCBkeW5hbWljX2FycmF5ICogb3V0ICk7CisKKworLyoKKyAqIFBhcnNlcyBhIHN0cmluZyB0aGF0IGNhbiBjb250YWluIHZhcmlhYmxlcyB0byBleHBhbmQuCisgKi8KKworc3RhdGljIFZBUl9QQVJTRV9HUk9VUCAqIHBhcnNlX2V4cGFuc2lvbiggY2hhciBjb25zdCAqICogc3RyaW5nICkKK3sKKyAgICBWQVJfUEFSU0VfR1JPVVAgKiByZXN1bHQgPSB2YXJfcGFyc2VfZ3JvdXBfbmV3KCk7CisgICAgY2hhciBjb25zdCAqIHMgPSAqc3RyaW5nOworICAgIGZvciAoIDsgOyApCisgICAgeworICAgICAgICBpZiAoIHRyeV9wYXJzZV92YXJpYWJsZSggJnMsIHN0cmluZywgcmVzdWx0ICkgKSB7fQorICAgICAgICBlbHNlIGlmICggc1sgMCBdID09ICdcMCcgKQorICAgICAgICB7CisgICAgICAgICAgICB2YXJfcGFyc2VfZ3JvdXBfbWF5YmVfYWRkX2NvbnN0YW50KCByZXN1bHQsICpzdHJpbmcsIHMgKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKytzOworICAgIH0KK30KKworc3RhdGljIFZBUl9QQVJTRV9BQ1RJT05TICogcGFyc2VfYWN0aW9ucyggY2hhciBjb25zdCAqIHN0cmluZyApCit7CisgICAgVkFSX1BBUlNFX0FDVElPTlMgKiBjb25zdCByZXN1bHQgPSB2YXJfcGFyc2VfYWN0aW9uc19uZXcoKTsKKyAgICBwYXJzZV92YXJfc3RyaW5nKCBzdHJpbmcsIHN0cmluZyArIHN0cmxlbiggc3RyaW5nICksIHJlc3VsdC0+ZWxlbXMgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIHN0cmluZyBhICpzXyBzdGFydHMgd2l0aCBhIHZhcmlhYmxlIGV4cGFuc2lvbiAiJCgiLgorICogKnN0cmluZyBzaG91bGQgcG9pbnQgdG8gdGhlIGZpcnN0IHVuZW1pdHRlZCBjaGFyYWN0ZXIgYmVmb3JlICpzLiBJZiAqc18KKyAqIHN0YXJ0cyB3aXRoIHZhcmlhYmxlIGV4cGFuc2lvbiwgYXBwZW5kcyBlbGVtZW50cyB0byBvdXQgdXAgdG8gdGhlIGNsb3NpbmcKKyAqICIpIiwgYW5kIGFkanVzdHMgKnNfIGFuZCAqc3RyaW5nIHRvIHBvaW50IHRvIG5leHQgY2hhcmFjdGVyLiBSZXR1cm5zIDEgaWYgc18KKyAqIHN0YXJ0cyB3aXRoIGEgdmFyaWFibGUsIDAgb3RoZXJ3aXNlLgorICovCisKK3N0YXRpYyBpbnQgdHJ5X3BhcnNlX3ZhcmlhYmxlKCBjaGFyIGNvbnN0ICogKiBzXywgY2hhciBjb25zdCAqICogc3RyaW5nLAorICAgIFZBUl9QQVJTRV9HUk9VUCAqIG91dCApCit7CisgICAgY2hhciBjb25zdCAqIHMgPSAqc187CisgICAgaWYgKCBzWyAwIF0gPT0gJyQnICYmIHNbIDEgXSA9PSAnKCcgKQorICAgIHsKKyAgICAgICAgdmFyX3BhcnNlX2dyb3VwX21heWJlX2FkZF9jb25zdGFudCggb3V0LCAqc3RyaW5nLCBzICk7CisgICAgICAgIHMgKz0gMjsKKyAgICAgICAgdmFyX3BhcnNlX2dyb3VwX2FkZCggb3V0LCBwYXJzZV92YXJpYWJsZSggJnMgKSApOworICAgICAgICAqc3RyaW5nID0gczsKKyAgICAgICAgKnNfID0gczsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICggc1sgMCBdID09ICdAJyAmJiBzWyAxIF0gPT0gJygnICkKKyAgICB7CisgICAgICAgIGludCBkZXB0aCA9IDE7CisgICAgICAgIGNoYXIgY29uc3QgKiBpbmU7CisgICAgICAgIGNoYXIgY29uc3QgKiBzcGxpdCA9IDA7CisgICAgICAgIHZhcl9wYXJzZV9ncm91cF9tYXliZV9hZGRfY29uc3RhbnQoIG91dCwgKnN0cmluZywgcyApOworICAgICAgICBzICs9IDI7CisgICAgICAgIGluZSA9IHM7CisKKyAgICAgICAgLyogU2NhbiB0aGUgY29udGVudCBvZiB0aGUgcmVzcG9uc2UgZmlsZSBAKCkgc2VjdGlvbi4gKi8KKyAgICAgICAgd2hpbGUgKCAqaW5lICYmICggZGVwdGggPiAwICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKCAqaW5lICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJygnOiArK2RlcHRoOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyknOiAtLWRlcHRoOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJzonOgorICAgICAgICAgICAgICAgIGlmICggKCBkZXB0aCA9PSAxICkgJiYgKCBpbmVbIDEgXSA9PSAnRScgKSAmJiAoIGluZVsgMiBdID09ICc9JworICAgICAgICAgICAgICAgICAgICApICkKKyAgICAgICAgICAgICAgICAgICAgc3BsaXQgPSBpbmU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2luZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggIXNwbGl0IHx8IGRlcHRoICkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHZhcl9wYXJzZV9ncm91cF9hZGQoIG91dCwgcGFyc2VfYXRfZmlsZSggcywgc3BsaXQsIGluZSAtIDEgKSApOworICAgICAgICAqc3RyaW5nID0gaW5lOworICAgICAgICAqc18gPSBpbmU7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgY2hhciBjb25zdCAqIGN1cnJlbnRfZmlsZSA9ICIiOworc3RhdGljIGludCBjdXJyZW50X2xpbmU7CisKK3N0YXRpYyB2b2lkIHBhcnNlX2Vycm9yKCBjaGFyIGNvbnN0ICogbWVzc2FnZSApCit7CisgICAgcHJpbnRmKCAiJXM6JWQ6ICVzXG4iLCBjdXJyZW50X2ZpbGUsIGN1cnJlbnRfbGluZSwgbWVzc2FnZSApOworfQorCisKKy8qCisgKiBQYXJzZXMgYSBzaW5nbGUgdmFyaWFibGUgdXAgdG8gdGhlIGNsb3NpbmcgIikiIGFuZCBhZGp1c3RzICpzdHJpbmcgdG8gcG9pbnQKKyAqIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4gKnN0cmluZyBzaG91bGQgcG9pbnQgdG8gdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseQorICogYWZ0ZXIgdGhlIGluaXRpYWwgIiQoIi4KKyAqLworCitzdGF0aWMgVkFSX1BBUlNFICogcGFyc2VfdmFyaWFibGUoIGNoYXIgY29uc3QgKiAqIHN0cmluZyApCit7CisgICAgVkFSX1BBUlNFX1ZBUiAqIGNvbnN0IHJlc3VsdCA9IHZhcl9wYXJzZV92YXJfbmV3KCk7CisgICAgVkFSX1BBUlNFX0dST1VQICogY29uc3QgbmFtZSA9IHJlc3VsdC0+bmFtZTsKKyAgICBjaGFyIGNvbnN0ICogcyA9ICpzdHJpbmc7CisgICAgZm9yICggOyA7ICkKKyAgICB7CisgICAgICAgIGlmICggdHJ5X3BhcnNlX3ZhcmlhYmxlKCAmcywgc3RyaW5nLCBuYW1lICkgKSB7fQorICAgICAgICBlbHNlIGlmICggc1sgMCBdID09ICc6JyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZBUl9QQVJTRV9HUk9VUCAqIG1vZDsKKyAgICAgICAgICAgIHZhcl9wYXJzZV9ncm91cF9tYXliZV9hZGRfY29uc3RhbnQoIG5hbWUsICpzdHJpbmcsIHMgKTsKKyAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgICpzdHJpbmcgPSBzOworICAgICAgICAgICAgbW9kID0gdmFyX3BhcnNlX3Zhcl9uZXdfbW9kaWZpZXIoIHJlc3VsdCApOworICAgICAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRyeV9wYXJzZV92YXJpYWJsZSggJnMsIHN0cmluZywgbW9kICkgKSB7fQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzWyAwIF0gPT0gJyknICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhcl9wYXJzZV9ncm91cF9tYXliZV9hZGRfY29uc3RhbnQoIG1vZCwgKnN0cmluZywgcyApOworICAgICAgICAgICAgICAgICAgICAqc3RyaW5nID0gKytzOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFZBUl9QQVJTRSAqKXJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNbIDAgXSA9PSAnKCcgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytzOworICAgICAgICAgICAgICAgICAgICBiYWxhbmNlX3BhcmVudGhlc2VzKCAmcywgc3RyaW5nLCBtb2QgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNbIDAgXSA9PSAnOicgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyX3BhcnNlX2dyb3VwX21heWJlX2FkZF9jb25zdGFudCggbW9kLCAqc3RyaW5nLCBzICk7CisgICAgICAgICAgICAgICAgICAgICpzdHJpbmcgPSArK3M7CisgICAgICAgICAgICAgICAgICAgIG1vZCA9IHZhcl9wYXJzZV92YXJfbmV3X21vZGlmaWVyKCByZXN1bHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNbIDAgXSA9PSAnWycgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VfZXJyb3IoInVuZXhwZWN0ZWQgc3Vic2NyaXB0Iik7CisgICAgICAgICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNbIDAgXSA9PSAnXDAnICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAidW5iYWxhbmNlZCBwYXJlbnRoZXNlcyIgKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyX3BhcnNlX2dyb3VwX21heWJlX2FkZF9jb25zdGFudCggbW9kLCAqc3RyaW5nLCBzICk7CisgICAgICAgICAgICAgICAgICAgICpzdHJpbmcgPSBzOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFZBUl9QQVJTRSAqKXJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICArK3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHNbIDAgXSA9PSAnWycgKQorICAgICAgICB7CisgICAgICAgICAgICBWQVJfUEFSU0VfR1JPVVAgKiBzdWJzY3JpcHQgPSB2YXJfcGFyc2VfZ3JvdXBfbmV3KCk7CisgICAgICAgICAgICByZXN1bHQtPnN1YnNjcmlwdCA9IHN1YnNjcmlwdDsKKyAgICAgICAgICAgIHZhcl9wYXJzZV9ncm91cF9tYXliZV9hZGRfY29uc3RhbnQoIG5hbWUsICpzdHJpbmcsIHMgKTsKKyAgICAgICAgICAgICpzdHJpbmcgPSArK3M7CisgICAgICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggdHJ5X3BhcnNlX3ZhcmlhYmxlKCAmcywgc3RyaW5nLCBzdWJzY3JpcHQgKSApIHt9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNbIDAgXSA9PSAnXScgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyX3BhcnNlX2dyb3VwX21heWJlX2FkZF9jb25zdGFudCggc3Vic2NyaXB0LCAqc3RyaW5nLCBzICk7CisgICAgICAgICAgICAgICAgICAgICpzdHJpbmcgPSArK3M7CisgICAgICAgICAgICAgICAgICAgIGlmICggc1sgMCBdICE9ICcpJyAmJiBzWyAwIF0gIT0gJzonICYmIHNbIDAgXSAhPSAnXDAnICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAidW5leHBlY3RlZCB0ZXh0IGZvbGxvd2luZyBbXSIgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBpc2RpZ2l0KCBzWyAwIF0gKSB8fCBzWyAwIF0gPT0gJy0nICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNbIDAgXSA9PSAnXDAnICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAibWFsZm9ybWVkIHN1YnNjcmlwdCIgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAibWFsZm9ybWVkIHN1YnNjcmlwdCIgKTsKKyAgICAgICAgICAgICAgICAgICAgKytzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc1sgMCBdID09ICcpJyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhcl9wYXJzZV9ncm91cF9tYXliZV9hZGRfY29uc3RhbnQoIG5hbWUsICpzdHJpbmcsIHMgKTsKKyAgICAgICAgICAgICpzdHJpbmcgPSArK3M7CisgICAgICAgICAgICByZXR1cm4gKFZBUl9QQVJTRSAqKXJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc1sgMCBdID09ICcoJyApCisgICAgICAgIHsKKyAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgIGJhbGFuY2VfcGFyZW50aGVzZXMoICZzLCBzdHJpbmcsIG5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc1sgMCBdID09ICdcMCcgKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJzZV9lcnJvciggInVuYmFsYW5jZWQgcGFyZW50aGVzZXMiICk7CisgICAgICAgICAgICB2YXJfcGFyc2VfZ3JvdXBfbWF5YmVfYWRkX2NvbnN0YW50KCBuYW1lLCAqc3RyaW5nLCBzICk7CisgICAgICAgICAgICAqc3RyaW5nID0gczsKKyAgICAgICAgICAgIHJldHVybiAoVkFSX1BBUlNFICopcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICsrczsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX3Zhcl9zdHJpbmcoIGNoYXIgY29uc3QgKiBmaXJzdCwgY2hhciBjb25zdCAqIGxhc3QsCisgICAgc3RydWN0IGR5bmFtaWNfYXJyYXkgKiBvdXQgKQoreworICAgIGNoYXIgY29uc3QgKiBzYXZlZCA9IGZpcnN0OworICAgIHdoaWxlICggZmlyc3QgIT0gbGFzdCApCisgICAgeworICAgICAgICAvKiBIYW5kbGUgd2hpdGVzcGFjZS4gKi8KKyAgICAgICAgd2hpbGUgKCBmaXJzdCAhPSBsYXN0ICYmIGlzc3BhY2UoICpmaXJzdCApICkgKytmaXJzdDsKKyAgICAgICAgaWYgKCBzYXZlZCAhPSBmaXJzdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZBUl9QQVJTRV9HUk9VUCAqIGNvbnN0IGdyb3VwID0gdmFyX3BhcnNlX2dyb3VwX25ldygpOworICAgICAgICAgICAgdmFyX3BhcnNlX2dyb3VwX21heWJlX2FkZF9jb25zdGFudCggZ3JvdXAsIHNhdmVkLCBmaXJzdCApOworICAgICAgICAgICAgc2F2ZWQgPSBmaXJzdDsKKyAgICAgICAgICAgIGR5bmFtaWNfYXJyYXlfcHVzaCggb3V0LCBncm91cCApOworICAgICAgICB9CisgICAgICAgIGlmICggZmlyc3QgPT0gbGFzdCApIGJyZWFrOworCisgICAgICAgIC8qIEhhbmRsZSBub24td2hpdGVzcGFjZSAqLworICAgICAgICB7CisgICAgICAgICAgICBWQVJfUEFSU0VfR1JPVVAgKiBncm91cCA9IHZhcl9wYXJzZV9ncm91cF9uZXcoKTsKKyAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBmaXJzdCA9PSBsYXN0IHx8IGlzc3BhY2UoICpmaXJzdCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhcl9wYXJzZV9ncm91cF9tYXliZV9hZGRfY29uc3RhbnQoIGdyb3VwLCBzYXZlZCwgZmlyc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZWQgPSBmaXJzdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggdHJ5X3BhcnNlX3ZhcmlhYmxlKCAmZmlyc3QsICZzYXZlZCwgZ3JvdXAgKSApCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCggZmlyc3QgPD0gbGFzdCApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKytmaXJzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR5bmFtaWNfYXJyYXlfcHVzaCggb3V0LCBncm91cCApOworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogc3RhcnQgc2hvdWxkIHBvaW50IHRvIHRoZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBvcGVuaW5nICJAKCIsCisgKiBtaWQgc2hvdWxkIHBvaW50IHRvIHRoZSAiOkU9IiwgYW5kIGVuZCBzaG91bGQgcG9pbnQgdG8gdGhlIGNsb3NpbmcgIikiLgorICovCisKK3N0YXRpYyBWQVJfUEFSU0UgKiBwYXJzZV9hdF9maWxlKCBjaGFyIGNvbnN0ICogc3RhcnQsIGNoYXIgY29uc3QgKiBtaWQsCisgICAgY2hhciBjb25zdCAqIGVuZCApCit7CisgICAgVkFSX1BBUlNFX0ZJTEUgKiByZXN1bHQgPSB2YXJfcGFyc2VfZmlsZV9uZXcoKTsKKyAgICBwYXJzZV92YXJfc3RyaW5nKCBzdGFydCwgbWlkLCByZXN1bHQtPmZpbGVuYW1lICk7CisgICAgcGFyc2VfdmFyX3N0cmluZyggbWlkICsgMywgZW5kLCByZXN1bHQtPmNvbnRlbnRzICk7CisgICAgcmV0dXJuIChWQVJfUEFSU0UgKilyZXN1bHQ7Cit9CisKKy8qCisgKiBHaXZlbiB0aGF0ICpzXyBwb2ludHMgdG8gdGhlIGNoYXJhY3RlciBhZnRlciBhICIoIiwgcGFyc2VzIHVwIHRvIHRoZSBtYXRjaGluZworICogIikiLiAqc3RyaW5nIHNob3VsZCBwb2ludCB0byB0aGUgZmlyc3QgdW5lbWl0dGVkIGNoYXJhY3RlciBiZWZvcmUgKnNfLgorICoKKyAqIFdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMsICpzXyB3aWxsIHBvaW50IHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlICIpIiwgYW5kCisgKiAqc3RyaW5nIHdpbGwgcG9pbnQgdG8gdGhlIGZpcnN0IHVuZW1pdHRlZCBjaGFyYWN0ZXIgYmVmb3JlICpzXy4gVGhlIHJhbmdlCisgKiBmcm9tICpzdHJpbmcgdG8gKnNfIGRvZXMgbm90IGNvbnRhaW4gYW55IHZhcmlhYmxlcyB0aGF0IG5lZWQgdG8gYmUgZXhwYW5kZWQuCisgKi8KKwordm9pZCBiYWxhbmNlX3BhcmVudGhlc2VzKCBjaGFyIGNvbnN0ICogKiBzXywgY2hhciBjb25zdCAqICogc3RyaW5nLAorICAgIFZBUl9QQVJTRV9HUk9VUCAqIG91dCkKK3sKKyAgICBpbnQgZGVwdGggPSAxOworICAgIGNoYXIgY29uc3QgKiBzID0gKnNfOworICAgIGZvciAoIDsgOyApCisgICAgeworICAgICAgICBpZiAoIHRyeV9wYXJzZV92YXJpYWJsZSggJnMsIHN0cmluZywgb3V0ICkgKSB7IH0KKyAgICAgICAgZWxzZSBpZiAoIHNbIDAgXSA9PSAnOicgfHwgc1sgMCBdID09ICdbJyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAidW5iYWxhbmNlZCBwYXJlbnRoZXNlcyIgKTsKKyAgICAgICAgICAgICsrczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc1sgMCBdID09ICdcMCcgKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJzZV9lcnJvciggInVuYmFsYW5jZWQgcGFyZW50aGVzZXMiICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc1sgMCBdID09ICcpJyApCisgICAgICAgIHsKKyAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgIGlmICggLS1kZXB0aCA9PSAwICkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHNbIDAgXSA9PSAnKCcgKQorICAgICAgICB7CisgICAgICAgICAgICArK2RlcHRoOworICAgICAgICAgICAgKytzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICsrczsKKyAgICB9CisgICAgKnNfID0gczsKK30KKworCisvKgorICogTWFpbiBjb21waWxlLgorICovCisKKyNkZWZpbmUgUkVTVUxUX1NUQUNLIDAKKyNkZWZpbmUgUkVTVUxUX1JFVFVSTiAxCisjZGVmaW5lIFJFU1VMVF9OT05FIDIKKworc3RhdGljIHZvaWQgY29tcGlsZV9wYXJzZSggUEFSU0UgKiBwYXJzZSwgY29tcGlsZXIgKiBjLCBpbnQgcmVzdWx0X2xvY2F0aW9uICk7CitzdGF0aWMgc3RydWN0IGFyZ19saXN0ICogYXJnX2xpc3RfY29tcGlsZSggUEFSU0UgKiBwYXJzZSwgaW50ICogbnVtX2FyZ3VtZW50cyApOworCitzdGF0aWMgdm9pZCBjb21waWxlX2NvbmRpdGlvbiggUEFSU0UgKiBwYXJzZSwgY29tcGlsZXIgKiBjLCBpbnQgYnJhbmNoX3RydWUsIGludCBsYWJlbCApCit7CisgICAgYXNzZXJ0KCBwYXJzZS0+dHlwZSA9PSBQQVJTRV9FVkFMICk7CisgICAgc3dpdGNoICggcGFyc2UtPm51bSApCisgICAgeworICAgICAgICBjYXNlIEVYUFJfRVhJU1RTOgorICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPmxlZnQsIGMsIFJFU1VMVF9TVEFDSyApOworICAgICAgICAgICAgaWYgKCBicmFuY2hfdHJ1ZSApCisgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0X2JyYW5jaCggYywgSU5TVFJfSlVNUF9OT1RfRU1QVFksIGxhYmVsICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0X2JyYW5jaCggYywgSU5TVFJfSlVNUF9FTVBUWSwgbGFiZWwgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVhQUl9FUVVBTFM6CisgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+bGVmdCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+cmlnaHQsIGMsIFJFU1VMVF9TVEFDSyApOworICAgICAgICAgICAgaWYgKCBicmFuY2hfdHJ1ZSApCisgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0X2JyYW5jaCggYywgSU5TVFJfSlVNUF9FUSwgbGFiZWwgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb21waWxlX2VtaXRfYnJhbmNoKCBjLCBJTlNUUl9KVU1QX05FLCBsYWJlbCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFWFBSX05PVEVROgorICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPmxlZnQsIGMsIFJFU1VMVF9TVEFDSyApOworICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPnJpZ2h0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKyAgICAgICAgICAgIGlmICggYnJhbmNoX3RydWUgKQorICAgICAgICAgICAgICAgIGNvbXBpbGVfZW1pdF9icmFuY2goIGMsIElOU1RSX0pVTVBfTkUsIGxhYmVsICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0X2JyYW5jaCggYywgSU5TVFJfSlVNUF9FUSwgbGFiZWwgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVhQUl9MRVNTOgorICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPmxlZnQsIGMsIFJFU1VMVF9TVEFDSyApOworICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPnJpZ2h0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKyAgICAgICAgICAgIGlmICggYnJhbmNoX3RydWUgKQorICAgICAgICAgICAgICAgIGNvbXBpbGVfZW1pdF9icmFuY2goIGMsIElOU1RSX0pVTVBfTFQsIGxhYmVsICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0X2JyYW5jaCggYywgSU5TVFJfSlVNUF9HRSwgbGFiZWwgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVhQUl9MRVNTRVE6CisgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+bGVmdCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+cmlnaHQsIGMsIFJFU1VMVF9TVEFDSyApOworICAgICAgICAgICAgaWYgKCBicmFuY2hfdHJ1ZSApCisgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0X2JyYW5jaCggYywgSU5TVFJfSlVNUF9MRSwgbGFiZWwgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb21waWxlX2VtaXRfYnJhbmNoKCBjLCBJTlNUUl9KVU1QX0dULCBsYWJlbCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFWFBSX01PUkU6CisgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+bGVmdCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+cmlnaHQsIGMsIFJFU1VMVF9TVEFDSyApOworICAgICAgICAgICAgaWYgKCBicmFuY2hfdHJ1ZSApCisgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0X2JyYW5jaCggYywgSU5TVFJfSlVNUF9HVCwgbGFiZWwgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb21waWxlX2VtaXRfYnJhbmNoKCBjLCBJTlNUUl9KVU1QX0xFLCBsYWJlbCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFWFBSX01PUkVFUToKKyAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5sZWZ0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5yaWdodCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgICAgICBpZiAoIGJyYW5jaF90cnVlICkKKyAgICAgICAgICAgICAgICBjb21waWxlX2VtaXRfYnJhbmNoKCBjLCBJTlNUUl9KVU1QX0dFLCBsYWJlbCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbXBpbGVfZW1pdF9icmFuY2goIGMsIElOU1RSX0pVTVBfTFQsIGxhYmVsICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVYUFJfSU46CisgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+bGVmdCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+cmlnaHQsIGMsIFJFU1VMVF9TVEFDSyApOworICAgICAgICAgICAgaWYgKCBicmFuY2hfdHJ1ZSApCisgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0X2JyYW5jaCggYywgSU5TVFJfSlVNUF9JTiwgbGFiZWwgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb21waWxlX2VtaXRfYnJhbmNoKCBjLCBJTlNUUl9KVU1QX05PVF9JTiwgbGFiZWwgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVhQUl9BTkQ6CisgICAgICAgICAgICBpZiAoIGJyYW5jaF90cnVlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZiA9IGNvbXBpbGVfbmV3X2xhYmVsKCBjICk7CisgICAgICAgICAgICAgICAgY29tcGlsZV9jb25kaXRpb24oIHBhcnNlLT5sZWZ0LCBjLCAwLCBmICk7CisgICAgICAgICAgICAgICAgY29tcGlsZV9jb25kaXRpb24oIHBhcnNlLT5yaWdodCwgYywgMSwgbGFiZWwgKTsKKyAgICAgICAgICAgICAgICBjb21waWxlX3NldF9sYWJlbCggYywgZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbXBpbGVfY29uZGl0aW9uKCBwYXJzZS0+bGVmdCwgYywgMCwgbGFiZWwgKTsKKyAgICAgICAgICAgICAgICBjb21waWxlX2NvbmRpdGlvbiggcGFyc2UtPnJpZ2h0LCBjLCAwLCBsYWJlbCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFWFBSX09SOgorICAgICAgICAgICAgaWYgKCBicmFuY2hfdHJ1ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29tcGlsZV9jb25kaXRpb24oIHBhcnNlLT5sZWZ0LCBjLCAxLCBsYWJlbCApOworICAgICAgICAgICAgICAgIGNvbXBpbGVfY29uZGl0aW9uKCBwYXJzZS0+cmlnaHQsIGMsIDEsIGxhYmVsICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQgPSBjb21waWxlX25ld19sYWJlbCggYyApOworICAgICAgICAgICAgICAgIGNvbXBpbGVfY29uZGl0aW9uKCBwYXJzZS0+bGVmdCwgYywgMSwgdCApOworICAgICAgICAgICAgICAgIGNvbXBpbGVfY29uZGl0aW9uKCBwYXJzZS0+cmlnaHQsIGMsIDAsIGxhYmVsICk7CisgICAgICAgICAgICAgICAgY29tcGlsZV9zZXRfbGFiZWwoIGMsIHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVhQUl9OT1Q6CisgICAgICAgICAgICBjb21waWxlX2NvbmRpdGlvbiggcGFyc2UtPmxlZnQsIGMsICFicmFuY2hfdHJ1ZSwgbGFiZWwgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWRqdXN0X3Jlc3VsdCggY29tcGlsZXIgKiBjLCBpbnQgYWN0dWFsX2xvY2F0aW9uLAorICAgIGludCBkZXNpcmVkX2xvY2F0aW9uICkKK3sKKyAgICBpZiAoIGFjdHVhbF9sb2NhdGlvbiA9PSBkZXNpcmVkX2xvY2F0aW9uICkKKyAgICAgICAgOworICAgIGVsc2UgaWYgKCBhY3R1YWxfbG9jYXRpb24gPT0gUkVTVUxUX1NUQUNLICYmIGRlc2lyZWRfbG9jYXRpb24gPT0gUkVTVUxUX1JFVFVSTiApCisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfU0VUX1JFU1VMVCwgMCApOworICAgIGVsc2UgaWYgKCBhY3R1YWxfbG9jYXRpb24gPT0gUkVTVUxUX1NUQUNLICYmIGRlc2lyZWRfbG9jYXRpb24gPT0gUkVTVUxUX05PTkUgKQorICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1BPUCwgMCApOworICAgIGVsc2UgaWYgKCBhY3R1YWxfbG9jYXRpb24gPT0gUkVTVUxUX1JFVFVSTiAmJiBkZXNpcmVkX2xvY2F0aW9uID09IFJFU1VMVF9TVEFDSyApCisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfUFVTSF9SRVNVTFQsIDAgKTsKKyAgICBlbHNlIGlmICggYWN0dWFsX2xvY2F0aW9uID09IFJFU1VMVF9SRVRVUk4gJiYgZGVzaXJlZF9sb2NhdGlvbiA9PSBSRVNVTFRfTk9ORSApCisgICAgICAgIDsKKyAgICBlbHNlIGlmICggYWN0dWFsX2xvY2F0aW9uID09IFJFU1VMVF9OT05FICYmIGRlc2lyZWRfbG9jYXRpb24gPT0gUkVTVUxUX1NUQUNLICkKKyAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9QVVNIX0VNUFRZLCAwICk7CisgICAgZWxzZSBpZiAoIGFjdHVhbF9sb2NhdGlvbiA9PSBSRVNVTFRfTk9ORSAmJiBkZXNpcmVkX2xvY2F0aW9uID09IFJFU1VMVF9SRVRVUk4gKQorICAgIHsKKyAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9QVVNIX0VNUFRZLCAwICk7CisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfU0VUX1JFU1VMVCwgMCApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGFzc2VydCggISJpbnZhbGlkIHJlc3VsdCBsb2NhdGlvbiIgKTsKK30KKworc3RhdGljIGNoYXIgY29uc3QgKiBwYXJzZV90eXBlKCBQQVJTRSAqIHBhcnNlICkKK3sKKyAgICBzd2l0Y2ggKCBwYXJzZS0+dHlwZSApCisgICAgeworICAgICAgICBjYXNlIFBBUlNFX0FQUEVORDogcmV0dXJuICJhcHBlbmQiOworICAgICAgICBjYXNlIFBBUlNFX0VWQUw6IHJldHVybiAiZXZhbCI7CisgICAgICAgIGNhc2UgUEFSU0VfUlVMRVM6IHJldHVybiAicnVsZXMiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gInVua25vd24iOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29tcGlsZV9hcHBlbmRfY2hhaW4oIFBBUlNFICogcGFyc2UsIGNvbXBpbGVyICogYyApCit7CisgICAgYXNzZXJ0KCBwYXJzZS0+dHlwZSA9PSBQQVJTRV9BUFBFTkQgKTsKKyAgICBpZiAoIHBhcnNlLT5sZWZ0LT50eXBlID09IFBBUlNFX05VTEwgKQorICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+cmlnaHQsIGMsIFJFU1VMVF9TVEFDSyApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICggcGFyc2UtPmxlZnQtPnR5cGUgPT0gUEFSU0VfQVBQRU5EICkKKyAgICAgICAgICAgIGNvbXBpbGVfYXBwZW5kX2NoYWluKCBwYXJzZS0+bGVmdCwgYyApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+bGVmdCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5yaWdodCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfUFVTSF9BUFBFTkQsIDAgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbXBpbGVfcGFyc2UoIFBBUlNFICogcGFyc2UsIGNvbXBpbGVyICogYywgaW50IHJlc3VsdF9sb2NhdGlvbiApCit7CisgICAgaWYgKCBwYXJzZS0+dHlwZSA9PSBQQVJTRV9BUFBFTkQgKQorICAgIHsKKyAgICAgICAgY29tcGlsZV9hcHBlbmRfY2hhaW4oIHBhcnNlLCBjICk7CisgICAgICAgIGFkanVzdF9yZXN1bHQoIGMsIFJFU1VMVF9TVEFDSywgcmVzdWx0X2xvY2F0aW9uICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBwYXJzZS0+dHlwZSA9PSBQQVJTRV9FVkFMICkKKyAgICB7CisgICAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIGJpemFycmUgcGFyc2luZyBvZgorICAgICAgICAgKiBjb25kaXRpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCBwYXJzZS0+bnVtID09IEVYUFJfRVhJU1RTICkKKyAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5sZWZ0LCBjLCByZXN1bHRfbG9jYXRpb24gKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZiA9IGNvbXBpbGVfbmV3X2xhYmVsKCBjICk7CisgICAgICAgICAgICBpbnQgZW5kID0gY29tcGlsZV9uZXdfbGFiZWwoIGMgKTsKKworICAgICAgICAgICAgcHJpbnRmKCAiJXM6JWQ6IENvbmRpdGlvbmFsIHVzZWQgYXMgbGlzdCAoY2hlY2sgb3BlcmF0b3IgIgorICAgICAgICAgICAgICAgICJwcmVjZWRlbmNlKS5cbiIsIG9iamVjdF9zdHIoIHBhcnNlLT5maWxlICksIHBhcnNlLT5saW5lICk7CisKKyAgICAgICAgICAgIC8qIEVtaXQgdGhlIGNvbmRpdGlvbiAqLworICAgICAgICAgICAgY29tcGlsZV9jb25kaXRpb24oIHBhcnNlLCBjLCAwLCBmICk7CisgICAgICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1BVU0hfQ09OU1RBTlQsIGNvbXBpbGVfZW1pdF9jb25zdGFudCggYywKKyAgICAgICAgICAgICAgICBjb25zdGFudF90cnVlICkgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfZW1pdF9icmFuY2goIGMsIElOU1RSX0pVTVAsIGVuZCApOworICAgICAgICAgICAgY29tcGlsZV9zZXRfbGFiZWwoIGMsIGYgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfUFVTSF9FTVBUWSwgMCApOworICAgICAgICAgICAgY29tcGlsZV9zZXRfbGFiZWwoIGMsIGVuZCApOworICAgICAgICAgICAgYWRqdXN0X3Jlc3VsdCggYywgUkVTVUxUX1NUQUNLLCByZXN1bHRfbG9jYXRpb24gKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggcGFyc2UtPnR5cGUgPT0gUEFSU0VfRk9SRUFDSCApCisgICAgeworICAgICAgICBpbnQgdmFyID0gY29tcGlsZV9lbWl0X2NvbnN0YW50KCBjLCBwYXJzZS0+c3RyaW5nICk7CisgICAgICAgIGludCB0b3AgPSBjb21waWxlX25ld19sYWJlbCggYyApOworICAgICAgICBpbnQgZW5kID0gY29tcGlsZV9uZXdfbGFiZWwoIGMgKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBFdmFsdWF0ZSB0aGUgbGlzdC4KKyAgICAgICAgICovCisgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5sZWZ0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKworICAgICAgICAvKiBMb2NhbGl6ZSB0aGUgbG9vcCB2YXJpYWJsZSAqLworICAgICAgICBpZiAoIHBhcnNlLT5udW0gKQorICAgICAgICB7CisgICAgICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1BVU0hfRU1QVFksIDAgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfUFVTSF9MT0NBTCwgdmFyICk7CisgICAgICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1NXQVAsIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfRk9SX0lOSVQsIDAgKTsKKyAgICAgICAgY29tcGlsZV9zZXRfbGFiZWwoIGMsIHRvcCApOworICAgICAgICBjb21waWxlX2VtaXRfYnJhbmNoKCBjLCBJTlNUUl9GT1JfTE9PUCwgZW5kICk7CisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfU0VULCB2YXIgKTsKKworICAgICAgICAvKiBSdW4gdGhlIGxvb3AgYm9keSAqLworICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+cmlnaHQsIGMsIFJFU1VMVF9OT05FICk7CisKKyAgICAgICAgY29tcGlsZV9lbWl0X2JyYW5jaCggYywgSU5TVFJfSlVNUCwgdG9wICk7CisgICAgICAgIGNvbXBpbGVfc2V0X2xhYmVsKCBjLCBlbmQgKTsKKworICAgICAgICBpZiAoIHBhcnNlLT5udW0gKQorICAgICAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9QT1BfTE9DQUwsIHZhciApOworCisgICAgICAgIGFkanVzdF9yZXN1bHQoIGMsIFJFU1VMVF9OT05FLCByZXN1bHRfbG9jYXRpb24pOworICAgIH0KKyAgICBlbHNlIGlmICggcGFyc2UtPnR5cGUgPT0gUEFSU0VfSUYgKQorICAgIHsKKyAgICAgICAgaW50IGYgPSBjb21waWxlX25ld19sYWJlbCggYyApOworICAgICAgICAvKiBFbWl0IHRoZSBjb25kaXRpb24gKi8KKyAgICAgICAgY29tcGlsZV9jb25kaXRpb24oIHBhcnNlLT5sZWZ0LCBjLCAwLCBmICk7CisgICAgICAgIC8qIEVtaXQgdGhlIGlmIGJsb2NrICovCisgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5yaWdodCwgYywgcmVzdWx0X2xvY2F0aW9uICk7CisgICAgICAgIGlmICggcGFyc2UtPnRoaXJkLT50eXBlICE9IFBBUlNFX05VTEwgfHwgcmVzdWx0X2xvY2F0aW9uICE9IFJFU1VMVF9OT05FICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRW1pdCB0aGUgZWxzZSBibG9jayAqLworICAgICAgICAgICAgaW50IGVuZCA9IGNvbXBpbGVfbmV3X2xhYmVsKCBjICk7CisgICAgICAgICAgICBjb21waWxlX2VtaXRfYnJhbmNoKCBjLCBJTlNUUl9KVU1QLCBlbmQgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfc2V0X2xhYmVsKCBjLCBmICk7CisgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+dGhpcmQsIGMsIHJlc3VsdF9sb2NhdGlvbiApOworICAgICAgICAgICAgY29tcGlsZV9zZXRfbGFiZWwoIGMsIGVuZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbXBpbGVfc2V0X2xhYmVsKCBjLCBmICk7CisKKyAgICB9CisgICAgZWxzZSBpZiAoIHBhcnNlLT50eXBlID09IFBBUlNFX1dISUxFICkKKyAgICB7CisgICAgICAgIGludCBuZXN0ZWRfcmVzdWx0ID0gcmVzdWx0X2xvY2F0aW9uID09IFJFU1VMVF9OT05FCisgICAgICAgICAgICA/IFJFU1VMVF9OT05FCisgICAgICAgICAgICA6IFJFU1VMVF9SRVRVUk47CisgICAgICAgIGludCB0ZXN0ID0gY29tcGlsZV9uZXdfbGFiZWwoIGMgKTsKKyAgICAgICAgaW50IHRvcCA9IGNvbXBpbGVfbmV3X2xhYmVsKCBjICk7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIHJldHVybiBhbiBlbXB0eSBsaXN0IGlmIHRoZSBsb29wIHJ1bnMgemVybyB0aW1lcy4KKyAgICAgICAgICovCisgICAgICAgIGFkanVzdF9yZXN1bHQoIGMsIFJFU1VMVF9OT05FLCBuZXN0ZWRfcmVzdWx0ICk7CisgICAgICAgIC8qIEp1bXAgdG8gdGhlIGxvb3AgdGVzdC4gKi8KKyAgICAgICAgY29tcGlsZV9lbWl0X2JyYW5jaCggYywgSU5TVFJfSlVNUCwgdGVzdCApOworICAgICAgICBjb21waWxlX3NldF9sYWJlbCggYywgdG9wICk7CisgICAgICAgIC8qIEVtaXQgdGhlIGxvb3AgYm9keS4gKi8KKyAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPnJpZ2h0LCBjLCBuZXN0ZWRfcmVzdWx0ICk7CisgICAgICAgIC8qIEVtaXQgdGhlIGNvbmRpdGlvbi4gKi8KKyAgICAgICAgY29tcGlsZV9zZXRfbGFiZWwoIGMsIHRlc3QgKTsKKyAgICAgICAgY29tcGlsZV9jb25kaXRpb24oIHBhcnNlLT5sZWZ0LCBjLCAxLCB0b3AgKTsKKworICAgICAgICBhZGp1c3RfcmVzdWx0KCBjLCBuZXN0ZWRfcmVzdWx0LCByZXN1bHRfbG9jYXRpb24gKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHBhcnNlLT50eXBlID09IFBBUlNFX0lOQ0xVREUgKQorICAgIHsKKyAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPmxlZnQsIGMsIFJFU1VMVF9TVEFDSyApOworICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX0lOQ0xVREUsIDAgKTsKKyAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9CSU5EX01PRFVMRV9WQVJJQUJMRVMsIDAgKTsKKyAgICAgICAgYWRqdXN0X3Jlc3VsdCggYywgUkVTVUxUX05PTkUsIHJlc3VsdF9sb2NhdGlvbiApOworICAgIH0KKyAgICBlbHNlIGlmICggcGFyc2UtPnR5cGUgPT0gUEFSU0VfTU9EVUxFICkKKyAgICB7CisgICAgICAgIGludCBjb25zdCBuZXN0ZWRfcmVzdWx0ID0gcmVzdWx0X2xvY2F0aW9uID09IFJFU1VMVF9OT05FCisgICAgICAgICAgICA/IFJFU1VMVF9OT05FCisgICAgICAgICAgICA6IFJFU1VMVF9SRVRVUk47CisgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5sZWZ0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKyAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9QVVNIX01PRFVMRSwgMCApOworICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+cmlnaHQsIGMsIG5lc3RlZF9yZXN1bHQgKTsKKyAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9QT1BfTU9EVUxFLCAwICk7CisgICAgICAgIGFkanVzdF9yZXN1bHQoIGMsIG5lc3RlZF9yZXN1bHQsIHJlc3VsdF9sb2NhdGlvbiApOworICAgIH0KKyAgICBlbHNlIGlmICggcGFyc2UtPnR5cGUgPT0gUEFSU0VfQ0xBU1MgKQorICAgIHsKKyAgICAgICAgLyogRXZhbHVhdGUgdGhlIGNsYXNzIG5hbWUuICovCisgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5sZWZ0LT5yaWdodCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgIC8qIEV2YWx1YXRlIHRoZSBiYXNlIGNsYXNzZXMuICovCisgICAgICAgIGlmICggcGFyc2UtPmxlZnQtPmxlZnQgKQorICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPmxlZnQtPmxlZnQtPnJpZ2h0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9QVVNIX0VNUFRZLCAwICk7CisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfQ0xBU1MsIDAgKTsKKyAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPnJpZ2h0LCBjLCBSRVNVTFRfTk9ORSApOworICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX0JJTkRfTU9EVUxFX1ZBUklBQkxFUywgMCApOworICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1BPUF9NT0RVTEUsIDAgKTsKKworICAgICAgICBhZGp1c3RfcmVzdWx0KCBjLCBSRVNVTFRfTk9ORSwgcmVzdWx0X2xvY2F0aW9uICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBwYXJzZS0+dHlwZSA9PSBQQVJTRV9MSVNUICkKKyAgICB7CisgICAgICAgIE9CSkVDVCAqIGNvbnN0IG8gPSBwYXJzZS0+c3RyaW5nOworICAgICAgICBjaGFyIGNvbnN0ICogcyA9IG9iamVjdF9zdHIoIG8gKTsKKyAgICAgICAgVkFSX1BBUlNFX0dST1VQICogZ3JvdXA7CisgICAgICAgIGN1cnJlbnRfZmlsZSA9IG9iamVjdF9zdHIoIHBhcnNlLT5maWxlICk7CisgICAgICAgIGN1cnJlbnRfbGluZSA9IHBhcnNlLT5saW5lOworICAgICAgICBncm91cCA9IHBhcnNlX2V4cGFuc2lvbiggJnMgKTsKKyAgICAgICAgdmFyX3BhcnNlX2dyb3VwX2NvbXBpbGUoIGdyb3VwLCBjICk7CisgICAgICAgIHZhcl9wYXJzZV9ncm91cF9mcmVlKCBncm91cCApOworICAgICAgICBhZGp1c3RfcmVzdWx0KCBjLCBSRVNVTFRfU1RBQ0ssIHJlc3VsdF9sb2NhdGlvbiApOworICAgIH0KKyAgICBlbHNlIGlmICggcGFyc2UtPnR5cGUgPT0gUEFSU0VfTE9DQUwgKQorICAgIHsKKyAgICAgICAgaW50IG5lc3RlZF9yZXN1bHQgPSByZXN1bHRfbG9jYXRpb24gPT0gUkVTVUxUX05PTkUKKyAgICAgICAgICAgID8gUkVTVUxUX05PTkUKKyAgICAgICAgICAgIDogUkVTVUxUX1JFVFVSTjsKKyAgICAgICAgLyogVGhpcyBzaG91bGQgYmUgbGVmdCByZWN1cnNpdmUgZ3JvdXAgb2YgY29tcGlsZV9hcHBlbmRzLiAqLworICAgICAgICBQQVJTRSAqIHZhcnMgPSBwYXJzZS0+bGVmdDsKKworICAgICAgICAvKiBTcGVjaWFsIGNhc2UgYW4gZW1wdHkgbGlzdCBvZiB2YXJzICovCisgICAgICAgIGlmICggdmFycy0+dHlwZSA9PSBQQVJTRV9OVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPnJpZ2h0LCBjLCBSRVNVTFRfTk9ORSApOworICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPnRoaXJkLCBjLCByZXN1bHRfbG9jYXRpb24gKTsKKyAgICAgICAgICAgIG5lc3RlZF9yZXN1bHQgPSByZXN1bHRfbG9jYXRpb247CisgICAgICAgIH0KKyAgICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBleGFjdGx5IG9uZSB2YXJpYWJsZSB3aXRoIGEgY29uc3RhbnQgbmFtZS4gKi8KKyAgICAgICAgZWxzZSBpZiAoIHZhcnMtPmxlZnQtPnR5cGUgPT0gUEFSU0VfTlVMTCAmJgorICAgICAgICAgICAgdmFycy0+cmlnaHQtPnR5cGUgPT0gUEFSU0VfTElTVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzID0gb2JqZWN0X3N0ciggdmFycy0+cmlnaHQtPnN0cmluZyApOworICAgICAgICAgICAgVkFSX1BBUlNFX0dST1VQICogZ3JvdXA7CisgICAgICAgICAgICBjdXJyZW50X2ZpbGUgPSBvYmplY3Rfc3RyKCBwYXJzZS0+ZmlsZSApOworICAgICAgICAgICAgY3VycmVudF9saW5lID0gcGFyc2UtPmxpbmU7CisgICAgICAgICAgICBncm91cCA9IHBhcnNlX2V4cGFuc2lvbiggJnMgKTsKKyAgICAgICAgICAgIGlmICggZ3JvdXAtPmVsZW1zLT5zaXplID09IDEgJiYgZHluYW1pY19hcnJheV9hdCggVkFSX1BBUlNFICosCisgICAgICAgICAgICAgICAgZ3JvdXAtPmVsZW1zLCAwICktPnR5cGUgPT0gVkFSX1BBUlNFX1RZUEVfU1RSSU5HICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY29uc3QgbmFtZSA9IGNvbXBpbGVfZW1pdF9jb25zdGFudCggYywgKAorICAgICAgICAgICAgICAgICAgICAoVkFSX1BBUlNFX1NUUklORyAqKWR5bmFtaWNfYXJyYXlfYXQoIFZBUl9QQVJTRSAqLAorICAgICAgICAgICAgICAgICAgICBncm91cC0+ZWxlbXMsIDAgKSApLT5zICk7CisgICAgICAgICAgICAgICAgdmFyX3BhcnNlX2dyb3VwX2ZyZWUoIGdyb3VwICk7CisgICAgICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPnJpZ2h0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKyAgICAgICAgICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1BVU0hfTE9DQUwsIG5hbWUgKTsKKyAgICAgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+dGhpcmQsIGMsIG5lc3RlZF9yZXN1bHQgKTsKKyAgICAgICAgICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1BPUF9MT0NBTCwgbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcl9wYXJzZV9ncm91cF9jb21waWxlKCBncm91cCwgYyApOworICAgICAgICAgICAgICAgIHZhcl9wYXJzZV9ncm91cF9mcmVlKCBncm91cCApOworICAgICAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5yaWdodCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9QVVNIX0xPQ0FMX0dST1VQLCAwICk7CisgICAgICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPnRoaXJkLCBjLCBuZXN0ZWRfcmVzdWx0ICk7CisgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9QT1BfTE9DQUxfR1JPVVAsIDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5sZWZ0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5yaWdodCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1BVU0hfTE9DQUxfR1JPVVAsIDAgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT50aGlyZCwgYywgbmVzdGVkX3Jlc3VsdCApOworICAgICAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9QT1BfTE9DQUxfR1JPVVAsIDAgKTsKKyAgICAgICAgfQorICAgICAgICBhZGp1c3RfcmVzdWx0KCBjLCBuZXN0ZWRfcmVzdWx0LCByZXN1bHRfbG9jYXRpb24gKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHBhcnNlLT50eXBlID09IFBBUlNFX09OICkKKyAgICB7CisgICAgICAgIGlmICggcGFyc2UtPnJpZ2h0LT50eXBlID09IFBBUlNFX0FQUEVORCAmJgorICAgICAgICAgICAgcGFyc2UtPnJpZ2h0LT5sZWZ0LT50eXBlID09IFBBUlNFX05VTEwgJiYKKyAgICAgICAgICAgIHBhcnNlLT5yaWdodC0+cmlnaHQtPnR5cGUgPT0gUEFSU0VfTElTVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFsgb24gJCh0YXJnZXQpIHJldHVybiAkKHZhcmlhYmxlKSBdICovCisgICAgICAgICAgICBQQVJTRSAqIHZhbHVlID0gcGFyc2UtPnJpZ2h0LT5yaWdodDsKKyAgICAgICAgICAgIE9CSkVDVCAqIGNvbnN0IG8gPSB2YWx1ZS0+c3RyaW5nOworICAgICAgICAgICAgY2hhciBjb25zdCAqIHMgPSBvYmplY3Rfc3RyKCBvICk7CisgICAgICAgICAgICBWQVJfUEFSU0VfR1JPVVAgKiBncm91cDsKKyAgICAgICAgICAgIE9CSkVDVCAqIHZhcm5hbWUgPSAwOworICAgICAgICAgICAgY3VycmVudF9maWxlID0gb2JqZWN0X3N0ciggdmFsdWUtPmZpbGUgKTsKKyAgICAgICAgICAgIGN1cnJlbnRfbGluZSA9IHZhbHVlLT5saW5lOworICAgICAgICAgICAgZ3JvdXAgPSBwYXJzZV9leHBhbnNpb24oICZzICk7CisgICAgICAgICAgICBpZiAoIGdyb3VwLT5lbGVtcy0+c2l6ZSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWQVJfUEFSU0UgKiBvbmUgPSBkeW5hbWljX2FycmF5X2F0KCBWQVJfUEFSU0UgKiwgZ3JvdXAtPmVsZW1zLCAwICk7CisgICAgICAgICAgICAgICAgaWYgKCBvbmUtPnR5cGUgPT0gVkFSX1BBUlNFX1RZUEVfVkFSICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZBUl9QQVJTRV9WQVIgKiB2YXIgPSAoIFZBUl9QQVJTRV9WQVIgKiApb25lOworICAgICAgICAgICAgICAgICAgICBpZiAoIHZhci0+bW9kaWZpZXJzLT5zaXplID09IDAgJiYgIXZhci0+c3Vic2NyaXB0ICYmIHZhci0+bmFtZS0+ZWxlbXMtPnNpemUgPT0gMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9QQVJTRSAqIG5hbWUgPSBkeW5hbWljX2FycmF5X2F0KCBWQVJfUEFSU0UgKiwgdmFyLT5uYW1lLT5lbGVtcywgMCApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBuYW1lLT50eXBlID09IFZBUl9QQVJTRV9UWVBFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFybmFtZSA9ICggKCBWQVJfUEFSU0VfU1RSSU5HICogKW5hbWUgKS0+czsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggdmFybmFtZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBvbmUgdmFyaWFibGUgd2l0aCBhIGZpeGVkIG5hbWUgYW5kIG5vIG1vZGlmaWVycy4gKi8KKyAgICAgICAgICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+bGVmdCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9HRVRfT04sIGNvbXBpbGVfZW1pdF9jb25zdGFudCggYywgdmFybmFtZSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVG9vIGNvbXBsZXguICBGYWxsIGJhY2sgb24gcHVzaC9wb3AuICovCisgICAgICAgICAgICAgICAgaW50IGVuZCA9IGNvbXBpbGVfbmV3X2xhYmVsKCBjICk7CisgICAgICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPmxlZnQsIGMsIFJFU1VMVF9TVEFDSyApOworICAgICAgICAgICAgICAgIGNvbXBpbGVfZW1pdF9icmFuY2goIGMsIElOU1RSX1BVU0hfT04sIGVuZCApOworICAgICAgICAgICAgICAgIHZhcl9wYXJzZV9ncm91cF9jb21waWxlKCBncm91cCwgYyApOworICAgICAgICAgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfUE9QX09OLCAwICk7CisgICAgICAgICAgICAgICAgY29tcGlsZV9zZXRfbGFiZWwoIGMsIGVuZCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyX3BhcnNlX2dyb3VwX2ZyZWUoIGdyb3VwICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZW5kID0gY29tcGlsZV9uZXdfbGFiZWwoIGMgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5sZWZ0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfZW1pdF9icmFuY2goIGMsIElOU1RSX1BVU0hfT04sIGVuZCApOworICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPnJpZ2h0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfUE9QX09OLCAwICk7CisgICAgICAgICAgICBjb21waWxlX3NldF9sYWJlbCggYywgZW5kICk7CisgICAgICAgIH0KKyAgICAgICAgYWRqdXN0X3Jlc3VsdCggYywgUkVTVUxUX1NUQUNLLCByZXN1bHRfbG9jYXRpb24gKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHBhcnNlLT50eXBlID09IFBBUlNFX1JVTEUgKQorICAgIHsKKyAgICAgICAgUEFSU0UgKiBwOworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIFZBUl9QQVJTRV9HUk9VUCAqIGdyb3VwOworICAgICAgICBjaGFyIGNvbnN0ICogcyA9IG9iamVjdF9zdHIoIHBhcnNlLT5zdHJpbmcgKTsKKworICAgICAgICBpZiAoIHBhcnNlLT5sZWZ0LT5sZWZ0IHx8IHBhcnNlLT5sZWZ0LT5yaWdodC0+dHlwZSAhPSBQQVJTRV9OVUxMICkKKyAgICAgICAgICAgIGZvciAoIHAgPSBwYXJzZS0+bGVmdDsgcDsgcCA9IHAtPmxlZnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHAtPnJpZ2h0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKyAgICAgICAgICAgICAgICArK247CisgICAgICAgICAgICB9CisKKyAgICAgICAgY3VycmVudF9maWxlID0gb2JqZWN0X3N0ciggcGFyc2UtPmZpbGUgKTsKKyAgICAgICAgY3VycmVudF9saW5lID0gcGFyc2UtPmxpbmU7CisgICAgICAgIGdyb3VwID0gcGFyc2VfZXhwYW5zaW9uKCAmcyApOworCisgICAgICAgIGlmICggZ3JvdXAtPmVsZW1zLT5zaXplID09IDIgJiYKKyAgICAgICAgICAgIGR5bmFtaWNfYXJyYXlfYXQoIFZBUl9QQVJTRSAqLCBncm91cC0+ZWxlbXMsIDAgKS0+dHlwZSA9PSBWQVJfUEFSU0VfVFlQRV9WQVIgJiYKKyAgICAgICAgICAgIGR5bmFtaWNfYXJyYXlfYXQoIFZBUl9QQVJTRSAqLCBncm91cC0+ZWxlbXMsIDEgKS0+dHlwZSA9PSBWQVJfUEFSU0VfVFlQRV9TVFJJTkcgJiYKKyAgICAgICAgICAgICggb2JqZWN0X3N0ciggKCAoVkFSX1BBUlNFX1NUUklORyAqKWR5bmFtaWNfYXJyYXlfYXQoIFZBUl9QQVJTRSAqLCBncm91cC0+ZWxlbXMsIDEgKSApLT5zIClbIDAgXSA9PSAnLicgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZBUl9QQVJTRV9TVFJJTkcgKiBhY2Nlc3MgPSAoVkFSX1BBUlNFX1NUUklORyAqKWR5bmFtaWNfYXJyYXlfYXQoIFZBUl9QQVJTRSAqLCBncm91cC0+ZWxlbXMsIDEgKTsKKyAgICAgICAgICAgIE9CSkVDVCAqIG1lbWJlciA9IG9iamVjdF9uZXcoIG9iamVjdF9zdHIoIGFjY2Vzcy0+cyApICsgMSApOworICAgICAgICAgICAgLyogRW1pdCB0aGUgb2JqZWN0ICovCisgICAgICAgICAgICB2YXJfcGFyc2VfdmFyX2NvbXBpbGUoIChWQVJfUEFSU0VfVkFSICopZHluYW1pY19hcnJheV9hdCggVkFSX1BBUlNFICosIGdyb3VwLT5lbGVtcywgMCApLCBjICk7CisgICAgICAgICAgICB2YXJfcGFyc2VfZ3JvdXBfZnJlZSggZ3JvdXAgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfQ0FMTF9NRU1CRVJfUlVMRSwgbiApOworICAgICAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBjb21waWxlX2VtaXRfY29uc3RhbnQoIGMsIG1lbWJlciApLCBwYXJzZS0+bGluZSApOworICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIG1lbWJlciApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmFyX3BhcnNlX2dyb3VwX2NvbXBpbGUoIGdyb3VwLCBjICk7CisgICAgICAgICAgICB2YXJfcGFyc2VfZ3JvdXBfZnJlZSggZ3JvdXAgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfQ0FMTF9SVUxFLCBuICk7CisgICAgICAgICAgICBjb21waWxlX2VtaXQoIGMsIGNvbXBpbGVfZW1pdF9jb25zdGFudCggYywgcGFyc2UtPnN0cmluZyApLCBwYXJzZS0+bGluZSApOworICAgICAgICB9CisKKyAgICAgICAgYWRqdXN0X3Jlc3VsdCggYywgUkVTVUxUX1NUQUNLLCByZXN1bHRfbG9jYXRpb24gKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHBhcnNlLT50eXBlID09IFBBUlNFX1JVTEVTICkKKyAgICB7CisgICAgICAgIGRvIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5sZWZ0LCBjLCBSRVNVTFRfTk9ORSApOworICAgICAgICB3aGlsZSAoICggcGFyc2UgPSBwYXJzZS0+cmlnaHQgKS0+dHlwZSA9PSBQQVJTRV9SVUxFUyApOworICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZSwgYywgcmVzdWx0X2xvY2F0aW9uICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBwYXJzZS0+dHlwZSA9PSBQQVJTRV9TRVQgKQorICAgIHsKKyAgICAgICAgUEFSU0UgKiB2YXJzID0gcGFyc2UtPmxlZnQ7CisgICAgICAgIHVuc2lnbmVkIGludCBvcF9jb2RlOworICAgICAgICB1bnNpZ25lZCBpbnQgb3BfY29kZV9ncm91cDsKKworICAgICAgICBzd2l0Y2ggKCBwYXJzZS0+bnVtICkKKyAgICAgICAgeworICAgICAgICBjYXNlIEFTU0lHTl9BUFBFTkQ6IG9wX2NvZGUgPSBJTlNUUl9BUFBFTkQ7IG9wX2NvZGVfZ3JvdXAgPSBJTlNUUl9BUFBFTkRfR1JPVVA7IGJyZWFrOworICAgICAgICBjYXNlIEFTU0lHTl9ERUZBVUxUOiBvcF9jb2RlID0gSU5TVFJfREVGQVVMVDsgb3BfY29kZV9ncm91cCA9IElOU1RSX0RFRkFVTFRfR1JPVVA7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBvcF9jb2RlID0gSU5TVFJfU0VUOyBvcF9jb2RlX2dyb3VwID0gSU5TVFJfU0VUX0dST1VQOyBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZXhhY3RseSBvbmUgdmFyaWFibGUgd2l0aCBhIGNvbnN0YW50IG5hbWUuICovCisgICAgICAgIGlmICggdmFycy0+dHlwZSA9PSBQQVJTRV9MSVNUICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjb25zdCAqIHMgPSBvYmplY3Rfc3RyKCB2YXJzLT5zdHJpbmcgKTsKKyAgICAgICAgICAgIFZBUl9QQVJTRV9HUk9VUCAqIGdyb3VwOworICAgICAgICAgICAgY3VycmVudF9maWxlID0gb2JqZWN0X3N0ciggcGFyc2UtPmZpbGUgKTsKKyAgICAgICAgICAgIGN1cnJlbnRfbGluZSA9IHBhcnNlLT5saW5lOworICAgICAgICAgICAgZ3JvdXAgPSBwYXJzZV9leHBhbnNpb24oICZzICk7CisgICAgICAgICAgICBpZiAoIGdyb3VwLT5lbGVtcy0+c2l6ZSA9PSAxICYmIGR5bmFtaWNfYXJyYXlfYXQoIFZBUl9QQVJTRSAqLAorICAgICAgICAgICAgICAgIGdyb3VwLT5lbGVtcywgMCApLT50eXBlID09IFZBUl9QQVJTRV9UWVBFX1NUUklORyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNvbnN0IG5hbWUgPSBjb21waWxlX2VtaXRfY29uc3RhbnQoIGMsICgKKyAgICAgICAgICAgICAgICAgICAgKFZBUl9QQVJTRV9TVFJJTkcgKilkeW5hbWljX2FycmF5X2F0KCBWQVJfUEFSU0UgKiwKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXAtPmVsZW1zLCAwICkgKS0+cyApOworICAgICAgICAgICAgICAgIHZhcl9wYXJzZV9ncm91cF9mcmVlKCBncm91cCApOworICAgICAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5yaWdodCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgICAgICAgICAgaWYgKCByZXN1bHRfbG9jYXRpb24gIT0gUkVTVUxUX05PTkUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9TRVRfUkVTVUxULCAxICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbXBpbGVfZW1pdCggYywgb3BfY29kZSwgbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcl9wYXJzZV9ncm91cF9jb21waWxlKCBncm91cCwgYyApOworICAgICAgICAgICAgICAgIHZhcl9wYXJzZV9ncm91cF9mcmVlKCBncm91cCApOworICAgICAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5yaWdodCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgICAgICAgICAgaWYgKCByZXN1bHRfbG9jYXRpb24gIT0gUkVTVUxUX05PTkUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9TRVRfUkVTVUxULCAxICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbXBpbGVfZW1pdCggYywgb3BfY29kZV9ncm91cCwgMCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPmxlZnQsIGMsIFJFU1VMVF9TVEFDSyApOworICAgICAgICAgICAgY29tcGlsZV9wYXJzZSggcGFyc2UtPnJpZ2h0LCBjLCBSRVNVTFRfU1RBQ0sgKTsKKyAgICAgICAgICAgIGlmICggcmVzdWx0X2xvY2F0aW9uICE9IFJFU1VMVF9OT05FICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1NFVF9SRVNVTFQsIDEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXBpbGVfZW1pdCggYywgb3BfY29kZV9ncm91cCwgMCApOworICAgICAgICB9CisgICAgICAgIGlmICggcmVzdWx0X2xvY2F0aW9uICE9IFJFU1VMVF9OT05FICkKKyAgICAgICAgeworICAgICAgICAgICAgYWRqdXN0X3Jlc3VsdCggYywgUkVTVUxUX1JFVFVSTiwgcmVzdWx0X2xvY2F0aW9uICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHBhcnNlLT50eXBlID09IFBBUlNFX1NFVENPTVAgKQorICAgIHsKKyAgICAgICAgaW50IG5fYXJnczsKKyAgICAgICAgc3RydWN0IGFyZ19saXN0ICogYXJncyA9IGFyZ19saXN0X2NvbXBpbGUoIHBhcnNlLT5yaWdodCwgJm5fYXJncyApOworICAgICAgICBpbnQgY29uc3QgcnVsZV9pZCA9IGNvbXBpbGVfZW1pdF9ydWxlKCBjLCBwYXJzZS0+c3RyaW5nLCBwYXJzZS0+bGVmdCwKKyAgICAgICAgICAgIG5fYXJncywgYXJncywgcGFyc2UtPm51bSApOworICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1JVTEUsIHJ1bGVfaWQgKTsKKyAgICAgICAgYWRqdXN0X3Jlc3VsdCggYywgUkVTVUxUX05PTkUsIHJlc3VsdF9sb2NhdGlvbiApOworICAgIH0KKyAgICBlbHNlIGlmICggcGFyc2UtPnR5cGUgPT0gUEFSU0VfU0VURVhFQyApCisgICAgeworICAgICAgICBpbnQgY29uc3QgYWN0aW9uc19pZCA9IGNvbXBpbGVfZW1pdF9hY3Rpb25zKCBjLCBwYXJzZSApOworICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+bGVmdCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgIGNvbXBpbGVfZW1pdCggYywgSU5TVFJfQUNUSU9OUywgYWN0aW9uc19pZCApOworICAgICAgICBhZGp1c3RfcmVzdWx0KCBjLCBSRVNVTFRfTk9ORSwgcmVzdWx0X2xvY2F0aW9uICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBwYXJzZS0+dHlwZSA9PSBQQVJTRV9TRVRUSU5HUyApCisgICAgeworICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+bGVmdCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT50aGlyZCwgYywgUkVTVUxUX1NUQUNLICk7CisgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5yaWdodCwgYywgUkVTVUxUX1NUQUNLICk7CisKKyAgICAgICAgc3dpdGNoICggcGFyc2UtPm51bSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQVNTSUdOX0FQUEVORDogY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9BUFBFTkRfT04sIDAgKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTU0lHTl9ERUZBVUxUOiBjb21waWxlX2VtaXQoIGMsIElOU1RSX0RFRkFVTFRfT04sIDAgKTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBjb21waWxlX2VtaXQoIGMsIElOU1RSX1NFVF9PTiwgMCApOyBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGFkanVzdF9yZXN1bHQoIGMsIFJFU1VMVF9TVEFDSywgcmVzdWx0X2xvY2F0aW9uICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBwYXJzZS0+dHlwZSA9PSBQQVJTRV9TV0lUQ0ggKQorICAgIHsKKyAgICAgICAgaW50IGNvbnN0IHN3aXRjaF9lbmQgPSBjb21waWxlX25ld19sYWJlbCggYyApOworICAgICAgICBjb21waWxlX3BhcnNlKCBwYXJzZS0+bGVmdCwgYywgUkVTVUxUX1NUQUNLICk7CisKKyAgICAgICAgZm9yICggcGFyc2UgPSBwYXJzZS0+cmlnaHQ7IHBhcnNlOyBwYXJzZSA9IHBhcnNlLT5yaWdodCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb25zdCBpZCA9IGNvbXBpbGVfZW1pdF9jb25zdGFudCggYywgcGFyc2UtPmxlZnQtPnN0cmluZyApOworICAgICAgICAgICAgaW50IGNvbnN0IG5leHRfY2FzZSA9IGNvbXBpbGVfbmV3X2xhYmVsKCBjICk7CisgICAgICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1BVU0hfQ09OU1RBTlQsIGlkICk7CisgICAgICAgICAgICBjb21waWxlX2VtaXRfYnJhbmNoKCBjLCBJTlNUUl9KVU1QX05PVF9HTE9CLCBuZXh0X2Nhc2UgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLT5sZWZ0LT5sZWZ0LCBjLCByZXN1bHRfbG9jYXRpb24gKTsKKyAgICAgICAgICAgIGNvbXBpbGVfZW1pdF9icmFuY2goIGMsIElOU1RSX0pVTVAsIHN3aXRjaF9lbmQgKTsKKyAgICAgICAgICAgIGNvbXBpbGVfc2V0X2xhYmVsKCBjLCBuZXh0X2Nhc2UgKTsKKyAgICAgICAgfQorICAgICAgICBjb21waWxlX2VtaXQoIGMsIElOU1RSX1BPUCwgMCApOworICAgICAgICBhZGp1c3RfcmVzdWx0KCBjLCBSRVNVTFRfTk9ORSwgcmVzdWx0X2xvY2F0aW9uICk7CisgICAgICAgIGNvbXBpbGVfc2V0X2xhYmVsKCBjLCBzd2l0Y2hfZW5kICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBwYXJzZS0+dHlwZSA9PSBQQVJTRV9OVUxMICkKKyAgICAgICAgYWRqdXN0X3Jlc3VsdCggYywgUkVTVUxUX05PTkUsIHJlc3VsdF9sb2NhdGlvbiApOworICAgIGVsc2UKKyAgICAgICAgYXNzZXJ0KCAhInVua25vd24gUEFSU0UgdHlwZS4iICk7Cit9CisKK09CSkVDVCAqIGZ1bmN0aW9uX3J1bGVuYW1lKCBGVU5DVElPTiAqIGZ1bmN0aW9uICkKK3sKKyAgICByZXR1cm4gZnVuY3Rpb24tPnJ1bGVuYW1lOworfQorCit2b2lkIGZ1bmN0aW9uX3NldF9ydWxlbmFtZSggRlVOQ1RJT04gKiBmdW5jdGlvbiwgT0JKRUNUICogcnVsZW5hbWUgKQoreworICAgIGZ1bmN0aW9uLT5ydWxlbmFtZSA9IHJ1bGVuYW1lOworfQorCit2b2lkIGZ1bmN0aW9uX2xvY2F0aW9uKCBGVU5DVElPTiAqIGZ1bmN0aW9uXywgT0JKRUNUICogKiBmaWxlLCBpbnQgKiBsaW5lICkKK3sKKyAgICBpZiAoIGZ1bmN0aW9uXy0+dHlwZSA9PSBGVU5DVElPTl9CVUlMVElOICkKKyAgICB7CisgICAgICAgICpmaWxlID0gY29uc3RhbnRfYnVpbHRpbjsKKyAgICAgICAgKmxpbmUgPSAtMTsKKyAgICB9CisjaWZkZWYgSEFWRV9QWVRIT04KKyAgICBpZiAoIGZ1bmN0aW9uXy0+dHlwZSA9PSBGVU5DVElPTl9QWVRIT04gKQorICAgIHsKKyAgICAgICAgKmZpbGUgPSBjb25zdGFudF9idWlsdGluOworICAgICAgICAqbGluZSA9IC0xOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEpBTV9GVU5DVElPTiAqIGZ1bmN0aW9uID0gKEpBTV9GVU5DVElPTiAqKWZ1bmN0aW9uXzsKKyAgICAgICAgYXNzZXJ0KCBmdW5jdGlvbl8tPnR5cGUgPT0gRlVOQ1RJT05fSkFNICk7CisgICAgICAgICpmaWxlID0gZnVuY3Rpb24tPmZpbGU7CisgICAgICAgICpsaW5lID0gZnVuY3Rpb24tPmxpbmU7CisgICAgfQorfQorCitzdGF0aWMgc3RydWN0IGFyZ19saXN0ICogYXJnX2xpc3RfY29tcGlsZV9idWlsdGluKCBjaGFyIGNvbnN0ICogKiBhcmdzLAorICAgIGludCAqIG51bV9hcmd1bWVudHMgKTsKKworRlVOQ1RJT04gKiBmdW5jdGlvbl9idWlsdGluKCBMSVNUICogKCAqIGZ1bmMgKSggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICksCisgICAgaW50IGZsYWdzLCBjaGFyIGNvbnN0ICogKiBhcmdzICkKK3sKKyAgICBCVUlMVElOX0ZVTkNUSU9OICogcmVzdWx0ID0gQkpBTV9NQUxMT0MoIHNpemVvZiggQlVJTFRJTl9GVU5DVElPTiApICk7CisgICAgcmVzdWx0LT5iYXNlLnR5cGUgPSBGVU5DVElPTl9CVUlMVElOOworICAgIHJlc3VsdC0+YmFzZS5yZWZlcmVuY2VfY291bnQgPSAxOworICAgIHJlc3VsdC0+YmFzZS5ydWxlbmFtZSA9IDA7CisgICAgcmVzdWx0LT5iYXNlLmZvcm1hbF9hcmd1bWVudHMgPSBhcmdfbGlzdF9jb21waWxlX2J1aWx0aW4oIGFyZ3MsCisgICAgICAgICZyZXN1bHQtPmJhc2UubnVtX2Zvcm1hbF9hcmd1bWVudHMgKTsKKyAgICByZXN1bHQtPmZ1bmMgPSBmdW5jOworICAgIHJlc3VsdC0+ZmxhZ3MgPSBmbGFnczsKKyAgICByZXR1cm4gKEZVTkNUSU9OICopcmVzdWx0OworfQorCitGVU5DVElPTiAqIGZ1bmN0aW9uX2NvbXBpbGUoIFBBUlNFICogcGFyc2UgKQoreworICAgIGNvbXBpbGVyIGNbIDEgXTsKKyAgICBKQU1fRlVOQ1RJT04gKiByZXN1bHQ7CisgICAgY29tcGlsZXJfaW5pdCggYyApOworICAgIGNvbXBpbGVfcGFyc2UoIHBhcnNlLCBjLCBSRVNVTFRfUkVUVVJOICk7CisgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9SRVRVUk4sIDAgKTsKKyAgICByZXN1bHQgPSBjb21waWxlX3RvX2Z1bmN0aW9uKCBjICk7CisgICAgY29tcGlsZXJfZnJlZSggYyApOworICAgIHJlc3VsdC0+ZmlsZSA9IG9iamVjdF9jb3B5KCBwYXJzZS0+ZmlsZSApOworICAgIHJlc3VsdC0+bGluZSA9IHBhcnNlLT5saW5lOworICAgIHJldHVybiAoRlVOQ1RJT04gKilyZXN1bHQ7Cit9CisKK0ZVTkNUSU9OICogZnVuY3Rpb25fY29tcGlsZV9hY3Rpb25zKCBjaGFyIGNvbnN0ICogYWN0aW9ucywgT0JKRUNUICogZmlsZSwKKyAgICBpbnQgbGluZSApCit7CisgICAgY29tcGlsZXIgY1sgMSBdOworICAgIEpBTV9GVU5DVElPTiAqIHJlc3VsdDsKKyAgICBWQVJfUEFSU0VfQUNUSU9OUyAqIHBhcnNlOworICAgIGN1cnJlbnRfZmlsZSA9IG9iamVjdF9zdHIoIGZpbGUgKTsKKyAgICBjdXJyZW50X2xpbmUgPSBsaW5lOworICAgIHBhcnNlID0gcGFyc2VfYWN0aW9ucyggYWN0aW9ucyApOworICAgIGNvbXBpbGVyX2luaXQoIGMgKTsKKyAgICB2YXJfcGFyc2VfYWN0aW9uc19jb21waWxlKCBwYXJzZSwgYyApOworICAgIHZhcl9wYXJzZV9hY3Rpb25zX2ZyZWUoIHBhcnNlICk7CisgICAgY29tcGlsZV9lbWl0KCBjLCBJTlNUUl9SRVRVUk4sIDAgKTsKKyAgICByZXN1bHQgPSBjb21waWxlX3RvX2Z1bmN0aW9uKCBjICk7CisgICAgY29tcGlsZXJfZnJlZSggYyApOworICAgIHJlc3VsdC0+ZmlsZSA9IG9iamVjdF9jb3B5KCBmaWxlICk7CisgICAgcmVzdWx0LT5saW5lID0gbGluZTsKKyAgICByZXR1cm4gKEZVTkNUSU9OICopcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBhcmd1bWVudF9saXN0X3ByaW50KCBzdHJ1Y3QgYXJnX2xpc3QgKiBhcmdzLCBpbnQgbnVtX2FyZ3MgKTsKKworCisvKiBEZWZpbmUgZGVsaW1pdGVycyBmb3IgdHlwZSBjaGVjayBlbGVtZW50cyBpbiBhcmd1bWVudCBsaXN0cyAoYW5kIHJldHVybiB0eXBlCisgKiBzcGVjaWZpY2F0aW9ucywgZXZlbnR1YWxseSkuCisgKi8KKyMgZGVmaW5lIFRZUEVfT1BFTl9ERUxJTSAnWycKKyMgZGVmaW5lIFRZUEVfQ0xPU0VfREVMSU0gJ10nCisKKy8qCisgKiBpc190eXBlX25hbWUoKSAtIHRydWUgaWZmIHRoZSBnaXZlbiBzdHJpbmcgcmVwcmVzZW50cyBhIHR5cGUgY2hlY2sKKyAqIHNwZWNpZmljYXRpb24uCisgKi8KKworaW50IGlzX3R5cGVfbmFtZSggY2hhciBjb25zdCAqIHMgKQoreworICAgIHJldHVybiBzWyAwIF0gPT0gVFlQRV9PUEVOX0RFTElNICYmIHNbIHN0cmxlbiggcyApIC0gMSBdID09CisgICAgICAgIFRZUEVfQ0xPU0VfREVMSU07Cit9CisKK3N0YXRpYyB2b2lkIGFyZ3VtZW50X2Vycm9yKCBjaGFyIGNvbnN0ICogbWVzc2FnZSwgRlVOQ1RJT04gKiBwcm9jZWR1cmUsCisgICAgRlJBTUUgKiBmcmFtZSwgT0JKRUNUICogYXJnICkKK3sKKyAgICBleHRlcm4gdm9pZCBwcmludF9zb3VyY2VfbGluZSggRlJBTUUgKiApOworICAgIExPTCAqIGFjdHVhbCA9IGZyYW1lLT5hcmdzOworICAgIGJhY2t0cmFjZV9saW5lKCBmcmFtZS0+cHJldiApOworICAgIHByaW50ZiggIioqKiBhcmd1bWVudCBlcnJvclxuKiBydWxlICVzICggIiwgZnJhbWUtPnJ1bGVuYW1lICk7CisgICAgYXJndW1lbnRfbGlzdF9wcmludCggcHJvY2VkdXJlLT5mb3JtYWxfYXJndW1lbnRzLAorICAgICAgICBwcm9jZWR1cmUtPm51bV9mb3JtYWxfYXJndW1lbnRzICk7CisgICAgcHJpbnRmKCAiIClcbiogY2FsbGVkIHdpdGg6ICggIiApOworICAgIGxvbF9wcmludCggYWN0dWFsICk7CisgICAgcHJpbnRmKCAiIClcbiogJXMgJXNcbiIsIG1lc3NhZ2UsIGFyZyA/IG9iamVjdF9zdHIgKCBhcmcgKSA6ICIiICk7CisgICAgZnVuY3Rpb25fbG9jYXRpb24oIHByb2NlZHVyZSwgJmZyYW1lLT5maWxlLCAmZnJhbWUtPmxpbmUgKTsKKyAgICBwcmludF9zb3VyY2VfbGluZSggZnJhbWUgKTsKKyAgICBwcmludGYoICJzZWUgZGVmaW5pdGlvbiBvZiBydWxlICclcycgYmVpbmcgY2FsbGVkXG4iLCBmcmFtZS0+cnVsZW5hbWUgKTsKKyAgICBiYWNrdHJhY2UoIGZyYW1lLT5wcmV2ICk7CisgICAgZXhpdCggMSApOworfQorCitzdGF0aWMgdm9pZCB0eXBlX2NoZWNrX3JhbmdlKCBPQkpFQ1QgKiB0eXBlX25hbWUsIExJU1RJVEVSIGl0ZXIsIExJU1RJVEVSIGVuZCwKKyAgICBGUkFNRSAqIGNhbGxlciwgRlVOQ1RJT04gKiBjYWxsZWQsIE9CSkVDVCAqIGFyZ19uYW1lICkKK3sKKyAgICBzdGF0aWMgbW9kdWxlX3QgKiB0eXBlY2hlY2sgPSAwOworCisgICAgLyogSWYgbm90aGluZyB0byBjaGVjaywgYmFpbCBub3cuICovCisgICAgaWYgKCBpdGVyID09IGVuZCB8fCAhdHlwZV9uYW1lICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCAhdHlwZWNoZWNrICkKKyAgICAgICAgdHlwZWNoZWNrID0gYmluZG1vZHVsZSggY29uc3RhbnRfdHlwZWNoZWNrICk7CisKKyAgICAvKiBJZiB0aGUgY2hlY2tpbmcgcnVsZSBjYW4gbm90IGJlIGZvdW5kLCBhbHNvIGJhaWwuICovCisgICAgaWYgKCAhdHlwZWNoZWNrLT5ydWxlcyB8fCAhaGFzaF9maW5kKCB0eXBlY2hlY2stPnJ1bGVzLCB0eXBlX25hbWUgKSApCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgeworICAgICAgICBMSVNUICogZXJyb3I7CisgICAgICAgIEZSQU1FIGZyYW1lWyAxIF07CisgICAgICAgIGZyYW1lX2luaXQoIGZyYW1lICk7CisgICAgICAgIGZyYW1lLT5tb2R1bGUgPSB0eXBlY2hlY2s7CisgICAgICAgIGZyYW1lLT5wcmV2ID0gY2FsbGVyOworICAgICAgICBmcmFtZS0+cHJldl91c2VyID0gY2FsbGVyLT5tb2R1bGUtPnVzZXJfbW9kdWxlCisgICAgICAgICAgICA/IGNhbGxlcgorICAgICAgICAgICAgOiBjYWxsZXItPnByZXZfdXNlcjsKKworICAgICAgICAvKiBQcmVwYXJlIHRoZSBhcmd1bWVudCBsaXN0ICovCisgICAgICAgIGxvbF9hZGQoIGZyYW1lLT5hcmdzLCBsaXN0X25ldyggb2JqZWN0X2NvcHkoIGxpc3RfaXRlbSggaXRlciApICkgKSApOworICAgICAgICBlcnJvciA9IGV2YWx1YXRlX3J1bGUoIGJpbmRydWxlKCB0eXBlX25hbWUsIGZyYW1lLT5tb2R1bGUgKSwgdHlwZV9uYW1lLCBmcmFtZSApOworCisgICAgICAgIGlmICggIWxpc3RfZW1wdHkoIGVycm9yICkgKQorICAgICAgICAgICAgYXJndW1lbnRfZXJyb3IoIG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIGVycm9yICkgKSwgY2FsbGVkLCBjYWxsZXIsCisgICAgICAgICAgICAgICAgYXJnX25hbWUgKTsKKworICAgICAgICBmcmFtZV9mcmVlKCBmcmFtZSApOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdHlwZV9jaGVjayggT0JKRUNUICogdHlwZV9uYW1lLCBMSVNUICogdmFsdWVzLCBGUkFNRSAqIGNhbGxlciwKKyAgICBGVU5DVElPTiAqIGNhbGxlZCwgT0JKRUNUICogYXJnX25hbWUgKQoreworICAgIHR5cGVfY2hlY2tfcmFuZ2UoIHR5cGVfbmFtZSwgbGlzdF9iZWdpbiggdmFsdWVzICksIGxpc3RfZW5kKCB2YWx1ZXMgKSwKKyAgICAgICAgY2FsbGVyLCBjYWxsZWQsIGFyZ19uYW1lICk7Cit9CisKK3ZvaWQgYXJndW1lbnRfbGlzdF9jaGVjayggc3RydWN0IGFyZ19saXN0ICogZm9ybWFsLCBpbnQgZm9ybWFsX2NvdW50LAorICAgIEZVTkNUSU9OICogZnVuY3Rpb24sIEZSQU1FICogZnJhbWUgKQoreworICAgIExPTCAqIGFsbF9hY3R1YWwgPSBmcmFtZS0+YXJnczsKKyAgICBpbnQgaTsKKworICAgIGZvciAoIGkgPSAwOyBpIDwgZm9ybWFsX2NvdW50OyArK2kgKQorICAgIHsKKyAgICAgICAgTElTVCAqIGFjdHVhbCA9IGxvbF9nZXQoIGFsbF9hY3R1YWwsIGkgKTsKKyAgICAgICAgTElTVElURVIgYWN0dWFsX2l0ZXIgPSBsaXN0X2JlZ2luKCBhY3R1YWwgKTsKKyAgICAgICAgTElTVElURVIgY29uc3QgYWN0dWFsX2VuZCA9IGxpc3RfZW5kKCBhY3R1YWwgKTsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgZm9ybWFsWyBpIF0uc2l6ZTsgKytqICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGFyZ3VtZW50ICogZm9ybWFsX2FyZyA9ICZmb3JtYWxbIGkgXS5hcmdzWyBqIF07CisgICAgICAgICAgICBMSVNUICogdmFsdWU7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIGZvcm1hbF9hcmctPmZsYWdzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQVJHX09ORToKKyAgICAgICAgICAgICAgICBpZiAoIGFjdHVhbF9pdGVyID09IGFjdHVhbF9lbmQgKQorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudF9lcnJvciggIm1pc3NpbmcgYXJndW1lbnQiLCBmdW5jdGlvbiwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYWxfYXJnLT5hcmdfbmFtZSApOworICAgICAgICAgICAgICAgIHR5cGVfY2hlY2tfcmFuZ2UoIGZvcm1hbF9hcmctPnR5cGVfbmFtZSwgYWN0dWFsX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgIGxpc3RfbmV4dCggYWN0dWFsX2l0ZXIgKSwgZnJhbWUsIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICBmb3JtYWxfYXJnLT5hcmdfbmFtZSApOworICAgICAgICAgICAgICAgIGFjdHVhbF9pdGVyID0gbGlzdF9uZXh0KCBhY3R1YWxfaXRlciApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUkdfT1BUSU9OQUw6CisgICAgICAgICAgICAgICAgaWYgKCBhY3R1YWxfaXRlciA9PSBhY3R1YWxfZW5kICkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBMMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eXBlX2NoZWNrX3JhbmdlKCBmb3JtYWxfYXJnLT50eXBlX25hbWUsIGFjdHVhbF9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9uZXh0KCBhY3R1YWxfaXRlciApLCBmcmFtZSwgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYWxfYXJnLT5hcmdfbmFtZSApOworICAgICAgICAgICAgICAgICAgICBhY3R1YWxfaXRlciA9IGxpc3RfbmV4dCggYWN0dWFsX2l0ZXIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFSR19QTFVTOgorICAgICAgICAgICAgICAgIGlmICggYWN0dWFsX2l0ZXIgPT0gYWN0dWFsX2VuZCApCisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50X2Vycm9yKCAibWlzc2luZyBhcmd1bWVudCIsIGZ1bmN0aW9uLCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hbF9hcmctPmFyZ19uYW1lICk7CisgICAgICAgICAgICAgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgQVJHX1NUQVI6CisgICAgICAgICAgICAgICAgdHlwZV9jaGVja19yYW5nZSggZm9ybWFsX2FyZy0+dHlwZV9uYW1lLCBhY3R1YWxfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsX2VuZCwgZnJhbWUsIGZ1bmN0aW9uLCBmb3JtYWxfYXJnLT5hcmdfbmFtZSApOworICAgICAgICAgICAgICAgIGFjdHVhbF9pdGVyID0gYWN0dWFsX2VuZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVJHX1ZBUklBRElDOgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggYWN0dWFsX2l0ZXIgIT0gYWN0dWFsX2VuZCApCisgICAgICAgICAgICBhcmd1bWVudF9lcnJvciggImV4dHJhIGFyZ3VtZW50IiwgZnVuY3Rpb24sIGZyYW1lLCBsaXN0X2l0ZW0oCisgICAgICAgICAgICAgICAgYWN0dWFsX2l0ZXIgKSApOworICAgIH0KKworICAgIGZvciAoIDsgaSA8IGFsbF9hY3R1YWwtPmNvdW50OyArK2kgKQorICAgIHsKKyAgICAgICAgTElTVCAqIGFjdHVhbCA9IGxvbF9nZXQoIGFsbF9hY3R1YWwsIGkgKTsKKyAgICAgICAgaWYgKCAhbGlzdF9lbXB0eSggYWN0dWFsICkgKQorICAgICAgICAgICAgYXJndW1lbnRfZXJyb3IoICJleHRyYSBhcmd1bWVudCIsIGZ1bmN0aW9uLCBmcmFtZSwgbGlzdF9mcm9udCgKKyAgICAgICAgICAgICAgICBhY3R1YWwgKSApOworICAgIH0KK30KKwordm9pZCBhcmd1bWVudF9saXN0X3B1c2goIHN0cnVjdCBhcmdfbGlzdCAqIGZvcm1hbCwgaW50IGZvcm1hbF9jb3VudCwKKyAgICBGVU5DVElPTiAqIGZ1bmN0aW9uLCBGUkFNRSAqIGZyYW1lLCBTVEFDSyAqIHMgKQoreworICAgIExPTCAqIGFsbF9hY3R1YWwgPSBmcmFtZS0+YXJnczsKKyAgICBpbnQgaTsKKworICAgIGZvciAoIGkgPSAwOyBpIDwgZm9ybWFsX2NvdW50OyArK2kgKQorICAgIHsKKyAgICAgICAgTElTVCAqIGFjdHVhbCA9IGxvbF9nZXQoIGFsbF9hY3R1YWwsIGkgKTsKKyAgICAgICAgTElTVElURVIgYWN0dWFsX2l0ZXIgPSBsaXN0X2JlZ2luKCBhY3R1YWwgKTsKKyAgICAgICAgTElTVElURVIgY29uc3QgYWN0dWFsX2VuZCA9IGxpc3RfZW5kKCBhY3R1YWwgKTsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgZm9ybWFsWyBpIF0uc2l6ZTsgKytqICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGFyZ3VtZW50ICogZm9ybWFsX2FyZyA9ICZmb3JtYWxbIGkgXS5hcmdzWyBqIF07CisgICAgICAgICAgICBMSVNUICogdmFsdWU7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIGZvcm1hbF9hcmctPmZsYWdzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQVJHX09ORToKKyAgICAgICAgICAgICAgICBpZiAoIGFjdHVhbF9pdGVyID09IGFjdHVhbF9lbmQgKQorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudF9lcnJvciggIm1pc3NpbmcgYXJndW1lbnQiLCBmdW5jdGlvbiwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYWxfYXJnLT5hcmdfbmFtZSApOworICAgICAgICAgICAgICAgIHZhbHVlID0gbGlzdF9uZXcoIG9iamVjdF9jb3B5KCBsaXN0X2l0ZW0oIGFjdHVhbF9pdGVyICkgKSApOworICAgICAgICAgICAgICAgIGFjdHVhbF9pdGVyID0gbGlzdF9uZXh0KCBhY3R1YWxfaXRlciApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUkdfT1BUSU9OQUw6CisgICAgICAgICAgICAgICAgaWYgKCBhY3R1YWxfaXRlciA9PSBhY3R1YWxfZW5kICkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBMMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGxpc3RfbmV3KCBvYmplY3RfY29weSggbGlzdF9pdGVtKCBhY3R1YWxfaXRlciApICkgKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsX2l0ZXIgPSBsaXN0X25leHQoIGFjdHVhbF9pdGVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUkdfUExVUzoKKyAgICAgICAgICAgICAgICBpZiAoIGFjdHVhbF9pdGVyID09IGFjdHVhbF9lbmQgKQorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudF9lcnJvciggIm1pc3NpbmcgYXJndW1lbnQiLCBmdW5jdGlvbiwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYWxfYXJnLT5hcmdfbmFtZSApOworICAgICAgICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgICAgICAgICBjYXNlIEFSR19TVEFSOgorICAgICAgICAgICAgICAgIHZhbHVlID0gbGlzdF9jb3B5X3JhbmdlKCBhY3R1YWwsIGFjdHVhbF9pdGVyLCBhY3R1YWxfZW5kICk7CisgICAgICAgICAgICAgICAgYWN0dWFsX2l0ZXIgPSBhY3R1YWxfZW5kOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUkdfVkFSSUFESUM6CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0eXBlX2NoZWNrKCBmb3JtYWxfYXJnLT50eXBlX25hbWUsIHZhbHVlLCBmcmFtZSwgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgZm9ybWFsX2FyZy0+YXJnX25hbWUgKTsKKworICAgICAgICAgICAgaWYgKCBmb3JtYWxfYXJnLT5pbmRleCAhPSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTElTVCAqICogY29uc3Qgb2xkID0gJmZyYW1lLT5tb2R1bGUtPmZpeGVkX3ZhcmlhYmxlc1sKKyAgICAgICAgICAgICAgICAgICAgZm9ybWFsX2FyZy0+aW5kZXggXTsKKyAgICAgICAgICAgICAgICBzdGFja19wdXNoKCBzLCAqb2xkICk7CisgICAgICAgICAgICAgICAgKm9sZCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIHZhcl9zd2FwKCBmcmFtZS0+bW9kdWxlLCBmb3JtYWxfYXJnLT5hcmdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgKSApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBhY3R1YWxfaXRlciAhPSBhY3R1YWxfZW5kICkKKyAgICAgICAgICAgIGFyZ3VtZW50X2Vycm9yKCAiZXh0cmEgYXJndW1lbnQiLCBmdW5jdGlvbiwgZnJhbWUsIGxpc3RfaXRlbSgKKyAgICAgICAgICAgICAgICBhY3R1YWxfaXRlciApICk7CisgICAgfQorCisgICAgZm9yICggOyBpIDwgYWxsX2FjdHVhbC0+Y291bnQ7ICsraSApCisgICAgeworICAgICAgICBMSVNUICogY29uc3QgYWN0dWFsID0gbG9sX2dldCggYWxsX2FjdHVhbCwgaSApOworICAgICAgICBpZiAoICFsaXN0X2VtcHR5KCBhY3R1YWwgKSApCisgICAgICAgICAgICBhcmd1bWVudF9lcnJvciggImV4dHJhIGFyZ3VtZW50IiwgZnVuY3Rpb24sIGZyYW1lLCBsaXN0X2Zyb250KAorICAgICAgICAgICAgICAgIGFjdHVhbCApICk7CisgICAgfQorfQorCit2b2lkIGFyZ3VtZW50X2xpc3RfcG9wKCBzdHJ1Y3QgYXJnX2xpc3QgKiBmb3JtYWwsIGludCBmb3JtYWxfY291bnQsCisgICAgRlJBTUUgKiBmcmFtZSwgU1RBQ0sgKiBzICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gZm9ybWFsX2NvdW50IC0gMTsgaSA+PSAwOyAtLWkgKQorICAgIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoIGogPSBmb3JtYWxbIGkgXS5zaXplIC0gMTsgaiA+PSAwIDsgLS1qICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGFyZ3VtZW50ICogZm9ybWFsX2FyZyA9ICZmb3JtYWxbIGkgXS5hcmdzWyBqIF07CisKKyAgICAgICAgICAgIGlmICggZm9ybWFsX2FyZy0+ZmxhZ3MgPT0gQVJHX1ZBUklBRElDICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICggZm9ybWFsX2FyZy0+aW5kZXggIT0gLTEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExJU1QgKiBjb25zdCBvbGQgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgICAgICBMSVNUICogKiBjb25zdCBwb3MgPSAmZnJhbWUtPm1vZHVsZS0+Zml4ZWRfdmFyaWFibGVzWworICAgICAgICAgICAgICAgICAgICBmb3JtYWxfYXJnLT5pbmRleCBdOworICAgICAgICAgICAgICAgIGxpc3RfZnJlZSggKnBvcyApOworICAgICAgICAgICAgICAgICpwb3MgPSBvbGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmFyX3NldCggZnJhbWUtPm1vZHVsZSwgZm9ybWFsX2FyZy0+YXJnX25hbWUsIHN0YWNrX3BvcCggcyApLAorICAgICAgICAgICAgICAgICAgICBWQVJfU0VUICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RydWN0IGFyZ3VtZW50X2NvbXBpbGVyCit7CisgICAgc3RydWN0IGR5bmFtaWNfYXJyYXkgYXJnc1sgMSBdOworICAgIHN0cnVjdCBhcmd1bWVudCBhcmc7CisgICAgaW50IHN0YXRlOworI2RlZmluZSBBUkdVTUVOVF9DT01QSUxFUl9TVEFSVCAgICAgICAgIDAKKyNkZWZpbmUgQVJHVU1FTlRfQ09NUElMRVJfRk9VTkRfVFlQRSAgICAxCisjZGVmaW5lIEFSR1VNRU5UX0NPTVBJTEVSX0ZPVU5EX09CSkVDVCAgMgorI2RlZmluZSBBUkdVTUVOVF9DT01QSUxFUl9ET05FICAgICAgICAgIDMKK307CisKKworc3RhdGljIHZvaWQgYXJndW1lbnRfY29tcGlsZXJfaW5pdCggc3RydWN0IGFyZ3VtZW50X2NvbXBpbGVyICogYyApCit7CisgICAgZHluYW1pY19hcnJheV9pbml0KCBjLT5hcmdzICk7CisgICAgYy0+c3RhdGUgPSBBUkdVTUVOVF9DT01QSUxFUl9TVEFSVDsKK30KKworc3RhdGljIHZvaWQgYXJndW1lbnRfY29tcGlsZXJfZnJlZSggc3RydWN0IGFyZ3VtZW50X2NvbXBpbGVyICogYyApCit7CisgICAgZHluYW1pY19hcnJheV9mcmVlKCBjLT5hcmdzICk7Cit9CisKK3N0YXRpYyB2b2lkIGFyZ3VtZW50X2NvbXBpbGVyX2FkZCggc3RydWN0IGFyZ3VtZW50X2NvbXBpbGVyICogYywgT0JKRUNUICogYXJnLAorICAgIE9CSkVDVCAqIGZpbGUsIGludCBsaW5lICkKK3sKKyAgICBzd2l0Y2ggKCBjLT5zdGF0ZSApCisgICAgeworICAgIGNhc2UgQVJHVU1FTlRfQ09NUElMRVJfRk9VTkRfT0JKRUNUOgorCisgICAgICAgIGlmICggb2JqZWN0X2VxdWFsKCBhcmcsIGNvbnN0YW50X3F1ZXN0aW9uX21hcmsgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGMtPmFyZy5mbGFncyA9IEFSR19PUFRJT05BTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggb2JqZWN0X2VxdWFsKCBhcmcsIGNvbnN0YW50X3BsdXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGMtPmFyZy5mbGFncyA9IEFSR19QTFVTOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBvYmplY3RfZXF1YWwoIGFyZywgY29uc3RhbnRfc3RhciApICkKKyAgICAgICAgeworICAgICAgICAgICAgYy0+YXJnLmZsYWdzID0gQVJHX1NUQVI7CisgICAgICAgIH0KKworICAgICAgICBkeW5hbWljX2FycmF5X3B1c2goIGMtPmFyZ3MsIGMtPmFyZyApOworICAgICAgICBjLT5zdGF0ZSA9IEFSR1VNRU5UX0NPTVBJTEVSX1NUQVJUOworCisgICAgICAgIGlmICggYy0+YXJnLmZsYWdzICE9IEFSR19PTkUgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworCisgICAgY2FzZSBBUkdVTUVOVF9DT01QSUxFUl9TVEFSVDoKKworICAgICAgICBjLT5hcmcudHlwZV9uYW1lID0gMDsKKyAgICAgICAgYy0+YXJnLmluZGV4ID0gLTE7CisgICAgICAgIGMtPmFyZy5mbGFncyA9IEFSR19PTkU7CisKKyAgICAgICAgaWYgKCBpc190eXBlX25hbWUoIG9iamVjdF9zdHIoIGFyZyApICkgKQorICAgICAgICB7CisgICAgICAgICAgICBjLT5hcmcudHlwZV9uYW1lID0gb2JqZWN0X2NvcHkoIGFyZyApOworICAgICAgICAgICAgYy0+c3RhdGUgPSBBUkdVTUVOVF9DT01QSUxFUl9GT1VORF9UWVBFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisKKyAgICBjYXNlIEFSR1VNRU5UX0NPTVBJTEVSX0ZPVU5EX1RZUEU6CisKKyAgICAgICAgaWYgKCBpc190eXBlX25hbWUoIG9iamVjdF9zdHIoIGFyZyApICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoICIlczolZDogbWlzc2luZyBhcmd1bWVudCBuYW1lIGJlZm9yZSB0eXBlIG5hbWU6ICVzXG4iLAorICAgICAgICAgICAgICAgIG9iamVjdF9zdHIoIGZpbGUgKSwgbGluZSwgb2JqZWN0X3N0ciggYXJnICkgKTsKKyAgICAgICAgICAgIGV4aXQoIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGMtPmFyZy5hcmdfbmFtZSA9IG9iamVjdF9jb3B5KCBhcmcgKTsKKyAgICAgICAgaWYgKCBvYmplY3RfZXF1YWwoIGFyZywgY29uc3RhbnRfc3RhciApICkKKyAgICAgICAgeworICAgICAgICAgICAgYy0+YXJnLmZsYWdzID0gQVJHX1ZBUklBRElDOworICAgICAgICAgICAgZHluYW1pY19hcnJheV9wdXNoKCBjLT5hcmdzLCBjLT5hcmcgKTsKKyAgICAgICAgICAgIGMtPnN0YXRlID0gQVJHVU1FTlRfQ09NUElMRVJfRE9ORTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGMtPnN0YXRlID0gQVJHVU1FTlRfQ09NUElMRVJfRk9VTkRfT0JKRUNUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBUkdVTUVOVF9DT01QSUxFUl9ET05FOgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFyZ3VtZW50X2NvbXBpbGVyX3JlY3Vyc2UoIHN0cnVjdCBhcmd1bWVudF9jb21waWxlciAqIGMsCisgICAgUEFSU0UgKiBwYXJzZSApCit7CisgICAgaWYgKCBwYXJzZS0+dHlwZSA9PSBQQVJTRV9BUFBFTkQgKQorICAgIHsKKyAgICAgICAgYXJndW1lbnRfY29tcGlsZXJfcmVjdXJzZSggYywgcGFyc2UtPmxlZnQgKTsKKyAgICAgICAgYXJndW1lbnRfY29tcGlsZXJfcmVjdXJzZSggYywgcGFyc2UtPnJpZ2h0ICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBwYXJzZS0+dHlwZSAhPSBQQVJTRV9OVUxMICkKKyAgICB7CisgICAgICAgIGFzc2VydCggcGFyc2UtPnR5cGUgPT0gUEFSU0VfTElTVCApOworICAgICAgICBhcmd1bWVudF9jb21waWxlcl9hZGQoIGMsIHBhcnNlLT5zdHJpbmcsIHBhcnNlLT5maWxlLCBwYXJzZS0+bGluZSApOworICAgIH0KK30KKworc3RhdGljIHN0cnVjdCBhcmdfbGlzdCBhcmdfY29tcGlsZV9pbXBsKCBzdHJ1Y3QgYXJndW1lbnRfY29tcGlsZXIgKiBjLAorICAgIE9CSkVDVCAqIGZpbGUsIGludCBsaW5lICkKK3sKKyAgICBzdHJ1Y3QgYXJnX2xpc3QgcmVzdWx0OworICAgIHN3aXRjaCAoIGMtPnN0YXRlICkKKyAgICB7CisgICAgY2FzZSBBUkdVTUVOVF9DT01QSUxFUl9TVEFSVDoKKyAgICBjYXNlIEFSR1VNRU5UX0NPTVBJTEVSX0RPTkU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHVU1FTlRfQ09NUElMRVJfRk9VTkRfVFlQRToKKyAgICAgICAgcHJpbnRmKCAiJXM6JWQ6IG1pc3NpbmcgYXJndW1lbnQgbmFtZSBhZnRlciB0eXBlIG5hbWU6ICVzXG4iLAorICAgICAgICAgICAgb2JqZWN0X3N0ciggZmlsZSApLCBsaW5lLCBvYmplY3Rfc3RyKCBjLT5hcmcudHlwZV9uYW1lICkgKTsKKyAgICAgICAgZXhpdCggMSApOworICAgIGNhc2UgQVJHVU1FTlRfQ09NUElMRVJfRk9VTkRfT0JKRUNUOgorICAgICAgICBkeW5hbWljX2FycmF5X3B1c2goIGMtPmFyZ3MsIGMtPmFyZyApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmVzdWx0LnNpemUgPSBjLT5hcmdzLT5zaXplOworICAgIHJlc3VsdC5hcmdzID0gQkpBTV9NQUxMT0MoIGMtPmFyZ3MtPnNpemUgKiBzaXplb2YoIHN0cnVjdCBhcmd1bWVudCApICk7CisgICAgbWVtY3B5KCByZXN1bHQuYXJncywgYy0+YXJncy0+ZGF0YSwgYy0+YXJncy0+c2l6ZSAqIHNpemVvZiggc3RydWN0IGFyZ3VtZW50CisgICAgICAgICkgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGFyZ19saXN0IGFyZ19jb21waWxlKCBQQVJTRSAqIHBhcnNlICkKK3sKKyAgICBzdHJ1Y3QgYXJndW1lbnRfY29tcGlsZXIgY1sgMSBdOworICAgIHN0cnVjdCBhcmdfbGlzdCByZXN1bHQ7CisgICAgYXJndW1lbnRfY29tcGlsZXJfaW5pdCggYyApOworICAgIGFyZ3VtZW50X2NvbXBpbGVyX3JlY3Vyc2UoIGMsIHBhcnNlICk7CisgICAgcmVzdWx0ID0gYXJnX2NvbXBpbGVfaW1wbCggYywgcGFyc2UtPmZpbGUsIHBhcnNlLT5saW5lICk7CisgICAgYXJndW1lbnRfY29tcGlsZXJfZnJlZSggYyApOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCBhcmd1bWVudF9saXN0X2NvbXBpbGVyCit7CisgICAgc3RydWN0IGR5bmFtaWNfYXJyYXkgYXJnc1sgMSBdOworfTsKKworc3RhdGljIHZvaWQgYXJndW1lbnRfbGlzdF9jb21waWxlcl9pbml0KCBzdHJ1Y3QgYXJndW1lbnRfbGlzdF9jb21waWxlciAqIGMgKQoreworICAgIGR5bmFtaWNfYXJyYXlfaW5pdCggYy0+YXJncyApOworfQorCitzdGF0aWMgdm9pZCBhcmd1bWVudF9saXN0X2NvbXBpbGVyX2ZyZWUoIHN0cnVjdCBhcmd1bWVudF9saXN0X2NvbXBpbGVyICogYyApCit7CisgICAgZHluYW1pY19hcnJheV9mcmVlKCBjLT5hcmdzICk7Cit9CisKK3N0YXRpYyB2b2lkIGFyZ3VtZW50X2xpc3RfY29tcGlsZXJfYWRkKCBzdHJ1Y3QgYXJndW1lbnRfbGlzdF9jb21waWxlciAqIGMsCisgICAgUEFSU0UgKiBwYXJzZSApCit7CisgICAgc3RydWN0IGFyZ19saXN0IGFyZ3MgPSBhcmdfY29tcGlsZSggcGFyc2UgKTsKKyAgICBkeW5hbWljX2FycmF5X3B1c2goIGMtPmFyZ3MsIGFyZ3MgKTsKK30KKworc3RhdGljIHZvaWQgYXJndW1lbnRfbGlzdF9jb21waWxlcl9yZWN1cnNlKCBzdHJ1Y3QgYXJndW1lbnRfbGlzdF9jb21waWxlciAqIGMsCisgICAgUEFSU0UgKiBwYXJzZSApCit7CisgICAgaWYgKCBwYXJzZSApCisgICAgeworICAgICAgICBhcmd1bWVudF9saXN0X2NvbXBpbGVyX2FkZCggYywgcGFyc2UtPnJpZ2h0ICk7CisgICAgICAgIGFyZ3VtZW50X2xpc3RfY29tcGlsZXJfcmVjdXJzZSggYywgcGFyc2UtPmxlZnQgKTsKKyAgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXJnX2xpc3QgKiBhcmdfbGlzdF9jb21waWxlKCBQQVJTRSAqIHBhcnNlLCBpbnQgKiBudW1fYXJndW1lbnRzICkKK3sKKyAgICBpZiAoIHBhcnNlICkKKyAgICB7CisgICAgICAgIHN0cnVjdCBhcmd1bWVudF9saXN0X2NvbXBpbGVyIGNbIDEgXTsKKyAgICAgICAgc3RydWN0IGFyZ19saXN0ICogcmVzdWx0OworICAgICAgICBhcmd1bWVudF9saXN0X2NvbXBpbGVyX2luaXQoIGMgKTsKKyAgICAgICAgYXJndW1lbnRfbGlzdF9jb21waWxlcl9yZWN1cnNlKCBjLCBwYXJzZSApOworICAgICAgICAqbnVtX2FyZ3VtZW50cyA9IGMtPmFyZ3MtPnNpemU7CisgICAgICAgIHJlc3VsdCA9IEJKQU1fTUFMTE9DKCBjLT5hcmdzLT5zaXplICogc2l6ZW9mKCBzdHJ1Y3QgYXJnX2xpc3QgKSApOworICAgICAgICBtZW1jcHkoIHJlc3VsdCwgYy0+YXJncy0+ZGF0YSwgYy0+YXJncy0+c2l6ZSAqIHNpemVvZiggc3RydWN0IGFyZ19saXN0ICkKKyAgICAgICAgICAgICk7CisgICAgICAgIGFyZ3VtZW50X2xpc3RfY29tcGlsZXJfZnJlZSggYyApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAqbnVtX2FyZ3VtZW50cyA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXJnX2xpc3QgKiBhcmdfbGlzdF9jb21waWxlX2J1aWx0aW4oIGNoYXIgY29uc3QgKiAqIGFyZ3MsCisgICAgaW50ICogbnVtX2FyZ3VtZW50cyApCit7CisgICAgaWYgKCBhcmdzICkKKyAgICB7CisgICAgICAgIHN0cnVjdCBhcmd1bWVudF9saXN0X2NvbXBpbGVyIGNbIDEgXTsKKyAgICAgICAgc3RydWN0IGFyZ19saXN0ICogcmVzdWx0OworICAgICAgICBhcmd1bWVudF9saXN0X2NvbXBpbGVyX2luaXQoIGMgKTsKKyAgICAgICAgd2hpbGUgKCAqYXJncyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBhcmd1bWVudF9jb21waWxlciBhcmdfY29tcFsgMSBdOworICAgICAgICAgICAgc3RydWN0IGFyZ19saXN0IGFyZzsKKyAgICAgICAgICAgIGFyZ3VtZW50X2NvbXBpbGVyX2luaXQoIGFyZ19jb21wICk7CisgICAgICAgICAgICBmb3IgKCA7ICphcmdzOyArK2FyZ3MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9CSkVDVCAqIHRva2VuOworICAgICAgICAgICAgICAgIGlmICggc3RyY21wKCAqYXJncywgIjoiICkgPT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK2FyZ3M7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b2tlbiA9IG9iamVjdF9uZXcoICphcmdzICk7CisgICAgICAgICAgICAgICAgYXJndW1lbnRfY29tcGlsZXJfYWRkKCBhcmdfY29tcCwgdG9rZW4sIGNvbnN0YW50X2J1aWx0aW4sIC0xICk7CisgICAgICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIHRva2VuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmcgPSBhcmdfY29tcGlsZV9pbXBsKCBhcmdfY29tcCwgY29uc3RhbnRfYnVpbHRpbiwgLTEgKTsKKyAgICAgICAgICAgIGR5bmFtaWNfYXJyYXlfcHVzaCggYy0+YXJncywgYXJnICk7CisgICAgICAgICAgICBhcmd1bWVudF9jb21waWxlcl9mcmVlKCBhcmdfY29tcCApOworICAgICAgICB9CisgICAgICAgICpudW1fYXJndW1lbnRzID0gYy0+YXJncy0+c2l6ZTsKKyAgICAgICAgcmVzdWx0ID0gQkpBTV9NQUxMT0MoIGMtPmFyZ3MtPnNpemUgKiBzaXplb2YoIHN0cnVjdCBhcmdfbGlzdCApICk7CisgICAgICAgIG1lbWNweSggcmVzdWx0LCBjLT5hcmdzLT5kYXRhLCBjLT5hcmdzLT5zaXplICogc2l6ZW9mKCBzdHJ1Y3QgYXJnX2xpc3QgKQorICAgICAgICAgICAgKTsKKyAgICAgICAgYXJndW1lbnRfbGlzdF9jb21waWxlcl9mcmVlKCBjICk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICpudW1fYXJndW1lbnRzID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXJndW1lbnRfbGlzdF9wcmludCggc3RydWN0IGFyZ19saXN0ICogYXJncywgaW50IG51bV9hcmdzICkKK3sKKyAgICBpZiAoIGFyZ3MgKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgaWYgKCBpICkgcHJpbnRmKCAiIDogIiApOworICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCBhcmdzWyBpIF0uc2l6ZTsgKytqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgYXJndW1lbnQgKiBmb3JtYWxfYXJnID0gJmFyZ3NbIGkgXS5hcmdzWyBqIF07CisgICAgICAgICAgICAgICAgaWYgKCBqICkgcHJpbnRmKCAiICIgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGZvcm1hbF9hcmctPnR5cGVfbmFtZSApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiVzICIsIG9iamVjdF9zdHIoIGZvcm1hbF9hcmctPnR5cGVfbmFtZSApICk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCAiJXMiLCBvYmplY3Rfc3RyKCBmb3JtYWxfYXJnLT5hcmdfbmFtZSApICk7CisgICAgICAgICAgICAgICAgc3dpdGNoICggZm9ybWFsX2FyZy0+ZmxhZ3MgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFSR19PUFRJT05BTDogcHJpbnRmKCAiID8iICk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVJHX1BMVVM6ICAgICBwcmludGYoICIgKyIgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBUkdfU1RBUjogICAgIHByaW50ZiggIiAqIiApOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RydWN0IGFyZ19saXN0ICogYXJndW1lbnRfbGlzdF9iaW5kX3ZhcmlhYmxlcyggc3RydWN0IGFyZ19saXN0ICogZm9ybWFsLAorICAgIGludCBmb3JtYWxfY291bnQsIG1vZHVsZV90ICogbW9kdWxlLCBpbnQgKiBjb3VudGVyICkKK3sKKyAgICBpZiAoIGZvcm1hbCApCisgICAgeworICAgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKiByZXN1bHQgPSAoc3RydWN0IGFyZ19saXN0ICopQkpBTV9NQUxMT0MoIHNpemVvZigKKyAgICAgICAgICAgIHN0cnVjdCBhcmdfbGlzdCApICogZm9ybWFsX2NvdW50ICk7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZm9ybWFsX2NvdW50OyArK2kgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIHN0cnVjdCBhcmd1bWVudCAqIGFyZ3MgPSAoc3RydWN0IGFyZ3VtZW50ICopQkpBTV9NQUxMT0MoIHNpemVvZigKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgYXJndW1lbnQgKSAqIGZvcm1hbFsgaSBdLnNpemUgKTsKKyAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgZm9ybWFsWyBpIF0uc2l6ZTsgKytqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcmdzWyBqIF0gPSBmb3JtYWxbIGkgXS5hcmdzWyBqIF07CisgICAgICAgICAgICAgICAgaWYgKCBhcmdzWyBqIF0udHlwZV9uYW1lICkKKyAgICAgICAgICAgICAgICAgICAgYXJnc1sgaiBdLnR5cGVfbmFtZSA9IG9iamVjdF9jb3B5KCBhcmdzWyBqIF0udHlwZV9uYW1lICk7CisgICAgICAgICAgICAgICAgYXJnc1sgaiBdLmFyZ19uYW1lID0gb2JqZWN0X2NvcHkoIGFyZ3NbIGogXS5hcmdfbmFtZSApOworICAgICAgICAgICAgICAgIGlmICggYXJnc1sgaiBdLmZsYWdzICE9IEFSR19WQVJJQURJQyApCisgICAgICAgICAgICAgICAgICAgIGFyZ3NbIGogXS5pbmRleCA9IG1vZHVsZV9hZGRfZml4ZWRfdmFyKCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWyBqIF0uYXJnX25hbWUsIGNvdW50ZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdFsgaSBdLmFyZ3MgPSBhcmdzOworICAgICAgICAgICAgcmVzdWx0WyBpIF0uc2l6ZSA9IGZvcm1hbFsgaSBdLnNpemU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIGFyZ3VtZW50X2xpc3RfZnJlZSggc3RydWN0IGFyZ19saXN0ICogYXJncywgaW50IGFyZ3NfY291bnQgKQoreworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgYXJnc19jb3VudDsgKytpICkKKyAgICB7CisgICAgICAgIGludCBqOworICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGFyZ3NbIGkgXS5zaXplOyArK2ogKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGFyZ3NbIGkgXS5hcmdzWyBqIF0udHlwZV9uYW1lICApCisgICAgICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIGFyZ3NbIGkgXS5hcmdzWyBqIF0udHlwZV9uYW1lICk7CisgICAgICAgICAgICBvYmplY3RfZnJlZSggYXJnc1sgaSBdLmFyZ3NbIGogXS5hcmdfbmFtZSApOworICAgICAgICB9CisgICAgICAgIEJKQU1fRlJFRSggYXJnc1sgaSBdLmFyZ3MgKTsKKyAgICB9CisgICAgQkpBTV9GUkVFKCBhcmdzICk7Cit9CisKKworRlVOQ1RJT04gKiBmdW5jdGlvbl91bmJpbmRfdmFyaWFibGVzKCBGVU5DVElPTiAqIGYgKQoreworICAgIGlmICggZi0+dHlwZSA9PSBGVU5DVElPTl9KQU0gKQorICAgIHsKKyAgICAgICAgSkFNX0ZVTkNUSU9OICogY29uc3QgZnVuYyA9IChKQU1fRlVOQ1RJT04gKilmOworICAgICAgICByZXR1cm4gZnVuYy0+Z2VuZXJpYyA/IGZ1bmMtPmdlbmVyaWMgOiBmOworICAgIH0KKyNpZmRlZiBIQVZFX1BZVEhPTgorICAgIGlmICggZi0+dHlwZSA9PSBGVU5DVElPTl9QWVRIT04gKQorICAgICAgICByZXR1cm4gZjsKKyNlbmRpZgorICAgIGFzc2VydCggZi0+dHlwZSA9PSBGVU5DVElPTl9CVUlMVElOICk7CisgICAgcmV0dXJuIGY7Cit9CisKK0ZVTkNUSU9OICogZnVuY3Rpb25fYmluZF92YXJpYWJsZXMoIEZVTkNUSU9OICogZiwgbW9kdWxlX3QgKiBtb2R1bGUsCisgICAgaW50ICogY291bnRlciApCit7CisgICAgaWYgKCBmLT50eXBlID09IEZVTkNUSU9OX0JVSUxUSU4gKQorICAgICAgICByZXR1cm4gZjsKKyNpZmRlZiBIQVZFX1BZVEhPTgorICAgIGlmICggZi0+dHlwZSA9PSBGVU5DVElPTl9QWVRIT04gKQorICAgICAgICByZXR1cm4gZjsKKyNlbmRpZgorICAgIHsKKyAgICAgICAgSkFNX0ZVTkNUSU9OICogZnVuYyA9IChKQU1fRlVOQ1RJT04gKilmOworICAgICAgICBKQU1fRlVOQ1RJT04gKiBuZXdfZnVuYyA9IEJKQU1fTUFMTE9DKCBzaXplb2YoIEpBTV9GVU5DVElPTiApICk7CisgICAgICAgIGluc3RydWN0aW9uICogY29kZTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGFzc2VydCggZi0+dHlwZSA9PSBGVU5DVElPTl9KQU0gKTsKKyAgICAgICAgbWVtY3B5KCBuZXdfZnVuYywgZnVuYywgc2l6ZW9mKCBKQU1fRlVOQ1RJT04gKSApOworICAgICAgICBuZXdfZnVuYy0+YmFzZS5yZWZlcmVuY2VfY291bnQgPSAxOworICAgICAgICBuZXdfZnVuYy0+YmFzZS5mb3JtYWxfYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdF9iaW5kX3ZhcmlhYmxlcygKKyAgICAgICAgICAgIGYtPmZvcm1hbF9hcmd1bWVudHMsIGYtPm51bV9mb3JtYWxfYXJndW1lbnRzLCBtb2R1bGUsIGNvdW50ZXIgKTsKKyAgICAgICAgbmV3X2Z1bmMtPmNvZGUgPSBCSkFNX01BTExPQyggZnVuYy0+Y29kZV9zaXplICogc2l6ZW9mKCBpbnN0cnVjdGlvbiApICk7CisgICAgICAgIG1lbWNweSggbmV3X2Z1bmMtPmNvZGUsIGZ1bmMtPmNvZGUsIGZ1bmMtPmNvZGVfc2l6ZSAqIHNpemVvZigKKyAgICAgICAgICAgIGluc3RydWN0aW9uICkgKTsKKyAgICAgICAgbmV3X2Z1bmMtPmdlbmVyaWMgPSAoRlVOQ1RJT04gKilmdW5jOworICAgICAgICBmdW5jID0gbmV3X2Z1bmM7CisgICAgICAgIGZvciAoIGkgPSAwOyA7ICsraSApCisgICAgICAgIHsKKyAgICAgICAgICAgIE9CSkVDVCAqIGtleTsKKyAgICAgICAgICAgIGludCBvcF9jb2RlOworICAgICAgICAgICAgY29kZSA9IGZ1bmMtPmNvZGUgKyBpOworICAgICAgICAgICAgc3dpdGNoICggY29kZS0+b3BfY29kZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIElOU1RSX1BVU0hfVkFSOiBvcF9jb2RlID0gSU5TVFJfUFVTSF9WQVJfRklYRUQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTlNUUl9QVVNIX0xPQ0FMOiBvcF9jb2RlID0gSU5TVFJfUFVTSF9MT0NBTF9GSVhFRDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOU1RSX1BPUF9MT0NBTDogb3BfY29kZSA9IElOU1RSX1BPUF9MT0NBTF9GSVhFRDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOU1RSX1NFVDogb3BfY29kZSA9IElOU1RSX1NFVF9GSVhFRDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOU1RSX0FQUEVORDogb3BfY29kZSA9IElOU1RSX0FQUEVORF9GSVhFRDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOU1RSX0RFRkFVTFQ6IG9wX2NvZGUgPSBJTlNUUl9ERUZBVUxUX0ZJWEVEOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSU5TVFJfUkVUVVJOOiByZXR1cm4gKEZVTkNUSU9OICopbmV3X2Z1bmM7CisgICAgICAgICAgICBjYXNlIElOU1RSX0NBTExfTUVNQkVSX1JVTEU6CisgICAgICAgICAgICBjYXNlIElOU1RSX0NBTExfUlVMRTogKytpOyBjb250aW51ZTsKKyAgICAgICAgICAgIGNhc2UgSU5TVFJfUFVTSF9NT0RVTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGggPSAxOworICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICggZGVwdGggPiAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGZ1bmMtPmNvZGUgKyBpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICggY29kZS0+b3BfY29kZSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElOU1RSX1BVU0hfTU9EVUxFOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJTlNUUl9DTEFTUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2RlcHRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJTlNUUl9QT1BfTU9EVUxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZGVwdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElOU1RSX0NBTExfUlVMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2V5ID0gZnVuYy0+Y29uc3RhbnRzWyBjb2RlLT5hcmcgXTsKKyAgICAgICAgICAgIGlmICggISggb2JqZWN0X2VxdWFsKCBrZXksIGNvbnN0YW50X1RNUERJUiApIHx8CisgICAgICAgICAgICAgICAgICAgIG9iamVjdF9lcXVhbCgga2V5LCBjb25zdGFudF9UTVBOQU1FICkgfHwKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2VxdWFsKCBrZXksIGNvbnN0YW50X1RNUEZJTEUgKSB8fAorICAgICAgICAgICAgICAgICAgICBvYmplY3RfZXF1YWwoIGtleSwgY29uc3RhbnRfU1RET1VUICkgfHwKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2VxdWFsKCBrZXksIGNvbnN0YW50X1NUREVSUiApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvZGUtPm9wX2NvZGUgPSBvcF9jb2RlOworICAgICAgICAgICAgICAgIGNvZGUtPmFyZyA9IG1vZHVsZV9hZGRfZml4ZWRfdmFyKCBtb2R1bGUsIGtleSwgY291bnRlciApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZ1bmN0aW9uX3JlZmVyKCBGVU5DVElPTiAqIGZ1bmMgKQoreworICAgICsrZnVuYy0+cmVmZXJlbmNlX2NvdW50OworfQorCit2b2lkIGZ1bmN0aW9uX2ZyZWUoIEZVTkNUSU9OICogZnVuY3Rpb25fICkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmICggLS1mdW5jdGlvbl8tPnJlZmVyZW5jZV9jb3VudCAhPSAwICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCBmdW5jdGlvbl8tPmZvcm1hbF9hcmd1bWVudHMgKQorICAgICAgICBhcmd1bWVudF9saXN0X2ZyZWUoIGZ1bmN0aW9uXy0+Zm9ybWFsX2FyZ3VtZW50cywKKyAgICAgICAgICAgIGZ1bmN0aW9uXy0+bnVtX2Zvcm1hbF9hcmd1bWVudHMgKTsKKworICAgIGlmICggZnVuY3Rpb25fLT50eXBlID09IEZVTkNUSU9OX0pBTSApCisgICAgeworICAgICAgICBKQU1fRlVOQ1RJT04gKiBmdW5jID0gKEpBTV9GVU5DVElPTiAqKWZ1bmN0aW9uXzsKKworICAgICAgICBCSkFNX0ZSRUUoIGZ1bmMtPmNvZGUgKTsKKworICAgICAgICBpZiAoIGZ1bmMtPmdlbmVyaWMgKQorICAgICAgICAgICAgZnVuY3Rpb25fZnJlZSggZnVuYy0+Z2VuZXJpYyApOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZnVuY3Rpb25fLT5ydWxlbmFtZSApIG9iamVjdF9mcmVlKCBmdW5jdGlvbl8tPnJ1bGVuYW1lICk7CisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZnVuYy0+bnVtX2NvbnN0YW50czsgKytpICkKKyAgICAgICAgICAgICAgICBvYmplY3RfZnJlZSggZnVuYy0+Y29uc3RhbnRzWyBpIF0gKTsKKyAgICAgICAgICAgIEJKQU1fRlJFRSggZnVuYy0+Y29uc3RhbnRzICk7CisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZnVuYy0+bnVtX3N1YmZ1bmN0aW9uczsgKytpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3RfZnJlZSggZnVuYy0+ZnVuY3Rpb25zWyBpIF0ubmFtZSApOworICAgICAgICAgICAgICAgIGZ1bmN0aW9uX2ZyZWUoIGZ1bmMtPmZ1bmN0aW9uc1sgaSBdLmNvZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJKQU1fRlJFRSggZnVuYy0+ZnVuY3Rpb25zICk7CisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZnVuYy0+bnVtX3N1YmFjdGlvbnM7ICsraSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIGZ1bmMtPmFjdGlvbnNbIGkgXS5uYW1lICk7CisgICAgICAgICAgICAgICAgZnVuY3Rpb25fZnJlZSggZnVuYy0+YWN0aW9uc1sgaSBdLmNvbW1hbmQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJKQU1fRlJFRSggZnVuYy0+YWN0aW9ucyApOworCisgICAgICAgICAgICBvYmplY3RfZnJlZSggZnVuYy0+ZmlsZSApOworICAgICAgICB9CisgICAgfQorI2lmZGVmIEhBVkVfUFlUSE9OCisgICAgZWxzZSBpZiAoIGZ1bmN0aW9uXy0+dHlwZSA9PSBGVU5DVElPTl9QWVRIT04gKQorICAgIHsKKyAgICAgICAgUFlUSE9OX0ZVTkNUSU9OICogZnVuYyA9IChQWVRIT05fRlVOQ1RJT04gKilmdW5jdGlvbl87CisgICAgICAgIFB5X0RFQ1JFRiggZnVuYy0+cHl0aG9uX2Z1bmN0aW9uICk7CisgICAgICAgIGlmICggZnVuY3Rpb25fLT5ydWxlbmFtZSApIG9iamVjdF9mcmVlKCBmdW5jdGlvbl8tPnJ1bGVuYW1lICk7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXNzZXJ0KCBmdW5jdGlvbl8tPnR5cGUgPT0gRlVOQ1RJT05fQlVJTFRJTiApOworICAgICAgICBpZiAoIGZ1bmN0aW9uXy0+cnVsZW5hbWUgKSBvYmplY3RfZnJlZSggZnVuY3Rpb25fLT5ydWxlbmFtZSApOworICAgIH0KKworICAgIEJKQU1fRlJFRSggZnVuY3Rpb25fICk7Cit9CisKKworLyogQWxpZ25tZW50IGNoZWNrIGZvciBzdGFjayAqLworCitzdHJ1Y3QgYWxpZ25fdmFyX2VkaXRzCit7CisgICAgY2hhciBjaDsKKyAgICBWQVJfRURJVFMgZTsKK307CisKK3N0cnVjdCBhbGlnbl9leHBhbnNpb25faXRlbQoreworICAgIGNoYXIgY2g7CisgICAgZXhwYW5zaW9uX2l0ZW0gZTsKK307CisKK3N0YXRpYyBjaGFyIGNoZWNrX2FsaWduX3Zhcl9lZGl0c1sgc2l6ZW9mKHN0cnVjdCBhbGlnbl92YXJfZWRpdHMpIDw9IHNpemVvZihWQVJfRURJVFMpICsgc2l6ZW9mKHZvaWQgKikgPyAxIDogLTEgXTsKK3N0YXRpYyBjaGFyIGNoZWNrX2FsaWduX2V4cGFuc2lvbl9pdGVtWyBzaXplb2Yoc3RydWN0IGFsaWduX2V4cGFuc2lvbl9pdGVtKSA8PSBzaXplb2YoZXhwYW5zaW9uX2l0ZW0pICsgc2l6ZW9mKHZvaWQgKikgPyAxIDogLTEgXTsKKworc3RhdGljIGNoYXIgY2hlY2tfcHRyX3NpemUxWyBzaXplb2YoTElTVCAqKSA8PSBzaXplb2Yodm9pZCAqKSA/IDEgOiAtMSBdOworc3RhdGljIGNoYXIgY2hlY2tfcHRyX3NpemUyWyBzaXplb2YoY2hhciAqKSA8PSBzaXplb2Yodm9pZCAqKSA/IDEgOiAtMSBdOworCit2b2lkIGZ1bmN0aW9uX3J1bl9hY3Rpb25zKCBGVU5DVElPTiAqIGZ1bmN0aW9uLCBGUkFNRSAqIGZyYW1lLCBTVEFDSyAqIHMsCisgICAgc3RyaW5nICogb3V0ICkKK3sKKyAgICAqKHN0cmluZyAqICopc3RhY2tfYWxsb2NhdGUoIHMsIHNpemVvZiggc3RyaW5nICogKSApID0gb3V0OworICAgIGxpc3RfZnJlZSggZnVuY3Rpb25fcnVuKCBmdW5jdGlvbiwgZnJhbWUsIHMgKSApOworICAgIHN0YWNrX2RlYWxsb2NhdGUoIHMsIHNpemVvZiggc3RyaW5nICogKSApOworfQorCisvKgorICogV0FSTklORzogVGhlIGluc3RydWN0aW9uIHNldCBpcyB0dW5lZCBmb3IgSmFtIGFuZCBpcyBub3QgcmVhbGx5IGdlbmVyaWMuIEJlCisgKiBlc3BlY2lhbGx5IGNhcmVmdWwgYWJvdXQgc3RhY2sgcHVzaC9wb3AuCisgKi8KKworTElTVCAqIGZ1bmN0aW9uX3J1biggRlVOQ1RJT04gKiBmdW5jdGlvbl8sIEZSQU1FICogZnJhbWUsIFNUQUNLICogcyApCit7CisgICAgSkFNX0ZVTkNUSU9OICogZnVuY3Rpb247CisgICAgaW5zdHJ1Y3Rpb24gKiBjb2RlOworICAgIExJU1QgKiBsOworICAgIExJU1QgKiByOworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICB2b2lkICogc2F2ZWRfc3RhY2sgPSBzLT5kYXRhOworCisgICAgaWYgKCBmdW5jdGlvbl8tPnR5cGUgPT0gRlVOQ1RJT05fQlVJTFRJTiApCisgICAgeworICAgICAgICBCVUlMVElOX0ZVTkNUSU9OIGNvbnN0ICogY29uc3QgZiA9IChCVUlMVElOX0ZVTkNUSU9OICopZnVuY3Rpb25fOworICAgICAgICBpZiAoIGZ1bmN0aW9uXy0+Zm9ybWFsX2FyZ3VtZW50cyApCisgICAgICAgICAgICBhcmd1bWVudF9saXN0X2NoZWNrKCBmdW5jdGlvbl8tPmZvcm1hbF9hcmd1bWVudHMsCisgICAgICAgICAgICAgICAgZnVuY3Rpb25fLT5udW1fZm9ybWFsX2FyZ3VtZW50cywgZnVuY3Rpb25fLCBmcmFtZSApOworICAgICAgICByZXR1cm4gZi0+ZnVuYyggZnJhbWUsIGYtPmZsYWdzICk7CisgICAgfQorCisjaWZkZWYgSEFWRV9QWVRIT04KKyAgICBlbHNlIGlmICggZnVuY3Rpb25fLT50eXBlID09IEZVTkNUSU9OX1BZVEhPTiApCisgICAgeworICAgICAgICBQWVRIT05fRlVOQ1RJT04gKiBmID0gKFBZVEhPTl9GVU5DVElPTiAqKWZ1bmN0aW9uXzsKKyAgICAgICAgcmV0dXJuIGNhbGxfcHl0aG9uX2Z1bmN0aW9uKCBmLCBmcmFtZSApOworICAgIH0KKyNlbmRpZgorCisgICAgYXNzZXJ0KCBmdW5jdGlvbl8tPnR5cGUgPT0gRlVOQ1RJT05fSkFNICk7CisKKyAgICBpZiAoIGZ1bmN0aW9uXy0+Zm9ybWFsX2FyZ3VtZW50cyApCisgICAgICAgIGFyZ3VtZW50X2xpc3RfcHVzaCggZnVuY3Rpb25fLT5mb3JtYWxfYXJndW1lbnRzLAorICAgICAgICAgICAgZnVuY3Rpb25fLT5udW1fZm9ybWFsX2FyZ3VtZW50cywgZnVuY3Rpb25fLCBmcmFtZSwgcyApOworCisgICAgZnVuY3Rpb24gPSAoSkFNX0ZVTkNUSU9OICopZnVuY3Rpb25fOworICAgIGNvZGUgPSBmdW5jdGlvbi0+Y29kZTsKKyAgICBmb3IgKCA7IDsgKQorICAgIHsKKyAgICAgICAgc3dpdGNoICggY29kZS0+b3BfY29kZSApCisgICAgICAgIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBCYXNpYyBzdGFjayBtYW5pcHVsYXRpb24KKyAgICAgICAgICovCisKKyAgICAgICAgY2FzZSBJTlNUUl9QVVNIX0VNUFRZOgorICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgTDAgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5TVFJfUFVTSF9DT05TVEFOVDoKKyAgICAgICAgeworICAgICAgICAgICAgT0JKRUNUICogdmFsdWUgPSBmdW5jdGlvbl9nZXRfY29uc3RhbnQoIGZ1bmN0aW9uLCBjb2RlLT5hcmcgKTsKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIGxpc3RfbmV3KCBvYmplY3RfY29weSggdmFsdWUgKSApICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSU5TVFJfUFVTSF9BUkc6CisgICAgICAgICAgICBzdGFja19wdXNoKCBzLCBmcmFtZV9nZXRfbG9jYWwoIGZyYW1lLCBjb2RlLT5hcmcgKSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlNUUl9QVVNIX1ZBUjoKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIGZ1bmN0aW9uX2dldF92YXJpYWJsZSggZnVuY3Rpb24sIGZyYW1lLCBjb2RlLT5hcmcgKSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlNUUl9QVVNIX1ZBUl9GSVhFRDoKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIGxpc3RfY29weSggZnJhbWUtPm1vZHVsZS0+Zml4ZWRfdmFyaWFibGVzWyBjb2RlLT5hcmcKKyAgICAgICAgICAgICAgICBdICkgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5TVFJfUFVTSF9HUk9VUDoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqIHZhbHVlID0gTDA7CisgICAgICAgICAgICBMSVNUSVRFUiBpdGVyOworICAgICAgICAgICAgTElTVElURVIgZW5kOworICAgICAgICAgICAgbCA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgZm9yICggaXRlciA9IGxpc3RfYmVnaW4oIGwgKSwgZW5kID0gbGlzdF9lbmQoIGwgKTsgaXRlciAhPSBlbmQ7CisgICAgICAgICAgICAgICAgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGxpc3RfYXBwZW5kKCB2YWx1ZSwgZnVuY3Rpb25fZ2V0X25hbWVkX3ZhcmlhYmxlKAorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgZnJhbWUsIGxpc3RfaXRlbSggaXRlciApICkgKTsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggbCApOworICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgdmFsdWUgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJTlNUUl9QVVNIX0FQUEVORDoKKyAgICAgICAgICAgIHIgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIGwgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIGxpc3RfYXBwZW5kKCBsLCByICkgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5TVFJfU1dBUDoKKyAgICAgICAgICAgIGwgPSBzdGFja190b3AoIHMgKTsKKyAgICAgICAgICAgIHN0YWNrX3NldCggcywgMCwgc3RhY2tfYXQoIHMsIGNvZGUtPmFyZyApICk7CisgICAgICAgICAgICBzdGFja19zZXQoIHMsIGNvZGUtPmFyZywgbCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlNUUl9QT1A6CisgICAgICAgICAgICBsaXN0X2ZyZWUoIHN0YWNrX3BvcCggcyApICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKgorICAgICAgICAgKiBCcmFuY2ggaW5zdHJ1Y3Rpb25zCisgICAgICAgICAqLworCisgICAgICAgIGNhc2UgSU5TVFJfSlVNUDoKKyAgICAgICAgICAgIGNvZGUgKz0gY29kZS0+YXJnOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlNUUl9KVU1QX0VNUFRZOgorICAgICAgICAgICAgbCA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgaWYgKCAhbGlzdF9jbXAoIGwsIEwwICkgKSBjb2RlICs9IGNvZGUtPmFyZzsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggbCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlNUUl9KVU1QX05PVF9FTVBUWToKKyAgICAgICAgICAgIGwgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIGlmICggbGlzdF9jbXAoIGwsIEwwICkgKSBjb2RlICs9IGNvZGUtPmFyZzsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggbCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlNUUl9KVU1QX0xUOgorICAgICAgICAgICAgciA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgbCA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgaWYgKCBsaXN0X2NtcCggbCwgciApIDwgMCApIGNvZGUgKz0gY29kZS0+YXJnOworICAgICAgICAgICAgbGlzdF9mcmVlKCBsICk7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIHIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5TVFJfSlVNUF9MRToKKyAgICAgICAgICAgIHIgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIGwgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIGlmICggbGlzdF9jbXAoIGwsIHIgKSA8PSAwICkgY29kZSArPSBjb2RlLT5hcmc7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIGwgKTsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggciApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlNUUl9KVU1QX0dUOgorICAgICAgICAgICAgciA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgbCA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgaWYgKCBsaXN0X2NtcCggbCwgciApID4gMCApIGNvZGUgKz0gY29kZS0+YXJnOworICAgICAgICAgICAgbGlzdF9mcmVlKCBsICk7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIHIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5TVFJfSlVNUF9HRToKKyAgICAgICAgICAgIHIgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIGwgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIGlmICggbGlzdF9jbXAoIGwsIHIgKSA+PSAwICkgY29kZSArPSBjb2RlLT5hcmc7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIGwgKTsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggciApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlNUUl9KVU1QX0VROgorICAgICAgICAgICAgciA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgbCA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgaWYgKCBsaXN0X2NtcCggbCwgciApID09IDAgKSBjb2RlICs9IGNvZGUtPmFyZzsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggbCApOworICAgICAgICAgICAgbGlzdF9mcmVlKCByICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOU1RSX0pVTVBfTkU6CisgICAgICAgICAgICByID0gc3RhY2tfcG9wKHMpOworICAgICAgICAgICAgbCA9IHN0YWNrX3BvcChzKTsKKyAgICAgICAgICAgIGlmICggbGlzdF9jbXAobCwgcikgIT0gMCApIGNvZGUgKz0gY29kZS0+YXJnOworICAgICAgICAgICAgbGlzdF9mcmVlKGwpOworICAgICAgICAgICAgbGlzdF9mcmVlKHIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlNUUl9KVU1QX0lOOgorICAgICAgICAgICAgciA9IHN0YWNrX3BvcChzKTsKKyAgICAgICAgICAgIGwgPSBzdGFja19wb3Aocyk7CisgICAgICAgICAgICBpZiAoIGxpc3RfaXNfc3VibGlzdCggbCwgciApICkgY29kZSArPSBjb2RlLT5hcmc7CisgICAgICAgICAgICBsaXN0X2ZyZWUobCk7CisgICAgICAgICAgICBsaXN0X2ZyZWUocik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOU1RSX0pVTVBfTk9UX0lOOgorICAgICAgICAgICAgciA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgbCA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgaWYgKCAhbGlzdF9pc19zdWJsaXN0KCBsLCByICkgKSBjb2RlICs9IGNvZGUtPmFyZzsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggbCApOworICAgICAgICAgICAgbGlzdF9mcmVlKCByICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IKKyAgICAgICAgICovCisKKyAgICAgICAgY2FzZSBJTlNUUl9GT1JfSU5JVDoKKyAgICAgICAgICAgIGwgPSBzdGFja190b3AoIHMgKTsKKyAgICAgICAgICAgICooTElTVElURVIgKilzdGFja19hbGxvY2F0ZSggcywgc2l6ZW9mKCBMSVNUSVRFUiApICkgPQorICAgICAgICAgICAgICAgIGxpc3RfYmVnaW4oIGwgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5TVFJfRk9SX0xPT1A6CisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIgPSAqKExJU1RJVEVSICopc3RhY2tfZ2V0KCBzICk7CisgICAgICAgICAgICBzdGFja19kZWFsbG9jYXRlKCBzLCBzaXplb2YoIExJU1RJVEVSICkgKTsKKyAgICAgICAgICAgIGwgPSBzdGFja190b3AoIHMgKTsKKyAgICAgICAgICAgIGlmICggaXRlciA9PSBsaXN0X2VuZCggbCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0X2ZyZWUoIHN0YWNrX3BvcCggcyApICk7CisgICAgICAgICAgICAgICAgY29kZSArPSBjb2RlLT5hcmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgciA9IGxpc3RfbmV3KCBvYmplY3RfY29weSggbGlzdF9pdGVtKCBpdGVyICkgKSApOworICAgICAgICAgICAgICAgIGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKTsKKyAgICAgICAgICAgICAgICAqKExJU1RJVEVSICopc3RhY2tfYWxsb2NhdGUoIHMsIHNpemVvZiggTElTVElURVIgKSApID0gaXRlcjsKKyAgICAgICAgICAgICAgICBzdGFja19wdXNoKCBzLCByICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFN3aXRjaAorICAgICAgICAgKi8KKworICAgICAgICBjYXNlIElOU1RSX0pVTVBfTk9UX0dMT0I6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBwYXR0ZXJuOworICAgICAgICAgICAgY2hhciBjb25zdCAqIG1hdGNoOworICAgICAgICAgICAgbCA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgciA9IHN0YWNrX3RvcCggcyApOworICAgICAgICAgICAgcGF0dGVybiA9IGxpc3RfZW1wdHkoIGwgKSA/ICIiIDogb2JqZWN0X3N0ciggbGlzdF9mcm9udCggbCApICk7CisgICAgICAgICAgICBtYXRjaCA9IGxpc3RfZW1wdHkoIHIgKSA/ICIiIDogb2JqZWN0X3N0ciggbGlzdF9mcm9udCggciApICk7CisgICAgICAgICAgICBpZiAoIGdsb2IoIHBhdHRlcm4sIG1hdGNoICkgKQorICAgICAgICAgICAgICAgIGNvZGUgKz0gY29kZS0+YXJnOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxpc3RfZnJlZSggc3RhY2tfcG9wKCBzICkgKTsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggbCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBSZXR1cm4KKyAgICAgICAgICovCisKKyAgICAgICAgY2FzZSBJTlNUUl9TRVRfUkVTVUxUOgorICAgICAgICAgICAgbGlzdF9mcmVlKCByZXN1bHQgKTsKKyAgICAgICAgICAgIGlmICggIWNvZGUtPmFyZyApCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdF9jb3B5KCBzdGFja190b3AoIHMgKSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlNUUl9QVVNIX1JFU1VMVDoKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIHJlc3VsdCApOworICAgICAgICAgICAgcmVzdWx0ID0gTDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOU1RSX1JFVFVSTjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBmdW5jdGlvbl8tPmZvcm1hbF9hcmd1bWVudHMgKQorICAgICAgICAgICAgICAgIGFyZ3VtZW50X2xpc3RfcG9wKCBmdW5jdGlvbl8tPmZvcm1hbF9hcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uXy0+bnVtX2Zvcm1hbF9hcmd1bWVudHMsIGZyYW1lLCBzICk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgaWYgKCAhKCBzYXZlZF9zdGFjayA9PSBzLT5kYXRhICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyYW1lLT5maWxlID0gZnVuY3Rpb24tPmZpbGU7CisgICAgICAgICAgICAgICAgZnJhbWUtPmxpbmUgPSBmdW5jdGlvbi0+bGluZTsKKyAgICAgICAgICAgICAgICBiYWNrdHJhY2VfbGluZSggZnJhbWUgKTsKKyAgICAgICAgICAgICAgICBwcmludGYoICJlcnJvcjogc3RhY2sgY2hlY2sgZmFpbGVkLlxuIiApOworICAgICAgICAgICAgICAgIGJhY2t0cmFjZSggZnJhbWUgKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHNhdmVkX3N0YWNrID09IHMtPmRhdGEgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgYXNzZXJ0KCBzYXZlZF9zdGFjayA9PSBzLT5kYXRhICk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTG9jYWwgdmFyaWFibGVzCisgICAgICAgICAqLworCisgICAgICAgIGNhc2UgSU5TVFJfUFVTSF9MT0NBTDoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqIHZhbHVlID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBzdGFja19wdXNoKCBzLCBmdW5jdGlvbl9zd2FwX3ZhcmlhYmxlKCBmdW5jdGlvbiwgZnJhbWUsIGNvZGUtPmFyZywKKyAgICAgICAgICAgICAgICB2YWx1ZSApICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSU5TVFJfUE9QX0xPQ0FMOgorICAgICAgICAgICAgZnVuY3Rpb25fc2V0X3ZhcmlhYmxlKCBmdW5jdGlvbiwgZnJhbWUsIGNvZGUtPmFyZywgc3RhY2tfcG9wKCBzICkgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5TVFJfUFVTSF9MT0NBTF9GSVhFRDoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqIHZhbHVlID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBMSVNUICogKiBwdHIgPSAmZnJhbWUtPm1vZHVsZS0+Zml4ZWRfdmFyaWFibGVzWyBjb2RlLT5hcmcgXTsKKyAgICAgICAgICAgIGFzc2VydCggY29kZS0+YXJnIDwgZnJhbWUtPm1vZHVsZS0+bnVtX2ZpeGVkX3ZhcmlhYmxlcyApOworICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgKnB0ciApOworICAgICAgICAgICAgKnB0ciA9IHZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX1BPUF9MT0NBTF9GSVhFRDoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqIHZhbHVlID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBMSVNUICogKiBwdHIgPSAmZnJhbWUtPm1vZHVsZS0+Zml4ZWRfdmFyaWFibGVzWyBjb2RlLT5hcmcgXTsKKyAgICAgICAgICAgIGFzc2VydCggY29kZS0+YXJnIDwgZnJhbWUtPm1vZHVsZS0+bnVtX2ZpeGVkX3ZhcmlhYmxlcyApOworICAgICAgICAgICAgbGlzdF9mcmVlKCAqcHRyICk7CisgICAgICAgICAgICAqcHRyID0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSU5TVFJfUFVTSF9MT0NBTF9HUk9VUDoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqIGNvbnN0IHZhbHVlID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBMSVNUSVRFUiBpdGVyOworICAgICAgICAgICAgTElTVElURVIgZW5kOworICAgICAgICAgICAgbCA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgZm9yICggaXRlciA9IGxpc3RfYmVnaW4oIGwgKSwgZW5kID0gbGlzdF9lbmQoIGwgKTsgaXRlciAhPSBlbmQ7CisgICAgICAgICAgICAgICAgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgICAgICBzdGFja19wdXNoKCBzLCBmdW5jdGlvbl9zd2FwX25hbWVkX3ZhcmlhYmxlKCBmdW5jdGlvbiwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgIGxpc3RfaXRlbSggaXRlciApLCBsaXN0X2NvcHkoIHZhbHVlICkgKSApOworICAgICAgICAgICAgbGlzdF9mcmVlKCB2YWx1ZSApOworICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgbCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX1BPUF9MT0NBTF9HUk9VUDoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVElURVIgaXRlcjsKKyAgICAgICAgICAgIExJU1RJVEVSIGVuZDsKKyAgICAgICAgICAgIHIgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIGwgPSBsaXN0X3JldmVyc2UoIHIgKTsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggciApOworICAgICAgICAgICAgZm9yICggaXRlciA9IGxpc3RfYmVnaW4oIGwgKSwgZW5kID0gbGlzdF9lbmQoIGwgKTsgaXRlciAhPSBlbmQ7CisgICAgICAgICAgICAgICAgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgICAgICBmdW5jdGlvbl9zZXRfbmFtZWRfdmFyaWFibGUoIGZ1bmN0aW9uLCBmcmFtZSwgbGlzdF9pdGVtKCBpdGVyICksCisgICAgICAgICAgICAgICAgICAgIHN0YWNrX3BvcCggcyApICk7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIGwgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogb24gJChUQVJHRVQpIHZhcmlhYmxlcworICAgICAgICAgKi8KKworICAgICAgICBjYXNlIElOU1RSX1BVU0hfT046CisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1QgKiB0YXJnZXRzID0gc3RhY2tfdG9wKCBzICk7CisgICAgICAgICAgICBpZiAoICFsaXN0X2VtcHR5KCB0YXJnZXRzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBwdXNoIHRoZSBzdGF0ZSBvbnRvIHRoZSBzdGFjayBpbnN0ZWFkIG9mIHVzaW5nCisgICAgICAgICAgICAgICAgICogcHVzaHNldHRpbmdzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFRBUkdFVCAqIHQgPSBiaW5kdGFyZ2V0KCBsaXN0X2Zyb250KCB0YXJnZXRzICkgKTsKKyAgICAgICAgICAgICAgICBwdXNoc2V0dGluZ3MoIGZyYW1lLT5tb2R1bGUsIHQtPnNldHRpbmdzICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogWyBvbiAkKFRBUkdFVCkgLi4uIF0gaXMgaWdub3JlZCBpZiAkKFRBUkdFVCkgaXMgZW1wdHkuICovCisgICAgICAgICAgICAgICAgbGlzdF9mcmVlKCBzdGFja19wb3AoIHMgKSApOworICAgICAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIEwwICk7CisgICAgICAgICAgICAgICAgY29kZSArPSBjb2RlLT5hcmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSU5TVFJfUE9QX09OOgorICAgICAgICB7CisgICAgICAgICAgICBMSVNUICogcmVzdWx0ID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBMSVNUICogdGFyZ2V0cyA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgaWYgKCAhbGlzdF9lbXB0eSggdGFyZ2V0cyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQVJHRVQgKiB0ID0gYmluZHRhcmdldCggbGlzdF9mcm9udCggdGFyZ2V0cyApICk7CisgICAgICAgICAgICAgICAgcG9wc2V0dGluZ3MoIGZyYW1lLT5tb2R1bGUsIHQtPnNldHRpbmdzICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0X2ZyZWUoIHRhcmdldHMgKTsKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIHJlc3VsdCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX1NFVF9PTjoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqIHRhcmdldHMgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIExJU1QgKiB2YWx1ZSA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgTElTVCAqIHZhcnMgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCB0YXJnZXRzICk7CisgICAgICAgICAgICBMSVNUSVRFUiBjb25zdCBlbmQgPSBsaXN0X2VuZCggdGFyZ2V0cyApOworICAgICAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQVJHRVQgKiB0ID0gYmluZHRhcmdldCggbGlzdF9pdGVtKCBpdGVyICkgKTsKKyAgICAgICAgICAgICAgICBMSVNUSVRFUiB2YXJzX2l0ZXIgPSBsaXN0X2JlZ2luKCB2YXJzICk7CisgICAgICAgICAgICAgICAgTElTVElURVIgY29uc3QgdmFyc19lbmQgPSBsaXN0X2VuZCggdmFycyApOworICAgICAgICAgICAgICAgIGZvciAoIDsgdmFyc19pdGVyICE9IHZhcnNfZW5kOyB2YXJzX2l0ZXIgPSBsaXN0X25leHQoIHZhcnNfaXRlcgorICAgICAgICAgICAgICAgICAgICApICkKKyAgICAgICAgICAgICAgICAgICAgdC0+c2V0dGluZ3MgPSBhZGRzZXR0aW5ncyggdC0+c2V0dGluZ3MsIFZBUl9TRVQsIGxpc3RfaXRlbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcnNfaXRlciApLCBsaXN0X2NvcHkoIHZhbHVlICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RfZnJlZSggdmFycyApOworICAgICAgICAgICAgbGlzdF9mcmVlKCB0YXJnZXRzICk7CisgICAgICAgICAgICBzdGFja19wdXNoKCBzLCB2YWx1ZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX0FQUEVORF9PTjoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqIHRhcmdldHMgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIExJU1QgKiB2YWx1ZSA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgTElTVCAqIHZhcnMgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCB0YXJnZXRzICk7CisgICAgICAgICAgICBMSVNUSVRFUiBjb25zdCBlbmQgPSBsaXN0X2VuZCggdGFyZ2V0cyApOworICAgICAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQVJHRVQgKiBjb25zdCB0ID0gYmluZHRhcmdldCggbGlzdF9pdGVtKCBpdGVyICkgKTsKKyAgICAgICAgICAgICAgICBMSVNUSVRFUiB2YXJzX2l0ZXIgPSBsaXN0X2JlZ2luKCB2YXJzICk7CisgICAgICAgICAgICAgICAgTElTVElURVIgY29uc3QgdmFyc19lbmQgPSBsaXN0X2VuZCggdmFycyApOworICAgICAgICAgICAgICAgIGZvciAoIDsgdmFyc19pdGVyICE9IHZhcnNfZW5kOyB2YXJzX2l0ZXIgPSBsaXN0X25leHQoIHZhcnNfaXRlcgorICAgICAgICAgICAgICAgICAgICApICkKKyAgICAgICAgICAgICAgICAgICAgdC0+c2V0dGluZ3MgPSBhZGRzZXR0aW5ncyggdC0+c2V0dGluZ3MsIFZBUl9BUFBFTkQsCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2l0ZW0oIHZhcnNfaXRlciApLCBsaXN0X2NvcHkoIHZhbHVlICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RfZnJlZSggdmFycyApOworICAgICAgICAgICAgbGlzdF9mcmVlKCB0YXJnZXRzICk7CisgICAgICAgICAgICBzdGFja19wdXNoKCBzLCB2YWx1ZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX0RFRkFVTFRfT046CisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1QgKiB0YXJnZXRzID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBMSVNUICogdmFsdWUgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIExJU1QgKiB2YXJzID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggdGFyZ2V0cyApOworICAgICAgICAgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIHRhcmdldHMgKTsKKyAgICAgICAgICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVEFSR0VUICogdCA9IGJpbmR0YXJnZXQoIGxpc3RfaXRlbSggaXRlciApICk7CisgICAgICAgICAgICAgICAgTElTVElURVIgdmFyc19pdGVyID0gbGlzdF9iZWdpbiggdmFycyApOworICAgICAgICAgICAgICAgIExJU1RJVEVSIGNvbnN0IHZhcnNfZW5kID0gbGlzdF9lbmQoIHZhcnMgKTsKKyAgICAgICAgICAgICAgICBmb3IgKCA7IHZhcnNfaXRlciAhPSB2YXJzX2VuZDsgdmFyc19pdGVyID0gbGlzdF9uZXh0KCB2YXJzX2l0ZXIKKyAgICAgICAgICAgICAgICAgICAgKSApCisgICAgICAgICAgICAgICAgICAgIHQtPnNldHRpbmdzID0gYWRkc2V0dGluZ3MoIHQtPnNldHRpbmdzLCBWQVJfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaXRlbSggdmFyc19pdGVyICksIGxpc3RfY29weSggdmFsdWUgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdF9mcmVlKCB2YXJzICk7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIHRhcmdldHMgKTsKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIHZhbHVlICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFsgb24gJCh0YXJnZXQpIHJldHVybiAkKHZhcmlhYmxlKSBdICovCisgICAgICAgIGNhc2UgSU5TVFJfR0VUX09OOgorICAgICAgICB7CisgICAgICAgICAgICBMSVNUICogdGFyZ2V0cyA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgTElTVCAqIHJlc3VsdCA9IEwwOworICAgICAgICAgICAgaWYgKCAhbGlzdF9lbXB0eSggdGFyZ2V0cyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPQkpFQ1QgKiB2YXJuYW1lID0gZnVuY3Rpb24tPmNvbnN0YW50c1sgY29kZS0+YXJnIF07CisgICAgICAgICAgICAgICAgVEFSR0VUICogdCA9IGJpbmR0YXJnZXQoIGxpc3RfZnJvbnQoIHRhcmdldHMgKSApOworICAgICAgICAgICAgICAgIFNFVFRJTkdTICogcyA9IHQtPnNldHRpbmdzOworICAgICAgICAgICAgICAgIGludCBmb3VuZCA9IDA7CisgICAgICAgICAgICAgICAgZm9yICggOyBzICE9IDA7IHMgPSBzLT5uZXh0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggb2JqZWN0X2VxdWFsKCBzLT5zeW1ib2wsIHZhcm5hbWUgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHMtPnZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCAhZm91bmQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFyX2dldCggZnJhbWUtPm1vZHVsZSwgdmFybmFtZSApIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFja19wdXNoKCBzLCBsaXN0X2NvcHkoIHJlc3VsdCApICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFZhcmlhYmxlIHNldHRpbmcKKyAgICAgICAgICovCisKKyAgICAgICAgY2FzZSBJTlNUUl9TRVQ6CisgICAgICAgICAgICBmdW5jdGlvbl9zZXRfdmFyaWFibGUoIGZ1bmN0aW9uLCBmcmFtZSwgY29kZS0+YXJnLAorICAgICAgICAgICAgICAgIHN0YWNrX3BvcCggcyApICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOU1RSX0FQUEVORDoKKyAgICAgICAgICAgIGZ1bmN0aW9uX2FwcGVuZF92YXJpYWJsZSggZnVuY3Rpb24sIGZyYW1lLCBjb2RlLT5hcmcsCisgICAgICAgICAgICAgICAgc3RhY2tfcG9wKCBzICkgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5TVFJfREVGQVVMVDoKKyAgICAgICAgICAgIGZ1bmN0aW9uX2RlZmF1bHRfdmFyaWFibGUoIGZ1bmN0aW9uLCBmcmFtZSwgY29kZS0+YXJnLAorICAgICAgICAgICAgICAgIHN0YWNrX3BvcCggcyApICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOU1RSX1NFVF9GSVhFRDoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqICogcHRyID0gJmZyYW1lLT5tb2R1bGUtPmZpeGVkX3ZhcmlhYmxlc1sgY29kZS0+YXJnIF07CisgICAgICAgICAgICBhc3NlcnQoIGNvZGUtPmFyZyA8IGZyYW1lLT5tb2R1bGUtPm51bV9maXhlZF92YXJpYWJsZXMgKTsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggKnB0ciApOworICAgICAgICAgICAgKnB0ciA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX0FQUEVORF9GSVhFRDoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqICogcHRyID0gJmZyYW1lLT5tb2R1bGUtPmZpeGVkX3ZhcmlhYmxlc1sgY29kZS0+YXJnIF07CisgICAgICAgICAgICBhc3NlcnQoIGNvZGUtPmFyZyA8IGZyYW1lLT5tb2R1bGUtPm51bV9maXhlZF92YXJpYWJsZXMgKTsKKyAgICAgICAgICAgICpwdHIgPSBsaXN0X2FwcGVuZCggKnB0ciwgc3RhY2tfcG9wKCBzICkgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJTlNUUl9ERUZBVUxUX0ZJWEVEOgorICAgICAgICB7CisgICAgICAgICAgICBMSVNUICogKiBwdHIgPSAmZnJhbWUtPm1vZHVsZS0+Zml4ZWRfdmFyaWFibGVzWyBjb2RlLT5hcmcgXTsKKyAgICAgICAgICAgIExJU1QgKiB2YWx1ZSA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgYXNzZXJ0KCBjb2RlLT5hcmcgPCBmcmFtZS0+bW9kdWxlLT5udW1fZml4ZWRfdmFyaWFibGVzICk7CisgICAgICAgICAgICBpZiAoIGxpc3RfZW1wdHkoICpwdHIgKSApCisgICAgICAgICAgICAgICAgKnB0ciA9IHZhbHVlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxpc3RfZnJlZSggdmFsdWUgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJTlNUUl9TRVRfR1JPVVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1QgKiB2YWx1ZSA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgTElTVCAqIHZhcnMgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCB2YXJzICk7CisgICAgICAgICAgICBMSVNUSVRFUiBjb25zdCBlbmQgPSBsaXN0X2VuZCggdmFycyApOworICAgICAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgICAgICBmdW5jdGlvbl9zZXRfbmFtZWRfdmFyaWFibGUoIGZ1bmN0aW9uLCBmcmFtZSwgbGlzdF9pdGVtKCBpdGVyICksCisgICAgICAgICAgICAgICAgICAgIGxpc3RfY29weSggdmFsdWUgKSApOworICAgICAgICAgICAgbGlzdF9mcmVlKCB2YXJzICk7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIHZhbHVlICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSU5TVFJfQVBQRU5EX0dST1VQOgorICAgICAgICB7CisgICAgICAgICAgICBMSVNUICogdmFsdWUgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIExJU1QgKiB2YXJzID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggdmFycyApOworICAgICAgICAgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIHZhcnMgKTsKKyAgICAgICAgICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgICAgICAgICAgZnVuY3Rpb25fYXBwZW5kX25hbWVkX3ZhcmlhYmxlKCBmdW5jdGlvbiwgZnJhbWUsIGxpc3RfaXRlbSggaXRlcgorICAgICAgICAgICAgICAgICAgICApLCBsaXN0X2NvcHkoIHZhbHVlICkgKTsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggdmFycyApOworICAgICAgICAgICAgbGlzdF9mcmVlKCB2YWx1ZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX0RFRkFVTFRfR1JPVVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1QgKiB2YWx1ZSA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgTElTVCAqIHZhcnMgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCB2YXJzICk7CisgICAgICAgICAgICBMSVNUSVRFUiBjb25zdCBlbmQgPSBsaXN0X2VuZCggdmFycyApOworICAgICAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgICAgICBmdW5jdGlvbl9kZWZhdWx0X25hbWVkX3ZhcmlhYmxlKCBmdW5jdGlvbiwgZnJhbWUsIGxpc3RfaXRlbSgKKyAgICAgICAgICAgICAgICAgICAgaXRlciApLCBsaXN0X2NvcHkoIHZhbHVlICkgKTsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggdmFycyApOworICAgICAgICAgICAgbGlzdF9mcmVlKCB2YWx1ZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBSdWxlcworICAgICAgICAgKi8KKworICAgICAgICBjYXNlIElOU1RSX0NBTExfUlVMRToKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjb25zdCAqIHVuZXhwYW5kZWQgPSBvYmplY3Rfc3RyKCBmdW5jdGlvbl9nZXRfY29uc3RhbnQoCisgICAgICAgICAgICAgICAgZnVuY3Rpb24sIGNvZGVbIDEgXS5vcF9jb2RlICkgKTsKKyAgICAgICAgICAgIExJU1QgKiByZXN1bHQgPSBmdW5jdGlvbl9jYWxsX3J1bGUoIGZ1bmN0aW9uLCBmcmFtZSwgcywgY29kZS0+YXJnLAorICAgICAgICAgICAgICAgIHVuZXhwYW5kZWQsIGZ1bmN0aW9uLT5maWxlLCBjb2RlWyAxIF0uYXJnICk7CisgICAgICAgICAgICBzdGFja19wdXNoKCBzLCByZXN1bHQgKTsKKyAgICAgICAgICAgICsrY29kZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJTlNUUl9DQUxMX01FTUJFUl9SVUxFOgorICAgICAgICB7CisgICAgICAgICAgICBPQkpFQ1QgKiBydWxlX25hbWUgPSBmdW5jdGlvbl9nZXRfY29uc3RhbnQoIGZ1bmN0aW9uLCBjb2RlWzFdLm9wX2NvZGUgKTsKKyAgICAgICAgICAgIExJU1QgKiByZXN1bHQgPSBmdW5jdGlvbl9jYWxsX21lbWJlcl9ydWxlKCBmdW5jdGlvbiwgZnJhbWUsIHMsIGNvZGUtPmFyZywgcnVsZV9uYW1lLCBmdW5jdGlvbi0+ZmlsZSwgY29kZVsxXS5hcmcgKTsKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIHJlc3VsdCApOworICAgICAgICAgICAgKytjb2RlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX1JVTEU6CisgICAgICAgICAgICBmdW5jdGlvbl9zZXRfcnVsZSggZnVuY3Rpb24sIGZyYW1lLCBzLCBjb2RlLT5hcmcgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5TVFJfQUNUSU9OUzoKKyAgICAgICAgICAgIGZ1bmN0aW9uX3NldF9hY3Rpb25zKCBmdW5jdGlvbiwgZnJhbWUsIHMsIGNvZGUtPmFyZyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVmFyaWFibGUgZXhwYW5zaW9uCisgICAgICAgICAqLworCisgICAgICAgIGNhc2UgSU5TVFJfQVBQTFlfTU9ESUZJRVJTOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgbCA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgbiA9IGV4cGFuZF9tb2RpZmllcnMoIHMsIGNvZGUtPmFyZyApOworICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgbCApOworICAgICAgICAgICAgbCA9IGFwcGx5X21vZGlmaWVycyggcywgbiApOworICAgICAgICAgICAgbGlzdF9mcmVlKCBzdGFja19wb3AoIHMgKSApOworICAgICAgICAgICAgc3RhY2tfZGVhbGxvY2F0ZSggcywgbiAqIHNpemVvZiggVkFSX0VESVRTICkgKTsKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgY29kZS0+YXJnOyArK2kgKQorICAgICAgICAgICAgICAgIGxpc3RfZnJlZSggc3RhY2tfcG9wKCBzICkgKTsgIC8qIHBvcCBtb2RpZmllcnMgKi8KKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIGwgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJTlNUUl9BUFBMWV9JTkRFWDoKKyAgICAgICAgICAgIGwgPSBhcHBseV9zdWJzY3JpcHQoIHMgKTsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggc3RhY2tfcG9wKCBzICkgKTsKKyAgICAgICAgICAgIGxpc3RfZnJlZSggc3RhY2tfcG9wKCBzICkgKTsKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIGwgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5TVFJfQVBQTFlfSU5ERVhfTU9ESUZJRVJTOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgbCA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgciA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgbiA9IGV4cGFuZF9tb2RpZmllcnMoIHMsIGNvZGUtPmFyZyApOworICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgciApOworICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgbCApOworICAgICAgICAgICAgbCA9IGFwcGx5X3N1YnNjcmlwdF9hbmRfbW9kaWZpZXJzKCBzLCBuICk7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIHN0YWNrX3BvcCggcyApICk7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIHN0YWNrX3BvcCggcyApICk7CisgICAgICAgICAgICBzdGFja19kZWFsbG9jYXRlKCBzLCBuICogc2l6ZW9mKCBWQVJfRURJVFMgKSApOworICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBjb2RlLT5hcmc7ICsraSApCisgICAgICAgICAgICAgICAgbGlzdF9mcmVlKCBzdGFja19wb3AoIHMgKSApOyAgLyogcG9wIG1vZGlmaWVycyAqLworICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgbCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX0FQUExZX01PRElGSUVSU19HUk9VUDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBMSVNUICogY29uc3QgdmFycyA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgaW50IGNvbnN0IG4gPSBleHBhbmRfbW9kaWZpZXJzKCBzLCBjb2RlLT5hcmcgKTsKKyAgICAgICAgICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCB2YXJzICk7CisgICAgICAgICAgICBMSVNUSVRFUiBjb25zdCBlbmQgPSBsaXN0X2VuZCggdmFycyApOworICAgICAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGFja19wdXNoKCBzLCBmdW5jdGlvbl9nZXRfbmFtZWRfdmFyaWFibGUoIGZ1bmN0aW9uLCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbGlzdF9pdGVtKCBpdGVyICkgKSApOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfYXBwZW5kKCByZXN1bHQsIGFwcGx5X21vZGlmaWVycyggcywgbiApICk7CisgICAgICAgICAgICAgICAgbGlzdF9mcmVlKCBzdGFja19wb3AoIHMgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdF9mcmVlKCB2YXJzICk7CisgICAgICAgICAgICBzdGFja19kZWFsbG9jYXRlKCBzLCBuICogc2l6ZW9mKCBWQVJfRURJVFMgKSApOworICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBjb2RlLT5hcmc7ICsraSApCisgICAgICAgICAgICAgICAgbGlzdF9mcmVlKCBzdGFja19wb3AoIHMgKSApOyAgLyogcG9wIG1vZGlmaWVycyAqLworICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgcmVzdWx0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSU5TVFJfQVBQTFlfSU5ERVhfR1JPVVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1QgKiB2YXJzID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBMSVNUICogcmVzdWx0ID0gTDA7CisgICAgICAgICAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggdmFycyApOworICAgICAgICAgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIHZhcnMgKTsKKyAgICAgICAgICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgZnVuY3Rpb25fZ2V0X25hbWVkX3ZhcmlhYmxlKCBmdW5jdGlvbiwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgIGxpc3RfaXRlbSggaXRlciApICkgKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXN0X2FwcGVuZCggcmVzdWx0LCBhcHBseV9zdWJzY3JpcHQoIHMgKSApOworICAgICAgICAgICAgICAgIGxpc3RfZnJlZSggc3RhY2tfcG9wKCBzICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RfZnJlZSggdmFycyApOworICAgICAgICAgICAgbGlzdF9mcmVlKCBzdGFja19wb3AoIHMgKSApOworICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgcmVzdWx0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSU5TVFJfQVBQTFlfSU5ERVhfTU9ESUZJRVJTX0dST1VQOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIExJU1QgKiBjb25zdCB2YXJzID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBMSVNUICogY29uc3QgciA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgaW50IGNvbnN0IG4gPSBleHBhbmRfbW9kaWZpZXJzKCBzLCBjb2RlLT5hcmcgKTsKKyAgICAgICAgICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCB2YXJzICk7CisgICAgICAgICAgICBMSVNUSVRFUiBjb25zdCBlbmQgPSBsaXN0X2VuZCggdmFycyApOworICAgICAgICAgICAgc3RhY2tfcHVzaCggcywgciApOworICAgICAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGFja19wdXNoKCBzLCBmdW5jdGlvbl9nZXRfbmFtZWRfdmFyaWFibGUoIGZ1bmN0aW9uLCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbGlzdF9pdGVtKCBpdGVyICkgKSApOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfYXBwZW5kKCByZXN1bHQsIGFwcGx5X3N1YnNjcmlwdF9hbmRfbW9kaWZpZXJzKCBzLAorICAgICAgICAgICAgICAgICAgICBuICkgKTsKKyAgICAgICAgICAgICAgICBsaXN0X2ZyZWUoIHN0YWNrX3BvcCggcyApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0X2ZyZWUoIHN0YWNrX3BvcCggcyApICk7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIHZhcnMgKTsKKyAgICAgICAgICAgIHN0YWNrX2RlYWxsb2NhdGUoIHMsIG4gKiBzaXplb2YoIFZBUl9FRElUUyApICk7CisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGNvZGUtPmFyZzsgKytpICkKKyAgICAgICAgICAgICAgICBsaXN0X2ZyZWUoIHN0YWNrX3BvcCggcyApICk7ICAvKiBwb3AgbW9kaWZpZXJzICovCisgICAgICAgICAgICBzdGFja19wdXNoKCBzLCByZXN1bHQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJTlNUUl9DT01CSU5FX1NUUklOR1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBjb25zdCBidWZmZXJfc2l6ZSA9IGNvZGUtPmFyZyAqIHNpemVvZiggZXhwYW5zaW9uX2l0ZW0gKTsKKyAgICAgICAgICAgIExJU1QgKiAqIGNvbnN0IHN0YWNrX3BvcyA9IHN0YWNrX2dldCggcyApOworICAgICAgICAgICAgZXhwYW5zaW9uX2l0ZW0gKiBpdGVtcyA9IHN0YWNrX2FsbG9jYXRlKCBzLCBidWZmZXJfc2l6ZSApOworICAgICAgICAgICAgTElTVCAqIHJlc3VsdDsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBjb2RlLT5hcmc7ICsraSApCisgICAgICAgICAgICAgICAgaXRlbXNbIGkgXS52YWx1ZXMgPSBzdGFja19wb3NbIGkgXTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGV4cGFuZCggaXRlbXMsIGNvZGUtPmFyZyApOworICAgICAgICAgICAgc3RhY2tfZGVhbGxvY2F0ZSggcywgYnVmZmVyX3NpemUgKTsKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgY29kZS0+YXJnOyArK2kgKQorICAgICAgICAgICAgICAgIGxpc3RfZnJlZSggc3RhY2tfcG9wKCBzICkgKTsKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIHJlc3VsdCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX0dFVF9HUklTVDoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqIHZhbHMgPSBzdGFja19wb3AoIHMgKTsKKyAgICAgICAgICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIsIGVuZDsKKworICAgICAgICAgICAgZm9yICggaXRlciA9IGxpc3RfYmVnaW4oIHZhbHMgKSwgZW5kID0gbGlzdF9lbmQoIHZhbHMgKTsgaXRlciAhPSBlbmQ7ICsraXRlciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT0JKRUNUICogbmV3X29iamVjdDsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogdmFsdWUgPSBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBwOworICAgICAgICAgICAgICAgIGlmICggdmFsdWVbIDAgXSA9PSAnPCcgJiYgKCBwID0gc3RyY2hyKCB2YWx1ZSwgJz4nICkgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggcFsgMSBdICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vYmplY3QgPSBvYmplY3RfbmV3X3JhbmdlKCB2YWx1ZSwgcCAtIHZhbHVlICsgMSApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfb2JqZWN0ID0gb2JqZWN0X2NvcHkoIGxpc3RfaXRlbSggaXRlciApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ld19vYmplY3QgPSBvYmplY3RfY29weSggY29uc3RhbnRfZW1wdHkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwgbmV3X29iamVjdCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsaXN0X2ZyZWUoIHZhbHMgKTsKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIHJlc3VsdCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX0lOQ0xVREU6CisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1QgKiBudCA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgaWYgKCAhbGlzdF9lbXB0eSggbnQgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVEFSR0VUICogY29uc3QgdCA9IGJpbmR0YXJnZXQoIGxpc3RfZnJvbnQoIG50ICkgKTsKKyAgICAgICAgICAgICAgICBsaXN0X2ZyZWUoIG50ICk7CisKKyAgICAgICAgICAgICAgICAvKiBEV0EgMjAwMS8xMC8yMiAtIFBlcmZvcmNlIEphbSBjbGVhcmVkIHRoZSBhcmd1bWVudHMgaGVyZSwKKyAgICAgICAgICAgICAgICAgKiB3aGljaCBwcmV2ZW50ZWQgYW4gaW5jbHVkZWQgZmlsZSBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgcGFydAorICAgICAgICAgICAgICAgICAqIG9mIHRoZSBib2R5IG9mIGEgcnVsZS4gSSBkaWQgbm90IHNlZSBhbnkgcmVhc29uIHRvIGRvIHRoYXQsCisgICAgICAgICAgICAgICAgICogc28gSSBsaWZ0ZWQgdGhlIHJlc3RyaWN0aW9uLgorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgLyogQmluZCB0aGUgaW5jbHVkZSBmaWxlIHVuZGVyIHRoZSBpbmZsdWVuY2Ugb2YgIm9uLXRhcmdldCIKKyAgICAgICAgICAgICAgICAgKiB2YXJpYWJsZXMuIFRob3VnaCB0aGV5IGFyZSB0YXJnZXRzLCBpbmNsdWRlIGZpbGVzIGFyZSBub3QKKyAgICAgICAgICAgICAgICAgKiBidWlsdCB3aXRoIG1ha2UoKS4KKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIHB1c2hzZXR0aW5ncyggcm9vdF9tb2R1bGUoKSwgdC0+c2V0dGluZ3MgKTsKKyAgICAgICAgICAgICAgICAvKiBXZSBkbyBub3QgZXhwZWN0IHRoYXQgYSBmaWxlIHRvIGJlIGluY2x1ZGVkIGlzIGdlbmVyYXRlZCBieQorICAgICAgICAgICAgICAgICAqIHNvbWUgYWN0aW9uLiBUaGVyZWZvcmUsIHBhc3MgMCBhcyB0aGlyZCBhcmd1bWVudC4gSWYgdGhlIG5hbWUKKyAgICAgICAgICAgICAgICAgKiByZXNvbHZlcyB0byBhIGRpcmVjdG9yeSwgbGV0IGl0IGVycm9yIG91dC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBvYmplY3RfZnJlZSggdC0+Ym91bmRuYW1lICk7CisgICAgICAgICAgICAgICAgdC0+Ym91bmRuYW1lID0gc2VhcmNoKCB0LT5uYW1lLCAmdC0+dGltZSwgMCwgMCApOworICAgICAgICAgICAgICAgIHBvcHNldHRpbmdzKCByb290X21vZHVsZSgpLCB0LT5zZXR0aW5ncyApOworCisgICAgICAgICAgICAgICAgcGFyc2VfZmlsZSggdC0+Ym91bmRuYW1lLCBmcmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBDbGFzc2VzIGFuZCBtb2R1bGVzCisgICAgICAgICAqLworCisgICAgICAgIGNhc2UgSU5TVFJfUFVTSF9NT0RVTEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1QgKiBjb25zdCBtb2R1bGVfbmFtZSA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgbW9kdWxlX3QgKiBjb25zdCBvdXRlcl9tb2R1bGUgPSBmcmFtZS0+bW9kdWxlOworICAgICAgICAgICAgZnJhbWUtPm1vZHVsZSA9ICFsaXN0X2VtcHR5KCBtb2R1bGVfbmFtZSApCisgICAgICAgICAgICAgICAgPyBiaW5kbW9kdWxlKCBsaXN0X2Zyb250KCBtb2R1bGVfbmFtZSApICkKKyAgICAgICAgICAgICAgICA6IHJvb3RfbW9kdWxlKCk7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIG1vZHVsZV9uYW1lICk7CisgICAgICAgICAgICAqKG1vZHVsZV90ICogKilzdGFja19hbGxvY2F0ZSggcywgc2l6ZW9mKCBtb2R1bGVfdCAqICkgKSA9CisgICAgICAgICAgICAgICAgb3V0ZXJfbW9kdWxlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX1BPUF9NT0RVTEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZHVsZV90ICogY29uc3Qgb3V0ZXJfbW9kdWxlID0gKihtb2R1bGVfdCAqICopc3RhY2tfZ2V0KCBzICk7CisgICAgICAgICAgICBzdGFja19kZWFsbG9jYXRlKCBzLCBzaXplb2YoIG1vZHVsZV90ICogKSApOworICAgICAgICAgICAgZnJhbWUtPm1vZHVsZSA9IG91dGVyX21vZHVsZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJTlNUUl9DTEFTUzoKKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqIGJhc2VzID0gc3RhY2tfcG9wKCBzICk7CisgICAgICAgICAgICBMSVNUICogbmFtZSA9IHN0YWNrX3BvcCggcyApOworICAgICAgICAgICAgT0JKRUNUICogY2xhc3NfbW9kdWxlID0gbWFrZV9jbGFzc19tb2R1bGUoIG5hbWUsIGJhc2VzLCBmcmFtZSApOworCisgICAgICAgICAgICBtb2R1bGVfdCAqIGNvbnN0IG91dGVyX21vZHVsZSA9IGZyYW1lLT5tb2R1bGU7CisgICAgICAgICAgICBmcmFtZS0+bW9kdWxlID0gYmluZG1vZHVsZSggY2xhc3NfbW9kdWxlICk7CisgICAgICAgICAgICBvYmplY3RfZnJlZSggY2xhc3NfbW9kdWxlICk7CisKKyAgICAgICAgICAgICoobW9kdWxlX3QgKiAqKXN0YWNrX2FsbG9jYXRlKCBzLCBzaXplb2YoIG1vZHVsZV90ICogKSApID0KKyAgICAgICAgICAgICAgICBvdXRlcl9tb2R1bGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSU5TVFJfQklORF9NT0RVTEVfVkFSSUFCTEVTOgorICAgICAgICAgICAgbW9kdWxlX2JpbmRfdmFyaWFibGVzKCBmcmFtZS0+bW9kdWxlICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOU1RSX0FQUEVORF9TVFJJTkdTOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgYnVmWyAxIF07CisgICAgICAgICAgICBzdHJpbmdfbmV3KCBidWYgKTsKKyAgICAgICAgICAgIGNvbWJpbmVfc3RyaW5ncyggcywgY29kZS0+YXJnLCBidWYgKTsKKyAgICAgICAgICAgIHN0YWNrX3B1c2goIHMsIGxpc3RfbmV3KCBvYmplY3RfbmV3KCBidWYtPnZhbHVlICkgKSApOworICAgICAgICAgICAgc3RyaW5nX2ZyZWUoIGJ1ZiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElOU1RSX1dSSVRFX0ZJTEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBidWZbIDEgXTsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBvdXQ7CisgICAgICAgICAgICBPQkpFQ1QgKiB0bXBfZmlsZW5hbWUgPSAwOworICAgICAgICAgICAgaW50IG91dF9kZWJ1ZyA9IERFQlVHX0VYRUMgPyAxIDogMDsKKyAgICAgICAgICAgIEZJTEUgKiBvdXRfZmlsZSA9IDA7CisgICAgICAgICAgICBzdHJpbmdfbmV3KCBidWYgKTsKKyAgICAgICAgICAgIGNvbWJpbmVfc3RyaW5ncyggcywgY29kZS0+YXJnLCBidWYgKTsKKyAgICAgICAgICAgIG91dCA9IG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIHN0YWNrX3RvcCggcyApICkgKTsKKworICAgICAgICAgICAgLyogRm9yIHN0ZG91dC9zdGRlcnIgd2Ugd2lsbCBjcmVhdGUgYSB0ZW1wIGZpbGUgYW5kIGdlbmVyYXRlIGEKKyAgICAgICAgICAgICAqIGNvbW1hbmQgdGhhdCBvdXRwdXRzIHRoZSBjb250ZW50IGFzIG5lZWRlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCAoIHN0cmNtcCggIlNURE9VVCIsIG91dCApID09IDAgKSB8fAorICAgICAgICAgICAgICAgICggc3RyY21wKCAiU1RERVJSIiwgb3V0ICkgPT0gMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyX3JlZGlyID0gc3RyY21wKCAiU1RERVJSIiwgb3V0ICkgPT0gMDsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcmVzdWx0WyAxIF07CisgICAgICAgICAgICAgICAgdG1wX2ZpbGVuYW1lID0gcGF0aF90bXBmaWxlKCk7CisgICAgICAgICAgICAgICAgc3RyaW5nX25ldyggcmVzdWx0ICk7CisgICAgICAgICAgICAgICAgI2lmZGVmIE9TX05UCisgICAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggcmVzdWx0LCAidHlwZSBcIiIgKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHN0cmluZ19hcHBlbmQoIHJlc3VsdCwgImNhdCBcIiIgKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBzdHJpbmdfYXBwZW5kKCByZXN1bHQsIG9iamVjdF9zdHIoIHRtcF9maWxlbmFtZSApICk7CisgICAgICAgICAgICAgICAgc3RyaW5nX3B1c2hfYmFjayggcmVzdWx0LCAnXCInICk7CisgICAgICAgICAgICAgICAgaWYgKCBlcnJfcmVkaXIgKQorICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYXBwZW5kKCByZXN1bHQsICIgMT4mMiIgKTsKKworICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UgU1REWFhYIHdpdGggdGhlIHRlbXBvcmFyeSBmaWxlLiAqLworICAgICAgICAgICAgICAgIGxpc3RfZnJlZSggc3RhY2tfcG9wKCBzICkgKTsKKyAgICAgICAgICAgICAgICBzdGFja19wdXNoKCBzLCBsaXN0X25ldyggb2JqZWN0X25ldyggcmVzdWx0LT52YWx1ZSApICkgKTsKKyAgICAgICAgICAgICAgICBvdXQgPSBvYmplY3Rfc3RyKCB0bXBfZmlsZW5hbWUgKTsKKworICAgICAgICAgICAgICAgIHN0cmluZ19mcmVlKCByZXN1bHQgKTsKKworICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0ZW1wIGZpbGVzIGNyZWF0ZWQgYnkgdGhpcyBnZXQgbnVrZWQgZXZlbnR1YWxseS4gKi8KKyAgICAgICAgICAgICAgICBmaWxlX3JlbW92ZV9hdGV4aXQoIHRtcF9maWxlbmFtZSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICFnbG9icy5ub2V4ZWMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBvdXRfbmFtZVsgMSBdOworICAgICAgICAgICAgICAgIC8qIEhhbmRsZSAicGF0aCB0byBmaWxlIiBmaWxlbmFtZXMuICovCisgICAgICAgICAgICAgICAgaWYgKCAoIG91dFsgMCBdID09ICciJyApICYmICggb3V0WyBzdHJsZW4oIG91dCApIC0gMSBdID09ICciJyApCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ19jb3B5KCBvdXRfbmFtZSwgb3V0ICsgMSApOworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHJ1bmNhdGUoIG91dF9uYW1lLCBvdXRfbmFtZS0+c2l6ZSAtIDEgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdHJpbmdfY29weSggb3V0X25hbWUsIG91dCApOworICAgICAgICAgICAgICAgIG91dF9maWxlID0gZm9wZW4oIG91dF9uYW1lLT52YWx1ZSwgInciICk7CisKKyAgICAgICAgICAgICAgICBpZiAoICFvdXRfZmlsZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoICJmYWlsZWQgdG8gd3JpdGUgb3V0cHV0IGZpbGUgJyVzJyFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbmFtZS0+dmFsdWUgKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCggRVhJVEJBRCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJpbmdfZnJlZSggb3V0X25hbWUgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBvdXRfZGVidWcgKSBwcmludGYoICJcbmZpbGUgJXNcbiIsIG91dCApOworICAgICAgICAgICAgaWYgKCBvdXRfZmlsZSApIGZwdXRzKCBidWYtPnZhbHVlLCBvdXRfZmlsZSApOworICAgICAgICAgICAgaWYgKCBvdXRfZGVidWcgKSBmcHV0cyggYnVmLT52YWx1ZSwgc3Rkb3V0ICk7CisgICAgICAgICAgICBpZiAoIG91dF9maWxlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmZmx1c2goIG91dF9maWxlICk7CisgICAgICAgICAgICAgICAgZmNsb3NlKCBvdXRfZmlsZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nX2ZyZWUoIGJ1ZiApOworICAgICAgICAgICAgaWYgKCB0bXBfZmlsZW5hbWUgKQorICAgICAgICAgICAgICAgIG9iamVjdF9mcmVlKCB0bXBfZmlsZW5hbWUgKTsKKworICAgICAgICAgICAgaWYgKCBvdXRfZGVidWcgKSBmcHV0YyggJ1xuJywgc3Rkb3V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSU5TVFJfT1VUUFVUX1NUUklOR1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyAqIGNvbnN0IGJ1ZiA9ICooc3RyaW5nICogKikoIChjaGFyICopc3RhY2tfZ2V0KCBzICkgKyAoCisgICAgICAgICAgICAgICAgY29kZS0+YXJnICogc2l6ZW9mKCBMSVNUICogKSApICk7CisgICAgICAgICAgICBjb21iaW5lX3N0cmluZ3MoIHMsIGNvZGUtPmFyZywgYnVmICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgKytjb2RlOworICAgIH0KK30KKworCisjaWZkZWYgSEFWRV9QWVRIT04KKworc3RhdGljIHN0cnVjdCBhcmdfbGlzdCAqIGFyZ19saXN0X2NvbXBpbGVfcHl0aG9uKCBQeU9iamVjdCAqIGJqYW1fc2lnbmF0dXJlLAorICAgIGludCAqIG51bV9hcmd1bWVudHMgKQoreworICAgIGlmICggYmphbV9zaWduYXR1cmUgKQorICAgIHsKKyAgICAgICAgc3RydWN0IGFyZ3VtZW50X2xpc3RfY29tcGlsZXIgY1sgMSBdOworICAgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKiByZXN1bHQ7CisgICAgICAgIFB5X3NzaXplX3QgczsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBhcmd1bWVudF9saXN0X2NvbXBpbGVyX2luaXQoIGMgKTsKKworICAgICAgICBzID0gUHlTZXF1ZW5jZV9TaXplKCBiamFtX3NpZ25hdHVyZSApOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHM7ICsraSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBhcmd1bWVudF9jb21waWxlciBhcmdfY29tcFsgMSBdOworICAgICAgICAgICAgc3RydWN0IGFyZ19saXN0IGFyZzsKKyAgICAgICAgICAgIFB5T2JqZWN0ICogdiA9IFB5U2VxdWVuY2VfR2V0SXRlbSggYmphbV9zaWduYXR1cmUsIGkgKTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgajsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaW5uZXI7CisgICAgICAgICAgICBhcmd1bWVudF9jb21waWxlcl9pbml0KCBhcmdfY29tcCApOworCisgICAgICAgICAgICBpbm5lciA9IFB5U2VxdWVuY2VfU2l6ZSggdiApOworICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCBpbm5lcjsgKytqICkKKyAgICAgICAgICAgICAgICBhcmd1bWVudF9jb21waWxlcl9hZGQoIGFyZ19jb21wLCBvYmplY3RfbmV3KCBQeVN0cmluZ19Bc1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgUHlTZXF1ZW5jZV9HZXRJdGVtKCB2LCBqICkgKSApLCBjb25zdGFudF9idWlsdGluLCAtMSApOworCisgICAgICAgICAgICBhcmcgPSBhcmdfY29tcGlsZV9pbXBsKCBhcmdfY29tcCwgY29uc3RhbnRfYnVpbHRpbiwgLTEgKTsKKyAgICAgICAgICAgIGR5bmFtaWNfYXJyYXlfcHVzaCggYy0+YXJncywgYXJnICk7CisgICAgICAgICAgICBhcmd1bWVudF9jb21waWxlcl9mcmVlKCBhcmdfY29tcCApOworICAgICAgICAgICAgUHlfREVDUkVGKCB2ICk7CisgICAgICAgIH0KKworICAgICAgICAqbnVtX2FyZ3VtZW50cyA9IGMtPmFyZ3MtPnNpemU7CisgICAgICAgIHJlc3VsdCA9IEJKQU1fTUFMTE9DKCBjLT5hcmdzLT5zaXplICogc2l6ZW9mKCBzdHJ1Y3QgYXJnX2xpc3QgKSApOworICAgICAgICBtZW1jcHkoIHJlc3VsdCwgYy0+YXJncy0+ZGF0YSwgYy0+YXJncy0+c2l6ZSAqIHNpemVvZiggc3RydWN0IGFyZ19saXN0ICkKKyAgICAgICAgICAgICk7CisgICAgICAgIGFyZ3VtZW50X2xpc3RfY29tcGlsZXJfZnJlZSggYyApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAqbnVtX2FyZ3VtZW50cyA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK0ZVTkNUSU9OICogZnVuY3Rpb25fcHl0aG9uKCBQeU9iamVjdCAqIGZ1bmN0aW9uLCBQeU9iamVjdCAqIGJqYW1fc2lnbmF0dXJlICkKK3sKKyAgICBQWVRIT05fRlVOQ1RJT04gKiByZXN1bHQgPSBCSkFNX01BTExPQyggc2l6ZW9mKCBQWVRIT05fRlVOQ1RJT04gKSApOworCisgICAgcmVzdWx0LT5iYXNlLnR5cGUgPSBGVU5DVElPTl9QWVRIT047CisgICAgcmVzdWx0LT5iYXNlLnJlZmVyZW5jZV9jb3VudCA9IDE7CisgICAgcmVzdWx0LT5iYXNlLnJ1bGVuYW1lID0gMDsKKyAgICByZXN1bHQtPmJhc2UuZm9ybWFsX2FyZ3VtZW50cyA9IGFyZ19saXN0X2NvbXBpbGVfcHl0aG9uKCBiamFtX3NpZ25hdHVyZSwKKyAgICAgICAgJnJlc3VsdC0+YmFzZS5udW1fZm9ybWFsX2FyZ3VtZW50cyApOworICAgIFB5X0lOQ1JFRiggZnVuY3Rpb24gKTsKKyAgICByZXN1bHQtPnB5dGhvbl9mdW5jdGlvbiA9IGZ1bmN0aW9uOworCisgICAgcmV0dXJuIChGVU5DVElPTiAqKXJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZCBhcmd1bWVudF9saXN0X3RvX3B5dGhvbiggc3RydWN0IGFyZ19saXN0ICogZm9ybWFsLCBpbnQgZm9ybWFsX2NvdW50LAorICAgIEZVTkNUSU9OICogZnVuY3Rpb24sIEZSQU1FICogZnJhbWUsIFB5T2JqZWN0ICoga3cgKQoreworICAgIExPTCAqIGFsbF9hY3R1YWwgPSBmcmFtZS0+YXJnczsKKyAgICBpbnQgaTsKKworICAgIGZvciAoIGkgPSAwOyBpIDwgZm9ybWFsX2NvdW50OyArK2kgKQorICAgIHsKKyAgICAgICAgTElTVCAqIGFjdHVhbCA9IGxvbF9nZXQoIGFsbF9hY3R1YWwsIGkgKTsKKyAgICAgICAgTElTVElURVIgYWN0dWFsX2l0ZXIgPSBsaXN0X2JlZ2luKCBhY3R1YWwgKTsKKyAgICAgICAgTElTVElURVIgY29uc3QgYWN0dWFsX2VuZCA9IGxpc3RfZW5kKCBhY3R1YWwgKTsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgZm9ybWFsWyBpIF0uc2l6ZTsgKytqICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGFyZ3VtZW50ICogZm9ybWFsX2FyZyA9ICZmb3JtYWxbIGkgXS5hcmdzWyBqIF07CisgICAgICAgICAgICBQeU9iamVjdCAqIHZhbHVlOworICAgICAgICAgICAgTElTVCAqIGw7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIGZvcm1hbF9hcmctPmZsYWdzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQVJHX09ORToKKyAgICAgICAgICAgICAgICBpZiAoIGFjdHVhbF9pdGVyID09IGFjdHVhbF9lbmQgKQorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudF9lcnJvciggIm1pc3NpbmcgYXJndW1lbnQiLCBmdW5jdGlvbiwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYWxfYXJnLT5hcmdfbmFtZSApOworICAgICAgICAgICAgICAgIHR5cGVfY2hlY2tfcmFuZ2UoIGZvcm1hbF9hcmctPnR5cGVfbmFtZSwgYWN0dWFsX2l0ZXIsIGxpc3RfbmV4dCgKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsX2l0ZXIgKSwgZnJhbWUsIGZ1bmN0aW9uLCBmb3JtYWxfYXJnLT5hcmdfbmFtZSApOworICAgICAgICAgICAgICAgIHZhbHVlID0gUHlTdHJpbmdfRnJvbVN0cmluZyggb2JqZWN0X3N0ciggbGlzdF9pdGVtKCBhY3R1YWxfaXRlcgorICAgICAgICAgICAgICAgICAgICApICkgKTsKKyAgICAgICAgICAgICAgICBhY3R1YWxfaXRlciA9IGxpc3RfbmV4dCggYWN0dWFsX2l0ZXIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVJHX09QVElPTkFMOgorICAgICAgICAgICAgICAgIGlmICggYWN0dWFsX2l0ZXIgPT0gYWN0dWFsX2VuZCApCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eXBlX2NoZWNrX3JhbmdlKCBmb3JtYWxfYXJnLT50eXBlX25hbWUsIGFjdHVhbF9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9uZXh0KCBhY3R1YWxfaXRlciApLCBmcmFtZSwgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYWxfYXJnLT5hcmdfbmFtZSApOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9pdGVyICkgKSApOworICAgICAgICAgICAgICAgICAgICBhY3R1YWxfaXRlciA9IGxpc3RfbmV4dCggYWN0dWFsX2l0ZXIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFSR19QTFVTOgorICAgICAgICAgICAgICAgIGlmICggYWN0dWFsX2l0ZXIgPT0gYWN0dWFsX2VuZCApCisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50X2Vycm9yKCAibWlzc2luZyBhcmd1bWVudCIsIGZ1bmN0aW9uLCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hbF9hcmctPmFyZ19uYW1lICk7CisgICAgICAgICAgICAgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgQVJHX1NUQVI6CisgICAgICAgICAgICAgICAgdHlwZV9jaGVja19yYW5nZSggZm9ybWFsX2FyZy0+dHlwZV9uYW1lLCBhY3R1YWxfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsX2VuZCwgZnJhbWUsIGZ1bmN0aW9uLCBmb3JtYWxfYXJnLT5hcmdfbmFtZSApOworICAgICAgICAgICAgICAgIGwgPSBsaXN0X2NvcHlfcmFuZ2UoIGFjdHVhbCwgYWN0dWFsX2l0ZXIsIGFjdHVhbF9lbmQgKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGxpc3RfdG9fcHl0aG9uKCBsICk7CisgICAgICAgICAgICAgICAgbGlzdF9mcmVlKCBsICk7CisgICAgICAgICAgICAgICAgYWN0dWFsX2l0ZXIgPSBhY3R1YWxfZW5kOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUkdfVkFSSUFESUM6CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHZhbHVlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqIGtleSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIG9iamVjdF9zdHIoCisgICAgICAgICAgICAgICAgICAgIGZvcm1hbF9hcmctPmFyZ19uYW1lICkgKTsKKyAgICAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbSgga3csIGtleSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoIGtleSApOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRiggdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggYWN0dWFsX2l0ZXIgIT0gYWN0dWFsX2VuZCApCisgICAgICAgICAgICBhcmd1bWVudF9lcnJvciggImV4dHJhIGFyZ3VtZW50IiwgZnVuY3Rpb24sIGZyYW1lLCBsaXN0X2l0ZW0oCisgICAgICAgICAgICAgICAgYWN0dWFsX2l0ZXIgKSApOworICAgIH0KKworICAgIGZvciAoIDsgaSA8IGFsbF9hY3R1YWwtPmNvdW50OyArK2kgKQorICAgIHsKKyAgICAgICAgTElTVCAqIGNvbnN0IGFjdHVhbCA9IGxvbF9nZXQoIGFsbF9hY3R1YWwsIGkgKTsKKyAgICAgICAgaWYgKCAhbGlzdF9lbXB0eSggYWN0dWFsICkgKQorICAgICAgICAgICAgYXJndW1lbnRfZXJyb3IoICJleHRyYSBhcmd1bWVudCIsIGZ1bmN0aW9uLCBmcmFtZSwgbGlzdF9mcm9udCgKKyAgICAgICAgICAgICAgICBhY3R1YWwgKSApOworICAgIH0KK30KKworCisvKiBHaXZlbiBhIFB5dGhvbiBvYmplY3QsIHJldHVybiBhIHN0cmluZyB0byB1c2UgaW4gSmFtIGNvZGUgaW5zdGVhZCBvZiB0aGUgc2FpZAorICogb2JqZWN0LgorICoKKyAqIElmIHRoZSBvYmplY3QgaXMgYSBzdHJpbmcsIHVzZSB0aGUgc3RyaW5nIHZhbHVlLgorICogSWYgdGhlIG9iamVjdCBpbXBsZW1lbmV0cyBfX2phbV9yZXByX18gbWV0aG9kLCB1c2UgdGhhdC4KKyAqIE90aGVyd2lzZSByZXR1cm4gMC4KKyAqLworCitPQkpFQ1QgKiBweXRob25fdG9fc3RyaW5nKCBQeU9iamVjdCAqIHZhbHVlICkKK3sKKyAgICBpZiAoIFB5U3RyaW5nX0NoZWNrKCB2YWx1ZSApICkKKyAgICAgICAgcmV0dXJuIG9iamVjdF9uZXcoIFB5U3RyaW5nX0FTX1NUUklORyggdmFsdWUgKSApOworCisgICAgLyogU2VlIGlmIHRoaXMgaW5zdGFuY2UgZGVmaW5lcyB0aGUgc3BlY2lhbCBfX2phbV9yZXByX18gbWV0aG9kLiAqLworICAgIGlmICggUHlJbnN0YW5jZV9DaGVjayggdmFsdWUgKQorICAgICAgICAmJiBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKCB2YWx1ZSwgIl9famFtX3JlcHJfXyIgKSApCisgICAgeworICAgICAgICBQeU9iamVjdCAqIHJlcHIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKCB2YWx1ZSwgIl9famFtX3JlcHJfXyIgKTsKKyAgICAgICAgaWYgKCByZXByICkKKyAgICAgICAgeworICAgICAgICAgICAgUHlPYmplY3QgKiBhcmd1bWVudHMyID0gUHlUdXBsZV9OZXcoIDAgKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICogdmFsdWUyID0gUHlPYmplY3RfQ2FsbCggcmVwciwgYXJndW1lbnRzMiwgMCApOworICAgICAgICAgICAgUHlfREVDUkVGKCByZXByICk7CisgICAgICAgICAgICBQeV9ERUNSRUYoIGFyZ3VtZW50czIgKTsKKyAgICAgICAgICAgIGlmICggUHlTdHJpbmdfQ2hlY2soIHZhbHVlMiApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0X25ldyggUHlTdHJpbmdfQVNfU1RSSU5HKCB2YWx1ZTIgKSApOworICAgICAgICAgICAgUHlfREVDUkVGKCB2YWx1ZTIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgbW9kdWxlX3QgKiBweXRob25fbW9kdWxlKCkKK3sKKyAgICBzdGF0aWMgbW9kdWxlX3QgKiBweXRob24gPSAwOworICAgIGlmICggIXB5dGhvbiApCisgICAgICAgIHB5dGhvbiA9IGJpbmRtb2R1bGUoIGNvbnN0YW50X3B5dGhvbiApOworICAgIHJldHVybiBweXRob247Cit9CisKKworc3RhdGljIExJU1QgKiBjYWxsX3B5dGhvbl9mdW5jdGlvbiggUFlUSE9OX0ZVTkNUSU9OICogZnVuY3Rpb24sIEZSQU1FICogZnJhbWUgKQoreworICAgIExJU1QgKiByZXN1bHQgPSAwOworICAgIFB5T2JqZWN0ICogYXJndW1lbnRzID0gMDsKKyAgICBQeU9iamVjdCAqIGt3ID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqIHB5X3Jlc3VsdDsKKyAgICBGUkFNRSAqIHByZXZfZnJhbWVfYmVmb3JlX3B5dGhvbl9jYWxsOworCisgICAgaWYgKCBmdW5jdGlvbi0+YmFzZS5mb3JtYWxfYXJndW1lbnRzICkKKyAgICB7CisgICAgICAgIGFyZ3VtZW50cyA9IFB5VHVwbGVfTmV3KCAwICk7CisgICAgICAgIGt3ID0gUHlEaWN0X05ldygpOworICAgICAgICBhcmd1bWVudF9saXN0X3RvX3B5dGhvbiggZnVuY3Rpb24tPmJhc2UuZm9ybWFsX2FyZ3VtZW50cywKKyAgICAgICAgICAgIGZ1bmN0aW9uLT5iYXNlLm51bV9mb3JtYWxfYXJndW1lbnRzLCAmZnVuY3Rpb24tPmJhc2UsIGZyYW1lLCBrdyApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcmd1bWVudHMgPSBQeVR1cGxlX05ldyggZnJhbWUtPmFyZ3MtPmNvdW50ICk7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZnJhbWUtPmFyZ3MtPmNvdW50OyArK2kgKQorICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKCBhcmd1bWVudHMsIGksIGxpc3RfdG9fcHl0aG9uKCBsb2xfZ2V0KCBmcmFtZS0+YXJncywKKyAgICAgICAgICAgICAgICBpICkgKSApOworICAgIH0KKworICAgIGZyYW1lLT5tb2R1bGUgPSBweXRob25fbW9kdWxlKCk7CisKKyAgICBwcmV2X2ZyYW1lX2JlZm9yZV9weXRob25fY2FsbCA9IGZyYW1lX2JlZm9yZV9weXRob25fY2FsbDsKKyAgICBmcmFtZV9iZWZvcmVfcHl0aG9uX2NhbGwgPSBmcmFtZTsKKyAgICBweV9yZXN1bHQgPSBQeU9iamVjdF9DYWxsKCBmdW5jdGlvbi0+cHl0aG9uX2Z1bmN0aW9uLCBhcmd1bWVudHMsIGt3ICk7CisgICAgZnJhbWVfYmVmb3JlX3B5dGhvbl9jYWxsID0gcHJldl9mcmFtZV9iZWZvcmVfcHl0aG9uX2NhbGw7CisgICAgUHlfREVDUkVGKCBhcmd1bWVudHMgKTsKKyAgICBQeV9YREVDUkVGKCBrdyApOworICAgIGlmICggcHlfcmVzdWx0ICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgaWYgKCBQeUxpc3RfQ2hlY2soIHB5X3Jlc3VsdCApICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNpemUgPSBQeUxpc3RfU2l6ZSggcHlfcmVzdWx0ICk7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgc2l6ZTsgKytpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPQkpFQ1QgKiBzID0gcHl0aG9uX3RvX3N0cmluZyggUHlMaXN0X0dldEl0ZW0oIHB5X3Jlc3VsdCwgaSApICk7CisgICAgICAgICAgICAgICAgaWYgKCAhcyApCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOb24tc3RyaW5nIG9iamVjdCByZXR1cm5lZCBieSBQeXRob24gY2FsbC5cbiIgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIHMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggcHlfcmVzdWx0ID09IFB5X05vbmUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBMMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIE9CSkVDVCAqIGNvbnN0IHMgPSBweXRob25fdG9fc3RyaW5nKCBweV9yZXN1bHQgKTsKKyAgICAgICAgICAgIGlmICggcyApCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdF9uZXcoIHMgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIHRyaWVkIGFsbCB3ZSBjb3VsZC4gUmV0dXJuIGVtcHR5IGxpc3QuIFRoZXJlIGFyZQorICAgICAgICAgICAgICAgICAqIGNhc2VzLCBlLmcuIGZlYXR1cmUuZmVhdHVyZSBmdW5jdGlvbiB0aGF0IHNob3VsZCByZXR1cm4gYQorICAgICAgICAgICAgICAgICAqIHZhbHVlIGZvciB0aGUgYmVuZWZpdCBvZiBQeXRob24gY29kZSBhbmQgd2hpY2ggYWxzbyBjYW4gYmUKKyAgICAgICAgICAgICAgICAgKiBjYWxsZWQgYnkgSmFtIGNvZGUsIHdoZXJlIG5vIHNlbnNpYmxlIHZhbHVlIGNhbiBiZSByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICAgKiBXZSBjYW5ub3QgZXZlbiBlbWl0IGEgd2FybmluZywgc2luY2UgdGhlcmUgd291bGQgYmUgYSBwaWxlIG9mCisgICAgICAgICAgICAgICAgICogdGhlbS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSBMMDsKKyAgICAgICAgfQorCisgICAgICAgIFB5X0RFQ1JFRiggcHlfcmVzdWx0ICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNhbGwgZmFpbGVkXG4iICk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmCisKKwordm9pZCBmdW5jdGlvbl9kb25lKCB2b2lkICkKK3sKKyAgICBCSkFNX0ZSRUUoIHN0YWNrICk7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9mdW5jdGlvbi5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGYyNmIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZnVuY3Rpb24uaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogIENvcHlyaWdodCAyMDExIFN0ZXZlbiBXYXRhbmFiZQorICogIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworI2lmbmRlZiBGVU5DVElPTl9TVzIwMTExMTIzX0gKKyNkZWZpbmUgRlVOQ1RJT05fU1cyMDExMTEyM19ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJmcmFtZXMuaCIKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgInBhcnNlLmgiCisjaW5jbHVkZSAic3RyaW5ncy5oIgorCit0eXBlZGVmIHN0cnVjdCBfZnVuY3Rpb24gRlVOQ1RJT047Cit0eXBlZGVmIHN0cnVjdCBfc3RhY2sgU1RBQ0s7CisKK1NUQUNLICogc3RhY2tfZ2xvYmFsKCB2b2lkICk7Cit2b2lkIHN0YWNrX3B1c2goIFNUQUNLICogcywgTElTVCAqIGwgKTsKK0xJU1QgKiBzdGFja19wb3AoIFNUQUNLICogcyApOworCitGVU5DVElPTiAqIGZ1bmN0aW9uX2NvbXBpbGUoIFBBUlNFICogcGFyc2UgKTsKK0ZVTkNUSU9OICogZnVuY3Rpb25fYnVpbHRpbiggTElTVCAqICggKiBmdW5jICkoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApLCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKiAqIGFyZ3MgKTsKK3ZvaWQgZnVuY3Rpb25fcmVmZXIoIEZVTkNUSU9OICogKTsKK3ZvaWQgZnVuY3Rpb25fZnJlZSggRlVOQ1RJT04gKiApOworT0JKRUNUICogZnVuY3Rpb25fcnVsZW5hbWUoIEZVTkNUSU9OICogKTsKK3ZvaWQgZnVuY3Rpb25fc2V0X3J1bGVuYW1lKCBGVU5DVElPTiAqLCBPQkpFQ1QgKiApOwordm9pZCBmdW5jdGlvbl9sb2NhdGlvbiggRlVOQ1RJT04gKiwgT0JKRUNUICogKiwgaW50ICogKTsKK0xJU1QgKiBmdW5jdGlvbl9ydW4oIEZVTkNUSU9OICogZnVuY3Rpb24sIEZSQU1FICogZnJhbWUsIFNUQUNLICogcyApOworCitGVU5DVElPTiAqIGZ1bmN0aW9uX2NvbXBpbGVfYWN0aW9ucyggY29uc3QgY2hhciAqIGFjdGlvbnMsIE9CSkVDVCAqIGZpbGUsIGludCBsaW5lICk7Cit2b2lkIGZ1bmN0aW9uX3J1bl9hY3Rpb25zKCBGVU5DVElPTiAqIGZ1bmN0aW9uLCBGUkFNRSAqIGZyYW1lLCBTVEFDSyAqIHMsIHN0cmluZyAqIG91dCApOworCitGVU5DVElPTiAqIGZ1bmN0aW9uX2JpbmRfdmFyaWFibGVzKCBGVU5DVElPTiAqIGYsIG1vZHVsZV90ICogbW9kdWxlLCBpbnQgKiBjb3VudGVyICk7CitGVU5DVElPTiAqIGZ1bmN0aW9uX3VuYmluZF92YXJpYWJsZXMoIEZVTkNUSU9OICogZiApOworCit2b2lkIGZ1bmN0aW9uX2RvbmUoIHZvaWQgKTsKKworI2lmZGVmIEhBVkVfUFlUSE9OCisKK0ZVTkNUSU9OICogZnVuY3Rpb25fcHl0aG9uKCBQeU9iamVjdCAqIGZ1bmN0aW9uLCBQeU9iamVjdCAqIGJqYW1fc2lnbmF0dXJlICk7CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2dsb2IuYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2dsb2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWMwMGVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvZ2xvYi5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTQgQ2hyaXN0b3BoZXIgU2Vpd2FsZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyoKKyAqIGdsb2IuYyAtIG1hdGNoIGEgc3RyaW5nIGFnYWluc3QgYSBzaW1wbGUgcGF0dGVybgorICoKKyAqIFVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgcGF0dGVybnM6CisgKgorICogICogICBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAqICA/ICAgYW55IHNpbmdsZSBjaGFyYWN0ZXIKKyAqICBbYS16XSAgIGFueSBzaW5nbGUgY2hhcmFjdGVyIGluIHRoZSByYW5nZSBhLXoKKyAqICBbXmEtel0gIGFueSBzaW5nbGUgY2hhcmFjdGVyIG5vdCBpbiB0aGUgcmFuZ2UgYS16CisgKiAgXHggIG1hdGNoIHgKKyAqCisgKiBFeHRlcm5hbCBmdW5jdGlvbnM6CisgKgorICogIGdsb2IoKSAtIG1hdGNoIGEgc3RyaW5nIGFnYWluc3QgYSBzaW1wbGUgcGF0dGVybgorICoKKyAqIEludGVybmFsIGZ1bmN0aW9uczoKKyAqCisgKiAgZ2xvYmNoYXJzKCkgLSBidWlsZCBhIGJpdGxpc3QgdG8gY2hlY2sgZm9yIGNoYXJhY3RlciBncm91cCBtYXRjaAorICovCisKKyMgaW5jbHVkZSAiamFtLmgiCisKKyMgZGVmaW5lIENIRUNLX0JJVCggdGFiLCBiaXQgKSAoIHRhYlsgKGJpdCkvOCBdICYgKDE8PCggKGJpdCklOCApKSApCisjIGRlZmluZSBCSVRMSVNUU0laRSAxNiAvKiBieXRlcyB1c2VkIGZvciBbY2hhcnNdIGluIGNvbXBpbGVkIGV4cHIgKi8KKworc3RhdGljIHZvaWQgZ2xvYmNoYXJzKCBjb25zdCBjaGFyICogcywgY29uc3QgY2hhciAqIGUsIGNoYXIgKiBiICk7CisKKworLyoKKyAqIGdsb2IoKSAtIG1hdGNoIGEgc3RyaW5nIGFnYWluc3QgYSBzaW1wbGUgcGF0dGVybi4KKyAqLworCitpbnQgZ2xvYiggY29uc3QgY2hhciAqIGMsIGNvbnN0IGNoYXIgKiBzICkKK3sKKyAgICBjaGFyICAgYml0bGlzdFsgQklUTElTVFNJWkUgXTsKKyAgICBjb25zdCBjaGFyICogaGVyZTsKKworICAgIGZvciAoIDsgOyApCisgICAgc3dpdGNoICggKmMrKyApCisgICAgeworICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgcmV0dXJuICpzID8gLTEgOiAwOworCisgICAgY2FzZSAnPyc6CisgICAgICAgIGlmICggISpzKysgKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAnWyc6CisgICAgICAgIC8qIFNjYW4gZm9yIG1hdGNoaW5nIF0uICovCisKKyAgICAgICAgaGVyZSA9IGM7CisgICAgICAgIGRvIGlmICggISpjKysgKSByZXR1cm4gMTsKKyAgICAgICAgd2hpbGUgKCAoIGhlcmUgPT0gYyApIHx8ICggKmMgIT0gJ10nICkgKTsKKyAgICAgICAgKytjOworCisgICAgICAgIC8qIEJ1aWxkIGNoYXJhY3RlciBjbGFzcyBiaXRsaXN0LiAqLworCisgICAgICAgIGdsb2JjaGFycyggaGVyZSwgYywgYml0bGlzdCApOworCisgICAgICAgIGlmICggIUNIRUNLX0JJVCggYml0bGlzdCwgKihjb25zdCB1bnNpZ25lZCBjaGFyICopcyApICkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICArK3M7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAnKic6CisgICAgICAgIGhlcmUgPSBzOworCisgICAgICAgIHdoaWxlICggKnMgKQorICAgICAgICAgICAgKytzOworCisgICAgICAgIC8qIFRyeSB0byBtYXRjaCB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybiBpbiBhIHJlY3Vyc2l2ZSAqLworICAgICAgICAvKiBjYWxsLiAgSWYgdGhlIG1hdGNoIGZhaWxzIHdlJ2xsIGJhY2sgdXAgY2hhcnMsIHJldHJ5aW5nLiAqLworCisgICAgICAgIHdoaWxlICggcyAhPSBoZXJlICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHI7CisKKyAgICAgICAgICAgIC8qIEEgZmFzdCBwYXRoIGZvciB0aGUgbGFzdCB0b2tlbiBpbiBhIHBhdHRlcm4uICovCisgICAgICAgICAgICByID0gKmMgPyBnbG9iKCBjLCBzICkgOiAqcyA/IC0xIDogMDsKKworICAgICAgICAgICAgaWYgKCAhciApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAoIHIgPCAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIC0tczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgLyogRm9yY2UgbGl0ZXJhbCBtYXRjaCBvZiBuZXh0IGNoYXIuICovCisgICAgICAgIGlmICggISpjIHx8ICggKnMrKyAhPSAqYysrICkgKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCAqcysrICE9IGNbIC0xIF0gKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCisvKgorICogZ2xvYmNoYXJzKCkgLSBidWlsZCBhIGJpdGxpc3QgdG8gY2hlY2sgZm9yIGNoYXJhY3RlciBncm91cCBtYXRjaC4KKyAqLworCitzdGF0aWMgdm9pZCBnbG9iY2hhcnMoIGNvbnN0IGNoYXIgKiBzLCAgY29uc3QgY2hhciAqIGUsIGNoYXIgKiBiICkKK3sKKyAgICBpbnQgbmVnID0gMDsKKworICAgIG1lbXNldCggYiwgJ1wwJywgQklUTElTVFNJWkUgICk7CisKKyAgICBpZiAoICpzID09ICdeJyApCisgICAgeworICAgICAgICArK25lZzsKKyAgICAgICAgKytzOworICAgIH0KKworICAgIHdoaWxlICggcyA8IGUgKQorICAgIHsKKyAgICAgICAgaW50IGM7CisKKyAgICAgICAgaWYgKCAoIHMgKyAyIDwgZSApICYmICggc1sxXSA9PSAnLScgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGMgPSBzWzBdOyBjIDw9IHNbMl07ICsrYyApCisgICAgICAgICAgICAgICAgYlsgYy84IF0gfD0gKCAxIDw8ICggYyAlIDggKSApOworICAgICAgICAgICAgcyArPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYyA9ICpzKys7CisgICAgICAgICAgICBiWyBjLzggXSB8PSAoIDEgPDwgKCBjICUgOCApICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIG5lZyApCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBCSVRMSVNUU0laRTsgKytpICkKKyAgICAgICAgICAgIGJbIGkgXSBePSAwMzc3OworICAgIH0KKworICAgIC8qIERvIG5vdCBpbmNsdWRlIFwwIGluIGVpdGhlciAkW2NoYXJzXSBvciAkW15jaGFyc10uICovCisgICAgYlswXSAmPSAwMzc2OworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvaGFzaC5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZjgzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9oYXNoLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NSBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qCisgKiBoYXNoLmMgLSBzaW1wbGUgaW4tbWVtb3J5IGhhc2hpbmcgcm91dGluZXMKKyAqCisgKiBFeHRlcm5hbCByb3V0aW5lczoKKyAqICAgICBoYXNoaW5pdCgpIC0gaW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUsIHJldHVybmluZyBhIGhhbmRsZQorICogICAgIGhhc2hpdGVtKCkgLSBmaW5kIGEgcmVjb3JkIGluIHRoZSB0YWJsZSwgYW5kIG9wdGlvbmFsbHkgZW50ZXIgYSBuZXcgb25lCisgKiAgICAgaGFzaGRvbmUoKSAtIGZyZWUgYSBoYXNoIHRhYmxlLCBnaXZlbiBpdHMgaGFuZGxlCisgKgorICogSW50ZXJuYWwgcm91dGluZXM6CisgKiAgICAgaGFzaHJlaGFzaCgpIC0gcmVzaXplIGFuZCByZWJ1aWxkIGhwLT50YWIsIHRoZSBoYXNoIHRhYmxlCisgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgImhhc2guaCIKKworI2luY2x1ZGUgImNvbXBpbGUuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisvKiAqLworI2RlZmluZSBIQVNIX0RFQlVHX1BST0ZJTEUgMQorLyogKi8KKworLyogSGVhZGVyIGF0dGFjaGVkIHRvIGFsbCBoYXNoIHRhYmxlIGRhdGEgaXRlbXMuICovCisKK3R5cGVkZWYgc3RydWN0IGl0ZW0gSVRFTTsKK3N0cnVjdCBpdGVtCit7CisgICAgSVRFTSAqIG5leHQ7Cit9OworCisjZGVmaW5lIE1BWF9MSVNUUyAzMgorCitzdHJ1Y3QgaGFzaAoreworICAgIC8qCisgICAgICogdGhlIGhhc2ggdGFibGUsIGp1c3QgYW4gYXJyYXkgb2YgaXRlbSBwb2ludGVycworICAgICAqLworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgaW50IG5lbDsKKyAgICAgICAgSVRFTSAqICogYmFzZTsKKyAgICB9IHRhYjsKKworICAgIGludCBibG9hdDsgIC8qIHRhYi5uZWwgLyBpdGVtcy5uZWwgKi8KKyAgICBpbnQgaW5lbDsgICAvKiBpbml0aWFsIG51bWJlciBvZiBlbGVtZW50cyAqLworCisgICAgLyoKKyAgICAgKiB0aGUgYXJyYXkgb2YgcmVjb3JkcywgbWFpbnRhaW5lZCBieSB0aGVzZSByb3V0aW5lcyAtIGVzc2VudGlhbGx5IGEKKyAgICAgKiBtaWNyb2FsbG9jYXRvcgorICAgICAqLworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgaW50IG1vcmU7ICAgICAvKiBob3cgbWFueSBtb3JlIElURU1zIGZpdCBpbiBsaXN0c1sgbGlzdCBdICovCisgICAgICAgIElURU0gKiBmcmVlOyAgLyogZnJlZSBsaXN0IG9mIGl0ZW1zICovCisgICAgICAgIGNoYXIgKiBuZXh0OyAgLyogd2hlcmUgdG8gcHV0IG1vcmUgSVRFTXMgaW4gbGlzdHNbIGxpc3QgXSAqLworICAgICAgICBpbnQgc2l6ZTsgICAgIC8qIHNpemVvZiggSVRFTSApICsgYWxpZ25lZCBkYXRhbGVuICovCisgICAgICAgIGludCBuZWw7ICAgICAgLyogdG90YWwgSVRFTXMgaGVsZCBieSBhbGwgbGlzdHNbXSAqLworICAgICAgICBpbnQgbGlzdDsgICAgIC8qIGluZGV4IGludG8gbGlzdHNbXSAqLworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbmVsOyAgICAgIC8qIHRvdGFsIElURU1zIGhlbGQgYnkgdGhpcyBsaXN0ICovCisgICAgICAgICAgICBjaGFyICogYmFzZTsgIC8qIGJhc2Ugb2YgSVRFTXMgYXJyYXkgKi8KKyAgICAgICAgfSBsaXN0c1sgTUFYX0xJU1RTIF07CisgICAgfSBpdGVtczsKKworICAgIGNoYXIgY29uc3QgKiBuYW1lOyAgLyoganVzdCBmb3IgaGFzaHN0YXRzKCkgKi8KK307CisKK3N0YXRpYyB2b2lkIGhhc2hyZWhhc2goIHN0cnVjdCBoYXNoICogKTsKK3N0YXRpYyB2b2lkIGhhc2hzdGF0KCBzdHJ1Y3QgaGFzaCAqICk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGFzaF9rZXl2YWwoIE9CSkVDVCAqIGtleSApCit7CisgICAgcmV0dXJuIG9iamVjdF9oYXNoKCBrZXkgKTsKK30KKworI2RlZmluZSBoYXNoX2J1Y2tldChocCwga2V5dmFsKSAoKGhwKS0+dGFiLmJhc2UgKyAoKGtleXZhbCkgJSAoaHApLT50YWIubmVsKSkKKworI2RlZmluZSBoYXNoX2RhdGFfa2V5KGRhdGEpICgqKE9CSkVDVCAqICopKGRhdGEpKQorI2RlZmluZSBoYXNoX2l0ZW1fZGF0YShpdGVtKSAoKEhBU0hEQVRBICopKChjaGFyICopaXRlbSArIHNpemVvZihJVEVNKSkpCisjZGVmaW5lIGhhc2hfaXRlbV9rZXkoaXRlbSkgKGhhc2hfZGF0YV9rZXkoaGFzaF9pdGVtX2RhdGEoaXRlbSkpKQorCisKKyNkZWZpbmUgQUxJR05FRCh4KSAoKHggKyBzaXplb2YoSVRFTSkgLSAxKSAmIH4oc2l6ZW9mKElURU0pIC0gMSkpCisKKy8qCisgKiBoYXNoaW5pdCgpIC0gaW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUsIHJldHVybmluZyBhIGhhbmRsZQorICovCisKK3N0cnVjdCBoYXNoICogaGFzaGluaXQoIGludCBkYXRhbGVuLCBjaGFyIGNvbnN0ICogbmFtZSApCit7CisgICAgc3RydWN0IGhhc2ggKiBocCA9IChzdHJ1Y3QgaGFzaCAqKUJKQU1fTUFMTE9DKCBzaXplb2YoICpocCApICk7CisKKyAgICBocC0+YmxvYXQgPSAzOworICAgIGhwLT50YWIubmVsID0gMDsKKyAgICBocC0+dGFiLmJhc2UgPSAwOworICAgIGhwLT5pdGVtcy5tb3JlID0gMDsKKyAgICBocC0+aXRlbXMuZnJlZSA9IDA7CisgICAgaHAtPml0ZW1zLnNpemUgPSBzaXplb2YoIElURU0gKSArIEFMSUdORUQoIGRhdGFsZW4gKTsKKyAgICBocC0+aXRlbXMubGlzdCA9IC0xOworICAgIGhwLT5pdGVtcy5uZWwgPSAwOworICAgIGhwLT5pbmVsID0gMTE7ICAvKiA0NyAqLworICAgIGhwLT5uYW1lID0gbmFtZTsKKworICAgIHJldHVybiBocDsKK30KKworCisvKgorICogaGFzaF9zZWFyY2goKSAtIEZpbmQgdGhlIGhhc2ggaXRlbSBmb3IgdGhlIGdpdmVuIGRhdGEuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBoYXNoZWQgaXRlbSB3aXRoIHRoZSBnaXZlbiBrZXkuIElmIGdpdmVuIGEgJ3ByZXZpb3VzJworICogcG9pbnRlciwgbWFrZXMgaXQgcG9pbnQgdG8gdGhlIGl0ZW0gcHJpb3IgdG8gdGhlIGZvdW5kIGl0ZW0gaW4gdGhlIHNhbWUKKyAqIGJ1Y2tldCBvciB0byAwIGlmIG91ciBpdGVtIGlzIHRoZSBmaXJzdCBpdGVtIGluIGl0cyBidWNrZXQuCisgKi8KKworc3RhdGljIElURU0gKiBoYXNoX3NlYXJjaCggc3RydWN0IGhhc2ggKiBocCwgdW5zaWduZWQgaW50IGtleXZhbCwKKyAgICBPQkpFQ1QgKiBrZXlkYXRhLCBJVEVNICogKiBwcmV2aW91cyApCit7CisgICAgSVRFTSAqIGkgPSAqaGFzaF9idWNrZXQoIGhwLCBrZXl2YWwgKTsKKyAgICBJVEVNICogcCA9IDA7CisgICAgZm9yICggOyBpOyBpID0gaS0+bmV4dCApCisgICAgeworICAgICAgICBpZiAoIG9iamVjdF9lcXVhbCggaGFzaF9pdGVtX2tleSggaSApLCBrZXlkYXRhICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHByZXZpb3VzICkKKyAgICAgICAgICAgICAgICAqcHJldmlvdXMgPSBwOworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICAgICAgcCA9IGk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBoYXNoX2luc2VydCgpIC0gaW5zZXJ0IGEgcmVjb3JkIGluIHRoZSB0YWJsZSBvciByZXR1cm4gdGhlIGV4aXN0aW5nIG9uZQorICovCisKK0hBU0hEQVRBICogaGFzaF9pbnNlcnQoIHN0cnVjdCBoYXNoICogaHAsIE9CSkVDVCAqIGtleSwgaW50ICogZm91bmQgKQoreworICAgIElURU0gKiBpOworICAgIHVuc2lnbmVkIGludCBrZXl2YWwgPSBoYXNoX2tleXZhbCgga2V5ICk7CisKKyAgICAjaWZkZWYgSEFTSF9ERUJVR19QUk9GSUxFCisgICAgcHJvZmlsZV9mcmFtZSBwcm9mWyAxIF07CisgICAgaWYgKCBERUJVR19QUk9GSUxFICkKKyAgICAgICAgcHJvZmlsZV9lbnRlciggMCwgcHJvZiApOworICAgICNlbmRpZgorCisgICAgaWYgKCAhaHAtPml0ZW1zLm1vcmUgKQorICAgICAgICBoYXNocmVoYXNoKCBocCApOworCisgICAgaSA9IGhhc2hfc2VhcmNoKCBocCwga2V5dmFsLCBrZXksIDAgKTsKKyAgICBpZiAoIGkgKQorICAgICAgICAqZm91bmQgPSAxOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIElURU0gKiAqIGJhc2UgPSBoYXNoX2J1Y2tldCggaHAsIGtleXZhbCApOworCisgICAgICAgIC8qIFRyeSB0byBncmFiIG9uZSBmcm9tIHRoZSBmcmVlIGxpc3QuICovCisgICAgICAgIGlmICggaHAtPml0ZW1zLmZyZWUgKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gaHAtPml0ZW1zLmZyZWU7CisgICAgICAgICAgICBocC0+aXRlbXMuZnJlZSA9IGktPm5leHQ7CisgICAgICAgICAgICBhc3NlcnQoICFoYXNoX2l0ZW1fa2V5KCBpICkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAoSVRFTSAqKWhwLT5pdGVtcy5uZXh0OworICAgICAgICAgICAgaHAtPml0ZW1zLm5leHQgKz0gaHAtPml0ZW1zLnNpemU7CisgICAgICAgIH0KKyAgICAgICAgLS1ocC0+aXRlbXMubW9yZTsKKyAgICAgICAgaS0+bmV4dCA9ICpiYXNlOworICAgICAgICAqYmFzZSA9IGk7CisgICAgICAgICpmb3VuZCA9IDA7CisgICAgfQorCisgICAgI2lmZGVmIEhBU0hfREVCVUdfUFJPRklMRQorICAgIGlmICggREVCVUdfUFJPRklMRSApCisgICAgICAgIHByb2ZpbGVfZXhpdCggcHJvZiApOworICAgICNlbmRpZgorCisgICAgcmV0dXJuIGhhc2hfaXRlbV9kYXRhKCBpICk7Cit9CisKKworLyoKKyAqIGhhc2hfZmluZCgpIC0gZmluZCBhIHJlY29yZCBpbiB0aGUgdGFibGUgb3IgTlVMTCBpZiBub25lIGV4aXN0cworICovCisKK0hBU0hEQVRBICogaGFzaF9maW5kKCBzdHJ1Y3QgaGFzaCAqIGhwLCBPQkpFQ1QgKiBrZXkgKQoreworICAgIElURU0gKiBpOworICAgIHVuc2lnbmVkIGludCBrZXl2YWwgPSBoYXNoX2tleXZhbCgga2V5ICk7CisKKyAgICAjaWZkZWYgSEFTSF9ERUJVR19QUk9GSUxFCisgICAgcHJvZmlsZV9mcmFtZSBwcm9mWyAxIF07CisgICAgaWYgKCBERUJVR19QUk9GSUxFICkKKyAgICAgICAgcHJvZmlsZV9lbnRlciggMCwgcHJvZiApOworICAgICNlbmRpZgorCisgICAgaWYgKCAhaHAtPml0ZW1zLm5lbCApCisgICAgeworICAgICAgICAjaWZkZWYgSEFTSF9ERUJVR19QUk9GSUxFCisgICAgICAgIGlmICggREVCVUdfUFJPRklMRSApCisgICAgICAgICAgICBwcm9maWxlX2V4aXQoIHByb2YgKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGkgPSBoYXNoX3NlYXJjaCggaHAsIGtleXZhbCwga2V5LCAwICk7CisKKyAgICAjaWZkZWYgSEFTSF9ERUJVR19QUk9GSUxFCisgICAgaWYgKCBERUJVR19QUk9GSUxFICkKKyAgICAgICAgcHJvZmlsZV9leGl0KCBwcm9mICk7CisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gaSA/IGhhc2hfaXRlbV9kYXRhKCBpICkgOiAwOworfQorCisKKy8qCisgKiBoYXNocmVoYXNoKCkgLSByZXNpemUgYW5kIHJlYnVpbGQgaHAtPnRhYiwgdGhlIGhhc2ggdGFibGUKKyAqLworCitzdGF0aWMgdm9pZCBoYXNocmVoYXNoKCBzdHJ1Y3QgaGFzaCAqIGhwICkKK3sKKyAgICBpbnQgaSA9ICsraHAtPml0ZW1zLmxpc3Q7CisgICAgaHAtPml0ZW1zLm1vcmUgPSBpID8gMiAqIGhwLT5pdGVtcy5uZWwgOiBocC0+aW5lbDsKKyAgICBocC0+aXRlbXMubmV4dCA9IChjaGFyICopQkpBTV9NQUxMT0MoIGhwLT5pdGVtcy5tb3JlICogaHAtPml0ZW1zLnNpemUgKTsKKyAgICBocC0+aXRlbXMuZnJlZSA9IDA7CisKKyAgICBocC0+aXRlbXMubGlzdHNbIGkgXS5uZWwgPSBocC0+aXRlbXMubW9yZTsKKyAgICBocC0+aXRlbXMubGlzdHNbIGkgXS5iYXNlID0gaHAtPml0ZW1zLm5leHQ7CisgICAgaHAtPml0ZW1zLm5lbCArPSBocC0+aXRlbXMubW9yZTsKKworICAgIGlmICggaHAtPnRhYi5iYXNlICkKKyAgICAgICAgQkpBTV9GUkVFKCAoY2hhciAqKWhwLT50YWIuYmFzZSApOworCisgICAgaHAtPnRhYi5uZWwgPSBocC0+aXRlbXMubmVsICogaHAtPmJsb2F0OworICAgIGhwLT50YWIuYmFzZSA9IChJVEVNICogKilCSkFNX01BTExPQyggaHAtPnRhYi5uZWwgKiBzaXplb2YoIElURU0gKiAqICkgKTsKKworICAgIG1lbXNldCggKGNoYXIgKilocC0+dGFiLmJhc2UsICdcMCcsIGhwLT50YWIubmVsICogc2l6ZW9mKCBJVEVNICogKSApOworCisgICAgZm9yICggaSA9IDA7IGkgPCBocC0+aXRlbXMubGlzdDsgKytpICkKKyAgICB7CisgICAgICAgIGludCBuZWwgPSBocC0+aXRlbXMubGlzdHNbIGkgXS5uZWw7CisgICAgICAgIGNoYXIgKiBuZXh0ID0gaHAtPml0ZW1zLmxpc3RzWyBpIF0uYmFzZTsKKworICAgICAgICBmb3IgKCA7IG5lbC0tOyBuZXh0ICs9IGhwLT5pdGVtcy5zaXplICkKKyAgICAgICAgeworICAgICAgICAgICAgSVRFTSAqIGkgPSAoSVRFTSAqKW5leHQ7CisgICAgICAgICAgICBJVEVNICogKiBpcCA9IGhwLT50YWIuYmFzZSArIG9iamVjdF9oYXNoKCBoYXNoX2l0ZW1fa2V5KCBpICkgKSAlCisgICAgICAgICAgICAgICAgaHAtPnRhYi5uZWw7CisgICAgICAgICAgICAvKiBjb2RlIGN1cnJlbnRseSBhc3N1bWVzIHJlaGFzaGluZyBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vIGZyZWUKKyAgICAgICAgICAgICAqIGl0ZW1zCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzc2VydCggaGFzaF9pdGVtX2tleSggaSApICk7CisKKyAgICAgICAgICAgIGktPm5leHQgPSAqaXA7CisgICAgICAgICAgICAqaXAgPSBpOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgaGFzaGVudW1lcmF0ZSggc3RydWN0IGhhc2ggKiBocCwgdm9pZCAoKiBmKSggdm9pZCAqLCB2b2lkICogKSwgdm9pZCAqIGRhdGEKKyAgICApCit7CisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPD0gaHAtPml0ZW1zLmxpc3Q7ICsraSApCisgICAgeworICAgICAgICBjaGFyICogbmV4dCA9IGhwLT5pdGVtcy5saXN0c1sgaSBdLmJhc2U7CisgICAgICAgIGludCBuZWwgPSBocC0+aXRlbXMubGlzdHNbIGkgXS5uZWw7CisgICAgICAgIGlmICggaSA9PSBocC0+aXRlbXMubGlzdCApCisgICAgICAgICAgICBuZWwgLT0gaHAtPml0ZW1zLm1vcmU7CisKKyAgICAgICAgZm9yICggOyBuZWwtLTsgbmV4dCArPSBocC0+aXRlbXMuc2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIElURU0gKiBjb25zdCBpID0gKElURU0gKiluZXh0OworICAgICAgICAgICAgaWYgKCBoYXNoX2l0ZW1fa2V5KCBpICkgIT0gMCApICAvKiBEbyBub3QgZW51bWVyYXRlIGZyZWVkIGl0ZW1zLiAqLworICAgICAgICAgICAgICAgIGYoIGhhc2hfaXRlbV9kYXRhKCBpICksIGRhdGEgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKgorICogaGFzaF9mcmVlKCkgLSBmcmVlIGEgaGFzaCB0YWJsZSwgZ2l2ZW4gaXRzIGhhbmRsZQorICovCisKK3ZvaWQgaGFzaF9mcmVlKCBzdHJ1Y3QgaGFzaCAqIGhwICkKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAoICFocCApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIGhwLT50YWIuYmFzZSApCisgICAgICAgIEJKQU1fRlJFRSggKGNoYXIgKilocC0+dGFiLmJhc2UgKTsKKyAgICBmb3IgKCBpID0gMDsgaSA8PSBocC0+aXRlbXMubGlzdDsgKytpICkKKyAgICAgICAgQkpBTV9GUkVFKCBocC0+aXRlbXMubGlzdHNbIGkgXS5iYXNlICk7CisgICAgQkpBTV9GUkVFKCAoY2hhciAqKWhwICk7Cit9CisKKworc3RhdGljIHZvaWQgaGFzaHN0YXQoIHN0cnVjdCBoYXNoICogaHAgKQoreworICAgIHN0cnVjdCBoYXNoc3RhdHMgc3RhdHNbIDEgXTsKKyAgICBoYXNoc3RhdHNfaW5pdCggc3RhdHMgKTsKKyAgICBoYXNoc3RhdHNfYWRkKCBzdGF0cywgaHAgKTsKKyAgICBoYXNoc3RhdHNfcHJpbnQoIHN0YXRzLCBocC0+bmFtZSApOworfQorCisKK3ZvaWQgaGFzaHN0YXRzX2luaXQoIHN0cnVjdCBoYXNoc3RhdHMgKiBzdGF0cyApCit7CisgICAgc3RhdHMtPmNvdW50ID0gMDsKKyAgICBzdGF0cy0+bnVtX2l0ZW1zID0gMDsKKyAgICBzdGF0cy0+dGFiX3NpemUgPSAwOworICAgIHN0YXRzLT5pdGVtX3NpemUgPSAwOworICAgIHN0YXRzLT5zZXRzID0gMDsKKyAgICBzdGF0cy0+bnVtX2hhc2hlcyA9IDA7Cit9CisKKwordm9pZCBoYXNoc3RhdHNfYWRkKCBzdHJ1Y3QgaGFzaHN0YXRzICogc3RhdHMsIHN0cnVjdCBoYXNoICogaHAgKQoreworICAgIGlmICggaHAgKQorICAgIHsKKyAgICAgICAgSVRFTSAqICogdGFiID0gaHAtPnRhYi5iYXNlOworICAgICAgICBpbnQgbmVsID0gaHAtPnRhYi5uZWw7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGludCBzZXRzID0gMDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBuZWw7ICsraSApCisgICAgICAgIHsKKyAgICAgICAgICAgIElURU0gKiBpdGVtOworICAgICAgICAgICAgaW50IGhlcmUgPSAwOworICAgICAgICAgICAgZm9yICggaXRlbSA9IHRhYlsgaSBdOyBpdGVtOyBpdGVtID0gaXRlbS0+bmV4dCApCisgICAgICAgICAgICAgICAgKytoZXJlOworCisgICAgICAgICAgICBjb3VudCArPSBoZXJlOworICAgICAgICAgICAgaWYgKCBoZXJlID4gMCApCisgICAgICAgICAgICAgICAgKytzZXRzOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHMtPmNvdW50ICs9IGNvdW50OworICAgICAgICBzdGF0cy0+c2V0cyArPSBzZXRzOworICAgICAgICBzdGF0cy0+bnVtX2l0ZW1zICs9IGhwLT5pdGVtcy5uZWw7CisgICAgICAgIHN0YXRzLT50YWJfc2l6ZSArPSBocC0+dGFiLm5lbDsKKyAgICAgICAgc3RhdHMtPml0ZW1fc2l6ZSA9IGhwLT5pdGVtcy5zaXplOworICAgICAgICArK3N0YXRzLT5udW1faGFzaGVzOworICAgIH0KK30KKworCit2b2lkIGhhc2hzdGF0c19wcmludCggc3RydWN0IGhhc2hzdGF0cyAqIHN0YXRzLCBjaGFyIGNvbnN0ICogbmFtZSApCit7CisgICAgcHJpbnRmKCAiJXMgdGFibGU6ICVkKyVkKyVkICglZEsrJWx1SyslbHVLKSBpdGVtcyt0YWJsZStoYXNoLCAlZiBkZW5zaXR5XG4iLAorICAgICAgICBuYW1lLAorICAgICAgICBzdGF0cy0+Y291bnQsCisgICAgICAgIHN0YXRzLT5udW1faXRlbXMsCisgICAgICAgIHN0YXRzLT50YWJfc2l6ZSwKKyAgICAgICAgc3RhdHMtPm51bV9pdGVtcyAqIHN0YXRzLT5pdGVtX3NpemUgLyAxMDI0LAorICAgICAgICAobG9uZyB1bnNpZ25lZClzdGF0cy0+dGFiX3NpemUgKiBzaXplb2YoIElURU0gKiAqICkgLyAxMDI0LAorICAgICAgICAobG9uZyB1bnNpZ25lZClzdGF0cy0+bnVtX2hhc2hlcyAqIHNpemVvZiggc3RydWN0IGhhc2ggKSAvIDEwMjQsCisgICAgICAgIChmbG9hdClzdGF0cy0+Y291bnQgLyAoZmxvYXQpc3RhdHMtPnNldHMgKTsKK30KKworCit2b2lkIGhhc2hkb25lKCBzdHJ1Y3QgaGFzaCAqIGhwICkKK3sKKyAgICBpZiAoICFocCApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIERFQlVHX01FTSB8fCBERUJVR19QUk9GSUxFICkKKyAgICAgICAgaGFzaHN0YXQoIGhwICk7CisgICAgaGFzaF9mcmVlKCBocCApOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvaGFzaC5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDBlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9oYXNoLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk1IENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyoKKyAqIGhhc2guaCAtIHNpbXBsZSBpbi1tZW1vcnkgaGFzaGluZyByb3V0aW5lcworICovCisKKyNpZm5kZWYgQk9PU1RfSkFNX0hBU0hfSAorI2RlZmluZSBCT09TVF9KQU1fSEFTSF9ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworLyoKKyAqIEFuIG9wYXF1ZSBzdHJ1Y3QgcmVwcmVzZW50aW5nIGFuIGl0ZW0gaW4gdGhlIGhhc2ggdGFibGUuIFRoZSBmaXJzdCBlbGVtZW50IG9mCisgKiBldmVyeSBzdHJ1Y3Qgc3RvcmVkIGluIHRoZSB0YWJsZSBtdXN0IGJlIGFuIE9CSkVDVCAqIHdoaWNoIGlzIHRyZWF0ZWQgYXMgdGhlCisgKiBrZXkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGhhc2hkYXRhIEhBU0hEQVRBOworCisvKgorICogaGFzaGluaXQoKSAtIGluaXRpYWxpemUgYSBoYXNoIHRhYmxlLCByZXR1cm5pbmcgYSBoYW5kbGUuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgZGF0YWxlbiAtIGl0ZW0gc2l6ZQorICogICBuYW1lICAgIC0gdXNlZCBmb3IgZGVidWdnaW5nCisgKi8KK3N0cnVjdCBoYXNoICogaGFzaGluaXQoIGludCBkYXRhbGVuLCBjaGFyIGNvbnN0ICogbmFtZSApOworCisvKgorICogaGFzaF9mcmVlKCkgLSBmcmVlIGEgaGFzaCB0YWJsZSwgZ2l2ZW4gaXRzIGhhbmRsZQorICovCit2b2lkIGhhc2hfZnJlZSggc3RydWN0IGhhc2ggKiApOwordm9pZCBoYXNoZG9uZSggc3RydWN0IGhhc2ggKiApOworCisvKgorICogaGFzaGVudW1lcmF0ZSgpIC0gY2FsbCBmKGksIGRhdGEpIG9uIGVhY2ggaXRlbSwgaSBpbiB0aGUgaGFzaCB0YWJsZS4gVGhlCisgKiBlbnVtZXJhdGlvbiBvcmRlciBpcyB1bnNwZWNpZmllZC4KKyAqLwordm9pZCBoYXNoZW51bWVyYXRlKCBzdHJ1Y3QgaGFzaCAqLCB2b2lkICgqIGYpKCB2b2lkICosIHZvaWQgKiApLCB2b2lkICogZGF0YSApOworCisvKgorICogaGFzaF9pbnNlcnQoKSAtIGluc2VydCBhIG5ldyBpdGVtIGluIGEgaGFzaCB0YWJsZSwgb3IgcmV0dXJuIGFuIGV4aXN0aW5nIG9uZS4KKyAqCisgKiBQcmVjb25kaXRpb25zOgorICogICAtIGhwIG11c3QgYmUgYSBoYXNoIHRhYmxlIGNyZWF0ZWQgYnkgaGFzaGluaXQoKQorICogICAtIGtleSBtdXN0IGJlIGFuIG9iamVjdCBjcmVhdGVkIGJ5IG9iamVjdF9uZXcoKQorICoKKyAqIFBvc3Rjb25kaXRpb25zOgorICogICAtIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgaGFzaCB0YWJsZSwgKmZvdW5kID09IDAgYW5kIHRoZQorICogICAgIHJlc3VsdCB3aWxsIGJlIGEgcG9pbnRlciB0byBhbiB1bmluaXRpYWxpemVkIGl0ZW0uIFRoZSBrZXkgb2YgdGhlIG5ldworICogICAgIGl0ZW0gbXVzdCBiZSBzZXQgdG8gYSB2YWx1ZSBlcXVhbCB0byBrZXkgYmVmb3JlIGFueSBmdXJ0aGVyIG9wZXJhdGlvbnMgb24KKyAqICAgICB0aGUgaGFzaCB0YWJsZSBleGNlcHQgaGFzaGRvbmUoKS4KKyAqICAgLSBpZiB0aGUga2V5IGlzIHByZXNlbnQgdGhlbiAqZm91bmQgPT0gMSBhbmQgdGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlCisgKiAgICAgZXhpc3RpbmcgcmVjb3JkLgorICovCitIQVNIREFUQSAqIGhhc2hfaW5zZXJ0KCBzdHJ1Y3QgaGFzaCAqLCBPQkpFQ1QgKiBrZXksIGludCAqIGZvdW5kICk7CisKKy8qCisgKiBoYXNoX2ZpbmQoKSAtIGZpbmQgYSByZWNvcmQgaW4gdGhlIHRhYmxlIG9yIE5VTEwgaWYgbm9uZSBleGlzdHMKKyAqLworSEFTSERBVEEgKiBoYXNoX2ZpbmQoIHN0cnVjdCBoYXNoICosIE9CSkVDVCAqIGtleSApOworCitzdHJ1Y3QgaGFzaHN0YXRzIHsKKyAgICBpbnQgY291bnQ7CisgICAgaW50IG51bV9pdGVtczsKKyAgICBpbnQgdGFiX3NpemU7CisgICAgaW50IGl0ZW1fc2l6ZTsKKyAgICBpbnQgc2V0czsKKyAgICBpbnQgbnVtX2hhc2hlczsKK307CisKK3ZvaWQgaGFzaHN0YXRzX2luaXQoIHN0cnVjdCBoYXNoc3RhdHMgKiBzdGF0cyApOwordm9pZCBoYXNoc3RhdHNfYWRkKCBzdHJ1Y3QgaGFzaHN0YXRzICogc3RhdHMsIHN0cnVjdCBoYXNoICogKTsKK3ZvaWQgaGFzaHN0YXRzX3ByaW50KCBzdHJ1Y3QgaGFzaHN0YXRzICogc3RhdHMsIGNoYXIgY29uc3QgKiBuYW1lICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvaGNhY2hlLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9oY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2YxNWY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvaGNhY2hlLmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gZG9uYXRlZCB0byBKYW0uCisgKi8KKworLyoKKyAqIENyYWlnIFcuIE1jUGhlZXRlcnMsIEFsaWFzfFdhdmVmcm9udC4KKyAqCisgKiBoY2FjaGUuYyBoY2FjaGUuaCAtIGhhbmRsZSBjYWNoZWluZyBvZiAjaW5jbHVkZXMgaW4gc291cmNlIGZpbGVzLgorICoKKyAqIENyZWF0ZSBhIGNhY2hlIG9mIGZpbGVzIHNjYW5uZWQgZm9yIGhlYWRlcnMuIFdoZW4gc3RhcnRpbmcgamFtLCBsb29rIGZvciB0aGUKKyAqIGNhY2hlIGZpbGUgYW5kIGxvYWQgaXQgaWYgcHJlc2VudC4gV2hlbiBmaW5pc2hlZCB0aGUgYmluZGluZyBwaGFzZSwgY3JlYXRlIGEKKyAqIG5ldyBoZWFkZXIgY2FjaGUuIFRoZSBjYWNoZSBjb250YWlucyBmaWxlcywgdGhlaXIgdGltZXN0YW1wcyBhbmQgdGhlIGhlYWRlcgorICogZmlsZXMgZm91bmQgaW4gdGhlaXIgc2Nhbi4gRHVyaW5nIHRoZSBiaW5kaW5nIHBoYXNlIG9mIGphbSwgbG9vayBpbiB0aGUKKyAqIGhlYWRlciBjYWNoZSBmaXJzdCBmb3IgdGhlIGhlYWRlcnMgY29udGFpbmVkIGluIGEgZmlsZS4gSWYgdGhlIGNhY2hlIGlzCisgKiBwcmVzZW50IGFuZCB2YWxpZCwgdXNlIGl0cyBjb250ZW50cy4gVGhpcyByZXN1bHRzIGluIGRyYW1hdGljIHNwZWVkdXBzIHdpdGgKKyAqIGxhcmdlIHByb2plY3RzIChlLmcuIDNtaW4gLT4gMW1pbiBzdGFydHVwIGZvciBvbmUgcHJvamVjdC4pCisgKgorICogRXh0ZXJuYWwgcm91dGluZXM6CisgKiAgICBoY2FjaGVfaW5pdCgpIC0gcmVhZCBhbmQgcGFyc2UgdGhlIGxvY2FsIC5qYW1kZXBzIGZpbGUuCisgKiAgICBoY2FjaGVfZG9uZSgpIC0gd3JpdGUgYSBuZXcgLmphbWRlcHMgZmlsZS4KKyAqICAgIGhjYWNoZSgpICAgICAgLSByZXR1cm4gbGlzdCBvZiBoZWFkZXJzIG9uIHRhcmdldC4gVXNlIGNhY2hlIG9yIGRvIGEgc2Nhbi4KKyAqCisgKiBUaGUgZGVwZW5kZW5jeSBmaWxlIGZvcm1hdCBpcyBhbiBBU0NJSSBmaWxlIHdpdGggMSBsaW5lIHBlciB0YXJnZXQuIEVhY2ggbGluZQorICogaGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorICogQGJvdW5kbmFtZUAgdGltZXN0YW1wX3NlYyB0aW1lc3RhbXBfbnNlYyBAZmlsZUAgQGZpbGVAIEBmaWxlQCAuLi4KKyAqLworCisjaWZkZWYgT1BUX0hFQURFUl9DQUNIRV9FWFQKKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgImhjYWNoZS5oIgorCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgImhlYWRlcnMuaCIKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgIm1vZHVsZXMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJwYXJzZS5oIgorI2luY2x1ZGUgInJlZ2V4cC5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisjaW5jbHVkZSAic2VhcmNoLmgiCisjaW5jbHVkZSAidGltZXN0YW1wLmgiCisjaW5jbHVkZSAidmFyaWFibGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgaGNhY2hlZGF0YSBIQ0FDSEVEQVRBIDsKKworc3RydWN0IGhjYWNoZWRhdGEKK3sKKyAgICBPQkpFQ1QgICAgICogYm91bmRuYW1lOworICAgIHRpbWVzdGFtcCAgICB0aW1lOworICAgIExJU1QgICAgICAgKiBpbmNsdWRlczsKKyAgICBMSVNUICAgICAgICogaGRyc2NhbjsgICAgLyogdGhlIEhEUlNDQU4gdmFsdWUgZm9yIHRoaXMgdGFyZ2V0ICovCisgICAgaW50ICAgICAgICAgIGFnZTsgICAgICAgIC8qIGlmIHRvbyBvbGQsIHdlIHdpbGwgcmVtb3ZlIGl0IGZyb20gY2FjaGUgKi8KKyAgICBIQ0FDSEVEQVRBICogbmV4dDsKK307CisKKworc3RhdGljIHN0cnVjdCBoYXNoICogaGNhY2hlaGFzaCA9IDA7CitzdGF0aWMgSENBQ0hFREFUQSAqIGhjYWNoZWxpc3QgPSAwOworCitzdGF0aWMgaW50IHF1ZXJpZXMgPSAwOworc3RhdGljIGludCBoaXRzID0gMDsKKworI2RlZmluZSBDQUNIRV9GSUxFX1ZFUlNJT04gInZlcnNpb24gNSIKKyNkZWZpbmUgQ0FDSEVfUkVDT1JEX0hFQURFUiAiaGVhZGVyIgorI2RlZmluZSBDQUNIRV9SRUNPUkRfRU5EICJlbmQiCisKKworLyoKKyAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIGNhY2hlIGZpbGUuIE1heSByZXR1cm4gTlVMTC4KKyAqCisgKiBUaGUgdXNlciBzZXRzIHRoaXMgYnkgc2V0dGluZyB0aGUgSENBQ0hFRklMRSB2YXJpYWJsZSBpbiBhIEphbWZpbGUuIFdlIGNhY2hlCisgKiB0aGUgcmVzdWx0IHNvIHRoZSB1c2VyIGNhbiBub3QgY2hhbmdlIHRoZSBjYWNoZSBmaWxlIGR1cmluZyBoZWFkZXIgc2Nhbm5pbmcuCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjYWNoZV9uYW1lKCB2b2lkICkKK3sKKyAgICBzdGF0aWMgT0JKRUNUICogbmFtZSA9IDA7CisgICAgaWYgKCAhbmFtZSApCisgICAgeworICAgICAgICBMSVNUICogY29uc3QgaGNhY2hldmFyID0gdmFyX2dldCggcm9vdF9tb2R1bGUoKSwgY29uc3RhbnRfSENBQ0hFRklMRSApOworCisgICAgICAgIGlmICggIWxpc3RfZW1wdHkoIGhjYWNoZXZhciApICkKKyAgICAgICAgeworICAgICAgICAgICAgVEFSR0VUICogY29uc3QgdCA9IGJpbmR0YXJnZXQoIGxpc3RfZnJvbnQoIGhjYWNoZXZhciApICk7CisKKyAgICAgICAgICAgIHB1c2hzZXR0aW5ncyggcm9vdF9tb2R1bGUoKSwgdC0+c2V0dGluZ3MgKTsKKyAgICAgICAgICAgIC8qIERvIG5vdCBleHBlY3QgdGhlIGNhY2hlIGZpbGUgdG8gYmUgZ2VuZXJhdGVkLCBzbyBwYXNzIDAgYXMgdGhlCisgICAgICAgICAgICAgKiB0aGlyZCBhcmd1bWVudCB0byBzZWFyY2guIEV4cGVjdCB0aGUgbG9jYXRpb24gdG8gYmUgc3BlY2lmaWVkIHZpYQorICAgICAgICAgICAgICogTE9DQVRFLCBzbyBwYXNzIDAgYXMgdGhlIGZvdXJ0aCBhcnVnbWVudC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIHQtPmJvdW5kbmFtZSApOworICAgICAgICAgICAgdC0+Ym91bmRuYW1lID0gc2VhcmNoKCB0LT5uYW1lLCAmdC0+dGltZSwgMCwgMCApOworICAgICAgICAgICAgcG9wc2V0dGluZ3MoIHJvb3RfbW9kdWxlKCksIHQtPnNldHRpbmdzICk7CisKKyAgICAgICAgICAgIG5hbWUgPSBvYmplY3RfY29weSggdC0+Ym91bmRuYW1lICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5hbWUgPyBvYmplY3Rfc3RyKCBuYW1lICkgOiAwOworfQorCisKKy8qCisgKiBSZXR1cm4gdGhlIG1heGltdW0gYWdlIGEgY2FjaGUgZW50cnkgY2FuIGhhdmUgYmVmb3JlIGl0IGlzIHB1cmdlZCBmcm9tIHRoZQorICogY2FjaGUuCisgKi8KKworc3RhdGljIGludCBjYWNoZV9tYXhhZ2UoIHZvaWQgKQoreworICAgIGludCBhZ2UgPSAxMDA7CisgICAgTElTVCAqIGNvbnN0IHZhciA9IHZhcl9nZXQoIHJvb3RfbW9kdWxlKCksIGNvbnN0YW50X0hDQUNIRU1BWEFHRSApOworICAgIGlmICggIWxpc3RfZW1wdHkoIHZhciApICkKKyAgICB7CisgICAgICAgIGFnZSA9IGF0b2koIG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIHZhciApICkgKTsKKyAgICAgICAgaWYgKCBhZ2UgPCAwICkKKyAgICAgICAgICAgIGFnZSA9IDA7CisgICAgfQorICAgIHJldHVybiBhZ2U7Cit9CisKKworLyoKKyAqIFJlYWQgYSBuZXRzdHJpbmcuIFRoZSBjYXZlYXQgaXMgdGhhdCB0aGUgc3RyaW5nIGNhbiBub3QgY29udGFpbiBBU0NJSSAwLiBUaGUKKyAqIHJldHVybmVkIHZhbHVlIGlzIGFzIHJldHVybmVkIGJ5IG9iamVjdF9uZXcoKS4KKyAqLworCitPQkpFQ1QgKiByZWFkX25ldHN0cmluZyggRklMRSAqIGYgKQoreworICAgIHVuc2lnbmVkIGxvbmcgbGVuOworICAgIHN0YXRpYyBjaGFyICogYnVmID0gTlVMTDsKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBidWZfbGVuID0gMDsKKworICAgIGlmICggZnNjYW5mKCBmLCAiICU5bHUiLCAmbGVuICkgIT0gMSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggZmdldGMoIGYgKSAhPSAoaW50KSdcdCcgKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICggbGVuID4gMTAyNCAqIDY0ICkKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAvKiBzYW5pdHkgY2hlY2sgKi8KKworICAgIGlmICggbGVuID4gYnVmX2xlbiApCisgICAgeworICAgICAgICB1bnNpZ25lZCBsb25nIG5ld19sZW4gPSBidWZfbGVuICogMjsKKyAgICAgICAgaWYgKCBuZXdfbGVuIDwgbGVuICkKKyAgICAgICAgICAgIG5ld19sZW4gPSBsZW47CisgICAgICAgIGJ1ZiA9IChjaGFyICopQkpBTV9SRUFMTE9DKCBidWYsIG5ld19sZW4gKyAxICk7CisgICAgICAgIGlmICggYnVmICkKKyAgICAgICAgICAgIGJ1Zl9sZW4gPSBuZXdfbGVuOworICAgIH0KKworICAgIGlmICggIWJ1ZiApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCBmcmVhZCggYnVmLCAxLCBsZW4sIGYgKSAhPSBsZW4gKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIGZnZXRjKCBmICkgIT0gKGludCknXG4nICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBidWZbIGxlbiBdID0gMDsKKyAgICByZXR1cm4gb2JqZWN0X25ldyggYnVmICk7Cit9CisKKworLyoKKyAqIFdyaXRlIGEgbmV0c3RyaW5nLgorICovCisKK3ZvaWQgd3JpdGVfbmV0c3RyaW5nKCBGSUxFICogZiwgY2hhciBjb25zdCAqIHMgKQoreworICAgIGlmICggIXMgKQorICAgICAgICBzID0gIiI7CisgICAgZnByaW50ZiggZiwgIiVsdVx0JXNcbiIsIChsb25nIHVuc2lnbmVkKXN0cmxlbiggcyApLCBzICk7Cit9CisKKwordm9pZCBoY2FjaGVfaW5pdCgpCit7CisgICAgRklMRSAgICAgICAqIGY7CisgICAgT0JKRUNUICAgICAqIHZlcnNpb24gPSAwOworICAgIGludCAgICAgICAgICBoZWFkZXJfY291bnQgPSAwOworICAgIGNvbnN0IGNoYXIgKiBoY2FjaGVuYW1lOworCisgICAgaWYgKCBoY2FjaGVoYXNoICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaGNhY2hlaGFzaCA9IGhhc2hpbml0KCBzaXplb2YoIEhDQUNIRURBVEEgKSwgImhjYWNoZSIgKTsKKworICAgIGlmICggISggaGNhY2hlbmFtZSA9IGNhY2hlX25hbWUoKSApICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCAhKCBmID0gZm9wZW4oIGhjYWNoZW5hbWUsICJyYiIgKSApICkKKyAgICAgICAgcmV0dXJuOworCisgICAgdmVyc2lvbiA9IHJlYWRfbmV0c3RyaW5nKCBmICk7CisKKyAgICBpZiAoICF2ZXJzaW9uIHx8IHN0cmNtcCggb2JqZWN0X3N0ciggdmVyc2lvbiApLCBDQUNIRV9GSUxFX1ZFUlNJT04gKSApCisgICAgICAgIGdvdG8gYmFpbDsKKworICAgIHdoaWxlICggMSApCisgICAgeworICAgICAgICBIQ0FDSEVEQVRBICAgY2FjaGVkYXRhOworICAgICAgICBIQ0FDSEVEQVRBICogYzsKKyAgICAgICAgT0JKRUNUICogcmVjb3JkX3R5cGUgPSAwOworICAgICAgICBPQkpFQ1QgKiB0aW1lX3NlY3Nfc3RyID0gMDsKKyAgICAgICAgT0JKRUNUICogdGltZV9uc2Vjc19zdHIgPSAwOworICAgICAgICBPQkpFQ1QgKiBhZ2Vfc3RyID0gMDsKKyAgICAgICAgT0JKRUNUICogaW5jbHVkZXNfY291bnRfc3RyID0gMDsKKyAgICAgICAgT0JKRUNUICogaGRyc2Nhbl9jb3VudF9zdHIgPSAwOworICAgICAgICBpbnQgICAgICBpOworICAgICAgICBpbnQgICAgICBjb3VudDsKKyAgICAgICAgTElTVCAgICogbDsKKyAgICAgICAgaW50ICAgICAgZm91bmQ7CisKKyAgICAgICAgY2FjaGVkYXRhLmJvdW5kbmFtZSA9IDA7CisgICAgICAgIGNhY2hlZGF0YS5pbmNsdWRlcyA9IDA7CisgICAgICAgIGNhY2hlZGF0YS5oZHJzY2FuID0gMDsKKworICAgICAgICByZWNvcmRfdHlwZSA9IHJlYWRfbmV0c3RyaW5nKCBmICk7CisgICAgICAgIGlmICggIXJlY29yZF90eXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiaW52YWxpZCAlc1xuIiwgaGNhY2hlbmFtZSApOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgICAgIGlmICggIXN0cmNtcCggb2JqZWN0X3N0ciggcmVjb3JkX3R5cGUgKSwgQ0FDSEVfUkVDT1JEX0VORCApICkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIHJlY29yZF90eXBlICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHN0cmNtcCggb2JqZWN0X3N0ciggcmVjb3JkX3R5cGUgKSwgQ0FDSEVfUkVDT1JEX0hFQURFUiApICkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiaW52YWxpZCAlcyB3aXRoIHJlY29yZCBzZXBhcmF0b3IgPCVzPlxuIiwKKyAgICAgICAgICAgICAgICBoY2FjaGVuYW1lLCByZWNvcmRfdHlwZSA/IG9iamVjdF9zdHIoIHJlY29yZF90eXBlICkgOiAiPG51bGw+IiApOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgY2FjaGVkYXRhLmJvdW5kbmFtZSA9IHJlYWRfbmV0c3RyaW5nKCBmICk7CisgICAgICAgIHRpbWVfc2Vjc19zdHIgICAgICAgPSByZWFkX25ldHN0cmluZyggZiApOworICAgICAgICB0aW1lX25zZWNzX3N0ciAgICAgID0gcmVhZF9uZXRzdHJpbmcoIGYgKTsKKyAgICAgICAgYWdlX3N0ciAgICAgICAgICAgICA9IHJlYWRfbmV0c3RyaW5nKCBmICk7CisgICAgICAgIGluY2x1ZGVzX2NvdW50X3N0ciAgPSByZWFkX25ldHN0cmluZyggZiApOworCisgICAgICAgIGlmICggIWNhY2hlZGF0YS5ib3VuZG5hbWUgfHwgIXRpbWVfc2Vjc19zdHIgfHwgIXRpbWVfbnNlY3Nfc3RyIHx8CisgICAgICAgICAgICAhYWdlX3N0ciB8fCAhaW5jbHVkZXNfY291bnRfc3RyICkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiaW52YWxpZCAlc1xuIiwgaGNhY2hlbmFtZSApOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgdGltZXN0YW1wX2luaXQoICZjYWNoZWRhdGEudGltZSwgYXRvaSggb2JqZWN0X3N0ciggdGltZV9zZWNzX3N0ciApICksCisgICAgICAgICAgICBhdG9pKCBvYmplY3Rfc3RyKCB0aW1lX25zZWNzX3N0ciApICkgKTsKKyAgICAgICAgY2FjaGVkYXRhLmFnZSA9IGF0b2koIG9iamVjdF9zdHIoIGFnZV9zdHIgKSApICsgMTsKKworICAgICAgICBjb3VudCA9IGF0b2koIG9iamVjdF9zdHIoIGluY2x1ZGVzX2NvdW50X3N0ciApICk7CisgICAgICAgIGZvciAoIGwgPSBMMCwgaSA9IDA7IGkgPCBjb3VudDsgKytpICkKKyAgICAgICAgeworICAgICAgICAgICAgT0JKRUNUICogY29uc3QgcyA9IHJlYWRfbmV0c3RyaW5nKCBmICk7CisgICAgICAgICAgICBpZiAoICFzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJpbnZhbGlkICVzXG4iLCBoY2FjaGVuYW1lICk7CisgICAgICAgICAgICAgICAgbGlzdF9mcmVlKCBsICk7CisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbCA9IGxpc3RfcHVzaF9iYWNrKCBsLCBzICk7CisgICAgICAgIH0KKyAgICAgICAgY2FjaGVkYXRhLmluY2x1ZGVzID0gbDsKKworICAgICAgICBoZHJzY2FuX2NvdW50X3N0ciA9IHJlYWRfbmV0c3RyaW5nKCBmICk7CisgICAgICAgIGlmICggIWhkcnNjYW5fY291bnRfc3RyICkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiaW52YWxpZCAlc1xuIiwgaGNhY2hlbmFtZSApOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgPSBhdG9pKCBvYmplY3Rfc3RyKCBoZHJzY2FuX2NvdW50X3N0ciApICk7CisgICAgICAgIGZvciAoIGwgPSBMMCwgaSA9IDA7IGkgPCBjb3VudDsgKytpICkKKyAgICAgICAgeworICAgICAgICAgICAgT0JKRUNUICogY29uc3QgcyA9IHJlYWRfbmV0c3RyaW5nKCBmICk7CisgICAgICAgICAgICBpZiAoICFzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJpbnZhbGlkICVzXG4iLCBoY2FjaGVuYW1lICk7CisgICAgICAgICAgICAgICAgbGlzdF9mcmVlKCBsICk7CisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbCA9IGxpc3RfcHVzaF9iYWNrKCBsLCBzICk7CisgICAgICAgIH0KKyAgICAgICAgY2FjaGVkYXRhLmhkcnNjYW4gPSBsOworCisgICAgICAgIGMgPSAoSENBQ0hFREFUQSAqKWhhc2hfaW5zZXJ0KCBoY2FjaGVoYXNoLCBjYWNoZWRhdGEuYm91bmRuYW1lLCAmZm91bmQgKQorICAgICAgICAgICAgOworICAgICAgICBpZiAoICFmb3VuZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGMtPmJvdW5kbmFtZSA9IGNhY2hlZGF0YS5ib3VuZG5hbWU7CisgICAgICAgICAgICBjLT5pbmNsdWRlcyAgPSBjYWNoZWRhdGEuaW5jbHVkZXM7CisgICAgICAgICAgICBjLT5oZHJzY2FuICAgPSBjYWNoZWRhdGEuaGRyc2NhbjsKKyAgICAgICAgICAgIGMtPmFnZSAgICAgICA9IGNhY2hlZGF0YS5hZ2U7CisgICAgICAgICAgICB0aW1lc3RhbXBfY29weSggJmMtPnRpbWUsICZjYWNoZWRhdGEudGltZSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiY2FuIG5vdCBpbnNlcnQgaGVhZGVyIGNhY2hlIGl0ZW0sIGJhaWxpbmcgb24gJXMiCisgICAgICAgICAgICAgICAgIlxuIiwgaGNhY2hlbmFtZSApOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgYy0+bmV4dCA9IGhjYWNoZWxpc3Q7CisgICAgICAgIGhjYWNoZWxpc3QgPSBjOworCisgICAgICAgICsraGVhZGVyX2NvdW50OworCisgICAgICAgIG9iamVjdF9mcmVlKCByZWNvcmRfdHlwZSApOworICAgICAgICBvYmplY3RfZnJlZSggdGltZV9zZWNzX3N0ciApOworICAgICAgICBvYmplY3RfZnJlZSggdGltZV9uc2Vjc19zdHIgKTsKKyAgICAgICAgb2JqZWN0X2ZyZWUoIGFnZV9zdHIgKTsKKyAgICAgICAgb2JqZWN0X2ZyZWUoIGluY2x1ZGVzX2NvdW50X3N0ciApOworICAgICAgICBvYmplY3RfZnJlZSggaGRyc2Nhbl9jb3VudF9zdHIgKTsKKyAgICAgICAgY29udGludWU7CisKK2NsZWFudXA6CisKKyAgICAgICAgaWYgKCByZWNvcmRfdHlwZSApIG9iamVjdF9mcmVlKCByZWNvcmRfdHlwZSApOworICAgICAgICBpZiAoIHRpbWVfc2Vjc19zdHIgKSBvYmplY3RfZnJlZSggdGltZV9zZWNzX3N0ciApOworICAgICAgICBpZiAoIHRpbWVfbnNlY3Nfc3RyICkgb2JqZWN0X2ZyZWUoIHRpbWVfbnNlY3Nfc3RyICk7CisgICAgICAgIGlmICggYWdlX3N0ciApIG9iamVjdF9mcmVlKCBhZ2Vfc3RyICk7CisgICAgICAgIGlmICggaW5jbHVkZXNfY291bnRfc3RyICkgb2JqZWN0X2ZyZWUoIGluY2x1ZGVzX2NvdW50X3N0ciApOworICAgICAgICBpZiAoIGhkcnNjYW5fY291bnRfc3RyICkgb2JqZWN0X2ZyZWUoIGhkcnNjYW5fY291bnRfc3RyICk7CisKKyAgICAgICAgaWYgKCBjYWNoZWRhdGEuYm91bmRuYW1lICkgb2JqZWN0X2ZyZWUoIGNhY2hlZGF0YS5ib3VuZG5hbWUgKTsKKyAgICAgICAgaWYgKCBjYWNoZWRhdGEuaW5jbHVkZXMgKSBsaXN0X2ZyZWUoIGNhY2hlZGF0YS5pbmNsdWRlcyApOworICAgICAgICBpZiAoIGNhY2hlZGF0YS5oZHJzY2FuICkgbGlzdF9mcmVlKCBjYWNoZWRhdGEuaGRyc2NhbiApOworCisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoIERFQlVHX0hFQURFUiApCisgICAgICAgIHByaW50ZiggImhjYWNoZSByZWFkIGZyb20gZmlsZSAlc1xuIiwgaGNhY2hlbmFtZSApOworCitiYWlsOgorICAgIGlmICggdmVyc2lvbiApCisgICAgICAgIG9iamVjdF9mcmVlKCB2ZXJzaW9uICk7CisgICAgZmNsb3NlKCBmICk7Cit9CisKKwordm9pZCBoY2FjaGVfZG9uZSgpCit7CisgICAgRklMRSAgICAgICAqIGY7CisgICAgSENBQ0hFREFUQSAqIGM7CisgICAgaW50ICAgICAgICAgIGhlYWRlcl9jb3VudCA9IDA7CisgICAgY29uc3QgY2hhciAqIGhjYWNoZW5hbWU7CisgICAgaW50ICAgICAgICAgIG1heGFnZTsKKworICAgIGlmICggIWhjYWNoZWhhc2ggKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoICEoIGhjYWNoZW5hbWUgPSBjYWNoZV9uYW1lKCkgKSApCisgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgIGlmICggISggZiA9IGZvcGVuKCBoY2FjaGVuYW1lLCAid2IiICkgKSApCisgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgIG1heGFnZSA9IGNhY2hlX21heGFnZSgpOworCisgICAgLyogUHJpbnQgb3V0IHRoZSB2ZXJzaW9uLiAqLworICAgIHdyaXRlX25ldHN0cmluZyggZiwgQ0FDSEVfRklMRV9WRVJTSU9OICk7CisKKyAgICBjID0gaGNhY2hlbGlzdDsKKyAgICBmb3IgKCBjID0gaGNhY2hlbGlzdDsgYzsgYyA9IGMtPm5leHQgKQorICAgIHsKKyAgICAgICAgTElTVElURVIgaXRlcjsKKyAgICAgICAgTElTVElURVIgZW5kOworICAgICAgICBjaGFyIHRpbWVfc2Vjc19zdHJbIDMwIF07CisgICAgICAgIGNoYXIgdGltZV9uc2Vjc19zdHJbIDMwIF07CisgICAgICAgIGNoYXIgYWdlX3N0clsgMzAgXTsKKyAgICAgICAgY2hhciBpbmNsdWRlc19jb3VudF9zdHJbIDMwIF07CisgICAgICAgIGNoYXIgaGRyc2Nhbl9jb3VudF9zdHJbIDMwIF07CisKKyAgICAgICAgaWYgKCBtYXhhZ2UgPT0gMCApCisgICAgICAgICAgICBjLT5hZ2UgPSAwOworICAgICAgICBlbHNlIGlmICggYy0+YWdlID4gbWF4YWdlICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHNwcmludGYoIGluY2x1ZGVzX2NvdW50X3N0ciwgIiVsdSIsIChsb25nIHVuc2lnbmVkKWxpc3RfbGVuZ3RoKAorICAgICAgICAgICAgYy0+aW5jbHVkZXMgKSApOworICAgICAgICBzcHJpbnRmKCBoZHJzY2FuX2NvdW50X3N0ciwgIiVsdSIsIChsb25nIHVuc2lnbmVkKWxpc3RfbGVuZ3RoKAorICAgICAgICAgICAgYy0+aGRyc2NhbiApICk7CisgICAgICAgIHNwcmludGYoIHRpbWVfc2Vjc19zdHIsICIlbHUiLCAobG9uZyB1bnNpZ25lZCljLT50aW1lLnNlY3MgKTsKKyAgICAgICAgc3ByaW50ZiggdGltZV9uc2Vjc19zdHIsICIlbHUiLCAobG9uZyB1bnNpZ25lZCljLT50aW1lLm5zZWNzICk7CisgICAgICAgIHNwcmludGYoIGFnZV9zdHIsICIlbHUiLCAobG9uZyB1bnNpZ25lZCljLT5hZ2UgKTsKKworICAgICAgICB3cml0ZV9uZXRzdHJpbmcoIGYsIENBQ0hFX1JFQ09SRF9IRUFERVIgKTsKKyAgICAgICAgd3JpdGVfbmV0c3RyaW5nKCBmLCBvYmplY3Rfc3RyKCBjLT5ib3VuZG5hbWUgKSApOworICAgICAgICB3cml0ZV9uZXRzdHJpbmcoIGYsIHRpbWVfc2Vjc19zdHIgKTsKKyAgICAgICAgd3JpdGVfbmV0c3RyaW5nKCBmLCB0aW1lX25zZWNzX3N0ciApOworICAgICAgICB3cml0ZV9uZXRzdHJpbmcoIGYsIGFnZV9zdHIgKTsKKyAgICAgICAgd3JpdGVfbmV0c3RyaW5nKCBmLCBpbmNsdWRlc19jb3VudF9zdHIgKTsKKyAgICAgICAgZm9yICggaXRlciA9IGxpc3RfYmVnaW4oIGMtPmluY2x1ZGVzICksIGVuZCA9IGxpc3RfZW5kKCBjLT5pbmNsdWRlcyApOworICAgICAgICAgICAgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgICAgICB3cml0ZV9uZXRzdHJpbmcoIGYsIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICkgKTsKKyAgICAgICAgd3JpdGVfbmV0c3RyaW5nKCBmLCBoZHJzY2FuX2NvdW50X3N0ciApOworICAgICAgICBmb3IgKCBpdGVyID0gbGlzdF9iZWdpbiggYy0+aGRyc2NhbiApLCBlbmQgPSBsaXN0X2VuZCggYy0+aGRyc2NhbiApOworICAgICAgICAgICAgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgICAgICB3cml0ZV9uZXRzdHJpbmcoIGYsIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICkgKTsKKyAgICAgICAgZnB1dHMoICJcbiIsIGYgKTsKKyAgICAgICAgKytoZWFkZXJfY291bnQ7CisgICAgfQorICAgIHdyaXRlX25ldHN0cmluZyggZiwgQ0FDSEVfUkVDT1JEX0VORCApOworCisgICAgaWYgKCBERUJVR19IRUFERVIgKQorICAgICAgICBwcmludGYoICJoY2FjaGUgd3JpdHRlbiB0byAlcy4gICAlZCBkZXBlbmRlbmNpZXMsICUuMGYlJSBoaXQgcmF0ZVxuIiwKKyAgICAgICAgICAgIGhjYWNoZW5hbWUsIGhlYWRlcl9jb3VudCwgcXVlcmllcyA/IDEwMC4wICogaGl0cyAvIHF1ZXJpZXMgOiAwICk7CisKKyAgICBmY2xvc2UgKCBmICk7CisKK2NsZWFudXA6CisgICAgZm9yICggYyA9IGhjYWNoZWxpc3Q7IGM7IGMgPSBjLT5uZXh0ICkKKyAgICB7CisgICAgICAgIGxpc3RfZnJlZSggYy0+aW5jbHVkZXMgKTsKKyAgICAgICAgbGlzdF9mcmVlKCBjLT5oZHJzY2FuICk7CisgICAgICAgIG9iamVjdF9mcmVlKCBjLT5ib3VuZG5hbWUgKTsKKyAgICB9CisKKyAgICBoY2FjaGVsaXN0ID0gMDsKKyAgICBpZiAoIGhjYWNoZWhhc2ggKQorICAgICAgICBoYXNoZG9uZSggaGNhY2hlaGFzaCApOworICAgIGhjYWNoZWhhc2ggPSAwOworfQorCisKK0xJU1QgKiBoY2FjaGUoIFRBUkdFVCAqIHQsIGludCByZWMsIHJlZ2V4cCAqIHJlW10sIExJU1QgKiBoZHJzY2FuICkKK3sKKyAgICBIQ0FDSEVEQVRBICogYzsKKworICAgICsrcXVlcmllczsKKworICAgIGlmICggKCBjID0gKEhDQUNIRURBVEEgKiloYXNoX2ZpbmQoIGhjYWNoZWhhc2gsIHQtPmJvdW5kbmFtZSApICkgKQorICAgIHsKKyAgICAgICAgaWYgKCAhdGltZXN0YW1wX2NtcCggJmMtPnRpbWUsICZ0LT50aW1lICkgKQorICAgICAgICB7CisgICAgICAgICAgICBMSVNUICogY29uc3QgbDEgPSBoZHJzY2FuOworICAgICAgICAgICAgTElTVCAqIGNvbnN0IGwyID0gYy0+aGRyc2NhbjsKKyAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIxID0gbGlzdF9iZWdpbiggbDEgKTsKKyAgICAgICAgICAgIExJU1RJVEVSIGNvbnN0IGVuZDEgPSBsaXN0X2VuZCggbDEgKTsKKyAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIyID0gbGlzdF9iZWdpbiggbDIgKTsKKyAgICAgICAgICAgIExJU1RJVEVSIGNvbnN0IGVuZDIgPSBsaXN0X2VuZCggbDIgKTsKKyAgICAgICAgICAgIHdoaWxlICggaXRlcjEgIT0gZW5kMSAmJiBpdGVyMiAhPSBlbmQyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoICFvYmplY3RfZXF1YWwoIGxpc3RfaXRlbSggaXRlcjEgKSwgbGlzdF9pdGVtKCBpdGVyMiApICkgKQorICAgICAgICAgICAgICAgICAgICBpdGVyMSA9IGVuZDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlcjEgPSBsaXN0X25leHQoIGl0ZXIxICk7CisgICAgICAgICAgICAgICAgICAgIGl0ZXIyID0gbGlzdF9uZXh0KCBpdGVyMiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggaXRlcjEgIT0gZW5kMSB8fCBpdGVyMiAhPSBlbmQyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIERFQlVHX0hFQURFUiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoICJIRFJTQ0FOIG91dCBvZiBkYXRlIGluIGNhY2hlIGZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9zdHIoIHQtPmJvdW5kbmFtZSApICk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIHJlYWwgIDogIik7CisgICAgICAgICAgICAgICAgICAgIGxpc3RfcHJpbnQoIGhkcnNjYW4gKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiXG4gY2FjaGVkOiAiICk7CisgICAgICAgICAgICAgICAgICAgIGxpc3RfcHJpbnQoIGMtPmhkcnNjYW4gKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiXG4iICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbGlzdF9mcmVlKCBjLT5pbmNsdWRlcyApOworICAgICAgICAgICAgICAgIGxpc3RfZnJlZSggYy0+aGRyc2NhbiApOworICAgICAgICAgICAgICAgIGMtPmluY2x1ZGVzID0gTDA7CisgICAgICAgICAgICAgICAgYy0+aGRyc2NhbiA9IEwwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggREVCVUdfSEVBREVSICkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAidXNpbmcgaGVhZGVyIGNhY2hlIGZvciAlc1xuIiwgb2JqZWN0X3N0cigKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPmJvdW5kbmFtZSApICk7CisgICAgICAgICAgICAgICAgYy0+YWdlID0gMDsKKyAgICAgICAgICAgICAgICArK2hpdHM7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RfY29weSggYy0+aW5jbHVkZXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggREVCVUdfSEVBREVSICkKKyAgICAgICAgICAgICAgICBwcmludGYgKCJoZWFkZXIgY2FjaGUgb3V0IG9mIGRhdGUgZm9yICVzXG4iLCBvYmplY3Rfc3RyKAorICAgICAgICAgICAgICAgICAgICB0LT5ib3VuZG5hbWUgKSApOworICAgICAgICAgICAgbGlzdF9mcmVlKCBjLT5pbmNsdWRlcyApOworICAgICAgICAgICAgbGlzdF9mcmVlKCBjLT5oZHJzY2FuICk7CisgICAgICAgICAgICBjLT5pbmNsdWRlcyA9IEwwOworICAgICAgICAgICAgYy0+aGRyc2NhbiA9IEwwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBmb3VuZDsKKyAgICAgICAgYyA9IChIQ0FDSEVEQVRBICopaGFzaF9pbnNlcnQoIGhjYWNoZWhhc2gsIHQtPmJvdW5kbmFtZSwgJmZvdW5kICk7CisgICAgICAgIGlmICggIWZvdW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgYy0+Ym91bmRuYW1lID0gb2JqZWN0X2NvcHkoIHQtPmJvdW5kbmFtZSApOworICAgICAgICAgICAgYy0+bmV4dCA9IGhjYWNoZWxpc3Q7CisgICAgICAgICAgICBoY2FjaGVsaXN0ID0gYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICdjJyBwb2ludHMgYXQgdGhlIGNhY2hlIGVudHJ5LiBJdHMgb3V0IG9mIGRhdGUuICovCisgICAgeworICAgICAgICBMSVNUICogY29uc3QgbCA9IGhlYWRlcnMxKCBMMCwgdC0+Ym91bmRuYW1lLCByZWMsIHJlICk7CisKKyAgICAgICAgdGltZXN0YW1wX2NvcHkoICZjLT50aW1lLCAmdC0+dGltZSApOworICAgICAgICBjLT5hZ2UgPSAwOworICAgICAgICBjLT5pbmNsdWRlcyA9IGxpc3RfY29weSggbCApOworICAgICAgICBjLT5oZHJzY2FuID0gbGlzdF9jb3B5KCBoZHJzY2FuICk7CisKKyAgICAgICAgcmV0dXJuIGw7CisgICAgfQorfQorCisjZW5kaWYgIC8qIE9QVF9IRUFERVJfQ0FDSEVfRVhUICovCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9oY2FjaGUuaCBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2hjYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZDkyOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9oY2FjaGUuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogVGhpcyBmaWxlIGlzIG5vdCBwYXJ0IG9mIEphbQorICovCisKKy8qCisgKiBoY2FjaGUuaCAtIGhhbmRsZSAjaW5jbHVkZXMgaW4gc291cmNlIGZpbGVzCisgKi8KKyNpZm5kZWYgSENBQ0hFX0gKKyNkZWZpbmUgSENBQ0hFX0gKKworI2luY2x1ZGUgImxpc3RzLmgiCisjaW5jbHVkZSAicmVnZXhwLmgiCisjaW5jbHVkZSAicnVsZXMuaCIKKwordm9pZCBoY2FjaGVfaW5pdCggdm9pZCApOwordm9pZCBoY2FjaGVfZG9uZSggdm9pZCApOworTElTVCAqIGhjYWNoZSggVEFSR0VUICogdCwgaW50IHJlYywgcmVnZXhwICogcmVbXSwgTElTVCAqIGhkcnNjYW4gKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9oZHJtYWNyby5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvaGRybWFjcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjRmZTkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvaGRybWFjcm8uYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAyMDAwIENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyogIFRoaXMgZmlsZSBpcyBBTFNPOgorICogIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisvKgorICogaGRybWFjcm8uYyAtIGhhbmRsZSBoZWFkZXIgZmlsZXMgdGhhdCBkZWZpbmUgbWFjcm9zIHVzZWQgaW4gI2luY2x1ZGUKKyAqICAgICAgICAgICAgICBzdGF0ZW1lbnRzLgorICoKKyAqICB3ZSBsb29rIGZvciBsaW5lcyBsaWtlICIjZGVmaW5lIE1BQ1JPICA8Li4uLj4iIG9yICcjZGVmaW5lIE1BQ1JPICAiICAgICInIGluCisgKiAgdGhlIHRhcmdldCBmaWxlLiBXaGVuIGZvdW5kLCB3ZSB0aGVuIHBob255IHVwIGEgcnVsZSBpbnZvY2F0aW9uIGxpa2U6CisgKgorICogICQoSERSUlVMRSkgPHRhcmdldD4gOiA8cmVzb2x2ZWQgaW5jbHVkZWQgZmlsZXM+IDsKKyAqCisgKiBFeHRlcm5hbCByb3V0aW5lczoKKyAqICAgIGhlYWRlcnMxKCkgLSBzY2FuIGEgdGFyZ2V0IGZvciAiI2luY2x1ZGUgTUFDUk8iIGxpbmVzIGFuZCB0cnkgdG8gcmVzb2x2ZQorICogICAgICAgICAgICAgICAgIHRoZW0gd2hlbiBuZWVkZWQKKyAqCisgKiBJbnRlcm5hbCByb3V0aW5lczoKKyAqICAgIGhlYWRlcnMxKCkgLSB1c2luZyByZWdleHAsIHNjYW4gYSBmaWxlIGFuZCBidWlsZCBpbmNsdWRlIExJU1QKKyAqLworCisjaW5jbHVkZSAiamFtLmgiCisjaW5jbHVkZSAiaGRybWFjcm8uaCIKKworI2luY2x1ZGUgImNvbXBpbGUuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAibGlzdHMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJwYXJzZS5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisjaW5jbHVkZSAic3RyaW5ncy5oIgorI2luY2x1ZGUgInN1YnN0LmgiCisjaW5jbHVkZSAidmFyaWFibGUuaCIKKworCisvKiB0aGlzIHR5cGUgaXMgdXNlZCB0byBzdG9yZSBhIGRpY3Rpb25hcnkgb2YgZmlsZSBoZWFkZXIgbWFjcm9zICovCit0eXBlZGVmIHN0cnVjdCBoZWFkZXJfbWFjcm8KK3sKKyAgT0JKRUNUICogc3ltYm9sOworICBPQkpFQ1QgKiBmaWxlbmFtZTsgIC8qIHdlIGNvdWxkIG1heWJlIHVzZSBhIExJU1QgaGVyZSA/PyAqLworfSBIRUFERVJfTUFDUk87CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaCAqIGhlYWRlcl9tYWNyb3NfaGFzaCA9IDA7CisKKworLyoKKyAqIGhlYWRlcnMoKSAtIHNjYW4gYSB0YXJnZXQgZm9yIGluY2x1ZGUgZmlsZXMgYW5kIGNhbGwgSERSUlVMRQorICovCisKKyNkZWZpbmUgTUFYSU5DIDEwCisKK3ZvaWQgbWFjcm9faGVhZGVycyggVEFSR0VUICogdCApCit7CisgICAgc3RhdGljIHJlZ2V4cCAqIHJlID0gMDsKKyAgICBGSUxFICogZjsKKyAgICBjaGFyIGJ1ZlsgMTAyNCBdOworCisgICAgaWYgKCBERUJVR19IRUFERVIgKQorICAgICAgICBwcmludGYoICJtYWNybyBoZWFkZXIgc2NhbiBmb3IgJXNcbiIsIG9iamVjdF9zdHIoIHQtPm5hbWUgKSApOworCisgICAgLyogVGhpcyByZWdleHAgaXMgdXNlZCB0byBkZXRlY3QgbGluZXMgb2YgdGhlIGZvcm0KKyAgICAgKiAiI2RlZmluZSAgTUFDUk8gIDwuLi4uPiIgb3IgIiNkZWZpbmUgIE1BQ1JPICAiLi4uLi4iCisgICAgICogaW4gdGhlIGhlYWRlciBtYWNybyBmaWxlcy4KKyAgICAgKi8KKyAgICBpZiAoICFyZSApCisgICAgeworICAgICAgICBPQkpFQ1QgKiBjb25zdCByZV9zdHIgPSBvYmplY3RfbmV3KAorICAgICAgICAgICAgIl5bICAgICBdKiNbICAgIF0qZGVmaW5lWyAgIF0qKFtBLVphLXpdW0EtWmEtejAtOV9dKilbICBdKiIKKyAgICAgICAgICAgICJbPFwiXShbXlwiPl0qKVtcIj5dLiokIiApOworICAgICAgICByZSA9IHJlZ2V4X2NvbXBpbGUoIHJlX3N0ciApOworICAgICAgICBvYmplY3RfZnJlZSggcmVfc3RyICk7CisgICAgfQorCisgICAgaWYgKCAhKCBmID0gZm9wZW4oIG9iamVjdF9zdHIoIHQtPmJvdW5kbmFtZSApLCAiciIgKSApICkKKyAgICAgICAgcmV0dXJuOworCisgICAgd2hpbGUgKCBmZ2V0cyggYnVmLCBzaXplb2YoIGJ1ZiApLCBmICkgKQorICAgIHsKKyAgICAgICAgSEVBREVSX01BQ1JPIHZhcjsKKyAgICAgICAgSEVBREVSX01BQ1JPICogdiA9ICZ2YXI7CisKKyAgICAgICAgaWYgKCByZWdleGVjKCByZSwgYnVmICkgJiYgcmUtPnN0YXJ0cFsgMSBdICkKKyAgICAgICAgeworICAgICAgICAgICAgT0JKRUNUICogc3ltYm9sOworICAgICAgICAgICAgaW50IGZvdW5kOworICAgICAgICAgICAgLyogd2UgZGV0ZWN0ZWQgYSBsaW5lIHRoYXQgbG9va3MgbGlrZSAiI2RlZmluZSAgTUFDUk8gIGZpbGVuYW1lICovCisgICAgICAgICAgICAoIChjaGFyICopcmUtPmVuZHBbIDEgXSApWyAwIF0gPSAnXDAnOworICAgICAgICAgICAgKCAoY2hhciAqKXJlLT5lbmRwWyAyIF0gKVsgMCBdID0gJ1wwJzsKKworICAgICAgICAgICAgaWYgKCBERUJVR19IRUFERVIgKQorICAgICAgICAgICAgICAgIHByaW50ZiggIm1hY3JvICclcycgdXNlZCB0byBkZWZpbmUgZmlsZW5hbWUgJyVzJyBpbiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICByZS0+c3RhcnRwWyAxIF0sIHJlLT5zdGFydHBbIDIgXSwgb2JqZWN0X3N0ciggdC0+Ym91bmRuYW1lICkKKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgLyogYWRkIG1hY3JvIGRlZmluaXRpb24gdG8gaGFzaCB0YWJsZSAqLworICAgICAgICAgICAgaWYgKCAhaGVhZGVyX21hY3Jvc19oYXNoICkKKyAgICAgICAgICAgICAgICBoZWFkZXJfbWFjcm9zX2hhc2ggPSBoYXNoaW5pdCggc2l6ZW9mKCBIRUFERVJfTUFDUk8gKSwKKyAgICAgICAgICAgICAgICAgICAgImhkcm1hY3JvcyIgKTsKKworICAgICAgICAgICAgc3ltYm9sID0gb2JqZWN0X25ldyggcmUtPnN0YXJ0cFsgMSBdICk7CisgICAgICAgICAgICB2ID0gKEhFQURFUl9NQUNSTyAqKWhhc2hfaW5zZXJ0KCBoZWFkZXJfbWFjcm9zX2hhc2gsIHN5bWJvbCwgJmZvdW5kCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmICggIWZvdW5kICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2LT5zeW1ib2wgPSBzeW1ib2w7CisgICAgICAgICAgICAgICAgdi0+ZmlsZW5hbWUgPSBvYmplY3RfbmV3KCByZS0+c3RhcnRwWyAyIF0gKTsgIC8qIG5ldmVyIGZyZWVkICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIHN5bWJvbCApOworICAgICAgICAgICAgLyogWFhYWDogRk9SIE5PVywgV0UgSUdOT1JFIE1VTFRJUExFIE1BQ1JPIERFRklOSVRJT05TICEhICovCisgICAgICAgICAgICAvKiAgICAgICBXRSBNSUdIVCBBUyBXRUxMIFVTRSBBIExJU1QgVE8gU1RPUkUgVEhFTS4uICAgICAgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIGZjbG9zZSggZiApOworfQorCisKK09CSkVDVCAqIG1hY3JvX2hlYWRlcl9nZXQoIE9CSkVDVCAqIG1hY3JvX25hbWUgKQoreworICAgIEhFQURFUl9NQUNSTyAqIHY7CisgICAgaWYgKCBoZWFkZXJfbWFjcm9zX2hhc2ggJiYgKCB2ID0gKEhFQURFUl9NQUNSTyAqKWhhc2hfZmluZCgKKyAgICAgICAgaGVhZGVyX21hY3Jvc19oYXNoLCBtYWNyb19uYW1lICkgKSApCisgICAgeworICAgICAgICBpZiAoIERFQlVHX0hFQURFUiApCisgICAgICAgICAgICBwcmludGYoICIjIyMgbWFjcm8gJyVzJyBldmFsdWF0ZWQgdG8gJyVzJ1xuIiwgb2JqZWN0X3N0ciggbWFjcm9fbmFtZQorICAgICAgICAgICAgICAgICksIG9iamVjdF9zdHIoIHYtPmZpbGVuYW1lICkgKTsKKyAgICAgICAgcmV0dXJuIHYtPmZpbGVuYW1lOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2hkcm1hY3JvLmggYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9oZHJtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTVlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9oZHJtYWNyby5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NSBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qCisgKiBoZHJtYWNyby5oIC0gcGFyc2VzIGhlYWRlciBmaWxlcyBmb3IgI2RlZmluZSBNQUNSTyAgPGZpbGVuYW1lPiBvcgorICogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk8gICJmaWxlbmFtZSIgZGVmaW5pdGlvbnMKKyAqLworCisjaWZuZGVmIEhEUk1BQ1JPX1NXMjAxMTExMThfSAorI2RlZmluZSBIRFJNQUNST19TVzIwMTExMTE4X0gKKworI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisKK3ZvaWQgbWFjcm9faGVhZGVycyggVEFSR0VUICogKTsKK09CSkVDVCAqIG1hY3JvX2hlYWRlcl9nZXQoIE9CSkVDVCAqIG1hY3JvX25hbWUgKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9oZWFkZXJzLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9oZWFkZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5NTU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2hlYWRlcnMuYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAyMDAwIENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKy8qICBUaGlzIGZpbGUgaXMgQUxTTzoKKyAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IERhdmlkIEFicmFoYW1zLgorICogIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworLyoKKyAqIGhlYWRlcnMuYyAtIGhhbmRsZSAjaW5jbHVkZXMgaW4gc291cmNlIGZpbGVzCisgKgorICogVXNpbmcgcmVndWxhciBleHByZXNzaW9ucyBwcm92aWRlZCBhcyB0aGUgdmFyaWFibGUgJChIRFJTQ0FOKSwgaGVhZGVycygpCisgKiBzZWFyY2hlcyBhIGZpbGUgZm9yICNpbmNsdWRlIGZpbGVzIGFuZCBwaG9uaWVzIHVwIGEgcnVsZSBpbnZvY2F0aW9uOgorICogICAgJChIRFJSVUxFKSA8dGFyZ2V0PiA6IDxpbmNsdWRlIGZpbGVzPiA7CisgKgorICogRXh0ZXJuYWwgcm91dGluZXM6CisgKiAgICBoZWFkZXJzKCkgLSBzY2FuIGEgdGFyZ2V0IGZvciBpbmNsdWRlIGZpbGVzIGFuZCBjYWxsIEhEUlJVTEUKKyAqCisgKiBJbnRlcm5hbCByb3V0aW5lczoKKyAqICAgIGhlYWRlcnMxKCkgLSB1c2luZyByZWdleHAsIHNjYW4gYSBmaWxlIGFuZCBidWlsZCBpbmNsdWRlIExJU1QKKyAqLworCisjaW5jbHVkZSAiamFtLmgiCisjaW5jbHVkZSAiaGVhZGVycy5oIgorCisjaW5jbHVkZSAiY29tcGlsZS5oIgorI2luY2x1ZGUgImhkcm1hY3JvLmgiCisjaW5jbHVkZSAibGlzdHMuaCIKKyNpbmNsdWRlICJtb2R1bGVzLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAicGFyc2UuaCIKKyNpbmNsdWRlICJydWxlcy5oIgorI2luY2x1ZGUgInN1YnN0LmgiCisjaW5jbHVkZSAidmFyaWFibGUuaCIKKworI2lmZGVmIE9QVF9IRUFERVJfQ0FDSEVfRVhUCisjIGluY2x1ZGUgImhjYWNoZS5oIgorI2VuZGlmCisKKyNpZm5kZWYgT1BUX0hFQURFUl9DQUNIRV9FWFQKK3N0YXRpYyBMSVNUICogaGVhZGVyczEoIExJU1QgKiwgT0JKRUNUICogZmlsZSwgaW50IHJlYywgcmVnZXhwICogcmVbXSApOworI2VuZGlmCisKKworLyoKKyAqIGhlYWRlcnMoKSAtIHNjYW4gYSB0YXJnZXQgZm9yIGluY2x1ZGUgZmlsZXMgYW5kIGNhbGwgSERSUlVMRQorICovCisKKyNkZWZpbmUgTUFYSU5DIDEwCisKK3ZvaWQgaGVhZGVycyggVEFSR0VUICogdCApCit7CisgICAgTElTVCAgICogaGRyc2NhbjsKKyAgICBMSVNUICAgKiBoZHJydWxlOworICAgICNpZm5kZWYgT1BUX0hFQURFUl9DQUNIRV9FWFQKKyAgICBMSVNUICAgKiBoZWFkbGlzdCA9IEwwOworICAgICNlbmRpZgorICAgIHJlZ2V4cCAqIHJlWyBNQVhJTkMgXTsKKyAgICBpbnQgcmVjID0gMDsKKyAgICBMSVNUSVRFUiBpdGVyOworICAgIExJU1RJVEVSIGVuZDsKKworICAgIGhkcnNjYW4gPSB2YXJfZ2V0KCByb290X21vZHVsZSgpLCBjb25zdGFudF9IRFJTQ0FOICk7CisgICAgaWYgKCBsaXN0X2VtcHR5KCBoZHJzY2FuICkgKQorICAgICAgICByZXR1cm47CisKKyAgICBoZHJydWxlID0gdmFyX2dldCggcm9vdF9tb2R1bGUoKSwgY29uc3RhbnRfSERSUlVMRSApOworICAgIGlmICggbGlzdF9lbXB0eSggaGRycnVsZSApICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCBERUJVR19IRUFERVIgKQorICAgICAgICBwcmludGYoICJoZWFkZXIgc2NhbiAlc1xuIiwgb2JqZWN0X3N0ciggdC0+bmFtZSApICk7CisKKyAgICAvKiBDb21waWxlIGFsbCByZWd1bGFyIGV4cHJlc3Npb25zIGluIEhEUlNDQU4gKi8KKyAgICBpdGVyID0gbGlzdF9iZWdpbiggaGRyc2NhbiApOworICAgIGVuZCA9IGxpc3RfZW5kKCBoZHJzY2FuICk7CisgICAgZm9yICggOyAoIHJlYyA8IE1BWElOQyApICYmIGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgIHsKKyAgICAgICAgcmVbIHJlYysrIF0gPSByZWdleF9jb21waWxlKCBsaXN0X2l0ZW0oIGl0ZXIgKSApOworICAgIH0KKworICAgIC8qIERvY3RvciB1cCBjYWxsIHRvIEhEUlJVTEUgcnVsZSAqLworICAgIC8qIENhbGwgaGVhZGVyczEoKSB0byBnZXQgTElTVCBvZiBpbmNsdWRlZCBmaWxlcy4gKi8KKyAgICB7CisgICAgICAgIEZSQU1FIGZyYW1lWyAxIF07CisgICAgICAgIGZyYW1lX2luaXQoIGZyYW1lICk7CisgICAgICAgIGxvbF9hZGQoIGZyYW1lLT5hcmdzLCBsaXN0X25ldyggb2JqZWN0X2NvcHkoIHQtPm5hbWUgKSApICk7CisjaWZkZWYgT1BUX0hFQURFUl9DQUNIRV9FWFQKKyAgICAgICAgbG9sX2FkZCggZnJhbWUtPmFyZ3MsIGhjYWNoZSggdCwgcmVjLCByZSwgaGRyc2NhbiApICk7CisjZWxzZQorICAgICAgICBsb2xfYWRkKCBmcmFtZS0+YXJncywgaGVhZGVyczEoIGhlYWRsaXN0LCB0LT5ib3VuZG5hbWUsIHJlYywgcmUgKSApOworI2VuZGlmCisKKyAgICAgICAgaWYgKCBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMSApICkKKyAgICAgICAgeworICAgICAgICAgICAgT0JKRUNUICogcnVsZW5hbWUgPSBsaXN0X2Zyb250KCBoZHJydWxlICk7CisgICAgICAgICAgICAvKiBUaGUgdGhpcmQgYXJndW1lbnQgdG8gSERSUlVMRSBpcyB0aGUgYm91bmQgbmFtZSBvZiAkKDwpLiAqLworICAgICAgICAgICAgbG9sX2FkZCggZnJhbWUtPmFyZ3MsIGxpc3RfbmV3KCBvYmplY3RfY29weSggdC0+Ym91bmRuYW1lICkgKSApOworICAgICAgICAgICAgbGlzdF9mcmVlKCBldmFsdWF0ZV9ydWxlKCBiaW5kcnVsZSggcnVsZW5hbWUsIGZyYW1lLT5tb2R1bGUgKSwgcnVsZW5hbWUsIGZyYW1lICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFuIHVwLiAqLworICAgICAgICBmcmFtZV9mcmVlKCBmcmFtZSApOworICAgIH0KK30KKworCisvKgorICogaGVhZGVyczEoKSAtIHVzaW5nIHJlZ2V4cCwgc2NhbiBhIGZpbGUgYW5kIGJ1aWxkIGluY2x1ZGUgTElTVC4KKyAqLworCisjaWZuZGVmIE9QVF9IRUFERVJfQ0FDSEVfRVhUCitzdGF0aWMKKyNlbmRpZgorTElTVCAqIGhlYWRlcnMxKCBMSVNUICogbCwgT0JKRUNUICogZmlsZSwgaW50IHJlYywgcmVnZXhwICogcmVbXSApCit7CisgICAgRklMRSAqIGY7CisgICAgY2hhciBidWZbIDEwMjQgXTsKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgcmVnZXhwICogcmVfbWFjcm9zID0gMDsKKworI2lmZGVmIE9QVF9JTVBST1ZFRF9QQVRJRU5DRV9FWFQKKyAgICBzdGF0aWMgaW50IGNvdW50ID0gMDsKKyAgICArK2NvdW50OworICAgIGlmICggKCAoIGNvdW50ID09IDEwMCApIHx8ICEoIGNvdW50ICUgMTAwMCApICkgJiYgREVCVUdfTUFLRSApCisgICAgeworICAgICAgICBwcmludGYoICIuLi5wYXRpZW5jZS4uLlxuIiApOworICAgICAgICBmZmx1c2goIHN0ZG91dCApOworICAgIH0KKyNlbmRpZgorCisgICAgLyogVGhlIGZvbGxvd2luZyByZWdleHAgaXMgdXNlZCB0byBkZXRlY3QgY2FzZXMgd2hlcmUgYSBmaWxlIGlzIGluY2x1ZGVkCisgICAgICogdGhyb3VnaCBhIGxpbmUgbGlrZSAiI2luY2x1ZGUgTUFDUk8iLgorICAgICAqLworICAgIGlmICggcmVfbWFjcm9zID09IDAgKQorICAgIHsKKyAgICAgICAgT0JKRUNUICogY29uc3QgcmVfc3RyID0gb2JqZWN0X25ldygKKyAgICAgICAgICAgICIjWyBcdF0qaW5jbHVkZVsgXHRdKihbQS1aYS16XVtBLVphLXowLTlfXSopLiokIiApOworICAgICAgICByZV9tYWNyb3MgPSByZWdleF9jb21waWxlKCByZV9zdHIgKTsKKyAgICAgICAgb2JqZWN0X2ZyZWUoIHJlX3N0ciApOworICAgIH0KKworICAgIGlmICggISggZiA9IGZvcGVuKCBvYmplY3Rfc3RyKCBmaWxlICksICJyIiApICkgKQorICAgICAgICByZXR1cm4gbDsKKworICAgIHdoaWxlICggZmdldHMoIGJ1Ziwgc2l6ZW9mKCBidWYgKSwgZiApICkKKyAgICB7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcmVjOyArK2kgKQorICAgICAgICAgICAgaWYgKCByZWdleGVjKCByZVsgaSBdLCBidWYgKSAmJiByZVsgaSBdLT5zdGFydHBbIDEgXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKCAoY2hhciAqKXJlWyBpIF0tPmVuZHBbIDEgXSApWyAwIF0gPSAnXDAnOworICAgICAgICAgICAgICAgIGlmICggREVCVUdfSEVBREVSICkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiaGVhZGVyIGZvdW5kOiAlc1xuIiwgcmVbIGkgXS0+c3RhcnRwWyAxIF0gKTsKKyAgICAgICAgICAgICAgICBsID0gbGlzdF9wdXNoX2JhY2soIGwsIG9iamVjdF9uZXcoIHJlWyBpIF0tPnN0YXJ0cFsgMSBdICkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvKiBTcGVjaWFsIHRyZWF0bWVudCBmb3IgI2luY2x1ZGUgTUFDUk8uICovCisgICAgICAgIGlmICggcmVnZXhlYyggcmVfbWFjcm9zLCBidWYgKSAmJiByZV9tYWNyb3MtPnN0YXJ0cFsgMSBdICkKKyAgICAgICAgeworICAgICAgICAgICAgT0JKRUNUICogaGVhZGVyX2ZpbGVuYW1lOworICAgICAgICAgICAgT0JKRUNUICogbWFjcm9fbmFtZTsKKworICAgICAgICAgICAgKCAoY2hhciAqKXJlX21hY3Jvcy0+ZW5kcFsgMSBdIClbIDAgXSA9ICdcMCc7CisKKyAgICAgICAgICAgIGlmICggREVCVUdfSEVBREVSICkKKyAgICAgICAgICAgICAgICBwcmludGYoICJtYWNybyBoZWFkZXIgZm91bmQ6ICVzIiwgcmVfbWFjcm9zLT5zdGFydHBbIDEgXSApOworCisgICAgICAgICAgICBtYWNyb19uYW1lID0gb2JqZWN0X25ldyggcmVfbWFjcm9zLT5zdGFydHBbIDEgXSApOworICAgICAgICAgICAgaGVhZGVyX2ZpbGVuYW1lID0gbWFjcm9faGVhZGVyX2dldCggbWFjcm9fbmFtZSApOworICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIG1hY3JvX25hbWUgKTsKKyAgICAgICAgICAgIGlmICggaGVhZGVyX2ZpbGVuYW1lICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIERFQlVHX0hFQURFUiApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiByZXNvbHZlZCB0byAnJXMnXG4iLCBvYmplY3Rfc3RyKCBoZWFkZXJfZmlsZW5hbWUgKQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBsID0gbGlzdF9wdXNoX2JhY2soIGwsIG9iamVjdF9jb3B5KCBoZWFkZXJfZmlsZW5hbWUgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggREVCVUdfSEVBREVSICkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiIGlnbm9yZWQgISFcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZjbG9zZSggZiApOworICAgIHJldHVybiBsOworfQorCisKK3ZvaWQgcmVnZXJyb3IoIGNoYXIgY29uc3QgKiBzICkKK3sKKyAgICBwcmludGYoICJyZSBlcnJvciAlc1xuIiwgcyApOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvaGVhZGVycy5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvaGVhZGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMGE2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9oZWFkZXJzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk1IENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyoKKyAqIGhlYWRlcnMuaCAtIGhhbmRsZSAjaW5jbHVkZXMgaW4gc291cmNlIGZpbGVzCisgKi8KKworI2lmbmRlZiBIRUFERVJTX1NXMjAxMTExMThfSAorI2RlZmluZSBIRUFERVJTX1NXMjAxMTExMThfSAorCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAicnVsZXMuaCIKKyNpbmNsdWRlICJyZWdleHAuaCIKKwordm9pZCBoZWFkZXJzKCBUQVJHRVQgKiB0ICk7CisKKyNpZmRlZiBPUFRfSEVBREVSX0NBQ0hFX0VYVAorc3RydWN0IHJlZ2V4cDsKK0xJU1QgKiBoZWFkZXJzMSggTElTVCAqbCwgT0JKRUNUICogZmlsZSwgaW50IHJlYywgc3RydWN0IHJlZ2V4cCAqcmVbXSApOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvamFtLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9qYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzgwZWVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvamFtLmMKQEAgLTAsMCArMSw2NTYgQEAKKy8qCisgKiAvK1wKKyAqICtcICAgQ29weXJpZ2h0IDE5OTMtMjAwMiBDaHJpc3RvcGhlciBTZWl3YWxkIGFuZCBQZXJmb3JjZSBTb2Z0d2FyZSwgSW5jLgorICogXCsvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgamFtLgorICoKKyAqIExpY2Vuc2UgaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIHRoaXMgc29mdHdhcmUgYW5kIGRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBhcworICogbG9uZyBhcyB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQgYW5kIG1vZGlmaWNhdGlvbnMgYXJlIGNsZWFybHkKKyAqIG1hcmtlZC4KKyAqCisgKiBBTEwgV0FSUkFOVElFUyBBUkUgSEVSRUJZIERJU0NMQUlNRUQuCisgKi8KKworLyogVGhpcyBmaWxlIGlzIEFMU086CisgKiBDb3B5cmlnaHQgMjAwMS0yMDA0IERhdmlkIEFicmFoYW1zLgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKy8qCisgKiBqYW0uYyAtIG1ha2UgcmVkdXgKKyAqCisgKiBTZWUgSmFtLmh0bWwgZm9yIHVzYWdlIGluZm9ybWF0aW9uLgorICoKKyAqIFRoZXNlIGNvbW1lbnRzIGRvY3VtZW50IHRoZSBjb2RlLgorICoKKyAqIFRoZSB0b3AgaGFsZiBvZiB0aGUgY29kZSBpcyBzdHJ1Y3R1cmVkIHN1Y2g6CisgKgorICogICAgICAgICAgICAgICAgICAgICAgIGphbQorICogICAgICAgICAgICAgICAgICAgICAgLyB8IFwKKyAqICAgICAgICAgICAgICAgICArLS0tKyAgfCAgXAorICogICAgICAgICAgICAgICAgLyAgICAgICB8ICAgXAorICogICAgICAgICBqYW1ncmFtICAgICBvcHRpb24gIFwKKyAqICAgICAgICAvICB8ICAgXCAgICAgICAgICAgICAgXAorICogICAgICAgLyAgIHwgICAgXCAgICAgICAgICAgICAgXAorICogICAgICAvICAgIHwgICAgIFwgICAgICAgICAgICAgfAorICogIHNjYW4gICAgIHwgICAgIGNvbXBpbGUgICAgICBtYWtlCisgKiAgIHwgICAgICAgfCAgICAvICB8IFwgICAgICAgLyB8ICBcCisgKiAgIHwgICAgICAgfCAgIC8gICB8ICBcICAgICAvICB8ICAgXAorICogICB8ICAgICAgIHwgIC8gICAgfCAgIFwgICAvICAgfCAgICBcCisgKiBqYW1iYXNlIHBhcnNlICAgICB8ICAgcnVsZXMgIHNlYXJjaCBtYWtlMQorICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgIHwgICBcCisgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgfCAgICBcCisgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgfCAgICAgXAorICogICAgICAgICAgICAgICBidWlsdGlucyAgICB0aW1lc3RhbXAgY29tbWFuZCBleGVjdXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXN5cworICoKKyAqCisgKiBUaGUgc3VwcG9ydCByb3V0aW5lcyBhcmUgY2FsbGVkIGJ5IGFsbCBvZiB0aGUgYWJvdmUsIGJ1dCB0aGVtc2VsdmVzIGFyZQorICogbGF5ZXJlZCB0aHVzOgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGV8ZXhwYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAvICAgICAgfCAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgLyAgICAgICB8ICAgfAorICogICAgICAgICAgICAgICAgICAgIC8gICAgICAgIHwgICB8CisgKiAgICAgICAgICAgICAgICAgbGlzdHMgICAgICAgfCAgIHBhdGhzeXMKKyAqICAgICAgICAgICAgICAgICAgICBcICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgIFwgICAgICBoYXNoCisgKiAgICAgICAgICAgICAgICAgICAgICBcICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgIFwgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgXCAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBcICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdAorICoKKyAqIFJvdWdobHksIHRoZSBtb2R1bGVzIGFyZToKKyAqCisgKiAgYnVpbHRpbnMuYyAtIGphbSdzIGJ1aWx0LWluIHJ1bGVzCisgKiAgY29tbWFuZC5jIC0gbWFpbnRhaW4gbGlzdHMgb2YgY29tbWFuZHMKKyAqICBjb21waWxlLmMgLSBjb21waWxlIHBhcnNlZCBqYW0gc3RhdGVtZW50cworICogIGV4ZWMqLmMgLSBleGVjdXRlIGEgc2hlbGwgc2NyaXB0IG9uIGEgc3BlY2lmaWMgT1MKKyAqICBmaWxlKi5jIC0gc2NhbiBkaXJlY3RvcmllcyBhbmQgYXJjaGl2ZXMgb24gYSBzcGVjaWZpYyBPUworICogIGhhc2guYyAtIHNpbXBsZSBpbi1tZW1vcnkgaGFzaGluZyByb3V0aW5lcworICogIGhkcm1hY3JvLmMgLSBoYW5kbGUgaGVhZGVyIGZpbGUgcGFyc2luZyBmb3IgZmlsZW5hbWUgbWFjcm8gZGVmaW5pdGlvbnMKKyAqICBoZWFkZXJzLmMgLSBoYW5kbGUgI2luY2x1ZGVzIGluIHNvdXJjZSBmaWxlcworICogIGphbWJhc2UuYyAtIGNvbXBpbGFibGUgY29weSBvZiBKYW1iYXNlCisgKiAgamFtZ3JhbS55IC0gamFtIGdyYW1tYXIKKyAqICBsaXN0cy5jIC0gbWFpbnRhaW4gbGlzdHMgb2Ygc3RyaW5ncworICogIG1ha2UuYyAtIGJyaW5nIGEgdGFyZ2V0IHVwIHRvIGRhdGUsIG9uY2UgcnVsZXMgYXJlIGluIHBsYWNlCisgKiAgbWFrZTEuYyAtIGV4ZWN1dGUgY29tbWFuZCB0byBicmluZyB0YXJnZXRzIHVwIHRvIGRhdGUKKyAqICBvYmplY3QuYyAtIHN0cmluZyBtYW5pcHVsYXRpb24gcm91dGluZXMKKyAqICBvcHRpb24uYyAtIGNvbW1hbmQgbGluZSBvcHRpb24gcHJvY2Vzc2luZworICogIHBhcnNlLmMgLSBtYWtlIGFuZCBkZXN0cm95IHBhcnNlIHRyZWVzIGFzIGRyaXZlbiBieSB0aGUgcGFyc2VyCisgKiAgcGF0aCouYyAtIG1hbmlwdWxhdGUgZmlsZSBuYW1lcyBvbiBhIHNwZWNpZmljIE9TCisgKiAgaGFzaC5jIC0gc2ltcGxlIGluLW1lbW9yeSBoYXNoaW5nIHJvdXRpbmVzCisgKiAgcmVnZXhwLmMgLSBIZW5yeSBTcGVuY2VyJ3MgcmVnZXhwCisgKiAgcnVsZXMuYyAtIGFjY2VzcyB0byBSVUxFcywgVEFSR0VUcywgYW5kIEFDVElPTnMKKyAqICBzY2FuLmMgLSB0aGUgamFtIHlhY2Mgc2Nhbm5lcgorICogIHNlYXJjaC5jIC0gZmluZCBhIHRhcmdldCBhbG9uZyAkKFNFQVJDSCkgb3IgJChMT0NBVEUpCisgKiAgdGltZXN0YW1wLmMgLSBnZXQgdGhlIHRpbWVzdGFtcCBvZiBhIGZpbGUgb3IgYXJjaGl2ZSBtZW1iZXIKKyAqICB2YXJpYWJsZS5jIC0gaGFuZGxlIGphbSBtdWx0aS1lbGVtZW50IHZhcmlhYmxlcworICovCisKKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgInBhdGNobGV2ZWwuaCIKKworI2luY2x1ZGUgImJ1aWx0aW5zLmgiCisjaW5jbHVkZSAiY2xhc3MuaCIKKyNpbmNsdWRlICJjb21waWxlLmgiCisjaW5jbHVkZSAiY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiZmlsZXN5cy5oIgorI2luY2x1ZGUgImZ1bmN0aW9uLmgiCisjaW5jbHVkZSAiaGNhY2hlLmgiCisjaW5jbHVkZSAibGlzdHMuaCIKKyNpbmNsdWRlICJtYWtlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAib3B0aW9uLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAicGFyc2UuaCIKKyNpbmNsdWRlICJjd2QuaCIKKyNpbmNsdWRlICJydWxlcy5oIgorI2luY2x1ZGUgInNjYW4uaCIKKyNpbmNsdWRlICJzZWFyY2guaCIKKyNpbmNsdWRlICJzdHJpbmdzLmgiCisjaW5jbHVkZSAidGltZXN0YW1wLmgiCisjaW5jbHVkZSAidmFyaWFibGUuaCIKKworLyogTWFjaW50b3NoIGlzICJzcGVjaWFsIiAqLworI2lmZGVmIE9TX01BQworIyBpbmNsdWRlIDxRdWlja0RyYXcuaD4KKyNlbmRpZgorCisvKiBBbmQgVU5JWCBmb3IgdGhpcy4gKi8KKyNpZmRlZiB1bml4CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjIGluY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKK3N0cnVjdCBnbG9icyBnbG9icyA9Cit7CisgICAgMCwgICAgICAgICAgLyogbm9leGVjICovCisgICAgMSwgICAgICAgICAgLyogam9icyAqLworICAgIDAsICAgICAgICAgIC8qIHF1aXRxdWljayAqLworICAgIDAsICAgICAgICAgIC8qIG5ld2VzdGZpcnN0ICovCisgICAgMCwgICAgICAgICAgLyogcGlwZXMgYWN0aW9uIHN0ZG91dCBhbmQgc3RkZXJyIG1lcmdlZCB0byBhY3Rpb24gb3V0cHV0ICovCisjaWZkZWYgT1NfTUFDCisgICAgeyAwLCAwIH0sICAgLyogZGVidWcgLSBzdXBwcmVzcyB0cmFjaW5nIG91dHB1dCAqLworI2Vsc2UKKyAgICB7IDAsIDEgfSwgICAvKiBkZWJ1ZyAuLi4gKi8KKyNlbmRpZgorICAgIDAsICAgICAgICAgIC8qIG91dHB1dCBjb21tYW5kcywgbm90IHJ1biB0aGVtICovCisgICAgMCwgICAgICAgICAgLyogYWN0aW9uIHRpbWVvdXQgKi8KKyAgICAwICAgICAgICAgICAvKiBtYXhpbXVtIGJ1ZmZlciBzaXplIHplcm8gaXMgYWxsIG91dHB1dCAqLworfTsKKworLyogU3ltYm9scyB0byBiZSBkZWZpbmVkIGFzIHRydWUgZm9yIHVzZSBpbiBKYW1iYXNlLiAqLworc3RhdGljIGNoYXIgKiBvdGhlcnN5bXNbXSA9IHsgT1NNQUpPUiwgT1NNSU5PUiwgT1NQTEFULCBKQU1WRVJTWU0sIDAgfTsKKworCisvKiBLbm93biBmb3Igc3VyZToKKyAqICBtYWMgbmVlZHMgYXJnX2VudmlybworICogIE9TMiBuZWVkcyBleHRlcm4gZW52aXJvbgorICovCisKKyNpZmRlZiBPU19NQUMKKyMgZGVmaW5lIHVzZV9lbnZpcm9uIGFyZ19lbnZpcm9uCisjIGlmZGVmIE1QVworICAgIFFER2xvYmFscyBxZDsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBvbiBXaW4zMi1MQ0MgKi8KKyNpZiBkZWZpbmVkKCBPU19OVCApICYmIGRlZmluZWQoIF9fTENDX18gKQorIyBkZWZpbmUgdXNlX2Vudmlyb24gX2Vudmlyb24KKyNlbmRpZgorCisjaWYgZGVmaW5lZCggX19NV0VSS1NfXykKKyMgZGVmaW5lIHVzZV9lbnZpcm9uIF9lbnZpcm9uCisgICAgZXh0ZXJuIGNoYXIgKiAqIF9lbnZpcm9uOworI2VuZGlmCisKKyNpZm5kZWYgdXNlX2Vudmlyb24KKyMgZGVmaW5lIHVzZV9lbnZpcm9uIGVudmlyb24KKyMgaWYgIWRlZmluZWQoIF9fV0FUQ09NX18gKSAmJiAhZGVmaW5lZCggT1NfT1MyICkgJiYgIWRlZmluZWQoIE9TX05UICkKKyAgICBleHRlcm4gY2hhciAqKmVudmlyb247CisjIGVuZGlmCisjZW5kaWYKKworI2lmIFlZREVCVUcgIT0gMAorICAgIGV4dGVybiBpbnQgeXlkZWJ1ZzsKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworc3RhdGljIHZvaWQgcnVuX3VuaXRfdGVzdHMoKQoreworIyBpZiBkZWZpbmVkKCBVU0VfRVhFQ05UICkKKyAgICBleHRlcm4gdm9pZCBleGVjbnRfdW5pdF90ZXN0KCk7CisgICAgZXhlY250X3VuaXRfdGVzdCgpOworIyBlbmRpZgorICAgIHN0cmluZ191bml0X3Rlc3QoKTsKK30KKyNlbmRpZgorCitpbnQgYW55aG93ID0gMDsKKworI2lmZGVmIEhBVkVfUFlUSE9OCisgICAgZXh0ZXJuIFB5T2JqZWN0ICogYmphbV9jYWxsICAgICAgICAgKCBQeU9iamVjdCAqIHNlbGYsIFB5T2JqZWN0ICogYXJncyApOworICAgIGV4dGVybiBQeU9iamVjdCAqIGJqYW1faW1wb3J0X3J1bGUgICggUHlPYmplY3QgKiBzZWxmLCBQeU9iamVjdCAqIGFyZ3MgKTsKKyAgICBleHRlcm4gUHlPYmplY3QgKiBiamFtX2RlZmluZV9hY3Rpb24oIFB5T2JqZWN0ICogc2VsZiwgUHlPYmplY3QgKiBhcmdzICk7CisgICAgZXh0ZXJuIFB5T2JqZWN0ICogYmphbV92YXJpYWJsZSAgICAgKCBQeU9iamVjdCAqIHNlbGYsIFB5T2JqZWN0ICogYXJncyApOworICAgIGV4dGVybiBQeU9iamVjdCAqIGJqYW1fYmFja3RyYWNlICAgICggUHlPYmplY3QgKiBzZWxmLCBQeU9iamVjdCAqIGFyZ3MgKTsKKyAgICBleHRlcm4gUHlPYmplY3QgKiBiamFtX2NhbGxlciAgICAgICAoIFB5T2JqZWN0ICogc2VsZiwgUHlPYmplY3QgKiBhcmdzICk7CisjZW5kaWYKKwordm9pZCByZWdleF9kb25lKCk7CisKK2NoYXIgY29uc3QgKiBzYXZlZF9hcmd2MDsKKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyICogKiBhcmd2LCBjaGFyICogKiBhcmdfZW52aXJvbiApCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbjsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgKiBzOworICAgIHN0cnVjdCBiamFtX29wdGlvbiAgICAgIG9wdHZbIE5fT1BUUyBdOworICAgIGNoYXIgICAgICAgICAgICBjb25zdCAqIGFsbCA9ICJhbGwiOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBhcmdfYyA9IGFyZ2M7CisgICAgY2hhciAgICAgICAgICAqICAgICAgICogYXJnX3YgPSBhcmd2OworICAgIGNoYXIgICAgICAgICAgICBjb25zdCAqIHByb2duYW1lID0gYXJndlsgMCBdOworICAgIG1vZHVsZV90ICAgICAgICAgICAgICAqIGVudmlyb25fbW9kdWxlOworCisgICAgc2F2ZWRfYXJndjAgPSBhcmd2WyAwIF07CisKKyAgICBCSkFNX01FTV9JTklUKCk7CisKKyNpZmRlZiBPU19NQUMKKyAgICBJbml0R3JhZiggJnFkLnRoZVBvcnQgKTsKKyNlbmRpZgorCisgICAgLS1hcmdjOworICAgICsrYXJndjsKKworICAgIGlmICggZ2V0b3B0aW9ucyggYXJnYywgYXJndiwgIi06bDptOmQ6ajpwOmY6Z3M6dDphbm86cXYiLCBvcHR2ICkgPCAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIlxudXNhZ2U6ICVzIFsgb3B0aW9ucyBdIHRhcmdldHMuLi5cblxuIiwgcHJvZ25hbWUgKTsKKworICAgICAgICBwcmludGYoICItYSAgICAgIEJ1aWxkIGFsbCB0YXJnZXRzLCBldmVuIGlmIHRoZXkgYXJlIGN1cnJlbnQuXG4iICk7CisgICAgICAgIHByaW50ZiggIi1keCAgICAgU2V0IHRoZSBkZWJ1ZyBsZXZlbCB0byB4ICgwLTkpLlxuIiApOworICAgICAgICBwcmludGYoICItZnggICAgIFJlYWQgeCBpbnN0ZWFkIG9mIEphbWJhc2UuXG4iICk7CisgICAgICAgIC8qIHByaW50ZiggIi1nICAgICAgQnVpbGQgZnJvbSBuZXdlc3Qgc291cmNlcyBmaXJzdC5cbiIgKTsgKi8KKyAgICAgICAgcHJpbnRmKCAiLWp4ICAgICBSdW4gdXAgdG8geCBzaGVsbCBjb21tYW5kcyBjb25jdXJyZW50bHkuXG4iICk7CisgICAgICAgIHByaW50ZiggIi1seCAgICAgTGltaXQgYWN0aW9ucyB0byB4IG51bWJlciBvZiBzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZXkgYXJlIHN0b3BwZWQuXG4iICk7CisgICAgICAgIHByaW50ZiggIi1teCAgICAgTWF4aW11bSB0YXJnZXQgb3V0cHV0IHNhdmVkIChrYiksIGRlZmF1bHQgaXMgdG8gc2F2ZSBhbGwgb3V0cHV0LlxuIiApOworICAgICAgICBwcmludGYoICItbiAgICAgIERvbid0IGFjdHVhbGx5IGV4ZWN1dGUgdGhlIHVwZGF0aW5nIGFjdGlvbnMuXG4iICk7CisgICAgICAgIHByaW50ZiggIi1veCAgICAgV3JpdGUgdGhlIHVwZGF0aW5nIGFjdGlvbnMgdG8gZmlsZSB4LlxuIiApOworICAgICAgICBwcmludGYoICItcHggICAgIHg9MCwgcGlwZXMgYWN0aW9uIHN0ZG91dCBhbmQgc3RkZXJyIG1lcmdlZCBpbnRvIGFjdGlvbiBvdXRwdXQuXG4iICk7CisgICAgICAgIHByaW50ZiggIi1xICAgICAgUXVpdCBxdWlja2x5IGFzIHNvb24gYXMgYSB0YXJnZXQgZmFpbHMuXG4iICk7CisgICAgICAgIHByaW50ZiggIi1zeD15ICAgU2V0IHZhcmlhYmxlIHg9eSwgb3ZlcnJpZGluZyBlbnZpcm9ubWVudC5cbiIgKTsKKyAgICAgICAgcHJpbnRmKCAiLXR4ICAgICBSZWJ1aWxkIHgsIGV2ZW4gaWYgaXQgaXMgdXAtdG8tZGF0ZS5cbiIgKTsKKyAgICAgICAgcHJpbnRmKCAiLXYgICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBqYW0gYW5kIGV4aXQuXG4iICk7CisgICAgICAgIHByaW50ZiggIi0teCAgICAgT3B0aW9uIGlzIGlnbm9yZWQuXG5cbiIgKTsKKworICAgICAgICBleGl0KCBFWElUQkFEICk7CisgICAgfQorCisgICAgLyogVmVyc2lvbiBpbmZvLiAqLworICAgIGlmICggKCBzID0gZ2V0b3B0dmFsKCBvcHR2LCAndicsIDAgKSApICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIkJvb3N0LkphbSAgVmVyc2lvbiAlcy4gJXMuXG4iLCBWRVJTSU9OLCBPU01JTk9SICk7CisgICAgICAgIHByaW50ZiggIiAgIENvcHlyaWdodCAxOTkzLTIwMDIgQ2hyaXN0b3BoZXIgU2Vpd2FsZCBhbmQgUGVyZm9yY2UgIgorICAgICAgICAgICAgIlNvZnR3YXJlLCBJbmMuXG4iICk7CisgICAgICAgIHByaW50ZiggIiAgIENvcHlyaWdodCAyMDAxIERhdmlkIFR1cm5lci5cbiIgKTsKKyAgICAgICAgcHJpbnRmKCAiICAgQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy5cbiIgKTsKKyAgICAgICAgcHJpbnRmKCAiICAgQ29weXJpZ2h0IDIwMDItMjAwOCBSZW5lIFJpdmVyYS5cbiIgKTsKKyAgICAgICAgcHJpbnRmKCAiICAgQ29weXJpZ2h0IDIwMDMtMjAwOCBWbGFkaW1pciBQcnVzLlxuIiApOworICAgICAgICByZXR1cm4gRVhJVE9LOworICAgIH0KKworICAgIC8qIFBpY2sgdXAgaW50ZXJlc3Rpbmcgb3B0aW9ucy4gKi8KKyAgICBpZiAoICggcyA9IGdldG9wdHZhbCggb3B0diwgJ24nLCAwICkgKSApCisgICAgeworICAgICAgICArK2dsb2JzLm5vZXhlYzsKKyAgICAgICAgZ2xvYnMuZGVidWdbIDIgXSA9IDE7CisgICAgfQorCisgICAgaWYgKCAoIHMgPSBnZXRvcHR2YWwoIG9wdHYsICdwJywgMCApICkgKQorICAgIHsKKyAgICAgICAgLyogVW5kb2N1bWVudGVkIC1wMyAoYWN0cyBsaWtlIGJvdGggLXAxIC1wMikgbWVhbnMgc2VwYXJhdGUgcGlwZSBhY3Rpb24KKyAgICAgICAgICogc3Rkb3V0IGFuZCBzdGRlcnIuCisgICAgICAgICAqLworICAgICAgICBnbG9icy5waXBlX2FjdGlvbiA9IGF0b2koIHMgKTsKKyAgICAgICAgaWYgKCBnbG9icy5waXBlX2FjdGlvbiA8IDAgfHwgMyA8IGdsb2JzLnBpcGVfYWN0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiSW52YWxpZCBwaXBlIGRlc2NyaXB0b3IgJyVkJywgdmFsaWQgdmFsdWVzIGFyZSAtcFswLi4zXS4iCisgICAgICAgICAgICAgICAgIlxuIiwgZ2xvYnMucGlwZV9hY3Rpb24gKTsKKyAgICAgICAgICAgIGV4aXQoIEVYSVRCQUQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggKCBzID0gZ2V0b3B0dmFsKCBvcHR2LCAncScsIDAgKSApICkKKyAgICAgICAgZ2xvYnMucXVpdHF1aWNrID0gMTsKKworICAgIGlmICggKCBzID0gZ2V0b3B0dmFsKCBvcHR2LCAnYScsIDAgKSApICkKKyAgICAgICAgYW55aG93Kys7CisKKyAgICBpZiAoICggcyA9IGdldG9wdHZhbCggb3B0diwgJ2onLCAwICkgKSApCisgICAgeworICAgICAgICBnbG9icy5qb2JzID0gYXRvaSggcyApOworICAgICAgICBpZiAoIGdsb2JzLmpvYnMgPCAxIHx8IGdsb2JzLmpvYnMgPiBNQVhKT0JTICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiSW52YWxpZCB2YWx1ZSBmb3IgdGhlICctaicgb3B0aW9uLCB2YWxpZCB2YWx1ZXMgYXJlIDEgIgorICAgICAgICAgICAgICAgICJ0aHJvdWdoICVkLlxuIiwgTUFYSk9CUyApOworICAgICAgICAgICAgZXhpdCggRVhJVEJBRCApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAoIHMgPSBnZXRvcHR2YWwoIG9wdHYsICdnJywgMCApICkgKQorICAgICAgICBnbG9icy5uZXdlc3RmaXJzdCA9IDE7CisKKyAgICBpZiAoICggcyA9IGdldG9wdHZhbCggb3B0diwgJ2wnLCAwICkgKSApCisgICAgICAgIGdsb2JzLnRpbWVvdXQgPSBhdG9pKCBzICk7CisKKyAgICBpZiAoICggcyA9IGdldG9wdHZhbCggb3B0diwgJ20nLCAwICkgKSApCisgICAgICAgIGdsb2JzLm1heF9idWYgPSBhdG9pKCBzICkgKiAxMDI0OyAgLyogY29udmVydCB0byBrYiAqLworCisgICAgLyogVHVybiBvbi9vZmYgZGVidWdnaW5nICovCisgICAgZm9yICggbiA9IDA7ICggcyA9IGdldG9wdHZhbCggb3B0diwgJ2QnLCBuICkgKTsgKytuICkKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIC8qIEZpcnN0IC1kLCB0dXJuIG9mZiBkZWZhdWx0cy4gKi8KKyAgICAgICAgaWYgKCAhbiApCisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IERFQlVHX01BWDsgKytpICkKKyAgICAgICAgICAgICAgICBnbG9icy5kZWJ1Z1tpXSA9IDA7CisKKyAgICAgICAgaSA9IGF0b2koIHMgKTsKKworICAgICAgICBpZiAoICggaSA8IDAgKSB8fCAoIGkgPj0gREVCVUdfTUFYICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoICJJbnZhbGlkIGRlYnVnIGxldmVsICclcycuXG4iLCBzICk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG4gdHVybnMgb24gbGV2ZWxzIDEtbi4gKi8KKyAgICAgICAgLyogK24gdHVybnMgb24gbGV2ZWwgbi4gKi8KKyAgICAgICAgaWYgKCAqcyA9PSAnKycgKQorICAgICAgICAgICAgZ2xvYnMuZGVidWdbIGkgXSA9IDE7CisgICAgICAgIGVsc2Ugd2hpbGUgKCBpICkKKyAgICAgICAgICAgIGdsb2JzLmRlYnVnWyBpLS0gXSA9IDE7CisgICAgfQorCisgICAgY29uc3RhbnRzX2luaXQoKTsKKyAgICBjd2RfaW5pdCgpOworCisgICAgeworICAgICAgICBQUk9GSUxFX0VOVEVSKCBNQUlOICk7CisKKyNpZmRlZiBIQVZFX1BZVEhPTgorICAgICAgICB7CisgICAgICAgICAgICBQUk9GSUxFX0VOVEVSKCBNQUlOX1BZVEhPTiApOworICAgICAgICAgICAgUHlfSW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRpYyBQeU1ldGhvZERlZiBCamFtTWV0aG9kc1tdID0geworICAgICAgICAgICAgICAgICAgICB7ImNhbGwiLCBiamFtX2NhbGwsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICJDYWxsIHRoZSBzcGVjaWZpZWQgYmphbSBydWxlLiJ9LAorICAgICAgICAgICAgICAgICAgICB7ImltcG9ydF9ydWxlIiwgYmphbV9pbXBvcnRfcnVsZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIkltcG9ydHMgUHl0aG9uIGNhbGxhYmxlIHRvIGJqYW0uIn0sCisgICAgICAgICAgICAgICAgICAgIHsiZGVmaW5lX2FjdGlvbiIsIGJqYW1fZGVmaW5lX2FjdGlvbiwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIkRlZmluZXMgYSBjb21tYW5kIGxpbmUgYWN0aW9uLiJ9LAorICAgICAgICAgICAgICAgICAgICB7InZhcmlhYmxlIiwgYmphbV92YXJpYWJsZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIk9idGFpbnMgYSB2YXJpYWJsZSBmcm9tIGJqYW0ncyBnbG9iYWwgbW9kdWxlLiJ9LAorICAgICAgICAgICAgICAgICAgICB7ImJhY2t0cmFjZSIsIGJqYW1fYmFja3RyYWNlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAiUmV0dXJucyBiamFtIGJhY2t0cmFjZSBmcm9tIHRoZSBsYXN0IGNhbGwgaW50byBQeXRob24uIn0sCisgICAgICAgICAgICAgICAgICAgIHsiY2FsbGVyIiwgYmphbV9jYWxsZXIsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICJSZXR1cm5zIHRoZSBtb2R1bGUgZnJvbSB3aGljaCB0aGUgbGFzdCBjYWxsIGludG8gUHl0aG9uIGlzIG1hZGUuIn0sCisgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBOVUxMLCAwLCBOVUxMfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBQeV9Jbml0TW9kdWxlKCAiYmphbSIsIEJqYW1NZXRob2RzICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQUk9GSUxFX0VYSVQoIE1BSU5fUFlUSE9OICk7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworICAgICAgICBydW5fdW5pdF90ZXN0cygpOworI2VuZGlmCisjaWYgWVlERUJVRyAhPSAwCisgICAgICAgIGlmICggREVCVUdfUEFSU0UgKQorICAgICAgICAgICAgeXlkZWJ1ZyA9IDE7CisjZW5kaWYKKworICAgICAgICAvKiBTZXQgSkFNREFURS4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgdGltZXN0YW1wIGN1cnJlbnQ7CisgICAgICAgICAgICB0aW1lc3RhbXBfY3VycmVudCggJmN1cnJlbnQgKTsKKyAgICAgICAgICAgIHZhcl9zZXQoIHJvb3RfbW9kdWxlKCksIGNvbnN0YW50X0pBTURBVEUsIGxpc3RfbmV3KCBvdXRmX3RpbWUoCisgICAgICAgICAgICAgICAgJmN1cnJlbnQgKSApLCBWQVJfU0VUICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgSkFNX1ZFUlNJT04uICovCisgICAgICAgIHZhcl9zZXQoIHJvb3RfbW9kdWxlKCksIGNvbnN0YW50X0pBTV9WRVJTSU9OLAorICAgICAgICAgICAgICAgICBsaXN0X3B1c2hfYmFjayggbGlzdF9wdXNoX2JhY2soIGxpc3RfbmV3KAorICAgICAgICAgICAgICAgICAgIG9iamVjdF9uZXcoIFZFUlNJT05fTUFKT1JfU1lNICkgKSwKKyAgICAgICAgICAgICAgICAgICBvYmplY3RfbmV3KCBWRVJTSU9OX01JTk9SX1NZTSApICksCisgICAgICAgICAgICAgICAgICAgb2JqZWN0X25ldyggVkVSU0lPTl9QQVRDSF9TWU0gKSApLAorICAgICAgICAgICAgICAgICAgIFZBUl9TRVQgKTsKKworICAgICAgICAvKiBTZXQgSkFNVU5BTUUuICovCisjaWZkZWYgdW5peAorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgdXRzbmFtZSB1OworCisgICAgICAgICAgICBpZiAoIHVuYW1lKCAmdSApID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcl9zZXQoIHJvb3RfbW9kdWxlKCksIGNvbnN0YW50X0pBTVVOQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfcHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X3B1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfcHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfcHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X25ldygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X25ldyggdS5zeXNuYW1lICkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X25ldyggdS5ub2RlbmFtZSApICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X25ldyggdS5yZWxlYXNlICkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9uZXcoIHUudmVyc2lvbiApICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9uZXcoIHUubWFjaGluZSApICksIFZBUl9TRVQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmICAvKiB1bml4ICovCisKKyAgICAgICAgLyogU2V0IEpBTV9USU1FU1RBTVBfUkVTT0xVVElPTi4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgdGltZXN0YW1wIGZtdF9yZXNvbHV0aW9uWyAxIF07CisgICAgICAgICAgICBmaWxlX3N1cHBvcnRlZF9mbXRfcmVzb2x1dGlvbiggZm10X3Jlc29sdXRpb24gKTsKKyAgICAgICAgICAgIHZhcl9zZXQoIHJvb3RfbW9kdWxlKCksIGNvbnN0YW50X0pBTV9USU1FU1RBTVBfUkVTT0xVVElPTiwgbGlzdF9uZXcoCisgICAgICAgICAgICAgICAgb2JqZWN0X25ldyggdGltZXN0YW1wX3RpbWVzdHIoIGZtdF9yZXNvbHV0aW9uICkgKSApLCBWQVJfU0VUICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBMb2FkIHVwIGVudmlyb25tZW50IHZhcmlhYmxlcy4gKi8KKworICAgICAgICAvKiBGaXJzdCBpbnRvIHRoZSBnbG9iYWwgbW9kdWxlLCB3aXRoIHNwbGl0dGluZywgZm9yIGJhY2t3YXJkCisgICAgICAgICAqIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAqLworICAgICAgICB2YXJfZGVmaW5lcyggcm9vdF9tb2R1bGUoKSwgdXNlX2Vudmlyb24sIDEgKTsKKworICAgICAgICBlbnZpcm9uX21vZHVsZSA9IGJpbmRtb2R1bGUoIGNvbnN0YW50X0VOVklST04gKTsKKyAgICAgICAgLyogVGhlbiBpbnRvIC5FTlZJUk9OLCB3aXRob3V0IHNwbGl0dGluZy4gKi8KKyAgICAgICAgdmFyX2RlZmluZXMoIGVudmlyb25fbW9kdWxlLCB1c2VfZW52aXJvbiwgMCApOworCisgICAgICAgIC8qCisgICAgICAgICAqIEphbSBkZWZpbmVkIHZhcmlhYmxlcyBPUyAmIE9TUExBVC4gV2UgbG9hZCB0aGVtIGFmdGVyIGVudmlyb25tZW50LCBzbworICAgICAgICAgKiB0aGF0IHNldHRpbmcgT1MgaW4gZW52aXJvbm1lbnQgZG9lcyBub3QgY2hhbmdlIEphbSdzIG5vdGlvbiBvZiB0aGUKKyAgICAgICAgICogY3VycmVudCBwbGF0Zm9ybS4KKyAgICAgICAgICovCisgICAgICAgIHZhcl9kZWZpbmVzKCByb290X21vZHVsZSgpLCBvdGhlcnN5bXMsIDEgKTsKKworICAgICAgICAvKiBMb2FkIHVwIHZhcmlhYmxlcyBzZXQgb24gY29tbWFuZCBsaW5lLiAqLworICAgICAgICBmb3IgKCBuID0gMDsgKCBzID0gZ2V0b3B0dmFsKCBvcHR2LCAncycsIG4gKSApOyArK24gKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyICogc3ltdlsgMiBdOworICAgICAgICAgICAgc3ltdlsgMCBdID0gczsKKyAgICAgICAgICAgIHN5bXZbIDEgXSA9IDA7CisgICAgICAgICAgICB2YXJfZGVmaW5lcyggcm9vdF9tb2R1bGUoKSwgc3ltdiwgMSApOworICAgICAgICAgICAgdmFyX2RlZmluZXMoIGVudmlyb25fbW9kdWxlLCBzeW12LCAwICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgdGhlIEFSR1YgdG8gcmVmbGVjdCB0aGUgY29tcGxldGUgbGlzdCBvZiBhcmd1bWVudHMgb2YgaW52b2NhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgYXJnX2M7ICsrbiApCisgICAgICAgICAgICB2YXJfc2V0KCByb290X21vZHVsZSgpLCBjb25zdGFudF9BUkdWLCBsaXN0X25ldyggb2JqZWN0X25ldygKKyAgICAgICAgICAgICAgICBhcmdfdlsgbiBdICkgKSwgVkFSX0FQUEVORCApOworCisgICAgICAgIC8qIEluaXRpYWxpemUgYnVpbHQtaW4gcnVsZXMuICovCisgICAgICAgIGxvYWRfYnVpbHRpbnMoKTsKKworICAgICAgICAvKiBBZGQgdGhlIHRhcmdldHMgaW4gdGhlIGNvbW1hbmQgbGluZSB0byB0aGUgdXBkYXRlIGxpc3QuICovCisgICAgICAgIGZvciAoIG4gPSAxOyBuIDwgYXJnX2M7ICsrbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYXJnX3ZbIG4gXVsgMCBdID09ICctJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciAqIGYgPSAiLTpsOmQ6ajpmOmdzOnQ6YW5vOnF2IjsKKyAgICAgICAgICAgICAgICBmb3IgKCA7ICpmOyArK2YgKSBpZiAoICpmID09IGFyZ192WyBuIF1bIDEgXSApIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICggKCBmWyAxIF0gPT0gJzonICkgJiYgKCBhcmdfdlsgbiBdWyAyIF0gPT0gJ1wwJyApICkgKytuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9CSkVDVCAqIGNvbnN0IHRhcmdldCA9IG9iamVjdF9uZXcoIGFyZ192WyBuIF0gKTsKKyAgICAgICAgICAgICAgICBtYXJrX3RhcmdldF9mb3JfdXBkYXRpbmcoIHRhcmdldCApOworICAgICAgICAgICAgICAgIG9iamVjdF9mcmVlKCB0YXJnZXQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggbGlzdF9lbXB0eSggdGFyZ2V0c190b191cGRhdGUoKSApICkKKyAgICAgICAgICAgIG1hcmtfdGFyZ2V0X2Zvcl91cGRhdGluZyggY29uc3RhbnRfYWxsICk7CisKKyAgICAgICAgLyogUGFyc2UgcnVsZXNldC4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUUgZnJhbWVbIDEgXTsKKyAgICAgICAgICAgIGZyYW1lX2luaXQoIGZyYW1lICk7CisgICAgICAgICAgICBmb3IgKCBuID0gMDsgKCBzID0gZ2V0b3B0dmFsKCBvcHR2LCAnZicsIG4gKSApOyArK24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9CSkVDVCAqIGNvbnN0IGZpbGVuYW1lID0gb2JqZWN0X25ldyggcyApOworICAgICAgICAgICAgICAgIHBhcnNlX2ZpbGUoIGZpbGVuYW1lLCBmcmFtZSApOworICAgICAgICAgICAgICAgIG9iamVjdF9mcmVlKCBmaWxlbmFtZSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICFuICkKKyAgICAgICAgICAgICAgICBwYXJzZV9maWxlKCBjb25zdGFudF9wbHVzLCBmcmFtZSApOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0geXlhbnllcnJvcnMoKTsKKworICAgICAgICAvKiBNYW51YWxseSB0b3VjaCAtdCB0YXJnZXRzLiAqLworICAgICAgICBmb3IgKCBuID0gMDsgKCBzID0gZ2V0b3B0dmFsKCBvcHR2LCAndCcsIG4gKSApOyArK24gKQorICAgICAgICB7CisgICAgICAgICAgICBPQkpFQ1QgKiBjb25zdCB0YXJnZXQgPSBvYmplY3RfbmV3KCBzICk7CisgICAgICAgICAgICB0b3VjaF90YXJnZXQoIHRhcmdldCApOworICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIHRhcmdldCApOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgYW4gb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkLCBzZXQgZ2xvYnMuY21kb3V0IHRvIHRoYXQuICovCisgICAgICAgIGlmICggKCBzID0gZ2V0b3B0dmFsKCBvcHR2LCAnbycsIDAgKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAhKCBnbG9icy5jbWRvdXQgPSBmb3BlbiggcywgInciICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCAiRmFpbGVkIHRvIHdyaXRlIHRvICclcydcbiIsIHMgKTsKKyAgICAgICAgICAgICAgICBleGl0KCBFWElUQkFEICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2dsb2JzLm5vZXhlYzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSBidWlsZCBzeXN0ZW0gbWF5IHNldCB0aGUgUEFSQUxMRUxJU00gdmFyaWFibGUgdG8gb3ZlcnJpZGUgLWoKKyAgICAgICAgICogb3B0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1QgKiBjb25zdCBwID0gdmFyX2dldCggcm9vdF9tb2R1bGUoKSwgY29uc3RhbnRfUEFSQUxMRUxJU00gKTsKKyAgICAgICAgICAgIGlmICggIWxpc3RfZW1wdHkoIHAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNvbnN0IGogPSBhdG9pKCBvYmplY3Rfc3RyKCBsaXN0X2Zyb250KCBwICkgKSApOworICAgICAgICAgICAgICAgIGlmICggaiA8IDEgfHwgaiA+IE1BWEpPQlMgKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoICJJbnZhbGlkIHZhbHVlIG9mIFBBUkFMTEVMSVNNOiAlcy4gVmFsaWQgdmFsdWVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmUgMSB0aHJvdWdoICVkLlxuIiwgb2JqZWN0X3N0ciggbGlzdF9mcm9udCggcCApICksCisgICAgICAgICAgICAgICAgICAgICAgICBNQVhKT0JTICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBnbG9icy5qb2JzID0gajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEtFRVBfR09JTkcgb3ZlcnJpZGVzIC1xIG9wdGlvbi4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgTElTVCAqIGNvbnN0IHAgPSB2YXJfZ2V0KCByb290X21vZHVsZSgpLCBjb25zdGFudF9LRUVQX0dPSU5HICk7CisgICAgICAgICAgICBpZiAoICFsaXN0X2VtcHR5KCBwICkgKQorICAgICAgICAgICAgICAgIGdsb2JzLnF1aXRxdWljayA9IGF0b2koIG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIHAgKSApICkgPyAwIDogMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vdyBtYWtlIHRhcmdldC4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgUFJPRklMRV9FTlRFUiggTUFJTl9NQUtFICk7CisgICAgICAgICAgICBMSVNUICogY29uc3QgdGFyZ2V0cyA9IHRhcmdldHNfdG9fdXBkYXRlKCk7CisgICAgICAgICAgICBpZiAoICFsaXN0X2VtcHR5KCB0YXJnZXRzICkgKQorICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBtYWtlKCB0YXJnZXRzLCBhbnlob3cgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBsYXN0X3VwZGF0ZV9ub3dfc3RhdHVzOworICAgICAgICAgICAgUFJPRklMRV9FWElUKCBNQUlOX01BS0UgKTsKKyAgICAgICAgfQorCisgICAgICAgIFBST0ZJTEVfRVhJVCggTUFJTiApOworICAgIH0KKworICAgIGlmICggREVCVUdfUFJPRklMRSApCisgICAgICAgIHByb2ZpbGVfZHVtcCgpOworCisKKyNpZmRlZiBPUFRfSEVBREVSX0NBQ0hFX0VYVAorICAgIGhjYWNoZV9kb25lKCk7CisjZW5kaWYKKworICAgIGNsZWFyX3RhcmdldHNfdG9fdXBkYXRlKCk7CisKKyAgICAvKiBXaWRlbHkgc2NhdHRlcmVkIGNsZWFudXAuICovCisgICAgcHJvcGVydHlfc2V0X2RvbmUoKTsKKyAgICBmaWxlX2RvbmUoKTsKKyAgICBydWxlc19kb25lKCk7CisgICAgdGltZXN0YW1wX2RvbmUoKTsKKyAgICBzZWFyY2hfZG9uZSgpOworICAgIGNsYXNzX2RvbmUoKTsKKyAgICBtb2R1bGVzX2RvbmUoKTsKKyAgICByZWdleF9kb25lKCk7CisgICAgY3dkX2RvbmUoKTsKKyAgICBwYXRoX2RvbmUoKTsKKyAgICBmdW5jdGlvbl9kb25lKCk7CisgICAgbGlzdF9kb25lKCk7CisgICAgY29uc3RhbnRzX2RvbmUoKTsKKyAgICBvYmplY3RfZG9uZSgpOworCisgICAgLyogQ2xvc2UgY21kb3V0LiAqLworICAgIGlmICggZ2xvYnMuY21kb3V0ICkKKyAgICAgICAgZmNsb3NlKCBnbG9icy5jbWRvdXQgKTsKKworI2lmZGVmIEhBVkVfUFlUSE9OCisgICAgUHlfRmluYWxpemUoKTsKKyNlbmRpZgorCisgICAgQkpBTV9NRU1fQ0xPU0UoKTsKKworICAgIHJldHVybiBzdGF0dXMgPyBFWElUQkFEIDogRVhJVE9LOworfQorCisKKy8qCisgKiBleGVjdXRhYmxlX3BhdGgoKQorICovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyMgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgaW5jbHVkZSA8d2luZG93cy5oPgorY2hhciAqIGV4ZWN1dGFibGVfcGF0aCggY2hhciBjb25zdCAqIGFyZ3YwICkKK3sKKyAgICBjaGFyIGJ1ZlsgMTAyNCBdOworICAgIERXT1JEIGNvbnN0IHJldCA9IEdldE1vZHVsZUZpbGVOYW1lKCBOVUxMLCBidWYsIHNpemVvZiggYnVmICkgKTsKKyAgICByZXR1cm4gKCAhcmV0IHx8IHJldCA9PSBzaXplb2YoIGJ1ZiApICkgPyBOVUxMIDogc3RyZHVwKCBidWYgKTsKK30KKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKSAgLyogTm90IHRlc3RlZCAqLworIyBpbmNsdWRlIDxtYWNoLW8vZHlsZC5oPgorY2hhciAqZXhlY3V0YWJsZV9wYXRoKCBjaGFyIGNvbnN0ICogYXJndjAgKQoreworICAgIGNoYXIgYnVmWyAxMDI0IF07CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZiggYnVmICk7CisgICAgcmV0dXJuIF9OU0dldEV4ZWN1dGFibGVQYXRoKCBidWYsICZzaXplICkgPyBOVUxMIDogc3RyZHVwKCBidWYgKTsKK30KKyNlbGlmIGRlZmluZWQoc3VuKSB8fCBkZWZpbmVkKF9fc3VuKSAgLyogTm90IHRlc3RlZCAqLworIyBpbmNsdWRlIDxzdGRsaWIuaD4KK2NoYXIgKiBleGVjdXRhYmxlX3BhdGgoIGNoYXIgY29uc3QgKiBhcmd2MCApCit7CisgICAgcmV0dXJuIHN0cmR1cCggZ2V0ZXhlY25hbWUoKSApOworfQorI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyMgaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorY2hhciAqIGV4ZWN1dGFibGVfcGF0aCggY2hhciBjb25zdCAqIGFyZ3YwICkKK3sKKyAgICBpbnQgbWliWyA0IF0gPSB7IENUTF9LRVJOLCBLRVJOX1BST0MsIEtFUk5fUFJPQ19QQVRITkFNRSwgLTEgfTsKKyAgICBjaGFyIGJ1ZlsgMTAyNCBdOworICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKCBidWYgKTsKKyAgICBzeXNjdGwoIG1pYiwgNCwgYnVmLCAmc2l6ZSwgTlVMTCwgMCApOworICAgIHJldHVybiAoICFzaXplIHx8IHNpemUgPT0gc2l6ZW9mKCBidWYgKSApID8gTlVMTCA6IHN0cm5kdXAoIGJ1Ziwgc2l6ZSApOworfQorI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorY2hhciAqIGV4ZWN1dGFibGVfcGF0aCggY2hhciBjb25zdCAqIGFyZ3YwICkKK3sKKyAgICBjaGFyIGJ1ZlsgMTAyNCBdOworICAgIHNzaXplX3QgY29uc3QgcmV0ID0gcmVhZGxpbmsoICIvcHJvYy9zZWxmL2V4ZSIsIGJ1Ziwgc2l6ZW9mKCBidWYgKSApOworICAgIHJldHVybiAoICFyZXQgfHwgcmV0ID09IHNpemVvZiggYnVmICkgKSA/IE5VTEwgOiBzdHJuZHVwKCBidWYsIHJldCApOworfQorI2Vsc2UKK2NoYXIgKiBleGVjdXRhYmxlX3BhdGgoIGNoYXIgY29uc3QgKiBhcmd2MCApCit7CisgICAgLyogSWYgYXJndjAgaXMgYW4gYWJzb2x1dGUgcGF0aCwgYXNzdW1lIGl0IGlzIHRoZSByaWdodCBhYnNvbHV0ZSBwYXRoLiAqLworICAgIHJldHVybiBhcmd2MFsgMCBdID09ICcvJyA/IHN0cmR1cCggYXJndjAgKSA6IE5VTEw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2phbS5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvamFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhZDBlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2phbS5oCkBAIC0wLDAgKzEsNDc1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTMsIDE5OTUgQ2hyaXN0b3BoZXIgU2Vpd2FsZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiBUaGlzIGZpbGUgaXMgQUxTTzoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgKiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworLyoKKyAqIGphbS5oIC0gaW5jbHVkZXMgYW5kIGdsb2JhbHMgZm9yIGphbQorICovCisKKyNpZm5kZWYgSkFNX0hfVlBfMjAwM18wOF8wMQorI2RlZmluZSBKQU1fSF9WUF8yMDAzXzA4XzAxCisKKyNpZmRlZiBIQVZFX1BZVEhPTgorI2luY2x1ZGUgPFB5dGhvbi5oPgorI2VuZGlmCisKKy8qIEFzc3VtZSBwb3BlbiBzdXBwb3J0IGlzIGF2YWlsYWJsZSB1bmxlc3Mga25vd24gb3RoZXJ3aXNlLiAqLworI2RlZmluZSBIQVZFX1BPUEVOIDEKKworLyoKKyAqIFdpbmRvd3MgTlQKKyAqLworCisjaWZkZWYgTlQKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpZm5kZWYgX19NV0VSS1NfXworICAgICNpbmNsdWRlIDxtZW1vcnkuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjZGVmaW5lIE9TTUFKT1IgIk5UPXRydWUiCisjZGVmaW5lIE9TTUlOT1IgIk9TPU5UIgorI2RlZmluZSBPU19OVAorI2RlZmluZSBTUExJVFBBVEggJzsnCisjZGVmaW5lIE1BWExJTkUgKHVuZGVmaW5lZF9fc2VlX2V4ZWNudF9jKSAgLyogbWF4IGNoYXJzIHBlciBjb21tYW5kIGxpbmUgKi8KKyNkZWZpbmUgVVNFX0VYRUNOVAorI2RlZmluZSBQQVRIX0RFTElNICdcXCcKKworLyogQVM0MDAgY3Jvc3MtY29tcGlsZSBmcm9tIE5ULiAqLworCisjaWZkZWYgQVM0MDAKKyAgICAjdW5kZWYgT1NNSU5PUgorICAgICN1bmRlZiBPU01BSk9SCisgICAgI2RlZmluZSBPU01BSk9SICJBUzQwMD10cnVlIgorICAgICNkZWZpbmUgT1NNSU5PUiAiT1M9QVM0MDAiCisgICAgI2RlZmluZSBPU19BUzQwMAorI2VuZGlmCisKKy8qIE1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeSBvbiBXaW5kb3dzLiAqLworCisjaWZkZWYgX19NU0xfXworICAgICN1bmRlZiBIQVZFX1BPUEVOCisjZW5kaWYKKworI2VuZGlmICAvKiAjaWZkZWYgTlQgKi8KKworCisvKgorICogV2luZG93cyBNaW5nVzMyCisgKi8KKworI2lmZGVmIE1JTkdXCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNkZWZpbmUgT1NNQUpPUiAiTUlOR1c9dHJ1ZSIKKyNkZWZpbmUgT1NNSU5PUiAiT1M9TUlOR1ciCisjZGVmaW5lIE9TX05UCisjZGVmaW5lIFNQTElUUEFUSCAnOycKKyNkZWZpbmUgTUFYTElORSA5OTYgIC8qIG1heCBjaGFycyBwZXIgY29tbWFuZCBsaW5lICovCisjZGVmaW5lIFVTRV9FWEVDVU5JWAorI2RlZmluZSBQQVRIX0RFTElNICdcXCcKKworI2VuZGlmICAvKiAjaWZkZWYgTUlOR1cgKi8KKworCisvKgorICogR29kIGZlYXJpbmcgVU5JWC4KKyAqLworCisjaWZuZGVmIE9TTUlOT1IKKworI2RlZmluZSBPU01BSk9SICJVTklYPXRydWUiCisjZGVmaW5lIFVTRV9FWEVDVU5JWAorI2RlZmluZSBVU0VfRklMRVVOSVgKKyNkZWZpbmUgUEFUSF9ERUxJTSAnLycKKworI2lmZGVmIF9BSVgKKyAgICAjZGVmaW5lIHVuaXgKKyAgICAjZGVmaW5lIE1BWExJTkUgMjM1NTIgIC8qIDI0ayAtIDFrLCBtYXggY2hhcnMgcGVyIGNvbW1hbmQgbGluZSAqLworICAgICNkZWZpbmUgT1NNSU5PUiAiT1M9QUlYIgorICAgICNkZWZpbmUgT1NfQUlYCisgICAgI2RlZmluZSBOT19WRk9SSworI2VuZGlmCisjaWZkZWYgQU1JR0EKKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPUFNSUdBIgorICAgICNkZWZpbmUgT1NfQU1JR0EKKyNlbmRpZgorI2lmZGVmIF9fQkVPU19fCisgICAgI2RlZmluZSB1bml4CisgICAgI2RlZmluZSBPU01JTk9SICJPUz1CRU9TIgorICAgICNkZWZpbmUgT1NfQkVPUworICAgICNkZWZpbmUgTk9fVkZPUksKKyNlbmRpZgorI2lmZGVmIF9fYnNkaV9fCisgICAgI2RlZmluZSBPU01JTk9SICJPUz1CU0RJIgorICAgICNkZWZpbmUgT1NfQlNESQorI2VuZGlmCisjaWYgZGVmaW5lZCAoQ09IRVJFTlQpICYmIGRlZmluZWQgKF9JMzg2KQorICAgICNkZWZpbmUgT1NNSU5PUiAiT1M9Q09IRVJFTlQiCisgICAgI2RlZmluZSBPU19DT0hFUkVOVAorICAgICNkZWZpbmUgTk9fVkZPUksKKyNlbmRpZgorI2lmIGRlZmluZWQoX19jeWd3aW5fXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorICAgICNkZWZpbmUgT1NNSU5PUiAiT1M9Q1lHV0lOIgorICAgICNkZWZpbmUgT1NfQ1lHV0lOCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiAhZGVmaW5lZChfX0RyYWdvbkZseV9fKQorICAgICNkZWZpbmUgT1NNSU5PUiAiT1M9RlJFRUJTRCIKKyAgICAjZGVmaW5lIE9TX0ZSRUVCU0QKKyNlbmRpZgorI2lmZGVmIF9fRHJhZ29uRmx5X18KKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPURSQUdPTkZMWUJTRCIKKyAgICAjZGVmaW5lIE9TX0RSQUdPTkZMWUJTRAorI2VuZGlmCisjaWZkZWYgX19ER1VYX18KKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPURHVVgiCisgICAgI2RlZmluZSBPU19ER1VYCisjZW5kaWYKKyNpZmRlZiBfX2hwdXgKKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPUhQVVgiCisgICAgI2RlZmluZSBPU19IUFVYCisjZW5kaWYKKyNpZmRlZiBfX09QRU5OVAorICAgICNkZWZpbmUgdW5peAorICAgICNkZWZpbmUgT1NNSU5PUiAiT1M9SU5URVJJWCIKKyAgICAjZGVmaW5lIE9TX0lOVEVSSVgKKyAgICAjZGVmaW5lIE5PX1ZGT1JLCisjZW5kaWYKKyNpZmRlZiBfX3NnaQorICAgICNkZWZpbmUgT1NNSU5PUiAiT1M9SVJJWCIKKyAgICAjZGVmaW5lIE9TX0lSSVgKKyAgICAjZGVmaW5lIE5PX1ZGT1JLCisjZW5kaWYKKyNpZmRlZiBfX0lTQworICAgICNkZWZpbmUgT1NNSU5PUiAiT1M9SVNDIgorICAgICNkZWZpbmUgT1NfSVNDCisgICAgI2RlZmluZSBOT19WRk9SSworI2VuZGlmCisjaWZkZWYgbGludXgKKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPUxJTlVYIgorICAgICNkZWZpbmUgT1NfTElOVVgKKyNlbmRpZgorI2lmZGVmIF9fTHlueF9fCisgICAgI2RlZmluZSBPU01JTk9SICJPUz1MWU5YIgorICAgICNkZWZpbmUgT1NfTFlOWAorICAgICNkZWZpbmUgTk9fVkZPUksKKyAgICAjZGVmaW5lIHVuaXgKKyNlbmRpZgorI2lmZGVmIF9fTUFDSFRFTl9fCisgICAgI2RlZmluZSBPU01JTk9SICJPUz1NQUNIVEVOIgorICAgICNkZWZpbmUgT1NfTUFDSFRFTgorI2VuZGlmCisjaWZkZWYgbXBlaXgKKyAgICAjZGVmaW5lIHVuaXgKKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPU1QRUlYIgorICAgICNkZWZpbmUgT1NfTVBFSVgKKyAgICAjZGVmaW5lIE5PX1ZGT1JLCisjZW5kaWYKKyNpZmRlZiBfX01WU19fCisgICAgI2RlZmluZSB1bml4CisgICAgI2RlZmluZSBPU01JTk9SICJPUz1NVlMiCisgICAgI2RlZmluZSBPU19NVlMKKyNlbmRpZgorI2lmZGVmIF9BVFQ0CisgICAgI2RlZmluZSBPU01JTk9SICJPUz1OQ1IiCisgICAgI2RlZmluZSBPU19OQ1IKKyNlbmRpZgorI2lmZGVmIF9fTmV0QlNEX18KKyAgICAjZGVmaW5lIHVuaXgKKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPU5FVEJTRCIKKyAgICAjZGVmaW5lIE9TX05FVEJTRAorICAgICNkZWZpbmUgTk9fVkZPUksKKyNlbmRpZgorI2lmZGVmIF9fUU5YX18KKyAgICAjZGVmaW5lIHVuaXgKKyAgICAjaWZkZWYgX19RTlhOVE9fXworICAgICAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPVFOWE5UTyIKKyAgICAgICAgI2RlZmluZSBPU19RTlhOVE8KKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPVFOWCIKKyAgICAgICAgI2RlZmluZSBPU19RTlgKKyAgICAgICAgI2RlZmluZSBOT19WRk9SSworICAgICAgICAjZGVmaW5lIE1BWExJTkUgOTk2ICAvKiBtYXggY2hhcnMgcGVyIGNvbW1hbmQgbGluZSAqLworICAgICNlbmRpZgorI2VuZGlmCisjaWZkZWYgTmVYVAorICAgICNpZmRlZiBfX0FQUExFX18KKyAgICAgICAgI2RlZmluZSBPU01JTk9SICJPUz1SSEFQU09EWSIKKyAgICAgICAgI2RlZmluZSBPU19SSEFQU09EWQorICAgICNlbHNlCisgICAgICAgICNkZWZpbmUgT1NNSU5PUiAiT1M9TkVYVCIKKyAgICAgICAgI2RlZmluZSBPU19ORVhUCisgICAgI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBfX0FQUExFX18KKyAgICAjZGVmaW5lIHVuaXgKKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPU1BQ09TWCIKKyAgICAjZGVmaW5lIE9TX01BQ09TWAorI2VuZGlmCisjaWZkZWYgX19vc2ZfXworICAgICNpZm5kZWYgdW5peAorICAgICAgICAjZGVmaW5lIHVuaXgKKyAgICAjZW5kaWYKKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPU9TRiIKKyAgICAjZGVmaW5lIE9TX09TRgorI2VuZGlmCisjaWZkZWYgX1NFUVVFTlRfCisgICAgI2RlZmluZSBPU01JTk9SICJPUz1QVFgiCisgICAgI2RlZmluZSBPU19QVFgKKyNlbmRpZgorI2lmZGVmIE1fWEVOSVgKKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPVNDTyIKKyAgICAjZGVmaW5lIE9TX1NDTworICAgICNkZWZpbmUgTk9fVkZPUksKKyNlbmRpZgorI2lmZGVmIHNpbml4CisgICAgI2RlZmluZSB1bml4CisgICAgI2RlZmluZSBPU01JTk9SICJPUz1TSU5JWCIKKyAgICAjZGVmaW5lIE9TX1NJTklYCisjZW5kaWYKKyNpZmRlZiBzdW4KKyAgICAjaWYgZGVmaW5lZChfX3N2cjRfXykgfHwgZGVmaW5lZChfX1NWUjQpCisgICAgICAgICNkZWZpbmUgT1NNSU5PUiAiT1M9U09MQVJJUyIKKyAgICAgICAgI2RlZmluZSBPU19TT0xBUklTCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBPU01JTk9SICJPUz1TVU5PUyIKKyAgICAgICAgI2RlZmluZSBPU19TVU5PUworICAgICNlbmRpZgorI2VuZGlmCisjaWZkZWYgdWx0cml4CisgICAgI2RlZmluZSBPU01JTk9SICJPUz1VTFRSSVgiCisgICAgI2RlZmluZSBPU19VTFRSSVgKKyNlbmRpZgorI2lmZGVmIF9VTklDT1MKKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPVVOSUNPUyIKKyAgICAjZGVmaW5lIE9TX1VOSUNPUworI2VuZGlmCisjaWYgZGVmaW5lZChfX1VTTENfXykgJiYgIWRlZmluZWQoTV9YRU5JWCkKKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPVVOSVhXQVJFIgorICAgICNkZWZpbmUgT1NfVU5JWFdBUkUKKyNlbmRpZgorI2lmZGVmIF9fT3BlbkJTRF9fCisgICAgI2RlZmluZSBPU01JTk9SICJPUz1PUEVOQlNEIgorICAgICNkZWZpbmUgT1NfT1BFTkJTRAorICAgICNkZWZpbmUgdW5peAorI2VuZGlmCisjaWYgZGVmaW5lZCAoX19GcmVlQlNEX2tlcm5lbF9fKSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykKKyAgICAjZGVmaW5lIE9TTUlOT1IgIk9TPUtGUkVFQlNEIgorICAgICNkZWZpbmUgT1NfS0ZSRUVCU0QKKyNlbmRpZgorI2lmbmRlZiBPU01JTk9SCisgICAgI2RlZmluZSBPU01JTk9SICJPUz1VTktOT1dOIgorI2VuZGlmCisKKy8qIEFsbCB0aGUgVU5JWCBpbmNsdWRlcyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZm5kZWYgT1NfTVBFSVgKKyAgICAjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIE9TX1FOWAorICAgICNpbmNsdWRlIDxtZW1vcnkuaD4KKyNlbmRpZgorCisjaWZuZGVmIE9TX1VMVFJJWAorICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoIE9TX0JTREkgICAgICAgICApICYmIFwKKyAgICAhZGVmaW5lZCggT1NfRlJFRUJTRCAgICAgICkgJiYgXAorICAgICFkZWZpbmVkKCBPU19EUkFHT05GTFlCU0QgKSAmJiBcCisgICAgIWRlZmluZWQoIE9TX05FWFQgICAgICAgICApICYmIFwKKyAgICAhZGVmaW5lZCggT1NfTUFDSFRFTiAgICAgICkgJiYgXAorICAgICFkZWZpbmVkKCBPU19NQUNPU1ggICAgICAgKSAmJiBcCisgICAgIWRlZmluZWQoIE9TX1JIQVBTT0RZICAgICApICYmIFwKKyAgICAhZGVmaW5lZCggT1NfTVZTICAgICAgICAgICkgJiYgXAorICAgICFkZWZpbmVkKCBPU19PUEVOQlNEICAgICAgKQorICAgICNpbmNsdWRlIDxtYWxsb2MuaD4KKyNlbmRpZgorCisjZW5kaWYgIC8qICNpZm5kZWYgT1NNSU5PUiAqLworCisKKy8qCisgKiBPU1BMQVQgZGVmaW5pdGlvbnMgLSBzdXBwcmVzc2VkIHdoZW4gaXQgaXMgYSBvbmUtb2YtYS1raW5kLgorICovCisKKyNpZiBkZWZpbmVkKCBfTV9QUEMgICAgICApIHx8IFwKKyAgICBkZWZpbmVkKCBQUEMgICAgICAgICApIHx8IFwKKyAgICBkZWZpbmVkKCBwcGMgICAgICAgICApIHx8IFwKKyAgICBkZWZpbmVkKCBfX3Bvd2VycGNfXyApIHx8IFwKKyAgICBkZWZpbmVkKCBfX3BwY19fICAgICApCisgICAgI2RlZmluZSBPU1BMQVQgIk9TUExBVD1QUEMiCisjZW5kaWYKKworI2lmIGRlZmluZWQoIF9BTFBIQV8gICApIHx8IFwKKyAgICBkZWZpbmVkKCBfX2FscGhhX18gKQorICAgICNkZWZpbmUgT1NQTEFUICJPU1BMQVQ9QVhQIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKCBfaTM4Nl8gICApIHx8IFwKKyAgICBkZWZpbmVkKCBfX2kzODZfXyApIHx8IFwKKyAgICBkZWZpbmVkKCBfX2kzODYgICApIHx8IFwKKyAgICBkZWZpbmVkKCBfTV9JWDg2ICApCisgICAgI2RlZmluZSBPU1BMQVQgIk9TUExBVD1YODYiCisjZW5kaWYKKworI2lmIGRlZmluZWQoIF9faWE2NF9fICkgfHwgXAorICAgIGRlZmluZWQoIF9fSUE2NF9fICkgfHwgXAorICAgIGRlZmluZWQoIF9faWE2NCAgICkKKyAgICAjZGVmaW5lIE9TUExBVCAiT1NQTEFUPUlBNjQiCisjZW5kaWYKKworI2lmIGRlZmluZWQoIF9feDg2XzY0X18gKSB8fCBcCisgICAgZGVmaW5lZCggX19hbWQ2NF9fICApIHx8IFwKKyAgICBkZWZpbmVkKCBfTV9BTUQ2NCAgICkKKyAgICAjZGVmaW5lIE9TUExBVCAiT1NQTEFUPVg4Nl82NCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCggX19zcGFyY19fICkgfHwgXAorICAgIGRlZmluZWQoIF9fc3BhcmMgICApCisgICAgI2RlZmluZSBPU1BMQVQgIk9TUExBVD1TUEFSQyIKKyNlbmRpZgorCisjaWZkZWYgX19taXBzX18KKyAgICAjZGVmaW5lIE9TUExBVCAiT1NQTEFUPU1JUFMiCisjZW5kaWYKKworI2lmZGVmIF9fYXJtX18KKyAgICAjZGVmaW5lIE9TUExBVCAiT1NQTEFUPUFSTSIKKyNlbmRpZgorCisjaWZkZWYgX19zMzkwX18KKyAgICAjZGVmaW5lIE9TUExBVCAiT1NQTEFUPTM5MCIKKyNlbmRpZgorCisjaWZkZWYgX19ocHBhCisgICAgI2RlZmluZSBPU1BMQVQgIk9TUExBVD1QQVJJU0MiCisjZW5kaWYKKworI2lmbmRlZiBPU1BMQVQKKyAgICAjZGVmaW5lIE9TUExBVCAiIgorI2VuZGlmCisKKworLyoKKyAqIEphbSBpbXBsZW1lbnRhdGlvbiBtaXNjLgorICovCisKKyNpZm5kZWYgTUFYTElORQorICAgICNkZWZpbmUgTUFYTElORSAxMDI0MDAgIC8qIG1heCBjaGFycyBwZXIgY29tbWFuZCBsaW5lICovCisjZW5kaWYKKworI2lmbmRlZiBFWElUT0sKKyAgICAjZGVmaW5lIEVYSVRPSyAwCisgICAgI2RlZmluZSBFWElUQkFEIDEKKyNlbmRpZgorCisjaWZuZGVmIFNQTElUUEFUSAorICAgICNkZWZpbmUgU1BMSVRQQVRIICc6JworI2VuZGlmCisKKy8qIFlvdSBwcm9iYWJseSBkbyBub3QgbmVlZCB0byBtdWNrIHdpdGggdGhlc2UuICovCisKKyNkZWZpbmUgTUFYU1lNICAgMTAyNCAgLyogbG9uZ2VzdCBzeW1ib2wgaW4gdGhlIGVudmlyb25tZW50ICovCisjZGVmaW5lIE1BWEpQQVRIIDEwMjQgIC8qIGxvbmdlc3QgZmlsZW5hbWUgKi8KKworI2RlZmluZSBNQVhKT0JTICA2NCAgICAvKiBpbnRlcm5hbGx5IGVuZm9yY2VkIC1qIGxpbWl0ICovCisjZGVmaW5lIE1BWEFSR0MgIDMyICAgIC8qIHdvcmRzIGluICQoSkFNU0hFTEwpICovCisKKy8qIEphbSBwcml2YXRlIGRlZmluaXRpb25zIGJlbG93LiAqLworCisjZGVmaW5lIERFQlVHX01BWCAgMTQKKworCitzdHJ1Y3QgZ2xvYnMKK3sKKyAgICBpbnQgICAgbm9leGVjOworICAgIGludCAgICBqb2JzOworICAgIGludCAgICBxdWl0cXVpY2s7CisgICAgaW50ICAgIG5ld2VzdGZpcnN0OyAgICAgICAgIC8qIGJ1aWxkIG5ld2VzdCBzb3VyY2VzIGZpcnN0ICovCisgICAgaW50ICAgIHBpcGVfYWN0aW9uOworICAgIGNoYXIgICBkZWJ1Z1sgREVCVUdfTUFYIF07CisgICAgRklMRSAqIGNtZG91dDsgICAgICAgICAgICAgIC8qIHByaW50IGNtZHMsIG5vdCBydW4gdGhlbSAqLworICAgIGxvbmcgICB0aW1lb3V0OyAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc2Vjb25kcyB0byBsaW1pdCBhY3Rpb25zIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkZWZhdWx0IDAgZm9yIG5vIGxpbWl0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgZGFydDsgICAgICAgICAgICAgICAgLyogb3V0cHV0IGJ1aWxkIGFuZCB0ZXN0IHJlc3VsdHMgZm9ybWF0dGVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBEYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgICBtYXhfYnVmOyAgICAgICAgICAgICAvKiBtYXhpbXVtIGFtb3VudCBvZiBvdXRwdXQgc2F2ZWQgZnJvbSB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGtiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKK2V4dGVybiBzdHJ1Y3QgZ2xvYnMgZ2xvYnM7CisKKyNkZWZpbmUgREVCVUdfTUFLRSAgICAgKCBnbG9icy5kZWJ1Z1sgMSBdICkgICAvKiBzaG93IGFjdGlvbnMgd2hlbiBleGVjdXRlZCAqLworI2RlZmluZSBERUJVR19NQUtFUSAgICAoIGdsb2JzLmRlYnVnWyAyIF0gKSAgIC8qIHNob3cgZXZlbiBxdWlldCBhY3Rpb25zICovCisjZGVmaW5lIERFQlVHX0VYRUMgICAgICggZ2xvYnMuZGVidWdbIDIgXSApICAgLyogc2hvdyB0ZXh0IG9mIGFjdG9ucyAqLworI2RlZmluZSBERUJVR19NQUtFUFJPRyAoIGdsb2JzLmRlYnVnWyAzIF0gKSAgIC8qIHNob3cgbWFrZTAgcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgREVCVUdfQklORCAgICAgKCBnbG9icy5kZWJ1Z1sgMyBdICkgICAvKiBzaG93IHdoZW4gZmlsZXMgYm91bmQgKi8KKworI2RlZmluZSBERUJVR19FWEVDQ01EICAoIGdsb2JzLmRlYnVnWyA0IF0gKSAgIC8qIHNob3cgZXhlY2NtZHMoKSdzIHdvcmsgKi8KKworI2RlZmluZSBERUJVR19DT01QSUxFICAoIGdsb2JzLmRlYnVnWyA1IF0gKSAgIC8qIHNob3cgcnVsZSBpbnZvY2F0aW9ucyAqLworCisjZGVmaW5lIERFQlVHX0hFQURFUiAgICggZ2xvYnMuZGVidWdbIDYgXSApICAgLyogc2hvdyByZXN1bHQgb2YgaGVhZGVyIHNjYW4gKi8KKyNkZWZpbmUgREVCVUdfQklORFNDQU4gKCBnbG9icy5kZWJ1Z1sgNiBdICkgICAvKiBzaG93IHJlc3VsdCBvZiBkaXIgc2NhbiAqLworI2RlZmluZSBERUJVR19TRUFSQ0ggICAoIGdsb2JzLmRlYnVnWyA2IF0gKSAgIC8qIHNob3cgYmluZGluZyBhdHRlbXB0cyAqLworCisjZGVmaW5lIERFQlVHX1ZBUlNFVCAgICggZ2xvYnMuZGVidWdbIDcgXSApICAgLyogc2hvdyB2YXJpYWJsZSBzZXR0aW5ncyAqLworI2RlZmluZSBERUJVR19WQVJHRVQgICAoIGdsb2JzLmRlYnVnWyA4IF0gKSAgIC8qIHNob3cgdmFyaWFibGUgZmV0Y2hlcyAqLworI2RlZmluZSBERUJVR19WQVJFWFAgICAoIGdsb2JzLmRlYnVnWyA4IF0gKSAgIC8qIHNob3cgdmFyaWFibGUgZXhwYW5zaW9ucyAqLworI2RlZmluZSBERUJVR19JRiAgICAgICAoIGdsb2JzLmRlYnVnWyA4IF0gKSAgIC8qIHNob3cgJ2lmJyBjYWxjdWxhdGlvbnMgKi8KKyNkZWZpbmUgREVCVUdfTElTVFMgICAgKCBnbG9icy5kZWJ1Z1sgOSBdICkgICAvKiBzaG93IGxpc3QgbWFuaXB1bGF0aW9uICovCisjZGVmaW5lIERFQlVHX1NDQU4gICAgICggZ2xvYnMuZGVidWdbIDkgXSApICAgLyogc2hvdyBzY2FubmVyIHRva2VucyAqLworI2RlZmluZSBERUJVR19NRU0gICAgICAoIGdsb2JzLmRlYnVnWyA5IF0gKSAgIC8qIHNob3cgbWVtb3J5IHVzZSAqLworCisjZGVmaW5lIERFQlVHX1BST0ZJTEUgICggZ2xvYnMuZGVidWdbIDEwIF0gKSAgLyogZHVtcCBydWxlIGV4ZWN1dGlvbiB0aW1lcyAqLworI2RlZmluZSBERUJVR19QQVJTRSAgICAoIGdsb2JzLmRlYnVnWyAxMSBdICkgIC8qIGRlYnVnIHBhcnNpbmcgKi8KKyNkZWZpbmUgREVCVUdfR1JBUEggICAgKCBnbG9icy5kZWJ1Z1sgMTIgXSApICAvKiBkZWJ1ZyBkZXBlbmRlbmNpZXMgKi8KKyNkZWZpbmUgREVCVUdfRkFURSAgICAgKCBnbG9icy5kZWJ1Z1sgMTMgXSApICAvKiBzaG93IGZhdGUgY2hhbmdlcyBpbiBtYWtlMCgpICovCisKKy8qIEV2ZXJ5b25lIGdldHMgdGhlIG1lbW9yeSBkZWZpbml0aW9ucy4gKi8KKyNpbmNsdWRlICJtZW0uaCIKKworLyogVGhleSBhbHNvIGdldCB0aGUgcHJvZmlsZSBmdW5jdGlvbnMuICovCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9qYW1iYXNlLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9qYW1iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1MjgyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2phbWJhc2UuYwpAQCAtMCwwICsxLDE2OTEgQEAKKy8qIEdlbmVyYXRlZCBieSBta2phbWJhc2UgZnJvbSBKYW1iYXNlICovCitjaGFyICpqYW1iYXNlW10gPSB7CisvKiBKYW1iYXNlICovCisiaWYgJChOVClcbiIsCisie1xuIiwKKyJTTEFTSCA/PSBcXFxcIDtcbiIsCisifVxuIiwKKyJTTEFTSCA/PSAvIDtcbiIsCisicnVsZSBmaW5kLXRvLXJvb3QgKCBkaXIgOiBwYXR0ZXJucyArIClcbiIsCisie1xuIiwKKyJsb2NhbCBnbG9icyA9IFsgR0xPQiAkKGRpcikgOiAkKHBhdHRlcm5zKSBdIDtcbiIsCisid2hpbGUgISAkKGdsb2JzKSAmJiAkKGRpcjpQKSAhPSAkKGRpcilcbiIsCisie1xuIiwKKyJkaXIgPSAkKGRpcjpQKSA7XG4iLAorImdsb2JzID0gWyBHTE9CICQoZGlyKSA6ICQocGF0dGVybnMpIF0gO1xuIiwKKyJ9XG4iLAorInJldHVybiAkKGdsb2JzKSA7XG4iLAorIn1cbiIsCisiLmJvb3N0LWJ1aWxkLWZpbGUgPSA7XG4iLAorIi5ib290c3RyYXAtZmlsZSA9IDtcbiIsCisiQk9PU1RfQlVJTERfUEFUSC51c2VyLXZhbHVlID0gJChCT09TVF9CVUlMRF9QQVRIKSA7XG4iLAorImlmICEgJChCT09TVF9CVUlMRF9QQVRIKSAmJiAkKFVOSVgpXG4iLAorIntcbiIsCisiQk9PU1RfQlVJTERfUEFUSCA9IC91c3Ivc2hhcmUvYm9vc3QtYnVpbGQgO1xuIiwKKyJ9XG4iLAorInJ1bGUgX3Bva2UgKCBtb2R1bGUtbmFtZSA/IDogdmFyaWFibGVzICsgOiB2YWx1ZSAqIClcbiIsCisie1xuIiwKKyJtb2R1bGUgJCg8KVxuIiwKKyJ7XG4iLAorIiQoPikgPSAkKDMpIDtcbiIsCisifVxuIiwKKyJ9XG4iLAorInJ1bGUgYm9vc3QtYnVpbGQgKCBkaXIgPyApXG4iLAorIntcbiIsCisiaWYgJCguYm9vdHN0cmFwLWZpbGUpXG4iLAorIntcbiIsCisiRUNITyBcIkVycm9yOiBJbGxlZ2FsIGF0dGVtcHQgdG8gcmUtYm9vdHN0cmFwIHRoZSBidWlsZCBzeXN0ZW0gYnkgaW52b2tpbmdcIiA7XG4iLAorIkVDSE8gO1xuIiwKKyJFQ0hPIFwiICAgJ2Jvb3N0LWJ1aWxkXCIgJChkaXIpIFwiOydcIiA7XG4iLAorIkVDSE8gO1xuIiwKKyJFWElUIFwiUGxlYXNlIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gYXQgJ2h0dHA6Ly93d3cuYm9vc3Qub3JnJy5cIiA7XG4iLAorIn1cbiIsCisiQk9PU1RfQlVJTERfUEFUSCA9ICQoZGlyOlI9JCguYm9vc3QtYnVpbGQtZmlsZTpEKSkgJChCT09TVF9CVUlMRF9QQVRIKSA7XG4iLAorIl9wb2tlIC5FTlZJUk9OIDogQk9PU1RfQlVJTERfUEFUSCA6ICQoQk9PU1RfQlVJTERfUEFUSCkgO1xuIiwKKyJsb2NhbCBib290c3RyYXAtZmlsZSA9IFsgR0xPQiAkKEJPT1NUX0JVSUxEX1BBVEgpIDogYm9vdHN0cmFwLmphbSBdIDtcbiIsCisiLmJvb3RzdHJhcC1maWxlID0gJChib290c3RyYXAtZmlsZVsxXSkgO1xuIiwKKyJpZiAhICQoLmJvb3RzdHJhcC1maWxlKVxuIiwKKyJ7XG4iLAorIkVDSE8gXCJVbmFibGUgdG8gbG9hZCBCb29zdC5CdWlsZDogY291bGQgbm90IGZpbmQgYnVpbGQgc3lzdGVtLlwiIDtcbiIsCisiRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gO1xuIiwKKyJFQ0hPIFwiJCguYm9vc3QtYnVpbGQtZmlsZSkgYXR0ZW1wdGVkIHRvIGxvYWQgdGhlIGJ1aWxkIHN5c3RlbSBieSBpbnZva2luZ1wiIDtcbiIsCisiRUNITyA7XG4iLAorIkVDSE8gXCIgICAnYm9vc3QtYnVpbGRcIiAkKGRpcikgXCI7J1wiIDtcbiIsCisiRUNITyA7XG4iLAorIkVDSE8gXCJidXQgd2Ugd2VyZSB1bmFibGUgdG8gZmluZCBcXFwiYm9vdHN0cmFwLmphbVxcXCIgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnlcIiA7XG4iLAorIkVDSE8gXCJvciBpbiBCT09TVF9CVUlMRF9QQVRIIChzZWFyY2hpbmcgXCIkKEJPT1NUX0JVSUxEX1BBVEg6Sj1cIiwgXCIpXCIpLlwiIDtcbiIsCisiRUNITyA7XG4iLAorIkVYSVQgXCJQbGVhc2UgY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBhdCAnaHR0cDovL3d3dy5ib29zdC5vcmcnLlwiIDtcbiIsCisifVxuIiwKKyJpZiBbIE1BVENIIC4qKC0tZGVidWctY29uZmlndXJhdGlvbikuKiA6ICQoQVJHVikgXVxuIiwKKyJ7XG4iLAorIkVDSE8gXCJub3RpY2U6IGxvYWRpbmcgQm9vc3QuQnVpbGQgZnJvbVwiXG4iLAorIlsgTk9STUFMSVpFX1BBVEggJCguYm9vdHN0cmFwLWZpbGU6RCkgXSA7XG4iLAorIn1cbiIsCisiaW5jbHVkZSAkKC5ib290c3RyYXAtZmlsZSkgO1xuIiwKKyJ9XG4iLAorImlmIFsgTUFUQ0ggLiooYjIpLiogOiAkKEFSR1ZbMV06QkwpIF0gXG4iLAorInx8IFsgTUFUQ0ggLiooYmphbSkuKiA6ICQoQVJHVlsxXTpCTCkgXVxuIiwKKyJ8fCAkKEJPT1NUX1JPT1QpICAgICMgQSB0ZW1wb3JhcnkgbWVhc3VyZSBzbyBKYW0gd29ya3Mgd2l0aCBCb29zdC5CdWlsZCB2MS5cbiIsCisie1xuIiwKKyJsb2NhbCBzZWFyY2gtcGF0aCA9ICQoQk9PU1RfQlVJTERfUEFUSCkgJChCT09TVF9ST09UKSA7XG4iLAorImxvY2FsIHNlbGYgPSBbIFNFTEZfUEFUSCBdIDtcbiIsCisibG9jYWwgYm9vc3QtYnVpbGQtcmVsYXRpdmUgPSAuLi8uLi9zaGFyZS9ib29zdC1idWlsZCA7XG4iLAorImxvY2FsIHNlbGYtYmFzZWQtcGF0aCA9IFsgTk9STUFMSVpFX1BBVEggJChib29zdC1idWlsZC1yZWxhdGl2ZTpSPSQoc2VsZikpIF0gO1xuIiwKKyJsb2NhbCBib29zdC1idWlsZC1maWxlcyA9XG4iLAorIlsgZmluZC10by1yb290IFsgUFdEIF0gOiBib29zdC1idWlsZC5qYW0gXVxuIiwKKyJbIEdMT0IgJChzZWxmLWJhc2VkLXBhdGgpIDogYm9vc3QtYnVpbGQuamFtIF1cbiIsCisiWyBHTE9CICQoc2VhcmNoLXBhdGgpIDogYm9vc3QtYnVpbGQuamFtIF0gO1xuIiwKKyIuYm9vc3QtYnVpbGQtZmlsZSA9ICQoYm9vc3QtYnVpbGQtZmlsZXNbMV0pIDtcbiIsCisiaWYgISAkKC5ib29zdC1idWlsZC1maWxlKVxuIiwKKyJ7XG4iLAorIkVDSE8gXCJVbmFibGUgdG8gbG9hZCBCb29zdC5CdWlsZDogY291bGQgbm90IGZpbmQgXFxcImJvb3N0LWJ1aWxkLmphbVxcXCJcIiA7XG4iLAorIkVDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDtcbiIsCisiaWYgISBbIE1BVENIIC4qKGJqYW0pLiogOiAkKEFSR1ZbMV06QkwpIF1cbiIsCisie1xuIiwKKyJFQ0hPIFwiQk9PU1RfUk9PVCBtdXN0IGJlIHNldCwgZWl0aGVyIGluIHRoZSBlbnZpcm9ubWVudCwgb3IgXCIgO1xuIiwKKyJFQ0hPIFwib24gdGhlIGNvbW1hbmQtbGluZSB3aXRoIC1zQk9PU1RfUk9PVD0uLi4sIHRvIHRoZSByb290XCIgO1xuIiwKKyJFQ0hPIFwib2YgdGhlIGJvb3N0IGluc3RhbGxhdGlvbi5cIiA7XG4iLAorIkVDSE8gO1xuIiwKKyJ9XG4iLAorIkVDSE8gXCJBdHRlbXB0ZWQgc2VhcmNoIGZyb21cIiBbIFBXRCBdIFwidXAgdG8gdGhlIHJvb3RcIiA7XG4iLAorIkVDSE8gXCJhdFwiICQoc2VsZi1iYXNlZC1wYXRoKSA7XG4iLAorIkVDSE8gXCJhbmQgaW4gdGhlc2UgZGlyZWN0b3JpZXMgZnJvbSBCT09TVF9CVUlMRF9QQVRIIGFuZCBCT09TVF9ST09UOiBcIiQoc2VhcmNoLXBhdGg6Sj1cIiwgXCIpXCIuXCIgO1xuIiwKKyJFWElUIFwiUGxlYXNlIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gYXQgJ2h0dHA6Ly93d3cuYm9vc3Qub3JnJy5cIiA7XG4iLAorIn1cbiIsCisiaWYgWyBNQVRDSCAuKigtLWRlYnVnLWNvbmZpZ3VyYXRpb24pLiogOiAkKEFSR1YpIF1cbiIsCisie1xuIiwKKyJFQ0hPIFwibm90aWNlOiBmb3VuZCBib29zdC1idWlsZC5qYW0gYXRcIlxuIiwKKyJbIE5PUk1BTElaRV9QQVRIICQoLmJvb3N0LWJ1aWxkLWZpbGUpIF0gO1xuIiwKKyJ9XG4iLAorImluY2x1ZGUgJCguYm9vc3QtYnVpbGQtZmlsZSkgO1xuIiwKKyJpZiAhICQoLmJvb3RzdHJhcC1maWxlKVxuIiwKKyJ7XG4iLAorIkVDSE8gXCJVbmFibGUgdG8gbG9hZCBCb29zdC5CdWlsZFwiIDtcbiIsCisiRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA7XG4iLAorIkVDSE8gXCJcXFwiJCguYm9vc3QtYnVpbGQtZmlsZSlcXFwiIHdhcyBmb3VuZCBieSBzZWFyY2hpbmcgZnJvbVwiIFsgUFdEIF0gXCJ1cCB0byB0aGUgcm9vdFwiIDtcbiIsCisiRUNITyBcImFuZCBpbiB0aGVzZSBkaXJlY3RvcmllcyBmcm9tIEJPT1NUX0JVSUxEX1BBVEggYW5kIEJPT1NUX1JPT1Q6IFwiJChzZWFyY2gtcGF0aDpKPVwiLCBcIilcIi5cIiA7XG4iLAorIkVDSE8gO1xuIiwKKyJFQ0hPIFwiSG93ZXZlciwgaXQgZmFpbGVkIHRvIGNhbGwgdGhlIFxcXCJib29zdC1idWlsZFxcXCIgcnVsZSB0byBpbmRpY2F0ZVwiIDtcbiIsCisiRUNITyBcInRoZSBsb2NhdGlvbiBvZiB0aGUgYnVpbGQgc3lzdGVtLlwiIDtcbiIsCisiRUNITyA7XG4iLAorIkVYSVQgXCJQbGVhc2UgY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBhdCAnaHR0cDovL3d3dy5ib29zdC5vcmcnLlwiIDtcbiIsCisifVxuIiwKKyJ9XG4iLAorImVsc2VcbiIsCisie1xuIiwKKyJpZiAkKE5UKVxuIiwKKyJ7XG4iLAorImxvY2FsIFNVUFBPUlRFRF9UT09MU0VUUyA9IFwiQk9STEFORENcIiBcIlZDN1wiIFwiVklTVUFMQ1wiIFwiVklTVUFMQzE2XCIgXCJJTlRFTENcIiBcIldBVENPTVwiXG4iLAorIlwiTUlOR1dcIiBcIkxDQ1wiIDtcbiIsCisiVE9PTFNFVCA9IFwiXCIgO1xuIiwKKyJpZiAkKEpBTV9UT09MU0VUKVxuIiwKKyJ7XG4iLAorImxvY2FsIHQgO1xuIiwKKyJmb3IgdCBpbiAkKFNVUFBPUlRFRF9UT09MU0VUUylcbiIsCisie1xuIiwKKyIkKHQpID0gJCgkKHQpOko9XCIgXCIpIDsgIyByZWNvbnN0aXR1dGUgcGF0aHMgd2l0aCBzcGFjZXMgaW4gdGhlbVxuIiwKKyJpZiAkKHQpID0gJChKQU1fVE9PTFNFVCkgeyBUT09MU0VUID0gJCh0KSA7IH1cbiIsCisifVxuIiwKKyJpZiAhICQoVE9PTFNFVClcbiIsCisie1xuIiwKKyJFQ0hPICBcIlRoZSBKQU1fVE9PTFNFVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBkZWZpbmVkIGJ1dCBpdHMgdmFsdWVcIiA7XG4iLAorIkVDSE8gIFwiaXMgaW52YWxpZCwgcGxlYXNlIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcIiA7XG4iLAorIkVDSE8gIDtcbiIsCisiZm9yIHQgaW4gJChTVVBQT1JURURfVE9PTFNFVFMpIHsgRUNITyBcIiAgXCIgJCh0KSA7IH1cbiIsCisiRVhJVCA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJpZiAhICQoVE9PTFNFVClcbiIsCisie1xuIiwKKyJpZiAkKEJDQ1JPT1QpXG4iLAorIntcbiIsCisiVE9PTFNFVCAgPSBCT1JMQU5EQyA7XG4iLAorIkJPUkxBTkRDID0gJChCQ0NST09UOko9XCIgXCIpIDtcbiIsCisifVxuIiwKKyJlbHNlIGlmICQoTVNWQylcbiIsCisie1xuIiwKKyJUT09MU0VUICAgPSBWSVNVQUxDMTYgO1xuIiwKKyJWSVNVQUxDMTYgPSAkKE1TVkM6Sj1cIiBcIikgO1xuIiwKKyJ9XG4iLAorImVsc2UgaWYgJChNU1ZDTlQpXG4iLAorIntcbiIsCisiVE9PTFNFVCA9IFZJU1VBTEMgO1xuIiwKKyJWSVNVQUxDID0gJChNU1ZDTlQ6Sj1cIiBcIikgO1xuIiwKKyJ9XG4iLAorImVsc2UgaWYgJChNU1ZDRGlyKVxuIiwKKyJ7XG4iLAorIlRPT0xTRVQgPSBWSVNVQUxDIDtcbiIsCisiVklTVUFMQyA9ICQoTVNWQ0RpcjpKPVwiIFwiKSA7XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKE1JTkdXKVxuIiwKKyJ7XG4iLAorIlRPT0xTRVQgPSBNSU5HVyA7XG4iLAorIn1cbiIsCisiZWxzZVxuIiwKKyJ7XG4iLAorIkVDSE8gIFwiSmFtIGNhbm5vdCBiZSBydW4gYmVjYXVzZSwgZWl0aGVyOlwiIDtcbiIsCisiRUNITyAgXCIgICBhLiBZb3UgZGlkbid0IHNldCBCT09TVF9ST09UIHRvIGluZGljYXRlIHRoZSByb290IG9mIHlvdXJcIiA7XG4iLAorIkVDSE8gIFwiICAgICAgQm9vc3QgaW5zdGFsbGF0aW9uLlwiIDtcbiIsCisiRUNITyAgXCIgICBiLiBZb3UgYXJlIHRyeWluZyB0byB1c2Ugc3RvY2sgSmFtIGJ1dCBkaWRuJ3QgaW5kaWNhdGUgd2hpY2hcIiA7XG4iLAorIkVDSE8gIFwiICAgICAgY29tcGlsYXRpb24gdG9vbHNldCB0byB1c2UuIFRvIGRvIHNvLCBmb2xsb3cgdGhlc2Ugc2ltcGxlXCIgO1xuIiwKKyJFQ0hPICBcIiAgICAgIGluc3RydWN0aW9uczpcIiA7XG4iLAorIkVDSE8gIDtcbiIsCisiRUNITyAgXCIgIC0gZGVmaW5lIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aXRoIHRoZVwiIDtcbiIsCisiRUNITyAgXCIgICAgYXBwcm9wcmlhdGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoaXMgbGlzdDpcIiA7XG4iLAorIkVDSE8gIDtcbiIsCisiRUNITyAgXCIgICBWYXJpYWJsZSAgICBUb29sc2V0ICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uXCIgO1xuIiwKKyJFQ0hPICA7XG4iLAorIkVDSE8gIFwiICAgQk9STEFOREMgICAgQm9ybGFuZCBDKysgICAgICAgICAgICAgICAgICBCQysrIGluc3RhbGwgcGF0aFwiIDtcbiIsCisiRUNITyAgXCIgICBWSVNVQUxDICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAgICAgICAgIFZDKysgaW5zdGFsbCBwYXRoXCIgO1xuIiwKKyJFQ0hPICBcIiAgIFZJU1VBTEMxNiAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDE2IGJpdCAgVkMrKyAxNiBiaXQgaW5zdGFsbFwiIDtcbiIsCisiRUNITyAgXCIgICBJTlRFTEMgICAgICBJbnRlbCBDL0MrKyAgICAgICAgICAgICAgICAgIElDKysgaW5zdGFsbCBwYXRoXCIgO1xuIiwKKyJFQ0hPICBcIiAgIFdBVENPTSAgICAgIFdhdGNvbSBDL0MrKyAgICAgICAgICAgICAgICAgV2F0Y29tIGluc3RhbGwgcGF0aFwiIDtcbiIsCisiRUNITyAgXCIgICBNSU5HVyAgICAgICBNaW5HVyAoZ2NjKSAgICAgICAgICAgICAgICAgIE1pbkdXIGluc3RhbGwgcGF0aFwiIDtcbiIsCisiRUNITyAgXCIgICBMQ0MgICAgICAgICBXaW4zMi1MQ0MgICAgICAgICAgICAgICAgICAgIExDQy1XaW4zMiBpbnN0YWxsIHBhdGhcIiA7XG4iLAorIkVDSE8gIDtcbiIsCisiRUNITyAgXCIgIC0gZGVmaW5lIHRoZSBKQU1fVE9PTFNFVCBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHRoZSAqbmFtZSpcIiA7XG4iLAorIkVDSE8gIFwiICAgIG9mIHRoZSB0b29sc2V0IHZhcmlhYmxlIHlvdSB3YW50IHRvIHVzZS5cIiA7XG4iLAorIkVDSE8gIDtcbiIsCisiRUNITyAgXCIgIGUuZy46ICBzZXQgVklTVUFMQz1DOlxcXFxWaXN1YWw2XCIgO1xuIiwKKyJFQ0hPICBcIiAgICAgICAgIHNldCBKQU1fVE9PTFNFVD1WSVNVQUxDXCIgO1xuIiwKKyJFWElUICA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJDUCAgICAgICAgICA/PSBjb3B5IDtcbiIsCisiUk0gICAgICAgICAgPz0gZGVsIC9mL3EgO1xuIiwKKyJTTEFTSCAgICAgICA/PSBcXFxcIDtcbiIsCisiU1VGTElCICAgICAgPz0gLmxpYiA7XG4iLAorIlNVRk9CSiAgICAgID89IC5vYmogO1xuIiwKKyJTVUZFWEUgICAgICA/PSAuZXhlIDtcbiIsCisiaWYgJChUT09MU0VUKSA9IEJPUkxBTkRDXG4iLAorIntcbiIsCisiRUNITyBcIkNvbXBpbGVyIGlzIEJvcmxhbmQgQysrXCIgO1xuIiwKKyJBUiAgICAgICAgICA/PSB0bGliIC9DIC9QNjQgO1xuIiwKKyJDQyAgICAgICAgICA/PSBiY2MzMiA7XG4iLAorIkNDRkxBR1MgICAgID89IC1xIC15IC1kIC12IC13LXBhciAtdy1jY2MgLXctcmNoIC13LXBybyAtdy1hdXMgO1xuIiwKKyJDKysgICAgICAgICA/PSBiY2MzMiA7XG4iLAorIkMrK0ZMQUdTICAgID89IC1xIC15IC1kIC12IC13LXBhciAtdy1jY2MgLXctcmNoIC13LXBybyAtdy1hdXMgLVAgO1xuIiwKKyJMSU5LICAgICAgICA/PSAkKENDKSA7XG4iLAorIkxJTktGTEFHUyAgID89ICQoQ0NGTEFHUykgO1xuIiwKKyJTVERMSUJQQVRIICA/PSAkKEJPUkxBTkRDKVxcXFxsaWIgO1xuIiwKKyJTVERIRFJTICAgICA/PSAkKEJPUkxBTkRDKVxcXFxpbmNsdWRlIDtcbiIsCisiTk9BUlNDQU4gICAgPz0gdHJ1ZSA7XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKFRPT0xTRVQpID0gVklTVUFMQzE2XG4iLAorIntcbiIsCisiRUNITyBcIkNvbXBpbGVyIGlzIE1pY3Jvc29mdCBWaXN1YWwgQysrIDE2IGJpdFwiIDtcbiIsCisiQVIgICAgICAgICAgPz0gbGliIC9ub2xvZ28gO1xuIiwKKyJDQyAgICAgICAgICA/PSBjbCAvbm9sb2dvIDtcbiIsCisiQ0NGTEFHUyAgICAgPz0gL0QgXFxcIldJTlxcXCIgO1xuIiwKKyJDKysgICAgICAgICA/PSAkKENDKSA7XG4iLAorIkMrK0ZMQUdTICAgID89ICQoQ0NGTEFHUykgO1xuIiwKKyJMSU5LICAgICAgICA/PSAkKENDKSA7XG4iLAorIkxJTktGTEFHUyAgID89ICQoQ0NGTEFHUykgO1xuIiwKKyJMSU5LTElCUyAgICA/PVxuIiwKKyJcXFwiJChWSVNVQUxDMTYpXFxcXGxpYlxcXFxtbGliY2UubGliXFxcIlxuIiwKKyJcXFwiJChWSVNVQUxDMTYpXFxcXGxpYlxcXFxvbGRuYW1lcy5saWJcXFwiXG4iLAorIjtcbiIsCisiTElOS0xJQlMgICAgPz0gO1xuIiwKKyJOT0FSU0NBTiAgICA/PSB0cnVlIDtcbiIsCisiT1BUSU0gICAgICAgPz0gXCJcIiA7XG4iLAorIlNUREhEUlMgICAgID89ICQoVklTVUFMQzE2KVxcXFxpbmNsdWRlIDtcbiIsCisiVU5ERUZGTEFHICAgPz0gXCIvdSBfXCIgO1xuIiwKKyJ9XG4iLAorImVsc2UgaWYgJChUT09MU0VUKSA9IFZJU1VBTENcbiIsCisie1xuIiwKKyJFQ0hPIFwiQ29tcGlsZXIgaXMgTWljcm9zb2Z0IFZpc3VhbCBDKytcIiA7XG4iLAorIkFSICAgICAgICAgID89IGxpYiA7XG4iLAorIkFTICAgICAgICAgID89IG1hc20zODYgO1xuIiwKKyJDQyAgICAgICAgICA/PSBjbCAvbm9sb2dvIDtcbiIsCisiQ0NGTEFHUyAgICAgPz0gXCJcIiA7XG4iLAorIkMrKyAgICAgICAgID89ICQoQ0MpIDtcbiIsCisiQysrRkxBR1MgICAgPz0gJChDQ0ZMQUdTKSA7XG4iLAorIkxJTksgICAgICAgID89IGxpbmsgL25vbG9nbyA7XG4iLAorIkxJTktGTEFHUyAgID89IFwiXCIgO1xuIiwKKyJMSU5LTElCUyAgICA/PSBcXFwiJChWSVNVQUxDKVxcXFxsaWJcXFxcYWR2YXBpMzIubGliXFxcIlxuIiwKKyJcXFwiJChWSVNVQUxDKVxcXFxsaWJcXFxcZ2RpMzIubGliXFxcIlxuIiwKKyJcXFwiJChWSVNVQUxDKVxcXFxsaWJcXFxcdXNlcjMyLmxpYlxcXCJcbiIsCisiXFxcIiQoVklTVUFMQylcXFxcbGliXFxcXGtlcm5lbDMyLmxpYlxcXCIgO1xuIiwKKyJPUFRJTSAgICAgICA/PSBcIlwiIDtcbiIsCisiU1RESERSUyAgICAgPz0gJChWSVNVQUxDKVxcXFxpbmNsdWRlIDtcbiIsCisiVU5ERUZGTEFHICAgPz0gXCIvdSBfXCIgO1xuIiwKKyJ9XG4iLAorImVsc2UgaWYgJChUT09MU0VUKSA9IFZDN1xuIiwKKyJ7XG4iLAorIkVDSE8gXCJDb21waWxlciBpcyBNaWNyb3NvZnQgVmlzdWFsIEMrKyAuTkVUXCIgO1xuIiwKKyJBUiAgICAgICAgICA/PSBsaWIgO1xuIiwKKyJBUyAgICAgICAgICA/PSBtYXNtMzg2IDtcbiIsCisiQ0MgICAgICAgICAgPz0gY2wgL25vbG9nbyA7XG4iLAorIkNDRkxBR1MgICAgID89IFwiXCIgO1xuIiwKKyJDKysgICAgICAgICA/PSAkKENDKSA7XG4iLAorIkMrK0ZMQUdTICAgID89ICQoQ0NGTEFHUykgO1xuIiwKKyJMSU5LICAgICAgICA/PSBsaW5rIC9ub2xvZ28gO1xuIiwKKyJMSU5LRkxBR1MgICA/PSBcIlwiIDtcbiIsCisiTElOS0xJQlMgICAgPz0gXFxcIiQoVklTVUFMQylcXFxcUGxhdGZvcm1TREtcXFxcbGliXFxcXGFkdmFwaTMyLmxpYlxcXCJcbiIsCisiXFxcIiQoVklTVUFMQylcXFxcUGxhdGZvcm1TREtcXFxcbGliXFxcXGdkaTMyLmxpYlxcXCJcbiIsCisiXFxcIiQoVklTVUFMQylcXFxcUGxhdGZvcm1TREtcXFxcbGliXFxcXHVzZXIzMi5saWJcXFwiXG4iLAorIlxcXCIkKFZJU1VBTEMpXFxcXFBsYXRmb3JtU0RLXFxcXGxpYlxcXFxrZXJuZWwzMi5saWJcXFwiIDtcbiIsCisiT1BUSU0gICAgICAgPz0gXCJcIiA7XG4iLAorIlNUREhEUlMgICAgID89IFxcXCIkKFZJU1VBTEMpXFxcXGluY2x1ZGVcXFwiXG4iLAorIlxcXCIkKFZJU1VBTEMpXFxcXFBsYXRmb3JtU0RLXFxcXGluY2x1ZGVcXFwiIDtcbiIsCisiVU5ERUZGTEFHICAgPz0gXCIvdSBfXCIgO1xuIiwKKyJ9XG4iLAorImVsc2UgaWYgJChUT09MU0VUKSA9IElOVEVMQ1xuIiwKKyJ7XG4iLAorIkVDSE8gXCJDb21waWxlciBpcyBJbnRlbCBDL0MrK1wiIDtcbiIsCisiaWYgISAkKFZJU1VBTEMpXG4iLAorIntcbiIsCisiRUNITyBcIkFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdXNpbmcgdGhlIEludGVsIEMrKyBjb21waWxlciwgeW91IG5lZWRcIiA7XG4iLAorIkVDSE8gXCJ0byBkZWZpbmUgdGhlIFZJU1VBTEMgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gaW5kaWNhdGUgdGhlIGxvY2F0aW9uXCIgO1xuIiwKKyJFQ0hPIFwib2YgeW91ciBWaXN1YWwgQysrIGluc3RhbGxhdGlvbi4gQWJvcnRpbmcuLlwiIDtcbiIsCisiRVhJVCA7XG4iLAorIn1cbiIsCisiQVIgICAgICAgICAgPz0gbGliIDtcbiIsCisiQVMgICAgICAgICAgPz0gbWFzbTM4NiA7XG4iLAorIkNDICAgICAgICAgID89IGljbCAvbm9sb2dvIDtcbiIsCisiQ0NGTEFHUyAgICAgPz0gXCJcIiA7XG4iLAorIkMrKyAgICAgICAgID89ICQoQ0MpIDtcbiIsCisiQysrRkxBR1MgICAgPz0gJChDQ0ZMQUdTKSA7XG4iLAorIkxJTksgICAgICAgID89IGxpbmsgL25vbG9nbyA7XG4iLAorIkxJTktGTEFHUyAgID89IFwiXCIgO1xuIiwKKyJMSU5LTElCUyAgICA/PSAkKFZJU1VBTEMpXFxcXGxpYlxcXFxhZHZhcGkzMi5saWJcbiIsCisiJChWSVNVQUxDKVxcXFxsaWJcXFxca2VybmVsMzIubGliXG4iLAorIjtcbiIsCisiT1BUSU0gICAgICAgPz0gXCJcIiA7XG4iLAorIlNUREhEUlMgICAgID89ICQoSU5URUxDKVxcaW5jbHVkZSAkKFZJU1VBTEMpXFxcXGluY2x1ZGUgO1xuIiwKKyJVTkRFRkZMQUcgICA/PSBcIi91IF9cIiA7XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKFRPT0xTRVQpID0gV0FUQ09NXG4iLAorIntcbiIsCisiRUNITyBcIkNvbXBpbGVyIGlzIFdhdGNvbSBDL0MrK1wiIDtcbiIsCisiQVIgICAgICAgICAgPz0gd2xpYiA7XG4iLAorIkNDICAgICAgICAgID89IHdjYzM4NiA7XG4iLAorIkNDRkxBR1MgICAgID89IC96cSAvRFdJTjMyIC9JJChXQVRDT00pXFxcXGggOyAjIHpxPXF1aWV0XG4iLAorIkMrKyAgICAgICAgID89IHdwcDM4NiA7XG4iLAorIkMrK0ZMQUdTICAgID89ICQoQ0NGTEFHUykgO1xuIiwKKyJDUCAgICAgICAgICA/PSBjb3B5IDtcbiIsCisiRE9UICAgICAgICAgPz0gLiA7XG4iLAorIkRPVERPVCAgICAgID89IC4uIDtcbiIsCisiTElOSyAgICAgICAgPz0gd2NsMzg2IDtcbiIsCisiTElOS0ZMQUdTICAgPz0gL3pxIDsgIyB6cT1xdWlldFxuIiwKKyJMSU5LTElCUyAgICA/PSA7XG4iLAorIk1WICAgICAgICAgID89IG1vdmUgO1xuIiwKKyJOT0FSU0NBTiAgICA/PSB0cnVlIDtcbiIsCisiT1BUSU0gICAgICAgPz0gO1xuIiwKKyJSTSAgICAgICAgICA/PSBkZWwgL2YgO1xuIiwKKyJTTEFTSCAgICAgICA/PSBcXFxcIDtcbiIsCisiU1RESERSUyAgICAgPz0gJChXQVRDT00pXFxcXGggJChXQVRDT00pXFxcXGhcXFxcbnQgO1xuIiwKKyJTVUZFWEUgICAgICA/PSAuZXhlIDtcbiIsCisiU1VGTElCICAgICAgPz0gLmxpYiA7XG4iLAorIlNVRk9CSiAgICAgID89IC5vYmogO1xuIiwKKyJVTkRFRkZMQUcgICA/PSBcIi91IF9cIiA7XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKFRPT0xTRVQpID0gTUlOR1dcbiIsCisie1xuIiwKKyJFQ0hPIFwiQ29tcGlsZXIgaXMgR0NDIHdpdGggTWluZ3dcIiA7XG4iLAorIkFSICAgICAgICAgICAgICA/PSBhciAtcnUgO1xuIiwKKyJDQyAgICAgICAgICAgICAgPz0gZ2NjIDtcbiIsCisiQ0NGTEFHUyAgICAgICAgID89IFwiXCIgO1xuIiwKKyJDKysgICAgICAgICAgICAgPz0gJChDQykgO1xuIiwKKyJDKytGTEFHUyAgICAgICAgPz0gJChDQ0ZMQUdTKSA7XG4iLAorIkxJTksgICAgICAgICAgICA/PSAkKENDKSA7XG4iLAorIkxJTktGTEFHUyAgICAgICA/PSBcIlwiIDtcbiIsCisiTElOS0xJQlMgICAgICAgID89IFwiXCIgO1xuIiwKKyJPUFRJTSAgICAgICAgICAgPz0gO1xuIiwKKyJTVUZPQkogICAgICAgICAgID0gLm8gO1xuIiwKKyJTVUZMSUIgICAgICAgICAgID0gLmEgO1xuIiwKKyJTTEFTSCAgICAgICAgICAgID0gLyA7XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKFRPT0xTRVQpID0gTENDXG4iLAorIntcbiIsCisiRUNITyBcIkNvbXBpbGVyIGlzIFdpbjMyLUxDQ1wiIDtcbiIsCisiQVIgICAgICAgICAgICAgID89IGxjY2xpYiA7XG4iLAorIkNDICAgICAgICAgICAgICA/PSBsY2MgO1xuIiwKKyJDQ0ZMQUdTICAgICAgICAgPz0gXCJcIiA7XG4iLAorIkMrKyAgICAgICAgICAgICA/PSAkKENDKSA7XG4iLAorIkMrK0ZMQUdTICAgICAgICA/PSAkKENDRkxBR1MpIDtcbiIsCisiTElOSyAgICAgICAgICAgID89IGxjY2xuayA7XG4iLAorIkxJTktGTEFHUyAgICAgICA/PSBcIlwiIDtcbiIsCisiTElOS0xJQlMgICAgICAgID89IFwiXCIgO1xuIiwKKyJPUFRJTSAgICAgICAgICAgPz0gO1xuIiwKKyJOT0FSU0NBTiAgICAgICAgID0gdHJ1ZSA7XG4iLAorIn1cbiIsCisiZWxzZVxuIiwKKyJ7XG4iLAorIkVYSVQgT24gTlQsIHNldCBCQ0NST09ULCBNU1ZDTlQsIE1JTkdXIG9yIE1TVkMgdG8gdGhlIHJvb3Qgb2YgdGhlXG4iLAorIkJvcmxhbmQgb3IgTWljcm9zb2Z0IGRpcmVjdG9yaWVzLiA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJlbHNlIGlmICQoT1MyKVxuIiwKKyJ7XG4iLAorImxvY2FsIFNVUFBPUlRFRF9UT09MU0VUUyA9IFwiRU1YXCIgXCJXQVRDT01cIiA7XG4iLAorIlRPT0xTRVQgPSBcIlwiIDtcbiIsCisiaWYgJChKQU1fVE9PTFNFVClcbiIsCisie1xuIiwKKyJsb2NhbCB0IDtcbiIsCisiZm9yIHQgaW4gJChTVVBQT1JURURfVE9PTFNFVFMpXG4iLAorIntcbiIsCisiJCh0KSA9ICQoJCh0KTpKPVwiIFwiKSA7ICMgcmVjb25zdGl0dXRlIHBhdGhzIHdpdGggc3BhY2VzIGluIHRoZW1cbiIsCisiaWYgJCh0KSA9ICQoSkFNX1RPT0xTRVQpIHsgVE9PTFNFVCA9ICQodCkgOyB9XG4iLAorIn1cbiIsCisiaWYgISAkKFRPT0xTRVQpXG4iLAorIntcbiIsCisiRUNITyAgXCJUaGUgSkFNX1RPT0xTRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZGVmaW5lZCBidXQgaXRzIHZhbHVlXCIgO1xuIiwKKyJFQ0hPICBcImlzIGludmFsaWQsIHBsZWFzZSB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmc6XCIgO1xuIiwKKyJFQ0hPICA7XG4iLAorImZvciB0IGluICQoU1VQUE9SVEVEX1RPT0xTRVRTKSB7IEVDSE8gXCIgIFwiICQodCkgOyB9XG4iLAorIkVYSVQgO1xuIiwKKyJ9XG4iLAorIn1cbiIsCisiaWYgISAkKFRPT0xTRVQpXG4iLAorIntcbiIsCisiaWYgJCh3YXRjb20pXG4iLAorIntcbiIsCisiV0FUQ09NICAgPSAkKHdhdGNvbTpKPVwiIFwiKSA7XG4iLAorIlRPT0xTRVQgID0gV0FUQ09NIDtcbiIsCisifVxuIiwKKyJlbHNlXG4iLAorIntcbiIsCisiRUNITyAgXCJKYW0gY2Fubm90IGJlIHJ1biBiZWNhdXNlIHlvdSBkaWRuJ3QgaW5kaWNhdGUgd2hpY2ggY29tcGlsYXRpb24gdG9vbHNldFwiIDtcbiIsCisiRUNITyAgXCJ0byB1c2UuIFRvIGRvIHNvLCBmb2xsb3cgdGhlc2Ugc2ltcGxlIGluc3RydWN0aW9uczpcIiA7XG4iLAorIkVDSE8gIDtcbiIsCisiRUNITyAgXCIgIC0gZGVmaW5lIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aXRoIHRoZVwiIDtcbiIsCisiRUNITyAgXCIgICAgYXBwcm9wcmlhdGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoaXMgbGlzdDpcIiA7XG4iLAorIkVDSE8gIDtcbiIsCisiRUNITyAgXCIgICBWYXJpYWJsZSAgICBUb29sc2V0ICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uXCIgO1xuIiwKKyJFQ0hPICA7XG4iLAorIkVDSE8gIFwiICAgV0FUQ09NICAgICAgV2F0Y29tIEMvQysrICAgICAgICAgICAgICAgICBXYXRjb20gaW5zdGFsbCBwYXRoXCIgO1xuIiwKKyJFQ0hPICBcIiAgIEVNWCAgICAgICAgIEVNWCAoZ2NjKSAgICAgICAgICAgICAgICAgICAgRU1YIGluc3RhbGwgcGF0aFwiIDtcbiIsCisiRUNITyAgXCIgICBWSVNVQUxBR0UgICBJQk0gVmlzdWFsIEFnZSBDL0MrKyAgICAgICAgIFZpc3VhbEFnZSBpbnN0YWxsIHBhdGhcIiA7XG4iLAorIkVDSE8gIDtcbiIsCisiRUNITyAgXCIgIC0gZGVmaW5lIHRoZSBKQU1fVE9PTFNFVCBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHRoZSAqbmFtZSpcIiA7XG4iLAorIkVDSE8gIFwiICAgIG9mIHRoZSB0b29sc2V0IHZhcmlhYmxlIHlvdSB3YW50IHRvIHVzZS5cIiA7XG4iLAorIkVDSE8gIDtcbiIsCisiRUNITyAgXCIgIGUuZy46ICBzZXQgV0FUQ09NPUM6XFxXQVRDT01cIiA7XG4iLAorIkVDSE8gIFwiICAgICAgICAgc2V0IEpBTV9UT09MU0VUPVdBVENPTVwiIDtcbiIsCisiRUNITyAgO1xuIiwKKyJFWElUICA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJSTSAgICAgICA9IGRlbCAvZiA7XG4iLAorIkNQICAgICAgID0gY29weSA7XG4iLAorIk1WICAgICAgPz0gbW92ZSA7XG4iLAorIkRPVCAgICAgPz0gLiA7XG4iLAorIkRPVERPVCAgPz0gLi4gO1xuIiwKKyJTVUZMSUIgID89IC5saWIgO1xuIiwKKyJTVUZPQkogID89IC5vYmogO1xuIiwKKyJTVUZFWEUgID89IC5leGUgO1xuIiwKKyJpZiAkKFRPT0xTRVQpID0gV0FUQ09NXG4iLAorIntcbiIsCisiQVIgICAgICAgICAgID89IHdsaWIgO1xuIiwKKyJCSU5ESVIgICAgICAgPz0gXFxcXG9zMlxcXFxhcHBzIDtcbiIsCisiQ0MgICAgICAgICAgID89IHdjYzM4NiA7XG4iLAorIkNDRkxBR1MgICAgICA/PSAvenEgL0RPUzIgL0kkKFdBVENPTSlcXFxcaCA7ICMgenE9cXVpZXRcbiIsCisiQysrICAgICAgICAgID89IHdwcDM4NiA7XG4iLAorIkMrK0ZMQUdTICAgICA/PSAkKENDRkxBR1MpIDtcbiIsCisiTElOSyAgICAgICAgID89IHdjbDM4NiA7XG4iLAorIkxJTktGTEFHUyAgICA/PSAvenEgOyAjIHpxPXF1aWV0XG4iLAorIkxJTktMSUJTICAgICA/PSA7XG4iLAorIk5PQVJTQ0FOICAgICA/PSB0cnVlIDtcbiIsCisiT1BUSU0gICAgICAgID89IDtcbiIsCisiU0xBU0ggICAgICAgID89IFxcXFwgO1xuIiwKKyJTVERIRFJTICAgICAgPz0gJChXQVRDT00pXFxcXGggO1xuIiwKKyJVTkRFRkZMQUcgICAgPz0gXCIvdSBfXCIgO1xuIiwKKyJ9XG4iLAorImVsc2UgaWYgJChUT09MU0VUKSA9IEVNWFxuIiwKKyJ7XG4iLAorIkVDSE8gXCJDb21waWxlciBpcyBHQ0MtRU1YXCIgO1xuIiwKKyJBUiAgICAgICAgICAgID89IGFyIC1ydSA7XG4iLAorIkNDICAgICAgICAgICAgPz0gZ2NjIDtcbiIsCisiQ0NGTEFHUyAgICAgICA/PSBcIlwiIDtcbiIsCisiQysrICAgICAgICAgICA/PSAkKENDKSA7XG4iLAorIkMrK0ZMQUdTICAgICAgPz0gJChDQ0ZMQUdTKSA7XG4iLAorIkxJTksgICAgICAgICAgPz0gJChDQykgO1xuIiwKKyJMSU5LRkxBR1MgICAgID89IFwiXCIgO1xuIiwKKyJMSU5LTElCUyAgICAgID89IFwiXCIgO1xuIiwKKyJPUFRJTSAgICAgICAgID89IDtcbiIsCisiU1VGT0JKICAgICAgICAgPSAubyA7XG4iLAorIlNVRkxJQiAgICAgICAgID0gLmEgO1xuIiwKKyJVTkRFRkZMQUcgICAgID89IFwiLVVcIiA7XG4iLAorIlNMQVNIICAgICAgICAgID0gLyA7XG4iLAorIn1cbiIsCisiZWxzZVxuIiwKKyJ7XG4iLAorIkVYSVQgIFwiU29ycnksIGJ1dCB0aGUgJChKQU1fVE9PTFNFVCkgdG9vbHNldCBpc24ndCBzdXBwb3J0ZWQgZm9yIG5vd1wiIDtcbiIsCisifVxuIiwKKyJ9XG4iLAorImVsc2UgaWYgJChWTVMpXG4iLAorIntcbiIsCisiQysrICAgICAgICAgPz0gY3h4IDtcbiIsCisiQysrRkxBR1MgICAgPz0gO1xuIiwKKyJDQyAgICAgICAgICA/PSBjYyA7XG4iLAorIkNDRkxBR1MgICAgID89IDtcbiIsCisiQ0hNT0QgICAgICAgPz0gc2V0IGZpbGUvcHJvdD0gO1xuIiwKKyJDUCAgICAgICAgICA/PSBjb3B5L3JlcGxhY2UgO1xuIiwKKyJDUkVMSUIgICAgICA/PSB0cnVlIDtcbiIsCisiRE9UICAgICAgICAgPz0gW10gO1xuIiwKKyJET1RET1QgICAgICA/PSBbLV0gO1xuIiwKKyJFWEVNT0RFICAgICA/PSAodzplKSA7XG4iLAorIkZJTEVNT0RFICAgID89ICh3OnIpIDtcbiIsCisiSERSUyAgICAgICAgPz0gO1xuIiwKKyJMSU5LICAgICAgICA/PSBsaW5rIDtcbiIsCisiTElOS0ZMQUdTICAgPz0gXCJcIiA7XG4iLAorIkxJTktMSUJTICAgID89IDtcbiIsCisiTUtESVIgICAgICAgPz0gY3JlYXRlL2RpciA7XG4iLAorIk1WICAgICAgICAgID89IHJlbmFtZSA7XG4iLAorIk9QVElNICAgICAgID89IFwiXCIgO1xuIiwKKyJSTSAgICAgICAgICA/PSBkZWxldGUgO1xuIiwKKyJSVU5WTVMgICAgICA/PSBtY3IgO1xuIiwKKyJTSEVMTE1PREUgICA/PSAodzplcikgO1xuIiwKKyJTTEFTSCAgICAgICA/PSAuIDtcbiIsCisiU1RESERSUyAgICAgPz0gZGVjYyRsaWJyYXJ5X2luY2x1ZGUgO1xuIiwKKyJTVUZFWEUgICAgICA/PSAuZXhlIDtcbiIsCisiU1VGTElCICAgICAgPz0gLm9sYiA7XG4iLAorIlNVRk9CSiAgICAgID89IC5vYmogO1xuIiwKKyJzd2l0Y2ggJChPUylcbiIsCisie1xuIiwKKyJjYXNlIE9QRU5WTVMgOiBDQ0ZMQUdTICA/PSAvc3RhbmQ9dmF4YyA7XG4iLAorImNhc2UgVk1TICAgICA6IExJTktMSUJTID89IHN5cyRsaWJyYXJ5OnZheGNydGwub2xiL2xpYiA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJlbHNlIGlmICQoTUFDKVxuIiwKKyJ7XG4iLAorImxvY2FsIE9QVCA7XG4iLAorIkNXICA/PSBcIntDV31cIiA7XG4iLAorIk1BQ0hEUlMgPz1cbiIsCisiXCIkKFVNQUNIRFJTKTpVbml2ZXJzYWw6SW50ZXJmYWNlczpDSW5jbHVkZXNcIlxuIiwKKyJcIiQoQ1cpOk1TTDpNU0xfQzpNU0xfQ29tbW9uOkluY2x1ZGVcIlxuIiwKKyJcIiQoQ1cpOk1TTDpNU0xfQzpNU0xfTWFjT1M6SW5jbHVkZVwiIDtcbiIsCisiTUFDTElCUyA/PVxuIiwKKyJcIiQoQ1cpOk1hY09TIFN1cHBvcnQ6VW5pdmVyc2FsOkxpYnJhcmllczpTdHViTGlicmFyaWVzOkludGVyZmFjZWxpYlwiXG4iLAorIlwiJChDVyk6TWFjT1MgU3VwcG9ydDpVbml2ZXJzYWw6TGlicmFyaWVzOlN0dWJMaWJyYXJpZXM6TWF0aGxpYlwiIDtcbiIsCisiTVBXTElCUyA/PVxuIiwKKyJcIiQoQ1cpOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOlJ1bnRpbWU6UnVudGltZSBQUEM6TVNMIE1QV0NSdW50aW1lLmxpYlwiXG4iLAorIlwiJChDVyk6TVNMOk1TTF9DOk1TTF9NYWNPUzpMaWI6UFBDOk1TTCBDLlBQQyBNUFcuTGliXCIgO1xuIiwKKyJNUFdOTExJQlMgPz1cbiIsCisiXCIkKENXKTpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpSdW50aW1lOlJ1bnRpbWUgUFBDOk1TTCBNUFdDUnVudGltZS5saWJcIlxuIiwKKyJcIiQoQ1cpOk1TTDpNU0xfQzpNU0xfTWFjT1M6TGliOlBQQzpNU0wgQy5QUEMgTVBXKE5MKS5MaWJcIiA7XG4iLAorIlNJT1VYSERSUyA/PSA7XG4iLAorIlNJT1VYTElCUyA/PVxuIiwKKyJcIiQoQ1cpOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOlJ1bnRpbWU6UnVudGltZSBQUEM6TVNMIFJ1bnRpbWVQUEMubGliXCJcbiIsCisiXCIkKENXKTpNU0w6TVNMX0M6TVNMX01hY09TOkxpYjpQUEM6TVNMIFNJT1VYLlBQQy5MaWJcIlxuIiwKKyJcIiQoQ1cpOk1TTDpNU0xfQzpNU0xfTWFjT1M6TGliOlBQQzpNU0wgQy5QUEMuTGliXCIgO1xuIiwKKyJDKysgICAgICAgICA/PSBtd2NwcGMgO1xuIiwKKyJDKytGTEFHUyAgICA/PSAtdyBvZmYgLW5vbWFwY3IgO1xuIiwKKyJDQyAgICAgICAgICA/PSBtd2NwcGMgO1xuIiwKKyJDQ0ZMQUdTICAgICA/PSAtdyBvZmYgLW5vbWFwY3IgO1xuIiwKKyJDUCAgICAgICAgICA/PSBkdXBsaWNhdGUgLXkgO1xuIiwKKyJET1QgICAgICAgICA/PSBcIjpcIiA7XG4iLAorIkRPVERPVCAgICAgID89IFwiOjpcIiA7XG4iLAorIkhEUlMgICAgICAgID89ICQoTUFDSERSUykgJChNUFdIRFJTKSA7XG4iLAorIkxJTksgICAgICAgID89IG13bGlua3BwYyA7XG4iLAorIkxJTktGTEFHUyAgID89IC1tcHd0b29sIC13YXJuIDtcbiIsCisiTElOS0xJQlMgICAgPz0gJChNQUNMSUJTKSAkKE1QV0xJQlMpIDtcbiIsCisiTUtESVIgICAgICAgPz0gbmV3Zm9sZGVyIDtcbiIsCisiTVYgICAgICAgICAgPz0gcmVuYW1lIC15IDtcbiIsCisiTk9BUlNDQU4gICAgPz0gdHJ1ZSA7XG4iLAorIk9QVElNICAgICAgID89IDtcbiIsCisiUk0gICAgICAgICAgPz0gZGVsZXRlIC15IDtcbiIsCisiU0xBU0ggICAgICAgPz0gXCI6XCIgO1xuIiwKKyJTVERIRFJTICAgICA/PSA7XG4iLAorIlNVRkxJQiAgICAgID89IC5saWIgO1xuIiwKKyJTVUZPQkogICAgICA/PSAubyA7XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKE9TKSA9IEJFT1MgJiYgJChNRVRST1dFUktTKVxuIiwKKyJ7XG4iLAorIkFSICAgICAgICAgID89IG13bGQgLXhtbCAtbyA7XG4iLAorIkJJTkRJUiAgICAgID89IC9ib290L2FwcHMgO1xuIiwKKyJDQyAgICAgICAgICA/PSBtd2NjIDtcbiIsCisiQ0NGTEFHUyAgICAgPz0gLW5vc3lzcGF0aCA7XG4iLAorIkMrKyAgICAgICAgID89ICQoQ0MpIDtcbiIsCisiQysrRkxBR1MgICAgPz0gLW5vc3lzcGF0aCA7XG4iLAorIkZPUlRSQU4gICAgID89IFwiXCIgO1xuIiwKKyJMSUJESVIgICAgICA/PSAvYm9vdC9kZXZlbG9wL2xpYnJhcmllcyA7XG4iLAorIkxJTksgICAgICAgID89IG13bGQgO1xuIiwKKyJMSU5LRkxBR1MgICA/PSBcIlwiIDtcbiIsCisiTUFORElSICAgICAgPz0gL2Jvb3QvZG9jdW1lbnRhdGlvbi9cIlNoZWxsIFRvb2xzXCIvSFRNTCA7XG4iLAorIk5PQVJTQ0FOICAgID89IHRydWUgO1xuIiwKKyJTVERIRFJTICAgICA/PSAvYm9vdC9kZXZlbG9wL2hlYWRlcnMvcG9zaXggO1xuIiwKKyJ9XG4iLAorImVsc2UgaWYgJChPUykgPSBCRU9TXG4iLAorIntcbiIsCisiQklORElSICAgICAgPz0gL2Jvb3QvYXBwcyA7XG4iLAorIkNDICAgICAgICAgID89IGdjYyA7XG4iLAorIkMrKyAgICAgICAgID89ICQoQ0MpIDtcbiIsCisiRk9SVFJBTiAgICAgPz0gXCJcIiA7XG4iLAorIkxJQkRJUiAgICAgID89IC9ib290L2RldmVsb3AvbGlicmFyaWVzIDtcbiIsCisiTElOSyAgICAgICAgPz0gZ2NjIDtcbiIsCisiTElOS0xJQlMgICAgPz0gLWxuZXQgO1xuIiwKKyJOT0FSU0NBTiAgICA/PSB0cnVlIDtcbiIsCisiU1RESERSUyAgICAgPz0gL2Jvb3QvZGV2ZWxvcC9oZWFkZXJzL3Bvc2l4IDtcbiIsCisifVxuIiwKKyJlbHNlIGlmICQoVU5JWClcbiIsCisie1xuIiwKKyJzd2l0Y2ggJChPUylcbiIsCisie1xuIiwKKyJjYXNlIEFJWCA6XG4iLAorIkxJTktMSUJTICAgID89IC1sYnNkIDtcbiIsCisiY2FzZSBBTUlHQSA6XG4iLAorIkNDICAgICAgICAgID89IGdjYyA7XG4iLAorIllBQ0MgICAgICAgID89IFwiYmlzb24gLXlcIiA7XG4iLAorImNhc2UgQ1lHV0lOIDpcbiIsCisiQ0MgICAgICAgICAgPz0gZ2NjIDtcbiIsCisiQ0NGTEFHUyAgICAgKz0gLURfX2N5Z3dpbl9fIDtcbiIsCisiTEVYICAgICAgICAgPz0gZmxleCA7XG4iLAorIlJBTkxJQiAgICAgID89IFwiXCIgO1xuIiwKKyJTVUZFWEUgICAgICA/PSAuZXhlIDtcbiIsCisiWUFDQyAgICAgICAgPz0gXCJiaXNvbiAteVwiIDtcbiIsCisiY2FzZSBER1VYIDpcbiIsCisiUkFOTElCICAgICAgPz0gXCJcIiA7XG4iLAorIlJFTE9DQVRFICAgID89IHRydWUgO1xuIiwKKyJjYXNlIEhQVVggOlxuIiwKKyJZQUNDICAgICAgICA9IDtcbiIsCisiQ0ZMQUdTICAgICAgKz0gLUFlIDtcbiIsCisiQ0NGTEFHUyAgICAgKz0gLUFlIDtcbiIsCisiUkFOTElCICAgICAgPz0gXCJcIiA7XG4iLAorImNhc2UgSU5URVJJWCA6XG4iLAorIkNDICAgICAgICAgID89IGdjYyA7XG4iLAorIlJBTkxJQiAgICAgID89IFwiXCIgO1xuIiwKKyJjYXNlIElSSVggOlxuIiwKKyJSQU5MSUIgICAgICA/PSBcIlwiIDtcbiIsCisiY2FzZSBNUEVJWCA6XG4iLAorIkNDICAgICAgICAgID89IGdjYyA7XG4iLAorIkMrKyAgICAgICAgID89IGdjYyA7XG4iLAorIkNDRkxBR1MgICAgICs9IC1EX1BPU0lYX1NPVVJDRSA7XG4iLAorIkhEUlMgICAgICAgICs9IC91c3IvaW5jbHVkZSA7XG4iLAorIlJBTkxJQiAgICAgID89IFwiXCIgO1xuIiwKKyJOT0FSU0NBTiAgICA/PSB0cnVlIDtcbiIsCisiTk9BUlVQREFURSAgPz0gdHJ1ZSA7XG4iLAorImNhc2UgTVZTIDpcbiIsCisiUkFOTElCICAgICAgPz0gXCJcIiA7XG4iLAorImNhc2UgTkVYVCA6XG4iLAorIkFSICAgICAgICAgID89IGxpYnRvb2wgLW8gO1xuIiwKKyJSQU5MSUIgICAgICA/PSBcIlwiIDtcbiIsCisiY2FzZSBNQUNPU1ggOlxuIiwKKyJBUiAgICAgICAgICA/PSBsaWJ0b29sIC1vIDtcbiIsCisiQysrICAgICAgICAgPz0gYysrIDtcbiIsCisiTUFORElSICAgICAgPz0gL3Vzci9sb2NhbC9zaGFyZS9tYW4gO1xuIiwKKyJSQU5MSUIgICAgICA/PSBcIlwiIDtcbiIsCisiY2FzZSBOQ1IgOlxuIiwKKyJSQU5MSUIgICAgICA/PSBcIlwiIDtcbiIsCisiY2FzZSBQVFggOlxuIiwKKyJSQU5MSUIgICAgICA/PSBcIlwiIDtcbiIsCisiY2FzZSBRTlggOlxuIiwKKyJBUiAgICAgICAgICA/PSB3bGliIDtcbiIsCisiQ0MgICAgICAgICAgPz0gY2MgO1xuIiwKKyJDQ0ZMQUdTICAgICA/PSAtUSA7ICMgcXVpZXRcbiIsCisiQysrICAgICAgICAgPz0gJChDQykgO1xuIiwKKyJDKytGTEFHUyAgICA/PSAtUSA7ICMgcXVpZXRcbiIsCisiTElOSyAgICAgICAgPz0gJChDQykgO1xuIiwKKyJMSU5LRkxBR1MgICA/PSAtUSA7ICMgcXVpZXRcbiIsCisiTk9BUlNDQU4gICAgPz0gdHJ1ZSA7XG4iLAorIlJBTkxJQiAgICAgID89IFwiXCIgO1xuIiwKKyJjYXNlIFNDTyA6XG4iLAorIlJBTkxJQiAgICAgID89IFwiXCIgO1xuIiwKKyJSRUxPQ0FURSAgICA/PSB0cnVlIDtcbiIsCisiY2FzZSBTSU5JWCA6XG4iLAorIlJBTkxJQiAgICAgID89IFwiXCIgO1xuIiwKKyJjYXNlIFNPTEFSSVMgOlxuIiwKKyJSQU5MSUIgICAgICA/PSBcIlwiIDtcbiIsCisiQVIgICAgICAgICAgPz0gXCIvdXNyL2Njcy9iaW4vYXIgcnVcIiA7XG4iLAorImNhc2UgVU5JQ09TIDpcbiIsCisiTk9BUlNDQU4gICAgPz0gdHJ1ZSA7XG4iLAorIk9QVElNICAgICAgID89IC1PMCA7XG4iLAorImNhc2UgVU5JWFdBUkUgOlxuIiwKKyJSQU5MSUIgICAgICA/PSBcIlwiIDtcbiIsCisiUkVMT0NBVEUgICAgPz0gdHJ1ZSA7XG4iLAorIn1cbiIsCisiQ0NGTEFHUyAgICAgPz0gO1xuIiwKKyJDKytGTEFHUyAgICA/PSAkKENDRkxBR1MpIDtcbiIsCisiQ0hNT0QgICAgICAgPz0gY2htb2QgO1xuIiwKKyJDSEdSUCAgICAgICA/PSBjaGdycCA7XG4iLAorIkNIT1dOICAgICAgID89IGNob3duIDtcbiIsCisiTEVYICAgICAgICAgPz0gbGV4IDtcbiIsCisiTElOS0ZMQUdTICAgPz0gJChDQ0ZMQUdTKSA7XG4iLAorIkxJTktMSUJTICAgID89IDtcbiIsCisiT1BUSU0gICAgICAgPz0gLU8gO1xuIiwKKyJSQU5MSUIgICAgICA/PSByYW5saWIgO1xuIiwKKyJZQUNDICAgICAgICA/PSB5YWNjIDtcbiIsCisiWUFDQ0ZJTEVTICAgPz0geS50YWIgO1xuIiwKKyJZQUNDRkxBR1MgICA/PSAtZCA7XG4iLAorIn1cbiIsCisiQVIgICAgICAgICAgPz0gYXIgcnUgO1xuIiwKKyJBUyAgICAgICAgICA/PSBhcyA7XG4iLAorIkFTRkxBR1MgICAgID89IDtcbiIsCisiQVdLICAgICAgICAgPz0gYXdrIDtcbiIsCisiQklORElSICAgICAgPz0gL3Vzci9sb2NhbC9iaW4gO1xuIiwKKyJDKysgICAgICAgICA/PSBjYyA7XG4iLAorIkMrK0ZMQUdTICAgID89IDtcbiIsCisiQ0MgICAgICAgICAgPz0gY2MgO1xuIiwKKyJDQ0ZMQUdTICAgICA/PSA7XG4iLAorIkNQICAgICAgICAgID89IGNwIC1mIDtcbiIsCisiQ1JFTElCICAgICAgPz0gO1xuIiwKKyJET1QgICAgICAgICA/PSAuIDtcbiIsCisiRE9URE9UICAgICAgPz0gLi4gO1xuIiwKKyJFWEVNT0RFICAgICA/PSA3MTEgO1xuIiwKKyJGSUxFTU9ERSAgICA/PSA2NDQgO1xuIiwKKyJGT1JUUkFOICAgICA/PSBmNzcgO1xuIiwKKyJGT1JUUkFORkxBR1MgPz0gO1xuIiwKKyJIRFJTICAgICAgICA/PSA7XG4iLAorIklOU1RBTExHUklTVCA/PSBpbnN0YWxsZWQgO1xuIiwKKyJKQU1GSUxFICAgICA/PSBKYW1maWxlIDtcbiIsCisiSkFNUlVMRVMgICAgPz0gSmFtcnVsZXMgO1xuIiwKKyJMRVggICAgICAgICA/PSA7XG4iLAorIkxJQkRJUiAgICAgID89IC91c3IvbG9jYWwvbGliIDtcbiIsCisiTElOSyAgICAgICAgPz0gJChDQykgO1xuIiwKKyJMSU5LRkxBR1MgICA/PSA7XG4iLAorIkxJTktMSUJTICAgID89IDtcbiIsCisiTE4gICAgICAgICAgPz0gbG4gO1xuIiwKKyJNQU5ESVIgICAgICA/PSAvdXNyL2xvY2FsL21hbiA7XG4iLAorIk1LRElSICAgICAgID89IG1rZGlyIDtcbiIsCisiTVYgICAgICAgICAgPz0gbXYgLWYgO1xuIiwKKyJPUFRJTSAgICAgICA/PSA7XG4iLAorIlJDUCAgICAgICAgID89IHJjcCA7XG4iLAorIlJNICAgICAgICAgID89IHJtIC1mIDtcbiIsCisiUlNIICAgICAgICAgPz0gcnNoIDtcbiIsCisiU0VEICAgICAgICAgPz0gc2VkIDtcbiIsCisiU0hFTExIRUFERVIgPz0gXCIjIS9iaW4vc2hcIiA7XG4iLAorIlNIRUxMTU9ERSAgID89IDc1NSA7XG4iLAorIlNMQVNIICAgICAgID89IC8gO1xuIiwKKyJTVERIRFJTICAgICA/PSAvdXNyL2luY2x1ZGUgO1xuIiwKKyJTVUZFWEUgICAgICA/PSBcIlwiIDtcbiIsCisiU1VGTElCICAgICAgPz0gLmEgO1xuIiwKKyJTVUZPQkogICAgICA/PSAubyA7XG4iLAorIlVOREVGRkxBRyAgID89IFwiLXUgX1wiIDtcbiIsCisiWUFDQyAgICAgICAgPz0gO1xuIiwKKyJZQUNDRklMRVMgICA/PSA7XG4iLAorIllBQ0NGTEFHUyAgID89IDtcbiIsCisiSERSUEFUVEVSTiA9XG4iLAorIlwiXlsgICAgIF0qI1sgICAgXSppbmNsdWRlWyAgXSpbPFxcXCJdKFteXFxcIj5dKilbXFxcIj5dLiokXCIgO1xuIiwKKyJPU0ZVTEwgPSAkKE9TKSQoT1NWRVIpJChPU1BMQVQpICQoT1MpJChPU1BMQVQpICQoT1MpJChPU1ZFUikgJChPUykgO1xuIiwKKyJERVBFTkRTIGFsbCA6IHNoZWxsIGZpbGVzIGxpYiBleGUgb2JqIDtcbiIsCisiREVQRU5EUyBhbGwgc2hlbGwgZmlsZXMgbGliIGV4ZSBvYmogOiBmaXJzdCA7XG4iLAorIk5PVEZJTEUgYWxsIGZpcnN0IHNoZWxsIGZpbGVzIGxpYiBleGUgb2JqIGRpcnMgY2xlYW4gdW5pbnN0YWxsIDtcbiIsCisiQUxXQVlTIGNsZWFuIHVuaW5zdGFsbCA7XG4iLAorInJ1bGUgQXNcbiIsCisie1xuIiwKKyJERVBFTkRTICQoPCkgOiAkKD4pIDtcbiIsCisiQVNGTEFHUyBvbiAkKDwpICs9ICQoQVNGTEFHUykgJChTVUJESVJBU0ZMQUdTKSA7XG4iLAorIn1cbiIsCisicnVsZSBCdWxrXG4iLAorIntcbiIsCisibG9jYWwgaSA7XG4iLAorImZvciBpIGluICQoPilcbiIsCisie1xuIiwKKyJGaWxlICQoaTpEPSQoPCkpIDogJChpKSA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJydWxlIENjXG4iLAorIntcbiIsCisibG9jYWwgX2ggO1xuIiwKKyJERVBFTkRTICQoPCkgOiAkKD4pIDtcbiIsCisiQ0NGTEFHUyBvbiAkKDwpICs9ICQoQ0NGTEFHUykgJChTVUJESVJDQ0ZMQUdTKSA7XG4iLAorImlmICQoUkVMT0NBVEUpXG4iLAorIntcbiIsCisiQ2NNdiAkKDwpIDogJCg+KSA7XG4iLAorIn1cbiIsCisiX2ggPSAkKFNFQVJDSF9TT1VSQ0UpICQoSERSUykgJChTVUJESVJIRFJTKSA7XG4iLAorImlmICQoVk1TKSAmJiAkKF9oKVxuIiwKKyJ7XG4iLAorIlNMQVNISU5DIG9uICQoPCkgPSBcIi9pbmM9KFwiICQoX2hbMV0pICwkKF9oWzItXSkgXCIpXCIgO1xuIiwKKyJ9XG4iLAorImVsc2UgaWYgJChNQUMpICYmICQoX2gpXG4iLAorIntcbiIsCisibG9jYWwgX2kgX2ogO1xuIiwKKyJfaiA9ICQoX2hbMV0pIDtcbiIsCisiZm9yIF9pIGluICQoX2hbMi1dKVxuIiwKKyJ7XG4iLAorIl9qID0gJChfaiksJChfaSkgO1xuIiwKKyJ9XG4iLAorIk1BQ0lOQyBvbiAkKDwpID0gXFxcIiQoX2opXFxcIiA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJydWxlIEMrK1xuIiwKKyJ7XG4iLAorImxvY2FsIF9oIDtcbiIsCisiREVQRU5EUyAkKDwpIDogJCg+KSA7XG4iLAorIkMrK0ZMQUdTIG9uICQoPCkgKz0gJChDKytGTEFHUykgJChTVUJESVJDKytGTEFHUykgO1xuIiwKKyJpZiAkKFJFTE9DQVRFKVxuIiwKKyJ7XG4iLAorIkNjTXYgJCg8KSA6ICQoPikgO1xuIiwKKyJ9XG4iLAorIl9oID0gJChTRUFSQ0hfU09VUkNFKSAkKEhEUlMpICQoU1VCRElSSERSUykgO1xuIiwKKyJpZiAkKFZNUykgJiYgJChfaClcbiIsCisie1xuIiwKKyJTTEFTSElOQyBvbiAkKDwpID0gXCIvaW5jPShcIiAkKF9oWzFdKSAsJChfaFsyLV0pIFwiKVwiIDtcbiIsCisifVxuIiwKKyJlbHNlIGlmICQoTUFDKSAmJiAkKF9oKVxuIiwKKyJ7XG4iLAorImxvY2FsIF9pIF9qIDtcbiIsCisiX2ogPSAkKF9oWzFdKSA7XG4iLAorImZvciBfaSBpbiAkKF9oWzItXSlcbiIsCisie1xuIiwKKyJfaiA9ICQoX2opLCQoX2kpIDtcbiIsCisifVxuIiwKKyJNQUNJTkMgb24gJCg8KSA9IFxcXCIkKF9qKVxcXCIgO1xuIiwKKyJ9XG4iLAorIn1cbiIsCisicnVsZSBDaG1vZFxuIiwKKyJ7XG4iLAorImlmICQoQ0hNT0QpIHsgQ2htb2QxICQoPCkgOyB9XG4iLAorIn1cbiIsCisicnVsZSBGaWxlXG4iLAorIntcbiIsCisiREVQRU5EUyBmaWxlcyA6ICQoPCkgO1xuIiwKKyJERVBFTkRTICQoPCkgOiAkKD4pIDtcbiIsCisiU0VBUkNIIG9uICQoPikgPSAkKFNFQVJDSF9TT1VSQ0UpIDtcbiIsCisiTU9ERSBvbiAkKDwpID0gJChGSUxFTU9ERSkgO1xuIiwKKyJDaG1vZCAkKDwpIDtcbiIsCisifVxuIiwKKyJydWxlIEZvcnRyYW5cbiIsCisie1xuIiwKKyJERVBFTkRTICQoPCkgOiAkKD4pIDtcbiIsCisifVxuIiwKKyJydWxlIEdlbkZpbGVcbiIsCisie1xuIiwKKyJsb2NhbCBfdCA9IFsgRkdyaXN0U291cmNlRmlsZXMgJCg8KSBdIDtcbiIsCisibG9jYWwgX3MgPSBbIEZBcHBlbmRTdWZmaXggJCg+WzFdKSA6ICQoU1VGRVhFKSBdIDtcbiIsCisiRGVwZW5kcyAkKF90KSA6ICQoX3MpICQoPlsyLV0pIDtcbiIsCisiR2VuRmlsZTEgJChfdCkgOiAkKF9zKSAkKD5bMi1dKSA7XG4iLAorIkNsZWFuIGNsZWFuIDogJChfdCkgO1xuIiwKKyJ9XG4iLAorInJ1bGUgR2VuRmlsZTFcbiIsCisie1xuIiwKKyJNYWtlTG9jYXRlICQoPCkgOiAkKExPQ0FURV9TT1VSQ0UpIDtcbiIsCisiU0VBUkNIIG9uICQoPikgPSAkKFNFQVJDSF9TT1VSQ0UpIDtcbiIsCisifVxuIiwKKyJydWxlIEhhcmRMaW5rXG4iLAorIntcbiIsCisiREVQRU5EUyBmaWxlcyA6ICQoPCkgO1xuIiwKKyJERVBFTkRTICQoPCkgOiAkKD4pIDtcbiIsCisiU0VBUkNIIG9uICQoPikgPSAkKFNFQVJDSF9TT1VSQ0UpIDtcbiIsCisifVxuIiwKKyJydWxlIEhkck1hY3JvRmlsZVxuIiwKKyJ7XG4iLAorIkhEUk1BQ1JPICQoPCkgO1xuIiwKKyJ9XG4iLAorInJ1bGUgSGRyUnVsZVxuIiwKKyJ7XG4iLAorImxvY2FsIHMgO1xuIiwKKyJpZiAkKEhEUkdSSVNUKVxuIiwKKyJ7XG4iLAorInMgPSAkKD46Rz0kKEhEUkdSSVNUKSkgO1xuIiwKKyJ9IGVsc2Uge1xuIiwKKyJzID0gJCg+KSA7XG4iLAorIn1cbiIsCisiSU5DTFVERVMgJCg8KSA6ICQocykgO1xuIiwKKyJTRUFSQ0ggb24gJChzKSA9ICQoSERSU0VBUkNIKSA7XG4iLAorIk5PQ0FSRSAkKHMpIDtcbiIsCisiSERSU0VBUkNIIG9uICQocykgPSAkKEhEUlNFQVJDSCkgO1xuIiwKKyJIRFJTQ0FOIG9uICQocykgPSAkKEhEUlNDQU4pIDtcbiIsCisiSERSUlVMRSBvbiAkKHMpID0gJChIRFJSVUxFKSA7XG4iLAorIkhEUkdSSVNUIG9uICQocykgPSAkKEhEUkdSSVNUKSA7XG4iLAorIn1cbiIsCisicnVsZSBJbnN0YWxsSW50b1xuIiwKKyJ7XG4iLAorImxvY2FsIGkgdCA7XG4iLAorInQgPSAkKD46Rz0kKElOU1RBTExHUklTVCkpIDtcbiIsCisiRGVwZW5kcyBpbnN0YWxsIDogJCh0KSA7XG4iLAorIkNsZWFuIHVuaW5zdGFsbCA6ICQodCkgO1xuIiwKKyJTRUFSQ0ggb24gJCg+KSA9ICQoU0VBUkNIX1NPVVJDRSkgO1xuIiwKKyJNYWtlTG9jYXRlICQodCkgOiAkKDwpIDtcbiIsCisiZm9yIGkgaW4gJCg+KVxuIiwKKyJ7XG4iLAorImxvY2FsIHR0ID0gJChpOkc9JChJTlNUQUxMR1JJU1QpKSA7XG4iLAorIkRlcGVuZHMgJCh0dCkgOiAkKGkpIDtcbiIsCisiSW5zdGFsbCAkKHR0KSA6ICQoaSkgO1xuIiwKKyJDaG1vZCAkKHR0KSA7XG4iLAorImlmICQoT1dORVIpICYmICQoQ0hPV04pXG4iLAorIntcbiIsCisiQ2hvd24gJCh0dCkgO1xuIiwKKyJPV05FUiBvbiAkKHR0KSA9ICQoT1dORVIpIDtcbiIsCisifVxuIiwKKyJpZiAkKEdST1VQKSAmJiAkKENIR1JQKVxuIiwKKyJ7XG4iLAorIkNoZ3JwICQodHQpIDtcbiIsCisiR1JPVVAgb24gJCh0dCkgPSAkKEdST1VQKSA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJ9XG4iLAorInJ1bGUgSW5zdGFsbEJpblxuIiwKKyJ7XG4iLAorImxvY2FsIF90ID0gWyBGQXBwZW5kU3VmZml4ICQoPikgOiAkKFNVRkVYRSkgXSA7XG4iLAorIkluc3RhbGxJbnRvICQoPCkgOiAkKF90KSA7XG4iLAorIk1PREUgb24gJChfdDpHPWluc3RhbGxlZCkgPSAkKEVYRU1PREUpIDtcbiIsCisifVxuIiwKKyJydWxlIEluc3RhbGxGaWxlXG4iLAorIntcbiIsCisiSW5zdGFsbEludG8gJCg8KSA6ICQoPikgO1xuIiwKKyJNT0RFIG9uICQoPjpHPWluc3RhbGxlZCkgPSAkKEZJTEVNT0RFKSA7XG4iLAorIn1cbiIsCisicnVsZSBJbnN0YWxsTGliXG4iLAorIntcbiIsCisiSW5zdGFsbEludG8gJCg8KSA6ICQoPikgO1xuIiwKKyJNT0RFIG9uICQoPjpHPWluc3RhbGxlZCkgPSAkKEZJTEVNT0RFKSA7XG4iLAorIn1cbiIsCisicnVsZSBJbnN0YWxsTWFuXG4iLAorIntcbiIsCisibG9jYWwgaSBzIGQgO1xuIiwKKyJmb3IgaSBpbiAkKD4pXG4iLAorIntcbiIsCisic3dpdGNoICQoaTpTKVxuIiwKKyJ7XG4iLAorImNhc2UgLjEgOiBzID0gMSA7IGNhc2UgLjIgOiBzID0gMiA7IGNhc2UgLjMgOiBzID0gMyA7XG4iLAorImNhc2UgLjQgOiBzID0gNCA7IGNhc2UgLjUgOiBzID0gNSA7IGNhc2UgLjYgOiBzID0gNiA7XG4iLAorImNhc2UgLjcgOiBzID0gNyA7IGNhc2UgLjggOiBzID0gOCA7IGNhc2UgLmwgOiBzID0gbCA7XG4iLAorImNhc2UgLm4gOiBzID0gbiA7IGNhc2UgLm1hbiA6IHMgPSAxIDtcbiIsCisifVxuIiwKKyJkID0gbWFuJChzKSA7XG4iLAorIkluc3RhbGxJbnRvICQoZDpSPSQoPCkpIDogJChpKSA7XG4iLAorIn1cbiIsCisiTU9ERSBvbiAkKD46Rz1pbnN0YWxsZWQpID0gJChGSUxFTU9ERSkgO1xuIiwKKyJ9XG4iLAorInJ1bGUgSW5zdGFsbFNoZWxsXG4iLAorIntcbiIsCisiSW5zdGFsbEludG8gJCg8KSA6ICQoPikgO1xuIiwKKyJNT0RFIG9uICQoPjpHPWluc3RhbGxlZCkgPSAkKFNIRUxMTU9ERSkgO1xuIiwKKyJ9XG4iLAorInJ1bGUgTGV4XG4iLAorIntcbiIsCisiTGV4TXYgJCg8KSA6ICQoPikgO1xuIiwKKyJERVBFTkRTICQoPCkgOiAkKD4pIDtcbiIsCisiTWFrZUxvY2F0ZSAkKDwpIDogJChMT0NBVEVfU09VUkNFKSA7XG4iLAorIkNsZWFuIGNsZWFuIDogJCg8KSA7XG4iLAorIn1cbiIsCisicnVsZSBMaWJyYXJ5XG4iLAorIntcbiIsCisiTGlicmFyeUZyb21PYmplY3RzICQoPCkgOiAkKD46Uz0kKFNVRk9CSikpIDtcbiIsCisiT2JqZWN0cyAkKD4pIDtcbiIsCisifVxuIiwKKyJydWxlIExpYnJhcnlGcm9tT2JqZWN0c1xuIiwKKyJ7XG4iLAorImxvY2FsIF9pIF9sIF9zIDtcbiIsCisiX3MgPSBbIEZHcmlzdEZpbGVzICQoPikgXSA7XG4iLAorIl9sID0gJCg8OlM9JChTVUZMSUIpKSA7XG4iLAorImlmICQoS0VFUE9CSlMpXG4iLAorIntcbiIsCisiREVQRU5EUyBvYmogOiAkKF9zKSA7XG4iLAorIn1cbiIsCisiZWxzZVxuIiwKKyJ7XG4iLAorIkRFUEVORFMgbGliIDogJChfbCkgO1xuIiwKKyJ9XG4iLAorImlmICEgJChfbDpEKVxuIiwKKyJ7XG4iLAorIk1ha2VMb2NhdGUgJChfbCkgJChfbCkoJChfczpCUykpIDogJChMT0NBVEVfVEFSR0VUKSA7XG4iLAorIn1cbiIsCisiaWYgJChOT0FSU0NBTilcbiIsCisie1xuIiwKKyJERVBFTkRTICQoX2wpIDogJChfcykgO1xuIiwKKyJ9XG4iLAorImVsc2VcbiIsCisie1xuIiwKKyJERVBFTkRTICQoX2wpIDogJChfbCkoJChfczpCUykpIDtcbiIsCisiZm9yIF9pIGluICQoX3MpXG4iLAorIntcbiIsCisiREVQRU5EUyAkKF9sKSgkKF9pOkJTKSkgOiAkKF9pKSA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJDbGVhbiBjbGVhbiA6ICQoX2wpIDtcbiIsCisiaWYgJChDUkVMSUIpIHsgQ3JlTGliICQoX2wpIDogJChfc1sxXSkgOyB9XG4iLAorIkFyY2hpdmUgJChfbCkgOiAkKF9zKSA7XG4iLAorImlmICQoUkFOTElCKSB7IFJhbmxpYiAkKF9sKSA7IH1cbiIsCisiaWYgISAoICQoTk9BUlNDQU4pIHx8ICQoS0VFUE9CSlMpICkgeyBSbVRlbXBzICQoX2wpIDogJChfcykgOyB9XG4iLAorIn1cbiIsCisicnVsZSBMaW5rXG4iLAorIntcbiIsCisiTU9ERSBvbiAkKDwpID0gJChFWEVNT0RFKSA7XG4iLAorIkNobW9kICQoPCkgO1xuIiwKKyJ9XG4iLAorInJ1bGUgTGlua0xpYnJhcmllc1xuIiwKKyJ7XG4iLAorImxvY2FsIF90ID0gWyBGQXBwZW5kU3VmZml4ICQoPCkgOiAkKFNVRkVYRSkgXSA7XG4iLAorIkRFUEVORFMgJChfdCkgOiAkKD46Uz0kKFNVRkxJQikpIDtcbiIsCisiTkVFRExJQlMgb24gJChfdCkgKz0gJCg+OlM9JChTVUZMSUIpKSA7XG4iLAorIn1cbiIsCisicnVsZSBNYWluXG4iLAorIntcbiIsCisiTWFpbkZyb21PYmplY3RzICQoPCkgOiAkKD46Uz0kKFNVRk9CSikpIDtcbiIsCisiT2JqZWN0cyAkKD4pIDtcbiIsCisifVxuIiwKKyJydWxlIE1haW5Gcm9tT2JqZWN0c1xuIiwKKyJ7XG4iLAorImxvY2FsIF9zIF90IDtcbiIsCisiX3MgPSBbIEZHcmlzdEZpbGVzICQoPikgXSA7XG4iLAorIl90ID0gWyBGQXBwZW5kU3VmZml4ICQoPCkgOiAkKFNVRkVYRSkgXSA7XG4iLAorImlmICQoX3QpICE9ICQoPClcbiIsCisie1xuIiwKKyJERVBFTkRTICQoPCkgOiAkKF90KSA7XG4iLAorIk5PVEZJTEUgJCg8KSA7XG4iLAorIn1cbiIsCisiREVQRU5EUyBleGUgOiAkKF90KSA7XG4iLAorIkRFUEVORFMgJChfdCkgOiAkKF9zKSA7XG4iLAorIk1ha2VMb2NhdGUgJChfdCkgOiAkKExPQ0FURV9UQVJHRVQpIDtcbiIsCisiQ2xlYW4gY2xlYW4gOiAkKF90KSA7XG4iLAorIkxpbmsgJChfdCkgOiAkKF9zKSA7XG4iLAorIn1cbiIsCisicnVsZSBNYWtlTG9jYXRlXG4iLAorIntcbiIsCisiaWYgJCg+KVxuIiwKKyJ7XG4iLAorIkxPQ0FURSBvbiAkKDwpID0gJCg+KSA7XG4iLAorIkRlcGVuZHMgJCg8KSA6ICQoPlsxXSkgO1xuIiwKKyJNa0RpciAkKD5bMV0pIDtcbiIsCisifVxuIiwKKyJ9XG4iLAorInJ1bGUgTWtEaXJcbiIsCisie1xuIiwKKyJOT1VQREFURSAkKDwpIDtcbiIsCisiaWYgJCg8KSAhPSAkKERPVCkgJiYgISAkKCQoPCktbWtkaXIpXG4iLAorIntcbiIsCisibG9jYWwgcyA7XG4iLAorIiQoPCktbWtkaXIgPSB0cnVlIDtcbiIsCisiTWtEaXIxICQoPCkgO1xuIiwKKyJEZXBlbmRzIGRpcnMgOiAkKDwpIDtcbiIsCisicyA9ICQoPDpQKSA7XG4iLAorImlmICQoTlQpXG4iLAorIntcbiIsCisic3dpdGNoICQocylcbiIsCisie1xuIiwKKyJjYXNlICo6ICAgOiBzID0gO1xuIiwKKyJjYXNlICo6XFxcXCA6IHMgPSA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJpZiAkKHMpICYmICQocykgIT0gJCg8KVxuIiwKKyJ7XG4iLAorIkRlcGVuZHMgJCg8KSA6ICQocykgO1xuIiwKKyJNa0RpciAkKHMpIDtcbiIsCisifVxuIiwKKyJlbHNlIGlmICQocylcbiIsCisie1xuIiwKKyJOT1RGSUxFICQocykgO1xuIiwKKyJ9XG4iLAorIn1cbiIsCisifVxuIiwKKyJydWxlIE9iamVjdFxuIiwKKyJ7XG4iLAorImxvY2FsIGggO1xuIiwKKyJDbGVhbiBjbGVhbiA6ICQoPCkgO1xuIiwKKyJNYWtlTG9jYXRlICQoPCkgOiAkKExPQ0FURV9UQVJHRVQpIDtcbiIsCisiU0VBUkNIIG9uICQoPikgPSAkKFNFQVJDSF9TT1VSQ0UpIDtcbiIsCisiSERSUyBvbiAkKDwpID0gJChTRUFSQ0hfU09VUkNFKSAkKEhEUlMpICQoU1VCRElSSERSUykgO1xuIiwKKyJpZiAkKFNFQVJDSF9TT1VSQ0UpXG4iLAorIntcbiIsCisiaCA9ICQoU0VBUkNIX1NPVVJDRSkgO1xuIiwKKyJ9XG4iLAorImVsc2VcbiIsCisie1xuIiwKKyJoID0gXCJcIiA7XG4iLAorIn1cbiIsCisiSERSUlVMRSBvbiAkKD4pID0gSGRyUnVsZSA7XG4iLAorIkhEUlNDQU4gb24gJCg+KSA9ICQoSERSUEFUVEVSTikgO1xuIiwKKyJIRFJTRUFSQ0ggb24gJCg+KSA9ICQoSERSUykgJChTVUJESVJIRFJTKSAkKGgpICQoU1RESERSUykgO1xuIiwKKyJIRFJHUklTVCBvbiAkKD4pID0gJChIRFJHUklTVCkgO1xuIiwKKyJzd2l0Y2ggJCg+OlMpXG4iLAorIntcbiIsCisiY2FzZSAuYXNtIDogQXMgJCg8KSA6ICQoPikgO1xuIiwKKyJjYXNlIC5jIDogICBDYyAkKDwpIDogJCg+KSA7XG4iLAorImNhc2UgLkMgOiAgIEMrKyAkKDwpIDogJCg+KSA7XG4iLAorImNhc2UgLmNjIDogIEMrKyAkKDwpIDogJCg+KSA7XG4iLAorImNhc2UgLmNwcCA6IEMrKyAkKDwpIDogJCg+KSA7XG4iLAorImNhc2UgLmYgOiAgIEZvcnRyYW4gJCg8KSA6ICQoPikgO1xuIiwKKyJjYXNlIC5sIDogICBDYyAkKDwpIDogJCg8OlM9LmMpIDtcbiIsCisiTGV4ICQoPDpTPS5jKSA6ICQoPikgO1xuIiwKKyJjYXNlIC5zIDogICBBcyAkKDwpIDogJCg+KSA7XG4iLAorImNhc2UgLnkgOiAgIENjICQoPCkgOiAkKDw6Uz0uYykgO1xuIiwKKyJZYWNjICQoPDpTPS5jKSA6ICQoPikgO1xuIiwKKyJjYXNlICogOiAgICBVc2VyT2JqZWN0ICQoPCkgOiAkKD4pIDtcbiIsCisifVxuIiwKKyJ9XG4iLAorInJ1bGUgT2JqZWN0Q2NGbGFnc1xuIiwKKyJ7XG4iLAorIkNDRkxBR1Mgb24gWyBGR3Jpc3RGaWxlcyAkKDw6Uz0kKFNVRk9CSikpIF0gKz0gJCg+KSA7XG4iLAorIn1cbiIsCisicnVsZSBPYmplY3RDKytGbGFnc1xuIiwKKyJ7XG4iLAorIkMrK0ZMQUdTIG9uIFsgRkdyaXN0RmlsZXMgJCg8OlM9JChTVUZPQkopKSBdICs9ICQoPikgO1xuIiwKKyJ9XG4iLAorInJ1bGUgT2JqZWN0SGRyc1xuIiwKKyJ7XG4iLAorIkhEUlMgb24gWyBGR3Jpc3RGaWxlcyAkKDw6Uz0kKFNVRk9CSikpIF0gKz0gJCg+KSA7XG4iLAorIn1cbiIsCisicnVsZSBPYmplY3RzXG4iLAorIntcbiIsCisibG9jYWwgX2kgO1xuIiwKKyJmb3IgX2kgaW4gWyBGR3Jpc3RGaWxlcyAkKDwpIF1cbiIsCisie1xuIiwKKyJPYmplY3QgJChfaTpTPSQoU1VGT0JKKSkgOiAkKF9pKSA7XG4iLAorIkRFUEVORFMgb2JqIDogJChfaTpTPSQoU1VGT0JKKSkgO1xuIiwKKyJ9XG4iLAorIn1cbiIsCisicnVsZSBSbVRlbXBzXG4iLAorIntcbiIsCisiVEVNUE9SQVJZICQoPikgO1xuIiwKKyJ9XG4iLAorInJ1bGUgU2V0dWlkXG4iLAorIntcbiIsCisiTU9ERSBvbiBbIEZBcHBlbmRTdWZmaXggJCg8KSA6ICQoU1VGRVhFKSBdID0gNDcxMSA7XG4iLAorIn1cbiIsCisicnVsZSBTaGVsbFxuIiwKKyJ7XG4iLAorIkRFUEVORFMgc2hlbGwgOiAkKDwpIDtcbiIsCisiREVQRU5EUyAkKDwpIDogJCg+KSA7XG4iLAorIlNFQVJDSCBvbiAkKD4pID0gJChTRUFSQ0hfU09VUkNFKSA7XG4iLAorIk1PREUgb24gJCg8KSA9ICQoU0hFTExNT0RFKSA7XG4iLAorIkNsZWFuIGNsZWFuIDogJCg8KSA7XG4iLAorIkNobW9kICQoPCkgO1xuIiwKKyJ9XG4iLAorInJ1bGUgU3ViRGlyXG4iLAorIntcbiIsCisibG9jYWwgX3IgX3MgO1xuIiwKKyJpZiAhICQoJCg8WzFdKSlcbiIsCisie1xuIiwKKyJpZiAhICQoPFsxXSlcbiIsCisie1xuIiwKKyJFWElUIFN1YkRpciBzeW50YXggZXJyb3IgO1xuIiwKKyJ9XG4iLAorIiQoPFsxXSkgPSBbIEZTdWJEaXIgJCg8WzItXSkgXSA7XG4iLAorIn1cbiIsCisiaWYgISAkKCQoPFsxXSktaW5jbHVkZWQpXG4iLAorIntcbiIsCisiJCg8WzFdKS1pbmNsdWRlZCA9IFRSVUUgO1xuIiwKKyJfciA9ICQoJCg8WzFdKVJVTEVTKSA7XG4iLAorImlmICEgJChfcilcbiIsCisie1xuIiwKKyJfciA9ICQoSkFNUlVMRVM6Uj0kKCQoPFsxXSkpKSA7XG4iLAorIn1cbiIsCisiaW5jbHVkZSAkKF9yKSA7XG4iLAorIn1cbiIsCisiX3MgPSBbIEZEaXJOYW1lICQoPFsyLV0pIF0gO1xuIiwKKyJTVUJESVIgPSAkKF9zOlI9JCgkKDxbMV0pKSkgO1xuIiwKKyJTVUJESVJfVE9LRU5TID0gJCg8WzItXSkgO1xuIiwKKyJTRUFSQ0hfU09VUkNFID0gJChTVUJESVIpIDtcbiIsCisiTE9DQVRFX1NPVVJDRSA9ICQoQUxMX0xPQ0FURV9UQVJHRVQpICQoU1VCRElSKSA7XG4iLAorIkxPQ0FURV9UQVJHRVQgPSAkKEFMTF9MT0NBVEVfVEFSR0VUKSAkKFNVQkRJUikgO1xuIiwKKyJTT1VSQ0VfR1JJU1QgPSBbIEZHcmlzdCAkKDxbMi1dKSBdIDtcbiIsCisiU1VCRElSQ0NGTEFHUyA9IDtcbiIsCisiU1VCRElSQysrRkxBR1MgPSA7XG4iLAorIlNVQkRJUkhEUlMgPSA7XG4iLAorIn1cbiIsCisicnVsZSBTdWJEaXJDY0ZsYWdzXG4iLAorIntcbiIsCisiU1VCRElSQ0NGTEFHUyArPSAkKDwpIDtcbiIsCisifVxuIiwKKyJydWxlIFN1YkRpckMrK0ZsYWdzXG4iLAorIntcbiIsCisiU1VCRElSQysrRkxBR1MgKz0gJCg8KSA7XG4iLAorIn1cbiIsCisicnVsZSBTdWJEaXJIZHJzXG4iLAorIntcbiIsCisiU1VCRElSSERSUyArPSAkKDwpIDtcbiIsCisifVxuIiwKKyJydWxlIFN1YkluY2x1ZGVcbiIsCisie1xuIiwKKyJsb2NhbCBfcyA7XG4iLAorImlmICEgJCgkKDxbMV0pKVxuIiwKKyJ7XG4iLAorIkVYSVQgVG9wIGxldmVsIG9mIHNvdXJjZSB0cmVlIGhhcyBub3QgYmVlbiBzZXQgd2l0aCAkKDxbMV0pIDtcbiIsCisifVxuIiwKKyJfcyA9IFsgRkRpck5hbWUgJCg8WzItXSkgXSA7XG4iLAorImluY2x1ZGUgJChKQU1GSUxFOkQ9JChfcyk6Uj0kKCQoPFsxXSkpKSA7XG4iLAorIn1cbiIsCisicnVsZSBVbmRlZmluZXNcbiIsCisie1xuIiwKKyJVTkRFRlMgb24gWyBGQXBwZW5kU3VmZml4ICQoPCkgOiAkKFNVRkVYRSkgXSArPSAkKFVOREVGRkxBRykkKD4pIDtcbiIsCisifVxuIiwKKyJydWxlIFVzZXJPYmplY3RcbiIsCisie1xuIiwKKyJFWElUIFwiVW5rbm93biBzdWZmaXggb25cIiAkKD4pIFwiLSBzZWUgVXNlck9iamVjdCBydWxlIGluIEphbWZpbGUoNSkuXCIgO1xuIiwKKyJ9XG4iLAorInJ1bGUgWWFjY1xuIiwKKyJ7XG4iLAorImxvY2FsIF9oIDtcbiIsCisiX2ggPSAkKDw6QlM9LmgpIDtcbiIsCisiTWFrZUxvY2F0ZSAkKDwpICQoX2gpIDogJChMT0NBVEVfU09VUkNFKSA7XG4iLAorImlmICQoWUFDQylcbiIsCisie1xuIiwKKyJERVBFTkRTICQoPCkgJChfaCkgOiAkKD4pIDtcbiIsCisiWWFjYzEgJCg8KSAkKF9oKSA6ICQoPikgO1xuIiwKKyJZYWNjTXYgJCg8KSAkKF9oKSA6ICQoPikgO1xuIiwKKyJDbGVhbiBjbGVhbiA6ICQoPCkgJChfaCkgO1xuIiwKKyJ9XG4iLAorIklOQ0xVREVTICQoPCkgOiAkKF9oKSA7XG4iLAorIn1cbiIsCisicnVsZSBGR3Jpc3RcbiIsCisie1xuIiwKKyJsb2NhbCBfZyBfaSA7XG4iLAorIl9nID0gJCg8WzFdKSA7XG4iLAorImZvciBfaSBpbiAkKDxbMi1dKVxuIiwKKyJ7XG4iLAorIl9nID0gJChfZykhJChfaSkgO1xuIiwKKyJ9XG4iLAorInJldHVybiAkKF9nKSA7XG4iLAorIn1cbiIsCisicnVsZSBGR3Jpc3RGaWxlc1xuIiwKKyJ7XG4iLAorImlmICEgJChTT1VSQ0VfR1JJU1QpXG4iLAorIntcbiIsCisicmV0dXJuICQoPCkgO1xuIiwKKyJ9XG4iLAorImVsc2VcbiIsCisie1xuIiwKKyJyZXR1cm4gJCg8Okc9JChTT1VSQ0VfR1JJU1QpKSA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJydWxlIEZHcmlzdFNvdXJjZUZpbGVzXG4iLAorIntcbiIsCisiaWYgISAkKFNPVVJDRV9HUklTVClcbiIsCisie1xuIiwKKyJyZXR1cm4gJCg8KSA7XG4iLAorIn1cbiIsCisiZWxzZVxuIiwKKyJ7XG4iLAorImxvY2FsIF9pIF9vIDtcbiIsCisiZm9yIF9pIGluICQoPClcbiIsCisie1xuIiwKKyJzd2l0Y2ggJChfaSlcbiIsCisie1xuIiwKKyJjYXNlICouaCA6ICBfbyArPSAkKF9pKSA7XG4iLAorImNhc2UgKiA6ICAgIF9vICs9ICQoX2k6Rz0kKFNPVVJDRV9HUklTVCkpIDtcbiIsCisifVxuIiwKKyJ9XG4iLAorInJldHVybiAkKF9vKSA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJydWxlIEZDb25jYXRcbiIsCisie1xuIiwKKyJsb2NhbCBfdCBfciA7XG4iLAorIiQoX3IpID0gJCg8WzFdKSA7XG4iLAorImZvciBfdCBpbiAkKDxbMi1dKVxuIiwKKyJ7XG4iLAorIiQoX3IpID0gJChfcikkKF90KSA7XG4iLAorIn1cbiIsCisicmV0dXJuICQoX3IpIDtcbiIsCisifVxuIiwKKyJydWxlIEZTdWJEaXJcbiIsCisie1xuIiwKKyJsb2NhbCBfaSBfZCA7XG4iLAorImlmICEgJCg8WzFdKVxuIiwKKyJ7XG4iLAorIl9kID0gJChET1QpIDtcbiIsCisifVxuIiwKKyJlbHNlXG4iLAorIntcbiIsCisiX2QgPSAkKERPVERPVCkgO1xuIiwKKyJmb3IgX2kgaW4gJCg8WzItXSlcbiIsCisie1xuIiwKKyJfZCA9ICQoX2Q6Uj0kKERPVERPVCkpIDtcbiIsCisifVxuIiwKKyJ9XG4iLAorInJldHVybiAkKF9kKSA7XG4iLAorIn1cbiIsCisicnVsZSBGRGlyTmFtZVxuIiwKKyJ7XG4iLAorImxvY2FsIF9zIF9pIDtcbiIsCisiaWYgISAkKDwpXG4iLAorIntcbiIsCisiX3MgPSAkKERPVCkgO1xuIiwKKyJ9XG4iLAorImVsc2UgaWYgJChWTVMpXG4iLAorIntcbiIsCisic3dpdGNoICQoPFsxXSlcbiIsCisie1xuIiwKKyJjYXNlICo6KiA6IF9zID0gJCg8WzFdKSA7XG4iLAorImNhc2UgXFxcXFsqXFxcXF0gOiBfcyA9ICQoPFsxXSkgO1xuIiwKKyJjYXNlICogOiBfcyA9IFsuJCg8WzFdKV0gO1xuIiwKKyJ9XG4iLAorImZvciBfaSBpbiBbLiQoPFsyLV0pXVxuIiwKKyJ7XG4iLAorIl9zID0gJChfaTpSPSQoX3MpKSA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJlbHNlIGlmICQoTUFDKVxuIiwKKyJ7XG4iLAorIl9zID0gJChET1QpIDtcbiIsCisiZm9yIF9pIGluICQoPClcbiIsCisie1xuIiwKKyJfcyA9ICQoX2k6Uj0kKF9zKSkgO1xuIiwKKyJ9XG4iLAorIn1cbiIsCisiZWxzZVxuIiwKKyJ7XG4iLAorIl9zID0gJCg8WzFdKSA7XG4iLAorImZvciBfaSBpbiAkKDxbMi1dKVxuIiwKKyJ7XG4iLAorIl9zID0gJChfaTpSPSQoX3MpKSA7XG4iLAorIn1cbiIsCisifVxuIiwKKyJyZXR1cm4gJChfcykgO1xuIiwKKyJ9XG4iLAorInJ1bGUgX21ha2VDb21tb25cbiIsCisie1xuIiwKKyJpZiAkKCQoPClbMV0pICYmICQoJCg8KVsxXSkgPSAkKCQoPilbMV0pXG4iLAorIntcbiIsCisiJCg8KSA9ICQoJCg8KVsyLV0pIDtcbiIsCisiJCg+KSA9ICQoJCg+KVsyLV0pIDtcbiIsCisiX21ha2VDb21tb24gJCg8KSA6ICQoPikgO1xuIiwKKyJ9XG4iLAorIn1cbiIsCisicnVsZSBGUmVsUGF0aFxuIiwKKyJ7XG4iLAorImxvY2FsIF9sIF9yIDtcbiIsCisiX2wgPSAkKDwpIDtcbiIsCisiX3IgPSAkKD4pIDtcbiIsCisiX21ha2VDb21tb24gX2wgOiBfciA7XG4iLAorIl9sID0gWyBGU3ViRGlyICQoX2wpIF0gO1xuIiwKKyJfciA9IFsgRkRpck5hbWUgJChfcikgXSA7XG4iLAorImlmICQoX3IpID0gJChET1QpIHtcbiIsCisicmV0dXJuICQoX2wpIDtcbiIsCisifSBlbHNlIHtcbiIsCisicmV0dXJuICQoX3I6Uj0kKF9sKSkgO1xuIiwKKyJ9XG4iLAorIn1cbiIsCisicnVsZSBGQXBwZW5kU3VmZml4XG4iLAorIntcbiIsCisiaWYgJCg+KVxuIiwKKyJ7XG4iLAorImxvY2FsIF9pIF9vIDtcbiIsCisiZm9yIF9pIGluICQoPClcbiIsCisie1xuIiwKKyJpZiAkKF9pOlMpXG4iLAorIntcbiIsCisiX28gKz0gJChfaSkgO1xuIiwKKyJ9XG4iLAorImVsc2VcbiIsCisie1xuIiwKKyJfbyArPSAkKF9pOlM9JCg+KSkgO1xuIiwKKyJ9XG4iLAorIn1cbiIsCisicmV0dXJuICQoX28pIDtcbiIsCisifVxuIiwKKyJlbHNlXG4iLAorIntcbiIsCisicmV0dXJuICQoPCkgO1xuIiwKKyJ9XG4iLAorIn1cbiIsCisicnVsZSB1bm1ha2VEaXJcbiIsCisie1xuIiwKKyJpZiAkKD5bMV06RCkgJiYgJCg+WzFdOkQpICE9ICQoPlsxXSkgJiYgJCg+WzFdOkQpICE9IFxcXFxcXFxcXG4iLAorIntcbiIsCisidW5tYWtlRGlyICQoPCkgOiAkKD5bMV06RCkgJCg+WzFdOkJTKSAkKD5bMi1dKSA7XG4iLAorIn1cbiIsCisiZWxzZVxuIiwKKyJ7XG4iLAorIiQoPCkgPSAkKD4pIDtcbiIsCisifVxuIiwKKyJ9XG4iLAorInJ1bGUgRkNvbnZlcnRUb1NsYXNoZXNcbiIsCisie1xuIiwKKyJsb2NhbCBfZCwgX3MsIF9pIDtcbiIsCisidW5tYWtlRGlyIF9kIDogJCg8KSA7XG4iLAorIl9zID0gJChfZFsxXSkgO1xuIiwKKyJmb3IgX2kgaW4gJChfZFsyLV0pXG4iLAorIntcbiIsCisiX3MgPSAkKF9zKS8kKF9pKSA7XG4iLAorIn1cbiIsCisicmV0dXJuICQoX3MpIDtcbiIsCisifVxuIiwKKyJhY3Rpb25zIHVwZGF0ZWQgdG9nZXRoZXIgcGllY2VtZWFsIEFyY2hpdmVcbiIsCisie1xuIiwKKyIkKEFSKSAkKDwpICQoPilcbiIsCisifVxuIiwKKyJhY3Rpb25zIEFzXG4iLAorIntcbiIsCisiJChBUykgJChBU0ZMQUdTKSAtSSQoSERSUykgLW8gJCg8KSAkKD4pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBDKytcbiIsCisie1xuIiwKKyIkKEMrKykgLWMgJChDKytGTEFHUykgJChPUFRJTSkgLUkkKEhEUlMpIC1vICQoPCkgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgQ2NcbiIsCisie1xuIiwKKyIkKENDKSAtYyAkKENDRkxBR1MpICQoT1BUSU0pIC1JJChIRFJTKSAtbyAkKDwpICQoPilcbiIsCisifVxuIiwKKyJhY3Rpb25zIENoZ3JwXG4iLAorIntcbiIsCisiJChDSEdSUCkgJChHUk9VUCkgJCg8KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgQ2htb2QxXG4iLAorIntcbiIsCisiJChDSE1PRCkgJChNT0RFKSAkKDwpXG4iLAorIn1cbiIsCisiYWN0aW9ucyBDaG93blxuIiwKKyJ7XG4iLAorIiQoQ0hPV04pICQoT1dORVIpICQoPClcbiIsCisifVxuIiwKKyJhY3Rpb25zIHBpZWNlbWVhbCB0b2dldGhlciBleGlzdGluZyBDbGVhblxuIiwKKyJ7XG4iLAorIiQoUk0pICQoPilcbiIsCisifVxuIiwKKyJhY3Rpb25zIEZpbGVcbiIsCisie1xuIiwKKyIkKENQKSAkKD4pICQoPClcbiIsCisifVxuIiwKKyJhY3Rpb25zIEdlbkZpbGUxXG4iLAorIntcbiIsCisiJCg+WzFdKSAkKDwpICQoPlsyLV0pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBGb3J0cmFuXG4iLAorIntcbiIsCisiJChGT1JUUkFOKSAkKEZPUlRSQU5GTEFHUykgLW8gJCg8KSAkKD4pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBIYXJkTGlua1xuIiwKKyJ7XG4iLAorIiQoUk0pICQoPCkgJiYgJChMTikgJCg+KSAkKDwpXG4iLAorIn1cbiIsCisiYWN0aW9ucyBJbnN0YWxsXG4iLAorIntcbiIsCisiJChDUCkgJCg+KSAkKDwpXG4iLAorIn1cbiIsCisiYWN0aW9ucyBMZXhcbiIsCisie1xuIiwKKyIkKExFWCkgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgTGV4TXZcbiIsCisie1xuIiwKKyIkKE1WKSBsZXgueXkuYyAkKDwpXG4iLAorIn1cbiIsCisiYWN0aW9ucyBMaW5rIGJpbmQgTkVFRExJQlNcbiIsCisie1xuIiwKKyIkKExJTkspICQoTElOS0ZMQUdTKSAtbyAkKDwpICQoVU5ERUZTKSAkKD4pICQoTkVFRExJQlMpICQoTElOS0xJQlMpXG4iLAorIn1cbiIsCisiYWN0aW9ucyBNa0RpcjFcbiIsCisie1xuIiwKKyIkKE1LRElSKSAkKDwpXG4iLAorIn1cbiIsCisiYWN0aW9ucyB0b2dldGhlciBSYW5saWJcbiIsCisie1xuIiwKKyIkKFJBTkxJQikgJCg8KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgcXVpZXRseSB1cGRhdGVkIHBpZWNlbWVhbCB0b2dldGhlciBSbVRlbXBzXG4iLAorIntcbiIsCisiJChSTSkgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgU2hlbGxcbiIsCisie1xuIiwKKyIkKEFXSykgJ1xuIiwKKyJOUiA9PSAxIHsgcHJpbnQgXCIkKFNIRUxMSEVBREVSKVwiIH1cbiIsCisiTlIgPT0gMSAmJiAvXlsjOl0vIHsgbmV4dCB9XG4iLAorIi9eIyMvIHsgbmV4dCB9XG4iLAorInsgcHJpbnQgfVxuIiwKKyInIDwgJCg+KSA+ICQoPClcbiIsCisifVxuIiwKKyJhY3Rpb25zIFlhY2MxXG4iLAorIntcbiIsCisiJChZQUNDKSAkKFlBQ0NGTEFHUykgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgWWFjY012XG4iLAorIntcbiIsCisiJChNVikgJChZQUNDRklMRVMpLmMgJCg8WzFdKVxuIiwKKyIkKE1WKSAkKFlBQ0NGSUxFUykuaCAkKDxbMl0pXG4iLAorIn1cbiIsCisiaWYgJChSRUxPQ0FURSlcbiIsCisie1xuIiwKKyJhY3Rpb25zIEMrK1xuIiwKKyJ7XG4iLAorIiQoQysrKSAtYyAkKEMrK0ZMQUdTKSAkKE9QVElNKSAtSSQoSERSUykgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgQ2NcbiIsCisie1xuIiwKKyIkKENDKSAtYyAkKENDRkxBR1MpICQoT1BUSU0pIC1JJChIRFJTKSAkKD4pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBpZ25vcmUgQ2NNdlxuIiwKKyJ7XG4iLAorIlsgJCg8KSAhPSAkKD46QlM9JChTVUZPQkopKSBdICYmICQoTVYpICQoPjpCUz0kKFNVRk9CSikpICQoPClcbiIsCisifVxuIiwKKyJ9XG4iLAorImlmICQoTk9BUlVQREFURSlcbiIsCisie1xuIiwKKyJhY3Rpb25zIEFyY2hpdmVcbiIsCisie1xuIiwKKyIkKEFSKSAkKDwpICQoPilcbiIsCisifVxuIiwKKyJ9XG4iLAorImlmICQoTlQpXG4iLAorIntcbiIsCisiaWYgJChUT09MU0VUKSA9IFZJU1VBTEMgfHwgJChUT09MU0VUKSA9IFZDNyB8fCAkKFRPT0xTRVQpID0gSU5URUxDXG4iLAorIntcbiIsCisiYWN0aW9ucyB1cGRhdGVkIHRvZ2V0aGVyIHBpZWNlbWVhbCBBcmNoaXZlXG4iLAorIntcbiIsCisiaWYgZXhpc3QgJCg8KSBzZXQgXyQoPDpCKV89JCg8KVxuIiwKKyIkKEFSKSAvb3V0OiQoPCkgJV8kKDw6QilfJSAkKD4pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBBc1xuIiwKKyJ7XG4iLAorIiQoQVMpIC9NbCAvcCAvdiAvdzIgJCg+KSAkKDwpICxudWwsbnVsO1xuIiwKKyJ9XG4iLAorImFjdGlvbnMgQ2NcbiIsCisie1xuIiwKKyIkKENDKSAvYyAkKENDRkxBR1MpICQoT1BUSU0pIC9GbyQoPCkgL0kkKEhEUlMpIC9JJChTVERIRFJTKSAkKD4pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBDKytcbiIsCisie1xuIiwKKyIkKEMrKykgL2MgJChDKytGTEFHUykgJChPUFRJTSkgL0ZvJCg8KSAvSSQoSERSUykgL0kkKFNUREhEUlMpIC9UcCQoPilcbiIsCisifVxuIiwKKyJhY3Rpb25zIExpbmsgYmluZCBORUVETElCU1xuIiwKKyJ7XG4iLAorIiQoTElOSykgJChMSU5LRkxBR1MpIC9vdXQ6JCg8KSAkKFVOREVGUykgJCg+KSAkKE5FRURMSUJTKSAkKExJTktMSUJTKVxuIiwKKyJ9XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKFRPT0xTRVQpID0gVklTVUFMQzE2XG4iLAorIntcbiIsCisiYWN0aW9ucyB1cGRhdGVkIHRvZ2V0aGVyIHBpZWNlbWVhbCBBcmNoaXZlXG4iLAorIntcbiIsCisiJChBUikgJCg8KSAtKyQoPilcbiIsCisifVxuIiwKKyJhY3Rpb25zIENjXG4iLAorIntcbiIsCisiJChDQykgL2MgJChDQ0ZMQUdTKSAkKE9QVElNKSAvRm8kKDwpIC9JJChIRFJTKSAkKD4pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBDKytcbiIsCisie1xuIiwKKyIkKEMrKykgL2MgJChDKytGTEFHUykgJChPUFRJTSkgL0ZvJCg8KSAvSSQoSERSUykgL1RwJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgTGluayBiaW5kIE5FRURMSUJTXG4iLAorIntcbiIsCisiJChMSU5LKSAkKExJTktGTEFHUykgL291dDokKDwpICQoVU5ERUZTKSAkKD4pICQoTkVFRExJQlMpICQoTElOS0xJQlMpXG4iLAorIn1cbiIsCisifVxuIiwKKyJlbHNlIGlmICQoVE9PTFNFVCkgPSBCT1JMQU5EQ1xuIiwKKyJ7XG4iLAorImFjdGlvbnMgdXBkYXRlZCB0b2dldGhlciBwaWVjZW1lYWwgQXJjaGl2ZVxuIiwKKyJ7XG4iLAorIiQoQVIpICQoPCkgLSskKD4pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBMaW5rIGJpbmQgTkVFRExJQlNcbiIsCisie1xuIiwKKyIkKExJTkspIC1lJCg8KSAkKExJTktGTEFHUykgJChVTkRFRlMpIC1MJChMSU5LTElCUykgJChORUVETElCUykgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgQysrXG4iLAorIntcbiIsCisiJChDKyspIC1jICQoQysrRkxBR1MpICQoT1BUSU0pIC1JJChIRFJTKSAtbyQoPCkgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgQ2NcbiIsCisie1xuIiwKKyIkKENDKSAtYyAkKENDRkxBR1MpICQoT1BUSU0pIC1JJChIRFJTKSAtbyQoPCkgJCg+KVxuIiwKKyJ9XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKFRPT0xTRVQpID0gTUlOR1dcbiIsCisie1xuIiwKKyJhY3Rpb25zIHRvZ2V0aGVyIHBpZWNlbWVhbCBBcmNoaXZlXG4iLAorIntcbiIsCisiJChBUikgJCg8KSAkKD46VClcbiIsCisifVxuIiwKKyJhY3Rpb25zIENjXG4iLAorIntcbiIsCisiJChDQykgLWMgJChDQ0ZMQUdTKSAkKE9QVElNKSAtSSQoSERSUykgLW8kKDwpICQoPilcbiIsCisifVxuIiwKKyJhY3Rpb25zIEMrK1xuIiwKKyJ7XG4iLAorIiQoQysrKSAtYyAkKEMrK0ZMQUdTKSAkKE9QVElNKSAtSSQoSERSUykgLW8kKDwpICQoPilcbiIsCisifVxuIiwKKyJ9XG4iLAorImVsc2UgaWYgJChUT09MU0VUKSA9IFdBVENPTVxuIiwKKyJ7XG4iLAorImFjdGlvbnMgdG9nZXRoZXIgcGllY2VtZWFsIEFyY2hpdmVcbiIsCisie1xuIiwKKyIkKEFSKSAkKDwpICstJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgQ2NcbiIsCisie1xuIiwKKyIkKENDKSAkKENDRkxBR1MpICQoT1BUSU0pIC9Gbz0kKDwpIC9JJChIRFJTKSAkKD4pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBDKytcbiIsCisie1xuIiwKKyIkKEMrKykgJChDKytGTEFHUykgJChPUFRJTSkgL0ZvPSQoPCkgL0kkKEhEUlMpICQoPilcbiIsCisifVxuIiwKKyJhY3Rpb25zIExpbmsgYmluZCBORUVETElCU1xuIiwKKyJ7XG4iLAorIiQoTElOSykgJChMSU5LRkxBR1MpIC9GZT0kKDwpICQoVU5ERUZTKSAkKD4pICQoTkVFRExJQlMpICQoTElOS0xJQlMpXG4iLAorIn1cbiIsCisiYWN0aW9ucyBTaGVsbFxuIiwKKyJ7XG4iLAorIiQoQ1ApICQoPikgJCg8KVxuIiwKKyJ9XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKFRPT0xTRVQpID0gTENDXG4iLAorIntcbiIsCisiYWN0aW9ucyB0b2dldGhlciBwaWVjZW1lYWwgQXJjaGl2ZVxuIiwKKyJ7XG4iLAorIiQoQVIpIC9vdXQ6JCg8KSAkKD4pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBDY1xuIiwKKyJ7XG4iLAorIiQoQ0MpICQoQ0NGTEFHUykgJChPUFRJTSkgLUZvJCg8KSAtSSQoSERSUykgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgTGluayBiaW5kIE5FRURMSUJTXG4iLAorIntcbiIsCisiJChMSU5LKSAkKExJTktGTEFHUykgLW8gJCg8KSAkKFVOREVGUykgJCg+KSAkKE5FRURMSUJTKSAkKExJTktMSUJTKVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgU2hlbGxcbiIsCisie1xuIiwKKyIkKENQKSAkKD4pICQoPClcbiIsCisifVxuIiwKKyJ9XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKE9TMilcbiIsCisie1xuIiwKKyJpZiAkKFRPT0xTRVQpID0gV0FUQ09NXG4iLAorIntcbiIsCisiYWN0aW9ucyB0b2dldGhlciBwaWVjZW1lYWwgQXJjaGl2ZVxuIiwKKyJ7XG4iLAorIiQoQVIpICQoPCkgKy0kKD4pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBDY1xuIiwKKyJ7XG4iLAorIiQoQ0MpICQoQ0NGTEFHUykgJChPUFRJTSkgL0ZvPSQoPCkgL0kkKEhEUlMpICQoPilcbiIsCisifVxuIiwKKyJhY3Rpb25zIEMrK1xuIiwKKyJ7XG4iLAorIiQoQysrKSAkKEMrK0ZMQUdTKSAkKE9QVElNKSAvRm89JCg8KSAvSSQoSERSUykgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgTGluayBiaW5kIE5FRURMSUJTXG4iLAorIntcbiIsCisiJChMSU5LKSAkKExJTktGTEFHUykgL0ZlPSQoPCkgJChVTkRFRlMpICQoPikgJChORUVETElCUykgJChMSU5LTElCUylcbiIsCisifVxuIiwKKyJhY3Rpb25zIFNoZWxsXG4iLAorIntcbiIsCisiJChDUCkgJCg+KSAkKDwpXG4iLAorIn1cbiIsCisifVxuIiwKKyJlbHNlIGlmICQoVE9PTFNFVCkgPSBFTVhcbiIsCisie1xuIiwKKyJhY3Rpb25zIHRvZ2V0aGVyIHBpZWNlbWVhbCBBcmNoaXZlXG4iLAorIntcbiIsCisiJChBUikgJCg8KSAkKD46VClcbiIsCisifVxuIiwKKyJhY3Rpb25zIENjXG4iLAorIntcbiIsCisiJChDQykgLWMgJChDQ0ZMQUdTKSAkKE9QVElNKSAtSSQoSERSUykgLW8kKDwpICQoPilcbiIsCisifVxuIiwKKyJhY3Rpb25zIEMrK1xuIiwKKyJ7XG4iLAorIiQoQysrKSAtYyAkKEMrK0ZMQUdTKSAkKE9QVElNKSAtSSQoSERSUykgLW8kKDwpICQoPilcbiIsCisifVxuIiwKKyJ9XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKFZNUylcbiIsCisie1xuIiwKKyJhY3Rpb25zIHVwZGF0ZWQgdG9nZXRoZXIgcGllY2VtZWFsIEFyY2hpdmVcbiIsCisie1xuIiwKKyJsaWIvcmVwbGFjZSAkKDwpICQoPlsxXSkgLCQoPlsyLV0pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBDY1xuIiwKKyJ7XG4iLAorIiQoQ0MpL29iaj0kKDwpICQoQ0NGTEFHUykgJChPUFRJTSkgJChTTEFTSElOQykgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgQysrXG4iLAorIntcbiIsCisiJChDKyspL29iaj0kKDwpICQoQysrRkxBR1MpICQoT1BUSU0pICQoU0xBU0hJTkMpICQoPilcbiIsCisifVxuIiwKKyJhY3Rpb25zIHBpZWNlbWVhbCB0b2dldGhlciBleGlzdGluZyBDbGVhblxuIiwKKyJ7XG4iLAorIiQoUk0pICQoPlsxXSk7KiAsJCg+WzItXSk7KlxuIiwKKyJ9XG4iLAorImFjdGlvbnMgdG9nZXRoZXIgcXVpZXRseSBDcmVMaWJcbiIsCisie1xuIiwKKyJpZiBmJHNlYXJjaChcIiQoPClcIikgLmVxcy4gXCJcIiB0aGVuIGxpYi9jcmVhdGUgJCg8KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgR2VuRmlsZTFcbiIsCisie1xuIiwKKyJtY3IgJCg+WzFdKSAkKDwpICQoPlsyLV0pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBMaW5rIGJpbmQgTkVFRExJQlNcbiIsCisie1xuIiwKKyIkKExJTkspL2V4ZT0kKDwpICQoTElOS0ZMQUdTKSAkKD5bMV0pICwkKD5bMi1dKSAsJChORUVETElCUykvbGliICwkKExJTktMSUJTKVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgcXVpZXRseSB1cGRhdGVkIHBpZWNlbWVhbCB0b2dldGhlciBSbVRlbXBzXG4iLAorIntcbiIsCisiJChSTSkgJCg+WzFdKTsqICwkKD5bMi1dKTsqXG4iLAorIn1cbiIsCisiYWN0aW9ucyBTaGVsbFxuIiwKKyJ7XG4iLAorIiQoQ1ApICQoPikgJCg8KVxuIiwKKyJ9XG4iLAorIn1cbiIsCisiZWxzZSBpZiAkKE1BQylcbiIsCisie1xuIiwKKyJhY3Rpb25zIHRvZ2V0aGVyIEFyY2hpdmVcbiIsCisie1xuIiwKKyIkKExJTkspIC1saWJyYXJ5IC1vICQoPCkgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgQ2NcbiIsCisie1xuIiwKKyJzZXQgLWUgTVdDaW5jbHVkZXMgJChNQUNJTkMpXG4iLAorIiQoQ0MpIC1vICQoPCkgJChDQ0ZMQUdTKSAkKE9QVElNKSAkKD4pXG4iLAorIn1cbiIsCisiYWN0aW9ucyBDKytcbiIsCisie1xuIiwKKyJzZXQgLWUgTVdDaW5jbHVkZXMgJChNQUNJTkMpXG4iLAorIiQoQ0MpIC1vICQoPCkgJChDKytGTEFHUykgJChPUFRJTSkgJCg+KVxuIiwKKyJ9XG4iLAorImFjdGlvbnMgTGluayBiaW5kIE5FRURMSUJTXG4iLAorIntcbiIsCisiJChMSU5LKSAtbyAkKDwpICQoTElOS0ZMQUdTKSAkKD4pICQoTkVFRExJQlMpIFwiJChMSU5LTElCUylcIlxuIiwKKyJ9XG4iLAorIn1cbiIsCisicnVsZSBCVUxLIHsgQnVsayAkKDwpIDogJCg+KSA7IH1cbiIsCisicnVsZSBGSUxFIHsgRmlsZSAkKDwpIDogJCg+KSA7IH1cbiIsCisicnVsZSBIRFJSVUxFIHsgSGRyUnVsZSAkKDwpIDogJCg+KSA7IH1cbiIsCisicnVsZSBJTlNUQUxMIHsgSW5zdGFsbCAkKDwpIDogJCg+KSA7IH1cbiIsCisicnVsZSBMSUJSQVJZIHsgTGlicmFyeSAkKDwpIDogJCg+KSA7IH1cbiIsCisicnVsZSBMSUJTIHsgTGlua0xpYnJhcmllcyAkKDwpIDogJCg+KSA7IH1cbiIsCisicnVsZSBMSU5LIHsgTGluayAkKDwpIDogJCg+KSA7IH1cbiIsCisicnVsZSBNQUlOIHsgTWFpbiAkKDwpIDogJCg+KSA7IH1cbiIsCisicnVsZSBTRVRVSUQgeyBTZXR1aWQgJCg8KSA7IH1cbiIsCisicnVsZSBTSEVMTCB7IFNoZWxsICQoPCkgOiAkKD4pIDsgfVxuIiwKKyJydWxlIFVOREVGSU5FUyB7IFVuZGVmaW5lcyAkKDwpIDogJCg+KSA7IH1cbiIsCisicnVsZSBJTlNUQUxMQklOIHsgSW5zdGFsbEJpbiAkKEJJTkRJUikgOiAkKDwpIDsgfVxuIiwKKyJydWxlIElOU1RBTExMSUIgeyBJbnN0YWxsTGliICQoTElCRElSKSA6ICQoPCkgOyB9XG4iLAorInJ1bGUgSU5TVEFMTE1BTiB7IEluc3RhbGxNYW4gJChNQU5ESVIpIDogJCg8KSA7IH1cbiIsCisicnVsZSBhZGREaXJOYW1lIHsgJCg8KSArPSBbIEZEaXJOYW1lICQoPikgXSA7IH1cbiIsCisicnVsZSBtYWtlRGlyTmFtZSB7ICQoPCkgPSBbIEZEaXJOYW1lICQoPikgXSA7IH1cbiIsCisicnVsZSBtYWtlR3Jpc3RlZE5hbWUgeyAkKDwpID0gWyBGR3Jpc3RTb3VyY2VGaWxlcyAkKD4pIF0gOyB9XG4iLAorInJ1bGUgbWFrZVJlbFBhdGggeyAkKDxbMV0pID0gWyBGUmVsUGF0aCAkKDxbMi1dKSA6ICQoPikgXSA7IH1cbiIsCisicnVsZSBtYWtlU3VmZml4ZWQgeyAkKDxbMV0pID0gWyBGQXBwZW5kU3VmZml4ICQoPikgOiAkKDxbMl0pIF0gOyB9XG4iLAorIntcbiIsCisiaWYgJChKQU1GSUxFKSB7IGluY2x1ZGUgJChKQU1GSUxFKSA7IH1cbiIsCisifVxuIiwKKyJ9XG4iLAorMCB9OwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvamFtYmFzZS5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvamFtYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNWVjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9qYW1iYXNlLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk1IENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyoKKyAqIGphbWJhc2UuaCAtIGRlY2xhcmF0aW9uIGZvciB0aGUgaW50ZXJuYWwgamFtYmFzZQorICoKKyAqIFRoZSBmaWxlIEphbWJhc2UgaXMgdHVybmVkIGludG8gYSBDIGFycmF5IG9mIHN0cmluZ3MgaW4gamFtYmFzZS5jCisgKiBzbyB0aGF0IGl0IGNhbiBiZSBidWlsdCBpbiB0byB0aGUgZXhlY3V0YWJsZS4gIFRoaXMgaXMgdGhlCisgKiBkZWNsYXJhdGlvbiBmb3IgdGhhdCBhcnJheS4KKyAqLworCitleHRlcm4gY2hhciAqamFtYmFzZVtdOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvamFtZ3JhbS5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvamFtZ3JhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Yzg1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9qYW1ncmFtLmMKQEAgLTAsMCArMSwyMzI3IEBACisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjMuICAqLworCisvKiBTa2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCisgICAKKyAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwKKyAgIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgY3JlYXRlIGEgbGFyZ2VyIHdvcmsgdGhhdCBjb250YWlucworICAgcGFydCBvciBhbGwgb2YgdGhlIEJpc29uIHBhcnNlciBza2VsZXRvbiBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKKyAgIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBzbyBsb25nIGFzIHRoYXQgd29yayBpc24ndCBpdHNlbGYgYQorICAgcGFyc2VyIGdlbmVyYXRvciB1c2luZyB0aGUgc2tlbGV0b24gb3IgYSBtb2RpZmllZCB2ZXJzaW9uIHRoZXJlb2YKKyAgIGFzIGEgcGFyc2VyIHNrZWxldG9uLiAgQWx0ZXJuYXRpdmVseSwgaWYgeW91IG1vZGlmeSBvciByZWRpc3RyaWJ1dGUKKyAgIHRoZSBwYXJzZXIgc2tlbGV0b24gaXRzZWxmLCB5b3UgbWF5IChhdCB5b3VyIG9wdGlvbikgcmVtb3ZlIHRoaXMKKyAgIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBza2VsZXRvbiBhbmQgdGhlIHJlc3VsdGluZworICAgQmlzb24gb3V0cHV0IGZpbGVzIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2Ugd2l0aG91dCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uLgorICAgCisgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluCisgICB2ZXJzaW9uIDIuMiBvZiBCaXNvbi4gICovCisKKy8qIEMgTEFMUigxKSBwYXJzZXIgc2tlbGV0b24gd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuLCBieQorICAgc2ltcGxpZnlpbmcgdGhlIG9yaWdpbmFsIHNvLWNhbGxlZCAic2VtYW50aWMiIHBhcnNlci4gICovCisKKy8qIEFsbCBzeW1ib2xzIGRlZmluZWQgYmVsb3cgc2hvdWxkIGJlZ2luIHdpdGggeXkgb3IgWVksIHRvIGF2b2lkCisgICBpbmZyaW5naW5nIG9uIHVzZXIgbmFtZSBzcGFjZS4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgZXZlbiBmb3IgbG9jYWwKKyAgIHZhcmlhYmxlcywgYXMgdGhleSBtaWdodCBvdGhlcndpc2UgYmUgZXhwYW5kZWQgYnkgdXNlciBtYWNyb3MuCisgICBUaGVyZSBhcmUgc29tZSB1bmF2b2lkYWJsZSBleGNlcHRpb25zIHdpdGhpbiBpbmNsdWRlIGZpbGVzIHRvCisgICBkZWZpbmUgbmVjZXNzYXJ5IGxpYnJhcnkgc3ltYm9sczsgdGhleSBhcmUgbm90ZWQgIklORlJJTkdFUyBPTgorICAgVVNFUiBOQU1FIFNQQUNFIiBiZWxvdy4gICovCisKKy8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCisjZGVmaW5lIFlZQklTT04gMQorCisvKiBCaXNvbiB2ZXJzaW9uLiAgKi8KKyNkZWZpbmUgWVlCSVNPTl9WRVJTSU9OICIyLjQuMyIKKworLyogU2tlbGV0b24gbmFtZS4gICovCisjZGVmaW5lIFlZU0tFTEVUT05fTkFNRSAieWFjYy5jIgorCisvKiBQdXJlIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVUkUgMAorCisvKiBQdXNoIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVU0ggMAorCisvKiBQdWxsIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVTEwgMQorCisvKiBVc2luZyBsb2NhdGlvbnMuICAqLworI2RlZmluZSBZWUxTUF9ORUVERUQgMAorCisKKworLyogQ29weSB0aGUgZmlyc3QgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCisKKy8qIExpbmUgMTg5IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDk2ICJqYW1ncmFtLnkiCisKKyNpbmNsdWRlICJqYW0uaCIKKworI2luY2x1ZGUgImxpc3RzLmgiCisjaW5jbHVkZSAicGFyc2UuaCIKKyNpbmNsdWRlICJzY2FuLmgiCisjaW5jbHVkZSAiY29tcGlsZS5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisKKyMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAJLyogZm9yIE9TRiBhbmQgb3RoZXIgbGVzcyBlbmRvd2VkIHlhY2NzICovCisKKyMgZGVmaW5lIEYwIC0xCisjIGRlZmluZSBQMCAoUEFSU0UgKikwCisjIGRlZmluZSBTMCAoT0JKRUNUICopMAorCisjIGRlZmluZSBwYXBwZW5kKCBsLHIgKSAgICAJcGFyc2VfbWFrZSggUEFSU0VfQVBQRU5ELGwscixQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBldmFsKCBjLGwsciApCXBhcnNlX21ha2UoIFBBUlNFX0VWQUwsbCxyLFAwLFMwLFMwLGMgKQorIyBkZWZpbmUgcGZvciggcyxsLHIseCApICAgIAlwYXJzZV9tYWtlKCBQQVJTRV9GT1JFQUNILGwscixQMCxzLFMwLHggKQorIyBkZWZpbmUgcGlmKCBsLHIsdCApCSAgCXBhcnNlX21ha2UoIFBBUlNFX0lGLGwscix0LFMwLFMwLDAgKQorIyBkZWZpbmUgcGluY2woIGwgKSAgICAgICAJcGFyc2VfbWFrZSggUEFSU0VfSU5DTFVERSxsLFAwLFAwLFMwLFMwLDAgKQorIyBkZWZpbmUgcGxpc3QoIHMgKQkgIAlwYXJzZV9tYWtlKCBQQVJTRV9MSVNULFAwLFAwLFAwLHMsUzAsMCApCisjIGRlZmluZSBwbG9jYWwoIGwscix0ICkgIAlwYXJzZV9tYWtlKCBQQVJTRV9MT0NBTCxsLHIsdCxTMCxTMCwwICkKKyMgZGVmaW5lIHBtb2R1bGUoIGwsciApCSAgCXBhcnNlX21ha2UoIFBBUlNFX01PRFVMRSxsLHIsUDAsUzAsUzAsMCApCisjIGRlZmluZSBwY2xhc3MoIGwsciApCSAgCXBhcnNlX21ha2UoIFBBUlNFX0NMQVNTLGwscixQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBudWxsKCkJICAJcGFyc2VfbWFrZSggUEFSU0VfTlVMTCxQMCxQMCxQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBvbiggbCxyICkJICAJcGFyc2VfbWFrZSggUEFSU0VfT04sbCxyLFAwLFMwLFMwLDAgKQorIyBkZWZpbmUgcHJ1bGUoIHMscCApICAgICAJcGFyc2VfbWFrZSggUEFSU0VfUlVMRSxwLFAwLFAwLHMsUzAsMCApCisjIGRlZmluZSBwcnVsZXMoIGwsciApCSAgCXBhcnNlX21ha2UoIFBBUlNFX1JVTEVTLGwscixQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBzZXQoIGwscixhICkgICAgICAgICAgcGFyc2VfbWFrZSggUEFSU0VfU0VULGwscixQMCxTMCxTMCxhICkKKyMgZGVmaW5lIHBzZXQxKCBsLHIsdCxhICkJcGFyc2VfbWFrZSggUEFSU0VfU0VUVElOR1MsbCxyLHQsUzAsUzAsYSApCisjIGRlZmluZSBwc2V0YyggcyxwLGEsbCApICAgICAJcGFyc2VfbWFrZSggUEFSU0VfU0VUQ09NUCxwLGEsUDAscyxTMCxsICkKKyMgZGVmaW5lIHBzZXRlKCBzLGwsczEsZiApIAlwYXJzZV9tYWtlKCBQQVJTRV9TRVRFWEVDLGwsUDAsUDAscyxzMSxmICkKKyMgZGVmaW5lIHBzd2l0Y2goIGwsciApICAgCXBhcnNlX21ha2UoIFBBUlNFX1NXSVRDSCxsLHIsUDAsUzAsUzAsMCApCisjIGRlZmluZSBwd2hpbGUoIGwsciApICAgCXBhcnNlX21ha2UoIFBBUlNFX1dISUxFLGwscixQMCxTMCxTMCwwICkKKworIyBkZWZpbmUgcG5vZGUoIGwsciApICAgIAlwYXJzZV9tYWtlKCBGMCxsLHIsUDAsUzAsUzAsMCApCisjIGRlZmluZSBwc25vZGUoIHMsbCApICAgICAJcGFyc2VfbWFrZSggRjAsbCxQMCxQMCxzLFMwLDAgKQorCisKKworLyogTGluZSAxODkgb2YgeWFjYy5jICAqLworI2xpbmUgMTE0ICJ5LnRhYi5jIgorCisvKiBFbmFibGluZyB0cmFjZXMuICAqLworI2lmbmRlZiBZWURFQlVHCisjIGRlZmluZSBZWURFQlVHIDAKKyNlbmRpZgorCisvKiBFbmFibGluZyB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzLiAgKi8KKyNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKKyMgdW5kZWYgWVlFUlJPUl9WRVJCT1NFCisjIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMQorI2Vsc2UKKyMgZGVmaW5lIFlZRVJST1JfVkVSQk9TRSAwCisjZW5kaWYKKworLyogRW5hYmxpbmcgdGhlIHRva2VuIHRhYmxlLiAgKi8KKyNpZm5kZWYgWVlUT0tFTl9UQUJMRQorIyBkZWZpbmUgWVlUT0tFTl9UQUJMRSAwCisjZW5kaWYKKworCisvKiBUb2tlbnMuICAqLworI2lmbmRlZiBZWVRPS0VOVFlQRQorIyBkZWZpbmUgWVlUT0tFTlRZUEUKKyAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycworICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KKyAgIGVudW0geXl0b2tlbnR5cGUgeworICAgICBfQkFOR190ID0gMjU4LAorICAgICBfQkFOR19FUVVBTFNfdCA9IDI1OSwKKyAgICAgX0FNUEVSX3QgPSAyNjAsCisgICAgIF9BTVBFUkFNUEVSX3QgPSAyNjEsCisgICAgIF9MUEFSRU5fdCA9IDI2MiwKKyAgICAgX1JQQVJFTl90ID0gMjYzLAorICAgICBfUExVU19FUVVBTFNfdCA9IDI2NCwKKyAgICAgX0NPTE9OX3QgPSAyNjUsCisgICAgIF9TRU1JQ190ID0gMjY2LAorICAgICBfTEFOR0xFX3QgPSAyNjcsCisgICAgIF9MQU5HTEVfRVFVQUxTX3QgPSAyNjgsCisgICAgIF9FUVVBTFNfdCA9IDI2OSwKKyAgICAgX1JBTkdMRV90ID0gMjcwLAorICAgICBfUkFOR0xFX0VRVUFMU190ID0gMjcxLAorICAgICBfUVVFU1RJT05fRVFVQUxTX3QgPSAyNzIsCisgICAgIF9MQlJBQ0tFVF90ID0gMjczLAorICAgICBfUkJSQUNLRVRfdCA9IDI3NCwKKyAgICAgQUNUSU9OU190ID0gMjc1LAorICAgICBCSU5EX3QgPSAyNzYsCisgICAgIENBU0VfdCA9IDI3NywKKyAgICAgQ0xBU1NfdCA9IDI3OCwKKyAgICAgREVGQVVMVF90ID0gMjc5LAorICAgICBFTFNFX3QgPSAyODAsCisgICAgIEVYSVNUSU5HX3QgPSAyODEsCisgICAgIEZPUl90ID0gMjgyLAorICAgICBJRl90ID0gMjgzLAorICAgICBJR05PUkVfdCA9IDI4NCwKKyAgICAgSU5fdCA9IDI4NSwKKyAgICAgSU5DTFVERV90ID0gMjg2LAorICAgICBMT0NBTF90ID0gMjg3LAorICAgICBNT0RVTEVfdCA9IDI4OCwKKyAgICAgT05fdCA9IDI4OSwKKyAgICAgUElFQ0VNRUFMX3QgPSAyOTAsCisgICAgIFFVSUVUTFlfdCA9IDI5MSwKKyAgICAgUkVUVVJOX3QgPSAyOTIsCisgICAgIFJVTEVfdCA9IDI5MywKKyAgICAgU1dJVENIX3QgPSAyOTQsCisgICAgIFRPR0VUSEVSX3QgPSAyOTUsCisgICAgIFVQREFURURfdCA9IDI5NiwKKyAgICAgV0hJTEVfdCA9IDI5NywKKyAgICAgX0xCUkFDRV90ID0gMjk4LAorICAgICBfQkFSX3QgPSAyOTksCisgICAgIF9CQVJCQVJfdCA9IDMwMCwKKyAgICAgX1JCUkFDRV90ID0gMzAxLAorICAgICBBUkcgPSAzMDIsCisgICAgIFNUUklORyA9IDMwMworICAgfTsKKyNlbmRpZgorLyogVG9rZW5zLiAgKi8KKyNkZWZpbmUgX0JBTkdfdCAyNTgKKyNkZWZpbmUgX0JBTkdfRVFVQUxTX3QgMjU5CisjZGVmaW5lIF9BTVBFUl90IDI2MAorI2RlZmluZSBfQU1QRVJBTVBFUl90IDI2MQorI2RlZmluZSBfTFBBUkVOX3QgMjYyCisjZGVmaW5lIF9SUEFSRU5fdCAyNjMKKyNkZWZpbmUgX1BMVVNfRVFVQUxTX3QgMjY0CisjZGVmaW5lIF9DT0xPTl90IDI2NQorI2RlZmluZSBfU0VNSUNfdCAyNjYKKyNkZWZpbmUgX0xBTkdMRV90IDI2NworI2RlZmluZSBfTEFOR0xFX0VRVUFMU190IDI2OAorI2RlZmluZSBfRVFVQUxTX3QgMjY5CisjZGVmaW5lIF9SQU5HTEVfdCAyNzAKKyNkZWZpbmUgX1JBTkdMRV9FUVVBTFNfdCAyNzEKKyNkZWZpbmUgX1FVRVNUSU9OX0VRVUFMU190IDI3MgorI2RlZmluZSBfTEJSQUNLRVRfdCAyNzMKKyNkZWZpbmUgX1JCUkFDS0VUX3QgMjc0CisjZGVmaW5lIEFDVElPTlNfdCAyNzUKKyNkZWZpbmUgQklORF90IDI3NgorI2RlZmluZSBDQVNFX3QgMjc3CisjZGVmaW5lIENMQVNTX3QgMjc4CisjZGVmaW5lIERFRkFVTFRfdCAyNzkKKyNkZWZpbmUgRUxTRV90IDI4MAorI2RlZmluZSBFWElTVElOR190IDI4MQorI2RlZmluZSBGT1JfdCAyODIKKyNkZWZpbmUgSUZfdCAyODMKKyNkZWZpbmUgSUdOT1JFX3QgMjg0CisjZGVmaW5lIElOX3QgMjg1CisjZGVmaW5lIElOQ0xVREVfdCAyODYKKyNkZWZpbmUgTE9DQUxfdCAyODcKKyNkZWZpbmUgTU9EVUxFX3QgMjg4CisjZGVmaW5lIE9OX3QgMjg5CisjZGVmaW5lIFBJRUNFTUVBTF90IDI5MAorI2RlZmluZSBRVUlFVExZX3QgMjkxCisjZGVmaW5lIFJFVFVSTl90IDI5MgorI2RlZmluZSBSVUxFX3QgMjkzCisjZGVmaW5lIFNXSVRDSF90IDI5NAorI2RlZmluZSBUT0dFVEhFUl90IDI5NQorI2RlZmluZSBVUERBVEVEX3QgMjk2CisjZGVmaW5lIFdISUxFX3QgMjk3CisjZGVmaW5lIF9MQlJBQ0VfdCAyOTgKKyNkZWZpbmUgX0JBUl90IDI5OQorI2RlZmluZSBfQkFSQkFSX3QgMzAwCisjZGVmaW5lIF9SQlJBQ0VfdCAzMDEKKyNkZWZpbmUgQVJHIDMwMgorI2RlZmluZSBTVFJJTkcgMzAzCisKKworCisKKyNpZiAhIGRlZmluZWQgWVlTVFlQRSAmJiAhIGRlZmluZWQgWVlTVFlQRV9JU19ERUNMQVJFRAordHlwZWRlZiBpbnQgWVlTVFlQRTsKKyMgZGVmaW5lIFlZU1RZUEVfSVNfVFJJVklBTCAxCisjIGRlZmluZSB5eXN0eXBlIFlZU1RZUEUgLyogb2Jzb2xlc2NlbnQ7IHdpbGwgYmUgd2l0aGRyYXduICovCisjIGRlZmluZSBZWVNUWVBFX0lTX0RFQ0xBUkVEIDEKKyNlbmRpZgorCisKKy8qIENvcHkgdGhlIHNlY29uZCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KKworCisvKiBMaW5lIDI2NCBvZiB5YWNjLmMgICovCisjbGluZSAyNTIgInkudGFiLmMiCisKKyNpZmRlZiBzaG9ydAorIyB1bmRlZiBzaG9ydAorI2VuZGlmCisKKyNpZmRlZiBZWVRZUEVfVUlOVDgKK3R5cGVkZWYgWVlUWVBFX1VJTlQ4IHl5dHlwZV91aW50ODsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgeXl0eXBlX3VpbnQ4OworI2VuZGlmCisKKyNpZmRlZiBZWVRZUEVfSU5UOAordHlwZWRlZiBZWVRZUEVfSU5UOCB5eXR5cGVfaW50ODsKKyNlbGlmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3R5cGVkZWYgc2lnbmVkIGNoYXIgeXl0eXBlX2ludDg7CisjZWxzZQordHlwZWRlZiBzaG9ydCBpbnQgeXl0eXBlX2ludDg7CisjZW5kaWYKKworI2lmZGVmIFlZVFlQRV9VSU5UMTYKK3R5cGVkZWYgWVlUWVBFX1VJTlQxNiB5eXR5cGVfdWludDE2OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHl5dHlwZV91aW50MTY7CisjZW5kaWYKKworI2lmZGVmIFlZVFlQRV9JTlQxNgordHlwZWRlZiBZWVRZUEVfSU5UMTYgeXl0eXBlX2ludDE2OworI2Vsc2UKK3R5cGVkZWYgc2hvcnQgaW50IHl5dHlwZV9pbnQxNjsKKyNlbmRpZgorCisjaWZuZGVmIFlZU0laRV9UCisjIGlmZGVmIF9fU0laRV9UWVBFX18KKyMgIGRlZmluZSBZWVNJWkVfVCBfX1NJWkVfVFlQRV9fCisjIGVsaWYgZGVmaW5lZCBzaXplX3QKKyMgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgZWxpZiAhIGRlZmluZWQgWVlTSVpFX1QgJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorIyAgaW5jbHVkZSA8c3RkZGVmLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgZWxzZQorIyAgZGVmaW5lIFlZU0laRV9UIHVuc2lnbmVkIGludAorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgWVlTSVpFX01BWElNVU0gKChZWVNJWkVfVCkgLTEpCisKKyNpZm5kZWYgWVlfCisjIGlmIGRlZmluZWQgWVlFTkFCTEVfTkxTICYmIFlZRU5BQkxFX05MUworIyAgaWYgRU5BQkxFX05MUworIyAgIGluY2x1ZGUgPGxpYmludGwuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGRlZmluZSBZWV8obXNnaWQpIGRnZXR0ZXh0ICgiYmlzb24tcnVudGltZSIsIG1zZ2lkKQorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZuZGVmIFlZXworIyAgZGVmaW5lIFlZXyhtc2dpZCkgbXNnaWQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBTdXBwcmVzcyB1bnVzZWQtdmFyaWFibGUgd2FybmluZ3MgYnkgInVzaW5nIiBFLiAgKi8KKyNpZiAhIGRlZmluZWQgbGludCB8fCBkZWZpbmVkIF9fR05VQ19fCisjIGRlZmluZSBZWVVTRShlKSAoKHZvaWQpIChlKSkKKyNlbHNlCisjIGRlZmluZSBZWVVTRShlKSAvKiBlbXB0eSAqLworI2VuZGlmCisKKy8qIElkZW50aXR5IGZ1bmN0aW9uLCB1c2VkIHRvIHN1cHByZXNzIHdhcm5pbmdzIGFib3V0IGNvbnN0YW50IGNvbmRpdGlvbnMuICAqLworI2lmbmRlZiBsaW50CisjIGRlZmluZSBZWUlEKG4pIChuKQorI2Vsc2UKKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgaW50CitZWUlEIChpbnQgeXlpKQorI2Vsc2UKK3N0YXRpYyBpbnQKK1lZSUQgKHl5aSkKKyAgICBpbnQgeXlpOworI2VuZGlmCit7CisgIHJldHVybiB5eWk7Cit9CisjZW5kaWYKKworI2lmICEgZGVmaW5lZCB5eW92ZXJmbG93IHx8IFlZRVJST1JfVkVSQk9TRQorCisvKiBUaGUgcGFyc2VyIGludm9rZXMgYWxsb2NhIG9yIG1hbGxvYzsgZGVmaW5lIHRoZSBuZWNlc3Nhcnkgc3ltYm9scy4gICovCisKKyMgaWZkZWYgWVlTVEFDS19VU0VfQUxMT0NBCisjICBpZiBZWVNUQUNLX1VTRV9BTExPQ0EKKyMgICBpZmRlZiBfX0dOVUNfXworIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBfX2J1aWx0aW5fYWxsb2NhCisjICAgZWxpZiBkZWZpbmVkIF9fQlVJTFRJTl9WQV9BUkdfSU5DUgorIyAgICBpbmNsdWRlIDxhbGxvY2EuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGVsaWYgZGVmaW5lZCBfQUlYCisjICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIF9fYWxsb2NhCisjICAgZWxpZiBkZWZpbmVkIF9NU0NfVkVSCisjICAgIGluY2x1ZGUgPG1hbGxvYy5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCisjICAgIGlmICEgZGVmaW5lZCBfQUxMT0NBX0ggJiYgISBkZWZpbmVkIF9TVERMSUJfSCAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCisjICAgICBpbmNsdWRlIDxzdGRsaWIuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgICAgaWZuZGVmIF9TVERMSUJfSAorIyAgICAgIGRlZmluZSBfU1RETElCX0ggMQorIyAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBZWVNUQUNLX0FMTE9DCisgICAvKiBQYWNpZnkgR0NDJ3MgYGVtcHR5IGlmLWJvZHknIHdhcm5pbmcuICAqLworIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRShQdHIpIGRvIHsgLyogZW1wdHkgKi87IH0gd2hpbGUgKFlZSUQgKDApKQorIyAgaWZuZGVmIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTQorICAgIC8qIFRoZSBPUyBtaWdodCBndWFyYW50ZWUgb25seSBvbmUgZ3VhcmQgcGFnZSBhdCB0aGUgYm90dG9tIG9mIHRoZSBzdGFjaywKKyAgICAgICBhbmQgYSBwYWdlIHNpemUgY2FuIGJlIGFzIHNtYWxsIGFzIDQwOTYgYnl0ZXMuICBTbyB3ZSBjYW5ub3Qgc2FmZWx5CisgICAgICAgaW52b2tlIGFsbG9jYSAoTikgaWYgTiBleGNlZWRzIDQwOTYuICBVc2UgYSBzbGlnaHRseSBzbWFsbGVyIG51bWJlcgorICAgICAgIHRvIGFsbG93IGZvciBhIGZldyBjb21waWxlci1hbGxvY2F0ZWQgdGVtcG9yYXJ5IHN0YWNrIHNsb3RzLiAgKi8KKyMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNIDQwMzIgLyogcmVhc29uYWJsZSBjaXJjYSAyMDA2ICovCisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgWVlTVEFDS19BTExPQyBZWU1BTExPQworIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRSBZWUZSRUUKKyMgIGlmbmRlZiBZWVNUQUNLX0FMTE9DX01BWElNVU0KKyMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNIFlZU0laRV9NQVhJTVVNCisjICBlbmRpZgorIyAgaWYgKGRlZmluZWQgX19jcGx1c3BsdXMgJiYgISBkZWZpbmVkIF9TVERMSUJfSCBcCisgICAgICAgJiYgISAoKGRlZmluZWQgWVlNQUxMT0MgfHwgZGVmaW5lZCBtYWxsb2MpIFwKKwkgICAgICYmIChkZWZpbmVkIFlZRlJFRSB8fCBkZWZpbmVkIGZyZWUpKSkKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGlmbmRlZiBfU1RETElCX0gKKyMgICAgZGVmaW5lIF9TVERMSUJfSCAxCisjICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZm5kZWYgWVlNQUxMT0MKKyMgICBkZWZpbmUgWVlNQUxMT0MgbWFsbG9jCisjICAgaWYgISBkZWZpbmVkIG1hbGxvYyAmJiAhIGRlZmluZWQgX1NURExJQl9IICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3ZvaWQgKm1hbGxvYyAoWVlTSVpFX1QpOyAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZm5kZWYgWVlGUkVFCisjICAgZGVmaW5lIFlZRlJFRSBmcmVlCisjICAgaWYgISBkZWZpbmVkIGZyZWUgJiYgISBkZWZpbmVkIF9TVERMSUJfSCAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCit2b2lkIGZyZWUgKHZvaWQgKik7IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZiAvKiAhIGRlZmluZWQgeXlvdmVyZmxvdyB8fCBZWUVSUk9SX1ZFUkJPU0UgKi8KKworCisjaWYgKCEgZGVmaW5lZCB5eW92ZXJmbG93IFwKKyAgICAgJiYgKCEgZGVmaW5lZCBfX2NwbHVzcGx1cyBcCisJIHx8IChkZWZpbmVkIFlZU1RZUEVfSVNfVFJJVklBTCAmJiBZWVNUWVBFX0lTX1RSSVZJQUwpKSkKKworLyogQSB0eXBlIHRoYXQgaXMgcHJvcGVybHkgYWxpZ25lZCBmb3IgYW55IHN0YWNrIG1lbWJlci4gICovCit1bmlvbiB5eWFsbG9jCit7CisgIHl5dHlwZV9pbnQxNiB5eXNzX2FsbG9jOworICBZWVNUWVBFIHl5dnNfYWxsb2M7Cit9OworCisvKiBUaGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBnYXAgYmV0d2VlbiBvbmUgYWxpZ25lZCBzdGFjayBhbmQgdGhlIG5leHQuICAqLworIyBkZWZpbmUgWVlTVEFDS19HQVBfTUFYSU1VTSAoc2l6ZW9mICh1bmlvbiB5eWFsbG9jKSAtIDEpCisKKy8qIFRoZSBzaXplIG9mIGFuIGFycmF5IGxhcmdlIHRvIGVub3VnaCB0byBob2xkIGFsbCBzdGFja3MsIGVhY2ggd2l0aAorICAgTiBlbGVtZW50cy4gICovCisjIGRlZmluZSBZWVNUQUNLX0JZVEVTKE4pIFwKKyAgICAgKChOKSAqIChzaXplb2YgKHl5dHlwZV9pbnQxNikgKyBzaXplb2YgKFlZU1RZUEUpKSBcCisgICAgICArIFlZU1RBQ0tfR0FQX01BWElNVU0pCisKKy8qIENvcHkgQ09VTlQgb2JqZWN0cyBmcm9tIEZST00gdG8gVE8uICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkbworICAgbm90IG92ZXJsYXAuICAqLworIyBpZm5kZWYgWVlDT1BZCisjICBpZiBkZWZpbmVkIF9fR05VQ19fICYmIDEgPCBfX0dOVUNfXworIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KSBcCisgICAgICBfX2J1aWx0aW5fbWVtY3B5IChUbywgRnJvbSwgKENvdW50KSAqIHNpemVvZiAoKihGcm9tKSkpCisjICBlbHNlCisjICAgZGVmaW5lIFlZQ09QWShUbywgRnJvbSwgQ291bnQpCQlcCisgICAgICBkbwkJCQkJXAorCXsJCQkJCVwKKwkgIFlZU0laRV9UIHl5aTsJCQkJXAorCSAgZm9yICh5eWkgPSAwOyB5eWkgPCAoQ291bnQpOyB5eWkrKykJXAorCSAgICAoVG8pW3l5aV0gPSAoRnJvbSlbeXlpXTsJCVwKKwl9CQkJCQlcCisgICAgICB3aGlsZSAoWVlJRCAoMCkpCisjICBlbmRpZgorIyBlbmRpZgorCisvKiBSZWxvY2F0ZSBTVEFDSyBmcm9tIGl0cyBvbGQgbG9jYXRpb24gdG8gdGhlIG5ldyBvbmUuICBUaGUKKyAgIGxvY2FsIHZhcmlhYmxlcyBZWVNJWkUgYW5kIFlZU1RBQ0tTSVpFIGdpdmUgdGhlIG9sZCBhbmQgbmV3IG51bWJlciBvZgorICAgZWxlbWVudHMgaW4gdGhlIHN0YWNrLCBhbmQgWVlQVFIgZ2l2ZXMgdGhlIG5ldyBsb2NhdGlvbiBvZiB0aGUKKyAgIHN0YWNrLiAgQWR2YW5jZSBZWVBUUiB0byBhIHByb3Blcmx5IGFsaWduZWQgbG9jYXRpb24gZm9yIHRoZSBuZXh0CisgICBzdGFjay4gICovCisjIGRlZmluZSBZWVNUQUNLX1JFTE9DQVRFKFN0YWNrX2FsbG9jLCBTdGFjaykJCQkJXAorICAgIGRvCQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlZWVNJWkVfVCB5eW5ld2J5dGVzOwkJCQkJCVwKKwlZWUNPUFkgKCZ5eXB0ci0+U3RhY2tfYWxsb2MsIFN0YWNrLCB5eXNpemUpOwkJCVwKKwlTdGFjayA9ICZ5eXB0ci0+U3RhY2tfYWxsb2M7CQkJCQlcCisJeXluZXdieXRlcyA9IHl5c3RhY2tzaXplICogc2l6ZW9mICgqU3RhY2spICsgWVlTVEFDS19HQVBfTUFYSU1VTTsgXAorCXl5cHRyICs9IHl5bmV3Ynl0ZXMgLyBzaXplb2YgKCp5eXB0cik7CQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgd2hpbGUgKFlZSUQgKDApKQorCisjZW5kaWYKKworLyogWVlGSU5BTCAtLSBTdGF0ZSBudW1iZXIgb2YgdGhlIHRlcm1pbmF0aW9uIHN0YXRlLiAgKi8KKyNkZWZpbmUgWVlGSU5BTCAgNDMKKy8qIFlZTEFTVCAtLSBMYXN0IGluZGV4IGluIFlZVEFCTEUuICAqLworI2RlZmluZSBZWUxBU1QgICAyNDMKKworLyogWVlOVE9LRU5TIC0tIE51bWJlciBvZiB0ZXJtaW5hbHMuICAqLworI2RlZmluZSBZWU5UT0tFTlMgIDQ5CisvKiBZWU5OVFMgLS0gTnVtYmVyIG9mIG5vbnRlcm1pbmFscy4gICovCisjZGVmaW5lIFlZTk5UUyAgMjQKKy8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBydWxlcy4gICovCisjZGVmaW5lIFlZTlJVTEVTICA3NQorLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHN0YXRlcy4gICovCisjZGVmaW5lIFlZTlNUQVRFUyAgMTU5CisKKy8qIFlZVFJBTlNMQVRFKFlZTEVYKSAtLSBCaXNvbiBzeW1ib2wgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICAqLworI2RlZmluZSBZWVVOREVGVE9LICAyCisjZGVmaW5lIFlZTUFYVVRPSyAgIDMwMworCisjZGVmaW5lIFlZVFJBTlNMQVRFKFlZWCkJCQkJCQlcCisgICgodW5zaWduZWQgaW50KSAoWVlYKSA8PSBZWU1BWFVUT0sgPyB5eXRyYW5zbGF0ZVtZWVhdIDogWVlVTkRFRlRPSykKKworLyogWVlUUkFOU0xBVEVbWVlMRVhdIC0tIEJpc29uIHN5bWJvbCBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5dHJhbnNsYXRlW10gPQoreworICAgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwKKyAgICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsCisgICAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwKKyAgICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LAorICAgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgKK307CisKKyNpZiBZWURFQlVHCisvKiBZWVBSSFNbWVlOXSAtLSBJbmRleCBvZiB0aGUgZmlyc3QgUkhTIHN5bWJvbCBvZiBydWxlIG51bWJlciBZWU4gaW4KKyAgIFlZUkhTLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlwcmhzW10gPQoreworICAgICAgIDAsICAgICAwLCAgICAgMywgICAgIDQsICAgICA2LCAgICAgOCwgICAgMTAsICAgIDEyLCAgICAxNSwgICAgMjEsCisgICAgICAyMiwgICAgMjUsICAgIDI3LCAgICAzMSwgICAgMzIsICAgIDM0LCAgICAzNSwgICAgMzksICAgIDQzLCAgICA0NywKKyAgICAgIDUyLCAgICA1OSwgICAgNjMsICAgIDcyLCAgICA3OCwgICAgODQsICAgIDkwLCAgICA5NiwgICAxMDIsICAgMTEwLAorICAgICAxMTYsICAgMTIwLCAgIDEyMSwgICAxMjIsICAgMTMyLCAgIDEzNCwgICAxMzYsICAgMTM4LCAgIDE0MSwgICAxNDMsCisgICAgIDE0NywgICAxNTEsICAgMTU1LCAgIDE1OSwgICAxNjMsICAgMTY3LCAgIDE3MSwgICAxNzUsICAgMTc5LCAgIDE4MywKKyAgICAgMTg3LCAgIDE5MCwgICAxOTQsICAgMTk1LCAgIDE5OCwgICAyMDMsICAgMjA1LCAgIDIwOSwgICAyMTEsICAgMjEyLAorICAgICAyMTUsICAgMjE3LCAgIDIxOCwgICAyMjMsICAgMjI2LCAgIDIzMSwgICAyMzYsICAgMjM3LCAgIDI0MCwgICAyNDIsCisgICAgIDI0NCwgICAyNDYsICAgMjQ4LCAgIDI1MCwgICAyNTIsICAgMjUzCit9OworCisvKiBZWVJIUyAtLSBBIGAtMSctc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHJ1bGVzJyBSSFMuICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5cmhzW10gPQoreworICAgICAgNTAsICAgICAwLCAgICAtMSwgICAgLTEsICAgIDUyLCAgICAtMSwgICAgNTMsICAgIC0xLCAgICA1MiwgICAgLTEsCisgICAgICA1NywgICAgLTEsICAgIDU3LCAgICA1MiwgICAgLTEsICAgIDMyLCAgICA2NSwgICAgNTQsICAgIDExLCAgICA1MSwKKyAgICAgIC0xLCAgICAtMSwgICAgMTQsICAgIDY1LCAgICAtMSwgICAgNTMsICAgIC0xLCAgICAgNywgICAgNjQsICAgICA4LAorICAgICAgLTEsICAgIC0xLCAgICAzMiwgICAgLTEsICAgIC0xLCAgICA0MywgICAgNTEsICAgIDQ2LCAgICAtMSwgICAgMzEsCisgICAgICA2NSwgICAgMTEsICAgIC0xLCAgICA0NywgICAgNjQsICAgIDExLCAgICAtMSwgICAgNjcsICAgIDYwLCAgICA2NSwKKyAgICAgIDExLCAgICAtMSwgICAgNjcsICAgIDM0LCAgICA2NSwgICAgNjAsICAgIDY1LCAgICAxMSwgICAgLTEsICAgIDM3LAorICAgICAgNjUsICAgIDExLCAgICAtMSwgICAgMjcsICAgIDU2LCAgICA0NywgICAgMzAsICAgIDY1LCAgICA0MywgICAgNTEsCisgICAgICA0NiwgICAgLTEsICAgIDM5LCAgICA2NSwgICAgNDMsICAgIDYyLCAgICA0NiwgICAgLTEsICAgIDI4LCAgICA2MSwKKyAgICAgIDQzLCAgICA1MSwgICAgNDYsICAgIC0xLCAgICAzMywgICAgNjUsICAgIDQzLCAgICA1MSwgICAgNDYsICAgIC0xLAorICAgICAgMjMsICAgIDY0LCAgICA0MywgICAgNTEsICAgIDQ2LCAgICAtMSwgICAgNDIsICAgIDYxLCAgICA0MywgICAgNTEsCisgICAgICA0NiwgICAgLTEsICAgIDI4LCAgICA2MSwgICAgNDMsICAgIDUxLCAgICA0NiwgICAgMjUsICAgIDU3LCAgICAtMSwKKyAgICAgIDU2LCAgICAzOCwgICAgNDcsICAgIDU1LCAgICA1NywgICAgLTEsICAgIDM0LCAgICA2NywgICAgNTcsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAyMCwgICAgNzAsICAgIDQ3LCAgICA3MiwgICAgNDMsICAgIDU4LCAgICA0OCwgICAgNTksCisgICAgICA0NiwgICAgLTEsICAgIDE0LCAgICAtMSwgICAgIDksICAgIC0xLCAgICAxNywgICAgLTEsICAgIDI0LCAgICAxNCwKKyAgICAgIC0xLCAgICA2NywgICAgLTEsICAgIDYxLCAgICAxNCwgICAgNjEsICAgIC0xLCAgICA2MSwgICAgIDQsICAgIDYxLAorICAgICAgLTEsICAgIDYxLCAgICAxMiwgICAgNjEsICAgIC0xLCAgICA2MSwgICAgMTMsICAgIDYxLCAgICAtMSwgICAgNjEsCisgICAgICAxNSwgICAgNjEsICAgIC0xLCAgICA2MSwgICAgMTYsICAgIDYxLCAgICAtMSwgICAgNjEsICAgICA1LCAgICA2MSwKKyAgICAgIC0xLCAgICA2MSwgICAgIDYsICAgIDYxLCAgICAtMSwgICAgNjEsICAgIDQ0LCAgICA2MSwgICAgLTEsICAgIDYxLAorICAgICAgNDUsICAgIDYxLCAgICAtMSwgICAgNjcsICAgIDMwLCAgICA2NSwgICAgLTEsICAgICAzLCAgICA2MSwgICAgLTEsCisgICAgICAgNywgICAgNjEsICAgICA4LCAgICAtMSwgICAgLTEsICAgIDYzLCAgICA2MiwgICAgLTEsICAgIDIyLCAgICA0NywKKyAgICAgIDEwLCAgICA1MSwgICAgLTEsICAgIDY1LCAgICAtMSwgICAgNjUsICAgIDEwLCAgICA2NCwgICAgLTEsICAgIDY2LAorICAgICAgLTEsICAgIC0xLCAgICA2NiwgICAgNjcsICAgIC0xLCAgICA0NywgICAgLTEsICAgIC0xLCAgICAxOCwgICAgNjgsCisgICAgICA2OSwgICAgMTksICAgIC0xLCAgICA0NywgICAgNjQsICAgIC0xLCAgICAzNCwgICAgNjcsICAgIDQ3LCAgICA2NCwKKyAgICAgIC0xLCAgICAzNCwgICAgNjcsICAgIDM3LCAgICA2NSwgICAgLTEsICAgIC0xLCAgICA3MCwgICAgNzEsICAgIC0xLAorICAgICAgNDEsICAgIC0xLCAgICA0MCwgICAgLTEsICAgIDI5LCAgICAtMSwgICAgMzYsICAgIC0xLCAgICAzNSwgICAgLTEsCisgICAgICAyNiwgICAgLTEsICAgIC0xLCAgICAyMSwgICAgNjUsICAgIC0xCit9OworCisvKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5cmxpbmVbXSA9Cit7CisgICAgICAgMCwgICAxMzksICAgMTM5LCAgIDE0MSwgICAxNTIsICAgMTU0LCAgIDE1OCwgICAxNjAsICAgMTYyLCAgIDE2NywKKyAgICAgMTcwLCAgIDE3MiwgICAxNzYsICAgMTc5LCAgIDE4MiwgICAxODUsICAgMTg4LCAgIDE5MCwgICAxOTIsICAgMTk0LAorICAgICAxOTYsICAgMTk4LCAgIDIwMCwgICAyMDIsICAgMjA0LCAgIDIwNiwgICAyMDgsICAgMjEwLCAgIDIxMiwgICAyMTQsCisgICAgIDIxNiwgICAyMTksICAgMjIxLCAgIDIxOCwgICAyMzAsICAgMjMyLCAgIDIzNCwgICAyMzYsICAgMjQzLCAgIDI0NSwKKyAgICAgMjQ3LCAgIDI0OSwgICAyNTEsICAgMjUzLCAgIDI1NSwgICAyNTcsICAgMjU5LCAgIDI2MSwgICAyNjMsICAgMjY1LAorICAgICAyNjcsICAgMjY5LCAgIDI4MSwgICAyODIsICAgMjg2LCAgIDI5NSwgICAyOTcsICAgMzA3LCAgIDMxMiwgICAzMTMsCisgICAgIDMxNywgICAzMTksICAgMzE5LCAgIDMyOCwgICAzMzAsICAgMzMyLCAgIDM0MywgICAzNDQsICAgMzQ4LCAgIDM1MCwKKyAgICAgMzUyLCAgIDM1NCwgICAzNTYsICAgMzU4LCAgIDM2OCwgICAzNjkKK307CisjZW5kaWYKKworI2lmIFlZREVCVUcgfHwgWVlFUlJPUl9WRVJCT1NFIHx8IFlZVE9LRU5fVEFCTEUKKy8qIFlZVE5BTUVbU1lNQk9MLU5VTV0gLS0gU3RyaW5nIG5hbWUgb2YgdGhlIHN5bWJvbCBTWU1CT0wtTlVNLgorICAgRmlyc3QsIHRoZSB0ZXJtaW5hbHMsIHRoZW4sIHN0YXJ0aW5nIGF0IFlZTlRPS0VOUywgbm9udGVybWluYWxzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB5eXRuYW1lW10gPQoreworICAiJGVuZCIsICJlcnJvciIsICIkdW5kZWZpbmVkIiwgIl9CQU5HX3QiLCAiX0JBTkdfRVFVQUxTX3QiLCAiX0FNUEVSX3QiLAorICAiX0FNUEVSQU1QRVJfdCIsICJfTFBBUkVOX3QiLCAiX1JQQVJFTl90IiwgIl9QTFVTX0VRVUFMU190IiwgIl9DT0xPTl90IiwKKyAgIl9TRU1JQ190IiwgIl9MQU5HTEVfdCIsICJfTEFOR0xFX0VRVUFMU190IiwgIl9FUVVBTFNfdCIsICJfUkFOR0xFX3QiLAorICAiX1JBTkdMRV9FUVVBTFNfdCIsICJfUVVFU1RJT05fRVFVQUxTX3QiLCAiX0xCUkFDS0VUX3QiLCAiX1JCUkFDS0VUX3QiLAorICAiQUNUSU9OU190IiwgIkJJTkRfdCIsICJDQVNFX3QiLCAiQ0xBU1NfdCIsICJERUZBVUxUX3QiLCAiRUxTRV90IiwKKyAgIkVYSVNUSU5HX3QiLCAiRk9SX3QiLCAiSUZfdCIsICJJR05PUkVfdCIsICJJTl90IiwgIklOQ0xVREVfdCIsCisgICJMT0NBTF90IiwgIk1PRFVMRV90IiwgIk9OX3QiLCAiUElFQ0VNRUFMX3QiLCAiUVVJRVRMWV90IiwgIlJFVFVSTl90IiwKKyAgIlJVTEVfdCIsICJTV0lUQ0hfdCIsICJUT0dFVEhFUl90IiwgIlVQREFURURfdCIsICJXSElMRV90IiwgIl9MQlJBQ0VfdCIsCisgICJfQkFSX3QiLCAiX0JBUkJBUl90IiwgIl9SQlJBQ0VfdCIsICJBUkciLCAiU1RSSU5HIiwgIiRhY2NlcHQiLCAicnVuIiwKKyAgImJsb2NrIiwgInJ1bGVzIiwgIm51bGwiLCAiYXNzaWduX2xpc3Rfb3B0IiwgImFyZ2xpc3Rfb3B0IiwgImxvY2FsX29wdCIsCisgICJydWxlIiwgIiRAMSIsICIkQDIiLCAiYXNzaWduIiwgImV4cHIiLCAiY2FzZXMiLCAiY2FzZSIsICJsb2wiLCAibGlzdCIsCisgICJsaXN0cCIsICJhcmciLCAiJEAzIiwgImZ1bmMiLCAiZWZsYWdzIiwgImVmbGFnIiwgImJpbmRsaXN0IiwgMAorfTsKKyNlbmRpZgorCisjIGlmZGVmIFlZUFJJTlQKKy8qIFlZVE9LTlVNW1lZTEVYLU5VTV0gLS0gSW50ZXJuYWwgdG9rZW4gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8KKyAgIHRva2VuIFlZTEVYLU5VTS4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQxNiB5eXRva251bVtdID0KK3sKKyAgICAgICAwLCAgIDI1NiwgICAyNTcsICAgMjU4LCAgIDI1OSwgICAyNjAsICAgMjYxLCAgIDI2MiwgICAyNjMsICAgMjY0LAorICAgICAyNjUsICAgMjY2LCAgIDI2NywgICAyNjgsICAgMjY5LCAgIDI3MCwgICAyNzEsICAgMjcyLCAgIDI3MywgICAyNzQsCisgICAgIDI3NSwgICAyNzYsICAgMjc3LCAgIDI3OCwgICAyNzksICAgMjgwLCAgIDI4MSwgICAyODIsICAgMjgzLCAgIDI4NCwKKyAgICAgMjg1LCAgIDI4NiwgICAyODcsICAgMjg4LCAgIDI4OSwgICAyOTAsICAgMjkxLCAgIDI5MiwgICAyOTMsICAgMjk0LAorICAgICAyOTUsICAgMjk2LCAgIDI5NywgICAyOTgsICAgMjk5LCAgIDMwMCwgICAzMDEsICAgMzAyLCAgIDMwMworfTsKKyMgZW5kaWYKKworLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjFbXSA9Cit7CisgICAgICAgMCwgICAgNDksICAgIDUwLCAgICA1MCwgICAgNTEsICAgIDUxLCAgICA1MiwgICAgNTIsICAgIDUyLCAgICA1MywKKyAgICAgIDU0LCAgICA1NCwgICAgNTUsICAgIDU1LCAgICA1NiwgICAgNTYsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LAorICAgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsCisgICAgICA1NywgICAgNTgsICAgIDU5LCAgICA1NywgICAgNjAsICAgIDYwLCAgICA2MCwgICAgNjAsICAgIDYxLCAgICA2MSwKKyAgICAgIDYxLCAgICA2MSwgICAgNjEsICAgIDYxLCAgICA2MSwgICAgNjEsICAgIDYxLCAgICA2MSwgICAgNjEsICAgIDYxLAorICAgICAgNjEsICAgIDYxLCAgICA2MiwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjQsICAgIDY1LCAgICA2NiwgICAgNjYsCisgICAgICA2NywgICAgNjgsICAgIDY3LCAgICA2OSwgICAgNjksICAgIDY5LCAgICA3MCwgICAgNzAsICAgIDcxLCAgICA3MSwKKyAgICAgIDcxLCAgICA3MSwgICAgNzEsICAgIDcxLCAgICA3MiwgICAgNzIKK307CisKKy8qIFlZUjJbWVlOXSAtLSBOdW1iZXIgb2Ygc3ltYm9scyBjb21wb3NpbmcgcmlnaHQgaGFuZCBzaWRlIG9mIHJ1bGUgWVlOLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlyMltdID0KK3sKKyAgICAgICAwLCAgICAgMiwgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDUsICAgICAwLAorICAgICAgIDIsICAgICAxLCAgICAgMywgICAgIDAsICAgICAxLCAgICAgMCwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDQsCisgICAgICAgNiwgICAgIDMsICAgICA4LCAgICAgNSwgICAgIDUsICAgICA1LCAgICAgNSwgICAgIDUsICAgICA3LCAgICAgNSwKKyAgICAgICAzLCAgICAgMCwgICAgIDAsICAgICA5LCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAzLAorICAgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsCisgICAgICAgMiwgICAgIDMsICAgICAwLCAgICAgMiwgICAgIDQsICAgICAxLCAgICAgMywgICAgIDEsICAgICAwLCAgICAgMiwKKyAgICAgICAxLCAgICAgMCwgICAgIDQsICAgICAyLCAgICAgNCwgICAgIDQsICAgICAwLCAgICAgMiwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAwLCAgICAgMgorfTsKKworLyogWVlERUZBQ1RbU1RBVEUtTkFNRV0gLS0gRGVmYXVsdCBydWxlIHRvIHJlZHVjZSB3aXRoIGluIHN0YXRlCisgICBTVEFURS1OVU0gd2hlbiBZWVRBQkxFIGRvZXNuJ3Qgc3BlY2lmeSBzb21ldGhpbmcgZWxzZSB0byBkby4gIFplcm8KKyAgIG1lYW5zIHRoZSBkZWZhdWx0IGlzIGFuIGVycm9yLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlkZWZhY3RbXSA9Cit7CisgICAgICAgMiwgICAgNjEsICAgIDY2LCAgICA1OCwgICAgMTUsICAgICAwLCAgICA1OCwgICAgNTgsICAgIDU4LCAgICAgMCwKKyAgICAgIDU4LCAgICA1OCwgICAgIDAsICAgICA5LCAgICA2MCwgICAgIDAsICAgICAzLCAgICAgMCwgICAgIDYsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgNTUsICAgIDU3LCAgICAxNCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNjAsCisgICAgICAgMCwgICAgMzgsICAgICAwLCAgICAgOSwgICAgIDAsICAgIDE1LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICA1LCAgICAgNCwgICAgIDAsICAgICAxLCAgICAgMCwgICAgIDcsICAgIDM1LCAgICAzNCwgICAgMzYsICAgICAwLAorICAgICAgNTgsICAgIDU4LCAgICAgMCwgICAgNTgsICAgICAwLCAgICA3MywgICAgNzAsICAgIDcyLCAgICA3MSwgICAgNjksCisgICAgICA2OCwgICAgNzQsICAgIDY3LCAgICAgOSwgICAgNTgsICAgIDU5LCAgICAgMCwgICAgNTAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgOSwgICAgIDAsICAgICAwLAorICAgICAgNTgsICAgIDE3LCAgICA1OCwgICAgMTEsICAgICAwLCAgICAgOSwgICAgMzAsICAgIDIxLCAgICA1MiwgICAgIDksCisgICAgICAxNiwgICAgMTgsICAgIDEzLCAgICAzNywgICAgIDAsICAgICAwLCAgICAgMCwgICAgNjMsICAgIDYyLCAgICA1OCwKKyAgICAgICAwLCAgICAgMCwgICAgNTYsICAgIDU4LCAgICA1MSwgICAgNDAsICAgIDQ1LCAgICA0NiwgICAgNDEsICAgIDQyLAorICAgICAgMzksICAgIDQzLCAgICA0NCwgICAgIDAsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDEwLCAgICAgOSwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgIDUyLCAgICAgMCwgICAgNTgsICAgIDE1LCAgICA1OCwgICAgMTksICAgIDU4LCAgICA1OCwKKyAgICAgIDc1LCAgICAzMSwgICAgMjYsICAgICAwLCAgICAyNCwgICAgIDgsICAgIDI1LCAgICAgMCwgICAgMjMsICAgIDUzLAorICAgICAgMjcsICAgICAwLCAgICAyOSwgICAgIDAsICAgIDY1LCAgICA2NCwgICAgIDAsICAgICA5LCAgICAxNSwgICAgIDksCisgICAgICAxMiwgICAgMjAsICAgIDMyLCAgICAgMCwgICAgMjgsICAgIDU0LCAgICAgMCwgICAgMjIsICAgIDMzCit9OworCisvKiBZWURFRkdPVE9bTlRFUk0tTlVNXS4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5ZGVmZ290b1tdID0KK3sKKyAgICAgIC0xLCAgICAxNSwgICAgMzksICAgIDQwLCAgICA0MSwgICAgODQsICAgMTI1LCAgICAxNywgICAgMTgsICAgMTQ2LAorICAgICAxNTYsICAgIDUxLCAgICAzMCwgICAxMjEsICAgMTIyLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAzMSwgICAgMjAsCisgICAgICA1NCwgICAgMjEsICAgIDYyLCAgIDEwMAorfTsKKworLyogWVlQQUNUW1NUQVRFLU5VTV0gLS0gSW5kZXggaW4gWVlUQUJMRSBvZiB0aGUgcG9ydGlvbiBkZXNjcmliaW5nCisgICBTVEFURS1OVU0uICAqLworI2RlZmluZSBZWVBBQ1RfTklORiAtNDgKK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXlwYWN0W10gPQoreworICAgICAxNzAsICAgLTQ4LCAgIC00OCwgICAtNDgsICAgLTEyLCAgICAgNywgICAtNDgsICAgLTE3LCAgIC00OCwgICAgLTMsCisgICAgIC00OCwgICAtNDgsICAgICA3LCAgIDE3MCwgICAgIDEsICAgIDIyLCAgIC00OCwgICAgLTksICAgMTcwLCAgICAxOSwKKyAgICAgIC0yLCAgICA3OSwgICAgLTYsICAgIDI5LCAgICAtMywgICAtNDgsICAgICAyLCAgICAgNywgICAgIDcsICAgLTQ4LAorICAgICAxMzgsICAgIDIwLCAgICA0NCwgICAgNDUsICAgIDE4LCAgIDE5NiwgICAgNTEsICAgIDI2LCAgIDE1MSwgICAgMjQsCisgICAgIC00OCwgICAtNDgsICAgIDYyLCAgIC00OCwgICAgMjcsICAgLTQ4LCAgIC00OCwgICAtNDgsICAgLTQ4LCAgICA2MSwKKyAgICAgLTQ4LCAgIC00OCwgICAgLTMsICAgLTQ4LCAgICA2NywgICAtNDgsICAgLTQ4LCAgIC00OCwgICAtNDgsICAgLTQ4LAorICAgICAtNDgsICAgIDU4LCAgIC00OCwgICAxNzAsICAgLTQ4LCAgIC00OCwgICAgNTAsICAgLTQ4LCAgICA1MiwgICAgIDcsCisgICAgICAgNywgICAgIDcsICAgICA3LCAgICAgNywgICAgIDcsICAgICA3LCAgICAgNywgICAxNzAsICAgICA3LCAgICAgNywKKyAgICAgLTQ4LCAgIC00OCwgICAtNDgsICAgLTQ4LCAgICA3MCwgICAxNzAsICAgLTQ4LCAgIC00OCwgICAgODcsICAgMTcwLAorICAgICAtNDgsICAgLTQ4LCAgICA5NCwgICAtNDgsICAgIDE3LCAgICA5OSwgICAtMjAsICAgLTQ4LCAgIC00OCwgICAtNDgsCisgICAgICA2OSwgICAgNzEsICAgLTQ4LCAgIC00OCwgICAtNDgsICAgIDkxLCAgIDE1NiwgICAxNTYsICAgLTQ4LCAgIC00OCwKKyAgICAgIDkxLCAgIC00OCwgICAtNDgsICAgIDc3LCAgICA3OCwgICAgNzgsICAgLTQ4LCAgIC00OCwgICAxNzAsICAgIDgxLAorICAgICAgNjYsICAgIDgyLCAgICA4NywgICAgOTUsICAgLTQ4LCAgIDE5NiwgICAtNDgsICAgLTQ4LCAgIC00OCwgICAtNDgsCisgICAgIC00OCwgICAtNDgsICAgLTQ4LCAgICA5NywgICAxMTIsICAgLTQ4LCAgIC00OCwgICAxMzUsICAgLTQ4LCAgIC00OCwKKyAgICAgLTQ4LCAgIDE1MCwgICAtNDgsICAgMTQ4LCAgIC00OCwgICAtNDgsICAgIDk4LCAgIDE3MCwgICAxOTYsICAgMTcwLAorICAgICAtNDgsICAgLTQ4LCAgIC00OCwgICAxMTUsICAgLTQ4LCAgIC00OCwgICAxMTYsICAgLTQ4LCAgIC00OAorfTsKKworLyogWVlQR09UT1tOVEVSTS1OVU1dLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXlwZ290b1tdID0KK3sKKyAgICAgLTQ4LCAgIC00OCwgICAtNDcsICAgICA1LCAgIDE0MCwgICAtNDgsICAgLTQ4LCAgIDE3MSwgICAtMjcsICAgLTQ4LAorICAgICAtNDgsICAgIDgwLCAgICA2MCwgICAgNTQsICAgLTQ4LCAgIC0xMywgICAgLTQsICAgLTQ4LCAgICAgMCwgICAtNDgsCisgICAgIC00OCwgICAtNDgsICAgLTQ4LCAgIC00OAorfTsKKworLyogWVlUQUJMRVtZWVBBQ1RbU1RBVEUtTlVNXV0uICBXaGF0IHRvIGRvIGluIHN0YXRlIFNUQVRFLU5VTS4gIElmCisgICBwb3NpdGl2ZSwgc2hpZnQgdGhhdCB0b2tlbi4gIElmIG5lZ2F0aXZlLCByZWR1Y2UgdGhlIHJ1bGUgd2hpY2gKKyAgIG51bWJlciBpcyB0aGUgb3Bwb3NpdGUuICBJZiB6ZXJvLCBkbyB3aGF0IFlZREVGQUNUIHNheXMuCisgICBJZiBZWVRBQkxFX05JTkYsIHN5bnRheCBlcnJvci4gICovCisjZGVmaW5lIFlZVEFCTEVfTklORiAtNTkKK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXl0YWJsZVtdID0KK3sKKyAgICAgIDE5LCAgICA0MiwgICAgMzIsICAgIDMzLCAgICAzNCwgICAgMTYsICAgIDM2LCAgICAzNywgICAgODYsICAgIDM1LAorICAgICAgMjcsICAgLTU4LCAgIC01OCwgICAgMTksICAgIDI4LCAgICAgMSwgICAxMDEsICAgMTI4LCAgICAxOSwgICAtNTgsCisgICAgICAyNSwgICAtMTQsICAgIDQzLCAgICA0NSwgICAgNjUsICAgICAxLCAgICA0NiwgICAxMjksICAgIDQ2LCAgICA0NCwKKyAgICAgMTEzLCAgICA0NywgICAgNTIsICAgIDQ3LCAgICA0OCwgICAgMTksICAgIDQ4LCAgICA2MywgICAxMTksICAgIDY0LAorICAgICAgOTcsICAgIDQ5LCAgIDEyMywgICAgNDksICAgIDI5LCAgICA1MywgICAgOTQsICAgIDk1LCAgIC01OCwgICAgNjYsCisgICAgICA4MCwgICAxMDIsICAgIDk2LCAgICA1MCwgICAgMjksICAgIDgxLCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA4MiwKKyAgICAgMTA0LCAgICA4NSwgICAgODcsICAgIDE5LCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgIDg4LAorICAgICAgOTAsICAgMTM1LCAgICAzOCwgICAgOTEsICAgIDkyLCAgICA5MywgICAxMTYsICAgIDE5LCAgIDExNywgICAgOTksCisgICAgIDEwMywgICAxMTgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDE5LCAgICA5OCwgICAgNjcsICAgIDY4LCAgICAxOSwKKyAgICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAxMzAsICAgIDc4LCAgICA3OSwgICAxNDIsICAgMTMzLAorICAgICAxNTMsICAgMTI0LCAgIDE1NSwgICAgNzIsICAgIDczLCAgICA1NSwgICAgNzUsICAgIDc2LCAgICA1NiwgICAxMjAsCisgICAgIDEyNywgICAxNDEsICAgMTMxLCAgIDEzNywgICAgNTcsICAgIDU4LCAgIDE0NSwgICAxMzIsICAgIDE5LCAgICA1OSwKKyAgICAgIDYwLCAgIDE1NCwgICAxNDMsICAgMTM0LCAgIDE0NCwgICAgMTksICAgIDYxLCAgIDEzNiwgICAxMzgsICAgMTA1LAorICAgICAxMDYsICAgMTA3LCAgIDEwOCwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsICAgMTQ4LCAgIDExNCwgICAxMTUsCisgICAgIDE0NywgICAxNDAsICAgIDY5LCAgICA3MCwgICAgNzEsICAgMTQ5LCAgIDE1MiwgICAgMTksICAgIDE5LCAgICAxOSwKKyAgICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgNjksICAgIDcwLCAgICA3MSwgICAxNTAsICAgMTUxLAorICAgICAgNjksICAgMTU3LCAgIDE1OCwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICA3MiwgICAgNzMsCisgICAgICA3NCwgICAgNzUsICAgIDc2LCAgICA4MywgICAxMjYsICAgIDI2LCAgIDEzOSwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDEsICAgICAwLAorICAgICAgIDIsICAgICAwLCAgICAgMCwgICAgIDMsICAgIDg5LCAgICA3OCwgICAgNzksICAgICA0LCAgICAgNSwgICAgIDAsCisgICAgICAgMCwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICAwLCAgICAgMCwgICAgMTAsICAgLTE1LCAgICAxMSwKKyAgICAgICAwLCAgICAgMCwgICAgMTIsICAgIDEzLCAgICAgMSwgICAgIDAsICAgICAyLCAgICAxNCwgICAgIDAsICAgICAzLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDQsICAgICA1LCAgICAgMCwgICAgIDAsICAgICA2LCAgICAyNSwgICAgIDgsCisgICAgICAgOSwgICAgIDAsICAgICAwLCAgICAxMCwgICAgIDAsICAgIDExLCAgICAgMCwgICAgIDAsICAgIDEyLCAgICAxMywKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgIDE0Cit9OworCitzdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5Y2hlY2tbXSA9Cit7CisgICAgICAgMCwgICAgMTQsICAgICA2LCAgICAgNywgICAgIDgsICAgICAwLCAgICAxMCwgICAgMTEsICAgIDM1LCAgICAgOSwKKyAgICAgICAzLCAgICAxMCwgICAgMTEsICAgIDEzLCAgICAgNywgICAgMTgsICAgIDYzLCAgICAzNywgICAgMTgsICAgIDE4LAorICAgICAgMzIsICAgIDM4LCAgICAgMCwgICAgMTgsICAgIDI0LCAgICAxOCwgICAgIDksICAgIDQ3LCAgICAgOSwgICAgMzgsCisgICAgICA3NywgICAgMTQsICAgIDM0LCAgICAxNCwgICAgMTcsICAgIDM1LCAgICAxNywgICAgNDMsICAgIDg1LCAgICAxMCwKKyAgICAgIDUzLCAgICAyNCwgICAgODksICAgIDI0LCAgICA0NywgICAgNDcsICAgIDUwLCAgICA1MSwgICAgNDcsICAgIDQ3LAorICAgICAgMzAsICAgIDY0LCAgICA1MiwgICAgMzQsICAgIDQ3LCAgICAxMSwgICAgIDQsICAgICA1LCAgICAgNiwgICAgMTQsCisgICAgICAgOCwgICAgNDMsICAgIDExLCAgICA2MywgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICA0MywKKyAgICAgIDQ2LCAgIDExOCwgICAgMTIsICAgIDExLCAgICA0NywgICAgMTQsICAgIDgwLCAgICA3NywgICAgODIsICAgIDIxLAorICAgICAgMzAsICAgIDExLCAgICAgNCwgICAgIDUsICAgICA2LCAgICA4NSwgICAgMTksICAgIDI3LCAgICAyOCwgICAgODksCisgICAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDk5LCAgICA0NCwgICAgNDUsICAgMTI1LCAgIDEwMywKKyAgICAgMTQ3LCAgICAgNywgICAxNDksICAgIDEyLCAgICAxMywgICAgMjYsICAgIDE1LCAgICAxNiwgICAgMjksICAgIDIyLAorICAgICAgMTEsICAgMTI0LCAgICA0MywgICAgNDcsICAgIDM1LCAgICAzNiwgICAxMjksICAgIDQ2LCAgIDExOCwgICAgNDAsCisgICAgICA0MSwgICAxNDgsICAgMTI2LCAgICA0NiwgICAxMjgsICAgMTI1LCAgICA0NywgICAgNDYsICAgIDQ2LCAgICA2OSwKKyAgICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAyNSwgICAgNzgsICAgIDc5LAorICAgICAgNDMsICAgIDQ2LCAgICAgNCwgICAgIDUsICAgICA2LCAgICAxMCwgICAgNDgsICAgMTQ3LCAgIDE0OCwgICAxNDksCisgICAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA4LCAgICAxMSwKKyAgICAgICA0LCAgICA0NiwgICAgNDYsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTIsICAgIDEzLAorICAgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMzMsICAgIDk0LCAgICAgNCwgICAxMjIsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDE4LCAgICAtMSwKKyAgICAgIDIwLCAgICAtMSwgICAgLTEsICAgIDIzLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICAyNywgICAgMjgsICAgIC0xLAorICAgICAgLTEsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LCAgICAtMSwgICAgLTEsICAgIDM3LCAgICAzOCwgICAgMzksCisgICAgICAtMSwgICAgLTEsICAgIDQyLCAgICA0MywgICAgMTgsICAgIC0xLCAgICAyMCwgICAgNDcsICAgIC0xLCAgICAyMywKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDI3LCAgICAyOCwgICAgLTEsICAgIC0xLCAgICAzMSwgICAgMzIsICAgIDMzLAorICAgICAgMzQsICAgIC0xLCAgICAtMSwgICAgMzcsICAgIC0xLCAgICAzOSwgICAgLTEsICAgIC0xLCAgICA0MiwgICAgNDMsCisgICAgICAtMSwgICAgLTEsICAgIC0xLCAgICA0NworfTsKKworLyogWVlTVE9TW1NUQVRFLU5VTV0gLS0gVGhlIChpbnRlcm5hbCBudW1iZXIgb2YgdGhlKSBhY2Nlc3NpbmcKKyAgIHN5bWJvbCBvZiBzdGF0ZSBTVEFURS1OVU0uICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXN0b3NbXSA9Cit7CisgICAgICAgMCwgICAgMTgsICAgIDIwLCAgICAyMywgICAgMjcsICAgIDI4LCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwKKyAgICAgIDM3LCAgICAzOSwgICAgNDIsICAgIDQzLCAgICA0NywgICAgNTAsICAgIDUyLCAgICA1NiwgICAgNTcsICAgIDY3LAorICAgICAgNjgsICAgIDcwLCAgICA2NCwgICAgNjUsICAgIDY2LCAgICAzMiwgICAgNTYsICAgICAzLCAgICAgNywgICAgNDcsCisgICAgICA2MSwgICAgNjcsICAgIDY1LCAgICA2NSwgICAgNjUsICAgIDY3LCAgICA2NSwgICAgNjUsICAgIDYxLCAgICA1MSwKKyAgICAgIDUyLCAgICA1MywgICAgNjQsICAgICAwLCAgICAzOCwgICAgNTIsICAgICA5LCAgICAxNCwgICAgMTcsICAgIDI0LAorICAgICAgMzQsICAgIDYwLCAgICAzNCwgICAgNDcsICAgIDY5LCAgICAyNiwgICAgMjksICAgIDM1LCAgICAzNiwgICAgNDAsCisgICAgICA0MSwgICAgNDcsICAgIDcxLCAgICA0MywgICAgMTAsICAgIDY3LCAgICA0NywgICAgNjEsICAgIDYxLCAgICAgNCwKKyAgICAgICA1LCAgICAgNiwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICA0MywgICAgNDQsICAgIDQ1LAorICAgICAgMzAsICAgIDExLCAgICAxNCwgICAgNTMsICAgIDU0LCAgICA0MywgICAgNTcsICAgIDExLCAgICA0MywgICAgNDMsCisgICAgICA0NiwgICAgMTEsICAgIDQ3LCAgICAxNCwgICAgNjUsICAgIDY1LCAgICA2NywgICAgNjQsICAgIDE5LCAgICAyMSwKKyAgICAgIDcyLCAgICA1MSwgICAgNjQsICAgIDMwLCAgICAgOCwgICAgNjEsICAgIDYxLCAgICA2MSwgICAgNjEsICAgIDYxLAorICAgICAgNjEsICAgIDYxLCAgICA2MSwgICAgNTEsICAgIDYxLCAgICA2MSwgICAgNjUsICAgIDY1LCAgICAxMSwgICAgNTEsCisgICAgICAyMiwgICAgNjIsICAgIDYzLCAgICA1MSwgICAgIDcsICAgIDU1LCAgICA2MCwgICAgMTEsICAgIDM3LCAgICA0NywKKyAgICAgIDY1LCAgICA0MywgICAgNDYsICAgIDY1LCAgICA0NiwgICAgNTEsICAgIDQ2LCAgICA0NywgICAgNDYsICAgIDYyLAorICAgICAgNDYsICAgIDY0LCAgICA1NywgICAgNjUsICAgIDY1LCAgICA2NCwgICAgNTgsICAgIDQzLCAgICAyNSwgICAgMTAsCisgICAgICAgOCwgICAgMTEsICAgIDQ4LCAgICA1MSwgICAgNTcsICAgIDUxLCAgICA1OSwgICAgNDYsICAgIDQ2Cit9OworCisjZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCisjZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKKyNkZWZpbmUgWVlFTVBUWQkJKC0yKQorI2RlZmluZSBZWUVPRgkJMAorCisjZGVmaW5lIFlZQUNDRVBUCWdvdG8geXlhY2NlcHRsYWIKKyNkZWZpbmUgWVlBQk9SVAkJZ290byB5eWFib3J0bGFiCisjZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJvcmxhYgorCisKKy8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLiAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkKKyAgIHRvIGVhc2UgdGhlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCisgICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gIEhvd2V2ZXIsCisgICBZWUZBSUwgYXBwZWFycyB0byBiZSBpbiB1c2UuICBOZXZlcnRoZWxlc3MsIGl0IGlzIGZvcm1hbGx5IGRlcHJlY2F0ZWQKKyAgIGluIEJpc29uIDIuNC4yJ3MgTkVXUyBlbnRyeSwgd2hlcmUgYSBwbGFuIHRvIHBoYXNlIGl0IG91dCBpcworICAgZGlzY3Vzc2VkLiAgKi8KKworI2RlZmluZSBZWUZBSUwJCWdvdG8geXllcnJsYWIKKyNpZiBkZWZpbmVkIFlZRkFJTAorICAvKiBUaGlzIGlzIGhlcmUgdG8gc3VwcHJlc3Mgd2FybmluZ3MgZnJvbSB0aGUgR0NDIGNwcCdzCisgICAgIC1XdW51c2VkLW1hY3Jvcy4gIE5vcm1hbGx5IHdlIGRvbid0IHdvcnJ5IGFib3V0IHRoYXQgd2FybmluZywgYnV0CisgICAgIHNvbWUgdXNlcnMgZG8sIGFuZCB3ZSB3YW50IHRvIG1ha2UgaXQgZWFzeSBmb3IgdXNlcnMgdG8gcmVtb3ZlCisgICAgIFlZRkFJTCB1c2VzLCB3aGljaCB3aWxsIHByb2R1Y2Ugd2FybmluZ3MgZnJvbSBCaXNvbiAyLjUuICAqLworI2VuZGlmCisKKyNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQorCisjZGVmaW5lIFlZQkFDS1VQKFRva2VuLCBWYWx1ZSkJCQkJCVwKK2RvCQkJCQkJCQlcCisgIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgeXljaGFyID0gKFRva2VuKTsJCQkJCQlcCisgICAgICB5eWx2YWwgPSAoVmFsdWUpOwkJCQkJCVwKKyAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAorICAgICAgWVlQT1BTVEFDSyAoMSk7CQkJCQkJXAorICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCisgICAgfQkJCQkJCQkJXAorICBlbHNlCQkJCQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgeXllcnJvciAoWVlfKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIikpOyBcCisgICAgICBZWUVSUk9SOwkJCQkJCQlcCisgICAgfQkJCQkJCQkJXAord2hpbGUgKFlZSUQgKDApKQorCisKKyNkZWZpbmUgWVlURVJST1IJMQorI2RlZmluZSBZWUVSUkNPREUJMjU2CisKKworLyogWVlMTE9DX0RFRkFVTFQgLS0gU2V0IENVUlJFTlQgdG8gc3BhbiBmcm9tIFJIU1sxXSB0byBSSFNbTl0uCisgICBJZiBOIGlzIDAsIHRoZW4gc2V0IENVUlJFTlQgdG8gdGhlIGVtcHR5IGxvY2F0aW9uIHdoaWNoIGVuZHMKKyAgIHRoZSBwcmV2aW91cyBzeW1ib2w6IFJIU1swXSAoYWx3YXlzIGRlZmluZWQpLiAgKi8KKworI2RlZmluZSBZWVJIU0xPQyhSaHMsIEspICgoUmhzKVtLXSkKKyNpZm5kZWYgWVlMTE9DX0RFRkFVTFQKKyMgZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikJCQkJXAorICAgIGRvCQkJCQkJCQkJXAorICAgICAgaWYgKFlZSUQgKE4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJewkJCQkJCQkJXAorCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2xpbmU7CVwKKwkgIChDdXJyZW50KS5maXJzdF9jb2x1bW4gPSBZWVJIU0xPQyAoUmhzLCAxKS5maXJzdF9jb2x1bW47CVwKKwkgIChDdXJyZW50KS5sYXN0X2xpbmUgICAgPSBZWVJIU0xPQyAoUmhzLCBOKS5sYXN0X2xpbmU7CQlcCisJICAoQ3VycmVudCkubGFzdF9jb2x1bW4gID0gWVlSSFNMT0MgKFJocywgTikubGFzdF9jb2x1bW47CVwKKwl9CQkJCQkJCQlcCisgICAgICBlbHNlCQkJCQkJCQlcCisJewkJCQkJCQkJXAorCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IChDdXJyZW50KS5sYXN0X2xpbmUgICA9CQlcCisJICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfbGluZTsJCQkJXAorCSAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IChDdXJyZW50KS5sYXN0X2NvbHVtbiA9CQlcCisJICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfY29sdW1uOwkJCQlcCisJfQkJCQkJCQkJXAorICAgIHdoaWxlIChZWUlEICgwKSkKKyNlbmRpZgorCisKKy8qIFlZX0xPQ0FUSU9OX1BSSU5UIC0tIFByaW50IHRoZSBsb2NhdGlvbiBvbiB0aGUgc3RyZWFtLgorICAgVGhpcyBtYWNybyB3YXMgbm90IG1hbmRhdGVkIG9yaWdpbmFsbHk6IGRlZmluZSBvbmx5IGlmIHdlIGtub3cKKyAgIHdlIHdvbid0IGJyZWFrIHVzZXIgY29kZTogd2hlbiB0aGVzZSBhcmUgdGhlIGxvY2F0aW9ucyB3ZSBrbm93LiAgKi8KKworI2lmbmRlZiBZWV9MT0NBVElPTl9QUklOVAorIyBpZiBkZWZpbmVkIFlZTFRZUEVfSVNfVFJJVklBTCAmJiBZWUxUWVBFX0lTX1RSSVZJQUwKKyMgIGRlZmluZSBZWV9MT0NBVElPTl9QUklOVChGaWxlLCBMb2MpCQkJXAorICAgICBmcHJpbnRmIChGaWxlLCAiJWQuJWQtJWQuJWQiLAkJCVwKKwkgICAgICAoTG9jKS5maXJzdF9saW5lLCAoTG9jKS5maXJzdF9jb2x1bW4sCVwKKwkgICAgICAoTG9jKS5sYXN0X2xpbmUsICAoTG9jKS5sYXN0X2NvbHVtbikKKyMgZWxzZQorIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykgKCh2b2lkKSAwKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogWVlMRVggLS0gY2FsbGluZyBgeXlsZXgnIHdpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cy4gICovCisKKyNpZmRlZiBZWUxFWF9QQVJBTQorIyBkZWZpbmUgWVlMRVggeXlsZXggKFlZTEVYX1BBUkFNKQorI2Vsc2UKKyMgZGVmaW5lIFlZTEVYIHl5bGV4ICgpCisjZW5kaWYKKworLyogRW5hYmxlIGRlYnVnZ2luZyBpZiByZXF1ZXN0ZWQuICAqLworI2lmIFlZREVCVUcKKworIyBpZm5kZWYgWVlGUFJJTlRGCisjICBpbmNsdWRlIDxzdGRpby5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICBkZWZpbmUgWVlGUFJJTlRGIGZwcmludGYKKyMgZW5kaWYKKworIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCQkJXAorZG8gewkJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCQlcCisgICAgWVlGUFJJTlRGIEFyZ3M7CQkJCVwKK30gd2hpbGUgKFlZSUQgKDApKQorCisjIGRlZmluZSBZWV9TWU1CT0xfUFJJTlQoVGl0bGUsIFR5cGUsIFZhbHVlLCBMb2NhdGlvbikJCQkgIFwKK2RvIHsJCQkJCQkJCQkgIFwKKyAgaWYgKHl5ZGVidWcpCQkJCQkJCQkgIFwKKyAgICB7CQkJCQkJCQkJICBcCisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIFRpdGxlKTsJCQkJCSAgXAorICAgICAgeXlfc3ltYm9sX3ByaW50IChzdGRlcnIsCQkJCQkJICBcCisJCSAgVHlwZSwgVmFsdWUpOyBcCisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CQkJCQkJICBcCisgICAgfQkJCQkJCQkJCSAgXAorfSB3aGlsZSAoWVlJRCAoMCkpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgUHJpbnQgdGhpcyBzeW1ib2wgb24gWVlPVVRQVVQuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKkFSR1NVU0VEKi8KKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgdm9pZAoreXlfc3ltYm9sX3ZhbHVlX3ByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eV9zeW1ib2xfdmFsdWVfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwKQorICAgIEZJTEUgKnl5b3V0cHV0OworICAgIGludCB5eXR5cGU7CisgICAgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwOworI2VuZGlmCit7CisgIGlmICgheXl2YWx1ZXApCisgICAgcmV0dXJuOworIyBpZmRlZiBZWVBSSU5UCisgIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCisgICAgWVlQUklOVCAoeXlvdXRwdXQsIHl5dG9rbnVtW3l5dHlwZV0sICp5eXZhbHVlcCk7CisjIGVsc2UKKyAgWVlVU0UgKHl5b3V0cHV0KTsKKyMgZW5kaWYKKyAgc3dpdGNoICh5eXR5cGUpCisgICAgeworICAgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgUHJpbnQgdGhpcyBzeW1ib2wgb24gWVlPVVRQVVQuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIHZvaWQKK3l5X3N5bWJvbF9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlfc3ltYm9sX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKKyAgICBGSUxFICp5eW91dHB1dDsKKyAgICBpbnQgeXl0eXBlOworICAgIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcDsKKyNlbmRpZgoreworICBpZiAoeXl0eXBlIDwgWVlOVE9LRU5TKQorICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJ0b2tlbiAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKKyAgZWxzZQorICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJudGVybSAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKKworICB5eV9zeW1ib2xfdmFsdWVfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwKTsKKyAgWVlGUFJJTlRGICh5eW91dHB1dCwgIikiKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5X3N0YWNrX3ByaW50IC0tIFByaW50IHRoZSBzdGF0ZSBzdGFjayBmcm9tIGl0cyBCT1RUT00gdXAgdG8gaXRzIHwKK3wgVE9QIChpbmNsdWRlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgdm9pZAoreXlfc3RhY2tfcHJpbnQgKHl5dHlwZV9pbnQxNiAqeXlib3R0b20sIHl5dHlwZV9pbnQxNiAqeXl0b3ApCisjZWxzZQorc3RhdGljIHZvaWQKK3l5X3N0YWNrX3ByaW50ICh5eWJvdHRvbSwgeXl0b3ApCisgICAgeXl0eXBlX2ludDE2ICp5eWJvdHRvbTsKKyAgICB5eXR5cGVfaW50MTYgKnl5dG9wOworI2VuZGlmCit7CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiU3RhY2sgbm93Iik7CisgIGZvciAoOyB5eWJvdHRvbSA8PSB5eXRvcDsgeXlib3R0b20rKykKKyAgICB7CisgICAgICBpbnQgeXlib3QgPSAqeXlib3R0b207CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsIHl5Ym90KTsKKyAgICB9CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKK30KKworIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCQkJCVwKKyAgICB5eV9zdGFja19wcmludCAoKEJvdHRvbSksIChUb3ApKTsJCQkJXAorfSB3aGlsZSAoWVlJRCAoMCkpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFJlcG9ydCB0aGF0IHRoZSBZWVJVTEUgaXMgZ29pbmcgdG8gYmUgcmVkdWNlZC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIHZvaWQKK3l5X3JlZHVjZV9wcmludCAoWVlTVFlQRSAqeXl2c3AsIGludCB5eXJ1bGUpCisjZWxzZQorc3RhdGljIHZvaWQKK3l5X3JlZHVjZV9wcmludCAoeXl2c3AsIHl5cnVsZSkKKyAgICBZWVNUWVBFICp5eXZzcDsKKyAgICBpbnQgeXlydWxlOworI2VuZGlmCit7CisgIGludCB5eW5yaHMgPSB5eXIyW3l5cnVsZV07CisgIGludCB5eWk7CisgIHVuc2lnbmVkIGxvbmcgaW50IHl5bG5vID0geXlybGluZVt5eXJ1bGVdOworICBZWUZQUklOVEYgKHN0ZGVyciwgIlJlZHVjaW5nIHN0YWNrIGJ5IHJ1bGUgJWQgKGxpbmUgJWx1KTpcbiIsCisJICAgICB5eXJ1bGUgLSAxLCB5eWxubyk7CisgIC8qIFRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQuICAqLworICBmb3IgKHl5aSA9IDA7IHl5aSA8IHl5bnJoczsgeXlpKyspCisgICAgeworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgICAkJWQgPSAiLCB5eWkgKyAxKTsKKyAgICAgIHl5X3N5bWJvbF9wcmludCAoc3RkZXJyLCB5eXJoc1t5eXByaHNbeXlydWxlXSArIHl5aV0sCisJCSAgICAgICAmKHl5dnNwWyh5eWkgKyAxKSAtICh5eW5yaHMpXSkKKwkJICAgICAgIAkJICAgICAgICk7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CisgICAgfQorfQorCisjIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkJCVwKK2RvIHsJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCVwKKyAgICB5eV9yZWR1Y2VfcHJpbnQgKHl5dnNwLCBSdWxlKTsgXAorfSB3aGlsZSAoWVlJRCAoMCkpCisKKy8qIE5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UuICBJdCBpcyBsZWZ0IHVuaW5pdGlhbGl6ZWQgc28gdGhhdAorICAgbXVsdGlwbGUgcGFyc2VycyBjYW4gY29leGlzdC4gICovCitpbnQgeXlkZWJ1ZzsKKyNlbHNlIC8qICFZWURFQlVHICovCisjIGRlZmluZSBZWURQUklOVEYoQXJncykKKyMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQorIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCisjIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkKKyNlbmRpZiAvKiAhWVlERUJVRyAqLworCisKKy8qIFlZSU5JVERFUFRIIC0tIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzLiAgKi8KKyNpZm5kZWYJWVlJTklUREVQVEgKKyMgZGVmaW5lIFlZSU5JVERFUFRIIDIwMAorI2VuZGlmCisKKy8qIFlZTUFYREVQVEggLS0gbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8gKGVmZmVjdGl2ZSBvbmx5CisgICBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4KKworICAgRG8gbm90IG1ha2UgdGhpcyB2YWx1ZSB0b28gbGFyZ2U7IHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgaWYKKyAgIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSA8IFlZU1RBQ0tfQllURVMgKFlZTUFYREVQVEgpCisgICBldmFsdWF0ZWQgd2l0aCBpbmZpbml0ZS1wcmVjaXNpb24gaW50ZWdlciBhcml0aG1ldGljLiAgKi8KKworI2lmbmRlZiBZWU1BWERFUFRICisjIGRlZmluZSBZWU1BWERFUFRIIDEwMDAwCisjZW5kaWYKKworDAorCisjaWYgWVlFUlJPUl9WRVJCT1NFCisKKyMgaWZuZGVmIHl5c3RybGVuCisjICBpZiBkZWZpbmVkIF9fR0xJQkNfXyAmJiBkZWZpbmVkIF9TVFJJTkdfSAorIyAgIGRlZmluZSB5eXN0cmxlbiBzdHJsZW4KKyMgIGVsc2UKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIFlZU1RSLiAgKi8KKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgWVlTSVpFX1QKK3l5c3RybGVuIChjb25zdCBjaGFyICp5eXN0cikKKyNlbHNlCitzdGF0aWMgWVlTSVpFX1QKK3l5c3RybGVuICh5eXN0cikKKyAgICBjb25zdCBjaGFyICp5eXN0cjsKKyNlbmRpZgoreworICBZWVNJWkVfVCB5eWxlbjsKKyAgZm9yICh5eWxlbiA9IDA7IHl5c3RyW3l5bGVuXTsgeXlsZW4rKykKKyAgICBjb250aW51ZTsKKyAgcmV0dXJuIHl5bGVuOworfQorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZm5kZWYgeXlzdHBjcHkKKyMgIGlmIGRlZmluZWQgX19HTElCQ19fICYmIGRlZmluZWQgX1NUUklOR19IICYmIGRlZmluZWQgX0dOVV9TT1VSQ0UKKyMgICBkZWZpbmUgeXlzdHBjcHkgc3RwY3B5CisjICBlbHNlCisvKiBDb3B5IFlZU1JDIHRvIFlZREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyAnXDAnIGluCisgICBZWURFU1QuICAqLworI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3N0YXRpYyBjaGFyICoKK3l5c3RwY3B5IChjaGFyICp5eWRlc3QsIGNvbnN0IGNoYXIgKnl5c3JjKQorI2Vsc2UKK3N0YXRpYyBjaGFyICoKK3l5c3RwY3B5ICh5eWRlc3QsIHl5c3JjKQorICAgIGNoYXIgKnl5ZGVzdDsKKyAgICBjb25zdCBjaGFyICp5eXNyYzsKKyNlbmRpZgoreworICBjaGFyICp5eWQgPSB5eWRlc3Q7CisgIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3JjOworCisgIHdoaWxlICgoKnl5ZCsrID0gKnl5cysrKSAhPSAnXDAnKQorICAgIGNvbnRpbnVlOworCisgIHJldHVybiB5eWQgLSAxOworfQorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZm5kZWYgeXl0bmFtZXJyCisvKiBDb3B5IHRvIFlZUkVTIHRoZSBjb250ZW50cyBvZiBZWVNUUiBhZnRlciBzdHJpcHBpbmcgYXdheSB1bm5lY2Vzc2FyeQorICAgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcywgc28gdGhhdCBpdCdzIHN1aXRhYmxlIGZvciB5eWVycm9yLiAgVGhlCisgICBoZXVyaXN0aWMgaXMgdGhhdCBkb3VibGUtcXVvdGluZyBpcyB1bm5lY2Vzc2FyeSB1bmxlc3MgdGhlIHN0cmluZworICAgY29udGFpbnMgYW4gYXBvc3Ryb3BoZSwgYSBjb21tYSwgb3IgYmFja3NsYXNoIChvdGhlciB0aGFuCisgICBiYWNrc2xhc2gtYmFja3NsYXNoKS4gIFlZU1RSIGlzIHRha2VuIGZyb20geXl0bmFtZS4gIElmIFlZUkVTIGlzCisgICBudWxsLCBkbyBub3QgY29weTsgaW5zdGVhZCwgcmV0dXJuIHRoZSBsZW5ndGggb2Ygd2hhdCB0aGUgcmVzdWx0CisgICB3b3VsZCBoYXZlIGJlZW4uICAqLworc3RhdGljIFlZU0laRV9UCit5eXRuYW1lcnIgKGNoYXIgKnl5cmVzLCBjb25zdCBjaGFyICp5eXN0cikKK3sKKyAgaWYgKCp5eXN0ciA9PSAnIicpCisgICAgeworICAgICAgWVlTSVpFX1QgeXluID0gMDsKKyAgICAgIGNoYXIgY29uc3QgKnl5cCA9IHl5c3RyOworCisgICAgICBmb3IgKDs7KQorCXN3aXRjaCAoKisreXlwKQorCSAgeworCSAgY2FzZSAnXCcnOgorCSAgY2FzZSAnLCc6CisJICAgIGdvdG8gZG9fbm90X3N0cmlwX3F1b3RlczsKKworCSAgY2FzZSAnXFwnOgorCSAgICBpZiAoKisreXlwICE9ICdcXCcpCisJICAgICAgZ290byBkb19ub3Rfc3RyaXBfcXVvdGVzOworCSAgICAvKiBGYWxsIHRocm91Z2guICAqLworCSAgZGVmYXVsdDoKKwkgICAgaWYgKHl5cmVzKQorCSAgICAgIHl5cmVzW3l5bl0gPSAqeXlwOworCSAgICB5eW4rKzsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJyInOgorCSAgICBpZiAoeXlyZXMpCisJICAgICAgeXlyZXNbeXluXSA9ICdcMCc7CisJICAgIHJldHVybiB5eW47CisJICB9CisgICAgZG9fbm90X3N0cmlwX3F1b3RlczogOworICAgIH0KKworICBpZiAoISB5eXJlcykKKyAgICByZXR1cm4geXlzdHJsZW4gKHl5c3RyKTsKKworICByZXR1cm4geXlzdHBjcHkgKHl5cmVzLCB5eXN0cikgLSB5eXJlczsKK30KKyMgZW5kaWYKKworLyogQ29weSBpbnRvIFlZUkVTVUxUIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIHVuZXhwZWN0ZWQgdG9rZW4KKyAgIFlZQ0hBUiB3aGlsZSBpbiBzdGF0ZSBZWVNUQVRFLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLAorICAgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUuICBJZiBZWVJFU1VMVCBpcyBudWxsLCBkbyBub3QKKyAgIGNvcHkgYW55dGhpbmc7IGp1c3QgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZQorICAgY29waWVkLiAgQXMgYSBzcGVjaWFsIGNhc2UsIHJldHVybiAwIGlmIGFuIG9yZGluYXJ5ICJzeW50YXggZXJyb3IiCisgICBtZXNzYWdlIHdpbGwgZG8uICBSZXR1cm4gWVlTSVpFX01BWElNVU0gaWYgb3ZlcmZsb3cgb2NjdXJzIGR1cmluZworICAgc2l6ZSBjYWxjdWxhdGlvbi4gICovCitzdGF0aWMgWVlTSVpFX1QKK3l5c3ludGF4X2Vycm9yIChjaGFyICp5eXJlc3VsdCwgaW50IHl5c3RhdGUsIGludCB5eWNoYXIpCit7CisgIGludCB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisKKyAgaWYgKCEgKFlZUEFDVF9OSU5GIDwgeXluICYmIHl5biA8PSBZWUxBU1QpKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgeworICAgICAgaW50IHl5dHlwZSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOworICAgICAgWVlTSVpFX1QgeXlzaXplMCA9IHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXR5cGVdKTsKKyAgICAgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c2l6ZTA7CisgICAgICBZWVNJWkVfVCB5eXNpemUxOworICAgICAgaW50IHl5c2l6ZV9vdmVyZmxvdyA9IDA7CisgICAgICBlbnVtIHsgWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSA9IDUgfTsKKyAgICAgIGNoYXIgY29uc3QgKnl5YXJnW1lZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU1dOworICAgICAgaW50IHl5eDsKKworIyBpZiAwCisgICAgICAvKiBUaGlzIGlzIHNvIHhnZXR0ZXh0IHNlZXMgdGhlIHRyYW5zbGF0YWJsZSBmb3JtYXRzIHRoYXQgYXJlCisJIGNvbnN0cnVjdGVkIG9uIHRoZSBmbHkuICAqLworICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMiKTsKKyAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMiKTsKKyAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMiKTsKKyAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMiKTsKKyAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMgb3IgJXMiKTsKKyMgZW5kaWYKKyAgICAgIGNoYXIgKnl5Zm10OworICAgICAgY2hhciBjb25zdCAqeXlmOworICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXl1bmV4cGVjdGVkW10gPSAic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIjsKKyAgICAgIHN0YXRpYyBjaGFyIGNvbnN0IHl5ZXhwZWN0aW5nW10gPSAiLCBleHBlY3RpbmcgJXMiOworICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXlvcltdID0gIiBvciAlcyI7CisgICAgICBjaGFyIHl5Zm9ybWF0W3NpemVvZiB5eXVuZXhwZWN0ZWQKKwkJICAgICsgc2l6ZW9mIHl5ZXhwZWN0aW5nIC0gMQorCQkgICAgKyAoKFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0gLSAyKQorCQkgICAgICAgKiAoc2l6ZW9mIHl5b3IgLSAxKSldOworICAgICAgY2hhciBjb25zdCAqeXlwcmVmaXggPSB5eWV4cGVjdGluZzsKKworICAgICAgLyogU3RhcnQgWVlYIGF0IC1ZWU4gaWYgbmVnYXRpdmUgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbgorCSBZWUNIRUNLLiAgKi8KKyAgICAgIGludCB5eXhiZWdpbiA9IHl5biA8IDAgPyAteXluIDogMDsKKworICAgICAgLyogU3RheSB3aXRoaW4gYm91bmRzIG9mIGJvdGggeXljaGVjayBhbmQgeXl0bmFtZS4gICovCisgICAgICBpbnQgeXljaGVja2xpbSA9IFlZTEFTVCAtIHl5biArIDE7CisgICAgICBpbnQgeXl4ZW5kID0geXljaGVja2xpbSA8IFlZTlRPS0VOUyA/IHl5Y2hlY2tsaW0gOiBZWU5UT0tFTlM7CisgICAgICBpbnQgeXljb3VudCA9IDE7CisKKyAgICAgIHl5YXJnWzBdID0geXl0bmFtZVt5eXR5cGVdOworICAgICAgeXlmbXQgPSB5eXN0cGNweSAoeXlmb3JtYXQsIHl5dW5leHBlY3RlZCk7CisKKyAgICAgIGZvciAoeXl4ID0geXl4YmVnaW47IHl5eCA8IHl5eGVuZDsgKyt5eXgpCisJaWYgKHl5Y2hlY2tbeXl4ICsgeXluXSA9PSB5eXggJiYgeXl4ICE9IFlZVEVSUk9SKQorCSAgeworCSAgICBpZiAoeXljb3VudCA9PSBZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNKQorCSAgICAgIHsKKwkJeXljb3VudCA9IDE7CisJCXl5c2l6ZSA9IHl5c2l6ZTA7CisJCXl5Zm9ybWF0W3NpemVvZiB5eXVuZXhwZWN0ZWQgLSAxXSA9ICdcMCc7CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgeXlhcmdbeXljb3VudCsrXSA9IHl5dG5hbWVbeXl4XTsKKwkgICAgeXlzaXplMSA9IHl5c2l6ZSArIHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXhdKTsKKwkgICAgeXlzaXplX292ZXJmbG93IHw9ICh5eXNpemUxIDwgeXlzaXplKTsKKwkgICAgeXlzaXplID0geXlzaXplMTsKKwkgICAgeXlmbXQgPSB5eXN0cGNweSAoeXlmbXQsIHl5cHJlZml4KTsKKwkgICAgeXlwcmVmaXggPSB5eW9yOworCSAgfQorCisgICAgICB5eWYgPSBZWV8oeXlmb3JtYXQpOworICAgICAgeXlzaXplMSA9IHl5c2l6ZSArIHl5c3RybGVuICh5eWYpOworICAgICAgeXlzaXplX292ZXJmbG93IHw9ICh5eXNpemUxIDwgeXlzaXplKTsKKyAgICAgIHl5c2l6ZSA9IHl5c2l6ZTE7CisKKyAgICAgIGlmICh5eXNpemVfb3ZlcmZsb3cpCisJcmV0dXJuIFlZU0laRV9NQVhJTVVNOworCisgICAgICBpZiAoeXlyZXN1bHQpCisJeworCSAgLyogQXZvaWQgc3ByaW50ZiwgYXMgdGhhdCBpbmZyaW5nZXMgb24gdGhlIHVzZXIncyBuYW1lIHNwYWNlLgorCSAgICAgRG9uJ3QgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgZXZlbiBpZiB0aGUgdHJhbnNsYXRpb24KKwkgICAgIHByb2R1Y2VkIGEgc3RyaW5nIHdpdGggdGhlIHdyb25nIG51bWJlciBvZiAiJXMicy4gICovCisJICBjaGFyICp5eXAgPSB5eXJlc3VsdDsKKwkgIGludCB5eWkgPSAwOworCSAgd2hpbGUgKCgqeXlwID0gKnl5ZikgIT0gJ1wwJykKKwkgICAgeworCSAgICAgIGlmICgqeXlwID09ICclJyAmJiB5eWZbMV0gPT0gJ3MnICYmIHl5aSA8IHl5Y291bnQpCisJCXsKKwkJICB5eXAgKz0geXl0bmFtZXJyICh5eXAsIHl5YXJnW3l5aSsrXSk7CisJCSAgeXlmICs9IDI7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICB5eXArKzsKKwkJICB5eWYrKzsKKwkJfQorCSAgICB9CisJfQorICAgICAgcmV0dXJuIHl5c2l6ZTsKKyAgICB9Cit9CisjZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCisMCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFJlbGVhc2UgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIHRoaXMgc3ltYm9sLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypBUkdTVVNFRCovCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIHZvaWQKK3l5ZGVzdHJ1Y3QgKGNvbnN0IGNoYXIgKnl5bXNnLCBpbnQgeXl0eXBlLCBZWVNUWVBFICp5eXZhbHVlcCkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlkZXN0cnVjdCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXApCisgICAgY29uc3QgY2hhciAqeXltc2c7CisgICAgaW50IHl5dHlwZTsKKyAgICBZWVNUWVBFICp5eXZhbHVlcDsKKyNlbmRpZgoreworICBZWVVTRSAoeXl2YWx1ZXApOworCisgIGlmICgheXltc2cpCisgICAgeXltc2cgPSAiRGVsZXRpbmciOworICBZWV9TWU1CT0xfUFJJTlQgKHl5bXNnLCB5eXR5cGUsIHl5dmFsdWVwLCB5eWxvY2F0aW9ucCk7CisKKyAgc3dpdGNoICh5eXR5cGUpCisgICAgeworCisgICAgICBkZWZhdWx0OgorCWJyZWFrOworICAgIH0KK30KKworLyogUHJldmVudCB3YXJuaW5ncyBmcm9tIC1XbWlzc2luZy1wcm90b3R5cGVzLiAgKi8KKyNpZmRlZiBZWVBBUlNFX1BBUkFNCisjaWYgZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCitpbnQgeXlwYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSk7CisjZWxzZQoraW50IHl5cGFyc2UgKCk7CisjZW5kaWYKKyNlbHNlIC8qICEgWVlQQVJTRV9QQVJBTSAqLworI2lmIGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cworaW50IHl5cGFyc2UgKHZvaWQpOworI2Vsc2UKK2ludCB5eXBhcnNlICgpOworI2VuZGlmCisjZW5kaWYgLyogISBZWVBBUlNFX1BBUkFNICovCisKKworLyogVGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLworaW50IHl5Y2hhcjsKKworLyogVGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8KK1lZU1RZUEUgeXlsdmFsOworCisvKiBOdW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzbyBmYXIuICAqLworaW50IHl5bmVycnM7CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5cGFyc2Ugb3IgeXlwdXNoX3BhcnNlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgWVlQQVJTRV9QQVJBTQorI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK2ludAoreXlwYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSkKKyNlbHNlCitpbnQKK3l5cGFyc2UgKFlZUEFSU0VfUEFSQU0pCisgICAgdm9pZCAqWVlQQVJTRV9QQVJBTTsKKyNlbmRpZgorI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQoraW50Cit5eXBhcnNlICh2b2lkKQorI2Vsc2UKK2ludAoreXlwYXJzZSAoKQorCisjZW5kaWYKKyNlbmRpZgoreworCisKKyAgICBpbnQgeXlzdGF0ZTsKKyAgICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KKyAgICBpbnQgeXllcnJzdGF0dXM7CisKKyAgICAvKiBUaGUgc3RhY2tzIGFuZCB0aGVpciB0b29sczoKKyAgICAgICBgeXlzcyc6IHJlbGF0ZWQgdG8gc3RhdGVzLgorICAgICAgIGB5eXZzJzogcmVsYXRlZCB0byBzZW1hbnRpYyB2YWx1ZXMuCisKKyAgICAgICBSZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMsIHRvIGFsbG93IHl5b3ZlcmZsb3cKKyAgICAgICB0byByZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlLiAgKi8KKworICAgIC8qIFRoZSBzdGF0ZSBzdGFjay4gICovCisgICAgeXl0eXBlX2ludDE2IHl5c3NhW1lZSU5JVERFUFRIXTsKKyAgICB5eXR5cGVfaW50MTYgKnl5c3M7CisgICAgeXl0eXBlX2ludDE2ICp5eXNzcDsKKworICAgIC8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjay4gICovCisgICAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07CisgICAgWVlTVFlQRSAqeXl2czsKKyAgICBZWVNUWVBFICp5eXZzcDsKKworICAgIFlZU0laRV9UIHl5c3RhY2tzaXplOworCisgIGludCB5eW47CisgIGludCB5eXJlc3VsdDsKKyAgLyogTG9va2FoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIuICAqLworICBpbnQgeXl0b2tlbjsKKyAgLyogVGhlIHZhcmlhYmxlcyB1c2VkIHRvIHJldHVybiBzZW1hbnRpYyB2YWx1ZSBhbmQgbG9jYXRpb24gZnJvbSB0aGUKKyAgICAgYWN0aW9uIHJvdXRpbmVzLiAgKi8KKyAgWVlTVFlQRSB5eXZhbDsKKworI2lmIFlZRVJST1JfVkVSQk9TRQorICAvKiBCdWZmZXIgZm9yIGVycm9yIG1lc3NhZ2VzLCBhbmQgaXRzIGFsbG9jYXRlZCBzaXplLiAgKi8KKyAgY2hhciB5eW1zZ2J1ZlsxMjhdOworICBjaGFyICp5eW1zZyA9IHl5bXNnYnVmOworICBZWVNJWkVfVCB5eW1zZ19hbGxvYyA9IHNpemVvZiB5eW1zZ2J1ZjsKKyNlbmRpZgorCisjZGVmaW5lIFlZUE9QU1RBQ0soTikgICAoeXl2c3AgLT0gKE4pLCB5eXNzcCAtPSAoTikpCisKKyAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIG9uIHRoZSBSSFMgb2YgdGhlIHJlZHVjZWQgcnVsZS4KKyAgICAgS2VlcCB0byB6ZXJvIHdoZW4gbm8gc3ltYm9sIHNob3VsZCBiZSBwb3BwZWQuICAqLworICBpbnQgeXlsZW4gPSAwOworCisgIHl5dG9rZW4gPSAwOworICB5eXNzID0geXlzc2E7CisgIHl5dnMgPSB5eXZzYTsKKyAgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKKworICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFydGluZyBwYXJzZVxuIikpOworCisgIHl5c3RhdGUgPSAwOworICB5eWVycnN0YXR1cyA9IDA7CisgIHl5bmVycnMgPSAwOworICB5eWNoYXIgPSBZWUVNUFRZOyAvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLworCisgIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCisgICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjaworICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCisgICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KKyAgeXlzc3AgPSB5eXNzOworICB5eXZzcCA9IHl5dnM7CisKKyAgZ290byB5eXNldHN0YXRlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXluZXdzdGF0ZSAtLSBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiB5eXN0YXRlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgeXluZXdzdGF0ZToKKyAgLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKKyAgICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiAgU28gcHVzaGluZyBhIHN0YXRlIGhlcmUgZXZlbnMgdGhlIHN0YWNrcy4gICovCisgIHl5c3NwKys7CisKKyB5eXNldHN0YXRlOgorICAqeXlzc3AgPSB5eXN0YXRlOworCisgIGlmICh5eXNzICsgeXlzdGFja3NpemUgLSAxIDw9IHl5c3NwKQorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCB1c2VkIHNpemUgb2YgdGhlIHRocmVlIHN0YWNrcywgaW4gZWxlbWVudHMuICAqLworICAgICAgWVlTSVpFX1QgeXlzaXplID0geXlzc3AgLSB5eXNzICsgMTsKKworI2lmZGVmIHl5b3ZlcmZsb3cKKyAgICAgIHsKKwkvKiBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gcmVhbGxvY2F0ZSB0aGUgc3RhY2suICBVc2UgY29waWVzIG9mCisJICAgdGhlc2Ugc28gdGhhdCB0aGUgJidzIGRvbid0IGZvcmNlIHRoZSByZWFsIG9uZXMgaW50bworCSAgIG1lbW9yeS4gICovCisJWVlTVFlQRSAqeXl2czEgPSB5eXZzOworCXl5dHlwZV9pbnQxNiAqeXlzczEgPSB5eXNzOworCisJLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YgdGhlCisJICAgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICBUaGlzIHVzZWQgdG8gYmUgYQorCSAgIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywgYnV0IHRoYXQgbWlnaHQKKwkgICBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KKwl5eW92ZXJmbG93IChZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSwKKwkJICAgICZ5eXNzMSwgeXlzaXplICogc2l6ZW9mICgqeXlzc3ApLAorCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCisJCSAgICAmeXlzdGFja3NpemUpOworCisJeXlzcyA9IHl5c3MxOworCXl5dnMgPSB5eXZzMTsKKyAgICAgIH0KKyNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKyMgaWZuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKKyAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7CisjIGVsc2UKKyAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLworICAgICAgaWYgKFlZTUFYREVQVEggPD0geXlzdGFja3NpemUpCisJZ290byB5eWV4aGF1c3RlZGxhYjsKKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoWVlNQVhERVBUSCA8IHl5c3RhY2tzaXplKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKworICAgICAgeworCXl5dHlwZV9pbnQxNiAqeXlzczEgPSB5eXNzOworCXVuaW9uIHl5YWxsb2MgKnl5cHRyID0KKwkgICh1bmlvbiB5eWFsbG9jICopIFlZU1RBQ0tfQUxMT0MgKFlZU1RBQ0tfQllURVMgKHl5c3RhY2tzaXplKSk7CisJaWYgKCEgeXlwdHIpCisJICBnb3RvIHl5ZXhoYXVzdGVkbGFiOworCVlZU1RBQ0tfUkVMT0NBVEUgKHl5c3NfYWxsb2MsIHl5c3MpOworCVlZU1RBQ0tfUkVMT0NBVEUgKHl5dnNfYWxsb2MsIHl5dnMpOworIyAgdW5kZWYgWVlTVEFDS19SRUxPQ0FURQorCWlmICh5eXNzMSAhPSB5eXNzYSkKKwkgIFlZU1RBQ0tfRlJFRSAoeXlzczEpOworICAgICAgfQorIyBlbmRpZgorI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKworICAgICAgeXlzc3AgPSB5eXNzICsgeXlzaXplIC0gMTsKKyAgICAgIHl5dnNwID0geXl2cyArIHl5c2l6ZSAtIDE7CisKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YWNrIHNpemUgaW5jcmVhc2VkIHRvICVsdVxuIiwKKwkJICAodW5zaWduZWQgbG9uZyBpbnQpIHl5c3RhY2tzaXplKSk7CisKKyAgICAgIGlmICh5eXNzICsgeXlzdGFja3NpemUgLSAxIDw9IHl5c3NwKQorCVlZQUJPUlQ7CisgICAgfQorCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKSk7CisKKyAgaWYgKHl5c3RhdGUgPT0gWVlGSU5BTCkKKyAgICBZWUFDQ0VQVDsKKworICBnb3RvIHl5YmFja3VwOworCisvKi0tLS0tLS0tLS0tLgorfCB5eWJhY2t1cC4gIHwKK2AtLS0tLS0tLS0tLSovCit5eWJhY2t1cDoKKworICAvKiBEbyBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiAgUmVhZCBhCisgICAgIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2thaGVhZCB0b2tlbi4gICovCisgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKyAgaWYgKHl5biA9PSBZWVBBQ1RfTklORikKKyAgICBnb3RvIHl5ZGVmYXVsdDsKKworICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9va2FoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLworCisgIC8qIFlZQ0hBUiBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRiBvciBhIHZhbGlkIGxvb2thaGVhZCBzeW1ib2wuICAqLworICBpZiAoeXljaGFyID09IFlZRU1QVFkpCisgICAgeworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKSk7CisgICAgICB5eWNoYXIgPSBZWUxFWDsKKyAgICB9CisKKyAgaWYgKHl5Y2hhciA8PSBZWUVPRikKKyAgICB7CisgICAgICB5eWNoYXIgPSB5eXRva2VuID0gWVlFT0Y7CisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKKyAgICAgIFlZX1NZTUJPTF9QUklOVCAoIk5leHQgdG9rZW4gaXMiLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKKyAgICB9CisKKyAgLyogSWYgdGhlIHByb3BlciBhY3Rpb24gb24gc2VlaW5nIHRva2VuIFlZVE9LRU4gaXMgdG8gcmVkdWNlIG9yIHRvCisgICAgIGRldGVjdCBhbiBlcnJvciwgdGFrZSB0aGF0IGFjdGlvbi4gICovCisgIHl5biArPSB5eXRva2VuOworICBpZiAoeXluIDwgMCB8fCBZWUxBU1QgPCB5eW4gfHwgeXljaGVja1t5eW5dICE9IHl5dG9rZW4pCisgICAgZ290byB5eWRlZmF1bHQ7CisgIHl5biA9IHl5dGFibGVbeXluXTsKKyAgaWYgKHl5biA8PSAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gMCB8fCB5eW4gPT0gWVlUQUJMRV9OSU5GKQorCWdvdG8geXllcnJsYWI7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisKKyAgLyogQ291bnQgdG9rZW5zIHNoaWZ0ZWQgc2luY2UgZXJyb3I7IGFmdGVyIHRocmVlLCB0dXJuIG9mZiBlcnJvcgorICAgICBzdGF0dXMuICAqLworICBpZiAoeXllcnJzdGF0dXMpCisgICAgeXllcnJzdGF0dXMtLTsKKworICAvKiBTaGlmdCB0aGUgbG9va2FoZWFkIHRva2VuLiAgKi8KKyAgWVlfU1lNQk9MX1BSSU5UICgiU2hpZnRpbmciLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKKworICAvKiBEaXNjYXJkIHRoZSBzaGlmdGVkIHRva2VuLiAgKi8KKyAgeXljaGFyID0gWVlFTVBUWTsKKworICB5eXN0YXRlID0geXluOworICAqKyt5eXZzcCA9IHl5bHZhbDsKKworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlkZWZhdWx0IC0tIGRvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlkZWZhdWx0OgorICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKKyAgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJsYWI7CisgIGdvdG8geXlyZWR1Y2U7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlyZWR1Y2UgLS0gRG8gYSByZWR1Y3Rpb24uICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlyZWR1Y2U6CisgIC8qIHl5biBpcyB0aGUgbnVtYmVyIG9mIGEgcnVsZSB0byByZWR1Y2Ugd2l0aC4gICovCisgIHl5bGVuID0geXlyMlt5eW5dOworCisgIC8qIElmIFlZTEVOIGlzIG5vbnplcm8sIGltcGxlbWVudCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYWN0aW9uOgorICAgICBgJCQgPSAkMScuCisKKyAgICAgT3RoZXJ3aXNlLCB0aGUgZm9sbG93aW5nIGxpbmUgc2V0cyBZWVZBTCB0byBnYXJiYWdlLgorICAgICBUaGlzIGJlaGF2aW9yIGlzIHVuZG9jdW1lbnRlZCBhbmQgQmlzb24KKyAgICAgdXNlcnMgc2hvdWxkIG5vdCByZWx5IHVwb24gaXQuICBBc3NpZ25pbmcgdG8gWVlWQUwKKyAgICAgdW5jb25kaXRpb25hbGx5IG1ha2VzIHRoZSBwYXJzZXIgYSBiaXQgc21hbGxlciwgYW5kIGl0IGF2b2lkcyBhCisgICAgIEdDQyB3YXJuaW5nIHRoYXQgWVlWQUwgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZC4gICovCisgIHl5dmFsID0geXl2c3BbMS15eWxlbl07CisKKworICBZWV9SRURVQ0VfUFJJTlQgKHl5bik7CisgIHN3aXRjaCAoeXluKQorICAgIHsKKyAgICAgICAgY2FzZSAzOgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMTQyICJqYW1ncmFtLnkiCisgICAgeyBwYXJzZV9zYXZlKCAoeXl2c3BbKDEpIC0gKDEpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNDoKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE1MyAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9ICh5eXZzcFsoMSkgLSAoMSldKS5wYXJzZTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNToKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE1NSAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9ICh5eXZzcFsoMSkgLSAoMSldKS5wYXJzZTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNjoKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE1OSAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9ICh5eXZzcFsoMSkgLSAoMSldKS5wYXJzZTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNzoKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE2MSAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9IHBydWxlcyggKHl5dnNwWygxKSAtICgyKV0pLnBhcnNlLCAoeXl2c3BbKDIpIC0gKDIpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgODoKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE2MyAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9IHBsb2NhbCggKHl5dnNwWygyKSAtICg1KV0pLnBhcnNlLCAoeXl2c3BbKDMpIC0gKDUpXSkucGFyc2UsICh5eXZzcFsoNSkgLSAoNSldKS5wYXJzZSApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMTY3ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcG51bGwoKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMTA6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAxNzEgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSAoeXl2c3BbKDIpIC0gKDIpXSkucGFyc2U7ICh5eXZhbCkubnVtYmVyID0gQVNTSUdOX1NFVDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMTE6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAxNzMgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSAoeXl2c3BbKDEpIC0gKDEpXSkucGFyc2U7ICh5eXZhbCkubnVtYmVyID0gQVNTSUdOX0FQUEVORDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMTI6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAxNzcgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSAoeXl2c3BbKDIpIC0gKDMpXSkucGFyc2U7IH0KKyAgICBicmVhazsKKworICBjYXNlIDEzOgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMTc5ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gUDA7IH0KKyAgICBicmVhazsKKworICBjYXNlIDE0OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMTgzICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLm51bWJlciA9IDE7IH0KKyAgICBicmVhazsKKworICBjYXNlIDE1OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMTg1ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLm51bWJlciA9IDA7IH0KKyAgICBicmVhazsKKworICBjYXNlIDE2OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMTg5ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gKHl5dnNwWygyKSAtICgzKV0pLnBhcnNlOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNzoKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE5MSAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9IHBpbmNsKCAoeXl2c3BbKDIpIC0gKDMpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMTg6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAxOTMgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwcnVsZSggKHl5dnNwWygxKSAtICgzKV0pLnN0cmluZywgKHl5dnNwWygyKSAtICgzKV0pLnBhcnNlICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDE5OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMTk1ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcHNldCggKHl5dnNwWygxKSAtICg0KV0pLnBhcnNlLCAoeXl2c3BbKDMpIC0gKDQpXSkucGFyc2UsICh5eXZzcFsoMikgLSAoNCldKS5udW1iZXIgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMjA6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAxOTcgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwc2V0MSggKHl5dnNwWygxKSAtICg2KV0pLnBhcnNlLCAoeXl2c3BbKDMpIC0gKDYpXSkucGFyc2UsICh5eXZzcFsoNSkgLSAoNildKS5wYXJzZSwgKHl5dnNwWyg0KSAtICg2KV0pLm51bWJlciApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMToKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE5OSAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9ICh5eXZzcFsoMikgLSAoMyldKS5wYXJzZTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMjI6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyMDEgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwZm9yKCAoeXl2c3BbKDMpIC0gKDgpXSkuc3RyaW5nLCAoeXl2c3BbKDUpIC0gKDgpXSkucGFyc2UsICh5eXZzcFsoNykgLSAoOCldKS5wYXJzZSwgKHl5dnNwWygyKSAtICg4KV0pLm51bWJlciApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMzoKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIwMyAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9IHBzd2l0Y2goICh5eXZzcFsoMikgLSAoNSldKS5wYXJzZSwgKHl5dnNwWyg0KSAtICg1KV0pLnBhcnNlICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI0OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMjA1ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcGlmKCAoeXl2c3BbKDIpIC0gKDUpXSkucGFyc2UsICh5eXZzcFsoNCkgLSAoNSldKS5wYXJzZSwgcG51bGwoKSApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNToKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIwNyAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9IHBtb2R1bGUoICh5eXZzcFsoMikgLSAoNSldKS5wYXJzZSwgKHl5dnNwWyg0KSAtICg1KV0pLnBhcnNlICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI2OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMjA5ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcGNsYXNzKCAoeXl2c3BbKDIpIC0gKDUpXSkucGFyc2UsICh5eXZzcFsoNCkgLSAoNSldKS5wYXJzZSApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNzoKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIxMSAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9IHB3aGlsZSggKHl5dnNwWygyKSAtICg1KV0pLnBhcnNlLCAoeXl2c3BbKDQpIC0gKDUpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMjg6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyMTMgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwaWYoICh5eXZzcFsoMikgLSAoNyldKS5wYXJzZSwgKHl5dnNwWyg0KSAtICg3KV0pLnBhcnNlLCAoeXl2c3BbKDcpIC0gKDcpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMjk6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyMTUgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwc2V0YyggKHl5dnNwWygzKSAtICg1KV0pLnN0cmluZywgKHl5dnNwWyg1KSAtICg1KV0pLnBhcnNlLCAoeXl2c3BbKDQpIC0gKDUpXSkucGFyc2UsICh5eXZzcFsoMSkgLSAoNSldKS5udW1iZXIgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMzA6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyMTcgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwb24oICh5eXZzcFsoMikgLSAoMyldKS5wYXJzZSwgKHl5dnNwWygzKSAtICgzKV0pLnBhcnNlICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDMxOgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMjE5ICJqYW1ncmFtLnkiCisgICAgeyB5eW1vZGUoIFNDQU5fU1RSSU5HICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDMyOgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMjIxICJqYW1ncmFtLnkiCisgICAgeyB5eW1vZGUoIFNDQU5fTk9STUFMICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDMzOgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMjIzICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcHNldGUoICh5eXZzcFsoMykgLSAoOSldKS5zdHJpbmcsKHl5dnNwWyg0KSAtICg5KV0pLnBhcnNlLCh5eXZzcFsoNykgLSAoOSldKS5zdHJpbmcsKHl5dnNwWygyKSAtICg5KV0pLm51bWJlciApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzNDoKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIzMSAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5udW1iZXIgPSBBU1NJR05fU0VUOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzNToKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIzMyAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5udW1iZXIgPSBBU1NJR05fQVBQRU5EOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzNjoKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIzNSAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5udW1iZXIgPSBBU1NJR05fREVGQVVMVDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMzc6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyMzcgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkubnVtYmVyID0gQVNTSUdOX0RFRkFVTFQ7IH0KKyAgICBicmVhazsKKworICBjYXNlIDM4OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMjQ0ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcGV2YWwoIEVYUFJfRVhJU1RTLCAoeXl2c3BbKDEpIC0gKDEpXSkucGFyc2UsIHBudWxsKCkgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMzk6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyNDYgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwZXZhbCggRVhQUl9FUVVBTFMsICh5eXZzcFsoMSkgLSAoMyldKS5wYXJzZSwgKHl5dnNwWygzKSAtICgzKV0pLnBhcnNlICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDQwOgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMjQ4ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcGV2YWwoIEVYUFJfTk9URVEsICh5eXZzcFsoMSkgLSAoMyldKS5wYXJzZSwgKHl5dnNwWygzKSAtICgzKV0pLnBhcnNlICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDQxOgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMjUwICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcGV2YWwoIEVYUFJfTEVTUywgKHl5dnNwWygxKSAtICgzKV0pLnBhcnNlLCAoeXl2c3BbKDMpIC0gKDMpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNDI6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyNTIgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwZXZhbCggRVhQUl9MRVNTRVEsICh5eXZzcFsoMSkgLSAoMyldKS5wYXJzZSwgKHl5dnNwWygzKSAtICgzKV0pLnBhcnNlICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDQzOgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMjU0ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcGV2YWwoIEVYUFJfTU9SRSwgKHl5dnNwWygxKSAtICgzKV0pLnBhcnNlLCAoeXl2c3BbKDMpIC0gKDMpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNDQ6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyNTYgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwZXZhbCggRVhQUl9NT1JFRVEsICh5eXZzcFsoMSkgLSAoMyldKS5wYXJzZSwgKHl5dnNwWygzKSAtICgzKV0pLnBhcnNlICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDQ1OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMjU4ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcGV2YWwoIEVYUFJfQU5ELCAoeXl2c3BbKDEpIC0gKDMpXSkucGFyc2UsICh5eXZzcFsoMykgLSAoMyldKS5wYXJzZSApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0NjoKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI2MCAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9IHBldmFsKCBFWFBSX0FORCwgKHl5dnNwWygxKSAtICgzKV0pLnBhcnNlLCAoeXl2c3BbKDMpIC0gKDMpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNDc6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyNjIgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwZXZhbCggRVhQUl9PUiwgKHl5dnNwWygxKSAtICgzKV0pLnBhcnNlLCAoeXl2c3BbKDMpIC0gKDMpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNDg6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyNjQgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwZXZhbCggRVhQUl9PUiwgKHl5dnNwWygxKSAtICgzKV0pLnBhcnNlLCAoeXl2c3BbKDMpIC0gKDMpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNDk6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyNjYgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwZXZhbCggRVhQUl9JTiwgKHl5dnNwWygxKSAtICgzKV0pLnBhcnNlLCAoeXl2c3BbKDMpIC0gKDMpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNTA6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyNjggImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwZXZhbCggRVhQUl9OT1QsICh5eXZzcFsoMikgLSAoMildKS5wYXJzZSwgcG51bGwoKSApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1MToKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI3MCAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9ICh5eXZzcFsoMikgLSAoMyldKS5wYXJzZTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNTI6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyODEgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBQMDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNTM6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyODMgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwbm9kZSggKHl5dnNwWygxKSAtICgyKV0pLnBhcnNlLCAoeXl2c3BbKDIpIC0gKDIpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNTQ6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyODcgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwc25vZGUoICh5eXZzcFsoMikgLSAoNCldKS5zdHJpbmcsICh5eXZzcFsoNCkgLSAoNCldKS5wYXJzZSApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1NToKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI5NiAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9IHBub2RlKCBQMCwgKHl5dnNwWygxKSAtICgxKV0pLnBhcnNlICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDU2OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMjk4ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcG5vZGUoICh5eXZzcFsoMykgLSAoMyldKS5wYXJzZSwgKHl5dnNwWygxKSAtICgzKV0pLnBhcnNlICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDU3OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMzA4ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gKHl5dnNwWygxKSAtICgxKV0pLnBhcnNlOyB5eW1vZGUoIFNDQU5fTk9STUFMICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDU4OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMzEyICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcG51bGwoKTsgeXltb2RlKCBTQ0FOX1BVTkNUICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDU5OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMzE0ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcGFwcGVuZCggKHl5dnNwWygxKSAtICgyKV0pLnBhcnNlLCAoeXl2c3BbKDIpIC0gKDIpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNjA6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAzMTggImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwbGlzdCggKHl5dnNwWygxKSAtICgxKV0pLnN0cmluZyApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2MToKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMxOSAiamFtZ3JhbS55IgorICAgIHsgeXltb2RlKCBTQ0FOX05PUk1BTCApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2MjoKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMyMCAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9ICh5eXZzcFsoMykgLSAoNCldKS5wYXJzZTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNjM6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAzMjkgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSBwcnVsZSggKHl5dnNwWygxKSAtICgyKV0pLnN0cmluZywgKHl5dnNwWygyKSAtICgyKV0pLnBhcnNlICk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDY0OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMzMxICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcG9uKCAoeXl2c3BbKDIpIC0gKDQpXSkucGFyc2UsIHBydWxlKCAoeXl2c3BbKDMpIC0gKDQpXSkuc3RyaW5nLCAoeXl2c3BbKDQpIC0gKDQpXSkucGFyc2UgKSApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2NToKKworLyogTGluZSAxNDY0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMzMyAiamFtZ3JhbS55IgorICAgIHsgKHl5dmFsKS5wYXJzZSA9IHBvbiggKHl5dnNwWygyKSAtICg0KV0pLnBhcnNlLCAoeXl2c3BbKDQpIC0gKDQpXSkucGFyc2UgKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNjY6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAzNDMgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkubnVtYmVyID0gMDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNjc6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAzNDUgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkubnVtYmVyID0gKHl5dnNwWygxKSAtICgyKV0pLm51bWJlciB8ICh5eXZzcFsoMikgLSAoMildKS5udW1iZXI7IH0KKyAgICBicmVhazsKKworICBjYXNlIDY4OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMzQ5ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLm51bWJlciA9IEVYRUNfVVBEQVRFRDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNjk6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAzNTEgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkubnVtYmVyID0gRVhFQ19UT0dFVEhFUjsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNzA6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAzNTMgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkubnVtYmVyID0gRVhFQ19JR05PUkU7IH0KKyAgICBicmVhazsKKworICBjYXNlIDcxOgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMzU1ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLm51bWJlciA9IEVYRUNfUVVJRVRMWTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNzI6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAzNTcgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkubnVtYmVyID0gRVhFQ19QSUVDRU1FQUw7IH0KKyAgICBicmVhazsKKworICBjYXNlIDczOgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMzU5ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLm51bWJlciA9IEVYRUNfRVhJU1RJTkc7IH0KKyAgICBicmVhazsKKworICBjYXNlIDc0OgorCisvKiBMaW5lIDE0NjQgb2YgeWFjYy5jICAqLworI2xpbmUgMzY4ICJqYW1ncmFtLnkiCisgICAgeyAoeXl2YWwpLnBhcnNlID0gcG51bGwoKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNzU6CisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAzNzAgImphbWdyYW0ueSIKKyAgICB7ICh5eXZhbCkucGFyc2UgPSAoeXl2c3BbKDIpIC0gKDIpXSkucGFyc2U7IH0KKyAgICBicmVhazsKKworCisKKy8qIExpbmUgMTQ2NCBvZiB5YWNjLmMgICovCisjbGluZSAyMTE4ICJ5LnRhYi5jIgorICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICBZWV9TWU1CT0xfUFJJTlQgKCItPiAkJCA9IiwgeXlyMVt5eW5dLCAmeXl2YWwsICZ5eWxvYyk7CisKKyAgWVlQT1BTVEFDSyAoeXlsZW4pOworICB5eWxlbiA9IDA7CisgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CisKKyAgKisreXl2c3AgPSB5eXZhbDsKKworICAvKiBOb3cgYHNoaWZ0JyB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uICBEZXRlcm1pbmUgd2hhdCBzdGF0ZQorICAgICB0aGF0IGdvZXMgdG8sIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0byBhbmQgdGhlIHJ1bGUKKyAgICAgbnVtYmVyIHJlZHVjZWQgYnkuICAqLworCisgIHl5biA9IHl5cjFbeXluXTsKKworICB5eXN0YXRlID0geXlwZ290b1t5eW4gLSBZWU5UT0tFTlNdICsgKnl5c3NwOworICBpZiAoMCA8PSB5eXN0YXRlICYmIHl5c3RhdGUgPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXlzdGF0ZV0gPT0gKnl5c3NwKQorICAgIHl5c3RhdGUgPSB5eXRhYmxlW3l5c3RhdGVdOworICBlbHNlCisgICAgeXlzdGF0ZSA9IHl5ZGVmZ290b1t5eW4gLSBZWU5UT0tFTlNdOworCisgIGdvdG8geXluZXdzdGF0ZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJsYWIgLS0gaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycmxhYjoKKyAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCisgIGlmICgheXllcnJzdGF0dXMpCisgICAgeworICAgICAgKyt5eW5lcnJzOworI2lmICEgWVlFUlJPUl9WRVJCT1NFCisgICAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvciIpKTsKKyNlbHNlCisgICAgICB7CisJWVlTSVpFX1QgeXlzaXplID0geXlzeW50YXhfZXJyb3IgKDAsIHl5c3RhdGUsIHl5Y2hhcik7CisJaWYgKHl5bXNnX2FsbG9jIDwgeXlzaXplICYmIHl5bXNnX2FsbG9jIDwgWVlTVEFDS19BTExPQ19NQVhJTVVNKQorCSAgeworCSAgICBZWVNJWkVfVCB5eWFsbG9jID0gMiAqIHl5c2l6ZTsKKwkgICAgaWYgKCEgKHl5c2l6ZSA8PSB5eWFsbG9jICYmIHl5YWxsb2MgPD0gWVlTVEFDS19BTExPQ19NQVhJTVVNKSkKKwkgICAgICB5eWFsbG9jID0gWVlTVEFDS19BTExPQ19NQVhJTVVNOworCSAgICBpZiAoeXltc2cgIT0geXltc2didWYpCisJICAgICAgWVlTVEFDS19GUkVFICh5eW1zZyk7CisJICAgIHl5bXNnID0gKGNoYXIgKikgWVlTVEFDS19BTExPQyAoeXlhbGxvYyk7CisJICAgIGlmICh5eW1zZykKKwkgICAgICB5eW1zZ19hbGxvYyA9IHl5YWxsb2M7CisJICAgIGVsc2UKKwkgICAgICB7CisJCXl5bXNnID0geXltc2didWY7CisJCXl5bXNnX2FsbG9jID0gc2l6ZW9mIHl5bXNnYnVmOworCSAgICAgIH0KKwkgIH0KKworCWlmICgwIDwgeXlzaXplICYmIHl5c2l6ZSA8PSB5eW1zZ19hbGxvYykKKwkgIHsKKwkgICAgKHZvaWQpIHl5c3ludGF4X2Vycm9yICh5eW1zZywgeXlzdGF0ZSwgeXljaGFyKTsKKwkgICAgeXllcnJvciAoeXltc2cpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgeXllcnJvciAoWVlfKCJzeW50YXggZXJyb3IiKSk7CisJICAgIGlmICh5eXNpemUgIT0gMCkKKwkgICAgICBnb3RvIHl5ZXhoYXVzdGVkbGFiOworCSAgfQorICAgICAgfQorI2VuZGlmCisgICAgfQorCisKKworICBpZiAoeXllcnJzdGF0dXMgPT0gMykKKyAgICB7CisgICAgICAvKiBJZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuCisJIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KKworICAgICAgaWYgKHl5Y2hhciA8PSBZWUVPRikKKwl7CisJICAvKiBSZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQuICAqLworCSAgaWYgKHl5Y2hhciA9PSBZWUVPRikKKwkgICAgWVlBQk9SVDsKKwl9CisgICAgICBlbHNlCisJeworCSAgeXlkZXN0cnVjdCAoIkVycm9yOiBkaXNjYXJkaW5nIiwKKwkJICAgICAgeXl0b2tlbiwgJnl5bHZhbCk7CisJICB5eWNoYXIgPSBZWUVNUFRZOworCX0KKyAgICB9CisKKyAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCisgICAgIHRva2VuLiAgKi8KKyAgZ290byB5eWVycmxhYjE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJyb3JsYWIgLS0gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgWVlFUlJPUi4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJvcmxhYjoKKworICAvKiBQYWNpZnkgY29tcGlsZXJzIGxpa2UgR0NDIHdoZW4gdGhlIHVzZXIgY29kZSBuZXZlciBpbnZva2VzCisgICAgIFlZRVJST1IgYW5kIHRoZSBsYWJlbCB5eWVycm9ybGFiIHRoZXJlZm9yZSBuZXZlciBhcHBlYXJzIGluIHVzZXIKKyAgICAgY29kZS4gICovCisgIGlmICgvKkNPTlNUQ09ORCovIDApCisgICAgIGdvdG8geXllcnJvcmxhYjsKKworICAvKiBEbyBub3QgcmVjbGFpbSB0aGUgc3ltYm9scyBvZiB0aGUgcnVsZSB3aGljaCBhY3Rpb24gdHJpZ2dlcmVkCisgICAgIHRoaXMgWVlFUlJPUi4gICovCisgIFlZUE9QU1RBQ0sgKHl5bGVuKTsKKyAgeXlsZW4gPSAwOworICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOworICB5eXN0YXRlID0gKnl5c3NwOworICBnb3RvIHl5ZXJybGFiMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJybGFiMSAtLSBjb21tb24gY29kZSBmb3IgYm90aCBzeW50YXggZXJyb3IgYW5kIFlZRVJST1IuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycmxhYjE6CisgIHl5ZXJyc3RhdHVzID0gMzsJLyogRWFjaCByZWFsIHRva2VuIHNoaWZ0ZWQgZGVjcmVtZW50cyB0aGlzLiAgKi8KKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKyAgICAgIGlmICh5eW4gIT0gWVlQQUNUX05JTkYpCisJeworCSAgeXluICs9IFlZVEVSUk9SOworCSAgaWYgKDAgPD0geXluICYmIHl5biA8PSBZWUxBU1QgJiYgeXljaGVja1t5eW5dID09IFlZVEVSUk9SKQorCSAgICB7CisJICAgICAgeXluID0geXl0YWJsZVt5eW5dOworCSAgICAgIGlmICgwIDwgeXluKQorCQlicmVhazsKKwkgICAgfQorCX0KKworICAgICAgLyogUG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgZXJyb3IgdG9rZW4uICAqLworICAgICAgaWYgKHl5c3NwID09IHl5c3MpCisJWVlBQk9SVDsKKworCisgICAgICB5eWRlc3RydWN0ICgiRXJyb3I6IHBvcHBpbmciLAorCQkgIHl5c3Rvc1t5eXN0YXRlXSwgeXl2c3ApOworICAgICAgWVlQT1BTVEFDSyAoMSk7CisgICAgICB5eXN0YXRlID0gKnl5c3NwOworICAgICAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKKyAgICB9CisKKyAgKisreXl2c3AgPSB5eWx2YWw7CisKKworICAvKiBTaGlmdCB0aGUgZXJyb3IgdG9rZW4uICAqLworICBZWV9TWU1CT0xfUFJJTlQgKCJTaGlmdGluZyIsIHl5c3Rvc1t5eW5dLCB5eXZzcCwgeXlsc3ApOworCisgIHl5c3RhdGUgPSB5eW47CisgIGdvdG8geXluZXdzdGF0ZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5YWNjZXB0bGFiIC0tIFlZQUNDRVBUIGNvbWVzIGhlcmUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWFjY2VwdGxhYjoKKyAgeXlyZXN1bHQgPSAwOworICBnb3RvIHl5cmV0dXJuOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWFib3J0bGFiIC0tIFlZQUJPUlQgY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWFib3J0bGFiOgorICB5eXJlc3VsdCA9IDE7CisgIGdvdG8geXlyZXR1cm47CisKKyNpZiAhZGVmaW5lZCh5eW92ZXJmbG93KSB8fCBZWUVSUk9SX1ZFUkJPU0UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlleGhhdXN0ZWRsYWIgLS0gbWVtb3J5IGV4aGF1c3Rpb24gY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXhoYXVzdGVkbGFiOgorICB5eWVycm9yIChZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSk7CisgIHl5cmVzdWx0ID0gMjsKKyAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyNlbmRpZgorCit5eXJldHVybjoKKyAgaWYgKHl5Y2hhciAhPSBZWUVNUFRZKQorICAgICB5eWRlc3RydWN0ICgiQ2xlYW51cDogZGlzY2FyZGluZyBsb29rYWhlYWQiLAorCQkgeXl0b2tlbiwgJnl5bHZhbCk7CisgIC8qIERvIG5vdCByZWNsYWltIHRoZSBzeW1ib2xzIG9mIHRoZSBydWxlIHdoaWNoIGFjdGlvbiB0cmlnZ2VyZWQKKyAgICAgdGhpcyBZWUFCT1JUIG9yIFlZQUNDRVBULiAgKi8KKyAgWVlQT1BTVEFDSyAoeXlsZW4pOworICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOworICB3aGlsZSAoeXlzc3AgIT0geXlzcykKKyAgICB7CisgICAgICB5eWRlc3RydWN0ICgiQ2xlYW51cDogcG9wcGluZyIsCisJCSAgeXlzdG9zWyp5eXNzcF0sIHl5dnNwKTsKKyAgICAgIFlZUE9QU1RBQ0sgKDEpOworICAgIH0KKyNpZm5kZWYgeXlvdmVyZmxvdworICBpZiAoeXlzcyAhPSB5eXNzYSkKKyAgICBZWVNUQUNLX0ZSRUUgKHl5c3MpOworI2VuZGlmCisjaWYgWVlFUlJPUl9WRVJCT1NFCisgIGlmICh5eW1zZyAhPSB5eW1zZ2J1ZikKKyAgICBZWVNUQUNLX0ZSRUUgKHl5bXNnKTsKKyNlbmRpZgorICAvKiBNYWtlIHN1cmUgWVlJRCBpcyB1c2VkLiAgKi8KKyAgcmV0dXJuIFlZSUQgKHl5cmVzdWx0KTsKK30KKworCisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2phbWdyYW0uaCBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2phbWdyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YxMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvamFtZ3JhbS5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjMuICAqLworCisvKiBTa2VsZXRvbiBpbnRlcmZhY2UgZm9yIEJpc29uJ3MgWWFjYy1saWtlIHBhcnNlcnMgaW4gQworICAgCisgICAgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisgICAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IGNyZWF0ZSBhIGxhcmdlciB3b3JrIHRoYXQgY29udGFpbnMKKyAgIHBhcnQgb3IgYWxsIG9mIHRoZSBCaXNvbiBwYXJzZXIgc2tlbGV0b24gYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCisgICB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgc28gbG9uZyBhcyB0aGF0IHdvcmsgaXNuJ3QgaXRzZWxmIGEKKyAgIHBhcnNlciBnZW5lcmF0b3IgdXNpbmcgdGhlIHNrZWxldG9uIG9yIGEgbW9kaWZpZWQgdmVyc2lvbiB0aGVyZW9mCisgICBhcyBhIHBhcnNlciBza2VsZXRvbi4gIEFsdGVybmF0aXZlbHksIGlmIHlvdSBtb2RpZnkgb3IgcmVkaXN0cmlidXRlCisgICB0aGUgcGFyc2VyIHNrZWxldG9uIGl0c2VsZiwgeW91IG1heSAoYXQgeW91ciBvcHRpb24pIHJlbW92ZSB0aGlzCisgICBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgc2tlbGV0b24gYW5kIHRoZSByZXN1bHRpbmcKKyAgIEJpc29uIG91dHB1dCBmaWxlcyB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIHdpdGhvdXQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbi4KKyAgIAorICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbgorICAgdmVyc2lvbiAyLjIgb2YgQmlzb24uICAqLworCisKKy8qIFRva2Vucy4gICovCisjaWZuZGVmIFlZVE9LRU5UWVBFCisjIGRlZmluZSBZWVRPS0VOVFlQRQorICAgLyogUHV0IHRoZSB0b2tlbnMgaW50byB0aGUgc3ltYm9sIHRhYmxlLCBzbyB0aGF0IEdEQiBhbmQgb3RoZXIgZGVidWdnZXJzCisgICAgICBrbm93IGFib3V0IHRoZW0uICAqLworICAgZW51bSB5eXRva2VudHlwZSB7CisgICAgIF9CQU5HX3QgPSAyNTgsCisgICAgIF9CQU5HX0VRVUFMU190ID0gMjU5LAorICAgICBfQU1QRVJfdCA9IDI2MCwKKyAgICAgX0FNUEVSQU1QRVJfdCA9IDI2MSwKKyAgICAgX0xQQVJFTl90ID0gMjYyLAorICAgICBfUlBBUkVOX3QgPSAyNjMsCisgICAgIF9QTFVTX0VRVUFMU190ID0gMjY0LAorICAgICBfQ09MT05fdCA9IDI2NSwKKyAgICAgX1NFTUlDX3QgPSAyNjYsCisgICAgIF9MQU5HTEVfdCA9IDI2NywKKyAgICAgX0xBTkdMRV9FUVVBTFNfdCA9IDI2OCwKKyAgICAgX0VRVUFMU190ID0gMjY5LAorICAgICBfUkFOR0xFX3QgPSAyNzAsCisgICAgIF9SQU5HTEVfRVFVQUxTX3QgPSAyNzEsCisgICAgIF9RVUVTVElPTl9FUVVBTFNfdCA9IDI3MiwKKyAgICAgX0xCUkFDS0VUX3QgPSAyNzMsCisgICAgIF9SQlJBQ0tFVF90ID0gMjc0LAorICAgICBBQ1RJT05TX3QgPSAyNzUsCisgICAgIEJJTkRfdCA9IDI3NiwKKyAgICAgQ0FTRV90ID0gMjc3LAorICAgICBDTEFTU190ID0gMjc4LAorICAgICBERUZBVUxUX3QgPSAyNzksCisgICAgIEVMU0VfdCA9IDI4MCwKKyAgICAgRVhJU1RJTkdfdCA9IDI4MSwKKyAgICAgRk9SX3QgPSAyODIsCisgICAgIElGX3QgPSAyODMsCisgICAgIElHTk9SRV90ID0gMjg0LAorICAgICBJTl90ID0gMjg1LAorICAgICBJTkNMVURFX3QgPSAyODYsCisgICAgIExPQ0FMX3QgPSAyODcsCisgICAgIE1PRFVMRV90ID0gMjg4LAorICAgICBPTl90ID0gMjg5LAorICAgICBQSUVDRU1FQUxfdCA9IDI5MCwKKyAgICAgUVVJRVRMWV90ID0gMjkxLAorICAgICBSRVRVUk5fdCA9IDI5MiwKKyAgICAgUlVMRV90ID0gMjkzLAorICAgICBTV0lUQ0hfdCA9IDI5NCwKKyAgICAgVE9HRVRIRVJfdCA9IDI5NSwKKyAgICAgVVBEQVRFRF90ID0gMjk2LAorICAgICBXSElMRV90ID0gMjk3LAorICAgICBfTEJSQUNFX3QgPSAyOTgsCisgICAgIF9CQVJfdCA9IDI5OSwKKyAgICAgX0JBUkJBUl90ID0gMzAwLAorICAgICBfUkJSQUNFX3QgPSAzMDEsCisgICAgIEFSRyA9IDMwMiwKKyAgICAgU1RSSU5HID0gMzAzCisgICB9OworI2VuZGlmCisvKiBUb2tlbnMuICAqLworI2RlZmluZSBfQkFOR190IDI1OAorI2RlZmluZSBfQkFOR19FUVVBTFNfdCAyNTkKKyNkZWZpbmUgX0FNUEVSX3QgMjYwCisjZGVmaW5lIF9BTVBFUkFNUEVSX3QgMjYxCisjZGVmaW5lIF9MUEFSRU5fdCAyNjIKKyNkZWZpbmUgX1JQQVJFTl90IDI2MworI2RlZmluZSBfUExVU19FUVVBTFNfdCAyNjQKKyNkZWZpbmUgX0NPTE9OX3QgMjY1CisjZGVmaW5lIF9TRU1JQ190IDI2NgorI2RlZmluZSBfTEFOR0xFX3QgMjY3CisjZGVmaW5lIF9MQU5HTEVfRVFVQUxTX3QgMjY4CisjZGVmaW5lIF9FUVVBTFNfdCAyNjkKKyNkZWZpbmUgX1JBTkdMRV90IDI3MAorI2RlZmluZSBfUkFOR0xFX0VRVUFMU190IDI3MQorI2RlZmluZSBfUVVFU1RJT05fRVFVQUxTX3QgMjcyCisjZGVmaW5lIF9MQlJBQ0tFVF90IDI3MworI2RlZmluZSBfUkJSQUNLRVRfdCAyNzQKKyNkZWZpbmUgQUNUSU9OU190IDI3NQorI2RlZmluZSBCSU5EX3QgMjc2CisjZGVmaW5lIENBU0VfdCAyNzcKKyNkZWZpbmUgQ0xBU1NfdCAyNzgKKyNkZWZpbmUgREVGQVVMVF90IDI3OQorI2RlZmluZSBFTFNFX3QgMjgwCisjZGVmaW5lIEVYSVNUSU5HX3QgMjgxCisjZGVmaW5lIEZPUl90IDI4MgorI2RlZmluZSBJRl90IDI4MworI2RlZmluZSBJR05PUkVfdCAyODQKKyNkZWZpbmUgSU5fdCAyODUKKyNkZWZpbmUgSU5DTFVERV90IDI4NgorI2RlZmluZSBMT0NBTF90IDI4NworI2RlZmluZSBNT0RVTEVfdCAyODgKKyNkZWZpbmUgT05fdCAyODkKKyNkZWZpbmUgUElFQ0VNRUFMX3QgMjkwCisjZGVmaW5lIFFVSUVUTFlfdCAyOTEKKyNkZWZpbmUgUkVUVVJOX3QgMjkyCisjZGVmaW5lIFJVTEVfdCAyOTMKKyNkZWZpbmUgU1dJVENIX3QgMjk0CisjZGVmaW5lIFRPR0VUSEVSX3QgMjk1CisjZGVmaW5lIFVQREFURURfdCAyOTYKKyNkZWZpbmUgV0hJTEVfdCAyOTcKKyNkZWZpbmUgX0xCUkFDRV90IDI5OAorI2RlZmluZSBfQkFSX3QgMjk5CisjZGVmaW5lIF9CQVJCQVJfdCAzMDAKKyNkZWZpbmUgX1JCUkFDRV90IDMwMQorI2RlZmluZSBBUkcgMzAyCisjZGVmaW5lIFNUUklORyAzMDMKKworCisKKworI2lmICEgZGVmaW5lZCBZWVNUWVBFICYmICEgZGVmaW5lZCBZWVNUWVBFX0lTX0RFQ0xBUkVECit0eXBlZGVmIGludCBZWVNUWVBFOworIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKKyMgZGVmaW5lIHl5c3R5cGUgWVlTVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KKyMgZGVmaW5lIFlZU1RZUEVfSVNfREVDTEFSRUQgMQorI2VuZGlmCisKK2V4dGVybiBZWVNUWVBFIHl5bHZhbDsKKworCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9qYW1ncmFtLnkgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9qYW1ncmFtLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzZjE1NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2phbWdyYW0ueQpAQCAtMCwwICsxLDM3MyBAQAorJXRva2VuIF9CQU5HX3QKKyV0b2tlbiBfQkFOR19FUVVBTFNfdAorJXRva2VuIF9BTVBFUl90CisldG9rZW4gX0FNUEVSQU1QRVJfdAorJXRva2VuIF9MUEFSRU5fdAorJXRva2VuIF9SUEFSRU5fdAorJXRva2VuIF9QTFVTX0VRVUFMU190CisldG9rZW4gX0NPTE9OX3QKKyV0b2tlbiBfU0VNSUNfdAorJXRva2VuIF9MQU5HTEVfdAorJXRva2VuIF9MQU5HTEVfRVFVQUxTX3QKKyV0b2tlbiBfRVFVQUxTX3QKKyV0b2tlbiBfUkFOR0xFX3QKKyV0b2tlbiBfUkFOR0xFX0VRVUFMU190CisldG9rZW4gX1FVRVNUSU9OX0VRVUFMU190CisldG9rZW4gX0xCUkFDS0VUX3QKKyV0b2tlbiBfUkJSQUNLRVRfdAorJXRva2VuIEFDVElPTlNfdAorJXRva2VuIEJJTkRfdAorJXRva2VuIENBU0VfdAorJXRva2VuIENMQVNTX3QKKyV0b2tlbiBERUZBVUxUX3QKKyV0b2tlbiBFTFNFX3QKKyV0b2tlbiBFWElTVElOR190CisldG9rZW4gRk9SX3QKKyV0b2tlbiBJRl90CisldG9rZW4gSUdOT1JFX3QKKyV0b2tlbiBJTl90CisldG9rZW4gSU5DTFVERV90CisldG9rZW4gTE9DQUxfdAorJXRva2VuIE1PRFVMRV90CisldG9rZW4gT05fdAorJXRva2VuIFBJRUNFTUVBTF90CisldG9rZW4gUVVJRVRMWV90CisldG9rZW4gUkVUVVJOX3QKKyV0b2tlbiBSVUxFX3QKKyV0b2tlbiBTV0lUQ0hfdAorJXRva2VuIFRPR0VUSEVSX3QKKyV0b2tlbiBVUERBVEVEX3QKKyV0b2tlbiBXSElMRV90CisldG9rZW4gX0xCUkFDRV90CisldG9rZW4gX0JBUl90CisldG9rZW4gX0JBUkJBUl90CisldG9rZW4gX1JCUkFDRV90CisvKgorICogQ29weXJpZ2h0IDE5OTMsIDIwMDAgQ2hyaXN0b3BoZXIgU2Vpd2FsZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiAgVGhpcyBmaWxlIGlzIEFMU086CisgKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyAqICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKy8qCisgKiBqYW1ncmFtLnl5IC0gamFtIGdyYW1tYXIKKyAqCisgKiAwNC8xMy85NCAoc2Vpd2FsZCkgLSBhZGRlZCBzaG9ydGhhbmQgTDAgZm9yIG51bGwgbGlzdCBwb2ludGVyCisgKiAwNi8wMS85NCAoc2Vpd2FsZCkgLSBuZXcgJ2FjdGlvbnMgZXhpc3RpbmcnIGRvZXMgZXhpc3Rpbmcgc291cmNlcworICogMDgvMjMvOTQgKHNlaXdhbGQpIC0gU3VwcG9ydCBmb3IgJys9JyAoYXBwZW5kIHRvIHZhcmlhYmxlKQorICogMDgvMzEvOTQgKHNlaXdhbGQpIC0gQWxsb3cgPz0gYXMgYWxpYXMgZm9yICJkZWZhdWx0ID0iLgorICogMDkvMTUvOTQgKHNlaXdhbGQpIC0gaWYgY29uZGl0aW9uYWxzIHRha2Ugb25seSBzaW5nbGUgYXJndW1lbnRzLCBzbworICoJCQl0aGF0ICdpZiBmb28gPT0gYmFyJyBnaXZlcyBzeW50YXggZXJyb3IgKHVzZSA9KS4KKyAqIDAyLzExLzk1IChzZWl3YWxkKSAtIHdoZW4gc2Nhbm5pbmcgYXJndW1lbnRzIHRvIHJ1bGVzLCBvbmx5IHRyZWF0CisgKgkJCXB1bmN0dWF0aW9uIGtleXdvcmRzIGFzIGtleXdvcmRzLiAgQWxsIGFyZyBsaXN0cworICoJCQlhcmUgdGVybWluYXRlZCB3aXRoIHB1bmN0dWF0aW9uIGtleXdvcmRzLgorICoKKyAqIDA5LzExLzAwIChzZWl3YWxkKSAtIFN1cHBvcnQgZm9yIGZ1bmN0aW9uIGNhbGxzOgorICoKKyAqCQlSdWxlcyBub3cgcmV0dXJuIGxpc3RzIChMSVNUICopLCByYXRoZXIgdGhhbiB2b2lkLgorICoKKyAqCQlOZXcgIlsgcnVsZSBdIiBzeW50YXggZXZhbHMgcnVsZSBpbnRvIGEgTElTVC4KKyAqCisgKgkJTGlzdHMgYXJlIG5vdyBnZW5lcmF0ZWQgYnkgY29tcGlsZV9saXN0KCkgYW5kCisgKgkJY29tcGlsZV9hcHBlbmQoKSwgYW5kIGFueSBvdGhlciBydWxlIHRoYXQgaW5kaXJlY3RseQorICoJCW1ha2VzIGEgbGlzdCwgcmF0aGVyIHRoYW4gYmVpbmcgYnVpbHQgZGlyZWN0bHkgaGVyZSwKKyAqCQlzbyB0aGF0IGxpc3RzIHZhbHVlcyBjYW4gY29udGFpbiBydWxlIGV2YWx1YXRpb25zLgorICoKKyAqCQlOZXcgJ3JldHVybicgcnVsZSBzZXRzIHRoZSByZXR1cm4gdmFsdWUsIHRob3VnaAorICoJCW90aGVyIHN0YXRlbWVudHMgYWxzbyBtYXkgaGF2ZSByZXR1cm4gdmFsdWVzLgorICoKKyAqCQkncnVuJyBwcm9kdWN0aW9uIHNwbGl0IGZyb20gJ2Jsb2NrJyBwcm9kdWN0aW9uIHNvCisgKgkJdGhhdCBlbXB0eSBibG9ja3MgY2FuIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KKyAqLworCisldG9rZW4gQVJHIFNUUklORworCislbGVmdCBfQkFSQkFSX3QgX0JBUl90CislbGVmdCBfQU1QRVJBTVBFUl90IF9BTVBFUl90CislbGVmdCBfRVFVQUxTX3QgX0JBTkdfRVFVQUxTX3QgSU5fdAorJWxlZnQgX0xBTkdMRV90IF9MQU5HTEVfRVFVQUxTX3QgX1JBTkdMRV90IF9SQU5HTEVfRVFVQUxTX3QKKyVsZWZ0IF9CQU5HX3QKKworJXsKKyNpbmNsdWRlICJqYW0uaCIKKworI2luY2x1ZGUgImxpc3RzLmgiCisjaW5jbHVkZSAicGFyc2UuaCIKKyNpbmNsdWRlICJzY2FuLmgiCisjaW5jbHVkZSAiY29tcGlsZS5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisKKyMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAJLyogZm9yIE9TRiBhbmQgb3RoZXIgbGVzcyBlbmRvd2VkIHlhY2NzICovCisKKyMgZGVmaW5lIEYwIC0xCisjIGRlZmluZSBQMCAoUEFSU0UgKikwCisjIGRlZmluZSBTMCAoT0JKRUNUICopMAorCisjIGRlZmluZSBwYXBwZW5kKCBsLHIgKSAgICAJcGFyc2VfbWFrZSggUEFSU0VfQVBQRU5ELGwscixQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBldmFsKCBjLGwsciApCXBhcnNlX21ha2UoIFBBUlNFX0VWQUwsbCxyLFAwLFMwLFMwLGMgKQorIyBkZWZpbmUgcGZvciggcyxsLHIseCApICAgIAlwYXJzZV9tYWtlKCBQQVJTRV9GT1JFQUNILGwscixQMCxzLFMwLHggKQorIyBkZWZpbmUgcGlmKCBsLHIsdCApCSAgCXBhcnNlX21ha2UoIFBBUlNFX0lGLGwscix0LFMwLFMwLDAgKQorIyBkZWZpbmUgcGluY2woIGwgKSAgICAgICAJcGFyc2VfbWFrZSggUEFSU0VfSU5DTFVERSxsLFAwLFAwLFMwLFMwLDAgKQorIyBkZWZpbmUgcGxpc3QoIHMgKQkgIAlwYXJzZV9tYWtlKCBQQVJTRV9MSVNULFAwLFAwLFAwLHMsUzAsMCApCisjIGRlZmluZSBwbG9jYWwoIGwscix0ICkgIAlwYXJzZV9tYWtlKCBQQVJTRV9MT0NBTCxsLHIsdCxTMCxTMCwwICkKKyMgZGVmaW5lIHBtb2R1bGUoIGwsciApCSAgCXBhcnNlX21ha2UoIFBBUlNFX01PRFVMRSxsLHIsUDAsUzAsUzAsMCApCisjIGRlZmluZSBwY2xhc3MoIGwsciApCSAgCXBhcnNlX21ha2UoIFBBUlNFX0NMQVNTLGwscixQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBudWxsKCkJICAJcGFyc2VfbWFrZSggUEFSU0VfTlVMTCxQMCxQMCxQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBvbiggbCxyICkJICAJcGFyc2VfbWFrZSggUEFSU0VfT04sbCxyLFAwLFMwLFMwLDAgKQorIyBkZWZpbmUgcHJ1bGUoIHMscCApICAgICAJcGFyc2VfbWFrZSggUEFSU0VfUlVMRSxwLFAwLFAwLHMsUzAsMCApCisjIGRlZmluZSBwcnVsZXMoIGwsciApCSAgCXBhcnNlX21ha2UoIFBBUlNFX1JVTEVTLGwscixQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBzZXQoIGwscixhICkgICAgICAgICAgcGFyc2VfbWFrZSggUEFSU0VfU0VULGwscixQMCxTMCxTMCxhICkKKyMgZGVmaW5lIHBzZXQxKCBsLHIsdCxhICkJcGFyc2VfbWFrZSggUEFSU0VfU0VUVElOR1MsbCxyLHQsUzAsUzAsYSApCisjIGRlZmluZSBwc2V0YyggcyxwLGEsbCApICAgICAJcGFyc2VfbWFrZSggUEFSU0VfU0VUQ09NUCxwLGEsUDAscyxTMCxsICkKKyMgZGVmaW5lIHBzZXRlKCBzLGwsczEsZiApIAlwYXJzZV9tYWtlKCBQQVJTRV9TRVRFWEVDLGwsUDAsUDAscyxzMSxmICkKKyMgZGVmaW5lIHBzd2l0Y2goIGwsciApICAgCXBhcnNlX21ha2UoIFBBUlNFX1NXSVRDSCxsLHIsUDAsUzAsUzAsMCApCisjIGRlZmluZSBwd2hpbGUoIGwsciApICAgCXBhcnNlX21ha2UoIFBBUlNFX1dISUxFLGwscixQMCxTMCxTMCwwICkKKworIyBkZWZpbmUgcG5vZGUoIGwsciApICAgIAlwYXJzZV9tYWtlKCBGMCxsLHIsUDAsUzAsUzAsMCApCisjIGRlZmluZSBwc25vZGUoIHMsbCApICAgICAJcGFyc2VfbWFrZSggRjAsbCxQMCxQMCxzLFMwLDAgKQorCislfQorCislJQorCitydW4JOiAvKiBlbXB0eSAqLworCQkvKiBkbyBub3RoaW5nICovCisJfCBydWxlcworCQl7IHBhcnNlX3NhdmUoICQxLnBhcnNlICk7IH0KKwk7CisKKy8qCisgKiBibG9jayAtIHplcm8gb3IgbW9yZSBydWxlcworICogcnVsZXMgLSBvbmUgb3IgbW9yZSBydWxlcworICogcnVsZSAtIGFueSBvbmUgb2YgamFtJ3MgcnVsZXMKKyAqIHJpZ2h0LXJlY3Vyc2l2ZSBzbyBydWxlcyBleGVjdXRlIGluIG9yZGVyLgorICovCisKK2Jsb2NrCTogbnVsbAorICAgICAgICAgICAgICAgIHsgJCQucGFyc2UgPSAkMS5wYXJzZTsgfQorCXwgcnVsZXMKKwkJeyAkJC5wYXJzZSA9ICQxLnBhcnNlOyB9CisJOworCitydWxlcwk6IHJ1bGUKKwkJeyAkJC5wYXJzZSA9ICQxLnBhcnNlOyB9CisJfCBydWxlIHJ1bGVzCisJCXsgJCQucGFyc2UgPSBwcnVsZXMoICQxLnBhcnNlLCAkMi5wYXJzZSApOyB9CisJfCBMT0NBTF90IGxpc3QgYXNzaWduX2xpc3Rfb3B0IF9TRU1JQ190IGJsb2NrCisJCXsgJCQucGFyc2UgPSBwbG9jYWwoICQyLnBhcnNlLCAkMy5wYXJzZSwgJDUucGFyc2UgKTsgfQorCTsKKworbnVsbCAgICA6IC8qIGVtcHR5ICovCisgICAgICAgIHsgJCQucGFyc2UgPSBwbnVsbCgpOyB9CisgICAgICAgIDsKKworYXNzaWduX2xpc3Rfb3B0IDogX0VRVUFMU190IGxpc3QKKyAgICAgICAgICAgICAgICB7ICQkLnBhcnNlID0gJDIucGFyc2U7ICQkLm51bWJlciA9IEFTU0lHTl9TRVQ7IH0KKyAgICAgICAgfCBudWxsCisJCXsgJCQucGFyc2UgPSAkMS5wYXJzZTsgJCQubnVtYmVyID0gQVNTSUdOX0FQUEVORDsgfQorICAgICAgICA7CisKK2FyZ2xpc3Rfb3B0IDogX0xQQVJFTl90IGxvbCBfUlBBUkVOX3QKKyAgICAgICAgICAgICAgICB7ICQkLnBhcnNlID0gJDIucGFyc2U7IH0KKyAgICAgICAgfAorICAgICAgICAgICAgICAgIHsgJCQucGFyc2UgPSBQMDsgfQorICAgICAgICA7CisKK2xvY2FsX29wdCA6IExPQ0FMX3QKKyAgICAgICAgICAgICAgICB7ICQkLm51bWJlciA9IDE7IH0KKyAgICAgICAgICB8IC8qIGVtcHR5ICovCisgICAgICAgICAgICAgICAgeyAkJC5udW1iZXIgPSAwOyB9CisgICAgICAgICAgOworCitydWxlCTogX0xCUkFDRV90IGJsb2NrIF9SQlJBQ0VfdAorCQl7ICQkLnBhcnNlID0gJDIucGFyc2U7IH0KKwl8IElOQ0xVREVfdCBsaXN0IF9TRU1JQ190CisJCXsgJCQucGFyc2UgPSBwaW5jbCggJDIucGFyc2UgKTsgfQorCXwgQVJHIGxvbCBfU0VNSUNfdAorCQl7ICQkLnBhcnNlID0gcHJ1bGUoICQxLnN0cmluZywgJDIucGFyc2UgKTsgfQorCXwgYXJnIGFzc2lnbiBsaXN0IF9TRU1JQ190CisJCXsgJCQucGFyc2UgPSBwc2V0KCAkMS5wYXJzZSwgJDMucGFyc2UsICQyLm51bWJlciApOyB9CisJfCBhcmcgT05fdCBsaXN0IGFzc2lnbiBsaXN0IF9TRU1JQ190CisJCXsgJCQucGFyc2UgPSBwc2V0MSggJDEucGFyc2UsICQzLnBhcnNlLCAkNS5wYXJzZSwgJDQubnVtYmVyICk7IH0KKwl8IFJFVFVSTl90IGxpc3QgX1NFTUlDX3QKKwkJeyAkJC5wYXJzZSA9ICQyLnBhcnNlOyB9CisJfCBGT1JfdCBsb2NhbF9vcHQgQVJHIElOX3QgbGlzdCBfTEJSQUNFX3QgYmxvY2sgX1JCUkFDRV90CisJCXsgJCQucGFyc2UgPSBwZm9yKCAkMy5zdHJpbmcsICQ1LnBhcnNlLCAkNy5wYXJzZSwgJDIubnVtYmVyICk7IH0KKwl8IFNXSVRDSF90IGxpc3QgX0xCUkFDRV90IGNhc2VzIF9SQlJBQ0VfdAorCQl7ICQkLnBhcnNlID0gcHN3aXRjaCggJDIucGFyc2UsICQ0LnBhcnNlICk7IH0KKwl8IElGX3QgZXhwciBfTEJSQUNFX3QgYmxvY2sgX1JCUkFDRV90CisJCXsgJCQucGFyc2UgPSBwaWYoICQyLnBhcnNlLCAkNC5wYXJzZSwgcG51bGwoKSApOyB9CisJfCBNT0RVTEVfdCBsaXN0IF9MQlJBQ0VfdCBibG9jayBfUkJSQUNFX3QKKwkJeyAkJC5wYXJzZSA9IHBtb2R1bGUoICQyLnBhcnNlLCAkNC5wYXJzZSApOyB9CisJfCBDTEFTU190IGxvbCBfTEJSQUNFX3QgYmxvY2sgX1JCUkFDRV90CisJCXsgJCQucGFyc2UgPSBwY2xhc3MoICQyLnBhcnNlLCAkNC5wYXJzZSApOyB9CisJfCBXSElMRV90IGV4cHIgX0xCUkFDRV90IGJsb2NrIF9SQlJBQ0VfdAorCQl7ICQkLnBhcnNlID0gcHdoaWxlKCAkMi5wYXJzZSwgJDQucGFyc2UgKTsgfQorCXwgSUZfdCBleHByIF9MQlJBQ0VfdCBibG9jayBfUkJSQUNFX3QgRUxTRV90IHJ1bGUKKwkJeyAkJC5wYXJzZSA9IHBpZiggJDIucGFyc2UsICQ0LnBhcnNlLCAkNy5wYXJzZSApOyB9CisgICAgIHwgbG9jYWxfb3B0IFJVTEVfdCBBUkcgYXJnbGlzdF9vcHQgcnVsZQorCQl7ICQkLnBhcnNlID0gcHNldGMoICQzLnN0cmluZywgJDUucGFyc2UsICQ0LnBhcnNlLCAkMS5udW1iZXIgKTsgfQorCXwgT05fdCBhcmcgcnVsZQorCQl7ICQkLnBhcnNlID0gcG9uKCAkMi5wYXJzZSwgJDMucGFyc2UgKTsgfQorCXwgQUNUSU9OU190IGVmbGFncyBBUkcgYmluZGxpc3QgX0xCUkFDRV90CisJCXsgeXltb2RlKCBTQ0FOX1NUUklORyApOyB9CisJICBTVFJJTkcKKwkJeyB5eW1vZGUoIFNDQU5fTk9STUFMICk7IH0KKwkgIF9SQlJBQ0VfdAorCQl7ICQkLnBhcnNlID0gcHNldGUoICQzLnN0cmluZywkNC5wYXJzZSwkNy5zdHJpbmcsJDIubnVtYmVyICk7IH0KKwk7CisKKy8qCisgKiBhc3NpZ24gLSA9IG9yICs9CisgKi8KKworYXNzaWduCTogX0VRVUFMU190CisJCXsgJCQubnVtYmVyID0gQVNTSUdOX1NFVDsgfQorCXwgX1BMVVNfRVFVQUxTX3QKKwkJeyAkJC5udW1iZXIgPSBBU1NJR05fQVBQRU5EOyB9CisJfCBfUVVFU1RJT05fRVFVQUxTX3QKKwkJeyAkJC5udW1iZXIgPSBBU1NJR05fREVGQVVMVDsgfQorCXwgREVGQVVMVF90IF9FUVVBTFNfdAorCQl7ICQkLm51bWJlciA9IEFTU0lHTl9ERUZBVUxUOyB9CisJOworCisvKgorICogZXhwciAtIGFuIGV4cHJlc3Npb24gZm9yIGlmCisgKi8KK2V4cHIJOiBhcmcKKwkJeyAkJC5wYXJzZSA9IHBldmFsKCBFWFBSX0VYSVNUUywgJDEucGFyc2UsIHBudWxsKCkgKTsgfQorCXwgZXhwciBfRVFVQUxTX3QgZXhwcgorCQl7ICQkLnBhcnNlID0gcGV2YWwoIEVYUFJfRVFVQUxTLCAkMS5wYXJzZSwgJDMucGFyc2UgKTsgfQorCXwgZXhwciBfQkFOR19FUVVBTFNfdCBleHByCisJCXsgJCQucGFyc2UgPSBwZXZhbCggRVhQUl9OT1RFUSwgJDEucGFyc2UsICQzLnBhcnNlICk7IH0KKwl8IGV4cHIgX0xBTkdMRV90IGV4cHIKKwkJeyAkJC5wYXJzZSA9IHBldmFsKCBFWFBSX0xFU1MsICQxLnBhcnNlLCAkMy5wYXJzZSApOyB9CisJfCBleHByIF9MQU5HTEVfRVFVQUxTX3QgZXhwcgorCQl7ICQkLnBhcnNlID0gcGV2YWwoIEVYUFJfTEVTU0VRLCAkMS5wYXJzZSwgJDMucGFyc2UgKTsgfQorCXwgZXhwciBfUkFOR0xFX3QgZXhwcgorCQl7ICQkLnBhcnNlID0gcGV2YWwoIEVYUFJfTU9SRSwgJDEucGFyc2UsICQzLnBhcnNlICk7IH0KKwl8IGV4cHIgX1JBTkdMRV9FUVVBTFNfdCBleHByCisJCXsgJCQucGFyc2UgPSBwZXZhbCggRVhQUl9NT1JFRVEsICQxLnBhcnNlLCAkMy5wYXJzZSApOyB9CisJfCBleHByIF9BTVBFUl90IGV4cHIKKwkJeyAkJC5wYXJzZSA9IHBldmFsKCBFWFBSX0FORCwgJDEucGFyc2UsICQzLnBhcnNlICk7IH0KKwl8IGV4cHIgX0FNUEVSQU1QRVJfdCBleHByCisJCXsgJCQucGFyc2UgPSBwZXZhbCggRVhQUl9BTkQsICQxLnBhcnNlLCAkMy5wYXJzZSApOyB9CisJfCBleHByIF9CQVJfdCBleHByCisJCXsgJCQucGFyc2UgPSBwZXZhbCggRVhQUl9PUiwgJDEucGFyc2UsICQzLnBhcnNlICk7IH0KKwl8IGV4cHIgX0JBUkJBUl90IGV4cHIKKwkJeyAkJC5wYXJzZSA9IHBldmFsKCBFWFBSX09SLCAkMS5wYXJzZSwgJDMucGFyc2UgKTsgfQorCXwgYXJnIElOX3QgbGlzdAorCQl7ICQkLnBhcnNlID0gcGV2YWwoIEVYUFJfSU4sICQxLnBhcnNlLCAkMy5wYXJzZSApOyB9CisJfCBfQkFOR190IGV4cHIKKwkJeyAkJC5wYXJzZSA9IHBldmFsKCBFWFBSX05PVCwgJDIucGFyc2UsIHBudWxsKCkgKTsgfQorCXwgX0xQQVJFTl90IGV4cHIgX1JQQVJFTl90CisJCXsgJCQucGFyc2UgPSAkMi5wYXJzZTsgfQorCTsKKworCisvKgorICogY2FzZXMgLSBhY3Rpb24gZWxlbWVudHMgaW5zaWRlIGEgJ3N3aXRjaCcKKyAqIGNhc2UgLSBhIHNpbmdsZSBhY3Rpb24gZWxlbWVudCBpbnNpZGUgYSAnc3dpdGNoJworICogcmlnaHQtcmVjdXJzaXZlIHJ1bGUgc28gY2FzZXMgY2FuIGJlIGV4YW1pbmVkIGluIG9yZGVyLgorICovCisKK2Nhc2VzCTogLyogZW1wdHkgKi8KKwkJeyAkJC5wYXJzZSA9IFAwOyB9CisJfCBjYXNlIGNhc2VzCisJCXsgJCQucGFyc2UgPSBwbm9kZSggJDEucGFyc2UsICQyLnBhcnNlICk7IH0KKwk7CisKK2Nhc2UJOiBDQVNFX3QgQVJHIF9DT0xPTl90IGJsb2NrCisJCXsgJCQucGFyc2UgPSBwc25vZGUoICQyLnN0cmluZywgJDQucGFyc2UgKTsgfQorCTsKKworLyoKKyAqIGxvbCAtIGxpc3Qgb2YgbGlzdHMKKyAqIHJpZ2h0LXJlY3Vyc2l2ZSBydWxlIHNvIHRoYXQgbGlzdHMgY2FuIGJlIGFkZGVkIGluIG9yZGVyLgorICovCisKK2xvbAk6IGxpc3QKKwkJeyAkJC5wYXJzZSA9IHBub2RlKCBQMCwgJDEucGFyc2UgKTsgfQorCXwgbGlzdCBfQ09MT05fdCBsb2wKKwkJeyAkJC5wYXJzZSA9IHBub2RlKCAkMy5wYXJzZSwgJDEucGFyc2UgKTsgfQorCTsKKworLyoKKyAqIGxpc3QgLSB6ZXJvIG9yIG1vcmUgYXJncyBpbiBhIExJU1QKKyAqIGxpc3RwIC0gbGlzdCAoaW4gcHVuY3V0YXRpb24gb25seSBtb2RlKQorICogYXJnIC0gb25lIEFSRyBvciBmdW5jdGlvbiBjYWxsCisgKi8KKworbGlzdAk6IGxpc3RwCisJCXsgJCQucGFyc2UgPSAkMS5wYXJzZTsgeXltb2RlKCBTQ0FOX05PUk1BTCApOyB9CisJOworCitsaXN0cAk6IC8qIGVtcHR5ICovCisJCXsgJCQucGFyc2UgPSBwbnVsbCgpOyB5eW1vZGUoIFNDQU5fUFVOQ1QgKTsgfQorCXwgbGlzdHAgYXJnCisgICAgICAgIAl7ICQkLnBhcnNlID0gcGFwcGVuZCggJDEucGFyc2UsICQyLnBhcnNlICk7IH0KKwk7CisKK2FyZwk6IEFSRworCQl7ICQkLnBhcnNlID0gcGxpc3QoICQxLnN0cmluZyApOyB9CisJfCBfTEJSQUNLRVRfdCB7IHl5bW9kZSggU0NBTl9OT1JNQUwgKTsgfSBmdW5jIF9SQlJBQ0tFVF90CisJCXsgJCQucGFyc2UgPSAkMy5wYXJzZTsgfQorCTsKKworLyoKKyAqIGZ1bmMgLSBhIGZ1bmN0aW9uIGNhbGwgKGluc2lkZSBbXSkKKyAqIFRoaXMgbmVlZHMgdG8gYmUgc3BsaXQgY2xlYW5seSBvdXQgb2YgJ3J1bGUnCisgKi8KKworZnVuYwk6IEFSRyBsb2wKKwkJeyAkJC5wYXJzZSA9IHBydWxlKCAkMS5zdHJpbmcsICQyLnBhcnNlICk7IH0KKwl8IE9OX3QgYXJnIEFSRyBsb2wKKwkJeyAkJC5wYXJzZSA9IHBvbiggJDIucGFyc2UsIHBydWxlKCAkMy5zdHJpbmcsICQ0LnBhcnNlICkgKTsgfQorCXwgT05fdCBhcmcgUkVUVVJOX3QgbGlzdAorCQl7ICQkLnBhcnNlID0gcG9uKCAkMi5wYXJzZSwgJDQucGFyc2UgKTsgfQorCTsKKworCisvKgorICogZWZsYWdzIC0gemVybyBvciBtb3JlIG1vZGlmaWVycyB0byAnZXhlY3V0ZXMnCisgKiBlZmxhZyAtIGEgc2luZ2xlIG1vZGlmaWVyIHRvICdleGVjdXRlcycKKyAqLworCitlZmxhZ3MJOiAvKiBlbXB0eSAqLworCQl7ICQkLm51bWJlciA9IDA7IH0KKwl8IGVmbGFncyBlZmxhZworCQl7ICQkLm51bWJlciA9ICQxLm51bWJlciB8ICQyLm51bWJlcjsgfQorCTsKKworZWZsYWcJOiBVUERBVEVEX3QKKwkJeyAkJC5udW1iZXIgPSBFWEVDX1VQREFURUQ7IH0KKwl8IFRPR0VUSEVSX3QKKwkJeyAkJC5udW1iZXIgPSBFWEVDX1RPR0VUSEVSOyB9CisJfCBJR05PUkVfdAorCQl7ICQkLm51bWJlciA9IEVYRUNfSUdOT1JFOyB9CisJfCBRVUlFVExZX3QKKwkJeyAkJC5udW1iZXIgPSBFWEVDX1FVSUVUTFk7IH0KKwl8IFBJRUNFTUVBTF90CisJCXsgJCQubnVtYmVyID0gRVhFQ19QSUVDRU1FQUw7IH0KKwl8IEVYSVNUSU5HX3QKKwkJeyAkJC5udW1iZXIgPSBFWEVDX0VYSVNUSU5HOyB9CisJOworCisKKy8qCisgKiBiaW5kbGlzdCAtIGxpc3Qgb2YgdmFyaWFibGUgdG8gYmluZCBmb3IgYW4gYWN0aW9uCisgKi8KKworYmluZGxpc3QgOiAvKiBlbXB0eSAqLworCQl7ICQkLnBhcnNlID0gcG51bGwoKTsgfQorCXwgQklORF90IGxpc3QKKwkJeyAkJC5wYXJzZSA9ICQyLnBhcnNlOyB9CisJOworCisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2phbWdyYW0ueXkgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9qYW1ncmFtLnl5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjBlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9qYW1ncmFtLnl5CkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTMsIDIwMDAgQ2hyaXN0b3BoZXIgU2Vpd2FsZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiAgVGhpcyBmaWxlIGlzIEFMU086CisgKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyAqICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKy8qCisgKiBqYW1ncmFtLnl5IC0gamFtIGdyYW1tYXIKKyAqCisgKiAwNC8xMy85NCAoc2Vpd2FsZCkgLSBhZGRlZCBzaG9ydGhhbmQgTDAgZm9yIG51bGwgbGlzdCBwb2ludGVyCisgKiAwNi8wMS85NCAoc2Vpd2FsZCkgLSBuZXcgJ2FjdGlvbnMgZXhpc3RpbmcnIGRvZXMgZXhpc3Rpbmcgc291cmNlcworICogMDgvMjMvOTQgKHNlaXdhbGQpIC0gU3VwcG9ydCBmb3IgJys9JyAoYXBwZW5kIHRvIHZhcmlhYmxlKQorICogMDgvMzEvOTQgKHNlaXdhbGQpIC0gQWxsb3cgPz0gYXMgYWxpYXMgZm9yICJkZWZhdWx0ID0iLgorICogMDkvMTUvOTQgKHNlaXdhbGQpIC0gaWYgY29uZGl0aW9uYWxzIHRha2Ugb25seSBzaW5nbGUgYXJndW1lbnRzLCBzbworICoJCQl0aGF0ICdpZiBmb28gPT0gYmFyJyBnaXZlcyBzeW50YXggZXJyb3IgKHVzZSA9KS4KKyAqIDAyLzExLzk1IChzZWl3YWxkKSAtIHdoZW4gc2Nhbm5pbmcgYXJndW1lbnRzIHRvIHJ1bGVzLCBvbmx5IHRyZWF0CisgKgkJCXB1bmN0dWF0aW9uIGtleXdvcmRzIGFzIGtleXdvcmRzLiAgQWxsIGFyZyBsaXN0cworICoJCQlhcmUgdGVybWluYXRlZCB3aXRoIHB1bmN0dWF0aW9uIGtleXdvcmRzLgorICoKKyAqIDA5LzExLzAwIChzZWl3YWxkKSAtIFN1cHBvcnQgZm9yIGZ1bmN0aW9uIGNhbGxzOgorICoKKyAqCQlSdWxlcyBub3cgcmV0dXJuIGxpc3RzIChMSVNUICopLCByYXRoZXIgdGhhbiB2b2lkLgorICoKKyAqCQlOZXcgIlsgcnVsZSBdIiBzeW50YXggZXZhbHMgcnVsZSBpbnRvIGEgTElTVC4KKyAqCisgKgkJTGlzdHMgYXJlIG5vdyBnZW5lcmF0ZWQgYnkgY29tcGlsZV9saXN0KCkgYW5kCisgKgkJY29tcGlsZV9hcHBlbmQoKSwgYW5kIGFueSBvdGhlciBydWxlIHRoYXQgaW5kaXJlY3RseQorICoJCW1ha2VzIGEgbGlzdCwgcmF0aGVyIHRoYW4gYmVpbmcgYnVpbHQgZGlyZWN0bHkgaGVyZSwKKyAqCQlzbyB0aGF0IGxpc3RzIHZhbHVlcyBjYW4gY29udGFpbiBydWxlIGV2YWx1YXRpb25zLgorICoKKyAqCQlOZXcgJ3JldHVybicgcnVsZSBzZXRzIHRoZSByZXR1cm4gdmFsdWUsIHRob3VnaAorICoJCW90aGVyIHN0YXRlbWVudHMgYWxzbyBtYXkgaGF2ZSByZXR1cm4gdmFsdWVzLgorICoKKyAqCQkncnVuJyBwcm9kdWN0aW9uIHNwbGl0IGZyb20gJ2Jsb2NrJyBwcm9kdWN0aW9uIHNvCisgKgkJdGhhdCBlbXB0eSBibG9ja3MgY2FuIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KKyAqLworCisldG9rZW4gQVJHIFNUUklORworCislbGVmdCBgfHxgIGB8YAorJWxlZnQgYCYmYCBgJmAKKyVsZWZ0IGA9YCBgIT1gIGBpbmAKKyVsZWZ0IGA8YCBgPD1gIGA+YCBgPj1gCislbGVmdCBgIWAKKworJXsKKyNpbmNsdWRlICJqYW0uaCIKKworI2luY2x1ZGUgImxpc3RzLmgiCisjaW5jbHVkZSAicGFyc2UuaCIKKyNpbmNsdWRlICJzY2FuLmgiCisjaW5jbHVkZSAiY29tcGlsZS5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisKKyMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAJLyogZm9yIE9TRiBhbmQgb3RoZXIgbGVzcyBlbmRvd2VkIHlhY2NzICovCisKKyMgZGVmaW5lIEYwIC0xCisjIGRlZmluZSBQMCAoUEFSU0UgKikwCisjIGRlZmluZSBTMCAoT0JKRUNUICopMAorCisjIGRlZmluZSBwYXBwZW5kKCBsLHIgKSAgICAJcGFyc2VfbWFrZSggUEFSU0VfQVBQRU5ELGwscixQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBldmFsKCBjLGwsciApCXBhcnNlX21ha2UoIFBBUlNFX0VWQUwsbCxyLFAwLFMwLFMwLGMgKQorIyBkZWZpbmUgcGZvciggcyxsLHIseCApICAgIAlwYXJzZV9tYWtlKCBQQVJTRV9GT1JFQUNILGwscixQMCxzLFMwLHggKQorIyBkZWZpbmUgcGlmKCBsLHIsdCApCSAgCXBhcnNlX21ha2UoIFBBUlNFX0lGLGwscix0LFMwLFMwLDAgKQorIyBkZWZpbmUgcGluY2woIGwgKSAgICAgICAJcGFyc2VfbWFrZSggUEFSU0VfSU5DTFVERSxsLFAwLFAwLFMwLFMwLDAgKQorIyBkZWZpbmUgcGxpc3QoIHMgKQkgIAlwYXJzZV9tYWtlKCBQQVJTRV9MSVNULFAwLFAwLFAwLHMsUzAsMCApCisjIGRlZmluZSBwbG9jYWwoIGwscix0ICkgIAlwYXJzZV9tYWtlKCBQQVJTRV9MT0NBTCxsLHIsdCxTMCxTMCwwICkKKyMgZGVmaW5lIHBtb2R1bGUoIGwsciApCSAgCXBhcnNlX21ha2UoIFBBUlNFX01PRFVMRSxsLHIsUDAsUzAsUzAsMCApCisjIGRlZmluZSBwY2xhc3MoIGwsciApCSAgCXBhcnNlX21ha2UoIFBBUlNFX0NMQVNTLGwscixQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBudWxsKCkJICAJcGFyc2VfbWFrZSggUEFSU0VfTlVMTCxQMCxQMCxQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBvbiggbCxyICkJICAJcGFyc2VfbWFrZSggUEFSU0VfT04sbCxyLFAwLFMwLFMwLDAgKQorIyBkZWZpbmUgcHJ1bGUoIHMscCApICAgICAJcGFyc2VfbWFrZSggUEFSU0VfUlVMRSxwLFAwLFAwLHMsUzAsMCApCisjIGRlZmluZSBwcnVsZXMoIGwsciApCSAgCXBhcnNlX21ha2UoIFBBUlNFX1JVTEVTLGwscixQMCxTMCxTMCwwICkKKyMgZGVmaW5lIHBzZXQoIGwscixhICkgICAgICAgICAgcGFyc2VfbWFrZSggUEFSU0VfU0VULGwscixQMCxTMCxTMCxhICkKKyMgZGVmaW5lIHBzZXQxKCBsLHIsdCxhICkJcGFyc2VfbWFrZSggUEFSU0VfU0VUVElOR1MsbCxyLHQsUzAsUzAsYSApCisjIGRlZmluZSBwc2V0YyggcyxwLGEsbCApICAgICAJcGFyc2VfbWFrZSggUEFSU0VfU0VUQ09NUCxwLGEsUDAscyxTMCxsICkKKyMgZGVmaW5lIHBzZXRlKCBzLGwsczEsZiApIAlwYXJzZV9tYWtlKCBQQVJTRV9TRVRFWEVDLGwsUDAsUDAscyxzMSxmICkKKyMgZGVmaW5lIHBzd2l0Y2goIGwsciApICAgCXBhcnNlX21ha2UoIFBBUlNFX1NXSVRDSCxsLHIsUDAsUzAsUzAsMCApCisjIGRlZmluZSBwd2hpbGUoIGwsciApICAgCXBhcnNlX21ha2UoIFBBUlNFX1dISUxFLGwscixQMCxTMCxTMCwwICkKKworIyBkZWZpbmUgcG5vZGUoIGwsciApICAgIAlwYXJzZV9tYWtlKCBGMCxsLHIsUDAsUzAsUzAsMCApCisjIGRlZmluZSBwc25vZGUoIHMsbCApICAgICAJcGFyc2VfbWFrZSggRjAsbCxQMCxQMCxzLFMwLDAgKQorCislfQorCislJQorCitydW4JOiAvKiBlbXB0eSAqLworCQkvKiBkbyBub3RoaW5nICovCisJfCBydWxlcworCQl7IHBhcnNlX3NhdmUoICQxLnBhcnNlICk7IH0KKwk7CisKKy8qCisgKiBibG9jayAtIHplcm8gb3IgbW9yZSBydWxlcworICogcnVsZXMgLSBvbmUgb3IgbW9yZSBydWxlcworICogcnVsZSAtIGFueSBvbmUgb2YgamFtJ3MgcnVsZXMKKyAqIHJpZ2h0LXJlY3Vyc2l2ZSBzbyBydWxlcyBleGVjdXRlIGluIG9yZGVyLgorICovCisKK2Jsb2NrCTogbnVsbAorICAgICAgICAgICAgICAgIHsgJCQucGFyc2UgPSAkMS5wYXJzZTsgfQorCXwgcnVsZXMKKwkJeyAkJC5wYXJzZSA9ICQxLnBhcnNlOyB9CisJOworCitydWxlcwk6IHJ1bGUKKwkJeyAkJC5wYXJzZSA9ICQxLnBhcnNlOyB9CisJfCBydWxlIHJ1bGVzCisJCXsgJCQucGFyc2UgPSBwcnVsZXMoICQxLnBhcnNlLCAkMi5wYXJzZSApOyB9CisJfCBgbG9jYWxgIGxpc3QgYXNzaWduX2xpc3Rfb3B0IGA7YCBibG9jaworCQl7ICQkLnBhcnNlID0gcGxvY2FsKCAkMi5wYXJzZSwgJDMucGFyc2UsICQ1LnBhcnNlICk7IH0KKwk7CisKK251bGwgICAgOiAvKiBlbXB0eSAqLworICAgICAgICB7ICQkLnBhcnNlID0gcG51bGwoKTsgfQorICAgICAgICA7CisKK2Fzc2lnbl9saXN0X29wdCA6IGA9YCBsaXN0CisgICAgICAgICAgICAgICAgeyAkJC5wYXJzZSA9ICQyLnBhcnNlOyAkJC5udW1iZXIgPSBBU1NJR05fU0VUOyB9CisgICAgICAgIHwgbnVsbAorCQl7ICQkLnBhcnNlID0gJDEucGFyc2U7ICQkLm51bWJlciA9IEFTU0lHTl9BUFBFTkQ7IH0KKyAgICAgICAgOworCithcmdsaXN0X29wdCA6IGAoYCBsb2wgYClgCisgICAgICAgICAgICAgICAgeyAkJC5wYXJzZSA9ICQyLnBhcnNlOyB9CisgICAgICAgIHwKKyAgICAgICAgICAgICAgICB7ICQkLnBhcnNlID0gUDA7IH0KKyAgICAgICAgOworCitsb2NhbF9vcHQgOiBgbG9jYWxgCisgICAgICAgICAgICAgICAgeyAkJC5udW1iZXIgPSAxOyB9CisgICAgICAgICAgfCAvKiBlbXB0eSAqLworICAgICAgICAgICAgICAgIHsgJCQubnVtYmVyID0gMDsgfQorICAgICAgICAgIDsKKworcnVsZQk6IGB7YCBibG9jayBgfWAKKwkJeyAkJC5wYXJzZSA9ICQyLnBhcnNlOyB9CisJfCBgaW5jbHVkZWAgbGlzdCBgO2AKKwkJeyAkJC5wYXJzZSA9IHBpbmNsKCAkMi5wYXJzZSApOyB9CisJfCBBUkcgbG9sIGA7YAorCQl7ICQkLnBhcnNlID0gcHJ1bGUoICQxLnN0cmluZywgJDIucGFyc2UgKTsgfQorCXwgYXJnIGFzc2lnbiBsaXN0IGA7YAorCQl7ICQkLnBhcnNlID0gcHNldCggJDEucGFyc2UsICQzLnBhcnNlLCAkMi5udW1iZXIgKTsgfQorCXwgYXJnIGBvbmAgbGlzdCBhc3NpZ24gbGlzdCBgO2AKKwkJeyAkJC5wYXJzZSA9IHBzZXQxKCAkMS5wYXJzZSwgJDMucGFyc2UsICQ1LnBhcnNlLCAkNC5udW1iZXIgKTsgfQorCXwgYHJldHVybmAgbGlzdCBgO2AKKwkJeyAkJC5wYXJzZSA9ICQyLnBhcnNlOyB9CisJfCBgZm9yYCBsb2NhbF9vcHQgQVJHIGBpbmAgbGlzdCBge2AgYmxvY2sgYH1gCisJCXsgJCQucGFyc2UgPSBwZm9yKCAkMy5zdHJpbmcsICQ1LnBhcnNlLCAkNy5wYXJzZSwgJDIubnVtYmVyICk7IH0KKwl8IGBzd2l0Y2hgIGxpc3QgYHtgIGNhc2VzIGB9YAorCQl7ICQkLnBhcnNlID0gcHN3aXRjaCggJDIucGFyc2UsICQ0LnBhcnNlICk7IH0KKwl8IGBpZmAgZXhwciBge2AgYmxvY2sgYH1gCisJCXsgJCQucGFyc2UgPSBwaWYoICQyLnBhcnNlLCAkNC5wYXJzZSwgcG51bGwoKSApOyB9CisJfCBgbW9kdWxlYCBsaXN0IGB7YCBibG9jayBgfWAKKwkJeyAkJC5wYXJzZSA9IHBtb2R1bGUoICQyLnBhcnNlLCAkNC5wYXJzZSApOyB9CisJfCBgY2xhc3NgIGxvbCBge2AgYmxvY2sgYH1gCisJCXsgJCQucGFyc2UgPSBwY2xhc3MoICQyLnBhcnNlLCAkNC5wYXJzZSApOyB9CisJfCBgd2hpbGVgIGV4cHIgYHtgIGJsb2NrIGB9YAorCQl7ICQkLnBhcnNlID0gcHdoaWxlKCAkMi5wYXJzZSwgJDQucGFyc2UgKTsgfQorCXwgYGlmYCBleHByIGB7YCBibG9jayBgfWAgYGVsc2VgIHJ1bGUKKwkJeyAkJC5wYXJzZSA9IHBpZiggJDIucGFyc2UsICQ0LnBhcnNlLCAkNy5wYXJzZSApOyB9CisgICAgIHwgbG9jYWxfb3B0IGBydWxlYCBBUkcgYXJnbGlzdF9vcHQgcnVsZQorCQl7ICQkLnBhcnNlID0gcHNldGMoICQzLnN0cmluZywgJDUucGFyc2UsICQ0LnBhcnNlLCAkMS5udW1iZXIgKTsgfQorCXwgYG9uYCBhcmcgcnVsZQorCQl7ICQkLnBhcnNlID0gcG9uKCAkMi5wYXJzZSwgJDMucGFyc2UgKTsgfQorCXwgYGFjdGlvbnNgIGVmbGFncyBBUkcgYmluZGxpc3QgYHtgCisJCXsgeXltb2RlKCBTQ0FOX1NUUklORyApOyB9CisJICBTVFJJTkcKKwkJeyB5eW1vZGUoIFNDQU5fTk9STUFMICk7IH0KKwkgIGB9YAorCQl7ICQkLnBhcnNlID0gcHNldGUoICQzLnN0cmluZywkNC5wYXJzZSwkNy5zdHJpbmcsJDIubnVtYmVyICk7IH0KKwk7CisKKy8qCisgKiBhc3NpZ24gLSA9IG9yICs9CisgKi8KKworYXNzaWduCTogYD1gCisJCXsgJCQubnVtYmVyID0gQVNTSUdOX1NFVDsgfQorCXwgYCs9YAorCQl7ICQkLm51bWJlciA9IEFTU0lHTl9BUFBFTkQ7IH0KKwl8IGA/PWAKKwkJeyAkJC5udW1iZXIgPSBBU1NJR05fREVGQVVMVDsgfQorCXwgYGRlZmF1bHRgIGA9YAorCQl7ICQkLm51bWJlciA9IEFTU0lHTl9ERUZBVUxUOyB9CisJOworCisvKgorICogZXhwciAtIGFuIGV4cHJlc3Npb24gZm9yIGlmCisgKi8KK2V4cHIJOiBhcmcKKwkJeyAkJC5wYXJzZSA9IHBldmFsKCBFWFBSX0VYSVNUUywgJDEucGFyc2UsIHBudWxsKCkgKTsgfQorCXwgZXhwciBgPWAgZXhwcgorCQl7ICQkLnBhcnNlID0gcGV2YWwoIEVYUFJfRVFVQUxTLCAkMS5wYXJzZSwgJDMucGFyc2UgKTsgfQorCXwgZXhwciBgIT1gIGV4cHIKKwkJeyAkJC5wYXJzZSA9IHBldmFsKCBFWFBSX05PVEVRLCAkMS5wYXJzZSwgJDMucGFyc2UgKTsgfQorCXwgZXhwciBgPGAgZXhwcgorCQl7ICQkLnBhcnNlID0gcGV2YWwoIEVYUFJfTEVTUywgJDEucGFyc2UsICQzLnBhcnNlICk7IH0KKwl8IGV4cHIgYDw9YCBleHByCisJCXsgJCQucGFyc2UgPSBwZXZhbCggRVhQUl9MRVNTRVEsICQxLnBhcnNlLCAkMy5wYXJzZSApOyB9CisJfCBleHByIGA+YCBleHByCisJCXsgJCQucGFyc2UgPSBwZXZhbCggRVhQUl9NT1JFLCAkMS5wYXJzZSwgJDMucGFyc2UgKTsgfQorCXwgZXhwciBgPj1gIGV4cHIKKwkJeyAkJC5wYXJzZSA9IHBldmFsKCBFWFBSX01PUkVFUSwgJDEucGFyc2UsICQzLnBhcnNlICk7IH0KKwl8IGV4cHIgYCZgIGV4cHIKKwkJeyAkJC5wYXJzZSA9IHBldmFsKCBFWFBSX0FORCwgJDEucGFyc2UsICQzLnBhcnNlICk7IH0KKwl8IGV4cHIgYCYmYCBleHByCisJCXsgJCQucGFyc2UgPSBwZXZhbCggRVhQUl9BTkQsICQxLnBhcnNlLCAkMy5wYXJzZSApOyB9CisJfCBleHByIGB8YCBleHByCisJCXsgJCQucGFyc2UgPSBwZXZhbCggRVhQUl9PUiwgJDEucGFyc2UsICQzLnBhcnNlICk7IH0KKwl8IGV4cHIgYHx8YCBleHByCisJCXsgJCQucGFyc2UgPSBwZXZhbCggRVhQUl9PUiwgJDEucGFyc2UsICQzLnBhcnNlICk7IH0KKwl8IGFyZyBgaW5gIGxpc3QKKwkJeyAkJC5wYXJzZSA9IHBldmFsKCBFWFBSX0lOLCAkMS5wYXJzZSwgJDMucGFyc2UgKTsgfQorCXwgYCFgIGV4cHIKKwkJeyAkJC5wYXJzZSA9IHBldmFsKCBFWFBSX05PVCwgJDIucGFyc2UsIHBudWxsKCkgKTsgfQorCXwgYChgIGV4cHIgYClgCisJCXsgJCQucGFyc2UgPSAkMi5wYXJzZTsgfQorCTsKKworCisvKgorICogY2FzZXMgLSBhY3Rpb24gZWxlbWVudHMgaW5zaWRlIGEgJ3N3aXRjaCcKKyAqIGNhc2UgLSBhIHNpbmdsZSBhY3Rpb24gZWxlbWVudCBpbnNpZGUgYSAnc3dpdGNoJworICogcmlnaHQtcmVjdXJzaXZlIHJ1bGUgc28gY2FzZXMgY2FuIGJlIGV4YW1pbmVkIGluIG9yZGVyLgorICovCisKK2Nhc2VzCTogLyogZW1wdHkgKi8KKwkJeyAkJC5wYXJzZSA9IFAwOyB9CisJfCBjYXNlIGNhc2VzCisJCXsgJCQucGFyc2UgPSBwbm9kZSggJDEucGFyc2UsICQyLnBhcnNlICk7IH0KKwk7CisKK2Nhc2UJOiBgY2FzZWAgQVJHIGA6YCBibG9jaworCQl7ICQkLnBhcnNlID0gcHNub2RlKCAkMi5zdHJpbmcsICQ0LnBhcnNlICk7IH0KKwk7CisKKy8qCisgKiBsb2wgLSBsaXN0IG9mIGxpc3RzCisgKiByaWdodC1yZWN1cnNpdmUgcnVsZSBzbyB0aGF0IGxpc3RzIGNhbiBiZSBhZGRlZCBpbiBvcmRlci4KKyAqLworCitsb2wJOiBsaXN0CisJCXsgJCQucGFyc2UgPSBwbm9kZSggUDAsICQxLnBhcnNlICk7IH0KKwl8IGxpc3QgYDpgIGxvbAorCQl7ICQkLnBhcnNlID0gcG5vZGUoICQzLnBhcnNlLCAkMS5wYXJzZSApOyB9CisJOworCisvKgorICogbGlzdCAtIHplcm8gb3IgbW9yZSBhcmdzIGluIGEgTElTVAorICogbGlzdHAgLSBsaXN0IChpbiBwdW5jdXRhdGlvbiBvbmx5IG1vZGUpCisgKiBhcmcgLSBvbmUgQVJHIG9yIGZ1bmN0aW9uIGNhbGwKKyAqLworCitsaXN0CTogbGlzdHAKKwkJeyAkJC5wYXJzZSA9ICQxLnBhcnNlOyB5eW1vZGUoIFNDQU5fTk9STUFMICk7IH0KKwk7CisKK2xpc3RwCTogLyogZW1wdHkgKi8KKwkJeyAkJC5wYXJzZSA9IHBudWxsKCk7IHl5bW9kZSggU0NBTl9QVU5DVCApOyB9CisJfCBsaXN0cCBhcmcKKyAgICAgICAgCXsgJCQucGFyc2UgPSBwYXBwZW5kKCAkMS5wYXJzZSwgJDIucGFyc2UgKTsgfQorCTsKKworYXJnCTogQVJHCisJCXsgJCQucGFyc2UgPSBwbGlzdCggJDEuc3RyaW5nICk7IH0KKwl8IGBbYCB7IHl5bW9kZSggU0NBTl9OT1JNQUwgKTsgfSBmdW5jIGBdYAorCQl7ICQkLnBhcnNlID0gJDMucGFyc2U7IH0KKwk7CisKKy8qCisgKiBmdW5jIC0gYSBmdW5jdGlvbiBjYWxsIChpbnNpZGUgW10pCisgKiBUaGlzIG5lZWRzIHRvIGJlIHNwbGl0IGNsZWFubHkgb3V0IG9mICdydWxlJworICovCisKK2Z1bmMJOiBBUkcgbG9sCisJCXsgJCQucGFyc2UgPSBwcnVsZSggJDEuc3RyaW5nLCAkMi5wYXJzZSApOyB9CisJfCBgb25gIGFyZyBBUkcgbG9sCisJCXsgJCQucGFyc2UgPSBwb24oICQyLnBhcnNlLCBwcnVsZSggJDMuc3RyaW5nLCAkNC5wYXJzZSApICk7IH0KKwl8IGBvbmAgYXJnIGByZXR1cm5gIGxpc3QKKwkJeyAkJC5wYXJzZSA9IHBvbiggJDIucGFyc2UsICQ0LnBhcnNlICk7IH0KKwk7CisKKworLyoKKyAqIGVmbGFncyAtIHplcm8gb3IgbW9yZSBtb2RpZmllcnMgdG8gJ2V4ZWN1dGVzJworICogZWZsYWcgLSBhIHNpbmdsZSBtb2RpZmllciB0byAnZXhlY3V0ZXMnCisgKi8KKworZWZsYWdzCTogLyogZW1wdHkgKi8KKwkJeyAkJC5udW1iZXIgPSAwOyB9CisJfCBlZmxhZ3MgZWZsYWcKKwkJeyAkJC5udW1iZXIgPSAkMS5udW1iZXIgfCAkMi5udW1iZXI7IH0KKwk7CisKK2VmbGFnCTogYHVwZGF0ZWRgCisJCXsgJCQubnVtYmVyID0gRVhFQ19VUERBVEVEOyB9CisJfCBgdG9nZXRoZXJgCisJCXsgJCQubnVtYmVyID0gRVhFQ19UT0dFVEhFUjsgfQorCXwgYGlnbm9yZWAKKwkJeyAkJC5udW1iZXIgPSBFWEVDX0lHTk9SRTsgfQorCXwgYHF1aWV0bHlgCisJCXsgJCQubnVtYmVyID0gRVhFQ19RVUlFVExZOyB9CisJfCBgcGllY2VtZWFsYAorCQl7ICQkLm51bWJlciA9IEVYRUNfUElFQ0VNRUFMOyB9CisJfCBgZXhpc3RpbmdgCisJCXsgJCQubnVtYmVyID0gRVhFQ19FWElTVElORzsgfQorCTsKKworCisvKgorICogYmluZGxpc3QgLSBsaXN0IG9mIHZhcmlhYmxlIHRvIGJpbmQgZm9yIGFuIGFjdGlvbgorICovCisKK2JpbmRsaXN0IDogLyogZW1wdHkgKi8KKwkJeyAkJC5wYXJzZSA9IHBudWxsKCk7IH0KKwl8IGBiaW5kYCBsaXN0CisJCXsgJCQucGFyc2UgPSAkMi5wYXJzZTsgfQorCTsKKworCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9qYW1ncmFtdGFiLmggYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9qYW1ncmFtdGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmZDQzZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2phbWdyYW10YWIuaApAQCAtMCwwICsxLDQ0IEBACisgICAgeyAiISIsIF9CQU5HX3QgfSwKKyAgICB7ICIhPSIsIF9CQU5HX0VRVUFMU190IH0sCisgICAgeyAiJiIsIF9BTVBFUl90IH0sCisgICAgeyAiJiYiLCBfQU1QRVJBTVBFUl90IH0sCisgICAgeyAiKCIsIF9MUEFSRU5fdCB9LAorICAgIHsgIikiLCBfUlBBUkVOX3QgfSwKKyAgICB7ICIrPSIsIF9QTFVTX0VRVUFMU190IH0sCisgICAgeyAiOiIsIF9DT0xPTl90IH0sCisgICAgeyAiOyIsIF9TRU1JQ190IH0sCisgICAgeyAiPCIsIF9MQU5HTEVfdCB9LAorICAgIHsgIjw9IiwgX0xBTkdMRV9FUVVBTFNfdCB9LAorICAgIHsgIj0iLCBfRVFVQUxTX3QgfSwKKyAgICB7ICI+IiwgX1JBTkdMRV90IH0sCisgICAgeyAiPj0iLCBfUkFOR0xFX0VRVUFMU190IH0sCisgICAgeyAiPz0iLCBfUVVFU1RJT05fRVFVQUxTX3QgfSwKKyAgICB7ICJbIiwgX0xCUkFDS0VUX3QgfSwKKyAgICB7ICJdIiwgX1JCUkFDS0VUX3QgfSwKKyAgICB7ICJhY3Rpb25zIiwgQUNUSU9OU190IH0sCisgICAgeyAiYmluZCIsIEJJTkRfdCB9LAorICAgIHsgImNhc2UiLCBDQVNFX3QgfSwKKyAgICB7ICJjbGFzcyIsIENMQVNTX3QgfSwKKyAgICB7ICJkZWZhdWx0IiwgREVGQVVMVF90IH0sCisgICAgeyAiZWxzZSIsIEVMU0VfdCB9LAorICAgIHsgImV4aXN0aW5nIiwgRVhJU1RJTkdfdCB9LAorICAgIHsgImZvciIsIEZPUl90IH0sCisgICAgeyAiaWYiLCBJRl90IH0sCisgICAgeyAiaWdub3JlIiwgSUdOT1JFX3QgfSwKKyAgICB7ICJpbiIsIElOX3QgfSwKKyAgICB7ICJpbmNsdWRlIiwgSU5DTFVERV90IH0sCisgICAgeyAibG9jYWwiLCBMT0NBTF90IH0sCisgICAgeyAibW9kdWxlIiwgTU9EVUxFX3QgfSwKKyAgICB7ICJvbiIsIE9OX3QgfSwKKyAgICB7ICJwaWVjZW1lYWwiLCBQSUVDRU1FQUxfdCB9LAorICAgIHsgInF1aWV0bHkiLCBRVUlFVExZX3QgfSwKKyAgICB7ICJyZXR1cm4iLCBSRVRVUk5fdCB9LAorICAgIHsgInJ1bGUiLCBSVUxFX3QgfSwKKyAgICB7ICJzd2l0Y2giLCBTV0lUQ0hfdCB9LAorICAgIHsgInRvZ2V0aGVyIiwgVE9HRVRIRVJfdCB9LAorICAgIHsgInVwZGF0ZWQiLCBVUERBVEVEX3QgfSwKKyAgICB7ICJ3aGlsZSIsIFdISUxFX3QgfSwKKyAgICB7ICJ7IiwgX0xCUkFDRV90IH0sCisgICAgeyAifCIsIF9CQVJfdCB9LAorICAgIHsgInx8IiwgX0JBUkJBUl90IH0sCisgICAgeyAifSIsIF9SQlJBQ0VfdCB9LApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbGlzdHMuYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2xpc3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyMzA5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2xpc3RzLmMKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NSBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qCisgKiBsaXN0cy5jIC0gbWFpbnRhaW4gbGlzdHMgb2Ygb2JqZWN0cworICovCisKKyNpbmNsdWRlICJqYW0uaCIKKyNpbmNsdWRlICJsaXN0cy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK3N0YXRpYyBMSVNUICogZnJlZWxpc3RbIDMyIF07ICAvKiBqdW5rcGlsZSBmb3IgbGlzdF9kZWFsbG9jKCkgKi8KKworc3RhdGljIHVuc2lnbmVkIGdldF9idWNrZXQoIHVuc2lnbmVkIHNpemUgKQoreworICAgIHVuc2lnbmVkIGJ1Y2tldCA9IDA7CisgICAgd2hpbGUgKCBzaXplID4gKCAxdSA8PCBidWNrZXQgKSApICsrYnVja2V0OworICAgIHJldHVybiBidWNrZXQ7Cit9CisKK3N0YXRpYyBMSVNUICogbGlzdF9hbGxvYyggdW5zaWduZWQgY29uc3Qgc2l6ZSApCit7CisgICAgdW5zaWduZWQgY29uc3QgYnVja2V0ID0gZ2V0X2J1Y2tldCggc2l6ZSApOworICAgIGlmICggZnJlZWxpc3RbIGJ1Y2tldCBdICkKKyAgICB7CisgICAgICAgIExJU1QgKiByZXN1bHQgPSBmcmVlbGlzdFsgYnVja2V0IF07CisgICAgICAgIGZyZWVsaXN0WyBidWNrZXQgXSA9IHJlc3VsdC0+aW1wbC5uZXh0OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gKExJU1QgKilCSkFNX01BTExPQyggc2l6ZW9mKCBMSVNUICkgKyAoIDF1IDw8IGJ1Y2tldCApICoKKyAgICAgICAgc2l6ZW9mKCBPQkpFQ1QgKiApICk7Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfZGVhbGxvYyggTElTVCAqIGwgKQoreworICAgIHVuc2lnbmVkIHNpemUgPSBsaXN0X2xlbmd0aCggbCApOworICAgIHVuc2lnbmVkIGJ1Y2tldDsKKyAgICBMSVNUICogbm9kZSA9IGw7CisKKyAgICBpZiAoIHNpemUgPT0gMCApIHJldHVybjsKKworICAgIGJ1Y2tldCA9IGdldF9idWNrZXQoIHNpemUgKTs7CisKKyNpZmRlZiBCSkFNX05PX01FTV9DQUNIRQorICAgIEJKQU1fRlJFRSggbm9kZSApOworI2Vsc2UKKyAgICBub2RlLT5pbXBsLm5leHQgPSBmcmVlbGlzdFsgYnVja2V0IF07CisgICAgZnJlZWxpc3RbIGJ1Y2tldCBdID0gbm9kZTsKKyNlbmRpZgorfQorCisvKgorICogbGlzdF9hcHBlbmQoKSAtIGFwcGVuZCBhIGxpc3Qgb250byBhbm90aGVyIG9uZSwgcmV0dXJuaW5nIHRvdGFsCisgKi8KKworTElTVCAqIGxpc3RfYXBwZW5kKCBMSVNUICogbCwgTElTVCAqIG5sICkKK3sKKyAgICBpZiAoIGxpc3RfZW1wdHkoIGwgKSApCisgICAgICAgIHJldHVybiBubDsKKyAgICBpZiAoICFsaXN0X2VtcHR5KCBubCApICkKKyAgICB7CisgICAgICAgIGludCBjb25zdCBsX3NpemUgPSBsaXN0X2xlbmd0aCggbCApOworICAgICAgICBpbnQgY29uc3Qgbmxfc2l6ZSA9IGxpc3RfbGVuZ3RoKCBubCApOworICAgICAgICBpbnQgY29uc3Qgc2l6ZSA9IGxfc2l6ZSArIG5sX3NpemU7CisgICAgICAgIHVuc2lnbmVkIGNvbnN0IGJ1Y2tldCA9IGdldF9idWNrZXQoIHNpemUgKTsKKworICAgICAgICAvKiBEbyB3ZSBuZWVkIHRvIHJlYWxsb2NhdGU/ICovCisgICAgICAgIGlmICggbF9zaXplIDw9ICggMXUgPDwgKCBidWNrZXQgLSAxICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1QgKiByZXN1bHQgPSBsaXN0X2FsbG9jKCBzaXplICk7CisgICAgICAgICAgICBtZW1jcHkoIGxpc3RfYmVnaW4oIHJlc3VsdCApLCBsaXN0X2JlZ2luKCBsICksIGxfc2l6ZSAqIHNpemVvZigKKyAgICAgICAgICAgICAgICBPQkpFQ1QgKiApICk7CisgICAgICAgICAgICBsaXN0X2RlYWxsb2MoIGwgKTsKKyAgICAgICAgICAgIGwgPSByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBsLT5pbXBsLnNpemUgPSBzaXplOworICAgICAgICBtZW1jcHkoIGxpc3RfYmVnaW4oIGwgKSArIGxfc2l6ZSwgbGlzdF9iZWdpbiggbmwgKSwgbmxfc2l6ZSAqIHNpemVvZigKKyAgICAgICAgICAgIE9CSkVDVCAqICkgKTsKKyAgICAgICAgbGlzdF9kZWFsbG9jKCBubCApOworICAgIH0KKyAgICByZXR1cm4gbDsKK30KKworTElTVElURVIgbGlzdF9iZWdpbiggTElTVCAqIGwgKQoreworICAgIHJldHVybiBsID8gKExJU1RJVEVSKSggKGNoYXIgKilsICsgc2l6ZW9mKCBMSVNUICkgKSA6IDA7Cit9CisKK0xJU1RJVEVSIGxpc3RfZW5kKCBMSVNUICogbCApCit7CisgICAgcmV0dXJuIGwgPyBsaXN0X2JlZ2luKCBsICkgKyBsLT5pbXBsLnNpemUgOiAwOworfQorCitMSVNUICogbGlzdF9uZXcoIE9CSkVDVCAqIHZhbHVlICkKK3sKKyAgICBMSVNUICogY29uc3QgaGVhZCA9IGxpc3RfYWxsb2MoIDEgKSA7CisgICAgaGVhZC0+aW1wbC5zaXplID0gMTsKKyAgICBsaXN0X2JlZ2luKCBoZWFkIClbIDAgXSA9IHZhbHVlOworICAgIHJldHVybiBoZWFkOworfQorCisvKgorICogbGlzdF9wdXNoX2JhY2soKSAtIHRhY2sgYSBzdHJpbmcgb250byB0aGUgZW5kIG9mIGEgbGlzdCBvZiBzdHJpbmdzCisgKi8KKworTElTVCAqIGxpc3RfcHVzaF9iYWNrKCBMSVNUICogaGVhZCwgT0JKRUNUICogdmFsdWUgKQoreworICAgIHVuc2lnbmVkIGludCBzaXplID0gbGlzdF9sZW5ndGgoIGhlYWQgKTsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIGlmICggREVCVUdfTElTVFMgKQorICAgICAgICBwcmludGYoICJsaXN0ID4gJXMgPFxuIiwgb2JqZWN0X3N0ciggdmFsdWUgKSApOworCisgICAgLyogSWYgdGhlIHNpemUgaXMgYSBwb3dlciBvZiAyLCByZWFsbG9jYXRlLiAqLworICAgIGlmICggc2l6ZSA9PSAwICkKKyAgICB7CisgICAgICAgIGhlYWQgPSBsaXN0X2FsbG9jKCAxICk7CisgICAgfQorICAgIGVsc2UgaWYgKCAoICggc2l6ZSAtIDEgKSAmIHNpemUgKSA9PSAwICkKKyAgICB7CisgICAgICAgIExJU1QgKiBsID0gbGlzdF9hbGxvYyggc2l6ZSArIDEgKTsKKyAgICAgICAgbWVtY3B5KCBsLCBoZWFkLCBzaXplb2YoIExJU1QgKSArIHNpemUgKiBzaXplb2YoIE9CSkVDVCAqICkgKTsKKyAgICAgICAgbGlzdF9kZWFsbG9jKCBoZWFkICk7CisgICAgICAgIGhlYWQgPSBsOworICAgIH0KKworICAgIGxpc3RfYmVnaW4oIGhlYWQgKVsgc2l6ZSBdID0gdmFsdWU7CisgICAgaGVhZC0+aW1wbC5zaXplID0gc2l6ZSArIDE7CisKKyAgICByZXR1cm4gaGVhZDsKK30KKworCisvKgorICogbGlzdF9jb3B5KCkgLSBjb3B5IGEgd2hvbGUgbGlzdCBvZiBzdHJpbmdzIChubCkgb250byBlbmQgb2YgYW5vdGhlciAobCkuCisgKi8KKworTElTVCAqIGxpc3RfY29weSggTElTVCAqIGwgKQoreworICAgIGludCBzaXplID0gbGlzdF9sZW5ndGgoIGwgKTsKKyAgICBpbnQgaTsKKyAgICBMSVNUICogcmVzdWx0OworCisgICAgaWYgKCBzaXplID09IDAgKSByZXR1cm4gTDA7CisKKyAgICByZXN1bHQgPSBsaXN0X2FsbG9jKCBzaXplICk7CisgICAgcmVzdWx0LT5pbXBsLnNpemUgPSBzaXplOworICAgIGZvciAoIGkgPSAwOyBpIDwgc2l6ZTsgKytpICkKKyAgICAgICAgbGlzdF9iZWdpbiggcmVzdWx0IClbIGkgXSA9IG9iamVjdF9jb3B5KCBsaXN0X2JlZ2luKCBsIClbIGkgXSApOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworTElTVCAqIGxpc3RfY29weV9yYW5nZSggTElTVCAqIGwsIExJU1RJVEVSIGZpcnN0LCBMSVNUSVRFUiBsYXN0ICkKK3sKKyAgICBpZiAoIGZpcnN0ID09IGxhc3QgKQorICAgICAgICByZXR1cm4gTDA7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IHNpemUgPSBsYXN0IC0gZmlyc3Q7CisgICAgICAgIExJU1QgKiByZXN1bHQgPSBsaXN0X2FsbG9jKCBzaXplICk7CisgICAgICAgIExJU1RJVEVSIGRlc3QgPSBsaXN0X2JlZ2luKCByZXN1bHQgKTsKKyAgICAgICAgcmVzdWx0LT5pbXBsLnNpemUgPSBzaXplOworICAgICAgICBmb3IgKCA7IGZpcnN0ICE9IGxhc3Q7ICsrZmlyc3QsICsrZGVzdCApCisgICAgICAgICAgICAqZGVzdCA9IG9iamVjdF9jb3B5KCAqZmlyc3QgKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKKworLyoKKyAqIGxpc3Rfc3VibGlzdCgpIC0gY29weSBhIHN1YnNldCBvZiBhIGxpc3Qgb2Ygc3RyaW5ncy4KKyAqLworCitMSVNUICogbGlzdF9zdWJsaXN0KCBMSVNUICogbCwgaW50IHN0YXJ0LCBpbnQgY291bnQgKQoreworICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50OworICAgIGludCBzaXplID0gbGlzdF9sZW5ndGgoIGwgKTsKKyAgICBpZiAoIHN0YXJ0ID49IHNpemUgKSByZXR1cm4gTDA7CisgICAgaWYgKCBlbmQgPiBzaXplICkgZW5kID0gc2l6ZTsKKyAgICByZXR1cm4gbGlzdF9jb3B5X3JhbmdlKCBsLCBsaXN0X2JlZ2luKCBsICkgKyBzdGFydCwgbGlzdF9iZWdpbiggbCApICsgZW5kICk7Cit9CisKKworc3RhdGljIGludCBzdHJfcHRyX2NvbXBhcmUoIHZvaWQgY29uc3QgKiB2YSwgdm9pZCBjb25zdCAqIHZiICkKK3sKKyAgICBPQkpFQ1QgKiBhID0gKiggKE9CSkVDVCAqICopdmEgKTsKKyAgICBPQkpFQ1QgKiBiID0gKiggKE9CSkVDVCAqICopdmIgKTsKKyAgICByZXR1cm4gc3RyY21wKCBvYmplY3Rfc3RyKCBhICksIG9iamVjdF9zdHIoIGIgKSApOworfQorCisKK0xJU1QgKiBsaXN0X3NvcnQoIExJU1QgKiBsICkKK3sKKyAgICBpbnQgbGVuOworICAgIGludCBpaTsKKyAgICBMSVNUICogcmVzdWx0OworCisgICAgaWYgKCAhbCApCisgICAgICAgIHJldHVybiBMMDsKKworICAgIGxlbiA9IGxpc3RfbGVuZ3RoKCBsICk7CisgICAgcmVzdWx0ID0gbGlzdF9jb3B5KCBsICk7CisKKyAgICBxc29ydCggbGlzdF9iZWdpbiggcmVzdWx0ICksIGxlbiwgc2l6ZW9mKCBPQkpFQ1QgKiApLCBzdHJfcHRyX2NvbXBhcmUgKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIGxpc3RfZnJlZSgpIC0gZnJlZSBhIGxpc3Qgb2Ygc3RyaW5ncworICovCisKK3ZvaWQgbGlzdF9mcmVlKCBMSVNUICogaGVhZCApCit7CisgICAgaWYgKCAhbGlzdF9lbXB0eSggaGVhZCApICkKKyAgICB7CisgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCBoZWFkICk7CisgICAgICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCBoZWFkICk7CisgICAgICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgICAgICBvYmplY3RfZnJlZSggbGlzdF9pdGVtKCBpdGVyICkgKTsKKyAgICAgICAgbGlzdF9kZWFsbG9jKCBoZWFkICk7CisgICAgfQorfQorCisKKy8qCisgKiBsaXN0X3BvcF9mcm9udCgpIC0gcmVtb3ZlIHRoZSBmcm9udCBlbGVtZW50IGZyb20gYSBsaXN0IG9mIHN0cmluZ3MKKyAqLworCitMSVNUICogbGlzdF9wb3BfZnJvbnQoIExJU1QgKiBsICkKK3sKKyAgICB1bnNpZ25lZCBzaXplID0gbGlzdF9sZW5ndGgoIGwgKTsKKyAgICBhc3NlcnQoIHNpemUgKTsKKyAgICAtLXNpemU7CisgICAgb2JqZWN0X2ZyZWUoIGxpc3RfZnJvbnQoIGwgKSApOworCisgICAgaWYgKCBzaXplID09IDAgKQorICAgIHsKKyAgICAgICAgbGlzdF9kZWFsbG9jKCBsICk7CisgICAgICAgIHJldHVybiBMMDsKKyAgICB9CisKKyAgICBpZiAoICggKCBzaXplIC0gMSApICYgc2l6ZSApID09IDAgKQorICAgIHsKKyAgICAgICAgTElTVCAqIGNvbnN0IG5sID0gbGlzdF9hbGxvYyggc2l6ZSApOworICAgICAgICBubC0+aW1wbC5zaXplID0gc2l6ZTsKKyAgICAgICAgbWVtY3B5KCBsaXN0X2JlZ2luKCBubCApLCBsaXN0X2JlZ2luKCBsICkgKyAxLCBzaXplICogc2l6ZW9mKCBPQkpFQ1QgKiApCisgICAgICAgICAgICApOworICAgICAgICBsaXN0X2RlYWxsb2MoIGwgKTsKKyAgICAgICAgcmV0dXJuIG5sOworICAgIH0KKworICAgIGwtPmltcGwuc2l6ZSA9IHNpemU7CisgICAgbWVtbW92ZSggbGlzdF9iZWdpbiggbCApLCBsaXN0X2JlZ2luKCBsICkgKyAxLCBzaXplICogc2l6ZW9mKCBPQkpFQ1QgKiApICk7CisgICAgcmV0dXJuIGw7Cit9CisKK0xJU1QgKiBsaXN0X3JldmVyc2UoIExJU1QgKiBsICkKK3sKKyAgICBpbnQgc2l6ZSA9IGxpc3RfbGVuZ3RoKCBsICk7CisgICAgaWYgKCBzaXplID09IDAgKSByZXR1cm4gTDA7CisgICAgeworICAgICAgICBMSVNUICogY29uc3QgcmVzdWx0ID0gbGlzdF9hbGxvYyggc2l6ZSApOworICAgICAgICBpbnQgaTsKKyAgICAgICAgcmVzdWx0LT5pbXBsLnNpemUgPSBzaXplOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHNpemU7ICsraSApCisgICAgICAgICAgICBsaXN0X2JlZ2luKCByZXN1bHQgKVsgaSBdID0gb2JqZWN0X2NvcHkoIGxpc3RfYmVnaW4oIGwgKVsgc2l6ZSAtIGkgLQorICAgICAgICAgICAgICAgIDEgXSApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KKworaW50IGxpc3RfY21wKCBMSVNUICogdCwgTElTVCAqIHMgKQoreworICAgIGludCBzdGF0dXMgPSAwOworICAgIExJU1RJVEVSIHRfaXQgPSBsaXN0X2JlZ2luKCB0ICk7CisgICAgTElTVElURVIgY29uc3QgdF9lbmQgPSBsaXN0X2VuZCggdCApOworICAgIExJU1RJVEVSIHNfaXQgPSBsaXN0X2JlZ2luKCBzICk7CisgICAgTElTVElURVIgY29uc3Qgc19lbmQgPSBsaXN0X2VuZCggcyApOworCisgICAgd2hpbGUgKCAhc3RhdHVzICYmICggdF9pdCAhPSB0X2VuZCB8fCBzX2l0ICE9IHNfZW5kICkgKQorICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIHN0ID0gdF9pdCAhPSB0X2VuZCA/IG9iamVjdF9zdHIoIGxpc3RfaXRlbSggdF9pdCApICkgOiAiIjsKKyAgICAgICAgY2hhciBjb25zdCAqIHNzID0gc19pdCAhPSBzX2VuZCA/IG9iamVjdF9zdHIoIGxpc3RfaXRlbSggc19pdCApICkgOiAiIjsKKworICAgICAgICBzdGF0dXMgPSBzdHJjbXAoIHN0LCBzcyApOworCisgICAgICAgIHRfaXQgPSB0X2l0ICE9IHRfZW5kID8gbGlzdF9uZXh0KCB0X2l0ICkgOiB0X2l0OworICAgICAgICBzX2l0ID0gc19pdCAhPSBzX2VuZCA/IGxpc3RfbmV4dCggc19pdCApIDogc19pdDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitpbnQgbGlzdF9pc19zdWJsaXN0KCBMSVNUICogc3ViLCBMSVNUICogbCApCit7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIHN1YiApOworICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCBzdWIgKTsKKyAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgICAgICBpZiAoICFsaXN0X2luKCBsLCBsaXN0X2l0ZW0oIGl0ZXIgKSApICkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCisvKgorICogbGlzdF9wcmludCgpIC0gcHJpbnQgYSBsaXN0IG9mIHN0cmluZ3MgdG8gc3Rkb3V0CisgKi8KKwordm9pZCBsaXN0X3ByaW50KCBMSVNUICogbCApCit7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIGwgKSwgZW5kID0gbGlzdF9lbmQoIGwgKTsKKyAgICBpZiAoIGl0ZXIgIT0gZW5kICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiVzIiwgb2JqZWN0X3N0ciggbGlzdF9pdGVtKCBpdGVyICkgKSApOworICAgICAgICBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICk7CisgICAgICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgICAgICBwcmludGYoICIgJXMiLCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApICk7CisgICAgfQorfQorCisKKy8qCisgKiBsaXN0X2xlbmd0aCgpIC0gcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGxpc3QKKyAqLworCitpbnQgbGlzdF9sZW5ndGgoIExJU1QgKiBsICkKK3sKKyAgICByZXR1cm4gbCA/IGwtPmltcGwuc2l6ZSA6IDA7Cit9CisKKworaW50IGxpc3RfaW4oIExJU1QgKiBsLCBPQkpFQ1QgKiB2YWx1ZSApCit7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIGwgKTsKKyAgICBMSVNUSVRFUiBlbmQgPSBsaXN0X2VuZCggbCApOworICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgIGlmICggb2JqZWN0X2VxdWFsKCBsaXN0X2l0ZW0oIGl0ZXIgKSwgdmFsdWUgKSApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworCitMSVNUICogbGlzdF91bmlxdWUoIExJU1QgKiBzb3J0ZWRfbGlzdCApCit7CisgICAgTElTVCAqIHJlc3VsdCA9IEwwOworICAgIE9CSkVDVCAqIGxhc3RfYWRkZWQgPSAwOworCisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIHNvcnRlZF9saXN0ICksIGVuZCA9IGxpc3RfZW5kKCBzb3J0ZWRfbGlzdCApOworICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgeworICAgICAgICBpZiAoICFsYXN0X2FkZGVkIHx8ICFvYmplY3RfZXF1YWwoIGxpc3RfaXRlbSggaXRlciApLCBsYXN0X2FkZGVkICkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBsaXN0X3B1c2hfYmFjayggcmVzdWx0LCBvYmplY3RfY29weSggbGlzdF9pdGVtKCBpdGVyICkgKSApOworICAgICAgICAgICAgbGFzdF9hZGRlZCA9IGxpc3RfaXRlbSggaXRlciApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgbGlzdF9kb25lKCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IHNpemVvZiggZnJlZWxpc3QgKSAvIHNpemVvZiggZnJlZWxpc3RbIDAgXSApOyArK2kgKQorICAgIHsKKyAgICAgICAgTElTVCAqIGwgPSBmcmVlbGlzdFsgaSBdOworICAgICAgICB3aGlsZSAoIGwgKQorICAgICAgICB7CisgICAgICAgICAgICBMSVNUICogY29uc3QgdG1wID0gbDsKKyAgICAgICAgICAgIGwgPSBsLT5pbXBsLm5leHQ7CisgICAgICAgICAgICBCSkFNX0ZSRUUoIHRtcCApOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qCisgKiBsb2xfaW5pdCgpIC0gaW5pdGlhbGl6ZSBhIExPTCAobGlzdCBvZiBsaXN0cykuCisgKi8KKwordm9pZCBsb2xfaW5pdCggTE9MICogbG9sICkKK3sKKyAgICBsb2wtPmNvdW50ID0gMDsKK30KKworCisvKgorICogbG9sX2FkZCgpIC0gYXBwZW5kIGEgTElTVCBvbnRvIGFuIExPTC4KKyAqLworCit2b2lkIGxvbF9hZGQoIExPTCAqIGxvbCwgTElTVCAqIGwgKQoreworICAgIGlmICggbG9sLT5jb3VudCA8IExPTF9NQVggKQorICAgICAgICBsb2wtPmxpc3RbIGxvbC0+Y291bnQrKyBdID0gbDsKK30KKworCisvKgorICogbG9sX2ZyZWUoKSAtIGZyZWUgdGhlIExPTCBhbmQgaXRzIExJU1RzLgorICovCisKK3ZvaWQgbG9sX2ZyZWUoIExPTCAqIGxvbCApCit7CisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBsb2wtPmNvdW50OyArK2kgKQorICAgICAgICBsaXN0X2ZyZWUoIGxvbC0+bGlzdFsgaSBdICk7CisgICAgbG9sLT5jb3VudCA9IDA7Cit9CisKKworLyoKKyAqIGxvbF9nZXQoKSAtIHJldHVybiBvbmUgb2YgdGhlIExJU1RzIGluIHRoZSBMT0wuCisgKi8KKworTElTVCAqIGxvbF9nZXQoIExPTCAqIGxvbCwgaW50IGkgKQoreworICAgIHJldHVybiBpIDwgbG9sLT5jb3VudCA/IGxvbC0+bGlzdFsgaSBdIDogTDA7Cit9CisKKworLyoKKyAqIGxvbF9wcmludCgpIC0gZGVidWcgcHJpbnQgTElTVFMgc2VwYXJhdGVkIGJ5ICI6Ii4KKyAqLworCit2b2lkIGxvbF9wcmludCggTE9MICogbG9sICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGxvbC0+Y291bnQ7ICsraSApCisgICAgeworICAgICAgICBpZiAoIGkgKQorICAgICAgICAgICAgcHJpbnRmKCAiIDogIiApOworICAgICAgICBsaXN0X3ByaW50KCBsb2wtPmxpc3RbIGkgXSApOworICAgIH0KK30KKworI2lmZGVmIEhBVkVfUFlUSE9OCisKK1B5T2JqZWN0ICogbGlzdF90b19weXRob24oIExJU1QgKiBsICkKK3sKKyAgICBQeU9iamVjdCAqIHJlc3VsdCA9IFB5TGlzdF9OZXcoIDAgKTsKKyAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggbCApOworICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCBsICk7CisgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICB7CisgICAgICAgIFB5T2JqZWN0ICogcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICkgKTsKKyAgICAgICAgUHlMaXN0X0FwcGVuZCggcmVzdWx0LCBzICk7CisgICAgICAgIFB5X0RFQ1JFRiggcyApOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0xJU1QgKiBsaXN0X2Zyb21fcHl0aG9uKCBQeU9iamVjdCAqIGwgKQoreworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKworICAgIFB5X3NzaXplX3QgbiA9IFB5U2VxdWVuY2VfU2l6ZSggbCApOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG47ICsraSApCisgICAgeworICAgICAgICBQeU9iamVjdCAqIHYgPSBQeVNlcXVlbmNlX0dldEl0ZW0oIGwsIGkgKTsKKyAgICAgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwgb2JqZWN0X25ldyggUHlTdHJpbmdfQXNTdHJpbmcoIHYgKSApICk7CisgICAgICAgIFB5X0RFQ1JFRiggdiApOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbGlzdHMuaCBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2xpc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkOGZlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL2xpc3RzLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NSBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qICBUaGlzIGZpbGUgaXMgQUxTTzoKKyAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IERhdmlkIEFicmFoYW1zLgorICogIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworLyoKKyAqIGxpc3RzLmggLSB0aGUgTElTVCBzdHJ1Y3R1cmUgYW5kIHJvdXRpbmVzIHRvIG1hbmlwdWxhdGUgdGhlbQorICoKKyAqIFRoZSB3aG9sZSBvZiBqYW0gcmVsaWVzIG9uIGxpc3RzIG9mIG9iamVjdHMgYXMgYSBkYXRhdHlwZS4gVGhpcyBtb2R1bGUsIGluCisgKiBjb25qdW5jdGlvbiB3aXRoIG9iamVjdC5jLCBoYW5kbGVzIHRoZXNlIHJlbGF0aXZlbHkgZWZmaWNpZW50bHkuCisgKgorICogU3RydWN0dXJlcyBkZWZpbmVkOgorICoKKyAqICBMSVNUIC0gbGlzdCBvZiBPQkpFQ1RzCisgKiAgTE9MIC0gbGlzdCBvZiBMSVNUcworICoKKyAqIEV4dGVybmFsIHJvdXRpbmVzOgorICoKKyAqICBsaXN0X2FwcGVuZCgpIC0gYXBwZW5kIGEgbGlzdCBvbnRvIGFub3RoZXIgb25lLCByZXR1cm5pbmcgdG90YWwKKyAqICBsaXN0X25ldygpIC0gdGFjayBhbiBvYmplY3Qgb250byB0aGUgZW5kIG9mIGEgbGlzdCBvZiBvYmplY3RzCisgKiAgbGlzdF9jb3B5KCkgLSBjb3B5IGEgd2hvbGUgbGlzdCBvZiBvYmplY3RzCisgKiAgbGlzdF9zdWJsaXN0KCkgLSBjb3B5IGEgc3Vic2V0IG9mIGEgbGlzdCBvZiBvYmplY3RzCisgKiAgbGlzdF9mcmVlKCkgLSBmcmVlIGEgbGlzdCBvZiBvYmplY3RzCisgKiAgbGlzdF9wcmludCgpIC0gcHJpbnQgYSBsaXN0IG9mIG9iamVjdHMgdG8gc3Rkb3V0CisgKiAgbGlzdF9sZW5ndGgoKSAtIHJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBsaXN0CisgKgorICogIGxvbF9pbml0KCkgLSBpbml0aWFsaXplIGEgTE9MIChsaXN0IG9mIGxpc3RzKQorICogIGxvbF9hZGQoKSAtIGFwcGVuZCBhIExJU1Qgb250byBhbiBMT0wKKyAqICBsb2xfZnJlZSgpIC0gZnJlZSB0aGUgTE9MIGFuZCBpdHMgTElTVHMKKyAqICBsb2xfZ2V0KCkgLSByZXR1cm4gb25lIG9mIHRoZSBMSVNUcyBpbiB0aGUgTE9MCisgKiAgbG9sX3ByaW50KCkgLSBkZWJ1ZyBwcmludCBMSVNUUyBzZXBhcmF0ZWQgYnkgIjoiCisgKi8KKworI2lmbmRlZiBMSVNUU19EV0EyMDAxMTAyMl9ICisjZGVmaW5lIExJU1RTX0RXQTIwMDExMDIyX0gKKworI2luY2x1ZGUgIm9iamVjdC5oIgorCisjaWZkZWYgSEFWRV9QWVRIT04KKyMgaW5jbHVkZSA8UHl0aG9uLmg+CisjZW5kaWYKKworLyoKKyAqIExJU1QgLSBsaXN0IG9mIHN0cmluZ3MKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfbGlzdCB7CisgICAgdW5pb24geworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgc3RydWN0IF9saXN0ICogbmV4dDsKKyAgICAgICAgT0JKRUNUICogYWxpZ247CisgICAgfSBpbXBsOworfSBMSVNUOworCit0eXBlZGVmIE9CSkVDVCAqICogTElTVElURVI7CisKKy8qCisgKiBMT0wgLSBsaXN0IG9mIExJU1RzCisgKi8KKworI2RlZmluZSBMT0xfTUFYIDE5Cit0eXBlZGVmIHN0cnVjdCBfbG9sIHsKKyAgICBpbnQgY291bnQ7CisgICAgTElTVCAqIGxpc3RbIExPTF9NQVggXTsKK30gTE9MOworCitMSVNUICogbGlzdF9uZXcoIE9CSkVDVCAqIHZhbHVlICk7CitMSVNUICogbGlzdF9hcHBlbmQoIExJU1QgKiBkZXN0aW5hdGlvbiwgTElTVCAqIHNvdXJjZSApOworTElTVCAqIGxpc3RfY29weSggTElTVCAqICk7CitMSVNUICogbGlzdF9jb3B5X3JhbmdlKCBMSVNUICogZGVzdGluYXRpb24sIExJU1RJVEVSIGZpcnN0LCBMSVNUSVRFUiBsYXN0ICk7Cit2b2lkICAgbGlzdF9mcmVlKCBMSVNUICogaGVhZCApOworTElTVCAqIGxpc3RfcHVzaF9iYWNrKCBMSVNUICogaGVhZCwgT0JKRUNUICogdmFsdWUgKTsKK3ZvaWQgICBsaXN0X3ByaW50KCBMSVNUICogKTsKK2ludCAgICBsaXN0X2xlbmd0aCggTElTVCAqICk7CitMSVNUICogbGlzdF9zdWJsaXN0KCBMSVNUICosIGludCBzdGFydCwgaW50IGNvdW50ICk7CitMSVNUICogbGlzdF9wb3BfZnJvbnQoIExJU1QgKiApOworTElTVCAqIGxpc3Rfc29ydCggTElTVCAqICk7CitMSVNUICogbGlzdF91bmlxdWUoIExJU1QgKiBzb3J0ZWRfbGlzdCApOworaW50ICAgIGxpc3RfaW4oIExJU1QgKiwgT0JKRUNUICogdmFsdWUgKTsKK0xJU1QgKiBsaXN0X3JldmVyc2UoIExJU1QgKiApOworaW50ICAgIGxpc3RfY21wKCBMSVNUICogbGhzLCBMSVNUICogcmhzICk7CitpbnQgICAgbGlzdF9pc19zdWJsaXN0KCBMSVNUICogc3ViLCBMSVNUICogbCApOwordm9pZCAgIGxpc3RfZG9uZSgpOworCitMSVNUSVRFUiBsaXN0X2JlZ2luKCBMSVNUICogKTsKK0xJU1RJVEVSIGxpc3RfZW5kKCBMSVNUICogKTsKKyNkZWZpbmUgbGlzdF9uZXh0KCBpdCApICgoaXQpICsgMSkKKyNkZWZpbmUgbGlzdF9pdGVtKCBpdCApICgqKGl0KSkKKyNkZWZpbmUgbGlzdF9lbXB0eSggbCApICgobCkgPT0gTDApCisjZGVmaW5lIGxpc3RfZnJvbnQoIGwgKSBsaXN0X2l0ZW0oIGxpc3RfYmVnaW4oIGwgKSApCisKKyNkZWZpbmUgTDAgKChMSVNUICopMCkKKwordm9pZCAgIGxvbF9hZGQoIExPTCAqLCBMSVNUICogKTsKK3ZvaWQgICBsb2xfaW5pdCggTE9MICogKTsKK3ZvaWQgICBsb2xfZnJlZSggTE9MICogKTsKK0xJU1QgKiBsb2xfZ2V0KCBMT0wgKiwgaW50IGkgKTsKK3ZvaWQgICBsb2xfcHJpbnQoIExPTCAqICk7Cit2b2lkICAgbG9sX2J1aWxkKCBMT0wgKiwgY2hhciBjb25zdCAqICogZWxlbWVudHMgKTsKKworI2lmZGVmIEhBVkVfUFlUSE9OCitQeU9iamVjdCAqIGxpc3RfdG9fcHl0aG9uKCBMSVNUICogKTsKK0xJU1QgKiBsaXN0X2Zyb21fcHl0aG9uKCBQeU9iamVjdCAqICk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tYWtlLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tYWtlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjOGJiOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21ha2UuYwpAQCAtMCwwICsxLDkwOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk1IENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyogIFRoaXMgZmlsZSBpcyBBTFNPOgorICogIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisvKgorICogbWFrZS5jIC0gYnJpbmcgYSB0YXJnZXQgdXAgdG8gZGF0ZSwgb25jZSBydWxlcyBhcmUgaW4gcGxhY2UuCisgKgorICogVGhpcyBtb2R1bGVzIGNvbnRyb2xzIHRoZSBleGVjdXRpb24gb2YgcnVsZXMgdG8gYnJpbmcgYSB0YXJnZXQgYW5kIGl0cworICogZGVwZW5kZW5jaWVzIHVwIHRvIGRhdGUuIEl0IGlzIGludm9rZWQgYWZ0ZXIgdGhlIHRhcmdldHMsIHJ1bGVzLCBldC4gYWwuCisgKiBkZXNjcmliZWQgaW4gcnVsZXMuaCBhcmUgY3JlYXRlZCBieSB0aGUgaW50ZXJwcmV0aW5nIGphbSBmaWxlcy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gbWFrZSgpIGVudHJ5IHBvaW50IGFuZCB0aGUgZmlyc3QgcGFzcyBtYWtlMCgpLgorICogVGhlIHNlY29uZCBwYXNzLCBtYWtlMSgpLCB3aGljaCBhY3R1YWxseSBkb2VzIHRoZSBjb21tYW5kIGV4ZWN1dGlvbiwgaXMgaW4KKyAqIG1ha2UxLmMuCisgKgorICogRXh0ZXJuYWwgcm91dGluZXM6CisgKiAgbWFrZSgpIC0gbWFrZSBhIHRhcmdldCwgZ2l2ZW4gaXRzIG5hbWUKKyAqCisgKiBJbnRlcm5hbCByb3V0aW5lczoKKyAqICBtYWtlMCgpIC0gYmluZCBhbmQgc2NhbiBldmVyeXRoaW5nIHRvIG1ha2UgYSBUQVJHRVQKKyAqICBtYWtlMHNvcnQoKSAtIHJlb3JkZXIgVEFSR0VUUyBjaGFpbiBieSB0aGVpciB0aW1lIChuZXdlc3QgdG8gb2xkZXN0KQorICovCisKKyNpbmNsdWRlICJqYW0uaCIKKyNpbmNsdWRlICJtYWtlLmgiCisKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaWZkZWYgT1BUX0hFQURFUl9DQUNIRV9FWFQKKyMgaW5jbHVkZSAiaGNhY2hlLmgiCisjZW5kaWYKKyNpbmNsdWRlICJoZWFkZXJzLmgiCisjaW5jbHVkZSAibGlzdHMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJwYXJzZS5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisjaW5jbHVkZSAic2VhcmNoLmgiCisjaW5jbHVkZSAidGltZXN0YW1wLmgiCisjaW5jbHVkZSAidmFyaWFibGUuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaWZuZGVmIG1heAorIyBkZWZpbmUgbWF4KGEsYikgKChhKT4oYik/KGEpOihiKSkKKyNlbmRpZgorCitzdGF0aWMgVEFSR0VUUyAqIG1ha2Uwc29ydCggVEFSR0VUUyAqIGMgKTsKKworI2lmZGVmIE9QVF9HUkFQSF9ERUJVR19FWFQKKyAgICBzdGF0aWMgdm9pZCBkZXBlbmRHcmFwaE91dHB1dCggVEFSR0VUICogdCwgaW50IGRlcHRoICk7CisjZW5kaWYKKworc3RhdGljIGNoYXIgY29uc3QgKiB0YXJnZXRfZmF0ZVtdID0KK3sKKyAgICAiaW5pdCIsICAgICAvKiBUX0ZBVEVfSU5JVCAgICAgKi8KKyAgICAibWFraW5nIiwgICAvKiBUX0ZBVEVfTUFLSU5HICAgKi8KKyAgICAic3RhYmxlIiwgICAvKiBUX0ZBVEVfU1RBQkxFICAgKi8KKyAgICAibmV3ZXIiLCAgICAvKiBUX0ZBVEVfTkVXRVIgICAgKi8KKyAgICAidGVtcCIsICAgICAvKiBUX0ZBVEVfSVNUTVAgICAgKi8KKyAgICAidG91Y2hlZCIsICAvKiBUX0ZBVEVfVE9VQ0hFRCAgKi8KKyAgICAicmVidWlsZCIsICAvKiBUX0ZBVEVfUkVCVUlMRCAgKi8KKyAgICAibWlzc2luZyIsICAvKiBUX0ZBVEVfTUlTU0lORyAgKi8KKyAgICAibmVlZHRtcCIsICAvKiBUX0ZBVEVfTkVFRFRNUCAgKi8KKyAgICAib2xkIiwgICAgICAvKiBUX0ZBVEVfT1VUREFURUQgKi8KKyAgICAidXBkYXRlIiwgICAvKiBUX0ZBVEVfVVBEQVRFICAgKi8KKyAgICAibm9maW5kIiwgICAvKiBUX0ZBVEVfQ0FOVEZJTkQgKi8KKyAgICAibm9tYWtlIiAgICAvKiBUX0ZBVEVfQ0FOVE1BS0UgKi8KK307CisKK3N0YXRpYyBjaGFyIGNvbnN0ICogdGFyZ2V0X2JpbmRbXSA9Cit7CisgICAgInVuYm91bmQiLAorICAgICJtaXNzaW5nIiwKKyAgICAicGFyZW50cyIsCisgICAgImV4aXN0cyIsCit9OworCisjZGVmaW5lIHNwYWNlcyh4KSAoICIgICAgICAgICAgICAgICAgICAgICIgKyAoIHggPiAyMCA/IDAgOiAyMC14ICkgKQorCisKKy8qCisgKiBtYWtlKCkgLSBtYWtlIGEgdGFyZ2V0LCBnaXZlbiBpdHMgbmFtZS4KKyAqLworCitpbnQgbWFrZSggTElTVCAqIHRhcmdldHMsIGludCBhbnlob3cgKQoreworICAgIENPVU5UUyBjb3VudHNbIDEgXTsKKyAgICBpbnQgc3RhdHVzID0gMDsgIC8qIDEgaWYgYW55dGhpbmcgZmFpbHMgKi8KKworI2lmZGVmIE9QVF9IRUFERVJfQ0FDSEVfRVhUCisgICAgaGNhY2hlX2luaXQoKTsKKyNlbmRpZgorCisgICAgbWVtc2V0KCAoY2hhciAqKWNvdW50cywgMCwgc2l6ZW9mKCAqY291bnRzICkgKTsKKworICAgIC8qIEZpcnN0IGJpbmQgYWxsIHRhcmdldHMgd2l0aCBMT0NBVEVfVEFSR0VUIHNldHRpbmcuIFRoaXMgaXMgbmVlZGVkIHRvCisgICAgICogY29ycmVjdGx5IGhhbmRsZSBkZXBlbmRlbmNpZXMgdG8gZ2VuZXJhdGVkIGhlYWRlcnMuCisgICAgICovCisgICAgYmluZF9leHBsaWNpdGx5X2xvY2F0ZWRfdGFyZ2V0cygpOworCisgICAgeworICAgICAgICBMSVNUSVRFUiBpdGVyLCBlbmQ7CisgICAgICAgIFBST0ZJTEVfRU5URVIoIE1BS0VfTUFLRTAgKTsKKyAgICAgICAgZm9yICggaXRlciA9IGxpc3RfYmVnaW4oIHRhcmdldHMgKSwgZW5kID0gbGlzdF9lbmQoIHRhcmdldHMgKTsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRBUkdFVCAqIHQgPSBiaW5kdGFyZ2V0KCBsaXN0X2l0ZW0oIGl0ZXIgKSApOworICAgICAgICAgICAgaWYgKCB0LT5mYXRlID09IFRfRkFURV9JTklUICkKKyAgICAgICAgICAgICAgICBtYWtlMCggdCwgMCwgMCwgY291bnRzLCBhbnlob3csIDAgKTsKKyAgICAgICAgfQorICAgICAgICBQUk9GSUxFX0VYSVQoIE1BS0VfTUFLRTAgKTsKKyAgICB9CisKKyNpZmRlZiBPUFRfR1JBUEhfREVCVUdfRVhUCisgICAgaWYgKCBERUJVR19HUkFQSCApCisgICAgeworICAgICAgICBMSVNUSVRFUiBpdGVyLCBlbmQ7CisgICAgICAgIGZvciAoIGl0ZXIgPSBsaXN0X2JlZ2luKCB0YXJnZXRzICksIGVuZCA9IGxpc3RfZW5kKCB0YXJnZXRzICk7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgICAgICAgICBkZXBlbmRHcmFwaE91dHB1dCggYmluZHRhcmdldCggbGlzdF9pdGVtKCBpdGVyICkgKSwgMCApOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCBERUJVR19NQUtFICkKKyAgICB7CisgICAgICAgIGlmICggY291bnRzLT50YXJnZXRzICkKKyAgICAgICAgICAgIHByaW50ZiggIi4uLmZvdW5kICVkIHRhcmdldCVzLi4uXG4iLCBjb3VudHMtPnRhcmdldHMsCisgICAgICAgICAgICAgICAgY291bnRzLT50YXJnZXRzID4gMSA/ICJzIiA6ICIiICk7CisgICAgICAgIGlmICggY291bnRzLT50ZW1wICkKKyAgICAgICAgICAgIHByaW50ZiggIi4uLnVzaW5nICVkIHRlbXAgdGFyZ2V0JXMuLi5cbiIsIGNvdW50cy0+dGVtcCwKKyAgICAgICAgICAgICAgICBjb3VudHMtPnRlbXAgPiAxID8gInMiIDogIiIgKTsKKyAgICAgICAgaWYgKCBjb3VudHMtPnVwZGF0aW5nICkKKyAgICAgICAgICAgIHByaW50ZiggIi4uLnVwZGF0aW5nICVkIHRhcmdldCVzLi4uXG4iLCBjb3VudHMtPnVwZGF0aW5nLAorICAgICAgICAgICAgICAgIGNvdW50cy0+dXBkYXRpbmcgPiAxID8gInMiIDogIiIgKTsKKyAgICAgICAgaWYgKCBjb3VudHMtPmNhbnRmaW5kICkKKyAgICAgICAgICAgIHByaW50ZiggIi4uLmNhbid0IGZpbmQgJWQgdGFyZ2V0JXMuLi5cbiIsIGNvdW50cy0+Y2FudGZpbmQsCisgICAgICAgICAgICAgICAgY291bnRzLT5jYW50ZmluZCA+IDEgPyAicyIgOiAiIiApOworICAgICAgICBpZiAoIGNvdW50cy0+Y2FudG1ha2UgKQorICAgICAgICAgICAgcHJpbnRmKCAiLi4uY2FuJ3QgbWFrZSAlZCB0YXJnZXQlcy4uLlxuIiwgY291bnRzLT5jYW50bWFrZSwKKyAgICAgICAgICAgICAgICBjb3VudHMtPmNhbnRtYWtlID4gMSA/ICJzIiA6ICIiICk7CisgICAgfQorCisgICAgc3RhdHVzID0gY291bnRzLT5jYW50ZmluZCB8fCBjb3VudHMtPmNhbnRtYWtlOworCisgICAgeworICAgICAgICBQUk9GSUxFX0VOVEVSKCBNQUtFX01BS0UxICk7CisgICAgICAgIHN0YXR1cyB8PSBtYWtlMSggdGFyZ2V0cyApOworICAgICAgICBQUk9GSUxFX0VYSVQoIE1BS0VfTUFLRTEgKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qIEZvcmNlIGFueSBkZXBlbmRhbnRzIG9mIHQgdGhhdCBoYXZlIGFscmVhZHkgYXQgbGVhc3QgYmVndW4gYmVpbmcgdmlzaXRlZCBieQorICogbWFrZTAoKSB0byBiZSB1cGRhdGVkLgorICovCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9kZXBlbmRhbnRzKCBUQVJHRVQgKiB0ICkKK3sKKyAgICBUQVJHRVRTICogcTsKKworICAgIGZvciAoIHEgPSB0LT5kZXBlbmRhbnRzOyBxOyBxID0gcS0+bmV4dCApCisgICAgeworICAgICAgICBUQVJHRVQgKiBwID0gcS0+dGFyZ2V0OworICAgICAgICBjaGFyIGZhdGUwID0gcC0+ZmF0ZTsKKworICAgICAgICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgYXQgbGVhc3QgYmVndW4gdmlzaXRpbmcgaXQgYW5kIHdlIGFyZSBub3QgYWxyZWFkeQorICAgICAgICAgKiByZWJ1aWxkaW5nIGl0IGZvciBvdGhlciByZWFzb25zLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCAoIGZhdGUwICE9IFRfRkFURV9JTklUICkgJiYgKCBmYXRlMCA8IFRfRkFURV9CVUlMRCApICkKKyAgICAgICAgeworICAgICAgICAgICAgcC0+ZmF0ZSA9IFRfRkFURV9VUERBVEU7CisKKyAgICAgICAgICAgIGlmICggREVCVUdfRkFURSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCAiZmF0ZSBjaGFuZ2UgICVzIGZyb20gJXMgdG8gJXMgKGFzIGRlcGVuZGFudCBvZiAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc3RyKCBwLT5uYW1lICksIHRhcmdldF9mYXRlWyAoaW50KSBmYXRlMCBdLCB0YXJnZXRfZmF0ZVsgKGludCkgcC0+ZmF0ZSBdLCBvYmplY3Rfc3RyKCB0LT5uYW1lICkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgd2UgYXJlIGRvbmUgdmlzaXRpbmcgaXQsIGdvIGJhY2sgYW5kIG1ha2Ugc3VyZSBpdHMgZGVwZW5kYW50cworICAgICAgICAgICAgICogZ2V0IHJlYnVpbHQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggZmF0ZTAgPiBUX0ZBVEVfTUFLSU5HICkKKyAgICAgICAgICAgICAgICB1cGRhdGVfZGVwZW5kYW50cyggcCApOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qCisgKiBNYWtlIHN1cmUgdGhhdCBhbGwgb2YgdCdzIHJlYnVpbGRzIGdldCByZWJ1aWx0LgorICovCisKK3N0YXRpYyB2b2lkIGZvcmNlX3JlYnVpbGRzKCBUQVJHRVQgKiB0ICkKK3sKKyAgICBUQVJHRVRTICogZDsKKyAgICBmb3IgKCBkID0gdC0+cmVidWlsZHM7IGQ7IGQgPSBkLT5uZXh0ICkKKyAgICB7CisgICAgICAgIFRBUkdFVCAqIHIgPSBkLT50YXJnZXQ7CisKKyAgICAgICAgLyogSWYgaXQgaXMgbm90IGFscmVhZHkgYmVpbmcgcmVidWlsdCBmb3Igb3RoZXIgcmVhc29ucy4gKi8KKyAgICAgICAgaWYgKCByLT5mYXRlIDwgVF9GQVRFX0JVSUxEICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBERUJVR19GQVRFICkKKyAgICAgICAgICAgICAgICBwcmludGYoICJmYXRlIGNoYW5nZSAgJXMgZnJvbSAlcyB0byAlcyAoYnkgcmVidWlsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc3RyKCByLT5uYW1lICksIHRhcmdldF9mYXRlWyAoaW50KSByLT5mYXRlIF0sIHRhcmdldF9mYXRlWyBUX0ZBVEVfUkVCVUlMRCBdICk7CisKKyAgICAgICAgICAgIC8qIEZvcmNlIHJlYnVpbGQgaXQuICovCisgICAgICAgICAgICByLT5mYXRlID0gVF9GQVRFX1JFQlVJTEQ7CisKKyAgICAgICAgICAgIC8qIEFuZCBtYWtlIHN1cmUgaXRzIGRlcGVuZGFudHMgYXJlIHVwZGF0ZWQgdG9vLiAqLworICAgICAgICAgICAgdXBkYXRlX2RlcGVuZGFudHMoIHIgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitpbnQgbWFrZTByZXNjYW4oIFRBUkdFVCAqIHQsIFRBUkdFVCAqIHJlc2Nhbm5pbmcgKQoreworICAgIGludCByZXN1bHQgPSAwOworICAgIFRBUkdFVFMgKiBjOworCisgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgZm91bmQgYSBjeWNsZS4gKi8KKyAgICBpZiAoIHRhcmdldF9zY2MoIHQgKSA9PSByZXNjYW5uaW5nICkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgdmlzaXRlZCB0aGlzIG5vZGUsIGlnbm9yZSBpdC4gKi8KKyAgICBpZiAoIHQtPnJlc2Nhbm5pbmcgPT0gcmVzY2FubmluZyApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogSWYgdCBpcyBhbHJlYWR5IHVwZGF0ZWQsIGlnbm9yZSBpdC4gKi8KKyAgICBpZiAoIHQtPnNjY19yb290ID09IE5VTEwgJiYgdC0+cHJvZ3Jlc3MgPiBUX01BS0VfQUNUSVZFICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB0LT5yZXNjYW5uaW5nID0gcmVzY2FubmluZzsKKyAgICBmb3IgKCBjID0gdC0+ZGVwZW5kczsgYzsgYyA9IGMtPm5leHQgKQorICAgIHsKKyAgICAgICAgVEFSR0VUICogZGVwZW5kZW5jeSA9IGMtPnRhcmdldDsKKyAgICAgICAgLyogQWx3YXlzIHN0YXJ0IGF0IHRoZSByb290IG9mIGVhY2ggbmV3IHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnQuICovCisgICAgICAgIGlmICggdGFyZ2V0X3NjYyggZGVwZW5kZW5jeSApICE9IHRhcmdldF9zY2MoIHQgKSApCisgICAgICAgICAgICBkZXBlbmRlbmN5ID0gdGFyZ2V0X3NjYyggZGVwZW5kZW5jeSApOworICAgICAgICByZXN1bHQgfD0gbWFrZTByZXNjYW4oIGRlcGVuZGVuY3ksIHJlc2Nhbm5pbmcgKTsKKworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBwaWNrIHVwIHRoZSBuZXcgaW5jbHVkZSBub2RlLiAqLworICAgICAgICBpZiAoIGMtPnRhcmdldC0+aW5jbHVkZXMgPT0gcmVzY2FubmluZyApCisgICAgICAgICAgICByZXN1bHQgPSAxOworICAgIH0KKyAgICBpZiAoIHJlc3VsdCAmJiB0LT5zY2Nfcm9vdCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHQtPnNjY19yb290ID0gcmVzY2FubmluZzsKKyAgICAgICAgcmVzY2FubmluZy0+ZGVwZW5kcyA9IHRhcmdldGVudHJ5KCByZXNjYW5uaW5nLT5kZXBlbmRzLCB0ICk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIG1ha2UwKCkgLSBiaW5kIGFuZCBzY2FuIGV2ZXJ5dGhpbmcgdG8gbWFrZSBhIFRBUkdFVC4KKyAqCisgKiBSZWN1cnNpdmVseSBiaW5kcyBhIHRhcmdldCwgc2VhcmNoZXMgZm9yICNpbmNsdWRlZCBoZWFkZXJzLCBjYWxscyBpdHNlbGYgb24KKyAqIHRob3NlIGhlYWRlcnMgYW5kIGFueSBkZXBlbmRlbmNpZXMuCisgKi8KKwordm9pZCBtYWtlMAorKAorICAgIFRBUkdFVCAqIHQsCisgICAgVEFSR0VUICogcCwgICAgICAgLyogcGFyZW50ICovCisgICAgaW50ICAgICAgZGVwdGgsICAgLyogZm9yIGRpc3BsYXkgcHVycG9zZXMgKi8KKyAgICBDT1VOVFMgKiBjb3VudHMsICAvKiBmb3IgcmVwb3J0aW5nICovCisgICAgaW50ICAgICAgYW55aG93LAorICAgIFRBUkdFVCAqIHJlc2Nhbm5pbmcKKykgIC8qIGZvcmNpYmx5IHRvdWNoIGFsbCAocmVhbCkgdGFyZ2V0cyAqLworeworICAgIFRBUkdFVFMgICAgKiBjOworICAgIFRBUkdFVCAgICAgKiBwdGltZSA9IHQ7CisgICAgVEFSR0VUICAgICAqIGxvY2F0ZWRfdGFyZ2V0ID0gMDsKKyAgICB0aW1lc3RhbXAgICAgbGFzdDsKKyAgICB0aW1lc3RhbXAgICAgbGVhZjsKKyAgICB0aW1lc3RhbXAgICAgaGxhc3Q7CisgICAgaW50ICAgICAgICAgIGZhdGU7CisgICAgY2hhciBjb25zdCAqIGZsYWcgPSAiIjsKKyAgICBTRVRUSU5HUyAgICogczsKKworI2lmZGVmIE9QVF9HUkFQSF9ERUJVR19FWFQKKyAgICBpbnQgc2F2ZWRGYXRlOworICAgIGludCBvbGRUaW1lU3RhbXA7CisjZW5kaWYKKworICAgIGlmICggREVCVUdfTUFLRVBST0cgKQorICAgICAgICBwcmludGYoICJtYWtlXHQtLVx0JXMlc1xuIiwgc3BhY2VzKCBkZXB0aCApLCBvYmplY3Rfc3RyKCB0LT5uYW1lICkgKTsKKworICAgIC8qCisgICAgICogU3RlcCAxOiBJbml0aWFsaXplLgorICAgICAqLworCisgICAgaWYgKCBERUJVR19NQUtFUFJPRyApCisgICAgICAgIHByaW50ZiggIm1ha2VcdC0tXHQlcyVzXG4iLCBzcGFjZXMoIGRlcHRoICksIG9iamVjdF9zdHIoIHQtPm5hbWUgKSApOworCisgICAgdC0+ZmF0ZSA9IFRfRkFURV9NQUtJTkc7CisgICAgdC0+ZGVwdGggPSBkZXB0aDsKKworICAgIC8qCisgICAgICogU3RlcCAyOiBVbmRlciB0aGUgaW5mbHVlbmNlIG9mICJvbiB0YXJnZXQiIHZhcmlhYmxlcywgYmluZCB0aGUgdGFyZ2V0IGFuZAorICAgICAqIHNlYXJjaCBmb3IgaGVhZGVycy4KKyAgICAgKi8KKworICAgIC8qIFN0ZXAgMmE6IFNldCAib24gdGFyZ2V0IiB2YXJpYWJsZXMuICovCisgICAgcyA9IGNvcHlzZXR0aW5ncyggdC0+c2V0dGluZ3MgKTsKKyAgICBwdXNoc2V0dGluZ3MoIHJvb3RfbW9kdWxlKCksIHMgKTsKKworICAgIC8qIFN0ZXAgMmI6IEZpbmQgYW5kIHRpbWVzdGFtcCB0aGUgdGFyZ2V0IGZpbGUgKGlmIGl0IGlzIGEgZmlsZSkuICovCisgICAgaWYgKCAoIHQtPmJpbmRpbmcgPT0gVF9CSU5EX1VOQk9VTkQgKSAmJiAhKCB0LT5mbGFncyAmIFRfRkxBR19OT1RGSUxFICkgKQorICAgIHsKKyAgICAgICAgT0JKRUNUICogYW5vdGhlcl90YXJnZXQ7CisgICAgICAgIG9iamVjdF9mcmVlKCB0LT5ib3VuZG5hbWUgKTsKKyAgICAgICAgdC0+Ym91bmRuYW1lID0gc2VhcmNoKCB0LT5uYW1lLCAmdC0+dGltZSwgJmFub3RoZXJfdGFyZ2V0LAorICAgICAgICAgICAgdC0+ZmxhZ3MgJiBUX0ZMQUdfSVNGSUxFICk7CisgICAgICAgIC8qIElmIGl0IHdhcyBkZXRlY3RlZCB0aGF0IHRoaXMgdGFyZ2V0IHJlZmVycyB0byBhbiBhbHJlYWR5IGV4aXN0aW5nIGFuZAorICAgICAgICAgKiBib3VuZCB0YXJnZXQsIHdlIGFkZCBhIGRlcGVuZGVuY3kgc28gdGhhdCBldmVyeSB0YXJnZXQgZGVwZW5kaW5nIG9uCisgICAgICAgICAqIHVzIHdpbGwgZGVwZW5kIG9uIHRoYXQgb3RoZXIgdGFyZ2V0IGFzIHdlbGwuCisgICAgICAgICAqLworICAgICAgICBpZiAoIGFub3RoZXJfdGFyZ2V0ICkKKyAgICAgICAgICAgIGxvY2F0ZWRfdGFyZ2V0ID0gYmluZHRhcmdldCggYW5vdGhlcl90YXJnZXQgKTsKKworICAgICAgICB0LT5iaW5kaW5nID0gdGltZXN0YW1wX2VtcHR5KCAmdC0+dGltZSApCisgICAgICAgICAgICA/IFRfQklORF9NSVNTSU5HCisgICAgICAgICAgICA6IFRfQklORF9FWElTVFM7CisgICAgfQorCisgICAgLyogSU5URVJOQUwsIE5PVEZJTEUgaGVhZGVyIG5vZGVzIGhhdmUgdGhlIHRpbWUgb2YgdGhlaXIgcGFyZW50cy4gKi8KKyAgICBpZiAoIHAgJiYgKCB0LT5mbGFncyAmIFRfRkxBR19JTlRFUk5BTCApICkKKyAgICAgICAgcHRpbWUgPSBwOworCisgICAgLyogSWYgdGVtcCBmaWxlIGRvZXMgbm90IGV4aXN0IGJ1dCBwYXJlbnQgZG9lcywgdXNlIHBhcmVudC4gKi8KKyAgICBpZiAoIHAgJiYgKCB0LT5mbGFncyAmIFRfRkxBR19URU1QICkgJiYKKyAgICAgICAgKCB0LT5iaW5kaW5nID09IFRfQklORF9NSVNTSU5HICkgJiYKKyAgICAgICAgKCBwLT5iaW5kaW5nICE9IFRfQklORF9NSVNTSU5HICkgKQorICAgIHsKKyAgICAgICAgdC0+YmluZGluZyA9IFRfQklORF9QQVJFTlRTOworICAgICAgICBwdGltZSA9IHA7CisgICAgfQorCisjaWZkZWYgT1BUX1NFTUFQSE9SRQorICAgIHsKKyAgICAgICAgTElTVCAqIHZhciA9IHZhcl9nZXQoIHJvb3RfbW9kdWxlKCksIGNvbnN0YW50X0pBTV9TRU1BUEhPUkUgKTsKKyAgICAgICAgaWYgKCAhbGlzdF9lbXB0eSggdmFyICkgKQorICAgICAgICB7CisgICAgICAgICAgICBUQVJHRVQgKiBjb25zdCBzZW1hcGhvcmUgPSBiaW5kdGFyZ2V0KCBsaXN0X2Zyb250KCB2YXIgKSApOworICAgICAgICAgICAgc2VtYXBob3JlLT5wcm9ncmVzcyA9IFRfTUFLRV9TRU1BUEhPUkU7CisgICAgICAgICAgICB0LT5zZW1hcGhvcmUgPSBzZW1hcGhvcmU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8qIFN0ZXAgMmM6IElmIGl0cyBhIGZpbGUsIHNlYXJjaCBmb3IgaGVhZGVycy4gKi8KKyAgICBpZiAoIHQtPmJpbmRpbmcgPT0gVF9CSU5EX0VYSVNUUyApCisgICAgICAgIGhlYWRlcnMoIHQgKTsKKworICAgIC8qIFN0ZXAgMmQ6IHJlc2V0ICJvbiB0YXJnZXQiIHZhcmlhYmxlcy4gKi8KKyAgICBwb3BzZXR0aW5ncyggcm9vdF9tb2R1bGUoKSwgcyApOworICAgIGZyZWVzZXR0aW5ncyggcyApOworCisgICAgLyoKKyAgICAgKiBQYXVzZSBmb3IgYSBsaXR0bGUgcHJvZ3Jlc3MgcmVwb3J0aW5nLgorICAgICAqLworCisgICAgaWYgKCBERUJVR19CSU5EICkKKyAgICB7CisgICAgICAgIGlmICggIW9iamVjdF9lcXVhbCggdC0+bmFtZSwgdC0+Ym91bmRuYW1lICkgKQorICAgICAgICAgICAgcHJpbnRmKCAiYmluZFx0LS1cdCVzJXM6ICVzXG4iLCBzcGFjZXMoIGRlcHRoICksCisgICAgICAgICAgICAgICAgb2JqZWN0X3N0ciggdC0+bmFtZSApLCBvYmplY3Rfc3RyKCB0LT5ib3VuZG5hbWUgKSApOworCisgICAgICAgIHN3aXRjaCAoIHQtPmJpbmRpbmcgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgVF9CSU5EX1VOQk9VTkQ6CisgICAgICAgIGNhc2UgVF9CSU5EX01JU1NJTkc6CisgICAgICAgIGNhc2UgVF9CSU5EX1BBUkVOVFM6CisgICAgICAgICAgICBwcmludGYoICJ0aW1lXHQtLVx0JXMlczogJXNcbiIsIHNwYWNlcyggZGVwdGggKSwKKyAgICAgICAgICAgICAgICBvYmplY3Rfc3RyKCB0LT5uYW1lICksIHRhcmdldF9iaW5kWyAoaW50KXQtPmJpbmRpbmcgXSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUX0JJTkRfRVhJU1RTOgorICAgICAgICAgICAgcHJpbnRmKCAidGltZVx0LS1cdCVzJXM6ICVzXG4iLCBzcGFjZXMoIGRlcHRoICksCisgICAgICAgICAgICAgICAgb2JqZWN0X3N0ciggdC0+bmFtZSApLCB0aW1lc3RhbXBfc3RyKCAmdC0+dGltZSApICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU3RlcCAzOiBSZWN1cnNpdmVseSBtYWtlMCgpIGRlcGVuZGVuY2llcyAmIGhlYWRlcnMuCisgICAgICovCisKKyAgICAvKiBTdGVwIDNhOiBSZWN1cnNpdmVseSBtYWtlMCgpIGRlcGVuZGVuY2llcy4gKi8KKyAgICBmb3IgKCBjID0gdC0+ZGVwZW5kczsgYzsgYyA9IGMtPm5leHQgKQorICAgIHsKKyAgICAgICAgaW50IGNvbnN0IGludGVybmFsID0gdC0+ZmxhZ3MgJiBUX0ZMQUdfSU5URVJOQUw7CisKKyAgICAgICAgLyogV2FybiBhYm91dCBjaXJjdWxhciBkZXBzLCBleGNlcHQgZm9yIGluY2x1ZGVzLCB3aGljaCBpbmNsdWRlIGVhY2gKKyAgICAgICAgICogb3RoZXIgYWxvdC4KKyAgICAgICAgICovCisgICAgICAgIGlmICggYy0+dGFyZ2V0LT5mYXRlID09IFRfRkFURV9JTklUICkKKyAgICAgICAgICAgIG1ha2UwKCBjLT50YXJnZXQsIHB0aW1lLCBkZXB0aCArIDEsIGNvdW50cywgYW55aG93LCByZXNjYW5uaW5nICk7CisgICAgICAgIGVsc2UgaWYgKCBjLT50YXJnZXQtPmZhdGUgPT0gVF9GQVRFX01BS0lORyAmJiAhaW50ZXJuYWwgKQorICAgICAgICAgICAgcHJpbnRmKCAid2FybmluZzogJXMgZGVwZW5kcyBvbiBpdHNlbGZcbiIsIG9iamVjdF9zdHIoCisgICAgICAgICAgICAgICAgYy0+dGFyZ2V0LT5uYW1lICkgKTsKKyAgICAgICAgZWxzZSBpZiAoIGMtPnRhcmdldC0+ZmF0ZSAhPSBUX0ZBVEVfTUFLSU5HICYmIHJlc2Nhbm5pbmcgKQorICAgICAgICAgICAgbWFrZTByZXNjYW4oIGMtPnRhcmdldCwgcmVzY2FubmluZyApOworICAgICAgICBpZiAoIHJlc2Nhbm5pbmcgJiYgYy0+dGFyZ2V0LT5pbmNsdWRlcyAmJiBjLT50YXJnZXQtPmluY2x1ZGVzLT5mYXRlICE9CisgICAgICAgICAgICBUX0ZBVEVfTUFLSU5HICkKKyAgICAgICAgICAgIG1ha2UwcmVzY2FuKCB0YXJnZXRfc2NjKCBjLT50YXJnZXQtPmluY2x1ZGVzICksIHJlc2Nhbm5pbmcgKTsKKyAgICB9CisKKyAgICBpZiAoIGxvY2F0ZWRfdGFyZ2V0ICkKKyAgICB7CisgICAgICAgIGlmICggbG9jYXRlZF90YXJnZXQtPmZhdGUgPT0gVF9GQVRFX0lOSVQgKQorICAgICAgICAgICAgbWFrZTAoIGxvY2F0ZWRfdGFyZ2V0LCBwdGltZSwgZGVwdGggKyAxLCBjb3VudHMsIGFueWhvdywgcmVzY2FubmluZworICAgICAgICAgICAgICAgICk7CisgICAgICAgIGVsc2UgaWYgKCBsb2NhdGVkX3RhcmdldC0+ZmF0ZSAhPSBUX0ZBVEVfTUFLSU5HICYmIHJlc2Nhbm5pbmcgKQorICAgICAgICAgICAgbWFrZTByZXNjYW4oIGxvY2F0ZWRfdGFyZ2V0LCByZXNjYW5uaW5nICk7CisgICAgfQorCisgICAgLyogU3RlcCAzYjogUmVjdXJzaXZlbHkgbWFrZTAoKSBpbnRlcm5hbCBpbmNsdWRlcyBub2RlLiAqLworICAgIGlmICggdC0+aW5jbHVkZXMgKQorICAgICAgICBtYWtlMCggdC0+aW5jbHVkZXMsIHAsIGRlcHRoICsgMSwgY291bnRzLCBhbnlob3csIHJlc2Nhbm5pbmcgKTsKKworICAgIC8qIFN0ZXAgM2M6IEFkZCBkZXBlbmRlbmNpZXMnIGluY2x1ZGVzIHRvIG91ciBkaXJlY3QgZGVwZW5kZW5jaWVzLiAqLworICAgIHsKKyAgICAgICAgVEFSR0VUUyAqIGluY3MgPSAwOworICAgICAgICBmb3IgKCBjID0gdC0+ZGVwZW5kczsgYzsgYyA9IGMtPm5leHQgKQorICAgICAgICAgICAgaWYgKCBjLT50YXJnZXQtPmluY2x1ZGVzICkKKyAgICAgICAgICAgICAgICBpbmNzID0gdGFyZ2V0ZW50cnkoIGluY3MsIGMtPnRhcmdldC0+aW5jbHVkZXMgKTsKKyAgICAgICAgdC0+ZGVwZW5kcyA9IHRhcmdldGNoYWluKCB0LT5kZXBlbmRzLCBpbmNzICk7CisgICAgfQorCisgICAgaWYgKCBsb2NhdGVkX3RhcmdldCApCisgICAgICAgIHQtPmRlcGVuZHMgPSB0YXJnZXRlbnRyeSggdC0+ZGVwZW5kcywgbG9jYXRlZF90YXJnZXQgKTsKKworICAgIC8qIFN0ZXAgM2Q6IERldGVjdCBjeWNsZXMuICovCisgICAgeworICAgICAgICBpbnQgY3ljbGVfZGVwdGggPSBkZXB0aDsKKyAgICAgICAgZm9yICggYyA9IHQtPmRlcGVuZHM7IGM7IGMgPSBjLT5uZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgVEFSR0VUICogc2NjX3Jvb3QgPSB0YXJnZXRfc2NjKCBjLT50YXJnZXQgKTsKKyAgICAgICAgICAgIGlmICggc2NjX3Jvb3QtPmZhdGUgPT0gVF9GQVRFX01BS0lORyAmJgorICAgICAgICAgICAgICAgICggIXNjY19yb290LT5pbmNsdWRlcyB8fAorICAgICAgICAgICAgICAgICAgc2NjX3Jvb3QtPmluY2x1ZGVzLT5mYXRlICE9IFRfRkFURV9NQUtJTkcgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBzY2Nfcm9vdC0+ZGVwdGggPCBjeWNsZV9kZXB0aCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjeWNsZV9kZXB0aCA9IHNjY19yb290LT5kZXB0aDsKKyAgICAgICAgICAgICAgICAgICAgdC0+c2NjX3Jvb3QgPSBzY2Nfcm9vdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFN0ZXAgNDogQ29tcHV0ZSB0aW1lICYgZmF0ZS4KKyAgICAgKi8KKworICAgIC8qIFN0ZXAgNGE6IFBpY2sgdXAgZGVwZW5kZW5jaWVzJyB0aW1lIGFuZCBmYXRlLiAqLworICAgIHRpbWVzdGFtcF9jbGVhciggJmxhc3QgKTsKKyAgICB0aW1lc3RhbXBfY2xlYXIoICZsZWFmICk7CisgICAgZmF0ZSA9IFRfRkFURV9TVEFCTEU7CisgICAgZm9yICggYyA9IHQtPmRlcGVuZHM7IGM7IGMgPSBjLT5uZXh0ICkKKyAgICB7CisgICAgICAgIC8qIElmIHdlIGFyZSBpbiBhIGRpZmZlcmVudCBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50LCBwdWxsCisgICAgICAgICAqIHRpbWVzdGFtcHMgZnJvbSB0aGUgcm9vdC4KKyAgICAgICAgICovCisgICAgICAgIGlmICggYy0+dGFyZ2V0LT5zY2Nfcm9vdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRBUkdFVCAqIGNvbnN0IHNjY19yb290ID0gdGFyZ2V0X3NjYyggYy0+dGFyZ2V0ICk7CisgICAgICAgICAgICBpZiAoIHNjY19yb290ICE9IHQtPnNjY19yb290ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBfbWF4KCAmYy0+dGFyZ2V0LT5sZWFmLCAmYy0+dGFyZ2V0LT5sZWFmLAorICAgICAgICAgICAgICAgICAgICAmc2NjX3Jvb3QtPmxlYWYgKTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBfbWF4KCAmYy0+dGFyZ2V0LT50aW1lLCAmYy0+dGFyZ2V0LT50aW1lLAorICAgICAgICAgICAgICAgICAgICAmc2NjX3Jvb3QtPnRpbWUgKTsKKyAgICAgICAgICAgICAgICBjLT50YXJnZXQtPmZhdGUgPSBtYXgoIGMtPnRhcmdldC0+ZmF0ZSwgc2NjX3Jvb3QtPmZhdGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIExFQVZFUyBoYXMgYmVlbiBhcHBsaWVkLCB3ZSBvbmx5IGhlZWQgdGhlIHRpbWVzdGFtcHMgb2YgdGhlIGxlYWYKKyAgICAgICAgICogc291cmNlIG5vZGVzLgorICAgICAgICAgKi8KKyAgICAgICAgdGltZXN0YW1wX21heCggJmxlYWYsICZsZWFmLCAmYy0+dGFyZ2V0LT5sZWFmICk7CisgICAgICAgIGlmICggdC0+ZmxhZ3MgJiBUX0ZMQUdfTEVBVkVTICkKKyAgICAgICAgeworICAgICAgICAgICAgdGltZXN0YW1wX2NvcHkoICZsYXN0LCAmbGVhZiApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wX21heCggJmxhc3QsICZsYXN0LCAmYy0+dGFyZ2V0LT50aW1lICk7CisgICAgICAgIGZhdGUgPSBtYXgoIGZhdGUsIGMtPnRhcmdldC0+ZmF0ZSApOworCisjaWZkZWYgT1BUX0dSQVBIX0RFQlVHX0VYVAorICAgICAgICBpZiAoIERFQlVHX0ZBVEUgKQorICAgICAgICAgICAgaWYgKCBmYXRlIDwgYy0+dGFyZ2V0LT5mYXRlICkKKyAgICAgICAgICAgICAgICBwcmludGYoICJmYXRlIGNoYW5nZSAlcyBmcm9tICVzIHRvICVzIGJ5IGRlcGVuZGVuY3kgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIG9iamVjdF9zdHIoIHQtPm5hbWUgKSwgdGFyZ2V0X2ZhdGVbIChpbnQpZmF0ZSBdLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZmF0ZVsgKGludCljLT50YXJnZXQtPmZhdGUgXSwgb2JqZWN0X3N0cigKKyAgICAgICAgICAgICAgICAgICAgYy0+dGFyZ2V0LT5uYW1lICkgKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIFN0ZXAgNGI6IFBpY2sgdXAgaW5jbHVkZWQgaGVhZGVycyB0aW1lLiAqLworCisgICAgLyoKKyAgICAgKiBJZiBhIGhlYWRlciBpcyBuZXdlciB0aGFuIGEgdGVtcCBzb3VyY2UgdGhhdCBpbmNsdWRlcyBpdCwgdGhlIHRlbXAgc291cmNlCisgICAgICogd2lsbCBuZWVkIGJ1aWxkaW5nLgorICAgICAqLworICAgIGlmICggdC0+aW5jbHVkZXMgKQorICAgICAgICB0aW1lc3RhbXBfY29weSggJmhsYXN0LCAmdC0+aW5jbHVkZXMtPnRpbWUgKTsKKyAgICBlbHNlCisgICAgICAgIHRpbWVzdGFtcF9jbGVhciggJmhsYXN0ICk7CisKKyAgICAvKiBTdGVwIDRjOiBoYW5kbGUgTk9VUERBVEUgb2RkaXR5LgorICAgICAqCisgICAgICogSWYgYSBOT1VQREFURSBmaWxlIGV4aXN0cywgbWFyayBpdCBhcyBoYXZpbmcgZXRlcm5hbGx5IG9sZCBkZXBlbmRlbmNpZXMuCisgICAgICogRG8gbm90IGluaGVyaXQgb3VyIGZhdGUgZnJvbSBvdXIgZGVwZW5kZW5jaWVzLiBEZWNpZGUgZmF0ZSBiYXNlZCBvbmx5IG9uCisgICAgICogb3RoZXIgZmxhZ3MgYW5kIG91ciBiaW5kaW5nIChkb25lIGxhdGVyKS4KKyAgICAgKi8KKyAgICBpZiAoIHQtPmZsYWdzICYgVF9GTEFHX05PVVBEQVRFICkKKyAgICB7CisjaWZkZWYgT1BUX0dSQVBIX0RFQlVHX0VYVAorICAgICAgICBpZiAoIERFQlVHX0ZBVEUgKQorICAgICAgICAgICAgaWYgKCBmYXRlICE9IFRfRkFURV9TVEFCTEUgKQorICAgICAgICAgICAgICAgIHByaW50ZiggImZhdGUgY2hhbmdlICAlcyBiYWNrIHRvIHN0YWJsZSwgTk9VUERBVEUuXG4iLAorICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc3RyKCB0LT5uYW1lICkgKTsKKyNlbmRpZgorCisgICAgICAgIHRpbWVzdGFtcF9jbGVhciggJmxhc3QgKTsKKyAgICAgICAgdGltZXN0YW1wX2NsZWFyKCAmdC0+dGltZSApOworCisgICAgICAgIC8qIERvIG5vdCBpbmhlcml0IG91ciBmYXRlIGZyb20gb3VyIGRlcGVuZGVuY2llcy4gRGVjaWRlIGZhdGUgYmFzZWQgb25seQorICAgICAgICAgKiB1cG9uIG90aGVyIGZsYWdzIGFuZCBvdXIgYmluZGluZyAoZG9uZSBsYXRlcikuCisgICAgICAgICAqLworICAgICAgICBmYXRlID0gVF9GQVRFX1NUQUJMRTsKKyAgICB9CisKKyAgICAvKiBTdGVwIDRkOiBEZXRlcm1pbmUgZmF0ZTogcmVidWlsZCB0YXJnZXQgb3Igd2hhdD8gKi8KKworICAgIC8qCisgICAgICAgIEluIEVuZ2xpc2g6CisgICAgICAgIElmIGNhbiBub3QgZmluZCBvciBtYWtlIGNoaWxkLCBjYW4gbm90IG1ha2UgdGFyZ2V0LgorICAgICAgICBJZiBjaGlsZHJlbiBjaGFuZ2VkLCBtYWtlIHRhcmdldC4KKyAgICAgICAgSWYgdGFyZ2V0IG1pc3NpbmcsIG1ha2UgaXQuCisgICAgICAgIElmIGNoaWxkcmVuIG5ld2VyLCBtYWtlIHRhcmdldC4KKyAgICAgICAgSWYgdGVtcCdzIGNoaWxkcmVuIG5ld2VyIHRoYW4gcGFyZW50LCBtYWtlIHRlbXAuCisgICAgICAgIElmIHRlbXAncyBoZWFkZXJzIG5ld2VyIHRoYW4gcGFyZW50LCBtYWtlIHRlbXAuCisgICAgICAgIElmIGRlbGliZXJhdGVseSB0b3VjaGVkLCBtYWtlIGl0LgorICAgICAgICBJZiB1cC10by1kYXRlIHRlbXAgZmlsZSBwcmVzZW50LCB1c2UgaXQuCisgICAgICAgIElmIHRhcmdldCBuZXdlciB0aGFuIG5vbi1ub3RmaWxlIHBhcmVudCwgbWFyayB0YXJnZXQgbmV3ZXIuCisgICAgICAgIE90aGVyd2lzZSwgc3RhYmxlIQorCisgICAgICAgIE5vdGUgdGhpcyBibG9jayBydW5zIGZyb20gbGVhc3QgdG8gbW9zdCBzdGFibGU6IGFzIHdlIG1ha2UgaXQgZnVydGhlcgorICAgICAgICBkb3duIHRoZSBsaXN0LCB0aGUgdGFyZ2V0J3MgZmF0ZSBnZXRzIG1vcmUgc3RhYmxlLgorICAgICovCisKKyNpZmRlZiBPUFRfR1JBUEhfREVCVUdfRVhUCisgICAgc2F2ZWRGYXRlID0gZmF0ZTsKKyAgICBvbGRUaW1lU3RhbXAgPSAwOworI2VuZGlmCisKKyAgICBpZiAoIGZhdGUgPj0gVF9GQVRFX0JST0tFTiApCisgICAgeworICAgICAgICBmYXRlID0gVF9GQVRFX0NBTlRNQUtFOworICAgIH0KKyAgICBlbHNlIGlmICggZmF0ZSA+PSBUX0ZBVEVfU1BPSUwgKQorICAgIHsKKyAgICAgICAgZmF0ZSA9IFRfRkFURV9VUERBVEU7CisgICAgfQorICAgIGVsc2UgaWYgKCB0LT5iaW5kaW5nID09IFRfQklORF9NSVNTSU5HICkKKyAgICB7CisgICAgICAgIGZhdGUgPSBUX0ZBVEVfTUlTU0lORzsKKyAgICB9CisgICAgZWxzZSBpZiAoIHQtPmJpbmRpbmcgPT0gVF9CSU5EX0VYSVNUUyAmJiB0aW1lc3RhbXBfY21wKCAmbGFzdCwgJnQtPnRpbWUgKSA+CisgICAgICAgIDAgKQorICAgIHsKKyNpZmRlZiBPUFRfR1JBUEhfREVCVUdfRVhUCisgICAgICAgIG9sZFRpbWVTdGFtcCA9IDE7CisjZW5kaWYKKyAgICAgICAgZmF0ZSA9IFRfRkFURV9PVVREQVRFRDsKKyAgICB9CisgICAgZWxzZSBpZiAoIHQtPmJpbmRpbmcgPT0gVF9CSU5EX1BBUkVOVFMgJiYgdGltZXN0YW1wX2NtcCggJmxhc3QsICZwLT50aW1lICkgPgorICAgICAgICAwICkKKyAgICB7CisjaWZkZWYgT1BUX0dSQVBIX0RFQlVHX0VYVAorICAgICAgICBvbGRUaW1lU3RhbXAgPSAxOworI2VuZGlmCisgICAgICAgIGZhdGUgPSBUX0ZBVEVfTkVFRFRNUDsKKyAgICB9CisgICAgZWxzZSBpZiAoIHQtPmJpbmRpbmcgPT0gVF9CSU5EX1BBUkVOVFMgJiYgdGltZXN0YW1wX2NtcCggJmhsYXN0LCAmcC0+dGltZSApCisgICAgICAgID4gMCApCisgICAgeworICAgICAgICBmYXRlID0gVF9GQVRFX05FRURUTVA7CisgICAgfQorICAgIGVsc2UgaWYgKCB0LT5mbGFncyAmIFRfRkxBR19UT1VDSEVEICkKKyAgICB7CisgICAgICAgIGZhdGUgPSBUX0ZBVEVfVE9VQ0hFRDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGFueWhvdyAmJiAhKCB0LT5mbGFncyAmIFRfRkxBR19OT1VQREFURSApICkKKyAgICB7CisgICAgICAgIGZhdGUgPSBUX0ZBVEVfVE9VQ0hFRDsKKyAgICB9CisgICAgZWxzZSBpZiAoIHQtPmJpbmRpbmcgPT0gVF9CSU5EX0VYSVNUUyAmJiAoIHQtPmZsYWdzICYgVF9GTEFHX1RFTVAgKSApCisgICAgeworICAgICAgICBmYXRlID0gVF9GQVRFX0lTVE1QOworICAgIH0KKyAgICBlbHNlIGlmICggdC0+YmluZGluZyA9PSBUX0JJTkRfRVhJU1RTICYmIHAgJiYgcC0+YmluZGluZyAhPSBUX0JJTkRfVU5CT1VORAorICAgICAgICAmJiB0aW1lc3RhbXBfY21wKCAmdC0+dGltZSwgJnAtPnRpbWUgKSA+IDAgKQorICAgIHsKKyNpZmRlZiBPUFRfR1JBUEhfREVCVUdfRVhUCisgICAgICAgIG9sZFRpbWVTdGFtcCA9IDE7CisjZW5kaWYKKyAgICAgICAgZmF0ZSA9IFRfRkFURV9ORVdFUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZmF0ZSA9IFRfRkFURV9TVEFCTEU7CisgICAgfQorI2lmZGVmIE9QVF9HUkFQSF9ERUJVR19FWFQKKyAgICBpZiAoIERFQlVHX0ZBVEUgJiYgKCBmYXRlICE9IHNhdmVkRmF0ZSApICkKKwl7CisgICAgICAgIGlmICggc2F2ZWRGYXRlID09IFRfRkFURV9TVEFCTEUgKQorICAgICAgICAgICAgcHJpbnRmKCAiZmF0ZSBjaGFuZ2UgICVzIHNldCB0byAlcyVzXG4iLCBvYmplY3Rfc3RyKCB0LT5uYW1lICksCisgICAgICAgICAgICAgICAgdGFyZ2V0X2ZhdGVbIGZhdGUgXSwgb2xkVGltZVN0YW1wID8gIiAoYnkgdGltZXN0YW1wKSIgOiAiIiApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoICJmYXRlIGNoYW5nZSAgJXMgZnJvbSAlcyB0byAlcyVzXG4iLCBvYmplY3Rfc3RyKCB0LT5uYW1lICksCisgICAgICAgICAgICAgICAgdGFyZ2V0X2ZhdGVbIHNhdmVkRmF0ZSBdLCB0YXJnZXRfZmF0ZVsgZmF0ZSBdLCBvbGRUaW1lU3RhbXAgPworICAgICAgICAgICAgICAgICIgKGJ5IHRpbWVzdGFtcCkiIDogIiIgKTsKKwl9CisjZW5kaWYKKworICAgIC8qIFN0ZXAgNGU6IEhhbmRsZSBtaXNzaW5nIGZpbGVzLiAqLworICAgIC8qIElmIGl0IGlzIG1pc3NpbmcgYW5kIHRoZXJlIGFyZSBubyBhY3Rpb25zIHRvIGNyZWF0ZSBpdCwgYm9vbS4gKi8KKyAgICAvKiBJZiB3ZSBjYW4gbm90IG1ha2UgYSB0YXJnZXQgd2UgZG8gbm90IGNhcmUgYWJvdXQgaXQsIG9rYXkuICovCisgICAgLyogV2UgY291bGQgaW5zaXN0IHRoYXQgdGhlcmUgYXJlIHVwZGF0aW5nIGFjdGlvbnMgZm9yIGFsbCBtaXNzaW5nICovCisgICAgLyogZmlsZXMsIGJ1dCBpZiB0aGV5IGhhdmUgZGVwZW5kZW5jaWVzIHdlIGp1c3QgcHJldGVuZCBpdCBpcyBhIE5PVEZJTEUuICovCisKKyAgICBpZiAoICggZmF0ZSA9PSBUX0ZBVEVfTUlTU0lORyApICYmICF0LT5hY3Rpb25zICYmICF0LT5kZXBlbmRzICkKKyAgICB7CisgICAgICAgIGlmICggdC0+ZmxhZ3MgJiBUX0ZMQUdfTk9DQVJFICkKKyAgICAgICAgeworI2lmZGVmIE9QVF9HUkFQSF9ERUJVR19FWFQKKyAgICAgICAgICAgIGlmICggREVCVUdfRkFURSApCisgICAgICAgICAgICAgICAgcHJpbnRmKCAiZmF0ZSBjaGFuZ2UgJXMgdG8gU1RBQkxFIGZyb20gJXMsICIKKyAgICAgICAgICAgICAgICAgICAgIm5vIGFjdGlvbnMsIG5vIGRlcGVuZGVuY2llcyBhbmQgZG8gbm90IGNhcmVcbiIsCisgICAgICAgICAgICAgICAgICAgIG9iamVjdF9zdHIoIHQtPm5hbWUgKSwgdGFyZ2V0X2ZhdGVbIGZhdGUgXSApOworI2VuZGlmCisgICAgICAgICAgICBmYXRlID0gVF9GQVRFX1NUQUJMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZiggImRvbid0IGtub3cgaG93IHRvIG1ha2UgJXNcbiIsIG9iamVjdF9zdHIoIHQtPm5hbWUgKSApOworICAgICAgICAgICAgZmF0ZSA9IFRfRkFURV9DQU5URklORDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFN0ZXAgNGY6IFByb3BhZ2F0ZSBkZXBlbmRlbmNpZXMnIHRpbWUgJiBmYXRlLiAqLworICAgIC8qIFNldCBsZWFmIHRpbWUgdG8gYmUgb3VyIHRpbWUgb25seSBpZiB0aGlzIGlzIGEgbGVhZi4gKi8KKworICAgIHRpbWVzdGFtcF9tYXgoICZ0LT50aW1lLCAmdC0+dGltZSwgJmxhc3QgKTsKKyAgICB0aW1lc3RhbXBfY29weSggJnQtPmxlYWYsIHRpbWVzdGFtcF9lbXB0eSggJmxlYWYgKSA/ICZ0LT50aW1lIDogJmxlYWYgKTsKKyAgICAvKiBUaGlzIHRhcmdldCdzIGZhdGUgbWF5IGhhdmUgYmVlbiB1cGRhdGVkIGJ5IHZpcnR1ZSBvZiBmb2xsb3dpbmcgc29tZQorICAgICAqIHRhcmdldCdzIHJlYnVpbGRzIGxpc3QsIHNvIG9ubHkgYWxsb3cgaXQgdG8gYmUgaW5jcmVhc2VkIHRvIHRoZSBmYXRlIHdlCisgICAgICogaGF2ZSBjYWxjdWxhdGVkLiBPdGhlcndpc2UsIGdyYWIgaXRzIG5ldyBmYXRlLgorICAgICAqLworICAgIGlmICggZmF0ZSA+IHQtPmZhdGUgKQorICAgICAgICB0LT5mYXRlID0gZmF0ZTsKKyAgICBlbHNlCisgICAgICAgIGZhdGUgPSB0LT5mYXRlOworCisgICAgLyogU3RlcCA0ZzogSWYgdGhpcyB0YXJnZXQgbmVlZHMgdG8gYmUgYnVpbHQsIGZvcmNlIHJlYnVpbGQgZXZlcnl0aGluZyBpbgorICAgICAqIGl0cyByZWJ1aWxkcyBsaXN0LgorICAgICAqLworICAgIGlmICggKCBmYXRlID49IFRfRkFURV9CVUlMRCApICYmICggZmF0ZSA8IFRfRkFURV9CUk9LRU4gKSApCisgICAgICAgIGZvcmNlX3JlYnVpbGRzKCB0ICk7CisKKyAgICAvKgorICAgICAqIFN0ZXAgNTogU29ydCBkZXBlbmRlbmNpZXMgYnkgdGhlaXIgdXBkYXRlIHRpbWUuCisgICAgICovCisKKyAgICBpZiAoIGdsb2JzLm5ld2VzdGZpcnN0ICkKKyAgICAgICAgdC0+ZGVwZW5kcyA9IG1ha2Uwc29ydCggdC0+ZGVwZW5kcyApOworCisgICAgLyoKKyAgICAgKiBTdGVwIDY6IEEgbGl0dGxlIGhhcm1sZXNzIHRhYnVsYXRpbmcgZm9yIHRyYWNpbmcgcHVycG9zZXMuCisgICAgICovCisKKyAgICAvKiBEbyBub3QgY291bnQgb3IgcmVwb3J0IGludGVyYWwgaW5jbHVkZXMgbm9kZXMuICovCisgICAgaWYgKCB0LT5mbGFncyAmIFRfRkxBR19JTlRFUk5BTCApCisgICAgICAgIHJldHVybjsKKworICAgIGlmICggY291bnRzICkKKyAgICB7CisjaWZkZWYgT1BUX0lNUFJPVkVEX1BBVElFTkNFX0VYVAorICAgICAgICArK2NvdW50cy0+dGFyZ2V0czsKKyNlbHNlCisgICAgICAgIGlmICggISggKytjb3VudHMtPnRhcmdldHMgJSAxMDAwICkgJiYgREVCVUdfTUFLRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZiggIi4uLnBhdGllbmNlLi4uXG4iICk7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKCBmYXRlID09IFRfRkFURV9JU1RNUCApCisgICAgICAgICAgICArK2NvdW50cy0+dGVtcDsKKyAgICAgICAgZWxzZSBpZiAoIGZhdGUgPT0gVF9GQVRFX0NBTlRGSU5EICkKKyAgICAgICAgICAgICsrY291bnRzLT5jYW50ZmluZDsKKyAgICAgICAgZWxzZSBpZiAoICggZmF0ZSA9PSBUX0ZBVEVfQ0FOVE1BS0UgKSAmJiB0LT5hY3Rpb25zICkKKyAgICAgICAgICAgICsrY291bnRzLT5jYW50bWFrZTsKKyAgICAgICAgZWxzZSBpZiAoICggZmF0ZSA+PSBUX0ZBVEVfQlVJTEQgKSAmJiAoIGZhdGUgPCBUX0ZBVEVfQlJPS0VOICkgJiYKKyAgICAgICAgICAgIHQtPmFjdGlvbnMgKQorICAgICAgICAgICAgKytjb3VudHMtPnVwZGF0aW5nOworICAgIH0KKworICAgIGlmICggISggdC0+ZmxhZ3MgJiBUX0ZMQUdfTk9URklMRSApICYmICggZmF0ZSA+PSBUX0ZBVEVfU1BPSUwgKSApCisgICAgICAgIGZsYWcgPSAiKyI7CisgICAgZWxzZSBpZiAoIHQtPmJpbmRpbmcgPT0gVF9CSU5EX0VYSVNUUyAmJiBwICYmIHRpbWVzdGFtcF9jbXAoICZ0LT50aW1lLAorICAgICAgICAmcC0+dGltZSApID4gMCApCisgICAgICAgIGZsYWcgPSAiKiI7CisKKyAgICBpZiAoIERFQlVHX01BS0VQUk9HICkKKyAgICAgICAgcHJpbnRmKCAibWFkZSVzXHQlc1x0JXMlc1xuIiwgZmxhZywgdGFyZ2V0X2ZhdGVbIChpbnQpdC0+ZmF0ZSBdLAorICAgICAgICAgICAgc3BhY2VzKCBkZXB0aCApLCBvYmplY3Rfc3RyKCB0LT5uYW1lICkgKTsKK30KKworCisjaWZkZWYgT1BUX0dSQVBIX0RFQlVHX0VYVAorCitzdGF0aWMgY2hhciBjb25zdCAqIHRhcmdldF9uYW1lKCBUQVJHRVQgKiB0ICkKK3sKKyAgICBzdGF0aWMgY2hhciBidWZbIDEwMDAgXTsKKyAgICBpZiAoIHQtPmZsYWdzICYgVF9GTEFHX0lOVEVSTkFMICkKKyAgICB7CisgICAgICAgIHNwcmludGYoIGJ1ZiwgIiVzIChpbnRlcm5hbCBub2RlKSIsIG9iamVjdF9zdHIoIHQtPm5hbWUgKSApOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgICByZXR1cm4gb2JqZWN0X3N0ciggdC0+bmFtZSApOworfQorCisKKy8qCisgKiBkZXBlbmRHcmFwaE91dHB1dCgpIC0gb3V0cHV0IHRoZSBERyBhZnRlciBtYWtlMCBoYXMgcnVuLgorICovCisKK3N0YXRpYyB2b2lkIGRlcGVuZEdyYXBoT3V0cHV0KCBUQVJHRVQgKiB0LCBpbnQgZGVwdGggKQoreworICAgIFRBUkdFVFMgKiBjOworCisgICAgaWYgKCAoIHQtPmZsYWdzICYgVF9GTEFHX1ZJU0lURUQgKSB8fCAhdC0+bmFtZSB8fCAhdC0+Ym91bmRuYW1lICkKKyAgICAgICAgcmV0dXJuOworCisgICAgdC0+ZmxhZ3MgfD0gVF9GTEFHX1ZJU0lURUQ7CisKKyAgICBzd2l0Y2ggKCB0LT5mYXRlICkKKyAgICB7CisgICAgICAgIGNhc2UgVF9GQVRFX1RPVUNIRUQ6CisgICAgICAgIGNhc2UgVF9GQVRFX01JU1NJTkc6CisgICAgICAgIGNhc2UgVF9GQVRFX09VVERBVEVEOgorICAgICAgICBjYXNlIFRfRkFURV9VUERBVEU6CisgICAgICAgICAgICBwcmludGYoICItPiVzJTJkIE5hbWU6ICVzXG4iLCBzcGFjZXMoIGRlcHRoICksIGRlcHRoLCB0YXJnZXRfbmFtZSggdAorICAgICAgICAgICAgICAgICkgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCAiICAlcyUyZCBOYW1lOiAlc1xuIiwgc3BhY2VzKCBkZXB0aCApLCBkZXB0aCwgdGFyZ2V0X25hbWUoIHQKKyAgICAgICAgICAgICAgICApICk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoICFvYmplY3RfZXF1YWwoIHQtPm5hbWUsIHQtPmJvdW5kbmFtZSApICkKKyAgICAgICAgcHJpbnRmKCAiICAlcyAgICBMb2M6ICVzXG4iLCBzcGFjZXMoIGRlcHRoICksIG9iamVjdF9zdHIoIHQtPmJvdW5kbmFtZSApCisgICAgICAgICAgICApOworCisgICAgc3dpdGNoICggdC0+ZmF0ZSApCisgICAgeworICAgIGNhc2UgVF9GQVRFX1NUQUJMRToKKyAgICAgICAgcHJpbnRmKCAiICAlcyAgICAgICA6IFN0YWJsZVxuIiwgc3BhY2VzKCBkZXB0aCApICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9GQVRFX05FV0VSOgorICAgICAgICBwcmludGYoICIgICVzICAgICAgIDogTmV3ZXJcbiIsIHNwYWNlcyggZGVwdGggKSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfRkFURV9JU1RNUDoKKyAgICAgICAgcHJpbnRmKCAiICAlcyAgICAgICA6IFVwIHRvIGRhdGUgdGVtcCBmaWxlXG4iLCBzcGFjZXMoIGRlcHRoICkgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0ZBVEVfTkVFRFRNUDoKKyAgICAgICAgcHJpbnRmKCAiICAlcyAgICAgICA6IFRlbXBvcmFyeSBmaWxlLCB0byBiZSB1cGRhdGVkXG4iLCBzcGFjZXMoIGRlcHRoICkKKyAgICAgICAgICAgICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9GQVRFX1RPVUNIRUQ6CisgICAgICAgIHByaW50ZiggIiAgJXMgICAgICAgOiBCZWVuIHRvdWNoZWQsIHVwZGF0aW5nIGl0XG4iLCBzcGFjZXMoIGRlcHRoICkgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0ZBVEVfTUlTU0lORzoKKyAgICAgICAgcHJpbnRmKCAiICAlcyAgICAgICA6IE1pc3NpbmcsIGNyZWF0aW5nIGl0XG4iLCBzcGFjZXMoIGRlcHRoICkgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0ZBVEVfT1VUREFURUQ6CisgICAgICAgIHByaW50ZiggIiAgJXMgICAgICAgOiBPdXRkYXRlZCwgdXBkYXRpbmcgaXRcbiIsIHNwYWNlcyggZGVwdGggKSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfRkFURV9SRUJVSUxEOgorICAgICAgICBwcmludGYoICIgICVzICAgICAgIDogUmVidWlsZCwgdXBkYXRpbmcgaXRcbiIsIHNwYWNlcyggZGVwdGggKSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfRkFURV9VUERBVEU6CisgICAgICAgIHByaW50ZiggIiAgJXMgICAgICAgOiBVcGRhdGluZyBpdFxuIiwgc3BhY2VzKCBkZXB0aCApICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9GQVRFX0NBTlRGSU5EOgorICAgICAgICBwcmludGYoICIgICVzICAgICAgIDogQ2FuIG5vdCBmaW5kIGl0XG4iLCBzcGFjZXMoIGRlcHRoICkgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0ZBVEVfQ0FOVE1BS0U6CisgICAgICAgIHByaW50ZiggIiAgJXMgICAgICAgOiBDYW4gbWFrZSBpdFxuIiwgc3BhY2VzKCBkZXB0aCApICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICggdC0+ZmxhZ3MgJiB+VF9GTEFHX1ZJU0lURUQgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiICAlcyAgICAgICA6ICIsIHNwYWNlcyggZGVwdGggKSApOworICAgICAgICBpZiAoIHQtPmZsYWdzICYgVF9GTEFHX1RFTVAgICAgICkgcHJpbnRmKCAiVEVNUE9SQVJZICIgKTsKKyAgICAgICAgaWYgKCB0LT5mbGFncyAmIFRfRkxBR19OT0NBUkUgICApIHByaW50ZiggIk5PQ0FSRSAiICAgICk7CisgICAgICAgIGlmICggdC0+ZmxhZ3MgJiBUX0ZMQUdfTk9URklMRSAgKSBwcmludGYoICJOT1RGSUxFICIgICApOworICAgICAgICBpZiAoIHQtPmZsYWdzICYgVF9GTEFHX1RPVUNIRUQgICkgcHJpbnRmKCAiVE9VQ0hFRCAiICAgKTsKKyAgICAgICAgaWYgKCB0LT5mbGFncyAmIFRfRkxBR19MRUFWRVMgICApIHByaW50ZiggIkxFQVZFUyAiICAgICk7CisgICAgICAgIGlmICggdC0+ZmxhZ3MgJiBUX0ZMQUdfTk9VUERBVEUgKSBwcmludGYoICJOT1VQREFURSAiICApOworICAgICAgICBwcmludGYoICJcbiIgKTsKKyAgICB9CisKKyAgICBmb3IgKCBjID0gdC0+ZGVwZW5kczsgYzsgYyA9IGMtPm5leHQgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiICAlcyAgICAgICA6IERlcGVuZHMgb24gJXMgKCVzKSIsIHNwYWNlcyggZGVwdGggKSwKKyAgICAgICAgICAgdGFyZ2V0X25hbWUoIGMtPnRhcmdldCApLCB0YXJnZXRfZmF0ZVsgKGludCljLT50YXJnZXQtPmZhdGUgXSApOworICAgICAgICBpZiAoICF0aW1lc3RhbXBfY21wKCAmYy0+dGFyZ2V0LT50aW1lLCAmdC0+dGltZSApICkKKyAgICAgICAgICAgIHByaW50ZiggIiAobWF4IHRpbWUpIik7CisgICAgICAgIHByaW50ZiggIlxuIiApOworICAgIH0KKworICAgIGZvciAoIGMgPSB0LT5kZXBlbmRzOyBjOyBjID0gYy0+bmV4dCApCisgICAgICAgIGRlcGVuZEdyYXBoT3V0cHV0KCBjLT50YXJnZXQsIGRlcHRoICsgMSApOworfQorI2VuZGlmCisKKworLyoKKyAqIG1ha2Uwc29ydCgpIC0gcmVvcmRlciBUQVJHRVRTIGNoYWluIGJ5IHRoZWlyIHRpbWUgKG5ld2VzdCB0byBvbGRlc3QpLgorICoKKyAqIFdlIHdhbGsgY2hhaW4sIHRha2luZyBlYWNoIGl0ZW0gYW5kIGluc2VydGluZyBpdCBvbiB0aGUgc29ydGVkIHJlc3VsdCwgd2l0aAorICogbmV3ZXN0IGl0ZW1zIGF0IHRoZSBmcm9udC4gVGhpcyBpbnZvbHZlcyB1cGRhdGluZyBlYWNoIG9mIHRoZSBUQVJHRVRTJworICogYy0+bmV4dCBhbmQgYy0+dGFpbC4gTm90ZSB0aGF0IHdlIG1ha2UgYy0+dGFpbCBhIHZhbGlkIHByZXYgcG9pbnRlciBmb3IgZXZlcnkKKyAqIGVudHJ5LiBOb3JtYWxseSwgaXQgaXMgb25seSB2YWxpZCBhdCB0aGUgaGVhZCwgd2hlcmUgcHJldiA9PSB0YWlsLiBOb3RlIGFsc28KKyAqIHRoYXQgd2hpbGUgdGFpbCBpcyBhIGxvb3AsIG5leHQgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbi4KKyAqLworCitzdGF0aWMgVEFSR0VUUyAqIG1ha2Uwc29ydCggVEFSR0VUUyAqIGNoYWluICkKK3sKKyAgICBQUk9GSUxFX0VOVEVSKCBNQUtFX01BS0UwU09SVCApOworCisgICAgVEFSR0VUUyAqIHJlc3VsdCA9IDA7CisKKyAgICAvKiBXYWxrIHRoZSBjdXJyZW50IHRhcmdldCBsaXN0LiAqLworICAgIHdoaWxlICggY2hhaW4gKQorICAgIHsKKyAgICAgICAgVEFSR0VUUyAqIGMgPSBjaGFpbjsKKyAgICAgICAgVEFSR0VUUyAqIHMgPSByZXN1bHQ7CisKKyAgICAgICAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKKworICAgICAgICAvKiBGaW5kIHBvaW50IHMgaW4gcmVzdWx0IGZvciBjLiAqLworICAgICAgICB3aGlsZSAoIHMgJiYgdGltZXN0YW1wX2NtcCggJnMtPnRhcmdldC0+dGltZSwgJmMtPnRhcmdldC0+dGltZSApID4gMCApCisgICAgICAgICAgICBzID0gcy0+bmV4dDsKKworICAgICAgICAvKiBJbnNlcnQgYyBpbiBmcm9udCBvZiBzIChtaWdodCBiZSAwKS4gKi8KKyAgICAgICAgYy0+bmV4dCA9IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ29vZCBldmVuIGlmIHMgPSAwICAgICAgICovCisgICAgICAgIGlmICggcmVzdWx0ID09IHMgKSByZXN1bHQgPSBjOyAgICAgICAgIC8qIG5ldyBoZWFkIG9mIGNoYWluPyAgICAgICAqLworICAgICAgICBpZiAoICFzICkgcyA9IHJlc3VsdDsgICAgICAgICAgICAgICAgICAvKiB3cmFwIHRvIGVuc3VyZSBhIG5leHQgICAgKi8KKyAgICAgICAgaWYgKCByZXN1bHQgIT0gYyApIHMtPnRhaWwtPm5leHQgPSBjOyAgLyogbm90IGhlYWQ/IGJlIHByZXYncyBuZXh0ICovCisgICAgICAgIGMtPnRhaWwgPSBzLT50YWlsOyAgICAgICAgICAgICAgICAgICAgIC8qIHRha2Ugb24gbmV4dCdzIHByZXYgICAgICAqLworICAgICAgICBzLT50YWlsID0gYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIG5leHQncyBwcmV2IHVzICAgICAgKi8KKyAgICB9CisKKyAgICBQUk9GSUxFX0VYSVQoIE1BS0VfTUFLRTBTT1JUICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgTElTVCAqIHRhcmdldHNfdG9fdXBkYXRlXyA9IEwwOworCisKK3ZvaWQgbWFya190YXJnZXRfZm9yX3VwZGF0aW5nKCBPQkpFQ1QgKiB0YXJnZXQgKQoreworICAgIHRhcmdldHNfdG9fdXBkYXRlXyA9IGxpc3RfcHVzaF9iYWNrKCB0YXJnZXRzX3RvX3VwZGF0ZV8sIG9iamVjdF9jb3B5KAorICAgICAgICB0YXJnZXQgKSApOworfQorCisKK0xJU1QgKiB0YXJnZXRzX3RvX3VwZGF0ZSgpCit7CisgICAgcmV0dXJuIHRhcmdldHNfdG9fdXBkYXRlXzsKK30KKworCit2b2lkIGNsZWFyX3RhcmdldHNfdG9fdXBkYXRlKCkKK3sKKyAgICBsaXN0X2ZyZWUoIHRhcmdldHNfdG9fdXBkYXRlXyApOworICAgIHRhcmdldHNfdG9fdXBkYXRlXyA9IEwwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbWFrZS5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbWFrZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjM2JhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tYWtlLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk1IENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyoKKyAqIG1ha2UuaCAtIGJyaW5nIGEgdGFyZ2V0IHVwIHRvIGRhdGUsIG9uY2UgcnVsZXMgYXJlIGluIHBsYWNlCisgKi8KKworI2lmbmRlZiBNQUtFX1NXMjAxMTExMThfSAorI2RlZmluZSBNQUtFX1NXMjAxMTExMThfSAorCisjaW5jbHVkZSAibGlzdHMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJydWxlcy5oIgorCitpbnQgbWFrZSggTElTVCAqIHRhcmdldHMsIGludCBhbnlob3cgKTsKK2ludCBtYWtlMSggTElTVCAqIHQgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0ZW1wOworICAgIGludCB1cGRhdGluZzsKKyAgICBpbnQgY2FudGZpbmQ7CisgICAgaW50IGNhbnRtYWtlOworICAgIGludCB0YXJnZXRzOworICAgIGludCBtYWRlOworfSBDT1VOVFMgOworCisKK3ZvaWQgbWFrZTAoIFRBUkdFVCAqIHQsIFRBUkdFVCAqIHAsIGludCBkZXB0aCwgQ09VTlRTICogY291bnRzLCBpbnQgYW55aG93LAorICAgIFRBUkdFVCAqIHJlc2Nhbm5pbmcgKTsKKworCisvKiBTcGVjaWZpZXMgdGhhdCB0aGUgdGFyZ2V0IHNob3VsZCBiZSB1cGRhdGVkLiAqLwordm9pZCBtYXJrX3RhcmdldF9mb3JfdXBkYXRpbmcoIE9CSkVDVCAqIHRhcmdldCApOworCisvKiBSZXR1cm5zIHRhcmdldHMgcHJldmlvdXNseSBwYXNzZWQgdG8gbWFya190YXJnZXRfZm9yX3VwZGF0aW5nKCkuICovCitMSVNUICogdGFyZ2V0c190b191cGRhdGUoKTsKKworLyogQ2xlYXJzL3VubWFya3MgYWxsIHRhcmdldHMgY3VycmVudGx5IG1hcmtlZCBmb3IgdXBkYXRlLiAqLwordm9pZCBjbGVhcl90YXJnZXRzX3RvX3VwZGF0ZSgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21ha2UxLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tYWtlMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZWVlMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tYWtlMS5jCkBAIC0wLDAgKzEsMTI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLTIwMDIgQ2hyaXN0b3BoZXIgU2Vpd2FsZCBhbmQgUGVyZm9yY2UgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiAgVGhpcyBmaWxlIGlzIEFMU086CisgKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyAqICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKy8qCisgKiBtYWtlMS5jIC0gZXhlY3V0ZSBjb21tYW5kcyB0byBicmluZyB0YXJnZXRzIHVwIHRvIGRhdGUKKyAqCisgKiBUaGlzIG1vZHVsZSBjb250YWlucyBtYWtlMSgpLCB0aGUgZW50cnkgcG9pbnQgY2FsbGVkIGJ5IG1ha2UoKSB0byByZWN1cnNpdmVseQorICogZGVzY2VuZCB0aGUgZGVwZW5kZW5jeSBncmFwaCBleGVjdXRpbmcgdXBkYXRlIGFjdGlvbnMgYXMgbWFya2VkIGJ5IG1ha2UwKCkuCisgKgorICogRXh0ZXJuYWwgcm91dGluZXM6CisgKiAgIG1ha2UxKCkgLSBleGVjdXRlIGNvbW1hbmRzIHRvIHVwZGF0ZSBhIFRBUkdFVCBhbmQgYWxsIG9mIGl0cyBkZXBlbmRlbmNpZXMKKyAqCisgKiBJbnRlcm5hbCByb3V0aW5lcywgdGhlIHJlY3Vyc2l2ZS9hc3luY2hyb25vdXMgY29tbWFuZCBleGVjdXRvcnM6CisgKiAgIG1ha2UxYSgpICAgICAgICAgLSByZWN1cnNpdmVseSBzY2hlZHVsZXMgZGVwZW5kZW5jeSBidWlsZHMgYW5kIHRoZW4gZ29lcyB0bworICogICAgICAgICAgICAgICAgICAgICAgTUFLRTFCCisgKiAgIG1ha2UxYigpICAgICAgICAgLSBpZiBub3RoaW5nIGlzIGJsb2NraW5nIHRoaXMgdGFyZ2V0J3MgYnVpbGQsIHByb2NlZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIE1BS0UxQworICogICBtYWtlMWMoKSAgICAgICAgIC0gbGF1bmNoIHRhcmdldCdzIG5leHQgY29tbWFuZCwgb3IgZ28gdG8gcGFyZW50cycgTUFLRTFCCisgKiAgICAgICAgICAgICAgICAgICAgICBpZiBub25lCisgKiAgIG1ha2UxY19jbG9zdXJlKCkgLSBoYW5kbGUgY29tbWFuZCBleGVjdXRpb24gY29tcGxldGlvbiBhbmQgZ28gdG8gTUFLRTFDCisgKgorICogSW50ZXJuYWwgc3VwcG9ydCByb3V0aW5lczoKKyAqICAgbWFrZTFjbWRzKCkgICAgIC0gdHVybiBBQ1RJT05TIGludG8gQ01EcywgZ3JvdXBpbmcsIHNwbGl0dGluZywgZXRjLgorICogICBtYWtlMWxpc3QoKSAgICAgLSB0dXJuIGEgbGlzdCBvZiB0YXJnZXRzIGludG8gYSBMSVNULCBmb3IgJCg8KSBhbmQgJCg+KQorICogICBtYWtlMXNldHRpbmdzKCkgLSBmb3IgdmFycyB3aXRoIGJvdW5kIHZhbHVlcywgYnVpbGQgdXAgcmVwbGFjZW1lbnQgbGlzdHMKKyAqICAgbWFrZTFiaW5kKCkgICAgIC0gYmluZCB0YXJnZXRzIHRoYXQgd2VyZW4ndCBib3VuZCBpbiBkZXBlbmRlbmN5IGFuYWx5c2lzCisgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgIm1ha2UuaCIKKworI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJjb21waWxlLmgiCisjaW5jbHVkZSAiZXhlY2NtZC5oIgorI2luY2x1ZGUgImhlYWRlcnMuaCIKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgInBhcnNlLmgiCisjaW5jbHVkZSAicnVsZXMuaCIKKyNpbmNsdWRlICJzZWFyY2guaCIKKyNpbmNsdWRlICJ2YXJpYWJsZS5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZiAhZGVmaW5lZCggTlQgKSB8fCBkZWZpbmVkKCBfX0dOVUNfXyApCisgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPiAgLyogZm9yIHVubGluayAqLworI2VuZGlmCisKK3N0YXRpYyBDTUQgICAgICAqIG1ha2UxY21kcyAgICAgICggVEFSR0VUICogKTsKK3N0YXRpYyBMSVNUICAgICAqIG1ha2UxbGlzdCAgICAgICggTElTVCAqLCBUQVJHRVRTICosIGludCBmbGFncyApOworc3RhdGljIFNFVFRJTkdTICogbWFrZTFzZXR0aW5ncyAgKCBzdHJ1Y3QgbW9kdWxlX3QgKiwgTElTVCAqIHZhcnMgKTsKK3N0YXRpYyB2b2lkICAgICAgIG1ha2UxYmluZCAgICAgICggVEFSR0VUICogKTsKK3N0YXRpYyBUQVJHRVQgICAqIG1ha2UxZmluZGN5Y2xlICggVEFSR0VUICogKTsKK3N0YXRpYyB2b2lkICAgICAgIG1ha2UxYnJlYWtjeWNsZSggVEFSR0VUICosIFRBUkdFVCAqIGN5Y2xlX3Jvb3QgKTsKKworLyogVWdseSBzdGF0aWMgLSBpdCBpcyB0b28gaGFyZCB0byBjYXJyeSBpdCB0aHJvdWdoIHRoZSBjYWxsYmFja3MuICovCisKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgICBpbnQgZmFpbGVkOworICAgIGludCBza2lwcGVkOworICAgIGludCB0b3RhbDsKKyAgICBpbnQgbWFkZTsKK30gY291bnRzWyAxIF07CisKKy8qIFRhcmdldCBzdGF0ZS4gKi8KKyNkZWZpbmUgVF9TVEFURV9NQUtFMUEgIDAgIC8qIG1ha2UxYSgpIHNob3VsZCBiZSBjYWxsZWQgKi8KKyNkZWZpbmUgVF9TVEFURV9NQUtFMUIgIDEgIC8qIG1ha2UxYigpIHNob3VsZCBiZSBjYWxsZWQgKi8KKyNkZWZpbmUgVF9TVEFURV9NQUtFMUMgIDIgIC8qIG1ha2UxYygpIHNob3VsZCBiZSBjYWxsZWQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3N0YXRlIHN0YXRlOworc3RydWN0IF9zdGF0ZQoreworICAgIHN0YXRlICAqIHByZXY7ICAgICAgLyogcHJldmlvdXMgc3RhdGUgb24gc3RhY2sgKi8KKyAgICBUQVJHRVQgKiB0OyAgICAgICAgIC8qIGN1cnJlbnQgdGFyZ2V0ICovCisgICAgVEFSR0VUICogcGFyZW50OyAgICAvKiBwYXJlbnQgYXJndW1lbnQgbmVjZXNzYXJ5IGZvciBNQUtFMUEgKi8KKyAgICBpbnQgICAgICBjdXJzdGF0ZTsgIC8qIGN1cnJlbnQgc3RhdGUgKi8KK307CisKK3N0YXRpYyB2b2lkIG1ha2UxYSggc3RhdGUgKiBjb25zdCApOworc3RhdGljIHZvaWQgbWFrZTFiKCBzdGF0ZSAqIGNvbnN0ICk7CitzdGF0aWMgdm9pZCBtYWtlMWMoIHN0YXRlIGNvbnN0ICogY29uc3QgKTsKKworc3RhdGljIHZvaWQgbWFrZTFjX2Nsb3N1cmUoIHZvaWQgKiBjb25zdCBjbG9zdXJlLCBpbnQgc3RhdHVzLAorICAgIHRpbWluZ19pbmZvIGNvbnN0ICogY29uc3QsIGNoYXIgY29uc3QgKiBjb25zdCBjbWRfc3Rkb3V0LAorICAgIGNoYXIgY29uc3QgKiBjb25zdCBjbWRfc3RkZXJyLCBpbnQgY29uc3QgY21kX2V4aXRfcmVhc29uICk7CisKK3R5cGVkZWYgc3RydWN0IF9zdGFjaworeworICAgIHN0YXRlICogc3RhY2s7Cit9IHN0YWNrOworCitzdGF0aWMgc3RhY2sgc3RhdGVfc3RhY2sgPSB7IE5VTEwgfTsKKworc3RhdGljIHN0YXRlICogc3RhdGVfZnJlZWxpc3QgPSBOVUxMOworCisvKiBDdXJyZW50bHkgcnVubmluZyBjb21tYW5kIGNvdW50ZXIuICovCitzdGF0aWMgaW50IGNtZHNydW5uaW5nOworCisKK3N0YXRpYyBzdGF0ZSAqIGFsbG9jX3N0YXRlKCkKK3sKKyAgICBpZiAoIHN0YXRlX2ZyZWVsaXN0ICkKKyAgICB7CisgICAgICAgIHN0YXRlICogY29uc3QgcFN0YXRlID0gc3RhdGVfZnJlZWxpc3Q7CisgICAgICAgIHN0YXRlX2ZyZWVsaXN0ID0gcFN0YXRlLT5wcmV2OworICAgICAgICBtZW1zZXQoIHBTdGF0ZSwgMCwgc2l6ZW9mKCBzdGF0ZSApICk7CisgICAgICAgIHJldHVybiBwU3RhdGU7CisgICAgfQorICAgIHJldHVybiAoc3RhdGUgKilCSkFNX01BTExPQyggc2l6ZW9mKCBzdGF0ZSApICk7Cit9CisKKworc3RhdGljIHZvaWQgZnJlZV9zdGF0ZSggc3RhdGUgKiBjb25zdCBwU3RhdGUgKQoreworICAgIHBTdGF0ZS0+cHJldiA9IHN0YXRlX2ZyZWVsaXN0OworICAgIHN0YXRlX2ZyZWVsaXN0ID0gcFN0YXRlOworfQorCisKK3N0YXRpYyB2b2lkIGNsZWFyX3N0YXRlX2ZyZWVsaXN0KCkKK3sKKyAgICB3aGlsZSAoIHN0YXRlX2ZyZWVsaXN0ICkKKyAgICB7CisgICAgICAgIHN0YXRlICogY29uc3QgcFN0YXRlID0gc3RhdGVfZnJlZWxpc3Q7CisgICAgICAgIHN0YXRlX2ZyZWVsaXN0ID0gc3RhdGVfZnJlZWxpc3QtPnByZXY7CisgICAgICAgIEJKQU1fRlJFRSggcFN0YXRlICk7CisgICAgfQorfQorCisKK3N0YXRpYyBzdGF0ZSAqIGN1cnJlbnRfc3RhdGUoIHN0YWNrICogY29uc3QgcFN0YWNrICkKK3sKKyAgICByZXR1cm4gcFN0YWNrLT5zdGFjazsKK30KKworCitzdGF0aWMgdm9pZCBwb3Bfc3RhdGUoIHN0YWNrICogY29uc3QgcFN0YWNrICkKK3sKKyAgICBpZiAoIHBTdGFjay0+c3RhY2sgKQorICAgIHsKKyAgICAgICAgc3RhdGUgKiBjb25zdCBwU3RhdGUgPSBwU3RhY2stPnN0YWNrLT5wcmV2OworICAgICAgICBmcmVlX3N0YXRlKCBwU3RhY2stPnN0YWNrICk7CisgICAgICAgIHBTdGFjay0+c3RhY2sgPSBwU3RhdGU7CisgICAgfQorfQorCisKK3N0YXRpYyBzdGF0ZSAqIHB1c2hfc3RhdGUoIHN0YWNrICogY29uc3QgcFN0YWNrLCBUQVJHRVQgKiBjb25zdCB0LAorICAgIFRBUkdFVCAqIGNvbnN0IHBhcmVudCwgaW50IGNvbnN0IGN1cnN0YXRlICkKK3sKKyAgICBzdGF0ZSAqIGNvbnN0IHBTdGF0ZSA9IGFsbG9jX3N0YXRlKCk7CisgICAgcFN0YXRlLT50ID0gdDsKKyAgICBwU3RhdGUtPnBhcmVudCA9IHBhcmVudDsKKyAgICBwU3RhdGUtPnByZXYgPSBwU3RhY2stPnN0YWNrOworICAgIHBTdGF0ZS0+Y3Vyc3RhdGUgPSBjdXJzdGF0ZTsKKyAgICByZXR1cm4gcFN0YWNrLT5zdGFjayA9IHBTdGF0ZTsKK30KKworCisvKgorICogUHVzaGVzIGEgc3RhY2sgb250byBhbm90aGVyIHN0YWNrLCBlZmZlY3RpdmVseSByZXZlcnNpbmcgdGhlIG9yZGVyLgorICovCisKK3N0YXRpYyB2b2lkIHB1c2hfc3RhY2tfb25fc3RhY2soIHN0YWNrICogY29uc3QgcERlc3QsIHN0YWNrICogY29uc3QgcFNyYyApCit7CisgICAgd2hpbGUgKCBwU3JjLT5zdGFjayApCisgICAgeworICAgICAgICBzdGF0ZSAqIGNvbnN0IHBTdGF0ZSA9IHBTcmMtPnN0YWNrOworICAgICAgICBwU3JjLT5zdGFjayA9IHBTdGF0ZS0+cHJldjsKKyAgICAgICAgcFN0YXRlLT5wcmV2ID0gcERlc3QtPnN0YWNrOworICAgICAgICBwRGVzdC0+c3RhY2sgPSBwU3RhdGU7CisgICAgfQorfQorCisKKy8qCisgKiBtYWtlMSgpIC0gZXhlY3V0ZSBjb21tYW5kcyB0byB1cGRhdGUgYSBsaXN0IG9mIHRhcmdldHMgYW5kIGFsbCBvZiB0aGVpciBkZXBlbmRlbmNpZXMKKyAqLworCitzdGF0aWMgaW50IGludHIgPSAwOworc3RhdGljIGludCBxdWl0ID0gMDsKKworaW50IG1ha2UxKCBMSVNUICogdGFyZ2V0cyApCit7CisgICAgc3RhdGUgKiBwU3RhdGU7CisgICAgaW50IHN0YXR1cyA9IDA7CisKKyAgICBtZW1zZXQoIChjaGFyICopY291bnRzLCAwLCBzaXplb2YoICpjb3VudHMgKSApOworICAgIAorICAgIHsKKyAgICAgICAgTElTVElURVIgaXRlciwgZW5kOworICAgICAgICBzdGFjayB0ZW1wX3N0YWNrID0geyBOVUxMIH07CisgICAgICAgIGZvciAoIGl0ZXIgPSBsaXN0X2JlZ2luKCB0YXJnZXRzICksIGVuZCA9IGxpc3RfZW5kKCB0YXJnZXRzICk7CisgICAgICAgICAgICAgIGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgICAgICAgICAgcHVzaF9zdGF0ZSggJnRlbXBfc3RhY2ssIGJpbmR0YXJnZXQoIGxpc3RfaXRlbSggaXRlciApICksIE5VTEwsIFRfU1RBVEVfTUFLRTFBICk7CisgICAgICAgIHB1c2hfc3RhY2tfb25fc3RhY2soICZzdGF0ZV9zdGFjaywgJnRlbXBfc3RhY2sgKTsKKyAgICB9CisKKyAgICAvKiBDbGVhciBhbnkgc3RhdGUgbGVmdCBvdmVyIGZyb20gdGhlIHBhc3QgKi8KKyAgICBxdWl0ID0gMDsKKworICAgIC8qIFJlY3Vyc2l2ZWx5IG1ha2UgdGhlIHRhcmdldCBhbmQgaXRzIGRlcGVuZGVuY2llcy4gKi8KKworICAgIHdoaWxlICggMSApCisgICAgeworICAgICAgICB3aGlsZSAoICggcFN0YXRlID0gY3VycmVudF9zdGF0ZSggJnN0YXRlX3N0YWNrICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcXVpdCApCisgICAgICAgICAgICAgICAgcG9wX3N0YXRlKCAmc3RhdGVfc3RhY2sgKTsKKworICAgICAgICAgICAgc3dpdGNoICggcFN0YXRlLT5jdXJzdGF0ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUX1NUQVRFX01BS0UxQTogbWFrZTFhKCBwU3RhdGUgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUX1NUQVRFX01BS0UxQjogbWFrZTFiKCBwU3RhdGUgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUX1NUQVRFX01BS0UxQzogbWFrZTFjKCBwU3RhdGUgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCAhIm1ha2UxKCk6IEludmFsaWQgc3RhdGUgZGV0ZWN0ZWQuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggIWNtZHNydW5uaW5nICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiBXYWl0IGZvciBvdXRzdGFuZGluZyBjb21tYW5kcyB0byBmaW5pc2ggcnVubmluZy4gKi8KKyAgICAgICAgZXhlY193YWl0KCk7CisgICAgfQorCisgICAgY2xlYXJfc3RhdGVfZnJlZWxpc3QoKTsKKworICAgIC8qIFRhbGsgYWJvdXQgaXQuICovCisgICAgaWYgKCBjb3VudHMtPmZhaWxlZCApCisgICAgICAgIHByaW50ZiggIi4uLmZhaWxlZCB1cGRhdGluZyAlZCB0YXJnZXQlcy4uLlxuIiwgY291bnRzLT5mYWlsZWQsCisgICAgICAgICAgICBjb3VudHMtPmZhaWxlZCA+IDEgPyAicyIgOiAiIiApOworICAgIGlmICggREVCVUdfTUFLRSAmJiBjb3VudHMtPnNraXBwZWQgKQorICAgICAgICBwcmludGYoICIuLi5za2lwcGVkICVkIHRhcmdldCVzLi4uXG4iLCBjb3VudHMtPnNraXBwZWQsCisgICAgICAgICAgICBjb3VudHMtPnNraXBwZWQgPiAxID8gInMiIDogIiIgKTsKKyAgICBpZiAoIERFQlVHX01BS0UgJiYgY291bnRzLT5tYWRlICkKKyAgICAgICAgcHJpbnRmKCAiLi4udXBkYXRlZCAlZCB0YXJnZXQlcy4uLlxuIiwgY291bnRzLT5tYWRlLAorICAgICAgICAgICAgY291bnRzLT5tYWRlID4gMSA/ICJzIiA6ICIiICk7CisKKyAgICAvKiBJZiB3ZSB3ZXJlIGludGVycnVwdGVkLCBleGl0IG5vdyB0aGF0IGFsbCBjaGlsZCBwcm9jZXNzZXMKKyAgICAgICBoYXZlIGZpbmlzaGVkLiAqLworICAgIGlmICggaW50ciApCisgICAgICAgIGV4aXQoIDEgKTsKKworICAgIHsKKyAgICAgICAgTElTVElURVIgaXRlciwgZW5kOworICAgICAgICBmb3IgKCBpdGVyID0gbGlzdF9iZWdpbiggdGFyZ2V0cyApLCBlbmQgPSBsaXN0X2VuZCggdGFyZ2V0cyApOworICAgICAgICAgICAgICBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgdGFyZ2V0IHdhcyB1cGRhdGVkIGFuZCB0aGF0IHRoZQorICAgICAgICAgICAgICAgdXBkYXRlIHN1Y2NlZWRlZC4gKi8KKyAgICAgICAgICAgIFRBUkdFVCAqIHQgPSBiaW5kdGFyZ2V0KCBsaXN0X2l0ZW0oIGl0ZXIgKSApOworICAgICAgICAgICAgaWYgKHQtPnByb2dyZXNzID09IFRfTUFLRV9ET05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0LT5zdGF0dXMgIT0gRVhFQ19DTURfT0spCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggISAoIHQtPnByb2dyZXNzID09IFRfTUFLRV9OT0VYRUNfRE9ORSAmJiBnbG9icy5ub2V4ZWMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBtYWtlMWEoKSAtIHJlY3Vyc2l2ZWx5IHNjaGVkdWxlcyBkZXBlbmRlbmN5IGJ1aWxkcyBhbmQgdGhlbiBnb2VzIHRvIE1BS0UxQgorICoKKyAqIENhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgc3BlY2lmaWVkIHRhcmdldC4gRG9lcyBub3RoaW5nIGlmIHRoZSB0YXJnZXQgaXMKKyAqIGFscmVhZHkgYmVpbmcgcHJvY2Vzc2VkIG9yIG90aGVyd2lzZSBzdGFydHMgcHJvY2Vzc2luZyBhbGwgb2YgaXRzCisgKiBkZXBlbmRlbmNpZXMuCisgKi8KKworc3RhdGljIHZvaWQgbWFrZTFhKCBzdGF0ZSAqIGNvbnN0IHBTdGF0ZSApCit7CisgICAgVEFSR0VUICogdCA9IHBTdGF0ZS0+dDsKKyAgICBUQVJHRVQgKiBjb25zdCBzY2Nfcm9vdCA9IHRhcmdldF9zY2MoIHQgKTsKKworICAgIGlmICggIXBTdGF0ZS0+cGFyZW50IHx8IHRhcmdldF9zY2MoIHBTdGF0ZS0+cGFyZW50ICkgIT0gc2NjX3Jvb3QgKQorICAgICAgICBwU3RhdGUtPnQgPSB0ID0gc2NjX3Jvb3Q7CisKKyAgICAvKiBJZiB0aGUgcGFyZW50IGlzIHRoZSBmaXJzdCB0byB0cnkgdG8gYnVpbGQgdGhpcyB0YXJnZXQgb3IgdGhpcyB0YXJnZXQgaXMKKyAgICAgKiBpbiB0aGUgTUFLRTFDIHF1YWdtaXJlLCBhcnJhbmdlIGZvciB0aGUgcGFyZW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhpcworICAgICAqIHRhcmdldCBoYXMgYmVlbiBidWlsdC4KKyAgICAgKi8KKyAgICBpZiAoIHBTdGF0ZS0+cGFyZW50ICYmIHQtPnByb2dyZXNzIDw9IFRfTUFLRV9SVU5OSU5HICkKKyAgICB7CisgICAgICAgIFRBUkdFVCAqIGNvbnN0IHBhcmVudF9zY2MgPSB0YXJnZXRfc2NjKCBwU3RhdGUtPnBhcmVudCApOworICAgICAgICBpZiAoIHQgIT0gcGFyZW50X3NjYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHQtPnBhcmVudHMgPSB0YXJnZXRlbnRyeSggdC0+cGFyZW50cywgcGFyZW50X3NjYyApOworICAgICAgICAgICAgKytwYXJlbnRfc2NjLT5hc3luY2NudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIHRoZSB0YXJnZXQgaGFzIGJlZW4gcHJldmlvdXNseSB1cGRhdGVkIHdpdGggLW4gaW4gZWZmZWN0LCBhbmQgd2UgYXJlCisgICAgICogbm93IGlnbm9yaW5nIC1uLCB1cGRhdGUgaXQgZm9yIHJlYWwuIEUuZy4gaWYgdGhlIFVQREFURV9OT1cgcnVsZSB3YXMKKyAgICAgKiBjYWxsZWQgZm9yIGl0IHR3aWNlIC0gZmlyc3Qgd2l0aCB0aGUgLW4gb3B0aW9uIGFuZCB0aGVuIHdpdGhvdXQuCisgICAgICovCisgICAgaWYgKCAhZ2xvYnMubm9leGVjICYmIHQtPnByb2dyZXNzID09IFRfTUFLRV9OT0VYRUNfRE9ORSApCisgICAgICAgIHQtPnByb2dyZXNzID0gVF9NQUtFX0lOSVQ7CisKKyAgICAvKiBJZiB0aGlzIHRhcmdldCBpcyBhbHJlYWR5IGJlaW5nIHByb2Nlc3NlZCB0aGVuIGRvIG5vdGhpbmcuIFRoZXJlIGlzIG5vCisgICAgICogbmVlZCB0byBzdGFydCBwcm9jZXNzaW5nIHRoZSBzYW1lIHRhcmdldCBhbGwgb3ZlciBhZ2Fpbi4KKyAgICAgKi8KKyAgICBpZiAoIHQtPnByb2dyZXNzICE9IFRfTUFLRV9JTklUICkKKyAgICB7CisgICAgICAgIHBvcF9zdGF0ZSggJnN0YXRlX3N0YWNrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBHdWFyZCBhZ2FpbnN0IGNpcmN1bGFyIGRlcGVuZGVuY2llcy4gKi8KKyAgICB0LT5wcm9ncmVzcyA9IFRfTUFLRV9PTlNUQUNLOworCisgICAgLyogJ2FzeW5jY250JyBjb3VudHMgdGhlIGRlcGVuZGVuY2llcyBwcmV2ZW50aW5nIHRoaXMgdGFyZ2V0IGZyb20gcHJvY2VlZGluZworICAgICAqIHRvIE1BS0UxQyBmb3IgYWN0dWFsIGJ1aWxkaW5nLiBXZSBzdGFydCBvZmYgd2l0aCBhIGNvdW50IG9mIDEgdG8gcHJldmVudAorICAgICAqIGFueXRoaW5nIGZyb20gaGFwcGVuaW5nIHVudGlsIHdlIGNhbiBub3RpZnkgYWxsIGRlcGVuZGVuY2llcyB0aGF0IHRoZXkKKyAgICAgKiBhcmUgbmVlZGVkLiBUaGlzIDEgaXMgdGhlbiBhY2NvdW50ZWQgZm9yIHdoZW4gd2UgZW50ZXIgTUFLRTFCIG91cnNlbHZlcywKKyAgICAgKiBiZWxvdy4gV2l0aG91dCB0aGlzIGlmIGEgZGVwZW5kZW5jeSBnZXRzIGJ1aWx0IGJlZm9yZSB3ZSBmaW5pc2gKKyAgICAgKiBwcm9jZXNzaW5nIGFsbCBvZiBvdXIgb3RoZXIgZGVwZW5kZW5jaWVzIG91ciBidWlsZCBtaWdodCBiZSB0cmlnZ2VycmVkCisgICAgICogcHJlbWF0dXJlbHkuCisgICAgICovCisgICAgdC0+YXN5bmNjbnQgPSAxOworCisgICAgLyogUHVzaCBkZXBlbmRlbmN5IGJ1aWxkIHJlcXVlc3RzICh0byBiZSBleGVjdXRlZCBpbiB0aGUgbmF0dXJhbCBvcmRlcikuICovCisgICAgeworICAgICAgICBzdGFjayB0ZW1wX3N0YWNrID0geyBOVUxMIH07CisgICAgICAgIFRBUkdFVFMgKiBjOworICAgICAgICBmb3IgKCBjID0gdC0+ZGVwZW5kczsgYyAmJiAhcXVpdDsgYyA9IGMtPm5leHQgKQorICAgICAgICAgICAgcHVzaF9zdGF0ZSggJnRlbXBfc3RhY2ssIGMtPnRhcmdldCwgdCwgVF9TVEFURV9NQUtFMUEgKTsKKyAgICAgICAgcHVzaF9zdGFja19vbl9zdGFjayggJnN0YXRlX3N0YWNrLCAmdGVtcF9zdGFjayApOworICAgIH0KKworICAgIHQtPnByb2dyZXNzID0gVF9NQUtFX0FDVElWRTsKKworICAgIC8qIE9uY2UgYWxsIG9mIG91ciBkZXBlbmRlbmNpZXMgaGF2ZSBzdGFydGVkIGdldHRpbmcgcHJvY2Vzc2VkIHdlIGNhbiBtb3ZlCisgICAgICogb250byBNQUtFMUIuCisgICAgICovCisgICAgLyogSW1wbGVtZW50YXRpb24gbm90ZToKKyAgICAgKiAgIEluIHRoZW9yeSB0aGlzIHdvdWxkIGJlIGRvbmUgYnkgcG9wcGluZyB0aGlzIHN0YXRlIGJlZm9yZSBwdXNoaW5nCisgICAgICogZGVwZW5kZW5jeSB0YXJnZXQgYnVpbGQgcmVxdWVzdHMgYnV0IGFzIGEgc2xpZ2h0IG9wdGltaXphdGlvbiB3ZSBzaW1wbHkKKyAgICAgKiBtb2RpZnkgb3VyIGN1cnJlbnQgc3RhdGUgYW5kIGxlYXZlIGl0IG9uIHRoZSBzdGFjayBpbnN0ZWFkLgorICAgICAqLworICAgIHBTdGF0ZS0+Y3Vyc3RhdGUgPSBUX1NUQVRFX01BS0UxQjsKK30KKworCisvKgorICogbWFrZTFiKCkgLSBpZiBub3RoaW5nIGlzIGJsb2NraW5nIHRoaXMgdGFyZ2V0J3MgYnVpbGQsIHByb2NlZWQgdG8gTUFLRTFDCisgKgorICogQ2FsbGVkIGFmdGVyIHNvbWV0aGluZyBzdG9wcyBibG9ja2luZyB0aGlzIHRhcmdldCdzIGJ1aWxkLCBlLmcuIHRoYXQgYWxsIG9mCisgKiBpdHMgZGVwZW5kZW5jaWVzIGhhdmUgc3RhcnRlZCBiZWluZyBwcm9jZXNzZWQsIG9uZSBvZiBpdHMgZGVwZW5kZW5jaWVzIGhhcworICogYmVlbiBidWlsdCBvciBhIHNlbWFwaG9yZSB0aGlzIHRhcmdldCBoYXMgYmVlbiB3YWl0aW5nIGZvciBpcyBmcmVlIGFnYWluLgorICovCisKK3N0YXRpYyB2b2lkIG1ha2UxYiggc3RhdGUgKiBjb25zdCBwU3RhdGUgKQoreworICAgIFRBUkdFVCAqIGNvbnN0IHQgPSBwU3RhdGUtPnQ7CisgICAgVEFSR0VUICogZmFpbGVkID0gMDsKKyAgICBjaGFyIGNvbnN0ICogZmFpbGVkX25hbWUgPSAiZGVwZW5kZW5jaWVzIjsKKworICAgIC8qIElmIGFueSBkZXBlbmRlbmNpZXMgYXJlIHN0aWxsIG91dHN0YW5kaW5nLCB3YWl0IHVudGlsIHRoZXkgc2lnbmFsIHRoZWlyCisgICAgICogY29tcGxldGlvbiBieSBwdXNoaW5nIHRoaXMgc2FtZSBzdGF0ZSBmb3IgdGhlaXIgcGFyZW50IHRhcmdldHMuCisgICAgICovCisgICAgaWYgKCAtLXQtPmFzeW5jY250ICkKKyAgICB7CisgICAgICAgIHBvcF9zdGF0ZSggJnN0YXRlX3N0YWNrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBUcnkgdG8gYXF1aXJlIGEgc2VtYXBob3JlLiBJZiBpdCBpcyBsb2NrZWQsIHdhaXQgdW50aWwgdGhlIHRhcmdldCB0aGF0CisgICAgICogbG9ja2VkIGl0IGlzIGJ1aWx0IGFuZCBzaWduYWxzIGNvbXBsZXRpdGlvbi4KKyAgICAgKi8KKyNpZmRlZiBPUFRfU0VNQVBIT1JFCisgICAgaWYgKCB0LT5zZW1hcGhvcmUgJiYgdC0+c2VtYXBob3JlLT5hc3luY2NudCApCisgICAgeworICAgICAgICAvKiBBcHBlbmQgJ3QnIHRvIHRoZSBsaXN0IG9mIHRhcmdldHMgd2FpdGluZyBvbiBzZW1hcGhvcmUuICovCisgICAgICAgIHQtPnNlbWFwaG9yZS0+cGFyZW50cyA9IHRhcmdldGVudHJ5KCB0LT5zZW1hcGhvcmUtPnBhcmVudHMsIHQgKTsKKyAgICAgICAgdC0+YXN5bmNjbnQrKzsKKworICAgICAgICBpZiAoIERFQlVHX0VYRUNDTUQgKQorICAgICAgICAgICAgcHJpbnRmKCAiU0VNOiAlcyBpcyBidXN5LCBkZWxheWluZyBsYXVuY2ggb2YgJXNcbiIsCisgICAgICAgICAgICAgICAgb2JqZWN0X3N0ciggdC0+c2VtYXBob3JlLT5uYW1lICksIG9iamVjdF9zdHIoIHQtPm5hbWUgKSApOworICAgICAgICBwb3Bfc3RhdGUoICZzdGF0ZV9zdGFjayApOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBOb3cgcmVhZHkgdG8gYnVpbGQgdGFyZ2V0ICd0JywgaWYgZGVwZW5kZW5jaWVzIGJ1aWx0IE9LLiAqLworCisgICAgLyogQ29sbGVjdCBzdGF0dXMgZnJvbSBkZXBlbmRlbmNpZXMuIElmIC1uIHdhcyBwYXNzZWQgdGhlbiBhY3QgYXMgdGhvdWdoIGFsbAorICAgICAqIGRlcGVuZGVuY2llcyBidWlsdCBjb3JyZWN0bHkgKHRoZSBvbmx5IHdheSB0aGV5IGNhbiBmYWlsIGlzIGlmIFVQREFURV9OT1cKKyAgICAgKiB3YXMgY2FsbGVkKS4gSWYgdGhlIGRlcGVuZGVuY2llcyBjYW4gbm90IGJlIGZvdW5kIG9yIHdlIGdvdCBhbiBpbnRlcnJ1cHQsCisgICAgICogd2UgY2FuIG5vdCBnZXQgaGVyZS4KKyAgICAgKi8KKyAgICBpZiAoICFnbG9icy5ub2V4ZWMgKQorICAgIHsKKyAgICAgICAgVEFSR0VUUyAqIGM7CisgICAgICAgIGZvciAoIGMgPSB0LT5kZXBlbmRzOyBjOyBjID0gYy0+bmV4dCApCisgICAgICAgICAgICBpZiAoIGMtPnRhcmdldC0+c3RhdHVzID4gdC0+c3RhdHVzICYmICEoIGMtPnRhcmdldC0+ZmxhZ3MgJgorICAgICAgICAgICAgICAgIFRfRkxBR19OT0NBUkUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gYy0+dGFyZ2V0OworICAgICAgICAgICAgICAgIHQtPnN0YXR1cyA9IGMtPnRhcmdldC0+c3RhdHVzOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIGFuIGludGVybmFsIGhlYWRlciBub2RlIGZhaWxlZCB0byBidWlsZCwgd2Ugd2FudCB0byBvdXRwdXQgdGhlIHRhcmdldAorICAgICAqIHRoYXQgaXQgZmFpbGVkIG9uLgorICAgICAqLworICAgIGlmICggZmFpbGVkICkKKyAgICAgICAgZmFpbGVkX25hbWUgPSBmYWlsZWQtPmZsYWdzICYgVF9GTEFHX0lOVEVSTkFMCisgICAgICAgICAgICA/IGZhaWxlZC0+ZmFpbGVkCisgICAgICAgICAgICA6IG9iamVjdF9zdHIoIGZhaWxlZC0+bmFtZSApOworICAgIHQtPmZhaWxlZCA9IGZhaWxlZF9uYW1lOworCisgICAgLyogSWYgYWN0aW9ucyBmb3IgYnVpbGRpbmcgYW55IG9mIHRoZSBkZXBlbmRlbmNpZXMgaGF2ZSBmYWlsZWQsIGJhaWwuCisgICAgICogT3RoZXJ3aXNlLCBleGVjdXRlIGFsbCBhY3Rpb25zIHRvIG1ha2UgdGhlIGN1cnJlbnQgdGFyZ2V0LgorICAgICAqLworICAgIGlmICggKCB0LT5zdGF0dXMgPT0gRVhFQ19DTURfRkFJTCApICYmIHQtPmFjdGlvbnMgKQorICAgIHsKKyAgICAgICAgKytjb3VudHMtPnNraXBwZWQ7CisgICAgICAgIGlmICggKCB0LT5mbGFncyAmICggVF9GTEFHX1JNT0xEIHwgVF9GTEFHX05PVEZJTEUgKSApID09IFRfRkxBR19STU9MRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIXVubGluayggb2JqZWN0X3N0ciggdC0+Ym91bmRuYW1lICkgKSApCisgICAgICAgICAgICAgICAgcHJpbnRmKCAiLi4ucmVtb3Zpbmcgb3V0ZGF0ZWQgJXNcbiIsIG9iamVjdF9zdHIoIHQtPmJvdW5kbmFtZSApCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCAiLi4uc2tpcHBlZCAlcyBmb3IgbGFjayBvZiAlcy4uLlxuIiwgb2JqZWN0X3N0ciggdC0+bmFtZSApLAorICAgICAgICAgICAgICAgIGZhaWxlZF9uYW1lICk7CisgICAgfQorCisgICAgaWYgKCB0LT5zdGF0dXMgPT0gRVhFQ19DTURfT0sgKQorICAgICAgICBzd2l0Y2ggKCB0LT5mYXRlICkKKyAgICAgICAgeworICAgICAgICBjYXNlIFRfRkFURV9TVEFCTEU6CisgICAgICAgIGNhc2UgVF9GQVRFX05FV0VSOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUX0ZBVEVfQ0FOVEZJTkQ6CisgICAgICAgIGNhc2UgVF9GQVRFX0NBTlRNQUtFOgorICAgICAgICAgICAgdC0+c3RhdHVzID0gRVhFQ19DTURfRkFJTDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVF9GQVRFX0lTVE1QOgorICAgICAgICAgICAgaWYgKCBERUJVR19NQUtFICkKKyAgICAgICAgICAgICAgICBwcmludGYoICIuLi51c2luZyAlcy4uLlxuIiwgb2JqZWN0X3N0ciggdC0+bmFtZSApICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRfRkFURV9UT1VDSEVEOgorICAgICAgICBjYXNlIFRfRkFURV9NSVNTSU5HOgorICAgICAgICBjYXNlIFRfRkFURV9ORUVEVE1QOgorICAgICAgICBjYXNlIFRfRkFURV9PVVREQVRFRDoKKyAgICAgICAgY2FzZSBUX0ZBVEVfVVBEQVRFOgorICAgICAgICBjYXNlIFRfRkFURV9SRUJVSUxEOgorICAgICAgICAgICAgLyogUHJlcGFyZSBjb21tYW5kcyBmb3IgZXhlY3V0aW5nIGFjdGlvbnMgc2NoZWR1bGVkIGZvciB0aGlzIHRhcmdldC4KKyAgICAgICAgICAgICAqIENvbW1hbmRzIGhhdmUgdGhlaXIgZW1iZWRkZWQgdmFyaWFibGVzIGF1dG9tYXRpY2FsbHkgZXhwYW5kZWQsCisgICAgICAgICAgICAgKiBpbmNsdWRpbmcgbWFraW5nIHVzZSBvZiBhbnkgIm9uIHRhcmdldCIgdmFyaWFibGVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIHQtPmFjdGlvbnMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrY291bnRzLT50b3RhbDsKKyAgICAgICAgICAgICAgICBpZiAoIERFQlVHX01BS0UgJiYgISggY291bnRzLT50b3RhbCAlIDEwMCApICkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiLi4ub24gJWR0aCB0YXJnZXQuLi5cbiIsIGNvdW50cy0+dG90YWwgKTsKKworICAgICAgICAgICAgICAgIHQtPmNtZHMgPSAoY2hhciAqKW1ha2UxY21kcyggdCApOworICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgdGFyZ2V0J3MgInByb2dyZXNzIiBzbyBNQUtFMUMgcHJvY2Vzc2luZyBjb3VudHMgaXQKKyAgICAgICAgICAgICAgICAgKiBhbW9uZyBpdHMgc3VjY2Vzc2VzL2ZhaWx1cmVzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHQtPnByb2dyZXNzID0gVF9NQUtFX1JVTk5JTkc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBBbGwgdmFsaWQgZmF0ZXMgc2hvdWxkIGhhdmUgYmVlbiBhY2NvdW50ZWQgZm9yIGJ5IG5vdy4gKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZiggIkVSUk9SOiAlcyBoYXMgYmFkIGZhdGUgJWQiLCBvYmplY3Rfc3RyKCB0LT5uYW1lICksCisgICAgICAgICAgICAgICAgdC0+ZmF0ZSApOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorCisjaWZkZWYgT1BUX1NFTUFQSE9SRQorICAgIC8qIElmIHRoZXJlIGlzIGEgc2VtYXBob3JlLCBpbmRpY2F0ZSB0aGF0IGl0IGlzIGluIHVzZS4gKi8KKyAgICBpZiAoIHQtPnNlbWFwaG9yZSApCisgICAgeworICAgICAgICArK3QtPnNlbWFwaG9yZS0+YXN5bmNjbnQ7CisgICAgICAgIGlmICggREVCVUdfRVhFQ0NNRCApCisgICAgICAgICAgICBwcmludGYoICJTRU06ICVzIG5vdyB1c2VkIGJ5ICVzXG4iLCBvYmplY3Rfc3RyKCB0LT5zZW1hcGhvcmUtPm5hbWUKKyAgICAgICAgICAgICAgICApLCBvYmplY3Rfc3RyKCB0LT5uYW1lICkgKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFByb2NlZWQgdG8gTUFLRTFDIHRvIGJlZ2luIGV4ZWN1dGluZyB0aGUgY2hhaW4gb2YgY29tbWFuZHMgcHJlcGFyZWQgZm9yCisgICAgICogYnVpbGRpbmcgdGhlIHRhcmdldC4gSWYgd2UgYXJlIG5vdCBnb2luZyB0byBidWlsZCB0aGUgdGFyZ2V0IChlLmcuIGR1ZSB0bworICAgICAqIGRlcGVuZGVuY3kgZmFpbHVyZXMgb3Igbm8gY29tbWFuZHMgbmVlZGluZyB0byBiZSBydW4pIHRoZSBjaGFpbiB3aWxsIGJlCisgICAgICogZW1wdHkgYW5kIE1BS0UxQyBwcm9jZXNzaW5nIHdpbGwgZGlyZWN0bHkgc2lnbmFsIHRoZSB0YXJnZXQncyBjb21wbGV0aW9uLgorICAgICAqLworICAgIC8qIEltcGxlbWVudGF0aW9uIG5vdGU6CisgICAgICogICBNb3JmaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9uIHRoZSBzdGFjayBpbnN0ZWFkIG9mIHBvcHBpbmcgaXQgYW5kCisgICAgICogcHVzaGluZyBhIG5ldyBvbmUgaXMgYSBzbGlnaHQgb3B0aW1pemF0aW9uIHdpdGggbm8gc2lkZS1lZmZlY3RzIHNpbmNlIHdlCisgICAgICogcHVzaGVkIG5vIG90aGVyIHN0YXRlcyB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgb25lLgorICAgICAqLworICAgIHBTdGF0ZS0+Y3Vyc3RhdGUgPSBUX1NUQVRFX01BS0UxQzsKK30KKworCisvKgorICogbWFrZTFjKCkgLSBsYXVuY2ggdGFyZ2V0J3MgbmV4dCBjb21tYW5kLCBvciBnbyB0byBwYXJlbnRzJyBNQUtFMUIgaWYgbm9uZQorICoKKyAqIElmIHRoZXJlIGFyZSAobW9yZSkgY29tbWFuZHMgdG8gcnVuIHRvIGJ1aWxkIHRoaXMgdGFyZ2V0IChhbmQgd2UgaGF2ZSBub3QgaGl0CisgKiBhbiBlcnJvciBydW5uaW5nIGVhcmxpZXIgY29tYW5kcykgd2UgbGF1bmNoIHRoZSBjb21tYW5kIHVzaW5nIGV4ZWNfY21kKCkuCisgKiBDb21tYW5kIGV4ZWN1dGlvbiBzaWduYWxzIGl0cyBjb21wbGV0aW9uIGluIGV4ZWNfd2FpdCgpIGJ5IGNhbGxpbmcgb3VyCisgKiBtYWtlMWNfY2xvc3VyZSgpIGNhbGxiYWNrLgorICoKKyAqIElmIHRoZXJlIGFyZSBubyBtb3JlIGNvbW1hbmRzIHRvIHJ1biwgd2UgY29sbGVjdCB0aGUgc3RhdHVzIGZyb20gYWxsIHRoZQorICogYWN0aW9ucyBhbmQgcmVwb3J0IG91ciBjb21wbGV0aW9uIHRvIGFsbCB0aGUgcGFyZW50cy4KKyAqLworCitzdGF0aWMgdm9pZCBtYWtlMWMoIHN0YXRlIGNvbnN0ICogY29uc3QgcFN0YXRlICkKK3sKKyAgICBUQVJHRVQgKiBjb25zdCB0ID0gcFN0YXRlLT50OworICAgIENNRCAqIGNvbnN0IGNtZCA9IChDTUQgKil0LT5jbWRzOworCisgICAgaWYgKCBjbWQgJiYgdC0+c3RhdHVzID09IEVYRUNfQ01EX09LICkKKyAgICB7CisgICAgICAgIC8qIFBvcCBzdGF0ZSBmaXJzdCBpbiBjYXNlIHNvbWV0aGluZyBiZWxvdyAoZS5nLiBleGVjX2NtZCgpLCBleGVjX3dhaXQoKQorICAgICAgICAgKiBvciBtYWtlMWNfY2xvc3VyZSgpKSBwdXNoZXMgYSBuZXcgc3RhdGUuIE5vdGUgdGhhdCB3ZSBtdXN0IG5vdCBhY2Nlc3MKKyAgICAgICAgICogdGhlIHBvcHBlZCBzdGF0ZSBkYXRhIGFmdGVyIHRoaXMgYXMgdGhlIHNhbWUgc3RhY2sgbm9kZSBtaWdodCBoYXZlCisgICAgICAgICAqIGJlZW4gcmV1c2VkIGludGVybmFsbHkgZm9yIHNvbWUgbmV3bHkgcHVzaGVkIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcG9wX3N0YXRlKCAmc3RhdGVfc3RhY2sgKTsKKworICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIGpvYnMgcnVubmluZyBjb3VudGVyLiAqLworICAgICAgICArK2NtZHNydW5uaW5nOworCisgICAgICAgIC8qIEV4ZWN1dGUgdGhlIGFjdHVhbCBidWlsZCBjb21tYW5kIG9yIGZha2UgaXQgaWYgbm8tb3AuICovCisgICAgICAgIGlmICggZ2xvYnMubm9leGVjIHx8IGNtZC0+bm9vcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpbWluZ19pbmZvIHRpbWVfaW5mbyA9IHsgMCB9OworICAgICAgICAgICAgdGltZXN0YW1wX2N1cnJlbnQoICZ0aW1lX2luZm8uc3RhcnQgKTsKKyAgICAgICAgICAgIHRpbWVzdGFtcF9jb3B5KCAmdGltZV9pbmZvLmVuZCwgJnRpbWVfaW5mby5zdGFydCApOworICAgICAgICAgICAgbWFrZTFjX2Nsb3N1cmUoIHQsIEVYRUNfQ01EX09LLCAmdGltZV9pbmZvLCAiIiwgIiIsIEVYSVRfT0sgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWNfY21kKCBjbWQtPmJ1ZiwgbWFrZTFjX2Nsb3N1cmUsIHQsIGNtZC0+c2hlbGwgKTsKKworICAgICAgICAgICAgLyogV2FpdCB1bnRpbCB1bmRlciB0aGUgY29uY3VycmVudCBjb21tYW5kIGNvdW50IGxpbWl0LiAqLworICAgICAgICAgICAgLyogRklYTUU6IFRoaXMgd2FpdCBjb3VsZCBiZSBza2lwcGVkIGhlcmUgYW5kIG1vdmVkIHRvIGp1c3QgYmVmb3JlCisgICAgICAgICAgICAgKiB0cnlpbmcgdG8gZXhlY3V0ZSBhIGNvbW1hbmQgdGhhdCB3b3VsZCBjcm9zcyB0aGUgY29tbWFuZCBjb3VudAorICAgICAgICAgICAgICogbGltaXQuIE5vdGUgdGhvdWdoIHRoYXQgdGhpcyBtaWdodCBhZmZlY3QgdGhlIG9yZGVyIGluIHdoaWNoCisgICAgICAgICAgICAgKiB1bnJlbGF0ZWQgdGFyZ2V0cyBnZXQgYnVpbHQgYW5kIHdvdWxkIHRodXMgcmVxdWlyZSB0aGF0IGFsbAorICAgICAgICAgICAgICogYWZmZWN0ZWQgQm9vc3QgQnVpbGQgdGVzdHMgYmUgdXBkYXRlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXNzZXJ0KCAwIDwgZ2xvYnMuam9icyApOworICAgICAgICAgICAgYXNzZXJ0KCBnbG9icy5qb2JzIDw9IE1BWEpPQlMgKTsKKyAgICAgICAgICAgIHdoaWxlICggY21kc3J1bm5pbmcgPj0gZ2xvYnMuam9icyApCisgICAgICAgICAgICAgICAgZXhlY193YWl0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQUNUSU9OUyAqIGFjdGlvbnM7CisKKyAgICAgICAgLyogQ29sbGVjdCBzdGF0dXMgZnJvbSBhY3Rpb25zLCBhbmQgZGlzdHJpYnV0ZSBpdCBhcyB3ZWxsLiAqLworICAgICAgICBmb3IgKCBhY3Rpb25zID0gdC0+YWN0aW9uczsgYWN0aW9uczsgYWN0aW9ucyA9IGFjdGlvbnMtPm5leHQgKQorICAgICAgICAgICAgaWYgKCBhY3Rpb25zLT5hY3Rpb24tPnN0YXR1cyA+IHQtPnN0YXR1cyApCisgICAgICAgICAgICAgICAgdC0+c3RhdHVzID0gYWN0aW9ucy0+YWN0aW9uLT5zdGF0dXM7CisgICAgICAgIGZvciAoIGFjdGlvbnMgPSB0LT5hY3Rpb25zOyBhY3Rpb25zOyBhY3Rpb25zID0gYWN0aW9ucy0+bmV4dCApCisgICAgICAgICAgICBpZiAoIHQtPnN0YXR1cyA+IGFjdGlvbnMtPmFjdGlvbi0+c3RhdHVzICkKKyAgICAgICAgICAgICAgICBhY3Rpb25zLT5hY3Rpb24tPnN0YXR1cyA9IHQtPnN0YXR1czsKKworICAgICAgICAvKiBUYWxseSBzdWNjZXNzL2ZhaWx1cmUgZm9yIHRob3NlIHdlIHRyaWVkIHRvIHVwZGF0ZS4gKi8KKyAgICAgICAgaWYgKCB0LT5wcm9ncmVzcyA9PSBUX01BS0VfUlVOTklORyApCisgICAgICAgICAgICBzd2l0Y2ggKCB0LT5zdGF0dXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRVhFQ19DTURfT0s6ICsrY291bnRzLT5tYWRlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVYRUNfQ01EX0ZBSUw6ICsrY291bnRzLT5mYWlsZWQ7IGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIC8qIFRlbGwgcGFyZW50cyB0aGVpciBkZXBlbmRlbmN5IGhhcyBiZWVuIGJ1aWx0LiAqLworICAgICAgICB7CisgICAgICAgICAgICBUQVJHRVRTICogYzsKKyAgICAgICAgICAgIHN0YWNrIHRlbXBfc3RhY2sgPSB7IE5VTEwgfTsKKyAgICAgICAgICAgIFRBUkdFVCAqIGFkZGl0aW9uYWxfaW5jbHVkZXMgPSBOVUxMOworCisgICAgICAgICAgICB0LT5wcm9ncmVzcyA9IGdsb2JzLm5vZXhlYyA/IFRfTUFLRV9OT0VYRUNfRE9ORSA6IFRfTUFLRV9ET05FOworCisgICAgICAgICAgICAvKiBUYXJnZXQgaGFzIGJlZW4gdXBkYXRlZCBzbyByZXNjYW4gaXQgZm9yIGRlcGVuZGVuY2llcy4gKi8KKyAgICAgICAgICAgIGlmICggdC0+ZmF0ZSA+PSBUX0ZBVEVfTUlTU0lORyAmJiB0LT5zdGF0dXMgPT0gRVhFQ19DTURfT0sgJiYKKyAgICAgICAgICAgICAgICAhKCB0LT5mbGFncyAmIFRfRkxBR19JTlRFUk5BTCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQVJHRVQgKiBzYXZlZF9pbmNsdWRlczsKKyAgICAgICAgICAgICAgICBTRVRUSU5HUyAqIHM7CisKKyAgICAgICAgICAgICAgICB0LT5yZXNjYW5uZWQgPSAxOworCisgICAgICAgICAgICAgICAgLyogQ2xlYW4gY3VycmVudCBpbmNsdWRlcy4gKi8KKyAgICAgICAgICAgICAgICBzYXZlZF9pbmNsdWRlcyA9IHQtPmluY2x1ZGVzOworICAgICAgICAgICAgICAgIHQtPmluY2x1ZGVzID0gMDsKKworICAgICAgICAgICAgICAgIHMgPSBjb3B5c2V0dGluZ3MoIHQtPnNldHRpbmdzICk7CisgICAgICAgICAgICAgICAgcHVzaHNldHRpbmdzKCByb290X21vZHVsZSgpLCBzICk7CisgICAgICAgICAgICAgICAgaGVhZGVycyggdCApOworICAgICAgICAgICAgICAgIHBvcHNldHRpbmdzKCByb290X21vZHVsZSgpLCBzICk7CisgICAgICAgICAgICAgICAgZnJlZXNldHRpbmdzKCBzICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIHQtPmluY2x1ZGVzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRyaWNreS4gVGhlIHBhcmVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLCBidXQgdGhleQorICAgICAgICAgICAgICAgICAgICAgKiBoYXZlIG5vdCBzZWVuIHRoZSBpbnRlcm5hbCBub2RlLCBiZWNhdXNlIGl0IHdhcyBqdXN0CisgICAgICAgICAgICAgICAgICAgICAqIGNyZWF0ZWQuIFdlIG5lZWQgdG86CisgICAgICAgICAgICAgICAgICAgICAqICAtIHB1c2ggTUFLRTFBIHN0YXRlcyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBwdXNoZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAqICAgIHBhcmVudHMgaGVyZQorICAgICAgICAgICAgICAgICAgICAgKiAgLSBtYWtlIHN1cmUgYWxsIHVucHJvY2Vzc2VkIHBhcmVudHMgd2lsbCBwaWNrIHVwIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiAgICBuZXcgaW5jbHVkZXMKKyAgICAgICAgICAgICAgICAgICAgICogIC0gbWFrZSBzdXJlIHByb2Nlc3NpbmcgdGhlIGFkZGl0aW9uYWwgTUFLRTFBIHN0YXRlcyBpcworICAgICAgICAgICAgICAgICAgICAgKiAgICBkb25lIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBNQUtFMUIgc3RhdGUgZm9yIG91cgorICAgICAgICAgICAgICAgICAgICAgKiAgICBjdXJyZW50IHRhcmdldCAod2hpY2ggd291bGQgbWVhbiB0aGlzIHRhcmdldCBoYXMKKyAgICAgICAgICAgICAgICAgICAgICogICAgYWxyZWFkeSBiZWVuIGJ1aWx0KSwgb3RoZXJ3aXNlIHRoZSBwYXJlbnQgd291bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICogICAgY29uc2lkZXJlZCBidWlsdCBiZWZvcmUgdGhlIGFkZGl0aW9uYWwgTUFLRTFBIHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAqICAgIHByb2Nlc3NpbmcgZXZlbiBnb3QgYSBjaGFuY2UgdG8gc3RhcnQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBtYWtlMCggdC0+aW5jbHVkZXMsIHQtPnBhcmVudHMtPnRhcmdldCwgMCwgMCwgMCwgdC0+aW5jbHVkZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIC8qIExpbmsgdGhlIG9sZCBpbmNsdWRlcyBvbiB0byBtYWtlIHN1cmUgdGhhdCBpdCBnZXRzCisgICAgICAgICAgICAgICAgICAgICAqIGNsZWFuZWQgdXAgY29ycmVjdGx5LgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgdC0+aW5jbHVkZXMtPmluY2x1ZGVzID0gc2F2ZWRfaW5jbHVkZXM7CisgICAgICAgICAgICAgICAgICAgIGZvciAoIGMgPSB0LT5kZXBlbmRhbnRzOyBjOyBjID0gYy0+bmV4dCApCisgICAgICAgICAgICAgICAgICAgICAgICBjLT50YXJnZXQtPmRlcGVuZHMgPSB0YXJnZXRlbnRyeSggYy0+dGFyZ2V0LT5kZXBlbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPmluY2x1ZGVzICk7CisgICAgICAgICAgICAgICAgICAgIC8qIFdpbGwgYmUgcHJvY2Vzc2VkIGJlbG93LiAqLworICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsX2luY2x1ZGVzID0gdC0+aW5jbHVkZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQtPmluY2x1ZGVzID0gc2F2ZWRfaW5jbHVkZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGFkZGl0aW9uYWxfaW5jbHVkZXMgKQorICAgICAgICAgICAgICAgIGZvciAoIGMgPSB0LT5wYXJlbnRzOyBjOyBjID0gYy0+bmV4dCApCisgICAgICAgICAgICAgICAgICAgIHB1c2hfc3RhdGUoICZ0ZW1wX3N0YWNrLCBhZGRpdGlvbmFsX2luY2x1ZGVzLCBjLT50YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBUX1NUQVRFX01BS0UxQSApOworCisgICAgICAgICAgICBpZiAoIHQtPnNjY19yb290ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQVJHRVQgKiBjb25zdCBzY2Nfcm9vdCA9IHRhcmdldF9zY2MoIHQgKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHNjY19yb290LT5wcm9ncmVzcyA8IFRfTUFLRV9ET05FICk7CisgICAgICAgICAgICAgICAgZm9yICggYyA9IHQtPnBhcmVudHM7IGM7IGMgPSBjLT5uZXh0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggdGFyZ2V0X3NjYyggYy0+dGFyZ2V0ICkgPT0gc2NjX3Jvb3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF9zdGF0ZSggJnRlbXBfc3RhY2ssIGMtPnRhcmdldCwgTlVMTCwgVF9TVEFURV9NQUtFMUIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzY2Nfcm9vdC0+cGFyZW50cyA9IHRhcmdldGVudHJ5KCBzY2Nfcm9vdC0+cGFyZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT50YXJnZXQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICggYyA9IHQtPnBhcmVudHM7IGM7IGMgPSBjLT5uZXh0ICkKKyAgICAgICAgICAgICAgICAgICAgcHVzaF9zdGF0ZSggJnRlbXBfc3RhY2ssIGMtPnRhcmdldCwgTlVMTCwgVF9TVEFURV9NQUtFMUIgKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIE9QVF9TRU1BUEhPUkUKKyAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgc2VtYXBob3JlLCBpdCBpcyBub3cgZnJlZS4gKi8KKyAgICAgICAgICAgIGlmICggdC0+c2VtYXBob3JlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHQtPnNlbWFwaG9yZS0+YXN5bmNjbnQgPT0gMSApOworICAgICAgICAgICAgICAgIC0tdC0+c2VtYXBob3JlLT5hc3luY2NudDsKKworICAgICAgICAgICAgICAgIGlmICggREVCVUdfRVhFQ0NNRCApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZiggIlNFTTogJXMgaXMgbm93IGZyZWVcbiIsIG9iamVjdF9zdHIoCisgICAgICAgICAgICAgICAgICAgICAgICB0LT5zZW1hcGhvcmUtPm5hbWUgKSApOworCisgICAgICAgICAgICAgICAgLyogSWYgYW55dGhpbmcgaXMgd2FpdGluZywgbm90aWZ5IHRoZSBuZXh0IHRhcmdldC4gVGhlcmUgaXMgbm8KKyAgICAgICAgICAgICAgICAgKiBwb2ludCBpbiBub3RpZnlpbmcgYWxsIHdhaXRpbmcgdGFyZ2V0cywgc2luY2UgdGhleSB3aWxsIGJlCisgICAgICAgICAgICAgICAgICogbm90aWZpZWQgYWdhaW4uCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCB0LT5zZW1hcGhvcmUtPnBhcmVudHMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVEFSR0VUUyAqIGZpcnN0ID0gdC0+c2VtYXBob3JlLT5wYXJlbnRzOworICAgICAgICAgICAgICAgICAgICB0LT5zZW1hcGhvcmUtPnBhcmVudHMgPSBmaXJzdC0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBmaXJzdC0+bmV4dCApCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdC0+bmV4dC0+dGFpbCA9IGZpcnN0LT50YWlsOworCisgICAgICAgICAgICAgICAgICAgIGlmICggREVCVUdfRVhFQ0NNRCApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoICJTRU06IHBsYWNpbmcgJXMgb24gc3RhY2tcbiIsIG9iamVjdF9zdHIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QtPnRhcmdldC0+bmFtZSApICk7CisgICAgICAgICAgICAgICAgICAgIHB1c2hfc3RhdGUoICZ0ZW1wX3N0YWNrLCBmaXJzdC0+dGFyZ2V0LCBOVUxMLCBUX1NUQVRFX01BS0UxQgorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgQkpBTV9GUkVFKCBmaXJzdCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAvKiBNdXN0IHBvcCBzdGF0ZSBiZWZvcmUgcHVzaGluZyBhbnkgbW9yZS4gKi8KKyAgICAgICAgICAgIHBvcF9zdGF0ZSggJnN0YXRlX3N0YWNrICk7CisKKyAgICAgICAgICAgIC8qIFVzaW5nIHN0YWNrcyByZXZlcnNlcyB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uLiBSZXZlcnNlIGl0IGJhY2suICovCisgICAgICAgICAgICBwdXNoX3N0YWNrX29uX3N0YWNrKCAmc3RhdGVfc3RhY2ssICZ0ZW1wX3N0YWNrICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoKKyAqIGNhbGxfdGltaW5nX3J1bGUoKSAtIExvb2sgdXAgdGhlIF9fVElNSU5HX1JVTEVfXyB2YXJpYWJsZSBvbiB0aGUgZ2l2ZW4KKyAqIHRhcmdldCwgYW5kIGlmIG5vbi1lbXB0eSwgaW52b2tlIHRoZSBydWxlIGl0IG5hbWVzLCBwYXNzaW5nIHRoZSBnaXZlbgorICogdGltaW5nX2luZm8uCisgKi8KKworc3RhdGljIHZvaWQgY2FsbF90aW1pbmdfcnVsZSggVEFSR0VUICogdGFyZ2V0LCB0aW1pbmdfaW5mbyBjb25zdCAqIGNvbnN0IHRpbWUgKQoreworICAgIExJU1QgKiB0aW1pbmdfcnVsZTsKKworICAgIHB1c2hzZXR0aW5ncyggcm9vdF9tb2R1bGUoKSwgdGFyZ2V0LT5zZXR0aW5ncyApOworICAgIHRpbWluZ19ydWxlID0gdmFyX2dldCggcm9vdF9tb2R1bGUoKSwgY29uc3RhbnRfVElNSU5HX1JVTEUgKTsKKyAgICBwb3BzZXR0aW5ncyggcm9vdF9tb2R1bGUoKSwgdGFyZ2V0LT5zZXR0aW5ncyApOworCisgICAgaWYgKCAhbGlzdF9lbXB0eSggdGltaW5nX3J1bGUgKSApCisgICAgeworICAgICAgICAvKiBydWxlIHRpbWluZy1ydWxlICggYXJncyAqIDogdGFyZ2V0IDogc3RhcnQgZW5kIHVzZXIgc3lzdGVtICkgKi8KKworICAgICAgICAvKiBQcmVwYXJlIHRoZSBhcmd1bWVudCBsaXN0LiAqLworICAgICAgICBGUkFNRSBmcmFtZVsgMSBdOworICAgICAgICBPQkpFQ1QgKiBydWxlbmFtZSA9IGxpc3RfZnJvbnQoIHRpbWluZ19ydWxlICk7CisgICAgICAgIGZyYW1lX2luaXQoIGZyYW1lICk7CisKKyAgICAgICAgLyogYXJncyAqIDo6ICQoX19USU1JTkdfUlVMRV9fWzItXSkgKi8KKyAgICAgICAgbG9sX2FkZCggZnJhbWUtPmFyZ3MsIGxpc3RfY29weV9yYW5nZSggdGltaW5nX3J1bGUsIGxpc3RfbmV4dCgKKyAgICAgICAgICAgIGxpc3RfYmVnaW4oIHRpbWluZ19ydWxlICkgKSwgbGlzdF9lbmQoIHRpbWluZ19ydWxlICkgKSApOworCisgICAgICAgIC8qIHRhcmdldCA6OiB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0ICovCisgICAgICAgIGxvbF9hZGQoIGZyYW1lLT5hcmdzLCBsaXN0X25ldyggb2JqZWN0X2NvcHkoIHRhcmdldC0+bmFtZSApICkgKTsKKworICAgICAgICAvKiBzdGFydCBlbmQgdXNlciBzeXN0ZW0gOjogaW5mbyBhYm91dCB0aGUgYWN0aW9uIGNvbW1hbmQgKi8KKyAgICAgICAgbG9sX2FkZCggZnJhbWUtPmFyZ3MsIGxpc3RfcHVzaF9iYWNrKCBsaXN0X3B1c2hfYmFjayggbGlzdF9wdXNoX2JhY2soIGxpc3RfbmV3KAorICAgICAgICAgICAgb3V0Zl90aW1lKCAmdGltZS0+c3RhcnQgKSApLAorICAgICAgICAgICAgb3V0Zl90aW1lKCAmdGltZS0+ZW5kICkgKSwKKyAgICAgICAgICAgIG91dGZfZG91YmxlKCB0aW1lLT51c2VyICkgKSwKKyAgICAgICAgICAgIG91dGZfZG91YmxlKCB0aW1lLT5zeXN0ZW0gKSApICk7CisKKyAgICAgICAgLyogQ2FsbCB0aGUgcnVsZS4gKi8KKyAgICAgICAgZXZhbHVhdGVfcnVsZSggYmluZHJ1bGUoIHJ1bGVuYW1lICwgcm9vdF9tb2R1bGUoKSApLCBydWxlbmFtZSwgZnJhbWUgKTsKKworICAgICAgICAvKiBDbGVhbiB1cC4gKi8KKyAgICAgICAgZnJhbWVfZnJlZSggZnJhbWUgKTsKKyAgICB9Cit9CisKKworLyoKKyAqIGNhbGxfYWN0aW9uX3J1bGUoKSAtIExvb2sgdXAgdGhlIF9fQUNUSU9OX1JVTEVfXyB2YXJpYWJsZSBvbiB0aGUgZ2l2ZW4KKyAqIHRhcmdldCwgYW5kIGlmIG5vbi1lbXB0eSwgaW52b2tlIHRoZSBydWxlIGl0IG5hbWVzLCBwYXNzaW5nIHRoZSBnaXZlbiBpbmZvLAorICogdGltaW5nX2luZm8sIGV4ZWN1dGVkIGNvbW1hbmQgYW5kIGNvbW1hbmQgb3V0cHV0LgorICovCisKK3N0YXRpYyB2b2lkIGNhbGxfYWN0aW9uX3J1bGUKKygKKyAgICBUQVJHRVQgKiB0YXJnZXQsCisgICAgaW50IHN0YXR1cywKKyAgICB0aW1pbmdfaW5mbyBjb25zdCAqIHRpbWUsCisgICAgY2hhciBjb25zdCAqIGV4ZWN1dGVkX2NvbW1hbmQsCisgICAgY2hhciBjb25zdCAqIGNvbW1hbmRfb3V0cHV0CispCit7CisgICAgTElTVCAqIGFjdGlvbl9ydWxlOworCisgICAgcHVzaHNldHRpbmdzKCByb290X21vZHVsZSgpLCB0YXJnZXQtPnNldHRpbmdzICk7CisgICAgYWN0aW9uX3J1bGUgPSB2YXJfZ2V0KCByb290X21vZHVsZSgpLCBjb25zdGFudF9BQ1RJT05fUlVMRSApOworICAgIHBvcHNldHRpbmdzKCByb290X21vZHVsZSgpLCB0YXJnZXQtPnNldHRpbmdzICk7CisKKyAgICBpZiAoICFsaXN0X2VtcHR5KCBhY3Rpb25fcnVsZSApICkKKyAgICB7CisgICAgICAgIC8qIHJ1bGUgYWN0aW9uLXJ1bGUgKAorICAgICAgICAgICAgYXJncyAqIDoKKyAgICAgICAgICAgIHRhcmdldCA6CisgICAgICAgICAgICBjb21tYW5kIHN0YXR1cyBzdGFydCBlbmQgdXNlciBzeXN0ZW0gOgorICAgICAgICAgICAgb3V0cHV0ID8gKSAqLworCisgICAgICAgIC8qIFByZXBhcmUgdGhlIGFyZ3VtZW50IGxpc3QuICovCisgICAgICAgIEZSQU1FIGZyYW1lWyAxIF07CisgICAgICAgIE9CSkVDVCAqIHJ1bGVuYW1lID0gbGlzdF9mcm9udCggYWN0aW9uX3J1bGUgKTsKKyAgICAgICAgZnJhbWVfaW5pdCggZnJhbWUgKTsKKworICAgICAgICAvKiBhcmdzICogOjogJChfX0FDVElPTl9SVUxFX19bMi1dKSAqLworICAgICAgICBsb2xfYWRkKCBmcmFtZS0+YXJncywgbGlzdF9jb3B5X3JhbmdlKCBhY3Rpb25fcnVsZSwgbGlzdF9uZXh0KAorICAgICAgICAgICAgbGlzdF9iZWdpbiggYWN0aW9uX3J1bGUgKSApLCBsaXN0X2VuZCggYWN0aW9uX3J1bGUgKSApICk7CisKKyAgICAgICAgLyogdGFyZ2V0IDo6IHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgKi8KKyAgICAgICAgbG9sX2FkZCggZnJhbWUtPmFyZ3MsIGxpc3RfbmV3KCBvYmplY3RfY29weSggdGFyZ2V0LT5uYW1lICkgKSApOworCisgICAgICAgIC8qIGNvbW1hbmQgc3RhdHVzIHN0YXJ0IGVuZCB1c2VyIHN5c3RlbSA6OiBpbmZvIGFib3V0IHRoZSBhY3Rpb24gY29tbWFuZAorICAgICAgICAgKi8KKyAgICAgICAgbG9sX2FkZCggZnJhbWUtPmFyZ3MsCisgICAgICAgICAgICBsaXN0X3B1c2hfYmFjayggbGlzdF9wdXNoX2JhY2soIGxpc3RfcHVzaF9iYWNrKCBsaXN0X3B1c2hfYmFjayggbGlzdF9wdXNoX2JhY2soIGxpc3RfbmV3KAorICAgICAgICAgICAgICAgIG9iamVjdF9uZXcoIGV4ZWN1dGVkX2NvbW1hbmQgKSApLAorICAgICAgICAgICAgICAgIG91dGZfaW50KCBzdGF0dXMgKSApLAorICAgICAgICAgICAgICAgIG91dGZfdGltZSggJnRpbWUtPnN0YXJ0ICkgKSwKKyAgICAgICAgICAgICAgICBvdXRmX3RpbWUoICZ0aW1lLT5lbmQgKSApLAorICAgICAgICAgICAgICAgIG91dGZfZG91YmxlKCB0aW1lLT51c2VyICkgKSwKKyAgICAgICAgICAgICAgICBvdXRmX2RvdWJsZSggdGltZS0+c3lzdGVtICkgKSApOworCisgICAgICAgIC8qIG91dHB1dCA/IDo6IHRoZSBvdXRwdXQgb2YgdGhlIGFjdGlvbiBjb21tYW5kICovCisgICAgICAgIGlmICggY29tbWFuZF9vdXRwdXQgKQorICAgICAgICAgICAgbG9sX2FkZCggZnJhbWUtPmFyZ3MsIGxpc3RfbmV3KCBvYmplY3RfbmV3KCBjb21tYW5kX291dHB1dCApICkgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG9sX2FkZCggZnJhbWUtPmFyZ3MsIEwwICk7CisKKyAgICAgICAgLyogQ2FsbCB0aGUgcnVsZS4gKi8KKyAgICAgICAgZXZhbHVhdGVfcnVsZSggYmluZHJ1bGUoIHJ1bGVuYW1lLCByb290X21vZHVsZSgpICksIHJ1bGVuYW1lLCBmcmFtZSApOworCisgICAgICAgIC8qIENsZWFuIHVwLiAqLworICAgICAgICBmcmFtZV9mcmVlKCBmcmFtZSApOworICAgIH0KK30KKworCisvKgorICogbWFrZTFjX2Nsb3N1cmUoKSAtIGhhbmRsZSBjb21tYW5kIGV4ZWN1dGlvbiBjb21wbGV0aW9uIGFuZCBnbyB0byBNQUtFMUMuCisgKgorICogSW50ZXJuYWwgZnVuY3Rpb24gcGFzc2VkIGFzIGEgbm90aWZpY2F0aW9uIGNhbGxiYWNrIGZvciB3aGVuIGEgY29tbWFuZAorICogZmluaXNoZXMgZ2V0dGluZyBleGVjdXRlZCBieSB0aGUgT1Mgb3IgY2FsbGVkIGRpcmVjdGx5IHdoZW4gZmFraW5nIHRoYXQgYQorICogY29tbWFuZCBoYWQgYmVlbiBleGVjdXRlZCBieSB0aGUgT1MuCisgKgorICogTm93IGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGZpZGRsZSB3aXRoIHRoZSBjb21tYW5kIGV4aXQgc3RhdHVzIGFuZCBwdXNoIGEgbmV3CisgKiBNQUtFMUMgc3RhdGUgdG8gZXhlY3V0ZSB0aGUgbmV4dCBjb21tYW5kIHNjaGVkdWxlZCBmb3IgYnVpbGRpbmcgdGhpcyB0YXJnZXQKKyAqIG9yIGNsb3NlIHVwIHRoZSB0YXJnZXQncyBidWlsZCBwcm9jZXNzIGluIGNhc2UgdGhlcmUgYXJlIG5vIG1vcmUgY29tbWFuZHMKKyAqIHNjaGVkdWxlZCBmb3IgaXQuIE9uIGludGVycnVwdHMsIHdlIGJhaWwgaGVhdmlseS4KKyAqLworCitzdGF0aWMgdm9pZCBtYWtlMWNfY2xvc3VyZQorKAorICAgIHZvaWQgKiBjb25zdCBjbG9zdXJlLAorICAgIGludCBzdGF0dXNfb3JpZywKKyAgICB0aW1pbmdfaW5mbyBjb25zdCAqIGNvbnN0IHRpbWUsCisgICAgY2hhciBjb25zdCAqIGNvbnN0IGNtZF9zdGRvdXQsCisgICAgY2hhciBjb25zdCAqIGNvbnN0IGNtZF9zdGRlcnIsCisgICAgaW50IGNvbnN0IGNtZF9leGl0X3JlYXNvbgorKQoreworICAgIFRBUkdFVCAqIGNvbnN0IHQgPSAoVEFSR0VUICopY2xvc3VyZTsKKyAgICBDTUQgKiBjb25zdCBjbWQgPSAoQ01EICopdC0+Y21kczsKKyAgICBjaGFyIGNvbnN0ICogcnVsZV9uYW1lID0gMDsKKyAgICBjaGFyIGNvbnN0ICogdGFyZ2V0X25hbWUgPSAwOworCisgICAgYXNzZXJ0KCBjbWQgKTsKKworICAgIC0tY21kc3J1bm5pbmc7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHRhcmdldCdzIHN0YXR1cyBmcm9tIHRoZSBjbWQgZXhlY3V0aW9uIHJlc3VsdC4gKi8KKyAgICB7CisgICAgICAgIC8qIFN0b3JlIHRoZSB0YXJnZXQncyBzdGF0dXMuICovCisgICAgICAgIHQtPnN0YXR1cyA9IHN0YXR1c19vcmlnOworCisgICAgICAgIC8qIEludmVydCBPSy9GQUlMIHRhcmdldCBzdGF0dXMgd2hlbiBGQUlMX0VYUEVDVEVEIGhhcyBiZWVuIGFwcGxpZWQuICovCisgICAgICAgIGlmICggdC0+ZmxhZ3MgJiBUX0ZMQUdfRkFJTF9FWFBFQ1RFRCAmJiAhZ2xvYnMubm9leGVjICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICggdC0+c3RhdHVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVYRUNfQ01EX0ZBSUw6IHQtPnN0YXR1cyA9IEVYRUNfQ01EX09LOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVYRUNfQ01EX09LOiB0LT5zdGF0dXMgPSBFWEVDX0NNRF9GQUlMOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElnbm9yZSBmYWlsdXJlcyBmb3IgYWN0aW9ucyBtYXJrZWQgYXMgJ2lnbm9yZScuICovCisgICAgICAgIGlmICggdC0+c3RhdHVzID09IEVYRUNfQ01EX0ZBSUwgJiYgY21kLT5ydWxlLT5hY3Rpb25zLT5mbGFncyAmCisgICAgICAgICAgICBSVUxFX0lHTk9SRSApCisgICAgICAgICAgICB0LT5zdGF0dXMgPSBFWEVDX0NNRF9PSzsKKyAgICB9CisKKyAgICBpZiAoIERFQlVHX01BS0VRIHx8CisgICAgICAgICggREVCVUdfTUFLRSAmJiAhKCBjbWQtPnJ1bGUtPmFjdGlvbnMtPmZsYWdzICYgUlVMRV9RVUlFVExZICkgKSApCisgICAgeworICAgICAgICBydWxlX25hbWUgPSBvYmplY3Rfc3RyKCBjbWQtPnJ1bGUtPm5hbWUgKTsKKyAgICAgICAgdGFyZ2V0X25hbWUgPSBvYmplY3Rfc3RyKCBsaXN0X2Zyb250KCBsb2xfZ2V0KCAoTE9MICopJmNtZC0+YXJncywgMCApICkKKyAgICAgICAgICAgICk7CisgICAgfQorCisgICAgb3V0X2FjdGlvbiggcnVsZV9uYW1lLCB0YXJnZXRfbmFtZSwgY21kLT5idWYtPnZhbHVlLCBjbWRfc3Rkb3V0LCBjbWRfc3RkZXJyLAorICAgICAgICBjbWRfZXhpdF9yZWFzb24gKTsKKworICAgIGlmICggIWdsb2JzLm5vZXhlYyApCisgICAgeworICAgICAgICBjYWxsX3RpbWluZ19ydWxlKCB0LCB0aW1lICk7CisgICAgICAgIGlmICggREVCVUdfRVhFQ0NNRCApCisgICAgICAgICAgICBwcmludGYoICIlZiBzZWMgc3lzdGVtOyAlZiBzZWMgdXNlclxuIiwgdGltZS0+c3lzdGVtLCB0aW1lLT51c2VyICk7CisKKyAgICAgICAgLyogQXNzdW1lIC1wMCBpcyBpbiBlZmZlY3QsIGkuZS4gY21kX3N0ZG91dCBjb250YWlucyBtZXJnZWQgb3V0cHV0LiAqLworICAgICAgICBjYWxsX2FjdGlvbl9ydWxlKCB0LCBzdGF0dXNfb3JpZywgdGltZSwgY21kLT5idWYtPnZhbHVlLCBjbWRfc3Rkb3V0ICk7CisgICAgfQorCisgICAgLyogUHJpbnQgY29tbWFuZCB0ZXh0IG9uIGZhaWx1cmUuICovCisgICAgaWYgKCB0LT5zdGF0dXMgPT0gRVhFQ19DTURfRkFJTCAmJiBERUJVR19NQUtFICkKKyAgICB7CisgICAgICAgIGlmICggIURFQlVHX0VYRUMgKQorICAgICAgICAgICAgcHJpbnRmKCAiJXNcbiIsIGNtZC0+YnVmLT52YWx1ZSApOworCisgICAgICAgIHByaW50ZiggIi4uLmZhaWxlZCAlcyAiLCBvYmplY3Rfc3RyKCBjbWQtPnJ1bGUtPm5hbWUgKSApOworICAgICAgICBsaXN0X3ByaW50KCBsb2xfZ2V0KCAoTE9MICopJmNtZC0+YXJncywgMCApICk7CisgICAgICAgIHByaW50ZiggIi4uLlxuIiApOworICAgIH0KKworICAgIC8qIE9uIGludGVycnVwdCwgc2V0IHF1aXQgc28gX2V2ZXJ5dGhpbmdfIGZhaWxzLiBEbyB0aGUgc2FtZSBmb3IgZmFpbGVkCisgICAgICogY29tbWFuZHMgaWYgd2Ugd2VyZSBhc2tlZCB0byBzdG9wIHRoZSBidWlsZCBpbiBjYXNlIG9mIGFueSBlcnJvcnMuCisgICAgICovCisgICAgaWYgKCB0LT5zdGF0dXMgPT0gRVhFQ19DTURfSU5UUiApCisgICAgeworICAgICAgICArK2ludHI7CisgICAgICAgICsrcXVpdDsKKyAgICB9CisgICAgaWYgKCB0LT5zdGF0dXMgPT0gRVhFQ19DTURfRkFJTCAmJiBnbG9icy5xdWl0cXVpY2sgKQorICAgICAgICArK3F1aXQ7CisKKyAgICAvKiBJZiB0aGUgY29tbWFuZCB3YXMgbm90IHN1Y2Nlc3NmdWwgcmVtb3ZlIGFsbCBvZiBpdHMgdGFyZ2V0cyBub3QgbWFya2VkIGFzCisgICAgICogInByZWNpb3VzIi4KKyAgICAgKi8KKyAgICBpZiAoIHQtPnN0YXR1cyAhPSBFWEVDX0NNRF9PSyApCisgICAgeworICAgICAgICBMSVNUICogY29uc3QgdGFyZ2V0cyA9IGxvbF9nZXQoIChMT0wgKikmY21kLT5hcmdzLCAwICk7CisgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCB0YXJnZXRzICk7CisgICAgICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCB0YXJnZXRzICk7CisgICAgICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmaWxlbmFtZSA9IG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICk7CisgICAgICAgICAgICBUQVJHRVQgY29uc3QgKiBjb25zdCB0ID0gYmluZHRhcmdldCggbGlzdF9pdGVtKCBpdGVyICkgKTsKKyAgICAgICAgICAgIGlmICggISggdC0+ZmxhZ3MgJiBUX0ZMQUdfUFJFQ0lPVVMgKSAmJiAhdW5saW5rKCBmaWxlbmFtZSApICkKKyAgICAgICAgICAgICAgICBwcmludGYoICIuLi5yZW1vdmluZyAlc1xuIiwgZmlsZW5hbWUgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZyZWUgdGhpcyBjb21tYW5kIGFuZCBwdXNoIHRoZSBNQUtFMUMgc3RhdGUgdG8gZXhlY3V0ZSB0aGUgbmV4dCBvbmUKKyAgICAgKiBzY2hlZHVsZWQgZm9yIGJ1aWxkaW5nIHRoaXMgc2FtZSB0YXJnZXQuCisgICAgICovCisgICAgdC0+Y21kcyA9IChjaGFyICopY21kX25leHQoIGNtZCApOworICAgIGNtZF9mcmVlKCBjbWQgKTsKKyAgICBwdXNoX3N0YXRlKCAmc3RhdGVfc3RhY2ssIHQsIE5VTEwsIFRfU1RBVEVfTUFLRTFDICk7Cit9CisKKworLyoKKyAqIHN3YXBfc2V0dGluZ3MoKSAtIHJlcGxhY2UgdGhlIHNldHRpbmdzIGZyb20gdGhlIGN1cnJlbnQgbW9kdWxlIGFuZCB0YXJnZXQKKyAqIHdpdGggdGhvc2UgZnJvbSB0aGUgbmV3IG1vZHVsZSBhbmQgdGFyZ2V0CisgKi8KKworc3RhdGljIHZvaWQgc3dhcF9zZXR0aW5ncworKAorICAgIG1vZHVsZV90ICogKiBjdXJyZW50X21vZHVsZSwKKyAgICBUQVJHRVQgICAqICogY3VycmVudF90YXJnZXQsCisgICAgbW9kdWxlX3QgICAqIG5ld19tb2R1bGUsCisgICAgVEFSR0VUICAgICAqIG5ld190YXJnZXQKKykKK3sKKyAgICBpZiAoICggbmV3X3RhcmdldCA9PSAqY3VycmVudF90YXJnZXQgKSAmJgorICAgICAgICAoIG5ld19tb2R1bGUgPT0gKmN1cnJlbnRfbW9kdWxlICkgKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoICpjdXJyZW50X3RhcmdldCApCisgICAgICAgIHBvcHNldHRpbmdzKCAqY3VycmVudF9tb2R1bGUsICgqY3VycmVudF90YXJnZXQpLT5zZXR0aW5ncyApOworCisgICAgaWYgKCBuZXdfdGFyZ2V0ICkKKyAgICAgICAgcHVzaHNldHRpbmdzKCBuZXdfbW9kdWxlLCBuZXdfdGFyZ2V0LT5zZXR0aW5ncyApOworCisgICAgKmN1cnJlbnRfbW9kdWxlID0gbmV3X21vZHVsZTsKKyAgICAqY3VycmVudF90YXJnZXQgPSBuZXdfdGFyZ2V0OworfQorCisKKy8qCisgKiBtYWtlMWNtZHMoKSAtIHR1cm4gQUNUSU9OUyBpbnRvIENNRHMsIGdyb3VwaW5nLCBzcGxpdHRpbmcsIGV0Yy4KKyAqCisgKiBFc3NlbnRpYWxseSBjb3BpZXMgYSBjaGFpbiBvZiBBQ1RJT05zIHRvIGEgY2hhaW4gb2YgQ01EcywgZ3JvdXBpbmcKKyAqIFJVTEVfVE9HRVRIRVIgYWN0aW9ucywgc3BsaXR0aW5nIFJVTEVfUElFQ0VNRUFMIGFjdGlvbnMsIGFuZCBoYW5kbGluZworICogUlVMRV9ORVdTUkNTIGFjdGlvbnMuIFRoZSByZXN1bHQgaXMgYSBjaGFpbiBvZiBDTURzIHdoaWNoIGhhcyBhbHJlYWR5IGhhZCBhbGwKKyAqIG9mIGl0cyBlbWJlZGRlZCB2YXJpYWJsZSByZWZlcmVuY2VzIGV4cGFuZGVkIGFuZCBjYW4gbm93IGJlIGV4ZWN1dGVkIHVzaW5nCisgKiBleGVjX2NtZCgpLgorICovCisKK3N0YXRpYyBDTUQgKiBtYWtlMWNtZHMoIFRBUkdFVCAqIHQgKQoreworICAgIENNRCAqIGNtZHMgPSAwOworICAgIENNRCAqICogY21kc19uZXh0ID0gJmNtZHM7CisgICAgTElTVCAqIHNoZWxsID0gTDA7CisgICAgbW9kdWxlX3QgKiBzZXR0aW5nc19tb2R1bGUgPSAwOworICAgIFRBUkdFVCAqIHNldHRpbmdzX3RhcmdldCA9IDA7CisgICAgQUNUSU9OUyAqIGEwOworICAgIGludCBjb25zdCBydW5uaW5nX2ZsYWcgPSBnbG9icy5ub2V4ZWMgPyBBX1JVTk5JTkdfTk9FWEVDIDogQV9SVU5OSU5HOworCisgICAgLyogU3RlcCB0aHJvdWdoIGFjdGlvbnMuIEFjdGlvbnMgbWF5IGJlIHNoYXJlZCB3aXRoIG90aGVyIHRhcmdldHMgb3IgZ3JvdXBlZAorICAgICAqIHVzaW5nIFJVTEVfVE9HRVRIRVIsIHNvIGFjdGlvbnMgYWxyZWFkeSBzZWVuIGFyZSBza2lwcGVkLgorICAgICAqLworICAgIGZvciAoIGEwID0gdC0+YWN0aW9uczsgYTA7IGEwID0gYTAtPm5leHQgKQorICAgIHsKKyAgICAgICAgUlVMRSAgICAgICAgICogcnVsZSA9IGEwLT5hY3Rpb24tPnJ1bGU7CisgICAgICAgIHJ1bGVfYWN0aW9ucyAqIGFjdGlvbnMgPSBydWxlLT5hY3Rpb25zOworICAgICAgICBTRVRUSU5HUyAgICAgKiBib3VuZHZhcnM7CisgICAgICAgIExJU1QgICAgICAgICAqIG50OworICAgICAgICBMSVNUICAgICAgICAgKiBuczsKKyAgICAgICAgQUNUSU9OUyAgICAgICogYTE7CisKKyAgICAgICAgLyogT25seSBkbyBydWxlcyB3aXRoIGNvbW1hbmRzIHRvIGV4ZWN1dGUuIElmIHRoaXMgYWN0aW9uIGhhcyBhbHJlYWR5CisgICAgICAgICAqIGJlZW4gZXhlY3V0ZWQsIHVzZSBzYXZlZCBzdGF0dXMuCisgICAgICAgICAqLworICAgICAgICBpZiAoICFhY3Rpb25zIHx8IGEwLT5hY3Rpb24tPnJ1bm5pbmcgPj0gcnVubmluZ19mbGFnICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGEwLT5hY3Rpb24tPnJ1bm5pbmcgPSBydW5uaW5nX2ZsYWc7CisKKyAgICAgICAgLyogTWFrZSBMSVNUUyBvZiB0YXJnZXRzIGFuZCBzb3VyY2VzLiBJZiBgZXhlY3V0ZSB0b2dldGhlcmAgaGFzIGJlZW4KKyAgICAgICAgICogc3BlY2lmaWVkIGZvciB0aGlzIHJ1bGUsIHRhY2sgb24gc291cmNlcyBmcm9tIGVhY2ggaW5zdGFuY2Ugb2YgdGhpcworICAgICAgICAgKiBydWxlIGZvciB0aGlzIHRhcmdldC4KKyAgICAgICAgICovCisgICAgICAgIG50ID0gbWFrZTFsaXN0KCBMMCwgYTAtPmFjdGlvbi0+dGFyZ2V0cywgMCApOworICAgICAgICBucyA9IG1ha2UxbGlzdCggTDAsIGEwLT5hY3Rpb24tPnNvdXJjZXMsIGFjdGlvbnMtPmZsYWdzICk7CisgICAgICAgIGlmICggYWN0aW9ucy0+ZmxhZ3MgJiBSVUxFX1RPR0VUSEVSICkKKyAgICAgICAgICAgIGZvciAoIGExID0gYTAtPm5leHQ7IGExOyBhMSA9IGExLT5uZXh0ICkKKyAgICAgICAgICAgICAgICBpZiAoIGExLT5hY3Rpb24tPnJ1bGUgPT0gcnVsZSAmJgorICAgICAgICAgICAgICAgICAgICBhMS0+YWN0aW9uLT5ydW5uaW5nIDwgcnVubmluZ19mbGFnICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5zID0gbWFrZTFsaXN0KCBucywgYTEtPmFjdGlvbi0+c291cmNlcywgYWN0aW9ucy0+ZmxhZ3MgKTsKKyAgICAgICAgICAgICAgICAgICAgYTEtPmFjdGlvbi0+cnVubmluZyA9IHJ1bm5pbmdfZmxhZzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgLyogSWYgZG9pbmcgb25seSB1cGRhdGVkIChvciBleGlzdGluZykgc291cmNlcywgYnV0IG5vbmUgaGF2ZSBiZWVuCisgICAgICAgICAqIHVwZGF0ZWQgKG9yIGV4aXN0KSwgc2tpcCB0aGlzIGFjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGlmICggbGlzdF9lbXB0eSggbnMgKSAmJgorICAgICAgICAgICAgKCBhY3Rpb25zLT5mbGFncyAmICggUlVMRV9ORVdTUkNTIHwgUlVMRV9FWElTVElORyApICkgKQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIG50ICk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3YXBfc2V0dGluZ3MoICZzZXR0aW5nc19tb2R1bGUsICZzZXR0aW5nc190YXJnZXQsIHJ1bGUtPm1vZHVsZSwgdCApOworICAgICAgICBpZiAoIGxpc3RfZW1wdHkoIHNoZWxsICkgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzaGVsbCBpcyBwZXItdGFyZ2V0ICovCisgICAgICAgICAgICBzaGVsbCA9IHZhcl9nZXQoIHJ1bGUtPm1vZHVsZSwgY29uc3RhbnRfSkFNU0hFTEwgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHdlIGhhZCAnYWN0aW9ucyB4eHggYmluZCB2YXJzJyB3ZSBiaW5kIHRoZSB2YXJzIG5vdy4gKi8KKyAgICAgICAgYm91bmR2YXJzID0gbWFrZTFzZXR0aW5ncyggcnVsZS0+bW9kdWxlLCBhY3Rpb25zLT5iaW5kbGlzdCApOworICAgICAgICBwdXNoc2V0dGluZ3MoIHJ1bGUtPm1vZHVsZSwgYm91bmR2YXJzICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQnVpbGQgY29tbWFuZCwgc3RhcnRpbmcgd2l0aCBhbGwgc291cmNlIGFyZ3MuCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBhY3Rpb25zIHRoYXQgYWxsb3cgUElFQ0VNRUFMIGNvbW1hbmRzLCBpZiB0aGUgY29uc3RydWN0ZWQgY29tbWFuZAorICAgICAgICAgKiBzdHJpbmcgaXMgdG9vIGxvbmcsIHdlIHJldHJ5IGNvbnN0cnVjdGluZyBpdCB3aXRoIGEgcmVkdWNlZCBudW1iZXIgb2YKKyAgICAgICAgICogc291cmNlIGFyZ3VtZW50cyBwcmVzZW50ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFdoaWxlIHJlZHVjaW5nIHNsb3dseSB0YWtlcyBhIGJpdCBvZiBjb21wdXRlIHRpbWUgdG8gZ2V0IHRoaW5ncyBqdXN0CisgICAgICAgICAqIHJpZ2h0LCBpdCBpcyB3b3J0aCBpdCB0byBnZXQgYXMgY2xvc2UgdG8gbWF4aW11bSBhbGxvd2VkIGNvbW1hbmQKKyAgICAgICAgICogc3RyaW5nIGxlbmd0aCBhcyBwb3NzaWJsZSwgYmVjYXVzZSBsYXVuY2hpbmcgdGhlIGNvbW1hbmRzIHdlIGFyZQorICAgICAgICAgKiBleGVjdXRpbmcgaXMgbGlrZWx5IHRvIGJlIG11Y2ggbW9yZSBjb21wdXRlIGludGVuc2l2ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZSB0aGF0IHdlIGxvb3AgdGhyb3VnaCBhdCBsZWFzdCBvbmNlLCBmb3Igc291cmNlbGVzcyBhY3Rpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvbnN0IGxlbmd0aCA9IGxpc3RfbGVuZ3RoKCBucyApOworICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGludCBjaHVuayA9IGxlbmd0aDsKKyAgICAgICAgICAgIExJU1QgKiBjbWRfdGFyZ2V0cyA9IEwwOworICAgICAgICAgICAgTElTVCAqIGNtZF9zaGVsbCA9IEwwOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDTUQgKiBjbWQ7CisgICAgICAgICAgICAgICAgaW50IGNtZF9jaGVja19yZXN1bHQ7CisgICAgICAgICAgICAgICAgaW50IGNtZF9lcnJvcl9sZW5ndGg7CisgICAgICAgICAgICAgICAgaW50IGNtZF9lcnJvcl9tYXhfbGVuZ3RoOworICAgICAgICAgICAgICAgIGludCByZXRyeSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGFjY2VwdF9jb21tYW5kID0gMDsKKworICAgICAgICAgICAgICAgIC8qIEJ1aWxkIGNtZDogY21kX25ldygpIHRha2VzIG93bmVyc2hpcCBvZiBpdHMgbGlzdHMuICovCisgICAgICAgICAgICAgICAgaWYgKCBsaXN0X2VtcHR5KCBjbWRfdGFyZ2V0cyApICkgY21kX3RhcmdldHMgPSBsaXN0X2NvcHkoIG50ICk7CisgICAgICAgICAgICAgICAgaWYgKCBsaXN0X2VtcHR5KCBjbWRfc2hlbGwgKSApIGNtZF9zaGVsbCA9IGxpc3RfY29weSggc2hlbGwgKTsKKyAgICAgICAgICAgICAgICBjbWQgPSBjbWRfbmV3KCBydWxlLCBjbWRfdGFyZ2V0cywgbGlzdF9zdWJsaXN0KCBucywgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGNodW5rICksIGNtZF9zaGVsbCApOworCisgICAgICAgICAgICAgICAgY21kX2NoZWNrX3Jlc3VsdCA9IGV4ZWNfY2hlY2soIGNtZC0+YnVmLCAmY21kLT5zaGVsbCwKKyAgICAgICAgICAgICAgICAgICAgJmNtZF9lcnJvcl9sZW5ndGgsICZjbWRfZXJyb3JfbWF4X2xlbmd0aCApOworCisgICAgICAgICAgICAgICAgaWYgKCBjbWRfY2hlY2tfcmVzdWx0ID09IEVYRUNfQ0hFQ0tfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXB0X2NvbW1hbmQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggY21kX2NoZWNrX3Jlc3VsdCA9PSBFWEVDX0NIRUNLX05PT1AgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXB0X2NvbW1hbmQgPSAxOworICAgICAgICAgICAgICAgICAgICBjbWQtPm5vb3AgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKCBhY3Rpb25zLT5mbGFncyAmIFJVTEVfUElFQ0VNRUFMICkgJiYgKCBjaHVuayA+IDEgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBUb28gbG9uZyBidXQgc3BsaXR0YWJsZS4gUmVkdWNlIGNodW5rIHNpemUgc2xvd2x5IGFuZAorICAgICAgICAgICAgICAgICAgICAgKiByZXRyeS4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCggY21kX2NoZWNrX3Jlc3VsdCA9PSBFWEVDX0NIRUNLX1RPT19MT05HIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRfY2hlY2tfcmVzdWx0ID09IEVYRUNfQ0hFQ0tfTElORV9UT09fTE9ORyApOworICAgICAgICAgICAgICAgICAgICBjaHVuayA9IGNodW5rICogOSAvIDEwOworICAgICAgICAgICAgICAgICAgICByZXRyeSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRvbyBsb25nIGFuZCBub3Qgc3BsaXR0YWJsZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGVycm9yX21lc3NhZ2UgPSBjbWRfY2hlY2tfcmVzdWx0ID09CisgICAgICAgICAgICAgICAgICAgICAgICBFWEVDX0NIRUNLX1RPT19MT05HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiaXMgdG9vIGxvbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiY29udGFpbnMgYSBsaW5lIHRoYXQgaXMgdG9vIGxvbmciOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIGNtZF9jaGVja19yZXN1bHQgPT0gRVhFQ19DSEVDS19UT09fTE9ORyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY21kX2NoZWNrX3Jlc3VsdCA9PSBFWEVDX0NIRUNLX0xJTkVfVE9PX0xPTkcgKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiJXMgYWN0aW9uICVzICglZCwgbWF4ICVkKTpcbiIsIG9iamVjdF9zdHIoCisgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5uYW1lICksIGVycm9yX21lc3NhZ2UsIGNtZF9lcnJvcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRfZXJyb3JfbWF4X2xlbmd0aCApOworCisgICAgICAgICAgICAgICAgICAgIC8qIFRlbGwgdGhlIHVzZXIgd2hhdCBkaWQgbm90IGZpdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgZnB1dHMoIGNtZC0+YnVmLT52YWx1ZSwgc3Rkb3V0ICk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoIEVYSVRCQUQgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhc3NlcnQoICFyZXRyeSB8fCAhYWNjZXB0X2NvbW1hbmQgKTsKKworICAgICAgICAgICAgICAgIGlmICggYWNjZXB0X2NvbW1hbmQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ2hhaW4gaXQgdXAuICovCisgICAgICAgICAgICAgICAgICAgICpjbWRzX25leHQgPSBjbWQ7CisgICAgICAgICAgICAgICAgICAgIGNtZHNfbmV4dCA9ICZjbWQtPm5leHQ7CisKKyAgICAgICAgICAgICAgICAgICAgLyogTWFyayBsaXN0cyB3ZSBuZWVkIHJlY3JlYXRlZCBmb3IgdGhlIG5leHQgY29tbWFuZCBzaW5jZQorICAgICAgICAgICAgICAgICAgICAgKiB0aGV5IGdvdCBjb25zdW1lZCBieSB0aGUgY21kIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGNtZF90YXJnZXRzID0gTDA7CisgICAgICAgICAgICAgICAgICAgIGNtZF9zaGVsbCA9IEwwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBXZSBjYW4gcmV1c2UgdGFyZ2V0cyAmIHNoZWxsIGxpc3RzIGZvciB0aGUgbmV4dCBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgICAqIGlmIHdlIGRvIG5vdCBsZXQgdGhlbSBkaWUgd2l0aCB0aGlzIGNtZCBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBjbWRfcmVsZWFzZV90YXJnZXRzX2FuZF9zaGVsbCggY21kICk7CisgICAgICAgICAgICAgICAgICAgIGNtZF9mcmVlKCBjbWQgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoICFyZXRyeSApCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IGNodW5rOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKCBzdGFydCA8IGxlbmd0aCApOworICAgICAgICB9CisKKyAgICAgICAgLyogVGhlc2Ugd2VyZSBhbHdheXMgY29waWVkIHdoZW4gdXNlZC4gKi8KKyAgICAgICAgbGlzdF9mcmVlKCBudCApOworICAgICAgICBsaXN0X2ZyZWUoIG5zICk7CisKKyAgICAgICAgLyogRnJlZSB2YXJpYWJsZXMgd2l0aCB2YWx1ZXMgYm91bmQgYnkgJ2FjdGlvbnMgeHh4IGJpbmQgdmFycycuICovCisgICAgICAgIHBvcHNldHRpbmdzKCBydWxlLT5tb2R1bGUsIGJvdW5kdmFycyApOworICAgICAgICBmcmVlc2V0dGluZ3MoIGJvdW5kdmFycyApOworICAgIH0KKworICAgIHN3YXBfc2V0dGluZ3MoICZzZXR0aW5nc19tb2R1bGUsICZzZXR0aW5nc190YXJnZXQsIDAsIDAgKTsKKyAgICByZXR1cm4gY21kczsKK30KKworCisvKgorICogbWFrZTFsaXN0KCkgLSB0dXJuIGEgbGlzdCBvZiB0YXJnZXRzIGludG8gYSBMSVNULCBmb3IgJCg8KSBhbmQgJCg+KQorICovCisKK3N0YXRpYyBMSVNUICogbWFrZTFsaXN0KCBMSVNUICogbCwgVEFSR0VUUyAqIHRhcmdldHMsIGludCBmbGFncyApCit7CisgICAgZm9yICggOyB0YXJnZXRzOyB0YXJnZXRzID0gdGFyZ2V0cy0+bmV4dCApCisgICAgeworICAgICAgICBUQVJHRVQgKiB0ID0gdGFyZ2V0cy0+dGFyZ2V0OworCisgICAgICAgIGlmICggdC0+YmluZGluZyA9PSBUX0JJTkRfVU5CT1VORCApCisgICAgICAgICAgICBtYWtlMWJpbmQoIHQgKTsKKworICAgICAgICBpZiAoICggZmxhZ3MgJiBSVUxFX0VYSVNUSU5HICkgJiYgKCBmbGFncyAmIFJVTEVfTkVXU1JDUyApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoIHQtPmJpbmRpbmcgIT0gVF9CSU5EX0VYSVNUUyApICYmCisgICAgICAgICAgICAgICAgKCB0LT5mYXRlIDw9IFRfRkFURV9TVEFCTEUgKSApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIGZsYWdzICYgUlVMRV9FWElTVElORyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdC0+YmluZGluZyAhPSBUX0JJTkRfRVhJU1RTICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZmxhZ3MgJiBSVUxFX05FV1NSQ1MgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHQtPmZhdGUgPD0gVF9GQVRFX1NUQUJMRSApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBQcm9oaWJpdCBkdXBsaWNhdGVzIGZvciBSVUxFX1RPR0VUSEVSLiAqLworICAgICAgICBpZiAoIGZsYWdzICYgUlVMRV9UT0dFVEhFUiApCisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCBsICk7CisgICAgICAgICAgICBMSVNUSVRFUiBjb25zdCBlbmQgPSBsaXN0X2VuZCggbCApOworICAgICAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgICAgICAgICBpZiAoIG9iamVjdF9lcXVhbCggbGlzdF9pdGVtKCBpdGVyICksIHQtPmJvdW5kbmFtZSApICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoIGl0ZXIgIT0gZW5kICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEJ1aWxkIG5ldyBsaXN0LiAqLworICAgICAgICBsID0gbGlzdF9wdXNoX2JhY2soIGwsIG9iamVjdF9jb3B5KCB0LT5ib3VuZG5hbWUgKSApOworICAgIH0KKworICAgIHJldHVybiBsOworfQorCisKKy8qCisgKiBtYWtlMXNldHRpbmdzKCkgLSBmb3IgdmFycyB3aXRoIGJvdW5kIHZhbHVlcywgYnVpbGQgdXAgcmVwbGFjZW1lbnQgbGlzdHMKKyAqLworCitzdGF0aWMgU0VUVElOR1MgKiBtYWtlMXNldHRpbmdzKCBzdHJ1Y3QgbW9kdWxlX3QgKiBtb2R1bGUsIExJU1QgKiB2YXJzICkKK3sKKyAgICBTRVRUSU5HUyAqIHNldHRpbmdzID0gMDsKKworICAgIExJU1RJVEVSIHZhcnNfaXRlciA9IGxpc3RfYmVnaW4oIHZhcnMgKTsKKyAgICBMSVNUSVRFUiBjb25zdCB2YXJzX2VuZCA9IGxpc3RfZW5kKCB2YXJzICk7CisgICAgZm9yICggOyB2YXJzX2l0ZXIgIT0gdmFyc19lbmQ7IHZhcnNfaXRlciA9IGxpc3RfbmV4dCggdmFyc19pdGVyICkgKQorICAgIHsKKyAgICAgICAgTElTVCAqIGNvbnN0IGwgPSB2YXJfZ2V0KCBtb2R1bGUsIGxpc3RfaXRlbSggdmFyc19pdGVyICkgKTsKKyAgICAgICAgTElTVCAqIG5sID0gTDA7CisgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCBsICk7CisgICAgICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCBsICk7CisKKyAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgeworICAgICAgICAgICAgVEFSR0VUICogY29uc3QgdCA9IGJpbmR0YXJnZXQoIGxpc3RfaXRlbSggaXRlciApICk7CisKKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgdGFyZ2V0IGlzIGJvdW5kLiAqLworICAgICAgICAgICAgaWYgKCB0LT5iaW5kaW5nID09IFRfQklORF9VTkJPVU5EICkKKyAgICAgICAgICAgICAgICBtYWtlMWJpbmQoIHQgKTsKKworICAgICAgICAgICAgLyogQnVpbGQgYSBuZXcgbGlzdC4gKi8KKyAgICAgICAgICAgIG5sID0gbGlzdF9wdXNoX2JhY2soIG5sLCBvYmplY3RfY29weSggdC0+Ym91bmRuYW1lICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkZCB0byBzZXR0aW5ncyBjaGFpbi4gKi8KKyAgICAgICAgc2V0dGluZ3MgPSBhZGRzZXR0aW5ncyggc2V0dGluZ3MsIFZBUl9TRVQsIGxpc3RfaXRlbSggdmFyc19pdGVyICksIG5sICk7CisgICAgfQorCisgICAgcmV0dXJuIHNldHRpbmdzOworfQorCisKKy8qCisgKiBtYWtlMWJpbmQoKSAtIGJpbmQgdGFyZ2V0cyB0aGF0IHdlcmUgbm90IGJvdW5kIGR1cmluZyBkZXBlbmRlbmN5IGFuYWx5c2lzCisgKgorICogU3BvdCB0aGUga2x1ZGdlISBJZiBhIHRhcmdldCBpcyBub3QgaW4gdGhlIGRlcGVuZGVuY3kgdHJlZSwgaXQgZGlkIG5vdCBnZXQKKyAqIGJvdW5kIGJ5IG1ha2UwKCksIHNvIHdlIGhhdmUgdG8gZG8gaXQgaGVyZS4gVWdseS4KKyAqLworCitzdGF0aWMgdm9pZCBtYWtlMWJpbmQoIFRBUkdFVCAqIHQgKQoreworICAgIGlmICggdC0+ZmxhZ3MgJiBUX0ZMQUdfTk9URklMRSApCisgICAgICAgIHJldHVybjsKKworICAgIHB1c2hzZXR0aW5ncyggcm9vdF9tb2R1bGUoKSwgdC0+c2V0dGluZ3MgKTsKKyAgICBvYmplY3RfZnJlZSggdC0+Ym91bmRuYW1lICk7CisgICAgdC0+Ym91bmRuYW1lID0gc2VhcmNoKCB0LT5uYW1lLCAmdC0+dGltZSwgMCwgdC0+ZmxhZ3MgJiBUX0ZMQUdfSVNGSUxFICk7CisgICAgdC0+YmluZGluZyA9IHRpbWVzdGFtcF9lbXB0eSggJnQtPnRpbWUgKSA/IFRfQklORF9NSVNTSU5HIDogVF9CSU5EX0VYSVNUUzsKKyAgICBwb3BzZXR0aW5ncyggcm9vdF9tb2R1bGUoKSwgdC0+c2V0dGluZ3MgKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21kNS5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1ZDk2YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21kNS5jCkBAIC0wLDAgKzEsMzgxIEBACisvKgorICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEwuIFBldGVyIERldXRzY2gKKyAgZ2hvc3RAYWxhZGRpbi5jb20KKworICovCisvKiAkSWQ6IG1kNS5jLHYgMS42IDIwMDIvMDQvMTMgMTk6MjA6MjggbHBkIEV4cCAkICovCisvKgorICBJbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgKFJGQyAxMzIxKS4KKworICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQorICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAorCWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0CisgIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKKyAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCisgIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKKyAgY29weXJpZ2h0ZWQuCisKKyAgVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIG1kNS5jIGlzIEwuIFBldGVyIERldXRzY2gKKyAgPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQorICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6CisKKyAgMjAwMi0wNC0xMyBscGQgQ2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsgbm93IGhhbmRsZXMgYnl0ZSBvcmRlcgorCWVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5OyBhZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdHJpbmcuaD4KKwlpbiBsaWJyYXJ5LgorICAyMDAyLTAzLTExIGxwZCBDb3JyZWN0ZWQgYXJndW1lbnQgbGlzdCBmb3IgbWFpbigpLCBhbmQgYWRkZWQgaW50IHJldHVybgorCXR5cGUsIGluIHRlc3QgcHJvZ3JhbSBhbmQgVCB2YWx1ZSBwcm9ncmFtLgorICAyMDAyLTAyLTIxIGxwZCBBZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdGRpby5oPiBpbiB0ZXN0IHByb2dyYW0uCisgIDIwMDAtMDctMDMgbHBkIFBhdGNoZWQgdG8gZWxpbWluYXRlIHdhcm5pbmdzIGFib3V0ICJjb25zdGFudCBpcworCXVuc2lnbmVkIGluIEFOU0kgQywgc2lnbmVkIGluIHRyYWRpdGlvbmFsIjsgbWFkZSB0ZXN0IHByb2dyYW0KKwlzZWxmLWNoZWNraW5nLgorICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KKyAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KS4KKyAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSAibWQ1LmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyN1bmRlZiBCWVRFX09SREVSCS8qIDEgPSBiaWctZW5kaWFuLCAtMSA9IGxpdHRsZS1lbmRpYW4sIDAgPSB1bmtub3duICovCisjaWZkZWYgQVJDSF9JU19CSUdfRU5ESUFOCisjICBkZWZpbmUgQllURV9PUkRFUiAoQVJDSF9JU19CSUdfRU5ESUFOID8gMSA6IC0xKQorI2Vsc2UKKyMgIGRlZmluZSBCWVRFX09SREVSIDAKKyNlbmRpZgorCisjZGVmaW5lIFRfTUFTSyAoKG1kNV93b3JkX3QpfjApCisjZGVmaW5lIFQxIC8qIDB4ZDc2YWE0NzggKi8gKFRfTUFTSyBeIDB4Mjg5NTViODcpCisjZGVmaW5lIFQyIC8qIDB4ZThjN2I3NTYgKi8gKFRfTUFTSyBeIDB4MTczODQ4YTkpCisjZGVmaW5lIFQzICAgIDB4MjQyMDcwZGIKKyNkZWZpbmUgVDQgLyogMHhjMWJkY2VlZSAqLyAoVF9NQVNLIF4gMHgzZTQyMzExMSkKKyNkZWZpbmUgVDUgLyogMHhmNTdjMGZhZiAqLyAoVF9NQVNLIF4gMHgwYTgzZjA1MCkKKyNkZWZpbmUgVDYgICAgMHg0Nzg3YzYyYQorI2RlZmluZSBUNyAvKiAweGE4MzA0NjEzICovIChUX01BU0sgXiAweDU3Y2ZiOWVjKQorI2RlZmluZSBUOCAvKiAweGZkNDY5NTAxICovIChUX01BU0sgXiAweDAyYjk2YWZlKQorI2RlZmluZSBUOSAgICAweDY5ODA5OGQ4CisjZGVmaW5lIFQxMCAvKiAweDhiNDRmN2FmICovIChUX01BU0sgXiAweDc0YmIwODUwKQorI2RlZmluZSBUMTEgLyogMHhmZmZmNWJiMSAqLyAoVF9NQVNLIF4gMHgwMDAwYTQ0ZSkKKyNkZWZpbmUgVDEyIC8qIDB4ODk1Y2Q3YmUgKi8gKFRfTUFTSyBeIDB4NzZhMzI4NDEpCisjZGVmaW5lIFQxMyAgICAweDZiOTAxMTIyCisjZGVmaW5lIFQxNCAvKiAweGZkOTg3MTkzICovIChUX01BU0sgXiAweDAyNjc4ZTZjKQorI2RlZmluZSBUMTUgLyogMHhhNjc5NDM4ZSAqLyAoVF9NQVNLIF4gMHg1OTg2YmM3MSkKKyNkZWZpbmUgVDE2ICAgIDB4NDliNDA4MjEKKyNkZWZpbmUgVDE3IC8qIDB4ZjYxZTI1NjIgKi8gKFRfTUFTSyBeIDB4MDllMWRhOWQpCisjZGVmaW5lIFQxOCAvKiAweGMwNDBiMzQwICovIChUX01BU0sgXiAweDNmYmY0Y2JmKQorI2RlZmluZSBUMTkgICAgMHgyNjVlNWE1MQorI2RlZmluZSBUMjAgLyogMHhlOWI2YzdhYSAqLyAoVF9NQVNLIF4gMHgxNjQ5Mzg1NSkKKyNkZWZpbmUgVDIxIC8qIDB4ZDYyZjEwNWQgKi8gKFRfTUFTSyBeIDB4MjlkMGVmYTIpCisjZGVmaW5lIFQyMiAgICAweDAyNDQxNDUzCisjZGVmaW5lIFQyMyAvKiAweGQ4YTFlNjgxICovIChUX01BU0sgXiAweDI3NWUxOTdlKQorI2RlZmluZSBUMjQgLyogMHhlN2QzZmJjOCAqLyAoVF9NQVNLIF4gMHgxODJjMDQzNykKKyNkZWZpbmUgVDI1ICAgIDB4MjFlMWNkZTYKKyNkZWZpbmUgVDI2IC8qIDB4YzMzNzA3ZDYgKi8gKFRfTUFTSyBeIDB4M2NjOGY4MjkpCisjZGVmaW5lIFQyNyAvKiAweGY0ZDUwZDg3ICovIChUX01BU0sgXiAweDBiMmFmMjc4KQorI2RlZmluZSBUMjggICAgMHg0NTVhMTRlZAorI2RlZmluZSBUMjkgLyogMHhhOWUzZTkwNSAqLyAoVF9NQVNLIF4gMHg1NjFjMTZmYSkKKyNkZWZpbmUgVDMwIC8qIDB4ZmNlZmEzZjggKi8gKFRfTUFTSyBeIDB4MDMxMDVjMDcpCisjZGVmaW5lIFQzMSAgICAweDY3NmYwMmQ5CisjZGVmaW5lIFQzMiAvKiAweDhkMmE0YzhhICovIChUX01BU0sgXiAweDcyZDViMzc1KQorI2RlZmluZSBUMzMgLyogMHhmZmZhMzk0MiAqLyAoVF9NQVNLIF4gMHgwMDA1YzZiZCkKKyNkZWZpbmUgVDM0IC8qIDB4ODc3MWY2ODEgKi8gKFRfTUFTSyBeIDB4Nzg4ZTA5N2UpCisjZGVmaW5lIFQzNSAgICAweDZkOWQ2MTIyCisjZGVmaW5lIFQzNiAvKiAweGZkZTUzODBjICovIChUX01BU0sgXiAweDAyMWFjN2YzKQorI2RlZmluZSBUMzcgLyogMHhhNGJlZWE0NCAqLyAoVF9NQVNLIF4gMHg1YjQxMTViYikKKyNkZWZpbmUgVDM4ICAgIDB4NGJkZWNmYTkKKyNkZWZpbmUgVDM5IC8qIDB4ZjZiYjRiNjAgKi8gKFRfTUFTSyBeIDB4MDk0NGI0OWYpCisjZGVmaW5lIFQ0MCAvKiAweGJlYmZiYzcwICovIChUX01BU0sgXiAweDQxNDA0MzhmKQorI2RlZmluZSBUNDEgICAgMHgyODliN2VjNgorI2RlZmluZSBUNDIgLyogMHhlYWExMjdmYSAqLyAoVF9NQVNLIF4gMHgxNTVlZDgwNSkKKyNkZWZpbmUgVDQzIC8qIDB4ZDRlZjMwODUgKi8gKFRfTUFTSyBeIDB4MmIxMGNmN2EpCisjZGVmaW5lIFQ0NCAgICAweDA0ODgxZDA1CisjZGVmaW5lIFQ0NSAvKiAweGQ5ZDRkMDM5ICovIChUX01BU0sgXiAweDI2MmIyZmM2KQorI2RlZmluZSBUNDYgLyogMHhlNmRiOTllNSAqLyAoVF9NQVNLIF4gMHgxOTI0NjYxYSkKKyNkZWZpbmUgVDQ3ICAgIDB4MWZhMjdjZjgKKyNkZWZpbmUgVDQ4IC8qIDB4YzRhYzU2NjUgKi8gKFRfTUFTSyBeIDB4M2I1M2E5OWEpCisjZGVmaW5lIFQ0OSAvKiAweGY0MjkyMjQ0ICovIChUX01BU0sgXiAweDBiZDZkZGJiKQorI2RlZmluZSBUNTAgICAgMHg0MzJhZmY5NworI2RlZmluZSBUNTEgLyogMHhhYjk0MjNhNyAqLyAoVF9NQVNLIF4gMHg1NDZiZGM1OCkKKyNkZWZpbmUgVDUyIC8qIDB4ZmM5M2EwMzkgKi8gKFRfTUFTSyBeIDB4MDM2YzVmYzYpCisjZGVmaW5lIFQ1MyAgICAweDY1NWI1OWMzCisjZGVmaW5lIFQ1NCAvKiAweDhmMGNjYzkyICovIChUX01BU0sgXiAweDcwZjMzMzZkKQorI2RlZmluZSBUNTUgLyogMHhmZmVmZjQ3ZCAqLyAoVF9NQVNLIF4gMHgwMDEwMGI4MikKKyNkZWZpbmUgVDU2IC8qIDB4ODU4NDVkZDEgKi8gKFRfTUFTSyBeIDB4N2E3YmEyMmUpCisjZGVmaW5lIFQ1NyAgICAweDZmYTg3ZTRmCisjZGVmaW5lIFQ1OCAvKiAweGZlMmNlNmUwICovIChUX01BU0sgXiAweDAxZDMxOTFmKQorI2RlZmluZSBUNTkgLyogMHhhMzAxNDMxNCAqLyAoVF9NQVNLIF4gMHg1Y2ZlYmNlYikKKyNkZWZpbmUgVDYwICAgIDB4NGUwODExYTEKKyNkZWZpbmUgVDYxIC8qIDB4Zjc1MzdlODIgKi8gKFRfTUFTSyBeIDB4MDhhYzgxN2QpCisjZGVmaW5lIFQ2MiAvKiAweGJkM2FmMjM1ICovIChUX01BU0sgXiAweDQyYzUwZGNhKQorI2RlZmluZSBUNjMgICAgMHgyYWQ3ZDJiYgorI2RlZmluZSBUNjQgLyogMHhlYjg2ZDM5MSAqLyAoVF9NQVNLIF4gMHgxNDc5MmM2ZSkKKworCitzdGF0aWMgdm9pZAorbWQ1X3Byb2Nlc3MobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSAvKls2NF0qLykKK3sKKyAgICBtZDVfd29yZF90CisJYSA9IHBtcy0+YWJjZFswXSwgYiA9IHBtcy0+YWJjZFsxXSwKKwljID0gcG1zLT5hYmNkWzJdLCBkID0gcG1zLT5hYmNkWzNdOworICAgIG1kNV93b3JkX3QgdDsKKyNpZiBCWVRFX09SREVSID4gMAorICAgIC8qIERlZmluZSBzdG9yYWdlIG9ubHkgZm9yIGJpZy1lbmRpYW4gQ1BVcy4gKi8KKyAgICBtZDVfd29yZF90IFhbMTZdOworI2Vsc2UKKyAgICAvKiBEZWZpbmUgc3RvcmFnZSBmb3IgbGl0dGxlLWVuZGlhbiBvciBib3RoIHR5cGVzIG9mIENQVXMuICovCisgICAgbWQ1X3dvcmRfdCB4YnVmWzE2XTsKKyAgICBjb25zdCBtZDVfd29yZF90ICpYOworI2VuZGlmCisKKyAgICB7CisjaWYgQllURV9PUkRFUiA9PSAwCisJLyoKKwkgKiBEZXRlcm1pbmUgZHluYW1pY2FsbHkgd2hldGhlciB0aGlzIGlzIGEgYmlnLWVuZGlhbiBvcgorCSAqIGxpdHRsZS1lbmRpYW4gbWFjaGluZSwgc2luY2Ugd2UgY2FuIHVzZSBhIG1vcmUgZWZmaWNpZW50CisJICogYWxnb3JpdGhtIG9uIHRoZSBsYXR0ZXIuCisJICovCisJc3RhdGljIGNvbnN0IGludCB3ID0gMTsKKworCWlmICgqKChjb25zdCBtZDVfYnl0ZV90ICopJncpKSAvKiBkeW5hbWljIGxpdHRsZS1lbmRpYW4gKi8KKyNlbmRpZgorI2lmIEJZVEVfT1JERVIgPD0gMAkJLyogbGl0dGxlLWVuZGlhbiAqLworCXsKKwkgICAgLyoKKwkgICAgICogT24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgd2UgY2FuIHByb2Nlc3MgcHJvcGVybHkgYWxpZ25lZAorCSAgICAgKiBkYXRhIHdpdGhvdXQgY29weWluZyBpdC4KKwkgICAgICovCisJICAgIGlmICghKChkYXRhIC0gKGNvbnN0IG1kNV9ieXRlX3QgKikwKSAmIDMpKSB7CisJCS8qIGRhdGEgYXJlIHByb3Blcmx5IGFsaWduZWQgKi8KKwkJWCA9IChjb25zdCBtZDVfd29yZF90ICopZGF0YTsKKwkgICAgfSBlbHNlIHsKKwkJLyogbm90IGFsaWduZWQgKi8KKwkJbWVtY3B5KHhidWYsIGRhdGEsIDY0KTsKKwkJWCA9IHhidWY7CisJICAgIH0KKwl9CisjZW5kaWYKKyNpZiBCWVRFX09SREVSID09IDAKKwllbHNlCQkJLyogZHluYW1pYyBiaWctZW5kaWFuICovCisjZW5kaWYKKyNpZiBCWVRFX09SREVSID49IDAJCS8qIGJpZy1lbmRpYW4gKi8KKwl7CisJICAgIC8qCisJICAgICAqIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIHdlIG11c3QgYXJyYW5nZSB0aGUgYnl0ZXMgaW4gdGhlCisJICAgICAqIHJpZ2h0IG9yZGVyLgorCSAgICAgKi8KKwkgICAgY29uc3QgbWQ1X2J5dGVfdCAqeHAgPSBkYXRhOworCSAgICBpbnQgaTsKKworIyAgaWYgQllURV9PUkRFUiA9PSAwCisJICAgIFggPSB4YnVmOwkJLyogKGR5bmFtaWMgb25seSkgKi8KKyMgIGVsc2UKKyMgICAgZGVmaW5lIHhidWYgWAkJLyogKHN0YXRpYyBvbmx5KSAqLworIyAgZW5kaWYKKwkgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2ksIHhwICs9IDQpCisJCXhidWZbaV0gPSB4cFswXSArICh4cFsxXSA8PCA4KSArICh4cFsyXSA8PCAxNikgKyAoeHBbM10gPDwgMjQpOworCX0KKyNlbmRpZgorICAgIH0KKworI2RlZmluZSBST1RBVEVfTEVGVCh4LCBuKSAoKCh4KSA8PCAobikpIHwgKCh4KSA+PiAoMzIgLSAobikpKSkKKworICAgIC8qIFJvdW5kIDEuICovCisgICAgLyogTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgorICAgICAgIGEgPSBiICsgKChhICsgRihiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLworI2RlZmluZSBGKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICh+KHgpICYgKHopKSkKKyNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKKyAgdCA9IGEgKyBGKGIsYyxkKSArIFhba10gKyBUaTtcCisgIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKKyAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCisgICAgU0VUKGEsIGIsIGMsIGQsICAwLCAgNywgIFQxKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDEsIDEyLCAgVDIpOworICAgIFNFVChjLCBkLCBhLCBiLCAgMiwgMTcsICBUMyk7CisgICAgU0VUKGIsIGMsIGQsIGEsICAzLCAyMiwgIFQ0KTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA3LCAgVDUpOworICAgIFNFVChkLCBhLCBiLCBjLCAgNSwgMTIsICBUNik7CisgICAgU0VUKGMsIGQsIGEsIGIsICA2LCAxNywgIFQ3KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDcsIDIyLCAgVDgpOworICAgIFNFVChhLCBiLCBjLCBkLCAgOCwgIDcsICBUOSk7CisgICAgU0VUKGQsIGEsIGIsIGMsICA5LCAxMiwgVDEwKTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE3LCBUMTEpOworICAgIFNFVChiLCBjLCBkLCBhLCAxMSwgMjIsIFQxMik7CisgICAgU0VUKGEsIGIsIGMsIGQsIDEyLCAgNywgVDEzKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgMTMsIDEyLCBUMTQpOworICAgIFNFVChjLCBkLCBhLCBiLCAxNCwgMTcsIFQxNSk7CisgICAgU0VUKGIsIGMsIGQsIGEsIDE1LCAyMiwgVDE2KTsKKyN1bmRlZiBTRVQKKworICAgICAvKiBSb3VuZCAyLiAqLworICAgICAvKiBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCisgICAgICAgICAgYSA9IGIgKyAoKGEgKyBHKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCisjZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmIH4oeikpKQorI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAorICB0ID0gYSArIEcoYixjLGQpICsgWFtrXSArIFRpO1wKKyAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgorICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCisgICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNSwgVDE3KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDYsICA5LCBUMTgpOworICAgIFNFVChjLCBkLCBhLCBiLCAxMSwgMTQsIFQxOSk7CisgICAgU0VUKGIsIGMsIGQsIGEsICAwLCAyMCwgVDIwKTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDUsICA1LCBUMjEpOworICAgIFNFVChkLCBhLCBiLCBjLCAxMCwgIDksIFQyMik7CisgICAgU0VUKGMsIGQsIGEsIGIsIDE1LCAxNCwgVDIzKTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDQsIDIwLCBUMjQpOworICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDUsIFQyNSk7CisgICAgU0VUKGQsIGEsIGIsIGMsIDE0LCAgOSwgVDI2KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDMsIDE0LCBUMjcpOworICAgIFNFVChiLCBjLCBkLCBhLCAgOCwgMjAsIFQyOCk7CisgICAgU0VUKGEsIGIsIGMsIGQsIDEzLCAgNSwgVDI5KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDIsICA5LCBUMzApOworICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTQsIFQzMSk7CisgICAgU0VUKGIsIGMsIGQsIGEsIDEyLCAyMCwgVDMyKTsKKyN1bmRlZiBTRVQKKworICAgICAvKiBSb3VuZCAzLiAqLworICAgICAvKiBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCisgICAgICAgICAgYSA9IGIgKyAoKGEgKyBIKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCisjZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKyNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKKyAgdCA9IGEgKyBIKGIsYyxkKSArIFhba10gKyBUaTtcCisgIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKKyAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLworICAgIFNFVChhLCBiLCBjLCBkLCAgNSwgIDQsIFQzMyk7CisgICAgU0VUKGQsIGEsIGIsIGMsICA4LCAxMSwgVDM0KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTEsIDE2LCBUMzUpOworICAgIFNFVChiLCBjLCBkLCBhLCAxNCwgMjMsIFQzNik7CisgICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNCwgVDM3KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDQsIDExLCBUMzgpOworICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTYsIFQzOSk7CisgICAgU0VUKGIsIGMsIGQsIGEsIDEwLCAyMywgVDQwKTsKKyAgICBTRVQoYSwgYiwgYywgZCwgMTMsICA0LCBUNDEpOworICAgIFNFVChkLCBhLCBiLCBjLCAgMCwgMTEsIFQ0Mik7CisgICAgU0VUKGMsIGQsIGEsIGIsICAzLCAxNiwgVDQzKTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDYsIDIzLCBUNDQpOworICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDQsIFQ0NSk7CisgICAgU0VUKGQsIGEsIGIsIGMsIDEyLCAxMSwgVDQ2KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTUsIDE2LCBUNDcpOworICAgIFNFVChiLCBjLCBkLCBhLCAgMiwgMjMsIFQ0OCk7CisjdW5kZWYgU0VUCisKKyAgICAgLyogUm91bmQgNC4gKi8KKyAgICAgLyogTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgIGEgPSBiICsgKChhICsgSShiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLworI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgfih6KSkpCisjZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCisgIHQgPSBhICsgSShiLGMsZCkgKyBYW2tdICsgVGk7XAorICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCisgICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KKyAgICBTRVQoYSwgYiwgYywgZCwgIDAsICA2LCBUNDkpOworICAgIFNFVChkLCBhLCBiLCBjLCAgNywgMTAsIFQ1MCk7CisgICAgU0VUKGMsIGQsIGEsIGIsIDE0LCAxNSwgVDUxKTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDUsIDIxLCBUNTIpOworICAgIFNFVChhLCBiLCBjLCBkLCAxMiwgIDYsIFQ1Myk7CisgICAgU0VUKGQsIGEsIGIsIGMsICAzLCAxMCwgVDU0KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE1LCBUNTUpOworICAgIFNFVChiLCBjLCBkLCBhLCAgMSwgMjEsIFQ1Nik7CisgICAgU0VUKGEsIGIsIGMsIGQsICA4LCAgNiwgVDU3KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgMTUsIDEwLCBUNTgpOworICAgIFNFVChjLCBkLCBhLCBiLCAgNiwgMTUsIFQ1OSk7CisgICAgU0VUKGIsIGMsIGQsIGEsIDEzLCAyMSwgVDYwKTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA2LCBUNjEpOworICAgIFNFVChkLCBhLCBiLCBjLCAxMSwgMTAsIFQ2Mik7CisgICAgU0VUKGMsIGQsIGEsIGIsICAyLCAxNSwgVDYzKTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDksIDIxLCBUNjQpOworI3VuZGVmIFNFVAorCisgICAgIC8qIFRoZW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucy4gKFRoYXQgaXMgaW5jcmVtZW50IGVhY2gKKyAgICAgICAgb2YgdGhlIGZvdXIgcmVnaXN0ZXJzIGJ5IHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHRoaXMgYmxvY2sKKyAgICAgICAgd2FzIHN0YXJ0ZWQuKSAqLworICAgIHBtcy0+YWJjZFswXSArPSBhOworICAgIHBtcy0+YWJjZFsxXSArPSBiOworICAgIHBtcy0+YWJjZFsyXSArPSBjOworICAgIHBtcy0+YWJjZFszXSArPSBkOworfQorCit2b2lkCittZDVfaW5pdChtZDVfc3RhdGVfdCAqcG1zKQoreworICAgIHBtcy0+Y291bnRbMF0gPSBwbXMtPmNvdW50WzFdID0gMDsKKyAgICBwbXMtPmFiY2RbMF0gPSAweDY3NDUyMzAxOworICAgIHBtcy0+YWJjZFsxXSA9IC8qMHhlZmNkYWI4OSovIFRfTUFTSyBeIDB4MTAzMjU0NzY7CisgICAgcG1zLT5hYmNkWzJdID0gLyoweDk4YmFkY2ZlKi8gVF9NQVNLIF4gMHg2NzQ1MjMwMTsKKyAgICBwbXMtPmFiY2RbM10gPSAweDEwMzI1NDc2OworfQorCit2b2lkCittZDVfYXBwZW5kKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEsIGludCBuYnl0ZXMpCit7CisgICAgY29uc3QgbWQ1X2J5dGVfdCAqcCA9IGRhdGE7CisgICAgaW50IGxlZnQgPSBuYnl0ZXM7CisgICAgaW50IG9mZnNldCA9IChwbXMtPmNvdW50WzBdID4+IDMpICYgNjM7CisgICAgbWQ1X3dvcmRfdCBuYml0cyA9IChtZDVfd29yZF90KShuYnl0ZXMgPDwgMyk7CisKKyAgICBpZiAobmJ5dGVzIDw9IDApCisJcmV0dXJuOworCisgICAgLyogVXBkYXRlIHRoZSBtZXNzYWdlIGxlbmd0aC4gKi8KKyAgICBwbXMtPmNvdW50WzFdICs9IG5ieXRlcyA+PiAyOTsKKyAgICBwbXMtPmNvdW50WzBdICs9IG5iaXRzOworICAgIGlmIChwbXMtPmNvdW50WzBdIDwgbmJpdHMpCisJcG1zLT5jb3VudFsxXSsrOworCisgICAgLyogUHJvY2VzcyBhbiBpbml0aWFsIHBhcnRpYWwgYmxvY2suICovCisgICAgaWYgKG9mZnNldCkgeworCWludCBjb3B5ID0gKG9mZnNldCArIG5ieXRlcyA+IDY0ID8gNjQgLSBvZmZzZXQgOiBuYnl0ZXMpOworCisJbWVtY3B5KHBtcy0+YnVmICsgb2Zmc2V0LCBwLCBjb3B5KTsKKwlpZiAob2Zmc2V0ICsgY29weSA8IDY0KQorCSAgICByZXR1cm47CisJcCArPSBjb3B5OworCWxlZnQgLT0gY29weTsKKwltZDVfcHJvY2VzcyhwbXMsIHBtcy0+YnVmKTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIGZ1bGwgYmxvY2tzLiAqLworICAgIGZvciAoOyBsZWZ0ID49IDY0OyBwICs9IDY0LCBsZWZ0IC09IDY0KQorCW1kNV9wcm9jZXNzKHBtcywgcCk7CisKKyAgICAvKiBQcm9jZXNzIGEgZmluYWwgcGFydGlhbCBibG9jay4gKi8KKyAgICBpZiAobGVmdCkKKwltZW1jcHkocG1zLT5idWYsIHAsIGxlZnQpOworfQorCit2b2lkCittZDVfZmluaXNoKG1kNV9zdGF0ZV90ICpwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSkKK3sKKyAgICBzdGF0aWMgY29uc3QgbWQ1X2J5dGVfdCBwYWRbNjRdID0geworCTB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKyAgICB9OworICAgIG1kNV9ieXRlX3QgZGF0YVs4XTsKKyAgICBpbnQgaTsKKworICAgIC8qIFNhdmUgdGhlIGxlbmd0aCBiZWZvcmUgcGFkZGluZy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCWRhdGFbaV0gPSAobWQ1X2J5dGVfdCkocG1zLT5jb3VudFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKKyAgICAvKiBQYWQgdG8gNTYgYnl0ZXMgbW9kIDY0LiAqLworICAgIG1kNV9hcHBlbmQocG1zLCBwYWQsICgoNTUgLSAocG1zLT5jb3VudFswXSA+PiAzKSkgJiA2MykgKyAxKTsKKyAgICAvKiBBcHBlbmQgdGhlIGxlbmd0aC4gKi8KKyAgICBtZDVfYXBwZW5kKHBtcywgZGF0YSwgOCk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCisJZGlnZXN0W2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+YWJjZFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21kNS5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbWQ1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4Yzk5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21kNS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgTC4gUGV0ZXIgRGV1dHNjaAorICBnaG9zdEBhbGFkZGluLmNvbQorCisgKi8KKy8qICRJZDogbWQ1LmgsdiAxLjQgMjAwMi8wNC8xMyAxOToyMDoyOCBscGQgRXhwICQgKi8KKy8qCisgIEluZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIE1ENSAoUkZDIDEzMjEpLgorCisgIFRoaXMgY29kZSBpbXBsZW1lbnRzIHRoZSBNRDUgQWxnb3JpdGhtIGRlZmluZWQgaW4gUkZDIDEzMjEsIHdob3NlCisgIHRleHQgaXMgYXZhaWxhYmxlIGF0CisJaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTMyMS50eHQKKyAgVGhlIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSB0ZXh0IG9mIHRoZSBSRkMsIGluY2x1ZGluZyB0aGUgdGVzdCBzdWl0ZQorICAoc2VjdGlvbiBBLjUpIGJ1dCBleGNsdWRpbmcgdGhlIHJlc3Qgb2YgQXBwZW5kaXggQS4gIEl0IGRvZXMgbm90IGluY2x1ZGUKKyAgYW55IGNvZGUgb3IgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIGlkZW50aWZpZWQgaW4gdGhlIFJGQyBhcyBiZWluZworICBjb3B5cmlnaHRlZC4KKworICBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgbWQ1LmggaXMgTC4gUGV0ZXIgRGV1dHNjaAorICA8Z2hvc3RAYWxhZGRpbi5jb20+LiAgT3RoZXIgYXV0aG9ycyBhcmUgbm90ZWQgaW4gdGhlIGNoYW5nZSBoaXN0b3J5CisgIHRoYXQgZm9sbG93cyAoaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyKToKKworICAyMDAyLTA0LTEzIGxwZCBSZW1vdmVkIHN1cHBvcnQgZm9yIG5vbi1BTlNJIGNvbXBpbGVyczsgcmVtb3ZlZAorCXJlZmVyZW5jZXMgdG8gR2hvc3RzY3JpcHQ7IGNsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7CisJbm93IGhhbmRsZXMgYnl0ZSBvcmRlciBlaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseS4KKyAgMTk5OS0xMS0wNCBscGQgRWRpdGVkIGNvbW1lbnRzIHNsaWdodGx5IGZvciBhdXRvbWF0aWMgVE9DIGV4dHJhY3Rpb24uCisgIDE5OTktMTAtMTggbHBkIEZpeGVkIHR5cG8gaW4gaGVhZGVyIGNvbW1lbnQgKGFuc2kya25yIHJhdGhlciB0aGFuIG1kNSk7CisJYWRkZWQgY29uZGl0aW9uYWxpemF0aW9uIGZvciBDKysgY29tcGlsYXRpb24gZnJvbSBNYXJ0aW4KKwlQdXJzY2hrZSA8cHVyc2Noa2VAYm5sLmdvdj4uCisgIDE5OTktMDUtMDMgbHBkIE9yaWdpbmFsIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBtZDVfSU5DTFVERUQKKyMgIGRlZmluZSBtZDVfSU5DTFVERUQKKworLyoKKyAqIFRoaXMgcGFja2FnZSBzdXBwb3J0cyBib3RoIGNvbXBpbGUtdGltZSBhbmQgcnVuLXRpbWUgZGV0ZXJtaW5hdGlvbiBvZiBDUFUKKyAqIGJ5dGUgb3JkZXIuICBJZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgZGVmaW5lZCBhcyAwLCB0aGUgY29kZSB3aWxsIGJlCisgKiBjb21waWxlZCB0byBydW4gb25seSBvbiBsaXR0bGUtZW5kaWFuIENQVXM7IGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcworICogZGVmaW5lZCBhcyBub24temVybywgdGhlIGNvZGUgd2lsbCBiZSBjb21waWxlZCB0byBydW4gb25seSBvbiBiaWctZW5kaWFuCisgKiBDUFVzOyBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgbm90IGRlZmluZWQsIHRoZSBjb2RlIHdpbGwgYmUgY29tcGlsZWQgdG8KKyAqIHJ1biBvbiBlaXRoZXIgYmlnLSBvciBsaXR0bGUtZW5kaWFuIENQVXMsIGJ1dCB3aWxsIHJ1biBzbGlnaHRseSBsZXNzCisgKiBlZmZpY2llbnRseSBvbiBlaXRoZXIgb25lIHRoYW4gaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIGRlZmluZWQuCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG1kNV9ieXRlX3Q7IC8qIDgtYml0IGJ5dGUgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IG1kNV93b3JkX3Q7IC8qIDMyLWJpdCB3b3JkICovCisKKy8qIERlZmluZSB0aGUgc3RhdGUgb2YgdGhlIE1ENSBBbGdvcml0aG0uICovCit0eXBlZGVmIHN0cnVjdCBtZDVfc3RhdGVfcyB7CisgICAgbWQ1X3dvcmRfdCBjb3VudFsyXTsJLyogbWVzc2FnZSBsZW5ndGggaW4gYml0cywgbHN3IGZpcnN0ICovCisgICAgbWQ1X3dvcmRfdCBhYmNkWzRdOwkJLyogZGlnZXN0IGJ1ZmZlciAqLworICAgIG1kNV9ieXRlX3QgYnVmWzY0XTsJCS8qIGFjY3VtdWxhdGUgYmxvY2sgKi8KK30gbWQ1X3N0YXRlX3Q7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiAKK3sKKyNlbmRpZgorCisvKiBJbml0aWFsaXplIHRoZSBhbGdvcml0aG0uICovCit2b2lkIG1kNV9pbml0KG1kNV9zdGF0ZV90ICpwbXMpOworCisvKiBBcHBlbmQgYSBzdHJpbmcgdG8gdGhlIG1lc3NhZ2UuICovCit2b2lkIG1kNV9hcHBlbmQobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSwgaW50IG5ieXRlcyk7CisKKy8qIEZpbmlzaCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBkaWdlc3QuICovCit2b2lkIG1kNV9maW5pc2gobWQ1X3N0YXRlX3QgKnBtcywgbWQ1X2J5dGVfdCBkaWdlc3RbMTZdKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvKiBlbmQgZXh0ZXJuICJDIiAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBtZDVfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21lbS5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExMWZiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21lbS5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qCitDb3B5cmlnaHQgUmVuZSBSaXZlcmEgMjAwNi4KK0Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyhTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKK2h0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyovCisKKyNpbmNsdWRlICJqYW0uaCIKKworI2lmZGVmIE9QVF9CT0VITV9HQworCisgICAgLyogQ29tcGlsZSB0aGUgQm9laG0gR0MgYXMgb25lIGJpZyBjaHVuayBvZiBjb2RlLiBJdCdzIG11Y2ggZWFzaWVyCisgICAgdGhpcyB3YXksIHRoYW4gdHJ5aW5nIHRvIG1ha2UgcmFkaWNhbCBjaGFuZ2VzIHRvIHRoZSBiamFtIGJ1aWxkCisgICAgc2NyaXB0cy4gKi8KKworICAgICNkZWZpbmUgQVRPTUlDX1VOQ09MTEVDVEFCTEUKKyAgICAjZGVmaW5lIE5PX0VYRUNVVEVfUEVSTUlTU0lPTgorICAgICNkZWZpbmUgQUxMX0lOVEVSSU9SX1BPSU5URVJTCisKKyAgICAjZGVmaW5lIExBUkdFX0NPTkZJRworICAgIC8qCisgICAgI2RlZmluZSBOT19TSUdOQUxTCisgICAgI2RlZmluZSBTSUxFTlQKKyAgICAqLworICAgICNpZm5kZWYgR0NfREVCVUcKKyAgICAjZGVmaW5lIE5PX0RFQlVHR0lORworICAgICNlbmRpZgorCisgICAgI2lmZGVmIF9fR0xJQkNfXworICAgICNkZWZpbmUgX19VU0VfR05VCisgICAgI2VuZGlmCisKKyAgICAjaW5jbHVkZSAiYm9laG1fZ2MvcmVjbGFpbS5jIgorICAgICNpbmNsdWRlICJib2VobV9nYy9hbGxjaGJsay5jIgorICAgICNpbmNsdWRlICJib2VobV9nYy9taXNjLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL2FsbG9jLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL21hY2hfZGVwLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL29zX2RlcC5jIgorICAgICNpbmNsdWRlICJib2VobV9nYy9tYXJrX3J0cy5jIgorICAgICNpbmNsdWRlICJib2VobV9nYy9oZWFkZXJzLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL21hcmsuYyIKKyAgICAjaW5jbHVkZSAiYm9laG1fZ2Mvb2JqX21hcC5jIgorICAgICNpbmNsdWRlICJib2VobV9nYy9wY3JfaW50ZXJmYWNlLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL2JsYWNrbHN0LmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL25ld19oYmxrLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL3JlYWxfbWFsbG9jLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL2R5bl9sb2FkLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL2RiZ19tbGMuYyIKKyAgICAjaW5jbHVkZSAiYm9laG1fZ2MvbWFsbG9jLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL3N0dWJib3JuLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL2NoZWNrc3Vtcy5jIgorICAgICNpbmNsdWRlICJib2VobV9nYy9wdGhyZWFkX3N1cHBvcnQuYyIKKyAgICAjaW5jbHVkZSAiYm9laG1fZ2MvcHRocmVhZF9zdG9wX3dvcmxkLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL2Rhcndpbl9zdG9wX3dvcmxkLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL3R5cGRfbWxjLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL3B0cl9jaGNrLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL21hbGxvY3guYyIKKyAgICAjaW5jbHVkZSAiYm9laG1fZ2MvZ2NqX21sYy5jIgorICAgICNpbmNsdWRlICJib2VobV9nYy9zcGVjaWZpYy5jIgorICAgICNpbmNsdWRlICJib2VobV9nYy9nY19kbG9wZW4uYyIKKyAgICAjaW5jbHVkZSAiYm9laG1fZ2MvYmFja2dyYXBoLmMiCisgICAgI2luY2x1ZGUgImJvZWhtX2djL3dpbjMyX3RocmVhZHMuYyIKKworICAgIC8qIE5lZWRzIHRvIGJlIGxhc3QuICovCisgICAgI2luY2x1ZGUgImJvZWhtX2djL2ZpbmFsaXplLmMiCisKKyNlbGlmIGRlZmluZWQoT1BUX0RVTUEpCisKKyAgICAjaWZkZWYgT1NfTlQKKyAgICAgICAgI2RlZmluZSBXSU4zMgorICAgICNlbmRpZgorICAgICNpbmNsdWRlICJkdW1hL2R1bWEuYyIKKyAgICAjaW5jbHVkZSAiZHVtYS9wcmludC5jIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21lbS5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxOGIwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21lbS5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDYuIFJlbmUgUml2ZXJhCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgKiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworI2lmbmRlZiBCSkFNX01FTV9ICisjZGVmaW5lIEJKQU1fTUVNX0gKKworI2lmZGVmIE9QVF9CT0VITV9HQworCisgICAgLyogVXNlIEJvZWhtIEdDIG1lbW9yeSBhbGxvY2F0b3IuICovCisgICAgI2luY2x1ZGUgPGdjLmg+CisKKyAgICAjZGVmaW5lIGJqYW1fbWFsbG9jX3gocykgbWVtc2V0KEdDX21hbGxvYyhzKSwwLHMpCisgICAgI2RlZmluZSBiamFtX21hbGxvY19hdG9taWNfeChzKSBtZW1zZXQoR0NfbWFsbG9jX2F0b21pYyhzKSwwLHMpCisgICAgI2RlZmluZSBiamFtX2NhbGxvY194KG4scykgbWVtc2V0KEdDX21hbGxvYygobikqKHMpKSwwLChuKSoocykpCisgICAgI2RlZmluZSBiamFtX2NhbGxvY19hdG9taWNfeChuLHMpIG1lbXNldChHQ19tYWxsb2NfYXRvbWljKChuKSoocykpLDAsKG4pKihzKSkKKyAgICAjZGVmaW5lIGJqYW1fcmVhbGxvY194KHAscykgR0NfcmVhbGxvYyhwLHMpCisgICAgI2RlZmluZSBiamFtX2ZyZWVfeChwKSBHQ19mcmVlKHApCisgICAgI2RlZmluZSBiamFtX21lbV9pbml0X3goKSBHQ19pbml0KCk7IEdDX2VuYWJsZV9pbmNyZW1lbnRhbCgpCisKKyAgICAjZGVmaW5lIGJqYW1fbWFsbG9jX3Jhd194KHMpIG1hbGxvYyhzKQorICAgICNkZWZpbmUgYmphbV9jYWxsb2NfcmF3X3gobixzKSBjYWxsb2MobixzKQorICAgICNkZWZpbmUgYmphbV9yZWFsbG9jX3Jhd194KHAscykgcmVhbGxvYyhwLHMpCisgICAgI2RlZmluZSBiamFtX2ZyZWVfcmF3X3gocCkgZnJlZShwKQorCisgICAgI2lmbmRlZiBCSkFNX05FV1NUUl9OT19BTExPQ0FURQorICAgICMgZGVmaW5lIEJKQU1fTkVXU1RSX05PX0FMTE9DQVRFCisgICAgI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoIE9QVF9EVU1BICkKKworICAgIC8qIFVzZSBEdW1hIG1lbW9yeSBkZWJ1Z2dpbmcgbGlicmFyeS4gKi8KKyAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisKKyAgICAjZGVmaW5lIF9EVU1BX0NPTkZJR19IXworICAgICNkZWZpbmUgRFVNQV9OT19HTE9CQUxfTUFMTE9DX0ZSRUUKKyAgICAjZGVmaW5lIERVTUFfRVhQTElDSVRfSU5JVAorICAgICNkZWZpbmUgRFVNQV9OT19USFJFQURfU0FGRVRZCisgICAgI2RlZmluZSBEVU1BX05PX0NQUF9TVVBQT1JUCisgICAgLyogI2RlZmluZSBEVU1BX05PX0xFQUtERVRFQ1RJT04gKi8KKyAgICAvKiAjZGVmaW5lIERVTUFfVVNFX0ZSQU1FTk8gKi8KKyAgICAvKiAjZGVmaW5lIERVTUFfUFJFRkVSX0FURVhJVCAqLworICAgIC8qICNkZWZpbmUgRFVNQV9PTERfREVMX01BQ1JPICovCisgICAgLyogI2RlZmluZSBEVU1BX05PX0hBTkdfTVNHICovCisgICAgI2RlZmluZSBEVU1BX1BBR0VfU0laRSA0MDk2CisgICAgI2RlZmluZSBEVU1BX01JTl9BTElHTk1FTlQgMQorICAgIC8qICNkZWZpbmUgRFVNQV9HTlVfSU5JVF9BVFRSIDAgKi8KKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBEVU1BX0FERFI7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgRFVNQV9TSVpFOworICAgICNpbmNsdWRlIDxkdW1hLmg+CisKKyAgICAjZGVmaW5lIGJqYW1fbWFsbG9jX3gocykgbWFsbG9jKHMpCisgICAgI2RlZmluZSBiamFtX2NhbGxvY194KG4scykgY2FsbG9jKG4scykKKyAgICAjZGVmaW5lIGJqYW1fcmVhbGxvY194KHAscykgcmVhbGxvYyhwLHMpCisgICAgI2RlZmluZSBiamFtX2ZyZWVfeChwKSBmcmVlKHApCisKKyAgICAjaWZuZGVmIEJKQU1fTkVXU1RSX05PX0FMTE9DQVRFCisgICAgIyBkZWZpbmUgQkpBTV9ORVdTVFJfTk9fQUxMT0NBVEUKKyAgICAjZW5kaWYKKworI2Vsc2UKKworICAgIC8qIFN0YW5kYXJkIEMgbWVtb3J5IGFsbG9jYXRpb24uICovCisgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisgICAgI2RlZmluZSBiamFtX21hbGxvY194KHMpIG1hbGxvYyhzKQorICAgICNkZWZpbmUgYmphbV9jYWxsb2NfeChuLHMpIGNhbGxvYyhuLHMpCisgICAgI2RlZmluZSBiamFtX3JlYWxsb2NfeChwLHMpIHJlYWxsb2MocCxzKQorICAgICNkZWZpbmUgYmphbV9mcmVlX3gocCkgZnJlZShwKQorCisjZW5kaWYKKworI2lmbmRlZiBiamFtX21hbGxvY19hdG9taWNfeAorICAgICNkZWZpbmUgYmphbV9tYWxsb2NfYXRvbWljX3gocykgYmphbV9tYWxsb2NfeChzKQorI2VuZGlmCisjaWZuZGVmIGJqYW1fY2FsbG9jX2F0b21pY194CisgICAgI2RlZmluZSBiamFtX2NhbGxvY19hdG9taWNfeChuLHMpIGJqYW1fY2FsbG9jX3gobixzKQorI2VuZGlmCisjaWZuZGVmIGJqYW1fbWVtX2luaXRfeAorICAgICNkZWZpbmUgYmphbV9tZW1faW5pdF94KCkKKyNlbmRpZgorI2lmbmRlZiBiamFtX21lbV9jbG9zZV94CisgICAgI2RlZmluZSBiamFtX21lbV9jbG9zZV94KCkKKyNlbmRpZgorI2lmbmRlZiBiamFtX21hbGxvY19yYXdfeAorICAgICNkZWZpbmUgYmphbV9tYWxsb2NfcmF3X3gocykgYmphbV9tYWxsb2NfeChzKQorI2VuZGlmCisjaWZuZGVmIGJqYW1fY2FsbG9jX3Jhd194CisgICAgI2RlZmluZSBiamFtX2NhbGxvY19yYXdfeChuLHMpIGJqYW1fY2FsbG9jX3gobixzKQorI2VuZGlmCisjaWZuZGVmIGJqYW1fcmVhbGxvY19yYXdfeAorICAgICNkZWZpbmUgYmphbV9yZWFsbG9jX3Jhd194KHAscykgYmphbV9yZWFsbG9jX3gocCxzKQorI2VuZGlmCisjaWZuZGVmIGJqYW1fZnJlZV9yYXdfeAorICAgICNkZWZpbmUgYmphbV9mcmVlX3Jhd194KHApIGJqYW1fZnJlZV94KHApCisjZW5kaWYKKworI2lmZGVmIE9QVF9ERUJVR19QUk9GSUxFCisgICAgLyogUHJvZmlsZSB0cmFjaW5nIG9mIG1lbW9yeSBhbGxvY2F0aW9ucy4gKi8KKyAgICAjaW5jbHVkZSAiZGVidWcuaCIKKworICAgICNkZWZpbmUgQkpBTV9NQUxMT0MocykgKHByb2ZpbGVfbWVtb3J5KHMpLCBiamFtX21hbGxvY194KHMpKQorICAgICNkZWZpbmUgQkpBTV9NQUxMT0NfQVRPTUlDKHMpIChwcm9maWxlX21lbW9yeShzKSwgYmphbV9tYWxsb2NfYXRvbWljX3gocykpCisgICAgI2RlZmluZSBCSkFNX0NBTExPQyhuLHMpIChwcm9maWxlX21lbW9yeShuKnMpLCBiamFtX2NhbGxvY194KG4scykpCisgICAgI2RlZmluZSBCSkFNX0NBTExPQ19BVE9NSUMobixzKSAocHJvZmlsZV9tZW1vcnkobipzKSwgYmphbV9jYWxsb2NfYXRvbWljX3gobixzKSkKKyAgICAjZGVmaW5lIEJKQU1fUkVBTExPQyhwLHMpIChwcm9maWxlX21lbW9yeShzKSwgYmphbV9yZWFsbG9jX3gocCxzKSkKKworICAgICNkZWZpbmUgQkpBTV9NQUxMT0NfUkFXKHMpIChwcm9maWxlX21lbW9yeShzKSwgYmphbV9tYWxsb2NfcmF3X3gocykpCisgICAgI2RlZmluZSBCSkFNX0NBTExPQ19SQVcobixzKSAocHJvZmlsZV9tZW1vcnkobipzKSwgYmphbV9jYWxsb2NfcmF3X3gobixzKSkKKyAgICAjZGVmaW5lIEJKQU1fUkVBTExPQ19SQVcocCxzKSAocHJvZmlsZV9tZW1vcnkocyksIGJqYW1fcmVhbGxvY19yYXdfeChwLHMpKQorI2Vsc2UKKyAgICAvKiBObyBtZW0gdHJhY2luZy4gKi8KKyAgICAjZGVmaW5lIEJKQU1fTUFMTE9DKHMpIGJqYW1fbWFsbG9jX3gocykKKyAgICAjZGVmaW5lIEJKQU1fTUFMTE9DX0FUT01JQyhzKSBiamFtX21hbGxvY19hdG9taWNfeChzKQorICAgICNkZWZpbmUgQkpBTV9DQUxMT0MobixzKSBiamFtX2NhbGxvY194KG4scykKKyAgICAjZGVmaW5lIEJKQU1fQ0FMTE9DX0FUT01JQyhuLHMpIGJqYW1fY2FsbG9jX2F0b21pY194KG4scykKKyAgICAjZGVmaW5lIEJKQU1fUkVBTExPQyhwLHMpIGJqYW1fcmVhbGxvY194KHAscykKKworICAgICNkZWZpbmUgQkpBTV9NQUxMT0NfUkFXKHMpIGJqYW1fbWFsbG9jX3Jhd194KHMpCisgICAgI2RlZmluZSBCSkFNX0NBTExPQ19SQVcobixzKSBiamFtX2NhbGxvY19yYXdfeChuLHMpCisgICAgI2RlZmluZSBCSkFNX1JFQUxMT0NfUkFXKHAscykgYmphbV9yZWFsbG9jX3Jhd194KHAscykKKyNlbmRpZgorCisjZGVmaW5lIEJKQU1fTUVNX0lOSVQoKSBiamFtX21lbV9pbml0X3goKQorI2RlZmluZSBCSkFNX01FTV9DTE9TRSgpIGJqYW1fbWVtX2Nsb3NlX3goKQorCisjZGVmaW5lIEJKQU1fRlJFRShwKSBiamFtX2ZyZWVfeChwKQorI2RlZmluZSBCSkFNX0ZSRUVfUkFXKHApIGJqYW1fZnJlZV9yYXdfeChwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21ramFtYmFzZS5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbWtqYW1iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmNTk5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21ramFtYmFzZS5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTMsIDE5OTUgQ2hyaXN0b3BoZXIgU2Vpd2FsZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiAgVGhpcyBmaWxlIGlzIEFMU086CisgKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyAqICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKy8qCisgKiBta2phbWJhc2UuYyAtIHR1cm4gSmFtYmFzZSBpbnRvIGEgYmlnIEMgc3RydWN0dXJlCisgKgorICogVXNhZ2U6IG1ramFtYmFzZSBqYW1iYXNlLmMgSmFtYmFzZSAuLi4KKyAqCisgKiBSZXN1bHRzIGxvb2sgbGlrZSB0aGlzOgorICoKKyAqICAgY2hhciAqamFtYmFzZVtdID0geworICogICAiLi4uXG4iLAorICogICAuLi4KKyAqICAgMCB9OworICoKKyAqIEhhbmRsZXMgXCdzIGFuZCAiJ3Mgc3BlY2lhbGx5OyBrbm93cyB0byBkZWxldGUgYmxhbmsgYW5kIGNvbW1lbnQgbGluZXMuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciAqICogYXJndiwgY2hhciAqICogZW52cCApCit7CisgICAgY2hhciBidWZbIDEwMjQgXTsKKyAgICBGSUxFICogZmluOworICAgIEZJTEUgKiBmb3V0OworICAgIGNoYXIgKiBwOworICAgIGludCBkb0RvdEMgPSAwOworCisgICAgaWYgKCBhcmdjIDwgMyApCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJ1c2FnZTogJXMgamFtYmFzZS5jIEphbWJhc2UgLi4uXG4iLCBhcmd2WyAwIF0gKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICggISggZm91dCA9IGZvcGVuKCBhcmd2WzFdLCAidyIgKSApICkKKyAgICB7CisgICAgICAgIHBlcnJvciggYXJndlsgMSBdICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBJZiB0aGUgZmlsZSBlbmRzIGluIC5jIGdlbmVyYXRlIGEgQyBzb3VyY2UgZmlsZS4gKi8KKyAgICBpZiAoICggcCA9IHN0cnJjaHIoIGFyZ3ZbMV0sICcuJyApICkgJiYgIXN0cmNtcCggcCwgIi5jIiApICkKKyAgICAgICAgZG9Eb3RDKys7CisKKyAgICAvKiBOb3cgcHJvY2VzcyB0aGUgZmlsZXMuICovCisKKyAgICBhcmdjIC09IDI7CisgICAgYXJndiArPSAyOworCisgICAgaWYgKCBkb0RvdEMgKQorICAgIHsKKyAgICAgICAgZnByaW50ZiggZm91dCwgIi8qIEdlbmVyYXRlZCBieSBta2phbWJhc2UgZnJvbSBKYW1iYXNlICovXG4iICk7CisgICAgICAgIGZwcmludGYoIGZvdXQsICJjaGFyICpqYW1iYXNlW10gPSB7XG4iICk7CisgICAgfQorCisgICAgZm9yICggOyBhcmdjLS07ICsrYXJndiApCisgICAgeworICAgICAgICBpZiAoICEoIGZpbiA9IGZvcGVuKCAqYXJndiwgInIiICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBlcnJvciggKmFyZ3YgKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggZG9Eb3RDICkKKyAgICAgICAgICAgIGZwcmludGYoIGZvdXQsICIvKiAlcyAqL1xuIiwgKmFyZ3YgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZiggZm91dCwgIiMjIyAlcyAjIyNcbiIsICphcmd2ICk7CisKKyAgICAgICAgd2hpbGUgKCBmZ2V0cyggYnVmLCBzaXplb2YoIGJ1ZiApLCBmaW4gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZG9Eb3RDICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyICogcCA9IGJ1ZjsKKworICAgICAgICAgICAgICAgIC8qIFN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoICggKnAgPT0gJyAnICkgfHwgKCAqcCA9PSAnXHQnICkgfHwgKCAqcCA9PSAnXG4nICkgKQorICAgICAgICAgICAgICAgICAgICArK3A7CisKKyAgICAgICAgICAgICAgICAvKiBEcm9wIGNvbW1lbnRzIGFuZCBlbXB0eSBsaW5lcy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoICggKnAgPT0gJyMnICkgfHwgISpwICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAvKiBDb3B5LiAqLworICAgICAgICAgICAgICAgIHB1dGMoICciJywgZm91dCApOworICAgICAgICAgICAgICAgIGZvciAoIDsgKnAgJiYgKCAqcCAhPSAnXG4nICk7ICsrcCApCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoICpwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOiBwdXRjKCAnXFwnLCBmb3V0ICk7IHB1dGMoICdcXCcsIGZvdXQgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICciJyA6IHB1dGMoICdcXCcsIGZvdXQgKTsgcHV0YyggJyInICwgZm91dCApOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzogYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBwdXRjKCAqcCwgZm91dCApOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZnByaW50ZiggZm91dCwgIlxcblwiLFxuIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoIGZvdXQsICIlcyIsIGJ1ZiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmNsb3NlKCBmaW4gKTsKKyAgICB9CisKKyAgICBpZiAoIGRvRG90QyApCisgICAgICAgIGZwcmludGYoIGZvdXQsICIwIH07XG4iICk7CisKKyAgICBmY2xvc2UoIGZvdXQgKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbW9kdWxlcy5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbW9kdWxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZTgyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tb2R1bGVzLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA0IERhdmlkIEFicmFoYW1zLgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKyNpbmNsdWRlICJqYW0uaCIKKyNpbmNsdWRlICJtb2R1bGVzLmgiCisKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAibGlzdHMuaCIKKyNpbmNsdWRlICJuYXRpdmUuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJwYXJzZS5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisjaW5jbHVkZSAic3RyaW5ncy5oIgorI2luY2x1ZGUgInZhcmlhYmxlLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIHN0cnVjdCBoYXNoICogbW9kdWxlX2hhc2ggPSAwOworc3RhdGljIG1vZHVsZV90IHJvb3Q7CisKKworbW9kdWxlX3QgKiBiaW5kbW9kdWxlKCBPQkpFQ1QgKiBuYW1lICkKK3sKKyAgICBpZiAoICFuYW1lICkKKyAgICAgICAgcmV0dXJuICZyb290OworCisgICAgeworICAgICAgICBQUk9GSUxFX0VOVEVSKCBCSU5ETU9EVUxFICk7CisKKyAgICAgICAgbW9kdWxlX3QgKiBtOworICAgICAgICBpbnQgZm91bmQ7CisKKyAgICAgICAgaWYgKCAhbW9kdWxlX2hhc2ggKQorICAgICAgICAgICAgbW9kdWxlX2hhc2ggPSBoYXNoaW5pdCggc2l6ZW9mKCBtb2R1bGVfdCApLCAibW9kdWxlcyIgKTsKKworICAgICAgICBtID0gKG1vZHVsZV90ICopaGFzaF9pbnNlcnQoIG1vZHVsZV9oYXNoLCBuYW1lLCAmZm91bmQgKTsKKyAgICAgICAgaWYgKCAhZm91bmQgKQorICAgICAgICB7CisgICAgICAgICAgICBtLT5uYW1lID0gb2JqZWN0X2NvcHkoIG5hbWUgKTsKKyAgICAgICAgICAgIG0tPnZhcmlhYmxlcyA9IDA7CisgICAgICAgICAgICBtLT52YXJpYWJsZV9pbmRpY2VzID0gMDsKKyAgICAgICAgICAgIG0tPm51bV9maXhlZF92YXJpYWJsZXMgPSAwOworICAgICAgICAgICAgbS0+Zml4ZWRfdmFyaWFibGVzID0gMDsKKyAgICAgICAgICAgIG0tPnJ1bGVzID0gMDsKKyAgICAgICAgICAgIG0tPmltcG9ydGVkX21vZHVsZXMgPSAwOworICAgICAgICAgICAgbS0+Y2xhc3NfbW9kdWxlID0gMDsKKyAgICAgICAgICAgIG0tPm5hdGl2ZV9ydWxlcyA9IDA7CisgICAgICAgICAgICBtLT51c2VyX21vZHVsZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBQUk9GSUxFX0VYSVQoIEJJTkRNT0RVTEUgKTsKKworICAgICAgICByZXR1cm4gbTsKKyAgICB9Cit9CisKKworLyoKKyAqIGRlbWFuZF9ydWxlcygpIC0gR2V0IHRoZSBtb2R1bGUncyAicnVsZXMiIGhhc2ggb24gZGVtYW5kLgorICovCitzdHJ1Y3QgaGFzaCAqIGRlbWFuZF9ydWxlcyggbW9kdWxlX3QgKiBtICkKK3sKKyAgICBpZiAoICFtLT5ydWxlcyApCisgICAgICAgIG0tPnJ1bGVzID0gaGFzaGluaXQoIHNpemVvZiggUlVMRSApLCAicnVsZXMiICk7CisgICAgcmV0dXJuIG0tPnJ1bGVzOworfQorCisKKy8qCisgKiBkZWxldGVfbW9kdWxlKCkgLSB3aXBlIG91dCB0aGUgbW9kdWxlJ3MgcnVsZXMgYW5kIHZhcmlhYmxlcy4KKyAqLworCitzdGF0aWMgdm9pZCBkZWxldGVfcnVsZV8oIHZvaWQgKiB4cnVsZSwgdm9pZCAqIGRhdGEgKQoreworICAgIHJ1bGVfZnJlZSggKFJVTEUgKil4cnVsZSApOworfQorCisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9uYXRpdmVfcnVsZSggdm9pZCAqIHhydWxlLCB2b2lkICogZGF0YSApCit7CisgICAgbmF0aXZlX3J1bGVfdCAqIHJ1bGUgPSAobmF0aXZlX3J1bGVfdCAqKXhydWxlOworICAgIG9iamVjdF9mcmVlKCBydWxlLT5uYW1lICk7CisgICAgaWYgKCBydWxlLT5wcm9jZWR1cmUgKQorICAgICAgICBmdW5jdGlvbl9mcmVlKCBydWxlLT5wcm9jZWR1cmUgKTsKK30KKworCitzdGF0aWMgdm9pZCBkZWxldGVfaW1wb3J0ZWRfbW9kdWxlcyggdm9pZCAqIHhtb2R1bGVfbmFtZSwgdm9pZCAqIGRhdGEgKQoreworICAgIG9iamVjdF9mcmVlKCAqKE9CSkVDVCAqICopeG1vZHVsZV9uYW1lICk7Cit9CisKKworc3RhdGljIHZvaWQgZnJlZV9maXhlZF92YXJpYWJsZSggdm9pZCAqIHh2YXIsIHZvaWQgKiBkYXRhICk7CisKK3ZvaWQgZGVsZXRlX21vZHVsZSggbW9kdWxlX3QgKiBtICkKK3sKKyAgICAvKiBDbGVhciBvdXQgYWxsIHRoZSBydWxlcy4gKi8KKyAgICBpZiAoIG0tPnJ1bGVzICkKKyAgICB7CisgICAgICAgIGhhc2hlbnVtZXJhdGUoIG0tPnJ1bGVzLCBkZWxldGVfcnVsZV8sICh2b2lkICopMCApOworICAgICAgICBoYXNoX2ZyZWUoIG0tPnJ1bGVzICk7CisgICAgICAgIG0tPnJ1bGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoIG0tPm5hdGl2ZV9ydWxlcyApCisgICAgeworICAgICAgICBoYXNoZW51bWVyYXRlKCBtLT5uYXRpdmVfcnVsZXMsIGRlbGV0ZV9uYXRpdmVfcnVsZSwgKHZvaWQgKikwICk7CisgICAgICAgIGhhc2hfZnJlZSggbS0+bmF0aXZlX3J1bGVzICk7CisgICAgICAgIG0tPm5hdGl2ZV9ydWxlcyA9IDA7CisgICAgfQorCisgICAgaWYgKCBtLT52YXJpYWJsZXMgKQorICAgIHsKKyAgICAgICAgdmFyX2RvbmUoIG0gKTsKKyAgICAgICAgbS0+dmFyaWFibGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoIG0tPmZpeGVkX3ZhcmlhYmxlcyApCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtLT5udW1fZml4ZWRfdmFyaWFibGVzOyArK2kgKQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0X2ZyZWUoIG0tPmZpeGVkX3ZhcmlhYmxlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICAgICAgQkpBTV9GUkVFKCBtLT5maXhlZF92YXJpYWJsZXMgKTsKKyAgICAgICAgbS0+Zml4ZWRfdmFyaWFibGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoIG0tPnZhcmlhYmxlX2luZGljZXMgKQorICAgIHsKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggbS0+dmFyaWFibGVfaW5kaWNlcywgJmZyZWVfZml4ZWRfdmFyaWFibGUsICh2b2lkICopMCApOworICAgICAgICBoYXNoX2ZyZWUoIG0tPnZhcmlhYmxlX2luZGljZXMgKTsKKyAgICAgICAgbS0+dmFyaWFibGVfaW5kaWNlcyA9IDA7CisgICAgfQorCisgICAgaWYgKCBtLT5pbXBvcnRlZF9tb2R1bGVzICkKKyAgICB7CisgICAgICAgIGhhc2hlbnVtZXJhdGUoIG0tPmltcG9ydGVkX21vZHVsZXMsIGRlbGV0ZV9pbXBvcnRlZF9tb2R1bGVzLCAodm9pZCAqKTAgKTsKKyAgICAgICAgaGFzaF9mcmVlKCBtLT5pbXBvcnRlZF9tb2R1bGVzICk7CisgICAgICAgIG0tPmltcG9ydGVkX21vZHVsZXMgPSAwOworICAgIH0KK30KKworCitzdHJ1Y3QgbW9kdWxlX3N0YXRzCit7CisgICAgT0JKRUNUICogbW9kdWxlX25hbWU7CisgICAgc3RydWN0IGhhc2hzdGF0cyBydWxlc19zdGF0c1sgMSBdOworICAgIHN0cnVjdCBoYXNoc3RhdHMgdmFyaWFibGVzX3N0YXRzWyAxIF07CisgICAgc3RydWN0IGhhc2hzdGF0cyB2YXJpYWJsZV9pbmRpY2VzX3N0YXRzWyAxIF07CisgICAgc3RydWN0IGhhc2hzdGF0cyBpbXBvcnRlZF9tb2R1bGVzX3N0YXRzWyAxIF07Cit9OworCisKK3N0YXRpYyB2b2lkIG1vZHVsZV9zdGF0KCBzdHJ1Y3QgaGFzaCAqIGhwLCBPQkpFQ1QgKiBtb2R1bGUsIGNvbnN0IGNoYXIgKiBuYW1lICkKK3sKKyAgICBpZiAoIGhwICkKKyAgICB7CisgICAgICAgIHN0cnVjdCBoYXNoc3RhdHMgc3RhdHNbIDEgXTsKKyAgICAgICAgc3RyaW5nIGlkWyAxIF07CisgICAgICAgIGhhc2hzdGF0c19pbml0KCBzdGF0cyApOworICAgICAgICBzdHJpbmdfbmV3KCBpZCApOworICAgICAgICBzdHJpbmdfYXBwZW5kKCBpZCwgb2JqZWN0X3N0ciggbW9kdWxlICkgKTsKKyAgICAgICAgc3RyaW5nX3B1c2hfYmFjayggaWQsICcgJyApOworICAgICAgICBzdHJpbmdfYXBwZW5kKCBpZCwgbmFtZSApOworCisgICAgICAgIGhhc2hzdGF0c19hZGQoIHN0YXRzLCBocCApOworICAgICAgICBoYXNoc3RhdHNfcHJpbnQoIHN0YXRzLCBpZC0+dmFsdWUgKTsKKworICAgICAgICBzdHJpbmdfZnJlZSggaWQgKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgY2xhc3NfbW9kdWxlX3N0YXQoIHN0cnVjdCBoYXNoc3RhdHMgKiBzdGF0cywgT0JKRUNUICogbW9kdWxlLCBjb25zdCBjaGFyICogbmFtZSApCit7CisgICAgaWYgKCBzdGF0cy0+aXRlbV9zaXplICkKKyAgICB7CisgICAgICAgIHN0cmluZyBpZFsgMSBdOworICAgICAgICBzdHJpbmdfbmV3KCBpZCApOworICAgICAgICBzdHJpbmdfYXBwZW5kKCBpZCwgb2JqZWN0X3N0ciggbW9kdWxlICkgKTsKKyAgICAgICAgc3RyaW5nX2FwcGVuZCggaWQsICIgb2JqZWN0ICIgKTsKKyAgICAgICAgc3RyaW5nX2FwcGVuZCggaWQsIG5hbWUgKTsKKworICAgICAgICBoYXNoc3RhdHNfcHJpbnQoIHN0YXRzLCBpZC0+dmFsdWUgKTsKKworICAgICAgICBzdHJpbmdfZnJlZSggaWQgKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgc3RhdF9tb2R1bGUoIHZvaWQgKiB4bW9kdWxlLCB2b2lkICogZGF0YSApCit7CisgICAgbW9kdWxlX3QgKm0gPSAobW9kdWxlX3QgKil4bW9kdWxlOworCisgICAgaWYgKCBERUJVR19NRU0gfHwgREVCVUdfUFJPRklMRSApCisgICAgeworICAgICAgICBzdHJ1Y3QgaGFzaCAqIGNsYXNzX2luZm8gPSAoc3RydWN0IGhhc2ggKilkYXRhOworICAgICAgICBpZiAoIG0tPmNsYXNzX21vZHVsZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBmb3VuZDsKKyAgICAgICAgICAgIHN0cnVjdCBtb2R1bGVfc3RhdHMgKiBtcyA9IChzdHJ1Y3QgbW9kdWxlX3N0YXRzICopaGFzaF9pbnNlcnQoIGNsYXNzX2luZm8sIG0tPmNsYXNzX21vZHVsZS0+bmFtZSwgJmZvdW5kICk7CisgICAgICAgICAgICBpZiAoICFmb3VuZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXMtPm1vZHVsZV9uYW1lID0gbS0+Y2xhc3NfbW9kdWxlLT5uYW1lOworICAgICAgICAgICAgICAgIGhhc2hzdGF0c19pbml0KCBtcy0+cnVsZXNfc3RhdHMgKTsKKyAgICAgICAgICAgICAgICBoYXNoc3RhdHNfaW5pdCggbXMtPnZhcmlhYmxlc19zdGF0cyApOworICAgICAgICAgICAgICAgIGhhc2hzdGF0c19pbml0KCBtcy0+dmFyaWFibGVfaW5kaWNlc19zdGF0cyApOworICAgICAgICAgICAgICAgIGhhc2hzdGF0c19pbml0KCBtcy0+aW1wb3J0ZWRfbW9kdWxlc19zdGF0cyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYXNoc3RhdHNfYWRkKCBtcy0+cnVsZXNfc3RhdHMsIG0tPnJ1bGVzICk7CisgICAgICAgICAgICBoYXNoc3RhdHNfYWRkKCBtcy0+dmFyaWFibGVzX3N0YXRzLCBtLT52YXJpYWJsZXMgKTsKKyAgICAgICAgICAgIGhhc2hzdGF0c19hZGQoIG1zLT52YXJpYWJsZV9pbmRpY2VzX3N0YXRzLCBtLT52YXJpYWJsZV9pbmRpY2VzICk7CisgICAgICAgICAgICBoYXNoc3RhdHNfYWRkKCBtcy0+aW1wb3J0ZWRfbW9kdWxlc19zdGF0cywgbS0+aW1wb3J0ZWRfbW9kdWxlcyApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbW9kdWxlX3N0YXQoIG0tPnJ1bGVzLCBtLT5uYW1lLCAicnVsZXMiICk7CisgICAgICAgICAgICBtb2R1bGVfc3RhdCggbS0+dmFyaWFibGVzLCBtLT5uYW1lLCAidmFyaWFibGVzIiApOworICAgICAgICAgICAgbW9kdWxlX3N0YXQoIG0tPnZhcmlhYmxlX2luZGljZXMsIG0tPm5hbWUsICJmaXhlZCB2YXJpYWJsZXMiICk7CisgICAgICAgICAgICBtb2R1bGVfc3RhdCggbS0+aW1wb3J0ZWRfbW9kdWxlcywgbS0+bmFtZSwgImltcG9ydGVkIG1vZHVsZXMiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGVfbW9kdWxlKCBtICk7CisgICAgb2JqZWN0X2ZyZWUoIG0tPm5hbWUgKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfY2xhc3Nfc3RhdHMoIHZvaWQgKiB4c3RhdHMsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBzdHJ1Y3QgbW9kdWxlX3N0YXRzICogc3RhdHMgPSAoc3RydWN0IG1vZHVsZV9zdGF0cyAqKXhzdGF0czsKKyAgICBjbGFzc19tb2R1bGVfc3RhdCggc3RhdHMtPnJ1bGVzX3N0YXRzLCBzdGF0cy0+bW9kdWxlX25hbWUsICJydWxlcyIgKTsKKyAgICBjbGFzc19tb2R1bGVfc3RhdCggc3RhdHMtPnZhcmlhYmxlc19zdGF0cywgc3RhdHMtPm1vZHVsZV9uYW1lLCAidmFyaWFibGVzIiApOworICAgIGNsYXNzX21vZHVsZV9zdGF0KCBzdGF0cy0+dmFyaWFibGVfaW5kaWNlc19zdGF0cywgc3RhdHMtPm1vZHVsZV9uYW1lLCAiZml4ZWQgdmFyaWFibGVzIiApOworICAgIGNsYXNzX21vZHVsZV9zdGF0KCBzdGF0cy0+aW1wb3J0ZWRfbW9kdWxlc19zdGF0cywgc3RhdHMtPm1vZHVsZV9uYW1lLCAiaW1wb3J0ZWQgbW9kdWxlcyIgKTsKK30KKworCitzdGF0aWMgdm9pZCBkZWxldGVfbW9kdWxlXyggdm9pZCAqIHhtb2R1bGUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBtb2R1bGVfdCAqbSA9IChtb2R1bGVfdCAqKXhtb2R1bGU7CisKKyAgICBkZWxldGVfbW9kdWxlKCBtICk7CisgICAgb2JqZWN0X2ZyZWUoIG0tPm5hbWUgKTsKK30KKworCit2b2lkIG1vZHVsZXNfZG9uZSgpCit7CisgICAgaWYgKCBERUJVR19NRU0gfHwgREVCVUdfUFJPRklMRSApCisgICAgeworICAgICAgICBzdHJ1Y3QgaGFzaCAqIGNsYXNzX2hhc2ggPSBoYXNoaW5pdCggc2l6ZW9mKCBzdHJ1Y3QgbW9kdWxlX3N0YXRzICksICJvYmplY3QgaW5mbyIgKTsKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggbW9kdWxlX2hhc2gsIHN0YXRfbW9kdWxlLCAodm9pZCAqKWNsYXNzX2hhc2ggKTsKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggY2xhc3NfaGFzaCwgcHJpbnRfY2xhc3Nfc3RhdHMsICh2b2lkICopMCApOworICAgICAgICBoYXNoX2ZyZWUoIGNsYXNzX2hhc2ggKTsKKyAgICB9CisgICAgaGFzaGVudW1lcmF0ZSggbW9kdWxlX2hhc2gsIGRlbGV0ZV9tb2R1bGVfLCAodm9pZCAqKTAgKTsKKyAgICBoYXNoZG9uZSggbW9kdWxlX2hhc2ggKTsKKyAgICBtb2R1bGVfaGFzaCA9IDA7CisgICAgZGVsZXRlX21vZHVsZSggJnJvb3QgKTsKK30KKworbW9kdWxlX3QgKiByb290X21vZHVsZSgpCit7CisgICAgcmV0dXJuICZyb290OworfQorCisKK3ZvaWQgaW1wb3J0X21vZHVsZSggTElTVCAqIG1vZHVsZV9uYW1lcywgbW9kdWxlX3QgKiB0YXJnZXRfbW9kdWxlICkKK3sKKyAgICBQUk9GSUxFX0VOVEVSKCBJTVBPUlRfTU9EVUxFICk7CisKKyAgICBzdHJ1Y3QgaGFzaCAqIGg7CisgICAgTElTVElURVIgaXRlcjsKKyAgICBMSVNUSVRFUiBlbmQ7CisKKyAgICBpZiAoICF0YXJnZXRfbW9kdWxlLT5pbXBvcnRlZF9tb2R1bGVzICkKKyAgICAgICAgdGFyZ2V0X21vZHVsZS0+aW1wb3J0ZWRfbW9kdWxlcyA9IGhhc2hpbml0KCBzaXplb2YoIGNoYXIgKiApLCAiaW1wb3J0ZWQiCisgICAgICAgICAgICApOworICAgIGggPSB0YXJnZXRfbW9kdWxlLT5pbXBvcnRlZF9tb2R1bGVzOworCisgICAgaXRlciA9IGxpc3RfYmVnaW4oIG1vZHVsZV9uYW1lcyApOworICAgIGVuZCA9IGxpc3RfZW5kKCBtb2R1bGVfbmFtZXMgKTsKKyAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgIHsKKyAgICAgICAgaW50IGZvdW5kOworICAgICAgICBPQkpFQ1QgKiBjb25zdCBzID0gbGlzdF9pdGVtKCBpdGVyICk7CisgICAgICAgIE9CSkVDVCAqICogY29uc3Qgc3MgPSAoT0JKRUNUICogKiloYXNoX2luc2VydCggaCwgcywgJmZvdW5kICk7CisgICAgICAgIGlmICggIWZvdW5kICkKKyAgICAgICAgICAgICpzcyA9IG9iamVjdF9jb3B5KCBzICk7CisgICAgfQorCisgICAgUFJPRklMRV9FWElUKCBJTVBPUlRfTU9EVUxFICk7Cit9CisKKworc3RhdGljIHZvaWQgYWRkX21vZHVsZV9uYW1lKCB2b2lkICogcl8sIHZvaWQgKiByZXN1bHRfICkKK3sKKyAgICBPQkpFQ1QgKiAqIGNvbnN0IHIgPSAoT0JKRUNUICogKilyXzsKKyAgICBMSVNUICogKiBjb25zdCByZXN1bHQgPSAoTElTVCAqICopcmVzdWx0XzsKKyAgICAqcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soICpyZXN1bHQsIG9iamVjdF9jb3B5KCAqciApICk7Cit9CisKKworTElTVCAqIGltcG9ydGVkX21vZHVsZXMoIG1vZHVsZV90ICogbW9kdWxlICkKK3sKKyAgICBMSVNUICogcmVzdWx0ID0gTDA7CisgICAgaWYgKCBtb2R1bGUtPmltcG9ydGVkX21vZHVsZXMgKQorICAgICAgICBoYXNoZW51bWVyYXRlKCBtb2R1bGUtPmltcG9ydGVkX21vZHVsZXMsIGFkZF9tb2R1bGVfbmFtZSwgJnJlc3VsdCApOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworRlVOQ1RJT04gKiBmdW5jdGlvbl9iaW5kX3ZhcmlhYmxlcyggRlVOQ1RJT04gKiwgbW9kdWxlX3QgKiwgaW50ICogY291bnRlciApOworRlVOQ1RJT04gKiBmdW5jdGlvbl91bmJpbmRfdmFyaWFibGVzKCBGVU5DVElPTiAqICk7CisKK3N0cnVjdCBmaXhlZF92YXJpYWJsZQoreworICAgIE9CSkVDVCAqIGtleTsKKyAgICBpbnQgbjsKK307CisKK3N0cnVjdCBiaW5kX3ZhcnNfdAoreworICAgIG1vZHVsZV90ICogbW9kdWxlOworICAgIGludCBjb3VudGVyOworfTsKKworCitzdGF0aWMgdm9pZCBmcmVlX2ZpeGVkX3ZhcmlhYmxlKCB2b2lkICogeHZhciwgdm9pZCAqIGRhdGEgKQoreworICAgIG9iamVjdF9mcmVlKCAoIChzdHJ1Y3QgZml4ZWRfdmFyaWFibGUgKil4dmFyICktPmtleSApOworfQorCisKK3N0YXRpYyB2b2lkIGJpbmRfdmFyaWFibGVzX2Zvcl9ydWxlKCB2b2lkICogeHJ1bGUsIHZvaWQgKiB4ZGF0YSApCit7CisgICAgUlVMRSAqIHJ1bGUgPSAoUlVMRSAqKXhydWxlOworICAgIHN0cnVjdCBiaW5kX3ZhcnNfdCAqIGRhdGEgPSAoc3RydWN0IGJpbmRfdmFyc190ICopeGRhdGE7CisgICAgaWYgKCBydWxlLT5wcm9jZWR1cmUgJiYgcnVsZS0+bW9kdWxlID09IGRhdGEtPm1vZHVsZSApCisgICAgICAgIHJ1bGUtPnByb2NlZHVyZSA9IGZ1bmN0aW9uX2JpbmRfdmFyaWFibGVzKCBydWxlLT5wcm9jZWR1cmUsCisgICAgICAgICAgICBkYXRhLT5tb2R1bGUsICZkYXRhLT5jb3VudGVyICk7Cit9CisKKwordm9pZCBtb2R1bGVfYmluZF92YXJpYWJsZXMoIHN0cnVjdCBtb2R1bGVfdCAqIG0gKQoreworICAgIGlmICggbSAhPSByb290X21vZHVsZSgpICYmIG0tPnJ1bGVzICkKKyAgICB7CisgICAgICAgIHN0cnVjdCBiaW5kX3ZhcnNfdCBkYXRhOworICAgICAgICBkYXRhLm1vZHVsZSA9IG07CisgICAgICAgIGRhdGEuY291bnRlciA9IG0tPm51bV9maXhlZF92YXJpYWJsZXM7CisgICAgICAgIGhhc2hlbnVtZXJhdGUoIG0tPnJ1bGVzLCAmYmluZF92YXJpYWJsZXNfZm9yX3J1bGUsICZkYXRhICk7CisgICAgICAgIG1vZHVsZV9zZXRfZml4ZWRfdmFyaWFibGVzKCBtLCBkYXRhLmNvdW50ZXIgKTsKKyAgICB9Cit9CisKKworaW50IG1vZHVsZV9hZGRfZml4ZWRfdmFyKCBzdHJ1Y3QgbW9kdWxlX3QgKiBtLCBPQkpFQ1QgKiBuYW1lLCBpbnQgKiBjb3VudGVyICkKK3sKKyAgICBzdHJ1Y3QgZml4ZWRfdmFyaWFibGUgKiB2OworICAgIGludCBmb3VuZDsKKworICAgIGFzc2VydCggIW0tPmNsYXNzX21vZHVsZSApOworCisgICAgaWYgKCAhbS0+dmFyaWFibGVfaW5kaWNlcyApCisgICAgICAgIG0tPnZhcmlhYmxlX2luZGljZXMgPSBoYXNoaW5pdCggc2l6ZW9mKCBzdHJ1Y3QgZml4ZWRfdmFyaWFibGUgKSwgInZhcmlhYmxlIGluZGV4IHRhYmxlIiApOworCisgICAgdiA9IChzdHJ1Y3QgZml4ZWRfdmFyaWFibGUgKiloYXNoX2luc2VydCggbS0+dmFyaWFibGVfaW5kaWNlcywgbmFtZSwgJmZvdW5kICk7CisgICAgaWYgKCAhZm91bmQgKQorICAgIHsKKyAgICAgICAgdi0+a2V5ID0gb2JqZWN0X2NvcHkoIG5hbWUgKTsKKyAgICAgICAgdi0+biA9ICgqY291bnRlcikrKzsKKyAgICB9CisKKyAgICByZXR1cm4gdi0+bjsKK30KKworCitMSVNUICogdmFyX2dldF9hbmRfY2xlYXJfcmF3KCBtb2R1bGVfdCAqIG0sIE9CSkVDVCAqIG5hbWUgKTsKKworc3RhdGljIHZvaWQgbG9hZF9maXhlZF92YXJpYWJsZSggdm9pZCAqIHh2YXIsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBzdHJ1Y3QgZml4ZWRfdmFyaWFibGUgKiB2YXIgPSAoc3RydWN0IGZpeGVkX3ZhcmlhYmxlICopeHZhcjsKKyAgICBzdHJ1Y3QgbW9kdWxlX3QgKiBtID0gKHN0cnVjdCBtb2R1bGVfdCAqKWRhdGE7CisgICAgaWYgKCB2YXItPm4gPj0gbS0+bnVtX2ZpeGVkX3ZhcmlhYmxlcyApCisgICAgICAgIG0tPmZpeGVkX3ZhcmlhYmxlc1sgdmFyLT5uIF0gPSB2YXJfZ2V0X2FuZF9jbGVhcl9yYXcoIG0sIHZhci0+a2V5ICk7Cit9CisKKwordm9pZCBtb2R1bGVfc2V0X2ZpeGVkX3ZhcmlhYmxlcyggc3RydWN0IG1vZHVsZV90ICogbSwgaW50IG5fdmFyaWFibGVzICkKK3sKKyAgICAvKiBSZWFsbG9jYXRlICovCisgICAgc3RydWN0IGhhc2ggKiB2YXJpYWJsZV9pbmRpY2VzOworICAgIExJU1QgKiAqIGZpeGVkX3ZhcmlhYmxlcyA9IEJKQU1fTUFMTE9DKCBuX3ZhcmlhYmxlcyAqIHNpemVvZiggTElTVCAqICkgKTsKKyAgICBpZiAoIG0tPmZpeGVkX3ZhcmlhYmxlcyApCisgICAgeworICAgICAgICBtZW1jcHkoIGZpeGVkX3ZhcmlhYmxlcywgbS0+Zml4ZWRfdmFyaWFibGVzLCBtLT5udW1fZml4ZWRfdmFyaWFibGVzICogc2l6ZW9mKCBMSVNUICogKSApOworICAgICAgICBCSkFNX0ZSRUUoIG0tPmZpeGVkX3ZhcmlhYmxlcyApOworICAgIH0KKyAgICBtLT5maXhlZF92YXJpYWJsZXMgPSBmaXhlZF92YXJpYWJsZXM7CisgICAgdmFyaWFibGVfaW5kaWNlcyA9IG0tPmNsYXNzX21vZHVsZQorICAgICAgICA/IG0tPmNsYXNzX21vZHVsZS0+dmFyaWFibGVfaW5kaWNlcworICAgICAgICA6IG0tPnZhcmlhYmxlX2luZGljZXM7CisgICAgaWYgKCB2YXJpYWJsZV9pbmRpY2VzICkKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggdmFyaWFibGVfaW5kaWNlcywgJmxvYWRfZml4ZWRfdmFyaWFibGUsIG0gKTsKKyAgICBtLT5udW1fZml4ZWRfdmFyaWFibGVzID0gbl92YXJpYWJsZXM7Cit9CisKKworaW50IG1vZHVsZV9nZXRfZml4ZWRfdmFyKCBzdHJ1Y3QgbW9kdWxlX3QgKiBtXywgT0JKRUNUICogbmFtZSApCit7CisgICAgc3RydWN0IGZpeGVkX3ZhcmlhYmxlICogdjsKKyAgICBzdHJ1Y3QgbW9kdWxlX3QgKiBtID0gbV87CisKKyAgICBpZiAoIG0tPmNsYXNzX21vZHVsZSApCisgICAgICAgIG0gPSBtLT5jbGFzc19tb2R1bGU7CisKKyAgICBpZiAoICFtLT52YXJpYWJsZV9pbmRpY2VzICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgdiA9IChzdHJ1Y3QgZml4ZWRfdmFyaWFibGUgKiloYXNoX2ZpbmQoIG0tPnZhcmlhYmxlX2luZGljZXMsIG5hbWUgKTsKKyAgICByZXR1cm4gdiAmJiB2LT5uIDwgbV8tPm51bV9maXhlZF92YXJpYWJsZXMgPyB2LT5uIDogLTE7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tb2R1bGVzLmggYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tb2R1bGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxNjFjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21vZHVsZXMuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworI2lmbmRlZiBNT0RVTEVTX0RXQTEwMTgyMDAxX0gKKyNkZWZpbmUgTU9EVUxFU19EV0ExMDE4MjAwMV9ICisKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorCit0eXBlZGVmIHN0cnVjdCBtb2R1bGVfdCBtb2R1bGVfdCA7CitzdHJ1Y3QgbW9kdWxlX3QKK3sKKyAgICBPQkpFQ1QgKiBuYW1lOworICAgIHN0cnVjdCBoYXNoICogcnVsZXM7CisgICAgc3RydWN0IGhhc2ggKiB2YXJpYWJsZXM7CisgICAgc3RydWN0IGhhc2ggKiB2YXJpYWJsZV9pbmRpY2VzOworICAgIGludCBudW1fZml4ZWRfdmFyaWFibGVzOworICAgIExJU1QgKiAqIGZpeGVkX3ZhcmlhYmxlczsKKyAgICBzdHJ1Y3QgaGFzaCAqIGltcG9ydGVkX21vZHVsZXM7CisgICAgbW9kdWxlX3QgKiBjbGFzc19tb2R1bGU7CisgICAgc3RydWN0IGhhc2ggKiBuYXRpdmVfcnVsZXM7CisgICAgaW50IHVzZXJfbW9kdWxlOworfTsKKworbW9kdWxlX3QgKiBiaW5kbW9kdWxlKCBPQkpFQ1QgKiBuYW1lICk7Cittb2R1bGVfdCAqIHJvb3RfbW9kdWxlKCk7Cit2b2lkIGRlbGV0ZV9tb2R1bGUoIG1vZHVsZV90ICogKTsKKwordm9pZCBpbXBvcnRfbW9kdWxlKCBMSVNUICogbW9kdWxlX25hbWVzLCBtb2R1bGVfdCAqIHRhcmdldF9tb2R1bGUgKTsKK0xJU1QgKiBpbXBvcnRlZF9tb2R1bGVzKCBtb2R1bGVfdCAqICk7CisKK3N0cnVjdCBoYXNoICogZGVtYW5kX3J1bGVzKCBtb2R1bGVfdCAqICk7CisKK3ZvaWQgbW9kdWxlX2JpbmRfdmFyaWFibGVzKCBtb2R1bGVfdCAqICk7CisKKy8qCisgKiBBZnRlciBjYWxsaW5nIG1vZHVsZV9hZGRfZml4ZWRfdmFyLCBtb2R1bGVfc2V0X2ZpeGVkX3ZhcmlhYmxlcyBtdXN0IGJlIGNhbGxlZAorICogYmVmb3JlIGFjY2Vzc2luZyBhbnkgdmFyaWFibGVzIGluIHRoZSBtb2R1bGUuCisgKi8KK2ludCBtb2R1bGVfYWRkX2ZpeGVkX3ZhciggbW9kdWxlX3QgKiwgT0JKRUNUICogbmFtZSwgaW50ICogbiApOwordm9pZCBtb2R1bGVfc2V0X2ZpeGVkX3ZhcmlhYmxlcyggbW9kdWxlX3QgKiwgaW50IG4gKTsKKworLyoKKyAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSB2YXJpYWJsZSBvciAtMSBpZiBub25lIGV4aXN0cy4KKyAqLworaW50IG1vZHVsZV9nZXRfZml4ZWRfdmFyKCBtb2R1bGVfdCAqLCBPQkpFQ1QgKiBuYW1lICk7CisKK3ZvaWQgbW9kdWxlc19kb25lKCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbW9kdWxlcy9vcmRlci5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbW9kdWxlcy9vcmRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhODNkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tb2R1bGVzL29yZGVyLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qIENvcHlyaWdodCAyMDA0LiBWbGFkaW1pciBQcnVzCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgKiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworI2luY2x1ZGUgIi4uL2xpc3RzLmgiCisjaW5jbHVkZSAiLi4vbWVtLmgiCisjaW5jbHVkZSAiLi4vbmF0aXZlLmgiCisjaW5jbHVkZSAiLi4vb2JqZWN0LmgiCisjaW5jbHVkZSAiLi4vc3RyaW5ncy5oIgorI2luY2x1ZGUgIi4uL3ZhcmlhYmxlLmgiCisKKworLyogVXNlIHF1aXRlIGtsdWd5IGFwcHJvYWNoOiB3aGVuIHdlIGFkZCBvcmRlciBkZXBlbmRlbmN5IGZyb20gJ2EnIHRvICdiJywganVzdAorICogYXBwZW5kICdiJyB0byBvZiB2YWx1ZSBvZiB2YXJpYWJsZSAnYScuCisgKi8KK0xJU1QgKiBhZGRfcGFpciggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBMSVNUICogYXJnID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsKKyAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggYXJnICk7CisgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIGFyZyApOworICAgIHZhcl9zZXQoIGZyYW1lLT5tb2R1bGUsIGxpc3RfaXRlbSggaXRlciApLCBsaXN0X2NvcHlfcmFuZ2UoIGFyZywgbGlzdF9uZXh0KAorICAgICAgICBpdGVyICksIGVuZCApLCBWQVJfQVBQRU5EICk7CisgICAgcmV0dXJuIEwwOworfQorCisKKy8qIEdpdmVuIGEgbGlzdCBhbmQgYSB2YWx1ZSwgcmV0dXJucyBwb3NpdGlvbiBvZiB0aGF0IHZhbHVlIGluIHRoZSBsaXN0LCBvciAtMQorICogaWYgbm90IGZvdW5kLgorICovCitpbnQgbGlzdF9pbmRleCggTElTVCAqIGxpc3QsIE9CSkVDVCAqIHZhbHVlICkKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggbGlzdCApOworICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCBsaXN0ICk7CisgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApLCArK3Jlc3VsdCApCisgICAgICAgIGlmICggb2JqZWN0X2VxdWFsKCBsaXN0X2l0ZW0oIGl0ZXIgKSwgdmFsdWUgKSApCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiAtMTsKK30KKworZW51bSBjb2xvcnMgeyB3aGl0ZSwgZ3JheSwgYmxhY2sgfTsKKworCisvKiBNYWluIHJvdXRpbmUgZm9yIHRvcG9sb2dpY2FsIHNvcnQuIENhbGxzIGl0c2VsZiByZWN1cnNpdmVseSBvbiBhbGwgYWRqYWNlbnQKKyAqIHZlcnRpY2VzIHdoaWNoIHdlcmUgbm90IHlldCB2aXNpdGVkLiBBZnRlciB0aGF0LCAnY3VycmVudF92ZXJ0ZXgnIGlzIGFkZGVkIHRvCisgKiAnKnJlc3VsdF9wdHInLgorICovCit2b2lkIGRvX3RzKCBpbnQgKiAqIGdyYXBoLCBpbnQgY3VycmVudF92ZXJ0ZXgsIGludCAqIGNvbG9ycywgaW50ICogKiByZXN1bHRfcHRyCisgICAgKQoreworICAgIGludCBpOworCisgICAgY29sb3JzWyBjdXJyZW50X3ZlcnRleCBdID0gZ3JheTsKKyAgICBmb3IgKCBpID0gMDsgZ3JhcGhbIGN1cnJlbnRfdmVydGV4IF1bIGkgXSAhPSAtMTsgKytpICkKKyAgICB7CisgICAgICAgIGludCBhZGphY2VudF92ZXJ0ZXggPSBncmFwaFsgY3VycmVudF92ZXJ0ZXggXVsgaSBdOworICAgICAgICBpZiAoIGNvbG9yc1sgYWRqYWNlbnRfdmVydGV4IF0gPT0gd2hpdGUgKQorICAgICAgICAgICAgZG9fdHMoIGdyYXBoLCBhZGphY2VudF92ZXJ0ZXgsIGNvbG9ycywgcmVzdWx0X3B0ciApOworICAgICAgICAvKiBUaGUgdmVydGV4IGlzIGVpdGhlciBibGFjaywgaW4gd2hpY2ggY2FzZSB3ZSBkbyBub3QgaGF2ZSB0byBkbworICAgICAgICAgKiBhbnl0aGluZywgb3IgZ3JheSwgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIGEgbG9vcC4gSWYgd2UgaGF2ZSBhIGxvb3AsCisgICAgICAgICAqIGl0IGlzIG5vdCBjbGVhciB3aGF0IHVzZWZ1bCBkaWFnbm9zdGljIHdlIGNhbiBlbWl0LCBzbyB3ZSBlbWl0CisgICAgICAgICAqIG5vdGhpbmcuCisgICAgICAgICAqLworICAgIH0KKyAgICBjb2xvcnNbIGN1cnJlbnRfdmVydGV4IF0gPSBibGFjazsKKyAgICAqKnJlc3VsdF9wdHIgPSBjdXJyZW50X3ZlcnRleDsKKyAgICAoICpyZXN1bHRfcHRyICkrKzsKK30KKworCit2b2lkIHRvcG9sb2dpY2FsX3NvcnQoIGludCAqICogZ3JhcGgsIGludCBudW1fdmVydGljZXMsIGludCAqIHJlc3VsdCApCit7CisgICAgaW50IGk7CisgICAgaW50ICogY29sb3JzID0gKCBpbnQgKiApQkpBTV9DQUxMT0MoIG51bV92ZXJ0aWNlcywgc2l6ZW9mKCBpbnQgKSApOworICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX3ZlcnRpY2VzOyArK2kgKQorICAgICAgICBjb2xvcnNbIGkgXSA9IHdoaXRlOworCisgICAgZm9yICggaSA9IDA7IGkgPCBudW1fdmVydGljZXM7ICsraSApCisgICAgICAgIGlmICggY29sb3JzWyBpIF0gPT0gd2hpdGUgKQorICAgICAgICAgICAgZG9fdHMoIGdyYXBoLCBpLCBjb2xvcnMsICZyZXN1bHQgKTsKKworICAgIEJKQU1fRlJFRSggY29sb3JzICk7Cit9CisKKworTElTVCAqIG9yZGVyKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIExJU1QgKiBhcmcgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBpbnQgc3JjOworICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCBhcmcgKTsKKyAgICBMSVNUSVRFUiBjb25zdCBlbmQgPSBsaXN0X2VuZCggYXJnICk7CisKKyAgICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIGdyYXBoIG9mIG9yZGVyIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZSBwYXNzZWQKKyAgICAgKiBvYmplY3RzLiBXZSBhc3N1bWUgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZXMgcGFzc2VkIHRvICdhZGRfcGFpcicuCisgICAgICovCisgICAgaW50IGxlbmd0aCA9IGxpc3RfbGVuZ3RoKCBhcmcgKTsKKyAgICBpbnQgKiAqIGdyYXBoID0gKCBpbnQgKiAqIClCSkFNX0NBTExPQyggbGVuZ3RoLCBzaXplb2YoIGludCAqICkgKTsKKyAgICBpbnQgKiBvcmRlciA9ICggaW50ICogKUJKQU1fTUFMTE9DKCAoIGxlbmd0aCArIDEgKSAqIHNpemVvZiggaW50ICkgKTsKKworICAgIGZvciAoIHNyYyA9IDA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICksICsrc3JjICkKKyAgICB7CisgICAgICAgIC8qIEZvciBhbGwgb2JqZWN0cyB0aGlzIG9uZSBkZXBlbmRzIHVwb24sIGFkZCBlbGVtZW50cyB0byAnZ3JhcGgnLiAqLworICAgICAgICBMSVNUICogZGVwZW5kZW5jaWVzID0gdmFyX2dldCggZnJhbWUtPm1vZHVsZSwgbGlzdF9pdGVtKCBpdGVyICkgKTsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgTElTVElURVIgZGVwX2l0ZXIgPSBsaXN0X2JlZ2luKCBkZXBlbmRlbmNpZXMgKTsKKyAgICAgICAgTElTVElURVIgY29uc3QgZGVwX2VuZCA9IGxpc3RfZW5kKCBkZXBlbmRlbmNpZXMgKTsKKworICAgICAgICBncmFwaFsgc3JjIF0gPSAoIGludCAqIClCSkFNX0NBTExPQyggbGlzdF9sZW5ndGgoIGRlcGVuZGVuY2llcyApICsgMSwKKyAgICAgICAgICAgIHNpemVvZiggaW50ICkgKTsKKyAgICAgICAgZm9yICggOyBkZXBfaXRlciAhPSBkZXBfZW5kOyBkZXBfaXRlciA9IGxpc3RfbmV4dCggZGVwX2l0ZXIgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb25zdCBkc3QgPSBsaXN0X2luZGV4KCBhcmcsIGxpc3RfaXRlbSggZGVwX2l0ZXIgKSApOworICAgICAgICAgICAgaWYgKCBkc3QgIT0gLTEgKQorICAgICAgICAgICAgICAgIGdyYXBoWyBzcmMgXVsgaW5kZXgrKyBdID0gZHN0OworICAgICAgICB9CisgICAgICAgIGdyYXBoWyBzcmMgXVsgaW5kZXggXSA9IC0xOworICAgIH0KKworICAgIHRvcG9sb2dpY2FsX3NvcnQoIGdyYXBoLCBsZW5ndGgsIG9yZGVyICk7CisKKyAgICB7CisgICAgICAgIGludCBpbmRleCA9IGxlbmd0aCAtIDE7CisgICAgICAgIGZvciAoIDsgaW5kZXggPj0gMDsgLS1pbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIGFyZyApOworICAgICAgICAgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIGFyZyApOworICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBvcmRlclsgaW5kZXggXTsgKytpLCBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIG9iamVjdF9jb3B5KCBsaXN0X2l0ZW0oIGl0ZXIgKSApICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDbGVhbiB1cCAqLworICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kgKQorICAgICAgICAgICAgQkpBTV9GUkVFKCBncmFwaFsgaSBdICk7CisgICAgICAgIEJKQU1fRlJFRSggZ3JhcGggKTsKKyAgICAgICAgQkpBTV9GUkVFKCBvcmRlciApOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKwordm9pZCBpbml0X29yZGVyKCkKK3sKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJmaXJzdCIsICJzZWNvbmQiLCAwIH07CisgICAgICAgIGRlY2xhcmVfbmF0aXZlX3J1bGUoICJjbGFzc0BvcmRlciIsICJhZGQtcGFpciIsIGFyZ3MsIGFkZF9wYWlyLCAxICk7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAib2JqZWN0cyIsICIqIiwgMCB9OworICAgICAgICBkZWNsYXJlX25hdGl2ZV9ydWxlKCAiY2xhc3NAb3JkZXIiLCAib3JkZXIiLCBhcmdzLCBvcmRlciwgMSApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21vZHVsZXMvcGF0aC5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbW9kdWxlcy9wYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkZWRhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21vZHVsZXMvcGF0aC5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCBWbGFkaW1pciBQcnVzIDIwMDMuCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgKiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworI2luY2x1ZGUgIi4uL2NvbnN0YW50cy5oIgorI2luY2x1ZGUgIi4uL2ZyYW1lcy5oIgorI2luY2x1ZGUgIi4uL2xpc3RzLmgiCisjaW5jbHVkZSAiLi4vbmF0aXZlLmgiCisjaW5jbHVkZSAiLi4vdGltZXN0YW1wLmgiCisKKworTElTVCAqIHBhdGhfZXhpc3RzKCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIHJldHVybiBmaWxlX3F1ZXJ5KCBsaXN0X2Zyb250KCBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApICkgKSA/CisgICAgICAgIGxpc3RfbmV3KCBvYmplY3RfY29weSggY29uc3RhbnRfdHJ1ZSApICkgOiBMMDsKK30KKworCit2b2lkIGluaXRfcGF0aCgpCit7CisgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgImxvY2F0aW9uIiwgMCB9OworICAgIGRlY2xhcmVfbmF0aXZlX3J1bGUoICJwYXRoIiwgImV4aXN0cyIsIGFyZ3MsIHBhdGhfZXhpc3RzLCAxICk7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tb2R1bGVzL3Byb3BlcnR5LXNldC5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbW9kdWxlcy9wcm9wZXJ0eS1zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWUzNWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbW9kdWxlcy9wcm9wZXJ0eS1zZXQuYwpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFN0ZXZlbiBXYXRhbmFiZQorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKyNpbmNsdWRlICIuLi9vYmplY3QuaCIKKyNpbmNsdWRlICIuLi9saXN0cy5oIgorI2luY2x1ZGUgIi4uL21vZHVsZXMuaCIKKyNpbmNsdWRlICIuLi9ydWxlcy5oIgorI2luY2x1ZGUgIi4uL3ZhcmlhYmxlLmgiCisjaW5jbHVkZSAiLi4vbmF0aXZlLmgiCisjaW5jbHVkZSAiLi4vY29tcGlsZS5oIgorI2luY2x1ZGUgIi4uL21lbS5oIgorI2luY2x1ZGUgIi4uL2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorCitzdHJ1Y3QgcHNfbWFwX2VudHJ5Cit7CisgICAgc3RydWN0IHBzX21hcF9lbnRyeSAqIG5leHQ7CisgICAgTElTVCAqIGtleTsKKyAgICBPQkpFQ1QgKiB2YWx1ZTsKK307CisKK3N0cnVjdCBwc19tYXAKK3sKKyAgICBzdHJ1Y3QgcHNfbWFwX2VudHJ5ICogKiB0YWJsZTsKKyAgICBzaXplX3QgdGFibGVfc2l6ZTsKKyAgICBzaXplX3QgbnVtX2VsZW1zOworfTsKKworc3RhdGljIHVuc2lnbmVkIGxpc3RfaGFzaChMSVNUICoga2V5KQoreworICAgIHVuc2lnbmVkIGludCBoYXNoID0gMDsKKyAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbigga2V5ICksIGVuZCA9IGxpc3RfZW5kKCBrZXkgKTsKKyAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyArK2l0ZXIgKQorICAgIHsKKyAgICAgICAgaGFzaCA9IGhhc2ggKiAyMTQ3MDU5MzYzICsgb2JqZWN0X2hhc2goIGxpc3RfaXRlbSggaXRlciApICk7CisgICAgfQorICAgIHJldHVybiBoYXNoOworfQorCitzdGF0aWMgaW50IGxpc3RfZXF1YWwoIExJU1QgKiBsaHMsIExJU1QgKiByaHMgKQoreworICAgIExJU1RJVEVSIGxoc19pdGVyLCBsaHNfZW5kLCByaHNfaXRlcjsKKyAgICBpZiAoIGxpc3RfbGVuZ3RoKCBsaHMgKSAhPSBsaXN0X2xlbmd0aCggcmhzICkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGxoc19pdGVyID0gbGlzdF9iZWdpbiggbGhzICk7CisgICAgbGhzX2VuZCA9IGxpc3RfZW5kKCBsaHMgKTsKKyAgICByaHNfaXRlciA9IGxpc3RfYmVnaW4oIHJocyApOworICAgIGZvciAoIDsgbGhzX2l0ZXIgIT0gbGhzX2VuZDsgKytsaHNfaXRlciwgKytyaHNfaXRlciApCisgICAgeworICAgICAgICBpZiAoICEgb2JqZWN0X2VxdWFsKCBsaXN0X2l0ZW0oIGxoc19pdGVyICksIGxpc3RfaXRlbSggcmhzX2l0ZXIgKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHBzX21hcF9pbml0KCBzdHJ1Y3QgcHNfbWFwICogbWFwICkKK3sKKyAgICBzaXplX3QgaTsKKyAgICBtYXAtPnRhYmxlX3NpemUgPSAyOworICAgIG1hcC0+bnVtX2VsZW1zID0gMDsKKyAgICBtYXAtPnRhYmxlID0gQkpBTV9NQUxMT0MoIG1hcC0+dGFibGVfc2l6ZSAqIHNpemVvZiggc3RydWN0IHBzX21hcF9lbnRyeSAqICkgKTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG1hcC0+dGFibGVfc2l6ZTsgKytpICkKKyAgICB7CisgICAgICAgIG1hcC0+dGFibGVbIGkgXSA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwc19tYXBfZGVzdHJveSggc3RydWN0IHBzX21hcCAqIG1hcCApCit7CisgICAgc2l6ZV90IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBtYXAtPnRhYmxlX3NpemU7ICsraSApCisgICAgeworICAgICAgICBzdHJ1Y3QgcHNfbWFwX2VudHJ5ICogcG9zOworICAgICAgICBmb3IgKCBwb3MgPSBtYXAtPnRhYmxlWyBpIF07IHBvczsgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgcHNfbWFwX2VudHJ5ICogdG1wID0gcG9zLT5uZXh0OworICAgICAgICAgICAgQkpBTV9GUkVFKCBwb3MgKTsKKyAgICAgICAgICAgIHBvcyA9IHRtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBCSkFNX0ZSRUUoIG1hcC0+dGFibGUgKTsKK30KKworc3RhdGljIHZvaWQgcHNfbWFwX3JlaGFzaCggc3RydWN0IHBzX21hcCAqIG1hcCApCit7CisgICAgc3RydWN0IHBzX21hcCBvbGQgPSAqbWFwOworICAgIHNpemVfdCBpOworICAgIG1hcC0+dGFibGUgPSBCSkFNX01BTExPQyggbWFwLT50YWJsZV9zaXplICogMiAqIHNpemVvZiggc3RydWN0IHBzX21hcF9lbnRyeSAqICkgKTsKKyAgICBtYXAtPnRhYmxlX3NpemUgKj0gMjsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG1hcC0+dGFibGVfc2l6ZTsgKytpICkKKyAgICB7CisgICAgICAgIG1hcC0+dGFibGVbIGkgXSA9IE5VTEw7CisgICAgfQorICAgIGZvciAoIGkgPSAwOyBpIDwgb2xkLnRhYmxlX3NpemU7ICsraSApCisgICAgeworICAgICAgICBzdHJ1Y3QgcHNfbWFwX2VudHJ5ICogcG9zOworICAgICAgICBmb3IgKCBwb3MgPSBvbGQudGFibGVbIGkgXTsgcG9zOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBwc19tYXBfZW50cnkgKiB0bXAgPSBwb3MtPm5leHQ7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGhhc2hfdmFsID0gbGlzdF9oYXNoKCBwb3MtPmtleSApOworICAgICAgICAgICAgdW5zaWduZWQgYnVja2V0ID0gaGFzaF92YWwgJSBtYXAtPnRhYmxlX3NpemU7CisgICAgICAgICAgICBwb3MtPm5leHQgPSBtYXAtPnRhYmxlWyBidWNrZXQgXTsKKyAgICAgICAgICAgIG1hcC0+dGFibGVbIGJ1Y2tldCBdID0gcG9zOworCisgICAgICAgICAgICBwb3MgPSB0bXA7CisgICAgICAgIH0KKyAgICB9CisgICAgQkpBTV9GUkVFKCBvbGQudGFibGUgKTsKK30KKworc3RhdGljIHN0cnVjdCBwc19tYXBfZW50cnkgKiBwc19tYXBfaW5zZXJ0KHN0cnVjdCBwc19tYXAgKiBtYXAsIExJU1QgKiBrZXkpCit7CisgICAgdW5zaWduZWQgaGFzaF92YWwgPSBsaXN0X2hhc2goIGtleSApOworICAgIHVuc2lnbmVkIGJ1Y2tldCA9IGhhc2hfdmFsICUgbWFwLT50YWJsZV9zaXplOworICAgIHN0cnVjdCBwc19tYXBfZW50cnkgKiBwb3M7CisgICAgZm9yICggcG9zID0gbWFwLT50YWJsZVtidWNrZXRdOyBwb3MgOyBwb3MgPSBwb3MtPm5leHQgKQorICAgIHsKKyAgICAgICAgaWYgKCBsaXN0X2VxdWFsKCBwb3MtPmtleSwga2V5ICkgKQorICAgICAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKKyAgICBpZiAoIG1hcC0+bnVtX2VsZW1zID49IG1hcC0+dGFibGVfc2l6ZSApCisgICAgeworICAgICAgICBwc19tYXBfcmVoYXNoKCBtYXAgKTsKKyAgICAgICAgYnVja2V0ID0gaGFzaF92YWwgJSBtYXAtPnRhYmxlX3NpemU7CisgICAgfQorICAgIHBvcyA9IEJKQU1fTUFMTE9DKCBzaXplb2YoIHN0cnVjdCBwc19tYXBfZW50cnkgKSApOworICAgIHBvcy0+bmV4dCA9IG1hcC0+dGFibGVbYnVja2V0XTsKKyAgICBwb3MtPmtleSA9IGtleTsKKyAgICBwb3MtPnZhbHVlID0gMDsKKyAgICBtYXAtPnRhYmxlW2J1Y2tldF0gPSBwb3M7CisgICAgKyttYXAtPm51bV9lbGVtczsKKyAgICByZXR1cm4gcG9zOworfQorCitzdGF0aWMgc3RydWN0IHBzX21hcCBhbGxfcHJvcGVydHlfc2V0czsKKworTElTVCAqIHByb3BlcnR5X3NldF9jcmVhdGUoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIHByb3BlcnRpZXMgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIExJU1QgKiBzb3J0ZWQgPSBsaXN0X3NvcnQoIHByb3BlcnRpZXMgKTsKKyAgICBMSVNUICogdW5pcXVlID0gbGlzdF91bmlxdWUoIHNvcnRlZCApOworICAgIHN0cnVjdCBwc19tYXBfZW50cnkgKiBwb3MgPSBwc19tYXBfaW5zZXJ0KCAmYWxsX3Byb3BlcnR5X3NldHMsIHVuaXF1ZSApOworICAgIGxpc3RfZnJlZSggc29ydGVkICk7CisgICAgaWYgKCBwb3MtPnZhbHVlICkKKyAgICB7CisgICAgICAgIGxpc3RfZnJlZSggdW5pcXVlICk7CisgICAgICAgIHJldHVybiBsaXN0X25ldyggb2JqZWN0X2NvcHkoIHBvcy0+dmFsdWUgKSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBPQkpFQ1QgKiBydWxlbmFtZSA9IG9iamVjdF9uZXcoICJuZXciICk7CisgICAgICAgIE9CSkVDVCAqIHZhcm5hbWUgPSBvYmplY3RfbmV3KCAic2VsZi5yYXciICk7CisgICAgICAgIExJU1QgKiB2YWwgPSBjYWxsX3J1bGUoIHJ1bGVuYW1lLCBmcmFtZSwKKyAgICAgICAgICAgIGxpc3RfbmV3KCBvYmplY3RfbmV3KCAicHJvcGVydHktc2V0IiApICksIDAgKTsKKyAgICAgICAgTElTVElURVIgaXRlciwgZW5kOworICAgICAgICBvYmplY3RfZnJlZSggcnVsZW5hbWUgKTsKKyAgICAgICAgcG9zLT52YWx1ZSA9IGxpc3RfZnJvbnQoIHZhbCApOworICAgICAgICB2YXJfc2V0KCBiaW5kbW9kdWxlKCBwb3MtPnZhbHVlICksIHZhcm5hbWUsIHVuaXF1ZSwgVkFSX1NFVCApOworICAgICAgICBvYmplY3RfZnJlZSggdmFybmFtZSApOworCisgICAgICAgIGZvciAoIGl0ZXIgPSBsaXN0X2JlZ2luKCB1bmlxdWUgKSwgZW5kID0gbGlzdF9lbmQoIHVuaXF1ZSApOyBpdGVyICE9IGVuZDsgKytpdGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqIHN0ciA9IG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICk7CisgICAgICAgICAgICBpZiAoIHN0clsgMCBdICE9ICc8JyB8fCAhIHN0cmNociggc3RyLCAnPicgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIG1lc3NhZ2VbIDEgXTsKKyAgICAgICAgICAgICAgICBzdHJpbmdfbmV3KCBtZXNzYWdlICk7CisgICAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggbWVzc2FnZSwgIkludmFsaWQgcHJvcGVydHk6ICciICk7CisgICAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggbWVzc2FnZSwgc3RyICk7CisgICAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggbWVzc2FnZSwgIiciICk7CisgICAgICAgICAgICAgICAgcnVsZW5hbWUgPSBvYmplY3RfbmV3KCAiZXJyb3JzLmVycm9yIiApOworICAgICAgICAgICAgICAgIGNhbGxfcnVsZSggcnVsZW5hbWUsIGZyYW1lLAorICAgICAgICAgICAgICAgICAgICBsaXN0X25ldyggb2JqZWN0X25ldyggbWVzc2FnZS0+dmFsdWUgKSApLCAwICk7CisgICAgICAgICAgICAgICAgLyogdW5yZWFjaGFibGUgKi8KKyAgICAgICAgICAgICAgICBzdHJpbmdfZnJlZSggbWVzc2FnZSApOworICAgICAgICAgICAgICAgIG9iamVjdF9mcmVlKCBydWxlbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9Cit9CisKKy8qIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZSAqLworTElTVCAqIHByb3BlcnR5X3NldF9nZXQoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgT0JKRUNUICogdmFybmFtZSA9IG9iamVjdF9uZXcoICJzZWxmLnJhdyIgKTsKKyAgICBMSVNUICogcHJvcHMgPSB2YXJfZ2V0KCBmcmFtZS0+bW9kdWxlLCB2YXJuYW1lICk7CisgICAgY29uc3QgY2hhciAqIG5hbWUgPSBvYmplY3Rfc3RyKCBsaXN0X2Zyb250KCBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApICkgKTsKKyAgICBzaXplX3QgbmFtZV9sZW4gPSBzdHJsZW4oIG5hbWUgKTsKKyAgICBMSVNUSVRFUiBiZWdpbiwgZW5kOworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBvYmplY3RfZnJlZSggdmFybmFtZSApOworCisgICAgLyogQXNzdW1lcyByYW5kb20gYWNjZXNzICovCisgICAgYmVnaW4gPSBsaXN0X2JlZ2luKCBwcm9wcyApLCBlbmQgPSBsaXN0X2VuZCggcHJvcHMgKTsKKworICAgIHdoaWxlICggMSApCisgICAgeworICAgICAgICBwdHJkaWZmX3QgZGlmZiA9IChlbmQgLSBiZWdpbik7CisgICAgICAgIExJU1RJVEVSIG1pZCA9IGJlZ2luICsgZGlmZiAvIDI7CisgICAgICAgIGludCByZXM7CisgICAgICAgIGlmICggZGlmZiA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEwwOworICAgICAgICB9CisgICAgICAgIHJlcyA9IHN0cm5jbXAoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggbWlkICkgKSwgbmFtZSwgbmFtZV9sZW4gKTsKKyAgICAgICAgaWYgKCByZXMgPCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgYmVnaW4gPSBtaWQgKyAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCByZXMgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZW5kID0gbWlkOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogV2UndmUgZm91bmQgdGhlIHByb3BlcnR5ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ3JvdXAgKi8KKyAgICAgICAgICAgIExJU1RJVEVSIHRtcCA9IG1pZDsKKyAgICAgICAgICAgIHdoaWxlICggdG1wID4gYmVnaW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC0tdG1wOworICAgICAgICAgICAgICAgIHJlcyA9IHN0cm5jbXAoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggdG1wICkgKSwgbmFtZSwgbmFtZV9sZW4gKTsKKyAgICAgICAgICAgICAgICBpZiAoIHJlcyAhPSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrdG1wOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiZWdpbiA9IHRtcDsKKyAgICAgICAgICAgIC8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgZ3JvdXAgKi8KKyAgICAgICAgICAgIHRtcCA9IG1pZCArIDE7CisgICAgICAgICAgICB3aGlsZSAoIHRtcCA8IGVuZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzID0gc3RybmNtcCggb2JqZWN0X3N0ciggbGlzdF9pdGVtKCB0bXAgKSApLCBuYW1lLCBuYW1lX2xlbiApOworICAgICAgICAgICAgICAgIGlmICggcmVzICE9IDAgKSBicmVhazsKKyAgICAgICAgICAgICAgICArK3RtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZCA9IHRtcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICggOyBiZWdpbiAhPSBlbmQ7ICsrYmVnaW4gKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwKKyAgICAgICAgICAgIG9iamVjdF9uZXcoIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggYmVnaW4gKSApICsgbmFtZV9sZW4gKSApOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZSAqLworTElTVCAqIHByb3BlcnR5X3NldF9jb250YWluc19mZWF0dXJlcyggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBPQkpFQ1QgKiB2YXJuYW1lID0gb2JqZWN0X25ldyggInNlbGYucmF3IiApOworICAgIExJU1QgKiBwcm9wcyA9IHZhcl9nZXQoIGZyYW1lLT5tb2R1bGUsIHZhcm5hbWUgKTsKKyAgICBMSVNUICogZmVhdHVyZXMgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBMSVNUSVRFUiBmZWF0dXJlc19pdGVyID0gbGlzdF9iZWdpbiggZmVhdHVyZXMgKTsKKyAgICBMSVNUSVRFUiBmZWF0dXJlc19lbmQgPSBsaXN0X2VuZCggZmVhdHVyZXMgKSA7CisgICAgb2JqZWN0X2ZyZWUoIHZhcm5hbWUgKTsKKworICAgIGZvciAoIDsgZmVhdHVyZXNfaXRlciAhPSBmZWF0dXJlc19lbmQ7ICsrZmVhdHVyZXNfaXRlciApCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogbmFtZSA9IG9iamVjdF9zdHIoIGxpc3RfaXRlbSggZmVhdHVyZXNfaXRlciApICk7CisgICAgICAgIHNpemVfdCBuYW1lX2xlbiA9IHN0cmxlbiggbmFtZSApOworICAgICAgICBMSVNUSVRFUiBiZWdpbiwgZW5kOworICAgICAgICAvKiBBc3N1bWVzIHJhbmRvbSBhY2Nlc3MgKi8KKyAgICAgICAgYmVnaW4gPSBsaXN0X2JlZ2luKCBwcm9wcyApLCBlbmQgPSBsaXN0X2VuZCggcHJvcHMgKTsKKworICAgICAgICB3aGlsZSAoIDEgKQorICAgICAgICB7CisgICAgICAgICAgICBwdHJkaWZmX3QgZGlmZiA9IChlbmQgLSBiZWdpbik7CisgICAgICAgICAgICBMSVNUSVRFUiBtaWQgPSBiZWdpbiArIGRpZmYgLyAyOworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIGlmICggZGlmZiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgZmVhdHVyZSBpcyBtaXNzaW5nICovCisgICAgICAgICAgICAgICAgcmV0dXJuIEwwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gc3RybmNtcCggb2JqZWN0X3N0ciggbGlzdF9pdGVtKCBtaWQgKSApLCBuYW1lLCBuYW1lX2xlbiApOworICAgICAgICAgICAgaWYgKCByZXMgPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZWdpbiA9IG1pZCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggcmVzID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5kID0gbWlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKiBXZSd2ZSBmb3VuZCB0aGUgcHJvcGVydHkgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGlzdF9uZXcoIG9iamVjdF9jb3B5KCBjb25zdGFudF90cnVlICkgKTsKK30KKwordm9pZCBpbml0X3Byb3BlcnR5X3NldCgpCit7CisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAicmF3LXByb3BlcnRpZXMiLCAiKiIsIDAgfTsKKyAgICAgICAgZGVjbGFyZV9uYXRpdmVfcnVsZSggInByb3BlcnR5LXNldCIsICJjcmVhdGUiLCBhcmdzLCBwcm9wZXJ0eV9zZXRfY3JlYXRlLCAxICk7CisgICAgfQorICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgImZlYXR1cmUiLCAwIH07CisgICAgICAgIGRlY2xhcmVfbmF0aXZlX3J1bGUoICJjbGFzc0Bwcm9wZXJ0eS1zZXQiLCAiZ2V0IiwgYXJncywgcHJvcGVydHlfc2V0X2dldCwgMSApOworICAgIH0KKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJmZWF0dXJlcyIsICIqIiwgMCB9OworICAgICAgICBkZWNsYXJlX25hdGl2ZV9ydWxlKCAiY2xhc3NAcHJvcGVydHktc2V0IiwgImNvbnRhaW5zLWZlYXR1cmVzIiwgYXJncywgcHJvcGVydHlfc2V0X2NvbnRhaW5zX2ZlYXR1cmVzLCAxICk7CisgICAgfQorICAgIHBzX21hcF9pbml0KCAmYWxsX3Byb3BlcnR5X3NldHMgKTsKK30KKwordm9pZCBwcm9wZXJ0eV9zZXRfZG9uZSgpCit7CisgICAgcHNfbWFwX2Rlc3Ryb3koICZhbGxfcHJvcGVydHlfc2V0cyApOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbW9kdWxlcy9yZWFkbWUudHh0IGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbW9kdWxlcy9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZGY2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tb2R1bGVzL3JlYWRtZS50eHQKQEAgLTAsMCArMSwzIEBACisKK1RoaXMgZGlyZWN0b3J5IGNvbnN0YWlucyBzb3VyY2VzIHdoaWNoIGRlY2xhcmUgbmF0aXZlCitydWxlcyBmb3IgQm9vc3QuQnVpbGQgbW9kdWxlcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tb2R1bGVzL3JlZ2V4LmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tb2R1bGVzL3JlZ2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmODE3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21vZHVsZXMvcmVnZXguYwpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLiBWbGFkaW1pciBQcnVzCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgKiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworI2luY2x1ZGUgIi4uL21lbS5oIgorI2luY2x1ZGUgIi4uL25hdGl2ZS5oIgorI2luY2x1ZGUgIi4uL3N0cmluZ3MuaCIKKyNpbmNsdWRlICIuLi9zdWJzdC5oIgorCisvKgorcnVsZSBzcGxpdCAoIHN0cmluZyBzZXBhcmF0b3IgKQoreworICAgIGxvY2FsIHJlc3VsdCA7CisgICAgbG9jYWwgcyA9ICQoc3RyaW5nKSA7CisKKyAgICBsb2NhbCBtYXRjaCA9IDEgOworICAgIHdoaWxlICQobWF0Y2gpCisgICAgeworICAgICAgICBtYXRjaCA9IFsgTUFUQ0ggXiguKikoJChzZXBhcmF0b3IpKSguKikgOiAkKHMpIF0gOworICAgICAgICBpZiAkKG1hdGNoKQorICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCArPSAiIiA7ICAjIGluIGNhc2UgM3JkIGl0ZW0gd2FzIGVtcHR5IC0gd29ya3MgYXJvdW5kIE1BVENIIGJ1ZworICAgICAgICAgICAgcmVzdWx0ID0gJChtYXRjaFszXSkgJChyZXN1bHQpIDsKKyAgICAgICAgICAgIHMgPSAkKG1hdGNoWzFdKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICQocykgJChyZXN1bHQpIDsKK30KKyovCisKK0xJU1QgKiByZWdleF9zcGxpdCggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBMSVNUICogYXJncyA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAwICk7CisgICAgT0JKRUNUICogczsKKyAgICBPQkpFQ1QgKiBzZXBhcmF0b3I7CisgICAgcmVnZXhwICogcmU7CisgICAgY29uc3QgY2hhciAqIHBvczsKKyAgICBMSVNUICogcmVzdWx0ID0gTDA7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIGFyZ3MgKTsKKyAgICBzID0gbGlzdF9pdGVtKCBpdGVyICk7CisgICAgc2VwYXJhdG9yID0gbGlzdF9pdGVtKCBsaXN0X25leHQoIGl0ZXIgKSApOworICAgIAorICAgIHJlID0gcmVnZXhfY29tcGlsZSggc2VwYXJhdG9yICk7CisKKyAgICBwb3MgPSBvYmplY3Rfc3RyKCBzICk7CisgICAgd2hpbGUgKCByZWdleGVjKCByZSwgcG9zICkgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gbGlzdF9wdXNoX2JhY2soIHJlc3VsdCwgb2JqZWN0X25ld19yYW5nZSggcG9zLCByZS0+c3RhcnRwWyAwIF0gLSBwb3MgKSApOworICAgICAgICBwb3MgPSByZS0+ZW5kcFsgMCBdOworICAgIH0KKworICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIG9iamVjdF9uZXcoIHBvcyApICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorcnVsZSByZXBsYWNlICgKKyAgICBzdHJpbmcgICMgVGhlIHN0cmluZyB0byBtb2RpZnkuCisgICAgbWF0Y2ggICMgVGhlIGNoYXJhY3RlcnMgdG8gcmVwbGFjZS4KKyAgICByZXBsYWNlbWVudCAgIyBUaGUgc3RyaW5nIHRvIHJlcGxhY2Ugd2l0aC4KKyAgICApCit7CisgICAgbG9jYWwgcmVzdWx0ID0gIiIgOworICAgIGxvY2FsIHBhcnRzID0gMSA7CisgICAgd2hpbGUgJChwYXJ0cykKKyAgICB7CisgICAgICAgIHBhcnRzID0gWyBNQVRDSCBeKC4qKSgkKG1hdGNoKSkoLiopIDogJChzdHJpbmcpIF0gOworICAgICAgICBpZiAkKHBhcnRzKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJ0cyArPSAiIiA7CisgICAgICAgICAgICByZXN1bHQgPSAiJChyZXBsYWNlbWVudCkkKHBhcnRzWzNdKSQocmVzdWx0KSIgOworICAgICAgICAgICAgc3RyaW5nID0gJChwYXJ0c1sxXSkgOworICAgICAgICB9CisgICAgfQorICAgIHN0cmluZyA/PSAiIiA7CisgICAgcmVzdWx0ID0gIiQoc3RyaW5nKSQocmVzdWx0KSIgOworICAgIHJldHVybiAkKHJlc3VsdCkgOworfQorKi8KKworTElTVCAqIHJlZ2V4X3JlcGxhY2UoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGFyZ3MgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIE9CSkVDVCAqIHM7CisgICAgT0JKRUNUICogbWF0Y2g7CisgICAgT0JKRUNUICogcmVwbGFjZW1lbnQ7CisgICAgcmVnZXhwICogcmU7CisgICAgY29uc3QgY2hhciAqIHBvczsKKyAgICBzdHJpbmcgYnVmWyAxIF07CisgICAgTElTVCAqIHJlc3VsdDsKKyAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggYXJncyApOworICAgIHMgPSBsaXN0X2l0ZW0oIGl0ZXIgKTsKKyAgICBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICk7CisgICAgbWF0Y2ggPSBsaXN0X2l0ZW0oIGl0ZXIgKTsKKyAgICBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICk7CisgICAgcmVwbGFjZW1lbnQgPSBsaXN0X2l0ZW0oaXRlciApOworICAgIAorICAgIHJlID0gcmVnZXhfY29tcGlsZSggbWF0Y2ggKTsKKyAgICAKKyAgICBzdHJpbmdfbmV3KCBidWYgKTsKKworICAgIHBvcyA9IG9iamVjdF9zdHIoIHMgKTsKKyAgICB3aGlsZSAoIHJlZ2V4ZWMoIHJlLCBwb3MgKSApCisgICAgeworICAgICAgICBzdHJpbmdfYXBwZW5kX3JhbmdlKCBidWYsIHBvcywgcmUtPnN0YXJ0cFsgMCBdICk7CisgICAgICAgIHN0cmluZ19hcHBlbmQoIGJ1Ziwgb2JqZWN0X3N0ciggcmVwbGFjZW1lbnQgKSApOworICAgICAgICBwb3MgPSByZS0+ZW5kcFsgMCBdOworICAgIH0KKyAgICBzdHJpbmdfYXBwZW5kKCBidWYsIHBvcyApOworCisgICAgcmVzdWx0ID0gbGlzdF9uZXcoIG9iamVjdF9uZXcoIGJ1Zi0+dmFsdWUgKSApOworCisgICAgc3RyaW5nX2ZyZWUoIGJ1ZiApOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKK3J1bGUgdHJhbnNmb3JtICggbGlzdCAqIDogcGF0dGVybiA6IGluZGljZXMgKiApCit7CisgICAgaW5kaWNlcyA/PSAxIDsKKyAgICBsb2NhbCByZXN1bHQgOworICAgIGZvciBsb2NhbCBlIGluICQobGlzdCkKKyAgICB7CisgICAgICAgIGxvY2FsIG0gPSBbIE1BVENIICQocGF0dGVybikgOiAkKGUpIF0gOworICAgICAgICBpZiAkKG0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAkKG1bJChpbmRpY2VzKV0pIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJChyZXN1bHQpIDsKK30KKyovCisKK0xJU1QgKiByZWdleF90cmFuc2Zvcm0oIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGNvbnN0IGwgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIExJU1QgKiBjb25zdCBwYXR0ZXJuID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDEgKTsKKyAgICBMSVNUICogY29uc3QgaW5kaWNlc19saXN0ID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDIgKTsKKyAgICBpbnQgKiBpbmRpY2VzID0gMDsKKyAgICBpbnQgc2l6ZTsKKyAgICBMSVNUICogcmVzdWx0ID0gTDA7CisKKyAgICBpZiAoICFsaXN0X2VtcHR5KCBpbmRpY2VzX2xpc3QgKSApCisgICAgeworICAgICAgICBpbnQgKiBwOworICAgICAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggaW5kaWNlc19saXN0ICk7CisgICAgICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCBpbmRpY2VzX2xpc3QgKTsKKyAgICAgICAgc2l6ZSA9IGxpc3RfbGVuZ3RoKCBpbmRpY2VzX2xpc3QgKTsKKyAgICAgICAgaW5kaWNlcyA9IChpbnQgKilCSkFNX01BTExPQyggc2l6ZSAqIHNpemVvZiggaW50ICkgKTsKKyAgICAgICAgZm9yICggcCA9IGluZGljZXM7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgICAgICAgICAgKnArKyA9IGF0b2koIG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICkgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2l6ZSA9IDE7CisgICAgICAgIGluZGljZXMgPSAoaW50ICopQkpBTV9NQUxMT0MoIHNpemVvZiggaW50ICkgKTsKKyAgICAgICAgKmluZGljZXMgPSAxOworICAgIH0KKworICAgIHsKKyAgICAgICAgLyogUmVzdWx0IGlzIGNhY2hlZCBhbmQgaW50ZW50aW9uYWxseSBuZXZlciBmcmVlZCAqLworICAgICAgICByZWdleHAgKiBjb25zdCByZSA9IHJlZ2V4X2NvbXBpbGUoIGxpc3RfZnJvbnQoIHBhdHRlcm4gKSApOworCisgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCBsICk7CisgICAgICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCBsICk7CisKKyAgICAgICAgc3RyaW5nIGJ1ZlsgMSBdOworICAgICAgICBzdHJpbmdfbmV3KCBidWYgKTsKKworICAgICAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHJlZ2V4ZWMoIHJlLCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKCA7IGkgPCBzaXplOyArK2kgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvbnN0IGluZGV4ID0gaW5kaWNlc1sgaSBdOworICAgICAgICAgICAgICAgICAgICAvKiBTa2lwIGVtcHR5IHN1Ym1hdGNoZXMuIE5vdCBzdXJlIGl0IGlzIHJpZ2h0IGluIGFsbCBjYXNlcywKKyAgICAgICAgICAgICAgICAgICAgICogYnV0IHN1cmVseSBpcyByaWdodCBmb3IgdGhlIGNhc2UgZm9yIHdoaWNoIHRoaXMgcm91dGluZQorICAgICAgICAgICAgICAgICAgICAgKiBpcyBvcHRpbWl6ZWQgLS0gaGVhZGVyIHNjYW5uaW5nLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCByZS0+c3RhcnRwWyBpbmRleCBdICE9IHJlLT5lbmRwWyBpbmRleCBdICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZF9yYW5nZSggYnVmLCByZS0+c3RhcnRwWyBpbmRleCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLT5lbmRwWyBpbmRleCBdICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXN0X3B1c2hfYmFjayggcmVzdWx0LCBvYmplY3RfbmV3KCBidWYtPnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RydW5jYXRlKCBidWYsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpbmdfZnJlZSggYnVmICk7CisgICAgfQorCisgICAgQkpBTV9GUkVFKCBpbmRpY2VzICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2b2lkIGluaXRfcmVnZXgoKQoreworICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGFyZ3NbXSA9IHsgInN0cmluZyIsICJzZXBhcmF0b3IiLCAwICB9OworICAgICAgICBkZWNsYXJlX25hdGl2ZV9ydWxlKCAicmVnZXgiLCAic3BsaXQiLCBhcmdzLCByZWdleF9zcGxpdCwgMSApOworICAgIH0KKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJzdHJpbmciLCAibWF0Y2giLCAicmVwbGFjZW1lbnQiLCAwICB9OworICAgICAgICBkZWNsYXJlX25hdGl2ZV9ydWxlKCAicmVnZXgiLCAicmVwbGFjZSIsIGFyZ3MsIHJlZ2V4X3JlcGxhY2UsIDEgKTsKKyAgICB9CisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAibGlzdCIsICIqIiwgIjoiLCAicGF0dGVybiIsICI6IiwgImluZGljZXMiLCAiKiIsIDAgfTsKKyAgICAgICAgZGVjbGFyZV9uYXRpdmVfcnVsZSggInJlZ2V4IiwgInRyYW5zZm9ybSIsIGFyZ3MsIHJlZ2V4X3RyYW5zZm9ybSwgMiApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21vZHVsZXMvc2VxdWVuY2UuYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21vZHVsZXMvc2VxdWVuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGVkMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbW9kdWxlcy9zZXF1ZW5jZS5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgVmxhZGltaXIgUHJ1cyAyMDAzLgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKyNpbmNsdWRlICIuLi9uYXRpdmUuaCIKKyNpbmNsdWRlICIuLi9vYmplY3QuaCIKKyNpbmNsdWRlICIuLi9saXN0cy5oIgorI2luY2x1ZGUgIi4uL2NvbXBpbGUuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKKyNpZm5kZWYgbWF4CisjIGRlZmluZSBtYXgoYSxiKSAoKGEpPihiKT8oYSk6KGIpKQorI2VuZGlmCisKKworTElTVCAqIHNlcXVlbmNlX3NlbGVjdF9oaWdoZXN0X3JhbmtlZCggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgIC8qIFJldHVybnMgYWxsIG9mICdlbGVtZW50cycgZm9yIHdoaWNoIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbiBwYXJhbGxlbCAqLworICAgLyogbGlzdCAncmFuaycgaXMgZXF1YWwgdG8gdGhlIG1heGltdW0gdmFsdWUgaW4gJ3JhbmsnLiAgICAgICAgICAgICAgICAgICovCisKKyAgICBMSVNUICogY29uc3QgZWxlbWVudHMgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMCApOworICAgIExJU1QgKiBjb25zdCByYW5rID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDEgKTsKKworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBpbnQgaGlnaGVzdF9yYW5rID0gLTE7CisKKyAgICB7CisgICAgICAgIExJU1RJVEVSIGl0ZXIgPSBsaXN0X2JlZ2luKCByYW5rICk7CisgICAgICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCByYW5rICk7CisgICAgICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb25zdCBjdXJyZW50ID0gYXRvaSggb2JqZWN0X3N0ciggbGlzdF9pdGVtKCBpdGVyICkgKSApOworICAgICAgICAgICAgaGlnaGVzdF9yYW5rID0gbWF4KCBoaWdoZXN0X3JhbmssIGN1cnJlbnQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIHJhbmsgKTsKKyAgICAgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIHJhbmsgKTsKKyAgICAgICAgTElTVElURVIgZWxlbWVudHNfaXRlciA9IGxpc3RfYmVnaW4oIGVsZW1lbnRzICk7CisgICAgICAgIExJU1RJVEVSIGNvbnN0IGVsZW1lbnRzX2VuZCA9IGxpc3RfZW5kKCBlbGVtZW50cyApOworICAgICAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICksIGVsZW1lbnRzX2l0ZXIgPQorICAgICAgICAgICAgbGlzdF9uZXh0KCBlbGVtZW50c19pdGVyICkgKQorICAgICAgICAgICAgaWYgKCBhdG9pKCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApICkgPT0gaGlnaGVzdF9yYW5rICkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXN0X3B1c2hfYmFjayggcmVzdWx0LCBvYmplY3RfY29weSggbGlzdF9pdGVtKAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50c19pdGVyICkgKSApOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0xJU1QgKiBzZXF1ZW5jZV90cmFuc2Zvcm0oIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIGZ1bmN0aW9uID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsKKyAgICBMSVNUICogc2VxdWVuY2UgPSBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMSApOworICAgIExJU1QgKiByZXN1bHQgPSBMMDsKKyAgICBPQkpFQ1QgKiBmdW5jdGlvbl9uYW1lID0gbGlzdF9mcm9udCggZnVuY3Rpb24gKTsKKyAgICBMSVNUSVRFUiBhcmdzX2JlZ2luID0gbGlzdF9uZXh0KCBsaXN0X2JlZ2luKCBmdW5jdGlvbiApICksIGFyZ3NfZW5kID0gbGlzdF9lbmQoIGZ1bmN0aW9uICk7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIHNlcXVlbmNlICksIGVuZCA9IGxpc3RfZW5kKCBzZXF1ZW5jZSApOworICAgIFJVTEUgKiBydWxlID0gYmluZHJ1bGUoIGZ1bmN0aW9uX25hbWUsIGZyYW1lLT5wcmV2LT5tb2R1bGUgKTsKKworICAgIGZvciAoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgeworICAgICAgICBGUkFNRSBpbm5lclsgMSBdOworCisgICAgICAgIGZyYW1lX2luaXQoIGlubmVyICk7CisgICAgICAgIGlubmVyLT5wcmV2ID0gZnJhbWU7CisgICAgICAgIGlubmVyLT5wcmV2X3VzZXIgPSBmcmFtZS0+cHJldl91c2VyOworICAgICAgICBpbm5lci0+bW9kdWxlID0gZnJhbWUtPnByZXYtPm1vZHVsZTsKKworICAgICAgICBsb2xfYWRkKCBpbm5lci0+YXJncywgbGlzdF9wdXNoX2JhY2soIGxpc3RfY29weV9yYW5nZSggZnVuY3Rpb24sIGFyZ3NfYmVnaW4sIGFyZ3NfZW5kICksIG9iamVjdF9jb3B5KCBsaXN0X2l0ZW0oIGl0ZXIgKSApICkgKTsKKyAgICAgICAgcmVzdWx0ID0gbGlzdF9hcHBlbmQoIHJlc3VsdCwgZXZhbHVhdGVfcnVsZSggcnVsZSwgZnVuY3Rpb25fbmFtZSwgaW5uZXIgKSApOworCisgICAgICAgIGZyYW1lX2ZyZWUoIGlubmVyICk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBpbml0X3NlcXVlbmNlKCkKK3sKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBhcmdzW10gPSB7ICJlbGVtZW50cyIsICIqIiwgIjoiLCAicmFuayIsICIqIiwgMCB9OworICAgICAgICBkZWNsYXJlX25hdGl2ZV9ydWxlKCAic2VxdWVuY2UiLCAic2VsZWN0LWhpZ2hlc3QtcmFua2VkIiwgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZV9zZWxlY3RfaGlnaGVzdF9yYW5rZWQsIDEgKTsKKyAgICB9CisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogYXJnc1tdID0geyAiZnVuY3Rpb24iLCAiKyIsICI6IiwgInNlcXVlbmNlIiwgIioiLCAwIH07CisgICAgICAgIGRlY2xhcmVfbmF0aXZlX3J1bGUoICJzZXF1ZW5jZSIsICJ0cmFuc2Zvcm0iLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlX3RyYW5zZm9ybSwgMSApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL21vZHVsZXMvc2V0LmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tb2R1bGVzL3NldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTMxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9tb2R1bGVzL3NldC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIENvcHlyaWdodCBWbGFkaW1pciBQcnVzIDIwMDMuIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCAqLworLyogU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nICovCisvKiBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkgKi8KKworI2luY2x1ZGUgIi4uL25hdGl2ZS5oIgorI2luY2x1ZGUgIi4uL29iamVjdC5oIgorCisvKgorICAgIGxvY2FsIHJlc3VsdCA9IDsKKyAgICBsb2NhbCBlbGVtZW50IDsKKyAgICBmb3IgZWxlbWVudCBpbiAkKEIpCisgICAgeworICAgICAgICBpZiAhICggJChlbGVtZW50KSBpbiAkKEEpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICQoZWxlbWVudCkgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkKHJlc3VsdCkgOworKi8KK0xJU1QgKnNldF9kaWZmZXJlbmNlKCBGUkFNRSAqZnJhbWUsIGludCBmbGFncyApCit7CisKKyAgICBMSVNUKiBiID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsgICAgCisgICAgTElTVCogYSA9IGxvbF9nZXQoIGZyYW1lLT5hcmdzLCAxICk7ICAgIAorCisgICAgTElTVCogcmVzdWx0ID0gTDA7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIGIgKSwgZW5kID0gbGlzdF9lbmQoIGIgKTsKKyAgICBmb3IoIDsgaXRlciAhPSBlbmQ7IGl0ZXIgPSBsaXN0X25leHQoIGl0ZXIgKSApCisgICAgeworICAgICAgICBpZiAoIWxpc3RfaW4oYSwgbGlzdF9pdGVtKGl0ZXIpKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKHJlc3VsdCwgb2JqZWN0X2NvcHkobGlzdF9pdGVtKGl0ZXIpKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgaW5pdF9zZXQoKQoreworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogYXJnc1tdID0geyAiQiIsICIqIiwgIjoiLCAiQSIsICIqIiwgMCB9OworICAgICAgICBkZWNsYXJlX25hdGl2ZV9ydWxlKCJzZXQiLCAiZGlmZmVyZW5jZSIsIGFyZ3MsIHNldF9kaWZmZXJlbmNlLCAxKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL25hdGl2ZS5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbmF0aXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4MjhhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL25hdGl2ZS5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIENvcHlyaWdodCAyMDAzLiBWbGFkaW1pciBQcnVzCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgKiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworI2luY2x1ZGUgIm5hdGl2ZS5oIgorCisjaW5jbHVkZSAiaGFzaC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKwordm9pZCBkZWNsYXJlX25hdGl2ZV9ydWxlKCBjaGFyIGNvbnN0ICogbW9kdWxlLCBjaGFyIGNvbnN0ICogcnVsZSwKKyAgICBjaGFyIGNvbnN0ICogKiBhcmdzLCBMSVNUICogKCpmKSggRlJBTUUgKiwgaW50ICksIGludCB2ZXJzaW9uICkKK3sKKyAgICBPQkpFQ1QgKiBjb25zdCBtb2R1bGVfb2JqID0gbW9kdWxlID8gb2JqZWN0X25ldyggbW9kdWxlICkgOiAwIDsKKyAgICBtb2R1bGVfdCAqIG0gPSBiaW5kbW9kdWxlKCBtb2R1bGVfb2JqICk7CisgICAgaWYgKCBtb2R1bGVfb2JqICkKKyAgICAgICAgb2JqZWN0X2ZyZWUoIG1vZHVsZV9vYmogKTsKKyAgICBpZiAoICFtLT5uYXRpdmVfcnVsZXMgKQorICAgICAgICBtLT5uYXRpdmVfcnVsZXMgPSBoYXNoaW5pdCggc2l6ZW9mKCBuYXRpdmVfcnVsZV90ICksICJuYXRpdmUgcnVsZXMiICk7CisKKyAgICB7CisgICAgICAgIE9CSkVDVCAqIGNvbnN0IG5hbWUgPSBvYmplY3RfbmV3KCBydWxlICk7CisgICAgICAgIGludCBmb3VuZDsKKyAgICAgICAgbmF0aXZlX3J1bGVfdCAqIGNvbnN0IG5wID0gKG5hdGl2ZV9ydWxlX3QgKiloYXNoX2luc2VydCgKKyAgICAgICAgICAgIG0tPm5hdGl2ZV9ydWxlcywgbmFtZSwgJmZvdW5kICk7CisgICAgICAgIG5wLT5uYW1lID0gbmFtZTsKKyAgICAgICAgYXNzZXJ0KCAhZm91bmQgKTsKKyAgICAgICAgbnAtPnByb2NlZHVyZSA9IGZ1bmN0aW9uX2J1aWx0aW4oIGYsIDAsIGFyZ3MgKTsKKyAgICAgICAgbnAtPnZlcnNpb24gPSB2ZXJzaW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL25hdGl2ZS5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvbmF0aXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzOGQwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL25hdGl2ZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIENvcHlyaWdodCAyMDAzLiBEYXZpZCBBYnJhaGFtcworICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKyNpZm5kZWYgTkFUSVZFX0hfVlBfMjAwM18xMl8wOQorI2RlZmluZSBOQVRJVkVfSF9WUF8yMDAzXzEyXzA5CisKKyNpbmNsdWRlICJmdW5jdGlvbi5oIgorI2luY2x1ZGUgImZyYW1lcy5oIgorI2luY2x1ZGUgImxpc3RzLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisKK3R5cGVkZWYgc3RydWN0IG5hdGl2ZV9ydWxlX3QKK3sKKyAgICBPQkpFQ1QgKiBuYW1lOworICAgIEZVTkNUSU9OICogcHJvY2VkdXJlOworCisgICAgLyogVmVyc2lvbiBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgdGhlIG5hdGl2ZSBydWxlIHByb3ZpZGVzLiBJdCBpcyBwb3NzaWJsZQorICAgICAqIHRoYXQgd2Ugd2FudCB0byBjaGFuZ2UgdGhlIHNldCBwYXJhbWV0ZXIgZm9yIGV4aXN0aW5nIG5hdGl2ZSBydWxlLiBJbgorICAgICAqIHRoYXQgY2FzZSwgdmVyc2lvbiBudW1iZXIgc2hvdWxkIGJlIGluY3JlbWVudGVkIHNvIEJvb3N0LkJ1aWxkIGNhbiBjaGVjaworICAgICAqIGZvciB0aGUgdmVyc2lvbiBpdCByZWxpZXMgb24uCisgICAgICoKKyAgICAgKiBWZXJzaW9ucyBhcmUgbnVtYmVyZWQgZnJvbSAxLgorICAgICovCisgICAgaW50IHZlcnNpb247Cit9IG5hdGl2ZV9ydWxlX3Q7CisvKiBNU1ZDIGRlYnVnZ2VyIGdldHMgY29uZnVzZWQgdW5sZXNzIHRoZSBuYXRpdmVfcnVsZV90IHR5cGVkZWYgaXMgcHJvdmlkZWQuICovCisKK3ZvaWQgZGVjbGFyZV9uYXRpdmVfcnVsZSggY2hhciBjb25zdCAqIG1vZHVsZSwgY2hhciBjb25zdCAqIHJ1bGUsCisgICAgY2hhciBjb25zdCAqICogYXJncywgTElTVCAqICgqZikoIEZSQU1FICosIGludCApLCBpbnQgdmVyc2lvbiApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL29iamVjdC5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvb2JqZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0NmU0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL29iamVjdC5jCkBAIC0wLDAgKzEsMzk0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTMsIDE5OTUgQ2hyaXN0b3BoZXIgU2Vpd2FsZC4KKyAqIENvcHlyaWdodCAyMDExIFN0ZXZlbiBXYXRhbmFiZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qCisgKiBvYmplY3QuYyAtIG9iamVjdCBtYW5pcHVsYXRpb24gcm91dGluZXMKKyAqCisgKiBFeHRlcm5hbCBmdW5jdGlvbnM6CisgKiAgICBvYmplY3RfbmV3KCkgICAgICAgLSBjcmVhdGUgYW4gb2JqZWN0IGZyb20gYSBzdHJpbmcKKyAqICAgIG9iamVjdF9uZXdfcmFuZ2UoKSAtIGNyZWF0ZSBhbiBvYmplY3QgZnJvbSBhIHN0cmluZyBvZiBnaXZlbiBsZW5ndGgKKyAqICAgIG9iamVjdF9jb3B5KCkgICAgICAtIHJldHVybiBhIGNvcHkgb2YgYW4gb2JqZWN0CisgKiAgICBvYmplY3RfZnJlZSgpICAgICAgLSBmcmVlIGFuIG9iamVjdAorICogICAgb2JqZWN0X3N0cigpICAgICAgIC0gZ2V0IHRoZSBzdHJpbmcgdmFsdWUgb2YgYW4gb2JqZWN0CisgKiAgICBvYmplY3RfZG9uZSgpICAgICAgLSBmcmVlIHN0cmluZyB0YWJsZXMKKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGJ1aWxkcyBhIGhhc2ggdGFibGUgb2YgYWxsIHN0cmluZ3MsIHNvIHRoYXQgbXVsdGlwbGUKKyAqIGNhbGxzIG9mIG9iamVjdF9uZXcoKSBvbiB0aGUgc2FtZSBzdHJpbmcgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc3RyaW5nIG9uY2UuCisgKiBTdHJpbmdzIGFyZSBuZXZlciBhY3R1YWxseSBmcmVlZC4KKyAqLworCisjaW5jbHVkZSAiamFtLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisjZGVmaW5lIE9CSkVDVF9NQUdJQyAweGE3NjJlMGUzdQorCisjaWZuZGVmIG9iamVjdF9jb3B5CisKK3N0cnVjdCBoYXNoX2hlYWRlcgoreworI2lmbmRlZiBOREVCVUcKKyAgICB1bnNpZ25lZCBpbnQgbWFnaWM7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBpbnQgaGFzaDsKKyAgICBzdHJ1Y3QgaGFzaF9pdGVtICogbmV4dDsKK307CisKKyNlbmRpZgorCitzdHJ1Y3QgaGFzaF9pdGVtCit7CisgICAgc3RydWN0IGhhc2hfaGVhZGVyIGhlYWRlcjsKKyAgICBjaGFyIGRhdGFbIDEgXTsKK307CisKKyNkZWZpbmUgQUxMT0NfQUxJR05NRU5UIChzaXplb2Yoc3RydWN0IGhhc2hfaXRlbSkgLSBzaXplb2Yoc3RydWN0IGhhc2hfaGVhZGVyKSkKKwordHlwZWRlZiBzdHJ1Y3Qgc3RyaW5nX3NldAoreworICAgIHVuc2lnbmVkIGludCBudW07CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgc3RydWN0IGhhc2hfaXRlbSAqICogZGF0YTsKK30gc3RyaW5nX3NldDsKKworc3RhdGljIHN0cmluZ19zZXQgc3RyaGFzaDsKK3N0YXRpYyBpbnQgc3RydG90YWwgPSAwOworc3RhdGljIGludCBzdHJjb3VudF9pbiA9IDA7CitzdGF0aWMgaW50IHN0cmNvdW50X291dCA9IDA7CisKKworLyoKKyAqIEltbW9ydGFsIHN0cmluZyBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gc3BlZWRzIHN0cmluZyBhbGxvY2F0aW9uIGFuZCBjdXRzCisgKiBkb3duIG9uIGludGVybmFsIGZyYWdtZW50YXRpb24uCisgKi8KKworI2RlZmluZSBTVFJJTkdfQkxPQ0sgNDA5NgordHlwZWRlZiBzdHJ1Y3Qgc3RyYmxvY2sKK3sKKyAgICBzdHJ1Y3Qgc3RyYmxvY2sgKiBuZXh0OworICAgIGNoYXIgZGF0YVsgU1RSSU5HX0JMT0NLIF07Cit9IHN0cmJsb2NrOworCitzdGF0aWMgc3RyYmxvY2sgKiBzdHJibG9ja19jaGFpbiA9IDA7CisKKy8qIFN0b3JhZ2UgcmVtYWluaW5nIGluIHRoZSBjdXJyZW50IHN0cmJsb2NrICovCitzdGF0aWMgY2hhciAqIHN0b3JhZ2Vfc3RhcnQgPSAwOworc3RhdGljIGNoYXIgKiBzdG9yYWdlX2ZpbmlzaCA9IDA7CisKKworLyoKKyAqIGFsbG9jYXRlKCkgLSBBbGxvY2F0ZSBuIGJ5dGVzIG9mIGltbW9ydGFsIHN0cmluZyBzdG9yYWdlLgorICovCisKK3N0YXRpYyBjaGFyICogYWxsb2NhdGUoIHNpemVfdCBuICkKK3sKKyNpZmRlZiBCSkFNX05FV1NUUl9OT19BTExPQ0FURQorICAgIHJldHVybiAoY2hhciAqKUJKQU1fTUFMTE9DKCBuICk7CisjZWxzZQorICAgIC8qIFNlZSBpZiB3ZSBjYW4gZ3JhYiBzdG9yYWdlIGZyb20gYW4gZXhpc3RpbmcgYmxvY2suICovCisgICAgc2l6ZV90IHJlbWFpbmluZyA9IHN0b3JhZ2VfZmluaXNoIC0gc3RvcmFnZV9zdGFydDsKKyAgICBuID0gKCAoIG4gKyBBTExPQ19BTElHTk1FTlQgLSAxICkgLyBBTExPQ19BTElHTk1FTlQgKSAqIEFMTE9DX0FMSUdOTUVOVDsKKyAgICBpZiAoIHJlbWFpbmluZyA+PSBuICkKKyAgICB7CisgICAgICAgIGNoYXIgKiByZXN1bHQgPSBzdG9yYWdlX3N0YXJ0OworICAgICAgICBzdG9yYWdlX3N0YXJ0ICs9IG47CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGVsc2UgIC8qIE11c3QgYWxsb2NhdGUgYSBuZXcgYmxvY2suICovCisgICAgeworICAgICAgICBzdHJibG9jayAqIG5ld19ibG9jazsKKyAgICAgICAgc2l6ZV90IG5hbGxvYyA9IG47CisgICAgICAgIGlmICggbmFsbG9jIDwgU1RSSU5HX0JMT0NLICkKKyAgICAgICAgICAgIG5hbGxvYyA9IFNUUklOR19CTE9DSzsKKworICAgICAgICAvKiBBbGxvY2F0ZSBhIG5ldyBibG9jayBhbmQgbGluayBpbnRvIHRoZSBjaGFpbi4gKi8KKyAgICAgICAgbmV3X2Jsb2NrID0gKHN0cmJsb2NrICopQkpBTV9NQUxMT0MoIG9mZnNldG9mKCBzdHJibG9jaywgZGF0YVsgMCBdICkgKworICAgICAgICAgICAgbmFsbG9jICogc2l6ZW9mKCBuZXdfYmxvY2stPmRhdGFbIDAgXSApICk7CisgICAgICAgIGlmICggbmV3X2Jsb2NrID09IDAgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5ld19ibG9jay0+bmV4dCA9IHN0cmJsb2NrX2NoYWluOworICAgICAgICBzdHJibG9ja19jaGFpbiA9IG5ld19ibG9jazsKKworICAgICAgICAvKiBUYWtlIGZ1dHVyZSBhbGxvY2F0aW9ucyBvdXQgb2YgdGhlIGxhcmdlciByZW1haW5pbmcgc3BhY2UuICovCisgICAgICAgIGlmICggcmVtYWluaW5nIDwgbmFsbG9jIC0gbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3JhZ2Vfc3RhcnQgPSBuZXdfYmxvY2stPmRhdGEgKyBuOworICAgICAgICAgICAgc3RvcmFnZV9maW5pc2ggPSBuZXdfYmxvY2stPmRhdGEgKyBuYWxsb2M7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld19ibG9jay0+ZGF0YTsKKyAgICB9CisjZW5kaWYKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfa2V5dmFsKCBjaGFyIGNvbnN0ICoga2V5LCBpbnQgY29uc3Qgc2l6ZSApCit7CisgICAgdW5zaWduZWQgaW50IGNvbnN0IG1hZ2ljID0gMjE0NzA1OTM2MzsKKyAgICB1bnNpZ25lZCBpbnQgaGFzaCA9IDA7CisKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IHNpemUgLyBzaXplb2YoIHVuc2lnbmVkIGludCApOyArK2kgKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHZhbDsKKyAgICAgICAgbWVtY3B5KCAmdmFsLCBrZXksIHNpemVvZiggdW5zaWduZWQgaW50ICkgKTsKKyAgICAgICAgaGFzaCA9IGhhc2ggKiBtYWdpYyArIHZhbDsKKyAgICAgICAga2V5ICs9IHNpemVvZiggdW5zaWduZWQgaW50ICk7CisgICAgfQorCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gMDsKKyAgICAgICAgbWVtY3B5KCAmdmFsLCBrZXksIHNpemUgJSBzaXplb2YoIHVuc2lnbmVkIGludCApICk7CisgICAgICAgIGhhc2ggPSBoYXNoICogbWFnaWMgKyB2YWw7CisgICAgfQorCisgICAgcmV0dXJuIGhhc2ggKyAoIGhhc2ggPj4gMTcgKTsKK30KKworCitzdGF0aWMgdm9pZCBzdHJpbmdfc2V0X2luaXQoIHN0cmluZ19zZXQgKiBzZXQgKQoreworICAgIHNldC0+c2l6ZSA9IDA7CisgICAgc2V0LT5udW0gPSA0OworICAgIHNldC0+ZGF0YSA9IChzdHJ1Y3QgaGFzaF9pdGVtICogKilCSkFNX01BTExPQyggc2V0LT5udW0gKiBzaXplb2YoIHN0cnVjdCBoYXNoX2l0ZW0gKiApICk7CisgICAgbWVtc2V0KCBzZXQtPmRhdGEsIDAsIHNldC0+bnVtICogc2l6ZW9mKCBzdHJ1Y3QgaGFzaF9pdGVtICogKSApOworfQorCisKK3N0YXRpYyB2b2lkIHN0cmluZ19zZXRfZG9uZSggc3RyaW5nX3NldCAqIHNldCApCit7CisgICAgQkpBTV9GUkVFKCBzZXQtPmRhdGEgKTsKK30KKworCitzdGF0aWMgdm9pZCBzdHJpbmdfc2V0X3Jlc2l6ZSggc3RyaW5nX3NldCAqIHNldCApCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBzdHJpbmdfc2V0IG5ld19zZXQ7CisgICAgbmV3X3NldC5udW0gPSBzZXQtPm51bSAqIDI7CisgICAgbmV3X3NldC5zaXplID0gc2V0LT5zaXplOworICAgIG5ld19zZXQuZGF0YSA9IChzdHJ1Y3QgaGFzaF9pdGVtICogKilCSkFNX01BTExPQyggc2l6ZW9mKCBzdHJ1Y3QgaGFzaF9pdGVtICoKKyAgICAgICAgKSAqIG5ld19zZXQubnVtICk7CisgICAgbWVtc2V0KCBuZXdfc2V0LmRhdGEsIDAsIHNpemVvZiggc3RydWN0IGhhc2hfaXRlbSAqICkgKiBuZXdfc2V0Lm51bSApOworICAgIGZvciAoIGkgPSAwOyBpIDwgc2V0LT5udW07ICsraSApCisgICAgeworICAgICAgICB3aGlsZSAoIHNldC0+ZGF0YVsgaSBdICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGhhc2hfaXRlbSAqIHRlbXAgPSBzZXQtPmRhdGFbIGkgXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHBvcyA9IHRlbXAtPmhlYWRlci5oYXNoICUgbmV3X3NldC5udW07CisgICAgICAgICAgICBzZXQtPmRhdGFbIGkgXSA9IHRlbXAtPmhlYWRlci5uZXh0OworICAgICAgICAgICAgdGVtcC0+aGVhZGVyLm5leHQgPSBuZXdfc2V0LmRhdGFbIHBvcyBdOworICAgICAgICAgICAgbmV3X3NldC5kYXRhWyBwb3MgXSA9IHRlbXA7CisgICAgICAgIH0KKyAgICB9CisgICAgQkpBTV9GUkVFKCBzZXQtPmRhdGEgKTsKKyAgICAqc2V0ID0gbmV3X3NldDsKK30KKworCitzdGF0aWMgY2hhciBjb25zdCAqIHN0cmluZ19zZXRfaW5zZXJ0KCBzdHJpbmdfc2V0ICogc2V0LCBjaGFyIGNvbnN0ICogc3RyaW5nLAorICAgIGludCBjb25zdCBzaXplICkKK3sKKyAgICB1bnNpZ25lZCBoYXNoID0gaGFzaF9rZXl2YWwoIHN0cmluZywgc2l6ZSApOworICAgIHVuc2lnbmVkIHBvcyA9IGhhc2ggJSBzZXQtPm51bTsKKworICAgIHN0cnVjdCBoYXNoX2l0ZW0gKiByZXN1bHQ7CisKKyAgICBmb3IgKCByZXN1bHQgPSBzZXQtPmRhdGFbIHBvcyBdOyByZXN1bHQ7IHJlc3VsdCA9IHJlc3VsdC0+aGVhZGVyLm5leHQgKQorICAgICAgICBpZiAoICFzdHJuY21wKCByZXN1bHQtPmRhdGEsIHN0cmluZywgc2l6ZSApICYmICFyZXN1bHQtPmRhdGFbIHNpemUgXSApCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LT5kYXRhOworCisgICAgaWYgKCBzZXQtPnNpemUgPj0gc2V0LT5udW0gKQorICAgIHsKKyAgICAgICAgc3RyaW5nX3NldF9yZXNpemUoIHNldCApOworICAgICAgICBwb3MgPSBoYXNoICUgc2V0LT5udW07CisgICAgfQorCisgICAgcmVzdWx0ID0gKHN0cnVjdCBoYXNoX2l0ZW0gKilhbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3QgaGFzaF9oZWFkZXIgKSArIHNpemUgKworICAgICAgICAxICk7CisgICAgcmVzdWx0LT5oZWFkZXIuaGFzaCA9IGhhc2g7CisgICAgcmVzdWx0LT5oZWFkZXIubmV4dCA9IHNldC0+ZGF0YVsgcG9zIF07CisjaWZuZGVmIE5ERUJVRworICAgIHJlc3VsdC0+aGVhZGVyLm1hZ2ljID0gT0JKRUNUX01BR0lDOworI2VuZGlmCisgICAgbWVtY3B5KCByZXN1bHQtPmRhdGEsIHN0cmluZywgc2l6ZSApOworICAgIHJlc3VsdC0+ZGF0YVsgc2l6ZSBdID0gJ1wwJzsKKyAgICBhc3NlcnQoIGhhc2hfa2V5dmFsKCByZXN1bHQtPmRhdGEsIHNpemUgKSA9PSByZXN1bHQtPmhlYWRlci5oYXNoICk7CisgICAgc2V0LT5kYXRhWyBwb3MgXSA9IHJlc3VsdDsKKyAgICBzdHJ0b3RhbCArPSBzaXplICsgMTsKKyAgICArK3NldC0+c2l6ZTsKKworICAgIHJldHVybiByZXN1bHQtPmRhdGE7Cit9CisKKworc3RhdGljIHN0cnVjdCBoYXNoX2l0ZW0gKiBvYmplY3RfZ2V0X2l0ZW0oIE9CSkVDVCAqIG9iaiApCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaGFzaF9pdGVtICopKCAoY2hhciAqKW9iaiAtIG9mZnNldG9mKCBzdHJ1Y3QgaGFzaF9pdGVtLCBkYXRhCisgICAgICAgICkgKTsKK30KKworCitzdGF0aWMgdm9pZCBvYmplY3RfdmFsaWRhdGUoIE9CSkVDVCAqIG9iaiApCit7CisgICAgYXNzZXJ0KCBvYmogKTsKKyAgICBhc3NlcnQoIG9iamVjdF9nZXRfaXRlbSggb2JqICktPmhlYWRlci5tYWdpYyA9PSBPQkpFQ1RfTUFHSUMgKTsKK30KKworCisvKgorICogb2JqZWN0X25ld19yYW5nZSgpIC0gY3JlYXRlIGFuIG9iamVjdCBmcm9tIGEgc3RyaW5nIG9mIGdpdmVuIGxlbmd0aAorICovCisKK09CSkVDVCAqIG9iamVjdF9uZXdfcmFuZ2UoIGNoYXIgY29uc3QgKiBjb25zdCBzdHJpbmcsIGludCBjb25zdCBzaXplICkKK3sKKyAgICArK3N0cmNvdW50X2luOworCisjaWZkZWYgQkpBTV9OT19NRU1fQ0FDSEUKKyAgICB7CisgICAgICAgIHN0cnVjdCBoYXNoX2l0ZW0gKiBjb25zdCBtID0gKHN0cnVjdCBoYXNoX2l0ZW0gKilCSkFNX01BTExPQyggc2l6ZW9mKAorICAgICAgICAgICAgc3RydWN0IGhhc2hfaGVhZGVyICkgKyBzaXplICsgMSApOworICAgICAgICBzdHJ0b3RhbCArPSBzaXplICsgMTsKKyAgICAgICAgbWVtY3B5KCBtLT5kYXRhLCBzdHJpbmcsIHNpemUgKTsKKyAgICAgICAgbS0+ZGF0YVsgc2l6ZSBdID0gJ1wwJzsKKyAgICAgICAgbS0+aGVhZGVyLm1hZ2ljID0gT0JKRUNUX01BR0lDOworICAgICAgICByZXR1cm4gKE9CSkVDVCAqKW0tPmRhdGE7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoICFzdHJoYXNoLmRhdGEgKQorICAgICAgICBzdHJpbmdfc2V0X2luaXQoICZzdHJoYXNoICk7CisgICAgcmV0dXJuIChPQkpFQ1QgKilzdHJpbmdfc2V0X2luc2VydCggJnN0cmhhc2gsIHN0cmluZywgc2l6ZSApOworI2VuZGlmCit9CisKKworLyoKKyAqIG9iamVjdF9uZXcoKSAtIGNyZWF0ZSBhbiBvYmplY3QgZnJvbSBhIHN0cmluZworICovCisKK09CSkVDVCAqIG9iamVjdF9uZXcoIGNoYXIgY29uc3QgKiBjb25zdCBzdHJpbmcgKQoreworICAgIHJldHVybiBvYmplY3RfbmV3X3JhbmdlKCBzdHJpbmcsIHN0cmxlbiggc3RyaW5nICkgKTsKK30KKworCisjaWZuZGVmIG9iamVjdF9jb3B5CisKKy8qCisgKiBvYmplY3RfY29weSgpIC0gcmV0dXJuIGEgY29weSBvZiBhbiBvYmplY3QKKyAqLworCitPQkpFQ1QgKiBvYmplY3RfY29weSggT0JKRUNUICogb2JqICkKK3sKKyAgICBvYmplY3RfdmFsaWRhdGUoIG9iaiApOworI2lmZGVmIEJKQU1fTk9fTUVNX0NBQ0hFCisgICAgcmV0dXJuIG9iamVjdF9uZXcoIG9iamVjdF9zdHIoIG9iaiApICk7CisjZWxzZQorICAgICsrc3RyY291bnRfaW47CisgICAgcmV0dXJuIG9iajsKKyNlbmRpZgorfQorCisKKy8qCisgKiBvYmplY3RfZnJlZSgpIC0gZnJlZSBhbiBvYmplY3QKKyAqLworCit2b2lkIG9iamVjdF9mcmVlKCBPQkpFQ1QgKiBvYmogKQoreworICAgIG9iamVjdF92YWxpZGF0ZSggb2JqICk7CisjaWZkZWYgQkpBTV9OT19NRU1fQ0FDSEUKKyAgICBCSkFNX0ZSRUUoIG9iamVjdF9nZXRfaXRlbSggb2JqICkgKTsKKyNlbmRpZgorICAgICsrc3RyY291bnRfb3V0OworfQorCisKKy8qCisgKiBvYmplY3Rfc3RyKCkgLSByZXR1cm4gdGhlIE9CSkVDVCdzIGludGVybmFsIEMgc3RyaW5nCisgKi8KKworY2hhciBjb25zdCAqIG9iamVjdF9zdHIoIE9CSkVDVCAqIG9iaiApCit7CisgICAgb2JqZWN0X3ZhbGlkYXRlKCBvYmogKTsKKyAgICByZXR1cm4gKGNoYXIgY29uc3QgKilvYmo7Cit9CisKKworLyoKKyAqIG9iamVjdF9lcXVhbCgpIC0gY29tcGFyZSB0d28gb2JqZWN0cworICovCisKK2ludCBvYmplY3RfZXF1YWwoIE9CSkVDVCAqIGxocywgT0JKRUNUICogcmhzICkKK3sKKyAgICBvYmplY3RfdmFsaWRhdGUoIGxocyApOworICAgIG9iamVjdF92YWxpZGF0ZSggcmhzICk7CisjaWZkZWYgQkpBTV9OT19NRU1fQ0FDSEUKKyAgICByZXR1cm4gIXN0cmNtcCggb2JqZWN0X3N0ciggbGhzICksIG9iamVjdF9zdHIoIHJocyApICk7CisjZWxzZQorICAgIGFzc2VydCggKCBsaHMgPT0gcmhzICkgPT0gIXN0cmNtcCggb2JqZWN0X3N0ciggbGhzICksIG9iamVjdF9zdHIoIHJocyApICkgKTsKKyAgICByZXR1cm4gbGhzID09IHJoczsKKyNlbmRpZgorfQorCisKKy8qCisgKiBvYmplY3RfaGFzaCgpIC0gcmV0dXJucyB0aGUgaGFzaCB2YWx1ZSBvZiBhbiBvYmplY3QKKyAqLworCit1bnNpZ25lZCBpbnQgb2JqZWN0X2hhc2goIE9CSkVDVCAqIG9iaiApCit7CisgICAgb2JqZWN0X3ZhbGlkYXRlKCBvYmogKTsKKyNpZmRlZiBCSkFNX05PX01FTV9DQUNIRQorICAgIHJldHVybiBoYXNoX2tleXZhbCggb2JqZWN0X3N0ciggb2JqICksIHN0cmxlbiggb2JqZWN0X3N0ciggb2JqICkgKSApOworI2Vsc2UKKyAgICByZXR1cm4gb2JqZWN0X2dldF9pdGVtKCBvYmogKS0+aGVhZGVyLmhhc2g7CisjZW5kaWYKK30KKworI2VuZGlmCisKKy8qCisgKiBvYmplY3RfZG9uZSgpIC0gZnJlZSBzdHJpbmcgdGFibGVzLgorICovCisKK3ZvaWQgb2JqZWN0X2RvbmUoKQoreworI2lmZGVmIEJKQU1fTkVXU1RSX05PX0FMTE9DQVRFCisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IHN0cmhhc2gubnVtOyArK2kgKQorICAgIHsKKyAgICAgICAgd2hpbGUgKCBzdHJoYXNoLmRhdGFbIGkgXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBoYXNoX2l0ZW0gKiBpdGVtID0gc3RyaGFzaC5kYXRhWyBpIF07CisgICAgICAgICAgICBzdHJoYXNoLmRhdGFbIGkgXSA9IGl0ZW0tPmhlYWRlci5uZXh0OworICAgICAgICAgICAgQkpBTV9GUkVFKCBpdGVtICk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIC8qIFJlY2xhaW0gc3RyaW5nIGJsb2Nrcy4gKi8KKyAgICB3aGlsZSAoIHN0cmJsb2NrX2NoYWluICkKKyAgICB7CisgICAgICAgIHN0cmJsb2NrICogY29uc3QgbiA9IHN0cmJsb2NrX2NoYWluLT5uZXh0OworICAgICAgICBCSkFNX0ZSRUUoIHN0cmJsb2NrX2NoYWluICk7CisgICAgICAgIHN0cmJsb2NrX2NoYWluID0gbjsKKyAgICB9CisjZW5kaWYKKworICAgIHN0cmluZ19zZXRfZG9uZSggJnN0cmhhc2ggKTsKKworICAgIGlmICggREVCVUdfTUVNICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiVkSyBpbiBzdHJpbmdzXG4iLCBzdHJ0b3RhbCAvIDEwMjQgKTsKKyAgICAgICAgaWYgKCBzdHJjb3VudF9pbiAhPSBzdHJjb3VudF9vdXQgKQorICAgICAgICAgICAgcHJpbnRmKCAiLS0tICVkIHN0cmluZ3Mgb2YgJWQgZGFuZ2xpbmdcbiIsIHN0cmNvdW50X2luIC0KKyAgICAgICAgICAgICAgICBzdHJjb3VudF9vdXQsIHN0cmNvdW50X2luICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvb2JqZWN0LmggYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJiOWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvb2JqZWN0LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFN0ZXZlbiBXYXRhbmFiZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qCisgKiBvYmplY3QuaCAtIG9iamVjdCBtYW5pcHVsYXRpb24gcm91dGluZXMKKyAqLworCisjaWZuZGVmIEJPT1NUX0pBTV9PQkpFQ1RfSAorI2RlZmluZSBCT09TVF9KQU1fT0JKRUNUX0gKKwordHlwZWRlZiBzdHJ1Y3QgX29iamVjdCBPQkpFQ1Q7CisKK09CSkVDVCAqIG9iamVjdF9uZXcoIGNoYXIgY29uc3QgKiBjb25zdCApOworT0JKRUNUICogb2JqZWN0X25ld19yYW5nZSggY2hhciBjb25zdCAqIGNvbnN0LCBpbnQgY29uc3Qgc2l6ZSApOwordm9pZCBvYmplY3RfZG9uZSggdm9pZCApOworCisjaWYgZGVmaW5lZChOREVCVUcpICYmICFkZWZpbmVkKEJKQU1fTk9fTUVNX0NBQ0hFKQorCitzdHJ1Y3QgaGFzaF9oZWFkZXIKK3sKKyAgICB1bnNpZ25lZCBpbnQgaGFzaDsKKyAgICBzdHJ1Y3QgaGFzaF9pdGVtICogbmV4dDsKK307CisKKyNkZWZpbmUgb2JqZWN0X3N0ciggb2JqICkgKChjaGFyIGNvbnN0ICopKG9iaikpCisjZGVmaW5lIG9iamVjdF9jb3B5KCBvYmogKSAob2JqKQorI2RlZmluZSBvYmplY3RfZnJlZSggb2JqICkgKCh2b2lkKTApCisjZGVmaW5lIG9iamVjdF9lcXVhbCggbGhzLCByaHMgKSAoKGxocykgPT0gKHJocykpCisjZGVmaW5lIG9iamVjdF9oYXNoKCBvYmogKSAoKChzdHJ1Y3QgaGFzaF9oZWFkZXIgKikoKGNoYXIgKikob2JqKSAtIHNpemVvZihzdHJ1Y3QgaGFzaF9oZWFkZXIpKSktPmhhc2gpCisKKyNlbHNlCisKK2NoYXIgY29uc3QgKiBvYmplY3Rfc3RyICAoIE9CSkVDVCAqICk7CitPQkpFQ1QgKiAgICAgb2JqZWN0X2NvcHkgKCBPQkpFQ1QgKiApOwordm9pZCAgICAgICAgIG9iamVjdF9mcmVlICggT0JKRUNUICogKTsKK2ludCAgICAgICAgICBvYmplY3RfZXF1YWwoIE9CSkVDVCAqLCBPQkpFQ1QgKiApOwordW5zaWduZWQgaW50IG9iamVjdF9oYXNoICggT0JKRUNUICogKTsKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvb3B0aW9uLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9vcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjVlNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvb3B0aW9uLmMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk1IENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworIyBpbmNsdWRlICJqYW0uaCIKKyMgaW5jbHVkZSAib3B0aW9uLmgiCisKKy8qCisgKiBvcHRpb24uYyAtIGNvbW1hbmQgbGluZSBvcHRpb24gcHJvY2Vzc2luZworICoKKyAqIHtvID5vCisgKiAgXDw+KSAiUHJvY2VzcyBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcyBkZWZpbmVkIGluIDxvcHRpb24uaD4uCisgKiAgICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYXJndltdIGVsZW1lbnRzIHVzZWQgdXAgYnkgb3B0aW9ucywKKyAqICAgICAgICBvciAtMSBpZiBhbiBpbnZhbGlkIG9wdGlvbiBmbGFnIHdhcyBnaXZlbiBvciBhbiBhcmd1bWVudAorICogICAgICAgIHdhcyBzdXBwbGllZCBmb3IgYW4gb3B0aW9uIHRoYXQgZG9lcyBub3QgcmVxdWlyZSBvbmUuIgorICovCisKK2ludCBnZXRvcHRpb25zKCBpbnQgYXJnYywgY2hhciAqICogYXJndiwgY2hhciAqIG9wdHMsIGJqYW1fb3B0aW9uICogb3B0diApCit7CisgICAgaW50IGk7CisgICAgaW50IG9wdGMgPSBOX09QVFM7CisKKyAgICBtZW1zZXQoIChjaGFyICopb3B0diwgJ1wwJywgc2l6ZW9mKCAqb3B0diApICogTl9PUFRTICk7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IGFyZ2M7ICsraSApCisgICAgeworICAgICAgICBjaGFyICphcmc7CisKKyAgICAgICAgaWYgKCAoIGFyZ3ZbIGkgXVsgMCBdICE9ICctJyApIHx8CisgICAgICAgICAgICAoICggYXJndlsgaSBdWyAxIF0gIT0gJy0nICkgJiYgIWlzYWxwaGEoIGFyZ3ZbIGkgXVsgMSBdICkgKSApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoICFvcHRjLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoICJ0b28gbWFueSBvcHRpb25zICglZCBtYXgpXG4iLCBOX09QVFMgKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIGFyZyA9ICZhcmd2WyBpIF1bIDEgXTsgKmFyZzsgKythcmcgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyICogZjsKKworICAgICAgICAgICAgZm9yICggZiA9IG9wdHM7ICpmOyArK2YgKQorICAgICAgICAgICAgICAgIGlmICggKmYgPT0gKmFyZyApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAoICEqZiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCAiSW52YWxpZCBvcHRpb246IC0lY1xuIiwgKmFyZyApOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3B0di0+ZmxhZyA9ICpmOworCisgICAgICAgICAgICBpZiAoIGZbIDEgXSAhPSAnOicgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9wdHYrKy0+dmFsID0gInRydWUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGFyZ1sgMSBdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcHR2KystPnZhbCA9ICZhcmdbMV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKytpIDwgYXJnYyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3B0disrLT52YWwgPSBhcmd2WyBpIF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCAib3B0aW9uOiAtJWMgbmVlZHMgYXJndW1lbnRcbiIsICpmICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGk7Cit9CisKKworLyoKKyAqIE5hbWU6IGdldG9wdHZhbCgpIC0gZmluZCBhbiBvcHRpb24gZ2l2ZW4gaXRzIGNoYXJhY3Rlci4KKyAqLworCitjaGFyICogZ2V0b3B0dmFsKCBiamFtX29wdGlvbiAqIG9wdHYsIGNoYXIgb3B0LCBpbnQgc3Vib3B0ICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IE5fT1BUUzsgKytpLCArK29wdHYgKQorICAgICAgICBpZiAoICggb3B0di0+ZmxhZyA9PSBvcHQgKSAmJiAhc3Vib3B0LS0gKQorICAgICAgICAgICAgcmV0dXJuIG9wdHYtPnZhbDsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL29wdGlvbi5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvb3B0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5Yzc0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL29wdGlvbi5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NSBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qCisgKiBvcHRpb24uaCAtIGNvbW1hbmQgbGluZSBvcHRpb24gcHJvY2Vzc2luZworICoKKyAqIHtvID5vCisgKiAgXCAtKSAiQ29tbWFuZCBsaW5lIG9wdGlvbi4iCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYmphbV9vcHRpb24KK3sKKyAgICBjaGFyIGZsYWc7ICAgLyogZmlsbGVkIGluIGJ5IGdldG9wdGlvbigpICovCisgICAgY2hhciAqIHZhbDsgIC8qIHNldCB0byByYW5kb20gYWRkcmVzcyBpZiB0cnVlICovCit9IGJqYW1fb3B0aW9uOworCisjZGVmaW5lIE5fT1BUUyAyNTYKKworaW50ICAgIGdldG9wdGlvbnMoIGludCBhcmdjLCBjaGFyICogKiBhcmd2LCBjaGFyICogb3B0cywgYmphbV9vcHRpb24gKiBvcHR2ICk7CitjaGFyICogZ2V0b3B0dmFsKCBiamFtX29wdGlvbiAqIG9wdHYsIGNoYXIgb3B0LCBpbnQgc3Vib3B0ICk7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9vdXRwdXQuYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL291dHB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYWVlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9vdXRwdXQuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICAgIENvcHlyaWdodCAyMDA3IFJlbmUgUml2ZXJhCisgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyovCisKKyNpbmNsdWRlICJqYW0uaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKworI2RlZmluZSBiamFtX291dCAoc3Rkb3V0KQorI2RlZmluZSBiamFtX2VyciAoc3RkZXJyKQorCitzdGF0aWMgdm9pZCBvdXRfKCBjaGFyIGNvbnN0ICogZGF0YSwgRklMRSAqIGNvbnN0IGlvICkKK3sKKyAgICB3aGlsZSAoICpkYXRhICkKKyAgICB7CisgICAgICAgIHNpemVfdCBjb25zdCBsZW4gPSBzdHJjc3BuKCBkYXRhLCAiXHIiICk7CisgICAgICAgIGRhdGEgKz0gZndyaXRlKCBkYXRhLCAxLCBsZW4sIGlvICk7CisgICAgICAgIGlmICggKmRhdGEgPT0gJ1xyJyApICsrZGF0YTsKKyAgICB9Cit9CisKKwordm9pZCBvdXRfYWN0aW9uCisoCisgICAgY2hhciBjb25zdCAqIGNvbnN0IGFjdGlvbiwKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgdGFyZ2V0LAorICAgIGNoYXIgY29uc3QgKiBjb25zdCBjb21tYW5kLAorICAgIGNoYXIgY29uc3QgKiBjb25zdCBvdXRfZGF0YSwKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZXJyX2RhdGEsCisgICAgaW50IGNvbnN0IGV4aXRfcmVhc29uCispCit7CisgICAgLyogUHJpbnQgb3V0IHRoZSBhY3Rpb24gKyB0YXJnZXQgbGluZSwgaWYgdGhlIGFjdGlvbiBpcyBxdWlldCB0aGUgYWN0aW9uCisgICAgICogc2hvdWxkIGJlIG51bGwuCisgICAgICovCisgICAgaWYgKCBhY3Rpb24gKQorICAgICAgICBmcHJpbnRmKCBiamFtX291dCwgIiVzICVzXG4iLCBhY3Rpb24sIHRhcmdldCApOworCisgICAgLyogUHJpbnQgb3V0IHRoZSBjb21tYW5kIGV4ZWN1dGVkIGlmIGdpdmVuIC1kKzIuICovCisgICAgaWYgKCBERUJVR19FWEVDICkKKyAgICB7CisgICAgICAgIGZwdXRzKCBjb21tYW5kLCBiamFtX291dCApOworICAgICAgICBmcHV0YyggJ1xuJywgYmphbV9vdXQgKTsKKyAgICB9CisKKyAgICAvKiBQcmludCBvdXQgdGhlIGNvbW1hbmQgZXhlY3V0ZWQgdG8gdGhlIGNvbW1hbmQgc3RyZWFtLiAqLworICAgIGlmICggZ2xvYnMuY21kb3V0ICkKKyAgICAgICAgZnB1dHMoIGNvbW1hbmQsIGdsb2JzLmNtZG91dCApOworCisgICAgLyogSWYgdGhlIHByb2Nlc3MgZXhwaXJlZCwgbWFrZSB1c2VyIGF3YXJlIHdpdGggYW4gZXhwbGljaXQgbWVzc2FnZSwgYnV0IGRvCisgICAgICogdGhpcyBvbmx5IGZvciBub24tcXVpZXQgYWN0aW9ucy4KKyAgICAgKi8KKyAgICBpZiAoIGV4aXRfcmVhc29uID09IEVYSVRfVElNRU9VVCAmJiBhY3Rpb24gKQorICAgICAgICBmcHJpbnRmKCBiamFtX291dCwgIiVsZCBzZWNvbmQgdGltZSBsaW1pdCBleGNlZWRlZFxuIiwgZ2xvYnMudGltZW91dCApOworCisgICAgLyogUHJpbnQgb3V0IHRoZSBjb21tYW5kIG91dHB1dCwgaWYgcmVxdWVzdGVkLCBvciBpZiB0aGUgcHJvZ3JhbSBmYWlsZWQsIGJ1dAorICAgICAqIG9ubHkgb3V0cHV0IGZvciBub24tcXVpZXQgYWN0aW9ucy4KKyAgICAgKi8KKyAgICBpZiAoIGFjdGlvbiB8fCBleGl0X3JlYXNvbiAhPSBFWElUX09LICkKKyAgICB7CisgICAgICAgIGlmICggb3V0X2RhdGEgJiYKKyAgICAgICAgICAgKCAoIGdsb2JzLnBpcGVfYWN0aW9uICYgMSAvKiBTVERPVVRfRklMRU5PICovICkgfHwKKyAgICAgICAgICAgICAoIGdsb2JzLnBpcGVfYWN0aW9uID09IDAgKSApICkKKyAgICAgICAgICAgIG91dF8oIG91dF9kYXRhLCBiamFtX291dCApOworICAgICAgICBpZiAoIGVycl9kYXRhICYmICggZ2xvYnMucGlwZV9hY3Rpb24gJiAyIC8qIFNUREVSUl9GSUxFTk8gKi8gKSApCisgICAgICAgICAgICBvdXRfKCBlcnJfZGF0YSwgYmphbV9lcnIgKTsKKyAgICB9CisKKyAgICBmZmx1c2goIGJqYW1fb3V0ICk7CisgICAgZmZsdXNoKCBiamFtX2VyciApOworICAgIGZmbHVzaCggZ2xvYnMuY21kb3V0ICk7Cit9CisKKworT0JKRUNUICogb3V0Zl9pbnQoIGludCBjb25zdCB2YWx1ZSApCit7CisgICAgY2hhciBidWZmZXJbIDUwIF07CisgICAgc3ByaW50ZiggYnVmZmVyLCAiJWkiLCB2YWx1ZSApOworICAgIHJldHVybiBvYmplY3RfbmV3KCBidWZmZXIgKTsKK30KKworCitPQkpFQ1QgKiBvdXRmX2RvdWJsZSggZG91YmxlIGNvbnN0IHZhbHVlICkKK3sKKyAgICBjaGFyIGJ1ZmZlclsgNTAgXTsKKyAgICBzcHJpbnRmKCBidWZmZXIsICIlZiIsIHZhbHVlICk7CisgICAgcmV0dXJuIG9iamVjdF9uZXcoIGJ1ZmZlciApOworfQorCisKK09CSkVDVCAqIG91dGZfdGltZSggdGltZXN0YW1wIGNvbnN0ICogY29uc3QgdGltZSApCit7CisgICAgcmV0dXJuIG9iamVjdF9uZXcoIHRpbWVzdGFtcF9zdHIoIHRpbWUgKSApOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvb3V0cHV0LmggYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9vdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODZlODY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvb3V0cHV0LmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAgICBDb3B5cmlnaHQgMjAwNyBSZW5lIFJpdmVyYQorICAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAgICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisqLworCisjaWZuZGVmIEJKQU1fT1VUUFVUX0gKKyNkZWZpbmUgQkpBTV9PVVRQVVRfSAorCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAidGltZXN0YW1wLmgiCisKKyNkZWZpbmUgRVhJVF9PSyAwCisjZGVmaW5lIEVYSVRfRkFJTCAxCisjZGVmaW5lIEVYSVRfVElNRU9VVCAyCisKK3ZvaWQgb3V0X2FjdGlvbigKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgYWN0aW9uLAorICAgIGNoYXIgY29uc3QgKiBjb25zdCB0YXJnZXQsCisgICAgY2hhciBjb25zdCAqIGNvbnN0IGNvbW1hbmQsCisgICAgY2hhciBjb25zdCAqIGNvbnN0IG91dF9kYXRhLAorICAgIGNoYXIgY29uc3QgKiBjb25zdCBlcnJfZGF0YSwKKyAgICBpbnQgY29uc3QgZXhpdF9yZWFzb24KKyk7CisKK09CSkVDVCAqIG91dGZfaW50KCBpbnQgY29uc3QgdmFsdWUgKTsKK09CSkVDVCAqIG91dGZfZG91YmxlKCBkb3VibGUgY29uc3QgdmFsdWUgKTsKK09CSkVDVCAqIG91dGZfdGltZSggdGltZXN0YW1wIGNvbnN0ICogY29uc3QgdmFsdWUgKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9wYXJzZS5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjQxMmUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcGFyc2UuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAyMDAwIENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyogIFRoaXMgZmlsZSBpcyBBTFNPOgorICogIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisjaW5jbHVkZSAiamFtLmgiCisjaW5jbHVkZSAibGlzdHMuaCIKKyNpbmNsdWRlICJwYXJzZS5oIgorI2luY2x1ZGUgInNjYW4uaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJtb2R1bGVzLmgiCisjaW5jbHVkZSAiZnJhbWVzLmgiCisjaW5jbHVkZSAiZnVuY3Rpb24uaCIKKworLyoKKyAqIHBhcnNlLmMgLSBtYWtlIGFuZCBkZXN0cm95IHBhcnNlIHRyZWVzIGFzIGRyaXZlbiBieSB0aGUgcGFyc2VyCisgKgorICogMDkvMDcvMDAgKHNlaXdhbGQpIC0gcmVmIGNvdW50IG9uIFBBUlNFIHRvIGF2b2lkIGZyZWVpbmcgd2hlbiB1c2VkLAorICogICAgICBhcyBwZXIgTWF0dCBBcm1zdHJvbmcuCisgKiAwOS8xMS8wMCAoc2Vpd2FsZCkgLSBzdHJ1Y3R1cmUgcmV3b3JrZWQgdG8gcmVmbGVjdCB0aGF0ICgqZnVuYykoKQorICogICAgICByZXR1cm5zIGEgTElTVCAqLgorICovCisKK3N0YXRpYyBQQVJTRSAqIHl5cHNhdmU7CisKK3ZvaWQgcGFyc2VfZmlsZSggT0JKRUNUICogZiwgRlJBTUUgKiBmcmFtZSApCit7CisgICAgLyogU3VzcGVuZCBzY2FuIG9mIGN1cnJlbnQgZmlsZSBhbmQgcHVzaCB0aGlzIG5ldyBmaWxlIGluIHRoZSBzdHJlYW0uICovCisgICAgeXlmcGFyc2UoIGYgKTsKKworICAgIC8qIE5vdyBwYXJzZSBlYWNoIGJsb2NrIG9mIHJ1bGVzIGFuZCBleGVjdXRlIGl0LiBFeGVjdXRlIGl0IG91dHNpZGUgb2YgdGhlCisgICAgICogcGFyc2VyIHNvIHRoYXQgcmVjdXJzaXZlIGNhbGxzIHRvIHl5cnVuKCkgd29yayAobm8gcmVjdXJzaXZlIHl5cGFyc2UncykuCisgICAgICovCisKKyAgICBmb3IgKCA7IDsgKQorICAgIHsKKyAgICAgICAgUEFSU0UgKiBwOworICAgICAgICBGVU5DVElPTiAqIGZ1bmM7CisKKyAgICAgICAgLyogRmlsbGVkIGJ5IHl5cGFyc2UoKSBjYWxsaW5nIHBhcnNlX3NhdmUoKS4gKi8KKyAgICAgICAgeXlwc2F2ZSA9IDA7CisKKyAgICAgICAgLyogSWYgcGFyc2UgZXJyb3Igb3IgZW1wdHkgcGFyc2UsIG91dHRhIGhlcmUuICovCisgICAgICAgIGlmICggeXlwYXJzZSgpIHx8ICEoIHAgPSB5eXBzYXZlICkgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogUnVuIHRoZSBwYXJzZSB0cmVlLiAqLworICAgICAgICBmdW5jID0gZnVuY3Rpb25fY29tcGlsZSggcCApOworICAgICAgICBwYXJzZV9mcmVlKCBwICk7CisgICAgICAgIGxpc3RfZnJlZSggZnVuY3Rpb25fcnVuKCBmdW5jLCBmcmFtZSwgc3RhY2tfZ2xvYmFsKCkgKSApOworICAgICAgICBmdW5jdGlvbl9mcmVlKCBmdW5jICk7CisgICAgfQorfQorCisKK3ZvaWQgcGFyc2Vfc2F2ZSggUEFSU0UgKiBwICkKK3sKKyAgICB5eXBzYXZlID0gcDsKK30KKworCitQQVJTRSAqIHBhcnNlX21ha2UoCisgICAgaW50ICAgICAgdHlwZSwKKyAgICBQQVJTRSAgKiBsZWZ0LAorICAgIFBBUlNFICAqIHJpZ2h0LAorICAgIFBBUlNFICAqIHRoaXJkLAorICAgIE9CSkVDVCAqIHN0cmluZywKKyAgICBPQkpFQ1QgKiBzdHJpbmcxLAorICAgIGludCAgICAgIG51bSApCit7CisgICAgUEFSU0UgKiBwID0gKFBBUlNFICopQkpBTV9NQUxMT0MoIHNpemVvZiggUEFSU0UgKSApOworCisgICAgcC0+dHlwZSA9IHR5cGU7CisgICAgcC0+bGVmdCA9IGxlZnQ7CisgICAgcC0+cmlnaHQgPSByaWdodDsKKyAgICBwLT50aGlyZCA9IHRoaXJkOworICAgIHAtPnN0cmluZyA9IHN0cmluZzsKKyAgICBwLT5zdHJpbmcxID0gc3RyaW5nMTsKKyAgICBwLT5udW0gPSBudW07CisgICAgcC0+cmVmcyA9IDE7CisgICAgcC0+cnVsZW5hbWUgPSAwOworCisgICAgaWYgKCBsZWZ0ICkKKyAgICB7CisgICAgICAgIHAtPmZpbGUgPSBvYmplY3RfY29weSggbGVmdC0+ZmlsZSApOworICAgICAgICBwLT5saW5lID0gbGVmdC0+bGluZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgeXlpbnB1dF9sYXN0X3JlYWRfdG9rZW4oICZwLT5maWxlLCAmcC0+bGluZSApOworICAgICAgICBwLT5maWxlID0gb2JqZWN0X2NvcHkoIHAtPmZpbGUgKTsKKyAgICB9CisKKyAgICByZXR1cm4gcDsKK30KKworCit2b2lkIHBhcnNlX3JlZmVyKCBQQVJTRSAqIHAgKQoreworICAgICsrcC0+cmVmczsKK30KKworCit2b2lkIHBhcnNlX2ZyZWUoIFBBUlNFICogcCApCit7CisgICAgaWYgKCAtLXAtPnJlZnMgKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIHAtPnN0cmluZyApCisgICAgICAgIG9iamVjdF9mcmVlKCBwLT5zdHJpbmcgKTsKKyAgICBpZiAoIHAtPnN0cmluZzEgKQorICAgICAgICBvYmplY3RfZnJlZSggcC0+c3RyaW5nMSApOworICAgIGlmICggcC0+bGVmdCApCisgICAgICAgIHBhcnNlX2ZyZWUoIHAtPmxlZnQgKTsKKyAgICBpZiAoIHAtPnJpZ2h0ICkKKyAgICAgICAgcGFyc2VfZnJlZSggcC0+cmlnaHQgKTsKKyAgICBpZiAoIHAtPnRoaXJkICkKKyAgICAgICAgcGFyc2VfZnJlZSggcC0+dGhpcmQgKTsKKyAgICBpZiAoIHAtPnJ1bGVuYW1lICkKKyAgICAgICAgb2JqZWN0X2ZyZWUoIHAtPnJ1bGVuYW1lICk7CisgICAgaWYgKCBwLT5maWxlICkKKyAgICAgICAgb2JqZWN0X2ZyZWUoIHAtPmZpbGUgKTsKKworICAgIEJKQU1fRlJFRSggKGNoYXIgKilwICk7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9wYXJzZS5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQ3YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcGFyc2UuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTMsIDIwMDAgQ2hyaXN0b3BoZXIgU2Vpd2FsZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiBUaGlzIGZpbGUgaXMgQUxTTzoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworLyoKKyAqIHBhcnNlLmggLSBtYWtlIGFuZCBkZXN0cm95IHBhcnNlIHRyZWVzIGFzIGRyaXZlbiBieSB0aGUgcGFyc2VyLgorICovCisKKyNpZm5kZWYgUEFSU0VfRFdBMjAwMTEwMjBfSAorI2RlZmluZSBQQVJTRV9EV0EyMDAxMTAyMF9ICisKKyNpbmNsdWRlICJmcmFtZXMuaCIKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgIm1vZHVsZXMuaCIKKworCisjZGVmaW5lIFBBUlNFX0FQUEVORCAgICAwCisjZGVmaW5lIFBBUlNFX0ZPUkVBQ0ggICAxCisjZGVmaW5lIFBBUlNFX0lGICAgICAgICAyCisjZGVmaW5lIFBBUlNFX0VWQUwgICAgICAzCisjZGVmaW5lIFBBUlNFX0lOQ0xVREUgICA0CisjZGVmaW5lIFBBUlNFX0xJU1QgICAgICA1CisjZGVmaW5lIFBBUlNFX0xPQ0FMICAgICA2CisjZGVmaW5lIFBBUlNFX01PRFVMRSAgICA3CisjZGVmaW5lIFBBUlNFX0NMQVNTICAgICA4CisjZGVmaW5lIFBBUlNFX05VTEwgICAgICA5CisjZGVmaW5lIFBBUlNFX09OICAgICAgICAxMAorI2RlZmluZSBQQVJTRV9SVUxFICAgICAgMTEKKyNkZWZpbmUgUEFSU0VfUlVMRVMgICAgIDEyCisjZGVmaW5lIFBBUlNFX1NFVCAgICAgICAxMworI2RlZmluZSBQQVJTRV9TRVRDT01QICAgMTQKKyNkZWZpbmUgUEFSU0VfU0VURVhFQyAgIDE1CisjZGVmaW5lIFBBUlNFX1NFVFRJTkdTICAxNgorI2RlZmluZSBQQVJTRV9TV0lUQ0ggICAgMTcKKyNkZWZpbmUgUEFSU0VfV0hJTEUgICAgIDE4CisKKworLyoKKyAqIFBhcnNlIHRyZWUgbm9kZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBfUEFSU0UgUEFSU0U7CisKK3N0cnVjdCBfUEFSU0UgeworICAgIGludCAgICAgIHR5cGU7CisgICAgUEFSU0UgICogbGVmdDsKKyAgICBQQVJTRSAgKiByaWdodDsKKyAgICBQQVJTRSAgKiB0aGlyZDsKKyAgICBPQkpFQ1QgKiBzdHJpbmc7CisgICAgT0JKRUNUICogc3RyaW5nMTsKKyAgICBpbnQgICAgICBudW07CisgICAgaW50ICAgICAgcmVmczsKKyAgICBPQkpFQ1QgKiBydWxlbmFtZTsKKyAgICBPQkpFQ1QgKiBmaWxlOworICAgIGludCAgICAgIGxpbmU7Cit9OworCit2b2lkIHBhcnNlX2ZpbGUoIE9CSkVDVCAqLCBGUkFNRSAqICk7Cit2b2lkIHBhcnNlX3NhdmUoIFBBUlNFICogKTsKKworUEFSU0UgKiBwYXJzZV9tYWtlKCBpbnQgdHlwZSwgUEFSU0UgKiBsZWZ0LCBQQVJTRSAqIHJpZ2h0LCBQQVJTRSAqIHRoaXJkLAorICAgIE9CSkVDVCAqIHN0cmluZywgT0JKRUNUICogc3RyaW5nMSwgaW50IG51bSApOworCit2b2lkIHBhcnNlX3JlZmVyKCBQQVJTRSAqICk7Cit2b2lkIHBhcnNlX2ZyZWUoIFBBUlNFICogKTsKK0xJU1QgKiBwYXJzZV9ldmFsdWF0ZSggUEFSU0UgKiwgRlJBTUUgKiApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3BhdGNobGV2ZWwuaCBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3BhdGNobGV2ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGIwZDYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcGF0Y2hsZXZlbC5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5My0yMDAyIENocmlzdG9waGVyIFNlaXdhbGQgYW5kIFBlcmZvcmNlIFNvZnR3YXJlLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyogS2VlcCBKQU1WRVJTWU0gaW4gc3luYyB3aXRoIFZFUlNJT04uICovCisvKiBJdCBjYW4gYmUgYWNjZXNzZWQgYXMgJChKQU1WRVJTSU9OKSBpbiB0aGUgSmFtZmlsZS4gKi8KKworI2RlZmluZSBWRVJTSU9OX01BSk9SIDIwMTEKKyNkZWZpbmUgVkVSU0lPTl9NSU5PUiAxMgorI2RlZmluZSBWRVJTSU9OX1BBVENIIDEKKyNkZWZpbmUgVkVSU0lPTl9NQUpPUl9TWU0gIjIwMTEiCisjZGVmaW5lIFZFUlNJT05fTUlOT1JfU1lNICIxMiIKKyNkZWZpbmUgVkVSU0lPTl9QQVRDSF9TWU0gIjAxIgorI2RlZmluZSBWRVJTSU9OICIyMDExLjEyLjEiCisjZGVmaW5lIEpBTVZFUlNZTSAiSkFNVkVSU0lPTj0yMDExLjEyIgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcGF0aG50LmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9wYXRobnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWJmOGZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcGF0aG50LmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5My0yMDAyIENocmlzdG9waGVyIFNlaXdhbGQgYW5kIFBlcmZvcmNlIFNvZnR3YXJlLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyogVGhpcyBmaWxlIGlzIEFMU086CisgKiBDb3B5cmlnaHQgMjAwMS0yMDA0IERhdmlkIEFicmFoYW1zLgorICogQ29weXJpZ2h0IDIwMDUgUmVuZSBSaXZlcmEuCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgKiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworLyoKKyAqIHBhdGhudC5jIC0gTlQgc3BlY2lmaWMgcGF0aCBtYW5pcHVsYXRpb24gc3VwcG9ydAorICovCisKKyNpbmNsdWRlICJwYXRoc3lzLmgiCisKKyNpbmNsdWRlICJoYXNoLmgiCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKKy8qIFRoZSBkZWZpbml0aW9uIG9mIHRoaXMgaW4gd2lubnQuaCBpcyBub3QgQU5TSS1DIGNvbXBhdGlibGUuICovCisjdW5kZWYgSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMKKyNkZWZpbmUgSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMgKChEV09SRCktMSkKKworCit0eXBlZGVmIHN0cnVjdCBwYXRoX2tleV9lbnRyeQoreworICAgIE9CSkVDVCAqIHBhdGg7CisgICAgT0JKRUNUICoga2V5OworICAgIGludCBleGlzdHM7Cit9IHBhdGhfa2V5X2VudHJ5OworCitzdGF0aWMgc3RydWN0IGhhc2ggKiBwYXRoX2tleV9jYWNoZTsKKworCisvKgorICogcGF0aF9nZXRfcHJvY2Vzc19pZF8oKQorICovCisKK3Vuc2lnbmVkIGxvbmcgcGF0aF9nZXRfcHJvY2Vzc19pZF8oIHZvaWQgKQoreworICAgIHJldHVybiBHZXRDdXJyZW50UHJvY2Vzc0lkKCk7Cit9CisKKworLyoKKyAqIHBhdGhfZ2V0X3RlbXBfcGF0aF8oKQorICovCisKK3ZvaWQgcGF0aF9nZXRfdGVtcF9wYXRoXyggc3RyaW5nICogYnVmZmVyICkKK3sKKyAgICBEV09SRCBwYXRoTGVuZ3RoID0gR2V0VGVtcFBhdGhBKCAwLCBOVUxMICk7CisgICAgc3RyaW5nX3Jlc2VydmUoIGJ1ZmZlciwgcGF0aExlbmd0aCApOworICAgIHBhdGhMZW5ndGggPSBHZXRUZW1wUGF0aEEoIHBhdGhMZW5ndGgsIGJ1ZmZlci0+dmFsdWUgKTsKKyAgICBidWZmZXItPnZhbHVlWyBwYXRoTGVuZ3RoIC0gMSBdID0gJ1wwJzsKKyAgICBidWZmZXItPnNpemUgPSBwYXRoTGVuZ3RoIC0gMTsKK30KKworCisvKgorICogY2Fub25pY1dpbmRvd3NQYXRoKCkgLSBjb252ZXJ0IGEgZ2l2ZW4gcGF0aCBpbnRvIGl0cyBjYW5vbmljL2xvbmcgZm9ybWF0CisgKgorICogQXBwZW5kcyB0aGUgY2Fub25pYyBwYXRoIHRvIHRoZSBlbmQgb2YgdGhlIGdpdmVuICdzdHJpbmcnIG9iamVjdC4KKyAqCisgKiBGSVhNRTogVGhpcyBmdW5jdGlvbiBpcyBzdGlsbCB3b3JrLWluLXByb2dyZXNzIGFzIGl0IG9yaWdpbmFsbHkgZGlkIG5vdAorICogbmVjZXNzYXJpbHkgcmV0dXJuIHRoZSBjYW5vbmljIHBhdGggZm9ybWF0IChjb3VsZCByZXR1cm4gc2xpZ2h0bHkgZGlmZmVyZW50CisgKiByZXN1bHRzIGZvciBjZXJ0YWluIGVxdWl2YWxlbnQgcGF0aCBzdHJpbmdzKSBhbmQgY291bGQgYWNjZXB0IHBhdGhzIHBvaW50aW5nCisgKiB0byBub24tZXhpc3RpbmcgZmlsZSBzeXN0ZW0gZW50aXRpZXMgYXMgd2VsbC4KKyAqCisgKiBDYWNoZXMgcmVzdWx0cyBpbnRlcm5hbGx5LCBhdXRvbWF0aWNhbGx5IGNhY2hpbmcgYW55IHBhcmVudCBwYXRocyBpdCBoYXMgdG8KKyAqIGNvbnZlcnQgdG8gdGhlaXIgY2Fub25pYyBmb3JtYXQgaW4gdGhlIHByb2Nlc3MuCisgKgorICogUHJlcmVxdWlzaXRlczoKKyAqICAtIHBhdGggZ2l2ZW4gaW4gbm9ybWFsaXplZCBmb3JtLCBpLmUuIGFsbCBvZiBpdHMgZm9sZGVyIHNlcGFyYXRvcnMgaGF2ZQorICogICAgYWxyZWFkeSBiZWVuIGNvbnZlcnRlZCBpbnRvICdcXCcKKyAqICAtIHBhdGhfa2V5X2NhY2hlIHBhdGgva2V5IG1hcHBpbmcgY2FjaGUgb2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQKKyAqLworCitzdGF0aWMgaW50IGNhbm9uaWNXaW5kb3dzUGF0aCggY2hhciBjb25zdCAqIGNvbnN0IHBhdGgsIGludCBjb25zdCBwYXRoX2xlbmd0aCwKKyAgICBzdHJpbmcgKiBjb25zdCBvdXQgKQoreworICAgIGNoYXIgY29uc3QgKiBsYXN0X2VsZW1lbnQ7CisgICAgdW5zaWduZWQgbG9uZyBzYXZlZF9zaXplOworICAgIGNoYXIgY29uc3QgKiBwOworICAgIGludCBtaXNzaW5nX3BhcmVudDsKKworICAgIC8qIFRoaXMgaXMgb25seSBjYWxsZWQgdmlhIHBhdGhfa2V5KCksIHdoaWNoIGluaXRpYWxpemVzIHRoZSBjYWNoZS4gKi8KKyAgICBhc3NlcnQoIHBhdGhfa2V5X2NhY2hlICk7CisKKyAgICBpZiAoICFwYXRoX2xlbmd0aCApCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKCBwYXRoX2xlbmd0aCA9PSAxICYmIHBhdGhbIDAgXSA9PSAnXFwnICkKKyAgICB7CisgICAgICAgIHN0cmluZ19wdXNoX2JhY2soIG91dCwgJ1xcJyApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIHBhdGhbIDEgXSA9PSAnOicgJiYKKyAgICAgICAgKCBwYXRoX2xlbmd0aCA9PSAyIHx8CisgICAgICAgICggcGF0aF9sZW5ndGggPT0gMyAmJiBwYXRoWyAyIF0gPT0gJ1xcJyApICkgKQorICAgIHsKKyAgICAgICAgc3RyaW5nX3B1c2hfYmFjayggb3V0LCB0b3VwcGVyKCBwYXRoWyAwIF0gKSApOworICAgICAgICBzdHJpbmdfcHVzaF9iYWNrKCBvdXQsICc6JyApOworICAgICAgICBzdHJpbmdfcHVzaF9iYWNrKCBvdXQsICdcXCcgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogRmluZCBsYXN0ICdcXCcuICovCisgICAgZm9yICggcCA9IHBhdGggKyBwYXRoX2xlbmd0aCAtIDE7IHAgPj0gcGF0aCAmJiAqcCAhPSAnXFwnOyAtLXAgKTsKKyAgICBsYXN0X2VsZW1lbnQgPSBwICsgMTsKKworICAgIC8qIFNwZWNpYWwgY2FzZSAnXCcgJiYgJ0Q6XCcgLSBpbmNsdWRlIHRyYWlsaW5nICdcJy4gKi8KKyAgICBpZiAoIHAgPT0gcGF0aCB8fAorICAgICAgICBwID09IHBhdGggKyAyICYmIHBhdGhbIDEgXSA9PSAnOicgKQorICAgICAgICArK3A7CisKKyAgICBtaXNzaW5nX3BhcmVudCA9IDA7CisKKyAgICBpZiAoIHAgPj0gcGF0aCApCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZGlyID0gcGF0aDsKKyAgICAgICAgaW50IGNvbnN0IGRpcl9sZW5ndGggPSBwIC0gcGF0aDsKKyAgICAgICAgT0JKRUNUICogY29uc3QgZGlyX29iaiA9IG9iamVjdF9uZXdfcmFuZ2UoIGRpciwgZGlyX2xlbmd0aCApOworICAgICAgICBpbnQgZm91bmQ7CisgICAgICAgIHBhdGhfa2V5X2VudHJ5ICogY29uc3QgcmVzdWx0ID0gKHBhdGhfa2V5X2VudHJ5ICopaGFzaF9pbnNlcnQoCisgICAgICAgICAgICBwYXRoX2tleV9jYWNoZSwgZGlyX29iaiwgJmZvdW5kICk7CisgICAgICAgIGlmICggIWZvdW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0LT5wYXRoID0gZGlyX29iajsKKyAgICAgICAgICAgIGlmICggY2Fub25pY1dpbmRvd3NQYXRoKCBkaXIsIGRpcl9sZW5ndGgsIG91dCApICkKKyAgICAgICAgICAgICAgICByZXN1bHQtPmV4aXN0cyA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0LT5leGlzdHMgPSAwOworICAgICAgICAgICAgcmVzdWx0LT5rZXkgPSBvYmplY3RfbmV3KCBvdXQtPnZhbHVlICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3RfZnJlZSggZGlyX29iaiApOworICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCggb3V0LCBvYmplY3Rfc3RyKCByZXN1bHQtPmtleSApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhcmVzdWx0LT5leGlzdHMgKQorICAgICAgICAgICAgbWlzc2luZ19wYXJlbnQgPSAxOworICAgIH0KKworICAgIGlmICggb3V0LT5zaXplICYmIG91dC0+dmFsdWVbIG91dC0+c2l6ZSAtIDEgXSAhPSAnXFwnICkKKyAgICAgICAgc3RyaW5nX3B1c2hfYmFjayggb3V0LCAnXFwnICk7CisKKyAgICBzYXZlZF9zaXplID0gb3V0LT5zaXplOworICAgIHN0cmluZ19hcHBlbmRfcmFuZ2UoIG91dCwgbGFzdF9lbGVtZW50LCBwYXRoICsgcGF0aF9sZW5ndGggKTsKKworICAgIGlmICggIW1pc3NpbmdfcGFyZW50ICkKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBuID0gbGFzdF9lbGVtZW50OworICAgICAgICBpbnQgY29uc3Qgbl9sZW5ndGggPSBwYXRoICsgcGF0aF9sZW5ndGggLSBuOworICAgICAgICBpZiAoICEoIG5fbGVuZ3RoID09IDEgJiYgblsgMCBdID09ICcuJyApCisgICAgICAgICAgICAmJiAhKCBuX2xlbmd0aCA9PSAyICYmIG5bIDAgXSA9PSAnLicgJiYgblsgMSBdID09ICcuJyApICkKKyAgICAgICAgeworICAgICAgICAgICAgV0lOMzJfRklORF9EQVRBIGZkOworICAgICAgICAgICAgSEFORExFIGNvbnN0IGhmID0gRmluZEZpcnN0RmlsZUEoIG91dC0+dmFsdWUsICZmZCApOworICAgICAgICAgICAgaWYgKCBoZiAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3RydW5jYXRlKCBvdXQsIHNhdmVkX3NpemUgKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdfYXBwZW5kKCBvdXQsIGZkLmNGaWxlTmFtZSApOworICAgICAgICAgICAgICAgIEZpbmRDbG9zZSggaGYgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogbm9ybWFsaXplX3BhdGgoKSAtICdub3JtYWxpemVzJyB0aGUgZ2l2ZW4gcGF0aCBmb3IgdGhlIHBhdGgta2V5IG1hcHBpbmcKKyAqCisgKiBUaGUgcmVzdWx0aW5nIHN0cmluZyBoYXMgbm90aGluZyB0byBkbyB3aXRoICdub3JtYWxpemVkIHBhdGhzJyBhcyB1c2VkIGluCisgKiBCb29zdCBKYW0gYnVpbGQgc2NyaXB0cyBhbmQgdGhlIGJ1aWx0LWluIE5PUk1BTElaRV9QQVRIIHJ1bGUuIEl0IGlzIGludGVuZGVkCisgKiB0byBiZSB1c2VkIHNvbGVseSBhcyBhbiBpbnRlcm1lZGlhdGUgc3RlcCB3aGVuIG1hcHBpbmcgYW4gYXJiaXRyYXJ5IHBhdGggdG8KKyAqIGl0cyBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24uCisgKgorICogV2hlbiBjaG9vc2luZyB0aGUgaW50ZXJtZWRpYXRlIHN0cmluZyB0aGUgaW1wb3J0YW50IHRoaW5ncyBhcmUgZm9yIGl0IHRvIGJlCisgKiBpbmV4cGVuc2l2ZSB0byBjYWxjdWxhdGUgYW5kIGFueSB0d28gcGF0aHMgaGF2aW5nIGRpZmZlcmVudCBjYW5vbmljYWwKKyAqIHJlcHJlc2VudGF0aW9ucyBhbHNvIG5lZWQgdG8gaGF2ZSBkaWZmZXJlbnQgY2FsY3VsYXRlZCBpbnRlcm1lZGlhdGUgc3RyaW5nCisgKiByZXByZXNlbnRhdGlvbnMuIEFueSBpbXBsZW1lbnRlZCBhZGRpdGlvbmFsIHJ1bGVzIHNlcnZlIG9ubHkgdG8gc2ltcGxpZnkKKyAqIGNvbnN0cnVjdGluZyB0aGUgY2Fub25pY2FsIHBhdGggcmVwcmVzZW50YXRpb24gZnJvbSB0aGUgY2FsY3VsYXRlZAorICogaW50ZXJtZWRpYXRlIHN0cmluZy4KKyAqCisgKiBJbXBsZW1lbnRlZCByZXR1cm5lZCBwYXRoIHJ1bGVzOgorICogIC0gdXNlIGJhY2tzbGFzaGVzIGFzIHBhdGggc2VwYXJhdG9ycworICogIC0gbG93ZXJjYXNlIG9ubHkgKHNpbmNlIGFsbCBXaW5kb3dzIGZpbGUgc3lzdGVtcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSkKKyAqICAtIHRyaW0gdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgZXhjZXB0IGluIGNhc2Ugb2YgYSByb290IHBhdGgsIGkuZS4gJ1g6XCcKKyAqLworCitzdGF0aWMgdm9pZCBub3JtYWxpemVfcGF0aCggc3RyaW5nICogcGF0aCApCit7CisgICAgY2hhciAqIHM7CisgICAgZm9yICggcyA9IHBhdGgtPnZhbHVlOyBzIDwgcGF0aC0+dmFsdWUgKyBwYXRoLT5zaXplOyArK3MgKQorICAgICAgICAqcyA9ICpzID09ICcvJyA/ICdcXCcgOiB0b2xvd2VyKCAqcyApOworICAgIC8qIFN0cmlwIHRyYWlsaW5nICIvIi4gKi8KKyAgICBpZiAoIHBhdGgtPnNpemUgJiYgcGF0aC0+c2l6ZSAhPSAzICYmIHBhdGgtPnZhbHVlWyBwYXRoLT5zaXplIC0gMSBdID09ICdcXCcKKyAgICAgICAgKQorICAgICAgICBzdHJpbmdfcG9wX2JhY2soIHBhdGggKTsKK30KKworCitzdGF0aWMgcGF0aF9rZXlfZW50cnkgKiBwYXRoX2tleSggT0JKRUNUICogY29uc3QgcGF0aCwKKyAgICBpbnQgY29uc3Qga25vd25fdG9fYmVfY2Fub25pYyApCit7CisgICAgcGF0aF9rZXlfZW50cnkgKiByZXN1bHQ7CisgICAgaW50IGZvdW5kOworCisgICAgaWYgKCAhcGF0aF9rZXlfY2FjaGUgKQorICAgICAgICBwYXRoX2tleV9jYWNoZSA9IGhhc2hpbml0KCBzaXplb2YoIHBhdGhfa2V5X2VudHJ5ICksICJwYXRoIHRvIGtleSIgKTsKKworICAgIHJlc3VsdCA9IChwYXRoX2tleV9lbnRyeSAqKWhhc2hfaW5zZXJ0KCBwYXRoX2tleV9jYWNoZSwgcGF0aCwgJmZvdW5kICk7CisgICAgaWYgKCAhZm91bmQgKQorICAgIHsKKyAgICAgICAgT0JKRUNUICogbm9ybWFsaXplZDsKKyAgICAgICAgaW50IG5vcm1hbGl6ZWRfc2l6ZTsKKyAgICAgICAgcGF0aF9rZXlfZW50cnkgKiBucmVzdWx0OworICAgICAgICByZXN1bHQtPnBhdGggPSBwYXRoOworICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgYnVmWyAxIF07CisgICAgICAgICAgICBzdHJpbmdfY29weSggYnVmLCBvYmplY3Rfc3RyKCBwYXRoICkgKTsKKyAgICAgICAgICAgIG5vcm1hbGl6ZV9wYXRoKCBidWYgKTsKKyAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBvYmplY3RfbmV3KCBidWYtPnZhbHVlICk7CisgICAgICAgICAgICBub3JtYWxpemVkX3NpemUgPSBidWYtPnNpemU7CisgICAgICAgICAgICBzdHJpbmdfZnJlZSggYnVmICk7CisgICAgICAgIH0KKyAgICAgICAgbnJlc3VsdCA9IChwYXRoX2tleV9lbnRyeSAqKWhhc2hfaW5zZXJ0KCBwYXRoX2tleV9jYWNoZSwgbm9ybWFsaXplZCwKKyAgICAgICAgICAgICZmb3VuZCApOworICAgICAgICBpZiAoICFmb3VuZCB8fCBucmVzdWx0ID09IHJlc3VsdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5yZXN1bHQtPnBhdGggPSBub3JtYWxpemVkOworICAgICAgICAgICAgaWYgKCBrbm93bl90b19iZV9jYW5vbmljICkKKyAgICAgICAgICAgICAgICBucmVzdWx0LT5rZXkgPSBvYmplY3RfY29weSggcGF0aCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBjYW5vbmljX3BhdGhbIDEgXTsKKyAgICAgICAgICAgICAgICBzdHJpbmdfbmV3KCBjYW5vbmljX3BhdGggKTsKKyAgICAgICAgICAgICAgICBpZiAoIGNhbm9uaWNXaW5kb3dzUGF0aCggb2JqZWN0X3N0ciggbm9ybWFsaXplZCApLCBub3JtYWxpemVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljX3BhdGggKSApCisgICAgICAgICAgICAgICAgICAgIG5yZXN1bHQtPmV4aXN0cyA9IDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBucmVzdWx0LT5leGlzdHMgPSAwOworICAgICAgICAgICAgICAgIG5yZXN1bHQtPmtleSA9IG9iamVjdF9uZXcoIGNhbm9uaWNfcGF0aC0+dmFsdWUgKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdfZnJlZSggY2Fub25pY19wYXRoICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIG5vcm1hbGl6ZWQgKTsKKyAgICAgICAgaWYgKCBucmVzdWx0ICE9IHJlc3VsdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdC0+cGF0aCA9IG9iamVjdF9jb3B5KCBwYXRoICk7CisgICAgICAgICAgICByZXN1bHQtPmtleSA9IG9iamVjdF9jb3B5KCBucmVzdWx0LT5rZXkgKTsKKyAgICAgICAgICAgIHJlc3VsdC0+ZXhpc3RzID0gbnJlc3VsdC0+ZXhpc3RzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2b2lkIHBhdGhfcmVnaXN0ZXJfa2V5KCBPQkpFQ1QgKiBjYW5vbmljX3BhdGggKQoreworICAgIHBhdGhfa2V5KCBjYW5vbmljX3BhdGgsIDEgKTsKK30KKworCitPQkpFQ1QgKiBwYXRoX2FzX2tleSggT0JKRUNUICogcGF0aCApCit7CisgICAgcmV0dXJuIG9iamVjdF9jb3B5KCBwYXRoX2tleSggcGF0aCwgMCApLT5rZXkgKTsKK30KKworCitzdGF0aWMgdm9pZCBmcmVlX3BhdGhfa2V5X2VudHJ5KCB2b2lkICogeGVudHJ5LCB2b2lkICogY29uc3QgZGF0YSApCit7CisgICAgcGF0aF9rZXlfZW50cnkgKiBjb25zdCBlbnRyeSA9IChwYXRoX2tleV9lbnRyeSAqKXhlbnRyeTsKKyAgICBvYmplY3RfZnJlZSggZW50cnktPnBhdGggKTsKKyAgICBvYmplY3RfZnJlZSggZW50cnktPmtleSApOworfQorCisKK3ZvaWQgcGF0aF9kb25lKCB2b2lkICkKK3sKKyAgICBpZiAoIHBhdGhfa2V5X2NhY2hlICkKKyAgICB7CisgICAgICAgIGhhc2hlbnVtZXJhdGUoIHBhdGhfa2V5X2NhY2hlLCAmZnJlZV9wYXRoX2tleV9lbnRyeSwgMCApOworICAgICAgICBoYXNoZG9uZSggcGF0aF9rZXlfY2FjaGUgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9wYXRoc3lzLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9wYXRoc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0ZTZlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3BhdGhzeXMuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLTIwMDIgQ2hyaXN0b3BoZXIgU2Vpd2FsZCBhbmQgUGVyZm9yY2UgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiBUaGlzIGZpbGUgaXMgQUxTTzoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiBDb3B5cmlnaHQgMjAwNSBSZW5lIFJpdmVyYS4KKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyAqIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisvKgorICogcGF0aHN5cy5jIC0gcGxhdGZvcm0gaW5kZXBlbmRlbnQgcGF0aCBtYW5pcHVsYXRpb24gc3VwcG9ydAorICoKKyAqIEV4dGVybmFsIHJvdXRpbmVzOgorICogIHBhdGhfYnVpbGQoKSAgIC0gYnVpbGQgYSBmaWxlbmFtZSBnaXZlbiBkaXIvYmFzZS9zdWZmaXgvbWVtYmVyCisgKiAgcGF0aF9wYXJlbnQoKSAgLSBtYWtlIGEgUEFUSE5BTUUgcG9pbnQgdG8gaXRzIHBhcmVudCBkaXIKKyAqICBwYXRoX3BhcnNlKCkgICAtIHNwbGl0IGEgZmlsZSBuYW1lIGludG8gZGlyL2Jhc2Uvc3VmZml4L21lbWJlcgorICogIHBhdGhfdG1wZGlyKCkgIC0gcmV0dXJucyB0aGUgc3lzdGVtIGRlcGVuZGVudCB0ZW1wb3JhcnkgZm9sZGVyIHBhdGgKKyAqICBwYXRoX3RtcGZpbGUoKSAtIHJldHVybnMgYSBuZXcgdGVtcG9yYXJ5IHBhdGgKKyAqICBwYXRoX3RtcG5hbSgpICAtIHJldHVybnMgYSBuZXcgdGVtcG9yYXJ5IG5hbWUKKyAqCisgKiBGaWxlX3BhcnNlKCkgYW5kIHBhdGhfYnVpbGQoKSBqdXN0IG1hbmlwdWxhdGUgYSBzdHJpbmcgYW5kIGEgc3RydWN0dXJlOworICogdGhleSBkbyBub3QgbWFrZSBzeXN0ZW0gY2FsbHMuCisgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgInBhdGhzeXMuaCIKKworI2luY2x1ZGUgImZpbGVzeXMuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworCisvKiBJbnRlcm5hbCBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIC0gaGF2ZSBuYW1lcyBlbmRpbmcgd2l0aCBhbgorICogdW5kZXJzY29yZSBhbmQgYXJlIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGluIGFuIE9TIHNwZWNpZmljIHBhdGhYWFguYworICogbW9kdWxlLgorICovCit1bnNpZ25lZCBsb25nIHBhdGhfZ2V0X3Byb2Nlc3NfaWRfKCB2b2lkICk7Cit2b2lkIHBhdGhfZ2V0X3RlbXBfcGF0aF8oIHN0cmluZyAqIGJ1ZmZlciApOworCisKKy8qCisgKiBwYXRoX3BhcnNlKCkgLSBzcGxpdCBhIGZpbGUgbmFtZSBpbnRvIGRpci9iYXNlL3N1ZmZpeC9tZW1iZXIKKyAqLworCit2b2lkIHBhdGhfcGFyc2UoIGNoYXIgY29uc3QgKiBmaWxlLCBQQVRITkFNRSAqIGYgKQoreworICAgIGNoYXIgY29uc3QgKiBwOworICAgIGNoYXIgY29uc3QgKiBxOworICAgIGNoYXIgY29uc3QgKiBlbmQ7CisKKyAgICBtZW1zZXQoIChjaGFyICopZiwgMCwgc2l6ZW9mKCAqZiApICk7CisKKyAgICAvKiBMb29rIGZvciAnPGdyaXN0PicuICovCisKKyAgICBpZiAoICggZmlsZVsgMCBdID09ICc8JyApICYmICggcCA9IHN0cmNociggZmlsZSwgJz4nICkgKSApCisgICAgeworICAgICAgICBmLT5mX2dyaXN0LnB0ciA9IGZpbGU7CisgICAgICAgIGYtPmZfZ3Jpc3QubGVuID0gcCAtIGZpbGU7CisgICAgICAgIGZpbGUgPSBwICsgMTsKKyAgICB9CisKKyAgICAvKiBMb29rIGZvciAnZGlyLycuICovCisKKyAgICBwID0gc3RycmNociggZmlsZSwgJy8nICk7CisKKyNpZiBQQVRIX0RFTElNID09ICdcXCcKKyAgICAvKiBPbiBOVCwgbG9vayBmb3IgZGlyXCBhcyB3ZWxsICovCisgICAgeworICAgICAgICBjaGFyICogY29uc3QgcDEgPSBzdHJyY2hyKCBwID8gcCArIDEgOiBmaWxlLCAnXFwnICk7CisgICAgICAgIGlmICggcDEgKSBwID0gcDE7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIHAgKQorICAgIHsKKyAgICAgICAgZi0+Zl9kaXIucHRyID0gZmlsZTsKKyAgICAgICAgZi0+Zl9kaXIubGVuID0gcCAtIGZpbGU7CisKKyAgICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciAvIC0gZGlybmFtZSBpcyAvLCBub3QgIiIgKi8KKyAgICAgICAgaWYgKCAhZi0+Zl9kaXIubGVuICkKKyAgICAgICAgICAgICsrZi0+Zl9kaXIubGVuOworCisjaWYgUEFUSF9ERUxJTSA9PSAnXFwnCisgICAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgRDovIC0gZGlybmFtZSBpcyBEOi8sIG5vdCAiRDoiICovCisgICAgICAgIGlmICggZi0+Zl9kaXIubGVuID09IDIgJiYgZmlsZVsgMSBdID09ICc6JyApCisgICAgICAgICAgICArK2YtPmZfZGlyLmxlbjsKKyNlbmRpZgorCisgICAgICAgIGZpbGUgPSBwICsgMTsKKyAgICB9CisKKyAgICBlbmQgPSBmaWxlICsgc3RybGVuKCBmaWxlICk7CisKKyAgICAvKiBMb29rIGZvciAnKG1lbWJlciknLiAqLworICAgIGlmICggKCBwID0gc3RyY2hyKCBmaWxlLCAnKCcgKSApICYmICggZW5kWyAtMSBdID09ICcpJyApICkKKyAgICB7CisgICAgICAgIGYtPmZfbWVtYmVyLnB0ciA9IHAgKyAxOworICAgICAgICBmLT5mX21lbWJlci5sZW4gPSBlbmQgLSBwIC0gMjsKKyAgICAgICAgZW5kID0gcDsKKyAgICB9CisKKyAgICAvKiBMb29rIGZvciAnLnN1ZmZpeCcuIFRoaXMgd291bGQgYmUgbWVtcmNocigpLiAqLworICAgIHAgPSAwOworICAgIGZvciAoIHEgPSBmaWxlOyAoIHEgPSAoY2hhciAqKW1lbWNociggcSwgJy4nLCBlbmQgLSBxICkgKTsgKytxICkKKyAgICAgICAgcCA9IHE7CisgICAgaWYgKCBwICkKKyAgICB7CisgICAgICAgIGYtPmZfc3VmZml4LnB0ciA9IHA7CisgICAgICAgIGYtPmZfc3VmZml4LmxlbiA9IGVuZCAtIHA7CisgICAgICAgIGVuZCA9IHA7CisgICAgfQorCisgICAgLyogTGVhdmVzIGJhc2UuICovCisgICAgZi0+Zl9iYXNlLnB0ciA9IGZpbGU7CisgICAgZi0+Zl9iYXNlLmxlbiA9IGVuZCAtIGZpbGU7Cit9CisKKworLyoKKyAqIGlzX3BhdGhfZGVsaW0oKSAtIHRydWUgaWZmIGMgaXMgYSBwYXRoIGRlbGltaXRlcgorICovCisKK3N0YXRpYyBpbnQgaXNfcGF0aF9kZWxpbSggY2hhciBjb25zdCBjICkKK3sKKyAgICByZXR1cm4gYyA9PSBQQVRIX0RFTElNCisjaWYgUEFUSF9ERUxJTSA9PSAnXFwnCisgICAgICAgIHx8IGMgPT0gJy8nCisjZW5kaWYKKyAgICAgICAgOworfQorCisKKy8qCisgKiBhc19wYXRoX2RlbGltKCkgLSBjb252ZXJ0IGMgdG8gYSBwYXRoIGRlbGltaXRlciBpZiBpdCBpcyBub3Qgb25lIGFscmVhZHkKKyAqLworCitzdGF0aWMgY2hhciBhc19wYXRoX2RlbGltKCBjaGFyIGNvbnN0IGMgKQoreworICAgIHJldHVybiBpc19wYXRoX2RlbGltKCBjICkgPyBjIDogUEFUSF9ERUxJTTsKK30KKworCisvKgorICogcGF0aF9idWlsZCgpIC0gYnVpbGQgYSBmaWxlbmFtZSBnaXZlbiBkaXIvYmFzZS9zdWZmaXgvbWVtYmVyCisgKgorICogVG8gYXZvaWQgY2hhbmdpbmcgc2xhc2ggZGlyZWN0aW9uIG9uIE5UIHdoZW4gcmVjb25zdGl0dXRpbmcgcGF0aHMsIGluc3RlYWQgb2YKKyAqIHVuY29uZGl0aW9uYWxseSBhcHBlbmRpbmcgUEFUSF9ERUxJTSB3ZSBjaGVjayB0aGUgcGFzdC10aGUtZW5kIGNoYXJhY3RlciBvZgorICogdGhlIHByZXZpb3VzIHBhdGggZWxlbWVudC4gSWYgaXQgaXMgYSBwYXRoIGRlbGltaXRlciwgd2UgYXBwZW5kIHRoYXQsIGFuZAorICogb25seSBhcHBlbmQgUEFUSF9ERUxJTSBhcyBhIGxhc3QgcmVzb3J0LiBUaGlzIGhldXJpc3RpYyBpcyBiYXNlZCBvbiB0aGUgZmFjdAorICogdGhhdCBQQVRITkFNRSBvYmplY3RzIGFyZSB1c3VhbGx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBwYXRoX3BhcnNlLCB3aGljaAorICogbGVhdmVzIHRoZSBvcmlnaW5hbCBzbGFzaGVzIGluIHRoZSBwYXN0LXRoZS1lbmQgcG9zaXRpb24uIENvcnJlY3RuZXNzIGRlcGVuZHMKKyAqIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIHN0cmluZ3MgYXJlIHplcm8gdGVybWluYXRlZCwgc28gYSBwYXN0LXRoZS1lbmQKKyAqIGNoYXJhY3RlciB3aWxsIGFsd2F5cyBiZSBhdmFpbGFibGUuCisgKgorICogQXMgYW4gYXR0ZW5kYW50IHBhdGNoLCB3ZSBoYWQgdG8gZW5zdXJlIHRoYXQgYmFja3NsYXNoZXMgYXJlIHVzZWQgZXhwbGljaXRseQorICogaW4gJ3RpbWVzdGFtcC5jJy4KKyAqLworCit2b2lkIHBhdGhfYnVpbGQoIFBBVEhOQU1FICogZiwgc3RyaW5nICogZmlsZSApCit7CisgICAgZmlsZV9idWlsZDEoIGYsIGZpbGUgKTsKKworICAgIC8qIERvIG5vdCBwcmVwZW5kIHJvb3QgaWYgaXQgaXMgJy4nIG9yIHRoZSBkaXJlY3RvcnkgaXMgcm9vdGVkLiAqLworICAgIGlmICggZi0+Zl9yb290LmxlbgorICAgICAgICAmJiAhKCBmLT5mX3Jvb3QubGVuID09IDEgJiYgZi0+Zl9yb290LnB0clsgMCBdID09ICcuJyApCisgICAgICAgICYmICEoIGYtPmZfZGlyLmxlbiAmJiBmLT5mX2Rpci5wdHJbIDAgXSA9PSAnLycgKQorI2lmIFBBVEhfREVMSU0gPT0gJ1xcJworICAgICAgICAmJiAhKCBmLT5mX2Rpci5sZW4gJiYgZi0+Zl9kaXIucHRyWyAwIF0gPT0gJ1xcJyApCisgICAgICAgICYmICEoIGYtPmZfZGlyLmxlbiAmJiBmLT5mX2Rpci5wdHJbIDEgXSA9PSAnOicgKQorI2VuZGlmCisgICAgKQorICAgIHsKKyAgICAgICAgc3RyaW5nX2FwcGVuZF9yYW5nZSggZmlsZSwgZi0+Zl9yb290LnB0ciwgZi0+Zl9yb290LnB0ciArIGYtPmZfcm9vdC5sZW4KKyAgICAgICAgICAgICk7CisgICAgICAgIC8qIElmICdyb290JyBhbHJlYWR5IGVuZHMgd2l0aCBhIHBhdGggZGVsaW1ldGVyLCBkbyBub3QgYWRkIGFub3RoZXIgb25lLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCAhaXNfcGF0aF9kZWxpbSggZi0+Zl9yb290LnB0clsgZi0+Zl9yb290LmxlbiAtIDEgXSApICkKKyAgICAgICAgICAgIHN0cmluZ19wdXNoX2JhY2soIGZpbGUsIGFzX3BhdGhfZGVsaW0oIGYtPmZfcm9vdC5wdHJbIGYtPmZfcm9vdC5sZW4KKyAgICAgICAgICAgICAgICBdICkgKTsKKyAgICB9CisKKyAgICBpZiAoIGYtPmZfZGlyLmxlbiApCisgICAgICAgIHN0cmluZ19hcHBlbmRfcmFuZ2UoIGZpbGUsIGYtPmZfZGlyLnB0ciwgZi0+Zl9kaXIucHRyICsgZi0+Zl9kaXIubGVuICk7CisKKyAgICAvKiBQdXQgcGF0aCBzZXBhcmF0b3IgYmV0d2VlbiBkaXIgYW5kIGZpbGUuICovCisgICAgLyogU3BlY2lhbCBjYXNlIGZvciByb290IGRpcjogZG8gbm90IGFkZCBhbm90aGVyIHBhdGggc2VwYXJhdG9yLiAqLworICAgIGlmICggZi0+Zl9kaXIubGVuICYmICggZi0+Zl9iYXNlLmxlbiB8fCBmLT5mX3N1ZmZpeC5sZW4gKQorI2lmIFBBVEhfREVMSU0gPT0gJ1xcJworICAgICAgICAmJiAhKCBmLT5mX2Rpci5sZW4gPT0gMyAmJiBmLT5mX2Rpci5wdHJbIDEgXSA9PSAnOicgKQorI2VuZGlmCisgICAgICAgICYmICEoIGYtPmZfZGlyLmxlbiA9PSAxICYmIGlzX3BhdGhfZGVsaW0oIGYtPmZfZGlyLnB0clsgMCBdICkgKSApCisgICAgICAgIHN0cmluZ19wdXNoX2JhY2soIGZpbGUsIGFzX3BhdGhfZGVsaW0oIGYtPmZfZGlyLnB0clsgZi0+Zl9kaXIubGVuIF0gKSApOworCisgICAgaWYgKCBmLT5mX2Jhc2UubGVuICkKKyAgICAgICAgc3RyaW5nX2FwcGVuZF9yYW5nZSggZmlsZSwgZi0+Zl9iYXNlLnB0ciwgZi0+Zl9iYXNlLnB0ciArIGYtPmZfYmFzZS5sZW4KKyAgICAgICAgICAgICk7CisKKyAgICBpZiAoIGYtPmZfc3VmZml4LmxlbiApCisgICAgICAgIHN0cmluZ19hcHBlbmRfcmFuZ2UoIGZpbGUsIGYtPmZfc3VmZml4LnB0ciwgZi0+Zl9zdWZmaXgucHRyICsKKyAgICAgICAgICAgIGYtPmZfc3VmZml4LmxlbiApOworCisgICAgaWYgKCBmLT5mX21lbWJlci5sZW4gKQorICAgIHsKKyAgICAgICAgc3RyaW5nX3B1c2hfYmFjayggZmlsZSwgJygnICk7CisgICAgICAgIHN0cmluZ19hcHBlbmRfcmFuZ2UoIGZpbGUsIGYtPmZfbWVtYmVyLnB0ciwgZi0+Zl9tZW1iZXIucHRyICsKKyAgICAgICAgICAgIGYtPmZfbWVtYmVyLmxlbiApOworICAgICAgICBzdHJpbmdfcHVzaF9iYWNrKCBmaWxlLCAnKScgKTsKKyAgICB9Cit9CisKKworLyoKKyAqIHBhdGhfcGFyZW50KCkgLSBtYWtlIGEgUEFUSE5BTUUgcG9pbnQgdG8gaXRzIHBhcmVudCBkaXIKKyAqLworCit2b2lkIHBhdGhfcGFyZW50KCBQQVRITkFNRSAqIGYgKQoreworICAgIGYtPmZfYmFzZS5wdHIgPSBmLT5mX3N1ZmZpeC5wdHIgPSBmLT5mX21lbWJlci5wdHIgPSAiIjsKKyAgICBmLT5mX2Jhc2UubGVuID0gZi0+Zl9zdWZmaXgubGVuID0gZi0+Zl9tZW1iZXIubGVuID0gMDsKK30KKworCisvKgorICogcGF0aF90bXBkaXIoKSAtIHJldHVybnMgdGhlIHN5c3RlbSBkZXBlbmRlbnQgdGVtcG9yYXJ5IGZvbGRlciBwYXRoCisgKgorICogUmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluc2lkZSBhIHN0YXRpYyBidWZmZXIgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCisgKiBSZXR1cm5lZCB2YWx1ZSBkb2VzICpub3QqIGluY2x1ZGUgYSB0cmFpbGluZyBwYXRoIHNlcGFyYXRvci4KKyAqLworCitzdHJpbmcgY29uc3QgKiBwYXRoX3RtcGRpcigpCit7CisgICAgc3RhdGljIHN0cmluZyBidWZmZXJbIDEgXTsKKyAgICBzdGF0aWMgaW50IGhhdmVfcmVzdWx0OworICAgIGlmICggIWhhdmVfcmVzdWx0ICkKKyAgICB7CisgICAgICAgIHN0cmluZ19uZXcoIGJ1ZmZlciApOworICAgICAgICBwYXRoX2dldF90ZW1wX3BhdGhfKCBidWZmZXIgKTsKKyAgICAgICAgaGF2ZV9yZXN1bHQgPSAxOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyOworfQorCisKKy8qCisgKiBwYXRoX3RtcG5hbSgpIC0gcmV0dXJucyBhIG5ldyB0ZW1wb3JhcnkgbmFtZQorICovCisKK09CSkVDVCAqIHBhdGhfdG1wbmFtKCB2b2lkICkKK3sKKyAgICBjaGFyIG5hbWVfYnVmZmVyWyA2NCBdOworICAgIHVuc2lnbmVkIGxvbmcgY29uc3QgcGlkID0gcGF0aF9nZXRfcHJvY2Vzc19pZF8oKTsKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyB0OworICAgIGlmICggIXQgKSB0ID0gdGltZSggMCApICYgMHhmZmZmOworICAgIHQgKz0gMTsKKyAgICBzcHJpbnRmKCBuYW1lX2J1ZmZlciwgImphbSVseCVseC4wMDAiLCBwaWQsIHQgKTsKKyAgICByZXR1cm4gb2JqZWN0X25ldyggbmFtZV9idWZmZXIgKTsKK30KKworCisvKgorICogcGF0aF90bXBmaWxlKCkgLSByZXR1cm5zIGEgbmV3IHRlbXBvcmFyeSBwYXRoCisgKi8KKworT0JKRUNUICogcGF0aF90bXBmaWxlKCB2b2lkICkKK3sKKyAgICBPQkpFQ1QgKiByZXN1bHQ7CisgICAgT0JKRUNUICogdG1wbmFtOworCisgICAgc3RyaW5nIGZpbGVfcGF0aFsgMSBdOworICAgIHN0cmluZ19jb3B5KCBmaWxlX3BhdGgsIHBhdGhfdG1wZGlyKCktPnZhbHVlICk7CisgICAgc3RyaW5nX3B1c2hfYmFjayggZmlsZV9wYXRoLCBQQVRIX0RFTElNICk7CisgICAgdG1wbmFtID0gcGF0aF90bXBuYW0oKTsKKyAgICBzdHJpbmdfYXBwZW5kKCBmaWxlX3BhdGgsIG9iamVjdF9zdHIoIHRtcG5hbSApICk7CisgICAgb2JqZWN0X2ZyZWUoIHRtcG5hbSApOworICAgIHJlc3VsdCA9IG9iamVjdF9uZXcoIGZpbGVfcGF0aC0+dmFsdWUgKTsKKyAgICBzdHJpbmdfZnJlZSggZmlsZV9wYXRoICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcGF0aHN5cy5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcGF0aHN5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2E0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9wYXRoc3lzLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLTIwMDIgQ2hyaXN0b3BoZXIgU2Vpd2FsZCBhbmQgUGVyZm9yY2UgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKgorICogcGF0aHN5cy5oIC0gUEFUSE5BTUUgc3RydWN0CisgKi8KKworLyoKKyAqIFBBVEhOQU1FIC0gYSBuYW1lIG9mIGEgZmlsZSwgYnJva2VuIGludG8gPGdyaXN0PmRpci9iYXNlL3N1ZmZpeChtZW1iZXIpCisgKgorICogPGdyaXN0PiAtIHNhbHQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0YXJnZXRzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGhhdmUgdGhlCisgKiBzYW1lIG5hbWUgLSBpdCBuZXZlciBhcHBlYXJzIGluIHRoZSBib3VuZCBuYW1lIG9mIGEgdGFyZ2V0LgorICoKKyAqIChtZW1iZXIpIC0gYXJjaGl2ZSBtZW1iZXIgbmFtZTogdGhlIHN5bnRheCBpcyBhcmJpdHJhcnksIGJ1dCBtdXN0IGFncmVlIGluCisgKiBwYXRoX3BhcnNlKCksIHBhdGhfYnVpbGQoKSBhbmQgdGhlIEphbWJhc2UuCisgKi8KKworI2lmbmRlZiBQQVRIU1lTX1ZQXzIwMDIwMjExX0gKKyNkZWZpbmUgUEFUSFNZU19WUF8yMDAyMDIxMV9ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJzdHJpbmdzLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgX3BhdGhwYXJ0Cit7CisgICAgY2hhciBjb25zdCAqIHB0cjsKKyAgICBpbnQgbGVuOworfSBQQVRIUEFSVDsKKwordHlwZWRlZiBzdHJ1Y3QgX3BhdGhuYW1lCit7CisgICAgUEFUSFBBUlQgcGFydFsgNiBdOworCisjZGVmaW5lIGZfZ3Jpc3QgICBwYXJ0WyAwIF0KKyNkZWZpbmUgZl9yb290ICAgIHBhcnRbIDEgXQorI2RlZmluZSBmX2RpciAgICAgcGFydFsgMiBdCisjZGVmaW5lIGZfYmFzZSAgICBwYXJ0WyAzIF0KKyNkZWZpbmUgZl9zdWZmaXggIHBhcnRbIDQgXQorI2RlZmluZSBmX21lbWJlciAgcGFydFsgNSBdCit9IFBBVEhOQU1FOworCisKK3ZvaWQgcGF0aF9idWlsZCggUEFUSE5BTUUgKiwgc3RyaW5nICogZmlsZSApOwordm9pZCBwYXRoX3BhcnNlKCBjaGFyIGNvbnN0ICogZmlsZSwgUEFUSE5BTUUgKiApOwordm9pZCBwYXRoX3BhcmVudCggUEFUSE5BTUUgKiApOworCisvKiBHaXZlbiBhIHBhdGgsIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYW4gZXF1aXZhbGVudCBwYXRoIGluIGNhbm9uaWNhbAorICogZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYSB1bmlxdWUga2V5IGZvciB0aGF0IHBhdGguIEVxdWl2YWxlbnQgcGF0aHMgc3VjaAorICogYXMgYS9iLCBBXEIsIGFuZCBhXEIgb24gTlQgYWxsIHlpZWxkIHRoZSBzYW1lIGtleS4KKyAqLworT0JKRUNUICogcGF0aF9hc19rZXkoIE9CSkVDVCAqIHBhdGggKTsKKworLyogQ2FsbGVkIGFzIGFuIG9wdGltaXphdGlvbiB3aGVuIHdlIGtub3cgd2UgaGF2ZSBhIHBhdGggdGhhdCBpcyBhbHJlYWR5IGluIGl0cworICogY2Fub25pY2FsL2xvbmcva2V5IGZvcm0uIEF2b2lkcyB0aGUgbmVlZCBmb3Igc29tZSBzdWJzZXF1ZW50IHBhdGhfYXNfa2V5KCkKKyAqIGNhbGwgdG8gZG8gYSBwb3RlbnRpYWxseSBleHBlbnNpdmUgcGF0aCBjb252ZXJzaW9uIHJlcXVpcmluZyBhY2Nlc3MgdG8gdGhlCisgKiBhY3R1YWwgdW5kZXJseWluZyBmaWxlIHN5c3RlbS4KKyAqLwordm9pZCBwYXRoX3JlZ2lzdGVyX2tleSggT0JKRUNUICogY2Fub25pY19wYXRoICk7CisKKy8qIFJldHVybnMgYSBzdGF0aWMgcG9pbnRlciB0byB0aGUgc3lzdGVtIGRlcGVuZGVudCBwYXRoIHRvIHRoZSB0ZW1wb3JhcnkKKyAqIGRpcmVjdG9yeS4gTk9URTogRG9lcyAqbm90KiBpbmNsdWRlIGEgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IuCisgKi8KK3N0cmluZyBjb25zdCAqIHBhdGhfdG1wZGlyKCB2b2lkICk7CisKKy8qIFJldHVybnMgYSBuZXcgdGVtcG9yYXJ5IG5hbWUuICovCitPQkpFQ1QgKiBwYXRoX3RtcG5hbSggdm9pZCApOworCisvKiBSZXR1cm5zIGEgbmV3IHRlbXBvcmFyeSBwYXRoLiAqLworT0JKRUNUICogcGF0aF90bXBmaWxlKCB2b2lkICk7CisKKy8qIEdpdmUgdGhlIGZpcnN0IGFyZ3VtZW50IHRvICdtYWluJywgcmV0dXJuIGEgZnVsbCBwYXRoIHRvIG91ciBleGVjdXRhYmxlLgorICogUmV0dXJucyBudWxsIGluIHRoZSB1bmxpa2VseSBjYXNlIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLiBDYWxsZXIgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSBzdHJpbmcuCisgKgorICogSW1wbGVtZW50ZWQgaW4gamFtLmMKKyAqLworY2hhciAqIGV4ZWN1dGFibGVfcGF0aCggY2hhciBjb25zdCAqIGFyZ3YwICk7CisKK3ZvaWQgcGF0aF9kb25lKCB2b2lkICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcGF0aHVuaXguYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3BhdGh1bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhMGQxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3BhdGh1bml4LmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLTIwMDIgQ2hyaXN0b3BoZXIgU2Vpd2FsZCBhbmQgUGVyZm9yY2UgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiBUaGlzIGZpbGUgaXMgQUxTTzoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiBDb3B5cmlnaHQgMjAwNSBSZW5lIFJpdmVyYS4KKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyAqIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisvKgorICogcGF0aHVuaXguYyAtIFVOSVggc3BlY2lmaWMgcGF0aCBtYW5pcHVsYXRpb24gc3VwcG9ydAorICovCisKKyNpbmNsdWRlICJwYXRoc3lzLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4gIC8qIG5lZWRlZCBmb3IgZ2V0cGlkKCkgKi8KKworCisvKgorICogcGF0aF9nZXRfcHJvY2Vzc19pZF8oKQorICovCisKK3Vuc2lnbmVkIGxvbmcgcGF0aF9nZXRfcHJvY2Vzc19pZF8oIHZvaWQgKQoreworICAgIHJldHVybiBnZXRwaWQoKTsKK30KKworCisvKgorICogcGF0aF9nZXRfdGVtcF9wYXRoXygpCisgKi8KKwordm9pZCBwYXRoX2dldF90ZW1wX3BhdGhfKCBzdHJpbmcgKiBidWZmZXIgKQoreworICAgIGNoYXIgY29uc3QgKiB0ID0gZ2V0ZW52KCAiVE1QRElSIiApOworICAgIHN0cmluZ19hcHBlbmQoIGJ1ZmZlciwgdCA/IHQgOiAiL3RtcCIgKTsKK30KKworCisvKgorICogcGF0aF9yZWdpc3Rlcl9rZXkoKQorICovCisKK3ZvaWQgcGF0aF9yZWdpc3Rlcl9rZXkoIE9CSkVDVCAqIHBhdGggKQoreworfQorCisKKy8qCisgKiBwYXRoX2FzX2tleSgpCisgKi8KKworT0JKRUNUICogcGF0aF9hc19rZXkoIE9CSkVDVCAqIHBhdGggKQoreworICAgIHJldHVybiBvYmplY3RfY29weSggcGF0aCApOworfQorCisKKy8qCisgKiBwYXRoX2RvbmUoKQorICovCisKK3ZvaWQgcGF0aF9kb25lKCB2b2lkICkKK3sKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3JlZ2V4cC5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcmVnZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0MjAxYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3JlZ2V4cC5jCkBAIC0wLDAgKzEsMTMyOSBAQAorLyoKKyAqIHJlZ2NvbXAgYW5kIHJlZ2V4ZWMgLS0gcmVnc3ViIGFuZCByZWdlcnJvciBhcmUgZWxzZXdoZXJlCisgKgorICogIENvcHlyaWdodCAoYykgMTk4NiBieSBVbml2ZXJzaXR5IG9mIFRvcm9udG8uCisgKiAgV3JpdHRlbiBieSBIZW5yeSBTcGVuY2VyLiAgTm90IGRlcml2ZWQgZnJvbSBsaWNlbnNlZCBzb2Z0d2FyZS4KKyAqCisgKiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiAgcHVycG9zZSBvbiBhbnkgY29tcHV0ZXIgc3lzdGVtLCBhbmQgdG8gcmVkaXN0cmlidXRlIGl0IGZyZWVseSwKKyAqICBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqICAxLiBUaGUgYXV0aG9yIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgdGhlIGNvbnNlcXVlbmNlcyBvZiB1c2Ugb2YKKyAqICAgICAgdGhpcyBzb2Z0d2FyZSwgbm8gbWF0dGVyIGhvdyBhd2Z1bCwgZXZlbiBpZiB0aGV5IGFyaXNlCisgKiAgICAgIGZyb20gZGVmZWN0cyBpbiBpdC4KKyAqCisgKiAgMi4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkLCBlaXRoZXIKKyAqICAgICAgYnkgZXhwbGljaXQgY2xhaW0gb3IgYnkgb21pc3Npb24uCisgKgorICogIDMuIEFsdGVyZWQgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QKKyAqICAgICAgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICoqKiBUSElTIElTIEFOIEFMVEVSRUQgVkVSU0lPTi4gIEl0IHdhcyBhbHRlcmVkIGJ5IEpvaG4gR2lsbW9yZSwKKyAqKiogaG9wdG9hZCFnbnUsIG9uIDI3IERlYyAxOTg2LCB0byBhZGQgXG4gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gfAorICoqKiB0byBhc3Npc3QgaW4gaW1wbGVtZW50aW5nIGVncmVwLgorICoqKiBUSElTIElTIEFOIEFMVEVSRUQgVkVSU0lPTi4gIEl0IHdhcyBhbHRlcmVkIGJ5IEpvaG4gR2lsbW9yZSwKKyAqKiogaG9wdG9hZCFnbnUsIG9uIDI3IERlYyAxOTg2LCB0byBhZGQgXDwgYW5kIFw+IGZvciB3b3JkLW1hdGNoaW5nCisgKioqIGFzIGluIEJTRCBncmVwIGFuZCBleC4KKyAqKiogVEhJUyBJUyBBTiBBTFRFUkVEIFZFUlNJT04uICBJdCB3YXMgYWx0ZXJlZCBieSBKb2huIEdpbG1vcmUsCisgKioqIGhvcHRvYWQhZ251LCBvbiAyOCBEZWMgMTk4NiwgdG8gb3B0aW1pemUgY2hhcmFjdGVycyBxdW90ZWQgd2l0aCBcLgorICoqKiBUSElTIElTIEFOIEFMVEVSRUQgVkVSU0lPTi4gIEl0IHdhcyBhbHRlcmVkIGJ5IEphbWVzIEEuIFdvb2RzLAorICoqKiBhbWVzIWphdywgb24gMTkgSnVuZSAxOTg3LCB0byBxdWFzaCBhIHJlZ2NvbXAoKSByZWR1bmRhbmN5LgorICoqKiBUSElTIElTIEFOIEFMVEVSRUQgVkVSU0lPTi4gIEl0IHdhcyBhbHRlcmVkIGJ5IENocmlzdG9waGVyIFNlaXdhbGQKKyAqKiogc2Vpd2FsZEB2aXguY29tLCBvbiAyOCBBdWd1c3QgMTk5MywgZm9yIHVzZSBpbiBqYW0uICBSZWdtYWdpYy5oCisgKioqIHdhcyBtb3ZlZCBpbnRvIHJlZ2V4cC5oLCBhbmQgdGhlIGluY2x1ZGUgb2YgcmVnZXhwLmggbm93IHVzZXMgIidzCisgKioqIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGggdGhlIHN5c3RlbSByZWdleHAuaC4gIENvbnN0LCBibGVzcyBpdHMKKyAqKiogc291bCwgd2FzIHJlbW92ZWQgc28gaXQgY2FuIGNvbXBpbGUgZXZlcnl3aGVyZS4gIFRoZSBkZWNsYXJhdGlvbgorICoqKiBvZiBzdHJjaHIoKSB3YXMgaW4gY29uZmxpY3Qgb24gQUlYLCBzbyBpdCB3YXMgcmVtb3ZlZCAoYXMgaXQgaXMKKyAqKiogaGFwcGlseSBkZWZpbmVkIGluIHN0cmluZy5oKS4KKyAqKiogVEhJUyBJUyBBTiBBTFRFUkVEIFZFUlNJT04uICBJdCB3YXMgYWx0ZXJlZCBieSBDaHJpc3RvcGhlciBTZWl3YWxkCisgKioqIHNlaXdhbGRAcGVyZm9yY2UuY29tLCBvbiAyMCBKYW51YXJ5IDIwMDAsIHRvIHVzZSBmdW5jdGlvbiBwcm90b3R5cGVzLgorICoKKyAqIEJld2FyZSB0aGF0IHNvbWUgb2YgdGhpcyBjb2RlIGlzIHN1YnRseSBhd2FyZSBvZiB0aGUgd2F5IG9wZXJhdG9yIHByZWNlZGVuY2UKKyAqIGlzIHN0cnVjdHVyZWQgaW4gcmVndWxhciBleHByZXNzaW9ucy4gU2VyaW91cyBjaGFuZ2VzIGluIHJlZ3VsYXItZXhwcmVzc2lvbgorICogc3ludGF4IG1pZ2h0IHJlcXVpcmUgYSB0b3RhbCByZXRoaW5rLgorICovCisKKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgInJlZ2V4cC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2lmbmRlZiB1bHRyaXgKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCisvKgorICogVGhlICJpbnRlcm5hbCB1c2Ugb25seSIgZmllbGRzIGluIHJlZ2V4cC5oIGFyZSBwcmVzZW50IHRvIHBhc3MgaW5mbyBmcm9tCisgKiBjb21waWxlIHRvIGV4ZWN1dGUgdGhhdCBwZXJtaXRzIHRoZSBleGVjdXRlIHBoYXNlIHRvIHJ1biBsb3RzIGZhc3RlciBvbgorICogc2ltcGxlIGNhc2VzLiBUaGV5IGFyZToKKyA6CisgKiAgcmVnc3RhcnQgY2hhciB0aGF0IG11c3QgYmVnaW4gYSBtYXRjaDsgJ1wwJyBpZiBub25lIG9idmlvdXMuCisgKiAgcmVnYW5jaCAgaXMgdGhlIG1hdGNoIGFuY2hvcmVkIChhdCBiZWdpbm5pbmctb2YtbGluZSBvbmx5KT8KKyAqICByZWdtdXN0ICBzdHJpbmcgKHBvaW50ZXIgaW50byBwcm9ncmFtKSB0aGF0IG1hdGNoIG11c3QgaW5jbHVkZSwgb3IgTlVMTC4KKyAqICByZWdtbGVuICBsZW5ndGggb2YgcmVnbXVzdCBzdHJpbmcuCisgKgorICogUmVnc3RhcnQgYW5kIHJlZ2FuY2ggcGVybWl0IHZlcnkgZmFzdCBkZWNpc2lvbnMgb24gc3VpdGFibGUgc3RhcnRpbmcgcG9pbnRzCisgKiBmb3IgYSBtYXRjaCwgY3V0dGluZyBkb3duIHRoZSB3b3JrIGEgbG90LiAgUmVnbXVzdCBwZXJtaXRzIGZhc3QgcmVqZWN0aW9uIG9mCisgKiBsaW5lcyB0aGF0IGNhbm5vdCBwb3NzaWJseSBtYXRjaC4gIFRoZSByZWdtdXN0IHRlc3RzIGFyZSBjb3N0bHkgZW5vdWdoIHRoYXQKKyAqIHJlZ2NvbXAoKSBzdXBwbGllcyBhIHJlZ211c3Qgb25seSBpZiB0aGUgci5lLiBjb250YWlucyBzb21ldGhpbmcgcG90ZW50aWFsbHkKKyAqIGV4cGVuc2l2ZSAoYXQgcHJlc2VudCwgdGhlIG9ubHkgc3VjaCB0aGluZyBkZXRlY3RlZCBpcyAqIG9yICsgYXQgdGhlIHN0YXJ0IG9mCisgKiB0aGUgci5lLiwgd2hpY2ggY2FuIGludm9sdmUgYSBsb3Qgb2YgYmFja3VwKS4gUmVnbWxlbiBpcyBzdXBwbGllZCBiZWNhdXNlIHRoZQorICogdGVzdCBpbiByZWdleGVjKCkgbmVlZHMgaXQgYW5kIHJlZ2NvbXAoKSBpcyBjb21wdXRpbmcgaXQgYW55d2F5LgorICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIHJlZ2V4cCAicHJvZ3JhbSIuIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBsaW5lYXIgZW5jb2Rpbmcgb2YgYQorICogbm9uZGV0ZXJtaW5pc3RpYyBmaW5pdGUtc3RhdGUgbWFjaGluZSAoYWthIHN5bnRheCBjaGFydHMgb3IgInJhaWxyb2FkIG5vcm1hbAorICogZm9ybSIgaW4gcGFyc2luZyB0ZWNobm9sb2d5KS4gRWFjaCBub2RlIGlzIGFuIG9wY29kZSBwbHVzIGEgIm5leHQiIHBvaW50ZXIsCisgKiBwb3NzaWJseSBwbHVzIGFuIG9wZXJhbmQuICJOZXh0IiBwb2ludGVycyBvZiBhbGwgbm9kZXMgZXhjZXB0IEJSQU5DSAorICogaW1wbGVtZW50IGNvbmNhdGVuYXRpb247IGEgIm5leHQiIHBvaW50ZXIgd2l0aCBhIEJSQU5DSCBvbiBib3RoIGVuZHMgb2YgaXQgaXMKKyAqIGNvbm5lY3RpbmcgdHdvIGFsdGVybmF0aXZlcy4gW0hlcmUgd2UgaGF2ZSBvbmUgb2YgdGhlIHN1YnRsZSBzeW50YXgKKyAqIGRlcGVuZGVuY2llczogYW4gaW5kaXZpZHVhbCBCUkFOQ0gsIGFzIG9wcG9zZWQgdG8gYSBjb2xsZWN0aW9uIG9mIHRoZW0sIGlzCisgKiBuZXZlciBjb25jYXRlbmF0ZWQgd2l0aCBhbnl0aGluZyBiZWNhdXNlIG9mIG9wZXJhdG9yIHByZWNlZGVuY2UuXSBUaGUgb3BlcmFuZAorICogb2Ygc29tZSB0eXBlcyBvZiBub2RlIGlzIGEgbGl0ZXJhbCBzdHJpbmc7IGZvciBvdGhlcnMsIGl0IGlzIGEgbm9kZSBsZWFkaW5nCisgKiBpbnRvIGEgc3ViLUZTTS4gSW4gcGFydGljdWxhciwgdGhlIG9wZXJhbmQgb2YgYSBCUkFOQ0ggbm9kZSBpcyB0aGUgZmlyc3Qgbm9kZQorICogb2YgdGhlIGJyYW5jaC4gW05CIHRoaXMgaXMgKm5vdCogYSB0cmVlIHN0cnVjdHVyZTogdGhlIHRhaWwgb2YgdGhlIGJyYW5jaAorICogY29ubmVjdHMgdG8gdGhlIHRoaW5nIGZvbGxvd2luZyB0aGUgc2V0IG9mIEJSQU5DSGVzLl0gVGhlIG9wY29kZXMgYXJlOgorICovCisKKy8qIGRlZmluaXRpb24gICBudW1iZXIgIG9wbmQ/ICAgbWVhbmluZyAqLworI2RlZmluZSBFTkQgMCAgIC8qIG5vICAgRW5kIG9mIHByb2dyYW0uICovCisjZGVmaW5lIEJPTCAxICAgLyogbm8gICBNYXRjaCAiIiBhdCBiZWdpbm5pbmcgb2YgbGluZS4gKi8KKyNkZWZpbmUgRU9MIDIgICAvKiBubyAgIE1hdGNoICIiIGF0IGVuZCBvZiBsaW5lLiAqLworI2RlZmluZSBBTlkgMyAgIC8qIG5vICAgTWF0Y2ggYW55IG9uZSBjaGFyYWN0ZXIuICovCisjZGVmaW5lIEFOWU9GICAgNCAgIC8qIHN0ciAgTWF0Y2ggYW55IGNoYXJhY3RlciBpbiB0aGlzIHN0cmluZy4gKi8KKyNkZWZpbmUgQU5ZQlVUICA1ICAgLyogc3RyICBNYXRjaCBhbnkgY2hhcmFjdGVyIG5vdCBpbiB0aGlzIHN0cmluZy4gKi8KKyNkZWZpbmUgQlJBTkNIICA2ICAgLyogbm9kZSBNYXRjaCB0aGlzIGFsdGVybmF0aXZlLCBvciB0aGUgbmV4dC4uLiAqLworI2RlZmluZSBCQUNLICAgIDcgICAvKiBubyAgIE1hdGNoICIiLCAibmV4dCIgcHRyIHBvaW50cyBiYWNrd2FyZC4gKi8KKyNkZWZpbmUgRVhBQ1RMWSA4ICAgLyogc3RyICBNYXRjaCB0aGlzIHN0cmluZy4gKi8KKyNkZWZpbmUgTk9USElORyA5ICAgLyogbm8gICBNYXRjaCBlbXB0eSBzdHJpbmcuICovCisjZGVmaW5lIFNUQVIgICAgMTAgIC8qIG5vZGUgTWF0Y2ggdGhpcyAoc2ltcGxlKSB0aGluZyAwIG9yIG1vcmUgdGltZXMuICovCisjZGVmaW5lIFBMVVMgICAgMTEgIC8qIG5vZGUgTWF0Y2ggdGhpcyAoc2ltcGxlKSB0aGluZyAxIG9yIG1vcmUgdGltZXMuICovCisjZGVmaW5lIFdPUkRBICAgMTIgIC8qIG5vICAgTWF0Y2ggIiIgYXQgd29yZGNoYXIsIHdoZXJlIHByZXYgaXMgbm9ud29yZCAqLworI2RlZmluZSBXT1JEWiAgIDEzICAvKiBubyAgIE1hdGNoICIiIGF0IG5vbndvcmRjaGFyLCB3aGVyZSBwcmV2IGlzIHdvcmQgKi8KKyNkZWZpbmUgT1BFTiAgICAyMCAgLyogbm8gICBNYXJrIHRoaXMgcG9pbnQgaW4gaW5wdXQgYXMgc3RhcnQgb2YgI24uICovCisgICAgICAgICAgICAvKiAgT1BFTisxIGlzIG51bWJlciAxLCBldGMuICovCisjZGVmaW5lIENMT1NFICAgMzAgIC8qIG5vICAgQW5hbG9nb3VzIHRvIE9QRU4uICovCisKKworLyoKKyAqIE9wY29kZSBub3RlczoKKyAqCisgKiBCUkFOQ0ggICBUaGUgc2V0IG9mIGJyYW5jaGVzIGNvbnN0aXR1dGluZyBhIHNpbmdsZSBjaG9pY2UgYXJlIGhvb2tlZAorICogICAgICB0b2dldGhlciB3aXRoIHRoZWlyICJuZXh0IiBwb2ludGVycywgc2luY2UgcHJlY2VkZW5jZSBwcmV2ZW50cworICogICAgICBhbnl0aGluZyBiZWluZyBjb25jYXRlbmF0ZWQgdG8gYW55IGluZGl2aWR1YWwgYnJhbmNoLiAgVGhlCisgKiAgICAgICJuZXh0IiBwb2ludGVyIG9mIHRoZSBsYXN0IEJSQU5DSCBpbiBhIGNob2ljZSBwb2ludHMgdG8gdGhlCisgKiAgICAgIHRoaW5nIGZvbGxvd2luZyB0aGUgd2hvbGUgY2hvaWNlLiAgVGhpcyBpcyBhbHNvIHdoZXJlIHRoZQorICogICAgICBmaW5hbCAibmV4dCIgcG9pbnRlciBvZiBlYWNoIGluZGl2aWR1YWwgYnJhbmNoIHBvaW50czsgZWFjaAorICogICAgICBicmFuY2ggc3RhcnRzIHdpdGggdGhlIG9wZXJhbmQgbm9kZSBvZiBhIEJSQU5DSCBub2RlLgorICoKKyAqIEJBQ0sgICAgIE5vcm1hbCAibmV4dCIgcG9pbnRlcnMgYWxsIGltcGxpY2l0bHkgcG9pbnQgZm9yd2FyZDsgQkFDSworICogICAgICBleGlzdHMgdG8gbWFrZSBsb29wIHN0cnVjdHVyZXMgcG9zc2libGUuCisgKgorICogU1RBUixQTFVTICAgICc/JywgYW5kIGNvbXBsZXggJyonIGFuZCAnKycsIGFyZSBpbXBsZW1lbnRlZCBhcyBjaXJjdWxhcgorICogICAgICBCUkFOQ0ggc3RydWN0dXJlcyB1c2luZyBCQUNLLiAgU2ltcGxlIGNhc2VzIChvbmUgY2hhcmFjdGVyCisgKiAgICAgIHBlciBtYXRjaCkgYXJlIGltcGxlbWVudGVkIHdpdGggU1RBUiBhbmQgUExVUyBmb3Igc3BlZWQKKyAqICAgICAgYW5kIHRvIG1pbmltaXplIHJlY3Vyc2l2ZSBwbHVuZ2VzLgorICoKKyAqIE9QRU4sQ0xPU0UgICAuLi5hcmUgbnVtYmVyZWQgYXQgY29tcGlsZSB0aW1lLgorICovCisKKy8qCisgKiBBIG5vZGUgaXMgb25lIGNoYXIgb2Ygb3Bjb2RlIGZvbGxvd2VkIGJ5IHR3byBjaGFycyBvZiAibmV4dCIgcG9pbnRlci4KKyAqICJOZXh0IiBwb2ludGVycyBhcmUgc3RvcmVkIGFzIHR3byA4LWJpdCBwaWVjZXMsIGhpZ2ggb3JkZXIgZmlyc3QuICBUaGUKKyAqIHZhbHVlIGlzIGEgcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIG9wY29kZSBvZiB0aGUgbm9kZSBjb250YWluaW5nIGl0LgorICogQW4gb3BlcmFuZCwgaWYgYW55LCBzaW1wbHkgZm9sbG93cyB0aGUgbm9kZS4gIChOb3RlIHRoYXQgbXVjaCBvZiB0aGUKKyAqIGNvZGUgZ2VuZXJhdGlvbiBrbm93cyBhYm91dCB0aGlzIGltcGxpY2l0IHJlbGF0aW9uc2hpcC4pCisgKgorICogVXNpbmcgdHdvIGJ5dGVzIGZvciB0aGUgIm5leHQiIHBvaW50ZXIgaXMgdmFzdCBvdmVya2lsbCBmb3IgbW9zdCB0aGluZ3MsCisgKiBidXQgYWxsb3dzIHBhdHRlcm5zIHRvIGdldCBiaWcgd2l0aG91dCBkaXNhc3RlcnMuCisgKi8KKyNkZWZpbmUgT1AocCkgICAoKihwKSkKKyNkZWZpbmUgTkVYVChwKSAoKCgqKChwKSsxKSYwMzc3KTw8OCkgKyAoKigocCkrMikmMDM3NykpCisjZGVmaW5lIE9QRVJBTkQocCkgICgocCkgKyAzKQorCisvKgorICogU2VlIHJlZ21hZ2ljLmggZm9yIG9uZSBmdXJ0aGVyIGRldGFpbCBvZiBwcm9ncmFtIHN0cnVjdHVyZS4KKyAqLworCisKKy8qCisgKiBVdGlsaXR5IGRlZmluaXRpb25zLgorICovCisjaWZuZGVmIENIQVJCSVRTCisjZGVmaW5lIFVDSEFSQVQocCkgICgoaW50KSooY29uc3QgdW5zaWduZWQgY2hhciAqKShwKSkKKyNlbHNlCisjZGVmaW5lIFVDSEFSQVQocCkgICgoaW50KSoocCkmQ0hBUkJJVFMpCisjZW5kaWYKKworI2RlZmluZSBGQUlMKG0pIHsgcmVnZXJyb3IobSk7IHJldHVybihOVUxMKTsgfQorI2RlZmluZSBJU01VTFQoYykgICAoKGMpID09ICcqJyB8fCAoYykgPT0gJysnIHx8IChjKSA9PSAnPycpCisKKy8qCisgKiBGbGFncyB0byBiZSBwYXNzZWQgdXAgYW5kIGRvd24uCisgKi8KKyNkZWZpbmUgSEFTV0lEVEggICAgMDEgIC8qIEtub3duIG5ldmVyIHRvIG1hdGNoIG51bGwgc3RyaW5nLiAqLworI2RlZmluZSBTSU1QTEUgICAgICAwMiAgLyogU2ltcGxlIGVub3VnaCB0byBiZSBTVEFSL1BMVVMgb3BlcmFuZC4gKi8KKyNkZWZpbmUgU1BTVEFSVCAgICAgMDQgIC8qIFN0YXJ0cyB3aXRoICogb3IgKy4gKi8KKyNkZWZpbmUgV09SU1QgICAgICAgMCAgIC8qIFdvcnN0IGNhc2UuICovCisKKy8qCisgKiBHbG9iYWwgd29yayB2YXJpYWJsZXMgZm9yIHJlZ2NvbXAoKS4KKyAqLworc3RhdGljIGNoYXIgKnJlZ3BhcnNlOyAgICAgIC8qIElucHV0LXNjYW4gcG9pbnRlci4gKi8KK3N0YXRpYyBpbnQgcmVnbnBhcjsgICAgIC8qICgpIGNvdW50LiAqLworc3RhdGljIGNoYXIgcmVnZHVtbXk7CitzdGF0aWMgY2hhciAqcmVnY29kZTsgICAgICAgLyogQ29kZS1lbWl0IHBvaW50ZXI7ICZyZWdkdW1teSA9IGRvbid0LiAqLworc3RhdGljIGxvbmcgcmVnc2l6ZTsgICAgICAgIC8qIENvZGUgc2l6ZS4gKi8KKworLyoKKyAqIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciByZWdjb21wKCkncyBmcmllbmRzLgorICovCisjaWZuZGVmIFNUQVRJQworI2RlZmluZSBTVEFUSUMgIHN0YXRpYworI2VuZGlmCitTVEFUSUMgY2hhciAqcmVnKCBpbnQgcGFyZW4sIGludCAqZmxhZ3AgKTsKK1NUQVRJQyBjaGFyICpyZWdicmFuY2goIGludCAqZmxhZ3AgKTsKK1NUQVRJQyBjaGFyICpyZWdwaWVjZSggaW50ICpmbGFncCApOworU1RBVElDIGNoYXIgKnJlZ2F0b20oIGludCAqZmxhZ3AgKTsKK1NUQVRJQyBjaGFyICpyZWdub2RlKCBpbnQgb3AgKTsKK1NUQVRJQyBjaGFyICpyZWduZXh0KCByZWdpc3RlciBjaGFyICpwICk7CitTVEFUSUMgdm9pZCByZWdjKCBpbnQgYiApOworU1RBVElDIHZvaWQgcmVnaW5zZXJ0KCBjaGFyIG9wLCBjaGFyICpvcG5kICk7CitTVEFUSUMgdm9pZCByZWd0YWlsKCBjaGFyICpwLCBjaGFyICp2YWwgKTsKK1NUQVRJQyB2b2lkIHJlZ29wdGFpbCggY2hhciAqcCwgY2hhciAqdmFsICk7CisjaWZkZWYgU1RSQ1NQTgorU1RBVElDIGludCBzdHJjc3BuKCk7CisjZW5kaWYKKworLyoKKyAtIHJlZ2NvbXAgLSBjb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIGludG8gaW50ZXJuYWwgY29kZQorICoKKyAqIFdlIGNhbid0IGFsbG9jYXRlIHNwYWNlIHVudGlsIHdlIGtub3cgaG93IGJpZyB0aGUgY29tcGlsZWQgZm9ybSB3aWxsIGJlLAorICogYnV0IHdlIGNhbid0IGNvbXBpbGUgaXQgKGFuZCB0aHVzIGtub3cgaG93IGJpZyBpdCBpcykgdW50aWwgd2UndmUgZ290IGEKKyAqIHBsYWNlIHRvIHB1dCB0aGUgY29kZS4gIFNvIHdlIGNoZWF0OiAgd2UgY29tcGlsZSBpdCB0d2ljZSwgb25jZSB3aXRoIGNvZGUKKyAqIGdlbmVyYXRpb24gdHVybmVkIG9mZiBhbmQgc2l6ZSBjb3VudGluZyB0dXJuZWQgb24sIGFuZCBvbmNlICJmb3IgcmVhbCIuCisgKiBUaGlzIGFsc28gbWVhbnMgdGhhdCB3ZSBkb24ndCBhbGxvY2F0ZSBzcGFjZSB1bnRpbCB3ZSBhcmUgc3VyZSB0aGF0IHRoZQorICogdGhpbmcgcmVhbGx5IHdpbGwgY29tcGlsZSBzdWNjZXNzZnVsbHksIGFuZCB3ZSBuZXZlciBoYXZlIHRvIG1vdmUgdGhlCisgKiBjb2RlIGFuZCB0aHVzIGludmFsaWRhdGUgcG9pbnRlcnMgaW50byBpdC4gIChOb3RlIHRoYXQgaXQgaGFzIHRvIGJlIGluCisgKiBvbmUgcGllY2UgYmVjYXVzZSBmcmVlKCkgbXVzdCBiZSBhYmxlIHRvIGZyZWUgaXQgYWxsLikKKyAqCisgKiBCZXdhcmUgdGhhdCB0aGUgb3B0aW1pemF0aW9uLXByZXBhcmF0aW9uIGNvZGUgaW4gaGVyZSBrbm93cyBhYm91dCBzb21lCisgKiBvZiB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb21waWxlZCByZWdleHAuCisgKi8KK3JlZ2V4cCAqCityZWdjb21wKCBjb25zdCBjaGFyICpleHAgKQoreworICAgIHJlZ2lzdGVyIHJlZ2V4cCAqcjsKKyAgICByZWdpc3RlciBjaGFyICpzY2FuOworICAgIHJlZ2lzdGVyIGNoYXIgKmxvbmdlc3Q7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbGVuOworICAgIGludCBmbGFnczsKKworICAgIGlmIChleHAgPT0gTlVMTCkKKyAgICAgICAgRkFJTCgiTlVMTCBhcmd1bWVudCIpOworCisgICAgLyogRmlyc3QgcGFzczogZGV0ZXJtaW5lIHNpemUsIGxlZ2FsaXR5LiAqLworI2lmZGVmIG5vdGRlZgorICAgIGlmIChleHBbMF0gPT0gJy4nICYmIGV4cFsxXSA9PSAnKicpIGV4cCArPSAyOyAgLyogYWlkIGdyZXAgKi8KKyNlbmRpZgorICAgIHJlZ3BhcnNlID0gKGNoYXIgKilleHA7CisgICAgcmVnbnBhciA9IDE7CisgICAgcmVnc2l6ZSA9IDBMOworICAgIHJlZ2NvZGUgPSAmcmVnZHVtbXk7CisgICAgcmVnYyhNQUdJQyk7CisgICAgaWYgKHJlZygwLCAmZmxhZ3MpID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKworICAgIC8qIFNtYWxsIGVub3VnaCBmb3IgcG9pbnRlci1zdG9yYWdlIGNvbnZlbnRpb24/ICovCisgICAgaWYgKHJlZ3NpemUgPj0gMzI3NjdMKSAgICAgIC8qIFByb2JhYmx5IGNvdWxkIGJlIDY1NTM1TC4gKi8KKyAgICAgICAgRkFJTCgicmVnZXhwIHRvbyBiaWciKTsKKworICAgIC8qIEFsbG9jYXRlIHNwYWNlLiAqLworICAgIHIgPSAocmVnZXhwICopQkpBTV9NQUxMT0Moc2l6ZW9mKHJlZ2V4cCkgKyAodW5zaWduZWQpcmVnc2l6ZSk7CisgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgRkFJTCgib3V0IG9mIHNwYWNlIik7CisKKyAgICAvKiBTZWNvbmQgcGFzczogZW1pdCBjb2RlLiAqLworICAgIHJlZ3BhcnNlID0gKGNoYXIgKilleHA7CisgICAgcmVnbnBhciA9IDE7CisgICAgcmVnY29kZSA9IHItPnByb2dyYW07CisgICAgcmVnYyhNQUdJQyk7CisgICAgaWYgKHJlZygwLCAmZmxhZ3MpID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKworICAgIC8qIERpZyBvdXQgaW5mb3JtYXRpb24gZm9yIG9wdGltaXphdGlvbnMuICovCisgICAgci0+cmVnc3RhcnQgPSAnXDAnOyAvKiBXb3JzdC1jYXNlIGRlZmF1bHRzLiAqLworICAgIHItPnJlZ2FuY2ggPSAwOworICAgIHItPnJlZ211c3QgPSBOVUxMOworICAgIHItPnJlZ21sZW4gPSAwOworICAgIHNjYW4gPSByLT5wcm9ncmFtKzE7ICAgICAgICAgICAgLyogRmlyc3QgQlJBTkNILiAqLworICAgIGlmIChPUChyZWduZXh0KHNjYW4pKSA9PSBFTkQpIHsgICAgIC8qIE9ubHkgb25lIHRvcC1sZXZlbCBjaG9pY2UuICovCisgICAgICAgIHNjYW4gPSBPUEVSQU5EKHNjYW4pOworCisgICAgICAgIC8qIFN0YXJ0aW5nLXBvaW50IGluZm8uICovCisgICAgICAgIGlmIChPUChzY2FuKSA9PSBFWEFDVExZKQorICAgICAgICAgICAgci0+cmVnc3RhcnQgPSAqT1BFUkFORChzY2FuKTsKKyAgICAgICAgZWxzZSBpZiAoT1Aoc2NhbikgPT0gQk9MKQorICAgICAgICAgICAgci0+cmVnYW5jaCsrOworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZXJlJ3Mgc29tZXRoaW5nIGV4cGVuc2l2ZSBpbiB0aGUgci5lLiwgZmluZCB0aGUKKyAgICAgICAgICogbG9uZ2VzdCBsaXRlcmFsIHN0cmluZyB0aGF0IG11c3QgYXBwZWFyIGFuZCBtYWtlIGl0IHRoZQorICAgICAgICAgKiByZWdtdXN0LiAgUmVzb2x2ZSB0aWVzIGluIGZhdm9yIG9mIGxhdGVyIHN0cmluZ3MsIHNpbmNlCisgICAgICAgICAqIHRoZSByZWdzdGFydCBjaGVjayB3b3JrcyB3aXRoIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHIuZS4KKyAgICAgICAgICogYW5kIGF2b2lkaW5nIGR1cGxpY2F0aW9uIHN0cmVuZ3RoZW5zIGNoZWNraW5nLiAgTm90IGEKKyAgICAgICAgICogc3Ryb25nIHJlYXNvbiwgYnV0IHN1ZmZpY2llbnQgaW4gdGhlIGFic2VuY2Ugb2Ygb3RoZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGZsYWdzJlNQU1RBUlQpIHsKKyAgICAgICAgICAgIGxvbmdlc3QgPSBOVUxMOworICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgIGZvciAoOyBzY2FuICE9IE5VTEw7IHNjYW4gPSByZWduZXh0KHNjYW4pKQorICAgICAgICAgICAgICAgIGlmIChPUChzY2FuKSA9PSBFWEFDVExZICYmIHN0cmxlbihPUEVSQU5EKHNjYW4pKSA+PSBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZ2VzdCA9IE9QRVJBTkQoc2Nhbik7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihPUEVSQU5EKHNjYW4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICByLT5yZWdtdXN0ID0gbG9uZ2VzdDsKKyAgICAgICAgICAgIHItPnJlZ21sZW4gPSBsZW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4ocik7Cit9CisKKy8qCisgLSByZWcgLSByZWd1bGFyIGV4cHJlc3Npb24sIGkuZS4gbWFpbiBib2R5IG9yIHBhcmVudGhlc2l6ZWQgdGhpbmcKKyAqCisgKiBDYWxsZXIgbXVzdCBhYnNvcmIgb3BlbmluZyBwYXJlbnRoZXNpcy4KKyAqCisgKiBDb21iaW5pbmcgcGFyZW50aGVzaXMgaGFuZGxpbmcgd2l0aCB0aGUgYmFzZSBsZXZlbCBvZiByZWd1bGFyIGV4cHJlc3Npb24KKyAqIGlzIGEgdHJpZmxlIGZvcmNlZCwgYnV0IHRoZSBuZWVkIHRvIHRpZSB0aGUgdGFpbHMgb2YgdGhlIGJyYW5jaGVzIHRvIHdoYXQKKyAqIGZvbGxvd3MgbWFrZXMgaXQgaGFyZCB0byBhdm9pZC4KKyAqLworc3RhdGljIGNoYXIgKgorcmVnKAorICAgIGludCBwYXJlbiwgICAgICAgICAgLyogUGFyZW50aGVzaXplZD8gKi8KKyAgICBpbnQgKmZsYWdwICkKK3sKKyAgICByZWdpc3RlciBjaGFyICpyZXQ7CisgICAgcmVnaXN0ZXIgY2hhciAqYnI7CisgICAgcmVnaXN0ZXIgY2hhciAqZW5kZXI7CisgICAgcmVnaXN0ZXIgaW50IHBhcm5vID0gMDsKKyAgICBpbnQgZmxhZ3M7CisKKyAgICAqZmxhZ3AgPSBIQVNXSURUSDsgIC8qIFRlbnRhdGl2ZWx5LiAqLworCisgICAgLyogTWFrZSBhbiBPUEVOIG5vZGUsIGlmIHBhcmVudGhlc2l6ZWQuICovCisgICAgaWYgKHBhcmVuKSB7CisgICAgICAgIGlmIChyZWducGFyID49IE5TVUJFWFApCisgICAgICAgICAgICBGQUlMKCJ0b28gbWFueSAoKSIpOworICAgICAgICBwYXJubyA9IHJlZ25wYXI7CisgICAgICAgIHJlZ25wYXIrKzsKKyAgICAgICAgcmV0ID0gcmVnbm9kZShPUEVOK3Bhcm5vKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0ID0gTlVMTDsKKworICAgIC8qIFBpY2sgdXAgdGhlIGJyYW5jaGVzLCBsaW5raW5nIHRoZW0gdG9nZXRoZXIuICovCisgICAgYnIgPSByZWdicmFuY2goJmZsYWdzKTsKKyAgICBpZiAoYnIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIGlmIChyZXQgIT0gTlVMTCkKKyAgICAgICAgcmVndGFpbChyZXQsIGJyKTsgICAvKiBPUEVOIC0+IGZpcnN0LiAqLworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gYnI7CisgICAgaWYgKCEoZmxhZ3MmSEFTV0lEVEgpKQorICAgICAgICAqZmxhZ3AgJj0gfkhBU1dJRFRIOworICAgICpmbGFncCB8PSBmbGFncyZTUFNUQVJUOworICAgIHdoaWxlICgqcmVncGFyc2UgPT0gJ3wnIHx8ICpyZWdwYXJzZSA9PSAnXG4nKSB7CisgICAgICAgIHJlZ3BhcnNlKys7CisgICAgICAgIGJyID0gcmVnYnJhbmNoKCZmbGFncyk7CisgICAgICAgIGlmIChiciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworICAgICAgICByZWd0YWlsKHJldCwgYnIpOyAgIC8qIEJSQU5DSCAtPiBCUkFOQ0guICovCisgICAgICAgIGlmICghKGZsYWdzJkhBU1dJRFRIKSkKKyAgICAgICAgICAgICpmbGFncCAmPSB+SEFTV0lEVEg7CisgICAgICAgICpmbGFncCB8PSBmbGFncyZTUFNUQVJUOworICAgIH0KKworICAgIC8qIE1ha2UgYSBjbG9zaW5nIG5vZGUsIGFuZCBob29rIGl0IG9uIHRoZSBlbmQuICovCisgICAgZW5kZXIgPSByZWdub2RlKChwYXJlbikgPyBDTE9TRStwYXJubyA6IEVORCk7CisgICAgcmVndGFpbChyZXQsIGVuZGVyKTsKKworICAgIC8qIEhvb2sgdGhlIHRhaWxzIG9mIHRoZSBicmFuY2hlcyB0byB0aGUgY2xvc2luZyBub2RlLiAqLworICAgIGZvciAoYnIgPSByZXQ7IGJyICE9IE5VTEw7IGJyID0gcmVnbmV4dChicikpCisgICAgICAgIHJlZ29wdGFpbChiciwgZW5kZXIpOworCisgICAgLyogQ2hlY2sgZm9yIHByb3BlciB0ZXJtaW5hdGlvbi4gKi8KKyAgICBpZiAocGFyZW4gJiYgKnJlZ3BhcnNlKysgIT0gJyknKSB7CisgICAgICAgIEZBSUwoInVubWF0Y2hlZCAoKSIpOworICAgIH0gZWxzZSBpZiAoIXBhcmVuICYmICpyZWdwYXJzZSAhPSAnXDAnKSB7CisgICAgICAgIGlmICgqcmVncGFyc2UgPT0gJyknKSB7CisgICAgICAgICAgICBGQUlMKCJ1bm1hdGNoZWQgKCkiKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBGQUlMKCJqdW5rIG9uIGVuZCIpOyAgICAvKiAiQ2FuJ3QgaGFwcGVuIi4gKi8KKyAgICAgICAgLyogTk9UUkVBQ0hFRCAqLworICAgIH0KKworICAgIHJldHVybihyZXQpOworfQorCisvKgorIC0gcmVnYnJhbmNoIC0gb25lIGFsdGVybmF0aXZlIG9mIGFuIHwgb3BlcmF0b3IKKyAqCisgKiBJbXBsZW1lbnRzIHRoZSBjb25jYXRlbmF0aW9uIG9wZXJhdG9yLgorICovCitzdGF0aWMgY2hhciAqCityZWdicmFuY2goIGludCAqZmxhZ3AgKQoreworICAgIHJlZ2lzdGVyIGNoYXIgKnJldDsKKyAgICByZWdpc3RlciBjaGFyICpjaGFpbjsKKyAgICByZWdpc3RlciBjaGFyICpsYXRlc3Q7CisgICAgaW50IGZsYWdzOworCisgICAgKmZsYWdwID0gV09SU1Q7ICAgICAvKiBUZW50YXRpdmVseS4gKi8KKworICAgIHJldCA9IHJlZ25vZGUoQlJBTkNIKTsKKyAgICBjaGFpbiA9IE5VTEw7CisgICAgd2hpbGUgKCpyZWdwYXJzZSAhPSAnXDAnICYmICpyZWdwYXJzZSAhPSAnKScgJiYKKyAgICAgICAgICAgKnJlZ3BhcnNlICE9ICdcbicgJiYgKnJlZ3BhcnNlICE9ICd8JykgeworICAgICAgICBsYXRlc3QgPSByZWdwaWVjZSgmZmxhZ3MpOworICAgICAgICBpZiAobGF0ZXN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgICAgICpmbGFncCB8PSBmbGFncyZIQVNXSURUSDsKKyAgICAgICAgaWYgKGNoYWluID09IE5VTEwpICAvKiBGaXJzdCBwaWVjZS4gKi8KKyAgICAgICAgICAgICpmbGFncCB8PSBmbGFncyZTUFNUQVJUOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZWd0YWlsKGNoYWluLCBsYXRlc3QpOworICAgICAgICBjaGFpbiA9IGxhdGVzdDsKKyAgICB9CisgICAgaWYgKGNoYWluID09IE5VTEwpICAvKiBMb29wIHJhbiB6ZXJvIHRpbWVzLiAqLworICAgICAgICAodm9pZCkgcmVnbm9kZShOT1RISU5HKTsKKworICAgIHJldHVybihyZXQpOworfQorCisvKgorIC0gcmVncGllY2UgLSBzb21ldGhpbmcgZm9sbG93ZWQgYnkgcG9zc2libGUgWyorP10KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGJyYW5jaGluZyBjb2RlIHNlcXVlbmNlcyB1c2VkIGZvciA/IGFuZCB0aGUgZ2VuZXJhbCBjYXNlcworICogb2YgKiBhbmQgKyBhcmUgc29tZXdoYXQgb3B0aW1pemVkOiAgdGhleSB1c2UgdGhlIHNhbWUgTk9USElORyBub2RlIGFzCisgKiBib3RoIHRoZSBlbmRtYXJrZXIgZm9yIHRoZWlyIGJyYW5jaCBsaXN0IGFuZCB0aGUgYm9keSBvZiB0aGUgbGFzdCBicmFuY2guCisgKiBJdCBtaWdodCBzZWVtIHRoYXQgdGhpcyBub2RlIGNvdWxkIGJlIGRpc3BlbnNlZCB3aXRoIGVudGlyZWx5LCBidXQgdGhlCisgKiBlbmRtYXJrZXIgcm9sZSBpcyBub3QgcmVkdW5kYW50LgorICovCitzdGF0aWMgY2hhciAqCityZWdwaWVjZSggaW50ICpmbGFncCApCit7CisgICAgcmVnaXN0ZXIgY2hhciAqcmV0OworICAgIHJlZ2lzdGVyIGNoYXIgb3A7CisgICAgcmVnaXN0ZXIgY2hhciAqbmV4dDsKKyAgICBpbnQgZmxhZ3M7CisKKyAgICByZXQgPSByZWdhdG9tKCZmbGFncyk7CisgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTlVMTCk7CisKKyAgICBvcCA9ICpyZWdwYXJzZTsKKyAgICBpZiAoIUlTTVVMVChvcCkpIHsKKyAgICAgICAgKmZsYWdwID0gZmxhZ3M7CisgICAgICAgIHJldHVybihyZXQpOworICAgIH0KKworICAgIGlmICghKGZsYWdzJkhBU1dJRFRIKSAmJiBvcCAhPSAnPycpCisgICAgICAgIEZBSUwoIiorIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiKTsKKyAgICAqZmxhZ3AgPSAob3AgIT0gJysnKSA/IChXT1JTVHxTUFNUQVJUKSA6IChXT1JTVHxIQVNXSURUSCk7CisKKyAgICBpZiAob3AgPT0gJyonICYmIChmbGFncyZTSU1QTEUpKQorICAgICAgICByZWdpbnNlcnQoU1RBUiwgcmV0KTsKKyAgICBlbHNlIGlmIChvcCA9PSAnKicpIHsKKyAgICAgICAgLyogRW1pdCB4KiBhcyAoeCZ8KSwgd2hlcmUgJiBtZWFucyAic2VsZiIuICovCisgICAgICAgIHJlZ2luc2VydChCUkFOQ0gsIHJldCk7ICAgICAgICAgLyogRWl0aGVyIHggKi8KKyAgICAgICAgcmVnb3B0YWlsKHJldCwgcmVnbm9kZShCQUNLKSk7ICAgICAgLyogYW5kIGxvb3AgKi8KKyAgICAgICAgcmVnb3B0YWlsKHJldCwgcmV0KTsgICAgICAgICAgICAvKiBiYWNrICovCisgICAgICAgIHJlZ3RhaWwocmV0LCByZWdub2RlKEJSQU5DSCkpOyAgICAgIC8qIG9yICovCisgICAgICAgIHJlZ3RhaWwocmV0LCByZWdub2RlKE5PVEhJTkcpKTsgICAgIC8qIG51bGwuICovCisgICAgfSBlbHNlIGlmIChvcCA9PSAnKycgJiYgKGZsYWdzJlNJTVBMRSkpCisgICAgICAgIHJlZ2luc2VydChQTFVTLCByZXQpOworICAgIGVsc2UgaWYgKG9wID09ICcrJykgeworICAgICAgICAvKiBFbWl0IHgrIGFzIHgoJnwpLCB3aGVyZSAmIG1lYW5zICJzZWxmIi4gKi8KKyAgICAgICAgbmV4dCA9IHJlZ25vZGUoQlJBTkNIKTsgICAgICAgICAvKiBFaXRoZXIgKi8KKyAgICAgICAgcmVndGFpbChyZXQsIG5leHQpOworICAgICAgICByZWd0YWlsKHJlZ25vZGUoQkFDSyksIHJldCk7ICAgICAgICAvKiBsb29wIGJhY2sgKi8KKyAgICAgICAgcmVndGFpbChuZXh0LCByZWdub2RlKEJSQU5DSCkpOyAgICAgLyogb3IgKi8KKyAgICAgICAgcmVndGFpbChyZXQsIHJlZ25vZGUoTk9USElORykpOyAgICAgLyogbnVsbC4gKi8KKyAgICB9IGVsc2UgaWYgKG9wID09ICc/JykgeworICAgICAgICAvKiBFbWl0IHg/IGFzICh4fCkgKi8KKyAgICAgICAgcmVnaW5zZXJ0KEJSQU5DSCwgcmV0KTsgICAgICAgICAvKiBFaXRoZXIgeCAqLworICAgICAgICByZWd0YWlsKHJldCwgcmVnbm9kZShCUkFOQ0gpKTsgICAgICAvKiBvciAqLworICAgICAgICBuZXh0ID0gcmVnbm9kZShOT1RISU5HKTsgICAgICAgIC8qIG51bGwuICovCisgICAgICAgIHJlZ3RhaWwocmV0LCBuZXh0KTsKKyAgICAgICAgcmVnb3B0YWlsKHJldCwgbmV4dCk7CisgICAgfQorICAgIHJlZ3BhcnNlKys7CisgICAgaWYgKElTTVVMVCgqcmVncGFyc2UpKQorICAgICAgICBGQUlMKCJuZXN0ZWQgKj8rIik7CisKKyAgICByZXR1cm4ocmV0KTsKK30KKworLyoKKyAtIHJlZ2F0b20gLSB0aGUgbG93ZXN0IGxldmVsCisgKgorICogT3B0aW1pemF0aW9uOiAgZ29iYmxlcyBhbiBlbnRpcmUgc2VxdWVuY2Ugb2Ygb3JkaW5hcnkgY2hhcmFjdGVycyBzbyB0aGF0CisgKiBpdCBjYW4gdHVybiB0aGVtIGludG8gYSBzaW5nbGUgbm9kZSwgd2hpY2ggaXMgc21hbGxlciB0byBzdG9yZSBhbmQKKyAqIGZhc3RlciB0byBydW4uICBCYWNrc2xhc2hlZCBjaGFyYWN0ZXJzIGFyZSBleGNlcHRpb25zLCBlYWNoIGJlY29taW5nIGEKKyAqIHNlcGFyYXRlIG5vZGU7IHRoZSBjb2RlIGlzIHNpbXBsZXIgdGhhdCB3YXkgYW5kIGl0J3Mgbm90IHdvcnRoIGZpeGluZy4KKyAqLworc3RhdGljIGNoYXIgKgorcmVnYXRvbSggaW50ICpmbGFncCApCit7CisgICAgcmVnaXN0ZXIgY2hhciAqcmV0OworICAgIGludCBmbGFnczsKKworICAgICpmbGFncCA9IFdPUlNUOyAgICAgLyogVGVudGF0aXZlbHkuICovCisKKyAgICBzd2l0Y2ggKCpyZWdwYXJzZSsrKSB7CisgICAgLyogRklYTUU6IHRoZXNlIGNoYXJzIG9ubHkgaGF2ZSBtZWFuaW5nIGF0IGJlZy9lbmQgb2YgcGF0PyAqLworICAgIGNhc2UgJ14nOgorICAgICAgICByZXQgPSByZWdub2RlKEJPTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJyQnOgorICAgICAgICByZXQgPSByZWdub2RlKEVPTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJy4nOgorICAgICAgICByZXQgPSByZWdub2RlKEFOWSk7CisgICAgICAgICpmbGFncCB8PSBIQVNXSURUSHxTSU1QTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ1snOiB7CisgICAgICAgICAgICByZWdpc3RlciBpbnQgY2xhc3NyOworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IGNsYXNzZW5kOworCisgICAgICAgICAgICBpZiAoKnJlZ3BhcnNlID09ICdeJykgeyAvKiBDb21wbGVtZW50IG9mIHJhbmdlLiAqLworICAgICAgICAgICAgICAgIHJldCA9IHJlZ25vZGUoQU5ZQlVUKTsKKyAgICAgICAgICAgICAgICByZWdwYXJzZSsrOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmV0ID0gcmVnbm9kZShBTllPRik7CisgICAgICAgICAgICBpZiAoKnJlZ3BhcnNlID09ICddJyB8fCAqcmVncGFyc2UgPT0gJy0nKQorICAgICAgICAgICAgICAgIHJlZ2MoKnJlZ3BhcnNlKyspOworICAgICAgICAgICAgd2hpbGUgKCpyZWdwYXJzZSAhPSAnXDAnICYmICpyZWdwYXJzZSAhPSAnXScpIHsKKyAgICAgICAgICAgICAgICBpZiAoKnJlZ3BhcnNlID09ICctJykgeworICAgICAgICAgICAgICAgICAgICByZWdwYXJzZSsrOworICAgICAgICAgICAgICAgICAgICBpZiAoKnJlZ3BhcnNlID09ICddJyB8fCAqcmVncGFyc2UgPT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2MoJy0nKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3IgPSBVQ0hBUkFUKHJlZ3BhcnNlLTIpKzE7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VuZCA9IFVDSEFSQVQocmVncGFyc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzciA+IGNsYXNzZW5kKzEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTCgiaW52YWxpZCBbXSByYW5nZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGNsYXNzciA8PSBjbGFzc2VuZDsgY2xhc3NyKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnYyhjbGFzc3IpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVncGFyc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICByZWdjKCpyZWdwYXJzZSsrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZ2MoJ1wwJyk7CisgICAgICAgICAgICBpZiAoKnJlZ3BhcnNlICE9ICddJykKKyAgICAgICAgICAgICAgICBGQUlMKCJ1bm1hdGNoZWQgW10iKTsKKyAgICAgICAgICAgIHJlZ3BhcnNlKys7CisgICAgICAgICAgICAqZmxhZ3AgfD0gSEFTV0lEVEh8U0lNUExFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJygnOgorICAgICAgICByZXQgPSByZWcoMSwgJmZsYWdzKTsKKyAgICAgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworICAgICAgICAqZmxhZ3AgfD0gZmxhZ3MmKEhBU1dJRFRIfFNQU1RBUlQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdcMCc6CisgICAgY2FzZSAnfCc6CisgICAgY2FzZSAnXG4nOgorICAgIGNhc2UgJyknOgorICAgICAgICBGQUlMKCJpbnRlcm5hbCB1cnAiKTsgICAvKiBTdXBwb3NlZCB0byBiZSBjYXVnaHQgZWFybGllci4gKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnPyc6CisgICAgY2FzZSAnKyc6CisgICAgY2FzZSAnKic6CisgICAgICAgIEZBSUwoIj8rKiBmb2xsb3dzIG5vdGhpbmciKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnXFwnOgorICAgICAgICBzd2l0Y2ggKCpyZWdwYXJzZSsrKSB7CisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIEZBSUwoInRyYWlsaW5nIFxcIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgICByZXQgPSByZWdub2RlKFdPUkRBKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgIHJldCA9IHJlZ25vZGUoV09SRFopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIEZJWE1FOiBTb21lZGF5IGhhbmRsZSBcMSwgXDIsIC4uLiAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogSGFuZGxlIGdlbmVyYWwgcXVvdGVkIGNoYXJzIGluIGV4YWN0LW1hdGNoIHJvdXRpbmUgKi8KKyAgICAgICAgICAgIGdvdG8gZGVfZmF1bHQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVfZmF1bHQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyoKKyAgICAgICAgICogRW5jb2RlIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdG8gYmUgbWF0Y2hlZCBleGFjdGx5LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGlzIGEgYml0IHRyaWNreSBkdWUgdG8gcXVvdGVkIGNoYXJzIGFuZCBkdWUgdG8KKyAgICAgICAgICogJyonLCAnKycsIGFuZCAnPycgdGFraW5nIHRoZSBTSU5HTEUgY2hhciBwcmV2aW91cworICAgICAgICAgKiBhcyB0aGVpciBvcGVyYW5kLgorICAgICAgICAgKgorICAgICAgICAgKiBPbiBlbnRyeSwgdGhlIGNoYXIgYXQgcmVncGFyc2VbLTFdIGlzIGdvaW5nIHRvIGdvCisgICAgICAgICAqIGludG8gdGhlIHN0cmluZywgbm8gbWF0dGVyIHdoYXQgaXQgaXMuICAoSXQgY291bGQgYmUKKyAgICAgICAgICogZm9sbG93aW5nIGEgXCBpZiB3ZSBhcmUgZW50ZXJlZCBmcm9tIHRoZSAnXCcgY2FzZS4pCisgICAgICAgICAqCisgICAgICAgICAqIEJhc2ljIGlkZWEgaXMgdG8gcGljayB1cCBhIGdvb2QgY2hhciBpbiAgY2ggIGFuZAorICAgICAgICAgKiBleGFtaW5lIHRoZSBuZXh0IGNoYXIuICBJZiBpdCdzICorPyB0aGVuIHdlIHR3aWRkbGUuCisgICAgICAgICAqIElmIGl0J3MgXCB0aGVuIHdlIGZyb3p6bGUuICBJZiBpdCdzIG90aGVyIG1hZ2ljIGNoYXIKKyAgICAgICAgICogd2UgcHVzaCAgY2ggIGFuZCB0ZXJtaW5hdGUgdGhlIHN0cmluZy4gIElmIG5vbmUgb2YgdGhlCisgICAgICAgICAqIGFib3ZlLCB3ZSBwdXNoICBjaCAgb24gdGhlIHN0cmluZyBhbmQgZ28gYXJvdW5kIGFnYWluLgorICAgICAgICAgKgorICAgICAgICAgKiAgcmVncHJldiAgaXMgdXNlZCB0byByZW1lbWJlciB3aGVyZSAidGhlIGN1cnJlbnQgY2hhciIKKyAgICAgICAgICogc3RhcnRzIGluIHRoZSBzdHJpbmcsIGlmIGR1ZSB0byBhICorPyB3ZSBuZWVkIHRvIGJhY2sKKyAgICAgICAgICogdXAgYW5kIHB1dCB0aGUgY3VycmVudCBjaGFyIGluIGEgc2VwYXJhdGUsIDEtY2hhciwgc3RyaW5nLgorICAgICAgICAgKiBXaGVuICByZWdwcmV2ICBpcyBOVUxMLCAgY2ggIGlzIHRoZSBvbmx5IGNoYXIgaW4gdGhlCisgICAgICAgICAqIHN0cmluZzsgdGhpcyBpcyB1c2VkIGluICorPyBoYW5kbGluZywgYW5kIGluIHNldHRpbmcKKyAgICAgICAgICogZmxhZ3MgfD0gU0lNUExFIGF0IHRoZSBlbmQuCisgICAgICAgICAqLworICAgICAgICB7CisgICAgICAgICAgICBjaGFyICpyZWdwcmV2OworICAgICAgICAgICAgcmVnaXN0ZXIgY2hhciBjaDsKKworICAgICAgICAgICAgcmVncGFyc2UtLTsgICAgICAgICAvKiBMb29rIGF0IGN1ciBjaGFyICovCisgICAgICAgICAgICByZXQgPSByZWdub2RlKEVYQUNUTFkpOworICAgICAgICAgICAgZm9yICggcmVncHJldiA9IDAgOyA7ICkgeworICAgICAgICAgICAgICAgIGNoID0gKnJlZ3BhcnNlKys7ICAgLyogR2V0IGN1cnJlbnQgY2hhciAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAoKnJlZ3BhcnNlKSB7ICAgIC8qIGxvb2sgYXQgbmV4dCBvbmUgKi8KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJlZ2MoY2gpOyAgIC8qIEFkZCBjdXIgdG8gc3RyaW5nICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnLic6IGNhc2UgJ1snOiBjYXNlICcoJzoKKyAgICAgICAgICAgICAgICBjYXNlICcpJzogY2FzZSAnfCc6IGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICBjYXNlICckJzogY2FzZSAnXic6CisgICAgICAgICAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgICAgIC8qIEZJWE1FLCAkIGFuZCBeIHNob3VsZCBub3QgYWx3YXlzIGJlIG1hZ2ljICovCisgICAgICAgICAgICAgICAgbWFnaWM6CisgICAgICAgICAgICAgICAgICAgIHJlZ2MoY2gpOyAgIC8qIGR1bXAgY3VyIGNoYXIgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOyAgLyogYW5kIHdlIGFyZSBkb25lICovCisKKyAgICAgICAgICAgICAgICBjYXNlICc/JzogY2FzZSAnKyc6IGNhc2UgJyonOgorICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ3ByZXYpICAgLyogSWYganVzdCBjaCBpbiBzdHIsICovCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG1hZ2ljOyAvKiB1c2UgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogRW5kIG11bHQtY2hhciBzdHJpbmcgb25lIGVhcmx5ICovCisgICAgICAgICAgICAgICAgICAgIHJlZ3BhcnNlID0gcmVncHJldjsgLyogQmFjayB1cCBwYXJzZSAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgICAgIHJlZ2MoY2gpOyAgIC8qIEN1ciBjaGFyIE9LICovCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocmVncGFyc2VbMV0peyAvKiBMb29rIGFmdGVyIFwgKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBTb21lZGF5IGhhbmRsZSBcMSwgXDIsIC4uLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOyAvKiBOb3QgcXVvdGVkICovCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrdXAgcG9pbnQgaXMgXCwgc2NhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICogcG9pbnQgaXMgYWZ0ZXIgaXQuICovCisgICAgICAgICAgICAgICAgICAgICAgICByZWdwcmV2ID0gcmVncGFyc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZWdwYXJzZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgLyogTk9UIGJyZWFrOyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZ3ByZXYgPSByZWdwYXJzZTsgLyogU2V0IGJhY2t1cCBwb2ludCAqLworICAgICAgICAgICAgfQorICAgICAgICBkb25lOgorICAgICAgICAgICAgcmVnYygnXDAnKTsKKyAgICAgICAgICAgICpmbGFncCB8PSBIQVNXSURUSDsKKyAgICAgICAgICAgIGlmICghcmVncHJldikgICAgICAgLyogT25lIGNoYXI/ICovCisgICAgICAgICAgICAgICAgKmZsYWdwIHw9IFNJTVBMRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4ocmV0KTsKK30KKworLyoKKyAtIHJlZ25vZGUgLSBlbWl0IGEgbm9kZQorICovCitzdGF0aWMgY2hhciAqICAgICAgICAgICAvKiBMb2NhdGlvbi4gKi8KK3JlZ25vZGUoIGludCBvcCApCit7CisgICAgcmVnaXN0ZXIgY2hhciAqcmV0OworICAgIHJlZ2lzdGVyIGNoYXIgKnB0cjsKKworICAgIHJldCA9IHJlZ2NvZGU7CisgICAgaWYgKHJldCA9PSAmcmVnZHVtbXkpIHsKKyAgICAgICAgcmVnc2l6ZSArPSAzOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICB9CisKKyAgICBwdHIgPSByZXQ7CisgICAgKnB0cisrID0gb3A7CisgICAgKnB0cisrID0gJ1wwJzsgICAgICAvKiBOdWxsICJuZXh0IiBwb2ludGVyLiAqLworICAgICpwdHIrKyA9ICdcMCc7CisgICAgcmVnY29kZSA9IHB0cjsKKworICAgIHJldHVybihyZXQpOworfQorCisvKgorIC0gcmVnYyAtIGVtaXQgKGlmIGFwcHJvcHJpYXRlKSBhIGJ5dGUgb2YgY29kZQorICovCitzdGF0aWMgdm9pZAorcmVnYyggaW50IGIgKQoreworICAgIGlmIChyZWdjb2RlICE9ICZyZWdkdW1teSkKKyAgICAgICAgKnJlZ2NvZGUrKyA9IGI7CisgICAgZWxzZQorICAgICAgICByZWdzaXplKys7Cit9CisKKy8qCisgLSByZWdpbnNlcnQgLSBpbnNlcnQgYW4gb3BlcmF0b3IgaW4gZnJvbnQgb2YgYWxyZWFkeS1lbWl0dGVkIG9wZXJhbmQKKyAqCisgKiBNZWFucyByZWxvY2F0aW5nIHRoZSBvcGVyYW5kLgorICovCitzdGF0aWMgdm9pZAorcmVnaW5zZXJ0KAorICAgIGNoYXIgb3AsCisgICAgY2hhciAqb3BuZCApCit7CisgICAgcmVnaXN0ZXIgY2hhciAqc3JjOworICAgIHJlZ2lzdGVyIGNoYXIgKmRzdDsKKyAgICByZWdpc3RlciBjaGFyICpwbGFjZTsKKworICAgIGlmIChyZWdjb2RlID09ICZyZWdkdW1teSkgeworICAgICAgICByZWdzaXplICs9IDM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcmMgPSByZWdjb2RlOworICAgIHJlZ2NvZGUgKz0gMzsKKyAgICBkc3QgPSByZWdjb2RlOworICAgIHdoaWxlIChzcmMgPiBvcG5kKQorICAgICAgICAqLS1kc3QgPSAqLS1zcmM7CisKKyAgICBwbGFjZSA9IG9wbmQ7ICAgICAgIC8qIE9wIG5vZGUsIHdoZXJlIG9wZXJhbmQgdXNlZCB0byBiZS4gKi8KKyAgICAqcGxhY2UrKyA9IG9wOworICAgICpwbGFjZSsrID0gJ1wwJzsKKyAgICAqcGxhY2UrKyA9ICdcMCc7Cit9CisKKy8qCisgLSByZWd0YWlsIC0gc2V0IHRoZSBuZXh0LXBvaW50ZXIgYXQgdGhlIGVuZCBvZiBhIG5vZGUgY2hhaW4KKyAqLworc3RhdGljIHZvaWQKK3JlZ3RhaWwoCisgICAgY2hhciAqcCwKKyAgICBjaGFyICp2YWwgKQoreworICAgIHJlZ2lzdGVyIGNoYXIgKnNjYW47CisgICAgcmVnaXN0ZXIgY2hhciAqdGVtcDsKKyAgICByZWdpc3RlciBpbnQgb2Zmc2V0OworCisgICAgaWYgKHAgPT0gJnJlZ2R1bW15KQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBGaW5kIGxhc3Qgbm9kZS4gKi8KKyAgICBzY2FuID0gcDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHRlbXAgPSByZWduZXh0KHNjYW4pOworICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNjYW4gPSB0ZW1wOworICAgIH0KKworICAgIGlmIChPUChzY2FuKSA9PSBCQUNLKQorICAgICAgICBvZmZzZXQgPSBzY2FuIC0gdmFsOworICAgIGVsc2UKKyAgICAgICAgb2Zmc2V0ID0gdmFsIC0gc2NhbjsKKyAgICAqKHNjYW4rMSkgPSAob2Zmc2V0Pj44KSYwMzc3OworICAgICooc2NhbisyKSA9IG9mZnNldCYwMzc3OworfQorCisvKgorIC0gcmVnb3B0YWlsIC0gcmVndGFpbCBvbiBvcGVyYW5kIG9mIGZpcnN0IGFyZ3VtZW50OyBub3AgaWYgb3BlcmFuZGxlc3MKKyAqLworCitzdGF0aWMgdm9pZAorcmVnb3B0YWlsKAorICAgIGNoYXIgKnAsCisgICAgY2hhciAqdmFsICkKK3sKKyAgICAvKiAiT3BlcmFuZGxlc3MiIGFuZCAib3AgIT0gQlJBTkNIIiBhcmUgc3lub255bW91cyBpbiBwcmFjdGljZS4gKi8KKyAgICBpZiAocCA9PSBOVUxMIHx8IHAgPT0gJnJlZ2R1bW15IHx8IE9QKHApICE9IEJSQU5DSCkKKyAgICAgICAgcmV0dXJuOworICAgIHJlZ3RhaWwoT1BFUkFORChwKSwgdmFsKTsKK30KKworLyoKKyAqIHJlZ2V4ZWMgYW5kIGZyaWVuZHMKKyAqLworCisvKgorICogR2xvYmFsIHdvcmsgdmFyaWFibGVzIGZvciByZWdleGVjKCkuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpyZWdpbnB1dDsgICAgICAvKiBTdHJpbmctaW5wdXQgcG9pbnRlci4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICpyZWdib2w7ICAgICAgICAvKiBCZWdpbm5pbmcgb2YgaW5wdXQsIGZvciBeIGNoZWNrLiAqLworc3RhdGljIGNvbnN0IGNoYXIgKipyZWdzdGFydHA7ICAgIC8qIFBvaW50ZXIgdG8gc3RhcnRwIGFycmF5LiAqLworc3RhdGljIGNvbnN0IGNoYXIgKipyZWdlbmRwOyAgICAgIC8qIERpdHRvIGZvciBlbmRwLiAqLworCisvKgorICogRm9yd2FyZHMuCisgKi8KK1NUQVRJQyBpbnQgcmVndHJ5KCByZWdleHAgKnByb2csIGNvbnN0IGNoYXIgKnN0cmluZyApOworU1RBVElDIGludCByZWdtYXRjaCggY2hhciAqcHJvZyApOworU1RBVElDIGludCByZWdyZXBlYXQoIGNoYXIgKnAgKTsKKworI2lmZGVmIERFQlVHCitpbnQgcmVnbmFycmF0ZSA9IDA7Cit2b2lkIHJlZ2R1bXAoKTsKK1NUQVRJQyBjaGFyICpyZWdwcm9wKCk7CisjZW5kaWYKKworLyoKKyAtIHJlZ2V4ZWMgLSBtYXRjaCBhIHJlZ2V4cCBhZ2FpbnN0IGEgc3RyaW5nCisgKi8KK2ludAorcmVnZXhlYygKKyAgICByZWdpc3RlciByZWdleHAgKnByb2csCisgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyaW5nICkKK3sKKyAgICByZWdpc3RlciBjaGFyICpzOworCisgICAgLyogQmUgcGFyYW5vaWQuLi4gKi8KKyAgICBpZiAocHJvZyA9PSBOVUxMIHx8IHN0cmluZyA9PSBOVUxMKSB7CisgICAgICAgIHJlZ2Vycm9yKCJOVUxMIHBhcmFtZXRlciIpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgLyogQ2hlY2sgdmFsaWRpdHkgb2YgcHJvZ3JhbS4gKi8KKyAgICBpZiAoVUNIQVJBVChwcm9nLT5wcm9ncmFtKSAhPSBNQUdJQykgeworICAgICAgICByZWdlcnJvcigiY29ycnVwdGVkIHByb2dyYW0iKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIC8qIElmIHRoZXJlIGlzIGEgIm11c3QgYXBwZWFyIiBzdHJpbmcsIGxvb2sgZm9yIGl0LiAqLworICAgIGlmICggcHJvZy0+cmVnbXVzdCAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIHMgPSAoY2hhciAqKXN0cmluZzsKKyAgICAgICAgd2hpbGUgKCAoIHMgPSBzdHJjaHIoIHMsIHByb2ctPnJlZ211c3RbIDAgXSApICkgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIXN0cm5jbXAoIHMsIHByb2ctPnJlZ211c3QsIHByb2ctPnJlZ21sZW4gKSApCisgICAgICAgICAgICAgICAgYnJlYWs7ICAvKiBGb3VuZCBpdC4gKi8KKyAgICAgICAgICAgICsrczsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHMgPT0gTlVMTCApICAvKiBOb3QgcHJlc2VudC4gKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIE1hcmsgYmVnaW5uaW5nIG9mIGxpbmUgZm9yIF4gLiAqLworICAgIHJlZ2JvbCA9IChjaGFyICopc3RyaW5nOworCisgICAgLyogU2ltcGxlc3QgY2FzZTogIGFuY2hvcmVkIG1hdGNoIG5lZWQgYmUgdHJpZWQgb25seSBvbmNlLiAqLworICAgIGlmICggcHJvZy0+cmVnYW5jaCApCisgICAgICAgIHJldHVybiByZWd0cnkoIHByb2csIHN0cmluZyApOworCisgICAgLyogTWVzc3kgY2FzZXM6ICB1bmFuY2hvcmVkIG1hdGNoLiAqLworICAgIHMgPSAoY2hhciAqKXN0cmluZzsKKyAgICBpZiAocHJvZy0+cmVnc3RhcnQgIT0gJ1wwJykKKyAgICAgICAgLyogV2Uga25vdyB3aGF0IGNoYXIgaXQgbXVzdCBzdGFydCB3aXRoLiAqLworICAgICAgICB3aGlsZSAoKHMgPSBzdHJjaHIocywgcHJvZy0+cmVnc3RhcnQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAocmVndHJ5KHByb2csIHMpKQorICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgLyogV2UgZG8gbm90IC0tIGdlbmVyYWwgY2FzZS4gKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKCByZWd0cnkoIHByb2csIHMgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuKCAxICk7CisgICAgICAgIH0gd2hpbGUgKCAqcysrICE9ICdcMCcgKTsKKworICAgIC8qIEZhaWx1cmUuICovCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHJlZ3RyeSgpIC0gdHJ5IG1hdGNoIGF0IHNwZWNpZmljIHBvaW50LgorICovCisKK3N0YXRpYyBpbnQgICAgICAgICAgLyogMCBmYWlsdXJlLCAxIHN1Y2Nlc3MgKi8KK3JlZ3RyeSgKKyAgICByZWdleHAgKnByb2csCisgICAgY29uc3QgY2hhciAqc3RyaW5nICkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciBjb25zdCBjaGFyICogKiBzcDsKKyAgICByZWdpc3RlciBjb25zdCBjaGFyICogKiBlcDsKKworICAgIHJlZ2lucHV0ID0gc3RyaW5nOworICAgIHJlZ3N0YXJ0cCA9IHByb2ctPnN0YXJ0cDsKKyAgICByZWdlbmRwID0gcHJvZy0+ZW5kcDsKKworICAgIHNwID0gcHJvZy0+c3RhcnRwOworICAgIGVwID0gcHJvZy0+ZW5kcDsKKyAgICBmb3IgKCBpID0gTlNVQkVYUDsgaSA+IDA7IC0taSApCisgICAgeworICAgICAgICAqc3ArKyA9IE5VTEw7CisgICAgICAgICplcCsrID0gTlVMTDsKKyAgICB9CisgICAgaWYgKCByZWdtYXRjaCggcHJvZy0+cHJvZ3JhbSArIDEgKSApCisgICAgeworICAgICAgICBwcm9nLT5zdGFydHBbIDAgXSA9IHN0cmluZzsKKyAgICAgICAgcHJvZy0+ZW5kcFsgMCBdID0gcmVnaW5wdXQ7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiByZWdtYXRjaCgpIC0gbWFpbiBtYXRjaGluZyByb3V0aW5lLgorICoKKyAqIENvbmNlcHR1YWxseSB0aGUgc3RyYXRlZ3kgaXMgc2ltcGxlOiBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgY3VycmVudCBub2RlCisgKiBtYXRjaGVzLCBjYWxsIHNlbGYgcmVjdXJzaXZlbHkgdG8gc2VlIHdoZXRoZXIgdGhlIHJlc3QgbWF0Y2hlcywgYW5kIHRoZW4gYWN0CisgKiBhY2NvcmRpbmdseS4gSW4gcHJhY3RpY2Ugd2UgbWFrZSBzb21lIGVmZm9ydCB0byBhdm9pZCByZWN1cnNpb24sIGluCisgKiBwYXJ0aWN1bGFyIGJ5IGdvaW5nIHRocm91Z2ggIm9yZGluYXJ5IiBub2RlcyAodGhhdCBkbyBub3QgbmVlZCB0byBrbm93CisgKiB3aGV0aGVyIHRoZSByZXN0IG9mIHRoZSBtYXRjaCBmYWlsZWQpIGJ5IGEgbG9vcCBpbnN0ZWFkIG9mIGJ5IHJlY3Vyc2lvbi4KKyAqLworCitzdGF0aWMgaW50ICAgICAgICAgIC8qIDAgZmFpbHVyZSwgMSBzdWNjZXNzICovCityZWdtYXRjaCggY2hhciAqIHByb2cgKQoreworICAgIGNoYXIgKiBzY2FuOyAgLyogQ3VycmVudCBub2RlLiAqLworICAgIGNoYXIgKiBuZXh0OyAgLyogTmV4dCBub2RlLiAqLworCisgICAgc2NhbiA9IHByb2c7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoc2NhbiAhPSBOVUxMICYmIHJlZ25hcnJhdGUpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoXG4iLCByZWdwcm9wKHNjYW4pKTsKKyNlbmRpZgorICAgIHdoaWxlIChzY2FuICE9IE5VTEwpIHsKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAocmVnbmFycmF0ZSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMuLi5cbiIsIHJlZ3Byb3Aoc2NhbikpOworI2VuZGlmCisgICAgICAgIG5leHQgPSByZWduZXh0KHNjYW4pOworCisgICAgICAgIHN3aXRjaCAoT1Aoc2NhbikpIHsKKyAgICAgICAgY2FzZSBCT0w6CisgICAgICAgICAgICBpZiAocmVnaW5wdXQgIT0gcmVnYm9sKQorICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPTDoKKyAgICAgICAgICAgIGlmICgqcmVnaW5wdXQgIT0gJ1wwJykKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXT1JEQToKKyAgICAgICAgICAgIC8qIE11c3QgYmUgbG9va2luZyBhdCBhIGxldHRlciwgZGlnaXQsIG9yIF8gKi8KKyAgICAgICAgICAgIGlmICgoIWlzYWxudW0oKnJlZ2lucHV0KSkgJiYgKnJlZ2lucHV0ICE9ICdfJykKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAvKiBQcmV2IG11c3QgYmUgQk9MIG9yIG5vbndvcmQgKi8KKyAgICAgICAgICAgIGlmIChyZWdpbnB1dCA+IHJlZ2JvbCAmJgorICAgICAgICAgICAgICAgIChpc2FsbnVtKHJlZ2lucHV0Wy0xXSkgfHwgcmVnaW5wdXRbLTFdID09ICdfJykpCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV09SRFo6CisgICAgICAgICAgICAvKiBNdXN0IGJlIGxvb2tpbmcgYXQgbm9uIGxldHRlciwgZGlnaXQsIG9yIF8gKi8KKyAgICAgICAgICAgIGlmIChpc2FsbnVtKCpyZWdpbnB1dCkgfHwgKnJlZ2lucHV0ID09ICdfJykKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAvKiBXZSBkb24ndCBjYXJlIHdoYXQgdGhlIHByZXZpb3VzIGNoYXIgd2FzICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTlk6CisgICAgICAgICAgICBpZiAoKnJlZ2lucHV0ID09ICdcMCcpCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgcmVnaW5wdXQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVYQUNUTFk6IHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBpbnQgbGVuOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNoYXIgKm9wbmQ7CisKKyAgICAgICAgICAgICAgICBvcG5kID0gT1BFUkFORChzY2FuKTsKKyAgICAgICAgICAgICAgICAvKiBJbmxpbmUgdGhlIGZpcnN0IGNoYXJhY3RlciwgZm9yIHNwZWVkLiAqLworICAgICAgICAgICAgICAgIGlmICgqb3BuZCAhPSAqcmVnaW5wdXQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4ob3BuZCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEgJiYgc3RybmNtcChvcG5kLCByZWdpbnB1dCwgbGVuKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgcmVnaW5wdXQgKz0gbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU5ZT0Y6CisgICAgICAgICAgICBpZiAoKnJlZ2lucHV0ID09ICdcMCcgfHwgc3RyY2hyKE9QRVJBTkQoc2NhbiksICpyZWdpbnB1dCkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICByZWdpbnB1dCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU5ZQlVUOgorICAgICAgICAgICAgaWYgKCpyZWdpbnB1dCA9PSAnXDAnIHx8IHN0cmNocihPUEVSQU5EKHNjYW4pLCAqcmVnaW5wdXQpICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgcmVnaW5wdXQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5PVEhJTkc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQUNLOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BFTisxOgorICAgICAgICBjYXNlIE9QRU4rMjoKKyAgICAgICAgY2FzZSBPUEVOKzM6CisgICAgICAgIGNhc2UgT1BFTis0OgorICAgICAgICBjYXNlIE9QRU4rNToKKyAgICAgICAgY2FzZSBPUEVOKzY6CisgICAgICAgIGNhc2UgT1BFTis3OgorICAgICAgICBjYXNlIE9QRU4rODoKKyAgICAgICAgY2FzZSBPUEVOKzk6IHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBpbnQgbm87CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqc2F2ZTsKKworICAgICAgICAgICAgICAgIG5vID0gT1Aoc2NhbikgLSBPUEVOOworICAgICAgICAgICAgICAgIHNhdmUgPSByZWdpbnB1dDsKKworICAgICAgICAgICAgICAgIGlmIChyZWdtYXRjaChuZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBEb24ndCBzZXQgc3RhcnRwIGlmIHNvbWUgbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgICogaW52b2NhdGlvbiBvZiB0aGUgc2FtZSBwYXJlbnRoZXNlcworICAgICAgICAgICAgICAgICAgICAgKiBhbHJlYWR5IGhhcy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChyZWdzdGFydHBbbm9dID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICByZWdzdGFydHBbbm9dID0gc2F2ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDTE9TRSsxOgorICAgICAgICBjYXNlIENMT1NFKzI6CisgICAgICAgIGNhc2UgQ0xPU0UrMzoKKyAgICAgICAgY2FzZSBDTE9TRSs0OgorICAgICAgICBjYXNlIENMT1NFKzU6CisgICAgICAgIGNhc2UgQ0xPU0UrNjoKKyAgICAgICAgY2FzZSBDTE9TRSs3OgorICAgICAgICBjYXNlIENMT1NFKzg6CisgICAgICAgIGNhc2UgQ0xPU0UrOTogeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGludCBubzsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCBjaGFyICpzYXZlOworCisgICAgICAgICAgICAgICAgbm8gPSBPUChzY2FuKSAtIENMT1NFOworICAgICAgICAgICAgICAgIHNhdmUgPSByZWdpbnB1dDsKKworICAgICAgICAgICAgICAgIGlmIChyZWdtYXRjaChuZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBEb24ndCBzZXQgZW5kcCBpZiBzb21lIGxhdGVyCisgICAgICAgICAgICAgICAgICAgICAqIGludm9jYXRpb24gb2YgdGhlIHNhbWUgcGFyZW50aGVzZXMKKyAgICAgICAgICAgICAgICAgICAgICogYWxyZWFkeSBoYXMuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAocmVnZW5kcFtub10gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2VuZHBbbm9dID0gc2F2ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCUkFOQ0g6IHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCBjaGFyICpzYXZlOworCisgICAgICAgICAgICAgICAgaWYgKE9QKG5leHQpICE9IEJSQU5DSCkgICAgIC8qIE5vIGNob2ljZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IE9QRVJBTkQoc2Nhbik7ICAgLyogQXZvaWQgcmVjdXJzaW9uLiAqLworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlID0gcmVnaW5wdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVnbWF0Y2goT1BFUkFORChzY2FuKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW5wdXQgPSBzYXZlOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhbiA9IHJlZ25leHQoc2Nhbik7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHNjYW4gIT0gTlVMTCAmJiBPUChzY2FuKSA9PSBCUkFOQ0gpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFSOgorICAgICAgICBjYXNlIFBMVVM6IHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBjaGFyIG5leHRjaDsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBpbnQgbm87CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqc2F2ZTsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBpbnQgbWluOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBMb29rYWhlYWQgdG8gYXZvaWQgdXNlbGVzcyBtYXRjaCBhdHRlbXB0cworICAgICAgICAgICAgICAgICAqIHdoZW4gd2Uga25vdyB3aGF0IGNoYXJhY3RlciBjb21lcyBuZXh0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG5leHRjaCA9ICdcMCc7CisgICAgICAgICAgICAgICAgaWYgKE9QKG5leHQpID09IEVYQUNUTFkpCisgICAgICAgICAgICAgICAgICAgIG5leHRjaCA9ICpPUEVSQU5EKG5leHQpOworICAgICAgICAgICAgICAgIG1pbiA9IChPUChzY2FuKSA9PSBTVEFSKSA/IDAgOiAxOworICAgICAgICAgICAgICAgIHNhdmUgPSByZWdpbnB1dDsKKyAgICAgICAgICAgICAgICBubyA9IHJlZ3JlcGVhdChPUEVSQU5EKHNjYW4pKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobm8gPj0gbWluKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIElmIGl0IGNvdWxkIHdvcmssIHRyeSBpdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRjaCA9PSAnXDAnIHx8ICpyZWdpbnB1dCA9PSBuZXh0Y2gpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVnbWF0Y2gobmV4dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgICAgICAgICAvKiBDb3VsZG4ndCBvciBkaWRuJ3QgLS0gYmFjayB1cC4gKi8KKyAgICAgICAgICAgICAgICAgICAgbm8tLTsKKyAgICAgICAgICAgICAgICAgICAgcmVnaW5wdXQgPSBzYXZlICsgbm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVORDoKKyAgICAgICAgICAgIHJldHVybigxKTsgIC8qIFN1Y2Nlc3MhICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJlZ2Vycm9yKCJtZW1vcnkgY29ycnVwdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdlIGdldCBoZXJlIG9ubHkgaWYgdGhlcmUncyB0cm91YmxlIC0tIG5vcm1hbGx5ICJjYXNlIEVORCIgaXMKKyAgICAgKiB0aGUgdGVybWluYXRpbmcgcG9pbnQuCisgICAgICovCisgICAgcmVnZXJyb3IoImNvcnJ1cHRlZCBwb2ludGVycyIpOworICAgIHJldHVybigwKTsKK30KKworLyoKKyAtIHJlZ3JlcGVhdCAtIHJlcGVhdGVkbHkgbWF0Y2ggc29tZXRoaW5nIHNpbXBsZSwgcmVwb3J0IGhvdyBtYW55CisgKi8KK3N0YXRpYyBpbnQKK3JlZ3JlcGVhdCggY2hhciAqcCApCit7CisgICAgcmVnaXN0ZXIgaW50IGNvdW50ID0gMDsKKyAgICByZWdpc3RlciBjb25zdCBjaGFyICpzY2FuOworICAgIHJlZ2lzdGVyIGNoYXIgKm9wbmQ7CisKKyAgICBzY2FuID0gcmVnaW5wdXQ7CisgICAgb3BuZCA9IE9QRVJBTkQocCk7CisgICAgc3dpdGNoIChPUChwKSkgeworICAgIGNhc2UgQU5ZOgorICAgICAgICBjb3VudCA9IHN0cmxlbihzY2FuKTsKKyAgICAgICAgc2NhbiArPSBjb3VudDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFWEFDVExZOgorICAgICAgICB3aGlsZSAoKm9wbmQgPT0gKnNjYW4pIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBzY2FuKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTllPRjoKKyAgICAgICAgd2hpbGUgKCpzY2FuICE9ICdcMCcgJiYgc3RyY2hyKG9wbmQsICpzY2FuKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgc2NhbisrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU5ZQlVUOgorICAgICAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJyAmJiBzdHJjaHIob3BuZCwgKnNjYW4pID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBzY2FuKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgIC8qIE9oIGRlYXIuICBDYWxsZWQgaW5hcHByb3ByaWF0ZWx5LiAqLworICAgICAgICByZWdlcnJvcigiaW50ZXJuYWwgZm91bHVwIik7CisgICAgICAgIGNvdW50ID0gMDsgIC8qIEJlc3QgY29tcHJvbWlzZS4gKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJlZ2lucHV0ID0gc2NhbjsKKworICAgIHJldHVybihjb3VudCk7Cit9CisKKy8qCisgLSByZWduZXh0IC0gZGlnIHRoZSAibmV4dCIgcG9pbnRlciBvdXQgb2YgYSBub2RlCisgKi8KK3N0YXRpYyBjaGFyICoKK3JlZ25leHQoIHJlZ2lzdGVyIGNoYXIgKnAgKQoreworICAgIHJlZ2lzdGVyIGludCBvZmZzZXQ7CisKKyAgICBpZiAocCA9PSAmcmVnZHVtbXkpCisgICAgICAgIHJldHVybihOVUxMKTsKKworICAgIG9mZnNldCA9IE5FWFQocCk7CisgICAgaWYgKG9mZnNldCA9PSAwKQorICAgICAgICByZXR1cm4oTlVMTCk7CisKKyAgICBpZiAoT1AocCkgPT0gQkFDSykKKyAgICAgICAgcmV0dXJuKHAtb2Zmc2V0KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihwK29mZnNldCk7Cit9CisKKyNpZmRlZiBERUJVRworCitTVEFUSUMgY2hhciAqcmVncHJvcCgpOworCisvKgorIC0gcmVnZHVtcCAtIGR1bXAgYSByZWdleHAgb250byBzdGRvdXQgaW4gdmFndWVseSBjb21wcmVoZW5zaWJsZSBmb3JtCisgKi8KK3ZvaWQKK3JlZ2R1bXAoIHJlZ2V4cCAqciApCit7CisgICAgcmVnaXN0ZXIgY2hhciAqczsKKyAgICByZWdpc3RlciBjaGFyIG9wID0gRVhBQ1RMWTsgLyogQXJiaXRyYXJ5IG5vbi1FTkQgb3AuICovCisgICAgcmVnaXN0ZXIgY2hhciAqbmV4dDsKKworCisgICAgcyA9IHItPnByb2dyYW0gKyAxOworICAgIHdoaWxlIChvcCAhPSBFTkQpIHsgLyogV2hpbGUgdGhhdCB3YXNuJ3QgRU5EIGxhc3QgdGltZS4uLiAqLworICAgICAgICBvcCA9IE9QKHMpOworICAgICAgICBwcmludGYoIiUyZCVzIiwgcy1yLT5wcm9ncmFtLCByZWdwcm9wKHMpKTsgIC8qIFdoZXJlLCB3aGF0LiAqLworICAgICAgICBuZXh0ID0gcmVnbmV4dChzKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgICAgICAgLyogTmV4dCBwdHIuICovCisgICAgICAgICAgICBwcmludGYoIigwKSIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIiglZCkiLCAocy1yLT5wcm9ncmFtKSsobmV4dC1zKSk7CisgICAgICAgIHMgKz0gMzsKKyAgICAgICAgaWYgKG9wID09IEFOWU9GIHx8IG9wID09IEFOWUJVVCB8fCBvcCA9PSBFWEFDVExZKSB7CisgICAgICAgICAgICAvKiBMaXRlcmFsIHN0cmluZywgd2hlcmUgcHJlc2VudC4gKi8KKyAgICAgICAgICAgIHdoaWxlICgqcyAhPSAnXDAnKSB7CisgICAgICAgICAgICAgICAgcHV0Y2hhcigqcyk7CisgICAgICAgICAgICAgICAgcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcysrOworICAgICAgICB9CisgICAgICAgIHB1dGNoYXIoJ1xuJyk7CisgICAgfQorCisgICAgLyogSGVhZGVyIGZpZWxkcyBvZiBpbnRlcmVzdC4gKi8KKyAgICBpZiAoci0+cmVnc3RhcnQgIT0gJ1wwJykKKyAgICAgICAgcHJpbnRmKCJzdGFydCBgJWMnICIsIHItPnJlZ3N0YXJ0KTsKKyAgICBpZiAoci0+cmVnYW5jaCkKKyAgICAgICAgcHJpbnRmKCJhbmNob3JlZCAiKTsKKyAgICBpZiAoci0+cmVnbXVzdCAhPSBOVUxMKQorICAgICAgICBwcmludGYoIm11c3QgaGF2ZSBcIiVzXCIiLCByLT5yZWdtdXN0KTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKKy8qCisgLSByZWdwcm9wIC0gcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIG9wY29kZQorICovCitzdGF0aWMgY2hhciAqCityZWdwcm9wKCBjaGFyICpvcCApCit7CisgICAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgICBzdGF0aWMgY2hhciBidWZbNTBdOworCisgICAgKHZvaWQpIHN0cmNweShidWYsICI6Iik7CisKKyAgICBzd2l0Y2ggKE9QKG9wKSkgeworICAgIGNhc2UgQk9MOgorICAgICAgICBwID0gIkJPTCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRU9MOgorICAgICAgICBwID0gIkVPTCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU5ZOgorICAgICAgICBwID0gIkFOWSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU5ZT0Y6CisgICAgICAgIHAgPSAiQU5ZT0YiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFOWUJVVDoKKyAgICAgICAgcCA9ICJBTllCVVQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJSQU5DSDoKKyAgICAgICAgcCA9ICJCUkFOQ0giOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYQUNUTFk6CisgICAgICAgIHAgPSAiRVhBQ1RMWSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTk9USElORzoKKyAgICAgICAgcCA9ICJOT1RISU5HIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQUNLOgorICAgICAgICBwID0gIkJBQ0siOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVORDoKKyAgICAgICAgcCA9ICJFTkQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QRU4rMToKKyAgICBjYXNlIE9QRU4rMjoKKyAgICBjYXNlIE9QRU4rMzoKKyAgICBjYXNlIE9QRU4rNDoKKyAgICBjYXNlIE9QRU4rNToKKyAgICBjYXNlIE9QRU4rNjoKKyAgICBjYXNlIE9QRU4rNzoKKyAgICBjYXNlIE9QRU4rODoKKyAgICBjYXNlIE9QRU4rOToKKyAgICAgICAgc3ByaW50ZihidWYrc3RybGVuKGJ1ZiksICJPUEVOJWQiLCBPUChvcCktT1BFTik7CisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENMT1NFKzE6CisgICAgY2FzZSBDTE9TRSsyOgorICAgIGNhc2UgQ0xPU0UrMzoKKyAgICBjYXNlIENMT1NFKzQ6CisgICAgY2FzZSBDTE9TRSs1OgorICAgIGNhc2UgQ0xPU0UrNjoKKyAgICBjYXNlIENMT1NFKzc6CisgICAgY2FzZSBDTE9TRSs4OgorICAgIGNhc2UgQ0xPU0UrOToKKyAgICAgICAgc3ByaW50ZihidWYrc3RybGVuKGJ1ZiksICJDTE9TRSVkIiwgT1Aob3ApLUNMT1NFKTsKKyAgICAgICAgcCA9IE5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RBUjoKKyAgICAgICAgcCA9ICJTVEFSIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQTFVTOgorICAgICAgICBwID0gIlBMVVMiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdPUkRBOgorICAgICAgICBwID0gIldPUkRBIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXT1JEWjoKKyAgICAgICAgcCA9ICJXT1JEWiI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJlZ2Vycm9yKCJjb3JydXB0ZWQgb3Bjb2RlIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocCAhPSBOVUxMKQorICAgICAgICAodm9pZCkgc3RyY2F0KGJ1ZiwgcCk7CisgICAgcmV0dXJuKGJ1Zik7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgZm9yIHRob3NlIHBlb3BsZSB3aG8gZG8gbm90IGhhdmUgc3RyY3NwbigpIGluCisgKiB0aGVpciBDIGxpYnJhcmllcy4gIFRoZXkgc2hvdWxkIGdldCBvZmYgdGhlaXIgYnV0dHMgYW5kIGRvIHNvbWV0aGluZworICogYWJvdXQgaXQ7IGF0IGxlYXN0IG9uZSBwdWJsaWMtZG9tYWluIGltcGxlbWVudGF0aW9uIG9mIHRob3NlIChoaWdobHkKKyAqIHVzZWZ1bCkgc3RyaW5nIHJvdXRpbmVzIGhhcyBiZWVuIHB1Ymxpc2hlZCBvbiBVc2VuZXQuCisgKi8KKyNpZmRlZiBTVFJDU1BOCisvKgorICogc3RyY3NwbiAtIGZpbmQgbGVuZ3RoIG9mIGluaXRpYWwgc2VnbWVudCBvZiBzMSBjb25zaXN0aW5nIGVudGlyZWx5CisgKiBvZiBjaGFyYWN0ZXJzIG5vdCBmcm9tIHMyCisgKi8KKworc3RhdGljIGludAorc3RyY3NwbigKKyAgICBjaGFyICpzMSwKKyAgICBjaGFyICpzMiApCit7CisgICAgcmVnaXN0ZXIgY2hhciAqc2NhbjE7CisgICAgcmVnaXN0ZXIgY2hhciAqc2NhbjI7CisgICAgcmVnaXN0ZXIgaW50IGNvdW50OworCisgICAgY291bnQgPSAwOworICAgIGZvciAoc2NhbjEgPSBzMTsgKnNjYW4xICE9ICdcMCc7IHNjYW4xKyspIHsKKyAgICAgICAgZm9yIChzY2FuMiA9IHMyOyAqc2NhbjIgIT0gJ1wwJzspICAgLyogKysgbW92ZWQgZG93bi4gKi8KKyAgICAgICAgICAgIGlmICgqc2NhbjEgPT0gKnNjYW4yKyspCisgICAgICAgICAgICAgICAgcmV0dXJuKGNvdW50KTsKKyAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgcmV0dXJuKGNvdW50KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcmVnZXhwLmggYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9yZWdleHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODk4Y2NkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcmVnZXhwLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIERlZmluaXRpb25zIGV0Yy4gZm9yIHJlZ2V4cCgzKSByb3V0aW5lcy4KKyAqCisgKiBDYXZlYXQ6ICB0aGlzIGlzIFY4IHJlZ2V4cCgzKSBbYWN0dWFsbHksIGEgcmVpbXBsZW1lbnRhdGlvbiB0aGVyZW9mXSwKKyAqIG5vdCB0aGUgU3lzdGVtIFYgb25lLgorICovCisjaWZuZGVmIFJFR0VYUF9EV0EyMDAxMTAyM19ICisjZGVmaW5lIFJFR0VYUF9EV0EyMDAxMTAyM19ICisKKyNkZWZpbmUgTlNVQkVYUCAgMTAKK3R5cGVkZWYgc3RydWN0IHJlZ2V4cCB7CisgICAgY2hhciBjb25zdCAqIHN0YXJ0cFsgTlNVQkVYUCBdOworICAgIGNoYXIgY29uc3QgKiBlbmRwWyBOU1VCRVhQIF07CisgICAgY2hhciByZWdzdGFydDsgICAgICAvKiBJbnRlcm5hbCB1c2Ugb25seS4gKi8KKyAgICBjaGFyIHJlZ2FuY2g7ICAgICAgIC8qIEludGVybmFsIHVzZSBvbmx5LiAqLworICAgIGNoYXIgKiByZWdtdXN0OyAgICAgLyogSW50ZXJuYWwgdXNlIG9ubHkuICovCisgICAgaW50IHJlZ21sZW47ICAgICAgICAvKiBJbnRlcm5hbCB1c2Ugb25seS4gKi8KKyAgICBjaGFyIHByb2dyYW1bIDEgXTsgIC8qIFVud2FycmFudGVkIGNodW1taW5lc3Mgd2l0aCBjb21waWxlci4gKi8KK30gcmVnZXhwOworCisKK3JlZ2V4cCAqIHJlZ2NvbXAoIGNoYXIgY29uc3QgKiBleHAgKTsKK2ludCByZWdleGVjKCByZWdleHAgKiBwcm9nLCBjaGFyIGNvbnN0ICogc3RyaW5nICk7Cit2b2lkIHJlZ2Vycm9yKCBjaGFyIGNvbnN0ICogcyApOworCisKKy8qCisgKiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVnZXhwIGludGVybmFsICJwcm9ncmFtIiBpcyBhY3R1YWxseSB0aGlzIG1hZ2ljCisgKiBudW1iZXI7IHRoZSBzdGFydCBub2RlIGJlZ2lucyBpbiB0aGUgc2Vjb25kIGJ5dGUuCisgKi8KKyNkZWZpbmUgTUFHSUMgIDAyMzQKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3J1bGVzLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9ydWxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NDdjNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9ydWxlcy5jCkBAIC0wLDAgKzEsNzQwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTMsIDE5OTUgQ2hyaXN0b3BoZXIgU2Vpd2FsZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiAgVGhpcyBmaWxlIGlzIEFMU086CisgKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyAqICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisKKy8qCisgKiBydWxlcy5jIC0gYWNjZXNzIHRvIFJVTEVzLCBUQVJHRVRzLCBhbmQgQUNUSU9OcworICoKKyAqIEV4dGVybmFsIHJvdXRpbmVzOgorICogICAgYmluZHJ1bGUoKSAgICAgLSByZXR1cm4gcG9pbnRlciB0byBSVUxFLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuCisgKiAgICBiaW5kdGFyZ2V0KCkgICAtIHJldHVybiBwb2ludGVyIHRvIFRBUkdFVCwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICogICAgdG91Y2hfdGFyZ2V0KCkgLSBtYXJrIGEgdGFyZ2V0IHRvIHNpbXVsYXRlIGJlaW5nIG5ldy4KKyAqICAgIHRhcmdldGxpc3QoKSAgIC0gdHVybiBsaXN0IG9mIHRhcmdldCBuYW1lcyBpbnRvIGEgVEFSR0VUIGNoYWluLgorICogICAgdGFyZ2V0ZW50cnkoKSAgLSBhZGQgYSBUQVJHRVQgdG8gYSBjaGFpbiBvZiBUQVJHRVRTLgorICogICAgYWN0aW9ubGlzdCgpICAgLSBhcHBlbmQgdG8gYW4gQUNUSU9OIGNoYWluLgorICogICAgYWRkc2V0dGluZ3MoKSAgLSBhZGQgYSBkZWZlcnJlZCAic2V0IiBjb21tYW5kIHRvIGEgdGFyZ2V0LgorICogICAgcHVzaHNldHRpbmdzKCkgLSBzZXQgYWxsIHRhcmdldCBzcGVjaWZpYyB2YXJpYWJsZXMuCisgKiAgICBwb3BzZXR0aW5ncygpICAtIHJlc2V0IHRhcmdldCBzcGVjaWZpYyB2YXJpYWJsZXMgdG8gdGhlaXIgcHJlLXB1c2ggdmFsdWVzLgorICogICAgZnJlZXNldHRpbmdzKCkgLSBkZWxldGUgYSBzZXR0aW5ncyBsaXN0LgorICogICAgcnVsZXNfZG9uZSgpICAgLSBmcmVlIFJVTEUgYW5kIFRBUkdFVCB0YWJsZXMuCisgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgInJ1bGVzLmgiCisKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAibGlzdHMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJwYXJzZS5oIgorI2luY2x1ZGUgInBhdGhzeXMuaCIKKyNpbmNsdWRlICJzZWFyY2guaCIKKyNpbmNsdWRlICJ2YXJpYWJsZS5oIgorCisKK3N0YXRpYyB2b2lkIHNldF9ydWxlX2FjdGlvbnMoIFJVTEUgKiwgcnVsZV9hY3Rpb25zICogKTsKK3N0YXRpYyB2b2lkIHNldF9ydWxlX2JvZHkgICAoIFJVTEUgKiwgRlVOQ1RJT04gKiApOworCitzdGF0aWMgc3RydWN0IGhhc2ggKiB0YXJnZXRoYXNoID0gMDsKKworCisvKgorICogZ2V0X3RhcmdldF9pbmNsdWRlcygpIC0gbGF6eSBjcmVhdGVzIGEgdGFyZ2V0J3MgaW50ZXJuYWwgaW5jbHVkZXMgbm9kZQorICoKKyAqIFRoZSBuZXdseSBjcmVhdGVkIG5vZGUgaXMgbm90IGVudGVyZWQgaW50byB0aGUgaGFzaCB0YWJsZSBhcyB0aGVyZSBzaG91bGQKKyAqIG5ldmVyIGJlIGEgbmVlZCB0byBiaW5kIHRoZW0gZGlyZWN0bHkgZnJvbSBhIHRhcmdldCBuYW1lcy4gSWYgeW91IHdhbnQgdG8KKyAqIGFjY2VzcyBhbiBpbnRlcm5hbCBpbmNsdWRlcyBub2RlIGJ5IG5hbWUsIGZpcnN0IGFjY2VzcyB0aGUgYWN0dWFsIHRhcmdldCBhbmQKKyAqIHRoZW4gcmVhZCB0aGUgaW50ZXJuYWwgaW5jbHVkZXMgbm9kZSBmcm9tIHRoZXJlLgorICovCisKK3N0YXRpYyBUQVJHRVQgKiBnZXRfdGFyZ2V0X2luY2x1ZGVzKCBUQVJHRVQgKiBjb25zdCB0ICkKK3sKKyAgICBpZiAoICF0LT5pbmNsdWRlcyApCisgICAgeworICAgICAgICBUQVJHRVQgKiBjb25zdCBpID0gKFRBUkdFVCAqKUJKQU1fTUFMTE9DKCBzaXplb2YoICp0ICkgKTsKKyAgICAgICAgbWVtc2V0KCAoY2hhciAqKWksICdcMCcsIHNpemVvZiggKmkgKSApOworICAgICAgICBpLT5uYW1lID0gb2JqZWN0X2NvcHkoIHQtPm5hbWUgKTsKKyAgICAgICAgaS0+Ym91bmRuYW1lID0gb2JqZWN0X2NvcHkoIGktPm5hbWUgKTsKKyAgICAgICAgaS0+ZmxhZ3MgfD0gVF9GTEFHX05PVEZJTEUgfCBUX0ZMQUdfSU5URVJOQUw7CisgICAgICAgIGktPm9yaWdpbmFsX3RhcmdldCA9IHQ7CisgICAgICAgIHQtPmluY2x1ZGVzID0gaTsKKyAgICB9CisgICAgcmV0dXJuIHQtPmluY2x1ZGVzOworfQorCisKKy8qCisgKiB0YXJnZXRfaW5jbHVkZSgpIC0gYWRkcyBhIHRhcmdldCB0byB0aGUgZ2l2ZW4gdGFyZ2UncyAnaW5jbHVkZWQnIGxpc3QKKyAqIHRhcmdldF9pbmNsdWRlX21hbnkoKSAtIGFkZHMgdGFyZ2V0cyB0byB0aGUgZ2l2ZW4gdGFyZ2V0J3MgJ2luY2x1ZGVkJyBsaXN0CisgKgorICogSW5jbHVkZWQgdGFyZ2V0cyBhcmUgbW9kZWxlZCBhcyBkZXBlbmRlbmNpZXMgb2YgdGhlIGluY2x1ZGluZyB0YXJnZXQncworICogaW50ZXJuYWwgaW5jbHVkZSBub2RlLgorICovCisKK3ZvaWQgdGFyZ2V0X2luY2x1ZGUoIFRBUkdFVCAqIGNvbnN0IGluY2x1ZGluZywgVEFSR0VUICogY29uc3QgaW5jbHVkZWQgKQoreworICAgIFRBUkdFVCAqIGNvbnN0IGludGVybmFsID0gZ2V0X3RhcmdldF9pbmNsdWRlcyggaW5jbHVkaW5nICk7CisgICAgaW50ZXJuYWwtPmRlcGVuZHMgPSB0YXJnZXRlbnRyeSggaW50ZXJuYWwtPmRlcGVuZHMsIGluY2x1ZGVkICk7Cit9CisKK3ZvaWQgdGFyZ2V0X2luY2x1ZGVfbWFueSggVEFSR0VUICogY29uc3QgaW5jbHVkaW5nLCBMSVNUICogY29uc3QgaW5jbHVkZWRfbmFtZXMKKyAgICApCit7CisgICAgVEFSR0VUICogY29uc3QgaW50ZXJuYWwgPSBnZXRfdGFyZ2V0X2luY2x1ZGVzKCBpbmNsdWRpbmcgKTsKKyAgICBpbnRlcm5hbC0+ZGVwZW5kcyA9IHRhcmdldGxpc3QoIGludGVybmFsLT5kZXBlbmRzLCBpbmNsdWRlZF9uYW1lcyApOworfQorCisKKy8qCisgKiBlbnRlcl9ydWxlKCkgLSByZXR1cm4gcG9pbnRlciB0byBSVUxFLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkgaW4KKyAqIHRhcmdldF9tb2R1bGUuCisgKi8KKworc3RhdGljIFJVTEUgKiBlbnRlcl9ydWxlKCBPQkpFQ1QgKiBydWxlbmFtZSwgbW9kdWxlX3QgKiB0YXJnZXRfbW9kdWxlICkKK3sKKyAgICBpbnQgZm91bmQ7CisgICAgUlVMRSAqIGNvbnN0IHIgPSAoUlVMRSAqKWhhc2hfaW5zZXJ0KCBkZW1hbmRfcnVsZXMoIHRhcmdldF9tb2R1bGUgKSwKKyAgICAgICAgcnVsZW5hbWUsICZmb3VuZCApOworICAgIGlmICggIWZvdW5kICkKKyAgICB7CisgICAgICAgIHItPm5hbWUgPSBvYmplY3RfY29weSggcnVsZW5hbWUgKTsKKyAgICAgICAgci0+cHJvY2VkdXJlID0gMDsKKyAgICAgICAgci0+bW9kdWxlID0gMDsKKyAgICAgICAgci0+YWN0aW9ucyA9IDA7CisgICAgICAgIHItPmV4cG9ydGVkID0gMDsKKyAgICAgICAgci0+bW9kdWxlID0gdGFyZ2V0X21vZHVsZTsKKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisKKworLyoKKyAqIGRlZmluZV9ydWxlKCkgLSByZXR1cm4gcG9pbnRlciB0byBSVUxFLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkgaW4KKyAqIHRhcmdldF9tb2R1bGUuIFByZXBhcmUgaXQgdG8gYWNjZXB0IGEgYm9keSBvciBhY3Rpb24gb3JpZ2luYXRpbmcgaW4KKyAqIHNyY19tb2R1bGUuCisgKi8KKworc3RhdGljIFJVTEUgKiBkZWZpbmVfcnVsZSggbW9kdWxlX3QgKiBzcmNfbW9kdWxlLCBPQkpFQ1QgKiBydWxlbmFtZSwKKyAgICBtb2R1bGVfdCAqIHRhcmdldF9tb2R1bGUgKQoreworICAgIFJVTEUgKiBjb25zdCByID0gZW50ZXJfcnVsZSggcnVsZW5hbWUsIHRhcmdldF9tb2R1bGUgKTsKKyAgICBpZiAoIHItPm1vZHVsZSAhPSBzcmNfbW9kdWxlICkKKyAgICB7CisgICAgICAgIC8qIElmIHRoZSBydWxlIHdhcyBpbXBvcnRlZCBmcm9tIGVsc2V3aGVyZSwgY2xlYXIgaXQgbm93LiAqLworICAgICAgICBzZXRfcnVsZV9ib2R5KCByLCAwICk7CisgICAgICAgIHNldF9ydWxlX2FjdGlvbnMoIHIsIDAgKTsKKyAgICAgICAgLyogciB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzb3VyY2UgbW9kdWxlLiAqLworICAgICAgICByLT5tb2R1bGUgPSBzcmNfbW9kdWxlOworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworCit2b2lkIHJ1bGVfZnJlZSggUlVMRSAqIHIgKQoreworICAgIG9iamVjdF9mcmVlKCByLT5uYW1lICk7CisgICAgci0+bmFtZSA9IDA7CisgICAgaWYgKCByLT5wcm9jZWR1cmUgKQorICAgICAgICBmdW5jdGlvbl9mcmVlKCByLT5wcm9jZWR1cmUgKTsKKyAgICByLT5wcm9jZWR1cmUgPSAwOworICAgIGlmICggci0+YWN0aW9ucyApCisgICAgICAgIGFjdGlvbnNfZnJlZSggci0+YWN0aW9ucyApOworICAgIHItPmFjdGlvbnMgPSAwOworfQorCisKKy8qCisgKiBiaW5kdGFyZ2V0KCkgLSByZXR1cm4gcG9pbnRlciB0byBUQVJHRVQsIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAqLworCitUQVJHRVQgKiBiaW5kdGFyZ2V0KCBPQkpFQ1QgKiBjb25zdCB0YXJnZXRfbmFtZSApCit7CisgICAgaW50IGZvdW5kOworICAgIFRBUkdFVCAqIHQ7CisKKyAgICBpZiAoICF0YXJnZXRoYXNoICkKKyAgICAgICAgdGFyZ2V0aGFzaCA9IGhhc2hpbml0KCBzaXplb2YoIFRBUkdFVCApLCAidGFyZ2V0cyIgKTsKKworICAgIHQgPSAoVEFSR0VUICopaGFzaF9pbnNlcnQoIHRhcmdldGhhc2gsIHRhcmdldF9uYW1lLCAmZm91bmQgKTsKKyAgICBpZiAoICFmb3VuZCApCisgICAgeworICAgICAgICBtZW1zZXQoIChjaGFyICopdCwgJ1wwJywgc2l6ZW9mKCAqdCApICk7CisgICAgICAgIHQtPm5hbWUgPSBvYmplY3RfY29weSggdGFyZ2V0X25hbWUgKTsKKyAgICAgICAgdC0+Ym91bmRuYW1lID0gb2JqZWN0X2NvcHkoIHQtPm5hbWUgKTsgIC8qIGRlZmF1bHQgZm9yIFRfRkxBR19OT1RGSUxFICovCisgICAgfQorCisgICAgcmV0dXJuIHQ7Cit9CisKKworc3RhdGljIHZvaWQgYmluZF9leHBsaWNpdGx5X2xvY2F0ZWRfdGFyZ2V0KCB2b2lkICogeHRhcmdldCwgdm9pZCAqIGRhdGEgKQoreworICAgIFRBUkdFVCAqIHQgPSAoVEFSR0VUICopeHRhcmdldDsKKyAgICBpZiAoICEoIHQtPmZsYWdzICYgVF9GTEFHX05PVEZJTEUgKSApCisgICAgeworICAgICAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhIHNldHRpbmcgZm9yIExPQ0FURS4gKi8KKyAgICAgICAgU0VUVElOR1MgKiBzID0gdC0+c2V0dGluZ3M7CisgICAgICAgIGZvciAoIDsgcyA7IHMgPSBzLT5uZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBvYmplY3RfZXF1YWwoIHMtPnN5bWJvbCwgY29uc3RhbnRfTE9DQVRFICkgJiYgISBsaXN0X2VtcHR5KCBzLT52YWx1ZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXRfZXhwbGljaXRfYmluZGluZyggdC0+bmFtZSwgbGlzdF9mcm9udCggcy0+dmFsdWUgKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgYmluZF9leHBsaWNpdGx5X2xvY2F0ZWRfdGFyZ2V0cygpCit7CisgICAgaWYgKCB0YXJnZXRoYXNoICkKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggdGFyZ2V0aGFzaCwgYmluZF9leHBsaWNpdGx5X2xvY2F0ZWRfdGFyZ2V0LCAodm9pZCAqKTAgKTsKK30KKworCisvKgorICogdG91Y2hfdGFyZ2V0KCkgLSBtYXJrIGEgdGFyZ2V0IHRvIHNpbXVsYXRlIGJlaW5nIG5ldy4KKyAqLworCit2b2lkIHRvdWNoX3RhcmdldCggT0JKRUNUICogY29uc3QgdCApCit7CisgICAgYmluZHRhcmdldCggdCApLT5mbGFncyB8PSBUX0ZMQUdfVE9VQ0hFRDsKK30KKworCisvKgorICogdGFyZ2V0X3NjYygpIC0gcmV0dXJucyB0aGUgcm9vdCBvZiBhIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnQgdGhhdCB0aGlzCisgKiB0YXJnZXQgaXMgYSBwYXJ0IG9mLgorICovCisKK1RBUkdFVCAqIHRhcmdldF9zY2MoIFRBUkdFVCAqIHQgKQoreworICAgIFRBUkdFVCAqIHJlc3VsdCA9IHQ7CisgICAgd2hpbGUgKCByZXN1bHQtPnNjY19yb290ICkKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0LT5zY2Nfcm9vdDsKKyAgICB3aGlsZSAoIHQtPnNjY19yb290ICkKKyAgICB7CisgICAgICAgIFRBUkdFVCAqIGNvbnN0IHRtcCA9IHQtPnNjY19yb290OworICAgICAgICB0LT5zY2Nfcm9vdCA9IHJlc3VsdDsKKyAgICAgICAgdCA9IHRtcDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogdGFyZ2V0bGlzdCgpIC0gdHVybiBsaXN0IG9mIHRhcmdldCBuYW1lcyBpbnRvIGEgVEFSR0VUIGNoYWluLgorICoKKyAqIElucHV0czoKKyAqICBjaGFpbiAgICBleGlzdGluZyBUQVJHRVRTIHRvIGFwcGVuZCB0bworICogIHRhcmdldHMgIGxpc3Qgb2YgdGFyZ2V0IG5hbWVzCisgKi8KKworVEFSR0VUUyAqIHRhcmdldGxpc3QoIFRBUkdFVFMgKiBjaGFpbiwgTElTVCAqIHRhcmdldF9uYW1lcyApCit7CisgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIHRhcmdldF9uYW1lcyApOworICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCB0YXJnZXRfbmFtZXMgKTsKKyAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyID0gbGlzdF9uZXh0KCBpdGVyICkgKQorICAgICAgICBjaGFpbiA9IHRhcmdldGVudHJ5KCBjaGFpbiwgYmluZHRhcmdldCggbGlzdF9pdGVtKCBpdGVyICkgKSApOworICAgIHJldHVybiBjaGFpbjsKK30KKworCisvKgorICogdGFyZ2V0ZW50cnkoKSAtIGFkZCBhIFRBUkdFVCB0byBhIGNoYWluIG9mIFRBUkdFVFMuCisgKgorICogSW5wdXRzOgorICogIGNoYWluICAgZXhpc3RpbmcgVEFSR0VUUyB0byBhcHBlbmQgdG8KKyAqICB0YXJnZXQgIG5ldyB0YXJnZXQgdG8gYXBwZW5kCisgKi8KKworVEFSR0VUUyAqIHRhcmdldGVudHJ5KCBUQVJHRVRTICogY2hhaW4sIFRBUkdFVCAqIHRhcmdldCApCit7CisgICAgVEFSR0VUUyAqIGNvbnN0IGMgPSAoVEFSR0VUUyAqKUJKQU1fTUFMTE9DKCBzaXplb2YoIFRBUkdFVFMgKSApOworICAgIGMtPnRhcmdldCA9IHRhcmdldDsKKworICAgIGlmICggIWNoYWluICkgY2hhaW4gPSBjOworICAgIGVsc2UgY2hhaW4tPnRhaWwtPm5leHQgPSBjOworICAgIGNoYWluLT50YWlsID0gYzsKKyAgICBjLT5uZXh0ID0gMDsKKworICAgIHJldHVybiBjaGFpbjsKK30KKworCisvKgorICogdGFyZ2V0Y2hhaW4oKSAtIGFwcGVuZCB0d28gVEFSR0VUIGNoYWlucy4KKyAqCisgKiBJbnB1dHM6CisgKiAgY2hhaW4gICBleGlzdGluZyBUQVJHRVRTIHRvIGFwcGVuZCB0bworICogIHRhcmdldCAgbmV3IHRhcmdldCB0byBhcHBlbmQKKyAqLworCitUQVJHRVRTICogdGFyZ2V0Y2hhaW4oIFRBUkdFVFMgKiBjaGFpbiwgVEFSR0VUUyAqIHRhcmdldHMgKQoreworICAgIGlmICggIXRhcmdldHMgKSByZXR1cm4gY2hhaW47CisgICAgaWYgKCAhY2hhaW4gKSByZXR1cm4gdGFyZ2V0czsKKworICAgIGNoYWluLT50YWlsLT5uZXh0ID0gdGFyZ2V0czsKKyAgICBjaGFpbi0+dGFpbCA9IHRhcmdldHMtPnRhaWw7CisgICAgcmV0dXJuIGNoYWluOworfQorCisvKgorICogYWN0aW9uX2ZyZWUgLSBkZWNyZW1lbnQgdGhlIEFDVElPTnMgcmVmcmVuY2UgY291bnQgYW5kIChtYXliZSkgZnJlZSBpdC4KKyAqLworCit2b2lkIGFjdGlvbl9mcmVlKCBBQ1RJT04gKiBhY3Rpb24gKQoreworICAgIGlmICggLS1hY3Rpb24tPnJlZnMgPT0gMCApCisgICAgeworICAgICAgICBmcmVldGFyZ2V0cyggYWN0aW9uLT50YXJnZXRzICk7CisgICAgICAgIGZyZWV0YXJnZXRzKCBhY3Rpb24tPnNvdXJjZXMgKTsKKyAgICAgICAgQkpBTV9GUkVFKCBhY3Rpb24gKTsKKyAgICB9Cit9CisKKworLyoKKyAqIGFjdGlvbmxpc3QoKSAtIGFwcGVuZCB0byBhbiBBQ1RJT04gY2hhaW4uCisgKi8KKworQUNUSU9OUyAqIGFjdGlvbmxpc3QoIEFDVElPTlMgKiBjaGFpbiwgQUNUSU9OICogYWN0aW9uICkKK3sKKyAgICBBQ1RJT05TICogY29uc3QgYWN0aW9ucyA9IChBQ1RJT05TICopQkpBTV9NQUxMT0MoIHNpemVvZiggQUNUSU9OUyApICk7CisgICAgYWN0aW9ucy0+YWN0aW9uID0gYWN0aW9uOworICAgICsrYWN0aW9uLT5yZWZzOworICAgIGlmICggIWNoYWluICkgY2hhaW4gPSBhY3Rpb25zOworICAgIGVsc2UgY2hhaW4tPnRhaWwtPm5leHQgPSBhY3Rpb25zOworICAgIGNoYWluLT50YWlsID0gYWN0aW9uczsKKyAgICBhY3Rpb25zLT5uZXh0ID0gMDsKKyAgICByZXR1cm4gY2hhaW47Cit9CisKK3N0YXRpYyBTRVRUSU5HUyAqIHNldHRpbmdzX2ZyZWVsaXN0OworCisKKy8qCisgKiBhZGRzZXR0aW5ncygpIC0gYWRkIGEgZGVmZXJyZWQgInNldCIgY29tbWFuZCB0byBhIHRhcmdldC4KKyAqCisgKiBBZGRzIGEgdmFyaWFibGUgc2V0dGluZyAodmFybmFtZT1saXN0KSBvbnRvIGEgY2hhaW4gb2Ygc2V0dGluZ3MgZm9yIGEKKyAqIHBhcnRpY3VsYXIgdGFyZ2V0LiAnZmxhZycgY29udHJvbHMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG5ldyBhbmQgb2xkCisgKiB2YWx1ZXMgaW4gdGhlIHNhbWUgd2F5IGFzIGluIHZhcl9zZXQoKSBmdW5jdGlvbiAoc2VlIHZhcmlhYmxlLmMpLiBSZXR1cm5zIHRoZQorICogaGVhZCBvZiB0aGUgc2V0dGluZ3MgY2hhaW4uCisgKi8KKworU0VUVElOR1MgKiBhZGRzZXR0aW5ncyggU0VUVElOR1MgKiBoZWFkLCBpbnQgZmxhZywgT0JKRUNUICogc3ltYm9sLAorICAgIExJU1QgKiB2YWx1ZSApCit7CisgICAgU0VUVElOR1MgKiB2OworCisgICAgLyogTG9vayBmb3IgcHJldmlvdXMgc2V0dGluZ3MuICovCisgICAgZm9yICggdiA9IGhlYWQ7IHY7IHYgPSB2LT5uZXh0ICkKKyAgICAgICAgaWYgKCBvYmplY3RfZXF1YWwoIHYtPnN5bWJvbCwgc3ltYm9sICkgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAvKiBJZiBub3QgcHJldmlvdXNseSBzZXQsIGFsbG9jIGEgbmV3LiAqLworICAgIC8qIElmIGFwcGVuZGluZywgZG8gc28uICovCisgICAgLyogRWxzZSBmcmVlIG9sZCBhbmQgc2V0IG5ldy4gKi8KKyAgICBpZiAoICF2ICkKKyAgICB7CisgICAgICAgIHYgPSBzZXR0aW5nc19mcmVlbGlzdDsKKyAgICAgICAgaWYgKCB2ICkKKyAgICAgICAgICAgIHNldHRpbmdzX2ZyZWVsaXN0ID0gdi0+bmV4dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdiA9IChTRVRUSU5HUyAqKUJKQU1fTUFMTE9DKCBzaXplb2YoICp2ICkgKTsKKworICAgICAgICB2LT5zeW1ib2wgPSBvYmplY3RfY29weSggc3ltYm9sICk7CisgICAgICAgIHYtPnZhbHVlID0gdmFsdWU7CisgICAgICAgIHYtPm5leHQgPSBoZWFkOworICAgICAgICBoZWFkID0gdjsKKyAgICB9CisgICAgZWxzZSBpZiAoIGZsYWcgPT0gVkFSX0FQUEVORCApCisgICAgeworICAgICAgICB2LT52YWx1ZSA9IGxpc3RfYXBwZW5kKCB2LT52YWx1ZSwgdmFsdWUgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGZsYWcgIT0gVkFSX0RFRkFVTFQgKQorICAgIHsKKyAgICAgICAgbGlzdF9mcmVlKCB2LT52YWx1ZSApOworICAgICAgICB2LT52YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGxpc3RfZnJlZSggdmFsdWUgKTsKKworICAgIC8qIFJldHVybiAobmV3KSBoZWFkIG9mIGxpc3QuICovCisgICAgcmV0dXJuIGhlYWQ7Cit9CisKKworLyoKKyAqIHB1c2hzZXR0aW5ncygpIC0gc2V0IGFsbCB0YXJnZXQgc3BlY2lmaWMgdmFyaWFibGVzLgorICovCisKK3ZvaWQgcHVzaHNldHRpbmdzKCBzdHJ1Y3QgbW9kdWxlX3QgKiBtb2R1bGUsIFNFVFRJTkdTICogdiApCit7CisgICAgZm9yICggOyB2OyB2ID0gdi0+bmV4dCApCisgICAgICAgIHYtPnZhbHVlID0gdmFyX3N3YXAoIG1vZHVsZSwgdi0+c3ltYm9sLCB2LT52YWx1ZSApOworfQorCisKKy8qCisgKiBwb3BzZXR0aW5ncygpIC0gcmVzZXQgdGFyZ2V0IHNwZWNpZmljIHZhcmlhYmxlcyB0byB0aGVpciBwcmUtcHVzaCB2YWx1ZXMuCisgKi8KKwordm9pZCBwb3BzZXR0aW5ncyggc3RydWN0IG1vZHVsZV90ICogbW9kdWxlLCBTRVRUSU5HUyAqIHYgKQoreworICAgIHB1c2hzZXR0aW5ncyggbW9kdWxlLCB2ICk7ICAvKiBqdXN0IHN3YXAgYWdhaW4gKi8KK30KKworCisvKgorICogY29weXNldHRpbmdzKCkgLSBkdXBsaWNhdGUgYSBzZXR0aW5ncyBsaXN0LCByZXR1cm5pbmcgdGhlIG5ldyBjb3B5LgorICovCisKK1NFVFRJTkdTICogY29weXNldHRpbmdzKCBTRVRUSU5HUyAqIGhlYWQgKQoreworICAgIFNFVFRJTkdTICogY29weSA9IDA7CisgICAgU0VUVElOR1MgKiB2OworICAgIGZvciAoIHYgPSBoZWFkOyB2OyB2ID0gdi0+bmV4dCApCisgICAgICAgIGNvcHkgPSBhZGRzZXR0aW5ncyggY29weSwgVkFSX1NFVCwgdi0+c3ltYm9sLCBsaXN0X2NvcHkoIHYtPnZhbHVlICkgKTsKKyAgICByZXR1cm4gY29weTsKK30KKworCisvKgorICogZnJlZXRhcmdldHMoKSAtIGRlbGV0ZSBhIHRhcmdldHMgbGlzdC4KKyAqLworCit2b2lkIGZyZWV0YXJnZXRzKCBUQVJHRVRTICogY2hhaW4gKQoreworICAgIHdoaWxlICggY2hhaW4gKQorICAgIHsKKyAgICAgICAgVEFSR0VUUyAqIGNvbnN0IG4gPSBjaGFpbi0+bmV4dDsKKyAgICAgICAgQkpBTV9GUkVFKCBjaGFpbiApOworICAgICAgICBjaGFpbiA9IG47CisgICAgfQorfQorCisKKy8qCisgKiBmcmVlYWN0aW9ucygpIC0gZGVsZXRlIGFuIGFjdGlvbiBsaXN0LgorICovCisKK3ZvaWQgZnJlZWFjdGlvbnMoIEFDVElPTlMgKiBjaGFpbiApCit7CisgICAgd2hpbGUgKCBjaGFpbiApCisgICAgeworICAgICAgICBBQ1RJT05TICogY29uc3QgbiA9IGNoYWluLT5uZXh0OworICAgICAgICBhY3Rpb25fZnJlZSggY2hhaW4tPmFjdGlvbiApOworICAgICAgICBCSkFNX0ZSRUUoIGNoYWluICk7CisgICAgICAgIGNoYWluID0gbjsKKyAgICB9Cit9CisKKworLyoKKyAqIGZyZWVzZXR0aW5ncygpIC0gZGVsZXRlIGEgc2V0dGluZ3MgbGlzdC4KKyAqLworCit2b2lkIGZyZWVzZXR0aW5ncyggU0VUVElOR1MgKiB2ICkKK3sKKyAgICB3aGlsZSAoIHYgKQorICAgIHsKKyAgICAgICAgU0VUVElOR1MgKiBjb25zdCBuID0gdi0+bmV4dDsKKyAgICAgICAgb2JqZWN0X2ZyZWUoIHYtPnN5bWJvbCApOworICAgICAgICBsaXN0X2ZyZWUoIHYtPnZhbHVlICk7CisgICAgICAgIHYtPm5leHQgPSBzZXR0aW5nc19mcmVlbGlzdDsKKyAgICAgICAgc2V0dGluZ3NfZnJlZWxpc3QgPSB2OworICAgICAgICB2ID0gbjsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgZnJlZXRhcmdldCggdm9pZCAqIHh0LCB2b2lkICogZGF0YSApCit7CisgICAgVEFSR0VUICogY29uc3QgdCA9IChUQVJHRVQgKil4dDsKKyAgICBpZiAoIHQtPm5hbWUgICAgICAgKSBvYmplY3RfZnJlZSAoIHQtPm5hbWUgICAgICAgKTsKKyAgICBpZiAoIHQtPmJvdW5kbmFtZSAgKSBvYmplY3RfZnJlZSAoIHQtPmJvdW5kbmFtZSAgKTsKKyAgICBpZiAoIHQtPnNldHRpbmdzICAgKSBmcmVlc2V0dGluZ3MoIHQtPnNldHRpbmdzICAgKTsKKyAgICBpZiAoIHQtPmRlcGVuZHMgICAgKSBmcmVldGFyZ2V0cyAoIHQtPmRlcGVuZHMgICAgKTsKKyAgICBpZiAoIHQtPmRlcGVuZGFudHMgKSBmcmVldGFyZ2V0cyAoIHQtPmRlcGVuZGFudHMgKTsKKyAgICBpZiAoIHQtPnBhcmVudHMgICAgKSBmcmVldGFyZ2V0cyAoIHQtPnBhcmVudHMgICAgKTsKKyAgICBpZiAoIHQtPmFjdGlvbnMgICAgKSBmcmVlYWN0aW9ucyAoIHQtPmFjdGlvbnMgICAgKTsKKyAgICBpZiAoIHQtPmluY2x1ZGVzICAgKQorICAgIHsKKyAgICAgICAgZnJlZXRhcmdldCggdC0+aW5jbHVkZXMsICh2b2lkICopMCApOworICAgICAgICBCSkFNX0ZSRUUoIHQtPmluY2x1ZGVzICk7CisgICAgfQorfQorCisKKy8qCisgKiBydWxlc19kb25lKCkgLSBmcmVlIFJVTEUgYW5kIFRBUkdFVCB0YWJsZXMuCisgKi8KKwordm9pZCBydWxlc19kb25lKCkKK3sKKyAgICBpZiAoIHRhcmdldGhhc2ggKQorICAgIHsKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggdGFyZ2V0aGFzaCwgZnJlZXRhcmdldCwgMCApOworICAgICAgICBoYXNoZG9uZSggdGFyZ2V0aGFzaCApOworICAgIH0KKyAgICB3aGlsZSAoIHNldHRpbmdzX2ZyZWVsaXN0ICkKKyAgICB7CisgICAgICAgIFNFVFRJTkdTICogY29uc3QgbiA9IHNldHRpbmdzX2ZyZWVsaXN0LT5uZXh0OworICAgICAgICBCSkFNX0ZSRUUoIHNldHRpbmdzX2ZyZWVsaXN0ICk7CisgICAgICAgIHNldHRpbmdzX2ZyZWVsaXN0ID0gbjsKKyAgICB9Cit9CisKKworLyoKKyAqIGFjdGlvbnNfcmVmZXIoKSAtIGFkZCBhIG5ldyByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIGFjdGlvbnMuCisgKi8KKwordm9pZCBhY3Rpb25zX3JlZmVyKCBydWxlX2FjdGlvbnMgKiBhICkKK3sKKyAgICArK2EtPnJlZmVyZW5jZV9jb3VudDsKK30KKworCisvKgorICogYWN0aW9uc19mcmVlKCkgLSByZWxlYXNlIGEgcmVmZXJlbmNlIHRvIGdpdmVuIGFjdGlvbnMuCisgKi8KKwordm9pZCBhY3Rpb25zX2ZyZWUoIHJ1bGVfYWN0aW9ucyAqIGEgKQoreworICAgIGlmICggLS1hLT5yZWZlcmVuY2VfY291bnQgPD0gMCApCisgICAgeworICAgICAgICBmdW5jdGlvbl9mcmVlKCBhLT5jb21tYW5kICk7CisgICAgICAgIGxpc3RfZnJlZSggYS0+YmluZGxpc3QgKTsKKyAgICAgICAgQkpBTV9GUkVFKCBhICk7CisgICAgfQorfQorCisKKy8qCisgKiBzZXRfcnVsZV9ib2R5KCkgLSBzZXQgdGhlIGFyZ3VtZW50IGxpc3QgYW5kIHByb2NlZHVyZSBvZiB0aGUgZ2l2ZW4gcnVsZS4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfcnVsZV9ib2R5KCBSVUxFICogcnVsZSwgRlVOQ1RJT04gKiBwcm9jZWR1cmUgKQoreworICAgIGlmICggcHJvY2VkdXJlICkKKyAgICAgICAgZnVuY3Rpb25fcmVmZXIoIHByb2NlZHVyZSApOworICAgIGlmICggcnVsZS0+cHJvY2VkdXJlICkKKyAgICAgICAgZnVuY3Rpb25fZnJlZSggcnVsZS0+cHJvY2VkdXJlICk7CisgICAgcnVsZS0+cHJvY2VkdXJlID0gcHJvY2VkdXJlOworfQorCisKKy8qCisgKiBnbG9iYWxfbmFtZSgpIC0gZ2l2ZW4gYSBydWxlLCByZXR1cm4gdGhlIG5hbWUgZm9yIGEgY29ycmVzcG9uZGluZyBydWxlIGluIHRoZQorICogZ2xvYmFsIG1vZHVsZS4KKyAqLworCitzdGF0aWMgT0JKRUNUICogZ2xvYmFsX3J1bGVfbmFtZSggUlVMRSAqIHIgKQoreworICAgIGlmICggci0+bW9kdWxlID09IHJvb3RfbW9kdWxlKCkgKQorICAgICAgICByZXR1cm4gb2JqZWN0X2NvcHkoIHItPm5hbWUgKTsKKworICAgIHsKKyAgICAgICAgY2hhciBuYW1lWyA0MDk2IF0gPSAiIjsKKyAgICAgICAgaWYgKCByLT5tb2R1bGUtPm5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJuY2F0KCBuYW1lLCBvYmplY3Rfc3RyKCByLT5tb2R1bGUtPm5hbWUgKSwgc2l6ZW9mKCBuYW1lICkgLSAxICk7CisgICAgICAgICAgICBzdHJuY2F0KCBuYW1lLCAiLiIsIHNpemVvZiggbmFtZSApIC0gMSApOworICAgICAgICB9CisgICAgICAgIHN0cm5jYXQoIG5hbWUsIG9iamVjdF9zdHIoIHItPm5hbWUgKSwgc2l6ZW9mKCBuYW1lICkgLSAxICk7CisgICAgICAgIHJldHVybiBvYmplY3RfbmV3KCBuYW1lICk7CisgICAgfQorfQorCisKKy8qCisgKiBnbG9iYWxfcnVsZSgpIC0gZ2l2ZW4gYSBydWxlLCBwcm9kdWNlIGEgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGUgZ2xvYmFsCisgKiBtb2R1bGUuCisgKi8KKworc3RhdGljIFJVTEUgKiBnbG9iYWxfcnVsZSggUlVMRSAqIHIgKQoreworICAgIGlmICggci0+bW9kdWxlID09IHJvb3RfbW9kdWxlKCkgKQorICAgICAgICByZXR1cm4gcjsKKworICAgIHsKKyAgICAgICAgT0JKRUNUICogY29uc3QgbmFtZSA9IGdsb2JhbF9ydWxlX25hbWUoIHIgKTsKKyAgICAgICAgUlVMRSAqIGNvbnN0IHJlc3VsdCA9IGRlZmluZV9ydWxlKCByLT5tb2R1bGUsIG5hbWUsIHJvb3RfbW9kdWxlKCkgKTsKKyAgICAgICAgb2JqZWN0X2ZyZWUoIG5hbWUgKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKKworLyoKKyAqIG5ld19ydWxlX2JvZHkoKSAtIG1ha2UgYSBuZXcgcnVsZSBuYW1lZCBydWxlbmFtZSBpbiB0aGUgZ2l2ZW4gbW9kdWxlLCB3aXRoCisgKiB0aGUgZ2l2ZW4gYXJndW1lbnQgbGlzdCBhbmQgcHJvY2VkdXJlLiBJZiBleHBvcnRlZCBpcyB0cnVlLCB0aGUgcnVsZSBpcworICogZXhwb3J0ZWQgdG8gdGhlIGdsb2JhbCBtb2R1bGUgYXMgbW9kdWxlbmFtZS5ydWxlbmFtZS4KKyAqLworCitSVUxFICogbmV3X3J1bGVfYm9keSggbW9kdWxlX3QgKiBtLCBPQkpFQ1QgKiBydWxlbmFtZSwgRlVOQ1RJT04gKiBwcm9jZWR1cmUsCisgICAgaW50IGV4cG9ydGVkICkKK3sKKyAgICBSVUxFICogY29uc3QgbG9jYWwgPSBkZWZpbmVfcnVsZSggbSwgcnVsZW5hbWUsIG0gKTsKKyAgICBsb2NhbC0+ZXhwb3J0ZWQgPSBleHBvcnRlZDsKKyAgICBzZXRfcnVsZV9ib2R5KCBsb2NhbCwgcHJvY2VkdXJlICk7CisKKyAgICAvKiBNYXJrIHRoZSBwcm9jZWR1cmUgd2l0aCB0aGUgZ2xvYmFsIHJ1bGUgbmFtZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZQorICAgICAqIHJ1bGUgaXMgZXhwb3J0ZWQuIFRoYXQgZ2l2ZXMgdXMgc29tZXRoaW5nIHJlYXNvbmFibHkgaWRlbnRpZmlhYmxlIHRoYXQgd2UKKyAgICAgKiBjYW4gdXNlLCBlLmcuIGluIHByb2ZpbGluZyBvdXRwdXQuIE9ubHkgZG8gdGhpcyBvbmNlLCBzaW5jZSB0aGlzIGNvdWxkIGJlCisgICAgICogY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgcHJvY2VkdXJlLgorICAgICAqLworICAgIGlmICggIWZ1bmN0aW9uX3J1bGVuYW1lKCBwcm9jZWR1cmUgKSApCisgICAgICAgIGZ1bmN0aW9uX3NldF9ydWxlbmFtZSggcHJvY2VkdXJlLCBnbG9iYWxfcnVsZV9uYW1lKCBsb2NhbCApICk7CisKKyAgICByZXR1cm4gbG9jYWw7Cit9CisKKworc3RhdGljIHZvaWQgc2V0X3J1bGVfYWN0aW9ucyggUlVMRSAqIHJ1bGUsIHJ1bGVfYWN0aW9ucyAqIGFjdGlvbnMgKQoreworICAgIGlmICggYWN0aW9ucyApCisgICAgICAgIGFjdGlvbnNfcmVmZXIoIGFjdGlvbnMgKTsKKyAgICBpZiAoIHJ1bGUtPmFjdGlvbnMgKQorICAgICAgICBhY3Rpb25zX2ZyZWUoIHJ1bGUtPmFjdGlvbnMgKTsKKyAgICBydWxlLT5hY3Rpb25zID0gYWN0aW9uczsKK30KKworCitzdGF0aWMgcnVsZV9hY3Rpb25zICogYWN0aW9uc19uZXcoIEZVTkNUSU9OICogY29tbWFuZCwgTElTVCAqIGJpbmRsaXN0LAorICAgIGludCBmbGFncyApCit7CisgICAgcnVsZV9hY3Rpb25zICogY29uc3QgcmVzdWx0ID0gKHJ1bGVfYWN0aW9ucyAqKUJKQU1fTUFMTE9DKCBzaXplb2YoCisgICAgICAgIHJ1bGVfYWN0aW9ucyApICk7CisgICAgZnVuY3Rpb25fcmVmZXIoIGNvbW1hbmQgKTsKKyAgICByZXN1bHQtPmNvbW1hbmQgPSBjb21tYW5kOworICAgIHJlc3VsdC0+YmluZGxpc3QgPSBiaW5kbGlzdDsKKyAgICByZXN1bHQtPmZsYWdzID0gZmxhZ3M7CisgICAgcmVzdWx0LT5yZWZlcmVuY2VfY291bnQgPSAwOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworUlVMRSAqIG5ld19ydWxlX2FjdGlvbnMoIG1vZHVsZV90ICogbSwgT0JKRUNUICogcnVsZW5hbWUsIEZVTkNUSU9OICogY29tbWFuZCwKKyAgICBMSVNUICogYmluZGxpc3QsIGludCBmbGFncyApCit7CisgICAgUlVMRSAqIGNvbnN0IGxvY2FsID0gZGVmaW5lX3J1bGUoIG0sIHJ1bGVuYW1lLCBtICk7CisgICAgUlVMRSAqIGNvbnN0IGdsb2JhbCA9IGdsb2JhbF9ydWxlKCBsb2NhbCApOworICAgIHNldF9ydWxlX2FjdGlvbnMoIGxvY2FsLCBhY3Rpb25zX25ldyggY29tbWFuZCwgYmluZGxpc3QsIGZsYWdzICkgKTsKKyAgICBzZXRfcnVsZV9hY3Rpb25zKCBnbG9iYWwsIGxvY2FsLT5hY3Rpb25zICk7CisgICAgcmV0dXJuIGxvY2FsOworfQorCisKKy8qCisgKiBMb29rcyBmb3IgYSBydWxlIGluIHRoZSBzcGVjaWZpZWQgbW9kdWxlLCBhbmQgcmV0dXJucyBpdCwgaWYgZm91bmQuIEZpcnN0CisgKiBjaGVja3MgaWYgdGhlIHJ1bGUgaXMgcHJlc2VudCBpbiB0aGUgbW9kdWxlJ3MgcnVsZSB0YWJsZS4gU2Vjb25kLCBpZiB0aGUKKyAqIHJ1bGUncyBuYW1lIGlzIGluIHRoZSBmb3JtIG5hbWUxLm5hbWUyIGFuZCBuYW1lMSBpcyBpbiB0aGUgbGlzdCBvZiBpbXBvcnRlZAorICogbW9kdWxlcywgbG9vayBpbiBtb2R1bGUgJ25hbWUxJyBmb3IgcnVsZSAnbmFtZTInLgorICovCisKK1JVTEUgKiBsb29rdXBfcnVsZSggT0JKRUNUICogcnVsZW5hbWUsIG1vZHVsZV90ICogbSwgaW50IGxvY2FsX29ubHkgKQoreworICAgIFJVTEUgICAgICogcjsKKyAgICBSVUxFICAgICAqIHJlc3VsdCA9IDA7CisgICAgbW9kdWxlX3QgKiBvcmlnaW5hbF9tb2R1bGUgPSBtOworCisgICAgaWYgKCBtLT5jbGFzc19tb2R1bGUgKQorICAgICAgICBtID0gbS0+Y2xhc3NfbW9kdWxlOworCisgICAgaWYgKCBtLT5ydWxlcyAmJiAoIHIgPSAoUlVMRSAqKWhhc2hfZmluZCggbS0+cnVsZXMsIHJ1bGVuYW1lICkgKSApCisgICAgICAgIHJlc3VsdCA9IHI7CisgICAgZWxzZSBpZiAoICFsb2NhbF9vbmx5ICYmIG0tPmltcG9ydGVkX21vZHVsZXMgKQorICAgIHsKKyAgICAgICAgLyogVHJ5IHNwbGl0dGluZyB0aGUgbmFtZSBpbnRvIG1vZHVsZSBhbmQgcnVsZS4gKi8KKyAgICAgICAgY2hhciAqIHAgPSBzdHJjaHIoIG9iamVjdF9zdHIoIHJ1bGVuYW1lICksICcuJyApIDsKKyAgICAgICAgaWYgKCBwICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTm93LCByLT5uYW1lIGtlZXBzIHRoZSBtb2R1bGUgbmFtZSwgYW5kIHAgKyAxIGtlZXBzIHRoZSBydWxlCisgICAgICAgICAgICAgKiBuYW1lLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBPQkpFQ1QgKiBydWxlX3BhcnQgPSBvYmplY3RfbmV3KCBwICsgMSApOworICAgICAgICAgICAgT0JKRUNUICogbW9kdWxlX3BhcnQ7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGJ1ZlsgMSBdOworICAgICAgICAgICAgICAgIHN0cmluZ19uZXcoIGJ1ZiApOworICAgICAgICAgICAgICAgIHN0cmluZ19hcHBlbmRfcmFuZ2UoIGJ1Ziwgb2JqZWN0X3N0ciggcnVsZW5hbWUgKSwgcCApOworICAgICAgICAgICAgICAgIG1vZHVsZV9wYXJ0ID0gb2JqZWN0X25ldyggYnVmLT52YWx1ZSApOworICAgICAgICAgICAgICAgIHN0cmluZ19mcmVlKCBidWYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggaGFzaF9maW5kKCBtLT5pbXBvcnRlZF9tb2R1bGVzLCBtb2R1bGVfcGFydCApICkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsb29rdXBfcnVsZSggcnVsZV9wYXJ0LCBiaW5kbW9kdWxlKCBtb2R1bGVfcGFydCApLCAxICk7CisgICAgICAgICAgICBvYmplY3RfZnJlZSggbW9kdWxlX3BhcnQgKTsKKyAgICAgICAgICAgIG9iamVjdF9mcmVlKCBydWxlX3BhcnQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggcmVzdWx0ICkKKyAgICB7CisgICAgICAgIGlmICggbG9jYWxfb25seSAmJiAhcmVzdWx0LT5leHBvcnRlZCApCisgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICBlbHNlIGlmICggb3JpZ2luYWxfbW9kdWxlICE9IG0gKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBMb29rdXAgc3RhcnRlZCBpbiBjbGFzcyBtb2R1bGUuIFdlIGhhdmUgZm91bmQgYSBydWxlIGluIGNsYXNzCisgICAgICAgICAgICAgKiBtb2R1bGUsIHdoaWNoIGlzIG1hcmtlZCBmb3IgZXhlY3V0aW9uIGluIHRoYXQgbW9kdWxlLCBvciBpbiBzb21lCisgICAgICAgICAgICAgKiBpbnN0YW5jZS4gTWFyayBpdCBmb3IgZXhlY3V0aW9uIGluIHRoZSBpbnN0YW5jZSB3aGVyZSB3ZSBzdGFydGVkCisgICAgICAgICAgICAgKiB0aGUgbG9va3VwLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgY29uc3QgZXhlY3V0ZV9pbl9jbGFzcyA9IHJlc3VsdC0+bW9kdWxlID09IG07CisgICAgICAgICAgICBpbnQgY29uc3QgZXhlY3V0ZV9pbl9zb21lX2luc3RhbmNlID0KKyAgICAgICAgICAgICAgICByZXN1bHQtPm1vZHVsZS0+Y2xhc3NfbW9kdWxlID09IG07CisgICAgICAgICAgICBpZiAoIGV4ZWN1dGVfaW5fY2xhc3MgfHwgZXhlY3V0ZV9pbl9zb21lX2luc3RhbmNlICkKKyAgICAgICAgICAgICAgICByZXN1bHQtPm1vZHVsZSA9IG9yaWdpbmFsX21vZHVsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworUlVMRSAqIGJpbmRydWxlKCBPQkpFQ1QgKiBydWxlbmFtZSwgbW9kdWxlX3QgKiBtICkKK3sKKyAgICBSVUxFICogcmVzdWx0ID0gbG9va3VwX3J1bGUoIHJ1bGVuYW1lLCBtLCAwICk7CisgICAgaWYgKCAhcmVzdWx0ICkKKyAgICAgICAgcmVzdWx0ID0gbG9va3VwX3J1bGUoIHJ1bGVuYW1lLCByb290X21vZHVsZSgpLCAwICk7CisgICAgLyogV2UgaGF2ZSBvbmx5IG9uZSBjYWxsZXIsICdldmFsdWF0ZV9ydWxlJywgd2hpY2ggd2lsbCBjb21wbGFpbiBhYm91dAorICAgICAqIGNhbGxpbmcgYW4gdW5kZWZpbmVkIHJ1bGUuIFdlIGNvdWxkIGlzc3VlIHRoZSBlcnJvciBoZXJlLCBidXQgd2UgZG8gbm90CisgICAgICogaGF2ZSB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLCBzdWNoIGFzIGZyYW1lLgorICAgICAqLworICAgIGlmICggIXJlc3VsdCApCisgICAgICAgIHJlc3VsdCA9IGVudGVyX3J1bGUoIHJ1bGVuYW1lLCBtICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitSVUxFICogaW1wb3J0X3J1bGUoIFJVTEUgKiBzb3VyY2UsIG1vZHVsZV90ICogbSwgT0JKRUNUICogbmFtZSApCit7CisgICAgUlVMRSAqIGNvbnN0IGRlc3QgPSBkZWZpbmVfcnVsZSggc291cmNlLT5tb2R1bGUsIG5hbWUsIG0gKTsKKyAgICBzZXRfcnVsZV9ib2R5KCBkZXN0LCBzb3VyY2UtPnByb2NlZHVyZSApOworICAgIHNldF9ydWxlX2FjdGlvbnMoIGRlc3QsIHNvdXJjZS0+YWN0aW9ucyApOworICAgIHJldHVybiBkZXN0OworfQorCisKK3ZvaWQgcnVsZV9sb2NhbGl6ZSggUlVMRSAqIHJ1bGUsIG1vZHVsZV90ICogbSApCit7CisgICAgcnVsZS0+bW9kdWxlID0gbTsKKyAgICBpZiAoIHJ1bGUtPnByb2NlZHVyZSApCisgICAgeworICAgICAgICBGVU5DVElPTiAqIHByb2NlZHVyZSA9IGZ1bmN0aW9uX3VuYmluZF92YXJpYWJsZXMoIHJ1bGUtPnByb2NlZHVyZSApOworICAgICAgICBmdW5jdGlvbl9yZWZlciggcHJvY2VkdXJlICk7CisgICAgICAgIGZ1bmN0aW9uX2ZyZWUoIHJ1bGUtPnByb2NlZHVyZSApOworICAgICAgICBydWxlLT5wcm9jZWR1cmUgPSBwcm9jZWR1cmU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvcnVsZXMuaCBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3J1bGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyNzkyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3J1bGVzLmgKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NSBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qICBUaGlzIGZpbGUgaXMgQUxTTzoKKyAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IERhdmlkIEFicmFoYW1zLgorICogIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworLyoKKyAqIHJ1bGVzLmggLSAgdGFyZ2V0cywgcnVsZXMsIGFuZCByZWxhdGVkIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlcyBob2xkaW5nIHRoZSB0YXJnZXRzLCBydWxlcywgYW5kIHJlbGF0ZWQKKyAqIGluZm9ybWF0aW9uIGFjY3VtdWxhdGVkIGJ5IGludGVycHJldGluZyB0aGUgc3RhdGVtZW50cyBvZiB0aGUgamFtIGZpbGVzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIGRlZmluZWQ6CisgKgorICogIFJVTEUgLSBhIGdlbmVyaWMgamFtIHJ1bGUsIHRoZSBwcm9kdWN0IG9mIFJVTEUgYW5kIEFDVElPTlMuCisgKiAgQUNUSU9OUyAtIGEgY2hhaW4gb2YgQUNUSU9Ocy4KKyAqICBBQ1RJT04gLSBhIFJVTEUgaW5zdGFuY2Ugd2l0aCB0YXJnZXRzIGFuZCBzb3VyY2VzLgorICogIFNFVFRJTkdTIC0gdmFyaWFibGVzIHRvIHNldCB3aGVuIGV4ZWN1dGluZyBhIFRBUkdFVCdzIEFDVElPTlMuCisgKiAgVEFSR0VUUyAtIGEgY2hhaW4gb2YgVEFSR0VUcy4KKyAqICBUQVJHRVQgLSBhbiBlbnRpdHkgKGUuZy4gYSBmaWxlKSB0aGF0IGNhbiBiZSBidWlsdC4KKyAqLworCisjaWZuZGVmIFJVTEVTX0RXQV8yMDAxMTAyMF9ICisjZGVmaW5lIFJVTEVTX0RXQV8yMDAxMTAyMF9ICisKKyNpbmNsdWRlICJmdW5jdGlvbi5oIgorI2luY2x1ZGUgIm1vZHVsZXMuaCIKKyNpbmNsdWRlICJ0aW1lc3RhbXAuaCIKKworCit0eXBlZGVmIHN0cnVjdCBfcnVsZSBSVUxFOwordHlwZWRlZiBzdHJ1Y3QgX3RhcmdldCBUQVJHRVQ7Cit0eXBlZGVmIHN0cnVjdCBfdGFyZ2V0cyBUQVJHRVRTOwordHlwZWRlZiBzdHJ1Y3QgX2FjdGlvbiBBQ1RJT047Cit0eXBlZGVmIHN0cnVjdCBfYWN0aW9ucyBBQ1RJT05TOwordHlwZWRlZiBzdHJ1Y3QgX3NldHRpbmdzIFNFVFRJTkdTIDsKKworLyogUlVMRSAtIGEgZ2VuZXJpYyBqYW0gcnVsZSwgdGhlIHByb2R1Y3Qgb2YgUlVMRSBhbmQgQUNUSU9OUy4gKi8KKworLyogQnVpbGQgYWN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIGEgcnVsZS4gKi8KK3N0cnVjdCBydWxlX2FjdGlvbnMKK3sKKyAgICBpbnQgICAgICAgIHJlZmVyZW5jZV9jb3VudDsKKyAgICBGVU5DVElPTiAqIGNvbW1hbmQ7ICAgICAgICAgIC8qIGNvbW1hbmQgc3RyaW5nIGZyb20gQUNUSU9OUyAqLworICAgIExJU1QgICAgICogYmluZGxpc3Q7CisgICAgaW50ICAgICAgICBmbGFnczsgICAgICAgICAgICAvKiBtb2RpZmllcnMgb24gQUNUSU9OUyAqLworCisjZGVmaW5lIFJVTEVfTkVXU1JDUyAgIDB4MDEgIC8qICQoPikgaXMgdXBkYXRlZCBzb3VyY2VzIG9ubHkgKi8KKyNkZWZpbmUgUlVMRV9UT0dFVEhFUiAgMHgwMiAgLyogY29tYmluZSBhY3Rpb25zIG9uIHNpbmdsZSB0YXJnZXQgKi8KKyNkZWZpbmUgUlVMRV9JR05PUkUgICAgMHgwNCAgLyogaWdub3JlIHJldHVybiBzdGF0dXMgb2YgZXhlY3V0ZXMgKi8KKyNkZWZpbmUgUlVMRV9RVUlFVExZICAgMHgwOCAgLyogZG8gbm90IG1lbnRpb24gaXQgdW5sZXNzIHZlcmJvc2UgKi8KKyNkZWZpbmUgUlVMRV9QSUVDRU1FQUwgMHgxMCAgLyogc3BsaXQgZXhlYyBzbyBlYWNoICQoPikgaXMgc21hbGwgKi8KKyNkZWZpbmUgUlVMRV9FWElTVElORyAgMHgyMCAgLyogJCg+KSBpcyBwcmUtZXhpc2l0bmcgc291cmNlcyBvbmx5ICovCit9OworCit0eXBlZGVmIHN0cnVjdCBydWxlX2FjdGlvbnMgcnVsZV9hY3Rpb25zOwordHlwZWRlZiBzdHJ1Y3QgYXJndW1lbnRfbGlzdCBhcmd1bWVudF9saXN0OworCitzdHJ1Y3QgX3J1bGUKK3sKKyAgICBPQkpFQ1QgICAgICAgICogbmFtZTsKKyAgICBGVU5DVElPTiAgICAgICogcHJvY2VkdXJlOworICAgIHJ1bGVfYWN0aW9ucyAgKiBhY3Rpb25zOyAgICAvKiBidWlsZCBhY3Rpb25zLCBvciBOVUxMIGZvciBubyBhY3Rpb25zICovCisgICAgbW9kdWxlX3QgICAgICAqIG1vZHVsZTsgICAgIC8qIG1vZHVsZSBpbiB3aGljaCB0aGlzIHJ1bGUgaXMgZXhlY3V0ZWQgKi8KKyAgICBpbnQgICAgICAgICAgICAgZXhwb3J0ZWQ7ICAgLyogbm9uemVybyBpZiB0aGlzIHJ1bGUgaXMgc3VwcG9zZWQgdG8gYXBwZWFyIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBnbG9iYWwgbW9kdWxlIGFuZCBiZSBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGltcG9ydGVkIGludG8gb3RoZXIgbW9kdWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKKy8qIEFDVElPTlMgLSBhIGNoYWluIG9mIEFDVElPTnMuICovCitzdHJ1Y3QgX2FjdGlvbnMKK3sKKyAgICBBQ1RJT05TICogbmV4dDsKKyAgICBBQ1RJT05TICogdGFpbDsgICAgICAgICAgIC8qIHZhbGlkIG9ubHkgZm9yIGhlYWQgKi8KKyAgICBBQ1RJT04gICogYWN0aW9uOworfTsKKworLyogQUNUSU9OIC0gYSBSVUxFIGluc3RhbmNlIHdpdGggdGFyZ2V0cyBhbmQgc291cmNlcy4gKi8KK3N0cnVjdCBfYWN0aW9uCit7CisgICAgUlVMRSAgICAqIHJ1bGU7CisgICAgVEFSR0VUUyAqIHRhcmdldHM7CisgICAgVEFSR0VUUyAqIHNvdXJjZXM7ICAgICAgICAvKiBha2EgJCg+KSAqLworICAgIGNoYXIgICAgICBydW5uaW5nOyAgICAgICAgLyogaGFzIGJlZW4gc3RhcnRlZCAqLworI2RlZmluZSBBX0lOSVQgICAgICAgICAgIDAKKyNkZWZpbmUgQV9SVU5OSU5HX05PRVhFQyAxCisjZGVmaW5lIEFfUlVOTklORyAgICAgICAgMgorICAgIGNoYXIgICAgICBzdGF0dXM7ICAgICAgICAgLyogc2VlIFRBUkdFVCBzdGF0dXMgKi8KKyAgICBpbnQgICAgICAgcmVmczsKK307CisKKy8qIFNFVFRJTkdTIC0gdmFyaWFibGVzIHRvIHNldCB3aGVuIGV4ZWN1dGluZyBhIFRBUkdFVCdzIEFDVElPTlMuICovCitzdHJ1Y3QgX3NldHRpbmdzCit7CisgICAgU0VUVElOR1MgKiBuZXh0OworICAgIE9CSkVDVCAgICogc3ltYm9sOyAgICAgICAgLyogc3ltYm9sIG5hbWUgZm9yIHZhcl9zZXQoKSAqLworICAgIExJU1QgICAgICogdmFsdWU7ICAgICAgICAgLyogc3ltYm9sIHZhbHVlIGZvciB2YXJfc2V0KCkgKi8KK307CisKKy8qIFRBUkdFVFMgLSBhIGNoYWluIG9mIFRBUkdFVHMuICovCitzdHJ1Y3QgX3RhcmdldHMKK3sKKyAgICBUQVJHRVRTICogbmV4dDsKKyAgICBUQVJHRVRTICogdGFpbDsgICAgICAgICAgIC8qIHZhbGlkIG9ubHkgZm9yIGhlYWQgKi8KKyAgICBUQVJHRVQgICogdGFyZ2V0OworfTsKKworLyogVEFSR0VUIC0gYW4gZW50aXR5IChlLmcuIGEgZmlsZSkgdGhhdCBjYW4gYmUgYnVpbHQuICovCitzdHJ1Y3QgX3RhcmdldAoreworICAgIE9CSkVDVCAgICogbmFtZTsKKyAgICBPQkpFQ1QgICAqIGJvdW5kbmFtZTsgICAgICAgICAgICAgLyogaWYgc2VhcmNoKCkgcmVsb2NhdGVzIHRhcmdldCAqLworICAgIEFDVElPTlMgICogYWN0aW9uczsgICAgICAgICAgICAgICAvKiBydWxlcyB0byBleGVjdXRlLCBpZiBhbnkgKi8KKyAgICBTRVRUSU5HUyAqIHNldHRpbmdzOyAgICAgICAgICAgICAgLyogdmFyaWFibGVzIHRvIGRlZmluZSAqLworCisgICAgc2hvcnQgICAgICBmbGFnczsgICAgICAgICAgICAgICAgIC8qIHN0YXR1cyBpbmZvICovCisKKyNkZWZpbmUgVF9GTEFHX1RFTVAgICAgICAgICAgIDB4MDAwMSAgLyogVEVNUE9SQVJZIGFwcGxpZWQgKi8KKyNkZWZpbmUgVF9GTEFHX05PQ0FSRSAgICAgICAgIDB4MDAwMiAgLyogTk9DQVJFIGFwcGxpZWQgKi8KKyNkZWZpbmUgVF9GTEFHX05PVEZJTEUgICAgICAgIDB4MDAwNCAgLyogTk9URklMRSBhcHBsaWVkICovCisjZGVmaW5lIFRfRkxBR19UT1VDSEVEICAgICAgICAweDAwMDggIC8qIEFMV0FZUyBhcHBsaWVkIG9yIC10IHRhcmdldCAqLworI2RlZmluZSBUX0ZMQUdfTEVBVkVTICAgICAgICAgMHgwMDEwICAvKiBMRUFWRVMgYXBwbGllZCAqLworI2RlZmluZSBUX0ZMQUdfTk9VUERBVEUgICAgICAgMHgwMDIwICAvKiBOT1VQREFURSBhcHBsaWVkICovCisjZGVmaW5lIFRfRkxBR19WSVNJVEVEICAgICAgICAweDAwNDAgIC8qIENXTTogVXNlZCBpbiBkZWJ1Z2dpbmcgKi8KKworLyogVGhpcyBmbGFnIGhhcyBiZWVuIGFkZGVkIHRvIHN1cHBvcnQgYSBuZXcgYnVpbHQtaW4gcnVsZSBuYW1lZCAiUk1CQUQiLiBJdCBpcworICogdXNlZCB0byBmb3JjZSByZW1vdmFsIG9mIG91dGRhdGVkIHRhcmdldHMgd2hvc2UgZGVwZW5kZW5jaWVzIGZhaWwgdG8gYnVpbGQuCisgKi8KKyNkZWZpbmUgVF9GTEFHX1JNT0xEICAgICAgICAgIDB4MDA4MCAgLyogUk1CQUQgYXBwbGllZCAqLworCisvKiBUaGlzIGZsYWcgd2FzIGFkZGVkIHRvIHN1cHBvcnQgYSBuZXcgYnVpbHQtaW4gcnVsZSBuYW1lZCAiRkFJTF9FWFBFQ1RFRCIgdXNlZAorICogdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSBnaXZlbiBhY3Rpb24gc2hvdWxkIGJlIGludmVydGVkLAorICogaS5lLiBvayA8PT4gZmFpbC4gVXNlZnVsIGZvciBsYXVuY2hpbmcgY2VydGFpbiB0ZXN0IHJ1bnMgZnJvbSBhIEphbWZpbGUuCisgKi8KKyNkZWZpbmUgVF9GTEFHX0ZBSUxfRVhQRUNURUQgIDB4MDEwMCAgLyogRkFJTF9FWFBFQ1RFRCBhcHBsaWVkICovCisKKyNkZWZpbmUgVF9GTEFHX0lOVEVSTkFMICAgICAgIDB4MDIwMCAgLyogaW50ZXJuYWwgSU5DTFVERVMgbm9kZSAqLworCisvKiBJbmRpY2F0ZXMgdGhhdCB0aGUgdGFyZ2V0IG11c3QgYmUgYSBmaWxlLiBQcmV2ZW50cyBtYXRjaGluZyBub24tZmlsZXMsIGxpa2UKKyAqIGRpcmVjdG9yaWVzLCB3aGVuIGEgdGFyZ2V0IGlzIHNlYXJjaGVkLgorICovCisjZGVmaW5lIFRfRkxBR19JU0ZJTEUgICAgICAgICAweDA0MDAKKworI2RlZmluZSBUX0ZMQUdfUFJFQ0lPVVMgICAgICAgMHgwODAwCisKKyAgICBjaGFyICAgICAgIGJpbmRpbmc7ICAgICAgICAgICAgICAgLyogaG93IHRhcmdldCByZWxhdGVzIHRvIGEgcmVhbCBmaWxlIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvbGRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBUX0JJTkRfVU5CT1VORCAgICAgICAgMCAgICAgICAvKiBhIGRpc2VtYm9kaWVkIG5hbWUgKi8KKyNkZWZpbmUgVF9CSU5EX01JU1NJTkcgICAgICAgIDEgICAgICAgLyogY291bGQgbm90IGZpbmQgcmVhbCBmaWxlICovCisjZGVmaW5lIFRfQklORF9QQVJFTlRTICAgICAgICAyICAgICAgIC8qIHVzaW5nIHBhcmVudCdzIHRpbWVzdGFtcCAqLworI2RlZmluZSBUX0JJTkRfRVhJU1RTICAgICAgICAgMyAgICAgICAvKiByZWFsIGZpbGUsIHRpbWVzdGFtcCB2YWxpZCAqLworCisgICAgVEFSR0VUUyAgKiBkZXBlbmRzOyAgICAgICAgICAgICAgIC8qIGRlcGVuZGVuY2llcyAqLworICAgIFRBUkdFVFMgICogZGVwZW5kYW50czsgICAgICAgICAgICAvKiB0aGUgaW52ZXJzZSBvZiBkZXBlbmRlbmNpZXMgKi8KKyAgICBUQVJHRVRTICAqIHJlYnVpbGRzOyAgICAgICAgICAgICAgLyogdGFyZ2V0cyB0aGF0IHNob3VsZCBiZSBmb3JjZS1yZWJ1aWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZW5ldmVyIHRoaXMgb25lIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFRBUkdFVCAgICogaW5jbHVkZXM7ICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBpbmNsdWRlcyBub2RlICovCisgICAgVEFSR0VUICAgKiBvcmlnaW5hbF90YXJnZXQ7ICAgICAgIC8qIG9yaWdpbmFsX3RhcmdldC0+aW5jbHVkZXMgPSB0aGlzICovCisgICAgY2hhciAgICAgICByZXNjYW5uZWQ7CisKKyAgICB0aW1lc3RhbXAgIHRpbWU7ICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRpbWUgKi8KKyAgICB0aW1lc3RhbXAgIGxlYWY7ICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRpbWUgb2YgbGVhZiBzb3VyY2VzICovCisKKyAgICBjaGFyICAgICAgIGZhdGU7ICAgICAgICAgICAgICAgICAgLyogbWFrZTAoKSdzIGRpYWdub3NpcyAqLworCisjZGVmaW5lIFRfRkFURV9JTklUICAgICAgICAgICAwICAgICAgIC8qIG5vdGhpbmcgZG9uZSB0byB0YXJnZXQgKi8KKyNkZWZpbmUgVF9GQVRFX01BS0lORyAgICAgICAgIDEgICAgICAgLyogbWFrZTAodGFyZ2V0KSBvbiBzdGFjayAqLworCisjZGVmaW5lIFRfRkFURV9TVEFCTEUgICAgICAgICAyICAgICAgIC8qIHRhcmdldCBkaWQgbm90IG5lZWQgdXBkYXRpbmcgKi8KKyNkZWZpbmUgVF9GQVRFX05FV0VSICAgICAgICAgIDMgICAgICAgLyogdGFyZ2V0IG5ld2VyIHRoYW4gcGFyZW50ICovCisKKyNkZWZpbmUgVF9GQVRFX1NQT0lMICAgICAgICAgIDQgICAgICAgLyogPj0gU1BPSUwgcmVidWlsZHMgcGFyZW50cyAqLworI2RlZmluZSBUX0ZBVEVfSVNUTVAgICAgICAgICAgNCAgICAgICAvKiB1bm5lZWRlZCB0ZW1wIHRhcmdldCBvZGRseSBwcmVzZW50ICovCisKKyNkZWZpbmUgVF9GQVRFX0JVSUxEICAgICAgICAgIDUgICAgICAgLyogPj0gQlVJTEQgcmVidWlsZHMgdGFyZ2V0ICovCisjZGVmaW5lIFRfRkFURV9UT1VDSEVEICAgICAgICA1ICAgICAgIC8qIG1hbnVhbGx5IHRvdWNoZWQgd2l0aCAtdCAqLworI2RlZmluZSBUX0ZBVEVfUkVCVUlMRCAgICAgICAgNgorI2RlZmluZSBUX0ZBVEVfTUlTU0lORyAgICAgICAgNyAgICAgICAvKiBpcyBtaXNzaW5nLCBuZWVkcyB1cGRhdGluZyAqLworI2RlZmluZSBUX0ZBVEVfTkVFRFRNUCAgICAgICAgOCAgICAgICAvKiBtaXNzaW5nIHRlbXAgdGhhdCBtdXN0IGJlIHJlYnVpbGQgKi8KKyNkZWZpbmUgVF9GQVRFX09VVERBVEVEICAgICAgIDkgICAgICAgLyogaXMgb3V0IG9mIGRhdGUsIG5lZWRzIHVwZGF0aW5nICovCisjZGVmaW5lIFRfRkFURV9VUERBVEUgICAgICAgICAxMCAgICAgIC8qIGRlcHMgdXBkYXRlZCwgbmVlZHMgdXBkYXRpbmcgKi8KKworI2RlZmluZSBUX0ZBVEVfQlJPS0VOICAgICAgICAgMTEgICAgICAvKiA+PSBCUk9LRU4gcnVpbnMgcGFyZW50cyAqLworI2RlZmluZSBUX0ZBVEVfQ0FOVEZJTkQgICAgICAgMTEgICAgICAvKiBubyBydWxlcyB0byBtYWtlIG1pc3NpbmcgdGFyZ2V0ICovCisjZGVmaW5lIFRfRkFURV9DQU5UTUFLRSAgICAgICAxMiAgICAgIC8qIGNhbiBub3QgZmluZCBkZXBlbmRlbmNpZXMgKi8KKworICAgIGNoYXIgICAgICAgcHJvZ3Jlc3M7ICAgICAgICAgICAgICAvKiB0cmFja3MgbWFrZTEoKSBwcm9ncmVzcyAqLworCisjZGVmaW5lIFRfTUFLRV9JTklUICAgICAgICAgICAwICAgICAgIC8qIG1ha2UxKHRhcmdldCkgbm90IHlldCBjYWxsZWQgKi8KKyNkZWZpbmUgVF9NQUtFX09OU1RBQ0sgICAgICAgIDEgICAgICAgLyogbWFrZTEodGFyZ2V0KSBvbiBzdGFjayAqLworI2RlZmluZSBUX01BS0VfQUNUSVZFICAgICAgICAgMiAgICAgICAvKiBtYWtlMSh0YXJnZXQpIGluIG1ha2UxYigpICovCisjZGVmaW5lIFRfTUFLRV9SVU5OSU5HICAgICAgICAzICAgICAgIC8qIG1ha2UxKHRhcmdldCkgcnVubmluZyBjb21tYW5kcyAqLworI2RlZmluZSBUX01BS0VfRE9ORSAgICAgICAgICAgNCAgICAgICAvKiBtYWtlMSh0YXJnZXQpIGRvbmUgKi8KKyNkZWZpbmUgVF9NQUtFX05PRVhFQ19ET05FICAgIDUgICAgICAgLyogbWFrZTEodGFyZ2V0KSBkb25lIHdpdGggLW4gaW4gZWZmZWN0ICovCisKKyNpZmRlZiBPUFRfU0VNQVBIT1JFCisgICAgI2RlZmluZSBUX01BS0VfU0VNQVBIT1JFICA1ICAgICAgIC8qIFNwZWNpYWwgdGFyZ2V0IHR5cGUgZm9yIHNlbWFwaG9yZXMgKi8KKyNlbmRpZgorCisjaWZkZWYgT1BUX1NFTUFQSE9SRQorICAgIFRBUkdFVCAgICogc2VtYXBob3JlOyAgICAgICAgICAgICAvKiB1c2VkIGluIHNlcmlhbGl6YXRpb24gKi8KKyNlbmRpZgorCisgICAgY2hhciAgICAgICBzdGF0dXM7ICAgICAgICAgICAgICAgIC8qIGV4ZWNfY21kKCkgcmVzdWx0ICovCisKKyAgICBpbnQgICAgICAgIGFzeW5jY250OyAgICAgICAgICAgICAgLyogY2hpbGQgZGVwcyBvdXRzdGFuZGluZyAqLworICAgIFRBUkdFVFMgICogcGFyZW50czsgICAgICAgICAgICAgICAvKiB1c2VkIGJ5IG1ha2UxKCkgZm9yIGNvbXBsZXRpb24gKi8KKyAgICBUQVJHRVQgICAqIHNjY19yb290OyAgICAgICAgICAgICAgLyogdXNlZCBieSBtYWtlIHRvIHJlc29sdmUgY3ljbGljIGluY2x1ZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFRBUkdFVCAgICogcmVzY2FubmluZzsgICAgICAgICAgICAvKiB1c2VkIGJ5IG1ha2UwIHRvIG1hcmsgdmlzaXRlZCB0YXJnZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZW4gcmVzY2FubmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgICAgIGRlcHRoOyAgICAgICAgICAgICAgICAgLyogVGhlIGRlcHRoIG9mIHRoZSB0YXJnZXQgaW4gdGhlIG1ha2UwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBjaGFyICAgICAqIGNtZHM7ICAgICAgICAgICAgICAgICAgLyogdHlwZS1wdW5uZWQgY29tbWFuZCBsaXN0ICovCisKKyAgICBjaGFyIGNvbnN0ICogZmFpbGVkOworfTsKKworCisvKiBBY3Rpb24gcmVsYXRlZCBmdW5jdGlvbnMuICovCit2b2lkICAgICAgIGFjdGlvbl9mcmVlICAoIEFDVElPTiAqICk7CitBQ1RJT05TICAqIGFjdGlvbmxpc3QgICAoIEFDVElPTlMgKiwgQUNUSU9OICogKTsKK3ZvaWQgICAgICAgZnJlZWFjdGlvbnMgICggQUNUSU9OUyAqICk7CitTRVRUSU5HUyAqIGFkZHNldHRpbmdzICAoIFNFVFRJTkdTICosIGludCBmbGFnLCBPQkpFQ1QgKiBzeW1ib2wsIExJU1QgKiB2YWx1ZSApOwordm9pZCAgICAgICBwdXNoc2V0dGluZ3MgKCBtb2R1bGVfdCAqLCBTRVRUSU5HUyAqICk7Cit2b2lkICAgICAgIHBvcHNldHRpbmdzICAoIG1vZHVsZV90ICosIFNFVFRJTkdTICogKTsKK1NFVFRJTkdTICogY29weXNldHRpbmdzICggU0VUVElOR1MgKiApOwordm9pZCAgICAgICBmcmVlc2V0dGluZ3MgKCBTRVRUSU5HUyAqICk7Cit2b2lkICAgICAgIGFjdGlvbnNfcmVmZXIoIHJ1bGVfYWN0aW9ucyAqICk7Cit2b2lkICAgICAgIGFjdGlvbnNfZnJlZSAoIHJ1bGVfYWN0aW9ucyAqICk7CisKKy8qIFJ1bGUgcmVsYXRlZCBmdW5jdGlvbnMuICovCitSVUxFICogYmluZHJ1bGUgICAgICAgICggT0JKRUNUICogcnVsZW5hbWUsIG1vZHVsZV90ICogKTsKK1JVTEUgKiBpbXBvcnRfcnVsZSAgICAgKCBSVUxFICogc291cmNlLCBtb2R1bGVfdCAqLCBPQkpFQ1QgKiBuYW1lICk7Cit2b2lkICAgcnVsZV9sb2NhbGl6ZSAgICggUlVMRSAqIHJ1bGUsIG1vZHVsZV90ICogbW9kdWxlICk7CitSVUxFICogbmV3X3J1bGVfYm9keSAgICggbW9kdWxlX3QgKiwgT0JKRUNUICogcnVsZW5hbWUsIEZVTkNUSU9OICogZnVuYywgaW50IGV4cHJ0ICk7CitSVUxFICogbmV3X3J1bGVfYWN0aW9ucyggbW9kdWxlX3QgKiwgT0JKRUNUICogcnVsZW5hbWUsIEZVTkNUSU9OICogY29tbWFuZCwgTElTVCAqIGJpbmRsaXN0LCBpbnQgZmxhZ3MgKTsKK3ZvaWQgICBydWxlX2ZyZWUgICAgICAgKCBSVUxFICogKTsKKworLyogVGFyZ2V0IHJlbGF0ZWQgZnVuY3Rpb25zLiAqLwordm9pZCAgICAgIGJpbmRfZXhwbGljaXRseV9sb2NhdGVkX3RhcmdldHMoKTsKK1RBUkdFVCAgKiBiaW5kdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgKCBPQkpFQ1QgKiBjb25zdCApOwordm9pZCAgICAgIGZyZWV0YXJnZXRzICAgICAgICAgICAgICAgICAgICAoIFRBUkdFVFMgKiApOworVEFSR0VUUyAqIHRhcmdldGNoYWluICAgICAgICAgICAgICAgICAgICAoIFRBUkdFVFMgKiwgVEFSR0VUUyAqICk7CitUQVJHRVRTICogdGFyZ2V0ZW50cnkgICAgICAgICAgICAgICAgICAgICggVEFSR0VUUyAqLCBUQVJHRVQgKiApOwordm9pZCAgICAgIHRhcmdldF9pbmNsdWRlICAgICAgICAgICAgICAgICAoIFRBUkdFVCAqIGNvbnN0IGluY2x1ZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQVJHRVQgKiBjb25zdCBpbmNsdWRlZCApOwordm9pZCAgICAgIHRhcmdldF9pbmNsdWRlX21hbnkgICAgICAgICAgICAoIFRBUkdFVCAqIGNvbnN0IGluY2x1ZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNUICogY29uc3QgaW5jbHVkZWRfbmFtZXMgKTsKK1RBUkdFVFMgKiB0YXJnZXRsaXN0ICAgICAgICAgICAgICAgICAgICAgKCBUQVJHRVRTICosIExJU1QgKiB0YXJnZXRfbmFtZXMgKTsKK3ZvaWQgICAgICB0b3VjaF90YXJnZXQgICAgICAgICAgICAgICAgICAgKCBPQkpFQ1QgKiBjb25zdCApOwordm9pZCAgICAgIGNsZWFyX2luY2x1ZGVzICAgICAgICAgICAgICAgICAoIFRBUkdFVCAqICk7CitUQVJHRVQgICogdGFyZ2V0X3NjYyAgICAgICAgICAgICAgICAgICAgICggVEFSR0VUICogKTsKKworLyogRmluYWwgbW9kdWxlIGNsZWFudXAuICovCit2b2lkIHJ1bGVzX2RvbmUoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9zY2FuLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyZmRjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3NjYW4uYwpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLTIwMDIgQ2hyaXN0b3BoZXIgU2Vpd2FsZCBhbmQgUGVyZm9yY2UgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYW0gLSBzZWUgamFtLmMgZm9yIENvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKgorICogc2Nhbi5jIC0gdGhlIGphbSB5YWNjIHNjYW5uZXIKKyAqCisgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgInNjYW4uaCIKKworI2luY2x1ZGUgImNvbnN0YW50cy5oIgorI2luY2x1ZGUgImphbWJhc2UuaCIKKyNpbmNsdWRlICJqYW1ncmFtLmgiCisKKworc3RydWN0IGtleXdvcmQKK3sKKyAgICBjaGFyICogd29yZDsKKyAgICBpbnQgICAgdHlwZTsKK30ga2V5d29yZHNbXSA9Cit7CisjaW5jbHVkZSAiamFtZ3JhbXRhYi5oIgorICAgIHsgMCwgMCB9Cit9OworCit0eXBlZGVmIHN0cnVjdCBpbmNsdWRlIGluY2x1ZGU7CitzdHJ1Y3QgaW5jbHVkZQoreworICAgIGluY2x1ZGUgICAqIG5leHQ7ICAgICAgICAvKiBuZXh0IHNlcmlhbCBpbmNsdWRlIGZpbGUgKi8KKyAgICBjaGFyICAgICAgKiBzdHJpbmc7ICAgICAgLyogcG9pbnRlciBpbnRvIGN1cnJlbnQgbGluZSAqLworICAgIGNoYXIgICAgKiAqIHN0cmluZ3M7ICAgICAvKiBmb3IgeXlmcGFyc2UoKSAtLSB0ZXh0IHRvIHBhcnNlICovCisgICAgRklMRSAgICAgICogZmlsZTsgICAgICAgIC8qIGZvciB5eWZwYXJzZSgpIC0tIGZpbGUgYmVpbmcgcmVhZCAqLworICAgIE9CSkVDVCAgICAqIGZuYW1lOyAgICAgICAvKiBmb3IgeXlmcGFyc2UoKSAtLSBmaWxlIG5hbWUgKi8KKyAgICBpbnQgICAgICAgICBsaW5lOyAgICAgICAgLyogbGluZSBjb3VudGVyIGZvciBlcnJvciBtZXNzYWdlcyAqLworICAgIGNoYXIgICAgICAgIGJ1ZlsgNTEyIF07ICAvKiBmb3IgeXlmcGFyc2UoKSAtLSBsaW5lIGJ1ZmZlciAqLworfTsKKworc3RhdGljIGluY2x1ZGUgKiBpbmNwID0gMDsgIC8qIGN1cnJlbnQgZmlsZTsgaGVhZCBvZiBjaGFpbiAqLworCitzdGF0aWMgaW50IHNjYW5tb2RlID0gU0NBTl9OT1JNQUw7CitzdGF0aWMgaW50IGFueWVycm9ycyA9IDA7CisKKworc3RhdGljIGNoYXIgKiBzeW1kdW1wKCBZWVNUWVBFICogKTsKKworI2RlZmluZSBCSUdHRVNUX1RPS0VOIDEwMjQwICAvKiBubyBzaW5nbGUgdG9rZW4gY2FuIGJlIGxhcmdlciAqLworCisKKy8qCisgKiBTZXQgcGFyc2VyIG1vZGU6IG5vcm1hbCwgc3RyaW5nLCBvciBrZXl3b3JkLgorICovCisKK3ZvaWQgeXltb2RlKCBpbnQgbiApCit7CisgICAgc2Nhbm1vZGUgPSBuOworfQorCisKK3ZvaWQgeXllcnJvciggY2hhciBjb25zdCAqIHMgKQoreworICAgIC8qIFdlIHVzZSB5eWx2YWwgaW5zdGVhZCBvZiBpbmNwIHRvIGFjY2VzcyB0aGUgZXJyb3IgbG9jYXRpb24gaW5mb3JtYXRpb24gYXMKKyAgICAgKiB0aGUgaW5jcCBwb2ludGVyIHdpbGwgYWxyZWFkeSBiZSByZXNldCB0byAwIGluIGNhc2UgdGhlIGVycm9yIG9jY3VycmVkIGF0CisgICAgICogRU9GLgorICAgICAqCisgICAgICogVGhlIHR3byBtYXkgZGlmZmVyIG9ubHkgaWYgcmFuIGludG8gYW4gdW5leHBlY3RlZCBFT0Ygb3Igd2UgZ2V0IGFuIGVycm9yCisgICAgICogd2hpbGUgcmVhZGluZyBhIGxleGljYWwgdG9rZW4gc3Bhbm5pbmcgbXVsdGlwbGUgbGluZXMsIGUuZy4gYSBtdWx0aS1saW5lCisgICAgICogc3RyaW5nIGxpdGVyYWwgb3IgYWN0aW9uIGJvZHksIGluIHdoaWNoIGNhc2UgeXlsdmFsIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgICAgICogd2lsbCBob2xkIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGUgdG9rZW4gc3RhcnRlZCB3aGlsZSBpbmNwIHdpbGwKKyAgICAgKiBob2xkIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSByZWFkaW5nIGl0IGJyb2tlLgorICAgICAqLworICAgIHByaW50ZiggIiVzOiVkOiAlcyBhdCAlc1xuIiwgb2JqZWN0X3N0ciggeXlsdmFsLmZpbGUgKSwgeXlsdmFsLmxpbmUsIHMsCisgICAgICAgICAgICBzeW1kdW1wKCAmeXlsdmFsICkgKTsKKyAgICArK2FueWVycm9yczsKK30KKworCitpbnQgeXlhbnllcnJvcnMoKQoreworICAgIHJldHVybiBhbnllcnJvcnMgIT0gMDsKK30KKworCit2b2lkIHl5ZnBhcnNlKCBPQkpFQ1QgKiBzICkKK3sKKyAgICBpbmNsdWRlICogaSA9IChpbmNsdWRlICopQkpBTV9NQUxMT0MoIHNpemVvZiggKmkgKSApOworCisgICAgLyogUHVzaCB0aGlzIG9udG8gdGhlIGluY3AgY2hhaW4uICovCisgICAgaS0+c3RyaW5nID0gIiI7CisgICAgaS0+c3RyaW5ncyA9IDA7CisgICAgaS0+ZmlsZSA9IDA7CisgICAgaS0+Zm5hbWUgPSBvYmplY3RfY29weSggcyApOworICAgIGktPmxpbmUgPSAwOworICAgIGktPm5leHQgPSBpbmNwOworICAgIGluY3AgPSBpOworCisgICAgLyogSWYgdGhlIGZpbGVuYW1lIGlzICIrIiwgaXQgbWVhbnMgdXNlIHRoZSBpbnRlcm5hbCBqYW1iYXNlLiAqLworICAgIGlmICggIXN0cmNtcCggb2JqZWN0X3N0ciggcyApLCAiKyIgKSApCisgICAgICAgIGktPnN0cmluZ3MgPSBqYW1iYXNlOworfQorCisKKy8qCisgKiB5eWxpbmUoKSAtIHJlYWQgbmV3IGxpbmUgYW5kIHJldHVybiBmaXJzdCBjaGFyYWN0ZXIuCisgKgorICogRmFicmljYXRlcyBhIGNvbnRpbnVvdXMgc3RyZWFtIG9mIGNoYXJhY3RlcnMgYWNyb3NzIGluY2x1ZGUgZmlsZXMsIHJldHVybmluZworICogRU9GIGF0IHRoZSBiaXR0ZXIgZW5kLgorICovCisKK2ludCB5eWxpbmUoKQoreworICAgIGluY2x1ZGUgKiBjb25zdCBpID0gaW5jcDsKKworICAgIGlmICggIWluY3AgKQorICAgICAgICByZXR1cm4gRU9GOworCisgICAgLyogT25jZSB3ZSBzdGFydCByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgd2UgcmVzZXQgdGhlIGluY2x1ZGUKKyAgICAgKiBpbnNlcnRpb24gcG9pbnQgc28gdGhhdCB0aGUgbmV4dCBpbmNsdWRlIGZpbGUgYmVjb21lcyB0aGUgaGVhZCBvZiB0aGUKKyAgICAgKiBsaXN0LgorICAgICAqLworCisgICAgLyogSWYgdGhlcmUgaXMgbW9yZSBkYXRhIGluIHRoaXMgbGluZSwgcmV0dXJuIGl0LiAqLworICAgIGlmICggKmktPnN0cmluZyApCisgICAgICAgIHJldHVybiAqaS0+c3RyaW5nKys7CisKKyAgICAvKiBJZiB3ZSBhcmUgcmVhZGluZyBmcm9tIGFuIGludGVybmFsIHN0cmluZyBsaXN0LCBnbyB0byB0aGUgbmV4dCBzdHJpbmcuICovCisgICAgaWYgKCBpLT5zdHJpbmdzICkKKyAgICB7CisgICAgICAgIGlmICggKmktPnN0cmluZ3MgKQorICAgICAgICB7CisgICAgICAgICAgICArK2ktPmxpbmU7CisgICAgICAgICAgICBpLT5zdHJpbmcgPSAqKGktPnN0cmluZ3MrKyk7CisgICAgICAgICAgICByZXR1cm4gKmktPnN0cmluZysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIElmIG5lY2Vzc2FyeSwgb3BlbiB0aGUgZmlsZS4gKi8KKyAgICAgICAgaWYgKCAhaS0+ZmlsZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZJTEUgKiBmID0gc3RkaW47CisgICAgICAgICAgICBpZiAoIHN0cmNtcCggb2JqZWN0X3N0ciggaS0+Zm5hbWUgKSwgIi0iICkgJiYgISggZiA9IGZvcGVuKCBvYmplY3Rfc3RyKCBpLT5mbmFtZSApLCAiciIgKSApICkKKyAgICAgICAgICAgICAgICBwZXJyb3IoIG9iamVjdF9zdHIoIGktPmZuYW1lICkgKTsKKyAgICAgICAgICAgIGktPmZpbGUgPSBmOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlcmUgaXMgYW5vdGhlciBsaW5lIGluIHRoaXMgZmlsZSwgc3RhcnQgaXQuICovCisgICAgICAgIGlmICggaS0+ZmlsZSAmJiBmZ2V0cyggaS0+YnVmLCBzaXplb2YoIGktPmJ1ZiApLCBpLT5maWxlICkgKQorICAgICAgICB7CisgICAgICAgICAgICArK2ktPmxpbmU7CisgICAgICAgICAgICBpLT5zdHJpbmcgPSBpLT5idWY7CisgICAgICAgICAgICByZXR1cm4gKmktPnN0cmluZysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVGhpcyBpbmNsdWRlIGlzIGRvbmUuIEZyZWUgaXQgdXAgYW5kIHJldHVybiBFT0Ygc28geXlwYXJzZSgpIHJldHVybnMgdG8KKyAgICAgKiBwYXJzZV9maWxlKCkuCisgICAgICovCisKKyAgICBpbmNwID0gaS0+bmV4dDsKKworICAgIC8qIENsb3NlIGZpbGUsIGZyZWUgbmFtZS4gKi8KKyAgICBpZiAoIGktPmZpbGUgJiYgKCBpLT5maWxlICE9IHN0ZGluICkgKQorICAgICAgICBmY2xvc2UoIGktPmZpbGUgKTsKKyAgICBvYmplY3RfZnJlZSggaS0+Zm5hbWUgKTsKKyAgICBCSkFNX0ZSRUUoIChjaGFyICopaSApOworCisgICAgcmV0dXJuIEVPRjsKK30KKworCisvKgorICogeXlsZXgoKSAtIHNldCB5eWx2YWwgdG8gY3VycmVudCB0b2tlbjsgcmV0dXJuIGl0cyB0eXBlLgorICoKKyAqIE1hY3JvcyB0byBtb3ZlIHRoaW5ncyBhbG9uZzoKKyAqCisgKiAgeXljaGFyKCkgLSByZXR1cm4gYW5kIGFkdmFuY2UgY2hhcmFjdGVyOyBpbnZhbGlkIGFmdGVyIEVPRi4KKyAqICB5eXByZXYoKSAtIGJhY2sgdXAgb25lIGNoYXJhY3RlcjsgaW52YWxpZCBiZWZvcmUgeXljaGFyKCkuCisgKgorICogeXljaGFyKCkgcmV0dXJucyBhIGNvbnRpbnVvdXMgc3RyZWFtIG9mIGNoYXJhY3RlcnMsIHVudGlsIGl0IGhpdHMgdGhlIEVPRiBvZgorICogdGhlIGN1cnJlbnQgaW5jbHVkZSBmaWxlLgorICovCisKKyNkZWZpbmUgeXljaGFyKCkgKCAqaW5jcC0+c3RyaW5nID8gKmluY3AtPnN0cmluZysrIDogeXlsaW5lKCkgKQorI2RlZmluZSB5eXByZXYoKSAoIGluY3AtPnN0cmluZy0tICkKKworaW50IHl5bGV4KCkKK3sKKyAgICBpbnQgYzsKKyAgICBjaGFyIGJ1ZlsgQklHR0VTVF9UT0tFTiBdOworICAgIGNoYXIgKiBiID0gYnVmOworCisgICAgaWYgKCAhaW5jcCApCisgICAgICAgIGdvdG8gZW9mOworCisgICAgLyogR2V0IGZpcnN0IGNoYXJhY3RlciAod2hpdGVzcGFjZSBvciBvZiB0b2tlbikuICovCisgICAgYyA9IHl5Y2hhcigpOworCisgICAgaWYgKCBzY2FubW9kZSA9PSBTQ0FOX1NUUklORyApCisgICAgeworICAgICAgICAvKiBJZiBzY2FubmluZyBmb3IgYSBzdHJpbmcgKGFjdGlvbidzIHt9J3MpLCBsb29rIGZvciB0aGUgY2xvc2luZyBicmFjZS4KKyAgICAgICAgICogV2UgaGFuZGxlIG1hdGNoaW5nIGJyYWNlcywgaWYgdGhleSBtYXRjaC4KKyAgICAgICAgICovCisKKyAgICAgICAgaW50IG5lc3QgPSAxOworCisgICAgICAgIHdoaWxlICggKCBjICE9IEVPRiApICYmICggYiA8IGJ1ZiArIHNpemVvZiggYnVmICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYyA9PSAneycgKQorICAgICAgICAgICAgICAgICsrbmVzdDsKKworICAgICAgICAgICAgaWYgKCAoIGMgPT0gJ30nICkgJiYgIS0tbmVzdCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICpiKysgPSBjOworCisgICAgICAgICAgICBjID0geXljaGFyKCk7CisKKyAgICAgICAgICAgIC8qIFR1cm4gdHJhaWxpbmcgIlxyXG4iIHNlcXVlbmNlcyBpbnRvIHBsYWluICJcbiIgZm9yIEN5Z3dpbi4gKi8KKyAgICAgICAgICAgIGlmICggKCBjID09ICdcbicgKSAmJiAoIGJbIC0xIF0gPT0gJ1xyJyApICkKKyAgICAgICAgICAgICAgICAtLWI7CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBhdGUgdGhlIGVuZGluZyBicmFjZSAtLSByZWd1cmdpdGF0ZSBpdC4gKi8KKyAgICAgICAgaWYgKCBjICE9IEVPRiApCisgICAgICAgICAgICB5eXByZXYoKTsKKworICAgICAgICAvKiBDaGVjayBmb3Igb2J2aW91cyBlcnJvcnMuICovCisgICAgICAgIGlmICggYiA9PSBidWYgKyBzaXplb2YoIGJ1ZiApICkKKyAgICAgICAgeworICAgICAgICAgICAgeXllcnJvciggImFjdGlvbiBibG9jayB0b28gYmlnIiApOworICAgICAgICAgICAgZ290byBlb2Y7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIG5lc3QgKQorICAgICAgICB7CisgICAgICAgICAgICB5eWVycm9yKCAidW5tYXRjaGVkIHt9IGluIGFjdGlvbiBibG9jayIgKTsKKyAgICAgICAgICAgIGdvdG8gZW9mOworICAgICAgICB9CisKKyAgICAgICAgKmIgPSAwOworICAgICAgICB5eWx2YWwudHlwZSA9IFNUUklORzsKKyAgICAgICAgeXlsdmFsLnN0cmluZyA9IG9iamVjdF9uZXcoIGJ1ZiApOworICAgICAgICB5eWx2YWwuZmlsZSA9IGluY3AtPmZuYW1lOworICAgICAgICB5eWx2YWwubGluZSA9IGluY3AtPmxpbmU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNoYXIgKiBiID0gYnVmOworICAgICAgICBzdHJ1Y3Qga2V5d29yZCAqIGs7CisgICAgICAgIGludCBpbnF1b3RlID0gMDsKKyAgICAgICAgaW50IG5vdGtleXdvcmQ7CisKKyAgICAgICAgLyogRWF0IHdoaXRlIHNwYWNlLiAqLworICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTa2lwIHBhc3Qgd2hpdGUgc3BhY2UuICovCisgICAgICAgICAgICB3aGlsZSAoICggYyAhPSBFT0YgKSAmJiBpc3NwYWNlKCBjICkgKQorICAgICAgICAgICAgICAgIGMgPSB5eWNoYXIoKTsKKworICAgICAgICAgICAgLyogTm90IGEgY29tbWVudD8gKi8KKyAgICAgICAgICAgIGlmICggYyAhPSAnIycgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBTd2FsbG93IHVwIGNvbW1lbnQgbGluZS4gKi8KKyAgICAgICAgICAgIHdoaWxlICggKCAoIGMgPSB5eWNoYXIoKSApICE9IEVPRiApICYmICggYyAhPSAnXG4nICkgKSA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjIG5vdyBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIHRva2VuLiAqLworICAgICAgICBpZiAoIGMgPT0gRU9GICkKKyAgICAgICAgICAgIGdvdG8gZW9mOworCisgICAgICAgIHl5bHZhbC5maWxlID0gaW5jcC0+Zm5hbWU7CisgICAgICAgIHl5bHZhbC5saW5lID0gaW5jcC0+bGluZTsKKworICAgICAgICAvKiBXaGlsZSBzY2FubmluZyB0aGUgd29yZCwgZGlzcXVhbGlmeSBpdCBmb3IgKGV4cGVuc2l2ZSkga2V5d29yZCBsb29rdXAKKyAgICAgICAgICogd2hlbiB3ZSBjYW46ICRhbnl0aGluZywgImFueXRoaW5nIiwgXGFueXRoaW5nCisgICAgICAgICAqLworICAgICAgICBub3RrZXl3b3JkID0gYyA9PSAnJCc7CisKKyAgICAgICAgLyogTG9vayBmb3Igd2hpdGUgc3BhY2UgdG8gZGVsaW1pdCB3b3JkLiAiJ3MgZ2V0IHN0cmlwcGVkIGJ1dCBwcmVzZXJ2ZQorICAgICAgICAgKiB3aGl0ZSBzcGFjZS4gXCBwcm90ZWN0cyBuZXh0IGNoYXJhY3Rlci4KKyAgICAgICAgICovCisgICAgICAgIHdoaWxlCisgICAgICAgICgKKyAgICAgICAgICAgICggYyAhPSBFT0YgKSAmJgorICAgICAgICAgICAgKCBiIDwgYnVmICsgc2l6ZW9mKCBidWYgKSApICYmCisgICAgICAgICAgICAoIGlucXVvdGUgfHwgIWlzc3BhY2UoIGMgKSApCisgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBjID09ICciJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYmVnaW4gb3IgZW5kICIgKi8KKyAgICAgICAgICAgICAgICBpbnF1b3RlID0gIWlucXVvdGU7CisgICAgICAgICAgICAgICAgbm90a2V5d29yZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggYyAhPSAnXFwnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBub3JtYWwgY2hhciAqLworICAgICAgICAgICAgICAgICpiKysgPSBjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICggYyA9IHl5Y2hhcigpICkgIT0gRU9GICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBcYyAqLworICAgICAgICAgICAgICAgIGlmIChjID09ICduJykKKyAgICAgICAgICAgICAgICAgICAgYyA9ICdcbic7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAncicpCisgICAgICAgICAgICAgICAgICAgIGMgPSAnXHInOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ3QnKQorICAgICAgICAgICAgICAgICAgICBjID0gJ1x0JzsKKyAgICAgICAgICAgICAgICAqYisrID0gYzsKKyAgICAgICAgICAgICAgICBub3RrZXl3b3JkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBcRU9GICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGMgPSB5eWNoYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIG9idmlvdXMgZXJyb3JzLiAqLworICAgICAgICBpZiAoIGIgPT0gYnVmICsgc2l6ZW9mKCBidWYgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHl5ZXJyb3IoICJzdHJpbmcgdG9vIGJpZyIgKTsKKyAgICAgICAgICAgIGdvdG8gZW9mOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBpbnF1b3RlICkKKyAgICAgICAgeworICAgICAgICAgICAgeXllcnJvciggInVubWF0Y2hlZCBcIiBpbiBzdHJpbmciICk7CisgICAgICAgICAgICBnb3RvIGVvZjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFdlIGxvb2tlZCBhaGVhZCBhIGNoYXJhY3RlciAtIGJhY2sgdXAuICovCisgICAgICAgIGlmICggYyAhPSBFT0YgKQorICAgICAgICAgICAgeXlwcmV2KCk7CisKKyAgICAgICAgLyogU2NhbiB0b2tlbiB0YWJsZS4gRG8gbm90IHNjYW4gaWYgaXQgaXMgb2J2aW91c2x5IG5vdCBhIGtleXdvcmQgb3IgaWYKKyAgICAgICAgICogaXQgaXMgYW4gYWxwaGFiZXRpYyB3aGVuIHdlcmUgbG9va2luZyBmb3IgcHVuY3R1YXRpb24uCisgICAgICAgICAqLworCisgICAgICAgICpiID0gMDsKKyAgICAgICAgeXlsdmFsLnR5cGUgPSBBUkc7CisKKyAgICAgICAgaWYgKCAhbm90a2V5d29yZCAmJiAhKCBpc2FscGhhKCAqYnVmICkgJiYgKCBzY2FubW9kZSA9PSBTQ0FOX1BVTkNUICkgKSApCisgICAgICAgICAgICBmb3IgKCBrID0ga2V5d29yZHM7IGstPndvcmQ7ICsrayApCisgICAgICAgICAgICAgICAgaWYgKCAoICpidWYgPT0gKmstPndvcmQgKSAmJiAhc3RyY21wKCBrLT53b3JkLCBidWYgKSApCisgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgeXlsdmFsLnR5cGUgPSBrLT50eXBlOworICAgICAgICAgICAgICAgICAgICB5eWx2YWwua2V5d29yZCA9IGstPndvcmQ7ICAvKiB1c2VkIGJ5IHN5bWR1bXAgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgIGlmICggeXlsdmFsLnR5cGUgPT0gQVJHICkKKyAgICAgICAgICAgIHl5bHZhbC5zdHJpbmcgPSBvYmplY3RfbmV3KCBidWYgKTsKKyAgICB9CisKKyAgICBpZiAoIERFQlVHX1NDQU4gKQorICAgICAgICBwcmludGYoICJzY2FuICVzXG4iLCBzeW1kdW1wKCAmeXlsdmFsICkgKTsKKworICAgIHJldHVybiB5eWx2YWwudHlwZTsKKworZW9mOgorICAgIC8qIFdlIGRvIG5vdCByZXNldCB5eWx2YWwuZmlsZSAmIHl5bHZhbC5saW5lIGhlcmUgc28gdW5leHBlY3RlZCBFT0YgZXJyb3IKKyAgICAgKiBtZXNzYWdlcyB3b3VsZCBpbmNsdWRlIGNvcnJlY3QgZXJyb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgICAgICovCisgICAgeXlsdmFsLnR5cGUgPSBFT0Y7CisgICAgcmV0dXJuIHl5bHZhbC50eXBlOworfQorCisKK3N0YXRpYyBjaGFyICogc3ltZHVtcCggWVlTVFlQRSAqIHMgKQoreworICAgIHN0YXRpYyBjaGFyIGJ1ZlsgQklHR0VTVF9UT0tFTiArIDIwIF07CisgICAgc3dpdGNoICggcy0+dHlwZSApCisgICAgeworICAgICAgICBjYXNlIEVPRiAgIDogc3ByaW50ZiggYnVmLCAiRU9GIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOyBicmVhazsKKyAgICAgICAgY2FzZSAwICAgICA6IHNwcmludGYoIGJ1ZiwgInVua25vd24gc3ltYm9sICVzIiwgb2JqZWN0X3N0ciggcy0+c3RyaW5nICkgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgQVJHICAgOiBzcHJpbnRmKCBidWYsICJhcmd1bWVudCAlcyIgICAgICAsIG9iamVjdF9zdHIoIHMtPnN0cmluZyApICk7IGJyZWFrOworICAgICAgICBjYXNlIFNUUklORzogc3ByaW50ZiggYnVmLCAic3RyaW5nIFwiJXNcIiIgICAgLCBvYmplY3Rfc3RyKCBzLT5zdHJpbmcgKSApOyBicmVhazsKKyAgICAgICAgZGVmYXVsdCAgICA6IHNwcmludGYoIGJ1ZiwgImtleXdvcmQgJXMiICAgICAgICwgcy0+a2V5d29yZCAgICAgICAgICAgICAgKTsgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBidWY7Cit9CisKKworLyoKKyAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBmaWxlIGFuZCBsaW5lLCBmb3IgdGhvc2UgZXBzaWxvbgorICogdHJhbnNpdGlvbnMgdGhhdCBwcm9kdWNlIGEgcGFyc2UuCisgKi8KKwordm9pZCB5eWlucHV0X2xhc3RfcmVhZF90b2tlbiggT0JKRUNUICogKiBuYW1lLCBpbnQgKiBsaW5lICkKK3sKKyAgICAvKiBUT0RPOiBDb25zaWRlciB3aGV0aGVyIGFuZCB3aGVuIHdlIG1pZ2h0IHdhbnQgdG8gcmVwb3J0IHdoZXJlIHRoZSBsYXN0CisgICAgICogcmVhZCB0b2tlbiBlbmRlZCwgZS5nLiBFT0YgZXJyb3JzIGluc2lkZSBzdHJpbmcgbGl0ZXJhbHMuCisgICAgICovCisgICAgKm5hbWUgPSB5eWx2YWwuZmlsZTsKKyAgICAqbGluZSA9IHl5bHZhbC5saW5lOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvc2Nhbi5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvc2Nhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NTQ3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9zY2FuLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk1IENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyoKKyAqIHNjYW4uaCAtIHRoZSBqYW0geWFjYyBzY2FubmVyCisgKgorICogRXh0ZXJuYWwgZnVuY3Rpb25zOgorICogIHl5ZXJyb3IoIGNoYXIgKnMgKSAtIHByaW50IGEgcGFyc2luZyBlcnJvciBtZXNzYWdlLgorICogIHl5ZnBhcnNlKCBjaGFyICpzICkgLSBzY2FuIGluY2x1ZGUgZmlsZSBzLgorICogIHl5bGV4KCkgLSBwYXJzZSB0aGUgbmV4dCB0b2tlbiwgcmV0dXJuaW5nIGl0cyB0eXBlLgorICogIHl5bW9kZSgpIC0gYWRqdXN0IGxleGljb24gb2Ygc2Nhbm5lci4KKyAqICB5eXBhcnNlKCkgLSBkZWNsYXJhdGlvbiBmb3IgeWFjYyBwYXJzZXIuCisgKiAgeXlhbnllcnJvcnMoKSAtIGluZGljYXRlIGlmIGFueSBwYXJzaW5nIGVycm9ycyBvY2N1cmVkLgorICoKKyAqIFRoZSB5eW1vZGUoKSBmdW5jdGlvbiBpcyBmb3IgdGhlIHBhcnNlciB0byBhZGp1c3QgdGhlIGxleGljb24gb2YgdGhlIHNjYW5uZXIuCisgKiBBc2lkZSBmcm9tIG5vcm1hbCBrZXl3b3JkIHNjYW5uaW5nLCB0aGVyZSBpcyBhIG1vZGUgdG8gaGFuZGxlIGFjdGlvbiBzdHJpbmdzCisgKiAobG9vayBvbmx5IGZvciB0aGUgY2xvc2luZyB9KSBhbmQgYSBtb2RlIHRvIGlnbm9yZSBtb3N0IGtleXdvcmRzIHdoZW4gbG9va2luZworICogZm9yIGEgcHVuY3R1YXRpb24ga2V5d29yZC4gVGhpcyBhbGxvd3Mgbm9uLXB1bmN0dWF0aW9uIGtleXdvcmRzIHRvIGJlIHVzZWQgaW4KKyAqIGxpc3RzIHdpdGhvdXQgcXVvdGluZy4KKyAqLworCisjaW5jbHVkZSAibGlzdHMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJwYXJzZS5oIgorCisKKy8qCisgKiBZWVNUWVBFIC0gdmFsdWUgb2YgYSBsZXhpY2FsIHRva2VuCisgKi8KKworI2RlZmluZSBZWVNUWVBFIFlZU1lNQk9MCisKK3R5cGVkZWYgc3RydWN0IF9ZWVNUWVBFCit7CisgICAgaW50ICAgICAgICAgIHR5cGU7CisgICAgT0JKRUNUICAgICAqIHN0cmluZzsKKyAgICBQQVJTRSAgICAgICogcGFyc2U7CisgICAgTElTVCAgICAgICAqIGxpc3Q7CisgICAgaW50ICAgICAgICAgIG51bWJlcjsKKyAgICBPQkpFQ1QgICAgICogZmlsZTsKKyAgICBpbnQgICAgICAgICAgbGluZTsKKyAgICBjaGFyIGNvbnN0ICoga2V5d29yZDsKK30gWVlTVFlQRTsKKworZXh0ZXJuIFlZU1RZUEUgeXlsdmFsOworCit2b2lkIHl5bW9kZSggaW50IG4gKTsKK3ZvaWQgeXllcnJvciggY2hhciBjb25zdCAqIHMgKTsKK2ludCB5eWFueWVycm9ycygpOwordm9pZCB5eWZwYXJzZSggT0JKRUNUICogcyApOworaW50IHl5bGluZSgpOworaW50IHl5bGV4KCk7CitpbnQgeXlwYXJzZSgpOwordm9pZCB5eWlucHV0X2xhc3RfcmVhZF90b2tlbiggT0JKRUNUICogKiBuYW1lLCBpbnQgKiBsaW5lICk7CisKKyNkZWZpbmUgU0NBTl9OT1JNQUwgIDAgIC8qIG5vcm1hbCBwYXJzaW5nICovCisjZGVmaW5lIFNDQU5fU1RSSU5HICAxICAvKiBsb29rIG9ubHkgZm9yIG1hdGNoaW5nIH0gKi8KKyNkZWZpbmUgU0NBTl9QVU5DVCAgIDIgIC8qIG9ubHkgcHVuY3R1YXRpb24ga2V5d29yZHMgKi8KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3NlYXJjaC5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvc2VhcmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiZWFkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3NlYXJjaC5jCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTMtMjAwMiBDaHJpc3RvcGhlciBTZWl3YWxkIGFuZCBQZXJmb3JjZSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qIFRoaXMgZmlsZSBpcyBBTFNPOgorICogQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyAqIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisjaW5jbHVkZSAiamFtLmgiCisjaW5jbHVkZSAic2VhcmNoLmgiCisKKyNpbmNsdWRlICJjb21waWxlLmgiCisjaW5jbHVkZSAiZmlsZXN5cy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJsaXN0cy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInBhdGhzeXMuaCIKKyNpbmNsdWRlICJzdHJpbmdzLmgiCisjaW5jbHVkZSAidGltZXN0YW1wLmgiCisjaW5jbHVkZSAidmFyaWFibGUuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisKK3R5cGVkZWYgc3RydWN0IF9iaW5kaW5nCit7CisgICAgT0JKRUNUICogYmluZGluZzsKKyAgICBPQkpFQ1QgKiB0YXJnZXQ7Cit9IEJJTkRJTkc7CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaCAqIGV4cGxpY2l0X2JpbmRpbmdzID0gMDsKKworCit2b2lkIGNhbGxfYmluZF9ydWxlKCBPQkpFQ1QgKiB0YXJnZXRfLCBPQkpFQ1QgKiBib3VuZG5hbWVfICkKK3sKKyAgICBMSVNUICogY29uc3QgYmluZF9ydWxlID0gdmFyX2dldCggcm9vdF9tb2R1bGUoKSwgY29uc3RhbnRfQklORFJVTEUgKTsKKyAgICBpZiAoICFsaXN0X2VtcHR5KCBiaW5kX3J1bGUgKSApCisgICAgeworICAgICAgICBPQkpFQ1QgKiB0YXJnZXQgPSBvYmplY3RfY29weSggdGFyZ2V0XyApOworICAgICAgICBPQkpFQ1QgKiBib3VuZG5hbWUgPSBvYmplY3RfY29weSggYm91bmRuYW1lXyApOworICAgICAgICBpZiAoIGJvdW5kbmFtZSAmJiB0YXJnZXQgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBQcmVwYXJlIHRoZSBhcmd1bWVudCBsaXN0LiAqLworICAgICAgICAgICAgRlJBTUUgZnJhbWVbIDEgXTsKKyAgICAgICAgICAgIGZyYW1lX2luaXQoIGZyYW1lICk7CisKKyAgICAgICAgICAgIC8qIEZpcnN0IGFyZ3VtZW50IGlzIHRoZSB0YXJnZXQgbmFtZS4gKi8KKyAgICAgICAgICAgIGxvbF9hZGQoIGZyYW1lLT5hcmdzLCBsaXN0X25ldyggdGFyZ2V0ICkgKTsKKworICAgICAgICAgICAgbG9sX2FkZCggZnJhbWUtPmFyZ3MsIGxpc3RfbmV3KCBib3VuZG5hbWUgKSApOworICAgICAgICAgICAgaWYgKCBsb2xfZ2V0KCBmcmFtZS0+YXJncywgMSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPQkpFQ1QgKiBydWxlbmFtZSA9IGxpc3RfZnJvbnQoIGJpbmRfcnVsZSApOworICAgICAgICAgICAgICAgIGxpc3RfZnJlZSggZXZhbHVhdGVfcnVsZSggYmluZHJ1bGUoIHJ1bGVuYW1lLCByb290X21vZHVsZSgpICksIHJ1bGVuYW1lLCBmcmFtZSApICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENsZWFuIHVwICovCisgICAgICAgICAgICBmcmFtZV9mcmVlKCBmcmFtZSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBib3VuZG5hbWUgKQorICAgICAgICAgICAgICAgIG9iamVjdF9mcmVlKCBib3VuZG5hbWUgKTsKKyAgICAgICAgICAgIGlmICggdGFyZ2V0ICkKKyAgICAgICAgICAgICAgICBvYmplY3RfZnJlZSggdGFyZ2V0ICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFJlY29yZHMgdGhlIGJpbmRpbmcgb2YgYSB0YXJnZXQgd2l0aCBhbiBleHBsaWNpdCBMT0NBVEUuICovCit2b2lkIHNldF9leHBsaWNpdF9iaW5kaW5nKCBPQkpFQ1QgKiB0YXJnZXQsIE9CSkVDVCAqIGxvY2F0ZSApCit7CisgICAgT0JKRUNUICogYm91bmRuYW1lOworICAgIE9CSkVDVCAqIGtleTsKKyAgICBQQVRITkFNRSBmWyAxIF07CisgICAgc3RyaW5nIGJ1ZlsgMSBdOworICAgIGludCBmb3VuZDsKKyAgICBCSU5ESU5HICogYmE7CisKKyAgICBpZiAoICFleHBsaWNpdF9iaW5kaW5ncyApCisgICAgICAgIGV4cGxpY2l0X2JpbmRpbmdzID0gaGFzaGluaXQoIHNpemVvZiggQklORElORyApLCAiZXhwbGljaXRseSBzcGVjaWZpZWQgIgorICAgICAgICAgICAgImxvY2F0aW9ucyIgKTsKKworICAgIHN0cmluZ19uZXcoIGJ1ZiApOworCisgICAgLyogUGFyc2UgdGhlIGZpbGVuYW1lLiAqLworICAgIHBhdGhfcGFyc2UoIG9iamVjdF9zdHIoIHRhcmdldCApLCBmICk7CisKKyAgICAvKiBJZ25vcmUgdGhlIGdyaXN0LiAqLworICAgIGYtPmZfZ3Jpc3QucHRyID0gMDsKKyAgICBmLT5mX2dyaXN0LmxlbiA9IDA7CisKKyAgICAvKiBSb290IHRoZSB0YXJnZXQgcGF0aCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uICovCisgICAgZi0+Zl9yb290LnB0ciA9IG9iamVjdF9zdHIoIGxvY2F0ZSApOworICAgIGYtPmZfcm9vdC5sZW4gPSBzdHJsZW4oIG9iamVjdF9zdHIoIGxvY2F0ZSApICk7CisKKyAgICBwYXRoX2J1aWxkKCBmLCBidWYgKTsKKyAgICBib3VuZG5hbWUgPSBvYmplY3RfbmV3KCBidWYtPnZhbHVlICk7CisgICAgaWYgKCBERUJVR19TRUFSQ0ggKQorICAgICAgICBwcmludGYoICJleHBsaWNpdCBsb2NhdGUgJXM6ICVzXG4iLCBvYmplY3Rfc3RyKCB0YXJnZXQgKSwgYnVmLT52YWx1ZSApOworICAgIHN0cmluZ19mcmVlKCBidWYgKTsKKyAgICBrZXkgPSBwYXRoX2FzX2tleSggYm91bmRuYW1lICk7CisgICAgb2JqZWN0X2ZyZWUoIGJvdW5kbmFtZSApOworCisgICAgYmEgPSAoQklORElORyAqKWhhc2hfaW5zZXJ0KCBleHBsaWNpdF9iaW5kaW5ncywga2V5LCAmZm91bmQgKTsKKyAgICBpZiAoICFmb3VuZCApCisgICAgeworICAgICAgICBiYS0+YmluZGluZyA9IGtleTsKKyAgICAgICAgYmEtPnRhcmdldCA9IHRhcmdldDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBvYmplY3RfZnJlZSgga2V5ICk7Cit9CisKKy8qCisgKiBzZWFyY2guYyAtIGZpbmQgYSB0YXJnZXQgYWxvbmcgJChTRUFSQ0gpIG9yICQoTE9DQVRFKS4KKyAqCisgKiBGaXJzdCwgY2hlY2sgaWYgTE9DQVRFIGlzIHNldC4gSWYgc28sIHVzZSBpdCB0byBkZXRlcm1pbmUgdGhlIGxvY2F0aW9uIG9mCisgKiB0YXJnZXQgYW5kIHJldHVybiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueXRoaW5nIGV4aXN0cyBhdCB0aGF0IGxvY2F0aW9uLgorICoKKyAqIFNlY29uZCwgZXhhbWluZSBhbGwgZGlyZWN0b3JpZXMgaW4gU0VBUkNILiBJZiB0aGUgZmlsZSBleGlzdHMgdGhlcmUgb3IgdGhlcmUKKyAqIGlzIGFub3RoZXIgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IHBsYWNlZCBhdCB0aGlzIGxvY2F0aW9uIHZpYSB0aGUKKyAqIExPQ0FURSBzZXR0aW5nLCBzdG9wIGFuZCByZXR1cm4gdGhlIGxvY2F0aW9uLiBJbiBjYXNlIG9mIGEgcHJldmlvdXMgdGFyZ2V0LAorICogcmV0dXJuIGl0cyBuYW1lIHZpYSB0aGUgJ2Fub3RoZXJfdGFyZ2V0JyBhcmd1bWVudC4KKyAqCisgKiBUaGlzIGJlaGF2aW91ciBhbGxvd3MgaGFuZGxpbmcgZGVwZW5kZW5jaWVzIG9uIGdlbmVyYXRlZCBmaWxlcy4KKyAqCisgKiBJZiBjYWxsZXIgZG9lcyBub3QgZXhwZWN0IHRoYXQgdGhlIHRhcmdldCBpcyBnZW5lcmF0ZWQsIDAgY2FuIGJlIHBhc3NlZCBhcworICogJ2Fub3RoZXJfdGFyZ2V0Jy4KKyAqLworCitPQkpFQ1QgKiBzZWFyY2goIE9CSkVDVCAqIHRhcmdldCwgdGltZXN0YW1wICogY29uc3QgdGltZSwKKyAgICBPQkpFQ1QgKiAqIGFub3RoZXJfdGFyZ2V0LCBpbnQgY29uc3QgZmlsZSApCit7CisgICAgUEFUSE5BTUUgZlsgMSBdOworICAgIExJU1QgKiB2YXJsaXN0OworICAgIHN0cmluZyBidWZbIDEgXTsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIE9CSkVDVCAqIGJvdW5kbmFtZSA9IDA7CisKKyAgICBpZiAoIGFub3RoZXJfdGFyZ2V0ICkKKyAgICAgICAgKmFub3RoZXJfdGFyZ2V0ID0gMDsKKworICAgIGlmICggIWV4cGxpY2l0X2JpbmRpbmdzICkKKyAgICAgICAgZXhwbGljaXRfYmluZGluZ3MgPSBoYXNoaW5pdCggc2l6ZW9mKCBCSU5ESU5HICksICJleHBsaWNpdGx5IHNwZWNpZmllZCAiCisgICAgICAgICAgICAibG9jYXRpb25zIiApOworCisgICAgc3RyaW5nX25ldyggYnVmICk7CisKKyAgICAvKiBQYXJzZSB0aGUgZmlsZW5hbWUuICovCisgICAgcGF0aF9wYXJzZSggb2JqZWN0X3N0ciggdGFyZ2V0ICksIGYgKTsKKworICAgIGYtPmZfZ3Jpc3QucHRyID0gMDsKKyAgICBmLT5mX2dyaXN0LmxlbiA9IDA7CisKKyAgICB2YXJsaXN0ID0gdmFyX2dldCggcm9vdF9tb2R1bGUoKSwgY29uc3RhbnRfTE9DQVRFICk7CisgICAgaWYgKCAhbGlzdF9lbXB0eSggdmFybGlzdCApICkKKyAgICB7CisgICAgICAgIE9CSkVDVCAqIGtleTsKKyAgICAgICAgZi0+Zl9yb290LnB0ciA9IG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIHZhcmxpc3QgKSApOworICAgICAgICBmLT5mX3Jvb3QubGVuID0gc3RybGVuKCBvYmplY3Rfc3RyKCBsaXN0X2Zyb250KCB2YXJsaXN0ICkgKSApOworCisgICAgICAgIHBhdGhfYnVpbGQoIGYsIGJ1ZiApOworCisgICAgICAgIGlmICggREVCVUdfU0VBUkNIICkKKyAgICAgICAgICAgIHByaW50ZiggImxvY2F0ZSAlczogJXNcbiIsIG9iamVjdF9zdHIoIHRhcmdldCApLCBidWYtPnZhbHVlICk7CisKKyAgICAgICAga2V5ID0gb2JqZWN0X25ldyggYnVmLT52YWx1ZSApOworICAgICAgICB0aW1lc3RhbXBfZnJvbV9wYXRoKCB0aW1lLCBrZXkgKTsKKyAgICAgICAgb2JqZWN0X2ZyZWUoIGtleSApOworICAgICAgICBmb3VuZCA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKCB2YXJsaXN0ID0gdmFyX2dldCggcm9vdF9tb2R1bGUoKSwgY29uc3RhbnRfU0VBUkNIICksCisgICAgICAgICFsaXN0X2VtcHR5KCB2YXJsaXN0ICkgKQorICAgIHsKKyAgICAgICAgTElTVElURVIgaXRlciA9IGxpc3RfYmVnaW4oIHZhcmxpc3QgKTsKKyAgICAgICAgTElTVElURVIgY29uc3QgZW5kID0gbGlzdF9lbmQoIHZhcmxpc3QgKTsKKyAgICAgICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlciA9IGxpc3RfbmV4dCggaXRlciApICkKKyAgICAgICAgeworICAgICAgICAgICAgQklORElORyAqIGJhOworICAgICAgICAgICAgZmlsZV9pbmZvX3QgKiBmZjsKKyAgICAgICAgICAgIE9CSkVDVCAqIGtleTsKKyAgICAgICAgICAgIE9CSkVDVCAqIHRlc3RfcGF0aDsKKworICAgICAgICAgICAgZi0+Zl9yb290LnB0ciA9IG9iamVjdF9zdHIoIGxpc3RfaXRlbSggaXRlciApICk7CisgICAgICAgICAgICBmLT5mX3Jvb3QubGVuID0gc3RybGVuKCBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApICk7CisKKyAgICAgICAgICAgIHN0cmluZ190cnVuY2F0ZSggYnVmLCAwICk7CisgICAgICAgICAgICBwYXRoX2J1aWxkKCBmLCBidWYgKTsKKworICAgICAgICAgICAgaWYgKCBERUJVR19TRUFSQ0ggKQorICAgICAgICAgICAgICAgIHByaW50ZiggInNlYXJjaCAlczogJXNcbiIsIG9iamVjdF9zdHIoIHRhcmdldCApLCBidWYtPnZhbHVlICk7CisKKyAgICAgICAgICAgIHRlc3RfcGF0aCA9IG9iamVjdF9uZXcoIGJ1Zi0+dmFsdWUgKTsKKyAgICAgICAgICAgIGtleSA9IHBhdGhfYXNfa2V5KCB0ZXN0X3BhdGggKTsKKyAgICAgICAgICAgIG9iamVjdF9mcmVlKCB0ZXN0X3BhdGggKTsKKyAgICAgICAgICAgIGZmID0gZmlsZV9xdWVyeSgga2V5ICk7CisgICAgICAgICAgICB0aW1lc3RhbXBfZnJvbV9wYXRoKCB0aW1lLCBrZXkgKTsKKworICAgICAgICAgICAgaWYgKCAoIGJhID0gKEJJTkRJTkcgKiloYXNoX2ZpbmQoIGV4cGxpY2l0X2JpbmRpbmdzLCBrZXkgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIERFQlVHX1NFQVJDSCApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIHNlYXJjaCAlczogZm91bmQgZXhwbGljaXRseSBsb2NhdGVkIHRhcmdldCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9zdHIoIHRhcmdldCApLCBvYmplY3Rfc3RyKCBiYS0+dGFyZ2V0ICkgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGFub3RoZXJfdGFyZ2V0ICkKKyAgICAgICAgICAgICAgICAgICAgKmFub3RoZXJfdGFyZ2V0ID0gYmEtPnRhcmdldDsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIGtleSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGZmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoICFmaWxlIHx8IGZmLT5pc19maWxlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2ZyZWUoIGtleSApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvYmplY3RfZnJlZSgga2V5ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoICFmb3VuZCApCisgICAgeworICAgICAgICAvKiBMb29rIGZvciB0aGUgb2J2aW91cy4gKi8KKyAgICAgICAgLyogVGhpcyBpcyBhIHF1ZXN0aW9uYWJsZSBtb3ZlLiBTaG91bGQgd2UgbG9vayBpbiB0aGUgb2J2aW91cyBwbGFjZSBpZgorICAgICAgICAgKiBTRUFSQ0ggaXMgc2V0PworICAgICAgICAgKi8KKyAgICAgICAgT0JKRUNUICoga2V5OworCisgICAgICAgIGYtPmZfcm9vdC5wdHIgPSAwOworICAgICAgICBmLT5mX3Jvb3QubGVuID0gMDsKKworICAgICAgICBzdHJpbmdfdHJ1bmNhdGUoIGJ1ZiwgMCApOworICAgICAgICBwYXRoX2J1aWxkKCBmLCBidWYgKTsKKworICAgICAgICBpZiAoIERFQlVHX1NFQVJDSCApCisgICAgICAgICAgICBwcmludGYoICJzZWFyY2ggJXM6ICVzXG4iLCBvYmplY3Rfc3RyKCB0YXJnZXQgKSwgYnVmLT52YWx1ZSApOworCisgICAgICAgIGtleSA9IG9iamVjdF9uZXcoIGJ1Zi0+dmFsdWUgKTsKKyAgICAgICAgdGltZXN0YW1wX2Zyb21fcGF0aCggdGltZSwga2V5ICk7CisgICAgICAgIG9iamVjdF9mcmVlKCBrZXkgKTsKKyAgICB9CisKKyAgICBib3VuZG5hbWUgPSBvYmplY3RfbmV3KCBidWYtPnZhbHVlICk7CisgICAgc3RyaW5nX2ZyZWUoIGJ1ZiApOworCisgICAgLyogUHJlcGFyZSBhIGNhbGwgdG8gQklORFJVTEUgaWYgdGhlIHZhcmlhYmxlIGlzIHNldC4gKi8KKyAgICBjYWxsX2JpbmRfcnVsZSggdGFyZ2V0LCBib3VuZG5hbWUgKTsKKworICAgIHJldHVybiBib3VuZG5hbWU7Cit9CisKKworc3RhdGljIHZvaWQgZnJlZV9iaW5kaW5nKCB2b2lkICogeGJpbmRpbmcsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBvYmplY3RfZnJlZSggKCAoQklORElORyAqKXhiaW5kaW5nICktPmJpbmRpbmcgKTsKK30KKworCit2b2lkIHNlYXJjaF9kb25lKCB2b2lkICkKK3sKKyAgICBpZiAoIGV4cGxpY2l0X2JpbmRpbmdzICkKKyAgICB7CisgICAgICAgIGhhc2hlbnVtZXJhdGUoIGV4cGxpY2l0X2JpbmRpbmdzLCBmcmVlX2JpbmRpbmcsIDAgKTsKKyAgICAgICAgaGFzaGRvbmUoIGV4cGxpY2l0X2JpbmRpbmdzICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvc2VhcmNoLmggYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9zZWFyY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc0Zjc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvc2VhcmNoLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk1IENocmlzdG9waGVyIFNlaXdhbGQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyoKKyAqIHNlYXJjaC5oIC0gZmluZCBhIHRhcmdldCBhbG9uZyAkKFNFQVJDSCkgb3IgJChMT0NBVEUpCisgKi8KKworI2lmbmRlZiBTRUFSQ0hfU1cyMDExMTExOF9ICisjZGVmaW5lIFNFQVJDSF9TVzIwMTExMTE4X0gKKworI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInRpbWVzdGFtcC5oIgorCit2b2lkIHNldF9leHBsaWNpdF9iaW5kaW5nKCBPQkpFQ1QgKiB0YXJnZXQsIE9CSkVDVCAqIGxvY2F0ZSApOworT0JKRUNUICogc2VhcmNoKCBPQkpFQ1QgKiB0YXJnZXQsIHRpbWVzdGFtcCAqIGNvbnN0IHRpbWUsCisgICAgT0JKRUNUICogKiBhbm90aGVyX3RhcmdldCwgaW50IGNvbnN0IGZpbGUgKTsKK3ZvaWQgc2VhcmNoX2RvbmUoIHZvaWQgKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9zdHJpbmdzLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9zdHJpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzZTE5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3N0cmluZ3MuYwpAQCAtMCwwICsxLDIyMyBAQAorLyogQ29weXJpZ2h0IERhdmlkIEFicmFoYW1zIDIwMDQuIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCAqLworLyogU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nICovCisvKiBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkgKi8KKworI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgInN0cmluZ3MuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKyNpZm5kZWYgTkRFQlVHCisjIGRlZmluZSBKQU1fU1RSSU5HX01BR0lDICgoY2hhcikweGNmKQorIyBkZWZpbmUgSkFNX1NUUklOR19NQUdJQ19TSVpFIDQKK3N0YXRpYyB2b2lkIGFzc2VydF9pbnZhcmlhbnRzKCBzdHJpbmcgKiBzZWxmICkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmICggc2VsZi0+dmFsdWUgPT0gMCApCisgICAgeworICAgICAgICBhc3NlcnQoIHNlbGYtPnNpemUgPT0gMCApOworICAgICAgICBhc3NlcnQoIHNlbGYtPmNhcGFjaXR5ID09IDAgKTsKKyAgICAgICAgYXNzZXJ0KCBzZWxmLT5vcHRbIDAgXSA9PSAwICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhc3NlcnQoIHNlbGYtPnNpemUgPCBzZWxmLT5jYXBhY2l0eSApOworICAgIGFzc2VydCggKCBzZWxmLT5jYXBhY2l0eSA8PSBzaXplb2YoIHNlbGYtPm9wdCApICkgPT0gKCBzZWxmLT52YWx1ZSA9PSBzZWxmLT5vcHQgKSApOworICAgIGFzc2VydCggc2VsZi0+dmFsdWVbIHNlbGYtPnNpemUgXSA9PSAwICk7CisgICAgLyogU3RyaW5nIG9iamVjdHMgbW9kaWZpZWQgbWFudWFsbHkgYWZ0ZXIgY29uc3RydWN0aW9uIHRvIGNvbnRhaW4gZW1iZWRkZWQKKyAgICAgKiAnXDAnIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQgc3RydWN0dXJhbGx5IHZhbGlkLgorICAgICAqLworICAgIGFzc2VydCggc3RybGVuKCBzZWxmLT52YWx1ZSApIDw9IHNlbGYtPnNpemUgKTsKKworICAgIGZvciAoIGkgPSAwOyBpIDwgNDsgKytpICkKKyAgICB7CisgICAgICAgIGFzc2VydCggc2VsZi0+bWFnaWNbIGkgXSA9PSBKQU1fU1RSSU5HX01BR0lDICk7CisgICAgICAgIGFzc2VydCggc2VsZi0+dmFsdWVbIHNlbGYtPmNhcGFjaXR5ICsgaSBdID09IEpBTV9TVFJJTkdfTUFHSUMgKTsKKyAgICB9Cit9CisjZWxzZQorIyBkZWZpbmUgSkFNX1NUUklOR19NQUdJQ19TSVpFIDAKKyMgZGVmaW5lIGFzc2VydF9pbnZhcmlhbnRzKHgpIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKwordm9pZCBzdHJpbmdfbmV3KCBzdHJpbmcgKiBzICkKK3sKKyAgICBzLT52YWx1ZSA9IHMtPm9wdDsKKyAgICBzLT5zaXplID0gMDsKKyAgICBzLT5jYXBhY2l0eSA9IHNpemVvZiggcy0+b3B0ICk7CisgICAgcy0+b3B0WyAwIF0gPSAwOworI2lmbmRlZiBOREVCVUcKKyAgICBtZW1zZXQoIHMtPm1hZ2ljLCBKQU1fU1RSSU5HX01BR0lDLCBzaXplb2YoIHMtPm1hZ2ljICkgKTsKKyNlbmRpZgorICAgIGFzc2VydF9pbnZhcmlhbnRzKCBzICk7Cit9CisKKwordm9pZCBzdHJpbmdfZnJlZSggc3RyaW5nICogcyApCit7CisgICAgYXNzZXJ0X2ludmFyaWFudHMoIHMgKTsKKyAgICBpZiAoIHMtPnZhbHVlICE9IHMtPm9wdCApCisgICAgICAgIEJKQU1fRlJFRSggcy0+dmFsdWUgKTsKKyAgICBzdHJpbmdfbmV3KCBzICk7Cit9CisKKworc3RhdGljIHZvaWQgc3RyaW5nX3Jlc2VydmVfaW50ZXJuYWwoIHN0cmluZyAqIHNlbGYsIHNpemVfdCBjYXBhY2l0eSApCit7CisgICAgaWYgKCBzZWxmLT52YWx1ZSA9PSBzZWxmLT5vcHQgKQorICAgIHsKKyAgICAgICAgc2VsZi0+dmFsdWUgPSAoY2hhciAqKUJKQU1fTUFMTE9DX0FUT01JQyggY2FwYWNpdHkgKworICAgICAgICAgICAgSkFNX1NUUklOR19NQUdJQ19TSVpFICk7CisgICAgICAgIHNlbGYtPnZhbHVlWyAwIF0gPSAwOworICAgICAgICBzdHJuY2F0KCBzZWxmLT52YWx1ZSwgc2VsZi0+b3B0LCBzaXplb2Yoc2VsZi0+b3B0KSApOworICAgICAgICBhc3NlcnQoIHN0cmxlbiggc2VsZi0+dmFsdWUgKSA8PSBzZWxmLT5jYXBhY2l0eSAmJiAiUmVncmVzc2lvbiB0ZXN0IiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzZWxmLT52YWx1ZSA9IChjaGFyICopQkpBTV9SRUFMTE9DKCBzZWxmLT52YWx1ZSwgY2FwYWNpdHkgKworICAgICAgICAgICAgSkFNX1NUUklOR19NQUdJQ19TSVpFICk7CisgICAgfQorI2lmbmRlZiBOREVCVUcKKyAgICBtZW1jcHkoIHNlbGYtPnZhbHVlICsgY2FwYWNpdHksIHNlbGYtPm1hZ2ljLCBKQU1fU1RSSU5HX01BR0lDX1NJWkUgKTsKKyNlbmRpZgorICAgIHNlbGYtPmNhcGFjaXR5ID0gY2FwYWNpdHk7Cit9CisKKwordm9pZCBzdHJpbmdfcmVzZXJ2ZSggc3RyaW5nICogc2VsZiwgc2l6ZV90IGNhcGFjaXR5ICkKK3sKKyAgICBhc3NlcnRfaW52YXJpYW50cyggc2VsZiApOworICAgIGlmICggY2FwYWNpdHkgPD0gc2VsZi0+Y2FwYWNpdHkgKQorICAgICAgICByZXR1cm47CisgICAgc3RyaW5nX3Jlc2VydmVfaW50ZXJuYWwoIHNlbGYsIGNhcGFjaXR5ICk7CisgICAgYXNzZXJ0X2ludmFyaWFudHMoIHNlbGYgKTsKK30KKworCitzdGF0aWMgdm9pZCBleHRlbmRfZnVsbCggc3RyaW5nICogc2VsZiwgY2hhciBjb25zdCAqIHN0YXJ0LCBjaGFyIGNvbnN0ICogZmluaXNoICkKK3sKKyAgICBzaXplX3QgbmV3X3NpemUgPSBzZWxmLT5jYXBhY2l0eSArICggZmluaXNoIC0gc3RhcnQgKTsKKyAgICBzaXplX3QgbmV3X2NhcGFjaXR5ID0gc2VsZi0+Y2FwYWNpdHk7CisgICAgc2l6ZV90IG9sZF9zaXplID0gc2VsZi0+Y2FwYWNpdHk7CisgICAgd2hpbGUgKCBuZXdfY2FwYWNpdHkgPCBuZXdfc2l6ZSArIDEpCisgICAgICAgIG5ld19jYXBhY2l0eSA8PD0gMTsKKyAgICBzdHJpbmdfcmVzZXJ2ZV9pbnRlcm5hbCggc2VsZiwgbmV3X2NhcGFjaXR5ICk7CisgICAgbWVtY3B5KCBzZWxmLT52YWx1ZSArIG9sZF9zaXplLCBzdGFydCwgbmV3X3NpemUgLSBvbGRfc2l6ZSApOworICAgIHNlbGYtPnZhbHVlWyBuZXdfc2l6ZSBdID0gMDsKKyAgICBzZWxmLT5zaXplID0gbmV3X3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIG1heWJlX3Jlc2VydmUoIHN0cmluZyAqIHNlbGYsIHNpemVfdCBuZXdfc2l6ZSApCit7CisgICAgc2l6ZV90IGNhcGFjaXR5ID0gc2VsZi0+Y2FwYWNpdHk7CisgICAgaWYgKCBjYXBhY2l0eSA8PSBuZXdfc2l6ZSApCisgICAgeworICAgICAgICBzaXplX3QgbmV3X2NhcGFjaXR5ID0gY2FwYWNpdHk7CisgICAgICAgIHdoaWxlICggbmV3X2NhcGFjaXR5IDw9IG5ld19zaXplICkKKyAgICAgICAgICAgIG5ld19jYXBhY2l0eSA8PD0gMTsKKyAgICAgICAgc3RyaW5nX3Jlc2VydmVfaW50ZXJuYWwoIHNlbGYsIG5ld19jYXBhY2l0eSApOworICAgIH0KK30KKworCit2b2lkIHN0cmluZ19hcHBlbmQoIHN0cmluZyAqIHNlbGYsIGNoYXIgY29uc3QgKiByaHMgKQoreworICAgIHNpemVfdCByaHNfc2l6ZSA9IHN0cmxlbiggcmhzICk7CisgICAgc2l6ZV90IG5ld19zaXplID0gc2VsZi0+c2l6ZSArIHJoc19zaXplOworICAgIGFzc2VydF9pbnZhcmlhbnRzKCBzZWxmICk7CisKKyAgICBtYXliZV9yZXNlcnZlKCBzZWxmLCBuZXdfc2l6ZSApOworCisgICAgbWVtY3B5KCBzZWxmLT52YWx1ZSArIHNlbGYtPnNpemUsIHJocywgcmhzX3NpemUgKyAxICk7CisgICAgc2VsZi0+c2l6ZSA9IG5ld19zaXplOworCisgICAgYXNzZXJ0X2ludmFyaWFudHMoIHNlbGYgKTsKK30KKworCit2b2lkIHN0cmluZ19hcHBlbmRfcmFuZ2UoIHN0cmluZyAqIHNlbGYsIGNoYXIgY29uc3QgKiBzdGFydCwgY2hhciBjb25zdCAqIGZpbmlzaCApCit7CisgICAgc2l6ZV90IHJoc19zaXplID0gZmluaXNoIC0gc3RhcnQ7CisgICAgc2l6ZV90IG5ld19zaXplID0gc2VsZi0+c2l6ZSArIHJoc19zaXplOworICAgIGFzc2VydF9pbnZhcmlhbnRzKCBzZWxmICk7CisKKyAgICBtYXliZV9yZXNlcnZlKCBzZWxmLCBuZXdfc2l6ZSApOworCisgICAgbWVtY3B5KCBzZWxmLT52YWx1ZSArIHNlbGYtPnNpemUsIHN0YXJ0LCByaHNfc2l6ZSApOworICAgIHNlbGYtPnNpemUgPSBuZXdfc2l6ZTsKKyAgICBzZWxmLT52YWx1ZVsgbmV3X3NpemUgXSA9IDA7CisKKyAgICBhc3NlcnRfaW52YXJpYW50cyggc2VsZiApOworfQorCisKK3ZvaWQgc3RyaW5nX2NvcHkoIHN0cmluZyAqIHMsIGNoYXIgY29uc3QgKiByaHMgKQoreworICAgIHN0cmluZ19uZXcoIHMgKTsKKyAgICBzdHJpbmdfYXBwZW5kKCBzLCByaHMgKTsKK30KKwordm9pZCBzdHJpbmdfdHJ1bmNhdGUoIHN0cmluZyAqIHNlbGYsIHNpemVfdCBuICkKK3sKKyAgICBhc3NlcnRfaW52YXJpYW50cyggc2VsZiApOworICAgIGFzc2VydCggbiA8PSBzZWxmLT5jYXBhY2l0eSApOworICAgIHNlbGYtPnZhbHVlWyBzZWxmLT5zaXplID0gbiBdID0gMDsKKyAgICBhc3NlcnRfaW52YXJpYW50cyggc2VsZiApOworfQorCisKK3ZvaWQgc3RyaW5nX3BvcF9iYWNrKCBzdHJpbmcgKiBzZWxmICkKK3sKKyAgICBzdHJpbmdfdHJ1bmNhdGUoIHNlbGYsIHNlbGYtPnNpemUgLSAxICk7Cit9CisKKwordm9pZCBzdHJpbmdfcHVzaF9iYWNrKCBzdHJpbmcgKiBzZWxmLCBjaGFyIHggKQoreworICAgIHN0cmluZ19hcHBlbmRfcmFuZ2UoIHNlbGYsICZ4LCAmeCArIDEgKTsKK30KKworCitjaGFyIHN0cmluZ19iYWNrKCBzdHJpbmcgKiBzZWxmICkKK3sKKyAgICBhc3NlcnRfaW52YXJpYW50cyggc2VsZiApOworICAgIHJldHVybiBzZWxmLT52YWx1ZVsgc2VsZi0+c2l6ZSAtIDEgXTsKK30KKworCisjaWZuZGVmIE5ERUJVRwordm9pZCBzdHJpbmdfdW5pdF90ZXN0KCkKK3sKKyAgICB7CisgICAgICAgIHN0cmluZyBzWyAxIF07CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgY29uc3QgbGltaXQgPSBzaXplb2YoIHMtPm9wdCApICogMiArIDI7CisgICAgICAgIHN0cmluZ19uZXcoIHMgKTsKKyAgICAgICAgYXNzZXJ0KCBzLT52YWx1ZSA9PSBzLT5vcHQgKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsaW1pdDsgKytpICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nX3B1c2hfYmFjayggcywgKGNoYXIpKCBpICsgMSApICk7CisgICAgICAgICAgICBhc3NlcnQoIHMtPnNpemUgPT0gaSArIDEgKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoIHMtPnNpemUgPT0gbGltaXQgKTsKKyAgICAgICAgYXNzZXJ0KCBzLT52YWx1ZSAhPSBzLT5vcHQgKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsaW1pdDsgKytpICkKKyAgICAgICAgICAgIGFzc2VydCggcy0+dmFsdWVbIGkgXSA9PSAoY2hhcikoIGkgKyAxICkgKTsKKyAgICAgICAgc3RyaW5nX2ZyZWUoIHMgKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgKiBjb25zdCBvcmlnaW5hbCA9ICIgIFxuXHRcdiAgRm9vIFxyXG5cdiBcdEJhclxuXG5cclxyXHRcblx2XHQgXHQiOworICAgICAgICBzdHJpbmcgY29weVsgMSBdOworICAgICAgICBzdHJpbmdfY29weSggY29weSwgb3JpZ2luYWwgKTsKKyAgICAgICAgYXNzZXJ0KCAhc3RyY21wKCBjb3B5LT52YWx1ZSwgb3JpZ2luYWwgKSApOworICAgICAgICBhc3NlcnQoIGNvcHktPnNpemUgPT0gc3RybGVuKCBvcmlnaW5hbCApICk7CisgICAgICAgIHN0cmluZ19mcmVlKCBjb3B5ICk7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9zdHJpbmdzLmggYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9zdHJpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5ZjI4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3N0cmluZ3MuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDQuIERhdmlkIEFicmFoYW1zCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgKiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKworI2lmbmRlZiBTVFJJTkdTX0RXQTIwMDExMDI0X0gKKyNkZWZpbmUgU1RSSU5HU19EV0EyMDAxMTAyNF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKwordHlwZWRlZiBzdHJ1Y3Qgc3RyaW5nCit7CisgICAgY2hhciAqIHZhbHVlOworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICB1bnNpZ25lZCBsb25nIGNhcGFjaXR5OworICAgIGNoYXIgb3B0WyAzMiBdOworI2lmbmRlZiBOREVCVUcKKyAgICBjaGFyIG1hZ2ljWyA0IF07CisjZW5kaWYKK30gc3RyaW5nOworCit2b2lkIHN0cmluZ19uZXcoIHN0cmluZyAqICk7Cit2b2lkIHN0cmluZ19jb3B5KCBzdHJpbmcgKiwgY2hhciBjb25zdCAqICk7Cit2b2lkIHN0cmluZ19mcmVlKCBzdHJpbmcgKiApOwordm9pZCBzdHJpbmdfYXBwZW5kKCBzdHJpbmcgKiwgY2hhciBjb25zdCAqICk7Cit2b2lkIHN0cmluZ19hcHBlbmRfcmFuZ2UoIHN0cmluZyAqLCBjaGFyIGNvbnN0ICosIGNoYXIgY29uc3QgKiApOwordm9pZCBzdHJpbmdfcHVzaF9iYWNrKCBzdHJpbmcgKiBzLCBjaGFyIHggKTsKK3ZvaWQgc3RyaW5nX3Jlc2VydmUoIHN0cmluZyAqLCBzaXplX3QgKTsKK3ZvaWQgc3RyaW5nX3RydW5jYXRlKCBzdHJpbmcgKiwgc2l6ZV90ICk7Cit2b2lkIHN0cmluZ19wb3BfYmFjayggc3RyaW5nICogKTsKK2NoYXIgc3RyaW5nX2JhY2soIHN0cmluZyAqICk7Cit2b2lkIHN0cmluZ191bml0X3Rlc3QoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS9zdWJzdC5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvc3Vic3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZjZWUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvc3Vic3QuYwpAQCAtMCwwICsxLDExNiBAQAorI2luY2x1ZGUgImphbS5oIgorI2luY2x1ZGUgInN1YnN0LmgiCisKKyNpbmNsdWRlICJidWlsdGlucy5oIgorI2luY2x1ZGUgImZyYW1lcy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJsaXN0cy5oIgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKwordHlwZWRlZiBzdHJ1Y3QgcmVnZXhfZW50cnkKK3sKKyAgICBPQkpFQ1QgKiBwYXR0ZXJuOworICAgIHJlZ2V4cCAqIHJlZ2V4OworfSByZWdleF9lbnRyeTsKKworc3RhdGljIHN0cnVjdCBoYXNoICogcmVnZXhfaGFzaDsKKworCityZWdleHAgKiByZWdleF9jb21waWxlKCBPQkpFQ1QgKiBwYXR0ZXJuICkKK3sKKyAgICBpbnQgZm91bmQ7CisgICAgcmVnZXhfZW50cnkgKiBlIDsKKworICAgIGlmICggIXJlZ2V4X2hhc2ggKQorICAgICAgICByZWdleF9oYXNoID0gaGFzaGluaXQoIHNpemVvZiggcmVnZXhfZW50cnkgKSwgInJlZ2V4IiApOworCisgICAgZSA9IChyZWdleF9lbnRyeSAqKWhhc2hfaW5zZXJ0KCByZWdleF9oYXNoLCBwYXR0ZXJuLCAmZm91bmQgKTsKKyAgICBpZiAoICFmb3VuZCApCisgICAgeworICAgICAgICBlLT5wYXR0ZXJuID0gb2JqZWN0X2NvcHkoIHBhdHRlcm4gKTsKKyAgICAgICAgZS0+cmVnZXggPSByZWdjb21wKCAoY2hhciAqKXBhdHRlcm4gKTsKKyAgICB9CisKKyAgICByZXR1cm4gZS0+cmVnZXg7Cit9CisKKworTElTVCAqIGJ1aWx0aW5fc3Vic3QoIEZSQU1FICogZnJhbWUsIGludCBmbGFncyApCit7CisgICAgTElTVCAqIHJlc3VsdCA9IEwwOworICAgIExJU1QgKiBjb25zdCBhcmcxID0gbG9sX2dldCggZnJhbWUtPmFyZ3MsIDAgKTsKKyAgICBMSVNUSVRFUiBpdGVyID0gbGlzdF9iZWdpbiggYXJnMSApOworICAgIExJU1RJVEVSIGNvbnN0IGVuZCA9IGxpc3RfZW5kKCBhcmcxICk7CisKKyAgICBpZiAoIGl0ZXIgIT0gZW5kICYmIGxpc3RfbmV4dCggaXRlciApICE9IGVuZCAmJiBsaXN0X25leHQoIGxpc3RfbmV4dCggaXRlciApCisgICAgICAgICkgIT0gZW5kICkKKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBzb3VyY2UgPSBvYmplY3Rfc3RyKCBsaXN0X2l0ZW0oIGl0ZXIgKSApOworICAgICAgICBPQkpFQ1QgKiBjb25zdCBwYXR0ZXJuID0gbGlzdF9pdGVtKCBsaXN0X25leHQoIGl0ZXIgKSApOworICAgICAgICByZWdleHAgKiBjb25zdCByZXBhdCA9IHJlZ2V4X2NvbXBpbGUoIHBhdHRlcm4gKTsKKworICAgICAgICBpZiAoIHJlZ2V4ZWMoIHJlcGF0LCAoY2hhciAqKXNvdXJjZSkgKQorICAgICAgICB7CisgICAgICAgICAgICBMSVNUSVRFUiBzdWJzdCA9IGxpc3RfbmV4dCggaXRlciApOworCisgICAgICAgICAgICB3aGlsZSAoICggc3Vic3QgPSBsaXN0X25leHQoIHN1YnN0ICkgKSAhPSBlbmQgKQorICAgICAgICAgICAgeworI2RlZmluZSBCVUZMRU4gNDA5NgorICAgICAgICAgICAgICAgIGNoYXIgYnVmWyBCVUZMRU4gKyAxIF07CisgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIGluID0gb2JqZWN0X3N0ciggbGlzdF9pdGVtKCBzdWJzdCApICk7CisgICAgICAgICAgICAgICAgY2hhciAqIG91dCA9IGJ1ZjsKKworICAgICAgICAgICAgICAgIGZvciAoIDsgKmluICYmIG91dCA8IGJ1ZiArIEJVRkxFTjsgKytpbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICppbiA9PSAnXFwnIHx8ICppbiA9PSAnJCcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2luOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqaW4gPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICppbiA+PSAnMCcgJiYgKmluIDw9ICc5JyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IG4gPSAqaW4gLSAnMCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvbnN0IHNyY2xlbiA9IHJlcGF0LT5lbmRwWyBuIF0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBhdC0+c3RhcnRwWyBuIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvbnN0IHJlbWFpbmluZyA9IGJ1ZiArIEJVRkxFTiAtIG91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY29uc3QgbGVuID0gc3JjbGVuIDwgcmVtYWluaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3JjbGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggb3V0LCByZXBhdC0+c3RhcnRwWyBuIF0sIGxlbiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggYW5kIGNvcHkgdGhlIG5leHQgY2hhcmFjdGVyICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gKmluOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb3V0ID0gMDsKKworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIG9iamVjdF9uZXcoIGJ1ZiApICk7CisjdW5kZWYgQlVGTEVOCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkIGZyZWVfcmVnZXgoIHZvaWQgKiB4cmVnZXgsIHZvaWQgKiBkYXRhICkKK3sKKyAgICByZWdleF9lbnRyeSAqIGNvbnN0IHJlZ2V4ID0gKHJlZ2V4X2VudHJ5ICopeHJlZ2V4OworICAgIG9iamVjdF9mcmVlKCByZWdleC0+cGF0dGVybiApOworICAgIEJKQU1fRlJFRSggcmVnZXgtPnJlZ2V4ICk7Cit9CisKKwordm9pZCByZWdleF9kb25lKCkKK3sKKyAgICBpZiAoIHJlZ2V4X2hhc2ggKQorICAgIHsKKyAgICAgICAgaGFzaGVudW1lcmF0ZSggcmVnZXhfaGFzaCwgZnJlZV9yZWdleCwgKHZvaWQgKikwICk7CisgICAgICAgIGhhc2hkb25lKCByZWdleF9oYXNoICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvc3Vic3QuaCBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3N1YnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjMDlhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3N1YnN0LmgKQEAgLTAsMCArMSwxNCBAQAorLyogIENvcHlyaWdodCAyMDAxLTIwMDQgRGF2aWQgQWJyYWhhbXMuCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisjaWZuZGVmIFNVQlNUX0pHMjAxMjA3MjJfSAorI2RlZmluZSBTVUJTVF9KRzIwMTIwNzIyX0gKKworI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInJlZ2V4cC5oIgorCityZWdleHAgKiByZWdleF9jb21waWxlKCBPQkpFQ1QgKiBwYXR0ZXJuICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvdGltZXN0YW1wLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS90aW1lc3RhbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDAxNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvdGltZXN0YW1wLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5My0yMDAyIENocmlzdG9waGVyIFNlaXdhbGQgYW5kIFBlcmZvcmNlIFNvZnR3YXJlLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmFtIC0gc2VlIGphbS5jIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyogVGhpcyBmaWxlIGlzIEFMU086CisgKiBDb3B5cmlnaHQgMjAwMS0yMDA0IERhdmlkIEFicmFoYW1zLgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKKyAqIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisvKgorICogdGltZXN0YW1wLmMgLSBnZXQgdGhlIHRpbWVzdGFtcCBvZiBhIGZpbGUgb3IgYXJjaGl2ZSBtZW1iZXIKKyAqCisgKiBFeHRlcm5hbCByb3V0aW5lczoKKyAqICB0aW1lc3RhbXBfZnJvbV9wYXRoKCkgLSByZXR1cm4gdGltZXN0YW1wIGZvciBhIHBhdGgsIGlmIHByZXNlbnQKKyAqICB0aW1lc3RhbXBfZG9uZSgpICAgICAgLSBmcmVlIHRpbWVzdGFtcCB0YWJsZXMKKyAqCisgKiBJbnRlcm5hbCByb3V0aW5lczoKKyAqICB0aW1lX2VudGVyKCkgICAgICAtIGludGVybmFsIHdvcmtlciBjYWxsYmFjayBmb3Igc2Nhbm5pbmcgYXJjaGl2ZXMgJgorICogICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMKKyAqICBmcmVlX3RpbWVzdGFtcHMoKSAtIHdvcmtlciBmdW5jdGlvbiBmb3IgZnJlZWluZyB0aW1lc3RhbXAgdGFibGUgY29udGVudHMKKyAqLworCisjaW5jbHVkZSAiamFtLmgiCisjaW5jbHVkZSAidGltZXN0YW1wLmgiCisKKyNpbmNsdWRlICJmaWxlc3lzLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInBhdGhzeXMuaCIKKyNpbmNsdWRlICJzdHJpbmdzLmgiCisKKworLyoKKyAqIEJJTkRJTkcgLSBhbGwga25vd24gZmlsZXMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfYmluZGluZworeworICAgIE9CSkVDVCAqIG5hbWU7CisgICAgc2hvcnQgZmxhZ3M7CisKKyNkZWZpbmUgQklORF9TQ0FOTkVEICAweDAxICAvKiBpZiBkaXJlY3Rvcnkgb3IgYXJjaCwgaGFzIGJlZW4gc2Nhbm5lZCAqLworCisgICAgc2hvcnQgcHJvZ3Jlc3M7CisKKyNkZWZpbmUgQklORF9JTklUICAgICAwICAvKiBuZXZlciBzZWVuICovCisjZGVmaW5lIEJJTkRfTk9FTlRSWSAgMSAgLyogdGltZXN0YW1wIHJlcXVlc3RlZCBidXQgZmlsZSBuZXZlciBmb3VuZCAqLworI2RlZmluZSBCSU5EX1NQT1RURUQgIDIgIC8qIGZpbGUgZm91bmQgYnV0IG5vdCB0aW1lZCB5ZXQgKi8KKyNkZWZpbmUgQklORF9NSVNTSU5HICAzICAvKiBmaWxlIGZvdW5kIGJ1dCBjYW4gbm90IGdldCB0aW1lc3RhbXAgKi8KKyNkZWZpbmUgQklORF9GT1VORCAgICA0ICAvKiBmaWxlIGZvdW5kIGFuZCB0aW1lIHN0YW1wZWQgKi8KKworICAgIC8qIHVwZGF0ZSB0aW1lIC0gY2xlYXJlZCBpZiB0aGUgdGhlcmUgaXMgbm90aGluZyB0byBiaW5kICovCisgICAgdGltZXN0YW1wIHRpbWU7Cit9IEJJTkRJTkc7CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaCAqIGJpbmRoYXNoID0gMDsKKworc3RhdGljIHZvaWQgdGltZV9lbnRlciggdm9pZCAqLCBPQkpFQ1QgKiwgaW50IGNvbnN0IGZvdW5kLAorICAgIHRpbWVzdGFtcCBjb25zdCAqIGNvbnN0ICk7CisKK3N0YXRpYyBjaGFyICogdGltZV9wcm9ncmVzc1tdID0KK3sKKyAgICAiSU5JVCIsCisgICAgIk5PRU5UUlkiLAorICAgICJTUE9UVEVEIiwKKyAgICAiTUlTU0lORyIsCisgICAgIkZPVU5EIgorfTsKKworCisjaWZkZWYgT1NfTlQKKy8qCisgKiB0aW1lc3RhbXBfZnJvbV9maWxldGltZSgpIC0gV2luZG93cyBGSUxFVElNRSAtLT4gdGltZXN0YW1wIGNvbnZlcnNpb24KKyAqCisgKiBMaWZ0ZWQgc2hhbWVsZXNzbHkgZnJvbSB0aGUgQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbi4KKyAqLworCit2b2lkIHRpbWVzdGFtcF9mcm9tX2ZpbGV0aW1lKCB0aW1lc3RhbXAgKiBjb25zdCB0LCBGSUxFVElNRSBjb25zdCAqIGNvbnN0IGZ0ICkKK3sKKyAgICAvKiBTZWNvbmRzIGJldHdlZW4gMS4xLjE2MDEgYW5kIDEuMS4xOTcwICovCisgICAgc3RhdGljIF9faW50NjQgY29uc3Qgc2Vjc19iZXR3ZWVuX2Vwb2NocyA9IDExNjQ0NDczNjAwOworCisgICAgLyogV2UgY2FuIG5vdCBzaW1wbHkgY2FzdCBhbmQgZGVyZWZlcmVuY2UgYSBGSUxFVElNRSwgc2luY2UgaXQgbWlnaHQgbm90IGJlCisgICAgICogYWxpZ25lZCBwcm9wZXJseS4gX19pbnQ2NCB0eXBlIHZhcmlhYmxlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgYWxpZ25lZCB0byBhbgorICAgICAqIDggYnl0ZSBib3VuZGFyeSB3aGlsZSBGSUxFVElNRSBzdHJ1Y3R1cmVzIG1heSBiZSBhbGlnbmVkIHRvIGFueSA0IGJ5dGUKKyAgICAgKiBib3VuZGFyeS4gVXNpbmcgYW4gaW5jb3JyZWN0bHkgYWxpZ25lZCBfX2ludDY0IHZhcmlhYmxlIG1heSBjYXVzZSBhCisgICAgICogcGVyZm9ybWFuY2UgcGVuYWx0eSBvbiBzb21lIHBsYXRmb3JtcyBvciBldmVuIGV4Y2VwdGlvbnMgb24gb3RoZXJzCisgICAgICogKGRvY3VtZW50ZWQgb24gTVNETikuCisgICAgICovCisgICAgX19pbnQ2NCBpbjsKKyAgICBtZW1jcHkoICZpbiwgZnQsIHNpemVvZiggaW4gKSApOworCisgICAgLyogRklMRVRJTUUgcmVzb2x1dGlvbjogMTAwbnMuICovCisgICAgdGltZXN0YW1wX2luaXQoIHQsICh0aW1lX3QpKCAoIGluIC8gMTAwMDAwMDAgKSAtIHNlY3NfYmV0d2Vlbl9lcG9jaHMgKSwKKyAgICAgICAgKGludCkoIGluICUgMTAwMDAwMDAgKSAqIDEwMCApOworfQorI2VuZGlmICAvKiBPU19OVCAqLworCisKK3ZvaWQgdGltZXN0YW1wX2NsZWFyKCB0aW1lc3RhbXAgKiBjb25zdCB0aW1lICkKK3sKKyAgICB0aW1lLT5zZWNzID0gdGltZS0+bnNlY3MgPSAwOworfQorCisKK2ludCB0aW1lc3RhbXBfY21wKCB0aW1lc3RhbXAgY29uc3QgKiBjb25zdCBsaHMsIHRpbWVzdGFtcCBjb25zdCAqIGNvbnN0IHJocyApCit7CisgICAgcmV0dXJuIGxocy0+c2VjcyA9PSByaHMtPnNlY3MKKyAgICAgICAgPyBsaHMtPm5zZWNzIC0gcmhzLT5uc2VjcworICAgICAgICA6IGxocy0+c2VjcyAtIHJocy0+c2VjczsKK30KKworCit2b2lkIHRpbWVzdGFtcF9jb3B5KCB0aW1lc3RhbXAgKiBjb25zdCB0YXJnZXQsIHRpbWVzdGFtcCBjb25zdCAqIGNvbnN0IHNvdXJjZSApCit7CisgICAgdGFyZ2V0LT5zZWNzID0gc291cmNlLT5zZWNzOworICAgIHRhcmdldC0+bnNlY3MgPSBzb3VyY2UtPm5zZWNzOworfQorCisKK3ZvaWQgdGltZXN0YW1wX2N1cnJlbnQoIHRpbWVzdGFtcCAqIGNvbnN0IHQgKQoreworI2lmZGVmIE9TX05UCisgICAgLyogR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoKSdzIHJlc29sdXRpb24gc2VlbXMgdG8gYmUgYWJvdXQgMTUgbXMgb24gV2luZG93cworICAgICAqIFhQIGFuZCB1bmRlciBhIG1pbGxpc2Vjb25kIG9uIFdpbmRvd3MgNy4KKyAgICAgKi8KKyAgICBGSUxFVElNRSBmdDsKKyAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSggJmZ0ICk7CisgICAgdGltZXN0YW1wX2Zyb21fZmlsZXRpbWUoIHQsICZmdCApOworI2Vsc2UgIC8qIE9TX05UICovCisgICAgdGltZXN0YW1wX2luaXQoIHQsIHRpbWUoIDAgKSwgMCApOworI2VuZGlmICAvKiBPU19OVCAqLworfQorCisKK2ludCB0aW1lc3RhbXBfZW1wdHkoIHRpbWVzdGFtcCBjb25zdCAqIGNvbnN0IHRpbWUgKQoreworICAgIHJldHVybiAhdGltZS0+c2VjcyAmJiAhdGltZS0+bnNlY3M7Cit9CisKKworLyoKKyAqIHRpbWVzdGFtcF9mcm9tX3BhdGgoKSAtIHJldHVybiB0aW1lc3RhbXAgZm9yIGEgcGF0aCwgaWYgcHJlc2VudAorICovCisKK3ZvaWQgdGltZXN0YW1wX2Zyb21fcGF0aCggdGltZXN0YW1wICogY29uc3QgdGltZSwgT0JKRUNUICogY29uc3QgcGF0aCApCit7CisgICAgUFJPRklMRV9FTlRFUiggdGltZXN0YW1wICk7CisKKyAgICBQQVRITkFNRSBmMTsKKyAgICBQQVRITkFNRSBmMjsKKyAgICBpbnQgZm91bmQ7CisgICAgQklORElORyAqIGI7CisgICAgc3RyaW5nIGJ1ZlsgMSBdOworCisKKyAgICBpZiAoIGZpbGVfdGltZSggcGF0aCwgdGltZSApIDwgMCApCisgICAgICAgIHRpbWVzdGFtcF9jbGVhciggdGltZSApOworCisgICAgUFJPRklMRV9FWElUKCB0aW1lc3RhbXAgKTsKK30KKworCit2b2lkIHRpbWVzdGFtcF9pbml0KCB0aW1lc3RhbXAgKiBjb25zdCB0aW1lLCB0aW1lX3QgY29uc3Qgc2VjcywgaW50IGNvbnN0IG5zZWNzCisgICAgKQoreworICAgIHRpbWUtPnNlY3MgPSBzZWNzOworICAgIHRpbWUtPm5zZWNzID0gbnNlY3M7Cit9CisKKwordm9pZCB0aW1lc3RhbXBfbWF4KCB0aW1lc3RhbXAgKiBjb25zdCBtYXgsIHRpbWVzdGFtcCBjb25zdCAqIGNvbnN0IGxocywKKyAgICB0aW1lc3RhbXAgY29uc3QgKiBjb25zdCByaHMgKQoreworICAgIGlmICggdGltZXN0YW1wX2NtcCggbGhzLCByaHMgKSA+IDAgKQorICAgICAgICB0aW1lc3RhbXBfY29weSggbWF4LCBsaHMgKTsKKyAgICBlbHNlCisgICAgICAgIHRpbWVzdGFtcF9jb3B5KCBtYXgsIHJocyApOworfQorCisKK3N0YXRpYyBjaGFyIGNvbnN0ICogdGltZXN0YW1wX2Zvcm1hdHN0ciggdGltZXN0YW1wIGNvbnN0ICogY29uc3QgdGltZSwKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZm9ybWF0ICkKK3sKKyAgICBzdGF0aWMgY2hhciByZXN1bHQxWyA1MDAgXTsKKyAgICBzdGF0aWMgY2hhciByZXN1bHQyWyA1MDAgXTsKKyAgICBzdHJmdGltZSggcmVzdWx0MSwgc2l6ZW9mKCByZXN1bHQxICkgLyBzaXplb2YoICpyZXN1bHQxICksIGZvcm1hdCwgZ210aW1lKAorICAgICAgICAmdGltZS0+c2VjcyApICk7CisgICAgc3ByaW50ZiggcmVzdWx0MiwgcmVzdWx0MSwgdGltZS0+bnNlY3MgKTsKKyAgICByZXR1cm4gcmVzdWx0MjsKK30KKworCitjaGFyIGNvbnN0ICogdGltZXN0YW1wX3N0ciggdGltZXN0YW1wIGNvbnN0ICogY29uc3QgdGltZSApCit7CisgICAgcmV0dXJuIHRpbWVzdGFtcF9mb3JtYXRzdHIoIHRpbWUsICIlWS0lbS0lZCAlSDolTTolUy4lJTA5ZCArMDAwMCIgKTsKK30KKworCitjaGFyIGNvbnN0ICogdGltZXN0YW1wX3RpbWVzdHIoIHRpbWVzdGFtcCBjb25zdCAqIGNvbnN0IHRpbWUgKQoreworICAgIHJldHVybiB0aW1lc3RhbXBfZm9ybWF0c3RyKCB0aW1lLCAiJUg6JU06JVMuJSUwOWQiICk7Cit9CisKKworLyoKKyAqIHRpbWVfZW50ZXIoKSAtIGludGVybmFsIHdvcmtlciBjYWxsYmFjayBmb3Igc2Nhbm5pbmcgYXJjaGl2ZXMgJiBkaXJlY3RvcmllcworICovCisKK3N0YXRpYyB2b2lkIHRpbWVfZW50ZXIoIHZvaWQgKiBjbG9zdXJlLCBPQkpFQ1QgKiB0YXJnZXQsIGludCBjb25zdCBmb3VuZCwKKyAgICB0aW1lc3RhbXAgY29uc3QgKiBjb25zdCB0aW1lICkKK3sKKyAgICBpbnQgaXRlbV9mb3VuZDsKKyAgICBCSU5ESU5HICogYjsKKyAgICBzdHJ1Y3QgaGFzaCAqIGNvbnN0IGJpbmRoYXNoID0gKHN0cnVjdCBoYXNoICopY2xvc3VyZTsKKworICAgIHRhcmdldCA9IHBhdGhfYXNfa2V5KCB0YXJnZXQgKTsKKworICAgIGIgPSAoQklORElORyAqKWhhc2hfaW5zZXJ0KCBiaW5kaGFzaCwgdGFyZ2V0LCAmaXRlbV9mb3VuZCApOworICAgIGlmICggIWl0ZW1fZm91bmQgKQorICAgIHsKKyAgICAgICAgYi0+bmFtZSA9IG9iamVjdF9jb3B5KCB0YXJnZXQgKTsKKyAgICAgICAgYi0+ZmxhZ3MgPSAwOworICAgIH0KKworICAgIHRpbWVzdGFtcF9jb3B5KCAmYi0+dGltZSwgdGltZSApOworICAgIGItPnByb2dyZXNzID0gZm91bmQgPyBCSU5EX0ZPVU5EIDogQklORF9TUE9UVEVEOworCisgICAgaWYgKCBERUJVR19CSU5EU0NBTiApCisgICAgICAgIHByaW50ZiggInRpbWUgKCAlcyApIDogJXNcbiIsIG9iamVjdF9zdHIoIHRhcmdldCApLCB0aW1lX3Byb2dyZXNzWworICAgICAgICAgICAgYi0+cHJvZ3Jlc3MgXSApOworCisgICAgb2JqZWN0X2ZyZWUoIHRhcmdldCApOworfQorCisKKy8qCisgKiBmcmVlX3RpbWVzdGFtcHMoKSAtIHdvcmtlciBmdW5jdGlvbiBmb3IgZnJlZWluZyB0aW1lc3RhbXAgdGFibGUgY29udGVudHMKKyAqLworCitzdGF0aWMgdm9pZCBmcmVlX3RpbWVzdGFtcHMoIHZvaWQgKiB4YmluZGluZywgdm9pZCAqIGRhdGEgKQoreworICAgIG9iamVjdF9mcmVlKCAoIChCSU5ESU5HICopeGJpbmRpbmcgKS0+bmFtZSApOworfQorCisKKy8qCisgKiB0aW1lc3RhbXBfZG9uZSgpIC0gZnJlZSB0aW1lc3RhbXAgdGFibGVzCisgKi8KKwordm9pZCB0aW1lc3RhbXBfZG9uZSgpCit7CisgICAgaWYgKCBiaW5kaGFzaCApCisgICAgeworICAgICAgICBoYXNoZW51bWVyYXRlKCBiaW5kaGFzaCwgZnJlZV90aW1lc3RhbXBzLCAwICk7CisgICAgICAgIGhhc2hkb25lKCBiaW5kaGFzaCApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3RpbWVzdGFtcC5oIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvdGltZXN0YW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmMTMxMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3RpbWVzdGFtcC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NSBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qCisgKiB0aW1lc3RhbXAuaCAtIGdldCB0aGUgdGltZXN0YW1wIG9mIGEgZmlsZSBvciBhcmNoaXZlIG1lbWJlcgorICovCisKKyNpZm5kZWYgVElNRVNUQU1QX0hfU1dfMjAxMV8xMV8xOAorI2RlZmluZSBUSU1FU1RBTVBfSF9TV18yMDExXzExXzE4CisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworI2lmZGVmIE9TX05UCisjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGltZS5oPgorCit0eXBlZGVmIHN0cnVjdCB0aW1lc3RhbXAKK3sKKyAgICB0aW1lX3Qgc2VjczsKKyAgICBpbnQgbnNlY3M7Cit9IHRpbWVzdGFtcDsKKwordm9pZCB0aW1lc3RhbXBfY2xlYXIoIHRpbWVzdGFtcCAqIGNvbnN0ICk7CitpbnQgdGltZXN0YW1wX2NtcCggdGltZXN0YW1wIGNvbnN0ICogY29uc3QgbGhzLCB0aW1lc3RhbXAgY29uc3QgKiBjb25zdCByaHMgKTsKK3ZvaWQgdGltZXN0YW1wX2NvcHkoIHRpbWVzdGFtcCAqIGNvbnN0IHRhcmdldCwgdGltZXN0YW1wIGNvbnN0ICogY29uc3Qgc291cmNlICk7Cit2b2lkIHRpbWVzdGFtcF9jdXJyZW50KCB0aW1lc3RhbXAgKiBjb25zdCApOworaW50IHRpbWVzdGFtcF9lbXB0eSggdGltZXN0YW1wIGNvbnN0ICogY29uc3QgKTsKK3ZvaWQgdGltZXN0YW1wX2Zyb21fcGF0aCggdGltZXN0YW1wICogY29uc3QsIE9CSkVDVCAqIGNvbnN0IHBhdGggKTsKK3ZvaWQgdGltZXN0YW1wX2luaXQoIHRpbWVzdGFtcCAqIGNvbnN0LCB0aW1lX3QgY29uc3Qgc2VjcywgaW50IGNvbnN0IG5zZWNzICk7Cit2b2lkIHRpbWVzdGFtcF9tYXgoIHRpbWVzdGFtcCAqIGNvbnN0IG1heCwgdGltZXN0YW1wIGNvbnN0ICogY29uc3QgbGhzLAorICAgIHRpbWVzdGFtcCBjb25zdCAqIGNvbnN0IHJocyApOworY2hhciBjb25zdCAqIHRpbWVzdGFtcF9zdHIoIHRpbWVzdGFtcCBjb25zdCAqIGNvbnN0ICk7CitjaGFyIGNvbnN0ICogdGltZXN0YW1wX3RpbWVzdHIoIHRpbWVzdGFtcCBjb25zdCAqIGNvbnN0ICk7CisKKyNpZmRlZiBPU19OVAordm9pZCB0aW1lc3RhbXBfZnJvbV9maWxldGltZSggdGltZXN0YW1wICogY29uc3QsIEZJTEVUSU1FIGNvbnN0ICogY29uc3QgKTsKKyNlbmRpZgorCit2b2lkIHRpbWVzdGFtcF9kb25lKCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUvdmFyaWFibGUuYyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3ZhcmlhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyOTJmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3ZhcmlhYmxlLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMjAwMCBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qIFRoaXMgZmlsZSBpcyBBTFNPOgorICogQ29weXJpZ2h0IDIwMDEtMjAwNCBEYXZpZCBBYnJhaGFtcy4KKyAqIENvcHlyaWdodCAyMDA1IFJlZWNlIEguIER1bm4uCisgKiBDb3B5cmlnaHQgMjAwNSBSZW5lIFJpdmVyYS4KKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyAqIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisvKgorICogdmFyaWFibGUuYyAtIGhhbmRsZSBKYW0gbXVsdGktZWxlbWVudCB2YXJpYWJsZXMuCisgKgorICogRXh0ZXJuYWwgcm91dGluZXM6CisgKgorICogIHZhcl9kZWZpbmVzKCkgLSBsb2FkIGEgYnVuY2ggb2YgdmFyaWFibGU9dmFsdWUgc2V0dGluZ3MKKyAqICB2YXJfZ2V0KCkgICAgIC0gZ2V0IHZhbHVlIG9mIGEgdXNlciBkZWZpbmVkIHN5bWJvbAorICogIHZhcl9zZXQoKSAgICAgLSBzZXQgYSB2YXJpYWJsZSBpbiBqYW0ncyB1c2VyIGRlZmluZWQgc3ltYm9sIHRhYmxlLgorICogIHZhcl9zd2FwKCkgICAgLSBzd2FwIGEgdmFyaWFibGUncyB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBvbmUKKyAqICB2YXJfZG9uZSgpICAgIC0gZnJlZSB2YXJpYWJsZSB0YWJsZXMKKyAqCisgKiBJbnRlcm5hbCByb3V0aW5lczoKKyAqCisgKiAgdmFyX2VudGVyKCkgLSBtYWtlIG5ldyB2YXIgc3ltYm9sIHRhYmxlIGVudHJ5LCByZXR1cm5pbmcgdmFyIHB0cgorICogIHZhcl9kdW1wKCkgIC0gZHVtcCBhIHZhcmlhYmxlIHRvIHN0ZG91dAorICovCisKKyNpbmNsdWRlICJqYW0uaCIKKyNpbmNsdWRlICJ2YXJpYWJsZS5oIgorCisjaW5jbHVkZSAiZmlsZXN5cy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJtb2R1bGVzLmgiCisjaW5jbHVkZSAicGFyc2UuaCIKKyNpbmNsdWRlICJwYXRoc3lzLmgiCisjaW5jbHVkZSAic3RyaW5ncy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisvKgorICogVkFSSUFCTEUgLSBhIHVzZXIgZGVmaW5lZCBtdWx0aS12YWx1ZSB2YXJpYWJsZQorICovCisKK3R5cGVkZWYgc3RydWN0IF92YXJpYWJsZSBWQVJJQUJMRSA7CisKK3N0cnVjdCBfdmFyaWFibGUKK3sKKyAgICBPQkpFQ1QgKiBzeW1ib2w7CisgICAgTElTVCAgICogdmFsdWU7Cit9OworCitzdGF0aWMgTElTVCAqICogdmFyX2VudGVyKCBzdHJ1Y3QgbW9kdWxlX3QgKiwgT0JKRUNUICogc3ltYm9sICk7CitzdGF0aWMgdm9pZCB2YXJfZHVtcCggT0JKRUNUICogc3ltYm9sLCBMSVNUICogdmFsdWUsIGNoYXIgKiB3aGF0ICk7CisKKworLyoKKyAqIHZhcl9kZWZpbmVzKCkgLSBsb2FkIGEgYnVuY2ggb2YgdmFyaWFibGU9dmFsdWUgc2V0dGluZ3MKKyAqCisgKiBJZiBwcmVwcm9jZXNzIGlzIGZhbHNlLCB0YWtlIHRoZSB2YWx1ZSB2ZXJiYXRpbS4KKyAqCisgKiBPdGhlcndpc2UsIGlmIHRoZSB2YXJpYWJsZSB2YWx1ZSBpcyBlbmNsb3NlZCBpbiBxdW90ZXMsIHN0cmlwIHRoZSBxdW90ZXMuCisgKiBPdGhlcndpc2UsIGlmIHZhcmlhYmxlIG5hbWUgZW5kcyBpbiBQQVRILCBzcGxpdCB2YWx1ZSBhdCA6J3MuCisgKiBPdGhlcndpc2UsIHNwbGl0IHRoZSB2YWx1ZSBhdCBibGFua3MuCisgKi8KKwordm9pZCB2YXJfZGVmaW5lcyggc3RydWN0IG1vZHVsZV90ICogbW9kdWxlLCBjaGFyICogY29uc3QgKiBlLCBpbnQgcHJlcHJvY2VzcyApCit7CisgICAgc3RyaW5nIGJ1ZlsgMSBdOworCisgICAgc3RyaW5nX25ldyggYnVmICk7CisKKyAgICBmb3IgKCA7ICplOyArK2UgKQorICAgIHsKKyAgICAgICAgY2hhciAqIHZhbDsKKworICAgICAgICBpZiAoICggdmFsID0gc3RyY2hyKCAqZSwgJz0nICkgKQorI2lmIGRlZmluZWQoIE9TX01BQyApCisgICAgICAgICAgICAvKiBPbiB0aGUgbWFjIChNUFcpLCB0aGUgdmFyPXZhbCBpcyBhY3R1YWxseSB2YXJcMHZhbCAqLworICAgICAgICAgICAgLyogVGhpbmsgZGlmZmVyZW50LiAqLworICAgICAgICAgICAgfHwgKCB2YWwgPSAqZSArIHN0cmxlbiggKmUgKSApCisjZW5kaWYKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBMSVNUICogbCA9IEwwOworICAgICAgICAgICAgc2l6ZV90IGNvbnN0IGxlbiA9IHN0cmxlbiggdmFsICsgMSApOworICAgICAgICAgICAgaW50IGNvbnN0IHF1b3RlZCA9ICggdmFsWyAxIF0gPT0gJyInICkgJiYgKCB2YWxbIGxlbiBdID09ICciJyApICYmCisgICAgICAgICAgICAgICAgKCBsZW4gPiAxICk7CisKKyAgICAgICAgICAgIGlmICggcXVvdGVkICYmIHByZXByb2Nlc3MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZ19hcHBlbmRfcmFuZ2UoIGJ1ZiwgdmFsICsgMiwgdmFsICsgbGVuICk7CisgICAgICAgICAgICAgICAgbCA9IGxpc3RfcHVzaF9iYWNrKCBsLCBvYmplY3RfbmV3KCBidWYtPnZhbHVlICkgKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdHJ1bmNhdGUoIGJ1ZiwgMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgKiBwOworICAgICAgICAgICAgICAgIGNoYXIgKiBwcDsKKyAgICAgICAgICAgICAgICBjaGFyIHNwbGl0ID0KKyNpZiBkZWZpbmVkKCBPUFRfTk9fRVhURVJOQUxfVkFSSUFCTEVfU1BMSVQgKQorICAgICAgICAgICAgICAgICAgICAnXDAnCisjZWxpZiBkZWZpbmVkKCBPU19NQUMgKQorICAgICAgICAgICAgICAgICAgICAnLCcKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICcgJworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgICAgIC8qIFNwbGl0ICpQQVRIIGF0IDoncywgbm90IHNwYWNlcy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoIHZhbCAtIDQgPj0gKmUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhc3RybmNtcCggdmFsIC0gNCwgIlBBVEgiLCA0ICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICFzdHJuY21wKCB2YWwgLSA0LCAiUGF0aCIsIDQgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cm5jbXAoIHZhbCAtIDQsICJwYXRoIiwgNCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gU1BMSVRQQVRIOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIERvIHRoZSBzcGxpdC4gKi8KKyAgICAgICAgICAgICAgICBmb3IKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgIHBwID0gdmFsICsgMTsKKyAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2VzcyAmJiAoICggcCA9IHN0cmNociggcHAsIHNwbGl0ICkgKSAhPSAwICk7CisgICAgICAgICAgICAgICAgICAgIHBwID0gcCArIDEKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYXBwZW5kX3JhbmdlKCBidWYsIHBwLCBwICk7CisgICAgICAgICAgICAgICAgICAgIGwgPSBsaXN0X3B1c2hfYmFjayggbCwgb2JqZWN0X25ldyggYnVmLT52YWx1ZSApICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190cnVuY2F0ZSggYnVmLCAwICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbCA9IGxpc3RfcHVzaF9iYWNrKCBsLCBvYmplY3RfbmV3KCBwcCApICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEdldCBuYW1lLiAqLworICAgICAgICAgICAgc3RyaW5nX2FwcGVuZF9yYW5nZSggYnVmLCAqZSwgdmFsICk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT0JKRUNUICogY29uc3QgdmFybmFtZSA9IG9iamVjdF9uZXcoIGJ1Zi0+dmFsdWUgKTsKKyAgICAgICAgICAgICAgICB2YXJfc2V0KCBtb2R1bGUsIHZhcm5hbWUsIGwsIFZBUl9TRVQgKTsKKyAgICAgICAgICAgICAgICBvYmplY3RfZnJlZSggdmFybmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nX3RydW5jYXRlKCBidWYsIDAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdHJpbmdfZnJlZSggYnVmICk7Cit9CisKKworLyogTGFzdCByZXR1cm5lZCB2YXJpYWJsZSB2YWx1ZSBzYXZlZCBzbyB3ZSBtYXkgY2xlYXIgaXQgaW4gdmFyX2RvbmUoKS4gKi8KK3N0YXRpYyBMSVNUICogc2F2ZWRfdmFyID0gTDA7CisKKworLyoKKyAqIHZhcl9nZXQoKSAtIGdldCB2YWx1ZSBvZiBhIHVzZXIgZGVmaW5lZCBzeW1ib2wKKyAqCisgKiBSZXR1cm5zIE5VTEwgaWYgc3ltYm9sIHVuc2V0LgorICovCisKK0xJU1QgKiB2YXJfZ2V0KCBzdHJ1Y3QgbW9kdWxlX3QgKiBtb2R1bGUsIE9CSkVDVCAqIHN5bWJvbCApCit7CisgICAgTElTVCAqIHJlc3VsdCA9IEwwOworI2lmZGVmIE9QVF9BVF9GSUxFUworICAgIC8qIFNvbWUgImZpeGVkIiB2YXJpYWJsZXMuLi4gKi8KKyAgICBpZiAoIG9iamVjdF9lcXVhbCggc3ltYm9sLCBjb25zdGFudF9UTVBESVIgKSApCisgICAgeworICAgICAgICBsaXN0X2ZyZWUoIHNhdmVkX3ZhciApOworICAgICAgICByZXN1bHQgPSBzYXZlZF92YXIgPSBsaXN0X25ldyggb2JqZWN0X25ldyggcGF0aF90bXBkaXIoKS0+dmFsdWUgKSApOworICAgIH0KKyAgICBlbHNlIGlmICggb2JqZWN0X2VxdWFsKCBzeW1ib2wsIGNvbnN0YW50X1RNUE5BTUUgKSApCisgICAgeworICAgICAgICBsaXN0X2ZyZWUoIHNhdmVkX3ZhciApOworICAgICAgICByZXN1bHQgPSBzYXZlZF92YXIgPSBsaXN0X25ldyggcGF0aF90bXBuYW0oKSApOworICAgIH0KKyAgICBlbHNlIGlmICggb2JqZWN0X2VxdWFsKCBzeW1ib2wsIGNvbnN0YW50X1RNUEZJTEUgKSApCisgICAgeworICAgICAgICBsaXN0X2ZyZWUoIHNhdmVkX3ZhciApOworICAgICAgICByZXN1bHQgPSBzYXZlZF92YXIgPSBsaXN0X25ldyggcGF0aF90bXBmaWxlKCkgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIG9iamVjdF9lcXVhbCggc3ltYm9sLCBjb25zdGFudF9TVERPVVQgKSApCisgICAgeworICAgICAgICBsaXN0X2ZyZWUoIHNhdmVkX3ZhciApOworICAgICAgICByZXN1bHQgPSBzYXZlZF92YXIgPSBsaXN0X25ldyggb2JqZWN0X2NvcHkoIGNvbnN0YW50X1NURE9VVCApICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBvYmplY3RfZXF1YWwoIHN5bWJvbCwgY29uc3RhbnRfU1RERVJSICkgKQorICAgIHsKKyAgICAgICAgbGlzdF9mcmVlKCBzYXZlZF92YXIgKTsKKyAgICAgICAgcmVzdWx0ID0gc2F2ZWRfdmFyID0gbGlzdF9uZXcoIG9iamVjdF9jb3B5KCBjb25zdGFudF9TVERFUlIgKSApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIFZBUklBQkxFICogdjsKKyAgICAgICAgaW50IG47CisKKyAgICAgICAgaWYgKCAoIG4gPSBtb2R1bGVfZ2V0X2ZpeGVkX3ZhciggbW9kdWxlLCBzeW1ib2wgKSApICE9IC0xICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBERUJVR19WQVJHRVQgKQorICAgICAgICAgICAgICAgIHZhcl9kdW1wKCBzeW1ib2wsIG1vZHVsZS0+Zml4ZWRfdmFyaWFibGVzWyBuIF0sICJnZXQiICk7CisgICAgICAgICAgICByZXN1bHQgPSBtb2R1bGUtPmZpeGVkX3ZhcmlhYmxlc1sgbiBdOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBtb2R1bGUtPnZhcmlhYmxlcyAmJiAoIHYgPSAoVkFSSUFCTEUgKiloYXNoX2ZpbmQoCisgICAgICAgICAgICBtb2R1bGUtPnZhcmlhYmxlcywgc3ltYm9sICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggREVCVUdfVkFSR0VUICkKKyAgICAgICAgICAgICAgICB2YXJfZHVtcCggdi0+c3ltYm9sLCB2LT52YWx1ZSwgImdldCIgKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHYtPnZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworTElTVCAqIHZhcl9nZXRfYW5kX2NsZWFyX3JhdyggbW9kdWxlX3QgKiBtb2R1bGUsIE9CSkVDVCAqIHN5bWJvbCApCit7CisgICAgTElTVCAqIHJlc3VsdCA9IEwwOworICAgIFZBUklBQkxFICogdjsKKworICAgIGlmICggbW9kdWxlLT52YXJpYWJsZXMgJiYgKCB2ID0gKFZBUklBQkxFICopaGFzaF9maW5kKCBtb2R1bGUtPnZhcmlhYmxlcywKKyAgICAgICAgc3ltYm9sICkgKSApCisgICAgeworICAgICAgICByZXN1bHQgPSB2LT52YWx1ZTsKKyAgICAgICAgdi0+dmFsdWUgPSBMMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiB2YXJfc2V0KCkgLSBzZXQgYSB2YXJpYWJsZSBpbiBKYW0ncyB1c2VyIGRlZmluZWQgc3ltYm9sIHRhYmxlCisgKgorICogJ2ZsYWcnIGNvbnRyb2xzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBuZXcgYW5kIG9sZCB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxlOgorICogU0VUIHJlcGxhY2VzIHRoZSBvbGQgd2l0aCB0aGUgbmV3OyBBUFBFTkQgYXBwZW5kcyB0aGUgbmV3IHRvIHRoZSBvbGQ7IERFRkFVTFQKKyAqIG9ubHkgdXNlcyB0aGUgbmV3IGlmIHRoZSB2YXJpYWJsZSB3YXMgcHJldmlvdXNseSB1bnNldC4KKyAqCisgKiBDb3BpZXMgc3ltYm9sLiBUYWtlcyBvd25lcnNoaXAgb2YgdmFsdWUuCisgKi8KKwordm9pZCB2YXJfc2V0KCBzdHJ1Y3QgbW9kdWxlX3QgKiBtb2R1bGUsIE9CSkVDVCAqIHN5bWJvbCwgTElTVCAqIHZhbHVlLCBpbnQgZmxhZworICAgICkKK3sKKyAgICBMSVNUICogKiB2ID0gdmFyX2VudGVyKCBtb2R1bGUsIHN5bWJvbCApOworCisgICAgaWYgKCBERUJVR19WQVJTRVQgKQorICAgICAgICB2YXJfZHVtcCggc3ltYm9sLCB2YWx1ZSwgInNldCIgKTsKKworICAgIHN3aXRjaCAoIGZsYWcgKQorICAgIHsKKyAgICBjYXNlIFZBUl9TRVQ6ICAvKiBSZXBsYWNlIHZhbHVlICovCisgICAgICAgIGxpc3RfZnJlZSggKnYgKTsKKyAgICAgICAgKnYgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFZBUl9BUFBFTkQ6ICAvKiBBcHBlbmQgdmFsdWUgKi8KKyAgICAgICAgKnYgPSBsaXN0X2FwcGVuZCggKnYsIHZhbHVlICk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWQVJfREVGQVVMVDogIC8qIFNldCBvbmx5IGlmIHVuc2V0ICovCisgICAgICAgIGlmICggbGlzdF9lbXB0eSggKnYgKSApCisgICAgICAgICAgICAqdiA9IHZhbHVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaXN0X2ZyZWUoIHZhbHVlICk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCisvKgorICogdmFyX3N3YXAoKSAtIHN3YXAgYSB2YXJpYWJsZSdzIHZhbHVlIHdpdGggdGhlIGdpdmVuIG9uZQorICovCisKK0xJU1QgKiB2YXJfc3dhcCggc3RydWN0IG1vZHVsZV90ICogbW9kdWxlLCBPQkpFQ1QgKiBzeW1ib2wsIExJU1QgKiB2YWx1ZSApCit7CisgICAgTElTVCAqICogdiA9IHZhcl9lbnRlciggbW9kdWxlLCBzeW1ib2wgKTsKKyAgICBMSVNUICogb2xkdmFsdWUgPSAqdjsKKyAgICBpZiAoIERFQlVHX1ZBUlNFVCApCisgICAgICAgIHZhcl9kdW1wKCBzeW1ib2wsIHZhbHVlLCAic2V0IiApOworICAgICp2ID0gdmFsdWU7CisgICAgcmV0dXJuIG9sZHZhbHVlOworfQorCisKKy8qCisgKiB2YXJfZW50ZXIoKSAtIG1ha2UgbmV3IHZhciBzeW1ib2wgdGFibGUgZW50cnksIHJldHVybmluZyB2YXIgcHRyCisgKi8KKworc3RhdGljIExJU1QgKiAqIHZhcl9lbnRlciggc3RydWN0IG1vZHVsZV90ICogbW9kdWxlLCBPQkpFQ1QgKiBzeW1ib2wgKQoreworICAgIGludCBmb3VuZDsKKyAgICBWQVJJQUJMRSAqIHY7CisgICAgaW50IG47CisKKyAgICBpZiAoICggbiA9IG1vZHVsZV9nZXRfZml4ZWRfdmFyKCBtb2R1bGUsIHN5bWJvbCApICkgIT0gLTEgKQorICAgICAgICByZXR1cm4gJm1vZHVsZS0+Zml4ZWRfdmFyaWFibGVzWyBuIF07CisKKyAgICBpZiAoICFtb2R1bGUtPnZhcmlhYmxlcyApCisgICAgICAgIG1vZHVsZS0+dmFyaWFibGVzID0gaGFzaGluaXQoIHNpemVvZiggVkFSSUFCTEUgKSwgInZhcmlhYmxlcyIgKTsKKworICAgIHYgPSAoVkFSSUFCTEUgKiloYXNoX2luc2VydCggbW9kdWxlLT52YXJpYWJsZXMsIHN5bWJvbCwgJmZvdW5kICk7CisgICAgaWYgKCAhZm91bmQgKQorICAgIHsKKyAgICAgICAgdi0+c3ltYm9sID0gb2JqZWN0X2NvcHkoIHN5bWJvbCApOworICAgICAgICB2LT52YWx1ZSA9IEwwOworICAgIH0KKworICAgIHJldHVybiAmdi0+dmFsdWU7Cit9CisKKworLyoKKyAqIHZhcl9kdW1wKCkgLSBkdW1wIGEgdmFyaWFibGUgdG8gc3Rkb3V0CisgKi8KKworc3RhdGljIHZvaWQgdmFyX2R1bXAoIE9CSkVDVCAqIHN5bWJvbCwgTElTVCAqIHZhbHVlLCBjaGFyICogd2hhdCApCit7CisgICAgcHJpbnRmKCAiJXMgJXMgPSAiLCB3aGF0LCBvYmplY3Rfc3RyKCBzeW1ib2wgKSApOworICAgIGxpc3RfcHJpbnQoIHZhbHVlICk7CisgICAgcHJpbnRmKCAiXG4iICk7Cit9CisKKworLyoKKyAqIHZhcl9kb25lKCkgLSBmcmVlIHZhcmlhYmxlIHRhYmxlcworICovCisKK3N0YXRpYyB2b2lkIGRlbGV0ZV92YXJfKCB2b2lkICogeHZhciwgdm9pZCAqIGRhdGEgKQoreworICAgIFZBUklBQkxFICogY29uc3QgdiA9IChWQVJJQUJMRSAqKXh2YXI7CisgICAgb2JqZWN0X2ZyZWUoIHYtPnN5bWJvbCApOworICAgIGxpc3RfZnJlZSggdi0+dmFsdWUgKTsKK30KKwordm9pZCB2YXJfZG9uZSggc3RydWN0IG1vZHVsZV90ICogbW9kdWxlICkKK3sKKyAgICBsaXN0X2ZyZWUoIHNhdmVkX3ZhciApOworICAgIHNhdmVkX3ZhciA9IEwwOworICAgIGhhc2hlbnVtZXJhdGUoIG1vZHVsZS0+dmFyaWFibGVzLCBkZWxldGVfdmFyXywgMCApOworICAgIGhhc2hfZnJlZSggbW9kdWxlLT52YXJpYWJsZXMgKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3ZhcmlhYmxlLmggYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS92YXJpYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYjQ1MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS92YXJpYWJsZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MywgMjAwMCBDaHJpc3RvcGhlciBTZWl3YWxkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphbSAtIHNlZSBqYW0uYyBmb3IgQ29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qCisgKiB2YXJpYWJsZS5oIC0gaGFuZGxlIGphbSBtdWx0aS1lbGVtZW50IHZhcmlhYmxlcworICovCisKKyNpZm5kZWYgVkFSSUFCTEVfU1cyMDExMTExOV9ICisjZGVmaW5lIFZBUklBQkxFX1NXMjAxMTExMTlfSAorCisjaW5jbHVkZSAibGlzdHMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKworCitzdHJ1Y3QgbW9kdWxlX3Q7CisKK3ZvaWQgICB2YXJfZGVmaW5lcyggc3RydWN0IG1vZHVsZV90ICosIGNoYXIgKiBjb25zdCAqIGUsIGludCBwcmVwcm9jZXNzICk7CitMSVNUICogdmFyX2dldCggc3RydWN0IG1vZHVsZV90ICosIE9CSkVDVCAqIHN5bWJvbCApOwordm9pZCAgIHZhcl9zZXQoIHN0cnVjdCBtb2R1bGVfdCAqLCBPQkpFQ1QgKiBzeW1ib2wsIExJU1QgKiB2YWx1ZSwgaW50IGZsYWcgKTsKK0xJU1QgKiB2YXJfc3dhcCggc3RydWN0IG1vZHVsZV90ICosIE9CSkVDVCAqIHN5bWJvbCwgTElTVCAqIHZhbHVlICk7Cit2b2lkICAgdmFyX2RvbmUoIHN0cnVjdCBtb2R1bGVfdCAqICk7CisKKy8qCisgKiBEZWZpbmVzIGZvciB2YXJfc2V0KCkuCisgKi8KKworI2RlZmluZSBWQVJfU0VUICAgICAgMCAgIC8qIG92ZXJyaWRlIHByZXZpb3VzIHZhbHVlICovCisjZGVmaW5lIFZBUl9BUFBFTkQgICAxICAgLyogYXBwZW5kIHRvIHByZXZpb3VzIHZhbHVlICovCisjZGVmaW5lIFZBUl9ERUZBVUxUICAyICAgLyogc2V0IG9ubHkgaWYgbm8gcHJldmlvdXMgdmFsdWUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS93MzJfZ2V0cmVnLmMgYi9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS93MzJfZ2V0cmVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyZDBmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvZW5naW5lL3czMl9nZXRyZWcuYwpAQCAtMCwwICsxLDIwMSBAQAorLyoKK0NvcHlyaWdodCBQYXVsIExpbiAyMDAzLiBDb3B5cmlnaHQgMjAwNiBCb2phbiBSZXNuaWsuCitEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCitmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyovCisKKyMgaW5jbHVkZSAiamFtLmgiCisKKyMgaWYgZGVmaW5lZCggT1NfTlQgKSB8fCBkZWZpbmVkKCBPU19DWUdXSU4gKQorCisjIGluY2x1ZGUgImxpc3RzLmgiCisjIGluY2x1ZGUgIm9iamVjdC5oIgorIyBpbmNsdWRlICJwYXJzZS5oIgorIyBpbmNsdWRlICJmcmFtZXMuaCIKKyMgaW5jbHVkZSAic3RyaW5ncy5oIgorCisjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKworIyBkZWZpbmUgIE1BWF9SRUdJU1RSWV9EQVRBX0xFTkdUSCA0MDk2CisjIGRlZmluZSAgTUFYX1JFR0lTVFJZX0tFWU5BTUVfTEVOR1RIIDI1NgorIyBkZWZpbmUgIE1BWF9SRUdJU1RSWV9WQUxVRU5BTUVfTEVOR1RIIDE2Mzg0CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFBDU1RSICBuYW1lOworICAgIEhLRVkgICAgdmFsdWU7Cit9IEtleU1hcDsKKworc3RhdGljIGNvbnN0IEtleU1hcCBkbFJvb3RLZXlzW10gPSB7CisgICAgeyAiSEtMTSIsIEhLRVlfTE9DQUxfTUFDSElORSB9LAorICAgIHsgIkhLQ1UiLCBIS0VZX0NVUlJFTlRfVVNFUiB9LAorICAgIHsgIkhLQ1IiLCBIS0VZX0NMQVNTRVNfUk9PVCB9LAorICAgIHsgIkhLRVlfTE9DQUxfTUFDSElORSIsIEhLRVlfTE9DQUxfTUFDSElORSB9LAorICAgIHsgIkhLRVlfQ1VSUkVOVF9VU0VSIiwgSEtFWV9DVVJSRU5UX1VTRVIgfSwKKyAgICB7ICJIS0VZX0NMQVNTRVNfUk9PVCIsIEhLRVlfQ0xBU1NFU19ST09UIH0sCisgICAgeyAwLCAwIH0KK307CisKK3N0YXRpYyBIS0VZIGdldF9rZXkoY2hhciBjb25zdCoqIHBhdGgpCit7CisgICAgY29uc3QgS2V5TWFwICpwOworCisgICAgZm9yIChwID0gZGxSb290S2V5czsgcC0+bmFtZTsgKytwKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzdHJsZW4ocC0+bmFtZSk7CisgICAgICAgIGlmICghc3RybmNtcCgqcGF0aCxwLT5uYW1lLG4pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKCpwYXRoKVtuXSA9PSAnXFwnIHx8ICgqcGF0aClbbl0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcGF0aCArPSBuICsgMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwLT52YWx1ZTsKK30KKworTElTVCAqIGJ1aWx0aW5fc3lzdGVtX3JlZ2lzdHJ5KCBGUkFNRSAqIGZyYW1lLCBpbnQgZmxhZ3MgKQoreworICAgIGNoYXIgY29uc3QqIHBhdGggPSBvYmplY3Rfc3RyKCBsaXN0X2Zyb250KCBsb2xfZ2V0KGZyYW1lLT5hcmdzLCAwKSApICk7CisgICAgTElTVCogcmVzdWx0ID0gTDA7CisgICAgSEtFWSBrZXkgPSBnZXRfa2V5KCZwYXRoKTsKKworICAgIGlmICgKKyAgICAgICAga2V5ICE9IDAKKyAgICAgICAgJiYgRVJST1JfU1VDQ0VTUyA9PSBSZWdPcGVuS2V5RXgoa2V5LCBwYXRoLCAwLCBLRVlfUVVFUllfVkFMVUUsICZrZXkpCisgICAgKQorICAgIHsKKyAgICAgICAgRFdPUkQgIHR5cGU7CisgICAgICAgIEJZVEUgICBkYXRhW01BWF9SRUdJU1RSWV9EQVRBX0xFTkdUSF07CisgICAgICAgIERXT1JEICBsZW4gPSBzaXplb2YoZGF0YSk7CisgICAgICAgIExJU1QgKiBjb25zdCBmaWVsZCA9IGxvbF9nZXQoZnJhbWUtPmFyZ3MsIDEpOworCisgICAgICAgIGlmICggRVJST1JfU1VDQ0VTUyA9PQorICAgICAgICAgICAgIFJlZ1F1ZXJ5VmFsdWVFeChrZXksIGZpZWxkID8gb2JqZWN0X3N0ciggbGlzdF9mcm9udCggZmllbGQgKSApIDogMCwgMCwgJnR5cGUsIGRhdGEsICZsZW4pICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgY2FzZSBSRUdfRVhQQU5EX1NaOgorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBleHBhbmRlZFsxXTsKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19uZXcoZXhwYW5kZWQpOworCisgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbiA9IEV4cGFuZEVudmlyb25tZW50U3RyaW5ncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQ1NUUilkYXRhLCBleHBhbmRlZC0+dmFsdWUsIGV4cGFuZGVkLT5jYXBhY2l0eSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgPiBleHBhbmRlZC0+Y2FwYWNpdHkKKyAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfcmVzZXJ2ZShleHBhbmRlZCwgbGVuKTsKKworICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWQtPnNpemUgPSBsZW4gLSAxOworCisgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXN0X3B1c2hfYmFjayggcmVzdWx0LCBvYmplY3RfbmV3KGV4cGFuZGVkLT52YWx1ZSkgKTsKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19mcmVlKCBleHBhbmRlZCApOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgY2FzZSBSRUdfTVVMVElfU1o6CisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHM7CisKKyAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9IChjaGFyKilkYXRhOyAqczsgcyArPSBzdHJsZW4ocykgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIG9iamVjdF9uZXcocykgKTsKKworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgY2FzZSBSRUdfRFdPUkQ6CisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmWzEwMF07CisgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBidWYsICIldSIsICooUERXT1JEKWRhdGEgKTsKKyAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIG9iamVjdF9uZXcoYnVmKSApOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgY2FzZSBSRUdfU1o6CisgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfcHVzaF9iYWNrKCByZXN1bHQsIG9iamVjdF9uZXcoIChjb25zdCBjaGFyICopZGF0YSApICk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFJlZ0Nsb3NlS2V5KGtleSk7CisgICAgfQorICAgIHJldHVybiAgcmVzdWx0OworfQorCitzdGF0aWMgTElTVCogZ2V0X3N1YmtleV9uYW1lcyhIS0VZIGtleSwgY2hhciBjb25zdCogcGF0aCkKK3sKKyAgICBMSVNUKiByZXN1bHQgPSAwOworCisgICAgaWYgKCBFUlJPUl9TVUNDRVNTID09CisgICAgICAgICBSZWdPcGVuS2V5RXgoa2V5LCBwYXRoLCAwLCBLRVlfRU5VTUVSQVRFX1NVQl9LRVlTLCAma2V5KQorICAgICkKKyAgICB7CisgICAgICAgIGNoYXIgbmFtZVtNQVhfUkVHSVNUUllfS0VZTkFNRV9MRU5HVEhdOworICAgICAgICBEV09SRCBuYW1lX3NpemUgPSBzaXplb2YobmFtZSk7CisgICAgICAgIERXT1JEIGluZGV4OworICAgICAgICBGSUxFVElNRSBsYXN0X3dyaXRlX3RpbWU7CisKKyAgICAgICAgZm9yICggaW5kZXggPSAwOworICAgICAgICAgICAgICBFUlJPUl9TVUNDRVNTID09IFJlZ0VudW1LZXlFeCgKKyAgICAgICAgICAgICAgICAgIGtleSwgaW5kZXgsIG5hbWUsICZuYW1lX3NpemUsIDAsIDAsIDAsICZsYXN0X3dyaXRlX3RpbWUpOworICAgICAgICAgICAgICArK2luZGV4LAorICAgICAgICAgICAgICBuYW1lX3NpemUgPSBzaXplb2YobmFtZSkKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBuYW1lW25hbWVfc2l6ZV0gPSAwOworICAgICAgICAgICAgcmVzdWx0ID0gbGlzdF9hcHBlbmQocmVzdWx0LCBsaXN0X25ldyhvYmplY3RfbmV3KG5hbWUpKSk7CisgICAgICAgIH0KKworICAgICAgICBSZWdDbG9zZUtleShrZXkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBMSVNUKiBnZXRfdmFsdWVfbmFtZXMoSEtFWSBrZXksIGNoYXIgY29uc3QqIHBhdGgpCit7CisgICAgTElTVCogcmVzdWx0ID0gMDsKKworICAgIGlmICggRVJST1JfU1VDQ0VTUyA9PSBSZWdPcGVuS2V5RXgoa2V5LCBwYXRoLCAwLCBLRVlfUVVFUllfVkFMVUUsICZrZXkpICkKKyAgICB7CisgICAgICAgIGNoYXIgbmFtZVtNQVhfUkVHSVNUUllfVkFMVUVOQU1FX0xFTkdUSF07CisgICAgICAgIERXT1JEIG5hbWVfc2l6ZSA9IHNpemVvZihuYW1lKTsKKyAgICAgICAgRFdPUkQgaW5kZXg7CisKKyAgICAgICAgZm9yICggaW5kZXggPSAwOworICAgICAgICAgICAgICBFUlJPUl9TVUNDRVNTID09IFJlZ0VudW1WYWx1ZSgKKyAgICAgICAgICAgICAgICAgIGtleSwgaW5kZXgsIG5hbWUsICZuYW1lX3NpemUsIDAsIDAsIDAsIDApOworICAgICAgICAgICAgICArK2luZGV4LAorICAgICAgICAgICAgICBuYW1lX3NpemUgPSBzaXplb2YobmFtZSkKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBuYW1lW25hbWVfc2l6ZV0gPSAwOworICAgICAgICAgICAgcmVzdWx0ID0gbGlzdF9hcHBlbmQocmVzdWx0LCBsaXN0X25ldyhvYmplY3RfbmV3KG5hbWUpKSk7CisgICAgICAgIH0KKworICAgICAgICBSZWdDbG9zZUtleShrZXkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0xJU1QgKiBidWlsdGluX3N5c3RlbV9yZWdpc3RyeV9uYW1lcyggRlJBTUUgKiBmcmFtZSwgaW50IGZsYWdzICkKK3sKKyAgICBjaGFyIGNvbnN0KiBwYXRoICAgICAgICA9IG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIGxvbF9nZXQoZnJhbWUtPmFyZ3MsIDApICkgKTsKKyAgICBjaGFyIGNvbnN0KiByZXN1bHRfdHlwZSA9IG9iamVjdF9zdHIoIGxpc3RfZnJvbnQoIGxvbF9nZXQoZnJhbWUtPmFyZ3MsIDEpICkgKTsKKworICAgIEhLRVkga2V5ID0gZ2V0X2tleSgmcGF0aCk7CisKKyAgICBpZiAoICFzdHJjbXAocmVzdWx0X3R5cGUsICJzdWJrZXlzIikgKQorICAgICAgICByZXR1cm4gZ2V0X3N1YmtleV9uYW1lcyhrZXksIHBhdGgpOworICAgIGlmICggIXN0cmNtcChyZXN1bHRfdHlwZSwgInZhbHVlcyIpICkKKyAgICAgICAgcmV0dXJuIGdldF92YWx1ZV9uYW1lcyhrZXksIHBhdGgpOworICAgIHJldHVybiAwOworfQorCisjIGVuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vamFtLWZpbGVzL2VuZ2luZS95eWFjYy5jIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUveXlhY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWVmYzk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9lbmdpbmUveXlhY2MuYwpAQCAtMCwwICsxLDI2OCBAQAorLyogQ29weXJpZ2h0IDIwMDIgUmVuZSBSaXZlcmEuCisqKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisqKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKgorIyB5eWFjYyAtIHlhY2Mgd3JhcHBlcgorIworIyBBbGxvd3MgdG9rZW5zIHRvIGJlIHdyaXR0ZW4gYXMgYGxpdGVyYWxgIGFuZCB0aGVuIGF1dG9tYXRpY2FsbHkKKyMgc3Vic3RpdHV0ZWQgd2l0aCAjZGVmaW5lZCB0b2tlbnMuCisjCisjIFVzYWdlOgorIyAgICB5eWFjYyBmaWxlLnkgZmlsZXRhYi5oIGZpbGUueXkKKyMKKyMgaW5wdXRzOgorIyAgICBmaWxlLnl5ICAgICAgICB5YWNjIGdyYW1tYXIgd2l0aCBgIGxpdGVyYWxzCisjCisjIG91dHB1dHM6CisjICAgIGZpbGUueSAgICAgICAgeWFjYyBncmFtbWFyCisjICAgIGZpbGV0YWIuaCAgICBhcnJheSBvZiBzdHJpbmcgPC0+IHRva2VuIG1hcHBpbmdzCisjCisjIDMtMTMtOTMKKyMgICAgRG9jdW1lbnRlZCBhbmQgcCBtb3ZlZCBpbiBzZWQgY29tbWFuZCAoZm9yIHNvbWUgcmVhc29uLAorIyAgICBzL3gveS9wIGRvZXNuJ3Qgd29yaykuCisjIDEwLTEyLTkzCisjICAgIFRha2UgYmFzZW5hbWUgYXMgc2Vjb25kIGFyZ3VtZW50LgorIyAxMi0zMS05NgorIyAgICByZXZlcnNlZCBvcmRlciBvZiBhcmdzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBHZW5GaWxlIHJ1bGUKKyMgMTEtMjAtMjAwMgorIyAgICBSZWltcGxlbWVudGVkIGFzIGEgQyBwcm9ncmFtIGZvciBwb3J0YWJpbGl0eS4gKFJlbmUgUml2ZXJhKQorKi8KKwordm9pZCBwcmludF91c2FnZSgpOworY2hhciAqIGNvcHlfc3RyaW5nKGNoYXIgKiBzLCBpbnQgbCk7CitjaGFyICogdG9rZW5pemVfc3RyaW5nKGNoYXIgKiBzKTsKK2ludCBjbXBfbGl0ZXJhbChjb25zdCB2b2lkICogYSwgY29uc3Qgdm9pZCAqIGIpOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIgKiBzdHJpbmc7CisgICAgY2hhciAqIHRva2VuOworfSBsaXRlcmFsOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQoreworICAgIGludCByZXN1bHQgPSAwOworICAgIGlmIChhcmdjICE9IDQpCisgICAgeworICAgICAgICBwcmludF91c2FnZSgpOworICAgICAgICByZXN1bHQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBGSUxFICogdG9rZW5fb3V0cHV0X2YgPSAwOworICAgICAgICBGSUxFICogZ3JhbW1hcl9vdXRwdXRfZiA9IDA7CisgICAgICAgIEZJTEUgKiBncmFtbWFyX3NvdXJjZV9mID0gMDsKKworICAgICAgICBncmFtbWFyX3NvdXJjZV9mID0gZm9wZW4oYXJndlszXSwiciIpOworICAgICAgICBpZiAoZ3JhbW1hcl9zb3VyY2VfZiA9PSAwKSB7IHJlc3VsdCA9IDE7IH0KKyAgICAgICAgaWYgKHJlc3VsdCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBsaXRlcmFsIGxpdGVyYWxzWzEwMjRdOworICAgICAgICAgICAgaW50IHQgPSAwOworICAgICAgICAgICAgY2hhciBsWzIwNDhdOworICAgICAgICAgICAgd2hpbGUgKDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZnZXRzKGwsMjA0OCxncmFtbWFyX3NvdXJjZV9mKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqIGMgPSBsOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIGMxID0gc3RyY2hyKGMsJ2AnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjMSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBjMiA9IHN0cmNocihjMSsxLCdgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMyICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsc1t0XS5zdHJpbmcgPSBjb3B5X3N0cmluZyhjMSsxLGMyLWMxLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsc1t0XS50b2tlbiA9IHRva2VuaXplX3N0cmluZyhsaXRlcmFsc1t0XS5zdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjMisxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpdGVyYWxzW3RdLnN0cmluZyA9IDA7CisgICAgICAgICAgICBsaXRlcmFsc1t0XS50b2tlbiA9IDA7CisgICAgICAgICAgICBxc29ydChsaXRlcmFscyx0LHNpemVvZihsaXRlcmFsKSxjbXBfbGl0ZXJhbCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHAgPSAxOworICAgICAgICAgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobGl0ZXJhbHNbaV0uc3RyaW5nICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGxpdGVyYWxzW3AtMV0uc3RyaW5nLGxpdGVyYWxzW2ldLnN0cmluZykgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbHNbcF0gPSBsaXRlcmFsc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpdGVyYWxzW3BdLnN0cmluZyA9IDA7CisgICAgICAgICAgICAgICAgbGl0ZXJhbHNbcF0udG9rZW4gPSAwOworICAgICAgICAgICAgICAgIHQgPSBwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9rZW5fb3V0cHV0X2YgPSBmb3Blbihhcmd2WzJdLCJ3Iik7CisgICAgICAgICAgICBpZiAodG9rZW5fb3V0cHV0X2YgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKGxpdGVyYWxzW2ldLnN0cmluZyAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50Zih0b2tlbl9vdXRwdXRfZiwiICAgIHsgXCIlc1wiLCAlcyB9LFxuIixsaXRlcmFsc1tpXS5zdHJpbmcsbGl0ZXJhbHNbaV0udG9rZW4pOworICAgICAgICAgICAgICAgICAgICBpICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZjbG9zZSh0b2tlbl9vdXRwdXRfZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBncmFtbWFyX291dHB1dF9mID0gZm9wZW4oYXJndlsxXSwidyIpOworICAgICAgICAgICAgICAgIGlmIChncmFtbWFyX291dHB1dF9mICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsaXRlcmFsc1tpXS5zdHJpbmcgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihncmFtbWFyX291dHB1dF9mLCIlJXRva2VuICVzXG4iLGxpdGVyYWxzW2ldLnRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXdpbmQoZ3JhbW1hcl9zb3VyY2VfZik7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmdldHMobCwyMDQ4LGdyYW1tYXJfc291cmNlX2YpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIGMgPSBsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIGMxID0gc3RyY2hyKGMsJ2AnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMxICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBjMiA9IHN0cmNocihjMSsxLCdgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYzIgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsIGtleTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsICogcmVwbGFjZW1lbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleS5zdHJpbmcgPSBjb3B5X3N0cmluZyhjMSsxLGMyLWMxLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleS50b2tlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAobGl0ZXJhbCopYnNlYXJjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSxsaXRlcmFscyx0LHNpemVvZihsaXRlcmFsKSxjbXBfbGl0ZXJhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmMxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGdyYW1tYXJfb3V0cHV0X2YsIiVzJXMiLGMscmVwbGFjZW1lbnQtPnRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gYzIrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGdyYW1tYXJfb3V0cHV0X2YsIiVzIixjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZ3JhbW1hcl9vdXRwdXRfZiwiJXMiLGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGdyYW1tYXJfb3V0cHV0X2YpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwZXJyb3IoInl5YWNjIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGNoYXIgKiB1c2FnZVtdID0geworICAgICJ5eWFjYyA8Z3JhbW1hciBvdXRwdXQueT4gPHRva2VuIHRhYmxlIG91dHB1dC5oPiA8Z3JhbW1hciBzb3VyY2UueXk+IiwKKyAgICAwIH07CisKK3ZvaWQgcHJpbnRfdXNhZ2UoKQoreworICAgIGNoYXIgKiogdTsKKyAgICBmb3IgKHUgPSB1c2FnZTsgKnUgIT0gMDsgKyt1KQorICAgIHsKKyAgICAgICAgZnB1dHMoKnUsc3RkZXJyKTsgcHV0YygnXG4nLHN0ZGVycik7CisgICAgfQorfQorCitjaGFyICogY29weV9zdHJpbmcoY2hhciAqIHMsIGludCBsKQoreworICAgIGNoYXIgKiByZXN1bHQgPSAoY2hhciopbWFsbG9jKGwrMSk7CisgICAgc3RybmNweShyZXN1bHQscyxsKTsKKyAgICByZXN1bHRbbF0gPSAwOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2NoYXIgKiB0b2tlbml6ZV9zdHJpbmcoY2hhciAqIHMpCit7CisgICAgY2hhciAqIHJlc3VsdDsKKyAgICBjaGFyICogbGl0ZXJhbCA9IHM7CisgICAgaW50IGw7CisgICAgaW50IGM7CisKKyAgICBpZiAoc3RyY21wKHMsIjoiKSA9PSAwKSBsaXRlcmFsID0gIl9jb2xvbiI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIiEiKSA9PSAwKSBsaXRlcmFsID0gIl9iYW5nIjsKKyAgICBlbHNlIGlmIChzdHJjbXAocywiIT0iKSA9PSAwKSBsaXRlcmFsID0gIl9iYW5nX2VxdWFscyI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIiYmIikgPT0gMCkgbGl0ZXJhbCA9ICJfYW1wZXJhbXBlciI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIiYiKSA9PSAwKSBsaXRlcmFsID0gIl9hbXBlciI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIisiKSA9PSAwKSBsaXRlcmFsID0gIl9wbHVzIjsKKyAgICBlbHNlIGlmIChzdHJjbXAocywiKz0iKSA9PSAwKSBsaXRlcmFsID0gIl9wbHVzX2VxdWFscyI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsInx8IikgPT0gMCkgbGl0ZXJhbCA9ICJfYmFyYmFyIjsKKyAgICBlbHNlIGlmIChzdHJjbXAocywifCIpID09IDApIGxpdGVyYWwgPSAiX2JhciI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIjsiKSA9PSAwKSBsaXRlcmFsID0gIl9zZW1pYyI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIi0iKSA9PSAwKSBsaXRlcmFsID0gIl9taW51cyI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIjwiKSA9PSAwKSBsaXRlcmFsID0gIl9sYW5nbGUiOworICAgIGVsc2UgaWYgKHN0cmNtcChzLCI8PSIpID09IDApIGxpdGVyYWwgPSAiX2xhbmdsZV9lcXVhbHMiOworICAgIGVsc2UgaWYgKHN0cmNtcChzLCI+IikgPT0gMCkgbGl0ZXJhbCA9ICJfcmFuZ2xlIjsKKyAgICBlbHNlIGlmIChzdHJjbXAocywiPj0iKSA9PSAwKSBsaXRlcmFsID0gIl9yYW5nbGVfZXF1YWxzIjsKKyAgICBlbHNlIGlmIChzdHJjbXAocywiLiIpID09IDApIGxpdGVyYWwgPSAiX3BlcmlvZCI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIj8iKSA9PSAwKSBsaXRlcmFsID0gIl9xdWVzdGlvbiI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIj89IikgPT0gMCkgbGl0ZXJhbCA9ICJfcXVlc3Rpb25fZXF1YWxzIjsKKyAgICBlbHNlIGlmIChzdHJjbXAocywiPSIpID09IDApIGxpdGVyYWwgPSAiX2VxdWFscyI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIiwiKSA9PSAwKSBsaXRlcmFsID0gIl9jb21tYSI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIlsiKSA9PSAwKSBsaXRlcmFsID0gIl9sYnJhY2tldCI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIl0iKSA9PSAwKSBsaXRlcmFsID0gIl9yYnJhY2tldCI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsInsiKSA9PSAwKSBsaXRlcmFsID0gIl9sYnJhY2UiOworICAgIGVsc2UgaWYgKHN0cmNtcChzLCJ9IikgPT0gMCkgbGl0ZXJhbCA9ICJfcmJyYWNlIjsKKyAgICBlbHNlIGlmIChzdHJjbXAocywiKCIpID09IDApIGxpdGVyYWwgPSAiX2xwYXJlbiI7CisgICAgZWxzZSBpZiAoc3RyY21wKHMsIikiKSA9PSAwKSBsaXRlcmFsID0gIl9ycGFyZW4iOworICAgIGwgPSBzdHJsZW4obGl0ZXJhbCkrMjsKKyAgICByZXN1bHQgPSAoY2hhciopbWFsbG9jKGwrMSk7CisgICAgZm9yIChjID0gMDsgbGl0ZXJhbFtjXSAhPSAwOyArK2MpCisgICAgeworICAgICAgICByZXN1bHRbY10gPSB0b3VwcGVyKGxpdGVyYWxbY10pOworICAgIH0KKyAgICByZXN1bHRbbC0yXSA9ICdfJzsKKyAgICByZXN1bHRbbC0xXSA9ICd0JzsKKyAgICByZXN1bHRbbF0gPSAwOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBjbXBfbGl0ZXJhbChjb25zdCB2b2lkICogYSwgY29uc3Qgdm9pZCAqIGIpCit7CisgICAgcmV0dXJuIHN0cmNtcCgoKGNvbnN0IGxpdGVyYWwgKilhKS0+c3RyaW5nLCgoY29uc3QgbGl0ZXJhbCAqKWIpLT5zdHJpbmcpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2phbS1maWxlcy9mYWlsL0phbXJvb3QgYi9zcmMva2VubG0vamFtLWZpbGVzL2ZhaWwvSmFtcm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzU4NGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9mYWlsL0phbXJvb3QKQEAgLTAsMCArMSw0IEBACithY3Rpb25zIGZhaWwgeworICBmYWxzZQorfQorbWFrZSBmYWlsIDogOiBmYWlsIDsKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9qYW0tZmlsZXMvc2FuaXR5LmphbSBiL3NyYy9rZW5sbS9qYW0tZmlsZXMvc2FuaXR5LmphbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODUxZWNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2phbS1maWxlcy9zYW5pdHkuamFtCkBAIC0wLDAgKzEsMzQ0IEBACitpbXBvcnQgbW9kdWxlcyA7CitpbXBvcnQgb3B0aW9uIDsKK2ltcG9ydCBvcyA7CitpbXBvcnQgcGF0aCA7CitpbXBvcnQgcHJvamVjdCA7CitpbXBvcnQgYnVpbGQtc3lzdGVtIDsKK2ltcG9ydCB2ZXJzaW9uIDsKKworI1NoZWxsIHdpdGggdHJhaWxpbmcgbGluZSByZW1vdmVkIGh0dHA6Ly9saXN0cy5ib29zdC5vcmcvYm9vc3QtYnVpbGQvMjAwNy8wOC8xNzA1MS5waHAKK3J1bGUgdHJpbS1ubCAoIHN0ciBleHRyYXMgKiApIHsKK3JldHVybiBbIE1BVENIICIoW14KK10qKSIgOiAkKHN0cikgXSAkKGV4dHJhcykgOworfQorcnVsZSBfc2hlbGwgKCBjbWQgOiBleHRyYXMgKiApIHsKKyAgcmV0dXJuIFsgdHJpbS1ubCBbIFNIRUxMICQoY21kKSA6ICQoZXh0cmFzKSBdIF0gOworfQorCitydWxlIHNoZWxsX29yX2ZhaWwgKCBjbWQgKSB7CisgIGxvY2FsIHJldCA9IFsgU0hFTEwgJChjbWQpIDogZXhpdC1zdGF0dXMgXSA7CisgIGlmICQocmV0WzJdKSAhPSAwIHsKKyAgICBleGl0ICQoY21kKSBmYWlsZWQgOiAxIDsKKyAgfQorfQorCitydWxlIHNoZWxsX29yX2RpZSAoIGNtZCApIHsKKyAgbG9jYWwgcmV0ID0gWyBTSEVMTCAkKGNtZCkgOiBleGl0LXN0YXR1cyBdIDsKKyAgaWYgJChyZXRbMl0pICE9IDAgeworICAgIGV4aXQgJChjbWQpIGZhaWxlZCA6IDEgOworICB9CisgIHJldHVybiBbIHRyaW0tbmwgJChyZXRbMV0pIF0gOworfQorCitjeHhmbGFncyA9IFsgb3MuZW52aXJvbiAiQ1hYRkxBR1MiIF0gOworY2ZsYWdzID0gWyBvcy5lbnZpcm9uICJDRkxBR1MiIF0gOworbGRmbGFncyA9IFsgb3MuZW52aXJvbiAiTERGTEFHUyIgXSA7CisKKyNSdW4gZysrIHdpdGggZW1wdHkgbWFpbiBhbmQgdGhlc2UgYXJndW1lbnRzIHRvIHNlZSBpZiBpdCBwYXNzZXMuICAKK3J1bGUgdGVzdF9mbGFncyAoIGZsYWdzICogOiBtYWluID8gKSB7CisgIGZsYWdzID0gJChjeHhmbGFncykgJChsZGZsYWdzKSAkKGZsYWdzKSA7CisgIGlmICEgJChtYWluKSB7CisgICAgbWFpbiA9ICJpbnQgbWFpbigpIHt9IiA7CisgIH0KKyAgbG9jYWwgY21kID0gImJhc2ggLWMgXCJnKysgIiQoZmxhZ3M6Sj0iICIpIiAteCBjKysgLSA8PDwnJChtYWluKScgLW8gJChUT1ApL2R1bW15ID4vZGV2L251bGwgMj4vZGV2L251bGwgJiYgcm0gJChUT1ApL2R1bW15IDI+L2Rldi9udWxsXCIiIDsKKyAgbG9jYWwgcmV0ID0gWyBTSEVMTCAkKGNtZCkgOiBleGl0LXN0YXR1cyBdIDsKKyAgaWYgLS1kZWJ1Zy1jb25maWd1cmF0aW9uIGluIFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIHsKKyAgICBlY2hvICQoY21kKSA7CisgICAgZWNobyAkKHJldCkgOworICB9CisgIGlmICQocmV0WzJdKSA9IDAgeworICAgIHJldHVybiB0cnVlIDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gOworICB9Cit9CisKK3J1bGUgdGVzdF9oZWFkZXIgKCBuYW1lICkgeworICByZXR1cm4gWyB0ZXN0X2ZsYWdzICItaW5jbHVkZSAkKG5hbWUpIiBdIDsKK30KKworcmVxdWlyZW1lbnRzID0gOworCitGT1JDRS1TVEFUSUMgPSBbIG9wdGlvbi5nZXQgInN0YXRpYyIgOiA6ICJ5ZXMiIF0gOworaWYgJChGT1JDRS1TVEFUSUMpIHsKKyAgcmVxdWlyZW1lbnRzICs9IDxsaW5rPnN0YXRpYyA8cnVudGltZS1saW5rPnN0YXRpYyA7Cit9CisKK3J1bGUgdGVzdF9saWJyYXJ5ICggbmFtZSApIHsKKyAgaWYgJChGT1JDRS1TVEFUSUMpIHsKKyAgICByZXR1cm4gWyB0ZXN0X2ZsYWdzICItV2wsLUJzdGF0aWMgLWwkKG5hbWUpIC1XbCwtQmR5bmFtaWMiIF0gOworICB9IGVsc2UgeworICAgIHJldHVybiBbIHRlc3RfZmxhZ3MgIi1sJChuYW1lKSIgXSA7CisgIH0KK30KKworeworICBsb2NhbCBjbGVhbmluZyA9IFsgb3B0aW9uLmdldCAiY2xlYW4iIDogOiB5ZXMgXSA7CisgIGNsZWFuaW5nID89IFsgb3B0aW9uLmdldCAiY2xlYW4tYWxsIiA6IG5vIDogeWVzIF0gOworICBpZiAiY2xlYW4iIGluIFsgbW9kdWxlcy5wZWVrIDogQVJHViBdIHsKKyAgICBjbGVhbmluZyA9IHllcyA7CisgIH0KKyAgY29uc3RhbnQgQ0xFQU5JTkcgOiAkKGNsZWFuaW5nKSA7Cit9CisKK3NoYXJlZC1jb21tYW5kLWxpbmUgPSA7Citsb2NhbCBhcmd2ID0gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0gOword2hpbGUgJChhcmd2KSB7CisgIGlmICQoYXJndlsxXSkgPSAibGluaz1zaGFyZWQiIHsKKyAgICBzaGFyZWQtY29tbWFuZC1saW5lID0gPGxpbms+c2hhcmVkIDsKKyAgfQorICBhcmd2ID0gJChhcmd2WzItXSkgOworfQorCisjRGV0ZXJtaW5lIGlmIGEgbGlicmFyeSBjYW4gYmUgY29tcGlsZWQgc3RhdGljYWxseS4gIAorcnVsZSBhdXRvLXNoYXJlZCAoIG5hbWUgOiBhZGRpdGlvbmFsICogKSB7CisKKyAgYWRkaXRpb25hbCA/PSAiIiA7CisgIGlmICQoc2hhcmVkLWNvbW1hbmQtbGluZSkgPSAiPGxpbms+c2hhcmVkIiB7CisgICAgcmV0dXJuICI8bGluaz5zaGFyZWQiIDsKKyAgfSBlbHNlIHsKKyAgICBpZiBbIHRlc3RfZmxhZ3MgJChhZGRpdGlvbmFsKSIgLVdsLC1Cc3RhdGljIC1sIiQobmFtZSkiIC1XbCwtQmR5bmFtaWMiIF0geworICAgICAgcmV0dXJuIDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgJChGT1JDRS1TVEFUSUMpIHsKKyAgICAgICAgZWNobyAiQ291bGQgbm90IHN0YXRpY2FsbHkgbGluayBhZ2FpbnN0IGxpYiAkKG5hbWUpLiAgWW91ciBidWlsZCB3aWxsIHByb2JhYmx5IGZhaWwuIiA7CisgICAgICAgIHJldHVybiA7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIjxsaW5rPnNoYXJlZCIgOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisjIE1hY1BvcnRzJyBkZWZhdWx0IGxvY2F0aW9uIGlzIC9vcHQvbG9jYWwgLS0gdXNlIHRoaXMgaWYgbm8gcGF0aCBpcyBnaXZlbi4KK3dpdGgtbWFjcG9ydHMgPSBbIG9wdGlvbi5nZXQgIndpdGgtbWFjcG9ydHMiIDogOiAiL29wdC9sb2NhbCIgXSA7CitpZiAkKHdpdGgtbWFjcG9ydHMpIHsKKyAgdXNpbmcgZGFyd2luIDsKKyAgRUNITyAiVXNpbmcgLS13aXRoLW1hY3BvcnRzPSQod2l0aC1tYWNwb3J0cyksIGltcGx5aW5nIHVzZSBvZiBkYXJ3aW4gR0NDIiA7CisKKyAgTC1ib29zdC1zZWFyY2ggPSAtTCQod2l0aC1tYWNwb3J0cykvbGliIDsKKyAgYm9vc3Qtc2VhcmNoID0gPHNlYXJjaD4kKHdpdGgtbWFjcG9ydHMpL2xpYiA7CisgIEktYm9vc3QtaW5jbHVkZSA9IC1JJCh3aXRoLW1hY3BvcnRzKS9pbmNsdWRlIDsKKyAgYm9vc3QtaW5jbHVkZSA9IDxpbmNsdWRlPiQod2l0aC1tYWNwb3J0cykvaW5jbHVkZSA7CisgIHJlcXVpcmVtZW50cyArPSAkKGJvb3N0LWluY2x1ZGUpIDsKK30gZWxzZSB7CisgIHdpdGgtYm9vc3QgPSBbIG9wdGlvbi5nZXQgIndpdGgtYm9vc3QiIF0gOworICB3aXRoLWJvb3N0ID89IFsgb3MuZW52aXJvbiAiQk9PU1RfUk9PVCIgXSA7CisgIGlmICQod2l0aC1ib29zdCkgeworICAgIEwtYm9vc3Qtc2VhcmNoID0gLUwkKHdpdGgtYm9vc3QpL2xpYiIgIi1MJCh3aXRoLWJvb3N0KS9saWI2NCA7CisgICAgYm9vc3Qtc2VhcmNoID0gPHNlYXJjaD4kKHdpdGgtYm9vc3QpL2xpYiA8c2VhcmNoPiQod2l0aC1ib29zdCkvbGliNjQgOworICAgIEktYm9vc3QtaW5jbHVkZSA9IC1JJCh3aXRoLWJvb3N0KS9pbmNsdWRlIDsKKyAgICBib29zdC1pbmNsdWRlID0gPGluY2x1ZGU+JCh3aXRoLWJvb3N0KS9pbmNsdWRlIDsKKyAgICByZXF1aXJlbWVudHMgKz0gJChib29zdC1pbmNsdWRlKSA7CisgIH0gZWxzZSB7CisgICAgTC1ib29zdC1zZWFyY2ggPSAiIiA7CisgICAgYm9vc3Qtc2VhcmNoID0gOworICAgIEktYm9vc3QtaW5jbHVkZSA9ICIiIDsKKyAgICBib29zdC1pbmNsdWRlID0gOworICB9Cit9CisgCisjQ29udmVuaWVuY2UgcnVsZSBmb3IgYm9vc3QgbGlicmFyaWVzLiAgRGVmaW5lcyBsaWJyYXJ5IGJvb3N0XyQobmFtZSkuICAKK3J1bGUgYm9vc3QtbGliICggbmFtZSBtYWNybyA6IGRlcHMgKiApIHsKKyAgbGliIGJvb3N0XyQobmFtZSlfc3RhdGljIDogJChkZXBzKSA6ICQoYm9vc3Qtc2VhcmNoKSA8bmFtZT5ib29zdF8kKG5hbWUpJChib29zdC1saWItdmVyc2lvbikgPGxpbms+c3RhdGljIDsKKyAgbGliIGJvb3N0XyQobmFtZSlfc2hhcmVkIDogJChkZXBzKSA6ICQoYm9vc3Qtc2VhcmNoKSA8bmFtZT5ib29zdF8kKG5hbWUpJChib29zdC1saWItdmVyc2lvbikgPGxpbms+c2hhcmVkIDogOiA8ZGVmaW5lPkJPT1NUXyQobWFjcm8pIDsKKworICBhbGlhcyBib29zdF8kKG5hbWUpX2RlZmF1bHQgOiAkKGRlcHMpIDogPGxpbms+c3RhdGljOjxzb3VyY2U+Ym9vc3RfJChuYW1lKV9zdGF0aWMgPGxpbms+c2hhcmVkOjxzb3VyY2U+Ym9vc3RfJChuYW1lKV9zaGFyZWQgOworCisgIGFsaWFzIGJvb3N0XyQobmFtZSlfc3RhdGljX3dvcmtzIDogJChkZXBzKSA6IFsgY2hlY2stdGFyZ2V0LWJ1aWxkcyBlbXB0eV90ZXN0X3NoYXJlZCAiU2hhcmVkIEJvb3N0IiA6IDxzb3VyY2U+Ym9vc3RfJChuYW1lKV9kZWZhdWx0IDogPHNvdXJjZT5ib29zdF8kKG5hbWUpX3N0YXRpYyBdIDsKKyAgYWxpYXMgYm9vc3RfJChuYW1lKSA6ICQoZGVwcykgOiBbIGNoZWNrLXRhcmdldC1idWlsZHMgZW1wdHlfdGVzdF9zdGF0aWMgIlN0YXRpYyBCb29zdCIgOiA8c291cmNlPmJvb3N0XyQobmFtZSlfc3RhdGljX3dvcmtzIDogPHNvdXJjZT5ib29zdF8kKG5hbWUpX3NoYXJlZCBdIDsKK30KKworI0FyZ3VtZW50IGlzIGUuZy4gMTAzNjAwCitydWxlIGJvb3N0ICggbWluLXZlcnNpb24gKSB7CisgIGxvY2FsIGNtZCA9ICJiYXNoIC1jIFwiZysrICIkKEktYm9vc3QtaW5jbHVkZSkiIC1kTSAteCBjKysgLUUgL2Rldi9udWxsIC1pbmNsdWRlIGJvb3N0L3ZlcnNpb24uaHBwIDI+L2Rldi9udWxsIHxncmVwICcjZGVmaW5lIEJPT1NUXydcIiIgOworICBsb2NhbCBib29zdC1zaGVsbCA9IFsgU0hFTEwgIiQoY21kKSIgOiBleGl0LXN0YXR1cyBdIDsKKyAgaWYgJChib29zdC1zaGVsbFsyXSkgIT0gMCAmJiAkKENMRUFOSU5HKSA9IG5vIHsKKyAgICBlY2hvIEZhaWxlZCB0byBydW4gIiQoY21kKSIgOworICAgIGV4aXQgQm9vc3QgZG9lcyBub3Qgc2VlbSB0byBiZSBpbnN0YWxsZWQgb3IgZysrIGlzIGNvbmZ1c2VkLiA6IDEgOworICB9CisgIGNvbnN0YW50IEJPT1NULVZFUlNJT04gOiBbIE1BVENIICIjZGVmaW5lIEJPT1NUX1ZFUlNJT04gKFswLTldKikiIDogJChib29zdC1zaGVsbFsxXSkgXSA7CisgIGlmICQoQk9PU1QtVkVSU0lPTikgPCAkKG1pbi12ZXJzaW9uKSAmJiAkKENMRUFOSU5HKSA9IG5vIHsKKyAgICBleGl0IFlvdSBoYXZlIEJvb3N0ICQoQk9PU1QtVkVSU0lPTikuICBUaGlzIHBhY2thZ2UgcmVxdWlyZXMgQm9vc3QgYXQgbGVhc3QgJChtaW4tdmVyc2lvbikgKGFuZCBwcmVmZXJhYmx5IG5ld2VyKS4gOiAxIDsKKyAgfQorICAjIElmIG1hdGNoaW5nIHZlcnNpb24gdGFncyBleGlzdCwgdXNlIHRoZW0uICAKKyAgYm9vc3QtbGliLXZlcnNpb24gPSBbIE1BVENIICIjZGVmaW5lIEJPT1NUX0xJQl9WRVJTSU9OIFwiKFteXCJdKilcIiIgOiAkKGJvb3N0LXNoZWxsWzFdKSBdIDsKKyAgaWYgWyB0ZXN0X2ZsYWdzICQoTC1ib29zdC1zZWFyY2gpIiAtbGJvb3N0X3Byb2dyYW1fb3B0aW9ucy0iJChib29zdC1saWItdmVyc2lvbikgXSB7CisgICAgYm9vc3QtbGliLXZlcnNpb24gPSAiLSIkKGJvb3N0LWxpYi12ZXJzaW9uKSA7CisgIH0gZWxzZSB7CisgICAgYm9vc3QtbGliLXZlcnNpb24gPSAiIiA7CisgIH0KKworICAjQ3JhenkgYW1vdW50IG9mIHRlc3RpbmcgdG8gbWFrZSBzdXJlIHRoYXQgQk9PU1RfVEVTVF9EWU5fTElOSyBpcyBkZWZpbmVkIHByb3Blcmx5LgorICBsaWIgYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29ya19zdGF0aWNfdGVzdCA6IDogJChib29zdC1zZWFyY2gpIDxuYW1lPmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmskKGJvb3N0LWxpYi12ZXJzaW9uKSA8bGluaz5zdGF0aWMgOworICBvYmogZW1wdHlfdGVzdF9zdGF0aWMubyA6IGphbS1maWxlcy9lbXB0eV90ZXN0X21haW4uY2MgYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29ya19zdGF0aWNfdGVzdCA6ICQoYm9vc3QtaW5jbHVkZSkgOworICBleGUgZW1wdHlfdGVzdF9zdGF0aWMgOiBlbXB0eV90ZXN0X3N0YXRpYy5vIGJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmtfc3RhdGljX3Rlc3QgOworCisgIGxpYiBib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrX3NoYXJlZF90ZXN0IDogOiAkKGJvb3N0LXNlYXJjaCkgPG5hbWU+Ym9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yayQoYm9vc3QtbGliLXZlcnNpb24pIDxsaW5rPnNoYXJlZCA6IDogPGRlZmluZT5CT09TVF9URVNUX0RZTl9MSU5LIDsKKyAgb2JqIGVtcHR5X3Rlc3Rfc2hhcmVkLm8gOiBqYW0tZmlsZXMvZW1wdHlfdGVzdF9tYWluLmNjIGJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmtfc2hhcmVkX3Rlc3QgOiAkKGJvb3N0LWluY2x1ZGUpIDsKKyAgZXhlIGVtcHR5X3Rlc3Rfc2hhcmVkIDogZW1wdHlfdGVzdF9zaGFyZWQubyBib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrX3NoYXJlZF90ZXN0IDsKKworICBleHBsaWNpdCBlbXB0eV90ZXN0X3N0YXRpYy5vIGVtcHR5X3Rlc3Rfc3RhdGljIGVtcHR5X3Rlc3Rfc2hhcmVkLm8gZW1wdHlfdGVzdF9zaGFyZWQgOworCisKKyAgI1NlZSB0b29scy9idWlsZC92Mi9jb250cmliL2Jvb3N0LmphbSBpbiBhIGJvb3N0IGRpc3RyaWJ1dGlvbiBmb3IgYSB0YWJsZSBvZiBtYWNyb3MgdG8gZGVmaW5lLiAgIAorICBib29zdC1saWIgc3lzdGVtIFNZU1RFTV9EWU5fTElOSyA7CisgIGJvb3N0LWxpYiB0aHJlYWQgVEhSRUFEX0RZTl9ETEwgOiBib29zdF9zeXN0ZW0gOworICBib29zdC1saWIgcHJvZ3JhbV9vcHRpb25zIFBST0dSQU1fT1BUSU9OU19EWU5fTElOSyA7CisgIGJvb3N0LWxpYiBpb3N0cmVhbXMgSU9TVFJFQU1TX0RZTl9MSU5LIDsKKyAgYm9vc3QtbGliIGZpbGVzeXN0ZW0gRklMRV9TWVNURU1fRFlOX0xJTksgOworICBib29zdC1saWIgdW5pdF90ZXN0X2ZyYW1ld29yayBURVNUX0RZTl9MSU5LIDsKKyMgIGlmICQoQk9PU1QtVkVSU0lPTikgPj0gMTA0ODAwIHsKKyMgICAgYm9vc3QtbGliIGNocm9ubyBDSFJPTk9fRFlOX0xJTksgOworIyAgICBib29zdC1saWIgdGltZXIgVElNRVJfRFlOX0xJTksgOiBib29zdF9jaHJvbm8gOworIyAgfQorfQorIAorI0xpbmsgbm9ybWFsbHkgdG8gYSBsaWJyYXJ5LCBidXQgc29tZXRpbWVzIHN0YXRpYyBpc24ndCBpbnN0YWxsZWQgc28gZmFsbCBiYWNrIHRvIGR5bmFtaWMuCitydWxlIGV4dGVybmFsLWxpYiAoIG5hbWUgOiBzZWFyY2gtcGF0aCAqIDogZGVwcyAqICkgeworICBsaWIgJChuYW1lKSA6IDogWyBhdXRvLXNoYXJlZCAkKG5hbWUpIDogIi1MIiQoc2VhcmNoLXBhdGgpIF0gPHNlYXJjaD4kKHNlYXJjaC1wYXRoKSA8dXNlPiQoZGVwcykgOworfQorCisjV3JpdGUgdGhlIGN1cnJlbnQgY29tbWFuZCBsaW5lIHRvIHByZXZpb3VzLnNoLiAgVGhpcyBkb2VzIG5vdCBkbyBzaGVsbCBlc2NhcGluZy4gIAoreworICBsb2NhbCBidWlsZC1sb2cgPSAkKFRPUCkvcHJldmlvdXMuc2ggOworICBpZiAhIFsgcGF0aC5leGlzdHMgJChidWlsZC1sb2cpIF0geworICAgIFNIRUxMICJ0b3VjaCBcIiQoYnVpbGQtbG9nKVwiICYmIGNobW9kICt4IFwiJChidWlsZC1sb2cpXCIiIDsKKyAgfQorICBsb2NhbCBzY3JpcHQgPSBbIG1vZHVsZXMucGVlayA6IEFSR1YgXSA7CisgIGlmICQoc2NyaXB0WzFdKSA9ICIuL2phbS1maWxlcy9iamFtIiB7CisgICAgI1RoZSAuL2JqYW0gc2hlbGwgc2NyaXB0IGNhbGxzIC4vamFtLWZpbGVzL2JqYW0gc28gdGhhdCBhcHBlYXJzIGluIGFyZ3YgYnV0CisgICAgI3dlIHdhbnQgLi9iamFtIHRvIGFwcGVhciBzbyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQgY29ycmVjdGx5LiAgCisgICAgc2NyaXB0ID0gIi4vYmphbSAiJChzY3JpcHRbMi1dOko9IiAiKSA7CisgIH0gZWxzZSB7CisgICAgc2NyaXB0ID0gJChzY3JpcHQ6Sj0iICIpIDsKKyAgfQorICBzY3JpcHQgPSAiIyEvYmluL3NoXG4kKHNjcmlwdClcbiIgOworICBsb2NhbCBpZ25vcmVkID0gQCgkKGJ1aWxkLWxvZyk6RT0kKHNjcmlwdCkpIDsKK30KKworI0Jvb3N0IGphbSdzIHN0YXRpYyBjbGFuZyBmb3IgTGludXggaXMgYnVnZ3kuCityZXF1aXJlbWVudHMgKz0gPGN4eGZsYWdzPiQoY3h4ZmxhZ3MpIDxjZmxhZ3M+JChjZmxhZ3MpIDxsaW5rZmxhZ3M+JChsZGZsYWdzKSA8b3M+TElOVVgsPHRvb2xzZXQ+Y2xhbmc6PGxpbms+c2hhcmVkIDsKKworaWYgISBbIG9wdGlvbi5nZXQgIndpdGhvdXQtbGlic2VnZmF1bHQiIDogOiAieWVzIiBdICYmICEgJChGT1JDRS1TVEFUSUMpIHsKKyAgI2xpYlNlZ0ZhdWx0IHByaW50cyBhIHN0YWNrIHRyYWNlIG9uIHNlZ2ZhdWx0LiAgTGluayBhZ2FpbnN0IGl0IGlmIGF2YWlsYWJsZS4gIAorICBpZiBbIHRlc3RfZmxhZ3MgIi1sU2VnRmF1bHQiIF0geworICAgIGV4dGVybmFsLWxpYiBTZWdGYXVsdCA7CisgICAgcmVxdWlyZW1lbnRzICs9IDxsaWJyYXJ5PlNlZ0ZhdWx0IDsKKyAgfQorfQorCitpZiBbIG9wdGlvbi5nZXQgImdpdCIgOiA6ICJ5ZXMiIF0geworICBsb2NhbCByZXZpc2lvbiA9IFsgX3NoZWxsICJnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgfGhlYWQgLWMgNyIgXSA7CisgIGNvbnN0YW50IEdJVFRBRyA6ICIvIiQocmV2aXNpb24pIDsKK30gZWxzZSB7CisgIGNvbnN0YW50IEdJVFRBRyA6ICIiIDsKK30KKworbG9jYWwgcHJlZml4ID0gWyBvcHRpb24uZ2V0ICJwcmVmaXgiIF0gOworaWYgJChwcmVmaXgpIHsKKyAgcHJlZml4ID0gWyBwYXRoLnJvb3QgJChwcmVmaXgpIFsgcGF0aC5wd2QgXSBdIDsKKyAgcHJlZml4ID0gJChwcmVmaXgpJChHSVRUQUcpIDsKK30gZWxzZSB7CisgIHByZWZpeCA9ICQoVE9QKSQoR0lUVEFHKSA7Cit9CisKK3BhdGgtY29uc3RhbnQgUFJFRklYIDogJChwcmVmaXgpIDsKKworcGF0aC1jb25zdGFudCBCSU5ESVIgOiBbIG9wdGlvbi5nZXQgImJpbmRpciIgOiAkKFBSRUZJWCkvYmluIF0gOworcGF0aC1jb25zdGFudCBMSUJESVIgOiBbIG9wdGlvbi5nZXQgImxpYmRpciIgOiAkKFBSRUZJWCkvbGliIF0gOworcnVsZSBpbnN0YWxsLWJpbi1saWJzICggZGVwcyAqICkgeworICBpbnN0YWxsIHByZWZpeC1iaW4gOiAkKGRlcHMpIDogPGxvY2F0aW9uPiQoQklORElSKSA8aW5zdGFsbC1kZXBlbmRlbmNpZXM+b24gPGluc3RhbGwtdHlwZT5FWEUgPGxpbms+c2hhcmVkOjxkbGwtcGF0aD4kKExJQkRJUikgOworICBpbnN0YWxsIHByZWZpeC1saWIgOiAkKGRlcHMpIDogPGxvY2F0aW9uPiQoTElCRElSKSA8aW5zdGFsbC1kZXBlbmRlbmNpZXM+b24gPGluc3RhbGwtdHlwZT5MSUIgPGxpbms+c2hhcmVkOjxkbGwtcGF0aD4kKExJQkRJUikgOworfQorcnVsZSBpbnN0YWxsLWhlYWRlcnMgKCBuYW1lIDogbGlzdCAqIDogc291cmNlLXJvb3QgPyApIHsKKyAgbG9jYWwgaW5jbHVkZWRpciA9IFsgb3B0aW9uLmdldCAiaW5jbHVkZWRpciIgOiAkKHByZWZpeCkvaW5jbHVkZSBdIDsKKyAgc291cmNlLXJvb3QgPz0gIi4iIDsKKyAgaW5zdGFsbCAkKG5hbWUpIDogJChsaXN0KSA6IDxsb2NhdGlvbj4kKGluY2x1ZGVkaXIpIDxpbnN0YWxsLXNvdXJjZS1yb290PiQoc291cmNlLXJvb3QpIDsKK30KKworcnVsZSBidWlsZC1wcm9qZWN0cyAoIHByb2plY3RzICogKSB7CisgIGZvciBsb2NhbCBwIGluICQocHJvamVjdHMpIHsKKyAgICBidWlsZC1wcm9qZWN0ICQocCkgOworICB9Cit9CisKKyNPbmx5IG9uZSBwb3N0IGJ1aWxkIGhvb2sgaXMgYWxsb3dlZC4gIEFsbG93IG11bHRpcGxlLiAgCitwb3N0LWhvb2tzID0gOworcnVsZSBwb3N0LWJ1aWxkICggb2sgPyApIHsKKyAgZm9yIGxvY2FsIHIgaW4gJChwb3N0LWhvb2tzKSB7CisgICAgJChyKSAkKG9rKSA7CisgIH0KK30KK0lNUE9SVCAkKF9fbmFtZV9fKSA6IHBvc3QtYnVpbGQgOiA6ICQoX19uYW1lX18pLnBvc3QtYnVpbGQgOworYnVpbGQtc3lzdGVtLnNldC1wb3N0LWJ1aWxkLWhvb2sgJChfX25hbWVfXykucG9zdC1idWlsZCA7CitydWxlIGFkZC1wb3N0LWhvb2sgKCBuYW1lcyAqICkgeworICBwb3N0LWhvb2tzICs9ICQobmFtZXMpIDsKK30KKworcnVsZSBmYWlsdXJlLW1lc3NhZ2UgKCBvayA/ICkgeworICBpZiAkKG9rKSAhPSAib2siIHsKKyAgICBsb2NhbCBhcmdzID0gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0gOworICAgIGxvY2FsIGFyZ3MgPSAkKGFyZ3M6Sj0iICIpIDsKKyAgICBpZiAtLWRlYnVnLWNvbmZpZ3VyYXRpb24gaW4gWyBtb2R1bGVzLnBlZWsgOiBBUkdWIF0geworICAgICAgZWNobyAiVGhlIGJ1aWxkIGZhaWxlZCB3aXRoIGNvbW1hbmQgbGluZTogIiA7CisgICAgICBlY2hvICIgICQoYXJncykiIDsKKyAgICAgIGVjaG8gIklmIHlvdSBuZWVkIHN1cHBvcnQsIGF0dGFjaCB0aGUgZnVsbCBvdXRwdXQgdG8geW91ciBlLW1haWwuIiA7CisgICAgfSBlbHNlIHsKKyAgICAgIGVjaG8gIlRoZSBidWlsZCBmYWlsZWQuICBJZiB5b3UgbmVlZCBzdXBwb3J0LCBydW46IiA7CisgICAgICBlY2hvICIgICQoYXJncykgLS1kZWJ1Zy1jb25maWd1cmF0aW9uIC1kMiB8Z3ppcCA+YnVpbGQubG9nLmd6IiA7CisgICAgICBlY2hvICJ0aGVuIGF0dGFjaCBidWlsZC5sb2cuZ3ogdG8geW91ciBlLW1haWwuIiA7CisgICAgfQorICAgIGVjaG8gIkVSUk9SIiA7CisgIH0gZWxzZSB7CisgICAgZWNobyAiU1VDQ0VTUyIgOworICB9Cit9CithZGQtcG9zdC1ob29rIGZhaWx1cmUtbWVzc2FnZSA7CisKK2ltcG9ydCBmZWF0dXJlIDogZmVhdHVyZSA7CitmZWF0dXJlIG9wdGlvbnMtdG8td3JpdGUgOiA6IGZyZWUgOworaW1wb3J0IHRvb2xzZXQgOiBmbGFncyA7CitmbGFncyB3cml0ZS1vcHRpb25zIE9QVElPTlMtVE8tV1JJVEUgPG9wdGlvbnMtdG8td3JpdGU+IDsKK2FjdGlvbnMgd3JpdGUtb3B0aW9ucyB7CisgIGVjaG8gIiQoT1BUSU9OUy1UTy1XUklURSkiID4gJCg8KSA7Cit9CisKKyNDb21wYXJlIGNvbnRlbnRzIG9mIGZpbGUgd2l0aCBjdXJyZW50LiAgSWYgdGhleSdyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSAKKyNmaWxlLiAgVGhpcyBmaWxlIGNhbiB0aGVuIGJlIHVzZWQgd2l0aCA8ZGVwZW5kZW5jeT4kKGZpbGUpIHRvIGZvcmNlCisjcmVjb21waWxhdGlvbi4KK3J1bGUgdXBkYXRlLWlmLWNoYW5nZWQgKCBmaWxlIGN1cnJlbnQgKSB7CisgIGlmICggISBbIHBhdGguZXhpc3RzICQoZmlsZSkgXSApIHx8ICggWyBfc2hlbGwgImNhdCAkKGZpbGUpIiBdICE9ICQoY3VycmVudCkgKSB7CisgICAgbWFrZSAkKGZpbGUpIDogOiAkKF9fbmFtZV9fKS53cml0ZS1vcHRpb25zIDogPG9wdGlvbnMtdG8td3JpdGU+JChjdXJyZW50KSA7CisgICAgYWx3YXlzICQoZmlsZSkgOworICB9Cit9CisKK2lmIFsgb3B0aW9uLmdldCAic2FuaXR5LXRlc3QiIDogOiAieWVzIiBdIHsKKyAgbG9jYWwgY3VycmVudF92ZXJzaW9uID0gWyBtb2R1bGVzLnBlZWsgOiBKQU1fVkVSU0lPTiBdIDsKKyAgaWYgKCAkKGN1cnJlbnRfdmVyc2lvblswXSkgPCAyMDAwICYmIFsgdmVyc2lvbi5jaGVjay1qYW0tdmVyc2lvbiAzIDEgMTYgXSApIHx8IFsgdmVyc2lvbi5jaGVjay1qYW0tdmVyc2lvbiAyMDExIDAgMCBdIHsKKyAgICBFWElUICJTYW5lIiA6IDAgOworICB9IGVsc2UgeworICAgIEVYSVQgIkJhZCIgOiAxIDsKKyAgfQorfQorCisjSGFjayB0byBhY3QgbGlrZSBhbGlhcyBpbiB0aGUgc2Vuc2UgdGhhdCBubyBsaWIgaXMgYnVpbHQsIGJ1dCBvbmx5IGJ1aWxkIGNwcCBmaWxlcyBvbmNlLiAgCitpbXBvcnQgdHlwZSA7CitydWxlIGZha2VsaWIgKCBuYW1lIDogZGVwcyAqIDogcmVxdWlyZW1lbnRzICogOiBkZWZhdWx0LWJ1aWxkICogOiB1c2FnZS1yZXF1aXJlbWVudHMgKiApIHsKKyAgbG9jYWwgYy1maWxlcyA9IDsKKyAgbG9jYWwgcmVhbC1kZXBzID0gOworICBmb3IgbG9jYWwgYyBpbiAkKGRlcHMpIHsKKyAgICBpZiBbIHR5cGUudHlwZSAkKGMpIF0gPSBDUFAgeworICAgICAgYy1maWxlcyArPSAkKGMpIDsKKyAgICB9IGVsc2UgeworICAgICAgcmVhbC1kZXBzICs9ICQoYykgOworICAgIH0KKyAgfQorICBmb3IgbG9jYWwgYyBpbiAkKGMtZmlsZXMpIHsKKyAgICBvYmogJChjOkIpLm8gOiAkKGMpICQocmVhbC1kZXBzKSA6ICQocmVxdWlyZW1lbnRzKSA6ICQoZGVmYXVsdC1idWlsZCkgOiAkKHVzYWdlX3JlcXVpcmVtZW50cykgOworICB9CisgIGFsaWFzICQobmFtZSkgOiAkKGMtZmlsZXM6QikubyAkKHJlYWwtZGVwcykgOiAkKHJlcXVpcmVtZW50cykgOiAkKGRlZmF1bHQtYnVpbGQpIDogJCh1c2FnZS1yZXF1aXJlbWVudHMpIDsKK30KKwordXNlLXByb2plY3QgL3RvcCA6IC4gOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL0NNYWtlTGlzdHMudHh0IGIvc3JjL2tlbmxtL2xtL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZWYwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5MCBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC44KQorIworIyBUaGUgS2VuTE0gY21ha2UgZmlsZXMgbWFrZSB1c2Ugb2YgYWRkX2xpYnJhcnkoLi4uIE9CSkVDVFMgLi4uKQorIyAKKyMgVGhpcyBzeW50YXggYWxsb3dzIGdyb3VwaW5nIG9mIHNvdXJjZSBmaWxlcyB3aGVuIGNvbXBpbGluZworIyAoZWZmZWN0aXZlbHkgY3JlYXRpbmcgImZha2UiIGxpYnJhcmllcyBiYXNlZCBvbiBzb3VyY2Ugc3ViZGlycykuCisjIAorIyBUaGlzIHN5bnRheCB3YXMgb25seSBhZGRlZCBpbiBjbWFrZSB2ZXJzaW9uIDIuOC44CisjCisjIHNlZSBodHRwOi8vd3d3LmNtYWtlLm9yZy9XaWtpL0NNYWtlL1R1dG9yaWFscy9PYmplY3RfTGlicmFyeQorCisKKyMgVGhpcyBDTWFrZSBmaWxlIHdhcyBjcmVhdGVkIGJ5IExhbmUgU2Nod2FydHogPGRvd29iZWhhQGdtYWlsLmNvbT4KKworCitzZXQoS0VOTE1fTUFYX09SREVSIDYgQ0FDSEUgU1RSSU5HICJNYXhpbXVtIHN1cHBvcnRlZCBuZ3JhbSBvcmRlciIpCisKK2FkZF9kZWZpbml0aW9ucygtREtFTkxNX01BWF9PUkRFUj0ke0tFTkxNX01BWF9PUkRFUn0pCisKKworIyBFeHBsaWNpdGx5IGxpc3QgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhpcyBzdWJkaXJlY3RvcnkKKyMKKyMgSWYgeW91IGFkZCBhbnkgc291cmNlIGZpbGVzIHRvIHRoaXMgc3ViZGlyZWN0b3J5CisjICAgIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBrZW5sbSBsaWJyYXJ5LAorIyAgICAgICAgKHRoaXMgZXhjbHVkZXMgYW55IHVuaXQgdGVzdCBmaWxlcykKKyMgICAgeW91IHNob3VsZCBhZGQgdGhlbSB0byB0aGUgZm9sbG93aW5nIGxpc3Q6CitzZXQoS0VOTE1fU09VUkNFIAorCWJoaWtzaGEuY2MKKwliaW5hcnlfZm9ybWF0LmNjCisJY29uZmlnLmNjCisJbG1fZXhjZXB0aW9uLmNjCisJbW9kZWwuY2MKKwlxdWFudGl6ZS5jYworCXJlYWRfYXJwYS5jYworCXNlYXJjaF9oYXNoZWQuY2MKKwlzZWFyY2hfdHJpZS5jYworCXNpemVzLmNjCisJdHJpZS5jYworCXRyaWVfc29ydC5jYworCXZhbHVlX2J1aWxkLmNjCisJdmlydHVhbF9pbnRlcmZhY2UuY2MKKwl2b2NhYi5jYworKQorCisKKyMgR3JvdXAgdGhlc2Ugb2JqZWN0cyB0b2dldGhlciBmb3IgbGF0ZXIgdXNlLiAKKyMKKyMgR2l2ZW4gYWRkX2xpYnJhcnkoZm9vIE9CSkVDVCAke215X2Zvb19zb3VyY2VzfSksCisjIHJlZmVyIHRvIHRoZXNlIG9iamVjdHMgYXMgJDxUQVJHRVRfT0JKRUNUUzpmb28+CisjCithZGRfbGlicmFyeShrZW5sbSBPQkpFQ1QgJHtLRU5MTV9TT1VSQ0V9KQorCisjIFRoaXMgZGlyZWN0b3J5IGhhcyBjaGlsZHJlbiB0aGF0IG5lZWQgdG8gYmUgcHJvY2Vzc2VkCithZGRfc3ViZGlyZWN0b3J5KGJ1aWxkZXIpCithZGRfc3ViZGlyZWN0b3J5KGNvbW1vbikKK2FkZF9zdWJkaXJlY3RvcnkoZmlsdGVyKQorCisKKworIyBFeHBsaWNpdGx5IGxpc3QgdGhlIGV4ZWN1dGFibGUgZmlsZXMgdG8gYmUgY29tcGlsZWQKK3NldChFWEVfTElTVAorICBxdWVyeQorICBmcmFnbWVudAorICBidWlsZF9iaW5hcnkKKykKKworQWRkRXhlcyhFWEVTICR7RVhFX0xJU1R9CisgICAgICAgIERFUEVORFMgJDxUQVJHRVRfT0JKRUNUUzprZW5sbT4gJDxUQVJHRVRfT0JKRUNUUzprZW5sbV91dGlsPgorICAgICAgICBMSUJSQVJJRVMgJHtCb29zdF9MSUJSQVJJRVN9IHB0aHJlYWQpCisKKyMgQ29uZGl0aW9uYWxseSBidWlsZCB0aGUgaW50ZXJwb2xhdGlvbiBjb2RlCitpZihCVUlMRF9JTlRFUlBPTEFURSkKKyAgYWRkX3N1YmRpcmVjdG9yeShpbnRlcnBvbGF0ZSkKK2VuZGlmKCkKKworaWYoQlVJTERfVEVTVElORykKKworICBzZXQoS0VOTE1fQk9PU1RfVEVTVFNfTElTVCBsZWZ0X3Rlc3QgcGFydGlhbF90ZXN0KQorICBBZGRUZXN0cyhURVNUUyAke0tFTkxNX0JPT1NUX1RFU1RTX0xJU1R9CisgICAgICAgICAgIERFUEVORFMgJDxUQVJHRVRfT0JKRUNUUzprZW5sbT4gJDxUQVJHRVRfT0JKRUNUUzprZW5sbV91dGlsPgorICAgICAgICAgICBMSUJSQVJJRVMgJHtCb29zdF9MSUJSQVJJRVN9IHB0aHJlYWQKKyAgICAgICAgICAgVEVTVF9BUkdTICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0LmFycGEpCisKKyAgIyBtb2RlbF90ZXN0IHJlcXVpcmVzIGFuIGV4dHJhIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIKKyAgS2VuTE1BZGRUZXN0KFRFU1QgbW9kZWxfdGVzdAorICAgICAgICAgICAgICAgREVQRU5EUyAkPFRBUkdFVF9PQkpFQ1RTOmtlbmxtPiAkPFRBUkdFVF9PQkpFQ1RTOmtlbmxtX3V0aWw+CisgICAgICAgICAgICAgICBMSUJSQVJJRVMgJHtCb29zdF9MSUJSQVJJRVN9IHB0aHJlYWQKKyAgICAgICAgICAgICAgIFRFU1RfQVJHUyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC5hcnBhCisgICAgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3Rfbm91bmsuYXJwYSkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9KYW1maWxlIGIvc3JjL2tlbmxtL2xtL0phbWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3OWUyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9KYW1maWxlCkBAIC0wLDAgKzEsNDAgQEAKKyMgSWYgeW91IG5lZWQgaGlnaGVyIG9yZGVyLCBjaGFuZ2UgdGhpcyBvcHRpb24KKyMgSGF2aW5nIHRoaXMgbGltaXQgbWVhbnMgdGhhdCBTdGF0ZSBjYW4gYmUKKyMgKEtFTkxNX01BWF9PUkRFUiAtIDEpICogc2l6ZW9mKGZsb2F0KSBieXRlcyBpbnN0ZWFkIG9mCisjIHNpemVvZihmbG9hdCopICsgKEtFTkxNX01BWF9PUkRFUiAtIDEpICogc2l6ZW9mKGZsb2F0KSArIG1hbGxvYyBvdmVyaGVhZAorbWF4LW9yZGVyID0gWyBvcHRpb24uZ2V0ICJtYXgta2VubG0tb3JkZXIiIDogNiA6IDYgXSA7CitpZiAoICQobWF4LW9yZGVyKSAhPSA2ICkgeworICAgZWNobyAiU2V0dGluZyBLZW5MTSBtYXhpbXVtIG4tZ3JhbSBvcmRlciB0byAkKG1heC1vcmRlcikiIDsKK30KK21heC1vcmRlciA9IDxkZWZpbmU+S0VOTE1fTUFYX09SREVSPSQobWF4LW9yZGVyKSA7CisKK3BhdGgtY29uc3RhbnQgT1JERVItTE9HIDogYmluL29yZGVyLmxvZyA7Cit1cGRhdGUtaWYtY2hhbmdlZCAkKE9SREVSLUxPRykgJChtYXgtb3JkZXIpIDsKKworbWF4LW9yZGVyICs9IDxkZXBlbmRlbmN5PiQoT1JERVItTE9HKSA7CisKK3dyYXBwZXJzID0gOworbG9jYWwgd2l0aC1ucGxtID0gWyBvcHRpb24uZ2V0ICJ3aXRoLW5wbG0iIF0gOworaWYgJCh3aXRoLW5wbG0pIHsKKyAgbGliIG5wbG0gOiA6IDxzZWFyY2g+JCh3aXRoLW5wbG0pL3NyYyA7CisgIG9iaiBucGxtLm8gOiB3cmFwcGVycy9ucGxtLmNjIDogPGluY2x1ZGU+Li4gPGluY2x1ZGU+JCh3aXRoLW5wbG0pL3NyYyA8Y3h4ZmxhZ3M+LWZvcGVubXAgPGluY2x1ZGU+JCh3aXRoLW5wbG0pLzNyZHBhcnR5L2VpZ2VuIDxkZWZpbmU+TlBMTV9ET1VCTEVfUFJFQ0lTSU9OPTAgOworICBhbGlhcyBucGxtLWFsbCA6IG5wbG0ubyBucGxtIC4uLy9ib29zdF90aHJlYWQgOiA6IDogPGN4eGZsYWdzPi1mb3Blbm1wIDxsaW5rZmxhZ3M+LWZvcGVubXAgPGRlZmluZT5XSVRIX05QTE0gPGxpYnJhcnk+Li4vL2Jvb3N0X3RocmVhZCA7CisgIHdyYXBwZXJzICs9IG5wbG0tYWxsIDsKK30KKworZmFrZWxpYiBrZW5sbSA6ICQod3JhcHBlcnMpIFsgZ2xvYiAqLmNjIDogKm1haW4uY2MgKnRlc3QuY2MgXSAuLi91dGlsLy9rZW51dGlsIDogPGluY2x1ZGU+Li4gJChtYXgtb3JkZXIpIDogOiA8aW5jbHVkZT4uLiAkKG1heC1vcmRlcikgOworCitpbXBvcnQgdGVzdGluZyA7CisKK3J1biBsZWZ0X3Rlc3QuY2Mga2VubG0gL3RvcC8vYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yayA6IDogdGVzdC5hcnBhIDsKK3J1biBtb2RlbF90ZXN0LmNjIGtlbmxtIC90b3AvL2Jvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsgOiA6IHRlc3QuYXJwYSB0ZXN0X25vdW5rLmFycGEgOworcnVuIHBhcnRpYWxfdGVzdC5jYyBrZW5sbSAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIDogOiB0ZXN0LmFycGEgOworCitleGVzID0gOworZm9yIGxvY2FsIHAgaW4gWyBnbG9iICpfbWFpbi5jYyBdIHsKKyAgbG9jYWwgbmFtZSA9IFsgTUFUQ0ggIiguKilcX21haW4uY2MiIDogJChwKSBdIDsKKyAgZXhlICQobmFtZSkgOiAkKHApIGtlbmxtIDsKKyAgZXhlcyArPSAkKG5hbWUpIDsKK30KKworYWxpYXMgcHJvZ3JhbXMgOiAkKGV4ZXMpIGZpbHRlci8vZmlsdGVyIGJ1aWxkZXIvL2R1bXBfY291bnRzIDogPHRocmVhZGluZz5tdWx0aTo8c291cmNlPmJ1aWxkZXIvL2xtcGx6IDsKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9iaGlrc2hhLmNjIGIvc3JjL2tlbmxtL2xtL2JoaWtzaGEuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2MmI2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9iaGlrc2hhLmNjCkBAIC0wLDAgKzEsOTQgQEAKKyNpbmNsdWRlICJsbS9iaGlrc2hhLmhoIgorCisjaW5jbHVkZSAibG0vYmluYXJ5X2Zvcm1hdC5oaCIKKyNpbmNsdWRlICJsbS9jb25maWcuaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgorCisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKK25hbWVzcGFjZSB0cmllIHsKKworRG9udEJoaWtzaGE6OkRvbnRCaGlrc2hhKGNvbnN0IHZvaWQgKiAvKmJhc2UqLywgdWludDY0X3QgLyptYXhfb2Zmc2V0Ki8sIHVpbnQ2NF90IG1heF9uZXh0LCBjb25zdCBDb25maWcgJi8qY29uZmlnKi8pIDoKKyAgbmV4dF8odXRpbDo6Qml0c01hc2s6OkJ5TWF4KG1heF9uZXh0KSkge30KKworY29uc3QgdWludDhfdCBrQXJyYXlCaGlrc2hhVmVyc2lvbiA9IDA7CisKKy8vIFRPRE86IHB1dCB0aGlzIGluIGJpbmFyeSBmaWxlIGhlYWRlciBpbnN0ZWFkIHdoZW4gSSBjaGFuZ2UgdGhlIGJpbmFyeSBmaWxlIGZvcm1hdCBhZ2Fpbi4KK3ZvaWQgQXJyYXlCaGlrc2hhOjpVcGRhdGVDb25maWdGcm9tQmluYXJ5KGNvbnN0IEJpbmFyeUZvcm1hdCAmZmlsZSwgdWludDY0X3Qgb2Zmc2V0LCBDb25maWcgJmNvbmZpZykgeworICB1aW50OF90IGJ1ZmZlclsyXTsKKyAgZmlsZS5SZWFkRm9yQ29uZmlnKGJ1ZmZlciwgMiwgb2Zmc2V0KTsKKyAgdWludDhfdCB2ZXJzaW9uID0gYnVmZmVyWzBdOworICB1aW50OF90IGNvbmZpZ3VyZWRfYml0cyA9IGJ1ZmZlclsxXTsKKyAgaWYgKHZlcnNpb24gIT0ga0FycmF5Qmhpa3NoYVZlcnNpb24pIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIlRoaXMgZmlsZSBoYXMgc29ydGVkIGFycmF5IGNvbXByZXNzaW9uIHZlcnNpb24gIiA8PCAodW5zaWduZWQpIHZlcnNpb24gPDwgIiBidXQgdGhlIGNvZGUgZXhwZWN0cyB2ZXJzaW9uICIgPDwgKHVuc2lnbmVkKWtBcnJheUJoaWtzaGFWZXJzaW9uKTsKKyAgY29uZmlnLnBvaW50ZXJfYmhpa3NoYV9iaXRzID0gY29uZmlndXJlZF9iaXRzOworfQorCituYW1lc3BhY2UgeworCisvLyBGaW5kIGFyZ21pbl97Y2hvcHBlZCBcaW4gWzAsIFJlcXVpcmVkQml0cyhtYXhfbmV4dCldfSBDaG9wcGVkRGVsdGEobWF4X29mZnNldCkKK3VpbnQ4X3QgQ2hvcEJpdHModWludDY0X3QgbWF4X29mZnNldCwgdWludDY0X3QgbWF4X25leHQsIGNvbnN0IENvbmZpZyAmY29uZmlnKSB7CisgIHVpbnQ4X3QgcmVxdWlyZWQgPSB1dGlsOjpSZXF1aXJlZEJpdHMobWF4X25leHQpOworICB1aW50OF90IGJlc3RfY2hvcCA9IDA7CisgIGludDY0X3QgbG93ZXN0X2NoYW5nZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpOworICAvLyBUaGVyZSBhcmUgcHJvYmFibHkgZmFzdGVyIHdheXMgYnV0IEkgZG9uJ3QgY2FyZSBiZWNhdXNlIHRoaXMgaXMgb25seSBkb25lIG9uY2UgcGVyIG9yZGVyIGF0IGNvbnN0cnVjdGlvbiB0aW1lLgorICBmb3IgKHVpbnQ4X3QgY2hvcCA9IDA7IGNob3AgPD0gc3RkOjptaW4ocmVxdWlyZWQsIGNvbmZpZy5wb2ludGVyX2JoaWtzaGFfYml0cyk7ICsrY2hvcCkgeworICAgIGludDY0X3QgY2hhbmdlID0gKG1heF9uZXh0ID4+IChyZXF1aXJlZCAtIGNob3ApKSAqIDY0IC8qIHRhYmxlIGNvc3QgaW4gYml0cyAqLworICAgICAgLSBtYXhfb2Zmc2V0ICogc3RhdGljX2Nhc3Q8aW50NjRfdD4oY2hvcCk7IC8qIHNhdmluZ3MgaW4gYml0cyovCisgICAgaWYgKGNoYW5nZSA8IGxvd2VzdF9jaGFuZ2UpIHsKKyAgICAgIGxvd2VzdF9jaGFuZ2UgPSBjaGFuZ2U7CisgICAgICBiZXN0X2Nob3AgPSBjaG9wOworICAgIH0KKyAgfQorICByZXR1cm4gYmVzdF9jaG9wOworfQorCitzdGQ6OnNpemVfdCBBcnJheUNvdW50KHVpbnQ2NF90IG1heF9vZmZzZXQsIHVpbnQ2NF90IG1heF9uZXh0LCBjb25zdCBDb25maWcgJmNvbmZpZykgeworICB1aW50OF90IHJlcXVpcmVkID0gdXRpbDo6UmVxdWlyZWRCaXRzKG1heF9uZXh0KTsKKyAgdWludDhfdCBjaG9wcGluZyA9IENob3BCaXRzKG1heF9vZmZzZXQsIG1heF9uZXh0LCBjb25maWcpOworICByZXR1cm4gKG1heF9uZXh0ID4+IChyZXF1aXJlZCAtIGNob3BwaW5nKSkgKyAxIC8qIHdlIHN0b3JlIDAgdG9vICovOworfQorfSAvLyBuYW1lc3BhY2UKKwordWludDY0X3QgQXJyYXlCaGlrc2hhOjpTaXplKHVpbnQ2NF90IG1heF9vZmZzZXQsIHVpbnQ2NF90IG1heF9uZXh0LCBjb25zdCBDb25maWcgJmNvbmZpZykgeworICByZXR1cm4gc2l6ZW9mKHVpbnQ2NF90KSAqICgxIC8qIGhlYWRlciAqLyArIEFycmF5Q291bnQobWF4X29mZnNldCwgbWF4X25leHQsIGNvbmZpZykpICsgNyAvKiA4LWJ5dGUgYWxpZ25tZW50ICovOworfQorCit1aW50OF90IEFycmF5Qmhpa3NoYTo6SW5saW5lQml0cyh1aW50NjRfdCBtYXhfb2Zmc2V0LCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQ29uZmlnICZjb25maWcpIHsKKyAgcmV0dXJuIHV0aWw6OlJlcXVpcmVkQml0cyhtYXhfbmV4dCkgLSBDaG9wQml0cyhtYXhfb2Zmc2V0LCBtYXhfbmV4dCwgY29uZmlnKTsKK30KKworbmFtZXNwYWNlIHsKKwordm9pZCAqQWxpZ25Ubzgodm9pZCAqZnJvbSkgeworICB1aW50OF90ICp2YWwgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihmcm9tKTsKKyAgc3RkOjpzaXplX3QgcmVtYWluZGVyID0gcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNpemVfdD4odmFsKSAmIDc7CisgIGlmICghcmVtYWluZGVyKSByZXR1cm4gdmFsOworICByZXR1cm4gdmFsICsgOCAtIHJlbWFpbmRlcjsKK30KKworfSAvLyBuYW1lc3BhY2UKKworQXJyYXlCaGlrc2hhOjpBcnJheUJoaWtzaGEodm9pZCAqYmFzZSwgdWludDY0X3QgbWF4X29mZnNldCwgdWludDY0X3QgbWF4X25leHQsIGNvbnN0IENvbmZpZyAmY29uZmlnKQorICA6IG5leHRfaW5saW5lXyh1dGlsOjpCaXRzTWFzazo6QnlCaXRzKElubGluZUJpdHMobWF4X29mZnNldCwgbWF4X25leHQsIGNvbmZpZykpKSwKKyAgICBvZmZzZXRfYmVnaW5fKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QqPihBbGlnblRvOChiYXNlKSkgKyAxIC8qIDgtYnl0ZSBoZWFkZXIgKi8pLAorICAgIG9mZnNldF9lbmRfKG9mZnNldF9iZWdpbl8gKyBBcnJheUNvdW50KG1heF9vZmZzZXQsIG1heF9uZXh0LCBjb25maWcpKSwKKyAgICB3cml0ZV90b18ocmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCo+KEFsaWduVG84KGJhc2UpKSArIDEgLyogOC1ieXRlIGhlYWRlciAqLyArIDEgLyogZmlyc3QgZW50cnkgaXMgMCAqLyksCisgICAgb3JpZ2luYWxfYmFzZV8oYmFzZSkge30KKwordm9pZCBBcnJheUJoaWtzaGE6OkZpbmlzaGVkTG9hZGluZyhjb25zdCBDb25maWcgJmNvbmZpZykgeworICAvLyAqb2Zmc2V0X2JlZ2luXyA9IDAgYnV0IHdpdGhvdXQgYSBjb25zdF9jYXN0LgorICAqKHdyaXRlX3RvXyAtICh3cml0ZV90b18gLSBvZmZzZXRfYmVnaW5fKSkgPSAwOworCisgIGlmICh3cml0ZV90b18gIT0gb2Zmc2V0X2VuZF8pIFVUSUxfVEhST1codXRpbDo6RXhjZXB0aW9uLCAiRGlkIG5vdCBnZXQgYWxsIHRoZSBhcnJheSBlbnRyaWVzIHRoYXQgd2VyZSBleHBlY3RlZC4iKTsKKworICB1aW50OF90ICpoZWFkX3dyaXRlID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ob3JpZ2luYWxfYmFzZV8pOworICAqKGhlYWRfd3JpdGUrKykgPSBrQXJyYXlCaGlrc2hhVmVyc2lvbjsKKyAgKihoZWFkX3dyaXRlKyspID0gY29uZmlnLnBvaW50ZXJfYmhpa3NoYV9iaXRzOworfQorCit9IC8vIG5hbWVzcGFjZSB0cmllCit9IC8vIG5hbWVzcGFjZSBuZ3JhbQorfSAvLyBuYW1lc3BhY2UgbG0KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9iaGlrc2hhLmhoIGIvc3JjL2tlbmxtL2xtL2JoaWtzaGEuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0MzhmMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9iaGlrc2hhLmhoCkBAIC0wLDAgKzEsMTIyIEBACisvKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YKKyAqIEBpbnByb2NlZWRpbmdze2JoaWtzaGFjb21wcmVzc2lvbiwKKyAqICBhdXRob3I9e0JoaWtzaGEgUmFqIGFuZCBFZCBXaGl0dGFrZXJ9LAorICogIHllYXI9ezIwMDN9LAorICogIHRpdGxlPXtMb3NzbGVzcyBDb21wcmVzc2lvbiBvZiBMYW5ndWFnZSBNb2RlbCBTdHJ1Y3R1cmUgYW5kIFdvcmQgSWRlbnRpZmllcnN9LAorICogIGJvb2t0aXRsZT17UHJvY2VlZGluZ3Mgb2YgSUVFRSBJbnRlcm5hdGlvbmFsIENvbmZlcmVuY2Ugb24gQWNvdXN0aWNzLCBTcGVlY2ggYW5kIFNpZ25hbCBQcm9jZXNzaW5nfSwKKyAqICBwYWdlcz17Mzg4LS0zOTF9LAorICogIH0KKyAqCisgKiAgQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IgbmV4dCBwb2ludGVycy4KKyAqLworCisjaWZuZGVmIExNX0JISUtTSEFfSAorI2RlZmluZSBMTV9CSElLU0hBX0gKKworI2luY2x1ZGUgImxtL21vZGVsX3R5cGUuaGgiCisjaW5jbHVkZSAibG0vdHJpZS5oaCIKKyNpbmNsdWRlICJ1dGlsL2JpdF9wYWNraW5nLmhoIgorI2luY2x1ZGUgInV0aWwvc29ydGVkX3VuaWZvcm0uaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBuZ3JhbSB7CitzdHJ1Y3QgQ29uZmlnOworY2xhc3MgQmluYXJ5Rm9ybWF0OworCituYW1lc3BhY2UgdHJpZSB7CisKK2NsYXNzIERvbnRCaGlrc2hhIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBNb2RlbFR5cGUga01vZGVsVHlwZUFkZCA9IHN0YXRpY19jYXN0PE1vZGVsVHlwZT4oMCk7CisKKyAgICBzdGF0aWMgdm9pZCBVcGRhdGVDb25maWdGcm9tQmluYXJ5KGNvbnN0IEJpbmFyeUZvcm1hdCAmLCB1aW50NjRfdCwgQ29uZmlnICYvKmNvbmZpZyovKSB7fQorCisgICAgc3RhdGljIHVpbnQ2NF90IFNpemUodWludDY0X3QgLyptYXhfb2Zmc2V0Ki8sIHVpbnQ2NF90IC8qbWF4X25leHQqLywgY29uc3QgQ29uZmlnICYvKmNvbmZpZyovKSB7IHJldHVybiAwOyB9CisKKyAgICBzdGF0aWMgdWludDhfdCBJbmxpbmVCaXRzKHVpbnQ2NF90IC8qbWF4X29mZnNldCovLCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQ29uZmlnICYvKmNvbmZpZyovKSB7CisgICAgICByZXR1cm4gdXRpbDo6UmVxdWlyZWRCaXRzKG1heF9uZXh0KTsKKyAgICB9CisKKyAgICBEb250Qmhpa3NoYShjb25zdCB2b2lkICpiYXNlLCB1aW50NjRfdCBtYXhfb2Zmc2V0LCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQ29uZmlnICZjb25maWcpOworCisgICAgdm9pZCBSZWFkTmV4dChjb25zdCB2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2Zmc2V0LCB1aW50NjRfdCAvKmluZGV4Ki8sIHVpbnQ4X3QgdG90YWxfYml0cywgTm9kZVJhbmdlICZvdXQpIGNvbnN0IHsKKyAgICAgIG91dC5iZWdpbiA9IHV0aWw6OlJlYWRJbnQ1NyhiYXNlLCBiaXRfb2Zmc2V0LCBuZXh0Xy5iaXRzLCBuZXh0Xy5tYXNrKTsKKyAgICAgIG91dC5lbmQgPSB1dGlsOjpSZWFkSW50NTcoYmFzZSwgYml0X29mZnNldCArIHRvdGFsX2JpdHMsIG5leHRfLmJpdHMsIG5leHRfLm1hc2spOworICAgICAgLy9hc3NlcnQob3V0LmVuZCA+PSBvdXQuYmVnaW4pOworICAgIH0KKworICAgIHZvaWQgV3JpdGVOZXh0KHZvaWQgKmJhc2UsIHVpbnQ2NF90IGJpdF9vZmZzZXQsIHVpbnQ2NF90IC8qaW5kZXgqLywgdWludDY0X3QgdmFsdWUpIHsKKyAgICAgIHV0aWw6OldyaXRlSW50NTcoYmFzZSwgYml0X29mZnNldCwgbmV4dF8uYml0cywgdmFsdWUpOworICAgIH0KKworICAgIHZvaWQgRmluaXNoZWRMb2FkaW5nKGNvbnN0IENvbmZpZyAmLypjb25maWcqLykge30KKworICAgIHVpbnQ4X3QgSW5saW5lQml0cygpIGNvbnN0IHsgcmV0dXJuIG5leHRfLmJpdHM7IH0KKworICBwcml2YXRlOgorICAgIHV0aWw6OkJpdHNNYXNrIG5leHRfOworfTsKKworY2xhc3MgQXJyYXlCaGlrc2hhIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBNb2RlbFR5cGUga01vZGVsVHlwZUFkZCA9IGtBcnJheUFkZDsKKworICAgIHN0YXRpYyB2b2lkIFVwZGF0ZUNvbmZpZ0Zyb21CaW5hcnkoY29uc3QgQmluYXJ5Rm9ybWF0ICZmaWxlLCB1aW50NjRfdCBvZmZzZXQsIENvbmZpZyAmY29uZmlnKTsKKworICAgIHN0YXRpYyB1aW50NjRfdCBTaXplKHVpbnQ2NF90IG1heF9vZmZzZXQsIHVpbnQ2NF90IG1heF9uZXh0LCBjb25zdCBDb25maWcgJmNvbmZpZyk7CisKKyAgICBzdGF0aWMgdWludDhfdCBJbmxpbmVCaXRzKHVpbnQ2NF90IG1heF9vZmZzZXQsIHVpbnQ2NF90IG1heF9uZXh0LCBjb25zdCBDb25maWcgJmNvbmZpZyk7CisKKyAgICBBcnJheUJoaWtzaGEodm9pZCAqYmFzZSwgdWludDY0X3QgbWF4X29mZnNldCwgdWludDY0X3QgbWF4X3ZhbHVlLCBjb25zdCBDb25maWcgJmNvbmZpZyk7CisKKyAgICB2b2lkIFJlYWROZXh0KGNvbnN0IHZvaWQgKmJhc2UsIHVpbnQ2NF90IGJpdF9vZmZzZXQsIHVpbnQ2NF90IGluZGV4LCB1aW50OF90IHRvdGFsX2JpdHMsIE5vZGVSYW5nZSAmb3V0KSBjb25zdCB7CisgICAgICAvLyBTb21lIGFzc2VydGlvbnMgYXJlIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGV5IGFyZSBleHBlbnNpdmUuCisgICAgICAvLyBhc3NlcnQoKm9mZnNldF9iZWdpbl8gPT0gMCk7CisgICAgICAvLyBzdGQ6OnVwcGVyX2JvdW5kIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBncmVhdGVyLiAgV2FudCB0aGUKKyAgICAgIC8vIGxhc3QgZWxlbWVudCB0aGF0IGlzIDw9IHRvIHRoZSBpbmRleC4KKyAgICAgIGNvbnN0IHVpbnQ2NF90ICpiZWdpbl9pdCA9IHN0ZDo6dXBwZXJfYm91bmQob2Zmc2V0X2JlZ2luXywgb2Zmc2V0X2VuZF8sIGluZGV4KSAtIDE7CisgICAgICAvLyBTaW5jZSAqb2Zmc2V0X2JlZ2luXyA9PSAwLCB0aGUgcG9zaXRpb24gc2hvdWxkIGJlIGluIHJhbmdlLgorICAgICAgLy8gYXNzZXJ0KGJlZ2luX2l0ID49IG9mZnNldF9iZWdpbl8pOworICAgICAgY29uc3QgdWludDY0X3QgKmVuZF9pdDsKKyAgICAgIGZvciAoZW5kX2l0ID0gYmVnaW5faXQgKyAxOyAoZW5kX2l0IDwgb2Zmc2V0X2VuZF8pICYmICgqZW5kX2l0IDw9IGluZGV4ICsgMSk7ICsrZW5kX2l0KSB7fQorICAgICAgLy8gYXNzZXJ0KGVuZF9pdCA9PSBzdGQ6OnVwcGVyX2JvdW5kKG9mZnNldF9iZWdpbl8sIG9mZnNldF9lbmRfLCBpbmRleCArIDEpKTsKKyAgICAgIC0tZW5kX2l0OworICAgICAgLy8gYXNzZXJ0KGVuZF9pdCA+PSBiZWdpbl9pdCk7CisgICAgICBvdXQuYmVnaW4gPSAoKGJlZ2luX2l0IC0gb2Zmc2V0X2JlZ2luXykgPDwgbmV4dF9pbmxpbmVfLmJpdHMpIHwKKyAgICAgICAgdXRpbDo6UmVhZEludDU3KGJhc2UsIGJpdF9vZmZzZXQsIG5leHRfaW5saW5lXy5iaXRzLCBuZXh0X2lubGluZV8ubWFzayk7CisgICAgICBvdXQuZW5kID0gKChlbmRfaXQgLSBvZmZzZXRfYmVnaW5fKSA8PCBuZXh0X2lubGluZV8uYml0cykgfAorICAgICAgICB1dGlsOjpSZWFkSW50NTcoYmFzZSwgYml0X29mZnNldCArIHRvdGFsX2JpdHMsIG5leHRfaW5saW5lXy5iaXRzLCBuZXh0X2lubGluZV8ubWFzayk7CisgICAgICAvLyBJZiB0aGlzIGZhaWxzLCBjb25zaWRlciByZWJ1aWxkaW5nIHlvdXIgbW9kZWwgdXNpbmcgS2VuTE0gYWZ0ZXIgMWUzMzNkNzg2Yjc0ODU1NWU4ZjM2OGQyYmJiYTI5YTAxNmM5ODA1MgorICAgICAgYXNzZXJ0KG91dC5lbmQgPj0gb3V0LmJlZ2luKTsKKyAgICB9CisKKyAgICB2b2lkIFdyaXRlTmV4dCh2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2Zmc2V0LCB1aW50NjRfdCBpbmRleCwgdWludDY0X3QgdmFsdWUpIHsKKyAgICAgIHVpbnQ2NF90IGVuY29kZSA9IHZhbHVlID4+IG5leHRfaW5saW5lXy5iaXRzOworICAgICAgZm9yICg7IHdyaXRlX3RvXyA8PSBvZmZzZXRfYmVnaW5fICsgZW5jb2RlOyArK3dyaXRlX3RvXykgKndyaXRlX3RvXyA9IGluZGV4OworICAgICAgdXRpbDo6V3JpdGVJbnQ1NyhiYXNlLCBiaXRfb2Zmc2V0LCBuZXh0X2lubGluZV8uYml0cywgdmFsdWUgJiBuZXh0X2lubGluZV8ubWFzayk7CisgICAgfQorCisgICAgdm9pZCBGaW5pc2hlZExvYWRpbmcoY29uc3QgQ29uZmlnICZjb25maWcpOworCisgICAgdWludDhfdCBJbmxpbmVCaXRzKCkgY29uc3QgeyByZXR1cm4gbmV4dF9pbmxpbmVfLmJpdHM7IH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IHV0aWw6OkJpdHNNYXNrIG5leHRfaW5saW5lXzsKKworICAgIGNvbnN0IHVpbnQ2NF90ICpjb25zdCBvZmZzZXRfYmVnaW5fOworICAgIGNvbnN0IHVpbnQ2NF90ICpjb25zdCBvZmZzZXRfZW5kXzsKKworICAgIHVpbnQ2NF90ICp3cml0ZV90b187CisKKyAgICB2b2lkICpvcmlnaW5hbF9iYXNlXzsKK307CisKK30gLy8gbmFtZXNwYWNlIHRyaWUKK30gLy8gbmFtZXNwYWNlIG5ncmFtCit9IC8vIG5hbWVzcGFjZSBsbQorCisjZW5kaWYgLy8gTE1fQkhJS1NIQV9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYmluYXJ5X2Zvcm1hdC5jYyBiL3NyYy9rZW5sbS9sbS9iaW5hcnlfZm9ybWF0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMjk0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vYmluYXJ5X2Zvcm1hdC5jYwpAQCAtMCwwICsxLDMwMiBAQAorI2luY2x1ZGUgImxtL2JpbmFyeV9mb3JtYXQuaGgiCisKKyNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZV9waWVjZS5oaCIKKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGNzdGRsaWI+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBuZ3JhbSB7CisKK2NvbnN0IGNoYXIgKmtNb2RlbE5hbWVzWzZdID0geyJwcm9iaW5nIGhhc2ggdGFibGVzIiwgInByb2JpbmcgaGFzaCB0YWJsZXMgd2l0aCByZXN0IGNvc3RzIiwgInRyaWUiLCAidHJpZSB3aXRoIHF1YW50aXphdGlvbiIsICJ0cmllIHdpdGggYXJyYXktY29tcHJlc3NlZCBwb2ludGVycyIsICJ0cmllIHdpdGggcXVhbnRpemF0aW9uIGFuZCBhcnJheS1jb21wcmVzc2VkIHBvaW50ZXJzIn07CisKK25hbWVzcGFjZSB7Citjb25zdCBjaGFyIGtNYWdpY0JlZm9yZVZlcnNpb25bXSA9ICJtbWFwIGxtIGh0dHA6Ly9raGVhZmllbGQuY29tL2NvZGUgZm9ybWF0IHZlcnNpb24iOworY29uc3QgY2hhciBrTWFnaWNCeXRlc1tdID0gIm1tYXAgbG0gaHR0cDovL2toZWFmaWVsZC5jb20vY29kZSBmb3JtYXQgdmVyc2lvbiA1XG5cMCI7CisvLyBUaGlzIG11c3QgYmUgc2hvcnRlciB0aGFuIGtNYWdpY0J5dGVzIGFuZCBpbmRpY2F0ZXMgYW4gaW5jb21wbGV0ZSBiaW5hcnkgZmlsZSAoaS5lLiBidWlsZCBmYWlsZWQpLgorY29uc3QgY2hhciBrTWFnaWNJbmNvbXBsZXRlW10gPSAibW1hcCBsbSBodHRwOi8va2hlYWZpZWxkLmNvbS9jb2RlIGluY29tcGxldGVcbiI7Citjb25zdCBsb25nIGludCBrTWFnaWNWZXJzaW9uID0gNTsKKworLy8gT2xkIGJpbmFyeSBmaWxlcyBidWlsdCBvbiAzMi1iaXQgbWFjaGluZXMgaGF2ZSB0aGlzIGhlYWRlci4KKy8vIFRPRE86IGVsaW1pbmF0ZSB3aXRoIG5leHQgYmluYXJ5IHJlbGVhc2UuCitzdHJ1Y3QgT2xkU2FuaXR5IHsKKyAgY2hhciBtYWdpY1tzaXplb2Yoa01hZ2ljQnl0ZXMpXTsKKyAgZmxvYXQgemVyb19mLCBvbmVfZiwgbWludXNfaGFsZl9mOworICBXb3JkSW5kZXggb25lX3dvcmRfaW5kZXgsIG1heF93b3JkX2luZGV4OworICB1aW50NjRfdCBvbmVfdWludDY0OworCisgIHZvaWQgU2V0VG9SZWZlcmVuY2UoKSB7CisgICAgc3RkOjptZW1zZXQodGhpcywgMCwgc2l6ZW9mKE9sZFNhbml0eSkpOworICAgIHN0ZDo6bWVtY3B5KG1hZ2ljLCBrTWFnaWNCeXRlcywgc2l6ZW9mKG1hZ2ljKSk7CisgICAgemVyb19mID0gMC4wOyBvbmVfZiA9IDEuMDsgbWludXNfaGFsZl9mID0gLTAuNTsKKyAgICBvbmVfd29yZF9pbmRleCA9IDE7CisgICAgbWF4X3dvcmRfaW5kZXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPFdvcmRJbmRleD46Om1heCgpOworICAgIG9uZV91aW50NjQgPSAxOworICB9Cit9OworCisKKy8vIFRlc3QgdmFsdWVzIGFsaWduZWQgdG8gOCBieXRlcy4KK3N0cnVjdCBTYW5pdHkgeworICBjaGFyIG1hZ2ljW0FMSUdOOChzaXplb2Yoa01hZ2ljQnl0ZXMpKV07CisgIGZsb2F0IHplcm9fZiwgb25lX2YsIG1pbnVzX2hhbGZfZjsKKyAgV29yZEluZGV4IG9uZV93b3JkX2luZGV4LCBtYXhfd29yZF9pbmRleCwgcGFkZGluZ190b184OworICB1aW50NjRfdCBvbmVfdWludDY0OworCisgIHZvaWQgU2V0VG9SZWZlcmVuY2UoKSB7CisgICAgc3RkOjptZW1zZXQodGhpcywgMCwgc2l6ZW9mKFNhbml0eSkpOworICAgIHN0ZDo6bWVtY3B5KG1hZ2ljLCBrTWFnaWNCeXRlcywgc2l6ZW9mKGtNYWdpY0J5dGVzKSk7CisgICAgemVyb19mID0gMC4wOyBvbmVfZiA9IDEuMDsgbWludXNfaGFsZl9mID0gLTAuNTsKKyAgICBvbmVfd29yZF9pbmRleCA9IDE7CisgICAgbWF4X3dvcmRfaW5kZXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPFdvcmRJbmRleD46Om1heCgpOworICAgIHBhZGRpbmdfdG9fOCA9IDA7CisgICAgb25lX3VpbnQ2NCA9IDE7CisgIH0KK307CisKK3N0ZDo6c2l6ZV90IFRvdGFsSGVhZGVyU2l6ZSh1bnNpZ25lZCBjaGFyIG9yZGVyKSB7CisgIHJldHVybiBBTElHTjgoc2l6ZW9mKFNhbml0eSkgKyBzaXplb2YoRml4ZWRXaWR0aFBhcmFtZXRlcnMpICsgc2l6ZW9mKHVpbnQ2NF90KSAqIG9yZGVyKTsKK30KKwordm9pZCBXcml0ZUhlYWRlcih2b2lkICp0bywgY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKSB7CisgIFNhbml0eSBoZWFkZXIgPSBTYW5pdHkoKTsKKyAgaGVhZGVyLlNldFRvUmVmZXJlbmNlKCk7CisgIHN0ZDo6bWVtY3B5KHRvLCAmaGVhZGVyLCBzaXplb2YoU2FuaXR5KSk7CisgIGNoYXIgKm91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHRvKSArIHNpemVvZihTYW5pdHkpOworCisgICpyZWludGVycHJldF9jYXN0PEZpeGVkV2lkdGhQYXJhbWV0ZXJzKj4ob3V0KSA9IHBhcmFtcy5maXhlZDsKKyAgb3V0ICs9IHNpemVvZihGaXhlZFdpZHRoUGFyYW1ldGVycyk7CisKKyAgdWludDY0X3QgKmNvdW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPihvdXQpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1zLmNvdW50cy5zaXplKCk7ICsraSkgeworICAgIGNvdW50c1tpXSA9IHBhcmFtcy5jb3VudHNbaV07CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UKKworYm9vbCBJc0JpbmFyeUZvcm1hdChpbnQgZmQpIHsKKyAgY29uc3QgdWludDY0X3Qgc2l6ZSA9IHV0aWw6OlNpemVGaWxlKGZkKTsKKyAgaWYgKHNpemUgPT0gdXRpbDo6a0JhZFNpemUgfHwgKHNpemUgPD0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHNpemVvZihTYW5pdHkpKSkpIHJldHVybiBmYWxzZTsKKyAgLy8gVHJ5IHJlYWRpbmcgdGhlIGhlYWRlci4KKyAgdXRpbDo6c2NvcGVkX21lbW9yeSBtZW1vcnk7CisgIHRyeSB7CisgICAgdXRpbDo6TWFwUmVhZCh1dGlsOjpMQVpZLCBmZCwgMCwgc2l6ZW9mKFNhbml0eSksIG1lbW9yeSk7CisgIH0gY2F0Y2ggKGNvbnN0IHV0aWw6OkV4Y2VwdGlvbiAmZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBTYW5pdHkgcmVmZXJlbmNlX2hlYWRlciA9IFNhbml0eSgpOworICByZWZlcmVuY2VfaGVhZGVyLlNldFRvUmVmZXJlbmNlKCk7CisgIGlmICghc3RkOjptZW1jbXAobWVtb3J5LmdldCgpLCAmcmVmZXJlbmNlX2hlYWRlciwgc2l6ZW9mKFNhbml0eSkpKSByZXR1cm4gdHJ1ZTsKKyAgaWYgKCFzdGQ6Om1lbWNtcChtZW1vcnkuZ2V0KCksIGtNYWdpY0luY29tcGxldGUsIHN0cmxlbihrTWFnaWNJbmNvbXBsZXRlKSkpIHsKKyAgICBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJUaGlzIGJpbmFyeSBmaWxlIGRpZCBub3QgZmluaXNoIGJ1aWxkaW5nIik7CisgIH0KKyAgaWYgKCFzdGQ6Om1lbWNtcChtZW1vcnkuZ2V0KCksIGtNYWdpY0JlZm9yZVZlcnNpb24sIHN0cmxlbihrTWFnaWNCZWZvcmVWZXJzaW9uKSkpIHsKKyAgICBjaGFyICplbmRfcHRyOworICAgIGNvbnN0IGNoYXIgKmJlZ2luX3ZlcnNpb24gPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4obWVtb3J5LmdldCgpKSArIHN0cmxlbihrTWFnaWNCZWZvcmVWZXJzaW9uKTsKKyAgICBsb25nIGludCB2ZXJzaW9uID0gc3RkOjpzdHJ0b2woYmVnaW5fdmVyc2lvbiwgJmVuZF9wdHIsIDEwKTsKKyAgICBpZiAoKGVuZF9wdHIgIT0gYmVnaW5fdmVyc2lvbikgJiYgdmVyc2lvbiAhPSBrTWFnaWNWZXJzaW9uKSB7CisgICAgICBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJCaW5hcnkgZmlsZSBoYXMgdmVyc2lvbiAiIDw8IHZlcnNpb24gPDwgIiBidXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBleHBlY3RzIHZlcnNpb24gIiA8PCBrTWFnaWNWZXJzaW9uIDw8ICIgc28geW91J2xsIGhhdmUgdG8gdXNlIHRoZSBBUlBBIHRvIHJlYnVpbGQgeW91ciBiaW5hcnkiKTsKKyAgICB9CisKKyAgICBPbGRTYW5pdHkgb2xkX3Nhbml0eSA9IE9sZFNhbml0eSgpOworICAgIG9sZF9zYW5pdHkuU2V0VG9SZWZlcmVuY2UoKTsKKyAgICBVVElMX1RIUk9XX0lGKCFzdGQ6Om1lbWNtcChtZW1vcnkuZ2V0KCksICZvbGRfc2FuaXR5LCBzaXplb2YoT2xkU2FuaXR5KSksIEZvcm1hdExvYWRFeGNlcHRpb24sICJMb29rcyBsaWtlIHRoaXMgaXMgYW4gb2xkIDMyLWJpdCBmb3JtYXQuICBUaGUgb2xkIDMyLWJpdCBmb3JtYXQgaGFzIGJlZW4gcmVtb3ZlZCBzbyB0aGF0IDY0LWJpdCBhbmQgMzItYml0IGZpbGVzIGFyZSBleGNoYW5nZWFibGUuIik7CisgICAgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiRmlsZSBsb29rcyBsaWtlIGl0IHNob3VsZCBiZSBsb2FkZWQgd2l0aCBtbWFwLCBidXQgdGhlIHRlc3QgdmFsdWVzIGRvbid0IG1hdGNoLiAgVHJ5IHJlYnVpbGRpbmcgdGhlIGJpbmFyeSBmb3JtYXQgTE0gdXNpbmcgdGhlIHNhbWUgY29kZSByZXZpc2lvbiwgY29tcGlsZXIsIGFuZCBhcmNoaXRlY3R1cmUiKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVhZEhlYWRlcihpbnQgZmQsIFBhcmFtZXRlcnMgJm91dCkgeworICB1dGlsOjpTZWVrT3JUaHJvdyhmZCwgc2l6ZW9mKFNhbml0eSkpOworICB1dGlsOjpSZWFkT3JUaHJvdyhmZCwgJm91dC5maXhlZCwgc2l6ZW9mKG91dC5maXhlZCkpOworICBpZiAob3V0LmZpeGVkLnByb2JpbmdfbXVsdGlwbGllciA8IDEuMCkKKyAgICBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJCaW5hcnkgZm9ybWF0IGNsYWltcyB0byBoYXZlIGEgcHJvYmluZyBtdWx0aXBsaWVyIG9mICIgPDwgb3V0LmZpeGVkLnByb2JpbmdfbXVsdGlwbGllciA8PCAiIHdoaWNoIGlzIDwgMS4wLiIpOworCisgIG91dC5jb3VudHMucmVzaXplKHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihvdXQuZml4ZWQub3JkZXIpKTsKKyAgaWYgKG91dC5maXhlZC5vcmRlcikgdXRpbDo6UmVhZE9yVGhyb3coZmQsICYqb3V0LmNvdW50cy5iZWdpbigpLCBzaXplb2YodWludDY0X3QpICogb3V0LmZpeGVkLm9yZGVyKTsKK30KKwordm9pZCBNYXRjaENoZWNrKE1vZGVsVHlwZSBtb2RlbF90eXBlLCB1bnNpZ25lZCBpbnQgc2VhcmNoX3ZlcnNpb24sIGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcykgeworICBpZiAocGFyYW1zLmZpeGVkLm1vZGVsX3R5cGUgIT0gbW9kZWxfdHlwZSkgeworICAgIGlmIChzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHBhcmFtcy5maXhlZC5tb2RlbF90eXBlKSA+PSAoc2l6ZW9mKGtNb2RlbE5hbWVzKSAvIHNpemVvZihjb25zdCBjaGFyICopKSkKKyAgICAgIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIlRoZSBiaW5hcnkgZmlsZSBjbGFpbXMgdG8gYmUgbW9kZWwgdHlwZSAiIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4ocGFyYW1zLmZpeGVkLm1vZGVsX3R5cGUpIDw8ICIgYnV0IHRoaXMgaXMgbm90IGltcGxlbWVudGVkIGZvciBpbiB0aGlzIGluZmVyZW5jZSBjb2RlLiIpOworICAgIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIlRoZSBiaW5hcnkgZmlsZSB3YXMgYnVpbHQgZm9yICIgPDwga01vZGVsTmFtZXNbcGFyYW1zLmZpeGVkLm1vZGVsX3R5cGVdIDw8ICIgYnV0IHRoZSBpbmZlcmVuY2UgY29kZSBpcyB0cnlpbmcgdG8gbG9hZCAiIDw8IGtNb2RlbE5hbWVzW21vZGVsX3R5cGVdKTsKKyAgfQorICBVVElMX1RIUk9XX0lGKHNlYXJjaF92ZXJzaW9uICE9IHBhcmFtcy5maXhlZC5zZWFyY2hfdmVyc2lvbiwgRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIlRoZSBiaW5hcnkgZmlsZSBoYXMgIiA8PCBrTW9kZWxOYW1lc1twYXJhbXMuZml4ZWQubW9kZWxfdHlwZV0gPDwgIiB2ZXJzaW9uICIgPDwgcGFyYW1zLmZpeGVkLnNlYXJjaF92ZXJzaW9uIDw8ICIgYnV0IHRoaXMgY29kZSBleHBlY3RzICIgPDwga01vZGVsTmFtZXNbcGFyYW1zLmZpeGVkLm1vZGVsX3R5cGVdIDw8ICIgdmVyc2lvbiAiIDw8IHNlYXJjaF92ZXJzaW9uKTsKK30KKworY29uc3Qgc3RkOjpzaXplX3Qga0ludmFsaWRTaXplID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KC0xKTsKKworQmluYXJ5Rm9ybWF0OjpCaW5hcnlGb3JtYXQoY29uc3QgQ29uZmlnICZjb25maWcpCisgIDogd3JpdGVfbWV0aG9kXyhjb25maWcud3JpdGVfbWV0aG9kKSwgd3JpdGVfbW1hcF8oY29uZmlnLndyaXRlX21tYXApLCBsb2FkX21ldGhvZF8oY29uZmlnLmxvYWRfbWV0aG9kKSwKKyAgICBoZWFkZXJfc2l6ZV8oa0ludmFsaWRTaXplKSwgdm9jYWJfc2l6ZV8oa0ludmFsaWRTaXplKSwgdm9jYWJfc3RyaW5nX29mZnNldF8oa0ludmFsaWRPZmZzZXQpIHt9CisKK3ZvaWQgQmluYXJ5Rm9ybWF0OjpJbml0aWFsaXplQmluYXJ5KGludCBmZCwgTW9kZWxUeXBlIG1vZGVsX3R5cGUsIHVuc2lnbmVkIGludCBzZWFyY2hfdmVyc2lvbiwgUGFyYW1ldGVycyAmcGFyYW1zKSB7CisgIGZpbGVfLnJlc2V0KGZkKTsKKyAgd3JpdGVfbW1hcF8gPSBOVUxMOyAvLyBJZ25vcmUgd3JpdGUgcmVxdWVzdHM7IHRoaXMgaXMgYWxyZWFkeSBpbiBiaW5hcnkgZm9ybWF0LgorICBSZWFkSGVhZGVyKGZkLCBwYXJhbXMpOworICBNYXRjaENoZWNrKG1vZGVsX3R5cGUsIHNlYXJjaF92ZXJzaW9uLCBwYXJhbXMpOworICBoZWFkZXJfc2l6ZV8gPSBUb3RhbEhlYWRlclNpemUocGFyYW1zLmNvdW50cy5zaXplKCkpOworfQorCit2b2lkIEJpbmFyeUZvcm1hdDo6UmVhZEZvckNvbmZpZyh2b2lkICp0bywgc3RkOjpzaXplX3QgYW1vdW50LCB1aW50NjRfdCBvZmZzZXRfZXhjbHVkaW5nX2hlYWRlcikgY29uc3QgeworICBhc3NlcnQoaGVhZGVyX3NpemVfICE9IGtJbnZhbGlkU2l6ZSk7CisgIHV0aWw6OkVyc2F0elBSZWFkKGZpbGVfLmdldCgpLCB0bywgYW1vdW50LCBvZmZzZXRfZXhjbHVkaW5nX2hlYWRlciArIGhlYWRlcl9zaXplXyk7Cit9CisKK3ZvaWQgKkJpbmFyeUZvcm1hdDo6TG9hZEJpbmFyeShzdGQ6OnNpemVfdCBzaXplKSB7CisgIGFzc2VydChoZWFkZXJfc2l6ZV8gIT0ga0ludmFsaWRTaXplKTsKKyAgY29uc3QgdWludDY0X3QgZmlsZV9zaXplID0gdXRpbDo6U2l6ZUZpbGUoZmlsZV8uZ2V0KCkpOworICAvLyBUaGUgaGVhZGVyIGlzIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIHNvIHdlIGhhdmUgdG8gbWFwIHRoZSB3aG9sZSBoZWFkZXIgYXMgd2VsbC4KKyAgdWludDY0X3QgdG90YWxfbWFwID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGhlYWRlcl9zaXplXykgKyBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc2l6ZSk7CisgIFVUSUxfVEhST1dfSUYoZmlsZV9zaXplICE9IHV0aWw6OmtCYWRTaXplICYmIGZpbGVfc2l6ZSA8IHRvdGFsX21hcCwgRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIkJpbmFyeSBmaWxlIGhhcyBzaXplICIgPDwgZmlsZV9zaXplIDw8ICIgYnV0IHRoZSBoZWFkZXJzIHNheSBpdCBzaG91bGQgYmUgYXQgbGVhc3QgIiA8PCB0b3RhbF9tYXApOworCisgIHV0aWw6Ok1hcFJlYWQobG9hZF9tZXRob2RfLCBmaWxlXy5nZXQoKSwgMCwgdXRpbDo6Q2hlY2tPdmVyZmxvdyh0b3RhbF9tYXApLCBtYXBwaW5nXyk7CisKKyAgdm9jYWJfc3RyaW5nX29mZnNldF8gPSB0b3RhbF9tYXA7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtYXBwaW5nXy5nZXQoKSkgKyBoZWFkZXJfc2l6ZV87Cit9CisKK3ZvaWQgKkJpbmFyeUZvcm1hdDo6U2V0dXBKdXN0Vm9jYWIoc3RkOjpzaXplX3QgbWVtb3J5X3NpemUsIHVpbnQ4X3Qgb3JkZXIpIHsKKyAgdm9jYWJfc2l6ZV8gPSBtZW1vcnlfc2l6ZTsKKyAgaWYgKCF3cml0ZV9tbWFwXykgeworICAgIGhlYWRlcl9zaXplXyA9IDA7CisgICAgdXRpbDo6SHVnZU1hbGxvYyhtZW1vcnlfc2l6ZSwgdHJ1ZSwgbWVtb3J5X3ZvY2FiXyk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1lbW9yeV92b2NhYl8uZ2V0KCkpOworICB9CisgIGhlYWRlcl9zaXplXyA9IFRvdGFsSGVhZGVyU2l6ZShvcmRlcik7CisgIHN0ZDo6c2l6ZV90IHRvdGFsID0gdXRpbDo6Q2hlY2tPdmVyZmxvdyhzdGF0aWNfY2FzdDx1aW50NjRfdD4oaGVhZGVyX3NpemVfKSArIHN0YXRpY19jYXN0PHVpbnQ2NF90PihtZW1vcnlfc2l6ZSkpOworICBmaWxlXy5yZXNldCh1dGlsOjpDcmVhdGVPclRocm93KHdyaXRlX21tYXBfKSk7CisgIC8vIHNvbWUgZ2NjcyBjb21wbGFpbiBhYm91dCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBldmVuIHRob3VnaCBhbGwgZW51bSB2YWx1ZXMgYXJlIGNvdmVyZWQuCisgIHZvaWQgKnZvY2FiX2Jhc2UgPSBOVUxMOworICBzd2l0Y2ggKHdyaXRlX21ldGhvZF8pIHsKKyAgICBjYXNlIENvbmZpZzo6V1JJVEVfTU1BUDoKKyAgICAgIG1hcHBpbmdfLnJlc2V0KHV0aWw6Ok1hcFplcm9lZFdyaXRlKGZpbGVfLmdldCgpLCB0b3RhbCksIHRvdGFsLCB1dGlsOjpzY29wZWRfbWVtb3J5OjpNTUFQX0FMTE9DQVRFRCk7CisgICAgICB1dGlsOjpBZHZpc2VIdWdlUGFnZXModm9jYWJfYmFzZSwgdG90YWwpOworICAgICAgdm9jYWJfYmFzZSA9IG1hcHBpbmdfLmdldCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDb25maWc6OldSSVRFX0FGVEVSOgorICAgICAgdXRpbDo6UmVzaXplT3JUaHJvdyhmaWxlXy5nZXQoKSwgMCk7CisgICAgICB1dGlsOjpIdWdlTWFsbG9jKHRvdGFsLCB0cnVlLCBtZW1vcnlfdm9jYWJfKTsKKyAgICAgIHZvY2FiX2Jhc2UgPSBtZW1vcnlfdm9jYWJfLmdldCgpOworICAgICAgYnJlYWs7CisgIH0KKyAgc3RybmNweShyZWludGVycHJldF9jYXN0PGNoYXIqPih2b2NhYl9iYXNlKSwga01hZ2ljSW5jb21wbGV0ZSwgaGVhZGVyX3NpemVfKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHZvY2FiX2Jhc2UpICsgaGVhZGVyX3NpemVfOworfQorCit2b2lkICpCaW5hcnlGb3JtYXQ6Okdyb3dGb3JTZWFyY2goc3RkOjpzaXplX3QgbWVtb3J5X3NpemUsIHN0ZDo6c2l6ZV90IHZvY2FiX3BhZCwgdm9pZCAqJnZvY2FiX2Jhc2UpIHsKKyAgYXNzZXJ0KHZvY2FiX3NpemVfICE9IGtJbnZhbGlkU2l6ZSk7CisgIHZvY2FiX3BhZF8gPSB2b2NhYl9wYWQ7CisgIHN0ZDo6c2l6ZV90IG5ld19zaXplID0gaGVhZGVyX3NpemVfICsgdm9jYWJfc2l6ZV8gKyB2b2NhYl9wYWRfICsgbWVtb3J5X3NpemU7CisgIHZvY2FiX3N0cmluZ19vZmZzZXRfID0gbmV3X3NpemU7CisgIGlmICghd3JpdGVfbW1hcF8gfHwgd3JpdGVfbWV0aG9kXyA9PSBDb25maWc6OldSSVRFX0FGVEVSKSB7CisgICAgdXRpbDo6SHVnZU1hbGxvYyhtZW1vcnlfc2l6ZSwgdHJ1ZSwgbWVtb3J5X3NlYXJjaF8pOworICAgIGFzc2VydChoZWFkZXJfc2l6ZV8gPT0gMCB8fCB3cml0ZV9tbWFwXyk7CisgICAgdm9jYWJfYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1lbW9yeV92b2NhYl8uZ2V0KCkpICsgaGVhZGVyX3NpemVfOworICAgIHV0aWw6OkFkdmlzZUh1Z2VQYWdlcyhtZW1vcnlfc2VhcmNoXy5nZXQoKSwgbWVtb3J5X3NpemUpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtZW1vcnlfc2VhcmNoXy5nZXQoKSk7CisgIH0KKworICBhc3NlcnQod3JpdGVfbWV0aG9kXyA9PSBDb25maWc6OldSSVRFX01NQVApOworICAvLyBBbHNvIGtub3duIGFzIHRvdGFsIHNpemUgd2l0aG91dCB2b2NhYiB3b3Jkcy4KKyAgLy8gR3JvdyB0aGUgZmlsZSB0byBhY2NvbW9kYXRlIHRoZSBzZWFyY2gsIHVzaW5nIHplcm9zLgorICAvLyBBY2NvcmRpbmcgdG8gbWFuIG1tYXAsIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCB3aGVuIHRoZSBmaWxlIGlzIHJlc2l6ZWQKKyAgLy8gdW5kZXJuZWF0aCBhIG1tYXAgdGhhdCBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgcGFnZSBzaXplLiAgU28gdG8gYmUKKyAgLy8gc2FmZSwgd2UnbGwgdW5tYXAgaXQgYW5kIG1hcCBpdCBhZ2Fpbi4KKyAgbWFwcGluZ18ucmVzZXQoKTsKKyAgdXRpbDo6UmVzaXplT3JUaHJvdyhmaWxlXy5nZXQoKSwgbmV3X3NpemUpOworICB2b2lkICpyZXQ7CisgIE1hcEZpbGUodm9jYWJfYmFzZSwgcmV0KTsKKyAgdXRpbDo6QWR2aXNlSHVnZVBhZ2VzKHJldCwgbmV3X3NpemUpOworICByZXR1cm4gcmV0OworfQorCit2b2lkIEJpbmFyeUZvcm1hdDo6V3JpdGVWb2NhYldvcmRzKGNvbnN0IHN0ZDo6c3RyaW5nICZidWZmZXIsIHZvaWQgKiZ2b2NhYl9iYXNlLCB2b2lkIComc2VhcmNoX2Jhc2UpIHsKKyAgLy8gQ2hlY2tpbmcgQ29uZmlnJ3MgaW5jbHVkZV92b2NhYiBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlci4KKyAgYXNzZXJ0KGhlYWRlcl9zaXplXyAhPSBrSW52YWxpZFNpemUgJiYgdm9jYWJfc2l6ZV8gIT0ga0ludmFsaWRTaXplKTsKKyAgaWYgKCF3cml0ZV9tbWFwXykgeworICAgIC8vIFVuY2hhbmdlZCBiYXNlLgorICAgIHZvY2FiX2Jhc2UgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtZW1vcnlfdm9jYWJfLmdldCgpKTsKKyAgICBzZWFyY2hfYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1lbW9yeV9zZWFyY2hfLmdldCgpKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHdyaXRlX21ldGhvZF8gPT0gQ29uZmlnOjpXUklURV9NTUFQKSB7CisgICAgbWFwcGluZ18ucmVzZXQoKTsKKyAgfQorICB1dGlsOjpTZWVrT3JUaHJvdyhmaWxlXy5nZXQoKSwgVm9jYWJTdHJpbmdSZWFkaW5nT2Zmc2V0KCkpOworICB1dGlsOjpXcml0ZU9yVGhyb3coZmlsZV8uZ2V0KCksICZidWZmZXJbMF0sIGJ1ZmZlci5zaXplKCkpOworICBpZiAod3JpdGVfbWV0aG9kXyA9PSBDb25maWc6OldSSVRFX01NQVApIHsKKyAgICBNYXBGaWxlKHZvY2FiX2Jhc2UsIHNlYXJjaF9iYXNlKTsKKyAgfSBlbHNlIHsKKyAgICB2b2NhYl9iYXNlID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obWVtb3J5X3ZvY2FiXy5nZXQoKSkgKyBoZWFkZXJfc2l6ZV87CisgICAgc2VhcmNoX2Jhc2UgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtZW1vcnlfc2VhcmNoXy5nZXQoKSk7CisgIH0KK30KKwordm9pZCBCaW5hcnlGb3JtYXQ6OkZpbmlzaEZpbGUoY29uc3QgQ29uZmlnICZjb25maWcsIE1vZGVsVHlwZSBtb2RlbF90eXBlLCB1bnNpZ25lZCBpbnQgc2VhcmNoX3ZlcnNpb24sIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzKSB7CisgIGlmICghd3JpdGVfbW1hcF8pIHJldHVybjsKKyAgc3dpdGNoICh3cml0ZV9tZXRob2RfKSB7CisgICAgY2FzZSBDb25maWc6OldSSVRFX01NQVA6CisgICAgICB1dGlsOjpTeW5jT3JUaHJvdyhtYXBwaW5nXy5nZXQoKSwgbWFwcGluZ18uc2l6ZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ29uZmlnOjpXUklURV9BRlRFUjoKKyAgICAgIHV0aWw6OlNlZWtPclRocm93KGZpbGVfLmdldCgpLCAwKTsKKyAgICAgIHV0aWw6OldyaXRlT3JUaHJvdyhmaWxlXy5nZXQoKSwgbWVtb3J5X3ZvY2FiXy5nZXQoKSwgbWVtb3J5X3ZvY2FiXy5zaXplKCkpOworICAgICAgdXRpbDo6U2Vla09yVGhyb3coZmlsZV8uZ2V0KCksIGhlYWRlcl9zaXplXyArIHZvY2FiX3NpemVfICsgdm9jYWJfcGFkXyk7CisgICAgICB1dGlsOjpXcml0ZU9yVGhyb3coZmlsZV8uZ2V0KCksIG1lbW9yeV9zZWFyY2hfLmdldCgpLCBtZW1vcnlfc2VhcmNoXy5zaXplKCkpOworICAgICAgdXRpbDo6RlN5bmNPclRocm93KGZpbGVfLmdldCgpKTsKKyAgICAgIGJyZWFrOworICB9CisgIC8vIGhlYWRlciBhbmQgdm9jYWIgc2hhcmUgdGhlIHNhbWUgbW1hcC4KKyAgUGFyYW1ldGVycyBwYXJhbXMgPSBQYXJhbWV0ZXJzKCk7CisgIG1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YoUGFyYW1ldGVycykpOworICBwYXJhbXMuY291bnRzID0gY291bnRzOworICBwYXJhbXMuZml4ZWQub3JkZXIgPSBjb3VudHMuc2l6ZSgpOworICBwYXJhbXMuZml4ZWQucHJvYmluZ19tdWx0aXBsaWVyID0gY29uZmlnLnByb2JpbmdfbXVsdGlwbGllcjsKKyAgcGFyYW1zLmZpeGVkLm1vZGVsX3R5cGUgPSBtb2RlbF90eXBlOworICBwYXJhbXMuZml4ZWQuaGFzX3ZvY2FidWxhcnkgPSBjb25maWcuaW5jbHVkZV92b2NhYjsKKyAgcGFyYW1zLmZpeGVkLnNlYXJjaF92ZXJzaW9uID0gc2VhcmNoX3ZlcnNpb247CisgIHN3aXRjaCAod3JpdGVfbWV0aG9kXykgeworICAgIGNhc2UgQ29uZmlnOjpXUklURV9NTUFQOgorICAgICAgV3JpdGVIZWFkZXIobWFwcGluZ18uZ2V0KCksIHBhcmFtcyk7CisgICAgICB1dGlsOjpTeW5jT3JUaHJvdyhtYXBwaW5nXy5nZXQoKSwgbWFwcGluZ18uc2l6ZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ29uZmlnOjpXUklURV9BRlRFUjoKKyAgICAgIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyKFRvdGFsSGVhZGVyU2l6ZShjb3VudHMuc2l6ZSgpKSk7CisgICAgICAgIFdyaXRlSGVhZGVyKCZidWZmZXJbMF0sIHBhcmFtcyk7CisgICAgICAgIHV0aWw6OlNlZWtPclRocm93KGZpbGVfLmdldCgpLCAwKTsKKyAgICAgICAgdXRpbDo6V3JpdGVPclRocm93KGZpbGVfLmdldCgpLCAmYnVmZmVyWzBdLCBidWZmZXIuc2l6ZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgQmluYXJ5Rm9ybWF0OjpNYXBGaWxlKHZvaWQgKiZ2b2NhYl9iYXNlLCB2b2lkIComc2VhcmNoX2Jhc2UpIHsKKyAgbWFwcGluZ18ucmVzZXQodXRpbDo6TWFwT3JUaHJvdyh2b2NhYl9zdHJpbmdfb2Zmc2V0XywgdHJ1ZSwgdXRpbDo6a0ZpbGVGbGFncywgZmFsc2UsIGZpbGVfLmdldCgpKSwgdm9jYWJfc3RyaW5nX29mZnNldF8sIHV0aWw6OnNjb3BlZF9tZW1vcnk6Ok1NQVBfQUxMT0NBVEVEKTsKKyAgdm9jYWJfYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1hcHBpbmdfLmdldCgpKSArIGhlYWRlcl9zaXplXzsKKyAgc2VhcmNoX2Jhc2UgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtYXBwaW5nXy5nZXQoKSkgKyBoZWFkZXJfc2l6ZV8gKyB2b2NhYl9zaXplXyArIHZvY2FiX3BhZF87Cit9CisKK2Jvb2wgUmVjb2duaXplQmluYXJ5KGNvbnN0IGNoYXIgKmZpbGUsIE1vZGVsVHlwZSAmcmVjb2duaXplZCkgeworICB1dGlsOjpzY29wZWRfZmQgZmQodXRpbDo6T3BlblJlYWRPclRocm93KGZpbGUpKTsKKyAgaWYgKCFJc0JpbmFyeUZvcm1hdChmZC5nZXQoKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgUGFyYW1ldGVycyBwYXJhbXM7CisgIFJlYWRIZWFkZXIoZmQuZ2V0KCksIHBhcmFtcyk7CisgIHJlY29nbml6ZWQgPSBwYXJhbXMuZml4ZWQubW9kZWxfdHlwZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5ncmFtCit9IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2JpbmFyeV9mb3JtYXQuaGggYi9zcmMva2VubG0vbG0vYmluYXJ5X2Zvcm1hdC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjk5Yjk1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2JpbmFyeV9mb3JtYXQuaGgKQEAgLTAsMCArMSwxMDYgQEAKKyNpZm5kZWYgTE1fQklOQVJZX0ZPUk1BVF9ICisjZGVmaW5lIExNX0JJTkFSWV9GT1JNQVRfSAorCisjaW5jbHVkZSAibG0vY29uZmlnLmhoIgorI2luY2x1ZGUgImxtL21vZGVsX3R5cGUuaGgiCisjaW5jbHVkZSAibG0vcmVhZF9hcnBhLmhoIgorCisjaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgorI2luY2x1ZGUgInV0aWwvbW1hcC5oaCIKKyNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgbmdyYW0geworCitleHRlcm4gY29uc3QgY2hhciAqa01vZGVsTmFtZXNbNl07CisKKy8qSW5zcGVjdCBhIGZpbGUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgYmluYXJ5IGxtLiAgSWYgbm90LCByZXR1cm4gZmFsc2UuCisgKiBJZiBzbywgcmV0dXJuIHRydWUgYW5kIHNldCByZWNvZ25pemVkIHRvIHRoZSB0eXBlLiAgVGhpcyBpcyB0aGUgb25seSBBUEkgaW4KKyAqIHRoaXMgaGVhZGVyIGRlc2lnbmVkIGZvciB1c2UgYnkgZGVjb2RlciBhdXRob3JzLgorICovCitib29sIFJlY29nbml6ZUJpbmFyeShjb25zdCBjaGFyICpmaWxlLCBNb2RlbFR5cGUgJnJlY29nbml6ZWQpOworCitzdHJ1Y3QgRml4ZWRXaWR0aFBhcmFtZXRlcnMgeworICB1bnNpZ25lZCBjaGFyIG9yZGVyOworICBmbG9hdCBwcm9iaW5nX211bHRpcGxpZXI7CisgIC8vIFdoYXQgdHlwZSBvZiBtb2RlbCBpcyB0aGlzPworICBNb2RlbFR5cGUgbW9kZWxfdHlwZTsKKyAgLy8gRG9lcyB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhdmUgdGhlIGFjdHVhbCBzdHJpbmdzIGluIHRoZSB2b2NhYnVsYXJ5PworICBib29sIGhhc192b2NhYnVsYXJ5OworICB1bnNpZ25lZCBpbnQgc2VhcmNoX3ZlcnNpb247Cit9OworCisvLyBUaGlzIGlzIGEgbWFjcm8gaW5zdGVhZCBvZiBhbiBpbmxpbmUgZnVuY3Rpb24gc28gY29uc3RhbnRzIGNhbiBiZSBhc3NpZ25lZCB1c2luZyBpdC4KKyNkZWZpbmUgQUxJR044KGEpICgoc3RkOjpwdHJkaWZmX3QoKChhKS0xKS84KSsxKSo4KQorCisvLyBQYXJhbWV0ZXJzIHN0b3JlZCBpbiB0aGUgaGVhZGVyIG9mIGEgYmluYXJ5IGZpbGUuCitzdHJ1Y3QgUGFyYW1ldGVycyB7CisgIEZpeGVkV2lkdGhQYXJhbWV0ZXJzIGZpeGVkOworICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRzOworfTsKKworY2xhc3MgQmluYXJ5Rm9ybWF0IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJpbmFyeUZvcm1hdChjb25zdCBDb25maWcgJmNvbmZpZyk7CisKKyAgICAvLyBSZWFkaW5nIGEgYmluYXJ5IGZpbGU6CisgICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIGZkCisgICAgdm9pZCBJbml0aWFsaXplQmluYXJ5KGludCBmZCwgTW9kZWxUeXBlIG1vZGVsX3R5cGUsIHVuc2lnbmVkIGludCBzZWFyY2hfdmVyc2lvbiwgUGFyYW1ldGVycyAmcGFyYW1zKTsKKyAgICAvLyBVc2VkIHRvIHJlYWQgcGFydHMgb2YgdGhlIGZpbGUgdG8gdXBkYXRlIHRoZSBjb25maWcgb2JqZWN0IGJlZm9yZSBmaWd1cmluZyBvdXQgZnVsbCBzaXplLgorICAgIHZvaWQgUmVhZEZvckNvbmZpZyh2b2lkICp0bywgc3RkOjpzaXplX3QgYW1vdW50LCB1aW50NjRfdCBvZmZzZXRfZXhjbHVkaW5nX2hlYWRlcikgY29uc3Q7CisgICAgLy8gQWN0dWFsbHkgbG9hZCB0aGUgYmluYXJ5IGZpbGUgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VhcmNoIGFyZWEuCisgICAgdm9pZCAqTG9hZEJpbmFyeShzdGQ6OnNpemVfdCBzaXplKTsKKworICAgIHVpbnQ2NF90IFZvY2FiU3RyaW5nUmVhZGluZ09mZnNldCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCh2b2NhYl9zdHJpbmdfb2Zmc2V0XyAhPSBrSW52YWxpZE9mZnNldCk7CisgICAgICByZXR1cm4gdm9jYWJfc3RyaW5nX29mZnNldF87CisgICAgfQorCisgICAgLy8gV3JpdGluZyBhIGJpbmFyeSBmaWxlIG9yIGluaXRpYWxpemluZyBpbiBSQU0gZnJvbSBBUlBBOgorICAgIC8vIFNpemUgZm9yIHZvY2FidWxhcnkuCisgICAgdm9pZCAqU2V0dXBKdXN0Vm9jYWIoc3RkOjpzaXplX3QgbWVtb3J5X3NpemUsIHVpbnQ4X3Qgb3JkZXIpOworICAgIC8vIFdhcm5pbmc6IGNhbiBjaGFuZ2UgdGhlIHZvY2F1bGFyeSBiYXNlIHBvaW50ZXIuCisgICAgdm9pZCAqR3Jvd0ZvclNlYXJjaChzdGQ6OnNpemVfdCBtZW1vcnlfc2l6ZSwgc3RkOjpzaXplX3Qgdm9jYWJfcGFkLCB2b2lkIComdm9jYWJfYmFzZSk7CisgICAgLy8gV2FybmluZzogY2FuIGNoYW5nZSB2b2NhYnVsYXJ5IGFuZCBzZWFyY2ggYmFzZSBhZGRyZXNzZXMuCisgICAgdm9pZCBXcml0ZVZvY2FiV29yZHMoY29uc3Qgc3RkOjpzdHJpbmcgJmJ1ZmZlciwgdm9pZCAqJnZvY2FiX2Jhc2UsIHZvaWQgKiZzZWFyY2hfYmFzZSk7CisgICAgLy8gV3JpdGUgdGhlIGhlYWRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICAgIHZvaWQgRmluaXNoRmlsZShjb25zdCBDb25maWcgJmNvbmZpZywgTW9kZWxUeXBlIG1vZGVsX3R5cGUsIHVuc2lnbmVkIGludCBzZWFyY2hfdmVyc2lvbiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMpOworCisgIHByaXZhdGU6CisgICAgdm9pZCBNYXBGaWxlKHZvaWQgKiZ2b2NhYl9iYXNlLCB2b2lkIComc2VhcmNoX2Jhc2UpOworCisgICAgLy8gQ29waWVkIGZyb20gY29uZmlndXJhdGlvbi4KKyAgICBjb25zdCBDb25maWc6OldyaXRlTWV0aG9kIHdyaXRlX21ldGhvZF87CisgICAgY29uc3QgY2hhciAqd3JpdGVfbW1hcF87CisgICAgdXRpbDo6TG9hZE1ldGhvZCBsb2FkX21ldGhvZF87CisKKyAgICAvLyBGaWxlIGJlaGluZCBtZW1vcnksIGlmIGFueS4KKyAgICB1dGlsOjpzY29wZWRfZmQgZmlsZV87CisKKyAgICAvLyBJZiB0aGVyZSBpcyBhIGZpbGUgaW52b2x2ZWQsIGEgc2luZ2xlIG1hcHBpbmcuCisgICAgdXRpbDo6c2NvcGVkX21lbW9yeSBtYXBwaW5nXzsKKworICAgIC8vIElmIHRoZSBkYXRhIGlzIG9ubHkgaW4gbWVtb3J5LCBzZXBhcmF0ZWx5IGFsbG9jYXRlIGVhY2ggYmVjYXVzZSB0aGUgdHJpZQorICAgIC8vIGtub3dzIHZvY2FiJ3Mgc2l6ZSBiZWZvcmUgaXQga25vd3Mgc2VhcmNoJ3Mgc2l6ZSAoYmVjYXVzZSBTUklMTSBtaWdodAorICAgIC8vIGhhdmUgcHJ1bmVkKS4KKyAgICB1dGlsOjpzY29wZWRfbWVtb3J5IG1lbW9yeV92b2NhYl8sIG1lbW9yeV9zZWFyY2hfOworCisgICAgLy8gTWVtb3J5IHJhbmdlcy4gIE5vdGUgdGhhdCB0aGVzZSBtYXkgbm90IGJlIGNvbnRpZ3VvdXMgYW5kIG1heSBub3QgYWxsCisgICAgLy8gZXhpc3QuCisgICAgc3RkOjpzaXplX3QgaGVhZGVyX3NpemVfLCB2b2NhYl9zaXplXywgdm9jYWJfcGFkXzsKKyAgICAvLyBha2EgZW5kIG9mIHNlYXJjaC4KKyAgICB1aW50NjRfdCB2b2NhYl9zdHJpbmdfb2Zmc2V0XzsKKworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrSW52YWxpZE9mZnNldCA9ICh1aW50NjRfdCktMTsKK307CisKK2Jvb2wgSXNCaW5hcnlGb3JtYXQoaW50IGZkKTsKKworfSAvLyBuYW1lc3BhY2UgbmdyYW0KK30gLy8gbmFtZXNwYWNlIGxtCisjZW5kaWYgLy8gTE1fQklOQVJZX0ZPUk1BVF9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYmxhbmsuaGggYi9zcmMva2VubG0vbG0vYmxhbmsuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5MDU0YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9ibGFuay5oaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIExNX0JMQU5LX0gKKyNkZWZpbmUgTE1fQkxBTktfSAorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGNtYXRoPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKKworLyogU3VwcG9zZSAiZm9vIGJhciIgYXBwZWFycyB3aXRoIHplcm8gYmFja29mZiBidXQgdGhlcmUgaXMgbm8gdHJpZ3JhbQorICogYmVnaW5uaW5nIHdpdGggdGhlc2Ugd29yZHMuICBUaGVuLCB3aGVuIHNjb3JpbmcgImZvbyBiYXIiLCB0aGUgbW9kZWwgY291bGQKKyAqIHJldHVybiBvdXRfc3RhdGUgY29udGFpbmluZyAiYmFyIiBvciBldmVuIG51bGwgY29udGV4dCBpZiAiYmFyIiBhbHNvIGhhcyBubworICogYmFja29mZiBhbmQgaXMgbmV2ZXIgZm9sbG93ZWQgYnkgYW5vdGhlciB3b3JkLiAgVGhlbiB0aGUgYmFja29mZiBpcyBzZXQgdG8KKyAqIGtOb0V4dGVuc2lvbkJhY2tvZmYuICBJZiB0aGUgbi1ncmFtIG1pZ2h0IGJlIGV4dGVuZGVkLCB0aGVuIG91dF9zdGF0ZSBtdXN0CisgKiBjb250YWluIHRoZSBmdWxsIG4tZ3JhbSwgaW4gd2hpY2ggY2FzZSBrRXh0ZW5zaW9uQmFja29mZiBpcyBzZXQuICBJbiBhbnkKKyAqIGNhc2UsIGlmIGFuIG4tZ3JhbSBoYXMgbm9uLXplcm8gYmFja29mZiwgdGhlIGZ1bGwgc3RhdGUgaXMgcmV0dXJuZWQgc28KKyAqIGJhY2tvZmYgY2FuIGJlIHByb3Blcmx5IGNoYXJnZWQuCisgKiBUaGVzZSBkaWZmZXIgb25seSBpbiBzaWduIGJpdCBiZWNhdXNlIHRoZSBiYWNrb2ZmIGlzIGluIGZhY3QgemVybyBpbiBlaXRoZXIKKyAqIGNhc2UuCisgKi8KK2NvbnN0IGZsb2F0IGtOb0V4dGVuc2lvbkJhY2tvZmYgPSAtMC4wOworY29uc3QgZmxvYXQga0V4dGVuc2lvbkJhY2tvZmYgPSAwLjA7Citjb25zdCB1aW50NjRfdCBrTm9FeHRlbnNpb25RdWFudCA9IDA7Citjb25zdCB1aW50NjRfdCBrRXh0ZW5zaW9uUXVhbnQgPSAxOworCitpbmxpbmUgdm9pZCBTZXRFeHRlbnNpb24oZmxvYXQgJmJhY2tvZmYpIHsKKyAgaWYgKGJhY2tvZmYgPT0ga05vRXh0ZW5zaW9uQmFja29mZikgYmFja29mZiA9IGtFeHRlbnNpb25CYWNrb2ZmOworfQorCisvLyBUaGlzIGNvbXBpbGVzIGRvd24gbmljZWx5LgoraW5saW5lIGJvb2wgSGFzRXh0ZW5zaW9uKGNvbnN0IGZsb2F0ICZiYWNrb2ZmKSB7CisgIHR5cGVkZWYgdW5pb24geyBmbG9hdCBmOyB1aW50MzJfdCBpOyB9IFVuaW9uVmFsdWU7CisgIFVuaW9uVmFsdWUgY29tcGFyZSwgaW50ZXJwcmV0OworICBjb21wYXJlLmYgPSBrTm9FeHRlbnNpb25CYWNrb2ZmOworICBpbnRlcnByZXQuZiA9IGJhY2tvZmY7CisgIHJldHVybiBjb21wYXJlLmkgIT0gaW50ZXJwcmV0Lmk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5ncmFtCit9IC8vIG5hbWVzcGFjZSBsbQorI2VuZGlmIC8vIExNX0JMQU5LX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9idWlsZF9iaW5hcnlfbWFpbi5jYyBiL3NyYy9rZW5sbS9sbS9idWlsZF9iaW5hcnlfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTIwNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2J1aWxkX2JpbmFyeV9tYWluLmNjCkBAIC0wLDAgKzEsMjM0IEBACisjaW5jbHVkZSAibG0vbW9kZWwuaGgiCisjaW5jbHVkZSAibG0vc2l6ZXMuaGgiCisjaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgorI2luY2x1ZGUgInV0aWwvdXNhZ2UuaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworI2lmZGVmIFdJTjMyCisjaW5jbHVkZSAidXRpbC9nZXRvcHQuaGgiCisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgbmdyYW0geworbmFtZXNwYWNlIHsKKwordm9pZCBVc2FnZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZWZhdWx0X21lbSkgeworICBzdGQ6OmNlcnIgPDwgIlVzYWdlOiAiIDw8IG5hbWUgPDwgIiBbLXUgbG9nMTBfdW5rbm93bl9wcm9iYWJpbGl0eV0gWy1zXSBbLWldIFstdyBtbWFwfGFmdGVyXSBbLXAgcHJvYmluZ19tdWx0aXBsaWVyXSBbLVQgdHJpZV90ZW1wb3JhcnldIFstUyB0cmllX2J1aWxkaW5nX21lbV0gWy1xIGJpdHNdIFstYiBiaXRzXSBbLWEgYml0c10gW3R5cGVdIGlucHV0LmFycGEgW291dHB1dC5tbWFwXVxuXG4iCisiLXUgc2V0cyB0aGUgbG9nMTAgcHJvYmFiaWxpdHkgZm9yIDx1bms+IGlmIHRoZSBBUlBBIGZpbGUgZG9lcyBub3QgaGF2ZSBvbmUuXG4iCisiICAgRGVmYXVsdCBpcyAtMTAwLiAgVGhlIEFSUEEgZmlsZSB3aWxsIGFsd2F5cyB0YWtlIHByZWNlZGVuY2UuXG4iCisiLXMgYWxsb3dzIG1vZGVscyB0byBiZSBidWlsdCBldmVuIGlmIHRoZXkgZG8gbm90IGhhdmUgPHM+IGFuZCA8L3M+LlxuIgorIi1pIGFsbG93cyBidWdneSBtb2RlbHMgZnJvbSBJUlNUTE0gYnkgbWFwcGluZyBwb3NpdGl2ZSBsb2cgcHJvYmFiaWxpdHkgdG8gMC5cbiIKKyItdyBtbWFwfGFmdGVyIGRldGVybWluZXMgaG93IHdyaXRpbmcgaXMgZG9uZS5cbiIKKyIgICBtbWFwIG1hcHMgdGhlIGJpbmFyeSBmaWxlIGFuZCB3cml0ZXMgdG8gaXQuICBEZWZhdWx0IGZvciB0cmllLlxuIgorIiAgIGFmdGVyIGFsbG9jYXRlcyBhbm9ueW1vdXMgbWVtb3J5LCBidWlsZHMsIGFuZCB3cml0ZXMuICBEZWZhdWx0IGZvciBwcm9iaW5nLlxuIgorIi1yIFwib3JkZXIxLmFycGEgb3JkZXIyIG9yZGVyMyBvcmRlcjRcIiBhZGRzIGxvd2VyLW9yZGVyIHJlc3QgY29zdHMgZnJvbSB0aGVzZVxuIgorIiAgIG1vZGVsIGZpbGVzLiAgb3JkZXIxLmFycGEgbXVzdCBiZSBhbiBBUlBBIGZpbGUuICBBbGwgb3RoZXJzIG1heSBiZSBBUlBBIG9yXG4iCisiICAgdGhlIHNhbWUgZGF0YSBzdHJ1Y3R1cmUgYXMgYmVpbmcgYnVpbHQuICBBbGwgZmlsZXMgbXVzdCBoYXZlIHRoZSBzYW1lXG4iCisiICAgdm9jYWJ1bGFyeS4gIEZvciBwcm9iaW5nLCB0aGUgdW5pZ3JhbXMgbXVzdCBiZSBpbiB0aGUgc2FtZSBvcmRlci5cblxuIgorInR5cGUgaXMgZWl0aGVyIHByb2Jpbmcgb3IgdHJpZS4gIERlZmF1bHQgaXMgcHJvYmluZy5cblxuIgorInByb2JpbmcgdXNlcyBhIHByb2JpbmcgaGFzaCB0YWJsZS4gIEl0IGlzIHRoZSBmYXN0ZXN0IGJ1dCB1c2VzIHRoZSBtb3N0IG1lbW9yeS5cbiIKKyItcCBzZXRzIHRoZSBzcGFjZSBtdWx0aXBsaWVyIGFuZCBtdXN0IGJlID4xLjAuICBUaGUgZGVmYXVsdCBpcyAxLjUuXG5cbiIKKyJ0cmllIGlzIGEgc3RyYWlnaHRmb3J3YXJkIHRyaWUgd2l0aCBiaXQtbGV2ZWwgcGFja2luZy4gIEl0IHVzZXMgdGhlIGxlYXN0XG4iCisibWVtb3J5IGFuZCBpcyBzdGlsbCBmYXN0ZXIgdGhhbiBTUkkgb3IgSVJTVC4gIEJ1aWxkaW5nIHRoZSB0cmllIGZvcm1hdCB1c2VzIGFuXG4iCisib24tZGlzayBzb3J0IHRvIHNhdmUgbWVtb3J5LlxuIgorIi1UIGlzIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHByZWZpeC4gIERlZmF1bHQgaXMgdGhlIG91dHB1dCBmaWxlIG5hbWUuXG4iCisiLVMgZGV0ZXJtaW5lcyBtZW1vcnkgdXNlIGZvciBzb3J0aW5nLiAgRGVmYXVsdCBpcyAiIDw8IGRlZmF1bHRfbWVtIDw8ICIuICBUaGlzIGlzIGNvbXBhdGlibGVcbiIKKyIgICB3aXRoIEdOVSBzb3J0LiAgVGhlIG51bWJlciBpcyBmb2xsb3dlZCBieSBhIHVuaXQ6IFwlIGZvciBwZXJjZW50IG9mIHBoeXNpY2FsXG4iCisiICAgbWVtb3J5LCBiIGZvciBieXRlcywgSyBmb3IgS2lsb2J5dGVzLCBNIGZvciBtZWdhYnl0ZXMsIHRoZW4gRyxULFAsRSxaLFkuICBcbiIKKyIgICBEZWZhdWx0IHVuaXQgaXMgSyBmb3IgS2lsb2J5dGVzLlxuIgorIi1xIHR1cm5zIHF1YW50aXphdGlvbiBvbiBhbmQgc2V0cyB0aGUgbnVtYmVyIG9mIGJpdHMgKGUuZy4gLXEgOCkuXG4iCisiLWIgc2V0cyBiYWNrb2ZmIHF1YW50aXphdGlvbiBiaXRzLiAgUmVxdWlyZXMgLXEgYW5kIGRlZmF1bHRzIHRvIHRoYXQgdmFsdWUuXG4iCisiLWEgY29tcHJlc3NlcyBwb2ludGVycyB1c2luZyBhbiBhcnJheSBvZiBvZmZzZXRzLiAgVGhlIHBhcmFtZXRlciBpcyB0aGVcbiIKKyIgICBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGVuY29kZWQgYnkgdGhlIGFycmF5LiAgTWVtb3J5IGlzIG1pbmltaXplZCBzdWJqZWN0XG4iCisiICAgdG8gdGhlIG1heGltdW0sIHNvIHBpY2sgMjU1IHRvIG1pbmltaXplIG1lbW9yeS5cblxuIgorIi1oIHByaW50IHRoaXMgaGVscCBtZXNzYWdlLlxuXG4iCisiR2V0IGEgbWVtb3J5IGVzdGltYXRlIGJ5IHBhc3NpbmcgYW4gQVJQQSBmaWxlIHdpdGhvdXQgYW4gb3V0cHV0IGZpbGUgbmFtZS5cbiI7CisgIGV4aXQoMSk7Cit9CisKKy8vIEkgY291bGQgcmVhbGx5IHVzZSBib29zdDo6bGV4aWNhbF9jYXN0IHJpZ2h0IGFib3V0IG5vdy4KK2Zsb2F0IFBhcnNlRmxvYXQoY29uc3QgY2hhciAqZnJvbSkgeworICBjaGFyICplbmQ7CisgIGZsb2F0IHJldCA9IHN0cnRvZChmcm9tLCAmZW5kKTsKKyAgaWYgKCplbmQpIHRocm93IHV0aWw6OlBhcnNlTnVtYmVyRXhjZXB0aW9uKGZyb20pOworICByZXR1cm4gcmV0OworfQordW5zaWduZWQgbG9uZyBpbnQgUGFyc2VVSW50KGNvbnN0IGNoYXIgKmZyb20pIHsKKyAgY2hhciAqZW5kOworICB1bnNpZ25lZCBsb25nIGludCByZXQgPSBzdHJ0b3VsKGZyb20sICZlbmQsIDEwKTsKKyAgaWYgKCplbmQpIHRocm93IHV0aWw6OlBhcnNlTnVtYmVyRXhjZXB0aW9uKGZyb20pOworICByZXR1cm4gcmV0OworfQorCit1aW50OF90IFBhcnNlQml0Q291bnQoY29uc3QgY2hhciAqZnJvbSkgeworICB1bnNpZ25lZCBsb25nIHZhbCA9IFBhcnNlVUludChmcm9tKTsKKyAgaWYgKHZhbCA+IDI1KSB7CisgICAgdXRpbDo6UGFyc2VOdW1iZXJFeGNlcHRpb24gZShmcm9tKTsKKyAgICBlIDw8ICIgYml0IGNvdW50cyBhcmUgbGltaXRlZCB0byAyNS4iOworICB9CisgIHJldHVybiB2YWw7Cit9CisKK3ZvaWQgUGFyc2VGaWxlTGlzdChjb25zdCBjaGFyICpmcm9tLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnRvKSB7CisgIHRvLmNsZWFyKCk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgY29uc3QgY2hhciAqaTsKKyAgICBmb3IgKGkgPSBmcm9tOyAqaSAmJiAqaSAhPSAnICc7ICsraSkge30KKyAgICB0by5wdXNoX2JhY2soc3RkOjpzdHJpbmcoZnJvbSwgaSAtIGZyb20pKTsKKyAgICBpZiAoISppKSBicmVhazsKKyAgICBmcm9tID0gaSArIDE7CisgIH0KK30KKwordm9pZCBQcm9iaW5nUXVhbnRpemF0aW9uVW5zdXBwb3J0ZWQoKSB7CisgIHN0ZDo6Y2VyciA8PCAiUXVhbnRpemF0aW9uIGlzIG9ubHkgaW1wbGVtZW50ZWQgaW4gdGhlIHRyaWUgZGF0YSBzdHJ1Y3R1cmUuIiA8PCBzdGQ6OmVuZGw7CisgIGV4aXQoMSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5ncmFtCit9IC8vIG5hbWVzcGFjZSBsbQorfSAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICB1c2luZyBuYW1lc3BhY2UgbG06Om5ncmFtOworCisgIGNvbnN0IGNoYXIgKmRlZmF1bHRfbWVtID0gdXRpbDo6R3Vlc3NQaHlzaWNhbE1lbW9yeSgpID8gIjgwJSIgOiAiMUciOworCisgIGlmIChhcmdjID09IDIgJiYgIXN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikpCisgICAgVXNhZ2UoYXJndlswXSwgZGVmYXVsdF9tZW0pOworCisgIHRyeSB7CisgICAgYm9vbCBxdWFudGl6ZSA9IGZhbHNlLCBzZXRfYmFja29mZl9iaXRzID0gZmFsc2UsIGJoaWtzaGEgPSBmYWxzZSwgc2V0X3dyaXRlX21ldGhvZCA9IGZhbHNlLCByZXN0ID0gZmFsc2U7CisgICAgbG06Om5ncmFtOjpDb25maWcgY29uZmlnOworICAgIGNvbmZpZy5idWlsZGluZ19tZW1vcnkgPSB1dGlsOjpQYXJzZVNpemUoZGVmYXVsdF9tZW0pOworICAgIGludCBvcHQ7CisgICAgd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgInE6YjphOnU6cDp0OlQ6bTpTOnc6c2lyOmgiKSkgIT0gLTEpIHsKKyAgICAgIHN3aXRjaChvcHQpIHsKKyAgICAgICAgY2FzZSAncSc6CisgICAgICAgICAgY29uZmlnLnByb2JfYml0cyA9IFBhcnNlQml0Q291bnQob3B0YXJnKTsKKyAgICAgICAgICBpZiAoIXNldF9iYWNrb2ZmX2JpdHMpIGNvbmZpZy5iYWNrb2ZmX2JpdHMgPSBjb25maWcucHJvYl9iaXRzOworICAgICAgICAgIHF1YW50aXplID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgY29uZmlnLmJhY2tvZmZfYml0cyA9IFBhcnNlQml0Q291bnQob3B0YXJnKTsKKyAgICAgICAgICBzZXRfYmFja29mZl9iaXRzID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYSc6CisgICAgICAgICAgY29uZmlnLnBvaW50ZXJfYmhpa3NoYV9iaXRzID0gUGFyc2VCaXRDb3VudChvcHRhcmcpOworICAgICAgICAgIGJoaWtzaGEgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICBjb25maWcudW5rbm93bl9taXNzaW5nX2xvZ3Byb2IgPSBQYXJzZUZsb2F0KG9wdGFyZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgIGNvbmZpZy5wcm9iaW5nX211bHRpcGxpZXIgPSBQYXJzZUZsb2F0KG9wdGFyZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3QnOiAvLyBsZWdhY3kKKyAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgY29uZmlnLnRlbXBvcmFyeV9kaXJlY3RvcnlfcHJlZml4ID0gb3B0YXJnOworICAgICAgICAgIHV0aWw6Ok5vcm1hbGl6ZVRlbXBQcmVmaXgoY29uZmlnLnRlbXBvcmFyeV9kaXJlY3RvcnlfcHJlZml4KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6IC8vIGxlZ2FjeQorICAgICAgICAgIGNvbmZpZy5idWlsZGluZ19tZW1vcnkgPSBQYXJzZVVJbnQob3B0YXJnKSAqIDEwNDg1NzY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgIGNvbmZpZy5idWlsZGluZ19tZW1vcnkgPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnNpemVfdD46Om1heCgpKSwgdXRpbDo6UGFyc2VTaXplKG9wdGFyZykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICBzZXRfd3JpdGVfbWV0aG9kID0gdHJ1ZTsKKyAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsICJtbWFwIikpIHsKKyAgICAgICAgICAgIGNvbmZpZy53cml0ZV9tZXRob2QgPSBDb25maWc6OldSSVRFX01NQVA7CisgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgImFmdGVyIikpIHsKKyAgICAgICAgICAgIGNvbmZpZy53cml0ZV9tZXRob2QgPSBDb25maWc6OldSSVRFX0FGVEVSOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBVc2FnZShhcmd2WzBdLCBkZWZhdWx0X21lbSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICBjb25maWcuc2VudGVuY2VfbWFya2VyX21pc3NpbmcgPSBsbTo6U0lMRU5UOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICBjb25maWcucG9zaXRpdmVfbG9nX3Byb2JhYmlsaXR5ID0gbG06OlNJTEVOVDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgcmVzdCA9IHRydWU7CisgICAgICAgICAgUGFyc2VGaWxlTGlzdChvcHRhcmcsIGNvbmZpZy5yZXN0X2xvd2VyX2ZpbGVzKTsKKyAgICAgICAgICBjb25maWcucmVzdF9mdW5jdGlvbiA9IENvbmZpZzo6UkVTVF9MT1dFUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnaCc6IC8vIGhlbHAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBVc2FnZShhcmd2WzBdLCBkZWZhdWx0X21lbSk7CisgICAgICB9CisgICAgfQorICAgIGlmICghcXVhbnRpemUgJiYgc2V0X2JhY2tvZmZfYml0cykgeworICAgICAgc3RkOjpjZXJyIDw8ICJZb3Ugc3BlY2lmaWVkIGJhY2tvZmYgcXVhbnRpemF0aW9uICgtYikgYnV0IG5vdCBwcm9iYWJpbGl0eSBxdWFudGl6YXRpb24gKC1xKSIgPDwgc3RkOjplbmRsOworICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgaWYgKG9wdGluZCArIDEgPT0gYXJnYykgeworICAgICAgU2hvd1NpemVzKGFyZ3Zbb3B0aW5kXSwgY29uZmlnKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBjaGFyICptb2RlbF90eXBlOworICAgIGNvbnN0IGNoYXIgKmZyb21fZmlsZTsKKworICAgIGlmIChvcHRpbmQgKyAyID09IGFyZ2MpIHsKKyAgICAgIG1vZGVsX3R5cGUgPSAicHJvYmluZyI7CisgICAgICBmcm9tX2ZpbGUgPSBhcmd2W29wdGluZF07CisgICAgICBjb25maWcud3JpdGVfbW1hcCA9IGFyZ3Zbb3B0aW5kICsgMV07CisgICAgfSBlbHNlIGlmIChvcHRpbmQgKyAzID09IGFyZ2MpIHsKKyAgICAgIG1vZGVsX3R5cGUgPSBhcmd2W29wdGluZF07CisgICAgICBmcm9tX2ZpbGUgPSBhcmd2W29wdGluZCArIDFdOworICAgICAgY29uZmlnLndyaXRlX21tYXAgPSBhcmd2W29wdGluZCArIDJdOworICAgIH0gZWxzZSB7CisgICAgICBVc2FnZShhcmd2WzBdLCBkZWZhdWx0X21lbSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAobW9kZWxfdHlwZSwgInByb2JpbmciKSkgeworICAgICAgaWYgKCFzZXRfd3JpdGVfbWV0aG9kKSBjb25maWcud3JpdGVfbWV0aG9kID0gQ29uZmlnOjpXUklURV9BRlRFUjsKKyAgICAgIGlmIChxdWFudGl6ZSB8fCBzZXRfYmFja29mZl9iaXRzKSBQcm9iaW5nUXVhbnRpemF0aW9uVW5zdXBwb3J0ZWQoKTsKKyAgICAgIGlmIChyZXN0KSB7CisgICAgICAgIFJlc3RQcm9iaW5nTW9kZWwoZnJvbV9maWxlLCBjb25maWcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHJvYmluZ01vZGVsKGZyb21fZmlsZSwgY29uZmlnKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobW9kZWxfdHlwZSwgInRyaWUiKSkgeworICAgICAgaWYgKHJlc3QpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJSZXN0ICsgdHJpZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBpZiAoIXNldF93cml0ZV9tZXRob2QpIGNvbmZpZy53cml0ZV9tZXRob2QgPSBDb25maWc6OldSSVRFX01NQVA7CisgICAgICBpZiAocXVhbnRpemUpIHsKKyAgICAgICAgaWYgKGJoaWtzaGEpIHsKKyAgICAgICAgICBRdWFudEFycmF5VHJpZU1vZGVsKGZyb21fZmlsZSwgY29uZmlnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBRdWFudFRyaWVNb2RlbChmcm9tX2ZpbGUsIGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChiaGlrc2hhKSB7CisgICAgICAgICAgQXJyYXlUcmllTW9kZWwoZnJvbV9maWxlLCBjb25maWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFRyaWVNb2RlbChmcm9tX2ZpbGUsIGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgVXNhZ2UoYXJndlswXSwgZGVmYXVsdF9tZW0pOworICAgIH0KKyAgfQorICBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24gJmUpIHsKKyAgICBzdGQ6OmNlcnIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiRVJST1IiIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzdGQ6OmNlcnIgPDwgIlNVQ0NFU1MiIDw8IHN0ZDo6ZW5kbDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYnVpbGRlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMGQzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vYnVpbGRlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDY3IEBACitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjgpCisjCisjIFRoZSBLZW5MTSBjbWFrZSBmaWxlcyBtYWtlIHVzZSBvZiBhZGRfbGlicmFyeSguLi4gT0JKRUNUUyAuLi4pCisjIAorIyBUaGlzIHN5bnRheCBhbGxvd3MgZ3JvdXBpbmcgb2Ygc291cmNlIGZpbGVzIHdoZW4gY29tcGlsaW5nCisjIChlZmZlY3RpdmVseSBjcmVhdGluZyAiZmFrZSIgbGlicmFyaWVzIGJhc2VkIG9uIHNvdXJjZSBzdWJkaXJzKS4KKyMgCisjIFRoaXMgc3ludGF4IHdhcyBvbmx5IGFkZGVkIGluIGNtYWtlIHZlcnNpb24gMi44LjgKKyMKKyMgc2VlIGh0dHA6Ly93d3cuY21ha2Uub3JnL1dpa2kvQ01ha2UvVHV0b3JpYWxzL09iamVjdF9MaWJyYXJ5CisKKworIyBUaGlzIENNYWtlIGZpbGUgd2FzIGNyZWF0ZWQgYnkgTGFuZSBTY2h3YXJ0eiA8ZG93b2JlaGFAZ21haWwuY29tPgorCisjIEV4cGxpY2l0bHkgbGlzdCB0aGUgc291cmNlIGZpbGVzIGZvciB0aGlzIHN1YmRpcmVjdG9yeQorIworIyBJZiB5b3UgYWRkIGFueSBzb3VyY2UgZmlsZXMgdG8gdGhpcyBzdWJkaXJlY3RvcnkKKyMgICAgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGtlbmxtIGxpYnJhcnksCisjICAgICAgICAodGhpcyBleGNsdWRlcyBhbnkgdW5pdCB0ZXN0IGZpbGVzKQorIyAgICB5b3Ugc2hvdWxkIGFkZCB0aGVtIHRvIHRoZSBmb2xsb3dpbmcgbGlzdDoKKyMKKyMgSW4gb3JkZXIgdG8gc2V0IGNvcnJlY3QgcGF0aHMgdG8gdGhlc2UgZmlsZXMKKyMgICAgaW4gY2FzZSB0aGlzIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgYnkgQ01ha2UgZmlsZXMgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnksCisjICAgIHdlIHByZWZpeCBhbGwgZmlsZXMgd2l0aCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0uCisjCitzZXQoS0VOTE1fQlVJTERFUl9TT1VSQ0UgCisJCSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9hZGp1c3RfY291bnRzLmNjCisJCSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb3JwdXNfY291bnQuY2MKKwkJJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2luaXRpYWxfcHJvYmFiaWxpdGllcy5jYworCQkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW50ZXJwb2xhdGUuY2MKKwkJJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L291dHB1dC5jYworCQkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcGlwZWxpbmUuY2MKKwkpCisKKworIyBHcm91cCB0aGVzZSBvYmplY3RzIHRvZ2V0aGVyIGZvciBsYXRlciB1c2UuIAorIworIyBHaXZlbiBhZGRfbGlicmFyeShmb28gT0JKRUNUICR7bXlfZm9vX3NvdXJjZXN9KSwKKyMgcmVmZXIgdG8gdGhlc2Ugb2JqZWN0cyBhcyAkPFRBUkdFVF9PQkpFQ1RTOmZvbz4KKyMKK2FkZF9saWJyYXJ5KGtlbmxtX2J1aWxkZXIgT0JKRUNUICR7S0VOTE1fQlVJTERFUl9TT1VSQ0V9KQorCisKKyMgQ29tcGlsZSB0aGUgZXhlY3V0YWJsZSwgbGlua2luZyBhZ2FpbnN0IHRoZSByZXF1aXNpdGUgZGVwZW5kZW50IG9iamVjdCBmaWxlcworYWRkX2V4ZWN1dGFibGUobG1wbHogbG1wbHpfbWFpbi5jYyAkPFRBUkdFVF9PQkpFQ1RTOmtlbmxtPiAkPFRBUkdFVF9PQkpFQ1RTOmtlbmxtX2NvbW1vbj4gJDxUQVJHRVRfT0JKRUNUUzprZW5sbV9idWlsZGVyPiAkPFRBUkdFVF9PQkpFQ1RTOmtlbmxtX3V0aWw+KQorCisjIExpbmsgdGhlIGV4ZWN1dGFibGUgYWdhaW5zdCBib29zdAordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGxtcGx6ICR7Qm9vc3RfTElCUkFSSUVTfSBwdGhyZWFkKQorCisjIEdyb3VwIGV4ZWN1dGFibGVzIHRvZ2V0aGVyCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMobG1wbHogUFJPUEVSVElFUyBGT0xERVIgZXhlY3V0YWJsZXMpCisKK2lmKEJVSUxEX1RFU1RJTkcpCisKKyAgIyBFeHBsaWNpdGx5IGxpc3QgdGhlIEJvb3N0IHRlc3QgZmlsZXMgdG8gYmUgY29tcGlsZWQKKyAgc2V0KEtFTkxNX0JPT1NUX1RFU1RTX0xJU1QKKyAgICBhZGp1c3RfY291bnRzX3Rlc3QKKyAgICBjb3JwdXNfY291bnRfdGVzdAorICApCisKKyAgQWRkVGVzdHMoVEVTVFMgJHtLRU5MTV9CT09TVF9URVNUU19MSVNUfQorICAgICAgICAgICBERVBFTkRTICQ8VEFSR0VUX09CSkVDVFM6a2VubG0+CisgICAgICAgICAgICAgICAgICAgJDxUQVJHRVRfT0JKRUNUUzprZW5sbV9jb21tb24+CisgICAgICAgICAgICAgICAgICAgJDxUQVJHRVRfT0JKRUNUUzprZW5sbV91dGlsPgorICAgICAgICAgICAgICAgICAgICQ8VEFSR0VUX09CSkVDVFM6a2VubG1fYnVpbGRlcj4KKyAgICAgICAgICAgTElCUkFSSUVTICR7Qm9vc3RfTElCUkFSSUVTfSBwdGhyZWFkKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2J1aWxkZXIvSmFtZmlsZSBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL0phbWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5YThlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL0phbWZpbGUKQEAgLTAsMCArMSwxMyBAQAorZmFrZWxpYiBidWlsZGVyIDogWyBnbG9iICouY2MgOiAqdGVzdC5jYyAqbWFpbi5jYyBdCisgIC4uLy4uL3V0aWwvL2tlbnV0aWwgLi4vLi4vdXRpbC9zdHJlYW0vL3N0cmVhbSAuLi8uLi91dGlsL2RvdWJsZS1jb252ZXJzaW9uLy9kb3VibGUtY29udmVyc2lvbiAuLi8va2VubG0gLi4vY29tbW9uLy9jb21tb24KKyAgOiA6IDogPGxpYnJhcnk+L3RvcC8vYm9vc3RfdGhyZWFkICQodGltZXItbGluaykgOworCitleGUgbG1wbHogOiBsbXBsel9tYWluLmNjIGJ1aWxkZXIgL3RvcC8vYm9vc3RfcHJvZ3JhbV9vcHRpb25zIDsKKworZXhlIGR1bXBfY291bnRzIDogZHVtcF9jb3VudHNfbWFpbi5jYyBidWlsZGVyIDsKKworYWxpYXMgcHJvZ3JhbXMgOiBsbXBseiBkdW1wX2NvdW50cyA7CisKK2ltcG9ydCB0ZXN0aW5nIDsKK3VuaXQtdGVzdCBjb3JwdXNfY291bnRfdGVzdCA6IGNvcnB1c19jb3VudF90ZXN0LmNjIGJ1aWxkZXIgL3RvcC8vYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yayA7Cit1bml0LXRlc3QgYWRqdXN0X2NvdW50c190ZXN0IDogYWRqdXN0X2NvdW50c190ZXN0LmNjIGJ1aWxkZXIgL3RvcC8vYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yayA7CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9SRUFETUUubWQgYi9zcmMva2VubG0vbG0vYnVpbGRlci9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9idWlsZGVyL1JFQURNRS5tZApyZW5hbWUgdG8gc3JjL2tlbmxtL2xtL2J1aWxkZXIvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9UT0RPIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvVE9ETwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvVE9ETwpyZW5hbWUgdG8gc3JjL2tlbmxtL2xtL2J1aWxkZXIvVE9ETwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2J1aWxkZXIvYWRqdXN0X2NvdW50cy5jYyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL2FkanVzdF9jb3VudHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjNWJhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL2FkanVzdF9jb3VudHMuY2MKQEAgLTAsMCArMSwzNTMgQEAKKyNpbmNsdWRlICJsbS9idWlsZGVyL2FkanVzdF9jb3VudHMuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL25ncmFtX3N0cmVhbS5oaCIKKyNpbmNsdWRlICJsbS9idWlsZGVyL3BheWxvYWQuaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vdGltZXIuaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7CisKK0JhZERpc2NvdW50RXhjZXB0aW9uOjpCYWREaXNjb3VudEV4Y2VwdGlvbigpIHRocm93KCkge30KK0JhZERpc2NvdW50RXhjZXB0aW9uOjp+QmFkRGlzY291bnRFeGNlcHRpb24oKSB0aHJvdygpIHt9CisKK25hbWVzcGFjZSB7CisvLyBSZXR1cm4gbGFzdCB3b3JkIGluIGZ1bGwgdGhhdCBpcyBkaWZmZXJlbnQuCitjb25zdCBXb3JkSW5kZXgqIEZpbmREaWZmZXJlbmNlKGNvbnN0IE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD4gJmZ1bGwsIGNvbnN0IE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD4gJmxvd2VyX2xhc3QpIHsKKyAgY29uc3QgV29yZEluZGV4ICpjdXJfd29yZCA9IGZ1bGwuZW5kKCkgLSAxOworICBjb25zdCBXb3JkSW5kZXggKnByZV93b3JkID0gbG93ZXJfbGFzdC5lbmQoKSAtIDE7CisgIC8vIEZpbmQgbGFzdCBkaWZmZXJlbmNlLgorICBmb3IgKDsgcHJlX3dvcmQgPj0gbG93ZXJfbGFzdC5iZWdpbigpICYmICpwcmVfd29yZCA9PSAqY3VyX3dvcmQ7IC0tY3VyX3dvcmQsIC0tcHJlX3dvcmQpIHt9CisgIHJldHVybiBjdXJfd29yZDsKK30KKworY2xhc3MgU3RhdENvbGxlY3RvciB7CisgIHB1YmxpYzoKKyAgICBTdGF0Q29sbGVjdG9yKHN0ZDo6c2l6ZV90IG9yZGVyLCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHNfcHJ1bmVkLCBzdGQ6OnZlY3RvcjxEaXNjb3VudD4gJmRpc2NvdW50cykKKyAgICAgIDogb3JkZXJzXyhvcmRlciksIGZ1bGxfKG9yZGVyc18uYmFjaygpKSwgY291bnRzXyhjb3VudHMpLCBjb3VudHNfcHJ1bmVkXyhjb3VudHNfcHJ1bmVkKSwgZGlzY291bnRzXyhkaXNjb3VudHMpIHsKKyAgICAgIG1lbXNldCgmb3JkZXJzX1swXSwgMCwgc2l6ZW9mKE9yZGVyU3RhdCkgKiBvcmRlcik7CisgICAgfQorCisgICAgflN0YXRDb2xsZWN0b3IoKSB7fQorCisgICAgdm9pZCBDYWxjdWxhdGVEaXNjb3VudHMoY29uc3QgRGlzY291bnRDb25maWcgJmNvbmZpZykgeworICAgICAgY291bnRzXy5yZXNpemUob3JkZXJzXy5zaXplKCkpOworICAgICAgY291bnRzX3BydW5lZF8ucmVzaXplKG9yZGVyc18uc2l6ZSgpKTsKKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBvcmRlcnNfLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IE9yZGVyU3RhdCAmcyA9IG9yZGVyc19baV07CisgICAgICAgIGNvdW50c19baV0gPSBzLmNvdW50OworICAgICAgICBjb3VudHNfcHJ1bmVkX1tpXSA9IHMuY291bnRfcHJ1bmVkOworICAgICAgfQorCisgICAgICBkaXNjb3VudHNfID0gY29uZmlnLm92ZXJ3cml0ZTsKKyAgICAgIGRpc2NvdW50c18ucmVzaXplKG9yZGVyc18uc2l6ZSgpKTsKKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IGNvbmZpZy5vdmVyd3JpdGUuc2l6ZSgpOyBpIDwgb3JkZXJzXy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBPcmRlclN0YXQgJnMgPSBvcmRlcnNfW2ldOworICAgICAgICB0cnkgeworICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDE7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgIC8vIFRPRE86IFNwZWNpYWxpemUgZXJyb3IgbWVzc2FnZSBmb3IgaiA9PSAzLCBtZWFuaW5nIDMrCisgICAgICAgICAgICBVVElMX1RIUk9XX0lGKHMubltqXSA9PSAwLCBCYWREaXNjb3VudEV4Y2VwdGlvbiwgIkNvdWxkIG5vdCBjYWxjdWxhdGUgS25lc2VyLU5leSBkaXNjb3VudHMgZm9yICIKKyAgICAgICAgICAgICAgICA8PCAoaSsxKSA8PCAiLWdyYW1zIHdpdGggYWRqdXN0ZWQgY291bnQgIiA8PCAoaisxKSA8PCAiIGJlY2F1c2Ugd2UgZGlkbid0IG9ic2VydmUgYW55ICIKKyAgICAgICAgICAgICAgICA8PCAoaSsxKSA8PCAiLWdyYW1zIHdpdGggYWRqdXN0ZWQgY291bnQgIiA8PCBqIDw8ICI7IElzIHRoaXMgc21hbGwgb3IgYXJ0aWZpY2lhbCBkYXRhP1xuIgorICAgICAgICAgICAgICAgIDw8ICJUcnkgZGVkdXBsaWNhdGluZyB0aGUgaW5wdXQuICBUbyBvdmVycmlkZSB0aGlzIGVycm9yIGZvciBlLmcuIGEgY2xhc3MtYmFzZWQgbW9kZWwsIHJlcnVuIHdpdGggLS1kaXNjb3VudF9mYWxsYmFja1xuIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gU2VlIGVxdWF0aW9uICgyNikgaW4gQ2hlbiBhbmQgR29vZG1hbi4KKyAgICAgICAgICBkaXNjb3VudHNfW2ldLmFtb3VudFswXSA9IDAuMDsKKyAgICAgICAgICBmbG9hdCB5ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHMublsxXSkgLyBzdGF0aWNfY2FzdDxmbG9hdD4ocy5uWzFdICsgMi4wICogcy5uWzJdKTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAxOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICBkaXNjb3VudHNfW2ldLmFtb3VudFtqXSA9IHN0YXRpY19jYXN0PGZsb2F0PihqKSAtIHN0YXRpY19jYXN0PGZsb2F0PihqICsgMSkgKiB5ICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KHMubltqKzFdKSAvIHN0YXRpY19jYXN0PGZsb2F0PihzLm5bal0pOworICAgICAgICAgICAgVVRJTF9USFJPV19JRihkaXNjb3VudHNfW2ldLmFtb3VudFtqXSA8IDAuMCB8fCBkaXNjb3VudHNfW2ldLmFtb3VudFtqXSA+IGosIEJhZERpc2NvdW50RXhjZXB0aW9uLCAiRVJST1I6ICIgPDwgKGkrMSkgPDwgIi1ncmFtIGRpc2NvdW50IG91dCBvZiByYW5nZSBmb3IgYWRqdXN0ZWQgY291bnQgIiA8PCBqIDw8ICI6ICIgPDwgZGlzY291bnRzX1tpXS5hbW91bnRbal0pOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoY29uc3QgQmFkRGlzY291bnRFeGNlcHRpb24gJmUpIHsKKyAgICAgICAgICBzd2l0Y2ggKGNvbmZpZy5iYWRfYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIFRIUk9XX1VQOgorICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIGNhc2UgQ09NUExBSU46CisgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiU3Vic3RpdHV0aW5nIGZhbGxiYWNrIGRpc2NvdW50cyBmb3Igb3JkZXIgIiA8PCBpIDw8ICI6IEQxPSIgPDwgY29uZmlnLmZhbGxiYWNrLmFtb3VudFsxXSA8PCAiIEQyPSIgPDwgY29uZmlnLmZhbGxiYWNrLmFtb3VudFsyXSA8PCAiIEQzKz0iIDw8IGNvbmZpZy5mYWxsYmFjay5hbW91bnRbM10gPDwgc3RkOjplbmRsOworICAgICAgICAgICAgY2FzZSBTSUxFTlQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkaXNjb3VudHNfW2ldID0gY29uZmlnLmZhbGxiYWNrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBBZGQoc3RkOjpzaXplX3Qgb3JkZXJfbWludXNfMSwgdWludDY0X3QgY291bnQsIGJvb2wgcHJ1bmVkID0gZmFsc2UpIHsKKyAgICAgIE9yZGVyU3RhdCAmc3RhdCA9IG9yZGVyc19bb3JkZXJfbWludXNfMV07CisgICAgICArK3N0YXQuY291bnQ7CisgICAgICBpZiAoIXBydW5lZCkKKyAgICAgICAgKytzdGF0LmNvdW50X3BydW5lZDsKKyAgICAgIGlmIChjb3VudCA8IDUpICsrc3RhdC5uW2NvdW50XTsKKyAgICB9CisKKyAgICB2b2lkIEFkZEZ1bGwodWludDY0X3QgY291bnQsIGJvb2wgcHJ1bmVkID0gZmFsc2UpIHsKKyAgICAgICsrZnVsbF8uY291bnQ7CisgICAgICBpZiAoIXBydW5lZCkKKyAgICAgICAgKytmdWxsXy5jb3VudF9wcnVuZWQ7CisgICAgICBpZiAoY291bnQgPCA1KSArK2Z1bGxfLm5bY291bnRdOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0cnVjdCBPcmRlclN0YXQgeworICAgICAgLy8gbl8xIGluIGVxdWF0aW9uIDI2IG9mIENoZW4gYW5kIEdvb2RtYW4gZXRjCisgICAgICB1aW50NjRfdCBuWzVdOworICAgICAgdWludDY0X3QgY291bnQ7CisgICAgICB1aW50NjRfdCBjb3VudF9wcnVuZWQ7CisgICAgfTsKKworICAgIHN0ZDo6dmVjdG9yPE9yZGVyU3RhdD4gb3JkZXJzXzsKKyAgICBPcmRlclN0YXQgJmZ1bGxfOworCisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHNfOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzX3BydW5lZF87CisgICAgc3RkOjp2ZWN0b3I8RGlzY291bnQ+ICZkaXNjb3VudHNfOworfTsKKworLy8gUmVhZHMgYWxsIGVudHJpZXMgaW4gb3JkZXIgbGlrZSBOR3JhbVN0cmVhbSBkb2VzLgorLy8gQnV0IGRlbGV0ZXMgYW55IGVudHJpZXMgdGhhdCBoYXZlIDxzPiBpbiB0aGUgMXN0IChub3QgMHRoKSBwb3NpdGlvbiBvbiB0aGUKKy8vIHdheSBvdXQgYnkgcHV0dGluZyBvdGhlciBlbnRyaWVzIGluIHRoZWlyIHBsYWNlLiAgVGhpcyBkaXNydXB0cyB0aGUgc29ydAorLy8gb3JkZXIgYnV0IHdlIGRvbid0IGNhcmUgYmVjYXVzZSB0aGUgZGF0YSBpcyBnb2luZyB0byBiZSBzb3J0ZWQgYWdhaW4uCitjbGFzcyBDb2xsYXBzZVN0cmVhbSB7CisgIHB1YmxpYzoKKyAgICBDb2xsYXBzZVN0cmVhbShjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnBvc2l0aW9uLCB1aW50NjRfdCBwcnVuZV90aHJlc2hvbGQsIGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+JiBwcnVuZV93b3JkcykgOgorICAgICAgY3VycmVudF8oTlVMTCwgTkdyYW08QnVpbGRpbmdQYXlsb2FkPjo6T3JkZXJGcm9tU2l6ZShwb3NpdGlvbi5HZXRDaGFpbigpLkVudHJ5U2l6ZSgpKSksCisgICAgICBwcnVuZV90aHJlc2hvbGRfKHBydW5lX3RocmVzaG9sZCksCisgICAgICBwcnVuZV93b3Jkc18ocHJ1bmVfd29yZHMpLAorICAgICAgYmxvY2tfKHBvc2l0aW9uKSB7CisgICAgICBTdGFydEJsb2NrKCk7CisgICAgfQorCisgICAgY29uc3QgTkdyYW08QnVpbGRpbmdQYXlsb2FkPiAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF87IH0KKyAgICBjb25zdCBOR3JhbTxCdWlsZGluZ1BheWxvYWQ+ICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfOyB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gYmxvY2tfOyB9CisKKyAgICBDb2xsYXBzZVN0cmVhbSAmb3BlcmF0b3IrKygpIHsKKyAgICAgIGFzc2VydChibG9ja18pOworCisgICAgICBpZiAoY3VycmVudF8uYmVnaW4oKVsxXSA9PSBrQk9TICYmIGN1cnJlbnRfLkJhc2UoKSA8IGNvcHlfZnJvbV8pIHsKKyAgICAgICAgbWVtY3B5KGN1cnJlbnRfLkJhc2UoKSwgY29weV9mcm9tXywgY3VycmVudF8uVG90YWxTaXplKCkpOworICAgICAgICBVcGRhdGVDb3B5RnJvbSgpOworCisgICAgICAgIC8vIE1hcmsgaGlnaGVzdCBvcmRlciBuLWdyYW1zIGZvciBsYXRlciBwcnVuaW5nCisgICAgICAgIGlmKGN1cnJlbnRfLlZhbHVlKCkuY291bnQgPD0gcHJ1bmVfdGhyZXNob2xkXykgeworICAgICAgICAgIGN1cnJlbnRfLlZhbHVlKCkuTWFyaygpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIXBydW5lX3dvcmRzXy5lbXB0eSgpKSB7CisgICAgICAgICAgZm9yKFdvcmRJbmRleCogaSA9IGN1cnJlbnRfLmJlZ2luKCk7IGkgIT0gY3VycmVudF8uZW5kKCk7IGkrKykgeworICAgICAgICAgICAgaWYocHJ1bmVfd29yZHNfWyppXSkgeworICAgICAgICAgICAgICBjdXJyZW50Xy5WYWx1ZSgpLk1hcmsoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIH0KKworICAgICAgY3VycmVudF8uTmV4dEluTWVtb3J5KCk7CisgICAgICB1aW50OF90ICpibG9ja19iYXNlID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJsb2NrXy0+R2V0KCkpOworICAgICAgaWYgKGN1cnJlbnRfLkJhc2UoKSA9PSBibG9ja19iYXNlICsgYmxvY2tfLT5WYWxpZFNpemUoKSkgeworICAgICAgICBibG9ja18tPlNldFZhbGlkU2l6ZShjb3B5X2Zyb21fICsgY3VycmVudF8uVG90YWxTaXplKCkgLSBibG9ja19iYXNlKTsKKyAgICAgICAgKytibG9ja187CisgICAgICAgIFN0YXJ0QmxvY2soKTsKKyAgICAgIH0KKworICAgICAgLy8gTWFyayBoaWdoZXN0IG9yZGVyIG4tZ3JhbXMgZm9yIGxhdGVyIHBydW5pbmcKKyAgICAgIGlmKGN1cnJlbnRfLlZhbHVlKCkuY291bnQgPD0gcHJ1bmVfdGhyZXNob2xkXykgeworICAgICAgICBjdXJyZW50Xy5WYWx1ZSgpLk1hcmsoKTsKKyAgICAgIH0KKworICAgICAgaWYoIXBydW5lX3dvcmRzXy5lbXB0eSgpKSB7CisgICAgICAgIGZvcihXb3JkSW5kZXgqIGkgPSBjdXJyZW50Xy5iZWdpbigpOyBpICE9IGN1cnJlbnRfLmVuZCgpOyBpKyspIHsKKyAgICAgICAgICBpZihwcnVuZV93b3Jkc19bKmldKSB7CisgICAgICAgICAgICBjdXJyZW50Xy5WYWx1ZSgpLk1hcmsoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBTdGFydEJsb2NrKCkgeworICAgICAgZm9yICg7IDsgKytibG9ja18pIHsKKyAgICAgICAgaWYgKCFibG9ja18pIHJldHVybjsKKyAgICAgICAgaWYgKGJsb2NrXy0+VmFsaWRTaXplKCkpIGJyZWFrOworICAgICAgfQorICAgICAgY3VycmVudF8uUmVCYXNlKGJsb2NrXy0+R2V0KCkpOworICAgICAgY29weV9mcm9tXyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihibG9ja18tPkdldCgpKSArIGJsb2NrXy0+VmFsaWRTaXplKCk7CisgICAgICBVcGRhdGVDb3B5RnJvbSgpOworCisgICAgICAvLyBNYXJrIGhpZ2hlc3Qgb3JkZXIgbi1ncmFtcyBmb3IgbGF0ZXIgcHJ1bmluZworICAgICAgaWYoY3VycmVudF8uVmFsdWUoKS5jb3VudCA8PSBwcnVuZV90aHJlc2hvbGRfKSB7CisgICAgICAgIGN1cnJlbnRfLlZhbHVlKCkuTWFyaygpOworICAgICAgfQorCisgICAgICBpZighcHJ1bmVfd29yZHNfLmVtcHR5KCkpIHsKKyAgICAgICAgZm9yKFdvcmRJbmRleCogaSA9IGN1cnJlbnRfLmJlZ2luKCk7IGkgIT0gY3VycmVudF8uZW5kKCk7IGkrKykgeworICAgICAgICAgIGlmKHBydW5lX3dvcmRzX1sqaV0pIHsKKyAgICAgICAgICAgIGN1cnJlbnRfLlZhbHVlKCkuTWFyaygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBGaW5kIGxhc3Qgd2l0aG91dCBib3MuCisgICAgdm9pZCBVcGRhdGVDb3B5RnJvbSgpIHsKKyAgICAgIGZvciAoY29weV9mcm9tXyAtPSBjdXJyZW50Xy5Ub3RhbFNpemUoKTsgY29weV9mcm9tXyA+PSBjdXJyZW50Xy5CYXNlKCk7IGNvcHlfZnJvbV8gLT0gY3VycmVudF8uVG90YWxTaXplKCkpIHsKKyAgICAgICAgaWYgKE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD4oY29weV9mcm9tXywgY3VycmVudF8uT3JkZXIoKSkuYmVnaW4oKVsxXSAhPSBrQk9TKSBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBOR3JhbTxCdWlsZGluZ1BheWxvYWQ+IGN1cnJlbnRfOworCisgICAgLy8gR29lcyBiYWNrd2FyZHMgaW4gdGhlIGJsb2NrCisgICAgdWludDhfdCAqY29weV9mcm9tXzsKKyAgICB1aW50NjRfdCBwcnVuZV90aHJlc2hvbGRfOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+JiBwcnVuZV93b3Jkc187CisgICAgdXRpbDo6c3RyZWFtOjpMaW5rIGJsb2NrXzsKK307CisKK30gLy8gbmFtZXNwYWNlCisKK3ZvaWQgQWRqdXN0Q291bnRzOjpSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyAmcG9zaXRpb25zKSB7CisgIFVUSUxfVElNRVIoIigldyBzKSBBZGp1c3RlZCBjb3VudHNcbiIpOworCisgIGNvbnN0IHN0ZDo6c2l6ZV90IG9yZGVyID0gcG9zaXRpb25zLnNpemUoKTsKKyAgU3RhdENvbGxlY3RvciBzdGF0cyhvcmRlciwgY291bnRzXywgY291bnRzX3BydW5lZF8sIGRpc2NvdW50c18pOworICBpZiAob3JkZXIgPT0gMSkgeworCisgICAgLy8gT25seSB1bmlncmFtcy4gIEp1c3QgY29sbGVjdCBzdGF0cy4KKyAgICBmb3IgKE5HcmFtU3RyZWFtPEJ1aWxkaW5nUGF5bG9hZD4gZnVsbChwb3NpdGlvbnNbMF0pOyBmdWxsOyArK2Z1bGwpIHsKKworICAgICAgLy8gRG8gbm90IHBydW5lIDxzPiA8L3M+IDx1bms+CisgICAgICBpZigqZnVsbC0+YmVnaW4oKSA+IDIpIHsKKyAgICAgICAgaWYoZnVsbC0+VmFsdWUoKS5jb3VudCA8PSBwcnVuZV90aHJlc2hvbGRzX1swXSkKKyAgICAgICAgICBmdWxsLT5WYWx1ZSgpLk1hcmsoKTsKKworICAgICAgICBpZighcHJ1bmVfd29yZHNfLmVtcHR5KCkgJiYgcHJ1bmVfd29yZHNfWypmdWxsLT5iZWdpbigpXSkKKyAgICAgICAgICBmdWxsLT5WYWx1ZSgpLk1hcmsoKTsKKyAgICAgIH0KKworICAgICAgc3RhdHMuQWRkRnVsbChmdWxsLT5WYWx1ZSgpLlVubWFya2VkQ291bnQoKSwgZnVsbC0+VmFsdWUoKS5Jc01hcmtlZCgpKTsKKyAgICB9CisKKyAgICBzdGF0cy5DYWxjdWxhdGVEaXNjb3VudHMoZGlzY291bnRfY29uZmlnXyk7CisgICAgcmV0dXJuOworICB9CisKKyAgTkdyYW1TdHJlYW1zPEJ1aWxkaW5nUGF5bG9hZD4gc3RyZWFtczsKKyAgc3RyZWFtcy5Jbml0KHBvc2l0aW9ucywgcG9zaXRpb25zLnNpemUoKSAtIDEpOworCisgIENvbGxhcHNlU3RyZWFtIGZ1bGwocG9zaXRpb25zW3Bvc2l0aW9ucy5zaXplKCkgLSAxXSwgcHJ1bmVfdGhyZXNob2xkc18uYmFjaygpLCBwcnVuZV93b3Jkc18pOworCisgIC8vIEluaXRpYWxpemF0aW9uOiA8dW5rPiBoYXMgY291bnQgMCBhbmQgc28gZG9lcyA8cz4uCisgIE5HcmFtU3RyZWFtPEJ1aWxkaW5nUGF5bG9hZD4gKmxvd2VyX3ZhbGlkID0gc3RyZWFtcy5iZWdpbigpOworICBjb25zdCBOR3JhbVN0cmVhbTxCdWlsZGluZ1BheWxvYWQ+ICpjb25zdCBzdHJlYW1zX2JlZ2luID0gc3RyZWFtcy5iZWdpbigpOworICBzdHJlYW1zWzBdLT5WYWx1ZSgpLmNvdW50ID0gMDsKKyAgKnN0cmVhbXNbMF0tPmJlZ2luKCkgPSBrVU5LOworICBzdGF0cy5BZGQoMCwgMCk7CisgICgrK3N0cmVhbXNbMF0pLT5WYWx1ZSgpLmNvdW50ID0gMDsKKyAgKnN0cmVhbXNbMF0tPmJlZ2luKCkgPSBrQk9TOworICAvLyA8cz4gaXMgbm90IGluIHN0YXRzIHlldCBiZWNhdXNlIGl0IHdpbGwgZ2V0IHB1dCBpbiBsYXRlci4KKworICAvLyBUaGlzIGtlZXBzIHRyYWNrIG9mIGFjdHVhbCBjb3VudHMgZm9yIGxvd2VyIG9yZGVycy4gIEl0IGlzIG5vdCBvdXRwdXQKKyAgLy8gKG9ubHkgYWRqdXN0ZWQgY291bnRzIGFyZSksIGJ1dCB1c2VkIHRvIGRldGVybWluZSBwcnVuaW5nLgorICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gYWN0dWFsX2NvdW50cyhwb3NpdGlvbnMuc2l6ZSgpLCAwKTsKKyAgLy8gU29tZXRoaW5nIG9mIGEgaGFjazogZG9uJ3QgcHJ1bmUgPHM+LgorICBhY3R1YWxfY291bnRzWzBdID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpOworCisgIC8vIEl0ZXJhdGUgb3ZlciBmdWxsICh0aGUgc3RyZWFtIG9mIHRoZSBoaWdoZXN0IG9yZGVyIG5ncmFtcykKKyAgZm9yICg7IGZ1bGw7ICsrZnVsbCkgeworICAgIGNvbnN0IFdvcmRJbmRleCAqZGlmZmVyZW50ID0gRmluZERpZmZlcmVuY2UoKmZ1bGwsICoqbG93ZXJfdmFsaWQpOworICAgIHN0ZDo6c2l6ZV90IHNhbWUgPSBmdWxsLT5lbmQoKSAtIDEgLSBkaWZmZXJlbnQ7CisKKyAgICAvLyBTVEVQIDE6IE91dHB1dCBhbGwgdGhlIG4tZ3JhbXMgdGhhdCBjaGFuZ2VkLgorICAgIGZvciAoOyBsb3dlcl92YWxpZCA+PSBzdHJlYW1zLmJlZ2luKCkgKyBzYW1lOyAtLWxvd2VyX3ZhbGlkKSB7CisgICAgICB1aW50NjRfdCBvcmRlcl9taW51c18xID0gbG93ZXJfdmFsaWQgLSBzdHJlYW1zX2JlZ2luOworICAgICAgaWYoYWN0dWFsX2NvdW50c1tvcmRlcl9taW51c18xXSA8PSBwcnVuZV90aHJlc2hvbGRzX1tvcmRlcl9taW51c18xXSkKKyAgICAgICAgKCpsb3dlcl92YWxpZCktPlZhbHVlKCkuTWFyaygpOworCisgICAgICBpZighcHJ1bmVfd29yZHNfLmVtcHR5KCkpIHsKKyAgICAgICAgZm9yKFdvcmRJbmRleCogaSA9ICgqbG93ZXJfdmFsaWQpLT5iZWdpbigpOyBpICE9ICgqbG93ZXJfdmFsaWQpLT5lbmQoKTsgaSsrKSB7CisgICAgICAgICAgaWYocHJ1bmVfd29yZHNfWyppXSkgeworICAgICAgICAgICAgKCpsb3dlcl92YWxpZCktPlZhbHVlKCkuTWFyaygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHN0YXRzLkFkZChvcmRlcl9taW51c18xLCAoKmxvd2VyX3ZhbGlkKS0+VmFsdWUoKS5Vbm1hcmtlZENvdW50KCksICgqbG93ZXJfdmFsaWQpLT5WYWx1ZSgpLklzTWFya2VkKCkpOworICAgICAgKysqbG93ZXJfdmFsaWQ7CisgICAgfQorCisgICAgLy8gU1RFUCAyOiBVcGRhdGUgbi1ncmFtcyB0aGF0IHN0aWxsIG1hdGNoLgorICAgIC8vIG4tZ3JhbXMgdGhhdCBtYXRjaCBnZXQgY291bnQgZnJvbSB0aGUgZnVsbCBlbnRyeS4KKyAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2FtZTsgKytpKSB7CisgICAgICBhY3R1YWxfY291bnRzW2ldICs9IGZ1bGwtPlZhbHVlKCkuVW5tYXJrZWRDb3VudCgpOworICAgIH0KKyAgICAvLyBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiB1bmlxdWUgZXh0ZW5zaW9ucyBmb3IgdGhlIGxvbmdlc3QgbWF0Y2guCisgICAgaWYgKHNhbWUpICsrc3RyZWFtc1tzYW1lIC0gMV0tPlZhbHVlKCkuY291bnQ7CisKKyAgICAvLyBTVEVQIDM6IEluaXRpYWxpemUgbmV3IG4tZ3JhbXMuCisgICAgLy8gVGhpcyBpcyBoZXJlIGJlY2F1c2UgYm9zIGlzIGFsc28gY29uc3QgV29yZEluZGV4ICosIHNvIGNvcHkgZ2V0cworICAgIC8vIGNvbnNpc3RlbnQgYXJndW1lbnQgdHlwZXMuCisgICAgY29uc3QgV29yZEluZGV4ICpmdWxsX2VuZCA9IGZ1bGwtPmVuZCgpOworICAgIC8vIEluaXRpYWxpemUgYW5kIG1hcmsgYXMgdmFsaWQgdXAgdG8gYm9zLgorICAgIGNvbnN0IFdvcmRJbmRleCAqYm9zOworICAgIGZvciAoYm9zID0gZGlmZmVyZW50OyAoYm9zID4gZnVsbC0+YmVnaW4oKSkgJiYgKCpib3MgIT0ga0JPUyk7IC0tYm9zKSB7CisgICAgICBOR3JhbVN0cmVhbTxCdWlsZGluZ1BheWxvYWQ+ICZ0byA9ICorK2xvd2VyX3ZhbGlkOworICAgICAgc3RkOjpjb3B5KGJvcywgZnVsbF9lbmQsIHRvLT5iZWdpbigpKTsKKyAgICAgIHRvLT5WYWx1ZSgpLmNvdW50ID0gMTsKKyAgICAgIGFjdHVhbF9jb3VudHNbbG93ZXJfdmFsaWQgLSBzdHJlYW1zX2JlZ2luXSA9IGZ1bGwtPlZhbHVlKCkuVW5tYXJrZWRDb3VudCgpOworICAgIH0KKyAgICAvLyBOb3cgYm9zIGluZGljYXRlcyB3aGVyZSA8cz4gaXMgb3IgaXMgdGhlIDB0aCB3b3JkIG9mIGZ1bGwuCisgICAgaWYgKGJvcyAhPSBmdWxsLT5iZWdpbigpKSB7CisgICAgICAvLyBUaGVyZSBpcyBhbiA8cz4gYmV5b25kIHRoZSAwdGggd29yZC4KKyAgICAgIE5HcmFtU3RyZWFtPEJ1aWxkaW5nUGF5bG9hZD4gJnRvID0gKisrbG93ZXJfdmFsaWQ7CisgICAgICBzdGQ6OmNvcHkoYm9zLCBmdWxsX2VuZCwgdG8tPmJlZ2luKCkpOworCisgICAgICAvLyBBbnl0aGluZyB0aGF0IGJlZ2lucyB3aXRoIDxzPiBoYXMgZnVsbCBub24gYWRqdXN0ZWQgY291bnQuCisgICAgICB0by0+VmFsdWUoKS5jb3VudCA9IGZ1bGwtPlZhbHVlKCkuVW5tYXJrZWRDb3VudCgpOworICAgICAgYWN0dWFsX2NvdW50c1tsb3dlcl92YWxpZCAtIHN0cmVhbXNfYmVnaW5dID0gZnVsbC0+VmFsdWUoKS5Vbm1hcmtlZENvdW50KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXRzLkFkZEZ1bGwoZnVsbC0+VmFsdWUoKS5Vbm1hcmtlZENvdW50KCksIGZ1bGwtPlZhbHVlKCkuSXNNYXJrZWQoKSk7CisgICAgfQorICAgIGFzc2VydChsb3dlcl92YWxpZCA+PSAmc3RyZWFtc1swXSk7CisgIH0KKworICAvLyBUaGUgYWJvdmUgbG9vcCBvdXRwdXRzIG4tZ3JhbXMgd2hlbiBpdCBvYnNlcnZlcyBjaGFuZ2VzLiAgVGhpcyBvdXRwdXRzCisgIC8vIHRoZSBsYXN0IG4tZ3JhbXMuCisgIGZvciAoTkdyYW1TdHJlYW08QnVpbGRpbmdQYXlsb2FkPiAqcyA9IHN0cmVhbXMuYmVnaW4oKTsgcyA8PSBsb3dlcl92YWxpZDsgKytzKSB7CisgICAgdWludDY0X3QgbG93ZXJfY291bnQgPSBhY3R1YWxfY291bnRzWygqcyktPk9yZGVyKCkgLSAxXTsKKyAgICBpZihsb3dlcl9jb3VudCA8PSBwcnVuZV90aHJlc2hvbGRzX1soKnMpLT5PcmRlcigpIC0gMV0pCisgICAgICAoKnMpLT5WYWx1ZSgpLk1hcmsoKTsKKworICAgIGlmKCFwcnVuZV93b3Jkc18uZW1wdHkoKSkgeworICAgICAgZm9yKFdvcmRJbmRleCogaSA9ICgqcyktPmJlZ2luKCk7IGkgIT0gKCpzKS0+ZW5kKCk7IGkrKykgeworICAgICAgICBpZihwcnVuZV93b3Jkc19bKmldKSB7CisgICAgICAgICAgKCpzKS0+VmFsdWUoKS5NYXJrKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0cy5BZGQocyAtIHN0cmVhbXMuYmVnaW4oKSwgbG93ZXJfY291bnQsICgqcyktPlZhbHVlKCkuSXNNYXJrZWQoKSk7CisgICAgKysqczsKKyAgfQorICAvLyBQb2lzb24gZXZlcnlvbmUhICBFeGNlcHQgdGhlIE4tZ3JhbXMgd2hpY2ggd2VyZSBhbHJlYWR5IHBvaXNvbmVkIGJ5IHRoZSBpbnB1dC4KKyAgZm9yIChOR3JhbVN0cmVhbTxCdWlsZGluZ1BheWxvYWQ+ICpzID0gc3RyZWFtcy5iZWdpbigpOyBzICE9IHN0cmVhbXMuZW5kKCk7ICsrcykKKyAgICBzLT5Qb2lzb24oKTsKKworICBzdGF0cy5DYWxjdWxhdGVEaXNjb3VudHMoZGlzY291bnRfY29uZmlnXyk7CisKKyAgLy8gTk9URTogU2VlIHNwZWNpYWwgZWFybHktcmV0dXJuIGNhc2UgZm9yIHVuaWdyYW1zIG5lYXIgdGhlIHRvcCBvZiB0aGlzIGZ1bmN0aW9uCit9CisKK319IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9idWlsZGVyL2FkanVzdF9jb3VudHMuaGggYi9zcmMva2VubG0vbG0vYnVpbGRlci9hZGp1c3RfY291bnRzLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MzE5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vYnVpbGRlci9hZGp1c3RfY291bnRzLmhoCkBAIC0wLDAgKzEsNzIgQEAKKyNpZm5kZWYgTE1fQlVJTERFUl9BREpVU1RfQ09VTlRTX0gKKyNkZWZpbmUgTE1fQlVJTERFUl9BREpVU1RfQ09VTlRTX0gKKworI2luY2x1ZGUgImxtL2J1aWxkZXIvZGlzY291bnQuaGgiCisjaW5jbHVkZSAibG0vbG1fZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB1dGlsIHsgbmFtZXNwYWNlIHN0cmVhbSB7IGNsYXNzIENoYWluUG9zaXRpb25zOyB9IH0KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBidWlsZGVyIHsKKworY2xhc3MgQmFkRGlzY291bnRFeGNlcHRpb24gOiBwdWJsaWMgdXRpbDo6RXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIEJhZERpc2NvdW50RXhjZXB0aW9uKCkgdGhyb3coKTsKKyAgICB+QmFkRGlzY291bnRFeGNlcHRpb24oKSB0aHJvdygpOworfTsKKworc3RydWN0IERpc2NvdW50Q29uZmlnIHsKKyAgLy8gT3ZlcnJpZGVzIGRpc2NvdW50cyBmb3Igb3JkZXJzIFsxLGRpc2NvdW50X292ZXJyaWRlLnNpemUoKV0uCisgIHN0ZDo6dmVjdG9yPERpc2NvdW50PiBvdmVyd3JpdGU7CisgIC8vIElmIGRpc2NvdW50aW5nIGZhaWxzIGZvciBhbiBvcmRlciwgY29weSB0aGVtIGZyb20gaGVyZS4KKyAgRGlzY291bnQgZmFsbGJhY2s7CisgIC8vIFdoYXQgdG8gZG8gd2hlbiBkaXNjb3VudHMgYXJlIG91dCBvZiByYW5nZSBvciB3b3VsZCB0cmlnZ2VyIGRpdmlzb24gYnkKKyAgLy8gemVyby4gIEl0IGl0IGRvZXMgc29tZXRoaW5nIG90aGVyIHRoYW4gVEhST1dfVVAsIHVzZSBmYWxsYmFja19kaXNjb3VudC4KKyAgV2FybmluZ0FjdGlvbiBiYWRfYWN0aW9uOworfTsKKworLyogQ29tcHV0ZSBhZGp1c3RlZCBjb3VudHMuCisgKiBJbnB1dDogdW5pcXVlIHN1ZmZpeCBzb3J0ZWQgTi1ncmFtcyAoYW5kIGp1c3QgdGhlIE4tZ3JhbXMpIHdpdGggcmF3IGNvdW50cy4KKyAqIE91dHB1dDogWzEsTl0tZ3JhbXMgd2l0aCBhZGp1c3RlZCBjb3VudHMuCisgKiBbMSxOKS1ncmFtcyBhcmUgaW4gc3VmZml4IG9yZGVyCisgKiBOLWdyYW1zIGFyZSBpbiB1bmRlZmluZWQgb3JkZXIgKHRoZXkncmUgZ29pbmcgdG8gYmUgc29ydGVkIGFueXdheSkuCisgKi8KK2NsYXNzIEFkanVzdENvdW50cyB7CisgIHB1YmxpYzoKKyAgICAvLyBjb3VudHM6IG91dHB1dAorICAgIC8vIGNvdW50c19wcnVuZWQ6IG91dHB1dAorICAgIC8vIGRpc2NvdW50czogbW9zdGx5IG91dHB1dC4gIElmIHRoZSBpbnB1dCBhbHJlYWR5IGhhcyBlbnRyaWVzLCB0aGV5IHdpbGwgYmUga2VwdC4KKyAgICAvLyBwcnVuZV90aHJlc2hvbGRzOiBpbnB1dC4gIG4tZ3JhbXMgd2l0aCBub3JtYWwgKG5vdCBhZGp1c3RlZCkgY291bnQgYmVsb3cgdGhpcyB3aWxsIGJlIHBydW5lZC4KKyAgICBBZGp1c3RDb3VudHMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmcHJ1bmVfdGhyZXNob2xkcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzX3BydW5lZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4gJnBydW5lX3dvcmRzLAorICAgICAgICBjb25zdCBEaXNjb3VudENvbmZpZyAmZGlzY291bnRfY29uZmlnLAorICAgICAgICBzdGQ6OnZlY3RvcjxEaXNjb3VudD4gJmRpc2NvdW50cykKKyAgICAgIDogcHJ1bmVfdGhyZXNob2xkc18ocHJ1bmVfdGhyZXNob2xkcyksIGNvdW50c18oY291bnRzKSwgY291bnRzX3BydW5lZF8oY291bnRzX3BydW5lZCksCisgICAgICAgIHBydW5lX3dvcmRzXyhwcnVuZV93b3JkcyksIGRpc2NvdW50X2NvbmZpZ18oZGlzY291bnRfY29uZmlnKSwgZGlzY291bnRzXyhkaXNjb3VudHMpCisgICAge30KKworICAgIHZvaWQgUnVuKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJnBvc2l0aW9ucyk7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJnBydW5lX3RocmVzaG9sZHNfOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzXzsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50c19wcnVuZWRfOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+ICZwcnVuZV93b3Jkc187CisKKyAgICBEaXNjb3VudENvbmZpZyBkaXNjb3VudF9jb25maWdfOworICAgIHN0ZDo6dmVjdG9yPERpc2NvdW50PiAmZGlzY291bnRzXzsKK307CisKK30gLy8gbmFtZXNwYWNlIGJ1aWxkZXIKK30gLy8gbmFtZXNwYWNlIGxtCisKKyNlbmRpZiAvLyBMTV9CVUlMREVSX0FESlVTVF9DT1VOVFNfSAorCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYnVpbGRlci9hZGp1c3RfY291bnRzX3Rlc3QuY2MgYi9zcmMva2VubG0vbG0vYnVpbGRlci9hZGp1c3RfY291bnRzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmNTUxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL2FkanVzdF9jb3VudHNfdGVzdC5jYwpAQCAtMCwwICsxLDExMiBAQAorI2luY2x1ZGUgImxtL2J1aWxkZXIvYWRqdXN0X2NvdW50cy5oaCIKKworI2luY2x1ZGUgImxtL2NvbW1vbi9uZ3JhbV9zdHJlYW0uaGgiCisjaW5jbHVkZSAibG0vYnVpbGRlci9wYXlsb2FkLmhoIgorI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgorCisjaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL3RocmVhZC5ocHA+CisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEFkanVzdENvdW50cworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGJ1aWxkZXIgeyBuYW1lc3BhY2UgeworCitjbGFzcyBLZWVwQ29weSB7CisgIHB1YmxpYzoKKyAgICBLZWVwQ29weSgpIDogc2l6ZV8oMCkge30KKworICAgIHZvaWQgUnVuKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKKyAgICAgIGZvciAodXRpbDo6c3RyZWFtOjpMaW5rIGxpbmsocG9zaXRpb24pOyBsaW5rOyArK2xpbmspIHsKKyAgICAgICAgbWVtXy5jYWxsX3JlYWxsb2Moc2l6ZV8gKyBsaW5rLT5WYWxpZFNpemUoKSk7CisgICAgICAgIG1lbWNweShzdGF0aWNfY2FzdDx1aW50OF90Kj4obWVtXy5nZXQoKSkgKyBzaXplXywgbGluay0+R2V0KCksIGxpbmstPlZhbGlkU2l6ZSgpKTsKKyAgICAgICAgc2l6ZV8gKz0gbGluay0+VmFsaWRTaXplKCk7CisgICAgICB9CisgICAgfQorCisgICAgdWludDhfdCAqR2V0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdCo+KG1lbV8uZ2V0KCkpOyB9CisgICAgc3RkOjpzaXplX3QgU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9CisKKyAgcHJpdmF0ZToKKyAgICB1dGlsOjpzY29wZWRfbWFsbG9jIG1lbV87CisgICAgc3RkOjpzaXplX3Qgc2l6ZV87Cit9OworCitzdHJ1Y3QgR3JhbTQgeworICBXb3JkSW5kZXggaWRzWzRdOworICB1aW50NjRfdCBjb3VudDsKK307CisKK2NsYXNzIFdyaXRlSW5wdXQgeworICBwdWJsaWM6CisgICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICAgICAgTkdyYW1TdHJlYW08QnVpbGRpbmdQYXlsb2FkPiBpbnB1dChwb3NpdGlvbik7CisgICAgICBHcmFtNCBncmFtc1tdID0geworICAgICAgICB7ezAsMCwwLDB9LDEwfSwKKyAgICAgICAge3swLDAsMywwfSwzfSwKKyAgICAgICAgLy8gYm9zCisgICAgICAgIHt7MSwxLDEsMn0sNX0sCisgICAgICAgIHt7MCwwLDMsMn0sNX0sCisgICAgICB9OworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoZ3JhbXMpIC8gc2l6ZW9mKEdyYW00KTsgKytpLCArK2lucHV0KSB7CisgICAgICAgIG1lbWNweShpbnB1dC0+YmVnaW4oKSwgZ3JhbXNbaV0uaWRzLCBzaXplb2YoV29yZEluZGV4KSAqIDQpOworICAgICAgICBpbnB1dC0+VmFsdWUoKS5jb3VudCA9IGdyYW1zW2ldLmNvdW50OworICAgICAgfQorICAgICAgaW5wdXQuUG9pc29uKCk7CisgICAgfQorfTsKKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2ltcGxlKSB7CisgIEtlZXBDb3B5IG91dHB1dHNbNF07CisgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBjb3VudHM7CisgIHN0ZDo6dmVjdG9yPERpc2NvdW50PiBkaXNjb3VudDsKKyAgeworICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Db25maWcgY29uZmlnOworICAgIGNvbmZpZy50b3RhbF9tZW1vcnkgPSAxMDA7CisgICAgY29uZmlnLmJsb2NrX2NvdW50ID0gMTsKKyAgICB1dGlsOjpzdHJlYW06OkNoYWlucyBjaGFpbnMoNCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgY29uZmlnLmVudHJ5X3NpemUgPSBOR3JhbTxCdWlsZGluZ1BheWxvYWQ+OjpUb3RhbFNpemUoaSArIDEpOworICAgICAgY2hhaW5zLnB1c2hfYmFjayhjb25maWcpOworICAgIH0KKworICAgIGNoYWluc1szXSA+PiBXcml0ZUlucHV0KCk7CisgICAgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyBmb3JfYWRqdXN0KGNoYWlucyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgY2hhaW5zW2ldID4+IGJvb3N0OjpyZWYob3V0cHV0c1tpXSk7CisgICAgfQorICAgIGNoYWlucyA+PiB1dGlsOjpzdHJlYW06OmtSZWN5Y2xlOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBjb3VudHNfcHJ1bmVkKDQpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBwcnVuZV90aHJlc2hvbGRzKDQpOworICAgIERpc2NvdW50Q29uZmlnIGRpc2NvdW50X2NvbmZpZzsKKyAgICBkaXNjb3VudF9jb25maWcuZmFsbGJhY2sgPSBEaXNjb3VudCgpOworICAgIGRpc2NvdW50X2NvbmZpZy5iYWRfYWN0aW9uID0gVEhST1dfVVA7CisgICAgQk9PU1RfQ0hFQ0tfVEhST1coQWRqdXN0Q291bnRzKHBydW5lX3RocmVzaG9sZHMsIGNvdW50cywgY291bnRzX3BydW5lZCwgc3RkOjp2ZWN0b3I8Ym9vbD4oKSwgZGlzY291bnRfY29uZmlnLCBkaXNjb3VudCkuUnVuKGZvcl9hZGp1c3QpLCBCYWREaXNjb3VudEV4Y2VwdGlvbik7CisgIH0KKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCg0VUwsIGNvdW50cy5zaXplKCkpOworICBCT09TVF9DSEVDS19FUVVBTCg0VUwsIGNvdW50c1swXSk7CisgIC8vIFRoZXNlIGFyZSBubyBsb25nZXIgc2V0IGJlY2F1c2UgdGhlIGRpc2NvdW50cyBhcmUgYmFkLgorLyogIEJPT1NUX0NIRUNLX0VRVUFMKDRVTCwgY291bnRzWzFdKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoM1VMLCBjb3VudHNbMl0pOworICBCT09TVF9DSEVDS19FUVVBTCgzVUwsIGNvdW50c1szXSk7Ki8KKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChOR3JhbTxCdWlsZGluZ1BheWxvYWQ+OjpUb3RhbFNpemUoMSkgKiA0LCBvdXRwdXRzWzBdLlNpemUoKSk7CisgIE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD4gdW5pKG91dHB1dHNbMF0uR2V0KCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChrVU5LLCAqdW5pLmJlZ2luKCkpOworICBCT09TVF9DSEVDS19FUVVBTCgwVUxMLCB1bmkuVmFsdWUoKS5jb3VudCk7CisgIHVuaS5OZXh0SW5NZW1vcnkoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoa0JPUywgKnVuaS5iZWdpbigpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMFVMTCwgdW5pLlZhbHVlKCkuY291bnQpOworICB1bmkuTmV4dEluTWVtb3J5KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDBVTCwgKnVuaS5iZWdpbigpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMlVMTCwgdW5pLlZhbHVlKCkuY291bnQpOworICB1bmkuTmV4dEluTWVtb3J5KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDJVTEwsIHVuaS5WYWx1ZSgpLmNvdW50KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMlVMLCAqdW5pLmJlZ2luKCkpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoTkdyYW08QnVpbGRpbmdQYXlsb2FkPjo6VG90YWxTaXplKDIpICogNCwgb3V0cHV0c1sxXS5TaXplKCkpOworICBOR3JhbTxCdWlsZGluZ1BheWxvYWQ+IGJpKG91dHB1dHNbMV0uR2V0KCksIDIpOworICBCT09TVF9DSEVDS19FUVVBTCgwVUwsICpiaS5iZWdpbigpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMFVMLCAqKGJpLmJlZ2luKCkgKyAxKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDFVTEwsIGJpLlZhbHVlKCkuY291bnQpOworICBiaS5OZXh0SW5NZW1vcnkoKTsKK30KKworfX19IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9idWlsZGVyL2NvbWJpbmVfY291bnRzLmhoIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvY29tYmluZV9jb3VudHMuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkYTUxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL2NvbWJpbmVfY291bnRzLmhoCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgTE1fQlVJTERFUl9DT01CSU5FX0NPVU5UU19ICisjZGVmaW5lIExNX0JVSUxERVJfQ09NQklORV9DT1VOVFNfSAorCisjaW5jbHVkZSAibG0vYnVpbGRlci9wYXlsb2FkLmhoIgorI2luY2x1ZGUgImxtL2NvbW1vbi9uZ3JhbS5oaCIKKyNpbmNsdWRlICJsbS9jb21tb24vY29tcGFyZS5oaCIKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL3NvcnQuaGgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBidWlsZGVyIHsKKworLy8gU3VtIGNvdW50cyBmb3IgdGhlIHNhbWUgbi1ncmFtLgorc3RydWN0IENvbWJpbmVDb3VudHMgeworICBib29sIG9wZXJhdG9yKCkodm9pZCAqZmlyc3Rfdm9pZCwgY29uc3Qgdm9pZCAqc2Vjb25kX3ZvaWQsIGNvbnN0IFN1ZmZpeE9yZGVyICZjb21wYXJlKSBjb25zdCB7CisgICAgTkdyYW08QnVpbGRpbmdQYXlsb2FkPiBmaXJzdChmaXJzdF92b2lkLCBjb21wYXJlLk9yZGVyKCkpOworICAgIC8vIFRoZXJlIGlzbid0IGEgY29uc3QgdmVyc2lvbiBvZiBOR3JhbS4KKyAgICBOR3JhbTxCdWlsZGluZ1BheWxvYWQ+IHNlY29uZChjb25zdF9jYXN0PHZvaWQqPihzZWNvbmRfdm9pZCksIGNvbXBhcmUuT3JkZXIoKSk7CisgICAgaWYgKG1lbWNtcChmaXJzdC5iZWdpbigpLCBzZWNvbmQuYmVnaW4oKSwgc2l6ZW9mKFdvcmRJbmRleCkgKiBjb21wYXJlLk9yZGVyKCkpKSByZXR1cm4gZmFsc2U7CisgICAgZmlyc3QuVmFsdWUoKS5jb3VudCArPSBzZWNvbmQuVmFsdWUoKS5jb3VudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgYnVpbGRlcgorfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX0JVSUxERVJfQ09NQklORV9DT1VOVFNfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2J1aWxkZXIvY29ycHVzX2NvdW50LmNjIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvY29ycHVzX2NvdW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTRjMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vYnVpbGRlci9jb3JwdXNfY291bnQuY2MKQEAgLTAsMCArMSwyMzkgQEAKKyNpbmNsdWRlICJsbS9idWlsZGVyL2NvcnB1c19jb3VudC5oaCIKKworI2luY2x1ZGUgImxtL2J1aWxkZXIvcGF5bG9hZC5oaCIKKyNpbmNsdWRlICJsbS9jb21tb24vbmdyYW0uaGgiCisjaW5jbHVkZSAibG0vbG1fZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgImxtL3ZvY2FiLmhoIgorI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisjaW5jbHVkZSAidXRpbC9maWxlX3N0cmVhbS5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisjaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgorI2luY2x1ZGUgInV0aWwvbXVybXVyX2hhc2guaGgiCisjaW5jbHVkZSAidXRpbC9wcm9iaW5nX2hhc2hfdGFibGUuaGgiCisjaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY2hhaW4uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vdGltZXIuaGgiCisjaW5jbHVkZSAidXRpbC90b2tlbml6ZV9waWVjZS5oaCIKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBidWlsZGVyIHsKK25hbWVzcGFjZSB7CisKK2NsYXNzIERlZHVwZUhhc2ggOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjxjb25zdCBXb3JkSW5kZXggKiwgYm9vbD4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRGVkdXBlSGFzaChzdGQ6OnNpemVfdCBvcmRlcikgOiBzaXplXyhvcmRlciAqIHNpemVvZihXb3JkSW5kZXgpKSB7fQorCisgICAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBXb3JkSW5kZXggKnN0YXJ0KSBjb25zdCB7CisgICAgICByZXR1cm4gdXRpbDo6TXVybXVySGFzaE5hdGl2ZShzdGFydCwgc2l6ZV8pOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2l6ZV90IHNpemVfOworfTsKKworY2xhc3MgRGVkdXBlRXF1YWxzIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPGNvbnN0IFdvcmRJbmRleCAqLCBjb25zdCBXb3JkSW5kZXggKiwgYm9vbD4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRGVkdXBlRXF1YWxzKHN0ZDo6c2l6ZV90IG9yZGVyKSA6IHNpemVfKG9yZGVyICogc2l6ZW9mKFdvcmRJbmRleCkpIHt9CisKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgV29yZEluZGV4ICpmaXJzdCwgY29uc3QgV29yZEluZGV4ICpzZWNvbmQpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhbWVtY21wKGZpcnN0LCBzZWNvbmQsIHNpemVfKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNpemVfdCBzaXplXzsKK307CisKK3N0cnVjdCBEZWR1cGVFbnRyeSB7CisgIHR5cGVkZWYgV29yZEluZGV4ICpLZXk7CisgIEtleSBHZXRLZXkoKSBjb25zdCB7IHJldHVybiBrZXk7IH0KKyAgdm9pZCBTZXRLZXkoV29yZEluZGV4ICp0bykgeyBrZXkgPSB0bzsgfQorICBLZXkga2V5OworICBzdGF0aWMgRGVkdXBlRW50cnkgQ29uc3RydWN0KFdvcmRJbmRleCAqYXQpIHsKKyAgICBEZWR1cGVFbnRyeSByZXQ7CisgICAgcmV0LmtleSA9IGF0OworICAgIHJldHVybiByZXQ7CisgIH0KK307CisKKworLy8gVE9ETzogZG9uJ3QgaGF2ZSB0aGlzIGhlcmUsIHNob3VsZCBiZSB3aXRoIHByb2JpbmcgaGFzaCB0YWJsZSBkZWZhdWx0cz8KK2NvbnN0IGZsb2F0IGtQcm9iaW5nTXVsdGlwbGllciA9IDEuNTsKKwordHlwZWRlZiB1dGlsOjpQcm9iaW5nSGFzaFRhYmxlPERlZHVwZUVudHJ5LCBEZWR1cGVIYXNoLCBEZWR1cGVFcXVhbHM+IERlZHVwZTsKKworY2xhc3MgV3JpdGVyIHsKKyAgcHVibGljOgorICAgIFdyaXRlcihzdGQ6OnNpemVfdCBvcmRlciwgY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbiwgdm9pZCAqZGVkdXBlX21lbSwgc3RkOjpzaXplX3QgZGVkdXBlX21lbV9zaXplKQorICAgICAgOiBibG9ja18ocG9zaXRpb24pLCBncmFtXyhibG9ja18tPkdldCgpLCBvcmRlciksCisgICAgICAgIGRlZHVwZV9pbnZhbGlkXyhvcmRlciwgc3RkOjpudW1lcmljX2xpbWl0czxXb3JkSW5kZXg+OjptYXgoKSksCisgICAgICAgIGRlZHVwZV8oZGVkdXBlX21lbSwgZGVkdXBlX21lbV9zaXplLCAmZGVkdXBlX2ludmFsaWRfWzBdLCBEZWR1cGVIYXNoKG9yZGVyKSwgRGVkdXBlRXF1YWxzKG9yZGVyKSksCisgICAgICAgIGJ1ZmZlcl8obmV3IFdvcmRJbmRleFtvcmRlciAtIDFdKSwKKyAgICAgICAgYmxvY2tfc2l6ZV8ocG9zaXRpb24uR2V0Q2hhaW4oKS5CbG9ja1NpemUoKSkgeworICAgICAgZGVkdXBlXy5DbGVhcigpOworICAgICAgYXNzZXJ0KERlZHVwZTo6U2l6ZShwb3NpdGlvbi5HZXRDaGFpbigpLkJsb2NrU2l6ZSgpIC8gcG9zaXRpb24uR2V0Q2hhaW4oKS5FbnRyeVNpemUoKSwga1Byb2JpbmdNdWx0aXBsaWVyKSA9PSBkZWR1cGVfbWVtX3NpemUpOworICAgICAgaWYgKG9yZGVyID09IDEpIHsKKyAgICAgICAgLy8gQWRkIHNwZWNpYWwgd29yZHMuICBBZGp1c3RDb3VudHMgaXMgcmVzcG9uc2libGUgaWYgb3JkZXIgIT0gMS4KKyAgICAgICAgQWRkVW5pZ3JhbVdvcmQoa1VOSyk7CisgICAgICAgIEFkZFVuaWdyYW1Xb3JkKGtCT1MpOworICAgICAgfQorICAgIH0KKworICAgIH5Xcml0ZXIoKSB7CisgICAgICBibG9ja18tPlNldFZhbGlkU2l6ZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihncmFtXy5iZWdpbigpKSAtIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihibG9ja18tPkdldCgpKSk7CisgICAgICAoKytibG9ja18pLlBvaXNvbigpOworICAgIH0KKworICAgIC8vIFdyaXRlIGNvbnRleHQgd2l0aCBhIGJ1bmNoIG9mIDxzPgorICAgIHZvaWQgU3RhcnRTZW50ZW5jZSgpIHsKKyAgICAgIGZvciAoV29yZEluZGV4ICppID0gZ3JhbV8uYmVnaW4oKTsgaSAhPSBncmFtXy5lbmQoKSAtIDE7ICsraSkgeworICAgICAgICAqaSA9IGtCT1M7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBBcHBlbmQoV29yZEluZGV4IHdvcmQpIHsKKyAgICAgICooZ3JhbV8uZW5kKCkgLSAxKSA9IHdvcmQ7CisgICAgICBEZWR1cGU6Ok11dGFibGVJdGVyYXRvciBhdDsKKyAgICAgIGJvb2wgZm91bmQgPSBkZWR1cGVfLkZpbmRPckluc2VydChEZWR1cGVFbnRyeTo6Q29uc3RydWN0KGdyYW1fLmJlZ2luKCkpLCBhdCk7CisgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBwcmVzZW50LgorICAgICAgICBOR3JhbTxCdWlsZGluZ1BheWxvYWQ+IGFscmVhZHkoYXQtPmtleSwgZ3JhbV8uT3JkZXIoKSk7CisgICAgICAgICsrKGFscmVhZHkuVmFsdWUoKS5jb3VudCk7CisgICAgICAgIC8vIFNoaWZ0IGxlZnQgYnkgb25lLgorICAgICAgICBtZW1tb3ZlKGdyYW1fLmJlZ2luKCksIGdyYW1fLmJlZ2luKCkgKyAxLCBzaXplb2YoV29yZEluZGV4KSAqIChncmFtXy5PcmRlcigpIC0gMSkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAvLyBDb21wbGV0ZSB0aGUgd3JpdGUuCisgICAgICBncmFtXy5WYWx1ZSgpLmNvdW50ID0gMTsKKyAgICAgIC8vIFByZXBhcmUgdGhlIG5leHQgbi1ncmFtLgorICAgICAgaWYgKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGdyYW1fLmJlZ2luKCkpICsgZ3JhbV8uVG90YWxTaXplKCkgIT0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJsb2NrXy0+R2V0KCkpICsgYmxvY2tfc2l6ZV8pIHsKKyAgICAgICAgTkdyYW08QnVpbGRpbmdQYXlsb2FkPiBsYXN0KGdyYW1fKTsKKyAgICAgICAgZ3JhbV8uTmV4dEluTWVtb3J5KCk7CisgICAgICAgIHN0ZDo6Y29weShsYXN0LmJlZ2luKCkgKyAxLCBsYXN0LmVuZCgpLCBncmFtXy5iZWdpbigpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLy8gQmxvY2sgZW5kLiAgTmVlZCB0byBzdG9yZSB0aGUgY29udGV4dCBpbiBhIHRlbXBvcmFyeSBidWZmZXIuCisgICAgICBzdGQ6OmNvcHkoZ3JhbV8uYmVnaW4oKSArIDEsIGdyYW1fLmVuZCgpLCBidWZmZXJfLmdldCgpKTsKKyAgICAgIGRlZHVwZV8uQ2xlYXIoKTsKKyAgICAgIGJsb2NrXy0+U2V0VmFsaWRTaXplKGJsb2NrX3NpemVfKTsKKyAgICAgIGdyYW1fLlJlQmFzZSgoKytibG9ja18pLT5HZXQoKSk7CisgICAgICBzdGQ6OmNvcHkoYnVmZmVyXy5nZXQoKSwgYnVmZmVyXy5nZXQoKSArIGdyYW1fLk9yZGVyKCkgLSAxLCBncmFtXy5iZWdpbigpKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIEFkZFVuaWdyYW1Xb3JkKFdvcmRJbmRleCBpbmRleCkgeworICAgICAgKmdyYW1fLmJlZ2luKCkgPSBpbmRleDsKKyAgICAgIGdyYW1fLlZhbHVlKCkuY291bnQgPSAwOworICAgICAgZ3JhbV8uTmV4dEluTWVtb3J5KCk7CisgICAgICBpZiAoZ3JhbV8uQmFzZSgpID09IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihibG9ja18tPkdldCgpKSArIGJsb2NrX3NpemVfKSB7CisgICAgICAgIGJsb2NrXy0+U2V0VmFsaWRTaXplKGJsb2NrX3NpemVfKTsKKyAgICAgICAgZ3JhbV8uUmVCYXNlKCgrK2Jsb2NrXyktPkdldCgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB1dGlsOjpzdHJlYW06OkxpbmsgYmxvY2tfOworCisgICAgTkdyYW08QnVpbGRpbmdQYXlsb2FkPiBncmFtXzsKKworICAgIC8vIFRoaXMgaXMgdGhlIG1lbW9yeSBiZWhpbmQgdGhlIGludmFsaWQgdmFsdWUgaW4gZGVkdXBlXy4KKyAgICBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+IGRlZHVwZV9pbnZhbGlkXzsKKyAgICAvLyBIYXNoIHRhYmxlIGNvbWJpbmVyIGltcGxlbWVudGF0aW9uLgorICAgIERlZHVwZSBkZWR1cGVfOworCisgICAgLy8gU21hbGwgYnVmZmVyIHRvIGhvbGQgZXhpc3RpbmcgbmdyYW1zIHdoZW4gc2hpZnRpbmcgYWNyb3NzIGEgYmxvY2sgYm91bmRhcnkuCisgICAgYm9vc3Q6OnNjb3BlZF9hcnJheTxXb3JkSW5kZXg+IGJ1ZmZlcl87CisKKyAgICBjb25zdCBzdGQ6OnNpemVfdCBibG9ja19zaXplXzsKK307CisKK30gLy8gbmFtZXNwYWNlCisKK2Zsb2F0IENvcnB1c0NvdW50OjpEZWR1cGVNdWx0aXBsaWVyKHN0ZDo6c2l6ZV90IG9yZGVyKSB7CisgIHJldHVybiBrUHJvYmluZ011bHRpcGxpZXIgKiBzdGF0aWNfY2FzdDxmbG9hdD4oc2l6ZW9mKERlZHVwZUVudHJ5KSkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oTkdyYW08QnVpbGRpbmdQYXlsb2FkPjo6VG90YWxTaXplKG9yZGVyKSk7Cit9CisKK3N0ZDo6c2l6ZV90IENvcnB1c0NvdW50OjpWb2NhYlVzYWdlKHN0ZDo6c2l6ZV90IHZvY2FiX2VzdGltYXRlKSB7CisgIHJldHVybiBuZ3JhbTo6R3Jvd2FibGVWb2NhYjxuZ3JhbTo6V3JpdGVVbmlxdWVXb3Jkcz46Ok1lbVVzYWdlKHZvY2FiX2VzdGltYXRlKTsKK30KKworQ29ycHVzQ291bnQ6OkNvcnB1c0NvdW50KHV0aWw6OkZpbGVQaWVjZSAmZnJvbSwgaW50IHZvY2FiX3dyaXRlLCB1aW50NjRfdCAmdG9rZW5fY291bnQsIFdvcmRJbmRleCAmdHlwZV9jb3VudCwgc3RkOjp2ZWN0b3I8Ym9vbD4gJnBydW5lX3dvcmRzLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJ1bmVfdm9jYWJfZmlsZW5hbWUsIHN0ZDo6c2l6ZV90IGVudHJpZXNfcGVyX2Jsb2NrLCBXYXJuaW5nQWN0aW9uIGRpc2FsbG93ZWRfc3ltYm9sKQorICA6IGZyb21fKGZyb20pLCB2b2NhYl93cml0ZV8odm9jYWJfd3JpdGUpLCB0b2tlbl9jb3VudF8odG9rZW5fY291bnQpLCB0eXBlX2NvdW50Xyh0eXBlX2NvdW50KSwKKyAgICBwcnVuZV93b3Jkc18ocHJ1bmVfd29yZHMpLCBwcnVuZV92b2NhYl9maWxlbmFtZV8ocHJ1bmVfdm9jYWJfZmlsZW5hbWUpLAorICAgIGRlZHVwZV9tZW1fc2l6ZV8oRGVkdXBlOjpTaXplKGVudHJpZXNfcGVyX2Jsb2NrLCBrUHJvYmluZ011bHRpcGxpZXIpKSwKKyAgICBkZWR1cGVfbWVtXyh1dGlsOjpNYWxsb2NPclRocm93KGRlZHVwZV9tZW1fc2l6ZV8pKSwKKyAgICBkaXNhbGxvd2VkX3N5bWJvbF9hY3Rpb25fKGRpc2FsbG93ZWRfc3ltYm9sKSB7Cit9CisKK25hbWVzcGFjZSB7CisgIHZvaWQgQ29tcGxhaW5EaXNhbGxvd2VkKFN0cmluZ1BpZWNlIHdvcmQsIFdhcm5pbmdBY3Rpb24gJmFjdGlvbikgeworICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICBjYXNlIFNJTEVOVDoKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBDT01QTEFJTjoKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nOiAiIDw8IHdvcmQgPDwgIiBhcHBlYXJzIGluIHRoZSBpbnB1dC4gIEFsbCBpbnN0YW5jZXMgb2YgPHM+LCA8L3M+LCBhbmQgPHVuaz4gd2lsbCBiZSBpbnRlcnByZXRlZCBhcyB3aGl0ZXNwYWNlLiIgPDwgc3RkOjplbmRsOworICAgICAgICBhY3Rpb24gPSBTSUxFTlQ7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgVEhST1dfVVA6CisgICAgICAgIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIlNwZWNpYWwgd29yZCAiIDw8IHdvcmQgPDwgIiBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY29ycHVzLiAgSSBwbGFuIHRvIHN1cHBvcnQgbW9kZWxzIGNvbnRhaW5pbmcgPHVuaz4gaW4gdGhlIGZ1dHVyZS4gIFBhc3MgLS1za2lwX3N5bWJvbHMgdG8gY29udmVydCB0aGVzZSBzeW1ib2xzIHRvIHdoaXRlc3BhY2UuIik7CisgICAgfQorICB9Cit9IC8vIG5hbWVzcGFjZQorCit2b2lkIENvcnB1c0NvdW50OjpSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICBuZ3JhbTo6R3Jvd2FibGVWb2NhYjxuZ3JhbTo6V3JpdGVVbmlxdWVXb3Jkcz4gdm9jYWIodHlwZV9jb3VudF8sIHZvY2FiX3dyaXRlXyk7CisgIHRva2VuX2NvdW50XyA9IDA7CisgIHR5cGVfY291bnRfID0gMDsKKyAgY29uc3QgV29yZEluZGV4IGVuZF9zZW50ZW5jZSA9IHZvY2FiLkZpbmRPckluc2VydCgiPC9zPiIpOworICBXcml0ZXIgd3JpdGVyKE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD46Ok9yZGVyRnJvbVNpemUocG9zaXRpb24uR2V0Q2hhaW4oKS5FbnRyeVNpemUoKSksIHBvc2l0aW9uLCBkZWR1cGVfbWVtXy5nZXQoKSwgZGVkdXBlX21lbV9zaXplXyk7CisgIHVpbnQ2NF90IGNvdW50ID0gMDsKKyAgYm9vbCBkZWxpbWl0ZXJzWzI1Nl07CisgIHV0aWw6OkJvb2xDaGFyYWN0ZXI6OkJ1aWxkKCJcMFx0XG5cciAiLCBkZWxpbWl0ZXJzKTsKKyAgdHJ5IHsKKyAgICB3aGlsZSh0cnVlKSB7CisgICAgICBTdHJpbmdQaWVjZSBsaW5lKGZyb21fLlJlYWRMaW5lKCkpOworICAgICAgd3JpdGVyLlN0YXJ0U2VudGVuY2UoKTsKKyAgICAgIGZvciAodXRpbDo6VG9rZW5JdGVyPHV0aWw6OkJvb2xDaGFyYWN0ZXIsIHRydWU+IHcobGluZSwgZGVsaW1pdGVycyk7IHc7ICsrdykgeworICAgICAgICBXb3JkSW5kZXggd29yZCA9IHZvY2FiLkZpbmRPckluc2VydCgqdyk7CisgICAgICAgIGlmICh3b3JkIDw9IDIpIHsKKyAgICAgICAgICBDb21wbGFpbkRpc2FsbG93ZWQoKncsIGRpc2FsbG93ZWRfc3ltYm9sX2FjdGlvbl8pOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5BcHBlbmQod29yZCk7CisgICAgICAgICsrY291bnQ7CisgICAgICB9CisgICAgICB3cml0ZXIuQXBwZW5kKGVuZF9zZW50ZW5jZSk7CisgICAgfQorICB9IGNhdGNoIChjb25zdCB1dGlsOjpFbmRPZkZpbGVFeGNlcHRpb24gJmUpIHt9CisgIHRva2VuX2NvdW50XyA9IGNvdW50OworICB0eXBlX2NvdW50XyA9IHZvY2FiLlNpemUoKTsKKworICAvLyBDcmVhdGUgbGlzdCBvZiB1bmlncmFtcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBwcnVuZWQKKyAgaWYgKCFwcnVuZV92b2NhYl9maWxlbmFtZV8uZW1wdHkoKSkgeworICAgIHRyeSB7CisgICAgICB1dGlsOjpGaWxlUGllY2UgcHJ1bmVfdm9jYWJfZmlsZShwcnVuZV92b2NhYl9maWxlbmFtZV8uY19zdHIoKSk7CisKKyAgICAgIHBydW5lX3dvcmRzXy5yZXNpemUodm9jYWIuU2l6ZSgpLCB0cnVlKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgU3RyaW5nUGllY2Ugd29yZChwcnVuZV92b2NhYl9maWxlLlJlYWREZWxpbWl0ZWQoZGVsaW1pdGVycykpOworICAgICAgICAgIHBydW5lX3dvcmRzX1t2b2NhYi5JbmRleCh3b3JkKV0gPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoY29uc3QgdXRpbDo6RW5kT2ZGaWxlRXhjZXB0aW9uICZlKSB7fQorCisgICAgICAvLyBOZXZlciBwcnVuZSA8dW5rPiwgPHM+LCA8L3M+CisgICAgICBwcnVuZV93b3Jkc19ba1VOS10gPSBmYWxzZTsKKyAgICAgIHBydW5lX3dvcmRzX1trQk9TXSA9IGZhbHNlOworICAgICAgcHJ1bmVfd29yZHNfW2tFT1NdID0gZmFsc2U7CisKKyAgICB9IGNhdGNoIChjb25zdCB1dGlsOjpFeGNlcHRpb24gJmUpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBidWlsZGVyCit9IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2J1aWxkZXIvY29ycHVzX2NvdW50LmhoIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvY29ycHVzX2NvdW50LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTUwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vYnVpbGRlci9jb3JwdXNfY291bnQuaGgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBMTV9CVUlMREVSX0NPUlBVU19DT1VOVF9ICisjZGVmaW5lIExNX0JVSUxERVJfQ09SUFVTX0NPVU5UX0gKKworI2luY2x1ZGUgImxtL2xtX2V4Y2VwdGlvbi5oaCIKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgdXRpbCB7CitjbGFzcyBGaWxlUGllY2U7CituYW1lc3BhY2Ugc3RyZWFtIHsKK2NsYXNzIENoYWluUG9zaXRpb247Cit9IC8vIG5hbWVzcGFjZSBzdHJlYW0KK30gLy8gbmFtZXNwYWNlIHV0aWwKKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBidWlsZGVyIHsKKworY2xhc3MgQ29ycHVzQ291bnQgeworICBwdWJsaWM6CisgICAgLy8gTWVtb3J5IHVzYWdlIHdpbGwgYmUgRGVkdXBlTXVsdGlwbGVyKG9yZGVyKSAqIGJsb2NrX3NpemUgKyB0b3RhbF9jaGFpbl9zaXplICsgdW5rbm93biB2b2NhYl9oYXNoX3NpemUKKyAgICBzdGF0aWMgZmxvYXQgRGVkdXBlTXVsdGlwbGllcihzdGQ6OnNpemVfdCBvcmRlcik7CisKKyAgICAvLyBIb3cgbXVjaCBtZW1vcnkgdm9jYWJ1bGFyeSB3aWxsIHVzZSBiYXNlZCBvbiBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgdm9jYWIuCisgICAgc3RhdGljIHN0ZDo6c2l6ZV90IFZvY2FiVXNhZ2Uoc3RkOjpzaXplX3Qgdm9jYWJfZXN0aW1hdGUpOworCisgICAgLy8gdG9rZW5fY291bnQ6IG91dC4KKyAgICAvLyB0eXBlX2NvdW50IGFrYSB2b2NhYnVsYXJ5IHNpemUuICBJbml0aWFsaXplIHRvIGFuIGVzdGltYXRlLiAgSXQgaXMgc2V0IHRvIHRoZSBleGFjdCB2YWx1ZS4KKyAgICBDb3JwdXNDb3VudCh1dGlsOjpGaWxlUGllY2UgJmZyb20sIGludCB2b2NhYl93cml0ZSwgdWludDY0X3QgJnRva2VuX2NvdW50LCBXb3JkSW5kZXggJnR5cGVfY291bnQsIHN0ZDo6dmVjdG9yPGJvb2w+ICZwcnVuZV93b3JkcywgY29uc3Qgc3RkOjpzdHJpbmcmIHBydW5lX3ZvY2FiX2ZpbGVuYW1lLCBzdGQ6OnNpemVfdCBlbnRyaWVzX3Blcl9ibG9jaywgV2FybmluZ0FjdGlvbiBkaXNhbGxvd2VkX3N5bWJvbCk7CisKKyAgICB2b2lkIFJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnBvc2l0aW9uKTsKKworICBwcml2YXRlOgorICAgIHV0aWw6OkZpbGVQaWVjZSAmZnJvbV87CisgICAgaW50IHZvY2FiX3dyaXRlXzsKKyAgICB1aW50NjRfdCAmdG9rZW5fY291bnRfOworICAgIFdvcmRJbmRleCAmdHlwZV9jb3VudF87CisgICAgc3RkOjp2ZWN0b3I8Ym9vbD4mIHBydW5lX3dvcmRzXzsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJ1bmVfdm9jYWJfZmlsZW5hbWVfOworCisgICAgc3RkOjpzaXplX3QgZGVkdXBlX21lbV9zaXplXzsKKyAgICB1dGlsOjpzY29wZWRfbWFsbG9jIGRlZHVwZV9tZW1fOworCisgICAgV2FybmluZ0FjdGlvbiBkaXNhbGxvd2VkX3N5bWJvbF9hY3Rpb25fOworfTsKKworfSAvLyBuYW1lc3BhY2UgYnVpbGRlcgorfSAvLyBuYW1lc3BhY2UgbG0KKyNlbmRpZiAvLyBMTV9CVUlMREVSX0NPUlBVU19DT1VOVF9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYnVpbGRlci9jb3JwdXNfY291bnRfdGVzdC5jYyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL2NvcnB1c19jb3VudF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YmNmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vYnVpbGRlci9jb3JwdXNfY291bnRfdGVzdC5jYwpAQCAtMCwwICsxLDc5IEBACisjaW5jbHVkZSAibG0vYnVpbGRlci9jb3JwdXNfY291bnQuaGgiCisKKyNpbmNsdWRlICJsbS9idWlsZGVyL3BheWxvYWQuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL25ncmFtX3N0cmVhbS5oaCIKKyNpbmNsdWRlICJsbS9jb21tb24vbmdyYW0uaGgiCisKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisjaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgorI2luY2x1ZGUgInV0aWwvdG9rZW5pemVfcGllY2UuaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY2hhaW4uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vc3RyZWFtLmhoIgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIENvcnB1c0NvdW50VGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGJ1aWxkZXIgeyBuYW1lc3BhY2UgeworCisjZGVmaW5lIENoZWNrKHN0ciwgY250KSB7IFwKKyAgQk9PU1RfUkVRVUlSRShzdHJlYW0pOyBcCisgIHcgPSBzdHJlYW0tPmJlZ2luKCk7IFwKKyAgZm9yICh1dGlsOjpUb2tlbkl0ZXI8dXRpbDo6QW55Q2hhcmFjdGVyLCB0cnVlPiB0KHN0ciwgIiAiKTsgdDsgKyt0LCArK3cpIHsgXAorICAgIEJPT1NUX0NIRUNLX0VRVUFMKCp0LCB2Wyp3XSk7IFwKKyAgfSBcCisgIEJPT1NUX0NIRUNLX0VRVUFMKCh1aW50NjRfdCljbnQsIHN0cmVhbS0+VmFsdWUoKS5jb3VudCk7IFwKKyAgKytzdHJlYW07IFwKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2hvcnQpIHsKKyAgdXRpbDo6c2NvcGVkX2ZkIGlucHV0X2ZpbGUodXRpbDo6TWFrZVRlbXAoImNvcnB1c19jb3VudF90ZXN0X3RlbXAiKSk7CisgIGNvbnN0IGNoYXIgaW5wdXRbXSA9ICJsb29raW5nIG9uIGEgbGl0dGxlIG1vcmUgbG9pblxub24gYSBsaXR0bGUgbW9yZSBsb2luXG5vbiBmb28gbGl0dGxlIG1vcmUgbG9pblxuYmFyXG5cbiI7CisgIC8vIEJsb2NrcyBvZiAxMCBhcmUKKyAgLy8gbG9va2luZyBvbiBhIGxpdHRsZSBtb3JlIGxvaW4gPC9zPiBvbiBhIGxpdHRsZVtkdXBsaWNhdGVdIG1vcmVbZHVwbGljYXRlXSBsb2luW2R1cGxpY2F0ZV0gPC9zPltkdXBsaWNhdGVdIG9uW2R1cGxpY2F0ZV0gZm9vCisgIC8vIGxpdHRsZSBtb3JlIGxvaW4gPC9zPiBiYXIgPC9zPiA8L3M+CisKKyAgdXRpbDo6V3JpdGVPclRocm93KGlucHV0X2ZpbGUuZ2V0KCksIGlucHV0LCBzaXplb2YoaW5wdXQpIC0gMSk7CisgIHV0aWw6OkZpbGVQaWVjZSBpbnB1dF9waWVjZShpbnB1dF9maWxlLnJlbGVhc2UoKSwgInRlbXAgZmlsZSIpOworCisgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Db25maWcgY29uZmlnOworICBjb25maWcuZW50cnlfc2l6ZSA9IE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD46OlRvdGFsU2l6ZSgzKTsKKyAgY29uZmlnLnRvdGFsX21lbW9yeSA9IGNvbmZpZy5lbnRyeV9zaXplICogMjA7CisgIGNvbmZpZy5ibG9ja19jb3VudCA9IDI7CisKKyAgdXRpbDo6c2NvcGVkX2ZkIHZvY2FiKHV0aWw6Ok1ha2VUZW1wKCJjb3JwdXNfY291bnRfdGVzdF92b2NhYiIpKTsKKworICB1dGlsOjpzdHJlYW06OkNoYWluIGNoYWluKGNvbmZpZyk7CisgIHVpbnQ2NF90IHRva2VuX2NvdW50OworICBXb3JkSW5kZXggdHlwZV9jb3VudCA9IDEwOworICBzdGQ6OnZlY3Rvcjxib29sPiBwcnVuZV93b3JkczsKKyAgQ29ycHVzQ291bnQgY291bnRlcihpbnB1dF9waWVjZSwgdm9jYWIuZ2V0KCksIHRva2VuX2NvdW50LCB0eXBlX2NvdW50LCBwcnVuZV93b3JkcywgIiIsIGNoYWluLkJsb2NrU2l6ZSgpIC8gY2hhaW4uRW50cnlTaXplKCksIFNJTEVOVCk7CisgIGNoYWluID4+IGJvb3N0OjpyZWYoY291bnRlcik7CisgIE5HcmFtU3RyZWFtPEJ1aWxkaW5nUGF5bG9hZD4gc3RyZWFtKGNoYWluLkFkZCgpKTsKKyAgY2hhaW4gPj4gdXRpbDo6c3RyZWFtOjprUmVjeWNsZTsKKworICBjb25zdCBjaGFyICp2W10gPSB7Ijx1bms+IiwgIjxzPiIsICI8L3M+IiwgImxvb2tpbmciLCAib24iLCAiYSIsICJsaXR0bGUiLCAibW9yZSIsICJsb2luIiwgImZvbyIsICJiYXIifTsKKworICBXb3JkSW5kZXggKnc7CisKKyAgQ2hlY2soIjxzPiA8cz4gbG9va2luZyIsIDEpOworICBDaGVjaygiPHM+IGxvb2tpbmcgb24iLCAxKTsKKyAgQ2hlY2soImxvb2tpbmcgb24gYSIsIDEpOworICBDaGVjaygib24gYSBsaXR0bGUiLCAyKTsKKyAgQ2hlY2soImEgbGl0dGxlIG1vcmUiLCAyKTsKKyAgQ2hlY2soImxpdHRsZSBtb3JlIGxvaW4iLCAyKTsKKyAgQ2hlY2soIm1vcmUgbG9pbiA8L3M+IiwgMik7CisgIENoZWNrKCI8cz4gPHM+IG9uIiwgMik7CisgIENoZWNrKCI8cz4gb24gYSIsIDEpOworICBDaGVjaygiPHM+IG9uIGZvbyIsIDEpOworICBDaGVjaygib24gZm9vIGxpdHRsZSIsIDEpOworICBDaGVjaygiZm9vIGxpdHRsZSBtb3JlIiwgMSk7CisgIENoZWNrKCJsaXR0bGUgbW9yZSBsb2luIiwgMSk7CisgIENoZWNrKCJtb3JlIGxvaW4gPC9zPiIsIDEpOworICBDaGVjaygiPHM+IDxzPiBiYXIiLCAxKTsKKyAgQ2hlY2soIjxzPiBiYXIgPC9zPiIsIDEpOworICBDaGVjaygiPHM+IDxzPiA8L3M+IiwgMSk7CisgIEJPT1NUX0NIRUNLKCFzdHJlYW0pOworICBCT09TVF9DSEVDS19FUVVBTChzaXplb2YodikgLyBzaXplb2YoY29uc3QgY2hhciopLCB0eXBlX2NvdW50KTsKK30KKworfX19IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9idWlsZGVyL2RlYnVnX3ByaW50LmhoIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvZGVidWdfcHJpbnQuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5ZjMwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL2RlYnVnX3ByaW50LmhoCkBAIC0wLDAgKzEsNzAgQEAKKyNpZm5kZWYgTE1fQlVJTERFUl9ERUJVR19QUklOVF9ICisjZGVmaW5lIExNX0JVSUxERVJfREVCVUdfUFJJTlRfSAorCisjaW5jbHVkZSAibG0vYnVpbGRlci9wYXlsb2FkLmhoIgorI2luY2x1ZGUgImxtL2NvbW1vbi9wcmludC5oaCIKKyNpbmNsdWRlICJsbS9jb21tb24vbmdyYW1fc3RyZWFtLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZV9zdHJlYW0uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorCisjaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGJ1aWxkZXIgeworLy8gTm90IGRlZmluZWQsIG9ubHkgc3BlY2lhbGl6ZWQuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBQcmludFBheWxvYWQodXRpbDo6RmlsZVN0cmVhbSAmdG8sIGNvbnN0IEJ1aWxkaW5nUGF5bG9hZCAmcGF5bG9hZCk7Cit0ZW1wbGF0ZSA8PiBpbmxpbmUgdm9pZCBQcmludFBheWxvYWQ8dWludDY0X3Q+KHV0aWw6OkZpbGVTdHJlYW0gJnRvLCBjb25zdCBCdWlsZGluZ1BheWxvYWQgJnBheWxvYWQpIHsKKyAgdG8gPDwgcGF5bG9hZC5jb3VudDsKK30KK3RlbXBsYXRlIDw+IGlubGluZSB2b2lkIFByaW50UGF5bG9hZDxVbmludGVycG9sYXRlZD4odXRpbDo6RmlsZVN0cmVhbSAmdG8sIGNvbnN0IEJ1aWxkaW5nUGF5bG9hZCAmcGF5bG9hZCkgeworICB0byA8PCBsb2cxMChwYXlsb2FkLnVuaW50ZXJwLnByb2IpIDw8ICcgJyA8PCBsb2cxMChwYXlsb2FkLnVuaW50ZXJwLmdhbW1hKTsKK30KK3RlbXBsYXRlIDw+IGlubGluZSB2b2lkIFByaW50UGF5bG9hZDxQcm9iQmFja29mZj4odXRpbDo6RmlsZVN0cmVhbSAmdG8sIGNvbnN0IEJ1aWxkaW5nUGF5bG9hZCAmcGF5bG9hZCkgeworICB0byA8PCBwYXlsb2FkLmNvbXBsZXRlLnByb2IgPDwgJyAnIDw8IHBheWxvYWQuY29tcGxldGUuYmFja29mZjsKK30KKworLy8gdGVtcGxhdGUgcGFyYW1ldGVyIGlzIHRoZSB0eXBlIHN0b3JlZC4KK3RlbXBsYXRlIDxjbGFzcyBWPiBjbGFzcyBQcmludCB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgdm9pZCBEdW1wU2VwYXJhdGVGaWxlcyhjb25zdCBWb2NhYlJlY29uc3RpdHV0ZSAmdm9jYWIsIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlX2Jhc2UsIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZjaGFpbnMpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY2hhaW5zLnNpemUoKTsgKytpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGUoZmlsZV9iYXNlICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oaSkpOworICAgICAgICBjaGFpbnNbaV0gPj4gUHJpbnQodm9jYWIsIHV0aWw6OkNyZWF0ZU9yVGhyb3coZmlsZS5jX3N0cigpKSk7CisgICAgICB9CisgICAgfQorCisgICAgZXhwbGljaXQgUHJpbnQoY29uc3QgVm9jYWJSZWNvbnN0aXR1dGUgJnZvY2FiLCBpbnQgZmQpIDogdm9jYWJfKHZvY2FiKSwgdG9fKGZkKSB7fQorCisgICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyAmY2hhaW5zKSB7CisgICAgICB1dGlsOjpzY29wZWRfZmQgZmQodG9fKTsKKyAgICAgIHV0aWw6OkZpbGVTdHJlYW0gb3V0KHRvXyk7CisgICAgICBOR3JhbVN0cmVhbXM8QnVpbGRpbmdQYXlsb2FkPiBzdHJlYW1zKGNoYWlucyk7CisgICAgICBmb3IgKE5HcmFtU3RyZWFtPEJ1aWxkaW5nUGF5bG9hZD4gKnMgPSBzdHJlYW1zLmJlZ2luKCk7IHMgIT0gc3RyZWFtcy5lbmQoKTsgKytzKSB7CisgICAgICAgIER1bXBTdHJlYW0oKnMsIG91dCk7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICAgICAgdXRpbDo6c2NvcGVkX2ZkIGZkKHRvXyk7CisgICAgICB1dGlsOjpGaWxlU3RyZWFtIG91dCh0b18pOworICAgICAgTkdyYW1TdHJlYW08QnVpbGRpbmdQYXlsb2FkPiBzdHJlYW0ocG9zaXRpb24pOworICAgICAgRHVtcFN0cmVhbShzdHJlYW0sIG91dCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBEdW1wU3RyZWFtKE5HcmFtU3RyZWFtPEJ1aWxkaW5nUGF5bG9hZD4gJnN0cmVhbSwgdXRpbDo6RmlsZVN0cmVhbSAmdG8pIHsKKyAgICAgIGZvciAoOyBzdHJlYW07ICsrc3RyZWFtKSB7CisgICAgICAgIFByaW50UGF5bG9hZDxWPih0bywgc3RyZWFtLT5WYWx1ZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBXb3JkSW5kZXggKncgPSBzdHJlYW0tPmJlZ2luKCk7IHcgIT0gc3RyZWFtLT5lbmQoKTsgKyt3KSB7CisgICAgICAgICAgdG8gPDwgJyAnIDw8IHZvY2FiXy5Mb29rdXAoKncpIDw8ICc9JyA8PCAqdzsKKyAgICAgICAgfQorICAgICAgICB0byA8PCAnXG4nOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IFZvY2FiUmVjb25zdGl0dXRlICZ2b2NhYl87CisgICAgaW50IHRvXzsKK307CisKK319IC8vIG5hbWVzcGFjZXMKKworI2VuZGlmIC8vIExNX0JVSUxERVJfREVCVUdfUFJJTlRfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvZGlzY291bnQuaGggYi9zcmMva2VubG0vbG0vYnVpbGRlci9kaXNjb3VudC5oaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvZGlzY291bnQuaGgKcmVuYW1lIHRvIHNyYy9rZW5sbS9sbS9idWlsZGVyL2Rpc2NvdW50LmhoCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYnVpbGRlci9kdW1wX2NvdW50c19tYWluLmNjIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvZHVtcF9jb3VudHNfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjA3OGQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvZHVtcF9jb3VudHNfbWFpbi5jYwpAQCAtMCwwICsxLDM2IEBACisjaW5jbHVkZSAibG0vY29tbW9uL3ByaW50LmhoIgorI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvcmVhZF9jb21wcmVzc2VkLmhoIgorCisjaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBpZiAoYXJnYyAhPSA0KSB7CisgICAgc3RkOjpjZXJyIDw8ICJVc2FnZTogIiA8PCBhcmd2WzBdIDw8ICIgY291bnRzIHZvY2FidWxhcnkgb3JkZXJcbiIKKyAgICAiVGhlIGNvdW50cyBmaWxlIGNvbnRhaW5zIHJlY29yZHMgd2l0aCA0LWJ5dGUgdm9jYWJ1bGFyeSBpZHMgZm9sbG93ZWQgYnkgOC1ieXRlXG4iCisgICAgImNvdW50cy4gIEVhY2ggcmVjb3JkIGhhcyBvcmRlciBtYW55IHZvY2FidWxhcnkgaWRzLlxuIgorICAgICJUaGUgdm9jYWJ1bGFyeSBmaWxlIGNvbnRhaW5zIHRoZSB3b3JkcyBkZWxpbWl0ZWQgYnkgTlVMTCBpbiBvcmRlciBvZiBpZC5cbiIKKyAgICAiVGhlIHZvY2FidWxhcnkgZmlsZSBtYXkgbm90IGJlIGNvbXByZXNzZWQgYmVjYXVzZSBpdCBpcyBtbWFwcGVkIGJ1dCB0aGUgY291bnRzXG4iCisgICAgImZpbGUgY2FuIGJlIGNvbXByZXNzZWQuXG4iOworICAgIHJldHVybiAxOworICB9CisgIHV0aWw6OlJlYWRDb21wcmVzc2VkIGNvdW50cyh1dGlsOjpPcGVuUmVhZE9yVGhyb3coYXJndlsxXSkpOworICB1dGlsOjpzY29wZWRfZmQgdm9jYWJfZmlsZSh1dGlsOjpPcGVuUmVhZE9yVGhyb3coYXJndlsyXSkpOworICBsbTo6Vm9jYWJSZWNvbnN0aXR1dGUgdm9jYWIodm9jYWJfZmlsZS5nZXQoKSk7CisgIHVuc2lnbmVkIGludCBvcmRlciA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8dW5zaWduZWQgaW50Pihhcmd2WzNdKTsKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gcmVjb3JkKHNpemVvZih1aW50MzJfdCkgKiBvcmRlciArIHNpemVvZih1aW50NjRfdCkpOworICB3aGlsZSAoc3RkOjpzaXplX3QgZ290ID0gY291bnRzLlJlYWRPckVPRigmKnJlY29yZC5iZWdpbigpLCByZWNvcmQuc2l6ZSgpKSkgeworICAgIFVUSUxfVEhST1dfSUYoZ290ICE9IHJlY29yZC5zaXplKCksIHV0aWw6OkV4Y2VwdGlvbiwgIlJlYWQgIiA8PCBnb3QgPDwgIiBieXRlcyBhdCB0aGUgZW5kIG9mIGZpbGUsIHdoaWNoIGlzIG5vdCBhIGNvbXBsZXRlIHJlY29yZCBvZiBsZW5ndGggIiA8PCByZWNvcmQuc2l6ZSgpKTsKKyAgICBjb25zdCBsbTo6V29yZEluZGV4ICp3b3JkcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbG06OldvcmRJbmRleCo+KCYqcmVjb3JkLmJlZ2luKCkpOworICAgIGZvciAoY29uc3QgbG06OldvcmRJbmRleCAqaSA9IHdvcmRzOyBpICE9IHdvcmRzICsgb3JkZXI7ICsraSkgeworICAgICAgVVRJTF9USFJPV19JRigqaSA+PSB2b2NhYi5TaXplKCksIHV0aWw6OkV4Y2VwdGlvbiwgIlZvY2FiIElEICIgPDwgKmkgPDwgIiBpcyBsYXJnZXIgdGhhbiB0aGUgdm9jYWIgZmlsZSdzIG1heGltdW0gb2YgIiA8PCB2b2NhYi5TaXplKCkgPDwgIi4gIEFyZSB5b3Ugc3VyZSB5b3UgaGF2ZSB0aGUgcmlnaHQgb3JkZXIgYW5kIHZvY2FiIGZpbGUgZm9yIHRoZXNlIGNvdW50cz8iKTsKKyAgICAgIHN0ZDo6Y291dCA8PCB2b2NhYi5Mb29rdXAoKmkpIDw8ICcgJzsKKyAgICB9CisgICAgLy8gVE9ETyBkb24ndCB1c2Ugc3RkOjpjb3V0IGJlY2F1c2UgaXQgaXMgc2xvdy4gIEFkZCBmYXN0IHVpbnQ2NF90IHByaW50aW5nIHN1cHBvcnQgdG8gRmlsZVN0cmVhbS4KKyAgICBzdGQ6OmNvdXQgPDwgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QqPih3b3JkcyArIG9yZGVyKSA8PCAnXG4nOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vYnVpbGRlci9oYXNoX2dhbW1hLmhoIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvaGFzaF9nYW1tYS5oaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2J1aWxkZXIvaGFzaF9nYW1tYS5oaApyZW5hbWUgdG8gc3JjL2tlbmxtL2xtL2J1aWxkZXIvaGFzaF9nYW1tYS5oaApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2J1aWxkZXIvaGVhZGVyX2luZm8uaGggYi9zcmMva2VubG0vbG0vYnVpbGRlci9oZWFkZXJfaW5mby5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDFkMDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvaGVhZGVyX2luZm8uaGgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBMTV9CVUlMREVSX0hFQURFUl9JTkZPX0gKKyNkZWZpbmUgTE1fQlVJTERFUl9IRUFERVJfSU5GT19ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7CisKKy8vIFNvbWUgY29uZmlndXJhdGlvbiBpbmZvIHRoYXQgaXMgdXNlZCB0byBhZGQKKy8vIGNvbW1lbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgYW4gQVJQQSBmaWxlCitzdHJ1Y3QgSGVhZGVySW5mbyB7CisgIHN0ZDo6c3RyaW5nIGlucHV0X2ZpbGU7CisgIHVpbnQ2NF90IHRva2VuX2NvdW50OworICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRzX3BydW5lZDsKKworICBIZWFkZXJJbmZvKCkge30KKworICBIZWFkZXJJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dF9maWxlX2luLCB1aW50NjRfdCB0b2tlbl9jb3VudF9pbiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHNfcHJ1bmVkX2luKQorICAgIDogaW5wdXRfZmlsZShpbnB1dF9maWxlX2luKSwgdG9rZW5fY291bnQodG9rZW5fY291bnRfaW4pLCBjb3VudHNfcHJ1bmVkKGNvdW50c19wcnVuZWRfaW4pIHt9CisKKyAgLy8gVE9ETzogQWRkIHNtb290aGluZyB0eXBlCisgIC8vIFRPRE86IE1vcmUgaW5mbyBpZiBtdWx0aXBsZSBtb2RlbHMgd2VyZSBpbnRlcnBvbGF0ZWQKK307CisKK319IC8vIG5hbWVzcGFjZXMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYnVpbGRlci9pbml0aWFsX3Byb2JhYmlsaXRpZXMuY2MgYi9zcmMva2VubG0vbG0vYnVpbGRlci9pbml0aWFsX3Byb2JhYmlsaXRpZXMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI4ZDg2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL2luaXRpYWxfcHJvYmFiaWxpdGllcy5jYwpAQCAtMCwwICsxLDMwNiBAQAorI2luY2x1ZGUgImxtL2J1aWxkZXIvaW5pdGlhbF9wcm9iYWJpbGl0aWVzLmhoIgorCisjaW5jbHVkZSAibG0vYnVpbGRlci9kaXNjb3VudC5oaCIKKyNpbmNsdWRlICJsbS9idWlsZGVyL2hhc2hfZ2FtbWEuaGgiCisjaW5jbHVkZSAibG0vYnVpbGRlci9wYXlsb2FkLmhoIgorI2luY2x1ZGUgImxtL2NvbW1vbi9zcGVjaWFsLmhoIgorI2luY2x1ZGUgImxtL2NvbW1vbi9uZ3JhbV9zdHJlYW0uaGgiCisjaW5jbHVkZSAidXRpbC9tdXJtdXJfaGFzaC5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY2hhaW4uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vaW8uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vc3RyZWFtLmhoIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7CisKK25hbWVzcGFjZSB7CitzdHJ1Y3QgQnVmZmVyRW50cnkgeworICAvLyBHYW1tYSBmcm9tIHBhZ2UgMjAgb2YgQ2hlbiBhbmQgR29vZG1hbi4KKyAgZmxvYXQgZ2FtbWE7CisgIC8vIFxzdW1fdyBhKGMgdykgZm9yIGFsbCB3LgorICBmbG9hdCBkZW5vbWluYXRvcjsKK307CisKK3N0cnVjdCBIYXNoQnVmZmVyRW50cnkgOiBwdWJsaWMgQnVmZmVyRW50cnkgeworICAvLyBIYXNoIHZhbHVlIG9mIG5ncmFtLiBVc2VkIHRvIGpvaW4gY29udGV4dHMgd2l0aCBiYWNrb2Zmcy4KKyAgdWludDY0X3QgaGFzaF92YWx1ZTsKK307CisKKy8vIFJlYWRzIGFsbCBlbnRyaWVzIGluIG9yZGVyIGxpa2UgTkdyYW1TdHJlYW0gZG9lcy4KKy8vIEJ1dCBkZWxldGVzIGFueSBlbnRyaWVzIHRoYXQgaGF2ZSBDdXRvZmZDb3VudCBiZWxvdyBvciBlcXVhbCB0byBwcnVuaW5nCisvLyB0aHJlc2hvbGQuCitjbGFzcyBQcnVuZU5HcmFtU3RyZWFtIHsKKyAgcHVibGljOgorICAgIFBydW5lTkdyYW1TdHJlYW0oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbiwgY29uc3QgU3BlY2lhbFZvY2FiICZzcGVjaWFscykgOgorICAgICAgY3VycmVudF8oTlVMTCwgTkdyYW08QnVpbGRpbmdQYXlsb2FkPjo6T3JkZXJGcm9tU2l6ZShwb3NpdGlvbi5HZXRDaGFpbigpLkVudHJ5U2l6ZSgpKSksCisgICAgICBkZXN0XyhOVUxMLCBOR3JhbTxCdWlsZGluZ1BheWxvYWQ+OjpPcmRlckZyb21TaXplKHBvc2l0aW9uLkdldENoYWluKCkuRW50cnlTaXplKCkpKSwKKyAgICAgIGN1cnJlbnRDb3VudF8oMCksCisgICAgICBibG9ja18ocG9zaXRpb24pLAorICAgICAgc3BlY2lhbHNfKHNwZWNpYWxzKQorICAgIHsKKyAgICAgIFN0YXJ0QmxvY2soKTsKKyAgICB9CisKKyAgICBOR3JhbTxCdWlsZGluZ1BheWxvYWQ+ICZvcGVyYXRvciooKSB7IHJldHVybiBjdXJyZW50XzsgfQorICAgIE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD4gKm9wZXJhdG9yLT4oKSB7IHJldHVybiAmY3VycmVudF87IH0KKworICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICByZXR1cm4gYmxvY2tfOworICAgIH0KKworICAgIFBydW5lTkdyYW1TdHJlYW0gJm9wZXJhdG9yKysoKSB7CisgICAgICBhc3NlcnQoYmxvY2tfKTsKKyAgICAgIGlmKFVUSUxfVU5MSUtFTFkoY3VycmVudF8uT3JkZXIoKSA9PSAxICYmIHNwZWNpYWxzXy5Jc1NwZWNpYWwoKmN1cnJlbnRfLmJlZ2luKCkpKSkKKyAgICAgICAgZGVzdF8uTmV4dEluTWVtb3J5KCk7CisgICAgICBlbHNlIGlmKGN1cnJlbnRDb3VudF8gPiAwKSB7CisgICAgICAgIGlmKGRlc3RfLkJhc2UoKSA8IGN1cnJlbnRfLkJhc2UoKSkgeworICAgICAgICAgIG1lbWNweShkZXN0Xy5CYXNlKCksIGN1cnJlbnRfLkJhc2UoKSwgY3VycmVudF8uVG90YWxTaXplKCkpOworICAgICAgICB9CisgICAgICAgIGRlc3RfLk5leHRJbk1lbW9yeSgpOworICAgICAgfQorCisgICAgICBjdXJyZW50Xy5OZXh0SW5NZW1vcnkoKTsKKworICAgICAgdWludDhfdCAqYmxvY2tfYmFzZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihibG9ja18tPkdldCgpKTsKKyAgICAgIGlmIChjdXJyZW50Xy5CYXNlKCkgPT0gYmxvY2tfYmFzZSArIGJsb2NrXy0+VmFsaWRTaXplKCkpIHsKKyAgICAgICAgYmxvY2tfLT5TZXRWYWxpZFNpemUoZGVzdF8uQmFzZSgpIC0gYmxvY2tfYmFzZSk7CisgICAgICAgICsrYmxvY2tfOworICAgICAgICBTdGFydEJsb2NrKCk7CisgICAgICAgIGlmIChibG9ja18pIHsKKyAgICAgICAgICBjdXJyZW50Q291bnRfID0gY3VycmVudF8uVmFsdWUoKS5DdXRvZmZDb3VudCgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50Q291bnRfID0gY3VycmVudF8uVmFsdWUoKS5DdXRvZmZDb3VudCgpOworICAgICAgfQorCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBTdGFydEJsb2NrKCkgeworICAgICAgZm9yICg7IDsgKytibG9ja18pIHsKKyAgICAgICAgaWYgKCFibG9ja18pIHJldHVybjsKKyAgICAgICAgaWYgKGJsb2NrXy0+VmFsaWRTaXplKCkpIGJyZWFrOworICAgICAgfQorICAgICAgY3VycmVudF8uUmVCYXNlKGJsb2NrXy0+R2V0KCkpOworICAgICAgY3VycmVudENvdW50XyA9IGN1cnJlbnRfLlZhbHVlKCkuQ3V0b2ZmQ291bnQoKTsKKworICAgICAgZGVzdF8uUmVCYXNlKGJsb2NrXy0+R2V0KCkpOworICAgIH0KKworICAgIE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD4gY3VycmVudF87IC8vIGlucHV0IGl0ZXJhdG9yCisgICAgTkdyYW08QnVpbGRpbmdQYXlsb2FkPiBkZXN0XzsgICAgLy8gb3V0cHV0IGl0ZXJhdG9yCisKKyAgICB1aW50NjRfdCBjdXJyZW50Q291bnRfOworCisgICAgdXRpbDo6c3RyZWFtOjpMaW5rIGJsb2NrXzsKKworICAgIGNvbnN0IFNwZWNpYWxWb2NhYiBzcGVjaWFsc187Cit9OworCisvLyBFeHRyYWN0IGFuIGFycmF5IG9mIEhhc2hlZEdhbW1hIGZyb20gYW4gYXJyYXkgb2YgQnVmZmVyRW50cnkuCitjbGFzcyBPbmx5R2FtbWEgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgT25seUdhbW1hKGJvb2wgcHJ1bmluZykgOiBwcnVuaW5nXyhwcnVuaW5nKSB7fQorCisgICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICAgICAgZm9yICh1dGlsOjpzdHJlYW06OkxpbmsgYmxvY2tfaXQocG9zaXRpb24pOyBibG9ja19pdDsgKytibG9ja19pdCkgeworICAgICAgICBpZihwcnVuaW5nXykgeworICAgICAgICAgIGNvbnN0IEhhc2hCdWZmZXJFbnRyeSAqaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBIYXNoQnVmZmVyRW50cnkqPihibG9ja19pdC0+R2V0KCkpOworICAgICAgICAgIGNvbnN0IEhhc2hCdWZmZXJFbnRyeSAqZW5kID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFzaEJ1ZmZlckVudHJ5Kj4oYmxvY2tfaXQtPlZhbGlkRW5kKCkpOworCisgICAgICAgICAgLy8gSnVzdCBtYWtlIGl0IHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSBzbyBpdCBjYW4gYmUgb3ZlcndyaXR0ZW4KKyAgICAgICAgICAvLyBXaXRoIEhhc2hHYW1tYSB2YWx1ZXMuIERvIG5vdCBhdHRlbXB0IHRvIGludGVycHJldCB0aGUgdmFsdWVzIHVudGlsIHNldCBiZWxvdy4KKyAgICAgICAgICBIYXNoR2FtbWEgKm91dCA9IHN0YXRpY19jYXN0PEhhc2hHYW1tYSo+KGJsb2NrX2l0LT5HZXQoKSk7CisgICAgICAgICAgZm9yICg7IGluIDwgZW5kOyBvdXQgKz0gMSwgaW4gKz0gMSkgeworICAgICAgICAgICAgLy8gYnVmZmVyaW5nLCBvdGhlcndpc2UgbWlnaHQgb3ZlcndyaXRlIHZhbHVlcyB0b28gZWFybHkKKyAgICAgICAgICAgIGZsb2F0IGdhbW1hX2J1ZiA9IGluLT5nYW1tYTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGhhc2hfYnVmID0gaW4tPmhhc2hfdmFsdWU7CisKKyAgICAgICAgICAgIG91dC0+Z2FtbWEgPSBnYW1tYV9idWY7CisgICAgICAgICAgICBvdXQtPmhhc2hfdmFsdWUgPSBoYXNoX2J1ZjsKKyAgICAgICAgICB9CisgICAgICAgICAgYmxvY2tfaXQtPlNldFZhbGlkU2l6ZSgoYmxvY2tfaXQtPlZhbGlkU2l6ZSgpICogc2l6ZW9mKEhhc2hHYW1tYSkpIC8gc2l6ZW9mKEhhc2hCdWZmZXJFbnRyeSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGZsb2F0ICpvdXQgPSBzdGF0aWNfY2FzdDxmbG9hdCo+KGJsb2NrX2l0LT5HZXQoKSk7CisgICAgICAgICAgY29uc3QgZmxvYXQgKmluID0gb3V0OworICAgICAgICAgIGNvbnN0IGZsb2F0ICplbmQgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCo+KGJsb2NrX2l0LT5WYWxpZEVuZCgpKTsKKyAgICAgICAgICBmb3IgKG91dCArPSAxLCBpbiArPSAyOyBpbiA8IGVuZDsgb3V0ICs9IDEsIGluICs9IDIpIHsKKyAgICAgICAgICAgICpvdXQgPSAqaW47CisgICAgICAgICAgfQorICAgICAgICAgIGJsb2NrX2l0LT5TZXRWYWxpZFNpemUoYmxvY2tfaXQtPlZhbGlkU2l6ZSgpIC8gMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgYm9vbCBwcnVuaW5nXzsKK307CisKK2NsYXNzIEFkZFJpZ2h0IHsKKyAgcHVibGljOgorICAgIEFkZFJpZ2h0KGNvbnN0IERpc2NvdW50ICZkaXNjb3VudCwgY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZpbnB1dCwgYm9vbCBwcnVuaW5nKQorICAgICAgOiBkaXNjb3VudF8oZGlzY291bnQpLCBpbnB1dF8oaW5wdXQpLCBwcnVuaW5nXyhwcnVuaW5nKSB7fQorCisgICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZvdXRwdXQpIHsKKyAgICAgIE5HcmFtU3RyZWFtPEJ1aWxkaW5nUGF5bG9hZD4gaW4oaW5wdXRfKTsKKyAgICAgIHV0aWw6OnN0cmVhbTo6U3RyZWFtIG91dChvdXRwdXQpOworCisgICAgICBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+IHByZXZpb3VzKGluLT5PcmRlcigpIC0gMSk7CisgICAgICAvLyBTaWxseSB3aW5kb3dzIHJlcXVpcmVzIHRoaXMgd29ya2Fyb3VuZCB0byBqdXN0IGdldCBhbiBpbnZhbGlkIHBvaW50ZXIgd2hlbiBlbXB0eS4KKyAgICAgIHZvaWQgKmNvbnN0IHByZXZpb3VzX3JhdyA9IHByZXZpb3VzLmVtcHR5KCkgPyBOVUxMIDogc3RhdGljX2Nhc3Q8dm9pZCo+KCZwcmV2aW91c1swXSk7CisgICAgICBjb25zdCBzdGQ6OnNpemVfdCBzaXplID0gc2l6ZW9mKFdvcmRJbmRleCkgKiBwcmV2aW91cy5zaXplKCk7CisKKyAgICAgIGZvcig7IGluOyArK291dCkgeworICAgICAgICBtZW1jcHkocHJldmlvdXNfcmF3LCBpbi0+YmVnaW4oKSwgc2l6ZSk7CisgICAgICAgIHVpbnQ2NF90IGRlbm9taW5hdG9yID0gMDsKKyAgICAgICAgdWludDY0X3Qgbm9ybWFsaXplciA9IDA7CisKKyAgICAgICAgdWludDY0X3QgY291bnRzWzRdOworICAgICAgICBtZW1zZXQoY291bnRzLCAwLCBzaXplb2YoY291bnRzKSk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBkZW5vbWluYXRvciArPSBpbi0+VmFsdWUoKS5Vbm1hcmtlZENvdW50KCk7CisKKyAgICAgICAgICAvLyBDb2xsZWN0IHVudXNlZCBwcm9iYWJpbGl0eSBtYXNzIGZyb20gcHJ1bmluZy4KKyAgICAgICAgICAvLyBCZWNvbWVzIDAgZm9yIHVucHJ1bmVkIG5ncmFtcy4KKyAgICAgICAgICBub3JtYWxpemVyICs9IGluLT5WYWx1ZSgpLlVubWFya2VkQ291bnQoKSAtIGluLT5WYWx1ZSgpLkN1dG9mZkNvdW50KCk7CisKKyAgICAgICAgICAvLyBDaGVuJkdvb2RtYW4gZG8gbm90IG1lbnRpb24gY291bnRpbmcgYmFzZWQgb24gY3V0b2ZmcywgYnV0CisgICAgICAgICAgLy8gYmFja29mZiBiZWNvbWVzIGxhcmdlciB0aGFuIDEgb3RoZXJ3aXNlLCBzbyBwcm9iYWJseSBuZWVkcworICAgICAgICAgIC8vIHRvIGNvdW50IGN1dG9mZnMuIENvdW50cyBub3JtYWxseSB3aXRob3V0IHBydW5pbmcuCisgICAgICAgICAgaWYoaW4tPlZhbHVlKCkuQ3V0b2ZmQ291bnQoKSA+IDApCisgICAgICAgICAgICArK2NvdW50c1tzdGQ6Om1pbihpbi0+VmFsdWUoKS5DdXRvZmZDb3VudCgpLCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oMykpXTsKKworICAgICAgICB9IHdoaWxlICgrK2luICYmICFtZW1jbXAocHJldmlvdXNfcmF3LCBpbi0+YmVnaW4oKSwgc2l6ZSkpOworCisgICAgICAgIEJ1ZmZlckVudHJ5ICZlbnRyeSA9ICpyZWludGVycHJldF9jYXN0PEJ1ZmZlckVudHJ5Kj4ob3V0LkdldCgpKTsKKyAgICAgICAgZW50cnkuZGVub21pbmF0b3IgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZGVub21pbmF0b3IpOworICAgICAgICBlbnRyeS5nYW1tYSA9IDAuMDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8PSAzOyArK2kpIHsKKyAgICAgICAgICBlbnRyeS5nYW1tYSArPSBkaXNjb3VudF8uR2V0KGkpICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvdW50c1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlcyBtb2RlbCBzdW0gdG8gMSB3aXRoIHBydW5pbmcgKEkgaG9wZSkuCisgICAgICAgIGVudHJ5LmdhbW1hICs9IG5vcm1hbGl6ZXI7CisKKyAgICAgICAgZW50cnkuZ2FtbWEgLz0gZW50cnkuZGVub21pbmF0b3I7CisKKyAgICAgICAgaWYocHJ1bmluZ18pIHsKKyAgICAgICAgICAvLyBJZiBwcnVuaW5nIGlzIGVuYWJsZWQgdGhlIHN0cmVhbSBhY3R1YWxseSBjb250YWlucyBIYXNoQnVmZmVyRW50cnksIHNlZSBJbml0aWFsUHJvYmFiaWxpdGllcyguLi4pLAorICAgICAgICAgIC8vIHNvIGFkZCBhIGhhc2ggdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBjdXJyZW50IG5ncmFtLgorICAgICAgICAgIHN0YXRpY19jYXN0PEhhc2hCdWZmZXJFbnRyeSo+KCZlbnRyeSktPmhhc2hfdmFsdWUgPSB1dGlsOjpNdXJtdXJIYXNoTmF0aXZlKHByZXZpb3VzX3Jhdywgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG91dC5Qb2lzb24oKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBEaXNjb3VudCAmZGlzY291bnRfOworICAgIGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiBpbnB1dF87CisgICAgYm9vbCBwcnVuaW5nXzsKK307CisKK2NsYXNzIE1lcmdlUmlnaHQgeworICBwdWJsaWM6CisgICAgTWVyZ2VSaWdodChib29sIGludGVycG9sYXRlX3VuaWdyYW1zLCBjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJmZyb21fYWRkZXIsIGNvbnN0IERpc2NvdW50ICZkaXNjb3VudCwgY29uc3QgU3BlY2lhbFZvY2FiICZzcGVjaWFscykKKyAgICAgIDogaW50ZXJwb2xhdGVfdW5pZ3JhbXNfKGludGVycG9sYXRlX3VuaWdyYW1zKSwgZnJvbV9hZGRlcl8oZnJvbV9hZGRlciksIGRpc2NvdW50XyhkaXNjb3VudCksIHNwZWNpYWxzXyhzcGVjaWFscykge30KKworICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW5pdGlhbCBwcm9iYWJpbGl0eSBvZiBlYWNoIG4tZ3JhbSAoYmVmb3JlIG9yZGVyLWludGVycG9sYXRpb24pCisgICAgLy8gUnVuKCkgZ2V0cyBpbnZva2VkIG9uY2UgZm9yIGVhY2ggb3JkZXIKKyAgICB2b2lkIFJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnByaW1hcnkpIHsKKyAgICAgIHV0aWw6OnN0cmVhbTo6U3RyZWFtIHN1bW1lZChmcm9tX2FkZGVyXyk7CisKKyAgICAgIFBydW5lTkdyYW1TdHJlYW0gZ3JhbXMocHJpbWFyeSwgc3BlY2lhbHNfKTsKKworICAgICAgLy8gV2l0aG91dCBpbnRlcnBvbGF0aW9uLCB0aGUgaW50ZXJwb2xhdGlvbiB3ZWlnaHQgZ29lcyB0byA8dW5rPi4KKyAgICAgIGlmIChncmFtcy0+T3JkZXIoKSA9PSAxKSB7CisgICAgICAgIEJ1ZmZlckVudHJ5IHN1bXMoKnN0YXRpY19jYXN0PGNvbnN0IEJ1ZmZlckVudHJ5Kj4oc3VtbWVkLkdldCgpKSk7CisgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgPHVuaz4KKyAgICAgICAgYXNzZXJ0KCpncmFtcy0+YmVnaW4oKSA9PSBrVU5LKTsKKyAgICAgICAgZmxvYXQgZ2FtbWFfYXNzaWduOworICAgICAgICBpZiAoaW50ZXJwb2xhdGVfdW5pZ3JhbXNfKSB7CisgICAgICAgICAgLy8gRGVmYXVsdDogdHJlYXQgPHVuaz4gbGlrZSBhIHplcm90b24uCisgICAgICAgICAgZ2FtbWFfYXNzaWduID0gc3Vtcy5nYW1tYTsKKyAgICAgICAgICBncmFtcy0+VmFsdWUoKS51bmludGVycC5wcm9iID0gMC4wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFNSSTogZ2l2ZSBhbGwgdGhlIGludGVycG9sYXRpb24gbWFzcyB0byA8dW5rPgorICAgICAgICAgIGdhbW1hX2Fzc2lnbiA9IDAuMDsKKyAgICAgICAgICBncmFtcy0+VmFsdWUoKS51bmludGVycC5wcm9iID0gc3Vtcy5nYW1tYTsKKyAgICAgICAgfQorICAgICAgICBncmFtcy0+VmFsdWUoKS51bmludGVycC5nYW1tYSA9IGdhbW1hX2Fzc2lnbjsKKworICAgICAgICBmb3IgKCsrZ3JhbXM7ICpncmFtcy0+YmVnaW4oKSAhPSBzcGVjaWFsc18uQk9TKCk7ICsrZ3JhbXMpIHsKKyAgICAgICAgICBncmFtcy0+VmFsdWUoKS51bmludGVycC5wcm9iID0gZGlzY291bnRfLkFwcGx5KGdyYW1zLT5WYWx1ZSgpLmNvdW50KSAvIHN1bXMuZGVub21pbmF0b3I7CisgICAgICAgICAgZ3JhbXMtPlZhbHVlKCkudW5pbnRlcnAuZ2FtbWEgPSBnYW1tYV9hc3NpZ247CisgICAgICAgIH0KKworICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIDxzPjogcHJvYmFiaWxpdHkgMS4wLiAgVGhpcyBhbGxvd3MgPHM+IHRvIGJlCisgICAgICAgIC8vIGV4cGxpY2l0bHkgc2NvcmVkIGFzIHBhcnQgb2YgdGhlIHNlbnRlbmNlIHdpdGhvdXQgaW1wYWN0aW5nCisgICAgICAgIC8vIHByb2JhYmlsaXR5IGFuZCBjb21wdXRlcyBxIGNvcnJlY3RseSBhcyBiKDxzPikuCisgICAgICAgIGFzc2VydCgqZ3JhbXMtPmJlZ2luKCkgPT0gc3BlY2lhbHNfLkJPUygpKTsKKyAgICAgICAgZ3JhbXMtPlZhbHVlKCkudW5pbnRlcnAucHJvYiA9IDEuMDsKKyAgICAgICAgZ3JhbXMtPlZhbHVlKCkudW5pbnRlcnAuZ2FtbWEgPSAwLjA7CisKKyAgICAgICAgd2hpbGUgKCsrZ3JhbXMpIHsKKyAgICAgICAgICBncmFtcy0+VmFsdWUoKS51bmludGVycC5wcm9iID0gZGlzY291bnRfLkFwcGx5KGdyYW1zLT5WYWx1ZSgpLmNvdW50KSAvIHN1bXMuZGVub21pbmF0b3I7CisgICAgICAgICAgZ3JhbXMtPlZhbHVlKCkudW5pbnRlcnAuZ2FtbWEgPSBnYW1tYV9hc3NpZ247CisgICAgICAgIH0KKyAgICAgICAgKytzdW1tZWQ7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiBwcmV2aW91cyhncmFtcy0+T3JkZXIoKSAtIDEpOworICAgICAgY29uc3Qgc3RkOjpzaXplX3Qgc2l6ZSA9IHNpemVvZihXb3JkSW5kZXgpICogcHJldmlvdXMuc2l6ZSgpOworICAgICAgZm9yICg7IGdyYW1zOyArK3N1bW1lZCkgeworICAgICAgICBtZW1jcHkoJnByZXZpb3VzWzBdLCBncmFtcy0+YmVnaW4oKSwgc2l6ZSk7CisgICAgICAgIGNvbnN0IEJ1ZmZlckVudHJ5ICZzdW1zID0gKnN0YXRpY19jYXN0PGNvbnN0IEJ1ZmZlckVudHJ5Kj4oc3VtbWVkLkdldCgpKTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgQnVpbGRpbmdQYXlsb2FkICZwYXkgPSBncmFtcy0+VmFsdWUoKTsKKyAgICAgICAgICBwYXkudW5pbnRlcnAucHJvYiA9IGRpc2NvdW50Xy5BcHBseShncmFtcy0+VmFsdWUoKS5Vbm1hcmtlZENvdW50KCkpIC8gc3Vtcy5kZW5vbWluYXRvcjsKKyAgICAgICAgICBwYXkudW5pbnRlcnAuZ2FtbWEgPSBzdW1zLmdhbW1hOworICAgICAgICB9IHdoaWxlICgrK2dyYW1zICYmICFtZW1jbXAoJnByZXZpb3VzWzBdLCBncmFtcy0+YmVnaW4oKSwgc2l6ZSkpOworICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIGJvb2wgaW50ZXJwb2xhdGVfdW5pZ3JhbXNfOworICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiBmcm9tX2FkZGVyXzsKKyAgICBEaXNjb3VudCBkaXNjb3VudF87CisgICAgY29uc3QgU3BlY2lhbFZvY2FiIHNwZWNpYWxzXzsKK307CisKK30gLy8gbmFtZXNwYWNlCisKK3ZvaWQgSW5pdGlhbFByb2JhYmlsaXRpZXMoCisgICAgY29uc3QgSW5pdGlhbFByb2JhYmlsaXRpZXNDb25maWcgJmNvbmZpZywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxEaXNjb3VudD4gJmRpc2NvdW50cywKKyAgICB1dGlsOjpzdHJlYW06OkNoYWlucyAmcHJpbWFyeSwKKyAgICB1dGlsOjpzdHJlYW06OkNoYWlucyAmc2Vjb25kX2luLAorICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZnYW1tYV9vdXQsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZwcnVuZV90aHJlc2hvbGRzLAorICAgIGJvb2wgcHJ1bmVfdm9jYWIsCisgICAgY29uc3QgU3BlY2lhbFZvY2FiICZzcGVjaWFscykgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByaW1hcnkuc2l6ZSgpOyArK2kpIHsKKyAgICB1dGlsOjpzdHJlYW06OkNoYWluQ29uZmlnIGdhbW1hX2NvbmZpZyA9IGNvbmZpZy5hZGRlcl9vdXQ7CisgICAgaWYocHJ1bmVfdm9jYWIgfHwgcHJ1bmVfdGhyZXNob2xkc1tpXSA+IDApCisgICAgICBnYW1tYV9jb25maWcuZW50cnlfc2l6ZSA9IHNpemVvZihIYXNoQnVmZmVyRW50cnkpOworICAgIGVsc2UKKyAgICAgIGdhbW1hX2NvbmZpZy5lbnRyeV9zaXplID0gc2l6ZW9mKEJ1ZmZlckVudHJ5KTsKKworICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiBzZWNvbmQoc2Vjb25kX2luW2ldLkFkZCgpKTsKKyAgICBzZWNvbmRfaW5baV0gPj4gdXRpbDo6c3RyZWFtOjprUmVjeWNsZTsKKyAgICBnYW1tYV9vdXQucHVzaF9iYWNrKGdhbW1hX2NvbmZpZyk7CisgICAgZ2FtbWFfb3V0W2ldID4+IEFkZFJpZ2h0KGRpc2NvdW50c1tpXSwgc2Vjb25kLCBwcnVuZV92b2NhYiB8fCBwcnVuZV90aHJlc2hvbGRzW2ldID4gMCk7CisKKyAgICBwcmltYXJ5W2ldID4+IE1lcmdlUmlnaHQoY29uZmlnLmludGVycG9sYXRlX3VuaWdyYW1zLCBnYW1tYV9vdXRbaV0uQWRkKCksIGRpc2NvdW50c1tpXSwgc3BlY2lhbHMpOworCisgICAgLy8gRG9uJ3QgYm90aGVyIHdpdGggdGhlIE9ubHlHYW1tYSB0aHJlYWQgZm9yIHNvbWV0aGluZyB0byBkaXNjYXJkLgorICAgIGlmIChpKSBnYW1tYV9vdXRbaV0gPj4gT25seUdhbW1hKHBydW5lX3ZvY2FiIHx8IHBydW5lX3RocmVzaG9sZHNbaV0gPiAwKTsKKyAgfQorfQorCit9fSAvLyBuYW1lc3BhY2VzCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYnVpbGRlci9pbml0aWFsX3Byb2JhYmlsaXRpZXMuaGggYi9zcmMva2VubG0vbG0vYnVpbGRlci9pbml0aWFsX3Byb2JhYmlsaXRpZXMuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlZWE1OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL2luaXRpYWxfcHJvYmFiaWxpdGllcy5oaApAQCAtMCwwICsxLDQ1IEBACisjaWZuZGVmIExNX0JVSUxERVJfSU5JVElBTF9QUk9CQUJJTElUSUVTX0gKKyNkZWZpbmUgTE1fQlVJTERFUl9JTklUSUFMX1BST0JBQklMSVRJRVNfSAorCisjaW5jbHVkZSAibG0vYnVpbGRlci9kaXNjb3VudC5oaCIKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NvbmZpZy5oaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHV0aWwgeyBuYW1lc3BhY2Ugc3RyZWFtIHsgY2xhc3MgQ2hhaW5zOyB9IH0KKworbmFtZXNwYWNlIGxtIHsKK2NsYXNzIFNwZWNpYWxWb2NhYjsKK25hbWVzcGFjZSBidWlsZGVyIHsKKworc3RydWN0IEluaXRpYWxQcm9iYWJpbGl0aWVzQ29uZmlnIHsKKyAgLy8gVGhlc2Ugc2hvdWxkIGJlIHNtYWxsIGJ1ZmZlcnMgdG8ga2VlcCB0aGUgYWRkZXIgZnJvbSBnZXR0aW5nIHRvbyBmYXIgYWhlYWQKKyAgdXRpbDo6c3RyZWFtOjpDaGFpbkNvbmZpZyBhZGRlcl9pbjsKKyAgdXRpbDo6c3RyZWFtOjpDaGFpbkNvbmZpZyBhZGRlcl9vdXQ7CisgIC8vIFNSSUxNIGRvZXNuJ3Qgbm9ybWFsbHkgaW50ZXJwb2xhdGUgdW5pZ3JhbXMuCisgIGJvb2wgaW50ZXJwb2xhdGVfdW5pZ3JhbXM7Cit9OworCisvKiBDb21wdXRlIGluaXRpYWwgKHVuaW50ZXJwb2xhdGVkKSBwcm9iYWJpbGl0aWVzCisgKiBwcmltYXJ5OiB0aGUgbm9ybWFsIGNoYWluIG9mIG4tZ3JhbXMuICBJbmNvbWluZyBpcyBjb250ZXh0IHNvcnRlZCBhZGp1c3RlZAorICogICBjb3VudHMuICBPdXRnb2luZyBoYXMgdW5pbnRlcnBvbGF0ZWQgcHJvYmFiaWxpdGllcyBmb3IgdXNlIGJ5IEludGVycG9sYXRlLgorICogc2Vjb25kX2luOiBhIHNlY29uZCBjb3B5IG9mIHRoZSBwcmltYXJ5IGlucHV0LiAgRGlzY2FyZCB0aGUgb3V0cHV0LgorICogZ2FtbWFfb3V0OiBDb21wdXRlZCBnYW1tYSB2YWx1ZXMgYXJlIG91dHB1dCBvbiB0aGVzZSBjaGFpbnMgaW4gc3VmZml4IG9yZGVyLgorICogICBUaGUgdmFsdWVzIGFyZSBiYXJlIGZsb2F0cyBhbmQgc2hvdWxkIGJlIGJ1ZmZlcmVkIGZvciBpbnRlcnBvbGF0aW9uIHRvCisgKiAgIHVzZS4KKyAqLwordm9pZCBJbml0aWFsUHJvYmFiaWxpdGllcygKKyAgICBjb25zdCBJbml0aWFsUHJvYmFiaWxpdGllc0NvbmZpZyAmY29uZmlnLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPERpc2NvdW50PiAmZGlzY291bnRzLAorICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZwcmltYXJ5LAorICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZzZWNvbmRfaW4sCisgICAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgJmdhbW1hX291dCwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJnBydW5lX3RocmVzaG9sZHMsCisgICAgYm9vbCBwcnVuZV92b2NhYiwKKyAgICBjb25zdCBTcGVjaWFsVm9jYWIgJnZvY2FiKTsKKworfSAvLyBuYW1lc3BhY2UgYnVpbGRlcgorfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX0JVSUxERVJfSU5JVElBTF9QUk9CQUJJTElUSUVTX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9idWlsZGVyL2ludGVycG9sYXRlLmNjIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvaW50ZXJwb2xhdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyZWY0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL2ludGVycG9sYXRlLmNjCkBAIC0wLDAgKzEsMTY2IEBACisjaW5jbHVkZSAibG0vYnVpbGRlci9pbnRlcnBvbGF0ZS5oaCIKKworI2luY2x1ZGUgImxtL2J1aWxkZXIvaGFzaF9nYW1tYS5oaCIKKyNpbmNsdWRlICJsbS9idWlsZGVyL3BheWxvYWQuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL2NvbXBhcmUuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL2pvaW50X29yZGVyLmhoIgorI2luY2x1ZGUgImxtL2NvbW1vbi9uZ3JhbV9zdHJlYW0uaGgiCisjaW5jbHVkZSAibG0vbG1fZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgInV0aWwvZml4ZWRfYXJyYXkuaGgiCisjaW5jbHVkZSAidXRpbC9tdXJtdXJfaGFzaC5oaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y21hdGg+CisKK25hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBidWlsZGVyIHsKK25hbWVzcGFjZSB7CisKKy8qIENhbGN1bGF0ZSBxLCB0aGUgY29sbGFwc2VkIHByb2JhYmlsaXR5IGFuZCBiYWNrb2ZmLCBhcyBkZWZpbmVkIGluCisgKiBAaW5wcm9jZWVkaW5nc3tIZWFmaWVsZC1yZXN0LAorICogICBhdXRob3IgPSB7S2VubmV0aCBIZWFmaWVsZCBhbmQgUGhpbGlwcCBLb2VobiBhbmQgQWxvbiBMYXZpZX0sCisgKiAgIHRpdGxlID0ge0xhbmd1YWdlIE1vZGVsIFJlc3QgQ29zdHMgYW5kIFNwYWNlLUVmZmljaWVudCBTdG9yYWdlfSwKKyAqICAgeWVhciA9IHsyMDEyfSwKKyAqICAgbW9udGggPSB7SnVseX0sCisgKiAgIGJvb2t0aXRsZSA9IHtQcm9jZWVkaW5ncyBvZiB0aGUgSm9pbnQgQ29uZmVyZW5jZSBvbiBFbXBpcmljYWwgTWV0aG9kcyBpbiBOYXR1cmFsIExhbmd1YWdlIFByb2Nlc3NpbmcgYW5kIENvbXB1dGF0aW9uYWwgTmF0dXJhbCBMYW5ndWFnZSBMZWFybmluZ30sCisgKiAgIGFkZHJlc3MgPSB7SmVqdSBJc2xhbmQsIEtvcmVhfSwKKyAqICAgcGFnZXMgPSB7MTE2OS0tMTE3OH0sCisgKiAgIHVybCA9IHtodHRwOi8va2hlYWZpZWxkLmNvbS9wcm9mZXNzaW9uYWwvZWRpbmJ1cmdoL3Jlc3RcX3BhcGVyLnBkZn0sCisgKiB9CisgKiBUaGlzIGlzIHBhcnRpY3VsYXJseSBjb252ZW5pZW50IHRvIGNhbGN1bGF0ZSBkdXJpbmcgaW50ZXJwb2xhdGlvbiBiZWNhdXNlCisgKiB0aGUgbmVlZGVkIGJhY2tvZmYgdGVybXMgYXJlIGFscmVhZHkgYWNjZXNzZWQgYXQgdGhlIHNhbWUgdGltZS4KKyAqLworY2xhc3MgT3V0cHV0USB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBPdXRwdXRRKHN0ZDo6c2l6ZV90IG9yZGVyKSA6IHFfZGVsdGFfKG9yZGVyKSB7fQorCisgICAgdm9pZCBHcmFtKHVuc2lnbmVkIG9yZGVyX21pbnVzXzEsIGZsb2F0IGZ1bGxfYmFja29mZiwgUHJvYkJhY2tvZmYgJm91dCkgeworICAgICAgZmxvYXQgJnFfZGVsID0gcV9kZWx0YV9bb3JkZXJfbWludXNfMV07CisgICAgICBpZiAob3JkZXJfbWludXNfMSkgeworICAgICAgICAvLyBEaXZpZGUgYnkgY29udGV4dCdzIGJhY2tvZmYgKHdoaWNoIGNvbWVzIGluIGFzIG91dC5iYWNrb2ZmKQorICAgICAgICBxX2RlbCA9IHFfZGVsdGFfW29yZGVyX21pbnVzXzEgLSAxXSAvIG91dC5iYWNrb2ZmICogZnVsbF9iYWNrb2ZmOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcV9kZWwgPSBmdWxsX2JhY2tvZmY7CisgICAgICB9CisgICAgICBvdXQucHJvYiA9IGxvZzEwZihvdXQucHJvYiAqIHFfZGVsKTsKKyAgICAgIC8vIFRPRE86IHN0b3Agd2FzdGVmdWxseSBvdXRwdXR0aW5nIHRoaXMhCisgICAgICBvdXQuYmFja29mZiA9IDAuMDsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLyBQcm9kdWN0IG9mIGJhY2tvZmZzIGluIHRoZSBudW1lcmF0b3IgZGl2aWRlZCBieSBiYWNrb2ZmcyBpbiB0aGUKKyAgICAvLyBkZW5vbWluYXRvci4gIERvZXMgbm90IGluY2x1ZGUKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcV9kZWx0YV87Cit9OworCisvKiBEZWZhdWx0OiBvdXRwdXQgcHJvYmFiaWxpdHkgYW5kIGJhY2tvZmYgKi8KK2NsYXNzIE91dHB1dFByb2JCYWNrb2ZmIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IE91dHB1dFByb2JCYWNrb2ZmKHN0ZDo6c2l6ZV90IC8qb3JkZXIqLykge30KKworICAgIHZvaWQgR3JhbSh1bnNpZ25lZCAvKm9yZGVyX21pbnVzXzEqLywgZmxvYXQgZnVsbF9iYWNrb2ZmLCBQcm9iQmFja29mZiAmb3V0KSBjb25zdCB7CisgICAgICAvLyBDb3JyZWN0aW5nIGZvciBudW1lcmljYWwgcHJlY2lzaW9uIGlzc3Vlcy4gIFRha2UgdGhhdCBJUlNULgorICAgICAgb3V0LnByb2IgPSBzdGQ6Om1pbigwLjBmLCBsb2cxMGYob3V0LnByb2IpKTsKKyAgICAgIG91dC5iYWNrb2ZmID0gbG9nMTBmKGZ1bGxfYmFja29mZik7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIE91dHB1dD4gY2xhc3MgQ2FsbGJhY2sgeworICBwdWJsaWM6CisgICAgQ2FsbGJhY2soZmxvYXQgdW5pZm9ybV9wcm9iLCBjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zICZiYWNrb2ZmcywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZwcnVuZV90aHJlc2hvbGRzLCBib29sIHBydW5lX3ZvY2FiLCBjb25zdCBTcGVjaWFsVm9jYWIgJnNwZWNpYWxzKQorICAgICAgOiBiYWNrb2Zmc18oYmFja29mZnMuc2l6ZSgpKSwgcHJvYnNfKGJhY2tvZmZzLnNpemUoKSArIDIpLAorICAgICAgICBwcnVuZV90aHJlc2hvbGRzXyhwcnVuZV90aHJlc2hvbGRzKSwKKyAgICAgICAgcHJ1bmVfdm9jYWJfKHBydW5lX3ZvY2FiKSwKKyAgICAgICAgb3V0cHV0XyhiYWNrb2Zmcy5zaXplKCkgKyAxIC8qIG9yZGVyICovKSwKKyAgICAgICAgc3BlY2lhbHNfKHNwZWNpYWxzKSB7CisgICAgICBwcm9ic19bMF0gPSB1bmlmb3JtX3Byb2I7CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgYmFja29mZnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgYmFja29mZnNfLnB1c2hfYmFjayhiYWNrb2Zmc1tpXSk7CisgICAgICB9CisgICAgfQorCisgICAgfkNhbGxiYWNrKCkgeworICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGJhY2tvZmZzXy5zaXplKCk7ICsraSkgeworICAgICAgICBpZihwcnVuZV92b2NhYl8gfHwgcHJ1bmVfdGhyZXNob2xkc19baSArIDFdID4gMCkKKyAgICAgICAgICB3aGlsZShiYWNrb2Zmc19baV0pCisgICAgICAgICAgICArK2JhY2tvZmZzX1tpXTsKKworICAgICAgICBpZiAoYmFja29mZnNfW2ldKSB7CisgICAgICAgICAgc3RkOjpjZXJyIDw8ICJCYWNrb2ZmcyBkbyBub3QgbWF0Y2ggZm9yIG9yZGVyICIgPDwgKGkgKyAxKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHZvaWQgRW50ZXIodW5zaWduZWQgb3JkZXJfbWludXNfMSwgdm9pZCAqZGF0YSkgeworICAgICAgTkdyYW08QnVpbGRpbmdQYXlsb2FkPiBncmFtKGRhdGEsIG9yZGVyX21pbnVzXzEgKyAxKTsKKyAgICAgIEJ1aWxkaW5nUGF5bG9hZCAmcGF5ID0gZ3JhbS5WYWx1ZSgpOworICAgICAgcGF5LmNvbXBsZXRlLnByb2IgPSBwYXkudW5pbnRlcnAucHJvYiArIHBheS51bmludGVycC5nYW1tYSAqIHByb2JzX1tvcmRlcl9taW51c18xXTsKKyAgICAgIHByb2JzX1tvcmRlcl9taW51c18xICsgMV0gPSBwYXkuY29tcGxldGUucHJvYjsKKworICAgICAgZmxvYXQgb3V0X2JhY2tvZmY7CisgICAgICBpZiAob3JkZXJfbWludXNfMSA8IGJhY2tvZmZzXy5zaXplKCkgJiYgKihncmFtLmVuZCgpIC0gMSkgIT0gc3BlY2lhbHNfLlVOSygpICYmICooZ3JhbS5lbmQoKSAtIDEpICE9IHNwZWNpYWxzXy5FT1MoKSAmJiBiYWNrb2Zmc19bb3JkZXJfbWludXNfMV0pIHsKKyAgICAgICAgaWYocHJ1bmVfdm9jYWJfIHx8IHBydW5lX3RocmVzaG9sZHNfW29yZGVyX21pbnVzXzEgKyAxXSA+IDApIHsKKyAgICAgICAgICAvL0NvbXB1dGUgaGFzaCB2YWx1ZSBmb3IgY3VycmVudCBjb250ZXh0CisgICAgICAgICAgdWludDY0X3QgY3VycmVudF9oYXNoID0gdXRpbDo6TXVybXVySGFzaE5hdGl2ZShncmFtLmJlZ2luKCksIGdyYW0uT3JkZXIoKSAqIHNpemVvZihXb3JkSW5kZXgpKTsKKworICAgICAgICAgIGNvbnN0IEhhc2hHYW1tYSAqaGFzaGVkX2JhY2tvZmYgPSBzdGF0aWNfY2FzdDxjb25zdCBIYXNoR2FtbWEqPihiYWNrb2Zmc19bb3JkZXJfbWludXNfMV0uR2V0KCkpOworICAgICAgICAgIHdoaWxlKGN1cnJlbnRfaGFzaCAhPSBoYXNoZWRfYmFja29mZi0+aGFzaF92YWx1ZSAmJiArK2JhY2tvZmZzX1tvcmRlcl9taW51c18xXSkKKyAgICAgICAgICAgIGhhc2hlZF9iYWNrb2ZmID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFzaEdhbW1hKj4oYmFja29mZnNfW29yZGVyX21pbnVzXzFdLkdldCgpKTsKKworICAgICAgICAgIGlmKGN1cnJlbnRfaGFzaCA9PSBoYXNoZWRfYmFja29mZi0+aGFzaF92YWx1ZSkgeworICAgICAgICAgICAgb3V0X2JhY2tvZmYgPSBoYXNoZWRfYmFja29mZi0+Z2FtbWE7CisgICAgICAgICAgICArK2JhY2tvZmZzX1tvcmRlcl9taW51c18xXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSGFzIGJlZW4gcHJ1bmVkIGF3YXkgc28gaXQgaXMgbm90IGEgY29udGV4dCBhbnltb3JlCisgICAgICAgICAgICBvdXRfYmFja29mZiA9IDEuMDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0X2JhY2tvZmYgPSAqc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQqPihiYWNrb2Zmc19bb3JkZXJfbWludXNfMV0uR2V0KCkpOworICAgICAgICAgICsrYmFja29mZnNfW29yZGVyX21pbnVzXzFdOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBOb3QgYSBjb250ZXh0LgorICAgICAgICBvdXRfYmFja29mZiA9IDEuMDsKKyAgICAgIH0KKworICAgICAgb3V0cHV0Xy5HcmFtKG9yZGVyX21pbnVzXzEsIG91dF9iYWNrb2ZmLCBwYXkuY29tcGxldGUpOworICAgIH0KKworICAgIHZvaWQgRXhpdCh1bnNpZ25lZCwgdm9pZCAqKSBjb25zdCB7fQorCisgIHByaXZhdGU6CisgICAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OlN0cmVhbT4gYmFja29mZnNfOworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHByb2JzXzsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4mIHBydW5lX3RocmVzaG9sZHNfOworICAgIGJvb2wgcHJ1bmVfdm9jYWJfOworCisgICAgT3V0cHV0IG91dHB1dF87CisgICAgY29uc3QgU3BlY2lhbFZvY2FiIHNwZWNpYWxzXzsKK307Cit9IC8vIG5hbWVzcGFjZQorCitJbnRlcnBvbGF0ZTo6SW50ZXJwb2xhdGUodWludDY0X3Qgdm9jYWJfc2l6ZSwgY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyAmYmFja29mZnMsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiYgcHJ1bmVfdGhyZXNob2xkcywgYm9vbCBwcnVuZV92b2NhYiwgYm9vbCBvdXRwdXRfcSwgY29uc3QgU3BlY2lhbFZvY2FiICZzcGVjaWFscykKKyAgOiB1bmlmb3JtX3Byb2JfKDEuMCAvIHN0YXRpY19jYXN0PGZsb2F0Pih2b2NhYl9zaXplKSksIC8vIEluY2x1ZGVzIDx1bms+IGJ1dCBleGNsdWRlcyA8cz4uCisgICAgYmFja29mZnNfKGJhY2tvZmZzKSwKKyAgICBwcnVuZV90aHJlc2hvbGRzXyhwcnVuZV90aHJlc2hvbGRzKSwKKyAgICBwcnVuZV92b2NhYl8ocHJ1bmVfdm9jYWIpLAorICAgIG91dHB1dF9xXyhvdXRwdXRfcSksCisgICAgc3BlY2lhbHNfKHNwZWNpYWxzKSB7fQorCisvLyBwZXJmb3JtIG9yZGVyLXdpc2UgaW50ZXJwb2xhdGlvbgordm9pZCBJbnRlcnBvbGF0ZTo6UnVuKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJnBvc2l0aW9ucykgeworICBhc3NlcnQocG9zaXRpb25zLnNpemUoKSA9PSBiYWNrb2Zmc18uc2l6ZSgpICsgMSk7CisgIGlmIChvdXRwdXRfcV8pIHsKKyAgICB0eXBlZGVmIENhbGxiYWNrPE91dHB1dFE+IEM7CisgICAgQyBjYWxsYmFjayh1bmlmb3JtX3Byb2JfLCBiYWNrb2Zmc18sIHBydW5lX3RocmVzaG9sZHNfLCBwcnVuZV92b2NhYl8sIHNwZWNpYWxzXyk7CisgICAgSm9pbnRPcmRlcjxDLCBTdWZmaXhPcmRlcj4ocG9zaXRpb25zLCBjYWxsYmFjayk7CisgIH0gZWxzZSB7CisgICAgdHlwZWRlZiBDYWxsYmFjazxPdXRwdXRQcm9iQmFja29mZj4gQzsKKyAgICBDIGNhbGxiYWNrKHVuaWZvcm1fcHJvYl8sIGJhY2tvZmZzXywgcHJ1bmVfdGhyZXNob2xkc18sIHBydW5lX3ZvY2FiXywgc3BlY2lhbHNfKTsKKyAgICBKb2ludE9yZGVyPEMsIFN1ZmZpeE9yZGVyPihwb3NpdGlvbnMsIGNhbGxiYWNrKTsKKyAgfQorfQorCit9fSAvLyBuYW1lc3BhY2VzCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYnVpbGRlci9pbnRlcnBvbGF0ZS5oaCBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL2ludGVycG9sYXRlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMGNkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vYnVpbGRlci9pbnRlcnBvbGF0ZS5oaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIExNX0JVSUxERVJfSU5URVJQT0xBVEVfSAorI2RlZmluZSBMTV9CVUlMREVSX0lOVEVSUE9MQVRFX0gKKworI2luY2x1ZGUgImxtL2NvbW1vbi9zcGVjaWFsLmhoIgorI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vbXVsdGlfc3RyZWFtLmhoIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBidWlsZGVyIHsKKworLyogSW50ZXJwb2xhdGUgc3RlcC4KKyAqIElucHV0OiBzdWZmaXggc29ydGVkIG4tZ3JhbXMgd2l0aCAocF91bmludGVycG9sYXRlZCwgZ2FtbWEpIGZyb20KKyAqIEluaXRpYWxQcm9iYWJpbGl0aWVzLgorICogT3V0cHV0OiBzdWZmaXggc29ydGVkIG4tZ3JhbXMgd2l0aCBjb21wbGV0ZSBwcm9iYWJpbGl0eQorICovCitjbGFzcyBJbnRlcnBvbGF0ZSB7CisgIHB1YmxpYzoKKyAgICAvLyBOb3JtYWxseSB2b2NhYl9zaXplIGlzIHRoZSB1bmlncmFtIGNvdW50LTEgKHNpbmNlIHAoPHM+KSA9IDApIGJ1dCBtaWdodAorICAgIC8vIGJlIGxhcmdlciB3aGVuIHRoZSB1c2VyIHNwZWNpZmllcyBhIGNvbnNpc3RlbnQgdm9jYWJ1bGFyeSBzaXplLgorICAgIGV4cGxpY2l0IEludGVycG9sYXRlKHVpbnQ2NF90IHZvY2FiX3NpemUsIGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJmJhY2tvZmZzLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJnBydW5lX3RocmVzaG9sZHMsIGJvb2wgcHJ1bmVfdm9jYWIsIGJvb2wgb3V0cHV0X3EsIGNvbnN0IFNwZWNpYWxWb2NhYiAmc3BlY2lhbHMpOworCisgICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyAmcG9zaXRpb25zKTsKKworICBwcml2YXRlOgorICAgIGZsb2F0IHVuaWZvcm1fcHJvYl87CisgICAgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyBiYWNrb2Zmc187CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IHBydW5lX3RocmVzaG9sZHNfOworICAgIGJvb2wgcHJ1bmVfdm9jYWJfOworICAgIGJvb2wgb3V0cHV0X3FfOworICAgIGNvbnN0IFNwZWNpYWxWb2NhYiBzcGVjaWFsc187Cit9OworCit9fSAvLyBuYW1lc3BhY2VzCisjZW5kaWYgLy8gTE1fQlVJTERFUl9JTlRFUlBPTEFURV9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYnVpbGRlci9sbXBsel9tYWluLmNjIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvbG1wbHpfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzNmMzgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvbG1wbHpfbWFpbi5jYwpAQCAtMCwwICsxLDIyMCBAQAorI2luY2x1ZGUgImxtL2J1aWxkZXIvb3V0cHV0LmhoIgorI2luY2x1ZGUgImxtL2J1aWxkZXIvcGlwZWxpbmUuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL3NpemVfb3B0aW9uLmhoIgorI2luY2x1ZGUgImxtL2xtX2V4Y2VwdGlvbi5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisjaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgorI2luY2x1ZGUgInV0aWwvdXNhZ2UuaGgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgeworCisvLyBQYXJzZSBhbmQgdmFsaWRhdGUgcHJ1bmluZyB0aHJlc2hvbGRzIHRoZW4gcmV0dXJuIHZlY3RvciBvZiB0aHJlc2hvbGQgY291bnRzCisvLyBmb3IgZWFjaCBuLWdyYW1zIG9yZGVyLgorc3RkOjp2ZWN0b3I8dWludDY0X3Q+IFBhcnNlUHJ1bmluZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBhcmFtLCBzdGQ6OnNpemVfdCBvcmRlcikgeworICAvLyBjb252ZXJ0IHRvIHZlY3RvciBvZiBpbnRlZ2VycworICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gcHJ1bmVfdGhyZXNob2xkczsKKyAgcHJ1bmVfdGhyZXNob2xkcy5yZXNlcnZlKG9yZGVyKTsKKyAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0KHBhcmFtLmJlZ2luKCkpOyBpdCAhPSBwYXJhbS5lbmQoKTsgKytpdCkgeworICAgIHRyeSB7CisgICAgICBwcnVuZV90aHJlc2hvbGRzLnB1c2hfYmFjayhib29zdDo6bGV4aWNhbF9jYXN0PHVpbnQ2NF90PigqaXQpKTsKKyAgICB9IGNhdGNoKGNvbnN0IGJvb3N0OjpiYWRfbGV4aWNhbF9jYXN0ICYpIHsKKyAgICAgIFVUSUxfVEhST1codXRpbDo6RXhjZXB0aW9uLCAiQmFkIHBydW5pbmcgdGhyZXNob2xkICIgPDwgKml0KTsKKyAgICB9CisgIH0KKworICAvLyBGaWxsIHdpdGggemVyb3MgYnkgZGVmYXVsdC4KKyAgaWYgKHBydW5lX3RocmVzaG9sZHMuZW1wdHkoKSkgeworICAgIHBydW5lX3RocmVzaG9sZHMucmVzaXplKG9yZGVyLCAwKTsKKyAgICByZXR1cm4gcHJ1bmVfdGhyZXNob2xkczsKKyAgfQorCisgIC8vIHZhbGlkYXRlIHBydW5pbmcgdGhyZXNob2xkIGlmIHNwZWNpZmllZAorICAvLyB0aHJvdyBpZiBlYWNoIG4tZ3JhbSBvcmRlciBoYXMgbm90ICB0aHJlc2hvbGQgc3BlY2lmaWVkCisgIFVUSUxfVEhST1dfSUYocHJ1bmVfdGhyZXNob2xkcy5zaXplKCkgPiBvcmRlciwgdXRpbDo6RXhjZXB0aW9uLCAiWW91IHNwZWNpZmllZCBwcnVuaW5nIHRocmVzaG9sZHMgZm9yIG9yZGVycyAxIHRocm91Z2ggIiA8PCBwcnVuZV90aHJlc2hvbGRzLnNpemUoKSA8PCAiIGJ1dCB0aGUgbW9kZWwgb25seSBoYXMgb3JkZXIgIiA8PCBvcmRlcik7CisgIC8vIHRocmVzaG9sZCBmb3IgdW5pZ3JhbSBjYW4gb25seSBiZSAwIChubyBwcnVuaW5nKQorCisgIC8vIGNoZWNrIGlmIHRocmVzaG9sZCBhcmUgbm90IGluIGRlY3JlYXNpbmcgb3JkZXIKKyAgdWludDY0X3QgbG93ZXJfdGhyZXNob2xkID0gMDsKKyAgZm9yIChzdGQ6OnZlY3Rvcjx1aW50NjRfdD46Oml0ZXJhdG9yIGl0ID0gcHJ1bmVfdGhyZXNob2xkcy5iZWdpbigpOyBpdCAhPSBwcnVuZV90aHJlc2hvbGRzLmVuZCgpOyArK2l0KSB7CisgICAgVVRJTF9USFJPV19JRihsb3dlcl90aHJlc2hvbGQgPiAqaXQsIHV0aWw6OkV4Y2VwdGlvbiwgIlBydW5pbmcgdGhyZXNob2xkcyBzaG91bGQgYmUgaW4gbm9uLWRlY3JlYXNpbmcgb3JkZXIuICBPdGhlcndpc2Ugc3Vic3RyaW5ncyB3b3VsZCBiZSByZW1vdmVkLCB3aGljaCBpcyBiYWQgZm9yIHF1ZXJ5LXRpbWUgZGF0YSBzdHJ1Y3R1cmVzLiIpOworICAgIGxvd2VyX3RocmVzaG9sZCA9ICppdDsKKyAgfQorCisgIC8vIFBhZCB0byBhbGwgb3JkZXJzIHVzaW5nIHRoZSBsYXN0IHZhbHVlLgorICBwcnVuZV90aHJlc2hvbGRzLnJlc2l6ZShvcmRlciwgcHJ1bmVfdGhyZXNob2xkcy5iYWNrKCkpOworICByZXR1cm4gcHJ1bmVfdGhyZXNob2xkczsKK30KKworbG06OmJ1aWxkZXI6OkRpc2NvdW50IFBhcnNlRGlzY291bnRGYWxsYmFjayhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBhcmFtKSB7CisgIGxtOjpidWlsZGVyOjpEaXNjb3VudCByZXQ7CisgIFVUSUxfVEhST1dfSUYocGFyYW0uc2l6ZSgpID4gMywgdXRpbDo6RXhjZXB0aW9uLCAiU3BlY2lmeSBhdCBtb3N0IHRocmVlIGZhbGxiYWNrIGRpc2NvdW50czogMSwgMiwgYW5kIDMrIik7CisgIFVUSUxfVEhST1dfSUYocGFyYW0uZW1wdHkoKSwgdXRpbDo6RXhjZXB0aW9uLCAiRmFsbGJhY2sgZGlzY291bnRpbmcgZW5hYmxlZCwgYnV0IG5vIGRpc2NvdW50IHNwZWNpZmllZCIpOworICByZXQuYW1vdW50WzBdID0gMC4wOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgZmxvYXQgZGlzY291bnQgPSBib29zdDo6bGV4aWNhbF9jYXN0PGZsb2F0PihwYXJhbVtpIDwgcGFyYW0uc2l6ZSgpID8gaSA6IChwYXJhbS5zaXplKCkgLSAxKV0pOworICAgIFVUSUxfVEhST1dfSUYoZGlzY291bnQgPCAwLjAgfHwgZGlzY291bnQgPiBzdGF0aWNfY2FzdDxmbG9hdD4oaSsxKSwgdXRpbDo6RXhjZXB0aW9uLCAiVGhlIGRpc2NvdW50IGZvciBjb3VudCAiIDw8IChpKzEpIDw8ICIgd2FzIHBhcnNlZCBhcyAiIDw8IGRpc2NvdW50IDw8ICIgd2hpY2ggaXMgbm90IGluIHRoZSByYW5nZSBbMCwgIiA8PCAoaSsxKSA8PCAiXS4iKTsKKyAgICByZXQuYW1vdW50W2kgKyAxXSA9IGRpc2NvdW50OworICB9CisgIHJldHVybiByZXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgdHJ5IHsKKyAgICBuYW1lc3BhY2UgcG8gPSBib29zdDo6cHJvZ3JhbV9vcHRpb25zOworICAgIHBvOjpvcHRpb25zX2Rlc2NyaXB0aW9uIG9wdGlvbnMoIkxhbmd1YWdlIG1vZGVsIGJ1aWxkaW5nIG9wdGlvbnMiKTsKKyAgICBsbTo6YnVpbGRlcjo6UGlwZWxpbmVDb25maWcgcGlwZWxpbmU7CisKKyAgICBzdGQ6OnN0cmluZyB0ZXh0LCBpbnRlcm1lZGlhdGUsIGFycGE7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBydW5pbmc7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRpc2NvdW50X2ZhbGxiYWNrOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkaXNjb3VudF9mYWxsYmFja19kZWZhdWx0OworICAgIGRpc2NvdW50X2ZhbGxiYWNrX2RlZmF1bHQucHVzaF9iYWNrKCIwLjUiKTsKKyAgICBkaXNjb3VudF9mYWxsYmFja19kZWZhdWx0LnB1c2hfYmFjaygiMSIpOworICAgIGRpc2NvdW50X2ZhbGxiYWNrX2RlZmF1bHQucHVzaF9iYWNrKCIxLjUiKTsKKyAgICBib29sIHZlcmJvc2VfaGVhZGVyOworCisgICAgb3B0aW9ucy5hZGRfb3B0aW9ucygpCisgICAgICAoImhlbHAsaCIsIHBvOjpib29sX3N3aXRjaCgpLCAiU2hvdyB0aGlzIGhlbHAgbWVzc2FnZSIpCisgICAgICAoIm9yZGVyLG8iLCBwbzo6dmFsdWU8c3RkOjpzaXplX3Q+KCZwaXBlbGluZS5vcmRlcikKKyNpZiBCT09TVF9WRVJTSU9OID49IDEwNDIwMAorICAgICAgICAgLT5yZXF1aXJlZCgpCisjZW5kaWYKKyAgICAgICAgICwgIk9yZGVyIG9mIHRoZSBtb2RlbCIpCisgICAgICAoImludGVycG9sYXRlX3VuaWdyYW1zIiwgcG86OnZhbHVlPGJvb2w+KCZwaXBlbGluZS5pbml0aWFsX3Byb2JzLmludGVycG9sYXRlX3VuaWdyYW1zKS0+ZGVmYXVsdF92YWx1ZSh0cnVlKS0+aW1wbGljaXRfdmFsdWUodHJ1ZSksICJJbnRlcnBvbGF0ZSB0aGUgdW5pZ3JhbXMgKGRlZmF1bHQpIGFzIG9wcG9zZWQgdG8gZ2l2aW5nIGxvdHMgb2YgbWFzcyB0byA8dW5rPiBsaWtlIFNSSS4gIElmIHlvdSB3YW50IFNSSSdzIGJlaGF2aW9yIHdpdGggYSBsYXJnZSA8dW5rPiBhbmQgdGhlIG9sZCBsbXBseiBkZWZhdWx0LCB1c2UgLS1pbnRlcnBvbGF0ZV91bmlncmFtcyAwLiIpCisgICAgICAoInNraXBfc3ltYm9scyIsIHBvOjpib29sX3N3aXRjaCgpLCAiVHJlYXQgPHM+LCA8L3M+LCBhbmQgPHVuaz4gYXMgd2hpdGVzcGFjZSBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbiIpCisgICAgICAoInRlbXBfcHJlZml4LFQiLCBwbzo6dmFsdWU8c3RkOjpzdHJpbmc+KCZwaXBlbGluZS5zb3J0LnRlbXBfcHJlZml4KS0+ZGVmYXVsdF92YWx1ZSgiL3RtcC9sbSIpLCAiVGVtcG9yYXJ5IGZpbGUgcHJlZml4IikKKyAgICAgICgibWVtb3J5LFMiLCBsbTo6IFNpemVPcHRpb24ocGlwZWxpbmUuc29ydC50b3RhbF9tZW1vcnksIHV0aWw6Okd1ZXNzUGh5c2ljYWxNZW1vcnkoKSA/ICI4MCUiIDogIjFHIiksICJTb3J0aW5nIG1lbW9yeSIpCisgICAgICAoIm1pbmltdW1fYmxvY2siLCBsbTo6U2l6ZU9wdGlvbihwaXBlbGluZS5taW5pbXVtX2Jsb2NrLCAiOEsiKSwgIk1pbmltdW0gYmxvY2sgc2l6ZSB0byBhbGxvdyIpCisgICAgICAoInNvcnRfYmxvY2siLCBsbTo6U2l6ZU9wdGlvbihwaXBlbGluZS5zb3J0LmJ1ZmZlcl9zaXplLCAiNjRNIiksICJTaXplIG9mIElPIG9wZXJhdGlvbnMgZm9yIHNvcnQgKGRldGVybWluZXMgYXJpdHkpIikKKyAgICAgICgiYmxvY2tfY291bnQiLCBwbzo6dmFsdWU8c3RkOjpzaXplX3Q+KCZwaXBlbGluZS5ibG9ja19jb3VudCktPmRlZmF1bHRfdmFsdWUoMiksICJCbG9jayBjb3VudCAocGVyIG9yZGVyKSIpCisgICAgICAoInZvY2FiX2VzdGltYXRlIiwgcG86OnZhbHVlPGxtOjpXb3JkSW5kZXg+KCZwaXBlbGluZS52b2NhYl9lc3RpbWF0ZSktPmRlZmF1bHRfdmFsdWUoMTAwMDAwMCksICJBc3N1bWUgdGhpcyB2b2NhYnVsYXJ5IHNpemUgZm9yIHB1cnBvc2VzIG9mIGNhbGN1bGF0aW5nIG1lbW9yeSBpbiBzdGVwIDEgKGNvcnB1cyBjb3VudCkgYW5kIHByZS1zaXppbmcgdGhlIGhhc2ggdGFibGUiKQorICAgICAgKCJ2b2NhYl9wYWQiLCBwbzo6dmFsdWU8dWludDY0X3Q+KCZwaXBlbGluZS52b2NhYl9zaXplX2Zvcl91bmspLT5kZWZhdWx0X3ZhbHVlKDApLCAiSWYgdGhlIHZvY2FidWxhcnkgaXMgc21hbGxlciB0aGFuIHRoaXMgdmFsdWUsIHBhZCB3aXRoIDx1bms+IHRvIHJlYWNoIHRoaXMgc2l6ZS4gUmVxdWlyZXMgLS1pbnRlcnBvbGF0ZV91bmlncmFtcyIpCisgICAgICAoInZlcmJvc2VfaGVhZGVyIiwgcG86OmJvb2xfc3dpdGNoKCZ2ZXJib3NlX2hlYWRlciksICJBZGQgYSB2ZXJib3NlIGhlYWRlciB0byB0aGUgQVJQQSBmaWxlIHRoYXQgaW5jbHVkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyB0b2tlbiBjb3VudCwgc21vb3RoaW5nIHR5cGUsIGV0Yy4iKQorICAgICAgKCJ0ZXh0IiwgcG86OnZhbHVlPHN0ZDo6c3RyaW5nPigmdGV4dCksICJSZWFkIHRleHQgZnJvbSBhIGZpbGUgaW5zdGVhZCBvZiBzdGRpbiIpCisgICAgICAoImFycGEiLCBwbzo6dmFsdWU8c3RkOjpzdHJpbmc+KCZhcnBhKSwgIldyaXRlIEFSUEEgdG8gYSBmaWxlIGluc3RlYWQgb2Ygc3Rkb3V0IikKKyAgICAgICgiaW50ZXJtZWRpYXRlIiwgcG86OnZhbHVlPHN0ZDo6c3RyaW5nPigmaW50ZXJtZWRpYXRlKSwgIldyaXRlIG5ncmFtcyB0byBpbnRlcm1lZGlhdGUgZmlsZXMuICBUdXJucyBvZmYgQVJQQSBvdXRwdXQgKHdoaWNoIGNhbiBiZSByZWFjdGl2YXRlZCBieSAtLWFycGEgZmlsZSkuICBGb3JjZXMgLS1yZW51bWJlciBvbi4iKQorICAgICAgKCJyZW51bWJlciIsIHBvOjpib29sX3N3aXRjaCgmcGlwZWxpbmUucmVudW1iZXJfdm9jYWJ1bGFyeSksICJScmVudW1iZXIgdGhlIHZvY2FidWxhcnkgaWRlbnRpZmllcnMgc28gdGhhdCB0aGV5IGFyZSBtb25vdG9uZSB3aXRoIHRoZSBoYXNoIG9mIGVhY2ggc3RyaW5nLiAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIG9yZGVyaW5nIHVzZWQgYnkgdGhlIHRyaWUgZGF0YSBzdHJ1Y3R1cmUuIikKKyAgICAgICgiY29sbGFwc2VfdmFsdWVzIiwgcG86OmJvb2xfc3dpdGNoKCZwaXBlbGluZS5vdXRwdXRfcSksICJDb2xsYXBzZSBwcm9iYWJpbGl0eSBhbmQgYmFja29mZiBpbnRvIGEgc2luZ2xlIHZhbHVlLCBxIHRoYXQgeWllbGRzIHRoZSBzYW1lIHNlbnRlbmNlLWxldmVsIHByb2JhYmlsaXRpZXMuICBTZWUgaHR0cDovL2toZWFmaWVsZC5jb20vcHJvZmVzc2lvbmFsL2VkaW5idXJnaC9yZXN0X3BhcGVyLnBkZiBmb3IgbW9yZSBkZXRhaWxzLCBpbmNsdWRpbmcgYSBwcm9vZi4iKQorICAgICAgKCJwcnVuZSIsIHBvOjp2YWx1ZTxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPigmcHJ1bmluZyktPm11bHRpdG9rZW4oKSwgIlBydW5lIG4tZ3JhbXMgd2l0aCBjb3VudCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIHRocmVzaG9sZC4gIFNwZWNpZnkgb25lIHZhbHVlIGZvciBlYWNoIG9yZGVyIGkuZS4gMCAwIDEgdG8gcHJ1bmUgc2luZ2xldG9uIHRyaWdyYW1zIGFuZCBhYm92ZS4gIFRoZSBzZXF1ZW5jZSBvZiB2YWx1ZXMgbXVzdCBiZSBub24tZGVjcmVhc2luZyBhbmQgdGhlIGxhc3QgdmFsdWUgYXBwbGllcyB0byBhbnkgcmVtYWluaW5nIG9yZGVycy4gRGVmYXVsdCBpcyB0byBub3QgcHJ1bmUsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gLS1wcnVuZSAwLiIpCisgICAgICAoImxpbWl0X3ZvY2FiX2ZpbGUiLCBwbzo6dmFsdWU8c3RkOjpzdHJpbmc+KCZwaXBlbGluZS5wcnVuZV92b2NhYl9maWxlKS0+ZGVmYXVsdF92YWx1ZSgiIiksICJSZWFkIGFsbG93ZWQgdm9jYWJ1bGFyeSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gTi1ncmFtcyB0aGF0IGNvbnRhaW4gdm9jYWJ1bGFyeSBpdGVtcyBub3QgaW4gdGhpcyBsaXN0IHdpbGwgYmUgcHJ1bmVkLiBDYW4gYmUgY29tYmluZWQgd2l0aCAtLXBydW5lIGFyZyIpCisgICAgICAoImRpc2NvdW50X2ZhbGxiYWNrIiwgcG86OnZhbHVlPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+KCZkaXNjb3VudF9mYWxsYmFjayktPm11bHRpdG9rZW4oKS0+aW1wbGljaXRfdmFsdWUoZGlzY291bnRfZmFsbGJhY2tfZGVmYXVsdCwgIjAuNSAxIDEuNSIpLCAiVGhlIGNsb3NlZC1mb3JtIGVzdGltYXRlIGZvciBLbmVzZXItTmV5IGRpc2NvdW50cyBkb2VzIG5vdCB3b3JrIHdpdGhvdXQgc2luZ2xldG9ucyBvciBkb3VibGV0b25zLiAgSXQgY2FuIGFsc28gZmFpbCBpZiB0aGVzZSB2YWx1ZXMgYXJlIG91dCBvZiByYW5nZS4gIFRoaXMgb3B0aW9uIGZhbGxzIGJhY2sgdG8gdXNlci1zcGVjaWZpZWQgZGlzY291bnRzIHdoZW4gdGhlIGNsb3NlZC1mb3JtIGVzdGltYXRlIGZhaWxzLiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGlzIGdlbmVyYWxseSBhIGJhZCBpZGVhOiB5b3Ugc2hvdWxkIGRlZHVwbGljYXRlIHlvdXIgY29ycHVzIGluc3RlYWQuICBIb3dldmVyLCBjbGFzcy1iYXNlZCBtb2RlbHMgbmVlZCBjdXN0b20gZGlzY291bnRzIGJlY2F1c2UgdGhleSBsYWNrIHNpbmdsZXRvbiB1bmlncmFtcy4gIFByb3ZpZGUgdXAgdG8gdGhyZWUgZGlzY291bnRzIChmb3IgYWRqdXN0ZWQgY291bnRzIDEsIDIsIGFuZCAzKyksIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgb3JkZXJzIHdoZXJlIHRoZSBjbG9zZWQtZm9ybSBlc3RpbWF0ZXMgZmFpbC4iKTsKKyAgICBwbzo6dmFyaWFibGVzX21hcCB2bTsKKyAgICBwbzo6c3RvcmUocG86OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBvcHRpb25zKSwgdm0pOworCisgICAgaWYgKGFyZ2MgPT0gMSB8fCB2bVsiaGVscCJdLmFzPGJvb2w+KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PAorICAgICAgICAiQnVpbGRzIHVucHJ1bmVkIGxhbmd1YWdlIG1vZGVscyB3aXRoIG1vZGlmaWVkIEtuZXNlci1OZXkgc21vb3RoaW5nLlxuXG4iCisgICAgICAgICJQbGVhc2UgY2l0ZTpcbiIKKyAgICAgICAgIkBpbnByb2NlZWRpbmdze0hlYWZpZWxkLWVzdGltYXRlLFxuIgorICAgICAgICAiICBhdXRob3IgPSB7S2VubmV0aCBIZWFmaWVsZCBhbmQgSXZhbiBQb3V6eXJldnNreSBhbmQgSm9uYXRoYW4gSC4gQ2xhcmsgYW5kIFBoaWxpcHAgS29laG59LFxuIgorICAgICAgICAiICB0aXRsZSA9IHtTY2FsYWJsZSBNb2RpZmllZCB7S25lc2VyLU5leX0gTGFuZ3VhZ2UgTW9kZWwgRXN0aW1hdGlvbn0sXG4iCisgICAgICAgICIgIHllYXIgPSB7MjAxM30sXG4iCisgICAgICAgICIgIG1vbnRoID0gezh9LFxuIgorICAgICAgICAiICBib29rdGl0bGUgPSB7UHJvY2VlZGluZ3Mgb2YgdGhlIDUxc3QgQW5udWFsIE1lZXRpbmcgb2YgdGhlIEFzc29jaWF0aW9uIGZvciBDb21wdXRhdGlvbmFsIExpbmd1aXN0aWNzfSxcbiIKKyAgICAgICAgIiAgYWRkcmVzcyA9IHtTb2ZpYSwgQnVsZ2FyaWF9LFxuIgorICAgICAgICAiICB1cmwgPSB7aHR0cDovL2toZWFmaWVsZC5jb20vcHJvZmVzc2lvbmFsL2VkaW5idXJnaC9lc3RpbWF0ZVxcX3BhcGVyLnBkZn0sXG4iCisgICAgICAgICJ9XG5cbiIKKyAgICAgICAgIlByb3ZpZGUgdGhlIGNvcnB1cyBvbiBzdGRpbi4gIFRoZSBBUlBBIGZpbGUgd2lsbCBiZSB3cml0dGVuIHRvIHN0ZG91dC4gIE9yZGVyIG9mXG4iCisgICAgICAgICJ0aGUgbW9kZWwgKC1vKSBpcyB0aGUgb25seSBtYW5kYXRvcnkgb3B0aW9uLiAgQXMgdGhpcyBpcyBhbiBvbi1kaXNrIHByb2dyYW0sXG4iCisgICAgICAgICJzZXR0aW5nIHRoZSB0ZW1wb3JhcnkgZmlsZSBsb2NhdGlvbiAoLVQpIGFuZCBzb3J0aW5nIG1lbW9yeSAoLVMpIGlzIHJlY29tbWVuZGVkLlxuXG4iCisgICAgICAgICJNZW1vcnkgc2l6ZXMgYXJlIHNwZWNpZmllZCBsaWtlIEdOVSBzb3J0OiBhIG51bWJlciBmb2xsb3dlZCBieSBhIHVuaXQgY2hhcmFjdGVyLlxuIgorICAgICAgICAiVmFsaWQgdW5pdHMgYXJlIFwlIGZvciBwZXJjZW50YWdlIG9mIG1lbW9yeSAoc3VwcG9ydGVkIHBsYXRmb3JtcyBvbmx5KSBhbmQgKGluXG4iCisgICAgICAgICJpbmNyZWFzaW5nIHBvd2VycyBvZiAxMDI0KTogYiwgSywgTSwgRywgVCwgUCwgRSwgWiwgWS4gIERlZmF1bHQgaXMgSyAoKjEwMjQpLlxuIjsKKyAgICAgIHVpbnQ2NF90IG1lbSA9IHV0aWw6Okd1ZXNzUGh5c2ljYWxNZW1vcnkoKTsKKyAgICAgIGlmIChtZW0pIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJUaGlzIG1hY2hpbmUgaGFzICIgPDwgbWVtIDw8ICIgYnl0ZXMgb2YgbWVtb3J5LlxuXG4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgbWVtb3J5IG9uIHRoaXMgbWFjaGluZS5cblxuIjsKKyAgICAgIH0KKyAgICAgIHN0ZDo6Y2VyciA8PCBvcHRpb25zIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHBvOjpub3RpZnkodm0pOworCisgICAgLy8gcmVxdWlyZWQoKSBhcHBlYXJlZCBpbiBCb29zdCAxLjQyLjAuCisjaWYgQk9PU1RfVkVSU0lPTiA8IDEwNDIwMAorICAgIGlmICghdm0uY291bnQoIm9yZGVyIikpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAidGhlIG9wdGlvbiAnLS1vcmRlcicgaXMgcmVxdWlyZWQgYnV0IG1pc3NpbmciIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHBpcGVsaW5lLnZvY2FiX3NpemVfZm9yX3VuayAmJiAhcGlwZWxpbmUuaW5pdGlhbF9wcm9icy5pbnRlcnBvbGF0ZV91bmlncmFtcykgeworICAgICAgc3RkOjpjZXJyIDw8ICItLXZvY2FiX3BhZCByZXF1aXJlcyAtLWludGVycG9sYXRlX3VuaWdyYW1zIGJlIG9uIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAodm1bInNraXBfc3ltYm9scyJdLmFzPGJvb2w+KCkpIHsKKyAgICAgIHBpcGVsaW5lLmRpc2FsbG93ZWRfc3ltYm9sX2FjdGlvbiA9IGxtOjpDT01QTEFJTjsKKyAgICB9IGVsc2UgeworICAgICAgcGlwZWxpbmUuZGlzYWxsb3dlZF9zeW1ib2xfYWN0aW9uID0gbG06OlRIUk9XX1VQOworICAgIH0KKworICAgIGlmICh2bS5jb3VudCgiZGlzY291bnRfZmFsbGJhY2siKSkgeworICAgICAgcGlwZWxpbmUuZGlzY291bnQuZmFsbGJhY2sgPSBQYXJzZURpc2NvdW50RmFsbGJhY2soZGlzY291bnRfZmFsbGJhY2spOworICAgICAgcGlwZWxpbmUuZGlzY291bnQuYmFkX2FjdGlvbiA9IGxtOjpDT01QTEFJTjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVW51c2VkLCBqdXN0IGhlcmUgdG8gcHJldmVudCB0aGUgY29tcGlsZXIgZnJvbSBjb21wbGFpbmluZyBhYm91dCB1bmluaXRpYWxpemVkLgorICAgICAgcGlwZWxpbmUuZGlzY291bnQuZmFsbGJhY2sgPSBsbTo6YnVpbGRlcjo6RGlzY291bnQoKTsKKyAgICAgIHBpcGVsaW5lLmRpc2NvdW50LmJhZF9hY3Rpb24gPSBsbTo6VEhST1dfVVA7CisgICAgfQorCisgICAgLy8gcGFyc2UgcHJ1bmluZyB0aHJlc2hvbGRzLiAgVGhlc2UgZGVwZW5kIG9uIG9yZGVyLCBzbyBpdCBpcyBub3QgZG9uZSBhcyBhIG5vdGlmaWVyLgorICAgIHBpcGVsaW5lLnBydW5lX3RocmVzaG9sZHMgPSBQYXJzZVBydW5pbmcocHJ1bmluZywgcGlwZWxpbmUub3JkZXIpOworCisgICAgaWYgKCF2bVsibGltaXRfdm9jYWJfZmlsZSJdLmFzPHN0ZDo6c3RyaW5nPigpLmVtcHR5KCkpIHsKKyAgICAgIHBpcGVsaW5lLnBydW5lX3ZvY2FiID0gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBwaXBlbGluZS5wcnVuZV92b2NhYiA9IGZhbHNlOworICAgIH0KKworICAgIHV0aWw6Ok5vcm1hbGl6ZVRlbXBQcmVmaXgocGlwZWxpbmUuc29ydC50ZW1wX3ByZWZpeCk7CisKKyAgICBsbTo6YnVpbGRlcjo6SW5pdGlhbFByb2JhYmlsaXRpZXNDb25maWcgJmluaXRpYWwgPSBwaXBlbGluZS5pbml0aWFsX3Byb2JzOworICAgIC8vIFRPRE86IGV2YWx1YXRlIG9wdGlvbnMgZm9yIHRoZXNlLgorICAgIGluaXRpYWwuYWRkZXJfaW4udG90YWxfbWVtb3J5ID0gMzI3Njg7CisgICAgaW5pdGlhbC5hZGRlcl9pbi5ibG9ja19jb3VudCA9IDI7CisgICAgaW5pdGlhbC5hZGRlcl9vdXQudG90YWxfbWVtb3J5ID0gMzI3Njg7CisgICAgaW5pdGlhbC5hZGRlcl9vdXQuYmxvY2tfY291bnQgPSAyOworICAgIHBpcGVsaW5lLnJlYWRfYmFja29mZnMgPSBpbml0aWFsLmFkZGVyX291dDsKKworICAgIC8vIFJlYWQgZnJvbSBzdGRpbiwgd3JpdGUgdG8gc3Rkb3V0IGJ5IGRlZmF1bHQKKyAgICB1dGlsOjpzY29wZWRfZmQgaW4oMCksIG91dCgxKTsKKyAgICBpZiAodm0uY291bnQoInRleHQiKSkgeworICAgICAgaW4ucmVzZXQodXRpbDo6T3BlblJlYWRPclRocm93KHRleHQuY19zdHIoKSkpOworICAgIH0KKyAgICBpZiAodm0uY291bnQoImFycGEiKSkgeworICAgICAgb3V0LnJlc2V0KHV0aWw6OkNyZWF0ZU9yVGhyb3coYXJwYS5jX3N0cigpKSk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGJvb2wgd3JpdGluZ19pbnRlcm1lZGlhdGUgPSB2bS5jb3VudCgiaW50ZXJtZWRpYXRlIik7CisgICAgICBpZiAod3JpdGluZ19pbnRlcm1lZGlhdGUpIHsKKyAgICAgICAgcGlwZWxpbmUucmVudW1iZXJfdm9jYWJ1bGFyeSA9IHRydWU7CisgICAgICB9CisgICAgICBsbTo6YnVpbGRlcjo6T3V0cHV0IG91dHB1dCh3cml0aW5nX2ludGVybWVkaWF0ZSA/IGludGVybWVkaWF0ZSA6IHBpcGVsaW5lLnNvcnQudGVtcF9wcmVmaXgsIHdyaXRpbmdfaW50ZXJtZWRpYXRlLCBwaXBlbGluZS5vdXRwdXRfcSk7CisgICAgICBpZiAoIXdyaXRpbmdfaW50ZXJtZWRpYXRlIHx8IHZtLmNvdW50KCJhcnBhIikpIHsKKyAgICAgICAgb3V0cHV0LkFkZChuZXcgbG06OmJ1aWxkZXI6OlByaW50SG9vayhvdXQucmVsZWFzZSgpLCB2ZXJib3NlX2hlYWRlcikpOworICAgICAgfQorICAgICAgbG06OmJ1aWxkZXI6OlBpcGVsaW5lKHBpcGVsaW5lLCBpbi5yZWxlYXNlKCksIG91dHB1dCk7CisgICAgfSBjYXRjaCAoY29uc3QgdXRpbDo6TWFsbG9jRXhjZXB0aW9uICZlKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjZXJyIDw8ICJUcnkgcmVydW5uaW5nIHdpdGggYSBtb3JlIGNvbnNlcnZhdGl2ZSAtUyBzZXR0aW5nIHRoYW4gIiA8PCB2bVsibWVtb3J5Il0uYXM8c3RkOjpzdHJpbmc+KCkgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHV0aWw6OlByaW50VXNhZ2Uoc3RkOjpjZXJyKTsKKyAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24gJmUpIHsKKyAgICBzdGQ6OmNlcnIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAxOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYnVpbGRlci9vdXRwdXQuY2MgYi9zcmMva2VubG0vbG0vYnVpbGRlci9vdXRwdXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0ZmEyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL291dHB1dC5jYwpAQCAtMCwwICsxLDUyIEBACisjaW5jbHVkZSAibG0vYnVpbGRlci9vdXRwdXQuaGgiCisKKyNpbmNsdWRlICJsbS9jb21tb24vbW9kZWxfYnVmZmVyLmhoIgorI2luY2x1ZGUgImxtL2NvbW1vbi9wcmludC5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfc3RyZWFtLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL211bHRpX3N0cmVhbS5oaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7CisKK091dHB1dEhvb2s6On5PdXRwdXRIb29rKCkge30KKworT3V0cHV0OjpPdXRwdXQoU3RyaW5nUGllY2UgZmlsZV9iYXNlLCBib29sIGtlZXBfYnVmZmVyLCBib29sIG91dHB1dF9xKQorICA6IGJ1ZmZlcl8oZmlsZV9iYXNlLCBrZWVwX2J1ZmZlciwgb3V0cHV0X3EpIHt9CisKK3ZvaWQgT3V0cHV0OjpTaW5rUHJvYnModXRpbDo6c3RyZWFtOjpDaGFpbnMgJmNoYWlucykgeworICBBcHBseShQUk9CX1BBUkFMTEVMX0hPT0ssIGNoYWlucyk7CisgIGlmICghYnVmZmVyXy5LZWVwKCkgJiYgIUhhdmUoUFJPQl9TRVFVRU5USUFMX0hPT0spKSB7CisgICAgY2hhaW5zID4+IHV0aWw6OnN0cmVhbTo6a1JlY3ljbGU7CisgICAgY2hhaW5zLldhaXQodHJ1ZSk7CisgICAgcmV0dXJuOworICB9CisgIGJ1ZmZlcl8uU2luayhjaGFpbnMsIGhlYWRlcl8uY291bnRzX3BydW5lZCk7CisgIGNoYWlucyA+PiB1dGlsOjpzdHJlYW06OmtSZWN5Y2xlOworICBjaGFpbnMuV2FpdChmYWxzZSk7CisgIGlmIChIYXZlKFBST0JfU0VRVUVOVElBTF9IT09LKSkgeworICAgIHN0ZDo6Y2VyciA8PCAiPT09IDUvNSBXcml0aW5nIEFSUEEgbW9kZWwgPT09IiA8PCBzdGQ6OmVuZGw7CisgICAgYnVmZmVyXy5Tb3VyY2UoY2hhaW5zKTsKKyAgICBBcHBseShQUk9CX1NFUVVFTlRJQUxfSE9PSywgY2hhaW5zKTsKKyAgICBjaGFpbnMgPj4gdXRpbDo6c3RyZWFtOjprUmVjeWNsZTsKKyAgICBjaGFpbnMuV2FpdCh0cnVlKTsKKyAgfQorfQorCit2b2lkIE91dHB1dDo6QXBwbHkoSG9va1R5cGUgaG9va190eXBlLCB1dGlsOjpzdHJlYW06OkNoYWlucyAmY2hhaW5zKSB7CisgIGZvciAoYm9vc3Q6OnB0cl92ZWN0b3I8T3V0cHV0SG9vaz46Oml0ZXJhdG9yIGVudHJ5ID0gb3V0cHV0c19baG9va190eXBlXS5iZWdpbigpOyBlbnRyeSAhPSBvdXRwdXRzX1tob29rX3R5cGVdLmVuZCgpOyArK2VudHJ5KSB7CisgICAgZW50cnktPlNpbmsoaGVhZGVyXywgVm9jYWJGaWxlKCksIGNoYWlucyk7CisgIH0KK30KKwordm9pZCBQcmludEhvb2s6OlNpbmsoY29uc3QgSGVhZGVySW5mbyAmaW5mbywgaW50IHZvY2FiX2ZpbGUsIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZjaGFpbnMpIHsKKyAgaWYgKHZlcmJvc2VfaGVhZGVyXykgeworICAgIHV0aWw6OkZpbGVTdHJlYW0gb3V0KGZpbGVfLmdldCgpLCA1MCk7CisgICAgb3V0IDw8ICIjIElucHV0IGZpbGU6ICIgPDwgaW5mby5pbnB1dF9maWxlIDw8ICdcbic7CisgICAgb3V0IDw8ICIjIFRva2VuIGNvdW50OiAiIDw8IGluZm8udG9rZW5fY291bnQgPDwgJ1xuJzsKKyAgICBvdXQgPDwgIiMgU21vb3RoaW5nOiBNb2RpZmllZCBLbmVzZXItTmV5IiA8PCAnXG4nOworICB9CisgIGNoYWlucyA+PiBQcmludEFSUEEodm9jYWJfZmlsZSwgZmlsZV8uZ2V0KCksIGluZm8uY291bnRzX3BydW5lZCk7Cit9CisKK319IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9idWlsZGVyL291dHB1dC5oaCBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL291dHB1dC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQ2YzZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2J1aWxkZXIvb3V0cHV0LmhoCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgTE1fQlVJTERFUl9PVVRQVVRfSAorI2RlZmluZSBMTV9CVUlMREVSX09VVFBVVF9ICisKKyNpbmNsdWRlICJsbS9idWlsZGVyL2hlYWRlcl9pbmZvLmhoIgorI2luY2x1ZGUgImxtL2NvbW1vbi9tb2RlbF9idWZmZXIuaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorCisjaW5jbHVkZSA8Ym9vc3QvcHRyX2NvbnRhaW5lci9wdHJfdmVjdG9yLmhwcD4KKyNpbmNsdWRlIDxib29zdC91dGlsaXR5LmhwcD4KKworbmFtZXNwYWNlIHV0aWwgeyBuYW1lc3BhY2Ugc3RyZWFtIHsgY2xhc3MgQ2hhaW5zOyBjbGFzcyBDaGFpblBvc2l0aW9uczsgfSB9CisKKy8qIE91dHB1dHMgZnJvbSBsbXBsejogQVJQQSwgc2hhcmRlZCBmaWxlcywgZXRjICovCituYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgYnVpbGRlciB7CisKKy8vIFRoZXNlIGFyZSBkaWZmZXJlbnQgdHlwZXMgb2YgaG9va3MuICBWYWx1ZXMgc2hvdWxkIGJlIGNvbnNlY3V0aXZlIHRvIGVuYWJsZSBhIHZlY3RvciBsb29rdXAuCitlbnVtIEhvb2tUeXBlIHsKKyAgLy8gVE9ETzogY291bnRzLgorICBQUk9CX1BBUkFMTEVMX0hPT0ssIC8vIFByb2JhYmlsaXR5IGFuZCBiYWNrb2ZmIChvciBqdXN0IHEpLiAgT3V0cHV0IG11c3QgcHJvY2VzcyB0aGUgb3JkZXJzIGluIHBhcmFsbGVsIG9yIHRoZXJlIHdpbGwgYmUgYSBkZWFkbG9jay4KKyAgUFJPQl9TRVFVRU5USUFMX0hPT0ssIC8vIFByb2JhYmlsaXR5IGFuZCBiYWNrb2ZmIChvciBqdXN0IHEpLiAgT3V0cHV0IGNhbiBwcm9jZXNzIG9yZGVycyBhbnkgd2F5IGl0IGxpa2VzLiAgVGhpcyByZXF1aXJlcyB3cml0aW5nIHRoZSBkYXRhIHRvIGRpc2sgdGhlbiByZWFkaW5nLiAgVXNlZnVsIGZvciBBUlBBIGZpbGVzLCB3aGljaCBwdXQgdW5pZ3JhbXMgZmlyc3QgZXRjLgorICBOVU1CRVJfT0ZfSE9PS1MgLy8gS2VlcCB0aGlzIGxhc3Qgc28gd2Uga25vdyBob3cgbWFueSB2YWx1ZXMgdGhlcmUgYXJlLgorfTsKKworY2xhc3MgT3V0cHV0SG9vayB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBPdXRwdXRIb29rKEhvb2tUeXBlIGhvb2tfdHlwZSkgOiB0eXBlXyhob29rX3R5cGUpIHt9CisKKyAgICB2aXJ0dWFsIH5PdXRwdXRIb29rKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgU2luayhjb25zdCBIZWFkZXJJbmZvICZpbmZvLCBpbnQgdm9jYWJfZmlsZSwgdXRpbDo6c3RyZWFtOjpDaGFpbnMgJmNoYWlucykgPSAwOworCisgICAgSG9va1R5cGUgVHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgcHJpdmF0ZToKKyAgICBIb29rVHlwZSB0eXBlXzsKK307CisKK2NsYXNzIE91dHB1dCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIHB1YmxpYzoKKyAgICBPdXRwdXQoU3RyaW5nUGllY2UgZmlsZV9iYXNlLCBib29sIGtlZXBfYnVmZmVyLCBib29sIG91dHB1dF9xKTsKKworICAgIC8vIFRha2VzIG93bmVyc2hpcC4KKyAgICB2b2lkIEFkZChPdXRwdXRIb29rICpob29rKSB7CisgICAgICBvdXRwdXRzX1tob29rLT5UeXBlKCldLnB1c2hfYmFjayhob29rKTsKKyAgICB9CisKKyAgICBib29sIEhhdmUoSG9va1R5cGUgaG9va190eXBlKSBjb25zdCB7CisgICAgICByZXR1cm4gIW91dHB1dHNfW2hvb2tfdHlwZV0uZW1wdHkoKTsKKyAgICB9CisKKyAgICBpbnQgVm9jYWJGaWxlKCkgY29uc3QgeyByZXR1cm4gYnVmZmVyXy5Wb2NhYkZpbGUoKTsgfQorCisgICAgdm9pZCBTZXRIZWFkZXIoY29uc3QgSGVhZGVySW5mbyAmaGVhZGVyKSB7IGhlYWRlcl8gPSBoZWFkZXI7IH0KKyAgICBjb25zdCBIZWFkZXJJbmZvICZHZXRIZWFkZXIoKSBjb25zdCB7IHJldHVybiBoZWFkZXJfOyB9CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCBieSB0aGUgcGlwZWxpbmUuCisgICAgdm9pZCBTaW5rUHJvYnModXRpbDo6c3RyZWFtOjpDaGFpbnMgJmNoYWlucyk7CisKKyAgICB1bnNpZ25lZCBpbnQgU3RlcHMoKSBjb25zdCB7IHJldHVybiBIYXZlKFBST0JfU0VRVUVOVElBTF9IT09LKTsgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBBcHBseShIb29rVHlwZSBob29rX3R5cGUsIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZjaGFpbnMpOworCisgICAgTW9kZWxCdWZmZXIgYnVmZmVyXzsKKworICAgIGJvb3N0OjpwdHJfdmVjdG9yPE91dHB1dEhvb2s+IG91dHB1dHNfW05VTUJFUl9PRl9IT09LU107CisgICAgSGVhZGVySW5mbyBoZWFkZXJfOworfTsKKworY2xhc3MgUHJpbnRIb29rIDogcHVibGljIE91dHB1dEhvb2sgeworICBwdWJsaWM6CisgICAgLy8gVGFrZXMgb3duZXJzaGlwCisgICAgUHJpbnRIb29rKGludCB3cml0ZV9mZCwgYm9vbCB2ZXJib3NlX2hlYWRlcikKKyAgICAgIDogT3V0cHV0SG9vayhQUk9CX1NFUVVFTlRJQUxfSE9PSyksIGZpbGVfKHdyaXRlX2ZkKSwgdmVyYm9zZV9oZWFkZXJfKHZlcmJvc2VfaGVhZGVyKSB7fQorCisgICAgdm9pZCBTaW5rKGNvbnN0IEhlYWRlckluZm8gJmluZm8sIGludCB2b2NhYl9maWxlLCB1dGlsOjpzdHJlYW06OkNoYWlucyAmY2hhaW5zKTsKKworICBwcml2YXRlOgorICAgIHV0aWw6OnNjb3BlZF9mZCBmaWxlXzsKKyAgICBib29sIHZlcmJvc2VfaGVhZGVyXzsKK307CisKK319IC8vIG5hbWVzcGFjZXMKKworI2VuZGlmIC8vIExNX0JVSUxERVJfT1VUUFVUX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9idWlsZGVyL3BheWxvYWQuaGggYi9zcmMva2VubG0vbG0vYnVpbGRlci9wYXlsb2FkLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMTI3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vYnVpbGRlci9wYXlsb2FkLmhoCkBAIC0wLDAgKzEsNDggQEAKKyNpZm5kZWYgTE1fQlVJTERFUl9QQVlMT0FEX0gKKyNkZWZpbmUgTE1fQlVJTERFUl9QQVlMT0FEX0gKKworI2luY2x1ZGUgImxtL3dlaWdodHMuaGgiCisjaW5jbHVkZSAibG0vd29yZF9pbmRleC5oaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGJ1aWxkZXIgeworCitzdHJ1Y3QgVW5pbnRlcnBvbGF0ZWQgeworICBmbG9hdCBwcm9iOyAgLy8gVW5pbnRlcnBvbGF0ZWQgcHJvYmFiaWxpdHkuCisgIGZsb2F0IGdhbW1hOyAvLyBJbnRlcnBvbGF0aW9uIHdlaWdodCBmb3IgbG93ZXIgb3JkZXIuCit9OworCit1bmlvbiBCdWlsZGluZ1BheWxvYWQgeworICB1aW50NjRfdCBjb3VudDsKKyAgVW5pbnRlcnBvbGF0ZWQgdW5pbnRlcnA7CisgIFByb2JCYWNrb2ZmIGNvbXBsZXRlOworCisgIC8qbWpkKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgYm9vbCBJc01hcmtlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY291bnQgPj4gKHNpemVvZihjb3VudCkgKiA4IC0gMSk7CisgIH0KKworICB2b2lkIE1hcmsoKSB7CisgICAgY291bnQgfD0gKDF1bCA8PCAoc2l6ZW9mKGNvdW50KSAqIDggLSAxKSk7CisgIH0KKworICB2b2lkIFVubWFyaygpIHsKKyAgICBjb3VudCAmPSB+KDF1bCA8PCAoc2l6ZW9mKGNvdW50KSAqIDggLSAxKSk7CisgIH0KKworICB1aW50NjRfdCBVbm1hcmtlZENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBjb3VudCAmIH4oMXVsIDw8IChzaXplb2YoY291bnQpICogOCAtIDEpKTsKKyAgfQorCisgIHVpbnQ2NF90IEN1dG9mZkNvdW50KCkgY29uc3QgeworICAgIHJldHVybiBJc01hcmtlZCgpID8gMCA6IFVubWFya2VkQ291bnQoKTsKKyAgfQorICAvKm1qZCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit9OworCitjb25zdCBXb3JkSW5kZXgga0JPUyA9IDE7Citjb25zdCBXb3JkSW5kZXgga0VPUyA9IDI7CisKK319IC8vIG5hbWVzcGFjZXMKKworI2VuZGlmIC8vIExNX0JVSUxERVJfUEFZTE9BRF9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYnVpbGRlci9waXBlbGluZS5jYyBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL3BpcGVsaW5lLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZTMwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vYnVpbGRlci9waXBlbGluZS5jYwpAQCAtMCwwICsxLDM4NSBAQAorI2luY2x1ZGUgImxtL2J1aWxkZXIvcGlwZWxpbmUuaGgiCisKKyNpbmNsdWRlICJsbS9idWlsZGVyL2FkanVzdF9jb3VudHMuaGgiCisjaW5jbHVkZSAibG0vYnVpbGRlci9jb21iaW5lX2NvdW50cy5oaCIKKyNpbmNsdWRlICJsbS9idWlsZGVyL2NvcnB1c19jb3VudC5oaCIKKyNpbmNsdWRlICJsbS9idWlsZGVyL2hhc2hfZ2FtbWEuaGgiCisjaW5jbHVkZSAibG0vYnVpbGRlci9pbml0aWFsX3Byb2JhYmlsaXRpZXMuaGgiCisjaW5jbHVkZSAibG0vYnVpbGRlci9pbnRlcnBvbGF0ZS5oaCIKKyNpbmNsdWRlICJsbS9idWlsZGVyL291dHB1dC5oaCIKKyNpbmNsdWRlICJsbS9jb21tb24vY29tcGFyZS5oaCIKKyNpbmNsdWRlICJsbS9jb21tb24vcmVudW1iZXIuaGgiCisKKyNpbmNsdWRlICJsbS9zaXplcy5oaCIKKyNpbmNsdWRlICJsbS92b2NhYi5oaCIKKworI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9pby5oaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGJ1aWxkZXIgeworCit1c2luZyB1dGlsOjpzdHJlYW06OlNvcnRzOworCituYW1lc3BhY2UgeworCit2b2lkIFByaW50U3RhdGlzdGljcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHNfcHJ1bmVkLCBjb25zdCBzdGQ6OnZlY3RvcjxEaXNjb3VudD4gJmRpc2NvdW50cykgeworICBzdGQ6OmNlcnIgPDwgIlN0YXRpc3RpY3M6XG4iOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50cy5zaXplKCk7ICsraSkgeworICAgIHN0ZDo6Y2VyciA8PCAoaSArIDEpIDw8ICcgJyA8PCBjb3VudHNfcHJ1bmVkW2ldOworICAgIGlmKGNvdW50c1tpXSAhPSBjb3VudHNfcHJ1bmVkW2ldKQorICAgICAgIHN0ZDo6Y2VyciA8PCAiLyIgPDwgY291bnRzW2ldOworCisgICAgZm9yIChzaXplX3QgZCA9IDE7IGQgPD0gMzsgKytkKQorICAgICAgc3RkOjpjZXJyIDw8ICIgRCIgPDwgZCA8PCAoZCA9PSAzID8gIis9IiA6ICI9IikgPDwgZGlzY291bnRzW2ldLmFtb3VudFtkXTsKKyAgICBzdGQ6OmNlcnIgPDwgJ1xuJzsKKyAgfQorfQorCitjbGFzcyBNYXN0ZXIgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgTWFzdGVyKFBpcGVsaW5lQ29uZmlnICZjb25maWcsIHVuc2lnbmVkIG91dHB1dF9zdGVwcykKKyAgICAgIDogY29uZmlnXyhjb25maWcpLCBjaGFpbnNfKGNvbmZpZy5vcmRlciksIHVuaWdyYW1zXyh1dGlsOjpNYWtlVGVtcChjb25maWdfLlRlbXBQcmVmaXgoKSkpLCBzdGVwc18ob3V0cHV0X3N0ZXBzICsgNCkgeworICAgICAgY29uZmlnXy5taW5pbXVtX2Jsb2NrID0gc3RkOjptYXgoTkdyYW08QnVpbGRpbmdQYXlsb2FkPjo6VG90YWxTaXplKGNvbmZpZ18ub3JkZXIpLCBjb25maWdfLm1pbmltdW1fYmxvY2spOworICAgIH0KKworICAgIGNvbnN0IFBpcGVsaW5lQ29uZmlnICZDb25maWcoKSBjb25zdCB7IHJldHVybiBjb25maWdfOyB9CisKKyAgICB1dGlsOjpzdHJlYW06OkNoYWlucyAmTXV0YWJsZUNoYWlucygpIHsgcmV0dXJuIGNoYWluc187IH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBNYXN0ZXIgJm9wZXJhdG9yPj4oY29uc3QgVCAmd29ya2VyKSB7CisgICAgICBjaGFpbnNfID4+IHdvcmtlcjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBUaGlzIHRha2VzIHRoZSAocGFydGlhbGx5KSBzb3J0ZWQgbmdyYW1zIGFuZCBzZXRzIHVwIGZvciBhZGp1c3RlZCBjb3VudHMuCisgICAgdm9pZCBJbml0Rm9yQWRqdXN0KHV0aWw6OnN0cmVhbTo6U29ydDxTdWZmaXhPcmRlciwgQ29tYmluZUNvdW50cz4gJm5ncmFtcywgV29yZEluZGV4IHR5cGVzLCBzdGQ6OnNpemVfdCBzdWJ0cmFjdF9mb3JfbnVtYmVyaW5nKSB7CisgICAgICBjb25zdCBzdGQ6OnNpemVfdCBlYWNoX29yZGVyX21pbiA9IGNvbmZpZ18ubWluaW11bV9ibG9jayAqIGNvbmZpZ18uYmxvY2tfY291bnQ7CisgICAgICAvLyBXZSBrbm93IGhvdyBtYW55IHVuaWdyYW1zIHRoZXJlIGFyZS4gIERvbid0IGFsbG9jYXRlIG1vcmUgdGhhbiBuZWVkZWQgdG8gdGhlbS4KKyAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IG1pbl9jaGFpbnMgPSAoY29uZmlnXy5vcmRlciAtIDEpICogZWFjaF9vcmRlcl9taW4gKworICAgICAgICBzdGQ6Om1pbih0eXBlcyAqIE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD46OlRvdGFsU2l6ZSgxKSwgZWFjaF9vcmRlcl9taW4pOworICAgICAgLy8gUHJldmVudCBvdmVyZmxvdyBpbiBzdWJ0cmFjdGluZy4KKyAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IHRvdGFsID0gc3RkOjptYXg8c3RkOjpzaXplX3Q+KGNvbmZpZ18uVG90YWxNZW1vcnkoKSwgbWluX2NoYWlucyArIHN1YnRyYWN0X2Zvcl9udW1iZXJpbmcgKyBjb25maWdfLm1pbmltdW1fYmxvY2spOworICAgICAgLy8gRG8gbWVyZ2Ugc29ydCB3aXRoIGNhbGN1bGF0ZWQgbGF6aW5lc3MuCisgICAgICBjb25zdCBzdGQ6OnNpemVfdCBtZXJnZV91c2luZyA9IG5ncmFtcy5NZXJnZShzdGQ6Om1pbih0b3RhbCAtIG1pbl9jaGFpbnMgLSBzdWJ0cmFjdF9mb3JfbnVtYmVyaW5nLCBuZ3JhbXMuRGVmYXVsdExhenkoKSkpOworCisgICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRfYm91bmRzKDEsIHR5cGVzKTsKKyAgICAgIENyZWF0ZUNoYWlucyh0b3RhbCAtIG1lcmdlX3VzaW5nIC0gc3VidHJhY3RfZm9yX251bWJlcmluZywgY291bnRfYm91bmRzKTsKKyAgICAgIG5ncmFtcy5PdXRwdXQoY2hhaW5zXy5iYWNrKCksIG1lcmdlX3VzaW5nKTsKKyAgICB9CisKKyAgICAvLyBGb3IgaW5pdGlhbCBwcm9iYWJpbGl0aWVzLCBidXQgdGhpcyBpcyBnZW5lcmljLgorICAgIHZvaWQgU29ydEFuZFJlYWRUd2ljZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgU29ydHM8Q29udGV4dE9yZGVyPiAmc29ydHMsIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZzZWNvbmQsIHV0aWw6OnN0cmVhbTo6Q2hhaW5Db25maWcgc2Vjb25kX2NvbmZpZykgeworICAgICAgYm9vbCB1bmlncmFtc19hcmVfc29ydGVkID0gIWNvbmZpZ18ucmVudW1iZXJfdm9jYWJ1bGFyeTsKKyAgICAgIC8vIERvIG1lcmdlIGZpcnN0IGJlZm9yZSBhbGxvY2F0aW5nIGNoYWluIG1lbW9yeS4KKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBjb25maWdfLm9yZGVyIC0gdW5pZ3JhbXNfYXJlX3NvcnRlZDsgKytpKSB7CisgICAgICAgIHNvcnRzW2ldLk1lcmdlKDApOworICAgICAgfQorICAgICAgLy8gVGhlcmUncyBubyBsYXp5IG1lcmdlLCBzbyBqdXN0IGRpdmlkZSBtZW1vcnkgYW1vbmdzdCB0aGUgY2hhaW5zLgorICAgICAgQ3JlYXRlQ2hhaW5zKGNvbmZpZ18uVG90YWxNZW1vcnkoKSwgY291bnRzKTsKKyAgICAgIGNoYWluc18uYmFjaygpLkFjdGl2YXRlUHJvZ3Jlc3MoKTsKKyAgICAgIGlmICh1bmlncmFtc19hcmVfc29ydGVkKSB7CisgICAgICAgIGNoYWluc19bMF0gPj4gdW5pZ3JhbXNfLlNvdXJjZSgpOworICAgICAgICBzZWNvbmRfY29uZmlnLmVudHJ5X3NpemUgPSBOR3JhbTxCdWlsZGluZ1BheWxvYWQ+OjpUb3RhbFNpemUoMSk7CisgICAgICAgIHNlY29uZC5wdXNoX2JhY2soc2Vjb25kX2NvbmZpZyk7CisgICAgICAgIHNlY29uZC5iYWNrKCkgPj4gdW5pZ3JhbXNfLlNvdXJjZSgpOworICAgICAgfQorICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gdW5pZ3JhbXNfYXJlX3NvcnRlZDsgaSA8IGNvbmZpZ18ub3JkZXI7ICsraSkgeworICAgICAgICB1dGlsOjpzY29wZWRfZmQgZmQoc29ydHNbaSAtIHVuaWdyYW1zX2FyZV9zb3J0ZWRdLlN0ZWFsQ29tcGxldGVkKCkpOworICAgICAgICBjaGFpbnNfW2ldLlNldFByb2dyZXNzVGFyZ2V0KHV0aWw6OlNpemVPclRocm93KGZkLmdldCgpKSk7CisgICAgICAgIGNoYWluc19baV0gPj4gdXRpbDo6c3RyZWFtOjpQUmVhZCh1dGlsOjpEdXBPclRocm93KGZkLmdldCgpKSwgdHJ1ZSk7CisgICAgICAgIHNlY29uZF9jb25maWcuZW50cnlfc2l6ZSA9IE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD46OlRvdGFsU2l6ZShpICsgMSk7CisgICAgICAgIHNlY29uZC5wdXNoX2JhY2soc2Vjb25kX2NvbmZpZyk7CisgICAgICAgIHNlY29uZC5iYWNrKCkgPj4gdXRpbDo6c3RyZWFtOjpQUmVhZChmZC5yZWxlYXNlKCksIHRydWUpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZXJlIGlzIG5vIHNvcnQgYWZ0ZXIgdGhpcywgc28gZ28gZm9yIGJyb2tlIG9uIGxhenkgbWVyZ2luZy4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ29tcGFyZT4gdm9pZCBNYXhpbXVtTGF6eUlucHV0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzLCBTb3J0czxDb21wYXJlPiAmc29ydHMpIHsKKyAgICAgIC8vIERldGVybWluZSB0aGUgbWluaW11bSB3ZSBjYW4gdXNlIGZvciBhbGwgdGhlIGNoYWlucy4KKyAgICAgIHN0ZDo6c2l6ZV90IG1pbl9jaGFpbnMgPSAwOworICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGNvbmZpZ18ub3JkZXI7ICsraSkgeworICAgICAgICBtaW5fY2hhaW5zICs9IHN0ZDo6bWluKGNvdW50c1tpXSAqIE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD46OlRvdGFsU2l6ZShpICsgMSksIHN0YXRpY19jYXN0PHVpbnQ2NF90Pihjb25maWdfLm1pbmltdW1fYmxvY2spKTsKKyAgICAgIH0KKyAgICAgIHN0ZDo6c2l6ZV90IGZvcl9tZXJnZSA9IG1pbl9jaGFpbnMgPiBjb25maWdfLlRvdGFsTWVtb3J5KCkgPyAwIDogKGNvbmZpZ18uVG90YWxNZW1vcnkoKSAtIG1pbl9jaGFpbnMpOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IGxhemluZXNzOworICAgICAgLy8gUHJpb3JpdGl6ZSBsb25nZXIgbi1ncmFtcy4KKyAgICAgIGZvciAodXRpbDo6c3RyZWFtOjpTb3J0PFN1ZmZpeE9yZGVyPiAqaSA9IHNvcnRzLmVuZCgpIC0gMTsgaSA+PSBzb3J0cy5iZWdpbigpOyAtLWkpIHsKKyAgICAgICAgbGF6aW5lc3MucHVzaF9iYWNrKGktPk1lcmdlKGZvcl9tZXJnZSkpOworICAgICAgICBhc3NlcnQoZm9yX21lcmdlID49IGxhemluZXNzLmJhY2soKSk7CisgICAgICAgIGZvcl9tZXJnZSAtPSBsYXppbmVzcy5iYWNrKCk7CisgICAgICB9CisgICAgICBzdGQ6OnJldmVyc2UobGF6aW5lc3MuYmVnaW4oKSwgbGF6aW5lc3MuZW5kKCkpOworCisgICAgICBDcmVhdGVDaGFpbnMoZm9yX21lcmdlICsgbWluX2NoYWlucywgY291bnRzKTsKKyAgICAgIGNoYWluc18uYmFjaygpLkFjdGl2YXRlUHJvZ3Jlc3MoKTsKKyAgICAgIGNoYWluc19bMF0gPj4gdW5pZ3JhbXNfLlNvdXJjZSgpOworICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMTsgaSA8IGNvbmZpZ18ub3JkZXI7ICsraSkgeworICAgICAgICBzb3J0c1tpIC0gMV0uT3V0cHV0KGNoYWluc19baV0sIGxhemluZXNzW2kgLSAxXSk7CisgICAgICB9CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+IHZvaWQgU2V0dXBTb3J0cyhTb3J0czxDb21wYXJlPiAmc29ydHMsIGJvb2wgZXhjbHVkZV91bmlncmFtcykgeworICAgICAgc29ydHMuSW5pdChjb25maWdfLm9yZGVyIC0gZXhjbHVkZV91bmlncmFtcyk7CisgICAgICAvLyBVbmlncmFtcyBkb24ndCBnZXQgc29ydGVkIGJlY2F1c2UgdGhlaXIgb3JkZXIgaXMgYWx3YXlzIHRoZSBzYW1lLgorICAgICAgaWYgKGV4Y2x1ZGVfdW5pZ3JhbXMpIGNoYWluc19bMF0gPj4gdW5pZ3JhbXNfLlNpbmsoKTsKKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IGV4Y2x1ZGVfdW5pZ3JhbXM7IGkgPCBjb25maWdfLm9yZGVyOyArK2kpIHsKKyAgICAgICAgc29ydHMucHVzaF9iYWNrKGNoYWluc19baV0sIGNvbmZpZ18uc29ydCwgQ29tcGFyZShpICsgMSkpOworICAgICAgfQorICAgICAgY2hhaW5zXy5XYWl0KHRydWUpOworICAgIH0KKworICAgIHVuc2lnbmVkIGludCBTdGVwcygpIGNvbnN0IHsgcmV0dXJuIHN0ZXBzXzsgfQorCisgIHByaXZhdGU6CisgICAgLy8gQ3JlYXRlIGNoYWlucywgYWxsb2NhdGluZyBtZW1vcnkgdG8gdGhlbS4gIFRvdGFsbHkgaGV1cmlzdGljLiAgQ291bnQKKyAgICAvLyBib3VuZHMgYXJlIHVwcGVyIGJvdW5kcyBvbiB0aGUgY291bnRzIG9yIG5vdCBwcmVzZW50LgorICAgIHZvaWQgQ3JlYXRlQ2hhaW5zKHN0ZDo6c2l6ZV90IHJlbWFpbmluZ19tZW0sIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRfYm91bmRzKSB7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gYXNzaWdubWVudHM7CisgICAgICBhc3NpZ25tZW50cy5yZXNlcnZlKGNvbmZpZ18ub3JkZXIpOworICAgICAgLy8gU3RhcnQgYnkgYXNzaWduaW5nIG1heGltdW0gbWVtb3J5IHVzYWdlICh0byBiZSByZWZpbmVkIGxhdGVyKS4KKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBjb3VudF9ib3VuZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgYXNzaWdubWVudHMucHVzaF9iYWNrKHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzdGQ6Om1pbigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZW1haW5pbmdfbWVtKSwKKyAgICAgICAgICAgIGNvdW50X2JvdW5kc1tpXSAqIHN0YXRpY19jYXN0PHVpbnQ2NF90PihOR3JhbTxCdWlsZGluZ1BheWxvYWQ+OjpUb3RhbFNpemUoaSArIDEpKSkpKTsKKyAgICAgIH0KKyAgICAgIGFzc2lnbm1lbnRzLnJlc2l6ZShjb25maWdfLm9yZGVyLCByZW1haW5pbmdfbWVtKTsKKworICAgICAgLy8gTm93IHdlIGtub3cgaG93IG11Y2ggbWVtb3J5IGV2ZXJ5Ym9keSB3YW50cy4gIEhvdyBtdWNoIHdpbGwgdGhleSBnZXQ/CisgICAgICAvLyBQcm9wb3J0aW9uYWwgdG8gdGhpcy4KKyAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBwb3J0aW9uczsKKyAgICAgIC8vIEluZGljZXMgb2Ygb3JkZXJzIHRoYXQgaGF2ZSB5ZXQgdG8gYmUgYXNzaWduZWQuCisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gdW5hc3NpZ25lZDsKKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBjb25maWdfLm9yZGVyOyArK2kpIHsKKyAgICAgICAgcG9ydGlvbnMucHVzaF9iYWNrKHN0YXRpY19jYXN0PGZsb2F0PigoaSsxKSAqIE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD46OlRvdGFsU2l6ZShpKzEpKSk7CisgICAgICAgIHVuYXNzaWduZWQucHVzaF9iYWNrKGkpOworICAgICAgfQorICAgICAgLypJZiBzb21lYm9keSBkb2Vzbid0IGVhdCB0aGVpciBmdWxsIGRpbm5lciwgZ2l2ZSBpdCB0byB0aGUgcmVzdCBvZiB0aGUKKyAgICAgICAqIGZhbWlseS4gIFRoZW4gc29tZWJvZHkgZWxzZSBtaWdodCBub3QgZWF0IHRoZWlyIGZ1bGwgZGlubmVyIGV0Yy4gIEVuZHMKKyAgICAgICAqIHdoZW4gZXZlcnlib2R5IHVuYXNzaWduZWQgaXMgaHVuZ3J5LgorICAgICAgICovCisgICAgICBmbG9hdCBzdW07CisgICAgICBib29sIGZvdW5kX21vcmU7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gYmxvY2tfY291bnQoY29uZmlnXy5vcmRlcik7CisgICAgICBkbyB7CisgICAgICAgIHN1bSA9IDAuMDsKKyAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHVuYXNzaWduZWQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICBzdW0gKz0gcG9ydGlvbnNbdW5hc3NpZ25lZFtpXV07CisgICAgICAgIH0KKyAgICAgICAgZm91bmRfbW9yZSA9IGZhbHNlOworICAgICAgICAvLyBJZiB0aGUgcHJvcG9ydGlvbmFsIGFzc2lnbm1lbnQgaXMgbW9yZSB0aGFuIG5lZWRlZCwgZ2l2ZSBpdCBqdXN0IHdoYXQgaXQgbmVlZHMuCisgICAgICAgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+OjppdGVyYXRvciBpID0gdW5hc3NpZ25lZC5iZWdpbigpOyBpICE9IHVuYXNzaWduZWQuZW5kKCk7KSB7CisgICAgICAgICAgaWYgKGFzc2lnbm1lbnRzWyppXSA8PSByZW1haW5pbmdfbWVtICogKHBvcnRpb25zWyppXSAvIHN1bSkpIHsKKyAgICAgICAgICAgIHJlbWFpbmluZ19tZW0gLT0gYXNzaWdubWVudHNbKmldOworICAgICAgICAgICAgYmxvY2tfY291bnRbKmldID0gMTsKKyAgICAgICAgICAgIGkgPSB1bmFzc2lnbmVkLmVyYXNlKGkpOworICAgICAgICAgICAgZm91bmRfbW9yZSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGZvdW5kX21vcmUpOworICAgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD46Oml0ZXJhdG9yIGkgPSB1bmFzc2lnbmVkLmJlZ2luKCk7IGkgIT0gdW5hc3NpZ25lZC5lbmQoKTsgKytpKSB7CisgICAgICAgIGFzc2lnbm1lbnRzWyppXSA9IHJlbWFpbmluZ19tZW0gKiAocG9ydGlvbnNbKmldIC8gc3VtKTsKKyAgICAgICAgYmxvY2tfY291bnRbKmldID0gY29uZmlnXy5ibG9ja19jb3VudDsKKyAgICAgIH0KKyAgICAgIGNoYWluc18uY2xlYXIoKTsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiQ2hhaW4gc2l6ZXM6IjsKKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBjb25maWdfLm9yZGVyOyArK2kpIHsKKyAgICAgICAgLy8gQWx3YXlzIGhhdmUgZW5vdWdoIGZvciBhdCBsZWFzdCBvbmUgcmVjb3JkLgorICAgICAgICAvLyBUaGlzIHdhcyBjcmFzaGluZyBpZiBlLmcuIHRoZXJlIHdhcyBubyA1LWdyYW0uCisgICAgICAgIGFzc2lnbm1lbnRzW2ldID0gc3RkOjptYXgoYXNzaWdubWVudHNbaV0sIGJsb2NrX2NvdW50W2ldICogTkdyYW08QnVpbGRpbmdQYXlsb2FkPjo6VG90YWxTaXplKGkgKyAxKSk7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAnICcgPDwgKGkrMSkgPDwgIjoiIDw8IGFzc2lnbm1lbnRzW2ldOworICAgICAgICBjaGFpbnNfLnB1c2hfYmFjayh1dGlsOjpzdHJlYW06OkNoYWluQ29uZmlnKE5HcmFtPEJ1aWxkaW5nUGF5bG9hZD46OlRvdGFsU2l6ZShpICsgMSksIGJsb2NrX2NvdW50W2ldLCBhc3NpZ25tZW50c1tpXSkpOworICAgICAgfQorICAgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvbmZpZyAmY29uZmlnXzsKKworICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zIGNoYWluc187CisKKyAgICB1dGlsOjpzdHJlYW06OkZpbGVCdWZmZXIgdW5pZ3JhbXNfOworCisgICAgY29uc3QgdW5zaWduZWQgaW50IHN0ZXBzXzsKK307CisKK3V0aWw6OnN0cmVhbTo6U29ydDxTdWZmaXhPcmRlciwgQ29tYmluZUNvdW50cz4gKkNvdW50VGV4dChpbnQgdGV4dF9maWxlIC8qIGlucHV0ICovLCBpbnQgdm9jYWJfZmlsZSAvKiBvdXRwdXQgKi8sIE1hc3RlciAmbWFzdGVyLCB1aW50NjRfdCAmdG9rZW5fY291bnQsIFdvcmRJbmRleCAmdHlwZV9jb3VudCwgc3RkOjpzdHJpbmcgJnRleHRfZmlsZV9uYW1lLCBzdGQ6OnZlY3Rvcjxib29sPiAmcHJ1bmVfd29yZHMpIHsKKyAgY29uc3QgUGlwZWxpbmVDb25maWcgJmNvbmZpZyA9IG1hc3Rlci5Db25maWcoKTsKKyAgc3RkOjpjZXJyIDw8ICI9PT0gMS8iIDw8IG1hc3Rlci5TdGVwcygpIDw8ICIgQ291bnRpbmcgYW5kIHNvcnRpbmcgbi1ncmFtcyA9PT0iIDw8IHN0ZDo6ZW5kbDsKKworICBjb25zdCBzdGQ6OnNpemVfdCB2b2NhYl91c2FnZSA9IENvcnB1c0NvdW50OjpWb2NhYlVzYWdlKGNvbmZpZy52b2NhYl9lc3RpbWF0ZSk7CisgIFVUSUxfVEhST1dfSUYoY29uZmlnLlRvdGFsTWVtb3J5KCkgPCB2b2NhYl91c2FnZSwgdXRpbDo6RXhjZXB0aW9uLCAiVm9jYWIgaGFzaCBzaXplIGVzdGltYXRlICIgPDwgdm9jYWJfdXNhZ2UgPDwgIiBleGNlZWRzIHRvdGFsIG1lbW9yeSAiIDw8IGNvbmZpZy5Ub3RhbE1lbW9yeSgpKTsKKyAgc3RkOjpzaXplX3QgbWVtb3J5X2Zvcl9jaGFpbiA9CisgICAgLy8gVGhpcyBtdWNoIG1lbW9yeSB0byB3b3JrIHdpdGggYWZ0ZXIgdm9jYWIgaGFzaCB0YWJsZS4KKyAgICBzdGF0aWNfY2FzdDxmbG9hdD4oY29uZmlnLlRvdGFsTWVtb3J5KCkgLSB2b2NhYl91c2FnZSkgLworICAgIC8vIFNvbHZlIGZvciBibG9jayBzaXplIGluY2x1ZGluZyB0aGUgZGVkdXBlIG11bHRpcGxpZXIgZm9yIG9uZSBibG9jay4KKyAgICAoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbmZpZy5ibG9ja19jb3VudCkgKyBDb3JwdXNDb3VudDo6RGVkdXBlTXVsdGlwbGllcihjb25maWcub3JkZXIpKSAqCisgICAgLy8gQ2hhaW4gbGlrZXMgbWVtb3J5IGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiB0b3RhbCBtZW1vcnkuCisgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbmZpZy5ibG9ja19jb3VudCk7CisgIHV0aWw6OnN0cmVhbTo6Q2hhaW4gY2hhaW4odXRpbDo6c3RyZWFtOjpDaGFpbkNvbmZpZyhOR3JhbTxCdWlsZGluZ1BheWxvYWQ+OjpUb3RhbFNpemUoY29uZmlnLm9yZGVyKSwgY29uZmlnLmJsb2NrX2NvdW50LCBtZW1vcnlfZm9yX2NoYWluKSk7CisKKyAgdHlwZV9jb3VudCA9IGNvbmZpZy52b2NhYl9lc3RpbWF0ZTsKKyAgdXRpbDo6RmlsZVBpZWNlIHRleHQodGV4dF9maWxlLCBOVUxMLCAmc3RkOjpjZXJyKTsKKyAgdGV4dF9maWxlX25hbWUgPSB0ZXh0LkZpbGVOYW1lKCk7CisgIENvcnB1c0NvdW50IGNvdW50ZXIodGV4dCwgdm9jYWJfZmlsZSwgdG9rZW5fY291bnQsIHR5cGVfY291bnQsIHBydW5lX3dvcmRzLCBjb25maWcucHJ1bmVfdm9jYWJfZmlsZSwgY2hhaW4uQmxvY2tTaXplKCkgLyBjaGFpbi5FbnRyeVNpemUoKSwgY29uZmlnLmRpc2FsbG93ZWRfc3ltYm9sX2FjdGlvbik7CisgIGNoYWluID4+IGJvb3N0OjpyZWYoY291bnRlcik7CisKKyAgdXRpbDo6c2NvcGVkX3B0cjx1dGlsOjpzdHJlYW06OlNvcnQ8U3VmZml4T3JkZXIsIENvbWJpbmVDb3VudHM+ID4gc29ydGVyKG5ldyB1dGlsOjpzdHJlYW06OlNvcnQ8U3VmZml4T3JkZXIsIENvbWJpbmVDb3VudHM+KGNoYWluLCBjb25maWcuc29ydCwgU3VmZml4T3JkZXIoY29uZmlnLm9yZGVyKSwgQ29tYmluZUNvdW50cygpKSk7CisgIGNoYWluLldhaXQodHJ1ZSk7CisgIHJldHVybiBzb3J0ZXIucmVsZWFzZSgpOworfQorCit2b2lkIEluaXRpYWxQcm9iYWJpbGl0aWVzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50c19wcnVuZWQsIGNvbnN0IHN0ZDo6dmVjdG9yPERpc2NvdW50PiAmZGlzY291bnRzLCBNYXN0ZXIgJm1hc3RlciwgU29ydHM8U3VmZml4T3JkZXI+ICZwcmltYXJ5LCB1dGlsOjpGaXhlZEFycmF5PHV0aWw6OnN0cmVhbTo6RmlsZUJ1ZmZlcj4gJmdhbW1hcywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZwcnVuZV90aHJlc2hvbGRzLCBib29sIHBydW5lX3ZvY2FiLCBjb25zdCBTcGVjaWFsVm9jYWIgJnNwZWNpYWxzKSB7CisgIGNvbnN0IFBpcGVsaW5lQ29uZmlnICZjb25maWcgPSBtYXN0ZXIuQ29uZmlnKCk7CisgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zIHNlY29uZChjb25maWcub3JkZXIpOworCisgIHsKKyAgICBTb3J0czxDb250ZXh0T3JkZXI+IHNvcnRzOworICAgIG1hc3Rlci5TZXR1cFNvcnRzKHNvcnRzLCAhY29uZmlnLnJlbnVtYmVyX3ZvY2FidWxhcnkpOworICAgIFByaW50U3RhdGlzdGljcyhjb3VudHMsIGNvdW50c19wcnVuZWQsIGRpc2NvdW50cyk7CisgICAgbG06Om5ncmFtOjpTaG93U2l6ZXMoY291bnRzX3BydW5lZCk7CisgICAgc3RkOjpjZXJyIDw8ICI9PT0gMy8iIDw8IG1hc3Rlci5TdGVwcygpIDw8ICIgQ2FsY3VsYXRpbmcgYW5kIHNvcnRpbmcgaW5pdGlhbCBwcm9iYWJpbGl0aWVzID09PSIgPDwgc3RkOjplbmRsOworICAgIG1hc3Rlci5Tb3J0QW5kUmVhZFR3aWNlKGNvdW50c19wcnVuZWQsIHNvcnRzLCBzZWNvbmQsIGNvbmZpZy5pbml0aWFsX3Byb2JzLmFkZGVyX2luKTsKKyAgfQorCisgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zIGdhbW1hX2NoYWlucyhjb25maWcub3JkZXIpOworICBJbml0aWFsUHJvYmFiaWxpdGllcyhjb25maWcuaW5pdGlhbF9wcm9icywgZGlzY291bnRzLCBtYXN0ZXIuTXV0YWJsZUNoYWlucygpLCBzZWNvbmQsIGdhbW1hX2NoYWlucywgcHJ1bmVfdGhyZXNob2xkcywgcHJ1bmVfdm9jYWIsIHNwZWNpYWxzKTsKKyAgLy8gRG9uJ3QgY2FyZSBhYm91dCBnYW1tYSBmb3IgMC4KKyAgZ2FtbWFfY2hhaW5zWzBdID4+IHV0aWw6OnN0cmVhbTo6a1JlY3ljbGU7CisgIGdhbW1hcy5Jbml0KGNvbmZpZy5vcmRlciAtIDEpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDwgY29uZmlnLm9yZGVyOyArK2kpIHsKKyAgICBnYW1tYXMucHVzaF9iYWNrKHV0aWw6Ok1ha2VUZW1wKGNvbmZpZy5UZW1wUHJlZml4KCkpKTsKKyAgICBnYW1tYV9jaGFpbnNbaV0gPj4gZ2FtbWFzW2kgLSAxXS5TaW5rKCk7CisgIH0KKyAgLy8gSGFzIHRvIGJlIGRvbmUgaGVyZSBkdWUgdG8gZ2FtbWFfY2hhaW5zIHNjb3BlLgorICBtYXN0ZXIuU2V0dXBTb3J0cyhwcmltYXJ5LCB0cnVlKTsKK30KKwordm9pZCBJbnRlcnBvbGF0ZVByb2JhYmlsaXRpZXMoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIE1hc3RlciAmbWFzdGVyLCBTb3J0czxTdWZmaXhPcmRlcj4gJnByaW1hcnksIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpGaWxlQnVmZmVyPiAmZ2FtbWFzLCBPdXRwdXQgJm91dHB1dCwgY29uc3QgU3BlY2lhbFZvY2FiICZzcGVjaWFscykgeworICBzdGQ6OmNlcnIgPDwgIj09PSA0LyIgPDwgbWFzdGVyLlN0ZXBzKCkgPDwgIiBDYWxjdWxhdGluZyBhbmQgd3JpdGluZyBvcmRlci1pbnRlcnBvbGF0ZWQgcHJvYmFiaWxpdGllcyA9PT0iIDw8IHN0ZDo6ZW5kbDsKKyAgY29uc3QgUGlwZWxpbmVDb25maWcgJmNvbmZpZyA9IG1hc3Rlci5Db25maWcoKTsKKyAgbWFzdGVyLk1heGltdW1MYXp5SW5wdXQoY291bnRzLCBwcmltYXJ5KTsKKworICB1dGlsOjpzdHJlYW06OkNoYWlucyBnYW1tYV9jaGFpbnMoY29uZmlnLm9yZGVyIC0gMSk7CisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBjb25maWcub3JkZXIgLSAxOyArK2kpIHsKKyAgICB1dGlsOjpzdHJlYW06OkNoYWluQ29uZmlnIHJlYWRfYmFja29mZnMoY29uZmlnLnJlYWRfYmFja29mZnMpOworCisgICAgaWYoY29uZmlnLnBydW5lX3ZvY2FiIHx8IGNvbmZpZy5wcnVuZV90aHJlc2hvbGRzW2kgKyAxXSA+IDApCisgICAgICAgIHJlYWRfYmFja29mZnMuZW50cnlfc2l6ZSA9IHNpemVvZihIYXNoR2FtbWEpOworICAgIGVsc2UKKyAgICAgICAgcmVhZF9iYWNrb2Zmcy5lbnRyeV9zaXplID0gc2l6ZW9mKGZsb2F0KTsKKworICAgIGdhbW1hX2NoYWlucy5wdXNoX2JhY2socmVhZF9iYWNrb2Zmcyk7CisgICAgZ2FtbWFfY2hhaW5zLmJhY2soKSA+PiBnYW1tYXNbaV0uU291cmNlKHRydWUpOworICB9CisgIG1hc3RlciA+PiBJbnRlcnBvbGF0ZShzdGQ6Om1heChtYXN0ZXIuQ29uZmlnKCkudm9jYWJfc2l6ZV9mb3JfdW5rLCBjb3VudHNbMF0gLSAxIC8qIDxzPiBpcyBub3QgaW5jbHVkZWQgKi8pLCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zKGdhbW1hX2NoYWlucyksIGNvbmZpZy5wcnVuZV90aHJlc2hvbGRzLCBjb25maWcucHJ1bmVfdm9jYWIsIGNvbmZpZy5vdXRwdXRfcSwgc3BlY2lhbHMpOworICBnYW1tYV9jaGFpbnMgPj4gdXRpbDo6c3RyZWFtOjprUmVjeWNsZTsKKyAgb3V0cHV0LlNpbmtQcm9icyhtYXN0ZXIuTXV0YWJsZUNoYWlucygpKTsKK30KKworY2xhc3MgVm9jYWJOdW1iZXJpbmcgeworICBwdWJsaWM6CisgICAgVm9jYWJOdW1iZXJpbmcoaW50IGZpbmFsX3ZvY2FiLCBTdHJpbmdQaWVjZSB0ZW1wX3ByZWZpeCwgYm9vbCByZW51bWJlcikKKyAgICAgIDogZmluYWxfdm9jYWJfKGZpbmFsX3ZvY2FiKSwKKyAgICAgICAgcmVudW1iZXJfKHJlbnVtYmVyKSwKKyAgICAgICAgc3BlY2lhbHNfKGtCT1MsIGtFT1MpIHsKKyAgICAgIGlmIChyZW51bWJlcikgeworICAgICAgICB0ZW1wb3JhcnlfLnJlc2V0KHV0aWw6Ok1ha2VUZW1wKHRlbXBfcHJlZml4KSk7CisgICAgICB9CisgICAgfQorCisgICAgaW50IFdyaXRlT25UaGVGbHkoKSBjb25zdCB7IHJldHVybiByZW51bWJlcl8gPyB0ZW1wb3JhcnlfLmdldCgpIDogZmluYWxfdm9jYWJfOyB9CisKKyAgICAvLyBDb21wdXRlIHRoZSB2b2NhYnVsYXJ5IG1hcHBpbmcgYW5kIHJldHVybiB0aGUgbWVtb3J5IHVzZWQuCisgICAgc3RkOjpzaXplX3QgQ29tcHV0ZU1hcHBpbmcoV29yZEluZGV4IHR5cGVfY291bnQpIHsKKyAgICAgIGlmICghcmVudW1iZXJfKSByZXR1cm4gMDsKKyAgICAgIG5ncmFtOjpTb3J0ZWRWb2NhYnVsYXJ5OjpDb21wdXRlUmVudW1iZXJpbmcodHlwZV9jb3VudCwgdGVtcG9yYXJ5Xy5nZXQoKSwgZmluYWxfdm9jYWJfLCB2b2NhYl9tYXBwaW5nXyk7CisgICAgICB0ZW1wb3JhcnlfLnJlc2V0KCk7CisgICAgICByZXR1cm4gc2l6ZW9mKFdvcmRJbmRleCkgKiB2b2NhYl9tYXBwaW5nXy5zaXplKCk7CisgICAgfQorCisgICAgdm9pZCBBcHBseVJlbnVtYmVyKHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZjaGFpbnMpIHsKKyAgICAgIGlmICghcmVudW1iZXJfKSByZXR1cm47CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgY2hhaW5zLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNoYWluc1tpXSA+PiBSZW51bWJlcigmKnZvY2FiX21hcHBpbmdfLmJlZ2luKCksIGkgKyAxKTsKKyAgICAgIH0KKyAgICAgIHNwZWNpYWxzXyA9IFNwZWNpYWxWb2NhYih2b2NhYl9tYXBwaW5nX1tzcGVjaWFsc18uQk9TKCldLCB2b2NhYl9tYXBwaW5nX1tzcGVjaWFsc18uRU9TKCldKTsKKyAgICB9CisKKyAgICBjb25zdCBTcGVjaWFsVm9jYWIgJlNwZWNpYWxzKCkgY29uc3QgeyByZXR1cm4gc3BlY2lhbHNfOyB9CisKKyAgcHJpdmF0ZToKKyAgICBpbnQgZmluYWxfdm9jYWJfOworICAgIC8vIE91dCBvZiBvcmRlciB2b2NhYiBmaWxlIGNyZWF0ZWQgb24gdGhlIGZseS4KKyAgICB1dGlsOjpzY29wZWRfZmQgdGVtcG9yYXJ5XzsKKworICAgIGJvb2wgcmVudW1iZXJfOworCisgICAgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiB2b2NhYl9tYXBwaW5nXzsKKworICAgIFNwZWNpYWxWb2NhYiBzcGVjaWFsc187Cit9OworCit9IC8vIG5hbWVzcGFjZQorCit2b2lkIFBpcGVsaW5lKFBpcGVsaW5lQ29uZmlnICZjb25maWcsIGludCB0ZXh0X2ZpbGUsIE91dHB1dCAmb3V0cHV0KSB7CisgIC8vIFNvbWUgZmFpbC1mYXN0IHNhbml0eSBjaGVja3MuCisgIGlmIChjb25maWcuc29ydC5idWZmZXJfc2l6ZSAqIDQgPiBjb25maWcuVG90YWxNZW1vcnkoKSkgeworICAgIGNvbmZpZy5zb3J0LmJ1ZmZlcl9zaXplID0gY29uZmlnLlRvdGFsTWVtb3J5KCkgLyA0OworICAgIHN0ZDo6Y2VyciA8PCAiV2FybmluZzogY2hhbmdpbmcgc29ydCBibG9jayBzaXplIHRvICIgPDwgY29uZmlnLnNvcnQuYnVmZmVyX3NpemUgPDwgIiBieXRlcyBkdWUgdG8gbG93IHRvdGFsIG1lbW9yeS4iIDw8IHN0ZDo6ZW5kbDsKKyAgfQorICBpZiAoY29uZmlnLm1pbmltdW1fYmxvY2sgPCBOR3JhbTxCdWlsZGluZ1BheWxvYWQ+OjpUb3RhbFNpemUoY29uZmlnLm9yZGVyKSkgeworICAgIGNvbmZpZy5taW5pbXVtX2Jsb2NrID0gTkdyYW08QnVpbGRpbmdQYXlsb2FkPjo6VG90YWxTaXplKGNvbmZpZy5vcmRlcik7CisgICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nOiByYWlzaW5nIG1pbmltdW0gYmxvY2sgdG8gIiA8PCBjb25maWcubWluaW11bV9ibG9jayA8PCAiIHRvIGZpdCBhbiBuZ3JhbSBpbiBldmVyeSBibG9jay4iIDw8IHN0ZDo6ZW5kbDsKKyAgfQorICBVVElMX1RIUk9XX0lGKGNvbmZpZy5zb3J0LmJ1ZmZlcl9zaXplIDwgY29uZmlnLm1pbmltdW1fYmxvY2ssIHV0aWw6OkV4Y2VwdGlvbiwgIlNvcnQgYmxvY2sgc2l6ZSAiIDw8IGNvbmZpZy5zb3J0LmJ1ZmZlcl9zaXplIDw8ICIgaXMgYmVsb3cgdGhlIG1pbmltdW0gYmxvY2sgc2l6ZSAiIDw8IGNvbmZpZy5taW5pbXVtX2Jsb2NrIDw8ICIuIik7CisgIFVUSUxfVEhST1dfSUYoY29uZmlnLlRvdGFsTWVtb3J5KCkgPCBjb25maWcubWluaW11bV9ibG9jayAqIGNvbmZpZy5vcmRlciAqIGNvbmZpZy5ibG9ja19jb3VudCwgdXRpbDo6RXhjZXB0aW9uLAorICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGZpdCAiIDw8IChjb25maWcub3JkZXIgKiBjb25maWcuYmxvY2tfY291bnQpIDw8ICIgYmxvY2tzIHdpdGggbWluaW11bSBzaXplICIgPDwgY29uZmlnLm1pbmltdW1fYmxvY2sgPDwgIi4gIEluY3JlYXNlIG1lbW9yeSB0byAiIDw8IChjb25maWcubWluaW11bV9ibG9jayAqIGNvbmZpZy5vcmRlciAqIGNvbmZpZy5ibG9ja19jb3VudCkgPDwgIiBieXRlcyBvciBkZWNyZWFzZSB0aGUgbWluaW11bSBibG9jayBzaXplLiIpOworCisgIE1hc3RlciBtYXN0ZXIoY29uZmlnLCBvdXRwdXQuU3RlcHMoKSk7CisgIC8vIG1hc3RlcidzIGRlc3RydWN0b3Igd2lsbCB3YWl0IGZvciBjaGFpbnMuICBCdXQgdGhleSBtaWdodCBiZSBkZWFkbG9ja2VkIGlmCisgIC8vIHRoaXMgdGhyZWFkIGRpZXMgYmVjYXVzZSBlLmcuIGl0IHJhbiBvdXQgb2YgbWVtb3J5LgorICB0cnkgeworICAgIFZvY2FiTnVtYmVyaW5nIG51bWJlcmluZyhvdXRwdXQuVm9jYWJGaWxlKCksIGNvbmZpZy5UZW1wUHJlZml4KCksIGNvbmZpZy5yZW51bWJlcl92b2NhYnVsYXJ5KTsKKyAgICB1aW50NjRfdCB0b2tlbl9jb3VudDsKKyAgICBXb3JkSW5kZXggdHlwZV9jb3VudDsKKyAgICBzdGQ6OnN0cmluZyB0ZXh0X2ZpbGVfbmFtZTsKKyAgICBzdGQ6OnZlY3Rvcjxib29sPiBwcnVuZV93b3JkczsKKyAgICB1dGlsOjpzY29wZWRfcHRyPHV0aWw6OnN0cmVhbTo6U29ydDxTdWZmaXhPcmRlciwgQ29tYmluZUNvdW50cz4gPiBzb3J0ZWRfY291bnRzKAorICAgICAgICBDb3VudFRleHQodGV4dF9maWxlLCBudW1iZXJpbmcuV3JpdGVPblRoZUZseSgpLCBtYXN0ZXIsIHRva2VuX2NvdW50LCB0eXBlX2NvdW50LCB0ZXh0X2ZpbGVfbmFtZSwgcHJ1bmVfd29yZHMpKTsKKyAgICBzdGQ6OmNlcnIgPDwgIlVuaWdyYW0gdG9rZW5zICIgPDwgdG9rZW5fY291bnQgPDwgIiB0eXBlcyAiIDw8IHR5cGVfY291bnQgPDwgc3RkOjplbmRsOworCisgICAgLy8gQ3JlYXRlIHZvY2FiIG1hcHBpbmcsIHdoaWNoIHVzZXMgdGVtcG9yYXJ5IG1lbW9yeSwgd2hpbGUgbm90aGluZyBlbHNlIGlzIGhhcHBlbmluZy4KKyAgICBzdGQ6OnNpemVfdCBzdWJ0cmFjdF9mb3JfbnVtYmVyaW5nID0gbnVtYmVyaW5nLkNvbXB1dGVNYXBwaW5nKHR5cGVfY291bnQpOworCisgICAgc3RkOjpjZXJyIDw8ICI9PT0gMi8iIDw8IG1hc3Rlci5TdGVwcygpIDw8ICIgQ2FsY3VsYXRpbmcgYW5kIHNvcnRpbmcgYWRqdXN0ZWQgY291bnRzID09PSIgPDwgc3RkOjplbmRsOworICAgIG1hc3Rlci5Jbml0Rm9yQWRqdXN0KCpzb3J0ZWRfY291bnRzLCB0eXBlX2NvdW50LCBzdWJ0cmFjdF9mb3JfbnVtYmVyaW5nKTsKKyAgICBzb3J0ZWRfY291bnRzLnJlc2V0KCk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRzOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBjb3VudHNfcHJ1bmVkOworICAgIHN0ZDo6dmVjdG9yPERpc2NvdW50PiBkaXNjb3VudHM7CisgICAgbWFzdGVyID4+IEFkanVzdENvdW50cyhjb25maWcucHJ1bmVfdGhyZXNob2xkcywgY291bnRzLCBjb3VudHNfcHJ1bmVkLCBwcnVuZV93b3JkcywgY29uZmlnLmRpc2NvdW50LCBkaXNjb3VudHMpOworICAgIG51bWJlcmluZy5BcHBseVJlbnVtYmVyKG1hc3Rlci5NdXRhYmxlQ2hhaW5zKCkpOworCisgICAgeworICAgICAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkZpbGVCdWZmZXI+IGdhbW1hczsKKyAgICAgIFNvcnRzPFN1ZmZpeE9yZGVyPiBwcmltYXJ5OworICAgICAgSW5pdGlhbFByb2JhYmlsaXRpZXMoY291bnRzLCBjb3VudHNfcHJ1bmVkLCBkaXNjb3VudHMsIG1hc3RlciwgcHJpbWFyeSwgZ2FtbWFzLCBjb25maWcucHJ1bmVfdGhyZXNob2xkcywgY29uZmlnLnBydW5lX3ZvY2FiLCBudW1iZXJpbmcuU3BlY2lhbHMoKSk7CisgICAgICBvdXRwdXQuU2V0SGVhZGVyKEhlYWRlckluZm8odGV4dF9maWxlX25hbWUsIHRva2VuX2NvdW50LCBjb3VudHNfcHJ1bmVkKSk7CisgICAgICAvLyBBbHNvIGRvZXMgb3V0cHV0LgorICAgICAgSW50ZXJwb2xhdGVQcm9iYWJpbGl0aWVzKGNvdW50c19wcnVuZWQsIG1hc3RlciwgcHJpbWFyeSwgZ2FtbWFzLCBvdXRwdXQsIG51bWJlcmluZy5TcGVjaWFscygpKTsKKyAgICB9CisgIH0gY2F0Y2ggKGNvbnN0IHV0aWw6OkV4Y2VwdGlvbiAmZSkgeworICAgIHN0ZDo6Y2VyciA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgYWJvcnQoKTsKKyAgfQorfQorCit9fSAvLyBuYW1lc3BhY2VzCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vYnVpbGRlci9waXBlbGluZS5oaCBiL3NyYy9rZW5sbS9sbS9idWlsZGVyL3BpcGVsaW5lLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjFmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vYnVpbGRlci9waXBlbGluZS5oaApAQCAtMCwwICsxLDc2IEBACisjaWZuZGVmIExNX0JVSUxERVJfUElQRUxJTkVfSAorI2RlZmluZSBMTV9CVUlMREVSX1BJUEVMSU5FX0gKKworI2luY2x1ZGUgImxtL2J1aWxkZXIvYWRqdXN0X2NvdW50cy5oaCIKKyNpbmNsdWRlICJsbS9idWlsZGVyL2luaXRpYWxfcHJvYmFiaWxpdGllcy5oaCIKKyNpbmNsdWRlICJsbS9idWlsZGVyL2hlYWRlcl9pbmZvLmhoIgorI2luY2x1ZGUgImxtL2xtX2V4Y2VwdGlvbi5oaCIKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NvbmZpZy5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGJ1aWxkZXIgeworCitjbGFzcyBPdXRwdXQ7CisKK3N0cnVjdCBQaXBlbGluZUNvbmZpZyB7CisgIHN0ZDo6c2l6ZV90IG9yZGVyOworICB1dGlsOjpzdHJlYW06OlNvcnRDb25maWcgc29ydDsKKyAgSW5pdGlhbFByb2JhYmlsaXRpZXNDb25maWcgaW5pdGlhbF9wcm9iczsKKyAgdXRpbDo6c3RyZWFtOjpDaGFpbkNvbmZpZyByZWFkX2JhY2tvZmZzOworCisgIC8vIEVzdGltYXRlZCB2b2NhYnVsYXJ5IHNpemUuICBVc2VkIGZvciBzaXppbmcgQ29ycHVzQ291bnQgbWVtb3J5IGFuZAorICAvLyBpbml0aWFsIHByb2JpbmcgaGFzaCB0YWJsZSBzaXppbmcsIGFsc28gaW4gQ29ycHVzQ291bnQuCisgIGxtOjpXb3JkSW5kZXggdm9jYWJfZXN0aW1hdGU7CisKKyAgLy8gTWluaW11bSBibG9jayBzaXplIHRvIHRvbGVyYXRlLgorICBzdGQ6OnNpemVfdCBtaW5pbXVtX2Jsb2NrOworCisgIC8vIE51bWJlciBvZiBibG9ja3MgdG8gdXNlLiAgVGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gdG8gMSBpZiBldmVyeXRoaW5nIGZpdHMuCisgIHN0ZDo6c2l6ZV90IGJsb2NrX2NvdW50OworCisgIC8vIG4tZ3JhbSBjb3VudCB0aHJlc2hvbGRzIGZvciBwcnVuaW5nLiAwIHZhbHVlcyBtZWFucyBubyBwcnVuaW5nIGZvcgorICAvLyBjb3JyZXNwb25kaW5nIG4tZ3JhbSBvcmRlcgorICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gcHJ1bmVfdGhyZXNob2xkczsgLy9tamQKKyAgYm9vbCBwcnVuZV92b2NhYjsKKyAgc3RkOjpzdHJpbmcgcHJ1bmVfdm9jYWJfZmlsZTsKKworICAvKiBSZW51bWJlciB0aGUgdm9jYWJ1bGFyeSB0aGUgd2F5IHRoZSB0cmllIGxpa2VzIGl0PyAqLworICBib29sIHJlbnVtYmVyX3ZvY2FidWxhcnk7CisKKyAgLy8gV2hhdCB0byBkbyB3aXRoIGRpc2NvdW50IGZhaWx1cmVzLgorICBEaXNjb3VudENvbmZpZyBkaXNjb3VudDsKKworICAvLyBDb21wdXRlIGNvbGxhcHNlZCBxIHZhbHVlcyBpbnN0ZWFkIG9mIHByb2JhYmlsaXR5IGFuZCBiYWNrb2ZmCisgIGJvb2wgb3V0cHV0X3E7CisKKyAgLyogQ29tcHV0aW5nIHRoZSBwZXJwbGV4aXR5IG9mIExNcyB3aXRoIGRpZmZlcmVudCB2b2NhYnVsYXJpZXMgaXMgaGFyZC4gIEZvcgorICAgKiBleGFtcGxlLCB0aGUgbG93ZXN0IHBlcnBsZXhpdHkgaXMgYXR0YWluZWQgYnkgYSB1bmlncmFtIG1vZGVsIHRoYXQKKyAgICogcHJlZGljdHMgcCg8dW5rPikgPSAxIGFuZCBoYXMgbm8gb3RoZXIgdm9jYWJ1bGFyeS4gIEFsc28sIGxpbmVhcmx5CisgICAqIGludGVycG9sYXRlZCBtb2RlbHMgd2lsbCBzdW0gdG8gbW9yZSB0aGFuIDEgYmVjYXVzZSA8dW5rPiBpcyBkdXBsaWNhdGVkCisgICAqIChTUkkganVzdCBwcmV0ZW5kcyBwKDx1bms+KSA9IDAgZm9yIHRoZXNlIHB1cnBvc2VzLCB3aGljaCBtYWtlcyBpdCBzdW0gdG8KKyAgICogMSBidXQgY29tZXMgd2l0aCBpdHMgb3duIHByb2JsZW1zKS4gIFRoaXMgb3B0aW9uIHdpbGwgbWFrZSB0aGUgdm9jYWJ1bGFyeQorICAgKiBhIHBhcnRpY3VsYXIgc2l6ZSBieSByZXBsaWNhdGluZyA8dW5rPiBtdWx0aXBsZSB0aW1lcyBmb3IgcHVycG9zZXMgb2YKKyAgICogY29tcHV0aW5nIHZvY2FidWxhcnkgc2l6ZS4gIEl0IGhhcyBubyBlZmZlY3QgaWYgdGhlIGFjdHVhbCB2b2NhYnVsYXJ5IGlzCisgICAqIGxhcmdlci4gIFRoaXMgcGFyYW1ldGVyIHNlcnZlcyB0aGUgc2FtZSBwdXJwb3NlIGFzIElSU1RMTSdzICJkdWIiLgorICAgKi8KKyAgdWludDY0X3Qgdm9jYWJfc2l6ZV9mb3JfdW5rOworCisgIC8qIFdoYXQgdG8gZG8gdGhlIGZpcnN0IHRpbWUgPHM+LCA8L3M+LCBvciA8dW5rPiBhcHBlYXJzIGluIHRoZSBpbnB1dC4gIElmCisgICAqIHRoaXMgaXMgYW55dGhpbmcgYnV0IFRIUk9XX1VQLCB0aGVuIHRoZSBzeW1ib2wgd2lsbCBhbHdheXMgYmUgdHJlYXRlZCBhcworICAgKiB3aGl0ZXNwYWNlLgorICAgKi8KKyAgV2FybmluZ0FjdGlvbiBkaXNhbGxvd2VkX3N5bWJvbF9hY3Rpb247CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJlRlbXBQcmVmaXgoKSBjb25zdCB7IHJldHVybiBzb3J0LnRlbXBfcHJlZml4OyB9CisgIHN0ZDo6c2l6ZV90IFRvdGFsTWVtb3J5KCkgY29uc3QgeyByZXR1cm4gc29ydC50b3RhbF9tZW1vcnk7IH0KK307CisKKy8vIFRha2VzIG93bmVyc2hpcCBvZiB0ZXh0X2ZpbGUgYW5kIG91dF9hcnBhLgordm9pZCBQaXBlbGluZShQaXBlbGluZUNvbmZpZyAmY29uZmlnLCBpbnQgdGV4dF9maWxlLCBPdXRwdXQgJm91dHB1dCk7CisKK319IC8vIG5hbWVzcGFjZXMKKyNlbmRpZiAvLyBMTV9CVUlMREVSX1BJUEVMSU5FX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9jb21tb24vQ01ha2VMaXN0cy50eHQgYi9zcmMva2VubG0vbG0vY29tbW9uL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmUyNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vY29tbW9uL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDAgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjguOCkKKyMKKyMgVGhlIEtlbkxNIGNtYWtlIGZpbGVzIG1ha2UgdXNlIG9mIGFkZF9saWJyYXJ5KC4uLiBPQkpFQ1RTIC4uLikKKyMgCisjIFRoaXMgc3ludGF4IGFsbG93cyBncm91cGluZyBvZiBzb3VyY2UgZmlsZXMgd2hlbiBjb21waWxpbmcKKyMgKGVmZmVjdGl2ZWx5IGNyZWF0aW5nICJmYWtlIiBsaWJyYXJpZXMgYmFzZWQgb24gc291cmNlIHN1YmRpcnMpLgorIyAKKyMgVGhpcyBzeW50YXggd2FzIG9ubHkgYWRkZWQgaW4gY21ha2UgdmVyc2lvbiAyLjguOAorIworIyBzZWUgaHR0cDovL3d3dy5jbWFrZS5vcmcvV2lraS9DTWFrZS9UdXRvcmlhbHMvT2JqZWN0X0xpYnJhcnkKKworCisjIFRoaXMgQ01ha2UgZmlsZSB3YXMgY3JlYXRlZCBieSBMYW5lIFNjaHdhcnR6IDxkb3dvYmVoYUBnbWFpbC5jb20+CisKKyMgRXhwbGljaXRseSBsaXN0IHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoaXMgc3ViZGlyZWN0b3J5CisjCisjIElmIHlvdSBhZGQgYW55IHNvdXJjZSBmaWxlcyB0byB0aGlzIHN1YmRpcmVjdG9yeQorIyAgICB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUga2VubG0gbGlicmFyeSwKKyMgICAgICAgICh0aGlzIGV4Y2x1ZGVzIGFueSB1bml0IHRlc3QgZmlsZXMpCisjICAgIHlvdSBzaG91bGQgYWRkIHRoZW0gdG8gdGhlIGZvbGxvd2luZyBsaXN0OgorIworIyBJbiBvcmRlciB0byBzZXQgY29ycmVjdCBwYXRocyB0byB0aGVzZSBmaWxlcworIyAgICBpbiBjYXNlIHRoaXMgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBieSBDTWFrZSBmaWxlcyBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSwKKyMgICAgd2UgcHJlZml4IGFsbCBmaWxlcyB3aXRoICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS4KKyMKK3NldChLRU5MTV9DT01NT05fU09VUkNFIAorCQkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbW9kZWxfYnVmZmVyLmNjCisJCSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9wcmludC5jYworCQkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcmVudW1iZXIuY2MKKwkJJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NpemVfb3B0aW9uLmNjCisJKQorCisKKyMgR3JvdXAgdGhlc2Ugb2JqZWN0cyB0b2dldGhlciBmb3IgbGF0ZXIgdXNlLiAKKyMKKyMgR2l2ZW4gYWRkX2xpYnJhcnkoZm9vIE9CSkVDVCAke215X2Zvb19zb3VyY2VzfSksCisjIHJlZmVyIHRvIHRoZXNlIG9iamVjdHMgYXMgJDxUQVJHRVRfT0JKRUNUUzpmb28+CisjCithZGRfbGlicmFyeShrZW5sbV9jb21tb24gT0JKRUNUICR7S0VOTE1fQ09NTU9OX1NPVVJDRX0pCisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9jb21tb24vSmFtZmlsZSBiL3NyYy9rZW5sbS9sbS9jb21tb24vSmFtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJkZmQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2NvbW1vbi9KYW1maWxlCkBAIC0wLDAgKzEsMiBAQAorZmFrZWxpYiBjb21tb24gOiBbIGdsb2IgKi5jYyA6ICp0ZXN0LmNjICptYWluLmNjIF0KKyAgLi4vLi4vdXRpbC8va2VudXRpbCAuLi8uLi91dGlsL3N0cmVhbS8vc3RyZWFtIC4uLy4uL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vL2RvdWJsZS1jb252ZXJzaW9uIC4uLy9rZW5sbSAvdG9wLy9ib29zdF9wcm9ncmFtX29wdGlvbnMgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2NvbW1vbi9jb21wYXJlLmhoIGIvc3JjL2tlbmxtL2xtL2NvbW1vbi9jb21wYXJlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjN2NkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vY29tbW9uL2NvbXBhcmUuaGgKQEAgLTAsMCArMSwxNzQgQEAKKyNpZm5kZWYgTE1fQ09NTU9OX0NPTVBBUkVfSAorI2RlZmluZSBMTV9DT01NT05fQ09NUEFSRV9ICisKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbSB7CisKKy8qKgorICogQWJzdHJhY3QgcGFyZW50IGNsYXNzIGZvciBkZWZpbmluZyBjdXN0b20gbi1ncmFtIGNvbXBhcmF0b3JzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgQ2hpbGQ+IGNsYXNzIENvbXBhcmF0b3IgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248Y29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIGJvb2w+IHsKKyAgcHVibGljOgorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGNvbXBhcmF0b3IgY2FwYWJsZSBvZiBjb21wYXJpbmcgdHdvIG4tZ3JhbXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JkZXIgTnVtYmVyIG9mIHdvcmRzIGluIGVhY2ggbi1ncmFtCisgICAgICovCisgICAgZXhwbGljaXQgQ29tcGFyYXRvcihzdGQ6OnNpemVfdCBvcmRlcikgOiBvcmRlcl8ob3JkZXIpIHt9CisKKyAgICAvKioKKyAgICAgKiBBcHBsaWVzIHRoZSBjb21wYXJhdG9yIHVzaW5nIHRoZSBDb21wYXJlIG1ldGhvZCB0aGF0IG11c3QgYmUgZGVmaW5lZCBpbiBhbnkgY2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIHRoaXMgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGhzIEEgcG9pbnRlciB0byB0aGUgbi1ncmFtIG9uIHRoZSBsZWZ0LWhhbmQgc2lkZSBvZiB0aGUgY29tcGFyaXNvbgorICAgICAqIEBwYXJhbSByaHMgQSBwb2ludGVyIHRvIHRoZSBuLWdyYW0gb24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgY29tcGFyaXNvbgorICAgICAqCisgICAgICogQHNlZSBDb250ZXh0T3JkZXI6OkNvbXBhcmUKKyAgICAgKiBAc2VlIFByZWZpeE9yZGVyOjpDb21wYXJlCisgICAgICogQHNlZSBTdWZmaXhPcmRlcjo6Q29tcGFyZQorICAgICAqLworICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3Qgdm9pZCAqbGhzLCBjb25zdCB2b2lkICpyaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBDaGlsZCo+KHRoaXMpLT5Db21wYXJlKHN0YXRpY19jYXN0PGNvbnN0IFdvcmRJbmRleCo+KGxocyksIHN0YXRpY19jYXN0PGNvbnN0IFdvcmRJbmRleCo+KHJocykpOworICAgIH0KKworICAgIC8qKiBHZXRzIHRoZSBuLWdyYW0gb3JkZXIgZGVmaW5lZCBmb3IgdGhpcyBjb21wYXJhdG9yLiAqLworICAgIHN0ZDo6c2l6ZV90IE9yZGVyKCkgY29uc3QgeyByZXR1cm4gb3JkZXJfOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHN0ZDo6c2l6ZV90IG9yZGVyXzsKK307CisKKy8qKgorICogTi1ncmFtIGNvbXBhcmF0b3IgdGhhdCBjb21wYXJlcyBuLWdyYW1zIGFjY29yZGluZyB0byB0aGVpciByZXZlcnNlIChzdWZmaXgpIG9yZGVyLgorICoKKyAqIFRoaXMgY29tcGFyYXRvciBjb21wYXJlcyBuLWdyYW1zIGxleGljb2dyYXBoaWNhbGx5LCBvbmUgd29yZCBhdCBhIHRpbWUsCisgKiBiZWdpbm5pbmcgd2l0aCB0aGUgbGFzdCB3b3JkIG9mIGVhY2ggbi1ncmFtIGFuZCBlbmRpbmcgd2l0aCB0aGUgZmlyc3Qgd29yZCBvZiBlYWNoIG4tZ3JhbS4KKyAqCisgKiBTb21lIGV4YW1wbGVzIG9mIG4tZ3JhbSBjb21wYXJpc29ucyBhcyBkZWZpbmVkIGJ5IHRoaXMgY29tcGFyYXRvcjoKKyAqIC0gYSBiIGMgPT0gYSBiIGMKKyAqIC0gYSBiIGMgPCBhIGIgZAorICogLSBhIGIgYyA+IGEgZCBiCisgKiAtIGEgYiBjID4gYSBiIGIKKyAqIC0gYSBiIGMgPiB4IGEgYworICogLSBhIGIgYyA8IHggeSB6CisgKi8KK2NsYXNzIFN1ZmZpeE9yZGVyIDogcHVibGljIENvbXBhcmF0b3I8U3VmZml4T3JkZXI+IHsKKyAgcHVibGljOgorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGNvbXBhcmF0b3IgY2FwYWJsZSBvZiBjb21wYXJpbmcgdHdvIG4tZ3JhbXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JkZXIgTnVtYmVyIG9mIHdvcmRzIGluIGVhY2ggbi1ncmFtCisgICAgICovCisgICAgZXhwbGljaXQgU3VmZml4T3JkZXIoc3RkOjpzaXplX3Qgb3JkZXIpIDogQ29tcGFyYXRvcjxTdWZmaXhPcmRlcj4ob3JkZXIpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0d28gbi1ncmFtcyBsZXhpY29ncmFwaGljYWxseSwgb25lIHdvcmQgYXQgYSB0aW1lLAorICAgICAqIGJlZ2lubmluZyB3aXRoIHRoZSBsYXN0IHdvcmQgb2YgZWFjaCBuLWdyYW0gYW5kIGVuZGluZyB3aXRoIHRoZSBmaXJzdCB3b3JkIG9mIGVhY2ggbi1ncmFtLgorICAgICAqCisgICAgICogQHBhcmFtIGxocyBBIHBvaW50ZXIgdG8gdGhlIG4tZ3JhbSBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KKyAgICAgKiBAcGFyYW0gcmhzIEEgcG9pbnRlciB0byB0aGUgbi1ncmFtIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBDb21wYXJlKGNvbnN0IFdvcmRJbmRleCAqbGhzLCBjb25zdCBXb3JkSW5kZXggKnJocykgY29uc3QgeworICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gb3JkZXJfIC0gMTsgaSAhPSAwOyAtLWkpIHsKKyAgICAgICAgaWYgKGxoc1tpXSAhPSByaHNbaV0pCisgICAgICAgICAgcmV0dXJuIGxoc1tpXSA8IHJoc1tpXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBsaHNbMF0gPCByaHNbMF07CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtNYXRjaE9mZnNldCA9IDE7Cit9OworCisKKy8qKgorICAqIE4tZ3JhbSBjb21wYXJhdG9yIHRoYXQgY29tcGFyZXMgbi1ncmFtcyBhY2NvcmRpbmcgdG8gdGhlIHJldmVyc2UgKHN1ZmZpeCkgb3JkZXIgb2YgdGhlIG4tZ3JhbSBjb250ZXh0LgorICAqCisgICogVGhpcyBjb21wYXJhdG9yIGNvbXBhcmVzIG4tZ3JhbXMgbGV4aWNvZ3JhcGhpY2FsbHksIG9uZSB3b3JkIGF0IGEgdGltZSwKKyAgKiBiZWdpbm5pbmcgd2l0aCB0aGUgcGVudWx0aW1hdGUgd29yZCBvZiBlYWNoIG4tZ3JhbSBhbmQgZW5kaW5nIHdpdGggdGhlIGZpcnN0IHdvcmQgb2YgZWFjaCBuLWdyYW07CisgICogZmluYWxseSwgdGhpcyBjb21wYXJhdG9yIGNvbXBhcmVzIHRoZSBsYXN0IHdvcmQgb2YgZWFjaCBuLWdyYW0uCisgICoKKyAgKiBTb21lIGV4YW1wbGVzIG9mIG4tZ3JhbSBjb21wYXJpc29ucyBhcyBkZWZpbmVkIGJ5IHRoaXMgY29tcGFyYXRvcjoKKyAgKiAtIGEgYiBjID09IGEgYiBjCisgICogLSBhIGIgYyA8IGEgYiBkCisgICogLSBhIGIgYyA8IGEgZCBiCisgICogLSBhIGIgYyA+IGEgYiBiCisgICogLSBhIGIgYyA+IHggYSBjCisgICogLSBhIGIgYyA8IHggeSB6CisgICovCitjbGFzcyBDb250ZXh0T3JkZXIgOiBwdWJsaWMgQ29tcGFyYXRvcjxDb250ZXh0T3JkZXI+IHsKKyAgcHVibGljOgorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGNvbXBhcmF0b3IgY2FwYWJsZSBvZiBjb21wYXJpbmcgdHdvIG4tZ3JhbXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JkZXIgTnVtYmVyIG9mIHdvcmRzIGluIGVhY2ggbi1ncmFtCisgICAgICovCisgICAgZXhwbGljaXQgQ29udGV4dE9yZGVyKHN0ZDo6c2l6ZV90IG9yZGVyKSA6IENvbXBhcmF0b3I8Q29udGV4dE9yZGVyPihvcmRlcikge30KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHR3byBuLWdyYW1zIGxleGljb2dyYXBoaWNhbGx5LCBvbmUgd29yZCBhdCBhIHRpbWUsCisgICAgICogYmVnaW5uaW5nIHdpdGggdGhlIHBlbnVsdGltYXRlIHdvcmQgb2YgZWFjaCBuLWdyYW0gYW5kIGVuZGluZyB3aXRoIHRoZSBmaXJzdCB3b3JkIG9mIGVhY2ggbi1ncmFtOworICAgICAqIGZpbmFsbHksIHRoaXMgY29tcGFyYXRvciBjb21wYXJlcyB0aGUgbGFzdCB3b3JkIG9mIGVhY2ggbi1ncmFtLgorICAgICAqCisgICAgICogQHBhcmFtIGxocyBBIHBvaW50ZXIgdG8gdGhlIG4tZ3JhbSBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KKyAgICAgKiBAcGFyYW0gcmhzIEEgcG9pbnRlciB0byB0aGUgbi1ncmFtIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBDb21wYXJlKGNvbnN0IFdvcmRJbmRleCAqbGhzLCBjb25zdCBXb3JkSW5kZXggKnJocykgY29uc3QgeworICAgICAgZm9yIChpbnQgaSA9IG9yZGVyXyAtIDI7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGlmIChsaHNbaV0gIT0gcmhzW2ldKQorICAgICAgICAgIHJldHVybiBsaHNbaV0gPCByaHNbaV07CisgICAgICB9CisgICAgICByZXR1cm4gbGhzW29yZGVyXyAtIDFdIDwgcmhzW29yZGVyXyAtIDFdOworICAgIH0KK307CisKKy8qKgorICogTi1ncmFtIGNvbXBhcmF0b3IgdGhhdCBjb21wYXJlcyBuLWdyYW1zIGFjY29yZGluZyB0byB0aGVpciBuYXR1cmFsIChwcmVmaXgpIG9yZGVyLgorICoKKyAqIFRoaXMgY29tcGFyYXRvciBjb21wYXJlcyBuLWdyYW1zIGxleGljb2dyYXBoaWNhbGx5LCBvbmUgd29yZCBhdCBhIHRpbWUsCisgKiBiZWdpbm5pbmcgd2l0aCB0aGUgZmlyc3Qgd29yZCBvZiBlYWNoIG4tZ3JhbSBhbmQgZW5kaW5nIHdpdGggdGhlIGxhc3Qgd29yZCBvZiBlYWNoIG4tZ3JhbS4KKyAqCisgKiBTb21lIGV4YW1wbGVzIG9mIG4tZ3JhbSBjb21wYXJpc29ucyBhcyBkZWZpbmVkIGJ5IHRoaXMgY29tcGFyYXRvcjoKKyAqIC0gYSBiIGMgPT0gYSBiIGMKKyAqIC0gYSBiIGMgPCBhIGIgZAorICogLSBhIGIgYyA8IGEgZCBiCisgKiAtIGEgYiBjID4gYSBiIGIKKyAqIC0gYSBiIGMgPCB4IGEgYworICogLSBhIGIgYyA8IHggeSB6CisgKi8KK2NsYXNzIFByZWZpeE9yZGVyIDogcHVibGljIENvbXBhcmF0b3I8UHJlZml4T3JkZXI+IHsKKyAgcHVibGljOgorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGNvbXBhcmF0b3IgY2FwYWJsZSBvZiBjb21wYXJpbmcgdHdvIG4tZ3JhbXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JkZXIgTnVtYmVyIG9mIHdvcmRzIGluIGVhY2ggbi1ncmFtCisgICAgICovCisgICAgZXhwbGljaXQgUHJlZml4T3JkZXIoc3RkOjpzaXplX3Qgb3JkZXIpIDogQ29tcGFyYXRvcjxQcmVmaXhPcmRlcj4ob3JkZXIpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0d28gbi1ncmFtcyBsZXhpY29ncmFwaGljYWxseSwgb25lIHdvcmQgYXQgYSB0aW1lLAorICAgICAqIGJlZ2lubmluZyB3aXRoIHRoZSBmaXJzdCB3b3JkIG9mIGVhY2ggbi1ncmFtIGFuZCBlbmRpbmcgd2l0aCB0aGUgbGFzdCB3b3JkIG9mIGVhY2ggbi1ncmFtLgorICAgICAqCisgICAgICogQHBhcmFtIGxocyBBIHBvaW50ZXIgdG8gdGhlIG4tZ3JhbSBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KKyAgICAgKiBAcGFyYW0gcmhzIEEgcG9pbnRlciB0byB0aGUgbi1ncmFtIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBDb21wYXJlKGNvbnN0IFdvcmRJbmRleCAqbGhzLCBjb25zdCBXb3JkSW5kZXggKnJocykgY29uc3QgeworICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG9yZGVyXzsgKytpKSB7CisgICAgICAgIGlmIChsaHNbaV0gIT0gcmhzW2ldKQorICAgICAgICAgIHJldHVybiBsaHNbaV0gPCByaHNbaV07CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtNYXRjaE9mZnNldCA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbQorCisjZW5kaWYgLy8gTE1fQ09NTU9OX0NPTVBBUkVfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2NvbW1vbi9qb2ludF9vcmRlci5oaCBiL3NyYy9rZW5sbS9sbS9jb21tb24vam9pbnRfb3JkZXIuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExM2JiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9jb21tb24vam9pbnRfb3JkZXIuaGgKQEAgLTAsMCArMSw3MSBAQAorI2lmbmRlZiBMTV9DT01NT05fSk9JTlRfT1JERVJfSAorI2RlZmluZSBMTV9DT01NT05fSk9JTlRfT1JERVJfSAorCisjaW5jbHVkZSAibG0vY29tbW9uL25ncmFtX3N0cmVhbS5oaCIKKyNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgInV0aWwvZml4ZWRfYXJyYXkuaGgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKworI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSBsbSB7CisKK3RlbXBsYXRlIDxjbGFzcyBDYWxsYmFjaywgY2xhc3MgQ29tcGFyZT4gdm9pZCBKb2ludE9yZGVyKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJnBvc2l0aW9ucywgQ2FsbGJhY2sgJmNhbGxiYWNrKSB7CisgIC8vIEFsbG93IG1hdGNoaW5nIHRvIHJlZmVyZW5jZSBzdHJlYW1zWy0xXS4KKyAgdXRpbDo6Rml4ZWRBcnJheTxQcm94eVN0cmVhbTxOR3JhbUhlYWRlcj4gPiBzdHJlYW1zX3dpdGhfZHVtbXkocG9zaXRpb25zLnNpemUoKSArIDEpOworICAvLyBBIGJvZ3VzIHN0cmVhbSBmb3IgWy0xXS4KKyAgc3RyZWFtc193aXRoX2R1bW15LnB1c2hfYmFjaygpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgcG9zaXRpb25zLnNpemUoKTsgKytpKSB7CisgICAgc3RyZWFtc193aXRoX2R1bW15LnB1c2hfYmFjayhwb3NpdGlvbnNbaV0sIE5HcmFtSGVhZGVyKE5VTEwsIGkgKyAxKSk7CisgIH0KKyAgUHJveHlTdHJlYW08TkdyYW1IZWFkZXI+ICpzdHJlYW1zID0gc3RyZWFtc193aXRoX2R1bW15LmJlZ2luKCkgKyAxOworCisgIHN0ZDo6c2l6ZV90IG9yZGVyOworICBmb3IgKG9yZGVyID0gMDsgb3JkZXIgPCBwb3NpdGlvbnMuc2l6ZSgpICYmIHN0cmVhbXNbb3JkZXJdOyArK29yZGVyKSB7fQorICBhc3NlcnQob3JkZXIpOyAvLyBzaG91bGQgYWx3YXlzIGhhdmUgPHVuaz4uCisKKyAgLy8gRGVidWdnaW5nIG9ubHk6IGNhbGwgY29tcGFyaXNvbiBmdW5jdGlvbiB0byBzYW5pdHkgY2hlY2sgb3JkZXIuCisjaWZkZWYgREVCVUcKKyAgdXRpbDo6Rml4ZWRBcnJheTxDb21wYXJlPiBsZXNzX2NvbXBhcmUob3JkZXIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb3JkZXI7ICsraSkKKyAgICBsZXNzX2NvbXBhcmUucHVzaF9iYWNrKGkgKyAxKTsKKyNlbmRpZiAvLyBERUJVRworCisgIHN0ZDo6c2l6ZV90IGN1cnJlbnQgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIERvZXMgdGhlIGNvbnRleHQgbWF0Y2ggdGhlIGxvd2VyIG9uZT8KKyAgICBpZiAoIW1lbWNtcChzdHJlYW1zW3N0YXRpY19jYXN0PGludD4oY3VycmVudCkgLSAxXS0+YmVnaW4oKSwgc3RyZWFtc1tjdXJyZW50XS0+YmVnaW4oKSArIENvbXBhcmU6OmtNYXRjaE9mZnNldCwgc2l6ZW9mKFdvcmRJbmRleCkgKiBjdXJyZW50KSkgeworICAgICAgY2FsbGJhY2suRW50ZXIoY3VycmVudCwgc3RyZWFtc1tjdXJyZW50XS5HZXQoKSk7CisgICAgICAvLyBUcmFuc2l0aW9uIHRvIGxvb2tpbmcgZm9yIGV4dGVuc2lvbnMuCisgICAgICBpZiAoKytjdXJyZW50IDwgb3JkZXIpIGNvbnRpbnVlOworICAgIH0KKyNpZmRlZiBERUJVRworICAgIC8vIG1hdGNoX2NoZWNrW2N1cnJlbnQgLSAxXSBtYXRjaGVzIGN1cnJlbnQtZ3JhbXMKKyAgICAvLyBUaGUgbG93ZXItb3JkZXIgc3RyZWFtICh3aGljaCBza2lwcyBmZXdlciBjdXJyZW50LWdyYW1zKSBzaG91bGQgYWx3YXlzIGJlIDw9IHRoZSBoaWdoZXIgb3JkZXItc3RyZWFtICh3aGljaCBjYW4gc2tpcCBjdXJyZW50LWdyYW1zKS4KKyAgICBlbHNlIGlmICghbGVzc19jb21wYXJlW2N1cnJlbnQgLSAxXShzdHJlYW1zW3N0YXRpY19jYXN0PGludD4oY3VycmVudCkgLSAxXS0+YmVnaW4oKSwgc3RyZWFtc1tjdXJyZW50XS0+YmVnaW4oKSArIENvbXBhcmU6OmtNYXRjaE9mZnNldCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiU3RyZWFtIG91dCBvZiBvcmRlciBkZXRlY3RlZCIgPDwgc3RkOjplbmRsOworICAgICAgYWJvcnQoKTsKKyAgICB9CisjZW5kaWYgLy8gREVCVUcKKyAgICAvLyBObyBleHRlbnNpb24gbGVmdC4KKyAgICB3aGlsZSh0cnVlKSB7CisgICAgICBhc3NlcnQoY3VycmVudCA+IDApOworICAgICAgLS1jdXJyZW50OworICAgICAgY2FsbGJhY2suRXhpdChjdXJyZW50LCBzdHJlYW1zW2N1cnJlbnRdLkdldCgpKTsKKworICAgICAgaWYgKCsrc3RyZWFtc1tjdXJyZW50XSkgYnJlYWs7CisKKyAgICAgIFVUSUxfVEhST1dfSUYob3JkZXIgIT0gY3VycmVudCArIDEsIEZvcm1hdExvYWRFeGNlcHRpb24sICJEZXRlY3RlZCBuLWdyYW0gd2l0aG91dCBtYXRjaGluZyBzdWZmaXgiKTsKKworICAgICAgb3JkZXIgPSBjdXJyZW50OworICAgICAgaWYgKCFvcmRlcikgcmV0dXJuOworICAgIH0KKyAgfQorfQorCit9IC8vIG5hbWVzcGFjZXMKKworI2VuZGlmIC8vIExNX0NPTU1PTl9KT0lOVF9PUkRFUl9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vY29tbW9uL21vZGVsX2J1ZmZlci5jYyBiL3NyYy9rZW5sbS9sbS9jb21tb24vbW9kZWxfYnVmZmVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOWIwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vY29tbW9uL21vZGVsX2J1ZmZlci5jYwpAQCAtMCwwICsxLDkxIEBACisjaW5jbHVkZSAibG0vY29tbW9uL21vZGVsX2J1ZmZlci5oaCIKKyNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfc3RyZWFtLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vaW8uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vbXVsdGlfc3RyZWFtLmhoIgorCisjaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KKworbmFtZXNwYWNlIGxtIHsKKworbmFtZXNwYWNlIHsKK2NvbnN0IGNoYXIga01ldGFkYXRhSGVhZGVyW10gPSAiS2VuTE0gaW50ZXJtZWRpYXRlIGJpbmFyeSBmaWxlIjsKK30gLy8gbmFtZXNwYWNlCisKK01vZGVsQnVmZmVyOjpNb2RlbEJ1ZmZlcihTdHJpbmdQaWVjZSBmaWxlX2Jhc2UsIGJvb2wga2VlcF9idWZmZXIsIGJvb2wgb3V0cHV0X3EpCisgIDogZmlsZV9iYXNlXyhmaWxlX2Jhc2UuZGF0YSgpLCBmaWxlX2Jhc2Uuc2l6ZSgpKSwga2VlcF9idWZmZXJfKGtlZXBfYnVmZmVyKSwgb3V0cHV0X3FfKG91dHB1dF9xKSwKKyAgICB2b2NhYl9maWxlXyhrZWVwX2J1ZmZlciA/IHV0aWw6OkNyZWF0ZU9yVGhyb3coKGZpbGVfYmFzZV8gKyAiLnZvY2FiIikuY19zdHIoKSkgOiB1dGlsOjpNYWtlVGVtcChmaWxlX2Jhc2VfKSkge30KKyAgCitNb2RlbEJ1ZmZlcjo6TW9kZWxCdWZmZXIoU3RyaW5nUGllY2UgZmlsZV9iYXNlKQorICA6IGZpbGVfYmFzZV8oZmlsZV9iYXNlLmRhdGEoKSwgZmlsZV9iYXNlLnNpemUoKSksIGtlZXBfYnVmZmVyXyhmYWxzZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBmdWxsX25hbWUgPSBmaWxlX2Jhc2VfICsgIi5rZW5sbV9pbnRlcm1lZGlhdGUiOworICB1dGlsOjpGaWxlUGllY2UgaW4oZnVsbF9uYW1lLmNfc3RyKCkpOworICBTdHJpbmdQaWVjZSB0b2tlbiA9IGluLlJlYWRMaW5lKCk7CisgIFVUSUxfVEhST1dfSUYyKHRva2VuICE9IGtNZXRhZGF0YUhlYWRlciwgIkZpbGUgIiA8PCBmdWxsX25hbWUgPDwgIiBiZWdpbnMgd2l0aCBcIiIgPDwgdG9rZW4gPDwgIlwiIG5vdCAiIDw8IGtNZXRhZGF0YUhlYWRlcik7CisKKyAgdG9rZW4gPSBpbi5SZWFkRGVsaW1pdGVkKCk7CisgIFVUSUxfVEhST1dfSUYyKHRva2VuICE9ICJDb3VudHMiLCAiRXhwZWN0ZWQgQ291bnRzLCBnb3QgXCIiIDw8IHRva2VuIDw8ICJcIiBpbiAiIDw8IGZ1bGxfbmFtZSk7CisgIGNoYXIgZ290OworICB3aGlsZSAoKGdvdCA9IGluLmdldCgpKSA9PSAnICcpIHsKKyAgICBjb3VudHNfLnB1c2hfYmFjayhpbi5SZWFkVUxvbmcoKSk7CisgIH0KKyAgVVRJTF9USFJPV19JRjIoZ290ICE9ICdcbicsICJFeHBlY3RlZCBuZXdsaW5lIGF0IGVuZCBvZiBjb3VudHMuIik7CisKKyAgdG9rZW4gPSBpbi5SZWFkRGVsaW1pdGVkKCk7CisgIFVUSUxfVEhST1dfSUYyKHRva2VuICE9ICJQYXlsb2FkIiwgIkV4cGVjdGVkIFBheWxvYWQsIGdvdCBcIiIgPDwgdG9rZW4gPDwgIlwiIGluICIgPDwgZnVsbF9uYW1lKTsKKyAgdG9rZW4gPSBpbi5SZWFkRGVsaW1pdGVkKCk7CisgIGlmICh0b2tlbiA9PSAicSIpIHsKKyAgICBvdXRwdXRfcV8gPSB0cnVlOworICB9IGVsc2UgaWYgKHRva2VuID09ICJwYiIpIHsKKyAgICBvdXRwdXRfcV8gPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBVVElMX1RIUk9XKHV0aWw6OkV4Y2VwdGlvbiwgIlVua25vd24gcGF5bG9hZCAiIDw8IHRva2VuKTsKKyAgfQorCisgIHZvY2FiX2ZpbGVfLnJlc2V0KHV0aWw6Ok9wZW5SZWFkT3JUaHJvdygoZmlsZV9iYXNlXyArICIudm9jYWIiKS5jX3N0cigpKSk7CisKKyAgZmlsZXNfLkluaXQoY291bnRzXy5zaXplKCkpOworICBmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IDA7IGkgPCBjb3VudHNfLnNpemUoKTsgKytpKSB7CisgICAgZmlsZXNfLnB1c2hfYmFjayh1dGlsOjpPcGVuUmVhZE9yVGhyb3coKGZpbGVfYmFzZV8gKyAnLicgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihpICsgMSkpLmNfc3RyKCkpKTsKKyAgfQorfQorCit2b2lkIE1vZGVsQnVmZmVyOjpTaW5rKHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZjaGFpbnMsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzKSB7CisgIGNvdW50c18gPSBjb3VudHM7CisgIC8vIE9wZW4gZmlsZXMuCisgIGZpbGVzXy5Jbml0KGNoYWlucy5zaXplKCkpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgY2hhaW5zLnNpemUoKTsgKytpKSB7CisgICAgaWYgKGtlZXBfYnVmZmVyXykgeworICAgICAgZmlsZXNfLnB1c2hfYmFjayh1dGlsOjpDcmVhdGVPclRocm93KAorICAgICAgICAgICAgKGZpbGVfYmFzZV8gKyAnLicgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihpICsgMSkpLmNfc3RyKCkKKyAgICAgICAgICAgICkpOworICAgIH0gZWxzZSB7CisgICAgICBmaWxlc18ucHVzaF9iYWNrKHV0aWw6Ok1ha2VUZW1wKGZpbGVfYmFzZV8pKTsKKyAgICB9CisgICAgY2hhaW5zW2ldID4+IHV0aWw6OnN0cmVhbTo6V3JpdGUoZmlsZXNfLmJhY2soKS5nZXQoKSk7CisgIH0KKyAgaWYgKGtlZXBfYnVmZmVyXykgeworICAgIHV0aWw6OnNjb3BlZF9mZCBtZXRhZGF0YSh1dGlsOjpDcmVhdGVPclRocm93KChmaWxlX2Jhc2VfICsgIi5rZW5sbV9pbnRlcm1lZGlhdGUiKS5jX3N0cigpKSk7CisgICAgdXRpbDo6RmlsZVN0cmVhbSBtZXRhKG1ldGFkYXRhLmdldCgpLCAyMDApOworICAgIG1ldGEgPDwga01ldGFkYXRhSGVhZGVyIDw8ICJcbkNvdW50cyI7CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx1aW50NjRfdD46OmNvbnN0X2l0ZXJhdG9yIGkgPSBjb3VudHNfLmJlZ2luKCk7IGkgIT0gY291bnRzXy5lbmQoKTsgKytpKSB7CisgICAgICBtZXRhIDw8ICcgJyA8PCAqaTsKKyAgICB9CisgICAgbWV0YSA8PCAiXG5QYXlsb2FkICIgPDwgKG91dHB1dF9xXyA/ICJxIiA6ICJwYiIpIDw8ICdcbic7CisgIH0KK30KKwordm9pZCBNb2RlbEJ1ZmZlcjo6U291cmNlKHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZjaGFpbnMpIHsKKyAgYXNzZXJ0KGNoYWlucy5zaXplKCkgPD0gZmlsZXNfLnNpemUoKSk7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY2hhaW5zLnNpemUoKTsgKytpKSB7CisgICAgY2hhaW5zW2ldID4+IHV0aWw6OnN0cmVhbTo6UFJlYWQoZmlsZXNfW2ldLmdldCgpKTsKKyAgfQorfQorCit2b2lkIE1vZGVsQnVmZmVyOjpTb3VyY2Uoc3RkOjpzaXplX3Qgb3JkZXJfbWludXNfMSwgdXRpbDo6c3RyZWFtOjpDaGFpbiAmY2hhaW4pIHsKKyAgY2hhaW4gPj4gdXRpbDo6c3RyZWFtOjpQUmVhZChmaWxlc19bb3JkZXJfbWludXNfMV0uZ2V0KCkpOworfQorCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2NvbW1vbi9tb2RlbF9idWZmZXIuaGggYi9zcmMva2VubG0vbG0vY29tbW9uL21vZGVsX2J1ZmZlci5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjY2MmJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2NvbW1vbi9tb2RlbF9idWZmZXIuaGgKQEAgLTAsMCArMSw2MyBAQAorI2lmbmRlZiBMTV9DT01NT05fTU9ERUxfQlVGRkVSX0gKKyNkZWZpbmUgTE1fQ09NTU9OX01PREVMX0JVRkZFUl9ICisKKy8qIEZvcm1hdCB3aXRoIHNlcGFyYXRlIGZpbGVzIGluIHN1ZmZpeCBvcmRlci4gIEVhY2ggZmlsZSBjb250YWlucworICogbi1ncmFtcyBvZiB0aGUgc2FtZSBvcmRlci4KKyAqLworCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvZml4ZWRfYXJyYXkuaGgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0geworY2xhc3MgQ2hhaW5zOworY2xhc3MgQ2hhaW47Cit9fSAvLyBuYW1lc3BhY2VzCisKK25hbWVzcGFjZSBsbSB7CisKK2NsYXNzIE1vZGVsQnVmZmVyIHsKKyAgcHVibGljOgorICAgIC8vIENvbnN0cnVjdCBmb3Igd3JpdGluZy4gIE11c3QgY2FsbCBWb2NhYkZpbGUoKSBhbmQgZmlsbCBpdCB3aXRoIG51bGwtZGVsaW1pdGVkIHZvY2FiIHdvcmRzLgorICAgIE1vZGVsQnVmZmVyKFN0cmluZ1BpZWNlIGZpbGVfYmFzZSwgYm9vbCBrZWVwX2J1ZmZlciwgYm9vbCBvdXRwdXRfcSk7CisKKyAgICAvLyBMb2FkIGZyb20gZmlsZS4KKyAgICBleHBsaWNpdCBNb2RlbEJ1ZmZlcihTdHJpbmdQaWVjZSBmaWxlX2Jhc2UpOworCisgICAgLy8gTXVzdCBjYWxsIFZvY2FiRmlsZSBhbmQgcG9wdWxhdGUgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICB2b2lkIFNpbmsodXRpbDo6c3RyZWFtOjpDaGFpbnMgJmNoYWlucywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMpOworCisgICAgLy8gUmVhZCBmaWxlcyBhbmQgd3JpdGUgdG8gdGhlIGdpdmVuIGNoYWlucy4gIElmIGZld2VyIGNoYWlucyBhcmUgcHJvdmlkZWQsCisgICAgLy8gb25seSBkbyB0aGUgbG93ZXIgb3JkZXJzLgorICAgIHZvaWQgU291cmNlKHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZjaGFpbnMpOworCisgICAgdm9pZCBTb3VyY2Uoc3RkOjpzaXplX3Qgb3JkZXJfbWludXNfMSwgdXRpbDo6c3RyZWFtOjpDaGFpbiAmY2hhaW4pOworCisgICAgLy8gVGhlIG9yZGVyIG9mIHRoZSBuLWdyYW0gbW9kZWwgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsIGJ1ZmZlci4KKyAgICBzdGQ6OnNpemVfdCBPcmRlcigpIGNvbnN0IHsgcmV0dXJuIGNvdW50c18uc2l6ZSgpOyB9CisgICAgLy8gUmVxdWlyZXMgU2luayBvciBsb2FkIGZyb20gZmlsZS4KKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJkNvdW50cygpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghY291bnRzXy5lbXB0eSgpKTsKKyAgICAgIHJldHVybiBjb3VudHNfOworICAgIH0KKworICAgIGludCBWb2NhYkZpbGUoKSBjb25zdCB7IHJldHVybiB2b2NhYl9maWxlXy5nZXQoKTsgfQorICAgIGludCBTdGVhbFZvY2FiRmlsZSgpIHsgcmV0dXJuIHZvY2FiX2ZpbGVfLnJlbGVhc2UoKTsgfQorCisgICAgYm9vbCBLZWVwKCkgY29uc3QgeyByZXR1cm4ga2VlcF9idWZmZXJfOyB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX2Jhc2VfOworICAgIGNvbnN0IGJvb2wga2VlcF9idWZmZXJfOworICAgIGJvb2wgb3V0cHV0X3FfOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBjb3VudHNfOworCisgICAgdXRpbDo6c2NvcGVkX2ZkIHZvY2FiX2ZpbGVfOworICAgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c2NvcGVkX2ZkPiBmaWxlc187Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbQorCisjZW5kaWYgLy8gTE1fQ09NTU9OX01PREVMX0JVRkZFUl9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vY29tbW9uL25ncmFtLmhoIGIvc3JjL2tlbmxtL2xtL2NvbW1vbi9uZ3JhbS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTZkMWMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2NvbW1vbi9uZ3JhbS5oaApAQCAtMCwwICsxLDc3IEBACisjaWZuZGVmIExNX0NPTU1PTl9OR1JBTV9ICisjZGVmaW5lIExNX0NPTU1PTl9OR1JBTV9ICisKKyNpbmNsdWRlICJsbS93ZWlnaHRzLmhoIgorI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxtIHsKKworY2xhc3MgTkdyYW1IZWFkZXIgeworICBwdWJsaWM6CisgICAgTkdyYW1IZWFkZXIodm9pZCAqYmVnaW4sIHN0ZDo6c2l6ZV90IG9yZGVyKQorICAgICAgOiBiZWdpbl8oc3RhdGljX2Nhc3Q8V29yZEluZGV4Kj4oYmVnaW4pKSwgZW5kXyhiZWdpbl8gKyBvcmRlcikge30KKworICAgIE5HcmFtSGVhZGVyKCkgOiBiZWdpbl8oTlVMTCksIGVuZF8oTlVMTCkge30KKworICAgIGNvbnN0IHVpbnQ4X3QgKkJhc2UoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihiZWdpbl8pOyB9CisgICAgdWludDhfdCAqQmFzZSgpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJlZ2luXyk7IH0KKworICAgIHZvaWQgUmVCYXNlKHZvaWQgKnRvKSB7CisgICAgICBzdGQ6OnNpemVfdCBkaWZmZXJlbmNlID0gZW5kXyAtIGJlZ2luXzsKKyAgICAgIGJlZ2luXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8V29yZEluZGV4Kj4odG8pOworICAgICAgZW5kXyA9IGJlZ2luXyArIGRpZmZlcmVuY2U7CisgICAgfQorCisgICAgLy8gVGhlc2UgYXJlIGZvciB0aGUgdm9jYWIgaW5kZXguCisgICAgLy8gTG93ZXItY2FzZSBpbiBkZWZlcmVuY2UgdG8gU1RMLgorICAgIGNvbnN0IFdvcmRJbmRleCAqYmVnaW4oKSBjb25zdCB7IHJldHVybiBiZWdpbl87IH0KKyAgICBXb3JkSW5kZXggKmJlZ2luKCkgeyByZXR1cm4gYmVnaW5fOyB9CisgICAgY29uc3QgV29yZEluZGV4ICplbmQoKSBjb25zdCB7IHJldHVybiBlbmRfOyB9CisgICAgV29yZEluZGV4ICplbmQoKSB7IHJldHVybiBlbmRfOyB9CisKKyAgICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kXyAtIGJlZ2luXzsgfQorICAgIHN0ZDo6c2l6ZV90IE9yZGVyKCkgY29uc3QgeyByZXR1cm4gZW5kXyAtIGJlZ2luXzsgfQorCisgIHByaXZhdGU6CisgICAgV29yZEluZGV4ICpiZWdpbl8sICplbmRfOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFBheWxvYWRUPiBjbGFzcyBOR3JhbSA6IHB1YmxpYyBOR3JhbUhlYWRlciB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFBheWxvYWRUIFBheWxvYWQ7CisKKyAgICBOR3JhbSgpIDogTkdyYW1IZWFkZXIoTlVMTCwgMCkge30KKworICAgIE5HcmFtKHZvaWQgKmJlZ2luLCBzdGQ6OnNpemVfdCBvcmRlcikgOiBOR3JhbUhlYWRlcihiZWdpbiwgb3JkZXIpIHt9CisKKyAgICAvLyBXb3VsZCBkbyBvcGVyYXRvcisrIGJ1dCB0aGF0IGNhbiBnZXQgY29uZnVzaW5nIGZvciBhIHN0cmVhbS4KKyAgICB2b2lkIE5leHRJbk1lbW9yeSgpIHsKKyAgICAgIFJlQmFzZSgmVmFsdWUoKSArIDEpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnNpemVfdCBUb3RhbFNpemUoc3RkOjpzaXplX3Qgb3JkZXIpIHsKKyAgICAgIHJldHVybiBvcmRlciAqIHNpemVvZihXb3JkSW5kZXgpICsgc2l6ZW9mKFBheWxvYWQpOworICAgIH0KKyAgICBzdGQ6OnNpemVfdCBUb3RhbFNpemUoKSBjb25zdCB7CisgICAgICAvLyBDb21waWxlciBzaG91bGQgb3B0aW1pemUgdGhpcy4KKyAgICAgIHJldHVybiBUb3RhbFNpemUoT3JkZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c2l6ZV90IE9yZGVyRnJvbVNpemUoc3RkOjpzaXplX3Qgc2l6ZSkgeworICAgICAgc3RkOjpzaXplX3QgcmV0ID0gKHNpemUgLSBzaXplb2YoUGF5bG9hZCkpIC8gc2l6ZW9mKFdvcmRJbmRleCk7CisgICAgICBhc3NlcnQoc2l6ZSA9PSBUb3RhbFNpemUocmV0KSk7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGNvbnN0IFBheWxvYWQgJlZhbHVlKCkgY29uc3QgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUGF5bG9hZCAqPihlbmQoKSk7IH0KKyAgICBQYXlsb2FkICZWYWx1ZSgpIHsgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFBheWxvYWQgKj4oZW5kKCkpOyB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbQorCisjZW5kaWYgLy8gTE1fQ09NTU9OX05HUkFNX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9jb21tb24vbmdyYW1fc3RyZWFtLmhoIGIvc3JjL2tlbmxtL2xtL2NvbW1vbi9uZ3JhbV9zdHJlYW0uaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkZjM2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9jb21tb24vbmdyYW1fc3RyZWFtLmhoCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgTE1fQlVJTERFUl9OR1JBTV9TVFJFQU1fSAorI2RlZmluZSBMTV9CVUlMREVSX05HUkFNX1NUUkVBTV9ICisKKyNpbmNsdWRlICJsbS9jb21tb24vbmdyYW0uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY2hhaW4uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vbXVsdGlfc3RyZWFtLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL3N0cmVhbS5oaCIKKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbSB7CisKK3RlbXBsYXRlIDxjbGFzcyBQcm94eT4gY2xhc3MgUHJveHlTdHJlYW0geworICBwdWJsaWM6CisgICAgLy8gTWFrZSBhbiBpbnZhbGlkIHN0cmVhbS4KKyAgICBQcm94eVN0cmVhbSgpIHt9CisKKyAgICBleHBsaWNpdCBQcm94eVN0cmVhbShjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnBvc2l0aW9uLCBjb25zdCBQcm94eSAmcHJveHkgPSBQcm94eSgpKQorICAgICAgOiBwcm94eV8ocHJveHkpLCBzdHJlYW1fKHBvc2l0aW9uKSB7CisgICAgICBwcm94eV8uUmVCYXNlKHN0cmVhbV8uR2V0KCkpOworICAgIH0KKworICAgIFByb3h5ICZvcGVyYXRvciooKSB7IHJldHVybiBwcm94eV87IH0KKyAgICBjb25zdCBQcm94eSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gcHJveHlfOyB9CisKKyAgICBQcm94eSAqb3BlcmF0b3ItPigpIHsgcmV0dXJuICZwcm94eV87IH0KKyAgICBjb25zdCBQcm94eSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZwcm94eV87IH0KKworICAgIHZvaWQgKkdldCgpIHsgcmV0dXJuIHN0cmVhbV8uR2V0KCk7IH0KKyAgICBjb25zdCB2b2lkICpHZXQoKSBjb25zdCB7IHJldHVybiBzdHJlYW1fLkdldCgpOyB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gc3RyZWFtXzsgfQorICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gIXN0cmVhbV87IH0KKyAgICB2b2lkIFBvaXNvbigpIHsgc3RyZWFtXy5Qb2lzb24oKTsgfQorCisgICAgUHJveHlTdHJlYW08UHJveHk+ICZvcGVyYXRvcisrKCkgeworICAgICAgKytzdHJlYW1fOworICAgICAgcHJveHlfLlJlQmFzZShzdHJlYW1fLkdldCgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBQcm94eSBwcm94eV87CisgICAgdXRpbDo6c3RyZWFtOjpTdHJlYW0gc3RyZWFtXzsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBQYXlsb2FkPiBjbGFzcyBOR3JhbVN0cmVhbSA6IHB1YmxpYyBQcm94eVN0cmVhbTxOR3JhbTxQYXlsb2FkPiA+IHsKKyAgcHVibGljOgorICAgIC8vIE1ha2UgYW4gaW52YWxpZCBzdHJlYW0uCisgICAgTkdyYW1TdHJlYW0oKSB7fQorCisgICAgZXhwbGljaXQgTkdyYW1TdHJlYW0oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgOgorICAgICAgUHJveHlTdHJlYW08TkdyYW08UGF5bG9hZD4gPihwb3NpdGlvbiwgTkdyYW08UGF5bG9hZD4oTlVMTCwgTkdyYW08UGF5bG9hZD46Ok9yZGVyRnJvbVNpemUocG9zaXRpb24uR2V0Q2hhaW4oKS5FbnRyeVNpemUoKSkpKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFBheWxvYWQ+IGNsYXNzIE5HcmFtU3RyZWFtcyA6IHB1YmxpYyB1dGlsOjpzdHJlYW06OkdlbmVyaWNTdHJlYW1zPE5HcmFtU3RyZWFtPFBheWxvYWQ+ID4geworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdXRpbDo6c3RyZWFtOjpHZW5lcmljU3RyZWFtczxOR3JhbVN0cmVhbTxQYXlsb2FkPiA+IFA7CisgIHB1YmxpYzoKKyAgICBOR3JhbVN0cmVhbXMoKSA6IFAoKSB7fQorICAgIE5HcmFtU3RyZWFtcyhjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zICZwb3NpdGlvbnMpIDogUChwb3NpdGlvbnMpIHt9Cit9OworCit9IC8vIG5hbWVzcGFjZQorI2VuZGlmIC8vIExNX0JVSUxERVJfTkdSQU1fU1RSRUFNX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9jb21tb24vcHJpbnQuY2MgYi9zcmMva2VubG0vbG0vY29tbW9uL3ByaW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOGI2MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vY29tbW9uL3ByaW50LmNjCkBAIC0wLDAgKzEsNjIgQEAKKyNpbmNsdWRlICJsbS9jb21tb24vcHJpbnQuaGgiCisKKyNpbmNsdWRlICJsbS9jb21tb24vbmdyYW1fc3RyZWFtLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZV9zdHJlYW0uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvbW1hcC5oaCIKKyNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxtIHsKKworVm9jYWJSZWNvbnN0aXR1dGU6OlZvY2FiUmVjb25zdGl0dXRlKGludCBmZCkgeworICB1aW50NjRfdCBzaXplID0gdXRpbDo6U2l6ZU9yVGhyb3coZmQpOworICB1dGlsOjpNYXBSZWFkKHV0aWw6OlBPUFVMQVRFX09SX1JFQUQsIGZkLCAwLCBzaXplLCBtZW1vcnlfKTsKKyAgY29uc3QgY2hhciAqY29uc3Qgc3RhcnQgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4obWVtb3J5Xy5nZXQoKSk7CisgIGNvbnN0IGNoYXIgKmk7CisgIGZvciAoaSA9IHN0YXJ0OyBpICE9IHN0YXJ0ICsgc2l6ZTsgaSArPSBzdHJsZW4oaSkgKyAxKSB7CisgICAgbWFwXy5wdXNoX2JhY2soaSk7CisgIH0KKyAgLy8gTGFzdCBvbmUgZm9yIExvb2t1cFBpZWNlLgorICBtYXBfLnB1c2hfYmFjayhpKTsKK30KKworbmFtZXNwYWNlIHsKK3RlbXBsYXRlIDxjbGFzcyBQYXlsb2FkPiB2b2lkIFByaW50TGVhZChjb25zdCBWb2NhYlJlY29uc3RpdHV0ZSAmdm9jYWIsIFByb3h5U3RyZWFtPFBheWxvYWQ+ICZzdHJlYW0sIHV0aWw6OkZpbGVTdHJlYW0gJm91dCkgeworICBvdXQgPDwgc3RyZWFtLT5WYWx1ZSgpLnByb2IgPDwgJ1x0JyA8PCB2b2NhYi5Mb29rdXAoKnN0cmVhbS0+YmVnaW4oKSk7CisgIGZvciAoY29uc3QgV29yZEluZGV4ICppID0gc3RyZWFtLT5iZWdpbigpICsgMTsgaSAhPSBzdHJlYW0tPmVuZCgpOyArK2kpIHsKKyAgICBvdXQgPDwgJyAnIDw8IHZvY2FiLkxvb2t1cCgqaSk7CisgIH0KK30KK30gLy8gbmFtZXNwYWNlCisKK3ZvaWQgUHJpbnRBUlBBOjpSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyAmcG9zaXRpb25zKSB7CisgIFZvY2FiUmVjb25zdGl0dXRlIHZvY2FiKHZvY2FiX2ZkXyk7CisgIHV0aWw6OkZpbGVTdHJlYW0gb3V0KG91dF9mZF8pOworICBvdXQgPDwgIlxcZGF0YVxcXG4iOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvc2l0aW9ucy5zaXplKCk7ICsraSkgeworICAgIG91dCA8PCAibmdyYW0gIiA8PCAoaSsxKSA8PCAnPScgPDwgY291bnRzX1tpXSA8PCAnXG4nOworICB9CisgIG91dCA8PCAnXG4nOworCisgIGZvciAodW5zaWduZWQgb3JkZXIgPSAxOyBvcmRlciA8IHBvc2l0aW9ucy5zaXplKCk7ICsrb3JkZXIpIHsKKyAgICBvdXQgPDwgIlxcIiA8PCBvcmRlciA8PCAiLWdyYW1zOiIgPDwgJ1xuJzsKKyAgICBmb3IgKFByb3h5U3RyZWFtPE5HcmFtPFByb2JCYWNrb2ZmPiA+IHN0cmVhbShwb3NpdGlvbnNbb3JkZXIgLSAxXSwgTkdyYW08UHJvYkJhY2tvZmY+KE5VTEwsIG9yZGVyKSk7IHN0cmVhbTsgKytzdHJlYW0pIHsKKyAgICAgIFByaW50TGVhZCh2b2NhYiwgc3RyZWFtLCBvdXQpOworICAgICAgb3V0IDw8ICdcdCcgPDwgc3RyZWFtLT5WYWx1ZSgpLmJhY2tvZmYgPDwgJ1xuJzsKKyAgICB9CisgICAgb3V0IDw8ICdcbic7CisgIH0KKworICBvdXQgPDwgIlxcIiA8PCBwb3NpdGlvbnMuc2l6ZSgpIDw8ICItZ3JhbXM6IiA8PCAnXG4nOworICBmb3IgKFByb3h5U3RyZWFtPE5HcmFtPFByb2I+ID4gc3RyZWFtKHBvc2l0aW9ucy5iYWNrKCksIE5HcmFtPFByb2I+KE5VTEwsIHBvc2l0aW9ucy5zaXplKCkpKTsgc3RyZWFtOyArK3N0cmVhbSkgeworICAgIFByaW50TGVhZCh2b2NhYiwgc3RyZWFtLCBvdXQpOworICAgIG91dCA8PCAnXG4nOworICB9CisgIG91dCA8PCAnXG4nOworICBvdXQgPDwgIlxcZW5kXFxcbiI7Cit9CisKK30gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vY29tbW9uL3ByaW50LmhoIGIvc3JjL2tlbmxtL2xtL2NvbW1vbi9wcmludC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWEwOGIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2NvbW1vbi9wcmludC5oaApAQCAtMCwwICsxLDU4IEBACisjaWZuZGVmIExNX0NPTU1PTl9QUklOVF9ICisjZGVmaW5lIExNX0NPTU1PTl9QUklOVF9ICisKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorI2luY2x1ZGUgInV0aWwvbW1hcC5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmluZ19waWVjZS5oaCIKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0geyBjbGFzcyBDaGFpblBvc2l0aW9uczsgfX0KKworLy8gV2FybmluZzogUHJpbnRBUlBBIHJvdXRpbmVzIHJlYWQgYWxsIHVuaWdyYW1zIGJlZm9yZSBhbGwgYmlncmFtcyBiZWZvcmUgYWxsCisvLyB0cmlncmFtcyBldGMuICBTbyBpZiBvdGhlciBwYXJ0cyBvZiB0aGUgY2hhaW4gbW92ZSBqb2ludGx5LCB5b3UnbGwgaGF2ZSB0bworLy8gYnVmZmVyLgorCituYW1lc3BhY2UgbG0geworCitjbGFzcyBWb2NhYlJlY29uc3RpdHV0ZSB7CisgIHB1YmxpYzoKKyAgICAvLyBmZCBtdXN0IGJlIGFsaXZlIGZvciBsaWZlIG9mIHRoaXMgb2JqZWN0OyBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcC4KKyAgICBleHBsaWNpdCBWb2NhYlJlY29uc3RpdHV0ZShpbnQgZmQpOworCisgICAgY29uc3QgY2hhciAqTG9va3VwKFdvcmRJbmRleCBpbmRleCkgY29uc3QgeworICAgICAgYXNzZXJ0KGluZGV4IDwgbWFwXy5zaXplKCkgLSAxKTsKKyAgICAgIHJldHVybiBtYXBfW2luZGV4XTsKKyAgICB9CisKKyAgICBTdHJpbmdQaWVjZSBMb29rdXBQaWVjZShXb3JkSW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTdHJpbmdQaWVjZShtYXBfW2luZGV4XSwgbWFwX1tpbmRleCArIDFdIC0gMSAtIG1hcF9baW5kZXhdKTsKKyAgICB9CisKKyAgICBzdGQ6OnNpemVfdCBTaXplKCkgY29uc3QgeworICAgICAgLy8gVGhlcmUncyBhbiBleHRyYSBlbnRyeSB0byBzdXBwb3J0IFN0cmluZ1BpZWNlIGxlbmd0aHMuCisgICAgICByZXR1cm4gbWFwXy5zaXplKCkgLSAxOworICAgIH0KKworICBwcml2YXRlOgorICAgIHV0aWw6OnNjb3BlZF9tZW1vcnkgbWVtb3J5XzsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gbWFwXzsKK307CisKK2NsYXNzIFByaW50QVJQQSB7CisgIHB1YmxpYzoKKyAgICAvLyBEb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB2b2NhYl9mZCBvciBvdXRfZmQuCisgICAgZXhwbGljaXQgUHJpbnRBUlBBKGludCB2b2NhYl9mZCwgaW50IG91dF9mZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMpCisgICAgICA6IHZvY2FiX2ZkXyh2b2NhYl9mZCksIG91dF9mZF8ob3V0X2ZkKSwgY291bnRzXyhjb3VudHMpIHt9CisKKyAgICB2b2lkIFJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zICZwb3NpdGlvbnMpOworCisgIHByaXZhdGU6CisgICAgaW50IHZvY2FiX2ZkXzsKKyAgICBpbnQgb3V0X2ZkXzsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRzXzsKK307CisKK30gLy8gbmFtZXNwYWNlIGxtCisjZW5kaWYgLy8gTE1fQ09NTU9OX1BSSU5UX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9jb21tb24vcmVudW1iZXIuY2MgYi9zcmMva2VubG0vbG0vY29tbW9uL3JlbnVtYmVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MzJhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vY29tbW9uL3JlbnVtYmVyLmNjCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlICJsbS9jb21tb24vcmVudW1iZXIuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL25ncmFtLmhoIgorCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vc3RyZWFtLmhoIgorCituYW1lc3BhY2UgbG0geworCit2b2lkIFJlbnVtYmVyOjpSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICBmb3IgKHV0aWw6OnN0cmVhbTo6U3RyZWFtIHN0cmVhbShwb3NpdGlvbik7IHN0cmVhbTsgKytzdHJlYW0pIHsKKyAgICBOR3JhbUhlYWRlciBncmFtKHN0cmVhbS5HZXQoKSwgb3JkZXJfKTsKKyAgICBmb3IgKFdvcmRJbmRleCAqdyA9IGdyYW0uYmVnaW4oKTsgdyAhPSBncmFtLmVuZCgpOyArK3cpIHsKKyAgICAgICp3ID0gbmV3X251bWJlcnNfWyp3XTsKKyAgICB9CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgbG0KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9jb21tb24vcmVudW1iZXIuaGggYi9zcmMva2VubG0vbG0vY29tbW9uL3JlbnVtYmVyLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjVjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vY29tbW9uL3JlbnVtYmVyLmhoCkBAIC0wLDAgKzEsMzAgQEAKKy8qIE1hcCB2b2NhYiBpZHMuICBUaGlzIGlzIHVzZWZ1bCB0byBtZXJnZSBpbmRlcGVuZGVudGx5IGNvbGxlY3RlZCBjb3VudHMgb3IKKyAqIGNoYW5nZSB0aGUgdm9jYWIgaWRzIHRvIHRoZSBvcmRlciB1c2VkIGJ5IHRoZSB0cmllLgorICovCisjaWZuZGVmIExNX0NPTU1PTl9SRU5VTUJFUl9ICisjZGVmaW5lIExNX0NPTU1PTl9SRU5VTUJFUl9ICisKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIHV0aWwgeyBuYW1lc3BhY2Ugc3RyZWFtIHsgY2xhc3MgQ2hhaW5Qb3NpdGlvbjsgfX0KKworbmFtZXNwYWNlIGxtIHsKKworY2xhc3MgUmVudW1iZXIgeworICBwdWJsaWM6CisgICAgLy8gQXNzdW1lcyB0aGUgYXJyYXkgaXMgbGFyZ2UgZW5vdWdoIHRvIG1hcCBhbGwgd29yZHMgYW5kIHN0YXlzIGFsaXZlIHdoaWxlCisgICAgLy8gdGhlIHRocmVhZCBpcyBhY3RpdmUuCisgICAgUmVudW1iZXIoY29uc3QgV29yZEluZGV4ICpuZXdfbnVtYmVycywgc3RkOjpzaXplX3Qgb3JkZXIpCisgICAgICA6IG5ld19udW1iZXJzXyhuZXdfbnVtYmVycyksIG9yZGVyXyhvcmRlcikge30KKworICAgIHZvaWQgUnVuKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pOworCisgIHByaXZhdGU6CisgICAgY29uc3QgV29yZEluZGV4ICpuZXdfbnVtYmVyc187CisgICAgc3RkOjpzaXplX3Qgb3JkZXJfOworfTsKKworfSAvLyBuYW1lc3BhY2UgbG0KKyNlbmRpZiAvLyBMTV9DT01NT05fUkVOVU1CRVJfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2NvbW1vbi9zaXplX29wdGlvbi5jYyBiL3NyYy9rZW5sbS9sbS9jb21tb24vc2l6ZV9vcHRpb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhOTIwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9jb21tb24vc2l6ZV9vcHRpb24uY2MKQEAgLTAsMCArMSwyNCBAQAorI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+CisjaW5jbHVkZSAidXRpbC91c2FnZS5oaCIKKworbmFtZXNwYWNlIGxtIHsKKworbmFtZXNwYWNlIHsKK2NsYXNzIFNpemVOb3RpZnkgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgU2l6ZU5vdGlmeShzdGQ6OnNpemVfdCAmb3V0KSA6IGJlaGluZF8ob3V0KSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nICZmcm9tKSB7CisgICAgICBiZWhpbmRfID0gdXRpbDo6UGFyc2VTaXplKGZyb20pOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6c2l6ZV90ICZiZWhpbmRfOworfTsKK30KKworYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dHlwZWRfdmFsdWU8c3RkOjpzdHJpbmc+ICpTaXplT3B0aW9uKHN0ZDo6c2l6ZV90ICZ0bywgY29uc3QgY2hhciAqZGVmYXVsdF92YWx1ZSkgeworICByZXR1cm4gYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RkOjpzdHJpbmc+KCktPm5vdGlmaWVyKFNpemVOb3RpZnkodG8pKS0+ZGVmYXVsdF92YWx1ZShkZWZhdWx0X3ZhbHVlKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbG0KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9jb21tb24vc2l6ZV9vcHRpb24uaGggYi9zcmMva2VubG0vbG0vY29tbW9uL3NpemVfb3B0aW9uLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYjhlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vY29tbW9uL3NpemVfb3B0aW9uLmhoCkBAIC0wLDAgKzEsMTEgQEAKKyNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbSB7CisKKy8vIENyZWF0ZSBhIGJvb3N0IHByb2dyYW0gb3B0aW9uIGZvciBkYXRhIHNpemVzLiAgVGhpcyBwYXJzZXMgc2l6ZXMgbGlrZSAxVCBhbmQgMTBrLgorYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dHlwZWRfdmFsdWU8c3RkOjpzdHJpbmc+ICpTaXplT3B0aW9uKHN0ZDo6c2l6ZV90ICZ0bywgY29uc3QgY2hhciAqZGVmYXVsdF92YWx1ZSk7CisKK30gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vY29tbW9uL3NwZWNpYWwuaGggYi9zcmMva2VubG0vbG0vY29tbW9uL3NwZWNpYWwuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3N2NkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9jb21tb24vc3BlY2lhbC5oaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIExNX0NPTU1PTl9TUEVDSUFMX0gKKyNkZWZpbmUgTE1fQ09NTU9OX1NQRUNJQUxfSAorCisjaW5jbHVkZSAibG0vd29yZF9pbmRleC5oaCIKKworbmFtZXNwYWNlIGxtIHsKKworY2xhc3MgU3BlY2lhbFZvY2FiIHsKKyAgcHVibGljOgorICAgIFNwZWNpYWxWb2NhYihXb3JkSW5kZXggYm9zLCBXb3JkSW5kZXggZW9zKSA6IGJvc18oYm9zKSwgZW9zXyhlb3MpIHt9CisKKyAgICBib29sIElzU3BlY2lhbChXb3JkSW5kZXggd29yZCkgY29uc3QgeworICAgICAgcmV0dXJuIHdvcmQgPT0ga1VOSyB8fCB3b3JkID09IGJvc18gfHwgd29yZCA9PSBlb3NfOworICAgIH0KKworICAgIFdvcmRJbmRleCBVTksoKSBjb25zdCB7IHJldHVybiBrVU5LOyB9CisgICAgV29yZEluZGV4IEJPUygpIGNvbnN0IHsgcmV0dXJuIGJvc187IH0KKyAgICBXb3JkSW5kZXggRU9TKCkgY29uc3QgeyByZXR1cm4gZW9zXzsgfQorCisgIHByaXZhdGU6CisgICAgV29yZEluZGV4IGJvc187CisgICAgV29yZEluZGV4IGVvc187Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbQorCisjZW5kaWYgLy8gTE1fQ09NTU9OX1NQRUNJQUxfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL2NvbmZpZy5jYyBiL3NyYy9rZW5sbS9sbS9jb25maWcuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9jb25maWcuY2MKcmVuYW1lIHRvIHNyYy9rZW5sbS9sbS9jb25maWcuY2MKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9jb25maWcuaGggYi9zcmMva2VubG0vbG0vY29uZmlnLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYjllN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vY29uZmlnLmhoCkBAIC0wLDAgKzEsMTI0IEBACisjaWZuZGVmIExNX0NPTkZJR19ICisjZGVmaW5lIExNX0NPTkZJR19ICisKKyNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9tbWFwLmhoIgorCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qIENvbmZpZ3VyYXRpb24gZm9yIG5ncmFtIG1vZGVsLiAgU2VwYXJhdGUgaGVhZGVyIHRvIHJlZHVjZSBwb2xsdXRpb24uICovCisKK25hbWVzcGFjZSBsbSB7CisKK2NsYXNzIEVudW1lcmF0ZVZvY2FiOworCituYW1lc3BhY2UgbmdyYW0geworCitzdHJ1Y3QgQ29uZmlnIHsKKyAgLy8gRUZGRUNUSVZFIEZPUiBCT1RIIEFSUEEgQU5EIEJJTkFSWSBSRUFEUworCisgIC8vIChkZWZhdWx0IHRydWUpIHByaW50IHByb2dyZXNzIGJhciB0byBtZXNzYWdlcworICBib29sIHNob3dfcHJvZ3Jlc3M7CisKKyAgLy8gV2hlcmUgdG8gbG9nIG1lc3NhZ2VzIGluY2x1ZGluZyB0aGUgcHJvZ3Jlc3MgYmFyLiAgU2V0IHRvIE5VTEwgZm9yCisgIC8vIHNpbGVuY2UuCisgIHN0ZDo6b3N0cmVhbSAqbWVzc2FnZXM7CisKKyAgc3RkOjpvc3RyZWFtICpQcm9ncmVzc01lc3NhZ2VzKCkgY29uc3QgeworICAgIHJldHVybiBzaG93X3Byb2dyZXNzID8gbWVzc2FnZXMgOiAwOworICB9CisKKyAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCB3aXRoIGV2ZXJ5IHN0cmluZyBpbiB0aGUgdm9jYWJ1bGFyeSBieSB0aGUKKyAgLy8gY29uc3RydWN0b3I7IGl0IG5lZWQgb25seSBleGlzdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25zdHJ1Y3Rvci4KKyAgLy8gU2VlIGVudW1lcmF0ZV92b2NhYi5oaCBmb3IgbW9yZSBkZXRhaWwuICBDb25maWcgZG9lcyBub3QgdGFrZSBvd25lcnNoaXA7CisgIC8vIGp1c3QgZGVsZXRlL2xldCBpdCBnbyBvdXQgb2Ygc2NvcGUgYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIGV4aXRzLgorICBFbnVtZXJhdGVWb2NhYiAqZW51bWVyYXRlX3ZvY2FiOworCisKKyAgLy8gT05MWSBFRkZFQ1RJVkUgV0hFTiBSRUFESU5HIEFSUEEKKworICAvLyBXaGF0IHRvIGRvIHdoZW4gPHVuaz4gaXNuJ3QgaW4gdGhlIHByb3ZpZGVkIG1vZGVsLgorICBXYXJuaW5nQWN0aW9uIHVua25vd25fbWlzc2luZzsKKyAgLy8gV2hhdCB0byBkbyB3aGVuIDxzPiBvciA8L3M+IGlzIG1pc3NpbmcgZnJvbSB0aGUgbW9kZWwuCisgIC8vIElmIFRIUk9XX1VQLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgb2YgdHlwZSB1dGlsOjpTcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb24uCisgIFdhcm5pbmdBY3Rpb24gc2VudGVuY2VfbWFya2VyX21pc3Npbmc7CisKKyAgLy8gV2hhdCB0byBkbyB3aXRoIGEgcG9zaXRpdmUgbG9nIHByb2JhYmlsaXR5LiAgRm9yIENPTVBMQUlOIGFuZCBTSUxFTlQsIG1hcAorICAvLyB0byAwLgorICBXYXJuaW5nQWN0aW9uIHBvc2l0aXZlX2xvZ19wcm9iYWJpbGl0eTsKKworICAvLyBUaGUgcHJvYmFiaWxpdHkgdG8gc3Vic3RpdHV0ZSBmb3IgPHVuaz4gaWYgaXQncyBtaXNzaW5nIGZyb20gdGhlIG1vZGVsLgorICAvLyBObyBlZmZlY3QgaWYgdGhlIG1vZGVsIGhhcyA8dW5rPiBvciB1bmtub3duX21pc3NpbmcgPT0gVEhST1dfVVAuCisgIGZsb2F0IHVua25vd25fbWlzc2luZ19sb2dwcm9iOworCisgIC8vIFNpemUgbXVsdGlwbGllciBmb3IgcHJvYmluZyBoYXNoIHRhYmxlLiAgTXVzdCBiZSA+IDEuICBTcGFjZSBpcyBsaW5lYXIgaW4KKyAgLy8gdGhpcy4gIFRpbWUgaXMgcHJvYmluZ19tdWx0aXBsaWVyIC8gKHByb2JpbmdfbXVsdGlwbGllciAtIDEpLiAgTm8gZWZmZWN0CisgIC8vIGZvciBzb3J0ZWQgdmFyaWFudC4KKyAgLy8gSWYgeW91IGZpbmQgeW91cnNlbGYgc2V0dGluZyB0aGlzIHRvIGEgbG93IG51bWJlciwgY29uc2lkZXIgdXNpbmcgdGhlCisgIC8vIFRyaWVNb2RlbCB3aGljaCBoYXMgbG93ZXIgbWVtb3J5IGNvbnN1bXB0aW9uLgorICBmbG9hdCBwcm9iaW5nX211bHRpcGxpZXI7CisKKyAgLy8gQW1vdW50IG9mIG1lbW9yeSB0byB1c2UgZm9yIGJ1aWxkaW5nLiAgVGhlIGFjdHVhbCBtZW1vcnkgdXNhZ2Ugd2lsbCBiZQorICAvLyBoaWdoZXIgc2luY2UgdGhpcyBqdXN0IHNldHMgc29ydCBidWZmZXIgc2l6ZS4gIE9ubHkgYXBwbGllcyB0byB0cmllCisgIC8vIG1vZGVscy4KKyAgc3RkOjpzaXplX3QgYnVpbGRpbmdfbWVtb3J5OworCisgIC8vIFRlbXBsYXRlIGZvciB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFwcHJvcHJpYXRlIGZvciBwYXNzaW5nIHRvIG1rZHRlbXAuCisgIC8vIFRoZSBjaGFyYWN0ZXJzIFhYWFhYWCBhcmUgYXBwZW5kZWQgYmVmb3JlIHBhc3NpbmcgdG8gbWtkdGVtcC4gIE9ubHkKKyAgLy8gYXBwbGllcyB0byB0cmllLiAgSWYgZW1wdHksIGRlZmF1bHRzIHRvIHdyaXRlX21tYXAuICBJZiB0aGF0J3MgTlVMTCwKKyAgLy8gZGVmYXVsdHMgdG8gaW5wdXQgZmlsZSBuYW1lLgorICBzdGQ6OnN0cmluZyB0ZW1wb3JhcnlfZGlyZWN0b3J5X3ByZWZpeDsKKworICAvLyBMZXZlbCBvZiBjb21wbGFpbmluZyB0byBkbyB3aGVuIGxvYWRpbmcgZnJvbSBBUlBBIGluc3RlYWQgb2YgYmluYXJ5IGZvcm1hdC4KKyAgZW51bSBBUlBBTG9hZENvbXBsYWluIHtBTEwsIEVYUEVOU0lWRSwgTk9ORX07CisgIEFSUEFMb2FkQ29tcGxhaW4gYXJwYV9jb21wbGFpbjsKKworICAvLyBXaGlsZSBsb2FkaW5nIGFuIEFSUEEgZmlsZSwgYWxzbyB3cml0ZSBvdXQgdGhpcyBiaW5hcnkgZm9ybWF0IGZpbGUuICBTZXQKKyAgLy8gdG8gTlVMTCB0byBkaXNhYmxlLgorICBjb25zdCBjaGFyICp3cml0ZV9tbWFwOworCisgIGVudW0gV3JpdGVNZXRob2QgeworICAgIFdSSVRFX01NQVAsIC8vIE1hcCB0aGUgZmlsZSBkaXJlY3RseS4KKyAgICBXUklURV9BRlRFUiAvLyBXcml0ZSBhZnRlciB3ZSdyZSBkb25lLgorICB9OworICBXcml0ZU1ldGhvZCB3cml0ZV9tZXRob2Q7CisKKyAgLy8gSW5jbHVkZSB0aGUgdm9jYWIgaW4gdGhlIGJpbmFyeSBmaWxlPyAgT25seSBlZmZlY3RpdmUgaWYgd3JpdGVfbW1hcCAhPSBOVUxMLgorICBib29sIGluY2x1ZGVfdm9jYWI7CisKKworICAvLyBMZWZ0IHJlc3Qgb3B0aW9ucy4gIE9ubHkgdXNlZCB3aGVuIHRoZSBtb2RlbCBpbmNsdWRlcyByZXN0IGNvc3RzLgorICBlbnVtIFJlc3RGdW5jdGlvbiB7CisgICAgUkVTVF9NQVgsICAgLy8gTWF4aW11bSBvZiBhbnkgc2NvcmUgdG8gdGhlIGxlZnQKKyAgICBSRVNUX0xPV0VSLCAvLyBVc2UgbG93ZXItb3JkZXIgZmlsZXMgZ2l2ZW4gYmVsb3cuCisgIH07CisgIFJlc3RGdW5jdGlvbiByZXN0X2Z1bmN0aW9uOworICAvLyBPbmx5IHVzZWQgZm9yIFJFU1RfTE9XRVIuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXN0X2xvd2VyX2ZpbGVzOworCisKKyAgLy8gUXVhbnRpemF0aW9uIG9wdGlvbnMuICBPbmx5IGVmZmVjdGl2ZSBmb3IgUXVhbnRUcmllTW9kZWwuICBPbmUgdmFsdWUgaXMKKyAgLy8gcmVzZXJ2ZWQgZm9yIGVhY2ggb2YgcHJvYiBhbmQgYmFja29mZiwgc28gMl5iaXRzIC0gMSBidWNrZXRzIHdpbGwgYmUgdXNlZAorICAvLyB0byBxdWFudGl6ZSAoYW5kIG9uZSBvZiB0aGUgcmVtYWluaW5nIGJhY2tvZmZzIHdpbGwgYmUgMCkuCisgIHVpbnQ4X3QgcHJvYl9iaXRzLCBiYWNrb2ZmX2JpdHM7CisKKyAgLy8gQmhpa3NoYSBjb21wcmVzc2lvbiAoc2ltcGxlIGZvcm0pLiAgT25seSB3b3JrcyB3aXRoIHRyaWUuCisgIHVpbnQ4X3QgcG9pbnRlcl9iaGlrc2hhX2JpdHM7CisKKworICAvLyBPTkxZIEVGRkVDVElWRSBXSEVOIFJFQURJTkcgQklOQVJZCisKKyAgLy8gSG93IHRvIGdldCB0aGUgZ2lhbnQgYXJyYXkgaW50byBtZW1vcnk6IGxhenkgbW1hcCwgcG9wdWxhdGUsIHJlYWQgZXRjLgorICAvLyBTZWUgdXRpbC9tbWFwLmhoIGZvciBkZXRhaWxzIG9mIE1hcE1ldGhvZC4KKyAgdXRpbDo6TG9hZE1ldGhvZCBsb2FkX21ldGhvZDsKKworCisgIC8vIFNldCBkZWZhdWx0cy4KKyAgQ29uZmlnKCk7Cit9OworCit9IC8qIG5hbWVzcGFjZSBuZ3JhbSAqLyB9IC8qIG5hbWVzcGFjZSBsbSAqLworCisjZW5kaWYgLy8gTE1fQ09ORklHX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9lbnVtZXJhdGVfdm9jYWIuaGggYi9zcmMva2VubG0vbG0vZW51bWVyYXRlX3ZvY2FiLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Yzk0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vZW51bWVyYXRlX3ZvY2FiLmhoCkBAIC0wLDAgKzEsMjggQEAKKyNpZm5kZWYgTE1fRU5VTUVSQVRFX1ZPQ0FCX0gKKyNkZWZpbmUgTE1fRU5VTUVSQVRFX1ZPQ0FCX0gKKworI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisjaW5jbHVkZSAidXRpbC9zdHJpbmdfcGllY2UuaGgiCisKK25hbWVzcGFjZSBsbSB7CisKKy8qIElmIHlvdSBuZWVkIHRoZSBhY3R1YWwgc3RyaW5ncyBpbiB0aGUgdm9jYWJ1bGFyeSwgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MKKyAqIGFuZCBpbXBsZW1lbnQgQWRkLiAgVGhlbiBwdXQgYSBwb2ludGVyIGluIENvbmZpZy5lbnVtZXJhdGVfdm9jYWI7IGl0IGRvZXMKKyAqIG5vdCB0YWtlIG93bmVyc2hpcC4gIEFkZCBpcyBjYWxsZWQgb25jZSBwZXIgdm9jYWIgd29yZC4gIGluZGV4IHN0YXJ0cyBhdCAwCisgKiBhbmQgaW5jcmVhc2VzIGJ5IDEgZWFjaCB0aW1lLiAgVGhpcyBpcyBvbmx5IHVzZWQgYnkgdGhlIE1vZGVsIGNvbnN0cnVjdG9yOworICogdGhlIHBvaW50ZXIgaXMgbm90IHJldGFpbmVkIGJ5IHRoZSBjbGFzcy4KKyAqLworY2xhc3MgRW51bWVyYXRlVm9jYWIgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+RW51bWVyYXRlVm9jYWIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIEFkZChXb3JkSW5kZXggaW5kZXgsIGNvbnN0IFN0cmluZ1BpZWNlICZzdHIpID0gMDsKKworICBwcm90ZWN0ZWQ6CisgICAgRW51bWVyYXRlVm9jYWIoKSB7fQorfTsKKworfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX0VOVU1FUkFURV9WT0NBQl9ICisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9mYWNhZGUuaGggYi9zcmMva2VubG0vbG0vZmFjYWRlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNWVmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vZmFjYWRlLmhoCkBAIC0wLDAgKzEsNzMgQEAKKyNpZm5kZWYgTE1fRkFDQURFX0gKKyNkZWZpbmUgTE1fRkFDQURFX0gKKworI2luY2x1ZGUgImxtL3ZpcnR1YWxfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlLmhoIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIGJhc2UgeworCisvLyBDb21tb24gbW9kZWwgaW50ZXJmYWNlIHRoYXQgZGVwZW5kcyBvbiBrbm93aW5nIHRoZSBzcGVjaWZpYyBjbGFzc2VzLgorLy8gQ3VyaW91c2x5IHJlY3VycmluZyB0ZW1wbGF0ZSBwYXR0ZXJuLgordGVtcGxhdGUgPGNsYXNzIENoaWxkLCBjbGFzcyBTdGF0ZVQsIGNsYXNzIFZvY2FidWxhcnlUPiBjbGFzcyBNb2RlbEZhY2FkZSA6IHB1YmxpYyBNb2RlbCB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFN0YXRlVCBTdGF0ZTsKKyAgICB0eXBlZGVmIFZvY2FidWxhcnlUIFZvY2FidWxhcnk7CisKKyAgICAvKiBUcmFuc2xhdGUgZnJvbSB2b2lkKiB0byBTdGF0ZSAqLworICAgIEZ1bGxTY29yZVJldHVybiBCYXNlRnVsbFNjb3JlKGNvbnN0IHZvaWQgKmluX3N0YXRlLCBjb25zdCBXb3JkSW5kZXggbmV3X3dvcmQsIHZvaWQgKm91dF9zdGF0ZSkgY29uc3QgeworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IENoaWxkKj4odGhpcyktPkZ1bGxTY29yZSgKKyAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTdGF0ZSo+KGluX3N0YXRlKSwKKyAgICAgICAgICBuZXdfd29yZCwKKyAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxTdGF0ZSo+KG91dF9zdGF0ZSkpOworICAgIH0KKworICAgIEZ1bGxTY29yZVJldHVybiBCYXNlRnVsbFNjb3JlRm9yZ290U3RhdGUoY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JiZWdpbiwgY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JlbmQsIGNvbnN0IFdvcmRJbmRleCBuZXdfd29yZCwgdm9pZCAqb3V0X3N0YXRlKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQ2hpbGQqPih0aGlzKS0+RnVsbFNjb3JlRm9yZ290U3RhdGUoCisgICAgICAgICAgY29udGV4dF9yYmVnaW4sCisgICAgICAgICAgY29udGV4dF9yZW5kLAorICAgICAgICAgIG5ld193b3JkLAorICAgICAgICAgICpyZWludGVycHJldF9jYXN0PFN0YXRlKj4ob3V0X3N0YXRlKSk7CisgICAgfQorCisgICAgLy8gRGVmYXVsdCBTY29yZSBmdW5jdGlvbiBjYWxscyBGdWxsU2NvcmUuICBNb2RlbCBjYW4gb3ZlcnJpZGUgdGhpcy4KKyAgICBmbG9hdCBTY29yZShjb25zdCBTdGF0ZSAmaW5fc3RhdGUsIGNvbnN0IFdvcmRJbmRleCBuZXdfd29yZCwgU3RhdGUgJm91dF9zdGF0ZSkgY29uc3QgeworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IENoaWxkKj4odGhpcyktPkZ1bGxTY29yZShpbl9zdGF0ZSwgbmV3X3dvcmQsIG91dF9zdGF0ZSkucHJvYjsKKyAgICB9CisKKyAgICBmbG9hdCBCYXNlU2NvcmUoY29uc3Qgdm9pZCAqaW5fc3RhdGUsIGNvbnN0IFdvcmRJbmRleCBuZXdfd29yZCwgdm9pZCAqb3V0X3N0YXRlKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQ2hpbGQqPih0aGlzKS0+U2NvcmUoCisgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU3RhdGUqPihpbl9zdGF0ZSksCisgICAgICAgICAgbmV3X3dvcmQsCisgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8U3RhdGUqPihvdXRfc3RhdGUpKTsKKyAgICB9CisKKyAgICBjb25zdCBTdGF0ZSAmQmVnaW5TZW50ZW5jZVN0YXRlKCkgY29uc3QgeyByZXR1cm4gYmVnaW5fc2VudGVuY2VfOyB9CisgICAgY29uc3QgU3RhdGUgJk51bGxDb250ZXh0U3RhdGUoKSBjb25zdCB7IHJldHVybiBudWxsX2NvbnRleHRfOyB9CisgICAgY29uc3QgVm9jYWJ1bGFyeSAmR2V0Vm9jYWJ1bGFyeSgpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBWb2NhYnVsYXJ5Kj4oJkJhc2VWb2NhYnVsYXJ5KCkpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIE1vZGVsRmFjYWRlKCkgOiBNb2RlbChzaXplb2YoU3RhdGUpKSB7fQorCisgICAgdmlydHVhbCB+TW9kZWxGYWNhZGUoKSB7fQorCisgICAgLy8gYmVnaW5fc2VudGVuY2UgYW5kIG51bGxfY29udGV4dCBjYW4gZGlzYXBwZWFyIGFmdGVyLiAgdm9jYWIgc2hvdWxkIHN0YXkuCisgICAgdm9pZCBJbml0KGNvbnN0IFN0YXRlICZiZWdpbl9zZW50ZW5jZSwgY29uc3QgU3RhdGUgJm51bGxfY29udGV4dCwgY29uc3QgVm9jYWJ1bGFyeSAmdm9jYWIsIHVuc2lnbmVkIGNoYXIgb3JkZXIpIHsKKyAgICAgIGJlZ2luX3NlbnRlbmNlXyA9IGJlZ2luX3NlbnRlbmNlOworICAgICAgbnVsbF9jb250ZXh0XyA9IG51bGxfY29udGV4dDsKKyAgICAgIGJlZ2luX3NlbnRlbmNlX21lbW9yeV8gPSAmYmVnaW5fc2VudGVuY2VfOworICAgICAgbnVsbF9jb250ZXh0X21lbW9yeV8gPSAmbnVsbF9jb250ZXh0XzsKKyAgICAgIGJhc2Vfdm9jYWJfID0gJnZvY2FiOworICAgICAgb3JkZXJfID0gb3JkZXI7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgU3RhdGUgYmVnaW5fc2VudGVuY2VfLCBudWxsX2NvbnRleHRfOworfTsKKworfSAvLyBtYW1lc3BhY2UgYmFzZQorfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX0ZBQ0FERV9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vZmlsdGVyL0NNYWtlTGlzdHMudHh0IGIvc3JjL2tlbmxtL2xtL2ZpbHRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDYxNmNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYyIEBACitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjgpCisjCisjIFRoZSBLZW5MTSBjbWFrZSBmaWxlcyBtYWtlIHVzZSBvZiBhZGRfbGlicmFyeSguLi4gT0JKRUNUUyAuLi4pCisjIAorIyBUaGlzIHN5bnRheCBhbGxvd3MgZ3JvdXBpbmcgb2Ygc291cmNlIGZpbGVzIHdoZW4gY29tcGlsaW5nCisjIChlZmZlY3RpdmVseSBjcmVhdGluZyAiZmFrZSIgbGlicmFyaWVzIGJhc2VkIG9uIHNvdXJjZSBzdWJkaXJzKS4KKyMgCisjIFRoaXMgc3ludGF4IHdhcyBvbmx5IGFkZGVkIGluIGNtYWtlIHZlcnNpb24gMi44LjgKKyMKKyMgc2VlIGh0dHA6Ly93d3cuY21ha2Uub3JnL1dpa2kvQ01ha2UvVHV0b3JpYWxzL09iamVjdF9MaWJyYXJ5CisKKworIyBUaGlzIENNYWtlIGZpbGUgd2FzIGNyZWF0ZWQgYnkgTGFuZSBTY2h3YXJ0eiA8ZG93b2JlaGFAZ21haWwuY29tPgorCisjIEV4cGxpY2l0bHkgbGlzdCB0aGUgc291cmNlIGZpbGVzIGZvciB0aGlzIHN1YmRpcmVjdG9yeQorIworIyBJZiB5b3UgYWRkIGFueSBzb3VyY2UgZmlsZXMgdG8gdGhpcyBzdWJkaXJlY3RvcnkKKyMgICAgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGtlbmxtIGxpYnJhcnksCisjICAgICAgICAodGhpcyBleGNsdWRlcyBhbnkgdW5pdCB0ZXN0IGZpbGVzKQorIyAgICB5b3Ugc2hvdWxkIGFkZCB0aGVtIHRvIHRoZSBmb2xsb3dpbmcgbGlzdDoKKyMKKyMgSW4gb3JkZXIgdG8gc2V0IGNvcnJlY3QgcGF0aHMgdG8gdGhlc2UgZmlsZXMKKyMgICAgaW4gY2FzZSB0aGlzIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgYnkgQ01ha2UgZmlsZXMgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnksCisjICAgIHdlIHByZWZpeCBhbGwgZmlsZXMgd2l0aCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0uCisjCitzZXQoS0VOTE1fRklMVEVSX1NPVVJDRSAKKwkJJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2FycGFfaW8uY2MKKwkJJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3BocmFzZS5jYworCQkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdm9jYWIuY2MKKwkpCisKKworIyBHcm91cCB0aGVzZSBvYmplY3RzIHRvZ2V0aGVyIGZvciBsYXRlciB1c2UuIAorIworIyBHaXZlbiBhZGRfbGlicmFyeShmb28gT0JKRUNUICR7bXlfZm9vX3NvdXJjZXN9KSwKKyMgcmVmZXIgdG8gdGhlc2Ugb2JqZWN0cyBhcyAkPFRBUkdFVF9PQkpFQ1RTOmZvbz4KKyMKK2FkZF9saWJyYXJ5KGtlbmxtX2ZpbHRlciBPQkpFQ1QgJHtLRU5MTV9GSUxURVJfU09VUkNFfSkKKworCisjIEV4cGxpY2l0bHkgbGlzdCB0aGUgZXhlY3V0YWJsZSBmaWxlcyB0byBiZSBjb21waWxlZAorc2V0KEVYRV9MSVNUCisgIGZpbHRlcgorICBwaHJhc2VfdGFibGVfdm9jYWIKKykKKworCisjIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZXhlY3V0YWJsZSBsaXN0ICAgCitmb3JlYWNoKGV4ZSAke0VYRV9MSVNUfSkKKworICAjIENvbXBpbGUgdGhlIGV4ZWN1dGFibGUsIGxpbmtpbmcgYWdhaW5zdCB0aGUgcmVxdWlzaXRlIGRlcGVuZGVudCBvYmplY3QgZmlsZXMKKwlhZGRfZXhlY3V0YWJsZSgke2V4ZX0gJHtleGV9X21haW4uY2MgJDxUQVJHRVRfT0JKRUNUUzprZW5sbT4gJDxUQVJHRVRfT0JKRUNUUzprZW5sbV9maWx0ZXI+ICQ8VEFSR0VUX09CSkVDVFM6a2VubG1fdXRpbD4pCisKKyAgIyBMaW5rIHRoZSBleGVjdXRhYmxlIGFnYWluc3QgYm9vc3QKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7ZXhlfSAke0Jvb3N0X0xJQlJBUklFU30gcHRocmVhZCkKKworICAjIEdyb3VwIGV4ZWN1dGFibGVzIHRvZ2V0aGVyCisgIHNldF90YXJnZXRfcHJvcGVydGllcygke2V4ZX0gUFJPUEVSVElFUyBGT0xERVIgZXhlY3V0YWJsZXMpCisKKyMgRW5kIGZvciBsb29wCitlbmRmb3JlYWNoKGV4ZSkKKwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ZpbHRlci9KYW1maWxlIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci9KYW1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjYyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vZmlsdGVyL0phbWZpbGUKQEAgLTAsMCArMSw3IEBACitmYWtlbGliIGxtX2ZpbHRlciA6IHBocmFzZS5jYyB2b2NhYi5jYyBhcnBhX2lvLmNjIC4uLy4uL3V0aWwvL2tlbnV0aWwgOiA8dGhyZWFkaW5nPm11bHRpOjxsaWJyYXJ5Pi90b3AvL2Jvb3N0X3RocmVhZCA7CisKK29iaiBtYWluIDogZmlsdGVyX21haW4uY2MgOiA8dGhyZWFkaW5nPnNpbmdsZTo8ZGVmaW5lPk5USFJFQUQgPGluY2x1ZGU+Li4vLi4gOworCitleGUgZmlsdGVyIDogbWFpbiBsbV9maWx0ZXIgLi4vLi4vdXRpbC8va2VudXRpbCAuLi8va2VubG0gOiA8dGhyZWFkaW5nPm11bHRpOjxsaWJyYXJ5Pi90b3AvL2Jvb3N0X3RocmVhZCA7CisKK2V4ZSBwaHJhc2VfdGFibGVfdm9jYWIgOiBwaHJhc2VfdGFibGVfdm9jYWJfbWFpbi5jYyAuLi8uLi91dGlsLy9rZW51dGlsIDsKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9maWx0ZXIvYXJwYV9pby5jYyBiL3NyYy9rZW5sbS9sbS9maWx0ZXIvYXJwYV9pby5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FlNjBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci9hcnBhX2lvLmNjCkBAIC0wLDAgKzEsNzcgQEAKKyNpbmNsdWRlICJsbS9maWx0ZXIvYXJwYV9pby5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCisjaW5jbHVkZSAidXRpbC9zdHJpbmdfc3RyZWFtLmhoIgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNlcnJubz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgbG0geworCitBUlBBSW5wdXRFeGNlcHRpb246OkFSUEFJbnB1dEV4Y2VwdGlvbihjb25zdCBTdHJpbmdQaWVjZSAmbWVzc2FnZSkgdGhyb3coKSB7CisgICp0aGlzIDw8IG1lc3NhZ2U7Cit9CisKK0FSUEFJbnB1dEV4Y2VwdGlvbjo6QVJQQUlucHV0RXhjZXB0aW9uKGNvbnN0IFN0cmluZ1BpZWNlICZtZXNzYWdlLCBjb25zdCBTdHJpbmdQaWVjZSAmbGluZSkgdGhyb3coKSB7CisgICp0aGlzIDw8IG1lc3NhZ2UgPDwgIiBpbiBsaW5lICIgPDwgbGluZTsKK30KKworQVJQQUlucHV0RXhjZXB0aW9uOjp+QVJQQUlucHV0RXhjZXB0aW9uKCkgdGhyb3coKSB7fQorCisvLyBTZWVraW5nIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyLgordGVtcGxhdGUgPGNsYXNzIFN0cmVhbT4gdm9pZCBXcml0ZUNvdW50cyhTdHJlYW0gJm91dCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZudW1iZXIpIHsKKyAgb3V0IDw8ICJcblxcZGF0YVxcXG4iOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bWJlci5zaXplKCk7ICsraSkgeworICAgIG91dCA8PCAibmdyYW0gIiA8PCBpKzEgPDwgIj0iIDw8IG51bWJlcltpXSA8PCAnXG4nOworICB9CisgIG91dCA8PCAnXG4nOworfQorCitzaXplX3QgU2l6ZU5lZWRlZEZvckNvdW50cyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJm51bWJlcikgeworICBzdGQ6OnN0cmluZyBidWY7CisgIHV0aWw6OlN0cmluZ1N0cmVhbSBzdHJlYW0oYnVmKTsKKyAgV3JpdGVDb3VudHMoc3RyZWFtLCBudW1iZXIpOworICByZXR1cm4gYnVmLnNpemUoKTsKK30KKworYm9vbCBJc0VudGlyZWx5V2hpdGVTcGFjZShjb25zdCBTdHJpbmdQaWVjZSAmbGluZSkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PHNpemVfdD4obGluZS5zaXplKCkpOyArK2kpIHsKKyAgICBpZiAoIWlzc3BhY2UobGluZS5kYXRhKClbaV0pKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK0FSUEFPdXRwdXQ6OkFSUEFPdXRwdXQoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGJ1ZmZlcl9zaXplKSAKKyAgOiBmaWxlX2JhY2tpbmdfKHV0aWw6OkNyZWF0ZU9yVGhyb3cobmFtZSkpLCBmaWxlXyhmaWxlX2JhY2tpbmdfLmdldCgpLCBidWZmZXJfc2l6ZSkge30KKwordm9pZCBBUlBBT3V0cHV0OjpSZXNlcnZlRm9yQ291bnRzKHN0ZDo6c3RyZWFtcG9zIHJlc2VydmUpIHsKKyAgZm9yIChzdGQ6OnN0cmVhbXBvcyBpID0gMDsgaSA8IHJlc2VydmU7IGkgKz0gc3RkOjpzdHJlYW1wb3MoMSkpIHsKKyAgICBmaWxlXyA8PCAnXG4nOworICB9Cit9CisKK3ZvaWQgQVJQQU91dHB1dDo6QmVnaW5MZW5ndGgodW5zaWduZWQgaW50IGxlbmd0aCkgeworICBmaWxlXyA8PCAnXFwnIDw8IGxlbmd0aCA8PCAiLWdyYW1zOiIgPDwgJ1xuJzsKK30KKwordm9pZCBBUlBBT3V0cHV0OjpFbmRMZW5ndGgodW5zaWduZWQgaW50IGxlbmd0aCkgeworICBmaWxlXyA8PCAnXG4nOworICBpZiAobGVuZ3RoID4gY291bnRzXy5zaXplKCkpIHsKKyAgICBjb3VudHNfLnJlc2l6ZShsZW5ndGgpOworICB9CisgIGNvdW50c19bbGVuZ3RoIC0gMV0gPSBmYXN0X2NvdW50ZXJfOworfQorCit2b2lkIEFSUEFPdXRwdXQ6OkZpbmlzaCgpIHsKKyAgZmlsZV8gPDwgIlxcZW5kXFxcbiI7CisgIGZpbGVfLnNlZWtwKDApOworICBXcml0ZUNvdW50cyhmaWxlXywgY291bnRzXyk7CisgIGZpbGVfLmZsdXNoKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vZmlsdGVyL2FycGFfaW8uaGggYi9zcmMva2VubG0vbG0vZmlsdGVyL2FycGFfaW8uaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4OTI3MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9maWx0ZXIvYXJwYV9pby5oaApAQCAtMCwwICsxLDk5IEBACisjaWZuZGVmIExNX0ZJTFRFUl9BUlBBX0lPX0gKKyNkZWZpbmUgTE1fRklMVEVSX0FSUEFfSU9fSAorLyogSW5wdXQgYW5kIG91dHB1dCBmb3IgQVJQQSBmb3JtYXQgbGFuZ3VhZ2UgbW9kZWwgZmlsZXMuCisgKi8KKyNpbmNsdWRlICJsbS9yZWFkX2FycGEuaGgiCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlX3N0cmVhbS5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmluZ19waWVjZS5oaCIKKyNpbmNsdWRlICJ1dGlsL3Rva2VuaXplX3BpZWNlLmhoIgorCisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9hcnJheS5ocHA+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgdXRpbCB7IGNsYXNzIEZpbGVQaWVjZTsgfQorCituYW1lc3BhY2UgbG0geworCitjbGFzcyBBUlBBSW5wdXRFeGNlcHRpb24gOiBwdWJsaWMgdXRpbDo6RXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEFSUEFJbnB1dEV4Y2VwdGlvbihjb25zdCBTdHJpbmdQaWVjZSAmbWVzc2FnZSkgdGhyb3coKTsKKyAgICBleHBsaWNpdCBBUlBBSW5wdXRFeGNlcHRpb24oY29uc3QgU3RyaW5nUGllY2UgJm1lc3NhZ2UsIGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lKSB0aHJvdygpOworICAgIHZpcnR1YWwgfkFSUEFJbnB1dEV4Y2VwdGlvbigpIHRocm93KCk7Cit9OworCisvLyBIYW5kbGluZyBmb3IgdGhlIGNvdW50cyBvZiBuLWdyYW1zIGF0IHRoZSBiZWdpbm5pbmcgb2YgQVJQQSBmaWxlcy4KK3NpemVfdCBTaXplTmVlZGVkRm9yQ291bnRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmbnVtYmVyKTsKKworLyogV3JpdGVzIGFuIEFSUEEgZmlsZS4gIFRoaXMgaGFzIHRvIGJlIHNlZWthYmxlIHNvIHRoZSBjb3VudHMgY2FuIGJlIHdyaXR0ZW4KKyAqIGF0IHRoZSBlbmQuICBIZW5jZSwgSSBqdXN0IGhhdmUgaXQgb3duIGEgc3RkOjpmc3RyZWFtIGluc3RlYWQgb2YgYWNjZXB0aW5nCisgKiBhIHNlcGFyYXRlbHkgaGVsZCBzdGQ6Om9zdHJlYW0uICBUT0RPOiB1c2UgdGhlIGZhc3Qgb25lIGZyb20gZXN0aW1hdGlvbi4KKyAqLworY2xhc3MgQVJQQU91dHB1dCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBBUlBBT3V0cHV0KGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBidWZmZXJfc2l6ZSA9IDY1NTM2KTsKKworICAgIHZvaWQgUmVzZXJ2ZUZvckNvdW50cyhzdGQ6OnN0cmVhbXBvcyByZXNlcnZlKTsKKworICAgIHZvaWQgQmVnaW5MZW5ndGgodW5zaWduZWQgaW50IGxlbmd0aCk7CisKKyAgICB2b2lkIEFkZE5HcmFtKGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lKSB7CisgICAgICBmaWxlXyA8PCBsaW5lIDw8ICdcbic7CisgICAgICArK2Zhc3RfY291bnRlcl87CisgICAgfQorCisgICAgdm9pZCBBZGROR3JhbShjb25zdCBTdHJpbmdQaWVjZSAmbmdyYW0sIGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lKSB7CisgICAgICBBZGROR3JhbShsaW5lKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3I+IHZvaWQgQWRkTkdyYW0oY29uc3QgSXRlcmF0b3IgJmJlZ2luLCBjb25zdCBJdGVyYXRvciAmZW5kLCBjb25zdCBTdHJpbmdQaWVjZSAmbGluZSkgeworICAgICAgQWRkTkdyYW0obGluZSk7CisgICAgfQorCisgICAgdm9pZCBFbmRMZW5ndGgodW5zaWduZWQgaW50IGxlbmd0aCk7CisKKyAgICB2b2lkIEZpbmlzaCgpOworCisgIHByaXZhdGU6CisgICAgdXRpbDo6c2NvcGVkX2ZkIGZpbGVfYmFja2luZ187CisgICAgdXRpbDo6RmlsZVN0cmVhbSBmaWxlXzsKKyAgICBzaXplX3QgZmFzdF9jb3VudGVyXzsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRzXzsKK307CisKKwordGVtcGxhdGUgPGNsYXNzIE91dHB1dD4gdm9pZCBSZWFkTkdyYW1zKHV0aWw6OkZpbGVQaWVjZSAmaW4sIHVuc2lnbmVkIGludCBsZW5ndGgsIHVpbnQ2NF90IG51bWJlciwgT3V0cHV0ICZvdXQpIHsKKyAgUmVhZE5HcmFtSGVhZGVyKGluLCBsZW5ndGgpOworICBvdXQuQmVnaW5MZW5ndGgobGVuZ3RoKTsKKyAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IG51bWJlcjsgKytpKSB7CisgICAgU3RyaW5nUGllY2UgbGluZSA9IGluLlJlYWRMaW5lKCk7CisgICAgdXRpbDo6VG9rZW5JdGVyPHV0aWw6OlNpbmdsZUNoYXJhY3Rlcj4gdGFiYmVyKGxpbmUsICdcdCcpOworICAgIGlmICghdGFiYmVyKSB0aHJvdyBBUlBBSW5wdXRFeGNlcHRpb24oImJsYW5rIGxpbmUiLCBsaW5lKTsKKyAgICBpZiAoISsrdGFiYmVyKSB0aHJvdyBBUlBBSW5wdXRFeGNlcHRpb24oIm5vIHRhYiIsIGxpbmUpOworCisgICAgb3V0LkFkZE5HcmFtKCp0YWJiZXIsIGxpbmUpOworICB9CisgIG91dC5FbmRMZW5ndGgobGVuZ3RoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIE91dHB1dD4gdm9pZCBSZWFkQVJQQSh1dGlsOjpGaWxlUGllY2UgJmluX2xtLCBPdXRwdXQgJm91dCkgeworICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gbnVtYmVyOworICBSZWFkQVJQQUNvdW50cyhpbl9sbSwgbnVtYmVyKTsKKyAgb3V0LlJlc2VydmVGb3JDb3VudHMoU2l6ZU5lZWRlZEZvckNvdW50cyhudW1iZXIpKTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBudW1iZXIuc2l6ZSgpOyArK2kpIHsKKyAgICBSZWFkTkdyYW1zKGluX2xtLCBpICsgMSwgbnVtYmVyW2ldLCBvdXQpOworICB9CisgIFJlYWRFbmQoaW5fbG0pOworICBvdXQuRmluaXNoKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGxtCisKKyNlbmRpZiAvLyBMTV9GSUxURVJfQVJQQV9JT19ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vZmlsdGVyL2NvdW50X2lvLmhoIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci9jb3VudF9pby5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWY2Njc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci9jb3VudF9pby5oaApAQCAtMCwwICsxLDg5IEBACisjaWZuZGVmIExNX0ZJTFRFUl9DT1VOVF9JT19ICisjZGVmaW5lIExNX0ZJTFRFUl9DT1VOVF9JT19ICisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInV0aWwvZmlsZV9zdHJlYW0uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZV9waWVjZS5oaCIKKworbmFtZXNwYWNlIGxtIHsKKworY2xhc3MgQ291bnRPdXRwdXQgOiBib29zdDo6bm9uY29weWFibGUgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQ291bnRPdXRwdXQoY29uc3QgY2hhciAqbmFtZSkgOiBmaWxlXyh1dGlsOjpDcmVhdGVPclRocm93KG5hbWUpKSB7fQorCisgICAgdm9pZCBBZGROR3JhbShjb25zdCBTdHJpbmdQaWVjZSAmbGluZSkgeworICAgICAgZmlsZV8gPDwgbGluZSA8PCAnXG4nOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gdm9pZCBBZGROR3JhbShjb25zdCBJdGVyYXRvciAmYmVnaW4sIGNvbnN0IEl0ZXJhdG9yICZlbmQsIGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lKSB7CisgICAgICBBZGROR3JhbShsaW5lKTsKKyAgICB9CisKKyAgICB2b2lkIEFkZE5HcmFtKGNvbnN0IFN0cmluZ1BpZWNlICZuZ3JhbSwgY29uc3QgU3RyaW5nUGllY2UgJmxpbmUpIHsKKyAgICAgIEFkZE5HcmFtKGxpbmUpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHV0aWw6OkZpbGVTdHJlYW0gZmlsZV87Cit9OworCitjbGFzcyBDb3VudEJhdGNoIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IENvdW50QmF0Y2goc3RkOjpzdHJlYW1zaXplIGluaXRpYWxfcmVhZCkKKyAgICAgIDogaW5pdGlhbF9yZWFkXyhpbml0aWFsX3JlYWQpIHsKKyAgICAgIGJ1ZmZlcl8ucmVzZXJ2ZShpbml0aWFsX3JlYWQpOworICAgIH0KKworICAgIHZvaWQgUmVhZChzdGQ6OmlzdHJlYW0gJmluKSB7CisgICAgICBidWZmZXJfLnJlc2l6ZShpbml0aWFsX3JlYWRfKTsKKyAgICAgIGluLnJlYWQoJipidWZmZXJfLmJlZ2luKCksIGluaXRpYWxfcmVhZF8pOworICAgICAgYnVmZmVyXy5yZXNpemUoaW4uZ2NvdW50KCkpOworICAgICAgY2hhciBnb3Q7CisgICAgICB3aGlsZSAoaW4uZ2V0KGdvdCkgJiYgZ290ICE9ICdcbicpCisgICAgICAgIGJ1ZmZlcl8ucHVzaF9iYWNrKGdvdCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIE91dHB1dD4gdm9pZCBTZW5kKE91dHB1dCAmb3V0KSB7CisgICAgICBmb3IgKHV0aWw6OlRva2VuSXRlcjx1dGlsOjpTaW5nbGVDaGFyYWN0ZXI+IGxpbmUoU3RyaW5nUGllY2UoJipidWZmZXJfLmJlZ2luKCksIGJ1ZmZlcl8uc2l6ZSgpKSwgJ1xuJyk7IGxpbmU7ICsrbGluZSkgeworICAgICAgICB1dGlsOjpUb2tlbkl0ZXI8dXRpbDo6U2luZ2xlQ2hhcmFjdGVyPiB0YWJiZXIoKmxpbmUsICdcdCcpOworICAgICAgICBpZiAoIXRhYmJlcikgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiV2FybmluZzogZW1wdHkgbi1ncmFtIGNvdW50IGxpbmUgYmVpbmcgcmVtb3ZlZFxuIjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1dGlsOjpUb2tlbkl0ZXI8dXRpbDo6U2luZ2xlQ2hhcmFjdGVyLCB0cnVlPiB3b3JkcygqdGFiYmVyLCAnICcpOworICAgICAgICBpZiAoIXdvcmRzKSB7CisgICAgICAgICAgc3RkOjpjZXJyIDw8ICJMaW5lIGhhcyBhIHRhYiBidXQgbm8gd29yZHMuXG4iOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG91dC5BZGROR3JhbSh3b3JkcywgdXRpbDo6VG9rZW5JdGVyPHV0aWw6OlNpbmdsZUNoYXJhY3RlciwgdHJ1ZT46OmVuZCgpLCAqbGluZSk7CisgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzdHJlYW1zaXplIGluaXRpYWxfcmVhZF87CisKKyAgICAvLyBUaGlzIGNvdWxkIGhhdmUgYmVlbiBhIHN0ZDo6c3RyaW5nIGJ1dCB0aGF0J3MgbGVzcyBoYXBweSB3aXRoIHJhdyB3cml0ZXMuCisgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmZmVyXzsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBPdXRwdXQ+IHZvaWQgUmVhZENvdW50KHV0aWw6OkZpbGVQaWVjZSAmaW5fZmlsZSwgT3V0cHV0ICZvdXQpIHsKKyAgdHJ5IHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgU3RyaW5nUGllY2UgbGluZSA9IGluX2ZpbGUuUmVhZExpbmUoKTsKKyAgICAgIHV0aWw6OlRva2VuSXRlcjx1dGlsOjpTaW5nbGVDaGFyYWN0ZXI+IHRhYmJlcihsaW5lLCAnXHQnKTsKKyAgICAgIGlmICghdGFiYmVyKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiV2FybmluZzogZW1wdHkgbi1ncmFtIGNvdW50IGxpbmUgYmVpbmcgcmVtb3ZlZFxuIjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBvdXQuQWRkTkdyYW0oKnRhYmJlciwgbGluZSk7CisgICAgfQorICB9IGNhdGNoIChjb25zdCB1dGlsOjpFbmRPZkZpbGVFeGNlcHRpb24gJmUpIHt9Cit9CisKK30gLy8gbmFtZXNwYWNlIGxtCisKKyNlbmRpZiAvLyBMTV9GSUxURVJfQ09VTlRfSU9fSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ZpbHRlci9maWx0ZXJfbWFpbi5jYyBiL3NyYy9rZW5sbS9sbS9maWx0ZXIvZmlsdGVyX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4OWQxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9maWx0ZXIvZmlsdGVyX21haW4uY2MKQEAgLTAsMCArMSwyNTMgQEAKKyNpbmNsdWRlICJsbS9maWx0ZXIvYXJwYV9pby5oaCIKKyNpbmNsdWRlICJsbS9maWx0ZXIvZm9ybWF0LmhoIgorI2luY2x1ZGUgImxtL2ZpbHRlci9waHJhc2UuaGgiCisjaWZuZGVmIE5USFJFQUQKKyNpbmNsdWRlICJsbS9maWx0ZXIvdGhyZWFkLmhoIgorI2VuZGlmCisjaW5jbHVkZSAibG0vZmlsdGVyL3ZvY2FiLmhoIgorI2luY2x1ZGUgImxtL2ZpbHRlci93cmFwcGVyLmhoIgorI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZV9waWVjZS5oaCIKKworI2luY2x1ZGUgPGJvb3N0L3B0cl9jb250YWluZXIvcHRyX3ZlY3Rvci5ocHA+CisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIHsKKwordm9pZCBEaXNwbGF5SGVscChjb25zdCBjaGFyICpuYW1lKSB7CisgIHN0ZDo6Y2VycgorICAgIDw8ICJVc2FnZTogIiA8PCBuYW1lIDw8ICIgbW9kZSBbY29udGV4dF0gW3BocmFzZV0gW3Jhd3xhcnBhXSBbdGhyZWFkczptXSBbYmF0Y2hfc2l6ZTptXSAodm9jYWJ8bW9kZWwpOmlucHV0X2ZpbGUgb3V0cHV0X2ZpbGVcblxuIgorICAgICJjb3B5IG1vZGUganVzdCBjb3BpZXMsIGJ1dCBtYWtlcyB0aGUgZm9ybWF0IG5pY2VyIGZvciBlLmcuIGlyc3RsbSdzIGJyb2tlblxuIgorICAgICIgICAgcGFyc2VyLlxuIgorICAgICJzaW5nbGUgbW9kZSB0cmVhdHMgdGhlIGVudGlyZSBpbnB1dCBhcyBhIHNpbmdsZSBzZW50ZW5jZS5cbiIKKyAgICAibXVsdGlwbGUgbW9kZSBmaWx0ZXJzIHRvIG11bHRpcGxlIHNlbnRlbmNlcyBpbiBwYXJhbGxlbC4gIEVhY2ggc2VudGVuY2UgaXMgb25cbiIKKyAgICAiICAgIGEgc2VwYXJhdGUgbGluZS4gIEEgc2VwYXJhdGUgZmlsZSBpcyBjcmVhdGVkIGZvciBlYWNoIHNlbnRlbmNlIGJ5IGFwcGVuZGluZ1xuIgorICAgICIgICAgdGhlIDAtaW5kZXhlZCBsaW5lIG51bWJlciB0byB0aGUgb3V0cHV0IGZpbGUgbmFtZS5cbiIKKyAgICAidW5pb24gbW9kZSBwcm9kdWNlcyBvbmUgZmlsdGVyZWQgbW9kZWwgdGhhdCBpcyB0aGUgdW5pb24gb2YgbW9kZWxzIGNyZWF0ZWQgYnlcbiIKKyAgICAiICAgIG11bHRpcGxlIG1vZGUuXG5cbiIKKyAgICAiY29udGV4dCBtZWFucyBvbmx5IHRoZSBjb250ZXh0IChhbGwgYnV0IGxhc3Qgd29yZCkgaGFzIHRvIHBhc3MgdGhlIGZpbHRlciwgYnV0XG4iCisgICAgIiAgICB0aGUgZW50aXJlIG4tZ3JhbSBpcyBvdXRwdXQuXG5cbiIKKyAgICAicGhyYXNlIG1lYW5zIHRoYXQgdGhlIHZvY2FidWxhcnkgaXMgYWN0dWFsbHkgdGFiLWRlbGltaXRlZCBwaHJhc2VzIGFuZCB0aGF0IHRoZVxuIgorICAgICIgICAgcGhyYXNlcyBjYW4gZ2VuZXJhdGUgdGhlIG4tZ3JhbSB3aGVuIGFzc2VtYmxlZCBpbiBhcmJpdHJhcnkgb3JkZXIgYW5kXG4iCisgICAgIiAgICBjbGlwcGVkLiAgQ3VycmVudGx5IHdvcmtzIHdpdGggbXVsdGlwbGUgb3IgdW5pb24gbW9kZS5cblxuIgorICAgICJUaGUgZmlsZSBmb3JtYXQgaXMgc2V0IGJ5IFtyYXd8YXJwYV0gd2l0aCBkZWZhdWx0IGFycGE6XG4iCisgICAgInJhdyBtZWFucyBzcGFjZS1zZXBhcmF0ZWQgdG9rZW5zLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgdGFiIGFuZCBhcmJpdHJhcnlcbiIKKyAgICAiICAgIHRleHQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgbmdyYW0gY291bnQgZmlsZXMuXG4iCisgICAgImFycGEgbWVhbnMgdGhlIEFSUEEgZmlsZSBmb3JtYXQgZm9yIG4tZ3JhbSBsYW5ndWFnZSBtb2RlbHMuXG5cbiIKKyNpZm5kZWYgTlRIUkVBRAorICAgICJ0aHJlYWRzOm0gc2V0cyBtIHRocmVhZHMgKGRlZmF1bHQ6IGNvbmNjdXJyZW5jeSBkZXRlY3RlZCBieSBib29zdClcbiIKKyAgICAiYmF0Y2hfc2l6ZTptIHNldHMgdGhlIGJhdGNoIHNpemUgZm9yIHRocmVhZGluZy4gIEV4cGVjdCBtZW1vcnkgdXNhZ2UgZnJvbSB0aGlzXG4iCisgICAgIiAgICBvZiAyKnRocmVhZHMqYmF0Y2hfc2l6ZSBuLWdyYW1zLlxuXG4iCisjZWxzZQorICAgICJUaGlzIGJpbmFyeSB3YXMgY29tcGlsZWQgd2l0aCAtRE5USFJFQUQsIGRpc2FibGluZyB0aHJlYWRpbmcuICBJZiB5b3Ugd2FudGVkXG4iCisgICAgIiAgICB0aHJlYWRpbmcsIGNvbXBpbGUgd2l0aG91dCB0aGlzIGZsYWcgYWdhaW5zdCBCb29zdCA+PTEuNDIuMC5cblxuIgorI2VuZGlmCisgICAgIlRoZXJlIGFyZSB0d28gaW5wdXRzOiB2b2NhYnVsYXJ5IGFuZCBtb2RlbC4gIEVpdGhlciBtYXkgYmUgZ2l2ZW4gYXMgYSBmaWxlXG4iCisgICAgIiAgICB3aGlsZSB0aGUgb3RoZXIgaXMgb24gc3RkaW4uICBTcGVjaWZ5IHRoZSB0eXBlIGdpdmVuIGFzIGEgZmlsZSB1c2luZ1xuIgorICAgICIgICAgdm9jYWI6IG9yIG1vZGVsOiBiZWZvcmUgdGhlIGZpbGUgbmFtZS4gIFxuXG4iCisgICAgIkZvciBBUlBBIGZvcm1hdCwgdGhlIG91dHB1dCBtdXN0IGJlIHNlZWthYmxlLiAgRm9yIHJhdyBmb3JtYXQsIGl0IGNhbiBiZSBhXG4iCisgICAgIiAgICBzdHJlYW0gaS5lLiAvZGV2L3N0ZG91dFxuIjsKK30KKwordHlwZWRlZiBlbnVtIHtNT0RFX0NPUFksIE1PREVfU0lOR0xFLCBNT0RFX01VTFRJUExFLCBNT0RFX1VOSU9OLCBNT0RFX1VOU0VUfSBGaWx0ZXJNb2RlOwordHlwZWRlZiBlbnVtIHtGT1JNQVRfQVJQQSwgRk9STUFUX0NPVU5UfSBGb3JtYXQ7CisKK3N0cnVjdCBDb25maWcgeworICBDb25maWcoKSA6CisjaWZuZGVmIE5USFJFQUQKKyAgYmF0Y2hfc2l6ZSgyNTAwMCksCisgIHRocmVhZHMoYm9vc3Q6OnRocmVhZDo6aGFyZHdhcmVfY29uY3VycmVuY3koKSksCisjZW5kaWYKKyAgcGhyYXNlKGZhbHNlKSwKKyAgY29udGV4dChmYWxzZSksCisgIGZvcm1hdChGT1JNQVRfQVJQQSkKKyAgeworI2lmbmRlZiBOVEhSRUFECisgICAgaWYgKCF0aHJlYWRzKSB0aHJlYWRzID0gMTsKKyNlbmRpZgorICB9CisKKyNpZm5kZWYgTlRIUkVBRAorICBzaXplX3QgYmF0Y2hfc2l6ZTsKKyAgc2l6ZV90IHRocmVhZHM7CisjZW5kaWYKKyAgYm9vbCBwaHJhc2U7CisgIGJvb2wgY29udGV4dDsKKyAgRmlsdGVyTW9kZSBtb2RlOworICBGb3JtYXQgZm9ybWF0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcm1hdCwgY2xhc3MgRmlsdGVyLCBjbGFzcyBPdXRwdXRCdWZmZXIsIGNsYXNzIE91dHB1dD4gdm9pZCBSdW5UaHJlYWRlZEZpbHRlcihjb25zdCBDb25maWcgJmNvbmZpZywgdXRpbDo6RmlsZVBpZWNlICZpbl9sbSwgRmlsdGVyICZmaWx0ZXIsIE91dHB1dCAmb3V0cHV0KSB7CisjaWZuZGVmIE5USFJFQUQKKyAgaWYgKGNvbmZpZy50aHJlYWRzID09IDEpIHsKKyNlbmRpZgorICAgIEZvcm1hdDo6UnVuRmlsdGVyKGluX2xtLCBmaWx0ZXIsIG91dHB1dCk7CisjaWZuZGVmIE5USFJFQUQKKyAgfSBlbHNlIHsKKyAgICB0eXBlZGVmIENvbnRyb2xsZXI8RmlsdGVyLCBPdXRwdXRCdWZmZXIsIE91dHB1dD4gVGhyZWFkZWQ7CisgICAgVGhyZWFkZWQgdGhyZWFkaW5nKGNvbmZpZy5iYXRjaF9zaXplLCBjb25maWcudGhyZWFkcyAqIDIsIGNvbmZpZy50aHJlYWRzLCBmaWx0ZXIsIG91dHB1dCk7CisgICAgRm9ybWF0OjpSdW5GaWx0ZXIoaW5fbG0sIHRocmVhZGluZywgb3V0cHV0KTsKKyAgfQorI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBGb3JtYXQsIGNsYXNzIEZpbHRlciwgY2xhc3MgT3V0cHV0QnVmZmVyLCBjbGFzcyBPdXRwdXQ+IHZvaWQgUnVuQ29udGV4dEZpbHRlcihjb25zdCBDb25maWcgJmNvbmZpZywgdXRpbDo6RmlsZVBpZWNlICZpbl9sbSwgRmlsdGVyIGZpbHRlciwgT3V0cHV0ICZvdXRwdXQpIHsKKyAgaWYgKGNvbmZpZy5jb250ZXh0KSB7CisgICAgQ29udGV4dEZpbHRlcjxGaWx0ZXI+IGNvbnRleHRfZmlsdGVyKGZpbHRlcik7CisgICAgUnVuVGhyZWFkZWRGaWx0ZXI8Rm9ybWF0LCBDb250ZXh0RmlsdGVyPEZpbHRlcj4sIE91dHB1dEJ1ZmZlciwgT3V0cHV0Pihjb25maWcsIGluX2xtLCBjb250ZXh0X2ZpbHRlciwgb3V0cHV0KTsKKyAgfSBlbHNlIHsKKyAgICBSdW5UaHJlYWRlZEZpbHRlcjxGb3JtYXQsIEZpbHRlciwgT3V0cHV0QnVmZmVyLCBPdXRwdXQ+KGNvbmZpZywgaW5fbG0sIGZpbHRlciwgb3V0cHV0KTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRm9ybWF0LCBjbGFzcyBCaW5hcnk+IHZvaWQgRGlzcGF0Y2hCaW5hcnlGaWx0ZXIoY29uc3QgQ29uZmlnICZjb25maWcsIHV0aWw6OkZpbGVQaWVjZSAmaW5fbG0sIGNvbnN0IEJpbmFyeSAmYmluYXJ5LCB0eXBlbmFtZSBGb3JtYXQ6Ok91dHB1dCAmb3V0KSB7CisgIHR5cGVkZWYgQmluYXJ5RmlsdGVyPEJpbmFyeT4gRmlsdGVyOworICBSdW5Db250ZXh0RmlsdGVyPEZvcm1hdCwgRmlsdGVyLCBCaW5hcnlPdXRwdXRCdWZmZXIsIHR5cGVuYW1lIEZvcm1hdDo6T3V0cHV0Pihjb25maWcsIGluX2xtLCBGaWx0ZXIoYmluYXJ5KSwgb3V0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEZvcm1hdD4gdm9pZCBEaXNwYXRjaEZpbHRlck1vZGVzKGNvbnN0IENvbmZpZyAmY29uZmlnLCBzdGQ6OmlzdHJlYW0gJmluX3ZvY2FiLCB1dGlsOjpGaWxlUGllY2UgJmluX2xtLCBjb25zdCBjaGFyICpvdXRfbmFtZSkgeworICBpZiAoY29uZmlnLm1vZGUgPT0gTU9ERV9NVUxUSVBMRSkgeworICAgIGlmIChjb25maWcucGhyYXNlKSB7CisgICAgICB0eXBlZGVmIHBocmFzZTo6TXVsdGlwbGUgRmlsdGVyOworICAgICAgcGhyYXNlOjpTdWJzdHJpbmdzIHN1YnN0cmluZ3M7CisgICAgICB0eXBlbmFtZSBGb3JtYXQ6Ok11bHRpcGxlIG91dChvdXRfbmFtZSwgcGhyYXNlOjpSZWFkTXVsdGlwbGUoaW5fdm9jYWIsIHN1YnN0cmluZ3MpKTsKKyAgICAgIFJ1bkNvbnRleHRGaWx0ZXI8Rm9ybWF0LCBGaWx0ZXIsIE11bHRpcGxlT3V0cHV0QnVmZmVyLCB0eXBlbmFtZSBGb3JtYXQ6Ok11bHRpcGxlPihjb25maWcsIGluX2xtLCBGaWx0ZXIoc3Vic3RyaW5ncyksIG91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cGVkZWYgdm9jYWI6Ok11bHRpcGxlIEZpbHRlcjsKKyAgICAgIGJvb3N0Ojp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ID4gd29yZHM7CisgICAgICB0eXBlbmFtZSBGb3JtYXQ6Ok11bHRpcGxlIG91dChvdXRfbmFtZSwgdm9jYWI6OlJlYWRNdWx0aXBsZShpbl92b2NhYiwgd29yZHMpKTsKKyAgICAgIFJ1bkNvbnRleHRGaWx0ZXI8Rm9ybWF0LCBGaWx0ZXIsIE11bHRpcGxlT3V0cHV0QnVmZmVyLCB0eXBlbmFtZSBGb3JtYXQ6Ok11bHRpcGxlPihjb25maWcsIGluX2xtLCBGaWx0ZXIod29yZHMpLCBvdXQpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICB0eXBlbmFtZSBGb3JtYXQ6Ok91dHB1dCBvdXQob3V0X25hbWUpOworCisgIGlmIChjb25maWcubW9kZSA9PSBNT0RFX0NPUFkpIHsKKyAgICBGb3JtYXQ6OkNvcHkoaW5fbG0sIG91dCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGNvbmZpZy5tb2RlID09IE1PREVfU0lOR0xFKSB7CisgICAgdm9jYWI6OlNpbmdsZTo6V29yZHMgd29yZHM7CisgICAgdm9jYWI6OlJlYWRTaW5nbGUoaW5fdm9jYWIsIHdvcmRzKTsKKyAgICBEaXNwYXRjaEJpbmFyeUZpbHRlcjxGb3JtYXQsIHZvY2FiOjpTaW5nbGU+KGNvbmZpZywgaW5fbG0sIHZvY2FiOjpTaW5nbGUod29yZHMpLCBvdXQpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChjb25maWcubW9kZSA9PSBNT0RFX1VOSU9OKSB7CisgICAgaWYgKGNvbmZpZy5waHJhc2UpIHsKKyAgICAgIHBocmFzZTo6U3Vic3RyaW5ncyBzdWJzdHJpbmdzOworICAgICAgcGhyYXNlOjpSZWFkTXVsdGlwbGUoaW5fdm9jYWIsIHN1YnN0cmluZ3MpOworICAgICAgRGlzcGF0Y2hCaW5hcnlGaWx0ZXI8Rm9ybWF0LCBwaHJhc2U6OlVuaW9uPihjb25maWcsIGluX2xtLCBwaHJhc2U6OlVuaW9uKHN1YnN0cmluZ3MpLCBvdXQpOworICAgIH0gZWxzZSB7CisgICAgICB2b2NhYjo6VW5pb246OldvcmRzIHdvcmRzOworICAgICAgdm9jYWI6OlJlYWRNdWx0aXBsZShpbl92b2NhYiwgd29yZHMpOworICAgICAgRGlzcGF0Y2hCaW5hcnlGaWx0ZXI8Rm9ybWF0LCB2b2NhYjo6VW5pb24+KGNvbmZpZywgaW5fbG0sIHZvY2FiOjpVbmlvbih3b3JkcyksIG91dCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorfQorCit9IC8vIG5hbWVzcGFjZQorfSAvLyBuYW1lc3BhY2UgbG0KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICB0cnkgeworICAgIGlmIChhcmdjIDwgNCkgeworICAgICAgbG06OkRpc3BsYXlIZWxwKGFyZ3ZbMF0pOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8gSSB1c2VkIHRvIGhhdmUgYm9vc3Q6OnByb2dyYW1fb3B0aW9ucywgYnV0IHNvbWUgdXNlcnMgZGlkbid0IHdhbnQgdG8gY29tcGlsZSBib29zdC4KKyAgICBsbTo6Q29uZmlnIGNvbmZpZzsKKyAgICBjb25maWcubW9kZSA9IGxtOjpNT0RFX1VOU0VUOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYyAtIDI7ICsraSkgeworICAgICAgY29uc3QgY2hhciAqc3RyID0gYXJndltpXTsKKyAgICAgIGlmICghc3RkOjpzdHJjbXAoc3RyLCAiY29weSIpKSB7CisgICAgICAgIGNvbmZpZy5tb2RlID0gbG06Ok1PREVfQ09QWTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0ZDo6c3RyY21wKHN0ciwgInNpbmdsZSIpKSB7CisgICAgICAgIGNvbmZpZy5tb2RlID0gbG06Ok1PREVfU0lOR0xFOworICAgICAgfSBlbHNlIGlmICghc3RkOjpzdHJjbXAoc3RyLCAibXVsdGlwbGUiKSkgeworICAgICAgICBjb25maWcubW9kZSA9IGxtOjpNT0RFX01VTFRJUExFOworICAgICAgfSBlbHNlIGlmICghc3RkOjpzdHJjbXAoc3RyLCAidW5pb24iKSkgeworICAgICAgICBjb25maWcubW9kZSA9IGxtOjpNT0RFX1VOSU9OOworICAgICAgfSBlbHNlIGlmICghc3RkOjpzdHJjbXAoc3RyLCAicGhyYXNlIikpIHsKKyAgICAgICAgY29uZmlnLnBocmFzZSA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKCFzdGQ6OnN0cmNtcChzdHIsICJjb250ZXh0IikpIHsKKyAgICAgICAgY29uZmlnLmNvbnRleHQgPSB0cnVlOworICAgICAgfSBlbHNlIGlmICghc3RkOjpzdHJjbXAoc3RyLCAiYXJwYSIpKSB7CisgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBsbTo6Rk9STUFUX0FSUEE7CisgICAgICB9IGVsc2UgaWYgKCFzdGQ6OnN0cmNtcChzdHIsICJyYXciKSkgeworICAgICAgICBjb25maWcuZm9ybWF0ID0gbG06OkZPUk1BVF9DT1VOVDsKKyNpZm5kZWYgTlRIUkVBRAorICAgICAgfSBlbHNlIGlmICghc3RkOjpzdHJuY21wKHN0ciwgInRocmVhZHM6IiwgOCkpIHsKKyAgICAgICAgY29uZmlnLnRocmVhZHMgPSBib29zdDo6bGV4aWNhbF9jYXN0PHNpemVfdD4oc3RyICsgOCk7CisgICAgICAgIGlmICghY29uZmlnLnRocmVhZHMpIHsKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlNwZWNpZnkgYXQgbGVhc3Qgb25lIHRocmVhZC4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghc3RkOjpzdHJuY21wKHN0ciwgImJhdGNoX3NpemU6IiwgMTEpKSB7CisgICAgICAgIGNvbmZpZy5iYXRjaF9zaXplID0gYm9vc3Q6OmxleGljYWxfY2FzdDxzaXplX3Q+KHN0ciArIDExKTsKKyAgICAgICAgaWYgKGNvbmZpZy5iYXRjaF9zaXplIDwgNTAwMCkgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiQmF0Y2ggc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBhbmQgc2hvdWxkIHByb2JhYmx5IGJlID49IDUwMDAiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICBpZiAoIWNvbmZpZy5iYXRjaF9zaXplKSByZXR1cm4gMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICB9IGVsc2UgeworICAgICAgICBsbTo6RGlzcGxheUhlbHAoYXJndlswXSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjb25maWcubW9kZSA9PSBsbTo6TU9ERV9VTlNFVCkgeworICAgICAgbG06OkRpc3BsYXlIZWxwKGFyZ3ZbMF0pOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGNvbmZpZy5waHJhc2UgJiYgY29uZmlnLm1vZGUgIT0gbG06Ok1PREVfVU5JT04gJiYgY29uZmlnLm1vZGUgIT0gbG06Ok1PREVfTVVMVElQTEUpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiUGhyYXNlIGNvbnN0cmFpbnQgY3VycmVudGx5IG9ubHkgd29ya3MgaW4gbXVsdGlwbGUgb3IgdW5pb24gbW9kZS4gIElmIHlvdSByZWFsbHkgbmVlZCBpdCBmb3Igc2luZ2xlLCBwdXQgZXZlcnl0aGluZyBvbiBvbmUgbGluZSBhbmQgdXNlIHVuaW9uLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgYm9vbCBjbWRfaXNfbW9kZWwgPSB0cnVlOworICAgIGNvbnN0IGNoYXIgKmNtZF9pbnB1dCA9IGFyZ3ZbYXJnYyAtIDJdOworICAgIGlmICghc3RybmNtcChjbWRfaW5wdXQsICJ2b2NhYjoiLCA2KSkgeworICAgICAgY21kX2lzX21vZGVsID0gZmFsc2U7CisgICAgICBjbWRfaW5wdXQgKz0gNjsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGNtZF9pbnB1dCwgIm1vZGVsOiIsIDYpKSB7CisgICAgICBjbWRfaW5wdXQgKz0gNjsKKyAgICB9IGVsc2UgaWYgKHN0cmNocihjbWRfaW5wdXQsICc6JykpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiU3BlY2lmeSB2b2NhYjogb3IgbW9kZWw6IGJlZm9yZSB0aGUgaW5wdXQgZmlsZSBuYW1lLCBub3QgIiA8PCBjbWRfaW5wdXQgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiQXNzdW1pbmcgdGhhdCAiIDw8IGNtZF9pbnB1dCA8PCAiIGlzIGEgbW9kZWwgZmlsZSIgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBzdGQ6Omlmc3RyZWFtIGNtZF9maWxlOworICAgIHN0ZDo6aXN0cmVhbSAqdm9jYWI7CisgICAgaWYgKGNtZF9pc19tb2RlbCkgeworICAgICAgdm9jYWIgPSAmc3RkOjpjaW47CisgICAgfSBlbHNlIHsKKyAgICAgIGNtZF9maWxlLm9wZW4oY21kX2lucHV0LCBzdGQ6Omlvczo6aW4pOworICAgICAgVVRJTF9USFJPV19JRighY21kX2ZpbGUsIHV0aWw6OkVycm5vRXhjZXB0aW9uLCAiRmFpbGVkIHRvIG9wZW4gIiA8PCBjbWRfaW5wdXQpOworICAgICAgdm9jYWIgPSAmY21kX2ZpbGU7CisgICAgfQorCisgICAgdXRpbDo6RmlsZVBpZWNlIG1vZGVsKGNtZF9pc19tb2RlbCA/IHV0aWw6Ok9wZW5SZWFkT3JUaHJvdyhjbWRfaW5wdXQpIDogMCwgY21kX2lzX21vZGVsID8gY21kX2lucHV0IDogTlVMTCwgJnN0ZDo6Y2Vycik7CisKKyAgICBpZiAoY29uZmlnLmZvcm1hdCA9PSBsbTo6Rk9STUFUX0FSUEEpIHsKKyAgICAgIGxtOjpEaXNwYXRjaEZpbHRlck1vZGVzPGxtOjpBUlBBRm9ybWF0Pihjb25maWcsICp2b2NhYiwgbW9kZWwsIGFyZ3ZbYXJnYyAtIDFdKTsKKyAgICB9IGVsc2UgaWYgKGNvbmZpZy5mb3JtYXQgPT0gbG06OkZPUk1BVF9DT1VOVCkgeworICAgICAgbG06OkRpc3BhdGNoRmlsdGVyTW9kZXM8bG06OkNvdW50Rm9ybWF0Pihjb25maWcsICp2b2NhYiwgbW9kZWwsIGFyZ3ZbYXJnYyAtIDFdKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZlKSB7CisgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gMTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ZpbHRlci9mb3JtYXQuaGggYi9zcmMva2VubG0vbG0vZmlsdGVyL2Zvcm1hdC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDUzZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci9mb3JtYXQuaGgKQEAgLTAsMCArMSwyNTAgQEAKKyNpZm5kZWYgTE1fRklMVEVSX0ZPUk1BVF9ICisjZGVmaW5lIExNX0ZJTFRFUl9GT1JNQVRfSAorCisjaW5jbHVkZSAibG0vZmlsdGVyL2FycGFfaW8uaGgiCisjaW5jbHVkZSAibG0vZmlsdGVyL2NvdW50X2lvLmhoIgorCisjaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9wdHJfY29udGFpbmVyL3B0cl92ZWN0b3IuaHBwPgorCisjaW5jbHVkZSA8aW9zZndkPgorCituYW1lc3BhY2UgbG0geworCit0ZW1wbGF0ZSA8Y2xhc3MgU2luZ2xlPiBjbGFzcyBNdWx0aXBsZU91dHB1dCB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBib29zdDo6cHRyX3ZlY3RvcjxTaW5nbGU+IFNpbmdsZXM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTaW5nbGVzOjppdGVyYXRvciBTaW5nbGVzSXRlcmF0b3I7CisKKyAgcHVibGljOgorICAgIE11bHRpcGxlT3V0cHV0KGNvbnN0IGNoYXIgKnByZWZpeCwgc2l6ZV90IG51bWJlcikgeworICAgICAgZmlsZXNfLnJlc2VydmUobnVtYmVyKTsKKyAgICAgIHN0ZDo6c3RyaW5nIHRtcDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbnVtYmVyOyArK2kpIHsKKyAgICAgICAgdG1wID0gcHJlZml4OworICAgICAgICB0bXAgKz0gYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oaSk7CisgICAgICAgIGZpbGVzXy5wdXNoX2JhY2sobmV3IFNpbmdsZSh0bXAuY19zdHIoKSkpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgQWRkTkdyYW0oY29uc3QgU3RyaW5nUGllY2UgJmxpbmUpIHsKKyAgICAgIGZvciAoU2luZ2xlc0l0ZXJhdG9yIGkgPSBmaWxlc18uYmVnaW4oKTsgaSAhPSBmaWxlc18uZW5kKCk7ICsraSkKKyAgICAgICAgaS0+QWRkTkdyYW0obGluZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPiB2b2lkIEFkZE5HcmFtKGNvbnN0IEl0ZXJhdG9yICZiZWdpbiwgY29uc3QgSXRlcmF0b3IgJmVuZCwgY29uc3QgU3RyaW5nUGllY2UgJmxpbmUpIHsKKyAgICAgIGZvciAoU2luZ2xlc0l0ZXJhdG9yIGkgPSBmaWxlc18uYmVnaW4oKTsgaSAhPSBmaWxlc18uZW5kKCk7ICsraSkKKyAgICAgICAgaS0+QWRkTkdyYW0oYmVnaW4sIGVuZCwgbGluZSk7CisgICAgfQorCisgICAgdm9pZCBTaW5nbGVBZGROR3JhbShzaXplX3Qgb2Zmc2V0LCBjb25zdCBTdHJpbmdQaWVjZSAmbGluZSkgeworICAgICAgZmlsZXNfW29mZnNldF0uQWRkTkdyYW0obGluZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPiB2b2lkIFNpbmdsZUFkZE5HcmFtKHNpemVfdCBvZmZzZXQsIGNvbnN0IEl0ZXJhdG9yICZiZWdpbiwgY29uc3QgSXRlcmF0b3IgJmVuZCwgY29uc3QgU3RyaW5nUGllY2UgJmxpbmUpIHsKKyAgICAgIGZpbGVzX1tvZmZzZXRdLkFkZE5HcmFtKGJlZ2luLCBlbmQsIGxpbmUpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgU2luZ2xlcyBmaWxlc187Cit9OworCitjbGFzcyBNdWx0aXBsZUFSUEFPdXRwdXQgOiBwdWJsaWMgTXVsdGlwbGVPdXRwdXQ8QVJQQU91dHB1dD4geworICBwdWJsaWM6CisgICAgTXVsdGlwbGVBUlBBT3V0cHV0KGNvbnN0IGNoYXIgKnByZWZpeCwgc2l6ZV90IG51bWJlcikgOiBNdWx0aXBsZU91dHB1dDxBUlBBT3V0cHV0PihwcmVmaXgsIG51bWJlcikge30KKworICAgIHZvaWQgUmVzZXJ2ZUZvckNvdW50cyhzdGQ6OnN0cmVhbXBvcyByZXNlcnZlKSB7CisgICAgICBmb3IgKGJvb3N0OjpwdHJfdmVjdG9yPEFSUEFPdXRwdXQ+OjppdGVyYXRvciBpID0gZmlsZXNfLmJlZ2luKCk7IGkgIT0gZmlsZXNfLmVuZCgpOyArK2kpCisgICAgICAgIGktPlJlc2VydmVGb3JDb3VudHMocmVzZXJ2ZSk7CisgICAgfQorCisgICAgdm9pZCBCZWdpbkxlbmd0aCh1bnNpZ25lZCBpbnQgbGVuZ3RoKSB7CisgICAgICBmb3IgKGJvb3N0OjpwdHJfdmVjdG9yPEFSUEFPdXRwdXQ+OjppdGVyYXRvciBpID0gZmlsZXNfLmJlZ2luKCk7IGkgIT0gZmlsZXNfLmVuZCgpOyArK2kpCisgICAgICAgIGktPkJlZ2luTGVuZ3RoKGxlbmd0aCk7CisgICAgfQorCisgICAgdm9pZCBFbmRMZW5ndGgodW5zaWduZWQgaW50IGxlbmd0aCkgeworICAgICAgZm9yIChib29zdDo6cHRyX3ZlY3RvcjxBUlBBT3V0cHV0Pjo6aXRlcmF0b3IgaSA9IGZpbGVzXy5iZWdpbigpOyBpICE9IGZpbGVzXy5lbmQoKTsgKytpKQorICAgICAgICBpLT5FbmRMZW5ndGgobGVuZ3RoKTsKKyAgICB9CisKKyAgICB2b2lkIEZpbmlzaCgpIHsKKyAgICAgIGZvciAoYm9vc3Q6OnB0cl92ZWN0b3I8QVJQQU91dHB1dD46Oml0ZXJhdG9yIGkgPSBmaWxlc18uYmVnaW4oKTsgaSAhPSBmaWxlc18uZW5kKCk7ICsraSkKKyAgICAgICAgaS0+RmluaXNoKCk7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIEZpbHRlciwgY2xhc3MgT3V0cHV0PiBjbGFzcyBEaXNwYXRjaElucHV0IHsKKyAgcHVibGljOgorICAgIERpc3BhdGNoSW5wdXQoRmlsdGVyICZmaWx0ZXIsIE91dHB1dCAmb3V0cHV0KSA6IGZpbHRlcl8oZmlsdGVyKSwgb3V0cHV0XyhvdXRwdXQpIHt9CisKKy8qICAgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gdm9pZCBBZGROR3JhbShjb25zdCBJdGVyYXRvciAmYmVnaW4sIGNvbnN0IEl0ZXJhdG9yICZlbmQsIGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lKSB7CisgICAgICBmaWx0ZXJfLkFkZE5HcmFtKGJlZ2luLCBlbmQsIGxpbmUsIG91dHB1dF8pOworICAgIH0qLworCisgICAgdm9pZCBBZGROR3JhbShjb25zdCBTdHJpbmdQaWVjZSAmbmdyYW0sIGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lKSB7CisgICAgICBmaWx0ZXJfLkFkZE5HcmFtKG5ncmFtLCBsaW5lLCBvdXRwdXRfKTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIEZpbHRlciAmZmlsdGVyXzsKKyAgICBPdXRwdXQgJm91dHB1dF87Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRmlsdGVyLCBjbGFzcyBPdXRwdXQ+IGNsYXNzIERpc3BhdGNoQVJQQUlucHV0IDogcHVibGljIERpc3BhdGNoSW5wdXQ8RmlsdGVyLCBPdXRwdXQ+IHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIERpc3BhdGNoSW5wdXQ8RmlsdGVyLCBPdXRwdXQ+IEI7CisKKyAgcHVibGljOgorICAgIERpc3BhdGNoQVJQQUlucHV0KEZpbHRlciAmZmlsdGVyLCBPdXRwdXQgJm91dHB1dCkgOiBCKGZpbHRlciwgb3V0cHV0KSB7fQorCisgICAgdm9pZCBSZXNlcnZlRm9yQ291bnRzKHN0ZDo6c3RyZWFtcG9zIHJlc2VydmUpIHsgQjo6b3V0cHV0Xy5SZXNlcnZlRm9yQ291bnRzKHJlc2VydmUpOyB9CisgICAgdm9pZCBCZWdpbkxlbmd0aCh1bnNpZ25lZCBpbnQgbGVuZ3RoKSB7IEI6Om91dHB1dF8uQmVnaW5MZW5ndGgobGVuZ3RoKTsgfQorCisgICAgdm9pZCBFbmRMZW5ndGgodW5zaWduZWQgaW50IGxlbmd0aCkgeworICAgICAgQjo6ZmlsdGVyXy5GbHVzaCgpOworICAgICAgQjo6b3V0cHV0Xy5FbmRMZW5ndGgobGVuZ3RoKTsKKyAgICB9CisgICAgdm9pZCBGaW5pc2goKSB7IEI6Om91dHB1dF8uRmluaXNoKCk7IH0KK307CisKK3N0cnVjdCBBUlBBRm9ybWF0IHsKKyAgdHlwZWRlZiBBUlBBT3V0cHV0IE91dHB1dDsKKyAgdHlwZWRlZiBNdWx0aXBsZUFSUEFPdXRwdXQgTXVsdGlwbGU7CisgIHN0YXRpYyB2b2lkIENvcHkodXRpbDo6RmlsZVBpZWNlICZpbiwgT3V0cHV0ICZvdXQpIHsKKyAgICBSZWFkQVJQQShpbiwgb3V0KTsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgRmlsdGVyLCBjbGFzcyBPdXQ+IHN0YXRpYyB2b2lkIFJ1bkZpbHRlcih1dGlsOjpGaWxlUGllY2UgJmluLCBGaWx0ZXIgJmZpbHRlciwgT3V0ICZvdXRwdXQpIHsKKyAgICBEaXNwYXRjaEFSUEFJbnB1dDxGaWx0ZXIsIE91dD4gZGlzcGF0Y2hlcihmaWx0ZXIsIG91dHB1dCk7CisgICAgUmVhZEFSUEEoaW4sIGRpc3BhdGNoZXIpOworICB9Cit9OworCitzdHJ1Y3QgQ291bnRGb3JtYXQgeworICB0eXBlZGVmIENvdW50T3V0cHV0IE91dHB1dDsKKyAgdHlwZWRlZiBNdWx0aXBsZU91dHB1dDxPdXRwdXQ+IE11bHRpcGxlOworICBzdGF0aWMgdm9pZCBDb3B5KHV0aWw6OkZpbGVQaWVjZSAmaW4sIE91dHB1dCAmb3V0KSB7CisgICAgUmVhZENvdW50KGluLCBvdXQpOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBGaWx0ZXIsIGNsYXNzIE91dD4gc3RhdGljIHZvaWQgUnVuRmlsdGVyKHV0aWw6OkZpbGVQaWVjZSAmaW4sIEZpbHRlciAmZmlsdGVyLCBPdXQgJm91dHB1dCkgeworICAgIERpc3BhdGNoSW5wdXQ8RmlsdGVyLCBPdXQ+IGRpc3BhdGNoZXIoZmlsdGVyLCBvdXRwdXQpOworICAgIFJlYWRDb3VudChpbiwgZGlzcGF0Y2hlcik7CisgIH0KK307CisKKy8qIEZvciBtdWx0aXRocmVhZGluZywgdGhlIGJ1ZmZlciBjbGFzc2VzIGhvbGQgYmF0Y2hlcyBvZiBmaWx0ZXIgaW5wdXRzIGFuZAorICogb3V0cHV0cyBpbiBtZW1vcnkuICBUaGUgc3RyaW5ncyBnZXQgcmV1c2VkIGEgbG90LCBzbyBrZWVwIHRoZW0gYXJvdW5kCisgKiBpbnN0ZWFkIG9mIGNsZWFyaW5nIGVhY2ggdGltZS4KKyAqLworY2xhc3MgSW5wdXRCdWZmZXIgeworICBwdWJsaWM6CisgICAgSW5wdXRCdWZmZXIoKSA6IGFjdHVhbF8oMCkge30KKworICAgIHZvaWQgUmVzZXJ2ZShzaXplX3Qgc2l6ZSkgeyBsaW5lc18ucmVzZXJ2ZShzaXplKTsgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIE91dHB1dD4gdm9pZCBBZGROR3JhbShjb25zdCBTdHJpbmdQaWVjZSAmbmdyYW0sIGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lLCBPdXRwdXQgJm91dHB1dCkgeworICAgICAgaWYgKGxpbmVzXy5zaXplKCkgPT0gYWN0dWFsXykgbGluZXNfLnJlc2l6ZShsaW5lc18uc2l6ZSgpICsgMSk7CisgICAgICAvLyBUT0RPIGF2b2lkIHRoaXMgY29weS4KKyAgICAgIHN0ZDo6c3RyaW5nICZjb3BpZWQgPSBsaW5lc19bYWN0dWFsX10ubGluZTsKKyAgICAgIGNvcGllZC5hc3NpZ24obGluZS5kYXRhKCksIGxpbmUuc2l6ZSgpKTsKKyAgICAgIGxpbmVzX1thY3R1YWxfXS5uZ3JhbS5zZXQoY29waWVkLmRhdGEoKSArIChuZ3JhbS5kYXRhKCkgLSBsaW5lLmRhdGEoKSksIG5ncmFtLnNpemUoKSk7CisgICAgICArK2FjdHVhbF87CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIEZpbHRlciwgY2xhc3MgT3V0cHV0PiB2b2lkIENhbGxGaWx0ZXIoRmlsdGVyICZmaWx0ZXIsIE91dHB1dCAmb3V0cHV0KSBjb25zdCB7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPExpbmU+Ojpjb25zdF9pdGVyYXRvciBpID0gbGluZXNfLmJlZ2luKCk7IGkgIT0gbGluZXNfLmJlZ2luKCkgKyBhY3R1YWxfOyArK2kpIHsKKyAgICAgICAgZmlsdGVyLkFkZE5HcmFtKGktPm5ncmFtLCBpLT5saW5lLCBvdXRwdXQpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgQ2xlYXIoKSB7IGFjdHVhbF8gPSAwOyB9CisgICAgYm9vbCBFbXB0eSgpIHsgcmV0dXJuIGFjdHVhbF8gPT0gMDsgfQorICAgIHNpemVfdCBTaXplKCkgeyByZXR1cm4gYWN0dWFsXzsgfQorCisgIHByaXZhdGU6CisgICAgc3RydWN0IExpbmUgeworICAgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICAgIFN0cmluZ1BpZWNlIG5ncmFtOworICAgIH07CisKKyAgICBzaXplX3QgYWN0dWFsXzsKKworICAgIHN0ZDo6dmVjdG9yPExpbmU+IGxpbmVzXzsKK307CisKK2NsYXNzIEJpbmFyeU91dHB1dEJ1ZmZlciB7CisgIHB1YmxpYzoKKyAgICBCaW5hcnlPdXRwdXRCdWZmZXIoKSB7fQorCisgICAgdm9pZCBSZXNlcnZlKHNpemVfdCBzaXplKSB7CisgICAgICBsaW5lc18ucmVzZXJ2ZShzaXplKTsKKyAgICB9CisKKyAgICB2b2lkIEFkZE5HcmFtKGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lKSB7CisgICAgICBsaW5lc18ucHVzaF9iYWNrKGxpbmUpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBPdXRwdXQ+IHZvaWQgRmx1c2goT3V0cHV0ICZvdXRwdXQpIHsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8U3RyaW5nUGllY2U+Ojpjb25zdF9pdGVyYXRvciBpID0gbGluZXNfLmJlZ2luKCk7IGkgIT0gbGluZXNfLmVuZCgpOyArK2kpIHsKKyAgICAgICAgb3V0cHV0LkFkZE5HcmFtKCppKTsKKyAgICAgIH0KKyAgICAgIGxpbmVzXy5jbGVhcigpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPFN0cmluZ1BpZWNlPiBsaW5lc187Cit9OworCitjbGFzcyBNdWx0aXBsZU91dHB1dEJ1ZmZlciB7CisgIHB1YmxpYzoKKyAgICBNdWx0aXBsZU91dHB1dEJ1ZmZlcigpIDogbGFzdF8oTlVMTCkge30KKworICAgIHZvaWQgUmVzZXJ2ZShzaXplX3Qgc2l6ZSkgeworICAgICAgYW5ub3RhdGVkXy5yZXNlcnZlKHNpemUpOworICAgIH0KKworICAgIHZvaWQgQWRkTkdyYW0oY29uc3QgU3RyaW5nUGllY2UgJmxpbmUpIHsKKyAgICAgIGFubm90YXRlZF8ucmVzaXplKGFubm90YXRlZF8uc2l6ZSgpICsgMSk7CisgICAgICBhbm5vdGF0ZWRfLmJhY2soKS5saW5lID0gbGluZTsKKyAgICB9CisKKyAgICB2b2lkIFNpbmdsZUFkZE5HcmFtKHNpemVfdCBvZmZzZXQsIGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lKSB7CisgICAgICBpZiAoKGxpbmUuZGF0YSgpID09IGxhc3RfLmRhdGEoKSkgJiYgKGxpbmUubGVuZ3RoKCkgPT0gbGFzdF8ubGVuZ3RoKCkpKSB7CisgICAgICAgIGFubm90YXRlZF8uYmFjaygpLnN5c3RlbXMucHVzaF9iYWNrKG9mZnNldCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhbm5vdGF0ZWRfLnJlc2l6ZShhbm5vdGF0ZWRfLnNpemUoKSArIDEpOworICAgICAgICBhbm5vdGF0ZWRfLmJhY2soKS5zeXN0ZW1zLnB1c2hfYmFjayhvZmZzZXQpOworICAgICAgICBhbm5vdGF0ZWRfLmJhY2soKS5saW5lID0gbGluZTsKKyAgICAgICAgbGFzdF8gPSBsaW5lOworICAgICAgfQorICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBPdXRwdXQ+IHZvaWQgRmx1c2goT3V0cHV0ICZvdXRwdXQpIHsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8QW5ub3RhdGVkPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGFubm90YXRlZF8uYmVnaW4oKTsgaSAhPSBhbm5vdGF0ZWRfLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYgKGktPnN5c3RlbXMuZW1wdHkoKSkgeworICAgICAgICAgIG91dHB1dC5BZGROR3JhbShpLT5saW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHNpemVfdD46OmNvbnN0X2l0ZXJhdG9yIGogPSBpLT5zeXN0ZW1zLmJlZ2luKCk7IGogIT0gaS0+c3lzdGVtcy5lbmQoKTsgKytqKSB7CisgICAgICAgICAgICBvdXRwdXQuU2luZ2xlQWRkTkdyYW0oKmosIGktPmxpbmUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYW5ub3RhdGVkXy5jbGVhcigpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0cnVjdCBBbm5vdGF0ZWQgeworICAgICAgLy8gSWYgdGhpcyBpcyBlbXB0eSwgc2VuZCB0byBhbGwgc3lzdGVtcy4KKyAgICAgIC8vIEEgZmlsdGVyIHNob3VsZCBuZXZlciBzZW5kIHRvIGFsbCBzeXN0ZW1zIGFuZCBzZW5kIHRvIGEgc2luZ2xlIG9uZS4KKyAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gc3lzdGVtczsKKyAgICAgIFN0cmluZ1BpZWNlIGxpbmU7CisgICAgfTsKKworICAgIFN0cmluZ1BpZWNlIGxhc3RfOworCisgICAgc3RkOjp2ZWN0b3I8QW5ub3RhdGVkPiBhbm5vdGF0ZWRfOworfTsKKworfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX0ZJTFRFUl9GT1JNQVRfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ZpbHRlci9waHJhc2UuY2MgYi9zcmMva2VubG0vbG0vZmlsdGVyL3BocmFzZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODI2MGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci9waHJhc2UuY2MKQEAgLTAsMCArMSwyOTIgQEAKKyNpbmNsdWRlICJsbS9maWx0ZXIvcGhyYXNlLmhoIgorCisjaW5jbHVkZSAibG0vZmlsdGVyL2Zvcm1hdC5oaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxjY3R5cGU+CisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgcGhyYXNlIHsKKwordW5zaWduZWQgaW50IFJlYWRNdWx0aXBsZShzdGQ6OmlzdHJlYW0gJmluLCBTdWJzdHJpbmdzICZvdXQpIHsKKyAgYm9vbCBzZW50ZW5jZV9jb250ZW50ID0gZmFsc2U7CisgIHVuc2lnbmVkIGludCBzZW50ZW5jZV9pZCA9IDA7CisgIHN0ZDo6dmVjdG9yPEhhc2g+IHBocmFzZTsKKyAgc3RkOjpzdHJpbmcgd29yZDsKKyAgd2hpbGUgKGluKSB7CisgICAgY2hhciBjOworICAgIC8vIEdhdGhlciBhIHdvcmQuCisgICAgd2hpbGUgKCFpc3NwYWNlKGMgPSBpbi5nZXQoKSkgJiYgaW4pIHdvcmQgKz0gYzsKKyAgICAvLyBUcmVhdCBFT0YgbGlrZSBhIG5ld2xpbmUuCisgICAgaWYgKCFpbikgYyA9ICdcbic7CisgICAgLy8gQWRkIHRoZSB3b3JkIHRvIHRoZSBwaHJhc2UuCisgICAgaWYgKCF3b3JkLmVtcHR5KCkpIHsKKyAgICAgIHBocmFzZS5wdXNoX2JhY2sodXRpbDo6TXVybXVySGFzaE5hdGl2ZSh3b3JkLmRhdGEoKSwgd29yZC5zaXplKCkpKTsKKyAgICAgIHdvcmQuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKGMgPT0gJyAnKSBjb250aW51ZTsKKyAgICAvLyBJdCdzIG1vcmUgdGhhbiBqdXN0IGEgc3BhY2UuICBDbG9zZSBvdXQgdGhlIHBocmFzZS4KKyAgICBpZiAoIXBocmFzZS5lbXB0eSgpKSB7CisgICAgICBzZW50ZW5jZV9jb250ZW50ID0gdHJ1ZTsKKyAgICAgIG91dC5BZGRQaHJhc2Uoc2VudGVuY2VfaWQsIHBocmFzZS5iZWdpbigpLCBwaHJhc2UuZW5kKCkpOworICAgICAgcGhyYXNlLmNsZWFyKCk7CisgICAgfQorICAgIGlmIChjID09ICdcdCcgfHwgYyA9PSAnXHYnKSBjb250aW51ZTsKKyAgICAvLyBJdCdzIG1vcmUgdGhhbiBhIHNwYWNlIG9yIHRhYjogYSBuZXdsaW5lLgorICAgIGlmIChzZW50ZW5jZV9jb250ZW50KSB7CisgICAgICArK3NlbnRlbmNlX2lkOworICAgICAgc2VudGVuY2VfY29udGVudCA9IGZhbHNlOworICAgIH0KKyAgfQorICBpZiAoIWluLmVvZigpKSBpbi5leGNlcHRpb25zKHN0ZDo6aXN0cmVhbTo6ZmFpbGJpdCB8IHN0ZDo6aXN0cmVhbTo6YmFkYml0KTsKKyAgcmV0dXJuIHNlbnRlbmNlX2lkICsgc2VudGVuY2VfY29udGVudDsKK30KKworbmFtZXNwYWNlIHsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFNlbnRlbmNlOwordHlwZWRlZiBzdGQ6OnZlY3RvcjxTZW50ZW5jZT4gU2VudGVuY2VzOworfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK2NvbnN0IFN0cmluZ1BpZWNlIGtFbmRTZW50ZW5jZSgiPC9zPiIpOworCitjbGFzcyBBcmMgeworICBwdWJsaWM6CisgICAgQXJjKCkge30KKworICAgIC8vIEZvciBhcmNzIGZyb20gb25lIHZlcnRleCB0byBhbm90aGVyLgorICAgIHZvaWQgU2V0UGhyYXNlKGRldGFpbDo6VmVydGV4ICZmcm9tLCBkZXRhaWw6OlZlcnRleCAmdG8sIGNvbnN0IFNlbnRlbmNlcyAmaW50ZXJzZWN0KSB7CisgICAgICBTZXQodG8sIGludGVyc2VjdCk7CisgICAgICBmcm9tXyA9ICZmcm9tOworICAgIH0KKworICAgIC8qIEZvciBhcmNzIGZyb20gYmVmb3JlIHRoZSBuLWdyYW0gYmVnaW5zIHRvIHNvbWV3aGVyZSBpbiB0aGUgbi1ncmFtIChyaWdodAorICAgICAqIGFsaWduZWQpLiAgVGhlc2UgaGF2ZSBubyBmcm9tXyB2ZXJ0ZXg7IGl0IGltcGxpY3RseSBtYXRjaGVzIGV2ZXJ5CisgICAgICogc2VudGVuY2UuICBUaGlzIGFsc28gaGFuZGxlcyB3aGVuIHRoZSBuLWdyYW0gaXMgYSBzdWJzdHJpbmcgb2YgYSBwaHJhc2UuCisgICAgICovCisgICAgdm9pZCBTZXRSaWdodChkZXRhaWw6OlZlcnRleCAmdG8sIGNvbnN0IFNlbnRlbmNlcyAmY29tcGxldGUpIHsKKyAgICAgIFNldCh0bywgY29tcGxldGUpOworICAgICAgZnJvbV8gPSBOVUxMOworICAgIH0KKworICAgIFNlbnRlbmNlIEN1cnJlbnQoKSBjb25zdCB7CisgICAgICByZXR1cm4gKmN1cnJlbnRfOworICAgIH0KKworICAgIGJvb2wgRW1wdHkoKSBjb25zdCB7CisgICAgICByZXR1cm4gY3VycmVudF8gPT0gbGFzdF87CisgICAgfQorCisgICAgLyogV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnM6CisgICAgICogSWYgRW1wdHkoKSB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IGZyb20gdGhpcyBpbnRlcnNlY3Rpb24uCisgICAgICoKKyAgICAgKiBJZiBDdXJyZW50KCkgPT0gdG8gdGhlbiB0byBpcyBwYXJ0IG9mIHRoZSBpbnRlcnNlY3Rpb24uCisgICAgICoKKyAgICAgKiBPdGhlcndpc2UsIEN1cnJlbnQoKSA+IHRvLiAgSW4gdGhpcyBjYXNlLCB0byBpcyBub3QgcGFydCBvZiB0aGUKKyAgICAgKiBpbnRlcnNlY3Rpb24gYW5kIG5laXRoZXIgaXMgYW55dGhpbmcgPCBDdXJyZW50KCkuICBUbyBkZXRlcm1pbmUgaWYKKyAgICAgKiBhbnkgdmFsdWUgPj0gQ3VycmVudCgpIGlzIGluIHRoZSBpbnRlcnNlY3Rpb24sIGNhbGwgTG93ZXJCb3VuZCBhZ2FpbgorICAgICAqIHdpdGggdGhlIHZhbHVlLgorICAgICAqLworICAgIHZvaWQgTG93ZXJCb3VuZChjb25zdCBTZW50ZW5jZSB0byk7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIFNldChkZXRhaWw6OlZlcnRleCAmdG8sIGNvbnN0IFNlbnRlbmNlcyAmc2VudGVuY2VzKTsKKworICAgIGNvbnN0IFNlbnRlbmNlICpjdXJyZW50XzsKKyAgICBjb25zdCBTZW50ZW5jZSAqbGFzdF87CisgICAgZGV0YWlsOjpWZXJ0ZXggKmZyb21fOworfTsKKworc3RydWN0IEFyY0dyZWF0ZXIgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248Y29uc3QgQXJjICosIGNvbnN0IEFyYyAqLCBib29sPiB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBcmMgKmZpcnN0LCBjb25zdCBBcmMgKnNlY29uZCkgY29uc3QgeworICAgIHJldHVybiBmaXJzdC0+Q3VycmVudCgpID4gc2Vjb25kLT5DdXJyZW50KCk7CisgIH0KK307CisKK2NsYXNzIFZlcnRleCB7CisgIHB1YmxpYzoKKyAgICBWZXJ0ZXgoKSA6IGN1cnJlbnRfKDApIHt9CisKKyAgICBTZW50ZW5jZSBDdXJyZW50KCkgY29uc3QgeworICAgICAgcmV0dXJuIGN1cnJlbnRfOworICAgIH0KKworICAgIGJvb2wgRW1wdHkoKSBjb25zdCB7CisgICAgICByZXR1cm4gaW5jb21pbmdfLmVtcHR5KCk7CisgICAgfQorCisgICAgdm9pZCBMb3dlckJvdW5kKGNvbnN0IFNlbnRlbmNlIHRvKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBBcmM7CisKKyAgICB2b2lkIEFkZEluY29taW5nKEFyYyAqYXJjKSB7CisgICAgICBpZiAoIWFyYy0+RW1wdHkoKSkgaW5jb21pbmdfLnB1c2goYXJjKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBpbnQgY3VycmVudF87CisgICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxBcmMqLCBzdGQ6OnZlY3RvcjxBcmMqPiwgQXJjR3JlYXRlcj4gaW5jb21pbmdfOworfTsKKwordm9pZCBBcmM6Okxvd2VyQm91bmQoY29uc3QgU2VudGVuY2UgdG8pIHsKKyAgY3VycmVudF8gPSBzdGQ6Omxvd2VyX2JvdW5kKGN1cnJlbnRfLCBsYXN0XywgdG8pOworICAvLyBJZiAqY3VycmVudF8gPiB0bywgZG9uJ3QgYWR2YW5jZSBmcm9tXy4gIFRoZSBpbnRlcnZlbmluZyB2YWx1ZXMgb2YKKyAgLy8gZnJvbV8gbWF5IGJlIHVzZWZ1bCBmb3IgYW5vdGhlciBvbmUgb2YgaXRzIG91dGdvaW5nIGFyY3MuCisgIGlmICghZnJvbV8gfHwgRW1wdHkoKSB8fCAoQ3VycmVudCgpID4gdG8pKSByZXR1cm47CisgIGFzc2VydChDdXJyZW50KCkgPT0gdG8pOworICBmcm9tXy0+TG93ZXJCb3VuZCh0byk7CisgIGlmIChmcm9tXy0+RW1wdHkoKSkgeworICAgIGN1cnJlbnRfID0gbGFzdF87CisgICAgcmV0dXJuOworICB9CisgIGFzc2VydChmcm9tXy0+Q3VycmVudCgpID49IHRvKTsKKyAgaWYgKGZyb21fLT5DdXJyZW50KCkgPiB0bykgeworICAgIGN1cnJlbnRfID0gc3RkOjpsb3dlcl9ib3VuZChjdXJyZW50XyArIDEsIGxhc3RfLCBmcm9tXy0+Q3VycmVudCgpKTsKKyAgfQorfQorCit2b2lkIEFyYzo6U2V0KFZlcnRleCAmdG8sIGNvbnN0IFNlbnRlbmNlcyAmc2VudGVuY2VzKSB7CisgIGN1cnJlbnRfID0gJipzZW50ZW5jZXMuYmVnaW4oKTsKKyAgbGFzdF8gPSAmKnNlbnRlbmNlcy5lbmQoKTsKKyAgdG8uQWRkSW5jb21pbmcodGhpcyk7Cit9CisKK3ZvaWQgVmVydGV4OjpMb3dlckJvdW5kKGNvbnN0IFNlbnRlbmNlIHRvKSB7CisgIGlmIChFbXB0eSgpKSByZXR1cm47CisgIC8vIFVuaW9uIGxvd2VyIGJvdW5kLgorICB3aGlsZSAodHJ1ZSkgeworICAgIEFyYyAqdG9wID0gaW5jb21pbmdfLnRvcCgpOworICAgIGlmICh0b3AtPkN1cnJlbnQoKSA+IHRvKSB7CisgICAgICBjdXJyZW50XyA9IHRvcC0+Q3VycmVudCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBJZiB0b3AtPkN1cnJlbnQoKSA9PSB0bywgd2Ugc3RpbGwgbmVlZCB0byB2ZXJpZnkgdGhhdCdzIGFuIGFjdHVhbAorICAgIC8vIGVsZW1lbnQgYW5kIG5vdCBqdXN0IGEgYm91bmQuCisgICAgaW5jb21pbmdfLnBvcCgpOworICAgIHRvcC0+TG93ZXJCb3VuZCh0byk7CisgICAgaWYgKCF0b3AtPkVtcHR5KCkpIHsKKyAgICAgIGluY29taW5nXy5wdXNoKHRvcCk7CisgICAgICBpZiAodG9wLT5DdXJyZW50KCkgPT0gdG8pIHsKKyAgICAgICAgY3VycmVudF8gPSB0bzsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoRW1wdHkoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworbmFtZXNwYWNlIHsKKwordm9pZCBCdWlsZEdyYXBoKGNvbnN0IFN1YnN0cmluZ3MgJnBocmFzZSwgY29uc3Qgc3RkOjp2ZWN0b3I8SGFzaD4gJmhhc2hlcywgZGV0YWlsOjpWZXJ0ZXggKmNvbnN0IHZlcnRpY2VzLCBkZXRhaWw6OkFyYyAqZnJlZV9hcmMpIHsKKyAgdXNpbmcgZGV0YWlsOjpWZXJ0ZXg7CisgIHVzaW5nIGRldGFpbDo6QXJjOworICBhc3NlcnQoIWhhc2hlcy5lbXB0eSgpKTsKKworICBjb25zdCBIYXNoICpjb25zdCBmaXJzdF93b3JkID0gJipoYXNoZXMuYmVnaW4oKTsKKyAgY29uc3QgSGFzaCAqY29uc3QgbGFzdF93b3JkID0gJipoYXNoZXMuZW5kKCkgLSAxOworCisgIEhhc2ggaGFzaCA9IDA7CisgIGNvbnN0IFNlbnRlbmNlcyAqZm91bmQ7CisgIC8vIFBocmFzZXMgc3RhcnRpbmcgYXQgb3IgYmVmb3JlIHRoZSBmaXJzdCB3b3JkIGluIHRoZSBuLWdyYW0uCisgIHsKKyAgICBWZXJ0ZXggKnZlcnRleCA9IHZlcnRpY2VzOworICAgIGZvciAoY29uc3QgSGFzaCAqd29yZCA9IGZpcnN0X3dvcmQ7IDsgKyt3b3JkLCArK3ZlcnRleCkgeworICAgICAgaGFzaCA9IHV0aWw6Ok11cm11ckhhc2hOYXRpdmUoJmhhc2gsIHNpemVvZih1aW50NjRfdCksICp3b3JkKTsKKyAgICAgIC8vIE5vdyBoYXNoIGlzIFtoYXNoZXMuYmVnaW4oKSwgd29yZF0uCisgICAgICBpZiAod29yZCA9PSBsYXN0X3dvcmQpIHsKKyAgICAgICAgaWYgKHBocmFzZS5GaW5kU3Vic3RyaW5nKGhhc2gsIGZvdW5kKSkKKyAgICAgICAgICAoZnJlZV9hcmMrKyktPlNldFJpZ2h0KCp2ZXJ0ZXgsICpmb3VuZCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKCFwaHJhc2UuRmluZFJpZ2h0KGhhc2gsIGZvdW5kKSkgYnJlYWs7CisgICAgICAoZnJlZV9hcmMrKyktPlNldFJpZ2h0KCp2ZXJ0ZXgsICpmb3VuZCk7CisgICAgfQorICB9CisKKyAgLy8gUGhyYXNlcyBzdGFydGluZyBhdCB0aGUgc2Vjb25kIG9yIGxhdGVyIHdvcmQgaW4gdGhlIG4tZ3JhbS4KKyAgVmVydGV4ICp2ZXJ0ZXhfZnJvbSA9IHZlcnRpY2VzOworICBmb3IgKGNvbnN0IEhhc2ggKndvcmRfZnJvbSA9IGZpcnN0X3dvcmQgKyAxOyB3b3JkX2Zyb20gIT0gJipoYXNoZXMuZW5kKCk7ICsrd29yZF9mcm9tLCArK3ZlcnRleF9mcm9tKSB7CisgICAgaGFzaCA9IDA7CisgICAgVmVydGV4ICp2ZXJ0ZXhfdG8gPSB2ZXJ0ZXhfZnJvbSArIDE7CisgICAgZm9yIChjb25zdCBIYXNoICp3b3JkX3RvID0gd29yZF9mcm9tOyA7ICsrd29yZF90bywgKyt2ZXJ0ZXhfdG8pIHsKKyAgICAgIC8vIE5vdGljZSB0aGF0IHdvcmRfdG8gYW5kIHZlcnRleF90byBoYXZlIHRoZSBzYW1lIGluZGV4LgorICAgICAgaGFzaCA9IHV0aWw6Ok11cm11ckhhc2hOYXRpdmUoJmhhc2gsIHNpemVvZih1aW50NjRfdCksICp3b3JkX3RvKTsKKyAgICAgIC8vIE5vdyBoYXNoIGNvdmVycyBbd29yZF9mcm9tLCB3b3JkX3RvXS4KKyAgICAgIGlmICh3b3JkX3RvID09IGxhc3Rfd29yZCkgeworICAgICAgICBpZiAocGhyYXNlLkZpbmRMZWZ0KGhhc2gsIGZvdW5kKSkKKyAgICAgICAgICAoZnJlZV9hcmMrKyktPlNldFBocmFzZSgqdmVydGV4X2Zyb20sICp2ZXJ0ZXhfdG8sICpmb3VuZCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKCFwaHJhc2UuRmluZFBocmFzZShoYXNoLCBmb3VuZCkpIGJyZWFrOworICAgICAgKGZyZWVfYXJjKyspLT5TZXRQaHJhc2UoKnZlcnRleF9mcm9tLCAqdmVydGV4X3RvLCAqZm91bmQpOworICAgIH0KKyAgfQorfQorCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgZGV0YWlsIHsKKworLy8gSGVyZSBpbnN0ZWFkIG9mIGhlYWRlciBkdWUgdG8gZm9yd2FyZCBkZWNsYXJhdGlvbi4KK0NvbmRpdGlvbkNvbW1vbjo6Q29uZGl0aW9uQ29tbW9uKGNvbnN0IFN1YnN0cmluZ3MgJnN1YnN0cmluZ3MpIDogc3Vic3RyaW5nc18oc3Vic3RyaW5ncykge30KKworLy8gUmVzdCBvZiB0aGUgdmFyaWFibGVzIGFyZSB0ZW1wb3JhcmllcyBhbnl3YXkKK0NvbmRpdGlvbkNvbW1vbjo6Q29uZGl0aW9uQ29tbW9uKGNvbnN0IENvbmRpdGlvbkNvbW1vbiAmZnJvbSkgOiBzdWJzdHJpbmdzXyhmcm9tLnN1YnN0cmluZ3NfKSB7fQorCitDb25kaXRpb25Db21tb246On5Db25kaXRpb25Db21tb24oKSB7fQorCitkZXRhaWw6OlZlcnRleCAmQ29uZGl0aW9uQ29tbW9uOjpNYWtlR3JhcGgoKSB7CisgIGFzc2VydCghaGFzaGVzXy5lbXB0eSgpKTsKKyAgdmVydGljZXNfLmNsZWFyKCk7CisgIHZlcnRpY2VzXy5yZXNpemUoaGFzaGVzXy5zaXplKCkpOworICBhcmNzXy5jbGVhcigpOworICAvLyBPbmUgZm9yIGV2ZXJ5IHN1YnN0cmluZy4KKyAgYXJjc18ucmVzaXplKCgoaGFzaGVzXy5zaXplKCkgKyAxKSAqIGhhc2hlc18uc2l6ZSgpKSAvIDIpOworICBCdWlsZEdyYXBoKHN1YnN0cmluZ3NfLCBoYXNoZXNfLCAmKnZlcnRpY2VzXy5iZWdpbigpLCAmKmFyY3NfLmJlZ2luKCkpOworICByZXR1cm4gdmVydGljZXNfW2hhc2hlc18uc2l6ZSgpIC0gMV07Cit9CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCitib29sIFVuaW9uOjpFdmFsdWF0ZSgpIHsKKyAgZGV0YWlsOjpWZXJ0ZXggJmxhc3RfdmVydGV4ID0gTWFrZUdyYXBoKCk7CisgIHVuc2lnbmVkIGludCBsb3dlciA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgbGFzdF92ZXJ0ZXguTG93ZXJCb3VuZChsb3dlcik7CisgICAgaWYgKGxhc3RfdmVydGV4LkVtcHR5KCkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAobGFzdF92ZXJ0ZXguQ3VycmVudCgpID09IGxvd2VyKSByZXR1cm4gdHJ1ZTsKKyAgICBsb3dlciA9IGxhc3RfdmVydGV4LkN1cnJlbnQoKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgT3V0cHV0PiB2b2lkIE11bHRpcGxlOjpFdmFsdWF0ZShjb25zdCBTdHJpbmdQaWVjZSAmbGluZSwgT3V0cHV0ICZvdXRwdXQpIHsKKyAgZGV0YWlsOjpWZXJ0ZXggJmxhc3RfdmVydGV4ID0gTWFrZUdyYXBoKCk7CisgIHVuc2lnbmVkIGludCBsb3dlciA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgbGFzdF92ZXJ0ZXguTG93ZXJCb3VuZChsb3dlcik7CisgICAgaWYgKGxhc3RfdmVydGV4LkVtcHR5KCkpIHJldHVybjsKKyAgICBpZiAobGFzdF92ZXJ0ZXguQ3VycmVudCgpID09IGxvd2VyKSB7CisgICAgICBvdXRwdXQuU2luZ2xlQWRkTkdyYW0obG93ZXIsIGxpbmUpOworICAgICAgKytsb3dlcjsKKyAgICB9IGVsc2UgeworICAgICAgbG93ZXIgPSBsYXN0X3ZlcnRleC5DdXJyZW50KCk7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIHZvaWQgTXVsdGlwbGU6OkV2YWx1YXRlPENvdW50Rm9ybWF0OjpNdWx0aXBsZT4oY29uc3QgU3RyaW5nUGllY2UgJmxpbmUsIENvdW50Rm9ybWF0OjpNdWx0aXBsZSAmb3V0cHV0KTsKK3RlbXBsYXRlIHZvaWQgTXVsdGlwbGU6OkV2YWx1YXRlPEFSUEFGb3JtYXQ6Ok11bHRpcGxlPihjb25zdCBTdHJpbmdQaWVjZSAmbGluZSwgQVJQQUZvcm1hdDo6TXVsdGlwbGUgJm91dHB1dCk7Cit0ZW1wbGF0ZSB2b2lkIE11bHRpcGxlOjpFdmFsdWF0ZTxNdWx0aXBsZU91dHB1dEJ1ZmZlcj4oY29uc3QgU3RyaW5nUGllY2UgJmxpbmUsIE11bHRpcGxlT3V0cHV0QnVmZmVyICZvdXRwdXQpOworCit9IC8vIG5hbWVzcGFjZSBwaHJhc2UKK30gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vZmlsdGVyL3BocmFzZS5oaCBiL3NyYy9rZW5sbS9sbS9maWx0ZXIvcGhyYXNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMjdhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vZmlsdGVyL3BocmFzZS5oaApAQCAtMCwwICsxLDE2OCBAQAorI2lmbmRlZiBMTV9GSUxURVJfUEhSQVNFX0gKKyNkZWZpbmUgTE1fRklMVEVSX1BIUkFTRV9ICisKKyNpbmNsdWRlICJ1dGlsL211cm11cl9oYXNoLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlLmhoIgorI2luY2x1ZGUgInV0aWwvdG9rZW5pemVfcGllY2UuaGgiCisKKyNpbmNsdWRlIDxib29zdC91bm9yZGVyZWRfbWFwLmhwcD4KKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNkZWZpbmUgTE1fRklMVEVSX1BIUkFTRV9NRVRIT0QoY2FwcywgbG93ZXIpIFwKK2Jvb2wgRmluZCMjY2FwcyhIYXNoIGtleSwgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiAqJm91dCkgY29uc3Qge1wKKyAgVGFibGU6OmNvbnN0X2l0ZXJhdG9yIGkodGFibGVfLmZpbmQoa2V5KSk7XAorICBpZiAoaT09dGFibGVfLmVuZCgpKSByZXR1cm4gZmFsc2U7IFwKKyAgb3V0ID0gJmktPnNlY29uZC5sb3dlcjsgXAorICByZXR1cm4gdHJ1ZTsgXAorfQorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIHBocmFzZSB7CisKK3R5cGVkZWYgdWludDY0X3QgSGFzaDsKKworY2xhc3MgU3Vic3RyaW5ncyB7CisgIHByaXZhdGU6CisgICAgLyogVGhpcyBpcyB0aGUgdmFsdWUgaW4gYSBoYXNoIHRhYmxlIHdoZXJlIHRoZSBrZXkgaXMgYSBzdHJpbmcuICBJdCBpbmRpY2F0ZXMKKyAgICAgKiBmb3VyIHNldHMgb2Ygc2VudGVuY2VzOgorICAgICAqIHN1YnN0cmluZyBpcyBzZW50ZW5jZXMgd2l0aCBhIHBocmFzZSBjb250YWluaW5nIHRoZSBrZXkgYXMgYSBzdWJzdHJpbmcuCisgICAgICogbGVmdCBpcyBzZW50ZW5jZXNzIHdpdGggYSBwaHJhc2UgdGhhdCBiZWdpbnMgd2l0aCB0aGUga2V5IChsZWZ0IGFsaWduZWQpLgorICAgICAqIHJpZ2h0IGlzIHNlbnRlbmNlcyB3aXRoIGEgcGhyYXNlIHRoYXQgZW5kcyB3aXRoIHRoZSBrZXkgKHJpZ2h0IGFsaWduZWQpLgorICAgICAqIHBocmFzZSBpcyBzZW50ZW5jZXMgd2hlcmUgdGhlIGtleSBpcyBhIHBocmFzZS4KKyAgICAgKiBFYWNoIHNldCBpcyBlbmNvZGVkIGFzIGEgdmVjdG9yIG9mIHNlbnRlbmNlIGlkcyBpbiBpbmNyZWFzaW5nIG9yZGVyLgorICAgICAqLworICAgIHN0cnVjdCBTZW50ZW5jZVJlbGF0aW9uIHsKKyAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gc3Vic3RyaW5nLCBsZWZ0LCByaWdodCwgcGhyYXNlOworICAgIH07CisgICAgLyogTW9zdCBvZiB0aGUgQ1BVIGlzIGhhc2ggdGFibGUgbG9va3Vwcywgc28gbGV0J3Mgbm90IGNvbXBsaWNhdGUgaXQgd2l0aAorICAgICAqIHZlY3RvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gIElmIGEgY29sbGlzaW9uIGhhcHBlbnMsIHRoZSBTZW50ZW5jZVJlbGF0aW9uCisgICAgICogc3RydWN0dXJlIHdpbGwgY29udGFpbiB0aGUgdW5pb24gb2Ygc2VudGVuY2UgaWRzIG92ZXIgdGhlIGNvbGxpZGluZyBzdHJpbmdzLgorICAgICAqIEluIHRoYXQgY2FzZSwgdGhlIGZpbHRlciB3aWxsIGJlIHNsaWdodGx5IG1vcmUgcGVybWlzc2l2ZS4KKyAgICAgKiBUaGUga2V5IGhlcmUgaXMgdGhlIHNhbWUgYXMgYm9vc3QncyBoYXNoIG9mIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPi4KKyAgICAgKi8KKyAgICB0eXBlZGVmIGJvb3N0Ojp1bm9yZGVyZWRfbWFwPEhhc2gsIFNlbnRlbmNlUmVsYXRpb24+IFRhYmxlOworCisgIHB1YmxpYzoKKyAgICBTdWJzdHJpbmdzKCkge30KKworICAgIC8qIElmIHRoZSBzdHJpbmcgaXNuJ3QgYSBzdWJzdHJpbmcgb2YgYW55IHBocmFzZSwgcmV0dXJuIE5VTEwuICBPdGhlcndpc2UsCisgICAgICogcmV0dXJuIGEgcG9pbnRlciB0byBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+IGxpc3Rpbmcgc2VudGVuY2VzIHdpdGgKKyAgICAgKiBtYXRjaGluZyBwaHJhc2VzLiAgVGhpcyBzZXQgbWF5IGJlIGVtcHR5IGZvciBMZWZ0LCBSaWdodCwgb3IgUGhyYXNlLgorICAgICAqIEV4YW1wbGU6IGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gKkZpbmRTdWJzdHJpbmcoSGFzaCBrZXkpCisgICAgICovCisgICAgTE1fRklMVEVSX1BIUkFTRV9NRVRIT0QoU3Vic3RyaW5nLCBzdWJzdHJpbmcpCisgICAgTE1fRklMVEVSX1BIUkFTRV9NRVRIT0QoTGVmdCwgbGVmdCkKKyAgICBMTV9GSUxURVJfUEhSQVNFX01FVEhPRChSaWdodCwgcmlnaHQpCisgICAgTE1fRklMVEVSX1BIUkFTRV9NRVRIT0QoUGhyYXNlLCBwaHJhc2UpCisKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bmluaXRpYWxpemVkIiAvLyBlbmQgIT0gZmluaXNoIHNvIHRoZXJlJ3MgYWx3YXlzIGFuIGluaXRpYWxpemF0aW9uCisgICAgLy8gc2VudGVuY2VfaWQgbXVzdCBiZSBub24tZGVjcmVhc2luZy4gIEl0ZXJhdG9ycyBhcmUgb3ZlciB3b3JkcyBpbiB0aGUgcGhyYXNlLgorICAgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gdm9pZCBBZGRQaHJhc2UodW5zaWduZWQgaW50IHNlbnRlbmNlX2lkLCBjb25zdCBJdGVyYXRvciAmYmVnaW4sIGNvbnN0IEl0ZXJhdG9yICZlbmQpIHsKKyAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgc3Vic3RyaW5ncy4KKyAgICAgIGZvciAoSXRlcmF0b3Igc3RhcnQgPSBiZWdpbjsgc3RhcnQgIT0gZW5kOyArK3N0YXJ0KSB7CisgICAgICAgIEhhc2ggaGFzaCA9IDA7CisgICAgICAgIFNlbnRlbmNlUmVsYXRpb24gKnJlbGF0aW9uOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGZpbmlzaCA9IHN0YXJ0OyBmaW5pc2ggIT0gZW5kOyArK2ZpbmlzaCkgeworICAgICAgICAgIGhhc2ggPSB1dGlsOjpNdXJtdXJIYXNoTmF0aXZlKCZoYXNoLCBzaXplb2YodWludDY0X3QpLCAqZmluaXNoKTsKKyAgICAgICAgICAvLyBOb3cgaGFzaCBpcyBvZiBbc3RhcnQsIGZpbmlzaF0uCisgICAgICAgICAgcmVsYXRpb24gPSAmdGFibGVfW2hhc2hdOworICAgICAgICAgIEFwcGVuZFNlbnRlbmNlKHJlbGF0aW9uLT5zdWJzdHJpbmcsIHNlbnRlbmNlX2lkKTsKKyAgICAgICAgICBpZiAoc3RhcnQgPT0gYmVnaW4pIEFwcGVuZFNlbnRlbmNlKHJlbGF0aW9uLT5sZWZ0LCBzZW50ZW5jZV9pZCk7CisgICAgICAgIH0KKyAgICAgICAgQXBwZW5kU2VudGVuY2UocmVsYXRpb24tPnJpZ2h0LCBzZW50ZW5jZV9pZCk7CisgICAgICAgIGlmIChzdGFydCA9PSBiZWdpbikgQXBwZW5kU2VudGVuY2UocmVsYXRpb24tPnBocmFzZSwgc2VudGVuY2VfaWQpOworICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgQXBwZW5kU2VudGVuY2Uoc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiAmdmVjLCB1bnNpZ25lZCBpbnQgc2VudGVuY2VfaWQpIHsKKyAgICAgIGlmICh2ZWMuZW1wdHkoKSB8fCB2ZWMuYmFjaygpICE9IHNlbnRlbmNlX2lkKSB2ZWMucHVzaF9iYWNrKHNlbnRlbmNlX2lkKTsKKyAgICB9CisKKyAgICBUYWJsZSB0YWJsZV87Cit9OworCisvLyBSZWFkIGEgZmlsZSB3aXRoIG9uZSBzZW50ZW5jZSBwZXIgbGluZSBjb250YWluaW5nIHRhYi1kZWxpbWl0ZWQgcGhyYXNlcyBvZgorLy8gc3BhY2Utc2VwYXJhdGVkIHdvcmRzLgordW5zaWduZWQgaW50IFJlYWRNdWx0aXBsZShzdGQ6OmlzdHJlYW0gJmluLCBTdWJzdHJpbmdzICZvdXQpOworCituYW1lc3BhY2UgZGV0YWlsIHsKK2V4dGVybiBjb25zdCBTdHJpbmdQaWVjZSBrRW5kU2VudGVuY2U7CisKK3RlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gdm9pZCBNYWtlSGFzaGVzKEl0ZXJhdG9yIGksIGNvbnN0IEl0ZXJhdG9yICZlbmQsIHN0ZDo6dmVjdG9yPEhhc2g+ICZoYXNoZXMpIHsKKyAgaGFzaGVzLmNsZWFyKCk7CisgIGlmIChpID09IGVuZCkgcmV0dXJuOworICAvLyBUT0RPOiBjaGVjayBzdHJpY3QgcGhyYXNlIGJvdW5kYXJpZXMgYWZ0ZXIgPHM+IGFuZCBiZWZvcmUgPC9zPi4gIEZvciBub3csIGp1c3Qgc2tpcCB0YWdzLgorICBpZiAoKGktPmRhdGEoKVswXSA9PSAnPCcpICYmIChpLT5kYXRhKClbaS0+c2l6ZSgpIC0gMV0gPT0gJz4nKSkgeworICAgICsraTsKKyAgfQorICBmb3IgKDsgaSAhPSBlbmQgJiYgKCppICE9IGtFbmRTZW50ZW5jZSk7ICsraSkgeworICAgIGhhc2hlcy5wdXNoX2JhY2sodXRpbDo6TXVybXVySGFzaE5hdGl2ZShpLT5kYXRhKCksIGktPnNpemUoKSkpOworICB9Cit9CisKK2NsYXNzIFZlcnRleDsKK2NsYXNzIEFyYzsKKworY2xhc3MgQ29uZGl0aW9uQ29tbW9uIHsKKyAgcHJvdGVjdGVkOgorICAgIENvbmRpdGlvbkNvbW1vbihjb25zdCBTdWJzdHJpbmdzICZzdWJzdHJpbmdzKTsKKyAgICBDb25kaXRpb25Db21tb24oY29uc3QgQ29uZGl0aW9uQ29tbW9uICZmcm9tKTsKKworICAgIH5Db25kaXRpb25Db21tb24oKTsKKworICAgIGRldGFpbDo6VmVydGV4ICZNYWtlR3JhcGgoKTsKKworICAgIC8vIFRlbXBvcmFyaWVzIGluIFBhc3NOR3JhbSBhbmQgRXZhbHVhdGUgdG8gYXZvaWQgcmVhbGxvY2F0aW9uLgorICAgIHN0ZDo6dmVjdG9yPEhhc2g+IGhhc2hlc187CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxkZXRhaWw6OlZlcnRleD4gdmVydGljZXNfOworICAgIHN0ZDo6dmVjdG9yPGRldGFpbDo6QXJjPiBhcmNzXzsKKworICAgIGNvbnN0IFN1YnN0cmluZ3MgJnN1YnN0cmluZ3NfOworfTsKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKK2NsYXNzIFVuaW9uIDogcHVibGljIGRldGFpbDo6Q29uZGl0aW9uQ29tbW9uIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFVuaW9uKGNvbnN0IFN1YnN0cmluZ3MgJnN1YnN0cmluZ3MpIDogZGV0YWlsOjpDb25kaXRpb25Db21tb24oc3Vic3RyaW5ncykge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gYm9vbCBQYXNzTkdyYW0oY29uc3QgSXRlcmF0b3IgJmJlZ2luLCBjb25zdCBJdGVyYXRvciAmZW5kKSB7CisgICAgICBkZXRhaWw6Ok1ha2VIYXNoZXMoYmVnaW4sIGVuZCwgaGFzaGVzXyk7CisgICAgICByZXR1cm4gaGFzaGVzXy5lbXB0eSgpIHx8IEV2YWx1YXRlKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBFdmFsdWF0ZSgpOworfTsKKworY2xhc3MgTXVsdGlwbGUgOiBwdWJsaWMgZGV0YWlsOjpDb25kaXRpb25Db21tb24geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgTXVsdGlwbGUoY29uc3QgU3Vic3RyaW5ncyAmc3Vic3RyaW5ncykgOiBkZXRhaWw6OkNvbmRpdGlvbkNvbW1vbihzdWJzdHJpbmdzKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yLCBjbGFzcyBPdXRwdXQ+IHZvaWQgQWRkTkdyYW0oY29uc3QgSXRlcmF0b3IgJmJlZ2luLCBjb25zdCBJdGVyYXRvciAmZW5kLCBjb25zdCBTdHJpbmdQaWVjZSAmbGluZSwgT3V0cHV0ICZvdXRwdXQpIHsKKyAgICAgIGRldGFpbDo6TWFrZUhhc2hlcyhiZWdpbiwgZW5kLCBoYXNoZXNfKTsKKyAgICAgIGlmIChoYXNoZXNfLmVtcHR5KCkpIHsKKyAgICAgICAgb3V0cHV0LkFkZE5HcmFtKGxpbmUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRXZhbHVhdGUobGluZSwgb3V0cHV0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgT3V0cHV0PiB2b2lkIEFkZE5HcmFtKGNvbnN0IFN0cmluZ1BpZWNlICZuZ3JhbSwgY29uc3QgU3RyaW5nUGllY2UgJmxpbmUsIE91dHB1dCAmb3V0cHV0KSB7CisgICAgICBBZGROR3JhbSh1dGlsOjpUb2tlbkl0ZXI8dXRpbDo6U2luZ2xlQ2hhcmFjdGVyLCB0cnVlPihuZ3JhbSwgJyAnKSwgdXRpbDo6VG9rZW5JdGVyPHV0aWw6OlNpbmdsZUNoYXJhY3RlciwgdHJ1ZT46OmVuZCgpLCBsaW5lLCBvdXRwdXQpOworICAgIH0KKworICAgIHZvaWQgRmx1c2goKSBjb25zdCB7fQorCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGUgPGNsYXNzIE91dHB1dD4gdm9pZCBFdmFsdWF0ZShjb25zdCBTdHJpbmdQaWVjZSAmbGluZSwgT3V0cHV0ICZvdXRwdXQpOworfTsKKworfSAvLyBuYW1lc3BhY2UgcGhyYXNlCit9IC8vIG5hbWVzcGFjZSBsbQorI2VuZGlmIC8vIExNX0ZJTFRFUl9QSFJBU0VfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ZpbHRlci9waHJhc2VfdGFibGVfdm9jYWJfbWFpbi5jYyBiL3NyYy9rZW5sbS9sbS9maWx0ZXIvcGhyYXNlX3RhYmxlX3ZvY2FiX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmYTM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9maWx0ZXIvcGhyYXNlX3RhYmxlX3ZvY2FiX21haW4uY2MKQEAgLTAsMCArMSwxNjUgQEAKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfc3RyZWFtLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZV9waWVjZS5oaCIKKyNpbmNsdWRlICJ1dGlsL211cm11cl9oYXNoLmhoIgorI2luY2x1ZGUgInV0aWwvcG9vbC5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmluZ19waWVjZS5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmluZ19waWVjZV9oYXNoLmhoIgorI2luY2x1ZGUgInV0aWwvdG9rZW5pemVfcGllY2UuaGgiCisKKyNpbmNsdWRlIDxib29zdC91bm9yZGVyZWRfbWFwLmhwcD4KKyNpbmNsdWRlIDxib29zdC91bm9yZGVyZWRfc2V0LmhwcD4KKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgeworCitzdHJ1Y3QgTXV0YWJsZVBpZWNlIHsKKyAgbXV0YWJsZSBTdHJpbmdQaWVjZSBiZWhpbmQ7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNdXRhYmxlUGllY2UgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGJlaGluZCA9PSBvdGhlci5iZWhpbmQ7CisgIH0KK307CisKK3N0ZDo6c2l6ZV90IGhhc2hfdmFsdWUoY29uc3QgTXV0YWJsZVBpZWNlICZtKSB7CisgIHJldHVybiBoYXNoX3ZhbHVlKG0uYmVoaW5kKTsKK30KKworY2xhc3MgSW50ZXJuU3RyaW5nIHsKKyAgcHVibGljOgorICAgIGNvbnN0IGNoYXIgKkFkZChTdHJpbmdQaWVjZSBzdHIpIHsKKyAgICAgIE11dGFibGVQaWVjZSBtdXQ7CisgICAgICBtdXQuYmVoaW5kID0gc3RyOworICAgICAgc3RkOjpwYWlyPGJvb3N0Ojp1bm9yZGVyZWRfc2V0PE11dGFibGVQaWVjZT46Oml0ZXJhdG9yLCBib29sPiByZXMoc3Ryc18uaW5zZXJ0KG11dCkpOworICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgdm9pZCAqbWVtID0gYmFja2luZ18uQWxsb2NhdGUoc3RyLnNpemUoKSArIDEpOworICAgICAgICBtZW1jcHkobWVtLCBzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1lbSlbc3RyLnNpemUoKV0gPSAwOworICAgICAgICByZXMuZmlyc3QtPmJlaGluZCA9IFN0cmluZ1BpZWNlKHN0YXRpY19jYXN0PGNoYXIqPihtZW0pLCBzdHIuc2l6ZSgpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXMuZmlyc3QtPmJlaGluZC5kYXRhKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdXRpbDo6UG9vbCBiYWNraW5nXzsKKyAgICBib29zdDo6dW5vcmRlcmVkX3NldDxNdXRhYmxlUGllY2U+IHN0cnNfOworfTsKKworY2xhc3MgVGFyZ2V0V29yZHMgeworICBwdWJsaWM6CisgICAgdm9pZCBJbnRyb2R1Y2UoU3RyaW5nUGllY2Ugc291cmNlKSB7CisgICAgICB2b2NhYl8ucmVzaXplKHZvY2FiXy5zaXplKCkgKyAxKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gdGVtcCgxLCB2b2NhYl8uc2l6ZSgpIC0gMSk7CisgICAgICBBZGQodGVtcCwgc291cmNlKTsKKyAgICB9CisKKyAgICB2b2lkIEFkZChjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ICZzZW50ZW5jZXMsIFN0cmluZ1BpZWNlIHRhcmdldCkgeworICAgICAgaWYgKHNlbnRlbmNlcy5lbXB0eSgpKSByZXR1cm47CisgICAgICBpbnRlcm5zXy5jbGVhcigpOworICAgICAgZm9yICh1dGlsOjpUb2tlbkl0ZXI8dXRpbDo6U2luZ2xlQ2hhcmFjdGVyLCB0cnVlPiBpKHRhcmdldCwgJyAnKTsgaTsgKytpKSB7CisgICAgICAgIGludGVybnNfLnB1c2hfYmFjayhpbnRlcm5fLkFkZCgqaSkpOworICAgICAgfQorICAgICAgZm9yIChzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+Ojpjb25zdF9pdGVyYXRvciBpKHNlbnRlbmNlcy5iZWdpbigpKTsgaSAhPSBzZW50ZW5jZXMuZW5kKCk7ICsraSkgeworICAgICAgICBib29zdDo6dW5vcmRlcmVkX3NldDxjb25zdCBjaGFyICo+ICZ2b2NhYiA9IHZvY2FiX1sqaV07CisgICAgICAgIGZvciAoc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPjo6Y29uc3RfaXRlcmF0b3IgaiA9IGludGVybnNfLmJlZ2luKCk7IGogIT0gaW50ZXJuc18uZW5kKCk7ICsraikgeworICAgICAgICAgIHZvY2FiLmluc2VydCgqaik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFByaW50KCkgY29uc3QgeworICAgICAgdXRpbDo6RmlsZVN0cmVhbSBvdXQoMSk7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPGJvb3N0Ojp1bm9yZGVyZWRfc2V0PGNvbnN0IGNoYXIgKj4gPjo6Y29uc3RfaXRlcmF0b3IgaSA9IHZvY2FiXy5iZWdpbigpOyBpICE9IHZvY2FiXy5lbmQoKTsgKytpKSB7CisgICAgICAgIGZvciAoYm9vc3Q6OnVub3JkZXJlZF9zZXQ8Y29uc3QgY2hhciAqPjo6Y29uc3RfaXRlcmF0b3IgaiA9IGktPmJlZ2luKCk7IGogIT0gaS0+ZW5kKCk7ICsraikgeworICAgICAgICAgIG91dCA8PCAqaiA8PCAnICc7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICdcbic7CisgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgSW50ZXJuU3RyaW5nIGludGVybl87CisKKyAgICBzdGQ6OnZlY3Rvcjxib29zdDo6dW5vcmRlcmVkX3NldDxjb25zdCBjaGFyICo+ID4gdm9jYWJfOworCisgICAgLy8gVGVtcG9yYXJ5IGluIEFkZC4KKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGludGVybnNfOworfTsKKworY2xhc3MgSW5wdXQgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW5wdXQoc3RkOjpzaXplX3QgbWF4X2xlbmd0aCkKKyAgICAgIDogbWF4X2xlbmd0aF8obWF4X2xlbmd0aCksIHNlbnRlbmNlX2lkXygwKSwgZW1wdHlfKCkge30KKworICAgIHZvaWQgQWRkU2VudGVuY2UoU3RyaW5nUGllY2Ugc2VudGVuY2UsIFRhcmdldFdvcmRzICZ0YXJnZXRzKSB7CisgICAgICBjYW5vbmljYWxfLmNsZWFyKCk7CisgICAgICBzdGFydHNfLmNsZWFyKCk7CisgICAgICBzdGFydHNfLnB1c2hfYmFjaygwKTsKKyAgICAgIGZvciAodXRpbDo6VG9rZW5JdGVyPHV0aWw6OkFueUNoYXJhY3RlciwgdHJ1ZT4gaShzZW50ZW5jZSwgU3RyaW5nUGllY2UoIlwwIFx0IiwgMykpOyBpOyArK2kpIHsKKyAgICAgICAgY2Fub25pY2FsXy5hcHBlbmQoaS0+ZGF0YSgpLCBpLT5zaXplKCkpOworICAgICAgICBjYW5vbmljYWxfICs9ICcgJzsKKyAgICAgICAgc3RhcnRzXy5wdXNoX2JhY2soY2Fub25pY2FsXy5zaXplKCkpOworICAgICAgfQorICAgICAgdGFyZ2V0cy5JbnRyb2R1Y2UoY2Fub25pY2FsXyk7CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc3RhcnRzXy5zaXplKCkgLSAxOyArK2kpIHsKKyAgICAgICAgc3RkOjpzaXplX3Qgc3VidHJhY3QgPSBzdGFydHNfW2ldOworICAgICAgICBjb25zdCBjaGFyICpzdGFydCA9ICZjYW5vbmljYWxfW3N1YnRyYWN0XTsKKyAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBqID0gaSArIDE7IGogPCBzdGQ6Om1pbihzdGFydHNfLnNpemUoKSwgaSArIG1heF9sZW5ndGhfICsgMSk7ICsraikgeworICAgICAgICAgIG1hcF9bdXRpbDo6TXVybXVySGFzaDY0QShzdGFydCwgJmNhbm9uaWNhbF9bc3RhcnRzX1tqXV0gLSBzdGFydCAtIDEpXS5wdXNoX2JhY2soc2VudGVuY2VfaWRfKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgKytzZW50ZW5jZV9pZF87CisgICAgfQorCisgICAgLy8gQXNzdW1lcyBzaW5nbGUgc3BhY2UtZGVsaW1pdGVkIHBocmFzZSB3aXRoIG5vIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gJk1hdGNoZXMoU3RyaW5nUGllY2UgcGhyYXNlKSBjb25zdCB7CisgICAgICBNYXA6OmNvbnN0X2l0ZXJhdG9yIGkgPSBtYXBfLmZpbmQodXRpbDo6TXVybXVySGFzaDY0QShwaHJhc2UuZGF0YSgpLCBwaHJhc2Uuc2l6ZSgpKSk7CisgICAgICByZXR1cm4gaSA9PSBtYXBfLmVuZCgpID8gZW1wdHlfIDogaS0+c2Vjb25kOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2l6ZV90IG1heF9sZW5ndGhfOworCisgICAgLy8gaGFzaCBvZiBwaHJhc2UgaXMgdGhlIGtleSwgYXJyYXkgb2Ygc2VudGVuY2VzIGlzIHRoZSB2YWx1ZS4KKyAgICB0eXBlZGVmIGJvb3N0Ojp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ID4gTWFwOworICAgIE1hcCBtYXBfOworCisgICAgc3RkOjpzaXplX3Qgc2VudGVuY2VfaWRfOworCisgICAgLy8gVGVtcG9yYXJpZXMgaW4gQWRkU2VudGVuY2UuCisgICAgc3RkOjpzdHJpbmcgY2Fub25pY2FsXzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gc3RhcnRzXzsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gZW1wdHlfOworfTsKKworfSAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBpZiAoYXJnYyAhPSAyKSB7CisgICAgc3RkOjpjZXJyIDw8ICJFeHBlY3RlZCBzb3VyY2UgdGV4dCBvbiB0aGUgY29tbWFuZCBsaW5lIiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgSW5wdXQgaW5wdXQoNyk7CisgIFRhcmdldFdvcmRzIHRhcmdldHM7CisgIHRyeSB7CisgICAgdXRpbDo6RmlsZVBpZWNlIGlucHV0cyhhcmd2WzFdLCAmc3RkOjpjZXJyKTsKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICAgIGlucHV0LkFkZFNlbnRlbmNlKGlucHV0cy5SZWFkTGluZSgpLCB0YXJnZXRzKTsKKyAgfSBjYXRjaCAoY29uc3QgdXRpbDo6RW5kT2ZGaWxlRXhjZXB0aW9uICZlKSB7fQorCisgIHV0aWw6OkZpbGVQaWVjZSB0YWJsZSgwLCBOVUxMLCAmc3RkOjpjZXJyKTsKKyAgU3RyaW5nUGllY2UgbGluZTsKKyAgY29uc3QgU3RyaW5nUGllY2UgcGlwZXMoInx8fCIpOworICB3aGlsZSAodHJ1ZSkgeworICAgIHRyeSB7CisgICAgICBsaW5lID0gdGFibGUuUmVhZExpbmUoKTsKKyAgICB9IGNhdGNoIChjb25zdCB1dGlsOjpFbmRPZkZpbGVFeGNlcHRpb24gJmUpIHsgYnJlYWs7IH0KKyAgICB1dGlsOjpUb2tlbkl0ZXI8dXRpbDo6TXVsdGlDaGFyYWN0ZXI+IGl0KGxpbmUsIHBpcGVzKTsKKyAgICBTdHJpbmdQaWVjZSBzb3VyY2UoKml0KTsKKyAgICBpZiAoIXNvdXJjZS5lbXB0eSgpICYmIHNvdXJjZVtzb3VyY2Uuc2l6ZSgpIC0gMV0gPT0gJyAnKQorICAgICAgc291cmNlLnJlbW92ZV9zdWZmaXgoMSk7CisgICAgdGFyZ2V0cy5BZGQoaW5wdXQuTWF0Y2hlcyhzb3VyY2UpLCAqKytpdCk7CisgIH0KKyAgdGFyZ2V0cy5QcmludCgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ZpbHRlci90aHJlYWQuaGggYi9zcmMva2VubG0vbG0vZmlsdGVyL3RocmVhZC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGUwNjljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci90aHJlYWQuaGgKQEAgLTAsMCArMSwxNjcgQEAKKyNpZm5kZWYgTE1fRklMVEVSX1RIUkVBRF9ICisjZGVmaW5lIExNX0ZJTFRFUl9USFJFQURfSAorCisjaW5jbHVkZSAidXRpbC90aHJlYWRfcG9vbC5oaCIKKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvaW5fcGxhY2VfZmFjdG9yeS5ocHA+CisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxzdGFjaz4KKworbmFtZXNwYWNlIGxtIHsKKwordGVtcGxhdGUgPGNsYXNzIE91dHB1dEJ1ZmZlcj4gY2xhc3MgVGhyZWFkQmF0Y2ggeworICBwdWJsaWM6CisgICAgVGhyZWFkQmF0Y2goKSB7fQorCisgICAgdm9pZCBSZXNlcnZlKHNpemVfdCBzaXplKSB7CisgICAgICBpbnB1dF8uUmVzZXJ2ZShzaXplKTsKKyAgICAgIG91dHB1dF8uUmVzZXJ2ZShzaXplKTsKKyAgICAgfQorCisgICAgLy8gRmlsZSByZWFkaW5nIHRocmVhZC4KKyAgICBJbnB1dEJ1ZmZlciAmRmlsbCh1aW50NjRfdCBzZXF1ZW5jZSkgeworICAgICAgc2VxdWVuY2VfID0gc2VxdWVuY2U7CisgICAgICAvLyBXaHkgd2FpdCB1bnRpbCBub3cgdG8gY2xlYXIgaW5zdGVhZCBvZiBhZnRlciBvdXRwdXQ/ICBmcmVlIGluIHRoZSBzYW1lCisgICAgICAvLyB0aHJlYWQgYXMgYWxsb2NhdGVkLgorICAgICAgaW5wdXRfLkNsZWFyKCk7CisgICAgICByZXR1cm4gaW5wdXRfOworICAgIH0KKworICAgIC8vIEZpbHRlciB3b3JrZXIgdGhyZWFkLgorICAgIHRlbXBsYXRlIDxjbGFzcyBGaWx0ZXI+IHZvaWQgQ2FsbEZpbHRlcihGaWx0ZXIgJmZpbHRlcikgeworICAgICAgaW5wdXRfLkNhbGxGaWx0ZXIoZmlsdGVyLCBvdXRwdXRfKTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBTZXF1ZW5jZSgpIGNvbnN0IHsgcmV0dXJuIHNlcXVlbmNlXzsgfQorCisgICAgLy8gRmlsZSB3cml0aW5nIHRocmVhZC4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVhbE91dHB1dD4gdm9pZCBGbHVzaChSZWFsT3V0cHV0ICZvdXRwdXQpIHsKKyAgICAgIG91dHB1dF8uRmx1c2gob3V0cHV0KTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBJbnB1dEJ1ZmZlciBpbnB1dF87CisgICAgT3V0cHV0QnVmZmVyIG91dHB1dF87CisKKyAgICB1aW50NjRfdCBzZXF1ZW5jZV87Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQmF0Y2gsIGNsYXNzIEZpbHRlcj4gY2xhc3MgRmlsdGVyV29ya2VyIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgQmF0Y2ggKlJlcXVlc3Q7CisKKyAgICBGaWx0ZXJXb3JrZXIoY29uc3QgRmlsdGVyICZmaWx0ZXIsIHV0aWw6OlBDUXVldWU8UmVxdWVzdD4gJmRvbmUpIDogZmlsdGVyXyhmaWx0ZXIpLCBkb25lXyhkb25lKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgcmVxdWVzdC0+Q2FsbEZpbHRlcihmaWx0ZXJfKTsKKyAgICAgIGRvbmVfLlByb2R1Y2UocmVxdWVzdCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgRmlsdGVyIGZpbHRlcl87CisKKyAgICB1dGlsOjpQQ1F1ZXVlPFJlcXVlc3Q+ICZkb25lXzsKK307CisKKy8vIFRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBPdXRwdXRXb3JrZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgQmF0Y2gsIGNsYXNzIE91dHB1dD4gY2xhc3MgT3V0cHV0V29ya2VyIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgQmF0Y2ggKlJlcXVlc3Q7CisKKyAgICBPdXRwdXRXb3JrZXIoT3V0cHV0ICZvdXRwdXQsIHV0aWw6OlBDUXVldWU8UmVxdWVzdD4gJmRvbmUpIDogb3V0cHV0XyhvdXRwdXQpLCBkb25lXyhkb25lKSwgYmFzZV9zZXF1ZW5jZV8oMCkge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgIGFzc2VydChyZXF1ZXN0LT5TZXF1ZW5jZSgpID49IGJhc2Vfc2VxdWVuY2VfKTsKKyAgICAgIC8vIEFzc2VtYmxlIHRoZSBvdXRwdXQgaW4gb3JkZXIuCisgICAgICB1aW50NjRfdCBwb3MgPSByZXF1ZXN0LT5TZXF1ZW5jZSgpIC0gYmFzZV9zZXF1ZW5jZV87CisgICAgICBpZiAocG9zID49IG9yZGVyaW5nXy5zaXplKCkpIHsKKyAgICAgICAgb3JkZXJpbmdfLnJlc2l6ZShwb3MgKyAxLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIG9yZGVyaW5nX1twb3NdID0gcmVxdWVzdDsKKyAgICAgIHdoaWxlICghb3JkZXJpbmdfLmVtcHR5KCkgJiYgb3JkZXJpbmdfLmZyb250KCkpIHsKKyAgICAgICAgb3JkZXJpbmdfLmZyb250KCktPkZsdXNoKG91dHB1dF8pOworICAgICAgICBkb25lXy5Qcm9kdWNlKG9yZGVyaW5nXy5mcm9udCgpKTsKKyAgICAgICAgb3JkZXJpbmdfLnBvcF9mcm9udCgpOworICAgICAgICArK2Jhc2Vfc2VxdWVuY2VfOworICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIE91dHB1dCAmb3V0cHV0XzsKKworICAgIHV0aWw6OlBDUXVldWU8UmVxdWVzdD4gJmRvbmVfOworCisgICAgc3RkOjpkZXF1ZTxSZXF1ZXN0PiBvcmRlcmluZ187CisKKyAgICB1aW50NjRfdCBiYXNlX3NlcXVlbmNlXzsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBGaWx0ZXIsIGNsYXNzIE91dHB1dEJ1ZmZlciwgY2xhc3MgUmVhbE91dHB1dD4gY2xhc3MgQ29udHJvbGxlciA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBUaHJlYWRCYXRjaDxPdXRwdXRCdWZmZXI+IEJhdGNoOworCisgIHB1YmxpYzoKKyAgICBDb250cm9sbGVyKHNpemVfdCBiYXRjaF9zaXplLCBzaXplX3QgcXVldWUsIHNpemVfdCB3b3JrZXJzLCBjb25zdCBGaWx0ZXIgJmZpbHRlciwgUmVhbE91dHB1dCAmb3V0cHV0KQorICAgICAgOiBiYXRjaF9zaXplXyhiYXRjaF9zaXplKSwgcXVldWVfc2l6ZV8ocXVldWUpLAorICAgICAgICBiYXRjaGVzXyhxdWV1ZSksCisgICAgICAgIHRvX3JlYWRfKHF1ZXVlKSwKKyAgICAgICAgb3V0cHV0XyhxdWV1ZSwgMSwgYm9vc3Q6OmluX3BsYWNlKGJvb3N0OjpyZWYob3V0cHV0KSwgYm9vc3Q6OnJlZih0b19yZWFkXykpLCBOVUxMKSwKKyAgICAgICAgZmlsdGVyXyhxdWV1ZSwgd29ya2VycywgYm9vc3Q6OmluX3BsYWNlKGJvb3N0OjpyZWYoZmlsdGVyKSwgYm9vc3Q6OnJlZihvdXRwdXRfLkluKCkpKSwgTlVMTCksCisgICAgICAgIHNlcXVlbmNlXygwKSB7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHF1ZXVlOyArK2kpIHsKKyAgICAgICAgYmF0Y2hlc19baV0uUmVzZXJ2ZShiYXRjaF9zaXplKTsKKyAgICAgICAgbG9jYWxfcmVhZF8ucHVzaCgmYmF0Y2hlc19baV0pOworICAgICAgfQorICAgICAgTmV3SW5wdXQoKTsKKyAgICB9CisKKyAgICB2b2lkIEFkZE5HcmFtKGNvbnN0IFN0cmluZ1BpZWNlICZuZ3JhbSwgY29uc3QgU3RyaW5nUGllY2UgJmxpbmUsIFJlYWxPdXRwdXQgJm91dHB1dCkgeworICAgICAgaW5wdXRfLT5BZGROR3JhbShuZ3JhbSwgbGluZSwgb3V0cHV0KTsKKyAgICAgIGlmIChpbnB1dF8tPlNpemUoKSA9PSBiYXRjaF9zaXplXykgeworICAgICAgICBGbHVzaElucHV0KCk7CisgICAgICAgIE5ld0lucHV0KCk7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBGbHVzaCgpIHsKKyAgICAgIEZsdXNoSW5wdXQoKTsKKyAgICAgIHdoaWxlIChsb2NhbF9yZWFkXy5zaXplKCkgPCBxdWV1ZV9zaXplXykgeworICAgICAgICBNb3ZlUmVhZCgpOworICAgICAgfQorICAgICAgTmV3SW5wdXQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIEZsdXNoSW5wdXQoKSB7CisgICAgICBpZiAoaW5wdXRfLT5FbXB0eSgpKSByZXR1cm47CisgICAgICBmaWx0ZXJfLlByb2R1Y2UobG9jYWxfcmVhZF8udG9wKCkpOworICAgICAgbG9jYWxfcmVhZF8ucG9wKCk7CisgICAgICBpZiAobG9jYWxfcmVhZF8uZW1wdHkoKSkgTW92ZVJlYWQoKTsKKyAgICB9CisKKyAgICB2b2lkIE5ld0lucHV0KCkgeworICAgICAgaW5wdXRfID0gJmxvY2FsX3JlYWRfLnRvcCgpLT5GaWxsKHNlcXVlbmNlXysrKTsKKyAgICB9CisKKyAgICB2b2lkIE1vdmVSZWFkKCkgeworICAgICAgbG9jYWxfcmVhZF8ucHVzaCh0b19yZWFkXy5Db25zdW1lKCkpOworICAgIH0KKworICAgIGNvbnN0IHNpemVfdCBiYXRjaF9zaXplXzsKKyAgICBjb25zdCBzaXplX3QgcXVldWVfc2l6ZV87CisKKyAgICBzdGQ6OnZlY3RvcjxCYXRjaD4gYmF0Y2hlc187CisKKyAgICB1dGlsOjpQQ1F1ZXVlPEJhdGNoKj4gdG9fcmVhZF87CisgICAgc3RkOjpzdGFjazxCYXRjaCo+IGxvY2FsX3JlYWRfOworICAgIHV0aWw6OlRocmVhZFBvb2w8T3V0cHV0V29ya2VyPEJhdGNoLCBSZWFsT3V0cHV0PiA+IG91dHB1dF87CisgICAgdXRpbDo6VGhyZWFkUG9vbDxGaWx0ZXJXb3JrZXI8QmF0Y2gsIEZpbHRlcj4gPiBmaWx0ZXJfOworCisgICAgdWludDY0X3Qgc2VxdWVuY2VfOworICAgIElucHV0QnVmZmVyICppbnB1dF87Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbQorCisjZW5kaWYgLy8gTE1fRklMVEVSX1RIUkVBRF9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vZmlsdGVyL3ZvY2FiLmNjIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci92b2NhYi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNhNGZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci92b2NhYi5jYwpAQCAtMCwwICsxLDUzIEBACisjaW5jbHVkZSAibG0vZmlsdGVyL3ZvY2FiLmhoIgorCisjaW5jbHVkZSA8aXN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGNjdHlwZT4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSB2b2NhYiB7CisKK3ZvaWQgUmVhZFNpbmdsZShzdGQ6OmlzdHJlYW0gJmluLCBib29zdDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gJm91dCkgeworICBpbi5leGNlcHRpb25zKHN0ZDo6aXN0cmVhbTo6YmFkYml0KTsKKyAgc3RkOjpzdHJpbmcgd29yZDsKKyAgd2hpbGUgKGluID4+IHdvcmQpIHsKKyAgICBvdXQuaW5zZXJ0KHdvcmQpOworICB9Cit9CisKK25hbWVzcGFjZSB7Citib29sIElzTGluZUVuZChzdGQ6OmlzdHJlYW0gJmluKSB7CisgIGludCBnb3Q7CisgIGRvIHsKKyAgICBnb3QgPSBpbi5nZXQoKTsKKyAgICBpZiAoIWluKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoZ290ID09ICdcbicpIHJldHVybiB0cnVlOworICB9IHdoaWxlIChpc3NwYWNlKGdvdCkpOworICBpbi51bmdldCgpOworICByZXR1cm4gZmFsc2U7Cit9Cit9Ly8gbmFtZXNwYWNlCisKKy8vIFJlYWQgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzIGluIGVudGVyIHNlcGFyYXRlZCBsaW5lcy4gIFRoZXNlIGxpbmVzIGNhbiBiZQorLy8gdmVyeSBsb25nLCBzbyBkb24ndCByZWFkIGFuIGVudGlyZSBsaW5lIGF0IGEgdGltZS4KK3Vuc2lnbmVkIGludCBSZWFkTXVsdGlwbGUoc3RkOjppc3RyZWFtICZpbiwgYm9vc3Q6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gPiAmb3V0KSB7CisgIGluLmV4Y2VwdGlvbnMoc3RkOjppc3RyZWFtOjpiYWRiaXQpOworICB1bnNpZ25lZCBpbnQgc2VudGVuY2UgPSAwOworICBib29sIHVzZWRfaWQgPSBmYWxzZTsKKyAgc3RkOjpzdHJpbmcgd29yZDsKKyAgd2hpbGUgKGluID4+IHdvcmQpIHsKKyAgICB1c2VkX2lkID0gdHJ1ZTsKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ICZwb3N0aW5nID0gb3V0W3dvcmRdOworICAgIGlmIChwb3N0aW5nLmVtcHR5KCkgfHwgKHBvc3RpbmcuYmFjaygpICE9IHNlbnRlbmNlKSkKKyAgICAgIHBvc3RpbmcucHVzaF9iYWNrKHNlbnRlbmNlKTsKKyAgICBpZiAoSXNMaW5lRW5kKGluKSkgeworICAgICAgKytzZW50ZW5jZTsKKyAgICAgIHVzZWRfaWQgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNlbnRlbmNlICsgdXNlZF9pZDsKK30KKworfSAvLyBuYW1lc3BhY2Ugdm9jYWIKK30gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vZmlsdGVyL3ZvY2FiLmhoIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci92b2NhYi5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTdhOTMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ZpbHRlci92b2NhYi5oaApAQCAtMCwwICsxLDEzMyBAQAorI2lmbmRlZiBMTV9GSUxURVJfVk9DQUJfSAorI2RlZmluZSBMTV9GSUxURVJfVk9DQUJfSAorCisvLyBWb2NhYnVsYXJ5LWJhc2VkIGZpbHRlcnMgZm9yIGxhbmd1YWdlIG1vZGVscy4KKworI2luY2x1ZGUgInV0aWwvbXVsdGlfaW50ZXJzZWN0aW9uLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlX2hhc2guaGgiCisjaW5jbHVkZSAidXRpbC90b2tlbml6ZV9waWVjZS5oaCIKKworI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5nZS9pdGVyYXRvcl9yYW5nZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdW5vcmRlcmVkL3Vub3JkZXJlZF9tYXAuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Vub3JkZXJlZC91bm9yZGVyZWRfc2V0LmhwcD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2Ugdm9jYWIgeworCit2b2lkIFJlYWRTaW5nbGUoc3RkOjppc3RyZWFtICZpbiwgYm9vc3Q6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+ICZvdXQpOworCisvLyBSZWFkIG9uZSBzZW50ZW5jZSB2b2NhYnVsYXJ5IHBlciBsaW5lLiAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VudGVuY2VzLgordW5zaWduZWQgaW50IFJlYWRNdWx0aXBsZShzdGQ6OmlzdHJlYW0gJmluLCBib29zdDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiA+ICZvdXQpOworCisvKiBJcyB0aGlzIGEgc3BlY2lhbCB0YWcgbGlrZSA8cz4gb3IgPFVOSz4/ICBUaGlzIGFjdHVhbGx5IGluY2x1ZGVzIGFueXRoaW5nCisgKiBzdXJyb3VuZGVkIHdpdGggPCBhbmQgPiwgd2hpY2ggbW9zdCB0b2tlbml6ZXJzIHNlcGFyYXRlIGZvciByZWFsIHdvcmRzLCBzbworICogdGhpcyBzaG91bGQgbm90IGNhdGNoIHJlYWwgd29yZHMgYXMgaXQgbG9va3MgYXQgYSBzaW5nbGUgdG9rZW4uCisgKi8KK2lubGluZSBib29sIElzVGFnKGNvbnN0IFN0cmluZ1BpZWNlICZ2YWx1ZSkgeworICAvLyBUaGUgcGFyc2VyIHNob3VsZCBuZXZlciBnaXZlIGFuIGVtcHR5IHN0cmluZy4KKyAgYXNzZXJ0KCF2YWx1ZS5lbXB0eSgpKTsKKyAgcmV0dXJuICh2YWx1ZS5kYXRhKClbMF0gPT0gJzwnICYmIHZhbHVlLmRhdGEoKVt2YWx1ZS5zaXplKCkgLSAxXSA9PSAnPicpOworfQorCitjbGFzcyBTaW5nbGUgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBib29zdDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gV29yZHM7CisKKyAgICBleHBsaWNpdCBTaW5nbGUoY29uc3QgV29yZHMgJnZvY2FiKSA6IHZvY2FiXyh2b2NhYikge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gYm9vbCBQYXNzTkdyYW0oY29uc3QgSXRlcmF0b3IgJmJlZ2luLCBjb25zdCBJdGVyYXRvciAmZW5kKSB7CisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBiZWdpbjsgaSAhPSBlbmQ7ICsraSkgeworICAgICAgICBpZiAoSXNUYWcoKmkpKSBjb250aW51ZTsKKyAgICAgICAgaWYgKEZpbmRTdHJpbmdQaWVjZSh2b2NhYl8sICppKSA9PSB2b2NhYl8uZW5kKCkpIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IFdvcmRzICZ2b2NhYl87Cit9OworCitjbGFzcyBVbmlvbiB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGJvb3N0Ojp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ID4gV29yZHM7CisKKyAgICBleHBsaWNpdCBVbmlvbihjb25zdCBXb3JkcyAmdm9jYWJzKSA6IHZvY2Fic18odm9jYWJzKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPiBib29sIFBhc3NOR3JhbShjb25zdCBJdGVyYXRvciAmYmVnaW4sIGNvbnN0IEl0ZXJhdG9yICZlbmQpIHsKKyAgICAgIHNldHNfLmNsZWFyKCk7CisKKyAgICAgIGZvciAoSXRlcmF0b3IgaShiZWdpbik7IGkgIT0gZW5kOyArK2kpIHsKKyAgICAgICAgaWYgKElzVGFnKCppKSkgY29udGludWU7CisgICAgICAgIFdvcmRzOjpjb25zdF9pdGVyYXRvciBmb3VuZChGaW5kU3RyaW5nUGllY2Uodm9jYWJzXywgKmkpKTsKKyAgICAgICAgaWYgKHZvY2Fic18uZW5kKCkgPT0gZm91bmQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgc2V0c18ucHVzaF9iYWNrKGJvb3N0OjppdGVyYXRvcl9yYW5nZTxjb25zdCB1bnNpZ25lZCBpbnQqPigmKmZvdW5kLT5zZWNvbmQuYmVnaW4oKSwgJipmb3VuZC0+c2Vjb25kLmVuZCgpKSk7CisgICAgICB9CisgICAgICByZXR1cm4gKHNldHNfLmVtcHR5KCkgfHwgdXRpbDo6Rmlyc3RJbnRlcnNlY3Rpb24oc2V0c18pKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBXb3JkcyAmdm9jYWJzXzsKKworICAgIHN0ZDo6dmVjdG9yPGJvb3N0OjppdGVyYXRvcl9yYW5nZTxjb25zdCB1bnNpZ25lZCBpbnQqPiA+IHNldHNfOworfTsKKworY2xhc3MgTXVsdGlwbGUgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBib29zdDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiA+IFdvcmRzOworCisgICAgTXVsdGlwbGUoY29uc3QgV29yZHMgJnZvY2FicykgOiB2b2NhYnNfKHZvY2Ficykge30KKworICBwcml2YXRlOgorICAgIC8vIENhbGxiYWNrIGZyb20gQWxsSW50ZXJzZWN0aW9uIHRoYXQgZG9lcyBBZGROR3JhbS4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgT3V0cHV0PiBjbGFzcyBDYWxsYmFjayB7CisgICAgICBwdWJsaWM6CisgICAgICAgIENhbGxiYWNrKE91dHB1dCAmb3V0LCBjb25zdCBTdHJpbmdQaWVjZSAmbGluZSkgOiBvdXRfKG91dCksIGxpbmVfKGxpbmUpIHt9CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKHVuc2lnbmVkIGludCBpbmRleCkgeworICAgICAgICAgIG91dF8uU2luZ2xlQWRkTkdyYW0oaW5kZXgsIGxpbmVfKTsKKyAgICAgICAgfQorCisgICAgICBwcml2YXRlOgorICAgICAgICBPdXRwdXQgJm91dF87CisgICAgICAgIGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lXzsKKyAgICB9OworCisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IsIGNsYXNzIE91dHB1dD4gdm9pZCBBZGROR3JhbShjb25zdCBJdGVyYXRvciAmYmVnaW4sIGNvbnN0IEl0ZXJhdG9yICZlbmQsIGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lLCBPdXRwdXQgJm91dHB1dCkgeworICAgICAgc2V0c18uY2xlYXIoKTsKKyAgICAgIGZvciAoSXRlcmF0b3IgaShiZWdpbik7IGkgIT0gZW5kOyArK2kpIHsKKyAgICAgICAgaWYgKElzVGFnKCppKSkgY29udGludWU7CisgICAgICAgIFdvcmRzOjpjb25zdF9pdGVyYXRvciBmb3VuZChGaW5kU3RyaW5nUGllY2Uodm9jYWJzXywgKmkpKTsKKyAgICAgICAgaWYgKHZvY2Fic18uZW5kKCkgPT0gZm91bmQpIHJldHVybjsKKyAgICAgICAgc2V0c18ucHVzaF9iYWNrKGJvb3N0OjppdGVyYXRvcl9yYW5nZTxjb25zdCB1bnNpZ25lZCBpbnQqPigmKmZvdW5kLT5zZWNvbmQuYmVnaW4oKSwgJipmb3VuZC0+c2Vjb25kLmVuZCgpKSk7CisgICAgICB9CisgICAgICBpZiAoc2V0c18uZW1wdHkoKSkgeworICAgICAgICBvdXRwdXQuQWRkTkdyYW0obGluZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgQ2FsbGJhY2s8T3V0cHV0PiBjYihvdXRwdXQsIGxpbmUpOworICAgICAgdXRpbDo6QWxsSW50ZXJzZWN0aW9uKHNldHNfLCBjYik7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIE91dHB1dD4gdm9pZCBBZGROR3JhbShjb25zdCBTdHJpbmdQaWVjZSAmbmdyYW0sIGNvbnN0IFN0cmluZ1BpZWNlICZsaW5lLCBPdXRwdXQgJm91dHB1dCkgeworICAgICAgQWRkTkdyYW0odXRpbDo6VG9rZW5JdGVyPHV0aWw6OlNpbmdsZUNoYXJhY3RlciwgdHJ1ZT4obmdyYW0sICcgJyksIHV0aWw6OlRva2VuSXRlcjx1dGlsOjpTaW5nbGVDaGFyYWN0ZXIsIHRydWU+OjplbmQoKSwgbGluZSwgb3V0cHV0KTsKKyAgICB9CisKKyAgICB2b2lkIEZsdXNoKCkgY29uc3Qge30KKworICBwcml2YXRlOgorICAgIGNvbnN0IFdvcmRzICZ2b2NhYnNfOworCisgICAgc3RkOjp2ZWN0b3I8Ym9vc3Q6Oml0ZXJhdG9yX3JhbmdlPGNvbnN0IHVuc2lnbmVkIGludCo+ID4gc2V0c187Cit9OworCit9IC8vIG5hbWVzcGFjZSB2b2NhYgorfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX0ZJTFRFUl9WT0NBQl9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vZmlsdGVyL3dyYXBwZXIuaGggYi9zcmMva2VubG0vbG0vZmlsdGVyL3dyYXBwZXIuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3ZWM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9maWx0ZXIvd3JhcHBlci5oaApAQCAtMCwwICsxLDU2IEBACisjaWZuZGVmIExNX0ZJTFRFUl9XUkFQUEVSX0gKKyNkZWZpbmUgTE1fRklMVEVSX1dSQVBQRVJfSAorCisjaW5jbHVkZSAidXRpbC9zdHJpbmdfcGllY2UuaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxtIHsKKworLy8gUHJvdmlkZSBhIHNpbmdsZS1vdXRwdXQgZmlsdGVyIHdpdGggdGhlIHNhbWUgaW50ZXJmYWNlIGFzIGEKKy8vIG11bHRpcGxlLW91dHB1dCBmaWx0ZXIgc28gY2xpZW50cyBjb2RlIGFnYWluc3Qgb25lIGludGVyZmFjZS4KK3RlbXBsYXRlIDxjbGFzcyBCaW5hcnk+IGNsYXNzIEJpbmFyeUZpbHRlciB7CisgIHB1YmxpYzoKKyAgICAvLyBCaW5hcnkgbW9kZXMgYXJlIGp1c3QgcmVmZXJlbmNlcyAoYW5kIGEgc2V0KSBhbmQgaXQgbWFrZXMgdGhlIEFQSSBjbGVhbmVyIHRvIGNvcHkgdGhlbS4KKyAgICBleHBsaWNpdCBCaW5hcnlGaWx0ZXIoQmluYXJ5IGJpbmFyeSkgOiBiaW5hcnlfKGJpbmFyeSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvciwgY2xhc3MgT3V0cHV0PiB2b2lkIEFkZE5HcmFtKGNvbnN0IEl0ZXJhdG9yICZiZWdpbiwgY29uc3QgSXRlcmF0b3IgJmVuZCwgY29uc3QgU3RyaW5nUGllY2UgJmxpbmUsIE91dHB1dCAmb3V0cHV0KSB7CisgICAgICBpZiAoYmluYXJ5Xy5QYXNzTkdyYW0oYmVnaW4sIGVuZCkpCisgICAgICAgIG91dHB1dC5BZGROR3JhbShsaW5lKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgT3V0cHV0PiB2b2lkIEFkZE5HcmFtKGNvbnN0IFN0cmluZ1BpZWNlICZuZ3JhbSwgY29uc3QgU3RyaW5nUGllY2UgJmxpbmUsIE91dHB1dCAmb3V0cHV0KSB7CisgICAgICBBZGROR3JhbSh1dGlsOjpUb2tlbkl0ZXI8dXRpbDo6U2luZ2xlQ2hhcmFjdGVyLCB0cnVlPihuZ3JhbSwgJyAnKSwgdXRpbDo6VG9rZW5JdGVyPHV0aWw6OlNpbmdsZUNoYXJhY3RlciwgdHJ1ZT46OmVuZCgpLCBsaW5lLCBvdXRwdXQpOworICAgIH0KKworICAgIHZvaWQgRmx1c2goKSBjb25zdCB7fQorCisgIHByaXZhdGU6CisgICAgQmluYXJ5IGJpbmFyeV87Cit9OworCisvLyBXcmFwIGFub3RoZXIgZmlsdGVyIHRvIHBheSBhdHRlbnRpb24gb25seSB0byBjb250ZXh0IHdvcmRzCit0ZW1wbGF0ZSA8Y2xhc3MgRmlsdGVyVD4gY2xhc3MgQ29udGV4dEZpbHRlciB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIEZpbHRlclQgRmlsdGVyOworCisgICAgZXhwbGljaXQgQ29udGV4dEZpbHRlcihGaWx0ZXIgJmJhY2tlbmQpIDogYmFja2VuZF8oYmFja2VuZCkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBPdXRwdXQ+IHZvaWQgQWRkTkdyYW0oY29uc3QgU3RyaW5nUGllY2UgJm5ncmFtLCBjb25zdCBTdHJpbmdQaWVjZSAmbGluZSwgT3V0cHV0ICZvdXRwdXQpIHsKKyAgICAgIC8vIEZpbmQgYmVnaW5uaW5nIG9mIHN0cmluZyBvciBsYXN0IHNwYWNlLgorICAgICAgY29uc3QgY2hhciAqbGFzdF9zcGFjZTsKKyAgICAgIGZvciAobGFzdF9zcGFjZSA9IG5ncmFtLmRhdGEoKSArIG5ncmFtLnNpemUoKSAtIDE7IGxhc3Rfc3BhY2UgPiBuZ3JhbS5kYXRhKCkgJiYgKmxhc3Rfc3BhY2UgIT0gJyAnOyAtLWxhc3Rfc3BhY2UpIHt9CisgICAgICBiYWNrZW5kXy5BZGROR3JhbShTdHJpbmdQaWVjZShuZ3JhbS5kYXRhKCksIGxhc3Rfc3BhY2UgLSBuZ3JhbS5kYXRhKCkpLCBsaW5lLCBvdXRwdXQpOworICAgIH0KKworICAgIHZvaWQgRmx1c2goKSBjb25zdCB7fQorCisgIHByaXZhdGU6CisgICAgRmlsdGVyIGJhY2tlbmRfOworfTsKKworfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX0ZJTFRFUl9XUkFQUEVSX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9mcmFnbWVudF9tYWluLmNjIGIvc3JjL2tlbmxtL2xtL2ZyYWdtZW50X21haW4uY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9mcmFnbWVudF9tYWluLmNjCnJlbmFtZSB0byBzcmMva2VubG0vbG0vZnJhZ21lbnRfbWFpbi5jYwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL0NNYWtlTGlzdHMudHh0IGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDZhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1NCBAQAorZmluZF9wYWNrYWdlKEVpZ2VuMyBSRVFVSVJFRCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtFSUdFTjNfSU5DTFVERV9ESVJ9KQorCitzZXQoS0VOTE1fSU5URVJQT0xBVEVfU09VUkNFCisgICAgYmFja29mZl9yZXVuaWZpY2F0aW9uLmNjCisgICAgYm91bmRlZF9zZXF1ZW5jZV9lbmNvZGluZy5jYworICAgIGVudW1lcmF0ZV9nbG9iYWxfdm9jYWIuY2MKKyAgICBtZXJnZV9wcm9iYWJpbGl0aWVzLmNjCisgICAgbWVyZ2Vfdm9jYWIuY2MKKyAgICBub3JtYWxpemUuY2MKKyAgICBwaXBlbGluZS5jYworICAgIHNwbGl0X3dvcmtlci5jYworICAgIHR1bmVfZGVyaXZhdGl2ZXMuY2MKKyAgICB0dW5lX2luc3RhbmNlLmNjCisgICAgdW5pdmVyc2FsX3ZvY2FiLmNjKQorCithZGRfbGlicmFyeShrZW5sbV9pbnRlcnBvbGF0ZSBPQkpFQ1QgJHtLRU5MTV9JTlRFUlBPTEFURV9TT1VSQ0V9KQorCitzZXQoS0VOTE1fSU5URVJQT0xBVEVfRVhFUworICAgIGludGVycG9sYXRlCisgICAgcGVyZl9lbnVtX2d2CisgICAgc3RyZWFtaW5nX2V4YW1wbGUKKyAgICB0cmFpbl9wYXJhbXMKKyAgICB0dW5lKQorCitzZXQoS0VOTE1fSU5URVJQT0xBVEVfREVQRU5EUworICAgICQ8VEFSR0VUX09CSkVDVFM6a2VubG0+CisgICAgJDxUQVJHRVRfT0JKRUNUUzprZW5sbV91dGlsPgorICAgICQ8VEFSR0VUX09CSkVDVFM6a2VubG1fY29tbW9uPgorICAgICQ8VEFSR0VUX09CSkVDVFM6a2VubG1faW50ZXJwb2xhdGU+KQorCitBZGRFeGVzKEVYRVMgJHtLRU5MTV9JTlRFUlBPTEFURV9FWEVTfQorICAgICAgICBERVBFTkRTICR7S0VOTE1fSU5URVJQT0xBVEVfREVQRU5EU30KKyAgICAgICAgTElCUkFSSUVTICR7Qm9vc3RfTElCUkFSSUVTfSBwdGhyZWFkKQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIHNldChLRU5MTV9JTlRFUlBPTEFURV9URVNUUworICAgICAgICBiYWNrb2ZmX3JldW5pZmljYXRpb25fdGVzdAorICAgICAgICBib3VuZGVkX3NlcXVlbmNlX2VuY29kaW5nX3Rlc3QKKyAgICAgICAgbWVyZ2Vfdm9jYWJfdGVzdAorICAgICAgICBub3JtYWxpemVfdGVzdAorICAgICAgICB0dW5lX2Rlcml2YXRpdmVzX3Rlc3QpCisKKyAgICBBZGRUZXN0cyhURVNUUyAke0tFTkxNX0lOVEVSUE9MQVRFX1RFU1RTfQorICAgICAgICAgICAgIERFUEVORFMgJHtLRU5MTV9JTlRFUlBPTEFURV9ERVBFTkRTfQorICAgICAgICAgICAgIExJQlJBUklFUyAke0Jvb3N0X0xJQlJBUklFU30gcHRocmVhZCkKKworICAgICMgdHVuZV9pbnN0YW5jZV90ZXN0IG5lZWRzIGFuIGV4dHJhIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIKKyAgICBLZW5MTUFkZFRlc3QoVEVTVCB0dW5lX2luc3RhbmNlX3Rlc3QKKyAgICAgICAgICAgICAgICAgREVQRU5EUyAke0tFTkxNX0lOVEVSUE9MQVRFX0RFUEVORFN9CisgICAgICAgICAgICAgICAgIExJQlJBUklFUyAke0Jvb3N0X0xJQlJBUklFU30gcHRocmVhZAorICAgICAgICAgICAgICAgICBURVNUX0FSR1MKKyAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3R1bmVfaW5zdGFuY2VfZGF0YS90b3kwLjEpCitlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvSmFtZmlsZSBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9KYW1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMWEzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvSmFtZmlsZQpAQCAtMCwwICsxLDIyIEBACitmYWtlbGliIGludGVycCA6IC4uL2NvbW1vbi8vY29tbW9uIFsgZ2xvYiAqLmNjIDogKl9tYWluLmNjICpfdGVzdC5jYyB0dW5lXyouY2MgXSA6IDxjeHhmbGFncz4tZm9wZW5tcCA7CisKK2ltcG9ydCB0ZXN0aW5nIDsKKworbG9jYWwgd2l0aC1laWdlbiA9IFsgb3B0aW9uLmdldCAid2l0aC1laWdlbiIgXSA7CitpZiAkKHdpdGgtZWlnZW4pIHsKKyAgZmFrZWxpYiB0dW5pbmcgOiB0dW5lX2luc3RhbmNlLmNjIHR1bmVfZGVyaXZhdGl2ZXMuY2MgaW50ZXJwIC4uLy9rZW5sbSA6IDxpbmNsdWRlPiQod2l0aC1laWdlbikgOworICB1bml0LXRlc3QgdHVuZV9kZXJpdmF0aXZlc190ZXN0IDogdHVuZV9kZXJpdmF0aXZlc190ZXN0LmNjIHR1bmluZyAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIDogPGluY2x1ZGU+JCh3aXRoLWVpZ2VuKSA7CisKKyAgb2JqIHR1bmVfaW5zdGFuY2VfdGVzdC5vIDogdHVuZV9pbnN0YW5jZV90ZXN0LmNjIC90b3AvL2Jvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsgOiA8aW5jbHVkZT4kKHdpdGgtZWlnZW4pIDsKKyAgcnVuIHR1bmVfaW5zdGFuY2VfdGVzdC5vIHR1bmluZyAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIDogOiB0dW5lX2luc3RhbmNlX2RhdGEvdG95MC4xIDsKKworICBleGUgdHVuZSA6IHR1bmVfbWFpbi5jYyB0dW5pbmcgL3RvcC8vYm9vc3RfcHJvZ3JhbV9vcHRpb25zIDogPGluY2x1ZGU+JCh3aXRoLWVpZ2VuKSA7Cit9CisKK2V4ZSBpbnRlcnBvbGF0ZSA6IGludGVycG9sYXRlX21haW4uY2MgaW50ZXJwIC90b3AvL2Jvb3N0X3Byb2dyYW1fb3B0aW9ucyA7CitleGUgc3RyZWFtaW5nX2V4YW1wbGUgOiAuLi9idWlsZGVyLy9idWlsZGVyIGludGVycCBzdHJlYW1pbmdfZXhhbXBsZV9tYWluLmNjIC90b3AvL2Jvb3N0X3Byb2dyYW1fb3B0aW9ucyA7CisKK3VuaXQtdGVzdCBub3JtYWxpemVfdGVzdCA6IGludGVycCBub3JtYWxpemVfdGVzdC5jYyAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIDsKK3VuaXQtdGVzdCBiYWNrb2ZmX3JldW5pZmljYXRpb25fdGVzdCA6IGludGVycCBiYWNrb2ZmX3JldW5pZmljYXRpb25fdGVzdC5jYyAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIDsKK3VuaXQtdGVzdCBib3VuZGVkX3NlcXVlbmNlX2VuY29kaW5nX3Rlc3QgOiBpbnRlcnAgYm91bmRlZF9zZXF1ZW5jZV9lbmNvZGluZ190ZXN0LmNjIC90b3AvL2Jvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsgOworcnVuIG1lcmdlX3ZvY2FiX3Rlc3QuY2MgaW50ZXJwIC90b3AvL2Jvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsgOiA6IG1lcmdlX3Rlc3QvdGVzdDEgbWVyZ2VfdGVzdC90ZXN0MiBtZXJnZV90ZXN0L3Rlc3QzIG1lcmdlX3Rlc3QvdGVzdF9iYWRfb3JkZXIgbWVyZ2VfdGVzdC90ZXN0X25vX3VuayA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvYmFja29mZl9tYXRyaXguaGggYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvYmFja29mZl9tYXRyaXguaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1NTJkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9iYWNrb2ZmX21hdHJpeC5oaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIExNX0lOVEVSUE9MQVRFX0JBQ0tPRkZfTUFUUklYX0gKKyNkZWZpbmUgTE1fSU5URVJQT0xBVEVfQkFDS09GRl9NQVRSSVhfSAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBpbnRlcnBvbGF0ZSB7CisKK2NsYXNzIEJhY2tvZmZNYXRyaXggeworICBwdWJsaWM6CisgICAgQmFja29mZk1hdHJpeChzdGQ6OnNpemVfdCBudW1fbW9kZWxzLCBzdGQ6OnNpemVfdCBtYXhfb3JkZXIpCisgICAgICA6IG1heF9vcmRlcl8obWF4X29yZGVyKSwgYmFja2luZ18obnVtX21vZGVscyAqIG1heF9vcmRlcikge30KKworICAgIGZsb2F0ICZCYWNrb2ZmKHN0ZDo6c2l6ZV90IG1vZGVsLCBzdGQ6OnNpemVfdCBvcmRlcl9taW51c18xKSB7CisgICAgICByZXR1cm4gYmFja2luZ19bbW9kZWwgKiBtYXhfb3JkZXJfICsgb3JkZXJfbWludXNfMV07CisgICAgfQorCisgICAgZmxvYXQgQmFja29mZihzdGQ6OnNpemVfdCBtb2RlbCwgc3RkOjpzaXplX3Qgb3JkZXJfbWludXNfMSkgY29uc3QgeworICAgICAgcmV0dXJuIGJhY2tpbmdfW21vZGVsICogbWF4X29yZGVyXyArIG9yZGVyX21pbnVzXzFdOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2l6ZV90IG1heF9vcmRlcl87CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGJhY2tpbmdfOworfTsKKworfX0gLy8gbmFtZXNwYWNlcworCisjZW5kaWYgLy8gTE1fSU5URVJQT0xBVEVfQkFDS09GRl9NQVRSSVhfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2JhY2tvZmZfcmV1bmlmaWNhdGlvbi5jYyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9iYWNrb2ZmX3JldW5pZmljYXRpb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRmNmRkYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9iYWNrb2ZmX3JldW5pZmljYXRpb24uY2MKQEAgLTAsMCArMSw1NyBAQAorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL2JhY2tvZmZfcmV1bmlmaWNhdGlvbi5oaCIKKyNpbmNsdWRlICJsbS9jb21tb24vbW9kZWxfYnVmZmVyLmhoIgorI2luY2x1ZGUgImxtL2NvbW1vbi9uZ3JhbV9zdHJlYW0uaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL25ncmFtLmhoIgorI2luY2x1ZGUgImxtL2NvbW1vbi9jb21wYXJlLmhoIgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBpbnRlcnBvbGF0ZSB7CisKK25hbWVzcGFjZSB7CitjbGFzcyBNZXJnZVdvcmtlciB7CitwdWJsaWM6CisgIE1lcmdlV29ya2VyKHN0ZDo6c2l6ZV90IG9yZGVyLCBjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnByb2JfcG9zLAorICAgICAgICAgICAgICBjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJmJvZmZfcG9zKQorICAgICAgOiBvcmRlcl8ob3JkZXIpLCBwcm9iX3Bvc18ocHJvYl9wb3MpLCBib2ZmX3Bvc18oYm9mZl9wb3MpIHsKKyAgICAvLyBub3RoaW5nCisgIH0KKworICB2b2lkIFJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7CisgICAgbG06Ok5HcmFtU3RyZWFtPFByb2JCYWNrb2ZmPiBzdHJlYW0ocG9zaXRpb24pOworCisgICAgbG06Ok5HcmFtU3RyZWFtPGZsb2F0PiBwcm9iX2lucHV0KHByb2JfcG9zXyk7CisgICAgdXRpbDo6c3RyZWFtOjpTdHJlYW0gYm9mZl9pbnB1dChib2ZmX3Bvc18pOworICAgIGZvciAoOyBwcm9iX2lucHV0ICYmIGJvZmZfaW5wdXQ7ICsrcHJvYl9pbnB1dCwgKytib2ZmX2lucHV0LCArK3N0cmVhbSkgeworICAgICAgc3RkOjpjb3B5KHByb2JfaW5wdXQtPmJlZ2luKCksIHByb2JfaW5wdXQtPmVuZCgpLCBzdHJlYW0tPmJlZ2luKCkpOworICAgICAgc3RyZWFtLT5WYWx1ZSgpLnByb2IgPSBwcm9iX2lucHV0LT5WYWx1ZSgpOworICAgICAgc3RyZWFtLT5WYWx1ZSgpLmJhY2tvZmYgPSAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPihib2ZmX2lucHV0LkdldCgpKTsKKyAgICB9CisgICAgVVRJTF9USFJPV19JRjIocHJvYl9pbnB1dCB8fCBib2ZmX2lucHV0LAorICAgICAgICAgICAgICAgICAgICJTdHJlYW1zIHdlcmUgbm90IHRoZSBzYW1lIHNpemUgZHVyaW5nIG1lcmdpbmciKTsKKyAgICBzdHJlYW0uUG9pc29uKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzaXplX3Qgb3JkZXJfOworICB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gcHJvYl9wb3NfOworICB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gYm9mZl9wb3NfOworfTsKK30KKworLy8gU2luY2Ugd2UgYXJlICphZGRpbmcqIHNvbWV0aGluZyB0byB0aGUgb3V0cHV0IGNoYWluIGhlcmUsIHdlIHBhc3MgaW4gdGhlCisvLyBjaGFpbiBpdHNlbGYgc28gdGhhdCB3ZSBjYW4gc2FmZWx5IGFkZCBhIG5ldyBzdGVwIHRvIHRoZSBjaGFpbiB3aXRob3V0CisvLyBjcmVhdGluZyBhIGRlYWRsb2NrIHNpdHVhdGlvbiAoc2luY2UgY3JlYXRpbmcgYSBuZXcgQ2hhaW5Qb3NpdGlvbiB3aWxsCisvLyBtYWtlIGEgbmV3IGlucHV0L291dHB1dCBwYWlyLS0td2Ugd2FudCB0aGF0IHBvc2l0aW9uIHRvIGJlIGNyZWF0ZWQKKy8vICpoZXJlKiwgbm90IGJlZm9yZSkuCit2b2lkIFJldW5pZnlCYWNrb2ZmKHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJnByb2JfcG9zLAorICAgICAgICAgICAgICAgICAgICB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zICZib2ZmX3BvcywKKyAgICAgICAgICAgICAgICAgICAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgJm91dHB1dF9jaGFpbnMpIHsKKyAgYXNzZXJ0KHByb2JfcG9zLnNpemUoKSA9PSBib2ZmX3Bvcy5zaXplKCkpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJvYl9wb3Muc2l6ZSgpOyArK2kpCisgICAgb3V0cHV0X2NoYWluc1tpXSA+PiBNZXJnZVdvcmtlcihpICsgMSwgcHJvYl9wb3NbaV0sIGJvZmZfcG9zW2ldKTsKK30KK30KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9iYWNrb2ZmX3JldW5pZmljYXRpb24uaGggYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvYmFja29mZl9yZXVuaWZpY2F0aW9uLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyN2RiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvYmFja29mZl9yZXVuaWZpY2F0aW9uLmhoCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgS0VOTE1fSU5URVJQT0xBVEVfQkFDS09GRl9SRVVOSUZJQ0FUSU9OXworI2RlZmluZSBLRU5MTV9JTlRFUlBPTEFURV9CQUNLT0ZGX1JFVU5JRklDQVRJT05fCisKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9zdHJlYW0uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vbXVsdGlfc3RyZWFtLmhoIgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIGludGVycG9sYXRlIHsKKworLyoqCisgKiBUaGUgdGhpcmQgcGFzcyBmb3IgdGhlIG9mZmxpbmUgbG9nLWxpbmVhciBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobS4gVGhpcworICogcmVhZHMgKipzdWZmaXgtb3JkZXJlZCoqIHByb2JhYmlsaXR5IHZhbHVlcyAobmdyYW0taWQsIGZsb2F0KSBhbmQKKyAqICoqc3VmZml4LW9yZGVyZWQqKiBiYWNrb2ZmIHZhbHVlcyAoZmxvYXQpIGFuZCB3cml0ZXMgdGhlIG1lcmdlZCBjb250ZW50cworICogdG8gdGhlIG91dHB1dC4KKyAqCisgKiBAcGFyYW0gcHJvYl9wb3MgVGhlIGNoYWluIHBvc2l0aW9uIGZvciBlYWNoIG9yZGVyIGZyb20gd2hpY2ggdG8gcmVhZAorICogIHRoZSBwcm9iYWJpbGl0eSB2YWx1ZXMKKyAqIEBwYXJhbSBib2ZmX3BvcyBUaGUgY2hhaW4gcG9zaXRpb24gZm9yIGVhY2ggb3JkZXIgZnJvbSB3aGljaCB0byByZWFkCisgKiAgdGhlIGJhY2tvZmYgdmFsdWVzCisgKiBAcGFyYW0gb3V0cHV0X2NoYWlucyBUaGUgb3V0cHV0IGNoYWlucyBmb3IgZWFjaCBvcmRlcgorICovCit2b2lkIFJldW5pZnlCYWNrb2ZmKHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgJnByb2JfcG9zLAorICAgICAgICAgICAgICAgICAgICB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zICZib2ZmX3BvcywKKyAgICAgICAgICAgICAgICAgICAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgJm91dHB1dF9jaGFpbnMpOworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvYmFja29mZl9yZXVuaWZpY2F0aW9uX3Rlc3QuY2MgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvYmFja29mZl9yZXVuaWZpY2F0aW9uX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmYWY5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9iYWNrb2ZmX3JldW5pZmljYXRpb25fdGVzdC5jYwpAQCAtMCwwICsxLDE1OSBAQAorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL2JhY2tvZmZfcmV1bmlmaWNhdGlvbi5oaCIKKyNpbmNsdWRlICJsbS9jb21tb24vbmdyYW1fc3RyZWFtLmhoIgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEludGVycG9sYXRlQmFja29mZlJldW5pZmljYXRpb25UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIGludGVycG9sYXRlIHsKKworbmFtZXNwYWNlIHsKKworLy8gbm9uZSBvZiB0aGlzIGlucHV0IGFjdHVhbGx5IG1ha2VzIHNlbnNlLCBhbGwgd2UgY2FyZSBhYm91dCBpcyBtYWtpbmcKKy8vIHN1cmUgdGhlIG1lcmdpbmcgd29ya3MKK3RlbXBsYXRlIDx1aW50OF90IE4+CitzdHJ1Y3QgR3JhbSB7CisgIFdvcmRJbmRleCBpZHNbTl07CisgIGZsb2F0IHByb2I7CisgIGZsb2F0IGJvZmY7Cit9OworCit0ZW1wbGF0ZSA8dWludDhfdCBOPgorc3RydWN0IEdyYW1zIHsKKyAgY29uc3Qgc3RhdGljIEdyYW08Tj4gZ3JhbXNbXTsKK307CisKK3RlbXBsYXRlIDw+Citjb25zdCBHcmFtPDE+IEdyYW1zPDE+OjpncmFtc1tdCisgICAgPSB7e3swfSwgMC4xZiwgMC4xZn0sIHt7MX0sIDAuNGYsIDAuMmZ9LCB7ezJ9LCAwLjVmLCAwLjFmfX07CisKK3RlbXBsYXRlIDw+Citjb25zdCBHcmFtPDI+IEdyYW1zPDI+OjpncmFtc1tdID0ge3t7MCwgMH0sIDAuMDVmLCAwLjA1Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MSwgMH0sIDAuMDVmLCAwLjAyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MSwgMX0sIDAuMmYsIDAuMDRmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3syLCAyfSwgMC4yZiwgMC4wMWZ9fTsKKwordGVtcGxhdGUgPD4KK2NvbnN0IEdyYW08Mz4gR3JhbXM8Mz46OmdyYW1zW10gPSB7e3swLCAwLCAwfSwgMC4wMDFmLCAwLjAwNWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezEsIDAsIDB9LCAwLjAwMWYsIDAuMDAyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MiwgMCwgMH0sIDAuMDAxZiwgMC4wMDNmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3swLCAxLCAwfSwgMC4xZiwgMC4wMDhmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sxLCAxLCAwfSwgMC4xZiwgMC4wOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezEsIDEsIDF9LCAwLjJmLCAwLjA4Zn19OworCit0ZW1wbGF0ZSA8dWludDhfdCBOPgorY2xhc3MgV3JpdGVJbnB1dCB7CitwdWJsaWM6CisgIHZvaWQgUnVuKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKKyAgICBsbTo6TkdyYW1TdHJlYW08ZmxvYXQ+IG91dHB1dChwb3NpdGlvbik7CisKKyAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKEdyYW1zPE4+OjpncmFtcykgLyBzaXplb2YoR3JhbTxOPik7CisgICAgICAgICArK2ksICsrb3V0cHV0KSB7CisgICAgICBzdGQ6OmNvcHkoR3JhbXM8Tj46OmdyYW1zW2ldLmlkcywgR3JhbXM8Tj46OmdyYW1zW2ldLmlkcyArIE4sCisgICAgICAgICAgICAgICAgb3V0cHV0LT5iZWdpbigpKTsKKyAgICAgIG91dHB1dC0+VmFsdWUoKSA9IEdyYW1zPE4+OjpncmFtc1tpXS5wcm9iOworICAgIH0KKyAgICBvdXRwdXQuUG9pc29uKCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx1aW50OF90IE4+CitjbGFzcyBXcml0ZUJhY2tvZmZzIHsKK3B1YmxpYzoKKyAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICAgIHV0aWw6OnN0cmVhbTo6U3RyZWFtIG91dHB1dChwb3NpdGlvbik7CisKKyAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKEdyYW1zPE4+OjpncmFtcykgLyBzaXplb2YoR3JhbTxOPik7CisgICAgICAgICArK2ksICsrb3V0cHV0KSB7CisgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPihvdXRwdXQuR2V0KCkpID0gR3JhbXM8Tj46OmdyYW1zW2ldLmJvZmY7CisgICAgfQorICAgIG91dHB1dC5Qb2lzb24oKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHVpbnQ4X3QgTj4KK2NsYXNzIENoZWNrT3V0cHV0IHsKK3B1YmxpYzoKKyAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICAgIGxtOjpOR3JhbVN0cmVhbTxQcm9iQmFja29mZj4gc3RyZWFtKHBvc2l0aW9uKTsKKworICAgIHN0ZDo6c2l6ZV90IGkgPSAwOworICAgIGZvciAoOyBzdHJlYW07ICsrc3RyZWFtLCArK2kpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgZm9yIChXb3JkSW5kZXggKmlkeCA9IHN0cmVhbS0+YmVnaW4oKTsgaWR4ICE9IHN0cmVhbS0+ZW5kKCk7ICsraWR4KQorICAgICAgICBzcyA8PCAiKCIgPDwgKmlkeCA8PCAiKSI7CisKKyAgICAgIFVUSUxfVEhST1dfSUYyKAorICAgICAgICAgICFzdGQ6OmVxdWFsKHN0cmVhbS0+YmVnaW4oKSwgc3RyZWFtLT5lbmQoKSwgR3JhbXM8Tj46OmdyYW1zW2ldLmlkcyksCisgICAgICAgICAgIk1pc21hdGNoZWQgaWQgaW4gQ2hlY2tPdXRwdXQ8IiA8PCAoaW50KU4gPDwgIj46ICIgPDwgc3Muc3RyKCkpOworCisgICAgICBVVElMX1RIUk9XX0lGMihzdHJlYW0tPlZhbHVlKCkucHJvYiAhPSBHcmFtczxOPjo6Z3JhbXNbaV0ucHJvYiwKKyAgICAgICAgICAgICAgICAgICAgICJNaXNtYXRjaGVkIHByb2JhYmlsaXR5IGluIENoZWNrT3V0cHV0PCIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoaW50KU4gPDwgIj4sIGdvdCAiIDw8IHN0cmVhbS0+VmFsdWUoKS5wcm9iCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZXhwZWN0ZWQgIiA8PCBHcmFtczxOPjo6Z3JhbXNbaV0ucHJvYik7CisKKyAgICAgIFVUSUxfVEhST1dfSUYyKHN0cmVhbS0+VmFsdWUoKS5iYWNrb2ZmICE9IEdyYW1zPE4+OjpncmFtc1tpXS5ib2ZmLAorICAgICAgICAgICAgICAgICAgICAgIk1pc21hdGNoZWQgYmFja29mZiBpbiBDaGVja091dHB1dDwiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGludClOIDw8ICI+LCBnb3QgIiA8PCBzdHJlYW0tPlZhbHVlKCkuYmFja29mZgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGV4cGVjdGVkICIgPDwgR3JhbXM8Tj46OmdyYW1zW2ldLmJvZmYpOworICAgIH0KKyAgICBVVElMX1RIUk9XX0lGMihpICE9IHNpemVvZihHcmFtczxOPjo6Z3JhbXMpIC8gc2l6ZW9mKEdyYW08Tj4pLAorICAgICAgICAgICAgICAgICAgICJEaWQgbm90IGdldCBjb3JyZWN0IG51bWJlciBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IChpbnQpTiA8PCAiLWdyYW1zOiBleHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHNpemVvZihHcmFtczxOPjo6Z3JhbXMpIC8gc2l6ZW9mKEdyYW08Tj4pCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGdvdCAiIDw8IGkpOworICB9Cit9OworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShCYWNrb2ZmUmV1bmlmaWNhdGlvblRlc3QpIHsKKyAgdXRpbDo6c3RyZWFtOjpDaGFpbkNvbmZpZyBjb25maWc7CisgIGNvbmZpZy50b3RhbF9tZW1vcnkgPSAxMDA7CisgIGNvbmZpZy5ibG9ja19jb3VudCA9IDE7CisKKyAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgcHJvYl9jaGFpbnMoMyk7CisgIGNvbmZpZy5lbnRyeV9zaXplID0gTkdyYW08ZmxvYXQ+OjpUb3RhbFNpemUoMSk7CisgIHByb2JfY2hhaW5zLnB1c2hfYmFjayhjb25maWcpOworICBwcm9iX2NoYWlucy5iYWNrKCkgPj4gV3JpdGVJbnB1dDwxPigpOworCisgIGNvbmZpZy5lbnRyeV9zaXplID0gTkdyYW08ZmxvYXQ+OjpUb3RhbFNpemUoMik7CisgIHByb2JfY2hhaW5zLnB1c2hfYmFjayhjb25maWcpOworICBwcm9iX2NoYWlucy5iYWNrKCkgPj4gV3JpdGVJbnB1dDwyPigpOworCisgIGNvbmZpZy5lbnRyeV9zaXplID0gTkdyYW08ZmxvYXQ+OjpUb3RhbFNpemUoMyk7CisgIHByb2JfY2hhaW5zLnB1c2hfYmFjayhjb25maWcpOworICBwcm9iX2NoYWlucy5iYWNrKCkgPj4gV3JpdGVJbnB1dDwzPigpOworCisgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zIGJvZmZfY2hhaW5zKDMpOworICBjb25maWcuZW50cnlfc2l6ZSA9IHNpemVvZihmbG9hdCk7CisgIGJvZmZfY2hhaW5zLnB1c2hfYmFjayhjb25maWcpOworICBib2ZmX2NoYWlucy5iYWNrKCkgPj4gV3JpdGVCYWNrb2ZmczwxPigpOworCisgIGJvZmZfY2hhaW5zLnB1c2hfYmFjayhjb25maWcpOworICBib2ZmX2NoYWlucy5iYWNrKCkgPj4gV3JpdGVCYWNrb2ZmczwyPigpOworCisgIGJvZmZfY2hhaW5zLnB1c2hfYmFjayhjb25maWcpOworICBib2ZmX2NoYWlucy5iYWNrKCkgPj4gV3JpdGVCYWNrb2ZmczwzPigpOworCisgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgcHJvYl9wb3MocHJvYl9jaGFpbnMpOworICB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zIGJvZmZfcG9zKGJvZmZfY2hhaW5zKTsKKworICB1dGlsOjpzdHJlYW06OkNoYWlucyBvdXRwdXRfY2hhaW5zKDMpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgY29uZmlnLmVudHJ5X3NpemUgPSBOR3JhbTxQcm9iQmFja29mZj46OlRvdGFsU2l6ZShpICsgMSk7CisgICAgb3V0cHV0X2NoYWlucy5wdXNoX2JhY2soY29uZmlnKTsKKyAgfQorCisgIFJldW5pZnlCYWNrb2ZmKHByb2JfcG9zLCBib2ZmX3Bvcywgb3V0cHV0X2NoYWlucyk7CisKKyAgb3V0cHV0X2NoYWluc1swXSA+PiBDaGVja091dHB1dDwxPigpOworICBvdXRwdXRfY2hhaW5zWzFdID4+IENoZWNrT3V0cHV0PDI+KCk7CisgIG91dHB1dF9jaGFpbnNbMl0gPj4gQ2hlY2tPdXRwdXQ8Mz4oKTsKKworICBwcm9iX2NoYWlucyA+PiB1dGlsOjpzdHJlYW06OmtSZWN5Y2xlOworICBib2ZmX2NoYWlucyA+PiB1dGlsOjpzdHJlYW06OmtSZWN5Y2xlOworCisgIG91dHB1dF9jaGFpbnMuV2FpdCgpOworfQorfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2JvdW5kZWRfc2VxdWVuY2VfZW5jb2RpbmcuY2MgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvYm91bmRlZF9zZXF1ZW5jZV9lbmNvZGluZy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E4ZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2JvdW5kZWRfc2VxdWVuY2VfZW5jb2RpbmcuY2MKQEAgLTAsMCArMSwzNiBAQAorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL2JvdW5kZWRfc2VxdWVuY2VfZW5jb2RpbmcuaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBpbnRlcnBvbGF0ZSB7CisKK0JvdW5kZWRTZXF1ZW5jZUVuY29kaW5nOjpCb3VuZGVkU2VxdWVuY2VFbmNvZGluZyhjb25zdCB1bnNpZ25lZCBjaGFyICpib3VuZF9iZWdpbiwgY29uc3QgdW5zaWduZWQgY2hhciAqYm91bmRfZW5kKQorICA6IGVudHJpZXNfKGJvdW5kX2VuZCAtIGJvdW5kX2JlZ2luKSB7CisgIHN0ZDo6c2l6ZV90IGZ1bGwgPSAwOworICBFbnRyeSBlbnRyeTsKKyAgZW50cnkuc2hpZnQgPSAwOworICBmb3IgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmkgPSBib3VuZF9iZWdpbjsgaSAhPSBib3VuZF9lbmQ7ICsraSkgeworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICgqaSA8PSAxKSB7CisgICAgICBsZW5ndGggPSAwOworICAgIH0gZWxzZSB7CisgICAgICBsZW5ndGggPSBzaXplb2YodW5zaWduZWQgaW50KSAqIDggLSBfX2J1aWx0aW5fY2x6KCh1bnNpZ25lZCBpbnQpKmkpOworICAgIH0KKyAgICBlbnRyeS5tYXNrID0gKDFVTEwgPDwgbGVuZ3RoKSAtIDFVTEw7CisgICAgaWYgKGVudHJ5LnNoaWZ0ICsgbGVuZ3RoID4gNjQpIHsKKyAgICAgIGVudHJ5LnNoaWZ0ID0gMDsKKyAgICAgIGVudHJ5Lm5leHQgPSB0cnVlOworICAgICAgKytmdWxsOworICAgIH0gZWxzZSB7CisgICAgICBlbnRyeS5uZXh0ID0gZmFsc2U7CisgICAgfQorICAgIGVudHJpZXNfLnB1c2hfYmFjayhlbnRyeSk7CisgICAgZW50cnkuc2hpZnQgKz0gbGVuZ3RoOworICB9CisgIGJ5dGVfbGVuZ3RoXyA9IGZ1bGwgKiBzaXplb2YodWludDY0X3QpICsgKGVudHJ5LnNoaWZ0ICsgNykgLyA4OworICBmaXJzdF9jb3B5XyA9IHN0ZDo6bWluPHN0ZDo6c2l6ZV90PihieXRlX2xlbmd0aF8sIHNpemVvZih1aW50NjRfdCkpOworICAvLyBTaXplIG9mIGxhc3QgdWludDY0X3QuICBaZXJvIGlmIGVtcHR5LCBvdGhlcndpc2UgWzEsOF0gZGVwZW5kaW5nIG9uIG1vZC4KKyAgb3ZlcmhhbmdfID0gYnl0ZV9sZW5ndGhfID09IDAgPyAwIDogKChieXRlX2xlbmd0aF8gLSAxKSAlIDggKyAxKTsKK30KKworfX0gLy8gbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2JvdW5kZWRfc2VxdWVuY2VfZW5jb2RpbmcuaGggYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvYm91bmRlZF9zZXF1ZW5jZV9lbmNvZGluZy5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGRkNjNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2JvdW5kZWRfc2VxdWVuY2VfZW5jb2RpbmcuaGgKQEAgLTAsMCArMSw3NiBAQAorI2lmbmRlZiBMTV9JTlRFUlBPTEFURV9CT1VOREVEX1NFUVVFTkNFX0VOQ09ESU5HX0gKKyNkZWZpbmUgTE1fSU5URVJQT0xBVEVfQk9VTkRFRF9TRVFVRU5DRV9FTkNPRElOR19ICisKKy8qIEVuY29kZXMgZml4ZWQtbGVuZ3RoIHNlcXVlbmNlcyBvZiBpbnRlZ2VycyB3aXRoIGtub3duIGJvdW5kcyBvbiBlYWNoIGVudHJ5LgorICogVGhpcyBpcyB1c2VkIHRvIGVuY29kZSBob3cgZmFyIGVhY2ggbW9kZWwgaGFzIGJhY2tlZCBvZmYuCisgKiBUT0RPOiBtYWtlIHRoaXMgY2xhc3MgZWZmaWNpZW50LiAgQml0LWxldmVsIHBhY2tpbmcgb3IgbXVsdGlwbHkgYnkgYm91bmQgYW5kCisgKiBhZGQuCisgKi8KKworI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgInV0aWwvZml4ZWRfYXJyYXkuaGgiCisKKyNpZiBCWVRFX09SREVSICE9IExJVFRMRV9FTkRJQU4KKyN3YXJuaW5nIFRoZSBpbnRlcnBvbGF0aW9uIGNvZGUgYXNzdW1lcyBsaXR0bGUgZW5kaWFuIGZvciBub3cuCisjZW5kaWYKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIGludGVycG9sYXRlIHsKKworY2xhc3MgQm91bmRlZFNlcXVlbmNlRW5jb2RpbmcgeworICBwdWJsaWM6CisgICAgLy8gRW5jb2RlIFswLCBib3VuZF9iZWdpblswXSkgeCBbMCwgYm91bmRfYmVnaW5bMV0pIHggWzAsIGJvdW5kX2JlZ2luWzJdKSB4IC4uLiB4IFswLCAqKGJvdW5kX2VuZCAtIDEpKSBmb3IgZW50cmllcyBpbiB0aGUgc2VxdWVuY2UKKyAgICBCb3VuZGVkU2VxdWVuY2VFbmNvZGluZyhjb25zdCB1bnNpZ25lZCBjaGFyICpib3VuZF9iZWdpbiwgY29uc3QgdW5zaWduZWQgY2hhciAqYm91bmRfZW5kKTsKKworICAgIHN0ZDo6c2l6ZV90IEVudHJpZXMoKSBjb25zdCB7IHJldHVybiBlbnRyaWVzXy5zaXplKCk7IH0KKworICAgIHN0ZDo6c2l6ZV90IEVuY29kZWRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBieXRlX2xlbmd0aF87IH0KKworICAgIHZvaWQgRW5jb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sIHZvaWQgKnRvX3ZvaWQpIGNvbnN0IHsKKyAgICAgIHVpbnQ4X3QgKnRvID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KHRvX3ZvaWQpOworICAgICAgdWludDY0X3QgY3VyID0gMDsKKyAgICAgIGZvciAoY29uc3QgRW50cnkgKmkgPSBlbnRyaWVzXy5iZWdpbigpOyBpICE9IGVudHJpZXNfLmVuZCgpOyArK2ksICsrZnJvbSkgeworICAgICAgICBpZiAoVVRJTF9VTkxJS0VMWShpLT5uZXh0KSkgeworICAgICAgICAgIHN0ZDo6bWVtY3B5KHRvLCAmY3VyLCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICB0byArPSBzaXplb2YodWludDY0X3QpOworICAgICAgICAgIGN1ciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY3VyIHw9IHN0YXRpY19jYXN0PHVpbnQ2NF90PigqZnJvbSkgPDwgaS0+c2hpZnQ7CisgICAgICB9CisgICAgICBtZW1jcHkodG8sICZjdXIsIG92ZXJoYW5nXyk7CisgICAgfQorCisgICAgdm9pZCBEZWNvZGUoY29uc3Qgdm9pZCAqZnJvbV92b2lkLCB1bnNpZ25lZCBjaGFyICp0bykgY29uc3QgeworICAgICAgY29uc3QgdWludDhfdCAqZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihmcm9tX3ZvaWQpOworICAgICAgdWludDY0X3QgY3VyID0gMDsKKyAgICAgIG1lbWNweSgmY3VyLCBmcm9tLCBmaXJzdF9jb3B5Xyk7CisgICAgICBmb3IgKGNvbnN0IEVudHJ5ICppID0gZW50cmllc18uYmVnaW4oKTsgaSAhPSBlbnRyaWVzXy5lbmQoKTsgKytpLCArK3RvKSB7CisgICAgICAgIGlmIChVVElMX1VOTElLRUxZKGktPm5leHQpKSB7CisgICAgICAgICAgZnJvbSArPSBzaXplb2YodWludDY0X3QpOworICAgICAgICAgIGN1ciA9IDA7CisgICAgICAgICAgc3RkOjptZW1jcHkoJmN1ciwgZnJvbSwKKyAgICAgICAgICAgICAgc3RkOjptaW48c3RkOjpzaXplX3Q+KHNpemVvZih1aW50NjRfdCksIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihmcm9tX3ZvaWQpICsgYnl0ZV9sZW5ndGhfIC0gZnJvbSkpOworICAgICAgICB9CisgICAgICAgICp0byA9IChjdXIgPj4gaS0+c2hpZnQpICYgaS0+bWFzazsKKyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgYm9vbCBuZXh0OworICAgICAgdWludDhfdCBzaGlmdDsKKyAgICAgIHVpbnQ2NF90IG1hc2s7CisgICAgfTsKKyAgICB1dGlsOjpGaXhlZEFycmF5PEVudHJ5PiBlbnRyaWVzXzsKKyAgICBzdGQ6OnNpemVfdCBieXRlX2xlbmd0aF87CisgICAgc3RkOjpzaXplX3QgZmlyc3RfY29weV87CisgICAgc3RkOjpzaXplX3Qgb3ZlcmhhbmdfOworfTsKKworCit9fSAvLyBuYW1lc3BhY2VzCisKKyNlbmRpZiAvLyBMTV9JTlRFUlBPTEFURV9CT1VOREVEX1NFUVVFTkNFX0VOQ09ESU5HX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9ib3VuZGVkX3NlcXVlbmNlX2VuY29kaW5nX3Rlc3QuY2MgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvYm91bmRlZF9zZXF1ZW5jZV9lbmNvZGluZ190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNGJiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvYm91bmRlZF9zZXF1ZW5jZV9lbmNvZGluZ190ZXN0LmNjCkBAIC0wLDAgKzEsODYgQEAKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS9ib3VuZGVkX3NlcXVlbmNlX2VuY29kaW5nLmhoIgorCisjaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgQm91bmRlZFNlcXVlbmNlRW5jb2RpbmdUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIGludGVycG9sYXRlIHsKK25hbWVzcGFjZSB7CisKK3ZvaWQgRXhoYXVzdGl2ZVRlc3QodW5zaWduZWQgY2hhciAqYm91bmRfYmVnaW4sIHVuc2lnbmVkIGNoYXIgKmJvdW5kX2VuZCkgeworICBCb3VuZGVkU2VxdWVuY2VFbmNvZGluZyBlbmMoYm91bmRfYmVnaW4sIGJvdW5kX2VuZCk7CisgIHV0aWw6OnNjb3BlZF9tYWxsb2MgYmFja2luZyh1dGlsOjpNYWxsb2NPclRocm93KGVuYy5FbmNvZGVkTGVuZ3RoKCkpKTsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gdmFsdWVzKGJvdW5kX2VuZCAtIGJvdW5kX2JlZ2luKSwKKyAgICAgIG91dChib3VuZF9lbmQgLSBib3VuZF9iZWdpbik7CisgIHdoaWxlICh0cnVlKSB7CisgICAgZW5jLkVuY29kZSgmdmFsdWVzWzBdLCBiYWNraW5nLmdldCgpKTsKKyAgICBlbmMuRGVjb2RlKGJhY2tpbmcuZ2V0KCksICZvdXRbMF0pOworICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gdmFsdWVzLnNpemUoKTsgKytpKSB7CisgICAgICBCT09TVF9DSEVDS19FUVVBTCh2YWx1ZXNbaV0sIG91dFtpXSk7CisgICAgfQorICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7OyArK2kpIHsKKyAgICAgIGlmIChpID09IHZhbHVlcy5zaXplKCkpIHJldHVybjsKKyAgICAgICsrdmFsdWVzW2ldOworICAgICAgaWYgKHZhbHVlc1tpXSA8IGJvdW5kX2JlZ2luW2ldKSBicmVhazsKKyAgICAgIHZhbHVlc1tpXSA9IDA7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ2hlY2tFbmNvZGVEZWNvZGUodW5zaWduZWQgY2hhciAqYm91bmRzLCB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBzdGQ6OnNpemVfdCBsZW4pIHsKKyAgQm91bmRlZFNlcXVlbmNlRW5jb2RpbmcgZW5jb2Rlcihib3VuZHMsIGJvdW5kcyArIGxlbik7CisgIHV0aWw6OnNjb3BlZF9tYWxsb2MgYmFja2luZyh1dGlsOjpNYWxsb2NPclRocm93KGVuY29kZXIuRW5jb2RlZExlbmd0aCgpKSk7CisKKyAgZW5jb2Rlci5FbmNvZGUoaW5wdXQsIGJhY2tpbmcuZ2V0KCkpOworICBlbmNvZGVyLkRlY29kZShiYWNraW5nLmdldCgpLCBvdXRwdXQpOworCisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGlucHV0W2ldLCBvdXRwdXRbaV0pOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEV4aGF1c3RpdmUpIHsKKyAgdW5zaWduZWQgY2hhciBib3VuZHNbXSA9IHs1LCAyLCAzLCA5LCA3LCAyMCwgOH07CisgIEV4aGF1c3RpdmVUZXN0KGJvdW5kcywgYm91bmRzICsgc2l6ZW9mKGJvdW5kcykgLyBzaXplb2YodW5zaWduZWQgY2hhcikpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShMZXNzVGhhbjY0KSB7CisgIHVuc2lnbmVkIGNoYXIgYm91bmRzW10gPSB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAzfTsKKyAgdW5zaWduZWQgY2hhciBpbnB1dFtdID0gezE3MiwgMTgzLCAyNTQsIDE4NywgOTYsIDg3LCA2NSwgMn07CisgIHVuc2lnbmVkIGNoYXIgb3V0cHV0W10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisKKyAgc3RkOjpzaXplX3QgbGVuID0gc2l6ZW9mKGJvdW5kcykgLyBzaXplb2YodW5zaWduZWQgY2hhcik7CisgIGFzc2VydChzaXplb2YoaW5wdXQpIC8gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpID09IGxlbik7CisgIGFzc2VydChzaXplb2Yob3V0cHV0KSAvIHNpemVvZih1bnNpZ25lZCBjaGFyKSA9PSBsZW4pOworCisgIENoZWNrRW5jb2RlRGVjb2RlKGJvdW5kcywgaW5wdXQsIG91dHB1dCwgbGVuKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoRXhhY3RseTY0KSB7CisgIHVuc2lnbmVkIGNoYXIgYm91bmRzW10gPSB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9OworICB1bnNpZ25lZCBjaGFyIGlucHV0W10gPSB7MTcyLCAxODMsIDI1NCwgMTg3LCA5NiwgODcsIDY1LCAxNn07CisgIHVuc2lnbmVkIGNoYXIgb3V0cHV0W10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisKKyAgc3RkOjpzaXplX3QgbGVuID0gc2l6ZW9mKGJvdW5kcykgLyBzaXplb2YodW5zaWduZWQgY2hhcik7CisgIGFzc2VydChzaXplb2YoaW5wdXQpIC8gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpID09IGxlbik7CisgIGFzc2VydChzaXplb2Yob3V0cHV0KSAvIHNpemVvZih1bnNpZ25lZCBjaGFyKSA9PSBsZW4pOworCisgIENoZWNrRW5jb2RlRGVjb2RlKGJvdW5kcywgaW5wdXQsIG91dHB1dCwgbGVuKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTW9yZVRoYW42NCkgeworICB1bnNpZ25lZCBjaGFyIGJvdW5kc1tdID0gezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9OworICB1bnNpZ25lZCBjaGFyIGlucHV0W10gPSB7MTcyLCAxODMsIDI1NCwgMTg3LCA5NiwgODcsIDY1LCAxNiwgMTM3fTsKKyAgdW5zaWduZWQgY2hhciBvdXRwdXRbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKKworICBzdGQ6OnNpemVfdCBsZW4gPSBzaXplb2YoYm91bmRzKSAvIHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKyAgYXNzZXJ0KHNpemVvZihpbnB1dCkgLyBzaXplb2YodW5zaWduZWQgY2hhcikgPT0gbGVuKTsKKyAgYXNzZXJ0KHNpemVvZihvdXRwdXQpIC8gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpID09IGxlbik7CisKKyAgQ2hlY2tFbmNvZGVEZWNvZGUoYm91bmRzLCBpbnB1dCwgb3V0cHV0LCBsZW4pOworfQorCit9fX0gLy8gbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2VudW1lcmF0ZV9nbG9iYWxfdm9jYWIuY2MgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvZW51bWVyYXRlX2dsb2JhbF92b2NhYi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmY2M2M4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2VudW1lcmF0ZV9nbG9iYWxfdm9jYWIuY2MKQEAgLTAsMCArMSw0OCBAQAorCisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvZW51bWVyYXRlX2dsb2JhbF92b2NhYi5oaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxtIHsKKy8vY29uc3RydWN0b3IKKworICBFbnVtZXJhdGVHbG9iYWxWb2NhYjo6RW51bWVyYXRlR2xvYmFsVm9jYWIoc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludCo+ICogdm0sIGludCBubSkgeworCisgICAgdm1hcCA9IHZtOworICAgIG51bV9tb2RlbHMgPSBubTsKKyAgICBjdXJfbW9kZWwgPSAwOyAvL2JsYWgKKyAgICBjbnQgPSAwOworICAgIHN0ZDo6Y2VyciA8PCAiVm9jYWIgQnVpbGRlciB3aXRoIG1vZGVsczogIiA8PCAgbm0gPDwgc3RkOjplbmRsOworICB9CisKKyAgdm9pZCBFbnVtZXJhdGVHbG9iYWxWb2NhYjo6QWRkKFdvcmRJbmRleCBpbmRleCwgY29uc3QgU3RyaW5nUGllY2UgJnN0cikgeworCisgICAgc3RkOjpzdHJpbmcgc3QgPSBzdHIuYXNfc3RyaW5nKCk7CisKKyAgICAvL2NoZWNrIGZvciBleGlzdGVuY2Ugb2Yga2V5CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludCo+OjppdGVyYXRvciBpdHIgPSB2bWFwLT5maW5kKHN0KTsKKworICAgIC8vcHV0IHN0dWZmCisgICAgaWYoaXRyICE9IHZtYXAtPmVuZCgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlZvY2FiIGV4aXN0OiAiIDw8IHN0ciA8PCAiIE06ICIgPDwgY3VyX21vZGVsIDw8ICIgSToiIDw8IGluZGV4IDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGl0ci0+c2Vjb25kW2N1cl9tb2RlbF0gPSBpbmRleDsKKyAgICB9CisgICAgLy9uZXcga2V5CisgICAgZWxzZSB7CisKKyAgICAgIC8vY3JlYXRlIG1vZGVsIGluZGV4IG1hcCBmb3IgdGhpcyB2b2NhYiB3b3JkCisgICAgICAvL2luaXQgdG8gMCwgMCBpcyBVTksKKyAgICAgIGludCAqIGluZGljZXMgPSBuZXcgaW50W251bV9tb2RlbHNdOworICAgICAgbWVtc2V0KGluZGljZXMsIDAsIChzaXplb2YoaW50KSpudW1fbW9kZWxzKSk7IC8vdGhpcyBzdGlsbCBsZWdpdD8KKworICAgICAgaW5kaWNlc1tjdXJfbW9kZWxdID0gaW5kZXg7CisgICAgICAoKnZtYXApW3N0XSA9IGluZGljZXM7CisgICAgICBzdGQ6OmNlcnIgPDwgY250IDw8ICI6Vm9jYWIgYWRkOiAiIDw8IHN0ciA8PCAiIE06ICIgPDwgY3VyX21vZGVsIDw8ICIgSToiIDw8IGluZGV4IDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNudCsrOworICAgIH0KKworCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2VudW1lcmF0ZV9nbG9iYWxfdm9jYWIuaGggYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvZW51bWVyYXRlX2dsb2JhbF92b2NhYi5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzdkNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2VudW1lcmF0ZV9nbG9iYWxfdm9jYWIuaGgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBMTV9FTlVNRVJBVEVfR0xPQkFMX1ZPQ0FCX0gKKyNkZWZpbmUgTE1fRU5VTUVSQVRFX0dMT0JBTF9WT0NBQl9ICisKKyNpbmNsdWRlICJsbS9lbnVtZXJhdGVfdm9jYWIuaGgiCisjaW5jbHVkZSA8bWFwPgorCisvKiBVc2UgdGhpcyB0byBjcmVhdGUgYSBnbG9iYWwgdm9jYWIgYWNyb3NzIG1vZGVscyBmb3IgdXNlIHdoZW4KKyAqIGNhbGN1bGF0aW5nIGxhbWJkYXMgZm9yIGludGVycG9sYXRpb24uIE9yIG90aGVyIHN0dWZmLgorICovCituYW1lc3BhY2UgbG0geworCisgIGNsYXNzIEVudW1lcmF0ZUdsb2JhbFZvY2FiIDogRW51bWVyYXRlVm9jYWIgeworCisgIHB1YmxpYzoKKworICAgIC8veWVzLCB1Z2x5Li4uCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludCo+ICogdm1hcDsKKyAgICBpbnQgbnVtX21vZGVsczsKKyAgICBpbnQgY3VyX21vZGVsOworICAgIGludCBjbnQ7IC8vc3R1cGlkCisKKyAgICB+RW51bWVyYXRlR2xvYmFsVm9jYWIoKSB7fQorCisgICAgdm9pZCBBZGQoV29yZEluZGV4IGluZGV4LCBjb25zdCBTdHJpbmdQaWVjZSAmIHN0cik7CisKKyAgICBFbnVtZXJhdGVHbG9iYWxWb2NhYihzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50Kj4gKiwgaW50KTsKKworICAgIHZvaWQgU2V0Q3VyTW9kZWwoaW50IGkpIHsgY3VyX21vZGVsID0gaTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBFbnVtZXJhdGVHbG9iYWxWb2NhYigpIHt9CisKKyAgfTsKKworfSAvL25hbWVzcGFjZSBsbQorCisjZW5kaWYgLy8gTE1fRU5VTUVSQVRFX0dMT0JBTF9WT0NBQl9ICisKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9pbnRlcnBvbGF0ZV9pbmZvLmhoIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2ludGVycG9sYXRlX2luZm8uaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlY2Q5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9pbnRlcnBvbGF0ZV9pbmZvLmhoCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgS0VOTE1fSU5URVJQT0xBVEVfSU5URVJQT0xBVEVfSU5GT19ICisjZGVmaW5lIEtFTkxNX0lOVEVSUE9MQVRFX0lOVEVSUE9MQVRFX0lORk9fSAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgaW50ZXJwb2xhdGUgeworCisvKioKKyAqIFN0b3JlcyByZWxldmFudCBpbmZvIGZvciBpbnRlcnBvbGF0aW5nIHNldmVyYWwgbGFuZ3VhZ2UgbW9kZWxzLCBmb3IgdXNlCisgKiBkdXJpbmcgdGhlIHRocmVlLXBhc3Mgb2ZmbGluZSBsb2ctbGluZWFyIGludGVycG9sYXRpb24gYWxnb3JpdGhtLgorICovCitzdHJ1Y3QgSW50ZXJwb2xhdGVJbmZvIHsKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtb2RlbHMgYmVpbmcgaW50ZXJwb2xhdGVkCisgICAqLworICBzdGQ6OnNpemVfdCBNb2RlbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG9yZGVycy5zaXplKCk7CisgIH0KKworICAvKioKKyAgICogVGhlIGxhbWJkYSAoaW50ZXJwb2xhdGlvbiB3ZWlnaHQpIGZvciBlYWNoIG1vZGVsLgorICAgKi8KKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGxhbWJkYXM7CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG5ncmFtIG9yZGVyIGZvciBlYWNoIG1vZGVsLgorICAgKi8KKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gb3JkZXJzOworfTsKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2ludGVycG9sYXRlX21haW4uY2MgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvaW50ZXJwb2xhdGVfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTliNjJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL2ludGVycG9sYXRlX21haW4uY2MKQEAgLTAsMCArMSwzNyBAQAorI2luY2x1ZGUgImxtL2NvbW1vbi9tb2RlbF9idWZmZXIuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL3NpemVfb3B0aW9uLmhoIgorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL3BpcGVsaW5lLmhoIgorI2luY2x1ZGUgInV0aWwvZml4ZWRfYXJyYXkuaGgiCisjaW5jbHVkZSAidXRpbC91c2FnZS5oaCIKKworI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgbG06OmludGVycG9sYXRlOjpDb25maWcgY29uZmlnOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5wdXRfbW9kZWxzOworICBuYW1lc3BhY2UgcG8gPSBib29zdDo6cHJvZ3JhbV9vcHRpb25zOworICBwbzo6b3B0aW9uc19kZXNjcmlwdGlvbiBvcHRpb25zKCJMb2ctbGluZWFyIGludGVycG9sYXRpb24gb3B0aW9ucyIpOworICBvcHRpb25zLmFkZF9vcHRpb25zKCkKKyAgICAoImxhbWJkYSx3IiwgcG86OnZhbHVlPHN0ZDo6dmVjdG9yPGZsb2F0PiA+KCZjb25maWcubGFtYmRhcyktPm11bHRpdG9rZW4oKS0+cmVxdWlyZWQoKSwgIkludGVycG9sYXRpb24gd2VpZ2h0cyIpCisgICAgKCJtb2RlbCxtIiwgcG86OnZhbHVlPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+KCZpbnB1dF9tb2RlbHMpLT5tdWx0aXRva2VuKCktPnJlcXVpcmVkKCksICJNb2RlbHMgdG8gaW50ZXJwb2xhdGUiKQorICAgICgidGVtcF9wcmVmaXgsVCIsIHBvOjp2YWx1ZTxzdGQ6OnN0cmluZz4oJmNvbmZpZy5zb3J0LnRlbXBfcHJlZml4KS0+ZGVmYXVsdF92YWx1ZSgiL3RtcC9sbSIpLCAiVGVtcG9yYXJ5IGZpbGUgcHJlZml4IikKKyAgICAoIm1lbW9yeSxTIiwgbG06OlNpemVPcHRpb24oY29uZmlnLnNvcnQudG90YWxfbWVtb3J5LCB1dGlsOjpHdWVzc1BoeXNpY2FsTWVtb3J5KCkgPyAiNTAlIiA6ICIxRyIpLCAiU29ydGluZyBtZW1vcnkiKQorICAgICgic29ydF9ibG9jayIsIGxtOjpTaXplT3B0aW9uKGNvbmZpZy5zb3J0LmJ1ZmZlcl9zaXplLCAiNjRNIiksICJCbG9jayBzaXplIik7CisgIHBvOjp2YXJpYWJsZXNfbWFwIHZtOworICBwbzo6c3RvcmUocG86OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBvcHRpb25zKSwgdm0pOworICBwbzo6bm90aWZ5KHZtKTsKKworICBpZiAoY29uZmlnLmxhbWJkYXMuc2l6ZSgpICE9IGlucHV0X21vZGVscy5zaXplKCkpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIk51bWJlciBvZiBtb2RlbHMgIiA8PCBpbnB1dF9tb2RlbHMuc2l6ZSgpIDw8ICIgc2hvdWxkIG1hdGNoIHRoZSBudW1iZXIgb2Ygd2VpZ2h0cyIgPDwgY29uZmlnLmxhbWJkYXMuc2l6ZSgpIDw8ICIuIiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB1dGlsOjpGaXhlZEFycmF5PGxtOjpNb2RlbEJ1ZmZlcj4gbW9kZWxzKGlucHV0X21vZGVscy5zaXplKCkpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgaW5wdXRfbW9kZWxzLnNpemUoKTsgKytpKSB7CisgICAgbW9kZWxzLnB1c2hfYmFjayhpbnB1dF9tb2RlbHNbaV0pOworICB9CisgIGxtOjppbnRlcnBvbGF0ZTo6UGlwZWxpbmUobW9kZWxzLCBjb25maWcsIDEpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL21lcmdlX3Byb2JhYmlsaXRpZXMuY2MgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvbWVyZ2VfcHJvYmFiaWxpdGllcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmM5NDlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL21lcmdlX3Byb2JhYmlsaXRpZXMuY2MKQEAgLTAsMCArMSwyODUgQEAKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS9tZXJnZV9wcm9iYWJpbGl0aWVzLmhoIgorI2luY2x1ZGUgImxtL2NvbW1vbi9uZ3JhbV9zdHJlYW0uaGgiCisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvYm91bmRlZF9zZXF1ZW5jZV9lbmNvZGluZy5oaCIKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS9pbnRlcnBvbGF0ZV9pbmZvLmhoIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxudW1lcmljPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIGludGVycG9sYXRlIHsKKworLyoqCisgKiBIZWxwZXIgdG8gZ2VuZXJhdGUgdGhlIEJvdW5kZWRTZXF1ZW5jZUVuY29kaW5nIHVzZWQgZm9yIHdyaXRpbmcgdGhlCisgKiBmcm9tIHZhbHVlcy4KKyAqLworQm91bmRlZFNlcXVlbmNlRW5jb2RpbmcgTWFrZUVuY29kZXIoY29uc3QgSW50ZXJwb2xhdGVJbmZvICZpbmZvLCB1aW50OF90IG9yZGVyKSB7CisgIHV0aWw6OkZpeGVkQXJyYXk8dWludDhfdD4gbWF4X29yZGVycyhpbmZvLm9yZGVycy5zaXplKCkpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgaW5mby5vcmRlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICBtYXhfb3JkZXJzLnB1c2hfYmFjayhzdGQ6Om1pbihvcmRlciwgaW5mby5vcmRlcnNbaV0pKTsKKyAgfQorICByZXR1cm4gQm91bmRlZFNlcXVlbmNlRW5jb2RpbmcobWF4X29yZGVycy5iZWdpbigpLCBtYXhfb3JkZXJzLmVuZCgpKTsKK30KKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBBIHNpbXBsZSB3cmFwcGVyIGNsYXNzIHRoYXQgaG9sZHMgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHJlYWQgYW5kIHdyaXRlCisgKiB0aGUgbmdyYW1zIG9mIGEgcGFydGljdWxhciBvcmRlci4gVGhpcyBjbGFzcyBoYXMgdGhlIG1lbW9yeSBuZWVkZWQgdG8KKyAqIGJ1ZmZlciB0aGUgZGF0YSBuZWVkZWQgZm9yIHRoZSByZWN1cnNpdmUgcHJvY2VzcyBvZiBjb21wdXRpbmcgdGhlCisgKiBwcm9iYWJpbGl0aWVzIGFuZCAiZnJvbSIgdmFsdWVzIGZvciBlYWNoIGNvbXBvbmVudCBtb2RlbC4KKyAqCisgKiAiRnJvbSIgdmFsdWVzIGluZGljYXRlLCBmb3IgZWFjaCBtb2RlbCwgd2hhdCBvcmRlciAoYXMgYW4gaW5kZXgsIHNvIC0xKQorICogd2FzIGJhY2tlZCBvZmYgdG8gaW4gb3JkZXIgdG8gYXJyaXZlIGF0IGEgcHJvYmFiaWxpdHkuIEZvciBleGFtcGxlLCBpZiBhCisgKiA1LWdyYW0gbW9kZWwgKG9yZGVyIGluZGV4IDQpIGJhY2tlZCBvZmYgdHdpY2UsIHdlIHdvdWxkIHdyaXRlIGEgMi4KKyAqLworY2xhc3MgTkdyYW1IYW5kbGVyIHsKK3B1YmxpYzoKKyAgTkdyYW1IYW5kbGVyKHVpbnQ4X3Qgb3JkZXIsIGNvbnN0IEludGVycG9sYXRlSW5mbyAmaWZvLAorICAgICAgICAgICAgICAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zPiAmbW9kZWxzX2J5X29yZGVyKQorICAgICAgOiBpbmZvKGlmbyksCisgICAgICAgIGVuY29kZXIoTWFrZUVuY29kZXIoaW5mbywgb3JkZXIpKSwKKyAgICAgICAgb3V0X3JlY29yZChvcmRlciwgZW5jb2Rlci5FbmNvZGVkTGVuZ3RoKCkpIHsKKyAgICBzdGQ6OnNpemVfdCBjb3VudF9oYXNfb3JkZXIgPSAwOworICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtb2RlbHNfYnlfb3JkZXIuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGNvdW50X2hhc19vcmRlciArPSAobW9kZWxzX2J5X29yZGVyW2ldLnNpemUoKSA+PSBvcmRlcik7CisgICAgfQorICAgIGlucHV0c18uSW5pdChjb3VudF9oYXNfb3JkZXIpOworICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtb2RlbHNfYnlfb3JkZXIuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChtb2RlbHNfYnlfb3JkZXJbaV0uc2l6ZSgpIDwgb3JkZXIpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaW5wdXRzXy5wdXNoX2JhY2sobW9kZWxzX2J5X29yZGVyW2ldW29yZGVyIC0gMV0pOworICAgICAgaWYgKGlucHV0c18uYmFjaygpKSB7CisgICAgICAgIGFjdGl2ZV8ucmVzaXplKGFjdGl2ZV8uc2l6ZSgpICsgMSk7CisgICAgICAgIGFjdGl2ZV8uYmFjaygpLm1vZGVsID0gaTsKKyAgICAgICAgYWN0aXZlXy5iYWNrKCkuc3RyZWFtID0gJmlucHV0c18uYmFjaygpOworICAgICAgfQorICAgIH0KKworICAgIC8vIGhhdmUgdG8gaW5pdCBvdXRzaWRlIHNpbmNlIE5HcmFtU3RyZWFtcyBkb2Vzbid0IGZvcndhcmQgdG8KKyAgICAvLyBHZW5lcmljU3RyZWFtcyBjdG9yIGdpdmVuIGEgQ2hhaW5Qb3NpdGlvbnMKKworICAgIHByb2JzLkluaXQoaW5mby5Nb2RlbHMoKSk7CisgICAgZnJvbS5Jbml0KGluZm8uTW9kZWxzKCkpOworICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBpbmZvLk1vZGVscygpOyArK2kpIHsKKyAgICAgIHByb2JzLnB1c2hfYmFjaygwLjApOworICAgICAgZnJvbS5wdXNoX2JhY2soMCk7CisgICAgfQorICB9CisKKyAgc3RydWN0IFN0cmVhbUluZGV4IHsKKyAgICBOR3JhbVN0cmVhbTxQcm9iQmFja29mZj4gKnN0cmVhbTsKKyAgICBOR3JhbVN0cmVhbTxQcm9iQmFja29mZj4gJlN0cmVhbSgpIHsgcmV0dXJuICpzdHJlYW07IH0KKyAgICBzdGQ6OnNpemVfdCBtb2RlbDsKKyAgfTsKKworICBzdGQ6OnNpemVfdCBBY3RpdmVTaXplKCkgY29uc3QgeworICAgIHJldHVybiBhY3RpdmVfLnNpemUoKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBzdHJlYW0gZm9yIGEgcGFydGljdWxhciBtb2RlbCB0aGF0IGNvcnJlc3BvbmRzIHRvCisgICAqIHRoaXMgbmdyYW0gb3JkZXIKKyAgICovCisgIFN0cmVhbUluZGV4ICZvcGVyYXRvcltdKHN0ZDo6c2l6ZV90IGlkeCkgeworICAgIHJldHVybiBhY3RpdmVfW2lkeF07CisgIH0KKworICB2b2lkIGVyYXNlKHN0ZDo6c2l6ZV90IGlkeCkgeworICAgIGFjdGl2ZV8uZXJhc2UoYWN0aXZlXy5iZWdpbigpICsgaWR4KTsKKyAgfQorCisgIGNvbnN0IEludGVycG9sYXRlSW5mbyAmaW5mbzsKKyAgQm91bmRlZFNlcXVlbmNlRW5jb2RpbmcgZW5jb2RlcjsKKyAgUGFydGlhbFByb2JHYW1tYSBvdXRfcmVjb3JkOworICB1dGlsOjpGaXhlZEFycmF5PGZsb2F0PiBwcm9iczsKKyAgdXRpbDo6Rml4ZWRBcnJheTx1aW50OF90PiBmcm9tOworCitwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxTdHJlYW1JbmRleD4gYWN0aXZlXzsKKyAgTkdyYW1TdHJlYW1zPFByb2JCYWNrb2ZmPiBpbnB1dHNfOworfTsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2YgTkdyYW1IYW5kbGVycy4KKyAqLworY2xhc3MgTkdyYW1IYW5kbGVycyA6IHB1YmxpYyB1dGlsOjpGaXhlZEFycmF5PE5HcmFtSGFuZGxlcj4geworcHVibGljOgorICBleHBsaWNpdCBOR3JhbUhhbmRsZXJzKHN0ZDo6c2l6ZV90IG51bSkKKyAgICAgIDogdXRpbDo6Rml4ZWRBcnJheTxOR3JhbUhhbmRsZXI+KG51bSkgeworICB9CisKKyAgdm9pZCBwdXNoX2JhY2soCisgICAgICBzdGQ6OnNpemVfdCBvcmRlciwgY29uc3QgSW50ZXJwb2xhdGVJbmZvICZpbmZvLAorICAgICAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zPiAmbW9kZWxzX2J5X29yZGVyKSB7CisgICAgbmV3IChlbmQoKSkgTkdyYW1IYW5kbGVyKG9yZGVyLCBpbmZvLCBtb2RlbHNfYnlfb3JkZXIpOworICAgIENvbnN0cnVjdGVkKCk7CisgIH0KK307CisKKy8qKgorICogVGhlIHJlY3Vyc2l2ZSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyBwcm9iYWJpbGl0eSBhbmQgImZyb20iCisgKiB2YWx1ZXMgZm9yIGFsbCBuZ3JhbXMgbWF0Y2hpbmcgYSBwYXJ0aWN1bGFyIHN1ZmZpeC4KKyAqCisgKiBUaGUgY3VycmVudCBvcmRlciBjYW4gYmUgY29tcHV0ZWQgYXMgdGhlIHN1ZmZpeCBsZW5ndGggKyAxLiBOb3RlIHRoYXQKKyAqIHRoZSBzdWZmaXggY291bGQgYmUgZW1wdHkgKHN1ZmZpeF9iZWdpbiA9PSBzdWZmaXhfZW5kID09IE5VTEwpLCBpbiB3aGljaAorICogY2FzZSB3ZSBhcmUgaGFuZGxpbmcgdW5pZ3JhbXMgd2l0aCB0aGUgVU5LIHRva2VuIGFzIHRoZSBmYWxsYmFjaworICogcHJvYmFiaWxpdHkuCisgKgorICogQHBhcmFtIGhhbmRsZXJzIFRoZSBmdWxsIGNvbGxlY3Rpb24gb2YgaGFuZGxlcnMKKyAqIEBwYXJhbSBzdWZmaXhfYmVnaW4gQSBzdGFydCBpdGVyYXRvciBmb3IgdGhlIHN1ZmZpeAorICogQHBhcmFtIHN1ZmZpeF9lbmQgQW4gZW5kIGl0ZXJhdG9yIGZvciB0aGUgc3VmZml4CisgKiBAcGFyYW0gZmFsbGJhY2tfcHJvYnMgVGhlIHByb2JhYmlsaXRpZXMgb2YgdGhpcyBuZ3JhbSBpZiB3ZSBuZWVkIHRvCisgKiAgYmFjayBvZmYgKHRoYXQgaXMsIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgc3VmZml4KQorICogQHBhcmFtIGZhbGxiYWNrX2Zyb20gVGhlIG9yZGVyIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgZmFsbGJhY2sKKyAqICBwcm9iYWJpbGl0eSBpbiB0aGUgZmFsbGJhY2tfcHJvYnMgaXMgZnJvbQorICogQHBhcmFtIGNvbWJpbmVkX2ZhbGxiYWNrIGludGVycG9sYXRlZCBmYWxsYmFja19wcm9icworICogQHBhcmFtIG91dHB1dHMgVGhlIG91dHB1dCBzdHJlYW1zLCBvbmUgZm9yIGVhY2ggb3JkZXIKKyAqLwordm9pZCBIYW5kbGVTdWZmaXgoTkdyYW1IYW5kbGVycyAmaGFuZGxlcnMsIFdvcmRJbmRleCAqc3VmZml4X2JlZ2luLAorICAgICAgICAgICAgICAgICAgV29yZEluZGV4ICpzdWZmaXhfZW5kLAorICAgICAgICAgICAgICAgICAgY29uc3QgdXRpbDo6Rml4ZWRBcnJheTxmbG9hdD4gJmZhbGxiYWNrX3Byb2JzLAorICAgICAgICAgICAgICAgICAgY29uc3QgdXRpbDo6Rml4ZWRBcnJheTx1aW50OF90PiAmZmFsbGJhY2tfZnJvbSwKKyAgICAgICAgICAgICAgICAgIGZsb2F0IGNvbWJpbmVkX2ZhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgdXRpbDo6c3RyZWFtOjpTdHJlYW1zICZvdXRwdXRzKSB7CisgIHVpbnQ4X3Qgb3JkZXIgPSBzdGQ6OmRpc3RhbmNlKHN1ZmZpeF9iZWdpbiwgc3VmZml4X2VuZCkgKyAxOworICBpZiAob3JkZXIgPiBvdXRwdXRzLnNpemUoKSkgcmV0dXJuOworCisgIHV0aWw6OnN0cmVhbTo6U3RyZWFtICZvdXRwdXQgPSBvdXRwdXRzW29yZGVyIC0gMV07CisgIE5HcmFtSGFuZGxlciAmaGFuZGxlciA9IGhhbmRsZXJzW29yZGVyIC0gMV07CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICAvLyBmaW5kIHRoZSBuZXh0IHNtYWxsZXN0IG5ncmFtIHdoaWNoIG1hdGNoZXMgb3VyIHN1ZmZpeAorICAgIC8vIFRPRE86IHByaW9yaXR5IHF1ZXVlIGRyaXZlbi4KKyAgICBXb3JkSW5kZXggKm1pbmltdW0gPSBOVUxMOworICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBoYW5kbGVyLkFjdGl2ZVNpemUoKTsgKytpKSB7CisgICAgICBpZiAoIXN0ZDo6ZXF1YWwoc3VmZml4X2JlZ2luLCBzdWZmaXhfZW5kLCBoYW5kbGVyW2ldLlN0cmVhbSgpLT5iZWdpbigpICsgMSkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBpZiB3ZSBlaXRoZXIgaGF2ZW4ndCBzZXQgYSBtaW5pbXVtIHlldCBvciB0aGlzIG9uZSBpcyBzbWFsbGVyIHRoYW4KKyAgICAgIC8vIHRoZSBtaW5pbXVtIHdlIGZvdW5kIGJlZm9yZSwgcmVwbGFjZSBpdAorICAgICAgV29yZEluZGV4ICpsYXN0ID0gaGFuZGxlcltpXS5TdHJlYW0oKS0+YmVnaW4oKTsKKyAgICAgIGlmICghbWluaW11bSB8fCAqbGFzdCA8ICptaW5pbXVtKSB7IG1pbmltdW0gPSBoYW5kbGVyW2ldLlN0cmVhbSgpLT5iZWdpbigpOyB9CisgICAgfQorCisgICAgLy8gbm8gbW9yZSBuZ3JhbXMgb2YgdGhpcyBvcmRlciBtYXRjaCBvdXIgc3VmZml4LCBzbyB3ZSdyZSBkb25lCisgICAgaWYgKCFtaW5pbXVtKSByZXR1cm47CisKKyAgICBoYW5kbGVyLm91dF9yZWNvcmQuUmVCYXNlKG91dHB1dC5HZXQoKSk7CisgICAgc3RkOjpjb3B5KG1pbmltdW0sIG1pbmltdW0gKyBvcmRlciwgaGFuZGxlci5vdXRfcmVjb3JkLmJlZ2luKCkpOworCisgICAgLy8gRGVmYXVsdCBjYXNlIGlzIGhhdmluZyBiYWNrZWQgb2ZmLgorICAgIHN0ZDo6Y29weShmYWxsYmFja19wcm9icy5iZWdpbigpLCBmYWxsYmFja19wcm9icy5lbmQoKSwgaGFuZGxlci5wcm9icy5iZWdpbigpKTsKKyAgICBzdGQ6OmNvcHkoZmFsbGJhY2tfZnJvbS5iZWdpbigpLCBmYWxsYmFja19mcm9tLmVuZCgpLCBoYW5kbGVyLmZyb20uYmVnaW4oKSk7CisKKyAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgaGFuZGxlci5BY3RpdmVTaXplKCk7KSB7CisgICAgICBpZiAoc3RkOjplcXVhbChoYW5kbGVyLm91dF9yZWNvcmQuYmVnaW4oKSwgaGFuZGxlci5vdXRfcmVjb3JkLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcltpXS5TdHJlYW0oKS0+YmVnaW4oKSkpIHsKKyAgICAgICAgaGFuZGxlci5wcm9ic1toYW5kbGVyW2ldLm1vZGVsXSA9IGhhbmRsZXIuaW5mby5sYW1iZGFzW2hhbmRsZXJbaV0ubW9kZWxdICogaGFuZGxlcltpXS5TdHJlYW0oKS0+VmFsdWUoKS5wcm9iOworICAgICAgICBoYW5kbGVyLmZyb21baGFuZGxlcltpXS5tb2RlbF0gPSBvcmRlciAtIDE7CisgICAgICAgIGlmICgrK2hhbmRsZXJbaV0uU3RyZWFtKCkpIHsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaGFuZGxlci5lcmFzZShpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgKytpOworICAgICAgfQorICAgIH0KKyAgICBoYW5kbGVyLm91dF9yZWNvcmQuUHJvYigpID0gc3RkOjphY2N1bXVsYXRlKGhhbmRsZXIucHJvYnMuYmVnaW4oKSwgaGFuZGxlci5wcm9icy5lbmQoKSwgMC4wKTsKKyAgICBoYW5kbGVyLm91dF9yZWNvcmQuTG93ZXJQcm9iKCkgPSBjb21iaW5lZF9mYWxsYmFjazsKKyAgICBoYW5kbGVyLmVuY29kZXIuRW5jb2RlKGhhbmRsZXIuZnJvbS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5vdXRfcmVjb3JkLkZyb21CZWdpbigpKTsKKworICAgIC8vIHdlJ3ZlIGhhbmRsZWQgdGhpcyBwYXJ0aWN1bGFyIG5ncmFtLCBzbyBub3cgcmVjdXJzZSB0byB0aGUgaGlnaGVyCisgICAgLy8gb3JkZXIgdXNpbmcgdGhlIGN1cnJlbnQgbmdyYW0gYXMgdGhlIHN1ZmZpeAorICAgIEhhbmRsZVN1ZmZpeChoYW5kbGVycywgaGFuZGxlci5vdXRfcmVjb3JkLmJlZ2luKCksIGhhbmRsZXIub3V0X3JlY29yZC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgaGFuZGxlci5wcm9icywgaGFuZGxlci5mcm9tLCBoYW5kbGVyLm91dF9yZWNvcmQuUHJvYigpLCBvdXRwdXRzKTsKKyAgICAvLyBjb25zdW1lIHRoZSBvdXRwdXQKKyAgICArK291dHB1dDsKKyAgfQorfQorCisvKioKKyAqIEtpY2tzIG9mZiB0aGUgcmVjdXJzaW9uIGZvciBjb21wdXRpbmcgdGhlIHByb2JhYmlsaXRpZXMgYW5kICJmcm9tIgorICogdmFsdWVzIGZvciBlYWNoIG5ncmFtIG9yZGVyLiBXZSBiZWdpbiBieSBoYW5kbGluZyB0aGUgVU5LIHRva2VuIHRoYXQKKyAqIHNob3VsZCBiZSBhdCB0aGUgZnJvbnQgb2YgZWFjaCBvZiB0aGUgdW5pZ3JhbSBpbnB1dCBzdHJlYW1zLiBUaGlzIGlzCisgKiB0aGVuIG91dHB1dCB0byB0aGUgc3RyZWFtIGFuZCBpdCBpcyB1c2VkIGFzIHRoZSBmYWxsYmFjayBmb3IgaGFuZGxpbmcKKyAqIG91ciB1bmlncmFtIGNhc2UsIHRoZSB1bmlncmFtIHVzZWQgYXMgdGhlIGZhbGxiYWNrIGZvciB0aGUgYmlncmFtIGNhc2UsCisgKiBldGMuCisgKi8KK3ZvaWQgSGFuZGxlTkdyYW1zKE5HcmFtSGFuZGxlcnMgJmhhbmRsZXJzLCB1dGlsOjpzdHJlYW06OlN0cmVhbXMgJm91dHB1dHMpIHsKKyAgUGFydGlhbFByb2JHYW1tYSB1bmtfcmVjb3JkKDEsIDApOworICAvLyBGaXJzdDogcG9wdWxhdGUgdGhlIHVuayBwcm9iYWJpbGl0aWVzIGJ5IHJlYWRpbmcgdGhlIGZpcnN0IHVuaWdyYW0KKyAgLy8gZnJvbSBlYWNoIHN0cmVhbQorICB1dGlsOjpGaXhlZEFycmF5PGZsb2F0PiB1bmtfcHJvYnMoaGFuZGxlcnNbMF0uaW5mby5Nb2RlbHMoKSk7CisKKyAgLy8gc3RhcnQgYnkgcG9wdWxhdGluZyB0aGUgbmdyYW0gaWQgZnJvbSB0aGUgZmlyc3Qgc3RyZWFtCisgIGxtOjpOR3JhbTxQcm9iQmFja29mZj4gbmdyYW0gPSAqaGFuZGxlcnNbMF1bMF0uU3RyZWFtKCk7CisgIHVua19yZWNvcmQuUmVCYXNlKG91dHB1dHNbMF0uR2V0KCkpOworICBzdGQ6OmNvcHkobmdyYW0uYmVnaW4oKSwgbmdyYW0uZW5kKCksIHVua19yZWNvcmQuYmVnaW4oKSk7CisgIHVua19yZWNvcmQuUHJvYigpID0gMDsKKworICAvLyB0aGVuIHBvcHVsYXRlIHRoZSBwcm9iYWJpbGl0aWVzIGludG8gdW5rX3Byb2JzIHdoaWxlICJtdWx0aXBseSIgdGhlCisgIC8vIG1vZGVsIHByb2JhYmlsaXRpZXMgdG9nZXRoZXIgaW50byB0aGUgdW5rIHJlY29yZAorICAvLworICAvLyBub3RlIHRoYXQgZnJvbSBkb2Vzbid0IG5lZWQgdG8gYmUgc2V0IGZvciB1bmlncmFtcworICBhc3NlcnQoaGFuZGxlcnNbMF0uQWN0aXZlU2l6ZSgpID09IGhhbmRsZXJzWzBdLmluZm8uTW9kZWxzKCkpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgaGFuZGxlcnNbMF0uaW5mby5Nb2RlbHMoKTspIHsKKyAgICBuZ3JhbSA9ICpoYW5kbGVyc1swXVtpXS5TdHJlYW0oKTsKKyAgICB1bmtfcHJvYnMucHVzaF9iYWNrKGhhbmRsZXJzWzBdLmluZm8ubGFtYmRhc1tpXSAqIG5ncmFtLlZhbHVlKCkucHJvYik7CisgICAgdW5rX3JlY29yZC5Qcm9iKCkgKz0gdW5rX3Byb2JzW2ldOworICAgIGFzc2VydCgqbmdyYW0uYmVnaW4oKSA9PSBrVU5LKTsKKyAgICBpZiAoKytoYW5kbGVyc1swXVtpXS5TdHJlYW0oKSkgeworICAgICAgKytpOworICAgIH0gZWxzZSB7CisgICAgICBoYW5kbGVyc1swXS5lcmFzZShpKTsKKyAgICB9CisgIH0KKyAgZmxvYXQgdW5rX2NvbWJpbmVkID0gdW5rX3JlY29yZC5Qcm9iKCk7CisgIHVua19yZWNvcmQuTG93ZXJQcm9iKCkgPSB1bmtfY29tYmluZWQ7CisgIC8vIGZsdXNoIHRoZSB1bmsgb3V0cHV0IHJlY29yZAorICArK291dHB1dHNbMF07CisKKyAgLy8gVGhlbiwgYmVnaW4gb3V0cHV0dGluZyBldmVyeXRoaW5nIGluIGxleGljb2dyYXBoaWMgb3JkZXI6IGZpcnN0IHdlJ2xsCisgIC8vIGdldCB0aGUgdW5pZ3JhbSB0aGVuIHRoZSBmaXJzdCBiaWdyYW0gd2l0aCB0aGF0IGNvbnRleHQsIHRoZW4gdGhlCisgIC8vIGZpcnN0IHRyaWdyYW0gd2l0aCB0aGF0IGJpZ3JhbSBjb250ZXh0LCBldGMuLCB1bnRpbCB3ZSBleGhhdXN0IGFsbCBvZgorICAvLyB0aGUgbmdyYW1zLCB0aGVuIGFsbCBvZiB0aGUgKG4tMSlncmFtcywgZXRjLgorICAvLworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHRoZSAicm9vdCIgb2YgdGhpcyByZWN1cnNpdmUgcHJvY2Vzcy4KKyAgdXRpbDo6Rml4ZWRBcnJheTx1aW50OF90PiB1bmtfZnJvbShoYW5kbGVyc1swXS5pbmZvLk1vZGVscygpKTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGhhbmRsZXJzWzBdLmluZm8uTW9kZWxzKCk7ICsraSkgeworICAgIHVua19mcm9tLnB1c2hfYmFjaygwKTsKKyAgfQorCisgIC8vIHRoZSB0d28gbnVsbHMgYXJlIHRvIGVuY29kZSB0aGF0IG91ciAiZmFsbGJhY2siIHdvcmQgaXMgdGhlICIwLWdyYW0iCisgIC8vIGNhc2UsIGUuZy4gd2UgImJhY2tlZCBvZmYiIHRvIFVOSworICAvLyBUT0RPOiBzdG9wIGdlbmVyYXRpbmcgdm9jYWIgaWRzIGFuZCBMb3dlclByb2IgZm9yIHVuaWdyYW1zLgorICBIYW5kbGVTdWZmaXgoaGFuZGxlcnMsIE5VTEwsIE5VTEwsIHVua19wcm9icywgdW5rX2Zyb20sIHVua19jb21iaW5lZCwgb3V0cHV0cyk7CisKKyAgLy8gVmVyaWZ5IHdlIHJlYWNoZWQgdGhlIGVuZC4gIEFuZCBwb2lzb24hCisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBoYW5kbGVycy5zaXplKCk7ICsraSkgeworICAgIFVUSUxfVEhST1dfSUYyKGhhbmRsZXJzW2ldLkFjdGl2ZVNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICJNZXJnZVByb2JhYmlsaXRpZXMgZGlkIG5vdCBleGhhdXN0IGFsbCBuZ3JhbSBzdHJlYW1zIik7CisgICAgb3V0cHV0c1tpXS5Qb2lzb24oKTsKKyAgfQorfQorfQorCit2b2lkIE1lcmdlUHJvYmFiaWxpdGllcygKKyAgICBjb25zdCBJbnRlcnBvbGF0ZUluZm8gJmluZm8sCisgICAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zPiAmbW9kZWxzX2J5X29yZGVyLAorICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZvdXRwdXRfY2hhaW5zKSB7CisgIE5HcmFtSGFuZGxlcnMgaGFuZGxlcnMob3V0cHV0X2NoYWlucy5zaXplKCkpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0X2NoYWlucy5zaXplKCk7ICsraSkgeworICAgIGhhbmRsZXJzLnB1c2hfYmFjayhpICsgMSwgaW5mbywgbW9kZWxzX2J5X29yZGVyKTsKKyAgfQorCisgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgb3V0cHV0X3BvcyhvdXRwdXRfY2hhaW5zKTsKKyAgdXRpbDo6c3RyZWFtOjpTdHJlYW1zIG91dHB1dHMob3V0cHV0X3Bvcyk7CisKKyAgSGFuZGxlTkdyYW1zKGhhbmRsZXJzLCBvdXRwdXRzKTsKK30KK30KK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV9wcm9iYWJpbGl0aWVzLmhoIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL21lcmdlX3Byb2JhYmlsaXRpZXMuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliODA0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV9wcm9iYWJpbGl0aWVzLmhoCkBAIC0wLDAgKzEsODkgQEAKKyNpZm5kZWYgTE1fSU5URVJQT0xBVEVfTUVSR0VfUFJPQkFCSUxJVElFU19ICisjZGVmaW5lIExNX0lOVEVSUE9MQVRFX01FUkdFX1BST0JBQklMSVRJRVNfSAorCisjaW5jbHVkZSAibG0vY29tbW9uL25ncmFtLmhoIgorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL2JvdW5kZWRfc2VxdWVuY2VfZW5jb2RpbmcuaGgiCisjaW5jbHVkZSAidXRpbC9maXhlZF9hcnJheS5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9tdWx0aV9zdHJlYW0uaGgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBpbnRlcnBvbGF0ZSB7CisKK3N0cnVjdCBJbnRlcnBvbGF0ZUluZm87CisKKy8qKgorICogTWFrZSB0aGUgZW5jb2Rpbmcgb2YgYmFja29mZiB2YWx1ZXMgZm9yIGEgZ2l2ZW4gb3JkZXIuICBUaGlzIHN0b3JlcyB2YWx1ZXMKKyAqIGluIFtQYXJ0aWFsUHJvYkdhbW1hOjpGcm9tQmVnaW4oKSwgUGFydGlhbFByb2JHYW1tYTo6RnJvbUVuZCgpKQorICovCitCb3VuZGVkU2VxdWVuY2VFbmNvZGluZyBNYWtlRW5jb2Rlcihjb25zdCBJbnRlcnBvbGF0ZUluZm8gJmluZm8sIHVpbnQ4X3Qgb3JkZXIpOworCisvKioKKyAqIFRoZSBmaXJzdCBwYXNzIGZvciB0aGUgb2ZmbGluZSBsb2ctbGluZWFyIGludGVycG9sYXRpb24gYWxnb3JpdGhtLiBUaGlzCisgKiByZWFkcyBLICoqc3VmZml4LW9yZGVyZWQqKiBzdHJlYW1zIGZvciBlYWNoIG1vZGVsLCBmb3IgZWFjaCBvcmRlciwgb2YKKyAqIG5ncmFtIHJlY29yZHMgKG5ncmFtLWlkLCBwcm9iLCBiYWNrb2ZmKS4gSXQgZnVydGhlciBhc3N1bWVzIHRoYXQgdGhlCisgKiBuZ3JhbS1pZHMgaGF2ZSBiZWVuIHVuaWZpZWQgb3ZlciBhbGwgb2YgdGhlIHN0cmVhbSBpbnB1dHMuCisgKgorICogSXRzIG91dHB1dCBpcyByZWNvcmRzIG9mIChuZ3JhbS1pZCwgcHJvYi1wcm9kLCBiYWNrb2ZmLWxldmVsLAorICogYmFja29mZi1sZXZlbCwgLi4uKSB3aGVyZSB0aGUgYmFja29mZi1sZXZlbHMgKG9mIHdoaWNoIHRoZXJlIGFyZSBLKSBhcmUKKyAqIHRoZSBjb250ZXh0IGxlbmd0aCAoMCBmb3IgdW5pZ3JhbXMpIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbW9kZWwgaGFkIHRvCisgKiBiYWNrIG9mZiB0byBpbiBvcmRlciB0byBvYnRhaW4gYSBwcm9iYWJpbGl0eSBmb3IgdGhhdCBuZ3JhbS1pZC4gRWFjaCBvZgorICogdGhlc2Ugc3RyZWFtcyBpcyB0ZXJtaW5hdGVkIHdpdGggYSByZWNvcmQgd2hvc2UgbmdyYW0taWQgaXMgYWxsCisgKiBtYXhpbXVtLWludGVnZXJzIGZvciBzaW1wbGljaXR5IGluIGltcGxlbWVudGF0aW9uIGhlcmUuCisgKgorICogQHBhcmFtIG1vZGVscyBBbiBhcnJheSBvZiBsZW5ndGggTiAobWF4X2kgTl9pKSBjb250YWluaW5nIGF0CisgKiAgdGhlIENoYWluUG9zaXRpb25zIGZvciB0aGUgc3RyZWFtcyBmb3Igb3JkZXIgKGkgKyAxKS4KKyAqIEBwYXJhbSBvdXRwdXRfY2hhaW5zIFRoZSBvdXRwdXQgY2hhaW5zIGZvciBlYWNoIG9yZGVyIChvZiBsZW5ndGggSykKKyAqLwordm9pZCBNZXJnZVByb2JhYmlsaXRpZXMoCisgICAgY29uc3QgSW50ZXJwb2xhdGVJbmZvICZpbmZvLAorICAgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucz4gJm1vZGVsc19ieV9vcmRlciwKKyAgICB1dGlsOjpzdHJlYW06OkNoYWlucyAmb3V0cHV0X2NoYWlucyk7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvdXRwdXQgcGF5bG9hZCBmb3IgdGhpcyBwYXNzLCB3aGljaCBjb25zaXN0cworICogb2YgYW4gbmdyYW0taWQsIGEgcHJvYmFiaWxpdHksIGFuZCB0aGVuIGEgdmVjdG9yIG9mIG9yZGVycyBmcm9tIHdoaWNoCisgKiBlYWNoIG9mIHRoZSBjb21wb25lbnQgbW9kZWxzIGJhY2tlZCBvZmYgdG8gZm9yIHRoaXMgbmdyYW0sIGVuY29kZWQKKyAqIHVzaW5nIHRoZSBCb3VuZGVkU2VxdWVuY2VFbmNvZGluZyBjbGFzcy4KKyAqLworY2xhc3MgUGFydGlhbFByb2JHYW1tYSA6IHB1YmxpYyBsbTo6TkdyYW1IZWFkZXIgeworcHVibGljOgorICBQYXJ0aWFsUHJvYkdhbW1hKHN0ZDo6c2l6ZV90IG9yZGVyLCBzdGQ6OnNpemVfdCBiYWNrb2ZmX2J5dGVzKQorICAgICAgOiBsbTo6TkdyYW1IZWFkZXIoTlVMTCwgb3JkZXIpLCBiYWNrb2ZmX2J5dGVzXyhiYWNrb2ZmX2J5dGVzKSB7CisgICAgLy8gbm90aGluZworICB9CisKKyAgc3RkOjpzaXplX3QgVG90YWxTaXplKCkgY29uc3QgeworICAgIHJldHVybiBzaXplb2YoV29yZEluZGV4KSAqIE9yZGVyKCkgKyBzaXplb2YoQWZ0ZXIpICsgYmFja29mZl9ieXRlc187CisgIH0KKworICAvLyBUT0RPOiBjYWNoZSBib3VuZGVkIHNlcXVlbmNlIGVuY29kaW5nIGluIHRoZSBwaXBlbGluZT8KKyAgc3RhdGljIHN0ZDo6c2l6ZV90IFRvdGFsU2l6ZShjb25zdCBJbnRlcnBvbGF0ZUluZm8gJmluZm8sIHVpbnQ4X3Qgb3JkZXIpIHsKKyAgICByZXR1cm4gc2l6ZW9mKFdvcmRJbmRleCkgKiBvcmRlciArIHNpemVvZihBZnRlcikgKyBNYWtlRW5jb2RlcihpbmZvLCBvcmRlcikuRW5jb2RlZExlbmd0aCgpOworICB9CisKKyAgZmxvYXQgJlByb2IoKSB7IHJldHVybiBQYXkoKS5wcm9iOyB9CisgIGZsb2F0IFByb2IoKSBjb25zdCB7IHJldHVybiBQYXkoKS5wcm9iOyB9CisKKyAgZmxvYXQgJkxvd2VyUHJvYigpIHsgcmV0dXJuIFBheSgpLmxvd2VyX3Byb2I7IH0KKyAgZmxvYXQgTG93ZXJQcm9iKCkgY29uc3QgeyByZXR1cm4gUGF5KCkubG93ZXJfcHJvYjsgfQorCisgIGNvbnN0IHVpbnQ4X3QgKkZyb21CZWdpbigpIGNvbnN0IHsgcmV0dXJuIFBheSgpLmZyb207IH0KKyAgdWludDhfdCAqRnJvbUJlZ2luKCkgeyByZXR1cm4gUGF5KCkuZnJvbTsgfQorCitwcml2YXRlOgorICBzdHJ1Y3QgQWZ0ZXIgeworICAgIC8vIE5vdGUgdGhhdCBiYWNrb2ZmX2FuZF9ub3JtYWxpemUgYXNzdW1lcyB0aGlzIGNvbWVzIGZpcnN0LgorICAgIGZsb2F0IHByb2I7CisgICAgZmxvYXQgbG93ZXJfcHJvYjsKKyAgICB1aW50OF90IGZyb21bXTsKKyAgfTsKKyAgY29uc3QgQWZ0ZXIgJlBheSgpIGNvbnN0IHsgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IEFmdGVyICo+KGVuZCgpKTsgfQorICBBZnRlciAmUGF5KCkgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QWZ0ZXIqPihlbmQoKSk7IH0KKworICBzdGQ6OnNpemVfdCBiYWNrb2ZmX2J5dGVzXzsKK307CisKK319IC8vIG5hbWVzcGFjZXMKKyNlbmRpZiAvLyBMTV9JTlRFUlBPTEFURV9NRVJHRV9QUk9CQUJJTElUSUVTX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV90ZXN0L3Rlc3QxIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL21lcmdlX3Rlc3QvdGVzdDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkMTE0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV90ZXN0L3Rlc3QxCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV90ZXN0L3Rlc3QyIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL21lcmdlX3Rlc3QvdGVzdDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzYTM4MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV90ZXN0L3Rlc3QyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV90ZXN0L3Rlc3QzIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL21lcmdlX3Rlc3QvdGVzdDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4OWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV90ZXN0L3Rlc3QzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV90ZXN0L3Rlc3RfYmFkX29yZGVyIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL21lcmdlX3Rlc3QvdGVzdF9iYWRfb3JkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwYTVlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV90ZXN0L3Rlc3RfYmFkX29yZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV90ZXN0L3Rlc3Rfbm9fdW5rIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL21lcmdlX3Rlc3QvdGVzdF9ub191bmsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjZjEyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV90ZXN0L3Rlc3Rfbm9fdW5rCkBAIC0wLDAgKzEgQEAKK3RvdG8KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV92b2NhYi5jYyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV92b2NhYi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTg0Mzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL21lcmdlX3ZvY2FiLmNjCkBAIC0wLDAgKzEsMTMxIEBACisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvbWVyZ2Vfdm9jYWIuaGgiCisKKyNpbmNsdWRlICJsbS9lbnVtZXJhdGVfdm9jYWIuaGgiCisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvdW5pdmVyc2FsX3ZvY2FiLmhoIgorI2luY2x1ZGUgImxtL2xtX2V4Y2VwdGlvbi5oaCIKKyNpbmNsdWRlICJsbS92b2NhYi5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIGludGVycG9sYXRlIHsKK25hbWVzcGFjZSB7CisKK2NsYXNzIFZvY2FiRmlsZVJlYWRlciB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBWb2NhYkZpbGVSZWFkZXIoY29uc3QgaW50IGZkLCBzaXplX3QgbW9kZWxfbnVtLCB1aW50NjRfdCBvZmZzZXQgPSAwKTsKKworICAgIFZvY2FiRmlsZVJlYWRlciAmb3BlcmF0b3IrKygpOworICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhZW9mXzsgfQorICAgIHVpbnQ2NF90IG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlKCk7IH0KKworICAgIHVpbnQ2NF90IFZhbHVlKCkgY29uc3QgeyByZXR1cm4gaGFzaF92YWx1ZV87IH0KKyAgICBzaXplX3QgTW9kZWxOdW0oKSBjb25zdCB7IHJldHVybiBtb2RlbF9udW1fOyB9CisgICAgV29yZEluZGV4IEN1cnJlbnRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfaW5kZXhfOyB9CisKKyAgICBTdHJpbmdQaWVjZSBXb3JkKCkgY29uc3QgeyByZXR1cm4gd29yZF87IH0KKworICBwcml2YXRlOgorICAgIHVpbnQ2NF90IGhhc2hfdmFsdWVfOworICAgIFdvcmRJbmRleCBjdXJyZW50X2luZGV4XzsKKyAgICBib29sIGVvZl87CisgICAgc2l6ZV90IG1vZGVsX251bV87CisgICAgU3RyaW5nUGllY2Ugd29yZF87CisgICAgdXRpbDo6RmlsZVBpZWNlIGZpbGVfcGllY2VfOworfTsKKworVm9jYWJGaWxlUmVhZGVyOjpWb2NhYkZpbGVSZWFkZXIoY29uc3QgaW50IGZkLCBjb25zdCBzaXplX3QgbW9kZWxfbnVtLCB1aW50NjRfdCBvZmZzZXQpIDoKKyAgaGFzaF92YWx1ZV8oMCksCisgIGN1cnJlbnRfaW5kZXhfKDApLAorICBlb2ZfKGZhbHNlKSwKKyAgbW9kZWxfbnVtXyhtb2RlbF9udW0pLAorICBmaWxlX3BpZWNlXyhmZCkgeworICB3b3JkXyA9IGZpbGVfcGllY2VfLlJlYWRMaW5lKCdcMCcpOworICBVVElMX1RIUk9XX0lGKHdvcmRfICE9ICI8dW5rPiIsCisgICAgICAgICAgICAgICAgRm9ybWF0TG9hZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAiVm9jYWJ1bGFyeSB3b3JkcyBhcmUgaW4gdGhlIHdyb25nIHBsYWNlLiIpOworICAvLyBzZXR1cCB0byBpbml0aWFsIHZhbHVlCisgICsrKnRoaXM7Cit9CisKK1ZvY2FiRmlsZVJlYWRlciAmVm9jYWJGaWxlUmVhZGVyOjpvcGVyYXRvcisrKCkgeworICB0cnkgeworICAgIHdvcmRfID0gZmlsZV9waWVjZV8uUmVhZExpbmUoJ1wwJyk7CisgIH0gY2F0Y2godXRpbDo6RW5kT2ZGaWxlRXhjZXB0aW9uICZlKSB7CisgICAgZW9mXyA9IHRydWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIHVpbnQ2NF90IHByZXZfaGFzaF92YWx1ZSA9IGhhc2hfdmFsdWVfOworICBoYXNoX3ZhbHVlXyA9IG5ncmFtOjpkZXRhaWw6Okhhc2hGb3JWb2NhYih3b3JkXy5kYXRhKCksIHdvcmRfLnNpemUoKSk7CisKKyAgLy8gaGFzaCB2YWx1ZXMgc2hvdWxkIGJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZworICBVVElMX1RIUk9XX0lGKGhhc2hfdmFsdWVfIDwgcHJldl9oYXNoX3ZhbHVlLCBGb3JtYXRMb2FkRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICI6IHdvcmQgaW5kZXggbm90IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4iCisgICAgICAgICAgICAgICAgPDwgIiBtb2RlbF9udW06ICIgPDwgbW9kZWxfbnVtXworICAgICAgICAgICAgICAgIDw8ICIgcHJldiBoYXNoOiAiIDw8IHByZXZfaGFzaF92YWx1ZQorICAgICAgICAgICAgICAgIDw8ICIgbmV3IGhhc2g6ICIgPDwgaGFzaF92YWx1ZV8pOworCisgICsrY3VycmVudF9pbmRleF87CisgIHJldHVybiAqdGhpczsKK30KKworY2xhc3MgQ29tcGFyZUZpbGVzIHsKK3B1YmxpYzoKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFZvY2FiRmlsZVJlYWRlciogeCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFZvY2FiRmlsZVJlYWRlciogeSkKKyAgeyByZXR1cm4geC0+VmFsdWUoKSA+IHktPlZhbHVlKCk7IH0KK307CisKK2NsYXNzIFJlYWRlcnMgOiBwdWJsaWMgdXRpbDo6Rml4ZWRBcnJheTxWb2NhYkZpbGVSZWFkZXI+IHsKKyAgcHVibGljOgorICAgIFJlYWRlcnMoc3RkOjpzaXplX3QgbnVtYmVyKSA6IHV0aWw6OkZpeGVkQXJyYXk8Vm9jYWJGaWxlUmVhZGVyPihudW1iZXIpIHt9CisgICAgdm9pZCBwdXNoX2JhY2soaW50IGZkLCBzdGQ6OnNpemVfdCBpKSB7CisgICAgICBuZXcoZW5kKCkpIFZvY2FiRmlsZVJlYWRlcihmZCwgaSk7CisgICAgICBDb25zdHJ1Y3RlZCgpOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlCisKK1dvcmRJbmRleCBNZXJnZVZvY2FiKHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c2NvcGVkX2ZkPiAmZmlsZXMsIFVuaXZlcnNhbFZvY2FiICZ2b2NhYiwgRW51bWVyYXRlVm9jYWIgJmVudW1lcmF0ZSkgeworICB0eXBlZGVmIHN0ZDo6cHJpb3JpdHlfcXVldWU8Vm9jYWJGaWxlUmVhZGVyKiwgc3RkOjp2ZWN0b3I8Vm9jYWJGaWxlUmVhZGVyKj4sIENvbXBhcmVGaWxlcz4gSGVhcFR5cGU7CisgIEhlYXBUeXBlIGhlYXA7CisgIFJlYWRlcnMgcmVhZGVycyhmaWxlcy5zaXplKCkpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgKytpKSB7CisgICAgcmVhZGVycy5wdXNoX2JhY2soZmlsZXNbaV0ucmVsZWFzZSgpLCBpKTsKKyAgICBoZWFwLnB1c2goJnJlYWRlcnMuYmFjaygpKTsKKyAgICAvLyBpbml0aWFsaXplIGZpcnN0IGluZGV4IHRvIDAgZm9yIDx1bms+CisgICAgdm9jYWIuSW5zZXJ0VW5pdmVyc2FsSWR4KGksIDAsIDApOworICB9CisKKyAgdWludDY0X3QgcHJldl9oYXNoX3ZhbHVlID0gMDsKKyAgLy8gZ2xvYmFsX2luZGV4IHN0YXJ0cyB3aXRoIDx1bms+IHdoaWNoIGlzIDAKKyAgV29yZEluZGV4IGdsb2JhbF9pbmRleCA9IDA7CisKKyAgZW51bWVyYXRlLkFkZCgwLCAiPHVuaz4iKTsKKyAgd2hpbGUgKCFoZWFwLmVtcHR5KCkpIHsKKyAgICBWb2NhYkZpbGVSZWFkZXIqIHRvcF92b2NhYl9maWxlID0gaGVhcC50b3AoKTsKKyAgICBpZiAodG9wX3ZvY2FiX2ZpbGUtPlZhbHVlKCkgIT0gcHJldl9oYXNoX3ZhbHVlKSB7CisgICAgICBlbnVtZXJhdGUuQWRkKCsrZ2xvYmFsX2luZGV4LCB0b3Bfdm9jYWJfZmlsZS0+V29yZCgpKTsKKyAgICB9CisgICAgdm9jYWIuSW5zZXJ0VW5pdmVyc2FsSWR4KHRvcF92b2NhYl9maWxlLT5Nb2RlbE51bSgpLAorICAgICAgICB0b3Bfdm9jYWJfZmlsZS0+Q3VycmVudEluZGV4KCksCisgICAgICAgIGdsb2JhbF9pbmRleCk7CisKKyAgICBwcmV2X2hhc2hfdmFsdWUgPSB0b3Bfdm9jYWJfZmlsZS0+VmFsdWUoKTsKKworICAgIGhlYXAucG9wKCk7CisgICAgaWYgKCsrKCp0b3Bfdm9jYWJfZmlsZSkpIHsKKyAgICAgIGhlYXAucHVzaCh0b3Bfdm9jYWJfZmlsZSk7CisgICAgfQorICB9CisgIHJldHVybiBnbG9iYWxfaW5kZXggKyAxOworfQorCit9IC8vIG5hbWVzcGFjZSBpbnRlcnBvbGF0ZQorfSAvLyBuYW1lc3BhY2UgbG0KKwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL21lcmdlX3ZvY2FiLmhoIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL21lcmdlX3ZvY2FiLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzRkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvbWVyZ2Vfdm9jYWIuaGgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBMTV9JTlRFUlBPTEFURV9NRVJHRV9WT0NBQl9ICisjZGVmaW5lIExNX0lOVEVSUE9MQVRFX01FUkdFX1ZPQ0FCX0gKKworI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvZml4ZWRfYXJyYXkuaGgiCisKK25hbWVzcGFjZSBsbSB7CisKK2NsYXNzIEVudW1lcmF0ZVZvY2FiOworCituYW1lc3BhY2UgaW50ZXJwb2xhdGUgeworCitjbGFzcyBVbml2ZXJzYWxWb2NhYjsKKworLy8gVGFrZXMgb3duZXJzaGlwIG9mIHZvY2FiX2ZpbGVzLgorLy8gVGhlIGNvbWJpbmVkIHZvY2FidWxhcnkgaXMgZW51bWVyYXRlZCB3aXRoIGVudW1lcmF0ZS4KKy8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbWJpbmVkIHZvY2FidWxhcnkuCitXb3JkSW5kZXggTWVyZ2VWb2NhYih1dGlsOjpGaXhlZEFycmF5PHV0aWw6OnNjb3BlZF9mZD4gJnZvY2FiX2ZpbGVzLCBVbml2ZXJzYWxWb2NhYiAmdm9jYWIsIEVudW1lcmF0ZVZvY2FiICZlbnVtZXJhdGUpOworCit9fSAvLyBuYW1lc3BhY2VzCisKKyNlbmRpZiAvLyBMTV9JTlRFUlBPTEFURV9NRVJHRV9WT0NBQl9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvbWVyZ2Vfdm9jYWJfdGVzdC5jYyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9tZXJnZV92b2NhYl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjI1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvbWVyZ2Vfdm9jYWJfdGVzdC5jYwpAQCAtMCwwICsxLDEyNiBAQAorI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBJbnRlcnBvbGF0ZU1lcmdlVm9jYWJUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSAibG0vZW51bWVyYXRlX3ZvY2FiLmhoIgorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL21lcmdlX3ZvY2FiLmhoIgorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL3VuaXZlcnNhbF92b2NhYi5oaCIKKyNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAibG0vdm9jYWIuaGgiCisjaW5jbHVkZSAibG0vd29yZF9pbmRleC5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisjaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBpbnRlcnBvbGF0ZSB7CituYW1lc3BhY2UgeworCisvLyBTdHVwaWQgYmphbSBwZXJtdXRlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyByYW5kb21seS4KK2NsYXNzIFRlc3RGaWxlcyB7CisgIHB1YmxpYzoKKyAgICBUZXN0RmlsZXMoKSB7CisgICAgICBjaGFyICoqYXJndiA9IGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2OworICAgICAgaW50IGFyZ2MgPSBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYzsKKyAgICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoNiwgYXJnYyk7CisgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkgeworICAgICAgICBFbmRzV2l0aEFzc2lnbihhcmd2W2ldLCAidGVzdDEiLCB0ZXN0WzBdKTsKKyAgICAgICAgRW5kc1dpdGhBc3NpZ24oYXJndltpXSwgInRlc3QyIiwgdGVzdFsxXSk7CisgICAgICAgIEVuZHNXaXRoQXNzaWduKGFyZ3ZbaV0sICJ0ZXN0MyIsIHRlc3RbMl0pOworICAgICAgICBFbmRzV2l0aEFzc2lnbihhcmd2W2ldLCAibm9fdW5rIiwgbm9fdW5rKTsKKyAgICAgICAgRW5kc1dpdGhBc3NpZ24oYXJndltpXSwgImJhZF9vcmRlciIsIGJhZF9vcmRlcik7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBFbmRzV2l0aEFzc2lnbihjaGFyICphcmcsIFN0cmluZ1BpZWNlIHZhbHVlLCB1dGlsOjpzY29wZWRfZmQgJnRvKSB7CisgICAgICBTdHJpbmdQaWVjZSBzdHIoYXJnKTsKKyAgICAgIGlmIChzdHIuc2l6ZSgpIDwgdmFsdWUuc2l6ZSgpKSByZXR1cm47CisgICAgICBpZiAoc3RkOjptZW1jbXAoc3RyLmRhdGEoKSArIHN0ci5zaXplKCkgLSB2YWx1ZS5zaXplKCksIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKSkgcmV0dXJuOworICAgICAgdG8ucmVzZXQodXRpbDo6T3BlblJlYWRPclRocm93KGFyZykpOworICAgIH0KKworICAgIHV0aWw6OnNjb3BlZF9mZCB0ZXN0WzNdLCBub191bmssIGJhZF9vcmRlcjsKK307CisKK2NsYXNzIERvTm90aGluZ0VudW1lcmF0ZSA6IHB1YmxpYyBFbnVtZXJhdGVWb2NhYiB7CisgIHB1YmxpYzoKKyAgICB2b2lkIEFkZChXb3JkSW5kZXgsIGNvbnN0IFN0cmluZ1BpZWNlICYpIHt9Cit9OworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNZXJnZVZvY2FiVGVzdCkgeworICBUZXN0RmlsZXMgZmlsZXM7CisKKyAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzY29wZWRfZmQ+IHVzZWRfZmlsZXMoMyk7CisgIHVzZWRfZmlsZXMucHVzaF9iYWNrKGZpbGVzLnRlc3RbMF0ucmVsZWFzZSgpKTsKKyAgdXNlZF9maWxlcy5wdXNoX2JhY2soZmlsZXMudGVzdFsxXS5yZWxlYXNlKCkpOworICB1c2VkX2ZpbGVzLnB1c2hfYmFjayhmaWxlcy50ZXN0WzJdLnJlbGVhc2UoKSk7CisKKyAgc3RkOjp2ZWN0b3I8bG06OldvcmRJbmRleD4gbW9kZWxfbWF4X2lkeDsKKyAgbW9kZWxfbWF4X2lkeC5wdXNoX2JhY2soMTApOworICBtb2RlbF9tYXhfaWR4LnB1c2hfYmFjaygxMCk7CisgIG1vZGVsX21heF9pZHgucHVzaF9iYWNrKDEwKTsKKworICB1dGlsOjpzY29wZWRfZmQgY29tYmluZWQodXRpbDo6TWFrZVRlbXAoInRlbXBvcmFyeSIpKTsKKworICBVbml2ZXJzYWxWb2NhYiB1bml2ZXJzYWxfdm9jYWIobW9kZWxfbWF4X2lkeCk7CisgIHsKKyAgICBuZ3JhbTo6SW1tZWRpYXRlV3JpdGVXb3Jkc1dyYXBwZXIgd3JpdGVyKE5VTEwsIGNvbWJpbmVkLmdldCgpLCAwKTsKKyAgICBNZXJnZVZvY2FiKHVzZWRfZmlsZXMsIHVuaXZlcnNhbF92b2NhYiwgd3JpdGVyKTsKKyAgfQorCisgIEJPT1NUX0NIRUNLX0VRVUFMKHVuaXZlcnNhbF92b2NhYi5HZXRVbml2ZXJzYWxJZHgoMCwgMCksIDApOworICBCT09TVF9DSEVDS19FUVVBTCh1bml2ZXJzYWxfdm9jYWIuR2V0VW5pdmVyc2FsSWR4KDEsIDApLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodW5pdmVyc2FsX3ZvY2FiLkdldFVuaXZlcnNhbElkeCgyLCAwKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHVuaXZlcnNhbF92b2NhYi5HZXRVbml2ZXJzYWxJZHgoMCwgMSksIDEpOworICBCT09TVF9DSEVDS19FUVVBTCh1bml2ZXJzYWxfdm9jYWIuR2V0VW5pdmVyc2FsSWR4KDEsIDEpLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodW5pdmVyc2FsX3ZvY2FiLkdldFVuaXZlcnNhbElkeCgyLCAxKSwgOCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHVuaXZlcnNhbF92b2NhYi5HZXRVbml2ZXJzYWxJZHgoMCwgNSksIDExKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodW5pdmVyc2FsX3ZvY2FiLkdldFVuaXZlcnNhbElkeCgxLCAzKSwgNCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHVuaXZlcnNhbF92b2NhYi5HZXRVbml2ZXJzYWxJZHgoMiwgMyksIDEwKTsKKworICB1dGlsOjpGaWxlUGllY2UgZihjb21iaW5lZC5yZWxlYXNlKCkpOworICBCT09TVF9DSEVDS19FUVVBTCgiPHVuaz4iLCBmLlJlYWRMaW5lKCdcMCcpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoImEiLCBmLlJlYWRMaW5lKCdcMCcpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoImlzIHRoaXMiLCBmLlJlYWRMaW5lKCdcMCcpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoInRoaXMgYSIsIGYuUmVhZExpbmUoJ1wwJykpOworICBCT09TVF9DSEVDS19FUVVBTCgiZmlyc3QgY3V0IiwgZi5SZWFkTGluZSgnXDAnKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCJ0aGlzIiwgZi5SZWFkTGluZSgnXDAnKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCJhIGZpcnN0IiwgZi5SZWFkTGluZSgnXDAnKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCJjdXQiLCBmLlJlYWRMaW5lKCdcMCcpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoImlzIiwgZi5SZWFkTGluZSgnXDAnKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCJpIiwgZi5SZWFkTGluZSgnXDAnKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCJzZWNkIiwgZi5SZWFkTGluZSgnXDAnKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCJmaXJzdCIsIGYuUmVhZExpbmUoJ1wwJykpOworICBCT09TVF9DSEVDS19USFJPVyhmLlJlYWRMaW5lKCdcMCcpLCB1dGlsOjpFbmRPZkZpbGVFeGNlcHRpb24pOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNZXJnZVZvY2FiTm9VbmtUZXN0KSB7CisgIFRlc3RGaWxlcyBmaWxlczsKKyAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzY29wZWRfZmQ+IHVzZWRfZmlsZXMoMSk7CisgIHVzZWRfZmlsZXMucHVzaF9iYWNrKGZpbGVzLm5vX3Vuay5yZWxlYXNlKCkpOworCisgIHN0ZDo6dmVjdG9yPGxtOjpXb3JkSW5kZXg+IG1vZGVsX21heF9pZHg7CisgIG1vZGVsX21heF9pZHgucHVzaF9iYWNrKDEwKTsKKworICBVbml2ZXJzYWxWb2NhYiB1bml2ZXJzYWxfdm9jYWIobW9kZWxfbWF4X2lkeCk7CisgIERvTm90aGluZ0VudW1lcmF0ZSBub3RoaW5nOworICBCT09TVF9DSEVDS19USFJPVyhNZXJnZVZvY2FiKHVzZWRfZmlsZXMsIHVuaXZlcnNhbF92b2NhYiwgbm90aGluZyksIEZvcm1hdExvYWRFeGNlcHRpb24pOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNZXJnZVZvY2FiV3JvbmdPcmRlclRlc3QpIHsKKyAgVGVzdEZpbGVzIGZpbGVzOworCisgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c2NvcGVkX2ZkPiB1c2VkX2ZpbGVzKDIpOworICB1c2VkX2ZpbGVzLnB1c2hfYmFjayhmaWxlcy50ZXN0WzBdLnJlbGVhc2UoKSk7CisgIHVzZWRfZmlsZXMucHVzaF9iYWNrKGZpbGVzLmJhZF9vcmRlci5yZWxlYXNlKCkpOworCisgIHN0ZDo6dmVjdG9yPGxtOjpXb3JkSW5kZXg+IG1vZGVsX21heF9pZHg7CisgIG1vZGVsX21heF9pZHgucHVzaF9iYWNrKDEwKTsKKyAgbW9kZWxfbWF4X2lkeC5wdXNoX2JhY2soMTApOworCisgIGxtOjppbnRlcnBvbGF0ZTo6VW5pdmVyc2FsVm9jYWIgdW5pdmVyc2FsX3ZvY2FiKG1vZGVsX21heF9pZHgpOworICBEb05vdGhpbmdFbnVtZXJhdGUgbm90aGluZzsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coTWVyZ2VWb2NhYih1c2VkX2ZpbGVzLCB1bml2ZXJzYWxfdm9jYWIsIG5vdGhpbmcpLCBGb3JtYXRMb2FkRXhjZXB0aW9uKTsKK30KKworfX19IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9ub3JtYWxpemUuY2MgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvbm9ybWFsaXplLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODNmMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvbm9ybWFsaXplLmNjCkBAIC0wLDAgKzEsMzg0IEBACisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvbm9ybWFsaXplLmhoIgorCisjaW5jbHVkZSAibG0vY29tbW9uL2NvbXBhcmUuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL25ncmFtX3N0cmVhbS5oaCIKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS9iYWNrb2ZmX21hdHJpeC5oaCIKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS9ib3VuZGVkX3NlcXVlbmNlX2VuY29kaW5nLmhoIgorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL2ludGVycG9sYXRlX2luZm8uaGgiCisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvbWVyZ2VfcHJvYmFiaWxpdGllcy5oaCIKKyNpbmNsdWRlICJsbS93ZWlnaHRzLmhoIgorI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisjaW5jbHVkZSAidXRpbC9maXhlZF9hcnJheS5oaCIKKyNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9zdHJlYW0uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vcmV3aW5kYWJsZV9zdHJlYW0uaGgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGludGVycG9sYXRlIHsKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBTdWZmaXhMZXhpY29ncmFwaGljTGVzcyA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxOR3JhbUhlYWRlciwgTkdyYW1IZWFkZXIsIGJvb2w+IHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IE5HcmFtSGVhZGVyIGZpcnN0LCBjb25zdCBOR3JhbUhlYWRlciBzZWNvbmQpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IFdvcmRJbmRleCAqZiA9IGZpcnN0LmVuZCgpIC0gMSwgKnMgPSBzZWNvbmQuZW5kKCkgLSAxOyBmID49IGZpcnN0LmJlZ2luKCkgJiYgcyA+PSBzZWNvbmQuYmVnaW4oKTsgLS1mLCAtLXMpIHsKKyAgICAgIGlmICgqZiA8ICpzKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmICgqZiA+ICpzKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBmaXJzdC5zaXplKCkgPCBzZWNvbmQuc2l6ZSgpOworICB9Cit9OworCitjbGFzcyBCYWNrb2ZmUXVldWVFbnRyeSB7CisgIHB1YmxpYzoKKyAgICBCYWNrb2ZmUXVldWVFbnRyeShmbG9hdCAmZW50cnksIGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pCisgICAgICA6IGVudHJ5XyhlbnRyeSksIHN0cmVhbV8ocG9zaXRpb24pIHsKKyAgICAgIGVudHJ5XyA9IDAuMDsKKyAgICB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gc3RyZWFtXzsgfQorCisgICAgTkdyYW1IZWFkZXIgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnN0cmVhbV87IH0KKyAgICBjb25zdCBOR3JhbUhlYWRlciAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYqc3RyZWFtXzsgfQorCisgICAgdm9pZCBFbnRlcigpIHsKKyAgICAgIGVudHJ5XyA9IHN0cmVhbV8tPlZhbHVlKCkuYmFja29mZjsKKyAgICB9CisKKyAgICBCYWNrb2ZmUXVldWVFbnRyeSAmTmV4dCgpIHsKKyAgICAgIGVudHJ5XyA9IDAuMDsKKyAgICAgICsrc3RyZWFtXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBmbG9hdCAmZW50cnlfOworICAgIE5HcmFtU3RyZWFtPFByb2JCYWNrb2ZmPiBzdHJlYW1fOworfTsKKworc3RydWN0IFB0ckdyZWF0ZXIgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248Y29uc3QgQmFja29mZlF1ZXVlRW50cnkgKiwgY29uc3QgQmFja29mZlF1ZXVlRW50cnkgKiwgYm9vbD4geworICBib29sIG9wZXJhdG9yKCkoY29uc3QgQmFja29mZlF1ZXVlRW50cnkgKmZpcnN0LCBjb25zdCBCYWNrb2ZmUXVldWVFbnRyeSAqc2Vjb25kKSBjb25zdCB7CisgICAgcmV0dXJuIFN1ZmZpeExleGljb2dyYXBoaWNMZXNzKCkoKipzZWNvbmQsICoqZmlyc3QpOworICB9Cit9OworCitjbGFzcyBFbnRyeU93bmVyIDogcHVibGljIHV0aWw6OkZpeGVkQXJyYXk8QmFja29mZlF1ZXVlRW50cnk+IHsKKyAgcHVibGljOgorICAgIHZvaWQgcHVzaF9iYWNrKGZsb2F0ICZlbnRyeSwgY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICAgICAgbmV3IChlbmQoKSkgQmFja29mZlF1ZXVlRW50cnkoZW50cnksIHBvc2l0aW9uKTsKKyAgICAgIENvbnN0cnVjdGVkKCk7CisgICAgfQorfTsKKworc3RkOjpzaXplX3QgTWF4T3JkZXIoY29uc3QgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zPiAmbW9kZWwpIHsKKyAgc3RkOjpzaXplX3QgcmV0ID0gMDsKKyAgZm9yIChjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zICptID0gbW9kZWwuYmVnaW4oKTsgbSAhPSBtb2RlbC5lbmQoKTsgKyttKSB7CisgICAgcmV0ID0gc3RkOjptYXgocmV0LCBtLT5zaXplKCkpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2NsYXNzIEJhY2tvZmZNYW5hZ2VyIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJhY2tvZmZNYW5hZ2VyKGNvbnN0IHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucz4gJm1vZGVscykKKyAgICAgIDogZW50ZXJlZF8oTWF4T3JkZXIobW9kZWxzKSksIG1hdHJpeF8obW9kZWxzLnNpemUoKSwgTWF4T3JkZXIobW9kZWxzKSksIHNraXBfd3JpdGVfKE1heE9yZGVyKG1vZGVscykpIHsKKyAgICAgIHN0ZDo6c2l6ZV90IHRvdGFsID0gMDsKKyAgICAgIGZvciAoY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyAqbSA9IG1vZGVscy5iZWdpbigpOyBtICE9IG1vZGVscy5lbmQoKTsgKyttKSB7CisgICAgICAgIHRvdGFsICs9IG0tPnNpemUoKTsKKyAgICAgIH0KKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBNYXhPcmRlcihtb2RlbHMpOyArK2kpIHsKKyAgICAgICAgZW50ZXJlZF8ucHVzaF9iYWNrKG1vZGVscy5zaXplKCkpOworICAgICAgfQorICAgICAgb3duZXJfLkluaXQodG90YWwpOworICAgICAgZm9yIChjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zICptID0gbW9kZWxzLmJlZ2luKCk7IG0gIT0gbW9kZWxzLmVuZCgpOyArK20pIHsKKyAgICAgICAgZm9yIChjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gKmogPSBtLT5iZWdpbigpOyBqICE9IG0tPmVuZCgpOyArK2opIHsKKyAgICAgICAgICBvd25lcl8ucHVzaF9iYWNrKG1hdHJpeF8uQmFja29mZihtIC0gbW9kZWxzLmJlZ2luKCksIGogLSBtLT5iZWdpbigpKSwgKmopOworICAgICAgICAgIGlmIChvd25lcl8uYmFjaygpKSB7CisgICAgICAgICAgICBxdWV1ZV8ucHVzaCgmb3duZXJfLmJhY2soKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBTZXR1cFNraXAoc3RkOjpzaXplX3Qgb3JkZXIsIHV0aWw6OnN0cmVhbTo6U3RyZWFtICZzdHJlYW0pIHsKKyAgICAgIHNraXBfd3JpdGVfW29yZGVyIC0gMl0gPSAmc3RyZWFtOworICAgIH0KKworICAgIC8vIE1vdmUgdXAgdGhlIGJhY2tvZmZzIGZvciB0aGUgZ2l2ZW4gbi1ncmFtLiAgVGhlIG4tZ3JhbXMgbXVzdCBiZSBwcm92aWRlZAorICAgIC8vIGluIHN1ZmZpeCBsZXhpY29ncmFwaGljIG9yZGVyLgorICAgIHZvaWQgRW50ZXIoY29uc3QgTkdyYW1IZWFkZXIgJnRvKSB7CisgICAgICAvLyBDaGVjayB0aGF0IHdlIGV4aXRlZCBwcm9wZXJseS4KKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IHRvLk9yZGVyKCkgLSAxOyBpIDwgZW50ZXJlZF8uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgYXNzZXJ0KGVudGVyZWRfW2ldLmVtcHR5KCkpOworICAgICAgfQorICAgICAgU3VmZml4TGV4aWNvZ3JhcGhpY0xlc3MgbGVzczsKKyAgICAgIHdoaWxlICghcXVldWVfLmVtcHR5KCkgJiYgbGVzcygqKnF1ZXVlXy50b3AoKSwgdG8pKQorICAgICAgICBTa2lwUmVjb3JkKCk7CisgICAgICB3aGlsZSAoVG9wTWF0Y2hlcyh0bykpIHsKKyAgICAgICAgQmFja29mZlF1ZXVlRW50cnkgKm1hdGNoZXMgPSBxdWV1ZV8udG9wKCk7CisgICAgICAgIGVudGVyZWRfW3RvLk9yZGVyKCkgLSAxXS5wdXNoX2JhY2sobWF0Y2hlcyk7CisgICAgICAgIG1hdGNoZXMtPkVudGVyKCk7CisgICAgICAgIHF1ZXVlXy5wb3AoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIEV4aXQoc3RkOjpzaXplX3Qgb3JkZXJfbWludXNfMSkgeworICAgICAgZm9yIChCYWNrb2ZmUXVldWVFbnRyeSAqKmkgPSBlbnRlcmVkX1tvcmRlcl9taW51c18xXS5iZWdpbigpOyBpICE9IGVudGVyZWRfW29yZGVyX21pbnVzXzFdLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYgKCgqaSktPk5leHQoKSkKKyAgICAgICAgICBxdWV1ZV8ucHVzaCgqaSk7CisgICAgICB9CisgICAgICBlbnRlcmVkX1tvcmRlcl9taW51c18xXS5jbGVhcigpOworICAgIH0KKworICAgIGZsb2F0IEdldChzdGQ6OnNpemVfdCBtb2RlbCwgc3RkOjpzaXplX3Qgb3JkZXJfbWludXNfMSkgY29uc3QgeworICAgICAgcmV0dXJuIG1hdHJpeF8uQmFja29mZihtb2RlbCwgb3JkZXJfbWludXNfMSk7CisgICAgfQorCisgICAgdm9pZCBGaW5pc2goKSB7CisgICAgICB3aGlsZSAoIXF1ZXVlXy5lbXB0eSgpKQorICAgICAgICBTa2lwUmVjb3JkKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBTa2lwUmVjb3JkKCkgeworICAgICAgQmFja29mZlF1ZXVlRW50cnkgKnRvcCA9IHF1ZXVlXy50b3AoKTsKKyAgICAgIHF1ZXVlXy5wb3AoKTsKKyAgICAgIC8vIElzIHRoaXMgdGhlIGxhc3QgaW5zdGFuY2Ugb2YgdGhlIG4tZ3JhbT8KKyAgICAgIGlmICghVG9wTWF0Y2hlcygqKnRvcCkpIHsKKyAgICAgICAgLy8gQW4gbi1ncmFtIGlzIGJlaW5nIHNraXBwZWQuICBDYWxsZWQgb25jZSBwZXIgc2tpcHBlZCBuLWdyYW0sCisgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgbW9kZWxzIGl0IGNvbWVzIGZyb20uCisgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4oc2tpcF93cml0ZV9bKCp0b3ApLT5PcmRlcigpIC0gMV0tPkdldCgpKSA9IDAuMDsKKyAgICAgICAgKysqc2tpcF93cml0ZV9bKCp0b3ApLT5PcmRlcigpIC0gMV07CisgICAgICB9CisgICAgICBpZiAodG9wLT5OZXh0KCkpCisgICAgICAgIHF1ZXVlXy5wdXNoKHRvcCk7CisgICAgfQorCisgICAgYm9vbCBUb3BNYXRjaGVzKGNvbnN0IE5HcmFtSGVhZGVyICZoZWFkZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhcXVldWVfLmVtcHR5KCkgJiYgKCpxdWV1ZV8udG9wKCkpLT5PcmRlcigpID09IGhlYWRlci5PcmRlcigpICYmIHN0ZDo6ZXF1YWwoaGVhZGVyLmJlZ2luKCksIGhlYWRlci5lbmQoKSwgKCpxdWV1ZV8udG9wKCkpLT5iZWdpbigpKTsKKyAgICB9CisKKyAgICBFbnRyeU93bmVyIG93bmVyXzsKKyAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPEJhY2tvZmZRdWV1ZUVudHJ5Kiwgc3RkOjp2ZWN0b3I8QmFja29mZlF1ZXVlRW50cnkqPiwgUHRyR3JlYXRlcj4gcXVldWVfOworCisgICAgLy8gSW5kZXhlZCBieSBvcmRlciB0aGVuIGp1c3QgYWxsIHRoZSBtYXRjaGluZyBtb2RlbHMuCisgICAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpGaXhlZEFycmF5PEJhY2tvZmZRdWV1ZUVudHJ5Kj4gPiBlbnRlcmVkXzsKKworICAgIHN0ZDo6c2l6ZV90IG9yZGVyXzsKKworICAgIEJhY2tvZmZNYXRyaXggbWF0cml4XzsKKworICAgIHN0ZDo6dmVjdG9yPHV0aWw6OnN0cmVhbTo6U3RyZWFtKj4gc2tpcF93cml0ZV87Cit9OworCit0eXBlZGVmIGxvbmcgZG91YmxlIEFjY3VtOworCisvLyBIYW5kbGVzIG4tZ3JhbXMgb2YgdGhlIHNhbWUgb3JkZXIsIHVzaW5nIHJlY3Vyc2lvbiB0byBjYWxsIGFub3RoZXIgaW5zdGFuY2UKKy8vIGZvciBoaWdoZXIgb3JkZXJzLgorY2xhc3MgUmVjdXJzZSB7CisgIHB1YmxpYzoKKyAgICBSZWN1cnNlKAorICAgICAgICBjb25zdCBJbnRlcnBvbGF0ZUluZm8gJmluZm8sIC8vIE11c3Qgc3RheSBhbGl2ZSB0aGUgZW50aXJlIHRpbWUuCisgICAgICAgIHN0ZDo6c2l6ZV90IG9yZGVyLAorICAgICAgICBjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJm1lcmdlZF9wcm9icywKKyAgICAgICAgY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwcm9iX291dCwKKyAgICAgICAgY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZiYWNrb2ZmX291dCwKKyAgICAgICAgQmFja29mZk1hbmFnZXIgJmJhY2tvZmZzLAorICAgICAgICBSZWN1cnNlICpoaWdoZXIpIC8vIGhpZ2hlciBpcyBudWxsIGZvciB0aGUgaGlnaGVzdCBvcmRlci4KKyAgICAgIDogb3JkZXJfKG9yZGVyKSwKKyAgICAgICAgZW5jb2RpbmdfKE1ha2VFbmNvZGVyKGluZm8sIG9yZGVyKSksCisgICAgICAgIGlucHV0XyhtZXJnZWRfcHJvYnMsIFBhcnRpYWxQcm9iR2FtbWEob3JkZXIsIGVuY29kaW5nXy5FbmNvZGVkTGVuZ3RoKCkpKSwKKyAgICAgICAgcHJvYl9vdXRfKHByb2Jfb3V0KSwKKyAgICAgICAgYmFja29mZl9vdXRfKGJhY2tvZmZfb3V0KSwKKyAgICAgICAgYmFja29mZnNfKGJhY2tvZmZzKSwKKyAgICAgICAgbGFtYmRhc18oJippbmZvLmxhbWJkYXMuYmVnaW4oKSksCisgICAgICAgIGhpZ2hlcl8oaGlnaGVyKSwKKyAgICAgICAgZGVjb2RlZF9iYWNrb2Zmc18oaW5mby5Nb2RlbHMoKSksCisgICAgICAgIGV4dGVuZGVkX2NvbnRleHRfKG9yZGVyIC0gMSkgeworICAgICAgLy8gVGhpcyBpcyBvbmx5IGZvciBiaWdyYW1zIGFuZCBhYm92ZS4gIFN1bW1pbmcgdW5pZ3JhbXMgaXMgYSBtdWNoIGVhc2llciBjYXNlLgorICAgICAgYXNzZXJ0KG9yZGVyID49IDIpOworICAgIH0KKworICAgIC8vIGNvbnRleHQgPSB3XzFee24tMX0KKyAgICAvLyB6X2xvd2VyID0gWih3XzJee24tMX0pCisgICAgLy8gSW5wdXQ6CisgICAgLy8gICBNZXJnZWQgcHJvYmFiaWxpdGllcyB3aXRob3V0IGJhY2tvZmYgYXBwbGllZCBpbiBpbnB1dF8uCisgICAgLy8gICBCYWNrb2ZmcyB2aWEgYmFja29mZnNfLgorICAgIC8vIENhbGN1bGF0ZXM6CisgICAgLy8gICBaKHdfMV57bi0xfSk6IGludGVybWVkaWF0ZSBvbmx5LgorICAgIC8vICAgcF9JKHggfCB3XzFee24tMX0pIGZvciBhbGwgeDogd18xXntuLTF9eCBleGlzdHM6IFdyaXR0ZW4gdG8gcHJvYl9vdXRfLgorICAgIC8vICAgYl9JKHdfMV57bi0xfSk6IFdyaXR0ZW4gdG8gYmFja29mZl9vdXRfLgorICAgIHZvaWQgU2FtZUNvbnRleHQoY29uc3QgTkdyYW1IZWFkZXIgJmNvbnRleHQsIEFjY3VtIHpfbG93ZXIpIHsKKyAgICAgIGFzc2VydChjb250ZXh0LnNpemUoKSA9PSBvcmRlcl8gLSAxKTsKKyAgICAgIGJhY2tvZmZzXy5FbnRlcihjb250ZXh0KTsKKyAgICAgIHByb2Jfb3V0Xy5NYXJrKCk7CisKKyAgICAgIC8vIFRoaXMgaXMgdGhlIGJhY2tvZmYgdGVybSB0aGF0IGFwcGxpZXMgd2hlbiBvbmUgYXNzdW1lcyBldmVyeXRoaW5nIGJhY2tzIG9mZjoKKyAgICAgIC8vIFxwcm9kX2kgYl9pKHdfMV57bi0xfSlee1xsYW1iZGFfaX0uCisgICAgICBBY2N1bSBiYWNrb2ZmX29uY2UgPSAwLjA7CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IG0gPSAwOyBtIDwgZGVjb2RlZF9iYWNrb2Zmc18uc2l6ZSgpOyArK20pIHsKKyAgICAgICAgYmFja29mZl9vbmNlICs9IGxhbWJkYXNfW21dICogYmFja29mZnNfLkdldChtLCBvcmRlcl8gLSAyKTsKKyAgICAgIH0KKworICAgICAgQWNjdW0gel9kZWx0YSA9IDAuMDsKKyAgICAgIHN0ZDo6c2l6ZV90IGNvdW50ID0gMDsKKyAgICAgIGZvciAoOyBpbnB1dF8gJiYgc3RkOjplcXVhbChjb250ZXh0LmJlZ2luKCksIGNvbnRleHQuZW5kKCksIGlucHV0Xy0+YmVnaW4oKSk7ICsraW5wdXRfLCArK3Byb2Jfb3V0XywgKytjb3VudCkgeworICAgICAgICAvLyBBcHBseSBiYWNrb2ZmcyB0byBwcm9iYWJpbGl0aWVzLgorICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgYm91bmRlZCBzZXF1ZW5jZSBlbmNvZGluZyB0byBoYXZlIGFuIGl0ZXJhdG9yIGZvciBkZWNvZGluZyBpbnN0ZWFkIG9mIGRvaW5nIGEgY29weSBoZXJlLgorICAgICAgICBlbmNvZGluZ18uRGVjb2RlKGlucHV0Xy0+RnJvbUJlZ2luKCksICYqZGVjb2RlZF9iYWNrb2Zmc18uYmVnaW4oKSk7CisgICAgICAgIGZvciAoc3RkOjpzaXplX3QgbSA9IDA7IG0gPCBOdW1Nb2RlbHMoKTsgKyttKSB7CisgICAgICAgICAgLy8gQXBwbHkgdGhlIGJhY2tvZmZzIGFzIGluc3RydWN0ZWQgZm9yIG1vZGVsIG0uCisgICAgICAgICAgZmxvYXQgYWNjdW11bGF0ZWQgPSAwLjA7CisgICAgICAgICAgLy8gQ2hhbmdlIGJhY2tvZmZzIGZvciBbb3JkZXIgaXQgYmFja2VkIG9mZiB0bywgb3JkZXIgLSAxKSBleGNlcHQKKyAgICAgICAgICAvLyB3aXRoIDAtaW5kZXhpbmcuICBUaGVyZSBpcyBzdGlsbCB0aGUgcG90ZW50aWFsIHRvIGNoYXJnZSBiYWNrb2ZmCisgICAgICAgICAgLy8gZm9yIG9yZGVyIC0gMSwgd2hpY2ggaXMgZG9uZSBsYXRlci4gIFRoZSBiYWNrb2ZmcyBjaGFyZ2VkIGhlcmUKKyAgICAgICAgICAvLyBhcmUgYl9tKHdfe24tMX1ee24tMX0pIC4uLiBiX20od18yXntuLTF9KQorICAgICAgICAgIGZvciAodW5zaWduZWQgY2hhciBiYWNrZWRfdG8gPSBkZWNvZGVkX2JhY2tvZmZzX1ttXTsgYmFja2VkX3RvIDwgb3JkZXJfIC0gMjsgKytiYWNrZWRfdG8pIHsKKyAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IGJhY2tvZmZzXy5HZXQobSwgYmFja2VkX3RvKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmxvYXQgbGFtYmRhID0gbGFtYmRhc19bbV07CisgICAgICAgICAgLy8gTG93ZXIgcCh4IHwgd18yXntuLTF9KSBnZXRzIGFsbCB0aGUgYmFja29mZnMgZXhjZXB0IHRoZSBoaWdoZXN0LgorICAgICAgICAgIGlucHV0Xy0+TG93ZXJQcm9iKCkgKz0gYWNjdW11bGF0ZWQgKiBsYW1iZGE7CisgICAgICAgICAgLy8gQ2hhcmdlIHRoZSBiYWNrb2ZmIGIod18xXntuLTF9KSBpZiBhcHBsaWNhYmxlLCBidXQgb25seSB0byBhdHRhaW4gcCh4IHwgd18xXntuLTF9KQorICAgICAgICAgIGlmIChkZWNvZGVkX2JhY2tvZmZzX1ttXSA8IG9yZGVyXyAtIDEpIHsKKyAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IGJhY2tvZmZzXy5HZXQobSwgb3JkZXJfIC0gMik7CisgICAgICAgICAgfQorICAgICAgICAgIGlucHV0Xy0+UHJvYigpICs9IGFjY3VtdWxhdGVkICogbGFtYmRhOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IGJldHRlciBwcmVjaXNpb24vbGVzcyBvcGVyYXRpb25zIGhlcmUuCisgICAgICAgIHpfZGVsdGEgKz0gcG93KDEwLjAsIGlucHV0Xy0+UHJvYigpKSAtIHBvdygxMC4wLCBpbnB1dF8tPkxvd2VyUHJvYigpICsgYmFja29mZl9vbmNlKTsKKworICAgICAgICAvLyBXcml0ZSB1bm5vcm1hbGl6ZWQgcHJvYmFiaWxpdHkgcmVjb3JkLgorICAgICAgICBzdGQ6OmNvcHkoaW5wdXRfLT5iZWdpbigpLCBpbnB1dF8tPmVuZCgpLCByZWludGVycHJldF9jYXN0PFdvcmRJbmRleCo+KHByb2Jfb3V0Xy5HZXQoKSkpOworICAgICAgICBQcm9iV3JpdGUoKSA9IGlucHV0Xy0+UHJvYigpOworICAgICAgfQorICAgICAgLy8gVE9ETyBudW1lcmljYWwgcHJlY2lzaW9uLgorICAgICAgQWNjdW0geiA9IGxvZzEwKHBvdygxMC4wLCB6X2xvd2VyICsgYmFja29mZl9vbmNlKSArIHpfZGVsdGEpOworCisgICAgICAvLyBOb3JtYWxpemUuCisgICAgICBwcm9iX291dF8uUmV3aW5kKCk7CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSwgKytwcm9iX291dF8pIHsKKyAgICAgICAgUHJvYldyaXRlKCkgLT0gejsKKyAgICAgIH0KKyAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBzdHJlYW0gdG8gcmVsZWFzZSBkYXRhLgorICAgICAgcHJvYl9vdXRfLk1hcmsoKTsKKworICAgICAgLy8gT3V0cHV0IGJhY2tvZmYuCisgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGJhY2tvZmZfb3V0Xy5HZXQoKSkgPSB6X2xvd2VyICsgYmFja29mZl9vbmNlIC0gejsKKyAgICAgICsrYmFja29mZl9vdXRfOworCisgICAgICBpZiAoaGlnaGVyXy5nZXQoKSkKKyAgICAgICAgaGlnaGVyXy0+RXh0ZW5kQ29udGV4dChjb250ZXh0LCB6KTsKKworICAgICAgYmFja29mZnNfLkV4aXQob3JkZXJfIC0gMik7CisgICAgfQorCisgICAgLy8gQ2FsbCBpcyBnaXZlbiBhIGNvbnRleHQgYW5kIHooY29udGV4dCkuCisgICAgLy8gRXZhbHVhdGVzIHkgY29udGV4dCB4IGZvciBhbGwgeSx4LgorICAgIHZvaWQgRXh0ZW5kQ29udGV4dChjb25zdCBOR3JhbUhlYWRlciAmbWlkZGxlLCBBY2N1bSB6X2xvd2VyKSB7CisgICAgICBhc3NlcnQobWlkZGxlLnNpemUoKSA9PSBvcmRlcl8gLSAyKTsKKyAgICAgIC8vIENvcHkgYmVjYXVzZSB0aGUgaW5wdXQgd2lsbCBhZHZhbmNlLiAgVE9ETyBhdm9pZCB0aGlzIGNvcHkgYnkgc2hhcmluZyBhbW9uZ3N0IGNsYXNzZXMuCisgICAgICBzdGQ6OmNvcHkobWlkZGxlLmJlZ2luKCksIG1pZGRsZS5lbmQoKSwgZXh0ZW5kZWRfY29udGV4dF8uYmVnaW4oKSArIDEpOworICAgICAgd2hpbGUgKGlucHV0XyAmJiBzdGQ6OmVxdWFsKG1pZGRsZS5iZWdpbigpLCBtaWRkbGUuZW5kKCksIGlucHV0Xy0+YmVnaW4oKSArIDEpKSB7CisgICAgICAgICpleHRlbmRlZF9jb250ZXh0Xy5iZWdpbigpID0gKmlucHV0Xy0+YmVnaW4oKTsKKyAgICAgICAgU2FtZUNvbnRleHQoTkdyYW1IZWFkZXIoJipleHRlbmRlZF9jb250ZXh0Xy5iZWdpbigpLCBvcmRlcl8gLSAxKSwgel9sb3dlcik7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBGaW5pc2goKSB7CisgICAgICBhc3NlcnQoIWlucHV0Xyk7CisgICAgICBwcm9iX291dF8uUG9pc29uKCk7CisgICAgICBiYWNrb2ZmX291dF8uUG9pc29uKCk7CisgICAgICBpZiAoaGlnaGVyXy5nZXQoKSkKKyAgICAgICAgaGlnaGVyXy0+RmluaXNoKCk7CisgICAgfQorCisgICAgLy8gVGhlIEJhY2tvZmZNYW5hZ2VyIGNsYXNzIGFsc28gaW5qZWN0cyBiYWNrb2ZmcyB3aGVuIGl0IHNraXBzIGFoZWFkIGUuZy4gYig8L3M+KSA9IDEKKyAgICB1dGlsOjpzdHJlYW06OlN0cmVhbSAmQmFja29mZlN0cmVhbSgpIHsgcmV0dXJuIGJhY2tvZmZfb3V0XzsgfQorCisgIHByaXZhdGU6CisgICAgLy8gV3JpdGUgdGhlIHByb2JhYmlsaXR5IHRvIHRoZSBjb3JyZWN0IHBsYWNlIGluIHByb2Jfb3V0Xy4gIFNob3VsZCB1c2UgYSBwcm94eSBidXQgY3VycmVudGx5IGluY29tcGF0aWJsZSB3aXRoIFJld2luZGFibGVTdHJlYW0uCisgICAgZmxvYXQgJlByb2JXcml0ZSgpIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHByb2Jfb3V0Xy5HZXQoKSkgKyBvcmRlcl8gKiBzaXplb2YoV29yZEluZGV4KSk7CisgICAgfQorCisgICAgc3RkOjpzaXplX3QgTnVtTW9kZWxzKCkgY29uc3QgeyByZXR1cm4gZGVjb2RlZF9iYWNrb2Zmc18uc2l6ZSgpOyB9CisKKyAgICBjb25zdCBzdGQ6OnNpemVfdCBvcmRlcl87CisKKyAgICBjb25zdCBCb3VuZGVkU2VxdWVuY2VFbmNvZGluZyBlbmNvZGluZ187CisKKyAgICBQcm94eVN0cmVhbTxQYXJ0aWFsUHJvYkdhbW1hPiBpbnB1dF87CisgICAgdXRpbDo6c3RyZWFtOjpSZXdpbmRhYmxlU3RyZWFtIHByb2Jfb3V0XzsKKyAgICB1dGlsOjpzdHJlYW06OlN0cmVhbSBiYWNrb2ZmX291dF87CisKKyAgICBCYWNrb2ZmTWFuYWdlciAmYmFja29mZnNfOworICAgIGNvbnN0IGZsb2F0ICpjb25zdCBsYW1iZGFzXzsKKworICAgIC8vIEhpZ2hlciBvcmRlciBpbnN0YW5jZSBvZiB0aGlzIHNhbWUgY2xhc3MuCisgICAgdXRpbDo6c2NvcGVkX3B0cjxSZWN1cnNlPiBoaWdoZXJfOworCisgICAgLy8gVGVtcG9yYXJ5IGluIFNhbWVDb250ZXh0LgorICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IGRlY29kZWRfYmFja29mZnNfOworICAgIC8vIFRlbXBvcmFyeSBpbiBFeHRlbmRDb250ZXh0LgorICAgIHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gZXh0ZW5kZWRfY29udGV4dF87Cit9OworCitjbGFzcyBUaHJlYWQgeworICBwdWJsaWM6CisgICAgVGhyZWFkKGNvbnN0IEludGVycG9sYXRlSW5mbyAmaW5mbywgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zPiAmbW9kZWxzX2J5X29yZGVyLCB1dGlsOjpzdHJlYW06OkNoYWlucyAmcHJvYl9vdXQsIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZiYWNrb2ZmX291dCkKKyAgICAgIDogaW5mb18oaW5mbyksIG1vZGVsc19ieV9vcmRlcl8obW9kZWxzX2J5X29yZGVyKSwgcHJvYl9vdXRfKHByb2Jfb3V0KSwgYmFja29mZl9vdXRfKGJhY2tvZmZfb3V0KSB7fQorCisgICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyAmbWVyZ2VkX3Byb2JhYmlsaXRpZXMpIHsKKyAgICAgIC8vIFVuaWdyYW1zIGRvIG5vdCBoYXZlIGVub2NkZWQgYmFja29mZiBpbmZvLgorICAgICAgUHJveHlTdHJlYW08UGFydGlhbFByb2JHYW1tYT4gaW4obWVyZ2VkX3Byb2JhYmlsaXRpZXNbMF0sIFBhcnRpYWxQcm9iR2FtbWEoMSwgMCkpOworICAgICAgdXRpbDo6c3RyZWFtOjpSZXdpbmRhYmxlU3RyZWFtIHByb2Jfd3JpdGUocHJvYl9vdXRfWzBdKTsKKyAgICAgIEFjY3VtIHogPSAwLjA7CisgICAgICBwcm9iX3dyaXRlLk1hcmsoKTsKKyAgICAgIFdvcmRJbmRleCBjb3VudCA9IDA7CisgICAgICBmb3IgKDsgaW47ICsraW4sICsrcHJvYl93cml0ZSwgKytjb3VudCkgeworICAgICAgICAvLyBOb3RlIGFzc3VtcHRpb24gdGhhdCBwcm9iYWJpbGl0aXR5IGNvbWVzIGZpcnN0CisgICAgICAgIG1lbWNweShwcm9iX3dyaXRlLkdldCgpLCBpbi5HZXQoKSwgc2l6ZW9mKFdvcmRJbmRleCkgKyBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgeiArPSBwb3coMTAuMCwgaW4tPlByb2IoKSk7CisgICAgICB9CisgICAgICAvLyBUT0RPIEhBQ0sgVE9ETzogbG1wbHogb3V0cHV0cyBwKDxzPikgPSAxIHRvIGdldCBxIHRvIGNvbXB1dGUgbmljZWx5LiAgVGhhdCB3aWxsIGFsd2F5cyByZXN1bHQgaW4gMS4wIG1vcmUgdGhhbiBpdCBzaG91bGQgYmUuCisgICAgICB6IC09IDEuMDsKKyAgICAgIGZsb2F0IGxvZ196ID0gbG9nMTAoeik7CisgICAgICBwcm9iX3dyaXRlLlJld2luZCgpOworICAgICAgLy8gTm9ybWFsaXplIHVuaWdyYW0gcHJvYmFiaWxpdGllcy4KKyAgICAgIGZvciAoV29yZEluZGV4IGkgPSAwOyBpIDwgY291bnQ7ICsraSwgKytwcm9iX3dyaXRlKSB7CisgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4ocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocHJvYl93cml0ZS5HZXQoKSkgKyBzaXplb2YoV29yZEluZGV4KSkgLT0gbG9nX3o7CisgICAgICB9CisgICAgICBwcm9iX3dyaXRlLlBvaXNvbigpOworCisgICAgICAvLyBOb3cgc2V0dXAgdGhlIGhpZ2hlciBvcmRlcnMuCisgICAgICB1dGlsOjpzY29wZWRfcHRyPFJlY3Vyc2U+IGhpZ2hlcl9vcmRlcjsKKyAgICAgIEJhY2tvZmZNYW5hZ2VyIGJhY2tvZmZzKG1vZGVsc19ieV9vcmRlcl8pOworICAgICAgc3RkOjpzaXplX3QgbWF4X29yZGVyID0gbWVyZ2VkX3Byb2JhYmlsaXRpZXMuc2l6ZSgpOworICAgICAgZm9yIChzdGQ6OnNpemVfdCBvcmRlciA9IG1heF9vcmRlcjsgb3JkZXIgPj0gMjsgLS1vcmRlcikgeworICAgICAgICBoaWdoZXJfb3JkZXIucmVzZXQobmV3IFJlY3Vyc2UoaW5mb18sIG9yZGVyLCBtZXJnZWRfcHJvYmFiaWxpdGllc1tvcmRlciAtIDFdLCBwcm9iX291dF9bb3JkZXIgLSAxXSwgYmFja29mZl9vdXRfW29yZGVyIC0gMl0sIGJhY2tvZmZzLCBoaWdoZXJfb3JkZXIucmVsZWFzZSgpKSk7CisgICAgICAgIGJhY2tvZmZzLlNldHVwU2tpcChvcmRlciwgaGlnaGVyX29yZGVyLT5CYWNrb2ZmU3RyZWFtKCkpOworICAgICAgfQorICAgICAgaWYgKG1heF9vcmRlciA+IDEpIHsKKyAgICAgICAgaGlnaGVyX29yZGVyLT5FeHRlbmRDb250ZXh0KE5HcmFtSGVhZGVyKE5VTEwsIDApLCBsb2dfeik7CisgICAgICAgIGhpZ2hlcl9vcmRlci0+RmluaXNoKCk7CisgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgSW50ZXJwb2xhdGVJbmZvIGluZm9fOworICAgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucz4gJm1vZGVsc19ieV9vcmRlcl87CisgICAgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyBwcm9iX291dF87CisgICAgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucyBiYWNrb2ZmX291dF87Cit9OworCit9IC8vIG5hbWVzcGFjZQorCit2b2lkIE5vcm1hbGl6ZShjb25zdCBJbnRlcnBvbGF0ZUluZm8gJmluZm8sIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucz4gJm1vZGVsc19ieV9vcmRlciwgdXRpbDo6c3RyZWFtOjpDaGFpbnMgJm1lcmdlZF9wcm9iYWJpbGl0aWVzLCB1dGlsOjpzdHJlYW06OkNoYWlucyAmcHJvYl9vdXQsIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZiYWNrb2ZmX291dCkgeworICBhc3NlcnQocHJvYl9vdXQuc2l6ZSgpID09IGJhY2tvZmZfb3V0LnNpemUoKSArIDEpOworICAvLyBBcmJpdHJhcmlseSBwdXQgdGhlIHRocmVhZCBvbiB0aGUgbWVyZ2VkX3Byb2JhYmlsaXRpZXMgQ2hhaW5zLgorICBtZXJnZWRfcHJvYmFiaWxpdGllcyA+PiBUaHJlYWQoaW5mbywgbW9kZWxzX2J5X29yZGVyLCBwcm9iX291dCwgYmFja29mZl9vdXQpOworfQorCit9fSAvLyBuYW1lc3BhY2VzCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvbm9ybWFsaXplLmhoIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL25vcm1hbGl6ZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI2YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL25vcm1hbGl6ZS5oaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIExNX0lOVEVSUE9MQVRFX05PUk1BTElaRV9ICisjZGVmaW5lIExNX0lOVEVSUE9MQVRFX05PUk1BTElaRV9ICisKKyNpbmNsdWRlICJ1dGlsL2ZpeGVkX2FycmF5LmhoIgorCisvKiBQYXNzIDI6CisgKiAtIE11bHRpcGx5IGJhY2tvZmYgd2VpZ2h0cyBieSB0aGUgYmFja2VkIG9mZiBwcm9iYWJpbGl0aWVzIGZyb20gcGFzcyAxLgorICogLSBDb21wdXRlIHRoZSBub3JtYWxpemF0aW9uIGZhY3RvciBaLgorICogLSBTZW5kIFogdG8gdGhlIG5leHQgaGlnaGVzdCBvcmRlci4KKyAqIC0gUmV3aW5kIGFuZCBkaXZpZGUgYnkgWi4KKyAqLworCituYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0geworY2xhc3MgQ2hhaW5Qb3NpdGlvbnM7CitjbGFzcyBDaGFpbnM7Cit9fSAvLyBuYW1lc3BhY2VzCisKK25hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBpbnRlcnBvbGF0ZSB7CisKK3N0cnVjdCBJbnRlcnBvbGF0ZUluZm87CisKK3ZvaWQgTm9ybWFsaXplKAorICAgIGNvbnN0IEludGVycG9sYXRlSW5mbyAmaW5mbywKKyAgICAvLyBJbnB1dCBmdWxsIG1vZGVscyBmb3IgYmFja29mZnMuICBBc3N1bWVzIHRoYXQgcmVudW1iZXJpbmcgaGFzIGJlZW4gZG9uZS4gU3VmZml4IG9yZGVyLgorICAgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9ucz4gJm1vZGVsc19ieV9vcmRlciwKKyAgICAvLyBJbnB1dCBQYXJ0aWFsUHJvYkdhbW1hIGZyb20gTWVyZ2VQcm9iYWJpbGl0aWVzLiBDb250ZXh0IG9yZGVyLgorICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZtZXJnZWRfcHJvYmFiaWxpdGllcywKKyAgICAvLyBPdXRwdXQgTkdyYW08ZmxvYXQ+IHdpdGggbm9ybWFsaXplZCBwcm9iYWJpbGl0aWVzLiBDb250ZXh0IG9yZGVyLgorICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZwcm9iYWJpbGl0aWVzX291dCwKKyAgICAvLyBPdXRwdXQgYmFyZSBmbG9hdHMgd2l0aCBiYWNrb2Zmcy4gIE5vdGUgYmFja29mZnMuc2l6ZSgpID09IG9yZGVyIC0gMS4gIFN1ZmZpeCBvcmRlci4KKyAgICB1dGlsOjpzdHJlYW06OkNoYWlucyAmYmFja29mZnNfb3V0KTsKKworfX0gLy8gbmFtZXNwYWNlcworCisjZW5kaWYgLy8gTE1fSU5URVJQT0xBVEVfTk9STUFMSVpFX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9ub3JtYWxpemVfdGVzdC5jYyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9ub3JtYWxpemVfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTIyMGYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL25vcm1hbGl6ZV90ZXN0LmNjCkBAIC0wLDAgKzEsODYgQEAKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS9ub3JtYWxpemUuaGgiCisKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS9pbnRlcnBvbGF0ZV9pbmZvLmhoIgorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL21lcmdlX3Byb2JhYmlsaXRpZXMuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL25ncmFtX3N0cmVhbS5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9jaGFpbi5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9tdWx0aV9zdHJlYW0uaGgiCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgTm9ybWFsaXplVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGludGVycG9sYXRlIHsgbmFtZXNwYWNlIHsKKworLy8gbG9nIHdpdGhvdXQgYmFja29mZgorY29uc3QgZmxvYXQga0lucHV0c1tdID0gey0wLjMsIDEuMiwgLTkuOCwgNC4wLCAtNy4wLCAwLjB9OworCitjbGFzcyBXcml0ZUlucHV0IHsKKyAgcHVibGljOgorICAgIFdyaXRlSW5wdXQoKSB7fQorICAgIHZvaWQgUnVuKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiAmdG8pIHsKKyAgICAgIHV0aWw6OnN0cmVhbTo6U3RyZWFtIG91dCh0byk7CisgICAgICBmb3IgKFdvcmRJbmRleCBpID0gMDsgaSA8IHNpemVvZihrSW5wdXRzKSAvIHNpemVvZihmbG9hdCk7ICsraSwgKytvdXQpIHsKKyAgICAgICAgbWVtY3B5KG91dC5HZXQoKSwgJmksIHNpemVvZihXb3JkSW5kZXgpKTsKKyAgICAgICAgbWVtY3B5KCh1aW50OF90KilvdXQuR2V0KCkgKyBzaXplb2YoV29yZEluZGV4KSwgJmtJbnB1dHNbaV0sIHNpemVvZihmbG9hdCkpOworICAgICAgfQorICAgICAgb3V0LlBvaXNvbigpOworICAgIH0KK307CisKK3ZvaWQgQ2hlY2tPdXRwdXQoY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZmcm9tKSB7CisgIE5HcmFtU3RyZWFtPGZsb2F0PiBpbihmcm9tKTsKKyAgZmxvYXQgc3VtID0gMC4wOworICBmb3IgKFdvcmRJbmRleCBpID0gMDsgaSA8IHNpemVvZihrSW5wdXRzKSAvIHNpemVvZihmbG9hdCkgLSAxIC8qIDxzPiBhdCB0aGUgZW5kICovOyArK2kpIHsKKyAgICBzdW0gKz0gcG93KDEwLjAsIGtJbnB1dHNbaV0pOworICB9CisgIHN1bSA9IGxvZzEwKHN1bSk7CisgIEJPT1NUX1JFUVVJUkUoaW4pOworICBCT09TVF9DSEVDS19DTE9TRShrSW5wdXRzWzBdIC0gc3VtLCBpbi0+VmFsdWUoKSwgMC4wMDAxKTsKKyAgQk9PU1RfUkVRVUlSRSgrK2luKTsKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0Uoa0lucHV0c1sxXSAtIHN1bSwgaW4tPlZhbHVlKCksIDAuMDAwMSk7CisgIEJPT1NUX1JFUVVJUkUoKytpbik7CisgIEJPT1NUX0NIRUNLX0NMT1NFKGtJbnB1dHNbMl0gLSBzdW0sIGluLT5WYWx1ZSgpLCAwLjAwMDEpOworICBCT09TVF9SRVFVSVJFKCsraW4pOworICBCT09TVF9DSEVDS19DTE9TRShrSW5wdXRzWzNdIC0gc3VtLCBpbi0+VmFsdWUoKSwgMC4wMDAxKTsKKyAgQk9PU1RfUkVRVUlSRSgrK2luKTsKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0Uoa0lucHV0c1s0XSAtIHN1bSwgaW4tPlZhbHVlKCksIDAuMDAwMSk7CisgIEJPT1NUX1JFUVVJUkUoKytpbik7CisgIEJPT1NUX0NIRUNLX0NMT1NFKGtJbnB1dHNbNV0gLSBzdW0sIGluLT5WYWx1ZSgpLCAwLjAwMDEpOworICBCT09TVF9DSEVDSyghKytpbik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFVuaWdyYW1zKSB7CisgIEludGVycG9sYXRlSW5mbyBpbmZvOworICBpbmZvLmxhbWJkYXMucHVzaF9iYWNrKDIuMCk7CisgIGluZm8ubGFtYmRhcy5wdXNoX2JhY2soLTAuMSk7CisgIGluZm8ub3JkZXJzLnB1c2hfYmFjaygxKTsKKyAgaW5mby5vcmRlcnMucHVzaF9iYWNrKDEpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIE1ha2VFbmNvZGVyKGluZm8sIDEpLkVuY29kZWRMZW5ndGgoKSk7CisKKyAgLy8gTm8gYmFja29mZnMuCisgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zIGJsYW5rKDApOworICB1dGlsOjpGaXhlZEFycmF5PHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnM+IG1vZGVsc19ieV9vcmRlcigyKTsKKyAgbW9kZWxzX2J5X29yZGVyLnB1c2hfYmFjayhibGFuayk7CisgIG1vZGVsc19ieV9vcmRlci5wdXNoX2JhY2soYmxhbmspOworCisgIHV0aWw6OnN0cmVhbTo6Q2hhaW5zIG1lcmdlZF9wcm9iYWJpbGl0aWVzKDEpOworICB1dGlsOjpzdHJlYW06OkNoYWlucyBwcm9iYWJpbGl0aWVzX291dCgxKTsKKyAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgYmFja29mZnNfb3V0KDApOworCisgIG1lcmdlZF9wcm9iYWJpbGl0aWVzLnB1c2hfYmFjayh1dGlsOjpzdHJlYW06OkNoYWluQ29uZmlnKHNpemVvZihXb3JkSW5kZXgpICsgc2l6ZW9mKGZsb2F0KSArIHNpemVvZihmbG9hdCksIDIsIDI0KSk7CisgIHByb2JhYmlsaXRpZXNfb3V0LnB1c2hfYmFjayh1dGlsOjpzdHJlYW06OkNoYWluQ29uZmlnKHNpemVvZihXb3JkSW5kZXgpICsgc2l6ZW9mKGZsb2F0KSwgMiwgMTAwKSk7CisKKyAgbWVyZ2VkX3Byb2JhYmlsaXRpZXNbMF0gPj4gV3JpdGVJbnB1dCgpOworICBOb3JtYWxpemUoaW5mbywgbW9kZWxzX2J5X29yZGVyLCBtZXJnZWRfcHJvYmFiaWxpdGllcywgcHJvYmFiaWxpdGllc19vdXQsIGJhY2tvZmZzX291dCk7CisKKyAgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uIGNoZWNrZXIocHJvYmFiaWxpdGllc19vdXRbMF0uQWRkKCkpOworCisgIG1lcmdlZF9wcm9iYWJpbGl0aWVzID4+IHV0aWw6OnN0cmVhbTo6a1JlY3ljbGU7CisgIHByb2JhYmlsaXRpZXNfb3V0ID4+IHV0aWw6OnN0cmVhbTo6a1JlY3ljbGU7CisKKyAgQ2hlY2tPdXRwdXQoY2hlY2tlcik7CisgIHByb2JhYmlsaXRpZXNfb3V0LldhaXQoKTsKK30KKworfX19IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9wZXJmX2VudW1fZ3ZfbWFpbi5jYyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9wZXJmX2VudW1fZ3ZfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjhlOWU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3BlcmZfZW51bV9ndl9tYWluLmNjCkBAIC0wLDAgKzEsMjE1IEBACisvKgorVXNhZ2UgZXhhbXBsZQorMSkgRG93bmxvYWQgZnJvbSBodHRwOi8vd3d3Lmd3aW5udXAub3JnL2xtaW50ZXJwL3RyYWluLXBhcmFtcy1vdXRwdXQudGFyLmJ6MgorMikgdGhlbiBydW4gICAgICBwZXJmX2VudW1fZ3YgLXQgbG0uZW4uZGV2IC1tIG1vZGVsLWEuMy5zcmlsbSAtbSBtb2RlbC1iLjMuc3JpbG0gLW0gbW9kZWwtYy4zLnNyaWxtCisgKi8KKworI2luY2x1ZGUgImxtL25ncmFtX3F1ZXJ5LmhoIgorI2luY2x1ZGUgImxtL21vZGVsLmhoIgorI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvZW51bWVyYXRlX2dsb2JhbF92b2NhYi5oaCIKKworI2luY2x1ZGUgInV0aWwvZml4ZWRfYXJyYXkuaGgiCisjaW5jbHVkZSAidXRpbC91c2FnZS5oaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZvcmVhY2guaHBwPgorCisjaW5jbHVkZSA8RWlnZW4vRWlnZW4+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCitpbmxpbmUgZG91YmxlIGRlbHRhVFYoY29uc3QgdGltZXZhbCYgcywgY29uc3QgdGltZXZhbCYgZSkKK3sKKyAgICByZXR1cm4gKGUudHZfc2VjIC0gcy50dl9zZWMpKjEwMDAuMCArIChlLnR2X3VzZWMgLSBzLnR2X3VzZWMpLzEwMDAuMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgdGltZXZhbCBXYWxsOworV2FsbCBHZXRXYWxsKCkgeworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgIHJldHVybiB0djsKK30KKwordHlwZWRlZiBFaWdlbjo6TWF0cml4WGYgRk1hdHJpeDsKK3R5cGVkZWYgRWlnZW46OlZlY3RvclhmIEZWZWN0b3I7CisKKworYm9vbCBIQVNfQklBUyA9IHRydWU7CisKK3VzaW5nIG5hbWVzcGFjZSBsbTo6bmdyYW07Cit1c2luZyBuYW1lc3BhY2UgbG07CisKK2lubGluZSB2b2lkIGxvZ1Byb2IoTW9kZWwgKiBtb2RlbCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjdHgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB3b3JkKSB7CisKKyAgLy8gSG9ycmlibHkgaW5lZmZpY2llbnQKKyAgY29uc3QgVm9jYWJ1bGFyeSAmdm9jYWIgPSBtb2RlbC0+R2V0Vm9jYWJ1bGFyeSgpOworCisgIFN0YXRlIG5leHRTdGF0ZTsgLy90aHJvd2F3YXkKKworICBXb3JkSW5kZXggd29yZF9pZHggPSB2b2NhYi5JbmRleCh3b3JkKTsKKyAgV29yZEluZGV4IGNvbnRleHRfaWR4W2N0eC5zaXplKCldOworCisgIC8vcmV2ZXJzZSBjb250ZXh0CisgIGZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjdHguc2l6ZSgpOyBpKyspIHsKKyAgICBjb250ZXh0X2lkeFtjdHguc2l6ZSgpIC0gMSAtIGldID0gdm9jYWIuSW5kZXgoY3R4W2ldKTsKKyAgfQorICBGdWxsU2NvcmVSZXR1cm4gc2NvcmUgPSBtb2RlbC0+RnVsbFNjb3JlRm9yZ290U3RhdGUoY29udGV4dF9pZHgsICYoY29udGV4dF9pZHhbY3R4LnNpemUoKSAtMV0pLCB3b3JkX2lkeCwgbmV4dFN0YXRlKTsgICAgCit9CisKK3ZvaWQgc2V0X2ZlYXR1cmVzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY3R4LAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHdvcmQsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNb2RlbCAqPiYgbW9kZWxzLAorICAgICAgICAgICAgICAgICAgRlZlY3RvciYgdikgeworCisgIGZvciAodW5zaWduZWQgaT0wOyBpIDwgbW9kZWxzLnNpemUoKTsgKytpKQorICAgIGxvZ1Byb2IobW9kZWxzW2ldLCBjdHgsIHdvcmQpOworCit9CisKKy8vY29uc3QgdXRpbDo6Rml4ZWRBcnJheTxNb2RlbCAqPiYgbW9kZWxzKQordm9pZCB0cmFpbl9wYXJhbXMoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ID4mIGNvcnB1cywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHZvY2FiLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1vZGVsICo+JiBtb2RlbHMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworICB2ZWN0b3I8c3RyaW5nPiBjb250ZXh0KDUsICI8cz4iKTsKKyAgY29uc3QgaW50IElURVJBVElPTlMgPSAxMDsKKyAgY29uc3QgaW50IG5sYW1iZGFzID0gbW9kZWxzLnNpemUoKTsgLy8gI21vZGVscworICBGVmVjdG9yIHBhcmFtcyA9IEZWZWN0b3I6Olplcm8obmxhbWJkYXMpOworICB2ZWN0b3I8RlZlY3Rvcj4gZmVhdHModm9jYWIuc2l6ZSgpLCBwYXJhbXMpOworICBzdGF0aWMgV2FsbCBzdGFydCxzdG9wOworCisgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgSVRFUkFUSU9OUzsgKytpdGVyKSB7IC8vIGl0ZXJhdGlvbnMKKyAgICBzdGQ6OmNvdXQgPDwgIml0ZXJhdGlvbjogIiA8PCBpdGVyIAorICAgICAgICAgICAgICA8PCAiIGNvcnB1cyBzaXplICIgPDwgY29ycHVzLnNpemUoKSAKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIGZvciAodW5zaWduZWQgY2kgPSAwOyBjaSA8IGNvcnB1cy5zaXplKCk7ICsrY2kpIHsgLy8gc2VudGVuY2VzIGluIHR1bmluZyBjb3JwdXMKKyAgICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBzZW50ZW5jZSA9IGNvcnB1c1tjaV07CisgICAgICBjb250ZXh0LnJlc2l6ZSg1KTsKKyAgICAgIGZvciAodW5zaWduZWQgdCA9IDA7IHQgPCBzZW50ZW5jZS5zaXplKCk7ICsrdCkgeyAvLyB3b3JkcyBpbiBzZW50ZW5jZQorICAgICAgICBzdGQ6OmNvdXQgPDwgICJzZW50ZW5jZSAiIDw8IGNpIDw8ICIgd29yZCAiIDw8IHQgPDwgc3RkOjplbmRsOworICAgICAgICBzdGFydCA9IEdldFdhbGwoKTsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiByZWZfd29yZF9zdHJpbmcgPSBzZW50ZW5jZVt0XTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZvY2FiLnNpemUoKTsgKytpKSB7IC8vIHZvY2FiCisgICAgICAgICAgc2V0X2ZlYXR1cmVzKGNvbnRleHQsIHZvY2FiW2ldLCBtb2RlbHMsIGZlYXRzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBzdG9wID0gR2V0V2FsbCgpOworICAgICAgICBzdGQ6OmNvdXQgPDwgIiB0aW1lIGVsYXBzZWQgPSAiIDw8IGRlbHRhVFYoc3RhcnQsc3RvcCkgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgY29udGV4dC5wdXNoX2JhY2socmVmX3dvcmRfc3RyaW5nKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisKKyAgc3RkOjpzdHJpbmcgdHVuaW5nX2RhdGE7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsbXM7CisKKyAgdHJ5IHsKKyAgICBuYW1lc3BhY2UgcG8gPSBib29zdDo6cHJvZ3JhbV9vcHRpb25zOworICAgIHBvOjpvcHRpb25zX2Rlc2NyaXB0aW9uIG9wdGlvbnMoInRyYWluLXBhcmFtcyIpOworCisgICAgb3B0aW9ucy5hZGRfb3B0aW9ucygpCisgICAgICAoImhlbHAsaCIsIHBvOjpib29sX3N3aXRjaCgpLCAiU2hvdyB0aGlzIGhlbHAgbWVzc2FnZSIpCisgICAgICAoIm5vX2JpYXNfdGVybSxCIiwgcG86OmJvb2xfc3dpdGNoKCksICJEbyBub3QgaW5jbHVkZSBhICdiaWFzJyBmZWF0dXJlIikKKyAgICAgICgidHVuaW5nX2RhdGEsdCIsIHBvOjp2YWx1ZTxzdGQ6OnN0cmluZz4oJnR1bmluZ19kYXRhKSwgIkZpbGUgdG8gdHVuZSBwZXJwbGV4aXR5IG9uIikKKyAgICAgICgibW9kZWwsbSIsIHBvOjp2YWx1ZTxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPigmbG1zKSwgIkxhbmd1YWdlIG1vZGVscyBpbiBLZW5MTSBmb3JtYXQgdG8gaW50ZXJwb2xhdGUiKTsKKyAgICBwbzo6dmFyaWFibGVzX21hcCB2bTsKKyAgICBwbzo6c3RvcmUocG86OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBvcHRpb25zKSwgdm0pOworCisgICAgLy8gRGlzcGxheSBoZWxwCisgICAgaWYoYXJnYyA9PSAxIHx8IHZtWyJoZWxwIl0uYXM8Ym9vbD4oKSkgeworICAgICAgc3RkOjpjZXJyIDw8IG9wdGlvbnMgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICh2bVsibm9fYmlhc190ZXJtIl0uYXM8Ym9vbD4oKSkKKyAgICAgIEhBU19CSUFTID0gZmFsc2U7CisgICAgbG1zID0gdm1bIm1vZGVsIl0uYXM8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ID4oKTsKKyAgICB0dW5pbmdfZGF0YSA9IHZtWyJ0dW5pbmdfZGF0YSJdLmFzPHN0ZDo6c3RyaW5nPigpOworICB9CisgIGNhdGNoKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZlKSB7CisKKyAgICBzdGQ6OmNlcnIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAxOworCisgIH0KKyAgaWYgKGxtcy5zaXplKCkgPCAyKSB7CisgICAgc3RkOjpjZXJyIDw8ICJQbGVhc2Ugc3BlY2lmeSBhdCBsZWFzdCB0d28gbGFuZ3VhZ2UgbW9kZWwgZmlsZXMgd2l0aCAtbSBMTS5LTE1cbiI7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHR1bmluZ19kYXRhLmVtcHR5KCkpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlBsZWFzZSBzcGVjaWZ5IHR1bmluZyBzZXQgd2l0aCAtdCBGSUxFLlRYVFxuIjsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQqPiB2bWFwOworICB1dGlsOjpGaXhlZEFycmF5PFdvcmRJbmRleD4gdm0oMik7CisKKyAgLy9zdHVmZiBpdCBpbnRvIHRoZQorICBFbnVtZXJhdGVHbG9iYWxWb2NhYiAqIGdsb2JhbFZvY2FiQnVpbGRlciA9IG5ldyBFbnVtZXJhdGVHbG9iYWxWb2NhYigmdm1hcCwgbG1zLnNpemUoKSk7CisgIC8vIEVudW1lcmF0ZUdsb2JhbFZvY2FiICogZ2xvYmFsVm9jYWJCdWlsZGVyID0gbmV3IEVudW1lcmF0ZUdsb2JhbFZvY2FiKHZtKTsKKworICBDb25maWcgY2ZnOworICBjZmcuZW51bWVyYXRlX3ZvY2FiID0gKEVudW1lcmF0ZVZvY2FiICopIGdsb2JhbFZvY2FiQnVpbGRlcjsKKworICAvL2xvYWQgbW9kZWxzCisgIC8vdXRpbDo6Rml4ZWRBcnJheTxNb2RlbCAqPiBtb2RlbHMobG1zLnNpemUoKSk7CisgIHN0ZDo6dmVjdG9yPE1vZGVsICo+IG1vZGVsczsKKyAgZm9yKGludCBpPTA7IGkgPCBsbXMuc2l6ZSgpOyBpKyspIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkxvYWRpbmcgTE0gZmlsZTogIiA8PCBsbXNbaV0gPDwgc3RkOjplbmRsOworCisgICAgLy9oYWFhYWNrCisgICAgZ2xvYmFsVm9jYWJCdWlsZGVyLT5TZXRDdXJNb2RlbChpKTsgLy95ZXMgdGhpcyBpcyBkdW1iCisKKyAgICAvL21vZGVsc1tpXSA9IG5ldyBNb2RlbChsbXNbaV0uY19zdHIoKSk7CisgICAgTW9kZWwgKiB0aGlzX21vZGVsID0gbmV3IE1vZGVsKGxtc1tpXS5jX3N0cigpLCBjZmcpOworICAgIG1vZGVscy5wdXNoX2JhY2soIHRoaXNfbW9kZWwgKTsKKworICB9CisKKyAgLy9hc3NlbWJsZSB2b2NhYnVsYXJ5IHZlY3RvcgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdm9jYWI7CisgIHN0ZDo6Y2VyciA8PCAiR2xvYmFsIFZvY2FiIE1hcCBoYXMgc2l6ZTogIiA8PCB2bWFwLnNpemUoKSA8PCBzdGQ6OmVuZGw7CisKKyAgc3RkOjpwYWlyPFN0cmluZ1BpZWNlLGludCAqPiBtZTsKKworICBmb3Ioc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludCo+OjppdGVyYXRvciBpdGVyID0gdm1hcC5iZWdpbigpOyBpdGVyICE9IHZtYXAuZW5kKCk7ICsraXRlcikgeworICAgIHZvY2FiLnB1c2hfYmFjayhpdGVyLT5maXJzdCk7CisgIH0KKyAgc3RkOjpjZXJyIDw8ICJWb2NhYiB2ZWN0b3IgaGFzIHNpemU6ICIgPDwgdm9jYWIuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKworICAvL2xvYWQgY29udGV4dCBzb3J0ZWQgbmdyYW1zIGludG8gdmVjdG9yIG9mIHZlY3RvcnMKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ID4gY29ycHVzOworCisgIHN0ZDo6Y2VyciA8PCAiTG9hZGluZyBjb250ZXh0LXNvcnRlZCBuZ3JhbXM6ICIgPDwgdHVuaW5nX2RhdGEgPDwgc3RkOjplbmRsOworICBzdGQ6Omlmc3RyZWFtIGluZmlsZSh0dW5pbmdfZGF0YSk7CisKKyAgZm9yKHN0ZDo6c3RyaW5nIGxpbmU7IHN0ZDo6Z2V0bGluZShpbmZpbGUsIGxpbmUpOyApIHsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB3b3JkczsgeworCisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW0obGluZSk7CisgICAgICBzdGQ6OnN0cmluZyB3b3JkOworCisgICAgICB3aGlsZShzdHJlYW0gPj4gd29yZCkgeworICAgICAgICB3b3Jkcy5wdXNoX2JhY2sod29yZCk7CisgICAgICB9CisgICAgfQorICAgIGNvcnB1cy5wdXNoX2JhY2sod29yZHMpOworICB9CisKKyAgdHJhaW5fcGFyYW1zKGNvcnB1cywgdm9jYWIsIG1vZGVscyk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvcGlwZWxpbmUuY2MgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvcGlwZWxpbmUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiODI4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9waXBlbGluZS5jYwpAQCAtMCwwICsxLDE1OSBAQAorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL3BpcGVsaW5lLmhoIgorCisjaW5jbHVkZSAibG0vY29tbW9uL2NvbXBhcmUuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL3ByaW50LmhoIgorI2luY2x1ZGUgImxtL2NvbW1vbi9yZW51bWJlci5oaCIKKyNpbmNsdWRlICJsbS92b2NhYi5oaCIKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS9iYWNrb2ZmX3JldW5pZmljYXRpb24uaGgiCisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvaW50ZXJwb2xhdGVfaW5mby5oaCIKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS9tZXJnZV9wcm9iYWJpbGl0aWVzLmhoIgorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL21lcmdlX3ZvY2FiLmhoIgorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL25vcm1hbGl6ZS5oaCIKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS91bml2ZXJzYWxfdm9jYWIuaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY2hhaW4uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY291bnRfcmVjb3Jkcy5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9pby5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9tdWx0aV9zdHJlYW0uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vc29ydC5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpeGVkX2FycmF5LmhoIgorCituYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgaW50ZXJwb2xhdGUgeyBuYW1lc3BhY2UgeworCisvKiBQdXQgdGhlIG9yaWdpbmFsIGlucHV0IGZpbGVzIG9uIGNoYWlucyBhbmQgcmVudW1iZXIgdGhlbSAqLwordm9pZCBTZXR1cElucHV0cyhzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZSwgY29uc3QgVW5pdmVyc2FsVm9jYWIgJnZvY2FiLCB1dGlsOjpGaXhlZEFycmF5PE1vZGVsQnVmZmVyPiAmbW9kZWxzLCBib29sIGV4Y2x1ZGVfaGlnaGVzdCwgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkNoYWlucz4gJmNoYWlucywgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zPiAmcG9zaXRpb25zKSB7CisgIGNoYWlucy5jbGVhcigpOworICBwb3NpdGlvbnMuY2xlYXIoKTsKKyAgLy8gVE9ETzogbXVjaCBiZXR0ZXIgbWVtb3J5IHNpemluZyBoZXVyaXN0aWNzIGUuZy4gbm90IG1ha2luZyB0aGUgY2hhaW4gbGFyZ2VyIHRoYW4gaXQgd2lsbCB1c2UuCisgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Db25maWcgY29uZmlnKDAsIDIsIGJ1ZmZlcl9zaXplKTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1vZGVscy5zaXplKCk7ICsraSkgeworICAgIGNoYWlucy5wdXNoX2JhY2sobW9kZWxzW2ldLk9yZGVyKCkgLSBleGNsdWRlX2hpZ2hlc3QpOworICAgIGZvciAoc3RkOjpzaXplX3QgaiA9IDA7IGogPCBtb2RlbHNbaV0uT3JkZXIoKSAtIGV4Y2x1ZGVfaGlnaGVzdDsgKytqKSB7CisgICAgICBjb25maWcuZW50cnlfc2l6ZSA9IHNpemVvZihXb3JkSW5kZXgpICogKGogKyAxKSArIHNpemVvZihmbG9hdCkgKiAyOyAvLyBUT0RPIGRvIG5vdCBpbmNsdWRlIHdhc3RlZnVsIGJhY2tvZmYgZm9yIGhpZ2hlc3QuCisgICAgICBjaGFpbnMuYmFjaygpLnB1c2hfYmFjayhjb25maWcpOworICAgIH0KKyAgICBtb2RlbHNbaV0uU291cmNlKGNoYWlucy5iYWNrKCkpOworICAgIGZvciAoc3RkOjpzaXplX3QgaiA9IDA7IGogPCBtb2RlbHNbaV0uT3JkZXIoKSAtIGV4Y2x1ZGVfaGlnaGVzdDsgKytqKSB7CisgICAgICBjaGFpbnNbaV1bal0gPj4gUmVudW1iZXIodm9jYWIuTWFwcGluZyhpKSwgaiArIDEpOworICAgIH0KKyAgfQorIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBjaGFpbnMuc2l6ZSgpOyArK2kpIHsKKyAgICBwb3NpdGlvbnMucHVzaF9iYWNrKGNoYWluc1tpXSk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFNvcnRPcmRlcj4gdm9pZCBBcHBseVNvcnQoY29uc3QgdXRpbDo6c3RyZWFtOjpTb3J0Q29uZmlnICZjb25maWcsIHV0aWw6OnN0cmVhbTo6Q2hhaW5zICZjaGFpbnMpIHsKKyAgdXRpbDo6c3RyZWFtOjpTb3J0czxTb3J0T3JkZXI+IHNvcnRzKGNoYWlucy5zaXplKCkpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgY2hhaW5zLnNpemUoKTsgKytpKSB7CisgICAgc29ydHMucHVzaF9iYWNrKGNoYWluc1tpXSwgY29uZmlnLCBTb3J0T3JkZXIoaSArIDEpKTsKKyAgfQorICBjaGFpbnMuV2FpdCh0cnVlKTsKKyAgLy8gVE9ETyBtZW1vcnkgbWFuYWdlbWVudAorICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc29ydHMuc2l6ZSgpOyArK2kpIHsKKyAgICBzb3J0c1tpXS5NZXJnZShzb3J0c1tpXS5EZWZhdWx0TGF6eSgpKTsKKyAgfQorICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc29ydHMuc2l6ZSgpOyArK2kpIHsKKyAgICBzb3J0c1tpXS5PdXRwdXQoY2hhaW5zW2ldLCBzb3J0c1tpXS5EZWZhdWx0TGF6eSgpKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UKKwordm9pZCBQaXBlbGluZSh1dGlsOjpGaXhlZEFycmF5PE1vZGVsQnVmZmVyPiAmbW9kZWxzLCBjb25zdCBDb25maWcgJmNvbmZpZywgaW50IHdyaXRlX2ZpbGUpIHsKKyAgLy8gU2V0dXAgSW50ZXJwb2xhdGVJbmZvIGFuZCBVbml2ZXJzYWxWb2NhYi4KKyAgSW50ZXJwb2xhdGVJbmZvIGluZm87CisgIGluZm8ubGFtYmRhcyA9IGNvbmZpZy5sYW1iZGFzOworICBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+IHZvY2FiX3NpemVzOworCisgIHV0aWw6OnNjb3BlZF9mZCB2b2NhYl9udWxsKHV0aWw6Ok1ha2VUZW1wKGNvbmZpZy5zb3J0LnRlbXBfcHJlZml4KSk7CisgIHN0ZDo6c2l6ZV90IG1heF9vcmRlciA9IDA7CisgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c2NvcGVkX2ZkPiB2b2NhYl9maWxlcyhtb2RlbHMuc2l6ZSgpKTsKKyAgZm9yIChNb2RlbEJ1ZmZlciAqaSA9IG1vZGVscy5iZWdpbigpOyBpICE9IG1vZGVscy5lbmQoKTsgKytpKSB7CisgICAgaW5mby5vcmRlcnMucHVzaF9iYWNrKGktPk9yZGVyKCkpOworICAgIHZvY2FiX3NpemVzLnB1c2hfYmFjayhpLT5Db3VudHMoKVswXSk7CisgICAgdm9jYWJfZmlsZXMucHVzaF9iYWNrKHV0aWw6OkR1cE9yVGhyb3coaS0+Vm9jYWJGaWxlKCkpKTsKKyAgICBtYXhfb3JkZXIgPSBzdGQ6Om1heChtYXhfb3JkZXIsIGktPk9yZGVyKCkpOworICB9CisgIFVuaXZlcnNhbFZvY2FiIHZvY2FiKHZvY2FiX3NpemVzKTsKKyAgeworICAgIG5ncmFtOjpJbW1lZGlhdGVXcml0ZVdvcmRzV3JhcHBlciB3cml0ZXIoTlVMTCwgdm9jYWJfbnVsbC5nZXQoKSwgMCk7CisgICAgTWVyZ2VWb2NhYih2b2NhYl9maWxlcywgdm9jYWIsIHdyaXRlcik7CisgIH0KKyAgdm9jYWJfZmlsZXMuY2xlYXIoKTsKKworICBzdGQ6OmNlcnIgPDwgIk1lcmdpbmcgcHJvYmFiaWxpdGllcy4iIDw8IHN0ZDo6ZW5kbDsKKyAgLy8gUGFzcyAxOiBtZXJnZSBwcm9iYWJpbGl0aWVzCisgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpbnM+IGlucHV0X2NoYWlucyhtb2RlbHMuc2l6ZSgpKTsKKyAgdXRpbDo6Rml4ZWRBcnJheTx1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zPiBtb2RlbHNfYnlfb3JkZXIobW9kZWxzLnNpemUoKSk7CisgIFNldHVwSW5wdXRzKGNvbmZpZy5CdWZmZXJTaXplKCksIHZvY2FiLCBtb2RlbHMsIGZhbHNlLCBpbnB1dF9jaGFpbnMsIG1vZGVsc19ieV9vcmRlcik7CisKKyAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgbWVyZ2VkX3Byb2JzKG1heF9vcmRlcik7CisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtYXhfb3JkZXI7ICsraSkgeworICAgIG1lcmdlZF9wcm9icy5wdXNoX2JhY2sodXRpbDo6c3RyZWFtOjpDaGFpbkNvbmZpZyhQYXJ0aWFsUHJvYkdhbW1hOjpUb3RhbFNpemUoaW5mbywgaSArIDEpLCAyLCBjb25maWcuQnVmZmVyU2l6ZSgpKSk7IC8vIFRPRE86IG5vdCBidWZmZXJfc2l6ZQorICB9CisgIE1lcmdlUHJvYmFiaWxpdGllcyhpbmZvLCBtb2RlbHNfYnlfb3JkZXIsIG1lcmdlZF9wcm9icyk7CisgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBjb3VudHMobWF4X29yZGVyKTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1heF9vcmRlcjsgKytpKSB7CisgICAgbWVyZ2VkX3Byb2JzW2ldID4+IHV0aWw6OnN0cmVhbTo6Q291bnRSZWNvcmRzKCZjb3VudHNbaV0pOworICB9CisKKyAgLy8gUGFzcyAyOiBub3JtYWxpemUuCisgIEFwcGx5U29ydDxDb250ZXh0T3JkZXI+KGNvbmZpZy5zb3J0LCBtZXJnZWRfcHJvYnMpOworICBzdGQ6OmNlcnIgPDwgIk5vcm1hbGl6aW5nIiA8PCBzdGQ6OmVuZGw7CisgIFNldHVwSW5wdXRzKGNvbmZpZy5CdWZmZXJTaXplKCksIHZvY2FiLCBtb2RlbHMsIHRydWUsIGlucHV0X2NoYWlucywgbW9kZWxzX2J5X29yZGVyKTsKKyAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgcHJvYmFiaWxpdGllcyhtYXhfb3JkZXIpLCBiYWNrb2ZmcyhtYXhfb3JkZXIgLSAxKTsKKyAgc3RkOjpzaXplX3QgYmxvY2tfY291bnQgPSAyOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbWF4X29yZGVyOyArK2kpIHsKKyAgICAvLyBDYXJlZnVsIGFjY291bnRpbmcgdG8gZW5zdXJlIFJld2luZGFibGVTdHJlYW0gY2FuIGZpdCB0aGUgZW50aXJlIHZvY2FidWxhcnkuCisgICAgYmxvY2tfY291bnQgPSBzdGQ6Om1heDxzdGQ6OnNpemVfdD4oYmxvY2tfY291bnQsIDIpOworICAgIC8vIFRoaXMgbXVjaCBuZWVkcyB0byBmaXQgaW4gUmV3aW5kYWJsZVN0cmVhbS4KKyAgICBzdGQ6OnNpemVfdCBmaXQgPSBOR3JhbTxmbG9hdD46OlRvdGFsU2l6ZShpICsgMSkgKiBjb3VudHNbMF07CisgICAgLy8gZml0IC8gKGJsb2NrX2NvdW50IC0gMSkgcm91bmRlZCB1cAorICAgIHN0ZDo6c2l6ZV90IG1pbl9ibG9jayA9IChmaXQgKyBibG9ja19jb3VudCAtIDIpIC8gKGJsb2NrX2NvdW50IC0gMSk7CisgICAgc3RkOjpzaXplX3Qgc3BlY2lmeSA9IHN0ZDo6bWF4KGNvbmZpZy5CdWZmZXJTaXplKCksIG1pbl9ibG9jayAqIGJsb2NrX2NvdW50KTsKKyAgICBwcm9iYWJpbGl0aWVzLnB1c2hfYmFjayh1dGlsOjpzdHJlYW06OkNoYWluQ29uZmlnKE5HcmFtPGZsb2F0Pjo6VG90YWxTaXplKGkgKyAxKSwgYmxvY2tfY291bnQsIHNwZWNpZnkpKTsKKyAgfQorICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbWF4X29yZGVyIC0gMTsgKytpKSB7CisgICAgYmFja29mZnMucHVzaF9iYWNrKHV0aWw6OnN0cmVhbTo6Q2hhaW5Db25maWcoc2l6ZW9mKGZsb2F0KSwgMiwgY29uZmlnLkJ1ZmZlclNpemUoKSkpOworICB9CisgIE5vcm1hbGl6ZShpbmZvLCBtb2RlbHNfYnlfb3JkZXIsIG1lcmdlZF9wcm9icywgcHJvYmFiaWxpdGllcywgYmFja29mZnMpOworCisgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpGaWxlQnVmZmVyPiBiYWNrb2ZmX2J1ZmZlcnMoYmFja29mZnMuc2l6ZSgpKTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1heF9vcmRlciAtIDE7ICsraSkgeworICAgIGJhY2tvZmZfYnVmZmVycy5wdXNoX2JhY2sodXRpbDo6TWFrZVRlbXAoY29uZmlnLnNvcnQudGVtcF9wcmVmaXgpKTsKKyAgICBiYWNrb2Zmc1tpXSA+PiBiYWNrb2ZmX2J1ZmZlcnMuYmFjaygpLlNpbmsoKTsKKyAgfQorCisgIC8vIFBhc3MgMzogYmFja29mZnMgaW4gdGhlIHJpZ2h0IHBsYWNlLgorICBBcHBseVNvcnQ8U3VmZml4T3JkZXI+KGNvbmZpZy5zb3J0LCBwcm9iYWJpbGl0aWVzKTsKKyAgLy8gVE9ETyBkZXN0cm95IHVuaXZlcnNhbCB2b2NhYiB0byBzYXZlIFJBTS4KKyAgLy8gVE9ETyB0aGVzZSBzaG91bGQgYmUgZnJlZWQgYmVmb3JlIG1lcmdlIHNvcnQgaGFwcGVucyBpbiB0aGUgYWJvdmUgZnVuY3Rpb24uCisgIGJhY2tvZmZzLldhaXQodHJ1ZSk7CisgIG1lcmdlZF9wcm9icy5XYWl0KHRydWUpOworICBzdGQ6OmNlcnIgPDwgIlJldW5pZnlpbmcgYmFja29mZnMiIDw8IHN0ZDo6ZW5kbDsKKworICB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb25zIHByb2JfcG9zKG1heF9vcmRlciAtIDEpOworICB1dGlsOjpzdHJlYW06OkNoYWlucyBjb21iaW5lZChtYXhfb3JkZXIgLSAxKTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1heF9vcmRlciAtIDE7ICsraSkgeworICAgIGJhY2tvZmZzW2ldID4+IGJhY2tvZmZfYnVmZmVyc1tpXS5Tb3VyY2UodHJ1ZSk7CisgICAgcHJvYl9wb3MucHVzaF9iYWNrKHByb2JhYmlsaXRpZXNbaV0uQWRkKCkpOworICAgIGNvbWJpbmVkLnB1c2hfYmFjayh1dGlsOjpzdHJlYW06OkNoYWluQ29uZmlnKE5HcmFtPFByb2JCYWNrb2ZmPjo6VG90YWxTaXplKGkgKyAxKSwgMiwgY29uZmlnLkJ1ZmZlclNpemUoKSkpOworICB9CisgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgYmFja29mZl9wb3MoYmFja29mZnMpOworCisgIFJldW5pZnlCYWNrb2ZmKHByb2JfcG9zLCBiYWNrb2ZmX3BvcywgY29tYmluZWQpOworCisgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbnMgb3V0cHV0X3BvcyhtYXhfb3JkZXIpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbWF4X29yZGVyIC0gMTsgKytpKSB7CisgICAgb3V0cHV0X3Bvcy5wdXNoX2JhY2soY29tYmluZWRbaV0uQWRkKCkpOworICB9CisgIG91dHB1dF9wb3MucHVzaF9iYWNrKHByb2JhYmlsaXRpZXMuYmFjaygpLkFkZCgpKTsKKworICBwcm9iYWJpbGl0aWVzID4+IHV0aWw6OnN0cmVhbTo6a1JlY3ljbGU7CisgIGJhY2tvZmZzID4+IHV0aWw6OnN0cmVhbTo6a1JlY3ljbGU7CisgIGNvbWJpbmVkID4+IHV0aWw6OnN0cmVhbTo6a1JlY3ljbGU7CisKKyAgLy8gVE9ETyBnZW5lcmljaXplIHRvIE1vZGVsQnVmZmVyIGV0Yy4KKyAgUHJpbnRBUlBBKHZvY2FiX251bGwuZ2V0KCksIHdyaXRlX2ZpbGUsIGNvdW50cykuUnVuKG91dHB1dF9wb3MpOworfQorCit9fSAvLyBuYW1lc3BhY2VzCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvcGlwZWxpbmUuaGggYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvcGlwZWxpbmUuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwMDI0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9waXBlbGluZS5oaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIExNX0lOVEVSUE9MQVRFX1BJUEVMSU5FX0gKKyNkZWZpbmUgTE1fSU5URVJQT0xBVEVfUElQRUxJTkVfSAorCisjaW5jbHVkZSAibG0vY29tbW9uL21vZGVsX2J1ZmZlci5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpeGVkX2FycmF5LmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NvbmZpZy5oaCIKKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgaW50ZXJwb2xhdGUgeworCitzdHJ1Y3QgQ29uZmlnIHsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGxhbWJkYXM7CisgIHV0aWw6OnN0cmVhbTo6U29ydENvbmZpZyBzb3J0OworICBzdGQ6OnNpemVfdCBCdWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gc29ydC5idWZmZXJfc2l6ZTsgfQorfTsKKwordm9pZCBQaXBlbGluZSh1dGlsOjpGaXhlZEFycmF5PE1vZGVsQnVmZmVyPiAmbW9kZWxzLCBjb25zdCBDb25maWcgJmNvbmZpZywgaW50IHdyaXRlX2ZpbGUpOworCit9fSAvLyBuYW1lc3BhY2VzCisjZW5kaWYgLy8gTE1fSU5URVJQT0xBVEVfUElQRUxJTkVfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3NwbGl0X3dvcmtlci5jYyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9zcGxpdF93b3JrZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc3N2JmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9zcGxpdF93b3JrZXIuY2MKQEAgLTAsMCArMSw0MCBAQAorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL3NwbGl0X3dvcmtlci5oaCIKKyNpbmNsdWRlICJsbS9jb21tb24vbmdyYW0uaGgiCisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgaW50ZXJwb2xhdGUgeworCitTcGxpdFdvcmtlcjo6U3BsaXRXb3JrZXIoc3RkOjpzaXplX3Qgb3JkZXIsIHV0aWw6OnN0cmVhbTo6Q2hhaW4gJmJhY2tvZmZfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbDo6c3RyZWFtOjpDaGFpbiAmc29ydF9jaGFpbikKKyAgICA6IG9yZGVyXyhvcmRlcikgeworICBiYWNrb2ZmX2NoYWluID4+IGJhY2tvZmZfaW5wdXRfOworICBzb3J0X2NoYWluID4+IHNvcnRfaW5wdXRfOworfQorCit2b2lkIFNwbGl0V29ya2VyOjpSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICAvLyBpbnB1dDogbmdyYW0gcmVjb3JkIChpZCwgcHJvYiwgYW5kIGJhY2tvZmYpCisgIC8vIG91dHB1dDogYSBmbG9hdCB0byB0aGUgYmFja29mZl9pbnB1dCBzdHJlYW0KKyAgLy8gICAgICAgICBhbiBuZ3JhbSBpZCBhbmQgYSBmbG9hdCB0byB0aGUgc29ydF9pbnB1dCBzdHJlYW0KKyAgZm9yICh1dGlsOjpzdHJlYW06OlN0cmVhbSBzdHJlYW0ocG9zaXRpb24pOyBzdHJlYW07ICsrc3RyZWFtKSB7CisgICAgTkdyYW08UHJvYkJhY2tvZmY+IG5ncmFtKHN0cmVhbS5HZXQoKSwgb3JkZXJfKTsKKworICAgIC8vIHdyaXRlIGlkIGFuZCBwcm9iIHRvIHRoZSBzb3J0IHN0cmVhbQorICAgIGZsb2F0IHByb2IgPSBuZ3JhbS5WYWx1ZSgpLnByb2I7CisgICAgbG06OldvcmRJbmRleCAqb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxsbTo6V29yZEluZGV4ICo+KHNvcnRfaW5wdXRfLkdldCgpKTsKKyAgICBmb3IgKGNvbnN0IGxtOjpXb3JkSW5kZXggKml0ID0gbmdyYW0uYmVnaW4oKTsgaXQgIT0gbmdyYW0uZW5kKCk7ICsraXQpIHsKKyAgICAgICpvdXQrKyA9ICppdDsKKyAgICB9CisgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4ob3V0KSA9IHByb2I7CisgICAgKytzb3J0X2lucHV0XzsKKworICAgIC8vIHdyaXRlIGJhY2tvZmYgdG8gdGhlIGJhY2tvZmYgb3V0cHV0IHN0cmVhbQorICAgIGZsb2F0IGJvZmYgPSBuZ3JhbS5WYWx1ZSgpLmJhY2tvZmY7CisgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oYmFja29mZl9pbnB1dF8uR2V0KCkpID0gYm9mZjsKKyAgICArK2JhY2tvZmZfaW5wdXRfOworICB9CisgIHNvcnRfaW5wdXRfLlBvaXNvbigpOworICBiYWNrb2ZmX2lucHV0Xy5Qb2lzb24oKTsKK30KKworfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3NwbGl0X3dvcmtlci5oaCBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9zcGxpdF93b3JrZXIuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmYWU2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9zcGxpdF93b3JrZXIuaGgKQEAgLTAsMCArMSw0NCBAQAorI2lmbmRlZiBLRU5MTV9JTlRFUlBPTEFURV9TUExJVF9XT1JLRVJfSF8KKyNkZWZpbmUgS0VOTE1fSU5URVJQT0xBVEVfU1BMSVRfV09SS0VSX0hfCisKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9jaGFpbi5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9zdHJlYW0uaGgiCisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgaW50ZXJwb2xhdGUgeworCitjbGFzcyBTcGxpdFdvcmtlciB7CisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgc3BsaXQgd29ya2VyIGZvciBhIHBhcnRpY3VsYXIgb3JkZXIuIEl0IHdyaXRlcyB0aGUKKyAgICAgKiBzcGxpdC1vZmYgYmFja29mZiB2YWx1ZXMgdG8gdGhlIGJhY2tvZmYgY2hhaW4gYW5kIHRoZSBuZ3JhbSBpZCBhbmQKKyAgICAgKiBwcm9iYWJpbGl0eSB0byB0aGUgc29ydCBjaGFpbiBmb3IgZWFjaCBuZ3JhbSBpbiB0aGUgaW5wdXQuCisgICAgICovCisgICAgU3BsaXRXb3JrZXIoc3RkOjpzaXplX3Qgb3JkZXIsIHV0aWw6OnN0cmVhbTo6Q2hhaW4gJmJhY2tvZmZfY2hhaW4sCisgICAgICAgICAgICAgICAgdXRpbDo6c3RyZWFtOjpDaGFpbiAmc29ydF9jaGFpbik7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2FsbGJhY2sgaW52b2tlZCB0byBoYW5kbGUgdGhlIGlucHV0IGZyb20gdGhlIG5ncmFtIGludGVybWVkaWF0ZQorICAgICAqIGZpbGVzLgorICAgICAqLworICAgIHZvaWQgUnVuKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiYgcG9zaXRpb24pOworCisgIHByaXZhdGU6CisgICAgLyoqCisgICAgICogVGhlIG5ncmFtIG9yZGVyIHdlIGFyZSByZWFkaW5nL3dyaXRpbmcgZm9yLgorICAgICAqLworICAgIHN0ZDo6c2l6ZV90IG9yZGVyXzsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8gZm9yIHRoZSBiYWNrb2ZmIHZhbHVlcy4KKyAgICAgKi8KKyAgICB1dGlsOjpzdHJlYW06OlN0cmVhbSBiYWNrb2ZmX2lucHV0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8gZm9yIHRoZSBuZ3JhbSBpZCArIHByb2JhYmlsaXR5IHZhbHVlcy4KKyAgICAgKi8KKyAgICB1dGlsOjpzdHJlYW06OlN0cmVhbSBzb3J0X2lucHV0XzsKK307Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9zdHJlYW1pbmdfZXhhbXBsZV9tYWluLmNjIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3N0cmVhbWluZ19leGFtcGxlX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1NDNjYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS9zdHJlYW1pbmdfZXhhbXBsZV9tYWluLmNjCkBAIC0wLDAgKzEsMTk1IEBACisjaW5jbHVkZSAibG0vY29tbW9uL2NvbXBhcmUuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL21vZGVsX2J1ZmZlci5oaCIKKyNpbmNsdWRlICJsbS9jb21tb24vbmdyYW0uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY2hhaW4uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vbXVsdGlfc3RyZWFtLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL3NvcnQuaGgiCisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvc3BsaXRfd29ya2VyLmhoIgorCisjaW5jbHVkZSA8Ym9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcD4KKyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KKworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKworLy8gV2luZG93cyBkb2Vzbid0IGRlZmluZSA8dW5pc3RkLmg+CisvLworLy8gU28gd2UgZGVmaW5lIHdoYXQgd2UgbmVlZCBoZXJlIGluc3RlYWQ6CisvLworI2RlZmluZSBTVERJTl9GSUxFTk8gPSAwCisjZGVmaW5lIFNURE9VVF9GSUxFTk8gPSAxCisjZWxzZSAvLyBIdXp6YWggZm9yIFBPU0lYIQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKy8qCisgKiBUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IHRha2VzIGluIGludGVybWVkaWF0ZQorICogc3VmZml4LXNvcnRlZCBuZ3JhbSBmaWxlcyBhbmQgb3V0cHV0cyB0d28gc2V0cyBvZiBmaWxlczogb25lIGZvciBiYWNrb2ZmCisgKiBwcm9iYWJpbGl0eSB2YWx1ZXMgKHJhdyBudW1iZXJzLCBpbiBzdWZmaXggb3JkZXIpIGFuZCBvbmUgZm9yCisgKiBwcm9iYWJpbGl0eSB2YWx1ZXMgKG5ncmFtIGlkIGFuZCBwcm9iYWJpbGl0eSwgaW4gKmNvbnRleHQqIG9yZGVyKQorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBsbTo6aW50ZXJwb2xhdGU7CisKKyAgY29uc3Qgc3RkOjpzaXplX3QgT05FX0dCID0gMSA8PCAzMDsKKyAgY29uc3Qgc3RkOjpzaXplX3QgU0lYVFlfRk9VUl9NQiA9IDEgPDwgMjY7CisgIGNvbnN0IHN0ZDo6c2l6ZV90IE5VTUJFUl9PRl9CTE9DS1MgPSAyOworCisgIHN0ZDo6c3RyaW5nIEZJTEVfTkFNRSA9ICJuZ3JhbXMiOworICBzdGQ6OnN0cmluZyBDT05URVhUX1NPUlRFRF9GSUxFTkFNRSA9ICJjc29ydGVkLW5ncmFtcyI7CisgIHN0ZDo6c3RyaW5nIEJBQ0tPRkZfRklMRU5BTUUgPSAiYmFja29mZnMiOworICBzdGQ6OnN0cmluZyBUTVBfRElSID0gIi90bXAvIjsKKworICB0cnkgeworICAgIG5hbWVzcGFjZSBwbyA9IGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM7CisgICAgcG86Om9wdGlvbnNfZGVzY3JpcHRpb24gb3B0aW9ucygiY2FuaGF6aW50ZXJwIFBhc3MtMyBvcHRpb25zIik7CisKKyAgICBvcHRpb25zLmFkZF9vcHRpb25zKCkKKyAgICAgICgiaGVscCxoIiwgcG86OmJvb2xfc3dpdGNoKCksICJTaG93IHRoaXMgaGVscCBtZXNzYWdlIikKKyAgICAgICgibmdyYW1zLG4iLCBwbzo6dmFsdWU8c3RkOjpzdHJpbmc+KCZGSUxFX05BTUUpLCAibmdyYW1zIGZpbGUiKQorICAgICAgKCJjc29ydG5ncmFtcyxjIiwgcG86OnZhbHVlPHN0ZDo6c3RyaW5nPigmQ09OVEVYVF9TT1JURURfRklMRU5BTUUpLCAiY29udGV4dCBzb3J0ZWQgbmdyYW1zIGZpbGUiKQorICAgICAgKCJiYWNrb2ZmcyxiIiwgcG86OnZhbHVlPHN0ZDo6c3RyaW5nPigmQkFDS09GRl9GSUxFTkFNRSksICJiYWNrb2ZmcyBmaWxlIikKKyAgICAgICgidG1wZGlyLHQiLCBwbzo6dmFsdWU8c3RkOjpzdHJpbmc+KCZUTVBfRElSKSwgInRtcCBkaXIiKTsKKyAgICBwbzo6dmFyaWFibGVzX21hcCB2bTsKKyAgICBwbzo6c3RvcmUocG86OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBvcHRpb25zKSwgdm0pOworCisgICAgLy8gRGlzcGxheSBoZWxwCisgICAgaWYodm1bImhlbHAiXS5hczxib29sPigpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlVzYWdlOiAiIDw8IG9wdGlvbnMgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIGNhdGNoKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZlKSB7CisKKyAgICBzdGQ6OmNlcnIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAxOworCisgIH0KKworICAvLyBUaGUgYmFzaWMgc3RyYXRlZ3kgaGVyZSBpcyB0byBoYXZlIHRocmVlIGNoYWluczoKKyAgLy8gLSBUaGUgZmlyc3QgcmVhZHMgdGhlIG5ncmFtIG9yZGVyIGlucHV0cyB1c2luZyBNb2RlbEJ1ZmZlci4gVGhvc2UgYXJlCisgIC8vICAgdGhlbiBzdHJpcHBlZCBvZiB0aGVpciBiYWNrb2ZmIHZhbHVlcyBhbmQgZmVkIGludG8gdGhlIHRoaXJkIGNoYWluOworICAvLyAgIHRoZSBiYWNrb2ZmIHZhbHVlcyAqdGhlbXNlbHZlcyogYXJlIHdyaXR0ZW4gdG8gdGhlIHNlY29uZCBjaGFpbi4KKyAgLy8KKyAgLy8gLSBUaGUgc2Vjb25kIGNoYWluIHRha2VzIHRoZSBiYWNrb2ZmIHZhbHVlcyBhbmQgd3JpdGVzIHRoZW0gb3V0IHRvIGEKKyAgLy8gICBmaWxlIChvbmUgZm9yIGVhY2ggb3JkZXIpLgorICAvLworICAvLyAtIFRoZSB0aGlyZCBjaGFpbiB0YWtlcyBqdXN0IHRoZSBwcm9iYWJpbGl0eSB2YWx1ZXMgYW5kIG5ncmFtcyBhbmQKKyAgLy8gICB3cml0ZXMgdGhlbSBvdXQsIHNvcnRlZCBpbiBjb250ZXh0LW9yZGVyLCB0byBhIGZpbGUgKG9uZSBmb3IgZWFjaAorICAvLyAgIG9yZGVyKS4KKworICAvLyBUaGlzIHdpbGwgYmUgdXNlZCB0byByZWFkIGluIHRoZSBiaW5hcnkgaW50ZXJtZWRpYXRlIGZpbGVzLiBUaGVyZSBpcworICAvLyBvbmUgZmlsZSBwZXIgb3JkZXIgKGUuZy4gbmdyYW1zLjEsIG5ncmFtcy4yLCAuLi4pCisgIGxtOjpNb2RlbEJ1ZmZlciBidWZmZXIoRklMRV9OQU1FKTsKKworICAvLyBDcmVhdGUgYSBzZXBhcmF0ZSBjaGFpbnMgZm9yIGVhY2ggbmdyYW0gb3JkZXIgZm9yOgorICAvLyAtIElucHV0IGZyb20gdGhlIGludGVybWVkaWF0ZSBmaWxlcworICAvLyAtIE91dHB1dCB0byB0aGUgYmFja29mZiBmaWxlCisgIC8vIC0gT3V0cHV0IHRvIHRoZSAoY29udGV4dC1zb3J0ZWQpIHByb2JhYmlsaXR5IGZpbGUKKyAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgbmdyYW1faW5wdXRzKGJ1ZmZlci5PcmRlcigpKTsKKyAgdXRpbDo6c3RyZWFtOjpDaGFpbnMgYmFja29mZl9jaGFpbnMoYnVmZmVyLk9yZGVyKCkpOworICB1dGlsOjpzdHJlYW06OkNoYWlucyBwcm9iX2NoYWlucyhidWZmZXIuT3JkZXIoKSk7CisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBidWZmZXIuT3JkZXIoKTsgKytpKSB7CisgICAgbmdyYW1faW5wdXRzLnB1c2hfYmFjayh1dGlsOjpzdHJlYW06OkNoYWluQ29uZmlnKAorICAgICAgICBsbTo6TkdyYW08bG06OlByb2JCYWNrb2ZmPjo6VG90YWxTaXplKGkgKyAxKSwgTlVNQkVSX09GX0JMT0NLUywgT05FX0dCKSk7CisKKyAgICBiYWNrb2ZmX2NoYWlucy5wdXNoX2JhY2soCisgICAgICAgIHV0aWw6OnN0cmVhbTo6Q2hhaW5Db25maWcoc2l6ZW9mKGZsb2F0KSwgTlVNQkVSX09GX0JMT0NLUywgT05FX0dCKSk7CisKKyAgICBwcm9iX2NoYWlucy5wdXNoX2JhY2sodXRpbDo6c3RyZWFtOjpDaGFpbkNvbmZpZygKKyAgICAgICAgc2l6ZW9mKGxtOjpXb3JkSW5kZXgpICogKGkgKyAxKSArIHNpemVvZihmbG9hdCksIE5VTUJFUl9PRl9CTE9DS1MsCisgICAgICAgIE9ORV9HQikpOworICB9CisKKyAgLy8gVGhpcyBzZXRzIHRoZSBpbnB1dCBmb3IgZWFjaCBvZiB0aGUgbmdyYW0gb3JkZXIgY2hhaW5zIHRvIHRoZQorICAvLyBhcHByb3ByaWF0ZSBmaWxlCisgIGJ1ZmZlci5Tb3VyY2UobmdyYW1faW5wdXRzKTsKKworICB1dGlsOjpGaXhlZEFycmF5PHV0aWw6OnNjb3BlZF9wdHI8U3BsaXRXb3JrZXI+ID4gd29ya2VycyhidWZmZXIuT3JkZXIoKSk7CisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBidWZmZXIuT3JkZXIoKTsgKytpKSB7CisgICAgLy8gQXR0YWNoIGEgU3BsaXRXb3JrZXIgdG8gZWFjaCBvZiB0aGUgbmdyYW0gaW5wdXQgY2hhaW5zLCB3cml0aW5nIHRvIHRoZQorICAgIC8vIGNvcnJlc3BvbmRpbmcgb3JkZXIncyBiYWNrb2ZmIGFuZCBwcm9iYWJpbGl0eSBjaGFpbnMKKyAgICB3b3JrZXJzLnB1c2hfYmFjaygKKyAgICAgICAgbmV3IFNwbGl0V29ya2VyKGkgKyAxLCBiYWNrb2ZmX2NoYWluc1tpXSwgcHJvYl9jaGFpbnNbaV0pKTsKKyAgICBuZ3JhbV9pbnB1dHNbaV0gPj4gYm9vc3Q6OnJlZigqd29ya2Vycy5iYWNrKCkpOworICB9CisKKyAgdXRpbDo6c3RyZWFtOjpTb3J0Q29uZmlnIHNvcnRfY2ZnOworICBzb3J0X2NmZy50ZW1wX3ByZWZpeCA9IFRNUF9ESVI7CisgIHNvcnRfY2ZnLmJ1ZmZlcl9zaXplID0gU0lYVFlfRk9VUl9NQjsKKyAgc29ydF9jZmcudG90YWxfbWVtb3J5ID0gT05FX0dCOworCisgIC8vIFRoaXMgd2lsbCBwYXJhbGxlbCBtZXJnZSBzb3J0IHRoZSBpbmRpdmlkdWFsIG9yZGVyIGZpbGVzLCBwdXR0aW5nCisgIC8vIHRoZW0gaW4gY29udGV4dC1vcmRlciBpbnN0ZWFkIG9mIHN1ZmZpeC1vcmRlci4KKyAgLy8KKyAgLy8gVHdvIG5ldyB0aHJlYWRzIHdpbGwgYmUgcnVubmluZywgZWFjaCBvd25lZCBieSB0aGUgY2hhaW5zW2ldIG9iamVjdC4KKyAgLy8gLSBUaGUgZmlyc3QgZXhlY3V0ZXMgQmxvY2tTb3J0ZXIuUnVuKCkgdG8gc29ydCB0aGUgbi1ncmFtIGVudHJpZXMKKyAgLy8gLSBUaGUgc2Vjb25kIGV4ZWN1dGVzIFdyaXRlQW5kUmVjeWNsZS5SdW4oKSB0byB3cml0ZSBlYWNoIHNvcnRlZAorICAvLyAgIGJsb2NrIHRvIGRpc2sgYXMgYSB0ZW1wb3JhcnkgZmlsZQorICB1dGlsOjpzdHJlYW06OlNvcnRzPGxtOjpDb250ZXh0T3JkZXI+IHNvcnRzKGJ1ZmZlci5PcmRlcigpKTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHByb2JfY2hhaW5zLnNpemUoKTsgKytpKSB7CisgICAgc29ydHMucHVzaF9iYWNrKHByb2JfY2hhaW5zW2ldLCBzb3J0X2NmZywgbG06OkNvbnRleHRPcmRlcihpICsgMSkpOworICB9CisKKyAgLy8gU2V0IHRoZSBzb3J0IG91dHB1dCB0byBiZSBvbiB0aGUgc2FtZSBjaGFpbgorICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgcHJvYl9jaGFpbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAvLyBUaGUgZm9sbG93aW5nIGNhbGwgdG8gQ2hhaW46OldhaXQoKQorICAgIC8vICAgICBqb2lucyB0aGUgdGhyZWFkcyBvd25lZCBieSBjaGFpbnNbaV0uCisgICAgLy8KKyAgICAvLyBBcyBzdWNoIHRoZSBmb2xsb3dpbmcgY2FsbCB3b24ndCByZXR1cm4KKyAgICAvLyAgICAgdW50aWwgYWxsIHRocmVhZHMgb3duZWQgYnkgY2hhaW5zW2ldIGhhdmUgY29tcGxldGVkLgorICAgIC8vCisgICAgLy8gVGhlIGZvbGxvd2luZyBjYWxsIGFsc28gcmVzZXRzIGNoYWluW2ldCisgICAgLy8gICAgIHNvIHRoYXQgaXQgY2FuIGJlIHJldXNlZAorICAgIC8vICAgICAoaW5jbHVkaW5nIGZyZWUnaW5nIHRoZSBtZW1vcnkgcHJldmlvdXNseSB1c2VkIGJ5IHRoZSBjaGFpbikKKyAgICBwcm9iX2NoYWluc1tpXS5XYWl0KCk7CisKKyAgICAvLyBJbiBhbiBpZGVhbCB3b3JsZCAod2l0aG91dCBtZW1vcnkgcmVzdHJpY3Rpb25zKQorICAgIC8vICAgICB3ZSBjb3VsZCBtZXJnZSBhbGwgb2YgdGhlIHByZXZpb3VzbHkgc29ydGVkIGJsb2NrcworICAgIC8vICAgICBieSByZWFkaW5nIHRoZW0gYWxsIGNvbXBsZXRlbHkgaW50byBtZW1vcnkKKyAgICAvLyAgICAgYW5kIHRoZW4gcnVubmluZyBtZXJnZSBzb3J0IG92ZXIgdGhlbS4KKyAgICAvLworICAgIC8vIEluIHRoZSByZWFsIHdvcmxkLCB3ZSBoYXZlIG1lbW9yeSByZXN0cmljdGlvbnM7CisgICAgLy8gICAgIGRlcGVuZGluZyBvbiBob3cgbWFueSBibG9ja3Mgd2UgaGF2ZSwKKyAgICAvLyAgICAgYW5kIGhvdyBtdWNoIG1lbW9yeSB3ZSBjYW4gdXNlIHRvIHJlYWQgZnJvbSBlYWNoIGJsb2NrCisgICAgLy8gICAgIChzb3J0X2NvbmZpZy5idWZmZXJfc2l6ZSkKKyAgICAvLyAgICAgaXQgbWF5IGJlIHRoZSBjYXNlIHRoYXQgd2UgaGF2ZSBpbnN1ZmZpY2llbnQgbWVtb3J5CisgICAgLy8gICAgIHRvIHJlYWQgc29ydF9jb25maWcuYnVmZmVyX3NpemUgb2YgZGF0YSBmcm9tIGVhY2ggYmxvY2sgZnJvbSBkaXNrLgorICAgIC8vCisgICAgLy8gSWYgdGhpcyBvY2N1cnMsIHRoZW4gaXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8gcGVyZm9ybSBvbmUgb3IgbW9yZSByb3VuZHMKKyAgICAvLyBvZiBtZXJnZSBzb3J0IG9uIGRpc2s7CisgICAgLy8gICAgIGRvaW5nIHNvIHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgd2Ugd2lsbCBldmVudHVhbGx5CisgICAgLy8gICAgIG5lZWQgdG8gcmVhZCBmcm9tCisgICAgLy8gICAgIHdoZW4gcGVyZm9ybWluZyB0aGUgZmluYWwgcm91bmQgb2YgbWVyZ2Ugc29ydCBpbiBtZW1vcnkuCisgICAgLy8KKyAgICAvLyBTbywgdGhlIGZvbGxvd2luZyBjYWxsIGRldGVybWluZXMgd2hldGhlciBpdCBpcyBuZWNlc3NhcnkKKyAgICAvLyAgICAgdG8gcGVyZm9ybSBvbmUgb3IgbW9yZSByb3VuZHMgb2YgbWVyZ2Ugc29ydCBvbiBkaXNrOworICAgIC8vICAgICBpZiBzdWNoIG9uLWRpc2sgbWVyZ2Ugc29ydGluZyBpcyByZXF1aXJlZCwgc3VjaCBzb3J0aW5nIGlzIHBlcmZvcm1lZC4KKyAgICAvLworICAgIC8vIEZpbmFsbHksIHRoZSBmb2xsb3dpbmcgbWV0aG9kIGxhdW5jaGVzIGEgdGhyZWFkIHRoYXQgY2FsbHMKKyAgICAvLyBPd25pbmdNZXJnaW5nUmVhZGVyLlJ1bigpCisgICAgLy8gICAgIHRvIHBlcmZvcm0gdGhlIGZpbmFsIHJvdW5kIG9mIG1lcmdlIHNvcnQgaW4gbWVtb3J5LgorICAgIC8vCisgICAgLy8gTWVyZ2Ugc29ydCBjb3VsZCBoYXZlIGJlIGludm9rZWQgZGlyZWN0bHkKKyAgICAvLyAgICAgc28gdGhhdCBtZXJnZSBzb3J0IG1lbW9yeSBkb2Vzbid0IGNvZXhpc3Qgd2l0aCBDaGFpbiBtZW1vcnkuCisgICAgc29ydHNbaV0uT3V0cHV0KHByb2JfY2hhaW5zW2ldKTsKKyAgfQorCisgIC8vIENyZWF0ZSBhbm90aGVyIG1vZGVsIGJ1ZmZlciBmb3Igb3VyIG91dHB1dCBvbiBlLmcuIGNzb3J0ZWQtbmdyYW1zLjEsCisgIC8vIGNzb3J0ZWQtbmdyYW1zLjIsIC4uLgorICBsbTo6TW9kZWxCdWZmZXIgb3V0cHV0X2J1ZihDT05URVhUX1NPUlRFRF9GSUxFTkFNRSwgdHJ1ZSwgZmFsc2UpOworICBvdXRwdXRfYnVmLlNpbmsocHJvYl9jaGFpbnMsIGJ1ZmZlci5Db3VudHMoKSk7CisKKyAgLy8gQ3JlYXRlIGEgdGhpcmQgbW9kZWwgYnVmZmVyIGZvciBvdXIgYmFja29mZiBvdXRwdXQgb24gZS5nLiBiYWNrb2ZmLjEsCisgIC8vIGJhY2tvZmYuMiwgLi4uCisgIGxtOjpNb2RlbEJ1ZmZlciBib2ZmX2J1ZihCQUNLT0ZGX0ZJTEVOQU1FLCB0cnVlLCBmYWxzZSk7CisgIGJvZmZfYnVmLlNpbmsoYmFja29mZl9jaGFpbnMsIGJ1ZmZlci5Db3VudHMoKSk7CisKKyAgLy8gSm9pbnMgYWxsIHRocmVhZHMgdGhhdCBjaGFpbnMgb3ducywKKyAgLy8gICAgYW5kIGRvZXMgYSBmb3IgbG9vcCBvdmVyIGVhY2ggY2hhaW4gb2JqZWN0IGluIGNoYWlucywKKyAgLy8gICAgY2FsbGluZyBjaGFpbi5XYWl0KCkgb24gZWFjaCBzdWNoIGNoYWluIG9iamVjdAorICBuZ3JhbV9pbnB1dHMuV2FpdCh0cnVlKTsKKyAgYmFja29mZl9jaGFpbnMuV2FpdCh0cnVlKTsKKyAgcHJvYl9jaGFpbnMuV2FpdCh0cnVlKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90b3lfZGF0YS90b3kubGluZWFyX2ludGVycG9sYXRpb24ubGFtYmRhMV8wLjQubGFtYmRhMl8wLjYubG0gYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdG95X2RhdGEvdG95LmxpbmVhcl9pbnRlcnBvbGF0aW9uLmxhbWJkYTFfMC40LmxhbWJkYTJfMC42LmxtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YmFjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdG95X2RhdGEvdG95LmxpbmVhcl9pbnRlcnBvbGF0aW9uLmxhbWJkYTFfMC40LmxhbWJkYTJfMC42LmxtCkBAIC0wLDAgKzEsMjMgQEAKKworXGRhdGFcCituZ3JhbSAxPTUKK25ncmFtIDI9OAorCitcMS1ncmFtczoKKy0wLjU4NTAyNjcJPC9zPgorLTk5CTxzPgktNy4wMDQxNzYKKy0wLjc0NDcyNzQJPHVuaz4KKy0wLjQ2ODUyMTEJYQktNy4yNzI4MTEKKy0wLjY1NzU3NzMJYgktOTkKKworXDItZ3JhbXM6CistMC4yODM5OTY3CTxzPiBhCistMC4zMTg3NTg4CTxzPiBiCistMC43OTU4OAlhIDwvcz4KKy0wLjUwNTg0NTQJYSBhCistMC4yNzczNjYxCWEgYgorLTAuNzQ0NzI3NQliIDwvcz4KKy0wLjExMzUwOTMJYiBhCistMC45NTg2MDczCWIgYgorCitcZW5kXApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3RveV9kYXRhL3RveS5sb2dsaW5lYXJfaW50ZXJwb2xhdGlvbi5sYW1iZGExXzAuNC5sYW1iZGEyXzAuNi5sbSBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90b3lfZGF0YS90b3kubG9nbGluZWFyX2ludGVycG9sYXRpb24ubGFtYmRhMV8wLjQubGFtYmRhMl8wLjYubG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3NGJhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90b3lfZGF0YS90b3kubG9nbGluZWFyX2ludGVycG9sYXRpb24ubGFtYmRhMV8wLjQubGFtYmRhMl8wLjYubG0KQEAgLTAsMCArMSwyMyBAQAorCitcZGF0YVwKK25ncmFtIDE9NQorbmdyYW0gMj04CisKK1wxLWdyYW1zOgorLTAuNjE5MDUxMwk8L3M+CistOTkJPHM+CS02Ljg4NTI0NworLTk5CTx1bms+CistMC4zMzk0NjMzCWEJMAorLTAuNTIwMDgxMwliCTAKKworXDItZ3JhbXM6CistMC4yODA3NTg0CTxzPiBhCistMC4zMjIyOTQ0CTxzPiBiCistMC43MDc2MwlhIDwvcz4KKy0wLjY3ODAxNzQJYSBhCistMC4yMjYxNjc1CWEgYgorLTAuNzk5MTAzNgliIDwvcz4KKy0wLjEyMzcyOTkJYiBhCistMS4wNTAxNTgJYiBiCisKK1xlbmRcCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdG95X2RhdGEvdG95MS5sbSBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90b3lfZGF0YS90b3kxLmxtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTQyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdG95X2RhdGEvdG95MS5sbQpAQCAtMCwwICsxLDIzIEBACisKK1xkYXRhXAorbmdyYW0gMT01CituZ3JhbSAyPTgKKworXDEtZ3JhbXM6CistMS4zMDEwMjk5OTU3CTwvcz4KKy05OQk8cz4JLTcuNDQ2Mzg5CistOTkJPHVuaz4KKy0wLjYwMjA1OTk5MTMJYQkwCistMC42MDIwNTk5OTEzCWIJMAorCitcMi1ncmFtczoKKy0wLjE1NDkwMTk2CTxzPiBhCistMC41MjI4Nzg3NDUzCTxzPiBiCistMQlhIDwvcz4KKy0xLjUyMjg3ODc0NTMJYSBhCistMC4wNjA0ODA3NDc0CWEgYgorLTAuNTIyODc4NzQ1MwliIDwvcz4KKy0wLjMwMTAyOTk5NTcJYiBhCistMC42OTg5NzAwMDQzCWIgYgorCitcZW5kXApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3RveV9kYXRhL3RveTIubG0gYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdG95X2RhdGEvdG95Mi5sbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2MyYmExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3RveV9kYXRhL3RveTIubG0KQEAgLTAsMCArMSwyMyBAQAorCitcZGF0YVwKK25ncmFtIDE9NQorbmdyYW0gMj04CisKK1wxLWdyYW1zOgorLTAuMzk3OTQwMDA4Nwk8L3M+CistOTkJPHM+CS03LjQ0NjM4OQorLTk5CTx1bms+CistMC4zOTc5NDAwMDg3CWEJMAorLTAuNjk4OTcwMDA0MwliCTAKKworXDItZ3JhbXM6CistMC4zOTc5NDAwMDg3CTxzPiBhCistMC4yMjE4NDg3NDk2CTxzPiBiCistMC42OTg5NzAwMDQzCWEgPC9zPgorLTAuMzAxMDI5OTk1NwlhIGEKKy0wLjUyMjg3ODc0NTMJYSBiCistMQliIDwvcz4KKy0wLjAyMjI3NjM5NDcJYiBhCistMS4zMDEwMjk5OTU3CWIgYgorCitcZW5kXApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3RyYWluX3BhcmFtc19ncmFudF9tYWluLmNjIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3RyYWluX3BhcmFtc19ncmFudF9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDZjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHJhaW5fcGFyYW1zX2dyYW50X21haW4uY2MKQEAgLTAsMCArMSw1NjEgQEAKKyNpbmNsdWRlICJsbS9uZ3JhbV9xdWVyeS5oaCIKKyNpbmNsdWRlICJsbS9tb2RlbC5oaCIKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL2VudW1lcmF0ZV9nbG9iYWxfdm9jYWIuaGgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGlvbWFuaXA+CisKKyNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZvcmVhY2guaHBwPgorCisjaW5jbHVkZSAidXRpbC9maXhlZF9hcnJheS5oaCIKKworI2luY2x1ZGUgPEVpZ2VuL0VpZ2VuPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCisvLyB0eXBlZGVmIEVpZ2VuOjpNYXRyaXhYZiBGTWF0cml4OworLy8gdHlwZWRlZiBFaWdlbjo6VmVjdG9yWGYgRlZlY3RvcjsKK3R5cGVkZWYgRWlnZW46Ok1hdHJpeFhkIERNYXRyaXg7Cit0eXBlZGVmIEVpZ2VuOjpWZWN0b3JYZCBEVmVjdG9yOworCitib29sIEhBU19CSUFTID0gdHJ1ZTsKKwordXNpbmcgbmFtZXNwYWNlIGxtOjpuZ3JhbTsKK3VzaW5nIG5hbWVzcGFjZSBsbTsKKworaW5saW5lIGRvdWJsZSBsb2dQcm9iKE1vZGVsICptb2RlbCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgV29yZEluZGV4IHdvcmRfaWR4KSB7CisgIC8vIEhvcnJpYmx5IGluZWZmaWNpZW50CisgIGNvbnN0IFZvY2FidWxhcnkgJnZvY2FiID0gbW9kZWwtPkdldFZvY2FidWxhcnkoKTsKKworICBTdGF0ZSBuZXh0U3RhdGU7ICAvLyB0aHJvd2F3YXkKKworICBXb3JkSW5kZXggY29udGV4dF9pZHhbY3R4LnNpemUoKV07CisKKyAgLy8gcmV2ZXJzZSBjb250ZXh0CisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBjdHguc2l6ZSgpOyBpKyspIHsKKyAgICBjb250ZXh0X2lkeFtjdHguc2l6ZSgpIC0gMSAtIGldID0gdm9jYWIuSW5kZXgoY3R4W2ldKTsKKyAgfQorCisgIEZ1bGxTY29yZVJldHVybiBzY29yZSA9IG1vZGVsLT5GdWxsU2NvcmVGb3Jnb3RTdGF0ZSgKKyAgICAgIGNvbnRleHRfaWR4LCAmKGNvbnRleHRfaWR4W2N0eC5zaXplKCkgLSAxXSksIHdvcmRfaWR4LCBuZXh0U3RhdGUpOworCisgIGRvdWJsZSByZXQgPSBzY29yZS5wcm9iOworICAvLyBzdGQ6OmNlcnIgPDwgInc6ICIgPDwgd29yZCA8PCAiIHA6ICIgPDwgcmV0IDw8IHN0ZDo6ZW5kbDsKKyAgcmV0dXJuIHJldDsKK30KKworaW5saW5lIGRvdWJsZSBsb2dQcm9iKE1vZGVsICptb2RlbCwgZG91YmxlIHVua3Byb2IsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJndvcmQpIHsKKyAgLy8gSG9ycmlibHkgaW5lZmZpY2llbnQKKyAgY29uc3QgVm9jYWJ1bGFyeSAmdm9jYWIgPSBtb2RlbC0+R2V0Vm9jYWJ1bGFyeSgpOworCisgIFdvcmRJbmRleCB3b3JkX2lkeCA9IHZvY2FiLkluZGV4KHdvcmQpOworICBpZiAod29yZF9pZHggPT0gbG06OmtVTkspIHJldHVybiB1bmtwcm9iOworCisgIHJldHVybiBsb2dQcm9iKG1vZGVsLCBjdHgsIHdvcmRfaWR4KTsKK30KKwordm9pZCBzZXRfZmVhdHVyZXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZjdHgsIGNvbnN0IHN0ZDo6c3RyaW5nICZ3b3JkLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TW9kZWwgKj4gJm1vZGVscywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4gJnVua3Byb2JzLCBEVmVjdG9yICZ2KSB7CisgIGlmIChIQVNfQklBUykgeworICAgIHYoMCkgPSAxOworICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtb2RlbHMuc2l6ZSgpOyArK2kpCisgICAgICB2KGkgKyAxKSA9IGxvZ1Byb2IobW9kZWxzW2ldLCB1bmtwcm9ic1tpXSwgY3R4LCB3b3JkKTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbW9kZWxzLnNpemUoKTsgKytpKQorICAgICAgdihpKSA9IGxvZ1Byb2IobW9kZWxzW2ldLCB1bmtwcm9ic1tpXSwgY3R4LCB3b3JkKTsKKyAgfQorfQorCit2b2lkIHRyYWluX3BhcmFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPiAmY29ycHVzLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZ2b2NhYiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1vZGVsICo+ICZtb2RlbHMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworICAvLyBBIHNhZmVndWFyZGVkIE5ld3RvbidzIG1ldGhvZCB0byBmaW5kIG9wdGltdW0gcGFyYW1ldGVycy4KKyAgLy8gUmV2ZXJ0cyB0byBzdGVlcGVzdC1kZXNjZW50IGxpbmVzZWFyY2ggaWYgTmV3dG9uIHN0ZXAgZG9lcyBub3QgaW1wcm92ZQorICAvLyBvYmplY3RpdmUuCisgIC8vCisgIC8vIFR3byBCb29sZWFuIHZhcmlhYmxlcyBiZWxvdyBhcmUgdXNlZCB0byAiQWxsb3dFeHRyYXBvbGF0aW9uIiBhbmQKKyAgLy8gIkFsbG93TmVnYXRpdmVQYXJhbXMiLgorCisgIGJvb2wgQWxsb3dFeHRyYXBvbGF0aW9uID0gdHJ1ZTsgICAvLyBpZiB0cnVlLCBwYXJhbXMgbmVlZCBub3Qgc3VtIHRvIG9uZQorICBib29sIEFsbG93TmVnYXRpdmVQYXJhbXMgPSB0cnVlOyAgLy8gaWYgdHJ1ZSwgcGFyYW1zIGNhbiBiZSBuZWdhdGl2ZQorICBjb25zdCBpbnQgSVRFUkFUSU9OUyA9IDIwOworICBkb3VibGUgbWluc3RlcHNpemUgPSAxLjBlLTk7ICAvLyBjb252ZXJnZW5jZSBjcml0ZXJpb24KKyAgaW50IGNvbnRleHRfc2l6ZSA9IDU7ICAvLyAoY29udGV4dF9zaXplKzEpLWdyYW1zIGNvbnNpZGVyZWQgaW4gcGVycGxleGl0eQorICBkb3VibGUgc3RlcGRlY3JlYXNlZmFjdG9yID0gMC4xOyAgICAgICAgLy8gaWYgc3RlcCB1bnN1Y2Nlc3NmdWwKKyAgZG91YmxlIGluaXRzdGVwc2l6ZSA9IDEuMDsgICAgICAgICAgICAgIC8vIEluaXRpYWwgc3RlcCBzaXplCisgIHN0ZDo6c2l6ZV90IGxpbmVzaW5zdGFydGVyY29ycHVzID0gMTI7ICAvLyBUaGUgZmlyc3QgZmV3IGxpbmVzIGFyZSB0dW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QsIHRvIGZpbmQgYmFzaW4gb2YgYXR0cmFjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIE5ld3RvbgorICAvLyBiaWFzICsgI21vZGVscworICBjb25zdCBzdGQ6OnNpemVfdCBubGFtYmRhcyA9IG1vZGVscy5zaXplKCkgKyAoSEFTX0JJQVMgPyAxIDogMCk7CisKKyAgLy8gaW5pdGlhbGl6ZSB0byBzdW0gdG8gMQorICBEVmVjdG9yIHBhcmFtcyA9IERWZWN0b3I6OkNvbnN0YW50KG5sYW1iZGFzLCAxLjAgLyBubGFtYmRhcyk7CisgIERNYXRyaXggTiA9IERNYXRyaXg6OkNvbnN0YW50KAorICAgICAgbmxhbWJkYXMsIG5sYW1iZGFzIC0gMSwKKyAgICAgIC0xLjAgLyBzcXJ0KChubGFtYmRhcyAtIDEpICogKG5sYW1iZGFzIC0gMSkgKyBubGFtYmRhcyAtIDEuMCkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmxhbWJkYXMgLSAxOyArK2kpCisgICAgTihpLCBpKSA9IE4oaSwgaSkgKiAoMS4wIC0gbmxhbWJkYXMpOworICAvLyBOIGlzIG51bGxzcGFjZSBtYXRyaXgsIGVhY2ggY29sdW1uIHN1bXMgdG8gemVybworCisgIGNlcnIgPDwgc2V0cHJlY2lzaW9uKDE2KSA8PCAiKysgUGFyYW1ldGVyIHRyYWluaW5nICsrIiA8PCBlbmRsOworICBpZiAoQWxsb3dFeHRyYXBvbGF0aW9uKQorICAgIGNlcnIgPDwgIiBBbGxvd2luZyBleHRyYXBvbGF0aW9uIChzaGFycGVuaW5nIGFuZCBmbGF0dGVuaW5nIG9mIGluZGl2aWR1YWwgIgorICAgICAgICAgICAgIkxNIGRpc3RyaWJ1dGlvbnMpIiA8PCBlbmRsOworICBlbHNlCisgICAgY2VyciA8PCAiIEludGVycG9sYXRpbmcgb25seSAobm90IHNoYXJwZW5pbmcgb3IgZmxhdHRlbmluZyBpbmRpdmlkdWFsIExNICIKKyAgICAgICAgICAgICJkaXN0cmlidXRpb25zKSIgPDwgZW5kbDsKKyAgaWYgKEFsbG93TmVnYXRpdmVQYXJhbXMpCisgICAgY2VyciA8PCAiIEFsbG93aW5nIG5lZ2F0aXZlIHBhcmFtZXRlcnNcbiIKKyAgICAgICAgIDw8ICIgIChtb3JlIGdlbmVyYWwgYnV0IHNsb3cgYW5kIHJhcmVseSB1c2VmdWxcbiIKKyAgICAgICAgIDw8ICIgICAtTE0gd2l0aCBuZWdhdGl2ZSB3ZWlnaHQgaGFzIHByb2JhYmlsaXR5IHJhbmtpbmdzIHJldmVyc2VkIGFuZCAiCisgICAgICAgICAgICAiaXMgd2VpZ2h0ZWQgbW9yZSBoaWdobHkgdGhhbiBhbGwgTE1zIHdpdGggcG9zaXRpdmUgd2VpZ2h0cykiCisgICAgICAgICA8PCBlbmRsOworICBlbHNlCisgICAgY2VyciA8PCAiTm90IGFsbG93aW5nIG5lZ2F0aXZlIHBhcmFtZXRlcnMgKG1pbGQgYXNzdW1wdGlvbiwgYW5kIGZhc3RlcikiCisgICAgICAgICA8PCBlbmRsOworICBjZXJyIDw8ICIgTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9uczogIiA8PCBJVEVSQVRJT05TIDw8IGVuZGw7CisgIGNlcnIgPDwgIiBNaW5pbXVtIHN0ZXAgc2l6ZTogIiA8PCBtaW5zdGVwc2l6ZSA8PCBlbmRsOworICBjZXJyIDw8ICIgUGVycGxleGl0eSBjb21wdXRlZCB3aXRoICIgPDwgY29udGV4dF9zaXplICsgMSA8PCAiLWdyYW1zIiA8PCBlbmRsOworCisgIGlmICgoIUFsbG93RXh0cmFwb2xhdGlvbikgJiYgKG5sYW1iZGFzID09IDEpKSB7CisgICAgLy8gTm90aGluZyB0byBvcHRpbWl6ZS4gT25lIHBhcmFtZXRlciwgYW5kIGl0IHN1bXMgdG8gb25lLgorICAgIGNlcnIgPDwgIlRyYWluaW5nIGNvbXBsZXRlLiBCZXN0IHdlaWdodHM6IiA8PCBlbmRsOworICAgIGNlcnIgPDwgc2V0cHJlY2lzaW9uKDE2KSA8PCAxLjAgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBTbWFydCBpbml0aWFsaXphdGlvbiBvZiBmdWxsIHR1bmluZyBieSB0dW5pbmcgb24gc21hbGxlciBzZXQgZmlyc3QKKyAgdmVjdG9yPHN0ZDo6c2l6ZV90PiBsaW5lc3RvdHVuZTsKKyAgaWYgKGxpbmVzaW5zdGFydGVyY29ycHVzIDwgY29ycHVzLnNpemUoKSkKKyAgICBsaW5lc3RvdHVuZS5wdXNoX2JhY2sobGluZXNpbnN0YXJ0ZXJjb3JwdXMpOworICBsaW5lc3RvdHVuZS5wdXNoX2JhY2soY29ycHVzLnNpemUoKSk7CisKKyAgZm9yIChzdGQ6OnNpemVfdCBzZXRpdGVyID0gMDsgc2V0aXRlciA8IGxpbmVzdG90dW5lLnNpemUoKTsgKytzZXRpdGVyKSB7CisgICAgY2VyciA8PCAiIE5vdyB0dW5pbmcgdGhlIGZpcnN0ICIgPDwgbGluZXN0b3R1bmVbc2V0aXRlcl0gPDwgIiBsaW5lcyIKKyAgICAgICAgIDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8RFZlY3Rvcj4gcGFyYW1oaXN0b3J5OworICAgIGRvdWJsZSBiZXN0cHBsID0gMC4wOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVzdCByZWNvcmRlZCBwcGwKKyAgICBEVmVjdG9yIGJlc3RncmFkID0gRFZlY3Rvcjo6WmVybyhubGFtYmRhcyk7ICAgIC8vIGNvcnJlc3AuIGdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmVhc2libGUgZGlyZWN0aW9uCisgICAgRFZlY3RvciBiZXN0cGFyYW1zID0gRFZlY3Rvcjo6WmVybyhubGFtYmRhcyk7ICAvLyBjb3JyZXNwLiB3ZWlnaHRzCisgICAgZG91YmxlIG1heGJlc3RncmFkc3RlcCA9IDAuMDsgICAgLy8gbWF4IGZlYXNpYmxlIHN0ZXAgaW4gZ3JhZC4gZGlyZWN0aW9uCisgICAgZG91YmxlIHN0ZXBzaXplID0gaW5pdHN0ZXBzaXplOyAgLy8gSW5pdGlhbCBzdGVwIHNpemUKKworICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgSVRFUkFUSU9OUzsgKytpdGVyKSB7ICAvLyBpdGVyYXRpb25zCisgICAgICBjZXJyIDw8ICJJVEVSQVRJT04gIiA8PCBpdGVyICsgMSA8PCAiIChvZiBtYXggIiA8PCBJVEVSQVRJT05TCisgICAgICAgICAgIDw8ICIpLCBzdGVwIHNpemUgIiA8PCBzdGVwc2l6ZSA8PCAiIChvZiBtaW4gIiA8PCBtaW5zdGVwc2l6ZQorICAgICAgICAgICA8PCAiKSwgd2VpZ2h0czogIiA8PCBlbmRsOworICAgICAgY2VyciA8PCBwYXJhbXMgPDwgZW5kbDsKKworICAgICAgcGFyYW1oaXN0b3J5LnB1c2hfYmFjayhwYXJhbXMpOworICAgICAgLy8gSGFyZC1jb2RlZCB0byBiZSA2LWdyYW0gcGVycGxleGl0eQorICAgICAgdmVjdG9yPHN0cmluZz4gY29udGV4dChjb250ZXh0X3NpemUsICI8cz4iKTsKKyAgICAgIGRvdWJsZSBwcGwgPSAwLjA7CisgICAgICBEVmVjdG9yIGdyYWQgPSBEVmVjdG9yOjpaZXJvKG5sYW1iZGFzKTsKKyAgICAgIERNYXRyaXggSCA9IERNYXRyaXg6Olplcm8obmxhbWJkYXMsIG5sYW1iZGFzKTsKKyAgICAgIGNlcnIgPDwgIm8iOworCisgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHVua3Byb2JzKG1vZGVscy5zaXplKCkpOworICAgICAgLy8gZm9yIGVhY2ggc2VudGVuY2UgaW4gdHVuaW5nIGNvcnB1cworICAgICAgZm9yIChzdGQ6OnNpemVfdCBjaSA9IDA7IGNpIDwgbGluZXN0b3R1bmVbc2V0aXRlcl07ICsrY2kpIHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4gJnNlbnRlbmNlID0gY29ycHVzW2NpXTsKKyAgICAgICAgLy8gcGFkIG91ciBiZWdpbm5pbmcgY29udGV4dAorICAgICAgICBzdGQ6OmZpbGwoY29udGV4dC5iZWdpbigpLCBjb250ZXh0LmVuZCgpLCAiPHM+Iik7CisKKyAgICAgICAgLy8gZm9yIGVhY2ggd29yZCBpbiBzZW50ZW5jZQorICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IHQgPSAwOyB0IDwgc2VudGVuY2Uuc2l6ZSgpOyArK3QpIHsKKyAgICAgICAgICAvLyBmaWxsIGluIHVuayBwcm9iYWJpbGl0aWVzIGZvciB0aGlzIGNvbnRleHQsIHRvIGF2b2lkIGhhdmluZyB0bworICAgICAgICAgIC8vIGxvb2sgdGhlbSB1cCByZWR1bmRhbnRseSBsYXRlcgorICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgbWkgPSAwOyBtaSA8IG1vZGVscy5zaXplKCk7ICsrbWkpIHsKKyAgICAgICAgICAgIHVua3Byb2JzW21pXSA9IGxvZ1Byb2IobW9kZWxzW21pXSwgY29udGV4dCwgbG06OmtVTkspOworICAgICAgICAgIH0KKworICAgICAgICAgIERWZWN0b3IgZmVhdHMgPSBEVmVjdG9yOjpaZXJvKG5sYW1iZGFzKTsKKyAgICAgICAgICAvLyBwcm9icyBmb3IgYWN0dWFsIG4tZ3JhbQorICAgICAgICAgIHNldF9mZWF0dXJlcyhjb250ZXh0LCBzZW50ZW5jZVt0XSwgbW9kZWxzLCB1bmtwcm9icywgZmVhdHMpOworCisgICAgICAgICAgZG91YmxlIHogPSAwLjA7CisgICAgICAgICAgZG91YmxlIG1heGxvZ3Byb2IgPSAwLjA7ICAvLyBBbGxvd3MgdXMgdG8gYXZvaWQgb3ZlcmZsb3cgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgcGFyYW1zCisgICAgICAgICAgRFZlY3RvciBleHBlY3RmZWF0cyA9IERWZWN0b3I6Olplcm8obmxhbWJkYXMpOworICAgICAgICAgIERNYXRyaXggZXhwZWN0ZmVhdG1hdHJpeCA9IERNYXRyaXg6Olplcm8obmxhbWJkYXMsIG5sYW1iZGFzKTsKKyAgICAgICAgICAvLyBMb2dpY2FsbHksIHRoaXMgc2hvdWxkIGJlIGluIHRoZSBsb29wJ3Mgc2NvcGUKKyAgICAgICAgICBEVmVjdG9yIGl0ZXJmZWF0cyA9IERWZWN0b3I6Olplcm8obmxhbWJkYXMpOworCisgICAgICAgICAgLy8gcHJvYnMgb3ZlciBwb3NzaWJsZSBuLWdyYW1zLCBmb3Igbm9ybWFsaXphdGlvbgorICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB2b2NhYi5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc2V0X2ZlYXR1cmVzKGNvbnRleHQsIHZvY2FiW2ldLCBtb2RlbHMsIHVua3Byb2JzLCBpdGVyZmVhdHMpOworICAgICAgICAgICAgZG91YmxlIGxvZ3Byb2IgPSBwYXJhbXMuZG90KGl0ZXJmZWF0cyk7CisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgIC8vIG1heGxvZ3Byb2I9bG9ncHJvYjsvLyBtb3JlIHByZWNpc2UsIGxlc3MgdW5kZXJmbG93CisgICAgICAgICAgICAgIG1heGxvZ3Byb2IgPSAwLjA7ICAvLyByZWR1Y2VzIG51bWJlciBvZiB1cGRhdGVzCisgICAgICAgICAgICB9IGVsc2UgaWYgKGxvZ3Byb2IgPiBtYXhsb2dwcm9iKSB7CisgICAgICAgICAgICAgIC8vIEFkanVzdCBhbGwgb2xkIHZhbHVlcyB0byBuZXcgc2NhbGluZworICAgICAgICAgICAgICBkb3VibGUgYWRqdXN0ID0gZXhwKG1heGxvZ3Byb2IgLSBsb2dwcm9iKTsKKyAgICAgICAgICAgICAgeiAqPSBhZGp1c3Q7CisgICAgICAgICAgICAgIGV4cGVjdGZlYXRzICo9IGFkanVzdDsKKyAgICAgICAgICAgICAgZXhwZWN0ZmVhdG1hdHJpeCAqPSBhZGp1c3Q7CisgICAgICAgICAgICAgIG1heGxvZ3Byb2IgPSBsb2dwcm9iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIHVzID0gZXhwKHBhcmFtcy5kb3QoaXRlcmZlYXRzKSAtIG1heGxvZ3Byb2IpOyAgLy8gbWVhc3VyZQorCisgICAgICAgICAgICB6ICs9IHVzOworICAgICAgICAgICAgZXhwZWN0ZmVhdHMgKz0gdXMgKiBpdGVyZmVhdHM7CisgICAgICAgICAgICBleHBlY3RmZWF0bWF0cml4ICs9IHVzICogKGl0ZXJmZWF0cyAqIGl0ZXJmZWF0cy50cmFuc3Bvc2UoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGV4cGVjdGZlYXRzIC89IHo7ICAgICAgIC8vIEV4cGVjdGF0aW9uCisgICAgICAgICAgZXhwZWN0ZmVhdG1hdHJpeCAvPSB6OyAgLy8gRXhwZWN0YXRpb24KKworICAgICAgICAgIC8vIEFkZCBzZW50ZW5jZVt0XSB0byB0aGUgZW5kIG9mIHRoZSBjb250ZXh0CisgICAgICAgICAgY29udGV4dFswXSA9IHNlbnRlbmNlW3RdOworICAgICAgICAgIHN0ZDo6cm90YXRlKGNvbnRleHQuYmVnaW4oKSwgY29udGV4dC5iZWdpbigpICsgMSwgY29udGV4dC5lbmQoKSk7CisKKyAgICAgICAgICAvLyBQZXJwbGV4aXR5IChhY3R1YWxseSBsb2cocGVycGxleGl0eSkpCisgICAgICAgICAgcHBsICs9IHBhcmFtcy5kb3QoZmVhdHMpIC0gbG9nKHopOworICAgICAgICAgIC8vIEdyYWRpZW50CisgICAgICAgICAgZ3JhZCArPSBmZWF0cyAtIGV4cGVjdGZlYXRzOworICAgICAgICAgIC8vIEhlc3NpYW4KKyAgICAgICAgICBIICs9IC1leHBlY3RmZWF0bWF0cml4ICsgZXhwZWN0ZmVhdHMgKiBleHBlY3RmZWF0cy50cmFuc3Bvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBjZXJyIDw8ICIuIjsKKyAgICAgIH0KKyAgICAgIHBwbCAqPSAtMS4wIC8gY29ycHVzLnNpemUoKTsKKyAgICAgIC8vIFRoZSBncmFkaWVudCBhbmQgSGVzc2lhbiBjb2VmZmljaWVudHMgY2FuY2VsIG91dCwgc28gZG9uJ3QgcmVhbGx5IG5lZWQKKyAgICAgIC8vIHRvIGRvIHRoaXMsIGJ1dCBpdCdzIGZhc3QuCisgICAgICBncmFkICo9IC0xLjAgLyBjb3JwdXMuc2l6ZSgpOworICAgICAgSCAqPSAtMS4wIC8gY29ycHVzLnNpemUoKTsKKyAgICAgIGNlcnIgPDwgIiBsb2coUFBMKT0iIDw8IHBwbCA8PCAiIFBQTD0iIDw8IGV4cChwcGwpIDw8IGVuZGw7CisKKyAgICAgIC8vIFVzZSByZXN1bHRzIHRvIGRldGVybWluZSBuZXh0IHBhcmFtcyB0byBldmFsdWF0ZQorICAgICAgaWYgKChwcGwgPCBiZXN0cHBsKSB8fCAoaXRlciA9PSAwKSkgeworICAgICAgICAvLyBGb3VuZCBhIG5ldyBiZXN0CisgICAgICAgIGJlc3RwcGwgPSBwcGw7CisgICAgICAgIGJlc3RwYXJhbXMgPSBwYXJhbXM7CisgICAgICAgIGRvdWJsZSBiZXN0c3RlcHNpemUgPSBzdGVwc2l6ZTsKKyAgICAgICAgaWYgKGl0ZXIgPiAwKQorICAgICAgICAgIGNlcnIgPDwgIiBOZXcgYmVzdCBwb2ludCBmb3VuZCwgc3RlcCBzaXplICIgPDwgYmVzdHN0ZXBzaXplIDw8IGVuZGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjZXJyIDw8ICIgTmV3IGJlc3QgcG9pbnQgZm91bmQiIDw8IGVuZGw7CisKKyAgICAgICAgYmVzdGdyYWQgPSBncmFkOworICAgICAgICBEVmVjdG9yIGRlbHRhcGFyYW1zID0gRFZlY3Rvcjo6WmVybyhubGFtYmRhcyk7CisKKyAgICAgICAgYm9vbCByZXZlcnR0b2dyYWQgPSBmYWxzZTsKKworICAgICAgICB7CisgICAgICAgICAgZG91YmxlIGdyYWRub3JtID0gMC4wOworICAgICAgICAgIGRvdWJsZSBzb2x2ZW5vcm0gPSAwLjA7CisgICAgICAgICAgZG91YmxlIGVycm5vcm0gPSAwLjA7CisgICAgICAgICAgLy8gRmluZCBOZXd0b24gc3RlcAorICAgICAgICAgIGlmIChBbGxvd0V4dHJhcG9sYXRpb24pIHsKKyAgICAgICAgICAgIGRlbHRhcGFyYW1zID0gLUguY29sUGl2SG91c2Vob2xkZXJRcigpLnNvbHZlKGdyYWQpOworICAgICAgICAgICAgRWlnZW46OlNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8RE1hdHJpeD4gZWlnZW5zb2x2ZXIoSCk7CisgICAgICAgICAgICBjZXJyIDw8ICJFaWdlbnZhbHVlcyAobmVnYXRpdmUgdmFsdWVzIHNob3VsZCBiZSBuZWdsaWdpYmxlKTpcbiIKKyAgICAgICAgICAgICAgICAgPDwgZWlnZW5zb2x2ZXIuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOworICAgICAgICAgICAgZ3JhZG5vcm0gPSBncmFkLm5vcm0oKTsKKyAgICAgICAgICAgIHNvbHZlbm9ybSA9IChIICogZGVsdGFwYXJhbXMpLm5vcm0oKTsKKyAgICAgICAgICAgIGVycm5vcm0gPSAoZ3JhZCArIEggKiBkZWx0YXBhcmFtcykubm9ybSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQcm9qZWN0IGdyYWRpZW50IHRvIGludGVycG9sYXRpb24gc3BhY2UKKyAgICAgICAgICAgIGJlc3RncmFkID0gTiAqIE4udHJhbnNwb3NlKCkgKiBiZXN0Z3JhZDsKKworICAgICAgICAgICAgLy8gbmVlZCB0byB3b3JrIGluIG51bGxzcGFjZSB0byBtYWludGFpbiB1bml0IHN1bQorICAgICAgICAgICAgRE1hdHJpeCBIbnVsbCA9IERNYXRyaXg6Olplcm8obmxhbWJkYXMgLSAxLCBubGFtYmRhcyAtIDEpOworCisgICAgICAgICAgICAvLyBMb29rcyBsaWtlIHdlIGRvbid0IG5lZWQgdGhlIHRocmVlIGxpbmVzIGJlbG93IC0tIHdlIGNhbiBkbyBpdAorICAgICAgICAgICAgLy8gaW4tbGluZSAoaWYgd2UgZG9uJ3Qgd2FudCBlaWdlbnZhbHVlcykKKyAgICAgICAgICAgIEhudWxsID0gTi50cmFuc3Bvc2UoKSAqIEggKiBOOworICAgICAgICAgICAgRWlnZW46OlNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8RE1hdHJpeD4gZWlnZW5zb2x2ZXIoSG51bGwpOworICAgICAgICAgICAgY2VyciA8PCAiRWlnZW52YWx1ZXMgKGJlc3QgaWYgYWxsIHBvc2l0aXZlKTpcbiIKKyAgICAgICAgICAgICAgICAgPDwgZWlnZW5zb2x2ZXIuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOworICAgICAgICAgICAgZGVsdGFwYXJhbXMgPQorICAgICAgICAgICAgICAgIC1OICogSG51bGwuZnVsbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZShOLnRyYW5zcG9zZSgpICogZ3JhZCk7CisgICAgICAgICAgICBncmFkbm9ybSA9IChOLnRyYW5zcG9zZSgpICogZ3JhZCkubm9ybSgpOworICAgICAgICAgICAgc29sdmVub3JtID0gKEhudWxsICogZGVsdGFwYXJhbXMpLm5vcm0oKTsKKyAgICAgICAgICAgIGVycm5vcm0gPSAoTi50cmFuc3Bvc2UoKSAqIGdyYWQgKyBIbnVsbCAqIGRlbHRhcGFyYW1zKS5ub3JtKCk7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGV2ZW50dWFsbHksIHBhcmFtcyA9IGJlc3RwYXJhbXMgKyBkZWx0YXBhcmFtczsKKyAgICAgICAgICBjZXJyIDw8ICIgRXJyb3Igbm9ybSAiIDw8IGVycm5vcm0gPDwgIiwgZ3JhZGllbnQgbm9ybSAiIDw8IGdyYWRub3JtCisgICAgICAgICAgICAgICA8PCAiLCBzb2x1dGlvbiBub3JtICIgPDwgc29sdmVub3JtIDw8IGVuZGw7CisgICAgICAgICAgLy8gQ2hlY2sgZm9yIG51bWVyaWNhbCBlcnJvcnMuIERvbid0IHRydXN0IE5ld3RvbiBzdGVwIGlmIHRoZXkgYXJlIHRvbworICAgICAgICAgIC8vIGJpZy4KKyAgICAgICAgICBpZiAoZXJybm9ybSA8IDFlLTEyICogc3RkOjptYXgoMS4wLCBzdGQ6Om1pbihncmFkbm9ybSwgc29sdmVub3JtKSkpIHsKKyAgICAgICAgICAgIHN0ZXBzaXplID0gMC4wOworICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG5sYW1iZGFzOyBpKyspCisgICAgICAgICAgICAgIHN0ZXBzaXplICs9IGRlbHRhcGFyYW1zKGkpICogZGVsdGFwYXJhbXMoaSk7CisgICAgICAgICAgICBzdGVwc2l6ZSA9IHNxcnQoc3RlcHNpemUpOyAgLy8gaG9sZHMgbGVuZ3RoIG9mIE5ld3RvbiBzdGVwCisgICAgICAgICAgICBjZXJyIDw8ICJOZXd0b24gc3RlcCwgbGVuZ3RoICIgPDwgc3RlcHNpemUgPDwgIjogIiA8PCBlbmRsOworICAgICAgICAgICAgY2VyciA8PCBkZWx0YXBhcmFtcyA8PCBlbmRsOworCisgICAgICAgICAgICAvLyBEb24ndCBsZXQgdGhlIE5ld3RvbiBzdGVwIGdldCBtdWNoIGJpZ2dlciB0aGFuIGxhc3Qgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgLy8gc3RlcCAobGlrZWx5IHdvdWxkIGhhdmUgdG8gc2hyaW5rIGxhdGVyLCBhbnl3YXkpCisgICAgICAgICAgICBpZiAoc3RlcHNpemUgPiAyLjAgKiBiZXN0c3RlcHNpemUpIHsKKyAgICAgICAgICAgICAgc3RlcHNpemUgPSAxLjUgKiBiZXN0c3RlcHNpemU7CisgICAgICAgICAgICAgIHJldmVydHRvZ3JhZCA9IHRydWU7CisgICAgICAgICAgICAgIGNlcnIgPDwgIlJldmVydGluZyB0byBncmFkaWVudCwgYmVjYXVzZSBOZXd0b24gc3RlcCBpcyB0b28gbGFyZ2UuIgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ZXBzaXplID0gMS41ICogYmVzdHN0ZXBzaXplOworICAgICAgICAgICAgcmV2ZXJ0dG9ncmFkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNlcnIgPDwgIlJldmVydGluZyB0byBncmFkaWVudCwgYmVjYXVzZSBOZXd0b24gc3RlcCBjb21wdXRhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICJ1bnN1Y2Nlc3NmdWwuIiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBNYWtlIHRoZSBncmFkaWVudCB1bml0IG5vcm0sIGluIGZlYXNpYmxlIHNlYXJjaCBkaXJlY3Rpb24uCisgICAgICAgICAgaWYgKCFBbGxvd05lZ2F0aXZlUGFyYW1zKSB7CisgICAgICAgICAgICAvLyBQcm9qZWN0IGdyYWRpZW50IHRvIGJlIGEgZmVhc2libGUgc2VhcmNoIGRpcmVjdGlvbgorICAgICAgICAgICAgdmVjdG9yPGJvb2w+IGFjdGl2ZShubGFtYmRhcywgZmFsc2UpOworICAgICAgICAgICAgc3RkOjpzaXplX3QgbnVtYWN0aXZlID0gMDsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBubGFtYmRhczsgaSsrKSB7CisgICAgICAgICAgICAgIC8vIFByb2plY3QgZ3JhZGllbnQgdG8gaW5hY3RpdmUgY29uc3RyYWludHMKKyAgICAgICAgICAgICAgaWYgKChiZXN0cGFyYW1zKGkpID09IDApICYmIChiZXN0Z3JhZChpKSA+IDApKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlW2ldID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBiZXN0Z3JhZChpKSA9IDAuMDsgIC8vIERvIHRoaXMgbm93LCBpbiBjYXNlIGV4dHJhcG9sYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93ZWQuCisgICAgICAgICAgICAgICAgKytudW1hY3RpdmU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1hY3RpdmUgPiAwKSB7CisgICAgICAgICAgICAgIGlmICghQWxsb3dFeHRyYXBvbGF0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gUHJvamVjdCBncmFkaWVudCwgZm9yIGFjdGl2aXR5IGNvbmNlcm5zCisgICAgICAgICAgICAgICAgRE1hdHJpeCB0bXBOID0gRE1hdHJpeDo6Q29uc3RhbnQoCisgICAgICAgICAgICAgICAgICAgIG5sYW1iZGFzLCBubGFtYmRhcyAtIDEsCisgICAgICAgICAgICAgICAgICAgIC0xLjAgLyBzcXJ0KChubGFtYmRhcyAtIG51bWFjdGl2ZSAtIDEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChubGFtYmRhcyAtIG51bWFjdGl2ZSAtIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmxhbWJkYXMgLSBudW1hY3RpdmUgLSAxLjApKTsKKworICAgICAgICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBubGFtYmRhcyAtIDE7ICsraSkKKyAgICAgICAgICAgICAgICAgIHRtcE4oaSwgaSkgPSB0bXBOKGksIGkpICogKDEuMCAtIChubGFtYmRhcyAtIG51bWFjdGl2ZSkpOworCisgICAgICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG5sYW1iZGFzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBqID0gMDsgaiA8IG5sYW1iZGFzIC0gMTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgdG1wTihpLCBqKSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBwcm9qZWN0ZWQgZ3JhZGllbnQgb250byB1bml0IHN1bSBhbmQgYWN0aXZlIHNldCBjb25zdHJhaW50cworICAgICAgICAgICAgICAgIGJlc3RncmFkID0gLXRtcE4gKiB0bXBOLnRyYW5zcG9zZSgpICogYmVzdGdyYWQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIG5vcm0gPSAwLjA7CisgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBubGFtYmRhczsgaSsrKQorICAgICAgICAgIG5vcm0gKz0gYmVzdGdyYWQoaSkgKiBiZXN0Z3JhZChpKTsKKyAgICAgICAgaWYgKG5vcm0gIT0gMCkgeworICAgICAgICAgIGJlc3RncmFkIC89IHNxcnQobm9ybSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2VyciA8PCAiIEdyYWRpZW50IGlzIHplcm8uIEV4aXRpbmcuIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjZXJyIDw8ICJHcmFkaWVudCwgdW5pdCBsZW5ndGg6ICIgPDwgZW5kbDsKKyAgICAgICAgY2VyciA8PCBiZXN0Z3JhZCA8PCBlbmRsOworCisgICAgICAgIC8vIEZpbmQgbWF4IHN0ZXAgaW4gZ3JhZGllbnQgZGlyZWN0aW9uIHRoYXQgcmVtYWlucyBmZWFzaWJsZS4KKyAgICAgICAgaWYgKCFBbGxvd05lZ2F0aXZlUGFyYW1zKSB7CisgICAgICAgICAgZG91YmxlIGxpbWl0ZnJhY3Rpb24gPSAwLjU7ICAvLyBOb3QgMTogSWYgTmV3dG9uIHN0ZXAgaXMgYmFkLCBwcm9iYWJseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBuZWVkIHRvIHJlZHVjZSBsYXRlciBhbnl3YXkKKyAgICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbmxhbWJkYXM7IGkrKykgeworICAgICAgICAgICAgaWYgKGJlc3RwYXJhbXMoaSkgLSBtYXhiZXN0Z3JhZHN0ZXAgKiBiZXN0Z3JhZChpKSA8IDApIHsKKyAgICAgICAgICAgICAgZG91YmxlIHRtcGxpbWl0ZnJhY3Rpb24gPQorICAgICAgICAgICAgICAgICAgYmVzdHBhcmFtcyhpKSAvIChiZXN0Z3JhZChpKSAqIG1heGJlc3RncmFkc3RlcCk7CisgICAgICAgICAgICAgIGlmICh0bXBsaW1pdGZyYWN0aW9uIDwgbGltaXRmcmFjdGlvbikKKyAgICAgICAgICAgICAgICBsaW1pdGZyYWN0aW9uID0gdG1wbGltaXRmcmFjdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgbWF4YmVzdGdyYWRzdGVwID0gc3RlcHNpemUgKiBsaW1pdGZyYWN0aW9uOworICAgICAgICAgIGNlcnIgPDwgIiBNYXggZ3JhZCBzdGVwOiAiIDw8IG1heGJlc3RncmFkc3RlcCA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1heGJlc3RncmFkc3RlcCA9IHN0ZXBzaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFyZXZlcnR0b2dyYWQpIHsKKyAgICAgICAgICBpZiAoIUFsbG93TmVnYXRpdmVQYXJhbXMpIHsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBubGFtYmRhczsgaSsrKSB7CisgICAgICAgICAgICAgIGlmIChiZXN0cGFyYW1zKGkpICsgZGVsdGFwYXJhbXMoaSkgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZG8gTmV3dG9uIHN0ZXAuIFJldmVydCB0byBkZXNjZW50LgorICAgICAgICAgICAgICAgIHJldmVydHRvZ3JhZCA9IHRydWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHJldmVydHRvZ3JhZCkgeworICAgICAgICAgICAgY2VyciA8PCAiUmV2ZXJ0aW5nIHRvIGdyYWRpZW50LCBzaW5jZSBOZXd0b24gc3RlcCBpbmZlYXNpYmxlOiIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV2ZXJ0dG9ncmFkKSB7CisgICAgICAgICAgc3RlcHNpemUgPSBtYXhiZXN0Z3JhZHN0ZXA7CisgICAgICAgICAgZGVsdGFwYXJhbXMgPSAtYmVzdGdyYWQgKiBzdGVwc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmFtcyA9IGJlc3RwYXJhbXMgKyBkZWx0YXBhcmFtczsKKyAgICAgICAgY2VyciA8PCAiQ2hhbmdlIGluIHdlaWdodHMgZnJvbSBiZXN0LCBzdGVwIHNpemUgIiA8PCBzdGVwc2l6ZSA8PCAiOiAiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgY2VyciA8PCBkZWx0YXBhcmFtcyA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTGFzdCBhdHRlbXB0IGZhaWxlZCBhdCBiZWluZyBiZXR0ZXIsIHNvIG1vdmUgaW4gZ3JhZGllbnQgZGlyZWN0aW9uCisgICAgICAgIC8vIHdpdGggcmVkdWNlZCBzdGVwLgorICAgICAgICAvLyBzdGVwc2l6ZSByZWR1Y3Rpb24gZmFjdG9yIGlzIGVtcGlyaWNhbAorICAgICAgICBzdGVwc2l6ZSA9IHN0ZDo6bWluKHN0ZXBkZWNyZWFzZWZhY3RvciAqIHN0ZXBzaXplLCBtYXhiZXN0Z3JhZHN0ZXApOworICAgICAgICBjZXJyIDw8ICJUYWtpbmcgc21hbGxlciBzdGVwOiAiIDw8IHN0ZXBzaXplIDw8IGVuZGw7CisgICAgICAgIHBhcmFtcyA9IGJlc3RwYXJhbXMgLSBiZXN0Z3JhZCAqIHN0ZXBzaXplOworICAgICAgfQorICAgICAgLy8gQ2xlYW4gdGhlIHBhcmFtZXRlcnMgdXAuCisgICAgICBkb3VibGUgc3VtcGFyYW1zID0gMC4wOworICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG5sYW1iZGFzOyBpKyspIHsKKyAgICAgICAgaWYgKCFBbGxvd05lZ2F0aXZlUGFyYW1zKSB7CisgICAgICAgICAgaWYgKHBhcmFtcyhpKSA8IDFlLTEyKSB7CisgICAgICAgICAgICAvLyBzbmFwIHRvIHplcm8sIGZvciBhY3RpdmUgc2V0IGFuZCBkdXBsaWNhdGUgd2VpZ2h0cworICAgICAgICAgICAgcGFyYW1zKGkpID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3VtcGFyYW1zICs9IHBhcmFtcyhpKTsKKyAgICAgIH0KKyAgICAgIGlmICghQWxsb3dFeHRyYXBvbGF0aW9uKSBwYXJhbXMgLz0gc3VtcGFyYW1zOworCisgICAgICBib29sIGR1cGxpY2F0ZWVudHJ5ID0gZmFsc2U7CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1oaXN0b3J5LnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChwYXJhbXMgPT0gcGFyYW1oaXN0b3J5W2ldKSBkdXBsaWNhdGVlbnRyeSA9IHRydWU7CisgICAgICB9CisgICAgICB3aGlsZSAoKGR1cGxpY2F0ZWVudHJ5KSAmJiAoc3RlcHNpemUgPj0gbWluc3RlcHNpemUpKSB7CisgICAgICAgIGNlcnIgPDwgIkR1cGxpY2F0ZSB3ZWlnaHQgZm91bmQ6ICIgPDwgZW5kbDsKKyAgICAgICAgY2VyciA8PCBwYXJhbXMgPDwgZW5kbDsKKyAgICAgICAgc3RlcHNpemUgKj0gMC41OyAgLy8gU3RlcCBpbiB0aGlzIGRpcmVjdGlvbiBpcyBkdXBsaWNhdGUsIHNvIHRyeSBhZ2FpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHNtYWxsZXIgc3RlcAorICAgICAgICBwYXJhbXMgPSBiZXN0cGFyYW1zIC0gc3RlcHNpemUgKiBiZXN0Z3JhZDsKKworICAgICAgICBzdW1wYXJhbXMgPSAwLjA7CisgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBubGFtYmRhczsgaSsrKSB7CisgICAgICAgICAgaWYgKCFBbGxvd05lZ2F0aXZlUGFyYW1zKSB7CisgICAgICAgICAgICBpZiAocGFyYW1zKGkpIDwgMWUtMTIpIHBhcmFtcyhpKSA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIHN1bXBhcmFtcyArPSBwYXJhbXMoaSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBbGxvd0V4dHJhcG9sYXRpb24pIHBhcmFtcyAvPSBzdW1wYXJhbXM7CisKKyAgICAgICAgZHVwbGljYXRlZW50cnkgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHBhcmFtaGlzdG9yeS5zaXplKCk7ICsraSkgeworICAgICAgICAgIGlmIChwYXJhbXMgPT0gcGFyYW1oaXN0b3J5W2ldKSBkdXBsaWNhdGVlbnRyeSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdGVwc2l6ZSA8IG1pbnN0ZXBzaXplKSBicmVhazsgIC8vIE5vIG5lZWQgdG8gbWFrZSBhbm90aGVyIHN0ZXAKKyAgICB9CisKKyAgICBwYXJhbXMgPSBiZXN0cGFyYW1zOyAgLy8gU28gdGhhdCBuZXh0IHNldGl0ZXIgaXMgY29ycmVjdAorICAgIGNlcnIgPDwgIlRyYWluaW5nIGNvbXBsZXRlLiBCZXN0IHdlaWdodHM6IiA8PCBlbmRsOworICAgIGNlcnIgPDwgcGFyYW1zIDw8IGVuZGw7CisgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHN0ZDo6c3RyaW5nIHR1bmluZ19kYXRhOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbG1zOworCisgIHRyeSB7CisgICAgbmFtZXNwYWNlIHBvID0gYm9vc3Q6OnByb2dyYW1fb3B0aW9uczsKKyAgICBwbzo6b3B0aW9uc19kZXNjcmlwdGlvbiBvcHRpb25zKCJ0cmFpbi1wYXJhbXMiKTsKKworICAgIG9wdGlvbnMuYWRkX29wdGlvbnMoKSgiaGVscCxoIiwgcG86OmJvb2xfc3dpdGNoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTaG93IHRoaXMgaGVscCBtZXNzYWdlIikoCisgICAgICAgICJub19iaWFzX3Rlcm0sQiIsIHBvOjpib29sX3N3aXRjaCgpLCAiRG8gbm90IGluY2x1ZGUgYSAnYmlhcycgZmVhdHVyZSIpKAorICAgICAgICAidHVuaW5nX2RhdGEsdCIsIHBvOjp2YWx1ZTxzdGQ6OnN0cmluZz4oJnR1bmluZ19kYXRhKSwKKyAgICAgICAgIkZpbGUgdG8gdHVuZSBwZXJwbGV4aXR5IG9uIikoCisgICAgICAgICJtb2RlbCxtIiwgcG86OnZhbHVlPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+KCZsbXMpLAorICAgICAgICAiTGFuZ3VhZ2UgbW9kZWxzIGluIEtlbkxNIGZvcm1hdCB0byBpbnRlcnBvbGF0ZSIpOworICAgIHBvOjp2YXJpYWJsZXNfbWFwIHZtOworICAgIHBvOjpzdG9yZShwbzo6cGFyc2VfY29tbWFuZF9saW5lKGFyZ2MsIGFyZ3YsIG9wdGlvbnMpLCB2bSk7CisKKyAgICAvLyBEaXNwbGF5IGhlbHAKKyAgICBpZiAoYXJnYyA9PSAxIHx8IHZtWyJoZWxwIl0uYXM8Ym9vbD4oKSkgeworICAgICAgc3RkOjpjZXJyIDw8IG9wdGlvbnMgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICh2bVsibm9fYmlhc190ZXJtIl0uYXM8Ym9vbD4oKSkgSEFTX0JJQVMgPSBmYWxzZTsKKyAgICBsbXMgPSB2bVsibW9kZWwiXS5hczxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPigpOworICAgIHR1bmluZ19kYXRhID0gdm1bInR1bmluZ19kYXRhIl0uYXM8c3RkOjpzdHJpbmc+KCk7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZlKSB7CisgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAobG1zLnNpemUoKSA8IDIpIHsKKyAgICBzdGQ6OmNlcnIKKyAgICAgICAgPDwgIlBsZWFzZSBzcGVjaWZ5IGF0IGxlYXN0IHR3byBsYW5ndWFnZSBtb2RlbCBmaWxlcyB3aXRoIC1tIExNLktMTVxuIjsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAodHVuaW5nX2RhdGEuZW1wdHkoKSkgeworICAgIHN0ZDo6Y2VyciA8PCAiUGxlYXNlIHNwZWNpZnkgdHVuaW5nIHNldCB3aXRoIC10IEZJTEUuVFhUXG4iOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gR3Jvd2FibGUgdm9jYWIgaGVyZQorICAvLyBHcm93YWJsZVZvY2FiIGd2b2MoMTAwMDAwKTsgLy9kdW1teSBkZWZhdWx0CisKKyAgLy8gbm8gY29tbWVudAorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50ICo+IHZtYXA7CisKKyAgLy8gc3R1ZmYgaXQgaW50byB0aGUKKyAgRW51bWVyYXRlR2xvYmFsVm9jYWIgKmdsb2JhbFZvY2FiQnVpbGRlciA9CisgICAgICBuZXcgRW51bWVyYXRlR2xvYmFsVm9jYWIoJnZtYXAsIGxtcy5zaXplKCkpOworCisgIENvbmZpZyBjZmc7CisgIGNmZy5lbnVtZXJhdGVfdm9jYWIgPSAoRW51bWVyYXRlVm9jYWIgKilnbG9iYWxWb2NhYkJ1aWxkZXI7CisKKyAgLy8gbG9hZCBtb2RlbHMKKyAgc3RkOjp2ZWN0b3I8TW9kZWwgKj4gbW9kZWxzOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbG1zLnNpemUoKTsgaSsrKSB7CisgICAgc3RkOjpjZXJyIDw8ICJMb2FkaW5nIExNIGZpbGU6ICIgPDwgbG1zW2ldIDw8IHN0ZDo6ZW5kbDsKKworICAgIC8vIGhhYWFhY2sKKyAgICBnbG9iYWxWb2NhYkJ1aWxkZXItPlNldEN1ck1vZGVsKGkpOyAgLy8geWVzIHRoaXMgaXMgZHVtYgorCisgICAgTW9kZWwgKnRoaXNfbW9kZWwgPSBuZXcgTW9kZWwobG1zW2ldLmNfc3RyKCksIGNmZyk7CisgICAgbW9kZWxzLnB1c2hfYmFjayh0aGlzX21vZGVsKTsKKyAgfQorCisgIC8vIGFzc2VtYmxlIHZvY2FidWxhcnkgdmVjdG9yCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2b2NhYjsKKyAgc3RkOjpjZXJyIDw8ICJHbG9iYWwgVm9jYWIgTWFwIGhhcyBzaXplOiAiIDw8IHZtYXAuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKworICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQgKj46Oml0ZXJhdG9yIGl0ZXIgPSB2bWFwLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSB2bWFwLmVuZCgpOyArK2l0ZXIpIHsKKyAgICB2b2NhYi5wdXNoX2JhY2soaXRlci0+Zmlyc3QpOworICB9CisgIHN0ZDo6Y2VyciA8PCAiVm9jYWIgdmVjdG9yIGhhcyBzaXplOiAiIDw8IHZvY2FiLnNpemUoKSA8PCBzdGQ6OmVuZGw7CisKKyAgLy8gbG9hZCBjb250ZXh0IHNvcnRlZCBuZ3JhbXMgaW50byB2ZWN0b3Igb2YgdmVjdG9ycworICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPiBjb3JwdXM7CisKKyAgc3RkOjpjZXJyIDw8ICJMb2FkaW5nIGNvbnRleHQtc29ydGVkIG5ncmFtczogIiA8PCB0dW5pbmdfZGF0YSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6aWZzdHJlYW0gaW5maWxlKHR1bmluZ19kYXRhLmNfc3RyKCkpOworCisgIGZvciAoc3RkOjpzdHJpbmcgbGluZTsgc3RkOjpnZXRsaW5lKGluZmlsZSwgbGluZSk7KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHdvcmRzOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbShsaW5lKTsKKyAgICBzdGQ6OnN0cmluZyB3b3JkOworCisgICAgd2hpbGUgKHN0cmVhbSA+PiB3b3JkKQorICAgICAgd29yZHMucHVzaF9iYWNrKHdvcmQpOworICAgIGNvcnB1cy5wdXNoX2JhY2sod29yZHMpOworICB9CisKKyAgdHJhaW5fcGFyYW1zKGNvcnB1cywgdm9jYWIsIG1vZGVscyk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHJhaW5fcGFyYW1zX21haW4uY2MgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHJhaW5fcGFyYW1zX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyMzNlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90cmFpbl9wYXJhbXNfbWFpbi5jYwpAQCAtMCwwICsxLDM0OSBAQAorI2luY2x1ZGUgImxtL25ncmFtX3F1ZXJ5LmhoIgorI2luY2x1ZGUgImxtL21vZGVsLmhoIgorI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvZW51bWVyYXRlX2dsb2JhbF92b2NhYi5oaCIKKworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CisKKyNpbmNsdWRlICJ1dGlsL2ZpeGVkX2FycmF5LmhoIgorCisjaW5jbHVkZSA8RWlnZW4vRWlnZW4+CisKK3R5cGVkZWYgRWlnZW46Ok1hdHJpeFhmIEZNYXRyaXg7Cit0eXBlZGVmIEVpZ2VuOjpWZWN0b3JYZiBGVmVjdG9yOworCitib29sIEhBU19CSUFTID0gdHJ1ZTsKKwordXNpbmcgbmFtZXNwYWNlIGxtOjpuZ3JhbTsKK3VzaW5nIG5hbWVzcGFjZSBsbTsKKworaW5saW5lIGZsb2F0IGxvZ1Byb2IoTW9kZWwgKiBtb2RlbCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjdHgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB3b3JkKSB7CisKKyAgLy8gSG9ycmlibHkgaW5lZmZpY2llbnQKKyAgY29uc3QgVm9jYWJ1bGFyeSAmdm9jYWIgPSBtb2RlbC0+R2V0Vm9jYWJ1bGFyeSgpOworCisgIFN0YXRlIG5leHRTdGF0ZTsgLy90aHJvd2F3YXkKKworICBXb3JkSW5kZXggd29yZF9pZHggPSB2b2NhYi5JbmRleCh3b3JkKTsKKyAgV29yZEluZGV4IGNvbnRleHRfaWR4W2N0eC5zaXplKCldOworCisgIC8vcmV2ZXJzZSBjb250ZXh0CisgIGZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjdHguc2l6ZSgpOyBpKyspIHsKKyAgICBjb250ZXh0X2lkeFtjdHguc2l6ZSgpIC0gMSAtIGldID0gdm9jYWIuSW5kZXgoY3R4W2ldKTsKKyAgfQorCisgIEZ1bGxTY29yZVJldHVybiBzY29yZSA9IG1vZGVsLT5GdWxsU2NvcmVGb3Jnb3RTdGF0ZShjb250ZXh0X2lkeCwgJihjb250ZXh0X2lkeFtjdHguc2l6ZSgpIC0xXSksIHdvcmRfaWR4LCBuZXh0U3RhdGUpOworCisgIGZsb2F0IHJldCA9IHNjb3JlLnByb2I7CisgIC8vc3RkOjpjZXJyIDw8ICJ3OiAiIDw8IHdvcmQgPDwgIiBwOiAiIDw8IHJldCA8PCBzdGQ6OmVuZGw7CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgc2V0X2ZlYXR1cmVzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY3R4LAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHdvcmQsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNb2RlbCAqPiYgbW9kZWxzLAorICAgICAgICAgICAgICAgICAgRlZlY3RvciYgdikgeworCisgIC8vc3RkOjpjZXJyIDw8ICJzZXR0aW5nIGZlYXRzIGZvciAiIDw8IHdvcmQgPDwgc3RkOjplbmRsOworCisgIGlmIChIQVNfQklBUykgeworICAgIHYoMCkgPSAxOworICAgIGZvciAodW5zaWduZWQgaT0wOyBpIDwgbW9kZWxzLnNpemUoKTsgKytpKQorICAgICAgdihpICsgMSkgPSBsb2dQcm9iKG1vZGVsc1tpXSwgY3R4LCB3b3JkKTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKHVuc2lnbmVkIGk9MDsgaSA8IG1vZGVscy5zaXplKCk7ICsraSkKKyAgICAgIHYoaSkgPSBsb2dQcm9iKG1vZGVsc1tpXSwgY3R4LCB3b3JkKTsKKyAgfQorfQorCit2b2lkIHRyYW5zbGF0ZV9pbnB1dCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPiYgY29ycHVzLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ3ZvY2FiLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1vZGVsICo+JiBtb2RlbHMsCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8V29yZEluZGV4PiA+ID4mdHJhbnNsYXRlZF9jb3JwdXMsCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8V29yZEluZGV4PiA+JnRyYW5zbGF0ZWRfdm9jYWIKKyAgKSB7CisgIHRyYW5zbGF0ZWRfY29ycHVzLnJlc2l6ZShtb2RlbHMuc2l6ZSgpKTsKKyAgdHJhbnNsYXRlZF92b2NhYi5yZXNpemUobW9kZWxzLnNpemUoKSk7CisgIGZvciAodW5zaWduZWQgbW49MDsgbW4gPCBtb2RlbHMuc2l6ZSgpOyArK21uKSB7IC8vIG1vZGVscyAKKworICAgIGNvbnN0IFZvY2FidWxhcnkgJnZvY2FiID0gbW9kZWxzW21uXS0+R2V0Vm9jYWJ1bGFyeSgpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGd2b2NhYi5zaXplKCk7ICsraSkgeworICAgICAgdHJhbnNsYXRlZF92b2NhYlttbl0ucHVzaF9iYWNrKHZvY2FiLkluZGV4KGd2b2NhYltpXSkpOworICAgIH0KKyAgICAKKyAgICB0cmFuc2xhdGVkX2NvcnB1c1ttbl0ucmVzaXplKGNvcnB1cy5zaXplKCkpOworICAgIGZvciAodW5zaWduZWQgY2kgPSAwOyBjaSA8IGNvcnB1cy5zaXplKCk7ICsrY2kpIHsgLy8gc2VudGVuY2VzIGluIHR1bmluZyBjb3JwdXMKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc2VudGVuY2UgPSBjb3JwdXNbY2ldOworICAgICAgZm9yIChpbnQgdCA9IHNlbnRlbmNlLnNpemUoKSAtMTsgdCA+PSAwOyAtLXQpIHsgLy8gd29yZHMgaW4gc2VudGVuY2UKKyAgICAgICAgdHJhbnNsYXRlZF9jb3JwdXNbbW5dW2NpXS5wdXNoX2JhY2sodm9jYWIuSW5kZXgoc2VudGVuY2VbdF0pKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGk9MDsgaTw1OyArK2kpIHsKKyAgICAgICAgdHJhbnNsYXRlZF9jb3JwdXNbbW5dW2NpXS5wdXNoX2JhY2sodm9jYWIuSW5kZXgoIjxzPiIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKyAgICAgIAorCit2b2lkIHRyYWluX3BhcmFtc19mYXN0KAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+JiBjb3JwdXMsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB2b2NhYiwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxNb2RlbCAqPiYgbW9kZWxzKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKyAgLy8gbW9kZWwgLyBzZW50ZW5jZSAvIHdvcmRzIGluIHNlbnRlbmNlIGluIHJldmVyc2Ugb3JkZXIgd2l0aCA8cz4gcGFkZGluZyAKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8V29yZEluZGV4PiA+ID4gdF9jb3JwdXM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gPiB0X3ZvY2FiOworICB0cmFuc2xhdGVfaW5wdXQoY29ycHVzLCB2b2NhYiwgbW9kZWxzLCB0X2NvcnB1cywgdF92b2NhYik7CisKKworCisgIGNvbnN0IGludCBJVEVSQVRJT05TID0gMTA7CisgIGNvbnN0IGludCBubGFtYmRhcyA9IG1vZGVscy5zaXplKCkgKyAoSEFTX0JJQVMgPyAxIDogMCk7IC8vIGJpYXMgKyAjbW9kZWxzCisgIEZWZWN0b3IgcGFyYW1zID0gRlZlY3Rvcjo6WmVybyhubGFtYmRhcyk7CisgIHZlY3RvcjxGVmVjdG9yPiBmZWF0cyh2b2NhYi5zaXplKCksIHBhcmFtcyk7CisgIHZlY3RvcjxmbG9hdD4gdXModm9jYWIuc2l6ZSgpLCAwKTsKKyAgdmVjdG9yPGZsb2F0PiBwcyh2b2NhYi5zaXplKCksIDApOworICBGVmVjdG9yIGdyYWQgPSBGVmVjdG9yOjpaZXJvKG5sYW1iZGFzKTsKKyAgRk1hdHJpeCBIID0gRk1hdHJpeDo6WmVybyhubGFtYmRhcywgbmxhbWJkYXMpOworICBGVmVjdG9yIGVmID0gRlZlY3Rvcjo6WmVybyhubGFtYmRhcyk7CisgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgSVRFUkFUSU9OUzsgKytpdGVyKSB7IC8vIGl0ZXJhdGlvbnMKKyAgICBncmFkLnNldFplcm8oKTsKKyAgICBILnNldFplcm8oKTsKKyAgICBkb3VibGUgbG9zcyA9IDA7CisgICAgdW5zaWduZWQgbnVtY2hhcnMgPSAwOworICAgIGZvciAodW5zaWduZWQgY2kgPSAwOyBjaSA8IGNvcnB1cy5zaXplKCk7ICsrY2kpIHsgLy8gc2VudGVuY2VzIGluIHR1bmluZyBjb3JwdXMKKyAgICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBzZW50ZW5jZSA9IGNvcnB1c1tjaV07CisgICAgICBkb3VibGUgeiA9IDA7CisgICAgICBmb3IgKGludCB0ID0gc2VudGVuY2Uuc2l6ZSgpIC0xIDsgdCA+PTA7IC0tdCkgeyAvLyB3b3JkcyBpbiBzZW50ZW5jZQorICAgICAgICArK251bWNoYXJzOworICAgICAgICBpbnQgcmVmX3dvcmQgPSAwOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdm9jYWIuc2l6ZSgpOyArK2kpIHsgLy8gdm9jYWIKKyAgICAgICAgICAvLyBzZXRfZmVhdHVyZXMoY29udGV4dCwgdm9jYWJbaV0sIG1vZGVscywgZmVhdHNbaV0pOworICAgICAgICAgIGZvciAodW5zaWduZWQgaj0wOyBqIDwgbW9kZWxzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICAvLyBOT1RFOiByZWZlcmVuY2UgLS0tLSBXb3JkSW5kZXggd29yZF9pZHggPSB0X2NvcnB1c1tqXVtjaV1bdF07CisgICAgICAgICAgICBXb3JkSW5kZXggd29yZF9pZHggPSB0X3ZvY2FiW2pdW2ldOworICAgICAgICAgICAgU3RhdGUgbmV4dFN0YXRlOyAvL3Rocm93YXdheQorICAgICAgICAgICAgRnVsbFNjb3JlUmV0dXJuIHNjb3JlID0gbW9kZWxzW2pdLT5GdWxsU2NvcmVGb3Jnb3RTdGF0ZSgmKHRfY29ycHVzW2pdW2NpXVt0XSksICYodF9jb3JwdXNbal1bY2ldW3QrNV0pLCB3b3JkX2lkeCwgbmV4dFN0YXRlKTsKKyAgICAgICAgICAgIGZlYXRzW2ldKGopID0gc2NvcmUucHJvYjsKKyAgICAgICAgICAgIC8vIGZlYXRzW2ldKGopID0gbG9nUHJvYihtb2RlbHNbal0sIGN0eCwgd29yZCk7CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIHVzW2ldID0gcGFyYW1zLmRvdChmZWF0c1tpXSk7CisgICAgICAgICAgeiArPSBleHAoZG91YmxlKHVzW2ldKSk7CisgICAgICAgIH0KKwkvL3N0ZDo6Y2VyciA8PCAidGhlcmUuLi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgY29uc3QgZmxvYXQgbG9neiA9IGxvZyh6KTsKKworICAgICAgICAvLyBleHBlY3RlZCBmZWF0dXJlIHZhbHVlcworICAgICAgICBlZi5zZXRaZXJvKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2b2NhYi5zaXplKCk7ICsraSkgeworICAgICAgICAgIHBzW2ldID0gZXhwZih1c1tpXSAtIGxvZ3opOworICAgICAgICAgIGVmICs9IHBzW2ldICogZmVhdHNbaV07CisgICAgICAgIH0KKyAgICAgICAgbG9zcyAtPSBsb2cocHNbcmVmX3dvcmRdKTsKKyAgICAgICAgY29uc3QgRlZlY3RvciYgcmVmZmVhdHMgPSBmZWF0c1tyZWZfd29yZF07CisgICAgICAgIGdyYWQgKz0gZWYgLSByZWZmZWF0czsKKworICAgICAgICAvLyBIZXNzaWFuCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2b2NhYi5zaXplKCk7ICsraSkKKyAgICAgICAgICBILm5vYWxpYXMoKSArPSBwc1tpXSAqIGZlYXRzW2ldICogZmVhdHNbaV0udHJhbnNwb3NlKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgIHBzW2ldICogZmVhdHNbaV0gKiBlZi50cmFuc3Bvc2UoKTsKKworICAgICAgICAvLyB0aGlzIHNob3VsZCBqdXN0IGJlIHRoZSBzdGF0ZSBmb3IgZWFjaCBtb2RlbAorICAgICAgfQorICAgICAgY2VyciA8PCAiLiI7CisgICAgfQorICAgIGNlcnIgPDwgIklURVJBVElPTiAiIDw8IChpdGVyICsgMSkgPDwgIjogUFBMPSIgPDwgZXhwKGxvc3MgLyBudW1jaGFycykgPDwgZW5kbDsKKyAgICBwYXJhbXMgPSBILmNvbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZShncmFkKTsKKyAgICBjZXJyIDw8IHBhcmFtcyA8PCBlbmRsOworICB9Cit9CisgICAgICAgICAgCisgIAorCisKKy8vY29uc3QgdXRpbDo6Rml4ZWRBcnJheTxNb2RlbCAqPiYgbW9kZWxzKQordm9pZCB0cmFpbl9wYXJhbXMoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ID4mIGNvcnB1cywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHZvY2FiLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1vZGVsICo+JiBtb2RlbHMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworICB2ZWN0b3I8c3RyaW5nPiBjb250ZXh0KDUsICI8cz4iKTsKKyAgY29uc3QgaW50IElURVJBVElPTlMgPSAxMDsKKyAgY29uc3QgaW50IG5sYW1iZGFzID0gbW9kZWxzLnNpemUoKSArIChIQVNfQklBUyA/IDEgOiAwKTsgLy8gYmlhcyArICNtb2RlbHMKKyAgRlZlY3RvciBwYXJhbXMgPSBGVmVjdG9yOjpaZXJvKG5sYW1iZGFzKTsKKyAgdmVjdG9yPEZWZWN0b3I+IGZlYXRzKHZvY2FiLnNpemUoKSwgcGFyYW1zKTsKKyAgdmVjdG9yPGZsb2F0PiB1cyh2b2NhYi5zaXplKCksIDApOworICB2ZWN0b3I8ZmxvYXQ+IHBzKHZvY2FiLnNpemUoKSwgMCk7CisgIEZWZWN0b3IgZ3JhZCA9IEZWZWN0b3I6Olplcm8obmxhbWJkYXMpOworICBGTWF0cml4IEggPSBGTWF0cml4OjpaZXJvKG5sYW1iZGFzLCBubGFtYmRhcyk7CisgIEZWZWN0b3IgZWYgPSBGVmVjdG9yOjpaZXJvKG5sYW1iZGFzKTsKKyAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCBJVEVSQVRJT05TOyArK2l0ZXIpIHsgLy8gaXRlcmF0aW9ucworICAgIGdyYWQuc2V0WmVybygpOworICAgIEguc2V0WmVybygpOworICAgIGRvdWJsZSBsb3NzID0gMDsKKyAgICB1bnNpZ25lZCBudW1jaGFycyA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBjaSA9IDA7IGNpIDwgY29ycHVzLnNpemUoKTsgKytjaSkgeyAvLyBzZW50ZW5jZXMgaW4gdHVuaW5nIGNvcnB1cworICAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIHNlbnRlbmNlID0gY29ycHVzW2NpXTsKKyAgICAgIHN0ZDo6ZmlsbChjb250ZXh0LmJlZ2luKCksIGNvbnRleHQuZW5kKCksICI8cz4iKTsKKyAgICAgIGZvciAodW5zaWduZWQgdCA9IDA7IHQgPCBzZW50ZW5jZS5zaXplKCk7ICsrdCkgeyAvLyB3b3JkcyBpbiBzZW50ZW5jZQorICAgICAgICArK251bWNoYXJzOworICAgICAgICBjb25zdCBzdHJpbmcmIHJlZl93b3JkX3N0cmluZyA9IHNlbnRlbmNlW3RdOworICAgICAgICBpbnQgcmVmX3dvcmQgPSAwOyAvLyBUT0RPCisgICAgICAgIGRvdWJsZSB6ID0gMDsKKwkvL3N0ZDo6Y2VyciA8PCAiaGVyZS4uLiIgPDwgc3RkOjplbmRsOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdm9jYWIuc2l6ZSgpOyArK2kpIHsgLy8gdm9jYWIKKyAgICAgICAgICBzZXRfZmVhdHVyZXMoY29udGV4dCwgdm9jYWJbaV0sIG1vZGVscywgZmVhdHNbaV0pOworICAgICAgICAgIHVzW2ldID0gcGFyYW1zLmRvdChmZWF0c1tpXSk7CisgICAgICAgICAgeiArPSBleHAoZG91YmxlKHVzW2ldKSk7CisgICAgICAgIH0KKwkvL3N0ZDo6Y2VyciA8PCAidGhlcmUuLi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgY29udGV4dC5wdXNoX2JhY2socmVmX3dvcmRfc3RyaW5nKTsKKyAgICAgICAgY29uc3QgZmxvYXQgbG9neiA9IGxvZyh6KTsKKworICAgICAgICAvLyBleHBlY3RlZCBmZWF0dXJlIHZhbHVlcworICAgICAgICBlZi5zZXRaZXJvKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2b2NhYi5zaXplKCk7ICsraSkgeworICAgICAgICAgIHBzW2ldID0gZXhwZih1c1tpXSAtIGxvZ3opOworICAgICAgICAgIGVmICs9IHBzW2ldICogZmVhdHNbaV07CisgICAgICAgIH0KKyAgICAgICAgbG9zcyAtPSBsb2cocHNbcmVmX3dvcmRdKTsKKyAgICAgICAgY29uc3QgRlZlY3RvciYgcmVmZmVhdHMgPSBmZWF0c1tyZWZfd29yZF07CisgICAgICAgIGdyYWQgKz0gZWYgLSByZWZmZWF0czsKKworICAgICAgICAvLyBIZXNzaWFuCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2b2NhYi5zaXplKCk7ICsraSkKKyAgICAgICAgICBILm5vYWxpYXMoKSArPSBwc1tpXSAqIGZlYXRzW2ldICogZmVhdHNbaV0udHJhbnNwb3NlKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgIHBzW2ldICogZmVhdHNbaV0gKiBlZi50cmFuc3Bvc2UoKTsKKworICAgICAgICAvLyB0aGlzIHNob3VsZCBqdXN0IGJlIHRoZSBzdGF0ZSBmb3IgZWFjaCBtb2RlbAorICAgICAgfQorICAgICAgY2VyciA8PCAiLiI7CisgICAgfQorICAgIGNlcnIgPDwgIklURVJBVElPTiAiIDw8IChpdGVyICsgMSkgPDwgIjogUFBMPSIgPDwgZXhwKGxvc3MgLyBudW1jaGFycykgPDwgZW5kbDsKKyAgICBwYXJhbXMgPSBILmNvbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZShncmFkKTsKKyAgICBjZXJyIDw8IHBhcmFtcyA8PCBlbmRsOworICB9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworCisgIHN0ZDo6c3RyaW5nIHR1bmluZ19kYXRhOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbG1zOworCisgIHRyeSB7CisgICAgbmFtZXNwYWNlIHBvID0gYm9vc3Q6OnByb2dyYW1fb3B0aW9uczsKKyAgICBwbzo6b3B0aW9uc19kZXNjcmlwdGlvbiBvcHRpb25zKCJ0cmFpbi1wYXJhbXMiKTsKKworICAgIG9wdGlvbnMuYWRkX29wdGlvbnMoKQorICAgICAgKCJoZWxwLGgiLCBwbzo6Ym9vbF9zd2l0Y2goKSwgIlNob3cgdGhpcyBoZWxwIG1lc3NhZ2UiKQorICAgICAgKCJub19iaWFzX3Rlcm0sQiIsIHBvOjpib29sX3N3aXRjaCgpLCAiRG8gbm90IGluY2x1ZGUgYSAnYmlhcycgZmVhdHVyZSIpCisgICAgICAoInR1bmluZ19kYXRhLHQiLCBwbzo6dmFsdWU8c3RkOjpzdHJpbmc+KCZ0dW5pbmdfZGF0YSksICJGaWxlIHRvIHR1bmUgcGVycGxleGl0eSBvbiIpCisgICAgICAoIm1vZGVsLG0iLCBwbzo6dmFsdWU8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ID4oJmxtcyksICJMYW5ndWFnZSBtb2RlbHMgaW4gS2VuTE0gZm9ybWF0IHRvIGludGVycG9sYXRlIik7CisgICAgcG86OnZhcmlhYmxlc19tYXAgdm07CisgICAgcG86OnN0b3JlKHBvOjpwYXJzZV9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgb3B0aW9ucyksIHZtKTsKKworICAgIC8vIERpc3BsYXkgaGVscAorICAgIGlmKGFyZ2MgPT0gMSB8fCB2bVsiaGVscCJdLmFzPGJvb2w+KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCBvcHRpb25zIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAodm1bIm5vX2JpYXNfdGVybSJdLmFzPGJvb2w+KCkpCisgICAgICBIQVNfQklBUyA9IGZhbHNlOworICAgIGxtcyA9IHZtWyJtb2RlbCJdLmFzPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+KCk7CisgICAgdHVuaW5nX2RhdGEgPSB2bVsidHVuaW5nX2RhdGEiXS5hczxzdGQ6OnN0cmluZz4oKTsKKyAgfQorICBjYXRjaChjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmZSkgeworCisgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gMTsKKworICB9CisgIGlmIChsbXMuc2l6ZSgpIDwgMikgeworICAgIHN0ZDo6Y2VyciA8PCAiUGxlYXNlIHNwZWNpZnkgYXQgbGVhc3QgdHdvIGxhbmd1YWdlIG1vZGVsIGZpbGVzIHdpdGggLW0gTE0uS0xNXG4iOworICAgIHJldHVybiAxOworICB9CisgIGlmICh0dW5pbmdfZGF0YS5lbXB0eSgpKSB7CisgICAgc3RkOjpjZXJyIDw8ICJQbGVhc2Ugc3BlY2lmeSB0dW5pbmcgc2V0IHdpdGggLXQgRklMRS5UWFRcbiI7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvL0dyb3dhYmxlIHZvY2FiIGhlcmUKKyAgLy9Hcm93YWJsZVZvY2FiIGd2b2MoMTAwMDAwKTsgLy9kdW1teSBkZWZhdWx0CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludCo+IHZtYXA7CisgIHV0aWw6OkZpeGVkQXJyYXk8V29yZEluZGV4PiB2bSgyKTsKKworICAvL3N0dWZmIGl0IGludG8gdGhlCisgIEVudW1lcmF0ZUdsb2JhbFZvY2FiICogZ2xvYmFsVm9jYWJCdWlsZGVyID0gbmV3IEVudW1lcmF0ZUdsb2JhbFZvY2FiKCZ2bWFwLCBsbXMuc2l6ZSgpKTsKKyAgLy8gRW51bWVyYXRlR2xvYmFsVm9jYWIgKiBnbG9iYWxWb2NhYkJ1aWxkZXIgPSBuZXcgRW51bWVyYXRlR2xvYmFsVm9jYWIodm0pOworCisgIENvbmZpZyBjZmc7CisgIGNmZy5lbnVtZXJhdGVfdm9jYWIgPSAoRW51bWVyYXRlVm9jYWIgKikgZ2xvYmFsVm9jYWJCdWlsZGVyOworCisgIC8vbG9hZCBtb2RlbHMKKyAgLy91dGlsOjpGaXhlZEFycmF5PE1vZGVsICo+IG1vZGVscyhsbXMuc2l6ZSgpKTsKKyAgc3RkOjp2ZWN0b3I8TW9kZWwgKj4gbW9kZWxzOworICBmb3IoaW50IGk9MDsgaSA8IGxtcy5zaXplKCk7IGkrKykgeworICAgIHN0ZDo6Y2VyciA8PCAiTG9hZGluZyBMTSBmaWxlOiAiIDw8IGxtc1tpXSA8PCBzdGQ6OmVuZGw7CisKKyAgICAvL2hhYWFhY2sKKyAgICBnbG9iYWxWb2NhYkJ1aWxkZXItPlNldEN1ck1vZGVsKGkpOyAvL3llcyB0aGlzIGlzIGR1bWIKKworICAgIC8vbW9kZWxzW2ldID0gbmV3IE1vZGVsKGxtc1tpXS5jX3N0cigpKTsKKyAgICBNb2RlbCAqIHRoaXNfbW9kZWwgPSBuZXcgTW9kZWwobG1zW2ldLmNfc3RyKCksIGNmZyk7CisgICAgbW9kZWxzLnB1c2hfYmFjayggdGhpc19tb2RlbCApOworCisgIH0KKworICAvL2Fzc2VtYmxlIHZvY2FidWxhcnkgdmVjdG9yCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2b2NhYjsKKyAgc3RkOjpjZXJyIDw8ICJHbG9iYWwgVm9jYWIgTWFwIGhhcyBzaXplOiAiIDw8IHZtYXAuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKworICBzdGQ6OnBhaXI8U3RyaW5nUGllY2UsaW50ICo+IG1lOworCisgIGZvcihzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50Kj46Oml0ZXJhdG9yIGl0ZXIgPSB2bWFwLmJlZ2luKCk7IGl0ZXIgIT0gdm1hcC5lbmQoKTsgKytpdGVyKSB7CisgICAgdm9jYWIucHVzaF9iYWNrKGl0ZXItPmZpcnN0KTsKKyAgfQorICBzdGQ6OmNlcnIgPDwgIlZvY2FiIHZlY3RvciBoYXMgc2l6ZTogIiA8PCB2b2NhYi5zaXplKCkgPDwgc3RkOjplbmRsOworCisgIC8vbG9hZCBjb250ZXh0IHNvcnRlZCBuZ3JhbXMgaW50byB2ZWN0b3Igb2YgdmVjdG9ycworICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPiBjb3JwdXM7CisKKyAgc3RkOjpjZXJyIDw8ICJMb2FkaW5nIGNvbnRleHQtc29ydGVkIG5ncmFtczogIiA8PCB0dW5pbmdfZGF0YSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6aWZzdHJlYW0gaW5maWxlKHR1bmluZ19kYXRhKTsKKworICBmb3Ioc3RkOjpzdHJpbmcgbGluZTsgc3RkOjpnZXRsaW5lKGluZmlsZSwgbGluZSk7ICkgeworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHdvcmRzOyB7CisKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbShsaW5lKTsKKyAgICAgIHN0ZDo6c3RyaW5nIHdvcmQ7CisKKyAgICAgIHdoaWxlKHN0cmVhbSA+PiB3b3JkKSB7CisJd29yZHMucHVzaF9iYWNrKHdvcmQpOworICAgICAgfQorICAgIH0KKyAgICBjb3JwdXMucHVzaF9iYWNrKHdvcmRzKTsKKyAgfQorCisgIHRyYWluX3BhcmFtc19mYXN0KGNvcnB1cywgdm9jYWIsIG1vZGVscyk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9kZXJpdmF0aXZlcy5jYyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2Rlcml2YXRpdmVzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGU2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9kZXJpdmF0aXZlcy5jYwpAQCAtMCwwICsxLDkxIEBACisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvdHVuZV9kZXJpdmF0aXZlcy5oaCIKKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGludGVycG9sYXRlIHsKKworQ29tcHV0ZURlcml2YXRpdmU6OkNvbXB1dGVEZXJpdmF0aXZlKGNvbnN0IHV0aWw6OkZpeGVkQXJyYXk8SW5zdGFuY2U+ICZpbnN0YW5jZXMsIGNvbnN0IE1hdHJpeCAmbG5fdW5pZ3JhbXMsIFdvcmRJbmRleCBib3MpCisgIDogaW5zdGFuY2VzXyhpbnN0YW5jZXMpLCBsbl91bmlncmFtc18obG5fdW5pZ3JhbXMpLCBib3NfKGJvcykgeworICBuZWdfY29ycmVjdF9zdW1tZWRfID0gVmVjdG9yOjpaZXJvKGxuX3VuaWdyYW1zLmNvbHMoKSk7CisgIGZvciAoY29uc3QgSW5zdGFuY2UgKmkgPSBpbnN0YW5jZXMuYmVnaW4oKTsgaSAhPSBpbnN0YW5jZXMuZW5kKCk7ICsraSkgeworICAgIG5lZ19jb3JyZWN0X3N1bW1lZF8gLT0gaS0+bG5fY29ycmVjdDsKKyAgfQorfQorCitBY2N1bSBDb21wdXRlRGVyaXZhdGl2ZTo6SXRlcmF0aW9uKGNvbnN0IFZlY3RvciAmd2VpZ2h0cywgVmVjdG9yICZncmFkaWVudCwgTWF0cml4ICZoZXNzaWFuKSB7CisgIGdyYWRpZW50ID0gbmVnX2NvcnJlY3Rfc3VtbWVkXzsKKyAgaGVzc2lhbiA9IE1hdHJpeDo6WmVybyh3ZWlnaHRzLnJvd3MoKSwgd2VpZ2h0cy5yb3dzKCkpOworCisgIC8vIFRPRE86IGxvb3AgaW5zdGVhZCB0byBmb3JjZSBsb3ctbWVtb3J5IGV2YWx1YXRpb24KKyAgLy8gQ29tcHV0ZSBwX0koeCkuCisgIFZlY3RvciBpbnRlcnBfdW5pKChsbl91bmlncmFtc18gKiB3ZWlnaHRzKS5hcnJheSgpLmV4cCgpKTsKKyAgLy8gRXZlbiAtaW5mIGRvZXNuJ3Qgd29yayBmb3IgPHM+IGJlY2F1c2Ugd2VpZ2h0cyBjYW4gYmUgbmVnYXRpdmUuICBNYW51YWxseSBzZXQgaXQgdG8gemVyby4KKyAgaW50ZXJwX3VuaShib3NfKSA9IDAuMDsKKyAgQWNjdW0gWl9lcHNpbG9uID0gaW50ZXJwX3VuaS5zdW0oKTsKKyAgaW50ZXJwX3VuaSAvPSBaX2Vwc2lsb247CisgIC8vIHVuaWdyYW1fY3Jvc3MoaSkgPSBcc3VtX3thbGwgeH0gcF9JKHgpIGxuIHBfaSh4KQorICBWZWN0b3IgdW5pZ3JhbV9jcm9zcyhsbl91bmlncmFtc18udHJhbnNwb3NlKCkgKiBpbnRlcnBfdW5pKTsKKworICBBY2N1bSBzdW1fQl9JID0gMC4wOworICBBY2N1bSBzdW1fbG5fWl9jb250ZXh0ID0gMC4wOworCisgIFZlY3RvciB3ZWlnaHRlZF9leHRlbnNpb25zOworICBNYXRyaXggY29udm9sdmU7CisgIFZlY3RvciBmdWxsX2Nyb3NzOworCisgIGZvciAoY29uc3QgSW5zdGFuY2UgKm4gPSBpbnN0YW5jZXNfLmJlZ2luKCk7IG4gIT0gaW5zdGFuY2VzXy5lbmQoKTsgKytuKSB7CisgICAgQWNjdW0gbG5fd2VpZ2h0ZWRfYmFja29mZnMgPSBuLT5sbl9iYWNrb2ZmLmRvdCh3ZWlnaHRzKTsKKyAgICBBY2N1bSB3ZWlnaHRlZF9iYWNrb2ZmcyA9IGV4cChsbl93ZWlnaHRlZF9iYWNrb2Zmcyk7CisKKyAgICAvLyBDb21wdXRlIFxzdW1fe3g6IG1vZGVsIGRvZXMgbm90IGJhY2tvZmYgdG8gdW5pZ3JhbX0gcF9JKHgpCisgICAgQWNjdW0gc3VtX3hfcF9JID0gMC4wOworICAgIGZvciAoc3RkOjp2ZWN0b3I8V29yZEluZGV4Pjo6Y29uc3RfaXRlcmF0b3IgeCA9IG4tPmV4dGVuc2lvbl93b3Jkcy5iZWdpbigpOyB4ICE9IG4tPmV4dGVuc2lvbl93b3Jkcy5lbmQoKTsgKyt4KSB7CisgICAgICBzdW1feF9wX0kgKz0gaW50ZXJwX3VuaSgqeCk7CisgICAgfQorICAgIHdlaWdodGVkX2V4dGVuc2lvbnMgPSAobi0+bG5fZXh0ZW5zaW9ucyAqIHdlaWdodHMpLmFycmF5KCkuZXhwKCk7CisgICAgQWNjdW0gWl9jb250ZXh0ID0gWl9lcHNpbG9uICogd2VpZ2h0ZWRfYmFja29mZnMgKiAoMS4wIC0gc3VtX3hfcF9JKSArIHdlaWdodGVkX2V4dGVuc2lvbnMuc3VtKCk7CisgICAgc3VtX2xuX1pfY29udGV4dCArPSBsb2coWl9jb250ZXh0KTsKKworICAgIEFjY3VtIEJfSSA9IFpfZXBzaWxvbiAvIFpfY29udGV4dCAqIHdlaWdodGVkX2JhY2tvZmZzOworICAgIHN1bV9CX0kgKz0gQl9JOworCisgICAgLy8gVGhpcyBpcyB0aGUgZ3JhZGllbnQgdGVybSBmb3IgdGhpcyBpbnN0YW5jZSBleGNlcHQgZm9yIC1sb2cgcF9pKHdfbiB8IHdfMV57bi0xfSkgd2hpY2ggd2FzIGFjY291bnRlZCBmb3IgYXMgcGFydCBvZiBuZWdfY29ycmVjdF9zdW1fLgorICAgIC8vIGZ1bGxfY3Jvc3MoaSkgaXMgXHN1bV97YWxsIHh9IHBfSSh4IHwgY29udGV4dCkgbG9nIHBfaSh4IHwgY29udGV4dCkKKyAgICBmdWxsX2Nyb3NzID0KKyAgICAgIC8vIFVuY29ycmVjdGVkIHRlcm0KKyAgICAgIEJfSSAqIChuLT5sbl9iYWNrb2ZmICsgdW5pZ3JhbV9jcm9zcykKKyAgICAgIC8vIENvcnJlY3Rpb24gdGVybTogYWRkIGNvcnJlY3QgdmFsdWVzCisgICAgICArIG4tPmxuX2V4dGVuc2lvbnMudHJhbnNwb3NlKCkgKiB3ZWlnaHRlZF9leHRlbnNpb25zIC8gWl9jb250ZXh0CisgICAgICAvLyBTdWJ0cmFjdCB2YWx1ZXMgdGhhdCBzaG91bGQgbm90IGhhdmUgYmVlbiBjaGFyZ2VkLgorICAgICAgLSBzdW1feF9wX0kgKiBCX0kgKiBuLT5sbl9iYWNrb2ZmOworICAgIGZvciAoc3RkOjp2ZWN0b3I8V29yZEluZGV4Pjo6Y29uc3RfaXRlcmF0b3IgeCA9IG4tPmV4dGVuc2lvbl93b3Jkcy5iZWdpbigpOyB4ICE9IG4tPmV4dGVuc2lvbl93b3Jkcy5lbmQoKTsgKyt4KSB7CisgICAgICBmdWxsX2Nyb3NzLm5vYWxpYXMoKSAtPSBpbnRlcnBfdW5pKCp4KSAqIEJfSSAqIGxuX3VuaWdyYW1zXy5yb3coKngpOworICAgIH0KKworICAgIGdyYWRpZW50ICs9IGZ1bGxfY3Jvc3M7CisKKyAgICBjb252b2x2ZSA9IHVuaWdyYW1fY3Jvc3MgKiBuLT5sbl9iYWNrb2ZmLnRyYW5zcG9zZSgpOworICAgIC8vIFRoZXJlJ3Mgb25lIG1pc3NpbmcgdGVybSBoZXJlLCB3aGljaCBpcyBpbmRlcGVuZGVudCBvZiBjb250ZXh0IGFuZCBkb25lIGF0IHRoZSBlbmQuCisgICAgaGVzc2lhbi5ub2FsaWFzKCkgKz0KKyAgICAgIC8vIEZpcnN0IHRlcm0gb2YgSGVzc2lhbiwgYXNzdW1pbmcgYWxsIG1vZGVscyBiYWNrIG9mZiB0byB1bmlncmFtLgorICAgICAgQl9JICogKGNvbnZvbHZlICsgY29udm9sdmUudHJhbnNwb3NlKCkgKyBuLT5sbl9iYWNrb2ZmICogbi0+bG5fYmFja29mZi50cmFuc3Bvc2UoKSkKKyAgICAgIC8vIFNlY29uZCB0ZXJtIG9mIEhlc3NpYW4sIHdpdGggY29ycmVjdCBmdWxsIHByb2JhYmlsaXRpZXMuCisgICAgICAtIGZ1bGxfY3Jvc3MgKiBmdWxsX2Nyb3NzLnRyYW5zcG9zZSgpOworCisgICAgLy8gQWRqdXN0IHRoZSBmaXJzdCB0ZXJtIG9mIHRoZSBIZXNzaWFuIHRvIGFjY291bnQgZm9yIGV4dGVuc2lvbgorICAgIGZvciAoc3RkOjpzaXplX3QgeCA9IDA7IHggPCBuLT5leHRlbnNpb25fd29yZHMuc2l6ZSgpOyArK3gpIHsKKyAgICAgIFdvcmRJbmRleCB1bml2ZXJzYWxfeCA9IG4tPmV4dGVuc2lvbl93b3Jkc1t4XTsKKyAgICAgIGhlc3NpYW4ubm9hbGlhcygpICs9CisgICAgICAgIC8vIFJlcGxhY2VtZW50IHRlcm1zLgorICAgICAgICB3ZWlnaHRlZF9leHRlbnNpb25zKHgpIC8gWl9jb250ZXh0ICogbi0+bG5fZXh0ZW5zaW9ucy5yb3coeCkudHJhbnNwb3NlKCkgKiBuLT5sbl9leHRlbnNpb25zLnJvdyh4KQorICAgICAgICAvLyBQcmVzdW1lZCB1bmlncmFtcy4gIFRPRE86IGluZGl2aWR1YWwgdGVybXMgd2l0aCBiYWNrb2ZmcyBwdWxsZWQgb3V0PyAgTWF5YmUgZmFzdGVyPworICAgICAgICAtIGludGVycF91bmkodW5pdmVyc2FsX3gpICogQl9JICogKGxuX3VuaWdyYW1zXy5yb3codW5pdmVyc2FsX3gpLnRyYW5zcG9zZSgpICsgbi0+bG5fYmFja29mZikgKiAobG5fdW5pZ3JhbXNfLnJvdyh1bml2ZXJzYWxfeCkgKyBuLT5sbl9iYWNrb2ZmLnRyYW5zcG9zZSgpKTsKKyAgICB9CisgIH0KKworICBmb3IgKE1hdHJpeDo6SW5kZXggeCA9IDA7IHggPCBpbnRlcnBfdW5pLnJvd3MoKTsgKyt4KSB7CisgICAgLy8gXHN1bV97Y29udGV4dHN9IEJfSShjb250ZXh0KSBcc3VtX3ggcF9JKHgpIGxvZyBwX2koeCkgbG9nIHBfaih4KQorICAgIGhlc3NpYW4ubm9hbGlhcygpICs9IHN1bV9CX0kgKiBpbnRlcnBfdW5pKHgpICogbG5fdW5pZ3JhbXNfLnJvdyh4KS50cmFuc3Bvc2UoKSAqIGxuX3VuaWdyYW1zXy5yb3coeCk7CisgIH0KKyAgcmV0dXJuIGV4cCgobmVnX2NvcnJlY3Rfc3VtbWVkXy5kb3Qod2VpZ2h0cykgKyBzdW1fbG5fWl9jb250ZXh0KSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oaW5zdGFuY2VzXy5zaXplKCkpKTsKK30KKworfX0gLy8gbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfZGVyaXZhdGl2ZXMuaGggYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9kZXJpdmF0aXZlcy5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGMwNThlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfZGVyaXZhdGl2ZXMuaGgKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZiBMTV9JTlRFUlBPTEFURV9UVU5FX0RFUklWQVRJVkVTX0gKKyNkZWZpbmUgTE1fSU5URVJQT0xBVEVfVFVORV9ERVJJVkFUSVZFU19ICisKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlLmhoIgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxjbWF0aD4KKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGludGVycG9sYXRlIHsKKworY2xhc3MgQ29tcHV0ZURlcml2YXRpdmUgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQ29tcHV0ZURlcml2YXRpdmUoY29uc3QgdXRpbDo6Rml4ZWRBcnJheTxJbnN0YW5jZT4gJmluc3RhbmNlcywgY29uc3QgTWF0cml4ICZsbl91bmlncmFtcywgV29yZEluZGV4IGJvcyk7CisKKyAgICBBY2N1bSBJdGVyYXRpb24oY29uc3QgVmVjdG9yICZ3ZWlnaHRzLCBWZWN0b3IgJmdyYWRpZW50LCBNYXRyaXggJmhlc3NpYW4pOworCisgIHByaXZhdGU6CisgICAgY29uc3QgdXRpbDo6Rml4ZWRBcnJheTxJbnN0YW5jZT4gJmluc3RhbmNlc187CisgICAgY29uc3QgTWF0cml4ICZsbl91bmlncmFtc187CisKKyAgICBjb25zdCBXb3JkSW5kZXggYm9zXzsKKworICAgIC8vIG5lZ19jb3JyZWN0X3N1bW1lZF8oaSkgPSAtXHN1bV9uIGxuIHBfaSh3X24gfCB3XzFee24tMX0pCisgICAgVmVjdG9yIG5lZ19jb3JyZWN0X3N1bW1lZF87Cit9OworCit9fSAvLyBuYW1lc3BhY2VzCisKKyNlbmRpZiAvLyBMTV9JTlRFUlBPTEFURV9UVU5FX0RFUklWQVRJVkVTX0gKKwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfZGVyaXZhdGl2ZXNfdGVzdC5jYyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2Rlcml2YXRpdmVzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjMGQxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2Rlcml2YXRpdmVzX3Rlc3QuY2MKQEAgLTAsMCArMSw4OSBAQAorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL3R1bmVfZGVyaXZhdGl2ZXMuaGgiCisKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlLmhoIgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIERlcml2YXRpdmVUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCituYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgaW50ZXJwb2xhdGUgeyBuYW1lc3BhY2UgeworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTbWFsbCkgeworICAvLyBUaHJlZSB2b2NhYnVsYXJ5IHdvcmRzIHBsdXMgPHM+LCB0d28gbW9kZWxzLgorICBNYXRyaXggdW5pZ3JhbXMoNCwgMik7CisgIHVuaWdyYW1zIDw8CisgICAgMC4xLCAwLjYsCisgICAgMC40LCAwLjMsCisgICAgMC41LCAwLjEsCisgICAgLy8gPHM+CisgICAgMS4wLCAxLjA7CisgIHVuaWdyYW1zID0gdW5pZ3JhbXMuYXJyYXkoKS5sb2coKTsKKworICAvLyBPbmUgaW5zdGFuY2UKKyAgdXRpbDo6Rml4ZWRBcnJheTxJbnN0YW5jZT4gaW5zdGFuY2VzKDEpOworICBpbnN0YW5jZXMucHVzaF9iYWNrKDIpOworICBJbnN0YW5jZSAmaW5zdGFuY2UgPSBpbnN0YW5jZXMuYmFjaygpOworCisgIGluc3RhbmNlLmxuX2JhY2tvZmYgPDwgMC4yLCAwLjQ7CisgIGluc3RhbmNlLmxuX2JhY2tvZmYgPSBpbnN0YW5jZS5sbl9iYWNrb2ZmLmFycmF5KCkubG9nKCk7CisKKyAgLy8gU3BhcnNlIGNhc2VzOiBtb2RlbCAwIHdvcmQgMiBhbmQgbW9kZWwgMSB3b3JkIDEuCisKKyAgLy8gQXNzdW1pbmcgdGhhdCBtb2RlbCAxIG9ubHkgbWF0Y2hlcyB3b3JkIDEsIHRoaXMgaXMgcF8xKDEgfCBjb250ZXh0KQorICBBY2N1bSBtb2RlbF8xX3dvcmRfMSA9IDEuMCAtIC42ICogLjQgLSAuMSAqIC40OworCisgIC8vIFdlJ2xsIHN1cHBvc2UgY29ycmVjdCBoYXMgV29yZEluZGV4IDEsIHdoaWNoIGJhY2tzIG9mZiBpbiBtb2RlbCAwLCBhbmQgbWF0Y2hlcyBpbiBtb2RlbCAxCisgIGluc3RhbmNlLmxuX2NvcnJlY3QgPDwgKDAuNCAqIDAuMiksIG1vZGVsXzFfd29yZF8xOworICBpbnN0YW5jZS5sbl9jb3JyZWN0ID0gaW5zdGFuY2UubG5fY29ycmVjdC5hcnJheSgpLmxvZygpOworCisgIEFjY3VtIG1vZGVsXzBfd29yZF8yID0gMS4wIC0gLjEgKiAuMiAtIC40ICogLjI7CisKKyAgaW5zdGFuY2UuZXh0ZW5zaW9uX3dvcmRzLnB1c2hfYmFjaygxKTsKKyAgaW5zdGFuY2UuZXh0ZW5zaW9uX3dvcmRzLnB1c2hfYmFjaygyKTsKKyAgaW5zdGFuY2UubG5fZXh0ZW5zaW9ucy5yZXNpemUoMiwgMik7CisgIGluc3RhbmNlLmxuX2V4dGVuc2lvbnMgPDwKKyAgICAoMC40ICogMC4yKSwgbW9kZWxfMV93b3JkXzEsCisgICAgbW9kZWxfMF93b3JkXzIsIDAuMSAqIDAuNDsKKyAgaW5zdGFuY2UubG5fZXh0ZW5zaW9ucyA9IGluc3RhbmNlLmxuX2V4dGVuc2lvbnMuYXJyYXkoKS5sb2coKTsKKworICBDb21wdXRlRGVyaXZhdGl2ZSBjb21wdXRlKGluc3RhbmNlcywgdW5pZ3JhbXMsIDMpOworICBWZWN0b3Igd2VpZ2h0cygyKTsKKyAgd2VpZ2h0cyA8PCAwLjksIDEuMjsKKworICBWZWN0b3IgZ3JhZGllbnQoMik7CisgIE1hdHJpeCBoZXNzaWFuKDIsMik7CisgIGNvbXB1dGUuSXRlcmF0aW9uKHdlaWdodHMsIGdyYWRpZW50LCBoZXNzaWFuKTsKKworICAvLyBwX0koeCB8IGNvbnRleHQpCisgIFZlY3RvciBwX0koMyk7CisgIHBfSSA8PAorICAgIHBvdygwLjEgKiAwLjIsIDAuOSkgKiBwb3coMC42ICogMC40LCAxLjIpLAorICAgIHBvdygwLjQgKiAwLjIsIDAuOSkgKiBwb3cobW9kZWxfMV93b3JkXzEsIDEuMiksCisgICAgcG93KG1vZGVsXzBfd29yZF8yLCAwLjkpICogcG93KDAuMSAqIDAuNCwgMS4yKTsKKyAgcF9JIC89IHBfSS5zdW0oKTsKKworICBWZWN0b3IgZXhwZWN0ZWRfZ3JhZGllbnQgPSAtaW5zdGFuY2UubG5fY29ycmVjdDsKKyAgZXhwZWN0ZWRfZ3JhZGllbnQoMCkgKz0gcF9JKDApICogbG9nKDAuMSAqIDAuMik7CisgIGV4cGVjdGVkX2dyYWRpZW50KDApICs9IHBfSSgxKSAqIGxvZygwLjQgKiAwLjIpOworICBleHBlY3RlZF9ncmFkaWVudCgwKSArPSBwX0koMikgKiBsb2cobW9kZWxfMF93b3JkXzIpOworICBCT09TVF9DSEVDS19DTE9TRShleHBlY3RlZF9ncmFkaWVudCgwKSwgZ3JhZGllbnQoMCksIDAuMDEpOworCisgIGV4cGVjdGVkX2dyYWRpZW50KDEpICs9IHBfSSgwKSAqIGxvZygwLjYgKiAwLjQpOworICBleHBlY3RlZF9ncmFkaWVudCgxKSArPSBwX0koMSkgKiBsb2cobW9kZWxfMV93b3JkXzEpOworICBleHBlY3RlZF9ncmFkaWVudCgxKSArPSBwX0koMikgKiBsb2coMC4xICogMC40KTsKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0UoZXhwZWN0ZWRfZ3JhZGllbnQoMSksIGdyYWRpZW50KDEpLCAwLjAxKTsKKworICBNYXRyaXggZXhwZWN0ZWRfaGVzc2lhbigyLCAyKTsKKyAgZXhwZWN0ZWRfaGVzc2lhbigxLCAwKSA9CisgICAgLy8gRmlyc3QgdGVybQorICAgIHBfSSgwKSAqIGxvZygwLjEgKiAwLjIpICogbG9nKDAuNiAqIDAuNCkgKworICAgIHBfSSgxKSAqIGxvZygwLjQgKiAwLjIpICogbG9nKG1vZGVsXzFfd29yZF8xKSArCisgICAgcF9JKDIpICogbG9nKG1vZGVsXzBfd29yZF8yKSAqIGxvZygwLjEgKiAwLjQpOworICBleHBlY3RlZF9oZXNzaWFuKDEsIDApIC09CisgICAgKHBfSSgwKSAqIGxvZygwLjEgKiAwLjIpICsgcF9JKDEpICogbG9nKDAuNCAqIDAuMikgKyBwX0koMikgKiBsb2cobW9kZWxfMF93b3JkXzIpKSAqCisgICAgKHBfSSgwKSAqIGxvZygwLjYgKiAwLjQpICsgcF9JKDEpICogbG9nKG1vZGVsXzFfd29yZF8xKSArIHBfSSgyKSAqIGxvZygwLjEgKiAwLjQpKTsKKyAgZXhwZWN0ZWRfaGVzc2lhbigwLCAxKSA9IGV4cGVjdGVkX2hlc3NpYW4oMSwgMCk7CisgIEJPT1NUX0NIRUNLX0NMT1NFKGV4cGVjdGVkX2hlc3NpYW4oMSwgMCksIGhlc3NpYW4oMSwgMCksIDAuMDEpOworICBCT09TVF9DSEVDS19DTE9TRShleHBlY3RlZF9oZXNzaWFuKDAsIDEpLCBoZXNzaWFuKDAsIDEpLCAwLjAxKTsKK30KKworfX19IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlLmNjIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfaW5zdGFuY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjOTkyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlLmNjCkBAIC0wLDAgKzEsMzU0IEBACisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZS5oaCIKKworI2luY2x1ZGUgImxtL2NvbW1vbi9tb2RlbF9idWZmZXIuaGgiCisjaW5jbHVkZSAibG0vY29tbW9uL25ncmFtX3N0cmVhbS5oaCIKKyNpbmNsdWRlICJsbS9jb21tb24vcmVudW1iZXIuaGgiCisjaW5jbHVkZSAibG0vZW51bWVyYXRlX3ZvY2FiLmhoIgorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL21lcmdlX3ZvY2FiLmhoIgorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL3VuaXZlcnNhbF92b2NhYi5oaCIKKyNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlX3BpZWNlLmhoIgorI2luY2x1ZGUgInV0aWwvbXVybXVyX2hhc2guaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY2hhaW4uaGgiCisjaW5jbHVkZSAidXRpbC90b2tlbml6ZV9waWVjZS5oaCIKKworI2luY2x1ZGUgPGJvb3N0L3Vub3JkZXJlZF9tYXAuaHBwPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGludGVycG9sYXRlIHsKKworLy8gQW4gZXh0ZW5zaW9uIHdpdGhvdXQgYmFja29mZiB3ZWlnaHRzIGFwcGxpZWQgeWV0LgorI3ByYWdtYSBwYWNrKHB1c2gpCisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBJbml0aWFsRXh0ZW5zaW9uIHsKKyAgRXh0ZW5zaW9uIGV4dDsKKyAgLy8gT3JkZXIgZnJvbSB3aGljaCBpdCBjYW1lLgorICB1aW50OF90IG9yZGVyOworfTsKKyNwcmFnbWEgcGFjayhwb3ApCisKKy8vIEludGVuZGVkIHVzZQorLy8gRm9yIGVhY2ggbW9kZWw6CisvLyAgIHN0cmVhbSB0aHJvdWdoIG9yZGVycyBqb2ludGx5IGluIHN1ZmZpeCBvcmRlcjoKKy8vICAgICBDYWxsIE1hdGNoZWRCYWNrb2ZmIGZvciBmdWxsIG1hdGNoZXMuCisvLyAgICAgQ2FsbCBFeGl0IHdoZW4gdGhlIGNvbnRleHQgbWF0Y2hlcy4KKy8vICAgQ2FsbCBGaW5pc2hNb2RlbCB3aXRoIHRoZSB1bmlncmFtIHByb2JhYmlsaXR5IG9mIHRoZSBjb3JyZWN0IHdvcmQsIGdldCBmdWxsCisvLyAgIHByb2JhYmlsaXR5IGluIHJldHVybi4KKy8vIFVzZSBCYWNrb2ZmcyB0byBhZGp1c3QgcmVjb3JkcyB0aGF0IHdlcmUgd3JpdHRlbiB0byB0aGUgc3RyZWFtLgorY2xhc3MgSW5zdGFuY2VNYXRjaCB7CisgIHB1YmxpYzoKKyAgICBJbnN0YW5jZU1hdGNoKE1vZGVsSW5kZXggbW9kZWxzLCB1aW50OF90IG1heF9vcmRlciwgY29uc3QgV29yZEluZGV4IGNvcnJlY3QpCisgICAgICA6IHNlZW5fKHN0ZDo6bnVtZXJpY19saW1pdHM8V29yZEluZGV4Pjo6bWF4KCkpLAorICAgICAgICBiYWNrb2Zmc18oTWF0cml4OjpaZXJvcyhtb2RlbHMsIG1heF9vcmRlcikpLAorICAgICAgICBjb3JyZWN0Xyhjb3JyZWN0KSwgY29ycmVjdF9mcm9tXygxKSwgY29ycmVjdF9sbl9wcm9iXyhzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6cXVpZXRfTmFOKCkpIHt9CisKKyAgICB2b2lkIE1hdGNoZWRCYWNrb2ZmKE1vZGVsSW5kZXggbW9kZWwsIHVpbnQ4X3Qgb3JkZXIsIGZsb2F0IGxuX2JhY2tvZmYpIHsKKyAgICAgIGJhY2tvZmZzXyhtb2RlbCwgb3JkZXIgLSAxKSA9IGxuX2JhY2tvZmY7CisgICAgfQorCisgICAgLy8gV2Ugb25seSB3YW50IHRoZSBoaWdoZXN0LW9yZGVyIG1hdGNoZXMsIHdoaWNoIGFyZSB0aGUgZmlyc3QgdG8gYmUgZXhpdGVkIGZvciBhIGdpdmVuIHdvcmQuCisgICAgdm9pZCBFeGl0KGNvbnN0IEluaXRpYWxFeHRlbnNpb24gJmZyb20sIHV0aWw6OnN0cmVhbTo6U3RyZWFtICZvdXQpIHsKKyAgICAgIGlmIChmcm9tLmV4dC53b3JkID09IHNlZW5fKSByZXR1cm47CisgICAgICBzZWVuXyA9IGZyb20uZXh0LndvcmQ7CisgICAgICAqc3RhdGljX2Nhc3Q8SW5pdGlhbEV4dGVuc2lvbio+KG91dC5HZXQoKSkgPSBmcm9tOworICAgICAgKytvdXQ7CisgICAgICBpZiAoVVRJTF9VTkxJS0VMWShjb3JyZWN0XyA9PSBmcm9tLmV4dC53b3JkKSkgeworICAgICAgICBjb3JyZWN0X2Zyb21fID0gZnJvbS5vcmRlcjsKKyAgICAgICAgY29ycmVjdF9sbl9wcm9iXyA9IGZyb20uZXh0LmxuX3Byb2I7CisgICAgICB9CisgICAgfQorCisgICAgV29yZEluZGV4IENvcnJlY3QoKSBjb25zdCB7IHJldHVybiBjb3JyZWN0XzsgfQorCisgICAgLy8gQ2FsbCB0aGlzIGFmdGVyIGVhY2ggbW9kZWwgaGFzIGJlZW4gcGFzc2VkIHRocm91Z2guICBUaGUgCisgICAgZmxvYXQgRmluaXNoTW9kZWwoTW9kZWxJbmRleCBtb2RlbCwgZmxvYXQgY29ycmVjdF9sbl91bmlncmFtKSB7CisgICAgICBzZWVuXyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8V29yZEluZGV4Pjo6bWF4KCk7CisgICAgICAvLyBUdXJuIGJhY2tvZmZzIGludG8gbXVsdGlwbGllZCB2YWx1ZXMgKGFkZGVkIGluIGxvZyBzcGFjZSkuCisgICAgICAvLyBTbyBiYWNrb2Zmc18obW9kZWwsIG9yZGVyIC0gMSkgaXMgdGhlIHBlbmFsdHkgZm9yIG1hdGNoaW5nIG9yZGVyLgorICAgICAgZmxvYXQgYWNjdW0gPSAwLjA7CisgICAgICBmb3IgKGludCBvcmRlciA9IGJhY2tvZmZzXy5jb2xzKCkgLSAxOyBvcmRlciA+PSAwOyAtLW9yZGVyKSB7CisgICAgICAgIGFjY3VtICs9IGJhY2tvZmZzXyhtb2RlbCwgb3JkZXIpOworICAgICAgICBiYWNrb2Zmc18obW9kZWwsIG9yZGVyKSA9IGFjY3VtOworICAgICAgfQorICAgICAgaWYgKGNvcnJlY3RfZnJvbV8gPT0gMSkgeworICAgICAgICBjb3JyZWN0X2xuX3Byb2JfID0gY29ycmVjdF9sbl91bmlncmFtOworICAgICAgfQorICAgICAgaWYgKGNvcnJlY3RfZnJvbV8gLSAxIDwgYmFja29mZnNfLmNvbHMoKSkgeworICAgICAgICBjb3JyZWN0X2xuX3Byb2JfICs9IGJhY2tvZmZzXyhtb2RlbCwgY29ycmVjdF9mcm9tXyAtIDEpOworICAgICAgfQorICAgICAgY29ycmVjdF9mcm9tXyA9IDE7CisgICAgICByZXR1cm4gY29ycmVjdF9sbl9wcm9iXzsKKyAgICB9CisKKyAgICBjb25zdCBNYXRyaXggJkJhY2tvZmZzKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhY2tvZmZzXzsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLyBXaGF0J3MgdGhlIGxhc3Qgd29yZCB3ZSd2ZSBzZWVuPyAgVXNlZCB0byBhY3Qgb25seSBvbiBleGl0aW5nIHRoZSBsb25nZXN0IG1hdGNoLgorICAgIFdvcmRJbmRleCBzZWVuXzsKKworICAgIE1hdHJpeCBiYWNrb2Zmc187CisKKyAgICBjb25zdCBXb3JkSW5kZXggY29ycmVjdF87CisKKyAgICAvLyBUaGVzZSBvbmx5IGFwcGx5IHRvIHRoZSBtb3N0IHJlY2VudCBtb2RlbC4KKyAgICB1aW50OF90IGNvcnJlY3RfZnJvbV87CisKKyAgICBmbG9hdCBjb3JyZWN0X2xuX3Byb2JfOworfTsKKworbmFtZXNwYWNlIHsKKworLy8gRm9yd2FyZCBpbmZvcm1hdGlvbiB0byBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgYSBjb250ZXh0LgorY2xhc3MgRGlzcGF0Y2hDb250ZXh0IHsKKyAgcHVibGljOgorICAgIHZvaWQgUmVnaXN0ZXIoSW5zdGFuY2VNYXRjaCAmY29udGV4dCkgeworICAgICAgcmVnaXN0ZXJlZF8ucHVzaF9iYWNrKCZjb250ZXh0KTsKKyAgICB9CisKKyAgICB2b2lkIE1hdGNoZWRCYWNrb2ZmKHVpbnQ4X3Qgb3JkZXIsIGZsb2F0IGxuX2JhY2tvZmYpIHsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8SW5zdGFuY2VNYXRjaCo+OjppdGVyYXRvciBpID0gcmVnaXN0ZXJlZF8uYmVnaW4oKTsgaSAhPSByZWdpc3RlcmVkXy5lbmQoKTsgKytpKQorICAgICAgICAoKmkpLT5NYXRjaGVkQmFja29mZihvcmRlciwgbG5fYmFja29mZik7CisgICAgfQorCisgICAgdm9pZCBFeGl0KGNvbnN0IEluaXRpYWxFeHRlbnNpb24gJmZyb20sIHV0aWw6OnN0cmVhbTo6U3RyZWFtICZvdXQpIHsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8SW5zdGFuY2VNYXRjaCo+OjppdGVyYXRvciBpID0gcmVnaXN0ZXJlZF8uYmVnaW4oKTsgaSAhPSByZWdpc3RlcmVkXy5lbmQoKTsgKytpKSB7CisgICAgICAgICgqaSktPkV4aXQoZnJvbSwgb3V0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxJbnN0YW5jZU1hdGNoKj4gcmVnaXN0ZXJlZF87Cit9OworCisvLyBNYXAgZnJvbSBuLWdyYW0gaGFzaCB0byBjb250ZXh0cyBpbiB0aGUgdHVuaW5nIGRhdGEuCit0eXBlZGVmIGJvb3N0Ojp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBEaXNwYXRjaENvbnRleHQ+IENvbnRleHRNYXA7CisKK2NsYXNzIEFwcGx5QmFja29mZnMgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQXBwbHlCYWNrb2Zmcyhjb25zdCBJbnN0YW5jZU1hdGNoICpiYWNrb2ZmcykgOiBiYWNrb2Zmc18oYmFja29mZnMpIHt9CisKKyAgICB2b2lkIFJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7CisgICAgICBmb3IgKHV0aWw6OnN0cmVhbTo6U3RyZWFtIHN0cmVhbShwb3NpdGlvbik7IHN0cmVhbTsgKytzdHJlYW0pIHsKKyAgICAgICAgSW5pdGlhbEV4dGVuc2lvbiAmaW5pID0gKnJlaW50ZXJwcmV0X2Nhc3Q8SW5pdGlhbEV4dGVuc2lvbio+KHN0cmVhbS5HZXQoKSk7CisgICAgICAgIGluaS5leHQubG5fcHJvYiArPSBiYWNrb2Zmc19baW5pLmV4dC5pbnN0YW5jZV0gCisgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgSW5zdGFuY2VNYXRjaCAqYmFja29mZnNfOworfTsKKworSW5zdGFuY2VzOjpSZWFkRXh0ZW5zaW9ucyh1dGlsOjpzdHJlYW06OkNoYWluICZvbikgeworICBpZiAoZXh0ZW5zaW9uc19maXJzdF8uZ2V0KCkpIHsKKyAgICAvLyBMYXp5IHNvcnQgYW5kIHNhdmUgYSBzb3J0ZWQgY29weSB0byBkaXNrLiAgVE9ETzogY3V0IGRvd24gb24gcmVjb3JkIHNpemUgYnkgc3RyaXBwaW5nIG91dCBvcmRlciBpbmZvcm1hdGlvbj8KKyAgICBleHRlbnNpb25zX2ZpcnN0Xy0+T3V0cHV0KG9uKTsKKyAgICBleHRlbnNpb25zX2ZpcnN0Xy0+cmVzZXQoKTsKKyAgICAvLyBUT0RPOiBhcHBseSBiYWNrb2ZmIGRhdGEhISEhCisKKyAgICBleHRlbnNpb25zX3N1YnNlcXVlbnRfLnJlc2V0KG5ldyB1dGlsOjpzdHJlYW06OkZpbGVCdWZmZXIodXRpbDo6TWFrZVRlbXAoc29ydGluZ19jb25maWdfLnRlbXBfcHJlZml4KSkpOworICAgIG9uID4+IGV4dGVuc2lvbnNfc3Vic2VxdWVudF8tPlNpbmsoKTsKKyAgfSBlbHNlIHsKKyAgICBvbiA+PiBleHRlbnNpb25zX3N1YnNlcXVlbnRfLT5Tb3VyY2UoKTsKKyAgfQorfQorCitjbGFzcyBVbmlncmFtTG9hZGVyIHsKKyAgcHVibGljOgorICAgIFVuaWdyYW1Mb2FkZXIoQ29udGV4dE1hcCAmY29udGV4dHNfZm9yX2JhY2tvZmZzLCBNYXRyaXggJmxuX3Byb2JzLCBzdGQ6OnNpemVfdCBtb2RlbF9udW1iZXIpCisgICAgICA6IG1hcF8oY29udGV4dHNfZm9yX2JhY2tvZmZzKSwKKyAgICAgICAgcHJvYl8obG5fcHJvYnMuY29sKG1vZGVsX251bWJlcikpIHt9CisKKyAgICB2b2lkIFJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7CisgICAgICAvLyBUT0RPIGhhbmRsZSB0aGUgY2FzZSBvZiBhIHVuaWdyYW0gbW9kZWw/CisgICAgICBOR3JhbVN0cmVhbTxQcm9iQmFja29mZj4gaW5wdXQocG9zaXRpb24pOworICAgICAgYXNzZXJ0KGlucHV0KTsKKyAgICAgIEFjY3VtIHVuayA9IGlucHV0LT5WYWx1ZSgpLnByb2IgKiBNX0xOMTA7CisgICAgICBXb3JkSW5kZXggcHJldmlvdXMgPSAwOworICAgICAgZm9yICg7IGlucHV0OyArK2lucHV0KSB7CisgICAgICAgIFdvcmRJbmRleCB3b3JkID0gKmlucHV0LT5iZWdpbigpOworICAgICAgICBwcm9iXy5zZWdtZW50KHByZXZpb3VzLCB3b3JkIC0gcHJldmlvdXMpID0gVmVjdG9yOjpDb25zdGFudCh3b3JkIC0gcHJldmlvdXMsIHVuayk7CisgICAgICAgIHByb2JfKHdvcmQpID0gaW5wdXQtPlZhbHVlKCkucHJvYiAqIE1fTE4xMDsKKyAgICAgICAgQ29udGV4dE1hcDo6aXRlcmF0b3IgaSA9IG1hcF8uZmluZCh1dGlsOjpNdXJtdXJIYXNoTmF0aXZlKGlucHV0LT5iZWdpbigpLCBzaXplb2YoV29yZEluZGV4KSkpOworICAgICAgICBpZiAoaSAhPSBtYXBfLmVuZCgpKSB7CisgICAgICAgICAgaS0+c2Vjb25kLk1hdGNoZWRCYWNrb2ZmKDEsIGlucHV0LT5WYWx1ZSgpLmJhY2tvZmYgKiBNX0xOMTApOworICAgICAgICB9CisgICAgICAgIHByZXZpb3VzID0gd29yZCArIDE7CisgICAgICB9CisgICAgICBwcm9iXy5zZWdtZW50KHByZXZpb3VzLCBwcm9iXy5yb3dzKCkgLSBwcmV2aW91cykgPSBWZWN0b3I6OkNvbnN0YW50KHByb2JfLnJvd3MoKSAtIHByZXZpb3VzLCB1bmspOworICAgIH0KKworICBwcml2YXRlOgorICAgIENvbnRleHRNYXAgJm1hcF87CisgICAgTWF0cml4OjpDb2xYcHIgcHJvYl87CisgICAgc3RkOjpzaXplX3QgbW9kZWxfOworfTsKKworY2xhc3MgTWlkZGxlTG9hZGVyIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IE1pZGRsZUxvYWRlcihDb250ZXh0TWFwICZtYXApCisgICAgICA6IG1hcF8obWFwKSB7fQorCisgICAgdm9pZCBSdW4oY29uc3QgdXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICAgICAgTkdyYW1TdHJlYW08UHJvYkJhY2tvZmY+IGlucHV0KHBvc2l0aW9uKTsKKyAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGZ1bGxfc2l6ZSA9ICh1aW50OF90KilpbnB1dC0+ZW5kKCkgLSAodWludDhfdCopaW5wdXQtPmJlZ2luKCk7CisgICAgICBjb25zdCBzdGQ6OnNpemVfdCBjb250ZXh0X3NpemUgPSBmdWxsX3NpemUgLSBzaXplb2YoV29yZEluZGV4KTsKKyAgICAgIENvbnRleHRNYXA6Oml0ZXJhdG9yIGk7CisgICAgICBmb3IgKDsgaW5wdXQ7ICsraW5wdXQpIHsKKyAgICAgICAgaSA9IG1hcF8uZmluZCh1dGlsOjpNdXJtdXJIYXNoTmF0aXZlKGlucHV0LT5iZWdpbigpLCBmdWxsX3NpemUpKTsKKyAgICAgICAgaWYgKGkgIT0gbWFwXy5lbmQoKSkgeworICAgICAgICAgIGktPnNlY29uZC5NYXRjaGVkQmFja29mZihpbnB1dC0+T3JkZXIoKSwgaW5wdXQtPlZhbHVlKCkuYmFja29mZiAqIE1fTE4xMCk7CisgICAgICAgIH0KKyAgICAgICAgaSA9IG1hcF8uZmluZCh1dGlsOjpNdXJtdXJIYXNoTmF0aXZlKGlucHV0LT5iZWdpbigpLCBjb250ZXh0X3NpemUpKTsKKyAgICAgICAgaWYgKGkgIT0gbWFwXy5lbmQoKSkgeworICAgICAgICAgIGktPnNlY29uZC5NYXRjaGVkQ29udGV4dChpbnB1dC0+T3JkZXIoKSwgKihpbnB1dC0+ZW5kKCkgLSAxKSwgaW5wdXQtPlZhbHVlKCkucHJvYiAqIE1fTE4xMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBDb250ZXh0TWFwICZtYXBfOworfTsKKworY2xhc3MgSGlnaGVzdExvYWRlciB7CisgIHB1YmxpYzoKKyAgICBIaWdoZXN0TG9hZGVyKENvbnRleHRNYXAgJm1hcCwgdWludDhfdCBvcmRlcikKKyAgICAgIDogbWFwXyhtYXApLCBvcmRlcl8ob3JkZXIpIHt9CisKKyAgICB2b2lkIFJ1bihjb25zdCB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7CisgICAgICBDb250ZXh0TWFwOjppdGVyYXRvciBpOworICAgICAgY29uc3Qgc3RkOjpzaXplX3QgY29udGV4dF9zaXplID0gc2l6ZW9mKFdvcmRJbmRleCkgKiAob3JkZXJfIC0gMSk7CisgICAgICBmb3IgKFByb3h5U3RyZWFtPE5HcmFtPGZsb2F0PiA+IGlucHV0KHBvc2l0aW9uLCBOR3JhbTxmbG9hdD4oTlVMTCwgb3JkZXJfKSk7IGlucHV0OyArK2lucHV0KSB7CisgICAgICAgIGkgPSBtYXBfLmZpbmQodXRpbDo6TXVybXVySGFzaE5hdGl2ZShpbnB1dC0+YmVnaW4oKSwgY29udGV4dF9zaXplKSk7CisgICAgICAgIGlmIChpICE9IG1hcF8uZW5kKCkpIHsKKyAgICAgICAgICBpLT5zZWNvbmQuTWF0Y2hlZENvbnRleHQob3JkZXJfLCAqKGlucHV0LT5lbmQoKSAtIDEpLCBpbnB1dC0+VmFsdWUoKSAqIE1fTE4xMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBDb250ZXh0TWFwICZtYXBfOworICAgIGNvbnN0IHVpbnQ4X3Qgb3JkZXJfOworfTsKKworY2xhc3MgSWRlbnRpZnlUdW5pbmcgOiBwdWJsaWMgRW51bWVyYXRlVm9jYWIgeworICBwdWJsaWM6CisgICAgSWRlbnRpZnlUdW5pbmcoaW50IHR1bmluZ19maWxlLCBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+ICZvdXQpIDogaW5kaWNlc18ob3V0KSB7CisgICAgICBpbmRpY2VzXy5jbGVhcigpOworICAgICAgU3RyaW5nUGllY2UgbGluZTsKKyAgICAgIHN0ZDo6c2l6ZV90IGNvdW50ZXIgPSAwOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+ICZlb3MgPSB3b3Jkc19bdXRpbDo6TXVybXVySGFzaE5hdGl2ZSgiPC9zPiIsIDQpXTsKKyAgICAgIGZvciAodXRpbDo6RmlsZVBpZWNlIGYodHVuaW5nX2ZpbGUpOyBmLlJlYWRMaW5lT3JFT0YobGluZSk7KSB7CisgICAgICAgIGZvciAodXRpbDo6VG9rZW5JdGVyPHV0aWw6OkJvb2xDaGFyYWN0ZXIsIHRydWU+IHdvcmQobGluZSwgdXRpbDo6a1NwYWNlcyk7IHdvcmQ7ICsrd29yZCkgeworICAgICAgICAgIFVUSUxfVEhST1dfSUYoKndvcmQgPT0gIjxzPiIgfHwgKndvcmQgPT0gIjwvcz4iLCBGb3JtYXRMb2FkRXhjZXB0aW9uLCAiSWxsZWdhbCB3b3JkIGluIHR1bmluZyBkYXRhOiAiIDw8ICp3b3JkKTsKKyAgICAgICAgICB3b3Jkc19bdXRpbDo6TXVybXVySGFzaE5hdGl2ZSh3b3JkLT5kYXRhKCksIHdvcmQtPnNpemUoKSldLnB1c2hfYmFjayhjb3VudGVyKyspOworICAgICAgICB9CisgICAgICAgIGVvcy5wdXNoX2JhY2soY291bnRlcisrKTsKKyAgICAgIH0KKyAgICAgIC8vIEFsc28gZ2V0IDxzPgorICAgICAgaW5kaWNlc18ucmVzaXplKGNvdW50ZXIgKyAxKTsKKyAgICAgIHdvcmRzX1t1dGlsOjpNdXJtdXJIYXNoTmF0aXZlKCI8cz4iLCAzKV0ucHVzaF9iYWNrKGluZGljZXNfLnNpemUoKSAtIDEpOworICAgIH0KKworICAgIHZvaWQgQWRkKFdvcmRJbmRleCBpZCwgY29uc3QgU3RyaW5nUGllY2UgJnN0cikgeworICAgICAgYm9vc3Q6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiA+OjppdGVyYXRvciBpID0gd29yZHNfLmZpbmQodXRpbDo6TXVybXVySGFzaE5hdGl2ZShzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKSk7CisgICAgICBpZiAoaSAhPSB3b3Jkc18uZW5kKCkpIHsKKyAgICAgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD46Oml0ZXJhdG9yIGogPSBpLT5zZWNvbmQuYmVnaW4oKTsgaiAhPSBpLT5zZWNvbmQuZW5kKCk7ICsraikgeworICAgICAgICAgIGluZGljZXNfWypqXSA9IGlkOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgV29yZEluZGV4IEZpbmlzaEdldEJPUygpIHsKKyAgICAgIFdvcmRJbmRleCByZXQgPSBpbmRpY2VzXy5iYWNrKCk7CisgICAgICBpbmRpY2VzXy5wb3BfYmFjaygpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+ICZpbmRpY2VzXzsKKworICAgIGJvb3N0Ojp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gPiB3b3Jkc187Cit9OworCit9IC8vIG5hbWVzcGFjZQorCitJbnN0YW5jZTo6SW5zdGFuY2Uoc3RkOjpzaXplX3QgbnVtX21vZGVscykgOiBsbl9iYWNrb2ZmKG51bV9tb2RlbHMpLCBsbl9jb3JyZWN0KG51bV9tb2RlbHMpLCBsbl9leHRlbnNpb25zKDAsIG51bV9tb2RlbHMpIHt9CisKK1dvcmRJbmRleCBMb2FkSW5zdGFuY2VzKGludCB0dW5pbmdfZmlsZSwgY29uc3Qgc3RkOjp2ZWN0b3I8U3RyaW5nUGllY2U+ICZtb2RlbF9uYW1lcywgdXRpbDo6Rml4ZWRBcnJheTxJbnN0YW5jZT4gJmluc3RhbmNlcywgTWF0cml4ICZsbl91bmlncmFtcykgeworICB1dGlsOjpGaXhlZEFycmF5PE1vZGVsQnVmZmVyPiBtb2RlbHMobW9kZWxfbmFtZXMuc2l6ZSgpKTsKKyAgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiB2b2NhYl9zaXplczsKKyAgdm9jYWJfc2l6ZXMucmVzZXJ2ZShtb2RlbF9uYW1lcy5zaXplKCkpOworICB1dGlsOjpGaXhlZEFycmF5PHV0aWw6OnNjb3BlZF9mZD4gdm9jYWJfZmlsZXMobW9kZWxfbmFtZXMuc2l6ZSgpKTsKKyAgc3RkOjpzaXplX3QgbWF4X29yZGVyID0gMDsKKyAgZm9yIChzdGQ6OnZlY3RvcjxTdHJpbmdQaWVjZT46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtb2RlbF9uYW1lcy5iZWdpbigpOyBpICE9IG1vZGVsX25hbWVzLmVuZCgpOyArK2kpIHsKKyAgICBtb2RlbHMucHVzaF9iYWNrKCppKTsKKyAgICB2b2NhYl9zaXplcy5wdXNoX2JhY2sobW9kZWxzLmJhY2soKS5Db3VudHMoKVswXSk7CisgICAgdm9jYWJfZmlsZXMucHVzaF9iYWNrKG1vZGVscy5iYWNrKCkuU3RlYWxWb2NhYkZpbGUoKSk7CisgICAgbWF4X29yZGVyID0gc3RkOjptYXgobWF4X29yZGVyLCBtb2RlbHMuYmFjaygpLk9yZGVyKCkpOworICB9CisgIFVuaXZlcnNhbFZvY2FiIHZvY2FiKHZvY2FiX3NpemVzKTsKKyAgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiB0dW5pbmdfd29yZHM7CisgIFdvcmRJbmRleCBib3M7CisgIFdvcmRJbmRleCBjb21iaW5lZF92b2NhYl9zaXplOworICB7CisgICAgSWRlbnRpZnlUdW5pbmcgaWRlbnRpZnkodHVuaW5nX2ZpbGUsIHR1bmluZ193b3Jkcyk7CisgICAgY29tYmluZWRfdm9jYWJfc2l6ZSA9IE1lcmdlVm9jYWIodm9jYWJfZmlsZXMsIHZvY2FiLCBpZGVudGlmeSk7CisgICAgYm9zID0gaWRlbnRpZnkuRmluaXNoR2V0Qk9TKCk7CisgIH0KKworICBpbnN0YW5jZXMuSW5pdCh0dW5pbmdfd29yZHMuc2l6ZSgpKTsKKyAgdXRpbDo6Rml4ZWRBcnJheTxJbnN0YW5jZUJ1aWxkZXI+IGJ1aWxkZXJzKHR1bmluZ193b3Jkcy5zaXplKCkpOworICBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+IGNvbnRleHQ7CisgIGNvbnRleHQucHVzaF9iYWNrKGJvcyk7CisKKyAgLy8gUG9wdWxhdGUgdGhlIG1hcCBmcm9tIGNvbnRleHRzIHRvIGluc3RhbmNlIGJ1aWxkZXJzLgorICBDb250ZXh0TWFwIGNtYXA7CisgIGNvbnN0IFdvcmRJbmRleCBlb3MgPSB0dW5pbmdfd29yZHMuYmFjaygpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdHVuaW5nX3dvcmRzLnNpemUoKTsgKytpKSB7CisgICAgaW5zdGFuY2VzLnB1c2hfYmFjayhtb2RlbF9uYW1lcy5zaXplKCkpOworICAgIGJ1aWxkZXJzLnB1c2hfYmFjayh0dW5pbmdfd29yZHNbaV0sIG1heF9vcmRlcik7CisgICAgZm9yIChzdGQ6OnNpemVfdCBqID0gMDsgaiA8IGNvbnRleHQuc2l6ZSgpOyArK2opIHsKKyAgICAgIGNtYXBbdXRpbDo6TXVybXVySGFzaE5hdGl2ZSgmY29udGV4dFtqXSwgc2l6ZW9mKFdvcmRJbmRleCkgKiAoY29udGV4dC5zaXplKCkgLSBqKSldLlJlZ2lzdGVyKGJ1aWxkZXJzLmJhY2soKSk7CisgICAgfQorICAgIC8vIFByZXBhcmUgZm9yIG5leHQgd29yZC4KKyAgICBpZiAodHVuaW5nX3dvcmRzW2ldID09IGVvcykgeworICAgICAgY29udGV4dC5jbGVhcigpOworICAgICAgY29udGV4dC5wdXNoX2JhY2soYm9zKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGNvbnRleHQuc2l6ZSgpID09IG1heF9vcmRlcikgeworICAgICAgICBjb250ZXh0LmVyYXNlKGNvbnRleHQuYmVnaW4oKSk7CisgICAgICB9CisgICAgICBjb250ZXh0LnB1c2hfYmFjayh0dW5pbmdfd29yZHNbaV0pOworICAgIH0KKyAgfQorCisgIGxuX3VuaWdyYW1zLnJlc2l6ZShjb21iaW5lZF92b2NhYl9zaXplLCBtb2RlbHMuc2l6ZSgpKTsKKworICAvLyBTY2FuIHRocm91Z2ggaW5wdXQgZmlsZXMuICBTYWRseSBub3QgcGFyYWxsZWwgZHVlIHRvIGFuIHVuZGVybHlpbmcgaGFzaCB0YWJsZS4KKyAgZm9yIChzdGQ6OnNpemVfdCBtID0gMDsgbSA8IG1vZGVscy5zaXplKCk7ICsrbSkgeworICAgIGZvciAoc3RkOjpzaXplX3Qgb3JkZXIgPSAxOyBvcmRlciA8PSBtb2RlbHNbbV0uT3JkZXIoKTsgKytvcmRlcikgeworICAgICAgdXRpbDo6c3RyZWFtOjpDaGFpbiBjaGFpbih1dGlsOjpzdHJlYW06OkNoYWluQ29uZmlnKHNpemVvZihQcm9iQmFja29mZikgKyBvcmRlciAqIHNpemVvZihXb3JkSW5kZXgpLCAyLCA2NCAqIDEwNDg1NzYpKTsKKyAgICAgIG1vZGVsc1ttXS5Tb3VyY2Uob3JkZXIgLSAxLCBjaGFpbik7CisgICAgICBjaGFpbiA+PiBSZW51bWJlcih2b2NhYi5NYXBwaW5nKG0pLCBvcmRlcik7CisgICAgICBpZiAob3JkZXIgPT0gMSkgeworICAgICAgICBjaGFpbiA+PiBVbmlncmFtTG9hZGVyKGNtYXAsIGxuX3VuaWdyYW1zLCBtKTsKKyAgICAgIH0gZWxzZSBpZiAob3JkZXIgPCBtb2RlbHNbbV0uT3JkZXIoKSkgeworICAgICAgICBjaGFpbiA+PiBNaWRkbGVMb2FkZXIoY21hcCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjaGFpbiA+PiBIaWdoZXN0TG9hZGVyKGNtYXAsIG9yZGVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChzdGQ6OnNpemVfdCBpbnN0YW5jZSA9IDA7IGluc3RhbmNlIDwgdHVuaW5nX3dvcmRzLnNpemUoKTsgKytpbnN0YW5jZSkgeworICAgICAgYnVpbGRlcnNbaW5zdGFuY2VdLkR1bXAobSwgbG5fdW5pZ3JhbXMsIGluc3RhbmNlc1tpbnN0YW5jZV0pOworICAgIH0KKyAgICBsbl91bmlncmFtcyhib3MsIG0pID0gLTk5OyAvLyBEb2VzIG5vdCBtYXR0ZXIgYXMgbG9uZyBhcyBpdCBkb2VzIG5vdCBwcm9kdWNlIG5hbnMgc2luY2UgdHVuZV9kZXJpdmF0aXZlcyBzZXRzIHRoaXMgdG8gemVyby4KKyAgfQorICByZXR1cm4gYm9zOworfQorCit9fSAvLyBuYW1lc3BhY2VzCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZS5oaCBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMWVlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZS5oaApAQCAtMCwwICsxLDg2IEBACisjaWZuZGVmIExNX0lOVEVSUE9MQVRFX1RVTkVfSU5TVEFOQ0VfSAorI2RlZmluZSBMTV9JTlRFUlBPTEFURV9UVU5FX0lOU1RBTkNFX0gKKworI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL3R1bmVfbWF0cml4LmhoIgorI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisjaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY29uZmlnLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlLmhoIgorCisjaW5jbHVkZSA8Ym9vc3Qvb3B0aW9uYWwuaHBwPgorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0gewordGVtcGxhdGUgPGNsYXNzIFMsIGNsYXNzIFQ+IGNsYXNzIFNvcnQ7CitjbGFzcyBDaGFpbjsKK2NsYXNzIEZpbGVCdWZmZXI7Cit9fSAvLyBuYW1lc3BhY2VzCisKK25hbWVzcGFjZSBsbSB7IG5hbWVzcGFjZSBpbnRlcnBvbGF0ZSB7CisKK3R5cGVkZWYgdWludDMyX3QgSW5zdGFuY2VJbmRleDsKK3R5cGVkZWYgdWludDMyX3QgTW9kZWxJbmRleDsKKworc3RydWN0IEV4dGVuc2lvbiB7CisgIC8vIFdoaWNoIHR1bmluZyBpbnN0YW5jZSBkb2VzIHRoaXMgYmVsb25nIHRvPworICBJbnN0YW5jZUluZGV4IGluc3RhbmNlOworICBXb3JkSW5kZXggd29yZDsKKyAgTW9kZWxJbmRleCBtb2RlbDsKKyAgLy8gbG4gcF97bW9kZWx9ICh3b3JkIHwgY29udGV4dChpbnN0YW5jZSkpCisgIGZsb2F0IGxuX3Byb2I7CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRXh0ZW5zaW9uICZvdGhlcikgY29uc3QgeworICAgIGlmIChpbnN0YW5jZSAhPSBvdGhlci5pbnN0YW5jZSkKKyAgICAgIHJldHVybiBpbnN0YW5jZSA8IG90aGVyLmluc3RhbmNlOworICAgIGlmICh3b3JkICE9IG90aGVyLndvcmQpCisgICAgICByZXR1cm4gd29yZCA8IG90aGVyLndvcmQ7CisgICAgaWYgKG1vZGVsICE9IG90aGVyLm1vZGVsKQorICAgICAgcmV0dXJuIG1vZGVsIDwgb3RoZXIubW9kZWw7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitjbGFzcyBJbnN0YW5jZXMgeworICBwdWJsaWM6CisgICAgSW5zdGFuY2VzKGludCB0dW5lX2ZpbGUsIGNvbnN0IHN0ZDo6dmVjdG9yPFN0cmluZ1BpZWNlPiAmbW9kZWxfbmFtZXMpOworCisgICAgRWlnZW46OkNvbnN0Um93WHByIEJhY2tvZmZzKEluc3RhbmNlSW5kZXggaW5zdGFuY2UpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsbl9iYWNrb2Zmc18ucm93KGluc3RhbmNlKTsKKyAgICB9CisKKyAgICBjb25zdCBWZWN0b3IgJkNvcnJlY3RHcmFkaWVudFRlcm0oKSBjb25zdCB7IHJldHVybiBuZWdfbG5fY29ycmVjdF9zdW1fOyB9CisKKyAgICBjb25zdCBNYXRyaXggJkxOVW5pZ3JhbXMoKSBjb25zdCB7IHJldHVybiBsbl91bmlncmFtc187IH0KKworICAgIHZvaWQgUmVhZEV4dGVuc2lvbnModXRpbDo6c3RyZWFtOjpDaGFpbiAmdG8pOworCisgIHByaXZhdGU6CisgICAgLy8gYmFja29mZnNfKGluc3RhbmNlLCBtb2RlbCkgaXMgdGhlIGJhY2tvZmYgYWxsIHRoZSB3YXkgdG8gdW5pZ3JhbXMuCisgICAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PGZsb2F0LCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpSb3dNYWpvcj4gQmFja29mZk1hdHJpeDsKKyAgICBCYWNrb2ZmTWF0cml4IGxuX2JhY2tvZmZzXzsKKyAgICAKKyAgICAvLyBuZWdfY29ycmVjdF9zdW1fKG1vZGVsKSA9IC1cc3VtX3tpbnN0YW5jZXN9IGxuIHBfe21vZGVsfShjb3JyZWN0KGluc3RhbmNlKSB8IGNvbnRleHQoaW5zdGFuY2UpKS4KKyAgICAvLyBUaGlzIGFwcGVhcnMgYXMgYSB0ZXJtIGluIHRoZSBncmFkaWVudC4KKyAgICBWZWN0b3IgbmVnX2xuX2NvcnJlY3Rfc3VtXzsKKworICAgIC8vIHVuaWdyYW1zXyh3b3JkLCBtb2RlbCkgPSBsbiBwX3ttb2RlbH0od29yZCkuCisgICAgTWF0cml4IGxuX3VuaWdyYW1zXzsKKworICAgIHN0cnVjdCBFeHRlbnNpb25Db21wYXJlIHsKKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCB2b2lkICpmLCBjb25zdCB2b2lkICpzKSBjb25zdCB7CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEV4dGVuc2lvbiAmPihmKSA8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXh0ZW5zaW9uICY+KHMpOworICAgICAgfSAgICAKKyAgICB9OworCisgICAgLy8gVGhpcyBpcyB0aGUgc291cmNlIG9mIGRhdGEgZm9yIHRoZSBmaXJzdCBpdGVyYXRpb24uCisgICAgdXRpbDo6c2NvcGVkX3B0cjx1dGlsOjpzdHJlYW06OlNvcnQ8RXh0ZW5zaW9uQ29tcGFyZT4gPiBleHRlbnNpb25zX2ZpcnN0XzsKKworICAgIC8vIFNvdXJjZSBvZiBkYXRhIGZvciBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMuICBUaGlzIGNvbnRhaW5zIGFscmVhZHktc29ydGVkIGRhdGEuCisgICAgdXRpbDo6c2NvcGVkX3B0cjx1dGlsOjpzdHJlYW06OkZpbGVCdWZmZXI+IGV4dGVuc2lvbnNfc3Vic2VxdWVudF87CisKKyAgICBjb25zdCB1dGlsOjpzdHJlYW06OlNvcnRDb25maWcgc29ydGluZ19jb25maWdfOworfTsKKworfX0gLy8gbmFtZXNwYWNlcworI2VuZGlmIC8vIExNX0lOVEVSUE9MQVRFX1RVTkVfSU5TVEFOQ0VfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfaW5zdGFuY2VfZGF0YS9nZW5lcmF0ZS5zaCBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlX2RhdGEvZ2VuZXJhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDcyNTU3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlX2RhdGEvZ2VuZXJhdGUuc2gKQEAgLTAsMCArMSw5IEBACisjIS9iaW4vYmFzaAorLi4vLi4vLi4vYmluL2xtcGx6IC0tZGlzY291bnRfZmFsbGJhY2sgLW8gMyAtUyAxMDBNIC0taW50ZXJtZWRpYXRlIHRveTAgLS1hcnBhIHRveTAuYXJwYSA8PEVPRgorYSBhIGIgYQorYiBhIGEgYgorRU9GCisuLi8uLi8uLi9iaW4vbG1wbHogLS1kaXNjb3VudF9mYWxsYmFjayAtbyAzIC1TIDEwME0gLS1pbnRlcm1lZGlhdGUgdG95MSAtLWFycGEgdG95MS5hcnBhIDw8RU9GCithIGEgYiBiIGIgYiBiIGIgYgorYworRU9GCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTAuMSBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlX2RhdGEvdG95MC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjZjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTAuMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTAuMiBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlX2RhdGEvdG95MC4yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MzViMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTAuMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTAuMyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlX2RhdGEvdG95MC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTdhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTAuMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTAua2VubG1faW50ZXJtZWRpYXRlIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfaW5zdGFuY2VfZGF0YS90b3kwLmtlbmxtX2ludGVybWVkaWF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTEzNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfaW5zdGFuY2VfZGF0YS90b3kwLmtlbmxtX2ludGVybWVkaWF0ZQpAQCAtMCwwICsxLDMgQEAKK0tlbkxNIGludGVybWVkaWF0ZSBiaW5hcnkgZmlsZQorQ291bnRzIDUgNyA3CitQYXlsb2FkIHBiCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTAudm9jYWIgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTAudm9jYWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwYzBmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlX2RhdGEvdG95MC52b2NhYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTEuMSBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlX2RhdGEvdG95MS4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MGNlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTEuMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTEuMiBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlX2RhdGEvdG95MS4yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDI4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTEuMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTEuMyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlX2RhdGEvdG95MS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjNhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTEuMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTEua2VubG1faW50ZXJtZWRpYXRlIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfaW5zdGFuY2VfZGF0YS90b3kxLmtlbmxtX2ludGVybWVkaWF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTgyNjY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfaW5zdGFuY2VfZGF0YS90b3kxLmtlbmxtX2ludGVybWVkaWF0ZQpAQCAtMCwwICsxLDMgQEAKK0tlbkxNIGludGVybWVkaWF0ZSBiaW5hcnkgZmlsZQorQ291bnRzIDYgNyA2CitQYXlsb2FkIHBiCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTEudm9jYWIgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV9kYXRhL3RveTEudm9jYWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzYjJhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX2luc3RhbmNlX2RhdGEvdG95MS52b2NhYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZV90ZXN0LmNjIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfaW5zdGFuY2VfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGRiNTljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfaW5zdGFuY2VfdGVzdC5jYwpAQCAtMCwwICsxLDkzIEBACisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZS5oaCIKKworI2luY2x1ZGUgInV0aWwvZmlsZV9zdHJlYW0uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlLmhoIgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEluc3RhbmNlVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgaW50ZXJwb2xhdGUgeyBuYW1lc3BhY2UgeworCitNYXRyaXg6OkluZGV4IEZpbmRSb3coY29uc3Qgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiAmd29yZHMsIFdvcmRJbmRleCB3b3JkKSB7CisgIHN0ZDo6dmVjdG9yPFdvcmRJbmRleD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RkOjpmaW5kKHdvcmRzLmJlZ2luKCksIHdvcmRzLmVuZCgpLCB3b3JkKTsKKyAgQk9PU1RfUkVRVUlSRShpdCAhPSB3b3Jkcy5lbmQoKSk7CisgIHJldHVybiBpdCAtIHdvcmRzLmJlZ2luKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFRveSkgeworICB1dGlsOjpzY29wZWRfZmQgdGVzdF9pbnB1dCh1dGlsOjpNYWtlVGVtcCgidGVtcG9yYXJ5IikpOworICB7CisgICAgdXRpbDo6RmlsZVN0cmVhbSh0ZXN0X2lucHV0LmdldCgpKSA8PCAiY1xuIjsKKyAgfQorCisgIFN0cmluZ1BpZWNlIGRpcigidHVuZV9pbnN0YW5jZV9kYXRhLyIpOworICBpZiAoYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgPT0gMikgeworICAgIFN0cmluZ1BpZWNlIHplcm9fZmlsZShib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlsxXSk7CisgICAgQk9PU1RfUkVRVUlSRSh6ZXJvX2ZpbGUuc2l6ZSgpID4gc3RybGVuKCJ0b3kwLjEiKSk7CisgICAgQk9PU1RfUkVRVUlSRV9FUVVBTCgidG95MC4xIiwgU3RyaW5nUGllY2UoemVyb19maWxlLmRhdGEoKSArIHplcm9fZmlsZS5zaXplKCkgLSA2LCA2KSk7CisgICAgZGlyID0gU3RyaW5nUGllY2UoemVyb19maWxlLmRhdGEoKSwgemVyb19maWxlLnNpemUoKSAtIDYpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUGllY2U+IG1vZGVsX25hbWVzOworICBzdGQ6OnN0cmluZyBmdWxsMCA9IHN0ZDo6c3RyaW5nKGRpci5kYXRhKCksIGRpci5zaXplKCkpICsgInRveTAiOworICBzdGQ6OnN0cmluZyBmdWxsMSA9IHN0ZDo6c3RyaW5nKGRpci5kYXRhKCksIGRpci5zaXplKCkpICsgInRveTEiOworICBtb2RlbF9uYW1lcy5wdXNoX2JhY2soZnVsbDApOworICBtb2RlbF9uYW1lcy5wdXNoX2JhY2soZnVsbDEpOworCisgIHV0aWw6OkZpeGVkQXJyYXk8SW5zdGFuY2U+IGluc3RhbmNlczsKKyAgTWF0cml4IGxuX3VuaWdyYW1zOworICAvLyBSZXR1cm5zIHZvY2FiIGlkIG9mIDxzPgorICBCT09TVF9DSEVDS19FUVVBTCgxLCBMb2FkSW5zdGFuY2VzKHRlc3RfaW5wdXQucmVsZWFzZSgpLCBtb2RlbF9uYW1lcywgaW5zdGFuY2VzLCBsbl91bmlncmFtcykpOworICAvLyA8dW5rPgorICBCT09TVF9DSEVDS19DTE9TRSgtMC45MDMwOSAqIE1fTE4xMCwgbG5fdW5pZ3JhbXMoMCwgMCksIDAuMDAxKTsKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0UoLTEgKiBNX0xOMTAsIGxuX3VuaWdyYW1zKDAsIDEpLCAwLjAwMSk7CisgIC8vIDxzPgorICBCT09TVF9DSEVDS19HVCgtOTguMCwgbG5fdW5pZ3JhbXMoMSwgMCkpOworICBCT09TVF9DSEVDS19HVCgtOTguMCwgbG5fdW5pZ3JhbXMoMSwgMSkpOworICAvLyBhCisgIEJPT1NUX0NIRUNLX0NMT1NFKC0wLjQ2OTQzNDM4ICogTV9MTjEwLCBsbl91bmlncmFtcygyLCAwKSwgMC4wMDEpOworICBCT09TVF9DSEVDS19DTE9TRSgtMC42MTQ2NDkxICogTV9MTjEwLCBsbl91bmlncmFtcygyLCAxKSwgMC4wMDEpOworICAvLyA8L3M+CisgIEJPT1NUX0NIRUNLX0NMT1NFKC0wLjU3MjA5NjggKiBNX0xOMTAsIGxuX3VuaWdyYW1zKDMsIDApLCAwLjAwMSk7CisgIEJPT1NUX0NIRUNLX0NMT1NFKC0wLjYxNDY0OTEgKiBNX0xOMTAsIGxuX3VuaWdyYW1zKDMsIDEpLCAwLjAwMSk7CisgIC8vIGMKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0UoLTAuOTAzMDkgKiBNX0xOMTAsIGxuX3VuaWdyYW1zKDQsIDApLCAwLjAwMSk7IC8vIDx1bms+CisgIEJPT1NUX0NIRUNLX0NMT1NFKC0wLjc2NTkxNjggKiBNX0xOMTAsIGxuX3VuaWdyYW1zKDQsIDEpLCAwLjAwMSk7CisgIC8vIHRvbyBsYXp5IHRvIGRvIGIuCisKKyAgLy8gVHdvIGluc3RhbmNlczoKKyAgLy8gPHM+IHByZWRpY3RzIGMKKyAgLy8gPHM+IGMgcHJlZGljdHMgPC9zPgorICBCT09TVF9SRVFVSVJFX0VRVUFMKDIsIGluc3RhbmNlcy5zaXplKCkpOworICBCT09TVF9DSEVDS19DTE9TRSgtMC4zMDEwMyAqIE1fTE4xMCwgaW5zdGFuY2VzWzBdLmxuX2JhY2tvZmYoMCksIDAuMDAxKTsKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0UoLTAuMzAxMDMgKiBNX0xOMTAsIGluc3RhbmNlc1swXS5sbl9iYWNrb2ZmKDEpLCAwLjAwMSk7CisKKyAgLy8gQmFja29mZnMgb2YgPHM+IGMKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0UoMC4wLCBpbnN0YW5jZXNbMV0ubG5fYmFja29mZigwKSwgMC4wMDEpOworICBCT09TVF9DSEVDS19DTE9TRSgoLTAuMzAxMDMgLSAwLjMwMTAzKSAqIE1fTE4xMCwgaW5zdGFuY2VzWzFdLmxuX2JhY2tvZmYoMSksIDAuMDAxKTsKKworICAvLyBUaHJlZSBleHRlbnNpb25zOiBhLCBiLCBjCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoMywgaW5zdGFuY2VzWzBdLmxuX2V4dGVuc2lvbnMucm93cygpKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCgzLCBpbnN0YW5jZXNbMF0uZXh0ZW5zaW9uX3dvcmRzLnNpemUoKSk7CisKKyAgLy8gPHM+IGEKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0UoLTAuMzc3MTIwMTcgKiBNX0xOMTAsIGluc3RhbmNlc1swXS5sbl9leHRlbnNpb25zKEZpbmRSb3coaW5zdGFuY2VzWzBdLmV4dGVuc2lvbl93b3JkcywgMiksIDApLCAwLjAwMSk7CisgIC8vIDxzPiBjCisgIEJPT1NUX0NIRUNLX0NMT1NFKCgtMC45MDMwOSArIC0wLjMwMTAzKSAqIE1fTE4xMCwgaW5zdGFuY2VzWzBdLmxuX2V4dGVuc2lvbnMoRmluZFJvdyhpbnN0YW5jZXNbMF0uZXh0ZW5zaW9uX3dvcmRzLCA0KSwgMCksIDAuMDAxKTsKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0UoLTAuNDc0MDMwMiAqIE1fTE4xMCwgaW5zdGFuY2VzWzBdLmxuX2V4dGVuc2lvbnMoRmluZFJvdyhpbnN0YW5jZXNbMF0uZXh0ZW5zaW9uX3dvcmRzLCA0KSwgMSksIDAuMDAxKTsKKworICAvLyA8cz4gYyA8L3M+CisgIEJPT1NUX0NIRUNLX0NMT1NFKC0wLjA5MTEzMjE3ICogTV9MTjEwLCBpbnN0YW5jZXNbMV0ubG5fZXh0ZW5zaW9ucyhGaW5kUm93KGluc3RhbmNlc1sxXS5leHRlbnNpb25fd29yZHMsIDMpLCAxKSwgMC4wMDEpOworCisgIC8vIHBfMChjIHwgPHM+KSA9IHBfMChjKWJfMCg8cz4pID0gMTBeKC0wLjkwMzA5ICsgLTAuMzAxMDMpCisgIEJPT1NUX0NIRUNLX0NMT1NFKCgtMC45MDMwOSArIC0wLjMwMTAzKSAqIE1fTE4xMCwgaW5zdGFuY2VzWzBdLmxuX2NvcnJlY3QoMCksIDAuMDAxKTsKKyAgLy8gcF8xKGMgfCA8cz4pID0gMTBeLTAuNDc0MDMwMgorICBCT09TVF9DSEVDS19DTE9TRSgtMC40NzQwMzAyICogTV9MTjEwLCBpbnN0YW5jZXNbMF0ubG5fY29ycmVjdCgxKSwgMC4wMDEpOworfQorCit9fX0gLy8gbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfbWFpbi5jYyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5NmFmMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX21haW4uY2MKQEAgLTAsMCArMSw1OSBAQAorI2luY2x1ZGUgImxtL2ludGVycG9sYXRlL3R1bmVfZGVyaXZhdGl2ZXMuaGgiCisjaW5jbHVkZSAibG0vaW50ZXJwb2xhdGUvdHVuZV9pbnN0YW5jZS5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1sb2NhbC10eXBlZGVmcyIKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjaW5jbHVkZSA8Ym9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcD4KKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgbG0geyBuYW1lc3BhY2UgaW50ZXJwb2xhdGUgewordm9pZCBUdW5lV2VpZ2h0cyhpbnQgdHVuZV9maWxlLCBjb25zdCBzdGQ6OnZlY3RvcjxTdHJpbmdQaWVjZT4gJm1vZGVsX25hbWVzLCBWZWN0b3IgJndlaWdodHMpIHsKKyAgdXRpbDo6Rml4ZWRBcnJheTxJbnN0YW5jZT4gaW5zdGFuY2VzOworICBNYXRyaXggbG5fdW5pZ3JhbXM7CisgIFdvcmRJbmRleCBib3MgPSBMb2FkSW5zdGFuY2VzKHR1bmVfZmlsZSwgbW9kZWxfbmFtZXMsIGluc3RhbmNlcywgbG5fdW5pZ3JhbXMpOworICBDb21wdXRlRGVyaXZhdGl2ZSBkZXJpdmUoaW5zdGFuY2VzLCBsbl91bmlncmFtcywgYm9zKTsKKyAgd2VpZ2h0cyA9IFZlY3Rvcjo6Q29uc3RhbnQobW9kZWxfbmFtZXMuc2l6ZSgpLCAxLjAgLyBtb2RlbF9uYW1lcy5zaXplKCkpOworICBWZWN0b3IgZ3JhZGllbnQ7CisgIE1hdHJpeCBoZXNzaWFuOworICBmb3IgKHN0ZDo6c2l6ZV90IGl0ZXJhdGlvbiA9IDA7IGl0ZXJhdGlvbiA8IDEwIC8qVE9ETyBmYW5jeSBzdG9wcGluZyBjcml0ZXJpYSAqLzsgKytpdGVyYXRpb24pIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkl0ZXJhdGlvbiAiIDw8IGl0ZXJhdGlvbiA8PCAiOiB3ZWlnaHRzID0iOworICAgIGZvciAoVmVjdG9yOjpJbmRleCBpID0gMDsgaSA8IHdlaWdodHMucm93cygpOyArK2kpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAnICcgPDwgd2VpZ2h0cyhpKTsKKyAgICB9CisgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgIDw8ICJQZXJwbGV4aXR5ID0gIiA8PAorICAgICAgZGVyaXZlLkl0ZXJhdGlvbih3ZWlnaHRzLCBncmFkaWVudCwgaGVzc2lhbikKKyAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAvLyBUT0RPOiAxLjAgc3RlcCBzaXplIHdhcyB0b28gYmlnIGFuZCBpdCBrZXB0IGdldHRpbmcgdW5zdGFibGUuICBNb3JlIG1hdGguCisgICAgd2VpZ2h0cyAtPSAwLjcgKiBoZXNzaWFuLmludmVyc2UoKSAqIGdyYWRpZW50OworICB9Cit9Cit9fSAvLyBuYW1lc3BhY2VzCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgRWlnZW46OmluaXRQYXJhbGxlbCgpOworICBuYW1lc3BhY2UgcG8gPSBib29zdDo6cHJvZ3JhbV9vcHRpb25zOworICAvLyBUT0RPIGhlbHAKKyAgcG86Om9wdGlvbnNfZGVzY3JpcHRpb24gb3B0aW9ucygiVHVuaW5nIG9wdGlvbnMiKTsKKyAgc3RkOjpzdHJpbmcgdHVuaW5nX2ZpbGU7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbnB1dF9tb2RlbHM7CisgIG9wdGlvbnMuYWRkX29wdGlvbnMoKQorICAgICgidHVuaW5nLHQiLCBwbzo6dmFsdWU8c3RkOjpzdHJpbmc+KCZ0dW5pbmdfZmlsZSktPnJlcXVpcmVkKCksICJGaWxlIHRvIHR1bmUgb24uICBUaGlzIHNob3VsZCBiZSBhIHRleHQgZmlsZSB3aXRoIG9uZSBzZW50ZW5jZSBwZXIgbGluZS4iKQorICAgICgibW9kZWwsbSIsIHBvOjp2YWx1ZTxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPigmaW5wdXRfbW9kZWxzKS0+bXVsdGl0b2tlbigpLT5yZXF1aXJlZCgpLCAiTW9kZWxzIHRvIGludGVycG9sYXRlIik7CisgIHBvOjp2YXJpYWJsZXNfbWFwIHZtOworICBwbzo6c3RvcmUocG86OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBvcHRpb25zKSwgdm0pOworICBwbzo6bm90aWZ5KHZtKTsKKworICBzdGQ6OnZlY3RvcjxTdHJpbmdQaWVjZT4gbW9kZWxfbmFtZXM7CisgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpID0gaW5wdXRfbW9kZWxzLmJlZ2luKCk7IGkgIT0gaW5wdXRfbW9kZWxzLmVuZCgpOyArK2kpIHsKKyAgICBtb2RlbF9uYW1lcy5wdXNoX2JhY2soKmkpOworICB9CisgIGxtOjppbnRlcnBvbGF0ZTo6VmVjdG9yIHdlaWdodHM7CisgIGxtOjppbnRlcnBvbGF0ZTo6VHVuZVdlaWdodHModXRpbDo6T3BlblJlYWRPclRocm93KHR1bmluZ19maWxlLmNfc3RyKCkpLCBtb2RlbF9uYW1lcywgd2VpZ2h0cyk7CisgIHN0ZDo6Y291dCA8PCB3ZWlnaHRzLnRyYW5zcG9zZSgpIDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX21hdHJpeC5oaCBiL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS90dW5lX21hdHJpeC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjFhMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3R1bmVfbWF0cml4LmhoCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgTE1fSU5URVJQT0xBVEVfVFVORV9NQVRSSVhfSAorI2RlZmluZSBMTV9JTlRFUlBPTEFURV9UVU5FX01BVFJJWF9ICisKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1sb2NhbC10eXBlZGVmcyIKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKworbmFtZXNwYWNlIGxtIHsgbmFtZXNwYWNlIGludGVycG9sYXRlIHsKKyAKK3R5cGVkZWYgRWlnZW46Ok1hdHJpeFhkIE1hdHJpeDsKK3R5cGVkZWYgRWlnZW46OlZlY3RvclhkIFZlY3RvcjsKKwordHlwZWRlZiBNYXRyaXg6OlNjYWxhciBBY2N1bTsKKworfX0gLy8gbmFtZXNwYWNlcworI2VuZGlmIC8vIExNX0lOVEVSUE9MQVRFX1RVTkVfTUFUUklYX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9pbnRlcnBvbGF0ZS91bml2ZXJzYWxfdm9jYWIuY2MgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdW5pdmVyc2FsX3ZvY2FiLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGY0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdW5pdmVyc2FsX3ZvY2FiLmNjCkBAIC0wLDAgKzEsMTMgQEAKKyNpbmNsdWRlICJsbS9pbnRlcnBvbGF0ZS91bml2ZXJzYWxfdm9jYWIuaGgiCisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgaW50ZXJwb2xhdGUgeworCitVbml2ZXJzYWxWb2NhYjo6VW5pdmVyc2FsVm9jYWIoY29uc3Qgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiYgbW9kZWxfdm9jYWJfc2l6ZXMpIHsKKyAgbW9kZWxfaW5kZXhfbWFwXy5yZXNpemUobW9kZWxfdm9jYWJfc2l6ZXMuc2l6ZSgpKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtb2RlbF92b2NhYl9zaXplcy5zaXplKCk7ICsraSkgeworICAgIG1vZGVsX2luZGV4X21hcF9baV0ucmVzaXplKG1vZGVsX3ZvY2FiX3NpemVzW2ldKTsKKyAgfQorfQorCit9fSAvLyBuYW1lc3BhY2VzCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vaW50ZXJwb2xhdGUvdW5pdmVyc2FsX3ZvY2FiLmhoIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3VuaXZlcnNhbF92b2NhYi5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzIwMjk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2ludGVycG9sYXRlL3VuaXZlcnNhbF92b2NhYi5oaApAQCAtMCwwICsxLDM4IEBACisjaWZuZGVmIExNX0lOVEVSUE9MQVRFX1VOSVZFUlNBTF9WT0NBQl9ICisjZGVmaW5lIExNX0lOVEVSUE9MQVRFX1VOSVZFUlNBTF9WT0NBQl9ICisKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgaW50ZXJwb2xhdGUgeworCitjbGFzcyBVbml2ZXJzYWxWb2NhYiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFVuaXZlcnNhbFZvY2FiKGNvbnN0IHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4mIG1vZGVsX3ZvY2FiX3NpemVzKTsKKworICAvLyBHZXRVbml2ZXJzYWxJbmRleCB0YWtlcyB0aGUgbW9kZWwgbnVtYmVyIGFuZCBpbmRleCBmb3IgdGhlIHNwZWNpZmljCisgIC8vIG1vZGVsIGFuZCByZXR1cm5zIHRoZSB1bml2ZXJzYWwgbW9kZWwgbnVtYmVyCisgIFdvcmRJbmRleCBHZXRVbml2ZXJzYWxJZHgoc3RkOjpzaXplX3QgbW9kZWxfbnVtLCBXb3JkSW5kZXggbW9kZWxfd29yZF9pbmRleCkgY29uc3QgeworICAgIHJldHVybiBtb2RlbF9pbmRleF9tYXBfW21vZGVsX251bV1bbW9kZWxfd29yZF9pbmRleF07CisgIH0KKworICBjb25zdCBXb3JkSW5kZXggKk1hcHBpbmcoc3RkOjpzaXplX3QgbW9kZWwpIGNvbnN0IHsKKyAgICByZXR1cm4gJiptb2RlbF9pbmRleF9tYXBfW21vZGVsXS5iZWdpbigpOworICB9CisKKyAgdm9pZCBJbnNlcnRVbml2ZXJzYWxJZHgoc3RkOjpzaXplX3QgbW9kZWxfbnVtLCBXb3JkSW5kZXggd29yZF9pbmRleCwKKyAgICAgIFdvcmRJbmRleCB1bml2ZXJzYWxfd29yZF9pbmRleCkgeworICAgIG1vZGVsX2luZGV4X21hcF9bbW9kZWxfbnVtXVt3b3JkX2luZGV4XSA9IHVuaXZlcnNhbF93b3JkX2luZGV4OworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gPiBtb2RlbF9pbmRleF9tYXBfOworfTsKKworfSAvLyBuYW1lc3BhY2UgaW50ZXJwb2xhdGUKK30gLy8gbmFtZXNwYWNlIGxtCisKKyNlbmRpZiAvLyBMTV9JTlRFUlBPTEFURV9VTklWRVJTQUxfVk9DQUJfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2tlbmxtX2JlbmNobWFya19tYWluLmNjIGIvc3JjL2tlbmxtL2xtL2tlbmxtX2JlbmNobWFya19tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZWUxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0va2VubG1fYmVuY2htYXJrX21haW4uY2MKQEAgLTAsMCArMSwxNDIgQEAKKyNpbmNsdWRlICJsbS9tb2RlbC5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfc3RyZWFtLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCisjaW5jbHVkZSAidXRpbC91c2FnZS5oaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgeworCit0ZW1wbGF0ZSA8Y2xhc3MgTW9kZWwsIGNsYXNzIFdpZHRoPiB2b2lkIENvbnZlcnRUb0J5dGVzKGNvbnN0IE1vZGVsICZtb2RlbCwgaW50IGZkX2luKSB7CisgIHV0aWw6OkZpbGVQaWVjZSBpbihmZF9pbik7CisgIHV0aWw6OkZpbGVTdHJlYW0gb3V0KDEpOworICBXaWR0aCB3aWR0aDsKKyAgU3RyaW5nUGllY2Ugd29yZDsKKyAgY29uc3QgV2lkdGggZW5kX3NlbnRlbmNlID0gKFdpZHRoKW1vZGVsLkdldFZvY2FidWxhcnkoKS5FbmRTZW50ZW5jZSgpOworICB3aGlsZSAodHJ1ZSkgeworICAgIHdoaWxlIChpbi5SZWFkV29yZFNhbWVMaW5lKHdvcmQpKSB7CisgICAgICB3aWR0aCA9IChXaWR0aCltb2RlbC5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgod29yZCk7CisgICAgICBvdXQud3JpdGUoJndpZHRoLCBzaXplb2YoV2lkdGgpKTsKKyAgICB9CisgICAgaWYgKCFpbi5SZWFkTGluZU9yRU9GKHdvcmQpKSBicmVhazsKKyAgICBvdXQud3JpdGUoJmVuZF9zZW50ZW5jZSwgc2l6ZW9mKFdpZHRoKSk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIE1vZGVsLCBjbGFzcyBXaWR0aD4gdm9pZCBRdWVyeUZyb21CeXRlcyhjb25zdCBNb2RlbCAmbW9kZWwsIGludCBmZF9pbikgeworICBsbTo6bmdyYW06OlN0YXRlIHN0YXRlWzNdOworICBjb25zdCBsbTo6bmdyYW06OlN0YXRlICpjb25zdCBiZWdpbl9zdGF0ZSA9ICZtb2RlbC5CZWdpblNlbnRlbmNlU3RhdGUoKTsKKyAgY29uc3QgbG06Om5ncmFtOjpTdGF0ZSAqbmV4dF9zdGF0ZSA9IGJlZ2luX3N0YXRlOworICBXaWR0aCBrRU9TID0gbW9kZWwuR2V0Vm9jYWJ1bGFyeSgpLkVuZFNlbnRlbmNlKCk7CisgIFdpZHRoIGJ1Zls0MDk2XTsKKworICB1aW50NjRfdCBjb21wbGV0ZWQgPSAwOworICBkb3VibGUgbG9hZGVkID0gdXRpbDo6Q1BVVGltZSgpOworCisgIHN0ZDo6Y291dCA8PCAiQ1BVX3RvX2xvYWQ6ICIgPDwgbG9hZGVkIDw8IHN0ZDo6ZW5kbDsKKworICAvLyBOdW1lcmljYWwgcHJlY2lzaW9uOiBiYXRjaCBzdW1zLgorICBkb3VibGUgdG90YWwgPSAwLjA7CisgIHdoaWxlIChzdGQ6OnNpemVfdCBnb3QgPSB1dGlsOjpSZWFkT3JFT0YoZmRfaW4sIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSB7CisgICAgZmxvYXQgc3VtID0gMC4wOworICAgIFVUSUxfVEhST1dfSUYyKGdvdCAlIHNpemVvZihXaWR0aCksICJGaWxlIHNpemUgbm90IGEgbXVsdGlwbGUgb2Ygdm9jYWIgaWQgc2l6ZSAiIDw8IHNpemVvZihXaWR0aCkpOworICAgIGdvdCAvPSBzaXplb2YoV2lkdGgpOworICAgIGNvbXBsZXRlZCArPSBnb3Q7CisgICAgLy8gRG8gZXZlbiBzdHVmZiBmaXJzdC4KKyAgICBjb25zdCBXaWR0aCAqZXZlbl9lbmQgPSBidWYgKyAoZ290ICYgfjEpOworICAgIC8vIEFsdGVybmF0aW5nIHN0YXRlcworICAgIGNvbnN0IFdpZHRoICppOworICAgIGZvciAoaSA9IGJ1ZjsgaSAhPSBldmVuX2VuZDspIHsKKyAgICAgIHN1bSArPSBtb2RlbC5GdWxsU2NvcmUoKm5leHRfc3RhdGUsICppLCBzdGF0ZVsxXSkucHJvYjsKKyAgICAgIG5leHRfc3RhdGUgPSAoKmkrKyA9PSBrRU9TKSA/IGJlZ2luX3N0YXRlIDogJnN0YXRlWzFdOworICAgICAgc3VtICs9IG1vZGVsLkZ1bGxTY29yZSgqbmV4dF9zdGF0ZSwgKmksIHN0YXRlWzBdKS5wcm9iOworICAgICAgbmV4dF9zdGF0ZSA9ICgqaSsrID09IGtFT1MpID8gYmVnaW5fc3RhdGUgOiAmc3RhdGVbMF07CisgICAgfQorICAgIC8vIE9kZCBjb3JuZXIgY2FzZS4KKyAgICBpZiAoZ290ICYgMSkgeworICAgICAgc3VtICs9IG1vZGVsLkZ1bGxTY29yZSgqbmV4dF9zdGF0ZSwgKmksIHN0YXRlWzJdKS5wcm9iOworICAgICAgbmV4dF9zdGF0ZSA9ICgqaSsrID09IGtFT1MpID8gYmVnaW5fc3RhdGUgOiAmc3RhdGVbMl07CisgICAgfQorICAgIHRvdGFsICs9IHN1bTsKKyAgfQorICBkb3VibGUgYWZ0ZXIgPSB1dGlsOjpDUFVUaW1lKCk7CisgIHN0ZDo6Y2VyciA8PCAiUHJvYmFiaWxpdHkgc3VtIGlzICIgPDwgdG90YWwgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIlF1ZXJpZXM6ICIgPDwgY29tcGxldGVkIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJDUFVfZXhjbHVkaW5nX2xvYWQ6ICIgPDwgKGFmdGVyIC0gbG9hZGVkKSA8PCAiXG5DUFVfcGVyX3F1ZXJ5OiAiIDw8ICgoYWZ0ZXIgLSBsb2FkZWQpIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihjb21wbGV0ZWQpKSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiUlNTTWF4OiAiIDw8IHV0aWw6OlJTU01heCgpIDw8IHN0ZDo6ZW5kbDsKK30KKwordGVtcGxhdGUgPGNsYXNzIE1vZGVsLCBjbGFzcyBXaWR0aD4gdm9pZCBEaXNwYXRjaEZ1bmN0aW9uKGNvbnN0IE1vZGVsICZtb2RlbCwgYm9vbCBxdWVyeSkgeworICBpZiAocXVlcnkpIHsKKyAgICBRdWVyeUZyb21CeXRlczxNb2RlbCwgV2lkdGg+KG1vZGVsLCAwKTsKKyAgfSBlbHNlIHsKKyAgICBDb252ZXJ0VG9CeXRlczxNb2RlbCwgV2lkdGg+KG1vZGVsLCAwKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTW9kZWw+IHZvaWQgRGlzcGF0Y2hXaWR0aChjb25zdCBjaGFyICpmaWxlLCBib29sIHF1ZXJ5KSB7CisgIGxtOjpuZ3JhbTo6Q29uZmlnIGNvbmZpZzsKKyAgY29uZmlnLmxvYWRfbWV0aG9kID0gdXRpbDo6UkVBRDsKKyAgc3RkOjpjZXJyIDw8ICJVc2luZyBsb2FkX21ldGhvZCA9IFJFQUQuIiA8PCBzdGQ6OmVuZGw7CisgIE1vZGVsIG1vZGVsKGZpbGUsIGNvbmZpZyk7CisgIGxtOjpXb3JkSW5kZXggYm91bmQgPSBtb2RlbC5HZXRWb2NhYnVsYXJ5KCkuQm91bmQoKTsKKyAgaWYgKGJvdW5kIDw9IDI1NikgeworICAgIERpc3BhdGNoRnVuY3Rpb248TW9kZWwsIHVpbnQ4X3Q+KG1vZGVsLCBxdWVyeSk7CisgIH0gZWxzZSBpZiAoYm91bmQgPD0gNjU1MzYpIHsKKyAgICBEaXNwYXRjaEZ1bmN0aW9uPE1vZGVsLCB1aW50MTZfdD4obW9kZWwsIHF1ZXJ5KTsKKyAgfSBlbHNlIGlmIChib3VuZCA8PSAoMVVMTCA8PCAzMikpIHsKKyAgICBEaXNwYXRjaEZ1bmN0aW9uPE1vZGVsLCB1aW50MzJfdD4obW9kZWwsIHF1ZXJ5KTsKKyAgfSBlbHNlIHsKKyAgICBEaXNwYXRjaEZ1bmN0aW9uPE1vZGVsLCB1aW50NjRfdD4obW9kZWwsIHF1ZXJ5KTsKKyAgfQorfQorCit2b2lkIERpc3BhdGNoKGNvbnN0IGNoYXIgKmZpbGUsIGJvb2wgcXVlcnkpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGxtOjpuZ3JhbTsKKyAgbG06Om5ncmFtOjpNb2RlbFR5cGUgbW9kZWxfdHlwZTsKKyAgaWYgKGxtOjpuZ3JhbTo6UmVjb2duaXplQmluYXJ5KGZpbGUsIG1vZGVsX3R5cGUpKSB7CisgICAgc3dpdGNoKG1vZGVsX3R5cGUpIHsKKyAgICAgIGNhc2UgUFJPQklORzoKKyAgICAgICAgRGlzcGF0Y2hXaWR0aDxsbTo6bmdyYW06OlByb2JpbmdNb2RlbD4oZmlsZSwgcXVlcnkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUkVTVF9QUk9CSU5HOgorICAgICAgICBEaXNwYXRjaFdpZHRoPGxtOjpuZ3JhbTo6UmVzdFByb2JpbmdNb2RlbD4oZmlsZSwgcXVlcnkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVFJJRToKKyAgICAgICAgRGlzcGF0Y2hXaWR0aDxsbTo6bmdyYW06OlRyaWVNb2RlbD4oZmlsZSwgcXVlcnkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUVVBTlRfVFJJRToKKyAgICAgICAgRGlzcGF0Y2hXaWR0aDxsbTo6bmdyYW06OlF1YW50VHJpZU1vZGVsPihmaWxlLCBxdWVyeSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBUlJBWV9UUklFOgorICAgICAgICBEaXNwYXRjaFdpZHRoPGxtOjpuZ3JhbTo6QXJyYXlUcmllTW9kZWw+KGZpbGUsIHF1ZXJ5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFFVQU5UX0FSUkFZX1RSSUU6CisgICAgICAgIERpc3BhdGNoV2lkdGg8bG06Om5ncmFtOjpRdWFudEFycmF5VHJpZU1vZGVsPihmaWxlLCBxdWVyeSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgVVRJTF9USFJPVyh1dGlsOjpFeGNlcHRpb24sICJVbnJlY29nbml6ZWQga2VubG0gbW9kZWwgdHlwZSAiIDw8IG1vZGVsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBVVElMX1RIUk9XKHV0aWw6OkV4Y2VwdGlvbiwgIkJpbmFyaXplIGJlZm9yZSBydW5uaW5nIGJlbmNobWFya3MuIik7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBpZiAoYXJnYyAhPSAzIHx8IChzdHJjbXAoYXJndlsxXSwgInZvY2FiIikgJiYgc3RyY21wKGFyZ3ZbMV0sICJxdWVyeSIpKSkgeworICAgIHN0ZDo6Y2VycgorICAgICAgPDwgIkJlbmNobWFyayBwcm9ncmFtIGZvciBLZW5MTS4gIEludGVuZGVkIHVzYWdlOlxuIgorICAgICAgPDwgIiNDb252ZXJ0IHRleHQgdG8gdm9jYWJ1bGFyeSBpZHMgb2ZmbGluZS4gIFRoZXNlIGlkcyBhcmUgdGllZCB0byBhIG1vZGVsLlxuIgorICAgICAgPDwgYXJndlswXSA8PCAiIHZvY2FiICRtb2RlbCA8JHRleHQgPiR0ZXh0LnZvY2FiXG4iCisgICAgICA8PCAiI0Vuc3VyZSBmaWxlcyBhcmUgaW4gUkFNLlxuIgorICAgICAgPDwgImNhdCAkdGV4dC52b2NhYiAkbW9kZWwgPi9kZXYvbnVsbFxuIgorICAgICAgPDwgIiNUaW1lZCBxdWVyeSBhZ2FpbnN0IHRoZSBtb2RlbC5cbiIKKyAgICAgIDw8IGFyZ3ZbMF0gPDwgIiBxdWVyeSAkbW9kZWwgPCR0ZXh0LnZvY2FiXG4iOworICAgIHJldHVybiAxOworICB9CisgIERpc3BhdGNoKGFyZ3ZbMl0sICFzdHJjbXAoYXJndlsxXSwgInF1ZXJ5IikpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9sZWZ0LmhoIGIvc3JjL2tlbmxtL2xtL2xlZnQuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0OTY4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9sZWZ0LmhoCkBAIC0wLDAgKzEsMjE2IEBACisvKiBFZmZpY2llbnQgbGVmdCBhbmQgcmlnaHQgbGFuZ3VhZ2UgbW9kZWwgc3RhdGUgZm9yIHNlbnRlbmNlIGZyYWdtZW50cy4KKyAqIEludGVuZGVkIHVzYWdlOgorICogU3RvcmUgQ2hhcnRTdGF0ZSB3aXRoIGV2ZXJ5IGNoYXJ0IGVudHJ5LgorICogVG8gZG8gYSBydWxlIGFwcGxpY2F0aW9uOgorICogMS4gTWFrZSBhIENoYXJ0U3RhdGUgb2JqZWN0IGZvciB5b3VyIG5ldyBlbnRyeS4KKyAqIDIuIENvbnN0cnVjdCBSdWxlU2NvcmUuCisgKiAzLiBHb2luZyBmcm9tIGxlZnQgdG8gcmlnaHQsIGNhbGwgVGVybWluYWwgb3IgTm9uVGVybWluYWwuCisgKiAgIEZvciB0ZXJtaW5hbHMsIGp1c3QgcGFzcyB0aGUgdm9jYWIgaWQuCisgKiAgIEZvciBub24tdGVybWluYWxzLCBwYXNzIHRoYXQgbm9uLXRlcm1pbmFsJ3MgQ2hhcnRTdGF0ZS4KKyAqICAgICBJZiB5b3VyIGRlY29kZXIgZXhwZWN0cyBzY29yZXMgaW5jbHVzaXZlIG9mIHN1YnRyZWUgc2NvcmVzIChpLmUuIHlvdQorICogICAgIGxhYmVsIGVudHJpZXMgd2l0aCB0aGUgaGlnaGVzdC1zY29yaW5nIHBhdGgpLCBwYXNzIHRoZSBub24tdGVybWluYWwncworICogICAgIHNjb3JlIGFzIHByb2IuCisgKiAgICAgSWYgeW91ciBkZWNvZGVyIGV4cGVjdHMgcmVsYXRpdmUgc2NvcmVzIGFuZCB3aWxsIHdhbGsgdGhlIGNoYXJ0IGxhdGVyLAorICogICAgIHBhc3MgcHJvYiA9IDAuMC4KKyAqICAgICBJbiBvdGhlciB3b3JkcywgdGhlIG9ubHkgZWZmZWN0IG9mIHByb2IgaXMgdGhhdCBpdCBnZXRzIGFkZGVkIHRvIHRoZQorICogICAgIHJldHVybmVkIGxvZyBwcm9iYWJpbGl0eS4KKyAqIDQuIENhbGwgRmluaXNoLiAgSXQgcmV0dXJucyB0aGUgbG9nIHByb2JhYmlsaXR5LgorICoKKyAqIFRoZXJlJ3MgYSBjb3VwbGUgbW9yZSBkZXRhaWxzOgorICogRG8gbm90IHBhc3MgPHM+IHRvIFRlcm1pbmFsIGFzIGl0IGlzIGZvcm1hbGx5IG5vdCBhIHdvcmQgaW4gdGhlIHNlbnRlbmNlLAorICogb25seSBjb250ZXh0LiAgSW5zdGVhZCwgY2FsbCBCZWdpblNlbnRlbmNlLiAgSWYgY2FsbGVkLCBpdCBzaG91bGQgYmUgdGhlCisgKiBmaXJzdCBjYWxsIGFmdGVyIFJ1bGVTY29yZSBpcyBjb25zdHJ1Y3RlZCAoc2luY2UgPHM+IGlzIGFsd2F5cyB0aGUKKyAqIGxlZnRtb3N0KS4KKyAqCisgKiBJZiB0aGUgbGVmdG1vc3QgUkhTIGlzIGEgbm9uLXRlcm1pbmFsLCBpdCdzIGZhc3RlciB0byBjYWxsIEJlZ2luTm9uVGVybWluYWwuCisgKgorICogSGFzaGluZyBhbmQgc29ydGluZyBjb21wYXJpc29uIG9wZXJhdG9ycyBhcmUgcHJvdmlkZWQuICAgQWxsIHN0YXRlIG9iamVjdHMKKyAqIGFyZSBQT0QuICBJZiB5b3UgaW50ZW5kIHRvIHVzZSBtZW1jbXAgb24gcmF3IHN0YXRlIG9iamVjdHMsIHlvdSBtdXN0IGNhbGwKKyAqIFplcm9SZW1haW5pbmcgZmlyc3QsIGFzIHRoZSB2YWx1ZSBvZiBhcnJheSBlbnRyaWVzIGJleW9uZCBsZW5ndGggaXMKKyAqIG90aGVyd2lzZSB1bmRlZmluZWQuCisgKgorICogVXNhZ2UgaXMgb2YgY291cnNlIG5vdCBsaW1pdGVkIHRvIGNoYXJ0IGRlY29kaW5nLiAgQW55dGhpbmcgdGhhdCBnZW5lcmF0ZXMKKyAqIHNlbnRlbmNlIGZyYWdtZW50cyBtaXNzaW5nIGxlZnQgY29udGV4dCBjb3VsZCBiZW5lZml0LiAgRm9yIGV4YW1wbGUsIGEKKyAqIHBocmFzZS1iYXNlZCBkZWNvZGVyIGNvdWxkIHByZS1zY29yZSBwaHJhc2VzLCBzdG9yaW5nIENoYXJ0U3RhdGUgd2l0aCBlYWNoCisgKiBwaHJhc2UsIGV2ZW4gaWYgaHlwb3RoZXNlcyBhcmUgZ2VuZXJhdGVkIGxlZnQtdG8tcmlnaHQuCisgKi8KKworI2lmbmRlZiBMTV9MRUZUX0gKKyNkZWZpbmUgTE1fTEVGVF9ICisKKyNpbmNsdWRlICJsbS9tYXhfb3JkZXIuaGgiCisjaW5jbHVkZSAibG0vc3RhdGUuaGgiCisjaW5jbHVkZSAibG0vcmV0dXJuLmhoIgorCisjaW5jbHVkZSAidXRpbC9tdXJtdXJfaGFzaC5oaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBuZ3JhbSB7CisKK3RlbXBsYXRlIDxjbGFzcyBNPiBjbGFzcyBSdWxlU2NvcmUgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgUnVsZVNjb3JlKGNvbnN0IE0gJm1vZGVsLCBDaGFydFN0YXRlICZvdXQpIDogbW9kZWxfKG1vZGVsKSwgb3V0Xygmb3V0KSwgbGVmdF9kb25lXyhmYWxzZSksIHByb2JfKDAuMCkgeworICAgICAgb3V0LmxlZnQubGVuZ3RoID0gMDsKKyAgICAgIG91dC5yaWdodC5sZW5ndGggPSAwOworICAgIH0KKworICAgIHZvaWQgQmVnaW5TZW50ZW5jZSgpIHsKKyAgICAgIG91dF8tPnJpZ2h0ID0gbW9kZWxfLkJlZ2luU2VudGVuY2VTdGF0ZSgpOworICAgICAgLy8gb3V0Xy0+bGVmdCBpcyBlbXB0eS4KKyAgICAgIGxlZnRfZG9uZV8gPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgVGVybWluYWwoV29yZEluZGV4IHdvcmQpIHsKKyAgICAgIFN0YXRlIGNvcHkob3V0Xy0+cmlnaHQpOworICAgICAgRnVsbFNjb3JlUmV0dXJuIHJldChtb2RlbF8uRnVsbFNjb3JlKGNvcHksIHdvcmQsIG91dF8tPnJpZ2h0KSk7CisgICAgICBpZiAobGVmdF9kb25lXykgeyBwcm9iXyArPSByZXQucHJvYjsgcmV0dXJuOyB9CisgICAgICBpZiAocmV0LmluZGVwZW5kZW50X2xlZnQpIHsKKyAgICAgICAgcHJvYl8gKz0gcmV0LnByb2I7CisgICAgICAgIGxlZnRfZG9uZV8gPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBvdXRfLT5sZWZ0LnBvaW50ZXJzW291dF8tPmxlZnQubGVuZ3RoKytdID0gcmV0LmV4dGVuZF9sZWZ0OworICAgICAgcHJvYl8gKz0gcmV0LnJlc3Q7CisgICAgICBpZiAob3V0Xy0+cmlnaHQubGVuZ3RoICE9IGNvcHkubGVuZ3RoICsgMSkKKyAgICAgICAgbGVmdF9kb25lXyA9IHRydWU7CisgICAgfQorCisgICAgLy8gRmFzdGVyIHZlcnNpb24gb2YgTm9uVGVybWluYWwgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBydWxlIGJlZ2lucyB3aXRoIGEgbm9uLXRlcm1pbmFsLgorICAgIHZvaWQgQmVnaW5Ob25UZXJtaW5hbChjb25zdCBDaGFydFN0YXRlICZpbiwgZmxvYXQgcHJvYiA9IDAuMCkgeworICAgICAgcHJvYl8gPSBwcm9iOworICAgICAgKm91dF8gPSBpbjsKKyAgICAgIGxlZnRfZG9uZV8gPSBpbi5sZWZ0LmZ1bGw7CisgICAgfQorCisgICAgdm9pZCBOb25UZXJtaW5hbChjb25zdCBDaGFydFN0YXRlICZpbiwgZmxvYXQgcHJvYiA9IDAuMCkgeworICAgICAgcHJvYl8gKz0gcHJvYjsKKworICAgICAgaWYgKCFpbi5sZWZ0Lmxlbmd0aCkgeworICAgICAgICBpZiAoaW4ubGVmdC5mdWxsKSB7CisgICAgICAgICAgZm9yIChjb25zdCBmbG9hdCAqaSA9IG91dF8tPnJpZ2h0LmJhY2tvZmY7IGkgPCBvdXRfLT5yaWdodC5iYWNrb2ZmICsgb3V0Xy0+cmlnaHQubGVuZ3RoOyArK2kpIHByb2JfICs9ICppOworICAgICAgICAgIGxlZnRfZG9uZV8gPSB0cnVlOworICAgICAgICAgIG91dF8tPnJpZ2h0ID0gaW4ucmlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoIW91dF8tPnJpZ2h0Lmxlbmd0aCkgeworICAgICAgICBvdXRfLT5yaWdodCA9IGluLnJpZ2h0OworICAgICAgICBpZiAobGVmdF9kb25lXykgeworICAgICAgICAgIHByb2JfICs9IG1vZGVsXy5VblJlc3QoaW4ubGVmdC5wb2ludGVycywgaW4ubGVmdC5wb2ludGVycyArIGluLmxlZnQubGVuZ3RoLCAxKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dF8tPmxlZnQubGVuZ3RoKSB7CisgICAgICAgICAgbGVmdF9kb25lXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0Xy0+bGVmdCA9IGluLmxlZnQ7CisgICAgICAgICAgbGVmdF9kb25lXyA9IGluLmxlZnQuZnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGZsb2F0IGJhY2tvZmZzW0tFTkxNX01BWF9PUkRFUiAtIDFdLCBiYWNrb2ZmczJbS0VOTE1fTUFYX09SREVSIC0gMV07CisgICAgICBmbG9hdCAqYmFjayA9IGJhY2tvZmZzLCAqYmFjazIgPSBiYWNrb2ZmczI7CisgICAgICB1bnNpZ25lZCBjaGFyIG5leHRfdXNlID0gb3V0Xy0+cmlnaHQubGVuZ3RoOworCisgICAgICAvLyBGaXJzdCB3b3JkCisgICAgICBpZiAoRXh0ZW5kTGVmdChpbiwgbmV4dF91c2UsIDEsIG91dF8tPnJpZ2h0LmJhY2tvZmYsIGJhY2spKSByZXR1cm47CisKKyAgICAgIC8vIFdvcmRzIGFmdGVyIHRoZSBmaXJzdCwgc28gZXh0ZW5kaW5nIGEgYmlncmFtIHRvIGJlZ2luIHdpdGgKKyAgICAgIGZvciAodW5zaWduZWQgY2hhciBleHRlbmRfbGVuZ3RoID0gMjsgZXh0ZW5kX2xlbmd0aCA8PSBpbi5sZWZ0Lmxlbmd0aDsgKytleHRlbmRfbGVuZ3RoKSB7CisgICAgICAgIGlmIChFeHRlbmRMZWZ0KGluLCBuZXh0X3VzZSwgZXh0ZW5kX2xlbmd0aCwgYmFjaywgYmFjazIpKSByZXR1cm47CisgICAgICAgIHN0ZDo6c3dhcChiYWNrLCBiYWNrMik7CisgICAgICB9CisKKyAgICAgIGlmIChpbi5sZWZ0LmZ1bGwpIHsKKyAgICAgICAgZm9yIChjb25zdCBmbG9hdCAqaSA9IGJhY2s7IGkgIT0gYmFjayArIG5leHRfdXNlOyArK2kpIHByb2JfICs9ICppOworICAgICAgICBsZWZ0X2RvbmVfID0gdHJ1ZTsKKyAgICAgICAgb3V0Xy0+cmlnaHQgPSBpbi5yaWdodDsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyBSaWdodCBzdGF0ZSB3YXMgbWluaW1pemVkLCBzbyBpdCdzIGFscmVhZHkgaW5kZXBlbmRlbnQgb2YgdGhlIG5ldyB3b3JkcyB0byB0aGUgbGVmdC4KKyAgICAgIGlmIChpbi5yaWdodC5sZW5ndGggPCBpbi5sZWZ0Lmxlbmd0aCkgeworICAgICAgICBvdXRfLT5yaWdodCA9IGluLnJpZ2h0OworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8vIFNoaWZ0IGV4aXNpdGluZyB3b3JkcyBkb3duLgorICAgICAgZm9yIChXb3JkSW5kZXggKmkgPSBvdXRfLT5yaWdodC53b3JkcyArIG5leHRfdXNlIC0gMTsgaSA+PSBvdXRfLT5yaWdodC53b3JkczsgLS1pKSB7CisgICAgICAgICooaSArIGluLnJpZ2h0Lmxlbmd0aCkgPSAqaTsKKyAgICAgIH0KKyAgICAgIC8vIEFkZCB3b3JkcyBmcm9tIGluLnJpZ2h0LgorICAgICAgc3RkOjpjb3B5KGluLnJpZ2h0LndvcmRzLCBpbi5yaWdodC53b3JkcyArIGluLnJpZ2h0Lmxlbmd0aCwgb3V0Xy0+cmlnaHQud29yZHMpOworICAgICAgLy8gQXNzZW1ibGUgYmFja29mZiBjb21wb3NlZCBvbiB0aGUgZXhpc3Rpbmcgc3RhdGUncyBiYWNrb2ZmIGZvbGxvd2VkIGJ5IHRoZSBuZXcgc3RhdGUncyBiYWNrb2ZmLgorICAgICAgc3RkOjpjb3B5KGluLnJpZ2h0LmJhY2tvZmYsIGluLnJpZ2h0LmJhY2tvZmYgKyBpbi5yaWdodC5sZW5ndGgsIG91dF8tPnJpZ2h0LmJhY2tvZmYpOworICAgICAgc3RkOjpjb3B5KGJhY2ssIGJhY2sgKyBuZXh0X3VzZSwgb3V0Xy0+cmlnaHQuYmFja29mZiArIGluLnJpZ2h0Lmxlbmd0aCk7CisgICAgICBvdXRfLT5yaWdodC5sZW5ndGggPSBpbi5yaWdodC5sZW5ndGggKyBuZXh0X3VzZTsKKyAgICB9CisKKyAgICBmbG9hdCBGaW5pc2goKSB7CisgICAgICAvLyBBIE4tMS1ncmFtIG1pZ2h0IGV4dGVuZCBsZWZ0IGFuZCByaWdodCBidXQgd2Ugc2hvdWxkIHN0aWxsIHNldCBmdWxsIHRvIHRydWUgYmVjYXVzZSBpdCdzIGFuIE4tMS1ncmFtLgorICAgICAgb3V0Xy0+bGVmdC5mdWxsID0gbGVmdF9kb25lXyB8fCAob3V0Xy0+bGVmdC5sZW5ndGggPT0gbW9kZWxfLk9yZGVyKCkgLSAxKTsKKyAgICAgIHJldHVybiBwcm9iXzsKKyAgICB9CisKKyAgICB2b2lkIFJlc2V0KCkgeworICAgICAgcHJvYl8gPSAwLjA7CisgICAgICBsZWZ0X2RvbmVfID0gZmFsc2U7CisgICAgICBvdXRfLT5sZWZ0Lmxlbmd0aCA9IDA7CisgICAgICBvdXRfLT5yaWdodC5sZW5ndGggPSAwOworICAgIH0KKyAgICB2b2lkIFJlc2V0KENoYXJ0U3RhdGUgJnJlcGxhY2VtZW50KSB7CisgICAgICBvdXRfID0gJnJlcGxhY2VtZW50OworICAgICAgUmVzZXQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIEV4dGVuZExlZnQoY29uc3QgQ2hhcnRTdGF0ZSAmaW4sIHVuc2lnbmVkIGNoYXIgJm5leHRfdXNlLCB1bnNpZ25lZCBjaGFyIGV4dGVuZF9sZW5ndGgsIGNvbnN0IGZsb2F0ICpiYWNrX2luLCBmbG9hdCAqYmFja19vdXQpIHsKKyAgICAgIFByb2Nlc3NSZXQobW9kZWxfLkV4dGVuZExlZnQoCisgICAgICAgICAgICBvdXRfLT5yaWdodC53b3Jkcywgb3V0Xy0+cmlnaHQud29yZHMgKyBuZXh0X3VzZSwgLy8gV29yZHMgdG8gZXh0ZW5kIGludG8KKyAgICAgICAgICAgIGJhY2tfaW4sIC8vIEJhY2tvZmZzIHRvIHVzZQorICAgICAgICAgICAgaW4ubGVmdC5wb2ludGVyc1tleHRlbmRfbGVuZ3RoIC0gMV0sIGV4dGVuZF9sZW5ndGgsIC8vIFdvcmRzIHRvIGJlIGV4dGVuZGVkCisgICAgICAgICAgICBiYWNrX291dCwgLy8gQmFja29mZnMgZm9yIHRoZSBuZXh0IHNjb3JlCisgICAgICAgICAgICBuZXh0X3VzZSkpOyAvLyBMZW5ndGggb2Ygbi1ncmFtIHRvIHVzZSBpbiBuZXh0IHNjb3JpbmcuCisgICAgICBpZiAobmV4dF91c2UgIT0gb3V0Xy0+cmlnaHQubGVuZ3RoKSB7CisgICAgICAgIGxlZnRfZG9uZV8gPSB0cnVlOworICAgICAgICBpZiAoIW5leHRfdXNlKSB7CisgICAgICAgICAgLy8gRWFybHkgZXhpdC4KKyAgICAgICAgICBvdXRfLT5yaWdodCA9IGluLnJpZ2h0OworICAgICAgICAgIHByb2JfICs9IG1vZGVsXy5VblJlc3QoaW4ubGVmdC5wb2ludGVycyArIGV4dGVuZF9sZW5ndGgsIGluLmxlZnQucG9pbnRlcnMgKyBpbi5sZWZ0Lmxlbmd0aCwgZXh0ZW5kX2xlbmd0aCArIDEpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBDb250aW51ZSBzY29yaW5nLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgUHJvY2Vzc1JldChjb25zdCBGdWxsU2NvcmVSZXR1cm4gJnJldCkgeworICAgICAgaWYgKGxlZnRfZG9uZV8pIHsKKyAgICAgICAgcHJvYl8gKz0gcmV0LnByb2I7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChyZXQuaW5kZXBlbmRlbnRfbGVmdCkgeworICAgICAgICBwcm9iXyArPSByZXQucHJvYjsKKyAgICAgICAgbGVmdF9kb25lXyA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG91dF8tPmxlZnQucG9pbnRlcnNbb3V0Xy0+bGVmdC5sZW5ndGgrK10gPSByZXQuZXh0ZW5kX2xlZnQ7CisgICAgICBwcm9iXyArPSByZXQucmVzdDsKKyAgICB9CisKKyAgICBjb25zdCBNICZtb2RlbF87CisKKyAgICBDaGFydFN0YXRlICpvdXRfOworCisgICAgYm9vbCBsZWZ0X2RvbmVfOworCisgICAgZmxvYXQgcHJvYl87Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZ3JhbQorfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX0xFRlRfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL2xlZnRfdGVzdC5jYyBiL3NyYy9rZW5sbS9sbS9sZWZ0X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiNjQxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9sZWZ0X3Rlc3QuY2MKQEAgLTAsMCArMSwzOTcgQEAKKyNpbmNsdWRlICJsbS9sZWZ0LmhoIgorI2luY2x1ZGUgImxtL21vZGVsLmhoIgorCisjaW5jbHVkZSAidXRpbC90b2tlbml6ZV9waWVjZS5oaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBMZWZ0VGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L2Zsb2F0aW5nX3BvaW50X2NvbXBhcmlzb24uaHBwPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKK25hbWVzcGFjZSB7CisKKyNkZWZpbmUgVGVybSh3b3JkKSBzY29yZS5UZXJtaW5hbChtLkdldFZvY2FidWxhcnkoKS5JbmRleCh3b3JkKSk7CisjZGVmaW5lIFZDaGVjayh3b3JkLCB2YWx1ZSkgQk9PU1RfQ0hFQ0tfRVFVQUwobS5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgod29yZCksIHZhbHVlKTsKKworLy8gQXBwYXJlbnRseSBzb21lIEJvb3N0IHZlcnNpb25zIHVzZSB0ZW1wbGF0ZXMgYW5kIGFyZSBwcmV0dHkgc3RyaWN0IGFib3V0IHR5cGVzIG1hdGNoaW5nLgorI2RlZmluZSBTTE9QUFlfQ0hFQ0tfQ0xPU0UocmVmLCB2YWx1ZSwgdG9sKSBCT09TVF9DSEVDS19DTE9TRShzdGF0aWNfY2FzdDxkb3VibGU+KHJlZiksIHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpLCBzdGF0aWNfY2FzdDxkb3VibGU+KHRvbCkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgTT4gdm9pZCBTaG9ydChjb25zdCBNICZtKSB7CisgIENoYXJ0U3RhdGUgYmFzZTsKKyAgeworICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBiYXNlKTsKKyAgICBUZXJtKCJtb3JlIik7CisgICAgVGVybSgibG9pbiIpOworICAgIFNMT1BQWV9DSEVDS19DTE9TRSgtMS4yMDYzMTkgLSAwLjM1NjE2NjUsIHNjb3JlLkZpbmlzaCgpLCAwLjAwMSk7CisgIH0KKyAgQk9PU1RfQ0hFQ0soYmFzZS5sZWZ0LmZ1bGwpOworICBCT09TVF9DSEVDS19FUVVBTCgyLCBiYXNlLmxlZnQubGVuZ3RoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgYmFzZS5yaWdodC5sZW5ndGgpOworICBWQ2hlY2soImxvaW4iLCBiYXNlLnJpZ2h0LndvcmRzWzBdKTsKKworICBDaGFydFN0YXRlIG1vcmVfbGVmdDsKKyAgeworICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBtb3JlX2xlZnQpOworICAgIFRlcm0oImxpdHRsZSIpOworICAgIHNjb3JlLk5vblRlcm1pbmFsKGJhc2UsIC0xLjIwNjMxOSAtIDAuMzU2MTY2NSk7CisgICAgLy8gcChsaXR0bGUgbW9yZSBsb2luIHwgbnVsbCBjb250ZXh0KQorICAgIFNMT1BQWV9DSEVDS19DTE9TRSgtMS41NjUzOCwgc2NvcmUuRmluaXNoKCksIDAuMDAxKTsKKyAgfQorICBCT09TVF9DSEVDS19FUVVBTCgzLCBtb3JlX2xlZnQubGVmdC5sZW5ndGgpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBtb3JlX2xlZnQucmlnaHQubGVuZ3RoKTsKKyAgVkNoZWNrKCJsb2luIiwgbW9yZV9sZWZ0LnJpZ2h0LndvcmRzWzBdKTsKKyAgQk9PU1RfQ0hFQ0sobW9yZV9sZWZ0LmxlZnQuZnVsbCk7CisKKyAgQ2hhcnRTdGF0ZSBzaG9ydGVyOworICB7CisgICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIHNob3J0ZXIpOworICAgIFRlcm0oInRvIik7CisgICAgc2NvcmUuTm9uVGVybWluYWwoYmFzZSwgLTEuMjA2MzE5IC0gMC4zNTYxNjY1KTsKKyAgICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTAuMzAxMDMgLSAxLjY4Nzg3MiAtIDEuMjA2MzE5IC0gMC4zNTYxNjY1LCBzY29yZS5GaW5pc2goKSwgMC4wMSk7CisgIH0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgc2hvcnRlci5sZWZ0Lmxlbmd0aCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDEsIHNob3J0ZXIucmlnaHQubGVuZ3RoKTsKKyAgVkNoZWNrKCJsb2luIiwgc2hvcnRlci5yaWdodC53b3Jkc1swXSk7CisgIEJPT1NUX0NIRUNLKHNob3J0ZXIubGVmdC5mdWxsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgQ2hhcmdlKGNvbnN0IE0gJm0pIHsKKyAgQ2hhcnRTdGF0ZSBiYXNlOworICB7CisgICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGJhc2UpOworICAgIFRlcm0oIm9uIik7CisgICAgVGVybSgibW9yZSIpOworICAgIFNMT1BQWV9DSEVDS19DTE9TRSgtMS41MDk1NTkgLTAuNDc3MTIxMiAtMS4yMDYzMTksIHNjb3JlLkZpbmlzaCgpLCAwLjAwMSk7CisgIH0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgYmFzZS5sZWZ0Lmxlbmd0aCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDEsIGJhc2UucmlnaHQubGVuZ3RoKTsKKyAgVkNoZWNrKCJtb3JlIiwgYmFzZS5yaWdodC53b3Jkc1swXSk7CisgIEJPT1NUX0NIRUNLKGJhc2UubGVmdC5mdWxsKTsKKworICBDaGFydFN0YXRlIGV4dGVuZDsKKyAgeworICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBleHRlbmQpOworICAgIFRlcm0oImxvb2tpbmciKTsKKyAgICBzY29yZS5Ob25UZXJtaW5hbChiYXNlLCAtMS41MDk1NTkgLTAuNDc3MTIxMiAtMS4yMDYzMTkpOworICAgIFNMT1BQWV9DSEVDS19DTE9TRSgtMy45MTAzOSwgc2NvcmUuRmluaXNoKCksIDAuMDAxKTsKKyAgfQorICBCT09TVF9DSEVDS19FUVVBTCgyLCBleHRlbmQubGVmdC5sZW5ndGgpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBleHRlbmQucmlnaHQubGVuZ3RoKTsKKyAgVkNoZWNrKCJtb3JlIiwgZXh0ZW5kLnJpZ2h0LndvcmRzWzBdKTsKKyAgQk9PU1RfQ0hFQ0soZXh0ZW5kLmxlZnQuZnVsbCk7CisKKyAgQ2hhcnRTdGF0ZSB0b2JvczsKKyAgeworICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCB0b2Jvcyk7CisgICAgc2NvcmUuQmVnaW5TZW50ZW5jZSgpOworICAgIHNjb3JlLk5vblRlcm1pbmFsKGV4dGVuZCwgLTMuOTEwMzkpOworICAgIFNMT1BQWV9DSEVDS19DTE9TRSgtMy40NzExNjksIHNjb3JlLkZpbmlzaCgpLCAwLjAwMSk7CisgIH0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgdG9ib3MubGVmdC5sZW5ndGgpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCB0b2Jvcy5yaWdodC5sZW5ndGgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTT4gZmxvYXQgTGVmdFRvUmlnaHQoY29uc3QgTSAmbSwgY29uc3Qgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiAmd29yZHMsIGJvb2wgYmVnaW5fc2VudGVuY2UgPSBmYWxzZSkgeworICBmbG9hdCByZXQgPSAwLjA7CisgIFN0YXRlIHJpZ2h0ID0gYmVnaW5fc2VudGVuY2UgPyBtLkJlZ2luU2VudGVuY2VTdGF0ZSgpIDogbS5OdWxsQ29udGV4dFN0YXRlKCk7CisgIGZvciAoc3RkOjp2ZWN0b3I8V29yZEluZGV4Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IHdvcmRzLmJlZ2luKCk7IGkgIT0gd29yZHMuZW5kKCk7ICsraSkgeworICAgIFN0YXRlIGNvcHkocmlnaHQpOworICAgIHJldCArPSBtLlNjb3JlKGNvcHksICppLCByaWdodCk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGUgPGNsYXNzIE0+IGZsb2F0IFJpZ2h0VG9MZWZ0KGNvbnN0IE0gJm0sIGNvbnN0IHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gJndvcmRzLCBib29sIGJlZ2luX3NlbnRlbmNlID0gZmFsc2UpIHsKKyAgZmxvYXQgcmV0ID0gMC4wOworICBDaGFydFN0YXRlIHN0YXRlOworICBzdGF0ZS5sZWZ0Lmxlbmd0aCA9IDA7CisgIHN0YXRlLnJpZ2h0Lmxlbmd0aCA9IDA7CisgIHN0YXRlLmxlZnQuZnVsbCA9IGZhbHNlOworICBmb3IgKHN0ZDo6dmVjdG9yPFdvcmRJbmRleD46OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaSA9IHdvcmRzLnJiZWdpbigpOyBpICE9IHdvcmRzLnJlbmQoKTsgKytpKSB7CisgICAgQ2hhcnRTdGF0ZSBjb3B5KHN0YXRlKTsKKyAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgc3RhdGUpOworICAgIHNjb3JlLlRlcm1pbmFsKCppKTsKKyAgICBzY29yZS5Ob25UZXJtaW5hbChjb3B5LCByZXQpOworICAgIHJldCA9IHNjb3JlLkZpbmlzaCgpOworICB9CisgIGlmIChiZWdpbl9zZW50ZW5jZSkgeworICAgIENoYXJ0U3RhdGUgY29weShzdGF0ZSk7CisgICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIHN0YXRlKTsKKyAgICBzY29yZS5CZWdpblNlbnRlbmNlKCk7CisgICAgc2NvcmUuTm9uVGVybWluYWwoY29weSwgcmV0KTsKKyAgICByZXQgPSBzY29yZS5GaW5pc2goKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTT4gZmxvYXQgVHJlZU1pZGRsZShjb25zdCBNICZtLCBjb25zdCBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+ICZ3b3JkcywgYm9vbCBiZWdpbl9zZW50ZW5jZSA9IGZhbHNlKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDaGFydFN0YXRlLCBmbG9hdD4gPiBzdGF0ZXMod29yZHMuc2l6ZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB3b3Jkcy5zaXplKCk7ICsraSkgeworICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBzdGF0ZXNbaV0uZmlyc3QpOworICAgIHNjb3JlLlRlcm1pbmFsKHdvcmRzW2ldKTsKKyAgICBzdGF0ZXNbaV0uc2Vjb25kID0gc2NvcmUuRmluaXNoKCk7CisgIH0KKyAgd2hpbGUgKHN0YXRlcy5zaXplKCkgPiAxKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENoYXJ0U3RhdGUsIGZsb2F0PiA+IHVwcGVyKChzdGF0ZXMuc2l6ZSgpICsgMSkgLyAyKTsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0YXRlcy5zaXplKCkgLyAyOyArK2kpIHsKKyAgICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCB1cHBlcltpXS5maXJzdCk7CisgICAgICBzY29yZS5Ob25UZXJtaW5hbChzdGF0ZXNbaSoyXS5maXJzdCwgc3RhdGVzW2kqMl0uc2Vjb25kKTsKKyAgICAgIHNjb3JlLk5vblRlcm1pbmFsKHN0YXRlc1tpKjIrMV0uZmlyc3QsIHN0YXRlc1tpKjIrMV0uc2Vjb25kKTsKKyAgICAgIHVwcGVyW2ldLnNlY29uZCA9IHNjb3JlLkZpbmlzaCgpOworICAgIH0KKyAgICBpZiAoc3RhdGVzLnNpemUoKSAlIDIpIHsKKyAgICAgIHVwcGVyLmJhY2soKSA9IHN0YXRlcy5iYWNrKCk7CisgICAgfQorICAgIHN0ZDo6c3dhcChzdGF0ZXMsIHVwcGVyKTsKKyAgfQorCisgIGlmIChzdGF0ZXMuZW1wdHkoKSkgcmV0dXJuIDAuMDsKKworICBpZiAoYmVnaW5fc2VudGVuY2UpIHsKKyAgICBDaGFydFN0YXRlIGlnbm9yZWQ7CisgICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGlnbm9yZWQpOworICAgIHNjb3JlLkJlZ2luU2VudGVuY2UoKTsKKyAgICBzY29yZS5Ob25UZXJtaW5hbChzdGF0ZXMuZnJvbnQoKS5maXJzdCwgc3RhdGVzLmZyb250KCkuc2Vjb25kKTsKKyAgICByZXR1cm4gc2NvcmUuRmluaXNoKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHN0YXRlcy5mcm9udCgpLnNlY29uZDsKKyAgfQorCit9CisKK3RlbXBsYXRlIDxjbGFzcyBNPiB2b2lkIExvb2t1cFZvY2FiKGNvbnN0IE0gJm0sIGNvbnN0IFN0cmluZ1BpZWNlICZzdHIsIHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gJm91dCkgeworICBvdXQuY2xlYXIoKTsKKyAgZm9yICh1dGlsOjpUb2tlbkl0ZXI8dXRpbDo6U2luZ2xlQ2hhcmFjdGVyLCB0cnVlPiBpKHN0ciwgJyAnKTsgaTsgKytpKSB7CisgICAgb3V0LnB1c2hfYmFjayhtLkdldFZvY2FidWxhcnkoKS5JbmRleCgqaSkpOworICB9Cit9CisKKyNkZWZpbmUgVEVYVF9URVNUKHN0cikgXAorICBMb29rdXBWb2NhYihtLCBzdHIsIHdvcmRzKTsgXAorICBleHBlY3QgPSBMZWZ0VG9SaWdodChtLCB3b3JkcywgcmVzdCk7IFwKKyAgU0xPUFBZX0NIRUNLX0NMT1NFKGV4cGVjdCwgUmlnaHRUb0xlZnQobSwgd29yZHMsIHJlc3QpLCAwLjAwMSk7IFwKKyAgU0xPUFBZX0NIRUNLX0NMT1NFKGV4cGVjdCwgVHJlZU1pZGRsZShtLCB3b3JkcywgcmVzdCksIDAuMDAxKTsgXAorCisvLyBCdWlsZCBzZW50ZW5jZXMsIG9yIHBhcnRzIHRoZXJlb2YsIGZyb20gcmlnaHQgdG8gbGVmdC4KK3RlbXBsYXRlIDxjbGFzcyBNPiB2b2lkIEdyb3dCaWcoY29uc3QgTSAmbSwgYm9vbCByZXN0ID0gZmFsc2UpIHsKKyAgc3RkOjp2ZWN0b3I8V29yZEluZGV4PiB3b3JkczsKKyAgZmxvYXQgZXhwZWN0OworICBURVhUX1RFU1QoImluIGJpYXJyaXR6IHdhdGNoaW5nIGNvbnNpZGVyaW5nIGxvb2tpbmcgLiBvbiBhIGxpdHRsZSBtb3JlIGxvaW4gYWxzbyB3b3VsZCBjb25zaWRlciBoaWdoZXIgdG8gbG9vayBnb29kIHVua25vd24gdGhlIHNjcmVlbmluZyBmb28gYmFyICwgdW5rbm93biBob3dldmVyIHVua25vd24gPC9zPiIpOworICBURVhUX1RFU1QoIm9uIGEgbGl0dGxlIG1vcmUgbG9pbiBhbHNvIHdvdWxkIGNvbnNpZGVyIGhpZ2hlciB0byBsb29rIGdvb2QgdW5rbm93biB0aGUgc2NyZWVuaW5nIGZvbyBiYXIgLCB1bmtub3duIGhvd2V2ZXIgdW5rbm93biA8L3M+Iik7CisgIFRFWFRfVEVTVCgib24gYSBsaXR0bGUgbW9yZSBsb2luIGFsc28gd291bGQgY29uc2lkZXIgaGlnaGVyIHRvIGxvb2sgZ29vZCIpOworICBURVhUX1RFU1QoIm1vcmUgbG9pbiBhbHNvIHdvdWxkIGNvbnNpZGVyIGhpZ2hlciB0byBsb29rIGdvb2QiKTsKKyAgVEVYVF9URVNUKCJtb3JlIGxvaW4gYWxzbyB3b3VsZCBjb25zaWRlciBoaWdoZXIgdG8gbG9vayIpOworICBURVhUX1RFU1QoImFsc28gd291bGQgY29uc2lkZXIgaGlnaGVyIHRvIGxvb2siKTsKKyAgVEVYVF9URVNUKCJhbHNvIHdvdWxkIGNvbnNpZGVyIGhpZ2hlciIpOworICBURVhUX1RFU1QoIndvdWxkIGNvbnNpZGVyIGhpZ2hlciB0byBsb29rIik7CisgIFRFWFRfVEVTVCgiY29uc2lkZXIgaGlnaGVyIHRvIGxvb2siKTsKKyAgVEVYVF9URVNUKCJjb25zaWRlciBoaWdoZXIgdG8iKTsKKyAgVEVYVF9URVNUKCJjb25zaWRlciBoaWdoZXIiKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgR3Jvd1NtYWxsKGNvbnN0IE0gJm0sIGJvb2wgcmVzdCA9IGZhbHNlKSB7CisgIHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gd29yZHM7CisgIGZsb2F0IGV4cGVjdDsKKyAgVEVYVF9URVNUKCJpbiBiaWFycml0eiB3YXRjaGluZyBjb25zaWRlcmluZyBsb29raW5nIC4gPC9zPiIpOworICBURVhUX1RFU1QoImluIGJpYXJyaXR6IHdhdGNoaW5nIGNvbnNpZGVyaW5nIGxvb2tpbmcgLiIpOworICBURVhUX1RFU1QoImluIGJpYXJyaXR6Iik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBNPiB2b2lkIEFsc29Xb3VsZENvbnNpZGVySGlnaGVyKGNvbnN0IE0gJm0pIHsKKyAgQ2hhcnRTdGF0ZSBhbHNvOworICB7CisgICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGFsc28pOworICAgIHNjb3JlLlRlcm1pbmFsKG0uR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KCJhbHNvIikpOworICAgIFNMT1BQWV9DSEVDS19DTE9TRSgtMS42ODc4NzIsIHNjb3JlLkZpbmlzaCgpLCAwLjAwMSk7CisgIH0KKyAgQ2hhcnRTdGF0ZSB3b3VsZDsKKyAgeworICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCB3b3VsZCk7CisgICAgc2NvcmUuVGVybWluYWwobS5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgoIndvdWxkIikpOworICAgIFNMT1BQWV9DSEVDS19DTE9TRSgtMS42ODc4NzIsIHNjb3JlLkZpbmlzaCgpLCAwLjAwMSk7CisgIH0KKyAgQ2hhcnRTdGF0ZSBjb21iaW5lX2Fsc29fd291bGQ7CisgIHsKKyAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgY29tYmluZV9hbHNvX3dvdWxkKTsKKyAgICBzY29yZS5Ob25UZXJtaW5hbChhbHNvLCAtMS42ODc4NzIpOworICAgIHNjb3JlLk5vblRlcm1pbmFsKHdvdWxkLCAtMS42ODc4NzIpOworICAgIFNMT1BQWV9DSEVDS19DTE9TRSgtMS42ODc4NzIgLSAyLjAsIHNjb3JlLkZpbmlzaCgpLCAwLjAwMSk7CisgIH0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgY29tYmluZV9hbHNvX3dvdWxkLnJpZ2h0Lmxlbmd0aCk7CisKKyAgQ2hhcnRTdGF0ZSBhbHNvX3dvdWxkOworICB7CisgICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGFsc29fd291bGQpOworICAgIHNjb3JlLlRlcm1pbmFsKG0uR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KCJhbHNvIikpOworICAgIHNjb3JlLlRlcm1pbmFsKG0uR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KCJ3b3VsZCIpKTsKKyAgICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTEuNjg3ODcyIC0gMi4wLCBzY29yZS5GaW5pc2goKSwgMC4wMDEpOworICB9CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIGFsc29fd291bGQucmlnaHQubGVuZ3RoKTsKKworICBDaGFydFN0YXRlIGNvbnNpZGVyOworICB7CisgICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGNvbnNpZGVyKTsKKyAgICBzY29yZS5UZXJtaW5hbChtLkdldFZvY2FidWxhcnkoKS5JbmRleCgiY29uc2lkZXIiKSk7CisgICAgU0xPUFBZX0NIRUNLX0NMT1NFKC0xLjY4Nzg3Miwgc2NvcmUuRmluaXNoKCksIDAuMDAxKTsKKyAgfQorICBCT09TVF9DSEVDS19FUVVBTCgxLCBjb25zaWRlci5sZWZ0Lmxlbmd0aCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDEsIGNvbnNpZGVyLnJpZ2h0Lmxlbmd0aCk7CisgIEJPT1NUX0NIRUNLKCFjb25zaWRlci5sZWZ0LmZ1bGwpOworCisgIENoYXJ0U3RhdGUgaGlnaGVyOworICBmbG9hdCBoaWdoZXJfc2NvcmU7CisgIHsKKyAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgaGlnaGVyKTsKKyAgICBzY29yZS5UZXJtaW5hbChtLkdldFZvY2FidWxhcnkoKS5JbmRleCgiaGlnaGVyIikpOworICAgIGhpZ2hlcl9zY29yZSA9IHNjb3JlLkZpbmlzaCgpOworICB9CisgIFNMT1BQWV9DSEVDS19DTE9TRSgtMS41MDk1NTksIGhpZ2hlcl9zY29yZSwgMC4wMDEpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBoaWdoZXIubGVmdC5sZW5ndGgpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBoaWdoZXIucmlnaHQubGVuZ3RoKTsKKyAgQk9PU1RfQ0hFQ0soIWhpZ2hlci5sZWZ0LmZ1bGwpOworICBWQ2hlY2soImhpZ2hlciIsIGhpZ2hlci5yaWdodC53b3Jkc1swXSk7CisgIFNMT1BQWV9DSEVDS19DTE9TRSgtMC4zMDEwMywgaGlnaGVyLnJpZ2h0LmJhY2tvZmZbMF0sIDAuMDAxKTsKKworICBDaGFydFN0YXRlIGNvbnNpZGVyX2hpZ2hlcjsKKyAgeworICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBjb25zaWRlcl9oaWdoZXIpOworICAgIHNjb3JlLk5vblRlcm1pbmFsKGNvbnNpZGVyLCAtMS42ODc4NzIpOworICAgIHNjb3JlLk5vblRlcm1pbmFsKGhpZ2hlciwgaGlnaGVyX3Njb3JlKTsKKyAgICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTEuNTA5NTU5IC0gMS42ODc4NzIgLSAwLjMwMTAzLCBzY29yZS5GaW5pc2goKSwgMC4wMDEpOworICB9CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIGNvbnNpZGVyX2hpZ2hlci5sZWZ0Lmxlbmd0aCk7CisgIEJPT1NUX0NIRUNLKCFjb25zaWRlcl9oaWdoZXIubGVmdC5mdWxsKTsKKworICBDaGFydFN0YXRlIGZ1bGw7CisgIHsKKyAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgZnVsbCk7CisgICAgc2NvcmUuTm9uVGVybWluYWwoY29tYmluZV9hbHNvX3dvdWxkLCAtMS42ODc4NzIgLSAyLjApOworICAgIHNjb3JlLk5vblRlcm1pbmFsKGNvbnNpZGVyX2hpZ2hlciwgLTEuNTA5NTU5IC0gMS42ODc4NzIgLSAwLjMwMTAzKTsKKyAgICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTEwLjY4NzksIHNjb3JlLkZpbmlzaCgpLCAwLjAwMSk7CisgIH0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoNCwgZnVsbC5yaWdodC5sZW5ndGgpOworfQorCisjZGVmaW5lIENIRUNLX1NDT1JFKHN0ciwgdmFsKSBcCit7IFwKKyAgZmxvYXQgZ290ID0gdmFsOyBcCisgIHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gaW5kaWNlczsgXAorICBMb29rdXBWb2NhYihtLCBzdHIsIGluZGljZXMpOyBcCisgIFNMT1BQWV9DSEVDS19DTE9TRShMZWZ0VG9SaWdodChtLCBpbmRpY2VzKSwgZ290LCAwLjAwMSk7IFwKK30KKwordGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgRnVsbEdyb3coY29uc3QgTSAmbSkgeworICBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+IHdvcmRzOworICBMb29rdXBWb2NhYihtLCAiaW4gYmlhcnJpdHogd2F0Y2hpbmcgY29uc2lkZXJpbmcgbG9va2luZyAuIDwvcz4iLCB3b3Jkcyk7CisKKyAgQ2hhcnRTdGF0ZSBsZXhpY2FsWzddOworICBmbG9hdCBsZXhpY2FsX3Njb3Jlc1s3XTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCA3OyArK2kpIHsKKyAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgbGV4aWNhbFtpXSk7CisgICAgc2NvcmUuVGVybWluYWwod29yZHNbaV0pOworICAgIGxleGljYWxfc2NvcmVzW2ldID0gc2NvcmUuRmluaXNoKCk7CisgIH0KKyAgQ0hFQ0tfU0NPUkUoImluIiwgbGV4aWNhbF9zY29yZXNbMF0pOworICBDSEVDS19TQ09SRSgiYmlhcnJpdHoiLCBsZXhpY2FsX3Njb3Jlc1sxXSk7CisgIENIRUNLX1NDT1JFKCJ3YXRjaGluZyIsIGxleGljYWxfc2NvcmVzWzJdKTsKKyAgQ0hFQ0tfU0NPUkUoIjwvcz4iLCBsZXhpY2FsX3Njb3Jlc1s2XSk7CisKKyAgQ2hhcnRTdGF0ZSBsMVs0XTsKKyAgZmxvYXQgbDFfc2NvcmVzWzRdOworICB7CisgICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGwxWzBdKTsKKyAgICBzY29yZS5Ob25UZXJtaW5hbChsZXhpY2FsWzBdLCBsZXhpY2FsX3Njb3Jlc1swXSk7CisgICAgc2NvcmUuTm9uVGVybWluYWwobGV4aWNhbFsxXSwgbGV4aWNhbF9zY29yZXNbMV0pOworICAgIENIRUNLX1NDT1JFKCJpbiBiaWFycml0eiIsIGwxX3Njb3Jlc1swXSA9IHNjb3JlLkZpbmlzaCgpKTsKKyAgfQorICB7CisgICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGwxWzFdKTsKKyAgICBzY29yZS5Ob25UZXJtaW5hbChsZXhpY2FsWzJdLCBsZXhpY2FsX3Njb3Jlc1syXSk7CisgICAgc2NvcmUuTm9uVGVybWluYWwobGV4aWNhbFszXSwgbGV4aWNhbF9zY29yZXNbM10pOworICAgIENIRUNLX1NDT1JFKCJ3YXRjaGluZyBjb25zaWRlcmluZyIsIGwxX3Njb3Jlc1sxXSA9IHNjb3JlLkZpbmlzaCgpKTsKKyAgfQorICB7CisgICAgUnVsZVNjb3JlPE0+IHNjb3JlKG0sIGwxWzJdKTsKKyAgICBzY29yZS5Ob25UZXJtaW5hbChsZXhpY2FsWzRdLCBsZXhpY2FsX3Njb3Jlc1s0XSk7CisgICAgc2NvcmUuTm9uVGVybWluYWwobGV4aWNhbFs1XSwgbGV4aWNhbF9zY29yZXNbNV0pOworICAgIENIRUNLX1NDT1JFKCJsb29raW5nIC4iLCBsMV9zY29yZXNbMl0gPSBzY29yZS5GaW5pc2goKSk7CisgIH0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobDFbMl0ubGVmdC5sZW5ndGgsIDEpOworICBsMVszXSA9IGxleGljYWxbNl07CisgIGwxX3Njb3Jlc1szXSA9IGxleGljYWxfc2NvcmVzWzZdOworCisgIENoYXJ0U3RhdGUgbDJbMl07CisgIGZsb2F0IGwyX3Njb3Jlc1syXTsKKyAgeworICAgIFJ1bGVTY29yZTxNPiBzY29yZShtLCBsMlswXSk7CisgICAgc2NvcmUuTm9uVGVybWluYWwobDFbMF0sIGwxX3Njb3Jlc1swXSk7CisgICAgc2NvcmUuTm9uVGVybWluYWwobDFbMV0sIGwxX3Njb3Jlc1sxXSk7CisgICAgQ0hFQ0tfU0NPUkUoImluIGJpYXJyaXR6IHdhdGNoaW5nIGNvbnNpZGVyaW5nIiwgbDJfc2NvcmVzWzBdID0gc2NvcmUuRmluaXNoKCkpOworICB9CisgIHsKKyAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgbDJbMV0pOworICAgIHNjb3JlLk5vblRlcm1pbmFsKGwxWzJdLCBsMV9zY29yZXNbMl0pOworICAgIHNjb3JlLk5vblRlcm1pbmFsKGwxWzNdLCBsMV9zY29yZXNbM10pOworICAgIENIRUNLX1NDT1JFKCJsb29raW5nIC4gPC9zPiIsIGwyX3Njb3Jlc1sxXSA9IHNjb3JlLkZpbmlzaCgpKTsKKyAgfQorICBCT09TVF9DSEVDS19FUVVBTChsMlsxXS5sZWZ0Lmxlbmd0aCwgMSk7CisgIEJPT1NUX0NIRUNLKGwyWzFdLmxlZnQuZnVsbCk7CisKKyAgQ2hhcnRTdGF0ZSB0b3A7CisgIHsKKyAgICBSdWxlU2NvcmU8TT4gc2NvcmUobSwgdG9wKTsKKyAgICBzY29yZS5Ob25UZXJtaW5hbChsMlswXSwgbDJfc2NvcmVzWzBdKTsKKyAgICBzY29yZS5Ob25UZXJtaW5hbChsMlsxXSwgbDJfc2NvcmVzWzFdKTsKKyAgICBDSEVDS19TQ09SRSgiaW4gYmlhcnJpdHogd2F0Y2hpbmcgY29uc2lkZXJpbmcgbG9va2luZyAuIDwvcz4iLCBzY29yZS5GaW5pc2goKSk7CisgIH0KK30KKworY29uc3QgY2hhciAqRmlsZUxvY2F0aW9uKCkgeworICBpZiAoYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgPCAyKSB7CisgICAgcmV0dXJuICJ0ZXN0LmFycGEiOworICB9CisgIHJldHVybiBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlsxXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgRXZlcnl0aGluZygpIHsKKyAgQ29uZmlnIGNvbmZpZzsKKyAgY29uZmlnLm1lc3NhZ2VzID0gTlVMTDsKKyAgTSBtKEZpbGVMb2NhdGlvbigpLCBjb25maWcpOworCisgIFNob3J0KG0pOworICBDaGFyZ2UobSk7CisgIEdyb3dCaWcobSk7CisgIEFsc29Xb3VsZENvbnNpZGVySGlnaGVyKG0pOworICBHcm93U21hbGwobSk7CisgIEZ1bGxHcm93KG0pOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShQcm9iaW5nQWxsKSB7CisgIEV2ZXJ5dGhpbmc8TW9kZWw+KCk7Cit9CitCT09TVF9BVVRPX1RFU1RfQ0FTRShUcmllQWxsKSB7CisgIEV2ZXJ5dGhpbmc8VHJpZU1vZGVsPigpOworfQorQk9PU1RfQVVUT19URVNUX0NBU0UoUXVhbnRUcmllQWxsKSB7CisgIEV2ZXJ5dGhpbmc8UXVhbnRUcmllTW9kZWw+KCk7Cit9CitCT09TVF9BVVRPX1RFU1RfQ0FTRShBcnJheVF1YW50VHJpZUFsbCkgeworICBFdmVyeXRoaW5nPFF1YW50QXJyYXlUcmllTW9kZWw+KCk7Cit9CitCT09TVF9BVVRPX1RFU1RfQ0FTRShBcnJheVRyaWVBbGwpIHsKKyAgRXZlcnl0aGluZzxBcnJheVRyaWVNb2RlbD4oKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUmVzdFByb2JpbmcpIHsKKyAgQ29uZmlnIGNvbmZpZzsKKyAgY29uZmlnLm1lc3NhZ2VzID0gTlVMTDsKKyAgUmVzdFByb2JpbmdNb2RlbCBtKEZpbGVMb2NhdGlvbigpLCBjb25maWcpOworICBHcm93QmlnKG0sIHRydWUpOworfQorCit9IC8vIG5hbWVzcGFjZQorfSAvLyBuYW1lc3BhY2UgbmdyYW0KK30gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vbG1fZXhjZXB0aW9uLmNjIGIvc3JjL2tlbmxtL2xtL2xtX2V4Y2VwdGlvbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGQ0NjhmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2xtX2V4Y2VwdGlvbi5jYwpAQCAtMCwwICsxLDIzIEBACisjaW5jbHVkZSAibG0vbG1fZXhjZXB0aW9uLmhoIgorCisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGNzdGRpbz4KKworbmFtZXNwYWNlIGxtIHsKKworQ29uZmlnRXhjZXB0aW9uOjpDb25maWdFeGNlcHRpb24oKSB0aHJvdygpIHt9CitDb25maWdFeGNlcHRpb246On5Db25maWdFeGNlcHRpb24oKSB0aHJvdygpIHt9CisKK0xvYWRFeGNlcHRpb246OkxvYWRFeGNlcHRpb24oKSB0aHJvdygpIHt9CitMb2FkRXhjZXB0aW9uOjp+TG9hZEV4Y2VwdGlvbigpIHRocm93KCkge30KKworRm9ybWF0TG9hZEV4Y2VwdGlvbjo6Rm9ybWF0TG9hZEV4Y2VwdGlvbigpIHRocm93KCkge30KK0Zvcm1hdExvYWRFeGNlcHRpb246On5Gb3JtYXRMb2FkRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorCitWb2NhYkxvYWRFeGNlcHRpb246OlZvY2FiTG9hZEV4Y2VwdGlvbigpIHRocm93KCkge30KK1ZvY2FiTG9hZEV4Y2VwdGlvbjo6flZvY2FiTG9hZEV4Y2VwdGlvbigpIHRocm93KCkge30KKworU3BlY2lhbFdvcmRNaXNzaW5nRXhjZXB0aW9uOjpTcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb24oKSB0aHJvdygpIHt9CitTcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb246On5TcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb24oKSB0aHJvdygpIHt9CisKK30gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vbG1fZXhjZXB0aW9uLmhoIGIvc3JjL2tlbmxtL2xtL2xtX2V4Y2VwdGlvbi5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWE1NzM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL2xtX2V4Y2VwdGlvbi5oaApAQCAtMCwwICsxLDUwIEBACisjaWZuZGVmIExNX0xNX0VYQ0VQVElPTl9ICisjZGVmaW5lIExNX0xNX0VYQ0VQVElPTl9ICisKKy8vIE5hbWVkIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggdXRpbC9leGNlcHRpb24uaGguCisKKyNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmluZ19waWVjZS5oaCIKKworI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbSB7CisKK3R5cGVkZWYgZW51bSB7VEhST1dfVVAsIENPTVBMQUlOLCBTSUxFTlR9IFdhcm5pbmdBY3Rpb247CisKK2NsYXNzIENvbmZpZ0V4Y2VwdGlvbiA6IHB1YmxpYyB1dGlsOjpFeGNlcHRpb24geworICBwdWJsaWM6CisgICAgQ29uZmlnRXhjZXB0aW9uKCkgdGhyb3coKTsKKyAgICB+Q29uZmlnRXhjZXB0aW9uKCkgdGhyb3coKTsKK307CisKK2NsYXNzIExvYWRFeGNlcHRpb24gOiBwdWJsaWMgdXRpbDo6RXhjZXB0aW9uIHsKKyAgIHB1YmxpYzoKKyAgICAgIHZpcnR1YWwgfkxvYWRFeGNlcHRpb24oKSB0aHJvdygpOworCisgICBwcm90ZWN0ZWQ6CisgICAgICBMb2FkRXhjZXB0aW9uKCkgdGhyb3coKTsKK307CisKK2NsYXNzIEZvcm1hdExvYWRFeGNlcHRpb24gOiBwdWJsaWMgTG9hZEV4Y2VwdGlvbiB7CisgIHB1YmxpYzoKKyAgICBGb3JtYXRMb2FkRXhjZXB0aW9uKCkgdGhyb3coKTsKKyAgICB+Rm9ybWF0TG9hZEV4Y2VwdGlvbigpIHRocm93KCk7Cit9OworCitjbGFzcyBWb2NhYkxvYWRFeGNlcHRpb24gOiBwdWJsaWMgTG9hZEV4Y2VwdGlvbiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5Wb2NhYkxvYWRFeGNlcHRpb24oKSB0aHJvdygpOworICAgIFZvY2FiTG9hZEV4Y2VwdGlvbigpIHRocm93KCk7Cit9OworCitjbGFzcyBTcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb24gOiBwdWJsaWMgVm9jYWJMb2FkRXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbigpIHRocm93KCk7CisgICAgflNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbigpIHRocm93KCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbQorCisjZW5kaWYgLy8gTE1fTE1fRVhDRVBUSU9OCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vbWF4X29yZGVyLmhoIGIvc3JjL2tlbmxtL2xtL21heF9vcmRlci5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQxMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL21heF9vcmRlci5oaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIExNX01BWF9PUkRFUl9ICisjZGVmaW5lIExNX01BWF9PUkRFUl9ICisvKiBJRiBZT1VSIEJVSUxEIFNZU1RFTSBQQVNTRVMgLURLRU5MTV9NQVhfT1JERVIsIFRIRU4gQ0hBTkdFIFRIRSBCVUlMRCBTWVNURU0uCisgKiBJZiBub3QsIHRoaXMgaXMgdGhlIGRlZmF1bHQgbWF4aW11bSBvcmRlci4KKyAqIEhhdmluZyB0aGlzIGxpbWl0IG1lYW5zIHRoYXQgU3RhdGUgY2FuIGJlCisgKiAoa01heE9yZGVyIC0gMSkgKiBzaXplb2YoZmxvYXQpIGJ5dGVzIGluc3RlYWQgb2YKKyAqIHNpemVvZihmbG9hdCopICsgKGtNYXhPcmRlciAtIDEpICogc2l6ZW9mKGZsb2F0KSArIG1hbGxvYyBvdmVyaGVhZAorICovCisjaWZuZGVmIEtFTkxNX09SREVSX01FU1NBR0UKKyNkZWZpbmUgS0VOTE1fT1JERVJfTUVTU0FHRSAiSWYgeW91ciBidWlsZCBzeXN0ZW0gc3VwcG9ydHMgY2hhbmdpbmcgS0VOTE1fTUFYX09SREVSLCBjaGFuZ2UgaXQgdGhlcmUgYW5kIHJlY29tcGlsZS4gIEluIHRoZSBLZW5MTSB0YXJiYWxsIG9yIE1vc2VzLCB1c2UgZS5nLiBgYmphbSAtLW1heC1rZW5sbS1vcmRlcj02IC1hJy4gIE90aGVyd2lzZSwgZWRpdCBsbS9tYXhfb3JkZXIuaGguIgorI2VuZGlmCisKKyNlbmRpZiAvLyBMTV9NQVhfT1JERVJfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL21vZGVsLmNjIGIvc3JjL2tlbmxtL2xtL21vZGVsLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vbW9kZWwuY2MKcmVuYW1lIHRvIHNyYy9rZW5sbS9sbS9tb2RlbC5jYwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL21vZGVsLmhoIGIvc3JjL2tlbmxtL2xtL21vZGVsLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYmJlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vbW9kZWwuaGgKQEAgLTAsMCArMSwxNTUgQEAKKyNpZm5kZWYgTE1fTU9ERUxfSAorI2RlZmluZSBMTV9NT0RFTF9ICisKKyNpbmNsdWRlICJsbS9iaGlrc2hhLmhoIgorI2luY2x1ZGUgImxtL2JpbmFyeV9mb3JtYXQuaGgiCisjaW5jbHVkZSAibG0vY29uZmlnLmhoIgorI2luY2x1ZGUgImxtL2ZhY2FkZS5oaCIKKyNpbmNsdWRlICJsbS9xdWFudGl6ZS5oaCIKKyNpbmNsdWRlICJsbS9zZWFyY2hfaGFzaGVkLmhoIgorI2luY2x1ZGUgImxtL3NlYXJjaF90cmllLmhoIgorI2luY2x1ZGUgImxtL3N0YXRlLmhoIgorI2luY2x1ZGUgImxtL3ZhbHVlLmhoIgorI2luY2x1ZGUgImxtL3ZvY2FiLmhoIgorI2luY2x1ZGUgImxtL3dlaWdodHMuaGgiCisKKyNpbmNsdWRlICJ1dGlsL211cm11cl9oYXNoLmhoIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgdXRpbCB7IGNsYXNzIEZpbGVQaWVjZTsgfQorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKK25hbWVzcGFjZSBkZXRhaWwgeworCisvLyBTaG91bGQgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdHMgYXMgU1JJLgorLy8gTW9kZWxGYWNhZGUgdHlwZWRlZnMgVm9jYWJ1bGFyeSBzbyB3ZSB1c2UgVm9jYWJ1bGFyeVQgdG8gYXZvaWQgbmFtaW5nIGNvbmZsaWN0cy4KK3RlbXBsYXRlIDxjbGFzcyBTZWFyY2gsIGNsYXNzIFZvY2FidWxhcnlUPiBjbGFzcyBHZW5lcmljTW9kZWwgOiBwdWJsaWMgYmFzZTo6TW9kZWxGYWNhZGU8R2VuZXJpY01vZGVsPFNlYXJjaCwgVm9jYWJ1bGFyeVQ+LCBTdGF0ZSwgVm9jYWJ1bGFyeVQ+IHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIGJhc2U6Ok1vZGVsRmFjYWRlPEdlbmVyaWNNb2RlbDxTZWFyY2gsIFZvY2FidWxhcnlUPiwgU3RhdGUsIFZvY2FidWxhcnlUPiBQOworICBwdWJsaWM6CisgICAgLy8gVGhpcyBpcyB0aGUgbW9kZWwgdHlwZSByZXR1cm5lZCBieSBSZWNvZ25pemVCaW5hcnkuCisgICAgc3RhdGljIGNvbnN0IE1vZGVsVHlwZSBrTW9kZWxUeXBlOworCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrVmVyc2lvbiA9IFNlYXJjaDo6a1ZlcnNpb247CisKKyAgICAvKiBHZXQgdGhlIHNpemUgb2YgbWVtb3J5IHRoYXQgd2lsbCBiZSBtYXBwZWQgZ2l2ZW4gbmdyYW0gY291bnRzLiAgVGhpcworICAgICAqIGRvZXMgbm90IGluY2x1ZGUgc21hbGwgbm9uLW1hcHBlZCBjb250cm9sIHN0cnVjdHVyZXMsIHN1Y2ggYXMgdGhpcyBjbGFzcworICAgICAqIGl0c2VsZi4KKyAgICAgKi8KKyAgICBzdGF0aWMgdWludDY0X3QgU2l6ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3QgQ29uZmlnICZjb25maWcgPSBDb25maWcoKSk7CisKKyAgICAvKiBMb2FkIHRoZSBtb2RlbCBmcm9tIGEgZmlsZS4gIEl0IG1heSBiZSBhbiBBUlBBIG9yIGJpbmFyeSBmaWxlLiAgQmluYXJ5CisgICAgICogZmlsZXMgbXVzdCBoYXZlIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgdGhpcyBjbGFzcyBvciB5b3UnbGwgZ2V0IGFuCisgICAgICogZXhjZXB0aW9uLiAgU28gVHJpZU1vZGVsIGNhbiBvbmx5IGxvYWQgQVJQQSBvciBiaW5hcnkgY3JlYXRlZCBieQorICAgICAqIFRyaWVNb2RlbC4gIFRvIGNsYXNzaWZ5IGJpbmFyeSBmaWxlcywgY2FsbCBSZWNvZ25pemVCaW5hcnkgaW4KKyAgICAgKiBsbS9iaW5hcnlfZm9ybWF0LmhoLgorICAgICAqLworICAgIGV4cGxpY2l0IEdlbmVyaWNNb2RlbChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBDb25maWcgJmNvbmZpZyA9IENvbmZpZygpKTsKKworICAgIC8qIFNjb3JlIHAobmV3X3dvcmQgfCBpbl9zdGF0ZSkgYW5kIGluY29ycG9yYXRlIG5ld193b3JkIGludG8gb3V0X3N0YXRlLgorICAgICAqIE5vdGUgdGhhdCBpbl9zdGF0ZSBhbmQgb3V0X3N0YXRlIG11c3QgYmUgZGlmZmVyZW50IHJlZmVyZW5jZXM6CisgICAgICogJmluX3N0YXRlICE9ICZvdXRfc3RhdGUuCisgICAgICovCisgICAgRnVsbFNjb3JlUmV0dXJuIEZ1bGxTY29yZShjb25zdCBTdGF0ZSAmaW5fc3RhdGUsIGNvbnN0IFdvcmRJbmRleCBuZXdfd29yZCwgU3RhdGUgJm91dF9zdGF0ZSkgY29uc3Q7CisKKyAgICAvKiBTbG93ZXIgY2FsbCB3aXRob3V0IGluX3N0YXRlLiAgVHJ5IHRvIHJlbWVtYmVyIHN0YXRlLCBidXQgc29tZXRpbWVzIGl0CisgICAgICogd291bGQgY29zdCB0b28gbXVjaCBtZW1vcnkgb3IgeW91ciBkZWNvZGVyIGlzbid0IHNldHVwIHByb3Blcmx5LgorICAgICAqIFRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBtYWtlIGFuIGFycmF5IG9mIFdvcmRJbmRleCBjb250YWluaW5nIHRoZSBjb250ZXh0CisgICAgICogdm9jYWJ1bGFyeSBpZHMgaW4gcmV2ZXJzZSBvcmRlci4gIFRoZW4sIHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgYXJyYXk6CisgICAgICogW2NvbnRleHRfcmJlZ2luLCBjb250ZXh0X3JlbmQpLiAgVGhlIG5ld193b3JkIGlzIG5vdCBwYXJ0IG9mIHRoZSBjb250ZXh0CisgICAgICogYXJyYXkgdW5sZXNzIHlvdSBpbnRlbmQgdG8gcmVwZWF0IHdvcmRzLgorICAgICAqLworICAgIEZ1bGxTY29yZVJldHVybiBGdWxsU2NvcmVGb3Jnb3RTdGF0ZShjb25zdCBXb3JkSW5kZXggKmNvbnRleHRfcmJlZ2luLCBjb25zdCBXb3JkSW5kZXggKmNvbnRleHRfcmVuZCwgY29uc3QgV29yZEluZGV4IG5ld193b3JkLCBTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdDsKKworICAgIC8qIEdldCB0aGUgc3RhdGUgZm9yIGEgY29udGV4dC4gIERvbid0IHVzZSB0aGlzIGlmIHlvdSBjYW4gYXZvaWQgaXQuICBVc2UKKyAgICAgKiBCZWdpblNlbnRlbmNlU3RhdGUgb3IgTnVsbENvbnRleHRTdGF0ZSBhbmQgZXh0ZW5kIGZyb20gdGhvc2UuICBJZgorICAgICAqIHlvdSdyZSBvbmx5IGdvaW5nIHRvIHVzZSB0aGlzIHN0YXRlIHRvIGNhbGwgRnVsbFNjb3JlIG9uY2UsIHVzZQorICAgICAqIEZ1bGxTY29yZUZvcmdvdFN0YXRlLgorICAgICAqIFRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBtYWtlIGFuIGFycmF5IG9mIFdvcmRJbmRleCBjb250YWluaW5nIHRoZSBjb250ZXh0CisgICAgICogdm9jYWJ1bGFyeSBpZHMgaW4gcmV2ZXJzZSBvcmRlci4gIFRoZW4sIHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgYXJyYXk6CisgICAgICogW2NvbnRleHRfcmJlZ2luLCBjb250ZXh0X3JlbmQpLgorICAgICAqLworICAgIHZvaWQgR2V0U3RhdGUoY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JiZWdpbiwgY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JlbmQsIFN0YXRlICZvdXRfc3RhdGUpIGNvbnN0OworCisgICAgLyogTW9yZSBlZmZpY2llbnQgdmVyc2lvbiBvZiBGdWxsU2NvcmUgd2hlcmUgYSBwYXJ0aWFsIG4tZ3JhbSBoYXMgYWxyZWFkeQorICAgICAqIGJlZW4gc2NvcmVkLgorICAgICAqIE5PVEU6IFRIRSBSRVRVUk5FRCAucmVzdCBBTkQgLnByb2IgQVJFIFJFTEFUSVZFIFRPIFRIRSAucmVzdCBSRVRVUk5FRCBCRUZPUkUuCisgICAgICovCisgICAgRnVsbFNjb3JlUmV0dXJuIEV4dGVuZExlZnQoCisgICAgICAgIC8vIEFkZGl0aW9uYWwgY29udGV4dCBpbiByZXZlcnNlIG9yZGVyLiAgVGhpcyB3aWxsIHVwZGF0ZSBhZGRfcmVuZCB0bworICAgICAgICBjb25zdCBXb3JkSW5kZXggKmFkZF9yYmVnaW4sIGNvbnN0IFdvcmRJbmRleCAqYWRkX3JlbmQsCisgICAgICAgIC8vIEJhY2tvZmYgd2VpZ2h0cyB0byB1c2UuCisgICAgICAgIGNvbnN0IGZsb2F0ICpiYWNrb2ZmX2luLAorICAgICAgICAvLyBleHRlbmRfbGVmdCByZXR1cm5lZCBieSBhIHByZXZpb3VzIHF1ZXJ5LgorICAgICAgICB1aW50NjRfdCBleHRlbmRfcG9pbnRlciwKKyAgICAgICAgLy8gTGVuZ3RoIG9mIG4tZ3JhbSB0aGF0IHRoZSBwb2ludGVyIGNvcnJlc3BvbmRzIHRvLgorICAgICAgICB1bnNpZ25lZCBjaGFyIGV4dGVuZF9sZW5ndGgsCisgICAgICAgIC8vIFdoZXJlIHRvIHdyaXRlIGFkZGl0aW9uYWwgYmFja29mZnMgZm9yIFtleHRlbmRfbGVuZ3RoICsgMSwgbWluKE9yZGVyKCkgLSAxLCByZXR1cm4ubmdyYW1fbGVuZ3RoKV0KKyAgICAgICAgZmxvYXQgKmJhY2tvZmZfb3V0LAorICAgICAgICAvLyBBbW91bnQgb2YgYWRkaXRpb25hbCBjb250ZW50IHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYnkgdGhlIG5leHQgY2FsbC4KKyAgICAgICAgdW5zaWduZWQgY2hhciAmbmV4dF91c2UpIGNvbnN0OworCisgICAgLyogUmV0dXJuIHByb2JhYmlsaXRpZXMgbWludXMgcmVzdCBjb3N0cyBmb3IgYW4gYXJyYXkgb2YgcG9pbnRlcnMuICBUaGUKKyAgICAgKiBmaXJzdCBsZW5ndGggc2hvdWxkIGJlIHRoZSBsZW5ndGggb2YgdGhlIG4tZ3JhbSB0byB3aGljaCBwb2ludGVyc19iZWdpbgorICAgICAqIHBvaW50cy4KKyAgICAgKi8KKyAgICBmbG9hdCBVblJlc3QoY29uc3QgdWludDY0X3QgKnBvaW50ZXJzX2JlZ2luLCBjb25zdCB1aW50NjRfdCAqcG9pbnRlcnNfZW5kLCB1bnNpZ25lZCBjaGFyIGZpcnN0X2xlbmd0aCkgY29uc3QgeworICAgICAgLy8gQ29tcGlsZXIgc2hvdWxkIG9wdGltaXplIHRoaXMgaWYgYXdheS4KKyAgICAgIHJldHVybiBTZWFyY2g6OmtEaWZmZXJlbnRSZXN0ID8gSW50ZXJuYWxVblJlc3QocG9pbnRlcnNfYmVnaW4sIHBvaW50ZXJzX2VuZCwgZmlyc3RfbGVuZ3RoKSA6IDAuMDsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBGdWxsU2NvcmVSZXR1cm4gU2NvcmVFeGNlcHRCYWNrb2ZmKGNvbnN0IFdvcmRJbmRleCAqY29uc3QgY29udGV4dF9yYmVnaW4sIGNvbnN0IFdvcmRJbmRleCAqY29uc3QgY29udGV4dF9yZW5kLCBjb25zdCBXb3JkSW5kZXggbmV3X3dvcmQsIFN0YXRlICZvdXRfc3RhdGUpIGNvbnN0OworCisgICAgLy8gU2NvcmUgYmlncmFtcyBhbmQgYWJvdmUuICBEbyBub3QgaW5jbHVkZSBiYWNrb2ZmLgorICAgIHZvaWQgUmVzdW1lU2NvcmUoY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JiZWdpbiwgY29uc3QgV29yZEluZGV4ICpjb25zdCBjb250ZXh0X3JlbmQsIHVuc2lnbmVkIGNoYXIgc3RhcnRpbmdfb3JkZXJfbWludXNfMiwgdHlwZW5hbWUgU2VhcmNoOjpOb2RlICZub2RlLCBmbG9hdCAqYmFja29mZl9vdXQsIHVuc2lnbmVkIGNoYXIgJm5leHRfdXNlLCBGdWxsU2NvcmVSZXR1cm4gJnJldCkgY29uc3Q7CisKKyAgICAvLyBBcHBlYXJzIGFmdGVyIFNpemUgaW4gdGhlIGNjIGZpbGUuCisgICAgdm9pZCBTZXR1cE1lbW9yeSh2b2lkICpzdGFydCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIGNvbnN0IENvbmZpZyAmY29uZmlnKTsKKworICAgIHZvaWQgSW5pdGlhbGl6ZUZyb21BUlBBKGludCBmZCwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgQ29uZmlnICZjb25maWcpOworCisgICAgZmxvYXQgSW50ZXJuYWxVblJlc3QoY29uc3QgdWludDY0X3QgKnBvaW50ZXJzX2JlZ2luLCBjb25zdCB1aW50NjRfdCAqcG9pbnRlcnNfZW5kLCB1bnNpZ25lZCBjaGFyIGZpcnN0X2xlbmd0aCkgY29uc3Q7CisKKyAgICBCaW5hcnlGb3JtYXQgYmFja2luZ187CisKKyAgICBWb2NhYnVsYXJ5VCB2b2NhYl87CisKKyAgICBTZWFyY2ggc2VhcmNoXzsKK307CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCisvLyBJbnN0ZWFkIG9mIHR5cGVkZWYsIGluaGVyaXQuICBUaGlzIGFsbG93cyB0aGUgTW9kZWwgZXRjIHRvIGJlIGZvcndhcmQgZGVjbGFyZWQuCisvLyBPaCB0aGUgam95cyBvZiBDIGFuZCBDKysuCisjZGVmaW5lIExNX0NPTU1BKCkgLAorI2RlZmluZSBMTV9OQU1FX01PREVMKG5hbWUsIGZyb20pXAorY2xhc3MgbmFtZSA6IHB1YmxpYyBmcm9tIHtcCisgIHB1YmxpYzpcCisgICAgbmFtZShjb25zdCBjaGFyICpmaWxlLCBjb25zdCBDb25maWcgJmNvbmZpZyA9IENvbmZpZygpKSA6IGZyb20oZmlsZSwgY29uZmlnKSB7fVwKK307CisKK0xNX05BTUVfTU9ERUwoUHJvYmluZ01vZGVsLCBkZXRhaWw6OkdlbmVyaWNNb2RlbDxkZXRhaWw6Okhhc2hlZFNlYXJjaDxCYWNrb2ZmVmFsdWU+IExNX0NPTU1BKCkgUHJvYmluZ1ZvY2FidWxhcnk+KTsKK0xNX05BTUVfTU9ERUwoUmVzdFByb2JpbmdNb2RlbCwgZGV0YWlsOjpHZW5lcmljTW9kZWw8ZGV0YWlsOjpIYXNoZWRTZWFyY2g8UmVzdFZhbHVlPiBMTV9DT01NQSgpIFByb2JpbmdWb2NhYnVsYXJ5Pik7CitMTV9OQU1FX01PREVMKFRyaWVNb2RlbCwgZGV0YWlsOjpHZW5lcmljTW9kZWw8dHJpZTo6VHJpZVNlYXJjaDxEb250UXVhbnRpemUgTE1fQ09NTUEoKSB0cmllOjpEb250Qmhpa3NoYT4gTE1fQ09NTUEoKSBTb3J0ZWRWb2NhYnVsYXJ5Pik7CitMTV9OQU1FX01PREVMKEFycmF5VHJpZU1vZGVsLCBkZXRhaWw6OkdlbmVyaWNNb2RlbDx0cmllOjpUcmllU2VhcmNoPERvbnRRdWFudGl6ZSBMTV9DT01NQSgpIHRyaWU6OkFycmF5Qmhpa3NoYT4gTE1fQ09NTUEoKSBTb3J0ZWRWb2NhYnVsYXJ5Pik7CitMTV9OQU1FX01PREVMKFF1YW50VHJpZU1vZGVsLCBkZXRhaWw6OkdlbmVyaWNNb2RlbDx0cmllOjpUcmllU2VhcmNoPFNlcGFyYXRlbHlRdWFudGl6ZSBMTV9DT01NQSgpIHRyaWU6OkRvbnRCaGlrc2hhPiBMTV9DT01NQSgpIFNvcnRlZFZvY2FidWxhcnk+KTsKK0xNX05BTUVfTU9ERUwoUXVhbnRBcnJheVRyaWVNb2RlbCwgZGV0YWlsOjpHZW5lcmljTW9kZWw8dHJpZTo6VHJpZVNlYXJjaDxTZXBhcmF0ZWx5UXVhbnRpemUgTE1fQ09NTUEoKSB0cmllOjpBcnJheUJoaWtzaGE+IExNX0NPTU1BKCkgU29ydGVkVm9jYWJ1bGFyeT4pOworCisvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uLiAgTm8gcmVhbCByZWFzb24gZm9yIGl0IHRvIGJlIHRoZSBkZWZhdWx0LgordHlwZWRlZiA6OmxtOjpuZ3JhbTo6UHJvYmluZ1ZvY2FidWxhcnkgVm9jYWJ1bGFyeTsKK3R5cGVkZWYgUHJvYmluZ01vZGVsIE1vZGVsOworCisvKiBBdXRvcmVjb2duaXplIHRoZSBmaWxlIHR5cGUsIGxvYWQsIGFuZCByZXR1cm4gdGhlIHZpcnR1YWwgYmFzZSBjbGFzcy4gIERvbid0CisgKiB1c2UgdGhlIHZpcnR1YWwgYmFzZSBjbGFzcyBpZiB5b3UgY2FuIGF2b2lkIGl0LiAgSW5zdGVhZCwgdXNlIHRoZSBhYm92ZQorICogY2xhc3NlcyBhcyB0ZW1wbGF0ZSBhcmd1bWVudHMgdG8geW91ciBvd24gdmlydHVhbCBmZWF0dXJlIGZ1bmN0aW9uLiovCitiYXNlOjpNb2RlbCAqTG9hZFZpcnR1YWwoY29uc3QgY2hhciAqZmlsZV9uYW1lLCBjb25zdCBDb25maWcgJmNvbmZpZyA9IENvbmZpZygpLCBNb2RlbFR5cGUgaWZfYXJwYSA9IFBST0JJTkcpOworCit9IC8vIG5hbWVzcGFjZSBuZ3JhbQorfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX01PREVMX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9tb2RlbF90ZXN0LmNjIGIvc3JjL2tlbmxtL2xtL21vZGVsX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwOGQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9tb2RlbF90ZXN0LmNjCkBAIC0wLDAgKzEsNDQ4IEBACisjaW5jbHVkZSAibG0vbW9kZWwuaGgiCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgTW9kZWxUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvZmxvYXRpbmdfcG9pbnRfY29tcGFyaXNvbi5ocHA+CisKKy8vIEFwcGFyZW50bHkgc29tZSBCb29zdCB2ZXJzaW9ucyB1c2UgdGVtcGxhdGVzIGFuZCBhcmUgcHJldHR5IHN0cmljdCBhYm91dCB0eXBlcyBtYXRjaGluZy4KKyNkZWZpbmUgU0xPUFBZX0NIRUNLX0NMT1NFKHJlZiwgdmFsdWUsIHRvbCkgQk9PU1RfQ0hFQ0tfQ0xPU0Uoc3RhdGljX2Nhc3Q8ZG91YmxlPihyZWYpLCBzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSwgc3RhdGljX2Nhc3Q8ZG91YmxlPih0b2wpKTsKKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBuZ3JhbSB7CisKK3N0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm8sIGNvbnN0IFN0YXRlICZzdGF0ZSkgeworICBvIDw8ICJTdGF0ZSBsZW5ndGggIiA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHN0YXRlLmxlbmd0aCkgPDwgJzonOworICBmb3IgKGNvbnN0IFdvcmRJbmRleCAqaSA9IHN0YXRlLndvcmRzOyBpIDwgc3RhdGUud29yZHMgKyBzdGF0ZS5sZW5ndGg7ICsraSkgeworICAgIG8gPDwgJyAnIDw8ICppOworICB9CisgIHJldHVybiBvOworfQorCituYW1lc3BhY2UgeworCisvLyBTdHVwaWQgYmphbSByZXZlcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyByYW5kb21seS4KK2NvbnN0IGNoYXIgKlRlc3RMb2NhdGlvbigpIHsKKyAgaWYgKGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIDwgMykgeworICAgIHJldHVybiAidGVzdC5hcnBhIjsKKyAgfQorICBjaGFyICoqYXJndiA9IGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2OworICByZXR1cm4gYXJndltzdHJzdHIoYXJndlsxXSwgIm5vdW5rIikgPyAyIDogMV07Cit9Citjb25zdCBjaGFyICpUZXN0Tm9VbmtMb2NhdGlvbigpIHsKKyAgaWYgKGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIDwgMykgeworICAgIHJldHVybiAidGVzdF9ub3Vuay5hcnBhIjsKKyAgfQorICBjaGFyICoqYXJndiA9IGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2OworICByZXR1cm4gYXJndltzdHJzdHIoYXJndlsxXSwgIm5vdW5rIikgPyAxIDogMl07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBNb2RlbD4gU3RhdGUgR2V0U3RhdGUoY29uc3QgTW9kZWwgJm1vZGVsLCBjb25zdCBjaGFyICp3b3JkLCBjb25zdCBTdGF0ZSAmaW4pIHsKKyAgV29yZEluZGV4IGNvbnRleHRbaW4ubGVuZ3RoICsgMV07CisgIGNvbnRleHRbMF0gPSBtb2RlbC5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgod29yZCk7CisgIHN0ZDo6Y29weShpbi53b3JkcywgaW4ud29yZHMgKyBpbi5sZW5ndGgsIGNvbnRleHQgKyAxKTsKKyAgU3RhdGUgcmV0OworICBtb2RlbC5HZXRTdGF0ZShjb250ZXh0LCBjb250ZXh0ICsgaW4ubGVuZ3RoICsgMSwgcmV0KTsKKyAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBTdGFydFRlc3Qod29yZCwgbmdyYW0sIHNjb3JlLCBpbmRlcF9sZWZ0KSBcCisgIHJldCA9IG1vZGVsLkZ1bGxTY29yZSggXAorICAgICAgc3RhdGUsIFwKKyAgICAgIG1vZGVsLkdldFZvY2FidWxhcnkoKS5JbmRleCh3b3JkKSwgXAorICAgICAgb3V0KTtcCisgIFNMT1BQWV9DSEVDS19DTE9TRShzY29yZSwgcmV0LnByb2IsIDAuMDAxKTsgXAorICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KG5ncmFtKSwgcmV0Lm5ncmFtX2xlbmd0aCk7IFwKKyAgQk9PU1RfQ0hFQ0tfR0Uoc3RkOjptaW48dW5zaWduZWQgY2hhcj4obmdyYW0sIDUgLSAxKSwgb3V0Lmxlbmd0aCk7IFwKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5kZXBfbGVmdCwgcmV0LmluZGVwZW5kZW50X2xlZnQpOyBcCisgIEJPT1NUX0NIRUNLX0VRVUFMKG91dCwgR2V0U3RhdGUobW9kZWwsIHdvcmQsIHN0YXRlKSk7CisKKyNkZWZpbmUgQXBwZW5kVGVzdCh3b3JkLCBuZ3JhbSwgc2NvcmUsIGluZGVwX2xlZnQpIFwKKyAgU3RhcnRUZXN0KHdvcmQsIG5ncmFtLCBzY29yZSwgaW5kZXBfbGVmdCkgXAorICBzdGF0ZSA9IG91dDsKKwordGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgU3RhcnRlcnMoY29uc3QgTSAmbW9kZWwpIHsKKyAgRnVsbFNjb3JlUmV0dXJuIHJldDsKKyAgTW9kZWw6OlN0YXRlIHN0YXRlKG1vZGVsLkJlZ2luU2VudGVuY2VTdGF0ZSgpKTsKKyAgTW9kZWw6OlN0YXRlIG91dDsKKworICBTdGFydFRlc3QoImxvb2tpbmciLCAyLCAtMC40ODQ2NTIyLCB0cnVlKTsKKworICAvLyAsIHByb2JhYmlsaXR5IHBsdXMgPHM+IGJhY2tvZmYKKyAgU3RhcnRUZXN0KCIsIiwgMSwgLTEuMzgzNTE0ICsgLTAuNDE0OTczMywgdHJ1ZSk7CisgIC8vIDx1bms+IHByb2JhYmlsaXR5IHBsdXMgPHM+IGJhY2tvZmYKKyAgU3RhcnRUZXN0KCJ0aGlzX2lzX25vdF9mb3VuZCIsIDEsIC0xLjk5NTYzNSArIC0wLjQxNDk3MzMsIHRydWUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTT4gdm9pZCBDb250aW51YXRpb24oY29uc3QgTSAmbW9kZWwpIHsKKyAgRnVsbFNjb3JlUmV0dXJuIHJldDsKKyAgTW9kZWw6OlN0YXRlIHN0YXRlKG1vZGVsLkJlZ2luU2VudGVuY2VTdGF0ZSgpKTsKKyAgTW9kZWw6OlN0YXRlIG91dDsKKworICBBcHBlbmRUZXN0KCJsb29raW5nIiwgMiwgLTAuNDg0NjUyLCB0cnVlKTsKKyAgQXBwZW5kVGVzdCgib24iLCAzLCAtMC4zNDg4MzcsIHRydWUpOworICBBcHBlbmRUZXN0KCJhIiwgNCwgLTAuMDE1NTI2NiwgdHJ1ZSk7CisgIEFwcGVuZFRlc3QoImxpdHRsZSIsIDUsIC0wLjAwMzA2MTIyLCB0cnVlKTsKKyAgU3RhdGUgcHJlc2VydmUgPSBzdGF0ZTsKKyAgQXBwZW5kVGVzdCgidGhlIiwgMSwgLTQuMDQwMDUsIHRydWUpOworICBBcHBlbmRUZXN0KCJiaWFycml0eiIsIDEsIC0xLjk4ODksIHRydWUpOworICBBcHBlbmRUZXN0KCJub3RfZm91bmQiLCAxLCAtMi4yOTY2NiwgdHJ1ZSk7CisgIEFwcGVuZFRlc3QoIm1vcmUiLCAxLCAtMS4yMDYzMiAtIDIwLjAsIHRydWUpOworICBBcHBlbmRUZXN0KCIuIiwgMiwgLTAuNTEzNjMsIHRydWUpOworICBBcHBlbmRUZXN0KCI8L3M+IiwgMywgLTAuMDE5MTY1MSwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHN0YXRlLmxlbmd0aCk7CisKKyAgc3RhdGUgPSBwcmVzZXJ2ZTsKKyAgQXBwZW5kVGVzdCgibW9yZSIsIDUsIC0wLjAwMTgxMzk1LCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoNCwgc3RhdGUubGVuZ3RoKTsKKyAgQXBwZW5kVGVzdCgibG9pbiIsIDUsIC0wLjA0MzI1NTcsIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBzdGF0ZS5sZW5ndGgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTT4gdm9pZCBCbGFua3MoY29uc3QgTSAmbW9kZWwpIHsKKyAgRnVsbFNjb3JlUmV0dXJuIHJldDsKKyAgU3RhdGUgc3RhdGUobW9kZWwuTnVsbENvbnRleHRTdGF0ZSgpKTsKKyAgU3RhdGUgb3V0OworICBBcHBlbmRUZXN0KCJhbHNvIiwgMSwgLTEuNjg3ODcyLCBmYWxzZSk7CisgIEFwcGVuZFRlc3QoIndvdWxkIiwgMiwgLTIsIHRydWUpOworICBBcHBlbmRUZXN0KCJjb25zaWRlciIsIDMsIC0zLCB0cnVlKTsKKyAgU3RhdGUgcHJlc2VydmUgPSBzdGF0ZTsKKyAgQXBwZW5kVGVzdCgiaGlnaGVyIiwgNCwgLTQsIHRydWUpOworICBBcHBlbmRUZXN0KCJsb29raW5nIiwgNSwgLTUsIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBzdGF0ZS5sZW5ndGgpOworCisgIHN0YXRlID0gcHJlc2VydmU7CisgIC8vIGFsc28gd291bGQgY29uc2lkZXIgbm90X2ZvdW5kCisgIEFwcGVuZFRlc3QoIm5vdF9mb3VuZCIsIDEsIC0xLjk5NTYzNSAtIDcuMCAtIDAuMzAxMDMsIHRydWUpOworCisgIHN0YXRlID0gbW9kZWwuTnVsbENvbnRleHRTdGF0ZSgpOworICAvLyBoaWdoZXIgbG9va2luZyBpcyBhIGJsYW5rLgorICBBcHBlbmRUZXN0KCJoaWdoZXIiLCAxLCAtMS41MDk1NTksIGZhbHNlKTsKKyAgQXBwZW5kVGVzdCgibG9va2luZyIsIDIsIC0xLjI4NTk0MSAtIDAuMzAxMDMsIGZhbHNlKTsKKworICBTdGF0ZSBoaWdoZXJfbG9va2luZyA9IHN0YXRlOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKDEsIHN0YXRlLmxlbmd0aCk7CisgIEFwcGVuZFRlc3QoIm5vdF9mb3VuZCIsIDEsIC0xLjk5NTYzNSAtIDAuNDc3MTIxMiwgdHJ1ZSk7CisKKyAgc3RhdGUgPSBoaWdoZXJfbG9va2luZzsKKyAgLy8gaGlnaGVyIGxvb2tpbmcgY29uc2lkZXIKKyAgQXBwZW5kVGVzdCgiY29uc2lkZXIiLCAxLCAtMS42ODc4NzIgLSAwLjQ3NzEyMTIsIHRydWUpOworCisgIHN0YXRlID0gbW9kZWwuTnVsbENvbnRleHRTdGF0ZSgpOworICBBcHBlbmRUZXN0KCJ3b3VsZCIsIDEsIC0xLjY4Nzg3MiwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBzdGF0ZS5sZW5ndGgpOworICBBcHBlbmRUZXN0KCJjb25zaWRlciIsIDIsIC0xLjY4Nzg3MiAtMC4zMDEwMywgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTCgyLCBzdGF0ZS5sZW5ndGgpOworICBBcHBlbmRUZXN0KCJoaWdoZXIiLCAzLCAtMS41MDk1NTkgLSAwLjMwMTAzLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDMsIHN0YXRlLmxlbmd0aCk7CisgIEFwcGVuZFRlc3QoImxvb2tpbmciLCA0LCAtMS4yODU5NDEgLSAwLjMwMTAzLCBmYWxzZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBNPiB2b2lkIFVua25vd25zKGNvbnN0IE0gJm1vZGVsKSB7CisgIEZ1bGxTY29yZVJldHVybiByZXQ7CisgIFN0YXRlIHN0YXRlKG1vZGVsLk51bGxDb250ZXh0U3RhdGUoKSk7CisgIFN0YXRlIG91dDsKKworICBBcHBlbmRUZXN0KCJub3RfZm91bmQiLCAxLCAtMS45OTU2MzUsIGZhbHNlKTsKKyAgU3RhdGUgcHJlc2VydmUgPSBzdGF0ZTsKKyAgQXBwZW5kVGVzdCgibm90X2ZvdW5kMiIsIDIsIC0xNS4wLCB0cnVlKTsKKyAgQXBwZW5kVGVzdCgibm90X2ZvdW5kMyIsIDIsIC0xNS4wIC0gMi4wLCB0cnVlKTsKKworICBzdGF0ZSA9IHByZXNlcnZlOworICBBcHBlbmRUZXN0KCJob3dldmVyIiwgMiwgLTQsIHRydWUpOworICBBcHBlbmRUZXN0KCJub3RfZm91bmQzIiwgMywgLTYsIHRydWUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTT4gdm9pZCBNaW5pbWFsU3RhdGUoY29uc3QgTSAmbW9kZWwpIHsKKyAgRnVsbFNjb3JlUmV0dXJuIHJldDsKKyAgU3RhdGUgc3RhdGUobW9kZWwuTnVsbENvbnRleHRTdGF0ZSgpKTsKKyAgU3RhdGUgb3V0OworCisgIEFwcGVuZFRlc3QoImJheiIsIDEsIC02LjUzNTg5NywgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHN0YXRlLmxlbmd0aCk7CisgIHN0YXRlID0gbW9kZWwuTnVsbENvbnRleHRTdGF0ZSgpOworICBBcHBlbmRUZXN0KCJmb28iLCAxLCAtMy4xNDE1OTIsIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBzdGF0ZS5sZW5ndGgpOworICBBcHBlbmRUZXN0KCJiYXIiLCAyLCAtNi4wLCB0cnVlKTsKKyAgLy8gSGFzIHRvIGluY2x1ZGUgdGhlIGJhY2tvZmYgd2VpZ2h0LgorICBCT09TVF9DSEVDS19FUVVBTCgxLCBzdGF0ZS5sZW5ndGgpOworICBBcHBlbmRUZXN0KCJiYXIiLCAxLCAtMi43MTgyODEgKyAzLjAsIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBzdGF0ZS5sZW5ndGgpOworCisgIHN0YXRlID0gbW9kZWwuTnVsbENvbnRleHRTdGF0ZSgpOworICBBcHBlbmRUZXN0KCJ0byIsIDEsIC0xLjY4Nzg3MiwgZmFsc2UpOworICBBcHBlbmRUZXN0KCJsb29rIiwgMiwgLTAuMjkyMjA5NSwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHN0YXRlLmxlbmd0aCk7CisgIEFwcGVuZFRlc3QoImEiLCAzLCAtNywgdHJ1ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBNPiB2b2lkIEV4dGVuZExlZnRUZXN0KGNvbnN0IE0gJm1vZGVsKSB7CisgIFN0YXRlIHJpZ2h0OworICBGdWxsU2NvcmVSZXR1cm4gbGl0dGxlKG1vZGVsLkZ1bGxTY29yZShtb2RlbC5OdWxsQ29udGV4dFN0YXRlKCksIG1vZGVsLkdldFZvY2FidWxhcnkoKS5JbmRleCgibGl0dGxlIiksIHJpZ2h0KSk7CisgIGNvbnN0IGZsb2F0IGtMaXR0bGVQcm9iID0gLTEuMjg1OTQxOworICBTTE9QUFlfQ0hFQ0tfQ0xPU0Uoa0xpdHRsZVByb2IsIGxpdHRsZS5wcm9iLCAwLjAwMSk7CisgIHVuc2lnbmVkIGNoYXIgbmV4dF91c2U7CisgIGZsb2F0IGJhY2tvZmZfb3V0WzRdOworCisgIEZ1bGxTY29yZVJldHVybiBleHRlbmRfbm9uZShtb2RlbC5FeHRlbmRMZWZ0KE5VTEwsIE5VTEwsIE5VTEwsIGxpdHRsZS5leHRlbmRfbGVmdCwgMSwgTlVMTCwgbmV4dF91c2UpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgbmV4dF91c2UpOworICBCT09TVF9DSEVDS19FUVVBTChsaXR0bGUuZXh0ZW5kX2xlZnQsIGV4dGVuZF9ub25lLmV4dGVuZF9sZWZ0KTsKKyAgU0xPUFBZX0NIRUNLX0NMT1NFKGxpdHRsZS5wcm9iIC0gbGl0dGxlLnJlc3QsIGV4dGVuZF9ub25lLnByb2IsIDAuMDAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgZXh0ZW5kX25vbmUubmdyYW1fbGVuZ3RoKTsKKworICBjb25zdCBXb3JkSW5kZXggYSA9IG1vZGVsLkdldFZvY2FidWxhcnkoKS5JbmRleCgiYSIpOworICBmbG9hdCBiYWNrb2ZmX2luID0gMy4xNDsKKyAgLy8gYSBsaXR0bGUKKyAgRnVsbFNjb3JlUmV0dXJuIGV4dGVuZF9hKG1vZGVsLkV4dGVuZExlZnQoJmEsICZhICsgMSwgJmJhY2tvZmZfaW4sIGxpdHRsZS5leHRlbmRfbGVmdCwgMSwgYmFja29mZl9vdXQsIG5leHRfdXNlKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDEsIG5leHRfdXNlKTsKKyAgU0xPUFBZX0NIRUNLX0NMT1NFKC0wLjY5ODk3LCBiYWNrb2ZmX291dFswXSwgMC4wMDEpOworICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTAuMDkxMzI1NDcgLSBsaXR0bGUucmVzdCwgZXh0ZW5kX2EucHJvYiwgMC4wMDEpOworICBCT09TVF9DSEVDS19FUVVBTCgyLCBleHRlbmRfYS5uZ3JhbV9sZW5ndGgpOworICBCT09TVF9DSEVDSyghZXh0ZW5kX2EuaW5kZXBlbmRlbnRfbGVmdCk7CisKKyAgY29uc3QgV29yZEluZGV4IG9uID0gbW9kZWwuR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KCJvbiIpOworICBGdWxsU2NvcmVSZXR1cm4gZXh0ZW5kX29uKG1vZGVsLkV4dGVuZExlZnQoJm9uLCAmb24gKyAxLCAmYmFja29mZl9pbiwgZXh0ZW5kX2EuZXh0ZW5kX2xlZnQsIDIsIGJhY2tvZmZfb3V0LCBuZXh0X3VzZSkpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBuZXh0X3VzZSk7CisgIFNMT1BQWV9DSEVDS19DTE9TRSgtMC40NzcxMjEyLCBiYWNrb2ZmX291dFswXSwgMC4wMDEpOworICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTAuMDI4MzYwMyAtIChleHRlbmRfYS5yZXN0ICsgbGl0dGxlLnJlc3QpLCBleHRlbmRfb24ucHJvYiwgMC4wMDEpOworICBCT09TVF9DSEVDS19FUVVBTCgzLCBleHRlbmRfb24ubmdyYW1fbGVuZ3RoKTsKKyAgQk9PU1RfQ0hFQ0soIWV4dGVuZF9vbi5pbmRlcGVuZGVudF9sZWZ0KTsKKworICBjb25zdCBXb3JkSW5kZXggYm90aFsyXSA9IHthLCBvbn07CisgIGZsb2F0IGJhY2tvZmZfaW5fYXJyWzRdOworICBGdWxsU2NvcmVSZXR1cm4gZXh0ZW5kX2JvdGgobW9kZWwuRXh0ZW5kTGVmdChib3RoLCBib3RoICsgMiwgYmFja29mZl9pbl9hcnIsIGxpdHRsZS5leHRlbmRfbGVmdCwgMSwgYmFja29mZl9vdXQsIG5leHRfdXNlKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIG5leHRfdXNlKTsKKyAgU0xPUFBZX0NIRUNLX0NMT1NFKC0wLjY5ODk3LCBiYWNrb2ZmX291dFswXSwgMC4wMDEpOworICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTAuNDc3MTIxMiwgYmFja29mZl9vdXRbMV0sIDAuMDAxKTsKKyAgU0xPUFBZX0NIRUNLX0NMT1NFKC0wLjAyODM2MDMgLSBsaXR0bGUucmVzdCwgZXh0ZW5kX2JvdGgucHJvYiwgMC4wMDEpOworICBCT09TVF9DSEVDS19FUVVBTCgzLCBleHRlbmRfYm90aC5uZ3JhbV9sZW5ndGgpOworICBCT09TVF9DSEVDSyghZXh0ZW5kX2JvdGguaW5kZXBlbmRlbnRfbGVmdCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV4dGVuZF9vbi5leHRlbmRfbGVmdCwgZXh0ZW5kX2JvdGguZXh0ZW5kX2xlZnQpOworfQorCisjZGVmaW5lIFN0YXRlbGVzc1Rlc3Qod29yZCwgcHJvdmlkZSwgbmdyYW0sIHNjb3JlKSBcCisgIHJldCA9IG1vZGVsLkZ1bGxTY29yZUZvcmdvdFN0YXRlKGluZGljZXMgKyBudW1fd29yZHMgLSB3b3JkLCBpbmRpY2VzICsgbnVtX3dvcmRzIC0gd29yZCArIHByb3ZpZGUsIGluZGljZXNbbnVtX3dvcmRzIC0gd29yZCAtIDFdLCBzdGF0ZSk7IFwKKyAgU0xPUFBZX0NIRUNLX0NMT1NFKHNjb3JlLCByZXQucHJvYiwgMC4wMDEpOyBcCisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4obmdyYW0pLCByZXQubmdyYW1fbGVuZ3RoKTsgXAorICBtb2RlbC5HZXRTdGF0ZShpbmRpY2VzICsgbnVtX3dvcmRzIC0gd29yZCwgaW5kaWNlcyArIG51bV93b3JkcyAtIHdvcmQgKyBwcm92aWRlLCBiZWZvcmUpOyBcCisgIHJldCA9IG1vZGVsLkZ1bGxTY29yZShiZWZvcmUsIGluZGljZXNbbnVtX3dvcmRzIC0gd29yZCAtIDFdLCBvdXQpOyBcCisgIEJPT1NUX0NIRUNLKHN0YXRlID09IG91dCk7IFwKKyAgU0xPUFBZX0NIRUNLX0NMT1NFKHNjb3JlLCByZXQucHJvYiwgMC4wMDEpOyBcCisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4obmdyYW0pLCByZXQubmdyYW1fbGVuZ3RoKTsKKwordGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgU3RhdGVsZXNzKGNvbnN0IE0gJm1vZGVsKSB7CisgIGNvbnN0IGNoYXIgKndvcmRzW10gPSB7IjxzPiIsICJsb29raW5nIiwgIm9uIiwgImEiLCAibGl0dGxlIiwgInRoZSIsICJiaWFycml0eiIsICJub3RfZm91bmQiLCAibW9yZSIsICIuIiwgIjwvcz4ifTsKKyAgY29uc3Qgc2l6ZV90IG51bV93b3JkcyA9IHNpemVvZih3b3JkcykgLyBzaXplb2YoY29uc3QgY2hhciopOworICAvLyBTaWxpZW5jZSAiYXJyYXkgc3Vic2NyaXB0IGlzIGFib3ZlIGFycmF5IGJvdW5kcyIgd2hlbiBleHRyYWN0aW5nIGVuZCBwb2ludGVyLgorICBXb3JkSW5kZXggaW5kaWNlc1tudW1fd29yZHMgKyAxXTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBudW1fd29yZHM7ICsraSkgeworICAgIGluZGljZXNbbnVtX3dvcmRzIC0gMSAtIGldID0gbW9kZWwuR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KHdvcmRzW2ldKTsKKyAgfQorICBGdWxsU2NvcmVSZXR1cm4gcmV0OworICBTdGF0ZSBzdGF0ZSwgb3V0LCBiZWZvcmU7CisKKyAgcmV0ID0gbW9kZWwuRnVsbFNjb3JlRm9yZ290U3RhdGUoaW5kaWNlcyArIG51bV93b3JkcyAtIDEsIGluZGljZXMgKyBudW1fd29yZHMsIGluZGljZXNbbnVtX3dvcmRzIC0gMl0sIHN0YXRlKTsKKyAgU0xPUFBZX0NIRUNLX0NMT1NFKC0wLjQ4NDY1MiwgcmV0LnByb2IsIDAuMDAxKTsKKyAgU3RhdGVsZXNzVGVzdCgxLCAxLCAyLCAtMC40ODQ2NTIpOworCisgIC8vIGxvb2tpbmcKKyAgU3RhdGVsZXNzVGVzdCgxLCAyLCAyLCAtMC40ODQ2NTIpOworICAvLyBvbgorICBBcHBlbmRUZXN0KCJvbiIsIDMsIC0wLjM0ODgzNywgdHJ1ZSk7CisgIFN0YXRlbGVzc1Rlc3QoMiwgMywgMywgLTAuMzQ4ODM3KTsKKyAgU3RhdGVsZXNzVGVzdCgyLCAyLCAzLCAtMC4zNDg4MzcpOworICBTdGF0ZWxlc3NUZXN0KDIsIDEsIDIsIC0wLjQ2Mzg5MDMpOworICAvLyBhCisgIFN0YXRlbGVzc1Rlc3QoMywgNCwgNCwgLTAuMDE1NTI2Nik7CisgIC8vIGxpdHRsZQorICBBcHBlbmRUZXN0KCJsaXR0bGUiLCA1LCAtMC4wMDMwNjEyMiwgdHJ1ZSk7CisgIFN0YXRlbGVzc1Rlc3QoNCwgNSwgNSwgLTAuMDAzMDYxMjIpOworICAvLyB0aGUKKyAgQXBwZW5kVGVzdCgidGhlIiwgMSwgLTQuMDQwMDUsIHRydWUpOworICBTdGF0ZWxlc3NUZXN0KDUsIDUsIDEsIC00LjA0MDA1KTsKKyAgLy8gTm8gY29udGV4dCBvZiB0aGUuCisgIFN0YXRlbGVzc1Rlc3QoNSwgMCwgMSwgLTEuNjg3ODcyKTsKKyAgLy8gYmlhcnJpdHoKKyAgU3RhdGVsZXNzVGVzdCg2LCAxLCAxLCAtMS45ODg5KTsKKyAgLy8gbm90IGZvdW5kCisgIFN0YXRlbGVzc1Rlc3QoNywgMSwgMSwgLTIuMjk2NjYpOworICBTdGF0ZWxlc3NUZXN0KDcsIDAsIDEsIC0xLjk5NTYzNSk7CisKKyAgV29yZEluZGV4IHVua1sxXTsKKyAgdW5rWzBdID0gMDsKKyAgbW9kZWwuR2V0U3RhdGUodW5rLCB1bmsgKyAxLCBzdGF0ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDEsIHN0YXRlLmxlbmd0aCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PFdvcmRJbmRleD4oMCksIHN0YXRlLndvcmRzWzBdKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgTm9VbmtDaGVjayhjb25zdCBNICZtb2RlbCkgeworICBXb3JkSW5kZXggdW5rX2luZGV4ID0gMDsKKyAgU3RhdGUgc3RhdGU7CisKKyAgRnVsbFNjb3JlUmV0dXJuIHJldCA9IG1vZGVsLkZ1bGxTY29yZUZvcmdvdFN0YXRlKCZ1bmtfaW5kZXgsICZ1bmtfaW5kZXggKyAxLCB1bmtfaW5kZXgsIHN0YXRlKTsKKyAgU0xPUFBZX0NIRUNLX0NMT1NFKC0xMDAuMCwgcmV0LnByb2IsIDAuMDAxKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIE0+IHZvaWQgRXZlcnl0aGluZyhjb25zdCBNICZtKSB7CisgIFN0YXJ0ZXJzKG0pOworICBDb250aW51YXRpb24obSk7CisgIEJsYW5rcyhtKTsKKyAgVW5rbm93bnMobSk7CisgIE1pbmltYWxTdGF0ZShtKTsKKyAgRXh0ZW5kTGVmdFRlc3QobSk7CisgIFN0YXRlbGVzcyhtKTsKK30KKworY2xhc3MgRXhwZWN0RW51bWVyYXRlVm9jYWIgOiBwdWJsaWMgRW51bWVyYXRlVm9jYWIgeworICBwdWJsaWM6CisgICAgRXhwZWN0RW51bWVyYXRlVm9jYWIoKSB7fQorCisgICAgdm9pZCBBZGQoV29yZEluZGV4IGluZGV4LCBjb25zdCBTdHJpbmdQaWVjZSAmc3RyKSB7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChzZWVuLnNpemUoKSwgaW5kZXgpOworICAgICAgc2Vlbi5wdXNoX2JhY2soc3RkOjpzdHJpbmcoc3RyLmRhdGEoKSwgc3RyLmxlbmd0aCgpKSk7CisgICAgfQorCisgICAgdm9pZCBDaGVjayhjb25zdCBiYXNlOjpWb2NhYnVsYXJ5ICZ2b2NhYikgeworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMzdVTEwsIHNlZW4uc2l6ZSgpKTsKKyAgICAgIEJPT1NUX1JFUVVJUkUoIXNlZW4uZW1wdHkoKSk7CisgICAgICBCT09TVF9DSEVDS19FUVVBTCgiPHVuaz4iLCBzZWVuWzBdKTsKKyAgICAgIGZvciAoV29yZEluZGV4IGkgPSAwOyBpIDwgc2Vlbi5zaXplKCk7ICsraSkgeworICAgICAgICBCT09TVF9DSEVDS19FUVVBTChpLCB2b2NhYi5JbmRleChzZWVuW2ldKSk7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBDbGVhcigpIHsKKyAgICAgIHNlZW4uY2xlYXIoKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2VlbjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBNb2RlbFQ+IHZvaWQgTG9hZGluZ1Rlc3QoKSB7CisgIENvbmZpZyBjb25maWc7CisgIGNvbmZpZy5hcnBhX2NvbXBsYWluID0gQ29uZmlnOjpOT05FOworICBjb25maWcubWVzc2FnZXMgPSBOVUxMOworICBjb25maWcucHJvYmluZ19tdWx0aXBsaWVyID0gMi4wOworICB7CisgICAgRXhwZWN0RW51bWVyYXRlVm9jYWIgZW51bWVyYXRlOworICAgIGNvbmZpZy5lbnVtZXJhdGVfdm9jYWIgPSAmZW51bWVyYXRlOworICAgIE1vZGVsVCBtKFRlc3RMb2NhdGlvbigpLCBjb25maWcpOworICAgIGVudW1lcmF0ZS5DaGVjayhtLkdldFZvY2FidWxhcnkoKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoKFdvcmRJbmRleCkzNywgbS5HZXRWb2NhYnVsYXJ5KCkuQm91bmQoKSk7CisgICAgRXZlcnl0aGluZyhtKTsKKyAgfQorICB7CisgICAgRXhwZWN0RW51bWVyYXRlVm9jYWIgZW51bWVyYXRlOworICAgIGNvbmZpZy5lbnVtZXJhdGVfdm9jYWIgPSAmZW51bWVyYXRlOworICAgIE1vZGVsVCBtKFRlc3ROb1Vua0xvY2F0aW9uKCksIGNvbmZpZyk7CisgICAgZW51bWVyYXRlLkNoZWNrKG0uR2V0Vm9jYWJ1bGFyeSgpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTCgoV29yZEluZGV4KTM3LCBtLkdldFZvY2FidWxhcnkoKS5Cb3VuZCgpKTsKKyAgICBOb1Vua0NoZWNrKG0pOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHByb2JpbmcpIHsKKyAgTG9hZGluZ1Rlc3Q8TW9kZWw+KCk7Cit9CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0cmllKSB7CisgIExvYWRpbmdUZXN0PFRyaWVNb2RlbD4oKTsKK30KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHF1YW50X3RyaWUpIHsKKyAgTG9hZGluZ1Rlc3Q8UXVhbnRUcmllTW9kZWw+KCk7Cit9CitCT09TVF9BVVRPX1RFU1RfQ0FTRShiaGlrc2hhX3RyaWUpIHsKKyAgTG9hZGluZ1Rlc3Q8QXJyYXlUcmllTW9kZWw+KCk7Cit9CitCT09TVF9BVVRPX1RFU1RfQ0FTRShxdWFudF9iaGlrc2hhX3RyaWUpIHsKKyAgTG9hZGluZ1Rlc3Q8UXVhbnRBcnJheVRyaWVNb2RlbD4oKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIE1vZGVsVD4gdm9pZCBCaW5hcnlUZXN0KENvbmZpZzo6V3JpdGVNZXRob2Qgd3JpdGVfbWV0aG9kKSB7CisgIENvbmZpZyBjb25maWc7CisgIGNvbmZpZy53cml0ZV9tbWFwID0gInRlc3QuYmluYXJ5IjsKKyAgY29uZmlnLm1lc3NhZ2VzID0gTlVMTDsKKyAgY29uZmlnLndyaXRlX21ldGhvZCA9IHdyaXRlX21ldGhvZDsKKyAgRXhwZWN0RW51bWVyYXRlVm9jYWIgZW51bWVyYXRlOworICBjb25maWcuZW51bWVyYXRlX3ZvY2FiID0gJmVudW1lcmF0ZTsKKworICB7CisgICAgTW9kZWxUIGNvcHlfbW9kZWwoVGVzdExvY2F0aW9uKCksIGNvbmZpZyk7CisgICAgZW51bWVyYXRlLkNoZWNrKGNvcHlfbW9kZWwuR2V0Vm9jYWJ1bGFyeSgpKTsKKyAgICBlbnVtZXJhdGUuQ2xlYXIoKTsKKyAgICBFdmVyeXRoaW5nKGNvcHlfbW9kZWwpOworICB9CisKKyAgY29uZmlnLndyaXRlX21tYXAgPSBOVUxMOworCisgIE1vZGVsVHlwZSB0eXBlOworICBCT09TVF9SRVFVSVJFKFJlY29nbml6ZUJpbmFyeSgidGVzdC5iaW5hcnkiLCB0eXBlKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE1vZGVsVDo6a01vZGVsVHlwZSwgdHlwZSk7CisKKyAgeworICAgIE1vZGVsVCBiaW5hcnkoInRlc3QuYmluYXJ5IiwgY29uZmlnKTsKKyAgICBlbnVtZXJhdGUuQ2hlY2soYmluYXJ5LkdldFZvY2FidWxhcnkoKSk7CisgICAgRXZlcnl0aGluZyhiaW5hcnkpOworICB9CisgIHVubGluaygidGVzdC5iaW5hcnkiKTsKKworICAvLyBOb3cgdGVzdCB3aXRob3V0IDx1bms+LgorICBjb25maWcud3JpdGVfbW1hcCA9ICJ0ZXN0X25vdW5rLmJpbmFyeSI7CisgIGNvbmZpZy5tZXNzYWdlcyA9IE5VTEw7CisgIGVudW1lcmF0ZS5DbGVhcigpOworICB7CisgICAgTW9kZWxUIGNvcHlfbW9kZWwoVGVzdE5vVW5rTG9jYXRpb24oKSwgY29uZmlnKTsKKyAgICBlbnVtZXJhdGUuQ2hlY2soY29weV9tb2RlbC5HZXRWb2NhYnVsYXJ5KCkpOworICAgIGVudW1lcmF0ZS5DbGVhcigpOworICAgIE5vVW5rQ2hlY2soY29weV9tb2RlbCk7CisgIH0KKyAgY29uZmlnLndyaXRlX21tYXAgPSBOVUxMOworICB7CisgICAgTW9kZWxUIGJpbmFyeShUZXN0Tm9VbmtMb2NhdGlvbigpLCBjb25maWcpOworICAgIGVudW1lcmF0ZS5DaGVjayhiaW5hcnkuR2V0Vm9jYWJ1bGFyeSgpKTsKKyAgICBOb1Vua0NoZWNrKGJpbmFyeSk7CisgIH0KKyAgdW5saW5rKCJ0ZXN0X25vdW5rLmJpbmFyeSIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTW9kZWxUPiB2b2lkIEJpbmFyeVRlc3QoKSB7CisgIEJpbmFyeVRlc3Q8TW9kZWxUPihDb25maWc6OldSSVRFX01NQVApOworICBCaW5hcnlUZXN0PE1vZGVsVD4oQ29uZmlnOjpXUklURV9BRlRFUik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHdyaXRlX2FuZF9yZWFkX3Byb2JpbmcpIHsKKyAgQmluYXJ5VGVzdDxQcm9iaW5nTW9kZWw+KCk7Cit9CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh3cml0ZV9hbmRfcmVhZF9yZXN0X3Byb2JpbmcpIHsKKyAgQmluYXJ5VGVzdDxSZXN0UHJvYmluZ01vZGVsPigpOworfQorQk9PU1RfQVVUT19URVNUX0NBU0Uod3JpdGVfYW5kX3JlYWRfdHJpZSkgeworICBCaW5hcnlUZXN0PFRyaWVNb2RlbD4oKTsKK30KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHdyaXRlX2FuZF9yZWFkX3F1YW50X3RyaWUpIHsKKyAgQmluYXJ5VGVzdDxRdWFudFRyaWVNb2RlbD4oKTsKK30KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHdyaXRlX2FuZF9yZWFkX2FycmF5X3RyaWUpIHsKKyAgQmluYXJ5VGVzdDxBcnJheVRyaWVNb2RlbD4oKTsKK30KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHdyaXRlX2FuZF9yZWFkX3F1YW50X2FycmF5X3RyaWUpIHsKKyAgQmluYXJ5VGVzdDxRdWFudEFycmF5VHJpZU1vZGVsPigpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShyZXN0X21heCkgeworICBDb25maWcgY29uZmlnOworICBjb25maWcuYXJwYV9jb21wbGFpbiA9IENvbmZpZzo6Tk9ORTsKKyAgY29uZmlnLm1lc3NhZ2VzID0gTlVMTDsKKworICBSZXN0UHJvYmluZ01vZGVsIG1vZGVsKFRlc3RMb2NhdGlvbigpLCBjb25maWcpOworICBTdGF0ZSBzdGF0ZSwgb3V0OworICBGdWxsU2NvcmVSZXR1cm4gcmV0KG1vZGVsLkZ1bGxTY29yZShtb2RlbC5OdWxsQ29udGV4dFN0YXRlKCksIG1vZGVsLkdldFZvY2FidWxhcnkoKS5JbmRleCgiLiIpLCBzdGF0ZSkpOworICBTTE9QUFlfQ0hFQ0tfQ0xPU0UoLTAuMjcwNTkxOCwgcmV0LnJlc3QsIDAuMDAxKTsKKyAgU0xPUFBZX0NIRUNLX0NMT1NFKC0wLjAxOTE2NTEyLCBtb2RlbC5GdWxsU2NvcmUoc3RhdGUsIG1vZGVsLkdldFZvY2FidWxhcnkoKS5FbmRTZW50ZW5jZSgpLCBvdXQpLnJlc3QsIDAuMDAxKTsKK30KKworfSAvLyBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIG5ncmFtCit9IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL21vZGVsX3R5cGUuaGggYi9zcmMva2VubG0vbG0vbW9kZWxfdHlwZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2RjNmFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL21vZGVsX3R5cGUuaGgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBMTV9NT0RFTF9UWVBFX0gKKyNkZWZpbmUgTE1fTU9ERUxfVFlQRV9ICisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgbmdyYW0geworCisvKiBOb3QgdGhlIGJlc3QgbnVtYmVyaW5nIHN5c3RlbSwgYnV0IGl0IGdyZXcgdGhpcyB3YXkgZm9yIGhpc3RvcmljYWwgcmVhc29ucworICogYW5kIEkgd2FudCB0byBwcmVzZXJ2ZSBleGlzdGluZyBiaW5hcnkgZmlsZXMuICovCit0eXBlZGVmIGVudW0ge1BST0JJTkc9MCwgUkVTVF9QUk9CSU5HPTEsIFRSSUU9MiwgUVVBTlRfVFJJRT0zLCBBUlJBWV9UUklFPTQsIFFVQU5UX0FSUkFZX1RSSUU9NX0gTW9kZWxUeXBlOworCisvLyBIaXN0b3JpY2FsIG5hbWVzLgorY29uc3QgTW9kZWxUeXBlIEhBU0hfUFJPQklORyA9IFBST0JJTkc7Citjb25zdCBNb2RlbFR5cGUgVFJJRV9TT1JURUQgPSBUUklFOworY29uc3QgTW9kZWxUeXBlIFFVQU5UX1RSSUVfU09SVEVEID0gUVVBTlRfVFJJRTsKK2NvbnN0IE1vZGVsVHlwZSBBUlJBWV9UUklFX1NPUlRFRCA9IEFSUkFZX1RSSUU7Citjb25zdCBNb2RlbFR5cGUgUVVBTlRfQVJSQVlfVFJJRV9TT1JURUQgPSBRVUFOVF9BUlJBWV9UUklFOworCitjb25zdCBzdGF0aWMgTW9kZWxUeXBlIGtRdWFudEFkZCA9IHN0YXRpY19jYXN0PE1vZGVsVHlwZT4oUVVBTlRfVFJJRSAtIFRSSUUpOworY29uc3Qgc3RhdGljIE1vZGVsVHlwZSBrQXJyYXlBZGQgPSBzdGF0aWNfY2FzdDxNb2RlbFR5cGU+KEFSUkFZX1RSSUUgLSBUUklFKTsKKworfSAvLyBuYW1lc3BhY2UgbmdyYW0KK30gLy8gbmFtZXNwYWNlIGxtCisjZW5kaWYgLy8gTE1fTU9ERUxfVFlQRV9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vbmV1cmFsL0phbWZpbGUgYi9zcmMva2VubG0vbG0vbmV1cmFsL0phbWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjZDhlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9uZXVyYWwvSmFtZmlsZQpAQCAtMCwwICsxLDYgQEAKK3dpdGgtZWlnZW4gPSBbIG9wdGlvbi5nZXQgIndpdGgtZWlnZW4iIF0gOworaWYgISAkKHdpdGgtZWlnZW4pICYmICEgWyB0ZXN0X2ZsYWdzICIiIDogIiNpbmNsdWRlIDxFaWdlbi9EZW5zZT5cbmludCBtYWluKCkge30iIF0geworICB3aXRoLWVpZ2VuID0gIi91c3IvaW5jbHVkZS9laWdlbjMiIDsKK30KK3dpdGgtZWlnZW4gPSA8aW5jbHVkZT4kKHdpdGgtZWlnZW4pIDsKK2Zha2VsaWIgbmV1cmFsIDogLi4vL2tlbmxtIHdvcmR2ZWNzLmNjIDogJCh3aXRoLWVpZ2VuKSA6IDogPGN4eGZsYWdzPi1mb3Blbm1wIDxsaW5rZmxhZ3M+LWZvcGVubXAgJCh3aXRoLWVpZ2VuKSA7CmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vbmV1cmFsL3dvcmR2ZWNzLmhoIGIvc3JjL2tlbmxtL2xtL25ldXJhbC93b3JkdmVjcy5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjFhMmIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL25ldXJhbC93b3JkdmVjcy5oaApAQCAtMCwwICsxLDM4IEBACisjaWZuZGVmIExNX05FVVJBTF9XT1JEVkVDU19ICisjZGVmaW5lIExNX05FVVJBTF9XT1JEVkVDU19ICisKKyNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKKyNpbmNsdWRlICJsbS92b2NhYi5oaCIKKworI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCituYW1lc3BhY2UgdXRpbCB7IGNsYXNzIEZpbGVQaWVjZTsgfQorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ldXJhbCB7CisKK2NsYXNzIFdvcmRWZWNzIHsKKyAgcHVibGljOgorICAgIC8vIENvbHVtbnMgb2YgdGhlIG1hdHJpeCBhcmUgd29yZCB2ZWN0b3JzLiAgVGhlIGNvbHVtbiBpbmRleCBpcyB0aGUgd29yZC4KKyAgICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8ZmxvYXQsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkNvbE1ham9yPiBTdG9yYWdlOworCisgICAgLyogVGhlIGZpbGUgc2hvdWxkIGJlZ2luIHdpdGggYSBsaW5lIHN0YXRpbmcgdGhlIG51bWJlciBvZiB3b3JkIHZlY3RvcnMgYW5kCisgICAgICogdGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9ycy4gIFRoZW4gaXQncyBmb2xsb3dlZCBieSBsaW5lcyBjb250YWluaW5nIGEKKyAgICAgKiB3b3JkIGZvbGxvd2VkIGJ5IGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBXb3JkVmVjcyh1dGlsOjpGaWxlUGllY2UgJmluKTsKKworICAgIGNvbnN0IFN0b3JhZ2UgJlZlY3RvcnMoKSBjb25zdCB7IHJldHVybiB2ZWNzXzsgfQorCisgICAgV29yZEluZGV4IEluZGV4KFN0cmluZ1BpZWNlIHN0cikgY29uc3QgeyByZXR1cm4gdm9jYWJfLkluZGV4KHN0cik7IH0KKworICBwcml2YXRlOgorICAgIHV0aWw6OnNjb3BlZF9tYWxsb2Mgdm9jYWJfYmFja2luZ187CisgICAgbmdyYW06OlByb2JpbmdWb2NhYnVsYXJ5IHZvY2FiXzsKKworICAgIFN0b3JhZ2UgdmVjc187Cit9OworCit9fSAvLyBuYW1lc3BhY2VzCisKKyNlbmRpZiAvLyBMTV9ORVVSQUxfV09SRFZFQ1NfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL25ncmFtX3F1ZXJ5LmhoIGIvc3JjL2tlbmxtL2xtL25ncmFtX3F1ZXJ5LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzA4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vbmdyYW1fcXVlcnkuaGgKQEAgLTAsMCArMSwxMTMgQEAKKyNpZm5kZWYgTE1fTkdSQU1fUVVFUllfSAorI2RlZmluZSBMTV9OR1JBTV9RVUVSWV9ICisKKyNpbmNsdWRlICJsbS9lbnVtZXJhdGVfdm9jYWIuaGgiCisjaW5jbHVkZSAibG0vbW9kZWwuaGgiCisjaW5jbHVkZSAidXRpbC9maWxlX3N0cmVhbS5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCisjaW5jbHVkZSAidXRpbC91c2FnZS5oaCIKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGNtYXRoPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKKworY2xhc3MgUXVlcnlQcmludGVyIHsKKyAgcHVibGljOgorICAgIFF1ZXJ5UHJpbnRlcihpbnQgZmQsIGJvb2wgcHJpbnRfd29yZCwgYm9vbCBwcmludF9saW5lLCBib29sIHByaW50X3N1bW1hcnksIGJvb2wgZmx1c2gpCisgICAgICA6IG91dF8oZmQpLCBwcmludF93b3JkXyhwcmludF93b3JkKSwgcHJpbnRfbGluZV8ocHJpbnRfbGluZSksIHByaW50X3N1bW1hcnlfKHByaW50X3N1bW1hcnkpLCBmbHVzaF8oZmx1c2gpIHt9CisKKyAgICB2b2lkIFdvcmQoU3RyaW5nUGllY2Ugc3VyZmFjZSwgV29yZEluZGV4IHZvY2FiLCBjb25zdCBGdWxsU2NvcmVSZXR1cm4gJnJldCkgeworICAgICAgaWYgKCFwcmludF93b3JkXykgcmV0dXJuOworICAgICAgb3V0XyA8PCBzdXJmYWNlIDw8ICc9JyA8PCB2b2NhYiA8PCAnICcgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihyZXQubmdyYW1fbGVuZ3RoKSAgPDwgJyAnIDw8IHJldC5wcm9iIDw8ICdcdCc7CisgICAgICBpZiAoZmx1c2hfKSBvdXRfLmZsdXNoKCk7CisgICAgfQorCisgICAgdm9pZCBMaW5lKHVpbnQ2NF90IG9vdiwgZmxvYXQgdG90YWwpIHsKKyAgICAgIGlmICghcHJpbnRfbGluZV8pIHJldHVybjsKKyAgICAgIG91dF8gPDwgIlRvdGFsOiAiIDw8IHRvdGFsIDw8ICIgT09WOiAiIDw8IG9vdiA8PCAnXG4nOworICAgICAgaWYgKGZsdXNoXykgb3V0Xy5mbHVzaCgpOworICAgIH0KKworICAgIHZvaWQgU3VtbWFyeShkb3VibGUgcHBsX2luY2x1ZGluZ19vb3YsIGRvdWJsZSBwcGxfZXhjbHVkaW5nX29vdiwgdWludDY0X3QgY29ycHVzX29vdiwgdWludDY0X3QgY29ycHVzX3Rva2VucykgeworICAgICAgaWYgKCFwcmludF9zdW1tYXJ5XykgcmV0dXJuOworICAgICAgb3V0XyA8PAorICAgICAgICAiUGVycGxleGl0eSBpbmNsdWRpbmcgT09WczpcdCIgPDwgcHBsX2luY2x1ZGluZ19vb3YgPDwgIlxuIgorICAgICAgICAiUGVycGxleGl0eSBleGNsdWRpbmcgT09WczpcdCIgPDwgcHBsX2V4Y2x1ZGluZ19vb3YgPDwgIlxuIgorICAgICAgICAiT09WczpcdCIgPDwgY29ycHVzX29vdiA8PCAiXG4iCisgICAgICAgICJUb2tlbnM6XHQiIDw8IGNvcnB1c190b2tlbnMgPDwgJ1xuJzsKKyAgICAgIG91dF8uZmx1c2goKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB1dGlsOjpGaWxlU3RyZWFtIG91dF87CisgICAgYm9vbCBwcmludF93b3JkXzsKKyAgICBib29sIHByaW50X2xpbmVfOworICAgIGJvb2wgcHJpbnRfc3VtbWFyeV87CisgICAgYm9vbCBmbHVzaF87Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgTW9kZWwsIGNsYXNzIFByaW50ZXI+IHZvaWQgUXVlcnkoY29uc3QgTW9kZWwgJm1vZGVsLCBib29sIHNlbnRlbmNlX2NvbnRleHQsIFByaW50ZXIgJnByaW50ZXIpIHsKKyAgdHlwZW5hbWUgTW9kZWw6OlN0YXRlIHN0YXRlLCBvdXQ7CisgIGxtOjpGdWxsU2NvcmVSZXR1cm4gcmV0OworICBTdHJpbmdQaWVjZSB3b3JkOworCisgIHV0aWw6OkZpbGVQaWVjZSBpbigwKTsKKworICBkb3VibGUgY29ycHVzX3RvdGFsID0gMC4wOworICBkb3VibGUgY29ycHVzX3RvdGFsX29vdl9vbmx5ID0gMC4wOworICB1aW50NjRfdCBjb3JwdXNfb292ID0gMDsKKyAgdWludDY0X3QgY29ycHVzX3Rva2VucyA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGF0ZSA9IHNlbnRlbmNlX2NvbnRleHQgPyBtb2RlbC5CZWdpblNlbnRlbmNlU3RhdGUoKSA6IG1vZGVsLk51bGxDb250ZXh0U3RhdGUoKTsKKyAgICBmbG9hdCB0b3RhbCA9IDAuMDsKKyAgICB1aW50NjRfdCBvb3YgPSAwOworCisgICAgd2hpbGUgKGluLlJlYWRXb3JkU2FtZUxpbmUod29yZCkpIHsKKyAgICAgIGxtOjpXb3JkSW5kZXggdm9jYWIgPSBtb2RlbC5HZXRWb2NhYnVsYXJ5KCkuSW5kZXgod29yZCk7CisgICAgICByZXQgPSBtb2RlbC5GdWxsU2NvcmUoc3RhdGUsIHZvY2FiLCBvdXQpOworICAgICAgaWYgKHZvY2FiID09IG1vZGVsLkdldFZvY2FidWxhcnkoKS5Ob3RGb3VuZCgpKSB7CisgICAgICAgICsrb292OworICAgICAgICBjb3JwdXNfdG90YWxfb292X29ubHkgKz0gcmV0LnByb2I7CisgICAgICB9CisgICAgICB0b3RhbCArPSByZXQucHJvYjsKKyAgICAgIHByaW50ZXIuV29yZCh3b3JkLCB2b2NhYiwgcmV0KTsKKyAgICAgICsrY29ycHVzX3Rva2VuczsKKyAgICAgIHN0YXRlID0gb3V0OworICAgIH0KKyAgICAvLyBJZiBwZW9wbGUgZG9uJ3QgaGF2ZSBhIG5ld2xpbmUgYWZ0ZXIgdGhlaXIgbGFzdCBxdWVyeSwgdGhpcyB3b24ndCBhZGQgYSA8L3M+LgorICAgIC8vIFN1ZSBtZS4KKyAgICB0cnkgeworICAgICAgVVRJTF9USFJPV19JRignXG4nICE9IGluLmdldCgpLCB1dGlsOjpFeGNlcHRpb24sICJGaWxlUGllY2UgaXMgY29uZnVzZWQuIik7CisgICAgfSBjYXRjaCAoY29uc3QgdXRpbDo6RW5kT2ZGaWxlRXhjZXB0aW9uICZlKSB7IGJyZWFrOyB9CisgICAgaWYgKHNlbnRlbmNlX2NvbnRleHQpIHsKKyAgICAgIHJldCA9IG1vZGVsLkZ1bGxTY29yZShzdGF0ZSwgbW9kZWwuR2V0Vm9jYWJ1bGFyeSgpLkVuZFNlbnRlbmNlKCksIG91dCk7CisgICAgICB0b3RhbCArPSByZXQucHJvYjsKKyAgICAgICsrY29ycHVzX3Rva2VuczsKKyAgICAgIHByaW50ZXIuV29yZCgiPC9zPiIsIG1vZGVsLkdldFZvY2FidWxhcnkoKS5FbmRTZW50ZW5jZSgpLCByZXQpOworICAgIH0KKyAgICBwcmludGVyLkxpbmUob292LCB0b3RhbCk7CisgICAgY29ycHVzX3RvdGFsICs9IHRvdGFsOworICAgIGNvcnB1c19vb3YgKz0gb292OworICB9CisgIHByaW50ZXIuU3VtbWFyeSgKKyAgICAgIHBvdygxMC4wLCAtKGNvcnB1c190b3RhbCAvIHN0YXRpY19jYXN0PGRvdWJsZT4oY29ycHVzX3Rva2VucykpKSwgLy8gUFBMIGluY2x1ZGluZyBPT1ZzCisgICAgICBwb3coMTAuMCwgLSgoY29ycHVzX3RvdGFsIC0gY29ycHVzX3RvdGFsX29vdl9vbmx5KSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oY29ycHVzX3Rva2VucyAtIGNvcnB1c19vb3YpKSksIC8vIFBQTCBleGNsdWRpbmcgT09WcworICAgICAgY29ycHVzX29vdiwKKyAgICAgIGNvcnB1c190b2tlbnMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTW9kZWw+IHZvaWQgUXVlcnkoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgQ29uZmlnICZjb25maWcsIGJvb2wgc2VudGVuY2VfY29udGV4dCwgUXVlcnlQcmludGVyICZwcmludGVyKSB7CisgIE1vZGVsIG1vZGVsKGZpbGUsIGNvbmZpZyk7CisgIFF1ZXJ5PE1vZGVsLCBRdWVyeVByaW50ZXI+KG1vZGVsLCBzZW50ZW5jZV9jb250ZXh0LCBwcmludGVyKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmdyYW0KK30gLy8gbmFtZXNwYWNlIGxtCisKKyNlbmRpZiAvLyBMTV9OR1JBTV9RVUVSWV9ICisKKwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL3BhcnRpYWwuaGggYi9zcmMva2VubG0vbG0vcGFydGlhbC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTRlMzUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL3BhcnRpYWwuaGgKQEAgLTAsMCArMSwxNjYgQEAKKyNpZm5kZWYgTE1fUEFSVElBTF9ICisjZGVmaW5lIExNX1BBUlRJQUxfSAorCisjaW5jbHVkZSAibG0vcmV0dXJuLmhoIgorI2luY2x1ZGUgImxtL3N0YXRlLmhoIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgbmdyYW0geworCitzdHJ1Y3QgRXh0ZW5kUmV0dXJuIHsKKyAgZmxvYXQgYWRqdXN0OworICBib29sIG1ha2VfZnVsbDsKKyAgdW5zaWduZWQgY2hhciBuZXh0X3VzZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBNb2RlbD4gRXh0ZW5kUmV0dXJuIEV4dGVuZExvb3AoCisgICAgY29uc3QgTW9kZWwgJm1vZGVsLAorICAgIHVuc2lnbmVkIGNoYXIgc2VlbiwgY29uc3QgV29yZEluZGV4ICphZGRfcmJlZ2luLCBjb25zdCBXb3JkSW5kZXggKmFkZF9yZW5kLCBjb25zdCBmbG9hdCAqYmFja29mZl9zdGFydCwKKyAgICBjb25zdCB1aW50NjRfdCAqcG9pbnRlcnMsIGNvbnN0IHVpbnQ2NF90ICpwb2ludGVyc19lbmQsCisgICAgdWludDY0X3QgKiZwb2ludGVyc193cml0ZSwKKyAgICBmbG9hdCAqYmFja29mZl93cml0ZSkgeworICB1bnNpZ25lZCBjaGFyIGFkZF9sZW5ndGggPSBhZGRfcmVuZCAtIGFkZF9yYmVnaW47CisKKyAgZmxvYXQgYmFja29mZl9idWZbMl1bS0VOTE1fTUFYX09SREVSIC0gMV07CisgIGZsb2F0ICpiYWNrb2ZmX2luID0gYmFja29mZl9idWZbMF0sICpiYWNrb2ZmX291dCA9IGJhY2tvZmZfYnVmWzFdOworICBzdGQ6OmNvcHkoYmFja29mZl9zdGFydCwgYmFja29mZl9zdGFydCArIGFkZF9sZW5ndGgsIGJhY2tvZmZfaW4pOworCisgIEV4dGVuZFJldHVybiB2YWx1ZTsKKyAgdmFsdWUubWFrZV9mdWxsID0gZmFsc2U7CisgIHZhbHVlLmFkanVzdCA9IDAuMDsKKyAgdmFsdWUubmV4dF91c2UgPSBhZGRfbGVuZ3RoOworCisgIHVuc2lnbmVkIGNoYXIgaSA9IDA7CisgIHVuc2lnbmVkIGNoYXIgbGVuZ3RoID0gcG9pbnRlcnNfZW5kIC0gcG9pbnRlcnM7CisgIC8vIHBvaW50ZXJzX3dyaXRlIGlzIE5VTEwgbWVhbnMgdGhhdCB0aGUgZXhpc3RpbmcgbGVmdCBzdGF0ZSBpcyBmdWxsLCBzbyB3ZSBzaG91bGQgdXNlIGNvbXBsZXRlZCBwcm9iYWJpbGl0aWVzLgorICBpZiAocG9pbnRlcnNfd3JpdGUpIHsKKyAgICAvLyBVc2luZyBmdWxsIGNvbnRleHQsIHdyaXRpbmcgdG8gbmV3IGxlZnQgc3RhdGUuCisgICAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgRnVsbFNjb3JlUmV0dXJuIHJldChtb2RlbC5FeHRlbmRMZWZ0KAorICAgICAgICAgIGFkZF9yYmVnaW4sIGFkZF9yYmVnaW4gKyB2YWx1ZS5uZXh0X3VzZSwKKyAgICAgICAgICBiYWNrb2ZmX2luLAorICAgICAgICAgIHBvaW50ZXJzW2ldLCBpICsgc2VlbiArIDEsCisgICAgICAgICAgYmFja29mZl9vdXQsCisgICAgICAgICAgdmFsdWUubmV4dF91c2UpKTsKKyAgICAgIHN0ZDo6c3dhcChiYWNrb2ZmX2luLCBiYWNrb2ZmX291dCk7CisgICAgICBpZiAocmV0LmluZGVwZW5kZW50X2xlZnQpIHsKKyAgICAgICAgdmFsdWUuYWRqdXN0ICs9IHJldC5wcm9iOworICAgICAgICB2YWx1ZS5tYWtlX2Z1bGwgPSB0cnVlOworICAgICAgICArK2k7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgdmFsdWUuYWRqdXN0ICs9IHJldC5yZXN0OworICAgICAgKnBvaW50ZXJzX3dyaXRlKysgPSByZXQuZXh0ZW5kX2xlZnQ7CisgICAgICBpZiAodmFsdWUubmV4dF91c2UgIT0gYWRkX2xlbmd0aCkgeworICAgICAgICB2YWx1ZS5tYWtlX2Z1bGwgPSB0cnVlOworICAgICAgICArK2k7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBVc2luZyBzb21lIG9mIHRoZSBuZXcgY29udGV4dC4KKyAgZm9yICg7IGkgPCBsZW5ndGggJiYgdmFsdWUubmV4dF91c2U7ICsraSkgeworICAgIEZ1bGxTY29yZVJldHVybiByZXQobW9kZWwuRXh0ZW5kTGVmdCgKKyAgICAgICAgYWRkX3JiZWdpbiwgYWRkX3JiZWdpbiArIHZhbHVlLm5leHRfdXNlLAorICAgICAgICBiYWNrb2ZmX2luLAorICAgICAgICBwb2ludGVyc1tpXSwgaSArIHNlZW4gKyAxLAorICAgICAgICBiYWNrb2ZmX291dCwKKyAgICAgICAgdmFsdWUubmV4dF91c2UpKTsKKyAgICBzdGQ6OnN3YXAoYmFja29mZl9pbiwgYmFja29mZl9vdXQpOworICAgIHZhbHVlLmFkanVzdCArPSByZXQucHJvYjsKKyAgfQorICBmbG9hdCB1bnJlc3QgPSBtb2RlbC5VblJlc3QocG9pbnRlcnMgKyBpLCBwb2ludGVyc19lbmQsIGkgKyBzZWVuICsgMSk7CisgIC8vIFVzaW5nIG5vbmUgb2YgdGhlIG5ldyBjb250ZXh0LgorICB2YWx1ZS5hZGp1c3QgKz0gdW5yZXN0OworCisgIHN0ZDo6Y29weShiYWNrb2ZmX2luLCBiYWNrb2ZmX2luICsgdmFsdWUubmV4dF91c2UsIGJhY2tvZmZfd3JpdGUpOworICByZXR1cm4gdmFsdWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBNb2RlbD4gZmxvYXQgUmV2ZWFsQmVmb3JlKGNvbnN0IE1vZGVsICZtb2RlbCwgY29uc3QgUmlnaHQgJnJldmVhbCwgY29uc3QgdW5zaWduZWQgY2hhciBzZWVuLCBib29sIHJldmVhbF9mdWxsLCBMZWZ0ICZsZWZ0LCBSaWdodCAmcmlnaHQpIHsKKyAgYXNzZXJ0KHNlZW4gPCByZXZlYWwubGVuZ3RoIHx8IHJldmVhbF9mdWxsKTsKKyAgdWludDY0X3QgKnBvaW50ZXJzX3dyaXRlID0gcmV2ZWFsX2Z1bGwgPyBOVUxMIDogbGVmdC5wb2ludGVyczsKKyAgZmxvYXQgYmFja29mZl9idWZmZXJbS0VOTE1fTUFYX09SREVSIC0gMV07CisgIEV4dGVuZFJldHVybiB2YWx1ZShFeHRlbmRMb29wKAorICAgICAgbW9kZWwsCisgICAgICBzZWVuLCByZXZlYWwud29yZHMgKyBzZWVuLCByZXZlYWwud29yZHMgKyByZXZlYWwubGVuZ3RoLCByZXZlYWwuYmFja29mZiArIHNlZW4sCisgICAgICBsZWZ0LnBvaW50ZXJzLCBsZWZ0LnBvaW50ZXJzICsgbGVmdC5sZW5ndGgsCisgICAgICBwb2ludGVyc193cml0ZSwKKyAgICAgIGxlZnQuZnVsbCA/IGJhY2tvZmZfYnVmZmVyIDogKHJpZ2h0LmJhY2tvZmYgKyByaWdodC5sZW5ndGgpKSk7CisgIGlmIChyZXZlYWxfZnVsbCkgeworICAgIGxlZnQubGVuZ3RoID0gMDsKKyAgICB2YWx1ZS5tYWtlX2Z1bGwgPSB0cnVlOworICB9IGVsc2UgeworICAgIGxlZnQubGVuZ3RoID0gcG9pbnRlcnNfd3JpdGUgLSBsZWZ0LnBvaW50ZXJzOworICAgIHZhbHVlLm1ha2VfZnVsbCB8PSAobGVmdC5sZW5ndGggPT0gbW9kZWwuT3JkZXIoKSAtIDEpOworICB9CisgIGlmIChsZWZ0LmZ1bGwpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGNoYXIgaSA9IDA7IGkgPCB2YWx1ZS5uZXh0X3VzZTsgKytpKSB2YWx1ZS5hZGp1c3QgKz0gYmFja29mZl9idWZmZXJbaV07CisgIH0gZWxzZSB7CisgICAgLy8gSWYgbGVmdCB3YXNuJ3QgZnVsbCB3aGVuIGl0IGNhbWUgaW4sIHB1dCB3b3JkcyBpbnRvIHJpZ2h0IHN0YXRlLgorICAgIHN0ZDo6Y29weShyZXZlYWwud29yZHMgKyBzZWVuLCByZXZlYWwud29yZHMgKyBzZWVuICsgdmFsdWUubmV4dF91c2UsIHJpZ2h0LndvcmRzICsgcmlnaHQubGVuZ3RoKTsKKyAgICByaWdodC5sZW5ndGggKz0gdmFsdWUubmV4dF91c2U7CisgICAgbGVmdC5mdWxsID0gdmFsdWUubWFrZV9mdWxsIHx8IChyaWdodC5sZW5ndGggPT0gbW9kZWwuT3JkZXIoKSAtIDEpOworICB9CisgIHJldHVybiB2YWx1ZS5hZGp1c3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBNb2RlbD4gZmxvYXQgUmV2ZWFsQWZ0ZXIoY29uc3QgTW9kZWwgJm1vZGVsLCBMZWZ0ICZsZWZ0LCBSaWdodCAmcmlnaHQsIGNvbnN0IExlZnQgJnJldmVhbCwgdW5zaWduZWQgY2hhciBzZWVuKSB7CisgIGFzc2VydChzZWVuIDwgcmV2ZWFsLmxlbmd0aCB8fCByZXZlYWwuZnVsbCk7CisgIHVpbnQ2NF90ICpwb2ludGVyc193cml0ZSA9IGxlZnQuZnVsbCA/IE5VTEwgOiAobGVmdC5wb2ludGVycyArIGxlZnQubGVuZ3RoKTsKKyAgRXh0ZW5kUmV0dXJuIHZhbHVlKEV4dGVuZExvb3AoCisgICAgICBtb2RlbCwKKyAgICAgIHNlZW4sIHJpZ2h0LndvcmRzLCByaWdodC53b3JkcyArIHJpZ2h0Lmxlbmd0aCwgcmlnaHQuYmFja29mZiwKKyAgICAgIHJldmVhbC5wb2ludGVycyArIHNlZW4sIHJldmVhbC5wb2ludGVycyArIHJldmVhbC5sZW5ndGgsCisgICAgICBwb2ludGVyc193cml0ZSwKKyAgICAgIHJpZ2h0LmJhY2tvZmYpKTsKKyAgaWYgKHJldmVhbC5mdWxsKSB7CisgICAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSAwOyBpIDwgdmFsdWUubmV4dF91c2U7ICsraSkgdmFsdWUuYWRqdXN0ICs9IHJpZ2h0LmJhY2tvZmZbaV07CisgICAgcmlnaHQubGVuZ3RoID0gMDsKKyAgICB2YWx1ZS5tYWtlX2Z1bGwgPSB0cnVlOworICB9IGVsc2UgeworICAgIHJpZ2h0Lmxlbmd0aCA9IHZhbHVlLm5leHRfdXNlOworICAgIHZhbHVlLm1ha2VfZnVsbCB8PSAocmlnaHQubGVuZ3RoID09IG1vZGVsLk9yZGVyKCkgLSAxKTsKKyAgfQorICBpZiAoIWxlZnQuZnVsbCkgeworICAgIGxlZnQubGVuZ3RoID0gcG9pbnRlcnNfd3JpdGUgLSBsZWZ0LnBvaW50ZXJzOworICAgIGxlZnQuZnVsbCA9IHZhbHVlLm1ha2VfZnVsbCB8fCAobGVmdC5sZW5ndGggPT0gbW9kZWwuT3JkZXIoKSAtIDEpOworICB9CisgIHJldHVybiB2YWx1ZS5hZGp1c3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBNb2RlbD4gZmxvYXQgU3Vic3VtZShjb25zdCBNb2RlbCAmbW9kZWwsIExlZnQgJmZpcnN0X2xlZnQsIGNvbnN0IFJpZ2h0ICZmaXJzdF9yaWdodCwgY29uc3QgTGVmdCAmc2Vjb25kX2xlZnQsIFJpZ2h0ICZzZWNvbmRfcmlnaHQsIGNvbnN0IHVuc2lnbmVkIGludCBiZXR3ZWVuX2xlbmd0aCkgeworICBhc3NlcnQoZmlyc3RfcmlnaHQubGVuZ3RoIDwgS0VOTE1fTUFYX09SREVSKTsKKyAgYXNzZXJ0KHNlY29uZF9sZWZ0Lmxlbmd0aCA8IEtFTkxNX01BWF9PUkRFUik7CisgIGFzc2VydChiZXR3ZWVuX2xlbmd0aCA8IEtFTkxNX01BWF9PUkRFUiAtIDEpOworICB1aW50NjRfdCAqcG9pbnRlcnNfd3JpdGUgPSBmaXJzdF9sZWZ0LmZ1bGwgPyBOVUxMIDogKGZpcnN0X2xlZnQucG9pbnRlcnMgKyBmaXJzdF9sZWZ0Lmxlbmd0aCk7CisgIGZsb2F0IGJhY2tvZmZfYnVmZmVyW0tFTkxNX01BWF9PUkRFUiAtIDFdOworICBFeHRlbmRSZXR1cm4gdmFsdWUoRXh0ZW5kTG9vcCgKKyAgICAgICAgbW9kZWwsCisgICAgICAgIGJldHdlZW5fbGVuZ3RoLCBmaXJzdF9yaWdodC53b3JkcywgZmlyc3RfcmlnaHQud29yZHMgKyBmaXJzdF9yaWdodC5sZW5ndGgsIGZpcnN0X3JpZ2h0LmJhY2tvZmYsCisgICAgICAgIHNlY29uZF9sZWZ0LnBvaW50ZXJzLCBzZWNvbmRfbGVmdC5wb2ludGVycyArIHNlY29uZF9sZWZ0Lmxlbmd0aCwKKyAgICAgICAgcG9pbnRlcnNfd3JpdGUsCisgICAgICAgIHNlY29uZF9sZWZ0LmZ1bGwgPyBiYWNrb2ZmX2J1ZmZlciA6IChzZWNvbmRfcmlnaHQuYmFja29mZiArIHNlY29uZF9yaWdodC5sZW5ndGgpKSk7CisgIGlmIChzZWNvbmRfbGVmdC5mdWxsKSB7CisgICAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSAwOyBpIDwgdmFsdWUubmV4dF91c2U7ICsraSkgdmFsdWUuYWRqdXN0ICs9IGJhY2tvZmZfYnVmZmVyW2ldOworICB9IGVsc2UgeworICAgIHN0ZDo6Y29weShmaXJzdF9yaWdodC53b3JkcywgZmlyc3RfcmlnaHQud29yZHMgKyB2YWx1ZS5uZXh0X3VzZSwgc2Vjb25kX3JpZ2h0LndvcmRzICsgc2Vjb25kX3JpZ2h0Lmxlbmd0aCk7CisgICAgc2Vjb25kX3JpZ2h0Lmxlbmd0aCArPSB2YWx1ZS5uZXh0X3VzZTsKKyAgICB2YWx1ZS5tYWtlX2Z1bGwgfD0gKHNlY29uZF9yaWdodC5sZW5ndGggPT0gbW9kZWwuT3JkZXIoKSAtIDEpOworICB9CisgIGlmICghZmlyc3RfbGVmdC5mdWxsKSB7CisgICAgZmlyc3RfbGVmdC5sZW5ndGggPSBwb2ludGVyc193cml0ZSAtIGZpcnN0X2xlZnQucG9pbnRlcnM7CisgICAgZmlyc3RfbGVmdC5mdWxsID0gdmFsdWUubWFrZV9mdWxsIHx8IHNlY29uZF9sZWZ0LmZ1bGwgfHwgKGZpcnN0X2xlZnQubGVuZ3RoID09IG1vZGVsLk9yZGVyKCkgLSAxKTsKKyAgfQorICBhc3NlcnQoZmlyc3RfbGVmdC5sZW5ndGggPCBLRU5MTV9NQVhfT1JERVIpOworICBhc3NlcnQoc2Vjb25kX3JpZ2h0Lmxlbmd0aCA8IEtFTkxNX01BWF9PUkRFUik7CisgIHJldHVybiB2YWx1ZS5hZGp1c3Q7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5ncmFtCit9IC8vIG5hbWVzcGFjZSBsbQorCisjZW5kaWYgLy8gTE1fUEFSVElBTF9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vcGFydGlhbF90ZXN0LmNjIGIvc3JjL2tlbmxtL2xtL3BhcnRpYWxfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGI2NDRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL3BhcnRpYWxfdGVzdC5jYwpAQCAtMCwwICsxLDE5OSBAQAorI2luY2x1ZGUgImxtL3BhcnRpYWwuaGgiCisKKyNpbmNsdWRlICJsbS9sZWZ0LmhoIgorI2luY2x1ZGUgImxtL21vZGVsLmhoIgorI2luY2x1ZGUgInV0aWwvdG9rZW5pemVfcGllY2UuaGgiCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgUGFydGlhbFRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9mbG9hdGluZ19wb2ludF9jb21wYXJpc29uLmhwcD4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBuZ3JhbSB7CituYW1lc3BhY2UgeworCitjb25zdCBjaGFyICpUZXN0TG9jYXRpb24oKSB7CisgIGlmIChib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYyA8IDIpIHsKKyAgICByZXR1cm4gInRlc3QuYXJwYSI7CisgIH0KKyAgcmV0dXJuIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2WzFdOworfQorCitDb25maWcgU2lsZW50Q29uZmlnKCkgeworICBDb25maWcgY29uZmlnOworICBjb25maWcuYXJwYV9jb21wbGFpbiA9IENvbmZpZzo6Tk9ORTsKKyAgY29uZmlnLm1lc3NhZ2VzID0gTlVMTDsKKyAgcmV0dXJuIGNvbmZpZzsKK30KKworc3RydWN0IE1vZGVsRml4dHVyZSB7CisgIE1vZGVsRml4dHVyZSgpIDogbShUZXN0TG9jYXRpb24oKSwgU2lsZW50Q29uZmlnKCkpIHt9CisKKyAgUmVzdFByb2JpbmdNb2RlbCBtOworfTsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKHN1aXRlLCBNb2RlbEZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNpbXBsZUJlZm9yZSkgeworICBMZWZ0IGxlZnQ7CisgIGxlZnQuZnVsbCA9IGZhbHNlOworICBsZWZ0Lmxlbmd0aCA9IDA7CisgIFJpZ2h0IHJpZ2h0OworICByaWdodC5sZW5ndGggPSAwOworCisgIFJpZ2h0IHJldmVhbDsKKyAgcmV2ZWFsLmxlbmd0aCA9IDE7CisgIFdvcmRJbmRleCBwZXJpb2QgPSBtLkdldFZvY2FidWxhcnkoKS5JbmRleCgiLiIpOworICByZXZlYWwud29yZHNbMF0gPSBwZXJpb2Q7CisgIHJldmVhbC5iYWNrb2ZmWzBdID0gLTAuODQ1MDk4OworCisgIEJPT1NUX0NIRUNLX0NMT1NFKDAuMCwgUmV2ZWFsQmVmb3JlKG0sIHJldmVhbCwgMCwgZmFsc2UsIGxlZnQsIHJpZ2h0KSwgMC4wMDEpOworICBCT09TVF9DSEVDS19FUVVBTCgwLCBsZWZ0Lmxlbmd0aCk7CisgIEJPT1NUX0NIRUNLKCFsZWZ0LmZ1bGwpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCByaWdodC5sZW5ndGgpOworICBCT09TVF9DSEVDS19FUVVBTChwZXJpb2QsIHJpZ2h0LndvcmRzWzBdKTsKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0UoLTAuODQ1MDk4LCByaWdodC5iYWNrb2ZmWzBdLCAwLjAwMSk7CisKKyAgV29yZEluZGV4IG1vcmUgPSBtLkdldFZvY2FidWxhcnkoKS5JbmRleCgibW9yZSIpOworICByZXZlYWwud29yZHNbMV0gPSBtb3JlOworICByZXZlYWwuYmFja29mZlsxXSA9ICAtMC40NzcxMjEyOworICByZXZlYWwubGVuZ3RoID0gMjsKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0UoMC4wLCBSZXZlYWxCZWZvcmUobSwgcmV2ZWFsLCAxLCBmYWxzZSwgbGVmdCwgcmlnaHQpLCAwLjAwMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIGxlZnQubGVuZ3RoKTsKKyAgQk9PU1RfQ0hFQ0soIWxlZnQuZnVsbCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHJpZ2h0Lmxlbmd0aCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBlcmlvZCwgcmlnaHQud29yZHNbMF0pOworICBCT09TVF9DSEVDS19FUVVBTChtb3JlLCByaWdodC53b3Jkc1sxXSk7CisgIEJPT1NUX0NIRUNLX0NMT1NFKC0wLjg0NTA5OCwgcmlnaHQuYmFja29mZlswXSwgMC4wMDEpOworICBCT09TVF9DSEVDS19DTE9TRSgtMC40NzcxMjEyLCByaWdodC5iYWNrb2ZmWzFdLCAwLjAwMSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEFsc29Xb3VsZENvbnNpZGVyKSB7CisgIFdvcmRJbmRleCB3b3VsZCA9IG0uR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KCJ3b3VsZCIpOworICBXb3JkSW5kZXggY29uc2lkZXIgPSBtLkdldFZvY2FidWxhcnkoKS5JbmRleCgiY29uc2lkZXIiKTsKKworICBDaGFydFN0YXRlIGN1cnJlbnQ7CisgIGN1cnJlbnQubGVmdC5sZW5ndGggPSAxOworICBjdXJyZW50LmxlZnQucG9pbnRlcnNbMF0gPSB3b3VsZDsKKyAgY3VycmVudC5sZWZ0LmZ1bGwgPSBmYWxzZTsKKyAgY3VycmVudC5yaWdodC5sZW5ndGggPSAxOworICBjdXJyZW50LnJpZ2h0LndvcmRzWzBdID0gd291bGQ7CisgIGN1cnJlbnQucmlnaHQuYmFja29mZlswXSA9IC0wLjMwMTAzOworCisgIExlZnQgYWZ0ZXI7CisgIGFmdGVyLmZ1bGwgPSBmYWxzZTsKKyAgYWZ0ZXIubGVuZ3RoID0gMTsKKyAgYWZ0ZXIucG9pbnRlcnNbMF0gPSBjb25zaWRlcjsKKworICAvLyBhZGp1c3RtZW50IGZvciB3b3VsZCBjb25zaWRlcgorICBCT09TVF9DSEVDS19DTE9TRSgtMS42ODc4NzIgLSAtMC4yOTIyMDk1IC0gMC4zMDEwMywgUmV2ZWFsQWZ0ZXIobSwgY3VycmVudC5sZWZ0LCBjdXJyZW50LnJpZ2h0LCBhZnRlciwgMCksIDAuMDAxKTsKKworICBCT09TVF9DSEVDS19FUVVBTCgyLCBjdXJyZW50LmxlZnQubGVuZ3RoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwod291bGQsIGN1cnJlbnQubGVmdC5wb2ludGVyc1swXSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhbHNlLCBjdXJyZW50LmxlZnQuZnVsbCk7CisKKyAgV29yZEluZGV4IGFsc28gPSBtLkdldFZvY2FidWxhcnkoKS5JbmRleCgiYWxzbyIpOworICBSaWdodCBiZWZvcmU7CisgIGJlZm9yZS5sZW5ndGggPSAxOworICBiZWZvcmUud29yZHNbMF0gPSBhbHNvOworICBiZWZvcmUuYmFja29mZlswXSA9IC0wLjMwMTAzOworICAvLyByKHdvdWxkKSA9IC0wLjI5MjIwOTUgW2kgd291bGRdLCByKHdvdWxkIC0+IGNvbnNpZGVyKSA9IC0xLjk4ODkwMiBbYih3b3VsZCkgKyBwKGNvbnNpZGVyKV0KKyAgLy8gcChhbHNvIC0+IHdvdWxkKSA9IC0yLCBwKGFsc28gd291bGQgLT4gY29uc2lkZXIpID0gLTMKKyAgQk9PU1RfQ0hFQ0tfQ0xPU0UoLTIgKyAwLjI5MjIwOTUgLTMgKyAxLjk4ODkwMiwgUmV2ZWFsQmVmb3JlKG0sIGJlZm9yZSwgMCwgZmFsc2UsIGN1cnJlbnQubGVmdCwgY3VycmVudC5yaWdodCksIDAuMDAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgY3VycmVudC5sZWZ0Lmxlbmd0aCk7CisgIEJPT1NUX0NIRUNLKGN1cnJlbnQubGVmdC5mdWxsKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgY3VycmVudC5yaWdodC5sZW5ndGgpOworICBCT09TVF9DSEVDS19FUVVBTCh3b3VsZCwgY3VycmVudC5yaWdodC53b3Jkc1swXSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGFsc28sIGN1cnJlbnQucmlnaHQud29yZHNbMV0pOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFbmRTZW50ZW5jZSkgeworICBXb3JkSW5kZXggbG9pbiA9IG0uR2V0Vm9jYWJ1bGFyeSgpLkluZGV4KCJsb2luIik7CisgIFdvcmRJbmRleCBwZXJpb2QgPSBtLkdldFZvY2FidWxhcnkoKS5JbmRleCgiLiIpOworICBXb3JkSW5kZXggZW9zID0gbS5HZXRWb2NhYnVsYXJ5KCkuRW5kU2VudGVuY2UoKTsKKworICBDaGFydFN0YXRlIGJldHdlZW47CisgIGJldHdlZW4ubGVmdC5sZW5ndGggPSAxOworICBiZXR3ZWVuLmxlZnQucG9pbnRlcnNbMF0gPSBlb3M7CisgIGJldHdlZW4ubGVmdC5mdWxsID0gdHJ1ZTsKKyAgYmV0d2Vlbi5yaWdodC5sZW5ndGggPSAwOworCisgIFJpZ2h0IGJlZm9yZTsKKyAgYmVmb3JlLndvcmRzWzBdID0gcGVyaW9kOworICBiZWZvcmUud29yZHNbMV0gPSBsb2luOworICBiZWZvcmUuYmFja29mZlswXSA9IC0wLjg0NTA5ODsKKyAgYmVmb3JlLmJhY2tvZmZbMV0gPSAwLjA7CisKKyAgYmVmb3JlLmxlbmd0aCA9IDE7CisgIEJPT1NUX0NIRUNLX0NMT1NFKC0wLjA0MTA3MDcsIFJldmVhbEJlZm9yZShtLCBiZWZvcmUsIDAsIHRydWUsIGJldHdlZW4ubGVmdCwgYmV0d2Vlbi5yaWdodCksIDAuMDAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgYmV0d2Vlbi5sZWZ0Lmxlbmd0aCk7Cit9CisKK2Zsb2F0IFNjb3JlRnJhZ21lbnQoY29uc3QgUmVzdFByb2JpbmdNb2RlbCAmbW9kZWwsIHVuc2lnbmVkIGludCAqYmVnaW4sIHVuc2lnbmVkIGludCAqZW5kLCBDaGFydFN0YXRlICZvdXQpIHsKKyAgUnVsZVNjb3JlPFJlc3RQcm9iaW5nTW9kZWw+IHNjb3Jlcihtb2RlbCwgb3V0KTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgKmkgPSBiZWdpbjsgaSA8IGVuZDsgKytpKSB7CisgICAgc2NvcmVyLlRlcm1pbmFsKCppKTsKKyAgfQorICByZXR1cm4gc2NvcmVyLkZpbmlzaCgpOworfQorCit2b2lkIENoZWNrQWRqdXN0bWVudChjb25zdCBSZXN0UHJvYmluZ01vZGVsICZtb2RlbCwgZmxvYXQgZXhwZWN0LCBjb25zdCBSaWdodCAmYmVmb3JlX2luLCBib29sIGJlZm9yZV9mdWxsLCBDaGFydFN0YXRlIGJldHdlZW4sIGNvbnN0IExlZnQgJmFmdGVyX2luKSB7CisgIFJpZ2h0IGJlZm9yZShiZWZvcmVfaW4pOworICBMZWZ0IGFmdGVyKGFmdGVyX2luKTsKKyAgYWZ0ZXIuZnVsbCA9IGZhbHNlOworICBmbG9hdCBnb3QgPSAwLjA7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAxOyBpIDwgNTsgKytpKSB7CisgICAgaWYgKGJlZm9yZV9pbi5sZW5ndGggPj0gaSkgeworICAgICAgYmVmb3JlLmxlbmd0aCA9IGk7CisgICAgICBnb3QgKz0gUmV2ZWFsQmVmb3JlKG1vZGVsLCBiZWZvcmUsIGkgLSAxLCBmYWxzZSwgYmV0d2Vlbi5sZWZ0LCBiZXR3ZWVuLnJpZ2h0KTsKKyAgICB9CisgICAgaWYgKGFmdGVyX2luLmxlbmd0aCA+PSBpKSB7CisgICAgICBhZnRlci5sZW5ndGggPSBpOworICAgICAgZ290ICs9IFJldmVhbEFmdGVyKG1vZGVsLCBiZXR3ZWVuLmxlZnQsIGJldHdlZW4ucmlnaHQsIGFmdGVyLCBpIC0gMSk7CisgICAgfQorICB9CisgIGlmIChhZnRlcl9pbi5mdWxsKSB7CisgICAgYWZ0ZXIuZnVsbCA9IHRydWU7CisgICAgZ290ICs9IFJldmVhbEFmdGVyKG1vZGVsLCBiZXR3ZWVuLmxlZnQsIGJldHdlZW4ucmlnaHQsIGFmdGVyLCBhZnRlci5sZW5ndGgpOworICB9CisgIGlmIChiZWZvcmVfZnVsbCkgeworICAgIGdvdCArPSBSZXZlYWxCZWZvcmUobW9kZWwsIGJlZm9yZSwgYmVmb3JlLmxlbmd0aCwgdHJ1ZSwgYmV0d2Vlbi5sZWZ0LCBiZXR3ZWVuLnJpZ2h0KTsKKyAgfQorICAvLyBTb21ldGltZXMgdGhleSdyZSB6ZXJvIGFuZCBCT09TVF9DSEVDS19DTE9TRSBmYWlscyBmb3IgdGhpcy4KKyAgQk9PU1RfQ0hFQ0soZmFicyhleHBlY3QgLSBnb3QpIDwgMC4wMDEpOworfQorCit2b2lkIEZ1bGxEaXZpZGUoY29uc3QgUmVzdFByb2JpbmdNb2RlbCAmbW9kZWwsIFN0cmluZ1BpZWNlIHN0cikgeworICBzdGQ6OnZlY3RvcjxXb3JkSW5kZXg+IGluZGljZXM7CisgIGZvciAodXRpbDo6VG9rZW5JdGVyPHV0aWw6OlNpbmdsZUNoYXJhY3RlciwgdHJ1ZT4gaShzdHIsICcgJyk7IGk7ICsraSkgeworICAgIGluZGljZXMucHVzaF9iYWNrKG1vZGVsLkdldFZvY2FidWxhcnkoKS5JbmRleCgqaSkpOworICB9CisgIENoYXJ0U3RhdGUgZnVsbF9zdGF0ZTsKKyAgZmxvYXQgZnVsbCA9IFNjb3JlRnJhZ21lbnQobW9kZWwsICZpbmRpY2VzLmZyb250KCksICZpbmRpY2VzLmJhY2soKSArIDEsIGZ1bGxfc3RhdGUpOworCisgIENoYXJ0U3RhdGUgYmVmb3JlX3N0YXRlOworICBiZWZvcmVfc3RhdGUubGVmdC5mdWxsID0gZmFsc2U7CisgIFJ1bGVTY29yZTxSZXN0UHJvYmluZ01vZGVsPiBiZWZvcmVfc2NvcmVyKG1vZGVsLCBiZWZvcmVfc3RhdGUpOworICBmbG9hdCBiZWZvcmVfc2NvcmUgPSAwLjA7CisgIGZvciAodW5zaWduZWQgaW50IGJlZm9yZSA9IDA7IGJlZm9yZSA8IGluZGljZXMuc2l6ZSgpOyArK2JlZm9yZSkgeworICAgIGZvciAodW5zaWduZWQgaW50IGFmdGVyID0gYmVmb3JlOyBhZnRlciA8PSBpbmRpY2VzLnNpemUoKTsgKythZnRlcikgeworICAgICAgQ2hhcnRTdGF0ZSBhZnRlcl9zdGF0ZSwgYmV0d2Vlbl9zdGF0ZTsKKyAgICAgIGZsb2F0IGFmdGVyX3Njb3JlID0gU2NvcmVGcmFnbWVudChtb2RlbCwgJmluZGljZXMuZnJvbnQoKSArIGFmdGVyLCAmaW5kaWNlcy5mcm9udCgpICsgaW5kaWNlcy5zaXplKCksIGFmdGVyX3N0YXRlKTsKKyAgICAgIGZsb2F0IGJldHdlZW5fc2NvcmUgPSBTY29yZUZyYWdtZW50KG1vZGVsLCAmaW5kaWNlcy5mcm9udCgpICsgYmVmb3JlLCAmaW5kaWNlcy5mcm9udCgpICsgYWZ0ZXIsIGJldHdlZW5fc3RhdGUpOworICAgICAgQ2hlY2tBZGp1c3RtZW50KG1vZGVsLCBmdWxsIC0gYmVmb3JlX3Njb3JlIC0gYWZ0ZXJfc2NvcmUgLSBiZXR3ZWVuX3Njb3JlLCBiZWZvcmVfc3RhdGUucmlnaHQsIGJlZm9yZV9zdGF0ZS5sZWZ0LmZ1bGwsIGJldHdlZW5fc3RhdGUsIGFmdGVyX3N0YXRlLmxlZnQpOworICAgIH0KKyAgICBiZWZvcmVfc2NvcmVyLlRlcm1pbmFsKGluZGljZXNbYmVmb3JlXSk7CisgICAgYmVmb3JlX3Njb3JlID0gYmVmb3JlX3Njb3Jlci5GaW5pc2goKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTdHJpbmdzKSB7CisgIEZ1bGxEaXZpZGUobSwgImFsc28gd291bGQgY29uc2lkZXIiKTsKKyAgRnVsbERpdmlkZShtLCAibG9va2luZyBvbiBhIGxpdHRsZSBtb3JlIGxvaW4gLiA8L3M+Iik7CisgIEZ1bGxEaXZpZGUobSwgImluIGJpYXJyaXR6IHdhdGNoaW5nIGNvbnNpZGVyaW5nIGxvb2tpbmcgLiBvbiBhIGxpdHRsZSBtb3JlIGxvaW4gYWxzbyB3b3VsZCBjb25zaWRlciBoaWdoZXIgdG8gbG9vayBnb29kIHVua25vd24gdGhlIHNjcmVlbmluZyBmb28gYmFyICwgdW5rbm93biBob3dldmVyIHVua25vd24gPC9zPiIpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKK30gLy8gbmFtZXNwYWNlCit9IC8vIG5hbWVzcGFjZSBuZ3JhbQorfSAvLyBuYW1lc3BhY2UgbG0KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9xdWFudGl6ZS5jYyBiL3NyYy9rZW5sbS9sbS9xdWFudGl6ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmI1ZGJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL3F1YW50aXplLmNjCkBAIC0wLDAgKzEsOTMgQEAKKy8qIFF1YW50aXplIGludG8gYmlucyBvZiBlcXVhbCBzaXplIGFzIGRlc2NyaWJlZCBpbgorICogTS4gRmVkZXJpY28gYW5kIE4uIEJlcnRvbGRpLiAyMDA2LiBIb3cgbWFueSBiaXRzIGFyZSBuZWVkZWQKKyAqIHRvIHN0b3JlIHByb2JhYmlsaXRpZXMgZm9yIHBocmFzZS1iYXNlZCB0cmFuc2xhdGlvbj8gSW4gUHJvYy4KKyAqIG9mIHRoZSBXb3Jrc2hvcCBvbiBTdGF0aXN0aWNhbCBNYWNoaW5lIFRyYW5zbGF0aW9uLCBwYWdlcworICogOTTigJMxMDEsIE5ldyBZb3JrIENpdHksIEp1bmUuIEFzc29jaWF0aW9uIGZvciBDb21wdXRhLQorICogdGlvbmFsIExpbmd1aXN0aWNzLgorICovCisKKyNpbmNsdWRlICJsbS9xdWFudGl6ZS5oaCIKKworI2luY2x1ZGUgImxtL2JpbmFyeV9mb3JtYXQuaGgiCisjaW5jbHVkZSAibG0vbG1fZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxudW1lcmljPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKKworbmFtZXNwYWNlIHsKKwordm9pZCBNYWtlQmlucyhzdGQ6OnZlY3RvcjxmbG9hdD4gJnZhbHVlcywgZmxvYXQgKmNlbnRlcnMsIHVpbnQzMl90IGJpbnMpIHsKKyAgc3RkOjpzb3J0KHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworICBzdGQ6OnZlY3RvcjxmbG9hdD46OmNvbnN0X2l0ZXJhdG9yIHN0YXJ0ID0gdmFsdWVzLmJlZ2luKCksIGZpbmlzaDsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbnM7ICsraSwgKytjZW50ZXJzLCBzdGFydCA9IGZpbmlzaCkgeworICAgIGZpbmlzaCA9IHZhbHVlcy5iZWdpbigpICsgKCh2YWx1ZXMuc2l6ZSgpICogc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGkgKyAxKSkgLyBiaW5zKTsKKyAgICBpZiAoZmluaXNoID09IHN0YXJ0KSB7CisgICAgICAvLyB6ZXJvIGxlbmd0aCBidWNrZXQuCisgICAgICAqY2VudGVycyA9IGkgPyAqKGNlbnRlcnMgLSAxKSA6IC1zdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICB9IGVsc2UgeworICAgICAgKmNlbnRlcnMgPSBzdGQ6OmFjY3VtdWxhdGUoc3RhcnQsIGZpbmlzaCwgMC4wKSAvIHN0YXRpY19jYXN0PGZsb2F0PihmaW5pc2ggLSBzdGFydCk7CisgICAgfQorICB9Cit9CisKK2NvbnN0IGNoYXIga1NlcGFyYXRlbHlRdWFudGl6ZVZlcnNpb24gPSAyOworCit9IC8vIG5hbWVzcGFjZQorCit2b2lkIFNlcGFyYXRlbHlRdWFudGl6ZTo6VXBkYXRlQ29uZmlnRnJvbUJpbmFyeShjb25zdCBCaW5hcnlGb3JtYXQgJmZpbGUsIHVpbnQ2NF90IG9mZnNldCwgQ29uZmlnICZjb25maWcpIHsKKyAgdW5zaWduZWQgY2hhciBidWZmZXJbM107CisgIGZpbGUuUmVhZEZvckNvbmZpZyhidWZmZXIsIDMsIG9mZnNldCk7CisgIGNoYXIgdmVyc2lvbiA9IGJ1ZmZlclswXTsKKyAgY29uZmlnLnByb2JfYml0cyA9IGJ1ZmZlclsxXTsKKyAgY29uZmlnLmJhY2tvZmZfYml0cyA9IGJ1ZmZlclsyXTsKKyAgaWYgKHZlcnNpb24gIT0ga1NlcGFyYXRlbHlRdWFudGl6ZVZlcnNpb24pIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIlRoaXMgZmlsZSBoYXMgcXVhbnRpemF0aW9uIHZlcnNpb24gIiA8PCAodW5zaWduZWQpdmVyc2lvbiA8PCAiIGJ1dCB0aGUgY29kZSBleHBlY3RzIHZlcnNpb24gIiA8PCAodW5zaWduZWQpa1NlcGFyYXRlbHlRdWFudGl6ZVZlcnNpb24pOworfQorCit2b2lkIFNlcGFyYXRlbHlRdWFudGl6ZTo6U2V0dXBNZW1vcnkodm9pZCAqYmFzZSwgdW5zaWduZWQgY2hhciBvcmRlciwgY29uc3QgQ29uZmlnICZjb25maWcpIHsKKyAgcHJvYl9iaXRzXyA9IGNvbmZpZy5wcm9iX2JpdHM7CisgIGJhY2tvZmZfYml0c18gPSBjb25maWcuYmFja29mZl9iaXRzOworICAvLyBXZSBuZWVkIHRoZSByZXNlcnZlZCB2YWx1ZXMuCisgIGlmIChjb25maWcucHJvYl9iaXRzID09IDApIFVUSUxfVEhST1coQ29uZmlnRXhjZXB0aW9uLCAiWW91IGNhbid0IHF1YW50aXplIHByb2JhYmlsaXR5IHRvIHplcm8iKTsKKyAgaWYgKGNvbmZpZy5iYWNrb2ZmX2JpdHMgPT0gMCkgVVRJTF9USFJPVyhDb25maWdFeGNlcHRpb24sICJZb3UgY2FuJ3QgcXVhbnRpemUgYmFja29mZiB0byB6ZXJvIik7CisgIGlmIChjb25maWcucHJvYl9iaXRzID4gMjUpIFVUSUxfVEhST1coQ29uZmlnRXhjZXB0aW9uLCAiRm9yIGVmZmljaWVuY3kgcmVhc29ucywgcXVhbnRpemluZyBwcm9iYWJpbGl0eSBzdXBwb3J0cyBhdCBtb3N0IDI1IGJpdHMuICBDdXJyZW50bHkgeW91IGhhdmUgcmVxdWVzdGVkICIgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGNvbmZpZy5wcm9iX2JpdHMpIDw8ICIgYml0cy4iKTsKKyAgaWYgKGNvbmZpZy5iYWNrb2ZmX2JpdHMgPiAyNSkgVVRJTF9USFJPVyhDb25maWdFeGNlcHRpb24sICJGb3IgZWZmaWNpZW5jeSByZWFzb25zLCBxdWFudGl6aW5nIGJhY2tvZmYgc3VwcG9ydHMgYXQgbW9zdCAyNSBiaXRzLiAgQ3VycmVudGx5IHlvdSBoYXZlIHJlcXVlc3RlZCAiIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihjb25maWcuYmFja29mZl9iaXRzKSA8PCAiIGJpdHMuIik7CisgIC8vIFJlc2VydmUgOCBieXRlIGhlYWRlciBmb3IgYml0IGNvdW50cy4KKyAgYWN0dWFsX2Jhc2VfID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJhc2UpOworICBmbG9hdCAqc3RhcnQgPSByZWludGVycHJldF9jYXN0PGZsb2F0Kj4oYWN0dWFsX2Jhc2VfICsgOCk7CisgIGZvciAodW5zaWduZWQgY2hhciBpID0gMDsgaSA8IG9yZGVyIC0gMjsgKytpKSB7CisgICAgdGFibGVzX1tpXVswXSA9IEJpbnMocHJvYl9iaXRzXywgc3RhcnQpOworICAgIHN0YXJ0ICs9ICgxVUxMIDw8IHByb2JfYml0c18pOworICAgIHRhYmxlc19baV1bMV0gPSBCaW5zKGJhY2tvZmZfYml0c18sIHN0YXJ0KTsKKyAgICBzdGFydCArPSAoMVVMTCA8PCBiYWNrb2ZmX2JpdHNfKTsKKyAgfQorICBsb25nZXN0XyA9IHRhYmxlc19bb3JkZXIgLSAyXVswXSA9IEJpbnMocHJvYl9iaXRzXywgc3RhcnQpOworfQorCit2b2lkIFNlcGFyYXRlbHlRdWFudGl6ZTo6VHJhaW4odWludDhfdCBvcmRlciwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICZwcm9iLCBzdGQ6OnZlY3RvcjxmbG9hdD4gJmJhY2tvZmYpIHsKKyAgVHJhaW5Qcm9iKG9yZGVyLCBwcm9iKTsKKworICAvLyBCYWNrb2ZmCisgIGZsb2F0ICpjZW50ZXJzID0gdGFibGVzX1tvcmRlciAtIDJdWzFdLlBvcHVsYXRlKCk7CisgICooY2VudGVycysrKSA9IGtOb0V4dGVuc2lvbkJhY2tvZmY7CisgICooY2VudGVycysrKSA9IGtFeHRlbnNpb25CYWNrb2ZmOworICBNYWtlQmlucyhiYWNrb2ZmLCBjZW50ZXJzLCAoMVVMTCA8PCBiYWNrb2ZmX2JpdHNfKSAtIDIpOworfQorCit2b2lkIFNlcGFyYXRlbHlRdWFudGl6ZTo6VHJhaW5Qcm9iKHVpbnQ4X3Qgb3JkZXIsIHN0ZDo6dmVjdG9yPGZsb2F0PiAmcHJvYikgeworICBmbG9hdCAqY2VudGVycyA9IHRhYmxlc19bb3JkZXIgLSAyXVswXS5Qb3B1bGF0ZSgpOworICBNYWtlQmlucyhwcm9iLCBjZW50ZXJzLCAoMVVMTCA8PCBwcm9iX2JpdHNfKSk7Cit9CisKK3ZvaWQgU2VwYXJhdGVseVF1YW50aXplOjpGaW5pc2hlZExvYWRpbmcoY29uc3QgQ29uZmlnICZjb25maWcpIHsKKyAgdWludDhfdCAqYWN0dWFsX2Jhc2UgPSBhY3R1YWxfYmFzZV87CisgICooYWN0dWFsX2Jhc2UrKykgPSBrU2VwYXJhdGVseVF1YW50aXplVmVyc2lvbjsgLy8gdmVyc2lvbgorICAqKGFjdHVhbF9iYXNlKyspID0gY29uZmlnLnByb2JfYml0czsKKyAgKihhY3R1YWxfYmFzZSsrKSA9IGNvbmZpZy5iYWNrb2ZmX2JpdHM7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5ncmFtCit9IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL3F1YW50aXplLmhoIGIvc3JjL2tlbmxtL2xtL3F1YW50aXplLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDBhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vcXVhbnRpemUuaGgKQEAgLTAsMCArMSwyMzMgQEAKKyNpZm5kZWYgTE1fUVVBTlRJWkVfSAorI2RlZmluZSBMTV9RVUFOVElaRV9ICisKKyNpbmNsdWRlICJsbS9ibGFuay5oaCIKKyNpbmNsdWRlICJsbS9jb25maWcuaGgiCisjaW5jbHVkZSAibG0vbWF4X29yZGVyLmhoIgorI2luY2x1ZGUgImxtL21vZGVsX3R5cGUuaGgiCisjaW5jbHVkZSAidXRpbC9iaXRfcGFja2luZy5oaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKKworc3RydWN0IENvbmZpZzsKK2NsYXNzIEJpbmFyeUZvcm1hdDsKKworLyogU3RvcmUgdmFsdWVzIGRpcmVjdGx5IGFuZCBkb24ndCBxdWFudGl6ZS4gKi8KK2NsYXNzIERvbnRRdWFudGl6ZSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgTW9kZWxUeXBlIGtNb2RlbFR5cGVBZGQgPSBzdGF0aWNfY2FzdDxNb2RlbFR5cGU+KDApOworICAgIHN0YXRpYyB2b2lkIFVwZGF0ZUNvbmZpZ0Zyb21CaW5hcnkoY29uc3QgQmluYXJ5Rm9ybWF0ICYsIHVpbnQ2NF90LCBDb25maWcgJikge30KKyAgICBzdGF0aWMgdWludDY0X3QgU2l6ZSh1aW50OF90IC8qb3JkZXIqLywgY29uc3QgQ29uZmlnICYvKmNvbmZpZyovKSB7IHJldHVybiAwOyB9CisgICAgc3RhdGljIHVpbnQ4X3QgTWlkZGxlQml0cyhjb25zdCBDb25maWcgJi8qY29uZmlnKi8pIHsgcmV0dXJuIDYzOyB9CisgICAgc3RhdGljIHVpbnQ4X3QgTG9uZ2VzdEJpdHMoY29uc3QgQ29uZmlnICYvKmNvbmZpZyovKSB7IHJldHVybiAzMTsgfQorCisgICAgY2xhc3MgTWlkZGxlUG9pbnRlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIE1pZGRsZVBvaW50ZXIoY29uc3QgRG9udFF1YW50aXplICYgLypxdWFudCovLCB1bnNpZ25lZCBjaGFyIC8qb3JkZXJfbWludXNfMiovLCB1dGlsOjpCaXRBZGRyZXNzIGFkZHJlc3MpIDogYWRkcmVzc18oYWRkcmVzcykge30KKworICAgICAgICBNaWRkbGVQb2ludGVyKCkgOiBhZGRyZXNzXyhOVUxMLCAwKSB7fQorCisgICAgICAgIGJvb2wgRm91bmQoKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIGFkZHJlc3NfLmJhc2UgIT0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IFByb2IoKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIHV0aWw6OlJlYWROb25Qb3NpdGl2ZUZsb2F0MzEoYWRkcmVzc18uYmFzZSwgYWRkcmVzc18ub2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IEJhY2tvZmYoKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIHV0aWw6OlJlYWRGbG9hdDMyKGFkZHJlc3NfLmJhc2UsIGFkZHJlc3NfLm9mZnNldCArIDMxKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IFJlc3QoKSBjb25zdCB7IHJldHVybiBQcm9iKCk7IH0KKworICAgICAgICB2b2lkIFdyaXRlKGZsb2F0IHByb2IsIGZsb2F0IGJhY2tvZmYpIHsKKyAgICAgICAgICB1dGlsOjpXcml0ZU5vblBvc2l0aXZlRmxvYXQzMShhZGRyZXNzXy5iYXNlLCBhZGRyZXNzXy5vZmZzZXQsIHByb2IpOworICAgICAgICAgIHV0aWw6OldyaXRlRmxvYXQzMihhZGRyZXNzXy5iYXNlLCBhZGRyZXNzXy5vZmZzZXQgKyAzMSwgYmFja29mZik7CisgICAgICAgIH0KKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgdXRpbDo6Qml0QWRkcmVzcyBhZGRyZXNzXzsKKyAgICB9OworCisgICAgY2xhc3MgTG9uZ2VzdFBvaW50ZXIgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBMb25nZXN0UG9pbnRlcihjb25zdCBEb250UXVhbnRpemUgJi8qcXVhbnQqLywgdXRpbDo6Qml0QWRkcmVzcyBhZGRyZXNzKSA6IGFkZHJlc3NfKGFkZHJlc3MpIHt9CisKKyAgICAgICAgTG9uZ2VzdFBvaW50ZXIoKSA6IGFkZHJlc3NfKE5VTEwsIDApIHt9CisKKyAgICAgICAgYm9vbCBGb3VuZCgpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gYWRkcmVzc18uYmFzZSAhPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgUHJvYigpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gdXRpbDo6UmVhZE5vblBvc2l0aXZlRmxvYXQzMShhZGRyZXNzXy5iYXNlLCBhZGRyZXNzXy5vZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBXcml0ZShmbG9hdCBwcm9iKSB7CisgICAgICAgICAgdXRpbDo6V3JpdGVOb25Qb3NpdGl2ZUZsb2F0MzEoYWRkcmVzc18uYmFzZSwgYWRkcmVzc18ub2Zmc2V0LCBwcm9iKTsKKyAgICAgICAgfQorCisgICAgICBwcml2YXRlOgorICAgICAgICB1dGlsOjpCaXRBZGRyZXNzIGFkZHJlc3NfOworICAgIH07CisKKyAgICBEb250UXVhbnRpemUoKSB7fQorCisgICAgdm9pZCBTZXR1cE1lbW9yeSh2b2lkICogLypzdGFydCovLCB1bnNpZ25lZCBjaGFyIC8qb3JkZXIqLywgY29uc3QgQ29uZmlnICYgLypjb25maWcqLykge30KKworICAgIHN0YXRpYyBjb25zdCBib29sIGtUcmFpbiA9IGZhbHNlOworICAgIC8vIFRoZXNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYmVjYXVzZSBrVHJhaW4gaXMgZmFsc2UuCisgICAgdm9pZCBUcmFpbih1aW50OF90IC8qb3JkZXIqLywgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICYvKnByb2IqLywgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICYvKmJhY2tvZmYqLykge30KKyAgICB2b2lkIFRyYWluUHJvYih1aW50OF90LCBzdGQ6OnZlY3RvcjxmbG9hdD4gJi8qcHJvYiovKSB7fQorCisgICAgdm9pZCBGaW5pc2hlZExvYWRpbmcoY29uc3QgQ29uZmlnICYpIHt9Cit9OworCitjbGFzcyBTZXBhcmF0ZWx5UXVhbnRpemUgeworICBwcml2YXRlOgorICAgIGNsYXNzIEJpbnMgeworICAgICAgcHVibGljOgorICAgICAgICAvLyBTaWdoIEMrKyBkZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICAgIEJpbnMoKSB7fQorCisgICAgICAgIEJpbnModWludDhfdCBiaXRzLCBmbG9hdCAqYmVnaW4pIDogYmVnaW5fKGJlZ2luKSwgZW5kXyhiZWdpbl8gKyAoMVVMTCA8PCBiaXRzKSksIGJpdHNfKGJpdHMpLCBtYXNrXygoMVVMTCA8PCBiaXRzKSAtIDEpIHt9CisKKyAgICAgICAgZmxvYXQgKlBvcHVsYXRlKCkgeyByZXR1cm4gYmVnaW5fOyB9CisKKyAgICAgICAgdWludDY0X3QgRW5jb2RlUHJvYihmbG9hdCB2YWx1ZSkgY29uc3QgeworICAgICAgICAgIHJldHVybiBFbmNvZGUodmFsdWUsIDApOworICAgICAgICB9CisKKyAgICAgICAgdWludDY0X3QgRW5jb2RlQmFja29mZihmbG9hdCB2YWx1ZSkgY29uc3QgeworICAgICAgICAgIGlmICh2YWx1ZSA9PSAwLjApIHsKKyAgICAgICAgICAgIHJldHVybiBIYXNFeHRlbnNpb24odmFsdWUpID8ga0V4dGVuc2lvblF1YW50IDoga05vRXh0ZW5zaW9uUXVhbnQ7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBFbmNvZGUodmFsdWUsIDIpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgRGVjb2RlKHN0ZDo6c2l6ZV90IG9mZikgY29uc3QgeyByZXR1cm4gYmVnaW5fW29mZl07IH0KKworICAgICAgICB1aW50OF90IEJpdHMoKSBjb25zdCB7IHJldHVybiBiaXRzXzsgfQorCisgICAgICAgIHVpbnQ2NF90IE1hc2soKSBjb25zdCB7IHJldHVybiBtYXNrXzsgfQorCisgICAgICBwcml2YXRlOgorICAgICAgICB1aW50NjRfdCBFbmNvZGUoZmxvYXQgdmFsdWUsIHNpemVfdCByZXNlcnZlZCkgY29uc3QgeworICAgICAgICAgIGNvbnN0IGZsb2F0ICphYm92ZSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQqPihiZWdpbl8pICsgcmVzZXJ2ZWQsIGVuZF8sIHZhbHVlKTsKKyAgICAgICAgICBpZiAoYWJvdmUgPT0gYmVnaW5fICsgcmVzZXJ2ZWQpIHJldHVybiByZXNlcnZlZDsKKyAgICAgICAgICBpZiAoYWJvdmUgPT0gZW5kXykgcmV0dXJuIGVuZF8gLSBiZWdpbl8gLSAxOworICAgICAgICAgIHJldHVybiBhYm92ZSAtIGJlZ2luXyAtICh2YWx1ZSAtICooYWJvdmUgLSAxKSA8ICphYm92ZSAtIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0ICpiZWdpbl87CisgICAgICAgIGNvbnN0IGZsb2F0ICplbmRfOworICAgICAgICB1aW50OF90IGJpdHNfOworICAgICAgICB1aW50NjRfdCBtYXNrXzsKKyAgICB9OworCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgTW9kZWxUeXBlIGtNb2RlbFR5cGVBZGQgPSBrUXVhbnRBZGQ7CisKKyAgICBzdGF0aWMgdm9pZCBVcGRhdGVDb25maWdGcm9tQmluYXJ5KGNvbnN0IEJpbmFyeUZvcm1hdCAmZmlsZSwgdWludDY0X3Qgb2Zmc2V0LCBDb25maWcgJmNvbmZpZyk7CisKKyAgICBzdGF0aWMgdWludDY0X3QgU2l6ZSh1aW50OF90IG9yZGVyLCBjb25zdCBDb25maWcgJmNvbmZpZykgeworICAgICAgdWludDY0X3QgbG9uZ2VzdF90YWJsZSA9IChzdGF0aWNfY2FzdDx1aW50NjRfdD4oMSkgPDwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGNvbmZpZy5wcm9iX2JpdHMpKSAqIHNpemVvZihmbG9hdCk7CisgICAgICB1aW50NjRfdCBtaWRkbGVfdGFibGUgPSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDEpIDw8IHN0YXRpY19jYXN0PHVpbnQ2NF90Pihjb25maWcuYmFja29mZl9iaXRzKSkgKiBzaXplb2YoZmxvYXQpICsgbG9uZ2VzdF90YWJsZTsKKyAgICAgIC8vIHVuaWdyYW1zIGFyZSBjdXJyZW50bHkgbm90IHF1YW50aXplZCBzbyBubyBuZWVkIGZvciBhIHRhYmxlLgorICAgICAgcmV0dXJuIChvcmRlciAtIDIpICogbWlkZGxlX3RhYmxlICsgbG9uZ2VzdF90YWJsZSArIC8qIGZvciB0aGUgYml0IGNvdW50cyBhbmQgYWxpZ25tZW50IHBhZGRpbmcpICovIDg7CisgICAgfQorCisgICAgc3RhdGljIHVpbnQ4X3QgTWlkZGxlQml0cyhjb25zdCBDb25maWcgJmNvbmZpZykgeyByZXR1cm4gY29uZmlnLnByb2JfYml0cyArIGNvbmZpZy5iYWNrb2ZmX2JpdHM7IH0KKyAgICBzdGF0aWMgdWludDhfdCBMb25nZXN0Qml0cyhjb25zdCBDb25maWcgJmNvbmZpZykgeyByZXR1cm4gY29uZmlnLnByb2JfYml0czsgfQorCisgICAgY2xhc3MgTWlkZGxlUG9pbnRlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIE1pZGRsZVBvaW50ZXIoY29uc3QgU2VwYXJhdGVseVF1YW50aXplICZxdWFudCwgdW5zaWduZWQgY2hhciBvcmRlcl9taW51c18yLCBjb25zdCB1dGlsOjpCaXRBZGRyZXNzICZhZGRyZXNzKSA6IGJpbnNfKHF1YW50LkdldFRhYmxlcyhvcmRlcl9taW51c18yKSksIGFkZHJlc3NfKGFkZHJlc3MpIHt9CisKKyAgICAgICAgTWlkZGxlUG9pbnRlcigpIDogYWRkcmVzc18oTlVMTCwgMCkge30KKworICAgICAgICBib29sIEZvdW5kKCkgY29uc3QgeyByZXR1cm4gYWRkcmVzc18uYmFzZSAhPSBOVUxMOyB9CisKKyAgICAgICAgZmxvYXQgUHJvYigpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gUHJvYkJpbnMoKS5EZWNvZGUodXRpbDo6UmVhZEludDI1KGFkZHJlc3NfLmJhc2UsIGFkZHJlc3NfLm9mZnNldCArIEJhY2tvZmZCaW5zKCkuQml0cygpLCBQcm9iQmlucygpLkJpdHMoKSwgUHJvYkJpbnMoKS5NYXNrKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IEJhY2tvZmYoKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIEJhY2tvZmZCaW5zKCkuRGVjb2RlKHV0aWw6OlJlYWRJbnQyNShhZGRyZXNzXy5iYXNlLCBhZGRyZXNzXy5vZmZzZXQsIEJhY2tvZmZCaW5zKCkuQml0cygpLCBCYWNrb2ZmQmlucygpLk1hc2soKSkpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgUmVzdCgpIGNvbnN0IHsgcmV0dXJuIFByb2IoKTsgfQorCisgICAgICAgIHZvaWQgV3JpdGUoZmxvYXQgcHJvYiwgZmxvYXQgYmFja29mZikgY29uc3QgeworICAgICAgICAgIHV0aWw6OldyaXRlSW50NTcoYWRkcmVzc18uYmFzZSwgYWRkcmVzc18ub2Zmc2V0LCBQcm9iQmlucygpLkJpdHMoKSArIEJhY2tvZmZCaW5zKCkuQml0cygpLAorICAgICAgICAgICAgICAoUHJvYkJpbnMoKS5FbmNvZGVQcm9iKHByb2IpIDw8IEJhY2tvZmZCaW5zKCkuQml0cygpKSB8IEJhY2tvZmZCaW5zKCkuRW5jb2RlQmFja29mZihiYWNrb2ZmKSk7CisgICAgICAgIH0KKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQmlucyAmUHJvYkJpbnMoKSBjb25zdCB7IHJldHVybiBiaW5zX1swXTsgfQorICAgICAgICBjb25zdCBCaW5zICZCYWNrb2ZmQmlucygpIGNvbnN0IHsgcmV0dXJuIGJpbnNfWzFdOyB9CisgICAgICAgIGNvbnN0IEJpbnMgKmJpbnNfOworCisgICAgICAgIHV0aWw6OkJpdEFkZHJlc3MgYWRkcmVzc187CisgICAgfTsKKworICAgIGNsYXNzIExvbmdlc3RQb2ludGVyIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgTG9uZ2VzdFBvaW50ZXIoY29uc3QgU2VwYXJhdGVseVF1YW50aXplICZxdWFudCwgY29uc3QgdXRpbDo6Qml0QWRkcmVzcyAmYWRkcmVzcykgOiB0YWJsZV8oJnF1YW50Lkxvbmdlc3RUYWJsZSgpKSwgYWRkcmVzc18oYWRkcmVzcykge30KKworICAgICAgICBMb25nZXN0UG9pbnRlcigpIDogYWRkcmVzc18oTlVMTCwgMCkge30KKworICAgICAgICBib29sIEZvdW5kKCkgY29uc3QgeyByZXR1cm4gYWRkcmVzc18uYmFzZSAhPSBOVUxMOyB9CisKKyAgICAgICAgdm9pZCBXcml0ZShmbG9hdCBwcm9iKSBjb25zdCB7CisgICAgICAgICAgdXRpbDo6V3JpdGVJbnQyNShhZGRyZXNzXy5iYXNlLCBhZGRyZXNzXy5vZmZzZXQsIHRhYmxlXy0+Qml0cygpLCB0YWJsZV8tPkVuY29kZVByb2IocHJvYikpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgUHJvYigpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gdGFibGVfLT5EZWNvZGUodXRpbDo6UmVhZEludDI1KGFkZHJlc3NfLmJhc2UsIGFkZHJlc3NfLm9mZnNldCwgdGFibGVfLT5CaXRzKCksIHRhYmxlXy0+TWFzaygpKSk7CisgICAgICAgIH0KKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQmlucyAqdGFibGVfOworICAgICAgICB1dGlsOjpCaXRBZGRyZXNzIGFkZHJlc3NfOworICAgIH07CisKKyAgICBTZXBhcmF0ZWx5UXVhbnRpemUoKSB7fQorCisgICAgdm9pZCBTZXR1cE1lbW9yeSh2b2lkICpzdGFydCwgdW5zaWduZWQgY2hhciBvcmRlciwgY29uc3QgQ29uZmlnICZjb25maWcpOworCisgICAgc3RhdGljIGNvbnN0IGJvb2wga1RyYWluID0gdHJ1ZTsKKyAgICAvLyBBc3N1bWVzIDAuMCBpcyByZW1vdmVkIGZyb20gYmFja29mZi4KKyAgICB2b2lkIFRyYWluKHVpbnQ4X3Qgb3JkZXIsIHN0ZDo6dmVjdG9yPGZsb2F0PiAmcHJvYiwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICZiYWNrb2ZmKTsKKyAgICAvLyBUcmFpbiBqdXN0IHByb2JhYmlsaXRpZXMgKGZvciBsb25nZXN0IG9yZGVyKS4KKyAgICB2b2lkIFRyYWluUHJvYih1aW50OF90IG9yZGVyLCBzdGQ6OnZlY3RvcjxmbG9hdD4gJnByb2IpOworCisgICAgdm9pZCBGaW5pc2hlZExvYWRpbmcoY29uc3QgQ29uZmlnICZjb25maWcpOworCisgICAgY29uc3QgQmlucyAqR2V0VGFibGVzKHVuc2lnbmVkIGNoYXIgb3JkZXJfbWludXNfMikgY29uc3QgeyByZXR1cm4gdGFibGVzX1tvcmRlcl9taW51c18yXTsgfQorCisgICAgY29uc3QgQmlucyAmTG9uZ2VzdFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbG9uZ2VzdF87IH0KKworICBwcml2YXRlOgorICAgIEJpbnMgdGFibGVzX1tLRU5MTV9NQVhfT1JERVIgLSAxXVsyXTsKKworICAgIEJpbnMgbG9uZ2VzdF87CisKKyAgICB1aW50OF90ICphY3R1YWxfYmFzZV87CisKKyAgICB1aW50OF90IHByb2JfYml0c18sIGJhY2tvZmZfYml0c187Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZ3JhbQorfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX1FVQU5USVpFX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9xdWVyeV9tYWluLmNjIGIvc3JjL2tlbmxtL2xtL3F1ZXJ5X21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkMjhmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9xdWVyeV9tYWluLmNjCkBAIC0wLDAgKzEsMTE1IEBACisjaW5jbHVkZSAibG0vbmdyYW1fcXVlcnkuaGgiCisjaW5jbHVkZSAidXRpbC9nZXRvcHQuaGgiCisKKyNpZmRlZiBXSVRIX05QTE0KKyNpbmNsdWRlICJsbS93cmFwcGVycy9ucGxtLmhoIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwordm9pZCBVc2FnZShjb25zdCBjaGFyICpuYW1lKSB7CisgIHN0ZDo6Y2VyciA8PAorICAgICJLZW5MTSB3YXMgY29tcGlsZWQgd2l0aCBtYXhpbXVtIG9yZGVyICIgPDwgS0VOTE1fTUFYX09SREVSIDw8ICIuXG4iCisgICAgIlVzYWdlOiAiIDw8IG5hbWUgPDwgIiBbLWJdIFstbl0gWy13XSBbLXNdIGxtX2ZpbGVcbiIKKyAgICAiLWI6IERvIG5vdCBidWZmZXIgb3V0cHV0LlxuIgorICAgICItbjogRG8gbm90IHdyYXAgdGhlIGlucHV0IGluIDxzPiBhbmQgPC9zPi5cbiIKKyAgICAiLXYgc3VtbWFyeXxzZW50ZW5jZXx3b3JkOiBMZXZlbCBvZiB2ZXJib3NpdHlcbiIKKyAgICAiLWwgbGF6eXxwb3B1bGF0ZXxyZWFkfHBhcmFsbGVsOiBMb2FkIGxhemlseSwgd2l0aCBwb3B1bGF0ZSwgb3IgbWFsbG9jK3JlYWRcbiIKKyAgICAiVGhlIGRlZmF1bHQgbG9hZGluZyBtZXRob2QgaXMgcG9wdWxhdGUgb24gTGludXggYW5kIHJlYWQgb24gb3RoZXJzLlxuIjsKKyAgZXhpdCgxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBpZiAoYXJnYyA9PSAxIHx8IChhcmdjID09IDIgJiYgIXN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikpKQorICAgIFVzYWdlKGFyZ3ZbMF0pOworCisgIGxtOjpuZ3JhbTo6Q29uZmlnIGNvbmZpZzsKKyAgYm9vbCBzZW50ZW5jZV9jb250ZXh0ID0gdHJ1ZTsKKyAgdW5zaWduZWQgaW50IHZlcmJvc2l0eSA9IDI7CisgIGJvb2wgZmx1c2ggPSBmYWxzZTsKKworICBpbnQgb3B0OworICB3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiYm52Omw6IikpICE9IC0xKSB7CisgICAgc3dpdGNoIChvcHQpIHsKKyAgICAgIGNhc2UgJ2InOgorICAgICAgICBmbHVzaCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnbic6CisgICAgICAgIHNlbnRlbmNlX2NvbnRleHQgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd2JzoKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0YXJnLCAid29yZCIpIHx8ICFzdHJjbXAob3B0YXJnLCAiMiIpKSB7CisgICAgICAgICAgdmVyYm9zaXR5ID0gMjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgInNlbnRlbmNlIikgfHwgIXN0cmNtcChvcHRhcmcsICIxIikpIHsKKyAgICAgICAgICB2ZXJib3NpdHkgPSAxOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAic3VtbWFyeSIpIHx8ICFzdHJjbXAob3B0YXJnLCAiMCIpKSB7CisgICAgICAgICAgdmVyYm9zaXR5ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBVc2FnZShhcmd2WzBdKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2wnOgorICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsICJsYXp5IikpIHsKKyAgICAgICAgICBjb25maWcubG9hZF9tZXRob2QgPSB1dGlsOjpMQVpZOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAicG9wdWxhdGUiKSkgeworICAgICAgICAgIGNvbmZpZy5sb2FkX21ldGhvZCA9IHV0aWw6OlBPUFVMQVRFX09SX1JFQUQ7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJyZWFkIikpIHsKKyAgICAgICAgICBjb25maWcubG9hZF9tZXRob2QgPSB1dGlsOjpSRUFEOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAicGFyYWxsZWwiKSkgeworICAgICAgICAgIGNvbmZpZy5sb2FkX21ldGhvZCA9IHV0aWw6OlBBUkFMTEVMX1JFQUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVXNhZ2UoYXJndlswXSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdoJzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIFVzYWdlKGFyZ3ZbMF0pOworICAgIH0KKyAgfQorICBpZiAob3B0aW5kICsgMSAhPSBhcmdjKQorICAgIFVzYWdlKGFyZ3ZbMF0pOworICBsbTo6bmdyYW06OlF1ZXJ5UHJpbnRlciBwcmludGVyKDEsIHZlcmJvc2l0eSA+PSAyLCB2ZXJib3NpdHkgPj0gMSwgdHJ1ZSwgZmx1c2gpOworICBjb25zdCBjaGFyICpmaWxlID0gYXJndltvcHRpbmRdOworICB0cnkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBsbTo6bmdyYW07CisgICAgTW9kZWxUeXBlIG1vZGVsX3R5cGU7CisgICAgaWYgKFJlY29nbml6ZUJpbmFyeShmaWxlLCBtb2RlbF90eXBlKSkgeworICAgICAgc3dpdGNoKG1vZGVsX3R5cGUpIHsKKyAgICAgICAgY2FzZSBQUk9CSU5HOgorICAgICAgICAgIFF1ZXJ5PGxtOjpuZ3JhbTo6UHJvYmluZ01vZGVsPihmaWxlLCBjb25maWcsIHNlbnRlbmNlX2NvbnRleHQsIHByaW50ZXIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFU1RfUFJPQklORzoKKyAgICAgICAgICBRdWVyeTxsbTo6bmdyYW06OlJlc3RQcm9iaW5nTW9kZWw+KGZpbGUsIGNvbmZpZywgc2VudGVuY2VfY29udGV4dCwgcHJpbnRlcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFJJRToKKyAgICAgICAgICBRdWVyeTxUcmllTW9kZWw+KGZpbGUsIGNvbmZpZywgc2VudGVuY2VfY29udGV4dCwgcHJpbnRlcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUVVBTlRfVFJJRToKKyAgICAgICAgICBRdWVyeTxRdWFudFRyaWVNb2RlbD4oZmlsZSwgY29uZmlnLCBzZW50ZW5jZV9jb250ZXh0LCBwcmludGVyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBUlJBWV9UUklFOgorICAgICAgICAgIFF1ZXJ5PEFycmF5VHJpZU1vZGVsPihmaWxlLCBjb25maWcsIHNlbnRlbmNlX2NvbnRleHQsIHByaW50ZXIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFFVQU5UX0FSUkFZX1RSSUU6CisgICAgICAgICAgUXVlcnk8UXVhbnRBcnJheVRyaWVNb2RlbD4oZmlsZSwgY29uZmlnLCBzZW50ZW5jZV9jb250ZXh0LCBwcmludGVyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlVucmVjb2duaXplZCBrZW5sbSBtb2RlbCB0eXBlICIgPDwgbW9kZWxfdHlwZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgYWJvcnQoKTsKKyAgICAgIH0KKyNpZmRlZiBXSVRIX05QTE0KKyAgICB9IGVsc2UgaWYgKGxtOjpucDo6TW9kZWw6OlJlY29nbml6ZShmaWxlKSkgeworICAgICAgbG06Om5wOjpNb2RlbCBtb2RlbChmaWxlKTsKKyAgICAgIFF1ZXJ5PGxtOjpucDo6TW9kZWwsIGxtOjpuZ3JhbTo6UXVlcnlQcmludGVyPihtb2RlbCwgc2VudGVuY2VfY29udGV4dCwgcHJpbnRlcik7CisgICAgICBRdWVyeTxsbTo6bnA6Ok1vZGVsLCBsbTo6bmdyYW06OlF1ZXJ5UHJpbnRlcj4obW9kZWwsIHNlbnRlbmNlX2NvbnRleHQsIHByaW50ZXIpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIFF1ZXJ5PFByb2JpbmdNb2RlbD4oZmlsZSwgY29uZmlnLCBzZW50ZW5jZV9jb250ZXh0LCBwcmludGVyKTsKKyAgICB9CisgICAgdXRpbDo6UHJpbnRVc2FnZShzdGQ6OmNlcnIpOworICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmZSkgeworICAgIHN0ZDo6Y2VyciA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vcmVhZF9hcnBhLmNjIGIvc3JjL2tlbmxtL2xtL3JlYWRfYXJwYS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA1YTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL3JlYWRfYXJwYS5jYwpAQCAtMCwwICsxLDE2MSBAQAorI2luY2x1ZGUgImxtL3JlYWRfYXJwYS5oaCIKKworI2luY2x1ZGUgImxtL2JsYW5rLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmZGVmIFdJTjMyCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgbG0geworCisvLyAxIGZvciAnXHQnLCAnXG4nLCBhbmQgJyAnLiAgVGhpcyBpcyBzdHJpY3RlciB0aGFuIGlzc3BhY2UuCitjb25zdCBib29sIGtBUlBBU3BhY2VzWzI1Nl0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisKK25hbWVzcGFjZSB7CisKK2Jvb2wgSXNFbnRpcmVseVdoaXRlU3BhY2UoY29uc3QgU3RyaW5nUGllY2UgJmxpbmUpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KGxpbmUuc2l6ZSgpKTsgKytpKSB7CisgICAgaWYgKCFpc3NwYWNlKGxpbmUuZGF0YSgpW2ldKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBjaGFyIGtCaW5hcnlNYWdpY1tdID0gIm1tYXAgbG0gaHR0cDovL2toZWFmaWVsZC5jb20vY29kZSI7CisKKy8vIHN0cnRvdWxsIGlzbid0IHBvcnRhYmxlIGVub3VnaCA6LSgKK3VpbnQ2NF90IFJlYWRDb3VudChjb25zdCBzdGQ6OnN0cmluZyAmZnJvbSkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW0oZnJvbSk7CisgIHVpbnQ2NF90IHJldDsKKyAgc3RyZWFtID4+IHJldDsKKyAgVVRJTF9USFJPV19JRighc3RyZWFtLCBGb3JtYXRMb2FkRXhjZXB0aW9uLCAiQmFkIGNvdW50ICIgPDwgZnJvbSk7CisgIHJldHVybiByZXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKK3ZvaWQgUmVhZEFSUEFDb3VudHModXRpbDo6RmlsZVBpZWNlICZpbiwgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZudW1iZXIpIHsKKyAgbnVtYmVyLmNsZWFyKCk7CisgIFN0cmluZ1BpZWNlIGxpbmUgPSBpbi5SZWFkTGluZSgpOworICAvLyBJbiBnZW5lcmFsLCBBUlBBIGZpbGVzIGNhbiBoYXZlIGFyYml0cmFyeSB0ZXh0IGJlZm9yZSAiXGRhdGFcIgorICAvLyBCdXQgaW4gS2VuTE0sIHdlIHJlcXVpcmUgc3VjaCBsaW5lcyB0byBzdGFydCB3aXRoICIjIiwgc28gdGhhdAorICAvLyB3ZSBjYW4gZG8gc3RyaWN0ZXIgZXJyb3IgY2hlY2tpbmcKKyAgd2hpbGUgKElzRW50aXJlbHlXaGl0ZVNwYWNlKGxpbmUpIHx8IHN0YXJ0c193aXRoKGxpbmUsICIjIikpIHsKKyAgICBsaW5lID0gaW4uUmVhZExpbmUoKTsKKyAgfQorCisgIGlmIChsaW5lICE9ICJcXGRhdGFcXCIpIHsKKyAgICBpZiAoKGxpbmUuc2l6ZSgpID49IDIpICYmIChsaW5lLmRhdGEoKVswXSA9PSAweDFmKSAmJiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4obGluZS5kYXRhKClbMV0pID09IDB4OGIpKSB7CisgICAgICBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJMb29rcyBsaWtlIGEgZ3ppcCBmaWxlLiAgSWYgdGhpcyBpcyBhbiBBUlBBIGZpbGUsIHBpcGUgIiA8PCBpbi5GaWxlTmFtZSgpIDw8ICIgdGhyb3VnaCB6Y2F0LiAgSWYgdGhpcyBhbHJlYWR5IGluIGJpbmFyeSBmb3JtYXQsIHlvdSBuZWVkIHRvIGRlY29tcHJlc3MgaXQgYmVjYXVzZSBtbWFwIGRvZXNuJ3Qgd29yayBvbiB0b3Agb2YgZ3ppcC4iKTsKKyAgICB9CisgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4obGluZS5zaXplKCkpID49IHN0cmxlbihrQmluYXJ5TWFnaWMpICYmIFN0cmluZ1BpZWNlKGxpbmUuZGF0YSgpLCBzdHJsZW4oa0JpbmFyeU1hZ2ljKSkgPT0ga0JpbmFyeU1hZ2ljKQorICAgICAgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiVGhpcyBsb29rcyBsaWtlIGEgYmluYXJ5IGZpbGUgYnV0IGdvdCBzZW50IHRvIHRoZSBBUlBBIHBhcnNlci4gIERpZCB5b3UgY29tcHJlc3MgdGhlIGJpbmFyeSBmaWxlIG9yIHBhc3MgYSBiaW5hcnkgZmlsZSB3aGVyZSBvbmx5IEFSUEEgZmlsZXMgYXJlIGFjY2VwdGVkPyIpOworICAgIFVUSUxfVEhST1dfSUYobGluZS5zaXplKCkgPj0gNCAmJiBTdHJpbmdQaWVjZShsaW5lLmRhdGEoKSwgNCkgPT0gImJsbXQiLCBGb3JtYXRMb2FkRXhjZXB0aW9uLCAiVGhpcyBsb29rcyBsaWtlIGFuIElSU1RMTSBiaW5hcnkgZmlsZS4gIERpZCB5b3UgZm9yZ2V0IHRvIHBhc3MgLS10ZXh0IHllcyB0byBjb21waWxlLWxtPyIpOworICAgIFVUSUxfVEhST1dfSUYobGluZSA9PSAiaUFSUEEiLCBGb3JtYXRMb2FkRXhjZXB0aW9uLCAiVGhpcyBsb29rcyBsaWtlIGFuIElSU1RMTSBpQVJQQSBmaWxlLiAgWW91IG5lZWQgYW4gQVJQQSBmaWxlLiAgUnVuXG4gIGNvbXBpbGUtbG0gLS10ZXh0IHllcyAiIDw8IGluLkZpbGVOYW1lKCkgPDwgIiAiIDw8IGluLkZpbGVOYW1lKCkgPDwgIi5hcnBhXG5maXJzdC4iKTsKKyAgICBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJmaXJzdCBub24tZW1wdHkgbGluZSB3YXMgXCIiIDw8IGxpbmUgPDwgIlwiIG5vdCBcXGRhdGFcXC4iKTsKKyAgfQorICB3aGlsZSAoIUlzRW50aXJlbHlXaGl0ZVNwYWNlKGxpbmUgPSBpbi5SZWFkTGluZSgpKSkgeworICAgIGlmIChsaW5lLnNpemUoKSA8IDYgfHwgc3RybmNtcChsaW5lLmRhdGEoKSwgIm5ncmFtICIsIDYpKSBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJjb3VudCBsaW5lIFwiIiA8PCBsaW5lIDw8ICJcImRvZXNuJ3QgYmVnaW4gd2l0aCBcIm5ncmFtIFwiIik7CisgICAgLy8gU28gc3RydG9sIGRvZXNuJ3QgZ28gb2ZmIHRoZSBlbmQgb2YgbGluZS4KKyAgICBzdGQ6OnN0cmluZyByZW1haW5pbmcobGluZS5kYXRhKCkgKyA2LCBsaW5lLnNpemUoKSAtIDYpOworICAgIGNoYXIgKmVuZF9wdHI7CisgICAgdW5zaWduZWQgaW50IGxlbmd0aCA9IHN0ZDo6c3RydG9sKHJlbWFpbmluZy5jX3N0cigpLCAmZW5kX3B0ciwgMTApOworICAgIGlmICgoZW5kX3B0ciA9PSByZW1haW5pbmcuY19zdHIoKSkgfHwgKGxlbmd0aCAtIDEgIT0gbnVtYmVyLnNpemUoKSkpIFVUSUxfVEhST1coRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIm5ncmFtIGNvdW50IGxlbmd0aHMgc2hvdWxkIGJlIGNvbnNlY3V0aXZlIHN0YXJ0aW5nIHdpdGggMTogIiA8PCBsaW5lKTsKKyAgICBpZiAoKmVuZF9wdHIgIT0gJz0nKSBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJFeHBlY3RlZCA9IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgZmlyc3QgbnVtYmVyIGluIHRoZSBjb3VudCBsaW5lICIgPDwgbGluZSk7CisgICAgKytlbmRfcHRyOworICAgIG51bWJlci5wdXNoX2JhY2soUmVhZENvdW50KGVuZF9wdHIpKTsKKyAgfQorfQorCit2b2lkIFJlYWROR3JhbUhlYWRlcih1dGlsOjpGaWxlUGllY2UgJmluLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKSB7CisgICBTdHJpbmdQaWVjZSBsaW5lOworICB3aGlsZSAoSXNFbnRpcmVseVdoaXRlU3BhY2UobGluZSA9IGluLlJlYWRMaW5lKCkpKSB7fQorICBzdGQ6OnN0cmluZ3N0cmVhbSBleHBlY3RlZDsKKyAgZXhwZWN0ZWQgPDwgJ1xcJyA8PCBsZW5ndGggPDwgIi1ncmFtczoiOworICBpZiAobGluZSAhPSBleHBlY3RlZC5zdHIoKSkgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiV2FzIGV4cGVjdGluZyBuLWdyYW0gaGVhZGVyICIgPDwgZXhwZWN0ZWQuc3RyKCkgPDwgIiBidXQgZ290ICIgPDwgbGluZSA8PCAiIGluc3RlYWQiKTsKK30KKwordm9pZCBSZWFkQmFja29mZih1dGlsOjpGaWxlUGllY2UgJmluLCBQcm9iICYvKndlaWdodHMqLykgeworICBzd2l0Y2ggKGluLmdldCgpKSB7CisgICAgY2FzZSAnXHQnOgorICAgICAgeworICAgICAgICBmbG9hdCBnb3QgPSBpbi5SZWFkRmxvYXQoKTsKKyAgICAgICAgaWYgKGdvdCAhPSAwLjApCisgICAgICAgICAgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiTm9uLXplcm8gYmFja29mZiAiIDw8IGdvdCA8PCAiIHByb3ZpZGVkIGZvciBhbiBuLWdyYW0gdGhhdCBzaG91bGQgaGF2ZSBubyBiYWNrb2ZmIik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdcbic6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiRXhwZWN0ZWQgdGFiIG9yIG5ld2xpbmUgZm9yIGJhY2tvZmYiKTsKKyAgfQorfQorCit2b2lkIFJlYWRCYWNrb2ZmKHV0aWw6OkZpbGVQaWVjZSAmaW4sIGZsb2F0ICZiYWNrb2ZmKSB7CisgIC8vIEFsd2F5cyBtYWtlIHplcm8gbmVnYXRpdmUuCisgIC8vIE5lZ2F0aXZlIHplcm8gbWVhbnMgdGhhdCBubyAobisxKS1ncmFtIGhhcyB0aGlzIG4tZ3JhbSBhcyBjb250ZXh0LgorICAvLyBUaGVyZWZvcmUgdGhlIGh5cG90aGVzaXMgc3RhdGUgY2FuIGJlIHNob3J0ZXIuICBPZiBjb3Vyc2UsIG1hbnkgbi1ncmFtcworICAvLyBhcmUgY29udGV4dCBmb3IgKG4rMSktZ3JhbXMuICBBbiBhbGdvcml0aG0gaW4gdGhlIGRhdGEgc3RydWN0dXJlIHdpbGwgZ28KKyAgLy8gYmFjayBhbmQgc2V0IHRoZSBiYWNrb2ZmIHRvIHBvc2l0aXZlIHplcm8gaW4gdGhlc2UgY2FzZXMuCisgIHN3aXRjaCAoaW4uZ2V0KCkpIHsKKyAgICBjYXNlICdcdCc6CisgICAgICBiYWNrb2ZmID0gaW4uUmVhZEZsb2F0KCk7CisgICAgICBpZiAoYmFja29mZiA9PSBuZ3JhbTo6a0V4dGVuc2lvbkJhY2tvZmYpIGJhY2tvZmYgPSBuZ3JhbTo6a05vRXh0ZW5zaW9uQmFja29mZjsKKyAgICAgIHsKKyNpZiBkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKwkJaW50IGZsb2F0X2NsYXNzID0gX2ZwY2xhc3MoYmFja29mZik7CisgICAgICAgIFVUSUxfVEhST1dfSUYoZmxvYXRfY2xhc3MgPT0gX0ZQQ0xBU1NfU05BTiB8fCBmbG9hdF9jbGFzcyA9PSBfRlBDTEFTU19RTkFOIHx8IGZsb2F0X2NsYXNzID09IF9GUENMQVNTX05JTkYgfHwgZmxvYXRfY2xhc3MgPT0gX0ZQQ0xBU1NfUElORiwgRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIkJhZCBiYWNrb2ZmICIgPDwgYmFja29mZik7CisjZWxzZQorICAgICAgICBpbnQgZmxvYXRfY2xhc3MgPSBzdGQ6OmZwY2xhc3NpZnkoYmFja29mZik7CisgICAgICAgIFVUSUxfVEhST1dfSUYoZmxvYXRfY2xhc3MgPT0gRlBfTkFOIHx8IGZsb2F0X2NsYXNzID09IEZQX0lORklOSVRFLCBGb3JtYXRMb2FkRXhjZXB0aW9uLCAiQmFkIGJhY2tvZmYgIiA8PCBiYWNrb2ZmKTsKKyNlbmRpZgorICAgICAgfQorICAgICAgVVRJTF9USFJPV19JRihpbi5nZXQoKSAhPSAnXG4nLCBGb3JtYXRMb2FkRXhjZXB0aW9uLCAiRXhwZWN0ZWQgbmV3bGluZSBhZnRlciBiYWNrb2ZmIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcbic6CisgICAgICBiYWNrb2ZmID0gbmdyYW06OmtOb0V4dGVuc2lvbkJhY2tvZmY7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiRXhwZWN0ZWQgdGFiIG9yIG5ld2xpbmUgZm9yIGJhY2tvZmYiKTsKKyAgfQorfQorCit2b2lkIFJlYWRFbmQodXRpbDo6RmlsZVBpZWNlICZpbikgeworICBTdHJpbmdQaWVjZSBsaW5lOworICBkbyB7CisgICAgbGluZSA9IGluLlJlYWRMaW5lKCk7CisgIH0gd2hpbGUgKElzRW50aXJlbHlXaGl0ZVNwYWNlKGxpbmUpKTsKKyAgaWYgKGxpbmUgIT0gIlxcZW5kXFwiKSBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJFeHBlY3RlZCBcXGVuZFxcIGJ1dCB0aGUgQVJQQSBmaWxlIGhhcyAiIDw8IGxpbmUpOworCisgIHRyeSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGxpbmUgPSBpbi5SZWFkTGluZSgpOworICAgICAgaWYgKCFJc0VudGlyZWx5V2hpdGVTcGFjZShsaW5lKSkgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiVHJhaWxpbmcgbGluZSAiIDw8IGxpbmUpOworICAgIH0KKyAgfSBjYXRjaCAoY29uc3QgdXRpbDo6RW5kT2ZGaWxlRXhjZXB0aW9uICZlKSB7fQorfQorCit2b2lkIFBvc2l0aXZlUHJvYldhcm46Oldhcm4oZmxvYXQgcHJvYikgeworICBzd2l0Y2ggKGFjdGlvbl8pIHsKKyAgICBjYXNlIFRIUk9XX1VQOgorICAgICAgVVRJTF9USFJPVyhGb3JtYXRMb2FkRXhjZXB0aW9uLCAiUG9zaXRpdmUgbG9nIHByb2JhYmlsaXR5ICIgPDwgcHJvYiA8PCAiIGluIHRoZSBtb2RlbC4gIFRoaXMgaXMgYSBidWcgaW4gSVJTVExNOyB5b3UgY2FuIHNldCBjb25maWcucG9zaXRpdmVfbG9nX3Byb2JhYmlsaXR5ID0gU0lMRU5UIG9yIHBhc3MgLWkgdG8gYnVpbGRfYmluYXJ5IHRvIHN1YnN0aXR1dGUgMC4wIGZvciB0aGUgbG9nIHByb2JhYmlsaXR5LiAgRXJyb3IiKTsKKyAgICBjYXNlIENPTVBMQUlOOgorICAgICAgc3RkOjpjZXJyIDw8ICJUaGVyZSdzIGEgcG9zaXRpdmUgbG9nIHByb2JhYmlsaXR5ICIgPDwgcHJvYiA8PCAiIGluIHRoZSBBUFJBIGZpbGUsIHByb2JhYmx5IGJlY2F1c2Ugb2YgYSBidWcgaW4gSVJTVExNLiAgVGhpcyBhbmQgc3Vic2VxdWVudCBlbnRpcmVzIHdpbGwgYmUgbWFwcGVkIHRvIDAgbG9nIHByb2JhYmlsaXR5LiIgPDwgc3RkOjplbmRsOworICAgICAgYWN0aW9uXyA9IFNJTEVOVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0lMRU5UOgorICAgICAgYnJlYWs7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgbG0KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9yZWFkX2FycGEuaGggYi9zcmMva2VubG0vbG0vcmVhZF9hcnBhLmhoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vcmVhZF9hcnBhLmhoCnJlbmFtZSB0byBzcmMva2VubG0vbG0vcmVhZF9hcnBhLmhoCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vcmV0dXJuLmhoIGIvc3JjL2tlbmxtL2xtL3JldHVybi5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTFmMjVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL3JldHVybi5oaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIExNX1JFVFVSTl9ICisjZGVmaW5lIExNX1JFVFVSTl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGxtIHsKKy8qIFN0cnVjdHVyZSByZXR1cm5lZCBieSBzY29yaW5nIHJvdXRpbmVzLiAqLworc3RydWN0IEZ1bGxTY29yZVJldHVybiB7CisgIC8vIGxvZzEwIHByb2JhYmlsaXR5CisgIGZsb2F0IHByb2I7CisKKyAgLyogVGhlIGxlbmd0aCBvZiBuLWdyYW0gbWF0Y2hlZC4gIERvIG5vdCB1c2UgdGhpcyBmb3IgcmVjb21iaW5hdGlvbi4KKyAgICogQ29uc2lkZXIgYSBtb2RlbCBjb250YWluaW5nIG9ubHkgdGhlIGZvbGxvd2luZyBuLWdyYW1zOgorICAgKiAtMSBmb28KKyAgICogLTMuMTQgIGJhcgorICAgKiAtMi43MTggYmF6IC01CisgICAqIC02IGZvbyBiYXIKKyAgICoKKyAgICogSWYgeW91IHNjb3JlIGBgYmFyJycgdGhlbiBuZ3JhbV9sZW5ndGggaXMgMSBhbmQgcmVjb21iaW5hdGlvbiBzdGF0ZSBpcyB0aGUKKyAgICogZW1wdHkgc3RyaW5nIGJlY2F1c2UgYmFyIGhhcyB6ZXJvIGJhY2tvZmYgYW5kIGRvZXMgbm90IGV4dGVuZCB0byB0aGUKKyAgICogcmlnaHQuCisgICAqIElmIHlvdSBzY29yZSBgYGZvbycnIHRoZW4gbmdyYW1fbGVuZ3RoIGlzIDEgYW5kIHJlY29tYmluYXRpb24gc3RhdGUgaXMKKyAgICogYGBmb28nJy4KKyAgICoKKyAgICogSWRlYWxseSwga2VlcCBvdXRwdXQgc3RhdGVzIGFyb3VuZCBhbmQgY29tcGFyZSB0aGVtLiAgRmFpbGluZyB0aGF0LAorICAgKiBnZXQgb3V0X3N0YXRlLlZhbGlkTGVuZ3RoKCkgYW5kIHVzZSB0aGF0IGxlbmd0aCBmb3IgcmVjb21iaW5hdGlvbi4KKyAgICovCisgIHVuc2lnbmVkIGNoYXIgbmdyYW1fbGVuZ3RoOworCisgIC8qIExlZnQgZXh0ZW5zaW9uIGluZm9ybWF0aW9uLiAgSWYgaW5kZXBlbmRlbnRfbGVmdCBpcyBzZXQsIHRoZW4gcHJvYiBpcworICAgKiBpbmRlcGVuZGVudCBvZiB3b3JkcyB0byB0aGUgbGVmdCAodXAgdG8gYWRkaXRpb25hbCBiYWNrb2ZmKS4gIE90aGVyd2lzZSwKKyAgICogZXh0ZW5kX2xlZnQgaW5kaWNhdGVzIGhvdyB0byBlZmZpY2llbnRseSBleHRlbmQgZnVydGhlciB0byB0aGUgbGVmdC4KKyAgICovCisgIGJvb2wgaW5kZXBlbmRlbnRfbGVmdDsKKyAgdWludDY0X3QgZXh0ZW5kX2xlZnQ7IC8vIERlZmluZWQgb25seSBpZiBpbmRlcGVuZGVudF9sZWZ0CisKKyAgLy8gUmVzdCBjb3N0IGZvciBleHRlbnNpb24gdG8gdGhlIGxlZnQuCisgIGZsb2F0IHJlc3Q7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbQorI2VuZGlmIC8vIExNX1JFVFVSTl9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vc2VhcmNoX2hhc2hlZC5jYyBiL3NyYy9rZW5sbS9sbS9zZWFyY2hfaGFzaGVkLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vc2VhcmNoX2hhc2hlZC5jYwpyZW5hbWUgdG8gc3JjL2tlbmxtL2xtL3NlYXJjaF9oYXNoZWQuY2MKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9zZWFyY2hfaGFzaGVkLmhoIGIvc3JjL2tlbmxtL2xtL3NlYXJjaF9oYXNoZWQuaGgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9zZWFyY2hfaGFzaGVkLmhoCnJlbmFtZSB0byBzcmMva2VubG0vbG0vc2VhcmNoX2hhc2hlZC5oaApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL3NlYXJjaF90cmllLmNjIGIvc3JjL2tlbmxtL2xtL3NlYXJjaF90cmllLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Mzk4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vc2VhcmNoX3RyaWUuY2MKQEAgLTAsMCArMSw2MDAgQEAKKy8qIFRoaXMgaXMgd2hlcmUgdGhlIHRyaWUgaXMgYnVpbHQuICBJdCdzIG9uLWRpc2suICAqLworI2luY2x1ZGUgImxtL3NlYXJjaF90cmllLmhoIgorCisjaW5jbHVkZSAibG0vYmhpa3NoYS5oaCIKKyNpbmNsdWRlICJsbS9iaW5hcnlfZm9ybWF0LmhoIgorI2luY2x1ZGUgImxtL2JsYW5rLmhoIgorI2luY2x1ZGUgImxtL2xtX2V4Y2VwdGlvbi5oaCIKKyNpbmNsdWRlICJsbS9tYXhfb3JkZXIuaGgiCisjaW5jbHVkZSAibG0vcXVhbnRpemUuaGgiCisjaW5jbHVkZSAibG0vdHJpZS5oaCIKKyNpbmNsdWRlICJsbS90cmllX3NvcnQuaGgiCisjaW5jbHVkZSAibG0vdm9jYWIuaGgiCisjaW5jbHVkZSAibG0vd2VpZ2h0cy5oaCIKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorI2luY2x1ZGUgInV0aWwvZXJzYXR6X3Byb2dyZXNzLmhoIgorI2luY2x1ZGUgInV0aWwvbW1hcC5oaCIKKyNpbmNsdWRlICJ1dGlsL3Byb3h5X2l0ZXJhdG9yLmhoIgorI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgorI2luY2x1ZGUgInV0aWwvc2l6ZWRfaXRlcmF0b3IuaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgbmdyYW0geworbmFtZXNwYWNlIHRyaWUgeworbmFtZXNwYWNlIHsKKwordm9pZCBSZWFkT3JUaHJvdyhGSUxFICpmcm9tLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBVVElMX1RIUk9XX0lGKDEgIT0gc3RkOjpmcmVhZChkYXRhLCBzaXplLCAxLCBmcm9tKSwgdXRpbDo6RXJybm9FeGNlcHRpb24sICJTaG9ydCByZWFkIik7Cit9CisKK2ludCBDb21wYXJlKHVuc2lnbmVkIGNoYXIgb3JkZXIsIGNvbnN0IHZvaWQgKmZpcnN0X3ZvaWQsIGNvbnN0IHZvaWQgKnNlY29uZF92b2lkKSB7CisgIGNvbnN0IFdvcmRJbmRleCAqZmlyc3QgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFdvcmRJbmRleCo+KGZpcnN0X3ZvaWQpLCAqc2Vjb25kID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBXb3JkSW5kZXgqPihzZWNvbmRfdm9pZCk7CisgIGNvbnN0IFdvcmRJbmRleCAqZW5kID0gZmlyc3QgKyBvcmRlcjsKKyAgZm9yICg7IGZpcnN0ICE9IGVuZDsgKytmaXJzdCwgKytzZWNvbmQpIHsKKyAgICBpZiAoKmZpcnN0IDwgKnNlY29uZCkgcmV0dXJuIC0xOworICAgIGlmICgqZmlyc3QgPiAqc2Vjb25kKSByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RydWN0IFByb2JQb2ludGVyIHsKKyAgdW5zaWduZWQgY2hhciBhcnJheTsKKyAgdWludDY0X3QgaW5kZXg7Cit9OworCisvLyBBcnJheSBvZiBuLWdyYW1zIGFuZCBmbG9hdCBpbmRpY2VzLgorY2xhc3MgQmFja29mZk1lc3NhZ2VzIHsKKyAgcHVibGljOgorICAgIHZvaWQgSW5pdChzdGQ6OnNpemVfdCBlbnRyeV9zaXplKSB7CisgICAgICBjdXJyZW50XyA9IE5VTEw7CisgICAgICBhbGxvY2F0ZWRfID0gTlVMTDsKKyAgICAgIGVudHJ5X3NpemVfID0gZW50cnlfc2l6ZTsKKyAgICB9CisKKyAgICB2b2lkIEFkZChjb25zdCBXb3JkSW5kZXggKnRvLCBQcm9iUG9pbnRlciBpbmRleCkgeworICAgICAgd2hpbGUgKGN1cnJlbnRfICsgZW50cnlfc2l6ZV8gPiBhbGxvY2F0ZWRfKSB7CisgICAgICAgIHN0ZDo6c2l6ZV90IGFsbG9jYXRlZF9zaXplID0gYWxsb2NhdGVkXyAtICh1aW50OF90KiliYWNraW5nXy5nZXQoKTsKKyAgICAgICAgUmVzaXplKHN0ZDo6bWF4PHN0ZDo6c2l6ZV90PihhbGxvY2F0ZWRfc2l6ZSAqIDIsIGVudHJ5X3NpemVfKSk7CisgICAgICB9CisgICAgICBtZW1jcHkoY3VycmVudF8sIHRvLCBlbnRyeV9zaXplXyAtIHNpemVvZihQcm9iUG9pbnRlcikpOworICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8UHJvYlBvaW50ZXIqPihjdXJyZW50XyArIGVudHJ5X3NpemVfIC0gc2l6ZW9mKFByb2JQb2ludGVyKSkgPSBpbmRleDsKKyAgICAgIGN1cnJlbnRfICs9IGVudHJ5X3NpemVfOworICAgIH0KKworICAgIHZvaWQgQXBwbHkoZmxvYXQgKmNvbnN0ICpjb25zdCBiYXNlLCBGSUxFICp1bmlncmFtcykgeworICAgICAgRmluaXNoZWRBZGRpbmcoKTsKKyAgICAgIGlmIChjdXJyZW50XyA9PSBhbGxvY2F0ZWRfKSByZXR1cm47CisgICAgICByZXdpbmQodW5pZ3JhbXMpOworICAgICAgUHJvYkJhY2tvZmYgd2VpZ2h0czsKKyAgICAgIFdvcmRJbmRleCB1bmlncmFtID0gMDsKKyAgICAgIFJlYWRPclRocm93KHVuaWdyYW1zLCAmd2VpZ2h0cywgc2l6ZW9mKHdlaWdodHMpKTsKKyAgICAgIGZvciAoOyBjdXJyZW50XyAhPSBhbGxvY2F0ZWRfOyBjdXJyZW50XyArPSBlbnRyeV9zaXplXykgeworICAgICAgICBjb25zdCBXb3JkSW5kZXggJmN1cl93b3JkID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgV29yZEluZGV4Kj4oY3VycmVudF8pOworICAgICAgICBmb3IgKDsgdW5pZ3JhbSA8IGN1cl93b3JkOyArK3VuaWdyYW0pIHsKKyAgICAgICAgICBSZWFkT3JUaHJvdyh1bmlncmFtcywgJndlaWdodHMsIHNpemVvZih3ZWlnaHRzKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFIYXNFeHRlbnNpb24od2VpZ2h0cy5iYWNrb2ZmKSkgeworICAgICAgICAgIHdlaWdodHMuYmFja29mZiA9IGtFeHRlbnNpb25CYWNrb2ZmOworICAgICAgICAgIFVUSUxfVEhST1dfSUYoZnNlZWsodW5pZ3JhbXMsIC1zaXplb2Yod2VpZ2h0cyksIFNFRUtfQ1VSKSwgdXRpbDo6RXJybm9FeGNlcHRpb24sICJTZWVraW5nIGJhY2t3YXJkcyB0byBkZW5vdGUgdW5pZ3JhbSBleHRlbnNpb24gZmFpbGVkLiIpOworICAgICAgICAgIHV0aWw6OldyaXRlT3JUaHJvdyh1bmlncmFtcywgJndlaWdodHMsIHNpemVvZih3ZWlnaHRzKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgUHJvYlBvaW50ZXIgJndyaXRlX3RvID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUHJvYlBvaW50ZXIqPihjdXJyZW50XyArIHNpemVvZihXb3JkSW5kZXgpKTsKKyAgICAgICAgYmFzZVt3cml0ZV90by5hcnJheV1bd3JpdGVfdG8uaW5kZXhdICs9IHdlaWdodHMuYmFja29mZjsKKyAgICAgIH0KKyAgICAgIGJhY2tpbmdfLnJlc2V0KCk7CisgICAgfQorCisgICAgdm9pZCBBcHBseShmbG9hdCAqY29uc3QgKmNvbnN0IGJhc2UsIFJlY29yZFJlYWRlciAmcmVhZGVyKSB7CisgICAgICBGaW5pc2hlZEFkZGluZygpOworICAgICAgaWYgKGN1cnJlbnRfID09IGFsbG9jYXRlZF8pIHJldHVybjsKKyAgICAgIC8vIFdlJ2xsIGFsc28gdXNlIHRoZSBzYW1lIGJ1ZmZlciB0byByZWNvcmQgbWVzc2FnZXMgdG8gYmxhbmtzIHRoYXQgdGhleSBleHRlbmQuCisgICAgICBXb3JkSW5kZXggKmV4dGVuZF9vdXQgPSByZWludGVycHJldF9jYXN0PFdvcmRJbmRleCo+KGN1cnJlbnRfKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb3JkZXIgPSAoZW50cnlfc2l6ZV8gLSBzaXplb2YoUHJvYlBvaW50ZXIpKSAvIHNpemVvZihXb3JkSW5kZXgpOworICAgICAgZm9yIChyZWFkZXIuUmV3aW5kKCk7IHJlYWRlciAmJiAoY3VycmVudF8gIT0gYWxsb2NhdGVkXyk7ICkgeworICAgICAgICBzd2l0Y2ggKENvbXBhcmUob3JkZXIsIHJlYWRlci5EYXRhKCksIGN1cnJlbnRfKSkgeworICAgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICArK3JlYWRlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgYnV0IG5vYm9keSB0byByZWNlaXZlIGl0LiAgV3JpdGUgaXQgZG93biBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgc28gd2UgY2FuIGluZm9ybSB0aGlzIGJsYW5rIHRoYXQgaXQgZXh0ZW5kcy4KKyAgICAgICAgICAgIGZvciAoY29uc3QgV29yZEluZGV4ICp3ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBXb3JkSW5kZXggKj4oY3VycmVudF8pOyB3ICE9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgV29yZEluZGV4ICo+KGN1cnJlbnRfKSArIG9yZGVyOyArK3csICsrZXh0ZW5kX291dCkgKmV4dGVuZF9vdXQgPSAqdzsKKyAgICAgICAgICAgIGN1cnJlbnRfICs9IGVudHJ5X3NpemVfOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZmxvYXQgJmJhY2tvZmYgPSByZWludGVycHJldF9jYXN0PFByb2JCYWNrb2ZmKj4oKHVpbnQ4X3QqKXJlYWRlci5EYXRhKCkgKyBvcmRlciAqIHNpemVvZihXb3JkSW5kZXgpKS0+YmFja29mZjsKKyAgICAgICAgICAgIGlmICghSGFzRXh0ZW5zaW9uKGJhY2tvZmYpKSB7CisgICAgICAgICAgICAgIGJhY2tvZmYgPSBrRXh0ZW5zaW9uQmFja29mZjsKKyAgICAgICAgICAgICAgcmVhZGVyLk92ZXJ3cml0ZSgmYmFja29mZiwgc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjb25zdCBQcm9iUG9pbnRlciAmd3JpdGVfdG8gPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQcm9iUG9pbnRlcio+KGN1cnJlbnRfICsgZW50cnlfc2l6ZV8gLSBzaXplb2YoUHJvYlBvaW50ZXIpKTsKKyAgICAgICAgICAgICAgYmFzZVt3cml0ZV90by5hcnJheV1bd3JpdGVfdG8uaW5kZXhdICs9IGJhY2tvZmY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50XyArPSBlbnRyeV9zaXplXzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBOb3cgdGhpcyBpcyBhIGxpc3Qgb2YgYmxhbmtzIHRoYXQgZXh0ZW5kIHJpZ2h0LgorICAgICAgZW50cnlfc2l6ZV8gPSBzaXplb2YoV29yZEluZGV4KSAqIG9yZGVyOworICAgICAgUmVzaXplKHNpemVvZihXb3JkSW5kZXgpICogKGV4dGVuZF9vdXQgLSAoY29uc3QgV29yZEluZGV4KiliYWNraW5nXy5nZXQoKSkpOworICAgICAgY3VycmVudF8gPSAodWludDhfdCopYmFja2luZ18uZ2V0KCk7CisgICAgfQorCisgICAgLy8gQ2FsbCBhZnRlciBBcHBseQorICAgIGJvb2wgRXh0ZW5kcyh1bnNpZ25lZCBjaGFyIG9yZGVyLCBjb25zdCBXb3JkSW5kZXggKndvcmRzKSB7CisgICAgICBpZiAoY3VycmVudF8gPT0gYWxsb2NhdGVkXykgcmV0dXJuIGZhbHNlOworICAgICAgYXNzZXJ0KG9yZGVyICogc2l6ZW9mKFdvcmRJbmRleCkgPT0gZW50cnlfc2l6ZV8pOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3dpdGNoKENvbXBhcmUob3JkZXIsIHdvcmRzLCBjdXJyZW50XykpIHsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjdXJyZW50XyArPSBlbnRyeV9zaXplXzsKKyAgICAgICAgICAgIGlmIChjdXJyZW50XyA9PSBhbGxvY2F0ZWRfKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBGaW5pc2hlZEFkZGluZygpIHsKKyAgICAgIFJlc2l6ZShjdXJyZW50XyAtICh1aW50OF90KiliYWNraW5nXy5nZXQoKSk7CisgICAgICAvLyBTb3J0IHJlcXVlc3RzIGluIHNhbWUgb3JkZXIgYXMgZmlsZXMuCisgICAgICBzdGQ6OnNvcnQoCisgICAgICAgICAgdXRpbDo6U2l6ZWRJdGVyYXRvcih1dGlsOjpTaXplZFByb3h5KGJhY2tpbmdfLmdldCgpLCBlbnRyeV9zaXplXykpLAorICAgICAgICAgIHV0aWw6OlNpemVkSXRlcmF0b3IodXRpbDo6U2l6ZWRQcm94eShjdXJyZW50XywgZW50cnlfc2l6ZV8pKSwKKyAgICAgICAgICB1dGlsOjpTaXplZENvbXBhcmU8RW50cnlDb21wYXJlPihFbnRyeUNvbXBhcmUoKGVudHJ5X3NpemVfIC0gc2l6ZW9mKFByb2JQb2ludGVyKSkgLyBzaXplb2YoV29yZEluZGV4KSkpKTsKKyAgICAgIGN1cnJlbnRfID0gKHVpbnQ4X3QqKWJhY2tpbmdfLmdldCgpOworICAgIH0KKworICAgIHZvaWQgUmVzaXplKHN0ZDo6c2l6ZV90IHRvKSB7CisgICAgICBzdGQ6OnNpemVfdCBjdXJyZW50ID0gY3VycmVudF8gLSAodWludDhfdCopYmFja2luZ18uZ2V0KCk7CisgICAgICBiYWNraW5nXy5jYWxsX3JlYWxsb2ModG8pOworICAgICAgY3VycmVudF8gPSAodWludDhfdCopYmFja2luZ18uZ2V0KCkgKyBjdXJyZW50OworICAgICAgYWxsb2NhdGVkXyA9ICh1aW50OF90KiliYWNraW5nXy5nZXQoKSArIHRvOworICAgIH0KKworICAgIHV0aWw6OnNjb3BlZF9tYWxsb2MgYmFja2luZ187CisKKyAgICB1aW50OF90ICpjdXJyZW50XywgKmFsbG9jYXRlZF87CisKKyAgICBzdGQ6OnNpemVfdCBlbnRyeV9zaXplXzsKK307CisKK2NvbnN0IGZsb2F0IGtCYWRQcm9iID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisKK2NsYXNzIFNSSVN1Y2tzIHsKKyAgcHVibGljOgorICAgIFNSSVN1Y2tzKCkgeworICAgICAgZm9yIChCYWNrb2ZmTWVzc2FnZXMgKmkgPSBtZXNzYWdlc187IGkgIT0gbWVzc2FnZXNfICsgS0VOTE1fTUFYX09SREVSIC0gMTsgKytpKQorICAgICAgICBpLT5Jbml0KHNpemVvZihQcm9iUG9pbnRlcikgKyBzaXplb2YoV29yZEluZGV4KSAqIChpIC0gbWVzc2FnZXNfICsgMSkpOworICAgIH0KKworICAgIHZvaWQgU2VuZCh1bnNpZ25lZCBjaGFyIGJlZ2luLCB1bnNpZ25lZCBjaGFyIG9yZGVyLCBjb25zdCBXb3JkSW5kZXggKnRvLCBmbG9hdCBwcm9iX2Jhc2lzKSB7CisgICAgICBhc3NlcnQocHJvYl9iYXNpcyAhPSBrQmFkUHJvYik7CisgICAgICBQcm9iUG9pbnRlciBwb2ludGVyOworICAgICAgcG9pbnRlci5hcnJheSA9IG9yZGVyIC0gMTsKKyAgICAgIHBvaW50ZXIuaW5kZXggPSB2YWx1ZXNfW29yZGVyIC0gMV0uc2l6ZSgpOworICAgICAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSBiZWdpbjsgaSA8IG9yZGVyOyArK2kpIHsKKyAgICAgICAgbWVzc2FnZXNfW2kgLSAxXS5BZGQodG8sIHBvaW50ZXIpOworICAgICAgfQorICAgICAgdmFsdWVzX1tvcmRlciAtIDFdLnB1c2hfYmFjayhwcm9iX2Jhc2lzKTsKKyAgICB9CisKKyAgICB2b2lkIE9idGFpbkJhY2tvZmZzKHVuc2lnbmVkIGNoYXIgdG90YWxfb3JkZXIsIEZJTEUgKnVuaWdyYW1fZmlsZSwgUmVjb3JkUmVhZGVyICpyZWFkZXIpIHsKKyAgICAgIGZvciAodW5zaWduZWQgY2hhciBpID0gMDsgaSA8IEtFTkxNX01BWF9PUkRFUiAtIDE7ICsraSkgeworICAgICAgICBpdF9baV0gPSB2YWx1ZXNfW2ldLmVtcHR5KCkgPyBOVUxMIDogJip2YWx1ZXNfW2ldLmJlZ2luKCk7CisgICAgICB9CisgICAgICBtZXNzYWdlc19bMF0uQXBwbHkoaXRfLCB1bmlncmFtX2ZpbGUpOworICAgICAgQmFja29mZk1lc3NhZ2VzICptZXNzYWdlcyA9IG1lc3NhZ2VzXyArIDE7CisgICAgICBjb25zdCBSZWNvcmRSZWFkZXIgKmVuZCA9IHJlYWRlciArIHRvdGFsX29yZGVyIC0gMiAvKiBleGNsdWRlIHVuaWdyYW1zIGFuZCBsb25nZXN0IG9yZGVyICovOworICAgICAgZm9yICg7IHJlYWRlciAhPSBlbmQ7ICsrbWVzc2FnZXMsICsrcmVhZGVyKSB7CisgICAgICAgIG1lc3NhZ2VzLT5BcHBseShpdF8sICpyZWFkZXIpOworICAgICAgfQorICAgIH0KKworICAgIFByb2JCYWNrb2ZmIEdldEJsYW5rKHVuc2lnbmVkIGNoYXIgdG90YWxfb3JkZXIsIHVuc2lnbmVkIGNoYXIgb3JkZXIsIGNvbnN0IFdvcmRJbmRleCAqaW5kaWNlcykgeworICAgICAgYXNzZXJ0KG9yZGVyID4gMSk7CisgICAgICBQcm9iQmFja29mZiByZXQ7CisgICAgICByZXQucHJvYiA9ICooaXRfW29yZGVyIC0gMV0rKyk7CisgICAgICByZXQuYmFja29mZiA9ICgob3JkZXIgIT0gdG90YWxfb3JkZXIgLSAxKSAmJiBtZXNzYWdlc19bb3JkZXIgLSAxXS5FeHRlbmRzKG9yZGVyLCBpbmRpY2VzKSkgPyBrRXh0ZW5zaW9uQmFja29mZiA6IGtOb0V4dGVuc2lvbkJhY2tvZmY7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiAmVmFsdWVzKHVuc2lnbmVkIGNoYXIgb3JkZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiB2YWx1ZXNfW29yZGVyIC0gMV07CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLy8gVGhpcyB1c2VkIHRvIGJlIG9uZSBhcnJheS4gIFRoZW4gSSBuZWVkZWQgdG8gc2VwYXJhdGUgaXQgYnkgb3JkZXIgZm9yIHF1YW50aXphdGlvbiB0byB3b3JrLgorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB2YWx1ZXNfW0tFTkxNX01BWF9PUkRFUiAtIDFdOworICAgIEJhY2tvZmZNZXNzYWdlcyBtZXNzYWdlc19bS0VOTE1fTUFYX09SREVSIC0gMV07CisKKyAgICBmbG9hdCAqaXRfW0tFTkxNX01BWF9PUkRFUiAtIDFdOworfTsKKworY2xhc3MgRmluZEJsYW5rcyB7CisgIHB1YmxpYzoKKyAgICBGaW5kQmxhbmtzKHVuc2lnbmVkIGNoYXIgb3JkZXIsIGNvbnN0IFByb2JCYWNrb2ZmICp1bmlncmFtcywgU1JJU3Vja3MgJm1lc3NhZ2VzKQorICAgICAgOiBjb3VudHNfKG9yZGVyKSwgdW5pZ3JhbXNfKHVuaWdyYW1zKSwgc3JpXyhtZXNzYWdlcykge30KKworICAgIGZsb2F0IFVuaWdyYW1Qcm9iKFdvcmRJbmRleCBpbmRleCkgY29uc3QgeworICAgICAgcmV0dXJuIHVuaWdyYW1zX1tpbmRleF0ucHJvYjsKKyAgICB9CisKKyAgICB2b2lkIFVuaWdyYW0oV29yZEluZGV4IC8qaW5kZXgqLykgeworICAgICAgKytjb3VudHNfWzBdOworICAgIH0KKworICAgIHZvaWQgTWlkZGxlQmxhbmsoY29uc3QgdW5zaWduZWQgY2hhciBvcmRlciwgY29uc3QgV29yZEluZGV4ICppbmRpY2VzLCB1bnNpZ25lZCBjaGFyIGxvd2VyLCBmbG9hdCBwcm9iX2Jhc2lzKSB7CisgICAgICBzcmlfLlNlbmQobG93ZXIsIG9yZGVyLCBpbmRpY2VzICsgMSwgcHJvYl9iYXNpcyk7CisgICAgICArK2NvdW50c19bb3JkZXIgLSAxXTsKKyAgICB9CisKKyAgICB2b2lkIE1pZGRsZShjb25zdCB1bnNpZ25lZCBjaGFyIG9yZGVyLCBjb25zdCB2b2lkICogLypkYXRhKi8pIHsKKyAgICAgICsrY291bnRzX1tvcmRlciAtIDFdOworICAgIH0KKworICAgIHZvaWQgTG9uZ2VzdChjb25zdCB2b2lkICogLypkYXRhKi8pIHsKKyAgICAgICsrY291bnRzXy5iYWNrKCk7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZDb3VudHMoKSBjb25zdCB7CisgICAgICByZXR1cm4gY291bnRzXzsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRzXzsKKworICAgIGNvbnN0IFByb2JCYWNrb2ZmICp1bmlncmFtc187CisKKyAgICBTUklTdWNrcyAmc3JpXzsKK307CisKKy8vIFBoYXNlIHRvIGFjdHVhbGx5IHdyaXRlIG4tZ3JhbXMgdG8gdGhlIHRyaWUuCit0ZW1wbGF0ZSA8Y2xhc3MgUXVhbnQsIGNsYXNzIEJoaWtzaGE+IGNsYXNzIFdyaXRlRW50cmllcyB7CisgIHB1YmxpYzoKKyAgICBXcml0ZUVudHJpZXMoUmVjb3JkUmVhZGVyICpjb250ZXh0cywgY29uc3QgUXVhbnQgJnF1YW50LCBVbmlncmFtVmFsdWUgKnVuaWdyYW1zLCBCaXRQYWNrZWRNaWRkbGU8Qmhpa3NoYT4gKm1pZGRsZSwgQml0UGFja2VkTG9uZ2VzdCAmbG9uZ2VzdCwgdW5zaWduZWQgY2hhciBvcmRlciwgU1JJU3Vja3MgJnNyaSkgOgorICAgICAgY29udGV4dHNfKGNvbnRleHRzKSwKKyAgICAgIHF1YW50XyhxdWFudCksCisgICAgICB1bmlncmFtc18odW5pZ3JhbXMpLAorICAgICAgbWlkZGxlXyhtaWRkbGUpLAorICAgICAgbG9uZ2VzdF8obG9uZ2VzdCksCisgICAgICBiaWdyYW1fcGFja18oKG9yZGVyID09IDIpID8gc3RhdGljX2Nhc3Q8Qml0UGFja2VkJj4obG9uZ2VzdF8pIDogc3RhdGljX2Nhc3Q8Qml0UGFja2VkJj4oKm1pZGRsZV8pKSwKKyAgICAgIG9yZGVyXyhvcmRlciksCisgICAgICBzcmlfKHNyaSkge30KKworICAgIGZsb2F0IFVuaWdyYW1Qcm9iKFdvcmRJbmRleCBpbmRleCkgY29uc3QgeyByZXR1cm4gdW5pZ3JhbXNfW2luZGV4XS53ZWlnaHRzLnByb2I7IH0KKworICAgIHZvaWQgVW5pZ3JhbShXb3JkSW5kZXggd29yZCkgeworICAgICAgdW5pZ3JhbXNfW3dvcmRdLm5leHQgPSBiaWdyYW1fcGFja18uSW5zZXJ0SW5kZXgoKTsKKyAgICB9CisKKyAgICB2b2lkIE1pZGRsZUJsYW5rKGNvbnN0IHVuc2lnbmVkIGNoYXIgb3JkZXIsIGNvbnN0IFdvcmRJbmRleCAqaW5kaWNlcywgdW5zaWduZWQgY2hhciAvKmxvd2VyKi8sIGZsb2F0IC8qcHJvYl9iYXNlKi8pIHsKKyAgICAgIFByb2JCYWNrb2ZmIHdlaWdodHMgPSBzcmlfLkdldEJsYW5rKG9yZGVyXywgb3JkZXIsIGluZGljZXMpOworICAgICAgdHlwZW5hbWUgUXVhbnQ6Ok1pZGRsZVBvaW50ZXIocXVhbnRfLCBvcmRlciAtIDIsIG1pZGRsZV9bb3JkZXIgLSAyXS5JbnNlcnQoaW5kaWNlc1tvcmRlciAtIDFdKSkuV3JpdGUod2VpZ2h0cy5wcm9iLCB3ZWlnaHRzLmJhY2tvZmYpOworICAgIH0KKworICAgIHZvaWQgTWlkZGxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgb3JkZXIsIGNvbnN0IHZvaWQgKmRhdGEpIHsKKyAgICAgIFJlY29yZFJlYWRlciAmY29udGV4dCA9IGNvbnRleHRzX1tvcmRlciAtIDFdOworICAgICAgY29uc3QgV29yZEluZGV4ICp3b3JkcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgV29yZEluZGV4Kj4oZGF0YSk7CisgICAgICBQcm9iQmFja29mZiB3ZWlnaHRzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUHJvYkJhY2tvZmYqPih3b3JkcyArIG9yZGVyKTsKKyAgICAgIGlmIChjb250ZXh0ICYmICFtZW1jbXAoZGF0YSwgY29udGV4dC5EYXRhKCksIHNpemVvZihXb3JkSW5kZXgpICogb3JkZXIpKSB7CisgICAgICAgIFNldEV4dGVuc2lvbih3ZWlnaHRzLmJhY2tvZmYpOworICAgICAgICArK2NvbnRleHQ7CisgICAgICB9CisgICAgICB0eXBlbmFtZSBRdWFudDo6TWlkZGxlUG9pbnRlcihxdWFudF8sIG9yZGVyIC0gMiwgbWlkZGxlX1tvcmRlciAtIDJdLkluc2VydCh3b3Jkc1tvcmRlciAtIDFdKSkuV3JpdGUod2VpZ2h0cy5wcm9iLCB3ZWlnaHRzLmJhY2tvZmYpOworICAgIH0KKworICAgIHZvaWQgTG9uZ2VzdChjb25zdCB2b2lkICpkYXRhKSB7CisgICAgICBjb25zdCBXb3JkSW5kZXggKndvcmRzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBXb3JkSW5kZXgqPihkYXRhKTsKKyAgICAgIHR5cGVuYW1lIFF1YW50OjpMb25nZXN0UG9pbnRlcihxdWFudF8sIGxvbmdlc3RfLkluc2VydCh3b3Jkc1tvcmRlcl8gLSAxXSkpLldyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUHJvYio+KHdvcmRzICsgb3JkZXJfKS0+cHJvYik7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgUmVjb3JkUmVhZGVyICpjb250ZXh0c187CisgICAgY29uc3QgUXVhbnQgJnF1YW50XzsKKyAgICBVbmlncmFtVmFsdWUgKmNvbnN0IHVuaWdyYW1zXzsKKyAgICBCaXRQYWNrZWRNaWRkbGU8Qmhpa3NoYT4gKmNvbnN0IG1pZGRsZV87CisgICAgQml0UGFja2VkTG9uZ2VzdCAmbG9uZ2VzdF87CisgICAgQml0UGFja2VkICZiaWdyYW1fcGFja187CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBvcmRlcl87CisgICAgU1JJU3Vja3MgJnNyaV87Cit9OworCitzdHJ1Y3QgR3JhbSB7CisgIEdyYW0oY29uc3QgV29yZEluZGV4ICppbl9iZWdpbiwgdW5zaWduZWQgY2hhciBvcmRlcikgOiBiZWdpbihpbl9iZWdpbiksIGVuZChpbl9iZWdpbiArIG9yZGVyKSB7fQorCisgIGNvbnN0IFdvcmRJbmRleCAqYmVnaW4sICplbmQ7CisKKyAgLy8gRm9yIHF1ZXVlLCB0aGlzIGlzIHRoZSBkaXJlY3Rpb24gd2Ugd2FudC4KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgR3JhbSAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShvdGhlci5iZWdpbiwgb3RoZXIuZW5kLCBiZWdpbiwgZW5kKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIERvaW5nPiBjbGFzcyBCbGFua01hbmFnZXIgeworICBwdWJsaWM6CisgICAgQmxhbmtNYW5hZ2VyKHVuc2lnbmVkIGNoYXIgdG90YWxfb3JkZXIsIERvaW5nICZkb2luZykgOiB0b3RhbF9vcmRlcl8odG90YWxfb3JkZXIpLCBiZWVuX2xlbmd0aF8oMCksIGRvaW5nXyhkb2luZykgeworICAgICAgZm9yIChmbG9hdCAqaSA9IGJhc2lzXzsgaSAhPSBiYXNpc18gKyBLRU5MTV9NQVhfT1JERVIgLSAxOyArK2kpICppID0ga0JhZFByb2I7CisgICAgfQorCisgICAgdm9pZCBWaXNpdChjb25zdCBXb3JkSW5kZXggKnRvLCB1bnNpZ25lZCBjaGFyIGxlbmd0aCwgZmxvYXQgcHJvYikgeworICAgICAgYmFzaXNfW2xlbmd0aCAtIDFdID0gcHJvYjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3ZlcmxhcCA9IHN0ZDo6bWluPHVuc2lnbmVkIGNoYXI+KGxlbmd0aCAtIDEsIGJlZW5fbGVuZ3RoXyk7CisgICAgICBjb25zdCBXb3JkSW5kZXggKmN1cjsKKyAgICAgIFdvcmRJbmRleCAqcHJlOworICAgICAgZm9yIChjdXIgPSB0bywgcHJlID0gYmVlbl87IGN1ciAhPSB0byArIG92ZXJsYXA7ICsrY3VyLCArK3ByZSkgeworICAgICAgICBpZiAoKnByZSAhPSAqY3VyKSBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChjdXIgPT0gdG8gKyBsZW5ndGggLSAxKSB7CisgICAgICAgICpwcmUgPSAqY3VyOworICAgICAgICBiZWVuX2xlbmd0aF8gPSBsZW5ndGg7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8vIFRoZXJlIGFyZSBibGFua3MgdG8gaW5zZXJ0IHN0YXJ0aW5nIHdpdGggb3JkZXIgYmxhbmsuCisgICAgICB1bnNpZ25lZCBjaGFyIGJsYW5rID0gY3VyIC0gdG8gKyAxOworICAgICAgVVRJTF9USFJPV19JRihibGFuayA9PSAxLCBGb3JtYXRMb2FkRXhjZXB0aW9uLCAiTWlzc2luZyBhIHVuaWdyYW0gdGhhdCBhcHBlYXJzIGFzIGNvbnRleHQuIik7CisgICAgICBjb25zdCBmbG9hdCAqbG93ZXJfYmFzaXM7CisgICAgICBmb3IgKGxvd2VyX2Jhc2lzID0gYmFzaXNfICsgYmxhbmsgLSAyOyAqbG93ZXJfYmFzaXMgPT0ga0JhZFByb2I7IC0tbG93ZXJfYmFzaXMpIHt9CisgICAgICB1bnNpZ25lZCBjaGFyIGJhc2VkX29uID0gbG93ZXJfYmFzaXMgLSBiYXNpc18gKyAxOworICAgICAgZm9yICg7IGN1ciAhPSB0byArIGxlbmd0aCAtIDE7ICsrYmxhbmssICsrY3VyLCArK3ByZSkgeworICAgICAgICBhc3NlcnQoKmxvd2VyX2Jhc2lzICE9IGtCYWRQcm9iKTsKKyAgICAgICAgZG9pbmdfLk1pZGRsZUJsYW5rKGJsYW5rLCB0bywgYmFzZWRfb24sICpsb3dlcl9iYXNpcyk7CisgICAgICAgICpwcmUgPSAqY3VyOworICAgICAgICAvLyBNYXJrIHRoYXQgdGhlIHByb2JhYmlsaXR5IGlzIGEgYmxhbmsgc28gaXQgc2hvdWxkbid0IGJlIHVzZWQgYXMgdGhlIGJhc2lzIGZvciBhIGxhdGVyIG4tZ3JhbS4KKyAgICAgICAgYmFzaXNfW2JsYW5rIC0gMV0gPSBrQmFkUHJvYjsKKyAgICAgIH0KKyAgICAgICpwcmUgPSAqY3VyOworICAgICAgYmVlbl9sZW5ndGhfID0gbGVuZ3RoOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgdG90YWxfb3JkZXJfOworCisgICAgV29yZEluZGV4IGJlZW5fW0tFTkxNX01BWF9PUkRFUl07CisgICAgdW5zaWduZWQgY2hhciBiZWVuX2xlbmd0aF87CisKKyAgICBmbG9hdCBiYXNpc19bS0VOTE1fTUFYX09SREVSXTsKKworICAgIERvaW5nICZkb2luZ187Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRG9pbmc+IHZvaWQgUmVjdXJzaXZlSW5zZXJ0KGNvbnN0IHVuc2lnbmVkIGNoYXIgdG90YWxfb3JkZXIsIGNvbnN0IFdvcmRJbmRleCB1bmlncmFtX2NvdW50LCBSZWNvcmRSZWFkZXIgKmlucHV0LCBzdGQ6Om9zdHJlYW0gKnByb2dyZXNzX291dCwgY29uc3QgY2hhciAqbWVzc2FnZSwgRG9pbmcgJmRvaW5nKSB7CisgIHV0aWw6OkVyc2F0elByb2dyZXNzIHByb2dyZXNzKHVuaWdyYW1fY291bnQgKyAxLCBwcm9ncmVzc19vdXQsIG1lc3NhZ2UpOworICBXb3JkSW5kZXggdW5pZ3JhbSA9IDA7CisgIHN0ZDo6cHJpb3JpdHlfcXVldWU8R3JhbT4gZ3JhbXM7CisgIGlmICh1bmlncmFtX2NvdW50KSBncmFtcy5wdXNoKEdyYW0oJnVuaWdyYW0sIDEpKTsKKyAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSAyOyBpIDw9IHRvdGFsX29yZGVyOyArK2kpIHsKKyAgICBpZiAoaW5wdXRbaS0yXSkgZ3JhbXMucHVzaChHcmFtKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgV29yZEluZGV4Kj4oaW5wdXRbaS0yXS5EYXRhKCkpLCBpKSk7CisgIH0KKworICBCbGFua01hbmFnZXI8RG9pbmc+IGJsYW5rKHRvdGFsX29yZGVyLCBkb2luZyk7CisKKyAgd2hpbGUgKCFncmFtcy5lbXB0eSgpKSB7CisgICAgR3JhbSB0b3AgPSBncmFtcy50b3AoKTsKKyAgICBncmFtcy5wb3AoKTsKKyAgICB1bnNpZ25lZCBjaGFyIG9yZGVyID0gdG9wLmVuZCAtIHRvcC5iZWdpbjsKKyAgICBpZiAob3JkZXIgPT0gMSkgeworICAgICAgYmxhbmsuVmlzaXQoJnVuaWdyYW0sIDEsIGRvaW5nLlVuaWdyYW1Qcm9iKHVuaWdyYW0pKTsKKyAgICAgIGRvaW5nLlVuaWdyYW0odW5pZ3JhbSk7CisgICAgICBwcm9ncmVzcy5TZXQodW5pZ3JhbSk7CisgICAgICBpZiAoKyt1bmlncmFtIDwgdW5pZ3JhbV9jb3VudCkgZ3JhbXMucHVzaCh0b3ApOworICAgIH0gZWxzZSB7CisgICAgICBpZiAob3JkZXIgPT0gdG90YWxfb3JkZXIpIHsKKyAgICAgICAgYmxhbmsuVmlzaXQodG9wLmJlZ2luLCBvcmRlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQcm9iKj4odG9wLmVuZCktPnByb2IpOworICAgICAgICBkb2luZy5Mb25nZXN0KHRvcC5iZWdpbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBibGFuay5WaXNpdCh0b3AuYmVnaW4sIG9yZGVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFByb2JCYWNrb2ZmKj4odG9wLmVuZCktPnByb2IpOworICAgICAgICBkb2luZy5NaWRkbGUob3JkZXIsIHRvcC5iZWdpbik7CisgICAgICB9CisgICAgICBSZWNvcmRSZWFkZXIgJnJlYWRlciA9IGlucHV0W29yZGVyIC0gMl07CisgICAgICBpZiAoKytyZWFkZXIpIGdyYW1zLnB1c2godG9wKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBTYW5pdHlDaGVja0NvdW50cyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmluaXRpYWwsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmZml4ZWQpIHsKKyAgaWYgKGZpeGVkWzBdICE9IGluaXRpYWxbMF0pIFVUSUxfVEhST1codXRpbDo6RXhjZXB0aW9uLCAiVW5pZ3JhbSBjb3VudCBzaG91bGQgYmUgY29uc3RhbnQgYnV0IGluaXRpYWwgaXMgIiA8PCBpbml0aWFsWzBdIDw8ICIgYW5kIHJlY291bnRlZCBpcyAiIDw8IGZpeGVkWzBdKTsKKyAgaWYgKGZpeGVkLmJhY2soKSAhPSBpbml0aWFsLmJhY2soKSkgVVRJTF9USFJPVyh1dGlsOjpFeGNlcHRpb24sICJMb25nZXN0IGNvdW50IHNob3VsZCBiZSBjb25zdGFudCBidXQgaXQgY2hhbmdlZCBmcm9tICIgPDwgaW5pdGlhbC5iYWNrKCkgPDwgIiB0byAiIDw8IGZpeGVkLmJhY2soKSk7CisgIGZvciAodW5zaWduZWQgY2hhciBpID0gMDsgaSA8IGluaXRpYWwuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoZml4ZWRbaV0gPCBpbml0aWFsW2ldKSBVVElMX1RIUk9XKHV0aWw6OkV4Y2VwdGlvbiwgIkNvdW50cyBjYW1lIG91dCBsb3dlciB0aGFuIGV4cGVjdGVkLiAgVGhpcyBzaG91bGRuJ3QgaGFwcGVuIik7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFF1YW50PiB2b2lkIFRyYWluUXVhbnRpemVyKHVpbnQ4X3Qgb3JkZXIsIHVpbnQ2NF90IGNvdW50LCBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4gJmFkZGl0aW9uYWwsIFJlY29yZFJlYWRlciAmcmVhZGVyLCB1dGlsOjpFcnNhdHpQcm9ncmVzcyAmcHJvZ3Jlc3MsIFF1YW50ICZxdWFudCkgeworICBzdGQ6OnZlY3RvcjxmbG9hdD4gcHJvYnMoYWRkaXRpb25hbCksIGJhY2tvZmZzOworICBwcm9icy5yZXNlcnZlKGNvdW50ICsgYWRkaXRpb25hbC5zaXplKCkpOworICBiYWNrb2Zmcy5yZXNlcnZlKGNvdW50KTsKKyAgZm9yIChyZWFkZXIuUmV3aW5kKCk7IHJlYWRlcjsgKytyZWFkZXIpIHsKKyAgICBjb25zdCBQcm9iQmFja29mZiAmd2VpZ2h0cyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFByb2JCYWNrb2ZmKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVhZGVyLkRhdGEoKSkgKyBzaXplb2YoV29yZEluZGV4KSAqIG9yZGVyKTsKKyAgICBwcm9icy5wdXNoX2JhY2sod2VpZ2h0cy5wcm9iKTsKKyAgICBpZiAod2VpZ2h0cy5iYWNrb2ZmICE9IDAuMCkgYmFja29mZnMucHVzaF9iYWNrKHdlaWdodHMuYmFja29mZik7CisgICAgKytwcm9ncmVzczsKKyAgfQorICBxdWFudC5UcmFpbihvcmRlciwgcHJvYnMsIGJhY2tvZmZzKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFF1YW50PiB2b2lkIFRyYWluUHJvYlF1YW50aXplcih1aW50OF90IG9yZGVyLCB1aW50NjRfdCBjb3VudCwgUmVjb3JkUmVhZGVyICZyZWFkZXIsIHV0aWw6OkVyc2F0elByb2dyZXNzICZwcm9ncmVzcywgUXVhbnQgJnF1YW50KSB7CisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBwcm9icywgYmFja29mZnM7CisgIHByb2JzLnJlc2VydmUoY291bnQpOworICBmb3IgKHJlYWRlci5SZXdpbmQoKTsgcmVhZGVyOyArK3JlYWRlcikgeworICAgIGNvbnN0IFByb2IgJndlaWdodHMgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQcm9iKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVhZGVyLkRhdGEoKSkgKyBzaXplb2YoV29yZEluZGV4KSAqIG9yZGVyKTsKKyAgICBwcm9icy5wdXNoX2JhY2sod2VpZ2h0cy5wcm9iKTsKKyAgICArK3Byb2dyZXNzOworICB9CisgIHF1YW50LlRyYWluUHJvYihvcmRlciwgcHJvYnMpOworfQorCit2b2lkIFBvcHVsYXRlVW5pZ3JhbVdlaWdodHMoRklMRSAqZmlsZSwgV29yZEluZGV4IHVuaWdyYW1fY291bnQsIFJlY29yZFJlYWRlciAmY29udGV4dHMsIFVuaWdyYW1WYWx1ZSAqdW5pZ3JhbXMpIHsKKyAgLy8gRmlsbCB1bmlncmFtIHByb2JhYmlsaXRpZXMuCisgIHRyeSB7CisgICAgcmV3aW5kKGZpbGUpOworICAgIGZvciAoV29yZEluZGV4IGkgPSAwOyBpIDwgdW5pZ3JhbV9jb3VudDsgKytpKSB7CisgICAgICBSZWFkT3JUaHJvdyhmaWxlLCAmdW5pZ3JhbXNbaV0ud2VpZ2h0cywgc2l6ZW9mKFByb2JCYWNrb2ZmKSk7CisgICAgICBpZiAoY29udGV4dHMgJiYgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgV29yZEluZGV4Kj4oY29udGV4dHMuRGF0YSgpKSA9PSBpKSB7CisgICAgICAgIFNldEV4dGVuc2lvbih1bmlncmFtc1tpXS53ZWlnaHRzLmJhY2tvZmYpOworICAgICAgICArK2NvbnRleHRzOworICAgICAgfQorICAgIH0KKyAgfSBjYXRjaCAodXRpbDo6RXhjZXB0aW9uICZlKSB7CisgICAgZSA8PCAiIHdoaWxlIHJlLXJlYWRpbmcgdW5pZ3JhbSBwcm9iYWJpbGl0aWVzIjsKKyAgICB0aHJvdzsKKyAgfQorfQorCit9IC8vIG5hbWVzcGFjZQorCit0ZW1wbGF0ZSA8Y2xhc3MgUXVhbnQsIGNsYXNzIEJoaWtzaGE+IHZvaWQgQnVpbGRUcmllKFNvcnRlZEZpbGVzICZmaWxlcywgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIGNvbnN0IENvbmZpZyAmY29uZmlnLCBUcmllU2VhcmNoPFF1YW50LCBCaGlrc2hhPiAmb3V0LCBRdWFudCAmcXVhbnQsIFNvcnRlZFZvY2FidWxhcnkgJnZvY2FiLCBCaW5hcnlGb3JtYXQgJmJhY2tpbmcpIHsKKyAgUmVjb3JkUmVhZGVyIGlucHV0c1tLRU5MTV9NQVhfT1JERVIgLSAxXTsKKyAgUmVjb3JkUmVhZGVyIGNvbnRleHRzW0tFTkxNX01BWF9PUkRFUiAtIDFdOworCisgIGZvciAodW5zaWduZWQgY2hhciBpID0gMjsgaSA8PSBjb3VudHMuc2l6ZSgpOyArK2kpIHsKKyAgICBpbnB1dHNbaS0yXS5Jbml0KGZpbGVzLkZ1bGwoaSksIGkgKiBzaXplb2YoV29yZEluZGV4KSArIChpID09IGNvdW50cy5zaXplKCkgPyBzaXplb2YoUHJvYikgOiBzaXplb2YoUHJvYkJhY2tvZmYpKSk7CisgICAgY29udGV4dHNbaS0yXS5Jbml0KGZpbGVzLkNvbnRleHQoaSksIChpLTEpICogc2l6ZW9mKFdvcmRJbmRleCkpOworICB9CisKKyAgU1JJU3Vja3Mgc3JpOworICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gZml4ZWRfY291bnRzOworICB1dGlsOjpzY29wZWRfRklMRSB1bmlncmFtX2ZpbGU7CisgIHV0aWw6OnNjb3BlZF9mZCB1bmlncmFtX2ZkKGZpbGVzLlN0ZWFsVW5pZ3JhbSgpKTsKKyAgeworICAgIHV0aWw6OnNjb3BlZF9tZW1vcnkgdW5pZ3JhbXM7CisgICAgTWFwUmVhZCh1dGlsOjpQT1BVTEFURV9PUl9SRUFELCB1bmlncmFtX2ZkLmdldCgpLCAwLCBjb3VudHNbMF0gKiBzaXplb2YoUHJvYkJhY2tvZmYpLCB1bmlncmFtcyk7CisgICAgRmluZEJsYW5rcyBmaW5kZXIoY291bnRzLnNpemUoKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQcm9iQmFja29mZio+KHVuaWdyYW1zLmdldCgpKSwgc3JpKTsKKyAgICBSZWN1cnNpdmVJbnNlcnQoY291bnRzLnNpemUoKSwgY291bnRzWzBdLCBpbnB1dHMsIGNvbmZpZy5Qcm9ncmVzc01lc3NhZ2VzKCksICJJZGVudGlmeWluZyBuLWdyYW1zIG9taXR0ZWQgYnkgU1JJIiwgZmluZGVyKTsKKyAgICBmaXhlZF9jb3VudHMgPSBmaW5kZXIuQ291bnRzKCk7CisgIH0KKyAgdW5pZ3JhbV9maWxlLnJlc2V0KHV0aWw6OkZET3Blbk9yVGhyb3codW5pZ3JhbV9mZCkpOworICBmb3IgKGNvbnN0IFJlY29yZFJlYWRlciAqaSA9IGlucHV0czsgaSAhPSBpbnB1dHMgKyBjb3VudHMuc2l6ZSgpIC0gMjsgKytpKSB7CisgICAgaWYgKCppKSBVVElMX1RIUk9XKEZvcm1hdExvYWRFeGNlcHRpb24sICJUaGVyZSdzIGEgYnVnIGluIHRoZSB0cmllIGltcGxlbWVudGF0aW9uOiB0aGUgIiA8PCAoaSAtIGlucHV0cyArIDIpIDw8ICItZ3JhbSB0YWJsZSBkaWQgbm90IGNvbXBsZXRlIHJlYWRpbmciKTsKKyAgfQorICBTYW5pdHlDaGVja0NvdW50cyhjb3VudHMsIGZpeGVkX2NvdW50cyk7CisgIGNvdW50cyA9IGZpeGVkX2NvdW50czsKKworICBzcmkuT2J0YWluQmFja29mZnMoY291bnRzLnNpemUoKSwgdW5pZ3JhbV9maWxlLmdldCgpLCBpbnB1dHMpOworCisgIHZvaWQgKnZvY2FiX3JlbG9jYXRlOworICB2b2lkICpzZWFyY2hfYmFzZSA9IGJhY2tpbmcuR3Jvd0ZvclNlYXJjaChUcmllU2VhcmNoPFF1YW50LCBCaGlrc2hhPjo6U2l6ZShmaXhlZF9jb3VudHMsIGNvbmZpZyksIHZvY2FiLlVua0NvdW50Q2hhbmdlUGFkZGluZygpLCB2b2NhYl9yZWxvY2F0ZSk7CisgIHZvY2FiLlJlbG9jYXRlKHZvY2FiX3JlbG9jYXRlKTsKKyAgb3V0LlNldHVwTWVtb3J5KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHNlYXJjaF9iYXNlKSwgZml4ZWRfY291bnRzLCBjb25maWcpOworCisgIGZvciAodW5zaWduZWQgY2hhciBpID0gMjsgaSA8PSBjb3VudHMuc2l6ZSgpOyArK2kpIHsKKyAgICBpbnB1dHNbaS0yXS5SZXdpbmQoKTsKKyAgfQorICBpZiAoUXVhbnQ6OmtUcmFpbikgeworICAgIHV0aWw6OkVyc2F0elByb2dyZXNzIHByb2dyZXNzKHN0ZDo6YWNjdW11bGF0ZShjb3VudHMuYmVnaW4oKSArIDEsIGNvdW50cy5lbmQoKSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLlByb2dyZXNzTWVzc2FnZXMoKSwgIlF1YW50aXppbmciKTsKKyAgICBmb3IgKHVuc2lnbmVkIGNoYXIgaSA9IDI7IGkgPCBjb3VudHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIFRyYWluUXVhbnRpemVyKGksIGNvdW50c1tpLTFdLCBzcmkuVmFsdWVzKGkpLCBpbnB1dHNbaS0yXSwgcHJvZ3Jlc3MsIHF1YW50KTsKKyAgICB9CisgICAgVHJhaW5Qcm9iUXVhbnRpemVyKGNvdW50cy5zaXplKCksIGNvdW50cy5iYWNrKCksIGlucHV0c1tjb3VudHMuc2l6ZSgpIC0gMl0sIHByb2dyZXNzLCBxdWFudCk7CisgICAgcXVhbnQuRmluaXNoZWRMb2FkaW5nKGNvbmZpZyk7CisgIH0KKworICBVbmlncmFtVmFsdWUgKnVuaWdyYW1zID0gb3V0LnVuaWdyYW1fLlJhdygpOworICBQb3B1bGF0ZVVuaWdyYW1XZWlnaHRzKHVuaWdyYW1fZmlsZS5nZXQoKSwgY291bnRzWzBdLCBjb250ZXh0c1swXSwgdW5pZ3JhbXMpOworICB1bmlncmFtX2ZpbGUucmVzZXQoKTsKKworICBmb3IgKHVuc2lnbmVkIGNoYXIgaSA9IDI7IGkgPD0gY291bnRzLnNpemUoKTsgKytpKSB7CisgICAgaW5wdXRzW2ktMl0uUmV3aW5kKCk7CisgIH0KKyAgLy8gRmlsbCBlbnRyaWVzIGV4Y2VwdCB1bmlncmFtIHByb2JhYmlsaXRpZXMuCisgIHsKKyAgICBXcml0ZUVudHJpZXM8UXVhbnQsIEJoaWtzaGE+IHdyaXRlcihjb250ZXh0cywgcXVhbnQsIHVuaWdyYW1zLCBvdXQubWlkZGxlX2JlZ2luXywgb3V0Lmxvbmdlc3RfLCBjb3VudHMuc2l6ZSgpLCBzcmkpOworICAgIFJlY3Vyc2l2ZUluc2VydChjb3VudHMuc2l6ZSgpLCBjb3VudHNbMF0sIGlucHV0cywgY29uZmlnLlByb2dyZXNzTWVzc2FnZXMoKSwgIldyaXRpbmcgdHJpZSIsIHdyaXRlcik7CisgICAgLy8gV3JpdGUgdGhlIGxhc3QgdW5pZ3JhbSBlbnRyeSwgd2hpY2ggaXMgdGhlIGVuZCBwb2ludGVyIGZvciB0aGUgYmlncmFtcy4KKyAgICB3cml0ZXIuVW5pZ3JhbShjb3VudHNbMF0pOworICB9CisKKyAgLy8gRG8gbm90IGRpc2FibGUgdGhpcyBlcnJvciBtZXNzYWdlIG9yIGVsc2UgdG9vIGxpdHRsZSBzdGF0ZSB3aWxsIGJlIHJldHVybmVkLiAgQm90aCBXcml0ZUVudHJpZXM6Ok1pZGRsZSBhbmQgcmV0dXJuaW5nIHN0YXRlIGJhc2VkIG9uIGZvdW5kIG4tZ3JhbXMgd2lsbCBuZWVkIHRvIGJlIGZpeGVkIHRvIGhhbmRsZSB0aGlzIHNpdHVhdGlvbi4KKyAgZm9yICh1bnNpZ25lZCBjaGFyIG9yZGVyID0gMjsgb3JkZXIgPD0gY291bnRzLnNpemUoKTsgKytvcmRlcikgeworICAgIGNvbnN0IFJlY29yZFJlYWRlciAmY29udGV4dCA9IGNvbnRleHRzW29yZGVyIC0gMl07CisgICAgaWYgKGNvbnRleHQpIHsKKyAgICAgIEZvcm1hdExvYWRFeGNlcHRpb24gZTsKKyAgICAgIGUgPDwgIkEgIiA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KG9yZGVyKSA8PCAiLWdyYW0gaGFzIGNvbnRleHQiOworICAgICAgY29uc3QgV29yZEluZGV4ICpjdHggPSByZWludGVycHJldF9jYXN0PGNvbnN0IFdvcmRJbmRleCo+KGNvbnRleHQuRGF0YSgpKTsKKyAgICAgIGZvciAoY29uc3QgV29yZEluZGV4ICppID0gY3R4OyBpICE9IGN0eCArIG9yZGVyIC0gMTsgKytpKSB7CisgICAgICAgIGUgPDwgJyAnIDw8ICppOworICAgICAgfQorICAgICAgZSA8PCAiIHNvIHRoaXMgY29udGV4dCBtdXN0IGFwcGVhciBpbiB0aGUgbW9kZWwgYXMgYSAiIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4ob3JkZXIgLSAxKSA8PCAiLWdyYW0gYnV0IGl0IGRvZXMgbm90IjsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9CisKKyAgLyogU2V0IGVuZGluZyBvZmZzZXRzIHNvIHRoZSBsYXN0IGVudHJ5IHdpbGwgYmUgc2l6ZWQgcHJvcGVybHkgKi8KKyAgLy8gTGFzdCBlbnRyeSBmb3IgdW5pZ3JhbXMgd2FzIGFscmVhZHkgc2V0LgorICBpZiAob3V0Lm1pZGRsZV9iZWdpbl8gIT0gb3V0Lm1pZGRsZV9lbmRfKSB7CisgICAgZm9yICh0eXBlbmFtZSBUcmllU2VhcmNoPFF1YW50LCBCaGlrc2hhPjo6TWlkZGxlICppID0gb3V0Lm1pZGRsZV9iZWdpbl87IGkgIT0gb3V0Lm1pZGRsZV9lbmRfIC0gMTsgKytpKSB7CisgICAgICBpLT5GaW5pc2hlZExvYWRpbmcoKGkrMSktPkluc2VydEluZGV4KCksIGNvbmZpZyk7CisgICAgfQorICAgIChvdXQubWlkZGxlX2VuZF8gLSAxKS0+RmluaXNoZWRMb2FkaW5nKG91dC5sb25nZXN0Xy5JbnNlcnRJbmRleCgpLCBjb25maWcpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBRdWFudCwgY2xhc3MgQmhpa3NoYT4gdWludDhfdCAqVHJpZVNlYXJjaDxRdWFudCwgQmhpa3NoYT46OlNldHVwTWVtb3J5KHVpbnQ4X3QgKnN0YXJ0LCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3QgQ29uZmlnICZjb25maWcpIHsKKyAgcXVhbnRfLlNldHVwTWVtb3J5KHN0YXJ0LCBjb3VudHMuc2l6ZSgpLCBjb25maWcpOworICBzdGFydCArPSBRdWFudDo6U2l6ZShjb3VudHMuc2l6ZSgpLCBjb25maWcpOworICB1bmlncmFtXy5Jbml0KHN0YXJ0KTsKKyAgc3RhcnQgKz0gVW5pZ3JhbTo6U2l6ZShjb3VudHNbMF0pOworICBGcmVlTWlkZGxlcygpOworICBtaWRkbGVfYmVnaW5fID0gc3RhdGljX2Nhc3Q8TWlkZGxlKj4obWFsbG9jKHNpemVvZihNaWRkbGUpICogKGNvdW50cy5zaXplKCkgLSAyKSkpOworICBtaWRkbGVfZW5kXyA9IG1pZGRsZV9iZWdpbl8gKyAoY291bnRzLnNpemUoKSAtIDIpOworICBzdGQ6OnZlY3Rvcjx1aW50OF90Kj4gbWlkZGxlX3N0YXJ0cyhjb3VudHMuc2l6ZSgpIC0gMik7CisgIGZvciAodW5zaWduZWQgY2hhciBpID0gMjsgaSA8IGNvdW50cy5zaXplKCk7ICsraSkgeworICAgIG1pZGRsZV9zdGFydHNbaS0yXSA9IHN0YXJ0OworICAgIHN0YXJ0ICs9IE1pZGRsZTo6U2l6ZShRdWFudDo6TWlkZGxlQml0cyhjb25maWcpLCBjb3VudHNbaS0xXSwgY291bnRzWzBdLCBjb3VudHNbaV0sIGNvbmZpZyk7CisgIH0KKyAgLy8gQ3JhenkgYmFja3dhcmRzIHRoaW5nIHNvIHdlIGluaXRpYWxpemUgdXNpbmcgcG9pbnRlcnMgdG8gb25lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkCisgIGZvciAodW5zaWduZWQgY2hhciBpID0gY291bnRzLnNpemUoKSAtIDE7IGkgPj0gMjsgLS1pKSB7CisgICAgLy8gdXNlICJwbGFjZW1lbnQgbmV3IiBzeW50YXggdG8gaW5pdGFsaXplIE1pZGRsZSBpbiBhbiBhbHJlYWR5LWFsbG9jYXRlZCBtZW1vcnkgbG9jYXRpb24KKyAgICBuZXcgKG1pZGRsZV9iZWdpbl8gKyBpIC0gMikgTWlkZGxlKAorICAgICAgICBtaWRkbGVfc3RhcnRzW2ktMl0sCisgICAgICAgIHF1YW50Xy5NaWRkbGVCaXRzKGNvbmZpZyksCisgICAgICAgIGNvdW50c1tpLTFdLAorICAgICAgICBjb3VudHNbMF0sCisgICAgICAgIGNvdW50c1tpXSwKKyAgICAgICAgKGkgPT0gY291bnRzLnNpemUoKSAtIDEpID8gc3RhdGljX2Nhc3Q8Y29uc3QgQml0UGFja2VkJj4obG9uZ2VzdF8pIDogc3RhdGljX2Nhc3Q8Y29uc3QgQml0UGFja2VkICY+KG1pZGRsZV9iZWdpbl9baS0xXSksCisgICAgICAgIGNvbmZpZyk7CisgIH0KKyAgbG9uZ2VzdF8uSW5pdChzdGFydCwgcXVhbnRfLkxvbmdlc3RCaXRzKGNvbmZpZyksIGNvdW50c1swXSk7CisgIHJldHVybiBzdGFydCArIExvbmdlc3Q6OlNpemUoUXVhbnQ6Okxvbmdlc3RCaXRzKGNvbmZpZyksIGNvdW50cy5iYWNrKCksIGNvdW50c1swXSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBRdWFudCwgY2xhc3MgQmhpa3NoYT4gdm9pZCBUcmllU2VhcmNoPFF1YW50LCBCaGlrc2hhPjo6SW5pdGlhbGl6ZUZyb21BUlBBKGNvbnN0IGNoYXIgKmZpbGUsIHV0aWw6OkZpbGVQaWVjZSAmZiwgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIGNvbnN0IENvbmZpZyAmY29uZmlnLCBTb3J0ZWRWb2NhYnVsYXJ5ICZ2b2NhYiwgQmluYXJ5Rm9ybWF0ICZiYWNraW5nKSB7CisgIHN0ZDo6c3RyaW5nIHRlbXBvcmFyeV9wcmVmaXg7CisgIGlmICghY29uZmlnLnRlbXBvcmFyeV9kaXJlY3RvcnlfcHJlZml4LmVtcHR5KCkpIHsKKyAgICB0ZW1wb3JhcnlfcHJlZml4ID0gY29uZmlnLnRlbXBvcmFyeV9kaXJlY3RvcnlfcHJlZml4OworICB9IGVsc2UgaWYgKGNvbmZpZy53cml0ZV9tbWFwKSB7CisgICAgdGVtcG9yYXJ5X3ByZWZpeCA9IGNvbmZpZy53cml0ZV9tbWFwOworICB9IGVsc2UgeworICAgIHRlbXBvcmFyeV9wcmVmaXggPSBmaWxlOworICB9CisgIC8vIEF0IGxlYXN0IDFNQiBzb3J0aW5nIG1lbW9yeS4KKyAgU29ydGVkRmlsZXMgc29ydGVkKGNvbmZpZywgZiwgY291bnRzLCBzdGQ6Om1heDxzaXplX3Q+KGNvbmZpZy5idWlsZGluZ19tZW1vcnksIDEwNDg1NzYpLCB0ZW1wb3JhcnlfcHJlZml4LCB2b2NhYik7CisKKyAgQnVpbGRUcmllKHNvcnRlZCwgY291bnRzLCBjb25maWcsICp0aGlzLCBxdWFudF8sIHZvY2FiLCBiYWNraW5nKTsKK30KKwordGVtcGxhdGUgY2xhc3MgVHJpZVNlYXJjaDxEb250UXVhbnRpemUsIERvbnRCaGlrc2hhPjsKK3RlbXBsYXRlIGNsYXNzIFRyaWVTZWFyY2g8RG9udFF1YW50aXplLCBBcnJheUJoaWtzaGE+OwordGVtcGxhdGUgY2xhc3MgVHJpZVNlYXJjaDxTZXBhcmF0ZWx5UXVhbnRpemUsIERvbnRCaGlrc2hhPjsKK3RlbXBsYXRlIGNsYXNzIFRyaWVTZWFyY2g8U2VwYXJhdGVseVF1YW50aXplLCBBcnJheUJoaWtzaGE+OworCit9IC8vIG5hbWVzcGFjZSB0cmllCit9IC8vIG5hbWVzcGFjZSBuZ3JhbQorfSAvLyBuYW1lc3BhY2UgbG0KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS9zZWFyY2hfdHJpZS5oaCBiL3NyYy9rZW5sbS9sbS9zZWFyY2hfdHJpZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWRiYTZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL3NlYXJjaF90cmllLmhoCkBAIC0wLDAgKzEsMTI5IEBACisjaWZuZGVmIExNX1NFQVJDSF9UUklFX0gKKyNkZWZpbmUgTE1fU0VBUkNIX1RSSUVfSAorCisjaW5jbHVkZSAibG0vY29uZmlnLmhoIgorI2luY2x1ZGUgImxtL21vZGVsX3R5cGUuaGgiCisjaW5jbHVkZSAibG0vcmV0dXJuLmhoIgorI2luY2x1ZGUgImxtL3RyaWUuaGgiCisjaW5jbHVkZSAibG0vd2VpZ2h0cy5oaCIKKworI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKK2NsYXNzIEJpbmFyeUZvcm1hdDsKK2NsYXNzIFNvcnRlZFZvY2FidWxhcnk7CituYW1lc3BhY2UgdHJpZSB7CisKK3RlbXBsYXRlIDxjbGFzcyBRdWFudCwgY2xhc3MgQmhpa3NoYT4gY2xhc3MgVHJpZVNlYXJjaDsKK2NsYXNzIFNvcnRlZEZpbGVzOwordGVtcGxhdGUgPGNsYXNzIFF1YW50LCBjbGFzcyBCaGlrc2hhPiB2b2lkIEJ1aWxkVHJpZShTb3J0ZWRGaWxlcyAmZmlsZXMsIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzLCBjb25zdCBDb25maWcgJmNvbmZpZywgVHJpZVNlYXJjaDxRdWFudCwgQmhpa3NoYT4gJm91dCwgUXVhbnQgJnF1YW50LCBTb3J0ZWRWb2NhYnVsYXJ5ICZ2b2NhYiwgQmluYXJ5Rm9ybWF0ICZiYWNraW5nKTsKKwordGVtcGxhdGUgPGNsYXNzIFF1YW50LCBjbGFzcyBCaGlrc2hhPiBjbGFzcyBUcmllU2VhcmNoIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgTm9kZVJhbmdlIE5vZGU7CisKKyAgICB0eXBlZGVmIDo6bG06Om5ncmFtOjp0cmllOjpVbmlncmFtUG9pbnRlciBVbmlncmFtUG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFF1YW50OjpNaWRkbGVQb2ludGVyIE1pZGRsZVBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBRdWFudDo6TG9uZ2VzdFBvaW50ZXIgTG9uZ2VzdFBvaW50ZXI7CisKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBrRGlmZmVyZW50UmVzdCA9IGZhbHNlOworCisgICAgc3RhdGljIGNvbnN0IE1vZGVsVHlwZSBrTW9kZWxUeXBlID0gc3RhdGljX2Nhc3Q8TW9kZWxUeXBlPihUUklFX1NPUlRFRCArIFF1YW50OjprTW9kZWxUeXBlQWRkICsgQmhpa3NoYTo6a01vZGVsVHlwZUFkZCk7CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtWZXJzaW9uID0gMTsKKworICAgIHN0YXRpYyB2b2lkIFVwZGF0ZUNvbmZpZ0Zyb21CaW5hcnkoY29uc3QgQmluYXJ5Rm9ybWF0ICZmaWxlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgdWludDY0X3Qgb2Zmc2V0LCBDb25maWcgJmNvbmZpZykgeworICAgICAgUXVhbnQ6OlVwZGF0ZUNvbmZpZ0Zyb21CaW5hcnkoZmlsZSwgb2Zmc2V0LCBjb25maWcpOworICAgICAgLy8gQ3VycmVudGx5IHRoZSB1bmlncmFtIHBvaW50ZXJzIGFyZSBub3QgY29tcHJlc3NzZWQsIHNvIHRoZXJlIHdpbGwgb25seSBiZSBhIGhlYWRlciBmb3Igb3JkZXIgPiAyLgorICAgICAgaWYgKGNvdW50cy5zaXplKCkgPiAyKQorICAgICAgICBCaGlrc2hhOjpVcGRhdGVDb25maWdGcm9tQmluYXJ5KGZpbGUsIG9mZnNldCArIFF1YW50OjpTaXplKGNvdW50cy5zaXplKCksIGNvbmZpZykgKyBVbmlncmFtOjpTaXplKGNvdW50c1swXSksIGNvbmZpZyk7CisgICAgfQorCisgICAgc3RhdGljIHVpbnQ2NF90IFNpemUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIGNvbnN0IENvbmZpZyAmY29uZmlnKSB7CisgICAgICB1aW50NjRfdCByZXQgPSBRdWFudDo6U2l6ZShjb3VudHMuc2l6ZSgpLCBjb25maWcpICsgVW5pZ3JhbTo6U2l6ZShjb3VudHNbMF0pOworICAgICAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSAxOyBpIDwgY291bnRzLnNpemUoKSAtIDE7ICsraSkgeworICAgICAgICByZXQgKz0gTWlkZGxlOjpTaXplKFF1YW50OjpNaWRkbGVCaXRzKGNvbmZpZyksIGNvdW50c1tpXSwgY291bnRzWzBdLCBjb3VudHNbaSsxXSwgY29uZmlnKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXQgKyBMb25nZXN0OjpTaXplKFF1YW50OjpMb25nZXN0Qml0cyhjb25maWcpLCBjb3VudHMuYmFjaygpLCBjb3VudHNbMF0pOworICAgIH0KKworICAgIFRyaWVTZWFyY2goKSA6IG1pZGRsZV9iZWdpbl8oTlVMTCksIG1pZGRsZV9lbmRfKE5VTEwpIHt9CisKKyAgICB+VHJpZVNlYXJjaCgpIHsgRnJlZU1pZGRsZXMoKTsgfQorCisgICAgdWludDhfdCAqU2V0dXBNZW1vcnkodWludDhfdCAqc3RhcnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzLCBjb25zdCBDb25maWcgJmNvbmZpZyk7CisKKyAgICB2b2lkIEluaXRpYWxpemVGcm9tQVJQQShjb25zdCBjaGFyICpmaWxlLCB1dGlsOjpGaWxlUGllY2UgJmYsIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzLCBjb25zdCBDb25maWcgJmNvbmZpZywgU29ydGVkVm9jYWJ1bGFyeSAmdm9jYWIsIEJpbmFyeUZvcm1hdCAmYmFja2luZyk7CisKKyAgICB1bnNpZ25lZCBjaGFyIE9yZGVyKCkgY29uc3QgeworICAgICAgcmV0dXJuIG1pZGRsZV9lbmRfIC0gbWlkZGxlX2JlZ2luXyArIDI7CisgICAgfQorCisgICAgUHJvYkJhY2tvZmYgJlVua25vd25VbmlncmFtKCkgeyByZXR1cm4gdW5pZ3JhbV8uVW5rbm93bigpOyB9CisKKyAgICBVbmlncmFtUG9pbnRlciBMb29rdXBVbmlncmFtKFdvcmRJbmRleCB3b3JkLCBOb2RlICZuZXh0LCBib29sICZpbmRlcGVuZGVudF9sZWZ0LCB1aW50NjRfdCAmZXh0ZW5kX2xlZnQpIGNvbnN0IHsKKyAgICAgIGV4dGVuZF9sZWZ0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHdvcmQpOworICAgICAgVW5pZ3JhbVBvaW50ZXIgcmV0KHVuaWdyYW1fLkZpbmQod29yZCwgbmV4dCkpOworICAgICAgaW5kZXBlbmRlbnRfbGVmdCA9IChuZXh0LmJlZ2luID09IG5leHQuZW5kKTsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgTWlkZGxlUG9pbnRlciBVbnBhY2sodWludDY0X3QgZXh0ZW5kX3BvaW50ZXIsIHVuc2lnbmVkIGNoYXIgZXh0ZW5kX2xlbmd0aCwgTm9kZSAmbm9kZSkgY29uc3QgeworICAgICAgcmV0dXJuIE1pZGRsZVBvaW50ZXIocXVhbnRfLCBleHRlbmRfbGVuZ3RoIC0gMiwgbWlkZGxlX2JlZ2luX1tleHRlbmRfbGVuZ3RoIC0gMl0uUmVhZEVudHJ5KGV4dGVuZF9wb2ludGVyLCBub2RlKSk7CisgICAgfQorCisgICAgTWlkZGxlUG9pbnRlciBMb29rdXBNaWRkbGUodW5zaWduZWQgY2hhciBvcmRlcl9taW51c18yLCBXb3JkSW5kZXggd29yZCwgTm9kZSAmbm9kZSwgYm9vbCAmaW5kZXBlbmRlbnRfbGVmdCwgdWludDY0X3QgJmV4dGVuZF9sZWZ0KSBjb25zdCB7CisgICAgICB1dGlsOjpCaXRBZGRyZXNzIGFkZHJlc3MobWlkZGxlX2JlZ2luX1tvcmRlcl9taW51c18yXS5GaW5kKHdvcmQsIG5vZGUsIGV4dGVuZF9sZWZ0KSk7CisgICAgICBpbmRlcGVuZGVudF9sZWZ0ID0gKGFkZHJlc3MuYmFzZSA9PSBOVUxMKSB8fCAobm9kZS5iZWdpbiA9PSBub2RlLmVuZCk7CisgICAgICByZXR1cm4gTWlkZGxlUG9pbnRlcihxdWFudF8sIG9yZGVyX21pbnVzXzIsIGFkZHJlc3MpOworICAgIH0KKworICAgIExvbmdlc3RQb2ludGVyIExvb2t1cExvbmdlc3QoV29yZEluZGV4IHdvcmQsIGNvbnN0IE5vZGUgJm5vZGUpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMb25nZXN0UG9pbnRlcihxdWFudF8sIGxvbmdlc3RfLkZpbmQod29yZCwgbm9kZSkpOworICAgIH0KKworICAgIGJvb2wgRmFzdE1ha2VOb2RlKGNvbnN0IFdvcmRJbmRleCAqYmVnaW4sIGNvbnN0IFdvcmRJbmRleCAqZW5kLCBOb2RlICZub2RlKSBjb25zdCB7CisgICAgICBhc3NlcnQoYmVnaW4gIT0gZW5kKTsKKyAgICAgIGJvb2wgaW5kZXBlbmRlbnRfbGVmdDsKKyAgICAgIHVpbnQ2NF90IGlnbm9yZWQ7CisgICAgICBMb29rdXBVbmlncmFtKCpiZWdpbiwgbm9kZSwgaW5kZXBlbmRlbnRfbGVmdCwgaWdub3JlZCk7CisgICAgICBmb3IgKGNvbnN0IFdvcmRJbmRleCAqaSA9IGJlZ2luICsgMTsgaSA8IGVuZDsgKytpKSB7CisgICAgICAgIGlmIChpbmRlcGVuZGVudF9sZWZ0IHx8ICFMb29rdXBNaWRkbGUoaSAtIGJlZ2luIC0gMSwgKmksIG5vZGUsIGluZGVwZW5kZW50X2xlZnQsIGlnbm9yZWQpLkZvdW5kKCkpIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBwcml2YXRlOgorICAgIGZyaWVuZCB2b2lkIEJ1aWxkVHJpZTxRdWFudCwgQmhpa3NoYT4oU29ydGVkRmlsZXMgJmZpbGVzLCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3QgQ29uZmlnICZjb25maWcsIFRyaWVTZWFyY2g8UXVhbnQsIEJoaWtzaGE+ICZvdXQsIFF1YW50ICZxdWFudCwgU29ydGVkVm9jYWJ1bGFyeSAmdm9jYWIsIEJpbmFyeUZvcm1hdCAmYmFja2luZyk7CisKKyAgICAvLyBNaWRkbGVzIGFyZSBtYW5hZ2VkIG1hbnVhbGx5IHNvIHdlIGNhbiBkZWxheSBjb25zdHJ1Y3Rpb24gYW5kIHRoZXkgZG9uJ3QgaGF2ZSB0byBiZSBjb3B5YWJsZS4KKyAgICB2b2lkIEZyZWVNaWRkbGVzKCkgeworICAgICAgZm9yIChjb25zdCBNaWRkbGUgKmkgPSBtaWRkbGVfYmVnaW5fOyBpICE9IG1pZGRsZV9lbmRfOyArK2kpIHsKKyAgICAgICAgaS0+fk1pZGRsZSgpOworICAgICAgfQorICAgICAgc3RkOjpmcmVlKG1pZGRsZV9iZWdpbl8pOworICAgIH0KKworICAgIHR5cGVkZWYgdHJpZTo6Qml0UGFja2VkTWlkZGxlPEJoaWtzaGE+IE1pZGRsZTsKKworICAgIHR5cGVkZWYgdHJpZTo6Qml0UGFja2VkTG9uZ2VzdCBMb25nZXN0OworICAgIExvbmdlc3QgbG9uZ2VzdF87CisKKyAgICBNaWRkbGUgKm1pZGRsZV9iZWdpbl8sICptaWRkbGVfZW5kXzsKKyAgICBRdWFudCBxdWFudF87CisKKyAgICB0eXBlZGVmIDo6bG06Om5ncmFtOjp0cmllOjpVbmlncmFtIFVuaWdyYW07CisgICAgVW5pZ3JhbSB1bmlncmFtXzsKK307CisKK30gLy8gbmFtZXNwYWNlIHRyaWUKK30gLy8gbmFtZXNwYWNlIG5ncmFtCit9IC8vIG5hbWVzcGFjZSBsbQorCisjZW5kaWYgLy8gTE1fU0VBUkNIX1RSSUVfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL3NpemVzLmNjIGIvc3JjL2tlbmxtL2xtL3NpemVzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkODMxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vc2l6ZXMuY2MKQEAgLTAsMCArMSw2MyBAQAorI2luY2x1ZGUgImxtL3NpemVzLmhoIgorI2luY2x1ZGUgImxtL21vZGVsLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZV9waWVjZS5oaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb21hbmlwPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKKwordm9pZCBTaG93U2l6ZXMoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIGNvbnN0IGxtOjpuZ3JhbTo6Q29uZmlnICZjb25maWcpIHsKKyAgdWludDY0X3Qgc2l6ZXNbNl07CisgIHNpemVzWzBdID0gUHJvYmluZ01vZGVsOjpTaXplKGNvdW50cywgY29uZmlnKTsKKyAgc2l6ZXNbMV0gPSBSZXN0UHJvYmluZ01vZGVsOjpTaXplKGNvdW50cywgY29uZmlnKTsKKyAgc2l6ZXNbMl0gPSBUcmllTW9kZWw6OlNpemUoY291bnRzLCBjb25maWcpOworICBzaXplc1szXSA9IFF1YW50VHJpZU1vZGVsOjpTaXplKGNvdW50cywgY29uZmlnKTsKKyAgc2l6ZXNbNF0gPSBBcnJheVRyaWVNb2RlbDo6U2l6ZShjb3VudHMsIGNvbmZpZyk7CisgIHNpemVzWzVdID0gUXVhbnRBcnJheVRyaWVNb2RlbDo6U2l6ZShjb3VudHMsIGNvbmZpZyk7CisgIHVpbnQ2NF90IG1heF9sZW5ndGggPSAqc3RkOjptYXhfZWxlbWVudChzaXplcywgc2l6ZXMgKyBzaXplb2Yoc2l6ZXMpIC8gc2l6ZW9mKHVpbnQ2NF90KSk7CisgIHVpbnQ2NF90IG1pbl9sZW5ndGggPSAqc3RkOjptaW5fZWxlbWVudChzaXplcywgc2l6ZXMgKyBzaXplb2Yoc2l6ZXMpIC8gc2l6ZW9mKHVpbnQ2NF90KSk7CisgIHVpbnQ2NF90IGRpdmlkZTsKKyAgY2hhciBwcmVmaXg7CisgIGlmIChtaW5fbGVuZ3RoIDwgKDEgPDwgMTApICogMTApIHsKKyAgICBwcmVmaXggPSAnICc7CisgICAgZGl2aWRlID0gMTsKKyAgfSBlbHNlIGlmIChtaW5fbGVuZ3RoIDwgKDEgPDwgMjApICogMTApIHsKKyAgICBwcmVmaXggPSAnayc7CisgICAgZGl2aWRlID0gMSA8PCAxMDsKKyAgfSBlbHNlIGlmIChtaW5fbGVuZ3RoIDwgKDFVTEwgPDwgMzApICogMTApIHsKKyAgICBwcmVmaXggPSAnTSc7CisgICAgZGl2aWRlID0gMSA8PCAyMDsKKyAgfSBlbHNlIHsKKyAgICBwcmVmaXggPSAnRyc7CisgICAgZGl2aWRlID0gMSA8PCAzMDsKKyAgfQorICBsb25nIGludCBsZW5ndGggPSBzdGQ6Om1heDxsb25nIGludD4oMiwgc3RhdGljX2Nhc3Q8bG9uZyBpbnQ+KGNlaWwobG9nMTAoKGRvdWJsZSkgbWF4X2xlbmd0aCAvIGRpdmlkZSkpKSk7CisgIHN0ZDo6Y2VyciA8PCAiTWVtb3J5IGVzdGltYXRlIGZvciBiaW5hcnkgTE06XG50eXBlICAgICI7CisKKyAgLy8gcmlnaHQgYWxpZ24gYnl0ZXMuCisgIGZvciAobG9uZyBpbnQgaSA9IDA7IGkgPCBsZW5ndGggLSAyOyArK2kpIHN0ZDo6Y2VyciA8PCAnICc7CisKKyAgc3RkOjpjZXJyIDw8IHByZWZpeCA8PCAiQlxuIgorICAgICJwcm9iaW5nICIgPDwgc3RkOjpzZXR3KGxlbmd0aCkgPDwgKHNpemVzWzBdIC8gZGl2aWRlKSA8PCAiIGFzc3VtaW5nIC1wICIgPDwgY29uZmlnLnByb2JpbmdfbXVsdGlwbGllciA8PCAiXG4iCisgICAgInByb2JpbmcgIiA8PCBzdGQ6OnNldHcobGVuZ3RoKSA8PCAoc2l6ZXNbMV0gLyBkaXZpZGUpIDw8ICIgYXNzdW1pbmcgLXIgbW9kZWxzIC1wICIgPDwgY29uZmlnLnByb2JpbmdfbXVsdGlwbGllciA8PCAiXG4iCisgICAgInRyaWUgICAgIiA8PCBzdGQ6OnNldHcobGVuZ3RoKSA8PCAoc2l6ZXNbMl0gLyBkaXZpZGUpIDw8ICIgd2l0aG91dCBxdWFudGl6YXRpb25cbiIKKyAgICAidHJpZSAgICAiIDw8IHN0ZDo6c2V0dyhsZW5ndGgpIDw8IChzaXplc1szXSAvIGRpdmlkZSkgPDwgIiBhc3N1bWluZyAtcSAiIDw8ICh1bnNpZ25lZCljb25maWcucHJvYl9iaXRzIDw8ICIgLWIgIiA8PCAodW5zaWduZWQpY29uZmlnLmJhY2tvZmZfYml0cyA8PCAiIHF1YW50aXphdGlvbiBcbiIKKyAgICAidHJpZSAgICAiIDw8IHN0ZDo6c2V0dyhsZW5ndGgpIDw8IChzaXplc1s0XSAvIGRpdmlkZSkgPDwgIiBhc3N1bWluZyAtYSAiIDw8ICh1bnNpZ25lZCljb25maWcucG9pbnRlcl9iaGlrc2hhX2JpdHMgPDwgIiBhcnJheSBwb2ludGVyIGNvbXByZXNzaW9uXG4iCisgICAgInRyaWUgICAgIiA8PCBzdGQ6OnNldHcobGVuZ3RoKSA8PCAoc2l6ZXNbNV0gLyBkaXZpZGUpIDw8ICIgYXNzdW1pbmcgLWEgIiA8PCAodW5zaWduZWQpY29uZmlnLnBvaW50ZXJfYmhpa3NoYV9iaXRzIDw8ICIgLXEgIiA8PCAodW5zaWduZWQpY29uZmlnLnByb2JfYml0cyA8PCAiIC1iICIgPDwgKHVuc2lnbmVkKWNvbmZpZy5iYWNrb2ZmX2JpdHM8PCAiIGFycmF5IHBvaW50ZXIgY29tcHJlc3Npb24gYW5kIHF1YW50aXphdGlvblxuIjsKK30KKwordm9pZCBTaG93U2l6ZXMoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMpIHsKKyAgbG06Om5ncmFtOjpDb25maWcgY29uZmlnOworICBTaG93U2l6ZXMoY291bnRzLCBjb25maWcpOworfQorCit2b2lkIFNob3dTaXplcyhjb25zdCBjaGFyICpmaWxlLCBjb25zdCBsbTo6bmdyYW06OkNvbmZpZyAmY29uZmlnKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBjb3VudHM7CisgIHV0aWw6OkZpbGVQaWVjZSBmKGZpbGUpOworICBsbTo6UmVhZEFSUEFDb3VudHMoZiwgY291bnRzKTsKKyAgU2hvd1NpemVzKGNvdW50cywgY29uZmlnKTsKK30KKworfX0gLy9uYW1lc3BhY2VzCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vc2l6ZXMuaGggYi9zcmMva2VubG0vbG0vc2l6ZXMuaGgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS9zaXplcy5oaApyZW5hbWUgdG8gc3JjL2tlbmxtL2xtL3NpemVzLmhoCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vc3RhdGUuaGggYi9zcmMva2VubG0vbG0vc3RhdGUuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5NWRlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS9zdGF0ZS5oaApAQCAtMCwwICsxLDEyNSBAQAorI2lmbmRlZiBMTV9TVEFURV9ICisjZGVmaW5lIExNX1NUQVRFX0gKKworI2luY2x1ZGUgImxtL21heF9vcmRlci5oaCIKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorI2luY2x1ZGUgInV0aWwvbXVybXVyX2hhc2guaGgiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKKworLy8gVGhpcyBpcyBhIFBPRCBidXQgaWYgeW91IHdhbnQgbWVtY21wIHRvIHJldHVybiB0aGUgc2FtZSBhcyBvcGVyYXRvcj09LCBjYWxsCisvLyBaZXJvUmVtYWluaW5nIGZpcnN0LgorY2xhc3MgU3RhdGUgeworICBwdWJsaWM6CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0YXRlICZvdGhlcikgY29uc3QgeworICAgICAgaWYgKGxlbmd0aCAhPSBvdGhlci5sZW5ndGgpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiAhbWVtY21wKHdvcmRzLCBvdGhlci53b3JkcywgbGVuZ3RoICogc2l6ZW9mKFdvcmRJbmRleCkpOworICAgIH0KKworICAgIC8vIFRocmVlIHdheSBjb21wYXJpc29uIGZ1bmN0aW9uLgorICAgIGludCBDb21wYXJlKGNvbnN0IFN0YXRlICZvdGhlcikgY29uc3QgeworICAgICAgaWYgKGxlbmd0aCAhPSBvdGhlci5sZW5ndGgpIHJldHVybiBsZW5ndGggPCBvdGhlci5sZW5ndGggPyAtMSA6IDE7CisgICAgICByZXR1cm4gbWVtY21wKHdvcmRzLCBvdGhlci53b3JkcywgbGVuZ3RoICogc2l6ZW9mKFdvcmRJbmRleCkpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN0YXRlICZvdGhlcikgY29uc3QgeworICAgICAgaWYgKGxlbmd0aCAhPSBvdGhlci5sZW5ndGgpIHJldHVybiBsZW5ndGggPCBvdGhlci5sZW5ndGg7CisgICAgICByZXR1cm4gbWVtY21wKHdvcmRzLCBvdGhlci53b3JkcywgbGVuZ3RoICogc2l6ZW9mKFdvcmRJbmRleCkpIDwgMDsKKyAgICB9CisKKyAgICAvLyBDYWxsIHRoaXMgYmVmb3JlIHVzaW5nIHJhdyBtZW1jbXAuCisgICAgdm9pZCBaZXJvUmVtYWluaW5nKCkgeworICAgICAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSBsZW5ndGg7IGkgPCBLRU5MTV9NQVhfT1JERVIgLSAxOyArK2kpIHsKKyAgICAgICAgd29yZHNbaV0gPSAwOworICAgICAgICBiYWNrb2ZmW2ldID0gMC4wOworICAgICAgfQorICAgIH0KKworICAgIHVuc2lnbmVkIGNoYXIgTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoOyB9CisKKyAgICAvLyBZb3Ugc2hvdWxkbid0IG5lZWQgdG8gdG91Y2ggYW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lLCBidXQgdGhlIG1lbWJlcnMgYXJlIHB1YmxpYyBzbyBGdWxsU3RhdGUgd2lsbCBxdWFsaWZ5IGFzIGEgUE9ELgorICAgIC8vIFRoaXMgb3JkZXIgbWluaW1pemVzIHRvdGFsIHNpemUgb2YgdGhlIHN0cnVjdCBpZiBXb3JkSW5kZXggaXMgNjQgYml0LCBmbG9hdCBpcyAzMiBiaXQsIGFuZCBhbGlnbm1lbnQgb2YgNjQgYml0IGludGVnZXJzIGlzIDY0IGJpdC4KKyAgICBXb3JkSW5kZXggd29yZHNbS0VOTE1fTUFYX09SREVSIC0gMV07CisgICAgZmxvYXQgYmFja29mZltLRU5MTV9NQVhfT1JERVIgLSAxXTsKKyAgICB1bnNpZ25lZCBjaGFyIGxlbmd0aDsKK307CisKK3R5cGVkZWYgU3RhdGUgUmlnaHQ7CisKK2lubGluZSB1aW50NjRfdCBoYXNoX3ZhbHVlKGNvbnN0IFN0YXRlICZzdGF0ZSwgdWludDY0X3Qgc2VlZCA9IDApIHsKKyAgcmV0dXJuIHV0aWw6Ok11cm11ckhhc2hOYXRpdmUoc3RhdGUud29yZHMsIHNpemVvZihXb3JkSW5kZXgpICogc3RhdGUubGVuZ3RoLCBzZWVkKTsKK30KKworc3RydWN0IExlZnQgeworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGVmdCAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4KKyAgICAgIGxlbmd0aCA9PSBvdGhlci5sZW5ndGggJiYKKyAgICAgICghbGVuZ3RoIHx8IChwb2ludGVyc1tsZW5ndGggLSAxXSA9PSBvdGhlci5wb2ludGVyc1tsZW5ndGggLSAxXSAmJiBmdWxsID09IG90aGVyLmZ1bGwpKTsKKyAgfQorCisgIGludCBDb21wYXJlKGNvbnN0IExlZnQgJm90aGVyKSBjb25zdCB7CisgICAgaWYgKGxlbmd0aCA8IG90aGVyLmxlbmd0aCkgcmV0dXJuIC0xOworICAgIGlmIChsZW5ndGggPiBvdGhlci5sZW5ndGgpIHJldHVybiAxOworICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIDA7IC8vIE11c3QgYmUgZnVsbC4KKyAgICBpZiAocG9pbnRlcnNbbGVuZ3RoIC0gMV0gPiBvdGhlci5wb2ludGVyc1tsZW5ndGggLSAxXSkgcmV0dXJuIDE7CisgICAgaWYgKHBvaW50ZXJzW2xlbmd0aCAtIDFdIDwgb3RoZXIucG9pbnRlcnNbbGVuZ3RoIC0gMV0pIHJldHVybiAtMTsKKyAgICByZXR1cm4gKGludClmdWxsIC0gKGludClvdGhlci5mdWxsOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgTGVmdCAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29tcGFyZShvdGhlcikgPT0gLTE7CisgIH0KKworICB2b2lkIFplcm9SZW1haW5pbmcoKSB7CisgICAgZm9yICh1aW50NjRfdCAqIGkgPSBwb2ludGVycyArIGxlbmd0aDsgaSA8IHBvaW50ZXJzICsgS0VOTE1fTUFYX09SREVSIC0gMTsgKytpKQorICAgICAgKmkgPSAwOworICB9CisKKyAgdWludDY0X3QgcG9pbnRlcnNbS0VOTE1fTUFYX09SREVSIC0gMV07CisgIHVuc2lnbmVkIGNoYXIgbGVuZ3RoOworICBib29sIGZ1bGw7Cit9OworCitpbmxpbmUgdWludDY0X3QgaGFzaF92YWx1ZShjb25zdCBMZWZ0ICZsZWZ0KSB7CisgIHVuc2lnbmVkIGNoYXIgYWRkWzJdOworICBhZGRbMF0gPSBsZWZ0Lmxlbmd0aDsKKyAgYWRkWzFdID0gbGVmdC5mdWxsOworICByZXR1cm4gdXRpbDo6TXVybXVySGFzaE5hdGl2ZShhZGQsIDIsIGxlZnQubGVuZ3RoID8gbGVmdC5wb2ludGVyc1tsZWZ0Lmxlbmd0aCAtIDFdIDogMCk7Cit9CisKK3N0cnVjdCBDaGFydFN0YXRlIHsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENoYXJ0U3RhdGUgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIChyaWdodCA9PSBvdGhlci5yaWdodCkgJiYgKGxlZnQgPT0gb3RoZXIubGVmdCk7CisgIH0KKworICBpbnQgQ29tcGFyZShjb25zdCBDaGFydFN0YXRlICZvdGhlcikgY29uc3QgeworICAgIGludCBscmVzID0gbGVmdC5Db21wYXJlKG90aGVyLmxlZnQpOworICAgIGlmIChscmVzKSByZXR1cm4gbHJlczsKKyAgICByZXR1cm4gcmlnaHQuQ29tcGFyZShvdGhlci5yaWdodCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPChjb25zdCBDaGFydFN0YXRlICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBDb21wYXJlKG90aGVyKSA8IDA7CisgIH0KKworICB2b2lkIFplcm9SZW1haW5pbmcoKSB7CisgICAgbGVmdC5aZXJvUmVtYWluaW5nKCk7CisgICAgcmlnaHQuWmVyb1JlbWFpbmluZygpOworICB9CisKKyAgTGVmdCBsZWZ0OworICBTdGF0ZSByaWdodDsKK307CisKK2lubGluZSB1aW50NjRfdCBoYXNoX3ZhbHVlKGNvbnN0IENoYXJ0U3RhdGUgJnN0YXRlKSB7CisgIHJldHVybiBoYXNoX3ZhbHVlKHN0YXRlLnJpZ2h0LCBoYXNoX3ZhbHVlKHN0YXRlLmxlZnQpKTsKK30KKworCit9IC8vIG5hbWVzcGFjZSBuZ3JhbQorfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX1NUQVRFX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS90ZXN0LmFycGEgYi9zcmMva2VubG0vbG0vdGVzdC5hcnBhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vdGVzdC5hcnBhCnJlbmFtZSB0byBzcmMva2VubG0vbG0vdGVzdC5hcnBhCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vbG0vdGVzdF9ub3Vuay5hcnBhIGIvc3JjL2tlbmxtL2xtL3Rlc3Rfbm91bmsuYXJwYQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3Rlc3Rfbm91bmsuYXJwYQpyZW5hbWUgdG8gc3JjL2tlbmxtL2xtL3Rlc3Rfbm91bmsuYXJwYQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL3RyaWUuY2MgYi9zcmMva2VubG0vbG0vdHJpZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmFkNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL3RyaWUuY2MKQEAgLTAsMCArMSwxMzEgQEAKKyNpbmNsdWRlICJsbS90cmllLmhoIgorCisjaW5jbHVkZSAibG0vYmhpa3NoYS5oaCIKKyNpbmNsdWRlICJ1dGlsL2JpdF9wYWNraW5nLmhoIgorI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgInV0aWwvc29ydGVkX3VuaWZvcm0uaGgiCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKK25hbWVzcGFjZSB0cmllIHsKK25hbWVzcGFjZSB7CisKK2NsYXNzIEtleUFjY2Vzc29yIHsKKyAgcHVibGljOgorICAgIEtleUFjY2Vzc29yKGNvbnN0IHZvaWQgKmJhc2UsIHVpbnQ2NF90IGtleV9tYXNrLCB1aW50OF90IGtleV9iaXRzLCB1aW50OF90IHRvdGFsX2JpdHMpCisgICAgICA6IGJhc2VfKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJhc2UpKSwga2V5X21hc2tfKGtleV9tYXNrKSwga2V5X2JpdHNfKGtleV9iaXRzKSwgdG90YWxfYml0c18odG90YWxfYml0cykge30KKworICAgIHR5cGVkZWYgdWludDY0X3QgS2V5OworCisgICAgS2V5IG9wZXJhdG9yKCkodWludDY0X3QgaW5kZXgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1dGlsOjpSZWFkSW50NTcoYmFzZV8sIGluZGV4ICogc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHRvdGFsX2JpdHNfKSwga2V5X2JpdHNfLCBrZXlfbWFza18pOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJhc2VfOworICAgIGNvbnN0IFdvcmRJbmRleCBrZXlfbWFza187CisgICAgY29uc3QgdWludDhfdCBrZXlfYml0c18sIHRvdGFsX2JpdHNfOworfTsKKworYm9vbCBGaW5kQml0UGFja2VkKGNvbnN0IHZvaWQgKmJhc2UsIHVpbnQ2NF90IGtleV9tYXNrLCB1aW50OF90IGtleV9iaXRzLCB1aW50OF90IHRvdGFsX2JpdHMsIHVpbnQ2NF90IGJlZ2luX2luZGV4LCB1aW50NjRfdCBlbmRfaW5kZXgsIGNvbnN0IHVpbnQ2NF90IG1heF92b2NhYiwgY29uc3QgdWludDY0X3Qga2V5LCB1aW50NjRfdCAmYXRfaW5kZXgpIHsKKyAgS2V5QWNjZXNzb3IgYWNjZXNzb3IoYmFzZSwga2V5X21hc2ssIGtleV9iaXRzLCB0b3RhbF9iaXRzKTsKKyAgaWYgKCF1dGlsOjpCb3VuZGVkU29ydGVkVW5pZm9ybUZpbmQ8dWludDY0X3QsIEtleUFjY2Vzc29yLCB1dGlsOjpQaXZvdFNlbGVjdDxzaXplb2YoV29yZEluZGV4KT46OlQ+KGFjY2Vzc29yLCBiZWdpbl9pbmRleCAtIDEsICh1aW50NjRfdCkwLCBlbmRfaW5kZXgsIG1heF92b2NhYiwga2V5LCBhdF9pbmRleCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9Cit9IC8vIG5hbWVzcGFjZQorCit1aW50NjRfdCBCaXRQYWNrZWQ6OkJhc2VTaXplKHVpbnQ2NF90IGVudHJpZXMsIHVpbnQ2NF90IG1heF92b2NhYiwgdWludDhfdCByZW1haW5pbmdfYml0cykgeworICB1aW50OF90IHRvdGFsX2JpdHMgPSB1dGlsOjpSZXF1aXJlZEJpdHMobWF4X3ZvY2FiKSArIHJlbWFpbmluZ19iaXRzOworICAvLyBFeHRyYSBlbnRyeSBmb3IgbmV4dCBwb2ludGVyIGF0IHRoZSBlbmQuCisgIC8vICs3IHRoZW4gLyA4IHRvIHJvdW5kIHVwIGJpdHMgYW5kIGNvbnZlcnQgdG8gYnl0ZXMKKyAgLy8gK3NpemVvZih1aW50NjRfdCkgc28gdGhhdCBSZWFkSW50NTcgZXRjIGRvbid0IGdvIHNlZ2ZhdWx0LgorICAvLyBOb3RlIHRoYXQgdGhpcyB3YXN0ZSBpcyBPKG9yZGVyKSwgbm90IE8obnVtYmVyIG9mIG5ncmFtcykuCisgIHJldHVybiAoKDEgKyBlbnRyaWVzKSAqIHRvdGFsX2JpdHMgKyA3KSAvIDggKyBzaXplb2YodWludDY0X3QpOworfQorCit2b2lkIEJpdFBhY2tlZDo6QmFzZUluaXQodm9pZCAqYmFzZSwgdWludDY0X3QgbWF4X3ZvY2FiLCB1aW50OF90IHJlbWFpbmluZ19iaXRzKSB7CisgIHV0aWw6OkJpdFBhY2tpbmdTYW5pdHkoKTsKKyAgd29yZF9iaXRzXyA9IHV0aWw6OlJlcXVpcmVkQml0cyhtYXhfdm9jYWIpOworICB3b3JkX21hc2tfID0gKDFVTEwgPDwgd29yZF9iaXRzXykgLSAxVUxMOworICBpZiAod29yZF9iaXRzXyA+IDU3KSBVVElMX1RIUk9XKHV0aWw6OkV4Y2VwdGlvbiwgIlNvcnJ5LCB3b3JkIGluZGljZXMgbW9yZSB0aGFuICIgPDwgKDFVTEwgPDwgNTcpIDw8ICIgYXJlIG5vdCBpbXBsZW1lbnRlZC4gIEVkaXQgdXRpbC9iaXRfcGFja2luZy5oaCBhbmQgZml4IHRoZSBiaXQgcGFja2luZyBmdW5jdGlvbnMuIik7CisgIHRvdGFsX2JpdHNfID0gd29yZF9iaXRzXyArIHJlbWFpbmluZ19iaXRzOworCisgIGJhc2VfID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJhc2UpOworICBpbnNlcnRfaW5kZXhfID0gMDsKKyAgbWF4X3ZvY2FiXyA9IG1heF92b2NhYjsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJoaWtzaGE+IHVpbnQ2NF90IEJpdFBhY2tlZE1pZGRsZTxCaGlrc2hhPjo6U2l6ZSh1aW50OF90IHF1YW50X2JpdHMsIHVpbnQ2NF90IGVudHJpZXMsIHVpbnQ2NF90IG1heF92b2NhYiwgdWludDY0X3QgbWF4X3B0ciwgY29uc3QgQ29uZmlnICZjb25maWcpIHsKKyAgcmV0dXJuIEJoaWtzaGE6OlNpemUoZW50cmllcyArIDEsIG1heF9wdHIsIGNvbmZpZykgKyBCYXNlU2l6ZShlbnRyaWVzLCBtYXhfdm9jYWIsIHF1YW50X2JpdHMgKyBCaGlrc2hhOjpJbmxpbmVCaXRzKGVudHJpZXMgKyAxLCBtYXhfcHRyLCBjb25maWcpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJoaWtzaGE+IEJpdFBhY2tlZE1pZGRsZTxCaGlrc2hhPjo6Qml0UGFja2VkTWlkZGxlKHZvaWQgKmJhc2UsIHVpbnQ4X3QgcXVhbnRfYml0cywgdWludDY0X3QgZW50cmllcywgdWludDY0X3QgbWF4X3ZvY2FiLCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQml0UGFja2VkICZuZXh0X3NvdXJjZSwgY29uc3QgQ29uZmlnICZjb25maWcpIDoKKyAgQml0UGFja2VkKCksCisgIHF1YW50X2JpdHNfKHF1YW50X2JpdHMpLAorICAvLyBJZiB0aGUgb2Zmc2V0IG9mIHRoZSBtZXRob2QgY2hhbmdlcywgYWxzbyBjaGFuZ2UgVHJpZVNlYXJjaDo6VXBkYXRlQ29uZmlnRnJvbUJpbmFyeS4KKyAgYmhpa3NoYV8oYmFzZSwgZW50cmllcyArIDEsIG1heF9uZXh0LCBjb25maWcpLAorICBuZXh0X3NvdXJjZV8oJm5leHRfc291cmNlKSB7CisgIGlmIChlbnRyaWVzICsgMSA+PSAoMVVMTCA8PCA1NykgfHwgKG1heF9uZXh0ID49ICgxVUxMIDw8IDU3KSkpICBVVElMX1RIUk9XKHV0aWw6OkV4Y2VwdGlvbiwgIlNvcnJ5LCB0aGlzIGRvZXMgbm90IHN1cHBvcnQgbW9yZSB0aGFuICIgPDwgKDFVTEwgPDwgNTcpIDw8ICIgbi1ncmFtcyBvZiBhIHBhcnRpY3VsYXIgb3JkZXIuICBFZGl0IHV0aWwvYml0X3BhY2tpbmcuaGggYW5kIGZpeCB0aGUgYml0IHBhY2tpbmcgZnVuY3Rpb25zLiIpOworICBCYXNlSW5pdChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihiYXNlKSArIEJoaWtzaGE6OlNpemUoZW50cmllcyArIDEsIG1heF9uZXh0LCBjb25maWcpLCBtYXhfdm9jYWIsIHF1YW50X2JpdHNfICsgYmhpa3NoYV8uSW5saW5lQml0cygpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJoaWtzaGE+IHV0aWw6OkJpdEFkZHJlc3MgQml0UGFja2VkTWlkZGxlPEJoaWtzaGE+OjpJbnNlcnQoV29yZEluZGV4IHdvcmQpIHsKKyAgYXNzZXJ0KHdvcmQgPD0gd29yZF9tYXNrXyk7CisgIHVpbnQ2NF90IGF0X3BvaW50ZXIgPSBpbnNlcnRfaW5kZXhfICogdG90YWxfYml0c187CisKKyAgdXRpbDo6V3JpdGVJbnQ1NyhiYXNlXywgYXRfcG9pbnRlciwgd29yZF9iaXRzXywgd29yZCk7CisgIGF0X3BvaW50ZXIgKz0gd29yZF9iaXRzXzsKKyAgdXRpbDo6Qml0QWRkcmVzcyByZXQoYmFzZV8sIGF0X3BvaW50ZXIpOworICBhdF9wb2ludGVyICs9IHF1YW50X2JpdHNfOworICB1aW50NjRfdCBuZXh0ID0gbmV4dF9zb3VyY2VfLT5JbnNlcnRJbmRleCgpOworICBiaGlrc2hhXy5Xcml0ZU5leHQoYmFzZV8sIGF0X3BvaW50ZXIsIGluc2VydF9pbmRleF8sIG5leHQpOworICArK2luc2VydF9pbmRleF87CisgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCaGlrc2hhPiB1dGlsOjpCaXRBZGRyZXNzIEJpdFBhY2tlZE1pZGRsZTxCaGlrc2hhPjo6RmluZChXb3JkSW5kZXggd29yZCwgTm9kZVJhbmdlICZyYW5nZSwgdWludDY0X3QgJnBvaW50ZXIpIGNvbnN0IHsKKyAgdWludDY0X3QgYXRfcG9pbnRlcjsKKyAgaWYgKCFGaW5kQml0UGFja2VkKGJhc2VfLCB3b3JkX21hc2tfLCB3b3JkX2JpdHNfLCB0b3RhbF9iaXRzXywgcmFuZ2UuYmVnaW4sIHJhbmdlLmVuZCwgbWF4X3ZvY2FiXywgd29yZCwgYXRfcG9pbnRlcikpIHsKKyAgICByZXR1cm4gdXRpbDo6Qml0QWRkcmVzcyhOVUxMLCAwKTsKKyAgfQorICBwb2ludGVyID0gYXRfcG9pbnRlcjsKKyAgYXRfcG9pbnRlciAqPSB0b3RhbF9iaXRzXzsKKyAgYXRfcG9pbnRlciArPSB3b3JkX2JpdHNfOworICBiaGlrc2hhXy5SZWFkTmV4dChiYXNlXywgYXRfcG9pbnRlciArIHF1YW50X2JpdHNfLCBwb2ludGVyLCB0b3RhbF9iaXRzXywgcmFuZ2UpOworCisgIHJldHVybiB1dGlsOjpCaXRBZGRyZXNzKGJhc2VfLCBhdF9wb2ludGVyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJoaWtzaGE+IHZvaWQgQml0UGFja2VkTWlkZGxlPEJoaWtzaGE+OjpGaW5pc2hlZExvYWRpbmcodWludDY0X3QgbmV4dF9lbmQsIGNvbnN0IENvbmZpZyAmY29uZmlnKSB7CisgIC8vIFdyaXRlIGF0IGluc2VydF9pbmRleC4gLiAuCisgIHVpbnQ2NF90IGxhc3RfbmV4dF93cml0ZSA9IGluc2VydF9pbmRleF8gKiB0b3RhbF9iaXRzXyArCisgICAgLy8gYXQgdGhlIG9mZnNldCB3aGVyZSB0aGUgbmV4dCBwb2ludGVycyBhcmUgc3RvcmVkLgorICAgICh0b3RhbF9iaXRzXyAtIGJoaWtzaGFfLklubGluZUJpdHMoKSk7CisgIGJoaWtzaGFfLldyaXRlTmV4dChiYXNlXywgbGFzdF9uZXh0X3dyaXRlLCBpbnNlcnRfaW5kZXhfLCBuZXh0X2VuZCk7CisgIGJoaWtzaGFfLkZpbmlzaGVkTG9hZGluZyhjb25maWcpOworfQorCit1dGlsOjpCaXRBZGRyZXNzIEJpdFBhY2tlZExvbmdlc3Q6Okluc2VydChXb3JkSW5kZXggaW5kZXgpIHsKKyAgYXNzZXJ0KGluZGV4IDw9IHdvcmRfbWFza18pOworICB1aW50NjRfdCBhdF9wb2ludGVyID0gaW5zZXJ0X2luZGV4XyAqIHRvdGFsX2JpdHNfOworICB1dGlsOjpXcml0ZUludDU3KGJhc2VfLCBhdF9wb2ludGVyLCB3b3JkX2JpdHNfLCBpbmRleCk7CisgIGF0X3BvaW50ZXIgKz0gd29yZF9iaXRzXzsKKyAgKytpbnNlcnRfaW5kZXhfOworICByZXR1cm4gdXRpbDo6Qml0QWRkcmVzcyhiYXNlXywgYXRfcG9pbnRlcik7Cit9CisKK3V0aWw6OkJpdEFkZHJlc3MgQml0UGFja2VkTG9uZ2VzdDo6RmluZChXb3JkSW5kZXggd29yZCwgY29uc3QgTm9kZVJhbmdlICZyYW5nZSkgY29uc3QgeworICB1aW50NjRfdCBhdF9wb2ludGVyOworICBpZiAoIUZpbmRCaXRQYWNrZWQoYmFzZV8sIHdvcmRfbWFza18sIHdvcmRfYml0c18sIHRvdGFsX2JpdHNfLCByYW5nZS5iZWdpbiwgcmFuZ2UuZW5kLCBtYXhfdm9jYWJfLCB3b3JkLCBhdF9wb2ludGVyKSkgcmV0dXJuIHV0aWw6OkJpdEFkZHJlc3MoTlVMTCwgMCk7CisgIGF0X3BvaW50ZXIgPSBhdF9wb2ludGVyICogdG90YWxfYml0c18gKyB3b3JkX2JpdHNfOworICByZXR1cm4gdXRpbDo6Qml0QWRkcmVzcyhiYXNlXywgYXRfcG9pbnRlcik7Cit9CisKK3RlbXBsYXRlIGNsYXNzIEJpdFBhY2tlZE1pZGRsZTxEb250Qmhpa3NoYT47Cit0ZW1wbGF0ZSBjbGFzcyBCaXRQYWNrZWRNaWRkbGU8QXJyYXlCaGlrc2hhPjsKKworfSAvLyBuYW1lc3BhY2UgdHJpZQorfSAvLyBuYW1lc3BhY2UgbmdyYW0KK30gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vdHJpZS5oaCBiL3NyYy9rZW5sbS9sbS90cmllLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjA0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vdHJpZS5oaApAQCAtMCwwICsxLDE0NiBAQAorI2lmbmRlZiBMTV9UUklFX0gKKyNkZWZpbmUgTE1fVFJJRV9ICisKKyNpbmNsdWRlICJsbS93ZWlnaHRzLmhoIgorI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisjaW5jbHVkZSAidXRpbC9iaXRfcGFja2luZy5oaCIKKworI2luY2x1ZGUgPGNzdGRkZWY+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBuZ3JhbSB7CitzdHJ1Y3QgQ29uZmlnOworbmFtZXNwYWNlIHRyaWUgeworCitzdHJ1Y3QgTm9kZVJhbmdlIHsKKyAgdWludDY0X3QgYmVnaW4sIGVuZDsKK307CisKKy8vIFRPRE86IGlmIHRoZSBudW1iZXIgb2YgdW5pZ3JhbXMgaXMgYSBjb25jZXJuLCBhbHNvIGJpdCBwYWNrIHRoZXNlIHJlY29yZHMuCitzdHJ1Y3QgVW5pZ3JhbVZhbHVlIHsKKyAgUHJvYkJhY2tvZmYgd2VpZ2h0czsKKyAgdWludDY0X3QgbmV4dDsKKyAgdWludDY0X3QgTmV4dCgpIGNvbnN0IHsgcmV0dXJuIG5leHQ7IH0KK307CisKK2NsYXNzIFVuaWdyYW1Qb2ludGVyIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFVuaWdyYW1Qb2ludGVyKGNvbnN0IFByb2JCYWNrb2ZmICZ0bykgOiB0b18oJnRvKSB7fQorCisgICAgVW5pZ3JhbVBvaW50ZXIoKSA6IHRvXyhOVUxMKSB7fQorCisgICAgYm9vbCBGb3VuZCgpIGNvbnN0IHsgcmV0dXJuIHRvXyAhPSBOVUxMOyB9CisKKyAgICBmbG9hdCBQcm9iKCkgY29uc3QgeyByZXR1cm4gdG9fLT5wcm9iOyB9CisgICAgZmxvYXQgQmFja29mZigpIGNvbnN0IHsgcmV0dXJuIHRvXy0+YmFja29mZjsgfQorICAgIGZsb2F0IFJlc3QoKSBjb25zdCB7IHJldHVybiBQcm9iKCk7IH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IFByb2JCYWNrb2ZmICp0b187Cit9OworCitjbGFzcyBVbmlncmFtIHsKKyAgcHVibGljOgorICAgIFVuaWdyYW0oKSB7fQorCisgICAgdm9pZCBJbml0KHZvaWQgKnN0YXJ0KSB7CisgICAgICB1bmlncmFtXyA9IHN0YXRpY19jYXN0PFVuaWdyYW1WYWx1ZSo+KHN0YXJ0KTsKKyAgICB9CisKKyAgICBzdGF0aWMgdWludDY0X3QgU2l6ZSh1aW50NjRfdCBjb3VudCkgeworICAgICAgLy8gKzEgaW4gY2FzZSB1bmtub3duIGRvZXNuJ3QgYXBwZWFyLiAgKzEgZm9yIHRoZSBmaW5hbCBuZXh0LgorICAgICAgcmV0dXJuIChjb3VudCArIDIpICogc2l6ZW9mKFVuaWdyYW1WYWx1ZSk7CisgICAgfQorCisgICAgY29uc3QgUHJvYkJhY2tvZmYgJkxvb2t1cChXb3JkSW5kZXggaW5kZXgpIGNvbnN0IHsgcmV0dXJuIHVuaWdyYW1fW2luZGV4XS53ZWlnaHRzOyB9CisKKyAgICBQcm9iQmFja29mZiAmVW5rbm93bigpIHsgcmV0dXJuIHVuaWdyYW1fWzBdLndlaWdodHM7IH0KKworICAgIFVuaWdyYW1WYWx1ZSAqUmF3KCkgeworICAgICAgcmV0dXJuIHVuaWdyYW1fOworICAgIH0KKworICAgIFVuaWdyYW1Qb2ludGVyIEZpbmQoV29yZEluZGV4IHdvcmQsIE5vZGVSYW5nZSAmbmV4dCkgY29uc3QgeworICAgICAgVW5pZ3JhbVZhbHVlICp2YWwgPSB1bmlncmFtXyArIHdvcmQ7CisgICAgICBuZXh0LmJlZ2luID0gdmFsLT5uZXh0OworICAgICAgbmV4dC5lbmQgPSAodmFsKzEpLT5uZXh0OworICAgICAgcmV0dXJuIFVuaWdyYW1Qb2ludGVyKHZhbC0+d2VpZ2h0cyk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVW5pZ3JhbVZhbHVlICp1bmlncmFtXzsKK307CisKK2NsYXNzIEJpdFBhY2tlZCB7CisgIHB1YmxpYzoKKyAgICBCaXRQYWNrZWQoKSB7fQorCisgICAgdWludDY0X3QgSW5zZXJ0SW5kZXgoKSBjb25zdCB7CisgICAgICByZXR1cm4gaW5zZXJ0X2luZGV4XzsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB1aW50NjRfdCBCYXNlU2l6ZSh1aW50NjRfdCBlbnRyaWVzLCB1aW50NjRfdCBtYXhfdm9jYWIsIHVpbnQ4X3QgcmVtYWluaW5nX2JpdHMpOworCisgICAgdm9pZCBCYXNlSW5pdCh2b2lkICpiYXNlLCB1aW50NjRfdCBtYXhfdm9jYWIsIHVpbnQ4X3QgcmVtYWluaW5nX2JpdHMpOworCisgICAgdWludDhfdCB3b3JkX2JpdHNfOworICAgIHVpbnQ4X3QgdG90YWxfYml0c187CisgICAgdWludDY0X3Qgd29yZF9tYXNrXzsKKworICAgIHVpbnQ4X3QgKmJhc2VfOworCisgICAgdWludDY0X3QgaW5zZXJ0X2luZGV4XywgbWF4X3ZvY2FiXzsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBCaGlrc2hhPiBjbGFzcyBCaXRQYWNrZWRNaWRkbGUgOiBwdWJsaWMgQml0UGFja2VkIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyB1aW50NjRfdCBTaXplKHVpbnQ4X3QgcXVhbnRfYml0cywgdWludDY0X3QgZW50cmllcywgdWludDY0X3QgbWF4X3ZvY2FiLCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQ29uZmlnICZjb25maWcpOworCisgICAgLy8gbmV4dF9zb3VyY2UgbmVlZCBub3QgYmUgaW5pdGlhbGl6ZWQuCisgICAgQml0UGFja2VkTWlkZGxlKHZvaWQgKmJhc2UsIHVpbnQ4X3QgcXVhbnRfYml0cywgdWludDY0X3QgZW50cmllcywgdWludDY0X3QgbWF4X3ZvY2FiLCB1aW50NjRfdCBtYXhfbmV4dCwgY29uc3QgQml0UGFja2VkICZuZXh0X3NvdXJjZSwgY29uc3QgQ29uZmlnICZjb25maWcpOworCisgICAgdXRpbDo6Qml0QWRkcmVzcyBJbnNlcnQoV29yZEluZGV4IHdvcmQpOworCisgICAgdm9pZCBGaW5pc2hlZExvYWRpbmcodWludDY0X3QgbmV4dF9lbmQsIGNvbnN0IENvbmZpZyAmY29uZmlnKTsKKworICAgIHV0aWw6OkJpdEFkZHJlc3MgRmluZChXb3JkSW5kZXggd29yZCwgTm9kZVJhbmdlICZyYW5nZSwgdWludDY0X3QgJnBvaW50ZXIpIGNvbnN0OworCisgICAgdXRpbDo6Qml0QWRkcmVzcyBSZWFkRW50cnkodWludDY0X3QgcG9pbnRlciwgTm9kZVJhbmdlICZyYW5nZSkgeworICAgICAgdWludDY0X3QgYWRkciA9IHBvaW50ZXIgKiB0b3RhbF9iaXRzXzsKKyAgICAgIGFkZHIgKz0gd29yZF9iaXRzXzsKKyAgICAgIGJoaWtzaGFfLlJlYWROZXh0KGJhc2VfLCBhZGRyICsgcXVhbnRfYml0c18sIHBvaW50ZXIsIHRvdGFsX2JpdHNfLCByYW5nZSk7CisgICAgICByZXR1cm4gdXRpbDo6Qml0QWRkcmVzcyhiYXNlXywgYWRkcik7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdWludDhfdCBxdWFudF9iaXRzXzsKKyAgICBCaGlrc2hhIGJoaWtzaGFfOworCisgICAgY29uc3QgQml0UGFja2VkICpuZXh0X3NvdXJjZV87Cit9OworCitjbGFzcyBCaXRQYWNrZWRMb25nZXN0IDogcHVibGljIEJpdFBhY2tlZCB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgdWludDY0X3QgU2l6ZSh1aW50OF90IHF1YW50X2JpdHMsIHVpbnQ2NF90IGVudHJpZXMsIHVpbnQ2NF90IG1heF92b2NhYikgeworICAgICAgcmV0dXJuIEJhc2VTaXplKGVudHJpZXMsIG1heF92b2NhYiwgcXVhbnRfYml0cyk7CisgICAgfQorCisgICAgQml0UGFja2VkTG9uZ2VzdCgpIHt9CisKKyAgICB2b2lkIEluaXQodm9pZCAqYmFzZSwgdWludDhfdCBxdWFudF9iaXRzLCB1aW50NjRfdCBtYXhfdm9jYWIpIHsKKyAgICAgIEJhc2VJbml0KGJhc2UsIG1heF92b2NhYiwgcXVhbnRfYml0cyk7CisgICAgfQorCisgICAgdXRpbDo6Qml0QWRkcmVzcyBJbnNlcnQoV29yZEluZGV4IHdvcmQpOworCisgICAgdXRpbDo6Qml0QWRkcmVzcyBGaW5kKFdvcmRJbmRleCB3b3JkLCBjb25zdCBOb2RlUmFuZ2UgJm5vZGUpIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgdHJpZQorfSAvLyBuYW1lc3BhY2UgbmdyYW0KK30gLy8gbmFtZXNwYWNlIGxtCisKKyNlbmRpZiAvLyBMTV9UUklFX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS90cmllX3NvcnQuY2MgYi9zcmMva2VubG0vbG0vdHJpZV9zb3J0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTJmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vdHJpZV9zb3J0LmNjCkBAIC0wLDAgKzEsMzA0IEBACisjaW5jbHVkZSAibG0vdHJpZV9zb3J0LmhoIgorCisjaW5jbHVkZSAibG0vY29uZmlnLmhoIgorI2luY2x1ZGUgImxtL2xtX2V4Y2VwdGlvbi5oaCIKKyNpbmNsdWRlICJsbS9yZWFkX2FycGEuaGgiCisjaW5jbHVkZSAibG0vdm9jYWIuaGgiCisjaW5jbHVkZSAibG0vd2VpZ2h0cy5oaCIKKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZV9waWVjZS5oaCIKKyNpbmNsdWRlICJ1dGlsL21tYXAuaGgiCisjaW5jbHVkZSAidXRpbC9wcm94eV9pdGVyYXRvci5oaCIKKyNpbmNsdWRlICJ1dGlsL3NpemVkX2l0ZXJhdG9yLmhoIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBuZ3JhbSB7CituYW1lc3BhY2UgdHJpZSB7CituYW1lc3BhY2UgeworCit0eXBlZGVmIHV0aWw6OlNpemVkSXRlcmF0b3IgTkdyYW1JdGVyOworCisvLyBQcm94eSBmb3IgYW4gZW50cnkgZXhjZXB0IHRoZXJlIGlzIHNvbWUgZXh0cmEgY3J1ZnQgYmV0d2VlbiB0aGUgZW50cmllcy4gIFRoaXMgaXMgdXNlZCB0byBzb3J0IChuLTEpLWdyYW1zIHVzaW5nIHRoZSBzYW1lIG1lbW9yeSBhcyB0aGUgc29ydGVkIG4tZ3JhbXMuCitjbGFzcyBQYXJ0aWFsVmlld1Byb3h5IHsKKyAgcHVibGljOgorICAgIFBhcnRpYWxWaWV3UHJveHkoKSA6IGF0dGVudGlvbl9zaXplXygwKSwgaW5uZXJfKCkge30KKworICAgIFBhcnRpYWxWaWV3UHJveHkodm9pZCAqcHRyLCBzdGQ6OnNpemVfdCBibG9ja19zaXplLCBzdGQ6OnNpemVfdCBhdHRlbnRpb25fc2l6ZSkgOiBhdHRlbnRpb25fc2l6ZV8oYXR0ZW50aW9uX3NpemUpLCBpbm5lcl8ocHRyLCBibG9ja19zaXplKSB7fQorCisgICAgb3BlcmF0b3Igc3RkOjpzdHJpbmcoKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oaW5uZXJfLkRhdGEoKSksIGF0dGVudGlvbl9zaXplXyk7CisgICAgfQorCisgICAgUGFydGlhbFZpZXdQcm94eSAmb3BlcmF0b3I9KGNvbnN0IFBhcnRpYWxWaWV3UHJveHkgJmZyb20pIHsKKyAgICAgIG1lbWNweShpbm5lcl8uRGF0YSgpLCBmcm9tLmlubmVyXy5EYXRhKCksIGF0dGVudGlvbl9zaXplXyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGFydGlhbFZpZXdQcm94eSAmb3BlcmF0b3I9KGNvbnN0IHN0ZDo6c3RyaW5nICZmcm9tKSB7CisgICAgICBtZW1jcHkoaW5uZXJfLkRhdGEoKSwgZnJvbS5kYXRhKCksIGF0dGVudGlvbl9zaXplXyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCAqRGF0YSgpIGNvbnN0IHsgcmV0dXJuIGlubmVyXy5EYXRhKCk7IH0KKyAgICB2b2lkICpEYXRhKCkgeyByZXR1cm4gaW5uZXJfLkRhdGEoKTsgfQorCisgICAgZnJpZW5kIHZvaWQgc3dhcChQYXJ0aWFsVmlld1Byb3h5IGZpcnN0LCBQYXJ0aWFsVmlld1Byb3h5IHNlY29uZCkgeworICAgICAgc3RkOjpzd2FwX3JhbmdlcyhyZWludGVycHJldF9jYXN0PGNoYXIqPihmaXJzdC5EYXRhKCkpLCByZWludGVycHJldF9jYXN0PGNoYXIqPihmaXJzdC5EYXRhKCkpICsgZmlyc3QuYXR0ZW50aW9uX3NpemVfLCByZWludGVycHJldF9jYXN0PGNoYXIqPihzZWNvbmQuRGF0YSgpKSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIHV0aWw6OlByb3h5SXRlcmF0b3I8UGFydGlhbFZpZXdQcm94eT47CisKKyAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nIHZhbHVlX3R5cGU7CisKKyAgICBjb25zdCBzdGQ6OnNpemVfdCBhdHRlbnRpb25fc2l6ZV87CisKKyAgICB0eXBlZGVmIHV0aWw6OlNpemVkSW5uZXJJdGVyYXRvciBJbm5lckl0ZXJhdG9yOworICAgIElubmVySXRlcmF0b3IgJklubmVyKCkgeyByZXR1cm4gaW5uZXJfOyB9CisgICAgY29uc3QgSW5uZXJJdGVyYXRvciAmSW5uZXIoKSBjb25zdCB7IHJldHVybiBpbm5lcl87IH0KKyAgICBJbm5lckl0ZXJhdG9yIGlubmVyXzsKK307CisKK3R5cGVkZWYgdXRpbDo6UHJveHlJdGVyYXRvcjxQYXJ0aWFsVmlld1Byb3h5PiBQYXJ0aWFsSXRlcjsKKworRklMRSAqRGlza0ZsdXNoKGNvbnN0IHZvaWQgKm1lbV9iZWdpbiwgY29uc3Qgdm9pZCAqbWVtX2VuZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnRlbXBfcHJlZml4KSB7CisgIHV0aWw6OnNjb3BlZF9mZCBmaWxlKHV0aWw6Ok1ha2VUZW1wKHRlbXBfcHJlZml4KSk7CisgIHV0aWw6OldyaXRlT3JUaHJvdyhmaWxlLmdldCgpLCBtZW1fYmVnaW4sICh1aW50OF90KiltZW1fZW5kIC0gKHVpbnQ4X3QqKW1lbV9iZWdpbik7CisgIHJldHVybiB1dGlsOjpGRE9wZW5PclRocm93KGZpbGUpOworfQorCitGSUxFICpXcml0ZUNvbnRleHRGaWxlKHVpbnQ4X3QgKmJlZ2luLCB1aW50OF90ICplbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZW1wX3ByZWZpeCwgc3RkOjpzaXplX3QgZW50cnlfc2l6ZSwgdW5zaWduZWQgY2hhciBvcmRlcikgeworICBjb25zdCBzaXplX3QgY29udGV4dF9zaXplID0gc2l6ZW9mKFdvcmRJbmRleCkgKiAob3JkZXIgLSAxKTsKKyAgLy8gU29ydCBqdXN0IHRoZSBjb250ZXh0cyB1c2luZyB0aGUgc2FtZSBtZW1vcnkuCisgIFBhcnRpYWxJdGVyIGNvbnRleHRfYmVnaW4oUGFydGlhbFZpZXdQcm94eShiZWdpbiArIHNpemVvZihXb3JkSW5kZXgpLCBlbnRyeV9zaXplLCBjb250ZXh0X3NpemUpKTsKKyAgUGFydGlhbEl0ZXIgY29udGV4dF9lbmQoUGFydGlhbFZpZXdQcm94eShlbmQgKyBzaXplb2YoV29yZEluZGV4KSwgZW50cnlfc2l6ZSwgY29udGV4dF9zaXplKSk7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisgIHN0ZDo6c3RhYmxlX3NvcnQKKyNlbHNlCisgIHN0ZDo6c29ydAorI2VuZGlmCisgICAgKGNvbnRleHRfYmVnaW4sIGNvbnRleHRfZW5kLCB1dGlsOjpTaXplZENvbXBhcmU8RW50cnlDb21wYXJlLCBQYXJ0aWFsVmlld1Byb3h5PihFbnRyeUNvbXBhcmUob3JkZXIgLSAxKSkpOworCisgIHV0aWw6OnNjb3BlZF9GSUxFIG91dCh1dGlsOjpGTWFrZVRlbXAodGVtcF9wcmVmaXgpKTsKKworICAvLyBXcml0ZSBvdXQgdG8gZmlsZSBhbmQgdW5pcXVlaWZ5IGF0IHRoZSBzYW1lIHRpbWUuICBDb3VsZCBoYXZlIHVzZWQgdW5pcXVlX2NvcHkgaWYgdGhlcmUgd2FzIGFuIGFwcHJvcHJpYXRlIE91dHB1dEl0ZXJhdG9yLgorICBpZiAoY29udGV4dF9iZWdpbiA9PSBjb250ZXh0X2VuZCkgcmV0dXJuIG91dC5yZWxlYXNlKCk7CisgIFBhcnRpYWxJdGVyIGkoY29udGV4dF9iZWdpbik7CisgIHV0aWw6OldyaXRlT3JUaHJvdyhvdXQuZ2V0KCksIGktPkRhdGEoKSwgY29udGV4dF9zaXplKTsKKyAgY29uc3Qgdm9pZCAqcHJldmlvdXMgPSBpLT5EYXRhKCk7CisgICsraTsKKyAgZm9yICg7IGkgIT0gY29udGV4dF9lbmQ7ICsraSkgeworICAgIGlmIChtZW1jbXAocHJldmlvdXMsIGktPkRhdGEoKSwgY29udGV4dF9zaXplKSkgeworICAgICAgdXRpbDo6V3JpdGVPclRocm93KG91dC5nZXQoKSwgaS0+RGF0YSgpLCBjb250ZXh0X3NpemUpOworICAgICAgcHJldmlvdXMgPSBpLT5EYXRhKCk7CisgICAgfQorICB9CisgIHJldHVybiBvdXQucmVsZWFzZSgpOworfQorCitzdHJ1Y3QgVGhyb3dDb21iaW5lIHsKKyAgdm9pZCBvcGVyYXRvcigpKHN0ZDo6c2l6ZV90IGVudHJ5X3NpemUsIHVuc2lnbmVkIGNoYXIgb3JkZXIsIGNvbnN0IHZvaWQgKmZpcnN0LCBjb25zdCB2b2lkICpzZWNvbmQsIEZJTEUgKiAvKm91dCovKSBjb25zdCB7CisgICAgY29uc3QgV29yZEluZGV4ICpiYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBXb3JkSW5kZXgqPihmaXJzdCk7CisgICAgRm9ybWF0TG9hZEV4Y2VwdGlvbiBlOworICAgIGUgPDwgIkR1cGxpY2F0ZSBuLWdyYW0gZGV0ZWN0ZWQgd2l0aCB2b2NhYiBpZHMiOworICAgIGZvciAoY29uc3QgV29yZEluZGV4ICppID0gYmFzZTsgaSAhPSBiYXNlICsgb3JkZXI7ICsraSkgeworICAgICAgZSA8PCAnICcgPDwgKmk7CisgICAgfQorICAgIHRocm93IGU7CisgIH0KK307CisKKy8vIFVzZWZ1bCBmb3IgY29udGV4dCBmaWxlcyB0aGF0IGp1c3QgY29udGFpbiByZWNvcmRzIHdpdGggbm8gdmFsdWUuCitzdHJ1Y3QgRmlyc3RDb21iaW5lIHsKKyAgdm9pZCBvcGVyYXRvcigpKHN0ZDo6c2l6ZV90IGVudHJ5X3NpemUsIHVuc2lnbmVkIGNoYXIgLypvcmRlciovLCBjb25zdCB2b2lkICpmaXJzdCwgY29uc3Qgdm9pZCAqIC8qc2Vjb25kKi8sIEZJTEUgKm91dCkgY29uc3QgeworICAgIHV0aWw6OldyaXRlT3JUaHJvdyhvdXQsIGZpcnN0LCBlbnRyeV9zaXplKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIENvbWJpbmU+IEZJTEUgKk1lcmdlU29ydGVkRmlsZXMoRklMRSAqZmlyc3RfZmlsZSwgRklMRSAqc2Vjb25kX2ZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZW1wX3ByZWZpeCwgc3RkOjpzaXplX3Qgd2VpZ2h0c19zaXplLCB1bnNpZ25lZCBjaGFyIG9yZGVyLCBjb25zdCBDb21iaW5lICZjb21iaW5lKSB7CisgIHN0ZDo6c2l6ZV90IGVudHJ5X3NpemUgPSBzaXplb2YoV29yZEluZGV4KSAqIG9yZGVyICsgd2VpZ2h0c19zaXplOworICBSZWNvcmRSZWFkZXIgZmlyc3QsIHNlY29uZDsKKyAgZmlyc3QuSW5pdChmaXJzdF9maWxlLCBlbnRyeV9zaXplKTsKKyAgc2Vjb25kLkluaXQoc2Vjb25kX2ZpbGUsIGVudHJ5X3NpemUpOworICB1dGlsOjpzY29wZWRfRklMRSBvdXRfZmlsZSh1dGlsOjpGTWFrZVRlbXAodGVtcF9wcmVmaXgpKTsKKyAgRW50cnlDb21wYXJlIGxlc3Mob3JkZXIpOworICB3aGlsZSAoZmlyc3QgJiYgc2Vjb25kKSB7CisgICAgaWYgKGxlc3MoZmlyc3QuRGF0YSgpLCBzZWNvbmQuRGF0YSgpKSkgeworICAgICAgdXRpbDo6V3JpdGVPclRocm93KG91dF9maWxlLmdldCgpLCBmaXJzdC5EYXRhKCksIGVudHJ5X3NpemUpOworICAgICAgKytmaXJzdDsKKyAgICB9IGVsc2UgaWYgKGxlc3Moc2Vjb25kLkRhdGEoKSwgZmlyc3QuRGF0YSgpKSkgeworICAgICAgdXRpbDo6V3JpdGVPclRocm93KG91dF9maWxlLmdldCgpLCBzZWNvbmQuRGF0YSgpLCBlbnRyeV9zaXplKTsKKyAgICAgICsrc2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICBjb21iaW5lKGVudHJ5X3NpemUsIG9yZGVyLCBmaXJzdC5EYXRhKCksIHNlY29uZC5EYXRhKCksIG91dF9maWxlLmdldCgpKTsKKyAgICAgICsrZmlyc3Q7ICsrc2Vjb25kOworICAgIH0KKyAgfQorICBmb3IgKFJlY29yZFJlYWRlciAmcmVtYWlucyA9IChmaXJzdCA/IGZpcnN0IDogc2Vjb25kKTsgcmVtYWluczsgKytyZW1haW5zKSB7CisgICAgdXRpbDo6V3JpdGVPclRocm93KG91dF9maWxlLmdldCgpLCByZW1haW5zLkRhdGEoKSwgZW50cnlfc2l6ZSk7CisgIH0KKyAgcmV0dXJuIG91dF9maWxlLnJlbGVhc2UoKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKwordm9pZCBSZWNvcmRSZWFkZXI6OkluaXQoRklMRSAqZmlsZSwgc3RkOjpzaXplX3QgZW50cnlfc2l6ZSkgeworICBlbnRyeV9zaXplXyA9IGVudHJ5X3NpemU7CisgIGRhdGFfLnJlc2V0KG1hbGxvYyhlbnRyeV9zaXplKSk7CisgIFVUSUxfVEhST1dfSUYoIWRhdGFfLmdldCgpLCB1dGlsOjpFcnJub0V4Y2VwdGlvbiwgIkZhaWxlZCB0byBtYWxsb2MgcmVhZCBidWZmZXIiKTsKKyAgZmlsZV8gPSBmaWxlOworICBpZiAoZmlsZSkgeworICAgIHJld2luZChmaWxlKTsKKyAgICByZW1haW5zXyA9IHRydWU7CisgICAgKysqdGhpczsKKyAgfSBlbHNlIHsKKyAgICByZW1haW5zXyA9IGZhbHNlOworICB9Cit9CisKK3ZvaWQgUmVjb3JkUmVhZGVyOjpPdmVyd3JpdGUoY29uc3Qgdm9pZCAqc3RhcnQsIHN0ZDo6c2l6ZV90IGFtb3VudCkgeworICBsb25nIGludGVybmFsID0gKHVpbnQ4X3QqKXN0YXJ0IC0gKHVpbnQ4X3QqKWRhdGFfLmdldCgpOworICBVVElMX1RIUk9XX0lGKGZzZWVrKGZpbGVfLCBpbnRlcm5hbCAtIGVudHJ5X3NpemVfLCBTRUVLX0NVUiksIHV0aWw6OkVycm5vRXhjZXB0aW9uLCAiQ291bGRuJ3Qgc2VlayBiYWNrd2FyZHMgZm9yIHJldmlzaW9uIik7CisgIHV0aWw6OldyaXRlT3JUaHJvdyhmaWxlXywgc3RhcnQsIGFtb3VudCk7CisgIGxvbmcgZm9yd2FyZCA9IGVudHJ5X3NpemVfIC0gaW50ZXJuYWwgLSBhbW91bnQ7CisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpCisgIGlmIChmb3J3YXJkKQorI2VuZGlmCisgICAgVVRJTF9USFJPV19JRihmc2VlayhmaWxlXywgZm9yd2FyZCwgU0VFS19DVVIpLCB1dGlsOjpFcnJub0V4Y2VwdGlvbiwgIkNvdWxkbid0IHNlZWsgZm9yd2FyZHMgcGFzdCByZXZpc2lvbiIpOworfQorCit2b2lkIFJlY29yZFJlYWRlcjo6UmV3aW5kKCkgeworICBpZiAoZmlsZV8pIHsKKyAgICByZXdpbmQoZmlsZV8pOworICAgIHJlbWFpbnNfID0gdHJ1ZTsKKyAgICArKyp0aGlzOworICB9IGVsc2UgeworICAgIHJlbWFpbnNfID0gZmFsc2U7CisgIH0KK30KKworU29ydGVkRmlsZXM6OlNvcnRlZEZpbGVzKGNvbnN0IENvbmZpZyAmY29uZmlnLCB1dGlsOjpGaWxlUGllY2UgJmYsIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmY291bnRzLCBzaXplX3QgYnVmZmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZV9wcmVmaXgsIFNvcnRlZFZvY2FidWxhcnkgJnZvY2FiKSB7CisgIFBvc2l0aXZlUHJvYldhcm4gd2Fybihjb25maWcucG9zaXRpdmVfbG9nX3Byb2JhYmlsaXR5KTsKKyAgdW5pZ3JhbV8ucmVzZXQodXRpbDo6TWFrZVRlbXAoZmlsZV9wcmVmaXgpKTsKKyAgeworICAgIC8vIEluIGNhc2UgPHVuaz4gYXBwZWFycy4KKyAgICBzaXplX3Qgc2l6ZV9vdXQgPSAoY291bnRzWzBdICsgMSkgKiBzaXplb2YoUHJvYkJhY2tvZmYpOworICAgIHV0aWw6OnNjb3BlZF9tbWFwIHVuaWdyYW1fbW1hcCh1dGlsOjpNYXBaZXJvZWRXcml0ZSh1bmlncmFtXy5nZXQoKSwgc2l6ZV9vdXQpLCBzaXplX291dCk7CisgICAgUmVhZDFHcmFtcyhmLCBjb3VudHNbMF0sIHZvY2FiLCByZWludGVycHJldF9jYXN0PFByb2JCYWNrb2ZmKj4odW5pZ3JhbV9tbWFwLmdldCgpKSwgd2Fybik7CisgICAgQ2hlY2tTcGVjaWFscyhjb25maWcsIHZvY2FiKTsKKyAgICBpZiAoIXZvY2FiLlNhd1VuaygpKSArK2NvdW50c1swXTsKKyAgfQorCisgIC8vIE9ubHkgdXNlIGFzIG11Y2ggYnVmZmVyIGFzIHdlIG5lZWQuCisgIHNpemVfdCBidWZmZXJfdXNlID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpbnQgb3JkZXIgPSAyOyBvcmRlciA8IGNvdW50cy5zaXplKCk7ICsrb3JkZXIpIHsKKyAgICBidWZmZXJfdXNlID0gc3RkOjptYXg8c2l6ZV90PihidWZmZXJfdXNlLCBzdGF0aWNfY2FzdDxzaXplX3Q+KChzaXplb2YoV29yZEluZGV4KSAqIG9yZGVyICsgMiAqIHNpemVvZihmbG9hdCkpICogY291bnRzW29yZGVyIC0gMV0pKTsKKyAgfQorICBidWZmZXJfdXNlID0gc3RkOjptYXg8c2l6ZV90PihidWZmZXJfdXNlLCBzdGF0aWNfY2FzdDxzaXplX3Q+KChzaXplb2YoV29yZEluZGV4KSAqIGNvdW50cy5zaXplKCkgKyBzaXplb2YoZmxvYXQpKSAqIGNvdW50cy5iYWNrKCkpKTsKKyAgYnVmZmVyID0gc3RkOjptaW48c2l6ZV90PihidWZmZXIsIGJ1ZmZlcl91c2UpOworCisgIHV0aWw6OnNjb3BlZF9tYWxsb2MgbWVtOworICBtZW0ucmVzZXQobWFsbG9jKGJ1ZmZlcikpOworICBpZiAoIW1lbS5nZXQoKSkgVVRJTF9USFJPVyh1dGlsOjpFcnJub0V4Y2VwdGlvbiwgIm1hbGxvYyBmYWlsZWQgZm9yIHNvcnQgYnVmZmVyIHNpemUgIiA8PCBidWZmZXIpOworCisgIGZvciAodW5zaWduZWQgY2hhciBvcmRlciA9IDI7IG9yZGVyIDw9IGNvdW50cy5zaXplKCk7ICsrb3JkZXIpIHsKKyAgICBDb252ZXJ0VG9Tb3J0ZWQoZiwgdm9jYWIsIGNvdW50cywgZmlsZV9wcmVmaXgsIG9yZGVyLCB3YXJuLCBtZW0uZ2V0KCksIGJ1ZmZlcik7CisgIH0KKyAgUmVhZEVuZChmKTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNzIENsb3NlciB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBDbG9zZXIoc3RkOjpkZXF1ZTxGSUxFKj4gJmZpbGVzKSA6IGZpbGVzXyhmaWxlcykge30KKworICAgIH5DbG9zZXIoKSB7CisgICAgICBmb3IgKHN0ZDo6ZGVxdWU8RklMRSo+OjppdGVyYXRvciBpID0gZmlsZXNfLmJlZ2luKCk7IGkgIT0gZmlsZXNfLmVuZCgpOyArK2kpIHsKKyAgICAgICAgdXRpbDo6c2NvcGVkX0ZJTEUgZGVsZXRlcigqaSk7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBQb3BGcm9udCgpIHsKKyAgICAgIHV0aWw6OnNjb3BlZF9GSUxFIGRlbGV0ZXIoZmlsZXNfLmZyb250KCkpOworICAgICAgZmlsZXNfLnBvcF9mcm9udCgpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBzdGQ6OmRlcXVlPEZJTEUqPiAmZmlsZXNfOworfTsKK30gLy8gbmFtZXNwYWNlCisKK3ZvaWQgU29ydGVkRmlsZXM6OkNvbnZlcnRUb1NvcnRlZCh1dGlsOjpGaWxlUGllY2UgJmYsIGNvbnN0IFNvcnRlZFZvY2FidWxhcnkgJnZvY2FiLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gJmNvdW50cywgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVfcHJlZml4LCB1bnNpZ25lZCBjaGFyIG9yZGVyLCBQb3NpdGl2ZVByb2JXYXJuICZ3YXJuLCB2b2lkICptZW0sIHN0ZDo6c2l6ZV90IG1lbV9zaXplKSB7CisgIFJlYWROR3JhbUhlYWRlcihmLCBvcmRlcik7CisgIGNvbnN0IHNpemVfdCBjb3VudCA9IGNvdW50c1tvcmRlciAtIDFdOworICAvLyBTaXplIG9mIHdlaWdodHMuICBEb2VzIGl0IGluY2x1ZGUgYmFja29mZj8KKyAgY29uc3Qgc2l6ZV90IHdvcmRzX3NpemUgPSBzaXplb2YoV29yZEluZGV4KSAqIG9yZGVyOworICBjb25zdCBzaXplX3Qgd2VpZ2h0c19zaXplID0gc2l6ZW9mKGZsb2F0KSArICgob3JkZXIgPT0gY291bnRzLnNpemUoKSkgPyAwIDogc2l6ZW9mKGZsb2F0KSk7CisgIGNvbnN0IHNpemVfdCBlbnRyeV9zaXplID0gd29yZHNfc2l6ZSArIHdlaWdodHNfc2l6ZTsKKyAgY29uc3Qgc2l6ZV90IGJhdGNoX3NpemUgPSBzdGQ6Om1pbihjb3VudCwgbWVtX3NpemUgLyBlbnRyeV9zaXplKTsKKyAgdWludDhfdCAqY29uc3QgYmVnaW4gPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtZW0pOworCisgIHN0ZDo6ZGVxdWU8RklMRSo+IGZpbGVzLCBjb250ZXh0czsKKyAgQ2xvc2VyIGZpbGVzX2Nsb3NlcihmaWxlcyksIGNvbnRleHRzX2Nsb3Nlcihjb250ZXh0cyk7CisKKyAgZm9yIChzdGQ6OnNpemVfdCBiYXRjaCA9IDAsIGRvbmUgPSAwOyBkb25lIDwgY291bnQ7ICsrYmF0Y2gpIHsKKyAgICB1aW50OF90ICpvdXQgPSBiZWdpbjsKKyAgICB1aW50OF90ICpvdXRfZW5kID0gb3V0ICsgc3RkOjptaW4oY291bnQgLSBkb25lLCBiYXRjaF9zaXplKSAqIGVudHJ5X3NpemU7CisgICAgaWYgKG9yZGVyID09IGNvdW50cy5zaXplKCkpIHsKKyAgICAgIGZvciAoOyBvdXQgIT0gb3V0X2VuZDsgb3V0ICs9IGVudHJ5X3NpemUpIHsKKyAgICAgICAgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPFdvcmRJbmRleCo+IGl0KHJlaW50ZXJwcmV0X2Nhc3Q8V29yZEluZGV4Kj4ob3V0KSArIG9yZGVyKTsKKyAgICAgICAgUmVhZE5HcmFtKGYsIG9yZGVyLCB2b2NhYiwgaXQsICpyZWludGVycHJldF9jYXN0PFByb2IqPihvdXQgKyB3b3Jkc19zaXplKSwgd2Fybik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoOyBvdXQgIT0gb3V0X2VuZDsgb3V0ICs9IGVudHJ5X3NpemUpIHsKKyAgICAgICAgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPFdvcmRJbmRleCo+IGl0KHJlaW50ZXJwcmV0X2Nhc3Q8V29yZEluZGV4Kj4ob3V0KSArIG9yZGVyKTsKKyAgICAgICAgUmVhZE5HcmFtKGYsIG9yZGVyLCB2b2NhYiwgaXQsICpyZWludGVycHJldF9jYXN0PFByb2JCYWNrb2ZmKj4ob3V0ICsgd29yZHNfc2l6ZSksIHdhcm4pOworICAgICAgfQorICAgIH0KKyAgICAvLyBTb3J0IGZ1bGwgcmVjb3JkcyBieSBmdWxsIG4tZ3JhbS4KKyAgICB1dGlsOjpTaXplZFByb3h5IHByb3h5X2JlZ2luKGJlZ2luLCBlbnRyeV9zaXplKSwgcHJveHlfZW5kKG91dF9lbmQsIGVudHJ5X3NpemUpOworICAgIC8vIHBhcmFsbGVsX3NvcnQgdXNlcyB0b28gbXVjaCBSQU0uICBUT0RPOiBmaWd1cmUgb3V0IHdoeSB3aW5kb3dzIHNvcnQgZG9lc24ndCBsaWtlIG15IHByb3hpZXMuCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQorICAgIHN0ZDo6c3RhYmxlX3NvcnQKKyNlbHNlCisgICAgc3RkOjpzb3J0CisjZW5kaWYKKyAgICAgICAgKE5HcmFtSXRlcihwcm94eV9iZWdpbiksIE5HcmFtSXRlcihwcm94eV9lbmQpLCB1dGlsOjpTaXplZENvbXBhcmU8RW50cnlDb21wYXJlPihFbnRyeUNvbXBhcmUob3JkZXIpKSk7CisgICAgZmlsZXMucHVzaF9iYWNrKERpc2tGbHVzaChiZWdpbiwgb3V0X2VuZCwgZmlsZV9wcmVmaXgpKTsKKyAgICBjb250ZXh0cy5wdXNoX2JhY2soV3JpdGVDb250ZXh0RmlsZShiZWdpbiwgb3V0X2VuZCwgZmlsZV9wcmVmaXgsIGVudHJ5X3NpemUsIG9yZGVyKSk7CisKKyAgICBkb25lICs9IChvdXRfZW5kIC0gYmVnaW4pIC8gZW50cnlfc2l6ZTsKKyAgfQorCisgIC8vIEFsbCBpbmRpdmlkdWFsIGZpbGVzIGNyZWF0ZWQuICBNZXJnZSB0aGVtLgorCisgIHdoaWxlIChmaWxlcy5zaXplKCkgPiAxKSB7CisgICAgZmlsZXMucHVzaF9iYWNrKE1lcmdlU29ydGVkRmlsZXMoZmlsZXNbMF0sIGZpbGVzWzFdLCBmaWxlX3ByZWZpeCwgd2VpZ2h0c19zaXplLCBvcmRlciwgVGhyb3dDb21iaW5lKCkpKTsKKyAgICBmaWxlc19jbG9zZXIuUG9wRnJvbnQoKTsKKyAgICBmaWxlc19jbG9zZXIuUG9wRnJvbnQoKTsKKyAgICBjb250ZXh0cy5wdXNoX2JhY2soTWVyZ2VTb3J0ZWRGaWxlcyhjb250ZXh0c1swXSwgY29udGV4dHNbMV0sIGZpbGVfcHJlZml4LCAwLCBvcmRlciAtIDEsIEZpcnN0Q29tYmluZSgpKSk7CisgICAgY29udGV4dHNfY2xvc2VyLlBvcEZyb250KCk7CisgICAgY29udGV4dHNfY2xvc2VyLlBvcEZyb250KCk7CisgIH0KKworICBpZiAoIWZpbGVzLmVtcHR5KCkpIHsKKyAgICAvLyBTdGVhbCBmcm9tIGNsb3NlcnMuCisgICAgZnVsbF9bb3JkZXIgLSAyXS5yZXNldChmaWxlcy5mcm9udCgpKTsKKyAgICBmaWxlcy5wb3BfZnJvbnQoKTsKKyAgICBjb250ZXh0X1tvcmRlciAtIDJdLnJlc2V0KGNvbnRleHRzLmZyb250KCkpOworICAgIGNvbnRleHRzLnBvcF9mcm9udCgpOworICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIHRyaWUKK30gLy8gbmFtZXNwYWNlIG5ncmFtCit9IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL3RyaWVfc29ydC5oaCBiL3NyYy9rZW5sbS9sbS90cmllX3NvcnQuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0ZWZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS90cmllX3NvcnQuaGgKQEAgLTAsMCArMSwxMTQgQEAKKy8vIFN0ZXAgb2YgdHJpZSBidWlsZGVyOiBjcmVhdGUgc29ydGVkIGZpbGVzLgorCisjaWZuZGVmIExNX1RSSUVfU09SVF9ICisjZGVmaW5lIExNX1RSSUVfU09SVF9ICisKKyNpbmNsdWRlICJsbS9tYXhfb3JkZXIuaGgiCisjaW5jbHVkZSAibG0vd29yZF9pbmRleC5oaCIKKworI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKKyNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB1dGlsIHsKK2NsYXNzIEZpbGVQaWVjZTsKK30gLy8gbmFtZXNwYWNlIHV0aWwKKworbmFtZXNwYWNlIGxtIHsKK2NsYXNzIFBvc2l0aXZlUHJvYldhcm47CituYW1lc3BhY2UgbmdyYW0geworY2xhc3MgU29ydGVkVm9jYWJ1bGFyeTsKK3N0cnVjdCBDb25maWc7CisKK25hbWVzcGFjZSB0cmllIHsKKworY2xhc3MgRW50cnlDb21wYXJlIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvaWQqLCBjb25zdCB2b2lkKiwgYm9vbD4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRW50cnlDb21wYXJlKHVuc2lnbmVkIGNoYXIgb3JkZXIpIDogb3JkZXJfKG9yZGVyKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHZvaWQgKmZpcnN0X3ZvaWQsIGNvbnN0IHZvaWQgKnNlY29uZF92b2lkKSBjb25zdCB7CisgICAgICBjb25zdCBXb3JkSW5kZXggKmZpcnN0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgV29yZEluZGV4Kj4oZmlyc3Rfdm9pZCk7CisgICAgICBjb25zdCBXb3JkSW5kZXggKnNlY29uZCA9IHN0YXRpY19jYXN0PGNvbnN0IFdvcmRJbmRleCo+KHNlY29uZF92b2lkKTsKKyAgICAgIGNvbnN0IFdvcmRJbmRleCAqZW5kID0gZmlyc3QgKyBvcmRlcl87CisgICAgICBmb3IgKDsgZmlyc3QgIT0gZW5kOyArK2ZpcnN0LCArK3NlY29uZCkgeworICAgICAgICBpZiAoKmZpcnN0IDwgKnNlY29uZCkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICgqZmlyc3QgPiAqc2Vjb25kKSByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBwcml2YXRlOgorICAgIHVuc2lnbmVkIGNoYXIgb3JkZXJfOworfTsKKworY2xhc3MgUmVjb3JkUmVhZGVyIHsKKyAgcHVibGljOgorICAgIFJlY29yZFJlYWRlcigpIDogcmVtYWluc18odHJ1ZSkge30KKworICAgIHZvaWQgSW5pdChGSUxFICpmaWxlLCBzdGQ6OnNpemVfdCBlbnRyeV9zaXplKTsKKworICAgIHZvaWQgKkRhdGEoKSB7IHJldHVybiBkYXRhXy5nZXQoKTsgfQorICAgIGNvbnN0IHZvaWQgKkRhdGEoKSBjb25zdCB7IHJldHVybiBkYXRhXy5nZXQoKTsgfQorCisgICAgUmVjb3JkUmVhZGVyICZvcGVyYXRvcisrKCkgeworICAgICAgc3RkOjpzaXplX3QgcmV0ID0gZnJlYWQoZGF0YV8uZ2V0KCksIGVudHJ5X3NpemVfLCAxLCBmaWxlXyk7CisgICAgICBpZiAoIXJldCkgeworICAgICAgICBVVElMX1RIUk9XX0lGKCFmZW9mKGZpbGVfKSwgdXRpbDo6RXJybm9FeGNlcHRpb24sICJFcnJvciByZWFkaW5nIHRlbXBvcmFyeSBmaWxlIik7CisgICAgICAgIHJlbWFpbnNfID0gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHJlbWFpbnNfOyB9CisKKyAgICB2b2lkIFJld2luZCgpOworCisgICAgc3RkOjpzaXplX3QgRW50cnlTaXplKCkgY29uc3QgeyByZXR1cm4gZW50cnlfc2l6ZV87IH0KKworICAgIHZvaWQgT3ZlcndyaXRlKGNvbnN0IHZvaWQgKnN0YXJ0LCBzdGQ6OnNpemVfdCBhbW91bnQpOworCisgIHByaXZhdGU6CisgICAgRklMRSAqZmlsZV87CisKKyAgICB1dGlsOjpzY29wZWRfbWFsbG9jIGRhdGFfOworCisgICAgYm9vbCByZW1haW5zXzsKKworICAgIHN0ZDo6c2l6ZV90IGVudHJ5X3NpemVfOworfTsKKworY2xhc3MgU29ydGVkRmlsZXMgeworICBwdWJsaWM6CisgICAgLy8gQnVpbGQgZnJvbSBBUlBBCisgICAgU29ydGVkRmlsZXMoY29uc3QgQ29uZmlnICZjb25maWcsIHV0aWw6OkZpbGVQaWVjZSAmZiwgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIHN0ZDo6c2l6ZV90IGJ1ZmZlciwgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVfcHJlZml4LCBTb3J0ZWRWb2NhYnVsYXJ5ICZ2b2NhYik7CisKKyAgICBpbnQgU3RlYWxVbmlncmFtKCkgeworICAgICAgcmV0dXJuIHVuaWdyYW1fLnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBGSUxFICpGdWxsKHVuc2lnbmVkIGNoYXIgb3JkZXIpIHsKKyAgICAgIHJldHVybiBmdWxsX1tvcmRlciAtIDJdLmdldCgpOworICAgIH0KKworICAgIEZJTEUgKkNvbnRleHQodW5zaWduZWQgY2hhciBvZl9vcmRlcikgeworICAgICAgcmV0dXJuIGNvbnRleHRfW29mX29yZGVyIC0gMl0uZ2V0KCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBDb252ZXJ0VG9Tb3J0ZWQodXRpbDo6RmlsZVBpZWNlICZmLCBjb25zdCBTb3J0ZWRWb2NhYnVsYXJ5ICZ2b2NhYiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZjb3VudHMsIGNvbnN0IHN0ZDo6c3RyaW5nICZwcmVmaXgsIHVuc2lnbmVkIGNoYXIgb3JkZXIsIFBvc2l0aXZlUHJvYldhcm4gJndhcm4sIHZvaWQgKm1lbSwgc3RkOjpzaXplX3QgbWVtX3NpemUpOworCisgICAgdXRpbDo6c2NvcGVkX2ZkIHVuaWdyYW1fOworCisgICAgdXRpbDo6c2NvcGVkX0ZJTEUgZnVsbF9bS0VOTE1fTUFYX09SREVSIC0gMV0sIGNvbnRleHRfW0tFTkxNX01BWF9PUkRFUiAtIDFdOworfTsKKworfSAvLyBuYW1lc3BhY2UgdHJpZQorfSAvLyBuYW1lc3BhY2UgbmdyYW0KK30gLy8gbmFtZXNwYWNlIGxtCisKKyNlbmRpZiAvLyBMTV9UUklFX1NPUlRfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL3ZhbHVlLmhoIGIvc3JjL2tlbmxtL2xtL3ZhbHVlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNDI1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vdmFsdWUuaGgKQEAgLTAsMCArMSwxNTggQEAKKyNpZm5kZWYgTE1fVkFMVUVfSAorI2RlZmluZSBMTV9WQUxVRV9ICisKKyNpbmNsdWRlICJsbS9jb25maWcuaGgiCisjaW5jbHVkZSAibG0vbW9kZWxfdHlwZS5oaCIKKyNpbmNsdWRlICJsbS92YWx1ZV9idWlsZC5oaCIKKyNpbmNsdWRlICJsbS93ZWlnaHRzLmhoIgorI2luY2x1ZGUgInV0aWwvYml0X3BhY2tpbmcuaGgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBuZ3JhbSB7CisKKy8vIFRlbXBsYXRlIHByb3h5IGZvciBwcm9iaW5nIHVuaWdyYW1zIGFuZCBtaWRkbGUuCit0ZW1wbGF0ZSA8Y2xhc3MgV2VpZ2h0cz4gY2xhc3MgR2VuZXJpY1Byb2JpbmdQcm94eSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBHZW5lcmljUHJvYmluZ1Byb3h5KGNvbnN0IFdlaWdodHMgJnRvKSA6IHRvXygmdG8pIHt9CisKKyAgICBHZW5lcmljUHJvYmluZ1Byb3h5KCkgOiB0b18oMCkge30KKworICAgIGJvb2wgRm91bmQoKSBjb25zdCB7IHJldHVybiB0b18gIT0gMDsgfQorCisgICAgZmxvYXQgUHJvYigpIGNvbnN0IHsKKyAgICAgIHV0aWw6OkZsb2F0RW5jIGVuYzsKKyAgICAgIGVuYy5mID0gdG9fLT5wcm9iOworICAgICAgZW5jLmkgfD0gdXRpbDo6a1NpZ25CaXQ7CisgICAgICByZXR1cm4gZW5jLmY7CisgICAgfQorCisgICAgZmxvYXQgQmFja29mZigpIGNvbnN0IHsgcmV0dXJuIHRvXy0+YmFja29mZjsgfQorCisgICAgYm9vbCBJbmRlcGVuZGVudExlZnQoKSBjb25zdCB7CisgICAgICB1dGlsOjpGbG9hdEVuYyBlbmM7CisgICAgICBlbmMuZiA9IHRvXy0+cHJvYjsKKyAgICAgIHJldHVybiBlbmMuaSAmIHV0aWw6OmtTaWduQml0OworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgV2VpZ2h0cyAqdG9fOworfTsKKworLy8gQmFzaWMgcHJveHkgZm9yIHRyaWUgdW5pZ3JhbXMuCit0ZW1wbGF0ZSA8Y2xhc3MgV2VpZ2h0cz4gY2xhc3MgR2VuZXJpY1RyaWVVbmlncmFtUHJveHkgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgR2VuZXJpY1RyaWVVbmlncmFtUHJveHkoY29uc3QgV2VpZ2h0cyAmdG8pIDogdG9fKCZ0bykge30KKworICAgIEdlbmVyaWNUcmllVW5pZ3JhbVByb3h5KCkgOiB0b18oMCkge30KKworICAgIGJvb2wgRm91bmQoKSBjb25zdCB7IHJldHVybiB0b18gIT0gMDsgfQorICAgIGZsb2F0IFByb2IoKSBjb25zdCB7IHJldHVybiB0b18tPnByb2I7IH0KKyAgICBmbG9hdCBCYWNrb2ZmKCkgY29uc3QgeyByZXR1cm4gdG9fLT5iYWNrb2ZmOyB9CisgICAgZmxvYXQgUmVzdCgpIGNvbnN0IHsgcmV0dXJuIFByb2IoKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBXZWlnaHRzICp0b187Cit9OworCitzdHJ1Y3QgQmFja29mZlZhbHVlIHsKKyAgdHlwZWRlZiBQcm9iQmFja29mZiBXZWlnaHRzOworICBzdGF0aWMgY29uc3QgTW9kZWxUeXBlIGtQcm9iaW5nTW9kZWxUeXBlID0gUFJPQklORzsKKworICBjbGFzcyBQcm9iaW5nUHJveHkgOiBwdWJsaWMgR2VuZXJpY1Byb2JpbmdQcm94eTxXZWlnaHRzPiB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQgUHJvYmluZ1Byb3h5KGNvbnN0IFdlaWdodHMgJnRvKSA6IEdlbmVyaWNQcm9iaW5nUHJveHk8V2VpZ2h0cz4odG8pIHt9CisgICAgICBQcm9iaW5nUHJveHkoKSB7fQorICAgICAgZmxvYXQgUmVzdCgpIGNvbnN0IHsgcmV0dXJuIFByb2IoKTsgfQorICB9OworCisgIGNsYXNzIFRyaWVVbmlncmFtUHJveHkgOiBwdWJsaWMgR2VuZXJpY1RyaWVVbmlncmFtUHJveHk8V2VpZ2h0cz4geworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0IFRyaWVVbmlncmFtUHJveHkoY29uc3QgV2VpZ2h0cyAmdG8pIDogR2VuZXJpY1RyaWVVbmlncmFtUHJveHk8V2VpZ2h0cz4odG8pIHt9CisgICAgICBUcmllVW5pZ3JhbVByb3h5KCkge30KKyAgICAgIGZsb2F0IFJlc3QoKSBjb25zdCB7IHJldHVybiBQcm9iKCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgUHJvYmluZ0VudHJ5IHsKKyAgICB0eXBlZGVmIHVpbnQ2NF90IEtleTsKKyAgICB0eXBlZGVmIFdlaWdodHMgVmFsdWU7CisgICAgdWludDY0X3Qga2V5OworICAgIFByb2JCYWNrb2ZmIHZhbHVlOworICAgIHVpbnQ2NF90IEdldEtleSgpIGNvbnN0IHsgcmV0dXJuIGtleTsgfQorICB9OworCisgIHN0cnVjdCBUcmllVW5pZ3JhbVZhbHVlIHsKKyAgICBXZWlnaHRzIHdlaWdodHM7CisgICAgdWludDY0X3QgbmV4dDsKKyAgICB1aW50NjRfdCBOZXh0KCkgY29uc3QgeyByZXR1cm4gbmV4dDsgfQorICB9OworCisgIGNvbnN0IHN0YXRpYyBib29sIGtEaWZmZXJlbnRSZXN0ID0gZmFsc2U7CisKKyAgdGVtcGxhdGUgPGNsYXNzIE1vZGVsLCBjbGFzcyBDPiB2b2lkIENhbGxiYWNrKGNvbnN0IENvbmZpZyAmLCB1bnNpZ25lZCBpbnQsIHR5cGVuYW1lIE1vZGVsOjpWb2NhYnVsYXJ5ICYsIEMgJmNhbGxiYWNrKSB7CisgICAgTm9SZXN0QnVpbGQgYnVpbGQ7CisgICAgY2FsbGJhY2soYnVpbGQpOworICB9Cit9OworCitzdHJ1Y3QgUmVzdFZhbHVlIHsKKyAgdHlwZWRlZiBSZXN0V2VpZ2h0cyBXZWlnaHRzOworICBzdGF0aWMgY29uc3QgTW9kZWxUeXBlIGtQcm9iaW5nTW9kZWxUeXBlID0gUkVTVF9QUk9CSU5HOworCisgIGNsYXNzIFByb2JpbmdQcm94eSA6IHB1YmxpYyBHZW5lcmljUHJvYmluZ1Byb3h5PFJlc3RXZWlnaHRzPiB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQgUHJvYmluZ1Byb3h5KGNvbnN0IFdlaWdodHMgJnRvKSA6IEdlbmVyaWNQcm9iaW5nUHJveHk8UmVzdFdlaWdodHM+KHRvKSB7fQorICAgICAgUHJvYmluZ1Byb3h5KCkge30KKyAgICAgIGZsb2F0IFJlc3QoKSBjb25zdCB7IHJldHVybiB0b18tPnJlc3Q7IH0KKyAgfTsKKworICBjbGFzcyBUcmllVW5pZ3JhbVByb3h5IDogcHVibGljIEdlbmVyaWNUcmllVW5pZ3JhbVByb3h5PFdlaWdodHM+IHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBUcmllVW5pZ3JhbVByb3h5KGNvbnN0IFdlaWdodHMgJnRvKSA6IEdlbmVyaWNUcmllVW5pZ3JhbVByb3h5PFdlaWdodHM+KHRvKSB7fQorICAgICAgVHJpZVVuaWdyYW1Qcm94eSgpIHt9CisgICAgICBmbG9hdCBSZXN0KCkgY29uc3QgeyByZXR1cm4gdG9fLT5yZXN0OyB9CisgIH07CisKKy8vIGdjYyA0LjEgZG9lc24ndCBwcm9wZXJseSBiYWNrIGRlcGVuZGVudCB0eXBlcyA6LSguCisjcHJhZ21hIHBhY2socHVzaCkKKyNwcmFnbWEgcGFjayg0KQorICBzdHJ1Y3QgUHJvYmluZ0VudHJ5IHsKKyAgICB0eXBlZGVmIHVpbnQ2NF90IEtleTsKKyAgICB0eXBlZGVmIFdlaWdodHMgVmFsdWU7CisgICAgS2V5IGtleTsKKyAgICBWYWx1ZSB2YWx1ZTsKKyAgICBLZXkgR2V0S2V5KCkgY29uc3QgeyByZXR1cm4ga2V5OyB9CisgIH07CisKKyAgc3RydWN0IFRyaWVVbmlncmFtVmFsdWUgeworICAgIFdlaWdodHMgd2VpZ2h0czsKKyAgICB1aW50NjRfdCBuZXh0OworICAgIHVpbnQ2NF90IE5leHQoKSBjb25zdCB7IHJldHVybiBuZXh0OyB9CisgIH07CisjcHJhZ21hIHBhY2socG9wKQorCisgIGNvbnN0IHN0YXRpYyBib29sIGtEaWZmZXJlbnRSZXN0ID0gdHJ1ZTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgTW9kZWwsIGNsYXNzIEM+IHZvaWQgQ2FsbGJhY2soY29uc3QgQ29uZmlnICZjb25maWcsIHVuc2lnbmVkIGludCBvcmRlciwgdHlwZW5hbWUgTW9kZWw6OlZvY2FidWxhcnkgJnZvY2FiLCBDICZjYWxsYmFjaykgeworICAgIHN3aXRjaCAoY29uZmlnLnJlc3RfZnVuY3Rpb24pIHsKKyAgICAgIGNhc2UgQ29uZmlnOjpSRVNUX01BWDoKKyAgICAgICAgeworICAgICAgICAgIE1heFJlc3RCdWlsZCBidWlsZDsKKyAgICAgICAgICBjYWxsYmFjayhidWlsZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENvbmZpZzo6UkVTVF9MT1dFUjoKKyAgICAgICAgeworICAgICAgICAgIExvd2VyUmVzdEJ1aWxkPE1vZGVsPiBidWlsZChjb25maWcsIG9yZGVyLCB2b2NhYik7CisgICAgICAgICAgY2FsbGJhY2soYnVpbGQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgbmdyYW0KK30gLy8gbmFtZXNwYWNlIGxtCisKKyNlbmRpZiAvLyBMTV9WQUxVRV9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vdmFsdWVfYnVpbGQuY2MgYi9zcmMva2VubG0vbG0vdmFsdWVfYnVpbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2MjNhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS92YWx1ZV9idWlsZC5jYwpAQCAtMCwwICsxLDU5IEBACisjaW5jbHVkZSAibG0vdmFsdWVfYnVpbGQuaGgiCisKKyNpbmNsdWRlICJsbS9tb2RlbC5oaCIKKyNpbmNsdWRlICJsbS9yZWFkX2FycGEuaGgiCisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgbmdyYW0geworCit0ZW1wbGF0ZSA8Y2xhc3MgTW9kZWw+IExvd2VyUmVzdEJ1aWxkPE1vZGVsPjo6TG93ZXJSZXN0QnVpbGQoY29uc3QgQ29uZmlnICZjb25maWcsIHVuc2lnbmVkIGludCBvcmRlciwgY29uc3QgdHlwZW5hbWUgTW9kZWw6OlZvY2FidWxhcnkgJnZvY2FiKSB7CisgIFVUSUxfVEhST1dfSUYoY29uZmlnLnJlc3RfbG93ZXJfZmlsZXMuc2l6ZSgpICE9IG9yZGVyIC0gMSwgQ29uZmlnRXhjZXB0aW9uLCAiVGhpcyBtb2RlbCBoYXMgb3JkZXIgIiA8PCBvcmRlciA8PCAiIHNvIHRoZXJlIHNob3VsZCBiZSAiIDw8IChvcmRlciAtIDEpIDw8ICIgbG93ZXItb3JkZXIgbW9kZWxzIGZvciByZXN0IGNvc3QgcHVycG9zZXMuIik7CisgIENvbmZpZyBmb3JfbG93ZXIgPSBjb25maWc7CisgIGZvcl9sb3dlci53cml0ZV9tbWFwID0gTlVMTDsKKyAgZm9yX2xvd2VyLnJlc3RfbG93ZXJfZmlsZXMuY2xlYXIoKTsKKworICAvLyBVbmlncmFtIG1vZGVscyBhcmVuJ3Qgc3VwcG9ydGVkLCBzbyB0aGlzIGlzIGEgY3VzdG9tIGxvYWRlci4KKyAgLy8gVE9ETzogb3B0aW1pemUgdGhlIHVuaWdyYW0gbG9hZGluZz8KKyAgeworICAgIHV0aWw6OkZpbGVQaWVjZSB1bmkoY29uZmlnLnJlc3RfbG93ZXJfZmlsZXNbMF0uY19zdHIoKSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IG51bWJlcjsKKyAgICBSZWFkQVJQQUNvdW50cyh1bmksIG51bWJlcik7CisgICAgVVRJTF9USFJPV19JRihudW1iZXIuc2l6ZSgpICE9IDEsIEZvcm1hdExvYWRFeGNlcHRpb24sICJFeHBlY3RlZCB0aGUgdW5pZ3JhbSBtb2RlbCB0byBoYXZlIG9yZGVyIDEsIG5vdCAiIDw8IG51bWJlci5zaXplKCkpOworICAgIFJlYWROR3JhbUhlYWRlcih1bmksIDEpOworICAgIHVuaWdyYW1zXy5yZXNpemUobnVtYmVyWzBdKTsKKyAgICB1bmlncmFtc19bMF0gPSBjb25maWcudW5rbm93bl9taXNzaW5nX2xvZ3Byb2I7CisgICAgUG9zaXRpdmVQcm9iV2FybiB3YXJuOworICAgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBudW1iZXJbMF07ICsraSkgeworICAgICAgV29yZEluZGV4IHc7CisgICAgICBQcm9iIGVudHJ5OworICAgICAgUmVhZE5HcmFtKHVuaSwgMSwgdm9jYWIsICZ3LCBlbnRyeSwgd2Fybik7CisgICAgICB1bmlncmFtc19bd10gPSBlbnRyeS5wcm9iOworICAgIH0KKyAgfQorCisgIHRyeSB7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDI7IGkgPCBvcmRlcjsgKytpKSB7CisgICAgICBtb2RlbHNfLnB1c2hfYmFjayhuZXcgTW9kZWwoY29uZmlnLnJlc3RfbG93ZXJfZmlsZXNbaSAtIDFdLmNfc3RyKCksIGZvcl9sb3dlcikpOworICAgICAgVVRJTF9USFJPV19JRihtb2RlbHNfLmJhY2soKS0+T3JkZXIoKSAhPSBpLCBGb3JtYXRMb2FkRXhjZXB0aW9uLCAiTG93ZXIgb3JkZXIgZmlsZSAiIDw8IGNvbmZpZy5yZXN0X2xvd2VyX2ZpbGVzW2ktMV0gPDwgIiBzaG91bGQgaGF2ZSBvcmRlciAiIDw8IGkpOworICAgIH0KKyAgfSBjYXRjaCAoLi4uKSB7CisgICAgZm9yICh0eXBlbmFtZSBzdGQ6OnZlY3Rvcjxjb25zdCBNb2RlbCo+Ojpjb25zdF9pdGVyYXRvciBpID0gbW9kZWxzXy5iZWdpbigpOyBpICE9IG1vZGVsc18uZW5kKCk7ICsraSkgeworICAgICAgZGVsZXRlICppOworICAgIH0KKyAgICBtb2RlbHNfLmNsZWFyKCk7CisgICAgdGhyb3c7CisgIH0KKworICAvLyBUT0RPOiBmb3JjZS9jaGVjayBzYW1lIHZvY2FiLgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTW9kZWw+IExvd2VyUmVzdEJ1aWxkPE1vZGVsPjo6fkxvd2VyUmVzdEJ1aWxkKCkgeworICBmb3IgKHR5cGVuYW1lIHN0ZDo6dmVjdG9yPGNvbnN0IE1vZGVsKj46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtb2RlbHNfLmJlZ2luKCk7IGkgIT0gbW9kZWxzXy5lbmQoKTsgKytpKSB7CisgICAgZGVsZXRlICppOworICB9Cit9CisKK3RlbXBsYXRlIGNsYXNzIExvd2VyUmVzdEJ1aWxkPFByb2JpbmdNb2RlbD47CisKK30gLy8gbmFtZXNwYWNlIG5ncmFtCit9IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL3ZhbHVlX2J1aWxkLmhoIGIvc3JjL2tlbmxtL2xtL3ZhbHVlX2J1aWxkLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTg5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vdmFsdWVfYnVpbGQuaGgKQEAgLTAsMCArMSw5NyBAQAorI2lmbmRlZiBMTV9WQUxVRV9CVUlMRF9ICisjZGVmaW5lIExNX1ZBTFVFX0JVSUxEX0gKKworI2luY2x1ZGUgImxtL3dlaWdodHMuaGgiCisjaW5jbHVkZSAibG0vd29yZF9pbmRleC5oaCIKKyNpbmNsdWRlICJ1dGlsL2JpdF9wYWNraW5nLmhoIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbG0geworbmFtZXNwYWNlIG5ncmFtIHsKKworc3RydWN0IENvbmZpZzsKK3N0cnVjdCBCYWNrb2ZmVmFsdWU7CitzdHJ1Y3QgUmVzdFZhbHVlOworCitjbGFzcyBOb1Jlc3RCdWlsZCB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIEJhY2tvZmZWYWx1ZSBWYWx1ZTsKKworICAgIE5vUmVzdEJ1aWxkKCkge30KKworICAgIHZvaWQgU2V0UmVzdChjb25zdCBXb3JkSW5kZXggKiwgdW5zaWduZWQgaW50LCBjb25zdCBQcm9iICYvKnByb2IqLykgY29uc3Qge30KKyAgICB2b2lkIFNldFJlc3QoY29uc3QgV29yZEluZGV4ICosIHVuc2lnbmVkIGludCwgY29uc3QgUHJvYkJhY2tvZmYgJikgY29uc3Qge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBTZWNvbmQ+IGJvb2wgTWFya0V4dGVuZHMoUHJvYkJhY2tvZmYgJndlaWdodHMsIGNvbnN0IFNlY29uZCAmKSBjb25zdCB7CisgICAgICB1dGlsOjpVbnNldFNpZ24od2VpZ2h0cy5wcm9iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBQcm9iaW5nIGRvZXNuJ3QgbmVlZCB0byBnbyBiYWNrIHRvIHVuaWdyYW0uCisgICAgY29uc3Qgc3RhdGljIGJvb2wga01hcmtFdmVuTG93ZXIgPSBmYWxzZTsKK307CisKK2NsYXNzIE1heFJlc3RCdWlsZCB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFJlc3RWYWx1ZSBWYWx1ZTsKKworICAgIE1heFJlc3RCdWlsZCgpIHt9CisKKyAgICB2b2lkIFNldFJlc3QoY29uc3QgV29yZEluZGV4ICosIHVuc2lnbmVkIGludCwgY29uc3QgUHJvYiAmLypwcm9iKi8pIGNvbnN0IHt9CisgICAgdm9pZCBTZXRSZXN0KGNvbnN0IFdvcmRJbmRleCAqLCB1bnNpZ25lZCBpbnQsIFJlc3RXZWlnaHRzICZ3ZWlnaHRzKSBjb25zdCB7CisgICAgICB3ZWlnaHRzLnJlc3QgPSB3ZWlnaHRzLnByb2I7CisgICAgICB1dGlsOjpTZXRTaWduKHdlaWdodHMucmVzdCk7CisgICAgfQorCisgICAgYm9vbCBNYXJrRXh0ZW5kcyhSZXN0V2VpZ2h0cyAmd2VpZ2h0cywgY29uc3QgUmVzdFdlaWdodHMgJnRvKSBjb25zdCB7CisgICAgICB1dGlsOjpVbnNldFNpZ24od2VpZ2h0cy5wcm9iKTsKKyAgICAgIGlmICh3ZWlnaHRzLnJlc3QgPj0gdG8ucmVzdCkgcmV0dXJuIGZhbHNlOworICAgICAgd2VpZ2h0cy5yZXN0ID0gdG8ucmVzdDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBib29sIE1hcmtFeHRlbmRzKFJlc3RXZWlnaHRzICZ3ZWlnaHRzLCBjb25zdCBQcm9iICZ0bykgY29uc3QgeworICAgICAgdXRpbDo6VW5zZXRTaWduKHdlaWdodHMucHJvYik7CisgICAgICBpZiAod2VpZ2h0cy5yZXN0ID49IHRvLnByb2IpIHJldHVybiBmYWxzZTsKKyAgICAgIHdlaWdodHMucmVzdCA9IHRvLnByb2I7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBQcm9iaW5nIGRvZXMgbmVlZCB0byBnbyBiYWNrIHRvIHVuaWdyYW0uCisgICAgY29uc3Qgc3RhdGljIGJvb2wga01hcmtFdmVuTG93ZXIgPSB0cnVlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIE1vZGVsPiBjbGFzcyBMb3dlclJlc3RCdWlsZCB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFJlc3RWYWx1ZSBWYWx1ZTsKKworICAgIExvd2VyUmVzdEJ1aWxkKGNvbnN0IENvbmZpZyAmY29uZmlnLCB1bnNpZ25lZCBpbnQgb3JkZXIsIGNvbnN0IHR5cGVuYW1lIE1vZGVsOjpWb2NhYnVsYXJ5ICZ2b2NhYik7CisKKyAgICB+TG93ZXJSZXN0QnVpbGQoKTsKKworICAgIHZvaWQgU2V0UmVzdChjb25zdCBXb3JkSW5kZXggKiwgdW5zaWduZWQgaW50LCBjb25zdCBQcm9iICYvKnByb2IqLykgY29uc3Qge30KKyAgICB2b2lkIFNldFJlc3QoY29uc3QgV29yZEluZGV4ICp2b2NhYl9pZHMsIHVuc2lnbmVkIGludCBuLCBSZXN0V2VpZ2h0cyAmd2VpZ2h0cykgY29uc3QgeworICAgICAgdHlwZW5hbWUgTW9kZWw6OlN0YXRlIGlnbm9yZWQ7CisgICAgICBpZiAobiA9PSAxKSB7CisgICAgICAgIHdlaWdodHMucmVzdCA9IHVuaWdyYW1zX1sqdm9jYWJfaWRzXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHdlaWdodHMucmVzdCA9IG1vZGVsc19bbi0yXS0+RnVsbFNjb3JlRm9yZ290U3RhdGUodm9jYWJfaWRzICsgMSwgdm9jYWJfaWRzICsgbiwgKnZvY2FiX2lkcywgaWdub3JlZCkucHJvYjsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgU2Vjb25kPiBib29sIE1hcmtFeHRlbmRzKFJlc3RXZWlnaHRzICZ3ZWlnaHRzLCBjb25zdCBTZWNvbmQgJikgY29uc3QgeworICAgICAgdXRpbDo6VW5zZXRTaWduKHdlaWdodHMucHJvYik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3Qgc3RhdGljIGJvb2wga01hcmtFdmVuTG93ZXIgPSBmYWxzZTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB1bmlncmFtc187CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBNb2RlbCo+IG1vZGVsc187Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZ3JhbQorfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX1ZBTFVFX0JVSUxEX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS9sbS92aXJ0dWFsX2ludGVyZmFjZS5jYyBiL3NyYy9rZW5sbS9sbS92aXJ0dWFsX2ludGVyZmFjZS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL2xtL3ZpcnR1YWxfaW50ZXJmYWNlLmNjCnJlbmFtZSB0byBzcmMva2VubG0vbG0vdmlydHVhbF9pbnRlcmZhY2UuY2MKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS92aXJ0dWFsX2ludGVyZmFjZS5oaCBiL3NyYy9rZW5sbS9sbS92aXJ0dWFsX2ludGVyZmFjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQ5MWZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL3ZpcnR1YWxfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMTYwIEBACisjaWZuZGVmIExNX1ZJUlRVQUxfSU5URVJGQUNFX0gKKyNkZWZpbmUgTE1fVklSVFVBTF9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSAibG0vcmV0dXJuLmhoIgorI2luY2x1ZGUgImxtL3dvcmRfaW5kZXguaGgiCisjaW5jbHVkZSAidXRpbC9zdHJpbmdfcGllY2UuaGgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBiYXNlIHsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFY+IGNsYXNzIE1vZGVsRmFjYWRlOworCisvKiBWb2NhYnVsYXJ5IGludGVyZmFjZS4gIENhbGwgSW5kZXgoc3RyaW5nKSBhbmQgZ2V0IGEgd29yZCBpbmRleCBmb3IgdXNlIGluCisgKiBjYWxsaW5nIE1vZGVsLiAgSXQgcHJvdmlkZXMgZmFzdGVyIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgPHM+LCA8L3M+LCBhbmQKKyAqIDx1bms+IGFsdGhvdWdoIHlvdSBjYW4gYWxzbyBmaW5kIHRoZXNlIHVzaW5nIEluZGV4LgorICoKKyAqIFNvbWUgbW9kZWxzIGRvIG5vdCBsb2FkIHRoZSBtYXBwaW5nIGZyb20gaW5kZXggdG8gc3RyaW5nLiAgSWYgeW91IG5lZWQgdGhpcywKKyAqIGNoZWNrIGlmIHRoZSBtb2RlbCBWb2NhYnVsYXJ5IGNsYXNzIGltcGxlbWVudHMgc3VjaCBhIGZ1bmN0aW9uIGFuZCBhY2Nlc3MgaXQKKyAqIGRpcmVjdGx5LgorICoKKyAqIFRoZSBWb2NhYnVsYXJ5IG9iamVjdCBpcyBhbHdheXMgb3duZWQgYnkgdGhlIE1vZGVsIGFuZCBjYW4gYmUgcmV0cmlldmVkIGZyb20KKyAqIHRoZSBNb2RlbCB1c2luZyBCYXNlVm9jYWJ1bGFyeSgpIGZvciB0aGlzIGFic3RyYWN0IGludGVyZmFjZSBvcgorICogR2V0Vm9jYWJ1bGFyeSgpIGZvciB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIChpbiB3aGljaCBjYXNlIHlvdSdsbCBuZWVkIHRoZQorICogYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNb2RlbCB0b28pLgorICovCitjbGFzcyBWb2NhYnVsYXJ5IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgflZvY2FidWxhcnkoKTsKKworICAgIFdvcmRJbmRleCBCZWdpblNlbnRlbmNlKCkgY29uc3QgeyByZXR1cm4gYmVnaW5fc2VudGVuY2VfOyB9CisgICAgV29yZEluZGV4IEVuZFNlbnRlbmNlKCkgY29uc3QgeyByZXR1cm4gZW5kX3NlbnRlbmNlXzsgfQorICAgIFdvcmRJbmRleCBOb3RGb3VuZCgpIGNvbnN0IHsgcmV0dXJuIG5vdF9mb3VuZF87IH0KKworICAgIC8qIE1vc3QgaW1wbGVtZW50YXRpb25zIGFsbG93IFN0cmluZ1BpZWNlIGxvb2t1cHMgYW5kIG5lZWQgb25seSBvdmVycmlkZQorICAgICAqIEluZGV4KFN0cmluZ1BpZWNlKS4gIFNSSSByZXF1aXJlcyBudWxsIHRlcm1pbmF0aW9uIGFuZCBvdmVycmlkZXMgYWxsCisgICAgICogdGhyZWUgbWV0aG9kcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIFdvcmRJbmRleCBJbmRleChjb25zdCBTdHJpbmdQaWVjZSAmc3RyKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBXb3JkSW5kZXggSW5kZXgoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgY29uc3QgeworICAgICAgcmV0dXJuIEluZGV4KFN0cmluZ1BpZWNlKHN0cikpOworICAgIH0KKyAgICB2aXJ0dWFsIFdvcmRJbmRleCBJbmRleChjb25zdCBjaGFyICpzdHIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBJbmRleChTdHJpbmdQaWVjZShzdHIpKTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIENhbGwgU2V0U3BlY2lhbCBhZnRlcndhcmQuCisgICAgVm9jYWJ1bGFyeSgpIHt9CisKKyAgICBWb2NhYnVsYXJ5KFdvcmRJbmRleCBiZWdpbl9zZW50ZW5jZSwgV29yZEluZGV4IGVuZF9zZW50ZW5jZSwgV29yZEluZGV4IG5vdF9mb3VuZCkgeworICAgICAgU2V0U3BlY2lhbChiZWdpbl9zZW50ZW5jZSwgZW5kX3NlbnRlbmNlLCBub3RfZm91bmQpOworICAgIH0KKworICAgIHZvaWQgU2V0U3BlY2lhbChXb3JkSW5kZXggYmVnaW5fc2VudGVuY2UsIFdvcmRJbmRleCBlbmRfc2VudGVuY2UsIFdvcmRJbmRleCBub3RfZm91bmQpOworCisgICAgV29yZEluZGV4IGJlZ2luX3NlbnRlbmNlXywgZW5kX3NlbnRlbmNlXywgbm90X2ZvdW5kXzsKKworICBwcml2YXRlOgorICAgIC8vIERpc2FibGUgY29weSBjb25zdHJ1Y3RvcnMuICBUaGV5J3JlIHByaXZhdGUgYW5kIHVuZGVmaW5lZC4KKyAgICAvLyBFcnNhdHogYm9vc3Q6Om5vbmNvcHlhYmxlLgorICAgIFZvY2FidWxhcnkoY29uc3QgVm9jYWJ1bGFyeSAmKTsKKyAgICBWb2NhYnVsYXJ5ICZvcGVyYXRvcj0oY29uc3QgVm9jYWJ1bGFyeSAmKTsKK307CisKKy8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBhY2Nlc3MgYSBNb2RlbC4KKyAqCisgKgorICogT1BUSU9OIDE6IEFjY2VzcyB0aGUgTW9kZWwgZGlyZWN0bHkgKGUuZy4gbG06Om5ncmFtOjpNb2RlbCBpbiBtb2RlbC5oaCkuCisgKgorICogRXZlcnkgTW9kZWwgaW1wbGVtZW50cyB0aGUgc2NvcmluZyBmdW5jdGlvbjoKKyAqIGZsb2F0IFNjb3JlKAorICogICBjb25zdCBNb2RlbDo6U3RhdGUgJmluX3N0YXRlLAorICogICBjb25zdCBXb3JkSW5kZXggbmV3X3dvcmQsCisgKiAgIE1vZGVsOjpTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdDsKKyAqCisgKiBJdCBjYW4gYWxzbyByZXR1cm4gdGhlIGxlbmd0aCBvZiBuLWdyYW0gbWF0Y2hlZCBieSB0aGUgbW9kZWw6CisgKiBGdWxsU2NvcmVSZXR1cm4gRnVsbFNjb3JlKAorICogICBjb25zdCBNb2RlbDo6U3RhdGUgJmluX3N0YXRlLAorICogICBjb25zdCBXb3JkSW5kZXggbmV3X3dvcmQsCisgKiAgIE1vZGVsOjpTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdDsKKyAqCisgKgorICogVGhlcmUgYXJlIGFsc28gYWNjZXNzb3IgZnVuY3Rpb25zOgorICogY29uc3QgU3RhdGUgJkJlZ2luU2VudGVuY2VTdGF0ZSgpIGNvbnN0OworICogY29uc3QgU3RhdGUgJk51bGxDb250ZXh0U3RhdGUoKSBjb25zdDsKKyAqIGNvbnN0IFZvY2FidWxhcnkgJkdldFZvY2FidWxhcnkoKSBjb25zdDsKKyAqIHVuc2lnbmVkIGludCBPcmRlcigpIGNvbnN0OworICoKKyAqIE5COiBJbiBjYXNlIHlvdSdyZSB3b25kZXJpbmcgd2h5IHRoZSBtb2RlbCBpbXBsZW1lbnRhdGlvbiBsb29rcyBsaWtlIGl0J3MKKyAqIG1pc3NpbmcgdGhlc2UgbWV0aG9kcywgc2VlIGZhY2FkZS5oaC4KKyAqCisgKiBUaGlzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byB1c2UgYSBtb2RlbCBhbmQgcHJlc2VudHMgYSBub3JtYWwgU3RhdGUgY2xhc3MgdG8KKyAqIGJlIGluY2x1ZGVkIGluIGEgaHlwb3RoZXNpcyBzdGF0ZSBzdHJ1Y3R1cmUuCisgKgorICoKKyAqIE9QVElPTiAyOiBVc2UgdGhlIHZpcnR1YWwgaW50ZXJmYWNlIGJlbG93LgorICoKKyAqIFRoZSB2aXJ0dWFsIGludGVyZmFjZSBhbGxvdyB5b3UgdG8gZGVjaWRlIHdoaWNoIE1vZGVsIHRvIHVzZSBhdCBydW50aW1lCisgKiB3aXRob3V0IHRlbXBsYXRpemluZyBldmVyeXRoaW5nIG9uIHRoZSBNb2RlbCB0eXBlLiAgSG93ZXZlciwgZWFjaCBNb2RlbCBoYXMKKyAqIGl0cyBvd24gU3RhdGUgY2xhc3MsIHNvIGEgc2luZ2xlIFN0YXRlIGNhbm5vdCBiZSBlZmZpY2llbnRseSBwcm92aWRlZCAoaXQKKyAqIHdvdWxkIHJlcXVpcmUgdXNpbmcgdGhlIG1heGltdW0gbWVtb3J5IG9mIGFueSBNb2RlbCdzIFN0YXRlIG9yIG1lbW9yeQorICogYWxsb2NhdGlvbiB3aXRoIGVhY2ggbG9va3VwKS4gIFRoaXMgbWVhbnMgeW91IGJlY29tZSByZXNwb25zaWJsZSBmb3IKKyAqIGFsbG9jYXRpbmcgbWVtb3J5IHdpdGggc2l6ZSBTdGF0ZVNpemUoKSBhbmQgcGFzc2luZyBpdCB0byB0aGUgU2NvcmUgb3IKKyAqIEZ1bGxTY29yZSBmdW5jdGlvbnMgcHJvdmlkZWQgaGVyZS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgY2RlYyBoYXMgYSBzdGQ6OnN0cmluZyBjb250YWluaW5nIHRoZSBlbnRpcmUgc3RhdGUgb2YgYQorICogaHlwb3RoZXNpcy4gIEl0IGNhbiByZXNlcnZlIFN0YXRlU2l6ZSBieXRlcyBpbiB0aGlzIHN0cmluZyBmb3IgdGhlIG1vZGVsCisgKiBzdGF0ZS4KKyAqCisgKiBBbGwgdGhlIFN0YXRlIG9iamVjdHMgYXJlIFBPRCwgc28gaXQncyBvayB0byB1c2UgcmF3IG1lbW9yeSBmb3Igc3RvcmluZworICogU3RhdGUuCisgKiBpbl9zdGF0ZSBhbmQgb3V0X3N0YXRlIG11c3Qgbm90IGhhdmUgdGhlIHNhbWUgYWRkcmVzcy4KKyAqLworY2xhc3MgTW9kZWwgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+TW9kZWwoKTsKKworICAgIHNpemVfdCBTdGF0ZVNpemUoKSBjb25zdCB7IHJldHVybiBzdGF0ZV9zaXplXzsgfQorICAgIGNvbnN0IHZvaWQgKkJlZ2luU2VudGVuY2VNZW1vcnkoKSBjb25zdCB7IHJldHVybiBiZWdpbl9zZW50ZW5jZV9tZW1vcnlfOyB9CisgICAgdm9pZCBCZWdpblNlbnRlbmNlV3JpdGUodm9pZCAqdG8pIGNvbnN0IHsgbWVtY3B5KHRvLCBiZWdpbl9zZW50ZW5jZV9tZW1vcnlfLCBTdGF0ZVNpemUoKSk7IH0KKyAgICBjb25zdCB2b2lkICpOdWxsQ29udGV4dE1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIG51bGxfY29udGV4dF9tZW1vcnlfOyB9CisgICAgdm9pZCBOdWxsQ29udGV4dFdyaXRlKHZvaWQgKnRvKSBjb25zdCB7IG1lbWNweSh0bywgbnVsbF9jb250ZXh0X21lbW9yeV8sIFN0YXRlU2l6ZSgpKTsgfQorCisgICAgLy8gUmVxdWlyZXMgaW5fc3RhdGUgIT0gb3V0X3N0YXRlCisgICAgdmlydHVhbCBmbG9hdCBCYXNlU2NvcmUoY29uc3Qgdm9pZCAqaW5fc3RhdGUsIGNvbnN0IFdvcmRJbmRleCBuZXdfd29yZCwgdm9pZCAqb3V0X3N0YXRlKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXF1aXJlcyBpbl9zdGF0ZSAhPSBvdXRfc3RhdGUKKyAgICB2aXJ0dWFsIEZ1bGxTY29yZVJldHVybiBCYXNlRnVsbFNjb3JlKGNvbnN0IHZvaWQgKmluX3N0YXRlLCBjb25zdCBXb3JkSW5kZXggbmV3X3dvcmQsIHZvaWQgKm91dF9zdGF0ZSkgY29uc3QgPSAwOworCisgICAgLy8gUHJlZmVyIHRvIHVzZSBGdWxsU2NvcmUuICBUaGUgY29udGV4dCB3b3JkcyBzaG91bGQgYmUgcHJvdmlkZWQgaW4gcmV2ZXJzZSBvcmRlci4KKyAgICB2aXJ0dWFsIEZ1bGxTY29yZVJldHVybiBCYXNlRnVsbFNjb3JlRm9yZ290U3RhdGUoY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JiZWdpbiwgY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JlbmQsIGNvbnN0IFdvcmRJbmRleCBuZXdfd29yZCwgdm9pZCAqb3V0X3N0YXRlKSBjb25zdCA9IDA7CisKKyAgICB1bnNpZ25lZCBjaGFyIE9yZGVyKCkgY29uc3QgeyByZXR1cm4gb3JkZXJfOyB9CisKKyAgICBjb25zdCBWb2NhYnVsYXJ5ICZCYXNlVm9jYWJ1bGFyeSgpIGNvbnN0IHsgcmV0dXJuICpiYXNlX3ZvY2FiXzsgfQorCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFY+IGZyaWVuZCBjbGFzcyBNb2RlbEZhY2FkZTsKKyAgICBleHBsaWNpdCBNb2RlbChzaXplX3Qgc3RhdGVfc2l6ZSkgOiBzdGF0ZV9zaXplXyhzdGF0ZV9zaXplKSB7fQorCisgICAgY29uc3Qgc2l6ZV90IHN0YXRlX3NpemVfOworICAgIGNvbnN0IHZvaWQgKmJlZ2luX3NlbnRlbmNlX21lbW9yeV8sICpudWxsX2NvbnRleHRfbWVtb3J5XzsKKworICAgIGNvbnN0IFZvY2FidWxhcnkgKmJhc2Vfdm9jYWJfOworCisgICAgdW5zaWduZWQgY2hhciBvcmRlcl87CisKKyAgICAvLyBEaXNhYmxlIGNvcHkgY29uc3RydWN0b3JzLiAgVGhleSdyZSBwcml2YXRlIGFuZCB1bmRlZmluZWQuCisgICAgLy8gRXJzYXR6IGJvb3N0Ojpub25jb3B5YWJsZS4KKyAgICBNb2RlbChjb25zdCBNb2RlbCAmKTsKKyAgICBNb2RlbCAmb3BlcmF0b3I9KGNvbnN0IE1vZGVsICYpOworfTsKKworfSAvLyBtYW1lc3BhY2UgYmFzZQorfSAvLyBuYW1lc3BhY2UgbG0KKworI2VuZGlmIC8vIExNX1ZJUlRVQUxfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS92b2NhYi5jYyBiL3NyYy9rZW5sbS9sbS92b2NhYi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDgzZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL2xtL3ZvY2FiLmNjCkBAIC0wLDAgKzEsMzI5IEBACisjaW5jbHVkZSAibG0vdm9jYWIuaGgiCisKKyNpbmNsdWRlICJsbS9iaW5hcnlfZm9ybWF0LmhoIgorI2luY2x1ZGUgImxtL2VudW1lcmF0ZV92b2NhYi5oaCIKKyNpbmNsdWRlICJsbS9sbV9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAibG0vY29uZmlnLmhoIgorI2luY2x1ZGUgImxtL3dlaWdodHMuaGgiCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlX3N0cmVhbS5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisjaW5jbHVkZSAidXRpbC9qb2ludF9zb3J0LmhoIgorI2luY2x1ZGUgInV0aWwvbXVybXVyX2hhc2guaGgiCisjaW5jbHVkZSAidXRpbC9wcm9iaW5nX2hhc2hfdGFibGUuaGgiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBuZ3JhbSB7CisKK25hbWVzcGFjZSBkZXRhaWwgewordWludDY0X3QgSGFzaEZvclZvY2FiKGNvbnN0IGNoYXIgKnN0ciwgc3RkOjpzaXplX3QgbGVuKSB7CisgIC8vIFRoaXMgcHJvdmVkIGZhc3RlciB0aGFuIEJvb3N0J3MgaGFzaCBpbiBzcGVlZCB0cmlhbHM6IHRvdGFsIGxvYWQgdGltZSBNdXJtdXIgNjcwOTAwMDAsIEJvb3N0IDcyMjEwMDAwCisgIC8vIENob3NlIHRvIHVzZSA2NEEgaW5zdGVhZCBvZiBuYXRpdmUgc28gYmluYXJ5IGZvcm1hdCB3aWxsIGJlIHBvcnRhYmxlIGFjcm9zcyA2NCBhbmQgMzIgYml0LgorICByZXR1cm4gdXRpbDo6TXVybXVySGFzaDY0QShzdHIsIGxlbiwgMCk7Cit9Cit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworbmFtZXNwYWNlIHsKKy8vIE5vcm1hbGx5IHN0YXRpYyBpbml0aWFsaXphdGlvbiBpcyBhIGJhZCBpZGVhIGJ1dCBNdXJtdXJIYXNoIGlzIHB1cmUgYXJpdGhtZXRpYywgc28gdGhpcyBpcyBvay4KK2NvbnN0IHVpbnQ2NF90IGtVbmtub3duSGFzaCA9IGRldGFpbDo6SGFzaEZvclZvY2FiKCI8dW5rPiIsIDUpOworLy8gU2FkbHkgc29tZSBMTXMgaGF2ZSA8VU5LPi4KK2NvbnN0IHVpbnQ2NF90IGtVbmtub3duQ2FwSGFzaCA9IGRldGFpbDo6SGFzaEZvclZvY2FiKCI8VU5LPiIsIDUpOworCisvLyBUT0RPOiByZXBsYWNlIHdpdGggRmlsZVBpZWNlLgordm9pZCBSZWFkV29yZHMoaW50IGZkLCBFbnVtZXJhdGVWb2NhYiAqZW51bWVyYXRlLCBXb3JkSW5kZXggZXhwZWN0ZWRfY291bnQsIHVpbnQ2NF90IG9mZnNldCkgeworICB1dGlsOjpTZWVrT3JUaHJvdyhmZCwgb2Zmc2V0KTsKKyAgLy8gQ2hlY2sgdGhhdCB3ZSdyZSBhdCB0aGUgcmlnaHQgcGxhY2UgYnkgcmVhZGluZyA8dW5rPiB3aGljaCBpcyBhbHdheXMgZmlyc3QuCisgIGNoYXIgY2hlY2tfdW5rWzZdOworICB1dGlsOjpSZWFkT3JUaHJvdyhmZCwgY2hlY2tfdW5rLCA2KTsKKyAgVVRJTF9USFJPV19JRigKKyAgICAgIG1lbWNtcChjaGVja191bmssICI8dW5rPiIsIDYpLAorICAgICAgRm9ybWF0TG9hZEV4Y2VwdGlvbiwKKyAgICAgICJWb2NhYnVsYXJ5IHdvcmRzIGFyZSBpbiB0aGUgd3JvbmcgcGxhY2UuICBUaGlzIGNvdWxkIGJlIGJlY2F1c2UgdGhlIGJpbmFyeSBmaWxlIHdhcyBidWlsdCB3aXRoIHN0YWxlIGdjYyBhbmQgb2xkIGtlbmxtLiAgU3RhbGUgZ2NjLCBpbmNsdWRpbmcgdGhlIGdjYyBkaXN0cmlidXRlZCB3aXRoIFJlZEhhdCBhbmQgT1MgWCwgaGFzIGEgYnVnIHRoYXQgaWdub3JlcyBwcmFnbWEgcGFjayBmb3IgdGVtcGxhdGUtZGVwZW5kZW50IHR5cGVzLiAgTmV3IGtlbmxtIHdvcmtzIGFyb3VuZCB0aGlzLCBzbyB5b3UnbGwgc2F2ZSBtZW1vcnkgYnV0IGhhdmUgdG8gcmVidWlsZCBhbnkgYmluYXJ5IGZpbGVzIHVzaW5nIHRoZSBwcm9iaW5nIGRhdGEgc3RydWN0dXJlLiIpOworICBpZiAoIWVudW1lcmF0ZSkgcmV0dXJuOworICBlbnVtZXJhdGUtPkFkZCgwLCAiPHVuaz4iKTsKKworICAvLyBSZWFkIGFsbCB0aGUgd29yZHMgYWZ0ZXIgdW5rLgorICBjb25zdCBzdGQ6OnNpemVfdCBrSW5pdGlhbFJlYWQgPSAxNjM4NDsKKyAgc3RkOjpzdHJpbmcgYnVmOworICBidWYucmVzZXJ2ZShrSW5pdGlhbFJlYWQgKyAxMDApOworICBidWYucmVzaXplKGtJbml0aWFsUmVhZCk7CisgIFdvcmRJbmRleCBpbmRleCA9IDE7IC8vIFJlYWQgPHVuaz4gYWxyZWFkeS4KKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGQ6OnNpemVfdCBnb3QgPSB1dGlsOjpSZWFkT3JFT0YoZmQsICZidWZbMF0sIGtJbml0aWFsUmVhZCk7CisgICAgaWYgKGdvdCA9PSAwKSBicmVhazsKKyAgICBidWYucmVzaXplKGdvdCk7CisgICAgd2hpbGUgKGJ1ZltidWYuc2l6ZSgpIC0gMV0pIHsKKyAgICAgIGNoYXIgbmV4dF9jaGFyOworICAgICAgdXRpbDo6UmVhZE9yVGhyb3coZmQsICZuZXh0X2NoYXIsIDEpOworICAgICAgYnVmLnB1c2hfYmFjayhuZXh0X2NoYXIpOworICAgIH0KKyAgICAvLyBPayBub3cgd2UgaGF2ZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncy4KKyAgICBmb3IgKGNvbnN0IGNoYXIgKmkgPSBidWYuZGF0YSgpOyBpICE9IGJ1Zi5kYXRhKCkgKyBidWYuc2l6ZSgpOykgeworICAgICAgc3RkOjpzaXplX3QgbGVuZ3RoID0gc3RybGVuKGkpOworICAgICAgZW51bWVyYXRlLT5BZGQoaW5kZXgrKywgU3RyaW5nUGllY2UoaSwgbGVuZ3RoKSk7CisgICAgICBpICs9IGxlbmd0aCArIDEgLyogbnVsbCBieXRlICovOworICAgIH0KKyAgfQorCisgIFVUSUxfVEhST1dfSUYoZXhwZWN0ZWRfY291bnQgIT0gaW5kZXgsIEZvcm1hdExvYWRFeGNlcHRpb24sICJUaGUgYmluYXJ5IGZpbGUgaGFzIHRoZSB3cm9uZyBudW1iZXIgb2Ygd29yZHMgYXQgdGhlIGVuZC4gIFRoaXMgY291bGQgYmUgY2F1c2VkIGJ5IGEgdHJ1bmNhdGVkIGJpbmFyeSBmaWxlLiIpOworfQorCisvLyBDb25zdHJ1Y3RvciBvcmRlcmluZyBtYWRuZXNzLgoraW50IFNlZWtBbmRSZXR1cm4oaW50IGZkLCB1aW50NjRfdCBzdGFydCkgeworICB1dGlsOjpTZWVrT3JUaHJvdyhmZCwgc3RhcnQpOworICByZXR1cm4gZmQ7Cit9Cit9IC8vIG5hbWVzcGFjZQorCitJbW1lZGlhdGVXcml0ZVdvcmRzV3JhcHBlcjo6SW1tZWRpYXRlV3JpdGVXb3Jkc1dyYXBwZXIoRW51bWVyYXRlVm9jYWIgKmlubmVyLCBpbnQgZmQsIHVpbnQ2NF90IHN0YXJ0KQorICA6IGlubmVyXyhpbm5lciksIHN0cmVhbV8oU2Vla0FuZFJldHVybihmZCwgc3RhcnQpKSB7fQorCitXcml0ZVdvcmRzV3JhcHBlcjo6V3JpdGVXb3Jkc1dyYXBwZXIoRW51bWVyYXRlVm9jYWIgKmlubmVyKSA6IGlubmVyXyhpbm5lcikge30KKwordm9pZCBXcml0ZVdvcmRzV3JhcHBlcjo6QWRkKFdvcmRJbmRleCBpbmRleCwgY29uc3QgU3RyaW5nUGllY2UgJnN0cikgeworICBpZiAoaW5uZXJfKSBpbm5lcl8tPkFkZChpbmRleCwgc3RyKTsKKyAgYnVmZmVyXy5hcHBlbmQoc3RyLmRhdGEoKSwgc3RyLnNpemUoKSk7CisgIGJ1ZmZlcl8ucHVzaF9iYWNrKDApOworfQorCit2b2lkIFdyaXRlV29yZHNXcmFwcGVyOjpXcml0ZShpbnQgZmQsIHVpbnQ2NF90IHN0YXJ0KSB7CisgIHV0aWw6OlNlZWtPclRocm93KGZkLCBzdGFydCk7CisgIHV0aWw6OldyaXRlT3JUaHJvdyhmZCwgYnVmZmVyXy5kYXRhKCksIGJ1ZmZlcl8uc2l6ZSgpKTsKKyAgLy8gRnJlZSBtZW1vcnkgZnJvbSB0aGUgc3RyaW5nLgorICBzdGQ6OnN0cmluZyBmb3Jfc3dhcDsKKyAgc3RkOjpzd2FwKGJ1ZmZlcl8sIGZvcl9zd2FwKTsKK30KKworU29ydGVkVm9jYWJ1bGFyeTo6U29ydGVkVm9jYWJ1bGFyeSgpIDogYmVnaW5fKE5VTEwpLCBlbmRfKE5VTEwpLCBlbnVtZXJhdGVfKE5VTEwpIHt9CisKK3VpbnQ2NF90IFNvcnRlZFZvY2FidWxhcnk6OlNpemUodWludDY0X3QgZW50cmllcywgY29uc3QgQ29uZmlnICYvKmNvbmZpZyovKSB7CisgIC8vIExlYWQgd2l0aCB0aGUgbnVtYmVyIG9mIGVudHJpZXMuCisgIHJldHVybiBzaXplb2YodWludDY0X3QpICsgc2l6ZW9mKHVpbnQ2NF90KSAqIGVudHJpZXM7Cit9CisKK3ZvaWQgU29ydGVkVm9jYWJ1bGFyeTo6U2V0dXBNZW1vcnkodm9pZCAqc3RhcnQsIHN0ZDo6c2l6ZV90IGFsbG9jYXRlZCwgc3RkOjpzaXplX3QgZW50cmllcywgY29uc3QgQ29uZmlnICZjb25maWcpIHsKKyAgYXNzZXJ0KGFsbG9jYXRlZCA+PSBTaXplKGVudHJpZXMsIGNvbmZpZykpOworICAvLyBMZWF2ZSBzcGFjZSBmb3IgbnVtYmVyIG9mIGVudHJpZXMuCisgIGJlZ2luXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPihzdGFydCkgKyAxOworICBlbmRfID0gYmVnaW5fOworICBzYXdfdW5rXyA9IGZhbHNlOworfQorCit2b2lkIFNvcnRlZFZvY2FidWxhcnk6OlJlbG9jYXRlKHZvaWQgKm5ld19zdGFydCkgeworICBzdGQ6OnNpemVfdCBkZWx0YSA9IGVuZF8gLSBiZWdpbl87CisgIGJlZ2luXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPihuZXdfc3RhcnQpICsgMTsKKyAgZW5kXyA9IGJlZ2luXyArIGRlbHRhOworfQorCit2b2lkIFNvcnRlZFZvY2FidWxhcnk6OkNvbmZpZ3VyZUVudW1lcmF0ZShFbnVtZXJhdGVWb2NhYiAqdG8sIHN0ZDo6c2l6ZV90IG1heF9lbnRyaWVzKSB7CisgIGVudW1lcmF0ZV8gPSB0bzsKKyAgaWYgKGVudW1lcmF0ZV8pIHsKKyAgICBlbnVtZXJhdGVfLT5BZGQoMCwgIjx1bms+Iik7CisgICAgc3RyaW5nc190b19lbnVtZXJhdGVfLnJlc2l6ZShtYXhfZW50cmllcyk7CisgIH0KK30KKworV29yZEluZGV4IFNvcnRlZFZvY2FidWxhcnk6Okluc2VydChjb25zdCBTdHJpbmdQaWVjZSAmc3RyKSB7CisgIHVpbnQ2NF90IGhhc2hlZCA9IGRldGFpbDo6SGFzaEZvclZvY2FiKHN0cik7CisgIGlmIChoYXNoZWQgPT0ga1Vua25vd25IYXNoIHx8IGhhc2hlZCA9PSBrVW5rbm93bkNhcEhhc2gpIHsKKyAgICBzYXdfdW5rXyA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgKmVuZF8gPSBoYXNoZWQ7CisgIGlmIChlbnVtZXJhdGVfKSB7CisgICAgdm9pZCAqY29waWVkID0gc3RyaW5nX2JhY2tpbmdfLkFsbG9jYXRlKHN0ci5zaXplKCkpOworICAgIG1lbWNweShjb3BpZWQsIHN0ci5kYXRhKCksIHN0ci5zaXplKCkpOworICAgIHN0cmluZ3NfdG9fZW51bWVyYXRlX1tlbmRfIC0gYmVnaW5fXSA9IFN0cmluZ1BpZWNlKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihjb3BpZWQpLCBzdHIuc2l6ZSgpKTsKKyAgfQorICArK2VuZF87CisgIC8vIFRoaXMgaXMgMSArIHRoZSBvZmZzZXQgd2hlcmUgaXQgd2FzIGluc2VydGVkIHRvIG1ha2Ugcm9vbSBmb3IgdW5rLgorICByZXR1cm4gZW5kXyAtIGJlZ2luXzsKK30KKwordm9pZCBTb3J0ZWRWb2NhYnVsYXJ5OjpGaW5pc2hlZExvYWRpbmcoUHJvYkJhY2tvZmYgKnJlb3JkZXIpIHsKKyAgR2VuZXJpY0ZpbmlzaGVkKHJlb3JkZXIpOworfQorCituYW1lc3BhY2UgeworI3ByYWdtYSBwYWNrKHB1c2gpCisjcHJhZ21hIHBhY2soNCkKK3N0cnVjdCBSZW51bWJlckVudHJ5IHsKKyAgdWludDY0X3QgaGFzaDsKKyAgY29uc3QgY2hhciAqc3RyOworICBXb3JkSW5kZXggb2xkOworICBib29sIG9wZXJhdG9yPChjb25zdCBSZW51bWJlckVudHJ5ICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBoYXNoIDwgb3RoZXIuaGFzaDsKKyAgfQorfTsKKyNwcmFnbWEgcGFjayhwb3ApCit9IC8vIG5hbWVzcGFjZQorCit2b2lkIFNvcnRlZFZvY2FidWxhcnk6OkNvbXB1dGVSZW51bWJlcmluZyhXb3JkSW5kZXggdHlwZXMsIGludCBmcm9tX3dvcmRzLCBpbnQgdG9fd29yZHMsIHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gJm1hcHBpbmcpIHsKKyAgbWFwcGluZy5jbGVhcigpOworICB1aW50NjRfdCBmaWxlX3NpemUgPSB1dGlsOjpTaXplT3JUaHJvdyhmcm9tX3dvcmRzKTsKKyAgdXRpbDo6c2NvcGVkX21lbW9yeSBzdHJpbmdzOworICB1dGlsOjpNYXBSZWFkKHV0aWw6OlBPUFVMQVRFX09SX1JFQUQsIGZyb21fd29yZHMsIDAsIGZpbGVfc2l6ZSwgc3RyaW5ncyk7CisgIGNvbnN0IGNoYXIgKmNvbnN0IHN0YXJ0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHN0cmluZ3MuZ2V0KCkpOworICBVVElMX1RIUk9XX0lGKG1lbWNtcChzdGFydCwgIjx1bms+IiwgNiksIEZvcm1hdExvYWRFeGNlcHRpb24sICJWb2NhYiBmaWxlIGRvZXMgbm90IGJlZ2luIHdpdGggPHVuaz4gZm9sbG93ZWQgYnkgbnVsbCIpOworICBzdGQ6OnZlY3RvcjxSZW51bWJlckVudHJ5PiBlbnRyaWVzOworICBlbnRyaWVzLnJlc2VydmUodHlwZXMgLSAxKTsKKyAgUmVudW1iZXJFbnRyeSBlbnRyeTsKKyAgZW50cnkub2xkID0gMTsKKyAgZm9yIChlbnRyeS5zdHIgPSBzdGFydCArIDYgLyogc2tpcCA8dW5rPlwwICovOyBlbnRyeS5zdHIgPCBzdGFydCArIGZpbGVfc2l6ZTsgKytlbnRyeS5vbGQpIHsKKyAgICBTdHJpbmdQaWVjZSBzdHIoZW50cnkuc3RyLCBzdHJsZW4oZW50cnkuc3RyKSk7CisgICAgZW50cnkuaGFzaCA9IGRldGFpbDo6SGFzaEZvclZvY2FiKHN0cik7CisgICAgZW50cmllcy5wdXNoX2JhY2soZW50cnkpOworICAgIGVudHJ5LnN0ciArPSBzdHIuc2l6ZSgpICsgMTsKKyAgfQorICBVVElMX1RIUk9XX0lGMihlbnRyaWVzLnNpemUoKSAhPSB0eXBlcyAtIDEsICJXcm9uZyBudW1iZXIgb2Ygdm9jYWIgaWRzLiAgR290ICIgPDwgKGVudHJpZXMuc2l6ZSgpICsgMSkgPDwgIiBleHBlY3RlZCAiIDw8IHR5cGVzKTsKKyAgc3RkOjpzb3J0KGVudHJpZXMuYmVnaW4oKSwgZW50cmllcy5lbmQoKSk7CisgIC8vIFdyaXRlIG91dCBuZXcgdm9jYWIgZmlsZS4KKyAgeworICAgIHV0aWw6OkZpbGVTdHJlYW0gb3V0KHRvX3dvcmRzKTsKKyAgICBvdXQgPDwgIjx1bms+IiA8PCAnXDAnOworICAgIGZvciAoc3RkOjp2ZWN0b3I8UmVudW1iZXJFbnRyeT46OmNvbnN0X2l0ZXJhdG9yIGkgPSBlbnRyaWVzLmJlZ2luKCk7IGkgIT0gZW50cmllcy5lbmQoKTsgKytpKSB7CisgICAgICBvdXQgPDwgaS0+c3RyIDw8ICdcMCc7CisgICAgfQorICB9CisgIHN0cmluZ3MucmVzZXQoKTsKKworICBtYXBwaW5nLnJlc2l6ZSh0eXBlcyk7CisgIG1hcHBpbmdbMF0gPSAwOyAvLyA8dW5rPgorICBmb3IgKHN0ZDo6dmVjdG9yPFJlbnVtYmVyRW50cnk+Ojpjb25zdF9pdGVyYXRvciBpID0gZW50cmllcy5iZWdpbigpOyBpICE9IGVudHJpZXMuZW5kKCk7ICsraSkgeworICAgIG1hcHBpbmdbaS0+b2xkXSA9IGkgKyAxIC0gZW50cmllcy5iZWdpbigpOworICB9Cit9CisKK3ZvaWQgU29ydGVkVm9jYWJ1bGFyeTo6UG9wdWxhdGVkKCkgeworICBzYXdfdW5rXyA9IHRydWU7CisgIFNldFNwZWNpYWwoSW5kZXgoIjxzPiIpLCBJbmRleCgiPC9zPiIpLCAwKTsKKyAgYm91bmRfID0gZW5kXyAtIGJlZ2luXyArIDE7CisgICoocmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCo+KGJlZ2luXykgLSAxKSA9IGVuZF8gLSBiZWdpbl87Cit9CisKK3ZvaWQgU29ydGVkVm9jYWJ1bGFyeTo6TG9hZGVkQmluYXJ5KGJvb2wgaGF2ZV93b3JkcywgaW50IGZkLCBFbnVtZXJhdGVWb2NhYiAqdG8sIHVpbnQ2NF90IG9mZnNldCkgeworICBlbmRfID0gYmVnaW5fICsgKihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oYmVnaW5fKSAtIDEpOworICBTZXRTcGVjaWFsKEluZGV4KCI8cz4iKSwgSW5kZXgoIjwvcz4iKSwgMCk7CisgIGJvdW5kXyA9IGVuZF8gLSBiZWdpbl8gKyAxOworICBpZiAoaGF2ZV93b3JkcykgUmVhZFdvcmRzKGZkLCB0bywgYm91bmRfLCBvZmZzZXQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBTb3J0ZWRWb2NhYnVsYXJ5OjpHZW5lcmljRmluaXNoZWQoVCAqcmVvcmRlcikgeworICBpZiAoZW51bWVyYXRlXykgeworICAgIGlmICghc3RyaW5nc190b19lbnVtZXJhdGVfLmVtcHR5KCkpIHsKKyAgICAgIHV0aWw6OlBhaXJlZEl0ZXJhdG9yPFQqLCBTdHJpbmdQaWVjZSo+IHZhbHVlcyhyZW9yZGVyICsgMSwgJipzdHJpbmdzX3RvX2VudW1lcmF0ZV8uYmVnaW4oKSk7CisgICAgICB1dGlsOjpKb2ludFNvcnQoYmVnaW5fLCBlbmRfLCB2YWx1ZXMpOworICAgIH0KKyAgICBmb3IgKFdvcmRJbmRleCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PFdvcmRJbmRleD4oZW5kXyAtIGJlZ2luXyk7ICsraSkgeworICAgICAgLy8gPHVuaz4gc3RyaWtlcyBhZ2FpbjogKzEgaGVyZS4KKyAgICAgIGVudW1lcmF0ZV8tPkFkZChpICsgMSwgc3RyaW5nc190b19lbnVtZXJhdGVfW2ldKTsKKyAgICB9CisgICAgc3RyaW5nc190b19lbnVtZXJhdGVfLmNsZWFyKCk7CisgICAgc3RyaW5nX2JhY2tpbmdfLkZyZWVBbGwoKTsKKyAgfSBlbHNlIHsKKyAgICB1dGlsOjpKb2ludFNvcnQoYmVnaW5fLCBlbmRfLCByZW9yZGVyICsgMSk7CisgIH0KKyAgU2V0U3BlY2lhbChJbmRleCgiPHM+IiksIEluZGV4KCI8L3M+IiksIDApOworICAvLyBTYXZlIHNpemUuICBFeGNsdWRlcyBVTksuCisgICoocmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCo+KGJlZ2luXykgLSAxKSA9IGVuZF8gLSBiZWdpbl87CisgIC8vIEluY2x1ZGVzIFVOSy4KKyAgYm91bmRfID0gZW5kXyAtIGJlZ2luXyArIDE7Cit9CisKK25hbWVzcGFjZSB7Citjb25zdCB1bnNpZ25lZCBpbnQga1Byb2JpbmdWb2NhYnVsYXJ5VmVyc2lvbiA9IDA7Cit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgZGV0YWlsIHsKK3N0cnVjdCBQcm9iaW5nVm9jYWJ1bGFyeUhlYWRlciB7CisgIC8vIExvd2VzdCB1bnVzZWQgdm9jYWIgaWQuICBUaGlzIGlzIGFsc28gdGhlIG51bWJlciBvZiB3b3JkcywgaW5jbHVkaW5nIDx1bms+LgorICB1bnNpZ25lZCBpbnQgdmVyc2lvbjsKKyAgV29yZEluZGV4IGJvdW5kOworfTsKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCitQcm9iaW5nVm9jYWJ1bGFyeTo6UHJvYmluZ1ZvY2FidWxhcnkoKSA6IGVudW1lcmF0ZV8oTlVMTCkge30KKwordWludDY0X3QgUHJvYmluZ1ZvY2FidWxhcnk6OlNpemUodWludDY0X3QgZW50cmllcywgZmxvYXQgcHJvYmluZ19tdWx0aXBsaWVyKSB7CisgIHJldHVybiBBTElHTjgoc2l6ZW9mKGRldGFpbDo6UHJvYmluZ1ZvY2FidWxhcnlIZWFkZXIpKSArIExvb2t1cDo6U2l6ZShlbnRyaWVzLCBwcm9iaW5nX211bHRpcGxpZXIpOworfQorCit1aW50NjRfdCBQcm9iaW5nVm9jYWJ1bGFyeTo6U2l6ZSh1aW50NjRfdCBlbnRyaWVzLCBjb25zdCBDb25maWcgJmNvbmZpZykgeworICByZXR1cm4gU2l6ZShlbnRyaWVzLCBjb25maWcucHJvYmluZ19tdWx0aXBsaWVyKTsKK30KKwordm9pZCBQcm9iaW5nVm9jYWJ1bGFyeTo6U2V0dXBNZW1vcnkodm9pZCAqc3RhcnQsIHN0ZDo6c2l6ZV90IGFsbG9jYXRlZCkgeworICBoZWFkZXJfID0gc3RhdGljX2Nhc3Q8ZGV0YWlsOjpQcm9iaW5nVm9jYWJ1bGFyeUhlYWRlcio+KHN0YXJ0KTsKKyAgbG9va3VwXyA9IExvb2t1cChzdGF0aWNfY2FzdDx1aW50OF90Kj4oc3RhcnQpICsgQUxJR044KHNpemVvZihkZXRhaWw6OlByb2JpbmdWb2NhYnVsYXJ5SGVhZGVyKSksIGFsbG9jYXRlZCk7CisgIGJvdW5kXyA9IDE7CisgIHNhd191bmtfID0gZmFsc2U7Cit9CisKK3ZvaWQgUHJvYmluZ1ZvY2FidWxhcnk6OlJlbG9jYXRlKHZvaWQgKm5ld19zdGFydCkgeworICBoZWFkZXJfID0gc3RhdGljX2Nhc3Q8ZGV0YWlsOjpQcm9iaW5nVm9jYWJ1bGFyeUhlYWRlcio+KG5ld19zdGFydCk7CisgIGxvb2t1cF8uUmVsb2NhdGUoc3RhdGljX2Nhc3Q8dWludDhfdCo+KG5ld19zdGFydCkgKyBBTElHTjgoc2l6ZW9mKGRldGFpbDo6UHJvYmluZ1ZvY2FidWxhcnlIZWFkZXIpKSk7Cit9CisKK3ZvaWQgUHJvYmluZ1ZvY2FidWxhcnk6OkNvbmZpZ3VyZUVudW1lcmF0ZShFbnVtZXJhdGVWb2NhYiAqdG8sIHN0ZDo6c2l6ZV90IC8qbWF4X2VudHJpZXMqLykgeworICBlbnVtZXJhdGVfID0gdG87CisgIGlmIChlbnVtZXJhdGVfKSB7CisgICAgZW51bWVyYXRlXy0+QWRkKDAsICI8dW5rPiIpOworICB9Cit9CisKK1dvcmRJbmRleCBQcm9iaW5nVm9jYWJ1bGFyeTo6SW5zZXJ0KGNvbnN0IFN0cmluZ1BpZWNlICZzdHIpIHsKKyAgdWludDY0X3QgaGFzaGVkID0gZGV0YWlsOjpIYXNoRm9yVm9jYWIoc3RyKTsKKyAgLy8gUHJldmVudCB1bmtub3duIGZyb20gZ29pbmcgaW50byB0aGUgdGFibGUuCisgIGlmIChoYXNoZWQgPT0ga1Vua25vd25IYXNoIHx8IGhhc2hlZCA9PSBrVW5rbm93bkNhcEhhc2gpIHsKKyAgICBzYXdfdW5rXyA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgaWYgKGVudW1lcmF0ZV8pIGVudW1lcmF0ZV8tPkFkZChib3VuZF8sIHN0cik7CisgICAgbG9va3VwXy5JbnNlcnQoUHJvYmluZ1ZvY2FidWxhcnlFbnRyeTo6TWFrZShoYXNoZWQsIGJvdW5kXykpOworICAgIHJldHVybiBib3VuZF8rKzsKKyAgfQorfQorCit2b2lkIFByb2JpbmdWb2NhYnVsYXJ5OjpJbnRlcm5hbEZpbmlzaGVkTG9hZGluZygpIHsKKyAgbG9va3VwXy5GaW5pc2hlZEluc2VydGluZygpOworICBoZWFkZXJfLT5ib3VuZCA9IGJvdW5kXzsKKyAgaGVhZGVyXy0+dmVyc2lvbiA9IGtQcm9iaW5nVm9jYWJ1bGFyeVZlcnNpb247CisgIFNldFNwZWNpYWwoSW5kZXgoIjxzPiIpLCBJbmRleCgiPC9zPiIpLCAwKTsKK30KKwordm9pZCBQcm9iaW5nVm9jYWJ1bGFyeTo6TG9hZGVkQmluYXJ5KGJvb2wgaGF2ZV93b3JkcywgaW50IGZkLCBFbnVtZXJhdGVWb2NhYiAqdG8sIHVpbnQ2NF90IG9mZnNldCkgeworICBVVElMX1RIUk9XX0lGKGhlYWRlcl8tPnZlcnNpb24gIT0ga1Byb2JpbmdWb2NhYnVsYXJ5VmVyc2lvbiwgRm9ybWF0TG9hZEV4Y2VwdGlvbiwgIlRoZSBiaW5hcnkgZmlsZSBoYXMgcHJvYmluZyB2ZXJzaW9uICIgPDwgaGVhZGVyXy0+dmVyc2lvbiA8PCAiIGJ1dCB0aGUgY29kZSBleHBlY3RzIHZlcnNpb24gIiA8PCBrUHJvYmluZ1ZvY2FidWxhcnlWZXJzaW9uIDw8ICIuICBQbGVhc2UgcmVydW4gYnVpbGRfYmluYXJ5IHVzaW5nIHRoZSBzYW1lIHZlcnNpb24gb2YgdGhlIGNvZGUuIik7CisgIGJvdW5kXyA9IGhlYWRlcl8tPmJvdW5kOworICBTZXRTcGVjaWFsKEluZGV4KCI8cz4iKSwgSW5kZXgoIjwvcz4iKSwgMCk7CisgIGlmIChoYXZlX3dvcmRzKSBSZWFkV29yZHMoZmQsIHRvLCBib3VuZF8sIG9mZnNldCk7Cit9CisKK3ZvaWQgTWlzc2luZ1Vua25vd24oY29uc3QgQ29uZmlnICZjb25maWcpIHRocm93KFNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbikgeworICBzd2l0Y2goY29uZmlnLnVua25vd25fbWlzc2luZykgeworICAgIGNhc2UgU0lMRU5UOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgQ09NUExBSU46CisgICAgICBpZiAoY29uZmlnLm1lc3NhZ2VzKSAqY29uZmlnLm1lc3NhZ2VzIDw8ICJUaGUgQVJQQSBmaWxlIGlzIG1pc3NpbmcgPHVuaz4uICBTdWJzdGl0dXRpbmcgbG9nMTAgcHJvYmFiaWxpdHkgIiA8PCBjb25maWcudW5rbm93bl9taXNzaW5nX2xvZ3Byb2IgPDwgIi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEhST1dfVVA6CisgICAgICBVVElMX1RIUk9XKFNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbiwgIlRoZSBBUlBBIGZpbGUgaXMgbWlzc2luZyA8dW5rPiBhbmQgdGhlIG1vZGVsIGlzIGNvbmZpZ3VyZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uLiIpOworICB9Cit9CisKK3ZvaWQgTWlzc2luZ1NlbnRlbmNlTWFya2VyKGNvbnN0IENvbmZpZyAmY29uZmlnLCBjb25zdCBjaGFyICpzdHIpIHRocm93KFNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbikgeworICBzd2l0Y2ggKGNvbmZpZy5zZW50ZW5jZV9tYXJrZXJfbWlzc2luZykgeworICAgIGNhc2UgU0lMRU5UOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgQ09NUExBSU46CisgICAgICBpZiAoY29uZmlnLm1lc3NhZ2VzKSAqY29uZmlnLm1lc3NhZ2VzIDw8ICJNaXNzaW5nIHNwZWNpYWwgd29yZCAiIDw8IHN0ciA8PCAiOyB3aWxsIHRyZWF0IGl0IGFzIDx1bms+LiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRIUk9XX1VQOgorICAgICAgVVRJTF9USFJPVyhTcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb24sICJUaGUgQVJQQSBmaWxlIGlzIG1pc3NpbmcgIiA8PCBzdHIgPDwgIiBhbmQgdGhlIG1vZGVsIGlzIGNvbmZpZ3VyZWQgdG8gcmVqZWN0IHRoZXNlIG1vZGVscy4gIFJ1biBidWlsZF9iaW5hcnkgLXMgdG8gZGlzYWJsZSB0aGlzIGNoZWNrLiIpOworICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIG5ncmFtCit9IC8vIG5hbWVzcGFjZSBsbQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL3ZvY2FiLmhoIGIvc3JjL2tlbmxtL2xtL3ZvY2FiLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzQwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vdm9jYWIuaGgKQEAgLTAsMCArMSwyNzkgQEAKKyNpZm5kZWYgTE1fVk9DQUJfSAorI2RlZmluZSBMTV9WT0NBQl9ICisKKyNpbmNsdWRlICJsbS9lbnVtZXJhdGVfdm9jYWIuaGgiCisjaW5jbHVkZSAibG0vbG1fZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgImxtL3ZpcnR1YWxfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZV9zdHJlYW0uaGgiCisjaW5jbHVkZSAidXRpbC9tdXJtdXJfaGFzaC5oaCIKKyNpbmNsdWRlICJ1dGlsL3Bvb2wuaGgiCisjaW5jbHVkZSAidXRpbC9wcm9iaW5nX2hhc2hfdGFibGUuaGgiCisjaW5jbHVkZSAidXRpbC9zb3J0ZWRfdW5pZm9ybS5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmluZ19waWVjZS5oaCIKKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbG0geworc3RydWN0IFByb2JCYWNrb2ZmOworY2xhc3MgRW51bWVyYXRlVm9jYWI7CisKK25hbWVzcGFjZSBuZ3JhbSB7CitzdHJ1Y3QgQ29uZmlnOworCituYW1lc3BhY2UgZGV0YWlsIHsKK3VpbnQ2NF90IEhhc2hGb3JWb2NhYihjb25zdCBjaGFyICpzdHIsIHN0ZDo6c2l6ZV90IGxlbik7CitpbmxpbmUgdWludDY0X3QgSGFzaEZvclZvY2FiKGNvbnN0IFN0cmluZ1BpZWNlICZzdHIpIHsKKyAgcmV0dXJuIEhhc2hGb3JWb2NhYihzdHIuZGF0YSgpLCBzdHIubGVuZ3RoKCkpOworfQorc3RydWN0IFByb2JpbmdWb2NhYnVsYXJ5SGVhZGVyOworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKKy8vIFdyaXRlcyB3b3JkcyBpbW1lZGlhdGVseSB0byBhIGZpbGUgaW5zdGVhZCBvZiBidWZmZXJpbmcsIGJlY2F1c2Ugd2Uga25vdworLy8gd2hlcmUgaW4gdGhlIGZpbGUgdG8gcHV0IHRoZW0uCitjbGFzcyBJbW1lZGlhdGVXcml0ZVdvcmRzV3JhcHBlciA6IHB1YmxpYyBFbnVtZXJhdGVWb2NhYiB7CisgIHB1YmxpYzoKKyAgICBJbW1lZGlhdGVXcml0ZVdvcmRzV3JhcHBlcihFbnVtZXJhdGVWb2NhYiAqaW5uZXIsIGludCBmZCwgdWludDY0X3Qgc3RhcnQpOworCisgICAgdm9pZCBBZGQoV29yZEluZGV4IGluZGV4LCBjb25zdCBTdHJpbmdQaWVjZSAmc3RyKSB7CisgICAgICBzdHJlYW1fIDw8IHN0ciA8PCAnXDAnOworICAgICAgaWYgKGlubmVyXykgaW5uZXJfLT5BZGQoaW5kZXgsIHN0cik7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgRW51bWVyYXRlVm9jYWIgKmlubmVyXzsKKworICAgIHV0aWw6OkZpbGVTdHJlYW0gc3RyZWFtXzsKK307CisKKy8vIFdoZW4gdGhlIGJpbmFyeSBzaXplIGlzbid0IGtub3duIHlldC4KK2NsYXNzIFdyaXRlV29yZHNXcmFwcGVyIDogcHVibGljIEVudW1lcmF0ZVZvY2FiIHsKKyAgcHVibGljOgorICAgIFdyaXRlV29yZHNXcmFwcGVyKEVudW1lcmF0ZVZvY2FiICppbm5lcik7CisKKyAgICB2b2lkIEFkZChXb3JkSW5kZXggaW5kZXgsIGNvbnN0IFN0cmluZ1BpZWNlICZzdHIpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIGJ1ZmZlcl87IH0KKyAgICB2b2lkIFdyaXRlKGludCBmZCwgdWludDY0X3Qgc3RhcnQpOworCisgIHByaXZhdGU6CisgICAgRW51bWVyYXRlVm9jYWIgKmlubmVyXzsKKworICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcl87Cit9OworCisvLyBWb2NhYnVsYXJ5IGJhc2VkIG9uIHNvcnRlZCB1bmlmb3JtIGZpbmQgc3RvcmluZyBvbmx5IHVpbnQ2NF90IHZhbHVlcyBhbmQgdXNpbmcgdGhlaXIgb2Zmc2V0cyBhcyBpbmRpY2VzLgorY2xhc3MgU29ydGVkVm9jYWJ1bGFyeSA6IHB1YmxpYyBiYXNlOjpWb2NhYnVsYXJ5IHsKKyAgcHVibGljOgorICAgIFNvcnRlZFZvY2FidWxhcnkoKTsKKworICAgIFdvcmRJbmRleCBJbmRleChjb25zdCBTdHJpbmdQaWVjZSAmc3RyKSBjb25zdCB7CisgICAgICBjb25zdCB1aW50NjRfdCAqZm91bmQ7CisgICAgICBpZiAodXRpbDo6Qm91bmRlZFNvcnRlZFVuaWZvcm1GaW5kPGNvbnN0IHVpbnQ2NF90KiwgdXRpbDo6SWRlbnRpdHlBY2Nlc3Nvcjx1aW50NjRfdD4sIHV0aWw6OlBpdm90NjQ+KAorICAgICAgICAgICAgdXRpbDo6SWRlbnRpdHlBY2Nlc3Nvcjx1aW50NjRfdD4oKSwKKyAgICAgICAgICAgIGJlZ2luXyAtIDEsIDAsCisgICAgICAgICAgICBlbmRfLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCksCisgICAgICAgICAgICBkZXRhaWw6Okhhc2hGb3JWb2NhYihzdHIpLCBmb3VuZCkpIHsKKyAgICAgICAgcmV0dXJuIGZvdW5kIC0gYmVnaW5fICsgMTsgLy8gKzEgYmVjYXVzZSA8dW5rPiBpcyAwIGFuZCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIGxvb2t1cCB0YWJsZS4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKworICAgIC8vIFNpemUgZm9yIHB1cnBvc2VzIG9mIGZpbGUgd3JpdGluZworICAgIHN0YXRpYyB1aW50NjRfdCBTaXplKHVpbnQ2NF90IGVudHJpZXMsIGNvbnN0IENvbmZpZyAmY29uZmlnKTsKKworICAgIC8qIFJlYWQgbnVsbC1kZWxpbWl0ZWQgd29yZHMgZnJvbSBmaWxlIGZyb21fd29yZHMsIHJlbnVtYmVyIGFjY29yZGluZyB0bworICAgICAqIGhhc2ggb3JkZXIsIHdyaXRlIG51bGwtZGVsaW1pdGVkIHdvcmRzIHRvIHRvX3dvcmRzLCBhbmQgY3JlYXRlIGEgbWFwcGluZworICAgICAqIGZyb20gb2xkIGlkIHRvIG5ldyBpZC4gIFRoZSAwdGggdm9jYWIgd29yZCBtdXN0IGJlIDx1bms+LgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIENvbXB1dGVSZW51bWJlcmluZyhXb3JkSW5kZXggdHlwZXMsIGludCBmcm9tX3dvcmRzLCBpbnQgdG9fd29yZHMsIHN0ZDo6dmVjdG9yPFdvcmRJbmRleD4gJm1hcHBpbmcpOworCisgICAgLy8gVm9jYWIgd29yZHMgYXJlIFswLCBCb3VuZCgpKSAgT25seSB2YWxpZCBhZnRlciBGaW5pc2hlZExvYWRpbmcvTG9hZGVkQmluYXJ5LgorICAgIFdvcmRJbmRleCBCb3VuZCgpIGNvbnN0IHsgcmV0dXJuIGJvdW5kXzsgfQorCisgICAgLy8gRXZlcnl0aGluZyBlbHNlIGlzIGZvciBwb3B1bGF0aW5nLiAgSSdtIHRvbyBsYXp5IHRvIGhpZGUgYW5kIGZyaWVuZCB0aGVzZSwgYnV0IHlvdSdsbCBvbmx5IGdldCBhIGNvbnN0IHJlZmVyZW5jZSBhbnl3YXkuCisgICAgdm9pZCBTZXR1cE1lbW9yeSh2b2lkICpzdGFydCwgc3RkOjpzaXplX3QgYWxsb2NhdGVkLCBzdGQ6OnNpemVfdCBlbnRyaWVzLCBjb25zdCBDb25maWcgJmNvbmZpZyk7CisKKyAgICB2b2lkIFJlbG9jYXRlKHZvaWQgKm5ld19zdGFydCk7CisKKyAgICB2b2lkIENvbmZpZ3VyZUVudW1lcmF0ZShFbnVtZXJhdGVWb2NhYiAqdG8sIHN0ZDo6c2l6ZV90IG1heF9lbnRyaWVzKTsKKworICAgIC8vIEluc2VydCBhbmQgRmluaXNoZWRMb2FkaW5nIGdvIHRvZ2V0aGVyLgorICAgIFdvcmRJbmRleCBJbnNlcnQoY29uc3QgU3RyaW5nUGllY2UgJnN0cik7CisgICAgLy8gUmVvcmRlcnMgcmVvcmRlcl92b2NhYiBzbyB0aGF0IHRoZSBJRHMgYXJlIHNvcnRlZC4KKyAgICB2b2lkIEZpbmlzaGVkTG9hZGluZyhQcm9iQmFja29mZiAqcmVvcmRlcl92b2NhYik7CisKKyAgICAvLyBUcmllIHN0b3JlcyB0aGUgY29ycmVjdCBjb3VudHMgaW5jbHVkaW5nIDx1bms+IGluIHRoZSBoZWFkZXIuICBJZiB0aGlzIHdhcyBwcmV2aW91c2x5IHNpemVkIGJhc2VkIG9uIGEgY291bnQgZXhsdWRpbmcgPHVuaz4sIHBhZGRpbmcgd2l0aCA4IGJ5dGVzIHdpbGwgbWFrZSBpdCB0aGUgY29ycmVjdCBzaXplIGJhc2VkIG9uIGEgY291bnQgaW5jbHVkaW5nIDx1bms+LgorICAgIHN0ZDo6c2l6ZV90IFVua0NvdW50Q2hhbmdlUGFkZGluZygpIGNvbnN0IHsgcmV0dXJuIFNhd1VuaygpID8gMCA6IHNpemVvZih1aW50NjRfdCk7IH0KKworICAgIGJvb2wgU2F3VW5rKCkgY29uc3QgeyByZXR1cm4gc2F3X3Vua187IH0KKworICAgIHZvaWQgTG9hZGVkQmluYXJ5KGJvb2wgaGF2ZV93b3JkcywgaW50IGZkLCBFbnVtZXJhdGVWb2NhYiAqdG8sIHVpbnQ2NF90IG9mZnNldCk7CisKKyAgICB1aW50NjRfdCAqJkVuZEhhY2soKSB7IHJldHVybiBlbmRfOyB9CisKKyAgICB2b2lkIFBvcHVsYXRlZCgpOworCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgR2VuZXJpY0ZpbmlzaGVkKFQgKnJlb3JkZXIpOworCisgICAgdWludDY0X3QgKmJlZ2luXywgKmVuZF87CisKKyAgICBXb3JkSW5kZXggYm91bmRfOworCisgICAgYm9vbCBzYXdfdW5rXzsKKworICAgIEVudW1lcmF0ZVZvY2FiICplbnVtZXJhdGVfOworCisgICAgLy8gQWN0dWFsIHN0cmluZ3MuICBVc2VkIG9ubHkgd2hlbiBsb2FkaW5nIGZyb20gQVJQQSBhbmQgZW51bWVyYXRlXyAhPSBOVUxMCisgICAgdXRpbDo6UG9vbCBzdHJpbmdfYmFja2luZ187CisKKyAgICBzdGQ6OnZlY3RvcjxTdHJpbmdQaWVjZT4gc3RyaW5nc190b19lbnVtZXJhdGVfOworfTsKKworI3ByYWdtYSBwYWNrKHB1c2gpCisjcHJhZ21hIHBhY2soNCkKK3N0cnVjdCBQcm9iaW5nVm9jYWJ1bGFyeUVudHJ5IHsKKyAgdWludDY0X3Qga2V5OworICBXb3JkSW5kZXggdmFsdWU7CisKKyAgdHlwZWRlZiB1aW50NjRfdCBLZXk7CisgIHVpbnQ2NF90IEdldEtleSgpIGNvbnN0IHsgcmV0dXJuIGtleTsgfQorICB2b2lkIFNldEtleSh1aW50NjRfdCB0bykgeyBrZXkgPSB0bzsgfQorCisgIHN0YXRpYyBQcm9iaW5nVm9jYWJ1bGFyeUVudHJ5IE1ha2UodWludDY0X3Qga2V5LCBXb3JkSW5kZXggdmFsdWUpIHsKKyAgICBQcm9iaW5nVm9jYWJ1bGFyeUVudHJ5IHJldDsKKyAgICByZXQua2V5ID0ga2V5OworICAgIHJldC52YWx1ZSA9IHZhbHVlOworICAgIHJldHVybiByZXQ7CisgIH0KK307CisjcHJhZ21hIHBhY2socG9wKQorCisvLyBWb2NhYnVsYXJ5IHN0b3JpbmcgYSBtYXAgZnJvbSB1aW50NjRfdCB0byBXb3JkSW5kZXguCitjbGFzcyBQcm9iaW5nVm9jYWJ1bGFyeSA6IHB1YmxpYyBiYXNlOjpWb2NhYnVsYXJ5IHsKKyAgcHVibGljOgorICAgIFByb2JpbmdWb2NhYnVsYXJ5KCk7CisKKyAgICBXb3JkSW5kZXggSW5kZXgoY29uc3QgU3RyaW5nUGllY2UgJnN0cikgY29uc3QgeworICAgICAgTG9va3VwOjpDb25zdEl0ZXJhdG9yIGk7CisgICAgICByZXR1cm4gbG9va3VwXy5GaW5kKGRldGFpbDo6SGFzaEZvclZvY2FiKHN0ciksIGkpID8gaS0+dmFsdWUgOiAwOworICAgIH0KKworICAgIHN0YXRpYyB1aW50NjRfdCBTaXplKHVpbnQ2NF90IGVudHJpZXMsIGZsb2F0IHByb2JpbmdfbXVsdGlwbGllcik7CisgICAgLy8gVGhpcyBqdXN0IHVud3JhcHMgQ29uZmlnIHRvIGdldCB0aGUgcHJvYmluZ19tdWx0aXBsaWVyLgorICAgIHN0YXRpYyB1aW50NjRfdCBTaXplKHVpbnQ2NF90IGVudHJpZXMsIGNvbnN0IENvbmZpZyAmY29uZmlnKTsKKworICAgIC8vIFZvY2FiIHdvcmRzIGFyZSBbMCwgQm91bmQoKSkuCisgICAgV29yZEluZGV4IEJvdW5kKCkgY29uc3QgeyByZXR1cm4gYm91bmRfOyB9CisKKyAgICAvLyBFdmVyeXRoaW5nIGVsc2UgaXMgZm9yIHBvcHVsYXRpbmcuICBJJ20gdG9vIGxhenkgdG8gaGlkZSBhbmQgZnJpZW5kIHRoZXNlLCBidXQgeW91J2xsIG9ubHkgZ2V0IGEgY29uc3QgcmVmZXJlbmNlIGFueXdheS4KKyAgICB2b2lkIFNldHVwTWVtb3J5KHZvaWQgKnN0YXJ0LCBzdGQ6OnNpemVfdCBhbGxvY2F0ZWQpOworICAgIHZvaWQgU2V0dXBNZW1vcnkodm9pZCAqc3RhcnQsIHN0ZDo6c2l6ZV90IGFsbG9jYXRlZCwgc3RkOjpzaXplX3QgLyplbnRyaWVzKi8sIGNvbnN0IENvbmZpZyAmLypjb25maWcqLykgeworICAgICAgU2V0dXBNZW1vcnkoc3RhcnQsIGFsbG9jYXRlZCk7CisgICAgfQorCisgICAgdm9pZCBSZWxvY2F0ZSh2b2lkICpuZXdfc3RhcnQpOworCisgICAgdm9pZCBDb25maWd1cmVFbnVtZXJhdGUoRW51bWVyYXRlVm9jYWIgKnRvLCBzdGQ6OnNpemVfdCBtYXhfZW50cmllcyk7CisKKyAgICBXb3JkSW5kZXggSW5zZXJ0KGNvbnN0IFN0cmluZ1BpZWNlICZzdHIpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIFdlaWdodHM+IHZvaWQgRmluaXNoZWRMb2FkaW5nKFdlaWdodHMgKiAvKnJlb3JkZXJfdm9jYWIqLykgeworICAgICAgSW50ZXJuYWxGaW5pc2hlZExvYWRpbmcoKTsKKyAgICB9CisKKyAgICBzdGQ6OnNpemVfdCBVbmtDb3VudENoYW5nZVBhZGRpbmcoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgICBib29sIFNhd1VuaygpIGNvbnN0IHsgcmV0dXJuIHNhd191bmtfOyB9CisKKyAgICB2b2lkIExvYWRlZEJpbmFyeShib29sIGhhdmVfd29yZHMsIGludCBmZCwgRW51bWVyYXRlVm9jYWIgKnRvLCB1aW50NjRfdCBvZmZzZXQpOworCisgIHByaXZhdGU6CisgICAgdm9pZCBJbnRlcm5hbEZpbmlzaGVkTG9hZGluZygpOworCisgICAgdHlwZWRlZiB1dGlsOjpQcm9iaW5nSGFzaFRhYmxlPFByb2JpbmdWb2NhYnVsYXJ5RW50cnksIHV0aWw6OklkZW50aXR5SGFzaD4gTG9va3VwOworCisgICAgTG9va3VwIGxvb2t1cF87CisKKyAgICBXb3JkSW5kZXggYm91bmRfOworCisgICAgYm9vbCBzYXdfdW5rXzsKKworICAgIEVudW1lcmF0ZVZvY2FiICplbnVtZXJhdGVfOworCisgICAgZGV0YWlsOjpQcm9iaW5nVm9jYWJ1bGFyeUhlYWRlciAqaGVhZGVyXzsKK307CisKK3ZvaWQgTWlzc2luZ1Vua25vd24oY29uc3QgQ29uZmlnICZjb25maWcpIHRocm93KFNwZWNpYWxXb3JkTWlzc2luZ0V4Y2VwdGlvbik7Cit2b2lkIE1pc3NpbmdTZW50ZW5jZU1hcmtlcihjb25zdCBDb25maWcgJmNvbmZpZywgY29uc3QgY2hhciAqc3RyKSB0aHJvdyhTcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb24pOworCit0ZW1wbGF0ZSA8Y2xhc3MgVm9jYWI+IHZvaWQgQ2hlY2tTcGVjaWFscyhjb25zdCBDb25maWcgJmNvbmZpZywgY29uc3QgVm9jYWIgJnZvY2FiKSB0aHJvdyhTcGVjaWFsV29yZE1pc3NpbmdFeGNlcHRpb24pIHsKKyAgaWYgKCF2b2NhYi5TYXdVbmsoKSkgTWlzc2luZ1Vua25vd24oY29uZmlnKTsKKyAgaWYgKHZvY2FiLkJlZ2luU2VudGVuY2UoKSA9PSB2b2NhYi5Ob3RGb3VuZCgpKSBNaXNzaW5nU2VudGVuY2VNYXJrZXIoY29uZmlnLCAiPHM+Iik7CisgIGlmICh2b2NhYi5FbmRTZW50ZW5jZSgpID09IHZvY2FiLk5vdEZvdW5kKCkpIE1pc3NpbmdTZW50ZW5jZU1hcmtlcihjb25maWcsICI8L3M+Iik7Cit9CisKK2NsYXNzIFdyaXRlVW5pcXVlV29yZHMgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgV3JpdGVVbmlxdWVXb3JkcyhpbnQgZmQpIDogd29yZF9saXN0XyhmZCkge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBTdHJpbmdQaWVjZSAmd29yZCkgeworICAgICAgd29yZF9saXN0XyA8PCB3b3JkIDw8ICdcMCc7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdXRpbDo6RmlsZVN0cmVhbSB3b3JkX2xpc3RfOworfTsKKworY2xhc3MgTm9PcFVuaXF1ZVdvcmRzIHsKKyAgcHVibGljOgorICAgIE5vT3BVbmlxdWVXb3JkcygpIHt9CisgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFN0cmluZ1BpZWNlICZ3b3JkKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIE5ld1dvcmRBY3Rpb24gPSBOb09wVW5pcXVlV29yZHM+IGNsYXNzIEdyb3dhYmxlVm9jYWIgeworICBwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c2l6ZV90IE1lbVVzYWdlKFdvcmRJbmRleCBjb250ZW50KSB7CisgICAgICByZXR1cm4gTG9va3VwOjpNZW1Vc2FnZShjb250ZW50ID4gMiA/IGNvbnRlbnQgOiAyKTsKKyAgICB9CisKKyAgICAvLyBEb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB3cml0ZV93b3JkaQorICAgIHRlbXBsYXRlIDxjbGFzcyBOZXdXb3JkQ29uc3RydWN0PiBHcm93YWJsZVZvY2FiKFdvcmRJbmRleCBpbml0aWFsX3NpemUsIGNvbnN0IE5ld1dvcmRDb25zdHJ1Y3QgJm5ld193b3JkX2NvbnN0cnVjdCA9IE5ld1dvcmRBY3Rpb24oKSkKKyAgICAgIDogbG9va3VwXyhpbml0aWFsX3NpemUpLCBuZXdfd29yZF8obmV3X3dvcmRfY29uc3RydWN0KSB7CisgICAgICBGaW5kT3JJbnNlcnQoIjx1bms+Iik7IC8vIEZvcmNlIDAKKyAgICAgIEZpbmRPckluc2VydCgiPHM+Iik7IC8vIEZvcmNlIDEKKyAgICAgIEZpbmRPckluc2VydCgiPC9zPiIpOyAvLyBGb3JjZSAyCisgICAgfQorCisgICAgV29yZEluZGV4IEluZGV4KGNvbnN0IFN0cmluZ1BpZWNlICZzdHIpIGNvbnN0IHsKKyAgICAgIExvb2t1cDo6Q29uc3RJdGVyYXRvciBpOworICAgICAgcmV0dXJuIGxvb2t1cF8uRmluZChkZXRhaWw6Okhhc2hGb3JWb2NhYihzdHIpLCBpKSA/IGktPnZhbHVlIDogMDsKKyAgICB9CisKKyAgICBXb3JkSW5kZXggRmluZE9ySW5zZXJ0KGNvbnN0IFN0cmluZ1BpZWNlICZ3b3JkKSB7CisgICAgICBQcm9iaW5nVm9jYWJ1bGFyeUVudHJ5IGVudHJ5ID0gUHJvYmluZ1ZvY2FidWxhcnlFbnRyeTo6TWFrZSh1dGlsOjpNdXJtdXJIYXNoTmF0aXZlKHdvcmQuZGF0YSgpLCB3b3JkLnNpemUoKSksIFNpemUoKSk7CisgICAgICBMb29rdXA6Ok11dGFibGVJdGVyYXRvciBpdDsKKyAgICAgIGlmICghbG9va3VwXy5GaW5kT3JJbnNlcnQoZW50cnksIGl0KSkgeworICAgICAgICBuZXdfd29yZF8od29yZCk7CisgICAgICAgIFVUSUxfVEhST1dfSUYoU2l6ZSgpID49IHN0ZDo6bnVtZXJpY19saW1pdHM8bG06OldvcmRJbmRleD46Om1heCgpLCBWb2NhYkxvYWRFeGNlcHRpb24sICJUb28gbWFueSB2b2NhYnVsYXJ5IHdvcmRzLiAgQ2hhbmdlIFdvcmRJbmRleCB0byB1aW50NjRfdCBpbiBsbS93b3JkX2luZGV4LmhoIik7CisgICAgICB9CisgICAgICByZXR1cm4gaXQtPnZhbHVlOworICAgIH0KKworICAgIFdvcmRJbmRleCBTaXplKCkgY29uc3QgeyByZXR1cm4gbG9va3VwXy5TaXplKCk7IH0KKworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdXRpbDo6QXV0b1Byb2Jpbmc8UHJvYmluZ1ZvY2FidWxhcnlFbnRyeSwgdXRpbDo6SWRlbnRpdHlIYXNoPiBMb29rdXA7CisKKyAgICBMb29rdXAgbG9va3VwXzsKKworICAgIE5ld1dvcmRBY3Rpb24gbmV3X3dvcmRfOworfTsKKworfSAvLyBuYW1lc3BhY2UgbmdyYW0KK30gLy8gbmFtZXNwYWNlIGxtCisKKyNlbmRpZiAvLyBMTV9WT0NBQl9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vd2VpZ2h0cy5oaCBiL3NyYy9rZW5sbS9sbS93ZWlnaHRzLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNDMxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vd2VpZ2h0cy5oaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIExNX1dFSUdIVFNfSAorI2RlZmluZSBMTV9XRUlHSFRTX0gKKworLy8gV2VpZ2h0cyBmb3Igbi1ncmFtcy4gIFByb2JhYmlsaXR5IGFuZCBwb3NzaWJseSBhIGJhY2tvZmYuCisKK25hbWVzcGFjZSBsbSB7CitzdHJ1Y3QgUHJvYiB7CisgIGZsb2F0IHByb2I7Cit9OworLy8gTm8gaW5oZXJpdGFuY2Ugc28gdGhpcyB3aWxsIGJlIGEgUE9ELgorc3RydWN0IFByb2JCYWNrb2ZmIHsKKyAgZmxvYXQgcHJvYjsKKyAgZmxvYXQgYmFja29mZjsKK307CitzdHJ1Y3QgUmVzdFdlaWdodHMgeworICBmbG9hdCBwcm9iOworICBmbG9hdCBiYWNrb2ZmOworICBmbG9hdCByZXN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgbG0KKyNlbmRpZiAvLyBMTV9XRUlHSFRTX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS93b3JkX2luZGV4LmhoIGIvc3JjL2tlbmxtL2xtL3dvcmRfaW5kZXguaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliMjRkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS93b3JkX2luZGV4LmhoCkBAIC0wLDAgKzEsMTUgQEAKKy8vIFNlcGFyYXRlIGhlYWRlciBiZWNhdXNlIHRoaXMgaXMgdXNlZCBvZnRlbi4KKyNpZm5kZWYgTE1fV09SRF9JTkRFWF9ICisjZGVmaW5lIExNX1dPUkRfSU5ERVhfSAorCisjaW5jbHVkZSA8Y2xpbWl0cz4KKworbmFtZXNwYWNlIGxtIHsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFdvcmRJbmRleDsKK2NvbnN0IFdvcmRJbmRleCBrTWF4V29yZEluZGV4ID0gVUlOVF9NQVg7Citjb25zdCBXb3JkSW5kZXgga1VOSyA9IDA7Cit9IC8vIG5hbWVzcGFjZSBsbQorCit0eXBlZGVmIGxtOjpXb3JkSW5kZXggTE1Xb3JkSW5kZXg7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL2xtL3dyYXBwZXJzL1JFQURNRSBiL3NyYy9rZW5sbS9sbS93cmFwcGVycy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjMzRjMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS93cmFwcGVycy9SRUFETUUKQEAgLTAsMCArMSwzIEBACitUaGlzIGRpcmVjdG9yeSBpcyBmb3Igd3JhcHBlcnMgYXJvdW5kIG90aGVyIHBlb3BsZSdzIExNcywgcHJlc2VudGluZyBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byBLZW5MTSdzLiAgWW91IHdpbGwgbmVlZCB0byBoYXZlIHRoZWlyIExNIGluc3RhbGxlZC4KKworTlBMTSBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MuICAKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9sbS93cmFwcGVycy9ucGxtLmNjIGIvc3JjL2tlbmxtL2xtL3dyYXBwZXJzL25wbG0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkN2MxZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9sbS93cmFwcGVycy9ucGxtLmNjCkBAIC0wLDAgKzEsMTE2IEBACisjaW5jbHVkZSAibG0vd3JhcHBlcnMvbnBsbS5oaCIKKyNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworI2luY2x1ZGUgIm5ldXJhbExNLmgiCisKK25hbWVzcGFjZSBsbSB7CituYW1lc3BhY2UgbnAgeworCitWb2NhYnVsYXJ5OjpWb2NhYnVsYXJ5KGNvbnN0IG5wbG06OnZvY2FidWxhcnkgJnZvY2FiKQorICA6IGJhc2U6OlZvY2FidWxhcnkodm9jYWIubG9va3VwX3dvcmQoIjxzPiIpLCB2b2NhYi5sb29rdXBfd29yZCgiPC9zPiIpLCB2b2NhYi5sb29rdXBfd29yZCgiPHVuaz4iKSksCisgICAgdm9jYWJfKHZvY2FiKSwgbnVsbF93b3JkXyh2b2NhYi5sb29rdXBfd29yZCgiPG51bGw+IikpIHt9CisKK1ZvY2FidWxhcnk6On5Wb2NhYnVsYXJ5KCkge30KKworV29yZEluZGV4IFZvY2FidWxhcnk6OkluZGV4KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIGNvbnN0IHsKKyAgcmV0dXJuIHZvY2FiXy5sb29rdXBfd29yZChzdHIpOworfQorCitjbGFzcyBCYWNrZW5kIHsKKyAgcHVibGljOgorICAgIEJhY2tlbmQoY29uc3QgbnBsbTo6bmV1cmFsTE0gJmZyb20sIGNvbnN0IHN0ZDo6c2l6ZV90IGNhY2hlX3NpemUpIDogbG1fKGZyb20pLCBuZ3JhbV8oZnJvbS5nZXRfb3JkZXIoKSkgeworICAgICAgbG1fLnNldF9jYWNoZShjYWNoZV9zaXplKTsKKyAgICB9CisKKyAgICBucGxtOjpuZXVyYWxMTSAmTE0oKSB7IHJldHVybiBsbV87IH0KKyAgICBjb25zdCBucGxtOjpuZXVyYWxMTSAmTE0oKSBjb25zdCB7IHJldHVybiBsbV87IH0KKworICAgIEVpZ2VuOjpNYXRyaXg8aW50LEVpZ2VuOjpEeW5hbWljLDE+ICZzdGFnaW5nX25ncmFtKCkgeyByZXR1cm4gbmdyYW1fOyB9CisKKyAgICBkb3VibGUgbG9va3VwX2Zyb21fc3RhZ2luZygpIHsgcmV0dXJuIGxtXy5sb29rdXBfbmdyYW0obmdyYW1fKTsgfQorCisgICAgaW50IG9yZGVyKCkgY29uc3QgeyByZXR1cm4gbG1fLmdldF9vcmRlcigpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBucGxtOjpuZXVyYWxMTSBsbV87CisgICAgRWlnZW46Ok1hdHJpeDxpbnQsRWlnZW46OkR5bmFtaWMsMT4gbmdyYW1fOworfTsKKworYm9vbCBNb2RlbDo6UmVjb2duaXplKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CisgIHRyeSB7CisgICAgdXRpbDo6c2NvcGVkX2ZkIGZpbGUodXRpbDo6T3BlblJlYWRPclRocm93KG5hbWUuY19zdHIoKSkpOworICAgIGNoYXIgbWFnaWNfY2hlY2tbMTZdOworICAgIHV0aWw6OlJlYWRPclRocm93KGZpbGUuZ2V0KCksIG1hZ2ljX2NoZWNrLCBzaXplb2YobWFnaWNfY2hlY2spKTsKKyAgICBjb25zdCBjaGFyIG5ubG1fbWFnaWNbXSA9ICJcXGNvbmZpZ1xudmVyc2lvbiAiOworICAgIHJldHVybiAhbWVtY21wKG1hZ2ljX2NoZWNrLCBubmxtX21hZ2ljLCAxNik7CisgIH0gY2F0Y2ggKGNvbnN0IHV0aWw6OkV4Y2VwdGlvbiAmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK25hbWVzcGFjZSB7CitucGxtOjpuZXVyYWxMTSAqTG9hZE5QTE0oY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGUpIHsKKyAgdXRpbDo6c2NvcGVkX3B0cjxucGxtOjpuZXVyYWxMTT4gcmV0KG5ldyBucGxtOjpuZXVyYWxMTSgpKTsKKyAgcmV0LT5yZWFkKGZpbGUpOworICByZXR1cm4gcmV0LnJlbGVhc2UoKTsKK30KK30gLy8gbmFtZXNwYWNlCisKK01vZGVsOjpNb2RlbChjb25zdCBzdGQ6OnN0cmluZyAmZmlsZSwgc3RkOjpzaXplX3QgY2FjaGUpCisgIDogYmFzZV9pbnN0YW5jZV8oTG9hZE5QTE0oZmlsZSkpLCB2b2NhYl8oYmFzZV9pbnN0YW5jZV8tPmdldF92b2NhYnVsYXJ5KCkpLCBjYWNoZV9zaXplXyhjYWNoZSkgeworICBVVElMX1RIUk9XX0lGKGJhc2VfaW5zdGFuY2VfLT5nZXRfb3JkZXIoKSA+IE5QTE1fTUFYX09SREVSLCB1dGlsOjpFeGNlcHRpb24sICJUaGlzIE5QTE0gaGFzIG9yZGVyICIgPDwgKHVuc2lnbmVkIGludCliYXNlX2luc3RhbmNlXy0+Z2V0X29yZGVyKCkgPDwgIiBidXQgdGhlIEtlbkxNIHdyYXBwZXIgd2FzIGNvbXBpbGVkIHdpdGggIiA8PCBOUExNX01BWF9PUkRFUiA8PCAiLiAgQ2hhbmdlIHRoZSBkZWZpbnRpb24gb2YgTlBMTV9NQVhfT1JERVIgYW5kIHJlY29tcGlsZS4iKTsKKyAgLy8gbG9nMTAgY29tcGF0aWJsZSB3aXRoIGJhY2tvZmYgbW9kZWxzLgorICBiYXNlX2luc3RhbmNlXy0+c2V0X2xvZ19iYXNlKDEwLjApOworICBTdGF0ZSBiZWdpbl9zZW50ZW5jZSwgbnVsbF9jb250ZXh0OworICBzdGQ6OmZpbGwoYmVnaW5fc2VudGVuY2Uud29yZHMsIGJlZ2luX3NlbnRlbmNlLndvcmRzICsgTlBMTV9NQVhfT1JERVIgLSAxLCBiYXNlX2luc3RhbmNlXy0+bG9va3VwX3dvcmQoIjxzPiIpKTsKKyAgbnVsbF93b3JkXyA9IGJhc2VfaW5zdGFuY2VfLT5sb29rdXBfd29yZCgiPG51bGw+Iik7CisgIHN0ZDo6ZmlsbChudWxsX2NvbnRleHQud29yZHMsIG51bGxfY29udGV4dC53b3JkcyArIE5QTE1fTUFYX09SREVSIC0gMSwgbnVsbF93b3JkXyk7CisKKyAgSW5pdChiZWdpbl9zZW50ZW5jZSwgbnVsbF9jb250ZXh0LCB2b2NhYl8sIGJhc2VfaW5zdGFuY2VfLT5nZXRfb3JkZXIoKSk7Cit9CisKK01vZGVsOjp+TW9kZWwoKSB7fQorCitGdWxsU2NvcmVSZXR1cm4gTW9kZWw6OkZ1bGxTY29yZShjb25zdCBTdGF0ZSAmZnJvbSwgY29uc3QgV29yZEluZGV4IG5ld193b3JkLCBTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdCB7CisgIEJhY2tlbmQgKmJhY2tlbmQgPSBiYWNrZW5kXy5nZXQoKTsKKyAgaWYgKCFiYWNrZW5kKSB7CisgICAgYmFja2VuZCA9IG5ldyBCYWNrZW5kKCpiYXNlX2luc3RhbmNlXywgY2FjaGVfc2l6ZV8pOworICAgIGJhY2tlbmRfLnJlc2V0KGJhY2tlbmQpOworICB9CisgIC8vIFN0YXRlIGlzIGluIG5hdHVyYWwgd29yZCBvcmRlci4KKyAgRnVsbFNjb3JlUmV0dXJuIHJldDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYWNrZW5kLT5vcmRlcigpIC0gMTsgKytpKSB7CisgICAgYmFja2VuZC0+c3RhZ2luZ19uZ3JhbSgpKGkpID0gZnJvbS53b3Jkc1tpXTsKKyAgfQorICBiYWNrZW5kLT5zdGFnaW5nX25ncmFtKCkoYmFja2VuZC0+b3JkZXIoKSAtIDEpID0gbmV3X3dvcmQ7CisgIHJldC5wcm9iID0gYmFja2VuZC0+bG9va3VwX2Zyb21fc3RhZ2luZygpOworICAvLyBBbHdheXMgc2F5IGZ1bGwgb3JkZXIuCisgIHJldC5uZ3JhbV9sZW5ndGggPSBiYWNrZW5kLT5vcmRlcigpOworICAvLyBTaGlmdCBldmVyeXRoaW5nIGRvd24gYnkgb25lLgorICBtZW1jcHkob3V0X3N0YXRlLndvcmRzLCBmcm9tLndvcmRzICsgMSwgc2l6ZW9mKFdvcmRJbmRleCkgKiAoYmFja2VuZC0+b3JkZXIoKSAtIDIpKTsKKyAgb3V0X3N0YXRlLndvcmRzW2JhY2tlbmQtPm9yZGVyKCkgLSAyXSA9IG5ld193b3JkOworICAvLyBGaWxsIGluIHRyYWlsaW5nIHdvcmRzIHdpdGggemVyb3Mgc28gc3RhdGUgY29tcGFyaXNvbiB3b3Jrcy4KKyAgbWVtc2V0KG91dF9zdGF0ZS53b3JkcyArIGJhY2tlbmQtPm9yZGVyKCkgLSAxLCAwLCBzaXplb2YoV29yZEluZGV4KSAqIChOUExNX01BWF9PUkRFUiAtIGJhY2tlbmQtPm9yZGVyKCkpKTsKKyAgcmV0dXJuIHJldDsKK30KKworLy8gVE9ETzogb3B0aW1pemUgd2l0aCBkaXJlY3QgY2FsbD8KK0Z1bGxTY29yZVJldHVybiBNb2RlbDo6RnVsbFNjb3JlRm9yZ290U3RhdGUoY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JiZWdpbiwgY29uc3QgV29yZEluZGV4ICpjb250ZXh0X3JlbmQsIGNvbnN0IFdvcmRJbmRleCBuZXdfd29yZCwgU3RhdGUgJm91dF9zdGF0ZSkgY29uc3QgeworICAvLyBTdGF0ZSBpcyBpbiBuYXR1cmFsIHdvcmQgb3JkZXIuICBUaGUgQVBJIGhlcmUgc3BlY2lmaWVzIHJldmVyc2Ugb3JkZXIuCisgIHN0ZDo6c2l6ZV90IHN0YXRlX2xlbmd0aCA9IHN0ZDo6bWluPHN0ZDo6c2l6ZV90PihPcmRlcigpIC0gMSwgY29udGV4dF9yZW5kIC0gY29udGV4dF9yYmVnaW4pOworICBTdGF0ZSBzdGF0ZTsKKyAgLy8gUGFkIHdpdGggbnVsbCB3b3Jkcy4KKyAgZm9yIChsbTo6V29yZEluZGV4ICppID0gc3RhdGUud29yZHM7IGkgPCBzdGF0ZS53b3JkcyArIE9yZGVyKCkgLSAxIC0gc3RhdGVfbGVuZ3RoOyArK2kpIHsKKyAgICAqaSA9IG51bGxfd29yZF87CisgIH0KKyAgLy8gUHV0IG5ldyB3b3JkcyBhdCB0aGUgZW5kLgorICBzdGQ6OnJldmVyc2VfY29weShjb250ZXh0X3JiZWdpbiwgY29udGV4dF9yYmVnaW4gKyBzdGF0ZV9sZW5ndGgsIHN0YXRlLndvcmRzICsgT3JkZXIoKSAtIDEgLSBzdGF0ZV9sZW5ndGgpOworICByZXR1cm4gRnVsbFNjb3JlKHN0YXRlLCBuZXdfd29yZCwgb3V0X3N0YXRlKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbnAKK30gLy8gbmFtZXNwYWNlIGxtCmRpZmYgLS1naXQgYS9zcmMva2VubG0vbG0vd3JhcHBlcnMvbnBsbS5oaCBiL3NyYy9rZW5sbS9sbS93cmFwcGVycy9ucGxtLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYjM4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vbG0vd3JhcHBlcnMvbnBsbS5oaApAQCAtMCwwICsxLDg1IEBACisjaWZuZGVmIExNX1dSQVBQRVJTX05QTE1fSAorI2RlZmluZSBMTV9XUkFQUEVSU19OUExNX0gKKworI2luY2x1ZGUgImxtL2ZhY2FkZS5oaCIKKyNpbmNsdWRlICJsbS9tYXhfb3JkZXIuaGgiCisjaW5jbHVkZSAidXRpbC9zdHJpbmdfcGllY2UuaGgiCisKKyNpbmNsdWRlIDxib29zdC90aHJlYWQvdHNzLmhwcD4KKyNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KKworLyogV3JhcHBlciB0byBOUExNICJieSBBc2hpc2ggVmFzd2FuaSwgd2l0aCBjb250cmlidXRpb25zIGZyb20gRGF2aWQgQ2hpYW5nCisgKiBhbmQgVmljdG9yaWEgRm9zc3VtLiIKKyAqIGh0dHA6Ly9ubGcuaXNpLmVkdS9zb2Z0d2FyZS9ucGxtLworICovCisKK25hbWVzcGFjZSBucGxtIHsKK2NsYXNzIHZvY2FidWxhcnk7CitjbGFzcyBuZXVyYWxMTTsKK30gLy8gbmFtZXNwYWNlIG5wbG0KKworbmFtZXNwYWNlIGxtIHsKK25hbWVzcGFjZSBucCB7CisKK2NsYXNzIFZvY2FidWxhcnkgOiBwdWJsaWMgYmFzZTo6Vm9jYWJ1bGFyeSB7CisgIHB1YmxpYzoKKyAgICBWb2NhYnVsYXJ5KGNvbnN0IG5wbG06OnZvY2FidWxhcnkgJnZvY2FiKTsKKworICAgIH5Wb2NhYnVsYXJ5KCk7CisKKyAgICBXb3JkSW5kZXggSW5kZXgoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgY29uc3Q7CisKKyAgICAvLyBUT0RPOiBsb2JieSB0aGVtIHRvIHN1cHBvcnQgU3RyaW5nUGllY2UKKyAgICBXb3JkSW5kZXggSW5kZXgoY29uc3QgU3RyaW5nUGllY2UgJnN0cikgY29uc3QgeworICAgICAgcmV0dXJuIEluZGV4KHN0ZDo6c3RyaW5nKHN0ci5kYXRhKCksIHN0ci5zaXplKCkpKTsKKyAgICB9CisKKyAgICBsbTo6V29yZEluZGV4IE51bGxXb3JkKCkgY29uc3QgeyByZXR1cm4gbnVsbF93b3JkXzsgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgbnBsbTo6dm9jYWJ1bGFyeSAmdm9jYWJfOworCisgICAgY29uc3QgbG06OldvcmRJbmRleCBudWxsX3dvcmRfOworfTsKKworLy8gU29ycnkgZm9yIGltcG9zaW5nIG15IGxpbWl0YXRpb25zIG9uIHlvdXIgY29kZS4KKyNkZWZpbmUgTlBMTV9NQVhfT1JERVIgNworCitzdHJ1Y3QgU3RhdGUgeworICBXb3JkSW5kZXggd29yZHNbTlBMTV9NQVhfT1JERVIgLSAxXTsKK307CisKK2NsYXNzIEJhY2tlbmQ7CisKK2NsYXNzIE1vZGVsIDogcHVibGljIGxtOjpiYXNlOjpNb2RlbEZhY2FkZTxNb2RlbCwgU3RhdGUsIFZvY2FidWxhcnk+IHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIGxtOjpiYXNlOjpNb2RlbEZhY2FkZTxNb2RlbCwgU3RhdGUsIFZvY2FidWxhcnk+IFA7CisKKyAgcHVibGljOgorICAgIC8vIERvZXMgdGhpcyBsb29rIGxpa2UgYW4gTlBMTT8KKyAgICBzdGF0aWMgYm9vbCBSZWNvZ25pemUoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGUpOworCisgICAgZXhwbGljaXQgTW9kZWwoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGUsIHN0ZDo6c2l6ZV90IGNhY2hlX3NpemUgPSAxIDw8IDIwKTsKKworICAgIH5Nb2RlbCgpOworCisgICAgRnVsbFNjb3JlUmV0dXJuIEZ1bGxTY29yZShjb25zdCBTdGF0ZSAmZnJvbSwgY29uc3QgV29yZEluZGV4IG5ld193b3JkLCBTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdDsKKworICAgIEZ1bGxTY29yZVJldHVybiBGdWxsU2NvcmVGb3Jnb3RTdGF0ZShjb25zdCBXb3JkSW5kZXggKmNvbnRleHRfcmJlZ2luLCBjb25zdCBXb3JkSW5kZXggKmNvbnRleHRfcmVuZCwgY29uc3QgV29yZEluZGV4IG5ld193b3JkLCBTdGF0ZSAmb3V0X3N0YXRlKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIGJvb3N0OjpzY29wZWRfcHRyPG5wbG06Om5ldXJhbExNPiBiYXNlX2luc3RhbmNlXzsKKworICAgIG11dGFibGUgYm9vc3Q6OnRocmVhZF9zcGVjaWZpY19wdHI8QmFja2VuZD4gYmFja2VuZF87CisKKyAgICBWb2NhYnVsYXJ5IHZvY2FiXzsKKworICAgIGxtOjpXb3JkSW5kZXggbnVsbF93b3JkXzsKKworICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGNhY2hlX3NpemVfOworfTsKKworfSAvLyBuYW1lc3BhY2UgbnAKK30gLy8gbmFtZXNwYWNlIGxtCisKKyNlbmRpZiAvLyBMTV9XUkFQUEVSU19OUExNX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS9weXRob24vX2tlbmxtLnB4ZCBiL3NyYy9rZW5sbS9weXRob24vX2tlbmxtLnB4ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGMwMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3B5dGhvbi9fa2VubG0ucHhkCkBAIC0wLDAgKzEsMzMgQEAKK2NkZWYgZXh0ZXJuIGZyb20gImxtL3dvcmRfaW5kZXguaGgiIG5hbWVzcGFjZSAibG0iOgorICAgIGN0eXBlZGVmIHVuc2lnbmVkIFdvcmRJbmRleAorCitjZGVmIGV4dGVybiBmcm9tICJsbS9yZXR1cm4uaGgiIG5hbWVzcGFjZSAibG0iOgorICAgIGNkZWYgc3RydWN0IEZ1bGxTY29yZVJldHVybjoKKyAgICAgICAgZmxvYXQgcHJvYgorICAgICAgICB1bnNpZ25lZCBjaGFyIG5ncmFtX2xlbmd0aAorCitjZGVmIGV4dGVybiBmcm9tICJsbS9zdGF0ZS5oaCIgbmFtZXNwYWNlICJsbTo6bmdyYW0iOgorICAgIGNkZWYgY3BwY2xhc3MgU3RhdGUgOgorICAgICAgICBpbnQgQ29tcGFyZShjb25zdCBTdGF0ZSAmb3RoZXIpIGNvbnN0CisKKyAgICBpbnQgaGFzaF92YWx1ZShjb25zdCBTdGF0ZSAmc3RhdGUpIAorCitjZGVmIGV4dGVybiBmcm9tICJsbS92aXJ0dWFsX2ludGVyZmFjZS5oaCIgbmFtZXNwYWNlICJsbTo6YmFzZSI6CisgICAgY2RlZiBjcHBjbGFzcyBWb2NhYnVsYXJ5OgorICAgICAgICBXb3JkSW5kZXggSW5kZXgoY2hhciopCisgICAgICAgIFdvcmRJbmRleCBCZWdpblNlbnRlbmNlKCkgCisgICAgICAgIFdvcmRJbmRleCBFbmRTZW50ZW5jZSgpCisgICAgICAgIFdvcmRJbmRleCBOb3RGb3VuZCgpCisKKyAgICBjdHlwZWRlZiBWb2NhYnVsYXJ5IGNvbnN0X1ZvY2FidWxhcnkgImNvbnN0IGxtOjpiYXNlOjpWb2NhYnVsYXJ5IgorCisgICAgY2RlZiBjcHBjbGFzcyBNb2RlbDoKKyAgICAgICAgdm9pZCBCZWdpblNlbnRlbmNlV3JpdGUodm9pZCAqKQorICAgICAgICB2b2lkIE51bGxDb250ZXh0V3JpdGUodm9pZCAqKQorICAgICAgICB1bnNpZ25lZCBpbnQgT3JkZXIoKQorICAgICAgICBjb25zdF9Wb2NhYnVsYXJ5JiBCYXNlVm9jYWJ1bGFyeSgpCisgICAgICAgIGZsb2F0IEJhc2VTY29yZSh2b2lkICppbl9zdGF0ZSwgV29yZEluZGV4IG5ld193b3JkLCB2b2lkICpvdXRfc3RhdGUpCisgICAgICAgIEZ1bGxTY29yZVJldHVybiBCYXNlRnVsbFNjb3JlKHZvaWQgKmluX3N0YXRlLCBXb3JkSW5kZXggbmV3X3dvcmQsIHZvaWQgKm91dF9zdGF0ZSkKKworY2RlZiBleHRlcm4gZnJvbSAibG0vbW9kZWwuaGgiIG5hbWVzcGFjZSAibG06Om5ncmFtIjoKKyAgICBjZGVmIE1vZGVsICpMb2FkVmlydHVhbChjaGFyICopIGV4Y2VwdCArCmRpZmYgLS1naXQgYS9zcmMva2VubG0vcHl0aG9uL2V4YW1wbGUucHkgYi9zcmMva2VubG0vcHl0aG9uL2V4YW1wbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExOGYzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS9weXRob24vZXhhbXBsZS5weQpAQCAtMCwwICsxLDI4IEBACitpbXBvcnQgb3MKK2ltcG9ydCBrZW5sbQorCitMTSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAnLi4nLCAnbG0nLCAndGVzdC5hcnBhJykKK21vZGVsID0ga2VubG0uTGFuZ3VhZ2VNb2RlbChMTSkKK3ByaW50KCd7MH0tZ3JhbSBtb2RlbCcuZm9ybWF0KG1vZGVsLm9yZGVyKSkKKworc2VudGVuY2UgPSAnbGFuZ3VhZ2UgbW9kZWxpbmcgaXMgZnVuIC4nCitwcmludChzZW50ZW5jZSkKK3ByaW50KG1vZGVsLnNjb3JlKHNlbnRlbmNlKSkKKworIyBDaGVjayB0aGF0IHRvdGFsIGZ1bGwgc2NvcmUgPSBkaXJlY3Qgc2NvcmUKK2RlZiBzY29yZShzKToKKyAgICByZXR1cm4gc3VtKHByb2IgZm9yIHByb2IsIF8sIF8gaW4gbW9kZWwuZnVsbF9zY29yZXMocykpCisKK2Fzc2VydCAoYWJzKHNjb3JlKHNlbnRlbmNlKSAtIG1vZGVsLnNjb3JlKHNlbnRlbmNlKSkgPCAxZS0zKQorCisjIFNob3cgc2NvcmVzIGFuZCBuLWdyYW0gbWF0Y2hlcword29yZHMgPSBbJzxzPiddICsgc2VudGVuY2Uuc3BsaXQoKSArIFsnPC9zPiddCitmb3IgaSwgKHByb2IsIGxlbmd0aCwgb292KSBpbiBlbnVtZXJhdGUobW9kZWwuZnVsbF9zY29yZXMoc2VudGVuY2UpKToKKyAgICBwcmludCgnezB9IHsxfTogezJ9Jy5mb3JtYXQocHJvYiwgbGVuZ3RoLCAnICcuam9pbih3b3Jkc1tpKzItbGVuZ3RoOmkrMl0pKSkKKyAgICBpZiBvb3Y6CisgICAgICAgIHByaW50KCdcdCJ7MH0iIGlzIGFuIE9PVicuZm9ybWF0KHdvcmRzW2krMV0pKQorCisjIEZpbmQgb3V0LW9mLXZvY2FidWxhcnkgd29yZHMKK2ZvciB3IGluIHdvcmRzOgorICAgIGlmIG5vdCB3IGluIG1vZGVsOgorICAgICAgICBwcmludCgnInswfSIgaXMgYW4gT09WJy5mb3JtYXQodykpCmRpZmYgLS1naXQgYS9zcmMva2VubG0vcHl0aG9uL2tlbmxtLmNwcCBiL3NyYy9rZW5sbS9weXRob24va2VubG0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZjQ3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vcHl0aG9uL2tlbmxtLmNwcApAQCAtMCwwICsxLDczNzkgQEAKKy8qIEdlbmVyYXRlZCBieSBDeXRob24gMC4yMiAqLworCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpZm5kZWYgQ1lUSE9OX1VTRV9QWUxPTkdfSU5URVJOQUxTCisjaWZkZWYgUFlMT05HX0JJVFNfSU5fRElHSVQKKyNkZWZpbmUgQ1lUSE9OX1VTRV9QWUxPTkdfSU5URVJOQUxTIDAKKyNlbHNlCisjaW5jbHVkZSAicHljb25maWcuaCIKKyNpZmRlZiBQWUxPTkdfQklUU19JTl9ESUdJVAorI2RlZmluZSBDWVRIT05fVVNFX1BZTE9OR19JTlRFUk5BTFMgMQorI2Vsc2UKKyNkZWZpbmUgQ1lUSE9OX1VTRV9QWUxPTkdfSU5URVJOQUxTIDAKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpZm5kZWYgUHlfUFlUSE9OX0gKKyAgICAjZXJyb3IgUHl0aG9uIGhlYWRlcnMgbmVlZGVkIHRvIGNvbXBpbGUgQyBleHRlbnNpb25zLCBwbGVhc2UgaW5zdGFsbCBkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIFB5dGhvbi4KKyNlbGlmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA2MDAwMCB8fCAoMHgwMzAwMDAwMCA8PSBQWV9WRVJTSU9OX0hFWCAmJiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMjAwMDApCisgICAgI2Vycm9yIEN5dGhvbiByZXF1aXJlcyBQeXRob24gMi42KyBvciBQeXRob24gMy4yKy4KKyNlbHNlCisjZGVmaW5lIENZVEhPTl9BQkkgIjBfMjIiCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaWZuZGVmIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKHR5cGUsIG1lbWJlcikgKCAoc2l6ZV90KSAmICgodHlwZSopMCkgLT4gbWVtYmVyICkKKyNlbmRpZgorI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChNU19XSU5ET1dTKQorICAjaWZuZGVmIF9fc3RkY2FsbAorICAgICNkZWZpbmUgX19zdGRjYWxsCisgICNlbmRpZgorICAjaWZuZGVmIF9fY2RlY2wKKyAgICAjZGVmaW5lIF9fY2RlY2wKKyAgI2VuZGlmCisgICNpZm5kZWYgX19mYXN0Y2FsbAorICAgICNkZWZpbmUgX19mYXN0Y2FsbAorICAjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBETF9JTVBPUlQKKyAgI2RlZmluZSBETF9JTVBPUlQodCkgdAorI2VuZGlmCisjaWZuZGVmIERMX0VYUE9SVAorICAjZGVmaW5lIERMX0VYUE9SVCh0KSB0CisjZW5kaWYKKyNpZm5kZWYgUFlfTE9OR19MT05HCisgICNkZWZpbmUgUFlfTE9OR19MT05HIExPTkdfTE9ORworI2VuZGlmCisjaWZuZGVmIFB5X0hVR0VfVkFMCisgICNkZWZpbmUgUHlfSFVHRV9WQUwgSFVHRV9WQUwKKyNlbmRpZgorI2lmZGVmIFBZUFlfVkVSU0lPTgorI2RlZmluZSBDWVRIT05fQ09NUElMSU5HX0lOX1BZUFkgMQorI2RlZmluZSBDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04gMAorI2Vsc2UKKyNkZWZpbmUgQ1lUSE9OX0NPTVBJTElOR19JTl9QWVBZIDAKKyNkZWZpbmUgQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OIDEKKyNlbmRpZgorI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fUFlQWSAmJiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNzA2MDAgJiYgIWRlZmluZWQoUHlfT3B0aW1pemVGbGFnKQorI2RlZmluZSBQeV9PcHRpbWl6ZUZsYWcgMAorI2VuZGlmCisjZGVmaW5lIF9fUFlYX0JVSUxEX1BZX1NTSVpFX1QgIm4iCisjZGVmaW5lIENZVEhPTl9GT1JNQVRfU1NJWkVfVCAieiIKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICAjZGVmaW5lIF9fUHl4X0JVSUxUSU5fTU9EVUxFX05BTUUgIl9fYnVpbHRpbl9fIgorICAjZGVmaW5lIF9fUHl4X1B5Q29kZV9OZXcoYSwgaywgbCwgcywgZiwgY29kZSwgYywgbiwgdiwgZnYsIGNlbGwsIGZuLCBuYW1lLCBmbGluZSwgbG5vcykgXAorICAgICAgICAgIFB5Q29kZV9OZXcoYStrLCBsLCBzLCBmLCBjb2RlLCBjLCBuLCB2LCBmdiwgY2VsbCwgZm4sIG5hbWUsIGZsaW5lLCBsbm9zKQorICAjZGVmaW5lIF9fUHl4X0RlZmF1bHRDbGFzc1R5cGUgUHlDbGFzc19UeXBlCisjZWxzZQorICAjZGVmaW5lIF9fUHl4X0JVSUxUSU5fTU9EVUxFX05BTUUgImJ1aWx0aW5zIgorICAjZGVmaW5lIF9fUHl4X1B5Q29kZV9OZXcoYSwgaywgbCwgcywgZiwgY29kZSwgYywgbiwgdiwgZnYsIGNlbGwsIGZuLCBuYW1lLCBmbGluZSwgbG5vcykgXAorICAgICAgICAgIFB5Q29kZV9OZXcoYSwgaywgbCwgcywgZiwgY29kZSwgYywgbiwgdiwgZnYsIGNlbGwsIGZuLCBuYW1lLCBmbGluZSwgbG5vcykKKyAgI2RlZmluZSBfX1B5eF9EZWZhdWx0Q2xhc3NUeXBlIFB5VHlwZV9UeXBlCisjZW5kaWYKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgI2RlZmluZSBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgMAorICAjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9JTkRFWCAwCisgICNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiAwCisjZW5kaWYKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwNDAwYTEgJiYgIWRlZmluZWQoUHlfVFBGTEFHU19IQVZFX0ZJTkFMSVpFKQorICAjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9GSU5BTElaRSAwCisjZW5kaWYKKyNpZiBQWV9WRVJTSU9OX0hFWCA+IDB4MDMwMzAwMDAgJiYgZGVmaW5lZChQeVVuaWNvZGVfS0lORCkKKyAgI2RlZmluZSBDWVRIT05fUEVQMzkzX0VOQUJMRUQgMQorICAjZGVmaW5lIF9fUHl4X1B5VW5pY29kZV9SRUFEWShvcCkgICAgICAgKGxpa2VseShQeVVuaWNvZGVfSVNfUkVBRFkob3ApKSA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogX1B5VW5pY29kZV9SZWFkeSgoUHlPYmplY3QgKikob3ApKSkKKyAgI2RlZmluZSBfX1B5eF9QeVVuaWNvZGVfR0VUX0xFTkdUSCh1KSAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHUpCisgICNkZWZpbmUgX19QeXhfUHlVbmljb2RlX1JFQURfQ0hBUih1LCBpKSBQeVVuaWNvZGVfUkVBRF9DSEFSKHUsIGkpCisgICNkZWZpbmUgX19QeXhfUHlVbmljb2RlX0tJTkQodSkgICAgICAgICBQeVVuaWNvZGVfS0lORCh1KQorICAjZGVmaW5lIF9fUHl4X1B5VW5pY29kZV9EQVRBKHUpICAgICAgICAgUHlVbmljb2RlX0RBVEEodSkKKyAgI2RlZmluZSBfX1B5eF9QeVVuaWNvZGVfUkVBRChrLCBkLCBpKSAgIFB5VW5pY29kZV9SRUFEKGssIGQsIGkpCisjZWxzZQorICAjZGVmaW5lIENZVEhPTl9QRVAzOTNfRU5BQkxFRCAwCisgICNkZWZpbmUgX19QeXhfUHlVbmljb2RlX1JFQURZKG9wKSAgICAgICAoMCkKKyAgI2RlZmluZSBfX1B5eF9QeVVuaWNvZGVfR0VUX0xFTkdUSCh1KSAgIFB5VW5pY29kZV9HRVRfU0laRSh1KQorICAjZGVmaW5lIF9fUHl4X1B5VW5pY29kZV9SRUFEX0NIQVIodSwgaSkgKChQeV9VQ1M0KShQeVVuaWNvZGVfQVNfVU5JQ09ERSh1KVtpXSkpCisgICNkZWZpbmUgX19QeXhfUHlVbmljb2RlX0tJTkQodSkgICAgICAgICAoc2l6ZW9mKFB5X1VOSUNPREUpKQorICAjZGVmaW5lIF9fUHl4X1B5VW5pY29kZV9EQVRBKHUpICAgICAgICAgKCh2b2lkKilQeVVuaWNvZGVfQVNfVU5JQ09ERSh1KSkKKyAgI2RlZmluZSBfX1B5eF9QeVVuaWNvZGVfUkVBRChrLCBkLCBpKSAgICgodm9pZCkoayksIChQeV9VQ1M0KSgoKFB5X1VOSUNPREUqKWQpW2ldKSkKKyNlbmRpZgorI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fUFlQWQorICAjZGVmaW5lIF9fUHl4X1B5VW5pY29kZV9Db25jYXQoYSwgYikgICAgICBQeU51bWJlcl9BZGQoYSwgYikKKyAgI2RlZmluZSBfX1B5eF9QeVVuaWNvZGVfQ29uY2F0U2FmZShhLCBiKSAgUHlOdW1iZXJfQWRkKGEsIGIpCisgICNkZWZpbmUgX19QeXhfUHlGcm96ZW5TZXRfU2l6ZShzKSAgICAgICAgIFB5T2JqZWN0X1NpemUocykKKyNlbHNlCisgICNkZWZpbmUgX19QeXhfUHlVbmljb2RlX0NvbmNhdChhLCBiKSAgICAgIFB5VW5pY29kZV9Db25jYXQoYSwgYikKKyAgI2RlZmluZSBfX1B5eF9QeVVuaWNvZGVfQ29uY2F0U2FmZShhLCBiKSAgKCh1bmxpa2VseSgoYSkgPT0gUHlfTm9uZSkgfHwgdW5saWtlbHkoKGIpID09IFB5X05vbmUpKSA/IFwKKyAgICAgIFB5TnVtYmVyX0FkZChhLCBiKSA6IF9fUHl4X1B5VW5pY29kZV9Db25jYXQoYSwgYikpCisgICNkZWZpbmUgX19QeXhfUHlGcm96ZW5TZXRfU2l6ZShzKSAgICAgICAgIFB5U2V0X1NpemUocykKKyNlbmRpZgorI2RlZmluZSBfX1B5eF9QeVN0cmluZ19Gb3JtYXRTYWZlKGEsIGIpICAgKCh1bmxpa2VseSgoYSkgPT0gUHlfTm9uZSkpID8gUHlOdW1iZXJfUmVtYWluZGVyKGEsIGIpIDogX19QeXhfUHlTdHJpbmdfRm9ybWF0KGEsIGIpKQorI2RlZmluZSBfX1B5eF9QeVVuaWNvZGVfRm9ybWF0U2FmZShhLCBiKSAgKCh1bmxpa2VseSgoYSkgPT0gUHlfTm9uZSkpID8gUHlOdW1iZXJfUmVtYWluZGVyKGEsIGIpIDogUHlVbmljb2RlX0Zvcm1hdChhLCBiKSkKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgI2RlZmluZSBfX1B5eF9QeVN0cmluZ19Gb3JtYXQoYSwgYikgIFB5VW5pY29kZV9Gb3JtYXQoYSwgYikKKyNlbHNlCisgICNkZWZpbmUgX19QeXhfUHlTdHJpbmdfRm9ybWF0KGEsIGIpICBQeVN0cmluZ19Gb3JtYXQoYSwgYikKKyNlbmRpZgorI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICAjZGVmaW5lIFB5QmFzZVN0cmluZ19UeXBlICAgICAgICAgICAgUHlVbmljb2RlX1R5cGUKKyAgI2RlZmluZSBQeVN0cmluZ09iamVjdCAgICAgICAgICAgICAgIFB5VW5pY29kZU9iamVjdAorICAjZGVmaW5lIFB5U3RyaW5nX1R5cGUgICAgICAgICAgICAgICAgUHlVbmljb2RlX1R5cGUKKyAgI2RlZmluZSBQeVN0cmluZ19DaGVjayAgICAgICAgICAgICAgIFB5VW5pY29kZV9DaGVjaworICAjZGVmaW5lIFB5U3RyaW5nX0NoZWNrRXhhY3QgICAgICAgICAgUHlVbmljb2RlX0NoZWNrRXhhY3QKKyNlbmRpZgorI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICAjZGVmaW5lIF9fUHl4X1B5QmFzZVN0cmluZ19DaGVjayhvYmopIFB5VW5pY29kZV9DaGVjayhvYmopCisgICNkZWZpbmUgX19QeXhfUHlCYXNlU3RyaW5nX0NoZWNrRXhhY3Qob2JqKSBQeVVuaWNvZGVfQ2hlY2tFeGFjdChvYmopCisjZWxzZQorICAjZGVmaW5lIF9fUHl4X1B5QmFzZVN0cmluZ19DaGVjayhvYmopIChQeVN0cmluZ19DaGVjayhvYmopIHx8IFB5VW5pY29kZV9DaGVjayhvYmopKQorICAjZGVmaW5lIF9fUHl4X1B5QmFzZVN0cmluZ19DaGVja0V4YWN0KG9iaikgKFB5U3RyaW5nX0NoZWNrRXhhY3Qob2JqKSB8fCBQeVVuaWNvZGVfQ2hlY2tFeGFjdChvYmopKQorI2VuZGlmCisjaWZuZGVmIFB5U2V0X0NoZWNrRXhhY3QKKyAgI2RlZmluZSBQeVNldF9DaGVja0V4YWN0KG9iaikgICAgICAgIChQeV9UWVBFKG9iaikgPT0gJlB5U2V0X1R5cGUpCisjZW5kaWYKKyNkZWZpbmUgX19QeXhfVHlwZUNoZWNrKG9iaiwgdHlwZSkgUHlPYmplY3RfVHlwZUNoZWNrKG9iaiwgKFB5VHlwZU9iamVjdCAqKXR5cGUpCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisgICNkZWZpbmUgUHlJbnRPYmplY3QgICAgICAgICAgICAgICAgICBQeUxvbmdPYmplY3QKKyAgI2RlZmluZSBQeUludF9UeXBlICAgICAgICAgICAgICAgICAgIFB5TG9uZ19UeXBlCisgICNkZWZpbmUgUHlJbnRfQ2hlY2sob3ApICAgICAgICAgICAgICBQeUxvbmdfQ2hlY2sob3ApCisgICNkZWZpbmUgUHlJbnRfQ2hlY2tFeGFjdChvcCkgICAgICAgICBQeUxvbmdfQ2hlY2tFeGFjdChvcCkKKyAgI2RlZmluZSBQeUludF9Gcm9tU3RyaW5nICAgICAgICAgICAgIFB5TG9uZ19Gcm9tU3RyaW5nCisgICNkZWZpbmUgUHlJbnRfRnJvbVVuaWNvZGUgICAgICAgICAgICBQeUxvbmdfRnJvbVVuaWNvZGUKKyAgI2RlZmluZSBQeUludF9Gcm9tTG9uZyAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZworICAjZGVmaW5lIFB5SW50X0Zyb21TaXplX3QgICAgICAgICAgICAgUHlMb25nX0Zyb21TaXplX3QKKyAgI2RlZmluZSBQeUludF9Gcm9tU3NpemVfdCAgICAgICAgICAgIFB5TG9uZ19Gcm9tU3NpemVfdAorICAjZGVmaW5lIFB5SW50X0FzTG9uZyAgICAgICAgICAgICAgICAgUHlMb25nX0FzTG9uZworICAjZGVmaW5lIFB5SW50X0FTX0xPTkcgICAgICAgICAgICAgICAgUHlMb25nX0FTX0xPTkcKKyAgI2RlZmluZSBQeUludF9Bc1NzaXplX3QgICAgICAgICAgICAgIFB5TG9uZ19Bc1NzaXplX3QKKyAgI2RlZmluZSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sgICAgIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2sKKyAgI2RlZmluZSBQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrCisgICNkZWZpbmUgUHlOdW1iZXJfSW50ICAgICAgICAgICAgICAgICBQeU51bWJlcl9Mb25nCisjZW5kaWYKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgI2RlZmluZSBQeUJvb2xPYmplY3QgICAgICAgICAgICAgICAgIFB5TG9uZ09iamVjdAorI2VuZGlmCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzICYmIENZVEhPTl9DT01QSUxJTkdfSU5fUFlQWQorICAjaWZuZGVmIFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nCisgICAgI2RlZmluZSBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZyhzKSBQeVVuaWNvZGVfRnJvbVN0cmluZyhzKQorICAjZW5kaWYKKyNlbmRpZgorI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAyMDBBNAorICB0eXBlZGVmIGxvbmcgUHlfaGFzaF90OworICAjZGVmaW5lIF9fUHl4X1B5SW50X0Zyb21IYXNoX3QgUHlJbnRfRnJvbUxvbmcKKyAgI2RlZmluZSBfX1B5eF9QeUludF9Bc0hhc2hfdCAgIFB5SW50X0FzTG9uZworI2Vsc2UKKyAgI2RlZmluZSBfX1B5eF9QeUludF9Gcm9tSGFzaF90IFB5SW50X0Zyb21Tc2l6ZV90CisgICNkZWZpbmUgX19QeXhfUHlJbnRfQXNIYXNoX3QgICBQeUludF9Bc1NzaXplX3QKKyNlbmRpZgorI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICAjZGVmaW5lIF9fUHl4X1B5TWV0aG9kX05ldyhmdW5jLCBzZWxmLCBrbGFzcykgKChzZWxmKSA/IFB5TWV0aG9kX05ldyhmdW5jLCBzZWxmKSA6IFB5SW5zdGFuY2VNZXRob2RfTmV3KGZ1bmMpKQorI2Vsc2UKKyAgI2RlZmluZSBfX1B5eF9QeU1ldGhvZF9OZXcoZnVuYywgc2VsZiwga2xhc3MpIFB5TWV0aG9kX05ldyhmdW5jLCBzZWxmLCBrbGFzcykKKyNlbmRpZgorI2lmbmRlZiBDWVRIT05fSU5MSU5FCisgICNpZiBkZWZpbmVkKF9fR05VQ19fKQorICAgICNkZWZpbmUgQ1lUSE9OX0lOTElORSBfX2lubGluZV9fCisgICNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgI2RlZmluZSBDWVRIT05fSU5MSU5FIF9faW5saW5lCisgICNlbGlmIGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorICAgICNkZWZpbmUgQ1lUSE9OX0lOTElORSBpbmxpbmUKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIENZVEhPTl9JTkxJTkUKKyAgI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgQ1lUSE9OX1JFU1RSSUNUCisgICNpZiBkZWZpbmVkKF9fR05VQ19fKQorICAgICNkZWZpbmUgQ1lUSE9OX1JFU1RSSUNUIF9fcmVzdHJpY3RfXworICAjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNDAwCisgICAgI2RlZmluZSBDWVRIT05fUkVTVFJJQ1QgX19yZXN0cmljdAorICAjZWxpZiBkZWZpbmVkIChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyAgICAjZGVmaW5lIENZVEhPTl9SRVNUUklDVCByZXN0cmljdAorICAjZWxzZQorICAgICNkZWZpbmUgQ1lUSE9OX1JFU1RSSUNUCisgICNlbmRpZgorI2VuZGlmCisjaWZkZWYgTkFOCisjZGVmaW5lIF9fUFlYX05BTigpICgoZmxvYXQpIE5BTikKKyNlbHNlCitzdGF0aWMgQ1lUSE9OX0lOTElORSBmbG9hdCBfX1BZWF9OQU4oKSB7CisgIC8qIEluaXRpYWxpemUgTmFOLiBUaGUgc2lnbiBpcyBpcnJlbGV2YW50LCBhbiBleHBvbmVudCB3aXRoIGFsbCBiaXRzIDEgYW5kCisgICBhIG5vbnplcm8gbWFudGlzc2EgbWVhbnMgTmFOLiBJZiB0aGUgZmlyc3QgYml0IGluIHRoZSBtYW50aXNzYSBpcyAxLCBpdCBpcworICAgYSBxdWlldCBOYU4uICovCisgIGZsb2F0IHZhbHVlOworICBtZW1zZXQoJnZhbHVlLCAweEZGLCBzaXplb2YodmFsdWUpKTsKKyAgcmV0dXJuIHZhbHVlOworfQorI2VuZGlmCisjZGVmaW5lIF9fUHl4X3ZvaWRfdG9fTm9uZSh2b2lkX3Jlc3VsdCkgKHZvaWRfcmVzdWx0LCBQeV9JTkNSRUYoUHlfTm9uZSksIFB5X05vbmUpCisjaWZkZWYgX19jcGx1c3BsdXMKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIF9fUHl4X2NhbGxfZGVzdHJ1Y3RvcihUKiB4KSB7CisgICAgeC0+flQoKTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBfX1B5eF9GYWtlUmVmZXJlbmNlIHsKKyAgcHVibGljOgorICAgIF9fUHl4X0Zha2VSZWZlcmVuY2UoKSA6IHB0cihOVUxMKSB7IH0KKyAgICBfX1B5eF9GYWtlUmVmZXJlbmNlKFQmIHJlZikgOiBwdHIoJnJlZikgeyB9CisgICAgVCAqb3BlcmF0b3ItPigpIHsgcmV0dXJuIHB0cjsgfQorICAgIG9wZXJhdG9yIFQmKCkgeyByZXR1cm4gKnB0cjsgfQorICBwcml2YXRlOgorICAgIFQgKnB0cjsKK307CisjZW5kaWYKKworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisgICNkZWZpbmUgX19QeXhfUHlOdW1iZXJfRGl2aWRlKHgseSkgICAgICAgICBQeU51bWJlcl9UcnVlRGl2aWRlKHgseSkKKyAgI2RlZmluZSBfX1B5eF9QeU51bWJlcl9JblBsYWNlRGl2aWRlKHgseSkgIFB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlKHgseSkKKyNlbHNlCisgICNkZWZpbmUgX19QeXhfUHlOdW1iZXJfRGl2aWRlKHgseSkgICAgICAgICBQeU51bWJlcl9EaXZpZGUoeCx5KQorICAjZGVmaW5lIF9fUHl4X1B5TnVtYmVyX0luUGxhY2VEaXZpZGUoeCx5KSAgUHlOdW1iZXJfSW5QbGFjZURpdmlkZSh4LHkpCisjZW5kaWYKKworI2lmbmRlZiBfX1BZWF9FWFRFUk5fQworICAjaWZkZWYgX19jcGx1c3BsdXMKKyAgICAjZGVmaW5lIF9fUFlYX0VYVEVSTl9DIGV4dGVybiAiQyIKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIF9fUFlYX0VYVEVSTl9DIGV4dGVybgorICAjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChNU19XSU5ET1dTKQorI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUworI2VuZGlmCisjaW5jbHVkZSA8bWF0aC5oPgorI2RlZmluZSBfX1BZWF9IQVZFX19rZW5sbQorI2RlZmluZSBfX1BZWF9IQVZFX0FQSV9fa2VubG0KKyNpbmNsdWRlICJsbS93b3JkX2luZGV4LmhoIgorI2luY2x1ZGUgImxtL3JldHVybi5oaCIKKyNpbmNsdWRlICJsbS9zdGF0ZS5oaCIKKyNpbmNsdWRlICJsbS92aXJ0dWFsX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJsbS9tb2RlbC5oaCIKKyNpbmNsdWRlICJpb3MiCisjaW5jbHVkZSAibmV3IgorI2luY2x1ZGUgInN0ZGV4Y2VwdCIKKyNpbmNsdWRlICJ0eXBlaW5mbyIKKyNpZmRlZiBfT1BFTk1QCisjaW5jbHVkZSA8b21wLmg+CisjZW5kaWYgLyogX09QRU5NUCAqLworCisjaWZkZWYgUFlSRVhfV0lUSE9VVF9BU1NFUlRJT05TCisjZGVmaW5lIENZVEhPTl9XSVRIT1VUX0FTU0VSVElPTlMKKyNlbmRpZgorCisjaWZuZGVmIENZVEhPTl9VTlVTRUQKKyMgaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgICBpZiAhKGRlZmluZWQoX19jcGx1c3BsdXMpKSB8fCAoX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQpKQorIyAgICAgZGVmaW5lIENZVEhPTl9VTlVTRUQgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorIyAgIGVsc2UKKyMgICAgIGRlZmluZSBDWVRIT05fVU5VU0VECisjICAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkKF9fSUNDKSB8fCAoZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAhZGVmaW5lZChfTVNDX1ZFUikpCisjICAgZGVmaW5lIENZVEhPTl9VTlVTRUQgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorIyBlbHNlCisjICAgZGVmaW5lIENZVEhPTl9VTlVTRUQKKyMgZW5kaWYKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3Qge1B5T2JqZWN0ICoqcDsgY2hhciAqczsgY29uc3QgUHlfc3NpemVfdCBuOyBjb25zdCBjaGFyKiBlbmNvZGluZzsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGlzX3VuaWNvZGU7IGNvbnN0IGNoYXIgaXNfc3RyOyBjb25zdCBjaGFyIGludGVybjsgfSBfX1B5eF9TdHJpbmdUYWJFbnRyeTsKKworI2RlZmluZSBfX1BZWF9ERUZBVUxUX1NUUklOR19FTkNPRElOR19JU19BU0NJSSAwCisjZGVmaW5lIF9fUFlYX0RFRkFVTFRfU1RSSU5HX0VOQ09ESU5HX0lTX0RFRkFVTFQgMAorI2RlZmluZSBfX1BZWF9ERUZBVUxUX1NUUklOR19FTkNPRElORyAiIgorI2RlZmluZSBfX1B5eF9QeU9iamVjdF9Gcm9tU3RyaW5nIF9fUHl4X1B5Qnl0ZXNfRnJvbVN0cmluZworI2RlZmluZSBfX1B5eF9QeU9iamVjdF9Gcm9tU3RyaW5nQW5kU2l6ZSBfX1B5eF9QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplCisjZGVmaW5lIF9fUHl4X2ZpdHNfUHlfc3NpemVfdCh2LCB0eXBlLCBpc19zaWduZWQpICAoICAgIFwKKyAgICAoc2l6ZW9mKHR5cGUpIDwgc2l6ZW9mKFB5X3NzaXplX3QpKSAgfHwgICAgICAgICAgICAgXAorICAgIChzaXplb2YodHlwZSkgPiBzaXplb2YoUHlfc3NpemVfdCkgJiYgICAgICAgICAgICAgICBcCisgICAgICAgICAgbGlrZWx5KHYgPCAodHlwZSlQWV9TU0laRV9UX01BWCB8fCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgdiA9PSAodHlwZSlQWV9TU0laRV9UX01BWCkgICYmICAgICAgICAgXAorICAgICAgICAgICghaXNfc2lnbmVkIHx8IGxpa2VseSh2ID4gKHR5cGUpUFlfU1NJWkVfVF9NSU4gfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID09ICh0eXBlKVBZX1NTSVpFX1RfTUlOKSkpICB8fCAgXAorICAgIChzaXplb2YodHlwZSkgPT0gc2l6ZW9mKFB5X3NzaXplX3QpICYmICAgICAgICAgICAgICBcCisgICAgICAgICAgKGlzX3NpZ25lZCB8fCBsaWtlbHkodiA8ICh0eXBlKVBZX1NTSVpFX1RfTUFYIHx8ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9PSAodHlwZSlQWV9TU0laRV9UX01BWCkpKSAgKQorc3RhdGljIENZVEhPTl9JTkxJTkUgY2hhciogX19QeXhfUHlPYmplY3RfQXNTdHJpbmcoUHlPYmplY3QqKTsKK3N0YXRpYyBDWVRIT05fSU5MSU5FIGNoYXIqIF9fUHl4X1B5T2JqZWN0X0FzU3RyaW5nQW5kU2l6ZShQeU9iamVjdCosIFB5X3NzaXplX3QqIGxlbmd0aCk7CisjZGVmaW5lIF9fUHl4X1B5Qnl0ZUFycmF5X0Zyb21TdHJpbmcocykgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIqKXMsIHN0cmxlbigoY29uc3QgY2hhciopcykpCisjZGVmaW5lIF9fUHl4X1B5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKHMsIGwpIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKChjb25zdCBjaGFyKilzLCBsKQorI2RlZmluZSBfX1B5eF9QeUJ5dGVzX0Zyb21TdHJpbmcgICAgICAgIFB5Qnl0ZXNfRnJvbVN0cmluZworI2RlZmluZSBfX1B5eF9QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUKK3N0YXRpYyBDWVRIT05fSU5MSU5FIFB5T2JqZWN0KiBfX1B5eF9QeVVuaWNvZGVfRnJvbVN0cmluZyhjb25zdCBjaGFyKik7CisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKKyAgICAjZGVmaW5lIF9fUHl4X1B5U3RyX0Zyb21TdHJpbmcgICAgICAgIF9fUHl4X1B5Qnl0ZXNfRnJvbVN0cmluZworICAgICNkZWZpbmUgX19QeXhfUHlTdHJfRnJvbVN0cmluZ0FuZFNpemUgX19QeXhfUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZQorI2Vsc2UKKyAgICAjZGVmaW5lIF9fUHl4X1B5U3RyX0Zyb21TdHJpbmcgICAgICAgIF9fUHl4X1B5VW5pY29kZV9Gcm9tU3RyaW5nCisgICAgI2RlZmluZSBfX1B5eF9QeVN0cl9Gcm9tU3RyaW5nQW5kU2l6ZSBfX1B5eF9QeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUKKyNlbmRpZgorI2RlZmluZSBfX1B5eF9QeU9iamVjdF9Bc1NTdHJpbmcocykgICAgKChzaWduZWQgY2hhciopIF9fUHl4X1B5T2JqZWN0X0FzU3RyaW5nKHMpKQorI2RlZmluZSBfX1B5eF9QeU9iamVjdF9Bc1VTdHJpbmcocykgICAgKCh1bnNpZ25lZCBjaGFyKikgX19QeXhfUHlPYmplY3RfQXNTdHJpbmcocykpCisjZGVmaW5lIF9fUHl4X1B5T2JqZWN0X0Zyb21DU3RyaW5nKHMpICBfX1B5eF9QeU9iamVjdF9Gcm9tU3RyaW5nKChjb25zdCBjaGFyKilzKQorI2RlZmluZSBfX1B5eF9QeUJ5dGVzX0Zyb21DU3RyaW5nKHMpICAgX19QeXhfUHlCeXRlc19Gcm9tU3RyaW5nKChjb25zdCBjaGFyKilzKQorI2RlZmluZSBfX1B5eF9QeUJ5dGVBcnJheV9Gcm9tQ1N0cmluZyhzKSAgIF9fUHl4X1B5Qnl0ZUFycmF5X0Zyb21TdHJpbmcoKGNvbnN0IGNoYXIqKXMpCisjZGVmaW5lIF9fUHl4X1B5U3RyX0Zyb21DU3RyaW5nKHMpICAgICBfX1B5eF9QeVN0cl9Gcm9tU3RyaW5nKChjb25zdCBjaGFyKilzKQorI2RlZmluZSBfX1B5eF9QeVVuaWNvZGVfRnJvbUNTdHJpbmcocykgX19QeXhfUHlVbmljb2RlX0Zyb21TdHJpbmcoKGNvbnN0IGNoYXIqKXMpCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKK3N0YXRpYyBDWVRIT05fSU5MSU5FIHNpemVfdCBfX1B5eF9QeV9VTklDT0RFX3N0cmxlbihjb25zdCBQeV9VTklDT0RFICp1KQoreworICAgIGNvbnN0IFB5X1VOSUNPREUgKnVfZW5kID0gdTsKKyAgICB3aGlsZSAoKnVfZW5kKyspIDsKKyAgICByZXR1cm4gKHNpemVfdCkodV9lbmQgLSB1IC0gMSk7Cit9CisjZWxzZQorI2RlZmluZSBfX1B5eF9QeV9VTklDT0RFX3N0cmxlbiBQeV9VTklDT0RFX3N0cmxlbgorI2VuZGlmCisjZGVmaW5lIF9fUHl4X1B5VW5pY29kZV9Gcm9tVW5pY29kZSh1KSAgICAgICBQeVVuaWNvZGVfRnJvbVVuaWNvZGUodSwgX19QeXhfUHlfVU5JQ09ERV9zdHJsZW4odSkpCisjZGVmaW5lIF9fUHl4X1B5VW5pY29kZV9Gcm9tVW5pY29kZUFuZExlbmd0aCBQeVVuaWNvZGVfRnJvbVVuaWNvZGUKKyNkZWZpbmUgX19QeXhfUHlVbmljb2RlX0FzVW5pY29kZSAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VuaWNvZGUKKyNkZWZpbmUgX19QeXhfT3duZWRfUHlfTm9uZShiKSAoUHlfSU5DUkVGKFB5X05vbmUpLCBQeV9Ob25lKQorI2RlZmluZSBfX1B5eF9QeUJvb2xfRnJvbUxvbmcoYikgKChiKSA/IChQeV9JTkNSRUYoUHlfVHJ1ZSksIFB5X1RydWUpIDogKFB5X0lOQ1JFRihQeV9GYWxzZSksIFB5X0ZhbHNlKSkKK3N0YXRpYyBDWVRIT05fSU5MSU5FIGludCBfX1B5eF9QeU9iamVjdF9Jc1RydWUoUHlPYmplY3QqKTsKK3N0YXRpYyBDWVRIT05fSU5MSU5FIFB5T2JqZWN0KiBfX1B5eF9QeU51bWJlcl9JbnQoUHlPYmplY3QqIHgpOworc3RhdGljIENZVEhPTl9JTkxJTkUgUHlfc3NpemVfdCBfX1B5eF9QeUluZGV4X0FzU3NpemVfdChQeU9iamVjdCopOworc3RhdGljIENZVEhPTl9JTkxJTkUgUHlPYmplY3QgKiBfX1B5eF9QeUludF9Gcm9tU2l6ZV90KHNpemVfdCk7CisjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OCisjZGVmaW5lIF9fcHl4X1B5RmxvYXRfQXNEb3VibGUoeCkgKFB5RmxvYXRfQ2hlY2tFeGFjdCh4KSA/IFB5RmxvYXRfQVNfRE9VQkxFKHgpIDogUHlGbG9hdF9Bc0RvdWJsZSh4KSkKKyNlbHNlCisjZGVmaW5lIF9fcHl4X1B5RmxvYXRfQXNEb3VibGUoeCkgUHlGbG9hdF9Bc0RvdWJsZSh4KQorI2VuZGlmCisjZGVmaW5lIF9fcHl4X1B5RmxvYXRfQXNGbG9hdCh4KSAoKGZsb2F0KSBfX3B5eF9QeUZsb2F0X0FzRG91YmxlKHgpKQorI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzICYmIF9fUFlYX0RFRkFVTFRfU1RSSU5HX0VOQ09ESU5HX0lTX0FTQ0lJCitzdGF0aWMgaW50IF9fUHl4X3N5c19nZXRkZWZhdWx0ZW5jb2Rpbmdfbm90X2FzY2lpOworc3RhdGljIGludCBfX1B5eF9pbml0X3N5c19nZXRkZWZhdWx0ZW5jb2RpbmdfcGFyYW1zKHZvaWQpIHsKKyAgICBQeU9iamVjdCogc3lzOworICAgIFB5T2JqZWN0KiBkZWZhdWx0X2VuY29kaW5nID0gTlVMTDsKKyAgICBQeU9iamVjdCogYXNjaWlfY2hhcnNfdSA9IE5VTEw7CisgICAgUHlPYmplY3QqIGFzY2lpX2NoYXJzX2IgPSBOVUxMOworICAgIGNvbnN0IGNoYXIqIGRlZmF1bHRfZW5jb2RpbmdfYzsKKyAgICBzeXMgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInN5cyIpOworICAgIGlmICghc3lzKSBnb3RvIGJhZDsKKyAgICBkZWZhdWx0X2VuY29kaW5nID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzeXMsIChjaGFyKikgImdldGRlZmF1bHRlbmNvZGluZyIsIE5VTEwpOworICAgIFB5X0RFQ1JFRihzeXMpOworICAgIGlmICghZGVmYXVsdF9lbmNvZGluZykgZ290byBiYWQ7CisgICAgZGVmYXVsdF9lbmNvZGluZ19jID0gUHlCeXRlc19Bc1N0cmluZyhkZWZhdWx0X2VuY29kaW5nKTsKKyAgICBpZiAoIWRlZmF1bHRfZW5jb2RpbmdfYykgZ290byBiYWQ7CisgICAgaWYgKHN0cmNtcChkZWZhdWx0X2VuY29kaW5nX2MsICJhc2NpaSIpID09IDApIHsKKyAgICAgICAgX19QeXhfc3lzX2dldGRlZmF1bHRlbmNvZGluZ19ub3RfYXNjaWkgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgYXNjaWlfY2hhcnNbMTI4XTsKKyAgICAgICAgaW50IGM7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCAxMjg7IGMrKykgeworICAgICAgICAgICAgYXNjaWlfY2hhcnNbY10gPSBjOworICAgICAgICB9CisgICAgICAgIF9fUHl4X3N5c19nZXRkZWZhdWx0ZW5jb2Rpbmdfbm90X2FzY2lpID0gMTsKKyAgICAgICAgYXNjaWlfY2hhcnNfdSA9IFB5VW5pY29kZV9EZWNvZGVBU0NJSShhc2NpaV9jaGFycywgMTI4LCBOVUxMKTsKKyAgICAgICAgaWYgKCFhc2NpaV9jaGFyc191KSBnb3RvIGJhZDsKKyAgICAgICAgYXNjaWlfY2hhcnNfYiA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoYXNjaWlfY2hhcnNfdSwgZGVmYXVsdF9lbmNvZGluZ19jLCBOVUxMKTsKKyAgICAgICAgaWYgKCFhc2NpaV9jaGFyc19iIHx8ICFQeUJ5dGVzX0NoZWNrKGFzY2lpX2NoYXJzX2IpIHx8IG1lbWNtcChhc2NpaV9jaGFycywgUHlCeXRlc19BU19TVFJJTkcoYXNjaWlfY2hhcnNfYiksIDEyOCkgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgIlRoaXMgbW9kdWxlIGNvbXBpbGVkIHdpdGggY19zdHJpbmdfZW5jb2Rpbmc9YXNjaWksIGJ1dCBkZWZhdWx0IGVuY29kaW5nICclLjIwMHMnIGlzIG5vdCBhIHN1cGVyc2V0IG9mIGFzY2lpLiIsCisgICAgICAgICAgICAgICAgZGVmYXVsdF9lbmNvZGluZ19jKTsKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihhc2NpaV9jaGFyc191KTsKKyAgICAgICAgUHlfREVDUkVGKGFzY2lpX2NoYXJzX2IpOworICAgIH0KKyAgICBQeV9ERUNSRUYoZGVmYXVsdF9lbmNvZGluZyk7CisgICAgcmV0dXJuIDA7CitiYWQ6CisgICAgUHlfWERFQ1JFRihkZWZhdWx0X2VuY29kaW5nKTsKKyAgICBQeV9YREVDUkVGKGFzY2lpX2NoYXJzX3UpOworICAgIFB5X1hERUNSRUYoYXNjaWlfY2hhcnNfYik7CisgICAgcmV0dXJuIC0xOworfQorI2VuZGlmCisjaWYgX19QWVhfREVGQVVMVF9TVFJJTkdfRU5DT0RJTkdfSVNfREVGQVVMVCAmJiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyNkZWZpbmUgX19QeXhfUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplKGNfc3RyLCBzaXplKSBQeVVuaWNvZGVfRGVjb2RlVVRGOChjX3N0ciwgc2l6ZSwgTlVMTCkKKyNlbHNlCisjZGVmaW5lIF9fUHl4X1B5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShjX3N0ciwgc2l6ZSkgUHlVbmljb2RlX0RlY29kZShjX3N0ciwgc2l6ZSwgX19QWVhfREVGQVVMVF9TVFJJTkdfRU5DT0RJTkcsIE5VTEwpCisjaWYgX19QWVhfREVGQVVMVF9TVFJJTkdfRU5DT0RJTkdfSVNfREVGQVVMVAorc3RhdGljIGNoYXIqIF9fUFlYX0RFRkFVTFRfU1RSSU5HX0VOQ09ESU5HOworc3RhdGljIGludCBfX1B5eF9pbml0X3N5c19nZXRkZWZhdWx0ZW5jb2RpbmdfcGFyYW1zKHZvaWQpIHsKKyAgICBQeU9iamVjdCogc3lzOworICAgIFB5T2JqZWN0KiBkZWZhdWx0X2VuY29kaW5nID0gTlVMTDsKKyAgICBjaGFyKiBkZWZhdWx0X2VuY29kaW5nX2M7CisgICAgc3lzID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJzeXMiKTsKKyAgICBpZiAoIXN5cykgZ290byBiYWQ7CisgICAgZGVmYXVsdF9lbmNvZGluZyA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3lzLCAoY2hhciopIChjb25zdCBjaGFyKikgImdldGRlZmF1bHRlbmNvZGluZyIsIE5VTEwpOworICAgIFB5X0RFQ1JFRihzeXMpOworICAgIGlmICghZGVmYXVsdF9lbmNvZGluZykgZ290byBiYWQ7CisgICAgZGVmYXVsdF9lbmNvZGluZ19jID0gUHlCeXRlc19Bc1N0cmluZyhkZWZhdWx0X2VuY29kaW5nKTsKKyAgICBpZiAoIWRlZmF1bHRfZW5jb2RpbmdfYykgZ290byBiYWQ7CisgICAgX19QWVhfREVGQVVMVF9TVFJJTkdfRU5DT0RJTkcgPSAoY2hhciopIG1hbGxvYyhzdHJsZW4oZGVmYXVsdF9lbmNvZGluZ19jKSk7CisgICAgaWYgKCFfX1BZWF9ERUZBVUxUX1NUUklOR19FTkNPRElORykgZ290byBiYWQ7CisgICAgc3RyY3B5KF9fUFlYX0RFRkFVTFRfU1RSSU5HX0VOQ09ESU5HLCBkZWZhdWx0X2VuY29kaW5nX2MpOworICAgIFB5X0RFQ1JFRihkZWZhdWx0X2VuY29kaW5nKTsKKyAgICByZXR1cm4gMDsKK2JhZDoKKyAgICBQeV9YREVDUkVGKGRlZmF1bHRfZW5jb2RpbmcpOworICAgIHJldHVybiAtMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKworLyogVGVzdCBmb3IgR0NDID4gMi45NSAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICAgICAmJiAoX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIChfX0dOVUNfTUlOT1JfXyA+IDk1KSkpCisgICNkZWZpbmUgbGlrZWx5KHgpICAgX19idWlsdGluX2V4cGVjdCghISh4KSwgMSkKKyAgI2RlZmluZSB1bmxpa2VseSh4KSBfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAwKQorI2Vsc2UgLyogIV9fR05VQ19fIG9yIEdDQyA8IDIuOTUgKi8KKyAgI2RlZmluZSBsaWtlbHkoeCkgICAoeCkKKyAgI2RlZmluZSB1bmxpa2VseSh4KSAoeCkKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X207CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X2Q7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X2I7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X2VtcHR5X3R1cGxlOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9lbXB0eV9ieXRlczsKK3N0YXRpYyBpbnQgX19weXhfbGluZW5vOworc3RhdGljIGludCBfX3B5eF9jbGluZW5vID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICogX19weXhfY2ZpbGVubT0gX19GSUxFX187CitzdGF0aWMgY29uc3QgY2hhciAqX19weXhfZmlsZW5hbWU7CisKKworc3RhdGljIGNvbnN0IGNoYXIgKl9fcHl4X2ZbXSA9IHsKKyAgImtlbmxtLnB5eCIsCit9OworCisvKi0tLSBUeXBlIGRlY2xhcmF0aW9ucyAtLS0qLworc3RydWN0IF9fcHl4X29ial81a2VubG1fRnVsbFNjb3JlUmV0dXJuOworc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGU7CitzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsOworc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWw7CitzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzOworCisvKiAia2VubG0ucHl4IjoxMQorICogICAgIHJhaXNlIFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgJXMgdG8gc3RyaW5nJyAlIHR5cGUoZGF0YSkpCisgKiAKKyAqIGNkZWYgY2xhc3MgRnVsbFNjb3JlUmV0dXJuOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgIiIiCisgKiAgICAgV3JhcHBlciBhcm91bmQgRnVsbFNjb3JlUmV0dXJuLgorICovCitzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4geworICBQeU9iamVjdF9IRUFECisgIGZsb2F0IGxvZ19wcm9iOworICBpbnQgbmdyYW1fbGVuZ3RoOworICBpbnQgb292OworfTsKKworCisvKiAia2VubG0ucHl4Ijo0NAorICogICAgICAgICAgICAgcmV0dXJuIHNlbGYub292CisgKiAKKyAqIGNkZWYgY2xhc3MgU3RhdGU6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAiIiIKKyAqICAgICBXcmFwcGVyIGFyb3VuZCBsbTo6bmdyYW06OlN0YXRlIHNvIHRoYXQgcHl0aG9uIGNvZGUgY2FuIG1ha2UgaW5jcmVtZW50YWwgcXVlcmllcy4KKyAqLworc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgeworICBQeU9iamVjdF9IRUFECisgIGxtOjpuZ3JhbTo6U3RhdGUgX2Nfc3RhdGU7Cit9OworCisKKy8qICJrZW5sbS5weXgiOjc0CisgKiAKKyAqIAorICogY2RlZiBjbGFzcyBMYW5ndWFnZU1vZGVsOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgIiIiCisgKiAgICAgVGhpcyBpcyBub3QgYSBzdHJpY3Qgd3JhcHBlciwgdGhlIGludGVyZmFjZSBpcyBtb3JlIHB5dGhvbmljLgorICovCitzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsIHsKKyAgUHlPYmplY3RfSEVBRAorICBsbTo6YmFzZTo6TW9kZWwgKm1vZGVsOworICBQeU9iamVjdCAqcGF0aDsKKyAgY29uc3QgbG06OmJhc2U6OlZvY2FidWxhcnkgKnZvY2FiOworfTsKKworCisvKiAia2VubG0ucHl4IjoxNTkKKyAqICAgICAgICAgcmV0dXJuIChfa2VubG0uTGFuZ3VhZ2VNb2RlbCwgKHNlbGYucGF0aCwpKQorICogCisgKiBjZGVmIGNsYXNzIE1vZGVsOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgIiIiCisgKiAgICAgVGhpcyBpcyBjbG9zZXIgdG8gYSB3cmFwcGVyIGFyb3VuZCBsbTo6bmdyYW06Ok1vZGVsLgorICovCitzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCB7CisgIFB5T2JqZWN0X0hFQUQKKyAgbG06OmJhc2U6Ok1vZGVsICptb2RlbDsKKyAgUHlPYmplY3QgKnBhdGg7CisgIGNvbnN0IGxtOjpiYXNlOjpWb2NhYnVsYXJ5ICp2b2NhYjsKK307CisKKworLyogImtlbmxtLnB5eCI6MTIyCisgKiAgICAgICAgIHJldHVybiB0b3RhbAorICogCisgKiAgICAgZGVmIGZ1bGxfc2NvcmVzKHNlbGYsIHNlbnRlbmNlLCBib3MgPSBUcnVlLCBlb3MgPSBUcnVlKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAiIiIKKyAqICAgICAgICAgZnVsbF9zY29yZXMoc2VudGVuY2UsIGJvcyA9IFRydWUsIGVvcyA9IFR1cmUpIC0+IGdlbmVyYXRlIGZ1bGwgc2NvcmVzIChwcm9iLCBuZ3JhbSBsZW5ndGgsIG9vdikKKyAqLworc3RydWN0IF9fcHl4X29ial81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyB7CisgIFB5T2JqZWN0X0hFQUQKKyAgUHlPYmplY3QgKl9fcHl4X3ZfYm9zOworICBQeU9iamVjdCAqX19weXhfdl9lb3M7CisgIGxtOjpuZ3JhbTo6U3RhdGUgX19weXhfdl9vdXRfc3RhdGU7CisgIHN0cnVjdCBsbTo6RnVsbFNjb3JlUmV0dXJuIF9fcHl4X3ZfcmV0OworICBzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsICpfX3B5eF92X3NlbGY7CisgIFB5T2JqZWN0ICpfX3B5eF92X3NlbnRlbmNlOworICBsbTo6bmdyYW06OlN0YXRlIF9fcHl4X3Zfc3RhdGU7CisgIGZsb2F0IF9fcHl4X3ZfdG90YWw7CisgIGxtOjpXb3JkSW5kZXggX19weXhfdl93aWQ7CisgIFB5T2JqZWN0ICpfX3B5eF92X3dvcmQ7CisgIFB5T2JqZWN0ICpfX3B5eF92X3dvcmRzOworICBQeU9iamVjdCAqX19weXhfdF8wOworICBQeV9zc2l6ZV90IF9fcHl4X3RfMTsKK307CisKKworLyogLS0tIFJ1bnRpbWUgc3VwcG9ydCBjb2RlIChoZWFkKSAtLS0gKi8KKyNpZm5kZWYgQ1lUSE9OX1JFRk5BTk5ZCisgICNkZWZpbmUgQ1lUSE9OX1JFRk5BTk5ZIDAKKyNlbmRpZgorI2lmIENZVEhPTl9SRUZOQU5OWQorICB0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAoKklOQ1JFRikodm9pZCosIFB5T2JqZWN0KiwgaW50KTsKKyAgICB2b2lkICgqREVDUkVGKSh2b2lkKiwgUHlPYmplY3QqLCBpbnQpOworICAgIHZvaWQgKCpHT1RSRUYpKHZvaWQqLCBQeU9iamVjdCosIGludCk7CisgICAgdm9pZCAoKkdJVkVSRUYpKHZvaWQqLCBQeU9iamVjdCosIGludCk7CisgICAgdm9pZCogKCpTZXR1cENvbnRleHQpKGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGNoYXIqKTsKKyAgICB2b2lkICgqRmluaXNoQ29udGV4dCkodm9pZCoqKTsKKyAgfSBfX1B5eF9SZWZOYW5ueUFQSVN0cnVjdDsKKyAgc3RhdGljIF9fUHl4X1JlZk5hbm55QVBJU3RydWN0ICpfX1B5eF9SZWZOYW5ueSA9IE5VTEw7CisgIHN0YXRpYyBfX1B5eF9SZWZOYW5ueUFQSVN0cnVjdCAqX19QeXhfUmVmTmFubnlJbXBvcnRBUEkoY29uc3QgY2hhciAqbW9kbmFtZSk7CisgICNkZWZpbmUgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMgdm9pZCAqX19weXhfcmVmbmFubnkgPSBOVUxMOworI2lmZGVmIFdJVEhfVEhSRUFECisgICNkZWZpbmUgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQobmFtZSwgYWNxdWlyZV9naWwpIFwKKyAgICAgICAgICBpZiAoYWNxdWlyZV9naWwpIHsgXAorICAgICAgICAgICAgICBQeUdJTFN0YXRlX1NUQVRFIF9fcHl4X2dpbHN0YXRlX3NhdmUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOyBcCisgICAgICAgICAgICAgIF9fcHl4X3JlZm5hbm55ID0gX19QeXhfUmVmTmFubnktPlNldHVwQ29udGV4dCgobmFtZSksIF9fTElORV9fLCBfX0ZJTEVfXyk7IFwKKyAgICAgICAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKF9fcHl4X2dpbHN0YXRlX3NhdmUpOyBcCisgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICBfX3B5eF9yZWZuYW5ueSA9IF9fUHl4X1JlZk5hbm55LT5TZXR1cENvbnRleHQoKG5hbWUpLCBfX0xJTkVfXywgX19GSUxFX18pOyBcCisgICAgICAgICAgfQorI2Vsc2UKKyAgI2RlZmluZSBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dChuYW1lLCBhY3F1aXJlX2dpbCkgXAorICAgICAgICAgIF9fcHl4X3JlZm5hbm55ID0gX19QeXhfUmVmTmFubnktPlNldHVwQ29udGV4dCgobmFtZSksIF9fTElORV9fLCBfX0ZJTEVfXykKKyNlbmRpZgorICAjZGVmaW5lIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpIFwKKyAgICAgICAgICBfX1B5eF9SZWZOYW5ueS0+RmluaXNoQ29udGV4dCgmX19weXhfcmVmbmFubnkpCisgICNkZWZpbmUgX19QeXhfSU5DUkVGKHIpICBfX1B5eF9SZWZOYW5ueS0+SU5DUkVGKF9fcHl4X3JlZm5hbm55LCAoUHlPYmplY3QgKikociksIF9fTElORV9fKQorICAjZGVmaW5lIF9fUHl4X0RFQ1JFRihyKSAgX19QeXhfUmVmTmFubnktPkRFQ1JFRihfX3B5eF9yZWZuYW5ueSwgKFB5T2JqZWN0ICopKHIpLCBfX0xJTkVfXykKKyAgI2RlZmluZSBfX1B5eF9HT1RSRUYocikgIF9fUHl4X1JlZk5hbm55LT5HT1RSRUYoX19weXhfcmVmbmFubnksIChQeU9iamVjdCAqKShyKSwgX19MSU5FX18pCisgICNkZWZpbmUgX19QeXhfR0lWRVJFRihyKSBfX1B5eF9SZWZOYW5ueS0+R0lWRVJFRihfX3B5eF9yZWZuYW5ueSwgKFB5T2JqZWN0ICopKHIpLCBfX0xJTkVfXykKKyAgI2RlZmluZSBfX1B5eF9YSU5DUkVGKHIpICBkbyB7IGlmKChyKSAhPSBOVUxMKSB7X19QeXhfSU5DUkVGKHIpOyB9fSB3aGlsZSgwKQorICAjZGVmaW5lIF9fUHl4X1hERUNSRUYocikgIGRvIHsgaWYoKHIpICE9IE5VTEwpIHtfX1B5eF9ERUNSRUYocik7IH19IHdoaWxlKDApCisgICNkZWZpbmUgX19QeXhfWEdPVFJFRihyKSAgZG8geyBpZigocikgIT0gTlVMTCkge19fUHl4X0dPVFJFRihyKTsgfX0gd2hpbGUoMCkKKyAgI2RlZmluZSBfX1B5eF9YR0lWRVJFRihyKSBkbyB7IGlmKChyKSAhPSBOVUxMKSB7X19QeXhfR0lWRVJFRihyKTt9fSB3aGlsZSgwKQorI2Vsc2UKKyAgI2RlZmluZSBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICAjZGVmaW5lIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KG5hbWUsIGFjcXVpcmVfZ2lsKQorICAjZGVmaW5lIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpCisgICNkZWZpbmUgX19QeXhfSU5DUkVGKHIpIFB5X0lOQ1JFRihyKQorICAjZGVmaW5lIF9fUHl4X0RFQ1JFRihyKSBQeV9ERUNSRUYocikKKyAgI2RlZmluZSBfX1B5eF9HT1RSRUYocikKKyAgI2RlZmluZSBfX1B5eF9HSVZFUkVGKHIpCisgICNkZWZpbmUgX19QeXhfWElOQ1JFRihyKSBQeV9YSU5DUkVGKHIpCisgICNkZWZpbmUgX19QeXhfWERFQ1JFRihyKSBQeV9YREVDUkVGKHIpCisgICNkZWZpbmUgX19QeXhfWEdPVFJFRihyKQorICAjZGVmaW5lIF9fUHl4X1hHSVZFUkVGKHIpCisjZW5kaWYKKyNkZWZpbmUgX19QeXhfWERFQ1JFRl9TRVQociwgdikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5T2JqZWN0ICp0bXAgPSAoUHlPYmplY3QgKikgcjsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByID0gdjsgX19QeXhfWERFQ1JFRih0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorI2RlZmluZSBfX1B5eF9ERUNSRUZfU0VUKHIsIHYpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlPYmplY3QgKnRtcCA9IChQeU9iamVjdCAqKSByOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHIgPSB2OyBfX1B5eF9ERUNSRUYodG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIF9fUHl4X0NMRUFSKHIpICAgIGRvIHsgUHlPYmplY3QqIHRtcCA9ICgoUHlPYmplY3QqKShyKSk7IHIgPSBOVUxMOyBfX1B5eF9ERUNSRUYodG1wKTt9IHdoaWxlKDApCisjZGVmaW5lIF9fUHl4X1hDTEVBUihyKSAgIGRvIHsgaWYoKHIpICE9IE5VTEwpIHtQeU9iamVjdCogdG1wID0gKChQeU9iamVjdCopKHIpKTsgciA9IE5VTEw7IF9fUHl4X0RFQ1JFRih0bXApO319IHdoaWxlKDApCisKKyNpZiBDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04KK3N0YXRpYyBDWVRIT05fSU5MSU5FIFB5T2JqZWN0KiBfX1B5eF9QeU9iamVjdF9HZXRBdHRyU3RyKFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0KiBhdHRyX25hbWUpIHsKKyAgICBQeVR5cGVPYmplY3QqIHRwID0gUHlfVFlQRShvYmopOworICAgIGlmIChsaWtlbHkodHAtPnRwX2dldGF0dHJvKSkKKyAgICAgICAgcmV0dXJuIHRwLT50cF9nZXRhdHRybyhvYmosIGF0dHJfbmFtZSk7CisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKKyAgICBpZiAobGlrZWx5KHRwLT50cF9nZXRhdHRyKSkKKyAgICAgICAgcmV0dXJuIHRwLT50cF9nZXRhdHRyKG9iaiwgUHlTdHJpbmdfQVNfU1RSSU5HKGF0dHJfbmFtZSkpOworI2VuZGlmCisgICAgcmV0dXJuIFB5T2JqZWN0X0dldEF0dHIob2JqLCBhdHRyX25hbWUpOworfQorI2Vsc2UKKyNkZWZpbmUgX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihvLG4pIFB5T2JqZWN0X0dldEF0dHIobyxuKQorI2VuZGlmCisKK3N0YXRpYyBQeU9iamVjdCAqX19QeXhfR2V0QnVpbHRpbk5hbWUoUHlPYmplY3QgKm5hbWUpOworCisjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OCitzdGF0aWMgQ1lUSE9OX0lOTElORSBQeU9iamVjdCogX19QeXhfUHlPYmplY3RfQ2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZywgUHlPYmplY3QgKmt3KTsKKyNlbHNlCisjZGVmaW5lIF9fUHl4X1B5T2JqZWN0X0NhbGwoZnVuYywgYXJnLCBrdykgUHlPYmplY3RfQ2FsbChmdW5jLCBhcmcsIGt3KQorI2VuZGlmCisKK3N0YXRpYyBDWVRIT05fSU5MSU5FIHZvaWQgX19QeXhfRXJyUmVzdG9yZShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdGIpOworc3RhdGljIENZVEhPTl9JTkxJTkUgdm9pZCBfX1B5eF9FcnJGZXRjaChQeU9iamVjdCAqKnR5cGUsIFB5T2JqZWN0ICoqdmFsdWUsIFB5T2JqZWN0ICoqdGIpOworCitzdGF0aWMgdm9pZCBfX1B5eF9SYWlzZShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdGIsIFB5T2JqZWN0ICpjYXVzZSk7CisKK3N0YXRpYyB2b2lkIF9fUHl4X1JhaXNlQXJndHVwbGVJbnZhbGlkKGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSwgaW50IGV4YWN0LAorICAgIFB5X3NzaXplX3QgbnVtX21pbiwgUHlfc3NpemVfdCBudW1fbWF4LCBQeV9zc2l6ZV90IG51bV9mb3VuZCk7CisKK3N0YXRpYyB2b2lkIF9fUHl4X1JhaXNlRG91YmxlS2V5d29yZHNFcnJvcihjb25zdCBjaGFyKiBmdW5jX25hbWUsIFB5T2JqZWN0KiBrd19uYW1lKTsKKworc3RhdGljIGludCBfX1B5eF9QYXJzZU9wdGlvbmFsS2V5d29yZHMoUHlPYmplY3QgKmt3ZHMsIFB5T2JqZWN0ICoqYXJnbmFtZXNbXSwgXAorICAgIFB5T2JqZWN0ICprd2RzMiwgUHlPYmplY3QgKnZhbHVlc1tdLCBQeV9zc2l6ZV90IG51bV9wb3NfYXJncywgXAorICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uX25hbWUpOworCitzdGF0aWMgQ1lUSE9OX0lOTElORSBpbnQgX19QeXhfQXJnVHlwZVRlc3QoUHlPYmplY3QgKm9iaiwgUHlUeXBlT2JqZWN0ICp0eXBlLCBpbnQgbm9uZV9hbGxvd2VkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBleGFjdCk7CisKK3N0YXRpYyBDWVRIT05fSU5MSU5FIFB5T2JqZWN0ICpfX1B5eF9HZXRNb2R1bGVHbG9iYWxOYW1lKFB5T2JqZWN0ICpuYW1lKTsKKworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorc3RhdGljIENZVEhPTl9JTkxJTkUgUHlPYmplY3QqIF9fUHl4X1B5T2JqZWN0X0NhbGxNZXRoTyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZyk7CisjZW5kaWYKKworc3RhdGljIENZVEhPTl9JTkxJTkUgUHlPYmplY3QqIF9fUHl4X1B5T2JqZWN0X0NhbGxPbmVBcmcoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcpOworCitzdGF0aWMgQ1lUSE9OX0lOTElORSB2b2lkIF9fUHl4X0V4Y2VwdGlvblNhdmUoUHlPYmplY3QgKip0eXBlLCBQeU9iamVjdCAqKnZhbHVlLCBQeU9iamVjdCAqKnRiKTsKK3N0YXRpYyB2b2lkIF9fUHl4X0V4Y2VwdGlvblJlc2V0KFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIFB5T2JqZWN0ICp0Yik7CisKK3N0YXRpYyBpbnQgX19QeXhfR2V0RXhjZXB0aW9uKFB5T2JqZWN0ICoqdHlwZSwgUHlPYmplY3QgKip2YWx1ZSwgUHlPYmplY3QgKip0Yik7CisKKyNpZiBDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04KK3N0YXRpYyBDWVRIT05fSU5MSU5FIFB5T2JqZWN0KiBfX1B5eF9QeU9iamVjdF9DYWxsTm9BcmcoUHlPYmplY3QgKmZ1bmMpOworI2Vsc2UKKyNkZWZpbmUgX19QeXhfUHlPYmplY3RfQ2FsbE5vQXJnKGZ1bmMpIF9fUHl4X1B5T2JqZWN0X0NhbGwoZnVuYywgX19weXhfZW1wdHlfdHVwbGUsIE5VTEwpCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGNvZGVfbGluZTsKKyAgICBQeUNvZGVPYmplY3QqIGNvZGVfb2JqZWN0OworfSBfX1B5eF9Db2RlT2JqZWN0Q2FjaGVFbnRyeTsKK3N0cnVjdCBfX1B5eF9Db2RlT2JqZWN0Q2FjaGUgeworICAgIGludCBjb3VudDsKKyAgICBpbnQgbWF4X2NvdW50OworICAgIF9fUHl4X0NvZGVPYmplY3RDYWNoZUVudHJ5KiBlbnRyaWVzOworfTsKK3N0YXRpYyBzdHJ1Y3QgX19QeXhfQ29kZU9iamVjdENhY2hlIF9fcHl4X2NvZGVfY2FjaGUgPSB7MCwwLE5VTEx9Oworc3RhdGljIGludCBfX3B5eF9iaXNlY3RfY29kZV9vYmplY3RzKF9fUHl4X0NvZGVPYmplY3RDYWNoZUVudHJ5KiBlbnRyaWVzLCBpbnQgY291bnQsIGludCBjb2RlX2xpbmUpOworc3RhdGljIFB5Q29kZU9iamVjdCAqX19weXhfZmluZF9jb2RlX29iamVjdChpbnQgY29kZV9saW5lKTsKK3N0YXRpYyB2b2lkIF9fcHl4X2luc2VydF9jb2RlX29iamVjdChpbnQgY29kZV9saW5lLCBQeUNvZGVPYmplY3QqIGNvZGVfb2JqZWN0KTsKKworc3RhdGljIHZvaWQgX19QeXhfQWRkVHJhY2ViYWNrKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBpbnQgY19saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBweV9saW5lLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKyNpbmNsdWRlIDxuZXc+CisKK3N0YXRpYyBQeU9iamVjdCAqX19QeXhfSW1wb3J0KFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqZnJvbV9saXN0LCBpbnQgbGV2ZWwpOworCitzdGF0aWMgQ1lUSE9OX0lOTElORSBpbnQgX19QeXhfUHlJbnRfQXNfaW50KFB5T2JqZWN0ICopOworCitzdGF0aWMgQ1lUSE9OX0lOTElORSBQeU9iamVjdCogX19QeXhfUHlJbnRfRnJvbV9pbnQoaW50IHZhbHVlKTsKKworI2lmbmRlZiBfX1B5eF9DcHBFeG4yUHlFcnIKKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGlvcz4KK3N0YXRpYyB2b2lkIF9fUHl4X0NwcEV4bjJQeUVycigpIHsKKyAgdHJ5IHsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgIDsgLy8gbGV0IHRoZSBsYXRlc3QgUHl0aG9uIGV4biBwYXNzIHRocm91Z2ggYW5kIGlnbm9yZSB0aGUgY3VycmVudCBvbmUKKyAgICBlbHNlCisgICAgICB0aHJvdzsKKyAgfSBjYXRjaCAoY29uc3Qgc3RkOjpiYWRfYWxsb2MmIGV4bikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgZXhuLndoYXQoKSk7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6YmFkX2Nhc3QmIGV4bikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGV4bi53aGF0KCkpOworICB9IGNhdGNoIChjb25zdCBzdGQ6OmRvbWFpbl9lcnJvciYgZXhuKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGV4bi53aGF0KCkpOworICB9IGNhdGNoIChjb25zdCBzdGQ6OmludmFsaWRfYXJndW1lbnQmIGV4bikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBleG4ud2hhdCgpKTsKKyAgfSBjYXRjaCAoY29uc3Qgc3RkOjppb3NfYmFzZTo6ZmFpbHVyZSYgZXhuKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsIGV4bi53aGF0KCkpOworICB9IGNhdGNoIChjb25zdCBzdGQ6Om91dF9vZl9yYW5nZSYgZXhuKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsIGV4bi53aGF0KCkpOworICB9IGNhdGNoIChjb25zdCBzdGQ6Om92ZXJmbG93X2Vycm9yJiBleG4pIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgZXhuLndoYXQoKSk7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6cmFuZ2VfZXJyb3ImIGV4bikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Bcml0aG1ldGljRXJyb3IsIGV4bi53aGF0KCkpOworICB9IGNhdGNoIChjb25zdCBzdGQ6OnVuZGVyZmxvd19lcnJvciYgZXhuKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0FyaXRobWV0aWNFcnJvciwgZXhuLndoYXQoKSk7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleG4pIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCBleG4ud2hhdCgpKTsKKyAgfQorICBjYXRjaCAoLi4uKQorICB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIlVua25vd24gZXhjZXB0aW9uIik7CisgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgQ1lUSE9OX0lOTElORSBQeU9iamVjdCogX19QeXhfUHlJbnRfRnJvbV91bnNpZ25lZF9pbnQodW5zaWduZWQgaW50IHZhbHVlKTsKKworc3RhdGljIENZVEhPTl9JTkxJTkUgUHlPYmplY3QqIF9fUHl4X1B5SW50X0Zyb21fdW5zaWduZWRfY2hhcih1bnNpZ25lZCBjaGFyIHZhbHVlKTsKKworc3RhdGljIENZVEhPTl9JTkxJTkUgUHlPYmplY3QqIF9fUHl4X1B5SW50X0Zyb21fbG9uZyhsb25nIHZhbHVlKTsKKworc3RhdGljIENZVEhPTl9JTkxJTkUgbG9uZyBfX1B5eF9QeUludF9Bc19sb25nKFB5T2JqZWN0ICopOworCitzdGF0aWMgUHlUeXBlT2JqZWN0KiBfX1B5eF9GZXRjaENvbW1vblR5cGUoUHlUeXBlT2JqZWN0KiB0eXBlKTsKKworc3RhdGljIENZVEhPTl9JTkxJTkUgdm9pZCBfX1B5eF9FeGNlcHRpb25Td2FwKFB5T2JqZWN0ICoqdHlwZSwgUHlPYmplY3QgKip2YWx1ZSwgUHlPYmplY3QgKip0Yik7CisKK3N0YXRpYyBQeU9iamVjdCogX19QeXhfUHlPYmplY3RfQ2FsbE1ldGhvZDEoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QqIG1ldGhvZF9uYW1lLCBQeU9iamVjdCogYXJnKTsKKworI2RlZmluZSBfX1B5eF9HZW5lcmF0b3JfVVNFRAorI2luY2x1ZGUgPHN0cnVjdG1lbWJlci5oPgorI2luY2x1ZGUgPGZyYW1lb2JqZWN0Lmg+Cit0eXBlZGVmIFB5T2JqZWN0ICooKl9fcHl4X2dlbmVyYXRvcl9ib2R5X3QpKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBfX3B5eF9nZW5lcmF0b3JfYm9keV90IGJvZHk7CisgICAgUHlPYmplY3QgKmNsb3N1cmU7CisgICAgUHlPYmplY3QgKmV4Y190eXBlOworICAgIFB5T2JqZWN0ICpleGNfdmFsdWU7CisgICAgUHlPYmplY3QgKmV4Y190cmFjZWJhY2s7CisgICAgUHlPYmplY3QgKmdpX3dlYWtyZWZsaXN0OworICAgIFB5T2JqZWN0ICpjbGFzc29iajsKKyAgICBQeU9iamVjdCAqeWllbGRmcm9tOworICAgIFB5T2JqZWN0ICpnaV9uYW1lOworICAgIFB5T2JqZWN0ICpnaV9xdWFsbmFtZTsKKyAgICBpbnQgcmVzdW1lX2xhYmVsOworICAgIGNoYXIgaXNfcnVubmluZzsKK30gX19weXhfR2VuZXJhdG9yT2JqZWN0Oworc3RhdGljIF9fcHl4X0dlbmVyYXRvck9iamVjdCAqX19QeXhfR2VuZXJhdG9yX05ldyhfX3B5eF9nZW5lcmF0b3JfYm9keV90IGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjbG9zdXJlLCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnF1YWxuYW1lKTsKK3N0YXRpYyBpbnQgX19weXhfR2VuZXJhdG9yX2luaXQodm9pZCk7CitzdGF0aWMgaW50IF9fUHl4X0dlbmVyYXRvcl9jbGVhcihQeU9iamVjdCogc2VsZik7CisjaWYgMSB8fCBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMzAwQjAKK3N0YXRpYyBpbnQgX19QeXhfUHlHZW5fRmV0Y2hTdG9wSXRlcmF0aW9uVmFsdWUoUHlPYmplY3QgKipwdmFsdWUpOworI2Vsc2UKKyNkZWZpbmUgX19QeXhfUHlHZW5fRmV0Y2hTdG9wSXRlcmF0aW9uVmFsdWUocHZhbHVlKSBQeUdlbl9GZXRjaFN0b3BJdGVyYXRpb25WYWx1ZShwdmFsdWUpCisjZW5kaWYKKworc3RhdGljIGludCBfX1B5eF9jaGVja19iaW5hcnlfdmVyc2lvbih2b2lkKTsKKworc3RhdGljIGludCBfX1B5eF9Jbml0U3RyaW5ncyhfX1B5eF9TdHJpbmdUYWJFbnRyeSAqdCk7CisKKworLyogTW9kdWxlIGRlY2xhcmF0aW9ucyBmcm9tICdfa2VubG0nICovCisKKy8qIE1vZHVsZSBkZWNsYXJhdGlvbnMgZnJvbSAna2VubG0nICovCitzdGF0aWMgUHlUeXBlT2JqZWN0ICpfX3B5eF9wdHlwZV81a2VubG1fRnVsbFNjb3JlUmV0dXJuID0gMDsKK3N0YXRpYyBQeVR5cGVPYmplY3QgKl9fcHl4X3B0eXBlXzVrZW5sbV9TdGF0ZSA9IDA7CitzdGF0aWMgUHlUeXBlT2JqZWN0ICpfX3B5eF9wdHlwZV81a2VubG1fTGFuZ3VhZ2VNb2RlbCA9IDA7CitzdGF0aWMgUHlUeXBlT2JqZWN0ICpfX3B5eF9wdHlwZV81a2VubG1fTW9kZWwgPSAwOworc3RhdGljIFB5VHlwZU9iamVjdCAqX19weXhfcHR5cGVfNWtlbmxtX19fcHl4X3Njb3BlX3N0cnVjdF9fZnVsbF9zY29yZXMgPSAwOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9mXzVrZW5sbV9hc19zdHIoUHlPYmplY3QgKik7IC8qcHJvdG8qLworI2RlZmluZSBfX1B5eF9NT0RVTEVfTkFNRSAia2VubG0iCitpbnQgX19weXhfbW9kdWxlX2lzX21haW5fa2VubG0gPSAwOworCisvKiBJbXBsZW1lbnRhdGlvbiBvZiAna2VubG0nICovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X2J1aWx0aW5fVHlwZUVycm9yOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9idWlsdGluX1J1bnRpbWVFcnJvcjsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfYnVpbHRpbl9JT0Vycm9yOworc3RhdGljIGludCBfX3B5eF9wZl81a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fX19jaW5pdF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0Z1bGxTY29yZVJldHVybiAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl9sb2dfcHJvYiwgUHlPYmplY3QgKl9fcHl4X3ZfbmdyYW1fbGVuZ3RoLCBQeU9iamVjdCAqX19weXhfdl9vb3YpOyAvKiBwcm90byAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fMl9fcmVwcl9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0Z1bGxTY29yZVJldHVybiAqX19weXhfdl9zZWxmKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuXzhsb2dfcHJvYl9fX2dldF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0Z1bGxTY29yZVJldHVybiAqX19weXhfdl9zZWxmKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuXzEybmdyYW1fbGVuZ3RoX19fZ2V0X18oc3RydWN0IF9fcHl4X29ial81a2VubG1fRnVsbFNjb3JlUmV0dXJuICpfX3B5eF92X3NlbGYpOyAvKiBwcm90byAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fM29vdl9fX2dldF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0Z1bGxTY29yZVJldHVybiAqX19weXhfdl9zZWxmKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzVTdGF0ZV9fX3JpY2hjbXBfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9TdGF0ZSAqX19weXhfdl9xYSwgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3ZfcWIsIGludCBfX3B5eF92X29wKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBQeV9oYXNoX3QgX19weXhfcGZfNWtlbmxtXzVTdGF0ZV8yX19oYXNoX18oc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3Zfc2VsZik7IC8qIHByb3RvICovCitzdGF0aWMgaW50IF9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfX19pbml0X18oc3RydWN0IF9fcHl4X29ial81a2VubG1fTGFuZ3VhZ2VNb2RlbCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl9wYXRoKTsgLyogcHJvdG8gKi8KK3N0YXRpYyB2b2lkIF9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfMl9fZGVhbGxvY19fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKl9fcHl4X3Zfc2VsZik7IC8qIHByb3RvICovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNW9yZGVyX19fZ2V0X18oc3RydWN0IF9fcHl4X29ial81a2VubG1fTGFuZ3VhZ2VNb2RlbCAqX19weXhfdl9zZWxmKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF80c2NvcmUoc3RydWN0IF9fcHl4X29ial81a2VubG1fTGFuZ3VhZ2VNb2RlbCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl9zZW50ZW5jZSwgUHlPYmplY3QgKl9fcHl4X3ZfYm9zLCBQeU9iamVjdCAqX19weXhfdl9lb3MpOyAvKiBwcm90byAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fMTNMYW5ndWFnZU1vZGVsXzZmdWxsX3Njb3JlcyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF92X3NlbnRlbmNlLCBQeU9iamVjdCAqX19weXhfdl9ib3MsIFB5T2JqZWN0ICpfX3B5eF92X2Vvcyk7IC8qIHByb3RvICovCitzdGF0aWMgaW50IF9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfOV9fY29udGFpbnNfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF92X3dvcmQpOyAvKiBwcm90byAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fMTNMYW5ndWFnZU1vZGVsXzExX19yZXByX18oc3RydWN0IF9fcHl4X29ial81a2VubG1fTGFuZ3VhZ2VNb2RlbCAqX19weXhfdl9zZWxmKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF8xM19fcmVkdWNlX18oc3RydWN0IF9fcHl4X29ial81a2VubG1fTGFuZ3VhZ2VNb2RlbCAqX19weXhfdl9zZWxmKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF80cGF0aF9fX2dldF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKl9fcHl4X3Zfc2VsZik7IC8qIHByb3RvICovCitzdGF0aWMgaW50IF9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNHBhdGhfMl9fc2V0X18oc3RydWN0IF9fcHl4X29ial81a2VubG1fTGFuZ3VhZ2VNb2RlbCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl92YWx1ZSk7IC8qIHByb3RvICovCitzdGF0aWMgaW50IF9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNHBhdGhfNF9fZGVsX18oc3RydWN0IF9fcHl4X29ial81a2VubG1fTGFuZ3VhZ2VNb2RlbCAqX19weXhfdl9zZWxmKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBpbnQgX19weXhfcGZfNWtlbmxtXzVNb2RlbF9fX2luaXRfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl9wYXRoKTsgLyogcHJvdG8gKi8KK3N0YXRpYyB2b2lkIF9fcHl4X3BmXzVrZW5sbV81TW9kZWxfMl9fZGVhbGxvY19fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpfX3B5eF92X3NlbGYpOyAvKiBwcm90byAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fNU1vZGVsXzVvcmRlcl9fX2dldF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpfX3B5eF92X3NlbGYpOyAvKiBwcm90byAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fNU1vZGVsXzRCZWdpblNlbnRlbmNlV3JpdGUoc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwgKl9fcHl4X3Zfc2VsZiwgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3Zfc3RhdGUpOyAvKiBwcm90byAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fNU1vZGVsXzZOdWxsQ29udGV4dFdyaXRlKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpfX3B5eF92X3NlbGYsIHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX1N0YXRlICpfX3B5eF92X3N0YXRlKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzVNb2RlbF84QmFzZVNjb3JlKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpfX3B5eF92X3NlbGYsIHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX1N0YXRlICpfX3B5eF92X2luX3N0YXRlLCBQeU9iamVjdCAqX19weXhfdl93b3JkLCBzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9TdGF0ZSAqX19weXhfdl9vdXRfc3RhdGUpOyAvKiBwcm90byAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fNU1vZGVsXzEwQmFzZUZ1bGxTY29yZShzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqX19weXhfdl9zZWxmLCBzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9TdGF0ZSAqX19weXhfdl9pbl9zdGF0ZSwgUHlPYmplY3QgKl9fcHl4X3Zfd29yZCwgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3Zfb3V0X3N0YXRlKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBpbnQgX19weXhfcGZfNWtlbmxtXzVNb2RlbF8xMl9fY29udGFpbnNfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl93b3JkKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzVNb2RlbF8xNF9fcmVwcl9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpfX3B5eF92X3NlbGYpOyAvKiBwcm90byAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fNU1vZGVsXzE2X19yZWR1Y2VfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqX19weXhfdl9zZWxmKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzVNb2RlbF80cGF0aF9fX2dldF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpfX3B5eF92X3NlbGYpOyAvKiBwcm90byAqLworc3RhdGljIGludCBfX3B5eF9wZl81a2VubG1fNU1vZGVsXzRwYXRoXzJfX3NldF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF92X3ZhbHVlKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBpbnQgX19weXhfcGZfNWtlbmxtXzVNb2RlbF80cGF0aF80X19kZWxfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqX19weXhfdl9zZWxmKTsgLyogcHJvdG8gKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfdHBfbmV3XzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4oUHlUeXBlT2JqZWN0ICp0LCBQeU9iamVjdCAqYSwgUHlPYmplY3QgKmspOyAvKnByb3RvKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfdHBfbmV3XzVrZW5sbV9TdGF0ZShQeVR5cGVPYmplY3QgKnQsIFB5T2JqZWN0ICphLCBQeU9iamVjdCAqayk7IC8qcHJvdG8qLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF90cF9uZXdfNWtlbmxtX0xhbmd1YWdlTW9kZWwoUHlUeXBlT2JqZWN0ICp0LCBQeU9iamVjdCAqYSwgUHlPYmplY3QgKmspOyAvKnByb3RvKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfdHBfbmV3XzVrZW5sbV9Nb2RlbChQeVR5cGVPYmplY3QgKnQsIFB5T2JqZWN0ICphLCBQeU9iamVjdCAqayk7IC8qcHJvdG8qLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF90cF9uZXdfNWtlbmxtX19fcHl4X3Njb3BlX3N0cnVjdF9fZnVsbF9zY29yZXMoUHlUeXBlT2JqZWN0ICp0LCBQeU9iamVjdCAqYSwgUHlPYmplY3QgKmspOyAvKnByb3RvKi8KK3N0YXRpYyBjaGFyIF9fcHl4X2tfXzJbXSA9ICJcbiI7CitzdGF0aWMgY2hhciBfX3B5eF9rX18zW10gPSAiICI7CitzdGF0aWMgY2hhciBfX3B5eF9rX29zW10gPSAib3MiOworc3RhdGljIGNoYXIgX19weXhfa19ib3NbXSA9ICJib3MiOworc3RhdGljIGNoYXIgX19weXhfa19lb3NbXSA9ICJlb3MiOworc3RhdGljIGNoYXIgX19weXhfa19vb3ZbXSA9ICJvb3YiOworc3RhdGljIGNoYXIgX19weXhfa19hcmdzW10gPSAiYXJncyI7CitzdGF0aWMgY2hhciBfX3B5eF9rX21haW5bXSA9ICJfX21haW5fXyI7CitzdGF0aWMgY2hhciBfX3B5eF9rX25hbWVbXSA9ICJfX25hbWVfXyI7CitzdGF0aWMgY2hhciBfX3B5eF9rX3BhdGhbXSA9ICJwYXRoIjsKK3N0YXRpYyBjaGFyIF9fcHl4X2tfc2VuZFtdID0gInNlbmQiOworc3RhdGljIGNoYXIgX19weXhfa190ZXN0W10gPSAiX190ZXN0X18iOworc3RhdGljIGNoYXIgX19weXhfa191dGY4W10gPSAidXRmOCI7CitzdGF0aWMgY2hhciBfX3B5eF9rX3dvcmRbXSA9ICJ3b3JkIjsKK3N0YXRpYyBjaGFyIF9fcHl4X2tfY2xhc3NbXSA9ICJfX2NsYXNzX18iOworc3RhdGljIGNoYXIgX19weXhfa19jbG9zZVtdID0gImNsb3NlIjsKK3N0YXRpYyBjaGFyIF9fcHl4X2tfa2VubG1bXSA9ICJfa2VubG0iOworc3RhdGljIGNoYXIgX19weXhfa19zcGxpdFtdID0gInNwbGl0IjsKK3N0YXRpYyBjaGFyIF9fcHl4X2tfdGhyb3dbXSA9ICJ0aHJvdyI7CitzdGF0aWMgY2hhciBfX3B5eF9rX2VuY29kZVtdID0gImVuY29kZSI7CitzdGF0aWMgY2hhciBfX3B5eF9rX2Zvcm1hdFtdID0gImZvcm1hdCI7CitzdGF0aWMgY2hhciBfX3B5eF9rX2ltcG9ydFtdID0gIl9faW1wb3J0X18iOworc3RhdGljIGNoYXIgX19weXhfa18wXzFfMl8zW10gPSAiezB9KHsxfSwgezJ9LCB7M30pIjsKK3N0YXRpYyBjaGFyIF9fcHl4X2tfSU9FcnJvcltdID0gIklPRXJyb3IiOworc3RhdGljIGNoYXIgX19weXhfa19hYnNwYXRoW10gPSAiYWJzcGF0aCI7CitzdGF0aWMgY2hhciBfX3B5eF9rX3JlcGxhY2VbXSA9ICJyZXBsYWNlIjsKK3N0YXRpYyBjaGFyIF9fcHl4X2tfYmFzZW5hbWVbXSA9ICJiYXNlbmFtZSI7CitzdGF0aWMgY2hhciBfX3B5eF9rX2luX3N0YXRlW10gPSAiaW5fc3RhdGUiOworc3RhdGljIGNoYXIgX19weXhfa19sb2dfcHJvYltdID0gImxvZ19wcm9iIjsKK3N0YXRpYyBjaGFyIF9fcHl4X2tfc2VudGVuY2VbXSA9ICJzZW50ZW5jZSI7CitzdGF0aWMgY2hhciBfX3B5eF9rX1R5cGVFcnJvcltdID0gIlR5cGVFcnJvciI7CitzdGF0aWMgY2hhciBfX3B5eF9rX291dF9zdGF0ZVtdID0gIm91dF9zdGF0ZSI7CitzdGF0aWMgY2hhciBfX3B5eF9rX2Z1bGxfc2NvcmVzW10gPSAiZnVsbF9zY29yZXMiOworc3RhdGljIGNoYXIgX19weXhfa19Nb2RlbF9mcm9tXzBbXSA9ICI8TW9kZWwgZnJvbSB7MH0+IjsKK3N0YXRpYyBjaGFyIF9fcHl4X2tfUnVudGltZUVycm9yW10gPSAiUnVudGltZUVycm9yIjsKK3N0YXRpYyBjaGFyIF9fcHl4X2tfbmdyYW1fbGVuZ3RoW10gPSAibmdyYW1fbGVuZ3RoIjsKK3N0YXRpYyBjaGFyIF9fcHl4X2tfTGFuZ3VhZ2VNb2RlbFtdID0gIkxhbmd1YWdlTW9kZWwiOworc3RhdGljIGNoYXIgX19weXhfa19DYW5ub3RfcmVhZF9tb2RlbFtdID0gIkNhbm5vdCByZWFkIG1vZGVsICd7fScgKHt9KSI7CitzdGF0aWMgY2hhciBfX3B5eF9rX0xhbmd1YWdlTW9kZWxfZnJvbV8wW10gPSAiPExhbmd1YWdlTW9kZWwgZnJvbSB7MH0+IjsKK3N0YXRpYyBjaGFyIF9fcHl4X2tfTGFuZ3VhZ2VNb2RlbF9mdWxsX3Njb3Jlc1tdID0gIkxhbmd1YWdlTW9kZWwuZnVsbF9zY29yZXMiOworc3RhdGljIGNoYXIgX19weXhfa19DYW5ub3RfY29udmVydF9zX3RvX3N0cmluZ1tdID0gIkNhbm5vdCBjb252ZXJ0ICVzIHRvIHN0cmluZyI7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X2twX3NfMF8xXzJfMzsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfa3Bfc19DYW5ub3RfY29udmVydF9zX3RvX3N0cmluZzsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfa3Bfc19DYW5ub3RfcmVhZF9tb2RlbDsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfbl9zX0lPRXJyb3I7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc19MYW5ndWFnZU1vZGVsOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9rcF9zX0xhbmd1YWdlTW9kZWxfZnJvbV8wOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9uX3NfTGFuZ3VhZ2VNb2RlbF9mdWxsX3Njb3JlczsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfa3Bfc19Nb2RlbF9mcm9tXzA7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc19SdW50aW1lRXJyb3I7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc19UeXBlRXJyb3I7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X2twX3NfXzI7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X2twX3NfXzM7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc19hYnNwYXRoOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9uX3NfYXJnczsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfbl9zX2Jhc2VuYW1lOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9uX3NfYm9zOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9uX3NfY2xhc3M7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc19jbG9zZTsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfbl9zX2VuY29kZTsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfbl9zX2VvczsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfbl9zX2Zvcm1hdDsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfbl9zX2Z1bGxfc2NvcmVzOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9uX3NfaW1wb3J0Oworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9uX3NfaW5fc3RhdGU7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc19rZW5sbTsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfbl9zX2xvZ19wcm9iOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9uX3NfbWFpbjsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfbl9zX25hbWU7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc19uZ3JhbV9sZW5ndGg7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc19vb3Y7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc19vczsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfbl9zX291dF9zdGF0ZTsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfbl9zX3BhdGg7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc19yZXBsYWNlOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9uX3Nfc2VuZDsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfbl9zX3NlbnRlbmNlOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9uX3Nfc3BsaXQ7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc190ZXN0Oworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9uX3NfdGhyb3c7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X25fc191dGY4Oworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9uX3Nfd29yZDsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfdHVwbGVfOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF90dXBsZV9fNDsKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfdHVwbGVfXzU7CisKKy8qICJrZW5sbS5weXgiOjQKKyAqIGNpbXBvcnQgX2tlbmxtCisgKiAKKyAqIGNkZWYgYnl0ZXMgYXNfc3RyKGRhdGEpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBieXRlcyk6CisgKiAgICAgICAgIHJldHVybiBkYXRhCisgKi8KKworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9mXzVrZW5sbV9hc19zdHIoUHlPYmplY3QgKl9fcHl4X3ZfZGF0YSkgeworICBQeU9iamVjdCAqX19weXhfciA9IE5VTEw7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIGludCBfX3B5eF90XzE7CisgIGludCBfX3B5eF90XzI7CisgIFB5T2JqZWN0ICpfX3B5eF90XzMgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF80ID0gTlVMTDsKKyAgaW50IF9fcHl4X2xpbmVubyA9IDA7CisgIGNvbnN0IGNoYXIgKl9fcHl4X2ZpbGVuYW1lID0gTlVMTDsKKyAgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiYXNfc3RyIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6NQorICogCisgKiBjZGVmIGJ5dGVzIGFzX3N0cihkYXRhKToKKyAqICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGJ5dGVzKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICByZXR1cm4gZGF0YQorICogICAgIGVsaWYgaXNpbnN0YW5jZShkYXRhLCB1bmljb2RlKToKKyAqLworICBfX3B5eF90XzEgPSBQeUJ5dGVzX0NoZWNrKF9fcHl4X3ZfZGF0YSk7IAorICBfX3B5eF90XzIgPSAoX19weXhfdF8xICE9IDApOworICBpZiAoX19weXhfdF8yKSB7CisKKyAgICAvKiAia2VubG0ucHl4Ijo2CisgKiBjZGVmIGJ5dGVzIGFzX3N0cihkYXRhKToKKyAqICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGJ5dGVzKToKKyAqICAgICAgICAgcmV0dXJuIGRhdGEgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgIGVsaWYgaXNpbnN0YW5jZShkYXRhLCB1bmljb2RlKToKKyAqICAgICAgICAgcmV0dXJuIGRhdGEuZW5jb2RlKCd1dGY4JykKKyAqLworICAgIF9fUHl4X1hERUNSRUYoX19weXhfcik7CisgICAgaWYgKCEobGlrZWx5KFB5Qnl0ZXNfQ2hlY2tFeGFjdChfX3B5eF92X2RhdGEpKXx8KChfX3B5eF92X2RhdGEpID09IFB5X05vbmUpfHwoUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIkV4cGVjdGVkICUuMTZzLCBnb3QgJS4yMDBzIiwgImJ5dGVzIiwgUHlfVFlQRShfX3B5eF92X2RhdGEpLT50cF9uYW1lKSwgMCkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA2OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0lOQ1JFRihfX3B5eF92X2RhdGEpOworICAgIF9fcHl4X3IgPSAoKFB5T2JqZWN0KilfX3B5eF92X2RhdGEpOworICAgIGdvdG8gX19weXhfTDA7CisgIH0KKworICAvKiAia2VubG0ucHl4Ijo3CisgKiAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBieXRlcyk6CisgKiAgICAgICAgIHJldHVybiBkYXRhCisgKiAgICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIHJldHVybiBkYXRhLmVuY29kZSgndXRmOCcpCisgKiAgICAgcmFpc2UgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAlcyB0byBzdHJpbmcnICUgdHlwZShkYXRhKSkKKyAqLworICBfX3B5eF90XzIgPSBQeVVuaWNvZGVfQ2hlY2soX19weXhfdl9kYXRhKTsgCisgIF9fcHl4X3RfMSA9IChfX3B5eF90XzIgIT0gMCk7CisgIGlmIChfX3B5eF90XzEpIHsKKworICAgIC8qICJrZW5sbS5weXgiOjgKKyAqICAgICAgICAgcmV0dXJuIGRhdGEKKyAqICAgICBlbGlmIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSk6CisgKiAgICAgICAgIHJldHVybiBkYXRhLmVuY29kZSgndXRmOCcpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICVzIHRvIHN0cmluZycgJSB0eXBlKGRhdGEpKQorICogCisgKi8KKyAgICBfX1B5eF9YREVDUkVGKF9fcHl4X3IpOworICAgIF9fcHl4X3RfMyA9IF9fUHl4X1B5T2JqZWN0X0dldEF0dHJTdHIoX19weXhfdl9kYXRhLCBfX3B5eF9uX3NfZW5jb2RlKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA4OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzMpOworICAgIF9fcHl4X3RfNCA9IF9fUHl4X1B5T2JqZWN0X0NhbGwoX19weXhfdF8zLCBfX3B5eF90dXBsZV8sIE5VTEwpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDg7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfNCk7CisgICAgX19QeXhfREVDUkVGKF9fcHl4X3RfMyk7IF9fcHl4X3RfMyA9IDA7CisgICAgaWYgKCEobGlrZWx5KFB5Qnl0ZXNfQ2hlY2tFeGFjdChfX3B5eF90XzQpKXx8KChfX3B5eF90XzQpID09IFB5X05vbmUpfHwoUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIkV4cGVjdGVkICUuMTZzLCBnb3QgJS4yMDBzIiwgImJ5dGVzIiwgUHlfVFlQRShfX3B5eF90XzQpLT50cF9uYW1lKSwgMCkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA4OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fcHl4X3IgPSAoKFB5T2JqZWN0KilfX3B5eF90XzQpOworICAgIF9fcHl4X3RfNCA9IDA7CisgICAgZ290byBfX3B5eF9MMDsKKyAgfQorCisgIC8qICJrZW5sbS5weXgiOjkKKyAqICAgICBlbGlmIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSk6CisgKiAgICAgICAgIHJldHVybiBkYXRhLmVuY29kZSgndXRmOCcpCisgKiAgICAgcmFpc2UgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAlcyB0byBzdHJpbmcnICUgdHlwZShkYXRhKSkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogCisgKiBjZGVmIGNsYXNzIEZ1bGxTY29yZVJldHVybjoKKyAqLworICBfX3B5eF90XzQgPSBfX1B5eF9QeVN0cmluZ19Gb3JtYXQoX19weXhfa3Bfc19DYW5ub3RfY29udmVydF9zX3RvX3N0cmluZywgKChQeU9iamVjdCAqKVB5X1RZUEUoX19weXhfdl9kYXRhKSkpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDk7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzQpOworICBfX3B5eF90XzMgPSBQeVR1cGxlX05ldygxKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8zKTsKKyAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzMsIDAsIF9fcHl4X3RfNCk7CisgIF9fUHl4X0dJVkVSRUYoX19weXhfdF80KTsKKyAgX19weXhfdF80ID0gMDsKKyAgX19weXhfdF80ID0gX19QeXhfUHlPYmplY3RfQ2FsbChfX3B5eF9idWlsdGluX1R5cGVFcnJvciwgX19weXhfdF8zLCBOVUxMKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzQpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF80KTsKKyAgX19QeXhfREVDUkVGKF9fcHl4X3RfMyk7IF9fcHl4X3RfMyA9IDA7CisgIF9fUHl4X1JhaXNlKF9fcHl4X3RfNCwgMCwgMCwgMCk7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzQpOyBfX3B5eF90XzQgPSAwOworICB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorCisgIC8qICJrZW5sbS5weXgiOjQKKyAqIGNpbXBvcnQgX2tlbmxtCisgKiAKKyAqIGNkZWYgYnl0ZXMgYXNfc3RyKGRhdGEpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBieXRlcyk6CisgKiAgICAgICAgIHJldHVybiBkYXRhCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfTDFfZXJyb3I6OworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMyk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF80KTsKKyAgX19QeXhfQWRkVHJhY2ViYWNrKCJrZW5sbS5hc19zdHIiLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19weXhfciA9IDA7CisgIF9fcHl4X0wwOjsKKyAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworLyogImtlbmxtLnB5eCI6MjQKKyAqICAgICBjZGVmIGJpbnQgb292CisgKiAKKyAqICAgICBkZWYgX19jaW5pdF9fKHNlbGYsIGxvZ19wcm9iLCBuZ3JhbV9sZW5ndGgsIG9vdik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgc2VsZi5sb2dfcHJvYiA9IGxvZ19wcm9iCisgKiAgICAgICAgIHNlbGYubmdyYW1fbGVuZ3RoID0gbmdyYW1fbGVuZ3RoCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyBpbnQgX19weXhfcHdfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuXzFfX2Npbml0X18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZiwgUHlPYmplY3QgKl9fcHl4X2FyZ3MsIFB5T2JqZWN0ICpfX3B5eF9rd2RzKTsgLypwcm90byovCitzdGF0aWMgaW50IF9fcHl4X3B3XzVrZW5sbV8xNUZ1bGxTY29yZVJldHVybl8xX19jaW5pdF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF9hcmdzLCBQeU9iamVjdCAqX19weXhfa3dkcykgeworICBQeU9iamVjdCAqX19weXhfdl9sb2dfcHJvYiA9IDA7CisgIFB5T2JqZWN0ICpfX3B5eF92X25ncmFtX2xlbmd0aCA9IDA7CisgIFB5T2JqZWN0ICpfX3B5eF92X29vdiA9IDA7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgaW50IF9fcHl4X3I7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX2Npbml0X18gKHdyYXBwZXIpIiwgMCk7CisgIHsKKyAgICBzdGF0aWMgUHlPYmplY3QgKipfX3B5eF9weWFyZ25hbWVzW10gPSB7Jl9fcHl4X25fc19sb2dfcHJvYiwmX19weXhfbl9zX25ncmFtX2xlbmd0aCwmX19weXhfbl9zX29vdiwwfTsKKyAgICBQeU9iamVjdCogdmFsdWVzWzNdID0gezAsMCwwfTsKKyAgICBpZiAodW5saWtlbHkoX19weXhfa3dkcykpIHsKKyAgICAgIFB5X3NzaXplX3Qga3dfYXJnczsKKyAgICAgIGNvbnN0IFB5X3NzaXplX3QgcG9zX2FyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKF9fcHl4X2FyZ3MpOworICAgICAgc3dpdGNoIChwb3NfYXJncykgeworICAgICAgICBjYXNlICAzOiB2YWx1ZXNbMl0gPSBQeVR1cGxlX0dFVF9JVEVNKF9fcHl4X2FyZ3MsIDIpOworICAgICAgICBjYXNlICAyOiB2YWx1ZXNbMV0gPSBQeVR1cGxlX0dFVF9JVEVNKF9fcHl4X2FyZ3MsIDEpOworICAgICAgICBjYXNlICAxOiB2YWx1ZXNbMF0gPSBQeVR1cGxlX0dFVF9JVEVNKF9fcHl4X2FyZ3MsIDApOworICAgICAgICBjYXNlICAwOiBicmVhazsKKyAgICAgICAgZGVmYXVsdDogZ290byBfX3B5eF9MNV9hcmd0dXBsZV9lcnJvcjsKKyAgICAgIH0KKyAgICAgIGt3X2FyZ3MgPSBQeURpY3RfU2l6ZShfX3B5eF9rd2RzKTsKKyAgICAgIHN3aXRjaCAocG9zX2FyZ3MpIHsKKyAgICAgICAgY2FzZSAgMDoKKyAgICAgICAgaWYgKGxpa2VseSgodmFsdWVzWzBdID0gUHlEaWN0X0dldEl0ZW0oX19weXhfa3dkcywgX19weXhfbl9zX2xvZ19wcm9iKSkgIT0gMCkpIGt3X2FyZ3MtLTsKKyAgICAgICAgZWxzZSBnb3RvIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOworICAgICAgICBjYXNlICAxOgorICAgICAgICBpZiAobGlrZWx5KCh2YWx1ZXNbMV0gPSBQeURpY3RfR2V0SXRlbShfX3B5eF9rd2RzLCBfX3B5eF9uX3NfbmdyYW1fbGVuZ3RoKSkgIT0gMCkpIGt3X2FyZ3MtLTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgX19QeXhfUmFpc2VBcmd0dXBsZUludmFsaWQoIl9fY2luaXRfXyIsIDEsIDMsIDMsIDEpOyB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyNDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgICAgICAgfQorICAgICAgICBjYXNlICAyOgorICAgICAgICBpZiAobGlrZWx5KCh2YWx1ZXNbMl0gPSBQeURpY3RfR2V0SXRlbShfX3B5eF9rd2RzLCBfX3B5eF9uX3Nfb292KSkgIT0gMCkpIGt3X2FyZ3MtLTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgX19QeXhfUmFpc2VBcmd0dXBsZUludmFsaWQoIl9fY2luaXRfXyIsIDEsIDMsIDMsIDIpOyB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyNDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHVubGlrZWx5KGt3X2FyZ3MgPiAwKSkgeworICAgICAgICBpZiAodW5saWtlbHkoX19QeXhfUGFyc2VPcHRpb25hbEtleXdvcmRzKF9fcHl4X2t3ZHMsIF9fcHl4X3B5YXJnbmFtZXMsIDAsIHZhbHVlcywgcG9zX2FyZ3MsICJfX2Npbml0X18iKSA8IDApKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyNDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFB5VHVwbGVfR0VUX1NJWkUoX19weXhfYXJncykgIT0gMykgeworICAgICAgZ290byBfX3B5eF9MNV9hcmd0dXBsZV9lcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgdmFsdWVzWzBdID0gUHlUdXBsZV9HRVRfSVRFTShfX3B5eF9hcmdzLCAwKTsKKyAgICAgIHZhbHVlc1sxXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMSk7CisgICAgICB2YWx1ZXNbMl0gPSBQeVR1cGxlX0dFVF9JVEVNKF9fcHl4X2FyZ3MsIDIpOworICAgIH0KKyAgICBfX3B5eF92X2xvZ19wcm9iID0gdmFsdWVzWzBdOworICAgIF9fcHl4X3ZfbmdyYW1fbGVuZ3RoID0gdmFsdWVzWzFdOworICAgIF9fcHl4X3Zfb292ID0gdmFsdWVzWzJdOworICB9CisgIGdvdG8gX19weXhfTDRfYXJndW1lbnRfdW5wYWNraW5nX2RvbmU7CisgIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOjsKKyAgX19QeXhfUmFpc2VBcmd0dXBsZUludmFsaWQoIl9fY2luaXRfXyIsIDEsIDMsIDMsIFB5VHVwbGVfR0VUX1NJWkUoX19weXhfYXJncykpOyB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyNDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgX19weXhfTDNfZXJyb3I6OworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLkZ1bGxTY29yZVJldHVybi5fX2Npbml0X18iLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiAtMTsKKyAgX19weXhfTDRfYXJndW1lbnRfdW5wYWNraW5nX2RvbmU6OworICBfX3B5eF9yID0gX19weXhfcGZfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuX19fY2luaXRfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0Z1bGxTY29yZVJldHVybiAqKV9fcHl4X3Zfc2VsZiksIF9fcHl4X3ZfbG9nX3Byb2IsIF9fcHl4X3ZfbmdyYW1fbGVuZ3RoLCBfX3B5eF92X29vdik7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIGludCBfX3B5eF9wZl81a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fX19jaW5pdF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0Z1bGxTY29yZVJldHVybiAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl9sb2dfcHJvYiwgUHlPYmplY3QgKl9fcHl4X3ZfbmdyYW1fbGVuZ3RoLCBQeU9iamVjdCAqX19weXhfdl9vb3YpIHsKKyAgaW50IF9fcHl4X3I7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIGZsb2F0IF9fcHl4X3RfMTsKKyAgaW50IF9fcHl4X3RfMjsKKyAgaW50IF9fcHl4X3RfMzsKKyAgaW50IF9fcHl4X2xpbmVubyA9IDA7CisgIGNvbnN0IGNoYXIgKl9fcHl4X2ZpbGVuYW1lID0gTlVMTDsKKyAgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19jaW5pdF9fIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6MjUKKyAqIAorICogICAgIGRlZiBfX2Npbml0X18oc2VsZiwgbG9nX3Byb2IsIG5ncmFtX2xlbmd0aCwgb292KToKKyAqICAgICAgICAgc2VsZi5sb2dfcHJvYiA9IGxvZ19wcm9iICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgc2VsZi5uZ3JhbV9sZW5ndGggPSBuZ3JhbV9sZW5ndGgKKyAqICAgICAgICAgc2VsZi5vb3YgPSBvb3YKKyAqLworICBfX3B5eF90XzEgPSBfX3B5eF9QeUZsb2F0X0FzRmxvYXQoX19weXhfdl9sb2dfcHJvYik7IGlmICh1bmxpa2VseSgoX19weXhfdF8xID09IChmbG9hdCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDI1OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF92X3NlbGYtPmxvZ19wcm9iID0gX19weXhfdF8xOworCisgIC8qICJrZW5sbS5weXgiOjI2CisgKiAgICAgZGVmIF9fY2luaXRfXyhzZWxmLCBsb2dfcHJvYiwgbmdyYW1fbGVuZ3RoLCBvb3YpOgorICogICAgICAgICBzZWxmLmxvZ19wcm9iID0gbG9nX3Byb2IKKyAqICAgICAgICAgc2VsZi5uZ3JhbV9sZW5ndGggPSBuZ3JhbV9sZW5ndGggICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBzZWxmLm9vdiA9IG9vdgorICogCisgKi8KKyAgX19weXhfdF8yID0gX19QeXhfUHlJbnRfQXNfaW50KF9fcHl4X3ZfbmdyYW1fbGVuZ3RoKTsgaWYgKHVubGlrZWx5KChfX3B5eF90XzIgPT0gKGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDI2OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF92X3NlbGYtPm5ncmFtX2xlbmd0aCA9IF9fcHl4X3RfMjsKKworICAvKiAia2VubG0ucHl4IjoyNworICogICAgICAgICBzZWxmLmxvZ19wcm9iID0gbG9nX3Byb2IKKyAqICAgICAgICAgc2VsZi5uZ3JhbV9sZW5ndGggPSBuZ3JhbV9sZW5ndGgKKyAqICAgICAgICAgc2VsZi5vb3YgPSBvb3YgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogCisgKiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICovCisgIF9fcHl4X3RfMyA9IF9fUHl4X1B5T2JqZWN0X0lzVHJ1ZShfX3B5eF92X29vdik7IGlmICh1bmxpa2VseSgoX19weXhfdF8zID09IChpbnQpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyNzsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19weXhfdl9zZWxmLT5vb3YgPSBfX3B5eF90XzM7CisKKyAgLyogImtlbmxtLnB5eCI6MjQKKyAqICAgICBjZGVmIGJpbnQgb292CisgKiAKKyAqICAgICBkZWYgX19jaW5pdF9fKHNlbGYsIGxvZ19wcm9iLCBuZ3JhbV9sZW5ndGgsIG9vdik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgc2VsZi5sb2dfcHJvYiA9IGxvZ19wcm9iCisgKiAgICAgICAgIHNlbGYubmdyYW1fbGVuZ3RoID0gbmdyYW1fbGVuZ3RoCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfciA9IDA7CisgIGdvdG8gX19weXhfTDA7CisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19QeXhfQWRkVHJhY2ViYWNrKCJrZW5sbS5GdWxsU2NvcmVSZXR1cm4uX19jaW5pdF9fIiwgX19weXhfY2xpbmVubywgX19weXhfbGluZW5vLCBfX3B5eF9maWxlbmFtZSk7CisgIF9fcHl4X3IgPSAtMTsKKyAgX19weXhfTDA6OworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKKy8qICJrZW5sbS5weXgiOjI5CisgKiAgICAgICAgIHNlbGYub292ID0gb292CisgKiAKKyAqICAgICBkZWYgX19yZXByX18oc2VsZik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgcmV0dXJuICd7MH0oezF9LCB7Mn0sIHszfSknLmZvcm1hdChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgcmVwcihzZWxmLmxvZ19wcm9iKSwgcmVwcihzZWxmLm5ncmFtX2xlbmd0aCksIHJlcHIoc2VsZi5vb3YpKQorICogCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcHdfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuXzNfX3JlcHJfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmKTsgLypwcm90byovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV8xNUZ1bGxTY29yZVJldHVybl8zX19yZXByX18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZikgeworICBQeU9iamVjdCAqX19weXhfciA9IDA7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX3JlcHJfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV8xNUZ1bGxTY29yZVJldHVybl8yX19yZXByX18oKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4gKilfX3B5eF92X3NlbGYpKTsKKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3BmXzVrZW5sbV8xNUZ1bGxTY29yZVJldHVybl8yX19yZXByX18oc3RydWN0IF9fcHl4X29ial81a2VubG1fRnVsbFNjb3JlUmV0dXJuICpfX3B5eF92X3NlbGYpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSBOVUxMOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBQeU9iamVjdCAqX19weXhfdF8xID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfMiA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzMgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF80ID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfNSA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzYgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF83ID0gTlVMTDsKKyAgUHlfc3NpemVfdCBfX3B5eF90Xzg7CisgIFB5T2JqZWN0ICpfX3B5eF90XzkgPSBOVUxMOworICBpbnQgX19weXhfbGluZW5vID0gMDsKKyAgY29uc3QgY2hhciAqX19weXhfZmlsZW5hbWUgPSBOVUxMOworICBpbnQgX19weXhfY2xpbmVubyA9IDA7CisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX3JlcHJfXyIsIDApOworCisgIC8qICJrZW5sbS5weXgiOjMwCisgKiAKKyAqICAgICBkZWYgX19yZXByX18oc2VsZik6CisgKiAgICAgICAgIHJldHVybiAnezB9KHsxfSwgezJ9LCB7M30pJy5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHJlcHIoc2VsZi5sb2dfcHJvYiksIHJlcHIoc2VsZi5uZ3JhbV9sZW5ndGgpLCByZXByKHNlbGYub292KSkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogCisgKiAgICAgcHJvcGVydHkgbG9nX3Byb2I6CisgKi8KKyAgX19QeXhfWERFQ1JFRihfX3B5eF9yKTsKKyAgX19weXhfdF8yID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF9rcF9zXzBfMV8yXzMsIF9fcHl4X25fc19mb3JtYXQpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMikpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDMwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8yKTsKKyAgX19weXhfdF8zID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cigoKFB5T2JqZWN0ICopX19weXhfdl9zZWxmKSwgX19weXhfbl9zX2NsYXNzKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAzMDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgIF9fcHl4X3RfNCA9IF9fUHl4X1B5T2JqZWN0X0dldEF0dHJTdHIoX19weXhfdF8zLCBfX3B5eF9uX3NfbmFtZSk7IGlmICh1bmxpa2VseSghX19weXhfdF80KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMzA7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzQpOworICBfX1B5eF9ERUNSRUYoX19weXhfdF8zKTsgX19weXhfdF8zID0gMDsKKyAgX19weXhfdF8zID0gUHlGbG9hdF9Gcm9tRG91YmxlKF9fcHl4X3Zfc2VsZi0+bG9nX3Byb2IpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDMwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8zKTsKKyAgX19weXhfdF81ID0gUHlPYmplY3RfUmVwcihfX3B5eF90XzMpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDMwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF81KTsKKyAgX19QeXhfREVDUkVGKF9fcHl4X3RfMyk7IF9fcHl4X3RfMyA9IDA7CisgIF9fcHl4X3RfMyA9IF9fUHl4X1B5SW50X0Zyb21faW50KF9fcHl4X3Zfc2VsZi0+bmdyYW1fbGVuZ3RoKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAzMDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgIF9fcHl4X3RfNiA9IFB5T2JqZWN0X1JlcHIoX19weXhfdF8zKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzYpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAzMDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfNik7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzMpOyBfX3B5eF90XzMgPSAwOworICBfX3B5eF90XzMgPSBfX1B5eF9QeUJvb2xfRnJvbUxvbmcoX19weXhfdl9zZWxmLT5vb3YpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDMwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8zKTsKKyAgX19weXhfdF83ID0gUHlPYmplY3RfUmVwcihfX3B5eF90XzMpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDMwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF83KTsKKyAgX19QeXhfREVDUkVGKF9fcHl4X3RfMyk7IF9fcHl4X3RfMyA9IDA7CisgIF9fcHl4X3RfMyA9IE5VTEw7CisgIF9fcHl4X3RfOCA9IDA7CisgIGlmIChDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04gJiYgbGlrZWx5KFB5TWV0aG9kX0NoZWNrKF9fcHl4X3RfMikpKSB7CisgICAgX19weXhfdF8zID0gUHlNZXRob2RfR0VUX1NFTEYoX19weXhfdF8yKTsKKyAgICBpZiAobGlrZWx5KF9fcHl4X3RfMykpIHsKKyAgICAgIFB5T2JqZWN0KiBmdW5jdGlvbiA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihfX3B5eF90XzIpOworICAgICAgX19QeXhfSU5DUkVGKF9fcHl4X3RfMyk7CisgICAgICBfX1B5eF9JTkNSRUYoZnVuY3Rpb24pOworICAgICAgX19QeXhfREVDUkVGX1NFVChfX3B5eF90XzIsIGZ1bmN0aW9uKTsKKyAgICAgIF9fcHl4X3RfOCA9IDE7CisgICAgfQorICB9CisgIF9fcHl4X3RfOSA9IFB5VHVwbGVfTmV3KDQrX19weXhfdF84KTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAzMDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfOSk7CisgIGlmIChfX3B5eF90XzMpIHsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKF9fcHl4X3RfOSwgMCwgX19weXhfdF8zKTsgX19QeXhfR0lWRVJFRihfX3B5eF90XzMpOyBfX3B5eF90XzMgPSBOVUxMOworICB9CisgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF85LCAwK19fcHl4X3RfOCwgX19weXhfdF80KTsKKyAgX19QeXhfR0lWRVJFRihfX3B5eF90XzQpOworICBQeVR1cGxlX1NFVF9JVEVNKF9fcHl4X3RfOSwgMStfX3B5eF90XzgsIF9fcHl4X3RfNSk7CisgIF9fUHl4X0dJVkVSRUYoX19weXhfdF81KTsKKyAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzksIDIrX19weXhfdF84LCBfX3B5eF90XzYpOworICBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfNik7CisgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF85LCAzK19fcHl4X3RfOCwgX19weXhfdF83KTsKKyAgX19QeXhfR0lWRVJFRihfX3B5eF90XzcpOworICBfX3B5eF90XzQgPSAwOworICBfX3B5eF90XzUgPSAwOworICBfX3B5eF90XzYgPSAwOworICBfX3B5eF90XzcgPSAwOworICBfX3B5eF90XzEgPSBfX1B5eF9QeU9iamVjdF9DYWxsKF9fcHl4X3RfMiwgX19weXhfdF85LCBOVUxMKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAzMDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMSk7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzkpOyBfX3B5eF90XzkgPSAwOworICBfX1B5eF9ERUNSRUYoX19weXhfdF8yKTsgX19weXhfdF8yID0gMDsKKyAgX19weXhfciA9IF9fcHl4X3RfMTsKKyAgX19weXhfdF8xID0gMDsKKyAgZ290byBfX3B5eF9MMDsKKworICAvKiAia2VubG0ucHl4IjoyOQorICogICAgICAgICBzZWxmLm9vdiA9IG9vdgorICogCisgKiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIHJldHVybiAnezB9KHsxfSwgezJ9LCB7M30pJy5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHJlcHIoc2VsZi5sb2dfcHJvYiksIHJlcHIoc2VsZi5uZ3JhbV9sZW5ndGgpLCByZXByKHNlbGYub292KSkKKyAqIAorICovCisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzEpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMik7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8zKTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzQpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfNSk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF82KTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzcpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfOSk7CisgIF9fUHl4X0FkZFRyYWNlYmFjaygia2VubG0uRnVsbFNjb3JlUmV0dXJuLl9fcmVwcl9fIiwgX19weXhfY2xpbmVubywgX19weXhfbGluZW5vLCBfX3B5eF9maWxlbmFtZSk7CisgIF9fcHl4X3IgPSBOVUxMOworICBfX3B5eF9MMDo7CisgIF9fUHl4X1hHSVZFUkVGKF9fcHl4X3IpOworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKKy8qICJrZW5sbS5weXgiOjMzCisgKiAKKyAqICAgICBwcm9wZXJ0eSBsb2dfcHJvYjoKKyAqICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHJldHVybiBzZWxmLmxvZ19wcm9iCisgKiAKKyAqLworCisvKiBQeXRob24gd3JhcHBlciAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fOGxvZ19wcm9iXzFfX2dldF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpOyAvKnByb3RvKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcHdfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuXzhsb2dfcHJvYl8xX19nZXRfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmKSB7CisgIFB5T2JqZWN0ICpfX3B5eF9yID0gMDsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fZ2V0X18gKHdyYXBwZXIpIiwgMCk7CisgIF9fcHl4X3IgPSBfX3B5eF9wZl81a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fOGxvZ19wcm9iX19fZ2V0X18oKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4gKilfX3B5eF92X3NlbGYpKTsKKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3BmXzVrZW5sbV8xNUZ1bGxTY29yZVJldHVybl84bG9nX3Byb2JfX19nZXRfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4gKl9fcHl4X3Zfc2VsZikgeworICBQeU9iamVjdCAqX19weXhfciA9IE5VTEw7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIFB5T2JqZWN0ICpfX3B5eF90XzEgPSBOVUxMOworICBpbnQgX19weXhfbGluZW5vID0gMDsKKyAgY29uc3QgY2hhciAqX19weXhfZmlsZW5hbWUgPSBOVUxMOworICBpbnQgX19weXhfY2xpbmVubyA9IDA7CisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX2dldF9fIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6MzQKKyAqICAgICBwcm9wZXJ0eSBsb2dfcHJvYjoKKyAqICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZik6CisgKiAgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2dfcHJvYiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAKKyAqICAgICBwcm9wZXJ0eSBuZ3JhbV9sZW5ndGg6CisgKi8KKyAgX19QeXhfWERFQ1JFRihfX3B5eF9yKTsKKyAgX19weXhfdF8xID0gUHlGbG9hdF9Gcm9tRG91YmxlKF9fcHl4X3Zfc2VsZi0+bG9nX3Byb2IpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDM0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgX19weXhfciA9IF9fcHl4X3RfMTsKKyAgX19weXhfdF8xID0gMDsKKyAgZ290byBfX3B5eF9MMDsKKworICAvKiAia2VubG0ucHl4IjozMworICogCisgKiAgICAgcHJvcGVydHkgbG9nX3Byb2I6CisgKiAgICAgICAgIGRlZiBfX2dldF9fKHNlbGYpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2dfcHJvYgorICogCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfTDFfZXJyb3I6OworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMSk7CisgIF9fUHl4X0FkZFRyYWNlYmFjaygia2VubG0uRnVsbFNjb3JlUmV0dXJuLmxvZ19wcm9iLl9fZ2V0X18iLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19weXhfciA9IE5VTEw7CisgIF9fcHl4X0wwOjsKKyAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworLyogImtlbmxtLnB5eCI6MzcKKyAqIAorICogICAgIHByb3BlcnR5IG5ncmFtX2xlbmd0aDoKKyAqICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHJldHVybiBzZWxmLm5ncmFtX2xlbmd0aAorICogCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcHdfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuXzEybmdyYW1fbGVuZ3RoXzFfX2dldF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpOyAvKnByb3RvKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcHdfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuXzEybmdyYW1fbGVuZ3RoXzFfX2dldF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSAwOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19nZXRfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV8xNUZ1bGxTY29yZVJldHVybl8xMm5ncmFtX2xlbmd0aF9fX2dldF9fKCgoc3RydWN0IF9fcHl4X29ial81a2VubG1fRnVsbFNjb3JlUmV0dXJuICopX19weXhfdl9zZWxmKSk7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fMTJuZ3JhbV9sZW5ndGhfX19nZXRfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4gKl9fcHl4X3Zfc2VsZikgeworICBQeU9iamVjdCAqX19weXhfciA9IE5VTEw7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIFB5T2JqZWN0ICpfX3B5eF90XzEgPSBOVUxMOworICBpbnQgX19weXhfbGluZW5vID0gMDsKKyAgY29uc3QgY2hhciAqX19weXhfZmlsZW5hbWUgPSBOVUxMOworICBpbnQgX19weXhfY2xpbmVubyA9IDA7CisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX2dldF9fIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6MzgKKyAqICAgICBwcm9wZXJ0eSBuZ3JhbV9sZW5ndGg6CisgKiAgICAgICAgIGRlZiBfX2dldF9fKHNlbGYpOgorICogICAgICAgICAgICAgcmV0dXJuIHNlbGYubmdyYW1fbGVuZ3RoICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqIAorICogICAgIHByb3BlcnR5IG9vdjoKKyAqLworICBfX1B5eF9YREVDUkVGKF9fcHl4X3IpOworICBfX3B5eF90XzEgPSBfX1B5eF9QeUludF9Gcm9tX2ludChfX3B5eF92X3NlbGYtPm5ncmFtX2xlbmd0aCk7IGlmICh1bmxpa2VseSghX19weXhfdF8xKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMzg7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICBfX3B5eF9yID0gX19weXhfdF8xOworICBfX3B5eF90XzEgPSAwOworICBnb3RvIF9fcHl4X0wwOworCisgIC8qICJrZW5sbS5weXgiOjM3CisgKiAKKyAqICAgICBwcm9wZXJ0eSBuZ3JhbV9sZW5ndGg6CisgKiAgICAgICAgIGRlZiBfX2dldF9fKHNlbGYpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICByZXR1cm4gc2VsZi5uZ3JhbV9sZW5ndGgKKyAqIAorICovCisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzEpOworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLkZ1bGxTY29yZVJldHVybi5uZ3JhbV9sZW5ndGguX19nZXRfXyIsIF9fcHl4X2NsaW5lbm8sIF9fcHl4X2xpbmVubywgX19weXhfZmlsZW5hbWUpOworICBfX3B5eF9yID0gTlVMTDsKKyAgX19weXhfTDA6OworICBfX1B5eF9YR0lWRVJFRihfX3B5eF9yKTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCisvKiAia2VubG0ucHl4Ijo0MQorICogCisgKiAgICAgcHJvcGVydHkgb292OgorICogICAgICAgICBkZWYgX19nZXRfXyhzZWxmKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgcmV0dXJuIHNlbGYub292CisgKiAKKyAqLworCisvKiBQeXRob24gd3JhcHBlciAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fM29vdl8xX19nZXRfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmKTsgLypwcm90byovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV8xNUZ1bGxTY29yZVJldHVybl8zb292XzFfX2dldF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSAwOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19nZXRfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV8xNUZ1bGxTY29yZVJldHVybl8zb292X19fZ2V0X18oKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4gKilfX3B5eF92X3NlbGYpKTsKKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3BmXzVrZW5sbV8xNUZ1bGxTY29yZVJldHVybl8zb292X19fZ2V0X18oc3RydWN0IF9fcHl4X29ial81a2VubG1fRnVsbFNjb3JlUmV0dXJuICpfX3B5eF92X3NlbGYpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSBOVUxMOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBQeU9iamVjdCAqX19weXhfdF8xID0gTlVMTDsKKyAgaW50IF9fcHl4X2xpbmVubyA9IDA7CisgIGNvbnN0IGNoYXIgKl9fcHl4X2ZpbGVuYW1lID0gTlVMTDsKKyAgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19nZXRfXyIsIDApOworCisgIC8qICJrZW5sbS5weXgiOjQyCisgKiAgICAgcHJvcGVydHkgb292OgorICogICAgICAgICBkZWYgX19nZXRfXyhzZWxmKToKKyAqICAgICAgICAgICAgIHJldHVybiBzZWxmLm9vdiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAKKyAqIGNkZWYgY2xhc3MgU3RhdGU6CisgKi8KKyAgX19QeXhfWERFQ1JFRihfX3B5eF9yKTsKKyAgX19weXhfdF8xID0gX19QeXhfUHlCb29sX0Zyb21Mb25nKF9fcHl4X3Zfc2VsZi0+b292KTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA0MjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMSk7CisgIF9fcHl4X3IgPSBfX3B5eF90XzE7CisgIF9fcHl4X3RfMSA9IDA7CisgIGdvdG8gX19weXhfTDA7CisKKyAgLyogImtlbmxtLnB5eCI6NDEKKyAqIAorICogICAgIHByb3BlcnR5IG9vdjoKKyAqICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHJldHVybiBzZWxmLm9vdgorICogCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfTDFfZXJyb3I6OworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMSk7CisgIF9fUHl4X0FkZFRyYWNlYmFjaygia2VubG0uRnVsbFNjb3JlUmV0dXJuLm9vdi5fX2dldF9fIiwgX19weXhfY2xpbmVubywgX19weXhfbGluZW5vLCBfX3B5eF9maWxlbmFtZSk7CisgIF9fcHl4X3IgPSBOVUxMOworICBfX3B5eF9MMDo7CisgIF9fUHl4X1hHSVZFUkVGKF9fcHl4X3IpOworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKKy8qICJrZW5sbS5weXgiOjU1CisgKiAgICAgY2RlZiBfa2VubG0uU3RhdGUgX2Nfc3RhdGUKKyAqIAorICogICAgIGRlZiBfX3JpY2hjbXBfXyhTdGF0ZSBxYSwgU3RhdGUgcWIsIGludCBvcCk6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgciA9IHFhLl9jX3N0YXRlLkNvbXBhcmUocWIuX2Nfc3RhdGUpCisgKiAgICAgICAgIGlmIG9wID09IDA6ICAgICMgPAorICovCisKKy8qIFB5dGhvbiB3cmFwcGVyICovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV81U3RhdGVfMV9fcmljaGNtcF9fKFB5T2JqZWN0ICpfX3B5eF92X3FhLCBQeU9iamVjdCAqX19weXhfdl9xYiwgaW50IF9fcHl4X3Zfb3ApOyAvKnByb3RvKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcHdfNWtlbmxtXzVTdGF0ZV8xX19yaWNoY21wX18oUHlPYmplY3QgKl9fcHl4X3ZfcWEsIFB5T2JqZWN0ICpfX3B5eF92X3FiLCBpbnQgX19weXhfdl9vcCkgeworICBDWVRIT05fVU5VU0VEIGludCBfX3B5eF9saW5lbm8gPSAwOworICBDWVRIT05fVU5VU0VEIGNvbnN0IGNoYXIgKl9fcHl4X2ZpbGVuYW1lID0gTlVMTDsKKyAgQ1lUSE9OX1VOVVNFRCBpbnQgX19weXhfY2xpbmVubyA9IDA7CisgIFB5T2JqZWN0ICpfX3B5eF9yID0gMDsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fcmljaGNtcF9fICh3cmFwcGVyKSIsIDApOworICBpZiAodW5saWtlbHkoIV9fUHl4X0FyZ1R5cGVUZXN0KCgoUHlPYmplY3QgKilfX3B5eF92X3FhKSwgX19weXhfcHR5cGVfNWtlbmxtX1N0YXRlLCAxLCAicWEiLCAwKSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDU1OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBpZiAodW5saWtlbHkoIV9fUHl4X0FyZ1R5cGVUZXN0KCgoUHlPYmplY3QgKilfX3B5eF92X3FiKSwgX19weXhfcHR5cGVfNWtlbmxtX1N0YXRlLCAxLCAicWIiLCAwKSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDU1OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF9yID0gX19weXhfcGZfNWtlbmxtXzVTdGF0ZV9fX3JpY2hjbXBfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX1N0YXRlICopX19weXhfdl9xYSksICgoc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKilfX3B5eF92X3FiKSwgKChpbnQpX19weXhfdl9vcCkpOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBnb3RvIF9fcHl4X0wwOworICBfX3B5eF9MMV9lcnJvcjo7CisgIF9fcHl4X3IgPSBOVUxMOworICBfX3B5eF9MMDo7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fNVN0YXRlX19fcmljaGNtcF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX1N0YXRlICpfX3B5eF92X3FhLCBzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9TdGF0ZSAqX19weXhfdl9xYiwgaW50IF9fcHl4X3Zfb3ApIHsKKyAgaW50IF9fcHl4X3ZfcjsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSBOVUxMOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBQeU9iamVjdCAqX19weXhfdF8xID0gTlVMTDsKKyAgaW50IF9fcHl4X2xpbmVubyA9IDA7CisgIGNvbnN0IGNoYXIgKl9fcHl4X2ZpbGVuYW1lID0gTlVMTDsKKyAgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19yaWNoY21wX18iLCAwKTsKKworICAvKiAia2VubG0ucHl4Ijo1NgorICogCisgKiAgICAgZGVmIF9fcmljaGNtcF9fKFN0YXRlIHFhLCBTdGF0ZSBxYiwgaW50IG9wKToKKyAqICAgICAgICAgciA9IHFhLl9jX3N0YXRlLkNvbXBhcmUocWIuX2Nfc3RhdGUpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgaWYgb3AgPT0gMDogICAgIyA8CisgKiAgICAgICAgICAgICByZXR1cm4gciA8IDAKKyAqLworICBfX3B5eF92X3IgPSBfX3B5eF92X3FhLT5fY19zdGF0ZS5Db21wYXJlKF9fcHl4X3ZfcWItPl9jX3N0YXRlKTsKKworICAvKiAia2VubG0ucHl4Ijo2NQorICogICAgICAgICBlbGlmIG9wID09IDM6ICAjICE9CisgKiAgICAgICAgICAgICByZXR1cm4gciAhPSAwCisgKiAgICAgICAgIGVsaWYgb3AgPT0gNDogICMgPiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICByZXR1cm4gciA+IDAKKyAqICAgICAgICAgZWxzZTogICAgICAgICAgIyA+PQorICovCisgIHN3aXRjaCAoX19weXhfdl9vcCkgeworCisgICAgLyogImtlbmxtLnB5eCI6NTcKKyAqICAgICBkZWYgX19yaWNoY21wX18oU3RhdGUgcWEsIFN0YXRlIHFiLCBpbnQgb3ApOgorICogICAgICAgICByID0gcWEuX2Nfc3RhdGUuQ29tcGFyZShxYi5fY19zdGF0ZSkKKyAqICAgICAgICAgaWYgb3AgPT0gMDogICAgIyA8ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHJldHVybiByIDwgMAorICogICAgICAgICBlbGlmIG9wID09IDE6ICAjIDw9CisgKi8KKyAgICBjYXNlIDA6CisKKyAgICAvKiAia2VubG0ucHl4Ijo1OAorICogICAgICAgICByID0gcWEuX2Nfc3RhdGUuQ29tcGFyZShxYi5fY19zdGF0ZSkKKyAqICAgICAgICAgaWYgb3AgPT0gMDogICAgIyA8CisgKiAgICAgICAgICAgICByZXR1cm4gciA8IDAgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBlbGlmIG9wID09IDE6ICAjIDw9CisgKiAgICAgICAgICAgICByZXR1cm4gciA8PSAwCisgKi8KKyAgICBfX1B5eF9YREVDUkVGKF9fcHl4X3IpOworICAgIF9fcHl4X3RfMSA9IF9fUHl4X1B5Qm9vbF9Gcm9tTG9uZygoX19weXhfdl9yIDwgMCkpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDU4OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICAgIF9fcHl4X3IgPSBfX3B5eF90XzE7CisgICAgX19weXhfdF8xID0gMDsKKyAgICBnb3RvIF9fcHl4X0wwOworICAgIGJyZWFrOworCisgICAgLyogImtlbmxtLnB5eCI6NTkKKyAqICAgICAgICAgaWYgb3AgPT0gMDogICAgIyA8CisgKiAgICAgICAgICAgICByZXR1cm4gciA8IDAKKyAqICAgICAgICAgZWxpZiBvcCA9PSAxOiAgIyA8PSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICByZXR1cm4gciA8PSAwCisgKiAgICAgICAgIGVsaWYgb3AgPT0gMjogICMgPT0KKyAqLworICAgIGNhc2UgMToKKworICAgIC8qICJrZW5sbS5weXgiOjYwCisgKiAgICAgICAgICAgICByZXR1cm4gciA8IDAKKyAqICAgICAgICAgZWxpZiBvcCA9PSAxOiAgIyA8PQorICogICAgICAgICAgICAgcmV0dXJuIHIgPD0gMCAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIGVsaWYgb3AgPT0gMjogICMgPT0KKyAqICAgICAgICAgICAgIHJldHVybiByID09IDAKKyAqLworICAgIF9fUHl4X1hERUNSRUYoX19weXhfcik7CisgICAgX19weXhfdF8xID0gX19QeXhfUHlCb29sX0Zyb21Mb25nKChfX3B5eF92X3IgPD0gMCkpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDYwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICAgIF9fcHl4X3IgPSBfX3B5eF90XzE7CisgICAgX19weXhfdF8xID0gMDsKKyAgICBnb3RvIF9fcHl4X0wwOworICAgIGJyZWFrOworCisgICAgLyogImtlbmxtLnB5eCI6NjEKKyAqICAgICAgICAgZWxpZiBvcCA9PSAxOiAgIyA8PQorICogICAgICAgICAgICAgcmV0dXJuIHIgPD0gMAorICogICAgICAgICBlbGlmIG9wID09IDI6ICAjID09ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHJldHVybiByID09IDAKKyAqICAgICAgICAgZWxpZiBvcCA9PSAzOiAgIyAhPQorICovCisgICAgY2FzZSAyOgorCisgICAgLyogImtlbmxtLnB5eCI6NjIKKyAqICAgICAgICAgICAgIHJldHVybiByIDw9IDAKKyAqICAgICAgICAgZWxpZiBvcCA9PSAyOiAgIyA9PQorICogICAgICAgICAgICAgcmV0dXJuIHIgPT0gMCAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIGVsaWYgb3AgPT0gMzogICMgIT0KKyAqICAgICAgICAgICAgIHJldHVybiByICE9IDAKKyAqLworICAgIF9fUHl4X1hERUNSRUYoX19weXhfcik7CisgICAgX19weXhfdF8xID0gX19QeXhfUHlCb29sX0Zyb21Mb25nKChfX3B5eF92X3IgPT0gMCkpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDYyOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICAgIF9fcHl4X3IgPSBfX3B5eF90XzE7CisgICAgX19weXhfdF8xID0gMDsKKyAgICBnb3RvIF9fcHl4X0wwOworICAgIGJyZWFrOworCisgICAgLyogImtlbmxtLnB5eCI6NjMKKyAqICAgICAgICAgZWxpZiBvcCA9PSAyOiAgIyA9PQorICogICAgICAgICAgICAgcmV0dXJuIHIgPT0gMAorICogICAgICAgICBlbGlmIG9wID09IDM6ICAjICE9ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHJldHVybiByICE9IDAKKyAqICAgICAgICAgZWxpZiBvcCA9PSA0OiAgIyA+CisgKi8KKyAgICBjYXNlIDM6CisKKyAgICAvKiAia2VubG0ucHl4Ijo2NAorICogICAgICAgICAgICAgcmV0dXJuIHIgPT0gMAorICogICAgICAgICBlbGlmIG9wID09IDM6ICAjICE9CisgKiAgICAgICAgICAgICByZXR1cm4gciAhPSAwICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgZWxpZiBvcCA9PSA0OiAgIyA+CisgKiAgICAgICAgICAgICByZXR1cm4gciA+IDAKKyAqLworICAgIF9fUHl4X1hERUNSRUYoX19weXhfcik7CisgICAgX19weXhfdF8xID0gX19QeXhfUHlCb29sX0Zyb21Mb25nKChfX3B5eF92X3IgIT0gMCkpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDY0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICAgIF9fcHl4X3IgPSBfX3B5eF90XzE7CisgICAgX19weXhfdF8xID0gMDsKKyAgICBnb3RvIF9fcHl4X0wwOworICAgIGJyZWFrOworCisgICAgLyogImtlbmxtLnB5eCI6NjUKKyAqICAgICAgICAgZWxpZiBvcCA9PSAzOiAgIyAhPQorICogICAgICAgICAgICAgcmV0dXJuIHIgIT0gMAorICogICAgICAgICBlbGlmIG9wID09IDQ6ICAjID4gICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgcmV0dXJuIHIgPiAwCisgKiAgICAgICAgIGVsc2U6ICAgICAgICAgICMgPj0KKyAqLworICAgIGNhc2UgNDoKKworICAgIC8qICJrZW5sbS5weXgiOjY2CisgKiAgICAgICAgICAgICByZXR1cm4gciAhPSAwCisgKiAgICAgICAgIGVsaWYgb3AgPT0gNDogICMgPgorICogICAgICAgICAgICAgcmV0dXJuIHIgPiAwICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgZWxzZTogICAgICAgICAgIyA+PQorICogICAgICAgICAgICAgcmV0dXJuIHIgPj0gMAorICovCisgICAgX19QeXhfWERFQ1JFRihfX3B5eF9yKTsKKyAgICBfX3B5eF90XzEgPSBfX1B5eF9QeUJvb2xfRnJvbUxvbmcoKF9fcHl4X3ZfciA+IDApKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA2NjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgICBfX3B5eF9yID0gX19weXhfdF8xOworICAgIF9fcHl4X3RfMSA9IDA7CisgICAgZ290byBfX3B5eF9MMDsKKyAgICBicmVhazsKKyAgICBkZWZhdWx0OgorCisgICAgLyogImtlbmxtLnB5eCI6NjgKKyAqICAgICAgICAgICAgIHJldHVybiByID4gMAorICogICAgICAgICBlbHNlOiAgICAgICAgICAjID49CisgKiAgICAgICAgICAgICByZXR1cm4gciA+PSAwICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqIAorICogICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAqLworICAgIF9fUHl4X1hERUNSRUYoX19weXhfcik7CisgICAgX19weXhfdF8xID0gX19QeXhfUHlCb29sX0Zyb21Mb25nKChfX3B5eF92X3IgPj0gMCkpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDY4OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICAgIF9fcHl4X3IgPSBfX3B5eF90XzE7CisgICAgX19weXhfdF8xID0gMDsKKyAgICBnb3RvIF9fcHl4X0wwOworICAgIGJyZWFrOworICB9CisKKyAgLyogImtlbmxtLnB5eCI6NTUKKyAqICAgICBjZGVmIF9rZW5sbS5TdGF0ZSBfY19zdGF0ZQorICogCisgKiAgICAgZGVmIF9fcmljaGNtcF9fKFN0YXRlIHFhLCBTdGF0ZSBxYiwgaW50IG9wKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICByID0gcWEuX2Nfc3RhdGUuQ29tcGFyZShxYi5fY19zdGF0ZSkKKyAqICAgICAgICAgaWYgb3AgPT0gMDogICAgIyA8CisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfTDFfZXJyb3I6OworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMSk7CisgIF9fUHl4X0FkZFRyYWNlYmFjaygia2VubG0uU3RhdGUuX19yaWNoY21wX18iLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19weXhfciA9IE5VTEw7CisgIF9fcHl4X0wwOjsKKyAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworLyogImtlbmxtLnB5eCI6NzAKKyAqICAgICAgICAgICAgIHJldHVybiByID49IDAKKyAqIAorICogICAgIGRlZiBfX2hhc2hfXyhzZWxmKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICByZXR1cm4gX2tlbmxtLmhhc2hfdmFsdWUoc2VsZi5fY19zdGF0ZSkKKyAqIAorICovCisKKy8qIFB5dGhvbiB3cmFwcGVyICovCitzdGF0aWMgUHlfaGFzaF90IF9fcHl4X3B3XzVrZW5sbV81U3RhdGVfM19faGFzaF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpOyAvKnByb3RvKi8KK3N0YXRpYyBQeV9oYXNoX3QgX19weXhfcHdfNWtlbmxtXzVTdGF0ZV8zX19oYXNoX18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZikgeworICBQeV9oYXNoX3QgX19weXhfcjsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9faGFzaF9fICh3cmFwcGVyKSIsIDApOworICBfX3B5eF9yID0gX19weXhfcGZfNWtlbmxtXzVTdGF0ZV8yX19oYXNoX18oKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9TdGF0ZSAqKV9fcHl4X3Zfc2VsZikpOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKK3N0YXRpYyBQeV9oYXNoX3QgX19weXhfcGZfNWtlbmxtXzVTdGF0ZV8yX19oYXNoX18oc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3Zfc2VsZikgeworICBQeV9oYXNoX3QgX19weXhfcjsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9faGFzaF9fIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6NzEKKyAqIAorICogICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAqICAgICAgICAgcmV0dXJuIF9rZW5sbS5oYXNoX3ZhbHVlKHNlbGYuX2Nfc3RhdGUpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqIAorICogCisgKi8KKyAgX19weXhfciA9IGxtOjpuZ3JhbTo6aGFzaF92YWx1ZShfX3B5eF92X3NlbGYtPl9jX3N0YXRlKTsKKyAgZ290byBfX3B5eF9MMDsKKworICAvKiAia2VubG0ucHl4Ijo3MAorICogICAgICAgICAgICAgcmV0dXJuIHIgPj0gMAorICogCisgKiAgICAgZGVmIF9faGFzaF9fKHNlbGYpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIHJldHVybiBfa2VubG0uaGFzaF92YWx1ZShzZWxmLl9jX3N0YXRlKQorICogCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfTDA6OworICBpZiAodW5saWtlbHkoX19weXhfciA9PSAtMSkgJiYgIVB5RXJyX09jY3VycmVkKCkpIF9fcHl4X3IgPSAtMjsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCisvKiAia2VubG0ucHl4Ijo4NAorICogICAgIGNkZWYgX2tlbmxtLmNvbnN0X1ZvY2FidWxhcnkqIHZvY2FiCisgKiAKKyAqICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgIiIiCisgKiAgICAgICAgIExvYWQgdGhlIGxhbmd1YWdlIG1vZGVsLgorICovCisKKy8qIFB5dGhvbiB3cmFwcGVyICovCitzdGF0aWMgaW50IF9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfMV9faW5pdF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF9hcmdzLCBQeU9iamVjdCAqX19weXhfa3dkcyk7IC8qcHJvdG8qLworc3RhdGljIGNoYXIgX19weXhfZG9jXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfX19pbml0X19bXSA9ICJcbiAgICAgICAgTG9hZCB0aGUgbGFuZ3VhZ2UgbW9kZWwuXG5cbiAgICAgICAgOnBhcmFtIHBhdGg6IHBhdGggdG8gYW4gYXJwYSBmaWxlIG9yIGEga2VubG0gYmluYXJ5IGZpbGUuXG4gICAgICAgICI7CisjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OCitzdHJ1Y3Qgd3JhcHBlcmJhc2UgX19weXhfd3JhcHBlcmJhc2VfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF9fX2luaXRfXzsKKyNlbmRpZgorc3RhdGljIGludCBfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzFfX2luaXRfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfYXJncywgUHlPYmplY3QgKl9fcHl4X2t3ZHMpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3ZfcGF0aCA9IDA7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgaW50IF9fcHl4X3I7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX2luaXRfXyAod3JhcHBlcikiLCAwKTsKKyAgeworICAgIHN0YXRpYyBQeU9iamVjdCAqKl9fcHl4X3B5YXJnbmFtZXNbXSA9IHsmX19weXhfbl9zX3BhdGgsMH07CisgICAgUHlPYmplY3QqIHZhbHVlc1sxXSA9IHswfTsKKyAgICBpZiAodW5saWtlbHkoX19weXhfa3dkcykpIHsKKyAgICAgIFB5X3NzaXplX3Qga3dfYXJnczsKKyAgICAgIGNvbnN0IFB5X3NzaXplX3QgcG9zX2FyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKF9fcHl4X2FyZ3MpOworICAgICAgc3dpdGNoIChwb3NfYXJncykgeworICAgICAgICBjYXNlICAxOiB2YWx1ZXNbMF0gPSBQeVR1cGxlX0dFVF9JVEVNKF9fcHl4X2FyZ3MsIDApOworICAgICAgICBjYXNlICAwOiBicmVhazsKKyAgICAgICAgZGVmYXVsdDogZ290byBfX3B5eF9MNV9hcmd0dXBsZV9lcnJvcjsKKyAgICAgIH0KKyAgICAgIGt3X2FyZ3MgPSBQeURpY3RfU2l6ZShfX3B5eF9rd2RzKTsKKyAgICAgIHN3aXRjaCAocG9zX2FyZ3MpIHsKKyAgICAgICAgY2FzZSAgMDoKKyAgICAgICAgaWYgKGxpa2VseSgodmFsdWVzWzBdID0gUHlEaWN0X0dldEl0ZW0oX19weXhfa3dkcywgX19weXhfbl9zX3BhdGgpKSAhPSAwKSkga3dfYXJncy0tOworICAgICAgICBlbHNlIGdvdG8gX19weXhfTDVfYXJndHVwbGVfZXJyb3I7CisgICAgICB9CisgICAgICBpZiAodW5saWtlbHkoa3dfYXJncyA+IDApKSB7CisgICAgICAgIGlmICh1bmxpa2VseShfX1B5eF9QYXJzZU9wdGlvbmFsS2V5d29yZHMoX19weXhfa3dkcywgX19weXhfcHlhcmduYW1lcywgMCwgdmFsdWVzLCBwb3NfYXJncywgIl9faW5pdF9fIikgPCAwKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gODQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MM19lcnJvcjt9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChQeVR1cGxlX0dFVF9TSVpFKF9fcHl4X2FyZ3MpICE9IDEpIHsKKyAgICAgIGdvdG8gX19weXhfTDVfYXJndHVwbGVfZXJyb3I7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhbHVlc1swXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMCk7CisgICAgfQorICAgIF9fcHl4X3ZfcGF0aCA9IHZhbHVlc1swXTsKKyAgfQorICBnb3RvIF9fcHl4X0w0X2FyZ3VtZW50X3VucGFja2luZ19kb25lOworICBfX3B5eF9MNV9hcmd0dXBsZV9lcnJvcjo7CisgIF9fUHl4X1JhaXNlQXJndHVwbGVJbnZhbGlkKCJfX2luaXRfXyIsIDEsIDEsIDEsIFB5VHVwbGVfR0VUX1NJWkUoX19weXhfYXJncykpOyB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA4NDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgX19weXhfTDNfZXJyb3I6OworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLkxhbmd1YWdlTW9kZWwuX19pbml0X18iLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiAtMTsKKyAgX19weXhfTDRfYXJndW1lbnRfdW5wYWNraW5nX2RvbmU6OworICBfX3B5eF9yID0gX19weXhfcGZfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF9fX2luaXRfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKilfX3B5eF92X3NlbGYpLCBfX3B5eF92X3BhdGgpOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKK3N0YXRpYyBpbnQgX19weXhfcGZfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF9fX2luaXRfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF92X3BhdGgpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3ZfZXhjZXB0aW9uID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3ZfZXhjZXB0aW9uX21lc3NhZ2UgPSBOVUxMOworICBpbnQgX19weXhfcjsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgUHlPYmplY3QgKl9fcHl4X3RfMSA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzIgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF8zID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfNCA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzUgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF82ID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfNyA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzggPSBOVUxMOworICBjaGFyICpfX3B5eF90Xzk7CisgIGxtOjpiYXNlOjpNb2RlbCAqX19weXhfdF8xMDsKKyAgaW50IF9fcHl4X3RfMTE7CisgIFB5T2JqZWN0ICpfX3B5eF90XzEyID0gTlVMTDsKKyAgUHlfc3NpemVfdCBfX3B5eF90XzEzOworICBQeU9iamVjdCAqX19weXhfdF8xNCA9IE5VTEw7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9faW5pdF9fIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6OTAKKyAqICAgICAgICAgOnBhcmFtIHBhdGg6IHBhdGggdG8gYW4gYXJwYSBmaWxlIG9yIGEga2VubG0gYmluYXJ5IGZpbGUuCisgKiAgICAgICAgICIiIgorICogICAgICAgICBzZWxmLnBhdGggPSBvcy5wYXRoLmFic3BhdGgoYXNfc3RyKHBhdGgpKSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIHRyeToKKyAqICAgICAgICAgICAgIHNlbGYubW9kZWwgPSBfa2VubG0uTG9hZFZpcnR1YWwoc2VsZi5wYXRoKQorICovCisgIF9fcHl4X3RfMiA9IF9fUHl4X0dldE1vZHVsZUdsb2JhbE5hbWUoX19weXhfbl9zX29zKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzIpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5MDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMik7CisgIF9fcHl4X3RfMyA9IF9fUHl4X1B5T2JqZWN0X0dldEF0dHJTdHIoX19weXhfdF8yLCBfX3B5eF9uX3NfcGF0aCk7IGlmICh1bmxpa2VseSghX19weXhfdF8zKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gOTA7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzMpOworICBfX1B5eF9ERUNSRUYoX19weXhfdF8yKTsgX19weXhfdF8yID0gMDsKKyAgX19weXhfdF8yID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF90XzMsIF9fcHl4X25fc19hYnNwYXRoKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzIpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5MDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMik7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzMpOyBfX3B5eF90XzMgPSAwOworICBfX3B5eF90XzMgPSBfX3B5eF9mXzVrZW5sbV9hc19zdHIoX19weXhfdl9wYXRoKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5MDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgIF9fcHl4X3RfNCA9IE5VTEw7CisgIGlmIChDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04gJiYgbGlrZWx5KFB5TWV0aG9kX0NoZWNrKF9fcHl4X3RfMikpKSB7CisgICAgX19weXhfdF80ID0gUHlNZXRob2RfR0VUX1NFTEYoX19weXhfdF8yKTsKKyAgICBpZiAobGlrZWx5KF9fcHl4X3RfNCkpIHsKKyAgICAgIFB5T2JqZWN0KiBmdW5jdGlvbiA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihfX3B5eF90XzIpOworICAgICAgX19QeXhfSU5DUkVGKF9fcHl4X3RfNCk7CisgICAgICBfX1B5eF9JTkNSRUYoZnVuY3Rpb24pOworICAgICAgX19QeXhfREVDUkVGX1NFVChfX3B5eF90XzIsIGZ1bmN0aW9uKTsKKyAgICB9CisgIH0KKyAgaWYgKCFfX3B5eF90XzQpIHsKKyAgICBfX3B5eF90XzEgPSBfX1B5eF9QeU9iamVjdF9DYWxsT25lQXJnKF9fcHl4X3RfMiwgX19weXhfdF8zKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5MDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICBfX1B5eF9ERUNSRUYoX19weXhfdF8zKTsgX19weXhfdF8zID0gMDsKKyAgICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgfSBlbHNlIHsKKyAgICBfX3B5eF90XzUgPSBQeVR1cGxlX05ldygxKzEpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDkwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzUpOworICAgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF81LCAwLCBfX3B5eF90XzQpOyBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfNCk7IF9fcHl4X3RfNCA9IE5VTEw7CisgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzUsIDArMSwgX19weXhfdF8zKTsKKyAgICBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfMyk7CisgICAgX19weXhfdF8zID0gMDsKKyAgICBfX3B5eF90XzEgPSBfX1B5eF9QeU9iamVjdF9DYWxsKF9fcHl4X3RfMiwgX19weXhfdF81LCBOVUxMKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5MDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgICBfX1B5eF9ERUNSRUYoX19weXhfdF81KTsgX19weXhfdF81ID0gMDsKKyAgfQorICBfX1B5eF9ERUNSRUYoX19weXhfdF8yKTsgX19weXhfdF8yID0gMDsKKyAgaWYgKCEobGlrZWx5KFB5Qnl0ZXNfQ2hlY2tFeGFjdChfX3B5eF90XzEpKXx8KChfX3B5eF90XzEpID09IFB5X05vbmUpfHwoUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIkV4cGVjdGVkICUuMTZzLCBnb3QgJS4yMDBzIiwgImJ5dGVzIiwgUHlfVFlQRShfX3B5eF90XzEpLT50cF9uYW1lKSwgMCkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5MDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR0lWRVJFRihfX3B5eF90XzEpOworICBfX1B5eF9HT1RSRUYoX19weXhfdl9zZWxmLT5wYXRoKTsKKyAgX19QeXhfREVDUkVGKF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgIF9fcHl4X3Zfc2VsZi0+cGF0aCA9ICgoUHlPYmplY3QqKV9fcHl4X3RfMSk7CisgIF9fcHl4X3RfMSA9IDA7CisKKyAgLyogImtlbmxtLnB5eCI6OTEKKyAqICAgICAgICAgIiIiCisgKiAgICAgICAgIHNlbGYucGF0aCA9IG9zLnBhdGguYWJzcGF0aChhc19zdHIocGF0aCkpCisgKiAgICAgICAgIHRyeTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgc2VsZi5tb2RlbCA9IF9rZW5sbS5Mb2FkVmlydHVhbChzZWxmLnBhdGgpCisgKiAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZXhjZXB0aW9uOgorICovCisgIHsKKyAgICBfX1B5eF9FeGNlcHRpb25TYXZlKCZfX3B5eF90XzYsICZfX3B5eF90XzcsICZfX3B5eF90XzgpOworICAgIF9fUHl4X1hHT1RSRUYoX19weXhfdF82KTsKKyAgICBfX1B5eF9YR09UUkVGKF9fcHl4X3RfNyk7CisgICAgX19QeXhfWEdPVFJFRihfX3B5eF90XzgpOworICAgIC8qdHJ5OiovIHsKKworICAgICAgLyogImtlbmxtLnB5eCI6OTIKKyAqICAgICAgICAgc2VsZi5wYXRoID0gb3MucGF0aC5hYnNwYXRoKGFzX3N0cihwYXRoKSkKKyAqICAgICAgICAgdHJ5OgorICogICAgICAgICAgICAgc2VsZi5tb2RlbCA9IF9rZW5sbS5Mb2FkVmlydHVhbChzZWxmLnBhdGgpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBleGNlcHRpb246CisgKiAgICAgICAgICAgICBleGNlcHRpb25fbWVzc2FnZSA9IHN0cihleGNlcHRpb24pLnJlcGxhY2UoJ1xuJywgJyAnKQorICovCisgICAgICBfX3B5eF90XzkgPSBfX1B5eF9QeU9iamVjdF9Bc1N0cmluZyhfX3B5eF92X3NlbGYtPnBhdGgpOyBpZiAodW5saWtlbHkoKCFfX3B5eF90XzkpICYmIFB5RXJyX09jY3VycmVkKCkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5MjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgICAgIHRyeSB7CisgICAgICAgIF9fcHl4X3RfMTAgPSBsbTo6bmdyYW06OkxvYWRWaXJ0dWFsKF9fcHl4X3RfOSk7CisgICAgICB9IGNhdGNoKC4uLikgeworICAgICAgICBfX1B5eF9DcHBFeG4yUHlFcnIoKTsKKyAgICAgICAge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gOTI7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MM19lcnJvcjt9CisgICAgICB9CisgICAgICBfX3B5eF92X3NlbGYtPm1vZGVsID0gX19weXhfdF8xMDsKKyAgICB9CisgICAgX19QeXhfWERFQ1JFRihfX3B5eF90XzYpOyBfX3B5eF90XzYgPSAwOworICAgIF9fUHl4X1hERUNSRUYoX19weXhfdF83KTsgX19weXhfdF83ID0gMDsKKyAgICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfOCk7IF9fcHl4X3RfOCA9IDA7CisgICAgZ290byBfX3B5eF9MMTBfdHJ5X2VuZDsKKyAgICBfX3B5eF9MM19lcnJvcjo7CisgICAgX19QeXhfWERFQ1JFRihfX3B5eF90XzQpOyBfX3B5eF90XzQgPSAwOworICAgIF9fUHl4X1hERUNSRUYoX19weXhfdF8zKTsgX19weXhfdF8zID0gMDsKKyAgICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfNSk7IF9fcHl4X3RfNSA9IDA7CisgICAgX19QeXhfWERFQ1JFRihfX3B5eF90XzIpOyBfX3B5eF90XzIgPSAwOworICAgIF9fUHl4X1hERUNSRUYoX19weXhfdF8xKTsgX19weXhfdF8xID0gMDsKKworICAgIC8qICJrZW5sbS5weXgiOjkzCisgKiAgICAgICAgIHRyeToKKyAqICAgICAgICAgICAgIHNlbGYubW9kZWwgPSBfa2VubG0uTG9hZFZpcnR1YWwoc2VsZi5wYXRoKQorICogICAgICAgICBleGNlcHQgUnVudGltZUVycm9yIGFzIGV4Y2VwdGlvbjogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgZXhjZXB0aW9uX21lc3NhZ2UgPSBzdHIoZXhjZXB0aW9uKS5yZXBsYWNlKCdcbicsICcgJykKKyAqICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ0Nhbm5vdCByZWFkIG1vZGVsIFwne31cJyAoe30pJy5mb3JtYXQocGF0aCwgZXhjZXB0aW9uX21lc3NhZ2UpKVwKKyAqLworICAgIF9fcHl4X3RfMTEgPSBQeUVycl9FeGNlcHRpb25NYXRjaGVzKF9fcHl4X2J1aWx0aW5fUnVudGltZUVycm9yKTsKKyAgICBpZiAoX19weXhfdF8xMSkgeworICAgICAgX19QeXhfQWRkVHJhY2ViYWNrKCJrZW5sbS5MYW5ndWFnZU1vZGVsLl9faW5pdF9fIiwgX19weXhfY2xpbmVubywgX19weXhfbGluZW5vLCBfX3B5eF9maWxlbmFtZSk7CisgICAgICBpZiAoX19QeXhfR2V0RXhjZXB0aW9uKCZfX3B5eF90XzEsICZfX3B5eF90XzIsICZfX3B5eF90XzUpIDwgMCkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gOTM7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMSk7CisgICAgICBfX1B5eF9HT1RSRUYoX19weXhfdF8yKTsKKyAgICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzUpOworICAgICAgX19QeXhfSU5DUkVGKF9fcHl4X3RfMik7CisgICAgICBfX3B5eF92X2V4Y2VwdGlvbiA9IF9fcHl4X3RfMjsKKworICAgICAgLyogImtlbmxtLnB5eCI6OTQKKyAqICAgICAgICAgICAgIHNlbGYubW9kZWwgPSBfa2VubG0uTG9hZFZpcnR1YWwoc2VsZi5wYXRoKQorICogICAgICAgICBleGNlcHQgUnVudGltZUVycm9yIGFzIGV4Y2VwdGlvbjoKKyAqICAgICAgICAgICAgIGV4Y2VwdGlvbl9tZXNzYWdlID0gc3RyKGV4Y2VwdGlvbikucmVwbGFjZSgnXG4nLCAnICcpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ0Nhbm5vdCByZWFkIG1vZGVsIFwne31cJyAoe30pJy5mb3JtYXQocGF0aCwgZXhjZXB0aW9uX21lc3NhZ2UpKVwKKyAqICAgICAgICAgICAgICAgICAgICAgZnJvbSBleGNlcHRpb24KKyAqLworICAgICAgX19weXhfdF8zID0gUHlUdXBsZV9OZXcoMSk7IGlmICh1bmxpa2VseSghX19weXhfdF8zKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gOTQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgICAgICBfX1B5eF9JTkNSRUYoX19weXhfdl9leGNlcHRpb24pOworICAgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzMsIDAsIF9fcHl4X3ZfZXhjZXB0aW9uKTsKKyAgICAgIF9fUHl4X0dJVkVSRUYoX19weXhfdl9leGNlcHRpb24pOworICAgICAgX19weXhfdF80ID0gX19QeXhfUHlPYmplY3RfQ2FsbCgoKFB5T2JqZWN0ICopKChQeU9iamVjdCopKCZQeVN0cmluZ19UeXBlKSkpLCBfX3B5eF90XzMsIE5VTEwpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDk0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDVfZXhjZXB0X2Vycm9yO30KKyAgICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzQpOworICAgICAgX19QeXhfREVDUkVGKF9fcHl4X3RfMyk7IF9fcHl4X3RfMyA9IDA7CisgICAgICBfX3B5eF90XzMgPSBfX1B5eF9QeU9iamVjdF9HZXRBdHRyU3RyKF9fcHl4X3RfNCwgX19weXhfbl9zX3JlcGxhY2UpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDk0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDVfZXhjZXB0X2Vycm9yO30KKyAgICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzMpOworICAgICAgX19QeXhfREVDUkVGKF9fcHl4X3RfNCk7IF9fcHl4X3RfNCA9IDA7CisgICAgICBfX3B5eF90XzQgPSBfX1B5eF9QeU9iamVjdF9DYWxsKF9fcHl4X3RfMywgX19weXhfdHVwbGVfXzQsIE5VTEwpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDk0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDVfZXhjZXB0X2Vycm9yO30KKyAgICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzQpOworICAgICAgX19QeXhfREVDUkVGKF9fcHl4X3RfMyk7IF9fcHl4X3RfMyA9IDA7CisgICAgICBfX3B5eF92X2V4Y2VwdGlvbl9tZXNzYWdlID0gX19weXhfdF80OworICAgICAgX19weXhfdF80ID0gMDsKKworICAgICAgLyogImtlbmxtLnB5eCI6OTUKKyAqICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBleGNlcHRpb246CisgKiAgICAgICAgICAgICBleGNlcHRpb25fbWVzc2FnZSA9IHN0cihleGNlcHRpb24pLnJlcGxhY2UoJ1xuJywgJyAnKQorICogICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignQ2Fubm90IHJlYWQgbW9kZWwgXCd7fVwnICh7fSknLmZvcm1hdChwYXRoLCBleGNlcHRpb25fbWVzc2FnZSkpXCAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICAgICAgICAgIGZyb20gZXhjZXB0aW9uCisgKiAgICAgICAgIHNlbGYudm9jYWIgPSAmc2VsZi5tb2RlbC5CYXNlVm9jYWJ1bGFyeSgpCisgKi8KKyAgICAgIF9fcHl4X3RfMyA9IF9fUHl4X1B5T2JqZWN0X0dldEF0dHJTdHIoX19weXhfa3Bfc19DYW5ub3RfcmVhZF9tb2RlbCwgX19weXhfbl9zX2Zvcm1hdCk7IGlmICh1bmxpa2VseSghX19weXhfdF8zKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gOTU7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgICAgICBfX3B5eF90XzEyID0gTlVMTDsKKyAgICAgIF9fcHl4X3RfMTMgPSAwOworICAgICAgaWYgKENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTiAmJiBsaWtlbHkoUHlNZXRob2RfQ2hlY2soX19weXhfdF8zKSkpIHsKKyAgICAgICAgX19weXhfdF8xMiA9IFB5TWV0aG9kX0dFVF9TRUxGKF9fcHl4X3RfMyk7CisgICAgICAgIGlmIChsaWtlbHkoX19weXhfdF8xMikpIHsKKyAgICAgICAgICBQeU9iamVjdCogZnVuY3Rpb24gPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oX19weXhfdF8zKTsKKyAgICAgICAgICBfX1B5eF9JTkNSRUYoX19weXhfdF8xMik7CisgICAgICAgICAgX19QeXhfSU5DUkVGKGZ1bmN0aW9uKTsKKyAgICAgICAgICBfX1B5eF9ERUNSRUZfU0VUKF9fcHl4X3RfMywgZnVuY3Rpb24pOworICAgICAgICAgIF9fcHl4X3RfMTMgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBfX3B5eF90XzE0ID0gUHlUdXBsZV9OZXcoMitfX3B5eF90XzEzKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzE0KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gOTU7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMTQpOworICAgICAgaWYgKF9fcHl4X3RfMTIpIHsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzE0LCAwLCBfX3B5eF90XzEyKTsgX19QeXhfR0lWRVJFRihfX3B5eF90XzEyKTsgX19weXhfdF8xMiA9IE5VTEw7CisgICAgICB9CisgICAgICBfX1B5eF9JTkNSRUYoX19weXhfdl9wYXRoKTsKKyAgICAgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF8xNCwgMCtfX3B5eF90XzEzLCBfX3B5eF92X3BhdGgpOworICAgICAgX19QeXhfR0lWRVJFRihfX3B5eF92X3BhdGgpOworICAgICAgX19QeXhfSU5DUkVGKF9fcHl4X3ZfZXhjZXB0aW9uX21lc3NhZ2UpOworICAgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzE0LCAxK19fcHl4X3RfMTMsIF9fcHl4X3ZfZXhjZXB0aW9uX21lc3NhZ2UpOworICAgICAgX19QeXhfR0lWRVJFRihfX3B5eF92X2V4Y2VwdGlvbl9tZXNzYWdlKTsKKyAgICAgIF9fcHl4X3RfNCA9IF9fUHl4X1B5T2JqZWN0X0NhbGwoX19weXhfdF8zLCBfX3B5eF90XzE0LCBOVUxMKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzQpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5NTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0w1X2V4Y2VwdF9lcnJvcjt9CisgICAgICBfX1B5eF9HT1RSRUYoX19weXhfdF80KTsKKyAgICAgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzE0KTsgX19weXhfdF8xNCA9IDA7CisgICAgICBfX1B5eF9ERUNSRUYoX19weXhfdF8zKTsgX19weXhfdF8zID0gMDsKKyAgICAgIF9fcHl4X3RfMyA9IFB5VHVwbGVfTmV3KDEpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDk1OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDVfZXhjZXB0X2Vycm9yO30KKyAgICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzMpOworICAgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzMsIDAsIF9fcHl4X3RfNCk7CisgICAgICBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfNCk7CisgICAgICBfX3B5eF90XzQgPSAwOworICAgICAgX19weXhfdF80ID0gX19QeXhfUHlPYmplY3RfQ2FsbChfX3B5eF9idWlsdGluX0lPRXJyb3IsIF9fcHl4X3RfMywgTlVMTCk7IGlmICh1bmxpa2VseSghX19weXhfdF80KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gOTU7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfNCk7CisgICAgICBfX1B5eF9ERUNSRUYoX19weXhfdF8zKTsgX19weXhfdF8zID0gMDsKKworICAgICAgLyogImtlbmxtLnB5eCI6OTYKKyAqICAgICAgICAgICAgIGV4Y2VwdGlvbl9tZXNzYWdlID0gc3RyKGV4Y2VwdGlvbikucmVwbGFjZSgnXG4nLCAnICcpCisgKiAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdDYW5ub3QgcmVhZCBtb2RlbCBcJ3t9XCcgKHt9KScuZm9ybWF0KHBhdGgsIGV4Y2VwdGlvbl9tZXNzYWdlKSlcCisgKiAgICAgICAgICAgICAgICAgICAgIGZyb20gZXhjZXB0aW9uICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgc2VsZi52b2NhYiA9ICZzZWxmLm1vZGVsLkJhc2VWb2NhYnVsYXJ5KCkKKyAqIAorICovCisgICAgICBfX1B5eF9SYWlzZShfX3B5eF90XzQsIDAsIDAsIF9fcHl4X3ZfZXhjZXB0aW9uKTsKKyAgICAgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzQpOyBfX3B5eF90XzQgPSAwOworICAgICAge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gOTU7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgIH0KKyAgICBnb3RvIF9fcHl4X0w1X2V4Y2VwdF9lcnJvcjsKKyAgICBfX3B5eF9MNV9leGNlcHRfZXJyb3I6OworICAgIF9fUHl4X1hHSVZFUkVGKF9fcHl4X3RfNik7CisgICAgX19QeXhfWEdJVkVSRUYoX19weXhfdF83KTsKKyAgICBfX1B5eF9YR0lWRVJFRihfX3B5eF90XzgpOworICAgIF9fUHl4X0V4Y2VwdGlvblJlc2V0KF9fcHl4X3RfNiwgX19weXhfdF83LCBfX3B5eF90XzgpOworICAgIGdvdG8gX19weXhfTDFfZXJyb3I7CisgICAgX19weXhfTDEwX3RyeV9lbmQ6OworICB9CisKKyAgLyogImtlbmxtLnB5eCI6OTcKKyAqICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ0Nhbm5vdCByZWFkIG1vZGVsIFwne31cJyAoe30pJy5mb3JtYXQocGF0aCwgZXhjZXB0aW9uX21lc3NhZ2UpKVwKKyAqICAgICAgICAgICAgICAgICAgICAgZnJvbSBleGNlcHRpb24KKyAqICAgICAgICAgc2VsZi52b2NhYiA9ICZzZWxmLm1vZGVsLkJhc2VWb2NhYnVsYXJ5KCkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogCisgKiAgICAgZGVmIF9fZGVhbGxvY19fKHNlbGYpOgorICovCisgIF9fcHl4X3Zfc2VsZi0+dm9jYWIgPSAoJl9fcHl4X3Zfc2VsZi0+bW9kZWwtPkJhc2VWb2NhYnVsYXJ5KCkpOworCisgIC8qICJrZW5sbS5weXgiOjg0CisgKiAgICAgY2RlZiBfa2VubG0uY29uc3RfVm9jYWJ1bGFyeSogdm9jYWIKKyAqIAorICogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAiIiIKKyAqICAgICAgICAgTG9hZCB0aGUgbGFuZ3VhZ2UgbW9kZWwuCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfciA9IDA7CisgIGdvdG8gX19weXhfTDA7CisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzEpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMik7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8zKTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzQpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfNSk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8xMik7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8xNCk7CisgIF9fUHl4X0FkZFRyYWNlYmFjaygia2VubG0uTGFuZ3VhZ2VNb2RlbC5fX2luaXRfXyIsIF9fcHl4X2NsaW5lbm8sIF9fcHl4X2xpbmVubywgX19weXhfZmlsZW5hbWUpOworICBfX3B5eF9yID0gLTE7CisgIF9fcHl4X0wwOjsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF92X2V4Y2VwdGlvbik7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdl9leGNlcHRpb25fbWVzc2FnZSk7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworLyogImtlbmxtLnB5eCI6OTkKKyAqICAgICAgICAgc2VsZi52b2NhYiA9ICZzZWxmLm1vZGVsLkJhc2VWb2NhYnVsYXJ5KCkKKyAqIAorICogICAgIGRlZiBfX2RlYWxsb2NfXyhzZWxmKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBkZWwgc2VsZi5tb2RlbAorICogCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyB2b2lkIF9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfM19fZGVhbGxvY19fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpOyAvKnByb3RvKi8KK3N0YXRpYyB2b2lkIF9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfM19fZGVhbGxvY19fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpIHsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fZGVhbGxvY19fICh3cmFwcGVyKSIsIDApOworICBfX3B5eF9wZl81a2VubG1fMTNMYW5ndWFnZU1vZGVsXzJfX2RlYWxsb2NfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKilfX3B5eF92X3NlbGYpKTsKKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfMl9fZGVhbGxvY19fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKl9fcHl4X3Zfc2VsZikgeworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19kZWFsbG9jX18iLCAwKTsKKworICAvKiAia2VubG0ucHl4IjoxMDAKKyAqIAorICogICAgIGRlZiBfX2RlYWxsb2NfXyhzZWxmKToKKyAqICAgICAgICAgZGVsIHNlbGYubW9kZWwgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogCisgKiAgICAgcHJvcGVydHkgb3JkZXI6CisgKi8KKyAgZGVsZXRlIF9fcHl4X3Zfc2VsZi0+bW9kZWw7CisKKyAgLyogImtlbmxtLnB5eCI6OTkKKyAqICAgICAgICAgc2VsZi52b2NhYiA9ICZzZWxmLm1vZGVsLkJhc2VWb2NhYnVsYXJ5KCkKKyAqIAorICogICAgIGRlZiBfX2RlYWxsb2NfXyhzZWxmKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBkZWwgc2VsZi5tb2RlbAorICogCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7Cit9CisKKy8qICJrZW5sbS5weXgiOjEwMworICogCisgKiAgICAgcHJvcGVydHkgb3JkZXI6CisgKiAgICAgICAgIGRlZiBfX2dldF9fKHNlbGYpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2RlbC5PcmRlcigpCisgKiAKKyAqLworCisvKiBQeXRob24gd3JhcHBlciAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzVvcmRlcl8xX19nZXRfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmKTsgLypwcm90byovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNW9yZGVyXzFfX2dldF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSAwOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19nZXRfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNW9yZGVyX19fZ2V0X18oKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsICopX19weXhfdl9zZWxmKSk7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fMTNMYW5ndWFnZU1vZGVsXzVvcmRlcl9fX2dldF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKl9fcHl4X3Zfc2VsZikgeworICBQeU9iamVjdCAqX19weXhfciA9IE5VTEw7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIFB5T2JqZWN0ICpfX3B5eF90XzEgPSBOVUxMOworICBpbnQgX19weXhfbGluZW5vID0gMDsKKyAgY29uc3QgY2hhciAqX19weXhfZmlsZW5hbWUgPSBOVUxMOworICBpbnQgX19weXhfY2xpbmVubyA9IDA7CisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX2dldF9fIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6MTA0CisgKiAgICAgcHJvcGVydHkgb3JkZXI6CisgKiAgICAgICAgIGRlZiBfX2dldF9fKHNlbGYpOgorICogICAgICAgICAgICAgcmV0dXJuIHNlbGYubW9kZWwuT3JkZXIoKSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAKKyAqICAgICBkZWYgc2NvcmUoc2VsZiwgc2VudGVuY2UsIGJvcyA9IFRydWUsIGVvcyA9IFRydWUpOgorICovCisgIF9fUHl4X1hERUNSRUYoX19weXhfcik7CisgIF9fcHl4X3RfMSA9IF9fUHl4X1B5SW50X0Zyb21fdW5zaWduZWRfaW50KF9fcHl4X3Zfc2VsZi0+bW9kZWwtPk9yZGVyKCkpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEwNDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMSk7CisgIF9fcHl4X3IgPSBfX3B5eF90XzE7CisgIF9fcHl4X3RfMSA9IDA7CisgIGdvdG8gX19weXhfTDA7CisKKyAgLyogImtlbmxtLnB5eCI6MTAzCisgKiAKKyAqICAgICBwcm9wZXJ0eSBvcmRlcjoKKyAqICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHJldHVybiBzZWxmLm1vZGVsLk9yZGVyKCkKKyAqIAorICovCisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzEpOworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLkxhbmd1YWdlTW9kZWwub3JkZXIuX19nZXRfXyIsIF9fcHl4X2NsaW5lbm8sIF9fcHl4X2xpbmVubywgX19weXhfZmlsZW5hbWUpOworICBfX3B5eF9yID0gTlVMTDsKKyAgX19weXhfTDA6OworICBfX1B5eF9YR0lWRVJFRihfX3B5eF9yKTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCisvKiAia2VubG0ucHl4IjoxMDYKKyAqICAgICAgICAgICAgIHJldHVybiBzZWxmLm1vZGVsLk9yZGVyKCkKKyAqIAorICogICAgIGRlZiBzY29yZShzZWxmLCBzZW50ZW5jZSwgYm9zID0gVHJ1ZSwgZW9zID0gVHJ1ZSk6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgY2RlZiBsaXN0IHdvcmRzID0gYXNfc3RyKHNlbnRlbmNlKS5zcGxpdCgpCisgKiAgICAgICAgIGNkZWYgX2tlbmxtLlN0YXRlIHN0YXRlCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcHdfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF81c2NvcmUoUHlPYmplY3QgKl9fcHl4X3Zfc2VsZiwgUHlPYmplY3QgKl9fcHl4X2FyZ3MsIFB5T2JqZWN0ICpfX3B5eF9rd2RzKTsgLypwcm90byovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNXNjb3JlKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF9hcmdzLCBQeU9iamVjdCAqX19weXhfa3dkcykgeworICBQeU9iamVjdCAqX19weXhfdl9zZW50ZW5jZSA9IDA7CisgIFB5T2JqZWN0ICpfX3B5eF92X2JvcyA9IDA7CisgIFB5T2JqZWN0ICpfX3B5eF92X2VvcyA9IDA7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSAwOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgic2NvcmUgKHdyYXBwZXIpIiwgMCk7CisgIHsKKyAgICBzdGF0aWMgUHlPYmplY3QgKipfX3B5eF9weWFyZ25hbWVzW10gPSB7Jl9fcHl4X25fc19zZW50ZW5jZSwmX19weXhfbl9zX2JvcywmX19weXhfbl9zX2VvcywwfTsKKyAgICBQeU9iamVjdCogdmFsdWVzWzNdID0gezAsMCwwfTsKKyAgICB2YWx1ZXNbMV0gPSAoKFB5T2JqZWN0ICopUHlfVHJ1ZSk7CisgICAgdmFsdWVzWzJdID0gKChQeU9iamVjdCAqKVB5X1RydWUpOworICAgIGlmICh1bmxpa2VseShfX3B5eF9rd2RzKSkgeworICAgICAgUHlfc3NpemVfdCBrd19hcmdzOworICAgICAgY29uc3QgUHlfc3NpemVfdCBwb3NfYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUoX19weXhfYXJncyk7CisgICAgICBzd2l0Y2ggKHBvc19hcmdzKSB7CisgICAgICAgIGNhc2UgIDM6IHZhbHVlc1syXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMik7CisgICAgICAgIGNhc2UgIDI6IHZhbHVlc1sxXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMSk7CisgICAgICAgIGNhc2UgIDE6IHZhbHVlc1swXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMCk7CisgICAgICAgIGNhc2UgIDA6IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBnb3RvIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOworICAgICAgfQorICAgICAga3dfYXJncyA9IFB5RGljdF9TaXplKF9fcHl4X2t3ZHMpOworICAgICAgc3dpdGNoIChwb3NfYXJncykgeworICAgICAgICBjYXNlICAwOgorICAgICAgICBpZiAobGlrZWx5KCh2YWx1ZXNbMF0gPSBQeURpY3RfR2V0SXRlbShfX3B5eF9rd2RzLCBfX3B5eF9uX3Nfc2VudGVuY2UpKSAhPSAwKSkga3dfYXJncy0tOworICAgICAgICBlbHNlIGdvdG8gX19weXhfTDVfYXJndHVwbGVfZXJyb3I7CisgICAgICAgIGNhc2UgIDE6CisgICAgICAgIGlmIChrd19hcmdzID4gMCkgeworICAgICAgICAgIFB5T2JqZWN0KiB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKF9fcHl4X2t3ZHMsIF9fcHl4X25fc19ib3MpOworICAgICAgICAgIGlmICh2YWx1ZSkgeyB2YWx1ZXNbMV0gPSB2YWx1ZTsga3dfYXJncy0tOyB9CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAgMjoKKyAgICAgICAgaWYgKGt3X2FyZ3MgPiAwKSB7CisgICAgICAgICAgUHlPYmplY3QqIHZhbHVlID0gUHlEaWN0X0dldEl0ZW0oX19weXhfa3dkcywgX19weXhfbl9zX2Vvcyk7CisgICAgICAgICAgaWYgKHZhbHVlKSB7IHZhbHVlc1syXSA9IHZhbHVlOyBrd19hcmdzLS07IH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHVubGlrZWx5KGt3X2FyZ3MgPiAwKSkgeworICAgICAgICBpZiAodW5saWtlbHkoX19QeXhfUGFyc2VPcHRpb25hbEtleXdvcmRzKF9fcHl4X2t3ZHMsIF9fcHl4X3B5YXJnbmFtZXMsIDAsIHZhbHVlcywgcG9zX2FyZ3MsICJzY29yZSIpIDwgMCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEwNjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChQeVR1cGxlX0dFVF9TSVpFKF9fcHl4X2FyZ3MpKSB7CisgICAgICAgIGNhc2UgIDM6IHZhbHVlc1syXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMik7CisgICAgICAgIGNhc2UgIDI6IHZhbHVlc1sxXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMSk7CisgICAgICAgIGNhc2UgIDE6IHZhbHVlc1swXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMCk7CisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBnb3RvIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOworICAgICAgfQorICAgIH0KKyAgICBfX3B5eF92X3NlbnRlbmNlID0gdmFsdWVzWzBdOworICAgIF9fcHl4X3ZfYm9zID0gdmFsdWVzWzFdOworICAgIF9fcHl4X3ZfZW9zID0gdmFsdWVzWzJdOworICB9CisgIGdvdG8gX19weXhfTDRfYXJndW1lbnRfdW5wYWNraW5nX2RvbmU7CisgIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOjsKKyAgX19QeXhfUmFpc2VBcmd0dXBsZUludmFsaWQoInNjb3JlIiwgMCwgMSwgMywgUHlUdXBsZV9HRVRfU0laRShfX3B5eF9hcmdzKSk7IHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEwNjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgX19weXhfTDNfZXJyb3I6OworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLkxhbmd1YWdlTW9kZWwuc2NvcmUiLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBOVUxMOworICBfX3B5eF9MNF9hcmd1bWVudF91bnBhY2tpbmdfZG9uZTo7CisgIF9fcHl4X3IgPSBfX3B5eF9wZl81a2VubG1fMTNMYW5ndWFnZU1vZGVsXzRzY29yZSgoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKilfX3B5eF92X3NlbGYpLCBfX3B5eF92X3NlbnRlbmNlLCBfX3B5eF92X2JvcywgX19weXhfdl9lb3MpOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF80c2NvcmUoc3RydWN0IF9fcHl4X29ial81a2VubG1fTGFuZ3VhZ2VNb2RlbCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl9zZW50ZW5jZSwgUHlPYmplY3QgKl9fcHl4X3ZfYm9zLCBQeU9iamVjdCAqX19weXhfdl9lb3MpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3Zfd29yZHMgPSAwOworICBsbTo6bmdyYW06OlN0YXRlIF9fcHl4X3Zfc3RhdGU7CisgIGxtOjpuZ3JhbTo6U3RhdGUgX19weXhfdl9vdXRfc3RhdGU7CisgIGZsb2F0IF9fcHl4X3ZfdG90YWw7CisgIFB5T2JqZWN0ICpfX3B5eF92X3dvcmQgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfciA9IE5VTEw7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIFB5T2JqZWN0ICpfX3B5eF90XzEgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF8yID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfMyA9IE5VTEw7CisgIGludCBfX3B5eF90XzQ7CisgIFB5X3NzaXplX3QgX19weXhfdF81OworICBjaGFyICpfX3B5eF90XzY7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoInNjb3JlIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6MTA3CisgKiAKKyAqICAgICBkZWYgc2NvcmUoc2VsZiwgc2VudGVuY2UsIGJvcyA9IFRydWUsIGVvcyA9IFRydWUpOgorICogICAgICAgICBjZGVmIGxpc3Qgd29yZHMgPSBhc19zdHIoc2VudGVuY2UpLnNwbGl0KCkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBjZGVmIF9rZW5sbS5TdGF0ZSBzdGF0ZQorICogICAgICAgICBpZiBib3M6CisgKi8KKyAgX19weXhfdF8yID0gX19weXhfZl81a2VubG1fYXNfc3RyKF9fcHl4X3Zfc2VudGVuY2UpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMikpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEwNzsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMik7CisgIF9fcHl4X3RfMyA9IF9fUHl4X1B5T2JqZWN0X0dldEF0dHJTdHIoX19weXhfdF8yLCBfX3B5eF9uX3Nfc3BsaXQpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEwNzsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzIpOyBfX3B5eF90XzIgPSAwOworICBfX3B5eF90XzIgPSBOVUxMOworICBpZiAoQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OICYmIGxpa2VseShQeU1ldGhvZF9DaGVjayhfX3B5eF90XzMpKSkgeworICAgIF9fcHl4X3RfMiA9IFB5TWV0aG9kX0dFVF9TRUxGKF9fcHl4X3RfMyk7CisgICAgaWYgKGxpa2VseShfX3B5eF90XzIpKSB7CisgICAgICBQeU9iamVjdCogZnVuY3Rpb24gPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oX19weXhfdF8zKTsKKyAgICAgIF9fUHl4X0lOQ1JFRihfX3B5eF90XzIpOworICAgICAgX19QeXhfSU5DUkVGKGZ1bmN0aW9uKTsKKyAgICAgIF9fUHl4X0RFQ1JFRl9TRVQoX19weXhfdF8zLCBmdW5jdGlvbik7CisgICAgfQorICB9CisgIGlmIChfX3B5eF90XzIpIHsKKyAgICBfX3B5eF90XzEgPSBfX1B5eF9QeU9iamVjdF9DYWxsT25lQXJnKF9fcHl4X3RfMywgX19weXhfdF8yKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxMDc7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfREVDUkVGKF9fcHl4X3RfMik7IF9fcHl4X3RfMiA9IDA7CisgIH0gZWxzZSB7CisgICAgX19weXhfdF8xID0gX19QeXhfUHlPYmplY3RfQ2FsbE5vQXJnKF9fcHl4X3RfMyk7IGlmICh1bmxpa2VseSghX19weXhfdF8xKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTA3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICB9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICBfX1B5eF9ERUNSRUYoX19weXhfdF8zKTsgX19weXhfdF8zID0gMDsKKyAgaWYgKCEobGlrZWx5KFB5TGlzdF9DaGVja0V4YWN0KF9fcHl4X3RfMSkpfHwoKF9fcHl4X3RfMSkgPT0gUHlfTm9uZSl8fChQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiRXhwZWN0ZWQgJS4xNnMsIGdvdCAlLjIwMHMiLCAibGlzdCIsIFB5X1RZUEUoX19weXhfdF8xKS0+dHBfbmFtZSksIDApKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTA3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF92X3dvcmRzID0gKChQeU9iamVjdCopX19weXhfdF8xKTsKKyAgX19weXhfdF8xID0gMDsKKworICAvKiAia2VubG0ucHl4IjoxMDkKKyAqICAgICAgICAgY2RlZiBsaXN0IHdvcmRzID0gYXNfc3RyKHNlbnRlbmNlKS5zcGxpdCgpCisgKiAgICAgICAgIGNkZWYgX2tlbmxtLlN0YXRlIHN0YXRlCisgKiAgICAgICAgIGlmIGJvczogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgc2VsZi5tb2RlbC5CZWdpblNlbnRlbmNlV3JpdGUoJnN0YXRlKQorICogICAgICAgICBlbHNlOgorICovCisgIF9fcHl4X3RfNCA9IF9fUHl4X1B5T2JqZWN0X0lzVHJ1ZShfX3B5eF92X2Jvcyk7IGlmICh1bmxpa2VseShfX3B5eF90XzQgPCAwKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTA5OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBpZiAoX19weXhfdF80KSB7CisKKyAgICAvKiAia2VubG0ucHl4IjoxMTAKKyAqICAgICAgICAgY2RlZiBfa2VubG0uU3RhdGUgc3RhdGUKKyAqICAgICAgICAgaWYgYm9zOgorICogICAgICAgICAgICAgc2VsZi5tb2RlbC5CZWdpblNlbnRlbmNlV3JpdGUoJnN0YXRlKSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIGVsc2U6CisgKiAgICAgICAgICAgICBzZWxmLm1vZGVsLk51bGxDb250ZXh0V3JpdGUoJnN0YXRlKQorICovCisgICAgX19weXhfdl9zZWxmLT5tb2RlbC0+QmVnaW5TZW50ZW5jZVdyaXRlKCgmX19weXhfdl9zdGF0ZSkpOworICAgIGdvdG8gX19weXhfTDM7CisgIH0KKyAgLyplbHNlKi8geworCisgICAgLyogImtlbmxtLnB5eCI6MTEyCisgKiAgICAgICAgICAgICBzZWxmLm1vZGVsLkJlZ2luU2VudGVuY2VXcml0ZSgmc3RhdGUpCisgKiAgICAgICAgIGVsc2U6CisgKiAgICAgICAgICAgICBzZWxmLm1vZGVsLk51bGxDb250ZXh0V3JpdGUoJnN0YXRlKSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIGNkZWYgX2tlbmxtLlN0YXRlIG91dF9zdGF0ZQorICogICAgICAgICBjZGVmIGZsb2F0IHRvdGFsID0gMAorICovCisgICAgX19weXhfdl9zZWxmLT5tb2RlbC0+TnVsbENvbnRleHRXcml0ZSgoJl9fcHl4X3Zfc3RhdGUpKTsKKyAgfQorICBfX3B5eF9MMzo7CisKKyAgLyogImtlbmxtLnB5eCI6MTE0CisgKiAgICAgICAgICAgICBzZWxmLm1vZGVsLk51bGxDb250ZXh0V3JpdGUoJnN0YXRlKQorICogICAgICAgICBjZGVmIF9rZW5sbS5TdGF0ZSBvdXRfc3RhdGUKKyAqICAgICAgICAgY2RlZiBmbG9hdCB0b3RhbCA9IDAgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBmb3Igd29yZCBpbiB3b3JkczoKKyAqICAgICAgICAgICAgIHRvdGFsICs9IHNlbGYubW9kZWwuQmFzZVNjb3JlKCZzdGF0ZSwgc2VsZi52b2NhYi5JbmRleCh3b3JkKSwgJm91dF9zdGF0ZSkKKyAqLworICBfX3B5eF92X3RvdGFsID0gMC4wOworCisgIC8qICJrZW5sbS5weXgiOjExNQorICogICAgICAgICBjZGVmIF9rZW5sbS5TdGF0ZSBvdXRfc3RhdGUKKyAqICAgICAgICAgY2RlZiBmbG9hdCB0b3RhbCA9IDAKKyAqICAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHRvdGFsICs9IHNlbGYubW9kZWwuQmFzZVNjb3JlKCZzdGF0ZSwgc2VsZi52b2NhYi5JbmRleCh3b3JkKSwgJm91dF9zdGF0ZSkKKyAqICAgICAgICAgICAgIHN0YXRlID0gb3V0X3N0YXRlCisgKi8KKyAgaWYgKHVubGlrZWx5KF9fcHl4X3Zfd29yZHMgPT0gUHlfTm9uZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiJ05vbmVUeXBlJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlIik7CisgICAge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTE1OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICB9CisgIF9fcHl4X3RfMSA9IF9fcHl4X3Zfd29yZHM7IF9fUHl4X0lOQ1JFRihfX3B5eF90XzEpOyBfX3B5eF90XzUgPSAwOworICBmb3IgKDs7KSB7CisgICAgaWYgKF9fcHl4X3RfNSA+PSBQeUxpc3RfR0VUX1NJWkUoX19weXhfdF8xKSkgYnJlYWs7CisgICAgI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorICAgIF9fcHl4X3RfMyA9IFB5TGlzdF9HRVRfSVRFTShfX3B5eF90XzEsIF9fcHl4X3RfNSk7IF9fUHl4X0lOQ1JFRihfX3B5eF90XzMpOyBfX3B5eF90XzUrKzsgaWYgKHVubGlrZWx5KDAgPCAwKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTE1OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgICNlbHNlCisgICAgX19weXhfdF8zID0gUHlTZXF1ZW5jZV9JVEVNKF9fcHl4X3RfMSwgX19weXhfdF81KTsgX19weXhfdF81Kys7IGlmICh1bmxpa2VseSghX19weXhfdF8zKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTE1OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgICNlbmRpZgorICAgIF9fUHl4X1hERUNSRUZfU0VUKF9fcHl4X3Zfd29yZCwgX19weXhfdF8zKTsKKyAgICBfX3B5eF90XzMgPSAwOworCisgICAgLyogImtlbmxtLnB5eCI6MTE2CisgKiAgICAgICAgIGNkZWYgZmxvYXQgdG90YWwgPSAwCisgKiAgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgorICogICAgICAgICAgICAgdG90YWwgKz0gc2VsZi5tb2RlbC5CYXNlU2NvcmUoJnN0YXRlLCBzZWxmLnZvY2FiLkluZGV4KHdvcmQpLCAmb3V0X3N0YXRlKSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICBzdGF0ZSA9IG91dF9zdGF0ZQorICogICAgICAgICBpZiBlb3M6CisgKi8KKyAgICBfX3B5eF90XzYgPSBfX1B5eF9QeU9iamVjdF9Bc1N0cmluZyhfX3B5eF92X3dvcmQpOyBpZiAodW5saWtlbHkoKCFfX3B5eF90XzYpICYmIFB5RXJyX09jY3VycmVkKCkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxMTY7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19weXhfdl90b3RhbCA9IChfX3B5eF92X3RvdGFsICsgX19weXhfdl9zZWxmLT5tb2RlbC0+QmFzZVNjb3JlKCgmX19weXhfdl9zdGF0ZSksIF9fcHl4X3Zfc2VsZi0+dm9jYWItPkluZGV4KF9fcHl4X3RfNiksICgmX19weXhfdl9vdXRfc3RhdGUpKSk7CisKKyAgICAvKiAia2VubG0ucHl4IjoxMTcKKyAqICAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6CisgKiAgICAgICAgICAgICB0b3RhbCArPSBzZWxmLm1vZGVsLkJhc2VTY29yZSgmc3RhdGUsIHNlbGYudm9jYWIuSW5kZXgod29yZCksICZvdXRfc3RhdGUpCisgKiAgICAgICAgICAgICBzdGF0ZSA9IG91dF9zdGF0ZSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIGlmIGVvczoKKyAqICAgICAgICAgICAgIHRvdGFsICs9IHNlbGYubW9kZWwuQmFzZVNjb3JlKCZzdGF0ZSwgc2VsZi52b2NhYi5FbmRTZW50ZW5jZSgpLCAmb3V0X3N0YXRlKQorICovCisgICAgX19weXhfdl9zdGF0ZSA9IF9fcHl4X3Zfb3V0X3N0YXRlOworCisgICAgLyogImtlbmxtLnB5eCI6MTE1CisgKiAgICAgICAgIGNkZWYgX2tlbmxtLlN0YXRlIG91dF9zdGF0ZQorICogICAgICAgICBjZGVmIGZsb2F0IHRvdGFsID0gMAorICogICAgICAgICBmb3Igd29yZCBpbiB3b3JkczogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgdG90YWwgKz0gc2VsZi5tb2RlbC5CYXNlU2NvcmUoJnN0YXRlLCBzZWxmLnZvY2FiLkluZGV4KHdvcmQpLCAmb3V0X3N0YXRlKQorICogICAgICAgICAgICAgc3RhdGUgPSBvdXRfc3RhdGUKKyAqLworICB9CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzEpOyBfX3B5eF90XzEgPSAwOworCisgIC8qICJrZW5sbS5weXgiOjExOAorICogICAgICAgICAgICAgdG90YWwgKz0gc2VsZi5tb2RlbC5CYXNlU2NvcmUoJnN0YXRlLCBzZWxmLnZvY2FiLkluZGV4KHdvcmQpLCAmb3V0X3N0YXRlKQorICogICAgICAgICAgICAgc3RhdGUgPSBvdXRfc3RhdGUKKyAqICAgICAgICAgaWYgZW9zOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICB0b3RhbCArPSBzZWxmLm1vZGVsLkJhc2VTY29yZSgmc3RhdGUsIHNlbGYudm9jYWIuRW5kU2VudGVuY2UoKSwgJm91dF9zdGF0ZSkKKyAqICAgICAgICAgcmV0dXJuIHRvdGFsCisgKi8KKyAgX19weXhfdF80ID0gX19QeXhfUHlPYmplY3RfSXNUcnVlKF9fcHl4X3ZfZW9zKTsgaWYgKHVubGlrZWx5KF9fcHl4X3RfNCA8IDApKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxMTg7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIGlmIChfX3B5eF90XzQpIHsKKworICAgIC8qICJrZW5sbS5weXgiOjExOQorICogICAgICAgICAgICAgc3RhdGUgPSBvdXRfc3RhdGUKKyAqICAgICAgICAgaWYgZW9zOgorICogICAgICAgICAgICAgdG90YWwgKz0gc2VsZi5tb2RlbC5CYXNlU2NvcmUoJnN0YXRlLCBzZWxmLnZvY2FiLkVuZFNlbnRlbmNlKCksICZvdXRfc3RhdGUpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgcmV0dXJuIHRvdGFsCisgKiAKKyAqLworICAgIF9fcHl4X3ZfdG90YWwgPSAoX19weXhfdl90b3RhbCArIF9fcHl4X3Zfc2VsZi0+bW9kZWwtPkJhc2VTY29yZSgoJl9fcHl4X3Zfc3RhdGUpLCBfX3B5eF92X3NlbGYtPnZvY2FiLT5FbmRTZW50ZW5jZSgpLCAoJl9fcHl4X3Zfb3V0X3N0YXRlKSkpOworICAgIGdvdG8gX19weXhfTDY7CisgIH0KKyAgX19weXhfTDY6OworCisgIC8qICJrZW5sbS5weXgiOjEyMAorICogICAgICAgICBpZiBlb3M6CisgKiAgICAgICAgICAgICB0b3RhbCArPSBzZWxmLm1vZGVsLkJhc2VTY29yZSgmc3RhdGUsIHNlbGYudm9jYWIuRW5kU2VudGVuY2UoKSwgJm91dF9zdGF0ZSkKKyAqICAgICAgICAgcmV0dXJuIHRvdGFsICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqIAorICogICAgIGRlZiBmdWxsX3Njb3JlcyhzZWxmLCBzZW50ZW5jZSwgYm9zID0gVHJ1ZSwgZW9zID0gVHJ1ZSk6CisgKi8KKyAgX19QeXhfWERFQ1JFRihfX3B5eF9yKTsKKyAgX19weXhfdF8xID0gUHlGbG9hdF9Gcm9tRG91YmxlKF9fcHl4X3ZfdG90YWwpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEyMDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMSk7CisgIF9fcHl4X3IgPSBfX3B5eF90XzE7CisgIF9fcHl4X3RfMSA9IDA7CisgIGdvdG8gX19weXhfTDA7CisKKyAgLyogImtlbmxtLnB5eCI6MTA2CisgKiAgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2RlbC5PcmRlcigpCisgKiAKKyAqICAgICBkZWYgc2NvcmUoc2VsZiwgc2VudGVuY2UsIGJvcyA9IFRydWUsIGVvcyA9IFRydWUpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIGNkZWYgbGlzdCB3b3JkcyA9IGFzX3N0cihzZW50ZW5jZSkuc3BsaXQoKQorICogICAgICAgICBjZGVmIF9rZW5sbS5TdGF0ZSBzdGF0ZQorICovCisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzEpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMik7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8zKTsKKyAgX19QeXhfQWRkVHJhY2ViYWNrKCJrZW5sbS5MYW5ndWFnZU1vZGVsLnNjb3JlIiwgX19weXhfY2xpbmVubywgX19weXhfbGluZW5vLCBfX3B5eF9maWxlbmFtZSk7CisgIF9fcHl4X3IgPSBOVUxMOworICBfX3B5eF9MMDo7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdl93b3Jkcyk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdl93b3JkKTsKKyAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfZ2JfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF84Z2VuZXJhdG9yKF9fcHl4X0dlbmVyYXRvck9iamVjdCAqX19weXhfZ2VuZXJhdG9yLCBQeU9iamVjdCAqX19weXhfc2VudF92YWx1ZSk7IC8qIHByb3RvICovCisKKy8qICJrZW5sbS5weXgiOjEyMgorICogICAgICAgICByZXR1cm4gdG90YWwKKyAqIAorICogICAgIGRlZiBmdWxsX3Njb3JlcyhzZWxmLCBzZW50ZW5jZSwgYm9zID0gVHJ1ZSwgZW9zID0gVHJ1ZSk6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgIiIiCisgKiAgICAgICAgIGZ1bGxfc2NvcmVzKHNlbnRlbmNlLCBib3MgPSBUcnVlLCBlb3MgPSBUdXJlKSAtPiBnZW5lcmF0ZSBmdWxsIHNjb3JlcyAocHJvYiwgbmdyYW0gbGVuZ3RoLCBvb3YpCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcHdfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF83ZnVsbF9zY29yZXMoUHlPYmplY3QgKl9fcHl4X3Zfc2VsZiwgUHlPYmplY3QgKl9fcHl4X2FyZ3MsIFB5T2JqZWN0ICpfX3B5eF9rd2RzKTsgLypwcm90byovCitzdGF0aWMgY2hhciBfX3B5eF9kb2NfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF82ZnVsbF9zY29yZXNbXSA9ICJcbiAgICAgICAgZnVsbF9zY29yZXMoc2VudGVuY2UsIGJvcyA9IFRydWUsIGVvcyA9IFR1cmUpIC0+IGdlbmVyYXRlIGZ1bGwgc2NvcmVzIChwcm9iLCBuZ3JhbSBsZW5ndGgsIG9vdilcbiAgICAgICAgQHBhcmFtIHNlbnRlbmNlIGlzIGEgc3RyaW5nIChkbyBub3QgdXNlIGJvdW5kYXJ5IHN5bWJvbHMpXG4gICAgICAgIEBwYXJhbSBib3Mgc2hvdWxkIGtlbmxtIGFkZCBhIGJvcyBzdGF0ZVxuICAgICAgICBAcGFyYW0gZW9zIHNob3VsZCBrZW5sbSBhZGQgYW4gZW9zIHN0YXRlXG4gICAgICAgICI7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfN2Z1bGxfc2NvcmVzKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF9hcmdzLCBQeU9iamVjdCAqX19weXhfa3dkcykgeworICBQeU9iamVjdCAqX19weXhfdl9zZW50ZW5jZSA9IDA7CisgIFB5T2JqZWN0ICpfX3B5eF92X2JvcyA9IDA7CisgIFB5T2JqZWN0ICpfX3B5eF92X2VvcyA9IDA7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSAwOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiZnVsbF9zY29yZXMgKHdyYXBwZXIpIiwgMCk7CisgIHsKKyAgICBzdGF0aWMgUHlPYmplY3QgKipfX3B5eF9weWFyZ25hbWVzW10gPSB7Jl9fcHl4X25fc19zZW50ZW5jZSwmX19weXhfbl9zX2JvcywmX19weXhfbl9zX2VvcywwfTsKKyAgICBQeU9iamVjdCogdmFsdWVzWzNdID0gezAsMCwwfTsKKyAgICB2YWx1ZXNbMV0gPSAoKFB5T2JqZWN0ICopUHlfVHJ1ZSk7CisgICAgdmFsdWVzWzJdID0gKChQeU9iamVjdCAqKVB5X1RydWUpOworICAgIGlmICh1bmxpa2VseShfX3B5eF9rd2RzKSkgeworICAgICAgUHlfc3NpemVfdCBrd19hcmdzOworICAgICAgY29uc3QgUHlfc3NpemVfdCBwb3NfYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUoX19weXhfYXJncyk7CisgICAgICBzd2l0Y2ggKHBvc19hcmdzKSB7CisgICAgICAgIGNhc2UgIDM6IHZhbHVlc1syXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMik7CisgICAgICAgIGNhc2UgIDI6IHZhbHVlc1sxXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMSk7CisgICAgICAgIGNhc2UgIDE6IHZhbHVlc1swXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMCk7CisgICAgICAgIGNhc2UgIDA6IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBnb3RvIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOworICAgICAgfQorICAgICAga3dfYXJncyA9IFB5RGljdF9TaXplKF9fcHl4X2t3ZHMpOworICAgICAgc3dpdGNoIChwb3NfYXJncykgeworICAgICAgICBjYXNlICAwOgorICAgICAgICBpZiAobGlrZWx5KCh2YWx1ZXNbMF0gPSBQeURpY3RfR2V0SXRlbShfX3B5eF9rd2RzLCBfX3B5eF9uX3Nfc2VudGVuY2UpKSAhPSAwKSkga3dfYXJncy0tOworICAgICAgICBlbHNlIGdvdG8gX19weXhfTDVfYXJndHVwbGVfZXJyb3I7CisgICAgICAgIGNhc2UgIDE6CisgICAgICAgIGlmIChrd19hcmdzID4gMCkgeworICAgICAgICAgIFB5T2JqZWN0KiB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKF9fcHl4X2t3ZHMsIF9fcHl4X25fc19ib3MpOworICAgICAgICAgIGlmICh2YWx1ZSkgeyB2YWx1ZXNbMV0gPSB2YWx1ZTsga3dfYXJncy0tOyB9CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAgMjoKKyAgICAgICAgaWYgKGt3X2FyZ3MgPiAwKSB7CisgICAgICAgICAgUHlPYmplY3QqIHZhbHVlID0gUHlEaWN0X0dldEl0ZW0oX19weXhfa3dkcywgX19weXhfbl9zX2Vvcyk7CisgICAgICAgICAgaWYgKHZhbHVlKSB7IHZhbHVlc1syXSA9IHZhbHVlOyBrd19hcmdzLS07IH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHVubGlrZWx5KGt3X2FyZ3MgPiAwKSkgeworICAgICAgICBpZiAodW5saWtlbHkoX19QeXhfUGFyc2VPcHRpb25hbEtleXdvcmRzKF9fcHl4X2t3ZHMsIF9fcHl4X3B5YXJnbmFtZXMsIDAsIHZhbHVlcywgcG9zX2FyZ3MsICJmdWxsX3Njb3JlcyIpIDwgMCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEyMjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChQeVR1cGxlX0dFVF9TSVpFKF9fcHl4X2FyZ3MpKSB7CisgICAgICAgIGNhc2UgIDM6IHZhbHVlc1syXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMik7CisgICAgICAgIGNhc2UgIDI6IHZhbHVlc1sxXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMSk7CisgICAgICAgIGNhc2UgIDE6IHZhbHVlc1swXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMCk7CisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBnb3RvIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOworICAgICAgfQorICAgIH0KKyAgICBfX3B5eF92X3NlbnRlbmNlID0gdmFsdWVzWzBdOworICAgIF9fcHl4X3ZfYm9zID0gdmFsdWVzWzFdOworICAgIF9fcHl4X3ZfZW9zID0gdmFsdWVzWzJdOworICB9CisgIGdvdG8gX19weXhfTDRfYXJndW1lbnRfdW5wYWNraW5nX2RvbmU7CisgIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOjsKKyAgX19QeXhfUmFpc2VBcmd0dXBsZUludmFsaWQoImZ1bGxfc2NvcmVzIiwgMCwgMSwgMywgUHlUdXBsZV9HRVRfU0laRShfX3B5eF9hcmdzKSk7IHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEyMjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgX19weXhfTDNfZXJyb3I6OworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLkxhbmd1YWdlTW9kZWwuZnVsbF9zY29yZXMiLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBOVUxMOworICBfX3B5eF9MNF9hcmd1bWVudF91bnBhY2tpbmdfZG9uZTo7CisgIF9fcHl4X3IgPSBfX3B5eF9wZl81a2VubG1fMTNMYW5ndWFnZU1vZGVsXzZmdWxsX3Njb3JlcygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKilfX3B5eF92X3NlbGYpLCBfX3B5eF92X3NlbnRlbmNlLCBfX3B5eF92X2JvcywgX19weXhfdl9lb3MpOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF82ZnVsbF9zY29yZXMoc3RydWN0IF9fcHl4X29ial81a2VubG1fTGFuZ3VhZ2VNb2RlbCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl9zZW50ZW5jZSwgUHlPYmplY3QgKl9fcHl4X3ZfYm9zLCBQeU9iamVjdCAqX19weXhfdl9lb3MpIHsKKyAgc3RydWN0IF9fcHl4X29ial81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyAqX19weXhfY3VyX3Njb3BlOworICBQeU9iamVjdCAqX19weXhfciA9IE5VTEw7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoImZ1bGxfc2NvcmVzIiwgMCk7CisgIF9fcHl4X2N1cl9zY29wZSA9IChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzICopX19weXhfdHBfbmV3XzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzKF9fcHl4X3B0eXBlXzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzLCBfX3B5eF9lbXB0eV90dXBsZSwgTlVMTCk7CisgIGlmICh1bmxpa2VseSghX19weXhfY3VyX3Njb3BlKSkgeworICAgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICAgIHJldHVybiBOVUxMOworICB9CisgIF9fUHl4X0dPVFJFRihfX3B5eF9jdXJfc2NvcGUpOworICBfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfc2VsZiA9IF9fcHl4X3Zfc2VsZjsKKyAgX19QeXhfSU5DUkVGKChQeU9iamVjdCAqKV9fcHl4X2N1cl9zY29wZS0+X19weXhfdl9zZWxmKTsKKyAgX19QeXhfR0lWRVJFRigoUHlPYmplY3QgKilfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfc2VsZik7CisgIF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl9zZW50ZW5jZSA9IF9fcHl4X3Zfc2VudGVuY2U7CisgIF9fUHl4X0lOQ1JFRihfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfc2VudGVuY2UpOworICBfX1B5eF9HSVZFUkVGKF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl9zZW50ZW5jZSk7CisgIF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl9ib3MgPSBfX3B5eF92X2JvczsKKyAgX19QeXhfSU5DUkVGKF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl9ib3MpOworICBfX1B5eF9HSVZFUkVGKF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl9ib3MpOworICBfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3ZfZW9zID0gX19weXhfdl9lb3M7CisgIF9fUHl4X0lOQ1JFRihfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3ZfZW9zKTsKKyAgX19QeXhfR0lWRVJFRihfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3ZfZW9zKTsKKyAgeworICAgIF9fcHl4X0dlbmVyYXRvck9iamVjdCAqZ2VuID0gX19QeXhfR2VuZXJhdG9yX05ldygoX19weXhfZ2VuZXJhdG9yX2JvZHlfdCkgX19weXhfZ2JfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF84Z2VuZXJhdG9yLCAoUHlPYmplY3QgKikgX19weXhfY3VyX3Njb3BlLCBfX3B5eF9uX3NfZnVsbF9zY29yZXMsIF9fcHl4X25fc19MYW5ndWFnZU1vZGVsX2Z1bGxfc2NvcmVzKTsgaWYgKHVubGlrZWx5KCFnZW4pKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxMjI7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfREVDUkVGKF9fcHl4X2N1cl9zY29wZSk7CisgICAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBnZW47CisgIH0KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfTDFfZXJyb3I6OworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLkxhbmd1YWdlTW9kZWwuZnVsbF9zY29yZXMiLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19weXhfciA9IE5VTEw7CisgIF9fUHl4X0RFQ1JFRigoKFB5T2JqZWN0ICopX19weXhfY3VyX3Njb3BlKSk7CisgIF9fUHl4X1hHSVZFUkVGKF9fcHl4X3IpOworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfZ2JfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF84Z2VuZXJhdG9yKF9fcHl4X0dlbmVyYXRvck9iamVjdCAqX19weXhfZ2VuZXJhdG9yLCBQeU9iamVjdCAqX19weXhfc2VudF92YWx1ZSkgLyogZ2VuZXJhdG9yIGJvZHkgKi8KK3sKKyAgc3RydWN0IF9fcHl4X29ial81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyAqX19weXhfY3VyX3Njb3BlID0gKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzICopX19weXhfZ2VuZXJhdG9yLT5jbG9zdXJlKTsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF8xID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfMiA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzMgPSBOVUxMOworICBpbnQgX19weXhfdF80OworICBQeV9zc2l6ZV90IF9fcHl4X3RfNTsKKyAgY2hhciAqX19weXhfdF82OworICBQeU9iamVjdCAqX19weXhfdF83ID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfOCA9IE5VTEw7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIk5vbmUiLCAwKTsKKyAgc3dpdGNoIChfX3B5eF9nZW5lcmF0b3ItPnJlc3VtZV9sYWJlbCkgeworICAgIGNhc2UgMDogZ290byBfX3B5eF9MM19maXJzdF9ydW47CisgICAgY2FzZSAxOiBnb3RvIF9fcHl4X0w3X3Jlc3VtZV9mcm9tX3lpZWxkOworICAgIGNhc2UgMjogZ290byBfX3B5eF9MOV9yZXN1bWVfZnJvbV95aWVsZDsKKyAgICBkZWZhdWx0OiAvKiBDUHl0aG9uIHJhaXNlcyB0aGUgcmlnaHQgZXJyb3IgaGVyZSAqLworICAgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICAgIHJldHVybiBOVUxMOworICB9CisgIF9fcHl4X0wzX2ZpcnN0X3J1bjo7CisgIGlmICh1bmxpa2VseSghX19weXhfc2VudF92YWx1ZSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEyMjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKworICAvKiAia2VubG0ucHl4IjoxMjkKKyAqICAgICAgICAgQHBhcmFtIGVvcyBzaG91bGQga2VubG0gYWRkIGFuIGVvcyBzdGF0ZQorICogICAgICAgICAiIiIKKyAqICAgICAgICAgY2RlZiBsaXN0IHdvcmRzID0gYXNfc3RyKHNlbnRlbmNlKS5zcGxpdCgpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgY2RlZiBfa2VubG0uU3RhdGUgc3RhdGUKKyAqICAgICAgICAgaWYgYm9zOgorICovCisgIF9fcHl4X3RfMiA9IF9fcHl4X2ZfNWtlbmxtX2FzX3N0cihfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfc2VudGVuY2UpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMikpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEyOTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMik7CisgIF9fcHl4X3RfMyA9IF9fUHl4X1B5T2JqZWN0X0dldEF0dHJTdHIoX19weXhfdF8yLCBfX3B5eF9uX3Nfc3BsaXQpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEyOTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzIpOyBfX3B5eF90XzIgPSAwOworICBfX3B5eF90XzIgPSBOVUxMOworICBpZiAoQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OICYmIGxpa2VseShQeU1ldGhvZF9DaGVjayhfX3B5eF90XzMpKSkgeworICAgIF9fcHl4X3RfMiA9IFB5TWV0aG9kX0dFVF9TRUxGKF9fcHl4X3RfMyk7CisgICAgaWYgKGxpa2VseShfX3B5eF90XzIpKSB7CisgICAgICBQeU9iamVjdCogZnVuY3Rpb24gPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oX19weXhfdF8zKTsKKyAgICAgIF9fUHl4X0lOQ1JFRihfX3B5eF90XzIpOworICAgICAgX19QeXhfSU5DUkVGKGZ1bmN0aW9uKTsKKyAgICAgIF9fUHl4X0RFQ1JFRl9TRVQoX19weXhfdF8zLCBmdW5jdGlvbik7CisgICAgfQorICB9CisgIGlmIChfX3B5eF90XzIpIHsKKyAgICBfX3B5eF90XzEgPSBfX1B5eF9QeU9iamVjdF9DYWxsT25lQXJnKF9fcHl4X3RfMywgX19weXhfdF8yKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxMjk7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfREVDUkVGKF9fcHl4X3RfMik7IF9fcHl4X3RfMiA9IDA7CisgIH0gZWxzZSB7CisgICAgX19weXhfdF8xID0gX19QeXhfUHlPYmplY3RfQ2FsbE5vQXJnKF9fcHl4X3RfMyk7IGlmICh1bmxpa2VseSghX19weXhfdF8xKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTI5OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICB9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICBfX1B5eF9ERUNSRUYoX19weXhfdF8zKTsgX19weXhfdF8zID0gMDsKKyAgaWYgKCEobGlrZWx5KFB5TGlzdF9DaGVja0V4YWN0KF9fcHl4X3RfMSkpfHwoKF9fcHl4X3RfMSkgPT0gUHlfTm9uZSl8fChQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiRXhwZWN0ZWQgJS4xNnMsIGdvdCAlLjIwMHMiLCAibGlzdCIsIFB5X1RZUEUoX19weXhfdF8xKS0+dHBfbmFtZSksIDApKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTI5OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfMSk7CisgIF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl93b3JkcyA9ICgoUHlPYmplY3QqKV9fcHl4X3RfMSk7CisgIF9fcHl4X3RfMSA9IDA7CisKKyAgLyogImtlbmxtLnB5eCI6MTMxCisgKiAgICAgICAgIGNkZWYgbGlzdCB3b3JkcyA9IGFzX3N0cihzZW50ZW5jZSkuc3BsaXQoKQorICogICAgICAgICBjZGVmIF9rZW5sbS5TdGF0ZSBzdGF0ZQorICogICAgICAgICBpZiBib3M6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHNlbGYubW9kZWwuQmVnaW5TZW50ZW5jZVdyaXRlKCZzdGF0ZSkKKyAqICAgICAgICAgZWxzZToKKyAqLworICBfX3B5eF90XzQgPSBfX1B5eF9QeU9iamVjdF9Jc1RydWUoX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X2Jvcyk7IGlmICh1bmxpa2VseShfX3B5eF90XzQgPCAwKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTMxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBpZiAoX19weXhfdF80KSB7CisKKyAgICAvKiAia2VubG0ucHl4IjoxMzIKKyAqICAgICAgICAgY2RlZiBfa2VubG0uU3RhdGUgc3RhdGUKKyAqICAgICAgICAgaWYgYm9zOgorICogICAgICAgICAgICAgc2VsZi5tb2RlbC5CZWdpblNlbnRlbmNlV3JpdGUoJnN0YXRlKSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIGVsc2U6CisgKiAgICAgICAgICAgICBzZWxmLm1vZGVsLk51bGxDb250ZXh0V3JpdGUoJnN0YXRlKQorICovCisgICAgX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3NlbGYtPm1vZGVsLT5CZWdpblNlbnRlbmNlV3JpdGUoKCZfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfc3RhdGUpKTsKKyAgICBnb3RvIF9fcHl4X0w0OworICB9CisgIC8qZWxzZSovIHsKKworICAgIC8qICJrZW5sbS5weXgiOjEzNAorICogICAgICAgICAgICAgc2VsZi5tb2RlbC5CZWdpblNlbnRlbmNlV3JpdGUoJnN0YXRlKQorICogICAgICAgICBlbHNlOgorICogICAgICAgICAgICAgc2VsZi5tb2RlbC5OdWxsQ29udGV4dFdyaXRlKCZzdGF0ZSkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBjZGVmIF9rZW5sbS5TdGF0ZSBvdXRfc3RhdGUKKyAqICAgICAgICAgY2RlZiBfa2VubG0uRnVsbFNjb3JlUmV0dXJuIHJldAorICovCisgICAgX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3NlbGYtPm1vZGVsLT5OdWxsQ29udGV4dFdyaXRlKCgmX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3N0YXRlKSk7CisgIH0KKyAgX19weXhfTDQ6OworCisgIC8qICJrZW5sbS5weXgiOjEzNworICogICAgICAgICBjZGVmIF9rZW5sbS5TdGF0ZSBvdXRfc3RhdGUKKyAqICAgICAgICAgY2RlZiBfa2VubG0uRnVsbFNjb3JlUmV0dXJuIHJldAorICogICAgICAgICBjZGVmIGZsb2F0IHRvdGFsID0gMCAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIGNkZWYgX2tlbmxtLldvcmRJbmRleCB3aWQKKyAqICAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6CisgKi8KKyAgX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3RvdGFsID0gMC4wOworCisgIC8qICJrZW5sbS5weXgiOjEzOQorICogICAgICAgICBjZGVmIGZsb2F0IHRvdGFsID0gMAorICogICAgICAgICBjZGVmIF9rZW5sbS5Xb3JkSW5kZXggd2lkCisgKiAgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICB3aWQgPSBzZWxmLnZvY2FiLkluZGV4KHdvcmQpCisgKiAgICAgICAgICAgICByZXQgPSBzZWxmLm1vZGVsLkJhc2VGdWxsU2NvcmUoJnN0YXRlLCB3aWQsICZvdXRfc3RhdGUpCisgKi8KKyAgaWYgKHVubGlrZWx5KF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl93b3JkcyA9PSBQeV9Ob25lKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICInTm9uZVR5cGUnIG9iamVjdCBpcyBub3QgaXRlcmFibGUiKTsKKyAgICB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxMzk7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIH0KKyAgX19weXhfdF8xID0gX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3dvcmRzOyBfX1B5eF9JTkNSRUYoX19weXhfdF8xKTsgX19weXhfdF81ID0gMDsKKyAgZm9yICg7OykgeworICAgIGlmIChfX3B5eF90XzUgPj0gUHlMaXN0X0dFVF9TSVpFKF9fcHl4X3RfMSkpIGJyZWFrOworICAgICNpZiBDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04KKyAgICBfX3B5eF90XzMgPSBQeUxpc3RfR0VUX0lURU0oX19weXhfdF8xLCBfX3B5eF90XzUpOyBfX1B5eF9JTkNSRUYoX19weXhfdF8zKTsgX19weXhfdF81Kys7IGlmICh1bmxpa2VseSgwIDwgMCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEzOTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICAjZWxzZQorICAgIF9fcHl4X3RfMyA9IFB5U2VxdWVuY2VfSVRFTShfX3B5eF90XzEsIF9fcHl4X3RfNSk7IF9fcHl4X3RfNSsrOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEzOTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICAjZW5kaWYKKyAgICBfX1B5eF9YR09UUkVGKF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl93b3JkKTsKKyAgICBfX1B5eF9YREVDUkVGX1NFVChfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfd29yZCwgX19weXhfdF8zKTsKKyAgICBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfMyk7CisgICAgX19weXhfdF8zID0gMDsKKworICAgIC8qICJrZW5sbS5weXgiOjE0MAorICogICAgICAgICBjZGVmIF9rZW5sbS5Xb3JkSW5kZXggd2lkCisgKiAgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgorICogICAgICAgICAgICAgd2lkID0gc2VsZi52b2NhYi5JbmRleCh3b3JkKSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICByZXQgPSBzZWxmLm1vZGVsLkJhc2VGdWxsU2NvcmUoJnN0YXRlLCB3aWQsICZvdXRfc3RhdGUpCisgKiAgICAgICAgICAgICB5aWVsZCAocmV0LnByb2IsIHJldC5uZ3JhbV9sZW5ndGgsIHdpZCA9PSAwKQorICovCisgICAgX19weXhfdF82ID0gX19QeXhfUHlPYmplY3RfQXNTdHJpbmcoX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3dvcmQpOyBpZiAodW5saWtlbHkoKCFfX3B5eF90XzYpICYmIFB5RXJyX09jY3VycmVkKCkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNDA7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3dpZCA9IF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl9zZWxmLT52b2NhYi0+SW5kZXgoX19weXhfdF82KTsKKworICAgIC8qICJrZW5sbS5weXgiOjE0MQorICogICAgICAgICBmb3Igd29yZCBpbiB3b3JkczoKKyAqICAgICAgICAgICAgIHdpZCA9IHNlbGYudm9jYWIuSW5kZXgod29yZCkKKyAqICAgICAgICAgICAgIHJldCA9IHNlbGYubW9kZWwuQmFzZUZ1bGxTY29yZSgmc3RhdGUsIHdpZCwgJm91dF9zdGF0ZSkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgeWllbGQgKHJldC5wcm9iLCByZXQubmdyYW1fbGVuZ3RoLCB3aWQgPT0gMCkKKyAqICAgICAgICAgICAgIHN0YXRlID0gb3V0X3N0YXRlCisgKi8KKyAgICBfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3ZfcmV0ID0gX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3NlbGYtPm1vZGVsLT5CYXNlRnVsbFNjb3JlKCgmX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3N0YXRlKSwgX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3dpZCwgKCZfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfb3V0X3N0YXRlKSk7CisKKyAgICAvKiAia2VubG0ucHl4IjoxNDIKKyAqICAgICAgICAgICAgIHdpZCA9IHNlbGYudm9jYWIuSW5kZXgod29yZCkKKyAqICAgICAgICAgICAgIHJldCA9IHNlbGYubW9kZWwuQmFzZUZ1bGxTY29yZSgmc3RhdGUsIHdpZCwgJm91dF9zdGF0ZSkKKyAqICAgICAgICAgICAgIHlpZWxkIChyZXQucHJvYiwgcmV0Lm5ncmFtX2xlbmd0aCwgd2lkID09IDApICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHN0YXRlID0gb3V0X3N0YXRlCisgKiAgICAgICAgIGlmIGVvczoKKyAqLworICAgIF9fcHl4X3RfMyA9IFB5RmxvYXRfRnJvbURvdWJsZShfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3ZfcmV0LnByb2IpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE0MjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICBfX1B5eF9HT1RSRUYoX19weXhfdF8zKTsKKyAgICBfX3B5eF90XzIgPSBfX1B5eF9QeUludF9Gcm9tX3Vuc2lnbmVkX2NoYXIoX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3JldC5uZ3JhbV9sZW5ndGgpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMikpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE0MjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICBfX1B5eF9HT1RSRUYoX19weXhfdF8yKTsKKyAgICBfX3B5eF90XzcgPSBfX1B5eF9QeUJvb2xfRnJvbUxvbmcoKF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl93aWQgPT0gMCkpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE0MjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICBfX1B5eF9HT1RSRUYoX19weXhfdF83KTsKKyAgICBfX3B5eF90XzggPSBQeVR1cGxlX05ldygzKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzgpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNDI7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfOCk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzgsIDAsIF9fcHl4X3RfMyk7CisgICAgX19QeXhfR0lWRVJFRihfX3B5eF90XzMpOworICAgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF84LCAxLCBfX3B5eF90XzIpOworICAgIF9fUHl4X0dJVkVSRUYoX19weXhfdF8yKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKF9fcHl4X3RfOCwgMiwgX19weXhfdF83KTsKKyAgICBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfNyk7CisgICAgX19weXhfdF8zID0gMDsKKyAgICBfX3B5eF90XzIgPSAwOworICAgIF9fcHl4X3RfNyA9IDA7CisgICAgX19weXhfciA9IF9fcHl4X3RfODsKKyAgICBfX3B5eF90XzggPSAwOworICAgIF9fUHl4X1hHSVZFUkVGKF9fcHl4X3RfMSk7CisgICAgX19weXhfY3VyX3Njb3BlLT5fX3B5eF90XzAgPSBfX3B5eF90XzE7CisgICAgX19weXhfY3VyX3Njb3BlLT5fX3B5eF90XzEgPSBfX3B5eF90XzU7CisgICAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgICAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgICAgLyogcmV0dXJuIGZyb20gZ2VuZXJhdG9yLCB5aWVsZGluZyB2YWx1ZSAqLworICAgIF9fcHl4X2dlbmVyYXRvci0+cmVzdW1lX2xhYmVsID0gMTsKKyAgICByZXR1cm4gX19weXhfcjsKKyAgICBfX3B5eF9MN19yZXN1bWVfZnJvbV95aWVsZDo7CisgICAgX19weXhfdF8xID0gX19weXhfY3VyX3Njb3BlLT5fX3B5eF90XzA7CisgICAgX19weXhfY3VyX3Njb3BlLT5fX3B5eF90XzAgPSAwOworICAgIF9fUHl4X1hHT1RSRUYoX19weXhfdF8xKTsKKyAgICBfX3B5eF90XzUgPSBfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3RfMTsKKyAgICBpZiAodW5saWtlbHkoIV9fcHl4X3NlbnRfdmFsdWUpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNDI7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisKKyAgICAvKiAia2VubG0ucHl4IjoxNDMKKyAqICAgICAgICAgICAgIHJldCA9IHNlbGYubW9kZWwuQmFzZUZ1bGxTY29yZSgmc3RhdGUsIHdpZCwgJm91dF9zdGF0ZSkKKyAqICAgICAgICAgICAgIHlpZWxkIChyZXQucHJvYiwgcmV0Lm5ncmFtX2xlbmd0aCwgd2lkID09IDApCisgKiAgICAgICAgICAgICBzdGF0ZSA9IG91dF9zdGF0ZSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIGlmIGVvczoKKyAqICAgICAgICAgICAgIHJldCA9IHNlbGYubW9kZWwuQmFzZUZ1bGxTY29yZSgmc3RhdGUsCisgKi8KKyAgICBfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfc3RhdGUgPSBfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfb3V0X3N0YXRlOworCisgICAgLyogImtlbmxtLnB5eCI6MTM5CisgKiAgICAgICAgIGNkZWYgZmxvYXQgdG90YWwgPSAwCisgKiAgICAgICAgIGNkZWYgX2tlbmxtLldvcmRJbmRleCB3aWQKKyAqICAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHdpZCA9IHNlbGYudm9jYWIuSW5kZXgod29yZCkKKyAqICAgICAgICAgICAgIHJldCA9IHNlbGYubW9kZWwuQmFzZUZ1bGxTY29yZSgmc3RhdGUsIHdpZCwgJm91dF9zdGF0ZSkKKyAqLworICB9CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzEpOyBfX3B5eF90XzEgPSAwOworCisgIC8qICJrZW5sbS5weXgiOjE0NAorICogICAgICAgICAgICAgeWllbGQgKHJldC5wcm9iLCByZXQubmdyYW1fbGVuZ3RoLCB3aWQgPT0gMCkKKyAqICAgICAgICAgICAgIHN0YXRlID0gb3V0X3N0YXRlCisgKiAgICAgICAgIGlmIGVvczogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgcmV0ID0gc2VsZi5tb2RlbC5CYXNlRnVsbFNjb3JlKCZzdGF0ZSwKKyAqICAgICAgICAgICAgICAgICBzZWxmLnZvY2FiLkVuZFNlbnRlbmNlKCksICZvdXRfc3RhdGUpCisgKi8KKyAgX19weXhfdF80ID0gX19QeXhfUHlPYmplY3RfSXNUcnVlKF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl9lb3MpOyBpZiAodW5saWtlbHkoX19weXhfdF80IDwgMCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE0NDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgaWYgKF9fcHl4X3RfNCkgeworCisgICAgLyogImtlbmxtLnB5eCI6MTQ1CisgKiAgICAgICAgICAgICBzdGF0ZSA9IG91dF9zdGF0ZQorICogICAgICAgICBpZiBlb3M6CisgKiAgICAgICAgICAgICByZXQgPSBzZWxmLm1vZGVsLkJhc2VGdWxsU2NvcmUoJnN0YXRlLCAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICAgICAgc2VsZi52b2NhYi5FbmRTZW50ZW5jZSgpLCAmb3V0X3N0YXRlKQorICogICAgICAgICAgICAgeWllbGQgKHJldC5wcm9iLCByZXQubmdyYW1fbGVuZ3RoLCBGYWxzZSkKKyAqLworICAgIF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl9yZXQgPSBfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfc2VsZi0+bW9kZWwtPkJhc2VGdWxsU2NvcmUoKCZfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfc3RhdGUpLCBfX3B5eF9jdXJfc2NvcGUtPl9fcHl4X3Zfc2VsZi0+dm9jYWItPkVuZFNlbnRlbmNlKCksICgmX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X291dF9zdGF0ZSkpOworCisgICAgLyogImtlbmxtLnB5eCI6MTQ3CisgKiAgICAgICAgICAgICByZXQgPSBzZWxmLm1vZGVsLkJhc2VGdWxsU2NvcmUoJnN0YXRlLAorICogICAgICAgICAgICAgICAgIHNlbGYudm9jYWIuRW5kU2VudGVuY2UoKSwgJm91dF9zdGF0ZSkKKyAqICAgICAgICAgICAgIHlpZWxkIChyZXQucHJvYiwgcmV0Lm5ncmFtX2xlbmd0aCwgRmFsc2UpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqIAorICogICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgd29yZCk6CisgKi8KKyAgICBfX3B5eF90XzEgPSBQeUZsb2F0X0Zyb21Eb3VibGUoX19weXhfY3VyX3Njb3BlLT5fX3B5eF92X3JldC5wcm9iKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNDc7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMSk7CisgICAgX19weXhfdF84ID0gX19QeXhfUHlJbnRfRnJvbV91bnNpZ25lZF9jaGFyKF9fcHl4X2N1cl9zY29wZS0+X19weXhfdl9yZXQubmdyYW1fbGVuZ3RoKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzgpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNDc7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfOCk7CisgICAgX19weXhfdF83ID0gUHlUdXBsZV9OZXcoMyk7IGlmICh1bmxpa2VseSghX19weXhfdF83KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTQ3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzcpOworICAgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF83LCAwLCBfX3B5eF90XzEpOworICAgIF9fUHl4X0dJVkVSRUYoX19weXhfdF8xKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKF9fcHl4X3RfNywgMSwgX19weXhfdF84KTsKKyAgICBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfOCk7CisgICAgX19QeXhfSU5DUkVGKFB5X0ZhbHNlKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKF9fcHl4X3RfNywgMiwgUHlfRmFsc2UpOworICAgIF9fUHl4X0dJVkVSRUYoUHlfRmFsc2UpOworICAgIF9fcHl4X3RfMSA9IDA7CisgICAgX19weXhfdF84ID0gMDsKKyAgICBfX3B5eF9yID0gX19weXhfdF83OworICAgIF9fcHl4X3RfNyA9IDA7CisgICAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgICAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgICAgLyogcmV0dXJuIGZyb20gZ2VuZXJhdG9yLCB5aWVsZGluZyB2YWx1ZSAqLworICAgIF9fcHl4X2dlbmVyYXRvci0+cmVzdW1lX2xhYmVsID0gMjsKKyAgICByZXR1cm4gX19weXhfcjsKKyAgICBfX3B5eF9MOV9yZXN1bWVfZnJvbV95aWVsZDo7CisgICAgaWYgKHVubGlrZWx5KCFfX3B5eF9zZW50X3ZhbHVlKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTQ3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIGdvdG8gX19weXhfTDg7CisgIH0KKyAgX19weXhfTDg6OworCisgIC8qICJrZW5sbS5weXgiOjEyMgorICogICAgICAgICByZXR1cm4gdG90YWwKKyAqIAorICogICAgIGRlZiBmdWxsX3Njb3JlcyhzZWxmLCBzZW50ZW5jZSwgYm9zID0gVHJ1ZSwgZW9zID0gVHJ1ZSk6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgIiIiCisgKiAgICAgICAgIGZ1bGxfc2NvcmVzKHNlbnRlbmNlLCBib3MgPSBUcnVlLCBlb3MgPSBUdXJlKSAtPiBnZW5lcmF0ZSBmdWxsIHNjb3JlcyAocHJvYiwgbmdyYW0gbGVuZ3RoLCBvb3YpCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKKyAgZ290byBfX3B5eF9MMDsKKyAgX19weXhfTDFfZXJyb3I6OworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMSk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8yKTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzMpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfNyk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF84KTsKKyAgX19QeXhfQWRkVHJhY2ViYWNrKCJmdWxsX3Njb3JlcyIsIF9fcHl4X2NsaW5lbm8sIF9fcHl4X2xpbmVubywgX19weXhfZmlsZW5hbWUpOworICBfX3B5eF9MMDo7CisgIF9fUHl4X1hERUNSRUYoX19weXhfcik7CisgIF9fcHl4X2dlbmVyYXRvci0+cmVzdW1lX2xhYmVsID0gLTE7CisgIF9fUHl4X0dlbmVyYXRvcl9jbGVhcigoUHlPYmplY3QqKV9fcHl4X2dlbmVyYXRvcik7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gTlVMTDsKK30KKworLyogImtlbmxtLnB5eCI6MTQ5CisgKiAgICAgICAgICAgICB5aWVsZCAocmV0LnByb2IsIHJldC5uZ3JhbV9sZW5ndGgsIEZhbHNlKQorICogCisgKiAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB3b3JkKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBjZGVmIGJ5dGVzIHcgPSBhc19zdHIod29yZCkKKyAqICAgICAgICAgcmV0dXJuIChzZWxmLnZvY2FiLkluZGV4KHcpICE9IDApCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyBpbnQgX19weXhfcHdfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF8xMF9fY29udGFpbnNfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl93b3JkKTsgLypwcm90byovCitzdGF0aWMgaW50IF9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfMTBfX2NvbnRhaW5zX18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZiwgUHlPYmplY3QgKl9fcHl4X3Zfd29yZCkgeworICBpbnQgX19weXhfcjsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fY29udGFpbnNfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfOV9fY29udGFpbnNfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKilfX3B5eF92X3NlbGYpLCAoKFB5T2JqZWN0ICopX19weXhfdl93b3JkKSk7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIGludCBfX3B5eF9wZl81a2VubG1fMTNMYW5ndWFnZU1vZGVsXzlfX2NvbnRhaW5zX18oc3RydWN0IF9fcHl4X29ial81a2VubG1fTGFuZ3VhZ2VNb2RlbCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl93b3JkKSB7CisgIFB5T2JqZWN0ICpfX3B5eF92X3cgPSAwOworICBpbnQgX19weXhfcjsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgUHlPYmplY3QgKl9fcHl4X3RfMSA9IE5VTEw7CisgIGNoYXIgKl9fcHl4X3RfMjsKKyAgaW50IF9fcHl4X2xpbmVubyA9IDA7CisgIGNvbnN0IGNoYXIgKl9fcHl4X2ZpbGVuYW1lID0gTlVMTDsKKyAgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19jb250YWluc19fIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6MTUwCisgKiAKKyAqICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHdvcmQpOgorICogICAgICAgICBjZGVmIGJ5dGVzIHcgPSBhc19zdHIod29yZCkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICByZXR1cm4gKHNlbGYudm9jYWIuSW5kZXgodykgIT0gMCkKKyAqIAorICovCisgIF9fcHl4X3RfMSA9IF9fcHl4X2ZfNWtlbmxtX2FzX3N0cihfX3B5eF92X3dvcmQpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE1MDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMSk7CisgIF9fcHl4X3ZfdyA9ICgoUHlPYmplY3QqKV9fcHl4X3RfMSk7CisgIF9fcHl4X3RfMSA9IDA7CisKKyAgLyogImtlbmxtLnB5eCI6MTUxCisgKiAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB3b3JkKToKKyAqICAgICAgICAgY2RlZiBieXRlcyB3ID0gYXNfc3RyKHdvcmQpCisgKiAgICAgICAgIHJldHVybiAoc2VsZi52b2NhYi5JbmRleCh3KSAhPSAwKSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAKKyAqICAgICBkZWYgX19yZXByX18oc2VsZik6CisgKi8KKyAgX19weXhfdF8yID0gX19QeXhfUHlPYmplY3RfQXNTdHJpbmcoX19weXhfdl93KTsgaWYgKHVubGlrZWx5KCghX19weXhfdF8yKSAmJiBQeUVycl9PY2N1cnJlZCgpKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTUxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF9yID0gKF9fcHl4X3Zfc2VsZi0+dm9jYWItPkluZGV4KF9fcHl4X3RfMikgIT0gMCk7CisgIGdvdG8gX19weXhfTDA7CisKKyAgLyogImtlbmxtLnB5eCI6MTQ5CisgKiAgICAgICAgICAgICB5aWVsZCAocmV0LnByb2IsIHJldC5uZ3JhbV9sZW5ndGgsIEZhbHNlKQorICogCisgKiAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB3b3JkKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBjZGVmIGJ5dGVzIHcgPSBhc19zdHIod29yZCkKKyAqICAgICAgICAgcmV0dXJuIChzZWxmLnZvY2FiLkluZGV4KHcpICE9IDApCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfTDFfZXJyb3I6OworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMSk7CisgIF9fUHl4X0FkZFRyYWNlYmFjaygia2VubG0uTGFuZ3VhZ2VNb2RlbC5fX2NvbnRhaW5zX18iLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19weXhfciA9IC0xOworICBfX3B5eF9MMDo7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdl93KTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCisvKiAia2VubG0ucHl4IjoxNTMKKyAqICAgICAgICAgcmV0dXJuIChzZWxmLnZvY2FiLkluZGV4KHcpICE9IDApCisgKiAKKyAqICAgICBkZWYgX19yZXByX18oc2VsZik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgcmV0dXJuICc8TGFuZ3VhZ2VNb2RlbCBmcm9tIHswfT4nLmZvcm1hdChvcy5wYXRoLmJhc2VuYW1lKHNlbGYucGF0aCkpCisgKiAKKyAqLworCisvKiBQeXRob24gd3JhcHBlciAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzEyX19yZXByX18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZik7IC8qcHJvdG8qLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzEyX19yZXByX18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZikgeworICBQeU9iamVjdCAqX19weXhfciA9IDA7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX3JlcHJfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfMTFfX3JlcHJfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKilfX3B5eF92X3NlbGYpKTsKKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfMTFfX3JlcHJfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsICpfX3B5eF92X3NlbGYpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSBOVUxMOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBQeU9iamVjdCAqX19weXhfdF8xID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfMiA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzMgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF80ID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfNSA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzYgPSBOVUxMOworICBpbnQgX19weXhfbGluZW5vID0gMDsKKyAgY29uc3QgY2hhciAqX19weXhfZmlsZW5hbWUgPSBOVUxMOworICBpbnQgX19weXhfY2xpbmVubyA9IDA7CisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX3JlcHJfXyIsIDApOworCisgIC8qICJrZW5sbS5weXgiOjE1NAorICogCisgKiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICogICAgICAgICByZXR1cm4gJzxMYW5ndWFnZU1vZGVsIGZyb20gezB9PicuZm9ybWF0KG9zLnBhdGguYmFzZW5hbWUoc2VsZi5wYXRoKSkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogCisgKiAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgKi8KKyAgX19QeXhfWERFQ1JFRihfX3B5eF9yKTsKKyAgX19weXhfdF8yID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF9rcF9zX0xhbmd1YWdlTW9kZWxfZnJvbV8wLCBfX3B5eF9uX3NfZm9ybWF0KTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzIpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNTQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzIpOworICBfX3B5eF90XzQgPSBfX1B5eF9HZXRNb2R1bGVHbG9iYWxOYW1lKF9fcHl4X25fc19vcyk7IGlmICh1bmxpa2VseSghX19weXhfdF80KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTU0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF80KTsKKyAgX19weXhfdF81ID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF90XzQsIF9fcHl4X25fc19wYXRoKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzUpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNTQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzUpOworICBfX1B5eF9ERUNSRUYoX19weXhfdF80KTsgX19weXhfdF80ID0gMDsKKyAgX19weXhfdF80ID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF90XzUsIF9fcHl4X25fc19iYXNlbmFtZSk7IGlmICh1bmxpa2VseSghX19weXhfdF80KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTU0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF80KTsKKyAgX19QeXhfREVDUkVGKF9fcHl4X3RfNSk7IF9fcHl4X3RfNSA9IDA7CisgIF9fcHl4X3RfNSA9IE5VTEw7CisgIGlmIChDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04gJiYgbGlrZWx5KFB5TWV0aG9kX0NoZWNrKF9fcHl4X3RfNCkpKSB7CisgICAgX19weXhfdF81ID0gUHlNZXRob2RfR0VUX1NFTEYoX19weXhfdF80KTsKKyAgICBpZiAobGlrZWx5KF9fcHl4X3RfNSkpIHsKKyAgICAgIFB5T2JqZWN0KiBmdW5jdGlvbiA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihfX3B5eF90XzQpOworICAgICAgX19QeXhfSU5DUkVGKF9fcHl4X3RfNSk7CisgICAgICBfX1B5eF9JTkNSRUYoZnVuY3Rpb24pOworICAgICAgX19QeXhfREVDUkVGX1NFVChfX3B5eF90XzQsIGZ1bmN0aW9uKTsKKyAgICB9CisgIH0KKyAgaWYgKCFfX3B5eF90XzUpIHsKKyAgICBfX3B5eF90XzMgPSBfX1B5eF9QeU9iamVjdF9DYWxsT25lQXJnKF9fcHl4X3RfNCwgX19weXhfdl9zZWxmLT5wYXRoKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNTQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgIH0gZWxzZSB7CisgICAgX19weXhfdF82ID0gUHlUdXBsZV9OZXcoMSsxKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzYpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNTQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfNik7CisgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzYsIDAsIF9fcHl4X3RfNSk7IF9fUHl4X0dJVkVSRUYoX19weXhfdF81KTsgX19weXhfdF81ID0gTlVMTDsKKyAgICBfX1B5eF9JTkNSRUYoX19weXhfdl9zZWxmLT5wYXRoKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKF9fcHl4X3RfNiwgMCsxLCBfX3B5eF92X3NlbGYtPnBhdGgpOworICAgIF9fUHl4X0dJVkVSRUYoX19weXhfdl9zZWxmLT5wYXRoKTsKKyAgICBfX3B5eF90XzMgPSBfX1B5eF9QeU9iamVjdF9DYWxsKF9fcHl4X3RfNCwgX19weXhfdF82LCBOVUxMKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNTQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgICAgX19QeXhfREVDUkVGKF9fcHl4X3RfNik7IF9fcHl4X3RfNiA9IDA7CisgIH0KKyAgX19QeXhfREVDUkVGKF9fcHl4X3RfNCk7IF9fcHl4X3RfNCA9IDA7CisgIF9fcHl4X3RfNCA9IE5VTEw7CisgIGlmIChDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04gJiYgbGlrZWx5KFB5TWV0aG9kX0NoZWNrKF9fcHl4X3RfMikpKSB7CisgICAgX19weXhfdF80ID0gUHlNZXRob2RfR0VUX1NFTEYoX19weXhfdF8yKTsKKyAgICBpZiAobGlrZWx5KF9fcHl4X3RfNCkpIHsKKyAgICAgIFB5T2JqZWN0KiBmdW5jdGlvbiA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihfX3B5eF90XzIpOworICAgICAgX19QeXhfSU5DUkVGKF9fcHl4X3RfNCk7CisgICAgICBfX1B5eF9JTkNSRUYoZnVuY3Rpb24pOworICAgICAgX19QeXhfREVDUkVGX1NFVChfX3B5eF90XzIsIGZ1bmN0aW9uKTsKKyAgICB9CisgIH0KKyAgaWYgKCFfX3B5eF90XzQpIHsKKyAgICBfX3B5eF90XzEgPSBfX1B5eF9QeU9iamVjdF9DYWxsT25lQXJnKF9fcHl4X3RfMiwgX19weXhfdF8zKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNTQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfREVDUkVGKF9fcHl4X3RfMyk7IF9fcHl4X3RfMyA9IDA7CisgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMSk7CisgIH0gZWxzZSB7CisgICAgX19weXhfdF82ID0gUHlUdXBsZV9OZXcoMSsxKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzYpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNTQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfNik7CisgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzYsIDAsIF9fcHl4X3RfNCk7IF9fUHl4X0dJVkVSRUYoX19weXhfdF80KTsgX19weXhfdF80ID0gTlVMTDsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKF9fcHl4X3RfNiwgMCsxLCBfX3B5eF90XzMpOworICAgIF9fUHl4X0dJVkVSRUYoX19weXhfdF8zKTsKKyAgICBfX3B5eF90XzMgPSAwOworICAgIF9fcHl4X3RfMSA9IF9fUHl4X1B5T2JqZWN0X0NhbGwoX19weXhfdF8yLCBfX3B5eF90XzYsIE5VTEwpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE1NDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgICBfX1B5eF9ERUNSRUYoX19weXhfdF82KTsgX19weXhfdF82ID0gMDsKKyAgfQorICBfX1B5eF9ERUNSRUYoX19weXhfdF8yKTsgX19weXhfdF8yID0gMDsKKyAgX19weXhfciA9IF9fcHl4X3RfMTsKKyAgX19weXhfdF8xID0gMDsKKyAgZ290byBfX3B5eF9MMDsKKworICAvKiAia2VubG0ucHl4IjoxNTMKKyAqICAgICAgICAgcmV0dXJuIChzZWxmLnZvY2FiLkluZGV4KHcpICE9IDApCisgKiAKKyAqICAgICBkZWYgX19yZXByX18oc2VsZik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgcmV0dXJuICc8TGFuZ3VhZ2VNb2RlbCBmcm9tIHswfT4nLmZvcm1hdChvcy5wYXRoLmJhc2VuYW1lKHNlbGYucGF0aCkpCisgKiAKKyAqLworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBfX3B5eF9MMV9lcnJvcjo7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8xKTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzIpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMyk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF80KTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzUpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfNik7CisgIF9fUHl4X0FkZFRyYWNlYmFjaygia2VubG0uTGFuZ3VhZ2VNb2RlbC5fX3JlcHJfXyIsIF9fcHl4X2NsaW5lbm8sIF9fcHl4X2xpbmVubywgX19weXhfZmlsZW5hbWUpOworICBfX3B5eF9yID0gTlVMTDsKKyAgX19weXhfTDA6OworICBfX1B5eF9YR0lWRVJFRihfX3B5eF9yKTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCisvKiAia2VubG0ucHl4IjoxNTYKKyAqICAgICAgICAgcmV0dXJuICc8TGFuZ3VhZ2VNb2RlbCBmcm9tIHswfT4nLmZvcm1hdChvcy5wYXRoLmJhc2VuYW1lKHNlbGYucGF0aCkpCisgKiAKKyAqICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICByZXR1cm4gKF9rZW5sbS5MYW5ndWFnZU1vZGVsLCAoc2VsZi5wYXRoLCkpCisgKiAKKyAqLworCisvKiBQeXRob24gd3JhcHBlciAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzE0X19yZWR1Y2VfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmLCBDWVRIT05fVU5VU0VEIFB5T2JqZWN0ICp1bnVzZWQpOyAvKnByb3RvKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcHdfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF8xNF9fcmVkdWNlX18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZiwgQ1lUSE9OX1VOVVNFRCBQeU9iamVjdCAqdW51c2VkKSB7CisgIFB5T2JqZWN0ICpfX3B5eF9yID0gMDsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fcmVkdWNlX18gKHdyYXBwZXIpIiwgMCk7CisgIF9fcHl4X3IgPSBfX3B5eF9wZl81a2VubG1fMTNMYW5ndWFnZU1vZGVsXzEzX19yZWR1Y2VfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKilfX3B5eF92X3NlbGYpKTsKKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfMTNfX3JlZHVjZV9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKl9fcHl4X3Zfc2VsZikgeworICBQeU9iamVjdCAqX19weXhfciA9IE5VTEw7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIFB5T2JqZWN0ICpfX3B5eF90XzEgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF8yID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfMyA9IE5VTEw7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fcmVkdWNlX18iLCAwKTsKKworICAvKiAia2VubG0ucHl4IjoxNTcKKyAqIAorICogICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICogICAgICAgICByZXR1cm4gKF9rZW5sbS5MYW5ndWFnZU1vZGVsLCAoc2VsZi5wYXRoLCkpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqIAorICogY2RlZiBjbGFzcyBNb2RlbDoKKyAqLworICBfX1B5eF9YREVDUkVGKF9fcHl4X3IpOworICBfX3B5eF90XzEgPSBfX1B5eF9HZXRNb2R1bGVHbG9iYWxOYW1lKF9fcHl4X25fc19rZW5sbSk7IGlmICh1bmxpa2VseSghX19weXhfdF8xKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTU3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgX19weXhfdF8yID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF90XzEsIF9fcHl4X25fc19MYW5ndWFnZU1vZGVsKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzIpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNTc7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzIpOworICBfX1B5eF9ERUNSRUYoX19weXhfdF8xKTsgX19weXhfdF8xID0gMDsKKyAgX19weXhfdF8xID0gUHlUdXBsZV9OZXcoMSk7IGlmICh1bmxpa2VseSghX19weXhfdF8xKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTU3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgX19QeXhfSU5DUkVGKF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF8xLCAwLCBfX3B5eF92X3NlbGYtPnBhdGgpOworICBfX1B5eF9HSVZFUkVGKF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgIF9fcHl4X3RfMyA9IFB5VHVwbGVfTmV3KDIpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE1NzsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF8zLCAwLCBfX3B5eF90XzIpOworICBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfMik7CisgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF8zLCAxLCBfX3B5eF90XzEpOworICBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfMSk7CisgIF9fcHl4X3RfMiA9IDA7CisgIF9fcHl4X3RfMSA9IDA7CisgIF9fcHl4X3IgPSBfX3B5eF90XzM7CisgIF9fcHl4X3RfMyA9IDA7CisgIGdvdG8gX19weXhfTDA7CisKKyAgLyogImtlbmxtLnB5eCI6MTU2CisgKiAgICAgICAgIHJldHVybiAnPExhbmd1YWdlTW9kZWwgZnJvbSB7MH0+Jy5mb3JtYXQob3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgpKQorICogCisgKiAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgcmV0dXJuIChfa2VubG0uTGFuZ3VhZ2VNb2RlbCwgKHNlbGYucGF0aCwpKQorICogCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfTDFfZXJyb3I6OworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMSk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8yKTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzMpOworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLkxhbmd1YWdlTW9kZWwuX19yZWR1Y2VfXyIsIF9fcHl4X2NsaW5lbm8sIF9fcHl4X2xpbmVubywgX19weXhfZmlsZW5hbWUpOworICBfX3B5eF9yID0gTlVMTDsKKyAgX19weXhfTDA6OworICBfX1B5eF9YR0lWRVJFRihfX3B5eF9yKTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCisvKiAia2VubG0ucHl4Ijo4MQorICogCisgKiAgICAgY2RlZiBfa2VubG0uTW9kZWwqIG1vZGVsCisgKiAgICAgY2RlZiBwdWJsaWMgYnl0ZXMgcGF0aCAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgY2RlZiBfa2VubG0uY29uc3RfVm9jYWJ1bGFyeSogdm9jYWIKKyAqIAorICovCisKKy8qIFB5dGhvbiB3cmFwcGVyICovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNHBhdGhfMV9fZ2V0X18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZik7IC8qcHJvdG8qLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzRwYXRoXzFfX2dldF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSAwOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19nZXRfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNHBhdGhfX19nZXRfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKilfX3B5eF92X3NlbGYpKTsKKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNHBhdGhfX19nZXRfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsICpfX3B5eF92X3NlbGYpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSBOVUxMOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19nZXRfXyIsIDApOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3IpOworICBfX1B5eF9JTkNSRUYoX19weXhfdl9zZWxmLT5wYXRoKTsKKyAgX19weXhfciA9IF9fcHl4X3Zfc2VsZi0+cGF0aDsKKyAgZ290byBfX3B5eF9MMDsKKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfTDA6OworICBfX1B5eF9YR0lWRVJFRihfX3B5eF9yKTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCisvKiBQeXRob24gd3JhcHBlciAqLworc3RhdGljIGludCBfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzRwYXRoXzNfX3NldF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF92X3ZhbHVlKTsgLypwcm90byovCitzdGF0aWMgaW50IF9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNHBhdGhfM19fc2V0X18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZiwgUHlPYmplY3QgKl9fcHl4X3ZfdmFsdWUpIHsKKyAgaW50IF9fcHl4X3I7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX3NldF9fICh3cmFwcGVyKSIsIDApOworICBfX3B5eF9yID0gX19weXhfcGZfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF80cGF0aF8yX19zZXRfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKilfX3B5eF92X3NlbGYpLCAoKFB5T2JqZWN0ICopX19weXhfdl92YWx1ZSkpOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKK3N0YXRpYyBpbnQgX19weXhfcGZfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF80cGF0aF8yX19zZXRfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF92X3ZhbHVlKSB7CisgIGludCBfX3B5eF9yOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBQeU9iamVjdCAqX19weXhfdF8xID0gTlVMTDsKKyAgaW50IF9fcHl4X2xpbmVubyA9IDA7CisgIGNvbnN0IGNoYXIgKl9fcHl4X2ZpbGVuYW1lID0gTlVMTDsKKyAgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19zZXRfXyIsIDApOworICBpZiAoIShsaWtlbHkoUHlCeXRlc19DaGVja0V4YWN0KF9fcHl4X3ZfdmFsdWUpKXx8KChfX3B5eF92X3ZhbHVlKSA9PSBQeV9Ob25lKXx8KFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJFeHBlY3RlZCAlLjE2cywgZ290ICUuMjAwcyIsICJieXRlcyIsIFB5X1RZUEUoX19weXhfdl92YWx1ZSktPnRwX25hbWUpLCAwKSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDgxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF90XzEgPSBfX3B5eF92X3ZhbHVlOworICBfX1B5eF9JTkNSRUYoX19weXhfdF8xKTsKKyAgX19QeXhfR0lWRVJFRihfX3B5eF90XzEpOworICBfX1B5eF9HT1RSRUYoX19weXhfdl9zZWxmLT5wYXRoKTsKKyAgX19QeXhfREVDUkVGKF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgIF9fcHl4X3Zfc2VsZi0+cGF0aCA9ICgoUHlPYmplY3QqKV9fcHl4X3RfMSk7CisgIF9fcHl4X3RfMSA9IDA7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fcHl4X3IgPSAwOworICBnb3RvIF9fcHl4X0wwOworICBfX3B5eF9MMV9lcnJvcjo7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8xKTsKKyAgX19QeXhfQWRkVHJhY2ViYWNrKCJrZW5sbS5MYW5ndWFnZU1vZGVsLnBhdGguX19zZXRfXyIsIF9fcHl4X2NsaW5lbm8sIF9fcHl4X2xpbmVubywgX19weXhfZmlsZW5hbWUpOworICBfX3B5eF9yID0gLTE7CisgIF9fcHl4X0wwOjsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCisvKiBQeXRob24gd3JhcHBlciAqLworc3RhdGljIGludCBfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzRwYXRoXzVfX2RlbF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpOyAvKnByb3RvKi8KK3N0YXRpYyBpbnQgX19weXhfcHdfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF80cGF0aF81X19kZWxfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmKSB7CisgIGludCBfX3B5eF9yOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19kZWxfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNHBhdGhfNF9fZGVsX18oKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsICopX19weXhfdl9zZWxmKSk7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIGludCBfX3B5eF9wZl81a2VubG1fMTNMYW5ndWFnZU1vZGVsXzRwYXRoXzRfX2RlbF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKl9fcHl4X3Zfc2VsZikgeworICBpbnQgX19weXhfcjsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fZGVsX18iLCAwKTsKKyAgX19QeXhfSU5DUkVGKFB5X05vbmUpOworICBfX1B5eF9HSVZFUkVGKFB5X05vbmUpOworICBfX1B5eF9HT1RSRUYoX19weXhfdl9zZWxmLT5wYXRoKTsKKyAgX19QeXhfREVDUkVGKF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgIF9fcHl4X3Zfc2VsZi0+cGF0aCA9ICgoUHlPYmplY3QqKVB5X05vbmUpOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBfX3B5eF9yID0gMDsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCisvKiAia2VubG0ucHl4IjoxNjgKKyAqICAgICBjZGVmIF9rZW5sbS5jb25zdF9Wb2NhYnVsYXJ5KiB2b2NhYgorICogCisgKiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICIiIgorICogICAgICAgICBMb2FkIHRoZSBsYW5ndWFnZSBtb2RlbC4KKyAqLworCisvKiBQeXRob24gd3JhcHBlciAqLworc3RhdGljIGludCBfX3B5eF9wd181a2VubG1fNU1vZGVsXzFfX2luaXRfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfYXJncywgUHlPYmplY3QgKl9fcHl4X2t3ZHMpOyAvKnByb3RvKi8KK3N0YXRpYyBjaGFyIF9fcHl4X2RvY181a2VubG1fNU1vZGVsX19faW5pdF9fW10gPSAiXG4gICAgICAgIExvYWQgdGhlIGxhbmd1YWdlIG1vZGVsLlxuXG4gICAgICAgIDpwYXJhbSBwYXRoOiBwYXRoIHRvIGFuIGFycGEgZmlsZSBvciBhIGtlbmxtIGJpbmFyeSBmaWxlLlxuICAgICAgICAiOworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorc3RydWN0IHdyYXBwZXJiYXNlIF9fcHl4X3dyYXBwZXJiYXNlXzVrZW5sbV81TW9kZWxfX19pbml0X187CisjZW5kaWYKK3N0YXRpYyBpbnQgX19weXhfcHdfNWtlbmxtXzVNb2RlbF8xX19pbml0X18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZiwgUHlPYmplY3QgKl9fcHl4X2FyZ3MsIFB5T2JqZWN0ICpfX3B5eF9rd2RzKSB7CisgIFB5T2JqZWN0ICpfX3B5eF92X3BhdGggPSAwOworICBpbnQgX19weXhfbGluZW5vID0gMDsKKyAgY29uc3QgY2hhciAqX19weXhfZmlsZW5hbWUgPSBOVUxMOworICBpbnQgX19weXhfY2xpbmVubyA9IDA7CisgIGludCBfX3B5eF9yOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19pbml0X18gKHdyYXBwZXIpIiwgMCk7CisgIHsKKyAgICBzdGF0aWMgUHlPYmplY3QgKipfX3B5eF9weWFyZ25hbWVzW10gPSB7Jl9fcHl4X25fc19wYXRoLDB9OworICAgIFB5T2JqZWN0KiB2YWx1ZXNbMV0gPSB7MH07CisgICAgaWYgKHVubGlrZWx5KF9fcHl4X2t3ZHMpKSB7CisgICAgICBQeV9zc2l6ZV90IGt3X2FyZ3M7CisgICAgICBjb25zdCBQeV9zc2l6ZV90IHBvc19hcmdzID0gUHlUdXBsZV9HRVRfU0laRShfX3B5eF9hcmdzKTsKKyAgICAgIHN3aXRjaCAocG9zX2FyZ3MpIHsKKyAgICAgICAgY2FzZSAgMTogdmFsdWVzWzBdID0gUHlUdXBsZV9HRVRfSVRFTShfX3B5eF9hcmdzLCAwKTsKKyAgICAgICAgY2FzZSAgMDogYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGdvdG8gX19weXhfTDVfYXJndHVwbGVfZXJyb3I7CisgICAgICB9CisgICAgICBrd19hcmdzID0gUHlEaWN0X1NpemUoX19weXhfa3dkcyk7CisgICAgICBzd2l0Y2ggKHBvc19hcmdzKSB7CisgICAgICAgIGNhc2UgIDA6CisgICAgICAgIGlmIChsaWtlbHkoKHZhbHVlc1swXSA9IFB5RGljdF9HZXRJdGVtKF9fcHl4X2t3ZHMsIF9fcHl4X25fc19wYXRoKSkgIT0gMCkpIGt3X2FyZ3MtLTsKKyAgICAgICAgZWxzZSBnb3RvIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOworICAgICAgfQorICAgICAgaWYgKHVubGlrZWx5KGt3X2FyZ3MgPiAwKSkgeworICAgICAgICBpZiAodW5saWtlbHkoX19QeXhfUGFyc2VPcHRpb25hbEtleXdvcmRzKF9fcHl4X2t3ZHMsIF9fcHl4X3B5YXJnbmFtZXMsIDAsIHZhbHVlcywgcG9zX2FyZ3MsICJfX2luaXRfXyIpIDwgMCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE2ODsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFB5VHVwbGVfR0VUX1NJWkUoX19weXhfYXJncykgIT0gMSkgeworICAgICAgZ290byBfX3B5eF9MNV9hcmd0dXBsZV9lcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgdmFsdWVzWzBdID0gUHlUdXBsZV9HRVRfSVRFTShfX3B5eF9hcmdzLCAwKTsKKyAgICB9CisgICAgX19weXhfdl9wYXRoID0gdmFsdWVzWzBdOworICB9CisgIGdvdG8gX19weXhfTDRfYXJndW1lbnRfdW5wYWNraW5nX2RvbmU7CisgIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOjsKKyAgX19QeXhfUmFpc2VBcmd0dXBsZUludmFsaWQoIl9faW5pdF9fIiwgMSwgMSwgMSwgUHlUdXBsZV9HRVRfU0laRShfX3B5eF9hcmdzKSk7IHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE2ODsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgX19weXhfTDNfZXJyb3I6OworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLk1vZGVsLl9faW5pdF9fIiwgX19weXhfY2xpbmVubywgX19weXhfbGluZW5vLCBfX3B5eF9maWxlbmFtZSk7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gLTE7CisgIF9fcHl4X0w0X2FyZ3VtZW50X3VucGFja2luZ19kb25lOjsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV81TW9kZWxfX19pbml0X18oKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqKV9fcHl4X3Zfc2VsZiksIF9fcHl4X3ZfcGF0aCk7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIGludCBfX3B5eF9wZl81a2VubG1fNU1vZGVsX19faW5pdF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF92X3BhdGgpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3ZfZXhjZXB0aW9uID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3ZfZXhjZXB0aW9uX21lc3NhZ2UgPSBOVUxMOworICBpbnQgX19weXhfcjsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgUHlPYmplY3QgKl9fcHl4X3RfMSA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzIgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF8zID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfNCA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzUgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF82ID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfNyA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzggPSBOVUxMOworICBjaGFyICpfX3B5eF90Xzk7CisgIGxtOjpiYXNlOjpNb2RlbCAqX19weXhfdF8xMDsKKyAgaW50IF9fcHl4X3RfMTE7CisgIFB5T2JqZWN0ICpfX3B5eF90XzEyID0gTlVMTDsKKyAgUHlfc3NpemVfdCBfX3B5eF90XzEzOworICBQeU9iamVjdCAqX19weXhfdF8xNCA9IE5VTEw7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9faW5pdF9fIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6MTc0CisgKiAgICAgICAgIDpwYXJhbSBwYXRoOiBwYXRoIHRvIGFuIGFycGEgZmlsZSBvciBhIGtlbmxtIGJpbmFyeSBmaWxlLgorICogICAgICAgICAiIiIKKyAqICAgICAgICAgc2VsZi5wYXRoID0gb3MucGF0aC5hYnNwYXRoKGFzX3N0cihwYXRoKSkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICB0cnk6CisgKiAgICAgICAgICAgICBzZWxmLm1vZGVsID0gX2tlbmxtLkxvYWRWaXJ0dWFsKHNlbGYucGF0aCkKKyAqLworICBfX3B5eF90XzIgPSBfX1B5eF9HZXRNb2R1bGVHbG9iYWxOYW1lKF9fcHl4X25fc19vcyk7IGlmICh1bmxpa2VseSghX19weXhfdF8yKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTc0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8yKTsKKyAgX19weXhfdF8zID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF90XzIsIF9fcHl4X25fc19wYXRoKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNzQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzMpOworICBfX1B5eF9ERUNSRUYoX19weXhfdF8yKTsgX19weXhfdF8yID0gMDsKKyAgX19weXhfdF8yID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF90XzMsIF9fcHl4X25fc19hYnNwYXRoKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzIpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNzQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzIpOworICBfX1B5eF9ERUNSRUYoX19weXhfdF8zKTsgX19weXhfdF8zID0gMDsKKyAgX19weXhfdF8zID0gX19weXhfZl81a2VubG1fYXNfc3RyKF9fcHl4X3ZfcGF0aCk7IGlmICh1bmxpa2VseSghX19weXhfdF8zKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTc0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8zKTsKKyAgX19weXhfdF80ID0gTlVMTDsKKyAgaWYgKENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTiAmJiBsaWtlbHkoUHlNZXRob2RfQ2hlY2soX19weXhfdF8yKSkpIHsKKyAgICBfX3B5eF90XzQgPSBQeU1ldGhvZF9HRVRfU0VMRihfX3B5eF90XzIpOworICAgIGlmIChsaWtlbHkoX19weXhfdF80KSkgeworICAgICAgUHlPYmplY3QqIGZ1bmN0aW9uID0gUHlNZXRob2RfR0VUX0ZVTkNUSU9OKF9fcHl4X3RfMik7CisgICAgICBfX1B5eF9JTkNSRUYoX19weXhfdF80KTsKKyAgICAgIF9fUHl4X0lOQ1JFRihmdW5jdGlvbik7CisgICAgICBfX1B5eF9ERUNSRUZfU0VUKF9fcHl4X3RfMiwgZnVuY3Rpb24pOworICAgIH0KKyAgfQorICBpZiAoIV9fcHl4X3RfNCkgeworICAgIF9fcHl4X3RfMSA9IF9fUHl4X1B5T2JqZWN0X0NhbGxPbmVBcmcoX19weXhfdF8yLCBfX3B5eF90XzMpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE3NDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICBfX1B5eF9ERUNSRUYoX19weXhfdF8zKTsgX19weXhfdF8zID0gMDsKKyAgICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgfSBlbHNlIHsKKyAgICBfX3B5eF90XzUgPSBQeVR1cGxlX05ldygxKzEpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE3NDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICBfX1B5eF9HT1RSRUYoX19weXhfdF81KTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKF9fcHl4X3RfNSwgMCwgX19weXhfdF80KTsgX19QeXhfR0lWRVJFRihfX3B5eF90XzQpOyBfX3B5eF90XzQgPSBOVUxMOworICAgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF81LCAwKzEsIF9fcHl4X3RfMyk7CisgICAgX19QeXhfR0lWRVJFRihfX3B5eF90XzMpOworICAgIF9fcHl4X3RfMyA9IDA7CisgICAgX19weXhfdF8xID0gX19QeXhfUHlPYmplY3RfQ2FsbChfX3B5eF90XzIsIF9fcHl4X3RfNSwgTlVMTCk7IGlmICh1bmxpa2VseSghX19weXhfdF8xKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTc0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICAgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzUpOyBfX3B5eF90XzUgPSAwOworICB9CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzIpOyBfX3B5eF90XzIgPSAwOworICBpZiAoIShsaWtlbHkoUHlCeXRlc19DaGVja0V4YWN0KF9fcHl4X3RfMSkpfHwoKF9fcHl4X3RfMSkgPT0gUHlfTm9uZSl8fChQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiRXhwZWN0ZWQgJS4xNnMsIGdvdCAlLjIwMHMiLCAiYnl0ZXMiLCBQeV9UWVBFKF9fcHl4X3RfMSktPnRwX25hbWUpLCAwKSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE3NDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR0lWRVJFRihfX3B5eF90XzEpOworICBfX1B5eF9HT1RSRUYoX19weXhfdl9zZWxmLT5wYXRoKTsKKyAgX19QeXhfREVDUkVGKF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgIF9fcHl4X3Zfc2VsZi0+cGF0aCA9ICgoUHlPYmplY3QqKV9fcHl4X3RfMSk7CisgIF9fcHl4X3RfMSA9IDA7CisKKyAgLyogImtlbmxtLnB5eCI6MTc1CisgKiAgICAgICAgICIiIgorICogICAgICAgICBzZWxmLnBhdGggPSBvcy5wYXRoLmFic3BhdGgoYXNfc3RyKHBhdGgpKQorICogICAgICAgICB0cnk6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHNlbGYubW9kZWwgPSBfa2VubG0uTG9hZFZpcnR1YWwoc2VsZi5wYXRoKQorICogICAgICAgICBleGNlcHQgUnVudGltZUVycm9yIGFzIGV4Y2VwdGlvbjoKKyAqLworICB7CisgICAgX19QeXhfRXhjZXB0aW9uU2F2ZSgmX19weXhfdF82LCAmX19weXhfdF83LCAmX19weXhfdF84KTsKKyAgICBfX1B5eF9YR09UUkVGKF9fcHl4X3RfNik7CisgICAgX19QeXhfWEdPVFJFRihfX3B5eF90XzcpOworICAgIF9fUHl4X1hHT1RSRUYoX19weXhfdF84KTsKKyAgICAvKnRyeToqLyB7CisKKyAgICAgIC8qICJrZW5sbS5weXgiOjE3NgorICogICAgICAgICBzZWxmLnBhdGggPSBvcy5wYXRoLmFic3BhdGgoYXNfc3RyKHBhdGgpKQorICogICAgICAgICB0cnk6CisgKiAgICAgICAgICAgICBzZWxmLm1vZGVsID0gX2tlbmxtLkxvYWRWaXJ0dWFsKHNlbGYucGF0aCkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBleGNlcHQgUnVudGltZUVycm9yIGFzIGV4Y2VwdGlvbjoKKyAqICAgICAgICAgICAgIGV4Y2VwdGlvbl9tZXNzYWdlID0gc3RyKGV4Y2VwdGlvbikucmVwbGFjZSgnXG4nLCAnICcpCisgKi8KKyAgICAgIF9fcHl4X3RfOSA9IF9fUHl4X1B5T2JqZWN0X0FzU3RyaW5nKF9fcHl4X3Zfc2VsZi0+cGF0aCk7IGlmICh1bmxpa2VseSgoIV9fcHl4X3RfOSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE3NjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgICAgIHRyeSB7CisgICAgICAgIF9fcHl4X3RfMTAgPSBsbTo6bmdyYW06OkxvYWRWaXJ0dWFsKF9fcHl4X3RfOSk7CisgICAgICB9IGNhdGNoKC4uLikgeworICAgICAgICBfX1B5eF9DcHBFeG4yUHlFcnIoKTsKKyAgICAgICAge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTc2OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDNfZXJyb3I7fQorICAgICAgfQorICAgICAgX19weXhfdl9zZWxmLT5tb2RlbCA9IF9fcHl4X3RfMTA7CisgICAgfQorICAgIF9fUHl4X1hERUNSRUYoX19weXhfdF82KTsgX19weXhfdF82ID0gMDsKKyAgICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfNyk7IF9fcHl4X3RfNyA9IDA7CisgICAgX19QeXhfWERFQ1JFRihfX3B5eF90XzgpOyBfX3B5eF90XzggPSAwOworICAgIGdvdG8gX19weXhfTDEwX3RyeV9lbmQ7CisgICAgX19weXhfTDNfZXJyb3I6OworICAgIF9fUHl4X1hERUNSRUYoX19weXhfdF80KTsgX19weXhfdF80ID0gMDsKKyAgICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMyk7IF9fcHl4X3RfMyA9IDA7CisgICAgX19QeXhfWERFQ1JFRihfX3B5eF90XzUpOyBfX3B5eF90XzUgPSAwOworICAgIF9fUHl4X1hERUNSRUYoX19weXhfdF8yKTsgX19weXhfdF8yID0gMDsKKyAgICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMSk7IF9fcHl4X3RfMSA9IDA7CisKKyAgICAvKiAia2VubG0ucHl4IjoxNzcKKyAqICAgICAgICAgdHJ5OgorICogICAgICAgICAgICAgc2VsZi5tb2RlbCA9IF9rZW5sbS5Mb2FkVmlydHVhbChzZWxmLnBhdGgpCisgKiAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZXhjZXB0aW9uOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICBleGNlcHRpb25fbWVzc2FnZSA9IHN0cihleGNlcHRpb24pLnJlcGxhY2UoJ1xuJywgJyAnKQorICogICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignQ2Fubm90IHJlYWQgbW9kZWwgXCd7fVwnICh7fSknLmZvcm1hdChwYXRoLCBleGNlcHRpb25fbWVzc2FnZSkpXAorICovCisgICAgX19weXhfdF8xMSA9IFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoX19weXhfYnVpbHRpbl9SdW50aW1lRXJyb3IpOworICAgIGlmIChfX3B5eF90XzExKSB7CisgICAgICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLk1vZGVsLl9faW5pdF9fIiwgX19weXhfY2xpbmVubywgX19weXhfbGluZW5vLCBfX3B5eF9maWxlbmFtZSk7CisgICAgICBpZiAoX19QeXhfR2V0RXhjZXB0aW9uKCZfX3B5eF90XzEsICZfX3B5eF90XzIsICZfX3B5eF90XzUpIDwgMCkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTc3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDVfZXhjZXB0X2Vycm9yO30KKyAgICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMik7CisgICAgICBfX1B5eF9HT1RSRUYoX19weXhfdF81KTsKKyAgICAgIF9fUHl4X0lOQ1JFRihfX3B5eF90XzIpOworICAgICAgX19weXhfdl9leGNlcHRpb24gPSBfX3B5eF90XzI7CisKKyAgICAgIC8qICJrZW5sbS5weXgiOjE3OAorICogICAgICAgICAgICAgc2VsZi5tb2RlbCA9IF9rZW5sbS5Mb2FkVmlydHVhbChzZWxmLnBhdGgpCisgKiAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZXhjZXB0aW9uOgorICogICAgICAgICAgICAgZXhjZXB0aW9uX21lc3NhZ2UgPSBzdHIoZXhjZXB0aW9uKS5yZXBsYWNlKCdcbicsICcgJykgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignQ2Fubm90IHJlYWQgbW9kZWwgXCd7fVwnICh7fSknLmZvcm1hdChwYXRoLCBleGNlcHRpb25fbWVzc2FnZSkpXAorICogICAgICAgICAgICAgICAgICAgICBmcm9tIGV4Y2VwdGlvbgorICovCisgICAgICBfX3B5eF90XzMgPSBQeVR1cGxlX05ldygxKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNzg7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgICAgICBfX1B5eF9JTkNSRUYoX19weXhfdl9leGNlcHRpb24pOworICAgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzMsIDAsIF9fcHl4X3ZfZXhjZXB0aW9uKTsKKyAgICAgIF9fUHl4X0dJVkVSRUYoX19weXhfdl9leGNlcHRpb24pOworICAgICAgX19weXhfdF80ID0gX19QeXhfUHlPYmplY3RfQ2FsbCgoKFB5T2JqZWN0ICopKChQeU9iamVjdCopKCZQeVN0cmluZ19UeXBlKSkpLCBfX3B5eF90XzMsIE5VTEwpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE3ODsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0w1X2V4Y2VwdF9lcnJvcjt9CisgICAgICBfX1B5eF9HT1RSRUYoX19weXhfdF80KTsKKyAgICAgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzMpOyBfX3B5eF90XzMgPSAwOworICAgICAgX19weXhfdF8zID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF90XzQsIF9fcHl4X25fc19yZXBsYWNlKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNzg7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgICAgICBfX1B5eF9ERUNSRUYoX19weXhfdF80KTsgX19weXhfdF80ID0gMDsKKyAgICAgIF9fcHl4X3RfNCA9IF9fUHl4X1B5T2JqZWN0X0NhbGwoX19weXhfdF8zLCBfX3B5eF90dXBsZV9fNSwgTlVMTCk7IGlmICh1bmxpa2VseSghX19weXhfdF80KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTc4OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDVfZXhjZXB0X2Vycm9yO30KKyAgICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzQpOworICAgICAgX19QeXhfREVDUkVGKF9fcHl4X3RfMyk7IF9fcHl4X3RfMyA9IDA7CisgICAgICBfX3B5eF92X2V4Y2VwdGlvbl9tZXNzYWdlID0gX19weXhfdF80OworICAgICAgX19weXhfdF80ID0gMDsKKworICAgICAgLyogImtlbmxtLnB5eCI6MTc5CisgKiAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZXhjZXB0aW9uOgorICogICAgICAgICAgICAgZXhjZXB0aW9uX21lc3NhZ2UgPSBzdHIoZXhjZXB0aW9uKS5yZXBsYWNlKCdcbicsICcgJykKKyAqICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ0Nhbm5vdCByZWFkIG1vZGVsIFwne31cJyAoe30pJy5mb3JtYXQocGF0aCwgZXhjZXB0aW9uX21lc3NhZ2UpKVwgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgICAgICAgICBmcm9tIGV4Y2VwdGlvbgorICogICAgICAgICBzZWxmLnZvY2FiID0gJnNlbGYubW9kZWwuQmFzZVZvY2FidWxhcnkoKQorICovCisgICAgICBfX3B5eF90XzMgPSBfX1B5eF9QeU9iamVjdF9HZXRBdHRyU3RyKF9fcHl4X2twX3NfQ2Fubm90X3JlYWRfbW9kZWwsIF9fcHl4X25fc19mb3JtYXQpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMykpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE3OTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0w1X2V4Y2VwdF9lcnJvcjt9CisgICAgICBfX1B5eF9HT1RSRUYoX19weXhfdF8zKTsKKyAgICAgIF9fcHl4X3RfMTIgPSBOVUxMOworICAgICAgX19weXhfdF8xMyA9IDA7CisgICAgICBpZiAoQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OICYmIGxpa2VseShQeU1ldGhvZF9DaGVjayhfX3B5eF90XzMpKSkgeworICAgICAgICBfX3B5eF90XzEyID0gUHlNZXRob2RfR0VUX1NFTEYoX19weXhfdF8zKTsKKyAgICAgICAgaWYgKGxpa2VseShfX3B5eF90XzEyKSkgeworICAgICAgICAgIFB5T2JqZWN0KiBmdW5jdGlvbiA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihfX3B5eF90XzMpOworICAgICAgICAgIF9fUHl4X0lOQ1JFRihfX3B5eF90XzEyKTsKKyAgICAgICAgICBfX1B5eF9JTkNSRUYoZnVuY3Rpb24pOworICAgICAgICAgIF9fUHl4X0RFQ1JFRl9TRVQoX19weXhfdF8zLCBmdW5jdGlvbik7CisgICAgICAgICAgX19weXhfdF8xMyA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIF9fcHl4X3RfMTQgPSBQeVR1cGxlX05ldygyK19fcHl4X3RfMTMpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMTQpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNzk7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMTQpOworICAgICAgaWYgKF9fcHl4X3RfMTIpIHsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzE0LCAwLCBfX3B5eF90XzEyKTsgX19QeXhfR0lWRVJFRihfX3B5eF90XzEyKTsgX19weXhfdF8xMiA9IE5VTEw7CisgICAgICB9CisgICAgICBfX1B5eF9JTkNSRUYoX19weXhfdl9wYXRoKTsKKyAgICAgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF8xNCwgMCtfX3B5eF90XzEzLCBfX3B5eF92X3BhdGgpOworICAgICAgX19QeXhfR0lWRVJFRihfX3B5eF92X3BhdGgpOworICAgICAgX19QeXhfSU5DUkVGKF9fcHl4X3ZfZXhjZXB0aW9uX21lc3NhZ2UpOworICAgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzE0LCAxK19fcHl4X3RfMTMsIF9fcHl4X3ZfZXhjZXB0aW9uX21lc3NhZ2UpOworICAgICAgX19QeXhfR0lWRVJFRihfX3B5eF92X2V4Y2VwdGlvbl9tZXNzYWdlKTsKKyAgICAgIF9fcHl4X3RfNCA9IF9fUHl4X1B5T2JqZWN0X0NhbGwoX19weXhfdF8zLCBfX3B5eF90XzE0LCBOVUxMKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzQpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNzk7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfNCk7CisgICAgICBfX1B5eF9ERUNSRUYoX19weXhfdF8xNCk7IF9fcHl4X3RfMTQgPSAwOworICAgICAgX19QeXhfREVDUkVGKF9fcHl4X3RfMyk7IF9fcHl4X3RfMyA9IDA7CisgICAgICBfX3B5eF90XzMgPSBQeVR1cGxlX05ldygxKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNzk7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMyk7CisgICAgICBQeVR1cGxlX1NFVF9JVEVNKF9fcHl4X3RfMywgMCwgX19weXhfdF80KTsKKyAgICAgIF9fUHl4X0dJVkVSRUYoX19weXhfdF80KTsKKyAgICAgIF9fcHl4X3RfNCA9IDA7CisgICAgICBfX3B5eF90XzQgPSBfX1B5eF9QeU9iamVjdF9DYWxsKF9fcHl4X2J1aWx0aW5fSU9FcnJvciwgX19weXhfdF8zLCBOVUxMKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzQpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNzk7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MNV9leGNlcHRfZXJyb3I7fQorICAgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfNCk7CisgICAgICBfX1B5eF9ERUNSRUYoX19weXhfdF8zKTsgX19weXhfdF8zID0gMDsKKworICAgICAgLyogImtlbmxtLnB5eCI6MTgwCisgKiAgICAgICAgICAgICBleGNlcHRpb25fbWVzc2FnZSA9IHN0cihleGNlcHRpb24pLnJlcGxhY2UoJ1xuJywgJyAnKQorICogICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignQ2Fubm90IHJlYWQgbW9kZWwgXCd7fVwnICh7fSknLmZvcm1hdChwYXRoLCBleGNlcHRpb25fbWVzc2FnZSkpXAorICogICAgICAgICAgICAgICAgICAgICBmcm9tIGV4Y2VwdGlvbiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIHNlbGYudm9jYWIgPSAmc2VsZi5tb2RlbC5CYXNlVm9jYWJ1bGFyeSgpCisgKiAKKyAqLworICAgICAgX19QeXhfUmFpc2UoX19weXhfdF80LCAwLCAwLCBfX3B5eF92X2V4Y2VwdGlvbik7CisgICAgICBfX1B5eF9ERUNSRUYoX19weXhfdF80KTsgX19weXhfdF80ID0gMDsKKyAgICAgIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE3OTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0w1X2V4Y2VwdF9lcnJvcjt9CisgICAgfQorICAgIGdvdG8gX19weXhfTDVfZXhjZXB0X2Vycm9yOworICAgIF9fcHl4X0w1X2V4Y2VwdF9lcnJvcjo7CisgICAgX19QeXhfWEdJVkVSRUYoX19weXhfdF82KTsKKyAgICBfX1B5eF9YR0lWRVJFRihfX3B5eF90XzcpOworICAgIF9fUHl4X1hHSVZFUkVGKF9fcHl4X3RfOCk7CisgICAgX19QeXhfRXhjZXB0aW9uUmVzZXQoX19weXhfdF82LCBfX3B5eF90XzcsIF9fcHl4X3RfOCk7CisgICAgZ290byBfX3B5eF9MMV9lcnJvcjsKKyAgICBfX3B5eF9MMTBfdHJ5X2VuZDo7CisgIH0KKworICAvKiAia2VubG0ucHl4IjoxODEKKyAqICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ0Nhbm5vdCByZWFkIG1vZGVsIFwne31cJyAoe30pJy5mb3JtYXQocGF0aCwgZXhjZXB0aW9uX21lc3NhZ2UpKVwKKyAqICAgICAgICAgICAgICAgICAgICAgZnJvbSBleGNlcHRpb24KKyAqICAgICAgICAgc2VsZi52b2NhYiA9ICZzZWxmLm1vZGVsLkJhc2VWb2NhYnVsYXJ5KCkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogCisgKiAgICAgZGVmIF9fZGVhbGxvY19fKHNlbGYpOgorICovCisgIF9fcHl4X3Zfc2VsZi0+dm9jYWIgPSAoJl9fcHl4X3Zfc2VsZi0+bW9kZWwtPkJhc2VWb2NhYnVsYXJ5KCkpOworCisgIC8qICJrZW5sbS5weXgiOjE2OAorICogICAgIGNkZWYgX2tlbmxtLmNvbnN0X1ZvY2FidWxhcnkqIHZvY2FiCisgKiAKKyAqICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgIiIiCisgKiAgICAgICAgIExvYWQgdGhlIGxhbmd1YWdlIG1vZGVsLgorICovCisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fcHl4X3IgPSAwOworICBnb3RvIF9fcHl4X0wwOworICBfX3B5eF9MMV9lcnJvcjo7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8xKTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzIpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMyk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF80KTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzUpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMTIpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMTQpOworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLk1vZGVsLl9faW5pdF9fIiwgX19weXhfY2xpbmVubywgX19weXhfbGluZW5vLCBfX3B5eF9maWxlbmFtZSk7CisgIF9fcHl4X3IgPSAtMTsKKyAgX19weXhfTDA6OworICBfX1B5eF9YREVDUkVGKF9fcHl4X3ZfZXhjZXB0aW9uKTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF92X2V4Y2VwdGlvbl9tZXNzYWdlKTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCisvKiAia2VubG0ucHl4IjoxODMKKyAqICAgICAgICAgc2VsZi52b2NhYiA9ICZzZWxmLm1vZGVsLkJhc2VWb2NhYnVsYXJ5KCkKKyAqIAorICogICAgIGRlZiBfX2RlYWxsb2NfXyhzZWxmKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBkZWwgc2VsZi5tb2RlbAorICogCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyB2b2lkIF9fcHl4X3B3XzVrZW5sbV81TW9kZWxfM19fZGVhbGxvY19fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpOyAvKnByb3RvKi8KK3N0YXRpYyB2b2lkIF9fcHl4X3B3XzVrZW5sbV81TW9kZWxfM19fZGVhbGxvY19fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpIHsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fZGVhbGxvY19fICh3cmFwcGVyKSIsIDApOworICBfX3B5eF9wZl81a2VubG1fNU1vZGVsXzJfX2RlYWxsb2NfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICopX19weXhfdl9zZWxmKSk7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworfQorCitzdGF0aWMgdm9pZCBfX3B5eF9wZl81a2VubG1fNU1vZGVsXzJfX2RlYWxsb2NfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqX19weXhfdl9zZWxmKSB7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX2RlYWxsb2NfXyIsIDApOworCisgIC8qICJrZW5sbS5weXgiOjE4NAorICogCisgKiAgICAgZGVmIF9fZGVhbGxvY19fKHNlbGYpOgorICogICAgICAgICBkZWwgc2VsZi5tb2RlbCAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAKKyAqICAgICBwcm9wZXJ0eSBvcmRlcjoKKyAqLworICBkZWxldGUgX19weXhfdl9zZWxmLT5tb2RlbDsKKworICAvKiAia2VubG0ucHl4IjoxODMKKyAqICAgICAgICAgc2VsZi52b2NhYiA9ICZzZWxmLm1vZGVsLkJhc2VWb2NhYnVsYXJ5KCkKKyAqIAorICogICAgIGRlZiBfX2RlYWxsb2NfXyhzZWxmKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBkZWwgc2VsZi5tb2RlbAorICogCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7Cit9CisKKy8qICJrZW5sbS5weXgiOjE4NworICogCisgKiAgICAgcHJvcGVydHkgb3JkZXI6CisgKiAgICAgICAgIGRlZiBfX2dldF9fKHNlbGYpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2RlbC5PcmRlcigpCisgKiAKKyAqLworCisvKiBQeXRob24gd3JhcHBlciAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fNU1vZGVsXzVvcmRlcl8xX19nZXRfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmKTsgLypwcm90byovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV81TW9kZWxfNW9yZGVyXzFfX2dldF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSAwOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19nZXRfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV81TW9kZWxfNW9yZGVyX19fZ2V0X18oKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqKV9fcHl4X3Zfc2VsZikpOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzVNb2RlbF81b3JkZXJfX19nZXRfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqX19weXhfdl9zZWxmKSB7CisgIFB5T2JqZWN0ICpfX3B5eF9yID0gTlVMTDsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgUHlPYmplY3QgKl9fcHl4X3RfMSA9IE5VTEw7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fZ2V0X18iLCAwKTsKKworICAvKiAia2VubG0ucHl4IjoxODgKKyAqICAgICBwcm9wZXJ0eSBvcmRlcjoKKyAqICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZik6CisgKiAgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2RlbC5PcmRlcigpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqIAorICogICAgIGRlZiBCZWdpblNlbnRlbmNlV3JpdGUoc2VsZiwgU3RhdGUgc3RhdGUpOgorICovCisgIF9fUHl4X1hERUNSRUYoX19weXhfcik7CisgIF9fcHl4X3RfMSA9IF9fUHl4X1B5SW50X0Zyb21fdW5zaWduZWRfaW50KF9fcHl4X3Zfc2VsZi0+bW9kZWwtPk9yZGVyKCkpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE4ODsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMSk7CisgIF9fcHl4X3IgPSBfX3B5eF90XzE7CisgIF9fcHl4X3RfMSA9IDA7CisgIGdvdG8gX19weXhfTDA7CisKKyAgLyogImtlbmxtLnB5eCI6MTg3CisgKiAKKyAqICAgICBwcm9wZXJ0eSBvcmRlcjoKKyAqICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgICAgIHJldHVybiBzZWxmLm1vZGVsLk9yZGVyKCkKKyAqIAorICovCisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzEpOworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLk1vZGVsLm9yZGVyLl9fZ2V0X18iLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19weXhfciA9IE5VTEw7CisgIF9fcHl4X0wwOjsKKyAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworLyogImtlbmxtLnB5eCI6MTkwCisgKiAgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2RlbC5PcmRlcigpCisgKiAKKyAqICAgICBkZWYgQmVnaW5TZW50ZW5jZVdyaXRlKHNlbGYsIFN0YXRlIHN0YXRlKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAiIiJDaGFuZ2UgdGhlIGdpdmVuIHN0YXRlIHRvIGEgQk9TIHN0YXRlLiIiIgorICogICAgICAgICBzZWxmLm1vZGVsLkJlZ2luU2VudGVuY2VXcml0ZSgmc3RhdGUuX2Nfc3RhdGUpCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcHdfNWtlbmxtXzVNb2RlbF81QmVnaW5TZW50ZW5jZVdyaXRlKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF92X3N0YXRlKTsgLypwcm90byovCitzdGF0aWMgY2hhciBfX3B5eF9kb2NfNWtlbmxtXzVNb2RlbF80QmVnaW5TZW50ZW5jZVdyaXRlW10gPSAiQ2hhbmdlIHRoZSBnaXZlbiBzdGF0ZSB0byBhIEJPUyBzdGF0ZS4iOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fNU1vZGVsXzVCZWdpblNlbnRlbmNlV3JpdGUoUHlPYmplY3QgKl9fcHl4X3Zfc2VsZiwgUHlPYmplY3QgKl9fcHl4X3Zfc3RhdGUpIHsKKyAgQ1lUSE9OX1VOVVNFRCBpbnQgX19weXhfbGluZW5vID0gMDsKKyAgQ1lUSE9OX1VOVVNFRCBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIENZVEhPTl9VTlVTRUQgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBQeU9iamVjdCAqX19weXhfciA9IDA7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJCZWdpblNlbnRlbmNlV3JpdGUgKHdyYXBwZXIpIiwgMCk7CisgIGlmICh1bmxpa2VseSghX19QeXhfQXJnVHlwZVRlc3QoKChQeU9iamVjdCAqKV9fcHl4X3Zfc3RhdGUpLCBfX3B5eF9wdHlwZV81a2VubG1fU3RhdGUsIDEsICJzdGF0ZSIsIDApKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTkwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF9yID0gX19weXhfcGZfNWtlbmxtXzVNb2RlbF80QmVnaW5TZW50ZW5jZVdyaXRlKCgoc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwgKilfX3B5eF92X3NlbGYpLCAoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX1N0YXRlICopX19weXhfdl9zdGF0ZSkpOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBnb3RvIF9fcHl4X0wwOworICBfX3B5eF9MMV9lcnJvcjo7CisgIF9fcHl4X3IgPSBOVUxMOworICBfX3B5eF9MMDo7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fNU1vZGVsXzRCZWdpblNlbnRlbmNlV3JpdGUoc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwgKl9fcHl4X3Zfc2VsZiwgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3Zfc3RhdGUpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSBOVUxMOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiQmVnaW5TZW50ZW5jZVdyaXRlIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6MTkyCisgKiAgICAgZGVmIEJlZ2luU2VudGVuY2VXcml0ZShzZWxmLCBTdGF0ZSBzdGF0ZSk6CisgKiAgICAgICAgICIiIkNoYW5nZSB0aGUgZ2l2ZW4gc3RhdGUgdG8gYSBCT1Mgc3RhdGUuIiIiCisgKiAgICAgICAgIHNlbGYubW9kZWwuQmVnaW5TZW50ZW5jZVdyaXRlKCZzdGF0ZS5fY19zdGF0ZSkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogCisgKiAgICAgZGVmIE51bGxDb250ZXh0V3JpdGUoc2VsZiwgU3RhdGUgc3RhdGUpOgorICovCisgIF9fcHl4X3Zfc2VsZi0+bW9kZWwtPkJlZ2luU2VudGVuY2VXcml0ZSgoJl9fcHl4X3Zfc3RhdGUtPl9jX3N0YXRlKSk7CisKKyAgLyogImtlbmxtLnB5eCI6MTkwCisgKiAgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2RlbC5PcmRlcigpCisgKiAKKyAqICAgICBkZWYgQmVnaW5TZW50ZW5jZVdyaXRlKHNlbGYsIFN0YXRlIHN0YXRlKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAiIiJDaGFuZ2UgdGhlIGdpdmVuIHN0YXRlIHRvIGEgQk9TIHN0YXRlLiIiIgorICogICAgICAgICBzZWxmLm1vZGVsLkJlZ2luU2VudGVuY2VXcml0ZSgmc3RhdGUuX2Nfc3RhdGUpCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfciA9IFB5X05vbmU7IF9fUHl4X0lOQ1JFRihQeV9Ob25lKTsKKyAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworLyogImtlbmxtLnB5eCI6MTk0CisgKiAgICAgICAgIHNlbGYubW9kZWwuQmVnaW5TZW50ZW5jZVdyaXRlKCZzdGF0ZS5fY19zdGF0ZSkKKyAqIAorICogICAgIGRlZiBOdWxsQ29udGV4dFdyaXRlKHNlbGYsIFN0YXRlIHN0YXRlKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAiIiJDaGFuZ2UgdGhlIGdpdmVuIHN0YXRlIHRvIGEgTlVMTCBzdGF0ZS4iIiIKKyAqICAgICAgICAgc2VsZi5tb2RlbC5OdWxsQ29udGV4dFdyaXRlKCZzdGF0ZS5fY19zdGF0ZSkKKyAqLworCisvKiBQeXRob24gd3JhcHBlciAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fNU1vZGVsXzdOdWxsQ29udGV4dFdyaXRlKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF92X3N0YXRlKTsgLypwcm90byovCitzdGF0aWMgY2hhciBfX3B5eF9kb2NfNWtlbmxtXzVNb2RlbF82TnVsbENvbnRleHRXcml0ZVtdID0gIkNoYW5nZSB0aGUgZ2l2ZW4gc3RhdGUgdG8gYSBOVUxMIHN0YXRlLiI7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV81TW9kZWxfN051bGxDb250ZXh0V3JpdGUoUHlPYmplY3QgKl9fcHl4X3Zfc2VsZiwgUHlPYmplY3QgKl9fcHl4X3Zfc3RhdGUpIHsKKyAgQ1lUSE9OX1VOVVNFRCBpbnQgX19weXhfbGluZW5vID0gMDsKKyAgQ1lUSE9OX1VOVVNFRCBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIENZVEhPTl9VTlVTRUQgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBQeU9iamVjdCAqX19weXhfciA9IDA7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJOdWxsQ29udGV4dFdyaXRlICh3cmFwcGVyKSIsIDApOworICBpZiAodW5saWtlbHkoIV9fUHl4X0FyZ1R5cGVUZXN0KCgoUHlPYmplY3QgKilfX3B5eF92X3N0YXRlKSwgX19weXhfcHR5cGVfNWtlbmxtX1N0YXRlLCAxLCAic3RhdGUiLCAwKSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE5NDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV81TW9kZWxfNk51bGxDb250ZXh0V3JpdGUoKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqKV9fcHl4X3Zfc2VsZiksICgoc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKilfX3B5eF92X3N0YXRlKSk7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIGdvdG8gX19weXhfTDA7CisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19weXhfciA9IE5VTEw7CisgIF9fcHl4X0wwOjsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3BmXzVrZW5sbV81TW9kZWxfNk51bGxDb250ZXh0V3JpdGUoc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwgKl9fcHl4X3Zfc2VsZiwgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3Zfc3RhdGUpIHsKKyAgUHlPYmplY3QgKl9fcHl4X3IgPSBOVUxMOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiTnVsbENvbnRleHRXcml0ZSIsIDApOworCisgIC8qICJrZW5sbS5weXgiOjE5NgorICogICAgIGRlZiBOdWxsQ29udGV4dFdyaXRlKHNlbGYsIFN0YXRlIHN0YXRlKToKKyAqICAgICAgICAgIiIiQ2hhbmdlIHRoZSBnaXZlbiBzdGF0ZSB0byBhIE5VTEwgc3RhdGUuIiIiCisgKiAgICAgICAgIHNlbGYubW9kZWwuTnVsbENvbnRleHRXcml0ZSgmc3RhdGUuX2Nfc3RhdGUpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqIAorICogICAgIGRlZiBCYXNlU2NvcmUoc2VsZiwgU3RhdGUgaW5fc3RhdGUsIHN0ciB3b3JkLCBTdGF0ZSBvdXRfc3RhdGUpOgorICovCisgIF9fcHl4X3Zfc2VsZi0+bW9kZWwtPk51bGxDb250ZXh0V3JpdGUoKCZfX3B5eF92X3N0YXRlLT5fY19zdGF0ZSkpOworCisgIC8qICJrZW5sbS5weXgiOjE5NAorICogICAgICAgICBzZWxmLm1vZGVsLkJlZ2luU2VudGVuY2VXcml0ZSgmc3RhdGUuX2Nfc3RhdGUpCisgKiAKKyAqICAgICBkZWYgTnVsbENvbnRleHRXcml0ZShzZWxmLCBTdGF0ZSBzdGF0ZSk6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgIiIiQ2hhbmdlIHRoZSBnaXZlbiBzdGF0ZSB0byBhIE5VTEwgc3RhdGUuIiIiCisgKiAgICAgICAgIHNlbGYubW9kZWwuTnVsbENvbnRleHRXcml0ZSgmc3RhdGUuX2Nfc3RhdGUpCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfciA9IFB5X05vbmU7IF9fUHl4X0lOQ1JFRihQeV9Ob25lKTsKKyAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworLyogImtlbmxtLnB5eCI6MTk4CisgKiAgICAgICAgIHNlbGYubW9kZWwuTnVsbENvbnRleHRXcml0ZSgmc3RhdGUuX2Nfc3RhdGUpCisgKiAKKyAqICAgICBkZWYgQmFzZVNjb3JlKHNlbGYsIFN0YXRlIGluX3N0YXRlLCBzdHIgd29yZCwgU3RhdGUgb3V0X3N0YXRlKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAiIiIKKyAqICAgICAgICAgUmV0dXJuIHAod29yZHxpbl9zdGF0ZSkgYW5kIHVwZGF0ZSB0aGUgb3V0cHV0IHN0YXRlLgorICovCisKKy8qIFB5dGhvbiB3cmFwcGVyICovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV81TW9kZWxfOUJhc2VTY29yZShQeU9iamVjdCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfYXJncywgUHlPYmplY3QgKl9fcHl4X2t3ZHMpOyAvKnByb3RvKi8KK3N0YXRpYyBjaGFyIF9fcHl4X2RvY181a2VubG1fNU1vZGVsXzhCYXNlU2NvcmVbXSA9ICJcbiAgICAgICAgUmV0dXJuIHAod29yZHxpbl9zdGF0ZSkgYW5kIHVwZGF0ZSB0aGUgb3V0cHV0IHN0YXRlLlxuICAgICAgICBXcmFwcGVyIGFyb3VuZCBtb2RlbC5CYXNlU2NvcmUoaW5fc3RhdGUsIEluZGV4KHdvcmQpLCBvdXRfc3RhdGUpXG5cbiAgICAgICAgOnBhcmFtIHdvcmQ6IHRoZSBzdWZmaXhcbiAgICAgICAgOnBhcmFtIHN0YXRlOiB0aGUgY29udGV4dCAoZGVmYXVsdHMgdG8gTnVsbENvbnRleHQpXG4gICAgICAgIDpyZXR1cm5zOiBwKHdvcmR8c3RhdGUpXG4gICAgICAgICI7CitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV81TW9kZWxfOUJhc2VTY29yZShQeU9iamVjdCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfYXJncywgUHlPYmplY3QgKl9fcHl4X2t3ZHMpIHsKKyAgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3ZfaW5fc3RhdGUgPSAwOworICBQeU9iamVjdCAqX19weXhfdl93b3JkID0gMDsKKyAgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3Zfb3V0X3N0YXRlID0gMDsKKyAgaW50IF9fcHl4X2xpbmVubyA9IDA7CisgIGNvbnN0IGNoYXIgKl9fcHl4X2ZpbGVuYW1lID0gTlVMTDsKKyAgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBQeU9iamVjdCAqX19weXhfciA9IDA7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJCYXNlU2NvcmUgKHdyYXBwZXIpIiwgMCk7CisgIHsKKyAgICBzdGF0aWMgUHlPYmplY3QgKipfX3B5eF9weWFyZ25hbWVzW10gPSB7Jl9fcHl4X25fc19pbl9zdGF0ZSwmX19weXhfbl9zX3dvcmQsJl9fcHl4X25fc19vdXRfc3RhdGUsMH07CisgICAgUHlPYmplY3QqIHZhbHVlc1szXSA9IHswLDAsMH07CisgICAgaWYgKHVubGlrZWx5KF9fcHl4X2t3ZHMpKSB7CisgICAgICBQeV9zc2l6ZV90IGt3X2FyZ3M7CisgICAgICBjb25zdCBQeV9zc2l6ZV90IHBvc19hcmdzID0gUHlUdXBsZV9HRVRfU0laRShfX3B5eF9hcmdzKTsKKyAgICAgIHN3aXRjaCAocG9zX2FyZ3MpIHsKKyAgICAgICAgY2FzZSAgMzogdmFsdWVzWzJdID0gUHlUdXBsZV9HRVRfSVRFTShfX3B5eF9hcmdzLCAyKTsKKyAgICAgICAgY2FzZSAgMjogdmFsdWVzWzFdID0gUHlUdXBsZV9HRVRfSVRFTShfX3B5eF9hcmdzLCAxKTsKKyAgICAgICAgY2FzZSAgMTogdmFsdWVzWzBdID0gUHlUdXBsZV9HRVRfSVRFTShfX3B5eF9hcmdzLCAwKTsKKyAgICAgICAgY2FzZSAgMDogYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGdvdG8gX19weXhfTDVfYXJndHVwbGVfZXJyb3I7CisgICAgICB9CisgICAgICBrd19hcmdzID0gUHlEaWN0X1NpemUoX19weXhfa3dkcyk7CisgICAgICBzd2l0Y2ggKHBvc19hcmdzKSB7CisgICAgICAgIGNhc2UgIDA6CisgICAgICAgIGlmIChsaWtlbHkoKHZhbHVlc1swXSA9IFB5RGljdF9HZXRJdGVtKF9fcHl4X2t3ZHMsIF9fcHl4X25fc19pbl9zdGF0ZSkpICE9IDApKSBrd19hcmdzLS07CisgICAgICAgIGVsc2UgZ290byBfX3B5eF9MNV9hcmd0dXBsZV9lcnJvcjsKKyAgICAgICAgY2FzZSAgMToKKyAgICAgICAgaWYgKGxpa2VseSgodmFsdWVzWzFdID0gUHlEaWN0X0dldEl0ZW0oX19weXhfa3dkcywgX19weXhfbl9zX3dvcmQpKSAhPSAwKSkga3dfYXJncy0tOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBfX1B5eF9SYWlzZUFyZ3R1cGxlSW52YWxpZCgiQmFzZVNjb3JlIiwgMSwgMywgMywgMSk7IHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE5ODsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgICAgICAgfQorICAgICAgICBjYXNlICAyOgorICAgICAgICBpZiAobGlrZWx5KCh2YWx1ZXNbMl0gPSBQeURpY3RfR2V0SXRlbShfX3B5eF9rd2RzLCBfX3B5eF9uX3Nfb3V0X3N0YXRlKSkgIT0gMCkpIGt3X2FyZ3MtLTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgX19QeXhfUmFpc2VBcmd0dXBsZUludmFsaWQoIkJhc2VTY29yZSIsIDEsIDMsIDMsIDIpOyB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOTg7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MM19lcnJvcjt9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh1bmxpa2VseShrd19hcmdzID4gMCkpIHsKKyAgICAgICAgaWYgKHVubGlrZWx5KF9fUHl4X1BhcnNlT3B0aW9uYWxLZXl3b3JkcyhfX3B5eF9rd2RzLCBfX3B5eF9weWFyZ25hbWVzLCAwLCB2YWx1ZXMsIHBvc19hcmdzLCAiQmFzZVNjb3JlIikgPCAwKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTk4OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDNfZXJyb3I7fQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoUHlUdXBsZV9HRVRfU0laRShfX3B5eF9hcmdzKSAhPSAzKSB7CisgICAgICBnb3RvIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOworICAgIH0gZWxzZSB7CisgICAgICB2YWx1ZXNbMF0gPSBQeVR1cGxlX0dFVF9JVEVNKF9fcHl4X2FyZ3MsIDApOworICAgICAgdmFsdWVzWzFdID0gUHlUdXBsZV9HRVRfSVRFTShfX3B5eF9hcmdzLCAxKTsKKyAgICAgIHZhbHVlc1syXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMik7CisgICAgfQorICAgIF9fcHl4X3ZfaW5fc3RhdGUgPSAoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX1N0YXRlICopdmFsdWVzWzBdKTsKKyAgICBfX3B5eF92X3dvcmQgPSAoKFB5T2JqZWN0Kil2YWx1ZXNbMV0pOworICAgIF9fcHl4X3Zfb3V0X3N0YXRlID0gKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9TdGF0ZSAqKXZhbHVlc1syXSk7CisgIH0KKyAgZ290byBfX3B5eF9MNF9hcmd1bWVudF91bnBhY2tpbmdfZG9uZTsKKyAgX19weXhfTDVfYXJndHVwbGVfZXJyb3I6OworICBfX1B5eF9SYWlzZUFyZ3R1cGxlSW52YWxpZCgiQmFzZVNjb3JlIiwgMSwgMywgMywgUHlUdXBsZV9HRVRfU0laRShfX3B5eF9hcmdzKSk7IHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE5ODsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgX19weXhfTDNfZXJyb3I6OworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLk1vZGVsLkJhc2VTY29yZSIsIF9fcHl4X2NsaW5lbm8sIF9fcHl4X2xpbmVubywgX19weXhfZmlsZW5hbWUpOworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIE5VTEw7CisgIF9fcHl4X0w0X2FyZ3VtZW50X3VucGFja2luZ19kb25lOjsKKyAgaWYgKHVubGlrZWx5KCFfX1B5eF9BcmdUeXBlVGVzdCgoKFB5T2JqZWN0ICopX19weXhfdl9pbl9zdGF0ZSksIF9fcHl4X3B0eXBlXzVrZW5sbV9TdGF0ZSwgMSwgImluX3N0YXRlIiwgMCkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOTg7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIGlmICh1bmxpa2VseSghX19QeXhfQXJnVHlwZVRlc3QoKChQeU9iamVjdCAqKV9fcHl4X3Zfd29yZCksICgmUHlTdHJpbmdfVHlwZSksIDEsICJ3b3JkIiwgMSkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOTg7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIGlmICh1bmxpa2VseSghX19QeXhfQXJnVHlwZVRlc3QoKChQeU9iamVjdCAqKV9fcHl4X3Zfb3V0X3N0YXRlKSwgX19weXhfcHR5cGVfNWtlbmxtX1N0YXRlLCAxLCAib3V0X3N0YXRlIiwgMCkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOTg7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fcHl4X3IgPSBfX3B5eF9wZl81a2VubG1fNU1vZGVsXzhCYXNlU2NvcmUoKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqKV9fcHl4X3Zfc2VsZiksIF9fcHl4X3ZfaW5fc3RhdGUsIF9fcHl4X3Zfd29yZCwgX19weXhfdl9vdXRfc3RhdGUpOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBnb3RvIF9fcHl4X0wwOworICBfX3B5eF9MMV9lcnJvcjo7CisgIF9fcHl4X3IgPSBOVUxMOworICBfX3B5eF9MMDo7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fNU1vZGVsXzhCYXNlU2NvcmUoc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwgKl9fcHl4X3Zfc2VsZiwgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3ZfaW5fc3RhdGUsIFB5T2JqZWN0ICpfX3B5eF92X3dvcmQsIHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX1N0YXRlICpfX3B5eF92X291dF9zdGF0ZSkgeworICBmbG9hdCBfX3B5eF92X3RvdGFsOworICBQeU9iamVjdCAqX19weXhfciA9IE5VTEw7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIFB5T2JqZWN0ICpfX3B5eF90XzEgPSBOVUxMOworICBjaGFyICpfX3B5eF90XzI7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIkJhc2VTY29yZSIsIDApOworCisgIC8qICJrZW5sbS5weXgiOjIwNworICogICAgICAgICA6cmV0dXJuczogcCh3b3JkfHN0YXRlKQorICogICAgICAgICAiIiIKKyAqICAgICAgICAgY2RlZiBmbG9hdCB0b3RhbCA9IHNlbGYubW9kZWwuQmFzZVNjb3JlKCZpbl9zdGF0ZS5fY19zdGF0ZSwgc2VsZi52b2NhYi5JbmRleChhc19zdHIod29yZCkpLCAmb3V0X3N0YXRlLl9jX3N0YXRlKSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIHJldHVybiB0b3RhbAorICogCisgKi8KKyAgX19weXhfdF8xID0gX19weXhfZl81a2VubG1fYXNfc3RyKF9fcHl4X3Zfd29yZCk7IGlmICh1bmxpa2VseSghX19weXhfdF8xKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjA3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgX19weXhfdF8yID0gX19QeXhfUHlPYmplY3RfQXNTdHJpbmcoX19weXhfdF8xKTsgaWYgKHVubGlrZWx5KCghX19weXhfdF8yKSAmJiBQeUVycl9PY2N1cnJlZCgpKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjA3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF92X3RvdGFsID0gX19weXhfdl9zZWxmLT5tb2RlbC0+QmFzZVNjb3JlKCgmX19weXhfdl9pbl9zdGF0ZS0+X2Nfc3RhdGUpLCBfX3B5eF92X3NlbGYtPnZvY2FiLT5JbmRleChfX3B5eF90XzIpLCAoJl9fcHl4X3Zfb3V0X3N0YXRlLT5fY19zdGF0ZSkpOworICBfX1B5eF9ERUNSRUYoX19weXhfdF8xKTsgX19weXhfdF8xID0gMDsKKworICAvKiAia2VubG0ucHl4IjoyMDgKKyAqICAgICAgICAgIiIiCisgKiAgICAgICAgIGNkZWYgZmxvYXQgdG90YWwgPSBzZWxmLm1vZGVsLkJhc2VTY29yZSgmaW5fc3RhdGUuX2Nfc3RhdGUsIHNlbGYudm9jYWIuSW5kZXgoYXNfc3RyKHdvcmQpKSwgJm91dF9zdGF0ZS5fY19zdGF0ZSkKKyAqICAgICAgICAgcmV0dXJuIHRvdGFsICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqIAorICogICAgIGRlZiBCYXNlRnVsbFNjb3JlKHNlbGYsIFN0YXRlIGluX3N0YXRlLCBzdHIgd29yZCwgU3RhdGUgb3V0X3N0YXRlKToKKyAqLworICBfX1B5eF9YREVDUkVGKF9fcHl4X3IpOworICBfX3B5eF90XzEgPSBQeUZsb2F0X0Zyb21Eb3VibGUoX19weXhfdl90b3RhbCk7IGlmICh1bmxpa2VseSghX19weXhfdF8xKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjA4OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgX19weXhfciA9IF9fcHl4X3RfMTsKKyAgX19weXhfdF8xID0gMDsKKyAgZ290byBfX3B5eF9MMDsKKworICAvKiAia2VubG0ucHl4IjoxOTgKKyAqICAgICAgICAgc2VsZi5tb2RlbC5OdWxsQ29udGV4dFdyaXRlKCZzdGF0ZS5fY19zdGF0ZSkKKyAqIAorICogICAgIGRlZiBCYXNlU2NvcmUoc2VsZiwgU3RhdGUgaW5fc3RhdGUsIHN0ciB3b3JkLCBTdGF0ZSBvdXRfc3RhdGUpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgICIiIgorICogICAgICAgICBSZXR1cm4gcCh3b3JkfGluX3N0YXRlKSBhbmQgdXBkYXRlIHRoZSBvdXRwdXQgc3RhdGUuCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfTDFfZXJyb3I6OworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMSk7CisgIF9fUHl4X0FkZFRyYWNlYmFjaygia2VubG0uTW9kZWwuQmFzZVNjb3JlIiwgX19weXhfY2xpbmVubywgX19weXhfbGluZW5vLCBfX3B5eF9maWxlbmFtZSk7CisgIF9fcHl4X3IgPSBOVUxMOworICBfX3B5eF9MMDo7CisgIF9fUHl4X1hHSVZFUkVGKF9fcHl4X3IpOworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKKy8qICJrZW5sbS5weXgiOjIxMAorICogICAgICAgICByZXR1cm4gdG90YWwKKyAqIAorICogICAgIGRlZiBCYXNlRnVsbFNjb3JlKHNlbGYsIFN0YXRlIGluX3N0YXRlLCBzdHIgd29yZCwgU3RhdGUgb3V0X3N0YXRlKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAiIiIKKyAqICAgICAgICAgV3JhcHBlciBhcm91bmQgbW9kZWwuQmFzZVNjb3JlKGluX3N0YXRlLCBJbmRleCh3b3JkKSwgb3V0X3N0YXRlKQorICovCisKKy8qIFB5dGhvbiB3cmFwcGVyICovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV81TW9kZWxfMTFCYXNlRnVsbFNjb3JlKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF9hcmdzLCBQeU9iamVjdCAqX19weXhfa3dkcyk7IC8qcHJvdG8qLworc3RhdGljIGNoYXIgX19weXhfZG9jXzVrZW5sbV81TW9kZWxfMTBCYXNlRnVsbFNjb3JlW10gPSAiXG4gICAgICAgIFdyYXBwZXIgYXJvdW5kIG1vZGVsLkJhc2VTY29yZShpbl9zdGF0ZSwgSW5kZXgod29yZCksIG91dF9zdGF0ZSlcblxuICAgICAgICA6cGFyYW0gd29yZDogdGhlIHN1ZmZpeFxuICAgICAgICA6cGFyYW0gc3RhdGU6IHRoZSBjb250ZXh0IChkZWZhdWx0cyB0byBOdWxsQ29udGV4dClcbiAgICAgICAgOnJldHVybnM6IEZ1bGxTY29yZVJldHVybih3b3JkfHN0YXRlKVxuICAgICAgICAiOworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fNU1vZGVsXzExQmFzZUZ1bGxTY29yZShQeU9iamVjdCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfYXJncywgUHlPYmplY3QgKl9fcHl4X2t3ZHMpIHsKKyAgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3ZfaW5fc3RhdGUgPSAwOworICBQeU9iamVjdCAqX19weXhfdl93b3JkID0gMDsKKyAgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKl9fcHl4X3Zfb3V0X3N0YXRlID0gMDsKKyAgaW50IF9fcHl4X2xpbmVubyA9IDA7CisgIGNvbnN0IGNoYXIgKl9fcHl4X2ZpbGVuYW1lID0gTlVMTDsKKyAgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBQeU9iamVjdCAqX19weXhfciA9IDA7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJCYXNlRnVsbFNjb3JlICh3cmFwcGVyKSIsIDApOworICB7CisgICAgc3RhdGljIFB5T2JqZWN0ICoqX19weXhfcHlhcmduYW1lc1tdID0geyZfX3B5eF9uX3NfaW5fc3RhdGUsJl9fcHl4X25fc193b3JkLCZfX3B5eF9uX3Nfb3V0X3N0YXRlLDB9OworICAgIFB5T2JqZWN0KiB2YWx1ZXNbM10gPSB7MCwwLDB9OworICAgIGlmICh1bmxpa2VseShfX3B5eF9rd2RzKSkgeworICAgICAgUHlfc3NpemVfdCBrd19hcmdzOworICAgICAgY29uc3QgUHlfc3NpemVfdCBwb3NfYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUoX19weXhfYXJncyk7CisgICAgICBzd2l0Y2ggKHBvc19hcmdzKSB7CisgICAgICAgIGNhc2UgIDM6IHZhbHVlc1syXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMik7CisgICAgICAgIGNhc2UgIDI6IHZhbHVlc1sxXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMSk7CisgICAgICAgIGNhc2UgIDE6IHZhbHVlc1swXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMCk7CisgICAgICAgIGNhc2UgIDA6IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBnb3RvIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOworICAgICAgfQorICAgICAga3dfYXJncyA9IFB5RGljdF9TaXplKF9fcHl4X2t3ZHMpOworICAgICAgc3dpdGNoIChwb3NfYXJncykgeworICAgICAgICBjYXNlICAwOgorICAgICAgICBpZiAobGlrZWx5KCh2YWx1ZXNbMF0gPSBQeURpY3RfR2V0SXRlbShfX3B5eF9rd2RzLCBfX3B5eF9uX3NfaW5fc3RhdGUpKSAhPSAwKSkga3dfYXJncy0tOworICAgICAgICBlbHNlIGdvdG8gX19weXhfTDVfYXJndHVwbGVfZXJyb3I7CisgICAgICAgIGNhc2UgIDE6CisgICAgICAgIGlmIChsaWtlbHkoKHZhbHVlc1sxXSA9IFB5RGljdF9HZXRJdGVtKF9fcHl4X2t3ZHMsIF9fcHl4X25fc193b3JkKSkgIT0gMCkpIGt3X2FyZ3MtLTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgX19QeXhfUmFpc2VBcmd0dXBsZUludmFsaWQoIkJhc2VGdWxsU2NvcmUiLCAxLCAzLCAzLCAxKTsge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjEwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDNfZXJyb3I7fQorICAgICAgICB9CisgICAgICAgIGNhc2UgIDI6CisgICAgICAgIGlmIChsaWtlbHkoKHZhbHVlc1syXSA9IFB5RGljdF9HZXRJdGVtKF9fcHl4X2t3ZHMsIF9fcHl4X25fc19vdXRfc3RhdGUpKSAhPSAwKSkga3dfYXJncy0tOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBfX1B5eF9SYWlzZUFyZ3R1cGxlSW52YWxpZCgiQmFzZUZ1bGxTY29yZSIsIDEsIDMsIDMsIDIpOyB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyMTA7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MM19lcnJvcjt9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh1bmxpa2VseShrd19hcmdzID4gMCkpIHsKKyAgICAgICAgaWYgKHVubGlrZWx5KF9fUHl4X1BhcnNlT3B0aW9uYWxLZXl3b3JkcyhfX3B5eF9rd2RzLCBfX3B5eF9weWFyZ25hbWVzLCAwLCB2YWx1ZXMsIHBvc19hcmdzLCAiQmFzZUZ1bGxTY29yZSIpIDwgMCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDIxMDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wzX2Vycm9yO30KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFB5VHVwbGVfR0VUX1NJWkUoX19weXhfYXJncykgIT0gMykgeworICAgICAgZ290byBfX3B5eF9MNV9hcmd0dXBsZV9lcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgdmFsdWVzWzBdID0gUHlUdXBsZV9HRVRfSVRFTShfX3B5eF9hcmdzLCAwKTsKKyAgICAgIHZhbHVlc1sxXSA9IFB5VHVwbGVfR0VUX0lURU0oX19weXhfYXJncywgMSk7CisgICAgICB2YWx1ZXNbMl0gPSBQeVR1cGxlX0dFVF9JVEVNKF9fcHl4X2FyZ3MsIDIpOworICAgIH0KKyAgICBfX3B5eF92X2luX3N0YXRlID0gKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9TdGF0ZSAqKXZhbHVlc1swXSk7CisgICAgX19weXhfdl93b3JkID0gKChQeU9iamVjdCopdmFsdWVzWzFdKTsKKyAgICBfX3B5eF92X291dF9zdGF0ZSA9ICgoc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKil2YWx1ZXNbMl0pOworICB9CisgIGdvdG8gX19weXhfTDRfYXJndW1lbnRfdW5wYWNraW5nX2RvbmU7CisgIF9fcHl4X0w1X2FyZ3R1cGxlX2Vycm9yOjsKKyAgX19QeXhfUmFpc2VBcmd0dXBsZUludmFsaWQoIkJhc2VGdWxsU2NvcmUiLCAxLCAzLCAzLCBQeVR1cGxlX0dFVF9TSVpFKF9fcHl4X2FyZ3MpKTsge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjEwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDNfZXJyb3I7fQorICBfX3B5eF9MM19lcnJvcjo7CisgIF9fUHl4X0FkZFRyYWNlYmFjaygia2VubG0uTW9kZWwuQmFzZUZ1bGxTY29yZSIsIF9fcHl4X2NsaW5lbm8sIF9fcHl4X2xpbmVubywgX19weXhfZmlsZW5hbWUpOworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIE5VTEw7CisgIF9fcHl4X0w0X2FyZ3VtZW50X3VucGFja2luZ19kb25lOjsKKyAgaWYgKHVubGlrZWx5KCFfX1B5eF9BcmdUeXBlVGVzdCgoKFB5T2JqZWN0ICopX19weXhfdl9pbl9zdGF0ZSksIF9fcHl4X3B0eXBlXzVrZW5sbV9TdGF0ZSwgMSwgImluX3N0YXRlIiwgMCkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyMTA7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIGlmICh1bmxpa2VseSghX19QeXhfQXJnVHlwZVRlc3QoKChQeU9iamVjdCAqKV9fcHl4X3Zfd29yZCksICgmUHlTdHJpbmdfVHlwZSksIDEsICJ3b3JkIiwgMSkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyMTA7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIGlmICh1bmxpa2VseSghX19QeXhfQXJnVHlwZVRlc3QoKChQeU9iamVjdCAqKV9fcHl4X3Zfb3V0X3N0YXRlKSwgX19weXhfcHR5cGVfNWtlbmxtX1N0YXRlLCAxLCAib3V0X3N0YXRlIiwgMCkpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyMTA7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fcHl4X3IgPSBfX3B5eF9wZl81a2VubG1fNU1vZGVsXzEwQmFzZUZ1bGxTY29yZSgoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICopX19weXhfdl9zZWxmKSwgX19weXhfdl9pbl9zdGF0ZSwgX19weXhfdl93b3JkLCBfX3B5eF92X291dF9zdGF0ZSk7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIGdvdG8gX19weXhfTDA7CisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19weXhfciA9IE5VTEw7CisgIF9fcHl4X0wwOjsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3BmXzVrZW5sbV81TW9kZWxfMTBCYXNlRnVsbFNjb3JlKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpfX3B5eF92X3NlbGYsIHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX1N0YXRlICpfX3B5eF92X2luX3N0YXRlLCBQeU9iamVjdCAqX19weXhfdl93b3JkLCBzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9TdGF0ZSAqX19weXhfdl9vdXRfc3RhdGUpIHsKKyAgbG06OldvcmRJbmRleCBfX3B5eF92X3dpZDsKKyAgc3RydWN0IGxtOjpGdWxsU2NvcmVSZXR1cm4gX19weXhfdl9yZXQ7CisgIFB5T2JqZWN0ICpfX3B5eF9yID0gTlVMTDsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgUHlPYmplY3QgKl9fcHl4X3RfMSA9IE5VTEw7CisgIGNoYXIgKl9fcHl4X3RfMjsKKyAgUHlPYmplY3QgKl9fcHl4X3RfMyA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzQgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF81ID0gTlVMTDsKKyAgaW50IF9fcHl4X2xpbmVubyA9IDA7CisgIGNvbnN0IGNoYXIgKl9fcHl4X2ZpbGVuYW1lID0gTlVMTDsKKyAgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiQmFzZUZ1bGxTY29yZSIsIDApOworCisgIC8qICJrZW5sbS5weXgiOjIxOAorICogICAgICAgICA6cmV0dXJuczogRnVsbFNjb3JlUmV0dXJuKHdvcmR8c3RhdGUpCisgKiAgICAgICAgICIiIgorICogICAgICAgICBjZGVmIF9rZW5sbS5Xb3JkSW5kZXggd2lkID0gc2VsZi52b2NhYi5JbmRleChhc19zdHIod29yZCkpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgY2RlZiBfa2VubG0uRnVsbFNjb3JlUmV0dXJuIHJldCA9IHNlbGYubW9kZWwuQmFzZUZ1bGxTY29yZSgmaW5fc3RhdGUuX2Nfc3RhdGUsIHdpZCwgJm91dF9zdGF0ZS5fY19zdGF0ZSkKKyAqICAgICAgICAgcmV0dXJuIEZ1bGxTY29yZVJldHVybihyZXQucHJvYiwgcmV0Lm5ncmFtX2xlbmd0aCwgd2lkID09IDApCisgKi8KKyAgX19weXhfdF8xID0gX19weXhfZl81a2VubG1fYXNfc3RyKF9fcHl4X3Zfd29yZCk7IGlmICh1bmxpa2VseSghX19weXhfdF8xKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjE4OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgX19weXhfdF8yID0gX19QeXhfUHlPYmplY3RfQXNTdHJpbmcoX19weXhfdF8xKTsgaWYgKHVubGlrZWx5KCghX19weXhfdF8yKSAmJiBQeUVycl9PY2N1cnJlZCgpKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjE4OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF92X3dpZCA9IF9fcHl4X3Zfc2VsZi0+dm9jYWItPkluZGV4KF9fcHl4X3RfMik7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzEpOyBfX3B5eF90XzEgPSAwOworCisgIC8qICJrZW5sbS5weXgiOjIxOQorICogICAgICAgICAiIiIKKyAqICAgICAgICAgY2RlZiBfa2VubG0uV29yZEluZGV4IHdpZCA9IHNlbGYudm9jYWIuSW5kZXgoYXNfc3RyKHdvcmQpKQorICogICAgICAgICBjZGVmIF9rZW5sbS5GdWxsU2NvcmVSZXR1cm4gcmV0ID0gc2VsZi5tb2RlbC5CYXNlRnVsbFNjb3JlKCZpbl9zdGF0ZS5fY19zdGF0ZSwgd2lkLCAmb3V0X3N0YXRlLl9jX3N0YXRlKSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIHJldHVybiBGdWxsU2NvcmVSZXR1cm4ocmV0LnByb2IsIHJldC5uZ3JhbV9sZW5ndGgsIHdpZCA9PSAwKQorICogCisgKi8KKyAgX19weXhfdl9yZXQgPSBfX3B5eF92X3NlbGYtPm1vZGVsLT5CYXNlRnVsbFNjb3JlKCgmX19weXhfdl9pbl9zdGF0ZS0+X2Nfc3RhdGUpLCBfX3B5eF92X3dpZCwgKCZfX3B5eF92X291dF9zdGF0ZS0+X2Nfc3RhdGUpKTsKKworICAvKiAia2VubG0ucHl4IjoyMjAKKyAqICAgICAgICAgY2RlZiBfa2VubG0uV29yZEluZGV4IHdpZCA9IHNlbGYudm9jYWIuSW5kZXgoYXNfc3RyKHdvcmQpKQorICogICAgICAgICBjZGVmIF9rZW5sbS5GdWxsU2NvcmVSZXR1cm4gcmV0ID0gc2VsZi5tb2RlbC5CYXNlRnVsbFNjb3JlKCZpbl9zdGF0ZS5fY19zdGF0ZSwgd2lkLCAmb3V0X3N0YXRlLl9jX3N0YXRlKQorICogICAgICAgICByZXR1cm4gRnVsbFNjb3JlUmV0dXJuKHJldC5wcm9iLCByZXQubmdyYW1fbGVuZ3RoLCB3aWQgPT0gMCkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogCisgKiAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB3b3JkKToKKyAqLworICBfX1B5eF9YREVDUkVGKF9fcHl4X3IpOworICBfX3B5eF90XzEgPSBQeUZsb2F0X0Zyb21Eb3VibGUoX19weXhfdl9yZXQucHJvYik7IGlmICh1bmxpa2VseSghX19weXhfdF8xKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjIwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgX19weXhfdF8zID0gX19QeXhfUHlJbnRfRnJvbV91bnNpZ25lZF9jaGFyKF9fcHl4X3ZfcmV0Lm5ncmFtX2xlbmd0aCk7IGlmICh1bmxpa2VseSghX19weXhfdF8zKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjIwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8zKTsKKyAgX19weXhfdF80ID0gX19QeXhfUHlCb29sX0Zyb21Mb25nKChfX3B5eF92X3dpZCA9PSAwKSk7IGlmICh1bmxpa2VseSghX19weXhfdF80KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjIwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF80KTsKKyAgX19weXhfdF81ID0gUHlUdXBsZV9OZXcoMyk7IGlmICh1bmxpa2VseSghX19weXhfdF81KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjIwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF81KTsKKyAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzUsIDAsIF9fcHl4X3RfMSk7CisgIF9fUHl4X0dJVkVSRUYoX19weXhfdF8xKTsKKyAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzUsIDEsIF9fcHl4X3RfMyk7CisgIF9fUHl4X0dJVkVSRUYoX19weXhfdF8zKTsKKyAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzUsIDIsIF9fcHl4X3RfNCk7CisgIF9fUHl4X0dJVkVSRUYoX19weXhfdF80KTsKKyAgX19weXhfdF8xID0gMDsKKyAgX19weXhfdF8zID0gMDsKKyAgX19weXhfdF80ID0gMDsKKyAgX19weXhfdF80ID0gX19QeXhfUHlPYmplY3RfQ2FsbCgoKFB5T2JqZWN0ICopKChQeU9iamVjdCopX19weXhfcHR5cGVfNWtlbmxtX0Z1bGxTY29yZVJldHVybikpLCBfX3B5eF90XzUsIE5VTEwpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDIyMDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfNCk7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzUpOyBfX3B5eF90XzUgPSAwOworICBfX3B5eF9yID0gX19weXhfdF80OworICBfX3B5eF90XzQgPSAwOworICBnb3RvIF9fcHl4X0wwOworCisgIC8qICJrZW5sbS5weXgiOjIxMAorICogICAgICAgICByZXR1cm4gdG90YWwKKyAqIAorICogICAgIGRlZiBCYXNlRnVsbFNjb3JlKHNlbGYsIFN0YXRlIGluX3N0YXRlLCBzdHIgd29yZCwgU3RhdGUgb3V0X3N0YXRlKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAiIiIKKyAqICAgICAgICAgV3JhcHBlciBhcm91bmQgbW9kZWwuQmFzZVNjb3JlKGluX3N0YXRlLCBJbmRleCh3b3JkKSwgb3V0X3N0YXRlKQorICovCisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzEpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMyk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF80KTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzUpOworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLk1vZGVsLkJhc2VGdWxsU2NvcmUiLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19weXhfciA9IE5VTEw7CisgIF9fcHl4X0wwOjsKKyAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworLyogImtlbmxtLnB5eCI6MjIyCisgKiAgICAgICAgIHJldHVybiBGdWxsU2NvcmVSZXR1cm4ocmV0LnByb2IsIHJldC5uZ3JhbV9sZW5ndGgsIHdpZCA9PSAwKQorICogCisgKiAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB3b3JkKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICBjZGVmIGJ5dGVzIHcgPSBhc19zdHIod29yZCkKKyAqICAgICAgICAgcmV0dXJuIChzZWxmLnZvY2FiLkluZGV4KHcpICE9IDApCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyBpbnQgX19weXhfcHdfNWtlbmxtXzVNb2RlbF8xM19fY29udGFpbnNfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl93b3JkKTsgLypwcm90byovCitzdGF0aWMgaW50IF9fcHl4X3B3XzVrZW5sbV81TW9kZWxfMTNfX2NvbnRhaW5zX18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZiwgUHlPYmplY3QgKl9fcHl4X3Zfd29yZCkgeworICBpbnQgX19weXhfcjsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fY29udGFpbnNfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV81TW9kZWxfMTJfX2NvbnRhaW5zX18oKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqKV9fcHl4X3Zfc2VsZiksICgoUHlPYmplY3QgKilfX3B5eF92X3dvcmQpKTsKKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCitzdGF0aWMgaW50IF9fcHl4X3BmXzVrZW5sbV81TW9kZWxfMTJfX2NvbnRhaW5zX18oc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwgKl9fcHl4X3Zfc2VsZiwgUHlPYmplY3QgKl9fcHl4X3Zfd29yZCkgeworICBQeU9iamVjdCAqX19weXhfdl93ID0gMDsKKyAgaW50IF9fcHl4X3I7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIFB5T2JqZWN0ICpfX3B5eF90XzEgPSBOVUxMOworICBjaGFyICpfX3B5eF90XzI7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fY29udGFpbnNfXyIsIDApOworCisgIC8qICJrZW5sbS5weXgiOjIyMworICogCisgKiAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB3b3JkKToKKyAqICAgICAgICAgY2RlZiBieXRlcyB3ID0gYXNfc3RyKHdvcmQpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgcmV0dXJuIChzZWxmLnZvY2FiLkluZGV4KHcpICE9IDApCisgKiAKKyAqLworICBfX3B5eF90XzEgPSBfX3B5eF9mXzVrZW5sbV9hc19zdHIoX19weXhfdl93b3JkKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyMjM7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICBfX3B5eF92X3cgPSAoKFB5T2JqZWN0KilfX3B5eF90XzEpOworICBfX3B5eF90XzEgPSAwOworCisgIC8qICJrZW5sbS5weXgiOjIyNAorICogICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgd29yZCk6CisgKiAgICAgICAgIGNkZWYgYnl0ZXMgdyA9IGFzX3N0cih3b3JkKQorICogICAgICAgICByZXR1cm4gKHNlbGYudm9jYWIuSW5kZXgodykgIT0gMCkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogCisgKiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICovCisgIF9fcHl4X3RfMiA9IF9fUHl4X1B5T2JqZWN0X0FzU3RyaW5nKF9fcHl4X3Zfdyk7IGlmICh1bmxpa2VseSgoIV9fcHl4X3RfMikgJiYgUHlFcnJfT2NjdXJyZWQoKSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDIyNDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19weXhfciA9IChfX3B5eF92X3NlbGYtPnZvY2FiLT5JbmRleChfX3B5eF90XzIpICE9IDApOworICBnb3RvIF9fcHl4X0wwOworCisgIC8qICJrZW5sbS5weXgiOjIyMgorICogICAgICAgICByZXR1cm4gRnVsbFNjb3JlUmV0dXJuKHJldC5wcm9iLCByZXQubmdyYW1fbGVuZ3RoLCB3aWQgPT0gMCkKKyAqIAorICogICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgd29yZCk6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgY2RlZiBieXRlcyB3ID0gYXNfc3RyKHdvcmQpCisgKiAgICAgICAgIHJldHVybiAoc2VsZi52b2NhYi5JbmRleCh3KSAhPSAwKQorICovCisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzEpOworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLk1vZGVsLl9fY29udGFpbnNfXyIsIF9fcHl4X2NsaW5lbm8sIF9fcHl4X2xpbmVubywgX19weXhfZmlsZW5hbWUpOworICBfX3B5eF9yID0gLTE7CisgIF9fcHl4X0wwOjsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF92X3cpOworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKKy8qICJrZW5sbS5weXgiOjIyNgorICogICAgICAgICByZXR1cm4gKHNlbGYudm9jYWIuSW5kZXgodykgIT0gMCkKKyAqIAorICogICAgIGRlZiBfX3JlcHJfXyhzZWxmKTogICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICByZXR1cm4gJzxNb2RlbCBmcm9tIHswfT4nLmZvcm1hdChvcy5wYXRoLmJhc2VuYW1lKHNlbGYucGF0aCkpCisgKiAKKyAqLworCisvKiBQeXRob24gd3JhcHBlciAqLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fNU1vZGVsXzE1X19yZXByX18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZik7IC8qcHJvdG8qLworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wd181a2VubG1fNU1vZGVsXzE1X19yZXByX18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZikgeworICBQeU9iamVjdCAqX19weXhfciA9IDA7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX3JlcHJfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV81TW9kZWxfMTRfX3JlcHJfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICopX19weXhfdl9zZWxmKSk7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9wZl81a2VubG1fNU1vZGVsXzE0X19yZXByX18oc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwgKl9fcHl4X3Zfc2VsZikgeworICBQeU9iamVjdCAqX19weXhfciA9IE5VTEw7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIFB5T2JqZWN0ICpfX3B5eF90XzEgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF8yID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfMyA9IE5VTEw7CisgIFB5T2JqZWN0ICpfX3B5eF90XzQgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF81ID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfNiA9IE5VTEw7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fcmVwcl9fIiwgMCk7CisKKyAgLyogImtlbmxtLnB5eCI6MjI3CisgKiAKKyAqICAgICBkZWYgX19yZXByX18oc2VsZik6CisgKiAgICAgICAgIHJldHVybiAnPE1vZGVsIGZyb20gezB9PicuZm9ybWF0KG9zLnBhdGguYmFzZW5hbWUoc2VsZi5wYXRoKSkgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogCisgKiAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgKi8KKyAgX19QeXhfWERFQ1JFRihfX3B5eF9yKTsKKyAgX19weXhfdF8yID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF9rcF9zX01vZGVsX2Zyb21fMCwgX19weXhfbl9zX2Zvcm1hdCk7IGlmICh1bmxpa2VseSghX19weXhfdF8yKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjI3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8yKTsKKyAgX19weXhfdF80ID0gX19QeXhfR2V0TW9kdWxlR2xvYmFsTmFtZShfX3B5eF9uX3Nfb3MpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDIyNzsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfNCk7CisgIF9fcHl4X3RfNSA9IF9fUHl4X1B5T2JqZWN0X0dldEF0dHJTdHIoX19weXhfdF80LCBfX3B5eF9uX3NfcGF0aCk7IGlmICh1bmxpa2VseSghX19weXhfdF81KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjI3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF81KTsKKyAgX19QeXhfREVDUkVGKF9fcHl4X3RfNCk7IF9fcHl4X3RfNCA9IDA7CisgIF9fcHl4X3RfNCA9IF9fUHl4X1B5T2JqZWN0X0dldEF0dHJTdHIoX19weXhfdF81LCBfX3B5eF9uX3NfYmFzZW5hbWUpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfNCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDIyNzsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfNCk7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzUpOyBfX3B5eF90XzUgPSAwOworICBfX3B5eF90XzUgPSBOVUxMOworICBpZiAoQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OICYmIGxpa2VseShQeU1ldGhvZF9DaGVjayhfX3B5eF90XzQpKSkgeworICAgIF9fcHl4X3RfNSA9IFB5TWV0aG9kX0dFVF9TRUxGKF9fcHl4X3RfNCk7CisgICAgaWYgKGxpa2VseShfX3B5eF90XzUpKSB7CisgICAgICBQeU9iamVjdCogZnVuY3Rpb24gPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oX19weXhfdF80KTsKKyAgICAgIF9fUHl4X0lOQ1JFRihfX3B5eF90XzUpOworICAgICAgX19QeXhfSU5DUkVGKGZ1bmN0aW9uKTsKKyAgICAgIF9fUHl4X0RFQ1JFRl9TRVQoX19weXhfdF80LCBmdW5jdGlvbik7CisgICAgfQorICB9CisgIGlmICghX19weXhfdF81KSB7CisgICAgX19weXhfdF8zID0gX19QeXhfUHlPYmplY3RfQ2FsbE9uZUFyZyhfX3B5eF90XzQsIF9fcHl4X3Zfc2VsZi0+cGF0aCk7IGlmICh1bmxpa2VseSghX19weXhfdF8zKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjI3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzMpOworICB9IGVsc2UgeworICAgIF9fcHl4X3RfNiA9IFB5VHVwbGVfTmV3KDErMSk7IGlmICh1bmxpa2VseSghX19weXhfdF82KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjI3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzYpOworICAgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF82LCAwLCBfX3B5eF90XzUpOyBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfNSk7IF9fcHl4X3RfNSA9IE5VTEw7CisgICAgX19QeXhfSU5DUkVGKF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzYsIDArMSwgX19weXhfdl9zZWxmLT5wYXRoKTsKKyAgICBfX1B5eF9HSVZFUkVGKF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgICAgX19weXhfdF8zID0gX19QeXhfUHlPYmplY3RfQ2FsbChfX3B5eF90XzQsIF9fcHl4X3RfNiwgTlVMTCk7IGlmICh1bmxpa2VseSghX19weXhfdF8zKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjI3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzMpOworICAgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzYpOyBfX3B5eF90XzYgPSAwOworICB9CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzQpOyBfX3B5eF90XzQgPSAwOworICBfX3B5eF90XzQgPSBOVUxMOworICBpZiAoQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OICYmIGxpa2VseShQeU1ldGhvZF9DaGVjayhfX3B5eF90XzIpKSkgeworICAgIF9fcHl4X3RfNCA9IFB5TWV0aG9kX0dFVF9TRUxGKF9fcHl4X3RfMik7CisgICAgaWYgKGxpa2VseShfX3B5eF90XzQpKSB7CisgICAgICBQeU9iamVjdCogZnVuY3Rpb24gPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oX19weXhfdF8yKTsKKyAgICAgIF9fUHl4X0lOQ1JFRihfX3B5eF90XzQpOworICAgICAgX19QeXhfSU5DUkVGKGZ1bmN0aW9uKTsKKyAgICAgIF9fUHl4X0RFQ1JFRl9TRVQoX19weXhfdF8yLCBmdW5jdGlvbik7CisgICAgfQorICB9CisgIGlmICghX19weXhfdF80KSB7CisgICAgX19weXhfdF8xID0gX19QeXhfUHlPYmplY3RfQ2FsbE9uZUFyZyhfX3B5eF90XzIsIF9fcHl4X3RfMyk7IGlmICh1bmxpa2VseSghX19weXhfdF8xKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjI3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzMpOyBfX3B5eF90XzMgPSAwOworICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICB9IGVsc2UgeworICAgIF9fcHl4X3RfNiA9IFB5VHVwbGVfTmV3KDErMSk7IGlmICh1bmxpa2VseSghX19weXhfdF82KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjI3OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIF9fUHl4X0dPVFJFRihfX3B5eF90XzYpOworICAgIFB5VHVwbGVfU0VUX0lURU0oX19weXhfdF82LCAwLCBfX3B5eF90XzQpOyBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfNCk7IF9fcHl4X3RfNCA9IE5VTEw7CisgICAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzYsIDArMSwgX19weXhfdF8zKTsKKyAgICBfX1B5eF9HSVZFUkVGKF9fcHl4X3RfMyk7CisgICAgX19weXhfdF8zID0gMDsKKyAgICBfX3B5eF90XzEgPSBfX1B5eF9QeU9iamVjdF9DYWxsKF9fcHl4X3RfMiwgX19weXhfdF82LCBOVUxMKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyMjc7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICAgX19QeXhfR09UUkVGKF9fcHl4X3RfMSk7CisgICAgX19QeXhfREVDUkVGKF9fcHl4X3RfNik7IF9fcHl4X3RfNiA9IDA7CisgIH0KKyAgX19QeXhfREVDUkVGKF9fcHl4X3RfMik7IF9fcHl4X3RfMiA9IDA7CisgIF9fcHl4X3IgPSBfX3B5eF90XzE7CisgIF9fcHl4X3RfMSA9IDA7CisgIGdvdG8gX19weXhfTDA7CisKKyAgLyogImtlbmxtLnB5eCI6MjI2CisgKiAgICAgICAgIHJldHVybiAoc2VsZi52b2NhYi5JbmRleCh3KSAhPSAwKQorICogCisgKiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOiAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgICAgIHJldHVybiAnPE1vZGVsIGZyb20gezB9PicuZm9ybWF0KG9zLnBhdGguYmFzZW5hbWUoc2VsZi5wYXRoKSkKKyAqIAorICovCisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzEpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMik7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8zKTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzQpOworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfNSk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF82KTsKKyAgX19QeXhfQWRkVHJhY2ViYWNrKCJrZW5sbS5Nb2RlbC5fX3JlcHJfXyIsIF9fcHl4X2NsaW5lbm8sIF9fcHl4X2xpbmVubywgX19weXhfZmlsZW5hbWUpOworICBfX3B5eF9yID0gTlVMTDsKKyAgX19weXhfTDA6OworICBfX1B5eF9YR0lWRVJFRihfX3B5eF9yKTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCisvKiAia2VubG0ucHl4IjoyMjkKKyAqICAgICAgICAgcmV0dXJuICc8TW9kZWwgZnJvbSB7MH0+Jy5mb3JtYXQob3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgpKQorICogCisgKiAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgcmV0dXJuIChfa2VubG0uTGFuZ3VhZ2VNb2RlbCwgKHNlbGYucGF0aCwpKQorICogCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcHdfNWtlbmxtXzVNb2RlbF8xN19fcmVkdWNlX18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZiwgQ1lUSE9OX1VOVVNFRCBQeU9iamVjdCAqdW51c2VkKTsgLypwcm90byovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV81TW9kZWxfMTdfX3JlZHVjZV9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYsIENZVEhPTl9VTlVTRUQgUHlPYmplY3QgKnVudXNlZCkgeworICBQeU9iamVjdCAqX19weXhfciA9IDA7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX3JlZHVjZV9fICh3cmFwcGVyKSIsIDApOworICBfX3B5eF9yID0gX19weXhfcGZfNWtlbmxtXzVNb2RlbF8xNl9fcmVkdWNlX18oKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqKV9fcHl4X3Zfc2VsZikpOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcGZfNWtlbmxtXzVNb2RlbF8xNl9fcmVkdWNlX18oc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwgKl9fcHl4X3Zfc2VsZikgeworICBQeU9iamVjdCAqX19weXhfciA9IE5VTEw7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIFB5T2JqZWN0ICpfX3B5eF90XzEgPSBOVUxMOworICBQeU9iamVjdCAqX19weXhfdF8yID0gTlVMTDsKKyAgUHlPYmplY3QgKl9fcHl4X3RfMyA9IE5VTEw7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fcmVkdWNlX18iLCAwKTsKKworICAvKiAia2VubG0ucHl4IjoyMzAKKyAqIAorICogICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICogICAgICAgICByZXR1cm4gKF9rZW5sbS5MYW5ndWFnZU1vZGVsLCAoc2VsZi5wYXRoLCkpICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqIAorICovCisgIF9fUHl4X1hERUNSRUYoX19weXhfcik7CisgIF9fcHl4X3RfMSA9IF9fUHl4X0dldE1vZHVsZUdsb2JhbE5hbWUoX19weXhfbl9zX2tlbmxtKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyMzA7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICBfX3B5eF90XzIgPSBfX1B5eF9QeU9iamVjdF9HZXRBdHRyU3RyKF9fcHl4X3RfMSwgX19weXhfbl9zX0xhbmd1YWdlTW9kZWwpOyBpZiAodW5saWtlbHkoIV9fcHl4X3RfMikpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDIzMDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3RfMik7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzEpOyBfX3B5eF90XzEgPSAwOworICBfX3B5eF90XzEgPSBQeVR1cGxlX05ldygxKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAyMzA7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90XzEpOworICBfX1B5eF9JTkNSRUYoX19weXhfdl9zZWxmLT5wYXRoKTsKKyAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzEsIDAsIF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgIF9fUHl4X0dJVkVSRUYoX19weXhfdl9zZWxmLT5wYXRoKTsKKyAgX19weXhfdF8zID0gUHlUdXBsZV9OZXcoMik7IGlmICh1bmxpa2VseSghX19weXhfdF8zKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMjMwOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8zKTsKKyAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzMsIDAsIF9fcHl4X3RfMik7CisgIF9fUHl4X0dJVkVSRUYoX19weXhfdF8yKTsKKyAgUHlUdXBsZV9TRVRfSVRFTShfX3B5eF90XzMsIDEsIF9fcHl4X3RfMSk7CisgIF9fUHl4X0dJVkVSRUYoX19weXhfdF8xKTsKKyAgX19weXhfdF8yID0gMDsKKyAgX19weXhfdF8xID0gMDsKKyAgX19weXhfciA9IF9fcHl4X3RfMzsKKyAgX19weXhfdF8zID0gMDsKKyAgZ290byBfX3B5eF9MMDsKKworICAvKiAia2VubG0ucHl4IjoyMjkKKyAqICAgICAgICAgcmV0dXJuICc8TW9kZWwgZnJvbSB7MH0+Jy5mb3JtYXQob3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgpKQorICogCisgKiAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6ICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICAgICAgcmV0dXJuIChfa2VubG0uTGFuZ3VhZ2VNb2RlbCwgKHNlbGYucGF0aCwpKQorICogCisgKi8KKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfTDFfZXJyb3I6OworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMSk7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8yKTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF90XzMpOworICBfX1B5eF9BZGRUcmFjZWJhY2soImtlbmxtLk1vZGVsLl9fcmVkdWNlX18iLCBfX3B5eF9jbGluZW5vLCBfX3B5eF9saW5lbm8sIF9fcHl4X2ZpbGVuYW1lKTsKKyAgX19weXhfciA9IE5VTEw7CisgIF9fcHl4X0wwOjsKKyAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworLyogImtlbmxtLnB5eCI6MTY1CisgKiAKKyAqICAgICBjZGVmIF9rZW5sbS5Nb2RlbCogbW9kZWwKKyAqICAgICBjZGVmIHB1YmxpYyBieXRlcyBwYXRoICAgICAgICAgICAgICMgPDw8PDw8PDw8PDw8PDwKKyAqICAgICBjZGVmIF9rZW5sbS5jb25zdF9Wb2NhYnVsYXJ5KiB2b2NhYgorICogCisgKi8KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyBQeU9iamVjdCAqX19weXhfcHdfNWtlbmxtXzVNb2RlbF80cGF0aF8xX19nZXRfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmKTsgLypwcm90byovCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3B3XzVrZW5sbV81TW9kZWxfNHBhdGhfMV9fZ2V0X18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZikgeworICBQeU9iamVjdCAqX19weXhfciA9IDA7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX2dldF9fICh3cmFwcGVyKSIsIDApOworICBfX3B5eF9yID0gX19weXhfcGZfNWtlbmxtXzVNb2RlbF80cGF0aF9fX2dldF9fKCgoc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwgKilfX3B5eF92X3NlbGYpKTsKKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiBfX3B5eF9yOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3BmXzVrZW5sbV81TW9kZWxfNHBhdGhfX19nZXRfXyhzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqX19weXhfdl9zZWxmKSB7CisgIFB5T2JqZWN0ICpfX3B5eF9yID0gTlVMTDsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fZ2V0X18iLCAwKTsKKyAgX19QeXhfWERFQ1JFRihfX3B5eF9yKTsKKyAgX19QeXhfSU5DUkVGKF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgIF9fcHl4X3IgPSBfX3B5eF92X3NlbGYtPnBhdGg7CisgIGdvdG8gX19weXhfTDA7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fcHl4X0wwOjsKKyAgX19QeXhfWEdJVkVSRUYoX19weXhfcik7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworLyogUHl0aG9uIHdyYXBwZXIgKi8KK3N0YXRpYyBpbnQgX19weXhfcHdfNWtlbmxtXzVNb2RlbF80cGF0aF8zX19zZXRfXyhQeU9iamVjdCAqX19weXhfdl9zZWxmLCBQeU9iamVjdCAqX19weXhfdl92YWx1ZSk7IC8qcHJvdG8qLworc3RhdGljIGludCBfX3B5eF9wd181a2VubG1fNU1vZGVsXzRwYXRoXzNfX3NldF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF92X3ZhbHVlKSB7CisgIGludCBfX3B5eF9yOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19zZXRfXyAod3JhcHBlcikiLCAwKTsKKyAgX19weXhfciA9IF9fcHl4X3BmXzVrZW5sbV81TW9kZWxfNHBhdGhfMl9fc2V0X18oKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9Nb2RlbCAqKV9fcHl4X3Zfc2VsZiksICgoUHlPYmplY3QgKilfX3B5eF92X3ZhbHVlKSk7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIGludCBfX3B5eF9wZl81a2VubG1fNU1vZGVsXzRwYXRoXzJfX3NldF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpfX3B5eF92X3NlbGYsIFB5T2JqZWN0ICpfX3B5eF92X3ZhbHVlKSB7CisgIGludCBfX3B5eF9yOworICBfX1B5eF9SZWZOYW5ueURlY2xhcmF0aW9ucworICBQeU9iamVjdCAqX19weXhfdF8xID0gTlVMTDsKKyAgaW50IF9fcHl4X2xpbmVubyA9IDA7CisgIGNvbnN0IGNoYXIgKl9fcHl4X2ZpbGVuYW1lID0gTlVMTDsKKyAgaW50IF9fcHl4X2NsaW5lbm8gPSAwOworICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiX19zZXRfXyIsIDApOworICBpZiAoIShsaWtlbHkoUHlCeXRlc19DaGVja0V4YWN0KF9fcHl4X3ZfdmFsdWUpKXx8KChfX3B5eF92X3ZhbHVlKSA9PSBQeV9Ob25lKXx8KFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJFeHBlY3RlZCAlLjE2cywgZ290ICUuMjAwcyIsICJieXRlcyIsIFB5X1RZUEUoX19weXhfdl92YWx1ZSktPnRwX25hbWUpLCAwKSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE2NTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19weXhfdF8xID0gX19weXhfdl92YWx1ZTsKKyAgX19QeXhfSU5DUkVGKF9fcHl4X3RfMSk7CisgIF9fUHl4X0dJVkVSRUYoX19weXhfdF8xKTsKKyAgX19QeXhfR09UUkVGKF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF92X3NlbGYtPnBhdGgpOworICBfX3B5eF92X3NlbGYtPnBhdGggPSAoKFB5T2JqZWN0KilfX3B5eF90XzEpOworICBfX3B5eF90XzEgPSAwOworCisgIC8qIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworICBfX3B5eF9yID0gMDsKKyAgZ290byBfX3B5eF9MMDsKKyAgX19weXhfTDFfZXJyb3I6OworICBfX1B5eF9YREVDUkVGKF9fcHl4X3RfMSk7CisgIF9fUHl4X0FkZFRyYWNlYmFjaygia2VubG0uTW9kZWwucGF0aC5fX3NldF9fIiwgX19weXhfY2xpbmVubywgX19weXhfbGluZW5vLCBfX3B5eF9maWxlbmFtZSk7CisgIF9fcHl4X3IgPSAtMTsKKyAgX19weXhfTDA6OworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgcmV0dXJuIF9fcHl4X3I7Cit9CisKKy8qIFB5dGhvbiB3cmFwcGVyICovCitzdGF0aWMgaW50IF9fcHl4X3B3XzVrZW5sbV81TW9kZWxfNHBhdGhfNV9fZGVsX18oUHlPYmplY3QgKl9fcHl4X3Zfc2VsZik7IC8qcHJvdG8qLworc3RhdGljIGludCBfX3B5eF9wd181a2VubG1fNU1vZGVsXzRwYXRoXzVfX2RlbF9fKFB5T2JqZWN0ICpfX3B5eF92X3NlbGYpIHsKKyAgaW50IF9fcHl4X3I7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX2RlbF9fICh3cmFwcGVyKSIsIDApOworICBfX3B5eF9yID0gX19weXhfcGZfNWtlbmxtXzVNb2RlbF80cGF0aF80X19kZWxfXygoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICopX19weXhfdl9zZWxmKSk7CisKKyAgLyogZnVuY3Rpb24gZXhpdCBjb2RlICovCisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIGludCBfX3B5eF9wZl81a2VubG1fNU1vZGVsXzRwYXRoXzRfX2RlbF9fKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpfX3B5eF92X3NlbGYpIHsKKyAgaW50IF9fcHl4X3I7CisgIF9fUHl4X1JlZk5hbm55RGVjbGFyYXRpb25zCisgIF9fUHl4X1JlZk5hbm55U2V0dXBDb250ZXh0KCJfX2RlbF9fIiwgMCk7CisgIF9fUHl4X0lOQ1JFRihQeV9Ob25lKTsKKyAgX19QeXhfR0lWRVJFRihQeV9Ob25lKTsKKyAgX19QeXhfR09UUkVGKF9fcHl4X3Zfc2VsZi0+cGF0aCk7CisgIF9fUHl4X0RFQ1JFRihfX3B5eF92X3NlbGYtPnBhdGgpOworICBfX3B5eF92X3NlbGYtPnBhdGggPSAoKFB5T2JqZWN0KilQeV9Ob25lKTsKKworICAvKiBmdW5jdGlvbiBleGl0IGNvZGUgKi8KKyAgX19weXhfciA9IDA7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gX19weXhfcjsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF90cF9uZXdfNWtlbmxtX0Z1bGxTY29yZVJldHVybihQeVR5cGVPYmplY3QgKnQsIFB5T2JqZWN0ICphLCBQeU9iamVjdCAqaykgeworICBQeU9iamVjdCAqbzsKKyAgaWYgKGxpa2VseSgodC0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0lTX0FCU1RSQUNUKSA9PSAwKSkgeworICAgIG8gPSAoKnQtPnRwX2FsbG9jKSh0LCAwKTsKKyAgfSBlbHNlIHsKKyAgICBvID0gKFB5T2JqZWN0ICopIFB5QmFzZU9iamVjdF9UeXBlLnRwX25ldyh0LCBfX3B5eF9lbXB0eV90dXBsZSwgMCk7CisgIH0KKyAgaWYgKHVubGlrZWx5KCFvKSkgcmV0dXJuIDA7CisgIGlmICh1bmxpa2VseShfX3B5eF9wd181a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fMV9fY2luaXRfXyhvLCBhLCBrKSA8IDApKSB7CisgICAgUHlfREVDUkVGKG8pOyBvID0gMDsKKyAgfQorICByZXR1cm4gbzsKK30KKworc3RhdGljIHZvaWQgX19weXhfdHBfZGVhbGxvY181a2VubG1fRnVsbFNjb3JlUmV0dXJuKFB5T2JqZWN0ICpvKSB7CisgICNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDQwMGExCisgIGlmICh1bmxpa2VseShQeV9UWVBFKG8pLT50cF9maW5hbGl6ZSkgJiYgKCFQeVR5cGVfSVNfR0MoUHlfVFlQRShvKSkgfHwgIV9QeUdDX0ZJTkFMSVpFRChvKSkpIHsKKyAgICBpZiAoUHlPYmplY3RfQ2FsbEZpbmFsaXplckZyb21EZWFsbG9jKG8pKSByZXR1cm47CisgIH0KKyAgI2VuZGlmCisgICgqUHlfVFlQRShvKS0+dHBfZnJlZSkobyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfZ2V0cHJvcF81a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fbG9nX3Byb2IoUHlPYmplY3QgKm8sIENZVEhPTl9VTlVTRUQgdm9pZCAqeCkgeworICByZXR1cm4gX19weXhfcHdfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuXzhsb2dfcHJvYl8xX19nZXRfXyhvKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9nZXRwcm9wXzVrZW5sbV8xNUZ1bGxTY29yZVJldHVybl9uZ3JhbV9sZW5ndGgoUHlPYmplY3QgKm8sIENZVEhPTl9VTlVTRUQgdm9pZCAqeCkgeworICByZXR1cm4gX19weXhfcHdfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuXzEybmdyYW1fbGVuZ3RoXzFfX2dldF9fKG8pOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X2dldHByb3BfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuX29vdihQeU9iamVjdCAqbywgQ1lUSE9OX1VOVVNFRCB2b2lkICp4KSB7CisgIHJldHVybiBfX3B5eF9wd181a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fM29vdl8xX19nZXRfXyhvKTsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIF9fcHl4X21ldGhvZHNfNWtlbmxtX0Z1bGxTY29yZVJldHVybltdID0geworICB7MCwgMCwgMCwgMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgUHlHZXRTZXREZWYgX19weXhfZ2V0c2V0c181a2VubG1fRnVsbFNjb3JlUmV0dXJuW10gPSB7CisgIHsoY2hhciAqKSJsb2dfcHJvYiIsIF9fcHl4X2dldHByb3BfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuX2xvZ19wcm9iLCAwLCAwLCAwfSwKKyAgeyhjaGFyICopIm5ncmFtX2xlbmd0aCIsIF9fcHl4X2dldHByb3BfNWtlbmxtXzE1RnVsbFNjb3JlUmV0dXJuX25ncmFtX2xlbmd0aCwgMCwgMCwgMH0sCisgIHsoY2hhciAqKSJvb3YiLCBfX3B5eF9nZXRwcm9wXzVrZW5sbV8xNUZ1bGxTY29yZVJldHVybl9vb3YsIDAsIDAsIDB9LAorICB7MCwgMCwgMCwgMCwgMH0KK307CisKK3N0YXRpYyBQeVR5cGVPYmplY3QgX19weXhfdHlwZV81a2VubG1fRnVsbFNjb3JlUmV0dXJuID0geworICBQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkKKyAgImtlbmxtLkZ1bGxTY29yZVJldHVybiIsIC8qdHBfbmFtZSovCisgIHNpemVvZihzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4pLCAvKnRwX2Jhc2ljc2l6ZSovCisgIDAsIC8qdHBfaXRlbXNpemUqLworICBfX3B5eF90cF9kZWFsbG9jXzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4sIC8qdHBfZGVhbGxvYyovCisgIDAsIC8qdHBfcHJpbnQqLworICAwLCAvKnRwX2dldGF0dHIqLworICAwLCAvKnRwX3NldGF0dHIqLworICAjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKKyAgMCwgLyp0cF9jb21wYXJlKi8KKyAgI2Vsc2UKKyAgMCwgLypyZXNlcnZlZCovCisgICNlbmRpZgorICBfX3B5eF9wd181a2VubG1fMTVGdWxsU2NvcmVSZXR1cm5fM19fcmVwcl9fLCAvKnRwX3JlcHIqLworICAwLCAvKnRwX2FzX251bWJlciovCisgIDAsIC8qdHBfYXNfc2VxdWVuY2UqLworICAwLCAvKnRwX2FzX21hcHBpbmcqLworICAwLCAvKnRwX2hhc2gqLworICAwLCAvKnRwX2NhbGwqLworICAwLCAvKnRwX3N0ciovCisgIDAsIC8qdHBfZ2V0YXR0cm8qLworICAwLCAvKnRwX3NldGF0dHJvKi8KKyAgMCwgLyp0cF9hc19idWZmZXIqLworICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHfFB5X1RQRkxBR1NfQ0hFQ0tUWVBFU3xQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLworICAiXG4gICAgV3JhcHBlciBhcm91bmQgRnVsbFNjb3JlUmV0dXJuLlxuXG4gICAgTm90ZXM6XG4gICAgICAgIGBwcm9iYCBoYXMgYmVlbiByZW5hbWVkIHRvIGBsb2dfcHJvYmBcbiAgICAgICAgYG9vdmAgaGFzIGJlZW4gYWRkZWQgdG8gZmxhZyB3aGV0aGVyIHRoZSB3b3JkIGlzIE9PVlxuICAgICIsIC8qdHBfZG9jKi8KKyAgMCwgLyp0cF90cmF2ZXJzZSovCisgIDAsIC8qdHBfY2xlYXIqLworICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgIDAsIC8qdHBfaXRlciovCisgIDAsIC8qdHBfaXRlcm5leHQqLworICBfX3B5eF9tZXRob2RzXzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4sIC8qdHBfbWV0aG9kcyovCisgIDAsIC8qdHBfbWVtYmVycyovCisgIF9fcHl4X2dldHNldHNfNWtlbmxtX0Z1bGxTY29yZVJldHVybiwgLyp0cF9nZXRzZXQqLworICAwLCAvKnRwX2Jhc2UqLworICAwLCAvKnRwX2RpY3QqLworICAwLCAvKnRwX2Rlc2NyX2dldCovCisgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgMCwgLyp0cF9pbml0Ki8KKyAgMCwgLyp0cF9hbGxvYyovCisgIF9fcHl4X3RwX25ld181a2VubG1fRnVsbFNjb3JlUmV0dXJuLCAvKnRwX25ldyovCisgIDAsIC8qdHBfZnJlZSovCisgIDAsIC8qdHBfaXNfZ2MqLworICAwLCAvKnRwX2Jhc2VzKi8KKyAgMCwgLyp0cF9tcm8qLworICAwLCAvKnRwX2NhY2hlKi8KKyAgMCwgLyp0cF9zdWJjbGFzc2VzKi8KKyAgMCwgLyp0cF93ZWFrbGlzdCovCisgIDAsIC8qdHBfZGVsKi8KKyAgMCwgLyp0cF92ZXJzaW9uX3RhZyovCisgICNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDQwMGExCisgIDAsIC8qdHBfZmluYWxpemUqLworICAjZW5kaWYKK307CisKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfdHBfbmV3XzVrZW5sbV9TdGF0ZShQeVR5cGVPYmplY3QgKnQsIENZVEhPTl9VTlVTRUQgUHlPYmplY3QgKmEsIENZVEhPTl9VTlVTRUQgUHlPYmplY3QgKmspIHsKKyAgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKnA7CisgIFB5T2JqZWN0ICpvOworICBpZiAobGlrZWx5KCh0LT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSVNfQUJTVFJBQ1QpID09IDApKSB7CisgICAgbyA9ICgqdC0+dHBfYWxsb2MpKHQsIDApOworICB9IGVsc2UgeworICAgIG8gPSAoUHlPYmplY3QgKikgUHlCYXNlT2JqZWN0X1R5cGUudHBfbmV3KHQsIF9fcHl4X2VtcHR5X3R1cGxlLCAwKTsKKyAgfQorICBpZiAodW5saWtlbHkoIW8pKSByZXR1cm4gMDsKKyAgcCA9ICgoc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKilvKTsKKyAgbmV3KCh2b2lkKikmKHAtPl9jX3N0YXRlKSkgbG06Om5ncmFtOjpTdGF0ZSgpOworICByZXR1cm4gbzsKK30KKworc3RhdGljIHZvaWQgX19weXhfdHBfZGVhbGxvY181a2VubG1fU3RhdGUoUHlPYmplY3QgKm8pIHsKKyAgc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKnAgPSAoc3RydWN0IF9fcHl4X29ial81a2VubG1fU3RhdGUgKilvOworICAjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzA0MDBhMQorICBpZiAodW5saWtlbHkoUHlfVFlQRShvKS0+dHBfZmluYWxpemUpICYmICghUHlUeXBlX0lTX0dDKFB5X1RZUEUobykpIHx8ICFfUHlHQ19GSU5BTElaRUQobykpKSB7CisgICAgaWYgKFB5T2JqZWN0X0NhbGxGaW5hbGl6ZXJGcm9tRGVhbGxvYyhvKSkgcmV0dXJuOworICB9CisgICNlbmRpZgorICBfX1B5eF9jYWxsX2Rlc3RydWN0b3IoJnAtPl9jX3N0YXRlKTsKKyAgKCpQeV9UWVBFKG8pLT50cF9mcmVlKShvKTsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIF9fcHl4X21ldGhvZHNfNWtlbmxtX1N0YXRlW10gPSB7CisgIHswLCAwLCAwLCAwfQorfTsKKworc3RhdGljIFB5VHlwZU9iamVjdCBfX3B5eF90eXBlXzVrZW5sbV9TdGF0ZSA9IHsKKyAgUHlWYXJPYmplY3RfSEVBRF9JTklUKDAsIDApCisgICJrZW5sbS5TdGF0ZSIsIC8qdHBfbmFtZSovCisgIHNpemVvZihzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9TdGF0ZSksIC8qdHBfYmFzaWNzaXplKi8KKyAgMCwgLyp0cF9pdGVtc2l6ZSovCisgIF9fcHl4X3RwX2RlYWxsb2NfNWtlbmxtX1N0YXRlLCAvKnRwX2RlYWxsb2MqLworICAwLCAvKnRwX3ByaW50Ki8KKyAgMCwgLyp0cF9nZXRhdHRyKi8KKyAgMCwgLyp0cF9zZXRhdHRyKi8KKyAgI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisgIDAsIC8qdHBfY29tcGFyZSovCisgICNlbHNlCisgIDAsIC8qcmVzZXJ2ZWQqLworICAjZW5kaWYKKyAgMCwgLyp0cF9yZXByKi8KKyAgMCwgLyp0cF9hc19udW1iZXIqLworICAwLCAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgMCwgLyp0cF9hc19tYXBwaW5nKi8KKyAgX19weXhfcHdfNWtlbmxtXzVTdGF0ZV8zX19oYXNoX18sIC8qdHBfaGFzaCovCisgIDAsIC8qdHBfY2FsbCovCisgIDAsIC8qdHBfc3RyKi8KKyAgMCwgLyp0cF9nZXRhdHRybyovCisgIDAsIC8qdHBfc2V0YXR0cm8qLworICAwLCAvKnRwX2FzX2J1ZmZlciovCisgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUd8UHlfVFBGTEFHU19DSEVDS1RZUEVTfFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVJ8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCisgICJcbiAgICBXcmFwcGVyIGFyb3VuZCBsbTo6bmdyYW06OlN0YXRlIHNvIHRoYXQgcHl0aG9uIGNvZGUgY2FuIG1ha2UgaW5jcmVtZW50YWwgcXVlcmllcy5cblxuICAgIE5vdGVzOlxuICAgICAgICAqIHJpY2ggY29tcGFyaXNvbnMgXG4gICAgICAgICogaGFzaGFibGVcbiAgICAiLCAvKnRwX2RvYyovCisgIDAsIC8qdHBfdHJhdmVyc2UqLworICAwLCAvKnRwX2NsZWFyKi8KKyAgX19weXhfcHdfNWtlbmxtXzVTdGF0ZV8xX19yaWNoY21wX18sIC8qdHBfcmljaGNvbXBhcmUqLworICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgMCwgLyp0cF9pdGVyKi8KKyAgMCwgLyp0cF9pdGVybmV4dCovCisgIF9fcHl4X21ldGhvZHNfNWtlbmxtX1N0YXRlLCAvKnRwX21ldGhvZHMqLworICAwLCAvKnRwX21lbWJlcnMqLworICAwLCAvKnRwX2dldHNldCovCisgIDAsIC8qdHBfYmFzZSovCisgIDAsIC8qdHBfZGljdCovCisgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAwLCAvKnRwX2luaXQqLworICAwLCAvKnRwX2FsbG9jKi8KKyAgX19weXhfdHBfbmV3XzVrZW5sbV9TdGF0ZSwgLyp0cF9uZXcqLworICAwLCAvKnRwX2ZyZWUqLworICAwLCAvKnRwX2lzX2djKi8KKyAgMCwgLyp0cF9iYXNlcyovCisgIDAsIC8qdHBfbXJvKi8KKyAgMCwgLyp0cF9jYWNoZSovCisgIDAsIC8qdHBfc3ViY2xhc3NlcyovCisgIDAsIC8qdHBfd2Vha2xpc3QqLworICAwLCAvKnRwX2RlbCovCisgIDAsIC8qdHBfdmVyc2lvbl90YWcqLworICAjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzA0MDBhMQorICAwLCAvKnRwX2ZpbmFsaXplKi8KKyAgI2VuZGlmCit9OworCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3RwX25ld181a2VubG1fTGFuZ3VhZ2VNb2RlbChQeVR5cGVPYmplY3QgKnQsIENZVEhPTl9VTlVTRUQgUHlPYmplY3QgKmEsIENZVEhPTl9VTlVTRUQgUHlPYmplY3QgKmspIHsKKyAgc3RydWN0IF9fcHl4X29ial81a2VubG1fTGFuZ3VhZ2VNb2RlbCAqcDsKKyAgUHlPYmplY3QgKm87CisgIGlmIChsaWtlbHkoKHQtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19JU19BQlNUUkFDVCkgPT0gMCkpIHsKKyAgICBvID0gKCp0LT50cF9hbGxvYykodCwgMCk7CisgIH0gZWxzZSB7CisgICAgbyA9IChQeU9iamVjdCAqKSBQeUJhc2VPYmplY3RfVHlwZS50cF9uZXcodCwgX19weXhfZW1wdHlfdHVwbGUsIDApOworICB9CisgIGlmICh1bmxpa2VseSghbykpIHJldHVybiAwOworICBwID0gKChzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsICopbyk7CisgIHAtPnBhdGggPSAoKFB5T2JqZWN0KilQeV9Ob25lKTsgUHlfSU5DUkVGKFB5X05vbmUpOworICByZXR1cm4gbzsKK30KKworc3RhdGljIHZvaWQgX19weXhfdHBfZGVhbGxvY181a2VubG1fTGFuZ3VhZ2VNb2RlbChQeU9iamVjdCAqbykgeworICBzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsICpwID0gKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKilvOworICAjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzA0MDBhMQorICBpZiAodW5saWtlbHkoUHlfVFlQRShvKS0+dHBfZmluYWxpemUpICYmICghUHlUeXBlX0lTX0dDKFB5X1RZUEUobykpIHx8ICFfUHlHQ19GSU5BTElaRUQobykpKSB7CisgICAgaWYgKFB5T2JqZWN0X0NhbGxGaW5hbGl6ZXJGcm9tRGVhbGxvYyhvKSkgcmV0dXJuOworICB9CisgICNlbmRpZgorICB7CisgICAgUHlPYmplY3QgKmV0eXBlLCAqZXZhbCwgKmV0YjsKKyAgICBQeUVycl9GZXRjaCgmZXR5cGUsICZldmFsLCAmZXRiKTsKKyAgICArK1B5X1JFRkNOVChvKTsKKyAgICBfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzNfX2RlYWxsb2NfXyhvKTsKKyAgICAtLVB5X1JFRkNOVChvKTsKKyAgICBQeUVycl9SZXN0b3JlKGV0eXBlLCBldmFsLCBldGIpOworICB9CisgIFB5X0NMRUFSKHAtPnBhdGgpOworICAoKlB5X1RZUEUobyktPnRwX2ZyZWUpKG8pOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X2dldHByb3BfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF9vcmRlcihQeU9iamVjdCAqbywgQ1lUSE9OX1VOVVNFRCB2b2lkICp4KSB7CisgIHJldHVybiBfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzVvcmRlcl8xX19nZXRfXyhvKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9nZXRwcm9wXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfcGF0aChQeU9iamVjdCAqbywgQ1lUSE9OX1VOVVNFRCB2b2lkICp4KSB7CisgIHJldHVybiBfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzRwYXRoXzFfX2dldF9fKG8pOworfQorCitzdGF0aWMgaW50IF9fcHl4X3NldHByb3BfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF9wYXRoKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqdiwgQ1lUSE9OX1VOVVNFRCB2b2lkICp4KSB7CisgIGlmICh2KSB7CisgICAgcmV0dXJuIF9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNHBhdGhfM19fc2V0X18obywgdik7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIF9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNHBhdGhfNV9fZGVsX18obyk7CisgIH0KK30KKworc3RhdGljIFB5TWV0aG9kRGVmIF9fcHl4X21ldGhvZHNfNWtlbmxtX0xhbmd1YWdlTW9kZWxbXSA9IHsKKyAgeyJzY29yZSIsIChQeUNGdW5jdGlvbilfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzVzY29yZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIDB9LAorICB7ImZ1bGxfc2NvcmVzIiwgKFB5Q0Z1bmN0aW9uKV9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfN2Z1bGxfc2NvcmVzLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgX19weXhfZG9jXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfNmZ1bGxfc2NvcmVzfSwKKyAgeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKV9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfMTRfX3JlZHVjZV9fLCBNRVRIX05PQVJHUywgMH0sCisgIHswLCAwLCAwLCAwfQorfTsKKworc3RhdGljIHN0cnVjdCBQeUdldFNldERlZiBfX3B5eF9nZXRzZXRzXzVrZW5sbV9MYW5ndWFnZU1vZGVsW10gPSB7CisgIHsoY2hhciAqKSJvcmRlciIsIF9fcHl4X2dldHByb3BfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF9vcmRlciwgMCwgMCwgMH0sCisgIHsoY2hhciAqKSJwYXRoIiwgX19weXhfZ2V0cHJvcF81a2VubG1fMTNMYW5ndWFnZU1vZGVsX3BhdGgsIF9fcHl4X3NldHByb3BfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF9wYXRoLCAwLCAwfSwKKyAgezAsIDAsIDAsIDAsIDB9Cit9OworCitzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgX19weXhfdHBfYXNfc2VxdWVuY2VfTGFuZ3VhZ2VNb2RlbCA9IHsKKyAgMCwgLypzcV9sZW5ndGgqLworICAwLCAvKnNxX2NvbmNhdCovCisgIDAsIC8qc3FfcmVwZWF0Ki8KKyAgMCwgLypzcV9pdGVtKi8KKyAgMCwgLypzcV9zbGljZSovCisgIDAsIC8qc3FfYXNzX2l0ZW0qLworICAwLCAvKnNxX2Fzc19zbGljZSovCisgIF9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfMTBfX2NvbnRhaW5zX18sIC8qc3FfY29udGFpbnMqLworICAwLCAvKnNxX2lucGxhY2VfY29uY2F0Ki8KKyAgMCwgLypzcV9pbnBsYWNlX3JlcGVhdCovCit9OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IF9fcHl4X3R5cGVfNWtlbmxtX0xhbmd1YWdlTW9kZWwgPSB7CisgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKQorICAia2VubG0uTGFuZ3VhZ2VNb2RlbCIsIC8qdHBfbmFtZSovCisgIHNpemVvZihzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9MYW5ndWFnZU1vZGVsKSwgLyp0cF9iYXNpY3NpemUqLworICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgX19weXhfdHBfZGVhbGxvY181a2VubG1fTGFuZ3VhZ2VNb2RlbCwgLyp0cF9kZWFsbG9jKi8KKyAgMCwgLyp0cF9wcmludCovCisgIDAsIC8qdHBfZ2V0YXR0ciovCisgIDAsIC8qdHBfc2V0YXR0ciovCisgICNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICAwLCAvKnRwX2NvbXBhcmUqLworICAjZWxzZQorICAwLCAvKnJlc2VydmVkKi8KKyAgI2VuZGlmCisgIF9fcHl4X3B3XzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfMTJfX3JlcHJfXywgLyp0cF9yZXByKi8KKyAgMCwgLyp0cF9hc19udW1iZXIqLworICAmX19weXhfdHBfYXNfc2VxdWVuY2VfTGFuZ3VhZ2VNb2RlbCwgLyp0cF9hc19zZXF1ZW5jZSovCisgIDAsIC8qdHBfYXNfbWFwcGluZyovCisgIDAsIC8qdHBfaGFzaCovCisgIDAsIC8qdHBfY2FsbCovCisgIDAsIC8qdHBfc3RyKi8KKyAgMCwgLyp0cF9nZXRhdHRybyovCisgIDAsIC8qdHBfc2V0YXR0cm8qLworICAwLCAvKnRwX2FzX2J1ZmZlciovCisgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUd8UHlfVFBGTEFHU19DSEVDS1RZUEVTfFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVJ8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCisgICJcbiAgICBUaGlzIGlzIG5vdCBhIHN0cmljdCB3cmFwcGVyLCB0aGUgaW50ZXJmYWNlIGlzIG1vcmUgcHl0aG9uaWMuXG4gICAgSXQgbG9hZHMgbW9kZWxzIGFuZCBxdWVyaWVzIGZ1bGwgc2VudGVuY2VzLlxuICAgICIsIC8qdHBfZG9jKi8KKyAgMCwgLyp0cF90cmF2ZXJzZSovCisgIDAsIC8qdHBfY2xlYXIqLworICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgIDAsIC8qdHBfaXRlciovCisgIDAsIC8qdHBfaXRlcm5leHQqLworICBfX3B5eF9tZXRob2RzXzVrZW5sbV9MYW5ndWFnZU1vZGVsLCAvKnRwX21ldGhvZHMqLworICAwLCAvKnRwX21lbWJlcnMqLworICBfX3B5eF9nZXRzZXRzXzVrZW5sbV9MYW5ndWFnZU1vZGVsLCAvKnRwX2dldHNldCovCisgIDAsIC8qdHBfYmFzZSovCisgIDAsIC8qdHBfZGljdCovCisgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICBfX3B5eF9wd181a2VubG1fMTNMYW5ndWFnZU1vZGVsXzFfX2luaXRfXywgLyp0cF9pbml0Ki8KKyAgMCwgLyp0cF9hbGxvYyovCisgIF9fcHl4X3RwX25ld181a2VubG1fTGFuZ3VhZ2VNb2RlbCwgLyp0cF9uZXcqLworICAwLCAvKnRwX2ZyZWUqLworICAwLCAvKnRwX2lzX2djKi8KKyAgMCwgLyp0cF9iYXNlcyovCisgIDAsIC8qdHBfbXJvKi8KKyAgMCwgLyp0cF9jYWNoZSovCisgIDAsIC8qdHBfc3ViY2xhc3NlcyovCisgIDAsIC8qdHBfd2Vha2xpc3QqLworICAwLCAvKnRwX2RlbCovCisgIDAsIC8qdHBfdmVyc2lvbl90YWcqLworICAjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzA0MDBhMQorICAwLCAvKnRwX2ZpbmFsaXplKi8KKyAgI2VuZGlmCit9OworCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X3RwX25ld181a2VubG1fTW9kZWwoUHlUeXBlT2JqZWN0ICp0LCBDWVRIT05fVU5VU0VEIFB5T2JqZWN0ICphLCBDWVRIT05fVU5VU0VEIFB5T2JqZWN0ICprKSB7CisgIHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICpwOworICBQeU9iamVjdCAqbzsKKyAgaWYgKGxpa2VseSgodC0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0lTX0FCU1RSQUNUKSA9PSAwKSkgeworICAgIG8gPSAoKnQtPnRwX2FsbG9jKSh0LCAwKTsKKyAgfSBlbHNlIHsKKyAgICBvID0gKFB5T2JqZWN0ICopIFB5QmFzZU9iamVjdF9UeXBlLnRwX25ldyh0LCBfX3B5eF9lbXB0eV90dXBsZSwgMCk7CisgIH0KKyAgaWYgKHVubGlrZWx5KCFvKSkgcmV0dXJuIDA7CisgIHAgPSAoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX01vZGVsICopbyk7CisgIHAtPnBhdGggPSAoKFB5T2JqZWN0KilQeV9Ob25lKTsgUHlfSU5DUkVGKFB5X05vbmUpOworICByZXR1cm4gbzsKK30KKworc3RhdGljIHZvaWQgX19weXhfdHBfZGVhbGxvY181a2VubG1fTW9kZWwoUHlPYmplY3QgKm8pIHsKKyAgc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwgKnAgPSAoc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwgKilvOworICAjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzA0MDBhMQorICBpZiAodW5saWtlbHkoUHlfVFlQRShvKS0+dHBfZmluYWxpemUpICYmICghUHlUeXBlX0lTX0dDKFB5X1RZUEUobykpIHx8ICFfUHlHQ19GSU5BTElaRUQobykpKSB7CisgICAgaWYgKFB5T2JqZWN0X0NhbGxGaW5hbGl6ZXJGcm9tRGVhbGxvYyhvKSkgcmV0dXJuOworICB9CisgICNlbmRpZgorICB7CisgICAgUHlPYmplY3QgKmV0eXBlLCAqZXZhbCwgKmV0YjsKKyAgICBQeUVycl9GZXRjaCgmZXR5cGUsICZldmFsLCAmZXRiKTsKKyAgICArK1B5X1JFRkNOVChvKTsKKyAgICBfX3B5eF9wd181a2VubG1fNU1vZGVsXzNfX2RlYWxsb2NfXyhvKTsKKyAgICAtLVB5X1JFRkNOVChvKTsKKyAgICBQeUVycl9SZXN0b3JlKGV0eXBlLCBldmFsLCBldGIpOworICB9CisgIFB5X0NMRUFSKHAtPnBhdGgpOworICAoKlB5X1RZUEUobyktPnRwX2ZyZWUpKG8pOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9fcHl4X2dldHByb3BfNWtlbmxtXzVNb2RlbF9vcmRlcihQeU9iamVjdCAqbywgQ1lUSE9OX1VOVVNFRCB2b2lkICp4KSB7CisgIHJldHVybiBfX3B5eF9wd181a2VubG1fNU1vZGVsXzVvcmRlcl8xX19nZXRfXyhvKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfX3B5eF9nZXRwcm9wXzVrZW5sbV81TW9kZWxfcGF0aChQeU9iamVjdCAqbywgQ1lUSE9OX1VOVVNFRCB2b2lkICp4KSB7CisgIHJldHVybiBfX3B5eF9wd181a2VubG1fNU1vZGVsXzRwYXRoXzFfX2dldF9fKG8pOworfQorCitzdGF0aWMgaW50IF9fcHl4X3NldHByb3BfNWtlbmxtXzVNb2RlbF9wYXRoKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqdiwgQ1lUSE9OX1VOVVNFRCB2b2lkICp4KSB7CisgIGlmICh2KSB7CisgICAgcmV0dXJuIF9fcHl4X3B3XzVrZW5sbV81TW9kZWxfNHBhdGhfM19fc2V0X18obywgdik7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIF9fcHl4X3B3XzVrZW5sbV81TW9kZWxfNHBhdGhfNV9fZGVsX18obyk7CisgIH0KK30KKworc3RhdGljIFB5TWV0aG9kRGVmIF9fcHl4X21ldGhvZHNfNWtlbmxtX01vZGVsW10gPSB7CisgIHsiQmVnaW5TZW50ZW5jZVdyaXRlIiwgKFB5Q0Z1bmN0aW9uKV9fcHl4X3B3XzVrZW5sbV81TW9kZWxfNUJlZ2luU2VudGVuY2VXcml0ZSwgTUVUSF9PLCBfX3B5eF9kb2NfNWtlbmxtXzVNb2RlbF80QmVnaW5TZW50ZW5jZVdyaXRlfSwKKyAgeyJOdWxsQ29udGV4dFdyaXRlIiwgKFB5Q0Z1bmN0aW9uKV9fcHl4X3B3XzVrZW5sbV81TW9kZWxfN051bGxDb250ZXh0V3JpdGUsIE1FVEhfTywgX19weXhfZG9jXzVrZW5sbV81TW9kZWxfNk51bGxDb250ZXh0V3JpdGV9LAorICB7IkJhc2VTY29yZSIsIChQeUNGdW5jdGlvbilfX3B5eF9wd181a2VubG1fNU1vZGVsXzlCYXNlU2NvcmUsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBfX3B5eF9kb2NfNWtlbmxtXzVNb2RlbF84QmFzZVNjb3JlfSwKKyAgeyJCYXNlRnVsbFNjb3JlIiwgKFB5Q0Z1bmN0aW9uKV9fcHl4X3B3XzVrZW5sbV81TW9kZWxfMTFCYXNlRnVsbFNjb3JlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgX19weXhfZG9jXzVrZW5sbV81TW9kZWxfMTBCYXNlRnVsbFNjb3JlfSwKKyAgeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKV9fcHl4X3B3XzVrZW5sbV81TW9kZWxfMTdfX3JlZHVjZV9fLCBNRVRIX05PQVJHUywgMH0sCisgIHswLCAwLCAwLCAwfQorfTsKKworc3RhdGljIHN0cnVjdCBQeUdldFNldERlZiBfX3B5eF9nZXRzZXRzXzVrZW5sbV9Nb2RlbFtdID0geworICB7KGNoYXIgKikib3JkZXIiLCBfX3B5eF9nZXRwcm9wXzVrZW5sbV81TW9kZWxfb3JkZXIsIDAsIDAsIDB9LAorICB7KGNoYXIgKikicGF0aCIsIF9fcHl4X2dldHByb3BfNWtlbmxtXzVNb2RlbF9wYXRoLCBfX3B5eF9zZXRwcm9wXzVrZW5sbV81TW9kZWxfcGF0aCwgMCwgMH0sCisgIHswLCAwLCAwLCAwLCAwfQorfTsKKworc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIF9fcHl4X3RwX2FzX3NlcXVlbmNlX01vZGVsID0geworICAwLCAvKnNxX2xlbmd0aCovCisgIDAsIC8qc3FfY29uY2F0Ki8KKyAgMCwgLypzcV9yZXBlYXQqLworICAwLCAvKnNxX2l0ZW0qLworICAwLCAvKnNxX3NsaWNlKi8KKyAgMCwgLypzcV9hc3NfaXRlbSovCisgIDAsIC8qc3FfYXNzX3NsaWNlKi8KKyAgX19weXhfcHdfNWtlbmxtXzVNb2RlbF8xM19fY29udGFpbnNfXywgLypzcV9jb250YWlucyovCisgIDAsIC8qc3FfaW5wbGFjZV9jb25jYXQqLworICAwLCAvKnNxX2lucGxhY2VfcmVwZWF0Ki8KK307CisKK3N0YXRpYyBQeVR5cGVPYmplY3QgX19weXhfdHlwZV81a2VubG1fTW9kZWwgPSB7CisgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKQorICAia2VubG0uTW9kZWwiLCAvKnRwX25hbWUqLworICBzaXplb2Yoc3RydWN0IF9fcHl4X29ial81a2VubG1fTW9kZWwpLCAvKnRwX2Jhc2ljc2l6ZSovCisgIDAsIC8qdHBfaXRlbXNpemUqLworICBfX3B5eF90cF9kZWFsbG9jXzVrZW5sbV9Nb2RlbCwgLyp0cF9kZWFsbG9jKi8KKyAgMCwgLyp0cF9wcmludCovCisgIDAsIC8qdHBfZ2V0YXR0ciovCisgIDAsIC8qdHBfc2V0YXR0ciovCisgICNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICAwLCAvKnRwX2NvbXBhcmUqLworICAjZWxzZQorICAwLCAvKnJlc2VydmVkKi8KKyAgI2VuZGlmCisgIF9fcHl4X3B3XzVrZW5sbV81TW9kZWxfMTVfX3JlcHJfXywgLyp0cF9yZXByKi8KKyAgMCwgLyp0cF9hc19udW1iZXIqLworICAmX19weXhfdHBfYXNfc2VxdWVuY2VfTW9kZWwsIC8qdHBfYXNfc2VxdWVuY2UqLworICAwLCAvKnRwX2FzX21hcHBpbmcqLworICAwLCAvKnRwX2hhc2gqLworICAwLCAvKnRwX2NhbGwqLworICAwLCAvKnRwX3N0ciovCisgIDAsIC8qdHBfZ2V0YXR0cm8qLworICAwLCAvKnRwX3NldGF0dHJvKi8KKyAgMCwgLyp0cF9hc19idWZmZXIqLworICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHfFB5X1RQRkxBR1NfQ0hFQ0tUWVBFU3xQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLworICAiXG4gICAgVGhpcyBpcyBjbG9zZXIgdG8gYSB3cmFwcGVyIGFyb3VuZCBsbTo6bmdyYW06Ok1vZGVsLlxuICAgICIsIC8qdHBfZG9jKi8KKyAgMCwgLyp0cF90cmF2ZXJzZSovCisgIDAsIC8qdHBfY2xlYXIqLworICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgIDAsIC8qdHBfaXRlciovCisgIDAsIC8qdHBfaXRlcm5leHQqLworICBfX3B5eF9tZXRob2RzXzVrZW5sbV9Nb2RlbCwgLyp0cF9tZXRob2RzKi8KKyAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgX19weXhfZ2V0c2V0c181a2VubG1fTW9kZWwsIC8qdHBfZ2V0c2V0Ki8KKyAgMCwgLyp0cF9iYXNlKi8KKyAgMCwgLyp0cF9kaWN0Ki8KKyAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAwLCAvKnRwX2Rlc2NyX3NldCovCisgIDAsIC8qdHBfZGljdG9mZnNldCovCisgIF9fcHl4X3B3XzVrZW5sbV81TW9kZWxfMV9faW5pdF9fLCAvKnRwX2luaXQqLworICAwLCAvKnRwX2FsbG9jKi8KKyAgX19weXhfdHBfbmV3XzVrZW5sbV9Nb2RlbCwgLyp0cF9uZXcqLworICAwLCAvKnRwX2ZyZWUqLworICAwLCAvKnRwX2lzX2djKi8KKyAgMCwgLyp0cF9iYXNlcyovCisgIDAsIC8qdHBfbXJvKi8KKyAgMCwgLyp0cF9jYWNoZSovCisgIDAsIC8qdHBfc3ViY2xhc3NlcyovCisgIDAsIC8qdHBfd2Vha2xpc3QqLworICAwLCAvKnRwX2RlbCovCisgIDAsIC8qdHBfdmVyc2lvbl90YWcqLworICAjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzA0MDBhMQorICAwLCAvKnRwX2ZpbmFsaXplKi8KKyAgI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IF9fcHl4X29ial81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyAqX19weXhfZnJlZWxpc3RfNWtlbmxtX19fcHl4X3Njb3BlX3N0cnVjdF9fZnVsbF9zY29yZXNbOF07CitzdGF0aWMgaW50IF9fcHl4X2ZyZWVjb3VudF81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyA9IDA7CisKK3N0YXRpYyBQeU9iamVjdCAqX19weXhfdHBfbmV3XzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzKFB5VHlwZU9iamVjdCAqdCwgQ1lUSE9OX1VOVVNFRCBQeU9iamVjdCAqYSwgQ1lUSE9OX1VOVVNFRCBQeU9iamVjdCAqaykgeworICBzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzICpwOworICBQeU9iamVjdCAqbzsKKyAgaWYgKENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTiAmJiBsaWtlbHkoKF9fcHl4X2ZyZWVjb3VudF81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyA+IDApICYgKHQtPnRwX2Jhc2ljc2l6ZSA9PSBzaXplb2Yoc3RydWN0IF9fcHl4X29ial81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcykpKSkgeworICAgIG8gPSAoUHlPYmplY3QqKV9fcHl4X2ZyZWVsaXN0XzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzWy0tX19weXhfZnJlZWNvdW50XzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzXTsKKyAgICBtZW1zZXQobywgMCwgc2l6ZW9mKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX19fcHl4X3Njb3BlX3N0cnVjdF9fZnVsbF9zY29yZXMpKTsKKyAgICAodm9pZCkgUHlPYmplY3RfSU5JVChvLCB0KTsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhvKTsKKyAgfSBlbHNlIHsKKyAgICBvID0gKCp0LT50cF9hbGxvYykodCwgMCk7CisgICAgaWYgKHVubGlrZWx5KCFvKSkgcmV0dXJuIDA7CisgIH0KKyAgcCA9ICgoc3RydWN0IF9fcHl4X29ial81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyAqKW8pOworICBuZXcoKHZvaWQqKSYocC0+X19weXhfdl9vdXRfc3RhdGUpKSBsbTo6bmdyYW06OlN0YXRlKCk7CisgIG5ldygodm9pZCopJihwLT5fX3B5eF92X3N0YXRlKSkgbG06Om5ncmFtOjpTdGF0ZSgpOworICByZXR1cm4gbzsKK30KKworc3RhdGljIHZvaWQgX19weXhfdHBfZGVhbGxvY181a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyhQeU9iamVjdCAqbykgeworICBzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzICpwID0gKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX19fcHl4X3Njb3BlX3N0cnVjdF9fZnVsbF9zY29yZXMgKilvOworICBQeU9iamVjdF9HQ19VblRyYWNrKG8pOworICBfX1B5eF9jYWxsX2Rlc3RydWN0b3IoJnAtPl9fcHl4X3Zfb3V0X3N0YXRlKTsKKyAgX19QeXhfY2FsbF9kZXN0cnVjdG9yKCZwLT5fX3B5eF92X3N0YXRlKTsKKyAgUHlfQ0xFQVIocC0+X19weXhfdl9ib3MpOworICBQeV9DTEVBUihwLT5fX3B5eF92X2Vvcyk7CisgIFB5X0NMRUFSKHAtPl9fcHl4X3Zfc2VsZik7CisgIFB5X0NMRUFSKHAtPl9fcHl4X3Zfc2VudGVuY2UpOworICBQeV9DTEVBUihwLT5fX3B5eF92X3dvcmQpOworICBQeV9DTEVBUihwLT5fX3B5eF92X3dvcmRzKTsKKyAgUHlfQ0xFQVIocC0+X19weXhfdF8wKTsKKyAgaWYgKENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTiAmJiAoKF9fcHl4X2ZyZWVjb3VudF81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyA8IDgpICYgKFB5X1RZUEUobyktPnRwX2Jhc2ljc2l6ZSA9PSBzaXplb2Yoc3RydWN0IF9fcHl4X29ial81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcykpKSkgeworICAgIF9fcHl4X2ZyZWVsaXN0XzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzW19fcHl4X2ZyZWVjb3VudF81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcysrXSA9ICgoc3RydWN0IF9fcHl4X29ial81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyAqKW8pOworICB9IGVsc2UgeworICAgICgqUHlfVFlQRShvKS0+dHBfZnJlZSkobyk7CisgIH0KK30KKworc3RhdGljIGludCBfX3B5eF90cF90cmF2ZXJzZV81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyhQeU9iamVjdCAqbywgdmlzaXRwcm9jIHYsIHZvaWQgKmEpIHsKKyAgaW50IGU7CisgIHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX19fcHl4X3Njb3BlX3N0cnVjdF9fZnVsbF9zY29yZXMgKnAgPSAoc3RydWN0IF9fcHl4X29ial81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyAqKW87CisgIGlmIChwLT5fX3B5eF92X2JvcykgeworICAgIGUgPSAoKnYpKHAtPl9fcHl4X3ZfYm9zLCBhKTsgaWYgKGUpIHJldHVybiBlOworICB9CisgIGlmIChwLT5fX3B5eF92X2VvcykgeworICAgIGUgPSAoKnYpKHAtPl9fcHl4X3ZfZW9zLCBhKTsgaWYgKGUpIHJldHVybiBlOworICB9CisgIGlmIChwLT5fX3B5eF92X3NlbGYpIHsKKyAgICBlID0gKCp2KSgoKFB5T2JqZWN0KilwLT5fX3B5eF92X3NlbGYpLCBhKTsgaWYgKGUpIHJldHVybiBlOworICB9CisgIGlmIChwLT5fX3B5eF92X3NlbnRlbmNlKSB7CisgICAgZSA9ICgqdikocC0+X19weXhfdl9zZW50ZW5jZSwgYSk7IGlmIChlKSByZXR1cm4gZTsKKyAgfQorICBpZiAocC0+X19weXhfdl93b3JkKSB7CisgICAgZSA9ICgqdikocC0+X19weXhfdl93b3JkLCBhKTsgaWYgKGUpIHJldHVybiBlOworICB9CisgIGlmIChwLT5fX3B5eF92X3dvcmRzKSB7CisgICAgZSA9ICgqdikocC0+X19weXhfdl93b3JkcywgYSk7IGlmIChlKSByZXR1cm4gZTsKKyAgfQorICBpZiAocC0+X19weXhfdF8wKSB7CisgICAgZSA9ICgqdikocC0+X19weXhfdF8wLCBhKTsgaWYgKGUpIHJldHVybiBlOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fcHl4X3RwX2NsZWFyXzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzKFB5T2JqZWN0ICpvKSB7CisgIFB5T2JqZWN0KiB0bXA7CisgIHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX19fcHl4X3Njb3BlX3N0cnVjdF9fZnVsbF9zY29yZXMgKnAgPSAoc3RydWN0IF9fcHl4X29ial81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyAqKW87CisgIHRtcCA9ICgoUHlPYmplY3QqKXAtPl9fcHl4X3ZfYm9zKTsKKyAgcC0+X19weXhfdl9ib3MgPSBQeV9Ob25lOyBQeV9JTkNSRUYoUHlfTm9uZSk7CisgIFB5X1hERUNSRUYodG1wKTsKKyAgdG1wID0gKChQeU9iamVjdCopcC0+X19weXhfdl9lb3MpOworICBwLT5fX3B5eF92X2VvcyA9IFB5X05vbmU7IFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgUHlfWERFQ1JFRih0bXApOworICB0bXAgPSAoKFB5T2JqZWN0KilwLT5fX3B5eF92X3NlbGYpOworICBwLT5fX3B5eF92X3NlbGYgPSAoKHN0cnVjdCBfX3B5eF9vYmpfNWtlbmxtX0xhbmd1YWdlTW9kZWwgKilQeV9Ob25lKTsgUHlfSU5DUkVGKFB5X05vbmUpOworICBQeV9YREVDUkVGKHRtcCk7CisgIHRtcCA9ICgoUHlPYmplY3QqKXAtPl9fcHl4X3Zfc2VudGVuY2UpOworICBwLT5fX3B5eF92X3NlbnRlbmNlID0gUHlfTm9uZTsgUHlfSU5DUkVGKFB5X05vbmUpOworICBQeV9YREVDUkVGKHRtcCk7CisgIHRtcCA9ICgoUHlPYmplY3QqKXAtPl9fcHl4X3Zfd29yZCk7CisgIHAtPl9fcHl4X3Zfd29yZCA9IFB5X05vbmU7IFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgUHlfWERFQ1JFRih0bXApOworICB0bXAgPSAoKFB5T2JqZWN0KilwLT5fX3B5eF92X3dvcmRzKTsKKyAgcC0+X19weXhfdl93b3JkcyA9ICgoUHlPYmplY3QqKVB5X05vbmUpOyBQeV9JTkNSRUYoUHlfTm9uZSk7CisgIFB5X1hERUNSRUYodG1wKTsKKyAgdG1wID0gKChQeU9iamVjdCopcC0+X19weXhfdF8wKTsKKyAgcC0+X19weXhfdF8wID0gUHlfTm9uZTsgUHlfSU5DUkVGKFB5X05vbmUpOworICBQeV9YREVDUkVGKHRtcCk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgUHlUeXBlT2JqZWN0IF9fcHl4X3R5cGVfNWtlbmxtX19fcHl4X3Njb3BlX3N0cnVjdF9fZnVsbF9zY29yZXMgPSB7CisgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKQorICAia2VubG0uX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcyIsIC8qdHBfbmFtZSovCisgIHNpemVvZihzdHJ1Y3QgX19weXhfb2JqXzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzKSwgLyp0cF9iYXNpY3NpemUqLworICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgX19weXhfdHBfZGVhbGxvY181a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcywgLyp0cF9kZWFsbG9jKi8KKyAgMCwgLyp0cF9wcmludCovCisgIDAsIC8qdHBfZ2V0YXR0ciovCisgIDAsIC8qdHBfc2V0YXR0ciovCisgICNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICAwLCAvKnRwX2NvbXBhcmUqLworICAjZWxzZQorICAwLCAvKnJlc2VydmVkKi8KKyAgI2VuZGlmCisgIDAsIC8qdHBfcmVwciovCisgIDAsIC8qdHBfYXNfbnVtYmVyKi8KKyAgMCwgLyp0cF9hc19zZXF1ZW5jZSovCisgIDAsIC8qdHBfYXNfbWFwcGluZyovCisgIDAsIC8qdHBfaGFzaCovCisgIDAsIC8qdHBfY2FsbCovCisgIDAsIC8qdHBfc3RyKi8KKyAgMCwgLyp0cF9nZXRhdHRybyovCisgIDAsIC8qdHBfc2V0YXR0cm8qLworICAwLCAvKnRwX2FzX2J1ZmZlciovCisgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUd8UHlfVFBGTEFHU19DSEVDS1RZUEVTfFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVJ8UHlfVFBGTEFHU19IQVZFX0dDLCAvKnRwX2ZsYWdzKi8KKyAgMCwgLyp0cF9kb2MqLworICBfX3B5eF90cF90cmF2ZXJzZV81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcywgLyp0cF90cmF2ZXJzZSovCisgIF9fcHl4X3RwX2NsZWFyXzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzLCAvKnRwX2NsZWFyKi8KKyAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAwLCAvKnRwX2l0ZXIqLworICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgMCwgLyp0cF9tZXRob2RzKi8KKyAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgMCwgLyp0cF9nZXRzZXQqLworICAwLCAvKnRwX2Jhc2UqLworICAwLCAvKnRwX2RpY3QqLworICAwLCAvKnRwX2Rlc2NyX2dldCovCisgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgMCwgLyp0cF9pbml0Ki8KKyAgMCwgLyp0cF9hbGxvYyovCisgIF9fcHl4X3RwX25ld181a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3JlcywgLyp0cF9uZXcqLworICAwLCAvKnRwX2ZyZWUqLworICAwLCAvKnRwX2lzX2djKi8KKyAgMCwgLyp0cF9iYXNlcyovCisgIDAsIC8qdHBfbXJvKi8KKyAgMCwgLyp0cF9jYWNoZSovCisgIDAsIC8qdHBfc3ViY2xhc3NlcyovCisgIDAsIC8qdHBfd2Vha2xpc3QqLworICAwLCAvKnRwX2RlbCovCisgIDAsIC8qdHBfdmVyc2lvbl90YWcqLworICAjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzA0MDBhMQorICAwLCAvKnRwX2ZpbmFsaXplKi8KKyAgI2VuZGlmCit9OworCitzdGF0aWMgUHlNZXRob2REZWYgX19weXhfbWV0aG9kc1tdID0geworICB7MCwgMCwgMCwgMH0KK307CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKK3N0YXRpYyBzdHJ1Y3QgUHlNb2R1bGVEZWYgX19weXhfbW9kdWxlZGVmID0geworICAjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDIwMDAwCisgICAgeyBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkgTlVMTCwgMCwgTlVMTCB9LAorICAjZWxzZQorICAgIFB5TW9kdWxlRGVmX0hFQURfSU5JVCwKKyAgI2VuZGlmCisgICAgImtlbmxtIiwKKyAgICAwLCAvKiBtX2RvYyAqLworICAgIC0xLCAvKiBtX3NpemUgKi8KKyAgICBfX3B5eF9tZXRob2RzIC8qIG1fbWV0aG9kcyAqLywKKyAgICBOVUxMLCAvKiBtX3JlbG9hZCAqLworICAgIE5VTEwsIC8qIG1fdHJhdmVyc2UgKi8KKyAgICBOVUxMLCAvKiBtX2NsZWFyICovCisgICAgTlVMTCAvKiBtX2ZyZWUgKi8KK307CisjZW5kaWYKKworc3RhdGljIF9fUHl4X1N0cmluZ1RhYkVudHJ5IF9fcHl4X3N0cmluZ190YWJbXSA9IHsKKyAgeyZfX3B5eF9rcF9zXzBfMV8yXzMsIF9fcHl4X2tfMF8xXzJfMywgc2l6ZW9mKF9fcHl4X2tfMF8xXzJfMyksIDAsIDAsIDEsIDB9LAorICB7Jl9fcHl4X2twX3NfQ2Fubm90X2NvbnZlcnRfc190b19zdHJpbmcsIF9fcHl4X2tfQ2Fubm90X2NvbnZlcnRfc190b19zdHJpbmcsIHNpemVvZihfX3B5eF9rX0Nhbm5vdF9jb252ZXJ0X3NfdG9fc3RyaW5nKSwgMCwgMCwgMSwgMH0sCisgIHsmX19weXhfa3Bfc19DYW5ub3RfcmVhZF9tb2RlbCwgX19weXhfa19DYW5ub3RfcmVhZF9tb2RlbCwgc2l6ZW9mKF9fcHl4X2tfQ2Fubm90X3JlYWRfbW9kZWwpLCAwLCAwLCAxLCAwfSwKKyAgeyZfX3B5eF9uX3NfSU9FcnJvciwgX19weXhfa19JT0Vycm9yLCBzaXplb2YoX19weXhfa19JT0Vycm9yKSwgMCwgMCwgMSwgMX0sCisgIHsmX19weXhfbl9zX0xhbmd1YWdlTW9kZWwsIF9fcHl4X2tfTGFuZ3VhZ2VNb2RlbCwgc2l6ZW9mKF9fcHl4X2tfTGFuZ3VhZ2VNb2RlbCksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X2twX3NfTGFuZ3VhZ2VNb2RlbF9mcm9tXzAsIF9fcHl4X2tfTGFuZ3VhZ2VNb2RlbF9mcm9tXzAsIHNpemVvZihfX3B5eF9rX0xhbmd1YWdlTW9kZWxfZnJvbV8wKSwgMCwgMCwgMSwgMH0sCisgIHsmX19weXhfbl9zX0xhbmd1YWdlTW9kZWxfZnVsbF9zY29yZXMsIF9fcHl4X2tfTGFuZ3VhZ2VNb2RlbF9mdWxsX3Njb3Jlcywgc2l6ZW9mKF9fcHl4X2tfTGFuZ3VhZ2VNb2RlbF9mdWxsX3Njb3JlcyksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X2twX3NfTW9kZWxfZnJvbV8wLCBfX3B5eF9rX01vZGVsX2Zyb21fMCwgc2l6ZW9mKF9fcHl4X2tfTW9kZWxfZnJvbV8wKSwgMCwgMCwgMSwgMH0sCisgIHsmX19weXhfbl9zX1J1bnRpbWVFcnJvciwgX19weXhfa19SdW50aW1lRXJyb3IsIHNpemVvZihfX3B5eF9rX1J1bnRpbWVFcnJvciksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X25fc19UeXBlRXJyb3IsIF9fcHl4X2tfVHlwZUVycm9yLCBzaXplb2YoX19weXhfa19UeXBlRXJyb3IpLCAwLCAwLCAxLCAxfSwKKyAgeyZfX3B5eF9rcF9zX18yLCBfX3B5eF9rX18yLCBzaXplb2YoX19weXhfa19fMiksIDAsIDAsIDEsIDB9LAorICB7Jl9fcHl4X2twX3NfXzMsIF9fcHl4X2tfXzMsIHNpemVvZihfX3B5eF9rX18zKSwgMCwgMCwgMSwgMH0sCisgIHsmX19weXhfbl9zX2Fic3BhdGgsIF9fcHl4X2tfYWJzcGF0aCwgc2l6ZW9mKF9fcHl4X2tfYWJzcGF0aCksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X25fc19hcmdzLCBfX3B5eF9rX2FyZ3MsIHNpemVvZihfX3B5eF9rX2FyZ3MpLCAwLCAwLCAxLCAxfSwKKyAgeyZfX3B5eF9uX3NfYmFzZW5hbWUsIF9fcHl4X2tfYmFzZW5hbWUsIHNpemVvZihfX3B5eF9rX2Jhc2VuYW1lKSwgMCwgMCwgMSwgMX0sCisgIHsmX19weXhfbl9zX2JvcywgX19weXhfa19ib3MsIHNpemVvZihfX3B5eF9rX2JvcyksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X25fc19jbGFzcywgX19weXhfa19jbGFzcywgc2l6ZW9mKF9fcHl4X2tfY2xhc3MpLCAwLCAwLCAxLCAxfSwKKyAgeyZfX3B5eF9uX3NfY2xvc2UsIF9fcHl4X2tfY2xvc2UsIHNpemVvZihfX3B5eF9rX2Nsb3NlKSwgMCwgMCwgMSwgMX0sCisgIHsmX19weXhfbl9zX2VuY29kZSwgX19weXhfa19lbmNvZGUsIHNpemVvZihfX3B5eF9rX2VuY29kZSksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X25fc19lb3MsIF9fcHl4X2tfZW9zLCBzaXplb2YoX19weXhfa19lb3MpLCAwLCAwLCAxLCAxfSwKKyAgeyZfX3B5eF9uX3NfZm9ybWF0LCBfX3B5eF9rX2Zvcm1hdCwgc2l6ZW9mKF9fcHl4X2tfZm9ybWF0KSwgMCwgMCwgMSwgMX0sCisgIHsmX19weXhfbl9zX2Z1bGxfc2NvcmVzLCBfX3B5eF9rX2Z1bGxfc2NvcmVzLCBzaXplb2YoX19weXhfa19mdWxsX3Njb3JlcyksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X25fc19pbXBvcnQsIF9fcHl4X2tfaW1wb3J0LCBzaXplb2YoX19weXhfa19pbXBvcnQpLCAwLCAwLCAxLCAxfSwKKyAgeyZfX3B5eF9uX3NfaW5fc3RhdGUsIF9fcHl4X2tfaW5fc3RhdGUsIHNpemVvZihfX3B5eF9rX2luX3N0YXRlKSwgMCwgMCwgMSwgMX0sCisgIHsmX19weXhfbl9zX2tlbmxtLCBfX3B5eF9rX2tlbmxtLCBzaXplb2YoX19weXhfa19rZW5sbSksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X25fc19sb2dfcHJvYiwgX19weXhfa19sb2dfcHJvYiwgc2l6ZW9mKF9fcHl4X2tfbG9nX3Byb2IpLCAwLCAwLCAxLCAxfSwKKyAgeyZfX3B5eF9uX3NfbWFpbiwgX19weXhfa19tYWluLCBzaXplb2YoX19weXhfa19tYWluKSwgMCwgMCwgMSwgMX0sCisgIHsmX19weXhfbl9zX25hbWUsIF9fcHl4X2tfbmFtZSwgc2l6ZW9mKF9fcHl4X2tfbmFtZSksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X25fc19uZ3JhbV9sZW5ndGgsIF9fcHl4X2tfbmdyYW1fbGVuZ3RoLCBzaXplb2YoX19weXhfa19uZ3JhbV9sZW5ndGgpLCAwLCAwLCAxLCAxfSwKKyAgeyZfX3B5eF9uX3Nfb292LCBfX3B5eF9rX29vdiwgc2l6ZW9mKF9fcHl4X2tfb292KSwgMCwgMCwgMSwgMX0sCisgIHsmX19weXhfbl9zX29zLCBfX3B5eF9rX29zLCBzaXplb2YoX19weXhfa19vcyksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X25fc19vdXRfc3RhdGUsIF9fcHl4X2tfb3V0X3N0YXRlLCBzaXplb2YoX19weXhfa19vdXRfc3RhdGUpLCAwLCAwLCAxLCAxfSwKKyAgeyZfX3B5eF9uX3NfcGF0aCwgX19weXhfa19wYXRoLCBzaXplb2YoX19weXhfa19wYXRoKSwgMCwgMCwgMSwgMX0sCisgIHsmX19weXhfbl9zX3JlcGxhY2UsIF9fcHl4X2tfcmVwbGFjZSwgc2l6ZW9mKF9fcHl4X2tfcmVwbGFjZSksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X25fc19zZW5kLCBfX3B5eF9rX3NlbmQsIHNpemVvZihfX3B5eF9rX3NlbmQpLCAwLCAwLCAxLCAxfSwKKyAgeyZfX3B5eF9uX3Nfc2VudGVuY2UsIF9fcHl4X2tfc2VudGVuY2UsIHNpemVvZihfX3B5eF9rX3NlbnRlbmNlKSwgMCwgMCwgMSwgMX0sCisgIHsmX19weXhfbl9zX3NwbGl0LCBfX3B5eF9rX3NwbGl0LCBzaXplb2YoX19weXhfa19zcGxpdCksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X25fc190ZXN0LCBfX3B5eF9rX3Rlc3QsIHNpemVvZihfX3B5eF9rX3Rlc3QpLCAwLCAwLCAxLCAxfSwKKyAgeyZfX3B5eF9uX3NfdGhyb3csIF9fcHl4X2tfdGhyb3csIHNpemVvZihfX3B5eF9rX3Rocm93KSwgMCwgMCwgMSwgMX0sCisgIHsmX19weXhfbl9zX3V0ZjgsIF9fcHl4X2tfdXRmOCwgc2l6ZW9mKF9fcHl4X2tfdXRmOCksIDAsIDAsIDEsIDF9LAorICB7Jl9fcHl4X25fc193b3JkLCBfX3B5eF9rX3dvcmQsIHNpemVvZihfX3B5eF9rX3dvcmQpLCAwLCAwLCAxLCAxfSwKKyAgezAsIDAsIDAsIDAsIDAsIDAsIDB9Cit9Oworc3RhdGljIGludCBfX1B5eF9Jbml0Q2FjaGVkQnVpbHRpbnModm9pZCkgeworICBfX3B5eF9idWlsdGluX1R5cGVFcnJvciA9IF9fUHl4X0dldEJ1aWx0aW5OYW1lKF9fcHl4X25fc19UeXBlRXJyb3IpOyBpZiAoIV9fcHl4X2J1aWx0aW5fVHlwZUVycm9yKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF9idWlsdGluX1J1bnRpbWVFcnJvciA9IF9fUHl4X0dldEJ1aWx0aW5OYW1lKF9fcHl4X25fc19SdW50aW1lRXJyb3IpOyBpZiAoIV9fcHl4X2J1aWx0aW5fUnVudGltZUVycm9yKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA5MzsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19weXhfYnVpbHRpbl9JT0Vycm9yID0gX19QeXhfR2V0QnVpbHRpbk5hbWUoX19weXhfbl9zX0lPRXJyb3IpOyBpZiAoIV9fcHl4X2J1aWx0aW5fSU9FcnJvcikge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gOTU7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIHJldHVybiAwOworICBfX3B5eF9MMV9lcnJvcjo7CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBfX1B5eF9Jbml0Q2FjaGVkQ29uc3RhbnRzKHZvaWQpIHsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgX19QeXhfUmVmTmFubnlTZXR1cENvbnRleHQoIl9fUHl4X0luaXRDYWNoZWRDb25zdGFudHMiLCAwKTsKKworICAvKiAia2VubG0ucHl4Ijo4CisgKiAgICAgICAgIHJldHVybiBkYXRhCisgKiAgICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpOgorICogICAgICAgICByZXR1cm4gZGF0YS5lbmNvZGUoJ3V0ZjgnKSAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgcmFpc2UgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAlcyB0byBzdHJpbmcnICUgdHlwZShkYXRhKSkKKyAqIAorICovCisgIF9fcHl4X3R1cGxlXyA9IFB5VHVwbGVfUGFjaygxLCBfX3B5eF9uX3NfdXRmOCk7IGlmICh1bmxpa2VseSghX19weXhfdHVwbGVfKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gODsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfR09UUkVGKF9fcHl4X3R1cGxlXyk7CisgIF9fUHl4X0dJVkVSRUYoX19weXhfdHVwbGVfKTsKKworICAvKiAia2VubG0ucHl4Ijo5NAorICogICAgICAgICAgICAgc2VsZi5tb2RlbCA9IF9rZW5sbS5Mb2FkVmlydHVhbChzZWxmLnBhdGgpCisgKiAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZXhjZXB0aW9uOgorICogICAgICAgICAgICAgZXhjZXB0aW9uX21lc3NhZ2UgPSBzdHIoZXhjZXB0aW9uKS5yZXBsYWNlKCdcbicsICcgJykgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignQ2Fubm90IHJlYWQgbW9kZWwgXCd7fVwnICh7fSknLmZvcm1hdChwYXRoLCBleGNlcHRpb25fbWVzc2FnZSkpXAorICogICAgICAgICAgICAgICAgICAgICBmcm9tIGV4Y2VwdGlvbgorICovCisgIF9fcHl4X3R1cGxlX180ID0gUHlUdXBsZV9QYWNrKDIsIF9fcHl4X2twX3NfXzIsIF9fcHl4X2twX3NfXzMpOyBpZiAodW5saWtlbHkoIV9fcHl4X3R1cGxlX180KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gOTQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0dPVFJFRihfX3B5eF90dXBsZV9fNCk7CisgIF9fUHl4X0dJVkVSRUYoX19weXhfdHVwbGVfXzQpOworCisgIC8qICJrZW5sbS5weXgiOjE3OAorICogICAgICAgICAgICAgc2VsZi5tb2RlbCA9IF9rZW5sbS5Mb2FkVmlydHVhbChzZWxmLnBhdGgpCisgKiAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZXhjZXB0aW9uOgorICogICAgICAgICAgICAgZXhjZXB0aW9uX21lc3NhZ2UgPSBzdHIoZXhjZXB0aW9uKS5yZXBsYWNlKCdcbicsICcgJykgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignQ2Fubm90IHJlYWQgbW9kZWwgXCd7fVwnICh7fSknLmZvcm1hdChwYXRoLCBleGNlcHRpb25fbWVzc2FnZSkpXAorICogICAgICAgICAgICAgICAgICAgICBmcm9tIGV4Y2VwdGlvbgorICovCisgIF9fcHl4X3R1cGxlX181ID0gUHlUdXBsZV9QYWNrKDIsIF9fcHl4X2twX3NfXzIsIF9fcHl4X2twX3NfXzMpOyBpZiAodW5saWtlbHkoIV9fcHl4X3R1cGxlX181KSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTc4OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdHVwbGVfXzUpOworICBfX1B5eF9HSVZFUkVGKF9fcHl4X3R1cGxlX181KTsKKyAgX19QeXhfUmVmTmFubnlGaW5pc2hDb250ZXh0KCk7CisgIHJldHVybiAwOworICBfX3B5eF9MMV9lcnJvcjo7CisgIF9fUHl4X1JlZk5hbm55RmluaXNoQ29udGV4dCgpOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgX19QeXhfSW5pdEdsb2JhbHModm9pZCkgeworICBpZiAoX19QeXhfSW5pdFN0cmluZ3MoX19weXhfc3RyaW5nX3RhYikgPCAwKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fTsKKyAgcmV0dXJuIDA7CisgIF9fcHl4X0wxX2Vycm9yOjsKKyAgcmV0dXJuIC0xOworfQorCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKK1B5TU9ESU5JVF9GVU5DIGluaXRrZW5sbSh2b2lkKTsgLypwcm90byovCitQeU1PRElOSVRfRlVOQyBpbml0a2VubG0odm9pZCkKKyNlbHNlCitQeU1PRElOSVRfRlVOQyBQeUluaXRfa2VubG0odm9pZCk7IC8qcHJvdG8qLworUHlNT0RJTklUX0ZVTkMgUHlJbml0X2tlbmxtKHZvaWQpCisjZW5kaWYKK3sKKyAgUHlPYmplY3QgKl9fcHl4X3RfMSA9IE5VTEw7CisgIGludCBfX3B5eF9saW5lbm8gPSAwOworICBjb25zdCBjaGFyICpfX3B5eF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBfX3B5eF9jbGluZW5vID0gMDsKKyAgX19QeXhfUmVmTmFubnlEZWNsYXJhdGlvbnMKKyAgI2lmIENZVEhPTl9SRUZOQU5OWQorICBfX1B5eF9SZWZOYW5ueSA9IF9fUHl4X1JlZk5hbm55SW1wb3J0QVBJKCJyZWZuYW5ueSIpOworICBpZiAoIV9fUHl4X1JlZk5hbm55KSB7CisgICAgICBQeUVycl9DbGVhcigpOworICAgICAgX19QeXhfUmVmTmFubnkgPSBfX1B5eF9SZWZOYW5ueUltcG9ydEFQSSgiQ3l0aG9uLlJ1bnRpbWUucmVmbmFubnkiKTsKKyAgICAgIGlmICghX19QeXhfUmVmTmFubnkpCisgICAgICAgICAgUHlfRmF0YWxFcnJvcigiZmFpbGVkIHRvIGltcG9ydCAncmVmbmFubnknIG1vZHVsZSIpOworICB9CisgICNlbmRpZgorICBfX1B5eF9SZWZOYW5ueVNldHVwQ29udGV4dCgiUHlNT0RJTklUX0ZVTkMgUHlJbml0X2tlbmxtKHZvaWQpIiwgMCk7CisgIGlmICggX19QeXhfY2hlY2tfYmluYXJ5X3ZlcnNpb24oKSA8IDApIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fcHl4X2VtcHR5X3R1cGxlID0gUHlUdXBsZV9OZXcoMCk7IGlmICh1bmxpa2VseSghX19weXhfZW1wdHlfdHVwbGUpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF9lbXB0eV9ieXRlcyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOyBpZiAodW5saWtlbHkoIV9fcHl4X2VtcHR5X2J5dGVzKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgI2lmZGVmIF9fUHl4X0N5RnVuY3Rpb25fVVNFRAorICBpZiAoX19QeXhfQ3lGdW5jdGlvbl9pbml0KCkgPCAwKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAjZW5kaWYKKyAgI2lmZGVmIF9fUHl4X0Z1c2VkRnVuY3Rpb25fVVNFRAorICBpZiAoX19weXhfRnVzZWRGdW5jdGlvbl9pbml0KCkgPCAwKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAjZW5kaWYKKyAgI2lmZGVmIF9fUHl4X0dlbmVyYXRvcl9VU0VECisgIGlmIChfX3B5eF9HZW5lcmF0b3JfaW5pdCgpIDwgMCkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgI2VuZGlmCisgIC8qLS0tIExpYnJhcnkgZnVuY3Rpb24gZGVjbGFyYXRpb25zIC0tLSovCisgIC8qLS0tIFRocmVhZHMgaW5pdGlhbGl6YXRpb24gY29kZSAtLS0qLworICAjaWYgZGVmaW5lZChfX1BZWF9GT1JDRV9JTklUX1RIUkVBRFMpICYmIF9fUFlYX0ZPUkNFX0lOSVRfVEhSRUFEUworICAjaWZkZWYgV0lUSF9USFJFQUQgLyogUHl0aG9uIGJ1aWxkIHdpdGggdGhyZWFkaW5nIHN1cHBvcnQ/ICovCisgIFB5RXZhbF9Jbml0VGhyZWFkcygpOworICAjZW5kaWYKKyAgI2VuZGlmCisgIC8qLS0tIE1vZHVsZSBjcmVhdGlvbiBjb2RlIC0tLSovCisgICNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICBfX3B5eF9tID0gUHlfSW5pdE1vZHVsZTQoImtlbmxtIiwgX19weXhfbWV0aG9kcywgMCwgMCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsgUHlfWElOQ1JFRihfX3B5eF9tKTsKKyAgI2Vsc2UKKyAgX19weXhfbSA9IFB5TW9kdWxlX0NyZWF0ZSgmX19weXhfbW9kdWxlZGVmKTsKKyAgI2VuZGlmCisgIGlmICh1bmxpa2VseSghX19weXhfbSkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fcHl4X2QgPSBQeU1vZHVsZV9HZXREaWN0KF9fcHl4X20pOyBpZiAodW5saWtlbHkoIV9fcHl4X2QpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBQeV9JTkNSRUYoX19weXhfZCk7CisgIF9fcHl4X2IgPSBQeUltcG9ydF9BZGRNb2R1bGUoX19QeXhfQlVJTFRJTl9NT0RVTEVfTkFNRSk7IGlmICh1bmxpa2VseSghX19weXhfYikpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgICNpZiBDWVRIT05fQ09NUElMSU5HX0lOX1BZUFkKKyAgUHlfSU5DUkVGKF9fcHl4X2IpOworICAjZW5kaWYKKyAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoX19weXhfbSwgIl9fYnVpbHRpbnNfXyIsIF9fcHl4X2IpIDwgMCkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO307CisgIC8qLS0tIEluaXRpYWxpemUgdmFyaW91cyBnbG9iYWwgY29uc3RhbnRzIGV0Yy4gLS0tKi8KKyAgaWYgKHVubGlrZWx5KF9fUHl4X0luaXRHbG9iYWxzKCkgPCAwKSkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzICYmIChfX1BZWF9ERUZBVUxUX1NUUklOR19FTkNPRElOR19JU19BU0NJSSB8fCBfX1BZWF9ERUZBVUxUX1NUUklOR19FTkNPRElOR19JU19ERUZBVUxUKQorICBpZiAoX19QeXhfaW5pdF9zeXNfZ2V0ZGVmYXVsdGVuY29kaW5nX3BhcmFtcygpIDwgMCkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgI2VuZGlmCisgIGlmIChfX3B5eF9tb2R1bGVfaXNfbWFpbl9rZW5sbSkgeworICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKF9fcHl4X20sICJfX25hbWVfXyIsIF9fcHl4X25fc19tYWluKSA8IDApIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9OworICB9CisgICNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgeworICAgIFB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOyBpZiAodW5saWtlbHkoIW1vZHVsZXMpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIGlmICghUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgImtlbmxtIikpIHsKKyAgICAgIGlmICh1bmxpa2VseShQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCAia2VubG0iLCBfX3B5eF9tKSA8IDApKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIH0KKyAgfQorICAjZW5kaWYKKyAgLyotLS0gQnVpbHRpbiBpbml0IGNvZGUgLS0tKi8KKyAgaWYgKHVubGlrZWx5KF9fUHl4X0luaXRDYWNoZWRCdWlsdGlucygpIDwgMCkpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIC8qLS0tIENvbnN0YW50cyBpbml0IGNvZGUgLS0tKi8KKyAgaWYgKHVubGlrZWx5KF9fUHl4X0luaXRDYWNoZWRDb25zdGFudHMoKSA8IDApKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAvKi0tLSBHbG9iYWwgaW5pdCBjb2RlIC0tLSovCisgIC8qLS0tIFZhcmlhYmxlIGV4cG9ydCBjb2RlIC0tLSovCisgIC8qLS0tIEZ1bmN0aW9uIGV4cG9ydCBjb2RlIC0tLSovCisgIC8qLS0tIFR5cGUgaW5pdCBjb2RlIC0tLSovCisgIGlmIChQeVR5cGVfUmVhZHkoJl9fcHl4X3R5cGVfNWtlbmxtX0Z1bGxTY29yZVJldHVybikgPCAwKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxMTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19weXhfdHlwZV81a2VubG1fRnVsbFNjb3JlUmV0dXJuLnRwX3ByaW50ID0gMDsKKyAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoX19weXhfbSwgIkZ1bGxTY29yZVJldHVybiIsIChQeU9iamVjdCAqKSZfX3B5eF90eXBlXzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4pIDwgMCkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTE7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fcHl4X3B0eXBlXzVrZW5sbV9GdWxsU2NvcmVSZXR1cm4gPSAmX19weXhfdHlwZV81a2VubG1fRnVsbFNjb3JlUmV0dXJuOworICBpZiAoUHlUeXBlX1JlYWR5KCZfX3B5eF90eXBlXzVrZW5sbV9TdGF0ZSkgPCAwKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA0NDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19weXhfdHlwZV81a2VubG1fU3RhdGUudHBfcHJpbnQgPSAwOworICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhfX3B5eF9tLCAiU3RhdGUiLCAoUHlPYmplY3QgKikmX19weXhfdHlwZV81a2VubG1fU3RhdGUpIDwgMCkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gNDQ7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fcHl4X3B0eXBlXzVrZW5sbV9TdGF0ZSA9ICZfX3B5eF90eXBlXzVrZW5sbV9TdGF0ZTsKKyAgaWYgKFB5VHlwZV9SZWFkeSgmX19weXhfdHlwZV81a2VubG1fTGFuZ3VhZ2VNb2RlbCkgPCAwKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSA3NDsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19weXhfdHlwZV81a2VubG1fTGFuZ3VhZ2VNb2RlbC50cF9wcmludCA9IDA7CisgICNpZiBDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04KKyAgeworICAgIFB5T2JqZWN0ICp3cmFwcGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKikmX19weXhfdHlwZV81a2VubG1fTGFuZ3VhZ2VNb2RlbCwgIl9faW5pdF9fIik7IGlmICh1bmxpa2VseSghd3JhcHBlcikpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDc0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICAgIGlmIChQeV9UWVBFKHdyYXBwZXIpID09ICZQeVdyYXBwZXJEZXNjcl9UeXBlKSB7CisgICAgICBfX3B5eF93cmFwcGVyYmFzZV81a2VubG1fMTNMYW5ndWFnZU1vZGVsX19faW5pdF9fID0gKigoUHlXcmFwcGVyRGVzY3JPYmplY3QgKil3cmFwcGVyKS0+ZF9iYXNlOworICAgICAgX19weXhfd3JhcHBlcmJhc2VfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF9fX2luaXRfXy5kb2MgPSBfX3B5eF9kb2NfNWtlbmxtXzEzTGFuZ3VhZ2VNb2RlbF9fX2luaXRfXzsKKyAgICAgICgoUHlXcmFwcGVyRGVzY3JPYmplY3QgKil3cmFwcGVyKS0+ZF9iYXNlID0gJl9fcHl4X3dyYXBwZXJiYXNlXzVrZW5sbV8xM0xhbmd1YWdlTW9kZWxfX19pbml0X187CisgICAgfQorICB9CisgICNlbmRpZgorICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhfX3B5eF9tLCAiTGFuZ3VhZ2VNb2RlbCIsIChQeU9iamVjdCAqKSZfX3B5eF90eXBlXzVrZW5sbV9MYW5ndWFnZU1vZGVsKSA8IDApIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDc0OyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX3B5eF9wdHlwZV81a2VubG1fTGFuZ3VhZ2VNb2RlbCA9ICZfX3B5eF90eXBlXzVrZW5sbV9MYW5ndWFnZU1vZGVsOworICBpZiAoUHlUeXBlX1JlYWR5KCZfX3B5eF90eXBlXzVrZW5sbV9Nb2RlbCkgPCAwKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxNTk7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fcHl4X3R5cGVfNWtlbmxtX01vZGVsLnRwX3ByaW50ID0gMDsKKyAgI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorICB7CisgICAgUHlPYmplY3QgKndyYXBwZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKSZfX3B5eF90eXBlXzVrZW5sbV9Nb2RlbCwgIl9faW5pdF9fIik7IGlmICh1bmxpa2VseSghd3JhcHBlcikpIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE1OTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgICBpZiAoUHlfVFlQRSh3cmFwcGVyKSA9PSAmUHlXcmFwcGVyRGVzY3JfVHlwZSkgeworICAgICAgX19weXhfd3JhcHBlcmJhc2VfNWtlbmxtXzVNb2RlbF9fX2luaXRfXyA9ICooKFB5V3JhcHBlckRlc2NyT2JqZWN0ICopd3JhcHBlciktPmRfYmFzZTsKKyAgICAgIF9fcHl4X3dyYXBwZXJiYXNlXzVrZW5sbV81TW9kZWxfX19pbml0X18uZG9jID0gX19weXhfZG9jXzVrZW5sbV81TW9kZWxfX19pbml0X187CisgICAgICAoKFB5V3JhcHBlckRlc2NyT2JqZWN0ICopd3JhcHBlciktPmRfYmFzZSA9ICZfX3B5eF93cmFwcGVyYmFzZV81a2VubG1fNU1vZGVsX19faW5pdF9fOworICAgIH0KKyAgfQorICAjZW5kaWYKKyAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoX19weXhfbSwgIk1vZGVsIiwgKFB5T2JqZWN0ICopJl9fcHl4X3R5cGVfNWtlbmxtX01vZGVsKSA8IDApIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE1OTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19weXhfcHR5cGVfNWtlbmxtX01vZGVsID0gJl9fcHl4X3R5cGVfNWtlbmxtX01vZGVsOworICBpZiAoUHlUeXBlX1JlYWR5KCZfX3B5eF90eXBlXzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzKSA8IDApIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDEyMjsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19weXhfdHlwZV81a2VubG1fX19weXhfc2NvcGVfc3RydWN0X19mdWxsX3Njb3Jlcy50cF9wcmludCA9IDA7CisgIF9fcHl4X3B0eXBlXzVrZW5sbV9fX3B5eF9zY29wZV9zdHJ1Y3RfX2Z1bGxfc2NvcmVzID0gJl9fcHl4X3R5cGVfNWtlbmxtX19fcHl4X3Njb3BlX3N0cnVjdF9fZnVsbF9zY29yZXM7CisgIC8qLS0tIFR5cGUgaW1wb3J0IGNvZGUgLS0tKi8KKyAgLyotLS0gVmFyaWFibGUgaW1wb3J0IGNvZGUgLS0tKi8KKyAgLyotLS0gRnVuY3Rpb24gaW1wb3J0IGNvZGUgLS0tKi8KKyAgLyotLS0gRXhlY3V0aW9uIGNvZGUgLS0tKi8KKworICAvKiAia2VubG0ucHl4IjoxCisgKiBpbXBvcnQgb3MgICAgICAgICAgICAgIyA8PDw8PDw8PDw8PDw8PAorICogY2ltcG9ydCBfa2VubG0KKyAqIAorICovCisgIF9fcHl4X3RfMSA9IF9fUHl4X0ltcG9ydChfX3B5eF9uX3Nfb3MsIDAsIC0xKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgaWYgKFB5RGljdF9TZXRJdGVtKF9fcHl4X2QsIF9fcHl4X25fc19vcywgX19weXhfdF8xKSA8IDApIHtfX3B5eF9maWxlbmFtZSA9IF9fcHl4X2ZbMF07IF9fcHl4X2xpbmVubyA9IDE7IF9fcHl4X2NsaW5lbm8gPSBfX0xJTkVfXzsgZ290byBfX3B5eF9MMV9lcnJvcjt9CisgIF9fUHl4X0RFQ1JFRihfX3B5eF90XzEpOyBfX3B5eF90XzEgPSAwOworCisgIC8qICJrZW5sbS5weXgiOjE2NQorICogCisgKiAgICAgY2RlZiBfa2VubG0uTW9kZWwqIG1vZGVsCisgKiAgICAgY2RlZiBwdWJsaWMgYnl0ZXMgcGF0aCAgICAgICAgICAgICAjIDw8PDw8PDw8PDw8PDw8CisgKiAgICAgY2RlZiBfa2VubG0uY29uc3RfVm9jYWJ1bGFyeSogdm9jYWIKKyAqIAorICovCisgIF9fcHl4X3RfMSA9IFB5RGljdF9OZXcoKTsgaWYgKHVubGlrZWx5KCFfX3B5eF90XzEpKSB7X19weXhfZmlsZW5hbWUgPSBfX3B5eF9mWzBdOyBfX3B5eF9saW5lbm8gPSAxOyBfX3B5eF9jbGluZW5vID0gX19MSU5FX187IGdvdG8gX19weXhfTDFfZXJyb3I7fQorICBfX1B5eF9HT1RSRUYoX19weXhfdF8xKTsKKyAgaWYgKFB5RGljdF9TZXRJdGVtKF9fcHl4X2QsIF9fcHl4X25fc190ZXN0LCBfX3B5eF90XzEpIDwgMCkge19fcHl4X2ZpbGVuYW1lID0gX19weXhfZlswXTsgX19weXhfbGluZW5vID0gMTsgX19weXhfY2xpbmVubyA9IF9fTElORV9fOyBnb3RvIF9fcHl4X0wxX2Vycm9yO30KKyAgX19QeXhfREVDUkVGKF9fcHl4X3RfMSk7IF9fcHl4X3RfMSA9IDA7CisKKyAgLyotLS0gV3JhcHBlZCB2YXJzIGNvZGUgLS0tKi8KKworICBnb3RvIF9fcHl4X0wwOworICBfX3B5eF9MMV9lcnJvcjo7CisgIF9fUHl4X1hERUNSRUYoX19weXhfdF8xKTsKKyAgaWYgKF9fcHl4X20pIHsKKyAgICBpZiAoX19weXhfZCkgeworICAgICAgX19QeXhfQWRkVHJhY2ViYWNrKCJpbml0IGtlbmxtIiwgX19weXhfY2xpbmVubywgX19weXhfbGluZW5vLCBfX3B5eF9maWxlbmFtZSk7CisgICAgfQorICAgIFB5X0RFQ1JFRihfX3B5eF9tKTsgX19weXhfbSA9IDA7CisgIH0gZWxzZSBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJpbml0IGtlbmxtIik7CisgIH0KKyAgX19weXhfTDA6OworICBfX1B5eF9SZWZOYW5ueUZpbmlzaENvbnRleHQoKTsKKyAgI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisgIHJldHVybjsKKyAgI2Vsc2UKKyAgcmV0dXJuIF9fcHl4X207CisgICNlbmRpZgorfQorCisvKiAtLS0gUnVudGltZSBzdXBwb3J0IGNvZGUgLS0tICovCisjaWYgQ1lUSE9OX1JFRk5BTk5ZCitzdGF0aWMgX19QeXhfUmVmTmFubnlBUElTdHJ1Y3QgKl9fUHl4X1JlZk5hbm55SW1wb3J0QVBJKGNvbnN0IGNoYXIgKm1vZG5hbWUpIHsKKyAgICBQeU9iamVjdCAqbSA9IE5VTEwsICpwID0gTlVMTDsKKyAgICB2b2lkICpyID0gTlVMTDsKKyAgICBtID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKChjaGFyICopbW9kbmFtZSk7CisgICAgaWYgKCFtKSBnb3RvIGVuZDsKKyAgICBwID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtLCAoY2hhciAqKSJSZWZOYW5ueUFQSSIpOworICAgIGlmICghcCkgZ290byBlbmQ7CisgICAgciA9IFB5TG9uZ19Bc1ZvaWRQdHIocCk7CitlbmQ6CisgICAgUHlfWERFQ1JFRihwKTsKKyAgICBQeV9YREVDUkVGKG0pOworICAgIHJldHVybiAoX19QeXhfUmVmTmFubnlBUElTdHJ1Y3QgKilyOworfQorI2VuZGlmCisKK3N0YXRpYyBQeU9iamVjdCAqX19QeXhfR2V0QnVpbHRpbk5hbWUoUHlPYmplY3QgKm5hbWUpIHsKKyAgICBQeU9iamVjdCogcmVzdWx0ID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF9iLCBuYW1lKTsKKyAgICBpZiAodW5saWtlbHkoIXJlc3VsdCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX05hbWVFcnJvciwKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgICAgICAgICAgICJuYW1lICclVScgaXMgbm90IGRlZmluZWQiLCBuYW1lKTsKKyNlbHNlCisgICAgICAgICAgICAibmFtZSAnJS4yMDBzJyBpcyBub3QgZGVmaW5lZCIsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorc3RhdGljIENZVEhPTl9JTkxJTkUgUHlPYmplY3QqIF9fUHl4X1B5T2JqZWN0X0NhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykgeworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgdGVybmFyeWZ1bmMgY2FsbCA9IGZ1bmMtPm9iX3R5cGUtPnRwX2NhbGw7CisgICAgaWYgKHVubGlrZWx5KCFjYWxsKSkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGwoZnVuYywgYXJnLCBrdyk7CisgICAgaWYgKHVubGlrZWx5KFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgoY2hhciopIiB3aGlsZSBjYWxsaW5nIGEgUHl0aG9uIG9iamVjdCIpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gKCpjYWxsKShmdW5jLCBhcmcsIGt3KTsKKyAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICBpZiAodW5saWtlbHkoIXJlc3VsdCkgJiYgdW5saWtlbHkoIVB5RXJyX09jY3VycmVkKCkpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgIk5VTEwgcmVzdWx0IHdpdGhvdXQgZXJyb3IgaW4gUHlPYmplY3RfQ2FsbCIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKK3N0YXRpYyBDWVRIT05fSU5MSU5FIHZvaWQgX19QeXhfRXJyUmVzdG9yZShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdGIpIHsKKyNpZiBDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04KKyAgICBQeU9iamVjdCAqdG1wX3R5cGUsICp0bXBfdmFsdWUsICp0bXBfdGI7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICB0bXBfdHlwZSA9IHRzdGF0ZS0+Y3VyZXhjX3R5cGU7CisgICAgdG1wX3ZhbHVlID0gdHN0YXRlLT5jdXJleGNfdmFsdWU7CisgICAgdG1wX3RiID0gdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrOworICAgIHRzdGF0ZS0+Y3VyZXhjX3R5cGUgPSB0eXBlOworICAgIHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlID0gdmFsdWU7CisgICAgdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID0gdGI7CisgICAgUHlfWERFQ1JFRih0bXBfdHlwZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdmFsdWUpOworICAgIFB5X1hERUNSRUYodG1wX3RiKTsKKyNlbHNlCisgICAgUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdGIpOworI2VuZGlmCit9CitzdGF0aWMgQ1lUSE9OX0lOTElORSB2b2lkIF9fUHl4X0VyckZldGNoKFB5T2JqZWN0ICoqdHlwZSwgUHlPYmplY3QgKip2YWx1ZSwgUHlPYmplY3QgKip0YikgeworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgKnR5cGUgPSB0c3RhdGUtPmN1cmV4Y190eXBlOworICAgICp2YWx1ZSA9IHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlOworICAgICp0YiA9IHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjazsKKyAgICB0c3RhdGUtPmN1cmV4Y190eXBlID0gMDsKKyAgICB0c3RhdGUtPmN1cmV4Y192YWx1ZSA9IDA7CisgICAgdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID0gMDsKKyNlbHNlCisgICAgUHlFcnJfRmV0Y2godHlwZSwgdmFsdWUsIHRiKTsKKyNlbmRpZgorfQorCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKK3N0YXRpYyB2b2lkIF9fUHl4X1JhaXNlKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIFB5T2JqZWN0ICp0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENZVEhPTl9VTlVTRUQgUHlPYmplY3QgKmNhdXNlKSB7CisgICAgUHlfWElOQ1JFRih0eXBlKTsKKyAgICBpZiAoIXZhbHVlIHx8IHZhbHVlID09IFB5X05vbmUpCisgICAgICAgIHZhbHVlID0gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgaWYgKCF0YiB8fCB0YiA9PSBQeV9Ob25lKQorICAgICAgICB0YiA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRih0Yik7CisgICAgICAgIGlmICghUHlUcmFjZUJhY2tfQ2hlY2sodGIpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJyYWlzZTogYXJnIDMgbXVzdCBiZSBhIHRyYWNlYmFjayBvciBOb25lIik7CisgICAgICAgICAgICBnb3RvIHJhaXNlX2Vycm9yOworICAgICAgICB9CisgICAgfQorICAgIGlmIChQeVR5cGVfQ2hlY2sodHlwZSkpIHsKKyNpZiBDWVRIT05fQ09NUElMSU5HX0lOX1BZUFkKKyAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgdmFsdWUgPSBQeV9Ob25lOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZ0eXBlLCAmdmFsdWUsICZ0Yik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJpbnN0YW5jZSBleGNlcHRpb24gbWF5IG5vdCBoYXZlIGEgc2VwYXJhdGUgdmFsdWUiKTsKKyAgICAgICAgICAgIGdvdG8gcmFpc2VfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWUgPSB0eXBlOworICAgICAgICB0eXBlID0gKFB5T2JqZWN0KikgUHlfVFlQRSh0eXBlKTsKKyAgICAgICAgUHlfSU5DUkVGKHR5cGUpOworICAgICAgICBpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoKFB5VHlwZU9iamVjdCAqKXR5cGUsIChQeVR5cGVPYmplY3QgKilQeUV4Y19CYXNlRXhjZXB0aW9uKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAicmFpc2U6IGV4Y2VwdGlvbiBjbGFzcyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgQmFzZUV4Y2VwdGlvbiIpOworICAgICAgICAgICAgZ290byByYWlzZV9lcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX1B5eF9FcnJSZXN0b3JlKHR5cGUsIHZhbHVlLCB0Yik7CisgICAgcmV0dXJuOworcmFpc2VfZXJyb3I6CisgICAgUHlfWERFQ1JFRih2YWx1ZSk7CisgICAgUHlfWERFQ1JFRih0eXBlKTsKKyAgICBQeV9YREVDUkVGKHRiKTsKKyAgICByZXR1cm47Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19QeXhfUmFpc2UoUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSwgUHlPYmplY3QgKnRiLCBQeU9iamVjdCAqY2F1c2UpIHsKKyAgICBQeU9iamVjdCogb3duZWRfaW5zdGFuY2UgPSBOVUxMOworICAgIGlmICh0YiA9PSBQeV9Ob25lKSB7CisgICAgICAgIHRiID0gMDsKKyAgICB9IGVsc2UgaWYgKHRiICYmICFQeVRyYWNlQmFja19DaGVjayh0YikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJyYWlzZTogYXJnIDMgbXVzdCBiZSBhIHRyYWNlYmFjayBvciBOb25lIik7CisgICAgICAgIGdvdG8gYmFkOworICAgIH0KKyAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgdmFsdWUgPSAwOworICAgIGlmIChQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHR5cGUpKSB7CisgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiaW5zdGFuY2UgZXhjZXB0aW9uIG1heSBub3QgaGF2ZSBhIHNlcGFyYXRlIHZhbHVlIik7CisgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IHR5cGU7CisgICAgICAgIHR5cGUgPSAoUHlPYmplY3QqKSBQeV9UWVBFKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwZSkpIHsKKyAgICAgICAgUHlPYmplY3QgKmluc3RhbmNlX2NsYXNzID0gTlVMTDsKKyAgICAgICAgaWYgKHZhbHVlICYmIFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgICAgICBpbnN0YW5jZV9jbGFzcyA9IChQeU9iamVjdCopIFB5X1RZUEUodmFsdWUpOworICAgICAgICAgICAgaWYgKGluc3RhbmNlX2NsYXNzICE9IHR5cGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlPYmplY3RfSXNTdWJjbGFzcyhpbnN0YW5jZV9jbGFzcywgdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGluc3RhbmNlX2NsYXNzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlX2NsYXNzID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbnN0YW5jZV9jbGFzcykgeworICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBhcmdzID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHZhbHVlKTsKKyAgICAgICAgICAgIGlmICghYXJncykKKyAgICAgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICAgIG93bmVkX2luc3RhbmNlID0gUHlPYmplY3RfQ2FsbCh0eXBlLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgIGlmICghb3duZWRfaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgICAgICB2YWx1ZSA9IG93bmVkX2luc3RhbmNlOworICAgICAgICAgICAgaWYgKCFQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsaW5nICVSIHNob3VsZCBoYXZlIHJldHVybmVkIGFuIGluc3RhbmNlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2VFeGNlcHRpb24sIG5vdCAlUiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIFB5X1RZUEUodmFsdWUpKTsKKyAgICAgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAicmFpc2U6IGV4Y2VwdGlvbiBjbGFzcyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgQmFzZUV4Y2VwdGlvbiIpOworICAgICAgICBnb3RvIGJhZDsKKyAgICB9CisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAzMDAwMAorICAgIGlmIChjYXVzZSkgeworI2Vsc2UKKyAgICBpZiAoY2F1c2UgJiYgY2F1c2UgIT0gUHlfTm9uZSkgeworI2VuZGlmCisgICAgICAgIFB5T2JqZWN0ICpmaXhlZF9jYXVzZTsKKyAgICAgICAgaWYgKGNhdXNlID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGZpeGVkX2NhdXNlID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGNhdXNlKSkgeworICAgICAgICAgICAgZml4ZWRfY2F1c2UgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNhdXNlLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChmaXhlZF9jYXVzZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9IGVsc2UgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2soY2F1c2UpKSB7CisgICAgICAgICAgICBmaXhlZF9jYXVzZSA9IGNhdXNlOworICAgICAgICAgICAgUHlfSU5DUkVGKGZpeGVkX2NhdXNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbiBjYXVzZXMgbXVzdCBkZXJpdmUgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2VFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisgICAgICAgIFB5RXhjZXB0aW9uX1NldENhdXNlKHZhbHVlLCBmaXhlZF9jYXVzZSk7CisgICAgfQorICAgIFB5RXJyX1NldE9iamVjdCh0eXBlLCB2YWx1ZSk7CisgICAgaWYgKHRiKSB7CisjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9QWVBZCisgICAgICAgIFB5T2JqZWN0ICp0bXBfdHlwZSwgKnRtcF92YWx1ZSwgKnRtcF90YjsKKyAgICAgICAgUHlFcnJfRmV0Y2godG1wX3R5cGUsIHRtcF92YWx1ZSwgdG1wX3RiKTsKKyAgICAgICAgUHlfSU5DUkVGKHRiKTsKKyAgICAgICAgUHlFcnJfUmVzdG9yZSh0bXBfdHlwZSwgdG1wX3ZhbHVlLCB0Yik7CisgICAgICAgIFB5X1hERUNSRUYodG1wX3RiKTsKKyNlbHNlCisgICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgICAgIFB5T2JqZWN0KiB0bXBfdGIgPSB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2s7CisgICAgICAgIGlmICh0YiAhPSB0bXBfdGIpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0Yik7CisgICAgICAgICAgICB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPSB0YjsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodG1wX3RiKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorYmFkOgorICAgIFB5X1hERUNSRUYob3duZWRfaW5zdGFuY2UpOworICAgIHJldHVybjsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX1B5eF9SYWlzZUFyZ3R1cGxlSW52YWxpZCgKKyAgICBjb25zdCBjaGFyKiBmdW5jX25hbWUsCisgICAgaW50IGV4YWN0LAorICAgIFB5X3NzaXplX3QgbnVtX21pbiwKKyAgICBQeV9zc2l6ZV90IG51bV9tYXgsCisgICAgUHlfc3NpemVfdCBudW1fZm91bmQpCit7CisgICAgUHlfc3NpemVfdCBudW1fZXhwZWN0ZWQ7CisgICAgY29uc3QgY2hhciAqbW9yZV9vcl9sZXNzOworICAgIGlmIChudW1fZm91bmQgPCBudW1fbWluKSB7CisgICAgICAgIG51bV9leHBlY3RlZCA9IG51bV9taW47CisgICAgICAgIG1vcmVfb3JfbGVzcyA9ICJhdCBsZWFzdCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtX2V4cGVjdGVkID0gbnVtX21heDsKKyAgICAgICAgbW9yZV9vcl9sZXNzID0gImF0IG1vc3QiOworICAgIH0KKyAgICBpZiAoZXhhY3QpIHsKKyAgICAgICAgbW9yZV9vcl9sZXNzID0gImV4YWN0bHkiOworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgJS44cyAlIiBDWVRIT05fRk9STUFUX1NTSVpFX1QgImQgcG9zaXRpb25hbCBhcmd1bWVudCUuMXMgKCUiIENZVEhPTl9GT1JNQVRfU1NJWkVfVCAiZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICBmdW5jX25hbWUsIG1vcmVfb3JfbGVzcywgbnVtX2V4cGVjdGVkLAorICAgICAgICAgICAgICAgICAobnVtX2V4cGVjdGVkID09IDEpID8gIiIgOiAicyIsIG51bV9mb3VuZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fUHl4X1JhaXNlRG91YmxlS2V5d29yZHNFcnJvcigKKyAgICBjb25zdCBjaGFyKiBmdW5jX25hbWUsCisgICAgUHlPYmplY3QqIGt3X25hbWUpCit7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICAgICAgICAiJXMoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50ICclVSciLCBmdW5jX25hbWUsIGt3X25hbWUpOworICAgICAgICAjZWxzZQorICAgICAgICAiJXMoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50ICclcyciLCBmdW5jX25hbWUsCisgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGt3X25hbWUpKTsKKyAgICAgICAgI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgX19QeXhfUGFyc2VPcHRpb25hbEtleXdvcmRzKAorICAgIFB5T2JqZWN0ICprd2RzLAorICAgIFB5T2JqZWN0ICoqYXJnbmFtZXNbXSwKKyAgICBQeU9iamVjdCAqa3dkczIsCisgICAgUHlPYmplY3QgKnZhbHVlc1tdLAorICAgIFB5X3NzaXplX3QgbnVtX3Bvc19hcmdzLAorICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uX25hbWUpCit7CisgICAgUHlPYmplY3QgKmtleSA9IDAsICp2YWx1ZSA9IDA7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5T2JqZWN0KioqIG5hbWU7CisgICAgUHlPYmplY3QqKiogZmlyc3Rfa3dfYXJnID0gYXJnbmFtZXMgKyBudW1fcG9zX2FyZ3M7CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KGt3ZHMsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgbmFtZSA9IGZpcnN0X2t3X2FyZzsKKyAgICAgICAgd2hpbGUgKCpuYW1lICYmICgqKm5hbWUgIT0ga2V5KSkgbmFtZSsrOworICAgICAgICBpZiAoKm5hbWUpIHsKKyAgICAgICAgICAgIHZhbHVlc1tuYW1lLWFyZ25hbWVzXSA9IHZhbHVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSA9IGZpcnN0X2t3X2FyZzsKKyAgICAgICAgI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisgICAgICAgIGlmIChsaWtlbHkoUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpKSB8fCBsaWtlbHkoUHlTdHJpbmdfQ2hlY2soa2V5KSkpIHsKKyAgICAgICAgICAgIHdoaWxlICgqbmFtZSkgeworICAgICAgICAgICAgICAgIGlmICgoQ1lUSE9OX0NPTVBJTElOR19JTl9QWVBZIHx8IFB5U3RyaW5nX0dFVF9TSVpFKCoqbmFtZSkgPT0gUHlTdHJpbmdfR0VUX1NJWkUoa2V5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIF9QeVN0cmluZ19FcSgqKm5hbWUsIGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzW25hbWUtYXJnbmFtZXNdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuYW1lKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKm5hbWUpIGNvbnRpbnVlOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QqKiogYXJnbmFtZSA9IGFyZ25hbWVzOworICAgICAgICAgICAgICAgIHdoaWxlIChhcmduYW1lICE9IGZpcnN0X2t3X2FyZykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKCoqYXJnbmFtZSA9PSBrZXkpIHx8ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ1lUSE9OX0NPTVBJTElOR19JTl9QWVBZIHx8IFB5U3RyaW5nX0dFVF9TSVpFKCoqYXJnbmFtZSkgPT0gUHlTdHJpbmdfR0VUX1NJWkUoa2V5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgX1B5U3RyaW5nX0VxKCoqYXJnbmFtZSwga2V5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYXJnX3Bhc3NlZF90d2ljZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhcmduYW1lKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGlmIChsaWtlbHkoUHlVbmljb2RlX0NoZWNrKGtleSkpKSB7CisgICAgICAgICAgICB3aGlsZSAoKm5hbWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgY21wID0gKCoqbmFtZSA9PSBrZXkpID8gMCA6CisgICAgICAgICAgICAgICAgI2lmICFDWVRIT05fQ09NUElMSU5HX0lOX1BZUFkgJiYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisgICAgICAgICAgICAgICAgICAgIChQeVVuaWNvZGVfR0VUX1NJWkUoKipuYW1lKSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUoa2V5KSkgPyAxIDoKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0NvbXBhcmUoKipuYW1lLCBrZXkpOworICAgICAgICAgICAgICAgIGlmIChjbXAgPCAwICYmIHVubGlrZWx5KFB5RXJyX09jY3VycmVkKCkpKSBnb3RvIGJhZDsKKyAgICAgICAgICAgICAgICBpZiAoY21wID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzW25hbWUtYXJnbmFtZXNdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuYW1lKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKm5hbWUpIGNvbnRpbnVlOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QqKiogYXJnbmFtZSA9IGFyZ25hbWVzOworICAgICAgICAgICAgICAgIHdoaWxlIChhcmduYW1lICE9IGZpcnN0X2t3X2FyZykgeworICAgICAgICAgICAgICAgICAgICBpbnQgY21wID0gKCoqYXJnbmFtZSA9PSBrZXkpID8gMCA6CisgICAgICAgICAgICAgICAgICAgICNpZiAhQ1lUSE9OX0NPTVBJTElOR19JTl9QWVBZICYmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICAgICAgICAgICAgICAgICAgICAgICAgKFB5VW5pY29kZV9HRVRfU0laRSgqKmFyZ25hbWUpICE9IFB5VW5pY29kZV9HRVRfU0laRShrZXkpKSA/IDEgOgorICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Db21wYXJlKCoqYXJnbmFtZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNtcCA8IDAgJiYgdW5saWtlbHkoUHlFcnJfT2NjdXJyZWQoKSkpIGdvdG8gYmFkOworICAgICAgICAgICAgICAgICAgICBpZiAoY21wID09IDApIGdvdG8gYXJnX3Bhc3NlZF90d2ljZTsKKyAgICAgICAgICAgICAgICAgICAgYXJnbmFtZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBnb3RvIGludmFsaWRfa2V5d29yZF90eXBlOworICAgICAgICBpZiAoa3dkczIpIHsKKyAgICAgICAgICAgIGlmICh1bmxpa2VseShQeURpY3RfU2V0SXRlbShrd2RzMiwga2V5LCB2YWx1ZSkpKSBnb3RvIGJhZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZF9rZXl3b3JkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworYXJnX3Bhc3NlZF90d2ljZToKKyAgICBfX1B5eF9SYWlzZURvdWJsZUtleXdvcmRzRXJyb3IoZnVuY3Rpb25fbmFtZSwga2V5KTsKKyAgICBnb3RvIGJhZDsKK2ludmFsaWRfa2V5d29yZF90eXBlOgorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICIlLjIwMHMoKSBrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3MiLCBmdW5jdGlvbl9uYW1lKTsKKyAgICBnb3RvIGJhZDsKK2ludmFsaWRfa2V5d29yZDoKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICAgICAgICAiJS4yMDBzKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnJS4yMDBzJyIsCisgICAgICAgIGZ1bmN0aW9uX25hbWUsIFB5U3RyaW5nX0FzU3RyaW5nKGtleSkpOworICAgICNlbHNlCisgICAgICAgICIlcygpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVVJyIsCisgICAgICAgIGZ1bmN0aW9uX25hbWUsIGtleSk7CisgICAgI2VuZGlmCitiYWQ6CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBfX1B5eF9SYWlzZUFyZ3VtZW50VHlwZUludmFsaWQoY29uc3QgY2hhciogbmFtZSwgUHlPYmplY3QgKm9iaiwgUHlUeXBlT2JqZWN0ICp0eXBlKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgIkFyZ3VtZW50ICclLjIwMHMnIGhhcyBpbmNvcnJlY3QgdHlwZSAoZXhwZWN0ZWQgJS4yMDBzLCBnb3QgJS4yMDBzKSIsCisgICAgICAgIG5hbWUsIHR5cGUtPnRwX25hbWUsIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7Cit9CitzdGF0aWMgQ1lUSE9OX0lOTElORSBpbnQgX19QeXhfQXJnVHlwZVRlc3QoUHlPYmplY3QgKm9iaiwgUHlUeXBlT2JqZWN0ICp0eXBlLCBpbnQgbm9uZV9hbGxvd2VkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBleGFjdCkKK3sKKyAgICBpZiAodW5saWtlbHkoIXR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIk1pc3NpbmcgdHlwZSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChub25lX2FsbG93ZWQgJiYgb2JqID09IFB5X05vbmUpIHJldHVybiAxOworICAgIGVsc2UgaWYgKGV4YWN0KSB7CisgICAgICAgIGlmIChsaWtlbHkoUHlfVFlQRShvYmopID09IHR5cGUpKSByZXR1cm4gMTsKKyAgICAgICAgI2lmIFBZX01BSk9SX1ZFUlNJT04gPT0gMgorICAgICAgICBlbHNlIGlmICgodHlwZSA9PSAmUHlCYXNlU3RyaW5nX1R5cGUpICYmIGxpa2VseShfX1B5eF9QeUJhc2VTdHJpbmdfQ2hlY2tFeGFjdChvYmopKSkgcmV0dXJuIDE7CisgICAgICAgICNlbmRpZgorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGxpa2VseShQeU9iamVjdF9UeXBlQ2hlY2sob2JqLCB0eXBlKSkpIHJldHVybiAxOworICAgIH0KKyAgICBfX1B5eF9SYWlzZUFyZ3VtZW50VHlwZUludmFsaWQobmFtZSwgb2JqLCB0eXBlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIENZVEhPTl9JTkxJTkUgUHlPYmplY3QgKl9fUHl4X0dldE1vZHVsZUdsb2JhbE5hbWUoUHlPYmplY3QgKm5hbWUpIHsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorICAgIHJlc3VsdCA9IFB5RGljdF9HZXRJdGVtKF9fcHl4X2QsIG5hbWUpOworICAgIGlmIChsaWtlbHkocmVzdWx0KSkgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICB9IGVsc2UgeworI2Vsc2UKKyAgICByZXN1bHQgPSBQeU9iamVjdF9HZXRJdGVtKF9fcHl4X2QsIG5hbWUpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisjZW5kaWYKKyAgICAgICAgcmVzdWx0ID0gX19QeXhfR2V0QnVpbHRpbk5hbWUobmFtZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZiBDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04KK3N0YXRpYyBDWVRIT05fSU5MSU5FIFB5T2JqZWN0KiBfX1B5eF9QeU9iamVjdF9DYWxsTWV0aE8oUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcpIHsKKyAgICBQeU9iamVjdCAqc2VsZiwgKnJlc3VsdDsKKyAgICBQeUNGdW5jdGlvbiBjZnVuYzsKKyAgICBjZnVuYyA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihmdW5jKTsKKyAgICBzZWxmID0gUHlDRnVuY3Rpb25fR0VUX1NFTEYoZnVuYyk7CisgICAgaWYgKHVubGlrZWx5KFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgoY2hhciopIiB3aGlsZSBjYWxsaW5nIGEgUHl0aG9uIG9iamVjdCIpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gY2Z1bmMoc2VsZiwgYXJnKTsKKyAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICBpZiAodW5saWtlbHkoIXJlc3VsdCkgJiYgdW5saWtlbHkoIVB5RXJyX09jY3VycmVkKCkpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgIk5VTEwgcmVzdWx0IHdpdGhvdXQgZXJyb3IgaW4gUHlPYmplY3RfQ2FsbCIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKyNpZiBDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04KK3N0YXRpYyBQeU9iamVjdCogX19QeXhfX1B5T2JqZWN0X0NhbGxPbmVBcmcoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcpIHsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMSk7CisgICAgaWYgKHVubGlrZWx5KCFhcmdzKSkgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKGFyZyk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBhcmcpOworICAgIHJlc3VsdCA9IF9fUHl4X1B5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXN1bHQ7Cit9CitzdGF0aWMgQ1lUSE9OX0lOTElORSBQeU9iamVjdCogX19QeXhfUHlPYmplY3RfQ2FsbE9uZUFyZyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZykgeworI2lmZGVmIF9fUHl4X0N5RnVuY3Rpb25fVVNFRAorICAgIGlmIChsaWtlbHkoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykgfHwgUHlPYmplY3RfVHlwZUNoZWNrKGZ1bmMsIF9fcHl4X0N5RnVuY3Rpb25UeXBlKSkpIHsKKyNlbHNlCisgICAgaWYgKGxpa2VseShQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkpIHsKKyNlbmRpZgorICAgICAgICBpZiAobGlrZWx5KFB5Q0Z1bmN0aW9uX0dFVF9GTEFHUyhmdW5jKSAmIE1FVEhfTykpIHsKKyAgICAgICAgICAgIHJldHVybiBfX1B5eF9QeU9iamVjdF9DYWxsTWV0aE8oZnVuYywgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19QeXhfX1B5T2JqZWN0X0NhbGxPbmVBcmcoZnVuYywgYXJnKTsKK30KKyNlbHNlCitzdGF0aWMgQ1lUSE9OX0lOTElORSBQeU9iamVjdCogX19QeXhfUHlPYmplY3RfQ2FsbE9uZUFyZyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZykgeworICAgIFB5T2JqZWN0KiBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIGFyZyk7CisgICAgcmV0dXJuIChsaWtlbHkoYXJncykpID8gX19QeXhfUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKSA6IE5VTEw7Cit9CisjZW5kaWYKKworc3RhdGljIENZVEhPTl9JTkxJTkUgdm9pZCBfX1B5eF9FeGNlcHRpb25TYXZlKFB5T2JqZWN0ICoqdHlwZSwgUHlPYmplY3QgKip2YWx1ZSwgUHlPYmplY3QgKip0YikgeworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgKnR5cGUgPSB0c3RhdGUtPmV4Y190eXBlOworICAgICp2YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOworICAgICp0YiA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKKyAgICBQeV9YSU5DUkVGKCp0eXBlKTsKKyAgICBQeV9YSU5DUkVGKCp2YWx1ZSk7CisgICAgUHlfWElOQ1JFRigqdGIpOworI2Vsc2UKKyAgICBQeUVycl9HZXRFeGNJbmZvKHR5cGUsIHZhbHVlLCB0Yik7CisjZW5kaWYKK30KK3N0YXRpYyB2b2lkIF9fUHl4X0V4Y2VwdGlvblJlc2V0KFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIFB5T2JqZWN0ICp0YikgeworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorICAgIFB5T2JqZWN0ICp0bXBfdHlwZSwgKnRtcF92YWx1ZSwgKnRtcF90YjsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIHRtcF90eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKKyAgICB0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKKyAgICB0bXBfdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7CisgICAgdHN0YXRlLT5leGNfdHlwZSA9IHR5cGU7CisgICAgdHN0YXRlLT5leGNfdmFsdWUgPSB2YWx1ZTsKKyAgICB0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSB0YjsKKyAgICBQeV9YREVDUkVGKHRtcF90eXBlKTsKKyAgICBQeV9YREVDUkVGKHRtcF92YWx1ZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdGIpOworI2Vsc2UKKyAgICBQeUVycl9TZXRFeGNJbmZvKHR5cGUsIHZhbHVlLCB0Yik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBfX1B5eF9HZXRFeGNlcHRpb24oUHlPYmplY3QgKip0eXBlLCBQeU9iamVjdCAqKnZhbHVlLCBQeU9iamVjdCAqKnRiKSB7CisgICAgUHlPYmplY3QgKmxvY2FsX3R5cGUsICpsb2NhbF92YWx1ZSwgKmxvY2FsX3RiOworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorICAgIFB5T2JqZWN0ICp0bXBfdHlwZSwgKnRtcF92YWx1ZSwgKnRtcF90YjsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIGxvY2FsX3R5cGUgPSB0c3RhdGUtPmN1cmV4Y190eXBlOworICAgIGxvY2FsX3ZhbHVlID0gdHN0YXRlLT5jdXJleGNfdmFsdWU7CisgICAgbG9jYWxfdGIgPSB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2s7CisgICAgdHN0YXRlLT5jdXJleGNfdHlwZSA9IDA7CisgICAgdHN0YXRlLT5jdXJleGNfdmFsdWUgPSAwOworICAgIHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjayA9IDA7CisjZWxzZQorICAgIFB5RXJyX0ZldGNoKCZsb2NhbF90eXBlLCAmbG9jYWxfdmFsdWUsICZsb2NhbF90Yik7CisjZW5kaWYKKyAgICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJmxvY2FsX3R5cGUsICZsb2NhbF92YWx1ZSwgJmxvY2FsX3RiKTsKKyNpZiBDWVRIT05fQ09NUElMSU5HX0lOX0NQWVRIT04KKyAgICBpZiAodW5saWtlbHkodHN0YXRlLT5jdXJleGNfdHlwZSkpCisjZWxzZQorICAgIGlmICh1bmxpa2VseShQeUVycl9PY2N1cnJlZCgpKSkKKyNlbmRpZgorICAgICAgICBnb3RvIGJhZDsKKyAgICAjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisgICAgaWYgKGxvY2FsX3RiKSB7CisgICAgICAgIGlmICh1bmxpa2VseShQeUV4Y2VwdGlvbl9TZXRUcmFjZWJhY2sobG9jYWxfdmFsdWUsIGxvY2FsX3RiKSA8IDApKQorICAgICAgICAgICAgZ290byBiYWQ7CisgICAgfQorICAgICNlbmRpZgorICAgIFB5X1hJTkNSRUYobG9jYWxfdGIpOworICAgIFB5X1hJTkNSRUYobG9jYWxfdHlwZSk7CisgICAgUHlfWElOQ1JFRihsb2NhbF92YWx1ZSk7CisgICAgKnR5cGUgPSBsb2NhbF90eXBlOworICAgICp2YWx1ZSA9IGxvY2FsX3ZhbHVlOworICAgICp0YiA9IGxvY2FsX3RiOworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorICAgIHRtcF90eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKKyAgICB0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKKyAgICB0bXBfdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7CisgICAgdHN0YXRlLT5leGNfdHlwZSA9IGxvY2FsX3R5cGU7CisgICAgdHN0YXRlLT5leGNfdmFsdWUgPSBsb2NhbF92YWx1ZTsKKyAgICB0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSBsb2NhbF90YjsKKyAgICBQeV9YREVDUkVGKHRtcF90eXBlKTsKKyAgICBQeV9YREVDUkVGKHRtcF92YWx1ZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdGIpOworI2Vsc2UKKyAgICBQeUVycl9TZXRFeGNJbmZvKGxvY2FsX3R5cGUsIGxvY2FsX3ZhbHVlLCBsb2NhbF90Yik7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK2JhZDoKKyAgICAqdHlwZSA9IDA7CisgICAgKnZhbHVlID0gMDsKKyAgICAqdGIgPSAwOworICAgIFB5X1hERUNSRUYobG9jYWxfdHlwZSk7CisgICAgUHlfWERFQ1JFRihsb2NhbF92YWx1ZSk7CisgICAgUHlfWERFQ1JFRihsb2NhbF90Yik7CisgICAgcmV0dXJuIC0xOworfQorCisjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OCitzdGF0aWMgQ1lUSE9OX0lOTElORSBQeU9iamVjdCogX19QeXhfUHlPYmplY3RfQ2FsbE5vQXJnKFB5T2JqZWN0ICpmdW5jKSB7CisjaWZkZWYgX19QeXhfQ3lGdW5jdGlvbl9VU0VECisgICAgaWYgKGxpa2VseShQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soZnVuYywgX19weXhfQ3lGdW5jdGlvblR5cGUpKSkgeworI2Vsc2UKKyAgICBpZiAobGlrZWx5KFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKSkgeworI2VuZGlmCisgICAgICAgIGlmIChsaWtlbHkoUHlDRnVuY3Rpb25fR0VUX0ZMQUdTKGZ1bmMpICYgTUVUSF9OT0FSR1MpKSB7CisgICAgICAgICAgICByZXR1cm4gX19QeXhfUHlPYmplY3RfQ2FsbE1ldGhPKGZ1bmMsIE5VTEwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX1B5eF9QeU9iamVjdF9DYWxsKGZ1bmMsIF9fcHl4X2VtcHR5X3R1cGxlLCBOVUxMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9fcHl4X2Jpc2VjdF9jb2RlX29iamVjdHMoX19QeXhfQ29kZU9iamVjdENhY2hlRW50cnkqIGVudHJpZXMsIGludCBjb3VudCwgaW50IGNvZGVfbGluZSkgeworICAgIGludCBzdGFydCA9IDAsIG1pZCA9IDAsIGVuZCA9IGNvdW50IC0gMTsKKyAgICBpZiAoZW5kID49IDAgJiYgY29kZV9saW5lID4gZW50cmllc1tlbmRdLmNvZGVfbGluZSkgeworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorICAgIHdoaWxlIChzdGFydCA8IGVuZCkgeworICAgICAgICBtaWQgPSAoc3RhcnQgKyBlbmQpIC8gMjsKKyAgICAgICAgaWYgKGNvZGVfbGluZSA8IGVudHJpZXNbbWlkXS5jb2RlX2xpbmUpIHsKKyAgICAgICAgICAgIGVuZCA9IG1pZDsKKyAgICAgICAgfSBlbHNlIGlmIChjb2RlX2xpbmUgPiBlbnRyaWVzW21pZF0uY29kZV9saW5lKSB7CisgICAgICAgICAgICAgc3RhcnQgPSBtaWQgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG1pZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29kZV9saW5lIDw9IGVudHJpZXNbbWlkXS5jb2RlX2xpbmUpIHsKKyAgICAgICAgcmV0dXJuIG1pZDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbWlkICsgMTsKKyAgICB9Cit9CitzdGF0aWMgUHlDb2RlT2JqZWN0ICpfX3B5eF9maW5kX2NvZGVfb2JqZWN0KGludCBjb2RlX2xpbmUpIHsKKyAgICBQeUNvZGVPYmplY3QqIGNvZGVfb2JqZWN0OworICAgIGludCBwb3M7CisgICAgaWYgKHVubGlrZWx5KCFjb2RlX2xpbmUpIHx8IHVubGlrZWx5KCFfX3B5eF9jb2RlX2NhY2hlLmVudHJpZXMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwb3MgPSBfX3B5eF9iaXNlY3RfY29kZV9vYmplY3RzKF9fcHl4X2NvZGVfY2FjaGUuZW50cmllcywgX19weXhfY29kZV9jYWNoZS5jb3VudCwgY29kZV9saW5lKTsKKyAgICBpZiAodW5saWtlbHkocG9zID49IF9fcHl4X2NvZGVfY2FjaGUuY291bnQpIHx8IHVubGlrZWx5KF9fcHl4X2NvZGVfY2FjaGUuZW50cmllc1twb3NdLmNvZGVfbGluZSAhPSBjb2RlX2xpbmUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjb2RlX29iamVjdCA9IF9fcHl4X2NvZGVfY2FjaGUuZW50cmllc1twb3NdLmNvZGVfb2JqZWN0OworICAgIFB5X0lOQ1JFRihjb2RlX29iamVjdCk7CisgICAgcmV0dXJuIGNvZGVfb2JqZWN0OworfQorc3RhdGljIHZvaWQgX19weXhfaW5zZXJ0X2NvZGVfb2JqZWN0KGludCBjb2RlX2xpbmUsIFB5Q29kZU9iamVjdCogY29kZV9vYmplY3QpIHsKKyAgICBpbnQgcG9zLCBpOworICAgIF9fUHl4X0NvZGVPYmplY3RDYWNoZUVudHJ5KiBlbnRyaWVzID0gX19weXhfY29kZV9jYWNoZS5lbnRyaWVzOworICAgIGlmICh1bmxpa2VseSghY29kZV9saW5lKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh1bmxpa2VseSghZW50cmllcykpIHsKKyAgICAgICAgZW50cmllcyA9IChfX1B5eF9Db2RlT2JqZWN0Q2FjaGVFbnRyeSopUHlNZW1fTWFsbG9jKDY0KnNpemVvZihfX1B5eF9Db2RlT2JqZWN0Q2FjaGVFbnRyeSkpOworICAgICAgICBpZiAobGlrZWx5KGVudHJpZXMpKSB7CisgICAgICAgICAgICBfX3B5eF9jb2RlX2NhY2hlLmVudHJpZXMgPSBlbnRyaWVzOworICAgICAgICAgICAgX19weXhfY29kZV9jYWNoZS5tYXhfY291bnQgPSA2NDsKKyAgICAgICAgICAgIF9fcHl4X2NvZGVfY2FjaGUuY291bnQgPSAxOworICAgICAgICAgICAgZW50cmllc1swXS5jb2RlX2xpbmUgPSBjb2RlX2xpbmU7CisgICAgICAgICAgICBlbnRyaWVzWzBdLmNvZGVfb2JqZWN0ID0gY29kZV9vYmplY3Q7CisgICAgICAgICAgICBQeV9JTkNSRUYoY29kZV9vYmplY3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcG9zID0gX19weXhfYmlzZWN0X2NvZGVfb2JqZWN0cyhfX3B5eF9jb2RlX2NhY2hlLmVudHJpZXMsIF9fcHl4X2NvZGVfY2FjaGUuY291bnQsIGNvZGVfbGluZSk7CisgICAgaWYgKChwb3MgPCBfX3B5eF9jb2RlX2NhY2hlLmNvdW50KSAmJiB1bmxpa2VseShfX3B5eF9jb2RlX2NhY2hlLmVudHJpZXNbcG9zXS5jb2RlX2xpbmUgPT0gY29kZV9saW5lKSkgeworICAgICAgICBQeUNvZGVPYmplY3QqIHRtcCA9IGVudHJpZXNbcG9zXS5jb2RlX29iamVjdDsKKyAgICAgICAgZW50cmllc1twb3NdLmNvZGVfb2JqZWN0ID0gY29kZV9vYmplY3Q7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChfX3B5eF9jb2RlX2NhY2hlLmNvdW50ID09IF9fcHl4X2NvZGVfY2FjaGUubWF4X2NvdW50KSB7CisgICAgICAgIGludCBuZXdfbWF4ID0gX19weXhfY29kZV9jYWNoZS5tYXhfY291bnQgKyA2NDsKKyAgICAgICAgZW50cmllcyA9IChfX1B5eF9Db2RlT2JqZWN0Q2FjaGVFbnRyeSopUHlNZW1fUmVhbGxvYygKKyAgICAgICAgICAgIF9fcHl4X2NvZGVfY2FjaGUuZW50cmllcywgKHNpemVfdCluZXdfbWF4KnNpemVvZihfX1B5eF9Db2RlT2JqZWN0Q2FjaGVFbnRyeSkpOworICAgICAgICBpZiAodW5saWtlbHkoIWVudHJpZXMpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgX19weXhfY29kZV9jYWNoZS5lbnRyaWVzID0gZW50cmllczsKKyAgICAgICAgX19weXhfY29kZV9jYWNoZS5tYXhfY291bnQgPSBuZXdfbWF4OworICAgIH0KKyAgICBmb3IgKGk9X19weXhfY29kZV9jYWNoZS5jb3VudDsgaT5wb3M7IGktLSkgeworICAgICAgICBlbnRyaWVzW2ldID0gZW50cmllc1tpLTFdOworICAgIH0KKyAgICBlbnRyaWVzW3Bvc10uY29kZV9saW5lID0gY29kZV9saW5lOworICAgIGVudHJpZXNbcG9zXS5jb2RlX29iamVjdCA9IGNvZGVfb2JqZWN0OworICAgIF9fcHl4X2NvZGVfY2FjaGUuY291bnQrKzsKKyAgICBQeV9JTkNSRUYoY29kZV9vYmplY3QpOworfQorCisjaW5jbHVkZSAiY29tcGlsZS5oIgorI2luY2x1ZGUgImZyYW1lb2JqZWN0LmgiCisjaW5jbHVkZSAidHJhY2ViYWNrLmgiCitzdGF0aWMgUHlDb2RlT2JqZWN0KiBfX1B5eF9DcmVhdGVDb2RlT2JqZWN0Rm9yVHJhY2ViYWNrKAorICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY25hbWUsIGludCBjX2xpbmUsCisgICAgICAgICAgICBpbnQgcHlfbGluZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgICBQeUNvZGVPYmplY3QgKnB5X2NvZGUgPSAwOworICAgIFB5T2JqZWN0ICpweV9zcmNmaWxlID0gMDsKKyAgICBQeU9iamVjdCAqcHlfZnVuY25hbWUgPSAwOworICAgICNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICAgIHB5X3NyY2ZpbGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKTsKKyAgICAjZWxzZQorICAgIHB5X3NyY2ZpbGUgPSBQeVVuaWNvZGVfRnJvbVN0cmluZyhmaWxlbmFtZSk7CisgICAgI2VuZGlmCisgICAgaWYgKCFweV9zcmNmaWxlKSBnb3RvIGJhZDsKKyAgICBpZiAoY19saW5lKSB7CisgICAgICAgICNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICAgICAgICBweV9mdW5jbmFtZSA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoICIlcyAoJXM6JWQpIiwgZnVuY25hbWUsIF9fcHl4X2NmaWxlbm0sIGNfbGluZSk7CisgICAgICAgICNlbHNlCisgICAgICAgIHB5X2Z1bmNuYW1lID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoICIlcyAoJXM6JWQpIiwgZnVuY25hbWUsIF9fcHl4X2NmaWxlbm0sIGNfbGluZSk7CisgICAgICAgICNlbmRpZgorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisgICAgICAgIHB5X2Z1bmNuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmdW5jbmFtZSk7CisgICAgICAgICNlbHNlCisgICAgICAgIHB5X2Z1bmNuYW1lID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoZnVuY25hbWUpOworICAgICAgICAjZW5kaWYKKyAgICB9CisgICAgaWYgKCFweV9mdW5jbmFtZSkgZ290byBiYWQ7CisgICAgcHlfY29kZSA9IF9fUHl4X1B5Q29kZV9OZXcoCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIF9fcHl4X2VtcHR5X2J5dGVzLCAvKlB5T2JqZWN0ICpjb2RlLCovCisgICAgICAgIF9fcHl4X2VtcHR5X3R1cGxlLCAvKlB5T2JqZWN0ICpjb25zdHMsKi8KKyAgICAgICAgX19weXhfZW1wdHlfdHVwbGUsIC8qUHlPYmplY3QgKm5hbWVzLCovCisgICAgICAgIF9fcHl4X2VtcHR5X3R1cGxlLCAvKlB5T2JqZWN0ICp2YXJuYW1lcywqLworICAgICAgICBfX3B5eF9lbXB0eV90dXBsZSwgLypQeU9iamVjdCAqZnJlZXZhcnMsKi8KKyAgICAgICAgX19weXhfZW1wdHlfdHVwbGUsIC8qUHlPYmplY3QgKmNlbGx2YXJzLCovCisgICAgICAgIHB5X3NyY2ZpbGUsICAgLypQeU9iamVjdCAqZmlsZW5hbWUsKi8KKyAgICAgICAgcHlfZnVuY25hbWUsICAvKlB5T2JqZWN0ICpuYW1lLCovCisgICAgICAgIHB5X2xpbmUsCisgICAgICAgIF9fcHl4X2VtcHR5X2J5dGVzICAvKlB5T2JqZWN0ICpsbm90YWIqLworICAgICk7CisgICAgUHlfREVDUkVGKHB5X3NyY2ZpbGUpOworICAgIFB5X0RFQ1JFRihweV9mdW5jbmFtZSk7CisgICAgcmV0dXJuIHB5X2NvZGU7CitiYWQ6CisgICAgUHlfWERFQ1JFRihweV9zcmNmaWxlKTsKKyAgICBQeV9YREVDUkVGKHB5X2Z1bmNuYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKK30KK3N0YXRpYyB2b2lkIF9fUHl4X0FkZFRyYWNlYmFjayhjb25zdCBjaGFyICpmdW5jbmFtZSwgaW50IGNfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHlfbGluZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgICBQeUNvZGVPYmplY3QgKnB5X2NvZGUgPSAwOworICAgIFB5RnJhbWVPYmplY3QgKnB5X2ZyYW1lID0gMDsKKyAgICBweV9jb2RlID0gX19weXhfZmluZF9jb2RlX29iamVjdChjX2xpbmUgPyBjX2xpbmUgOiBweV9saW5lKTsKKyAgICBpZiAoIXB5X2NvZGUpIHsKKyAgICAgICAgcHlfY29kZSA9IF9fUHl4X0NyZWF0ZUNvZGVPYmplY3RGb3JUcmFjZWJhY2soCisgICAgICAgICAgICBmdW5jbmFtZSwgY19saW5lLCBweV9saW5lLCBmaWxlbmFtZSk7CisgICAgICAgIGlmICghcHlfY29kZSkgZ290byBiYWQ7CisgICAgICAgIF9fcHl4X2luc2VydF9jb2RlX29iamVjdChjX2xpbmUgPyBjX2xpbmUgOiBweV9saW5lLCBweV9jb2RlKTsKKyAgICB9CisgICAgcHlfZnJhbWUgPSBQeUZyYW1lX05ldygKKyAgICAgICAgUHlUaHJlYWRTdGF0ZV9HRVQoKSwgLypQeVRocmVhZFN0YXRlICp0c3RhdGUsKi8KKyAgICAgICAgcHlfY29kZSwgICAgICAgICAgICAgLypQeUNvZGVPYmplY3QgKmNvZGUsKi8KKyAgICAgICAgX19weXhfZCwgICAgICAvKlB5T2JqZWN0ICpnbG9iYWxzLCovCisgICAgICAgIDAgICAgICAgICAgICAgICAgICAgIC8qUHlPYmplY3QgKmxvY2FscyovCisgICAgKTsKKyAgICBpZiAoIXB5X2ZyYW1lKSBnb3RvIGJhZDsKKyAgICBweV9mcmFtZS0+Zl9saW5lbm8gPSBweV9saW5lOworICAgIFB5VHJhY2VCYWNrX0hlcmUocHlfZnJhbWUpOworYmFkOgorICAgIFB5X1hERUNSRUYocHlfY29kZSk7CisgICAgUHlfWERFQ1JFRihweV9mcmFtZSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX19QeXhfSW1wb3J0KFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqZnJvbV9saXN0LCBpbnQgbGV2ZWwpIHsKKyAgICBQeU9iamVjdCAqZW1wdHlfbGlzdCA9IDA7CisgICAgUHlPYmplY3QgKm1vZHVsZSA9IDA7CisgICAgUHlPYmplY3QgKmdsb2JhbF9kaWN0ID0gMDsKKyAgICBQeU9iamVjdCAqZW1wdHlfZGljdCA9IDA7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAzMDAwMAorICAgIFB5T2JqZWN0ICpweV9pbXBvcnQ7CisgICAgcHlfaW1wb3J0ID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihfX3B5eF9iLCBfX3B5eF9uX3NfaW1wb3J0KTsKKyAgICBpZiAoIXB5X2ltcG9ydCkKKyAgICAgICAgZ290byBiYWQ7CisgICAgI2VuZGlmCisgICAgaWYgKGZyb21fbGlzdCkKKyAgICAgICAgbGlzdCA9IGZyb21fbGlzdDsKKyAgICBlbHNlIHsKKyAgICAgICAgZW1wdHlfbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgICAgIGlmICghZW1wdHlfbGlzdCkKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICBsaXN0ID0gZW1wdHlfbGlzdDsKKyAgICB9CisgICAgZ2xvYmFsX2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KF9fcHl4X20pOworICAgIGlmICghZ2xvYmFsX2RpY3QpCisgICAgICAgIGdvdG8gYmFkOworICAgIGVtcHR5X2RpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFlbXB0eV9kaWN0KQorICAgICAgICBnb3RvIGJhZDsKKyAgICB7CisgICAgICAgICNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgICAgICAgaWYgKGxldmVsID09IC0xKSB7CisgICAgICAgICAgICBpZiAoc3RyY2hyKF9fUHl4X01PRFVMRV9OQU1FLCAnLicpKSB7CisgICAgICAgICAgICAgICAgI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAzMDAwMAorICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpweV9sZXZlbCA9IFB5SW50X0Zyb21Mb25nKDEpOworICAgICAgICAgICAgICAgIGlmICghcHlfbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICAgICAgICAgIG1vZHVsZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MocHlfaW1wb3J0LAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBnbG9iYWxfZGljdCwgZW1wdHlfZGljdCwgbGlzdCwgcHlfbGV2ZWwsIE5VTEwpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihweV9sZXZlbCk7CisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbE9iamVjdCgKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwgZ2xvYmFsX2RpY3QsIGVtcHR5X2RpY3QsIGxpc3QsIDEpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGlmICghbW9kdWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbXBvcnRFcnJvcikpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZXZlbCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIGlmICghbW9kdWxlKSB7CisgICAgICAgICAgICAjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDMwMDAwCisgICAgICAgICAgICBQeU9iamVjdCAqcHlfbGV2ZWwgPSBQeUludF9Gcm9tTG9uZyhsZXZlbCk7CisgICAgICAgICAgICBpZiAoIXB5X2xldmVsKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICAgICAgbW9kdWxlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhweV9pbXBvcnQsCisgICAgICAgICAgICAgICAgbmFtZSwgZ2xvYmFsX2RpY3QsIGVtcHR5X2RpY3QsIGxpc3QsIHB5X2xldmVsLCBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihweV9sZXZlbCk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWxPYmplY3QoCisgICAgICAgICAgICAgICAgbmFtZSwgZ2xvYmFsX2RpY3QsIGVtcHR5X2RpY3QsIGxpc3QsIGxldmVsKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgfQorYmFkOgorICAgICNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMzAwMDAKKyAgICBQeV9YREVDUkVGKHB5X2ltcG9ydCk7CisgICAgI2VuZGlmCisgICAgUHlfWERFQ1JFRihlbXB0eV9saXN0KTsKKyAgICBQeV9YREVDUkVGKGVtcHR5X2RpY3QpOworICAgIHJldHVybiBtb2R1bGU7Cit9CisKKyNkZWZpbmUgX19QWVhfVkVSSUZZX1JFVFVSTl9JTlQodGFyZ2V0X3R5cGUsIGZ1bmNfdHlwZSwgZnVuY192YWx1ZSkgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZ1bmNfdHlwZSB2YWx1ZSA9IGZ1bmNfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNpemVvZih0YXJnZXRfdHlwZSkgPCBzaXplb2YoZnVuY190eXBlKSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHVubGlrZWx5KHZhbHVlICE9IChmdW5jX3R5cGUpICh0YXJnZXRfdHlwZSkgdmFsdWUpKSB7ICAgICBcCisgICAgICAgICAgICAgICAgZnVuY190eXBlIHplcm8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoaXNfdW5zaWduZWQgJiYgdW5saWtlbHkodmFsdWUgPCB6ZXJvKSkgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBnb3RvIHJhaXNlX25lZ19vdmVyZmxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZ290byByYWlzZV9vdmVyZmxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuICh0YXJnZXRfdHlwZSkgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTiAmJiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAjaWYgQ1lUSE9OX1VTRV9QWUxPTkdfSU5URVJOQUxTCisgICNpbmNsdWRlICJsb25naW50cmVwci5oIgorICNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBDWVRIT05fSU5MSU5FIGludCBfX1B5eF9QeUludF9Bc19pbnQoUHlPYmplY3QgKngpIHsKKyAgICBjb25zdCBpbnQgbmVnX29uZSA9IChpbnQpIC0xLCBjb25zdF96ZXJvID0gMDsKKyAgICBjb25zdCBpbnQgaXNfdW5zaWduZWQgPSBuZWdfb25lID4gY29uc3RfemVybzsKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICAgIGlmIChsaWtlbHkoUHlJbnRfQ2hlY2soeCkpKSB7CisgICAgICAgIGlmIChzaXplb2YoaW50KSA8IHNpemVvZihsb25nKSkgeworICAgICAgICAgICAgX19QWVhfVkVSSUZZX1JFVFVSTl9JTlQoaW50LCBsb25nLCBQeUludF9BU19MT05HKHgpKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9uZyB2YWwgPSBQeUludF9BU19MT05HKHgpOworICAgICAgICAgICAgaWYgKGlzX3Vuc2lnbmVkICYmIHVubGlrZWx5KHZhbCA8IDApKSB7CisgICAgICAgICAgICAgICAgZ290byByYWlzZV9uZWdfb3ZlcmZsb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGludCkgdmFsOworICAgICAgICB9CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICBpZiAobGlrZWx5KFB5TG9uZ19DaGVjayh4KSkpIHsKKyAgICAgICAgaWYgKGlzX3Vuc2lnbmVkKSB7CisjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OICYmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICNpZiBDWVRIT05fVVNFX1BZTE9OR19JTlRFUk5BTFMKKyAgICAgICAgICAgIHN3aXRjaCAoUHlfU0laRSh4KSkgeworICAgICAgICAgICAgICAgIGNhc2UgIDA6IHJldHVybiAwOworICAgICAgICAgICAgICAgIGNhc2UgIDE6IF9fUFlYX1ZFUklGWV9SRVRVUk5fSU5UKGludCwgZGlnaXQsICgoUHlMb25nT2JqZWN0Kil4KS0+b2JfZGlnaXRbMF0pOworICAgICAgICAgICAgfQorICNlbmRpZgorI2VuZGlmCisgICAgICAgICAgICBpZiAodW5saWtlbHkoUHlfU0laRSh4KSA8IDApKSB7CisgICAgICAgICAgICAgICAgZ290byByYWlzZV9uZWdfb3ZlcmZsb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZW9mKGludCkgPD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSB7CisgICAgICAgICAgICAgICAgX19QWVhfVkVSSUZZX1JFVFVSTl9JTlQoaW50LCB1bnNpZ25lZCBsb25nLCBQeUxvbmdfQXNVbnNpZ25lZExvbmcoeCkpCisgICAgICAgICAgICB9IGVsc2UgaWYgKHNpemVvZihpbnQpIDw9IHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpKSB7CisgICAgICAgICAgICAgICAgX19QWVhfVkVSSUZZX1JFVFVSTl9JTlQoaW50LCB1bnNpZ25lZCBsb25nIGxvbmcsIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcoeCkpCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OICYmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICNpZiBDWVRIT05fVVNFX1BZTE9OR19JTlRFUk5BTFMKKyAgICAgICAgICAgIHN3aXRjaCAoUHlfU0laRSh4KSkgeworICAgICAgICAgICAgICAgIGNhc2UgIDA6IHJldHVybiAwOworICAgICAgICAgICAgICAgIGNhc2UgIDE6IF9fUFlYX1ZFUklGWV9SRVRVUk5fSU5UKGludCwgIGRpZ2l0LCArKCgoUHlMb25nT2JqZWN0Kil4KS0+b2JfZGlnaXRbMF0pKTsKKyAgICAgICAgICAgICAgICBjYXNlIC0xOiBfX1BZWF9WRVJJRllfUkVUVVJOX0lOVChpbnQsIHNkaWdpdCwgLShzZGlnaXQpICgoUHlMb25nT2JqZWN0Kil4KS0+b2JfZGlnaXRbMF0pOworICAgICAgICAgICAgfQorICNlbmRpZgorI2VuZGlmCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGludCkgPD0gc2l6ZW9mKGxvbmcpKSB7CisgICAgICAgICAgICAgICAgX19QWVhfVkVSSUZZX1JFVFVSTl9JTlQoaW50LCBsb25nLCBQeUxvbmdfQXNMb25nKHgpKQorICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplb2YoaW50KSA8PSBzaXplb2YobG9uZyBsb25nKSkgeworICAgICAgICAgICAgICAgIF9fUFlYX1ZFUklGWV9SRVRVUk5fSU5UKGludCwgbG9uZyBsb25nLCBQeUxvbmdfQXNMb25nTG9uZyh4KSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9QWVBZICYmICFkZWZpbmVkKF9QeUxvbmdfQXNCeXRlQXJyYXkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfUHlMb25nX0FzQnl0ZUFycmF5KCkgbm90IGF2YWlsYWJsZSBpbiBQeVB5LCBjYW5ub3QgY29udmVydCBsYXJnZSBudW1iZXJzIik7CisjZWxzZQorICAgICAgICAgICAgaW50IHZhbDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gX19QeXhfUHlOdW1iZXJfSW50KHgpOworICNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICAgICAgICAgICAgaWYgKGxpa2VseSh2KSAmJiAhUHlMb25nX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnRtcCA9IHY7CisgICAgICAgICAgICAgICAgdiA9IFB5TnVtYmVyX0xvbmcodG1wKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIH0KKyAjZW5kaWYKKyAgICAgICAgICAgIGlmIChsaWtlbHkodikpIHsKKyAgICAgICAgICAgICAgICBpbnQgb25lID0gMTsgaW50IGlzX2xpdHRsZSA9IChpbnQpKih1bnNpZ25lZCBjaGFyICopJm9uZTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpieXRlcyA9ICh1bnNpZ25lZCBjaGFyICopJnZhbDsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0ICopdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcywgc2l6ZW9mKHZhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbGl0dGxlLCAhaXNfdW5zaWduZWQpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICBpZiAobGlrZWx5KCFyZXQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gKGludCkgLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgdmFsOworICAgICAgICBQeU9iamVjdCAqdG1wID0gX19QeXhfUHlOdW1iZXJfSW50KHgpOworICAgICAgICBpZiAoIXRtcCkgcmV0dXJuIChpbnQpIC0xOworICAgICAgICB2YWwgPSBfX1B5eF9QeUludF9Bc19pbnQodG1wKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorcmFpc2Vfb3ZlcmZsb3c6CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICJ2YWx1ZSB0b28gbGFyZ2UgdG8gY29udmVydCB0byBpbnQiKTsKKyAgICByZXR1cm4gKGludCkgLTE7CityYWlzZV9uZWdfb3ZlcmZsb3c6CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIHZhbHVlIHRvIGludCIpOworICAgIHJldHVybiAoaW50KSAtMTsKK30KKworc3RhdGljIENZVEhPTl9JTkxJTkUgUHlPYmplY3QqIF9fUHl4X1B5SW50X0Zyb21faW50KGludCB2YWx1ZSkgeworICAgIGNvbnN0IGludCBuZWdfb25lID0gKGludCkgLTEsIGNvbnN0X3plcm8gPSAwOworICAgIGNvbnN0IGludCBpc191bnNpZ25lZCA9IG5lZ19vbmUgPiBjb25zdF96ZXJvOworICAgIGlmIChpc191bnNpZ25lZCkgeworICAgICAgICBpZiAoc2l6ZW9mKGludCkgPCBzaXplb2YobG9uZykpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHNpemVvZihpbnQpIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSkgeworICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2l6ZW9mKGludCkgPD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoKHVuc2lnbmVkIGxvbmcgbG9uZykgdmFsdWUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNpemVvZihpbnQpIDw9IHNpemVvZihsb25nKSkgeworICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2l6ZW9mKGludCkgPD0gc2l6ZW9mKGxvbmcgbG9uZykpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIGludCBvbmUgPSAxOyBpbnQgbGl0dGxlID0gKGludCkqKHVuc2lnbmVkIGNoYXIgKikmb25lOworICAgICAgICB1bnNpZ25lZCBjaGFyICpieXRlcyA9ICh1bnNpZ25lZCBjaGFyICopJnZhbHVlOworICAgICAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KGJ5dGVzLCBzaXplb2YoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXR0bGUsICFpc191bnNpZ25lZCk7CisgICAgfQorfQorCitzdGF0aWMgQ1lUSE9OX0lOTElORSBQeU9iamVjdCogX19QeXhfUHlJbnRfRnJvbV91bnNpZ25lZF9pbnQodW5zaWduZWQgaW50IHZhbHVlKSB7CisgICAgY29uc3QgdW5zaWduZWQgaW50IG5lZ19vbmUgPSAodW5zaWduZWQgaW50KSAtMSwgY29uc3RfemVybyA9IDA7CisgICAgY29uc3QgaW50IGlzX3Vuc2lnbmVkID0gbmVnX29uZSA+IGNvbnN0X3plcm87CisgICAgaWYgKGlzX3Vuc2lnbmVkKSB7CisgICAgICAgIGlmIChzaXplb2YodW5zaWduZWQgaW50KSA8IHNpemVvZihsb25nKSkgeworICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2l6ZW9mKHVuc2lnbmVkIGludCkgPD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSB7CisgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaXplb2YodW5zaWduZWQgaW50KSA8PSBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSkgeworICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygodW5zaWduZWQgbG9uZyBsb25nKSB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2l6ZW9mKHVuc2lnbmVkIGludCkgPD0gc2l6ZW9mKGxvbmcpKSB7CisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaXplb2YodW5zaWduZWQgaW50KSA8PSBzaXplb2YobG9uZyBsb25nKSkgeworICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgdmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgaW50IG9uZSA9IDE7IGludCBsaXR0bGUgPSAoaW50KSoodW5zaWduZWQgY2hhciAqKSZvbmU7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKHVuc2lnbmVkIGNoYXIgKikmdmFsdWU7CisgICAgICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoYnl0ZXMsIHNpemVvZih1bnNpZ25lZCBpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdHRsZSwgIWlzX3Vuc2lnbmVkKTsKKyAgICB9Cit9CisKK3N0YXRpYyBDWVRIT05fSU5MSU5FIFB5T2JqZWN0KiBfX1B5eF9QeUludF9Gcm9tX3Vuc2lnbmVkX2NoYXIodW5zaWduZWQgY2hhciB2YWx1ZSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmVnX29uZSA9ICh1bnNpZ25lZCBjaGFyKSAtMSwgY29uc3RfemVybyA9IDA7CisgICAgY29uc3QgaW50IGlzX3Vuc2lnbmVkID0gbmVnX29uZSA+IGNvbnN0X3plcm87CisgICAgaWYgKGlzX3Vuc2lnbmVkKSB7CisgICAgICAgIGlmIChzaXplb2YodW5zaWduZWQgY2hhcikgPCBzaXplb2YobG9uZykpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHNpemVvZih1bnNpZ25lZCBjaGFyKSA8PSBzaXplb2YodW5zaWduZWQgbG9uZykpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZykgdmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHNpemVvZih1bnNpZ25lZCBjaGFyKSA8PSBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSkgeworICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygodW5zaWduZWQgbG9uZyBsb25nKSB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2l6ZW9mKHVuc2lnbmVkIGNoYXIpIDw9IHNpemVvZihsb25nKSkgeworICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2l6ZW9mKHVuc2lnbmVkIGNoYXIpIDw9IHNpemVvZihsb25nIGxvbmcpKSB7CisgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBpbnQgb25lID0gMTsgaW50IGxpdHRsZSA9IChpbnQpKih1bnNpZ25lZCBjaGFyICopJm9uZTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAodW5zaWduZWQgY2hhciAqKSZ2YWx1ZTsKKyAgICAgICAgcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheShieXRlcywgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdHRsZSwgIWlzX3Vuc2lnbmVkKTsKKyAgICB9Cit9CisKK3N0YXRpYyBDWVRIT05fSU5MSU5FIFB5T2JqZWN0KiBfX1B5eF9QeUludF9Gcm9tX2xvbmcobG9uZyB2YWx1ZSkgeworICAgIGNvbnN0IGxvbmcgbmVnX29uZSA9IChsb25nKSAtMSwgY29uc3RfemVybyA9IDA7CisgICAgY29uc3QgaW50IGlzX3Vuc2lnbmVkID0gbmVnX29uZSA+IGNvbnN0X3plcm87CisgICAgaWYgKGlzX3Vuc2lnbmVkKSB7CisgICAgICAgIGlmIChzaXplb2YobG9uZykgPCBzaXplb2YobG9uZykpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHNpemVvZihsb25nKSA8PSBzaXplb2YodW5zaWduZWQgbG9uZykpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZykgdmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHNpemVvZihsb25nKSA8PSBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSkgeworICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygodW5zaWduZWQgbG9uZyBsb25nKSB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2l6ZW9mKGxvbmcpIDw9IHNpemVvZihsb25nKSkgeworICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2l6ZW9mKGxvbmcpIDw9IHNpemVvZihsb25nIGxvbmcpKSB7CisgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBpbnQgb25lID0gMTsgaW50IGxpdHRsZSA9IChpbnQpKih1bnNpZ25lZCBjaGFyICopJm9uZTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAodW5zaWduZWQgY2hhciAqKSZ2YWx1ZTsKKyAgICAgICAgcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheShieXRlcywgc2l6ZW9mKGxvbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdHRsZSwgIWlzX3Vuc2lnbmVkKTsKKyAgICB9Cit9CisKK3N0YXRpYyBDWVRIT05fSU5MSU5FIGxvbmcgX19QeXhfUHlJbnRfQXNfbG9uZyhQeU9iamVjdCAqeCkgeworICAgIGNvbnN0IGxvbmcgbmVnX29uZSA9IChsb25nKSAtMSwgY29uc3RfemVybyA9IDA7CisgICAgY29uc3QgaW50IGlzX3Vuc2lnbmVkID0gbmVnX29uZSA+IGNvbnN0X3plcm87CisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKKyAgICBpZiAobGlrZWx5KFB5SW50X0NoZWNrKHgpKSkgeworICAgICAgICBpZiAoc2l6ZW9mKGxvbmcpIDwgc2l6ZW9mKGxvbmcpKSB7CisgICAgICAgICAgICBfX1BZWF9WRVJJRllfUkVUVVJOX0lOVChsb25nLCBsb25nLCBQeUludF9BU19MT05HKHgpKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9uZyB2YWwgPSBQeUludF9BU19MT05HKHgpOworICAgICAgICAgICAgaWYgKGlzX3Vuc2lnbmVkICYmIHVubGlrZWx5KHZhbCA8IDApKSB7CisgICAgICAgICAgICAgICAgZ290byByYWlzZV9uZWdfb3ZlcmZsb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGxvbmcpIHZhbDsKKyAgICAgICAgfQorICAgIH0gZWxzZQorI2VuZGlmCisgICAgaWYgKGxpa2VseShQeUxvbmdfQ2hlY2soeCkpKSB7CisgICAgICAgIGlmIChpc191bnNpZ25lZCkgeworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTiAmJiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAjaWYgQ1lUSE9OX1VTRV9QWUxPTkdfSU5URVJOQUxTCisgICAgICAgICAgICBzd2l0Y2ggKFB5X1NJWkUoeCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICAwOiByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBjYXNlICAxOiBfX1BZWF9WRVJJRllfUkVUVVJOX0lOVChsb25nLCBkaWdpdCwgKChQeUxvbmdPYmplY3QqKXgpLT5vYl9kaWdpdFswXSk7CisgICAgICAgICAgICB9CisgI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgIGlmICh1bmxpa2VseShQeV9TSVpFKHgpIDwgMCkpIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJhaXNlX25lZ19vdmVyZmxvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplb2YobG9uZykgPD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSB7CisgICAgICAgICAgICAgICAgX19QWVhfVkVSSUZZX1JFVFVSTl9JTlQobG9uZywgdW5zaWduZWQgbG9uZywgUHlMb25nX0FzVW5zaWduZWRMb25nKHgpKQorICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplb2YobG9uZykgPD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpIHsKKyAgICAgICAgICAgICAgICBfX1BZWF9WRVJJRllfUkVUVVJOX0lOVChsb25nLCB1bnNpZ25lZCBsb25nIGxvbmcsIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcoeCkpCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OICYmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICNpZiBDWVRIT05fVVNFX1BZTE9OR19JTlRFUk5BTFMKKyAgICAgICAgICAgIHN3aXRjaCAoUHlfU0laRSh4KSkgeworICAgICAgICAgICAgICAgIGNhc2UgIDA6IHJldHVybiAwOworICAgICAgICAgICAgICAgIGNhc2UgIDE6IF9fUFlYX1ZFUklGWV9SRVRVUk5fSU5UKGxvbmcsICBkaWdpdCwgKygoKFB5TG9uZ09iamVjdCopeCktPm9iX2RpZ2l0WzBdKSk7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogX19QWVhfVkVSSUZZX1JFVFVSTl9JTlQobG9uZywgc2RpZ2l0LCAtKHNkaWdpdCkgKChQeUxvbmdPYmplY3QqKXgpLT5vYl9kaWdpdFswXSk7CisgICAgICAgICAgICB9CisgI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgIGlmIChzaXplb2YobG9uZykgPD0gc2l6ZW9mKGxvbmcpKSB7CisgICAgICAgICAgICAgICAgX19QWVhfVkVSSUZZX1JFVFVSTl9JTlQobG9uZywgbG9uZywgUHlMb25nX0FzTG9uZyh4KSkKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZW9mKGxvbmcpIDw9IHNpemVvZihsb25nIGxvbmcpKSB7CisgICAgICAgICAgICAgICAgX19QWVhfVkVSSUZZX1JFVFVSTl9JTlQobG9uZywgbG9uZyBsb25nLCBQeUxvbmdfQXNMb25nTG9uZyh4KSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9QWVBZICYmICFkZWZpbmVkKF9QeUxvbmdfQXNCeXRlQXJyYXkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfUHlMb25nX0FzQnl0ZUFycmF5KCkgbm90IGF2YWlsYWJsZSBpbiBQeVB5LCBjYW5ub3QgY29udmVydCBsYXJnZSBudW1iZXJzIik7CisjZWxzZQorICAgICAgICAgICAgbG9uZyB2YWw7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IF9fUHl4X1B5TnVtYmVyX0ludCh4KTsKKyAjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKKyAgICAgICAgICAgIGlmIChsaWtlbHkodikgJiYgIVB5TG9uZ19DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0bXAgPSB2OworICAgICAgICAgICAgICAgIHYgPSBQeU51bWJlcl9Mb25nKHRtcCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICB9CisgI2VuZGlmCisgICAgICAgICAgICBpZiAobGlrZWx5KHYpKSB7CisgICAgICAgICAgICAgICAgaW50IG9uZSA9IDE7IGludCBpc19saXR0bGUgPSAoaW50KSoodW5zaWduZWQgY2hhciAqKSZvbmU7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAodW5zaWduZWQgY2hhciAqKSZ2YWw7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMsIHNpemVvZih2YWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpdHRsZSwgIWlzX3Vuc2lnbmVkKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgaWYgKGxpa2VseSghcmV0KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIChsb25nKSAtMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGxvbmcgdmFsOworICAgICAgICBQeU9iamVjdCAqdG1wID0gX19QeXhfUHlOdW1iZXJfSW50KHgpOworICAgICAgICBpZiAoIXRtcCkgcmV0dXJuIChsb25nKSAtMTsKKyAgICAgICAgdmFsID0gX19QeXhfUHlJbnRfQXNfbG9uZyh0bXApOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CityYWlzZV9vdmVyZmxvdzoKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgInZhbHVlIHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIGxvbmciKTsKKyAgICByZXR1cm4gKGxvbmcpIC0xOworcmFpc2VfbmVnX292ZXJmbG93OgorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSB2YWx1ZSB0byBsb25nIik7CisgICAgcmV0dXJuIChsb25nKSAtMTsKK30KKworc3RhdGljIFB5VHlwZU9iamVjdCogX19QeXhfRmV0Y2hDb21tb25UeXBlKFB5VHlwZU9iamVjdCogdHlwZSkgeworICAgIFB5T2JqZWN0KiBmYWtlX21vZHVsZTsKKyAgICBQeVR5cGVPYmplY3QqIGNhY2hlZF90eXBlID0gTlVMTDsKKyAgICBmYWtlX21vZHVsZSA9IFB5SW1wb3J0X0FkZE1vZHVsZSgoY2hhciopICJfY3l0aG9uXyIgQ1lUSE9OX0FCSSk7CisgICAgaWYgKCFmYWtlX21vZHVsZSkgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKGZha2VfbW9kdWxlKTsKKyAgICBjYWNoZWRfdHlwZSA9IChQeVR5cGVPYmplY3QqKSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGZha2VfbW9kdWxlLCB0eXBlLT50cF9uYW1lKTsKKyAgICBpZiAoY2FjaGVkX3R5cGUpIHsKKyAgICAgICAgaWYgKCFQeVR5cGVfQ2hlY2soKFB5T2JqZWN0KiljYWNoZWRfdHlwZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIlNoYXJlZCBDeXRob24gdHlwZSAlLjIwMHMgaXMgbm90IGEgdHlwZSBvYmplY3QiLAorICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhY2hlZF90eXBlLT50cF9iYXNpY3NpemUgIT0gdHlwZS0+dHBfYmFzaWNzaXplKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJTaGFyZWQgQ3l0aG9uIHR5cGUgJS4yMDBzIGhhcyB0aGUgd3Jvbmcgc2l6ZSwgdHJ5IHJlY29tcGlsaW5nIiwKKyAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgZ290byBiYWQ7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmIChQeVR5cGVfUmVhZHkodHlwZSkgPCAwKSBnb3RvIGJhZDsKKyAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoZmFrZV9tb2R1bGUsIHR5cGUtPnRwX25hbWUsIChQeU9iamVjdCopIHR5cGUpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICBQeV9JTkNSRUYodHlwZSk7CisgICAgICAgIGNhY2hlZF90eXBlID0gdHlwZTsKKyAgICB9Citkb25lOgorICAgIFB5X0RFQ1JFRihmYWtlX21vZHVsZSk7CisgICAgcmV0dXJuIGNhY2hlZF90eXBlOworYmFkOgorICAgIFB5X1hERUNSRUYoY2FjaGVkX3R5cGUpOworICAgIGNhY2hlZF90eXBlID0gTlVMTDsKKyAgICBnb3RvIGRvbmU7Cit9CisKK3N0YXRpYyBDWVRIT05fSU5MSU5FIHZvaWQgX19QeXhfRXhjZXB0aW9uU3dhcChQeU9iamVjdCAqKnR5cGUsIFB5T2JqZWN0ICoqdmFsdWUsIFB5T2JqZWN0ICoqdGIpIHsKKyAgICBQeU9iamVjdCAqdG1wX3R5cGUsICp0bXBfdmFsdWUsICp0bXBfdGI7CisjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OCisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICB0bXBfdHlwZSA9IHRzdGF0ZS0+ZXhjX3R5cGU7CisgICAgdG1wX3ZhbHVlID0gdHN0YXRlLT5leGNfdmFsdWU7CisgICAgdG1wX3RiID0gdHN0YXRlLT5leGNfdHJhY2ViYWNrOworICAgIHRzdGF0ZS0+ZXhjX3R5cGUgPSAqdHlwZTsKKyAgICB0c3RhdGUtPmV4Y192YWx1ZSA9ICp2YWx1ZTsKKyAgICB0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSAqdGI7CisjZWxzZQorICAgIFB5RXJyX0dldEV4Y0luZm8oJnRtcF90eXBlLCAmdG1wX3ZhbHVlLCAmdG1wX3RiKTsKKyAgICBQeUVycl9TZXRFeGNJbmZvKCp0eXBlLCAqdmFsdWUsICp0Yik7CisjZW5kaWYKKyAgICAqdHlwZSA9IHRtcF90eXBlOworICAgICp2YWx1ZSA9IHRtcF92YWx1ZTsKKyAgICAqdGIgPSB0bXBfdGI7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogX19QeXhfUHlPYmplY3RfQ2FsbE1ldGhvZDEoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QqIG1ldGhvZF9uYW1lLCBQeU9iamVjdCogYXJnKSB7CisgICAgUHlPYmplY3QgKm1ldGhvZCwgKnJlc3VsdCA9IE5VTEw7CisgICAgbWV0aG9kID0gX19QeXhfUHlPYmplY3RfR2V0QXR0clN0cihvYmosIG1ldGhvZF9uYW1lKTsKKyAgICBpZiAodW5saWtlbHkoIW1ldGhvZCkpIGdvdG8gYmFkOworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorICAgIGlmIChsaWtlbHkoUHlNZXRob2RfQ2hlY2sobWV0aG9kKSkpIHsKKyAgICAgICAgUHlPYmplY3QgKnNlbGYgPSBQeU1ldGhvZF9HRVRfU0VMRihtZXRob2QpOworICAgICAgICBpZiAobGlrZWx5KHNlbGYpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqYXJnczsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmdW5jdGlvbiA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihtZXRob2QpOworICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDIpOworICAgICAgICAgICAgaWYgKHVubGlrZWx5KCFhcmdzKSkgZ290byBiYWQ7CisgICAgICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDAsIHNlbGYpOworICAgICAgICAgICAgUHlfSU5DUkVGKGFyZyk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDEsIGFyZyk7CisgICAgICAgICAgICBQeV9JTkNSRUYoZnVuY3Rpb24pOworICAgICAgICAgICAgUHlfREVDUkVGKG1ldGhvZCk7IG1ldGhvZCA9IE5VTEw7CisgICAgICAgICAgICByZXN1bHQgPSBfX1B5eF9QeU9iamVjdF9DYWxsKGZ1bmN0aW9uLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jdGlvbik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgcmVzdWx0ID0gX19QeXhfUHlPYmplY3RfQ2FsbE9uZUFyZyhtZXRob2QsIGFyZyk7CitiYWQ6CisgICAgUHlfWERFQ1JFRihtZXRob2QpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX19QeXhfR2VuZXJhdG9yX05leHQoUHlPYmplY3QgKnNlbGYpOworc3RhdGljIFB5T2JqZWN0ICpfX1B5eF9HZW5lcmF0b3JfU2VuZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKTsKK3N0YXRpYyBQeU9iamVjdCAqX19QeXhfR2VuZXJhdG9yX0Nsb3NlKFB5T2JqZWN0ICpzZWxmKTsKK3N0YXRpYyBQeU9iamVjdCAqX19QeXhfR2VuZXJhdG9yX1Rocm93KFB5T2JqZWN0ICpnZW4sIFB5T2JqZWN0ICphcmdzKTsKK3N0YXRpYyBQeVR5cGVPYmplY3QgKl9fcHl4X0dlbmVyYXRvclR5cGUgPSAwOworI2RlZmluZSBfX1B5eF9HZW5lcmF0b3JfQ2hlY2tFeGFjdChvYmopIChQeV9UWVBFKG9iaikgPT0gX19weXhfR2VuZXJhdG9yVHlwZSkKKyNkZWZpbmUgX19QeXhfR2VuZXJhdG9yX1VuZGVsZWdhdGUoZ2VuKSBQeV9DTEVBUigoZ2VuKS0+eWllbGRmcm9tKQorI2lmIDEgfHwgUFlfVkVSU0lPTl9IRVggPCAweDAzMDMwMEIwCitzdGF0aWMgaW50IF9fUHl4X1B5R2VuX0ZldGNoU3RvcEl0ZXJhdGlvblZhbHVlKFB5T2JqZWN0ICoqcHZhbHVlKSB7CisgICAgUHlPYmplY3QgKmV0LCAqZXYsICp0YjsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSBOVUxMOworICAgIF9fUHl4X0VyckZldGNoKCZldCwgJmV2LCAmdGIpOworICAgIGlmICghZXQpIHsKKyAgICAgICAgUHlfWERFQ1JFRih0Yik7CisgICAgICAgIFB5X1hERUNSRUYoZXYpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICpwdmFsdWUgPSBQeV9Ob25lOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHVubGlrZWx5KGV0ICE9IFB5RXhjX1N0b3BJdGVyYXRpb24pICYmCisgICAgICAgICAgICB1bmxpa2VseSghUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKGV0LCBQeUV4Y19TdG9wSXRlcmF0aW9uKSkpIHsKKyAgICAgICAgX19QeXhfRXJyUmVzdG9yZShldCwgZXYsIHRiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGlrZWx5KGV0ID09IFB5RXhjX1N0b3BJdGVyYXRpb24pKSB7CisgICAgICAgIGlmIChsaWtlbHkoIWV2KSB8fCAhUHlPYmplY3RfSXNJbnN0YW5jZShldiwgUHlFeGNfU3RvcEl0ZXJhdGlvbikpIHsKKyAgICAgICAgICAgIGlmICghZXYpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgZXYgPSBQeV9Ob25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRih0Yik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXQpOworICAgICAgICAgICAgKnB2YWx1ZSA9IGV2OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZldCwgJmV2LCAmdGIpOworICAgIGlmICh1bmxpa2VseSghUHlPYmplY3RfSXNJbnN0YW5jZShldiwgUHlFeGNfU3RvcEl0ZXJhdGlvbikpKSB7CisgICAgICAgIF9fUHl4X0VyclJlc3RvcmUoZXQsIGV2LCB0Yik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfWERFQ1JFRih0Yik7CisgICAgUHlfREVDUkVGKGV0KTsKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDMwMEEwCisgICAgdmFsdWUgPSAoKFB5U3RvcEl0ZXJhdGlvbk9iamVjdCAqKWV2KS0+dmFsdWU7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9ERUNSRUYoZXYpOworI2Vsc2UKKyAgICB7CisgICAgICAgIFB5T2JqZWN0KiBhcmdzID0gUHlPYmplY3RfR2V0QXR0cihldiwgX19weXhfbl9zX2FyZ3MpOworICAgICAgICBQeV9ERUNSRUYoZXYpOworICAgICAgICBpZiAobGlrZWx5KGFyZ3MpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IFB5T2JqZWN0X0dldEl0ZW0oYXJncywgMCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVubGlrZWx5KCF2YWx1ZSkpIHsKKyAgICAgICAgICAgIF9fUHl4X0VyclJlc3RvcmUoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICB2YWx1ZSA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAqcHZhbHVlID0gdmFsdWU7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKK3N0YXRpYyBDWVRIT05fSU5MSU5FCit2b2lkIF9fUHl4X0dlbmVyYXRvcl9FeGNlcHRpb25DbGVhcihfX3B5eF9HZW5lcmF0b3JPYmplY3QgKnNlbGYpIHsKKyAgICBQeU9iamVjdCAqZXhjX3R5cGUgPSBzZWxmLT5leGNfdHlwZTsKKyAgICBQeU9iamVjdCAqZXhjX3ZhbHVlID0gc2VsZi0+ZXhjX3ZhbHVlOworICAgIFB5T2JqZWN0ICpleGNfdHJhY2ViYWNrID0gc2VsZi0+ZXhjX3RyYWNlYmFjazsKKyAgICBzZWxmLT5leGNfdHlwZSA9IE5VTEw7CisgICAgc2VsZi0+ZXhjX3ZhbHVlID0gTlVMTDsKKyAgICBzZWxmLT5leGNfdHJhY2ViYWNrID0gTlVMTDsKKyAgICBQeV9YREVDUkVGKGV4Y190eXBlKTsKKyAgICBQeV9YREVDUkVGKGV4Y192YWx1ZSk7CisgICAgUHlfWERFQ1JFRihleGNfdHJhY2ViYWNrKTsKK30KK3N0YXRpYyBDWVRIT05fSU5MSU5FCitpbnQgX19QeXhfR2VuZXJhdG9yX0NoZWNrUnVubmluZyhfX3B5eF9HZW5lcmF0b3JPYmplY3QgKmdlbikgeworICAgIGlmICh1bmxpa2VseShnZW4tPmlzX3J1bm5pbmcpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRvciBhbHJlYWR5IGV4ZWN1dGluZyIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CitzdGF0aWMgQ1lUSE9OX0lOTElORQorUHlPYmplY3QgKl9fUHl4X0dlbmVyYXRvcl9TZW5kRXgoX19weXhfR2VuZXJhdG9yT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUpIHsKKyAgICBQeU9iamVjdCAqcmV0dmFsOworICAgIGFzc2VydCghc2VsZi0+aXNfcnVubmluZyk7CisgICAgaWYgKHVubGlrZWx5KHNlbGYtPnJlc3VtZV9sYWJlbCA9PSAwKSkgeworICAgICAgICBpZiAodW5saWtlbHkodmFsdWUgJiYgdmFsdWUgIT0gUHlfTm9uZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHNlbmQgbm9uLU5vbmUgdmFsdWUgdG8gYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImp1c3Qtc3RhcnRlZCBnZW5lcmF0b3IiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGlmICh1bmxpa2VseShzZWxmLT5yZXN1bWVfbGFiZWwgPT0gLTEpKSB7CisgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAodmFsdWUpIHsKKyNpZiBDWVRIT05fQ09NUElMSU5HX0lOX1BZUFkKKyNlbHNlCisgICAgICAgIGlmIChzZWxmLT5leGNfdHJhY2ViYWNrKSB7CisgICAgICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgICAgICAgICAgUHlUcmFjZWJhY2tPYmplY3QgKnRiID0gKFB5VHJhY2ViYWNrT2JqZWN0ICopIHNlbGYtPmV4Y190cmFjZWJhY2s7CisgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICpmID0gdGItPnRiX2ZyYW1lOworICAgICAgICAgICAgUHlfWElOQ1JFRih0c3RhdGUtPmZyYW1lKTsKKyAgICAgICAgICAgIGFzc2VydChmLT5mX2JhY2sgPT0gTlVMTCk7CisgICAgICAgICAgICBmLT5mX2JhY2sgPSB0c3RhdGUtPmZyYW1lOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgX19QeXhfRXhjZXB0aW9uU3dhcCgmc2VsZi0+ZXhjX3R5cGUsICZzZWxmLT5leGNfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPmV4Y190cmFjZWJhY2spOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fUHl4X0dlbmVyYXRvcl9FeGNlcHRpb25DbGVhcihzZWxmKTsKKyAgICB9CisgICAgc2VsZi0+aXNfcnVubmluZyA9IDE7CisgICAgcmV0dmFsID0gc2VsZi0+Ym9keSgoUHlPYmplY3QgKikgc2VsZiwgdmFsdWUpOworICAgIHNlbGYtPmlzX3J1bm5pbmcgPSAwOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgX19QeXhfRXhjZXB0aW9uU3dhcCgmc2VsZi0+ZXhjX3R5cGUsICZzZWxmLT5leGNfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPmV4Y190cmFjZWJhY2spOworI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fUFlQWQorI2Vsc2UKKyAgICAgICAgaWYgKHNlbGYtPmV4Y190cmFjZWJhY2spIHsKKyAgICAgICAgICAgIFB5VHJhY2ViYWNrT2JqZWN0ICp0YiA9IChQeVRyYWNlYmFja09iamVjdCAqKSBzZWxmLT5leGNfdHJhY2ViYWNrOworICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqZiA9IHRiLT50Yl9mcmFtZTsKKyAgICAgICAgICAgIFB5X0NMRUFSKGYtPmZfYmFjayk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIF9fUHl4X0dlbmVyYXRvcl9FeGNlcHRpb25DbGVhcihzZWxmKTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KK3N0YXRpYyBDWVRIT05fSU5MSU5FCitQeU9iamVjdCAqX19QeXhfR2VuZXJhdG9yX0ZpbmlzaERlbGVnYXRpb24oX19weXhfR2VuZXJhdG9yT2JqZWN0ICpnZW4pIHsKKyAgICBQeU9iamVjdCAqcmV0OworICAgIFB5T2JqZWN0ICp2YWwgPSBOVUxMOworICAgIF9fUHl4X0dlbmVyYXRvcl9VbmRlbGVnYXRlKGdlbik7CisgICAgX19QeXhfUHlHZW5fRmV0Y2hTdG9wSXRlcmF0aW9uVmFsdWUoJnZhbCk7CisgICAgcmV0ID0gX19QeXhfR2VuZXJhdG9yX1NlbmRFeChnZW4sIHZhbCk7CisgICAgUHlfWERFQ1JFRih2YWwpOworICAgIHJldHVybiByZXQ7Cit9CitzdGF0aWMgUHlPYmplY3QgKl9fUHl4X0dlbmVyYXRvcl9OZXh0KFB5T2JqZWN0ICpzZWxmKSB7CisgICAgX19weXhfR2VuZXJhdG9yT2JqZWN0ICpnZW4gPSAoX19weXhfR2VuZXJhdG9yT2JqZWN0Kikgc2VsZjsKKyAgICBQeU9iamVjdCAqeWYgPSBnZW4tPnlpZWxkZnJvbTsKKyAgICBpZiAodW5saWtlbHkoX19QeXhfR2VuZXJhdG9yX0NoZWNrUnVubmluZyhnZW4pKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHlmKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXQ7CisgICAgICAgIGdlbi0+aXNfcnVubmluZyA9IDE7CisgICAgICAgIHJldCA9IFB5X1RZUEUoeWYpLT50cF9pdGVybmV4dCh5Zik7CisgICAgICAgIGdlbi0+aXNfcnVubmluZyA9IDA7CisgICAgICAgIGlmIChsaWtlbHkocmV0KSkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19QeXhfR2VuZXJhdG9yX0ZpbmlzaERlbGVnYXRpb24oZ2VuKTsKKyAgICB9CisgICAgcmV0dXJuIF9fUHl4X0dlbmVyYXRvcl9TZW5kRXgoZ2VuLCBQeV9Ob25lKTsKK30KK3N0YXRpYyBQeU9iamVjdCAqX19QeXhfR2VuZXJhdG9yX1NlbmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSkgeworICAgIF9fcHl4X0dlbmVyYXRvck9iamVjdCAqZ2VuID0gKF9fcHl4X0dlbmVyYXRvck9iamVjdCopIHNlbGY7CisgICAgUHlPYmplY3QgKnlmID0gZ2VuLT55aWVsZGZyb207CisgICAgaWYgKHVubGlrZWx5KF9fUHl4X0dlbmVyYXRvcl9DaGVja1J1bm5pbmcoZ2VuKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh5ZikgeworICAgICAgICBQeU9iamVjdCAqcmV0OworICAgICAgICBnZW4tPmlzX3J1bm5pbmcgPSAxOworICAgICAgICBpZiAoX19QeXhfR2VuZXJhdG9yX0NoZWNrRXhhY3QoeWYpKSB7CisgICAgICAgICAgICByZXQgPSBfX1B5eF9HZW5lcmF0b3JfU2VuZCh5ZiwgdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgcmV0ID0gUHlJdGVyX05leHQoeWYpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IF9fUHl4X1B5T2JqZWN0X0NhbGxNZXRob2QxKHlmLCBfX3B5eF9uX3Nfc2VuZCwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGdlbi0+aXNfcnVubmluZyA9IDA7CisgICAgICAgIGlmIChsaWtlbHkocmV0KSkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19QeXhfR2VuZXJhdG9yX0ZpbmlzaERlbGVnYXRpb24oZ2VuKTsKKyAgICB9CisgICAgcmV0dXJuIF9fUHl4X0dlbmVyYXRvcl9TZW5kRXgoZ2VuLCB2YWx1ZSk7Cit9CitzdGF0aWMgaW50IF9fUHl4X0dlbmVyYXRvcl9DbG9zZUl0ZXIoX19weXhfR2VuZXJhdG9yT2JqZWN0ICpnZW4sIFB5T2JqZWN0ICp5ZikgeworICAgIFB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOworICAgIGludCBlcnIgPSAwOworICAgIGlmIChfX1B5eF9HZW5lcmF0b3JfQ2hlY2tFeGFjdCh5ZikpIHsKKyAgICAgICAgcmV0dmFsID0gX19QeXhfR2VuZXJhdG9yX0Nsb3NlKHlmKTsKKyAgICAgICAgaWYgKCFyZXR2YWwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKm1ldGg7CisgICAgICAgIGdlbi0+aXNfcnVubmluZyA9IDE7CisgICAgICAgIG1ldGggPSBQeU9iamVjdF9HZXRBdHRyKHlmLCBfX3B5eF9uX3NfY2xvc2UpOworICAgICAgICBpZiAodW5saWtlbHkoIW1ldGgpKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHlmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24obWV0aCwgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgICAgICAgICBpZiAoIXJldHZhbCkKKyAgICAgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBnZW4tPmlzX3J1bm5pbmcgPSAwOworICAgIH0KKyAgICBQeV9YREVDUkVGKHJldHZhbCk7CisgICAgcmV0dXJuIGVycjsKK30KK3N0YXRpYyBQeU9iamVjdCAqX19QeXhfR2VuZXJhdG9yX0Nsb3NlKFB5T2JqZWN0ICpzZWxmKSB7CisgICAgX19weXhfR2VuZXJhdG9yT2JqZWN0ICpnZW4gPSAoX19weXhfR2VuZXJhdG9yT2JqZWN0ICopIHNlbGY7CisgICAgUHlPYmplY3QgKnJldHZhbCwgKnJhaXNlZF9leGNlcHRpb247CisgICAgUHlPYmplY3QgKnlmID0gZ2VuLT55aWVsZGZyb207CisgICAgaW50IGVyciA9IDA7CisgICAgaWYgKHVubGlrZWx5KF9fUHl4X0dlbmVyYXRvcl9DaGVja1J1bm5pbmcoZ2VuKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh5ZikgeworICAgICAgICBQeV9JTkNSRUYoeWYpOworICAgICAgICBlcnIgPSBfX1B5eF9HZW5lcmF0b3JfQ2xvc2VJdGVyKGdlbiwgeWYpOworICAgICAgICBfX1B5eF9HZW5lcmF0b3JfVW5kZWxlZ2F0ZShnZW4pOworICAgICAgICBQeV9ERUNSRUYoeWYpOworICAgIH0KKyAgICBpZiAoZXJyID09IDApCisgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfR2VuZXJhdG9yRXhpdCk7CisgICAgcmV0dmFsID0gX19QeXhfR2VuZXJhdG9yX1NlbmRFeChnZW4sIE5VTEwpOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJldHZhbCk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdG9yIGlnbm9yZWQgR2VuZXJhdG9yRXhpdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmFpc2VkX2V4Y2VwdGlvbiA9IFB5RXJyX09jY3VycmVkKCk7CisgICAgaWYgKCFyYWlzZWRfZXhjZXB0aW9uCisgICAgICAgIHx8IHJhaXNlZF9leGNlcHRpb24gPT0gUHlFeGNfU3RvcEl0ZXJhdGlvbgorICAgICAgICB8fCByYWlzZWRfZXhjZXB0aW9uID09IFB5RXhjX0dlbmVyYXRvckV4aXQKKyAgICAgICAgfHwgUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKHJhaXNlZF9leGNlcHRpb24sIFB5RXhjX0dlbmVyYXRvckV4aXQpCisgICAgICAgIHx8IFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhyYWlzZWRfZXhjZXB0aW9uLCBQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICB7CisgICAgICAgIGlmIChyYWlzZWRfZXhjZXB0aW9uKSBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBQeU9iamVjdCAqX19QeXhfR2VuZXJhdG9yX1Rocm93KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgeworICAgIF9fcHl4X0dlbmVyYXRvck9iamVjdCAqZ2VuID0gKF9fcHl4X0dlbmVyYXRvck9iamVjdCAqKSBzZWxmOworICAgIFB5T2JqZWN0ICp0eXA7CisgICAgUHlPYmplY3QgKnRiID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdmFsID0gTlVMTDsKKyAgICBQeU9iamVjdCAqeWYgPSBnZW4tPnlpZWxkZnJvbTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIChjaGFyICopInRocm93IiwgMSwgMywgJnR5cCwgJnZhbCwgJnRiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHVubGlrZWx5KF9fUHl4X0dlbmVyYXRvcl9DaGVja1J1bm5pbmcoZ2VuKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh5ZikgeworICAgICAgICBQeU9iamVjdCAqcmV0OworICAgICAgICBQeV9JTkNSRUYoeWYpOworICAgICAgICBpZiAoUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKHR5cCwgUHlFeGNfR2VuZXJhdG9yRXhpdCkpIHsKKyAgICAgICAgICAgIGludCBlcnIgPSBfX1B5eF9HZW5lcmF0b3JfQ2xvc2VJdGVyKGdlbiwgeWYpOworICAgICAgICAgICAgUHlfREVDUkVGKHlmKTsKKyAgICAgICAgICAgIF9fUHl4X0dlbmVyYXRvcl9VbmRlbGVnYXRlKGdlbik7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX19QeXhfR2VuZXJhdG9yX1NlbmRFeChnZW4sIE5VTEwpOworICAgICAgICAgICAgZ290byB0aHJvd19oZXJlOworICAgICAgICB9CisgICAgICAgIGdlbi0+aXNfcnVubmluZyA9IDE7CisgICAgICAgIGlmIChfX1B5eF9HZW5lcmF0b3JfQ2hlY2tFeGFjdCh5ZikpIHsKKyAgICAgICAgICAgIHJldCA9IF9fUHl4X0dlbmVyYXRvcl9UaHJvdyh5ZiwgYXJncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqbWV0aCA9IFB5T2JqZWN0X0dldEF0dHIoeWYsIF9fcHl4X25fc190aHJvdyk7CisgICAgICAgICAgICBpZiAodW5saWtlbHkoIW1ldGgpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHlmKTsKKyAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbi0+aXNfcnVubmluZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIF9fUHl4X0dlbmVyYXRvcl9VbmRlbGVnYXRlKGdlbik7CisgICAgICAgICAgICAgICAgZ2VuLT5pc19ydW5uaW5nID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIHRocm93X2hlcmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG1ldGgsIGFyZ3MpOworICAgICAgICAgICAgUHlfREVDUkVGKG1ldGgpOworICAgICAgICB9CisgICAgICAgIGdlbi0+aXNfcnVubmluZyA9IDA7CisgICAgICAgIFB5X0RFQ1JFRih5Zik7CisgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgICByZXQgPSBfX1B5eF9HZW5lcmF0b3JfRmluaXNoRGVsZWdhdGlvbihnZW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQordGhyb3dfaGVyZToKKyAgICBfX1B5eF9SYWlzZSh0eXAsIHZhbCwgdGIsIE5VTEwpOworICAgIHJldHVybiBfX1B5eF9HZW5lcmF0b3JfU2VuZEV4KGdlbiwgTlVMTCk7Cit9CitzdGF0aWMgaW50IF9fUHl4X0dlbmVyYXRvcl90cmF2ZXJzZShQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpIHsKKyAgICBfX3B5eF9HZW5lcmF0b3JPYmplY3QgKmdlbiA9IChfX3B5eF9HZW5lcmF0b3JPYmplY3QgKikgc2VsZjsKKyAgICBQeV9WSVNJVChnZW4tPmNsb3N1cmUpOworICAgIFB5X1ZJU0lUKGdlbi0+Y2xhc3NvYmopOworICAgIFB5X1ZJU0lUKGdlbi0+eWllbGRmcm9tKTsKKyAgICBQeV9WSVNJVChnZW4tPmV4Y190eXBlKTsKKyAgICBQeV9WSVNJVChnZW4tPmV4Y192YWx1ZSk7CisgICAgUHlfVklTSVQoZ2VuLT5leGNfdHJhY2ViYWNrKTsKKyAgICByZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgX19QeXhfR2VuZXJhdG9yX2NsZWFyKFB5T2JqZWN0ICpzZWxmKSB7CisgICAgX19weXhfR2VuZXJhdG9yT2JqZWN0ICpnZW4gPSAoX19weXhfR2VuZXJhdG9yT2JqZWN0ICopIHNlbGY7CisgICAgUHlfQ0xFQVIoZ2VuLT5jbG9zdXJlKTsKKyAgICBQeV9DTEVBUihnZW4tPmNsYXNzb2JqKTsKKyAgICBQeV9DTEVBUihnZW4tPnlpZWxkZnJvbSk7CisgICAgUHlfQ0xFQVIoZ2VuLT5leGNfdHlwZSk7CisgICAgUHlfQ0xFQVIoZ2VuLT5leGNfdmFsdWUpOworICAgIFB5X0NMRUFSKGdlbi0+ZXhjX3RyYWNlYmFjayk7CisgICAgUHlfQ0xFQVIoZ2VuLT5naV9uYW1lKTsKKyAgICBQeV9DTEVBUihnZW4tPmdpX3F1YWxuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIF9fUHl4X0dlbmVyYXRvcl9kZWFsbG9jKFB5T2JqZWN0ICpzZWxmKSB7CisgICAgX19weXhfR2VuZXJhdG9yT2JqZWN0ICpnZW4gPSAoX19weXhfR2VuZXJhdG9yT2JqZWN0ICopIHNlbGY7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhnZW4pOworICAgIGlmIChnZW4tPmdpX3dlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoc2VsZik7CisgICAgaWYgKGdlbi0+cmVzdW1lX2xhYmVsID4gMCkgeworICAgICAgICBQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDQwMGExCisgICAgICAgIGlmIChQeU9iamVjdF9DYWxsRmluYWxpemVyRnJvbURlYWxsb2Moc2VsZikpCisjZWxzZQorICAgICAgICBQeV9UWVBFKGdlbiktPnRwX2RlbChzZWxmKTsKKyAgICAgICAgaWYgKHNlbGYtPm9iX3JlZmNudCA+IDApCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgfQorICAgIF9fUHl4X0dlbmVyYXRvcl9jbGVhcihzZWxmKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoZ2VuKTsKK30KK3N0YXRpYyB2b2lkIF9fUHl4X0dlbmVyYXRvcl9kZWwoUHlPYmplY3QgKnNlbGYpIHsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisgICAgX19weXhfR2VuZXJhdG9yT2JqZWN0ICpnZW4gPSAoX19weXhfR2VuZXJhdG9yT2JqZWN0ICopIHNlbGY7CisgICAgaWYgKGdlbi0+cmVzdW1lX2xhYmVsIDw9IDApCisgICAgICAgIHJldHVybiA7CisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDQwMGExCisgICAgYXNzZXJ0KHNlbGYtPm9iX3JlZmNudCA9PSAwKTsKKyAgICBzZWxmLT5vYl9yZWZjbnQgPSAxOworI2VuZGlmCisgICAgX19QeXhfRXJyRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisgICAgcmVzID0gX19QeXhfR2VuZXJhdG9yX0Nsb3NlKHNlbGYpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgX19QeXhfRXJyUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwNDAwYTEKKyAgICBhc3NlcnQoc2VsZi0+b2JfcmVmY250ID4gMCk7CisgICAgaWYgKC0tc2VsZi0+b2JfcmVmY250ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB7CisgICAgICAgIFB5X3NzaXplX3QgcmVmY250ID0gc2VsZi0+b2JfcmVmY250OworICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKHNlbGYpOworICAgICAgICBzZWxmLT5vYl9yZWZjbnQgPSByZWZjbnQ7CisgICAgfQorI2lmIENZVEhPTl9DT01QSUxJTkdfSU5fQ1BZVEhPTgorICAgIGFzc2VydChQeVR5cGVfSVNfR0Moc2VsZi0+b2JfdHlwZSkgJiYKKyAgICAgICAgICAgX1B5X0FTX0dDKHNlbGYpLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsKKyAgICBfUHlfREVDX1JFRlRPVEFMOworI2VuZGlmCisjaWZkZWYgQ09VTlRfQUxMT0NTCisgICAgLS1QeV9UWVBFKHNlbGYpLT50cF9mcmVlczsKKyAgICAtLVB5X1RZUEUoc2VsZiktPnRwX2FsbG9jczsKKyNlbmRpZgorI2VuZGlmCit9CitzdGF0aWMgUHlPYmplY3QgKgorX19QeXhfR2VuZXJhdG9yX2dldF9uYW1lKF9fcHl4X0dlbmVyYXRvck9iamVjdCAqc2VsZikKK3sKKyAgICBQeV9JTkNSRUYoc2VsZi0+Z2lfbmFtZSk7CisgICAgcmV0dXJuIHNlbGYtPmdpX25hbWU7Cit9CitzdGF0aWMgaW50CitfX1B5eF9HZW5lcmF0b3Jfc2V0X25hbWUoX19weXhfR2VuZXJhdG9yT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUpCit7CisgICAgUHlPYmplY3QgKnRtcDsKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgICBpZiAodW5saWtlbHkodmFsdWUgPT0gTlVMTCB8fCAhUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkpIHsKKyNlbHNlCisgICAgaWYgKHVubGlrZWx5KHZhbHVlID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSkpIHsKKyNlbmRpZgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHRtcCA9IHNlbGYtPmdpX25hbWU7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBzZWxmLT5naV9uYW1lID0gdmFsdWU7CisgICAgUHlfWERFQ1JFRih0bXApOworICAgIHJldHVybiAwOworfQorc3RhdGljIFB5T2JqZWN0ICoKK19fUHl4X0dlbmVyYXRvcl9nZXRfcXVhbG5hbWUoX19weXhfR2VuZXJhdG9yT2JqZWN0ICpzZWxmKQoreworICAgIFB5X0lOQ1JFRihzZWxmLT5naV9xdWFsbmFtZSk7CisgICAgcmV0dXJuIHNlbGYtPmdpX3F1YWxuYW1lOworfQorc3RhdGljIGludAorX19QeXhfR2VuZXJhdG9yX3NldF9xdWFsbmFtZShfX3B5eF9HZW5lcmF0b3JPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSkKK3sKKyAgICBQeU9iamVjdCAqdG1wOworI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICAgIGlmICh1bmxpa2VseSh2YWx1ZSA9PSBOVUxMIHx8ICFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSkgeworI2Vsc2UKKyAgICBpZiAodW5saWtlbHkodmFsdWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSkgeworI2VuZGlmCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19xdWFsbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHRtcCA9IHNlbGYtPmdpX3F1YWxuYW1lOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgc2VsZi0+Z2lfcXVhbG5hbWUgPSB2YWx1ZTsKKyAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIDA7Cit9CitzdGF0aWMgUHlHZXRTZXREZWYgX19weXhfR2VuZXJhdG9yX2dldHNldHNbXSA9IHsKKyAgICB7KGNoYXIgKikgIl9fbmFtZV9fIiwgKGdldHRlcilfX1B5eF9HZW5lcmF0b3JfZ2V0X25hbWUsIChzZXR0ZXIpX19QeXhfR2VuZXJhdG9yX3NldF9uYW1lLAorICAgICAoY2hhciopIFB5RG9jX1NUUigibmFtZSBvZiB0aGUgZ2VuZXJhdG9yIiksIDB9LAorICAgIHsoY2hhciAqKSAiX19xdWFsbmFtZV9fIiwgKGdldHRlcilfX1B5eF9HZW5lcmF0b3JfZ2V0X3F1YWxuYW1lLCAoc2V0dGVyKV9fUHl4X0dlbmVyYXRvcl9zZXRfcXVhbG5hbWUsCisgICAgIChjaGFyKikgUHlEb2NfU1RSKCJxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZ2VuZXJhdG9yIiksIDB9LAorICAgIHswLCAwLCAwLCAwLCAwfQorfTsKK3N0YXRpYyBQeU1lbWJlckRlZiBfX3B5eF9HZW5lcmF0b3JfbWVtYmVybGlzdFtdID0geworICAgIHsoY2hhciAqKSAiZ2lfcnVubmluZyIsIFRfQk9PTCwgb2Zmc2V0b2YoX19weXhfR2VuZXJhdG9yT2JqZWN0LCBpc19ydW5uaW5nKSwgUkVBRE9OTFksIE5VTEx9LAorICAgIHswLCAwLCAwLCAwLCAwfQorfTsKK3N0YXRpYyBQeU1ldGhvZERlZiBfX3B5eF9HZW5lcmF0b3JfbWV0aG9kc1tdID0geworICAgIHsic2VuZCIsIChQeUNGdW5jdGlvbikgX19QeXhfR2VuZXJhdG9yX1NlbmQsIE1FVEhfTywgMH0sCisgICAgeyJ0aHJvdyIsIChQeUNGdW5jdGlvbikgX19QeXhfR2VuZXJhdG9yX1Rocm93LCBNRVRIX1ZBUkFSR1MsIDB9LAorICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pIF9fUHl4X0dlbmVyYXRvcl9DbG9zZSwgTUVUSF9OT0FSR1MsIDB9LAorICAgIHswLCAwLCAwLCAwfQorfTsKK3N0YXRpYyBQeVR5cGVPYmplY3QgX19weXhfR2VuZXJhdG9yVHlwZV90eXBlID0geworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKQorICAgICJnZW5lcmF0b3IiLAorICAgIHNpemVvZihfX3B5eF9HZW5lcmF0b3JPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpIF9fUHl4X0dlbmVyYXRvcl9kZWFsbG9jLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisgICAgMCwKKyNlbHNlCisgICAgMCwKKyNlbmRpZgorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwgUHlfVFBGTEFHU19IQVZFX0ZJTkFMSVpFLAorICAgIDAsCisgICAgKHRyYXZlcnNlcHJvYykgX19QeXhfR2VuZXJhdG9yX3RyYXZlcnNlLAorICAgIDAsCisgICAgMCwKKyAgICBvZmZzZXRvZihfX3B5eF9HZW5lcmF0b3JPYmplY3QsIGdpX3dlYWtyZWZsaXN0KSwKKyAgICAwLAorICAgIChpdGVybmV4dGZ1bmMpIF9fUHl4X0dlbmVyYXRvcl9OZXh0LAorICAgIF9fcHl4X0dlbmVyYXRvcl9tZXRob2RzLAorICAgIF9fcHl4X0dlbmVyYXRvcl9tZW1iZXJsaXN0LAorICAgIF9fcHl4X0dlbmVyYXRvcl9nZXRzZXRzLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwNDAwYTEKKyAgICAwLAorI2Vsc2UKKyAgICBfX1B5eF9HZW5lcmF0b3JfZGVsLAorI2VuZGlmCisgICAgMCwKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDQwMGExCisgICAgX19QeXhfR2VuZXJhdG9yX2RlbCwKKyNlbmRpZgorfTsKK3N0YXRpYyBfX3B5eF9HZW5lcmF0b3JPYmplY3QgKl9fUHl4X0dlbmVyYXRvcl9OZXcoX19weXhfZ2VuZXJhdG9yX2JvZHlfdCBib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2xvc3VyZSwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICpxdWFsbmFtZSkgeworICAgIF9fcHl4X0dlbmVyYXRvck9iamVjdCAqZ2VuID0KKyAgICAgICAgUHlPYmplY3RfR0NfTmV3KF9fcHl4X0dlbmVyYXRvck9iamVjdCwgJl9fcHl4X0dlbmVyYXRvclR5cGVfdHlwZSk7CisgICAgaWYgKGdlbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBnZW4tPmJvZHkgPSBib2R5OworICAgIGdlbi0+Y2xvc3VyZSA9IGNsb3N1cmU7CisgICAgUHlfWElOQ1JFRihjbG9zdXJlKTsKKyAgICBnZW4tPmlzX3J1bm5pbmcgPSAwOworICAgIGdlbi0+cmVzdW1lX2xhYmVsID0gMDsKKyAgICBnZW4tPmNsYXNzb2JqID0gTlVMTDsKKyAgICBnZW4tPnlpZWxkZnJvbSA9IE5VTEw7CisgICAgZ2VuLT5leGNfdHlwZSA9IE5VTEw7CisgICAgZ2VuLT5leGNfdmFsdWUgPSBOVUxMOworICAgIGdlbi0+ZXhjX3RyYWNlYmFjayA9IE5VTEw7CisgICAgZ2VuLT5naV93ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgUHlfWElOQ1JFRihxdWFsbmFtZSk7CisgICAgZ2VuLT5naV9xdWFsbmFtZSA9IHF1YWxuYW1lOworICAgIFB5X1hJTkNSRUYobmFtZSk7CisgICAgZ2VuLT5naV9uYW1lID0gbmFtZTsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhnZW4pOworICAgIHJldHVybiBnZW47Cit9CitzdGF0aWMgaW50IF9fcHl4X0dlbmVyYXRvcl9pbml0KHZvaWQpIHsKKyAgICBfX3B5eF9HZW5lcmF0b3JUeXBlX3R5cGUudHBfZ2V0YXR0cm8gPSBQeU9iamVjdF9HZW5lcmljR2V0QXR0cjsKKyAgICBfX3B5eF9HZW5lcmF0b3JUeXBlX3R5cGUudHBfaXRlciA9IFB5T2JqZWN0X1NlbGZJdGVyOworICAgIF9fcHl4X0dlbmVyYXRvclR5cGUgPSBfX1B5eF9GZXRjaENvbW1vblR5cGUoJl9fcHl4X0dlbmVyYXRvclR5cGVfdHlwZSk7CisgICAgaWYgKF9fcHl4X0dlbmVyYXRvclR5cGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fUHl4X2NoZWNrX2JpbmFyeV92ZXJzaW9uKHZvaWQpIHsKKyAgICBjaGFyIGN0dmVyc2lvbls0XSwgcnR2ZXJzaW9uWzRdOworICAgIFB5T1Nfc25wcmludGYoY3R2ZXJzaW9uLCA0LCAiJWQuJWQiLCBQWV9NQUpPUl9WRVJTSU9OLCBQWV9NSU5PUl9WRVJTSU9OKTsKKyAgICBQeU9TX3NucHJpbnRmKHJ0dmVyc2lvbiwgNCwgIiVzIiwgUHlfR2V0VmVyc2lvbigpKTsKKyAgICBpZiAoY3R2ZXJzaW9uWzBdICE9IHJ0dmVyc2lvblswXSB8fCBjdHZlcnNpb25bMl0gIT0gcnR2ZXJzaW9uWzJdKSB7CisgICAgICAgIGNoYXIgbWVzc2FnZVsyMDBdOworICAgICAgICBQeU9TX3NucHJpbnRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZXRpbWUgdmVyc2lvbiAlcyBvZiBtb2R1bGUgJyUuMTAwcycgIgorICAgICAgICAgICAgICAgICAgICAgICJkb2VzIG5vdCBtYXRjaCBydW50aW1lIHZlcnNpb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGN0dmVyc2lvbiwgX19QeXhfTU9EVUxFX05BTUUsIHJ0dmVyc2lvbik7CisgICAgICAgIHJldHVybiBQeUVycl9XYXJuRXgoTlVMTCwgbWVzc2FnZSwgMSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fUHl4X0luaXRTdHJpbmdzKF9fUHl4X1N0cmluZ1RhYkVudHJ5ICp0KSB7CisgICAgd2hpbGUgKHQtPnApIHsKKyAgICAgICAgI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisgICAgICAgIGlmICh0LT5pc191bmljb2RlKSB7CisgICAgICAgICAgICAqdC0+cCA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHQtPnMsIHQtPm4gLSAxLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIGlmICh0LT5pbnRlcm4pIHsKKyAgICAgICAgICAgICp0LT5wID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyh0LT5zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp0LT5wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodC0+cywgdC0+biAtIDEpOworICAgICAgICB9CisgICAgICAgICNlbHNlCisgICAgICAgIGlmICh0LT5pc191bmljb2RlIHwgdC0+aXNfc3RyKSB7CisgICAgICAgICAgICBpZiAodC0+aW50ZXJuKSB7CisgICAgICAgICAgICAgICAgKnQtPnAgPSBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZyh0LT5zKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodC0+ZW5jb2RpbmcpIHsKKyAgICAgICAgICAgICAgICAqdC0+cCA9IFB5VW5pY29kZV9EZWNvZGUodC0+cywgdC0+biAtIDEsIHQtPmVuY29kaW5nLCBOVUxMKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKnQtPnAgPSBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUodC0+cywgdC0+biAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnQtPnAgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHQtPnMsIHQtPm4gLSAxKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgaWYgKCEqdC0+cCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKyt0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIENZVEhPTl9JTkxJTkUgUHlPYmplY3QqIF9fUHl4X1B5VW5pY29kZV9Gcm9tU3RyaW5nKGNvbnN0IGNoYXIqIGNfc3RyKSB7CisgICAgcmV0dXJuIF9fUHl4X1B5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShjX3N0ciwgKFB5X3NzaXplX3Qpc3RybGVuKGNfc3RyKSk7Cit9CitzdGF0aWMgQ1lUSE9OX0lOTElORSBjaGFyKiBfX1B5eF9QeU9iamVjdF9Bc1N0cmluZyhQeU9iamVjdCogbykgeworICAgIFB5X3NzaXplX3QgaWdub3JlOworICAgIHJldHVybiBfX1B5eF9QeU9iamVjdF9Bc1N0cmluZ0FuZFNpemUobywgJmlnbm9yZSk7Cit9CitzdGF0aWMgQ1lUSE9OX0lOTElORSBjaGFyKiBfX1B5eF9QeU9iamVjdF9Bc1N0cmluZ0FuZFNpemUoUHlPYmplY3QqIG8sIFB5X3NzaXplX3QgKmxlbmd0aCkgeworI2lmIF9fUFlYX0RFRkFVTFRfU1RSSU5HX0VOQ09ESU5HX0lTX0FTQ0lJIHx8IF9fUFlYX0RFRkFVTFRfU1RSSU5HX0VOQ09ESU5HX0lTX0RFRkFVTFQKKyAgICBpZiAoCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMgJiYgX19QWVhfREVGQVVMVF9TVFJJTkdfRU5DT0RJTkdfSVNfQVNDSUkKKyAgICAgICAgICAgIF9fUHl4X3N5c19nZXRkZWZhdWx0ZW5jb2Rpbmdfbm90X2FzY2lpICYmCisjZW5kaWYKKyAgICAgICAgICAgIFB5VW5pY29kZV9DaGVjayhvKSkgeworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAzMDAwMAorICAgICAgICBjaGFyKiBkZWZlbmNfYzsKKyAgICAgICAgUHlPYmplY3QqIGRlZmVuYyA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhvLCBOVUxMKTsKKyAgICAgICAgaWYgKCFkZWZlbmMpIHJldHVybiBOVUxMOworICAgICAgICBkZWZlbmNfYyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGRlZmVuYyk7CisjaWYgX19QWVhfREVGQVVMVF9TVFJJTkdfRU5DT0RJTkdfSVNfQVNDSUkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciogZW5kID0gZGVmZW5jX2MgKyBQeUJ5dGVzX0dFVF9TSVpFKGRlZmVuYyk7CisgICAgICAgICAgICBjaGFyKiBjOworICAgICAgICAgICAgZm9yIChjID0gZGVmZW5jX2M7IGMgPCBlbmQ7IGMrKykgeworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQgY2hhcikgKCpjKSA+PSAxMjgpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcobyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgICpsZW5ndGggPSBQeUJ5dGVzX0dFVF9TSVpFKGRlZmVuYyk7CisgICAgICAgIHJldHVybiBkZWZlbmNfYzsKKyNlbHNlCisgICAgICAgIGlmIChfX1B5eF9QeVVuaWNvZGVfUkVBRFkobykgPT0gLTEpIHJldHVybiBOVUxMOworI2lmIF9fUFlYX0RFRkFVTFRfU1RSSU5HX0VOQ09ESU5HX0lTX0FTQ0lJCisgICAgICAgIGlmIChQeVVuaWNvZGVfSVNfQVNDSUkobykpIHsKKyAgICAgICAgICAgICpsZW5ndGggPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChvKTsKKyAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfQXNVVEY4KG8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcobyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Bc1VURjhBbmRTaXplKG8sIGxlbmd0aCk7CisjZW5kaWYKKyNlbmRpZgorICAgIH0gZWxzZQorI2VuZGlmCisjaWYgIUNZVEhPTl9DT01QSUxJTkdfSU5fUFlQWQorICAgIGlmIChQeUJ5dGVBcnJheV9DaGVjayhvKSkgeworICAgICAgICAqbGVuZ3RoID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUobyk7CisgICAgICAgIHJldHVybiBQeUJ5dGVBcnJheV9BU19TVFJJTkcobyk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIGNoYXIqIHJlc3VsdDsKKyAgICAgICAgaW50IHIgPSBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShvLCAmcmVzdWx0LCBsZW5ndGgpOworICAgICAgICBpZiAodW5saWtlbHkociA8IDApKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9Cit9CitzdGF0aWMgQ1lUSE9OX0lOTElORSBpbnQgX19QeXhfUHlPYmplY3RfSXNUcnVlKFB5T2JqZWN0KiB4KSB7CisgICBpbnQgaXNfdHJ1ZSA9IHggPT0gUHlfVHJ1ZTsKKyAgIGlmIChpc190cnVlIHwgKHggPT0gUHlfRmFsc2UpIHwgKHggPT0gUHlfTm9uZSkpIHJldHVybiBpc190cnVlOworICAgZWxzZSByZXR1cm4gUHlPYmplY3RfSXNUcnVlKHgpOworfQorc3RhdGljIENZVEhPTl9JTkxJTkUgUHlPYmplY3QqIF9fUHl4X1B5TnVtYmVyX0ludChQeU9iamVjdCogeCkgeworICBQeU51bWJlck1ldGhvZHMgKm07CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICBpZiAoUHlJbnRfQ2hlY2soeCkgfHwgUHlMb25nX0NoZWNrKHgpKQorI2Vsc2UKKyAgaWYgKFB5TG9uZ19DaGVjayh4KSkKKyNlbmRpZgorICAgIHJldHVybiBQeV9JTkNSRUYoeCksIHg7CisgIG0gPSBQeV9UWVBFKHgpLT50cF9hc19udW1iZXI7CisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKKyAgaWYgKG0gJiYgbS0+bmJfaW50KSB7CisgICAgbmFtZSA9ICJpbnQiOworICAgIHJlcyA9IFB5TnVtYmVyX0ludCh4KTsKKyAgfQorICBlbHNlIGlmIChtICYmIG0tPm5iX2xvbmcpIHsKKyAgICBuYW1lID0gImxvbmciOworICAgIHJlcyA9IFB5TnVtYmVyX0xvbmcoeCk7CisgIH0KKyNlbHNlCisgIGlmIChtICYmIG0tPm5iX2ludCkgeworICAgIG5hbWUgPSAiaW50IjsKKyAgICByZXMgPSBQeU51bWJlcl9Mb25nKHgpOworICB9CisjZW5kaWYKKyAgaWYgKHJlcykgeworI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisgICAgaWYgKCFQeUludF9DaGVjayhyZXMpICYmICFQeUxvbmdfQ2hlY2socmVzKSkgeworI2Vsc2UKKyAgICBpZiAoIVB5TG9uZ19DaGVjayhyZXMpKSB7CisjZW5kaWYKKyAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIl9fJS40c19fIHJldHVybmVkIG5vbi0lLjRzICh0eXBlICUuMjAwcykiLAorICAgICAgICAgICAgICAgICAgIG5hbWUsIG5hbWUsIFB5X1RZUEUocmVzKS0+dHBfbmFtZSk7CisgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBlbHNlIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KK3N0YXRpYyBDWVRIT05fSU5MSU5FIFB5X3NzaXplX3QgX19QeXhfUHlJbmRleF9Bc1NzaXplX3QoUHlPYmplY3QqIGIpIHsKKyAgUHlfc3NpemVfdCBpdmFsOworICBQeU9iamVjdCAqeDsKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworICBpZiAobGlrZWx5KFB5SW50X0NoZWNrRXhhY3QoYikpKQorICAgICAgcmV0dXJuIFB5SW50X0FTX0xPTkcoYik7CisjZW5kaWYKKyAgaWYgKGxpa2VseShQeUxvbmdfQ2hlY2tFeGFjdChiKSkpIHsKKyAgICAjaWYgQ1lUSE9OX0NPTVBJTElOR19JTl9DUFlUSE9OICYmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICAgICAjaWYgQ1lUSE9OX1VTRV9QWUxPTkdfSU5URVJOQUxTCisgICAgICAgc3dpdGNoIChQeV9TSVpFKGIpKSB7CisgICAgICAgY2FzZSAtMTogcmV0dXJuIC0oc2RpZ2l0KSgoUHlMb25nT2JqZWN0KiliKS0+b2JfZGlnaXRbMF07CisgICAgICAgY2FzZSAgMDogcmV0dXJuIDA7CisgICAgICAgY2FzZSAgMTogcmV0dXJuICgoUHlMb25nT2JqZWN0KiliKS0+b2JfZGlnaXRbMF07CisgICAgICAgfQorICAgICAjZW5kaWYKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gUHlMb25nX0FzU3NpemVfdChiKTsKKyAgfQorICB4ID0gUHlOdW1iZXJfSW5kZXgoYik7CisgIGlmICgheCkgcmV0dXJuIC0xOworICBpdmFsID0gUHlJbnRfQXNTc2l6ZV90KHgpOworICBQeV9ERUNSRUYoeCk7CisgIHJldHVybiBpdmFsOworfQorc3RhdGljIENZVEhPTl9JTkxJTkUgUHlPYmplY3QgKiBfX1B5eF9QeUludF9Gcm9tU2l6ZV90KHNpemVfdCBpdmFsKSB7CisgICAgcmV0dXJuIFB5SW50X0Zyb21TaXplX3QoaXZhbCk7Cit9CisKKworI2VuZGlmIC8qIFB5X1BZVEhPTl9IICovCmRpZmYgLS1naXQgYS9zcmMva2VubG0vcHl0aG9uL2tlbmxtLnB5eCBiL3NyYy9rZW5sbS9weXRob24va2VubG0ucHl4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTJjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vcHl0aG9uL2tlbmxtLnB5eApAQCAtMCwwICsxLDIzMSBAQAoraW1wb3J0IG9zCitjaW1wb3J0IF9rZW5sbQorCitjZGVmIGJ5dGVzIGFzX3N0cihkYXRhKToKKyAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGJ5dGVzKToKKyAgICAgICAgcmV0dXJuIGRhdGEKKyAgICBlbGlmIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSk6CisgICAgICAgIHJldHVybiBkYXRhLmVuY29kZSgndXRmOCcpCisgICAgcmFpc2UgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAlcyB0byBzdHJpbmcnICUgdHlwZShkYXRhKSkKKworY2RlZiBjbGFzcyBGdWxsU2NvcmVSZXR1cm46CisgICAgIiIiCisgICAgV3JhcHBlciBhcm91bmQgRnVsbFNjb3JlUmV0dXJuLgorCisgICAgTm90ZXM6CisgICAgICAgIGBwcm9iYCBoYXMgYmVlbiByZW5hbWVkIHRvIGBsb2dfcHJvYmAKKyAgICAgICAgYG9vdmAgaGFzIGJlZW4gYWRkZWQgdG8gZmxhZyB3aGV0aGVyIHRoZSB3b3JkIGlzIE9PVgorICAgICIiIgorCisgICAgY2RlZiBmbG9hdCBsb2dfcHJvYgorICAgIGNkZWYgaW50IG5ncmFtX2xlbmd0aAorICAgIGNkZWYgYmludCBvb3YKKworICAgIGRlZiBfX2Npbml0X18oc2VsZiwgbG9nX3Byb2IsIG5ncmFtX2xlbmd0aCwgb292KToKKyAgICAgICAgc2VsZi5sb2dfcHJvYiA9IGxvZ19wcm9iCisgICAgICAgIHNlbGYubmdyYW1fbGVuZ3RoID0gbmdyYW1fbGVuZ3RoCisgICAgICAgIHNlbGYub292ID0gb292CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnezB9KHsxfSwgezJ9LCB7M30pJy5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHJlcHIoc2VsZi5sb2dfcHJvYiksIHJlcHIoc2VsZi5uZ3JhbV9sZW5ndGgpLCByZXByKHNlbGYub292KSkKKyAgICAKKyAgICBwcm9wZXJ0eSBsb2dfcHJvYjoKKyAgICAgICAgZGVmIF9fZ2V0X18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2dfcHJvYgorCisgICAgcHJvcGVydHkgbmdyYW1fbGVuZ3RoOgorICAgICAgICBkZWYgX19nZXRfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm5ncmFtX2xlbmd0aAorCisgICAgcHJvcGVydHkgb292OgorICAgICAgICBkZWYgX19nZXRfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9vdgorCitjZGVmIGNsYXNzIFN0YXRlOgorICAgICIiIgorICAgIFdyYXBwZXIgYXJvdW5kIGxtOjpuZ3JhbTo6U3RhdGUgc28gdGhhdCBweXRob24gY29kZSBjYW4gbWFrZSBpbmNyZW1lbnRhbCBxdWVyaWVzLgorCisgICAgTm90ZXM6CisgICAgICAgICogcmljaCBjb21wYXJpc29ucyAKKyAgICAgICAgKiBoYXNoYWJsZQorICAgICIiIgorCisgICAgY2RlZiBfa2VubG0uU3RhdGUgX2Nfc3RhdGUKKworICAgIGRlZiBfX3JpY2hjbXBfXyhTdGF0ZSBxYSwgU3RhdGUgcWIsIGludCBvcCk6CisgICAgICAgIHIgPSBxYS5fY19zdGF0ZS5Db21wYXJlKHFiLl9jX3N0YXRlKQorICAgICAgICBpZiBvcCA9PSAwOiAgICAjIDwKKyAgICAgICAgICAgIHJldHVybiByIDwgMAorICAgICAgICBlbGlmIG9wID09IDE6ICAjIDw9CisgICAgICAgICAgICByZXR1cm4gciA8PSAwCisgICAgICAgIGVsaWYgb3AgPT0gMjogICMgPT0KKyAgICAgICAgICAgIHJldHVybiByID09IDAKKyAgICAgICAgZWxpZiBvcCA9PSAzOiAgIyAhPQorICAgICAgICAgICAgcmV0dXJuIHIgIT0gMAorICAgICAgICBlbGlmIG9wID09IDQ6ICAjID4KKyAgICAgICAgICAgIHJldHVybiByID4gMAorICAgICAgICBlbHNlOiAgICAgICAgICAjID49CisgICAgICAgICAgICByZXR1cm4gciA+PSAwCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBfa2VubG0uaGFzaF92YWx1ZShzZWxmLl9jX3N0YXRlKQorCisKK2NkZWYgY2xhc3MgTGFuZ3VhZ2VNb2RlbDoKKyAgICAiIiIKKyAgICBUaGlzIGlzIG5vdCBhIHN0cmljdCB3cmFwcGVyLCB0aGUgaW50ZXJmYWNlIGlzIG1vcmUgcHl0aG9uaWMuCisgICAgSXQgbG9hZHMgbW9kZWxzIGFuZCBxdWVyaWVzIGZ1bGwgc2VudGVuY2VzLgorICAgICIiIgorCisgICAgY2RlZiBfa2VubG0uTW9kZWwqIG1vZGVsCisgICAgY2RlZiBwdWJsaWMgYnl0ZXMgcGF0aAorICAgIGNkZWYgX2tlbmxtLmNvbnN0X1ZvY2FidWxhcnkqIHZvY2FiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CisgICAgICAgICIiIgorICAgICAgICBMb2FkIHRoZSBsYW5ndWFnZSBtb2RlbC4KKworICAgICAgICA6cGFyYW0gcGF0aDogcGF0aCB0byBhbiBhcnBhIGZpbGUgb3IgYSBrZW5sbSBiaW5hcnkgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucGF0aCA9IG9zLnBhdGguYWJzcGF0aChhc19zdHIocGF0aCkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYubW9kZWwgPSBfa2VubG0uTG9hZFZpcnR1YWwoc2VsZi5wYXRoKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yIGFzIGV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGV4Y2VwdGlvbl9tZXNzYWdlID0gc3RyKGV4Y2VwdGlvbikucmVwbGFjZSgnXG4nLCAnICcpCisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdDYW5ub3QgcmVhZCBtb2RlbCBcJ3t9XCcgKHt9KScuZm9ybWF0KHBhdGgsIGV4Y2VwdGlvbl9tZXNzYWdlKSlcCisgICAgICAgICAgICAgICAgICAgIGZyb20gZXhjZXB0aW9uCisgICAgICAgIHNlbGYudm9jYWIgPSAmc2VsZi5tb2RlbC5CYXNlVm9jYWJ1bGFyeSgpCisKKyAgICBkZWYgX19kZWFsbG9jX18oc2VsZik6CisgICAgICAgIGRlbCBzZWxmLm1vZGVsCisKKyAgICBwcm9wZXJ0eSBvcmRlcjoKKyAgICAgICAgZGVmIF9fZ2V0X18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2RlbC5PcmRlcigpCisKKyAgICBkZWYgc2NvcmUoc2VsZiwgc2VudGVuY2UsIGJvcyA9IFRydWUsIGVvcyA9IFRydWUpOgorICAgICAgICBjZGVmIGxpc3Qgd29yZHMgPSBhc19zdHIoc2VudGVuY2UpLnNwbGl0KCkKKyAgICAgICAgY2RlZiBfa2VubG0uU3RhdGUgc3RhdGUKKyAgICAgICAgaWYgYm9zOgorICAgICAgICAgICAgc2VsZi5tb2RlbC5CZWdpblNlbnRlbmNlV3JpdGUoJnN0YXRlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5tb2RlbC5OdWxsQ29udGV4dFdyaXRlKCZzdGF0ZSkKKyAgICAgICAgY2RlZiBfa2VubG0uU3RhdGUgb3V0X3N0YXRlCisgICAgICAgIGNkZWYgZmxvYXQgdG90YWwgPSAwCisgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgorICAgICAgICAgICAgdG90YWwgKz0gc2VsZi5tb2RlbC5CYXNlU2NvcmUoJnN0YXRlLCBzZWxmLnZvY2FiLkluZGV4KHdvcmQpLCAmb3V0X3N0YXRlKQorICAgICAgICAgICAgc3RhdGUgPSBvdXRfc3RhdGUKKyAgICAgICAgaWYgZW9zOgorICAgICAgICAgICAgdG90YWwgKz0gc2VsZi5tb2RlbC5CYXNlU2NvcmUoJnN0YXRlLCBzZWxmLnZvY2FiLkVuZFNlbnRlbmNlKCksICZvdXRfc3RhdGUpCisgICAgICAgIHJldHVybiB0b3RhbAorICAgIAorICAgIGRlZiBmdWxsX3Njb3JlcyhzZWxmLCBzZW50ZW5jZSwgYm9zID0gVHJ1ZSwgZW9zID0gVHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBmdWxsX3Njb3JlcyhzZW50ZW5jZSwgYm9zID0gVHJ1ZSwgZW9zID0gVHVyZSkgLT4gZ2VuZXJhdGUgZnVsbCBzY29yZXMgKHByb2IsIG5ncmFtIGxlbmd0aCwgb292KQorICAgICAgICBAcGFyYW0gc2VudGVuY2UgaXMgYSBzdHJpbmcgKGRvIG5vdCB1c2UgYm91bmRhcnkgc3ltYm9scykKKyAgICAgICAgQHBhcmFtIGJvcyBzaG91bGQga2VubG0gYWRkIGEgYm9zIHN0YXRlCisgICAgICAgIEBwYXJhbSBlb3Mgc2hvdWxkIGtlbmxtIGFkZCBhbiBlb3Mgc3RhdGUKKyAgICAgICAgIiIiCisgICAgICAgIGNkZWYgbGlzdCB3b3JkcyA9IGFzX3N0cihzZW50ZW5jZSkuc3BsaXQoKQorICAgICAgICBjZGVmIF9rZW5sbS5TdGF0ZSBzdGF0ZQorICAgICAgICBpZiBib3M6CisgICAgICAgICAgICBzZWxmLm1vZGVsLkJlZ2luU2VudGVuY2VXcml0ZSgmc3RhdGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1vZGVsLk51bGxDb250ZXh0V3JpdGUoJnN0YXRlKQorICAgICAgICBjZGVmIF9rZW5sbS5TdGF0ZSBvdXRfc3RhdGUKKyAgICAgICAgY2RlZiBfa2VubG0uRnVsbFNjb3JlUmV0dXJuIHJldAorICAgICAgICBjZGVmIGZsb2F0IHRvdGFsID0gMAorICAgICAgICBjZGVmIF9rZW5sbS5Xb3JkSW5kZXggd2lkCisgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgorICAgICAgICAgICAgd2lkID0gc2VsZi52b2NhYi5JbmRleCh3b3JkKQorICAgICAgICAgICAgcmV0ID0gc2VsZi5tb2RlbC5CYXNlRnVsbFNjb3JlKCZzdGF0ZSwgd2lkLCAmb3V0X3N0YXRlKQorICAgICAgICAgICAgeWllbGQgKHJldC5wcm9iLCByZXQubmdyYW1fbGVuZ3RoLCB3aWQgPT0gMCkKKyAgICAgICAgICAgIHN0YXRlID0gb3V0X3N0YXRlCisgICAgICAgIGlmIGVvczoKKyAgICAgICAgICAgIHJldCA9IHNlbGYubW9kZWwuQmFzZUZ1bGxTY29yZSgmc3RhdGUsCisgICAgICAgICAgICAgICAgc2VsZi52b2NhYi5FbmRTZW50ZW5jZSgpLCAmb3V0X3N0YXRlKQorICAgICAgICAgICAgeWllbGQgKHJldC5wcm9iLCByZXQubmdyYW1fbGVuZ3RoLCBGYWxzZSkKKyAgICAKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHdvcmQpOgorICAgICAgICBjZGVmIGJ5dGVzIHcgPSBhc19zdHIod29yZCkKKyAgICAgICAgcmV0dXJuIChzZWxmLnZvY2FiLkluZGV4KHcpICE9IDApCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPExhbmd1YWdlTW9kZWwgZnJvbSB7MH0+Jy5mb3JtYXQob3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgpKQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJldHVybiAoX2tlbmxtLkxhbmd1YWdlTW9kZWwsIChzZWxmLnBhdGgsKSkKKworY2RlZiBjbGFzcyBNb2RlbDoKKyAgICAiIiIKKyAgICBUaGlzIGlzIGNsb3NlciB0byBhIHdyYXBwZXIgYXJvdW5kIGxtOjpuZ3JhbTo6TW9kZWwuCisgICAgIiIiCisKKyAgICBjZGVmIF9rZW5sbS5Nb2RlbCogbW9kZWwKKyAgICBjZGVmIHB1YmxpYyBieXRlcyBwYXRoCisgICAgY2RlZiBfa2VubG0uY29uc3RfVm9jYWJ1bGFyeSogdm9jYWIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKKyAgICAgICAgIiIiCisgICAgICAgIExvYWQgdGhlIGxhbmd1YWdlIG1vZGVsLgorCisgICAgICAgIDpwYXJhbSBwYXRoOiBwYXRoIHRvIGFuIGFycGEgZmlsZSBvciBhIGtlbmxtIGJpbmFyeSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5wYXRoID0gb3MucGF0aC5hYnNwYXRoKGFzX3N0cihwYXRoKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5tb2RlbCA9IF9rZW5sbS5Mb2FkVmlydHVhbChzZWxmLnBhdGgpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZXhjZXB0aW9uOgorICAgICAgICAgICAgZXhjZXB0aW9uX21lc3NhZ2UgPSBzdHIoZXhjZXB0aW9uKS5yZXBsYWNlKCdcbicsICcgJykKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ0Nhbm5vdCByZWFkIG1vZGVsIFwne31cJyAoe30pJy5mb3JtYXQocGF0aCwgZXhjZXB0aW9uX21lc3NhZ2UpKVwKKyAgICAgICAgICAgICAgICAgICAgZnJvbSBleGNlcHRpb24KKyAgICAgICAgc2VsZi52b2NhYiA9ICZzZWxmLm1vZGVsLkJhc2VWb2NhYnVsYXJ5KCkKKworICAgIGRlZiBfX2RlYWxsb2NfXyhzZWxmKToKKyAgICAgICAgZGVsIHNlbGYubW9kZWwKKworICAgIHByb3BlcnR5IG9yZGVyOgorICAgICAgICBkZWYgX19nZXRfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm1vZGVsLk9yZGVyKCkKKworICAgIGRlZiBCZWdpblNlbnRlbmNlV3JpdGUoc2VsZiwgU3RhdGUgc3RhdGUpOgorICAgICAgICAiIiJDaGFuZ2UgdGhlIGdpdmVuIHN0YXRlIHRvIGEgQk9TIHN0YXRlLiIiIgorICAgICAgICBzZWxmLm1vZGVsLkJlZ2luU2VudGVuY2VXcml0ZSgmc3RhdGUuX2Nfc3RhdGUpCisKKyAgICBkZWYgTnVsbENvbnRleHRXcml0ZShzZWxmLCBTdGF0ZSBzdGF0ZSk6CisgICAgICAgICIiIkNoYW5nZSB0aGUgZ2l2ZW4gc3RhdGUgdG8gYSBOVUxMIHN0YXRlLiIiIgorICAgICAgICBzZWxmLm1vZGVsLk51bGxDb250ZXh0V3JpdGUoJnN0YXRlLl9jX3N0YXRlKQorCisgICAgZGVmIEJhc2VTY29yZShzZWxmLCBTdGF0ZSBpbl9zdGF0ZSwgc3RyIHdvcmQsIFN0YXRlIG91dF9zdGF0ZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gcCh3b3JkfGluX3N0YXRlKSBhbmQgdXBkYXRlIHRoZSBvdXRwdXQgc3RhdGUuCisgICAgICAgIFdyYXBwZXIgYXJvdW5kIG1vZGVsLkJhc2VTY29yZShpbl9zdGF0ZSwgSW5kZXgod29yZCksIG91dF9zdGF0ZSkKKworICAgICAgICA6cGFyYW0gd29yZDogdGhlIHN1ZmZpeAorICAgICAgICA6cGFyYW0gc3RhdGU6IHRoZSBjb250ZXh0IChkZWZhdWx0cyB0byBOdWxsQ29udGV4dCkKKyAgICAgICAgOnJldHVybnM6IHAod29yZHxzdGF0ZSkKKyAgICAgICAgIiIiCisgICAgICAgIGNkZWYgZmxvYXQgdG90YWwgPSBzZWxmLm1vZGVsLkJhc2VTY29yZSgmaW5fc3RhdGUuX2Nfc3RhdGUsIHNlbGYudm9jYWIuSW5kZXgoYXNfc3RyKHdvcmQpKSwgJm91dF9zdGF0ZS5fY19zdGF0ZSkKKyAgICAgICAgcmV0dXJuIHRvdGFsCisgICAgCisgICAgZGVmIEJhc2VGdWxsU2NvcmUoc2VsZiwgU3RhdGUgaW5fc3RhdGUsIHN0ciB3b3JkLCBTdGF0ZSBvdXRfc3RhdGUpOgorICAgICAgICAiIiIKKyAgICAgICAgV3JhcHBlciBhcm91bmQgbW9kZWwuQmFzZVNjb3JlKGluX3N0YXRlLCBJbmRleCh3b3JkKSwgb3V0X3N0YXRlKQorCisgICAgICAgIDpwYXJhbSB3b3JkOiB0aGUgc3VmZml4CisgICAgICAgIDpwYXJhbSBzdGF0ZTogdGhlIGNvbnRleHQgKGRlZmF1bHRzIHRvIE51bGxDb250ZXh0KQorICAgICAgICA6cmV0dXJuczogRnVsbFNjb3JlUmV0dXJuKHdvcmR8c3RhdGUpCisgICAgICAgICIiIgorICAgICAgICBjZGVmIF9rZW5sbS5Xb3JkSW5kZXggd2lkID0gc2VsZi52b2NhYi5JbmRleChhc19zdHIod29yZCkpCisgICAgICAgIGNkZWYgX2tlbmxtLkZ1bGxTY29yZVJldHVybiByZXQgPSBzZWxmLm1vZGVsLkJhc2VGdWxsU2NvcmUoJmluX3N0YXRlLl9jX3N0YXRlLCB3aWQsICZvdXRfc3RhdGUuX2Nfc3RhdGUpCisgICAgICAgIHJldHVybiBGdWxsU2NvcmVSZXR1cm4ocmV0LnByb2IsIHJldC5uZ3JhbV9sZW5ndGgsIHdpZCA9PSAwKQorICAgIAorICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgd29yZCk6CisgICAgICAgIGNkZWYgYnl0ZXMgdyA9IGFzX3N0cih3b3JkKQorICAgICAgICByZXR1cm4gKHNlbGYudm9jYWIuSW5kZXgodykgIT0gMCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8TW9kZWwgZnJvbSB7MH0+Jy5mb3JtYXQob3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgpKQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJldHVybiAoX2tlbmxtLkxhbmd1YWdlTW9kZWwsIChzZWxmLnBhdGgsKSkKKwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3NldHVwLnB5IGIvc3JjL2tlbmxtL3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMDYxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vc2V0dXAucHkKQEAgLTAsMCArMSw0OCBAQAorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK2Zyb20gZGlzdHV0aWxzLmV4dGVuc2lvbiBpbXBvcnQgRXh0ZW5zaW9uCitpbXBvcnQgZ2xvYgoraW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgb3MKKworI0RvZXMgZ2NjIGNvbXBpbGUgd2l0aCB0aGlzIGhlYWRlciBhbmQgbGlicmFyeT8KK2RlZiBjb21waWxlX3Rlc3QoaGVhZGVyLCBsaWJyYXJ5KToKKyAgICBkdW1teV9wYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJkdW1teSIpCisgICAgY29tbWFuZCA9ICJiYXNoIC1jIFwiZysrIC1pbmNsdWRlICIgKyBoZWFkZXIgKyAiIC1sIiArIGxpYnJhcnkgKyAiIC14IGMrKyAtIDw8PCdpbnQgbWFpbigpIHt9JyAtbyAiICsgZHVtbXlfcGF0aCArICIgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmJiBybSAiICsgZHVtbXlfcGF0aCArICIgMj4vZGV2L251bGxcIiIKKyAgICByZXR1cm4gb3Muc3lzdGVtKGNvbW1hbmQpID09IDAKKworCitGSUxFUyA9IGdsb2IuZ2xvYigndXRpbC8qLmNjJykgKyBnbG9iLmdsb2IoJ2xtLyouY2MnKSArIGdsb2IuZ2xvYigndXRpbC9kb3VibGUtY29udmVyc2lvbi8qLmNjJykKK0ZJTEVTID0gW2ZuIGZvciBmbiBpbiBGSUxFUyBpZiBub3QgKGZuLmVuZHN3aXRoKCdtYWluLmNjJykgb3IgZm4uZW5kc3dpdGgoJ3Rlc3QuY2MnKSldCisKK0xJQlMgPSBbJ3N0ZGMrKyddCitpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnRGFyd2luJzoKKyAgICBMSUJTLmFwcGVuZCgncnQnKQorCisKK0FSR1MgPSBbJy1PMycsICctRE5ERUJVRycsICctREtFTkxNX01BWF9PUkRFUj02J10KKworaWYgY29tcGlsZV90ZXN0KCd6bGliLmgnLCAneicpOgorICAgIEFSR1MuYXBwZW5kKCctREhBVkVfWkxJQicpCisgICAgTElCUy5hcHBlbmQoJ3onKQorCitpZiBjb21waWxlX3Rlc3QoJ2J6bGliLmgnLCAnYnoyJyk6CisgICAgQVJHUy5hcHBlbmQoJy1ESEFWRV9CWkxJQicpCisgICAgTElCUy5hcHBlbmQoJ2J6MicpCisKK2lmIGNvbXBpbGVfdGVzdCgnbHptYS5oJywgJ2x6bWEnKToKKyAgICBBUkdTLmFwcGVuZCgnLURIQVZFX1haTElCJykKKyAgICBMSUJTLmFwcGVuZCgnbHptYScpCisKK2V4dF9tb2R1bGVzID0gWworICAgIEV4dGVuc2lvbihuYW1lPSdrZW5sbScsCisgICAgICAgIHNvdXJjZXM9RklMRVMgKyBbJ3B5dGhvbi9rZW5sbS5jcHAnXSwKKyAgICAgICAgbGFuZ3VhZ2U9J0MrKycsIAorICAgICAgICBpbmNsdWRlX2RpcnM9WycuJ10sCisgICAgICAgIGxpYnJhcmllcz1MSUJTLCAKKyAgICAgICAgZXh0cmFfY29tcGlsZV9hcmdzPUFSR1MpCitdCisKK3NldHVwKAorICAgIG5hbWU9J2tlbmxtJywKKyAgICBleHRfbW9kdWxlcz1leHRfbW9kdWxlcworKQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvQ01ha2VMaXN0cy50eHQgYi9zcmMva2VubG0vdXRpbC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTU0NGFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw4MSBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC44KQorIworIyBUaGUgS2VuTE0gY21ha2UgZmlsZXMgbWFrZSB1c2Ugb2YgYWRkX2xpYnJhcnkoLi4uIE9CSkVDVFMgLi4uKQorIyAKKyMgVGhpcyBzeW50YXggYWxsb3dzIGdyb3VwaW5nIG9mIHNvdXJjZSBmaWxlcyB3aGVuIGNvbXBpbGluZworIyAoZWZmZWN0aXZlbHkgY3JlYXRpbmcgImZha2UiIGxpYnJhcmllcyBiYXNlZCBvbiBzb3VyY2Ugc3ViZGlycykuCisjIAorIyBUaGlzIHN5bnRheCB3YXMgb25seSBhZGRlZCBpbiBjbWFrZSB2ZXJzaW9uIDIuOC44CisjCisjIHNlZSBodHRwOi8vd3d3LmNtYWtlLm9yZy9XaWtpL0NNYWtlL1R1dG9yaWFscy9PYmplY3RfTGlicmFyeQorCisKKyMgVGhpcyBDTWFrZSBmaWxlIHdhcyBjcmVhdGVkIGJ5IExhbmUgU2Nod2FydHogPGRvd29iZWhhQGdtYWlsLmNvbT4KKworCisjIEV4cGxpY2l0bHkgbGlzdCB0aGUgc291cmNlIGZpbGVzIGZvciB0aGlzIHN1YmRpcmVjdG9yeQorIworIyBJZiB5b3UgYWRkIGFueSBzb3VyY2UgZmlsZXMgdG8gdGhpcyBzdWJkaXJlY3RvcnkKKyMgICAgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGtlbmxtIGxpYnJhcnksCisjICAgICAgICAodGhpcyBleGNsdWRlcyBhbnkgdW5pdCB0ZXN0IGZpbGVzKQorIyAgICB5b3Ugc2hvdWxkIGFkZCB0aGVtIHRvIHRoZSBmb2xsb3dpbmcgbGlzdDoKKyMKKyMgQmVjYXVzZSB3ZSBkbyBub3Qgc2V0IFBBUkVOVF9TQ09QRSBpbiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb24sCisjICAgIENNYWtlIGZpbGVzIGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHdvbid0IGJlIGFibGUgdG8gYWNjZXNzIHRoaXMgdmFyaWFibGUuCisjCitzZXQoS0VOTE1fVVRJTF9TT1VSQ0UgCisJCWJpdF9wYWNraW5nLmNjIAorCQllcnNhdHpfcHJvZ3Jlc3MuY2MgCisJCWV4Y2VwdGlvbi5jYyAKKwkJZmlsZS5jYyAKKwkJZmlsZV9waWVjZS5jYyAKKwkJZmxvYXRfdG9fc3RyaW5nLmNjCisJCWludGVnZXJfdG9fc3RyaW5nLmNjCisJCW1tYXAuY2MgCisJCW11cm11cl9oYXNoLmNjIAorCQlwYXJhbGxlbF9yZWFkLmNjCisJCXBvb2wuY2MgCisJCXJlYWRfY29tcHJlc3NlZC5jYyAKKwkJc2NvcGVkLmNjIAorCQlzdHJpbmdfcGllY2UuY2MgCisJCXVzYWdlLmNjCisJKQorCisjIFRoaXMgZGlyZWN0b3J5IGhhcyBjaGlsZHJlbiB0aGF0IG5lZWQgdG8gYmUgcHJvY2Vzc2VkCithZGRfc3ViZGlyZWN0b3J5KGRvdWJsZS1jb252ZXJzaW9uKQorYWRkX3N1YmRpcmVjdG9yeShzdHJlYW0pCisKKworIyBHcm91cCB0aGVzZSBvYmplY3RzIHRvZ2V0aGVyIGZvciBsYXRlciB1c2UuIAorIworIyBHaXZlbiBhZGRfbGlicmFyeShmb28gT0JKRUNUICR7bXlfZm9vX3NvdXJjZXN9KSwKKyMgcmVmZXIgdG8gdGhlc2Ugb2JqZWN0cyBhcyAkPFRBUkdFVF9PQkpFQ1RTOmZvbz4KKyMKK2FkZF9saWJyYXJ5KGtlbmxtX3V0aWwgT0JKRUNUICR7S0VOTE1fVVRJTF9ET1VCTEVDT05WRVJTSU9OX1NPVVJDRX0gJHtLRU5MTV9VVElMX1NUUkVBTV9TT1VSQ0V9ICR7S0VOTE1fVVRJTF9TT1VSQ0V9KQorCisKKworIyBPbmx5IGNvbXBpbGUgYW5kIHJ1biB1bml0IHRlc3RzIGlmIHRlc3RzIHNob3VsZCBiZSBydW4KK2lmKEJVSUxEX1RFU1RJTkcpCisKKyAgIyBFeHBsaWNpdGx5IGxpc3QgdGhlIEJvb3N0IHRlc3QgZmlsZXMgdG8gYmUgY29tcGlsZWQKKyAgc2V0KEtFTkxNX0JPT1NUX1RFU1RTX0xJU1QKKyAgICBiaXRfcGFja2luZ190ZXN0CisgICAgam9pbnRfc29ydF90ZXN0CisgICAgbXVsdGlfaW50ZXJzZWN0aW9uX3Rlc3QKKyAgICBwcm9iaW5nX2hhc2hfdGFibGVfdGVzdAorICAgIHJlYWRfY29tcHJlc3NlZF90ZXN0CisgICAgc29ydGVkX3VuaWZvcm1fdGVzdAorICAgIHRva2VuaXplX3BpZWNlX3Rlc3QKKyAgKQorCisgIEFkZFRlc3RzKFRFU1RTICR7S0VOTE1fQk9PU1RfVEVTVFNfTElTVH0KKyAgICAgICAgICAgREVQRU5EUyAkPFRBUkdFVF9PQkpFQ1RTOmtlbmxtX3V0aWw+CisgICAgICAgICAgIExJQlJBUklFUyAke0Jvb3N0X0xJQlJBUklFU30gcHRocmVhZCkKKworICAjIGZpbGVfcGllY2VfdGVzdCByZXF1aXJlcyBhbiBleHRyYSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyCisgIEtlbkxNQWRkVGVzdChURVNUIGZpbGVfcGllY2VfdGVzdAorICAgICAgICAgICAgICAgREVQRU5EUyAkPFRBUkdFVF9PQkpFQ1RTOmtlbmxtX3V0aWw+CisgICAgICAgICAgICAgICBMSUJSQVJJRVMgJHtCb29zdF9MSUJSQVJJRVN9IHB0aHJlYWQKKyAgICAgICAgICAgICAgIFRFU1RfQVJHUyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZmlsZV9waWVjZS5jYykKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL0phbWZpbGUgYi9zcmMva2VubG0vdXRpbC9KYW1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZWNjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9KYW1maWxlCkBAIC0wLDAgKzEsNDEgQEAKK2xvY2FsIGNvbXByZXNzZWRfZmxhZ3MgPSA8aW5jbHVkZT4uLiA8ZGVmaW5lPkhBVkVfWkxJQiA7Citsb2NhbCBjb21wcmVzc2VkX2RlcHMgPSAvdG9wLy96IDsKK2lmIFsgdGVzdF9saWJyYXJ5ICJiejIiIF0gJiYgWyB0ZXN0X2hlYWRlciAiYnpsaWIuaCIgXSB7CisgIGV4dGVybmFsLWxpYiBiejIgOworICBjb21wcmVzc2VkX2ZsYWdzICs9IDxkZWZpbmU+SEFWRV9CWkxJQiA7CisgIGNvbXByZXNzZWRfZGVwcyArPSBiejIgOworfQoraWYgWyB0ZXN0X2xpYnJhcnkgImx6bWEiIF0gJiYgWyB0ZXN0X2hlYWRlciAibHptYS5oIiBdIHsKKyAgZXh0ZXJuYWwtbGliIGx6bWEgOworICBjb21wcmVzc2VkX2ZsYWdzICs9IDxkZWZpbmU+SEFWRV9YWkxJQiA7CisgIGNvbXByZXNzZWRfZGVwcyArPSBsem1hIDsKK30KKworI3J0IGlzIG5lZWRlZCBmb3IgY2xvY2tfZ2V0dGltZSBvbiBsaW51eC4gIEJ1dCBpdCdzIGFscmVhZHkgaW5jbHVkZWQgd2l0aCB0aHJlYWRpbmc9bXVsdGkKK2xpYiBydCA7CisKK29iaiByZWFkX2NvbXByZXNzZWQubyA6IHJlYWRfY29tcHJlc3NlZC5jYyA6ICQoY29tcHJlc3NlZF9mbGFncykgOworYWxpYXMgcmVhZF9jb21wcmVzc2VkIDogcmVhZF9jb21wcmVzc2VkLm8gJChjb21wcmVzc2VkX2RlcHMpIDsKK29iaiByZWFkX2NvbXByZXNzZWRfdGVzdC5vIDogcmVhZF9jb21wcmVzc2VkX3Rlc3QuY2MgL3RvcC8vYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yayA6ICQoY29tcHJlc3NlZF9mbGFncykgOworb2JqIGZpbGVfcGllY2VfdGVzdC5vIDogZmlsZV9waWVjZV90ZXN0LmNjIC90b3AvL2Jvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsgOiAkKGNvbXByZXNzZWRfZmxhZ3MpIDsKKworZmFrZWxpYiBwYXJhbGxlbF9yZWFkIDogcGFyYWxsZWxfcmVhZC5jYyA6IDx0aHJlYWRpbmc+bXVsdGk6PHNvdXJjZT4vdG9wLy9ib29zdF90aHJlYWQgPHRocmVhZGluZz5tdWx0aTo8ZGVmaW5lPldJVEhfVEhSRUFEUyA6IDogPGluY2x1ZGU+Li4gOworCitmYWtlbGliIGtlbnV0aWwgOiBbIGdsb2IgKi5jYyA6IHBhcmFsbGVsX3JlYWQuY2MgcmVhZF9jb21wcmVzc2VkLmNjICpfbWFpbi5jYyAqX3Rlc3QuY2MgXSByZWFkX2NvbXByZXNzZWQgcGFyYWxsZWxfcmVhZCBkb3VibGUtY29udmVyc2lvbi8vZG91YmxlLWNvbnZlcnNpb24gOiA8aW5jbHVkZT4uLiA8b3M+TElOVVgsPHRocmVhZGluZz5zaW5nbGU6PHNvdXJjZT5ydCA6IDogPGluY2x1ZGU+Li4gOworCitleGUgY2F0X2NvbXByZXNzZWQgOiBjYXRfY29tcHJlc3NlZF9tYWluLmNjIGtlbnV0aWwgOworCisjRG9lcyBub3QgaW5zdGFsbCB0aGlzCitleGUgcHJvYmluZ19oYXNoX3RhYmxlX2JlbmNobWFyayA6IHByb2JpbmdfaGFzaF90YWJsZV9iZW5jaG1hcmtfbWFpbi5jYyBrZW51dGlsIDsKKworYWxpYXMgcHJvZ3JhbXMgOiBjYXRfY29tcHJlc3NlZCA7CisKK2ltcG9ydCB0ZXN0aW5nIDsKKworcnVuIGZpbGVfcGllY2VfdGVzdC5vIGtlbnV0aWwgL3RvcC8vYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yayA6IDogZmlsZV9waWVjZS5jYyA7Citmb3IgbG9jYWwgdCBpbiBbIGdsb2IgKl90ZXN0LmNjIDogZmlsZV9waWVjZV90ZXN0LmNjIHJlYWRfY29tcHJlc3NlZF90ZXN0LmNjIF0geworICAgIGxvY2FsIG5hbWUgPSBbIE1BVENIICIoLiopXC5jYyIgOiAkKHQpIF0gOworICAgIHVuaXQtdGVzdCAkKG5hbWUpIDogJCh0KSBrZW51dGlsIC90b3AvL2Jvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsgL3RvcC8vYm9vc3Rfc3lzdGVtIDsKK30KKworYnVpbGQtcHJvamVjdCBzdHJlYW0gOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvYml0X3BhY2tpbmcuY2MgYi9zcmMva2VubG0vdXRpbC9iaXRfcGFja2luZy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmZkOWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvYml0X3BhY2tpbmcuY2MKQEAgLTAsMCArMSw0MCBAQAorI2luY2x1ZGUgInV0aWwvYml0X3BhY2tpbmcuaGgiCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgdXRpbCB7CisKK25hbWVzcGFjZSB7Cit0ZW1wbGF0ZSA8Ym9vbD4gc3RydWN0IFN0YXRpY0NoZWNrIHt9OwordGVtcGxhdGUgPD4gc3RydWN0IFN0YXRpY0NoZWNrPHRydWU+IHsgdHlwZWRlZiBib29sIFN0YXRpY0Fzc2VydGlvblBhc3NlZDsgfTsKKworLy8gSWYgeW91ciBmbG9hdCBpc24ndCA0IGJ5dGVzLCB3ZSdyZSBob3NlZC4KK3R5cGVkZWYgU3RhdGljQ2hlY2s8c2l6ZW9mKGZsb2F0KSA9PSA0Pjo6U3RhdGljQXNzZXJ0aW9uUGFzc2VkIEZsb2F0U2l6ZTsKKworfSAvLyBuYW1lc3BhY2UKKwordWludDhfdCBSZXF1aXJlZEJpdHModWludDY0X3QgbWF4X3ZhbHVlKSB7CisgIGlmICghbWF4X3ZhbHVlKSByZXR1cm4gMDsKKyAgdWludDhfdCByZXQgPSAxOworICB3aGlsZSAobWF4X3ZhbHVlID4+PSAxKSArK3JldDsKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBCaXRQYWNraW5nU2FuaXR5KCkgeworICBjb25zdCBGbG9hdEVuYyBuZWcxID0geyAtMS4wIH0sIHBvczEgPSB7IDEuMCB9OworICBpZiAoKG5lZzEuaSBeIHBvczEuaSkgIT0gMHg4MDAwMDAwMCkgVVRJTF9USFJPVyhFeGNlcHRpb24sICJTaWduIGJpdCBpcyBub3QgMHg4MDAwMDAwMCIpOworICBjaGFyIG1lbVs1Nys4XTsKKyAgbWVtc2V0KG1lbSwgMCwgc2l6ZW9mKG1lbSkpOworICBjb25zdCB1aW50NjRfdCB0ZXN0NTcgPSAweDEyMzQ1Njc4OWFiY2RlZlVMTDsKKyAgZm9yICh1aW50NjRfdCBiID0gMDsgYiA8IDU3ICogODsgYiArPSA1NykgeworICAgIFdyaXRlSW50NTcobWVtLCBiLCA1NywgdGVzdDU3KTsKKyAgfQorICBmb3IgKHVpbnQ2NF90IGIgPSAwOyBiIDwgNTcgKiA4OyBiICs9IDU3KSB7CisgICAgaWYgKHRlc3Q1NyAhPSBSZWFkSW50NTcobWVtLCBiLCA1NywgKDFVTEwgPDwgNTcpIC0gMSkpCisgICAgICBVVElMX1RIUk9XKEV4Y2VwdGlvbiwgIlRoZSBiaXQgcGFja2luZyByb3V0aW5lcyBhcmUgZmFpbGluZyBmb3IgeW91ciBhcmNoaXRlY3R1cmUuICBQbGVhc2Ugc2VuZCBhIGJ1ZyByZXBvcnQgd2l0aCB5b3VyIGFyY2hpdGVjdHVyZSwgb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGNvbXBpbGVyLiIpOworICB9CisgIC8vIFRPRE86IG1vcmUgY2hlY2tzLgorfQorCit9IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9iaXRfcGFja2luZy5oaCBiL3NyYy9rZW5sbS91dGlsL2JpdF9wYWNraW5nLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGZkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9iaXRfcGFja2luZy5oaApAQCAtMCwwICsxLDE4NSBAQAorI2lmbmRlZiBVVElMX0JJVF9QQUNLSU5HX0gKKyNkZWZpbmUgVVRJTF9CSVRfUEFDS0lOR19ICisKKy8qIEJpdC1sZXZlbCBwYWNraW5nIHJvdXRpbmVzCisgKgorICogV0FSTklORyBXQVJOSU5HIFdBUk5JTkc6CisgKiBUaGUgd3JpdGUgZnVuY3Rpb25zIGFzc3VtZSB0aGF0IG1lbW9yeSBpcyB6ZXJvIGluaXRpYWxseS4gIFRoaXMgbWFrZXMgdGhlbQorICogZmFzdGVyIGFuZCBpcyB0aGUgYXBwcm9wcmlhdGUgY2FzZSBmb3IgbW1hcHBlZCBsYW5ndWFnZSBtb2RlbCBjb25zdHJ1Y3Rpb24uCisgKiBUaGVzZSByb3V0aW5lcyBhc3N1bWUgdGhhdCB1bmFsaWduZWQgYWNjZXNzIHRvIHVpbnQ2NF90IGlzIGZhc3QuICBUaGlzIGlzCisgKiB0aGUgY2FzZSBvbiB4ODZfNjQuICBJJ20gbm90IHN1cmUgaG93IGZhc3QgdW5hbGlnbmVkIDY0LWJpdCBhY2Nlc3MgaXMgb24KKyAqIHg4NiBidXQgbXkgdGFyZ2V0IGF1ZGllbmNlIGlzIGxhcmdlIGxhbmd1YWdlIG1vZGVscyBmb3Igd2hpY2ggNjQtYml0IGlzCisgKiBuZWNlc3NhcnkuCisgKgorICogQ2FsbCB0aGUgQml0UGFja2luZ1Nhbml0eSBmdW5jdGlvbiB0byBzYW5pdHkgY2hlY2suICBDYWxsaW5nIG9uY2Ugc3VmZmljZXMsCisgKiBidXQgaXQgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aGVuIHRoYXQncyBpbmNvbnZlbmllbnQuCisgKgorICogQVJNIGFuZCBNaW5HVyBwb3J0cyBjb250cmlidXRlZCBieSBIaWRlbyBPa3VtYSBhbmQgVG9tb3l1a2kgWW9zaGltdXJhIGF0CisgKiBOSUNULgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2lmZGVmIF9fQVBQTEVfXworI2luY2x1ZGUgPGFyY2hpdGVjdHVyZS9ieXRlX29yZGVyLmg+CisjZWxpZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNlbGlmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjY0KQorI2luY2x1ZGUgPGFycGEvbmFtZXNlcl9jb21wYXQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIHV0aWwgeworCisvLyBGdW4gZmFjdDogX19CWVRFX09SREVSIGlzIHdyb25nIG9uIFNvbGFyaXMgU3BhcmMsIGJ1dCB0aGUgdmVyc2lvbiB3aXRob3V0IF9fIGlzIGNvcnJlY3QuCisjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCitpbmxpbmUgdWludDhfdCBCaXRQYWNrU2hpZnQodWludDhfdCBiaXQsIHVpbnQ4X3QgLypsZW5ndGgqLykgeworICByZXR1cm4gYml0OworfQorI2VsaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCitpbmxpbmUgdWludDhfdCBCaXRQYWNrU2hpZnQodWludDhfdCBiaXQsIHVpbnQ4X3QgbGVuZ3RoKSB7CisgIHJldHVybiA2NCAtIGxlbmd0aCAtIGJpdDsKK30KKyNlbHNlCisjZXJyb3IgIkJpdCBwYWNraW5nIGNvZGUgaXNuJ3Qgd3JpdHRlbiBmb3IgeW91ciBieXRlIG9yZGVyLiIKKyNlbmRpZgorCitpbmxpbmUgdWludDY0X3QgUmVhZE9mZihjb25zdCB2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2ZmKSB7CisjaWYgZGVmaW5lZChfX2FybSkgfHwgZGVmaW5lZChfX2FybV9fKQorICBjb25zdCB1aW50OF90ICpiYXNlX29mZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJhc2UpICsgKGJpdF9vZmYgPj4gMyk7CisgIHVpbnQ2NF90IHZhbHVlNjQ7CisgIG1lbWNweSgmdmFsdWU2NCwgYmFzZV9vZmYsIHNpemVvZih2YWx1ZTY0KSk7CisgIHJldHVybiB2YWx1ZTY0OworI2Vsc2UKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYmFzZSkgKyAoYml0X29mZiA+PiAzKSk7CisjZW5kaWYKK30KKworLyogUGFjayBpbnRlZ2VycyB1cCB0byA1NyBiaXRzIHVzaW5nIHRoZWlyIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0cy4KKyAqIFRoZSBsZW5ndGggaXMgc3BlY2lmaWVkIHVzaW5nIG1hc2s6CisgKiBBc3N1bWVzIG1hc2sgPT0gKDEgPDwgbGVuZ3RoKSAtIDEgd2hlcmUgbGVuZ3RoIDw9IDU3LgorICovCitpbmxpbmUgdWludDY0X3QgUmVhZEludDU3KGNvbnN0IHZvaWQgKmJhc2UsIHVpbnQ2NF90IGJpdF9vZmYsIHVpbnQ4X3QgbGVuZ3RoLCB1aW50NjRfdCBtYXNrKSB7CisgIHJldHVybiAoUmVhZE9mZihiYXNlLCBiaXRfb2ZmKSA+PiBCaXRQYWNrU2hpZnQoYml0X29mZiAmIDcsIGxlbmd0aCkpICYgbWFzazsKK30KKy8qIEFzc3VtZXMgdmFsdWUgPCAoMSA8PCBsZW5ndGgpIGFuZCBsZW5ndGggPD0gNTcuCisgKiBBc3N1bWVzIHRoZSBtZW1vcnkgaXMgemVybyBpbml0aWFsbHkuCisgKi8KK2lubGluZSB2b2lkIFdyaXRlSW50NTcodm9pZCAqYmFzZSwgdWludDY0X3QgYml0X29mZiwgdWludDhfdCBsZW5ndGgsIHVpbnQ2NF90IHZhbHVlKSB7CisjaWYgZGVmaW5lZChfX2FybSkgfHwgZGVmaW5lZChfX2FybV9fKQorICB1aW50OF90ICpiYXNlX29mZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJhc2UpICsgKGJpdF9vZmYgPj4gMyk7CisgIHVpbnQ2NF90IHZhbHVlNjQ7CisgIG1lbWNweSgmdmFsdWU2NCwgYmFzZV9vZmYsIHNpemVvZih2YWx1ZTY0KSk7CisgIHZhbHVlNjQgfD0gKHZhbHVlIDw8IEJpdFBhY2tTaGlmdChiaXRfb2ZmICYgNywgbGVuZ3RoKSk7CisgIG1lbWNweShiYXNlX29mZiwgJnZhbHVlNjQsIHNpemVvZih2YWx1ZTY0KSk7CisjZWxzZQorICAqcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCo+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJhc2UpICsgKGJpdF9vZmYgPj4gMykpIHw9CisgICAgKHZhbHVlIDw8IEJpdFBhY2tTaGlmdChiaXRfb2ZmICYgNywgbGVuZ3RoKSk7CisjZW5kaWYKK30KKworLyogU2FtZSBjYXZlYXRzIGFzIGFib3ZlLCBidXQgZm9yIGEgMjUgYml0IGxpbWl0LiAqLworaW5saW5lIHVpbnQzMl90IFJlYWRJbnQyNShjb25zdCB2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2ZmLCB1aW50OF90IGxlbmd0aCwgdWludDMyX3QgbWFzaykgeworI2lmIGRlZmluZWQoX19hcm0pIHx8IGRlZmluZWQoX19hcm1fXykKKyAgY29uc3QgdWludDhfdCAqYmFzZV9vZmYgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihiYXNlKSArIChiaXRfb2ZmID4+IDMpOworICB1aW50MzJfdCB2YWx1ZTMyOworICBtZW1jcHkoJnZhbHVlMzIsIGJhc2Vfb2ZmLCBzaXplb2YodmFsdWUzMikpOworICByZXR1cm4gKHZhbHVlMzIgPj4gQml0UGFja1NoaWZ0KGJpdF9vZmYgJiA3LCBsZW5ndGgpKSAmIG1hc2s7CisjZWxzZQorICByZXR1cm4gKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYmFzZSkgKyAoYml0X29mZiA+PiAzKSkgPj4gQml0UGFja1NoaWZ0KGJpdF9vZmYgJiA3LCBsZW5ndGgpKSAmIG1hc2s7CisjZW5kaWYKK30KKworaW5saW5lIHZvaWQgV3JpdGVJbnQyNSh2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2ZmLCB1aW50OF90IGxlbmd0aCwgdWludDMyX3QgdmFsdWUpIHsKKyNpZiBkZWZpbmVkKF9fYXJtKSB8fCBkZWZpbmVkKF9fYXJtX18pCisgIHVpbnQ4X3QgKmJhc2Vfb2ZmID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmFzZSkgKyAoYml0X29mZiA+PiAzKTsKKyAgdWludDMyX3QgdmFsdWUzMjsKKyAgbWVtY3B5KCZ2YWx1ZTMyLCBiYXNlX29mZiwgc2l6ZW9mKHZhbHVlMzIpKTsKKyAgdmFsdWUzMiB8PSAodmFsdWUgPDwgQml0UGFja1NoaWZ0KGJpdF9vZmYgJiA3LCBsZW5ndGgpKTsKKyAgbWVtY3B5KGJhc2Vfb2ZmLCAmdmFsdWUzMiwgc2l6ZW9mKHZhbHVlMzIpKTsKKyNlbHNlCisgICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4ocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmFzZSkgKyAoYml0X29mZiA+PiAzKSkgfD0KKyAgICAodmFsdWUgPDwgQml0UGFja1NoaWZ0KGJpdF9vZmYgJiA3LCBsZW5ndGgpKTsKKyNlbmRpZgorfQorCit0eXBlZGVmIHVuaW9uIHsgZmxvYXQgZjsgdWludDMyX3QgaTsgfSBGbG9hdEVuYzsKKworaW5saW5lIGZsb2F0IFJlYWRGbG9hdDMyKGNvbnN0IHZvaWQgKmJhc2UsIHVpbnQ2NF90IGJpdF9vZmYpIHsKKyAgRmxvYXRFbmMgZW5jb2RlZDsKKyAgZW5jb2RlZC5pID0gUmVhZE9mZihiYXNlLCBiaXRfb2ZmKSA+PiBCaXRQYWNrU2hpZnQoYml0X29mZiAmIDcsIDMyKTsKKyAgcmV0dXJuIGVuY29kZWQuZjsKK30KK2lubGluZSB2b2lkIFdyaXRlRmxvYXQzMih2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2ZmLCBmbG9hdCB2YWx1ZSkgeworICBGbG9hdEVuYyBlbmNvZGVkOworICBlbmNvZGVkLmYgPSB2YWx1ZTsKKyAgV3JpdGVJbnQ1NyhiYXNlLCBiaXRfb2ZmLCAzMiwgZW5jb2RlZC5pKTsKK30KKworY29uc3QgdWludDMyX3Qga1NpZ25CaXQgPSAweDgwMDAwMDAwOworCitpbmxpbmUgdm9pZCBTZXRTaWduKGZsb2F0ICZ0bykgeworICBGbG9hdEVuYyBlbmM7CisgIGVuYy5mID0gdG87CisgIGVuYy5pIHw9IGtTaWduQml0OworICB0byA9IGVuYy5mOworfQorCitpbmxpbmUgdm9pZCBVbnNldFNpZ24oZmxvYXQgJnRvKSB7CisgIEZsb2F0RW5jIGVuYzsKKyAgZW5jLmYgPSB0bzsKKyAgZW5jLmkgJj0gfmtTaWduQml0OworICB0byA9IGVuYy5mOworfQorCitpbmxpbmUgZmxvYXQgUmVhZE5vblBvc2l0aXZlRmxvYXQzMShjb25zdCB2b2lkICpiYXNlLCB1aW50NjRfdCBiaXRfb2ZmKSB7CisgIEZsb2F0RW5jIGVuY29kZWQ7CisgIGVuY29kZWQuaSA9IFJlYWRPZmYoYmFzZSwgYml0X29mZikgPj4gQml0UGFja1NoaWZ0KGJpdF9vZmYgJiA3LCAzMSk7CisgIC8vIFNpZ24gYml0IHNldCBtZWFucyBuZWdhdGl2ZS4KKyAgZW5jb2RlZC5pIHw9IGtTaWduQml0OworICByZXR1cm4gZW5jb2RlZC5mOworfQoraW5saW5lIHZvaWQgV3JpdGVOb25Qb3NpdGl2ZUZsb2F0MzEodm9pZCAqYmFzZSwgdWludDY0X3QgYml0X29mZiwgZmxvYXQgdmFsdWUpIHsKKyAgRmxvYXRFbmMgZW5jb2RlZDsKKyAgZW5jb2RlZC5mID0gdmFsdWU7CisgIGVuY29kZWQuaSAmPSB+a1NpZ25CaXQ7CisgIFdyaXRlSW50NTcoYmFzZSwgYml0X29mZiwgMzEsIGVuY29kZWQuaSk7Cit9CisKK3ZvaWQgQml0UGFja2luZ1Nhbml0eSgpOworCisvLyBSZXR1cm4gYml0cyByZXF1aXJlZCB0byBzdG9yZSBpbnRlZ2VycyB1cHRvIG1heF92YWx1ZS4gIE5vdCB0aGUgbW9zdAorLy8gZWZmaWNpZW50IGltcGxlbWVudGF0aW9uLCBidXQgdGhpcyBpcyBvbmx5IGNhbGxlZCBhIGZldyB0aW1lcyB0byBzaXplIHRyaWVzLgordWludDhfdCBSZXF1aXJlZEJpdHModWludDY0X3QgbWF4X3ZhbHVlKTsKKworc3RydWN0IEJpdHNNYXNrIHsKKyAgc3RhdGljIEJpdHNNYXNrIEJ5TWF4KHVpbnQ2NF90IG1heF92YWx1ZSkgeworICAgIEJpdHNNYXNrIHJldDsKKyAgICByZXQuRnJvbU1heChtYXhfdmFsdWUpOworICAgIHJldHVybiByZXQ7CisgIH0KKyAgc3RhdGljIEJpdHNNYXNrIEJ5Qml0cyh1aW50OF90IGJpdHMpIHsKKyAgICBCaXRzTWFzayByZXQ7CisgICAgcmV0LmJpdHMgPSBiaXRzOworICAgIHJldC5tYXNrID0gKDFVTEwgPDwgYml0cykgLSAxOworICAgIHJldHVybiByZXQ7CisgIH0KKyAgdm9pZCBGcm9tTWF4KHVpbnQ2NF90IG1heF92YWx1ZSkgeworICAgIGJpdHMgPSBSZXF1aXJlZEJpdHMobWF4X3ZhbHVlKTsKKyAgICBtYXNrID0gKDFVTEwgPDwgYml0cykgLSAxOworICB9CisgIHVpbnQ4X3QgYml0czsKKyAgdWludDY0X3QgbWFzazsKK307CisKK3N0cnVjdCBCaXRBZGRyZXNzIHsKKyAgQml0QWRkcmVzcyh2b2lkICppbl9iYXNlLCB1aW50NjRfdCBpbl9vZmZzZXQpIDogYmFzZShpbl9iYXNlKSwgb2Zmc2V0KGluX29mZnNldCkge30KKworICB2b2lkICpiYXNlOworICB1aW50NjRfdCBvZmZzZXQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSB1dGlsCisKKyNlbmRpZiAvLyBVVElMX0JJVF9QQUNLSU5HX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL2JpdF9wYWNraW5nX3Rlc3QuY2MgYi9zcmMva2VubG0vdXRpbC9iaXRfcGFja2luZ190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NDk0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9iaXRfcGFja2luZ190ZXN0LmNjCkBAIC0wLDAgKzEsNTkgQEAKKyNpbmNsdWRlICJ1dGlsL2JpdF9wYWNraW5nLmhoIgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEJpdFBhY2tpbmdUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHsKKworY29uc3QgdWludDY0X3QgdGVzdDU3ID0gMHgxMjM0NTY3ODlhYmNkZWZVTEw7Citjb25zdCB1aW50MzJfdCB0ZXN0MjUgPSAweDEyMzQ1Njc7CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFplcm9CaXQ1NykgeworICBjaGFyIG1lbVsxNl07CisgIG1lbXNldChtZW0sIDAsIHNpemVvZihtZW0pKTsKKyAgV3JpdGVJbnQ1NyhtZW0sIDAsIDU3LCB0ZXN0NTcpOworICBCT09TVF9DSEVDS19FUVVBTCh0ZXN0NTcsIFJlYWRJbnQ1NyhtZW0sIDAsIDU3LCAoMVVMTCA8PCA1NykgLSAxKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVhY2hCaXQ1NykgeworICBjaGFyIG1lbVsxNl07CisgIGZvciAodWludDhfdCBiID0gMDsgYiA8IDg7ICsrYikgeworICAgIG1lbXNldChtZW0sIDAsIHNpemVvZihtZW0pKTsKKyAgICBXcml0ZUludDU3KG1lbSwgYiwgNTcsIHRlc3Q1Nyk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwodGVzdDU3LCBSZWFkSW50NTcobWVtLCBiLCA1NywgKDFVTEwgPDwgNTcpIC0gMSkpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKENvbnNlY3V0aXZlNTcpIHsKKyAgY2hhciBtZW1bNTcrOF07CisgIG1lbXNldChtZW0sIDAsIHNpemVvZihtZW0pKTsKKyAgZm9yICh1aW50NjRfdCBiID0gMDsgYiA8IDU3ICogODsgYiArPSA1NykgeworICAgIFdyaXRlSW50NTcobWVtLCBiLCA1NywgdGVzdDU3KTsKKyAgICBCT09TVF9DSEVDS19FUVVBTCh0ZXN0NTcsIFJlYWRJbnQ1NyhtZW0sIGIsIDU3LCAoMVVMTCA8PCA1NykgLSAxKSk7CisgIH0KKyAgZm9yICh1aW50NjRfdCBiID0gMDsgYiA8IDU3ICogODsgYiArPSA1NykgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKHRlc3Q1NywgUmVhZEludDU3KG1lbSwgYiwgNTcsICgxVUxMIDw8IDU3KSAtIDEpKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShDb25zZWN1dGl2ZTI1KSB7CisgIGNoYXIgbWVtWzI1KzhdOworICBtZW1zZXQobWVtLCAwLCBzaXplb2YobWVtKSk7CisgIGZvciAodWludDY0X3QgYiA9IDA7IGIgPCAyNSAqIDg7IGIgKz0gMjUpIHsKKyAgICBXcml0ZUludDI1KG1lbSwgYiwgMjUsIHRlc3QyNSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwodGVzdDI1LCBSZWFkSW50MjUobWVtLCBiLCAyNSwgKDFVTEwgPDwgMjUpIC0gMSkpOworICB9CisgIGZvciAodWludDY0X3QgYiA9IDA7IGIgPCAyNSAqIDg7IGIgKz0gMjUpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTCh0ZXN0MjUsIFJlYWRJbnQyNShtZW0sIGIsIDI1LCAoMVVMTCA8PCAyNSkgLSAxKSk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2FuaXR5KSB7CisgIEJpdFBhY2tpbmdTYW5pdHkoKTsKK30KKworfSAvLyBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL2NhdF9jb21wcmVzc2VkX21haW4uY2MgYi9zcmMva2VubG0vdXRpbC9jYXRfY29tcHJlc3NlZF9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjN2NkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9jYXRfY29tcHJlc3NlZF9tYWluLmNjCkBAIC0wLDAgKzEsNDcgQEAKKy8vIExpa2UgY2F0IGJ1dCBpbnRlcnByZXRzIGNvbXByZXNzZWQgZmlsZXMuCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvcmVhZF9jb21wcmVzc2VkLmhoIgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c2l6ZV90IGtCdWZTaXplID0gMTYzODQ7Cit2b2lkIENvcHkodXRpbDo6UmVhZENvbXByZXNzZWQgJmZyb20sIGludCB0bykgeworICB1dGlsOjpzY29wZWRfbWFsbG9jIGJ1ZmZlcih1dGlsOjpNYWxsb2NPclRocm93KGtCdWZTaXplKSk7CisgIHdoaWxlIChzdGQ6OnNpemVfdCBhbW91bnQgPSBmcm9tLlJlYWQoYnVmZmVyLmdldCgpLCBrQnVmU2l6ZSkpIHsKKyAgICB1dGlsOjpXcml0ZU9yVGhyb3codG8sIGJ1ZmZlci5nZXQoKSwgYW1vdW50KTsKKyAgfQorfQorfSAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICAvLyBMYW5lIFNjaHdhcnR6IGxpa2VzIC1oIGFuZCAtLWhlbHAKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyArK2kpIHsKKyAgICBjaGFyICphcmcgPSBhcmd2W2ldOworICAgIGlmICghc3RyY21wKGFyZywgIi0tIikpIGJyZWFrOworICAgIGlmICghc3RyY21wKGFyZywgIi1oIikgfHwgIXN0cmNtcChhcmcsICItLWhlbHAiKSkgeworICAgICAgc3RkOjpjZXJyIDw8CisgICAgICAgICJBIGNhdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGludGVycHJldHMgY29tcHJlc3NlZCBmaWxlcy5cbiIKKyAgICAgICAgIlVzYWdlOiAiIDw8IGFyZ3ZbMF0gPDwgIiBbZmlsZTFdIFtmaWxlMl0gLi4uXG4iCisgICAgICAgICJJZiBubyBmaWxlIGlzIHByb3ZpZGVkLCB0aGVuIHN0ZGluIGlzIHJlYWQuXG4iOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgdHJ5IHsKKyAgICBpZiAoYXJnYyA9PSAxKSB7CisgICAgICB1dGlsOjpSZWFkQ29tcHJlc3NlZCBpbigwKTsKKyAgICAgIENvcHkoaW4sIDEpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkgeworICAgICAgICB1dGlsOjpSZWFkQ29tcHJlc3NlZCBpbih1dGlsOjpPcGVuUmVhZE9yVGhyb3coYXJndltpXSkpOworICAgICAgICBDb3B5KGluLCAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZlKSB7CisgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gMjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL0NNYWtlTGlzdHMudHh0IGIvc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjZjAyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzkgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjguOCkKKyMKKyMgVGhlIEtlbkxNIGNtYWtlIGZpbGVzIG1ha2UgdXNlIG9mIGFkZF9saWJyYXJ5KC4uLiBPQkpFQ1RTIC4uLikKKyMgCisjIFRoaXMgc3ludGF4IGFsbG93cyBncm91cGluZyBvZiBzb3VyY2UgZmlsZXMgd2hlbiBjb21waWxpbmcKKyMgKGVmZmVjdGl2ZWx5IGNyZWF0aW5nICJmYWtlIiBsaWJyYXJpZXMgYmFzZWQgb24gc291cmNlIHN1YmRpcnMpLgorIyAKKyMgVGhpcyBzeW50YXggd2FzIG9ubHkgYWRkZWQgaW4gY21ha2UgdmVyc2lvbiAyLjguOAorIworIyBzZWUgaHR0cDovL3d3dy5jbWFrZS5vcmcvV2lraS9DTWFrZS9UdXRvcmlhbHMvT2JqZWN0X0xpYnJhcnkKKworCisjIFRoaXMgQ01ha2UgZmlsZSB3YXMgY3JlYXRlZCBieSBMYW5lIFNjaHdhcnR6IDxkb3dvYmVoYUBnbWFpbC5jb20+CisKKyMgRXhwbGljaXRseSBsaXN0IHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoaXMgc3ViZGlyZWN0b3J5CisjCisjIElmIHlvdSBhZGQgYW55IHNvdXJjZSBmaWxlcyB0byB0aGlzIHN1YmRpcmVjdG9yeQorIyAgICB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUga2VubG0gbGlicmFyeSwKKyMgICAgICAgICh0aGlzIGV4Y2x1ZGVzIGFueSB1bml0IHRlc3QgZmlsZXMpCisjICAgIHlvdSBzaG91bGQgYWRkIHRoZW0gdG8gdGhlIGZvbGxvd2luZyBsaXN0OgorIworIyBJbiBvcmRlciB0byBhbGxvdyBDTWFrZSBmaWxlcyBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeQorIyAgICB0byBzZWUgdGhpcyB2YXJpYWJsZSBkZWZpbml0aW9uLCB3ZSBzZXQgUEFSRU5UX1NDT1BFLgorIworIyBJbiBvcmRlciB0byBzZXQgY29ycmVjdCBwYXRocyB0byB0aGVzZSBmaWxlcworIyAgICB3aGVuIHRoaXMgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBieSBDTWFrZSBmaWxlcyBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSwKKyMgICAgd2UgcHJlZml4IGFsbCBmaWxlcyB3aXRoICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS4KKyMKK3NldChLRU5MTV9VVElMX0RPVUJMRUNPTlZFUlNJT05fU09VUkNFIAorCQkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYmlnbnVtLWR0b2EuY2MKKwkJJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2JpZ251bS5jYworCQkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY2FjaGVkLXBvd2Vycy5jYworCQkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZGl5LWZwLmNjCisJCSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9kb3VibGUtY29udmVyc2lvbi5jYworCQkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZmFzdC1kdG9hLmNjCisJCSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9maXhlZC1kdG9hLmNjCisJCSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zdHJ0b2QuY2MKKwlQQVJFTlRfU0NPUEUpCisKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL0phbWZpbGUgYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9KYW1maWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9KYW1maWxlCnJlbmFtZSB0byBzcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9KYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9MSUNFTlNFIGIvc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vTElDRU5TRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vTElDRU5TRQpyZW5hbWUgdG8gc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vTElDRU5TRQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vYmlnbnVtLWR0b2EuY2MgYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9iaWdudW0tZHRvYS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDIxN2JmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vYmlnbnVtLWR0b2EuY2MKQEAgLTAsMCArMSw2NDAgQEAKKy8vIENvcHlyaWdodCAyMDEwIHRoZSBWOCBwcm9qZWN0IGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKy8vICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorLy8gICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisvLyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSAiYmlnbnVtLWR0b2EuaCIKKworI2luY2x1ZGUgImJpZ251bS5oIgorI2luY2x1ZGUgImllZWUuaCIKKworbmFtZXNwYWNlIGRvdWJsZV9jb252ZXJzaW9uIHsKKworc3RhdGljIGludCBOb3JtYWxpemVkRXhwb25lbnQodWludDY0X3Qgc2lnbmlmaWNhbmQsIGludCBleHBvbmVudCkgeworICBBU1NFUlQoc2lnbmlmaWNhbmQgIT0gMCk7CisgIHdoaWxlICgoc2lnbmlmaWNhbmQgJiBEb3VibGU6OmtIaWRkZW5CaXQpID09IDApIHsKKyAgICBzaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kIDw8IDE7CisgICAgZXhwb25lbnQgPSBleHBvbmVudCAtIDE7CisgIH0KKyAgcmV0dXJuIGV4cG9uZW50OworfQorCisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zOgorLy8gUmV0dXJucyBhbiBlc3RpbWF0aW9uIG9mIGsgc3VjaCB0aGF0IDEwXihrLTEpIDw9IHYgPCAxMF5rLgorc3RhdGljIGludCBFc3RpbWF0ZVBvd2VyKGludCBleHBvbmVudCk7CisvLyBDb21wdXRlcyB2IC8gMTBeZXN0aW1hdGVkX3Bvd2VyIGV4YWN0bHksIGFzIGEgcmF0aW8gb2YgdHdvIGJpZ251bXMsIG51bWVyYXRvcgorLy8gYW5kIGRlbm9taW5hdG9yLgorc3RhdGljIHZvaWQgSW5pdGlhbFNjYWxlZFN0YXJ0VmFsdWVzKHVpbnQ2NF90IHNpZ25pZmljYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvd2VyX2JvdW5kYXJ5X2lzX2Nsb3NlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXN0aW1hdGVkX3Bvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZF9ib3VuZGFyeV9kZWx0YXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnbnVtKiBudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnbnVtKiBkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIGRlbHRhX21pbnVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogZGVsdGFfcGx1cyk7CisvLyBNdWx0aXBsaWVzIG51bWVyYXRvci9kZW5vbWluYXRvciBzbyB0aGF0IGl0cyB2YWx1ZXMgbGllcyBpbiB0aGUgcmFuZ2UgMS0xMC4KKy8vIFJldHVybnMgZGVjaW1hbF9wb2ludCBzLnQuCisvLyAgdiA9IG51bWVyYXRvcicvZGVub21pbmF0b3InICogMTBeKGRlY2ltYWxfcG9pbnQtMSkKKy8vICAgICB3aGVyZSBudW1lcmF0b3InIGFuZCBkZW5vbWluYXRvcicgYXJlIHRoZSB2YWx1ZXMgb2YgbnVtZXJhdG9yIGFuZAorLy8gICAgIGRlbm9taW5hdG9yIGFmdGVyIHRoZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCitzdGF0aWMgdm9pZCBGaXh1cE11bHRpcGx5MTAoaW50IGVzdGltYXRlZF9wb3dlciwgYm9vbCBpc19ldmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVjaW1hbF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIGRlbHRhX21pbnVzLCBCaWdudW0qIGRlbHRhX3BsdXMpOworLy8gR2VuZXJhdGVzIGRpZ2l0cyBmcm9tIHRoZSBsZWZ0IHRvIHRoZSByaWdodCBhbmQgc3RvcHMgd2hlbiB0aGUgZ2VuZXJhdGVkCisvLyBkaWdpdHMgeWllbGQgdGhlIHNob3J0ZXN0IGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2Ygdi4KK3N0YXRpYyB2b2lkIEdlbmVyYXRlU2hvcnRlc3REaWdpdHMoQmlnbnVtKiBudW1lcmF0b3IsIEJpZ251bSogZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogZGVsdGFfbWludXMsIEJpZ251bSogZGVsdGFfcGx1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19ldmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8Y2hhcj4gYnVmZmVyLCBpbnQqIGxlbmd0aCk7CisvLyBHZW5lcmF0ZXMgJ3JlcXVlc3RlZF9kaWdpdHMnIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50Lgorc3RhdGljIHZvaWQgQmlnbnVtVG9GaXhlZChpbnQgcmVxdWVzdGVkX2RpZ2l0cywgaW50KiBkZWNpbWFsX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+KGJ1ZmZlciksIGludCogbGVuZ3RoKTsKKy8vIEdlbmVyYXRlcyAnY291bnQnIGRpZ2l0cyBvZiBudW1lcmF0b3IvZGVub21pbmF0b3IuCisvLyBPbmNlICdjb3VudCcgZGlnaXRzIGhhdmUgYmVlbiBwcm9kdWNlZCByb3VuZHMgdGhlIHJlc3VsdCBkZXBlbmRpbmcgb24gdGhlCisvLyByZW1haW5kZXIgKHJlbWFpbmRlcnMgb2YgZXhhY3RseSAuNSByb3VuZCB1cHdhcmRzKS4gTWlnaHQgdXBkYXRlIHRoZQorLy8gZGVjaW1hbF9wb2ludCB3aGVuIHJvdW5kaW5nIHVwIChmb3IgZXhhbXBsZSBmb3IgMC45OTk5KS4KK3N0YXRpYyB2b2lkIEdlbmVyYXRlQ291bnRlZERpZ2l0cyhpbnQgY291bnQsIGludCogZGVjaW1hbF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8Y2hhcj4oYnVmZmVyKSwgaW50KiBsZW5ndGgpOworCisKK3ZvaWQgQmlnbnVtRHRvYShkb3VibGUgdiwgQmlnbnVtRHRvYU1vZGUgbW9kZSwgaW50IHJlcXVlc3RlZF9kaWdpdHMsCisgICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+IGJ1ZmZlciwgaW50KiBsZW5ndGgsIGludCogZGVjaW1hbF9wb2ludCkgeworICBBU1NFUlQodiA+IDApOworICBBU1NFUlQoIURvdWJsZSh2KS5Jc1NwZWNpYWwoKSk7CisgIHVpbnQ2NF90IHNpZ25pZmljYW5kOworICBpbnQgZXhwb25lbnQ7CisgIGJvb2wgbG93ZXJfYm91bmRhcnlfaXNfY2xvc2VyOworICBpZiAobW9kZSA9PSBCSUdOVU1fRFRPQV9TSE9SVEVTVF9TSU5HTEUpIHsKKyAgICBmbG9hdCBmID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHYpOworICAgIEFTU0VSVChmID09IHYpOworICAgIHNpZ25pZmljYW5kID0gU2luZ2xlKGYpLlNpZ25pZmljYW5kKCk7CisgICAgZXhwb25lbnQgPSBTaW5nbGUoZikuRXhwb25lbnQoKTsKKyAgICBsb3dlcl9ib3VuZGFyeV9pc19jbG9zZXIgPSBTaW5nbGUoZikuTG93ZXJCb3VuZGFyeUlzQ2xvc2VyKCk7CisgIH0gZWxzZSB7CisgICAgc2lnbmlmaWNhbmQgPSBEb3VibGUodikuU2lnbmlmaWNhbmQoKTsKKyAgICBleHBvbmVudCA9IERvdWJsZSh2KS5FeHBvbmVudCgpOworICAgIGxvd2VyX2JvdW5kYXJ5X2lzX2Nsb3NlciA9IERvdWJsZSh2KS5Mb3dlckJvdW5kYXJ5SXNDbG9zZXIoKTsKKyAgfQorICBib29sIG5lZWRfYm91bmRhcnlfZGVsdGFzID0KKyAgICAgIChtb2RlID09IEJJR05VTV9EVE9BX1NIT1JURVNUIHx8IG1vZGUgPT0gQklHTlVNX0RUT0FfU0hPUlRFU1RfU0lOR0xFKTsKKworICBib29sIGlzX2V2ZW4gPSAoc2lnbmlmaWNhbmQgJiAxKSA9PSAwOworICBpbnQgbm9ybWFsaXplZF9leHBvbmVudCA9IE5vcm1hbGl6ZWRFeHBvbmVudChzaWduaWZpY2FuZCwgZXhwb25lbnQpOworICAvLyBlc3RpbWF0ZWRfcG93ZXIgbWlnaHQgYmUgdG9vIGxvdyBieSAxLgorICBpbnQgZXN0aW1hdGVkX3Bvd2VyID0gRXN0aW1hdGVQb3dlcihub3JtYWxpemVkX2V4cG9uZW50KTsKKworICAvLyBTaG9ydGN1dCBmb3IgRml4ZWQuCisgIC8vIFRoZSByZXF1ZXN0ZWQgZGlnaXRzIGNvcnJlc3BvbmQgdG8gdGhlIGRpZ2l0cyBhZnRlciB0aGUgcG9pbnQuIElmIHRoZQorICAvLyBudW1iZXIgaXMgbXVjaCB0b28gc21hbGwsIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCBpbiB0cnlpbmcgdG8gZ2V0IGFueQorICAvLyBkaWdpdHMuCisgIGlmIChtb2RlID09IEJJR05VTV9EVE9BX0ZJWEVEICYmIC1lc3RpbWF0ZWRfcG93ZXIgLSAxID4gcmVxdWVzdGVkX2RpZ2l0cykgeworICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgKmxlbmd0aCA9IDA7CisgICAgLy8gU2V0IGRlY2ltYWwtcG9pbnQgdG8gLXJlcXVlc3RlZF9kaWdpdHMuIFRoaXMgaXMgd2hhdCBHYXkgZG9lcy4KKyAgICAvLyBOb3RlIHRoYXQgaXQgc2hvdWxkIG5vdCBoYXZlIGFueSBlZmZlY3QgYW55d2F5cyBzaW5jZSB0aGUgc3RyaW5nIGlzCisgICAgLy8gZW1wdHkuCisgICAgKmRlY2ltYWxfcG9pbnQgPSAtcmVxdWVzdGVkX2RpZ2l0czsKKyAgICByZXR1cm47CisgIH0KKworICBCaWdudW0gbnVtZXJhdG9yOworICBCaWdudW0gZGVub21pbmF0b3I7CisgIEJpZ251bSBkZWx0YV9taW51czsKKyAgQmlnbnVtIGRlbHRhX3BsdXM7CisgIC8vIE1ha2Ugc3VyZSB0aGUgYmlnbnVtIGNhbiBncm93IGxhcmdlIGVub3VnaC4gVGhlIHNtYWxsZXN0IGRvdWJsZSBlcXVhbHMKKyAgLy8gNGUtMzI0LiBJbiB0aGlzIGNhc2UgdGhlIGRlbm9taW5hdG9yIG5lZWRzIGZld2VyIHRoYW4gMzI0KjQgYmluYXJ5IGRpZ2l0cy4KKyAgLy8gVGhlIG1heGltdW0gZG91YmxlIGlzIDEuNzk3NjkzMTM0ODYyMzE1N2UzMDggd2hpY2ggbmVlZHMgZmV3ZXIgdGhhbgorICAvLyAzMDgqNCBiaW5hcnkgZGlnaXRzLgorICBBU1NFUlQoQmlnbnVtOjprTWF4U2lnbmlmaWNhbnRCaXRzID49IDMyNCo0KTsKKyAgSW5pdGlhbFNjYWxlZFN0YXJ0VmFsdWVzKHNpZ25pZmljYW5kLCBleHBvbmVudCwgbG93ZXJfYm91bmRhcnlfaXNfY2xvc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkX3Bvd2VyLCBuZWVkX2JvdW5kYXJ5X2RlbHRhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1lcmF0b3IsICZkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9taW51cywgJmRlbHRhX3BsdXMpOworICAvLyBXZSBub3cgaGF2ZSB2ID0gKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKSAqIDEwXmVzdGltYXRlZF9wb3dlci4KKyAgRml4dXBNdWx0aXBseTEwKGVzdGltYXRlZF9wb3dlciwgaXNfZXZlbiwgZGVjaW1hbF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICZudW1lcmF0b3IsICZkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICZkZWx0YV9taW51cywgJmRlbHRhX3BsdXMpOworICAvLyBXZSBub3cgaGF2ZSB2ID0gKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKSAqIDEwXihkZWNpbWFsX3BvaW50LTEpLCBhbmQKKyAgLy8gIDEgPD0gKG51bWVyYXRvciArIGRlbHRhX3BsdXMpIC8gZGVub21pbmF0b3IgPCAxMAorICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEJJR05VTV9EVE9BX1NIT1JURVNUOgorICAgIGNhc2UgQklHTlVNX0RUT0FfU0hPUlRFU1RfU0lOR0xFOgorICAgICAgR2VuZXJhdGVTaG9ydGVzdERpZ2l0cygmbnVtZXJhdG9yLCAmZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9taW51cywgJmRlbHRhX3BsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V2ZW4sIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklHTlVNX0RUT0FfRklYRUQ6CisgICAgICBCaWdudW1Ub0ZpeGVkKHJlcXVlc3RlZF9kaWdpdHMsIGRlY2ltYWxfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICZudW1lcmF0b3IsICZkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCSUdOVU1fRFRPQV9QUkVDSVNJT046CisgICAgICBHZW5lcmF0ZUNvdW50ZWREaWdpdHMocmVxdWVzdGVkX2RpZ2l0cywgZGVjaW1hbF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtZXJhdG9yLCAmZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIFVOUkVBQ0hBQkxFKCk7CisgIH0KKyAgYnVmZmVyWypsZW5ndGhdID0gJ1wwJzsKK30KKworCisvLyBUaGUgcHJvY2VkdXJlIHN0YXJ0cyBnZW5lcmF0aW5nIGRpZ2l0cyBmcm9tIHRoZSBsZWZ0IHRvIHRoZSByaWdodCBhbmQgc3RvcHMKKy8vIHdoZW4gdGhlIGdlbmVyYXRlZCBkaWdpdHMgeWllbGQgdGhlIHNob3J0ZXN0IGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2Ygdi4gQQorLy8gZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB2IGlzIGEgbnVtYmVyIGx5aW5nIGNsb3NlciB0byB2IHRoYW4gdG8gYW55IG90aGVyCisvLyBkb3VibGUsIHNvIGl0IGNvbnZlcnRzIHRvIHYgd2hlbiByZWFkLgorLy8KKy8vIFRoaXMgaXMgdHJ1ZSBpZiBkLCB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiwgaXMgYmV0d2VlbiBtLSBhbmQgbSssIHRoZQorLy8gdXBwZXIgYW5kIGxvd2VyIGJvdW5kYXJpZXMuIGQgbXVzdCBiZSBzdHJpY3RseSBiZXR3ZWVuIHRoZW0gaWYgIWlzX2V2ZW4uCisvLyAgICAgICAgICAgbS0gOj0gKG51bWVyYXRvciAtIGRlbHRhX21pbnVzKSAvIGRlbm9taW5hdG9yCisvLyAgICAgICAgICAgbSsgOj0gKG51bWVyYXRvciArIGRlbHRhX3BsdXMpIC8gZGVub21pbmF0b3IKKy8vCisvLyBQcmVjb25kaXRpb246IDAgPD0gKG51bWVyYXRvcitkZWx0YV9wbHVzKSAvIGRlbm9taW5hdG9yIDwgMTAuCisvLyAgIElmIDEgPD0gKG51bWVyYXRvcitkZWx0YV9wbHVzKSAvIGRlbm9taW5hdG9yIDwgMTAgdGhlbiBubyBsZWFkaW5nIDAgZGlnaXQKKy8vICAgd2lsbCBiZSBwcm9kdWNlZC4gVGhpcyBzaG91bGQgYmUgdGhlIHN0YW5kYXJkIHByZWNvbmRpdGlvbi4KK3N0YXRpYyB2b2lkIEdlbmVyYXRlU2hvcnRlc3REaWdpdHMoQmlnbnVtKiBudW1lcmF0b3IsIEJpZ251bSogZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogZGVsdGFfbWludXMsIEJpZ251bSogZGVsdGFfcGx1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19ldmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8Y2hhcj4gYnVmZmVyLCBpbnQqIGxlbmd0aCkgeworICAvLyBTbWFsbCBvcHRpbWl6YXRpb246IGlmIGRlbHRhX21pbnVzIGFuZCBkZWx0YV9wbHVzIGFyZSB0aGUgc2FtZSBqdXN0IHJldXNlCisgIC8vIG9uZSBvZiB0aGUgdHdvIGJpZ251bXMuCisgIGlmIChCaWdudW06OkVxdWFsKCpkZWx0YV9taW51cywgKmRlbHRhX3BsdXMpKSB7CisgICAgZGVsdGFfcGx1cyA9IGRlbHRhX21pbnVzOworICB9CisgICpsZW5ndGggPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIHVpbnQxNl90IGRpZ2l0OworICAgIGRpZ2l0ID0gbnVtZXJhdG9yLT5EaXZpZGVNb2R1bG9JbnRCaWdudW0oKmRlbm9taW5hdG9yKTsKKyAgICBBU1NFUlQoZGlnaXQgPD0gOSk7ICAvLyBkaWdpdCBpcyBhIHVpbnQxNl90IGFuZCB0aGVyZWZvcmUgYWx3YXlzIHBvc2l0aXZlLgorICAgIC8vIGRpZ2l0ID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3IgKGludGVnZXIgZGl2aXNpb24pLgorICAgIC8vIG51bWVyYXRvciA9IG51bWVyYXRvciAlIGRlbm9taW5hdG9yLgorICAgIGJ1ZmZlclsoKmxlbmd0aCkrK10gPSBkaWdpdCArICcwJzsKKworICAgIC8vIENhbiB3ZSBzdG9wIGFscmVhZHk/CisgICAgLy8gSWYgdGhlIHJlbWFpbmRlciBvZiB0aGUgZGl2aXNpb24gaXMgbGVzcyB0aGFuIHRoZSBkaXN0YW5jZSB0byB0aGUgbG93ZXIKKyAgICAvLyBib3VuZGFyeSB3ZSBjYW4gc3RvcC4gSW4gdGhpcyBjYXNlIHdlIHNpbXBseSByb3VuZCBkb3duIChkaXNjYXJkaW5nIHRoZQorICAgIC8vIHJlbWFpbmRlcikuCisgICAgLy8gU2ltaWxhcmx5IHdlIHRlc3QgaWYgd2UgY2FuIHJvdW5kIHVwICh1c2luZyB0aGUgdXBwZXIgYm91bmRhcnkpLgorICAgIGJvb2wgaW5fZGVsdGFfcm9vbV9taW51czsKKyAgICBib29sIGluX2RlbHRhX3Jvb21fcGx1czsKKyAgICBpZiAoaXNfZXZlbikgeworICAgICAgaW5fZGVsdGFfcm9vbV9taW51cyA9IEJpZ251bTo6TGVzc0VxdWFsKCpudW1lcmF0b3IsICpkZWx0YV9taW51cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluX2RlbHRhX3Jvb21fbWludXMgPSBCaWdudW06Okxlc3MoKm51bWVyYXRvciwgKmRlbHRhX21pbnVzKTsKKyAgICB9CisgICAgaWYgKGlzX2V2ZW4pIHsKKyAgICAgIGluX2RlbHRhX3Jvb21fcGx1cyA9CisgICAgICAgICAgQmlnbnVtOjpQbHVzQ29tcGFyZSgqbnVtZXJhdG9yLCAqZGVsdGFfcGx1cywgKmRlbm9taW5hdG9yKSA+PSAwOworICAgIH0gZWxzZSB7CisgICAgICBpbl9kZWx0YV9yb29tX3BsdXMgPQorICAgICAgICAgIEJpZ251bTo6UGx1c0NvbXBhcmUoKm51bWVyYXRvciwgKmRlbHRhX3BsdXMsICpkZW5vbWluYXRvcikgPiAwOworICAgIH0KKyAgICBpZiAoIWluX2RlbHRhX3Jvb21fbWludXMgJiYgIWluX2RlbHRhX3Jvb21fcGx1cykgeworICAgICAgLy8gUHJlcGFyZSBmb3IgbmV4dCBpdGVyYXRpb24uCisgICAgICBudW1lcmF0b3ItPlRpbWVzMTAoKTsKKyAgICAgIGRlbHRhX21pbnVzLT5UaW1lczEwKCk7CisgICAgICAvLyBXZSBvcHRpbWl6ZWQgZGVsdGFfcGx1cyB0byBiZSBlcXVhbCB0byBkZWx0YV9taW51cyAoaWYgdGhleSBzaGFyZSB0aGUKKyAgICAgIC8vIHNhbWUgdmFsdWUpLiBTbyBkb24ndCBtdWx0aXBseSBkZWx0YV9wbHVzIGlmIHRoZXkgcG9pbnQgdG8gdGhlIHNhbWUKKyAgICAgIC8vIG9iamVjdC4KKyAgICAgIGlmIChkZWx0YV9taW51cyAhPSBkZWx0YV9wbHVzKSB7CisgICAgICAgIGRlbHRhX3BsdXMtPlRpbWVzMTAoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGluX2RlbHRhX3Jvb21fbWludXMgJiYgaW5fZGVsdGFfcm9vbV9wbHVzKSB7CisgICAgICAvLyBMZXQncyBzZWUgaWYgMipudW1lcmF0b3IgPCBkZW5vbWluYXRvci4KKyAgICAgIC8vIElmIHllcywgdGhlbiB0aGUgbmV4dCBkaWdpdCB3b3VsZCBiZSA8IDUgYW5kIHdlIGNhbiByb3VuZCBkb3duLgorICAgICAgaW50IGNvbXBhcmUgPSBCaWdudW06OlBsdXNDb21wYXJlKCpudW1lcmF0b3IsICpudW1lcmF0b3IsICpkZW5vbWluYXRvcik7CisgICAgICBpZiAoY29tcGFyZSA8IDApIHsKKyAgICAgICAgLy8gUmVtYWluaW5nIGRpZ2l0cyBhcmUgbGVzcyB0aGFuIC41LiAtPiBSb3VuZCBkb3duICg9PSBkbyBub3RoaW5nKS4KKyAgICAgIH0gZWxzZSBpZiAoY29tcGFyZSA+IDApIHsKKyAgICAgICAgLy8gUmVtYWluaW5nIGRpZ2l0cyBhcmUgbW9yZSB0aGFuIC41IG9mIGRlbm9taW5hdG9yLiAtPiBSb3VuZCB1cC4KKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBsYXN0IGRpZ2l0IGNvdWxkIG5vdCBiZSBhICc5JyBhcyBvdGhlcndpc2UgdGhlIHdob2xlCisgICAgICAgIC8vIGxvb3Agd291bGQgaGF2ZSBzdG9wcGVkIGVhcmxpZXIuCisgICAgICAgIC8vIFdlIHN0aWxsIGhhdmUgYW4gYXNzZXJ0IGhlcmUgaW4gY2FzZSB0aGUgcHJlY29uZGl0aW9ucyB3ZXJlIG5vdAorICAgICAgICAvLyBzYXRpc2ZpZWQuCisgICAgICAgIEFTU0VSVChidWZmZXJbKCpsZW5ndGgpIC0gMV0gIT0gJzknKTsKKyAgICAgICAgYnVmZmVyWygqbGVuZ3RoKSAtIDFdKys7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBIYWxmd2F5IGNhc2UuCisgICAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBuZWVkIGEgd2F5IHRvIHNvbHZlIGhhbGYtd2F5IGNhc2VzLgorICAgICAgICAvLyAgIEZvciBub3cgbGV0J3Mgcm91bmQgdG93YXJkcyBldmVuIChzaW5jZSB0aGlzIGlzIHdoYXQgR2F5IHNlZW1zIHRvCisgICAgICAgIC8vICAgZG8pLgorCisgICAgICAgIGlmICgoYnVmZmVyWygqbGVuZ3RoKSAtIDFdIC0gJzAnKSAlIDIgPT0gMCkgeworICAgICAgICAgIC8vIFJvdW5kIGRvd24gPT4gRG8gbm90aGluZy4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBBU1NFUlQoYnVmZmVyWygqbGVuZ3RoKSAtIDFdICE9ICc5Jyk7CisgICAgICAgICAgYnVmZmVyWygqbGVuZ3RoKSAtIDFdKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGluX2RlbHRhX3Jvb21fbWludXMpIHsKKyAgICAgIC8vIFJvdW5kIGRvd24gKD09IGRvIG5vdGhpbmcpLgorICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7ICAvLyBpbl9kZWx0YV9yb29tX3BsdXMKKyAgICAgIC8vIFJvdW5kIHVwLgorICAgICAgLy8gTm90ZSBhZ2FpbiB0aGF0IHRoZSBsYXN0IGRpZ2l0IGNvdWxkIG5vdCBiZSAnOScgc2luY2UgdGhpcyB3b3VsZCBoYXZlCisgICAgICAvLyBzdG9wcGVkIHRoZSBsb29wIGVhcmxpZXIuCisgICAgICAvLyBXZSBzdGlsbCBoYXZlIGFuIEFTU0VSVCBoZXJlLCBpbiBjYXNlIHRoZSBwcmVjb25kaXRpb25zIHdlcmUgbm90CisgICAgICAvLyBzYXRpc2ZpZWQuCisgICAgICBBU1NFUlQoYnVmZmVyWygqbGVuZ3RoKSAtMV0gIT0gJzknKTsKKyAgICAgIGJ1ZmZlclsoKmxlbmd0aCkgLSAxXSsrOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCisKKy8vIExldCB2ID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3IgPCAxMC4KKy8vIFRoZW4gd2UgZ2VuZXJhdGUgJ2NvdW50JyBkaWdpdHMgb2YgZCA9IHgueHh4eHguLi4gKHdpdGhvdXQgdGhlIGRlY2ltYWwgcG9pbnQpCisvLyBmcm9tIGxlZnQgdG8gcmlnaHQuIE9uY2UgJ2NvdW50JyBkaWdpdHMgaGF2ZSBiZWVuIHByb2R1Y2VkIHdlIGRlY2lkZSB3ZXRoZXIKKy8vIHRvIHJvdW5kIHVwIG9yIGRvd24uIFJlbWFpbmRlcnMgb2YgZXhhY3RseSAuNSByb3VuZCB1cHdhcmRzLiBOdW1iZXJzIHN1Y2gKKy8vIGFzIDkuOTk5OTk5IHByb3BhZ2F0ZSBhIGNhcnJ5IGFsbCB0aGUgd2F5LCBhbmQgY2hhbmdlIHRoZQorLy8gZXhwb25lbnQgKGRlY2ltYWxfcG9pbnQpLCB3aGVuIHJvdW5kaW5nIHVwd2FyZHMuCitzdGF0aWMgdm9pZCBHZW5lcmF0ZUNvdW50ZWREaWdpdHMoaW50IGNvdW50LCBpbnQqIGRlY2ltYWxfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnbnVtKiBudW1lcmF0b3IsIEJpZ251bSogZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+KGJ1ZmZlciksIGludCogbGVuZ3RoKSB7CisgIEFTU0VSVChjb3VudCA+PSAwKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudCAtIDE7ICsraSkgeworICAgIHVpbnQxNl90IGRpZ2l0OworICAgIGRpZ2l0ID0gbnVtZXJhdG9yLT5EaXZpZGVNb2R1bG9JbnRCaWdudW0oKmRlbm9taW5hdG9yKTsKKyAgICBBU1NFUlQoZGlnaXQgPD0gOSk7ICAvLyBkaWdpdCBpcyBhIHVpbnQxNl90IGFuZCB0aGVyZWZvcmUgYWx3YXlzIHBvc2l0aXZlLgorICAgIC8vIGRpZ2l0ID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3IgKGludGVnZXIgZGl2aXNpb24pLgorICAgIC8vIG51bWVyYXRvciA9IG51bWVyYXRvciAlIGRlbm9taW5hdG9yLgorICAgIGJ1ZmZlcltpXSA9IGRpZ2l0ICsgJzAnOworICAgIC8vIFByZXBhcmUgZm9yIG5leHQgaXRlcmF0aW9uLgorICAgIG51bWVyYXRvci0+VGltZXMxMCgpOworICB9CisgIC8vIEdlbmVyYXRlIHRoZSBsYXN0IGRpZ2l0LgorICB1aW50MTZfdCBkaWdpdDsKKyAgZGlnaXQgPSBudW1lcmF0b3ItPkRpdmlkZU1vZHVsb0ludEJpZ251bSgqZGVub21pbmF0b3IpOworICBpZiAoQmlnbnVtOjpQbHVzQ29tcGFyZSgqbnVtZXJhdG9yLCAqbnVtZXJhdG9yLCAqZGVub21pbmF0b3IpID49IDApIHsKKyAgICBkaWdpdCsrOworICB9CisgIGJ1ZmZlcltjb3VudCAtIDFdID0gZGlnaXQgKyAnMCc7CisgIC8vIENvcnJlY3QgYmFkIGRpZ2l0cyAoaW4gY2FzZSB3ZSBoYWQgYSBzZXF1ZW5jZSBvZiAnOSdzKS4gUHJvcGFnYXRlIHRoZQorICAvLyBjYXJyeSB1bnRpbCB3ZSBoYXQgYSBub24tJzknIG9yIHRpbCB3ZSByZWFjaCB0aGUgZmlyc3QgZGlnaXQuCisgIGZvciAoaW50IGkgPSBjb3VudCAtIDE7IGkgPiAwOyAtLWkpIHsKKyAgICBpZiAoYnVmZmVyW2ldICE9ICcwJyArIDEwKSBicmVhazsKKyAgICBidWZmZXJbaV0gPSAnMCc7CisgICAgYnVmZmVyW2kgLSAxXSsrOworICB9CisgIGlmIChidWZmZXJbMF0gPT0gJzAnICsgMTApIHsKKyAgICAvLyBQcm9wYWdhdGUgYSBjYXJyeSBwYXN0IHRoZSB0b3AgcGxhY2UuCisgICAgYnVmZmVyWzBdID0gJzEnOworICAgICgqZGVjaW1hbF9wb2ludCkrKzsKKyAgfQorICAqbGVuZ3RoID0gY291bnQ7Cit9CisKKworLy8gR2VuZXJhdGVzICdyZXF1ZXN0ZWRfZGlnaXRzJyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4gSXQgbWlnaHQgb21pdAorLy8gdHJhaWxpbmcgJzAncy4gSWYgdGhlIGlucHV0IG51bWJlciBpcyB0b28gc21hbGwgdGhlbiBubyBkaWdpdHMgYXQgYWxsIGFyZQorLy8gZ2VuZXJhdGVkIChleC46IDIgZml4ZWQgZGlnaXRzIGZvciAwLjAwMDAxKS4KKy8vCisvLyBJbnB1dCB2ZXJpZmllczogIDEgPD0gKG51bWVyYXRvciArIGRlbHRhKSAvIGRlbm9taW5hdG9yIDwgMTAuCitzdGF0aWMgdm9pZCBCaWdudW1Ub0ZpeGVkKGludCByZXF1ZXN0ZWRfZGlnaXRzLCBpbnQqIGRlY2ltYWxfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogbnVtZXJhdG9yLCBCaWdudW0qIGRlbm9taW5hdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8Y2hhcj4oYnVmZmVyKSwgaW50KiBsZW5ndGgpIHsKKyAgLy8gTm90ZSB0aGF0IHdlIGhhdmUgdG8gbG9vayBhdCBtb3JlIHRoYW4ganVzdCB0aGUgcmVxdWVzdGVkX2RpZ2l0cywgc2luY2UKKyAgLy8gYSBudW1iZXIgY291bGQgYmUgcm91bmRlZCB1cC4gRXhhbXBsZTogdj0wLjUgd2l0aCByZXF1ZXN0ZWRfZGlnaXRzPTAuCisgIC8vIEV2ZW4gdGhvdWdoIHRoZSBwb3dlciBvZiB2IGVxdWFscyAwIHdlIGNhbid0IGp1c3Qgc3RvcCBoZXJlLgorICBpZiAoLSgqZGVjaW1hbF9wb2ludCkgPiByZXF1ZXN0ZWRfZGlnaXRzKSB7CisgICAgLy8gVGhlIG51bWJlciBpcyBkZWZpbml0aXZlbHkgdG9vIHNtYWxsLgorICAgIC8vIEV4OiAwLjAwMSB3aXRoIHJlcXVlc3RlZF9kaWdpdHMgPT0gMS4KKyAgICAvLyBTZXQgZGVjaW1hbC1wb2ludCB0byAtcmVxdWVzdGVkX2RpZ2l0cy4gVGhpcyBpcyB3aGF0IEdheSBkb2VzLgorICAgIC8vIE5vdGUgdGhhdCBpdCBzaG91bGQgbm90IGhhdmUgYW55IGVmZmVjdCBhbnl3YXlzIHNpbmNlIHRoZSBzdHJpbmcgaXMKKyAgICAvLyBlbXB0eS4KKyAgICAqZGVjaW1hbF9wb2ludCA9IC1yZXF1ZXN0ZWRfZGlnaXRzOworICAgICpsZW5ndGggPSAwOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICgtKCpkZWNpbWFsX3BvaW50KSA9PSByZXF1ZXN0ZWRfZGlnaXRzKSB7CisgICAgLy8gV2Ugb25seSBuZWVkIHRvIHZlcmlmeSBpZiB0aGUgbnVtYmVyIHJvdW5kcyBkb3duIG9yIHVwLgorICAgIC8vIEV4OiAwLjA0IGFuZCAwLjA2IHdpdGggcmVxdWVzdGVkX2RpZ2l0cyA9PSAxLgorICAgIEFTU0VSVCgqZGVjaW1hbF9wb2ludCA9PSAtcmVxdWVzdGVkX2RpZ2l0cyk7CisgICAgLy8gSW5pdGlhbGx5IHRoZSBmcmFjdGlvbiBsaWVzIGluIHJhbmdlICgxLCAxMF0uIE11bHRpcGx5IHRoZSBkZW5vbWluYXRvcgorICAgIC8vIGJ5IDEwIHNvIHRoYXQgd2UgY2FuIGNvbXBhcmUgbW9yZSBlYXNpbHkuCisgICAgZGVub21pbmF0b3ItPlRpbWVzMTAoKTsKKyAgICBpZiAoQmlnbnVtOjpQbHVzQ29tcGFyZSgqbnVtZXJhdG9yLCAqbnVtZXJhdG9yLCAqZGVub21pbmF0b3IpID49IDApIHsKKyAgICAgIC8vIElmIHRoZSBmcmFjdGlvbiBpcyA+PSAwLjUgdGhlbiB3ZSBoYXZlIHRvIGluY2x1ZGUgdGhlIHJvdW5kZWQKKyAgICAgIC8vIGRpZ2l0LgorICAgICAgYnVmZmVyWzBdID0gJzEnOworICAgICAgKmxlbmd0aCA9IDE7CisgICAgICAoKmRlY2ltYWxfcG9pbnQpKys7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYXVnaHQgbW9zdCBvZiBzaW1pbGFyIGNhc2VzIGVhcmxpZXIuCisgICAgICAqbGVuZ3RoID0gMDsKKyAgICB9CisgICAgcmV0dXJuOworICB9IGVsc2UgeworICAgIC8vIFRoZSByZXF1ZXN0ZWQgZGlnaXRzIGNvcnJlc3BvbmQgdG8gdGhlIGRpZ2l0cyBhZnRlciB0aGUgcG9pbnQuCisgICAgLy8gVGhlIHZhcmlhYmxlICduZWVkZWRfZGlnaXRzJyBpbmNsdWRlcyB0aGUgZGlnaXRzIGJlZm9yZSB0aGUgcG9pbnQuCisgICAgaW50IG5lZWRlZF9kaWdpdHMgPSAoKmRlY2ltYWxfcG9pbnQpICsgcmVxdWVzdGVkX2RpZ2l0czsKKyAgICBHZW5lcmF0ZUNvdW50ZWREaWdpdHMobmVlZGVkX2RpZ2l0cywgZGVjaW1hbF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJhdG9yLCBkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW5ndGgpOworICB9Cit9CisKKworLy8gUmV0dXJucyBhbiBlc3RpbWF0aW9uIG9mIGsgc3VjaCB0aGF0IDEwXihrLTEpIDw9IHYgPCAxMF5rIHdoZXJlCisvLyB2ID0gZiAqIDJeZXhwb25lbnQgYW5kIDJeNTIgPD0gZiA8IDJeNTMuCisvLyB2IGlzIGhlbmNlIGEgbm9ybWFsaXplZCBkb3VibGUgd2l0aCB0aGUgZ2l2ZW4gZXhwb25lbnQuIFRoZSBvdXRwdXQgaXMgYW4KKy8vIGFwcHJveGltYXRpb24gZm9yIHRoZSBleHBvbmVudCBvZiB0aGUgZGVjaW1hbCBhcHByb2ltYXRpb24gLmRpZ2l0cyAqIDEwXmsuCisvLworLy8gVGhlIHJlc3VsdCBtaWdodCB1bmRlcnNob290IGJ5IDEgaW4gd2hpY2ggY2FzZSAxMF5rIDw9IHYgPCAxMF5rKzEuCisvLyBOb3RlOiB0aGlzIHByb3BlcnR5IGhvbGRzIGZvciB2J3MgdXBwZXIgYm91bmRhcnkgbSsgdG9vLgorLy8gICAgMTBeayA8PSBtKyA8IDEwXmsrMS4KKy8vICAgKHNlZSBleHBsYW5hdGlvbiBiZWxvdykuCisvLworLy8gRXhhbXBsZXM6CisvLyAgRXN0aW1hdGVQb3dlcigwKSAgID0+IDE2CisvLyAgRXN0aW1hdGVQb3dlcigtNTIpID0+IDAKKy8vCisvLyBOb3RlOiBlID49IDAgPT4gRXN0aW1hdGVkUG93ZXIoZSkgPiAwLiBObyBzaW1pbGFyIGNsYWltIGNhbiBiZSBtYWRlIGZvciBlPDAuCitzdGF0aWMgaW50IEVzdGltYXRlUG93ZXIoaW50IGV4cG9uZW50KSB7CisgIC8vIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIGxvZzEwIG9mIHYgd2hlcmUgdiA9IGYqMl5lICh3aXRoIGUgPT0gZXhwb25lbnQpLgorICAvLyBOb3RlIHRoYXQgMTBeZmxvb3IobG9nMTAodikpIDw9IHYsIGJ1dCB2IDw9IDEwXmNlaWwobG9nMTAodikpLgorICAvLyBOb3RlIHRoYXQgZiBpcyBib3VuZGVkIGJ5IGl0cyBjb250YWluZXIgc2l6ZS4gTGV0IHAgPSA1MyAodGhlIGRvdWJsZSdzCisgIC8vIHNpZ25pZmljYW5kIHNpemUpLiBUaGVuIDJeKHAtMSkgPD0gZiA8IDJecC4KKyAgLy8KKyAgLy8gR2l2ZW4gdGhhdCBsb2cxMCh2KSA9PSBsb2cyKHYpL2xvZzIoMTApIGFuZCBlKyhsZW4oZiktMSkgaXMgcXVpdGUgY2xvc2UKKyAgLy8gdG8gbG9nMih2KSB0aGUgZnVuY3Rpb24gaXMgc2ltcGxpZmllZCB0byAoZSsobGVuKGYpLTEpL2xvZzIoMTApKS4KKyAgLy8gVGhlIGNvbXB1dGVkIG51bWJlciB1bmRlcnNob290cyBieSBsZXNzIHRoYW4gMC42MzEgKHdoZW4gd2UgY29tcHV0ZSBsb2czCisgIC8vIGFuZCBub3QgbG9nMTApLgorICAvLworICAvLyBPcHRpbWl6YXRpb246IHNpbmNlIHdlIG9ubHkgbmVlZCBhbiBhcHByb3hpbWF0ZWQgcmVzdWx0IHRoaXMgY29tcHV0YXRpb24KKyAgLy8gY2FuIGJlIHBlcmZvcm1lZCBvbiA2NCBiaXQgaW50ZWdlcnMuIE9uIHg4Ni94NjQgYXJjaGl0ZWN0dXJlIHRoZSBzcGVlZHVwIGlzCisgIC8vIG5vdCByZWFsbHkgbWVhc3VyYWJsZSwgdGhvdWdoLgorICAvLworICAvLyBTaW5jZSB3ZSB3YW50IHRvIGF2b2lkIG92ZXJzaG9vdGluZyB3ZSBkZWNyZW1lbnQgYnkgMWUxMCBzbyB0aGF0CisgIC8vIGZsb2F0aW5nLXBvaW50IGltcHJlY2lzaW9ucyBkb24ndCBhZmZlY3QgdXMuCisgIC8vCisgIC8vIEV4cGxhbmF0aW9uIGZvciB2J3MgYm91bmRhcnkgbSs6IHRoZSBjb21wdXRhdGlvbiB0YWtlcyBhZHZhbnRhZ2Ugb2YKKyAgLy8gdGhlIGZhY3QgdGhhdCAyXihwLTEpIDw9IGYgPCAyXnAuIEJvdW5kYXJpZXMgc3RpbGwgc2F0aXNmeSB0aGlzIHJlcXVpcmVtZW50CisgIC8vIChldmVuIGZvciBkZW5vcm1hbHMgd2hlcmUgdGhlIGRlbHRhIGNhbiBiZSBtdWNoIG1vcmUgaW1wb3J0YW50KS4KKworICBjb25zdCBkb3VibGUgazFMb2cxMCA9IDAuMzAxMDI5OTk1NjYzOTgxMTQ7ICAvLyAxL2xnKDEwKQorCisgIC8vIEZvciBkb3VibGVzIGxlbihmKSA9PSA1MyAoZG9uJ3QgZm9yZ2V0IHRoZSBoaWRkZW4gYml0KS4KKyAgY29uc3QgaW50IGtTaWduaWZpY2FuZFNpemUgPSBEb3VibGU6OmtTaWduaWZpY2FuZFNpemU7CisgIGRvdWJsZSBlc3RpbWF0ZSA9IGNlaWwoKGV4cG9uZW50ICsga1NpZ25pZmljYW5kU2l6ZSAtIDEpICogazFMb2cxMCAtIDFlLTEwKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZXN0aW1hdGUpOworfQorCisKKy8vIFNlZSBjb21tZW50cyBmb3IgSW5pdGlhbFNjYWxlZFN0YXJ0VmFsdWVzLgorc3RhdGljIHZvaWQgSW5pdGlhbFNjYWxlZFN0YXJ0VmFsdWVzUG9zaXRpdmVFeHBvbmVudCgKKyAgICB1aW50NjRfdCBzaWduaWZpY2FuZCwgaW50IGV4cG9uZW50LAorICAgIGludCBlc3RpbWF0ZWRfcG93ZXIsIGJvb2wgbmVlZF9ib3VuZGFyeV9kZWx0YXMsCisgICAgQmlnbnVtKiBudW1lcmF0b3IsIEJpZ251bSogZGVub21pbmF0b3IsCisgICAgQmlnbnVtKiBkZWx0YV9taW51cywgQmlnbnVtKiBkZWx0YV9wbHVzKSB7CisgIC8vIEEgcG9zaXRpdmUgZXhwb25lbnQgaW1wbGllcyBhIHBvc2l0aXZlIHBvd2VyLgorICBBU1NFUlQoZXN0aW1hdGVkX3Bvd2VyID49IDApOworICAvLyBTaW5jZSB0aGUgZXN0aW1hdGVkX3Bvd2VyIGlzIHBvc2l0aXZlIHdlIHNpbXBseSBtdWx0aXBseSB0aGUgZGVub21pbmF0b3IKKyAgLy8gYnkgMTBeZXN0aW1hdGVkX3Bvd2VyLgorCisgIC8vIG51bWVyYXRvciA9IHYuCisgIG51bWVyYXRvci0+QXNzaWduVUludDY0KHNpZ25pZmljYW5kKTsKKyAgbnVtZXJhdG9yLT5TaGlmdExlZnQoZXhwb25lbnQpOworICAvLyBkZW5vbWluYXRvciA9IDEwXmVzdGltYXRlZF9wb3dlci4KKyAgZGVub21pbmF0b3ItPkFzc2lnblBvd2VyVUludDE2KDEwLCBlc3RpbWF0ZWRfcG93ZXIpOworCisgIGlmIChuZWVkX2JvdW5kYXJ5X2RlbHRhcykgeworICAgIC8vIEludHJvZHVjZSBhIGNvbW1vbiBkZW5vbWluYXRvciBzbyB0aGF0IHRoZSBkZWx0YXMgdG8gdGhlIGJvdW5kYXJpZXMgYXJlCisgICAgLy8gaW50ZWdlcnMuCisgICAgZGVub21pbmF0b3ItPlNoaWZ0TGVmdCgxKTsKKyAgICBudW1lcmF0b3ItPlNoaWZ0TGVmdCgxKTsKKyAgICAvLyBMZXQgdiA9IGYgKiAyXmUsIHRoZW4gbSsgLSB2ID0gMS8yICogMl5lOyBXaXRoIHRoZSBjb21tb24KKyAgICAvLyBkZW5vbWluYXRvciAob2YgMikgZGVsdGFfcGx1cyBlcXVhbHMgMl5lLgorICAgIGRlbHRhX3BsdXMtPkFzc2lnblVJbnQxNigxKTsKKyAgICBkZWx0YV9wbHVzLT5TaGlmdExlZnQoZXhwb25lbnQpOworICAgIC8vIFNhbWUgZm9yIGRlbHRhX21pbnVzLiBUaGUgYWRqdXN0bWVudHMgaWYgZiA9PSAyXnAtMSBhcmUgZG9uZSBsYXRlci4KKyAgICBkZWx0YV9taW51cy0+QXNzaWduVUludDE2KDEpOworICAgIGRlbHRhX21pbnVzLT5TaGlmdExlZnQoZXhwb25lbnQpOworICB9Cit9CisKKworLy8gU2VlIGNvbW1lbnRzIGZvciBJbml0aWFsU2NhbGVkU3RhcnRWYWx1ZXMKK3N0YXRpYyB2b2lkIEluaXRpYWxTY2FsZWRTdGFydFZhbHVlc05lZ2F0aXZlRXhwb25lbnRQb3NpdGl2ZVBvd2VyKAorICAgIHVpbnQ2NF90IHNpZ25pZmljYW5kLCBpbnQgZXhwb25lbnQsCisgICAgaW50IGVzdGltYXRlZF9wb3dlciwgYm9vbCBuZWVkX2JvdW5kYXJ5X2RlbHRhcywKKyAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKKyAgICBCaWdudW0qIGRlbHRhX21pbnVzLCBCaWdudW0qIGRlbHRhX3BsdXMpIHsKKyAgLy8gdiA9IGYgKiAyXmUgd2l0aCBlIDwgMCwgYW5kIHdpdGggZXN0aW1hdGVkX3Bvd2VyID49IDAuCisgIC8vIFRoaXMgbWVhbnMgdGhhdCBlIGlzIGNsb3NlIHRvIDAgKGhhdmUgYSBsb29rIGF0IGhvdyBlc3RpbWF0ZWRfcG93ZXIgaXMKKyAgLy8gY29tcHV0ZWQpLgorCisgIC8vIG51bWVyYXRvciA9IHNpZ25pZmljYW5kCisgIC8vICBzaW5jZSB2ID0gc2lnbmlmaWNhbmQgKiAyXmV4cG9uZW50IHRoaXMgaXMgZXF1aXZhbGVudCB0bworICAvLyAgbnVtZXJhdG9yID0gdiAqIC8gMl4tZXhwb25lbnQKKyAgbnVtZXJhdG9yLT5Bc3NpZ25VSW50NjQoc2lnbmlmaWNhbmQpOworICAvLyBkZW5vbWluYXRvciA9IDEwXmVzdGltYXRlZF9wb3dlciAqIDJeLWV4cG9uZW50ICh3aXRoIGV4cG9uZW50IDwgMCkKKyAgZGVub21pbmF0b3ItPkFzc2lnblBvd2VyVUludDE2KDEwLCBlc3RpbWF0ZWRfcG93ZXIpOworICBkZW5vbWluYXRvci0+U2hpZnRMZWZ0KC1leHBvbmVudCk7CisKKyAgaWYgKG5lZWRfYm91bmRhcnlfZGVsdGFzKSB7CisgICAgLy8gSW50cm9kdWNlIGEgY29tbW9uIGRlbm9taW5hdG9yIHNvIHRoYXQgdGhlIGRlbHRhcyB0byB0aGUgYm91bmRhcmllcyBhcmUKKyAgICAvLyBpbnRlZ2Vycy4KKyAgICBkZW5vbWluYXRvci0+U2hpZnRMZWZ0KDEpOworICAgIG51bWVyYXRvci0+U2hpZnRMZWZ0KDEpOworICAgIC8vIExldCB2ID0gZiAqIDJeZSwgdGhlbiBtKyAtIHYgPSAxLzIgKiAyXmU7IFdpdGggdGhlIGNvbW1vbgorICAgIC8vIGRlbm9taW5hdG9yIChvZiAyKSBkZWx0YV9wbHVzIGVxdWFscyAyXmUuCisgICAgLy8gR2l2ZW4gdGhhdCB0aGUgZGVub21pbmF0b3IgYWxyZWFkeSBpbmNsdWRlcyB2J3MgZXhwb25lbnQgdGhlIGRpc3RhbmNlCisgICAgLy8gdG8gdGhlIGJvdW5kYXJpZXMgaXMgc2ltcGx5IDEuCisgICAgZGVsdGFfcGx1cy0+QXNzaWduVUludDE2KDEpOworICAgIC8vIFNhbWUgZm9yIGRlbHRhX21pbnVzLiBUaGUgYWRqdXN0bWVudHMgaWYgZiA9PSAyXnAtMSBhcmUgZG9uZSBsYXRlci4KKyAgICBkZWx0YV9taW51cy0+QXNzaWduVUludDE2KDEpOworICB9Cit9CisKKworLy8gU2VlIGNvbW1lbnRzIGZvciBJbml0aWFsU2NhbGVkU3RhcnRWYWx1ZXMKK3N0YXRpYyB2b2lkIEluaXRpYWxTY2FsZWRTdGFydFZhbHVlc05lZ2F0aXZlRXhwb25lbnROZWdhdGl2ZVBvd2VyKAorICAgIHVpbnQ2NF90IHNpZ25pZmljYW5kLCBpbnQgZXhwb25lbnQsCisgICAgaW50IGVzdGltYXRlZF9wb3dlciwgYm9vbCBuZWVkX2JvdW5kYXJ5X2RlbHRhcywKKyAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKKyAgICBCaWdudW0qIGRlbHRhX21pbnVzLCBCaWdudW0qIGRlbHRhX3BsdXMpIHsKKyAgLy8gSW5zdGVhZCBvZiBtdWx0aXBseWluZyB0aGUgZGVub21pbmF0b3Igd2l0aCAxMF5lc3RpbWF0ZWRfcG93ZXIgd2UKKyAgLy8gbXVsdGlwbHkgYWxsIHZhbHVlcyAobnVtZXJhdG9yIGFuZCBkZWx0YXMpIGJ5IDEwXi1lc3RpbWF0ZWRfcG93ZXIuCisKKyAgLy8gVXNlIG51bWVyYXRvciBhcyB0ZW1wb3JhcnkgY29udGFpbmVyIGZvciBwb3dlcl90ZW4uCisgIEJpZ251bSogcG93ZXJfdGVuID0gbnVtZXJhdG9yOworICBwb3dlcl90ZW4tPkFzc2lnblBvd2VyVUludDE2KDEwLCAtZXN0aW1hdGVkX3Bvd2VyKTsKKworICBpZiAobmVlZF9ib3VuZGFyeV9kZWx0YXMpIHsKKyAgICAvLyBTaW5jZSBwb3dlcl90ZW4gPT0gbnVtZXJhdG9yIHdlIG11c3QgbWFrZSBhIGNvcHkgb2YgMTBeZXN0aW1hdGVkX3Bvd2VyCisgICAgLy8gYmVmb3JlIHdlIGNvbXBsZXRlIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgbnVtZXJhdG9yLgorICAgIC8vIGRlbHRhX3BsdXMgPSBkZWx0YV9taW51cyA9IDEwXmVzdGltYXRlZF9wb3dlcgorICAgIGRlbHRhX3BsdXMtPkFzc2lnbkJpZ251bSgqcG93ZXJfdGVuKTsKKyAgICBkZWx0YV9taW51cy0+QXNzaWduQmlnbnVtKCpwb3dlcl90ZW4pOworICB9CisKKyAgLy8gbnVtZXJhdG9yID0gc2lnbmlmaWNhbmQgKiAyICogMTBeLWVzdGltYXRlZF9wb3dlcgorICAvLyAgc2luY2UgdiA9IHNpZ25pZmljYW5kICogMl5leHBvbmVudCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgLy8gbnVtZXJhdG9yID0gdiAqIDEwXi1lc3RpbWF0ZWRfcG93ZXIgKiAyICogMl4tZXhwb25lbnQuCisgIC8vIFJlbWVtYmVyOiBudW1lcmF0b3IgaGFzIGJlZW4gYWJ1c2VkIGFzIHBvd2VyX3Rlbi4gU28gbm8gbmVlZCB0byBhc3NpZ24gaXQKKyAgLy8gIHRvIGl0c2VsZi4KKyAgQVNTRVJUKG51bWVyYXRvciA9PSBwb3dlcl90ZW4pOworICBudW1lcmF0b3ItPk11bHRpcGx5QnlVSW50NjQoc2lnbmlmaWNhbmQpOworCisgIC8vIGRlbm9taW5hdG9yID0gMiAqIDJeLWV4cG9uZW50IHdpdGggZXhwb25lbnQgPCAwLgorICBkZW5vbWluYXRvci0+QXNzaWduVUludDE2KDEpOworICBkZW5vbWluYXRvci0+U2hpZnRMZWZ0KC1leHBvbmVudCk7CisKKyAgaWYgKG5lZWRfYm91bmRhcnlfZGVsdGFzKSB7CisgICAgLy8gSW50cm9kdWNlIGEgY29tbW9uIGRlbm9taW5hdG9yIHNvIHRoYXQgdGhlIGRlbHRhcyB0byB0aGUgYm91bmRhcmllcyBhcmUKKyAgICAvLyBpbnRlZ2Vycy4KKyAgICBudW1lcmF0b3ItPlNoaWZ0TGVmdCgxKTsKKyAgICBkZW5vbWluYXRvci0+U2hpZnRMZWZ0KDEpOworICAgIC8vIFdpdGggdGhpcyBzaGlmdCB0aGUgYm91bmRhcmllcyBoYXZlIHRoZWlyIGNvcnJlY3QgdmFsdWUsIHNpbmNlCisgICAgLy8gZGVsdGFfcGx1cyA9IDEwXi1lc3RpbWF0ZWRfcG93ZXIsIGFuZAorICAgIC8vIGRlbHRhX21pbnVzID0gMTBeLWVzdGltYXRlZF9wb3dlci4KKyAgICAvLyBUaGVzZSBhc3NpZ25tZW50cyBoYXZlIGJlZW4gZG9uZSBlYXJsaWVyLgorICAgIC8vIFRoZSBhZGp1c3RtZW50cyBpZiBmID09IDJecC0xIChsb3dlciBib3VuZGFyeSBpcyBjbG9zZXIpIGFyZSBkb25lIGxhdGVyLgorICB9Cit9CisKKworLy8gTGV0IHYgPSBzaWduaWZpY2FuZCAqIDJeZXhwb25lbnQuCisvLyBDb21wdXRlcyB2IC8gMTBeZXN0aW1hdGVkX3Bvd2VyIGV4YWN0bHksIGFzIGEgcmF0aW8gb2YgdHdvIGJpZ251bXMsIG51bWVyYXRvcgorLy8gYW5kIGRlbm9taW5hdG9yLiBUaGUgZnVuY3Rpb25zIEdlbmVyYXRlU2hvcnRlc3REaWdpdHMgYW5kCisvLyBHZW5lcmF0ZUNvdW50ZWREaWdpdHMgd2lsbCB0aGVuIGNvbnZlcnQgdGhpcyByYXRpbyB0byBpdHMgZGVjaW1hbAorLy8gcmVwcmVzZW50YXRpb24gZCwgd2l0aCB0aGUgcmVxdWlyZWQgYWNjdXJhY3kuCisvLyBUaGVuIGQgKiAxMF5lc3RpbWF0ZWRfcG93ZXIgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHYuCisvLyAoTm90ZTogdGhlIGZyYWN0aW9uIGFuZCB0aGUgZXN0aW1hdGVkX3Bvd2VyIG1pZ2h0IGdldCBhZGp1c3RlZCBiZWZvcmUKKy8vIGdlbmVyYXRpbmcgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24uKQorLy8KKy8vIFRoZSBpbml0aWFsIHN0YXJ0IHZhbHVlcyBjb25zaXN0IG9mOgorLy8gIC0gYSBzY2FsZWQgbnVtZXJhdG9yOiBzLnQuIG51bWVyYXRvci9kZW5vbWluYXRvciA9PSB2IC8gMTBeZXN0aW1hdGVkX3Bvd2VyLgorLy8gIC0gYSBzY2FsZWQgKGNvbW1vbikgZGVub21pbmF0b3IuCisvLyAgb3B0aW9uYWxseSAodXNlZCBieSBHZW5lcmF0ZVNob3J0ZXN0RGlnaXRzIHRvIGRlY2lkZSBpZiBpdCBoYXMgdGhlIHNob3J0ZXN0CisvLyAgZGVjaW1hbCBjb252ZXJ0aW5nIGJhY2sgdG8gdik6CisvLyAgLSB2IC0gbS06IHRoZSBkaXN0YW5jZSB0byB0aGUgbG93ZXIgYm91bmRhcnkuCisvLyAgLSBtKyAtIHY6IHRoZSBkaXN0YW5jZSB0byB0aGUgdXBwZXIgYm91bmRhcnkuCisvLworLy8gdiwgbSssIG0tLCBhbmQgdGhlcmVmb3JlIHYgLSBtLSBhbmQgbSsgLSB2IGFsbCBzaGFyZSB0aGUgc2FtZSBkZW5vbWluYXRvci4KKy8vCisvLyBMZXQgZXAgPT0gZXN0aW1hdGVkX3Bvd2VyLCB0aGVuIHRoZSByZXR1cm5lZCB2YWx1ZXMgd2lsbCBzYXRpc2Z5OgorLy8gIHYgLyAxMF5lcCA9IG51bWVyYXRvciAvIGRlbm9taW5hdG9yLgorLy8gIHYncyBib3VuZGFyeXMgbS0gYW5kIG0rOgorLy8gICAgbS0gLyAxMF5lcCA9PSB2IC8gMTBeZXAgLSBkZWx0YV9taW51cyAvIGRlbm9taW5hdG9yCisvLyAgICBtKyAvIDEwXmVwID09IHYgLyAxMF5lcCArIGRlbHRhX3BsdXMgLyBkZW5vbWluYXRvcgorLy8gIE9yIGluIG90aGVyIHdvcmRzOgorLy8gICAgbS0gPT0gdiAtIGRlbHRhX21pbnVzICogMTBeZXAgLyBkZW5vbWluYXRvcjsKKy8vICAgIG0rID09IHYgKyBkZWx0YV9wbHVzICogMTBeZXAgLyBkZW5vbWluYXRvcjsKKy8vCisvLyBTaW5jZSAxMF4oay0xKSA8PSB2IDwgMTBeayAgICAod2l0aCBrID09IGVzdGltYXRlZF9wb3dlcikKKy8vICBvciAgICAgICAxMF5rIDw9IHYgPCAxMF4oaysxKQorLy8gIHdlIHRoZW4gaGF2ZSAwLjEgPD0gbnVtZXJhdG9yL2Rlbm9taW5hdG9yIDwgMQorLy8gICAgICAgICAgIG9yICAgIDEgPD0gbnVtZXJhdG9yL2Rlbm9taW5hdG9yIDwgMTAKKy8vCisvLyBJdCBpcyB0aGVuIGVhc3kgdG8ga2lja3N0YXJ0IHRoZSBkaWdpdC1nZW5lcmF0aW9uIHJvdXRpbmUuCisvLworLy8gVGhlIGJvdW5kYXJ5LWRlbHRhcyBhcmUgb25seSBmaWxsZWQgaWYgdGhlIG1vZGUgZXF1YWxzIEJJR05VTV9EVE9BX1NIT1JURVNUCisvLyBvciBCSUdOVU1fRFRPQV9TSE9SVEVTVF9TSU5HTEUuCisKK3N0YXRpYyB2b2lkIEluaXRpYWxTY2FsZWRTdGFydFZhbHVlcyh1aW50NjRfdCBzaWduaWZpY2FuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb3dlcl9ib3VuZGFyeV9pc19jbG9zZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVzdGltYXRlZF9wb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRfYm91bmRhcnlfZGVsdGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogbnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ251bSogZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnbnVtKiBkZWx0YV9taW51cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIGRlbHRhX3BsdXMpIHsKKyAgaWYgKGV4cG9uZW50ID49IDApIHsKKyAgICBJbml0aWFsU2NhbGVkU3RhcnRWYWx1ZXNQb3NpdGl2ZUV4cG9uZW50KAorICAgICAgICBzaWduaWZpY2FuZCwgZXhwb25lbnQsIGVzdGltYXRlZF9wb3dlciwgbmVlZF9ib3VuZGFyeV9kZWx0YXMsCisgICAgICAgIG51bWVyYXRvciwgZGVub21pbmF0b3IsIGRlbHRhX21pbnVzLCBkZWx0YV9wbHVzKTsKKyAgfSBlbHNlIGlmIChlc3RpbWF0ZWRfcG93ZXIgPj0gMCkgeworICAgIEluaXRpYWxTY2FsZWRTdGFydFZhbHVlc05lZ2F0aXZlRXhwb25lbnRQb3NpdGl2ZVBvd2VyKAorICAgICAgICBzaWduaWZpY2FuZCwgZXhwb25lbnQsIGVzdGltYXRlZF9wb3dlciwgbmVlZF9ib3VuZGFyeV9kZWx0YXMsCisgICAgICAgIG51bWVyYXRvciwgZGVub21pbmF0b3IsIGRlbHRhX21pbnVzLCBkZWx0YV9wbHVzKTsKKyAgfSBlbHNlIHsKKyAgICBJbml0aWFsU2NhbGVkU3RhcnRWYWx1ZXNOZWdhdGl2ZUV4cG9uZW50TmVnYXRpdmVQb3dlcigKKyAgICAgICAgc2lnbmlmaWNhbmQsIGV4cG9uZW50LCBlc3RpbWF0ZWRfcG93ZXIsIG5lZWRfYm91bmRhcnlfZGVsdGFzLAorICAgICAgICBudW1lcmF0b3IsIGRlbm9taW5hdG9yLCBkZWx0YV9taW51cywgZGVsdGFfcGx1cyk7CisgIH0KKworICBpZiAobmVlZF9ib3VuZGFyeV9kZWx0YXMgJiYgbG93ZXJfYm91bmRhcnlfaXNfY2xvc2VyKSB7CisgICAgLy8gVGhlIGxvd2VyIGJvdW5kYXJ5IGlzIGNsb3NlciBhdCBoYWxmIHRoZSBkaXN0YW5jZSBvZiAibm9ybWFsIiBudW1iZXJzLgorICAgIC8vIEluY3JlYXNlIHRoZSBjb21tb24gZGVub21pbmF0b3IgYW5kIGFkYXB0IGFsbCBidXQgdGhlIGRlbHRhX21pbnVzLgorICAgIGRlbm9taW5hdG9yLT5TaGlmdExlZnQoMSk7ICAvLyAqMgorICAgIG51bWVyYXRvci0+U2hpZnRMZWZ0KDEpOyAgICAvLyAqMgorICAgIGRlbHRhX3BsdXMtPlNoaWZ0TGVmdCgxKTsgICAvLyAqMgorICB9Cit9CisKKworLy8gVGhpcyByb3V0aW5lIG11bHRpcGxpZXMgbnVtZXJhdG9yL2Rlbm9taW5hdG9yIHNvIHRoYXQgaXRzIHZhbHVlcyBsaWVzIGluIHRoZQorLy8gcmFuZ2UgMS0xMC4gVGhhdCBpcyBhZnRlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiB3ZSBoYXZlOgorLy8gICAgMSA8PSAobnVtZXJhdG9yICsgZGVsdGFfcGx1cykgL2Rlbm9taW5hdG9yIDwgMTAuCisvLyBMZXQgbnVtZXJhdG9yIHRoZSBpbnB1dCBiZWZvcmUgbW9kaWZpY2F0aW9uIGFuZCBudW1lcmF0b3InIHRoZSBhcmd1bWVudAorLy8gYWZ0ZXIgbW9kaWZpY2F0aW9uLCB0aGVuIHRoZSBvdXRwdXQtcGFyYW1ldGVyIGRlY2ltYWxfcG9pbnQgaXMgc3VjaCB0aGF0CisvLyAgbnVtZXJhdG9yIC8gZGVub21pbmF0b3IgKiAxMF5lc3RpbWF0ZWRfcG93ZXIgPT0KKy8vICAgIG51bWVyYXRvcicgLyBkZW5vbWluYXRvcicgKiAxMF4oZGVjaW1hbF9wb2ludCAtIDEpCisvLyBJbiBzb21lIGNhc2VzIGVzdGltYXRlZF9wb3dlciB3YXMgdG9vIGxvdywgYW5kIHRoaXMgaXMgYWxyZWFkeSB0aGUgY2FzZS4gV2UKKy8vIHRoZW4gc2ltcGx5IGFkanVzdCB0aGUgcG93ZXIgc28gdGhhdCAxMF4oay0xKSA8PSB2IDwgMTBeayAod2l0aCBrID09CisvLyBlc3RpbWF0ZWRfcG93ZXIpIGJ1dCBkbyBub3QgdG91Y2ggdGhlIG51bWVyYXRvciBvciBkZW5vbWluYXRvci4KKy8vIE90aGVyd2lzZSB0aGUgcm91dGluZSBtdWx0aXBsaWVzIHRoZSBudW1lcmF0b3IgYW5kIHRoZSBkZWx0YXMgYnkgMTAuCitzdGF0aWMgdm9pZCBGaXh1cE11bHRpcGx5MTAoaW50IGVzdGltYXRlZF9wb3dlciwgYm9vbCBpc19ldmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVjaW1hbF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIG51bWVyYXRvciwgQmlnbnVtKiBkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdudW0qIGRlbHRhX21pbnVzLCBCaWdudW0qIGRlbHRhX3BsdXMpIHsKKyAgYm9vbCBpbl9yYW5nZTsKKyAgaWYgKGlzX2V2ZW4pIHsKKyAgICAvLyBGb3IgSUVFRSBkb3VibGVzIGhhbGYtd2F5IGNhc2VzIChpbiBkZWNpbWFsIHN5c3RlbSBudW1iZXJzIGVuZGluZyB3aXRoIDUpCisgICAgLy8gYXJlIHJvdW5kZWQgdG8gdGhlIGNsb3Nlc3QgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdpdGggZXZlbiBzaWduaWZpY2FuZC4KKyAgICBpbl9yYW5nZSA9IEJpZ251bTo6UGx1c0NvbXBhcmUoKm51bWVyYXRvciwgKmRlbHRhX3BsdXMsICpkZW5vbWluYXRvcikgPj0gMDsKKyAgfSBlbHNlIHsKKyAgICBpbl9yYW5nZSA9IEJpZ251bTo6UGx1c0NvbXBhcmUoKm51bWVyYXRvciwgKmRlbHRhX3BsdXMsICpkZW5vbWluYXRvcikgPiAwOworICB9CisgIGlmIChpbl9yYW5nZSkgeworICAgIC8vIFNpbmNlIG51bWVyYXRvciArIGRlbHRhX3BsdXMgPj0gZGVub21pbmF0b3Igd2UgYWxyZWFkeSBoYXZlCisgICAgLy8gMSA8PSBudW1lcmF0b3IvZGVub21pbmF0b3IgPCAxMC4gU2ltcGx5IHVwZGF0ZSB0aGUgZXN0aW1hdGVkX3Bvd2VyLgorICAgICpkZWNpbWFsX3BvaW50ID0gZXN0aW1hdGVkX3Bvd2VyICsgMTsKKyAgfSBlbHNlIHsKKyAgICAqZGVjaW1hbF9wb2ludCA9IGVzdGltYXRlZF9wb3dlcjsKKyAgICBudW1lcmF0b3ItPlRpbWVzMTAoKTsKKyAgICBpZiAoQmlnbnVtOjpFcXVhbCgqZGVsdGFfbWludXMsICpkZWx0YV9wbHVzKSkgeworICAgICAgZGVsdGFfbWludXMtPlRpbWVzMTAoKTsKKyAgICAgIGRlbHRhX3BsdXMtPkFzc2lnbkJpZ251bSgqZGVsdGFfbWludXMpOworICAgIH0gZWxzZSB7CisgICAgICBkZWx0YV9taW51cy0+VGltZXMxMCgpOworICAgICAgZGVsdGFfcGx1cy0+VGltZXMxMCgpOworICAgIH0KKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgZG91YmxlX2NvbnZlcnNpb24KZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2JpZ251bS1kdG9hLmggYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9iaWdudW0tZHRvYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9iaWdudW0tZHRvYS5oCnJlbmFtZSB0byBzcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9iaWdudW0tZHRvYS5oCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9iaWdudW0uY2MgYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9iaWdudW0uY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2JpZ251bS5jYwpyZW5hbWUgdG8gc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vYmlnbnVtLmNjCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9iaWdudW0uaCBiL3NyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2JpZ251bS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9iaWdudW0uaApyZW5hbWUgdG8gc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vYmlnbnVtLmgKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2NhY2hlZC1wb3dlcnMuY2MgYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9jYWNoZWQtcG93ZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkY2ZhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9jYWNoZWQtcG93ZXJzLmNjCkBAIC0wLDAgKzEsMTc1IEBACisvLyBDb3B5cmlnaHQgMjAwNi0yMDA4IHRoZSBWOCBwcm9qZWN0IGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKy8vICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorLy8gICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisvLyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGNzdGRhcmc+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisKKyNpbmNsdWRlICJjYWNoZWQtcG93ZXJzLmgiCisKK25hbWVzcGFjZSBkb3VibGVfY29udmVyc2lvbiB7CisKK3N0cnVjdCBDYWNoZWRQb3dlciB7CisgIHVpbnQ2NF90IHNpZ25pZmljYW5kOworICBpbnQxNl90IGJpbmFyeV9leHBvbmVudDsKKyAgaW50MTZfdCBkZWNpbWFsX2V4cG9uZW50OworfTsKKworc3RhdGljIGNvbnN0IENhY2hlZFBvd2VyIGtDYWNoZWRQb3dlcnNbXSA9IHsKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ZmE4ZmQ1YTAsIDA4MWMwMjg4KSwgLTEyMjAsIC0zNDh9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhiYWFlZTE3ZiwgYTIzZWJmNzYpLCAtMTE5MywgLTM0MH0sCisgIHtVSU5UNjRfMlBBUlRfQygweDhiMTZmYjIwLCAzMDU1YWM3NiksIC0xMTY2LCAtMzMyfSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4Y2Y0Mjg5NGEsIDVkY2UzNWVhKSwgLTExNDAsIC0zMjR9LAorICB7VUlOVDY0XzJQQVJUX0MoMHg5YTZiYjBhYSwgNTU2NTNiMmQpLCAtMTExMywgLTMxNn0sCisgIHtVSU5UNjRfMlBBUlRfQygweGU2MWFjZjAzLCAzZDFhNDVkZiksIC0xMDg3LCAtMzA4fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4YWI3MGZlMTcsIGM3OWFjNmNhKSwgLTEwNjAsIC0zMDB9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhmZjc3YjFmYywgYmViY2RjNGYpLCAtMTAzNCwgLTI5Mn0sCisgIHtVSU5UNjRfMlBBUlRfQygweGJlNTY5MWVmLCA0MTZiZDYwYyksIC0xMDA3LCAtMjg0fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4OGRkMDFmYWQsIDkwN2ZmYzNjKSwgLTk4MCwgLTI3Nn0sCisgIHtVSU5UNjRfMlBBUlRfQygweGQzNTE1YzI4LCAzMTU1OWE4MyksIC05NTQsIC0yNjh9LAorICB7VUlOVDY0XzJQQVJUX0MoMHg5ZDcxYWM4ZiwgYWRhNmM5YjUpLCAtOTI3LCAtMjYwfSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ZWE5YzIyNzcsIDIzZWU4YmNiKSwgLTkwMSwgLTI1Mn0sCisgIHtVSU5UNjRfMlBBUlRfQygweGFlY2M0OTkxLCA0MDc4NTM2ZCksIC04NzQsIC0yNDR9LAorICB7VUlOVDY0XzJQQVJUX0MoMHg4MjNjMTI3OSwgNWRiNmNlNTcpLCAtODQ3LCAtMjM2fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4YzIxMDk0MzYsIDRkZmI1NjM3KSwgLTgyMSwgLTIyOH0sCisgIHtVSU5UNjRfMlBBUlRfQygweDkwOTZlYTZmLCAzODQ4OTg0ZiksIC03OTQsIC0yMjB9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhkNzc0ODVjYiwgMjU4MjNhYzcpLCAtNzY4LCAtMjEyfSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4YTA4NmNmY2QsIDk3YmY5N2Y0KSwgLTc0MSwgLTIwNH0sCisgIHtVSU5UNjRfMlBBUlRfQygweGVmMzQwYTk4LCAxNzJhYWNlNSksIC03MTUsIC0xOTZ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhiMjM4NjdmYiwgMmEzNWIyOGUpLCAtNjg4LCAtMTg4fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ODRjOGQ0ZGYsIGQyYzYzZjNiKSwgLTY2MSwgLTE4MH0sCisgIHtVSU5UNjRfMlBBUlRfQygweGM1ZGQ0NDI3LCAxYWQzY2RiYSksIC02MzUsIC0xNzJ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHg5MzZiOWZjZSwgYmIyNWM5OTYpLCAtNjA4LCAtMTY0fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ZGJhYzZjMjQsIDdkNjJhNTg0KSwgLTU4MiwgLTE1Nn0sCisgIHtVSU5UNjRfMlBBUlRfQygweGEzYWI2NjU4LCAwZDVmZGFmNiksIC01NTUsIC0xNDh9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhmM2UyZjg5MywgZGVjM2YxMjYpLCAtNTI5LCAtMTQwfSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4YjViNWFkYTgsIGFhZmY4MGI4KSwgLTUwMiwgLTEzMn0sCisgIHtVSU5UNjRfMlBBUlRfQygweDg3NjI1ZjA1LCA2YzdjNGE4YiksIC00NzUsIC0xMjR9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhjOWJjZmY2MCwgMzRjMTMwNTMpLCAtNDQ5LCAtMTE2fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4OTY0ZTg1OGMsIDkxYmEyNjU1KSwgLTQyMiwgLTEwOH0sCisgIHtVSU5UNjRfMlBBUlRfQygweGRmZjk3NzI0LCA3MDI5N2ViZCksIC0zOTYsIC0xMDB9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhhNmRmYmQ5ZiwgYjhlNWI4OGYpLCAtMzY5LCAtOTJ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhmOGE5NWZjZiwgODg3NDdkOTQpLCAtMzQzLCAtODR9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhiOTQ0NzA5MywgOGZhODliY2YpLCAtMzE2LCAtNzZ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHg4YTA4ZjBmOCwgYmYwZjE1NmIpLCAtMjg5LCAtNjh9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhjZGIwMjU1NSwgNjUzMTMxYjYpLCAtMjYzLCAtNjB9LAorICB7VUlOVDY0XzJQQVJUX0MoMHg5OTNmZTJjNiwgZDA3YjdmYWMpLCAtMjM2LCAtNTJ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhlNDVjMTBjNCwgMmEyYjNiMDYpLCAtMjEwLCAtNDR9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhhYTI0MjQ5OSwgNjk3MzkyZDMpLCAtMTgzLCAtMzZ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhmZDg3YjVmMiwgODMwMGNhMGUpLCAtMTU3LCAtMjh9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhiY2U1MDg2NCwgOTIxMTFhZWIpLCAtMTMwLCAtMjB9LAorICB7VUlOVDY0XzJQQVJUX0MoMHg4Y2JjY2MwOSwgNmY1MDg4Y2MpLCAtMTAzLCAtMTJ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhkMWI3MTc1OCwgZTIxOTY1MmMpLCAtNzcsIC00fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4OWM0MDAwMDAsIDAwMDAwMDAwKSwgLTUwLCA0fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ZThkNGE1MTAsIDAwMDAwMDAwKSwgLTI0LCAxMn0sCisgIHtVSU5UNjRfMlBBUlRfQygweGFkNzhlYmM1LCBhYzYyMDAwMCksIDMsIDIwfSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ODEzZjM5NzgsIGY4OTQwOTg0KSwgMzAsIDI4fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4YzA5N2NlN2IsIGM5MDcxNWIzKSwgNTYsIDM2fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4OGY3ZTMyY2UsIDdiZWE1YzcwKSwgODMsIDQ0fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ZDVkMjM4YTQsIGFiZTk4MDY4KSwgMTA5LCA1Mn0sCisgIHtVSU5UNjRfMlBBUlRfQygweDlmNGYyNzI2LCAxNzlhMjI0NSksIDEzNiwgNjB9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhlZDYzYTIzMSwgZDRjNGZiMjcpLCAxNjIsIDY4fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4YjBkZTY1MzgsIDhjYzhhZGE4KSwgMTg5LCA3Nn0sCisgIHtVSU5UNjRfMlBBUlRfQygweDgzYzcwODhlLCAxYWFiNjVkYiksIDIxNiwgODR9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhjNDVkMWRmOSwgNDI3MTFkOWEpLCAyNDIsIDkyfSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4OTI0ZDY5MmMsIGE2MWJlNzU4KSwgMjY5LCAxMDB9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhkYTAxZWU2NCwgMWE3MDhkZWEpLCAyOTUsIDEwOH0sCisgIHtVSU5UNjRfMlBBUlRfQygweGEyNmRhMzk5LCA5YWVmNzc0YSksIDMyMiwgMTE2fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ZjIwOTc4N2IsIGI0N2Q2Yjg1KSwgMzQ4LCAxMjR9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhiNDU0ZTRhMSwgNzlkZDE4NzcpLCAzNzUsIDEzMn0sCisgIHtVSU5UNjRfMlBBUlRfQygweDg2NWI4NjkyLCA1YjliYzVjMiksIDQwMiwgMTQwfSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4YzgzNTUzYzUsIGM4OTY1ZDNkKSwgNDI4LCAxNDh9LAorICB7VUlOVDY0XzJQQVJUX0MoMHg5NTJhYjQ1YywgZmE5N2EwYjMpLCA0NTUsIDE1Nn0sCisgIHtVSU5UNjRfMlBBUlRfQygweGRlNDY5ZmJkLCA5OWEwNWZlMyksIDQ4MSwgMTY0fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4YTU5YmMyMzQsIGRiMzk4YzI1KSwgNTA4LCAxNzJ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhmNmM2OWE3MiwgYTM5ODlmNWMpLCA1MzQsIDE4MH0sCisgIHtVSU5UNjRfMlBBUlRfQygweGI3ZGNiZjUzLCA1NGU5YmVjZSksIDU2MSwgMTg4fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ODhmY2YzMTcsIGYyMjI0MWUyKSwgNTg4LCAxOTZ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhjYzIwY2U5YiwgZDM1Yzc4YTUpLCA2MTQsIDIwNH0sCisgIHtVSU5UNjRfMlBBUlRfQygweDk4MTY1YWYzLCA3YjIxNTNkZiksIDY0MSwgMjEyfSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ZTJhMGI1ZGMsIDk3MWYzMDNhKSwgNjY3LCAyMjB9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhhOGQ5ZDE1MywgNWNlM2IzOTYpLCA2OTQsIDIyOH0sCisgIHtVSU5UNjRfMlBBUlRfQygweGZiOWI3Y2Q5LCBhNGE3NDQzYyksIDcyMCwgMjM2fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4YmI3NjRjNGMsIGE3YTQ0NDEwKSwgNzQ3LCAyNDR9LAorICB7VUlOVDY0XzJQQVJUX0MoMHg4YmFiOGVlZiwgYjY0MDljMWEpLCA3NzQsIDI1Mn0sCisgIHtVSU5UNjRfMlBBUlRfQygweGQwMWZlZjEwLCBhNjU3ODQyYyksIDgwMCwgMjYwfSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4OWIxMGE0ZTUsIGU5OTEzMTI5KSwgODI3LCAyNjh9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhlNzEwOWJmYiwgYTE5YzBjOWQpLCA4NTMsIDI3Nn0sCisgIHtVSU5UNjRfMlBBUlRfQygweGFjMjgyMGQ5LCA2MjNiZjQyOSksIDg4MCwgMjg0fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ODA0NDRiNWUsIDdhYTdjZjg1KSwgOTA3LCAyOTJ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhiZjIxZTQ0MCwgMDNhY2RkMmQpLCA5MzMsIDMwMH0sCisgIHtVSU5UNjRfMlBBUlRfQygweDhlNjc5YzJmLCA1ZTQ0ZmY4ZiksIDk2MCwgMzA4fSwKKyAge1VJTlQ2NF8yUEFSVF9DKDB4ZDQzMzE3OWQsIDljOGNiODQxKSwgOTg2LCAzMTZ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHg5ZTE5ZGI5MiwgYjRlMzFiYTkpLCAxMDEzLCAzMjR9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhlYjk2YmY2ZSwgYmFkZjc3ZDkpLCAxMDM5LCAzMzJ9LAorICB7VUlOVDY0XzJQQVJUX0MoMHhhZjg3MDIzYiwgOWJmMGVlNmIpLCAxMDY2LCAzNDB9LAorfTsKKworc3RhdGljIGNvbnN0IGludCBrQ2FjaGVkUG93ZXJzTGVuZ3RoID0gQVJSQVlfU0laRShrQ2FjaGVkUG93ZXJzKTsKK3N0YXRpYyBjb25zdCBpbnQga0NhY2hlZFBvd2Vyc09mZnNldCA9IDM0ODsgIC8vIC0xICogdGhlIGZpcnN0IGRlY2ltYWxfZXhwb25lbnQuCitzdGF0aWMgY29uc3QgZG91YmxlIGtEXzFfTE9HMl8xMCA9IDAuMzAxMDI5OTk1NjYzOTgxMTQ7ICAvLyAgMSAvIGxnKDEwKQorLy8gRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkZWNpbWFsIGV4cG9uZW50cyBpbiB0aGUgdGFibGUgYWJvdmUuCitjb25zdCBpbnQgUG93ZXJzT2ZUZW5DYWNoZTo6a0RlY2ltYWxFeHBvbmVudERpc3RhbmNlID0gODsKK2NvbnN0IGludCBQb3dlcnNPZlRlbkNhY2hlOjprTWluRGVjaW1hbEV4cG9uZW50ID0gLTM0ODsKK2NvbnN0IGludCBQb3dlcnNPZlRlbkNhY2hlOjprTWF4RGVjaW1hbEV4cG9uZW50ID0gMzQwOworCit2b2lkIFBvd2Vyc09mVGVuQ2FjaGU6OkdldENhY2hlZFBvd2VyRm9yQmluYXJ5RXhwb25lbnRSYW5nZSgKKyAgICBpbnQgbWluX2V4cG9uZW50LAorICAgIGludCBtYXhfZXhwb25lbnQsCisgICAgRGl5RnAqIHBvd2VyLAorICAgIGludCogZGVjaW1hbF9leHBvbmVudCkgeworICBpbnQga1EgPSBEaXlGcDo6a1NpZ25pZmljYW5kU2l6ZTsKKyAgZG91YmxlIGsgPSBjZWlsKChtaW5fZXhwb25lbnQgKyBrUSAtIDEpICoga0RfMV9MT0cyXzEwKTsKKyAgaW50IGZvbyA9IGtDYWNoZWRQb3dlcnNPZmZzZXQ7CisgIGludCBpbmRleCA9CisgICAgICAoZm9vICsgc3RhdGljX2Nhc3Q8aW50PihrKSAtIDEpIC8ga0RlY2ltYWxFeHBvbmVudERpc3RhbmNlICsgMTsKKyAgQVNTRVJUKDAgPD0gaW5kZXggJiYgaW5kZXggPCBrQ2FjaGVkUG93ZXJzTGVuZ3RoKTsKKyAgQ2FjaGVkUG93ZXIgY2FjaGVkX3Bvd2VyID0ga0NhY2hlZFBvd2Vyc1tpbmRleF07CisgIEFTU0VSVChtaW5fZXhwb25lbnQgPD0gY2FjaGVkX3Bvd2VyLmJpbmFyeV9leHBvbmVudCk7CisgIEFTU0VSVChjYWNoZWRfcG93ZXIuYmluYXJ5X2V4cG9uZW50IDw9IG1heF9leHBvbmVudCk7CisgICpkZWNpbWFsX2V4cG9uZW50ID0gY2FjaGVkX3Bvd2VyLmRlY2ltYWxfZXhwb25lbnQ7CisgICpwb3dlciA9IERpeUZwKGNhY2hlZF9wb3dlci5zaWduaWZpY2FuZCwgY2FjaGVkX3Bvd2VyLmJpbmFyeV9leHBvbmVudCk7Cit9CisKKwordm9pZCBQb3dlcnNPZlRlbkNhY2hlOjpHZXRDYWNoZWRQb3dlckZvckRlY2ltYWxFeHBvbmVudChpbnQgcmVxdWVzdGVkX2V4cG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXlGcCogcG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZm91bmRfZXhwb25lbnQpIHsKKyAgQVNTRVJUKGtNaW5EZWNpbWFsRXhwb25lbnQgPD0gcmVxdWVzdGVkX2V4cG9uZW50KTsKKyAgQVNTRVJUKHJlcXVlc3RlZF9leHBvbmVudCA8IGtNYXhEZWNpbWFsRXhwb25lbnQgKyBrRGVjaW1hbEV4cG9uZW50RGlzdGFuY2UpOworICBpbnQgaW5kZXggPQorICAgICAgKHJlcXVlc3RlZF9leHBvbmVudCArIGtDYWNoZWRQb3dlcnNPZmZzZXQpIC8ga0RlY2ltYWxFeHBvbmVudERpc3RhbmNlOworICBDYWNoZWRQb3dlciBjYWNoZWRfcG93ZXIgPSBrQ2FjaGVkUG93ZXJzW2luZGV4XTsKKyAgKnBvd2VyID0gRGl5RnAoY2FjaGVkX3Bvd2VyLnNpZ25pZmljYW5kLCBjYWNoZWRfcG93ZXIuYmluYXJ5X2V4cG9uZW50KTsKKyAgKmZvdW5kX2V4cG9uZW50ID0gY2FjaGVkX3Bvd2VyLmRlY2ltYWxfZXhwb25lbnQ7CisgIEFTU0VSVCgqZm91bmRfZXhwb25lbnQgPD0gcmVxdWVzdGVkX2V4cG9uZW50KTsKKyAgQVNTRVJUKHJlcXVlc3RlZF9leHBvbmVudCA8ICpmb3VuZF9leHBvbmVudCArIGtEZWNpbWFsRXhwb25lbnREaXN0YW5jZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBkb3VibGVfY29udmVyc2lvbgpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vY2FjaGVkLXBvd2Vycy5oIGIvc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vY2FjaGVkLXBvd2Vycy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9jYWNoZWQtcG93ZXJzLmgKcmVuYW1lIHRvIHNyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2NhY2hlZC1wb3dlcnMuaApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZGl5LWZwLmNjIGIvc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZGl5LWZwLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9kaXktZnAuY2MKcmVuYW1lIHRvIHNyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2RpeS1mcC5jYwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZGl5LWZwLmggYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9kaXktZnAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZGl5LWZwLmgKcmVuYW1lIHRvIHNyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2RpeS1mcC5oCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9kb3VibGUtY29udmVyc2lvbi5jYyBiL3NyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2RvdWJsZS1jb252ZXJzaW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzkyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9kb3VibGUtY29udmVyc2lvbi5jYwpAQCAtMCwwICsxLDg4OSBAQAorLy8gQ29weXJpZ2h0IDIwMTAgdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworLy8gICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisvLyAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKy8vICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgImRvdWJsZS1jb252ZXJzaW9uLmgiCisKKyNpbmNsdWRlICJiaWdudW0tZHRvYS5oIgorI2luY2x1ZGUgImZhc3QtZHRvYS5oIgorI2luY2x1ZGUgImZpeGVkLWR0b2EuaCIKKyNpbmNsdWRlICJpZWVlLmgiCisjaW5jbHVkZSAic3RydG9kLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworbmFtZXNwYWNlIGRvdWJsZV9jb252ZXJzaW9uIHsKKworY29uc3QgRG91YmxlVG9TdHJpbmdDb252ZXJ0ZXImIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpFY21hU2NyaXB0Q29udmVydGVyKCkgeworICBpbnQgZmxhZ3MgPSBVTklRVUVfWkVSTyB8IEVNSVRfUE9TSVRJVkVfRVhQT05FTlRfU0lHTjsKKyAgc3RhdGljIERvdWJsZVRvU3RyaW5nQ29udmVydGVyIGNvbnZlcnRlcihmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5maW5pdHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYU4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNiwgMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMCk7CisgIHJldHVybiBjb252ZXJ0ZXI7Cit9CisKKworYm9vbCBEb3VibGVUb1N0cmluZ0NvbnZlcnRlcjo6SGFuZGxlU3BlY2lhbFZhbHVlcygKKyAgICBkb3VibGUgdmFsdWUsCisgICAgU3RyaW5nQnVpbGRlciogcmVzdWx0X2J1aWxkZXIpIGNvbnN0IHsKKyAgRG91YmxlIGRvdWJsZV9pbnNwZWN0KHZhbHVlKTsKKyAgaWYgKGRvdWJsZV9pbnNwZWN0LklzSW5maW5pdGUoKSkgeworICAgIGlmIChpbmZpbml0eV9zeW1ib2xfID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCctJyk7CisgICAgfQorICAgIHJlc3VsdF9idWlsZGVyLT5BZGRTdHJpbmcoaW5maW5pdHlfc3ltYm9sXyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKGRvdWJsZV9pbnNwZWN0LklzTmFuKCkpIHsKKyAgICBpZiAobmFuX3N5bWJvbF8gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJlc3VsdF9idWlsZGVyLT5BZGRTdHJpbmcobmFuX3N5bWJvbF8pOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworCit2b2lkIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpDcmVhdGVFeHBvbmVudGlhbFJlcHJlc2VudGF0aW9uKAorICAgIGNvbnN0IGNoYXIqIGRlY2ltYWxfZGlnaXRzLAorICAgIGludCBsZW5ndGgsCisgICAgaW50IGV4cG9uZW50LAorICAgIFN0cmluZ0J1aWxkZXIqIHJlc3VsdF9idWlsZGVyKSBjb25zdCB7CisgIEFTU0VSVChsZW5ndGggIT0gMCk7CisgIHJlc3VsdF9idWlsZGVyLT5BZGRDaGFyYWN0ZXIoZGVjaW1hbF9kaWdpdHNbMF0pOworICBpZiAobGVuZ3RoICE9IDEpIHsKKyAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCcuJyk7CisgICAgcmVzdWx0X2J1aWxkZXItPkFkZFN1YnN0cmluZygmZGVjaW1hbF9kaWdpdHNbMV0sIGxlbmd0aC0xKTsKKyAgfQorICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKGV4cG9uZW50X2NoYXJhY3Rlcl8pOworICBpZiAoZXhwb25lbnQgPCAwKSB7CisgICAgcmVzdWx0X2J1aWxkZXItPkFkZENoYXJhY3RlcignLScpOworICAgIGV4cG9uZW50ID0gLWV4cG9uZW50OworICB9IGVsc2UgeworICAgIGlmICgoZmxhZ3NfICYgRU1JVF9QT1NJVElWRV9FWFBPTkVOVF9TSUdOKSAhPSAwKSB7CisgICAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCcrJyk7CisgICAgfQorICB9CisgIGlmIChleHBvbmVudCA9PSAwKSB7CisgICAgcmVzdWx0X2J1aWxkZXItPkFkZENoYXJhY3RlcignMCcpOworICAgIHJldHVybjsKKyAgfQorICBBU1NFUlQoZXhwb25lbnQgPCAxZTQpOworICBjb25zdCBpbnQga01heEV4cG9uZW50TGVuZ3RoID0gNTsKKyAgY2hhciBidWZmZXJba01heEV4cG9uZW50TGVuZ3RoICsgMV07CisgIGJ1ZmZlcltrTWF4RXhwb25lbnRMZW5ndGhdID0gJ1wwJzsKKyAgaW50IGZpcnN0X2NoYXJfcG9zID0ga01heEV4cG9uZW50TGVuZ3RoOworICB3aGlsZSAoZXhwb25lbnQgPiAwKSB7CisgICAgYnVmZmVyWy0tZmlyc3RfY2hhcl9wb3NdID0gJzAnICsgKGV4cG9uZW50ICUgMTApOworICAgIGV4cG9uZW50IC89IDEwOworICB9CisgIHJlc3VsdF9idWlsZGVyLT5BZGRTdWJzdHJpbmcoJmJ1ZmZlcltmaXJzdF9jaGFyX3Bvc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heEV4cG9uZW50TGVuZ3RoIC0gZmlyc3RfY2hhcl9wb3MpOworfQorCisKK3ZvaWQgRG91YmxlVG9TdHJpbmdDb252ZXJ0ZXI6OkNyZWF0ZURlY2ltYWxSZXByZXNlbnRhdGlvbigKKyAgICBjb25zdCBjaGFyKiBkZWNpbWFsX2RpZ2l0cywKKyAgICBpbnQgbGVuZ3RoLAorICAgIGludCBkZWNpbWFsX3BvaW50LAorICAgIGludCBkaWdpdHNfYWZ0ZXJfcG9pbnQsCisgICAgU3RyaW5nQnVpbGRlciogcmVzdWx0X2J1aWxkZXIpIGNvbnN0IHsKKyAgLy8gQ3JlYXRlIGEgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBpZiBuZWVkZWQuCisgIGlmIChkZWNpbWFsX3BvaW50IDw9IDApIHsKKyAgICAgIC8vICIwLjAwMDAwZGVjaW1hbF9yZXAiLgorICAgIHJlc3VsdF9idWlsZGVyLT5BZGRDaGFyYWN0ZXIoJzAnKTsKKyAgICBpZiAoZGlnaXRzX2FmdGVyX3BvaW50ID4gMCkgeworICAgICAgcmVzdWx0X2J1aWxkZXItPkFkZENoYXJhY3RlcignLicpOworICAgICAgcmVzdWx0X2J1aWxkZXItPkFkZFBhZGRpbmcoJzAnLCAtZGVjaW1hbF9wb2ludCk7CisgICAgICBBU1NFUlQobGVuZ3RoIDw9IGRpZ2l0c19hZnRlcl9wb2ludCAtICgtZGVjaW1hbF9wb2ludCkpOworICAgICAgcmVzdWx0X2J1aWxkZXItPkFkZFN1YnN0cmluZyhkZWNpbWFsX2RpZ2l0cywgbGVuZ3RoKTsKKyAgICAgIGludCByZW1haW5pbmdfZGlnaXRzID0gZGlnaXRzX2FmdGVyX3BvaW50IC0gKC1kZWNpbWFsX3BvaW50KSAtIGxlbmd0aDsKKyAgICAgIHJlc3VsdF9idWlsZGVyLT5BZGRQYWRkaW5nKCcwJywgcmVtYWluaW5nX2RpZ2l0cyk7CisgICAgfQorICB9IGVsc2UgaWYgKGRlY2ltYWxfcG9pbnQgPj0gbGVuZ3RoKSB7CisgICAgLy8gImRlY2ltYWxfcmVwMDAwMC4wMDAwMCIgb3IgImRlY2ltYWxfcmVwLjAwMDAiCisgICAgcmVzdWx0X2J1aWxkZXItPkFkZFN1YnN0cmluZyhkZWNpbWFsX2RpZ2l0cywgbGVuZ3RoKTsKKyAgICByZXN1bHRfYnVpbGRlci0+QWRkUGFkZGluZygnMCcsIGRlY2ltYWxfcG9pbnQgLSBsZW5ndGgpOworICAgIGlmIChkaWdpdHNfYWZ0ZXJfcG9pbnQgPiAwKSB7CisgICAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCcuJyk7CisgICAgICByZXN1bHRfYnVpbGRlci0+QWRkUGFkZGluZygnMCcsIGRpZ2l0c19hZnRlcl9wb2ludCk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vICJkZWNpbWEubF9yZXAwMDAiCisgICAgQVNTRVJUKGRpZ2l0c19hZnRlcl9wb2ludCA+IDApOworICAgIHJlc3VsdF9idWlsZGVyLT5BZGRTdWJzdHJpbmcoZGVjaW1hbF9kaWdpdHMsIGRlY2ltYWxfcG9pbnQpOworICAgIHJlc3VsdF9idWlsZGVyLT5BZGRDaGFyYWN0ZXIoJy4nKTsKKyAgICBBU1NFUlQobGVuZ3RoIC0gZGVjaW1hbF9wb2ludCA8PSBkaWdpdHNfYWZ0ZXJfcG9pbnQpOworICAgIHJlc3VsdF9idWlsZGVyLT5BZGRTdWJzdHJpbmcoJmRlY2ltYWxfZGlnaXRzW2RlY2ltYWxfcG9pbnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIC0gZGVjaW1hbF9wb2ludCk7CisgICAgaW50IHJlbWFpbmluZ19kaWdpdHMgPSBkaWdpdHNfYWZ0ZXJfcG9pbnQgLSAobGVuZ3RoIC0gZGVjaW1hbF9wb2ludCk7CisgICAgcmVzdWx0X2J1aWxkZXItPkFkZFBhZGRpbmcoJzAnLCByZW1haW5pbmdfZGlnaXRzKTsKKyAgfQorICBpZiAoZGlnaXRzX2FmdGVyX3BvaW50ID09IDApIHsKKyAgICBpZiAoKGZsYWdzXyAmIEVNSVRfVFJBSUxJTkdfREVDSU1BTF9QT0lOVCkgIT0gMCkgeworICAgICAgcmVzdWx0X2J1aWxkZXItPkFkZENoYXJhY3RlcignLicpOworICAgIH0KKyAgICBpZiAoKGZsYWdzXyAmIEVNSVRfVFJBSUxJTkdfWkVST19BRlRFUl9QT0lOVCkgIT0gMCkgeworICAgICAgcmVzdWx0X2J1aWxkZXItPkFkZENoYXJhY3RlcignMCcpOworICAgIH0KKyAgfQorfQorCisKK2Jvb2wgRG91YmxlVG9TdHJpbmdDb252ZXJ0ZXI6OlRvU2hvcnRlc3RJZWVlTnVtYmVyKAorICAgIGRvdWJsZSB2YWx1ZSwKKyAgICBTdHJpbmdCdWlsZGVyKiByZXN1bHRfYnVpbGRlciwKKyAgICBEb3VibGVUb1N0cmluZ0NvbnZlcnRlcjo6RHRvYU1vZGUgbW9kZSkgY29uc3QgeworICBBU1NFUlQobW9kZSA9PSBTSE9SVEVTVCB8fCBtb2RlID09IFNIT1JURVNUX1NJTkdMRSk7CisgIGlmIChEb3VibGUodmFsdWUpLklzU3BlY2lhbCgpKSB7CisgICAgcmV0dXJuIEhhbmRsZVNwZWNpYWxWYWx1ZXModmFsdWUsIHJlc3VsdF9idWlsZGVyKTsKKyAgfQorCisgIGludCBkZWNpbWFsX3BvaW50OworICBib29sIHNpZ247CisgIGNvbnN0IGludCBrRGVjaW1hbFJlcENhcGFjaXR5ID0ga0Jhc2UxME1heGltYWxMZW5ndGggKyAxOworICBjaGFyIGRlY2ltYWxfcmVwW2tEZWNpbWFsUmVwQ2FwYWNpdHldOworICBpbnQgZGVjaW1hbF9yZXBfbGVuZ3RoOworCisgIERvdWJsZVRvQXNjaWkodmFsdWUsIG1vZGUsIDAsIGRlY2ltYWxfcmVwLCBrRGVjaW1hbFJlcENhcGFjaXR5LAorICAgICAgICAgICAgICAgICZzaWduLCAmZGVjaW1hbF9yZXBfbGVuZ3RoLCAmZGVjaW1hbF9wb2ludCk7CisKKyAgYm9vbCB1bmlxdWVfemVybyA9IChmbGFnc18gJiBVTklRVUVfWkVSTykgIT0gMDsKKyAgaWYgKHNpZ24gJiYgKHZhbHVlICE9IDAuMCB8fCAhdW5pcXVlX3plcm8pKSB7CisgICAgcmVzdWx0X2J1aWxkZXItPkFkZENoYXJhY3RlcignLScpOworICB9CisKKyAgaW50IGV4cG9uZW50ID0gZGVjaW1hbF9wb2ludCAtIDE7CisgIGlmICgoZGVjaW1hbF9pbl9zaG9ydGVzdF9sb3dfIDw9IGV4cG9uZW50KSAmJgorICAgICAgKGV4cG9uZW50IDwgZGVjaW1hbF9pbl9zaG9ydGVzdF9oaWdoXykpIHsKKyAgICBDcmVhdGVEZWNpbWFsUmVwcmVzZW50YXRpb24oZGVjaW1hbF9yZXAsIGRlY2ltYWxfcmVwX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4KDAsIGRlY2ltYWxfcmVwX2xlbmd0aCAtIGRlY2ltYWxfcG9pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfYnVpbGRlcik7CisgIH0gZWxzZSB7CisgICAgQ3JlYXRlRXhwb25lbnRpYWxSZXByZXNlbnRhdGlvbihkZWNpbWFsX3JlcCwgZGVjaW1hbF9yZXBfbGVuZ3RoLCBleHBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9idWlsZGVyKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpUb0ZpeGVkKGRvdWJsZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RlZF9kaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIqIHJlc3VsdF9idWlsZGVyKSBjb25zdCB7CisgIEFTU0VSVChrTWF4Rml4ZWREaWdpdHNCZWZvcmVQb2ludCA9PSA2MCk7CisgIGNvbnN0IGRvdWJsZSBrRmlyc3ROb25GaXhlZCA9IDFlNjA7CisKKyAgaWYgKERvdWJsZSh2YWx1ZSkuSXNTcGVjaWFsKCkpIHsKKyAgICByZXR1cm4gSGFuZGxlU3BlY2lhbFZhbHVlcyh2YWx1ZSwgcmVzdWx0X2J1aWxkZXIpOworICB9CisKKyAgaWYgKHJlcXVlc3RlZF9kaWdpdHMgPiBrTWF4Rml4ZWREaWdpdHNBZnRlclBvaW50KSByZXR1cm4gZmFsc2U7CisgIGlmICh2YWx1ZSA+PSBrRmlyc3ROb25GaXhlZCB8fCB2YWx1ZSA8PSAta0ZpcnN0Tm9uRml4ZWQpIHJldHVybiBmYWxzZTsKKworICAvLyBGaW5kIGEgc3VmZmljaWVudGx5IHByZWNpc2UgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiBuLgorICBpbnQgZGVjaW1hbF9wb2ludDsKKyAgYm9vbCBzaWduOworICAvLyBBZGQgc3BhY2UgZm9yIHRoZSAnXDAnIGJ5dGUuCisgIGNvbnN0IGludCBrRGVjaW1hbFJlcENhcGFjaXR5ID0KKyAgICAgIGtNYXhGaXhlZERpZ2l0c0JlZm9yZVBvaW50ICsga01heEZpeGVkRGlnaXRzQWZ0ZXJQb2ludCArIDE7CisgIGNoYXIgZGVjaW1hbF9yZXBba0RlY2ltYWxSZXBDYXBhY2l0eV07CisgIGludCBkZWNpbWFsX3JlcF9sZW5ndGg7CisgIERvdWJsZVRvQXNjaWkodmFsdWUsIEZJWEVELCByZXF1ZXN0ZWRfZGlnaXRzLAorICAgICAgICAgICAgICAgIGRlY2ltYWxfcmVwLCBrRGVjaW1hbFJlcENhcGFjaXR5LAorICAgICAgICAgICAgICAgICZzaWduLCAmZGVjaW1hbF9yZXBfbGVuZ3RoLCAmZGVjaW1hbF9wb2ludCk7CisKKyAgYm9vbCB1bmlxdWVfemVybyA9ICgoZmxhZ3NfICYgVU5JUVVFX1pFUk8pICE9IDApOworICBpZiAoc2lnbiAmJiAodmFsdWUgIT0gMC4wIHx8ICF1bmlxdWVfemVybykpIHsKKyAgICByZXN1bHRfYnVpbGRlci0+QWRkQ2hhcmFjdGVyKCctJyk7CisgIH0KKworICBDcmVhdGVEZWNpbWFsUmVwcmVzZW50YXRpb24oZGVjaW1hbF9yZXAsIGRlY2ltYWxfcmVwX2xlbmd0aCwgZGVjaW1hbF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9kaWdpdHMsIHJlc3VsdF9idWlsZGVyKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBEb3VibGVUb1N0cmluZ0NvbnZlcnRlcjo6VG9FeHBvbmVudGlhbCgKKyAgICBkb3VibGUgdmFsdWUsCisgICAgaW50IHJlcXVlc3RlZF9kaWdpdHMsCisgICAgU3RyaW5nQnVpbGRlciogcmVzdWx0X2J1aWxkZXIpIGNvbnN0IHsKKyAgaWYgKERvdWJsZSh2YWx1ZSkuSXNTcGVjaWFsKCkpIHsKKyAgICByZXR1cm4gSGFuZGxlU3BlY2lhbFZhbHVlcyh2YWx1ZSwgcmVzdWx0X2J1aWxkZXIpOworICB9CisKKyAgaWYgKHJlcXVlc3RlZF9kaWdpdHMgPCAtMSkgcmV0dXJuIGZhbHNlOworICBpZiAocmVxdWVzdGVkX2RpZ2l0cyA+IGtNYXhFeHBvbmVudGlhbERpZ2l0cykgcmV0dXJuIGZhbHNlOworCisgIGludCBkZWNpbWFsX3BvaW50OworICBib29sIHNpZ247CisgIC8vIEFkZCBzcGFjZSBmb3IgZGlnaXQgYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50IGFuZCB0aGUgJ1wwJyBjaGFyYWN0ZXIuCisgIGNvbnN0IGludCBrRGVjaW1hbFJlcENhcGFjaXR5ID0ga01heEV4cG9uZW50aWFsRGlnaXRzICsgMjsKKyAgQVNTRVJUKGtEZWNpbWFsUmVwQ2FwYWNpdHkgPiBrQmFzZTEwTWF4aW1hbExlbmd0aCk7CisgIGNoYXIgZGVjaW1hbF9yZXBba0RlY2ltYWxSZXBDYXBhY2l0eV07CisgIGludCBkZWNpbWFsX3JlcF9sZW5ndGg7CisKKyAgaWYgKHJlcXVlc3RlZF9kaWdpdHMgPT0gLTEpIHsKKyAgICBEb3VibGVUb0FzY2lpKHZhbHVlLCBTSE9SVEVTVCwgMCwKKyAgICAgICAgICAgICAgICAgIGRlY2ltYWxfcmVwLCBrRGVjaW1hbFJlcENhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgJnNpZ24sICZkZWNpbWFsX3JlcF9sZW5ndGgsICZkZWNpbWFsX3BvaW50KTsKKyAgfSBlbHNlIHsKKyAgICBEb3VibGVUb0FzY2lpKHZhbHVlLCBQUkVDSVNJT04sIHJlcXVlc3RlZF9kaWdpdHMgKyAxLAorICAgICAgICAgICAgICAgICAgZGVjaW1hbF9yZXAsIGtEZWNpbWFsUmVwQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAmc2lnbiwgJmRlY2ltYWxfcmVwX2xlbmd0aCwgJmRlY2ltYWxfcG9pbnQpOworICAgIEFTU0VSVChkZWNpbWFsX3JlcF9sZW5ndGggPD0gcmVxdWVzdGVkX2RpZ2l0cyArIDEpOworCisgICAgZm9yIChpbnQgaSA9IGRlY2ltYWxfcmVwX2xlbmd0aDsgaSA8IHJlcXVlc3RlZF9kaWdpdHMgKyAxOyArK2kpIHsKKyAgICAgIGRlY2ltYWxfcmVwW2ldID0gJzAnOworICAgIH0KKyAgICBkZWNpbWFsX3JlcF9sZW5ndGggPSByZXF1ZXN0ZWRfZGlnaXRzICsgMTsKKyAgfQorCisgIGJvb2wgdW5pcXVlX3plcm8gPSAoKGZsYWdzXyAmIFVOSVFVRV9aRVJPKSAhPSAwKTsKKyAgaWYgKHNpZ24gJiYgKHZhbHVlICE9IDAuMCB8fCAhdW5pcXVlX3plcm8pKSB7CisgICAgcmVzdWx0X2J1aWxkZXItPkFkZENoYXJhY3RlcignLScpOworICB9CisKKyAgaW50IGV4cG9uZW50ID0gZGVjaW1hbF9wb2ludCAtIDE7CisgIENyZWF0ZUV4cG9uZW50aWFsUmVwcmVzZW50YXRpb24oZGVjaW1hbF9yZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbF9yZXBfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9idWlsZGVyKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBEb3VibGVUb1N0cmluZ0NvbnZlcnRlcjo6VG9QcmVjaXNpb24oZG91YmxlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIqIHJlc3VsdF9idWlsZGVyKSBjb25zdCB7CisgIGlmIChEb3VibGUodmFsdWUpLklzU3BlY2lhbCgpKSB7CisgICAgcmV0dXJuIEhhbmRsZVNwZWNpYWxWYWx1ZXModmFsdWUsIHJlc3VsdF9idWlsZGVyKTsKKyAgfQorCisgIGlmIChwcmVjaXNpb24gPCBrTWluUHJlY2lzaW9uRGlnaXRzIHx8IHByZWNpc2lvbiA+IGtNYXhQcmVjaXNpb25EaWdpdHMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBGaW5kIGEgc3VmZmljaWVudGx5IHByZWNpc2UgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiBuLgorICBpbnQgZGVjaW1hbF9wb2ludDsKKyAgYm9vbCBzaWduOworICAvLyBBZGQgb25lIGZvciB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCisgIGNvbnN0IGludCBrRGVjaW1hbFJlcENhcGFjaXR5ID0ga01heFByZWNpc2lvbkRpZ2l0cyArIDE7CisgIGNoYXIgZGVjaW1hbF9yZXBba0RlY2ltYWxSZXBDYXBhY2l0eV07CisgIGludCBkZWNpbWFsX3JlcF9sZW5ndGg7CisKKyAgRG91YmxlVG9Bc2NpaSh2YWx1ZSwgUFJFQ0lTSU9OLCBwcmVjaXNpb24sCisgICAgICAgICAgICAgICAgZGVjaW1hbF9yZXAsIGtEZWNpbWFsUmVwQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgJnNpZ24sICZkZWNpbWFsX3JlcF9sZW5ndGgsICZkZWNpbWFsX3BvaW50KTsKKyAgQVNTRVJUKGRlY2ltYWxfcmVwX2xlbmd0aCA8PSBwcmVjaXNpb24pOworCisgIGJvb2wgdW5pcXVlX3plcm8gPSAoKGZsYWdzXyAmIFVOSVFVRV9aRVJPKSAhPSAwKTsKKyAgaWYgKHNpZ24gJiYgKHZhbHVlICE9IDAuMCB8fCAhdW5pcXVlX3plcm8pKSB7CisgICAgcmVzdWx0X2J1aWxkZXItPkFkZENoYXJhY3RlcignLScpOworICB9CisKKyAgLy8gVGhlIGV4cG9uZW50IGlmIHdlIHByaW50IHRoZSBudW1iZXIgYXMgeC54eGV5eXkuIFRoYXQgaXMgd2l0aCB0aGUKKyAgLy8gZGVjaW1hbCBwb2ludCBhZnRlciB0aGUgZmlyc3QgZGlnaXQuCisgIGludCBleHBvbmVudCA9IGRlY2ltYWxfcG9pbnQgLSAxOworCisgIGludCBleHRyYV96ZXJvID0gKChmbGFnc18gJiBFTUlUX1RSQUlMSU5HX1pFUk9fQUZURVJfUE9JTlQpICE9IDApID8gMSA6IDA7CisgIGlmICgoLWRlY2ltYWxfcG9pbnQgKyAxID4gbWF4X2xlYWRpbmdfcGFkZGluZ196ZXJvZXNfaW5fcHJlY2lzaW9uX21vZGVfKSB8fAorICAgICAgKGRlY2ltYWxfcG9pbnQgLSBwcmVjaXNpb24gKyBleHRyYV96ZXJvID4KKyAgICAgICBtYXhfdHJhaWxpbmdfcGFkZGluZ196ZXJvZXNfaW5fcHJlY2lzaW9uX21vZGVfKSkgeworICAgIC8vIEZpbGwgYnVmZmVyIHRvIGNvbnRhaW4gJ3ByZWNpc2lvbicgZGlnaXRzLgorICAgIC8vIFVzdWFsbHkgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGF0IHRoZSBjb3JyZWN0IGxlbmd0aCwgYnV0ICdEb3VibGVUb0FzY2lpJworICAgIC8vIGlzIGFsbG93ZWQgdG8gcmV0dXJuIGxlc3MgY2hhcmFjdGVycy4KKyAgICBmb3IgKGludCBpID0gZGVjaW1hbF9yZXBfbGVuZ3RoOyBpIDwgcHJlY2lzaW9uOyArK2kpIHsKKyAgICAgIGRlY2ltYWxfcmVwW2ldID0gJzAnOworICAgIH0KKworICAgIENyZWF0ZUV4cG9uZW50aWFsUmVwcmVzZW50YXRpb24oZGVjaW1hbF9yZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9idWlsZGVyKTsKKyAgfSBlbHNlIHsKKyAgICBDcmVhdGVEZWNpbWFsUmVwcmVzZW50YXRpb24oZGVjaW1hbF9yZXAsIGRlY2ltYWxfcmVwX2xlbmd0aCwgZGVjaW1hbF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4KDAsIHByZWNpc2lvbiAtIGRlY2ltYWxfcG9pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfYnVpbGRlcik7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKworc3RhdGljIEJpZ251bUR0b2FNb2RlIER0b2FUb0JpZ251bUR0b2FNb2RlKAorICAgIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpEdG9hTW9kZSBkdG9hX21vZGUpIHsKKyAgc3dpdGNoIChkdG9hX21vZGUpIHsKKyAgICBjYXNlIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpTSE9SVEVTVDogIHJldHVybiBCSUdOVU1fRFRPQV9TSE9SVEVTVDsKKyAgICBjYXNlIERvdWJsZVRvU3RyaW5nQ29udmVydGVyOjpTSE9SVEVTVF9TSU5HTEU6CisgICAgICAgIHJldHVybiBCSUdOVU1fRFRPQV9TSE9SVEVTVF9TSU5HTEU7CisgICAgY2FzZSBEb3VibGVUb1N0cmluZ0NvbnZlcnRlcjo6RklYRUQ6ICAgICByZXR1cm4gQklHTlVNX0RUT0FfRklYRUQ7CisgICAgY2FzZSBEb3VibGVUb1N0cmluZ0NvbnZlcnRlcjo6UFJFQ0lTSU9OOiByZXR1cm4gQklHTlVNX0RUT0FfUFJFQ0lTSU9OOworICAgIGRlZmF1bHQ6CisgICAgICBVTlJFQUNIQUJMRSgpOworICAgICAgcmV0dXJuIEJJR05VTV9EVE9BX1NIT1JURVNUOyAgLy8gVG8gc2lsZW5jZSBjb21waWxlci4KKyAgfQorfQorCisKK3ZvaWQgRG91YmxlVG9TdHJpbmdDb252ZXJ0ZXI6OkRvdWJsZVRvQXNjaWkoZG91YmxlIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER0b2FNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXF1ZXN0ZWRfZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwb2ludCkgeworICBWZWN0b3I8Y2hhcj4gdmVjdG9yKGJ1ZmZlciwgYnVmZmVyX2xlbmd0aCk7CisgIEFTU0VSVCghRG91YmxlKHYpLklzU3BlY2lhbCgpKTsKKyAgQVNTRVJUKG1vZGUgPT0gU0hPUlRFU1QgfHwgbW9kZSA9PSBTSE9SVEVTVF9TSU5HTEUgfHwgcmVxdWVzdGVkX2RpZ2l0cyA+PSAwKTsKKworICBpZiAoRG91YmxlKHYpLlNpZ24oKSA8IDApIHsKKyAgICAqc2lnbiA9IHRydWU7CisgICAgdiA9IC12OworICB9IGVsc2UgeworICAgICpzaWduID0gZmFsc2U7CisgIH0KKworICBpZiAobW9kZSA9PSBQUkVDSVNJT04gJiYgcmVxdWVzdGVkX2RpZ2l0cyA9PSAwKSB7CisgICAgdmVjdG9yWzBdID0gJ1wwJzsKKyAgICAqbGVuZ3RoID0gMDsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAodiA9PSAwKSB7CisgICAgdmVjdG9yWzBdID0gJzAnOworICAgIHZlY3RvclsxXSA9ICdcMCc7CisgICAgKmxlbmd0aCA9IDE7CisgICAgKnBvaW50ID0gMTsKKyAgICByZXR1cm47CisgIH0KKworICBib29sIGZhc3Rfd29ya2VkOworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFNIT1JURVNUOgorICAgICAgZmFzdF93b3JrZWQgPSBGYXN0RHRvYSh2LCBGQVNUX0RUT0FfU0hPUlRFU1QsIDAsIHZlY3RvciwgbGVuZ3RoLCBwb2ludCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIT1JURVNUX1NJTkdMRToKKyAgICAgIGZhc3Rfd29ya2VkID0gRmFzdER0b2EodiwgRkFTVF9EVE9BX1NIT1JURVNUX1NJTkdMRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yLCBsZW5ndGgsIHBvaW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklYRUQ6CisgICAgICBmYXN0X3dvcmtlZCA9IEZhc3RGaXhlZER0b2EodiwgcmVxdWVzdGVkX2RpZ2l0cywgdmVjdG9yLCBsZW5ndGgsIHBvaW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJFQ0lTSU9OOgorICAgICAgZmFzdF93b3JrZWQgPSBGYXN0RHRvYSh2LCBGQVNUX0RUT0FfUFJFQ0lTSU9OLCByZXF1ZXN0ZWRfZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IsIGxlbmd0aCwgcG9pbnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIFVOUkVBQ0hBQkxFKCk7CisgICAgICBmYXN0X3dvcmtlZCA9IGZhbHNlOworICB9CisgIGlmIChmYXN0X3dvcmtlZCkgcmV0dXJuOworCisgIC8vIElmIHRoZSBmYXN0IGR0b2EgZGlkbid0IHN1Y2NlZWQgdXNlIHRoZSBzbG93ZXIgYmlnbnVtIHZlcnNpb24uCisgIEJpZ251bUR0b2FNb2RlIGJpZ251bV9tb2RlID0gRHRvYVRvQmlnbnVtRHRvYU1vZGUobW9kZSk7CisgIEJpZ251bUR0b2EodiwgYmlnbnVtX21vZGUsIHJlcXVlc3RlZF9kaWdpdHMsIHZlY3RvciwgbGVuZ3RoLCBwb2ludCk7CisgIHZlY3RvclsqbGVuZ3RoXSA9ICdcMCc7Cit9CisKKworLy8gQ29uc3VtZXMgdGhlIGdpdmVuIHN1YnN0cmluZyBmcm9tIHRoZSBpdGVyYXRvci4KKy8vIFJldHVybnMgZmFsc2UsIGlmIHRoZSBzdWJzdHJpbmcgZG9lcyBub3QgbWF0Y2guCitzdGF0aWMgYm9vbCBDb25zdW1lU3ViU3RyaW5nKGNvbnN0IGNoYXIqKiBjdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YnN0cmluZykgeworICBBU1NFUlQoKipjdXJyZW50ID09ICpzdWJzdHJpbmcpOworICBmb3IgKHN1YnN0cmluZysrOyAqc3Vic3RyaW5nICE9ICdcMCc7IHN1YnN0cmluZysrKSB7CisgICAgKysqY3VycmVudDsKKyAgICBpZiAoKmN1cnJlbnQgPT0gZW5kIHx8ICoqY3VycmVudCAhPSAqc3Vic3RyaW5nKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgKysqY3VycmVudDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8gTWF4aW11bSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIGluIGRlY2ltYWwgcmVwcmVzZW50YXRpb24uCisvLyBUaGUgbG9uZ2VzdCBwb3NzaWJsZSBkb3VibGUgaW4gZGVjaW1hbCByZXByZXNlbnRhdGlvbiBpcworLy8gKDJeNTMgLSAxKSAqIDIgXiAtMTA3NCB0aGF0IGlzICgyIF4gNTMgLSAxKSAqIDUgXiAxMDc0IC8gMTAgXiAxMDc0CisvLyAoNzY4IGRpZ2l0cykuIElmIHdlIHBhcnNlIGEgbnVtYmVyIHdob3NlIGZpcnN0IGRpZ2l0cyBhcmUgZXF1YWwgdG8gYQorLy8gbWVhbiBvZiAyIGFkamFjZW50IGRvdWJsZXMgKHRoYXQgY291bGQgaGF2ZSB1cCB0byA3NjkgZGlnaXRzKSB0aGUgcmVzdWx0CisvLyBtdXN0IGJlIHJvdW5kZWQgdG8gdGhlIGJpZ2dlciBvbmUgdW5sZXNzIHRoZSB0YWlsIGNvbnNpc3RzIG9mIHplcm9zLCBzbworLy8gd2UgZG9uJ3QgbmVlZCB0byBwcmVzZXJ2ZSBhbGwgdGhlIGRpZ2l0cy4KK2NvbnN0IGludCBrTWF4U2lnbmlmaWNhbnREaWdpdHMgPSA3NzI7CisKKworLy8gUmV0dXJucyB0cnVlIGlmIGEgbm9uc3BhY2UgZm91bmQgYW5kIGZhbHNlIGlmIHRoZSBlbmQgaGFzIHJlYWNoZWQuCitzdGF0aWMgaW5saW5lIGJvb2wgQWR2YW5jZVRvTm9uc3BhY2UoY29uc3QgY2hhcioqIGN1cnJlbnQsIGNvbnN0IGNoYXIqIGVuZCkgeworICB3aGlsZSAoKmN1cnJlbnQgIT0gZW5kKSB7CisgICAgaWYgKCoqY3VycmVudCAhPSAnICcpIHJldHVybiB0cnVlOworICAgICsrKmN1cnJlbnQ7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisKK3N0YXRpYyBib29sIGlzRGlnaXQoaW50IHgsIGludCByYWRpeCkgeworICByZXR1cm4gKHggPj0gJzAnICYmIHggPD0gJzknICYmIHggPCAnMCcgKyByYWRpeCkKKyAgICAgIHx8IChyYWRpeCA+IDEwICYmIHggPj0gJ2EnICYmIHggPCAnYScgKyByYWRpeCAtIDEwKQorICAgICAgfHwgKHJhZGl4ID4gMTAgJiYgeCA+PSAnQScgJiYgeCA8ICdBJyArIHJhZGl4IC0gMTApOworfQorCisKK3N0YXRpYyBkb3VibGUgU2lnbmVkWmVybyhib29sIHNpZ24pIHsKKyAgcmV0dXJuIHNpZ24gPyAtMC4wIDogMC4wOworfQorCisKKy8vIFBhcnNpbmcgaW50ZWdlcnMgd2l0aCByYWRpeCAyLCA0LCA4LCAxNiwgMzIuIEFzc3VtZXMgY3VycmVudCAhPSBlbmQuCit0ZW1wbGF0ZSA8aW50IHJhZGl4X2xvZ18yPgorc3RhdGljIGRvdWJsZSBSYWRpeFN0cmluZ1RvSWVlZShjb25zdCBjaGFyKiBjdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd190cmFpbGluZ19qdW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUganVua19zdHJpbmdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZF9hc19kb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiB0cmFpbGluZ19wb2ludGVyKSB7CisgIEFTU0VSVChjdXJyZW50ICE9IGVuZCk7CisKKyAgY29uc3QgaW50IGtEb3VibGVTaXplID0gRG91YmxlOjprU2lnbmlmaWNhbmRTaXplOworICBjb25zdCBpbnQga1NpbmdsZVNpemUgPSBTaW5nbGU6OmtTaWduaWZpY2FuZFNpemU7CisgIGNvbnN0IGludCBrU2lnbmlmaWNhbmRTaXplID0gcmVhZF9hc19kb3VibGU/IGtEb3VibGVTaXplOiBrU2luZ2xlU2l6ZTsKKworICAvLyBTa2lwIGxlYWRpbmcgMHMuCisgIHdoaWxlICgqY3VycmVudCA9PSAnMCcpIHsKKyAgICArK2N1cnJlbnQ7CisgICAgaWYgKGN1cnJlbnQgPT0gZW5kKSB7CisgICAgICAqdHJhaWxpbmdfcG9pbnRlciA9IGVuZDsKKyAgICAgIHJldHVybiBTaWduZWRaZXJvKHNpZ24pOworICAgIH0KKyAgfQorCisgIGludDY0X3QgbnVtYmVyID0gMDsKKyAgaW50IGV4cG9uZW50ID0gMDsKKyAgY29uc3QgaW50IHJhZGl4ID0gKDEgPDwgcmFkaXhfbG9nXzIpOworCisgIGRvIHsKKyAgICBpbnQgZGlnaXQ7CisgICAgaWYgKCpjdXJyZW50ID49ICcwJyAmJiAqY3VycmVudCA8PSAnOScgJiYgKmN1cnJlbnQgPCAnMCcgKyByYWRpeCkgeworICAgICAgZGlnaXQgPSBzdGF0aWNfY2FzdDxjaGFyPigqY3VycmVudCkgLSAnMCc7CisgICAgfSBlbHNlIGlmIChyYWRpeCA+IDEwICYmICpjdXJyZW50ID49ICdhJyAmJiAqY3VycmVudCA8ICdhJyArIHJhZGl4IC0gMTApIHsKKyAgICAgIGRpZ2l0ID0gc3RhdGljX2Nhc3Q8Y2hhcj4oKmN1cnJlbnQpIC0gJ2EnICsgMTA7CisgICAgfSBlbHNlIGlmIChyYWRpeCA+IDEwICYmICpjdXJyZW50ID49ICdBJyAmJiAqY3VycmVudCA8ICdBJyArIHJhZGl4IC0gMTApIHsKKyAgICAgIGRpZ2l0ID0gc3RhdGljX2Nhc3Q8Y2hhcj4oKmN1cnJlbnQpIC0gJ0EnICsgMTA7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChhbGxvd190cmFpbGluZ19qdW5rIHx8ICFBZHZhbmNlVG9Ob25zcGFjZSgmY3VycmVudCwgZW5kKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBudW1iZXIgPSBudW1iZXIgKiByYWRpeCArIGRpZ2l0OworICAgIGludCBvdmVyZmxvdyA9IHN0YXRpY19jYXN0PGludD4obnVtYmVyID4+IGtTaWduaWZpY2FuZFNpemUpOworICAgIGlmIChvdmVyZmxvdyAhPSAwKSB7CisgICAgICAvLyBPdmVyZmxvdyBvY2N1cnJlZC4gTmVlZCB0byBkZXRlcm1pbmUgd2hpY2ggZGlyZWN0aW9uIHRvIHJvdW5kIHRoZQorICAgICAgLy8gcmVzdWx0LgorICAgICAgaW50IG92ZXJmbG93X2JpdHNfY291bnQgPSAxOworICAgICAgd2hpbGUgKG92ZXJmbG93ID4gMSkgeworICAgICAgICBvdmVyZmxvd19iaXRzX2NvdW50Kys7CisgICAgICAgIG92ZXJmbG93ID4+PSAxOworICAgICAgfQorCisgICAgICBpbnQgZHJvcHBlZF9iaXRzX21hc2sgPSAoKDEgPDwgb3ZlcmZsb3dfYml0c19jb3VudCkgLSAxKTsKKyAgICAgIGludCBkcm9wcGVkX2JpdHMgPSBzdGF0aWNfY2FzdDxpbnQ+KG51bWJlcikgJiBkcm9wcGVkX2JpdHNfbWFzazsKKyAgICAgIG51bWJlciA+Pj0gb3ZlcmZsb3dfYml0c19jb3VudDsKKyAgICAgIGV4cG9uZW50ID0gb3ZlcmZsb3dfYml0c19jb3VudDsKKworICAgICAgYm9vbCB6ZXJvX3RhaWwgPSB0cnVlOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgKytjdXJyZW50OworICAgICAgICBpZiAoY3VycmVudCA9PSBlbmQgfHwgIWlzRGlnaXQoKmN1cnJlbnQsIHJhZGl4KSkgYnJlYWs7CisgICAgICAgIHplcm9fdGFpbCA9IHplcm9fdGFpbCAmJiAqY3VycmVudCA9PSAnMCc7CisgICAgICAgIGV4cG9uZW50ICs9IHJhZGl4X2xvZ18yOworICAgICAgfQorCisgICAgICBpZiAoIWFsbG93X3RyYWlsaW5nX2p1bmsgJiYgQWR2YW5jZVRvTm9uc3BhY2UoJmN1cnJlbnQsIGVuZCkpIHsKKyAgICAgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlOworICAgICAgfQorCisgICAgICBpbnQgbWlkZGxlX3ZhbHVlID0gKDEgPDwgKG92ZXJmbG93X2JpdHNfY291bnQgLSAxKSk7CisgICAgICBpZiAoZHJvcHBlZF9iaXRzID4gbWlkZGxlX3ZhbHVlKSB7CisgICAgICAgIG51bWJlcisrOyAgLy8gUm91bmRpbmcgdXAuCisgICAgICB9IGVsc2UgaWYgKGRyb3BwZWRfYml0cyA9PSBtaWRkbGVfdmFsdWUpIHsKKyAgICAgICAgLy8gUm91bmRpbmcgdG8gZXZlbiB0byBjb25zaXN0ZW5jeSB3aXRoIGRlY2ltYWxzOiBoYWxmLXdheSBjYXNlIHJvdW5kcworICAgICAgICAvLyB1cCBpZiBzaWduaWZpY2FudCBwYXJ0IGlzIG9kZCBhbmQgZG93biBvdGhlcndpc2UuCisgICAgICAgIGlmICgobnVtYmVyICYgMSkgIT0gMCB8fCAhemVyb190YWlsKSB7CisgICAgICAgICAgbnVtYmVyKys7ICAvLyBSb3VuZGluZyB1cC4KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBSb3VuZGluZyB1cCBtYXkgY2F1c2Ugb3ZlcmZsb3cuCisgICAgICBpZiAoKG51bWJlciAmICgoaW50NjRfdCkxIDw8IGtTaWduaWZpY2FuZFNpemUpKSAhPSAwKSB7CisgICAgICAgIGV4cG9uZW50Kys7CisgICAgICAgIG51bWJlciA+Pj0gMTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICArK2N1cnJlbnQ7CisgIH0gd2hpbGUgKGN1cnJlbnQgIT0gZW5kKTsKKworICBBU1NFUlQobnVtYmVyIDwgKChpbnQ2NF90KTEgPDwga1NpZ25pZmljYW5kU2l6ZSkpOworICBBU1NFUlQoc3RhdGljX2Nhc3Q8aW50NjRfdD4oc3RhdGljX2Nhc3Q8ZG91YmxlPihudW1iZXIpKSA9PSBudW1iZXIpOworCisgICp0cmFpbGluZ19wb2ludGVyID0gY3VycmVudDsKKworICBpZiAoZXhwb25lbnQgPT0gMCkgeworICAgIGlmIChzaWduKSB7CisgICAgICBpZiAobnVtYmVyID09IDApIHJldHVybiAtMC4wOworICAgICAgbnVtYmVyID0gLW51bWJlcjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obnVtYmVyKTsKKyAgfQorCisgIEFTU0VSVChudW1iZXIgIT0gMCk7CisgIHJldHVybiBEb3VibGUoRGl5RnAobnVtYmVyLCBleHBvbmVudCkpLnZhbHVlKCk7Cit9CisKKworZG91YmxlIFN0cmluZ1RvRG91YmxlQ29udmVydGVyOjpTdHJpbmdUb0llZWUoCisgICAgY29uc3QgY2hhciogaW5wdXQsCisgICAgaW50IGxlbmd0aCwKKyAgICBpbnQqIHByb2Nlc3NlZF9jaGFyYWN0ZXJzX2NvdW50LAorICAgIGJvb2wgcmVhZF9hc19kb3VibGUpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY3VycmVudCA9IGlucHV0OworICBjb25zdCBjaGFyKiBlbmQgPSBpbnB1dCArIGxlbmd0aDsKKworICAqcHJvY2Vzc2VkX2NoYXJhY3RlcnNfY291bnQgPSAwOworCisgIGNvbnN0IGJvb2wgYWxsb3dfdHJhaWxpbmdfanVuayA9IChmbGFnc18gJiBBTExPV19UUkFJTElOR19KVU5LKSAhPSAwOworICBjb25zdCBib29sIGFsbG93X2xlYWRpbmdfc3BhY2VzID0gKGZsYWdzXyAmIEFMTE9XX0xFQURJTkdfU1BBQ0VTKSAhPSAwOworICBjb25zdCBib29sIGFsbG93X3RyYWlsaW5nX3NwYWNlcyA9IChmbGFnc18gJiBBTExPV19UUkFJTElOR19TUEFDRVMpICE9IDA7CisgIGNvbnN0IGJvb2wgYWxsb3dfc3BhY2VzX2FmdGVyX3NpZ24gPSAoZmxhZ3NfICYgQUxMT1dfU1BBQ0VTX0FGVEVSX1NJR04pICE9IDA7CisKKyAgLy8gVG8gbWFrZSBzdXJlIHRoYXQgaXRlcmF0b3IgZGVyZWZlcmVuY2luZyBpcyB2YWxpZCB0aGUgZm9sbG93aW5nCisgIC8vIGNvbnZlbnRpb24gaXMgdXNlZDoKKyAgLy8gMS4gRWFjaCAnKytjdXJyZW50JyBzdGF0ZW1lbnQgaXMgZm9sbG93ZWQgYnkgY2hlY2sgZm9yIGVxdWFsaXR5IHRvICdlbmQnLgorICAvLyAyLiBJZiBBZHZhbmNlVG9Ob25zcGFjZSByZXR1cm5lZCBmYWxzZSB0aGVuIGN1cnJlbnQgPT0gZW5kLgorICAvLyAzLiBJZiAnY3VycmVudCcgYmVjb21lcyBlcXVhbCB0byAnZW5kJyB0aGUgZnVuY3Rpb24gcmV0dXJucyBvciBnb2VzIHRvCisgIC8vICdwYXJzaW5nX2RvbmUnLgorICAvLyA0LiAnY3VycmVudCcgaXMgbm90IGRlcmVmZXJlbmNlZCBhZnRlciB0aGUgJ3BhcnNpbmdfZG9uZScgbGFiZWwuCisgIC8vIDUuIENvZGUgYmVmb3JlICdwYXJzaW5nX2RvbmUnIG1heSByZWx5IG9uICdjdXJyZW50ICE9IGVuZCcuCisgIGlmIChjdXJyZW50ID09IGVuZCkgcmV0dXJuIGVtcHR5X3N0cmluZ192YWx1ZV87CisKKyAgaWYgKGFsbG93X2xlYWRpbmdfc3BhY2VzIHx8IGFsbG93X3RyYWlsaW5nX3NwYWNlcykgeworICAgIGlmICghQWR2YW5jZVRvTm9uc3BhY2UoJmN1cnJlbnQsIGVuZCkpIHsKKyAgICAgICpwcm9jZXNzZWRfY2hhcmFjdGVyc19jb3VudCA9IGN1cnJlbnQgLSBpbnB1dDsKKyAgICAgIHJldHVybiBlbXB0eV9zdHJpbmdfdmFsdWVfOworICAgIH0KKyAgICBpZiAoIWFsbG93X2xlYWRpbmdfc3BhY2VzICYmIChpbnB1dCAhPSBjdXJyZW50KSkgeworICAgICAgLy8gTm8gbGVhZGluZyBzcGFjZXMgYWxsb3dlZCwgYnV0IEFkdmFuY2VUb05vbnNwYWNlIG1vdmVkIGZvcndhcmQuCisgICAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOworICAgIH0KKyAgfQorCisgIC8vIFRoZSBsb25nZXN0IGZvcm0gb2Ygc2ltcGxpZmllZCBudW1iZXIgaXM6ICItPHNpZ25pZmljYW50IGRpZ2l0cz4uMWVYWFhcMCIuCisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IGtNYXhTaWduaWZpY2FudERpZ2l0cyArIDEwOworICBjaGFyIGJ1ZmZlcltrQnVmZmVyU2l6ZV07ICAvLyBOT0xJTlQ6IHNpemUgaXMga25vd24gYXQgY29tcGlsZSB0aW1lLgorICBpbnQgYnVmZmVyX3BvcyA9IDA7CisKKyAgLy8gRXhwb25lbnQgd2lsbCBiZSBhZGp1c3RlZCBpZiBpbnNpZ25pZmljYW50IGRpZ2l0cyBvZiB0aGUgaW50ZWdlciBwYXJ0CisgIC8vIG9yIGluc2lnbmlmaWNhbnQgbGVhZGluZyB6ZXJvcyBvZiB0aGUgZnJhY3Rpb25hbCBwYXJ0IGFyZSBkcm9wcGVkLgorICBpbnQgZXhwb25lbnQgPSAwOworICBpbnQgc2lnbmlmaWNhbnRfZGlnaXRzID0gMDsKKyAgaW50IGluc2lnbmlmaWNhbnRfZGlnaXRzID0gMDsKKyAgYm9vbCBub256ZXJvX2RpZ2l0X2Ryb3BwZWQgPSBmYWxzZTsKKworICBib29sIHNpZ24gPSBmYWxzZTsKKworICBpZiAoKmN1cnJlbnQgPT0gJysnIHx8ICpjdXJyZW50ID09ICctJykgeworICAgIHNpZ24gPSAoKmN1cnJlbnQgPT0gJy0nKTsKKyAgICArK2N1cnJlbnQ7CisgICAgY29uc3QgY2hhciogbmV4dF9ub25fc3BhY2UgPSBjdXJyZW50OworICAgIC8vIFNraXAgZm9sbG93aW5nIHNwYWNlcyAoaWYgYWxsb3dlZCkuCisgICAgaWYgKCFBZHZhbmNlVG9Ob25zcGFjZSgmbmV4dF9ub25fc3BhY2UsIGVuZCkpIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZV87CisgICAgaWYgKCFhbGxvd19zcGFjZXNfYWZ0ZXJfc2lnbiAmJiAoY3VycmVudCAhPSBuZXh0X25vbl9zcGFjZSkpIHsKKyAgICAgIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZV87CisgICAgfQorICAgIGN1cnJlbnQgPSBuZXh0X25vbl9zcGFjZTsKKyAgfQorCisgIGlmIChpbmZpbml0eV9zeW1ib2xfICE9IE5VTEwpIHsKKyAgICBpZiAoKmN1cnJlbnQgPT0gaW5maW5pdHlfc3ltYm9sX1swXSkgeworICAgICAgaWYgKCFDb25zdW1lU3ViU3RyaW5nKCZjdXJyZW50LCBlbmQsIGluZmluaXR5X3N5bWJvbF8pKSB7CisgICAgICAgIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZV87CisgICAgICB9CisKKyAgICAgIGlmICghKGFsbG93X3RyYWlsaW5nX3NwYWNlcyB8fCBhbGxvd190cmFpbGluZ19qdW5rKSAmJiAoY3VycmVudCAhPSBlbmQpKSB7CisgICAgICAgIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZV87CisgICAgICB9CisgICAgICBpZiAoIWFsbG93X3RyYWlsaW5nX2p1bmsgJiYgQWR2YW5jZVRvTm9uc3BhY2UoJmN1cnJlbnQsIGVuZCkpIHsKKyAgICAgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKKyAgICAgIH0KKworICAgICAgQVNTRVJUKGJ1ZmZlcl9wb3MgPT0gMCk7CisgICAgICAqcHJvY2Vzc2VkX2NoYXJhY3RlcnNfY291bnQgPSBjdXJyZW50IC0gaW5wdXQ7CisgICAgICByZXR1cm4gc2lnbiA/IC1Eb3VibGU6OkluZmluaXR5KCkgOiBEb3VibGU6OkluZmluaXR5KCk7CisgICAgfQorICB9CisKKyAgaWYgKG5hbl9zeW1ib2xfICE9IE5VTEwpIHsKKyAgICBpZiAoKmN1cnJlbnQgPT0gbmFuX3N5bWJvbF9bMF0pIHsKKyAgICAgIGlmICghQ29uc3VtZVN1YlN0cmluZygmY3VycmVudCwgZW5kLCBuYW5fc3ltYm9sXykpIHsKKyAgICAgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKKyAgICAgIH0KKworICAgICAgaWYgKCEoYWxsb3dfdHJhaWxpbmdfc3BhY2VzIHx8IGFsbG93X3RyYWlsaW5nX2p1bmspICYmIChjdXJyZW50ICE9IGVuZCkpIHsKKyAgICAgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKKyAgICAgIH0KKyAgICAgIGlmICghYWxsb3dfdHJhaWxpbmdfanVuayAmJiBBZHZhbmNlVG9Ob25zcGFjZSgmY3VycmVudCwgZW5kKSkgeworICAgICAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOworICAgICAgfQorCisgICAgICBBU1NFUlQoYnVmZmVyX3BvcyA9PSAwKTsKKyAgICAgICpwcm9jZXNzZWRfY2hhcmFjdGVyc19jb3VudCA9IGN1cnJlbnQgLSBpbnB1dDsKKyAgICAgIHJldHVybiBzaWduID8gLURvdWJsZTo6TmFOKCkgOiBEb3VibGU6Ok5hTigpOworICAgIH0KKyAgfQorCisgIGJvb2wgbGVhZGluZ196ZXJvID0gZmFsc2U7CisgIGlmICgqY3VycmVudCA9PSAnMCcpIHsKKyAgICArK2N1cnJlbnQ7CisgICAgaWYgKGN1cnJlbnQgPT0gZW5kKSB7CisgICAgICAqcHJvY2Vzc2VkX2NoYXJhY3RlcnNfY291bnQgPSBjdXJyZW50IC0gaW5wdXQ7CisgICAgICByZXR1cm4gU2lnbmVkWmVybyhzaWduKTsKKyAgICB9CisKKyAgICBsZWFkaW5nX3plcm8gPSB0cnVlOworCisgICAgLy8gSXQgY291bGQgYmUgaGV4YWRlY2ltYWwgdmFsdWUuCisgICAgaWYgKChmbGFnc18gJiBBTExPV19IRVgpICYmICgqY3VycmVudCA9PSAneCcgfHwgKmN1cnJlbnQgPT0gJ1gnKSkgeworICAgICAgKytjdXJyZW50OworICAgICAgaWYgKGN1cnJlbnQgPT0gZW5kIHx8ICFpc0RpZ2l0KCpjdXJyZW50LCAxNikpIHsKKyAgICAgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsgIC8vICIweCIuCisgICAgICB9CisKKyAgICAgIGNvbnN0IGNoYXIqIHRhaWxfcG9pbnRlciA9IE5VTEw7CisgICAgICBkb3VibGUgcmVzdWx0ID0gUmFkaXhTdHJpbmdUb0llZWU8ND4oY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd190cmFpbGluZ19qdW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmtfc3RyaW5nX3ZhbHVlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2FzX2RvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFpbF9wb2ludGVyKTsKKyAgICAgIGlmICh0YWlsX3BvaW50ZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAoYWxsb3dfdHJhaWxpbmdfc3BhY2VzKSBBZHZhbmNlVG9Ob25zcGFjZSgmdGFpbF9wb2ludGVyLCBlbmQpOworICAgICAgICAqcHJvY2Vzc2VkX2NoYXJhY3RlcnNfY291bnQgPSB0YWlsX3BvaW50ZXIgLSBpbnB1dDsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gSWdub3JlIGxlYWRpbmcgemVyb3MgaW4gdGhlIGludGVnZXIgcGFydC4KKyAgICB3aGlsZSAoKmN1cnJlbnQgPT0gJzAnKSB7CisgICAgICArK2N1cnJlbnQ7CisgICAgICBpZiAoY3VycmVudCA9PSBlbmQpIHsKKyAgICAgICAgKnByb2Nlc3NlZF9jaGFyYWN0ZXJzX2NvdW50ID0gY3VycmVudCAtIGlucHV0OworICAgICAgICByZXR1cm4gU2lnbmVkWmVybyhzaWduKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBib29sIG9jdGFsID0gbGVhZGluZ196ZXJvICYmIChmbGFnc18gJiBBTExPV19PQ1RBTFMpICE9IDA7CisKKyAgLy8gQ29weSBzaWduaWZpY2FudCBkaWdpdHMgb2YgdGhlIGludGVnZXIgcGFydCAoaWYgYW55KSB0byB0aGUgYnVmZmVyLgorICB3aGlsZSAoKmN1cnJlbnQgPj0gJzAnICYmICpjdXJyZW50IDw9ICc5JykgeworICAgIGlmIChzaWduaWZpY2FudF9kaWdpdHMgPCBrTWF4U2lnbmlmaWNhbnREaWdpdHMpIHsKKyAgICAgIEFTU0VSVChidWZmZXJfcG9zIDwga0J1ZmZlclNpemUpOworICAgICAgYnVmZmVyW2J1ZmZlcl9wb3MrK10gPSBzdGF0aWNfY2FzdDxjaGFyPigqY3VycmVudCk7CisgICAgICBzaWduaWZpY2FudF9kaWdpdHMrKzsKKyAgICAgIC8vIFdpbGwgbGF0ZXIgY2hlY2sgaWYgaXQncyBhbiBvY3RhbCBpbiB0aGUgYnVmZmVyLgorICAgIH0gZWxzZSB7CisgICAgICBpbnNpZ25pZmljYW50X2RpZ2l0cysrOyAgLy8gTW92ZSB0aGUgZGlnaXQgaW50byB0aGUgZXhwb25lbnRpYWwgcGFydC4KKyAgICAgIG5vbnplcm9fZGlnaXRfZHJvcHBlZCA9IG5vbnplcm9fZGlnaXRfZHJvcHBlZCB8fCAqY3VycmVudCAhPSAnMCc7CisgICAgfQorICAgIG9jdGFsID0gb2N0YWwgJiYgKmN1cnJlbnQgPCAnOCc7CisgICAgKytjdXJyZW50OworICAgIGlmIChjdXJyZW50ID09IGVuZCkgZ290byBwYXJzaW5nX2RvbmU7CisgIH0KKworICBpZiAoc2lnbmlmaWNhbnRfZGlnaXRzID09IDApIHsKKyAgICBvY3RhbCA9IGZhbHNlOworICB9CisKKyAgaWYgKCpjdXJyZW50ID09ICcuJykgeworICAgIGlmIChvY3RhbCAmJiAhYWxsb3dfdHJhaWxpbmdfanVuaykgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKKyAgICBpZiAob2N0YWwpIGdvdG8gcGFyc2luZ19kb25lOworCisgICAgKytjdXJyZW50OworICAgIGlmIChjdXJyZW50ID09IGVuZCkgeworICAgICAgaWYgKHNpZ25pZmljYW50X2RpZ2l0cyA9PSAwICYmICFsZWFkaW5nX3plcm8pIHsKKyAgICAgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gcGFyc2luZ19kb25lOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzaWduaWZpY2FudF9kaWdpdHMgPT0gMCkgeworICAgICAgLy8gb2N0YWwgPSBmYWxzZTsKKyAgICAgIC8vIEludGVnZXIgcGFydCBjb25zaXN0cyBvZiAwIG9yIGlzIGFic2VudC4gU2lnbmlmaWNhbnQgZGlnaXRzIHN0YXJ0IGFmdGVyCisgICAgICAvLyBsZWFkaW5nIHplcm9zIChpZiBhbnkpLgorICAgICAgd2hpbGUgKCpjdXJyZW50ID09ICcwJykgeworICAgICAgICArK2N1cnJlbnQ7CisgICAgICAgIGlmIChjdXJyZW50ID09IGVuZCkgeworICAgICAgICAgICpwcm9jZXNzZWRfY2hhcmFjdGVyc19jb3VudCA9IGN1cnJlbnQgLSBpbnB1dDsKKyAgICAgICAgICByZXR1cm4gU2lnbmVkWmVybyhzaWduKTsKKyAgICAgICAgfQorICAgICAgICBleHBvbmVudC0tOyAgLy8gTW92ZSB0aGlzIDAgaW50byB0aGUgZXhwb25lbnQuCisgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlcmUgaXMgYSBmcmFjdGlvbmFsIHBhcnQuCisgICAgLy8gV2UgZG9uJ3QgZW1pdCBhICcuJywgYnV0IGFkanVzdCB0aGUgZXhwb25lbnQgaW5zdGVhZC4KKyAgICB3aGlsZSAoKmN1cnJlbnQgPj0gJzAnICYmICpjdXJyZW50IDw9ICc5JykgeworICAgICAgaWYgKHNpZ25pZmljYW50X2RpZ2l0cyA8IGtNYXhTaWduaWZpY2FudERpZ2l0cykgeworICAgICAgICBBU1NFUlQoYnVmZmVyX3BvcyA8IGtCdWZmZXJTaXplKTsKKyAgICAgICAgYnVmZmVyW2J1ZmZlcl9wb3MrK10gPSBzdGF0aWNfY2FzdDxjaGFyPigqY3VycmVudCk7CisgICAgICAgIHNpZ25pZmljYW50X2RpZ2l0cysrOworICAgICAgICBleHBvbmVudC0tOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWdub3JlIGluc2lnbmlmaWNhbnQgZGlnaXRzIGluIHRoZSBmcmFjdGlvbmFsIHBhcnQuCisgICAgICAgIG5vbnplcm9fZGlnaXRfZHJvcHBlZCA9IG5vbnplcm9fZGlnaXRfZHJvcHBlZCB8fCAqY3VycmVudCAhPSAnMCc7CisgICAgICB9CisgICAgICArK2N1cnJlbnQ7CisgICAgICBpZiAoY3VycmVudCA9PSBlbmQpIGdvdG8gcGFyc2luZ19kb25lOworICAgIH0KKyAgfQorCisgIGlmICghbGVhZGluZ196ZXJvICYmIGV4cG9uZW50ID09IDAgJiYgc2lnbmlmaWNhbnRfZGlnaXRzID09IDApIHsKKyAgICAvLyBJZiBsZWFkaW5nX3plcm9zIGlzIHRydWUgdGhlbiB0aGUgc3RyaW5nIGNvbnRhaW5zIHplcm9zLgorICAgIC8vIElmIGV4cG9uZW50IDwgMCB0aGVuIHN0cmluZyB3YXMgWystXVwuMCouLi4KKyAgICAvLyBJZiBzaWduaWZpY2FudF9kaWdpdHMgIT0gMCB0aGUgc3RyaW5nIGlzIG5vdCBlcXVhbCB0byAwLgorICAgIC8vIE90aGVyd2lzZSB0aGVyZSBhcmUgbm8gZGlnaXRzIGluIHRoZSBzdHJpbmcuCisgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKKyAgfQorCisgIC8vIFBhcnNlIGV4cG9uZW50aWFsIHBhcnQuCisgIGlmICgqY3VycmVudCA9PSAnZScgfHwgKmN1cnJlbnQgPT0gJ0UnKSB7CisgICAgaWYgKG9jdGFsICYmICFhbGxvd190cmFpbGluZ19qdW5rKSByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOworICAgIGlmIChvY3RhbCkgZ290byBwYXJzaW5nX2RvbmU7CisgICAgKytjdXJyZW50OworICAgIGlmIChjdXJyZW50ID09IGVuZCkgeworICAgICAgaWYgKGFsbG93X3RyYWlsaW5nX2p1bmspIHsKKyAgICAgICAgZ290byBwYXJzaW5nX2RvbmU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOworICAgICAgfQorICAgIH0KKyAgICBjaGFyIHNpZ24gPSAnKyc7CisgICAgaWYgKCpjdXJyZW50ID09ICcrJyB8fCAqY3VycmVudCA9PSAnLScpIHsKKyAgICAgIHNpZ24gPSBzdGF0aWNfY2FzdDxjaGFyPigqY3VycmVudCk7CisgICAgICArK2N1cnJlbnQ7CisgICAgICBpZiAoY3VycmVudCA9PSBlbmQpIHsKKyAgICAgICAgaWYgKGFsbG93X3RyYWlsaW5nX2p1bmspIHsKKyAgICAgICAgICBnb3RvIHBhcnNpbmdfZG9uZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4ganVua19zdHJpbmdfdmFsdWVfOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJlbnQgPT0gZW5kIHx8ICpjdXJyZW50IDwgJzAnIHx8ICpjdXJyZW50ID4gJzknKSB7CisgICAgICBpZiAoYWxsb3dfdHJhaWxpbmdfanVuaykgeworICAgICAgICBnb3RvIHBhcnNpbmdfZG9uZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZV87CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QgaW50IG1heF9leHBvbmVudCA9IElOVF9NQVggLyAyOworICAgIEFTU0VSVCgtbWF4X2V4cG9uZW50IC8gMiA8PSBleHBvbmVudCAmJiBleHBvbmVudCA8PSBtYXhfZXhwb25lbnQgLyAyKTsKKyAgICBpbnQgbnVtID0gMDsKKyAgICBkbyB7CisgICAgICAvLyBDaGVjayBvdmVyZmxvdy4KKyAgICAgIGludCBkaWdpdCA9ICpjdXJyZW50IC0gJzAnOworICAgICAgaWYgKG51bSA+PSBtYXhfZXhwb25lbnQgLyAxMAorICAgICAgICAgICYmICEobnVtID09IG1heF9leHBvbmVudCAvIDEwICYmIGRpZ2l0IDw9IG1heF9leHBvbmVudCAlIDEwKSkgeworICAgICAgICBudW0gPSBtYXhfZXhwb25lbnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBudW0gPSBudW0gKiAxMCArIGRpZ2l0OworICAgICAgfQorICAgICAgKytjdXJyZW50OworICAgIH0gd2hpbGUgKGN1cnJlbnQgIT0gZW5kICYmICpjdXJyZW50ID49ICcwJyAmJiAqY3VycmVudCA8PSAnOScpOworCisgICAgZXhwb25lbnQgKz0gKHNpZ24gPT0gJy0nID8gLW51bSA6IG51bSk7CisgIH0KKworICBpZiAoIShhbGxvd190cmFpbGluZ19zcGFjZXMgfHwgYWxsb3dfdHJhaWxpbmdfanVuaykgJiYgKGN1cnJlbnQgIT0gZW5kKSkgeworICAgIHJldHVybiBqdW5rX3N0cmluZ192YWx1ZV87CisgIH0KKyAgaWYgKCFhbGxvd190cmFpbGluZ19qdW5rICYmIEFkdmFuY2VUb05vbnNwYWNlKCZjdXJyZW50LCBlbmQpKSB7CisgICAgcmV0dXJuIGp1bmtfc3RyaW5nX3ZhbHVlXzsKKyAgfQorICBpZiAoYWxsb3dfdHJhaWxpbmdfc3BhY2VzKSB7CisgICAgQWR2YW5jZVRvTm9uc3BhY2UoJmN1cnJlbnQsIGVuZCk7CisgIH0KKworICBwYXJzaW5nX2RvbmU6CisgIGV4cG9uZW50ICs9IGluc2lnbmlmaWNhbnRfZGlnaXRzOworCisgIGlmIChvY3RhbCkgeworICAgIGRvdWJsZSByZXN1bHQ7CisgICAgY29uc3QgY2hhciogdGFpbF9wb2ludGVyID0gTlVMTDsKKyAgICByZXN1bHQgPSBSYWRpeFN0cmluZ1RvSWVlZTwzPihidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyICsgYnVmZmVyX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3RyYWlsaW5nX2p1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVua19zdHJpbmdfdmFsdWVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYXNfZG91YmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWlsX3BvaW50ZXIpOworICAgIEFTU0VSVCh0YWlsX3BvaW50ZXIgIT0gTlVMTCk7CisgICAgKnByb2Nlc3NlZF9jaGFyYWN0ZXJzX2NvdW50ID0gY3VycmVudCAtIGlucHV0OworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBpZiAobm9uemVyb19kaWdpdF9kcm9wcGVkKSB7CisgICAgYnVmZmVyW2J1ZmZlcl9wb3MrK10gPSAnMSc7CisgICAgZXhwb25lbnQtLTsKKyAgfQorCisgIEFTU0VSVChidWZmZXJfcG9zIDwga0J1ZmZlclNpemUpOworICBidWZmZXJbYnVmZmVyX3Bvc10gPSAnXDAnOworCisgIGRvdWJsZSBjb252ZXJ0ZWQ7CisgIGlmIChyZWFkX2FzX2RvdWJsZSkgeworICAgIGNvbnZlcnRlZCA9IFN0cnRvZChWZWN0b3I8Y29uc3QgY2hhcj4oYnVmZmVyLCBidWZmZXJfcG9zKSwgZXhwb25lbnQpOworICB9IGVsc2UgeworICAgIGNvbnZlcnRlZCA9IFN0cnRvZihWZWN0b3I8Y29uc3QgY2hhcj4oYnVmZmVyLCBidWZmZXJfcG9zKSwgZXhwb25lbnQpOworICB9CisgICpwcm9jZXNzZWRfY2hhcmFjdGVyc19jb3VudCA9IGN1cnJlbnQgLSBpbnB1dDsKKyAgcmV0dXJuIHNpZ24/IC1jb252ZXJ0ZWQ6IGNvbnZlcnRlZDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGRvdWJsZV9jb252ZXJzaW9uCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9kb3VibGUtY29udmVyc2lvbi5oIGIvc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZG91YmxlLWNvbnZlcnNpb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZG91YmxlLWNvbnZlcnNpb24uaApyZW5hbWUgdG8gc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZG91YmxlLWNvbnZlcnNpb24uaApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZmFzdC1kdG9hLmNjIGIvc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZmFzdC1kdG9hLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9mYXN0LWR0b2EuY2MKcmVuYW1lIHRvIHNyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2Zhc3QtZHRvYS5jYwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZmFzdC1kdG9hLmggYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9mYXN0LWR0b2EuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZmFzdC1kdG9hLmgKcmVuYW1lIHRvIHNyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2Zhc3QtZHRvYS5oCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9maXhlZC1kdG9hLmNjIGIvc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZml4ZWQtZHRvYS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzFhOTUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZml4ZWQtZHRvYS5jYwpAQCAtMCwwICsxLDQwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTAgdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworLy8gICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisvLyAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKy8vICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJmaXhlZC1kdG9hLmgiCisjaW5jbHVkZSAiaWVlZS5oIgorCituYW1lc3BhY2UgZG91YmxlX2NvbnZlcnNpb24geworCisvLyBSZXByZXNlbnRzIGEgMTI4Yml0IHR5cGUuIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgbmF0aXZlIHR5cGUgb24KKy8vIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgMTI4Yml0IGludGVnZXJzLgorY2xhc3MgVUludDEyOCB7CisgcHVibGljOgorICBVSW50MTI4KCkgOiBoaWdoX2JpdHNfKDApLCBsb3dfYml0c18oMCkgeyB9CisgIFVJbnQxMjgodWludDY0X3QgaGlnaCwgdWludDY0X3QgbG93KSA6IGhpZ2hfYml0c18oaGlnaCksIGxvd19iaXRzXyhsb3cpIHsgfQorCisgIHZvaWQgTXVsdGlwbHkodWludDMyX3QgbXVsdGlwbGljYW5kKSB7CisgICAgdWludDY0X3QgYWNjdW11bGF0b3I7CisKKyAgICBhY2N1bXVsYXRvciA9IChsb3dfYml0c18gJiBrTWFzazMyKSAqIG11bHRpcGxpY2FuZDsKKyAgICB1aW50MzJfdCBwYXJ0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGFjY3VtdWxhdG9yICYga01hc2szMik7CisgICAgYWNjdW11bGF0b3IgPj49IDMyOworICAgIGFjY3VtdWxhdG9yID0gYWNjdW11bGF0b3IgKyAobG93X2JpdHNfID4+IDMyKSAqIG11bHRpcGxpY2FuZDsKKyAgICBsb3dfYml0c18gPSAoYWNjdW11bGF0b3IgPDwgMzIpICsgcGFydDsKKyAgICBhY2N1bXVsYXRvciA+Pj0gMzI7CisgICAgYWNjdW11bGF0b3IgPSBhY2N1bXVsYXRvciArIChoaWdoX2JpdHNfICYga01hc2szMikgKiBtdWx0aXBsaWNhbmQ7CisgICAgcGFydCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhY2N1bXVsYXRvciAmIGtNYXNrMzIpOworICAgIGFjY3VtdWxhdG9yID4+PSAzMjsKKyAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICsgKGhpZ2hfYml0c18gPj4gMzIpICogbXVsdGlwbGljYW5kOworICAgIGhpZ2hfYml0c18gPSAoYWNjdW11bGF0b3IgPDwgMzIpICsgcGFydDsKKyAgICBBU1NFUlQoKGFjY3VtdWxhdG9yID4+IDMyKSA9PSAwKTsKKyAgfQorCisgIHZvaWQgU2hpZnQoaW50IHNoaWZ0X2Ftb3VudCkgeworICAgIEFTU0VSVCgtNjQgPD0gc2hpZnRfYW1vdW50ICYmIHNoaWZ0X2Ftb3VudCA8PSA2NCk7CisgICAgaWYgKHNoaWZ0X2Ftb3VudCA9PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChzaGlmdF9hbW91bnQgPT0gLTY0KSB7CisgICAgICBoaWdoX2JpdHNfID0gbG93X2JpdHNfOworICAgICAgbG93X2JpdHNfID0gMDsKKyAgICB9IGVsc2UgaWYgKHNoaWZ0X2Ftb3VudCA9PSA2NCkgeworICAgICAgbG93X2JpdHNfID0gaGlnaF9iaXRzXzsKKyAgICAgIGhpZ2hfYml0c18gPSAwOworICAgIH0gZWxzZSBpZiAoc2hpZnRfYW1vdW50IDw9IDApIHsKKyAgICAgIGhpZ2hfYml0c18gPDw9IC1zaGlmdF9hbW91bnQ7CisgICAgICBoaWdoX2JpdHNfICs9IGxvd19iaXRzXyA+PiAoNjQgKyBzaGlmdF9hbW91bnQpOworICAgICAgbG93X2JpdHNfIDw8PSAtc2hpZnRfYW1vdW50OworICAgIH0gZWxzZSB7CisgICAgICBsb3dfYml0c18gPj49IHNoaWZ0X2Ftb3VudDsKKyAgICAgIGxvd19iaXRzXyArPSBoaWdoX2JpdHNfIDw8ICg2NCAtIHNoaWZ0X2Ftb3VudCk7CisgICAgICBoaWdoX2JpdHNfID4+PSBzaGlmdF9hbW91bnQ7CisgICAgfQorICB9CisKKyAgLy8gTW9kaWZpZXMgKnRoaXMgdG8gKnRoaXMgTU9EICgyXnBvd2VyKS4KKyAgLy8gUmV0dXJucyAqdGhpcyBESVYgKDJecG93ZXIpLgorICBpbnQgRGl2TW9kUG93ZXJPZjIoaW50IHBvd2VyKSB7CisgICAgaWYgKHBvd2VyID49IDY0KSB7CisgICAgICBpbnQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8aW50PihoaWdoX2JpdHNfID4+IChwb3dlciAtIDY0KSk7CisgICAgICBoaWdoX2JpdHNfIC09IHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZXN1bHQpIDw8IChwb3dlciAtIDY0KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHVpbnQ2NF90IHBhcnRfbG93ID0gbG93X2JpdHNfID4+IHBvd2VyOworICAgICAgdWludDY0X3QgcGFydF9oaWdoID0gaGlnaF9iaXRzXyA8PCAoNjQgLSBwb3dlcik7CisgICAgICBpbnQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8aW50PihwYXJ0X2xvdyArIHBhcnRfaGlnaCk7CisgICAgICBoaWdoX2JpdHNfID0gMDsKKyAgICAgIGxvd19iaXRzXyAtPSBwYXJ0X2xvdyA8PCBwb3dlcjsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9CisKKyAgYm9vbCBJc1plcm8oKSBjb25zdCB7CisgICAgcmV0dXJuIGhpZ2hfYml0c18gPT0gMCAmJiBsb3dfYml0c18gPT0gMDsKKyAgfQorCisgIGludCBCaXRBdChpbnQgcG9zaXRpb24pIHsKKyAgICBpZiAocG9zaXRpb24gPj0gNjQpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGhpZ2hfYml0c18gPj4gKHBvc2l0aW9uIC0gNjQpKSAmIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGxvd19iaXRzXyA+PiBwb3NpdGlvbikgJiAxOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtNYXNrMzIgPSAweEZGRkZGRkZGOworICAvLyBWYWx1ZSA9PSAoaGlnaF9iaXRzXyA8PCA2NCkgKyBsb3dfYml0c18KKyAgdWludDY0X3QgaGlnaF9iaXRzXzsKKyAgdWludDY0X3QgbG93X2JpdHNfOworfTsKKworCitzdGF0aWMgY29uc3QgaW50IGtEb3VibGVTaWduaWZpY2FuZFNpemUgPSA1MzsgIC8vIEluY2x1ZGVzIHRoZSBoaWRkZW4gYml0LgorCisKK3N0YXRpYyB2b2lkIEZpbGxEaWdpdHMzMkZpeGVkTGVuZ3RoKHVpbnQzMl90IG51bWJlciwgaW50IHJlcXVlc3RlZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8Y2hhcj4gYnVmZmVyLCBpbnQqIGxlbmd0aCkgeworICBmb3IgKGludCBpID0gcmVxdWVzdGVkX2xlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgYnVmZmVyWygqbGVuZ3RoKSArIGldID0gJzAnICsgbnVtYmVyICUgMTA7CisgICAgbnVtYmVyIC89IDEwOworICB9CisgICpsZW5ndGggKz0gcmVxdWVzdGVkX2xlbmd0aDsKK30KKworCitzdGF0aWMgdm9pZCBGaWxsRGlnaXRzMzIodWludDMyX3QgbnVtYmVyLCBWZWN0b3I8Y2hhcj4gYnVmZmVyLCBpbnQqIGxlbmd0aCkgeworICBpbnQgbnVtYmVyX2xlbmd0aCA9IDA7CisgIC8vIFdlIGZpbGwgdGhlIGRpZ2l0cyBpbiByZXZlcnNlIG9yZGVyIGFuZCBleGNoYW5nZSB0aGVtIGFmdGVyd2FyZHMuCisgIHdoaWxlIChudW1iZXIgIT0gMCkgeworICAgIGludCBkaWdpdCA9IG51bWJlciAlIDEwOworICAgIG51bWJlciAvPSAxMDsKKyAgICBidWZmZXJbKCpsZW5ndGgpICsgbnVtYmVyX2xlbmd0aF0gPSAnMCcgKyBkaWdpdDsKKyAgICBudW1iZXJfbGVuZ3RoKys7CisgIH0KKyAgLy8gRXhjaGFuZ2UgdGhlIGRpZ2l0cy4KKyAgaW50IGkgPSAqbGVuZ3RoOworICBpbnQgaiA9ICpsZW5ndGggKyBudW1iZXJfbGVuZ3RoIC0gMTsKKyAgd2hpbGUgKGkgPCBqKSB7CisgICAgY2hhciB0bXAgPSBidWZmZXJbaV07CisgICAgYnVmZmVyW2ldID0gYnVmZmVyW2pdOworICAgIGJ1ZmZlcltqXSA9IHRtcDsKKyAgICBpKys7CisgICAgai0tOworICB9CisgICpsZW5ndGggKz0gbnVtYmVyX2xlbmd0aDsKK30KKworCitzdGF0aWMgdm9pZCBGaWxsRGlnaXRzNjRGaXhlZExlbmd0aCh1aW50NjRfdCBudW1iZXIsIGludCByZXF1ZXN0ZWRfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+IGJ1ZmZlciwgaW50KiBsZW5ndGgpIHsKKyAgY29uc3QgdWludDMyX3Qga1RlbjcgPSAxMDAwMDAwMDsKKyAgLy8gRm9yIGVmZmljaWVuY3kgY3V0IHRoZSBudW1iZXIgaW50byAzIHVpbnQzMl90IHBhcnRzLCBhbmQgcHJpbnQgdGhvc2UuCisgIHVpbnQzMl90IHBhcnQyID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bWJlciAlIGtUZW43KTsKKyAgbnVtYmVyIC89IGtUZW43OworICB1aW50MzJfdCBwYXJ0MSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihudW1iZXIgJSBrVGVuNyk7CisgIHVpbnQzMl90IHBhcnQwID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bWJlciAvIGtUZW43KTsKKworICBGaWxsRGlnaXRzMzJGaXhlZExlbmd0aChwYXJ0MCwgMywgYnVmZmVyLCBsZW5ndGgpOworICBGaWxsRGlnaXRzMzJGaXhlZExlbmd0aChwYXJ0MSwgNywgYnVmZmVyLCBsZW5ndGgpOworICBGaWxsRGlnaXRzMzJGaXhlZExlbmd0aChwYXJ0MiwgNywgYnVmZmVyLCBsZW5ndGgpOworfQorCisKK3N0YXRpYyB2b2lkIEZpbGxEaWdpdHM2NCh1aW50NjRfdCBudW1iZXIsIFZlY3RvcjxjaGFyPiBidWZmZXIsIGludCogbGVuZ3RoKSB7CisgIGNvbnN0IHVpbnQzMl90IGtUZW43ID0gMTAwMDAwMDA7CisgIC8vIEZvciBlZmZpY2llbmN5IGN1dCB0aGUgbnVtYmVyIGludG8gMyB1aW50MzJfdCBwYXJ0cywgYW5kIHByaW50IHRob3NlLgorICB1aW50MzJfdCBwYXJ0MiA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihudW1iZXIgJSBrVGVuNyk7CisgIG51bWJlciAvPSBrVGVuNzsKKyAgdWludDMyX3QgcGFydDEgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtYmVyICUga1RlbjcpOworICB1aW50MzJfdCBwYXJ0MCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihudW1iZXIgLyBrVGVuNyk7CisKKyAgaWYgKHBhcnQwICE9IDApIHsKKyAgICBGaWxsRGlnaXRzMzIocGFydDAsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICBGaWxsRGlnaXRzMzJGaXhlZExlbmd0aChwYXJ0MSwgNywgYnVmZmVyLCBsZW5ndGgpOworICAgIEZpbGxEaWdpdHMzMkZpeGVkTGVuZ3RoKHBhcnQyLCA3LCBidWZmZXIsIGxlbmd0aCk7CisgIH0gZWxzZSBpZiAocGFydDEgIT0gMCkgeworICAgIEZpbGxEaWdpdHMzMihwYXJ0MSwgYnVmZmVyLCBsZW5ndGgpOworICAgIEZpbGxEaWdpdHMzMkZpeGVkTGVuZ3RoKHBhcnQyLCA3LCBidWZmZXIsIGxlbmd0aCk7CisgIH0gZWxzZSB7CisgICAgRmlsbERpZ2l0czMyKHBhcnQyLCBidWZmZXIsIGxlbmd0aCk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBSb3VuZFVwKFZlY3RvcjxjaGFyPiBidWZmZXIsIGludCogbGVuZ3RoLCBpbnQqIGRlY2ltYWxfcG9pbnQpIHsKKyAgLy8gQW4gZW1wdHkgYnVmZmVyIHJlcHJlc2VudHMgMC4KKyAgaWYgKCpsZW5ndGggPT0gMCkgeworICAgIGJ1ZmZlclswXSA9ICcxJzsKKyAgICAqZGVjaW1hbF9wb2ludCA9IDE7CisgICAgKmxlbmd0aCA9IDE7CisgICAgcmV0dXJuOworICB9CisgIC8vIFJvdW5kIHRoZSBsYXN0IGRpZ2l0IHVudGlsIHdlIGVpdGhlciBoYXZlIGEgZGlnaXQgdGhhdCB3YXMgbm90ICc5JyBvciB1bnRpbAorICAvLyB3ZSByZWFjaGVkIHRoZSBmaXJzdCBkaWdpdC4KKyAgYnVmZmVyWygqbGVuZ3RoKSAtIDFdKys7CisgIGZvciAoaW50IGkgPSAoKmxlbmd0aCkgLSAxOyBpID4gMDsgLS1pKSB7CisgICAgaWYgKGJ1ZmZlcltpXSAhPSAnMCcgKyAxMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBidWZmZXJbaV0gPSAnMCc7CisgICAgYnVmZmVyW2kgLSAxXSsrOworICB9CisgIC8vIElmIHRoZSBmaXJzdCBkaWdpdCBpcyBub3cgJzAnICsgMTAsIHdlIHdvdWxkIG5lZWQgdG8gc2V0IGl0IHRvICcwJyBhbmQgYWRkCisgIC8vIGEgJzEnIGluIGZyb250LiBIb3dldmVyIHdlIHJlYWNoIHRoZSBmaXJzdCBkaWdpdCBvbmx5IGlmIGFsbCBmb2xsb3dpbmcKKyAgLy8gZGlnaXRzIGhhZCBiZWVuICc5JyBiZWZvcmUgcm91bmRpbmcgdXAuIE5vdyBhbGwgdHJhaWxpbmcgZGlnaXRzIGFyZSAnMCcgYW5kCisgIC8vIHdlIHNpbXBseSBzd2l0Y2ggdGhlIGZpcnN0IGRpZ2l0IHRvICcxJyBhbmQgdXBkYXRlIHRoZSBkZWNpbWFsLXBvaW50CisgIC8vIChpbmRpY2F0aW5nIHRoYXQgdGhlIHBvaW50IGlzIG5vdyBvbmUgZGlnaXQgdG8gdGhlIHJpZ2h0KS4KKyAgaWYgKGJ1ZmZlclswXSA9PSAnMCcgKyAxMCkgeworICAgIGJ1ZmZlclswXSA9ICcxJzsKKyAgICAoKmRlY2ltYWxfcG9pbnQpKys7CisgIH0KK30KKworCisvLyBUaGUgZ2l2ZW4gZnJhY3Rpb25hbHMgbnVtYmVyIHJlcHJlc2VudHMgYSBmaXhlZC1wb2ludCBudW1iZXIgd2l0aCBiaW5hcnkKKy8vIHBvaW50IGF0IGJpdCAoLWV4cG9uZW50KS4KKy8vIFByZWNvbmRpdGlvbnM6CisvLyAgIC0xMjggPD0gZXhwb25lbnQgPD0gMC4KKy8vICAgMCA8PSBmcmFjdGlvbmFscyAqIDJeZXhwb25lbnQgPCAxCisvLyAgIFRoZSBidWZmZXIgaG9sZHMgdGhlIHJlc3VsdC4KKy8vIFRoZSBmdW5jdGlvbiB3aWxsIHJvdW5kIGl0cyByZXN1bHQuIER1cmluZyB0aGUgcm91bmRpbmctcHJvY2VzcyBkaWdpdHMgbm90CisvLyBnZW5lcmF0ZWQgYnkgdGhpcyBmdW5jdGlvbiBtaWdodCBiZSB1cGRhdGVkLCBhbmQgdGhlIGRlY2ltYWwtcG9pbnQgdmFyaWFibGUKKy8vIG1pZ2h0IGJlIHVwZGF0ZWQuIElmIHRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHRoZSBkaWdpdHMgOTkgYW5kIHRoZSBidWZmZXIKKy8vIGFscmVhZHkgY29udGFpbmVkICIxOTkiICh0aHVzIHlpZWxkaW5nIGEgYnVmZmVyIG9mICIxOTk5OSIpIHRoZW4gYQorLy8gcm91bmRpbmctdXAgd2lsbCBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgdG8gIjIwMDAwIi4KK3N0YXRpYyB2b2lkIEZpbGxGcmFjdGlvbmFscyh1aW50NjRfdCBmcmFjdGlvbmFscywgaW50IGV4cG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFjdGlvbmFsX2NvdW50LCBWZWN0b3I8Y2hhcj4gYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGVuZ3RoLCBpbnQqIGRlY2ltYWxfcG9pbnQpIHsKKyAgQVNTRVJUKC0xMjggPD0gZXhwb25lbnQgJiYgZXhwb25lbnQgPD0gMCk7CisgIC8vICdmcmFjdGlvbmFscycgaXMgYSBmaXhlZC1wb2ludCBudW1iZXIsIHdpdGggYmluYXJ5IHBvaW50IGF0IGJpdAorICAvLyAoLWV4cG9uZW50KS4gSW5zaWRlIHRoZSBmdW5jdGlvbiB0aGUgbm9uLWNvbnZlcnRlZCByZW1haW5kZXIgb2YgZnJhY3Rpb25hbHMKKyAgLy8gaXMgYSBmaXhlZC1wb2ludCBudW1iZXIsIHdpdGggYmluYXJ5IHBvaW50IGF0IGJpdCAncG9pbnQnLgorICBpZiAoLWV4cG9uZW50IDw9IDY0KSB7CisgICAgLy8gT25lIDY0IGJpdCBudW1iZXIgaXMgc3VmZmljaWVudC4KKyAgICBBU1NFUlQoZnJhY3Rpb25hbHMgPj4gNTYgPT0gMCk7CisgICAgaW50IHBvaW50ID0gLWV4cG9uZW50OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhY3Rpb25hbF9jb3VudDsgKytpKSB7CisgICAgICBpZiAoZnJhY3Rpb25hbHMgPT0gMCkgYnJlYWs7CisgICAgICAvLyBJbnN0ZWFkIG9mIG11bHRpcGx5aW5nIGJ5IDEwIHdlIG11bHRpcGx5IGJ5IDUgYW5kIGFkanVzdCB0aGUgcG9pbnQKKyAgICAgIC8vIGxvY2F0aW9uLiBUaGlzIHdheSB0aGUgZnJhY3Rpb25hbHMgdmFyaWFibGUgd2lsbCBub3Qgb3ZlcmZsb3cuCisgICAgICAvLyBJbnZhcmlhbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcDogZnJhY3Rpb25hbHMgPCAyXnBvaW50LgorICAgICAgLy8gSW5pdGlhbGx5IHdlIGhhdmU6IHBvaW50IDw9IDY0IGFuZCBmcmFjdGlvbmFscyA8IDJeNTYKKyAgICAgIC8vIEFmdGVyIGVhY2ggaXRlcmF0aW9uIHRoZSBwb2ludCBpcyBkZWNyZW1lbnRlZCBieSBvbmUuCisgICAgICAvLyBOb3RlIHRoYXQgNV4zID0gMTI1IDwgMTI4ID0gMl43LgorICAgICAgLy8gVGhlcmVmb3JlIHRocmVlIGl0ZXJhdGlvbnMgb2YgdGhpcyBsb29wIHdpbGwgbm90IG92ZXJmbG93IGZyYWN0aW9uYWxzCisgICAgICAvLyAoZXZlbiB3aXRob3V0IHRoZSBzdWJ0cmFjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBsb29wIGJvZHkpLiBBdCB0aGlzCisgICAgICAvLyB0aW1lIHBvaW50IHdpbGwgc2F0aXNmeSBwb2ludCA8PSA2MSBhbmQgdGhlcmVmb3JlIGZyYWN0aW9uYWxzIDwgMl5wb2ludAorICAgICAgLy8gYW5kIGFueSBmdXJ0aGVyIG11bHRpcGxpY2F0aW9uIG9mIGZyYWN0aW9uYWxzIGJ5IDUgd2lsbCBub3Qgb3ZlcmZsb3cuCisgICAgICBmcmFjdGlvbmFscyAqPSA1OworICAgICAgcG9pbnQtLTsKKyAgICAgIGludCBkaWdpdCA9IHN0YXRpY19jYXN0PGludD4oZnJhY3Rpb25hbHMgPj4gcG9pbnQpOworICAgICAgYnVmZmVyWypsZW5ndGhdID0gJzAnICsgZGlnaXQ7CisgICAgICAoKmxlbmd0aCkrKzsKKyAgICAgIGZyYWN0aW9uYWxzIC09IHN0YXRpY19jYXN0PHVpbnQ2NF90PihkaWdpdCkgPDwgcG9pbnQ7CisgICAgfQorICAgIC8vIElmIHRoZSBmaXJzdCBiaXQgYWZ0ZXIgdGhlIHBvaW50IGlzIHNldCB3ZSBoYXZlIHRvIHJvdW5kIHVwLgorICAgIGlmICgoKGZyYWN0aW9uYWxzID4+IChwb2ludCAtIDEpKSAmIDEpID09IDEpIHsKKyAgICAgIFJvdW5kVXAoYnVmZmVyLCBsZW5ndGgsIGRlY2ltYWxfcG9pbnQpOworICAgIH0KKyAgfSBlbHNlIHsgIC8vIFdlIG5lZWQgMTI4IGJpdHMuCisgICAgQVNTRVJUKDY0IDwgLWV4cG9uZW50ICYmIC1leHBvbmVudCA8PSAxMjgpOworICAgIFVJbnQxMjggZnJhY3Rpb25hbHMxMjggPSBVSW50MTI4KGZyYWN0aW9uYWxzLCAwKTsKKyAgICBmcmFjdGlvbmFsczEyOC5TaGlmdCgtZXhwb25lbnQgLSA2NCk7CisgICAgaW50IHBvaW50ID0gMTI4OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhY3Rpb25hbF9jb3VudDsgKytpKSB7CisgICAgICBpZiAoZnJhY3Rpb25hbHMxMjguSXNaZXJvKCkpIGJyZWFrOworICAgICAgLy8gQXMgYmVmb3JlOiBpbnN0ZWFkIG9mIG11bHRpcGx5aW5nIGJ5IDEwIHdlIG11bHRpcGx5IGJ5IDUgYW5kIGFkanVzdCB0aGUKKyAgICAgIC8vIHBvaW50IGxvY2F0aW9uLgorICAgICAgLy8gVGhpcyBtdWx0aXBsaWNhdGlvbiB3aWxsIG5vdCBvdmVyZmxvdyBmb3IgdGhlIHNhbWUgcmVhc29ucyBhcyBiZWZvcmUuCisgICAgICBmcmFjdGlvbmFsczEyOC5NdWx0aXBseSg1KTsKKyAgICAgIHBvaW50LS07CisgICAgICBpbnQgZGlnaXQgPSBmcmFjdGlvbmFsczEyOC5EaXZNb2RQb3dlck9mMihwb2ludCk7CisgICAgICBidWZmZXJbKmxlbmd0aF0gPSAnMCcgKyBkaWdpdDsKKyAgICAgICgqbGVuZ3RoKSsrOworICAgIH0KKyAgICBpZiAoZnJhY3Rpb25hbHMxMjguQml0QXQocG9pbnQgLSAxKSA9PSAxKSB7CisgICAgICBSb3VuZFVwKGJ1ZmZlciwgbGVuZ3RoLCBkZWNpbWFsX3BvaW50KTsKKyAgICB9CisgIH0KK30KKworCisvLyBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHplcm9zLgorLy8gSWYgbGVhZGluZyB6ZXJvcyBhcmUgcmVtb3ZlZCB0aGVuIHRoZSBkZWNpbWFsIHBvaW50IHBvc2l0aW9uIGlzIGFkanVzdGVkLgorc3RhdGljIHZvaWQgVHJpbVplcm9zKFZlY3RvcjxjaGFyPiBidWZmZXIsIGludCogbGVuZ3RoLCBpbnQqIGRlY2ltYWxfcG9pbnQpIHsKKyAgd2hpbGUgKCpsZW5ndGggPiAwICYmIGJ1ZmZlclsoKmxlbmd0aCkgLSAxXSA9PSAnMCcpIHsKKyAgICAoKmxlbmd0aCktLTsKKyAgfQorICBpbnQgZmlyc3Rfbm9uX3plcm8gPSAwOworICB3aGlsZSAoZmlyc3Rfbm9uX3plcm8gPCAqbGVuZ3RoICYmIGJ1ZmZlcltmaXJzdF9ub25femVyb10gPT0gJzAnKSB7CisgICAgZmlyc3Rfbm9uX3plcm8rKzsKKyAgfQorICBpZiAoZmlyc3Rfbm9uX3plcm8gIT0gMCkgeworICAgIGZvciAoaW50IGkgPSBmaXJzdF9ub25femVybzsgaSA8ICpsZW5ndGg7ICsraSkgeworICAgICAgYnVmZmVyW2kgLSBmaXJzdF9ub25femVyb10gPSBidWZmZXJbaV07CisgICAgfQorICAgICpsZW5ndGggLT0gZmlyc3Rfbm9uX3plcm87CisgICAgKmRlY2ltYWxfcG9pbnQgLT0gZmlyc3Rfbm9uX3plcm87CisgIH0KK30KKworCitib29sIEZhc3RGaXhlZER0b2EoZG91YmxlIHYsCisgICAgICAgICAgICAgICAgICAgaW50IGZyYWN0aW9uYWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBpbnQqIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICBpbnQqIGRlY2ltYWxfcG9pbnQpIHsKKyAgY29uc3QgdWludDMyX3Qga01heFVJbnQzMiA9IDB4RkZGRkZGRkY7CisgIHVpbnQ2NF90IHNpZ25pZmljYW5kID0gRG91YmxlKHYpLlNpZ25pZmljYW5kKCk7CisgIGludCBleHBvbmVudCA9IERvdWJsZSh2KS5FeHBvbmVudCgpOworICAvLyB2ID0gc2lnbmlmaWNhbmQgKiAyXmV4cG9uZW50ICh3aXRoIHNpZ25pZmljYW5kIGEgNTNiaXQgaW50ZWdlcikuCisgIC8vIElmIHRoZSBleHBvbmVudCBpcyBsYXJnZXIgdGhhbiAyMCAoaS5lLiB3ZSBtYXkgaGF2ZSBhIDczYml0IG51bWJlcikgdGhlbiB3ZQorICAvLyBkb24ndCBrbm93IGhvdyB0byBjb21wdXRlIHRoZSByZXByZXNlbnRhdGlvbi4gMl43MyB+PSA5LjUqMTBeMjEuCisgIC8vIElmIG5lY2Vzc2FyeSB0aGlzIGxpbWl0IGNvdWxkIHByb2JhYmx5IGJlIGluY3JlYXNlZCwgYnV0IHdlIGRvbid0IG5lZWQKKyAgLy8gbW9yZS4KKyAgaWYgKGV4cG9uZW50ID4gMjApIHJldHVybiBmYWxzZTsKKyAgaWYgKGZyYWN0aW9uYWxfY291bnQgPiAyMCkgcmV0dXJuIGZhbHNlOworICAqbGVuZ3RoID0gMDsKKyAgLy8gQXQgbW9zdCBrRG91YmxlU2lnbmlmaWNhbmRTaXplIGJpdHMgb2YgdGhlIHNpZ25pZmljYW5kIGFyZSBub24temVyby4KKyAgLy8gR2l2ZW4gYSA2NCBiaXQgaW50ZWdlciB3ZSBoYXZlIDExIDBzIGZvbGxvd2VkIGJ5IDUzIHBvdGVudGlhbGx5IG5vbi16ZXJvCisgIC8vIGJpdHM6ICAwLi4xMSouLjB4eHguLjUzKi4ueHgKKyAgaWYgKGV4cG9uZW50ICsga0RvdWJsZVNpZ25pZmljYW5kU2l6ZSA+IDY0KSB7CisgICAgLy8gVGhlIGV4cG9uZW50IG11c3QgYmUgPiAxMS4KKyAgICAvLworICAgIC8vIFdlIGtub3cgdGhhdCB2ID0gc2lnbmlmaWNhbmQgKiAyXmV4cG9uZW50LgorICAgIC8vIEFuZCB0aGUgZXhwb25lbnQgPiAxMS4KKyAgICAvLyBXZSBzaW1wbGlmeSB0aGUgdGFzayBieSBkaXZpZGluZyB2IGJ5IDEwXjE3LgorICAgIC8vIFRoZSBxdW90aWVudCBkZWxpdmVycyB0aGUgZmlyc3QgZGlnaXRzLCBhbmQgdGhlIHJlbWFpbmRlciBmaXRzIGludG8gYSA2NAorICAgIC8vIGJpdCBudW1iZXIuCisgICAgLy8gRGl2aWRpbmcgYnkgMTBeMTcgaXMgZXF1aXZhbGVudCB0byBkaXZpZGluZyBieSA1XjE3KjJeMTcuCisgICAgY29uc3QgdWludDY0X3Qga0ZpdmUxNyA9IFVJTlQ2NF8yUEFSVF9DKDB4QjEsIEEyQkMyRUM1KTsgIC8vIDVeMTcKKyAgICB1aW50NjRfdCBkaXZpc29yID0ga0ZpdmUxNzsKKyAgICBpbnQgZGl2aXNvcl9wb3dlciA9IDE3OworICAgIHVpbnQ2NF90IGRpdmlkZW5kID0gc2lnbmlmaWNhbmQ7CisgICAgdWludDMyX3QgcXVvdGllbnQ7CisgICAgdWludDY0X3QgcmVtYWluZGVyOworICAgIC8vIExldCB2ID0gZiAqIDJeZSB3aXRoIGYgPT0gc2lnbmlmaWNhbmQgYW5kIGUgPT0gZXhwb25lbnQuCisgICAgLy8gVGhlbiBuZWVkIHEgKHF1b3RpZW50KSBhbmQgciAocmVtYWluZGVyKSBhcyBmb2xsb3dzOgorICAgIC8vICAgdiAgICAgICAgICAgID0gcSAqIDEwXjE3ICAgICAgICsgcgorICAgIC8vICAgZiAqIDJeZSAgICAgID0gcSAqIDEwXjE3ICAgICAgICsgcgorICAgIC8vICAgZiAqIDJeZSAgICAgID0gcSAqIDVeMTcgKiAyXjE3ICsgcgorICAgIC8vIElmIGUgPiAxNyB0aGVuCisgICAgLy8gICBmICogMl4oZS0xNykgPSBxICogNV4xNyAgICAgICAgKyByLzJeMTcKKyAgICAvLyBlbHNlCisgICAgLy8gICBmICA9IHEgKiA1XjE3ICogMl4oMTctZSkgKyByLzJeZQorICAgIGlmIChleHBvbmVudCA+IGRpdmlzb3JfcG93ZXIpIHsKKyAgICAgIC8vIFdlIG9ubHkgYWxsb3cgZXhwb25lbnRzIG9mIHVwIHRvIDIwIGFuZCB0aGVyZWZvcmUgKDE3IC0gZSkgPD0gMworICAgICAgZGl2aWRlbmQgPDw9IGV4cG9uZW50IC0gZGl2aXNvcl9wb3dlcjsKKyAgICAgIHF1b3RpZW50ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRpdmlkZW5kIC8gZGl2aXNvcik7CisgICAgICByZW1haW5kZXIgPSAoZGl2aWRlbmQgJSBkaXZpc29yKSA8PCBkaXZpc29yX3Bvd2VyOworICAgIH0gZWxzZSB7CisgICAgICBkaXZpc29yIDw8PSBkaXZpc29yX3Bvd2VyIC0gZXhwb25lbnQ7CisgICAgICBxdW90aWVudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkaXZpZGVuZCAvIGRpdmlzb3IpOworICAgICAgcmVtYWluZGVyID0gKGRpdmlkZW5kICUgZGl2aXNvcikgPDwgZXhwb25lbnQ7CisgICAgfQorICAgIEZpbGxEaWdpdHMzMihxdW90aWVudCwgYnVmZmVyLCBsZW5ndGgpOworICAgIEZpbGxEaWdpdHM2NEZpeGVkTGVuZ3RoKHJlbWFpbmRlciwgZGl2aXNvcl9wb3dlciwgYnVmZmVyLCBsZW5ndGgpOworICAgICpkZWNpbWFsX3BvaW50ID0gKmxlbmd0aDsKKyAgfSBlbHNlIGlmIChleHBvbmVudCA+PSAwKSB7CisgICAgLy8gMCA8PSBleHBvbmVudCA8PSAxMQorICAgIHNpZ25pZmljYW5kIDw8PSBleHBvbmVudDsKKyAgICBGaWxsRGlnaXRzNjQoc2lnbmlmaWNhbmQsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAqZGVjaW1hbF9wb2ludCA9ICpsZW5ndGg7CisgIH0gZWxzZSBpZiAoZXhwb25lbnQgPiAta0RvdWJsZVNpZ25pZmljYW5kU2l6ZSkgeworICAgIC8vIFdlIGhhdmUgdG8gY3V0IHRoZSBudW1iZXIuCisgICAgdWludDY0X3QgaW50ZWdyYWxzID0gc2lnbmlmaWNhbmQgPj4gLWV4cG9uZW50OworICAgIHVpbnQ2NF90IGZyYWN0aW9uYWxzID0gc2lnbmlmaWNhbmQgLSAoaW50ZWdyYWxzIDw8IC1leHBvbmVudCk7CisgICAgaWYgKGludGVncmFscyA+IGtNYXhVSW50MzIpIHsKKyAgICAgIEZpbGxEaWdpdHM2NChpbnRlZ3JhbHMsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgRmlsbERpZ2l0czMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihpbnRlZ3JhbHMpLCBidWZmZXIsIGxlbmd0aCk7CisgICAgfQorICAgICpkZWNpbWFsX3BvaW50ID0gKmxlbmd0aDsKKyAgICBGaWxsRnJhY3Rpb25hbHMoZnJhY3Rpb25hbHMsIGV4cG9uZW50LCBmcmFjdGlvbmFsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGxlbmd0aCwgZGVjaW1hbF9wb2ludCk7CisgIH0gZWxzZSBpZiAoZXhwb25lbnQgPCAtMTI4KSB7CisgICAgLy8gVGhpcyBjb25maWd1cmF0aW9uICh3aXRoIGF0IG1vc3QgMjAgZGlnaXRzKSBtZWFucyB0aGF0IGFsbCBkaWdpdHMgbXVzdCBiZQorICAgIC8vIDAuCisgICAgQVNTRVJUKGZyYWN0aW9uYWxfY291bnQgPD0gMjApOworICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgKmxlbmd0aCA9IDA7CisgICAgKmRlY2ltYWxfcG9pbnQgPSAtZnJhY3Rpb25hbF9jb3VudDsKKyAgfSBlbHNlIHsKKyAgICAqZGVjaW1hbF9wb2ludCA9IDA7CisgICAgRmlsbEZyYWN0aW9uYWxzKHNpZ25pZmljYW5kLCBleHBvbmVudCwgZnJhY3Rpb25hbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW5ndGgsIGRlY2ltYWxfcG9pbnQpOworICB9CisgIFRyaW1aZXJvcyhidWZmZXIsIGxlbmd0aCwgZGVjaW1hbF9wb2ludCk7CisgIGJ1ZmZlclsqbGVuZ3RoXSA9ICdcMCc7CisgIGlmICgoKmxlbmd0aCkgPT0gMCkgeworICAgIC8vIFRoZSBzdHJpbmcgaXMgZW1wdHkgYW5kIHRoZSBkZWNpbWFsX3BvaW50IHRodXMgaGFzIG5vIGltcG9ydGFuY2UuIE1pbWljaworICAgIC8vIEdheSdzIGR0b2EgYW5kIGFuZCBzZXQgaXQgdG8gLWZyYWN0aW9uYWxfY291bnQuCisgICAgKmRlY2ltYWxfcG9pbnQgPSAtZnJhY3Rpb25hbF9jb3VudDsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGRvdWJsZV9jb252ZXJzaW9uCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9maXhlZC1kdG9hLmggYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9maXhlZC1kdG9hLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2ZpeGVkLWR0b2EuaApyZW5hbWUgdG8gc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vZml4ZWQtZHRvYS5oCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9pZWVlLmggYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9pZWVlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL2llZWUuaApyZW5hbWUgdG8gc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vaWVlZS5oCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9zdHJ0b2QuY2MgYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9zdHJ0b2QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViNGRhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL3N0cnRvZC5jYwpAQCAtMCwwICsxLDU1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTAgdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworLy8gICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisvLyAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKy8vICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Y3N0ZGFyZz4KKyNpbmNsdWRlIDxjbGltaXRzPgorCisjaW5jbHVkZSAic3RydG9kLmgiCisjaW5jbHVkZSAiYmlnbnVtLmgiCisjaW5jbHVkZSAiY2FjaGVkLXBvd2Vycy5oIgorI2luY2x1ZGUgImllZWUuaCIKKworbmFtZXNwYWNlIGRvdWJsZV9jb252ZXJzaW9uIHsKKworLy8gMl41MyA9IDkwMDcxOTkyNTQ3NDA5OTIuCisvLyBBbnkgaW50ZWdlciB3aXRoIGF0IG1vc3QgMTUgZGVjaW1hbCBkaWdpdHMgd2lsbCBoZW5jZSBmaXQgaW50byBhIGRvdWJsZQorLy8gKHdoaWNoIGhhcyBhIDUzYml0IHNpZ25pZmljYW5kKSB3aXRob3V0IGxvc3Mgb2YgcHJlY2lzaW9uLgorc3RhdGljIGNvbnN0IGludCBrTWF4RXhhY3REb3VibGVJbnRlZ2VyRGVjaW1hbERpZ2l0cyA9IDE1OworLy8gMl42NCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE2ID4gMTBeMTkKK3N0YXRpYyBjb25zdCBpbnQga01heFVpbnQ2NERlY2ltYWxEaWdpdHMgPSAxOTsKKworLy8gTWF4IGRvdWJsZTogMS43OTc2OTMxMzQ4NjIzMTU3IHggMTBeMzA4CisvLyBNaW4gbm9uLXplcm8gZG91YmxlOiA0Ljk0MDY1NjQ1ODQxMjQ2NTQgeCAxMF4tMzI0CisvLyBBbnkgeCA+PSAxMF4zMDkgaXMgaW50ZXJwcmV0ZWQgYXMgK2luZmluaXR5LgorLy8gQW55IHggPD0gMTBeLTMyNCBpcyBpbnRlcnByZXRlZCBhcyAwLgorLy8gTm90ZSB0aGF0IDIuNWUtMzI0IChkZXNwaXRlIGJlaW5nIHNtYWxsZXIgdGhhbiB0aGUgbWluIGRvdWJsZSkgd2lsbCBiZSByZWFkCisvLyBhcyBub24temVybyAoZXF1YWwgdG8gdGhlIG1pbiBub24temVybyBkb3VibGUpLgorc3RhdGljIGNvbnN0IGludCBrTWF4RGVjaW1hbFBvd2VyID0gMzA5Oworc3RhdGljIGNvbnN0IGludCBrTWluRGVjaW1hbFBvd2VyID0gLTMyNDsKKworLy8gMl42NCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE2CitzdGF0aWMgY29uc3QgdWludDY0X3Qga01heFVpbnQ2NCA9IFVJTlQ2NF8yUEFSVF9DKDB4RkZGRkZGRkYsIEZGRkZGRkZGKTsKKworCitzdGF0aWMgY29uc3QgZG91YmxlIGV4YWN0X3Bvd2Vyc19vZl90ZW5bXSA9IHsKKyAgMS4wLCAgLy8gMTBeMAorICAxMC4wLAorICAxMDAuMCwKKyAgMTAwMC4wLAorICAxMDAwMC4wLAorICAxMDAwMDAuMCwKKyAgMTAwMDAwMC4wLAorICAxMDAwMDAwMC4wLAorICAxMDAwMDAwMDAuMCwKKyAgMTAwMDAwMDAwMC4wLAorICAxMDAwMDAwMDAwMC4wLCAgLy8gMTBeMTAKKyAgMTAwMDAwMDAwMDAwLjAsCisgIDEwMDAwMDAwMDAwMDAuMCwKKyAgMTAwMDAwMDAwMDAwMDAuMCwKKyAgMTAwMDAwMDAwMDAwMDAwLjAsCisgIDEwMDAwMDAwMDAwMDAwMDAuMCwKKyAgMTAwMDAwMDAwMDAwMDAwMDAuMCwKKyAgMTAwMDAwMDAwMDAwMDAwMDAwLjAsCisgIDEwMDAwMDAwMDAwMDAwMDAwMDAuMCwKKyAgMTAwMDAwMDAwMDAwMDAwMDAwMDAuMCwKKyAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwLjAsICAvLyAxMF4yMAorICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAsCisgIC8vIDEwXjIyID0gMHgyMWUxOWUwYzliYWIyNDAwMDAwID0gMHg4Nzg2NzgzMjZlYWM5ICogMl4yMgorICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wCit9Oworc3RhdGljIGNvbnN0IGludCBrRXhhY3RQb3dlcnNPZlRlblNpemUgPSBBUlJBWV9TSVpFKGV4YWN0X3Bvd2Vyc19vZl90ZW4pOworCisvLyBNYXhpbXVtIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgaW4gdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24uCisvLyBJbiBmYWN0IHRoZSB2YWx1ZSBpcyA3NzIgKHNlZSBjb252ZXJzaW9ucy5jYyksIGJ1dCB0byBnaXZlIHVzIHNvbWUgbWFyZ2luCisvLyB3ZSByb3VuZCB1cCB0byA3ODAuCitzdGF0aWMgY29uc3QgaW50IGtNYXhTaWduaWZpY2FudERlY2ltYWxEaWdpdHMgPSA3ODA7CisKK3N0YXRpYyBWZWN0b3I8Y29uc3QgY2hhcj4gVHJpbUxlYWRpbmdaZXJvcyhWZWN0b3I8Y29uc3QgY2hhcj4gYnVmZmVyKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aCgpOyBpKyspIHsKKyAgICBpZiAoYnVmZmVyW2ldICE9ICcwJykgeworICAgICAgcmV0dXJuIGJ1ZmZlci5TdWJWZWN0b3IoaSwgYnVmZmVyLmxlbmd0aCgpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFZlY3Rvcjxjb25zdCBjaGFyPihidWZmZXIuc3RhcnQoKSwgMCk7Cit9CisKKworc3RhdGljIFZlY3Rvcjxjb25zdCBjaGFyPiBUcmltVHJhaWxpbmdaZXJvcyhWZWN0b3I8Y29uc3QgY2hhcj4gYnVmZmVyKSB7CisgIGZvciAoaW50IGkgPSBidWZmZXIubGVuZ3RoKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgIGlmIChidWZmZXJbaV0gIT0gJzAnKSB7CisgICAgICByZXR1cm4gYnVmZmVyLlN1YlZlY3RvcigwLCBpICsgMSk7CisgICAgfQorICB9CisgIHJldHVybiBWZWN0b3I8Y29uc3QgY2hhcj4oYnVmZmVyLnN0YXJ0KCksIDApOworfQorCisKK3N0YXRpYyB2b2lkIEN1dFRvTWF4U2lnbmlmaWNhbnREaWdpdHMoVmVjdG9yPGNvbnN0IGNoYXI+IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHNpZ25pZmljYW50X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc2lnbmlmaWNhbnRfZXhwb25lbnQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4U2lnbmlmaWNhbnREZWNpbWFsRGlnaXRzIC0gMTsgKytpKSB7CisgICAgc2lnbmlmaWNhbnRfYnVmZmVyW2ldID0gYnVmZmVyW2ldOworICB9CisgIC8vIFRoZSBpbnB1dCBidWZmZXIgaGFzIGJlZW4gdHJpbW1lZC4gVGhlcmVmb3JlIHRoZSBsYXN0IGRpZ2l0IG11c3QgYmUKKyAgLy8gZGlmZmVyZW50IGZyb20gJzAnLgorICBBU1NFUlQoYnVmZmVyW2J1ZmZlci5sZW5ndGgoKSAtIDFdICE9ICcwJyk7CisgIC8vIFNldCB0aGUgbGFzdCBkaWdpdCB0byBiZSBub24temVyby4gVGhpcyBpcyBzdWZmaWNpZW50IHRvIGd1YXJhbnRlZQorICAvLyBjb3JyZWN0IHJvdW5kaW5nLgorICBzaWduaWZpY2FudF9idWZmZXJba01heFNpZ25pZmljYW50RGVjaW1hbERpZ2l0cyAtIDFdID0gJzEnOworICAqc2lnbmlmaWNhbnRfZXhwb25lbnQgPQorICAgICAgZXhwb25lbnQgKyAoYnVmZmVyLmxlbmd0aCgpIC0ga01heFNpZ25pZmljYW50RGVjaW1hbERpZ2l0cyk7Cit9CisKKworLy8gVHJpbXMgdGhlIGJ1ZmZlciBhbmQgY3V0cyBpdCB0byBhdCBtb3N0IGtNYXhTaWduaWZpY2FudERlY2ltYWxEaWdpdHMuCisvLyBJZiBwb3NzaWJsZSB0aGUgaW5wdXQtYnVmZmVyIGlzIHJldXNlZCwgYnV0IGlmIHRoZSBidWZmZXIgbmVlZHMgdG8gYmUKKy8vIG1vZGlmaWVkIChkdWUgdG8gY3V0dGluZyksIHRoZW4gdGhlIGlucHV0IG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZQorLy8gYnVmZmVyX2NvcHlfc3BhY2UuCitzdGF0aWMgdm9pZCBUcmltQW5kQ3V0KFZlY3Rvcjxjb25zdCBjaGFyPiBidWZmZXIsIGludCBleHBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyX2NvcHlfc3BhY2UsIGludCBzcGFjZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8Y29uc3QgY2hhcj4qIHRyaW1tZWQsIGludCogdXBkYXRlZF9leHBvbmVudCkgeworICBWZWN0b3I8Y29uc3QgY2hhcj4gbGVmdF90cmltbWVkID0gVHJpbUxlYWRpbmdaZXJvcyhidWZmZXIpOworICBWZWN0b3I8Y29uc3QgY2hhcj4gcmlnaHRfdHJpbW1lZCA9IFRyaW1UcmFpbGluZ1plcm9zKGxlZnRfdHJpbW1lZCk7CisgIGV4cG9uZW50ICs9IGxlZnRfdHJpbW1lZC5sZW5ndGgoKSAtIHJpZ2h0X3RyaW1tZWQubGVuZ3RoKCk7CisgIGlmIChyaWdodF90cmltbWVkLmxlbmd0aCgpID4ga01heFNpZ25pZmljYW50RGVjaW1hbERpZ2l0cykgeworICAgIEFTU0VSVChzcGFjZV9zaXplID49IGtNYXhTaWduaWZpY2FudERlY2ltYWxEaWdpdHMpOworICAgIEN1dFRvTWF4U2lnbmlmaWNhbnREaWdpdHMocmlnaHRfdHJpbW1lZCwgZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfY29weV9zcGFjZSwgdXBkYXRlZF9leHBvbmVudCk7CisgICAgKnRyaW1tZWQgPSBWZWN0b3I8Y29uc3QgY2hhcj4oYnVmZmVyX2NvcHlfc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4U2lnbmlmaWNhbnREZWNpbWFsRGlnaXRzKTsKKyAgfSBlbHNlIHsKKyAgICAqdHJpbW1lZCA9IHJpZ2h0X3RyaW1tZWQ7CisgICAgKnVwZGF0ZWRfZXhwb25lbnQgPSBleHBvbmVudDsKKyAgfQorfQorCisKKy8vIFJlYWRzIGRpZ2l0cyBmcm9tIHRoZSBidWZmZXIgYW5kIGNvbnZlcnRzIHRoZW0gdG8gYSB1aW50NjQuCisvLyBSZWFkcyBpbiBhcyBtYW55IGRpZ2l0cyBhcyBmaXQgaW50byBhIHVpbnQ2NC4KKy8vIFdoZW4gdGhlIHN0cmluZyBzdGFydHMgd2l0aCAiMTg0NDY3NDQwNzM3MDk1NTE2MSIgbm8gZnVydGhlciBkaWdpdCBpcyByZWFkLgorLy8gU2luY2UgMl42NCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE2IGl0IHdvdWxkIHN0aWxsIGJlIHBvc3NpYmxlIHJlYWQgYW5vdGhlcgorLy8gZGlnaXQgaWYgaXQgd2FzIGxlc3Mgb3IgZXF1YWwgdGhhbiA2LCBidXQgdGhpcyB3b3VsZCBjb21wbGljYXRlIHRoZSBjb2RlLgorc3RhdGljIHVpbnQ2NF90IFJlYWRVaW50NjQoVmVjdG9yPGNvbnN0IGNoYXI+IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbnVtYmVyX29mX3JlYWRfZGlnaXRzKSB7CisgIHVpbnQ2NF90IHJlc3VsdCA9IDA7CisgIGludCBpID0gMDsKKyAgd2hpbGUgKGkgPCBidWZmZXIubGVuZ3RoKCkgJiYgcmVzdWx0IDw9IChrTWF4VWludDY0IC8gMTAgLSAxKSkgeworICAgIGludCBkaWdpdCA9IGJ1ZmZlcltpKytdIC0gJzAnOworICAgIEFTU0VSVCgwIDw9IGRpZ2l0ICYmIGRpZ2l0IDw9IDkpOworICAgIHJlc3VsdCA9IDEwICogcmVzdWx0ICsgZGlnaXQ7CisgIH0KKyAgKm51bWJlcl9vZl9yZWFkX2RpZ2l0cyA9IGk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLy8gUmVhZHMgYSBEaXlGcCBmcm9tIHRoZSBidWZmZXIuCisvLyBUaGUgcmV0dXJuZWQgRGl5RnAgaXMgbm90IG5lY2Vzc2FyaWx5IG5vcm1hbGl6ZWQuCisvLyBJZiByZW1haW5pbmdfZGVjaW1hbHMgaXMgemVybyB0aGVuIHRoZSByZXR1cm5lZCBEaXlGcCBpcyBhY2N1cmF0ZS4KKy8vIE90aGVyd2lzZSBpdCBoYXMgYmVlbiByb3VuZGVkIGFuZCBoYXMgZXJyb3Igb2YgYXQgbW9zdCAxLzIgdWxwLgorc3RhdGljIHZvaWQgUmVhZERpeUZwKFZlY3Rvcjxjb25zdCBjaGFyPiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgRGl5RnAqIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQqIHJlbWFpbmluZ19kZWNpbWFscykgeworICBpbnQgcmVhZF9kaWdpdHM7CisgIHVpbnQ2NF90IHNpZ25pZmljYW5kID0gUmVhZFVpbnQ2NChidWZmZXIsICZyZWFkX2RpZ2l0cyk7CisgIGlmIChidWZmZXIubGVuZ3RoKCkgPT0gcmVhZF9kaWdpdHMpIHsKKyAgICAqcmVzdWx0ID0gRGl5RnAoc2lnbmlmaWNhbmQsIDApOworICAgICpyZW1haW5pbmdfZGVjaW1hbHMgPSAwOworICB9IGVsc2UgeworICAgIC8vIFJvdW5kIHRoZSBzaWduaWZpY2FuZC4KKyAgICBpZiAoYnVmZmVyW3JlYWRfZGlnaXRzXSA+PSAnNScpIHsKKyAgICAgIHNpZ25pZmljYW5kKys7CisgICAgfQorICAgIC8vIENvbXB1dGUgdGhlIGJpbmFyeSBleHBvbmVudC4KKyAgICBpbnQgZXhwb25lbnQgPSAwOworICAgICpyZXN1bHQgPSBEaXlGcChzaWduaWZpY2FuZCwgZXhwb25lbnQpOworICAgICpyZW1haW5pbmdfZGVjaW1hbHMgPSBidWZmZXIubGVuZ3RoKCkgLSByZWFkX2RpZ2l0czsKKyAgfQorfQorCisKK3N0YXRpYyBib29sIERvdWJsZVN0cnRvZChWZWN0b3I8Y29uc3QgY2hhcj4gdHJpbW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByZXN1bHQpIHsKKyNpZiAhZGVmaW5lZChET1VCTEVfQ09OVkVSU0lPTl9DT1JSRUNUX0RPVUJMRV9PUEVSQVRJT05TKQorICAvLyBPbiB4ODYgdGhlIGZsb2F0aW5nLXBvaW50IHN0YWNrIGNhbiBiZSA2NCBvciA4MCBiaXRzIHdpZGUuIElmIGl0IGlzCisgIC8vIDgwIGJpdHMgd2lkZSAoYXMgaXMgdGhlIGNhc2Ugb24gTGludXgpIHRoZW4gZG91YmxlLXJvdW5kaW5nIG9jY3VycyBhbmQgdGhlCisgIC8vIHJlc3VsdCBpcyBub3QgYWNjdXJhdGUuCisgIC8vIFdlIGtub3cgdGhhdCBXaW5kb3dzMzIgdXNlcyA2NCBiaXRzIGFuZCBpcyB0aGVyZWZvcmUgYWNjdXJhdGUuCisgIC8vIE5vdGUgdGhhdCB0aGUgQVJNIHNpbXVsYXRvciBpcyBjb21waWxlZCBmb3IgMzJiaXRzLiBJdCB0aGVyZWZvcmUgZXhoaWJpdHMKKyAgLy8gdGhlIHNhbWUgcHJvYmxlbS4KKyAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisgIGlmICh0cmltbWVkLmxlbmd0aCgpIDw9IGtNYXhFeGFjdERvdWJsZUludGVnZXJEZWNpbWFsRGlnaXRzKSB7CisgICAgaW50IHJlYWRfZGlnaXRzOworICAgIC8vIFRoZSB0cmltbWVkIGlucHV0IGZpdHMgaW50byBhIGRvdWJsZS4KKyAgICAvLyBJZiB0aGUgMTBeZXhwb25lbnQgKHJlc3AuIDEwXi1leHBvbmVudCkgZml0cyBpbnRvIGEgZG91YmxlIHRvbyB0aGVuIHdlCisgICAgLy8gY2FuIGNvbXB1dGUgdGhlIHJlc3VsdC1kb3VibGUgc2ltcGx5IGJ5IG11bHRpcGx5aW5nIChyZXNwLiBkaXZpZGluZykgdGhlCisgICAgLy8gdHdvIG51bWJlcnMuCisgICAgLy8gVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIElFRUUgZ3VhcmFudGVlcyB0aGF0IGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMKKyAgICAvLyByZXR1cm4gdGhlIGJlc3QgcG9zc2libGUgYXBwcm94aW1hdGlvbi4KKyAgICBpZiAoZXhwb25lbnQgPCAwICYmIC1leHBvbmVudCA8IGtFeGFjdFBvd2Vyc09mVGVuU2l6ZSkgeworICAgICAgLy8gMTBeLWV4cG9uZW50IGZpdHMgaW50byBhIGRvdWJsZS4KKyAgICAgICpyZXN1bHQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KFJlYWRVaW50NjQodHJpbW1lZCwgJnJlYWRfZGlnaXRzKSk7CisgICAgICBBU1NFUlQocmVhZF9kaWdpdHMgPT0gdHJpbW1lZC5sZW5ndGgoKSk7CisgICAgICAqcmVzdWx0IC89IGV4YWN0X3Bvd2Vyc19vZl90ZW5bLWV4cG9uZW50XTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoMCA8PSBleHBvbmVudCAmJiBleHBvbmVudCA8IGtFeGFjdFBvd2Vyc09mVGVuU2l6ZSkgeworICAgICAgLy8gMTBeZXhwb25lbnQgZml0cyBpbnRvIGEgZG91YmxlLgorICAgICAgKnJlc3VsdCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oUmVhZFVpbnQ2NCh0cmltbWVkLCAmcmVhZF9kaWdpdHMpKTsKKyAgICAgIEFTU0VSVChyZWFkX2RpZ2l0cyA9PSB0cmltbWVkLmxlbmd0aCgpKTsKKyAgICAgICpyZXN1bHQgKj0gZXhhY3RfcG93ZXJzX29mX3RlbltleHBvbmVudF07CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50IHJlbWFpbmluZ19kaWdpdHMgPQorICAgICAgICBrTWF4RXhhY3REb3VibGVJbnRlZ2VyRGVjaW1hbERpZ2l0cyAtIHRyaW1tZWQubGVuZ3RoKCk7CisgICAgaWYgKCgwIDw9IGV4cG9uZW50KSAmJgorICAgICAgICAoZXhwb25lbnQgLSByZW1haW5pbmdfZGlnaXRzIDwga0V4YWN0UG93ZXJzT2ZUZW5TaXplKSkgeworICAgICAgLy8gVGhlIHRyaW1tZWQgc3RyaW5nIHdhcyBzaG9ydCBhbmQgd2UgY2FuIG11bHRpcGx5IGl0IHdpdGgKKyAgICAgIC8vIDEwXnJlbWFpbmluZ19kaWdpdHMuIEFzIGEgcmVzdWx0IHRoZSByZW1haW5pbmcgZXhwb25lbnQgbm93IGZpdHMKKyAgICAgIC8vIGludG8gYSBkb3VibGUgdG9vLgorICAgICAgKnJlc3VsdCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oUmVhZFVpbnQ2NCh0cmltbWVkLCAmcmVhZF9kaWdpdHMpKTsKKyAgICAgIEFTU0VSVChyZWFkX2RpZ2l0cyA9PSB0cmltbWVkLmxlbmd0aCgpKTsKKyAgICAgICpyZXN1bHQgKj0gZXhhY3RfcG93ZXJzX29mX3RlbltyZW1haW5pbmdfZGlnaXRzXTsKKyAgICAgICpyZXN1bHQgKj0gZXhhY3RfcG93ZXJzX29mX3RlbltleHBvbmVudCAtIHJlbWFpbmluZ19kaWdpdHNdOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworCisvLyBSZXR1cm5zIDEwXmV4cG9uZW50IGFzIGFuIGV4YWN0IERpeUZwLgorLy8gVGhlIGdpdmVuIGV4cG9uZW50IG11c3QgYmUgaW4gdGhlIHJhbmdlIFsxOyBrRGVjaW1hbEV4cG9uZW50RGlzdGFuY2VbLgorc3RhdGljIERpeUZwIEFkanVzdG1lbnRQb3dlck9mVGVuKGludCBleHBvbmVudCkgeworICBBU1NFUlQoMCA8IGV4cG9uZW50KTsKKyAgQVNTRVJUKGV4cG9uZW50IDwgUG93ZXJzT2ZUZW5DYWNoZTo6a0RlY2ltYWxFeHBvbmVudERpc3RhbmNlKTsKKyAgLy8gU2ltcGx5IGhhcmRjb2RlIHRoZSByZW1haW5pbmcgcG93ZXJzIGZvciB0aGUgZ2l2ZW4gZGVjaW1hbCBleHBvbmVudAorICAvLyBkaXN0YW5jZS4KKyAgQVNTRVJUKFBvd2Vyc09mVGVuQ2FjaGU6OmtEZWNpbWFsRXhwb25lbnREaXN0YW5jZSA9PSA4KTsKKyAgc3dpdGNoIChleHBvbmVudCkgeworICAgIGNhc2UgMTogcmV0dXJuIERpeUZwKFVJTlQ2NF8yUEFSVF9DKDB4YTAwMDAwMDAsIDAwMDAwMDAwKSwgLTYwKTsKKyAgICBjYXNlIDI6IHJldHVybiBEaXlGcChVSU5UNjRfMlBBUlRfQygweGM4MDAwMDAwLCAwMDAwMDAwMCksIC01Nyk7CisgICAgY2FzZSAzOiByZXR1cm4gRGl5RnAoVUlOVDY0XzJQQVJUX0MoMHhmYTAwMDAwMCwgMDAwMDAwMDApLCAtNTQpOworICAgIGNhc2UgNDogcmV0dXJuIERpeUZwKFVJTlQ2NF8yUEFSVF9DKDB4OWM0MDAwMDAsIDAwMDAwMDAwKSwgLTUwKTsKKyAgICBjYXNlIDU6IHJldHVybiBEaXlGcChVSU5UNjRfMlBBUlRfQygweGMzNTAwMDAwLCAwMDAwMDAwMCksIC00Nyk7CisgICAgY2FzZSA2OiByZXR1cm4gRGl5RnAoVUlOVDY0XzJQQVJUX0MoMHhmNDI0MDAwMCwgMDAwMDAwMDApLCAtNDQpOworICAgIGNhc2UgNzogcmV0dXJuIERpeUZwKFVJTlQ2NF8yUEFSVF9DKDB4OTg5NjgwMDAsIDAwMDAwMDAwKSwgLTQwKTsKKyAgICBkZWZhdWx0OgorICAgICAgVU5SRUFDSEFCTEUoKTsKKyAgICAgIHJldHVybiBEaXlGcCgwLCAwKTsKKyAgfQorfQorCisKKy8vIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgdGhlbiB0aGUgcmVzdWx0IGlzIHRoZSBjb3JyZWN0IGRvdWJsZS4KKy8vIE90aGVyd2lzZSBpdCBpcyBlaXRoZXIgdGhlIGNvcnJlY3QgZG91YmxlIG9yIHRoZSBkb3VibGUgdGhhdCBpcyBqdXN0IGJlbG93CisvLyB0aGUgY29ycmVjdCBkb3VibGUuCitzdGF0aWMgYm9vbCBEaXlGcFN0cnRvZChWZWN0b3I8Y29uc3QgY2hhcj4gYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByZXN1bHQpIHsKKyAgRGl5RnAgaW5wdXQ7CisgIGludCByZW1haW5pbmdfZGVjaW1hbHM7CisgIFJlYWREaXlGcChidWZmZXIsICZpbnB1dCwgJnJlbWFpbmluZ19kZWNpbWFscyk7CisgIC8vIFNpbmNlIHdlIG1heSBoYXZlIGRyb3BwZWQgc29tZSBkaWdpdHMgdGhlIGlucHV0IGlzIG5vdCBhY2N1cmF0ZS4KKyAgLy8gSWYgcmVtYWluaW5nX2RlY2ltYWxzIGlzIGRpZmZlcmVudCB0aGFuIDAgdGhhbiB0aGUgZXJyb3IgaXMgYXQgbW9zdAorICAvLyAuNSB1bHAgKHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UpLgorICAvLyBXZSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCBmcmFjdGlvbnMgYW5kIHRoZXJlZm9yZSBrZWVwIGEgY29tbW9uCisgIC8vIGRlbm9taW5hdG9yLgorICBjb25zdCBpbnQga0Rlbm9taW5hdG9yTG9nID0gMzsKKyAgY29uc3QgaW50IGtEZW5vbWluYXRvciA9IDEgPDwga0Rlbm9taW5hdG9yTG9nOworICAvLyBNb3ZlIHRoZSByZW1haW5pbmcgZGVjaW1hbHMgaW50byB0aGUgZXhwb25lbnQuCisgIGV4cG9uZW50ICs9IHJlbWFpbmluZ19kZWNpbWFsczsKKyAgaW50IGVycm9yID0gKHJlbWFpbmluZ19kZWNpbWFscyA9PSAwID8gMCA6IGtEZW5vbWluYXRvciAvIDIpOworCisgIGludCBvbGRfZSA9IGlucHV0LmUoKTsKKyAgaW5wdXQuTm9ybWFsaXplKCk7CisgIGVycm9yIDw8PSBvbGRfZSAtIGlucHV0LmUoKTsKKworICBBU1NFUlQoZXhwb25lbnQgPD0gUG93ZXJzT2ZUZW5DYWNoZTo6a01heERlY2ltYWxFeHBvbmVudCk7CisgIGlmIChleHBvbmVudCA8IFBvd2Vyc09mVGVuQ2FjaGU6OmtNaW5EZWNpbWFsRXhwb25lbnQpIHsKKyAgICAqcmVzdWx0ID0gMC4wOworICAgIHJldHVybiB0cnVlOworICB9CisgIERpeUZwIGNhY2hlZF9wb3dlcjsKKyAgaW50IGNhY2hlZF9kZWNpbWFsX2V4cG9uZW50OworICBQb3dlcnNPZlRlbkNhY2hlOjpHZXRDYWNoZWRQb3dlckZvckRlY2ltYWxFeHBvbmVudChleHBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhY2hlZF9wb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhY2hlZF9kZWNpbWFsX2V4cG9uZW50KTsKKworICBpZiAoY2FjaGVkX2RlY2ltYWxfZXhwb25lbnQgIT0gZXhwb25lbnQpIHsKKyAgICBpbnQgYWRqdXN0bWVudF9leHBvbmVudCA9IGV4cG9uZW50IC0gY2FjaGVkX2RlY2ltYWxfZXhwb25lbnQ7CisgICAgRGl5RnAgYWRqdXN0bWVudF9wb3dlciA9IEFkanVzdG1lbnRQb3dlck9mVGVuKGFkanVzdG1lbnRfZXhwb25lbnQpOworICAgIGlucHV0Lk11bHRpcGx5KGFkanVzdG1lbnRfcG93ZXIpOworICAgIGlmIChrTWF4VWludDY0RGVjaW1hbERpZ2l0cyAtIGJ1ZmZlci5sZW5ndGgoKSA+PSBhZGp1c3RtZW50X2V4cG9uZW50KSB7CisgICAgICAvLyBUaGUgcHJvZHVjdCBvZiBpbnB1dCB3aXRoIHRoZSBhZGp1c3RtZW50IHBvd2VyIGZpdHMgaW50byBhIDY0IGJpdAorICAgICAgLy8gaW50ZWdlci4KKyAgICAgIEFTU0VSVChEaXlGcDo6a1NpZ25pZmljYW5kU2l6ZSA9PSA2NCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZSBhZGp1c3RtZW50IHBvd2VyIGlzIGV4YWN0LiBUaGVyZSBpcyBoZW5jZSBvbmx5IGFuIGVycm9yIG9mIDAuNS4KKyAgICAgIGVycm9yICs9IGtEZW5vbWluYXRvciAvIDI7CisgICAgfQorICB9CisKKyAgaW5wdXQuTXVsdGlwbHkoY2FjaGVkX3Bvd2VyKTsKKyAgLy8gVGhlIGVycm9yIGludHJvZHVjZWQgYnkgYSBtdWx0aXBsaWNhdGlvbiBvZiBhKmIgZXF1YWxzCisgIC8vICAgZXJyb3JfYSArIGVycm9yX2IgKyBlcnJvcl9hKmVycm9yX2IvMl42NCArIDAuNQorICAvLyBTdWJzdGl0dXRpbmcgYSB3aXRoICdpbnB1dCcgYW5kIGIgd2l0aCAnY2FjaGVkX3Bvd2VyJyB3ZSBoYXZlCisgIC8vICAgZXJyb3JfYiA9IDAuNSAgKGFsbCBjYWNoZWQgcG93ZXJzIGhhdmUgYW4gZXJyb3Igb2YgbGVzcyB0aGFuIDAuNSB1bHApLAorICAvLyAgIGVycm9yX2FiID0gMCBvciAxIC8ga0Rlbm9taW5hdG9yID4gZXJyb3JfYSplcnJvcl9iLyAyXjY0CisgIGludCBlcnJvcl9iID0ga0Rlbm9taW5hdG9yIC8gMjsKKyAgaW50IGVycm9yX2FiID0gKGVycm9yID09IDAgPyAwIDogMSk7ICAvLyBXZSByb3VuZCB1cCB0byAxLgorICBpbnQgZml4ZWRfZXJyb3IgPSBrRGVub21pbmF0b3IgLyAyOworICBlcnJvciArPSBlcnJvcl9iICsgZXJyb3JfYWIgKyBmaXhlZF9lcnJvcjsKKworICBvbGRfZSA9IGlucHV0LmUoKTsKKyAgaW5wdXQuTm9ybWFsaXplKCk7CisgIGVycm9yIDw8PSBvbGRfZSAtIGlucHV0LmUoKTsKKworICAvLyBTZWUgaWYgdGhlIGRvdWJsZSdzIHNpZ25pZmljYW5kIGNoYW5nZXMgaWYgd2UgYWRkL3N1YnRyYWN0IHRoZSBlcnJvci4KKyAgaW50IG9yZGVyX29mX21hZ25pdHVkZSA9IERpeUZwOjprU2lnbmlmaWNhbmRTaXplICsgaW5wdXQuZSgpOworICBpbnQgZWZmZWN0aXZlX3NpZ25pZmljYW5kX3NpemUgPQorICAgICAgRG91YmxlOjpTaWduaWZpY2FuZFNpemVGb3JPcmRlck9mTWFnbml0dWRlKG9yZGVyX29mX21hZ25pdHVkZSk7CisgIGludCBwcmVjaXNpb25fZGlnaXRzX2NvdW50ID0KKyAgICAgIERpeUZwOjprU2lnbmlmaWNhbmRTaXplIC0gZWZmZWN0aXZlX3NpZ25pZmljYW5kX3NpemU7CisgIGlmIChwcmVjaXNpb25fZGlnaXRzX2NvdW50ICsga0Rlbm9taW5hdG9yTG9nID49IERpeUZwOjprU2lnbmlmaWNhbmRTaXplKSB7CisgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gZm9yIHZlcnkgc21hbGwgZGVub3JtYWxzLiBJbiB0aGlzIGNhc2UgdGhlCisgICAgLy8gaGFsZi13YXkgbXVsdGlwbGllZCBieSB0aGUgZGVub21pbmF0b3IgZXhjZWVkcyB0aGUgcmFuZ2Ugb2YgYW4gdWludDY0LgorICAgIC8vIFNpbXBseSBzaGlmdCBldmVyeXRoaW5nIHRvIHRoZSByaWdodC4KKyAgICBpbnQgc2hpZnRfYW1vdW50ID0gKHByZWNpc2lvbl9kaWdpdHNfY291bnQgKyBrRGVub21pbmF0b3JMb2cpIC0KKyAgICAgICAgRGl5RnA6OmtTaWduaWZpY2FuZFNpemUgKyAxOworICAgIGlucHV0LnNldF9mKGlucHV0LmYoKSA+PiBzaGlmdF9hbW91bnQpOworICAgIGlucHV0LnNldF9lKGlucHV0LmUoKSArIHNoaWZ0X2Ftb3VudCk7CisgICAgLy8gV2UgYWRkIDEgZm9yIHRoZSBsb3N0IHByZWNpc2lvbiBvZiBlcnJvciwgYW5kIGtEZW5vbWluYXRvciBmb3IKKyAgICAvLyB0aGUgbG9zdCBwcmVjaXNpb24gb2YgaW5wdXQuZigpLgorICAgIGVycm9yID0gKGVycm9yID4+IHNoaWZ0X2Ftb3VudCkgKyAxICsga0Rlbm9taW5hdG9yOworICAgIHByZWNpc2lvbl9kaWdpdHNfY291bnQgLT0gc2hpZnRfYW1vdW50OworICB9CisgIC8vIFdlIHVzZSB1aW50NjRfdHMgbm93LiBUaGlzIG9ubHkgd29ya3MgaWYgdGhlIERpeUZwIHVzZXMgdWludDY0X3RzIHRvby4KKyAgQVNTRVJUKERpeUZwOjprU2lnbmlmaWNhbmRTaXplID09IDY0KTsKKyAgQVNTRVJUKHByZWNpc2lvbl9kaWdpdHNfY291bnQgPCA2NCk7CisgIHVpbnQ2NF90IG9uZTY0ID0gMTsKKyAgdWludDY0X3QgcHJlY2lzaW9uX2JpdHNfbWFzayA9IChvbmU2NCA8PCBwcmVjaXNpb25fZGlnaXRzX2NvdW50KSAtIDE7CisgIHVpbnQ2NF90IHByZWNpc2lvbl9iaXRzID0gaW5wdXQuZigpICYgcHJlY2lzaW9uX2JpdHNfbWFzazsKKyAgdWludDY0X3QgaGFsZl93YXkgPSBvbmU2NCA8PCAocHJlY2lzaW9uX2RpZ2l0c19jb3VudCAtIDEpOworICBwcmVjaXNpb25fYml0cyAqPSBrRGVub21pbmF0b3I7CisgIGhhbGZfd2F5ICo9IGtEZW5vbWluYXRvcjsKKyAgRGl5RnAgcm91bmRlZF9pbnB1dChpbnB1dC5mKCkgPj4gcHJlY2lzaW9uX2RpZ2l0c19jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5lKCkgKyBwcmVjaXNpb25fZGlnaXRzX2NvdW50KTsKKyAgaWYgKHByZWNpc2lvbl9iaXRzID49IGhhbGZfd2F5ICsgZXJyb3IpIHsKKyAgICByb3VuZGVkX2lucHV0LnNldF9mKHJvdW5kZWRfaW5wdXQuZigpICsgMSk7CisgIH0KKyAgLy8gSWYgdGhlIGxhc3RfYml0cyBhcmUgdG9vIGNsb3NlIHRvIHRoZSBoYWxmLXdheSBjYXNlIHRoYW4gd2UgYXJlIHRvbworICAvLyBpbmFjY3VyYXRlIGFuZCByb3VuZCBkb3duLiBJbiB0aGlzIGNhc2Ugd2UgcmV0dXJuIGZhbHNlIHNvIHRoYXQgd2UgY2FuCisgIC8vIGZhbGwgYmFjayB0byBhIG1vcmUgcHJlY2lzZSBhbGdvcml0aG0uCisKKyAgKnJlc3VsdCA9IERvdWJsZShyb3VuZGVkX2lucHV0KS52YWx1ZSgpOworICBpZiAoaGFsZl93YXkgLSBlcnJvciA8IHByZWNpc2lvbl9iaXRzICYmIHByZWNpc2lvbl9iaXRzIDwgaGFsZl93YXkgKyBlcnJvcikgeworICAgIC8vIFRvbyBpbXByZWNpc2UuIFRoZSBjYWxsZXIgd2lsbCBoYXZlIHRvIGZhbGwgYmFjayB0byBhIHNsb3dlciB2ZXJzaW9uLgorICAgIC8vIEhvd2V2ZXIgdGhlIHJldHVybmVkIG51bWJlciBpcyBndWFyYW50ZWVkIHRvIGJlIGVpdGhlciB0aGUgY29ycmVjdAorICAgIC8vIGRvdWJsZSwgb3IgdGhlIG5leHQtbG93ZXIgZG91YmxlLgorICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCisKKy8vIFJldHVybnMKKy8vICAgLSAtMSBpZiBidWZmZXIqMTBeZXhwb25lbnQgPCBkaXlfZnAuCisvLyAgIC0gIDAgaWYgYnVmZmVyKjEwXmV4cG9uZW50ID09IGRpeV9mcC4KKy8vICAgLSArMSBpZiBidWZmZXIqMTBeZXhwb25lbnQgPiBkaXlfZnAuCisvLyBQcmVjb25kaXRpb25zOgorLy8gICBidWZmZXIubGVuZ3RoKCkgKyBleHBvbmVudCA8PSBrTWF4RGVjaW1hbFBvd2VyICsgMQorLy8gICBidWZmZXIubGVuZ3RoKCkgKyBleHBvbmVudCA+IGtNaW5EZWNpbWFsUG93ZXIKKy8vICAgYnVmZmVyLmxlbmd0aCgpIDw9IGtNYXhEZWNpbWFsU2lnbmlmaWNhbnREaWdpdHMKK3N0YXRpYyBpbnQgQ29tcGFyZUJ1ZmZlcldpdGhEaXlGcChWZWN0b3I8Y29uc3QgY2hhcj4gYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXlGcCBkaXlfZnApIHsKKyAgQVNTRVJUKGJ1ZmZlci5sZW5ndGgoKSArIGV4cG9uZW50IDw9IGtNYXhEZWNpbWFsUG93ZXIgKyAxKTsKKyAgQVNTRVJUKGJ1ZmZlci5sZW5ndGgoKSArIGV4cG9uZW50ID4ga01pbkRlY2ltYWxQb3dlcik7CisgIEFTU0VSVChidWZmZXIubGVuZ3RoKCkgPD0ga01heFNpZ25pZmljYW50RGVjaW1hbERpZ2l0cyk7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBCaWdudW0gd2lsbCBiZSBhYmxlIHRvIGhvbGQgYWxsIG91ciBudW1iZXJzLgorICAvLyBPdXIgQmlnbnVtIGltcGxlbWVudGF0aW9uIGhhcyBhIHNlcGFyYXRlIGZpZWxkIGZvciBleHBvbmVudHMuIFNoaWZ0cyB3aWxsCisgIC8vIGNvbnN1bWUgYXQgbW9zdCBvbmUgYmlnaXQgKDwgNjQgYml0cykuCisgIC8vIGxuKDEwKSA9PSAzLjMyMTkuLi4KKyAgQVNTRVJUKCgoa01heERlY2ltYWxQb3dlciArIDEpICogMzMzIC8gMTAwKSA8IEJpZ251bTo6a01heFNpZ25pZmljYW50Qml0cyk7CisgIEJpZ251bSBidWZmZXJfYmlnbnVtOworICBCaWdudW0gZGl5X2ZwX2JpZ251bTsKKyAgYnVmZmVyX2JpZ251bS5Bc3NpZ25EZWNpbWFsU3RyaW5nKGJ1ZmZlcik7CisgIGRpeV9mcF9iaWdudW0uQXNzaWduVUludDY0KGRpeV9mcC5mKCkpOworICBpZiAoZXhwb25lbnQgPj0gMCkgeworICAgIGJ1ZmZlcl9iaWdudW0uTXVsdGlwbHlCeVBvd2VyT2ZUZW4oZXhwb25lbnQpOworICB9IGVsc2UgeworICAgIGRpeV9mcF9iaWdudW0uTXVsdGlwbHlCeVBvd2VyT2ZUZW4oLWV4cG9uZW50KTsKKyAgfQorICBpZiAoZGl5X2ZwLmUoKSA+IDApIHsKKyAgICBkaXlfZnBfYmlnbnVtLlNoaWZ0TGVmdChkaXlfZnAuZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBidWZmZXJfYmlnbnVtLlNoaWZ0TGVmdCgtZGl5X2ZwLmUoKSk7CisgIH0KKyAgcmV0dXJuIEJpZ251bTo6Q29tcGFyZShidWZmZXJfYmlnbnVtLCBkaXlfZnBfYmlnbnVtKTsKK30KKworCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGd1ZXNzIGlzIHRoZSBjb3JyZWN0IGRvdWJsZS4KKy8vIFJldHVybnMgZmFsc2UsIHdoZW4gZ3Vlc3MgaXMgZWl0aGVyIGNvcnJlY3Qgb3IgdGhlIG5leHQtbG93ZXIgZG91YmxlLgorc3RhdGljIGJvb2wgQ29tcHV0ZUd1ZXNzKFZlY3Rvcjxjb25zdCBjaGFyPiB0cmltbWVkLCBpbnQgZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBndWVzcykgeworICBpZiAodHJpbW1lZC5sZW5ndGgoKSA9PSAwKSB7CisgICAgKmd1ZXNzID0gMC4wOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChleHBvbmVudCArIHRyaW1tZWQubGVuZ3RoKCkgLSAxID49IGtNYXhEZWNpbWFsUG93ZXIpIHsKKyAgICAqZ3Vlc3MgPSBEb3VibGU6OkluZmluaXR5KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKGV4cG9uZW50ICsgdHJpbW1lZC5sZW5ndGgoKSA8PSBrTWluRGVjaW1hbFBvd2VyKSB7CisgICAgKmd1ZXNzID0gMC4wOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKERvdWJsZVN0cnRvZCh0cmltbWVkLCBleHBvbmVudCwgZ3Vlc3MpIHx8CisgICAgICBEaXlGcFN0cnRvZCh0cmltbWVkLCBleHBvbmVudCwgZ3Vlc3MpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKCpndWVzcyA9PSBEb3VibGU6OkluZmluaXR5KCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2RvdWJsZSBTdHJ0b2QoVmVjdG9yPGNvbnN0IGNoYXI+IGJ1ZmZlciwgaW50IGV4cG9uZW50KSB7CisgIGNoYXIgY29weV9idWZmZXJba01heFNpZ25pZmljYW50RGVjaW1hbERpZ2l0c107CisgIFZlY3Rvcjxjb25zdCBjaGFyPiB0cmltbWVkOworICBpbnQgdXBkYXRlZF9leHBvbmVudDsKKyAgVHJpbUFuZEN1dChidWZmZXIsIGV4cG9uZW50LCBjb3B5X2J1ZmZlciwga01heFNpZ25pZmljYW50RGVjaW1hbERpZ2l0cywKKyAgICAgICAgICAgICAmdHJpbW1lZCwgJnVwZGF0ZWRfZXhwb25lbnQpOworICBleHBvbmVudCA9IHVwZGF0ZWRfZXhwb25lbnQ7CisKKyAgZG91YmxlIGd1ZXNzOworICBib29sIGlzX2NvcnJlY3QgPSBDb21wdXRlR3Vlc3ModHJpbW1lZCwgZXhwb25lbnQsICZndWVzcyk7CisgIGlmIChpc19jb3JyZWN0KSByZXR1cm4gZ3Vlc3M7CisKKyAgRGl5RnAgdXBwZXJfYm91bmRhcnkgPSBEb3VibGUoZ3Vlc3MpLlVwcGVyQm91bmRhcnkoKTsKKyAgaW50IGNvbXBhcmlzb24gPSBDb21wYXJlQnVmZmVyV2l0aERpeUZwKHRyaW1tZWQsIGV4cG9uZW50LCB1cHBlcl9ib3VuZGFyeSk7CisgIGlmIChjb21wYXJpc29uIDwgMCkgeworICAgIHJldHVybiBndWVzczsKKyAgfSBlbHNlIGlmIChjb21wYXJpc29uID4gMCkgeworICAgIHJldHVybiBEb3VibGUoZ3Vlc3MpLk5leHREb3VibGUoKTsKKyAgfSBlbHNlIGlmICgoRG91YmxlKGd1ZXNzKS5TaWduaWZpY2FuZCgpICYgMSkgPT0gMCkgeworICAgIC8vIFJvdW5kIHRvd2FyZHMgZXZlbi4KKyAgICByZXR1cm4gZ3Vlc3M7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIERvdWJsZShndWVzcykuTmV4dERvdWJsZSgpOworICB9Cit9CisKK2Zsb2F0IFN0cnRvZihWZWN0b3I8Y29uc3QgY2hhcj4gYnVmZmVyLCBpbnQgZXhwb25lbnQpIHsKKyAgY2hhciBjb3B5X2J1ZmZlcltrTWF4U2lnbmlmaWNhbnREZWNpbWFsRGlnaXRzXTsKKyAgVmVjdG9yPGNvbnN0IGNoYXI+IHRyaW1tZWQ7CisgIGludCB1cGRhdGVkX2V4cG9uZW50OworICBUcmltQW5kQ3V0KGJ1ZmZlciwgZXhwb25lbnQsIGNvcHlfYnVmZmVyLCBrTWF4U2lnbmlmaWNhbnREZWNpbWFsRGlnaXRzLAorICAgICAgICAgICAgICZ0cmltbWVkLCAmdXBkYXRlZF9leHBvbmVudCk7CisgIGV4cG9uZW50ID0gdXBkYXRlZF9leHBvbmVudDsKKworICBkb3VibGUgZG91YmxlX2d1ZXNzOworICBib29sIGlzX2NvcnJlY3QgPSBDb21wdXRlR3Vlc3ModHJpbW1lZCwgZXhwb25lbnQsICZkb3VibGVfZ3Vlc3MpOworCisgIGZsb2F0IGZsb2F0X2d1ZXNzID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRvdWJsZV9ndWVzcyk7CisgIGlmIChmbG9hdF9ndWVzcyA9PSBkb3VibGVfZ3Vlc3MpIHsKKyAgICAvLyBUaGlzIHNob3J0Y3V0IHRyaWdnZXJzIGZvciBpbnRlZ2VyIHZhbHVlcy4KKyAgICByZXR1cm4gZmxvYXRfZ3Vlc3M7CisgIH0KKworICAvLyBXZSBtdXN0IGNhdGNoIGRvdWJsZS1yb3VuZGluZy4gU2F5IHRoZSBkb3VibGUgaGFzIGJlZW4gcm91bmRlZCB1cCwgYW5kIGlzCisgIC8vIG5vdyBhIGJvdW5kYXJ5IG9mIGEgZmxvYXQsIGFuZCByb3VuZHMgdXAgYWdhaW4uIFRoaXMgaXMgd2h5IHdlIGhhdmUgdG8KKyAgLy8gbG9vayBhdCBwcmV2aW91cyB0b28uCisgIC8vIEV4YW1wbGUgKGluIGRlY2ltYWwgbnVtYmVycyk6CisgIC8vICAgIGlucHV0OiAxMjM0OQorICAvLyAgICBoaWdoLXByZWNpc2lvbiAoNCBkaWdpdHMpOiAxMjM1CisgIC8vICAgIGxvdy1wcmVjaXNpb24gKDMgZGlnaXRzKToKKyAgLy8gICAgICAgd2hlbiByZWFkIGZyb20gaW5wdXQ6IDEyMworICAvLyAgICAgICB3aGVuIHJvdW5kZWQgZnJvbSBoaWdoIHByZWNpc2lvbjogMTI0LgorICAvLyBUbyBkbyB0aGlzIHdlIHNpbXBseSBsb29rIGF0IHRoZSBuZWlnYm9ycyBvZiB0aGUgY29ycmVjdCByZXN1bHQgYW5kIHNlZQorICAvLyBpZiB0aGV5IHdvdWxkIHJvdW5kIHRvIHRoZSBzYW1lIGZsb2F0LiBJZiB0aGUgZ3Vlc3MgaXMgbm90IGNvcnJlY3Qgd2UgaGF2ZQorICAvLyB0byBsb29rIGF0IGZvdXIgdmFsdWVzIChzaW5jZSB0d28gZGlmZmVyZW50IGRvdWJsZXMgY291bGQgYmUgdGhlIGNvcnJlY3QKKyAgLy8gZG91YmxlKS4KKworICBkb3VibGUgZG91YmxlX25leHQgPSBEb3VibGUoZG91YmxlX2d1ZXNzKS5OZXh0RG91YmxlKCk7CisgIGRvdWJsZSBkb3VibGVfcHJldmlvdXMgPSBEb3VibGUoZG91YmxlX2d1ZXNzKS5QcmV2aW91c0RvdWJsZSgpOworCisgIGZsb2F0IGYxID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRvdWJsZV9wcmV2aW91cyk7CisjaWZuZGVmIE5ERUJVRworICBmbG9hdCBmMiA9IGZsb2F0X2d1ZXNzOworI2VuZGlmCisgIGZsb2F0IGYzID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRvdWJsZV9uZXh0KTsKKyAgZmxvYXQgZjQ7CisgIGlmIChpc19jb3JyZWN0KSB7CisgICAgZjQgPSBmMzsKKyAgfSBlbHNlIHsKKyAgICBkb3VibGUgZG91YmxlX25leHQyID0gRG91YmxlKGRvdWJsZV9uZXh0KS5OZXh0RG91YmxlKCk7CisgICAgZjQgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZG91YmxlX25leHQyKTsKKyAgfQorI2lmbmRlZiBOREVCVUcKKyAgQVNTRVJUKGYxIDw9IGYyICYmIGYyIDw9IGYzICYmIGYzIDw9IGY0KTsKKyNlbmRpZgorCisgIC8vIElmIHRoZSBndWVzcyBkb2Vzbid0IGxpZSBuZWFyIGEgc2luZ2xlLXByZWNpc2lvbiBib3VuZGFyeSB3ZSBjYW4gc2ltcGx5CisgIC8vIHJldHVybiBpdHMgZmxvYXQtdmFsdWUuCisgIGlmIChmMSA9PSBmNCkgeworICAgIHJldHVybiBmbG9hdF9ndWVzczsKKyAgfQorCisgIEFTU0VSVCgoZjEgIT0gZjIgJiYgZjIgPT0gZjMgJiYgZjMgPT0gZjQpIHx8CisgICAgICAgICAoZjEgPT0gZjIgJiYgZjIgIT0gZjMgJiYgZjMgPT0gZjQpIHx8CisgICAgICAgICAoZjEgPT0gZjIgJiYgZjIgPT0gZjMgJiYgZjMgIT0gZjQpKTsKKworICAvLyBndWVzcyBhbmQgbmV4dCBhcmUgdGhlIHR3byBwb3NzaWJsZSBjYW5kaXRhdGVzIChpbiB0aGUgc2FtZSB3YXkgdGhhdAorICAvLyBkb3VibGVfZ3Vlc3Mgd2FzIHRoZSBsb3dlciBjYW5kaWRhdGUgZm9yIGEgZG91YmxlLXByZWNpc2lvbiBndWVzcykuCisgIGZsb2F0IGd1ZXNzID0gZjE7CisgIGZsb2F0IG5leHQgPSBmNDsKKyAgRGl5RnAgdXBwZXJfYm91bmRhcnk7CisgIGlmIChndWVzcyA9PSAwLjBmKSB7CisgICAgZmxvYXQgbWluX2Zsb2F0ID0gMWUtNDVmOworICAgIHVwcGVyX2JvdW5kYXJ5ID0gRG91YmxlKHN0YXRpY19jYXN0PGRvdWJsZT4obWluX2Zsb2F0KSAvIDIpLkFzRGl5RnAoKTsKKyAgfSBlbHNlIHsKKyAgICB1cHBlcl9ib3VuZGFyeSA9IFNpbmdsZShndWVzcykuVXBwZXJCb3VuZGFyeSgpOworICB9CisgIGludCBjb21wYXJpc29uID0gQ29tcGFyZUJ1ZmZlcldpdGhEaXlGcCh0cmltbWVkLCBleHBvbmVudCwgdXBwZXJfYm91bmRhcnkpOworICBpZiAoY29tcGFyaXNvbiA8IDApIHsKKyAgICByZXR1cm4gZ3Vlc3M7CisgIH0gZWxzZSBpZiAoY29tcGFyaXNvbiA+IDApIHsKKyAgICByZXR1cm4gbmV4dDsKKyAgfSBlbHNlIGlmICgoU2luZ2xlKGd1ZXNzKS5TaWduaWZpY2FuZCgpICYgMSkgPT0gMCkgeworICAgIC8vIFJvdW5kIHRvd2FyZHMgZXZlbi4KKyAgICByZXR1cm4gZ3Vlc3M7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5leHQ7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGRvdWJsZV9jb252ZXJzaW9uCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9zdHJ0b2QuaCBiL3NyYy9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL3N0cnRvZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi9zdHJ0b2QuaApyZW5hbWUgdG8gc3JjL2tlbmxtL3V0aWwvZG91YmxlLWNvbnZlcnNpb24vc3RydG9kLmgKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2RvdWJsZS1jb252ZXJzaW9uL3V0aWxzLmggYi9zcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi91dGlscy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi91dGlscy5oCnJlbmFtZSB0byBzcmMva2VubG0vdXRpbC9kb3VibGUtY29udmVyc2lvbi91dGlscy5oCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9lcnNhdHpfcHJvZ3Jlc3MuY2MgYi9zcmMva2VubG0vdXRpbC9lcnNhdHpfcHJvZ3Jlc3MuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjODJlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL2Vyc2F0el9wcm9ncmVzcy5jYwpAQCAtMCwwICsxLDQ3IEBACisjaW5jbHVkZSAidXRpbC9lcnNhdHpfcHJvZ3Jlc3MuaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgdXRpbCB7CisKK25hbWVzcGFjZSB7IGNvbnN0IHVuc2lnbmVkIGNoYXIga1dpZHRoID0gMTAwOyB9CisKK2NvbnN0IGNoYXIga1Byb2dyZXNzQmFubmVyW10gPSAiLS0tLTUtLS0xMC0tLTE1LS0tMjAtLS0yNS0tLTMwLS0tMzUtLS00MC0tLTQ1LS0tNTAtLS01NS0tLTYwLS0tNjUtLS03MC0tLTc1LS0tODAtLS04NS0tLTkwLS0tOTUtLTEwMFxuIjsKKworRXJzYXR6UHJvZ3Jlc3M6OkVyc2F0elByb2dyZXNzKCkgOiBjdXJyZW50XygwKSwgbmV4dF8oc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpKSwgY29tcGxldGVfKG5leHRfKSwgb3V0XyhOVUxMKSB7fQorCitFcnNhdHpQcm9ncmVzczo6fkVyc2F0elByb2dyZXNzKCkgeworICBpZiAob3V0XykgRmluaXNoZWQoKTsKK30KKworRXJzYXR6UHJvZ3Jlc3M6OkVyc2F0elByb2dyZXNzKHVpbnQ2NF90IGNvbXBsZXRlLCBzdGQ6Om9zdHJlYW0gKnRvLCBjb25zdCBzdGQ6OnN0cmluZyAmbWVzc2FnZSkKKyAgOiBjdXJyZW50XygwKSwgbmV4dF8oY29tcGxldGUgLyBrV2lkdGgpLCBjb21wbGV0ZV8oY29tcGxldGUpLCBzdG9uZXNfd3JpdHRlbl8oMCksIG91dF8odG8pIHsKKyAgaWYgKCFvdXRfKSB7CisgICAgbmV4dF8gPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCk7CisgICAgcmV0dXJuOworICB9CisgIGlmICghbWVzc2FnZS5lbXB0eSgpKSAqb3V0XyA8PCBtZXNzYWdlIDw8ICdcbic7CisgICpvdXRfIDw8IGtQcm9ncmVzc0Jhbm5lcjsKK30KKwordm9pZCBFcnNhdHpQcm9ncmVzczo6TWlsZXN0b25lKCkgeworICBpZiAoIW91dF8pIHsgY3VycmVudF8gPSAwOyByZXR1cm47IH0KKyAgaWYgKCFjb21wbGV0ZV8pIHJldHVybjsKKyAgdW5zaWduZWQgY2hhciBzdG9uZSA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHVpbnQ2NF90PihrV2lkdGgpLCAoY3VycmVudF8gKiBrV2lkdGgpIC8gY29tcGxldGVfKTsKKworICBmb3IgKDsgc3RvbmVzX3dyaXR0ZW5fIDwgc3RvbmU7ICsrc3RvbmVzX3dyaXR0ZW5fKSB7CisgICAgKCpvdXRfKSA8PCAnKic7CisgIH0KKyAgaWYgKHN0b25lID09IGtXaWR0aCkgeworICAgICgqb3V0XykgPDwgc3RkOjplbmRsOworICAgIG5leHRfID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpOworICAgIG91dF8gPSBOVUxMOworICB9IGVsc2UgeworICAgIG5leHRfID0gc3RkOjptYXgobmV4dF8sICgoc3RvbmUgKyAxKSAqIGNvbXBsZXRlXyArIGtXaWR0aCAtIDEpIC8ga1dpZHRoKTsKKyAgfQorfQorCit9IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9lcnNhdHpfcHJvZ3Jlc3MuaGggYi9zcmMva2VubG0vdXRpbC9lcnNhdHpfcHJvZ3Jlc3MuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3YWRlZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL2Vyc2F0el9wcm9ncmVzcy5oaApAQCAtMCwwICsxLDU3IEBACisjaWZuZGVmIFVUSUxfRVJTQVRaX1BST0dSRVNTX0gKKyNkZWZpbmUgVVRJTF9FUlNBVFpfUFJPR1JFU1NfSAorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBFcnNhdHogdmVyc2lvbiBvZiBib29zdDo6cHJvZ3Jlc3Mgc28gY29yZSBsYW5ndWFnZSBtb2RlbCBkb2Vzbid0IGRlcGVuZCBvbgorLy8gYm9vc3QuICBBbHNvIGFkZHMgb3B0aW9uIHRvIHByaW50IG5vdGhpbmcuCisKK25hbWVzcGFjZSB1dGlsIHsKKworZXh0ZXJuIGNvbnN0IGNoYXIga1Byb2dyZXNzQmFubmVyW107CisKK2NsYXNzIEVyc2F0elByb2dyZXNzIHsKKyAgcHVibGljOgorICAgIC8vIE5vIG91dHB1dC4KKyAgICBFcnNhdHpQcm9ncmVzcygpOworCisgICAgLy8gTnVsbCBtZWFucyBubyBvdXRwdXQuICBUaGUgbnVsbCB2YWx1ZSBpcyB1c2VmdWwgZm9yIHBhc3NpbmcgYWxvbmcgdGhlIG9zdHJlYW0gcG9pbnRlciBmcm9tIGFub3RoZXIgY2FsbGVyLgorICAgIGV4cGxpY2l0IEVyc2F0elByb2dyZXNzKHVpbnQ2NF90IGNvbXBsZXRlLCBzdGQ6Om9zdHJlYW0gKnRvID0gJnN0ZDo6Y2VyciwgY29uc3Qgc3RkOjpzdHJpbmcgJm1lc3NhZ2UgPSAiIik7CisKKyAgICB+RXJzYXR6UHJvZ3Jlc3MoKTsKKworICAgIEVyc2F0elByb2dyZXNzICZvcGVyYXRvcisrKCkgeworICAgICAgaWYgKCsrY3VycmVudF8gPj0gbmV4dF8pIE1pbGVzdG9uZSgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEVyc2F0elByb2dyZXNzICZvcGVyYXRvcis9KHVpbnQ2NF90IGFtb3VudCkgeworICAgICAgaWYgKChjdXJyZW50XyArPSBhbW91bnQpID49IG5leHRfKSBNaWxlc3RvbmUoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkIFNldCh1aW50NjRfdCB0bykgeworICAgICAgaWYgKChjdXJyZW50XyA9IHRvKSA+PSBuZXh0XykgTWlsZXN0b25lKCk7CisgICAgfQorCisgICAgdm9pZCBGaW5pc2hlZCgpIHsKKyAgICAgIFNldChjb21wbGV0ZV8pOworICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgTWlsZXN0b25lKCk7CisKKyAgICB1aW50NjRfdCBjdXJyZW50XywgbmV4dF8sIGNvbXBsZXRlXzsKKyAgICB1bnNpZ25lZCBjaGFyIHN0b25lc193cml0dGVuXzsKKyAgICBzdGQ6Om9zdHJlYW0gKm91dF87CisKKyAgICAvLyBub25jb3B5YWJsZQorICAgIEVyc2F0elByb2dyZXNzKGNvbnN0IEVyc2F0elByb2dyZXNzICZvdGhlcik7CisgICAgRXJzYXR6UHJvZ3Jlc3MgJm9wZXJhdG9yPShjb25zdCBFcnNhdHpQcm9ncmVzcyAmb3RoZXIpOworfTsKKworfSAvLyBuYW1lc3BhY2UgdXRpbAorCisjZW5kaWYgLy8gVVRJTF9FUlNBVFpfUFJPR1JFU1NfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvZXhjZXB0aW9uLmNjIGIvc3JjL2tlbmxtL3V0aWwvZXhjZXB0aW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDRkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9leGNlcHRpb24uY2MKQEAgLTAsMCArMSwxMDUgQEAKKyNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKKworI2lmZGVmIF9fR1hYX1JUVEkKKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIHV0aWwgeworCitFeGNlcHRpb246OkV4Y2VwdGlvbigpIHRocm93KCkge30KK0V4Y2VwdGlvbjo6fkV4Y2VwdGlvbigpIHRocm93KCkge30KKwordm9pZCBFeGNlcHRpb246OlNldExvY2F0aW9uKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFyICpjaGlsZF9uYW1lLCBjb25zdCBjaGFyICpjb25kaXRpb24pIHsKKyAgLyogVGhlIGNoaWxkIGNsYXNzIG1pZ2h0IGhhdmUgc2V0IHNvbWUgdGV4dCwgYnV0IHdlIHdhbnQgdGhpcyB0byBjb21lIGZpcnN0LgorICAgKiBBbm90aGVyIG9wdGlvbiB3b3VsZCBiZSBwYXNzaW5nIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnN0cnVjdG9yLCBidXQKKyAgICogdGhlbiBjaGlsZCBjbGFzc2VzIHdvdWxkIGhhdmUgdG8gYWNjZXB0IGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhbmQgcGFzcworICAgKiB0aGVtIGRvd24uCisgICAqLworICBzdGQ6OnN0cmluZyBvbGRfdGV4dDsKKyAgc3RkOjpzd2FwKG9sZF90ZXh0LCB3aGF0Xyk7CisgIFN0cmluZ1N0cmVhbSBzdHJlYW0od2hhdF8pOworICBzdHJlYW0gPDwgZmlsZSA8PCAnOicgPDwgbGluZTsKKyAgaWYgKGZ1bmMpIHN0cmVhbSA8PCAiIGluICIgPDwgZnVuYyA8PCAiIHRocmV3ICI7CisgIGlmIChjaGlsZF9uYW1lKSB7CisgICAgc3RyZWFtIDw8IGNoaWxkX25hbWU7CisgIH0gZWxzZSB7CisjaWZkZWYgX19HWFhfUlRUSQorICAgIHN0cmVhbSA8PCB0eXBlaWQodGhpcykubmFtZSgpOworI2Vsc2UKKyAgICBzdHJlYW0gPDwgImFuIGV4Y2VwdGlvbiI7CisjZW5kaWYKKyAgfQorICBpZiAoY29uZGl0aW9uKSB7CisgICAgc3RyZWFtIDw8ICIgYmVjYXVzZSBgIiA8PCBjb25kaXRpb24gPDwgJ1wnJzsKKyAgfQorICBzdHJlYW0gPDwgIi5cbiI7CisgIHN0cmVhbSA8PCBvbGRfdGV4dDsKK30KKworbmFtZXNwYWNlIHsKKworI2lmZGVmIF9fR05VQ19fCitjb25zdCBjaGFyICpIYW5kbGVTdHJlcnJvcihpbnQgcmV0LCBjb25zdCBjaGFyICpidWYpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKK2NvbnN0IGNoYXIgKkhhbmRsZVN0cmVycm9yKGNvbnN0IGNoYXIgKnJldCwgY29uc3QgY2hhciAqIC8qYnVmKi8pIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKKyNlbmRpZgorLy8gQXQgbGVhc3Qgb25lIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIG5vdCBiZSBjYWxsZWQuCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLWZ1bmN0aW9uIgorI2VuZGlmCisvLyBUaGUgWE9QRU4gdmVyc2lvbi4KK2NvbnN0IGNoYXIgKkhhbmRsZVN0cmVycm9yKGludCByZXQsIGNvbnN0IGNoYXIgKmJ1ZikgeworICBpZiAoIXJldCkgcmV0dXJuIGJ1ZjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIFRoZSBHTlUgdmVyc2lvbi4KK2NvbnN0IGNoYXIgKkhhbmRsZVN0cmVycm9yKGNvbnN0IGNoYXIgKnJldCwgY29uc3QgY2hhciAqIC8qYnVmKi8pIHsKKyAgcmV0dXJuIHJldDsKK30KKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorfSAvLyBuYW1lc3BhY2UKKworRXJybm9FeGNlcHRpb246OkVycm5vRXhjZXB0aW9uKCkgdGhyb3coKSA6IGVycm5vXyhlcnJubykgeworICBjaGFyIGJ1ZlsyMDBdOworICBidWZbMF0gPSAwOworI2lmIGRlZmluZWQoc3VuKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisgIGNvbnN0IGNoYXIgKmFkZCA9IHN0cmVycm9yKGVycm5vKTsKKyNlbHNlCisgIGNvbnN0IGNoYXIgKmFkZCA9IEhhbmRsZVN0cmVycm9yKHN0cmVycm9yX3IoZXJybm8sIGJ1ZiwgMjAwKSwgYnVmKTsKKyNlbmRpZgorCisgIGlmIChhZGQpIHsKKyAgICAqdGhpcyA8PCBhZGQgPDwgJyAnOworICB9Cit9CisKK0Vycm5vRXhjZXB0aW9uOjp+RXJybm9FeGNlcHRpb24oKSB0aHJvdygpIHt9CisKK092ZXJmbG93RXhjZXB0aW9uOjpPdmVyZmxvd0V4Y2VwdGlvbigpIHRocm93KCkge30KK092ZXJmbG93RXhjZXB0aW9uOjp+T3ZlcmZsb3dFeGNlcHRpb24oKSB0aHJvdygpIHt9CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCitXaW5kb3dzRXhjZXB0aW9uOjpXaW5kb3dzRXhjZXB0aW9uKCkgdGhyb3coKSB7CisgIHVuc2lnbmVkIGludCBsYXN0X2Vycm9yID0gR2V0TGFzdEVycm9yKCk7CisgIGNoYXIgZXJyb3JfbXNnWzI1Nl0gPSAiIjsKKyAgaWYgKCFGb3JtYXRNZXNzYWdlQShGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8IEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLCBOVUxMLCBsYXN0X2Vycm9yLCBMQU5HX05FVVRSQUwsIGVycm9yX21zZywgc2l6ZW9mKGVycm9yX21zZyksIE5VTEwpKSB7CisgICAgKnRoaXMgPDwgIldpbmRvd3MgZXJyb3IgIiA8PCBHZXRMYXN0RXJyb3IoKSA8PCAiIHdoaWxlIGZvcm1hdHRpbmcgV2luZG93cyBlcnJvciAiIDw8IGxhc3RfZXJyb3IgPDwgIi4gIjsKKyAgfSBlbHNlIHsKKyAgICAqdGhpcyA8PCAiV2luZG93cyBlcnJvciAiIDw8IGxhc3RfZXJyb3IgPDwgIjogIiA8PCBlcnJvcl9tc2c7CisgIH0KK30KK1dpbmRvd3NFeGNlcHRpb246On5XaW5kb3dzRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL2V4Y2VwdGlvbi5oaCBiL3NyYy9rZW5sbS91dGlsL2V4Y2VwdGlvbi5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Q4MDNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvZXhjZXB0aW9uLmhoCkBAIC0wLDAgKzEsMTU5IEBACisjaWZuZGVmIFVUSUxfRVhDRVBUSU9OX0gKKyNkZWZpbmUgVVRJTF9FWENFUFRJT05fSAorCisjaW5jbHVkZSAidXRpbC9zdHJpbmdfc3RyZWFtLmhoIgorCisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB1dGlsIHsKKwordGVtcGxhdGUgPGNsYXNzIEV4Y2VwdCwgY2xhc3MgRGF0YT4gdHlwZW5hbWUgRXhjZXB0Ojp0ZW1wbGF0ZSBFeGNlcHRpb25UYWc8RXhjZXB0Jj46OklkZW50aXR5IG9wZXJhdG9yPDwoRXhjZXB0ICZlLCBjb25zdCBEYXRhICZkYXRhKTsKKworY2xhc3MgRXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIEV4Y2VwdGlvbigpIHRocm93KCk7CisgICAgdmlydHVhbCB+RXhjZXB0aW9uKCkgdGhyb3coKTsKKworICAgIGNvbnN0IGNoYXIgKndoYXQoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIHdoYXRfLmNfc3RyKCk7IH0KKworICAgIC8vIEZvciB1c2UgYnkgdGhlIFVUSUxfVEhST1cgbWFjcm9zLgorICAgIHZvaWQgU2V0TG9jYXRpb24oCisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgIHVuc2lnbmVkIGludCBsaW5lLAorICAgICAgICBjb25zdCBjaGFyICpmdW5jLAorICAgICAgICBjb25zdCBjaGFyICpjaGlsZF9uYW1lLAorICAgICAgICBjb25zdCBjaGFyICpjb25kaXRpb24pOworCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGUgPGNsYXNzIEV4Y2VwdCwgY2xhc3MgRGF0YT4gZnJpZW5kIHR5cGVuYW1lIEV4Y2VwdDo6dGVtcGxhdGUgRXhjZXB0aW9uVGFnPEV4Y2VwdCY+OjpJZGVudGl0eSBvcGVyYXRvcjw8KEV4Y2VwdCAmZSwgY29uc3QgRGF0YSAmZGF0YSk7CisKKyAgICAvLyBUaGlzIGhlbHBzIHJlc3RyaWN0IG9wZXJhdG9yPDwgZGVmaW5lZCBiZWxvdy4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IEV4Y2VwdGlvblRhZyB7CisgICAgICB0eXBlZGVmIFQgSWRlbnRpdHk7CisgICAgfTsKKworICAgIHN0ZDo6c3RyaW5nIHdoYXRfOworfTsKKworLyogVGhpcyBpbXBsZW1lbnRzIHRoZSBub3JtYWwgb3BlcmF0b3I8PCBmb3IgRXhjZXB0aW9uIGFuZCBhbGwgaXRzIGNoaWxkcmVuLgorICogU0ZJTkFFIG1lYW5zIGl0IG9ubHkgYXBwbGllcyB0byBFeGNlcHRpb24uICBUaGluayBvZiB0aGlzIGFzIGFuIGVyc2F0egorICogYm9vc3Q6OmVuYWJsZV9pZi4KKyAqLwordGVtcGxhdGUgPGNsYXNzIEV4Y2VwdCwgY2xhc3MgRGF0YT4gdHlwZW5hbWUgRXhjZXB0Ojp0ZW1wbGF0ZSBFeGNlcHRpb25UYWc8RXhjZXB0Jj46OklkZW50aXR5IG9wZXJhdG9yPDwoRXhjZXB0ICZlLCBjb25zdCBEYXRhICZkYXRhKSB7CisgIFN0cmluZ1N0cmVhbShlLndoYXRfKSA8PCBkYXRhOworICByZXR1cm4gZTsKK30KKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFVUSUxfRlVOQ19OQU1FIF9fUFJFVFRZX0ZVTkNUSU9OX18KKyNlbHNlCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIFVUSUxfRlVOQ19OQU1FIF9fRlVOQ1RJT05fXworI2Vsc2UKKyNkZWZpbmUgVVRJTF9GVU5DX05BTUUgTlVMTAorI2VuZGlmCisjZW5kaWYKKworLyogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEV4Y2VwdGlvbiwgYWRkIHRoZSBtZXNzYWdlIE1vZGlmeSwgYW5kIHRocm93IGl0LgorICogTW9kaWZ5IGlzIGFwcGVuZGVkIHRvIHRoZSB3aGF0KCkgbWVzc2FnZSBhbmQgY2FuIGNvbnRhaW4gPDwgZm9yIG9zdHJlYW0KKyAqIG9wZXJhdGlvbnMuCisgKgorICogZG8gLi4gd2hpbGUga2x1ZGdlIHRvIHN3YWxsb3cgdHJhaWxpbmcgOyBjaGFyYWN0ZXIKKyAqIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2NwcC9Td2FsbG93aW5nLXRoZS1TZW1pY29sb24uaHRtbCAuCisgKiBBcmcgY2FuIGJlIGEgY29uc3RydWN0b3IgYXJndW1lbnQgdG8gdGhlIGV4Y2VwdGlvbi4KKyAqLworI2RlZmluZSBVVElMX1RIUk9XX0JBQ0tFTkQoQ29uZGl0aW9uLCBFeGNlcHRpb24sIEFyZywgTW9kaWZ5KSBkbyB7IFwKKyAgRXhjZXB0aW9uIFVUSUxfZSBBcmc7IFwKKyAgVVRJTF9lLlNldExvY2F0aW9uKF9fRklMRV9fLCBfX0xJTkVfXywgVVRJTF9GVU5DX05BTUUsICNFeGNlcHRpb24sIENvbmRpdGlvbik7IFwKKyAgVVRJTF9lIDw8IE1vZGlmeTsgXAorICB0aHJvdyBVVElMX2U7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVVRJTF9USFJPV19BUkcoRXhjZXB0aW9uLCBBcmcsIE1vZGlmeSkgXAorICBVVElMX1RIUk9XX0JBQ0tFTkQoTlVMTCwgRXhjZXB0aW9uLCBBcmcsIE1vZGlmeSkKKworI2RlZmluZSBVVElMX1RIUk9XKEV4Y2VwdGlvbiwgTW9kaWZ5KSBcCisgIFVUSUxfVEhST1dfQkFDS0VORChOVUxMLCBFeGNlcHRpb24sICwgTW9kaWZ5KTsKKworI2RlZmluZSBVVElMX1RIUk9XMihNb2RpZnkpIFwKKyAgVVRJTF9USFJPV19CQUNLRU5EKE5VTEwsIHV0aWw6OkV4Y2VwdGlvbiwgLCBNb2RpZnkpOworCisjaWYgX19HTlVDX18gPj0gMworI2RlZmluZSBVVElMX1VOTElLRUxZKHgpIF9fYnVpbHRpbl9leHBlY3QgKCEhKHgpLCAwKQorI2Vsc2UKKyNkZWZpbmUgVVRJTF9VTkxJS0VMWSh4KSAoeCkKKyNlbmRpZgorCisjaWYgX19HTlVDX18gPj0gMworI2RlZmluZSBVVElMX0xJS0VMWSh4KSBfX2J1aWx0aW5fZXhwZWN0ICghISh4KSwgMSkKKyNlbHNlCisjZGVmaW5lIFVUSUxfTElLRUxZKHgpICh4KQorI2VuZGlmCisKKyNkZWZpbmUgVVRJTF9USFJPV19JRl9BUkcoQ29uZGl0aW9uLCBFeGNlcHRpb24sIEFyZywgTW9kaWZ5KSBkbyB7IFwKKyAgaWYgKFVUSUxfVU5MSUtFTFkoQ29uZGl0aW9uKSkgeyBcCisgICAgVVRJTF9USFJPV19CQUNLRU5EKCNDb25kaXRpb24sIEV4Y2VwdGlvbiwgQXJnLCBNb2RpZnkpOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBVVElMX1RIUk9XX0lGKENvbmRpdGlvbiwgRXhjZXB0aW9uLCBNb2RpZnkpIFwKKyAgVVRJTF9USFJPV19JRl9BUkcoQ29uZGl0aW9uLCBFeGNlcHRpb24sICwgTW9kaWZ5KQorCisjZGVmaW5lIFVUSUxfVEhST1dfSUYyKENvbmRpdGlvbiwgTW9kaWZ5KSBcCisgIFVUSUxfVEhST1dfSUZfQVJHKENvbmRpdGlvbiwgdXRpbDo6RXhjZXB0aW9uLCAsIE1vZGlmeSkKKworLy8gRXhjZXB0aW9uIHRoYXQgcmVjb3JkcyBlcnJubyBhbmQgYWRkcyBpdCB0byB0aGUgbWVzc2FnZS4KK2NsYXNzIEVycm5vRXhjZXB0aW9uIDogcHVibGljIEV4Y2VwdGlvbiB7CisgIHB1YmxpYzoKKyAgICBFcnJub0V4Y2VwdGlvbigpIHRocm93KCk7CisKKyAgICB2aXJ0dWFsIH5FcnJub0V4Y2VwdGlvbigpIHRocm93KCk7CisKKyAgICBpbnQgRXJyb3IoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIGVycm5vXzsgfQorCisgIHByaXZhdGU6CisgICAgaW50IGVycm5vXzsKK307CisKKy8vIGZpbGUgd2Fzbid0IHRoZXJlLCBvciBjb3VsZG4ndCBiZSBvcGVuIGZvciBzb21lIHJlYXNvbgorY2xhc3MgRmlsZU9wZW5FeGNlcHRpb24gOiBwdWJsaWMgRXhjZXB0aW9uIHsKKyAgcHVibGljOgorCUZpbGVPcGVuRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICAgIH5GaWxlT3BlbkV4Y2VwdGlvbigpIHRocm93KCkge30KK307CisKKy8vIFV0aWxpdGllcyBmb3Igb3ZlcmZsb3cgY2hlY2tpbmcuCitjbGFzcyBPdmVyZmxvd0V4Y2VwdGlvbiA6IHB1YmxpYyBFeGNlcHRpb24geworICBwdWJsaWM6CisgICAgT3ZlcmZsb3dFeGNlcHRpb24oKSB0aHJvdygpOworICAgIH5PdmVyZmxvd0V4Y2VwdGlvbigpIHRocm93KCk7Cit9OworCit0ZW1wbGF0ZSA8dW5zaWduZWQgbGVuPiBpbmxpbmUgc3RkOjpzaXplX3QgQ2hlY2tPdmVyZmxvd0ludGVybmFsKHVpbnQ2NF90IHZhbHVlKSB7CisgIFVUSUxfVEhST1dfSUYodmFsdWUgPiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnNpemVfdD46Om1heCgpKSwgT3ZlcmZsb3dFeGNlcHRpb24sICJJbnRlZ2VyIG92ZXJmbG93IGRldGVjdGVkLiAgVGhpcyBtb2RlbCBpcyB0b28gYmlnIGZvciAzMi1iaXQgY29kZS4iKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCit0ZW1wbGF0ZSA8PiBpbmxpbmUgc3RkOjpzaXplX3QgQ2hlY2tPdmVyZmxvd0ludGVybmFsPDg+KHVpbnQ2NF90IHZhbHVlKSB7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIHN0ZDo6c2l6ZV90IENoZWNrT3ZlcmZsb3codWludDY0X3QgdmFsdWUpIHsKKyAgcmV0dXJuIENoZWNrT3ZlcmZsb3dJbnRlcm5hbDxzaXplb2Yoc3RkOjpzaXplX3QpPih2YWx1ZSk7Cit9CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisvKiBUaHJvd24gZm9yIFdpbmRvd3Mgc3BlY2lmaWMgb3BlcmF0aW9ucy4gKi8KK2NsYXNzIFdpbmRvd3NFeGNlcHRpb24gOiBwdWJsaWMgRXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIFdpbmRvd3NFeGNlcHRpb24oKSB0aHJvdygpOworICAgIH5XaW5kb3dzRXhjZXB0aW9uKCkgdGhyb3coKTsKK307CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgdXRpbAorCisjZW5kaWYgLy8gVVRJTF9FWENFUFRJT05fSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvZmFrZV9vc3RyZWFtLmhoIGIvc3JjL2tlbmxtL3V0aWwvZmFrZV9vc3RyZWFtLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzYwNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9mYWtlX29zdHJlYW0uaGgKQEAgLTAsMCArMSwxMTEgQEAKKyNpZm5kZWYgVVRJTF9GQUtFX09TVFJFQU1fSAorI2RlZmluZSBVVElMX0ZBS0VfT1NUUkVBTV9ICisKKyNpbmNsdWRlICJ1dGlsL2Zsb2F0X3RvX3N0cmluZy5oaCIKKyNpbmNsdWRlICJ1dGlsL2ludGVnZXJfdG9fc3RyaW5nLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlLmhoIgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHV0aWwgeworCisvKiBMaWtlIHN0ZDo6b3N0cmVhbSBidXQgd2l0aG91dCBiZWluZyBpbmNyZWRpYmx5IHNsb3cuCisgKiBTdXBwb3J0cyBtb3N0IG9mIHRoZSBidWlsdC1pbiB0eXBlcyBleGNlcHQgZm9yIGxvbmcgZG91YmxlLgorICogCisgKiBUaGUgRmFrZU9TdHJlYW0gY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgaW5oZXJpdGVkIGZyb20uICBUaGUgaW5oZXJ0aW5nIGNsYXNzCisgKiBzaG91bGQgcHJvdmlkZToKKyAqIHB1YmxpYzoKKyAqICAgRGVyaXZlZCAmZmx1c2goKTsKKyAqICAgRGVyaXZlZCAmd3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgc3RkOjpzaXplX3QgbGVuZ3RoKTsKKyAqIAorICogcHJpdmF0ZTogb3IgcHJvdGVjdGVkOgorICogICBmcmllbmQgY2xhc3MgRmFrZU9TdHJlYW07CisgKiAgIGNoYXIgKkVuc3VyZShzdGQ6OnNpemVfdCBhbW91bnQpOworICogICB2b2lkIEFkdmFuY2VUbyhjaGFyICp0byk7CisgKgorICogVGhlIEVuc3VyZSBmdW5jdGlvbiBtYWtlcyBlbm91Z2ggc3BhY2UgZm9yIGFuIGluLXBsYWNlIHdyaXRlIGFuZCByZXR1cm5zCisgKiB3aGVyZSB0byB3cml0ZS4gIFRoZSBBZHZhbmNlVG8gZnVuY3Rpb24gaGFwcGVucyBhZnRlciB0aGUgd3JpdGUsIHNheWluZyBob3cKKyAqIG11Y2ggd2FzIGFjdHVhbGx5IHdyaXR0ZW4uCisgKiAKKyAqIFByZWNvbmRpdGlvbjoKKyAqIGFtb3VudCA8PSBrVG9TdHJpbmdNYXhCeXRlcyBmb3IgaW4tcGxhY2Ugd3JpdGVzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4gY2xhc3MgRmFrZU9TdHJlYW0geworICBwdWJsaWM6CisgICAgRmFrZU9TdHJlYW0oKSB7fQorCisgICAgLy8gVGhpcyBhbHNvIGNvdmVycyBzdGQ6OnN0cmluZyBhbmQgY2hhcioKKyAgICBEZXJpdmVkICZvcGVyYXRvcjw8KFN0cmluZ1BpZWNlIHN0cikgeworICAgICAgcmV0dXJuIEMoKS53cml0ZShzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgaW50ZWdlcnMgYnkgc2l6ZSBhbmQgc2lnbmVkbmVzcy4KKyAgcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQXJnPiBzdHJ1Y3QgRW5hYmxlSWZLbHVkZ2UgeworICAgICAgdHlwZWRlZiBEZXJpdmVkIHR5cGU7CisgICAgfTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRnJvbSwgdW5zaWduZWQgTGVuZ3RoID0gc2l6ZW9mKEZyb20pLCBib29sIFNpZ25lZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8RnJvbT46OmlzX3NpZ25lZCwgYm9vbCBJc0ludGVnZXIgPSBzdGQ6Om51bWVyaWNfbGltaXRzPEZyb20+Ojppc19pbnRlZ2VyPiBzdHJ1Y3QgQ29lcmNlIHt9OworCisgICAgdGVtcGxhdGUgPGNsYXNzIEZyb20+IHN0cnVjdCBDb2VyY2U8RnJvbSwgMiwgZmFsc2UsIHRydWU+IHsgdHlwZWRlZiB1aW50MTZfdCBUbzsgfTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRnJvbT4gc3RydWN0IENvZXJjZTxGcm9tLCA0LCBmYWxzZSwgdHJ1ZT4geyB0eXBlZGVmIHVpbnQzMl90IFRvOyB9OworICAgIHRlbXBsYXRlIDxjbGFzcyBGcm9tPiBzdHJ1Y3QgQ29lcmNlPEZyb20sIDgsIGZhbHNlLCB0cnVlPiB7IHR5cGVkZWYgdWludDY0X3QgVG87IH07CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRnJvbT4gc3RydWN0IENvZXJjZTxGcm9tLCAyLCB0cnVlLCB0cnVlPiB7IHR5cGVkZWYgaW50MTZfdCBUbzsgfTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRnJvbT4gc3RydWN0IENvZXJjZTxGcm9tLCA0LCB0cnVlLCB0cnVlPiB7IHR5cGVkZWYgaW50MzJfdCBUbzsgfTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRnJvbT4gc3RydWN0IENvZXJjZTxGcm9tLCA4LCB0cnVlLCB0cnVlPiB7IHR5cGVkZWYgaW50NjRfdCBUbzsgfTsKKyAgcHVibGljOgorICAgIHRlbXBsYXRlIDxjbGFzcyBGcm9tPiB0eXBlbmFtZSBFbmFibGVJZktsdWRnZTx0eXBlbmFtZSBDb2VyY2U8RnJvbT46OlRvPjo6dHlwZSAmb3BlcmF0b3I8PChjb25zdCBGcm9tIHZhbHVlKSB7CisgICAgICByZXR1cm4gQ2FsbFRvU3RyaW5nKHN0YXRpY19jYXN0PHR5cGVuYW1lIENvZXJjZTxGcm9tPjo6VG8+KHZhbHVlKSk7CisgICAgfQorCisgICAgLy8gQ2hhcmFjdGVyIHR5cGVzIHRoYXQgZ2V0IGNvcGllZCBhcyBieXRlcyBpbnN0ZWFkIG9mIGRpc3BsYXllZCBhcyBpbnRlZ2Vycy4KKyAgICBEZXJpdmVkICZvcGVyYXRvcjw8KGNoYXIgdmFsKSB7IHJldHVybiBwdXQodmFsKTsgfQorICAgIERlcml2ZWQgJm9wZXJhdG9yPDwoc2lnbmVkIGNoYXIgdmFsKSB7IHJldHVybiBwdXQoc3RhdGljX2Nhc3Q8Y2hhcj4odmFsKSk7IH0KKyAgICBEZXJpdmVkICZvcGVyYXRvcjw8KHVuc2lnbmVkIGNoYXIgdmFsKSB7IHJldHVybiBwdXQoc3RhdGljX2Nhc3Q8Y2hhcj4odmFsKSk7IH0KKworICAgIERlcml2ZWQgJm9wZXJhdG9yPDwoYm9vbCB2YWwpIHsgcmV0dXJuIHB1dCh2YWwgKyAnMCcpOyB9CisgICAgLy8gZW51bXMgd2lsbCBmYWxsIGJhY2sgdG8gaW50IGJ1dCBhcmUgbm90IGNhdWdodCBieSB0aGUgdGVtcGxhdGUuCisgICAgRGVyaXZlZCAmb3BlcmF0b3I8PChpbnQgdmFsKSB7IHJldHVybiBDYWxsVG9TdHJpbmcoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgQ29lcmNlPGludD46OlRvPih2YWwpKTsgfQorCisgICAgRGVyaXZlZCAmb3BlcmF0b3I8PChmbG9hdCB2YWwpIHsgcmV0dXJuIENhbGxUb1N0cmluZyh2YWwpOyB9CisgICAgRGVyaXZlZCAmb3BlcmF0b3I8PChkb3VibGUgdmFsKSB7IHJldHVybiBDYWxsVG9TdHJpbmcodmFsKTsgfQorCisgICAgLy8gVGhpcyBpcyBoZXJlIHRvIGNhdGNoIGFsbCB0aGUgb3RoZXIgcG9pbnRlciB0eXBlcy4KKyAgICBEZXJpdmVkICZvcGVyYXRvcjw8KGNvbnN0IHZvaWQgKnZhbHVlKSB7IHJldHVybiBDYWxsVG9TdHJpbmcodmFsdWUpOyB9CisgICAgLy8gVGhpcyBpcyBoZXJlIGJlY2F1c2UgdGhlIGFib3ZlIGxpbmUgYWxzbyBjYXRjaGVzIGNvbnN0IGNoYXIqLgorICAgIERlcml2ZWQgJm9wZXJhdG9yPDwoY29uc3QgY2hhciAqdmFsdWUpIHsgcmV0dXJuICp0aGlzIDw8IFN0cmluZ1BpZWNlKHZhbHVlKTsgfQorICAgIERlcml2ZWQgJm9wZXJhdG9yPDwoY2hhciAqdmFsdWUpIHsgcmV0dXJuICp0aGlzIDw8IFN0cmluZ1BpZWNlKHZhbHVlKTsgfQorCisgICAgRGVyaXZlZCAmcHV0KGNoYXIgdmFsKSB7CisgICAgICBjaGFyICpjID0gQygpLkVuc3VyZSgxKTsKKyAgICAgICpjID0gdmFsOworICAgICAgQygpLkFkdmFuY2VUbygrK2MpOworICAgICAgcmV0dXJuIEMoKTsKKyAgICB9CisKKyAgICBjaGFyIHdpZGVuKGNoYXIgdmFsKSBjb25zdCB7IHJldHVybiB2YWw7IH0KKworICBwcml2YXRlOgorICAgIC8vIFJlZmVyZW5jZXMgdG8gZGVyaXZlZCBjbGFzcyBmb3IgY29udmVuaWVuY2UuCisgICAgRGVyaXZlZCAmQygpIHsKKyAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOworICAgIH0KKworICAgIGNvbnN0IERlcml2ZWQgJkMoKSBjb25zdCB7CisgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHNlcGFyYXRlIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBpZiB0aGUgY29tcGlsZXIgY29uc2lkZXJzCisgICAgLy8gdHlwZXMgdGhlIHNhbWUgKGkuZS4gZ2NjIHN0ZDo6c2l6ZV90IGFuZCB1aW50NjRfdCBvciB1aW50MzJfdCkuCisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IERlcml2ZWQgJkNhbGxUb1N0cmluZyhjb25zdCBUIHZhbHVlKSB7CisgICAgICBDKCkuQWR2YW5jZVRvKFRvU3RyaW5nKHZhbHVlLCBDKCkuRW5zdXJlKFRvU3RyaW5nQnVmPFQ+OjprQnl0ZXMpKSk7CisgICAgICByZXR1cm4gQygpOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBVVElMX0ZBS0VfT1NUUkVBTV9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9maWxlLmNjIGIvc3JjL2tlbmxtL3V0aWwvZmlsZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODk3NmJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvZmlsZS5jYwpAQCAtMCwwICsxLDU3NCBAQAorI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisKKyNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyN3YXJuaW5nICJUaGUgZmlsZSBmdW5jdGlvbnMgb24gTWluR1cgaGF2ZSBub3QgYmVlbiB0ZXN0ZWQgZm9yIGZpbGUgc2l6ZXMgYWJvdmUgMl4zMSAtIDEuICBQbGVhc2UgcmVhZCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjUzOTQ4OC9kZXRlcm1pbmUtNjQtYml0LWZpbGUtc2l6ZS1pbi1jLW9uLW1pbmd3LTMyLWJpdCBhbmQgZml4IgorI2VsaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgdXRpbCB7CisKK3Njb3BlZF9mZDo6fnNjb3BlZF9mZCgpIHsKKyAgaWYgKGZkXyAhPSAtMSAmJiBjbG9zZShmZF8pKSB7CisgICAgc3RkOjpjZXJyIDw8ICJDb3VsZCBub3QgY2xvc2UgZmlsZSAiIDw8IGZkXyA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjphYm9ydCgpOworICB9Cit9CisKK3ZvaWQgc2NvcGVkX0ZJTEVfY2xvc2VyOjpDbG9zZShzdGQ6OkZJTEUgKmZpbGUpIHsKKyAgaWYgKGZpbGUgJiYgc3RkOjpmY2xvc2UoZmlsZSkpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkNvdWxkIG5vdCBjbG9zZSBmaWxlICIgPDwgZmlsZSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjphYm9ydCgpOworICB9Cit9CisKKy8vIE5vdGUgdGhhdCBFcnJub0V4Y2VwdGlvbiByZWNvcmRzIGVycm5vIGJlZm9yZSBOYW1lRnJvbUZEIGlzIGNhbGxlZC4KK0ZERXhjZXB0aW9uOjpGREV4Y2VwdGlvbihpbnQgZmQpIHRocm93KCkgOiBmZF8oZmQpLCBuYW1lX2d1ZXNzXyhOYW1lRnJvbUZEKGZkKSkgeworICAqdGhpcyA8PCAiaW4gIiA8PCBuYW1lX2d1ZXNzXyA8PCAnICc7Cit9CisKK0ZERXhjZXB0aW9uOjp+RkRFeGNlcHRpb24oKSB0aHJvdygpIHt9CisKK0VuZE9mRmlsZUV4Y2VwdGlvbjo6RW5kT2ZGaWxlRXhjZXB0aW9uKCkgdGhyb3coKSB7CisgICp0aGlzIDw8ICJFbmQgb2YgZmlsZSI7Cit9CitFbmRPZkZpbGVFeGNlcHRpb246On5FbmRPZkZpbGVFeGNlcHRpb24oKSB0aHJvdygpIHt9CisKK2Jvb2wgSW5wdXRGaWxlSXNTdGRpbihTdHJpbmdQaWVjZSBwYXRoKSB7CisgIHJldHVybiBwYXRoID09ICItIiB8fCBwYXRoID09ICIvZGV2L3N0ZGluIjsKK30KKworYm9vbCBPdXRwdXRGaWxlSXNTdGRvdXQoU3RyaW5nUGllY2UgcGF0aCkgeworICByZXR1cm4gcGF0aCA9PSAiLSIgfHwgcGF0aCA9PSAiL2Rldi9zdGRvdXQiOworfQorCitpbnQgT3BlblJlYWRPclRocm93KGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgaW50IHJldDsKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisgIFVUSUxfVEhST1dfSUYoLTEgPT0gKHJldCA9IF9vcGVuKG5hbWUsIF9PX0JJTkFSWSB8IF9PX1JET05MWSkpLCBFcnJub0V4Y2VwdGlvbiwgIndoaWxlIG9wZW5pbmcgIiA8PCBuYW1lKTsKKyNlbHNlCisgIFVUSUxfVEhST1dfSUYoLTEgPT0gKHJldCA9IG9wZW4obmFtZSwgT19SRE9OTFkpKSwgRXJybm9FeGNlcHRpb24sICJ3aGlsZSBvcGVuaW5nICIgPDwgbmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuIHJldDsKK30KKworaW50IENyZWF0ZU9yVGhyb3coY29uc3QgY2hhciAqbmFtZSkgeworICBpbnQgcmV0OworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyAgVVRJTF9USFJPV19JRigtMSA9PSAocmV0ID0gX29wZW4obmFtZSwgX09fQ1JFQVQgfCBfT19UUlVOQyB8IF9PX1JEV1IgfCBfT19CSU5BUlksIF9TX0lSRUFEIHwgX1NfSVdSSVRFKSksIEVycm5vRXhjZXB0aW9uLCAid2hpbGUgY3JlYXRpbmcgIiA8PCBuYW1lKTsKKyNlbHNlCisgIFVUSUxfVEhST1dfSUYoLTEgPT0gKHJldCA9IG9wZW4obmFtZSwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpKSwgRXJybm9FeGNlcHRpb24sICJ3aGlsZSBjcmVhdGluZyAiIDw8IG5hbWUpOworI2VuZGlmCisgIHJldHVybiByZXQ7Cit9CisKK3VpbnQ2NF90IFNpemVGaWxlKGludCBmZCkgeworI2lmIGRlZmluZWQgX19NSU5HVzMyX18KKyAgc3RydWN0IHN0YXQgc2I7CisgIC8vIERvZXMgdGhpcyBoYW5kbGUgNjQtYml0PworICBpbnQgcmV0ID0gZnN0YXQoZmQsICZzYik7CisgIGlmIChyZXQgPT0gLTEgfHwgKCFzYi5zdF9zaXplICYmICFTX0lTUkVHKHNiLnN0X21vZGUpKSkgcmV0dXJuIGtCYWRTaXplOworICByZXR1cm4gc2Iuc3Rfc2l6ZTsKKyNlbGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyAgX19pbnQ2NCByZXQgPSBfZmlsZWxlbmd0aGk2NChmZCk7CisgIHJldHVybiAocmV0ID09IC0xKSA/IGtCYWRTaXplIDogcmV0OworI2Vsc2UgLy8gTm90IHdpbmRvd3MuCisKKyNpZmRlZiBPU19BTkRST0lECisgIHN0cnVjdCBzdGF0NjQgc2I7CisgIGludCByZXQgPSBmc3RhdDY0KGZkLCAmc2IpOworI2Vsc2UKKyAgc3RydWN0IHN0YXQgc2I7CisgIGludCByZXQgPSBmc3RhdChmZCwgJnNiKTsKKyNlbmRpZgorICBpZiAocmV0ID09IC0xIHx8ICghc2Iuc3Rfc2l6ZSAmJiAhU19JU1JFRyhzYi5zdF9tb2RlKSkpIHJldHVybiBrQmFkU2l6ZTsKKyAgcmV0dXJuIHNiLnN0X3NpemU7CisjZW5kaWYKK30KKwordWludDY0X3QgU2l6ZU9yVGhyb3coaW50IGZkKSB7CisgIHVpbnQ2NF90IHJldCA9IFNpemVGaWxlKGZkKTsKKyAgVVRJTF9USFJPV19JRl9BUkcocmV0ID09IGtCYWRTaXplLCBGREV4Y2VwdGlvbiwgKGZkKSwgIkZhaWxlZCB0byBzaXplIik7CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgUmVzaXplT3JUaHJvdyhpbnQgZmQsIHVpbnQ2NF90IHRvKSB7CisjaWYgZGVmaW5lZCBfX01JTkdXMzJfXworICAgIC8vIERvZXMgdGhpcyBoYW5kbGUgNjQtYml0PworICAgIGludCByZXQgPSBmdHJ1bmNhdGUKKyNlbGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyAgICBlcnJub190IHJldCA9IF9jaHNpemVfcworI2VsaWYgZGVmaW5lZChPU19BTkRST0lEKQorICAgIGludCByZXQgPSBmdHJ1bmNhdGU2NAorI2Vsc2UKKyAgICBpbnQgcmV0ID0gZnRydW5jYXRlCisjZW5kaWYKKyAgICAoZmQsIHRvKTsKKyAgVVRJTF9USFJPV19JRl9BUkcocmV0LCBGREV4Y2VwdGlvbiwgKGZkKSwgIndoaWxlIHJlc2l6aW5nIHRvICIgPDwgdG8gPDwgIiBieXRlcyIpOworfQorCituYW1lc3BhY2Ugeworc3RkOjpzaXplX3QgR3VhcmRMYXJnZShzdGQ6OnNpemVfdCBzaXplKSB7CisgIC8vIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW5nIHN5c3RlbXMgaGF2ZSBicm9rZW4gcmVhZC93cml0ZS9wcmVhZC9wd3JpdGUgdGhhdAorICAvLyBvbmx5IHN1cHBvcnRzIHVwIHRvIDJeMzEuCisgIC8vIE9TIFggbWFuIHBhZ2VzIGNsYWltIHRvIHN1cHBvcnQgNjQtYml0LCBidXQgS2FyZWVtIE0uIERhcndpc2ggaGFkIHByb2JsZW1zCisgIC8vIGJ1aWxkaW5nIHdpdGggbGFyZ2VyIGZpbGVzLCBzbyBBUFBMRSBpcyBhbHNvIGhlcmUuCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KSB8fCBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChPU19BTkRST0lEKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorICByZXR1cm4gc2l6ZSA8IElOVF9NQVggPyBzaXplIDogSU5UX01BWDsKKyNlbHNlCisgIHJldHVybiBzaXplOworI2VuZGlmCit9Cit9CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCituYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzaXplX3Qga01heERXT1JEID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KDQyOTQ5NjcyOTVVTCk7Cit9IC8vIG5hbWVzcGFjZQorI2VuZGlmCisKK3N0ZDo6c2l6ZV90IFBhcnRpYWxSZWFkKGludCBmZCwgdm9pZCAqdG8sIHN0ZDo6c2l6ZV90IGFtb3VudCkgeworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyAgICBEV09SRCByZXQ7CisgICAgSEFORExFIGZpbGVfaGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KF9nZXRfb3NmaGFuZGxlKGZkKSk7CisgICAgRFdPUkQgbGFyZ2VyX3NpemUgPSBzdGF0aWNfY2FzdDxEV09SRD4oc3RkOjptaW48c3RkOjpzaXplX3Q+KGtNYXhEV09SRCwgYW1vdW50KSk7CisgICAgRFdPUkQgc21hbGxlcl9zaXplID0gMjg2NzI7IC8vIFJlY2VpdmVkIHJlcG9ydHMgdGhhdCAzMTM0NiB3b3JrZWQgYnV0IGhpZ2hlciB2YWx1ZXMgZGlkIG5vdC4gVGhpcyByb3VuZHMgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA0MDk2LCB0aGUgcGFnZSBzaXplLiAKKyAgICBpZiAoIVJlYWRGaWxlKGZpbGVfaGFuZGxlLCB0bywgbGFyZ2VyX3NpemUsICZyZXQsIE5VTEwpKQorICAgIHsKKyAgICAgICAgRFdPUkQgbGFzdF9lcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBpZiAobGFzdF9lcnJvciAhPSBFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSB8fCAhUmVhZEZpbGUoZmlsZV9oYW5kbGUsIHRvLCBzbWFsbGVyX3NpemUsICZyZXQsIE5VTEwpKSB7CisgICAgICAgICAgICBVVElMX1RIUk9XKFdpbmRvd3NFeGNlcHRpb24sICJXaW5kb3dzIGVycm9yIGluIFJlYWRGaWxlLiIpOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgZXJybm8gPSAwOworICBzc2l6ZV90IHJldDsKKyAgZG8geworICAgIHJldCA9IHJlYWQoZmQsIHRvLCBHdWFyZExhcmdlKGFtb3VudCkpOworICB9IHdoaWxlIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworICBVVElMX1RIUk9XX0lGX0FSRyhyZXQgPCAwLCBGREV4Y2VwdGlvbiwgKGZkKSwgIndoaWxlIHJlYWRpbmcgIiA8PCBhbW91bnQgPDwgIiBieXRlcyIpOworI2VuZGlmCisgIHJldHVybiBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4ocmV0KTsKK30KKwordm9pZCBSZWFkT3JUaHJvdyhpbnQgZmQsIHZvaWQgKnRvX3ZvaWQsIHN0ZDo6c2l6ZV90IGFtb3VudCkgeworICB1aW50OF90ICp0byA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPih0b192b2lkKTsKKyAgd2hpbGUgKGFtb3VudCkgeworICAgIHN0ZDo6c2l6ZV90IHJldCA9IFBhcnRpYWxSZWFkKGZkLCB0bywgYW1vdW50KTsKKyAgICBVVElMX1RIUk9XX0lGKHJldCA9PSAwLCBFbmRPZkZpbGVFeGNlcHRpb24sICIgaW4gIiA8PCBOYW1lRnJvbUZEKGZkKSA8PCAiIGJ1dCB0aGVyZSBzaG91bGQgYmUgIiA8PCBhbW91bnQgPDwgIiBtb3JlIGJ5dGVzIHRvIHJlYWQuIik7CisgICAgYW1vdW50IC09IHJldDsKKyAgICB0byArPSByZXQ7CisgIH0KK30KKworc3RkOjpzaXplX3QgUmVhZE9yRU9GKGludCBmZCwgdm9pZCAqdG9fdm9pZCwgc3RkOjpzaXplX3QgYW1vdW50KSB7CisgIHVpbnQ4X3QgKnRvID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KHRvX3ZvaWQpOworICBzdGQ6OnNpemVfdCByZW1haW5pbmcgPSBhbW91bnQ7CisgIHdoaWxlIChyZW1haW5pbmcpIHsKKyAgICBzdGQ6OnNpemVfdCByZXQgPSBQYXJ0aWFsUmVhZChmZCwgdG8sIHJlbWFpbmluZyk7CisgICAgaWYgKCFyZXQpIHJldHVybiBhbW91bnQgLSByZW1haW5pbmc7CisgICAgcmVtYWluaW5nIC09IHJldDsKKyAgICB0byArPSByZXQ7CisgIH0KKyAgcmV0dXJuIGFtb3VudDsKK30KKwordm9pZCBXcml0ZU9yVGhyb3coaW50IGZkLCBjb25zdCB2b2lkICpkYXRhX3ZvaWQsIHN0ZDo6c2l6ZV90IHNpemUpIHsKKyAgY29uc3QgdWludDhfdCAqZGF0YSA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhX3ZvaWQpOworICB3aGlsZSAoc2l6ZSkgeworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyAgICBpbnQgcmV0OworI2Vsc2UKKyAgICBzc2l6ZV90IHJldDsKKyNlbmRpZgorICAgIGVycm5vID0gMDsKKyAgICBkbyB7CisgICAgICByZXQgPQorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyAgICAgICAgX3dyaXRlCisjZWxzZQorICAgICAgICB3cml0ZQorI2VuZGlmCisgICAgICAgIChmZCwgZGF0YSwgR3VhcmRMYXJnZShzaXplKSk7CisgICAgfSB3aGlsZSAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKyAgICBVVElMX1RIUk9XX0lGX0FSRyhyZXQgPCAxLCBGREV4Y2VwdGlvbiwgKGZkKSwgIndoaWxlIHdyaXRpbmcgIiA8PCBzaXplIDw8ICIgYnl0ZXMiKTsKKyAgICBkYXRhICs9IHJldDsKKyAgICBzaXplIC09IHJldDsKKyAgfQorfQorCit2b2lkIFdyaXRlT3JUaHJvdyhGSUxFICp0bywgY29uc3Qgdm9pZCAqZGF0YSwgc3RkOjpzaXplX3Qgc2l6ZSkgeworICBpZiAoIXNpemUpIHJldHVybjsKKyAgVVRJTF9USFJPV19JRigxICE9IHN0ZDo6ZndyaXRlKGRhdGEsIHNpemUsIDEsIHRvKSwgRXJybm9FeGNlcHRpb24sICJTaG9ydCB3cml0ZTsgcmVxdWVzdGVkIHNpemUgIiA8PCBzaXplKTsKK30KKwordm9pZCBFcnNhdHpQUmVhZChpbnQgZmQsIHZvaWQgKnRvX3ZvaWQsIHN0ZDo6c2l6ZV90IHNpemUsIHVpbnQ2NF90IG9mZikgeworICB1aW50OF90ICp0byA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPih0b192b2lkKTsKKyAgd2hpbGUgKHNpemUpIHsKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisgICAgLyogQlJPS0VOOiBjaGFuZ2VzIGZpbGUgcG9pbnRlci4gIEV2ZW4gaWYgeW91IHNhdmUgaXQgYW5kIGNoYW5nZSBpdCBiYWNrLCBpdCB3b24ndCBiZSBzYWZlIHRvIHVzZSBjb25jdXJyZW50bHkgd2l0aCB3cml0ZSgpIG9yIHJlYWQoKSB3aGljaCBsbXBseiBkb2VzLiAqLworICAgIC8vIHNpemVfdCBtaWdodCBiZSA2NC1iaXQuICBEV09SRCBpcyBhbHdheXMgMzIuCisgICAgRFdPUkQgcmVhZGluZyA9IHN0YXRpY19jYXN0PERXT1JEPihzdGQ6Om1pbjxzdGQ6OnNpemVfdD4oa01heERXT1JELCBzaXplKSk7CisgICAgRFdPUkQgcmV0OworICAgIE9WRVJMQVBQRUQgb3ZlcmxhcHBlZDsKKyAgICBtZW1zZXQoJm92ZXJsYXBwZWQsIDAsIHNpemVvZihPVkVSTEFQUEVEKSk7CisgICAgb3ZlcmxhcHBlZC5PZmZzZXQgPSBzdGF0aWNfY2FzdDxEV09SRD4ob2ZmKTsKKyAgICBvdmVybGFwcGVkLk9mZnNldEhpZ2ggPSBzdGF0aWNfY2FzdDxEV09SRD4ob2ZmID4+IDMyKTsKKyAgICBVVElMX1RIUk9XX0lGKCFSZWFkRmlsZSgoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZkKSwgdG8sIHJlYWRpbmcsICZyZXQsICZvdmVybGFwcGVkKSwgV2luZG93c0V4Y2VwdGlvbiwgIlJlYWRGaWxlIGZhaWxlZCBmb3Igb2Zmc2V0ICIgPDwgb2ZmKTsKKyNlbHNlCisgICAgc3NpemVfdCByZXQ7CisgICAgZXJybm8gPSAwOworICAgIHJldCA9CisjaWZkZWYgT1NfQU5EUk9JRAorICAgICAgcHJlYWQ2NAorI2Vsc2UKKyAgICAgIHByZWFkCisjZW5kaWYKKyAgICAgIChmZCwgdG8sIEd1YXJkTGFyZ2Uoc2l6ZSksIG9mZik7CisgICAgaWYgKHJldCA8PSAwKSB7CisgICAgICBpZiAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKSBjb250aW51ZTsKKyAgICAgIFVUSUxfVEhST1dfSUYocmV0ID09IDAsIEVuZE9mRmlsZUV4Y2VwdGlvbiwgIiBmb3IgcmVhZGluZyAiIDw8IHNpemUgPDwgIiBieXRlcyBhdCAiIDw8IG9mZiA8PCAiIGZyb20gIiA8PCBOYW1lRnJvbUZEKGZkKSk7CisgICAgICBVVElMX1RIUk9XX0FSRyhGREV4Y2VwdGlvbiwgKGZkKSwgIndoaWxlIHJlYWRpbmcgIiA8PCBzaXplIDw8ICIgYnl0ZXMgYXQgb2Zmc2V0ICIgPDwgb2ZmKTsKKyAgICB9CisjZW5kaWYKKyAgICBzaXplIC09IHJldDsKKyAgICBvZmYgKz0gcmV0OworICAgIHRvICs9IHJldDsKKyAgfQorfQorCit2b2lkIEVyc2F0elBXcml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmZyb21fdm9pZCwgc3RkOjpzaXplX3Qgc2l6ZSwgdWludDY0X3Qgb2ZmKSB7CisgIGNvbnN0IHVpbnQ4X3QgKmZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oZnJvbV92b2lkKTsKKyAgd2hpbGUoc2l6ZSkgeworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyAgICAvKiBDaGFuZ2VzIGZpbGUgcG9pbnRlci4gIEV2ZW4gaWYgeW91IHNhdmUgaXQgYW5kIGNoYW5nZSBpdCBiYWNrLCBpdCB3b24ndCBiZSBzYWZlIHRvIHVzZSBjb25jdXJyZW50bHkgd2l0aCB3cml0ZSgpIG9yIHJlYWQoKSAqLworICAgIC8vIHNpemVfdCBtaWdodCBiZSA2NC1iaXQuICBEV09SRCBpcyBhbHdheXMgMzIuCisgICAgRFdPUkQgd3JpdGluZyA9IHN0YXRpY19jYXN0PERXT1JEPihzdGQ6Om1pbjxzdGQ6OnNpemVfdD4oa01heERXT1JELCBzaXplKSk7CisgICAgRFdPUkQgcmV0OworICAgIE9WRVJMQVBQRUQgb3ZlcmxhcHBlZDsKKyAgICBtZW1zZXQoJm92ZXJsYXBwZWQsIDAsIHNpemVvZihPVkVSTEFQUEVEKSk7CisgICAgb3ZlcmxhcHBlZC5PZmZzZXQgPSBzdGF0aWNfY2FzdDxEV09SRD4ob2ZmKTsKKyAgICBvdmVybGFwcGVkLk9mZnNldEhpZ2ggPSBzdGF0aWNfY2FzdDxEV09SRD4ob2ZmID4+IDMyKTsKKyAgICBVVElMX1RIUk9XX0lGKCFXcml0ZUZpbGUoKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmZCksIGZyb20sIHdyaXRpbmcsICZyZXQsICZvdmVybGFwcGVkKSwgRXhjZXB0aW9uLCAiV3JpdGVGaWxlIGZhaWxlZCBmb3Igb2Zmc2V0ICIgPDwgb2ZmKTsKKyNlbHNlCisgICAgc3NpemVfdCByZXQ7CisgICAgZXJybm8gPSAwOworICAgIHJldCA9CisjaWZkZWYgT1NfQU5EUk9JRAorICAgICAgcHdyaXRlNjQKKyNlbHNlCisgICAgICBwd3JpdGUKKyNlbmRpZgorICAgICAgKGZkLCBmcm9tLCBHdWFyZExhcmdlKHNpemUpLCBvZmYpOworICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikgY29udGludWU7CisgICAgICBVVElMX1RIUk9XX0lGKHJldCA9PSAwLCBFbmRPZkZpbGVFeGNlcHRpb24sICIgZm9yIHdyaXRpbmcgIiA8PCBzaXplIDw8ICIgYnl0ZXMgYXQgIiA8PCBvZmYgPDwgIiBmcm9tICIgPDwgTmFtZUZyb21GRChmZCkpOworICAgICAgVVRJTF9USFJPV19BUkcoRkRFeGNlcHRpb24sIChmZCksICJ3aGlsZSB3cml0aW5nICIgPDwgc2l6ZSA8PCAiIGJ5dGVzIGF0IG9mZnNldCAiIDw8IG9mZik7CisgICAgfQorI2VuZGlmCisgICAgc2l6ZSAtPSByZXQ7CisgICAgb2ZmICs9IHJldDsKKyAgICBmcm9tICs9IHJldDsKKyAgfQorfQorCisKK3ZvaWQgRlN5bmNPclRocm93KGludCBmZCkgeworLy8gQXBwYXJlbnRseSB3aW5kb3dzIGRvZXNuJ3QgaGF2ZSBmc3luYz8KKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU42NCkKKyAgVVRJTF9USFJPV19JRl9BUkcoLTEgPT0gZnN5bmMoZmQpLCBGREV4Y2VwdGlvbiwgKGZkKSwgIndoaWxlIHN5bmNpbmciKTsKKyNlbmRpZgorfQorCituYW1lc3BhY2UgeworCisvLyBTdGF0aWMgYXNzZXJ0IGZvciA2NC1iaXQgb2ZmX3Qgc2l6ZS4KKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU42NCkgJiYgIWRlZmluZWQoT1NfQU5EUk9JRCkKK3RlbXBsYXRlIDx1bnNpZ25lZD4gc3RydWN0IENoZWNrT2ZmVDsKK3RlbXBsYXRlIDw+IHN0cnVjdCBDaGVja09mZlQ8OD4geworICBzdHJ1Y3QgVHJ1ZSB7fTsKK307CisvLyBJZiB0aGVyZSdzIGEgY29tcGlsZXIgZXJyb3Igb24gdGhlIG5leHQgbGluZSwgdGhlbiBvZmZfdCBpc24ndCA2NCBiaXQuICBBbmQKKy8vIHRoYXQgbWFrZXMgbWUgYSBzYWQgcGFuZGEuCit0eXBlZGVmIENoZWNrT2ZmVDxzaXplb2Yob2ZmX3QpPjo6VHJ1ZSBJZ25vcmVkVHlwZTsKKyNlbmRpZgorCisvLyBDYW4ndCB3ZSBhbGwganVzdCBnZXQgYWxvbmc/Cit2b2lkIEludGVybmFsU2VlayhpbnQgZmQsIGludDY0X3Qgb2ZmLCBpbnQgd2hlbmNlKSB7CisgIGlmICgKKyNpZiBkZWZpbmVkIF9fTUlOR1czMl9fCisgICAgLy8gRG9lcyB0aGlzIGhhbmRsZSA2NC1iaXQ/CisgICAgKG9mZl90KS0xID09IGxzZWVrKGZkLCBvZmYsIHdoZW5jZSkKKyNlbGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyAgICAoX19pbnQ2NCktMSA9PSBfbHNlZWtpNjQoZmQsIG9mZiwgd2hlbmNlKQorI2VsaWYgZGVmaW5lZChPU19BTkRST0lEKQorICAgIChvZmY2NF90KS0xID09IGxzZWVrNjQoZmQsIG9mZiwgd2hlbmNlKQorI2Vsc2UKKyAgICAob2ZmX3QpLTEgPT0gbHNlZWsoZmQsIG9mZiwgd2hlbmNlKQorI2VuZGlmCisgICkgVVRJTF9USFJPV19BUkcoRkRFeGNlcHRpb24sIChmZCksICJ3aGlsZSBzZWVraW5nIHRvICIgPDwgb2ZmIDw8ICIgd2hlbmNlICIgPDwgd2hlbmNlKTsKK30KK30gLy8gbmFtZXNwYWNlCisKK3ZvaWQgU2Vla09yVGhyb3coaW50IGZkLCB1aW50NjRfdCBvZmYpIHsKKyAgSW50ZXJuYWxTZWVrKGZkLCBvZmYsIFNFRUtfU0VUKTsKK30KKwordm9pZCBBZHZhbmNlT3JUaHJvdyhpbnQgZmQsIGludDY0X3Qgb2ZmKSB7CisgIEludGVybmFsU2VlayhmZCwgb2ZmLCBTRUVLX0NVUik7Cit9CisKK3ZvaWQgU2Vla0VuZChpbnQgZmQpIHsKKyAgSW50ZXJuYWxTZWVrKGZkLCAwLCBTRUVLX0VORCk7Cit9CisKK3N0ZDo6RklMRSAqRkRPcGVuT3JUaHJvdyhzY29wZWRfZmQgJmZpbGUpIHsKKyAgc3RkOjpGSUxFICpyZXQgPSBmZG9wZW4oZmlsZS5nZXQoKSwgInIrYiIpOworICBVVElMX1RIUk9XX0lGX0FSRyghcmV0LCBGREV4Y2VwdGlvbiwgKGZpbGUuZ2V0KCkpLCAiQ291bGQgbm90IGZkb3BlbiBmb3Igd3JpdGUiKTsKKyAgZmlsZS5yZWxlYXNlKCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0ZDo6RklMRSAqRkRPcGVuUmVhZE9yVGhyb3coc2NvcGVkX2ZkICZmaWxlKSB7CisgIHN0ZDo6RklMRSAqcmV0ID0gZmRvcGVuKGZpbGUuZ2V0KCksICJyYiIpOworICBVVElMX1RIUk9XX0lGX0FSRyghcmV0LCBGREV4Y2VwdGlvbiwgKGZpbGUuZ2V0KCkpLCAiQ291bGQgbm90IGZkb3BlbiBmb3IgcmVhZCIpOworICBmaWxlLnJlbGVhc2UoKTsKKyAgcmV0dXJuIHJldDsKK30KKworLy8gU2lnaC4gIFdpbmRvd3MgdGVtcG9yYXJ5IGZpbGUgY3JlYXRpb24gaXMgZnVsbCBvZiByYWNlIGNvbmRpdGlvbnMuCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQorLyogbWtzdGVtcCBleHRyYWN0ZWQgZnJvbSBsaWJjL3N5c2RlcHMvcG9zaXgvdGVtcG5hbWUuYy4gIENvcHlyaWdodAorICAgKEMpIDE5OTEtMTk5OSwgMjAwMCwgMjAwMSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgKi8KKworLyogVGhpcyBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHRvIHJlbmFtZSB0aGUgZnVuY3Rpb24gYW5kCisgKiBzZXQgdGhlIFdpbmRvd3MgdGVtcG9yYXJ5IGZsYWcuICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGxldHRlcnNbXSA9CisiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkiOworCisvKiBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIG5hbWUgYmFzZWQgb24gVE1QTC4gIFRNUEwgbXVzdCBtYXRjaCB0aGUKKyAgIHJ1bGVzIGZvciBta1tzXXRlbXAgKGkuZS4gZW5kIGluICJYWFhYWFgiKS4gIFRoZSBuYW1lIGNvbnN0cnVjdGVkCisgICBkb2VzIG5vdCBleGlzdCBhdCB0aGUgdGltZSBvZiB0aGUgY2FsbCB0byBta3N0ZW1wLiAgVE1QTCBpcworICAgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgcmVzdWx0LiAgKi8KK2ludAorbWtzdGVtcF9hbmRfdW5saW5rKGNoYXIgKnRtcGwpCit7CisgIGludCBsZW47CisgIGNoYXIgKlhYWFhYWDsKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZTsKKyAgdW5zaWduZWQgbG9uZyBsb25nIHJhbmRvbV90aW1lX2JpdHM7CisgIHVuc2lnbmVkIGludCBjb3VudDsKKyAgaW50IGZkID0gLTE7CisgIGludCBzYXZlX2Vycm5vID0gZXJybm87CisKKyAgLyogQSBsb3dlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHRlbXBvcmFyeSBmaWxlcyB0byBhdHRlbXB0IHRvCisgICAgIGdlbmVyYXRlLiAgVGhlIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIHRlbXBvcmFyeSBmaWxlIG5hbWVzIHRoYXQKKyAgICAgY2FuIGV4aXN0IGZvciBhIGdpdmVuIHRlbXBsYXRlIGlzIDYyKio2LiAgSXQgc2hvdWxkIG5ldmVyIGJlCisgICAgIG5lY2Vzc2FyeSB0byB0cnkgYWxsIHRoZXNlIGNvbWJpbmF0aW9ucy4gIEluc3RlYWQgaWYgYSByZWFzb25hYmxlCisgICAgIG51bWJlciBvZiBuYW1lcyBpcyB0cmllZCAod2UgZGVmaW5lIHJlYXNvbmFibGUgYXMgNjIqKjMpIGZhaWwgdG8KKyAgICAgZ2l2ZSB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3IgdGhlIGNoYW5jZSB0byByZW1vdmUgdGhlIHByb2JsZW1zLiAgKi8KKyNkZWZpbmUgQVRURU1QVFNfTUlOICg2MiAqIDYyICogNjIpCisKKyAgLyogVGhlIG51bWJlciBvZiB0aW1lcyB0byBhdHRlbXB0IHRvIGdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGUuICBUbworICAgICBjb25mb3JtIHRvIFBPU0lYLCB0aGlzIG11c3QgYmUgbm8gc21hbGxlciB0aGFuIFRNUF9NQVguICAqLworI2lmIEFUVEVNUFRTX01JTiA8IFRNUF9NQVgKKyAgdW5zaWduZWQgaW50IGF0dGVtcHRzID0gVE1QX01BWDsKKyNlbHNlCisgIHVuc2lnbmVkIGludCBhdHRlbXB0cyA9IEFUVEVNUFRTX01JTjsKKyNlbmRpZgorCisgIGxlbiA9IHN0cmxlbiAodG1wbCk7CisgIGlmIChsZW4gPCA2IHx8IHN0cmNtcCAoJnRtcGxbbGVuIC0gNl0sICJYWFhYWFgiKSkKKyAgICB7CisgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKy8qIFRoaXMgaXMgd2hlcmUgdGhlIFhzIHN0YXJ0LiAgKi8KKyAgWFhYWFhYID0gJnRtcGxbbGVuIC0gNl07CisKKyAgLyogR2V0IHNvbWUgbW9yZSBvciBsZXNzIHJhbmRvbSBkYXRhLiAgKi8KKyAgeworICAgIFNZU1RFTVRJTUUgICAgICBzdE5vdzsKKyAgICBGSUxFVElNRSBmdE5vdzsKKworICAgIC8vIGdldCBzeXN0ZW0gdGltZQorICAgIEdldFN5c3RlbVRpbWUoJnN0Tm93KTsKKyAgICBzdE5vdy53TWlsbGlzZWNvbmRzID0gNTAwOworICAgIGlmICghU3lzdGVtVGltZVRvRmlsZVRpbWUoJnN0Tm93LCAmZnROb3cpKQorICAgIHsKKyAgICAgICAgZXJybm8gPSAtMTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJhbmRvbV90aW1lX2JpdHMgPSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpZnROb3cuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpCisgICAgICAgICAgICAgICAgICAgICAgICB8ICh1bnNpZ25lZCBsb25nIGxvbmcpZnROb3cuZHdMb3dEYXRlVGltZSk7CisgIH0KKyAgdmFsdWUgKz0gcmFuZG9tX3RpbWVfYml0cyBeICh1bnNpZ25lZCBsb25nIGxvbmcpR2V0Q3VycmVudFRocmVhZElkICgpOworCisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGF0dGVtcHRzOyB2YWx1ZSArPSA3Nzc3LCArK2NvdW50KQorICB7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHYgPSB2YWx1ZTsKKworICAgIC8qIEZpbGwgaW4gdGhlIHJhbmRvbSBiaXRzLiAgKi8KKyAgICBYWFhYWFhbMF0gPSBsZXR0ZXJzW3YgJSA2Ml07CisgICAgdiAvPSA2MjsKKyAgICBYWFhYWFhbMV0gPSBsZXR0ZXJzW3YgJSA2Ml07CisgICAgdiAvPSA2MjsKKyAgICBYWFhYWFhbMl0gPSBsZXR0ZXJzW3YgJSA2Ml07CisgICAgdiAvPSA2MjsKKyAgICBYWFhYWFhbM10gPSBsZXR0ZXJzW3YgJSA2Ml07CisgICAgdiAvPSA2MjsKKyAgICBYWFhYWFhbNF0gPSBsZXR0ZXJzW3YgJSA2Ml07CisgICAgdiAvPSA2MjsKKyAgICBYWFhYWFhbNV0gPSBsZXR0ZXJzW3YgJSA2Ml07CisKKyAgICAvKiBNb2RpZmllZCBmb3Igd2luZG93cyBhbmQgdG8gdW5saW5rICovCisgICAgLy8gICAgICBmZCA9IG9wZW4gKHRtcGwsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX0VYQ0wsIF9TX0lSRUFEIHwgX1NfSVdSSVRFKTsKKyAgICBpbnQgZmxhZ3MgPSBfT19SRFdSIHwgX09fQ1JFQVQgfCBfT19FWENMIHwgX09fQklOQVJZOworICAgIGZsYWdzIHw9IF9PX1RFTVBPUkFSWTsKKyAgICBmZCA9IF9vcGVuICh0bXBsLCBmbGFncywgX1NfSVJFQUQgfCBfU19JV1JJVEUpOworICAgIGlmIChmZCA+PSAwKQorICAgIHsKKyAgICAgIGVycm5vID0gc2F2ZV9lcnJubzsKKyAgICAgIHJldHVybiBmZDsKKyAgICB9CisgICAgZWxzZSBpZiAoZXJybm8gIT0gRUVYSVNUKQorICAgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogV2UgZ290IG91dCBvZiB0aGUgbG9vcCBiZWNhdXNlIHdlIHJhbiBvdXQgb2YgY29tYmluYXRpb25zIHRvIHRyeS4gICovCisgIGVycm5vID0gRUVYSVNUOworICByZXR1cm4gLTE7Cit9CisjZWxzZQoraW50Citta3N0ZW1wX2FuZF91bmxpbmsoY2hhciAqdG1wbCkgeworICBpbnQgcmV0ID0gbWtzdGVtcCh0bXBsKTsKKyAgaWYgKHJldCAhPSAtMSkgeworICAgIFVUSUxfVEhST1dfSUYodW5saW5rKHRtcGwpLCBFcnJub0V4Y2VwdGlvbiwgIndoaWxlIGRlbGV0aW5nIGRlbGV0ZSAiIDw8IHRtcGwpOworICB9CisgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLy8gSWYgaXQncyBhIGRpcmVjdG9yeSwgYWRkIGEgLy4gIFRoaXMgbGV0cyB1c2VycyBzYXkgLVQgL3RtcCB3aXRob3V0IGNyZWF0aW5nCisvLyAvdG1wQUFBQUFBCit2b2lkIE5vcm1hbGl6ZVRlbXBQcmVmaXgoc3RkOjpzdHJpbmcgJmJhc2UpIHsKKyAgaWYgKGJhc2UuZW1wdHkoKSkgcmV0dXJuOworICBpZiAoYmFzZVtiYXNlLnNpemUoKSAtIDFdID09ICcvJykgcmV0dXJuOworICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgLy8gSXQncyBmaW5lIGZvciBpdCB0byBub3QgZXhpc3QuCisgIGlmICgtMSA9PSBzdGF0KGJhc2UuY19zdHIoKSwgJnNiKSkgcmV0dXJuOworICBpZiAoCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQorICAgIHNiLnN0X21vZGUgJiBfU19JRkRJUgorI2Vsc2UKKyAgICBTX0lTRElSKHNiLnN0X21vZGUpCisjZW5kaWYKKyAgICApIGJhc2UgKz0gJy8nOworfQorCitpbnQgTWFrZVRlbXAoY29uc3QgU3RyaW5nUGllY2UgJmJhc2UpIHsKKyAgc3RkOjpzdHJpbmcgbmFtZShiYXNlLmRhdGEoKSwgYmFzZS5zaXplKCkpOworICBuYW1lICs9ICJYWFhYWFgiOworICBuYW1lLnB1c2hfYmFjaygwKTsKKyAgaW50IHJldDsKKyAgVVRJTF9USFJPV19JRigtMSA9PSAocmV0ID0gbWtzdGVtcF9hbmRfdW5saW5rKCZuYW1lWzBdKSksIEVycm5vRXhjZXB0aW9uLCAid2hpbGUgbWFraW5nIGEgdGVtcG9yYXJ5IGJhc2VkIG9uICIgPDwgYmFzZSk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0ZDo6RklMRSAqRk1ha2VUZW1wKGNvbnN0IFN0cmluZ1BpZWNlICZiYXNlKSB7CisgIHV0aWw6OnNjb3BlZF9mZCBmaWxlKE1ha2VUZW1wKGJhc2UpKTsKKyAgcmV0dXJuIEZET3Blbk9yVGhyb3coZmlsZSk7Cit9CisKK2ludCBEdXBPclRocm93KGludCBmZCkgeworICBpbnQgcmV0ID0gZHVwKGZkKTsKKyAgVVRJTF9USFJPV19JRl9BUkcocmV0ID09IC0xLCBGREV4Y2VwdGlvbiwgKGZkKSwgImluIGR1cGxpY2F0aW5nIHRoZSBmaWxlIGRlc2NyaXB0b3IiKTsKKyAgcmV0dXJuIHJldDsKK30KKworbmFtZXNwYWNlIHsKKy8vIFRyeSB0byBuYW1lIHRoaW5ncyBidXQgYmUgd2lsbGluZyB0byBmYWlsIHRvby4KK2Jvb2wgVHJ5TmFtZShpbnQgZmQsIHN0ZDo6c3RyaW5nICZvdXQpIHsKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgIHN0ZDo6c3RyaW5nIG5hbWUoIi9wcm9jL3NlbGYvZmQvIik7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb252ZXJ0OworICBjb252ZXJ0IDw8IGZkOworICBuYW1lICs9IGNvbnZlcnQuc3RyKCk7CisKKyAgc3RydWN0IHN0YXQgc2I7CisgIGlmICgtMSA9PSBsc3RhdChuYW1lLmNfc3RyKCksICZzYikpCisgICAgcmV0dXJuIGZhbHNlOworICBvdXQucmVzaXplKHNiLnN0X3NpemUgKyAxKTsKKyAgLy8gbHN0YXQgZ2F2ZSB1cyBhIHNpemUsIGJ1dCBJJ3ZlIHNlZW4gaXQgZ3JvdywgcG9zc2libHkgZHVlIHRvIHN5bWxpbmtzIG9uIHRvcCBvZiBzeW1saW5rcy4KKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzc2l6ZV90IHJldCA9IHJlYWRsaW5rKG5hbWUuY19zdHIoKSwgJm91dFswXSwgb3V0LnNpemUoKSk7CisgICAgaWYgKC0xID09IHJldCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoKHNpemVfdClyZXQgPCBvdXQuc2l6ZSgpKSB7CisgICAgICBvdXQucmVzaXplKHJldCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gRXhwb25lbnRpYWwgZ3Jvd3RoLgorICAgIG91dC5yZXNpemUob3V0LnNpemUoKSAqIDIpOworICB9CisgIC8vIERvbid0IHVzZSB0aGUgbm9uLWZpbGUgbmFtZXMuCisgIGlmICghb3V0LmVtcHR5KCkgJiYgb3V0WzBdICE9ICcvJykKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworI2VuZGlmCit9Cit9IC8vIG5hbWVzcGFjZQorCitzdGQ6OnN0cmluZyBOYW1lRnJvbUZEKGludCBmZCkgeworICBzdGQ6OnN0cmluZyByZXQ7CisgIGlmIChUcnlOYW1lKGZkLCByZXQpKSByZXR1cm4gcmV0OworICBzd2l0Y2ggKGZkKSB7CisgICAgY2FzZSAwOiByZXR1cm4gInN0ZGluIjsKKyAgICBjYXNlIDE6IHJldHVybiAic3Rkb3V0IjsKKyAgICBjYXNlIDI6IHJldHVybiAic3RkZXJyIjsKKyAgfQorICByZXQgPSAiZmQgIjsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvbnZlcnQ7CisgIGNvbnZlcnQgPDwgZmQ7CisgIHJldCArPSBjb252ZXJ0LnN0cigpOworICByZXR1cm4gcmV0OworfQorCit9IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9maWxlLmhoIGIvc3JjL2tlbmxtL3V0aWwvZmlsZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2NiNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvZmlsZS5oaApAQCAtMCwwICsxLDE1NCBAQAorI2lmbmRlZiBVVElMX0ZJTEVfSAorI2RlZmluZSBVVElMX0ZJTEVfSAorCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCisjaW5jbHVkZSAidXRpbC9zdHJpbmdfcGllY2UuaGgiCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB1dGlsIHsKKworY2xhc3Mgc2NvcGVkX2ZkIHsKKyAgcHVibGljOgorICAgIHNjb3BlZF9mZCgpIDogZmRfKC0xKSB7fQorCisgICAgZXhwbGljaXQgc2NvcGVkX2ZkKGludCBmZCkgOiBmZF8oZmQpIHt9CisKKyAgICB+c2NvcGVkX2ZkKCk7CisKKyAgICB2b2lkIHJlc2V0KGludCB0byA9IC0xKSB7CisgICAgICBzY29wZWRfZmQgb3RoZXIoZmRfKTsKKyAgICAgIGZkXyA9IHRvOworICAgIH0KKworICAgIGludCBnZXQoKSBjb25zdCB7IHJldHVybiBmZF87IH0KKworICAgIGludCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBmZF87IH0KKworICAgIGludCByZWxlYXNlKCkgeworICAgICAgaW50IHJldCA9IGZkXzsKKyAgICAgIGZkXyA9IC0xOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBpbnQgZmRfOworCisgICAgc2NvcGVkX2ZkKGNvbnN0IHNjb3BlZF9mZCAmKTsKKyAgICBzY29wZWRfZmQgJm9wZXJhdG9yPShjb25zdCBzY29wZWRfZmQgJik7Cit9OworCitzdHJ1Y3Qgc2NvcGVkX0ZJTEVfY2xvc2VyIHsKKyAgc3RhdGljIHZvaWQgQ2xvc2Uoc3RkOjpGSUxFICpmaWxlKTsKK307Cit0eXBlZGVmIHNjb3BlZDxzdGQ6OkZJTEUsIHNjb3BlZF9GSUxFX2Nsb3Nlcj4gc2NvcGVkX0ZJTEU7CisKKy8qIFRocm93biBmb3IgYW55IG9wZXJhdGlvbiB3aGVyZSB0aGUgZmQgaXMga25vd24uICovCitjbGFzcyBGREV4Y2VwdGlvbiA6IHB1YmxpYyBFcnJub0V4Y2VwdGlvbiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBGREV4Y2VwdGlvbihpbnQgZmQpIHRocm93KCk7CisKKyAgICB2aXJ0dWFsIH5GREV4Y2VwdGlvbigpIHRocm93KCk7CisKKyAgICAvLyBUaGlzIG1heSBubyBsb25nZXIgYmUgdmFsaWQgaWYgdGhlIGV4Y2VwdGlvbiB3YXMgdGhyb3duIHBhc3Qgb3Blbi4KKyAgICBpbnQgRkQoKSBjb25zdCB7IHJldHVybiBmZF87IH0KKworICAgIC8vIEd1ZXNzIGZyb20gTmFtZUZyb21GRC4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZUd1ZXNzKCkgY29uc3QgeyByZXR1cm4gbmFtZV9ndWVzc187IH0KKworICBwcml2YXRlOgorICAgIGludCBmZF87CisKKyAgICBzdGQ6OnN0cmluZyBuYW1lX2d1ZXNzXzsKK307CisKKy8vIEVuZCBvZiBmaWxlIHJlYWNoZWQuCitjbGFzcyBFbmRPZkZpbGVFeGNlcHRpb24gOiBwdWJsaWMgRXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIEVuZE9mRmlsZUV4Y2VwdGlvbigpIHRocm93KCk7CisgICAgfkVuZE9mRmlsZUV4Y2VwdGlvbigpIHRocm93KCk7Cit9OworCisvLyBPcGVuIGZvciByZWFkIG9ubHkuCitpbnQgT3BlblJlYWRPclRocm93KGNvbnN0IGNoYXIgKm5hbWUpOworLy8gQ3JlYXRlIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdCwgdHJ1bmNhdGUgaWYgaXQgZG9lcy4gIE9wZW5lZCBmb3Igd3JpdGUuCitpbnQgQ3JlYXRlT3JUaHJvdyhjb25zdCBjaGFyICpuYW1lKTsKKworLyoqIERvZXMgdGhlIGdpdmVuIGlucHV0IGZpbGUgcGF0aCBkZW5vdGUgc3RhbmRhcmQgaW5wdXQ/CisgKgorICogUmV0dXJucyB0cnVlIGlmLCBhbmQgb25seSBpZiwgcGF0aCBpcyBlaXRoZXIgIi0iIG9yICIvZGV2L3N0ZGluIi4KKyAqCisgKiBPcGVuaW5nIHN0YW5kYXJkIGlucHV0IGFzIGEgZmlsZSBtYXkgbmVlZCBzb21lIHNwZWNpYWwgdHJlYXRtZW50IGZvcgorICogcG9ydGFiaWxpdHkuICBUaGVyZSdzIGEgY29udmVudGlvbiB0aGF0IGEgZGFzaCAoIi0iKSBpbiBwbGFjZSBvZiBhbiBpbnB1dAorICogZmlsZSBwYXRoIGRlbm90ZXMgc3RhbmRhcmQgaW5wdXQsIGJ1dCBvcGVuaW5nICIvZGV2L3N0ZGluIiBtYXkgbmVlZCB0byBiZQorICogc3BlY2lhbCBhcyB3ZWxsLgorICovCitib29sIElucHV0UGF0aElzU3RkaW4oU3RyaW5nUGllY2UgcGF0aCk7CisKKy8qKiBEb2VzIHRoZSBnaXZlbiBvdXRwdXQgZmlsZSBwYXRoIGRlbm90ZSBzdGFuZGFyZCBvdXRwdXQ/CisgKgorICogUmV0dXJucyB0cnVlIGlmLCBhbmQgb25seSBpZiwgcGF0aCBpcyBlaXRoZXIgIi0iIG9yICIvZGV2L3N0ZG91dCIuCisgKgorICogT3BlbmluZyBzdGFuZGFyZCBvdXRwdXQgYXMgYSBmaWxlIG1heSBuZWVkIHNvbWUgc3BlY2lhbCB0cmVhdG1lbnQgZm9yCisgKiBwb3J0YWJpbGl0eS4gIFRoZXJlJ3MgYSBjb252ZW50aW9uIHRoYXQgYSBkYXNoICgiLSIpIGluIHBsYWNlIG9mIGFuIG91dHB1dAorICogZmlsZSBwYXRoIGRlbm90ZXMgc3RhbmRhcmQgb3V0cHV0LCBidXQgb3BlbmluZyAiL2Rldi9zdGRvdXQiIG1heSBuZWVkIHRvIGJlCisgKiBzcGVjaWFsIGFzIHdlbGwuCisgKi8KK2Jvb2wgT3V0cHV0UGF0aElzU3Rkb3V0KFN0cmluZ1BpZWNlIHBhdGgpOworCisvLyBSZXR1cm4gdmFsdWUgZm9yIFNpemVGaWxlIHdoZW4gaXQgY2FuJ3Qgc2l6ZSBwcm9wZXJseS4KK2NvbnN0IHVpbnQ2NF90IGtCYWRTaXplID0gKHVpbnQ2NF90KS0xOwordWludDY0X3QgU2l6ZUZpbGUoaW50IGZkKTsKK3VpbnQ2NF90IFNpemVPclRocm93KGludCBmZCk7CisKK3ZvaWQgUmVzaXplT3JUaHJvdyhpbnQgZmQsIHVpbnQ2NF90IHRvKTsKKworc3RkOjpzaXplX3QgUGFydGlhbFJlYWQoaW50IGZkLCB2b2lkICp0bywgc3RkOjpzaXplX3Qgc2l6ZSk7Cit2b2lkIFJlYWRPclRocm93KGludCBmZCwgdm9pZCAqdG8sIHN0ZDo6c2l6ZV90IHNpemUpOworc3RkOjpzaXplX3QgUmVhZE9yRU9GKGludCBmZCwgdm9pZCAqdG9fdm9pZCwgc3RkOjpzaXplX3Qgc2l6ZSk7CisKK3ZvaWQgV3JpdGVPclRocm93KGludCBmZCwgY29uc3Qgdm9pZCAqZGF0YV92b2lkLCBzdGQ6OnNpemVfdCBzaXplKTsKK3ZvaWQgV3JpdGVPclRocm93KEZJTEUgKnRvLCBjb25zdCB2b2lkICpkYXRhLCBzdGQ6OnNpemVfdCBzaXplKTsKKworLyogVGhlc2UgY2FsbCBwcmVhZC9wd3JpdGUgaW4gYSBsb29wLiAgSG93ZXZlciwgb24gV2luZG93cyB0aGV5IGNhbGwgUmVhZEZpbGUvCisgKiBXcml0ZUZpbGUgd2hpY2ggY2hhbmdlcyB0aGUgZmlsZSBwb2ludGVyLiAgU28gaXQncyBzYWZlIHRvIGNhbGwgRXJzYXR6UFJlYWQKKyAqIGFuZCBFcnNhdHpQV3JpdGUgY29uY3VycmVudGx5IChvciBhbnkgY29tYmluYXRpb24gdGhlcmVvZikuICBCdXQgaXQgY2hhbmdlcworICogdGhlIGZpbGUgcG9pbnRlciBvbiB3aW5kb3dzLCBzbyBpdCdzIG5vdCBzYWZlIHRvIGNhbGwgY29uY3VycmVudGx5IHdpdGgKKyAqIGFueXRoaW5nIHRoYXQgdXNlcyB0aGUgaW1wbGljaXQgZmlsZSBwb2ludGVyIGUuZy4gdGhlIFJlYWQvV3JpdGUgZnVuY3Rpb25zCisgKiBhYm92ZS4KKyAqLwordm9pZCBFcnNhdHpQUmVhZChpbnQgZmQsIHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBzaXplLCB1aW50NjRfdCBvZmYpOwordm9pZCBFcnNhdHpQV3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpkYXRhX3ZvaWQsIHN0ZDo6c2l6ZV90IHNpemUsIHVpbnQ2NF90IG9mZik7CisKK3ZvaWQgRlN5bmNPclRocm93KGludCBmZCk7CisKKy8vIFNlZWtpbmcKK3ZvaWQgU2Vla09yVGhyb3coaW50IGZkLCB1aW50NjRfdCBvZmYpOwordm9pZCBBZHZhbmNlT3JUaHJvdyhpbnQgZmQsIGludDY0X3Qgb2ZmKTsKK3ZvaWQgU2Vla0VuZChpbnQgZmQpOworCitzdGQ6OkZJTEUgKkZET3Blbk9yVGhyb3coc2NvcGVkX2ZkICZmaWxlKTsKK3N0ZDo6RklMRSAqRkRPcGVuUmVhZE9yVGhyb3coc2NvcGVkX2ZkICZmaWxlKTsKKworLy8gVGVtcG9yYXJ5IGZpbGVzCisvLyBBcHBlbmQgYSAvIGlmIGJhc2UgaXMgYSBkaXJlY3RvcnkuCit2b2lkIE5vcm1hbGl6ZVRlbXBQcmVmaXgoc3RkOjpzdHJpbmcgJmJhc2UpOworaW50IE1ha2VUZW1wKGNvbnN0IFN0cmluZ1BpZWNlICZwcmVmaXgpOworc3RkOjpGSUxFICpGTWFrZVRlbXAoY29uc3QgU3RyaW5nUGllY2UgJnByZWZpeCk7CisKKy8vIGR1cCBhbiBmZC4KK2ludCBEdXBPclRocm93KGludCBmZCk7CisKKy8qIEF0dGVtcHQgZ2V0IGZpbGUgbmFtZSBmcm9tIGZkLiAgVGhpcyB3b24ndCBhbHdheXMgd29yayAoaS5lLiBvbiBXaW5kb3dzIG9yCisgKiBhIHBpcGUpLiAgVGhlIGZpbGUgbWlnaHQgaGF2ZSBiZWVuIHJlbmFtZWQuICBJdCdzIGludGVuZGVkIGZvciBkaWFnbm9zdGljcworICogYW5kIGxvZ2dpbmcgb25seS4KKyAqLworc3RkOjpzdHJpbmcgTmFtZUZyb21GRChpbnQgZmQpOworCit9IC8vIG5hbWVzcGFjZSB1dGlsCisKKyNlbmRpZiAvLyBVVElMX0ZJTEVfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvZmlsZV9waWVjZS5jYyBiL3NyYy9rZW5sbS91dGlsL2ZpbGVfcGllY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0ZDNhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL2ZpbGVfcGllY2UuY2MKQEAgLTAsMCArMSwzMzcgQEAKKyNpbmNsdWRlICJ1dGlsL2ZpbGVfcGllY2UuaGgiCisKKyNpbmNsdWRlICJ1dGlsL2RvdWJsZS1jb252ZXJzaW9uL2RvdWJsZS1jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvbW1hcC5oaCIKKworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyNpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCituYW1lc3BhY2UgdXRpbCB7CisKK1BhcnNlTnVtYmVyRXhjZXB0aW9uOjpQYXJzZU51bWJlckV4Y2VwdGlvbihTdHJpbmdQaWVjZSB2YWx1ZSkgdGhyb3coKSB7CisgICp0aGlzIDw8ICJDb3VsZCBub3QgcGFyc2UgXCIiIDw8IHZhbHVlIDw8ICJcIiBpbnRvIGEgIjsKK30KKworLy8gU2lnaCB0aGlzIGlzIHRoZSBvbmx5IHdheSBJIGNvdWxkIGNvbWUgdXAgd2l0aCB0byBkbyBhIF9jb25zdF8gYm9vbC4gIEl0IGhhcyAnICcsICdcZicsICdcbicsICdccicsICdcdCcsIGFuZCAnXHYnIChzYW1lIGFzIGlzc3BhY2Ugb24gQyBsb2NhbGUpLgorY29uc3QgYm9vbCBrU3BhY2VzWzI1Nl0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisKK0ZpbGVQaWVjZTo6RmlsZVBpZWNlKGNvbnN0IGNoYXIgKm5hbWUsIHN0ZDo6b3N0cmVhbSAqc2hvd19wcm9ncmVzcywgc3RkOjpzaXplX3QgbWluX2J1ZmZlcikgOgorICBmaWxlXyhPcGVuUmVhZE9yVGhyb3cobmFtZSkpLCB0b3RhbF9zaXplXyhTaXplRmlsZShmaWxlXy5nZXQoKSkpLCBwYWdlXyhTaXplUGFnZSgpKSwKKyAgcHJvZ3Jlc3NfKHRvdGFsX3NpemVfLCB0b3RhbF9zaXplXyA9PSBrQmFkU2l6ZSA/IE5VTEwgOiBzaG93X3Byb2dyZXNzLCBzdGQ6OnN0cmluZygiUmVhZGluZyAiKSArIG5hbWUpIHsKKyAgSW5pdGlhbGl6ZShuYW1lLCBzaG93X3Byb2dyZXNzLCBtaW5fYnVmZmVyKTsKK30KKworbmFtZXNwYWNlIHsKK3N0ZDo6c3RyaW5nIE5hbWVQb3NzaWJseUZpbmQoaW50IGZkLCBjb25zdCBjaGFyICpuYW1lKSB7CisgIGlmIChuYW1lKSByZXR1cm4gbmFtZTsKKyAgcmV0dXJuIE5hbWVGcm9tRkQoZmQpOworfQorfSAvLyBuYW1lc3BhY2UKKworRmlsZVBpZWNlOjpGaWxlUGllY2UoaW50IGZkLCBjb25zdCBjaGFyICpuYW1lLCBzdGQ6Om9zdHJlYW0gKnNob3dfcHJvZ3Jlc3MsIHN0ZDo6c2l6ZV90IG1pbl9idWZmZXIpIDoKKyAgZmlsZV8oZmQpLCB0b3RhbF9zaXplXyhTaXplRmlsZShmaWxlXy5nZXQoKSkpLCBwYWdlXyhTaXplUGFnZSgpKSwKKyAgcHJvZ3Jlc3NfKHRvdGFsX3NpemVfLCB0b3RhbF9zaXplXyA9PSBrQmFkU2l6ZSA/IE5VTEwgOiBzaG93X3Byb2dyZXNzLCBzdGQ6OnN0cmluZygiUmVhZGluZyAiKSArIE5hbWVQb3NzaWJseUZpbmQoZmQsIG5hbWUpKSB7CisgIEluaXRpYWxpemUoTmFtZVBvc3NpYmx5RmluZChmZCwgbmFtZSkuY19zdHIoKSwgc2hvd19wcm9ncmVzcywgbWluX2J1ZmZlcik7Cit9CisKK0ZpbGVQaWVjZTo6RmlsZVBpZWNlKHN0ZDo6aXN0cmVhbSAmc3RyZWFtLCBjb25zdCBjaGFyICpuYW1lLCBzdGQ6OnNpemVfdCBtaW5fYnVmZmVyKSA6CisgIHRvdGFsX3NpemVfKGtCYWRTaXplKSwgcGFnZV8oU2l6ZVBhZ2UoKSkgeworICBJbml0aWFsaXplTm9SZWFkKCJpc3RyZWFtIiwgbWluX2J1ZmZlcik7CisKKyAgZmFsbGJhY2tfdG9fcmVhZF8gPSB0cnVlOworICBIdWdlTWFsbG9jKGRlZmF1bHRfbWFwX3NpemVfLCBmYWxzZSwgZGF0YV8pOworICBwb3NpdGlvbl8gPSBkYXRhXy5iZWdpbigpOworICBwb3NpdGlvbl9lbmRfID0gcG9zaXRpb25fOworCisgIGZlbGxfYmFja18uUmVzZXQoc3RyZWFtKTsKK30KKworRmlsZVBpZWNlOjp+RmlsZVBpZWNlKCkge30KKworU3RyaW5nUGllY2UgRmlsZVBpZWNlOjpSZWFkTGluZShjaGFyIGRlbGltLCBib29sIHN0cmlwX2NyKSB7CisgIHN0ZDo6c2l6ZV90IHNraXAgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIGZvciAoY29uc3QgY2hhciAqaSA9IHBvc2l0aW9uXyArIHNraXA7IGkgPCBwb3NpdGlvbl9lbmRfOyArK2kpIHsKKyAgICAgIGlmICgqaSA9PSBkZWxpbSkgeworICAgICAgICAvLyBFbmQgb2YgbGluZS4KKyAgICAgICAgLy8gVGFrZSAxIGJ5dGUgb2ZmIHRoZSBlbmQgaWYgaXQncyBhbiB1bndhbnRlZCBjYXJyaWFnZSByZXR1cm4uCisgICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IHN1YnRyYWN0X2NyID0gKAorICAgICAgICAgICAgKHN0cmlwX2NyICYmIGkgPiBwb3NpdGlvbl8gJiYgKihpIC0gMSkgPT0gJ1xyJykgPworICAgICAgICAgICAgMSA6IDApOworICAgICAgICBTdHJpbmdQaWVjZSByZXQocG9zaXRpb25fLCBpIC0gcG9zaXRpb25fIC0gc3VidHJhY3RfY3IpOworICAgICAgICBwb3NpdGlvbl8gPSBpICsgMTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGF0X2VuZF8pIHsKKyAgICAgIGlmIChwb3NpdGlvbl8gPT0gcG9zaXRpb25fZW5kXykgeworICAgICAgICBTaGlmdCgpOworICAgICAgfQorICAgICAgcmV0dXJuIENvbnN1bWUocG9zaXRpb25fZW5kXyk7CisgICAgfQorICAgIHNraXAgPSBwb3NpdGlvbl9lbmRfIC0gcG9zaXRpb25fOworICAgIFNoaWZ0KCk7CisgIH0KK30KKworYm9vbCBGaWxlUGllY2U6OlJlYWRMaW5lT3JFT0YoU3RyaW5nUGllY2UgJnRvLCBjaGFyIGRlbGltLCBib29sIHN0cmlwX2NyKSB7CisgIHRyeSB7CisgICAgdG8gPSBSZWFkTGluZShkZWxpbSwgc3RyaXBfY3IpOworICB9IGNhdGNoIChjb25zdCB1dGlsOjpFbmRPZkZpbGVFeGNlcHRpb24gJmUpIHsgcmV0dXJuIGZhbHNlOyB9CisgIHJldHVybiB0cnVlOworfQorCitmbG9hdCBGaWxlUGllY2U6OlJlYWRGbG9hdCgpIHsKKyAgcmV0dXJuIFJlYWROdW1iZXI8ZmxvYXQ+KCk7Cit9Citkb3VibGUgRmlsZVBpZWNlOjpSZWFkRG91YmxlKCkgeworICByZXR1cm4gUmVhZE51bWJlcjxkb3VibGU+KCk7Cit9Citsb25nIGludCBGaWxlUGllY2U6OlJlYWRMb25nKCkgeworICByZXR1cm4gUmVhZE51bWJlcjxsb25nIGludD4oKTsKK30KK3Vuc2lnbmVkIGxvbmcgaW50IEZpbGVQaWVjZTo6UmVhZFVMb25nKCkgeworICByZXR1cm4gUmVhZE51bWJlcjx1bnNpZ25lZCBsb25nIGludD4oKTsKK30KKworLy8gRmFjdG9yZWQgb3V0IHNvIHRoYXQgaXN0cmVhbSBjYW4gY2FsbCB0aGlzLgordm9pZCBGaWxlUGllY2U6OkluaXRpYWxpemVOb1JlYWQoY29uc3QgY2hhciAqbmFtZSwgc3RkOjpzaXplX3QgbWluX2J1ZmZlcikgeworICBmaWxlX25hbWVfID0gbmFtZTsKKworICBkZWZhdWx0X21hcF9zaXplXyA9IHBhZ2VfICogc3RkOjptYXg8c3RkOjpzaXplX3Q+KChtaW5fYnVmZmVyIC8gcGFnZV8gKyAxKSwgMik7CisgIHBvc2l0aW9uXyA9IE5VTEw7CisgIHBvc2l0aW9uX2VuZF8gPSBOVUxMOworICBtYXBwZWRfb2Zmc2V0XyA9IDA7CisgIGF0X2VuZF8gPSBmYWxzZTsKK30KKwordm9pZCBGaWxlUGllY2U6OkluaXRpYWxpemUoY29uc3QgY2hhciAqbmFtZSwgc3RkOjpvc3RyZWFtICpzaG93X3Byb2dyZXNzLCBzdGQ6OnNpemVfdCBtaW5fYnVmZmVyKSB7CisgIEluaXRpYWxpemVOb1JlYWQobmFtZSwgbWluX2J1ZmZlcik7CisKKyAgaWYgKHRvdGFsX3NpemVfID09IGtCYWRTaXplKSB7CisgICAgLy8gU28gdGhlIGFzc2VydGlvbiBwYXNzZXMuCisgICAgZmFsbGJhY2tfdG9fcmVhZF8gPSBmYWxzZTsKKyAgICBpZiAoc2hvd19wcm9ncmVzcykKKyAgICAgICpzaG93X3Byb2dyZXNzIDw8ICJGaWxlICIgPDwgbmFtZSA8PCAiIGlzbid0IG5vcm1hbC4gIFVzaW5nIHNsb3dlciByZWFkKCkgaW5zdGVhZCBvZiBtbWFwKCkuICBObyBwcm9ncmVzcyBiYXIuIiA8PCBzdGQ6OmVuZGw7CisgICAgVHJhbnNpdGlvblRvUmVhZCgpOworICB9IGVsc2UgeworICAgIGZhbGxiYWNrX3RvX3JlYWRfID0gZmFsc2U7CisgIH0KKyAgU2hpZnQoKTsKKyAgLy8gZ3ppcCBkZXRlY3QuCisgIGlmICgocG9zaXRpb25fZW5kXyA+PSBwb3NpdGlvbl8gKyBSZWFkQ29tcHJlc3NlZDo6a01hZ2ljU2l6ZSkgJiYgUmVhZENvbXByZXNzZWQ6OkRldGVjdENvbXByZXNzZWRNYWdpYyhwb3NpdGlvbl8pKSB7CisgICAgaWYgKCFmYWxsYmFja190b19yZWFkXykgeworICAgICAgYXRfZW5kXyA9IGZhbHNlOworICAgICAgVHJhbnNpdGlvblRvUmVhZCgpOworICAgIH0KKyAgfQorfQorCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3QgZG91YmxlX2NvbnZlcnNpb246OlN0cmluZ1RvRG91YmxlQ29udmVydGVyIGtDb252ZXJ0ZXIoCisgICAgZG91YmxlX2NvbnZlcnNpb246OlN0cmluZ1RvRG91YmxlQ29udmVydGVyOjpBTExPV19UUkFJTElOR19KVU5LIHwgZG91YmxlX2NvbnZlcnNpb246OlN0cmluZ1RvRG91YmxlQ29udmVydGVyOjpBTExPV19MRUFESU5HX1NQQUNFUywKKyAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpLAorICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCksCisgICAgImluZiIsCisgICAgIk5hTiIpOworCitTdHJpbmdQaWVjZSBGaXJzdFRva2VuKFN0cmluZ1BpZWNlIHN0cikgeworICBjb25zdCBjaGFyICppOworICBmb3IgKGkgPSBzdHIuZGF0YSgpOyBpICE9IHN0ci5kYXRhKCkgKyBzdHIuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoa1NwYWNlc1sodW5zaWduZWQgY2hhcikqaV0pIGJyZWFrOworICB9CisgIHJldHVybiBTdHJpbmdQaWVjZShzdHIuZGF0YSgpLCBpIC0gc3RyLmRhdGEoKSk7Cit9CisKK2NvbnN0IGNoYXIgKlBhcnNlTnVtYmVyKFN0cmluZ1BpZWNlIHN0ciwgZmxvYXQgJm91dCkgeworICBpbnQgY291bnQ7CisgIG91dCA9IGtDb252ZXJ0ZXIuU3RyaW5nVG9GbG9hdChzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpLCAmY291bnQpOworICBVVElMX1RIUk9XX0lGX0FSRyhzdGQ6OmlzbmFuKG91dCkgJiYgc3RyICE9ICJOYU4iICYmIHN0ciAhPSAibmFuIiwgUGFyc2VOdW1iZXJFeGNlcHRpb24sIChGaXJzdFRva2VuKHN0cikpLCAiZmxvYXQiKTsKKyAgcmV0dXJuIHN0ci5kYXRhKCkgKyBjb3VudDsKK30KK2NvbnN0IGNoYXIgKlBhcnNlTnVtYmVyKFN0cmluZ1BpZWNlIHN0ciwgZG91YmxlICZvdXQpIHsKKyAgaW50IGNvdW50OworICBvdXQgPSBrQ29udmVydGVyLlN0cmluZ1RvRG91YmxlKHN0ci5kYXRhKCksIHN0ci5zaXplKCksICZjb3VudCk7CisgIFVUSUxfVEhST1dfSUZfQVJHKHN0ZDo6aXNuYW4ob3V0KSAmJiBzdHIgIT0gIk5hTiIgJiYgc3RyICE9ICJuYW4iLCBQYXJzZU51bWJlckV4Y2VwdGlvbiwgKEZpcnN0VG9rZW4oc3RyKSksICJkb3VibGUiKTsKKyAgcmV0dXJuIHN0ci5kYXRhKCkgKyBjb3VudDsKK30KK2NvbnN0IGNoYXIgKlBhcnNlTnVtYmVyKFN0cmluZ1BpZWNlIHN0ciwgbG9uZyBpbnQgJm91dCkgeworICBjaGFyICplbmQ7CisgIGVycm5vID0gMDsKKyAgb3V0ID0gc3RydG9sKHN0ci5kYXRhKCksICZlbmQsIDEwKTsKKyAgVVRJTF9USFJPV19JRl9BUkcoZXJybm8gfHwgKGVuZCA9PSBzdHIuZGF0YSgpKSwgUGFyc2VOdW1iZXJFeGNlcHRpb24sIChGaXJzdFRva2VuKHN0cikpLCAibG9uZyBpbnQiKTsKKyAgcmV0dXJuIGVuZDsKK30KK2NvbnN0IGNoYXIgKlBhcnNlTnVtYmVyKFN0cmluZ1BpZWNlIHN0ciwgdW5zaWduZWQgbG9uZyBpbnQgJm91dCkgeworICBjaGFyICplbmQ7CisgIGVycm5vID0gMDsKKyAgb3V0ID0gc3RydG91bChzdHIuZGF0YSgpLCAmZW5kLCAxMCk7CisgIFVUSUxfVEhST1dfSUZfQVJHKGVycm5vIHx8IChlbmQgPT0gc3RyLmRhdGEoKSksIFBhcnNlTnVtYmVyRXhjZXB0aW9uLCAoRmlyc3RUb2tlbihzdHIpKSwgInVuc2lnbmVkIGxvbmcgaW50Iik7CisgIHJldHVybiBlbmQ7Cit9Cit9IC8vIG5hbWVzcGFjZQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVCBGaWxlUGllY2U6OlJlYWROdW1iZXIoKSB7CisgIFNraXBTcGFjZXMoKTsKKyAgd2hpbGUgKGxhc3Rfc3BhY2VfIDwgcG9zaXRpb25fKSB7CisgICAgaWYgKFVUSUxfVU5MSUtFTFkoYXRfZW5kXykpIHsKKyAgICAgIC8vIEhhbGx1Y2luYXRlIGEgbnVsbCBvZmYgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcihwb3NpdGlvbl8sIHBvc2l0aW9uX2VuZF8pOworICAgICAgVCByZXQ7CisgICAgICAvLyBIYXMgdG8gYmUgbnVsbC10ZXJtaW5hdGVkLgorICAgICAgY29uc3QgY2hhciAqYmVnaW4gPSBidWZmZXIuY19zdHIoKTsKKyAgICAgIGNvbnN0IGNoYXIgKmVuZCA9IFBhcnNlTnVtYmVyKFN0cmluZ1BpZWNlKGJlZ2luLCBidWZmZXIuc2l6ZSgpKSwgcmV0KTsKKyAgICAgIHBvc2l0aW9uXyArPSBlbmQgLSBiZWdpbjsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIFNoaWZ0KCk7CisgIH0KKyAgVCByZXQ7CisgIHBvc2l0aW9uXyA9IFBhcnNlTnVtYmVyKFN0cmluZ1BpZWNlKHBvc2l0aW9uXywgbGFzdF9zcGFjZV8gLSBwb3NpdGlvbl8pLCByZXQpOworICByZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyICpGaWxlUGllY2U6OkZpbmREZWxpbWl0ZXJPckVPRihjb25zdCBib29sICpkZWxpbSkgIHsKKyAgc3RkOjpzaXplX3Qgc2tpcCA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgZm9yIChjb25zdCBjaGFyICppID0gcG9zaXRpb25fICsgc2tpcDsgaSA8IHBvc2l0aW9uX2VuZF87ICsraSkgeworICAgICAgaWYgKGRlbGltW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCppKV0pIHJldHVybiBpOworICAgIH0KKyAgICBpZiAoYXRfZW5kXykgeworICAgICAgaWYgKHBvc2l0aW9uXyA9PSBwb3NpdGlvbl9lbmRfKSBTaGlmdCgpOworICAgICAgcmV0dXJuIHBvc2l0aW9uX2VuZF87CisgICAgfQorICAgIHNraXAgPSBwb3NpdGlvbl9lbmRfIC0gcG9zaXRpb25fOworICAgIFNoaWZ0KCk7CisgIH0KK30KKwordm9pZCBGaWxlUGllY2U6OlNoaWZ0KCkgeworICBpZiAoYXRfZW5kXykgeworICAgIHByb2dyZXNzXy5GaW5pc2hlZCgpOworICAgIHRocm93IEVuZE9mRmlsZUV4Y2VwdGlvbigpOworICB9CisgIHVpbnQ2NF90IGRlc2lyZWRfYmVnaW4gPSBwb3NpdGlvbl8gLSBkYXRhXy5iZWdpbigpICsgbWFwcGVkX29mZnNldF87CisKKyAgaWYgKCFmYWxsYmFja190b19yZWFkXykgTU1hcFNoaWZ0KGRlc2lyZWRfYmVnaW4pOworICAvLyBOb3RpY2UgYW4gbW1hcCBmYWlsdXJlIG1pZ2h0IHNldCB0aGUgZmFsbGJhY2suCisgIGlmIChmYWxsYmFja190b19yZWFkXykgUmVhZFNoaWZ0KCk7CisKKyAgZm9yIChsYXN0X3NwYWNlXyA9IHBvc2l0aW9uX2VuZF8gLSAxOyBsYXN0X3NwYWNlXyA+PSBwb3NpdGlvbl87IC0tbGFzdF9zcGFjZV8pIHsKKyAgICBpZiAoa1NwYWNlc1tzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigqbGFzdF9zcGFjZV8pXSkgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgRmlsZVBpZWNlOjpNTWFwU2hpZnQodWludDY0X3QgZGVzaXJlZF9iZWdpbikgeworICAvLyBVc2UgbW1hcC4KKyAgdWludDY0X3QgaWdub3JlID0gZGVzaXJlZF9iZWdpbiAlIHBhZ2VfOworICAvLyBEdXBsaWNhdGUgcmVxdWVzdCBmb3IgU2hpZnQgbWVhbnMgZ2l2ZSBtb3JlIGRhdGEuCisgIGlmIChwb3NpdGlvbl8gPT0gZGF0YV8uYmVnaW4oKSArIGlnbm9yZSAmJiBwb3NpdGlvbl8pIHsKKyAgICBkZWZhdWx0X21hcF9zaXplXyAqPSAyOworICB9CisgIC8vIExvY2FsIHZlcnNpb24gc28gdGhhdCBpbiBjYXNlIG9mIGZhaWx1cmUgaXQgZG9lc24ndCBvdmVyd3JpdGUgdGhlIGNsYXNzIHZhcmlhYmxlLgorICB1aW50NjRfdCBtYXBwZWRfb2Zmc2V0ID0gZGVzaXJlZF9iZWdpbiAtIGlnbm9yZTsKKworICB1aW50NjRfdCBtYXBwZWRfc2l6ZTsKKyAgaWYgKGRlZmF1bHRfbWFwX3NpemVfID49IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90Pih0b3RhbF9zaXplXyAtIG1hcHBlZF9vZmZzZXQpKSB7CisgICAgYXRfZW5kXyA9IHRydWU7CisgICAgbWFwcGVkX3NpemUgPSB0b3RhbF9zaXplXyAtIG1hcHBlZF9vZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgbWFwcGVkX3NpemUgPSBkZWZhdWx0X21hcF9zaXplXzsKKyAgfQorCisgIC8vIEZvcmNpYmx5IGNsZWFyIHRoZSBleGlzdGluZyBtbWFwIGZpcnN0LgorICBkYXRhXy5yZXNldCgpOworICB0cnkgeworICAgIE1hcFJlYWQoUE9QVUxBVEVfT1JfTEFaWSwgKmZpbGVfLCBtYXBwZWRfb2Zmc2V0LCBtYXBwZWRfc2l6ZSwgZGF0YV8pOworICB9IGNhdGNoIChjb25zdCB1dGlsOjpFcnJub0V4Y2VwdGlvbiAmZSkgeworICAgIGlmIChkZXNpcmVkX2JlZ2luKSB7CisgICAgICBTZWVrT3JUaHJvdygqZmlsZV8sIGRlc2lyZWRfYmVnaW4pOworICAgIH0KKyAgICAvLyBUaGUgbW1hcCB3YXMgc2NoZWR1bGVkIHRvIGVuZCB0aGUgZmlsZSwgYnV0IG5vdyB3ZSdyZSBnb2luZyB0byByZWFkIGl0LgorICAgIGF0X2VuZF8gPSBmYWxzZTsKKyAgICBUcmFuc2l0aW9uVG9SZWFkKCk7CisgICAgcmV0dXJuOworICB9CisgIG1hcHBlZF9vZmZzZXRfID0gbWFwcGVkX29mZnNldDsKKyAgcG9zaXRpb25fID0gZGF0YV8uYmVnaW4oKSArIGlnbm9yZTsKKyAgcG9zaXRpb25fZW5kXyA9IGRhdGFfLmJlZ2luKCkgKyBtYXBwZWRfc2l6ZTsKKworICBwcm9ncmVzc18uU2V0KGRlc2lyZWRfYmVnaW4pOworfQorCit2b2lkIEZpbGVQaWVjZTo6VHJhbnNpdGlvblRvUmVhZCgpIHsKKyAgYXNzZXJ0KCFmYWxsYmFja190b19yZWFkXyk7CisgIGZhbGxiYWNrX3RvX3JlYWRfID0gdHJ1ZTsKKyAgZGF0YV8ucmVzZXQoKTsKKyAgSHVnZU1hbGxvYyhkZWZhdWx0X21hcF9zaXplXywgZmFsc2UsIGRhdGFfKTsKKyAgcG9zaXRpb25fID0gZGF0YV8uYmVnaW4oKTsKKyAgcG9zaXRpb25fZW5kXyA9IHBvc2l0aW9uXzsKKworICB0cnkgeworICAgIGZlbGxfYmFja18uUmVzZXQoZmlsZV8ucmVsZWFzZSgpKTsKKyAgfSBjYXRjaCAodXRpbDo6RXhjZXB0aW9uICZlKSB7CisgICAgZSA8PCAiIGluIGZpbGUgIiA8PCBmaWxlX25hbWVfOworICAgIHRocm93OworICB9Cit9CisKK3ZvaWQgRmlsZVBpZWNlOjpSZWFkU2hpZnQoKSB7CisgIGFzc2VydChmYWxsYmFja190b19yZWFkXyk7CisgIC8vIEJ5dGVzIFtkYXRhXy5iZWdpbigpLCBwb3NpdGlvbl8pIGhhdmUgYmVlbiBjb25zdW1lZC4KKyAgLy8gQnl0ZXMgW3Bvc2l0aW9uXywgcG9zaXRpb25fZW5kXykgaGF2ZSBiZWVuIHJlYWQgaW50byB0aGUgYnVmZmVyLgorCisgIC8vIFN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBpZiB0aGVyZSdzIG5vdGhpbmcgdXNlZnVsIGluIGl0LgorICBpZiAocG9zaXRpb25fID09IHBvc2l0aW9uX2VuZF8pIHsKKyAgICBtYXBwZWRfb2Zmc2V0XyArPSAocG9zaXRpb25fZW5kXyAtIGRhdGFfLmJlZ2luKCkpOworICAgIHBvc2l0aW9uXyA9IGRhdGFfLmJlZ2luKCk7CisgICAgcG9zaXRpb25fZW5kXyA9IHBvc2l0aW9uXzsKKyAgfQorCisgIHN0ZDo6c2l6ZV90IGFscmVhZHlfcmVhZCA9IHBvc2l0aW9uX2VuZF8gLSBkYXRhXy5iZWdpbigpOworCisgIGlmIChhbHJlYWR5X3JlYWQgPT0gZGVmYXVsdF9tYXBfc2l6ZV8pIHsKKyAgICBpZiAocG9zaXRpb25fID09IGRhdGFfLmJlZ2luKCkpIHsKKyAgICAgIC8vIEJ1ZmZlciB0b28gc21hbGwuCisgICAgICBzdGQ6OnNpemVfdCB2YWxpZF9sZW5ndGggPSBwb3NpdGlvbl9lbmRfIC0gcG9zaXRpb25fOworICAgICAgZGVmYXVsdF9tYXBfc2l6ZV8gKj0gMjsKKyAgICAgIEh1Z2VSZWFsbG9jKGRlZmF1bHRfbWFwX3NpemVfLCBmYWxzZSwgZGF0YV8pOworICAgICAgcG9zaXRpb25fID0gZGF0YV8uYmVnaW4oKTsKKyAgICAgIHBvc2l0aW9uX2VuZF8gPSBwb3NpdGlvbl8gKyB2YWxpZF9sZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6c2l6ZV90IG1vdmluZyA9IHBvc2l0aW9uX2VuZF8gLSBwb3NpdGlvbl87CisgICAgICBtZW1tb3ZlKGRhdGFfLmdldCgpLCBwb3NpdGlvbl8sIG1vdmluZyk7CisgICAgICBwb3NpdGlvbl8gPSBkYXRhXy5iZWdpbigpOworICAgICAgcG9zaXRpb25fZW5kXyA9IHBvc2l0aW9uXyArIG1vdmluZzsKKyAgICAgIGFscmVhZHlfcmVhZCA9IG1vdmluZzsKKyAgICB9CisgIH0KKworICBzdGQ6OnNpemVfdCByZWFkX3JldHVybiA9IGZlbGxfYmFja18uUmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oZGF0YV8uZ2V0KCkpICsgYWxyZWFkeV9yZWFkLCBkZWZhdWx0X21hcF9zaXplXyAtIGFscmVhZHlfcmVhZCk7CisgIHByb2dyZXNzXy5TZXQoZmVsbF9iYWNrXy5SYXdBbW91bnQoKSk7CisKKyAgaWYgKHJlYWRfcmV0dXJuID09IDApIHsKKyAgICBhdF9lbmRfID0gdHJ1ZTsKKyAgfQorICBwb3NpdGlvbl9lbmRfICs9IHJlYWRfcmV0dXJuOworfQorCit9IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9maWxlX3BpZWNlLmhoIGIvc3JjL2tlbmxtL3V0aWwvZmlsZV9waWVjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Q4MzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvZmlsZV9waWVjZS5oaApAQCAtMCwwICsxLDE3NSBAQAorI2lmbmRlZiBVVElMX0ZJTEVfUElFQ0VfSAorI2RlZmluZSBVVElMX0ZJTEVfUElFQ0VfSAorCisjaW5jbHVkZSAidXRpbC9lcnNhdHpfcHJvZ3Jlc3MuaGgiCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvbW1hcC5oaCIKKyNpbmNsdWRlICJ1dGlsL3JlYWRfY29tcHJlc3NlZC5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmluZ19waWVjZS5oaCIKKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgdXRpbCB7CisKK2NsYXNzIFBhcnNlTnVtYmVyRXhjZXB0aW9uIDogcHVibGljIEV4Y2VwdGlvbiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBQYXJzZU51bWJlckV4Y2VwdGlvbihTdHJpbmdQaWVjZSB2YWx1ZSkgdGhyb3coKTsKKyAgICB+UGFyc2VOdW1iZXJFeGNlcHRpb24oKSB0aHJvdygpIHt9Cit9OworCitleHRlcm4gY29uc3QgYm9vbCBrU3BhY2VzWzI1Nl07CisKKy8vIE1lbW9yeSBiYWNraW5nIHRoZSByZXR1cm5lZCBTdHJpbmdQaWVjZSBtYXkgdmFuaXNoIG9uIHRoZSBuZXh0IGNhbGwuCitjbGFzcyBGaWxlUGllY2UgeworICBwdWJsaWM6CisgICAgLy8gMSBNQiBkZWZhdWx0LgorICAgIGV4cGxpY2l0IEZpbGVQaWVjZShjb25zdCBjaGFyICpmaWxlLCBzdGQ6Om9zdHJlYW0gKnNob3dfcHJvZ3Jlc3MgPSBOVUxMLCBzdGQ6OnNpemVfdCBtaW5fYnVmZmVyID0gMTA0ODU3Nik7CisgICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIGZkLiAgbmFtZSBpcyB1c2VkIGZvciBtZXNzYWdlcy4KKyAgICBleHBsaWNpdCBGaWxlUGllY2UoaW50IGZkLCBjb25zdCBjaGFyICpuYW1lID0gTlVMTCwgc3RkOjpvc3RyZWFtICpzaG93X3Byb2dyZXNzID0gTlVMTCwgc3RkOjpzaXplX3QgbWluX2J1ZmZlciA9IDEwNDg1NzYpOworCisgICAgLyogUmVhZCBmcm9tIGFuIGlzdHJlYW0uICBEb24ndCB1c2UgdGhpcyBpZiB5b3UgY2FuIGF2b2lkIGl0LiAgUmF3IGZkIElPIGlzCisgICAgICogbXVjaCBmYXN0ZXIuICBCdXQgc29tZXRpbWVzIHlvdSBqdXN0IGhhdmUgYW4gaXN0cmVhbSBsaWtlIEJvb3N0J3MgSFRUUAorICAgICAqIHNlcnZlciBhbmQgd2FudCB0byBwYXJzZSBpdCB0aGUgc2FtZSB3YXkuCisgICAgICogbmFtZSBpcyBqdXN0IHVzZWQgZm9yIG1lc3NhZ2VzIGFuZCBGaWxlTmFtZSgpLgorICAgICAqLworICAgIGV4cGxpY2l0IEZpbGVQaWVjZShzdGQ6OmlzdHJlYW0gJnN0cmVhbSwgY29uc3QgY2hhciAqbmFtZSA9IE5VTEwsIHN0ZDo6c2l6ZV90IG1pbl9idWZmZXIgPSAxMDQ4NTc2KTsKKworICAgIH5GaWxlUGllY2UoKTsKKworICAgIGNoYXIgZ2V0KCkgeworICAgICAgaWYgKHBvc2l0aW9uXyA9PSBwb3NpdGlvbl9lbmRfKSB7CisgICAgICAgIFNoaWZ0KCk7CisgICAgICAgIGlmIChhdF9lbmRfKSB0aHJvdyBFbmRPZkZpbGVFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqKHBvc2l0aW9uXysrKTsKKyAgICB9CisKKyAgICAvLyBMZWF2ZXMgdGhlIGRlbGltaXRlciwgaWYgYW55LCB0byBiZSByZXR1cm5lZCBieSBnZXQoKS4gIERlbGltaXRlcnMgZGVmaW5lZCBieSBpc3NwYWNlKCkuCisgICAgU3RyaW5nUGllY2UgUmVhZERlbGltaXRlZChjb25zdCBib29sICpkZWxpbSA9IGtTcGFjZXMpIHsKKyAgICAgIFNraXBTcGFjZXMoZGVsaW0pOworICAgICAgcmV0dXJuIENvbnN1bWUoRmluZERlbGltaXRlck9yRU9GKGRlbGltKSk7CisgICAgfQorCisgICAgLy8vIFJlYWQgd29yZCB1bnRpbCB0aGUgbGluZSBvciBmaWxlIGVuZHMuCisgICAgYm9vbCBSZWFkV29yZFNhbWVMaW5lKFN0cmluZ1BpZWNlICZ0bywgY29uc3QgYm9vbCAqZGVsaW0gPSBrU3BhY2VzKSB7CisgICAgICBhc3NlcnQoZGVsaW1bc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oJ1xuJyldKTsKKyAgICAgIC8vIFNraXAgbm9uLWVudGVyIHNwYWNlcy4KKyAgICAgIGZvciAoOyA7ICsrcG9zaXRpb25fKSB7CisgICAgICAgIGlmIChwb3NpdGlvbl8gPT0gcG9zaXRpb25fZW5kXykgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTaGlmdCgpOworICAgICAgICAgIH0gY2F0Y2ggKGNvbnN0IHV0aWw6OkVuZE9mRmlsZUV4Y2VwdGlvbiAmZSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAvLyBBbmQgYnJlYWsgb3V0IGF0IGVuZCBvZiBmaWxlLgorICAgICAgICAgIGlmIChwb3NpdGlvbl8gPT0gcG9zaXRpb25fZW5kXykgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghZGVsaW1bc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKnBvc2l0aW9uXyldKSBicmVhazsKKyAgICAgICAgaWYgKCpwb3NpdGlvbl8gPT0gJ1xuJykgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gV2UgY2FuJ3QgYmUgYXQgdGhlIGVuZCBvZiBmaWxlIGJlY2F1c2UgdGhlcmUncyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIG9wZW4uCisgICAgICB0byA9IENvbnN1bWUoRmluZERlbGltaXRlck9yRU9GKGRlbGltKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogUmVhZCBhIGxpbmUgb2YgdGV4dCBmcm9tIHRoZSBmaWxlLgorICAgICAqCisgICAgICogVW5saWtlIFJlYWREZWxpbWl0ZWQsIHRoaXMgaW5jbHVkZXMgbGVhZGluZyBzcGFjZXMgYW5kIGNvbnN1bWVzIHRoZQorICAgICAqIGRlbGltaXRlci4gICBJdCBpcyBzaW1pbGFyIHRvIGdldGxpbmUgaW4gdGhhdCB3YXkuCisgICAgICoKKyAgICAgKiBJZiBzdHJpcF9jciBpcyB0cnVlLCBhbnkgdHJhaWxpbmcgY2FycmlhdGUgcmV0dXJuIChhcyB3b3VsZCBiZSBmb3VuZCBvbgorICAgICAqIGEgZmlsZSB3cml0dGVuIG9uIFdpbmRvd3MpIHdpbGwgYmUgbGVmdCBvdXQgb2YgdGhlIHJldHVybmVkIGxpbmUuCisgICAgICoKKyAgICAgKiBUaHJvd3MgRW5kT2ZGaWxlRXhjZXB0aW9uIGlmIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgZW5jb3VudGVyZWQuICBJZiB0aGUKKyAgICAgKiBmaWxlIGRvZXMgbm90IGVuZCBpbiBhIG5ld2xpbmUsIHRoaXMgY291bGQgbWVhbiB0aGF0IHRoZSBsYXN0IGxpbmUgaXMKKyAgICAgKiBuZXZlciByZWFkLgorICAgICAqLworICAgIFN0cmluZ1BpZWNlIFJlYWRMaW5lKGNoYXIgZGVsaW0gPSAnXG4nLCBib29sIHN0cmlwX2NyID0gdHJ1ZSk7CisKKyAgICAvKiogUmVhZCBhIGxpbmUgb2YgdGV4dCBmcm9tIHRoZSBmaWxlLCBvciByZXR1cm4gZmFsc2Ugb24gRU9GLgorICAgICAqCisgICAgICogVGhpcyBpcyBsaWtlIFJlYWRMaW5lLCBleGNlcHQgaXQgcmV0dXJucyBmYWxzZSB3aGVyZSBSZWFkTGluZSB0aHJvd3MKKyAgICAgKiBFbmRPZkZpbGVFeGNlcHRpb24uICBMaWtlIFJlYWRMaW5lIGl0IG1heSBub3QgcmVhZCB0aGUgbGFzdCBsaW5lIGluIHRoZQorICAgICAqIGZpbGUgaWYgdGhlIGZpbGUgZG9lcyBub3QgZW5kIGluIGEgbmV3bGluZS4KKyAgICAgKgorICAgICAqIElmIHN0cmlwX2NyIGlzIHRydWUsIGFueSB0cmFpbGluZyBjYXJyaWF0ZSByZXR1cm4gKGFzIHdvdWxkIGJlIGZvdW5kIG9uCisgICAgICogYSBmaWxlIHdyaXR0ZW4gb24gV2luZG93cykgd2lsbCBiZSBsZWZ0IG91dCBvZiB0aGUgcmV0dXJuZWQgbGluZS4KKyAgICAgKi8KKyAgICBib29sIFJlYWRMaW5lT3JFT0YoU3RyaW5nUGllY2UgJnRvLCBjaGFyIGRlbGltID0gJ1xuJywgYm9vbCBzdHJpcF9jciA9IHRydWUpOworCisgICAgZmxvYXQgUmVhZEZsb2F0KCk7CisgICAgZG91YmxlIFJlYWREb3VibGUoKTsKKyAgICBsb25nIGludCBSZWFkTG9uZygpOworICAgIHVuc2lnbmVkIGxvbmcgaW50IFJlYWRVTG9uZygpOworCisgICAgLy8gU2tpcCBzcGFjZXMgZGVmaW5lZCBieSBpc3NwYWNlLgorICAgIHZvaWQgU2tpcFNwYWNlcyhjb25zdCBib29sICpkZWxpbSA9IGtTcGFjZXMpIHsKKyAgICAgIGFzc2VydChwb3NpdGlvbl8gPD0gcG9zaXRpb25fZW5kXyk7CisgICAgICBmb3IgKDsgOyArK3Bvc2l0aW9uXykgeworICAgICAgICBpZiAocG9zaXRpb25fID09IHBvc2l0aW9uX2VuZF8pIHsKKyAgICAgICAgICBTaGlmdCgpOworICAgICAgICAgIC8vIEFuZCBicmVhayBvdXQgYXQgZW5kIG9mIGZpbGUuCisgICAgICAgICAgaWYgKHBvc2l0aW9uXyA9PSBwb3NpdGlvbl9lbmRfKSByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KHBvc2l0aW9uXyA8IHBvc2l0aW9uX2VuZF8pOworICAgICAgICBpZiAoIWRlbGltW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpwb3NpdGlvbl8pXSkgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IE9mZnNldCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBwb3NpdGlvbl8gLSBkYXRhXy5iZWdpbigpICsgbWFwcGVkX29mZnNldF87CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZpbGVOYW1lKCkgY29uc3QgeyByZXR1cm4gZmlsZV9uYW1lXzsgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBJbml0aWFsaXplTm9SZWFkKGNvbnN0IGNoYXIgKm5hbWUsIHN0ZDo6c2l6ZV90IG1pbl9idWZmZXIpOworICAgIC8vIENhbGxzIEluaXRpYWxpemVOb1JlYWQsIHNvIGRvbid0IGNhbGwgYm90aC4KKyAgICB2b2lkIEluaXRpYWxpemUoY29uc3QgY2hhciAqbmFtZSwgc3RkOjpvc3RyZWFtICpzaG93X3Byb2dyZXNzLCBzdGQ6OnNpemVfdCBtaW5fYnVmZmVyKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBUIFJlYWROdW1iZXIoKTsKKworICAgIFN0cmluZ1BpZWNlIENvbnN1bWUoY29uc3QgY2hhciAqdG8pIHsKKyAgICAgIGFzc2VydCh0byA+PSBwb3NpdGlvbl8pOworICAgICAgU3RyaW5nUGllY2UgcmV0KHBvc2l0aW9uXywgdG8gLSBwb3NpdGlvbl8pOworICAgICAgcG9zaXRpb25fID0gdG87CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKkZpbmREZWxpbWl0ZXJPckVPRihjb25zdCBib29sICpkZWxpbSA9IGtTcGFjZXMpOworCisgICAgdm9pZCBTaGlmdCgpOworICAgIC8vIEJhY2tlbmRzIHRvIFNoaWZ0KCkuCisgICAgdm9pZCBNTWFwU2hpZnQodWludDY0X3QgZGVzaXJlZF9iZWdpbik7CisKKyAgICB2b2lkIFRyYW5zaXRpb25Ub1JlYWQoKTsKKyAgICB2b2lkIFJlYWRTaGlmdCgpOworCisgICAgY29uc3QgY2hhciAqcG9zaXRpb25fLCAqbGFzdF9zcGFjZV8sICpwb3NpdGlvbl9lbmRfOworCisgICAgc2NvcGVkX2ZkIGZpbGVfOworICAgIGNvbnN0IHVpbnQ2NF90IHRvdGFsX3NpemVfOworICAgIGNvbnN0IHVpbnQ2NF90IHBhZ2VfOworCisgICAgc3RkOjpzaXplX3QgZGVmYXVsdF9tYXBfc2l6ZV87CisgICAgdWludDY0X3QgbWFwcGVkX29mZnNldF87CisKKyAgICAvLyBPcmRlciBtYXR0ZXJzOiBmaWxlXyBzaG91bGQgYWx3YXlzIGJlIGRlc3Ryb3llZCBhZnRlciB0aGlzLgorICAgIHNjb3BlZF9tZW1vcnkgZGF0YV87CisKKyAgICBib29sIGF0X2VuZF87CisgICAgYm9vbCBmYWxsYmFja190b19yZWFkXzsKKworICAgIEVyc2F0elByb2dyZXNzIHByb2dyZXNzXzsKKworICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZV87CisKKyAgICBSZWFkQ29tcHJlc3NlZCBmZWxsX2JhY2tfOworfTsKKworfSAvLyBuYW1lc3BhY2UgdXRpbAorCisjZW5kaWYgLy8gVVRJTF9GSUxFX1BJRUNFX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL2ZpbGVfcGllY2VfdGVzdC5jYyBiL3NyYy9rZW5sbS91dGlsL2ZpbGVfcGllY2VfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDNjZDMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvZmlsZV9waWVjZV90ZXN0LmNjCkBAIC0wLDAgKzEsMTU0IEBACisvLyBUZXN0cyBtaWdodCBmYWlsIGlmIHlvdSBoYXZlIGNyZWF0aXZlIGNoYXJhY3RlcnMgaW4geW91ciBwYXRoLiAgU3VlIG1lLgorI2luY2x1ZGUgInV0aWwvZmlsZV9waWVjZS5oaCIKKworI2luY2x1ZGUgInV0aWwvZmlsZV9zdHJlYW0uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEZpbGVQaWVjZVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHsKKworc3RkOjpzdHJpbmcgRmlsZUxvY2F0aW9uKCkgeworICBpZiAoYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgPCAyKSB7CisgICAgcmV0dXJuICJmaWxlX3BpZWNlLmNjIjsKKyAgfQorICBzdGQ6OnN0cmluZyByZXQoYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbMV0pOworICByZXR1cm4gcmV0OworfQorCisvKiBpc3RyZWFtICovCitCT09TVF9BVVRPX1RFU1RfQ0FTRShJU3RyZWFtKSB7CisgIHN0ZDo6ZnN0cmVhbSByZWYoRmlsZUxvY2F0aW9uKCkuY19zdHIoKSwgc3RkOjppb3M6OmluKTsKKyAgc3RkOjpmc3RyZWFtIGJhY2tpbmcoRmlsZUxvY2F0aW9uKCkuY19zdHIoKSwgc3RkOjppb3M6OmluKTsKKyAgRmlsZVBpZWNlIHRlc3QoYmFja2luZyk7CisgIHN0ZDo6c3RyaW5nIHJlZl9saW5lOworICB3aGlsZSAoZ2V0bGluZShyZWYsIHJlZl9saW5lKSkgeworICAgIFN0cmluZ1BpZWNlIHRlc3RfbGluZSh0ZXN0LlJlYWRMaW5lKCkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKHJlZl9saW5lLCB0ZXN0X2xpbmUpOworICB9CisgIEJPT1NUX0NIRUNLX1RIUk9XKHRlc3QuZ2V0KCksIEVuZE9mRmlsZUV4Y2VwdGlvbik7CisgIEJPT1NUX0NIRUNLX1RIUk9XKHRlc3QuZ2V0KCksIEVuZE9mRmlsZUV4Y2VwdGlvbik7Cit9CisKKy8qIG1tYXAgaW1wbGVtZW50YXRpb24gKi8KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE1NYXBSZWFkTGluZSkgeworICBzdGQ6OmZzdHJlYW0gcmVmKEZpbGVMb2NhdGlvbigpLmNfc3RyKCksIHN0ZDo6aW9zOjppbik7CisgIEZpbGVQaWVjZSB0ZXN0KEZpbGVMb2NhdGlvbigpLmNfc3RyKCksIE5VTEwsIDEpOworICBzdGQ6OnN0cmluZyByZWZfbGluZTsKKyAgd2hpbGUgKGdldGxpbmUocmVmLCByZWZfbGluZSkpIHsKKyAgICBTdHJpbmdQaWVjZSB0ZXN0X2xpbmUodGVzdC5SZWFkTGluZSgpKTsKKyAgICAvLyBJIHN1Ym1pdHRlZCBhIGJ1ZyByZXBvcnQgdG8gSUNVOiBodHRwOi8vYnVncy5pY3UtcHJvamVjdC5vcmcvdHJhYy90aWNrZXQvNzkyNAorICAgIGlmICghdGVzdF9saW5lLmVtcHR5KCkgfHwgIXJlZl9saW5lLmVtcHR5KCkpIHsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHJlZl9saW5lLCB0ZXN0X2xpbmUpOworICAgIH0KKyAgfQorICBCT09TVF9DSEVDS19USFJPVyh0ZXN0LmdldCgpLCBFbmRPZkZpbGVFeGNlcHRpb24pOworfQorCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpICYmICFkZWZpbmVkKF9fQVBQTEVfXykKKy8qIEFwcGxlIGlzbid0IGhhcHB5IHdpdGggdGhlIHBvcGVuLCBmaWxlbm8sIGR1cC4gIEFuZCBJIGRvbid0IHdhbnQgdG8KKyAqIHJlaW1wbGVtZW50IHBvcGVuLiAgVGhpcyBpcyBhbiBpc3N1ZSB3aXRoIHRoZSB0ZXN0LgorICovCisvKiByZWFkKCkgaW1wbGVtZW50YXRpb24gKi8KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFN0cmVhbVJlYWRMaW5lKSB7CisgIHN0ZDo6ZnN0cmVhbSByZWYoRmlsZUxvY2F0aW9uKCkuY19zdHIoKSwgc3RkOjppb3M6OmluKTsKKworICBzdGQ6OnN0cmluZyBwb3Blbl9hcmdzID0gImNhdCBcIiI7CisgIHBvcGVuX2FyZ3MgKz0gRmlsZUxvY2F0aW9uKCk7CisgIHBvcGVuX2FyZ3MgKz0gJyInOworCisgIEZJTEUgKmNhdHRlciA9IHBvcGVuKHBvcGVuX2FyZ3MuY19zdHIoKSwgInIiKTsKKyAgQk9PU1RfUkVRVUlSRShjYXR0ZXIpOworCisgIEZpbGVQaWVjZSB0ZXN0KGR1cChmaWxlbm8oY2F0dGVyKSksICJmaWxlX3BpZWNlLmNjIiwgTlVMTCwgMSk7CisgIHN0ZDo6c3RyaW5nIHJlZl9saW5lOworICB3aGlsZSAoZ2V0bGluZShyZWYsIHJlZl9saW5lKSkgeworICAgIFN0cmluZ1BpZWNlIHRlc3RfbGluZSh0ZXN0LlJlYWRMaW5lKCkpOworICAgIC8vIEkgc3VibWl0dGVkIGEgYnVnIHJlcG9ydCB0byBJQ1U6IGh0dHA6Ly9idWdzLmljdS1wcm9qZWN0Lm9yZy90cmFjL3RpY2tldC83OTI0CisgICAgaWYgKCF0ZXN0X2xpbmUuZW1wdHkoKSB8fCAhcmVmX2xpbmUuZW1wdHkoKSkgeworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwocmVmX2xpbmUsIHRlc3RfbGluZSk7CisgICAgfQorICB9CisgIEJPT1NUX0NIRUNLX1RIUk9XKHRlc3QuZ2V0KCksIEVuZE9mRmlsZUV4Y2VwdGlvbik7CisgIEJPT1NUX1JFUVVJUkUoIXBjbG9zZShjYXR0ZXIpKTsKK30KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9aTElCCisKKy8vIGd6aXAgZmlsZQorQk9PU1RfQVVUT19URVNUX0NBU0UoUGxhaW5aaXBSZWFkTGluZSkgeworICBzdGQ6OnN0cmluZyBsb2NhdGlvbihGaWxlTG9jYXRpb24oKSk7CisgIHN0ZDo6ZnN0cmVhbSByZWYobG9jYXRpb24uY19zdHIoKSwgc3RkOjppb3M6OmluKTsKKworICBzdGQ6OnN0cmluZyBjb21tYW5kKCJnemlwIDxcIiIpOworICBjb21tYW5kICs9IGxvY2F0aW9uICsgIlwiID5cIiIgKyBsb2NhdGlvbiArICJcIi5neiI7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCgwLCBzeXN0ZW0oY29tbWFuZC5jX3N0cigpKSk7CisgIEZpbGVQaWVjZSB0ZXN0KChsb2NhdGlvbiArICIuZ3oiKS5jX3N0cigpLCBOVUxMLCAxKTsKKyAgdW5saW5rKChsb2NhdGlvbiArICIuZ3oiKS5jX3N0cigpKTsKKyAgc3RkOjpzdHJpbmcgcmVmX2xpbmU7CisgIHdoaWxlIChnZXRsaW5lKHJlZiwgcmVmX2xpbmUpKSB7CisgICAgU3RyaW5nUGllY2UgdGVzdF9saW5lKHRlc3QuUmVhZExpbmUoKSk7CisgICAgLy8gSSBzdWJtaXR0ZWQgYSBidWcgcmVwb3J0IHRvIElDVTogaHR0cDovL2J1Z3MuaWN1LXByb2plY3Qub3JnL3RyYWMvdGlja2V0Lzc5MjQKKyAgICBpZiAoIXRlc3RfbGluZS5lbXB0eSgpIHx8ICFyZWZfbGluZS5lbXB0eSgpKSB7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChyZWZfbGluZSwgdGVzdF9saW5lKTsKKyAgICB9CisgIH0KKyAgQk9PU1RfQ0hFQ0tfVEhST1codGVzdC5nZXQoKSwgRW5kT2ZGaWxlRXhjZXB0aW9uKTsKK30KKworLy8gZ3ppcCBzdHJlYW0uICBBcHBsZSBkb2Vzbid0IGxpa2UgcG9wZW4sIGZpbGVubywgZHVwLiAgVGhpcyBpcyBhbiBpc3N1ZSB3aXRoCisvLyB0aGUgdGVzdC4KKyNpZiAhZGVmaW5lZCBfX0FQUExFX18gJiYgIWRlZmluZWQgX19NSU5HVzMyX18KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFN0cmVhbVppcFJlYWRMaW5lKSB7CisgIHN0ZDo6ZnN0cmVhbSByZWYoRmlsZUxvY2F0aW9uKCkuY19zdHIoKSwgc3RkOjppb3M6OmluKTsKKworICBzdGQ6OnN0cmluZyBjb21tYW5kKCJnemlwIDxcIiIpOworICBjb21tYW5kICs9IEZpbGVMb2NhdGlvbigpICsgIlwiIjsKKworICBGSUxFICogY2F0dGVyID0gcG9wZW4oY29tbWFuZC5jX3N0cigpLCAiciIpOworICBCT09TVF9SRVFVSVJFKGNhdHRlcik7CisKKyAgRmlsZVBpZWNlIHRlc3QoZHVwKGZpbGVubyhjYXR0ZXIpKSwgImZpbGVfcGllY2UuY2MuZ3oiLCBOVUxMLCAxKTsKKyAgc3RkOjpzdHJpbmcgcmVmX2xpbmU7CisgIHdoaWxlIChnZXRsaW5lKHJlZiwgcmVmX2xpbmUpKSB7CisgICAgU3RyaW5nUGllY2UgdGVzdF9saW5lKHRlc3QuUmVhZExpbmUoKSk7CisgICAgLy8gSSBzdWJtaXR0ZWQgYSBidWcgcmVwb3J0IHRvIElDVTogaHR0cDovL2J1Z3MuaWN1LXByb2plY3Qub3JnL3RyYWMvdGlja2V0Lzc5MjQKKyAgICBpZiAoIXRlc3RfbGluZS5lbXB0eSgpIHx8ICFyZWZfbGluZS5lbXB0eSgpKSB7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChyZWZfbGluZSwgdGVzdF9saW5lKTsKKyAgICB9CisgIH0KKyAgQk9PU1RfQ0hFQ0tfVEhST1codGVzdC5nZXQoKSwgRW5kT2ZGaWxlRXhjZXB0aW9uKTsKKyAgQk9PU1RfUkVRVUlSRSghcGNsb3NlKGNhdHRlcikpOworfQorI2VuZGlmIC8vIF9fQVBQTEVfXworCisjZW5kaWYgLy8gSEFWRV9aTElCCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE51bWJlcnMpIHsKKyAgc2NvcGVkX2ZkIGZpbGUoTWFrZVRlbXAoRmlsZUxvY2F0aW9uKCkpKTsKKyAgY29uc3QgZmxvYXQgZmxvYXRpbmcgPSAzLjI7CisgIHsKKyAgICB1dGlsOjpGaWxlU3RyZWFtIHdyaXRpbmcoZmlsZS5nZXQoKSk7CisgICAgd3JpdGluZyA8PCAiOTQzODk0ODM5ODQzOTg0OTM4OTAyODcgIiA8PCBmbG9hdGluZyA8PCAiIDUiOworICB9CisgIFNlZWtPclRocm93KGZpbGUuZ2V0KCksIDApOworICB1dGlsOjpGaWxlUGllY2UgZihmaWxlLnJlbGVhc2UoKSk7CisgIEJPT1NUX0NIRUNLX1RIUk9XKGYuUmVhZFVMb25nKCksIFBhcnNlTnVtYmVyRXhjZXB0aW9uKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoIjk0Mzg5NDgzOTg0Mzk4NDkzODkwMjg3IiwgZi5SZWFkRGVsaW1pdGVkKCkpOworICAvLyBZZXMsIGV4YWN0bHkgZXF1YWwuICBJc24ndCBkb3VibGUtY29udmVyc2lvbiB3b25kZXJmdWw/CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZsb2F0aW5nLCBmLlJlYWRGbG9hdCgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoNSwgZi5SZWFkVUxvbmcoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlCit9IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9maWxlX3N0cmVhbS5oaCBiL3NyYy9rZW5sbS91dGlsL2ZpbGVfc3RyZWFtLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOWFkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9maWxlX3N0cmVhbS5oaApAQCAtMCwwICsxLDg5IEBACisvKiBMaWtlIHN0ZDo6b2ZzdHJlYW0gYnV0IHdpdGhvdXQgYmVpbmcgaW5jcmVkaWJseSBzbG93LiAgQmFja2VkIGJ5IGEgcmF3IGZkLgorICogU3VwcG9ydHMgbW9zdCBvZiB0aGUgYnVpbHQtaW4gdHlwZXMgZXhjZXB0IGZvciBsb25nIGRvdWJsZS4KKyAqLworI2lmbmRlZiBVVElMX0ZJTEVfU1RSRUFNX0gKKyNkZWZpbmUgVVRJTF9GSUxFX1NUUkVBTV9ICisKKyNpbmNsdWRlICJ1dGlsL2Zha2Vfb3N0cmVhbS5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisjaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHV0aWwgeworCitjbGFzcyBGaWxlU3RyZWFtIDogcHVibGljIEZha2VPU3RyZWFtPEZpbGVTdHJlYW0+IHsKKyAgcHVibGljOgorICAgIEZpbGVTdHJlYW0oaW50IG91dCA9IC0xLCBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZSA9IDgxOTIpCisgICAgICA6IGJ1Zl8odXRpbDo6TWFsbG9jT3JUaHJvdyhzdGQ6Om1heDxzdGQ6OnNpemVfdD4oYnVmZmVyX3NpemUsIGtUb1N0cmluZ01heEJ5dGVzKSkpLAorICAgICAgICBjdXJyZW50XyhzdGF0aWNfY2FzdDxjaGFyKj4oYnVmXy5nZXQoKSkpLAorICAgICAgICBlbmRfKGN1cnJlbnRfICsgc3RkOjptYXg8c3RkOjpzaXplX3Q+KGJ1ZmZlcl9zaXplLCBrVG9TdHJpbmdNYXhCeXRlcykpLAorICAgICAgICBmZF8ob3V0KSB7fQorCisgICAgfkZpbGVTdHJlYW0oKSB7CisgICAgICBmbHVzaCgpOworICAgIH0KKworICAgIHZvaWQgU2V0RkQoaW50IHRvKSB7CisgICAgICBmbHVzaCgpOworICAgICAgZmRfID0gdG87CisgICAgfQorCisgICAgRmlsZVN0cmVhbSAmZmx1c2goKSB7CisgICAgICBpZiAoY3VycmVudF8gIT0gYnVmXy5nZXQoKSkgeworICAgICAgICB1dGlsOjpXcml0ZU9yVGhyb3coZmRfLCBidWZfLmdldCgpLCBjdXJyZW50XyAtIChjaGFyKilidWZfLmdldCgpKTsKKyAgICAgICAgY3VycmVudF8gPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmXy5nZXQoKSk7CisgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gRm9yIHdyaXRlcyBvZiBhcmJpdHJhcnkgc2l6ZS4KKyAgICBGaWxlU3RyZWFtICZ3cml0ZShjb25zdCB2b2lkICpkYXRhLCBzdGQ6OnNpemVfdCBsZW5ndGgpIHsKKyAgICAgIGlmIChVVElMX0xJS0VMWShjdXJyZW50XyArIGxlbmd0aCA8PSBlbmRfKSkgeworICAgICAgICBzdGQ6Om1lbWNweShjdXJyZW50XywgZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgY3VycmVudF8gKz0gbGVuZ3RoOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICBmbHVzaCgpOworICAgICAgaWYgKGN1cnJlbnRfICsgbGVuZ3RoIDw9IGVuZF8pIHsKKyAgICAgICAgc3RkOjptZW1jcHkoY3VycmVudF8sIGRhdGEsIGxlbmd0aCk7CisgICAgICAgIGN1cnJlbnRfICs9IGxlbmd0aDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHV0aWw6OldyaXRlT3JUaHJvdyhmZF8sIGRhdGEsIGxlbmd0aCk7CisgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRmlsZVN0cmVhbSAmc2Vla3AodWludDY0X3QgdG8pIHsKKyAgICAgIHV0aWw6OlNlZWtPclRocm93KGZkXywgdG8pOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgZnJpZW5kIGNsYXNzIEZha2VPU3RyZWFtPEZpbGVTdHJlYW0+OworICAgIC8vIEZvciB3cml0ZXMgZGlyZWN0bHkgdG8gYnVmZmVyIGd1YXJhbnRlZWQgdG8gaGF2ZSBhbW91bnQgPCBidWZmZXIgc2l6ZS4KKyAgICBjaGFyICpFbnN1cmUoc3RkOjpzaXplX3QgYW1vdW50KSB7CisgICAgICBpZiAoVVRJTF9VTkxJS0VMWShjdXJyZW50XyArIGFtb3VudCA+IGVuZF8pKSB7CisgICAgICAgIGZsdXNoKCk7CisgICAgICAgIGFzc2VydChjdXJyZW50XyArIGFtb3VudCA8PSBlbmRfKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjdXJyZW50XzsKKyAgICB9CisKKyAgICB2b2lkIEFkdmFuY2VUbyhjaGFyICp0bykgeworICAgICAgY3VycmVudF8gPSB0bzsKKyAgICAgIGFzc2VydChjdXJyZW50XyA8PSBlbmRfKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB1dGlsOjpzY29wZWRfbWFsbG9jIGJ1Zl87CisgICAgY2hhciAqY3VycmVudF8sICplbmRfOworICAgIGludCBmZF87Cit9OworCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL2ZpeGVkX2FycmF5LmhoIGIvc3JjL2tlbmxtL3V0aWwvZml4ZWRfYXJyYXkuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3ZThlZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL2ZpeGVkX2FycmF5LmhoCkBAIC0wLDAgKzEsMTc2IEBACisjaWZuZGVmIFVUSUxfRklYRURfQVJSQVlfSAorI2RlZmluZSBVVElMX0ZJWEVEX0FSUkFZX0gKKworI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworbmFtZXNwYWNlIHV0aWwgeworCisvKioKKyAqIERlZmluZXMgYW4gYXJyYXkgd2l0aCBmaXhlZCBtYXhpbXVtIHNpemUuCisgKgorICogRXZlciB3YW50IGFuIGFycmF5IG9mIHRoaW5ncyBidXQgdGhleSBkb24ndCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciBvcgorICogYXJlIG5vbi1jb3B5YWJsZT8gIEZpeGVkQXJyYXkgYWxsb3dzIGNvbnN0cnVjdGluZyBvbmUgYXQgYSB0aW1lLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgRml4ZWRBcnJheSB7CisgIHB1YmxpYzoKKyAgICAvKiogSW5pdGlhbGl6ZSB3aXRoIGEgZ2l2ZW4gc2l6ZSBib3VuZCBidXQgZG8gbm90IGNvbnN0cnVjdCB0aGUgb2JqZWN0cy4gKi8KKyAgICBleHBsaWNpdCBGaXhlZEFycmF5KHN0ZDo6c2l6ZV90IGxpbWl0KSB7CisgICAgICBJbml0KGxpbWl0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlLCBidXQgZG9lcyBub3QgaW5pdGlhbGl6ZSBpdC4KKyAgICAgKgorICAgICAqIEFueSBvYmplY3RzIGNvbnN0cnVjdGVkIGluIHRoaXMgbWFubmVyIG11c3QgYmUgc3Vic2VxdWVudGx5IEByZWYgRml4ZWRBcnJheTo6SW5pdCgpICJpbml0aWFsaXplZCIgcHJpb3IgdG8gdXNlLgorICAgICAqCisgICAgICogQHNlZSBGaXhlZEFycmF5OjpJbml0KCkKKyAgICAgKi8KKyAgICBGaXhlZEFycmF5KCkKKyAgICAgIDogbmV3ZWRfZW5kXyhOVUxMKQorI2lmbmRlZiBOREVCVUcKKyAgICAgICwgYWxsb2NhdGVkX2VuZF8oTlVMTCkKKyNlbmRpZgorICAgIHt9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHdpdGggYSBnaXZlbiBzaXplIGJvdW5kIGJ1dCBkbyBub3QgY29uc3RydWN0IHRoZSBvYmplY3RzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcgbWVtb3J5LgorICAgICAqIE9iamVjdHMgc3RvcmVkIGluIHRoaXMgYXJyYXkgd2lsbCBiZSBjb25zdHJ1Y3RlZCBpbiBhIGxvY2F0aW9uIHdpdGhpbiB0aGlzIGFsbG9jYXRlZCBtZW1vcnkuCisgICAgICovCisgICAgdm9pZCBJbml0KHN0ZDo6c2l6ZV90IGNvdW50KSB7CisgICAgICBhc3NlcnQoIWJsb2NrXy5nZXQoKSk7CisgICAgICBibG9ja18ucmVzZXQobWFsbG9jKHNpemVvZihUKSAqIGNvdW50KSk7CisgICAgICBpZiAoIWJsb2NrXy5nZXQoKSkgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICAgIG5ld2VkX2VuZF8gPSBiZWdpbigpOworI2lmbmRlZiBOREVCVUcKKyAgICAgIGFsbG9jYXRlZF9lbmRfID0gYmVnaW4oKSArIGNvdW50OworI2VuZGlmCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGNvcHkgb2YgdGhlIHByb3ZpZGVkIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGZyb20gQXJyYXkgd2hvc2UgZWxlbWVudHMgc2hvdWxkIGJlIGNvcGllZCBpbnRvIHRoaXMgbmV3bHktY29uc3RydWN0ZWQgZGF0YSBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgRml4ZWRBcnJheShjb25zdCBGaXhlZEFycmF5ICZmcm9tKSB7CisgICAgICBzdGQ6OnNpemVfdCBzaXplID0gZnJvbS5uZXdlZF9lbmRfIC0gc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KGZyb20uYmxvY2tfLmdldCgpKTsKKyAgICAgIEluaXQoc2l6ZSk7CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIHB1c2hfYmFjayhmcm9tW2ldKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGcmVlcyB0aGUgbWVtb3J5IGhlbGQgYnkgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgfkZpeGVkQXJyYXkoKSB7IGNsZWFyKCk7IH0KKworICAgIC8qKiBHZXRzIGEgcG9pbnRlciB0byB0aGUgZmlyc3Qgb2JqZWN0IGN1cnJlbnRseSBzdG9yZWQgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZS4gKi8KKyAgICBUICpiZWdpbigpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihibG9ja18uZ2V0KCkpOyB9CisKKyAgICAvKiogR2V0cyBhIGNvbnN0IHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2JqZWN0IGN1cnJlbnRseSBzdG9yZWQgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZS4gKi8KKyAgICBjb25zdCBUICpiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFQqPihibG9ja18uZ2V0KCkpOyB9CisKKyAgICAvKiogR2V0cyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2JqZWN0IGN1cnJlbnRseSBzdG9yZWQgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZS4gKi8KKyAgICBUICplbmQoKSB7IHJldHVybiBuZXdlZF9lbmRfOyB9CisKKyAgICAvKiogR2V0cyBhIGNvbnN0IHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2JqZWN0IGN1cnJlbnRseSBzdG9yZWQgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZS4gKi8KKyAgICBjb25zdCBUICplbmQoKSBjb25zdCB7IHJldHVybiBuZXdlZF9lbmRfOyB9CisKKyAgICAvKiogR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgbGFzdCBvYmplY3QgY3VycmVudGx5IHN0b3JlZCBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLiAqLworICAgIFQgJmJhY2soKSB7IHJldHVybiAqKGVuZCgpIC0gMSk7IH0KKworICAgIC8qKiBHZXRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBsYXN0IG9iamVjdCBjdXJyZW50bHkgc3RvcmVkIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuICovCisgICAgY29uc3QgVCAmYmFjaygpIGNvbnN0IHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQorCisgICAgLyoqIEdldHMgdGhlIG51bWJlciBvZiBvYmplY3RzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZS4gKi8KKyAgICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kKCkgLSBiZWdpbigpOyB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBubyBvYmplY3RzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZS4gKi8KKyAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHdpdGggaW5kZXggaSBjdXJyZW50bHkgc3RvcmVkIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaSBJbmRleCBvZiB0aGUgb2JqZWN0IHRvIHJlZmVyZW5jZQorICAgICAqLworICAgIFQgJm9wZXJhdG9yW10oc3RkOjpzaXplX3QgaSkgeworICAgICAgYXNzZXJ0KGkgPCBzaXplKCkpOworICAgICAgcmV0dXJuIGJlZ2luKClbaV07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHdpdGggaW5kZXggaSBjdXJyZW50bHkgc3RvcmVkIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaSBJbmRleCBvZiB0aGUgb2JqZWN0IHRvIHJlZmVyZW5jZQorICAgICAqLworICAgIGNvbnN0IFQgJm9wZXJhdG9yW10oc3RkOjpzaXplX3QgaSkgY29uc3QgeworICAgICAgYXNzZXJ0KGkgPCBzaXplKCkpOworICAgICAgcmV0dXJuIGJlZ2luKClbaV07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBvYmplY3QgdXNpbmcgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciwKKyAgICAgKiBhbmQgc3RvcmVzIGl0IGluIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBUaGUgbWVtb3J5IGJhY2tpbmcgdGhlIGNvbnN0cnVjdGVkIG9iamVjdCBpcyBtYW5hZ2VkIGJ5IHRoaXMgZGF0YSBzdHJ1Y3R1cmUuCisgICAgICogSSBtaXNzIEMrKzExIHZhcmlhZGljIHRlbXBsYXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHB1c2hfYmFjaygpIHsKKyAgICAgIG5ldyAoZW5kKCkpIFQoKTsKKyAgICAgIENvbnN0cnVjdGVkKCk7CisgICAgfQorICAgIHRlbXBsYXRlIDxjbGFzcyBDPiB2b2lkIHB1c2hfYmFjayhjb25zdCBDICZjKSB7CisgICAgICBuZXcgKGVuZCgpKSBUKGMpOworICAgICAgQ29uc3RydWN0ZWQoKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIEM+IHZvaWQgcHVzaF9iYWNrKEMgJmMpIHsKKyAgICAgIG5ldyAoZW5kKCkpIFQoYyk7CisgICAgICBDb25zdHJ1Y3RlZCgpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQywgY2xhc3MgRD4gdm9pZCBwdXNoX2JhY2soY29uc3QgQyAmYywgY29uc3QgRCAmZCkgeworICAgICAgbmV3IChlbmQoKSkgVChjLCBkKTsKKyAgICAgIENvbnN0cnVjdGVkKCk7CisgICAgfQorCisgICAgdm9pZCBwb3BfYmFjaygpIHsKKyAgICAgIGJhY2soKS5+VCgpOworICAgICAgLS1uZXdlZF9lbmRfOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBhcnJheS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgd2hpbGUgKG5ld2VkX2VuZF8gIT0gYmVnaW4oKSkKKyAgICAgICAgcG9wX2JhY2soKTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIEFsd2F5cyBjYWxsIENvbnN0cnVjdGVkIGFmdGVyIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBuZXcuCisgICAgdm9pZCBDb25zdHJ1Y3RlZCgpIHsKKyAgICAgICsrbmV3ZWRfZW5kXzsKKyNpZm5kZWYgTkRFQlVHCisgICAgICBhc3NlcnQobmV3ZWRfZW5kXyA8PSBhbGxvY2F0ZWRfZW5kXyk7CisjZW5kaWYKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB1dGlsOjpzY29wZWRfbWFsbG9jIGJsb2NrXzsKKworICAgIFQgKm5ld2VkX2VuZF87CisKKyNpZm5kZWYgTkRFQlVHCisgICAgVCAqYWxsb2NhdGVkX2VuZF87CisjZW5kaWYKK307CisKK30gLy8gbmFtZXNwYWNlIHV0aWwKKworI2VuZGlmIC8vIFVUSUxfRklYRURfQVJSQVlfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvZmxvYXRfdG9fc3RyaW5nLmNjIGIvc3JjL2tlbmxtL3V0aWwvZmxvYXRfdG9fc3RyaW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMTZkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9mbG9hdF90b19zdHJpbmcuY2MKQEAgLTAsMCArMSwyMyBAQAorI2luY2x1ZGUgInV0aWwvZmxvYXRfdG9fc3RyaW5nLmhoIgorCisjaW5jbHVkZSAidXRpbC9kb3VibGUtY29udmVyc2lvbi9kb3VibGUtY29udmVyc2lvbi5oIgorI2luY2x1ZGUgInV0aWwvZG91YmxlLWNvbnZlcnNpb24vdXRpbHMuaCIKKworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHsKK2NvbnN0IGRvdWJsZV9jb252ZXJzaW9uOjpEb3VibGVUb1N0cmluZ0NvbnZlcnRlciBrQ29udmVydGVyKGRvdWJsZV9jb252ZXJzaW9uOjpEb3VibGVUb1N0cmluZ0NvbnZlcnRlcjo6Tk9fRkxBR1MsICJpbmYiLCAiTmFOIiwgJ2UnLCAtNiwgMjEsIDYsIDApOworfSAvLyBuYW1lc3BhY2UKKworY2hhciAqVG9TdHJpbmcoZG91YmxlIHZhbHVlLCBjaGFyICp0bykgeworICBkb3VibGVfY29udmVyc2lvbjo6U3RyaW5nQnVpbGRlciBidWlsZGVyKHRvLCBUb1N0cmluZ0J1Zjxkb3VibGU+OjprQnl0ZXMpOworICBrQ29udmVydGVyLlRvU2hvcnRlc3QodmFsdWUsICZidWlsZGVyKTsKKyAgcmV0dXJuICZ0b1tidWlsZGVyLnBvc2l0aW9uKCldOworfQorCitjaGFyICpUb1N0cmluZyhmbG9hdCB2YWx1ZSwgY2hhciAqdG8pIHsKKyAgZG91YmxlX2NvbnZlcnNpb246OlN0cmluZ0J1aWxkZXIgYnVpbGRlcih0bywgVG9TdHJpbmdCdWY8ZmxvYXQ+OjprQnl0ZXMpOworICBrQ29udmVydGVyLlRvU2hvcnRlc3RTaW5nbGUodmFsdWUsICZidWlsZGVyKTsKKyAgcmV0dXJuICZ0b1tidWlsZGVyLnBvc2l0aW9uKCldOworfQorCit9IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9mbG9hdF90b19zdHJpbmcuaGggYi9zcmMva2VubG0vdXRpbC9mbG9hdF90b19zdHJpbmcuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwNTMyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL2Zsb2F0X3RvX3N0cmluZy5oaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIFVUSUxfRkxPQVRfVE9fU1RSSU5HX0gKKyNkZWZpbmUgVVRJTF9GTE9BVF9UT19TVFJJTkdfSAorCisvLyBKdXN0IGZvciBUb1N0cmluZ0J1ZgorI2luY2x1ZGUgInV0aWwvaW50ZWdlcl90b19zdHJpbmcuaGgiCisKK25hbWVzcGFjZSB1dGlsIHsKKwordGVtcGxhdGUgPD4gc3RydWN0IFRvU3RyaW5nQnVmPGRvdWJsZT4geworICAvLyBEb3VibGVUb1N0cmluZ0NvbnZlcnRlcjo6a0Jhc2UxME1heGltYWxMZW5ndGggKyAxIGZvciBudWxsIHBhcmFub2lhLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQga0J5dGVzID0gMTk7Cit9OworCisvLyBTaW5nbGUgd2Fzbid0IGRvY3VtZW50ZWQgaW4gZG91YmxlIGNvbnZlcnNpb24sIHNvIGJlIGNvbnNlcnZhdGl2ZSBhbmQKKy8vIHNheSB0aGUgc2FtZSBhcyBkb3VibGUuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVG9TdHJpbmdCdWY8ZmxvYXQ+IHsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtCeXRlcyA9IDE5OworfTsKKworY2hhciAqVG9TdHJpbmcoZG91YmxlIHZhbHVlLCBjaGFyICp0byk7CitjaGFyICpUb1N0cmluZyhmbG9hdCB2YWx1ZSwgY2hhciAqdG8pOworCit9IC8vIG5hbWVzcGFjZSB1dGlsCisKKyNlbmRpZiAvLyBVVElMX0ZMT0FUX1RPX1NUUklOR19ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9nZXRvcHQuYyBiL3NyYy9rZW5sbS91dGlsL2dldG9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZWVmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9nZXRvcHQuYwpAQCAtMCwwICsxLDc4IEBACisvKgorUE9TSVggZ2V0b3B0IGZvciBXaW5kb3dzCisKK0FUJlQgUHVibGljIExpY2Vuc2UKKworQ29kZSBnaXZlbiBvdXQgYXQgdGhlIDE5ODUgVU5JRk9SVU0gY29uZmVyZW5jZSBpbiBEYWxsYXMuCisqLworCisjaWZuZGVmIF9fR05VQ19fCisKKyNpbmNsdWRlICJnZXRvcHQuaGgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBOVUxMCTAKKyNkZWZpbmUgRU9GCSgtMSkKKyNkZWZpbmUgRVJSKHMsIGMpCWlmKG9wdGVycil7XAorCWNoYXIgZXJyYnVmWzJdO1wKKwllcnJidWZbMF0gPSBjOyBlcnJidWZbMV0gPSAnXG4nO1wKKwlmcHV0cyhhcmd2WzBdLCBzdGRlcnIpO1wKKwlmcHV0cyhzLCBzdGRlcnIpO1wKKwlmcHV0YyhjLCBzdGRlcnIpO30KKwkvLyh2b2lkKSB3cml0ZSgyLCBhcmd2WzBdLCAodW5zaWduZWQpc3RybGVuKGFyZ3ZbMF0pKTtcCisJLy8odm9pZCkgd3JpdGUoMiwgcywgKHVuc2lnbmVkKXN0cmxlbihzKSk7XAorCS8vKHZvaWQpIHdyaXRlKDIsIGVycmJ1ZiwgMik7fQorCitpbnQJb3B0ZXJyID0gMTsKK2ludAlvcHRpbmQgPSAxOworaW50CW9wdG9wdDsKK2NoYXIJKm9wdGFyZzsKKworaW50CitnZXRvcHQoYXJnYywgYXJndiwgb3B0cykKK2ludAlhcmdjOworY2hhcgkqKmFyZ3YsICpvcHRzOworeworCXN0YXRpYyBpbnQgc3AgPSAxOworCXJlZ2lzdGVyIGludCBjOworCXJlZ2lzdGVyIGNoYXIgKmNwOworCisJaWYoc3AgPT0gMSkKKwkJaWYob3B0aW5kID49IGFyZ2MgfHwKKwkJICAgYXJndltvcHRpbmRdWzBdICE9ICctJyB8fCBhcmd2W29wdGluZF1bMV0gPT0gJ1wwJykKKwkJCXJldHVybihFT0YpOworCQllbHNlIGlmKHN0cmNtcChhcmd2W29wdGluZF0sICItLSIpID09IE5VTEwpIHsKKwkJCW9wdGluZCsrOworCQkJcmV0dXJuKEVPRik7CisJCX0KKwlvcHRvcHQgPSBjID0gYXJndltvcHRpbmRdW3NwXTsKKwlpZihjID09ICc6JyB8fCAoY3A9c3RyY2hyKG9wdHMsIGMpKSA9PSBOVUxMKSB7CisJCUVSUigiOiBpbGxlZ2FsIG9wdGlvbiAtLSAiLCBjKTsKKwkJaWYoYXJndltvcHRpbmRdWysrc3BdID09ICdcMCcpIHsKKwkJCW9wdGluZCsrOworCQkJc3AgPSAxOworCQl9CisJCXJldHVybignPycpOworCX0KKwlpZigqKytjcCA9PSAnOicpIHsKKwkJaWYoYXJndltvcHRpbmRdW3NwKzFdICE9ICdcMCcpCisJCQlvcHRhcmcgPSAmYXJndltvcHRpbmQrK11bc3ArMV07CisJCWVsc2UgaWYoKytvcHRpbmQgPj0gYXJnYykgeworCQkJRVJSKCI6IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtLSAiLCBjKTsKKwkJCXNwID0gMTsKKwkJCXJldHVybignPycpOworCQl9IGVsc2UKKwkJCW9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOworCQlzcCA9IDE7CisJfSBlbHNlIHsKKwkJaWYoYXJndltvcHRpbmRdWysrc3BdID09ICdcMCcpIHsKKwkJCXNwID0gMTsKKwkJCW9wdGluZCsrOworCQl9CisJCW9wdGFyZyA9IE5VTEw7CisJfQorCXJldHVybihjKTsKK30KKworI2VuZGlmICAvKiBfX0dOVUNfXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvZ2V0b3B0LmhoIGIvc3JjL2tlbmxtL3V0aWwvZ2V0b3B0LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMDc5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9nZXRvcHQuaGgKQEAgLTAsMCArMSwzMyBAQAorLyoKK1BPU0lYIGdldG9wdCBmb3IgV2luZG93cworCitBVCZUIFB1YmxpYyBMaWNlbnNlCisKK0NvZGUgZ2l2ZW4gb3V0IGF0IHRoZSAxOTg1IFVOSUZPUlVNIGNvbmZlcmVuY2UgaW4gRGFsbGFzLgorKi8KKworI2lmZGVmIF9fR05VQ19fCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjZW5kaWYKKyNpZm5kZWYgX19HTlVDX18KKworI2lmbmRlZiBVVElMX0dFVE9QVF9ICisjZGVmaW5lIFVUSUxfR0VUT1BUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gaW50IG9wdGVycjsKK2V4dGVybiBpbnQgb3B0aW5kOworZXh0ZXJuIGludCBvcHRvcHQ7CitleHRlcm4gY2hhciAqb3B0YXJnOworZXh0ZXJuIGludCBnZXRvcHQoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICpvcHRzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvKiBVVElMX0dFVE9QVF9IICovCisjZW5kaWYgIC8qIF9fR05VQ19fICovCisKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2hhdmUuaGggYi9zcmMva2VubG0vdXRpbC9oYXZlLmhoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9oYXZlLmhoCnJlbmFtZSB0byBzcmMva2VubG0vdXRpbC9oYXZlLmhoCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9pbnRlZ2VyX3RvX3N0cmluZy5jYyBiL3NyYy9rZW5sbS91dGlsL2ludGVnZXJfdG9fc3RyaW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZmQ3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9pbnRlZ2VyX3RvX3N0cmluZy5jYwpAQCAtMCwwICsxLDY2NyBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorLyogRmFzdCBpbnRlZ2VyIHRvIHN0cmluZyBjb252ZXJzaW9uLgorU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vbWlsb3lpcC9pdG9hLWJlbmNobWFyaworTG9jYWwgbW9kaWZpY2F0aW9uczoKKzEuIFJldHVybiBlbmQgb2YgYnVmZmVyIGluc3RlYWQgb2YgbnVsbCB0ZXJtaW5hdGluZworMi4gQ29sbGFwc2UgdG8gc2luZ2xlIGZpbGUKKzMuIE5hbWVzcGFjZQorNC4gUmVtb3ZlIHRlc3QgaG9vaworNS4gTm9uLXg4NiBzdXBwb3J0IGZyb20gdGhlIGJyYW5jaF9sdXQgY29kZQorNi4gUmVuYW1lIGZ1bmN0aW9ucworNy4gUmVxdWlyZSBfX1NTRTJfXyBvbiBpMzg2CisKK0NvcHlyaWdodCAoQykgMjAxNCBNaWxvIFlpcAorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworV2hpY2ggaXMgYmFzZWQgb246IGh0dHA6Ly8weDgwLnBsL3NuaXBwZXRzL2FzbS9zc2UtdXRvYS5jCisKKyAgU1NFOiBjb252ZXJzaW9uIGludGVnZXJzIHRvIGRlY2ltYWwgcmVwcmVzZW50YXRpb24KKworICBBdXRob3I6IFdvamNpZWNoIE11w4XigJphCisgIGUtbWFpbDogd29qY2llY2hfbXVsYUBwb2N6dGEub25ldC5wbAorICB3d3c6ICAgIGh0dHA6Ly8weDgwLnBsLworCisgIExpY2Vuc2U6IEJTRAorCisgIGluaXRpYWwgcmVsZWFzZSAyMDExLTEwLTIxCisgICRJZCQKKyovCisKKyNpbmNsdWRlICJ1dGlsL2ludGVnZXJfdG9fc3RyaW5nLmhoIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB1dGlsIHsKKworbmFtZXNwYWNlIHsKK2NvbnN0IGNoYXIgZ0RpZ2l0c0x1dFsyMDBdID0geworICAnMCcsJzAnLCcwJywnMScsJzAnLCcyJywnMCcsJzMnLCcwJywnNCcsJzAnLCc1JywnMCcsJzYnLCcwJywnNycsJzAnLCc4JywnMCcsJzknLAorICAnMScsJzAnLCcxJywnMScsJzEnLCcyJywnMScsJzMnLCcxJywnNCcsJzEnLCc1JywnMScsJzYnLCcxJywnNycsJzEnLCc4JywnMScsJzknLAorICAnMicsJzAnLCcyJywnMScsJzInLCcyJywnMicsJzMnLCcyJywnNCcsJzInLCc1JywnMicsJzYnLCcyJywnNycsJzInLCc4JywnMicsJzknLAorICAnMycsJzAnLCczJywnMScsJzMnLCcyJywnMycsJzMnLCczJywnNCcsJzMnLCc1JywnMycsJzYnLCczJywnNycsJzMnLCc4JywnMycsJzknLAorICAnNCcsJzAnLCc0JywnMScsJzQnLCcyJywnNCcsJzMnLCc0JywnNCcsJzQnLCc1JywnNCcsJzYnLCc0JywnNycsJzQnLCc4JywnNCcsJzknLAorICAnNScsJzAnLCc1JywnMScsJzUnLCcyJywnNScsJzMnLCc1JywnNCcsJzUnLCc1JywnNScsJzYnLCc1JywnNycsJzUnLCc4JywnNScsJzknLAorICAnNicsJzAnLCc2JywnMScsJzYnLCcyJywnNicsJzMnLCc2JywnNCcsJzYnLCc1JywnNicsJzYnLCc2JywnNycsJzYnLCc4JywnNicsJzknLAorICAnNycsJzAnLCc3JywnMScsJzcnLCcyJywnNycsJzMnLCc3JywnNCcsJzcnLCc1JywnNycsJzYnLCc3JywnNycsJzcnLCc4JywnNycsJzknLAorICAnOCcsJzAnLCc4JywnMScsJzgnLCcyJywnOCcsJzMnLCc4JywnNCcsJzgnLCc1JywnOCcsJzYnLCc4JywnNycsJzgnLCc4JywnOCcsJzknLAorICAnOScsJzAnLCc5JywnMScsJzknLCcyJywnOScsJzMnLCc5JywnNCcsJzknLCc1JywnOScsJzYnLCc5JywnNycsJzknLCc4JywnOScsJzknCit9OworfSAvLyBuYW1lc3BhY2UKKworLy8gU1NFMiBpbXBsZW1lbnRhdGlvbiBhY2NvcmRpbmcgdG8gaHR0cDovLzB4ODAucGwvYXJ0aWNsZXMvc3NlLWl0b2EuaHRtbAorLy8gTW9kaWZpY2F0aW9uczogKDEpIGZpeCBpbmNvcnJlY3QgZGlnaXRzICgyKSBhY2NlcHQgYWxsIHJhbmdlcyAoMykgd3JpdGUgdG8gdXNlciBwcm92aWRlZCBidWZmZXIuCisKKyNpZiBkZWZpbmVkKF9fYW1kNjQpIHx8IGRlZmluZWQoX01fWDY0KSB8fCAoZGVmaW5lZChfX1NTRTJfXykgJiYgKGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChpMzg2KSkpCisKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAiaW50cmluLmgiCisjZW5kaWYKKworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIEFMSUdOX1BSRSBfX2RlY2xzcGVjKGFsaWduKDE2KSkKKyNkZWZpbmUgQUxJR05fU1VGCisjZWxzZQorI2RlZmluZSBBTElHTl9QUkUKKyNkZWZpbmUgQUxJR05fU1VGICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKQorI2VuZGlmCisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrRGl2MTAwMDAgPSAweGQxYjcxNzU5OworQUxJR05fUFJFIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGl2MTAwMDBWZWN0b3JbNF0gQUxJR05fU1VGID0geyBrRGl2MTAwMDAsIGtEaXYxMDAwMCwga0RpdjEwMDAwLCBrRGl2MTAwMDAgfTsKK0FMSUdOX1BSRSBzdGF0aWMgY29uc3QgdWludDMyX3QgazEwMDAwVmVjdG9yWzRdIEFMSUdOX1NVRiA9IHsgMTAwMDAsIDEwMDAwLCAxMDAwMCwgMTAwMDAgfTsKK0FMSUdOX1BSRSBzdGF0aWMgY29uc3QgdWludDE2X3Qga0RpdlBvd2Vyc1ZlY3Rvcls4XSBBTElHTl9TVUYgPSB7IDgzODksIDUyNDMsIDEzMTA4LCAzMjc2OCwgODM4OSwgNTI0MywgMTMxMDgsIDMyNzY4IH07IC8vIDEwXjMsIDEwXjIsIDEwXjEsIDEwXjAKK0FMSUdOX1BSRSBzdGF0aWMgY29uc3QgdWludDE2X3Qga1NoaWZ0UG93ZXJzVmVjdG9yWzhdIEFMSUdOX1NVRiA9IHsKKyAgICAxIDw8ICgxNiAtICgyMyArIDIgLSAxNikpLAorICAgIDEgPDwgKDE2IC0gKDE5ICsgMiAtIDE2KSksCisgICAgMSA8PCAoMTYgLSAxIC0gMiksCisgICAgMSA8PCAoMTUpLAorICAgIDEgPDwgKDE2IC0gKDIzICsgMiAtIDE2KSksCisgICAgMSA8PCAoMTYgLSAoMTkgKyAyIC0gMTYpKSwKKyAgICAxIDw8ICgxNiAtIDEgLSAyKSwKKyAgICAxIDw8ICgxNSkKK307CitBTElHTl9QUkUgc3RhdGljIGNvbnN0IHVpbnQxNl90IGsxMFZlY3Rvcls4XSBBTElHTl9TVUYgPSB7IDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCB9OworQUxJR05fUFJFIHN0YXRpYyBjb25zdCBjaGFyIGtBc2NpaVplcm9bMTZdIEFMSUdOX1NVRiA9IHsgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywgJzAnIH07CisKK2lubGluZSBfX20xMjhpIENvbnZlcnQ4RGlnaXRzU1NFMih1aW50MzJfdCB2YWx1ZSkgeworICAgIGFzc2VydCh2YWx1ZSA8PSA5OTk5OTk5OSk7CisKKyAgICAvLyBhYmNkLCBlZmdoID0gYWJjZGVmZ2ggZGl2bW9kIDEwMDAwCisgICAgY29uc3QgX19tMTI4aSBhYmNkZWZnaCA9IF9tbV9jdnRzaTMyX3NpMTI4KHZhbHVlKTsKKyAgICBjb25zdCBfX20xMjhpIGFiY2QgPSBfbW1fc3JsaV9lcGk2NChfbW1fbXVsX2VwdTMyKGFiY2RlZmdoLCByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihrRGl2MTAwMDBWZWN0b3IpWzBdKSwgNDUpOworICAgIGNvbnN0IF9fbTEyOGkgZWZnaCA9IF9tbV9zdWJfZXBpMzIoYWJjZGVmZ2gsIF9tbV9tdWxfZXB1MzIoYWJjZCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpKj4oazEwMDAwVmVjdG9yKVswXSkpOworCisgICAgLy8gdjEgPSBbIGFiY2QsIGVmZ2gsIDAsIDAsIDAsIDAsIDAsIDAgXQorICAgIGNvbnN0IF9fbTEyOGkgdjEgPSBfbW1fdW5wYWNrbG9fZXBpMTYoYWJjZCwgZWZnaCk7CisKKyAgICAvLyB2MWEgPSB2MSAqIDQgPSBbIGFiY2QgKiA0LCBlZmdoICogNCwgMCwgMCwgMCwgMCwgMCwgMCBdCisgICAgY29uc3QgX19tMTI4aSB2MWEgPSBfbW1fc2xsaV9lcGk2NCh2MSwgMik7CisKKyAgICAvLyB2MiA9IFsgYWJjZCAqIDQsIGFiY2QgKiA0LCBhYmNkICogNCwgYWJjZCAqIDQsIGVmZ2ggKiA0LCBlZmdoICogNCwgZWZnaCAqIDQsIGVmZ2ggKiA0IF0KKyAgICBjb25zdCBfX20xMjhpIHYyYSA9IF9tbV91bnBhY2tsb19lcGkxNih2MWEsIHYxYSk7CisgICAgY29uc3QgX19tMTI4aSB2MiA9IF9tbV91bnBhY2tsb19lcGkzMih2MmEsIHYyYSk7CisKKyAgICAvLyB2NCA9IHYyIGRpdiAxMF4zLCAxMF4yLCAxMF4xLCAxMF4wID0gWyBhLCBhYiwgYWJjLCBhYmNkLCBlLCBlZiwgZWZnLCBlZmdoIF0KKyAgICBjb25zdCBfX20xMjhpIHYzID0gX21tX211bGhpX2VwdTE2KHYyLCByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihrRGl2UG93ZXJzVmVjdG9yKVswXSk7CisgICAgY29uc3QgX19tMTI4aSB2NCA9IF9tbV9tdWxoaV9lcHUxNih2MywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpKj4oa1NoaWZ0UG93ZXJzVmVjdG9yKVswXSk7CisKKyAgICAvLyB2NSA9IHY0ICogMTAgPSBbIGEwLCBhYjAsIGFiYzAsIGFiY2QwLCBlMCwgZWYwLCBlZmcwLCBlZmdoMCBdCisgICAgY29uc3QgX19tMTI4aSB2NSA9IF9tbV9tdWxsb19lcGkxNih2NCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpKj4oazEwVmVjdG9yKVswXSk7CisKKyAgICAvLyB2NiA9IHY1IDw8IDE2ID0gWyAwLCBhMCwgYWIwLCBhYmMwLCAwLCBlMCwgZWYwLCBlZmcwIF0KKyAgICBjb25zdCBfX20xMjhpIHY2ID0gX21tX3NsbGlfZXBpNjQodjUsIDE2KTsKKworICAgIC8vIHY3ID0gdjQgLSB2NiA9IHsgYSwgYiwgYywgZCwgZSwgZiwgZywgaCB9CisgICAgY29uc3QgX19tMTI4aSB2NyA9IF9tbV9zdWJfZXBpMTYodjQsIHY2KTsKKworICAgIHJldHVybiB2NzsKK30KKworaW5saW5lIF9fbTEyOGkgU2hpZnREaWdpdHNfU1NFMihfX20xMjhpIGEsIHVuc2lnbmVkIGRpZ2l0KSB7CisgICAgYXNzZXJ0KGRpZ2l0IDw9IDgpOworICAgIHN3aXRjaCAoZGlnaXQpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gYTsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gX21tX3NybGlfc2kxMjgoYSwgMSk7CisgICAgICAgIGNhc2UgMjogcmV0dXJuIF9tbV9zcmxpX3NpMTI4KGEsIDIpOworICAgICAgICBjYXNlIDM6IHJldHVybiBfbW1fc3JsaV9zaTEyOChhLCAzKTsKKyAgICAgICAgY2FzZSA0OiByZXR1cm4gX21tX3NybGlfc2kxMjgoYSwgNCk7CisgICAgICAgIGNhc2UgNTogcmV0dXJuIF9tbV9zcmxpX3NpMTI4KGEsIDUpOworICAgICAgICBjYXNlIDY6IHJldHVybiBfbW1fc3JsaV9zaTEyOChhLCA2KTsKKyAgICAgICAgY2FzZSA3OiByZXR1cm4gX21tX3NybGlfc2kxMjgoYSwgNyk7CisgICAgICAgIGNhc2UgODogcmV0dXJuIF9tbV9zcmxpX3NpMTI4KGEsIDgpOworICAgIH0KKyAgICByZXR1cm4gYTsgLy8gc2hvdWxkIG5vdCBleGVjdXRlIGhlcmUuCit9CisKK30gLy8gbmFtZXNwYWNlCisKKy8vIE9yaWdpbmFsIG5hbWU6IHUzMnRvYV9zc2UyCitjaGFyICpUb1N0cmluZyh1aW50MzJfdCB2YWx1ZSwgY2hhciogYnVmZmVyKSB7CisgICAgaWYgKHZhbHVlIDwgMTAwMDApIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgZDEgPSAodmFsdWUgLyAxMDApIDw8IDE7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQyID0gKHZhbHVlICUgMTAwKSA8PCAxOworCisgICAgICAgIGlmICh2YWx1ZSA+PSAxMDAwKQorICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMV07CisgICAgICAgIGlmICh2YWx1ZSA+PSAxMDApCisgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QxICsgMV07CisgICAgICAgIGlmICh2YWx1ZSA+PSAxMCkKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDJdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QyICsgMV07CisgICAgICAgIC8vKmJ1ZmZlcisrID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9CisgICAgZWxzZSBpZiAodmFsdWUgPCAxMDAwMDAwMDApIHsKKyAgICAgICAgLy8gRXhwZXJpbWVudCBzaG93cyB0aGF0IHRoaXMgY2FzZSBTU0UyIGlzIHNsb3dlcgorI2lmIDAKKyAgICAgICAgY29uc3QgX19tMTI4aSBhID0gQ29udmVydDhEaWdpdHNTU0UyKHZhbHVlKTsKKworICAgICAgICAvLyBDb252ZXJ0IHRvIGJ5dGVzLCBhZGQgJzAnCisgICAgICAgIGNvbnN0IF9fbTEyOGkgdmEgPSBfbW1fYWRkX2VwaTgoX21tX3BhY2t1c19lcGkxNihhLCBfbW1fc2V0emVyb19zaTEyOCgpKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpKj4oa0FzY2lpWmVybylbMF0pOworCisgICAgICAgIC8vIENvdW50IG51bWJlciBvZiBkaWdpdAorICAgICAgICBjb25zdCB1bnNpZ25lZCBtYXNrID0gX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTgodmEsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSo+KGtBc2NpaVplcm8pWzBdKSk7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZGlnaXQ7CisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgX0JpdFNjYW5Gb3J3YXJkKCZkaWdpdCwgfm1hc2sgfCAweDgwMDApOworI2Vsc2UKKyAgICAgICAgZGlnaXQgPSBfX2J1aWx0aW5fY3R6KH5tYXNrIHwgMHg4MDAwKTsKKyNlbmRpZgorCisgICAgICAgIC8vIFNoaWZ0IGRpZ2l0cyB0byB0aGUgYmVnaW5uaW5nCisgICAgICAgIF9fbTEyOGkgcmVzdWx0ID0gU2hpZnREaWdpdHNfU1NFMih2YSwgZGlnaXQpOworICAgICAgICAvL19fbTEyOGkgcmVzdWx0ID0gX21tX3NybF9lcGk2NCh2YSwgX21tX2N2dHNpMzJfc2kxMjgoZGlnaXQgKiA4KSk7CisgICAgICAgIF9tbV9zdG9yZWxfZXBpNjQocmVpbnRlcnByZXRfY2FzdDxfX20xMjhpKj4oYnVmZmVyKSwgcmVzdWx0KTsKKyAgICAgICAgYnVmZmVyWzggLSBkaWdpdF0gPSAnXDAnOworI2Vsc2UKKyAgICAgICAgLy8gdmFsdWUgPSBiYmJiY2NjYworICAgICAgICBjb25zdCB1aW50MzJfdCBiID0gdmFsdWUgLyAxMDAwMDsKKyAgICAgICAgY29uc3QgdWludDMyX3QgYyA9IHZhbHVlICUgMTAwMDA7CisKKyAgICAgICAgY29uc3QgdWludDMyX3QgZDEgPSAoYiAvIDEwMCkgPDwgMTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgZDIgPSAoYiAlIDEwMCkgPDwgMTsKKworICAgICAgICBjb25zdCB1aW50MzJfdCBkMyA9IChjIC8gMTAwKSA8PCAxOworICAgICAgICBjb25zdCB1aW50MzJfdCBkNCA9IChjICUgMTAwKSA8PCAxOworCisgICAgICAgIGlmICh2YWx1ZSA+PSAxMDAwMDAwMCkKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDFdOworICAgICAgICBpZiAodmFsdWUgPj0gMTAwMDAwMCkKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDEgKyAxXTsKKyAgICAgICAgaWYgKHZhbHVlID49IDEwMDAwMCkKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDJdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QyICsgMV07CisKKyAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkM107CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDMgKyAxXTsKKyAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkNF07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDQgKyAxXTsKKy8vICAgICAgICAqYnVmZmVyKysgPSAnXDAnOworICAgICAgICByZXR1cm4gYnVmZmVyOworI2VuZGlmCisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyB2YWx1ZSA9IGFhYmJiYmJiYmIgaW4gZGVjaW1hbAorCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGEgPSB2YWx1ZSAvIDEwMDAwMDAwMDsgLy8gMSB0byA0MgorICAgICAgICB2YWx1ZSAlPSAxMDAwMDAwMDA7CisKKyAgICAgICAgaWYgKGEgPj0gMTApIHsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGkgPSBhIDw8IDE7CisgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2ldOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtpICsgMV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmJ1ZmZlcisrID0gJzAnICsgc3RhdGljX2Nhc3Q8Y2hhcj4oYSk7CisKKyAgICAgICAgY29uc3QgX19tMTI4aSBiID0gQ29udmVydDhEaWdpdHNTU0UyKHZhbHVlKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBiYSA9IF9tbV9hZGRfZXBpOChfbW1fcGFja3VzX2VwaTE2KF9tbV9zZXR6ZXJvX3NpMTI4KCksIGIpLCByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihrQXNjaWlaZXJvKVswXSk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgcmVzdWx0ID0gX21tX3NybGlfc2kxMjgoYmEsIDgpOworICAgICAgICBfbW1fc3RvcmVsX2VwaTY0KHJlaW50ZXJwcmV0X2Nhc3Q8X19tMTI4aSo+KGJ1ZmZlciksIHJlc3VsdCk7CisvLyAgICAgICAgYnVmZmVyWzhdID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlciArIDg7CisgICAgfQorfQorCisvLyBPcmlnaW5hbCBuYW1lOiB1NjR0b2Ffc3NlMgorY2hhciAqVG9TdHJpbmcodWludDY0X3QgdmFsdWUsIGNoYXIqIGJ1ZmZlcikgeworICAgIGlmICh2YWx1ZSA8IDEwMDAwMDAwMCkgeworICAgICAgICB1aW50MzJfdCB2ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlKTsKKyAgICAgICAgaWYgKHYgPCAxMDAwMCkgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZDEgPSAodiAvIDEwMCkgPDwgMTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGQyID0gKHYgJSAxMDApIDw8IDE7CisKKyAgICAgICAgICAgIGlmICh2ID49IDEwMDApCisgICAgICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMV07CisgICAgICAgICAgICBpZiAodiA+PSAxMDApCisgICAgICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMSArIDFdOworICAgICAgICAgICAgaWYgKHYgPj0gMTApCisgICAgICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMl07CisgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QyICsgMV07CisgICAgICAgICAgICAvLypidWZmZXIrKyA9ICdcMCc7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gRXhwZXJpbWVudCBzaG93cyB0aGF0IHRoaXMgY2FzZSBTU0UyIGlzIHNsb3dlcgorI2lmIDAKKyAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkgYSA9IENvbnZlcnQ4RGlnaXRzU1NFMih2KTsKKworICAgICAgICAgICAgLy8gQ29udmVydCB0byBieXRlcywgYWRkICcwJworICAgICAgICAgICAgY29uc3QgX19tMTI4aSB2YSA9IF9tbV9hZGRfZXBpOChfbW1fcGFja3VzX2VwaTE2KGEsIF9tbV9zZXR6ZXJvX3NpMTI4KCkpLCByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihrQXNjaWlaZXJvKVswXSk7CisKKyAgICAgICAgICAgIC8vIENvdW50IG51bWJlciBvZiBkaWdpdAorICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbWFzayA9IF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGk4KHZhLCByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihrQXNjaWlaZXJvKVswXSkpOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBkaWdpdDsKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgX0JpdFNjYW5Gb3J3YXJkKCZkaWdpdCwgfm1hc2sgfCAweDgwMDApOworI2Vsc2UKKyAgICAgICAgICAgIGRpZ2l0ID0gX19idWlsdGluX2N0eih+bWFzayB8IDB4ODAwMCk7CisjZW5kaWYKKworICAgICAgICAgICAgLy8gU2hpZnQgZGlnaXRzIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgIF9fbTEyOGkgcmVzdWx0ID0gU2hpZnREaWdpdHNfU1NFMih2YSwgZGlnaXQpOworICAgICAgICAgICAgX21tX3N0b3JlbF9lcGk2NChyZWludGVycHJldF9jYXN0PF9fbTEyOGkqPihidWZmZXIpLCByZXN1bHQpOworICAgICAgICAgICAgYnVmZmVyWzggLSBkaWdpdF0gPSAnXDAnOworI2Vsc2UKKyAgICAgICAgICAgIC8vIHZhbHVlID0gYmJiYmNjY2MKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGIgPSB2IC8gMTAwMDA7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjID0gdiAlIDEwMDAwOworCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkMSA9IChiIC8gMTAwKSA8PCAxOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZDIgPSAoYiAlIDEwMCkgPDwgMTsKKworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZDMgPSAoYyAvIDEwMCkgPDwgMTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGQ0ID0gKGMgJSAxMDApIDw8IDE7CisKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxMDAwMDAwMCkKKyAgICAgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QxXTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxMDAwMDAwKQorICAgICAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDEgKyAxXTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxMDAwMDApCisgICAgICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMl07CisgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QyICsgMV07CisKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDNdOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMyArIDFdOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkNF07CisgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q0ICsgMV07CisgICAgICAgICAgICAvLypidWZmZXIrKyA9ICdcMCc7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodmFsdWUgPCAxMDAwMDAwMDAwMDAwMDAwMCkgeworICAgICAgICBjb25zdCB1aW50MzJfdCB2MCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZSAvIDEwMDAwMDAwMCk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHYxID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlICUgMTAwMDAwMDAwKTsKKworICAgICAgICBjb25zdCBfX20xMjhpIGEwID0gQ29udmVydDhEaWdpdHNTU0UyKHYwKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBhMSA9IENvbnZlcnQ4RGlnaXRzU1NFMih2MSk7CisKKyAgICAgICAgLy8gQ29udmVydCB0byBieXRlcywgYWRkICcwJworICAgICAgICBjb25zdCBfX20xMjhpIHZhID0gX21tX2FkZF9lcGk4KF9tbV9wYWNrdXNfZXBpMTYoYTAsIGExKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpKj4oa0FzY2lpWmVybylbMF0pOworCisgICAgICAgIC8vIENvdW50IG51bWJlciBvZiBkaWdpdAorICAgICAgICBjb25zdCB1bnNpZ25lZCBtYXNrID0gX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTgodmEsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSo+KGtBc2NpaVplcm8pWzBdKSk7CisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgdW5zaWduZWQgbG9uZyBkaWdpdDsKKyAgICAgICAgX0JpdFNjYW5Gb3J3YXJkKCZkaWdpdCwgfm1hc2sgfCAweDgwMDApOworI2Vsc2UKKyAgICAgICAgdW5zaWduZWQgZGlnaXQgPSBfX2J1aWx0aW5fY3R6KH5tYXNrIHwgMHg4MDAwKTsKKyNlbmRpZgorCisgICAgICAgIC8vIFNoaWZ0IGRpZ2l0cyB0byB0aGUgYmVnaW5uaW5nCisgICAgICAgIF9fbTEyOGkgcmVzdWx0ID0gU2hpZnREaWdpdHNfU1NFMih2YSwgZGlnaXQpOworICAgICAgICBfbW1fc3RvcmV1X3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8X19tMTI4aSo+KGJ1ZmZlciksIHJlc3VsdCk7CisvLyAgICAgICAgYnVmZmVyWzE2IC0gZGlnaXRdID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuICZidWZmZXJbMTYgLSBkaWdpdF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjb25zdCB1aW50MzJfdCBhID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlIC8gMTAwMDAwMDAwMDAwMDAwMDApOyAvLyAxIHRvIDE4NDQKKyAgICAgICAgdmFsdWUgJT0gMTAwMDAwMDAwMDAwMDAwMDA7CisKKyAgICAgICAgaWYgKGEgPCAxMCkKKyAgICAgICAgICAgICpidWZmZXIrKyA9ICcwJyArIHN0YXRpY19jYXN0PGNoYXI+KGEpOworICAgICAgICBlbHNlIGlmIChhIDwgMTAwKSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBpID0gYSA8PCAxOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtpXTsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbaSArIDFdOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGEgPCAxMDAwKSB7CisgICAgICAgICAgICAqYnVmZmVyKysgPSAnMCcgKyBzdGF0aWNfY2FzdDxjaGFyPihhIC8gMTAwKTsKKworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaSA9IChhICUgMTAwKSA8PCAxOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtpXTsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbaSArIDFdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaSA9IChhIC8gMTAwKSA8PCAxOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaiA9IChhICUgMTAwKSA8PCAxOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtpXTsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbaSArIDFdOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtqXTsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbaiArIDFdOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDMyX3QgdjAgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUgLyAxMDAwMDAwMDApOworICAgICAgICBjb25zdCB1aW50MzJfdCB2MSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZSAlIDEwMDAwMDAwMCk7CisKKyAgICAgICAgY29uc3QgX19tMTI4aSBhMCA9IENvbnZlcnQ4RGlnaXRzU1NFMih2MCk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBDb252ZXJ0OERpZ2l0c1NTRTIodjEpOworCisgICAgICAgIC8vIENvbnZlcnQgdG8gYnl0ZXMsIGFkZCAnMCcKKyAgICAgICAgY29uc3QgX19tMTI4aSB2YSA9IF9tbV9hZGRfZXBpOChfbW1fcGFja3VzX2VwaTE2KGEwLCBhMSksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSo+KGtBc2NpaVplcm8pWzBdKTsKKyAgICAgICAgX21tX3N0b3JldV9zaTEyOChyZWludGVycHJldF9jYXN0PF9fbTEyOGkqPihidWZmZXIpLCB2YSk7CisvLyAgICAgICAgYnVmZmVyWzE2XSA9ICdcMCc7CisgICAgICAgIHJldHVybiAmYnVmZmVyWzE2XTsKKyAgICB9Cit9CisKKyNlbHNlIC8vIEdlbmVyaWMgTm9uLXg4NiBjYXNlCisKKy8vIE9yaWduYWwgbmFtZTogdTMydG9hX2JyYW5jaGx1dAorY2hhciAqVG9TdHJpbmcodWludDMyX3QgdmFsdWUsIGNoYXIqIGJ1ZmZlcikgeworICAgIGlmICh2YWx1ZSA8IDEwMDAwKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQxID0gKHZhbHVlIC8gMTAwKSA8PCAxOworICAgICAgICBjb25zdCB1aW50MzJfdCBkMiA9ICh2YWx1ZSAlIDEwMCkgPDwgMTsKKworICAgICAgICBpZiAodmFsdWUgPj0gMTAwMCkKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDFdOworICAgICAgICBpZiAodmFsdWUgPj0gMTAwKQorICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMSArIDFdOworICAgICAgICBpZiAodmFsdWUgPj0gMTApCisgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QyXTsKKyAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMiArIDFdOworICAgIH0KKyAgICBlbHNlIGlmICh2YWx1ZSA8IDEwMDAwMDAwMCkgeworICAgICAgICAvLyB2YWx1ZSA9IGJiYmJjY2NjCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGIgPSB2YWx1ZSAvIDEwMDAwOworICAgICAgICBjb25zdCB1aW50MzJfdCBjID0gdmFsdWUgJSAxMDAwMDsKKworICAgICAgICBjb25zdCB1aW50MzJfdCBkMSA9IChiIC8gMTAwKSA8PCAxOworICAgICAgICBjb25zdCB1aW50MzJfdCBkMiA9IChiICUgMTAwKSA8PCAxOworCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQzID0gKGMgLyAxMDApIDw8IDE7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQ0ID0gKGMgJSAxMDApIDw8IDE7CisKKyAgICAgICAgaWYgKHZhbHVlID49IDEwMDAwMDAwKQorICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMV07CisgICAgICAgIGlmICh2YWx1ZSA+PSAxMDAwMDAwKQorICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMSArIDFdOworICAgICAgICBpZiAodmFsdWUgPj0gMTAwMDAwKQorICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMl07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDIgKyAxXTsKKworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QzXTsKKyAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMyArIDFdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q0XTsKKyAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkNCArIDFdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gdmFsdWUgPSBhYWJiYmJjY2NjIGluIGRlY2ltYWwKKworICAgICAgICBjb25zdCB1aW50MzJfdCBhID0gdmFsdWUgLyAxMDAwMDAwMDA7IC8vIDEgdG8gNDIKKyAgICAgICAgdmFsdWUgJT0gMTAwMDAwMDAwOworCisgICAgICAgIGlmIChhID49IDEwKSB7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpID0gYSA8PCAxOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtpXTsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbaSArIDFdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpidWZmZXIrKyA9ICcwJyArIHN0YXRpY19jYXN0PGNoYXI+KGEpOworCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGIgPSB2YWx1ZSAvIDEwMDAwOyAvLyAwIHRvIDk5OTkKKyAgICAgICAgY29uc3QgdWludDMyX3QgYyA9IHZhbHVlICUgMTAwMDA7IC8vIDAgdG8gOTk5OQorCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQxID0gKGIgLyAxMDApIDw8IDE7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQyID0gKGIgJSAxMDApIDw8IDE7CisKKyAgICAgICAgY29uc3QgdWludDMyX3QgZDMgPSAoYyAvIDEwMCkgPDwgMTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgZDQgPSAoYyAlIDEwMCkgPDwgMTsKKworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QxXTsKKyAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMSArIDFdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QyXTsKKyAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMiArIDFdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QzXTsKKyAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMyArIDFdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q0XTsKKyAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkNCArIDFdOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyOyAvLypidWZmZXIrKyA9ICdcMCc7Cit9CisKKy8vIE9yaWdpbmFsIG5hbWU6IHU2NHRvYV9icmFuY2hsdXQKK2NoYXIgKlRvU3RyaW5nKHVpbnQ2NF90IHZhbHVlLCBjaGFyKiBidWZmZXIpIHsKKyAgICBpZiAodmFsdWUgPCAxMDAwMDAwMDApIHsKKyAgICAgICAgdWludDMyX3QgdiA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZSk7CisgICAgICAgIGlmICh2IDwgMTAwMDApIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGQxID0gKHYgLyAxMDApIDw8IDE7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkMiA9ICh2ICUgMTAwKSA8PCAxOworCisgICAgICAgICAgICBpZiAodiA+PSAxMDAwKQorICAgICAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDFdOworICAgICAgICAgICAgaWYgKHYgPj0gMTAwKQorICAgICAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDEgKyAxXTsKKyAgICAgICAgICAgIGlmICh2ID49IDEwKQorICAgICAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDJdOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMiArIDFdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gdmFsdWUgPSBiYmJiY2NjYworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYiA9IHYgLyAxMDAwMDsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGMgPSB2ICUgMTAwMDA7CisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGQxID0gKGIgLyAxMDApIDw8IDE7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkMiA9IChiICUgMTAwKSA8PCAxOworCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkMyA9IChjIC8gMTAwKSA8PCAxOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZDQgPSAoYyAlIDEwMCkgPDwgMTsKKworICAgICAgICAgICAgaWYgKHZhbHVlID49IDEwMDAwMDAwKQorICAgICAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDFdOworICAgICAgICAgICAgaWYgKHZhbHVlID49IDEwMDAwMDApCisgICAgICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMSArIDFdOworICAgICAgICAgICAgaWYgKHZhbHVlID49IDEwMDAwMCkKKyAgICAgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QyXTsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDIgKyAxXTsKKworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkM107CisgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QzICsgMV07CisgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q0XTsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDQgKyAxXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh2YWx1ZSA8IDEwMDAwMDAwMDAwMDAwMDAwKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHYwID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlIC8gMTAwMDAwMDAwKTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgdjEgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUgJSAxMDAwMDAwMDApOworCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGIwID0gdjAgLyAxMDAwMDsKKyAgICAgICAgY29uc3QgdWludDMyX3QgYzAgPSB2MCAlIDEwMDAwOworCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQxID0gKGIwIC8gMTAwKSA8PCAxOworICAgICAgICBjb25zdCB1aW50MzJfdCBkMiA9IChiMCAlIDEwMCkgPDwgMTsKKworICAgICAgICBjb25zdCB1aW50MzJfdCBkMyA9IChjMCAvIDEwMCkgPDwgMTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgZDQgPSAoYzAgJSAxMDApIDw8IDE7CisKKyAgICAgICAgY29uc3QgdWludDMyX3QgYjEgPSB2MSAvIDEwMDAwOworICAgICAgICBjb25zdCB1aW50MzJfdCBjMSA9IHYxICUgMTAwMDA7CisKKyAgICAgICAgY29uc3QgdWludDMyX3QgZDUgPSAoYjEgLyAxMDApIDw8IDE7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQ2ID0gKGIxICUgMTAwKSA8PCAxOworCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQ3ID0gKGMxIC8gMTAwKSA8PCAxOworICAgICAgICBjb25zdCB1aW50MzJfdCBkOCA9IChjMSAlIDEwMCkgPDwgMTsKKworICAgICAgICBpZiAodmFsdWUgPj0gMTAwMDAwMDAwMDAwMDAwMCkKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDFdOworICAgICAgICBpZiAodmFsdWUgPj0gMTAwMDAwMDAwMDAwMDAwKQorICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMSArIDFdOworICAgICAgICBpZiAodmFsdWUgPj0gMTAwMDAwMDAwMDAwMDApCisgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QyXTsKKyAgICAgICAgaWYgKHZhbHVlID49IDEwMDAwMDAwMDAwMDApCisgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QyICsgMV07CisgICAgICAgIGlmICh2YWx1ZSA+PSAxMDAwMDAwMDAwMDApCisgICAgICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QzXTsKKyAgICAgICAgaWYgKHZhbHVlID49IDEwMDAwMDAwMDAwKQorICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkMyArIDFdOworICAgICAgICBpZiAodmFsdWUgPj0gMTAwMDAwMDAwMCkKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDRdOworICAgICAgICBpZiAodmFsdWUgPj0gMTAwMDAwMDAwKQorICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtkNCArIDFdOworCisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDVdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q1ICsgMV07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDZdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q2ICsgMV07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDddOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q3ICsgMV07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDhdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q4ICsgMV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjb25zdCB1aW50MzJfdCBhID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlIC8gMTAwMDAwMDAwMDAwMDAwMDApOyAvLyAxIHRvIDE4NDQKKyAgICAgICAgdmFsdWUgJT0gMTAwMDAwMDAwMDAwMDAwMDA7CisKKyAgICAgICAgaWYgKGEgPCAxMCkKKyAgICAgICAgICAgICpidWZmZXIrKyA9ICcwJyArIHN0YXRpY19jYXN0PGNoYXI+KGEpOworICAgICAgICBlbHNlIGlmIChhIDwgMTAwKSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBpID0gYSA8PCAxOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtpXTsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbaSArIDFdOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGEgPCAxMDAwKSB7CisgICAgICAgICAgICAqYnVmZmVyKysgPSAnMCcgKyBzdGF0aWNfY2FzdDxjaGFyPihhIC8gMTAwKTsKKworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaSA9IChhICUgMTAwKSA8PCAxOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtpXTsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbaSArIDFdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaSA9IChhIC8gMTAwKSA8PCAxOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaiA9IChhICUgMTAwKSA8PCAxOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtpXTsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbaSArIDFdOworICAgICAgICAgICAgKmJ1ZmZlcisrID0gZ0RpZ2l0c0x1dFtqXTsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbaiArIDFdOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDMyX3QgdjAgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUgLyAxMDAwMDAwMDApOworICAgICAgICBjb25zdCB1aW50MzJfdCB2MSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZSAlIDEwMDAwMDAwMCk7CisKKyAgICAgICAgY29uc3QgdWludDMyX3QgYjAgPSB2MCAvIDEwMDAwOworICAgICAgICBjb25zdCB1aW50MzJfdCBjMCA9IHYwICUgMTAwMDA7CisKKyAgICAgICAgY29uc3QgdWludDMyX3QgZDEgPSAoYjAgLyAxMDApIDw8IDE7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQyID0gKGIwICUgMTAwKSA8PCAxOworCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQzID0gKGMwIC8gMTAwKSA8PCAxOworICAgICAgICBjb25zdCB1aW50MzJfdCBkNCA9IChjMCAlIDEwMCkgPDwgMTsKKworICAgICAgICBjb25zdCB1aW50MzJfdCBiMSA9IHYxIC8gMTAwMDA7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGMxID0gdjEgJSAxMDAwMDsKKworICAgICAgICBjb25zdCB1aW50MzJfdCBkNSA9IChiMSAvIDEwMCkgPDwgMTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgZDYgPSAoYjEgJSAxMDApIDw8IDE7CisKKyAgICAgICAgY29uc3QgdWludDMyX3QgZDcgPSAoYzEgLyAxMDApIDw8IDE7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQ4ID0gKGMxICUgMTAwKSA8PCAxOworCisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDFdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QxICsgMV07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDJdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QyICsgMV07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDNdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2QzICsgMV07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDRdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q0ICsgMV07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDVdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q1ICsgMV07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDZdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q2ICsgMV07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDddOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q3ICsgMV07CisgICAgICAgICpidWZmZXIrKyA9IGdEaWdpdHNMdXRbZDhdOworICAgICAgICAqYnVmZmVyKysgPSBnRGlnaXRzTHV0W2Q4ICsgMV07CisgICAgfQorICAgIHJldHVybiBidWZmZXI7Cit9CisKKyNlbmRpZiAvLyBFbmQgb2YgYXJjaGl0ZWN0dXJlIGlmIHN0YXRlbWVudC4KKworLy8gU2lnbmVkIHdyYXBwZXJzLiAgVGhlIG5lZ2F0aW9uIGlzIGRvbmUgb24gdGhlIHVuc2lnbmVkIHZlcnNpb24gYmVjYXVzZQorLy8gZG9pbmcgc28gaGFzIGRlZmluZWQgYmVoYXZpb3IgZm9yIElOVF9NSU4uCitjaGFyICpUb1N0cmluZyhpbnQzMl90IHZhbHVlLCBjaGFyICp0bykgeworICB1aW50MzJfdCB1biA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZSk7CisgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAqdG8rKyA9ICctJzsKKyAgICB1biA9IC11bjsKKyAgfQorICByZXR1cm4gVG9TdHJpbmcodW4sIHRvKTsKK30KKworY2hhciAqVG9TdHJpbmcoaW50NjRfdCB2YWx1ZSwgY2hhciAqdG8pIHsKKyAgdWludDY0X3QgdW4gPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4odmFsdWUpOworICBpZiAodmFsdWUgPCAwKSB7CisgICAgKnRvKysgPSAnLSc7CisgICAgdW4gPSAtdW47CisgIH0KKyAgcmV0dXJuIFRvU3RyaW5nKHVuLCB0byk7Cit9CisKKy8vIE5vIG9wdGltaXphdGlvbiBmb3IgdGhpcyBjYXNlIHlldC4KK2NoYXIgKlRvU3RyaW5nKGludDE2X3QgdmFsdWUsIGNoYXIgKnRvKSB7CisgIHJldHVybiBUb1N0cmluZygoaW50MzJfdCl2YWx1ZSwgdG8pOworfQorY2hhciAqVG9TdHJpbmcodWludDE2X3QgdmFsdWUsIGNoYXIgKnRvKSB7CisgIHJldHVybiBUb1N0cmluZygodWludDMyX3QpdmFsdWUsIHRvKTsKK30KKworLy8gdm9pZCAqIHRvIHN0cmluZy4gIFRoaXMgaGFzbid0IGJlZW4gb3B0aW1pemVkIGF0IGFsbCByZWFsbHkuCituYW1lc3BhY2UgeworY29uc3QgY2hhciBrSGV4RGlnaXRzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7Cit9IC8vIG5hbWVzcGFjZQorCitjaGFyICpUb1N0cmluZyhjb25zdCB2b2lkICp2LCBjaGFyICp0bykgeworICAqdG8rKyA9ICcwJzsKKyAgKnRvKysgPSAneCc7CisKKyAgLy8gRnVuIGZhY3Q6IGdjYy9jbGFuZyBib29zdDo6bGV4aWNhbF9jYXN0IG9uIExpbnV4IGRvIGp1c3QgIjAiIHdoaWxlIGNsYW5nIG9uIE9TIFggZG9lcyAiMHgwIgorICAvLyBJIGhhcHBlbiB0byBwcmVmZXIgMHgwLgorICBpZiAoIXYpIHsKKyAgICAqdG8rKyA9ICcwJzsKKyAgICByZXR1cm4gdG87CisgIH0KKworICB1aW50cHRyX3QgdmFsdWUgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4odik7CisgIHVpbnQ4X3Qgc2hpZnQgPSBzaXplb2Yodm9pZCopICogOCAtIDQ7CisgIGZvciAoOyAhKHZhbHVlID4+IHNoaWZ0KTsgc2hpZnQgLT0gNCkge30KKyAgZm9yICg7IDsgc2hpZnQgLT0gNCkgeworICAgICp0bysrID0ga0hleERpZ2l0c1sodmFsdWUgPj4gc2hpZnQpICYgMHhmXTsKKyAgICBpZiAoIXNoaWZ0KSBicmVhazsKKyAgfQorICByZXR1cm4gdG87Cit9CisKK30gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL2ludGVnZXJfdG9fc3RyaW5nLmhoIGIvc3JjL2tlbmxtL3V0aWwvaW50ZWdlcl90b19zdHJpbmcuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjMjViZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL2ludGVnZXJfdG9fc3RyaW5nLmhoCkBAIC0wLDAgKzEsNjYgQEAKKyNpZm5kZWYgVVRJTF9JTlRFR0VSX1RPX1NUUklOR19ICisjZGVmaW5lIFVUSUxfSU5URUdFUl9UT19TVFJJTkdfSAorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB1dGlsIHsKKworLyogVGhlc2UgZnVuY3Rpb25zIGNvbnZlcnQgaW50ZWdlcnMgdG8gc3RyaW5ncyBhbmQgcmV0dXJuIHRoZSBlbmQgcG9pbnRlci4KKyAqLworY2hhciAqVG9TdHJpbmcodWludDMyX3QgdmFsdWUsIGNoYXIgKnRvKTsKK2NoYXIgKlRvU3RyaW5nKHVpbnQ2NF90IHZhbHVlLCBjaGFyICp0byk7CisKKy8vIEltcGxlbWVudGVkIGFzIHdyYXBwZXJzIHRvIGFib3ZlCitjaGFyICpUb1N0cmluZyhpbnQzMl90IHZhbHVlLCBjaGFyICp0byk7CitjaGFyICpUb1N0cmluZyhpbnQ2NF90IHZhbHVlLCBjaGFyICp0byk7CisKKy8vIENhbGxzIHRoZSAzMi1iaXQgdmVyc2lvbnMgZm9yIG5vdy4KK2NoYXIgKlRvU3RyaW5nKHVpbnQxNl90IHZhbHVlLCBjaGFyICp0byk7CitjaGFyICpUb1N0cmluZyhpbnQxNl90IHZhbHVlLCBjaGFyICp0byk7CisKK2NoYXIgKlRvU3RyaW5nKGNvbnN0IHZvaWQgKnZhbHVlLCBjaGFyICp0byk7CisKK2lubGluZSBjaGFyICpUb1N0cmluZyhib29sIHZhbHVlLCBjaGFyICp0bykgeworICAqdG8rKyA9ICcwJyArIHZhbHVlOworICByZXR1cm4gdG87Cit9CisKKy8vIEhvdyBtYW55IGJ5dGVzIHRvIHJlc2VydmUgaW4gdGhlIGJ1ZmZlciBmb3IgdGhlc2Ugc3RyaW5nczoKKy8vIGcrKyA0LjkuMSBkb2Vzbid0IHdvcmsgd2l0aCB0aGlzOgorLy8gc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IGtCeXRlcyA9IDU7CisvLyBTbyB1c2UgZW51bS4KK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgVG9TdHJpbmdCdWY7Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVG9TdHJpbmdCdWY8Ym9vbD4geworICBlbnVtIHsga0J5dGVzID0gMSB9OworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBUb1N0cmluZ0J1Zjx1aW50MTZfdD4geworICBlbnVtIHsga0J5dGVzID0gNSB9OworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBUb1N0cmluZ0J1ZjxpbnQxNl90PiB7CisgIGVudW0geyBrQnl0ZXMgPSA2IH07Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFRvU3RyaW5nQnVmPHVpbnQzMl90PiB7CisgIGVudW0geyBrQnl0ZXMgPSAxMCB9OworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBUb1N0cmluZ0J1ZjxpbnQzMl90PiB7CisgIGVudW0geyBrQnl0ZXMgPSAxMSB9OworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBUb1N0cmluZ0J1Zjx1aW50NjRfdD4geworICBlbnVtIHsga0J5dGVzID0gMjAgfTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVG9TdHJpbmdCdWY8aW50NjRfdD4geworICAvLyBOb3QgYSB0eXBvLiAgMl42MyBoYXMgMTkgZGlnaXRzLgorICBlbnVtIHsga0J5dGVzID0gMjAgfTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBUb1N0cmluZ0J1Zjxjb25zdCB2b2lkKj4geworICAvLyBFaXRoZXIgMTggb24gNjQtYml0IG9yIDEwIG9uIDMyLWJpdC4KKyAgZW51bSB7IGtCeXRlcyA9IHNpemVvZihjb25zdCB2b2lkKikgKiAyICsgMiB9OworfTsKKworLy8gTWF4aW11bSBvdmVyIHRoaXMgYW5kIGZsb2F0LgorZW51bSB7IGtUb1N0cmluZ01heEJ5dGVzID0gMjAgfTsKKworfSAvLyBuYW1lc3BhY2UgdXRpbAorCisjZW5kaWYgLy8gVVRJTF9JTlRFR0VSX1RPX1NUUklOR19ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9pbnRlZ2VyX3RvX3N0cmluZ190ZXN0LmNjIGIvc3JjL2tlbmxtL3V0aWwvaW50ZWdlcl90b19zdHJpbmdfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzZjODhmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvaW50ZWdlcl90b19zdHJpbmdfdGVzdC5jYwpAQCAtMCwwICsxLDgxIEBACisjZGVmaW5lIEJPT1NUX0xFWElDQUxfQ0FTVF9BU1NVTUVfQ19MT0NBTEUKKyNpbmNsdWRlICJ1dGlsL2ludGVnZXJfdG9fc3RyaW5nLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyaW5nX3BpZWNlLmhoIgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEludGVnZXJUb1N0cmluZ1Rlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KKworI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgVGVzdFZhbHVlKGNvbnN0IFQgdmFsdWUpIHsKKyAgY2hhciBidWZbVG9TdHJpbmdCdWY8VD46OmtCeXRlc107CisgIFN0cmluZ1BpZWNlIHJlc3VsdChidWYsIFRvU3RyaW5nKHZhbHVlLCBidWYpIC0gYnVmKTsKKyAgQk9PU1RfUkVRVUlSRV9HRShzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oVG9TdHJpbmdCdWY8VD46OmtCeXRlcyksIHJlc3VsdC5zaXplKCkpOworICBpZiAodmFsdWUpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPih2YWx1ZSksIHJlc3VsdCk7CisgIH0gZWxzZSB7CisgICAgLy8gUGxhdGZvcm1zIGNhbiBkbyB2b2lkICogYXMgMHgwIG9yIDAuCisgICAgQk9PU1RfQ0hFQ0socmVzdWx0ID09ICIweDAiIHx8IHJlc3VsdCA9PSAiMCIpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIFRlc3RDb3JuZXJzKCkgeworICBUZXN0VmFsdWUoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKCkpOworICBUZXN0VmFsdWUoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkpOworICBUZXN0VmFsdWUoKFQpMCk7CisgIFRlc3RWYWx1ZSgoVCktMSk7CisgIFRlc3RWYWx1ZSgoVCkxKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ29ybmVycykgeworICBUZXN0Q29ybmVyczx1aW50MTZfdD4oKTsKKyAgVGVzdENvcm5lcnM8dWludDMyX3Q+KCk7CisgIFRlc3RDb3JuZXJzPHVpbnQ2NF90PigpOworICBUZXN0Q29ybmVyczxpbnQxNl90PigpOworICBUZXN0Q29ybmVyczxpbnQzMl90PigpOworICBUZXN0Q29ybmVyczxpbnQ2NF90PigpOworICBUZXN0Q29ybmVyczxjb25zdCB2b2lkKj4oKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgVGVzdEFsbCgpIHsKKyAgZm9yIChUIGkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptaW4oKTsgaSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOyArK2kpIHsKKyAgICBUZXN0VmFsdWUoaSk7CisgIH0KKyAgVGVzdFZhbHVlKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2hvcnQpIHsKKyAgVGVzdEFsbDx1aW50MTZfdD4oKTsKKyAgVGVzdEFsbDxpbnQxNl90PigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBUZXN0MTBzKCkgeworICBmb3IgKFQgaSA9IDE7IGkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSAvIDEwOyBpICo9IDEwKSB7CisgICAgVGVzdFZhbHVlKGkpOworICAgIFRlc3RWYWx1ZShpIC0gMSk7CisgICAgVGVzdFZhbHVlKGkgKyAxKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUZW5zKSB7CisgIFRlc3QxMHM8dWludDY0X3Q+KCk7CisgIFRlc3QxMHM8aW50NjRfdD4oKTsKKyAgVGVzdDEwczx1aW50MzJfdD4oKTsKKyAgVGVzdDEwczxpbnQzMl90PigpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShQb2ludGVycykgeworICBmb3IgKHVpbnRwdHJfdCBpID0gMTsgaSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludHB0cl90Pjo6bWF4KCkgLyAxMDsgaSAqPSAxMCkgeworICAgIFRlc3RWYWx1ZSgoY29uc3Qgdm9pZCopaSk7CisgIH0KKyAgZm9yICh1aW50cHRyX3QgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgIFRlc3RWYWx1ZSgoY29uc3Qgdm9pZCopaSk7CisgICAgVGVzdFZhbHVlKChjb25zdCB2b2lkKikoaSArIDB4ZjAwKSk7CisgIH0KK30KKworfX0gLy8gbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvam9pbnRfc29ydC5oaCBiL3NyYy9rZW5sbS91dGlsL2pvaW50X3NvcnQuaGgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2pvaW50X3NvcnQuaGgKcmVuYW1lIHRvIHNyYy9rZW5sbS91dGlsL2pvaW50X3NvcnQuaGgKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL2pvaW50X3NvcnRfdGVzdC5jYyBiL3NyYy9rZW5sbS91dGlsL2pvaW50X3NvcnRfdGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvam9pbnRfc29ydF90ZXN0LmNjCnJlbmFtZSB0byBzcmMva2VubG0vdXRpbC9qb2ludF9zb3J0X3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL21tYXAuY2MgYi9zcmMva2VubG0vdXRpbC9tbWFwLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OWYzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9tbWFwLmNjCkBAIC0wLDAgKzEsNDAyIEBACisvKiBNZW1vcnkgbWFwcGluZyB3cmFwcGVycy4KKyAqIEFSTSBhbmQgTWluR1cgcG9ydHMgY29udHJpYnV0ZWQgYnkgSGlkZW8gT2t1bWEgYW5kIFRvbW95dWtpIFlvc2hpbXVyYSBhdAorICogTklDVC4KKyAqLworI2luY2x1ZGUgInV0aWwvbW1hcC5oaCIKKworI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKKyNpbmNsdWRlICJ1dGlsL3BhcmFsbGVsX3JlYWQuaGgiCisjaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGNzdGRsaWI+CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPGlvLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIHV0aWwgeworCitzdGQ6OnNpemVfdCBTaXplUGFnZSgpIHsKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisgIFNZU1RFTV9JTkZPIHNpOworICBHZXRTeXN0ZW1JbmZvKCZzaSk7CisgIHJldHVybiBzaS5kd0FsbG9jYXRpb25HcmFudWxhcml0eTsKKyNlbHNlCisgIHJldHVybiBzeXNjb25mKF9TQ19QQUdFX1NJWkUpOworI2VuZGlmCit9CisKK3Njb3BlZF9tbWFwOjp+c2NvcGVkX21tYXAoKSB7CisgIGlmIChkYXRhXyAhPSAodm9pZCopLTEpIHsKKyAgICB0cnkgeworICAgICAgLy8gVGhhbmtzIERlbmlzIEZpbGltb25vdiBmb3IgcG9pbnRpbmcgb3V0IE5GUyBsaWtlcyBtc3luYyBmaXJzdC4KKyAgICAgIFN5bmNPclRocm93KGRhdGFfLCBzaXplXyk7CisgICAgICBVbm1hcE9yVGhyb3coZGF0YV8sIHNpemVfKTsKKyAgICB9IGNhdGNoIChjb25zdCB1dGlsOjpFcnJub0V4Y2VwdGlvbiAmZSkgeworICAgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpOworICAgICAgYWJvcnQoKTsKKyAgICB9CisgIH0KK30KKworbmFtZXNwYWNlIHsKK3RlbXBsYXRlIDxjbGFzcyBUPiBUIFJvdW5kVXBQb3cyKFQgdmFsdWUsIFQgbXVsdCkgeworICByZXR1cm4gKCh2YWx1ZSAtIDEpICYgfihtdWx0IC0gMSkpICsgbXVsdDsKK30KK30gLy8gbmFtZXNwYWNlCisKK3Njb3BlZF9tZW1vcnk6OnNjb3BlZF9tZW1vcnkoc3RkOjpzaXplX3Qgc2l6ZSwgYm9vbCB6ZXJvZWQpIDogZGF0YV8oTlVMTCksIHNpemVfKDApLCBzb3VyY2VfKE5PTkVfQUxMT0NBVEVEKSB7CisgIEh1Z2VNYWxsb2Moc2l6ZSwgemVyb2VkLCAqdGhpcyk7Cit9CisKK3ZvaWQgc2NvcGVkX21lbW9yeTo6cmVzZXQodm9pZCAqZGF0YSwgc3RkOjpzaXplX3Qgc2l6ZSwgQWxsb2Mgc291cmNlKSB7CisgIHN3aXRjaChzb3VyY2VfKSB7CisgICAgY2FzZSBNTUFQX1JPVU5EX1VQX0FMTE9DQVRFRDoKKyAgICAgIHNjb3BlZF9tbWFwKGRhdGFfLCBSb3VuZFVwUG93MihzaXplXywgKHN0ZDo6c2l6ZV90KVNpemVQYWdlKCkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU1BUF9BTExPQ0FURUQ6CisgICAgICBzY29wZWRfbW1hcChkYXRhXywgc2l6ZV8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNQUxMT0NfQUxMT0NBVEVEOgorICAgICAgZnJlZShkYXRhXyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5PTkVfQUxMT0NBVEVEOgorICAgICAgYnJlYWs7CisgIH0KKyAgZGF0YV8gPSBkYXRhOworICBzaXplXyA9IHNpemU7CisgIHNvdXJjZV8gPSBzb3VyY2U7Cit9CisKKy8qdm9pZCBzY29wZWRfbWVtb3J5OjpjYWxsX3JlYWxsb2Moc3RkOjpzaXplX3Qgc2l6ZSkgeworICBhc3NlcnQoc291cmNlXyA9PSBNQUxMT0NfQUxMT0NBVEVEIHx8IHNvdXJjZV8gPT0gTk9ORV9BTExPQ0FURUQpOworICB2b2lkICpuZXdfZGF0YSA9IHJlYWxsb2MoZGF0YV8sIHNpemUpOworICBpZiAoIW5ld19kYXRhKSB7CisgICAgcmVzZXQoKTsKKyAgfSBlbHNlIHsKKyAgICBkYXRhXyA9IG5ld19kYXRhOworICAgIHNpemVfID0gc2l6ZTsKKyAgICBzb3VyY2VfID0gTUFMTE9DX0FMTE9DQVRFRDsKKyAgfQorfSovCisKK2NvbnN0IGludCBrRmlsZUZsYWdzID0KKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisgIDAgLy8gTWFwT3JUaHJvdyBpZ25vcmVzIGZsYWdzIG9uIHdpbmRvd3MKKyNlbGlmIGRlZmluZWQoTUFQX0ZJTEUpCisgIE1BUF9GSUxFIHwgTUFQX1NIQVJFRAorI2Vsc2UKKyAgTUFQX1NIQVJFRAorI2VuZGlmCisgIDsKKwordm9pZCAqTWFwT3JUaHJvdyhzdGQ6OnNpemVfdCBzaXplLCBib29sIGZvcl93cml0ZSwgaW50IGZsYWdzLCBib29sIHByZWZhdWx0LCBpbnQgZmQsIHVpbnQ2NF90IG9mZnNldCkgeworI2lmZGVmIE1BUF9QT1BVTEFURSAvLyBMaW51eCBzcGVjaWZpYworICBpZiAocHJlZmF1bHQpIHsKKyAgICBmbGFncyB8PSBNQVBfUE9QVUxBVEU7CisgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyAgaW50IHByb3RlY3RDID0gZm9yX3dyaXRlID8gUEFHRV9SRUFEV1JJVEUgOiBQQUdFX1JFQURPTkxZOworICBpbnQgcHJvdGVjdE0gPSBmb3Jfd3JpdGUgPyBGSUxFX01BUF9XUklURSA6IEZJTEVfTUFQX1JFQUQ7CisgIHVpbnQ2NF90IHRvdGFsX3NpemUgPSBzaXplICsgb2Zmc2V0OworICBIQU5ETEUgaE1hcHBpbmcgPSBDcmVhdGVGaWxlTWFwcGluZygoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZkKSwgTlVMTCwgcHJvdGVjdEMsIHRvdGFsX3NpemUgPj4gMzIsIHN0YXRpY19jYXN0PERXT1JEPih0b3RhbF9zaXplKSwgTlVMTCk7CisgIFVUSUxfVEhST1dfSUYoIWhNYXBwaW5nLCBFcnJub0V4Y2VwdGlvbiwgIkNyZWF0ZUZpbGVNYXBwaW5nIGZhaWxlZCIpOworICBMUFZPSUQgcmV0ID0gTWFwVmlld09mRmlsZShoTWFwcGluZywgcHJvdGVjdE0sIG9mZnNldCA+PiAzMiwgb2Zmc2V0LCBzaXplKTsKKyAgQ2xvc2VIYW5kbGUoaE1hcHBpbmcpOworICBVVElMX1RIUk9XX0lGKCFyZXQsIEVycm5vRXhjZXB0aW9uLCAiTWFwVmlld09mRmlsZSBmYWlsZWQiKTsKKyNlbHNlCisgIGludCBwcm90ZWN0ID0gZm9yX3dyaXRlID8gKFBST1RfUkVBRCB8IFBST1RfV1JJVEUpIDogUFJPVF9SRUFEOworICB2b2lkICpyZXQ7CisgIFVUSUxfVEhST1dfSUYoKHJldCA9IG1tYXAoTlVMTCwgc2l6ZSwgcHJvdGVjdCwgZmxhZ3MsIGZkLCBvZmZzZXQpKSA9PSBNQVBfRkFJTEVELCBFcnJub0V4Y2VwdGlvbiwgIm1tYXAgZmFpbGVkIGZvciBzaXplICIgPDwgc2l6ZSA8PCAiIGF0IG9mZnNldCAiIDw8IG9mZnNldCk7CisjICBpZmRlZiBNQURWX0hVR0VQQUdFCisgIC8qIFdlIGxpa2UgaHVnZSBwYWdlcyBidXQgaXQncyBmaW5lIGlmIHdlIGNhbid0IGhhdmUgdGhlbS4gIE5vdGUgdGhhdCBodWdlCisgICAqIHBhZ2VzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBmaWxlLWJhY2tlZCBtbWFwIG9uIGxpbnV4LgorICAgKi8KKyAgbWFkdmlzZShyZXQsIHNpemUsIE1BRFZfSFVHRVBBR0UpOworIyAgZW5kaWYKKyNlbmRpZgorICByZXR1cm4gcmV0OworfQorCit2b2lkIFN5bmNPclRocm93KHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoKSB7CisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQorICBVVElMX1RIUk9XX0lGKCE6OkZsdXNoVmlld09mRmlsZShzdGFydCwgbGVuZ3RoKSwgRXJybm9FeGNlcHRpb24sICJGYWlsZWQgdG8gc3luYyBtbWFwIik7CisjZWxzZQorICBVVElMX1RIUk9XX0lGKGxlbmd0aCAmJiBtc3luYyhzdGFydCwgbGVuZ3RoLCBNU19TWU5DKSwgRXJybm9FeGNlcHRpb24sICJGYWlsZWQgdG8gc3luYyBtbWFwIik7CisjZW5kaWYKK30KKwordm9pZCBVbm1hcE9yVGhyb3codm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgpIHsKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisgIFVUSUxfVEhST1dfSUYoITo6VW5tYXBWaWV3T2ZGaWxlKHN0YXJ0KSwgRXJybm9FeGNlcHRpb24sICJGYWlsZWQgdG8gdW5tYXAgYSBmaWxlIik7CisjZWxzZQorICBVVElMX1RIUk9XX0lGKG11bm1hcChzdGFydCwgbGVuZ3RoKSwgRXJybm9FeGNlcHRpb24sICJtdW5tYXAgZmFpbGVkIik7CisjZW5kaWYKK30KKworLy8gTGludXggaHVnZSBwYWdlcy4KKyNpZmRlZiBfX2xpbnV4X18KKworbmFtZXNwYWNlIHsKKworYm9vbCBBbm9ueW1vdXNNYXAoc3RkOjpzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBib29sIHBvcHVsYXRlLCB1dGlsOjpzY29wZWRfbWVtb3J5ICZ0bykgeworICBpZiAocG9wdWxhdGUpIGZsYWdzIHw9IE1BUF9QT1BVTEFURTsKKyAgdm9pZCAqcmV0ID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMgfCBmbGFncywgLTEsIDApOworICBpZiAocmV0ID09IE1BUF9GQUlMRUQpIHJldHVybiBmYWxzZTsKKyAgdG8ucmVzZXQocmV0LCBzaXplLCBzY29wZWRfbWVtb3J5OjpNTUFQX0FMTE9DQVRFRCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFRyeUh1Z2Uoc3RkOjpzaXplX3Qgc2l6ZSwgdWludDhfdCBhbGlnbm1lbnRfYml0cywgYm9vbCBwb3B1bGF0ZSwgdXRpbDo6c2NvcGVkX21lbW9yeSAmdG8pIHsKKyAgLy8gRG9uJ3QgYm90aGVyIHdpdGggdGhlc2UgY2FzZXMuCisgIGlmIChzaXplIDwgKDFVTEwgPDwgYWxpZ25tZW50X2JpdHMpIHx8ICgxVUxMIDw8IGFsaWdubWVudF9iaXRzKSA8IFNpemVQYWdlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEZpcnN0IHRyeTogTGludXggPj0gMy44IHdpdGggbWFudWFsbHkgY29uZmlndXJlZCBodWdldGxiIHBhZ2VzIGF2YWlsYWJsZS4KKyNpZmRlZiBNQVBfSFVHRV9TSElGVAorICBpZiAoQW5vbnltb3VzTWFwKHNpemUsIE1BUF9IVUdFVExCIHwgKGFsaWdubWVudF9iaXRzIDw8IE1BUF9IVUdFX1NISUZUKSwgcG9wdWxhdGUsIHRvKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorCisgIC8vIFNlY29uZCB0cnk6IG1hbnVhbGx5IGNvbmZpZ3VyZWQgaHVnZXRsYiBwYWdlcyBleGlzdCwgYnV0IGtlcm5lbCB0b28gb2xkIHRvCisgIC8vIHBpY2sgc2l6ZSBvciBub3QgYXZhaWxhYmxlLiAgVGhpcyBtaWdodCBwaWNrIHRoZSB3cm9uZyBzaXplIGh1Z2UgcGFnZXMsCisgIC8vIGJ1dCB0aGUgc3lzYWRtaW4gbXVzdCBoYXZlIG1hZGUgdGhlbSBhdmFpbGFibGUgaW4gdGhlIGZpcnN0IHBsYWNlLgorICBpZiAoQW5vbnltb3VzTWFwKHNpemUsIE1BUF9IVUdFVExCLCBwb3B1bGF0ZSwgdG8pKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFRoaXJkIHRyeTogYWxpZ24gdG8gYSBtdWx0aXBsZSBvZiB0aGUgaHVnZSBwYWdlIHNpemUgYnkgb3ZlcmFsbG9jYXRpbmcuCisgIC8vIEkgZmVlbCBiYWQgYWJvdXQgZG9pbmcgdGhpcywgYnV0IGl0J3MgYWxzbyBob3cgcG9zaXhfbWVtYWxpZ24gaXMKKyAgLy8gaW1wbGVtZW50ZWQuICBBbmQgdGhlIG1lbW9yeSBpcyB2aXJ0dWFsLgorCisgIC8vIFJvdW5kIHVwIHJlcXVlc3RlZCBzaXplIHRvIG11bHRpcGxlIG9mIHBhZ2Ugc2l6ZS4gIFRoaXMgd2lsbCBhbGxvdyB0aGUgcGFnZXMgYWZ0ZXIgdG8gYmUgbXVubWFwcGVkLgorICBzdGQ6OnNpemVfdCBzaXplX3VwID0gUm91bmRVcFBvdzIoc2l6ZSwgU2l6ZVBhZ2UoKSk7CisKKyAgc3RkOjpzaXplX3QgYXNrID0gc2l6ZV91cCArICgxIDw8IGFsaWdubWVudF9iaXRzKSAtIFNpemVQYWdlKCk7CisgIC8vIERvbid0IHBvcHVsYXRlIGJlY2F1c2UgdGhpcyBpcyBhc2tpbmcgZm9yIG1vcmUgdGhhbiB3ZSB3aWxsIHVzZS4KKyAgc2NvcGVkX21tYXAgbGFyZ2VyKG1tYXAoTlVMTCwgYXNrLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKSwgYXNrKTsKKyAgaWYgKGxhcmdlci5nZXQoKSA9PSBNQVBfRkFJTEVEKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gVGhyb3cgb3V0IHBhZ2VzIGJlZm9yZSB0aGUgYWxpZ25tZW50IHBvaW50LgorICB1aW50cHRyX3QgYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihsYXJnZXIuZ2V0KCkpOworICAvLyBSb3VuZCB1cCB0byBuZXh0IG11bHRpcGxlIG9mIGFsaWdubWVudC4KKyAgdWludHB0cl90IHJvdW5kZWRfdXAgPSBSb3VuZFVwUG93MihiYXNlLCBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KDEpIDw8IGFsaWdubWVudF9iaXRzKTsKKyAgaWYgKGJhc2UgIT0gcm91bmRlZF91cCkgeworICAgIC8vIElmIHRoaXMgdGhyb3dzIGFuIGV4Y2VwdGlvbiAod2hpY2ggaXQgc2hvdWxkbid0KSB0aGVuIHdlIHdhbnQgdG8gdW5tYXAgdGhlIHdob2xlIHRoaW5nIGJ5IGtlZXBpbmcgaXQgaW4gbGFyZ2VyLgorICAgIFVubWFwT3JUaHJvdyhsYXJnZXIuZ2V0KCksIHJvdW5kZWRfdXAgLSBiYXNlKTsKKyAgICBsYXJnZXIuc3RlYWwoKTsKKyAgICBsYXJnZXIucmVzZXQocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocm91bmRlZF91cCksIGFzayAtIChyb3VuZGVkX3VwIC0gYmFzZSkpOworICB9CisKKyAgLy8gVGhyb3cgb3V0IHBhZ2VzIGFmdGVyIHRoZSByZXF1ZXN0ZWQgc2l6ZS4KKyAgYXNzZXJ0KGxhcmdlci5zaXplKCkgPj0gc2l6ZV91cCk7CisgIGlmIChsYXJnZXIuc2l6ZSgpID4gc2l6ZV91cCkgeworICAgIC8vIFRoaXMgaXMgd2hlcmUgd2UgYXNzdW1lIHNpemVfdXAgaXMgYSBtdWx0aXBsZSBvZiBwYWdlIHNpemUuCisgICAgVW5tYXBPclRocm93KHN0YXRpY19jYXN0PHVpbnQ4X3QqPihsYXJnZXIuZ2V0KCkpICsgc2l6ZV91cCwgbGFyZ2VyLnNpemUoKSAtIHNpemVfdXApOworICAgIGxhcmdlci5yZXNldChsYXJnZXIuc3RlYWwoKSwgc2l6ZV91cCk7CisgIH0KKyNpZmRlZiBNQURWX0hVR0VQQUdFCisgIG1hZHZpc2UobGFyZ2VyLmdldCgpLCBzaXplX3VwLCBNQURWX0hVR0VQQUdFKTsKKyNlbmRpZgorICB0by5yZXNldChsYXJnZXIuc3RlYWwoKSwgc2l6ZSwgc2NvcGVkX21lbW9yeTo6TU1BUF9ST1VORF9VUF9BTExPQ0FURUQpOworICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCisKK3ZvaWQgSHVnZU1hbGxvYyhzdGQ6OnNpemVfdCBzaXplLCBib29sIHplcm9lZCwgc2NvcGVkX21lbW9yeSAmdG8pIHsKKyAgdG8ucmVzZXQoKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgLy8gVE9ETzogYXJjaGl0ZWN0dXJlcy9wYWdlIHNpemVzIG90aGVyIHRoYW4gMl4yMSBhbmQgMl4zMC4KKyAgLy8gQXR0ZW1wdCAxIEdCIHBhZ2VzLgorICAvLyBJZiB0aGUgdXNlciBhc2tlZCBmb3IgemVyb2VkIG1lbW9yeSwgYXNzdW1lIHRoZXkgd2FudCBpdCBwb3B1bGF0ZWQuCisgIGlmIChzaXplID49ICgxVUxMIDw8IDMwKSAmJiBUcnlIdWdlKHNpemUsIDMwLCB6ZXJvZWQsIHRvKSkKKyAgICByZXR1cm47CisgIC8vIEF0dGVtcHQgMiBNQiBwYWdlcy4KKyAgaWYgKHNpemUgPj0gKDFVTEwgPDwgMjEpICYmIFRyeUh1Z2Uoc2l6ZSwgMjEsIHplcm9lZCwgdG8pKQorICAgIHJldHVybjsKKyNlbmRpZiAvLyBfX2xpbnV4X18KKyAgLy8gTm9uLWxpbnV4IHdpbGwgYWx3YXlzIGRvIHRoaXMsIGFzIHdpbGwgc21hbGwgYWxsb2NhdGlvbnMgb24gTGludXguCisgIHRvLnJlc2V0KHplcm9lZCA/IGNhbGxvYygxLCBzaXplKSA6IG1hbGxvYyhzaXplKSwgc2l6ZSwgc2NvcGVkX21lbW9yeTo6TUFMTE9DX0FMTE9DQVRFRCk7CisgIFVUSUxfVEhST1dfSUYoIXRvLmdldCgpLCBFcnJub0V4Y2VwdGlvbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSAiIDw8IHNpemUgPDwgIiBieXRlcyIpOworfQorCisjaWZkZWYgX19saW51eF9fCitjb25zdCBzdGQ6OnNpemVfdCBrVHJhbnNpdGlvbkh1Z2UgPSBzdGQ6Om1heDxzdGQ6OnNpemVfdD4oMVVMTCA8PCAyMSwgU2l6ZVBhZ2UoKSk7CisjZW5kaWYgLy8gX19saW51eF9fCisKK3ZvaWQgSHVnZVJlYWxsb2Moc3RkOjpzaXplX3QgdG8sIGJvb2wgemVyb19uZXcsIHNjb3BlZF9tZW1vcnkgJm1lbSkgeworICBpZiAoIXRvKSB7CisgICAgbWVtLnJlc2V0KCk7CisgICAgcmV0dXJuOworICB9CisgIHN0ZDo6c2l6ZV90IGZyb21fc2l6ZSA9IG1lbS5zaXplKCk7CisgIHN3aXRjaCAobWVtLnNvdXJjZSgpKSB7CisgICAgY2FzZSBzY29wZWRfbWVtb3J5OjpOT05FX0FMTE9DQVRFRDoKKyAgICAgIEh1Z2VNYWxsb2ModG8sIHplcm9fbmV3LCBtZW0pOworICAgICAgcmV0dXJuOworI2lmZGVmIF9fbGludXhfXworICAgIGNhc2Ugc2NvcGVkX21lbW9yeTo6TU1BUF9ST1VORF9VUF9BTExPQ0FURUQ6CisgICAgICAvLyBmb3IgbXJlbWFwJ3MgYmVuZWZpdC4KKyAgICAgIGZyb21fc2l6ZSA9IFJvdW5kVXBQb3cyKGZyb21fc2l6ZSwgU2l6ZVBhZ2UoKSk7CisgICAgY2FzZSBzY29wZWRfbWVtb3J5OjpNTUFQX0FMTE9DQVRFRDoKKyAgICAgIC8vIERvd25zaXppbmcgYmVsb3cgYmFycmllcj8KKyAgICAgIGlmICh0byA8PSBTaXplUGFnZSgpKSB7CisgICAgICAgIHNjb3BlZF9tYWxsb2MgcmVwbGFjZW1lbnQobWFsbG9jKHRvKSk7CisgICAgICAgIG1lbWNweShyZXBsYWNlbWVudC5nZXQoKSwgbWVtLmdldCgpLCBzdGQ6Om1pbih0bywgbWVtLnNpemUoKSkpOworICAgICAgICBpZiAoemVyb19uZXcgJiYgdG8gPiBtZW0uc2l6ZSgpKQorICAgICAgICAgIG1lbXNldChzdGF0aWNfY2FzdDx1aW50OF90Kj4ocmVwbGFjZW1lbnQuZ2V0KCkpICsgbWVtLnNpemUoKSwgMCwgdG8gLSBtZW0uc2l6ZSgpKTsKKyAgICAgICAgbWVtLnJlc2V0KHJlcGxhY2VtZW50LnJlbGVhc2UoKSwgdG8sIHNjb3BlZF9tZW1vcnk6Ok1BTExPQ19BTExPQ0FURUQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdm9pZCAqbmV3X2FkZHIgPSBtcmVtYXAobWVtLmdldCgpLCBmcm9tX3NpemUsIHRvLCBNUkVNQVBfTUFZTU9WRSk7CisgICAgICAgIFVUSUxfVEhST1dfSUYoIW5ld19hZGRyLCBFcnJub0V4Y2VwdGlvbiwgIkZhaWxlZCB0byBtcmVtYXAgZnJvbSAiIDw8IGZyb21fc2l6ZSA8PCAiIHRvICIgPDwgdG8pOworICAgICAgICBtZW0uc3RlYWwoKTsKKyAgICAgICAgbWVtLnJlc2V0KG5ld19hZGRyLCB0bywgc2NvcGVkX21lbW9yeTo6TU1BUF9BTExPQ0FURUQpOworICAgICAgfQorICAgICAgcmV0dXJuOworI2VuZGlmIC8vIF9fbGludXhfXworICAgIGNhc2Ugc2NvcGVkX21lbW9yeTo6TUFMTE9DX0FMTE9DQVRFRDoKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIC8vIFRyYW5zaXRpb24gbGFyZ2VyIGFsbG9jYXRpb25zIHRvIGh1Z2UgcGFnZXMsIGJ1dCBkb24ndCBrZWVwIHRyeWluZyBpZiB3ZSdyZSBzdGlsbCBtYWxsb2MgYWxsb2NhdGVkLgorICAgICAgaWYgKHRvID49IGtUcmFuc2l0aW9uSHVnZSAmJiBtZW0uc2l6ZSgpIDwga1RyYW5zaXRpb25IdWdlKSB7CisgICAgICAgIHNjb3BlZF9tZW1vcnkgcmVwbGFjZW1lbnQ7CisgICAgICAgIEh1Z2VNYWxsb2ModG8sIHplcm9fbmV3LCByZXBsYWNlbWVudCk7CisgICAgICAgIG1lbWNweShyZXBsYWNlbWVudC5nZXQoKSwgbWVtLmdldCgpLCBtZW0uc2l6ZSgpKTsKKyAgICAgICAgLy8gVGhpcyBjYW4ndCB0aHJvdy4KKyAgICAgICAgbWVtLnJlc2V0KHJlcGxhY2VtZW50LmdldCgpLCByZXBsYWNlbWVudC5zaXplKCksIHJlcGxhY2VtZW50LnNvdXJjZSgpKTsKKyAgICAgICAgcmVwbGFjZW1lbnQuc3RlYWwoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorI2VuZGlmIC8vIF9fbGludXhfXworICAgICAgeworICAgICAgICB2b2lkICpuZXdfYWRkciA9IHN0ZDo6cmVhbGxvYyhtZW0uZ2V0KCksIHRvKTsKKyAgICAgICAgVVRJTF9USFJPV19JRighbmV3X2FkZHIsIEVycm5vRXhjZXB0aW9uLCAicmVhbGxvYyB0byAiIDw8IHRvIDw8ICIgYnl0ZXMgZmFpbGVkLiIpOworICAgICAgICBpZiAoemVyb19uZXcgJiYgdG8gPiBtZW0uc2l6ZSgpKQorICAgICAgICAgIG1lbXNldChzdGF0aWNfY2FzdDx1aW50OF90Kj4obmV3X2FkZHIpICsgbWVtLnNpemUoKSwgMCwgdG8gLSBtZW0uc2l6ZSgpKTsKKyAgICAgICAgbWVtLnN0ZWFsKCk7CisgICAgICAgIG1lbS5yZXNldChuZXdfYWRkciwgdG8sIHNjb3BlZF9tZW1vcnk6Ok1BTExPQ19BTExPQ0FURUQpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICBVVElMX1RIUk9XKEV4Y2VwdGlvbiwgIkh1Z2VSZWFsbG9jIGNhbGxlZCB3aXRoIHR5cGUgIiA8PCBtZW0uc291cmNlKCkpOworICB9Cit9CisKK3ZvaWQgTWFwUmVhZChMb2FkTWV0aG9kIG1ldGhvZCwgaW50IGZkLCB1aW50NjRfdCBvZmZzZXQsIHN0ZDo6c2l6ZV90IHNpemUsIHNjb3BlZF9tZW1vcnkgJm91dCkgeworICBzd2l0Y2ggKG1ldGhvZCkgeworICAgIGNhc2UgTEFaWToKKyAgICAgIG91dC5yZXNldChNYXBPclRocm93KHNpemUsIGZhbHNlLCBrRmlsZUZsYWdzLCBmYWxzZSwgZmQsIG9mZnNldCksIHNpemUsIHNjb3BlZF9tZW1vcnk6Ok1NQVBfQUxMT0NBVEVEKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUE9QVUxBVEVfT1JfTEFaWToKKyNpZmRlZiBNQVBfUE9QVUxBVEUKKyAgICBjYXNlIFBPUFVMQVRFX09SX1JFQUQ6CisjZW5kaWYKKyAgICAgIG91dC5yZXNldChNYXBPclRocm93KHNpemUsIGZhbHNlLCBrRmlsZUZsYWdzLCB0cnVlLCBmZCwgb2Zmc2V0KSwgc2l6ZSwgc2NvcGVkX21lbW9yeTo6TU1BUF9BTExPQ0FURUQpOworICAgICAgYnJlYWs7CisjaWZuZGVmIE1BUF9QT1BVTEFURQorICAgIGNhc2UgUE9QVUxBVEVfT1JfUkVBRDoKKyNlbmRpZgorICAgIGNhc2UgUkVBRDoKKyAgICAgIEh1Z2VNYWxsb2Moc2l6ZSwgZmFsc2UsIG91dCk7CisgICAgICBTZWVrT3JUaHJvdyhmZCwgb2Zmc2V0KTsKKyAgICAgIFJlYWRPclRocm93KGZkLCBvdXQuZ2V0KCksIHNpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQQVJBTExFTF9SRUFEOgorICAgICAgSHVnZU1hbGxvYyhzaXplLCBmYWxzZSwgb3V0KTsKKyAgICAgIFBhcmFsbGVsUmVhZChmZCwgb3V0LmdldCgpLCBzaXplLCBvZmZzZXQpOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCAqTWFwWmVyb2VkV3JpdGUoaW50IGZkLCBzdGQ6OnNpemVfdCBzaXplKSB7CisgIFJlc2l6ZU9yVGhyb3coZmQsIDApOworICBSZXNpemVPclRocm93KGZkLCBzaXplKTsKKyAgcmV0dXJuIE1hcE9yVGhyb3coc2l6ZSwgdHJ1ZSwga0ZpbGVGbGFncywgZmFsc2UsIGZkLCAwKTsKK30KKwordm9pZCAqTWFwWmVyb2VkV3JpdGUoY29uc3QgY2hhciAqbmFtZSwgc3RkOjpzaXplX3Qgc2l6ZSwgc2NvcGVkX2ZkICZmaWxlKSB7CisgIGZpbGUucmVzZXQoQ3JlYXRlT3JUaHJvdyhuYW1lKSk7CisgIHRyeSB7CisgICAgcmV0dXJuIE1hcFplcm9lZFdyaXRlKGZpbGUuZ2V0KCksIHNpemUpOworICB9IGNhdGNoIChFcnJub0V4Y2VwdGlvbiAmZSkgeworICAgIGUgPDwgIiBpbiBmaWxlICIgPDwgbmFtZTsKKyAgICB0aHJvdzsKKyAgfQorfQorCitSb2xsaW5nOjpSb2xsaW5nKGNvbnN0IFJvbGxpbmcgJmNvcHlfZnJvbSwgdWludDY0X3QgaW5jcmVhc2UpIHsKKyAgKnRoaXMgPSBjb3B5X2Zyb207CisgIEluY3JlYXNlQmFzZShpbmNyZWFzZSk7Cit9CisKK1JvbGxpbmcgJlJvbGxpbmc6Om9wZXJhdG9yPShjb25zdCBSb2xsaW5nICZjb3B5X2Zyb20pIHsKKyAgZmRfID0gY29weV9mcm9tLmZkXzsKKyAgZmlsZV9iZWdpbl8gPSBjb3B5X2Zyb20uZmlsZV9iZWdpbl87CisgIGZpbGVfZW5kXyA9IGNvcHlfZnJvbS5maWxlX2VuZF87CisgIGZvcl93cml0ZV8gPSBjb3B5X2Zyb20uZm9yX3dyaXRlXzsKKyAgYmxvY2tfID0gY29weV9mcm9tLmJsb2NrXzsKKyAgcmVhZF9ib3VuZF8gPSBjb3B5X2Zyb20ucmVhZF9ib3VuZF87CisKKyAgY3VycmVudF9iZWdpbl8gPSAwOworICBpZiAoY29weV9mcm9tLklzUGFzc3Rocm91Z2goKSkgeworICAgIGN1cnJlbnRfZW5kXyA9IGNvcHlfZnJvbS5jdXJyZW50X2VuZF87CisgICAgcHRyXyA9IGNvcHlfZnJvbS5wdHJfOworICB9IGVsc2UgeworICAgIC8vIEZvcmNlIGNhbGwgb24gbmV4dCBtbWFwLgorICAgIGN1cnJlbnRfZW5kXyA9IDA7CisgICAgcHRyXyA9IE5VTEw7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCitSb2xsaW5nOjpSb2xsaW5nKGludCBmZCwgYm9vbCBmb3Jfd3JpdGUsIHN0ZDo6c2l6ZV90IGJsb2NrLCBzdGQ6OnNpemVfdCByZWFkX2JvdW5kLCB1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IGFtb3VudCkgeworICBjdXJyZW50X2JlZ2luXyA9IDA7CisgIGN1cnJlbnRfZW5kXyA9IDA7CisgIGZkXyA9IGZkOworICBmaWxlX2JlZ2luXyA9IG9mZnNldDsKKyAgZmlsZV9lbmRfID0gb2Zmc2V0ICsgYW1vdW50OworICBmb3Jfd3JpdGVfID0gZm9yX3dyaXRlOworICBibG9ja18gPSBibG9jazsKKyAgcmVhZF9ib3VuZF8gPSByZWFkX2JvdW5kOworfQorCit2b2lkICpSb2xsaW5nOjpFeHRyYWN0Tm9uUm9sbGluZyhzY29wZWRfbWVtb3J5ICZvdXQsIHVpbnQ2NF90IGluZGV4LCBzdGQ6OnNpemVfdCBzaXplKSB7CisgIG91dC5yZXNldCgpOworICBpZiAoSXNQYXNzdGhyb3VnaCgpKSByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGdldCgpKSArIGluZGV4OworICB1aW50NjRfdCBvZmZzZXQgPSBpbmRleCArIGZpbGVfYmVnaW5fOworICAvLyBSb3VuZCBkb3duIHRvIG11bHRpcGxlIG9mIHBhZ2Ugc2l6ZS4KKyAgdWludDY0X3QgY3J1ZnQgPSBvZmZzZXQgJSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oU2l6ZVBhZ2UoKSk7CisgIHN0ZDo6c2l6ZV90IG1hcF9zaXplID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHNpemUgKyBjcnVmdCk7CisgIG91dC5yZXNldChNYXBPclRocm93KG1hcF9zaXplLCBmb3Jfd3JpdGVfLCBrRmlsZUZsYWdzLCB0cnVlLCBmZF8sIG9mZnNldCAtIGNydWZ0KSwgbWFwX3NpemUsIHNjb3BlZF9tZW1vcnk6Ok1NQVBfQUxMT0NBVEVEKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihvdXQuZ2V0KCkpICsgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KGNydWZ0KTsKK30KKwordm9pZCBSb2xsaW5nOjpSb2xsKHVpbnQ2NF90IGluZGV4KSB7CisgIGFzc2VydCghSXNQYXNzdGhyb3VnaCgpKTsKKyAgc3RkOjpzaXplX3QgYW1vdW50OworICBpZiAoZmlsZV9lbmRfIC0gKGluZGV4ICsgZmlsZV9iZWdpbl8pID4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJsb2NrXykpIHsKKyAgICBhbW91bnQgPSBibG9ja187CisgICAgY3VycmVudF9lbmRfID0gaW5kZXggKyBhbW91bnQgLSByZWFkX2JvdW5kXzsKKyAgfSBlbHNlIHsKKyAgICBhbW91bnQgPSBmaWxlX2VuZF8gLSAoaW5kZXggKyBmaWxlX2JlZ2luXyk7CisgICAgY3VycmVudF9lbmRfID0gaW5kZXggKyBhbW91bnQ7CisgIH0KKyAgcHRyXyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihFeHRyYWN0Tm9uUm9sbGluZyhtZW1fLCBpbmRleCwgYW1vdW50KSkgLSBpbmRleDsKKworICBjdXJyZW50X2JlZ2luXyA9IGluZGV4OworfQorCit9IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9tbWFwLmhoIGIvc3JjL2tlbmxtL3V0aWwvbW1hcC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDc0ZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvbW1hcC5oaApAQCAtMCwwICsxLDIyNSBAQAorI2lmbmRlZiBVVElMX01NQVBfSAorI2RlZmluZSBVVElMX01NQVBfSAorLy8gVXRpbGl0aWVzIGZvciBtbWFwZWQgZmlsZXMuCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCituYW1lc3BhY2UgdXRpbCB7CisKK2NsYXNzIHNjb3BlZF9mZDsKKworc3RkOjpzaXplX3QgU2l6ZVBhZ2UoKTsKKworLy8gKHZvaWQqKS0xIGlzIE1BUF9GQUlMRUQ7IHRoaXMgaXMgZG9uZSB0byBhdm9pZCBpbmNsdWRpbmcgdGhlIG1tYXAgaGVhZGVyIGhlcmUuCitjbGFzcyBzY29wZWRfbW1hcCB7CisgIHB1YmxpYzoKKyAgICBzY29wZWRfbW1hcCgpIDogZGF0YV8oKHZvaWQqKS0xKSwgc2l6ZV8oMCkge30KKyAgICBzY29wZWRfbW1hcCh2b2lkICpkYXRhLCBzdGQ6OnNpemVfdCBzaXplKSA6IGRhdGFfKGRhdGEpLCBzaXplXyhzaXplKSB7fQorICAgIH5zY29wZWRfbW1hcCgpOworCisgICAgdm9pZCAqZ2V0KCkgY29uc3QgeyByZXR1cm4gZGF0YV87IH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmJlZ2luKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZGF0YV8pOyB9CisgICAgY29uc3QgdWludDhfdCAqZW5kKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZGF0YV8pICsgc2l6ZV87IH0KKyAgICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKworICAgIHZvaWQgcmVzZXQodm9pZCAqZGF0YSwgc3RkOjpzaXplX3Qgc2l6ZSkgeworICAgICAgc2NvcGVkX21tYXAgb3RoZXIoZGF0YV8sIHNpemVfKTsKKyAgICAgIGRhdGFfID0gZGF0YTsKKyAgICAgIHNpemVfID0gc2l6ZTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgcmVzZXQoKHZvaWQqKS0xLCAwKTsKKyAgICB9CisKKyAgICB2b2lkICpzdGVhbCgpIHsKKyAgICAgIHZvaWQgKnJldCA9IGRhdGFfOworICAgICAgZGF0YV8gPSAodm9pZCopLTE7CisgICAgICBzaXplXyA9IDA7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgKmRhdGFfOworICAgIHN0ZDo6c2l6ZV90IHNpemVfOworCisgICAgc2NvcGVkX21tYXAoY29uc3Qgc2NvcGVkX21tYXAgJik7CisgICAgc2NvcGVkX21tYXAgJm9wZXJhdG9yPShjb25zdCBzY29wZWRfbW1hcCAmKTsKK307CisKKy8qIEZvciB3aGVuIHRoZSBtZW1vcnkgbWlnaHQgY29tZSBmcm9tIG1tYXAsIG5ldyBjaGFyW10sIG9yIG1hbGxvYy4gIFVzZXMgTlVMTAorICogYW5kIDAgZm9yIGJsYW5rcyBldmVuIHRob3VnaCBtbWFwIHNpZ25hbHMgZXJyb3JzIHdpdGggKHZvaWQqKS0xKS4gIFRoZSByZXNldAorICogZnVuY3Rpb24gY2hlY2tzIHRoYXQgYmxhbmsgZm9yIG1tYXAuCisgKi8KK2NsYXNzIHNjb3BlZF9tZW1vcnkgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgIE1NQVBfUk9VTkRfVVBfQUxMT0NBVEVELCAvLyBUaGUgc2l6ZSB3YXMgcm91bmRlZCB1cCB0byBhIG11bHRpcGxlIG9mIHBhZ2Ugc2l6ZS4gIERvIHRoZSBzYW1lIGJlZm9yZSBtdW5tYXAuCisgICAgICBNTUFQX0FMTE9DQVRFRCwgLy8gbXVubWFwCisgICAgICBNQUxMT0NfQUxMT0NBVEVELCAvLyBmcmVlCisgICAgICBOT05FX0FMTE9DQVRFRCAvLyBub3RoaW5nIGhlcmUhCisgICAgfSBBbGxvYzsKKworICAgIHNjb3BlZF9tZW1vcnkodm9pZCAqZGF0YSwgc3RkOjpzaXplX3Qgc2l6ZSwgQWxsb2Mgc291cmNlKQorICAgICAgOiBkYXRhXyhkYXRhKSwgc2l6ZV8oc2l6ZSksIHNvdXJjZV8oc291cmNlKSB7fQorCisgICAgc2NvcGVkX21lbW9yeSgpIDogZGF0YV8oTlVMTCksIHNpemVfKDApLCBzb3VyY2VfKE5PTkVfQUxMT0NBVEVEKSB7fQorCisgICAgLy8gQ2FsbHMgSHVnZU1hbGxvYworICAgIHNjb3BlZF9tZW1vcnkoc3RkOjpzaXplX3QgdG8sIGJvb2wgemVyb19uZXcpOworCisgICAgfnNjb3BlZF9tZW1vcnkoKSB7IHJlc2V0KCk7IH0KKworICAgIHZvaWQgKmdldCgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfOyB9CisgICAgY29uc3QgY2hhciAqYmVnaW4oKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PGNoYXIqPihkYXRhXyk7IH0KKyAgICBjb25zdCBjaGFyICplbmQoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PGNoYXIqPihkYXRhXykgKyBzaXplXzsgfQorICAgIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQorCisgICAgQWxsb2Mgc291cmNlKCkgY29uc3QgeyByZXR1cm4gc291cmNlXzsgfQorCisgICAgdm9pZCByZXNldCgpIHsgcmVzZXQoTlVMTCwgMCwgTk9ORV9BTExPQ0FURUQpOyB9CisKKyAgICB2b2lkIHJlc2V0KHZvaWQgKmRhdGEsIHN0ZDo6c2l6ZV90IHNpemUsIEFsbG9jIGZyb20pOworCisgICAgdm9pZCAqc3RlYWwoKSB7CisgICAgICB2b2lkICpyZXQgPSBkYXRhXzsKKyAgICAgIGRhdGFfID0gTlVMTDsKKyAgICAgIHNpemVfID0gMDsKKyAgICAgIHNvdXJjZV8gPSBOT05FX0FMTE9DQVRFRDsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCAqZGF0YV87CisgICAgc3RkOjpzaXplX3Qgc2l6ZV87CisKKyAgICBBbGxvYyBzb3VyY2VfOworCisgICAgc2NvcGVkX21lbW9yeShjb25zdCBzY29wZWRfbWVtb3J5ICYpOworICAgIHNjb3BlZF9tZW1vcnkgJm9wZXJhdG9yPShjb25zdCBzY29wZWRfbWVtb3J5ICYpOworfTsKKworZXh0ZXJuIGNvbnN0IGludCBrRmlsZUZsYWdzOworCisvLyBDcm9zcy1wbGF0Zm9ybSwgZXJyb3ItY2hlY2tpbmcgd3JhcHBlciBmb3IgbW1hcCgpLgordm9pZCAqTWFwT3JUaHJvdyhzdGQ6OnNpemVfdCBzaXplLCBib29sIGZvcl93cml0ZSwgaW50IGZsYWdzLCBib29sIHByZWZhdWx0LCBpbnQgZmQsIHVpbnQ2NF90IG9mZnNldCA9IDApOworCisvLyBtc3luYyB3cmFwcGVyCit2b2lkIFN5bmNPclRocm93KHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoKTsKKworLy8gQ3Jvc3MtcGxhdGZvcm0sIGVycm9yLWNoZWNraW5nIHdyYXBwZXIgZm9yIG11bm1hcCgpLgordm9pZCBVbm1hcE9yVGhyb3codm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgpOworCisvLyBBbGxvY2F0ZSBtZW1vcnksIHByb21pc2luZyB0aGF0IGFsbC92YXN0IG1ham9yaXR5IG9mIGl0IHdpbGwgYmUgdXNlZC4gIFRyaWVzCisvLyBoYXJkIHRvIHVzZSBodWdlIHBhZ2VzIG9uIExpbnV4LgorLy8gSWYgeW91IHdhbnQgemVyb2VkIG1lbW9yeSwgcGFzcyB6ZXJvZWQgPSB0cnVlLgordm9pZCBIdWdlTWFsbG9jKHN0ZDo6c2l6ZV90IHNpemUsIGJvb2wgemVyb2VkLCBzY29wZWRfbWVtb3J5ICZ0byk7CisKKy8vIFJlYWxsb2NhdGVzIG1lbW9yeSBhbGEgcmVhbGxvYyBidXQgd2l0aCBvcHRpb24gdG8gemVybyB0aGUgbmV3IG1lbW9yeS4KKy8vIE9uIExpbnV4LCB0aGUgbWVtb3J5IGNhbiBjb21lIGZyb20gYW5vbnltb3VzIG1tYXAgb3IgbWFsbG9jL2NhbGxvYy4KKy8vIE9uIG5vbi1MaW51eCwgb25seSBtYWxsb2MvY2FsbG9jIGlzIHN1cHBvcnRlZC4KKy8vCisvLyBUbyBzdW1tYXJpemUsIGFueSBtZW1vcnkgZnJvbSBIdWdlTWFsbG9jIG9yIEh1Z2VSZWFsbG9jIGNhbiBiZSByZXNpemVkIHdpdGgKKy8vIHRoaXMuCit2b2lkIEh1Z2VSZWFsbG9jKHN0ZDo6c2l6ZV90IHNpemUsIGJvb2wgbmV3X3plcm9lZCwgc2NvcGVkX21lbW9yeSAmbWVtKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgLy8gbW1hcCB3aXRoIG5vIHByZXBvcHVsYXRlCisgIExBWlksCisgIC8vIE9uIGxpbnV4LCBwYXNzIE1BUF9QT1BVTEFURSB0byBtbWFwLgorICBQT1BVTEFURV9PUl9MQVpZLAorICAvLyBQb3B1bGF0ZSBvbiBMaW51eC4gIG1hbGxvYyBhbmQgcmVhZCBvbiBub24tTGludXguCisgIFBPUFVMQVRFX09SX1JFQUQsCisgIC8vIG1hbGxvYyBhbmQgcmVhZC4KKyAgUkVBRCwKKyAgLy8gbWFsbG9jIGFuZCByZWFkIGluIHBhcmFsbGVsIChyZWNvbW1lbmRlZCBmb3IgTHVzdHJlKQorICBQQVJBTExFTF9SRUFELAorfSBMb2FkTWV0aG9kOworCit2b2lkIE1hcFJlYWQoTG9hZE1ldGhvZCBtZXRob2QsIGludCBmZCwgdWludDY0X3Qgb2Zmc2V0LCBzdGQ6OnNpemVfdCBzaXplLCBzY29wZWRfbWVtb3J5ICZvdXQpOworCisvLyBPcGVuIGZpbGUgbmFtZSB3aXRoIG1tYXAgb2Ygc2l6ZSBieXRlcywgYWxsIG9mIHdoaWNoIGFyZSBpbml0aWFsbHkgemVyby4KK3ZvaWQgKk1hcFplcm9lZFdyaXRlKGludCBmZCwgc3RkOjpzaXplX3Qgc2l6ZSk7Cit2b2lkICpNYXBaZXJvZWRXcml0ZShjb25zdCBjaGFyICpuYW1lLCBzdGQ6OnNpemVfdCBzaXplLCBzY29wZWRfZmQgJmZpbGUpOworCisvLyBGb3J3YXJkIHJvbGxpbmcgbWVtb3J5IG1hcCB3aXRoIG5vIG92ZXJsYXAuCitjbGFzcyBSb2xsaW5nIHsKKyAgcHVibGljOgorICAgIFJvbGxpbmcoKSB7fQorCisgICAgZXhwbGljaXQgUm9sbGluZyh2b2lkICpkYXRhKSB7IEluaXQoZGF0YSk7IH0KKworICAgIFJvbGxpbmcoY29uc3QgUm9sbGluZyAmY29weV9mcm9tLCB1aW50NjRfdCBpbmNyZWFzZSA9IDApOworICAgIFJvbGxpbmcgJm9wZXJhdG9yPShjb25zdCBSb2xsaW5nICZjb3B5X2Zyb20pOworCisgICAgLy8gRm9yIGFuIGFjdHVhbCByb2xsaW5nIG1tYXAuCisgICAgZXhwbGljaXQgUm9sbGluZyhpbnQgZmQsIGJvb2wgZm9yX3dyaXRlLCBzdGQ6OnNpemVfdCBibG9jaywgc3RkOjpzaXplX3QgcmVhZF9ib3VuZCwgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBhbW91bnQpOworCisgICAgLy8gRm9yIGEgc3RhdGljIG1hcHBpbmcKKyAgICB2b2lkIEluaXQodm9pZCAqZGF0YSkgeworICAgICAgcHRyXyA9IGRhdGE7CisgICAgICBjdXJyZW50X2VuZF8gPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCk7CisgICAgICBjdXJyZW50X2JlZ2luXyA9IDA7CisgICAgICAvLyBNYXJrIGFzIGEgcGFzcy10aHJvdWdoLgorICAgICAgZmRfID0gLTE7CisgICAgfQorCisgICAgdm9pZCBJbmNyZWFzZUJhc2UodWludDY0X3QgYnkpIHsKKyAgICAgIGZpbGVfYmVnaW5fICs9IGJ5OworICAgICAgcHRyXyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihwdHJfKSArIGJ5OworICAgICAgaWYgKCFJc1Bhc3N0aHJvdWdoKCkpIGN1cnJlbnRfZW5kXyA9IDA7CisgICAgfQorCisgICAgdm9pZCBEZWNyZWFzZUJhc2UodWludDY0X3QgYnkpIHsKKyAgICAgIGZpbGVfYmVnaW5fIC09IGJ5OworICAgICAgcHRyXyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihwdHJfKSAtIGJ5OworICAgICAgaWYgKCFJc1Bhc3N0aHJvdWdoKCkpIGN1cnJlbnRfZW5kXyA9IDA7CisgICAgfQorCisgICAgdm9pZCAqRXh0cmFjdE5vblJvbGxpbmcoc2NvcGVkX21lbW9yeSAmb3V0LCB1aW50NjRfdCBpbmRleCwgc3RkOjpzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBSZXR1cm5zIGJhc2UgcG9pbnRlcgorICAgIHZvaWQgKmdldCgpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KKworICAgIC8vIFJldHVybnMgYmFzZSBwb2ludGVyLgorICAgIHZvaWQgKkNoZWNrZWRCYXNlKHVpbnQ2NF90IGluZGV4KSB7CisgICAgICBpZiAoaW5kZXggPj0gY3VycmVudF9lbmRfIHx8IGluZGV4IDwgY3VycmVudF9iZWdpbl8pIHsKKyAgICAgICAgUm9sbChpbmRleCk7CisgICAgICB9CisgICAgICByZXR1cm4gcHRyXzsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIGluZGV4ZWQgcG9pbnRlci4KKyAgICB2b2lkICpDaGVja2VkSW5kZXgodWludDY0X3QgaW5kZXgpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Kj4oQ2hlY2tlZEJhc2UoaW5kZXgpKSArIGluZGV4OworICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgUm9sbCh1aW50NjRfdCBpbmRleCk7CisKKyAgICAvLyBUcnVlIGlmIHRoaXMgaXMganVzdCBhIHRoaW4gd3JhcHBlciBvbiBhIHBvaW50ZXIuCisgICAgYm9vbCBJc1Bhc3N0aHJvdWdoKCkgY29uc3QgeyByZXR1cm4gZmRfID09IC0xOyB9CisKKyAgICB2b2lkICpwdHJfOworICAgIHVpbnQ2NF90IGN1cnJlbnRfYmVnaW5fOworICAgIHVpbnQ2NF90IGN1cnJlbnRfZW5kXzsKKworICAgIHNjb3BlZF9tZW1vcnkgbWVtXzsKKworICAgIGludCBmZF87CisgICAgdWludDY0X3QgZmlsZV9iZWdpbl87CisgICAgdWludDY0X3QgZmlsZV9lbmRfOworCisgICAgYm9vbCBmb3Jfd3JpdGVfOworICAgIHN0ZDo6c2l6ZV90IGJsb2NrXzsKKyAgICBzdGQ6OnNpemVfdCByZWFkX2JvdW5kXzsKK307CisKK30gLy8gbmFtZXNwYWNlIHV0aWwKKworI2VuZGlmIC8vIFVUSUxfTU1BUF9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9tdWx0aV9pbnRlcnNlY3Rpb24uaGggYi9zcmMva2VubG0vdXRpbC9tdWx0aV9pbnRlcnNlY3Rpb24uaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5NTQ2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL211bHRpX2ludGVyc2VjdGlvbi5oaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIFVUSUxfTVVMVElfSU5URVJTRUNUSU9OX0gKKyNkZWZpbmUgVVRJTF9NVUxUSV9JTlRFUlNFQ1RJT05fSAorCisjaW5jbHVkZSA8Ym9vc3Qvb3B0aW9uYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2l0ZXJhdG9yX3JhbmdlLmhwcD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHV0aWwgeworCituYW1lc3BhY2UgZGV0YWlsIHsKK3RlbXBsYXRlIDxjbGFzcyBSYW5nZT4gc3RydWN0IFJhbmdlTGVzc0J5U2l6ZSA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxjb25zdCBSYW5nZSAmLCBjb25zdCBSYW5nZSAmLCBib29sPiB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYW5nZSAmbGVmdCwgY29uc3QgUmFuZ2UgJnJpZ2h0KSBjb25zdCB7CisgICAgcmV0dXJuIGxlZnQuc2l6ZSgpIDwgcmlnaHQuc2l6ZSgpOworICB9Cit9OworCisvKiBUYWtlcyBzZXRzIHNwZWNpZmllZCBieSB0aGVpciBpdGVyYXRvcnMgYW5kIGEgYm9vc3Q6Om9wdGlvbmFsIGNvbnRhaW5pbmcKKyAqIHRoZSBsb3dlc3QgaW50ZXJzZWN0aW9uIGlmIGFueS4gIEVhY2ggc2V0IG11c3QgYmUgc29ydGVkIGluIGluY3JlYXNpbmcKKyAqIG9yZGVyLiAgc2V0cyBpcyBjaGFuZ2VkIHRvIHRydW5jYXRlIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzZXF1ZW5jZSB0byB0aGUKKyAqIGxvY2F0aW9uIG9mIHRoZSBtYXRjaCBvciBhbiBlbXB0eSBzZXQuICBQcmVjb25kaXRpb246IHNldHMgaXMgbm90IGVtcHR5CisgKiBzaW5jZSB0aGUgaW50ZXJzZWN0aW9uIG92ZXIgbnVsbCBpcyB0aGUgdW5pdmVyc2UgYW5kIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QKKyAqIGtub3cgdGhlIHVuaXZlcnNlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IsIGNsYXNzIExlc3M+IGJvb3N0OjpvcHRpb25hbDx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGU+IEZpcnN0SW50ZXJzZWN0aW9uU29ydGVkKHN0ZDo6dmVjdG9yPGJvb3N0OjppdGVyYXRvcl9yYW5nZTxJdGVyYXRvcj4gPiAmc2V0cywgY29uc3QgTGVzcyAmbGVzcyA9IHN0ZDo6bGVzczx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KCkpIHsKKyAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxib29zdDo6aXRlcmF0b3JfcmFuZ2U8SXRlcmF0b3I+ID4gU2V0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGUgVmFsdWU7CisKKyAgYXNzZXJ0KCFzZXRzLmVtcHR5KCkpOworCisgIGlmIChzZXRzLmZyb250KCkuZW1wdHkoKSkgcmV0dXJuIGJvb3N0OjpvcHRpb25hbDxWYWx1ZT4oKTsKKyAgLy8gUG9zc2libHkgc3Vib3B0aW1hbCB0byBjb3B5IGZvciBnZW5lcmFsIFZhbHVlOyBtYWtlcyB1bnNpZ25lZCBpbnQgZ28gc2xpZ2h0bHkgZmFzdGVyLgorICBWYWx1ZSBoaWdoZXN0KHNldHMuZnJvbnQoKS5mcm9udCgpKTsKKyAgZm9yICh0eXBlbmFtZSBTZXRzOjppdGVyYXRvciBpKHNldHMuYmVnaW4oKSk7IGkgIT0gc2V0cy5lbmQoKTsgKSB7CisgICAgaS0+YWR2YW5jZV9iZWdpbihzdGQ6Omxvd2VyX2JvdW5kKGktPmJlZ2luKCksIGktPmVuZCgpLCBoaWdoZXN0LCBsZXNzKSAtIGktPmJlZ2luKCkpOworICAgIGlmIChpLT5lbXB0eSgpKSByZXR1cm4gYm9vc3Q6Om9wdGlvbmFsPFZhbHVlPigpOworICAgIGlmIChsZXNzKGhpZ2hlc3QsIGktPmZyb250KCkpKSB7CisgICAgICBoaWdoZXN0ID0gaS0+ZnJvbnQoKTsKKyAgICAgIC8vIHN0YXJ0IG92ZXIKKyAgICAgIGkgPSBzZXRzLmJlZ2luKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICsraTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGJvb3N0OjpvcHRpb25hbDxWYWx1ZT4oaGlnaGVzdCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IsIGNsYXNzIExlc3M+IGJvb3N0OjpvcHRpb25hbDx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGU+IEZpcnN0SW50ZXJzZWN0aW9uKHN0ZDo6dmVjdG9yPGJvb3N0OjppdGVyYXRvcl9yYW5nZTxJdGVyYXRvcj4gPiAmc2V0cywgY29uc3QgTGVzcyBsZXNzKSB7CisgIGFzc2VydCghc2V0cy5lbXB0eSgpKTsKKworICBzdGQ6OnNvcnQoc2V0cy5iZWdpbigpLCBzZXRzLmVuZCgpLCBkZXRhaWw6OlJhbmdlTGVzc0J5U2l6ZTxib29zdDo6aXRlcmF0b3JfcmFuZ2U8SXRlcmF0b3I+ID4oKSk7CisgIHJldHVybiBkZXRhaWw6OkZpcnN0SW50ZXJzZWN0aW9uU29ydGVkKHNldHMsIGxlc3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3I+IGJvb3N0OjpvcHRpb25hbDx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGU+IEZpcnN0SW50ZXJzZWN0aW9uKHN0ZDo6dmVjdG9yPGJvb3N0OjppdGVyYXRvcl9yYW5nZTxJdGVyYXRvcj4gPiAmc2V0cykgeworICByZXR1cm4gRmlyc3RJbnRlcnNlY3Rpb24oc2V0cywgc3RkOjpsZXNzPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBJdGVyYXRvciwgY2xhc3MgT3V0cHV0LCBjbGFzcyBMZXNzPiB2b2lkIEFsbEludGVyc2VjdGlvbihzdGQ6OnZlY3Rvcjxib29zdDo6aXRlcmF0b3JfcmFuZ2U8SXRlcmF0b3I+ID4gJnNldHMsIE91dHB1dCAmb3V0LCBjb25zdCBMZXNzIGxlc3MpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGUgVmFsdWU7CisgIGFzc2VydCghc2V0cy5lbXB0eSgpKTsKKworICBzdGQ6OnNvcnQoc2V0cy5iZWdpbigpLCBzZXRzLmVuZCgpLCBkZXRhaWw6OlJhbmdlTGVzc0J5U2l6ZTxib29zdDo6aXRlcmF0b3JfcmFuZ2U8SXRlcmF0b3I+ID4oKSk7CisgIGJvb3N0OjpvcHRpb25hbDxWYWx1ZT4gcmV0OworICBmb3IgKGJvb3N0OjpvcHRpb25hbDxWYWx1ZT4gcmV0OyAocmV0ID0gZGV0YWlsOjpGaXJzdEludGVyc2VjdGlvblNvcnRlZChzZXRzLCBsZXNzKSk7IHNldHMuZnJvbnQoKS5hZHZhbmNlX2JlZ2luKDEpKSB7CisgICAgb3V0KCpyZXQpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBJdGVyYXRvciwgY2xhc3MgT3V0cHV0PiB2b2lkIEFsbEludGVyc2VjdGlvbihzdGQ6OnZlY3Rvcjxib29zdDo6aXRlcmF0b3JfcmFuZ2U8SXRlcmF0b3I+ID4gJnNldHMsIE91dHB1dCAmb3V0KSB7CisgIEFsbEludGVyc2VjdGlvbihzZXRzLCBvdXQsIHN0ZDo6bGVzczx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KCkpOworfQorCit9IC8vIG5hbWVzcGFjZSB1dGlsCisKKyNlbmRpZiAvLyBVVElMX01VTFRJX0lOVEVSU0VDVElPTl9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9tdWx0aV9pbnRlcnNlY3Rpb25fdGVzdC5jYyBiL3NyYy9rZW5sbS91dGlsL211bHRpX2ludGVyc2VjdGlvbl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWFmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9tdWx0aV9pbnRlcnNlY3Rpb25fdGVzdC5jYwpAQCAtMCwwICsxLDYzIEBACisjaW5jbHVkZSAidXRpbC9tdWx0aV9pbnRlcnNlY3Rpb24uaGgiCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgTXVsdGlJbnRlcnNlY3Rpb25UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgeworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFbXB0eSkgeworICBzdGQ6OnZlY3Rvcjxib29zdDo6aXRlcmF0b3JfcmFuZ2U8Y29uc3QgdW5zaWduZWQgaW50Kj4gPiBzZXRzOworCisgIHNldHMucHVzaF9iYWNrKGJvb3N0OjppdGVyYXRvcl9yYW5nZTxjb25zdCB1bnNpZ25lZCBpbnQqPihzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBpbnQqPihOVUxMKSwgc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgaW50Kj4oTlVMTCkpKTsKKyAgQk9PU1RfQ0hFQ0soIUZpcnN0SW50ZXJzZWN0aW9uKHNldHMpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2luZ2xlKSB7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gbnVtczsKKyAgbnVtcy5wdXNoX2JhY2soMSk7CisgIG51bXMucHVzaF9iYWNrKDQpOworICBudW1zLnB1c2hfYmFjaygxMDApOworICBzdGQ6OnZlY3Rvcjxib29zdDo6aXRlcmF0b3JfcmFuZ2U8c3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50Pjo6Y29uc3RfaXRlcmF0b3I+ID4gc2V0czsKKyAgc2V0cy5wdXNoX2JhY2sobnVtcyk7CisKKyAgYm9vc3Q6Om9wdGlvbmFsPHVuc2lnbmVkIGludD4gcmV0KEZpcnN0SW50ZXJzZWN0aW9uKHNldHMpKTsKKworICBCT09TVF9SRVFVSVJFKHJldCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oMSksICpyZXQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgdW5zaWduZWQgaW50IGxlbj4gYm9vc3Q6Oml0ZXJhdG9yX3JhbmdlPGNvbnN0IFQqPiBSYW5nZUZyb21BcnJheShjb25zdCBUICgmYXJyKVtsZW5dKSB7CisgIHJldHVybiBib29zdDo6aXRlcmF0b3JfcmFuZ2U8Y29uc3QgVCo+KGFyciwgYXJyICsgbGVuKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTXVsdGlOb25lKSB7CisgIHVuc2lnbmVkIGludCBudW1zMFtdID0gezEsIDMsIDQsIDIyfTsKKyAgdW5zaWduZWQgaW50IG51bXMxW10gPSB7MiwgNSwgMTJ9OworICB1bnNpZ25lZCBpbnQgbnVtczJbXSA9IHs0LCAxN307CisKKyAgc3RkOjp2ZWN0b3I8Ym9vc3Q6Oml0ZXJhdG9yX3JhbmdlPGNvbnN0IHVuc2lnbmVkIGludCo+ID4gc2V0czsKKyAgc2V0cy5wdXNoX2JhY2soUmFuZ2VGcm9tQXJyYXkobnVtczApKTsKKyAgc2V0cy5wdXNoX2JhY2soUmFuZ2VGcm9tQXJyYXkobnVtczEpKTsKKyAgc2V0cy5wdXNoX2JhY2soUmFuZ2VGcm9tQXJyYXkobnVtczIpKTsKKworICBCT09TVF9DSEVDSyghRmlyc3RJbnRlcnNlY3Rpb24oc2V0cykpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNdWx0aU9uZSkgeworICB1bnNpZ25lZCBpbnQgbnVtczBbXSA9IHsxLCAzLCA0LCAxNywgMjJ9OworICB1bnNpZ25lZCBpbnQgbnVtczFbXSA9IHsyLCA1LCAxMiwgMTd9OworICB1bnNpZ25lZCBpbnQgbnVtczJbXSA9IHs0LCAxN307CisKKyAgc3RkOjp2ZWN0b3I8Ym9vc3Q6Oml0ZXJhdG9yX3JhbmdlPGNvbnN0IHVuc2lnbmVkIGludCo+ID4gc2V0czsKKyAgc2V0cy5wdXNoX2JhY2soUmFuZ2VGcm9tQXJyYXkobnVtczApKTsKKyAgc2V0cy5wdXNoX2JhY2soUmFuZ2VGcm9tQXJyYXkobnVtczEpKTsKKyAgc2V0cy5wdXNoX2JhY2soUmFuZ2VGcm9tQXJyYXkobnVtczIpKTsKKworICBib29zdDo6b3B0aW9uYWw8dW5zaWduZWQgaW50PiByZXQoRmlyc3RJbnRlcnNlY3Rpb24oc2V0cykpOworICBCT09TVF9SRVFVSVJFKHJldCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oMTcpLCAqcmV0KTsKK30KKworfSAvLyBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL211cm11cl9oYXNoLmNjIGIvc3JjL2tlbmxtL3V0aWwvbXVybXVyX2hhc2guY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzMjQ5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL211cm11cl9oYXNoLmNjCkBAIC0wLDAgKzEsMTc1IEBACisvKiBEb3dubG9hZGVkIGZyb20gaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vc2l0ZS9tdXJtdXJoYXNoLyB3aGljaCBzYXlzICJBbGwKKyAqIGNvZGUgaXMgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4uIEZvciBidXNpbmVzcyBwdXJwb3NlcywgTXVybXVyaGFzaCBpcworICogdW5kZXIgdGhlIE1JVCBsaWNlbnNlLiIKKyAqIFRoaXMgaXMgbW9kaWZpZWQgZnJvbSB0aGUgb3JpZ2luYWw6CisgKiBVTEwgdGFnIG9uIDB4YzZhNGE3OTM1YmQxZTk5NSBzbyB0aGlzIHdpbGwgY29tcGlsZSBvbiAzMi1iaXQuCisgKiBsZW5ndGggY2hhbmdlZCB0byB1bnNpZ25lZCBpbnQuCisgKiBwbGFjZWQgaW4gbmFtZXNwYWNlIHV0aWwKKyAqIGFkZCBNdXJtdXJIYXNoTmF0aXZlCisgKiBkZWZhdWx0IG9wdGlvbiA9IDAgZm9yIHNlZWQKKyAqIEFSTSBwb3J0IGZyb20gTklDVAorICovCisKKyNpbmNsdWRlICJ1dGlsL211cm11cl9oYXNoLmhoIgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSB1dGlsIHsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTXVybXVySGFzaDIsIDY0LWJpdCB2ZXJzaW9ucywgYnkgQXVzdGluIEFwcGxlYnkKKworLy8gVGhlIHNhbWUgY2F2ZWF0cyBhcyAzMi1iaXQgTXVybXVySGFzaDIgYXBwbHkgaGVyZSAtIGJld2FyZSBvZiBhbGlnbm1lbnQKKy8vIGFuZCBlbmRpYW4tbmVzcyBpc3N1ZXMgaWYgdXNlZCBhY3Jvc3MgbXVsdGlwbGUgcGxhdGZvcm1zLgorCisvLyA2NC1iaXQgaGFzaCBmb3IgNjQtYml0IHBsYXRmb3JtcworCit1aW50NjRfdCBNdXJtdXJIYXNoNjRBICggY29uc3Qgdm9pZCAqIGtleSwgc3RkOjpzaXplX3QgbGVuLCB1aW50NjRfdCBzZWVkICkKK3sKKyAgY29uc3QgdWludDY0X3QgbSA9IDB4YzZhNGE3OTM1YmQxZTk5NVVMTDsKKyAgY29uc3QgaW50IHIgPSA0NzsKKworICB1aW50NjRfdCBoID0gc2VlZCBeIChsZW4gKiBtKTsKKworI2lmIGRlZmluZWQoX19hcm0pIHx8IGRlZmluZWQoX19hcm1fXykKKyAgY29uc3Qgc2l6ZV90IGtzaXplID0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqIGRhdGEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWtleTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqIGVuZCA9IGRhdGEgKyAoc3RkOjpzaXplX3QpKGxlbi84KSAqIGtzaXplOworI2Vsc2UKKyAgY29uc3QgdWludDY0X3QgKiBkYXRhID0gKGNvbnN0IHVpbnQ2NF90ICopa2V5OworICBjb25zdCB1aW50NjRfdCAqIGVuZCA9IGRhdGEgKyAobGVuLzgpOworI2VuZGlmCisKKyAgd2hpbGUoZGF0YSAhPSBlbmQpCisgIHsKKyNpZiBkZWZpbmVkKF9fYXJtKSB8fCBkZWZpbmVkKF9fYXJtX18pCisgICAgdWludDY0X3QgazsKKyAgICBtZW1jcHkoJmssIGRhdGEsIGtzaXplKTsKKyAgICBkYXRhICs9IGtzaXplOworI2Vsc2UKKyAgICB1aW50NjRfdCBrID0gKmRhdGErKzsKKyNlbmRpZgorCisgICAgayAqPSBtOworICAgIGsgXj0gayA+PiByOworICAgIGsgKj0gbTsKKworICAgIGggXj0gazsKKyAgICBoICo9IG07CisgIH0KKworICBjb25zdCB1bnNpZ25lZCBjaGFyICogZGF0YTIgPSAoY29uc3QgdW5zaWduZWQgY2hhciopZGF0YTsKKworICBzd2l0Y2gobGVuICYgNykKKyAgeworICBjYXNlIDc6IGggXj0gdWludDY0X3QoZGF0YTJbNl0pIDw8IDQ4OworICBjYXNlIDY6IGggXj0gdWludDY0X3QoZGF0YTJbNV0pIDw8IDQwOworICBjYXNlIDU6IGggXj0gdWludDY0X3QoZGF0YTJbNF0pIDw8IDMyOworICBjYXNlIDQ6IGggXj0gdWludDY0X3QoZGF0YTJbM10pIDw8IDI0OworICBjYXNlIDM6IGggXj0gdWludDY0X3QoZGF0YTJbMl0pIDw8IDE2OworICBjYXNlIDI6IGggXj0gdWludDY0X3QoZGF0YTJbMV0pIDw8IDg7CisgIGNhc2UgMTogaCBePSB1aW50NjRfdChkYXRhMlswXSk7CisgICAgICAgICAgaCAqPSBtOworICB9OworCisgIGggXj0gaCA+PiByOworICBoICo9IG07CisgIGggXj0gaCA+PiByOworCisgIHJldHVybiBoOworfQorCisKKy8vIDY0LWJpdCBoYXNoIGZvciAzMi1iaXQgcGxhdGZvcm1zCisKK3VpbnQ2NF90IE11cm11ckhhc2g2NEIgKCBjb25zdCB2b2lkICoga2V5LCBzdGQ6OnNpemVfdCBsZW4sIHVpbnQ2NF90IHNlZWQgKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbSA9IDB4NWJkMWU5OTU7CisgIGNvbnN0IGludCByID0gMjQ7CisKKyAgdW5zaWduZWQgaW50IGgxID0gc2VlZCBeIGxlbjsKKyAgdW5zaWduZWQgaW50IGgyID0gMDsKKworI2lmIGRlZmluZWQoX19hcm0pIHx8IGRlZmluZWQoX19hcm1fXykKKyAgc2l6ZV90IGtzaXplID0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBkYXRhID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilrZXk7CisjZWxzZQorICBjb25zdCB1bnNpZ25lZCBpbnQgKiBkYXRhID0gKGNvbnN0IHVuc2lnbmVkIGludCAqKWtleTsKKyNlbmRpZgorCisgIHVuc2lnbmVkIGludCBrMSwgazI7CisgIHdoaWxlKGxlbiA+PSA4KQorICB7CisjaWYgZGVmaW5lZChfX2FybSkgfHwgZGVmaW5lZChfX2FybV9fKQorICAgIG1lbWNweSgmazEsIGRhdGEsIGtzaXplKTsKKyAgICBkYXRhICs9IGtzaXplOworICAgIG1lbWNweSgmazIsIGRhdGEsIGtzaXplKTsKKyAgICBkYXRhICs9IGtzaXplOworI2Vsc2UKKyAgICBrMSA9ICpkYXRhKys7CisgICAgazIgPSAqZGF0YSsrOworI2VuZGlmCisKKyAgICBrMSAqPSBtOyBrMSBePSBrMSA+PiByOyBrMSAqPSBtOworICAgIGgxICo9IG07IGgxIF49IGsxOworICAgIGxlbiAtPSA0OworCisgICAgazIgKj0gbTsgazIgXj0gazIgPj4gcjsgazIgKj0gbTsKKyAgICBoMiAqPSBtOyBoMiBePSBrMjsKKyAgICBsZW4gLT0gNDsKKyAgfQorCisgIGlmKGxlbiA+PSA0KQorICB7CisjaWYgZGVmaW5lZChfX2FybSkgfHwgZGVmaW5lZChfX2FybV9fKQorICAgIG1lbWNweSgmazEsIGRhdGEsIGtzaXplKTsKKyAgICBkYXRhICs9IGtzaXplOworI2Vsc2UKKyAgICBrMSA9ICpkYXRhKys7CisjZW5kaWYKKyAgICBrMSAqPSBtOyBrMSBePSBrMSA+PiByOyBrMSAqPSBtOworICAgIGgxICo9IG07IGgxIF49IGsxOworICAgIGxlbiAtPSA0OworICB9CisKKyAgc3dpdGNoKGxlbikKKyAgeworICBjYXNlIDM6IGgyIF49ICgodW5zaWduZWQgY2hhciopZGF0YSlbMl0gPDwgMTY7CisgIGNhc2UgMjogaDIgXj0gKCh1bnNpZ25lZCBjaGFyKilkYXRhKVsxXSA8PCA4OworICBjYXNlIDE6IGgyIF49ICgodW5zaWduZWQgY2hhciopZGF0YSlbMF07CisgICAgICBoMiAqPSBtOworICB9OworCisgIGgxIF49IGgyID4+IDE4OyBoMSAqPSBtOworICBoMiBePSBoMSA+PiAyMjsgaDIgKj0gbTsKKyAgaDEgXj0gaDIgPj4gMTc7IGgxICo9IG07CisgIGgyIF49IGgxID4+IDE5OyBoMiAqPSBtOworCisgIHVpbnQ2NF90IGggPSBoMTsKKworICBoID0gKGggPDwgMzIpIHwgaDI7CisKKyAgcmV0dXJuIGg7Cit9CisKKy8vIFRyaWNrIHRvIHRlc3QgZm9yIDY0LWJpdCBhcmNoaXRlY3R1cmUgYXQgY29tcGlsZSB0aW1lLgorbmFtZXNwYWNlIHsKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtZnVuY3Rpb24iCisjZW5kaWYKK3RlbXBsYXRlIDx1bnNpZ25lZCBMPiBpbmxpbmUgdWludDY0X3QgTXVybXVySGFzaE5hdGl2ZUJhY2tlbmQoY29uc3Qgdm9pZCAqIGtleSwgc3RkOjpzaXplX3QgbGVuLCB1aW50NjRfdCBzZWVkKSB7CisgIHJldHVybiBNdXJtdXJIYXNoNjRBKGtleSwgbGVuLCBzZWVkKTsKK30KK3RlbXBsYXRlIDw+IGlubGluZSB1aW50NjRfdCBNdXJtdXJIYXNoTmF0aXZlQmFja2VuZDw0Pihjb25zdCB2b2lkICoga2V5LCBzdGQ6OnNpemVfdCBsZW4sIHVpbnQ2NF90IHNlZWQpIHsKKyAgcmV0dXJuIE11cm11ckhhc2g2NEIoa2V5LCBsZW4sIHNlZWQpOworfQorI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCit9IC8vIG5hbWVzcGFjZQorCit1aW50NjRfdCBNdXJtdXJIYXNoTmF0aXZlKGNvbnN0IHZvaWQgKiBrZXksIHN0ZDo6c2l6ZV90IGxlbiwgdWludDY0X3Qgc2VlZCkgeworICByZXR1cm4gTXVybXVySGFzaE5hdGl2ZUJhY2tlbmQ8c2l6ZW9mKHZvaWQqKT4oa2V5LCBsZW4sIHNlZWQpOworfQorCit9IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9tdXJtdXJfaGFzaC5oaCBiL3NyYy9rZW5sbS91dGlsL211cm11cl9oYXNoLmhoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9tdXJtdXJfaGFzaC5oaApyZW5hbWUgdG8gc3JjL2tlbmxtL3V0aWwvbXVybXVyX2hhc2guaGgKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3BhcmFsbGVsX3JlYWQuY2MgYi9zcmMva2VubG0vdXRpbC9wYXJhbGxlbF9yZWFkLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wYXJhbGxlbF9yZWFkLmNjCnJlbmFtZSB0byBzcmMva2VubG0vdXRpbC9wYXJhbGxlbF9yZWFkLmNjCmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wYXJhbGxlbF9yZWFkLmhoIGIvc3JjL2tlbmxtL3V0aWwvcGFyYWxsZWxfcmVhZC5oaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvcGFyYWxsZWxfcmVhZC5oaApyZW5hbWUgdG8gc3JjL2tlbmxtL3V0aWwvcGFyYWxsZWxfcmVhZC5oaApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvcGNxdWV1ZS5oaCBiL3NyYy9rZW5sbS91dGlsL3BjcXVldWUuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjODY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3BjcXVldWUuaGgKQEAgLTAsMCArMSwxNTYgQEAKKyNpZm5kZWYgVVRJTF9QQ1FVRVVFX0gKKyNkZWZpbmUgVVRJTF9QQ1FVRVVFX0gKKworI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgorCisjaW5jbHVkZSA8Ym9vc3QvaW50ZXJwcm9jZXNzL3N5bmMvaW50ZXJwcm9jZXNzX3NlbWFwaG9yZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX2FycmF5LmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQvbXV0ZXguaHBwPgorI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkuaHBwPgorCisjaW5jbHVkZSA8Y2Vycm5vPgorCisjaWZkZWYgX19BUFBMRV9fCisjaW5jbHVkZSA8bWFjaC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3Rhc2suaD4KKyNpbmNsdWRlIDxtYWNoL21hY2hfdHJhcHMuaD4KKyNpbmNsdWRlIDxtYWNoL21hY2guaD4KKyNlbmRpZiAvLyBfX0FQUExFX18KKworbmFtZXNwYWNlIHV0aWwgeworCisvKiBPUyBYIE1hdmVyaWNrIGFuZCBCb29zdCBpbnRlcnByb2Nlc3Mgd2VyZSBkb2luZyAiRnVuY3Rpb24gbm90IGltcGxlbWVudGVkLiIKKyAqIFNvIHRoaXMgaXMgbXkgb3duIHdyYXBwZXIgYXJvdW5kIHRoZSBtYWNoIGtlcm5lbCBBUElzLgorICovCisjaWZkZWYgX19BUFBMRV9fCisKKyNkZWZpbmUgTUFDSF9DQUxMKGNhbGwpIFVUSUxfVEhST1dfSUYoS0VSTl9TVUNDRVNTICE9IChjYWxsKSwgRXhjZXB0aW9uLCAiTWFjaCBjYWxsIGZhaWx1cmUiKQorCitjbGFzcyBTZW1hcGhvcmUgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgU2VtYXBob3JlKGludCB2YWx1ZSkgOiB0YXNrXyhtYWNoX3Rhc2tfc2VsZigpKSB7CisgICAgICBNQUNIX0NBTEwoc2VtYXBob3JlX2NyZWF0ZSh0YXNrXywgJmJhY2tfLCBTWU5DX1BPTElDWV9GSUZPLCB2YWx1ZSkpOworICAgIH0KKworICAgIH5TZW1hcGhvcmUoKSB7CisgICAgICBNQUNIX0NBTEwoc2VtYXBob3JlX2Rlc3Ryb3kodGFza18sIGJhY2tfKSk7CisgICAgfQorCisgICAgdm9pZCB3YWl0KCkgeworICAgICAgTUFDSF9DQUxMKHNlbWFwaG9yZV93YWl0KGJhY2tfKSk7CisgICAgfQorCisgICAgdm9pZCBwb3N0KCkgeworICAgICAgTUFDSF9DQUxMKHNlbWFwaG9yZV9zaWduYWwoYmFja18pKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzZW1hcGhvcmVfdCBiYWNrXzsKKyAgICB0YXNrX3QgdGFza187Cit9OworCitpbmxpbmUgdm9pZCBXYWl0U2VtYXBob3JlKFNlbWFwaG9yZSAmc2VtYXBob3JlKSB7CisgIHNlbWFwaG9yZS53YWl0KCk7Cit9CisKKyNlbHNlCit0eXBlZGVmIGJvb3N0OjppbnRlcnByb2Nlc3M6OmludGVycHJvY2Vzc19zZW1hcGhvcmUgU2VtYXBob3JlOworCitpbmxpbmUgdm9pZCBXYWl0U2VtYXBob3JlIChTZW1hcGhvcmUgJm9uKSB7CisgIHdoaWxlICgxKSB7CisgICAgdHJ5IHsKKyAgICAgIG9uLndhaXQoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXRjaCAoYm9vc3Q6OmludGVycHJvY2Vzczo6aW50ZXJwcm9jZXNzX2V4Y2VwdGlvbiAmZSkgeworICAgICAgaWYgKGUuZ2V0X25hdGl2ZV9lcnJvcigpICE9IEVJTlRSKSB7CisgICAgICAgIHRocm93OworICAgICAgfQorICAgIH0KKyAgfQorfQorCisjZW5kaWYgLy8gX19BUFBMRV9fCisKKy8qKgorICogUHJvZHVjZXIgY29uc3VtZXIgcXVldWUgc2FmZSBmb3IgbXVsdGlwbGUgcHJvZHVjZXJzIGFuZCBtdWx0aXBsZSBjb25zdW1lcnMuCisgKiBUIG11c3QgYmUgZGVmYXVsdCBjb25zdHJ1Y3RhYmxlIGFuZCBoYXZlIG9wZXJhdG9yPS4KKyAqIFRoZSB2YWx1ZSBpcyBjb3BpZWQgdHdpY2UgZm9yIENvbnN1bWUoVCAmb3V0KSBvciB0aHJlZSB0aW1lcyBmb3IgQ29uc3VtZSgpLAorICogc28gbGFyZ2VyIG9iamVjdHMgc2hvdWxkIGJlIHBhc3NlZCB2aWEgcG9pbnRlci4KKyAqIFN0cm9uZyBleGNlcHRpb24gZ3VhcmFudGVlIGlmIG9wZXJhdG9yPSB0aHJvd3MuICBVbmRlZmluZWQgaWYgc2VtYXBob3JlcyB0aHJvdy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFBDUXVldWUgOiBib29zdDo6bm9uY29weWFibGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUENRdWV1ZShzaXplX3Qgc2l6ZSkKKyAgIDogZW1wdHlfKHNpemUpLCB1c2VkXygwKSwKKyAgICAgc3RvcmFnZV8obmV3IFRbc2l6ZV0pLAorICAgICBlbmRfKHN0b3JhZ2VfLmdldCgpICsgc2l6ZSksCisgICAgIHByb2R1Y2VfYXRfKHN0b3JhZ2VfLmdldCgpKSwKKyAgICAgY29uc3VtZV9hdF8oc3RvcmFnZV8uZ2V0KCkpIHt9CisKKyAgLy8gQWRkIGEgdmFsdWUgdG8gdGhlIHF1ZXVlLgorICB2b2lkIFByb2R1Y2UoY29uc3QgVCAmdmFsKSB7CisgICAgV2FpdFNlbWFwaG9yZShlbXB0eV8pOworICAgIHsKKyAgICAgIGJvb3N0Ojp1bmlxdWVfbG9jazxib29zdDo6bXV0ZXg+IHByb2R1Y2VfbG9jayhwcm9kdWNlX2F0X211dGV4Xyk7CisgICAgICB0cnkgeworICAgICAgICAqcHJvZHVjZV9hdF8gPSB2YWw7CisgICAgICB9CisgICAgICBjYXRjaCAoLi4uKSB7CisgICAgICAgIGVtcHR5Xy5wb3N0KCk7CisgICAgICAgIHRocm93OworICAgICAgfQorICAgICAgaWYgKCsrcHJvZHVjZV9hdF8gPT0gZW5kXykgcHJvZHVjZV9hdF8gPSBzdG9yYWdlXy5nZXQoKTsKKyAgICB9CisgICAgdXNlZF8ucG9zdCgpOworICB9CisKKyAgLy8gQ29uc3VtZSBhIHZhbHVlLCBhc3NpZ25pbmcgaXQgdG8gb3V0LgorICBUJiBDb25zdW1lKFQgJm91dCkgeworICAgIFdhaXRTZW1hcGhvcmUodXNlZF8pOworICAgIHsKKyAgICAgIGJvb3N0Ojp1bmlxdWVfbG9jazxib29zdDo6bXV0ZXg+IGNvbnN1bWVfbG9jayhjb25zdW1lX2F0X211dGV4Xyk7CisgICAgICB0cnkgeworICAgICAgICBvdXQgPSAqY29uc3VtZV9hdF87CisgICAgICB9CisgICAgICBjYXRjaCAoLi4uKSB7CisgICAgICAgIHVzZWRfLnBvc3QoKTsKKyAgICAgICAgdGhyb3c7CisgICAgICB9CisgICAgICBpZiAoKytjb25zdW1lX2F0XyA9PSBlbmRfKSBjb25zdW1lX2F0XyA9IHN0b3JhZ2VfLmdldCgpOworICAgIH0KKyAgICBlbXB0eV8ucG9zdCgpOworICAgIHJldHVybiBvdXQ7CisgIH0KKworICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIENvbnN1bWUgdGhhdCBjb3BpZXMgdGhlIHZhbHVlIHRvIHJldHVybi4KKyAgLy8gVGhlIG90aGVyIHZlcnNpb24gaXMgZmFzdGVyLgorICBUIENvbnN1bWUoKSB7CisgICAgVCByZXQ7CisgICAgQ29uc3VtZShyZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE51bWJlciBvZiBlbXB0eSBzcGFjZXMgaW4gc3RvcmFnZV8uCisgIFNlbWFwaG9yZSBlbXB0eV87CisgIC8vIE51bWJlciBvZiBvY2N1cGllZCBzcGFjZXMgaW4gc3RvcmFnZV8uCisgIFNlbWFwaG9yZSB1c2VkXzsKKworICBib29zdDo6c2NvcGVkX2FycmF5PFQ+IHN0b3JhZ2VfOworCisgIFQgKmNvbnN0IGVuZF87CisKKyAgLy8gSW5kZXggZm9yIG5leHQgd3JpdGUgaW4gc3RvcmFnZV8uCisgIFQgKnByb2R1Y2VfYXRfOworICBib29zdDo6bXV0ZXggcHJvZHVjZV9hdF9tdXRleF87CisKKyAgLy8gSW5kZXggZm9yIG5leHQgcmVhZCBmcm9tIHN0b3JhZ2VfLgorICBUICpjb25zdW1lX2F0XzsKKyAgYm9vc3Q6Om11dGV4IGNvbnN1bWVfYXRfbXV0ZXhfOworCit9OworCit9IC8vIG5hbWVzcGFjZSB1dGlsCisKKyNlbmRpZiAvLyBVVElMX1BDUVVFVUVfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvcGNxdWV1ZV90ZXN0LmNjIGIvc3JjL2tlbmxtL3V0aWwvcGNxdWV1ZV90ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9wY3F1ZXVlX3Rlc3QuY2MKcmVuYW1lIHRvIHNyYy9rZW5sbS91dGlsL3BjcXVldWVfdGVzdC5jYwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvcG9vbC5jYyBiL3NyYy9rZW5sbS91dGlsL3Bvb2wuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2NDE3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3Bvb2wuY2MKQEAgLTAsMCArMSwzOCBAQAorI2luY2x1ZGUgInV0aWwvcG9vbC5oaCIKKworI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgorCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIHV0aWwgeworCitQb29sOjpQb29sKCkgeworICBjdXJyZW50XyA9IE5VTEw7CisgIGN1cnJlbnRfZW5kXyA9IE5VTEw7Cit9CisKK1Bvb2w6On5Qb29sKCkgeworICBGcmVlQWxsKCk7Cit9CisKK3ZvaWQgUG9vbDo6RnJlZUFsbCgpIHsKKyAgZm9yIChzdGQ6OnZlY3Rvcjx2b2lkICo+Ojpjb25zdF9pdGVyYXRvciBpKGZyZWVfbGlzdF8uYmVnaW4oKSk7IGkgIT0gZnJlZV9saXN0Xy5lbmQoKTsgKytpKSB7CisgICAgZnJlZSgqaSk7CisgIH0KKyAgZnJlZV9saXN0Xy5jbGVhcigpOworICBjdXJyZW50XyA9IE5VTEw7CisgIGN1cnJlbnRfZW5kXyA9IE5VTEw7Cit9CisKK3ZvaWQgKlBvb2w6Ok1vcmUoc3RkOjpzaXplX3Qgc2l6ZSkgeworICBzdGQ6OnNpemVfdCBhbW91bnQgPSBzdGQ6Om1heChzdGF0aWNfY2FzdDxzaXplX3Q+KDMyKSA8PCBmcmVlX2xpc3RfLnNpemUoKSwgc2l6ZSk7CisgIHVpbnQ4X3QgKnJldCA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihNYWxsb2NPclRocm93KGFtb3VudCkpOworICBmcmVlX2xpc3RfLnB1c2hfYmFjayhyZXQpOworICBjdXJyZW50XyA9IHJldCArIHNpemU7CisgIGN1cnJlbnRfZW5kXyA9IHJldCArIGFtb3VudDsKKyAgcmV0dXJuIHJldDsKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvcG9vbC5oaCBiL3NyYy9rZW5sbS91dGlsL3Bvb2wuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExYjZkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3Bvb2wuaGgKQEAgLTAsMCArMSw0NCBAQAorLy8gVmVyeSBzaW1wbGUgcG9vbC4gIEl0IGNhbiBvbmx5IGFsbG9jYXRlIG1lbW9yeS4gIEFuZCBhbGwgb2YgdGhlIG1lbW9yeSBpdAorLy8gYWxsb2NhdGVzIG11c3QgYmUgZnJlZWQgYXQgdGhlIHNhbWUgdGltZS4KKworI2lmbmRlZiBVVElMX1BPT0xfSAorI2RlZmluZSBVVElMX1BPT0xfSAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgdXRpbCB7CisKK2NsYXNzIFBvb2wgeworICBwdWJsaWM6CisgICAgUG9vbCgpOworCisgICAgflBvb2woKTsKKworICAgIHZvaWQgKkFsbG9jYXRlKHN0ZDo6c2l6ZV90IHNpemUpIHsKKyAgICAgIHZvaWQgKnJldCA9IGN1cnJlbnRfOworICAgICAgY3VycmVudF8gKz0gc2l6ZTsKKyAgICAgIGlmIChjdXJyZW50XyA8IGN1cnJlbnRfZW5kXykgeworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE1vcmUoc2l6ZSk7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBGcmVlQWxsKCk7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkICpNb3JlKHN0ZDo6c2l6ZV90IHNpemUpOworCisgICAgc3RkOjp2ZWN0b3I8dm9pZCAqPiBmcmVlX2xpc3RfOworCisgICAgdWludDhfdCAqY3VycmVudF8sICpjdXJyZW50X2VuZF87CisKKyAgICAvLyBubyBjb3B5aW5nCisgICAgUG9vbChjb25zdCBQb29sICYpOworICAgIFBvb2wgJm9wZXJhdG9yPShjb25zdCBQb29sICYpOworfTsKKworfSAvLyBuYW1lc3BhY2UgdXRpbAorCisjZW5kaWYgLy8gVVRJTF9QT09MX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3Byb2JpbmdfaGFzaF90YWJsZS5oaCBiL3NyYy9rZW5sbS91dGlsL3Byb2JpbmdfaGFzaF90YWJsZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzhkZTkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvcHJvYmluZ19oYXNoX3RhYmxlLmhoCkBAIC0wLDAgKzEsNDIxIEBACisjaWZuZGVmIFVUSUxfUFJPQklOR19IQVNIX1RBQkxFX0gKKyNkZWZpbmUgVVRJTF9QUk9CSU5HX0hBU0hfVEFCTEVfSAorCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9tbWFwLmhoIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgdXRpbCB7CisKKy8qIFRocm93biB3aGVuIHRhYmxlIGdyb3dzIHRvbyBsYXJnZSAqLworY2xhc3MgUHJvYmluZ1NpemVFeGNlcHRpb24gOiBwdWJsaWMgRXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIFByb2JpbmdTaXplRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICAgIH5Qcm9iaW5nU2l6ZUV4Y2VwdGlvbigpIHRocm93KCkge30KK307CisKKy8vIHN0ZDo6aWRlbnRpdHkgaXMgYW4gU0dJIGV4dGVuc2lvbiA6LSgKK3N0cnVjdCBJZGVudGl0eUhhc2ggeworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gVCBvcGVyYXRvcigpKFQgYXJnKSBjb25zdCB7IHJldHVybiBhcmc7IH0KK307CisKK2NsYXNzIERpdk1vZCB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBEaXZNb2Qoc3RkOjpzaXplX3QgYnVja2V0cykgOiBidWNrZXRzXyhidWNrZXRzKSB7fQorCisgICAgc3RhdGljIHN0ZDo6c2l6ZV90IFJvdW5kQnVja2V0cyhzdGQ6OnNpemVfdCBmcm9tKSB7CisgICAgICByZXR1cm4gZnJvbTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSXQ+IEl0IElkZWFsKEl0IGJlZ2luLCB1aW50NjRfdCBoYXNoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmVnaW4gKyAoaGFzaCAlIGJ1Y2tldHNfKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZUl0LCBjbGFzcyBPdXRJdD4gdm9pZCBOZXh0KEJhc2VJdCBiZWdpbiwgQmFzZUl0IGVuZCwgT3V0SXQgJml0KSBjb25zdCB7CisgICAgICBpZiAoKytpdCA9PSBlbmQpIGl0ID0gYmVnaW47CisgICAgfQorCisgICAgdm9pZCBEb3VibGUoKSB7CisgICAgICBidWNrZXRzXyAqPSAyOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6c2l6ZV90IGJ1Y2tldHNfOworfTsKKworY2xhc3MgUG93ZXIyTW9kIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFBvd2VyMk1vZChzdGQ6OnNpemVfdCBidWNrZXRzKSB7CisgICAgICBVVElMX1RIUk9XX0lGKCFidWNrZXRzIHx8ICgoKGJ1Y2tldHMgLSAxKSAmIGJ1Y2tldHMpKSwgUHJvYmluZ1NpemVFeGNlcHRpb24sICJTaXplICIgPDwgYnVja2V0cyA8PCAiIGlzIG5vdCBhIHBvd2VyIG9mIDIuIik7CisgICAgICBtYXNrXyA9IGJ1Y2tldHMgLSAxOworICAgIH0KKworICAgIC8vIFJvdW5kIHVwIHRvIG5leHQgcG93ZXIgb2YgMi4KKyAgICBzdGF0aWMgc3RkOjpzaXplX3QgUm91bmRCdWNrZXRzKHN0ZDo6c2l6ZV90IGZyb20pIHsKKyAgICAgIC0tZnJvbTsKKyAgICAgIGZyb20gfD0gZnJvbSA+PiAxOworICAgICAgZnJvbSB8PSBmcm9tID4+IDI7CisgICAgICBmcm9tIHw9IGZyb20gPj4gNDsKKyAgICAgIGZyb20gfD0gZnJvbSA+PiA4OworICAgICAgZnJvbSB8PSBmcm9tID4+IDE2OworICAgICAgZnJvbSB8PSBmcm9tID4+IDMyOworICAgICAgcmV0dXJuIGZyb20gKyAxOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBJdD4gSXQgSWRlYWwoSXQgYmVnaW4sIHVpbnQ2NF90IGhhc2gpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiZWdpbiArIChoYXNoICYgbWFza18pOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBCYXNlSXQsIGNsYXNzIE91dEl0PiB2b2lkIE5leHQoQmFzZUl0IGJlZ2luLCBCYXNlSXQgLyplbmQqLywgT3V0SXQgJml0KSBjb25zdCB7CisgICAgICBpdCA9IGJlZ2luICsgKChpdCAtIGJlZ2luICsgMSkgJiBtYXNrXyk7CisgICAgfQorCisgICAgdm9pZCBEb3VibGUoKSB7CisgICAgICBtYXNrXyA9IChtYXNrXyA8PCAxKSB8IDE7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzaXplX3QgbWFza187Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRW50cnlULCBjbGFzcyBIYXNoVCwgY2xhc3MgRXF1YWxUPiBjbGFzcyBBdXRvUHJvYmluZzsKKworLyogTm9uLXN0YW5kYXJkIGhhc2ggdGFibGUKKyAqIEJ1Y2tldHMgbXVzdCBiZSBzZXQgYXQgdGhlIGJlZ2lubmluZyBhbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWF4aW11bSBudW1iZXIKKyAqIG9mIGVsZW1lbnRzLCBlbHNlIGl0IHRocm93cyBQcm9iaW5nU2l6ZUV4Y2VwdGlvbi4KKyAqIE1lbW9yeSBtYW5hZ2VtZW50IGFuZCBpbml0aWFsaXphdGlvbiBpcyBleHRlcm5hbGl6ZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8KKyAqIHNlcmlhbGl6ZSB0aGVzZSB0byBkaXNrIGFuZCBsb2FkIHRoZW0gcXVpY2tseS4KKyAqIFVzZXMgbGluZWFyIHByb2JpbmcgdG8gZmluZCB2YWx1ZS4KKyAqIE9ubHkgaW5zZXJ0IGFuZCBsb29rdXAgb3BlcmF0aW9ucy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIEVudHJ5VCwgY2xhc3MgSGFzaFQsIGNsYXNzIEVxdWFsVCA9IHN0ZDo6ZXF1YWxfdG88dHlwZW5hbWUgRW50cnlUOjpLZXk+LCBjbGFzcyBNb2RUID0gRGl2TW9kPiBjbGFzcyBQcm9iaW5nSGFzaFRhYmxlIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgRW50cnlUIEVudHJ5OworICAgIHR5cGVkZWYgdHlwZW5hbWUgRW50cnk6OktleSBLZXk7CisgICAgdHlwZWRlZiBjb25zdCBFbnRyeSAqQ29uc3RJdGVyYXRvcjsKKyAgICB0eXBlZGVmIEVudHJ5ICpNdXRhYmxlSXRlcmF0b3I7CisgICAgdHlwZWRlZiBIYXNoVCBIYXNoOworICAgIHR5cGVkZWYgRXF1YWxUIEVxdWFsOworICAgIHR5cGVkZWYgTW9kVCBNb2Q7CisKKyAgICBzdGF0aWMgdWludDY0X3QgU2l6ZSh1aW50NjRfdCBlbnRyaWVzLCBmbG9hdCBtdWx0aXBsaWVyKSB7CisgICAgICB1aW50NjRfdCBidWNrZXRzID0gTW9kOjpSb3VuZEJ1Y2tldHMoc3RkOjptYXgoZW50cmllcyArIDEsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihtdWx0aXBsaWVyICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KGVudHJpZXMpKSkpOworICAgICAgcmV0dXJuIGJ1Y2tldHMgKiBzaXplb2YoRW50cnkpOworICAgIH0KKworICAgIC8vIE11c3QgYmUgYXNzaWduZWQgdG8gbGF0ZXIuCisgICAgUHJvYmluZ0hhc2hUYWJsZSgpIDogbW9kXygxKSwgZW50cmllc18oMCkKKyNpZmRlZiBERUJVRworICAgICAgLCBpbml0aWFsaXplZF8oZmFsc2UpCisjZW5kaWYKKyAgICB7fQorCisgICAgUHJvYmluZ0hhc2hUYWJsZSh2b2lkICpzdGFydCwgc3RkOjpzaXplX3QgYWxsb2NhdGVkLCBjb25zdCBLZXkgJmludmFsaWQgPSBLZXkoKSwgY29uc3QgSGFzaCAmaGFzaF9mdW5jID0gSGFzaCgpLCBjb25zdCBFcXVhbCAmZXF1YWxfZnVuYyA9IEVxdWFsKCkpCisgICAgICA6IGJlZ2luXyhyZWludGVycHJldF9jYXN0PE11dGFibGVJdGVyYXRvcj4oc3RhcnQpKSwKKyAgICAgICAgZW5kXyhiZWdpbl8gKyBhbGxvY2F0ZWQgLyBzaXplb2YoRW50cnkpKSwKKyAgICAgICAgYnVja2V0c18oZW5kXyAtIGJlZ2luXyksCisgICAgICAgIGludmFsaWRfKGludmFsaWQpLAorICAgICAgICBoYXNoXyhoYXNoX2Z1bmMpLAorICAgICAgICBlcXVhbF8oZXF1YWxfZnVuYyksCisgICAgICAgIG1vZF8oZW5kXyAtIGJlZ2luXyksCisgICAgICAgIGVudHJpZXNfKDApCisjaWZkZWYgREVCVUcKKyAgICAgICAgLCBpbml0aWFsaXplZF8odHJ1ZSkKKyNlbmRpZgorICAgIHt9CisKKyAgICB2b2lkIFJlbG9jYXRlKHZvaWQgKm5ld19iYXNlKSB7CisgICAgICBiZWdpbl8gPSByZWludGVycHJldF9jYXN0PE11dGFibGVJdGVyYXRvcj4obmV3X2Jhc2UpOworICAgICAgZW5kXyA9IGJlZ2luXyArIGJ1Y2tldHNfOworICAgIH0KKworICAgIE11dGFibGVJdGVyYXRvciBJZGVhbChjb25zdCBLZXkga2V5KSB7CisgICAgICByZXR1cm4gbW9kXy5JZGVhbChiZWdpbl8sIGhhc2hfKGtleSkpOworICAgIH0KKyAgICBDb25zdEl0ZXJhdG9yIElkZWFsKGNvbnN0IEtleSBrZXkpIGNvbnN0IHsKKyAgICAgIHJldHVybiBtb2RfLklkZWFsKGJlZ2luXywgaGFzaF8oa2V5KSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IE11dGFibGVJdGVyYXRvciBJbnNlcnQoY29uc3QgVCAmdCkgeworI2lmZGVmIERFQlVHCisgICAgICBhc3NlcnQoaW5pdGlhbGl6ZWRfKTsKKyNlbmRpZgorICAgICAgVVRJTF9USFJPV19JRigrK2VudHJpZXNfID49IGJ1Y2tldHNfLCBQcm9iaW5nU2l6ZUV4Y2VwdGlvbiwgIkhhc2ggdGFibGUgd2l0aCAiIDw8IGJ1Y2tldHNfIDw8ICIgYnVja2V0cyBpcyBmdWxsLiIpOworICAgICAgcmV0dXJuIFVuY2hlY2tlZEluc2VydCh0KTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIGZvdW5kIChhbmQgbm90IGluc2VydGVkKS4gIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIEZpbmQgYnV0IHRoZSBvcHBvc2l0ZSBvZiBoYXNoX21hcCEKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gYm9vbCBGaW5kT3JJbnNlcnQoY29uc3QgVCAmdCwgTXV0YWJsZUl0ZXJhdG9yICZvdXQpIHsKKyNpZmRlZiBERUJVRworICAgICAgYXNzZXJ0KGluaXRpYWxpemVkXyk7CisjZW5kaWYKKyAgICAgIGZvciAoTXV0YWJsZUl0ZXJhdG9yIGkgPSBJZGVhbCh0LkdldEtleSgpKTs7bW9kXy5OZXh0KGJlZ2luXywgZW5kXywgaSkpIHsKKyAgICAgICAgS2V5IGdvdChpLT5HZXRLZXkoKSk7CisgICAgICAgIGlmIChlcXVhbF8oZ290LCB0LkdldEtleSgpKSkgeyBvdXQgPSBpOyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICBpZiAoZXF1YWxfKGdvdCwgaW52YWxpZF8pKSB7CisgICAgICAgICAgVVRJTF9USFJPV19JRigrK2VudHJpZXNfID49IGJ1Y2tldHNfLCBQcm9iaW5nU2l6ZUV4Y2VwdGlvbiwgIkhhc2ggdGFibGUgd2l0aCAiIDw8IGJ1Y2tldHNfIDw8ICIgYnVja2V0cyBpcyBmdWxsLiIpOworICAgICAgICAgICppID0gdDsKKyAgICAgICAgICBvdXQgPSBpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHZvaWQgRmluaXNoZWRJbnNlcnRpbmcoKSB7fQorCisgICAgLy8gRG9uJ3QgY2hhbmdlIGFueXRoaW5nIHJlbGF0ZWQgdG8gR2V0S2V5LAorICAgIHRlbXBsYXRlIDxjbGFzcyBLZXk+IGJvb2wgVW5zYWZlTXV0YWJsZUZpbmQoY29uc3QgS2V5IGtleSwgTXV0YWJsZUl0ZXJhdG9yICZvdXQpIHsKKyNpZmRlZiBERUJVRworICAgICAgYXNzZXJ0KGluaXRpYWxpemVkXyk7CisjZW5kaWYKKyAgICAgIGZvciAoTXV0YWJsZUl0ZXJhdG9yIGkoSWRlYWwoa2V5KSk7OyBtb2RfLk5leHQoYmVnaW5fLCBlbmRfLCBpKSkgeworICAgICAgICBLZXkgZ290KGktPkdldEtleSgpKTsKKyAgICAgICAgaWYgKGVxdWFsXyhnb3QsIGtleSkpIHsgb3V0ID0gaTsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgaWYgKGVxdWFsXyhnb3QsIGludmFsaWRfKSkgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIC8vIExpa2UgVW5zYWZlTXV0YWJsZUZpbmQsIGJ1dCB0aGUga2V5IG11c3QgYmUgdGhlcmUuCisgICAgdGVtcGxhdGUgPGNsYXNzIEtleT4gTXV0YWJsZUl0ZXJhdG9yIFVuc2FmZU11dGFibGVNdXN0RmluZChjb25zdCBLZXkga2V5KSB7CisgICAgICBmb3IgKE11dGFibGVJdGVyYXRvciBpKElkZWFsKGtleSkpOzsgbW9kXy5OZXh0KGJlZ2luXywgZW5kXywgaSkpIHsKKyAgICAgICAgS2V5IGdvdChpLT5HZXRLZXkoKSk7CisgICAgICAgIGlmIChlcXVhbF8oZ290LCBrZXkpKSB7IHJldHVybiBpOyB9CisgICAgICAgIGFzc2VydCghZXF1YWxfKGdvdCwgaW52YWxpZF8pKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJdGVyYXRvciBpcyBib3RoIGlucHV0IGFuZCBvdXRwdXQuCisgICAgdGVtcGxhdGUgPGNsYXNzIEtleT4gYm9vbCBGaW5kRnJvbUlkZWFsKGNvbnN0IEtleSBrZXksIENvbnN0SXRlcmF0b3IgJmkpIGNvbnN0IHsKKyNpZmRlZiBERUJVRworICAgICAgYXNzZXJ0KGluaXRpYWxpemVkXyk7CisjZW5kaWYKKyAgICAgIGZvciAoOzsgbW9kXy5OZXh0KGJlZ2luXywgZW5kXywgaSkpIHsKKyAgICAgICAgS2V5IGdvdChpLT5HZXRLZXkoKSk7CisgICAgICAgIGlmIChlcXVhbF8oZ290LCBrZXkpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGVxdWFsXyhnb3QsIGludmFsaWRfKSkgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBLZXk+IGJvb2wgRmluZChjb25zdCBLZXkga2V5LCBDb25zdEl0ZXJhdG9yICZvdXQpIGNvbnN0IHsKKyAgICAgIG91dCA9IElkZWFsKGtleSk7CisgICAgICByZXR1cm4gRmluZEZyb21JZGVhbChrZXksIG91dCk7CisgICAgfQorCisgICAgLy8gTGlrZSBGaW5kIGJ1dCB3ZSdyZSBzdXJlIGl0IG11c3QgYmUgdGhlcmUuCisgICAgdGVtcGxhdGUgPGNsYXNzIEtleT4gQ29uc3RJdGVyYXRvciBNdXN0RmluZChjb25zdCBLZXkga2V5KSBjb25zdCB7CisgICAgICBmb3IgKENvbnN0SXRlcmF0b3IgaShJZGVhbChrZXkpKTs7IG1vZF8uTmV4dChiZWdpbl8sIGVuZF8sIGkpKSB7CisgICAgICAgIEtleSBnb3QoaS0+R2V0S2V5KCkpOworICAgICAgICBpZiAoZXF1YWxfKGdvdCwga2V5KSkgeyByZXR1cm4gaTsgfQorICAgICAgICBhc3NlcnQoIWVxdWFsXyhnb3QsIGludmFsaWRfKSk7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBDbGVhcigpIHsKKyAgICAgIEVudHJ5IGludmFsaWQ7CisgICAgICBpbnZhbGlkLlNldEtleShpbnZhbGlkXyk7CisgICAgICBzdGQ6OmZpbGwoYmVnaW5fLCBlbmRfLCBpbnZhbGlkKTsKKyAgICAgIGVudHJpZXNfID0gMDsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gbnVtYmVyIG9mIGVudHJpZXMgYXNzdW1pbmcgbm8gc2VyaWFsaXphdGlvbiB3ZW50IG9uLgorICAgIHN0ZDo6c2l6ZV90IFNpemVOb1NlcmlhbGl6YXRpb24oKSBjb25zdCB7CisgICAgICByZXR1cm4gZW50cmllc187CisgICAgfQorCisgICAgLy8gUmV0dXJuIG1lbW9yeSBzaXplIGV4cGVjdGVkIGJ5IERvdWJsZS4KKyAgICBzdGQ6OnNpemVfdCBEb3VibGVUbygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBidWNrZXRzXyAqIDIgKiBzaXplb2YoRW50cnkpOworICAgIH0KKworICAgIC8vIEluZm9ybSB0aGUgdGFibGUgdGhhdCBpdCBoYXMgZG91YmxlIHRoZSBhbW91bnQgb2YgbWVtb3J5LgorICAgIC8vIFBhc3MgY2xlYXJfbmV3ID0gZmFsc2UgaWYgeW91IGFyZSBzdXJlIHRoZSBuZXcgbWVtb3J5IGlzIGluaXRpYWxpemVkCisgICAgLy8gcHJvcGVybHkgKHRvIGludmFsaWRfKSBpLmUuIGJ5IG1yZW1hcC4KKyAgICB2b2lkIERvdWJsZSh2b2lkICpuZXdfYmFzZSwgYm9vbCBjbGVhcl9uZXcgPSB0cnVlKSB7CisgICAgICBiZWdpbl8gPSBzdGF0aWNfY2FzdDxNdXRhYmxlSXRlcmF0b3I+KG5ld19iYXNlKTsKKyAgICAgIE11dGFibGVJdGVyYXRvciBvbGRfZW5kID0gYmVnaW5fICsgYnVja2V0c187CisgICAgICBidWNrZXRzXyAqPSAyOworICAgICAgZW5kXyA9IGJlZ2luXyArIGJ1Y2tldHNfOworICAgICAgbW9kXy5Eb3VibGUoKTsKKyAgICAgIGlmIChjbGVhcl9uZXcpIHsKKyAgICAgICAgRW50cnkgaW52YWxpZDsKKyAgICAgICAgaW52YWxpZC5TZXRLZXkoaW52YWxpZF8pOworICAgICAgICBzdGQ6OmZpbGwob2xkX2VuZCwgZW5kXywgaW52YWxpZCk7CisgICAgICB9CisgICAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gcm9sbGVkX292ZXI7CisgICAgICAvLyBNb3ZlIHJvbGwtb3ZlciBlbnRyaWVzIHRvIGEgYnVmZmVyIGJlY2F1c2UgdGhleSBtaWdodCBub3Qgcm9sbCBvdmVyIGFueW1vcmUuICBUaGlzIHNob3VsZCBiZSBzbWFsbC4KKyAgICAgIGZvciAoTXV0YWJsZUl0ZXJhdG9yIGkgPSBiZWdpbl87IGkgIT0gb2xkX2VuZCAmJiAhZXF1YWxfKGktPkdldEtleSgpLCBpbnZhbGlkXyk7ICsraSkgeworICAgICAgICByb2xsZWRfb3Zlci5wdXNoX2JhY2soKmkpOworICAgICAgICBpLT5TZXRLZXkoaW52YWxpZF8pOworICAgICAgfQorICAgICAgLyogUmUtaW5zZXJ0IGV2ZXJ5dGhpbmcuICBFbnRyaWVzIG1pZ2h0IGdvIGJhY2t3YXJkcyB0byB0YWtlIG92ZXIgYQorICAgICAgICogcmVjZW50bHkgb3BlbmVkIGdhcCwgc3RheSwgbW92ZSB0byBuZXcgdGVycml0b3J5LCBvciB3cmFwIGFyb3VuZC4gICBJZgorICAgICAgICogYW4gZW50cnkgd3JhcHMgYXJvdW5kLCBpdCBtaWdodCBnbyB0byBhIHBvaW50ZXIgZ3JlYXRlciB0aGFuIGkgKHdoaWNoCisgICAgICAgKiBjYW4gaGFwcGVuIGF0IHRoZSBiZWdpbm5pbmcpIGFuZCBpdCB3aWxsIGJlIHJldmlzaXRlZCB0byBwb3NzaWJseSBmaWxsCisgICAgICAgKiBpbiBhIGdhcCBjcmVhdGVkIGxhdGVyLgorICAgICAgICovCisgICAgICBFbnRyeSB0ZW1wOworICAgICAgZm9yIChNdXRhYmxlSXRlcmF0b3IgaSA9IGJlZ2luXzsgaSAhPSBvbGRfZW5kOyArK2kpIHsKKyAgICAgICAgaWYgKCFlcXVhbF8oaS0+R2V0S2V5KCksIGludmFsaWRfKSkgeworICAgICAgICAgIHRlbXAgPSAqaTsKKyAgICAgICAgICBpLT5TZXRLZXkoaW52YWxpZF8pOworICAgICAgICAgIFVuY2hlY2tlZEluc2VydCh0ZW1wKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gUHV0IHRoZSByb2xsLW92ZXIgZW50cmllcyBiYWNrIGluLgorICAgICAgZm9yICh0eXBlbmFtZSBzdGQ6OnZlY3RvcjxFbnRyeT46OmNvbnN0X2l0ZXJhdG9yIGkocm9sbGVkX292ZXIuYmVnaW4oKSk7IGkgIT0gcm9sbGVkX292ZXIuZW5kKCk7ICsraSkgeworICAgICAgICBVbmNoZWNrZWRJbnNlcnQoKmkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIE1vc3RseSBmb3IgdGVzdHMsIGNoZWNrIGNvbnNpc3RlbmN5IG9mIGV2ZXJ5IGVudHJ5LgorICAgIHZvaWQgQ2hlY2tDb25zaXN0ZW5jeSgpIHsKKyAgICAgIE11dGFibGVJdGVyYXRvciBsYXN0OworICAgICAgZm9yIChsYXN0ID0gZW5kXyAtIDE7IGxhc3QgPj0gYmVnaW5fICYmICFlcXVhbF8obGFzdC0+R2V0S2V5KCksIGludmFsaWRfKTsgLS1sYXN0KSB7fQorICAgICAgVVRJTF9USFJPV19JRihsYXN0ID09IGJlZ2luXywgUHJvYmluZ1NpemVFeGNlcHRpb24sICJDb21wbGV0ZWx5IGZ1bGwiKTsKKyAgICAgIE11dGFibGVJdGVyYXRvciBpOworICAgICAgLy8gQmVnaW5uaW5nIGNhbiBiZSB3cmFwLWFyb3VuZHMuCisgICAgICBmb3IgKGkgPSBiZWdpbl87ICFlcXVhbF8oaS0+R2V0S2V5KCksIGludmFsaWRfKTsgKytpKSB7CisgICAgICAgIE11dGFibGVJdGVyYXRvciBpZGVhbCA9IElkZWFsKGktPkdldEtleSgpKTsKKyAgICAgICAgVVRJTF9USFJPV19JRihpZGVhbCA+IGkgJiYgaWRlYWwgPD0gbGFzdCwgRXhjZXB0aW9uLCAiSW5jb25zaXN0ZW5jeSBhdCBwb3NpdGlvbiAiIDw8IChpIC0gYmVnaW5fKSA8PCAiIHNob3VsZCBiZSBhdCAiIDw8IChpZGVhbCAtIGJlZ2luXykpOworICAgICAgfQorICAgICAgTXV0YWJsZUl0ZXJhdG9yIHByZV9nYXAgPSBpOworICAgICAgZm9yICg7IGkgIT0gZW5kXzsgKytpKSB7CisgICAgICAgIGlmIChlcXVhbF8oaS0+R2V0S2V5KCksIGludmFsaWRfKSkgeworICAgICAgICAgIHByZV9nYXAgPSBpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIE11dGFibGVJdGVyYXRvciBpZGVhbCA9IElkZWFsKGktPkdldEtleSgpKTsKKyAgICAgICAgVVRJTF9USFJPV19JRihpZGVhbCA+IGkgfHwgaWRlYWwgPD0gcHJlX2dhcCwgRXhjZXB0aW9uLCAiSW5jb25zaXN0ZW5jeSBhdCBwb3NpdGlvbiAiIDw8IChpIC0gYmVnaW5fKSA8PCAiIHdpdGggaWRlYWwgIiA8PCAoaWRlYWwgLSBiZWdpbl8pKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBDb25zdEl0ZXJhdG9yIFJhd0JlZ2luKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJlZ2luXzsKKyAgICB9CisgICAgQ29uc3RJdGVyYXRvciBSYXdFbmQoKSBjb25zdCB7CisgICAgICByZXR1cm4gZW5kXzsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQXV0b1Byb2Jpbmc8RW50cnksIEhhc2gsIEVxdWFsPjsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBNdXRhYmxlSXRlcmF0b3IgVW5jaGVja2VkSW5zZXJ0KGNvbnN0IFQgJnQpIHsKKyAgICAgIGZvciAoTXV0YWJsZUl0ZXJhdG9yIGkoSWRlYWwodC5HZXRLZXkoKSkpOzsgbW9kXy5OZXh0KGJlZ2luXywgZW5kXywgaSkpIHsKKyAgICAgICAgaWYgKGVxdWFsXyhpLT5HZXRLZXkoKSwgaW52YWxpZF8pKSB7ICppID0gdDsgcmV0dXJuIGk7IH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBNdXRhYmxlSXRlcmF0b3IgYmVnaW5fOworICAgIE11dGFibGVJdGVyYXRvciBlbmRfOworICAgIHN0ZDo6c2l6ZV90IGJ1Y2tldHNfOworICAgIEtleSBpbnZhbGlkXzsKKyAgICBIYXNoIGhhc2hfOworICAgIEVxdWFsIGVxdWFsXzsKKyAgICBNb2QgbW9kXzsKKworICAgIHN0ZDo6c2l6ZV90IGVudHJpZXNfOworI2lmZGVmIERFQlVHCisgICAgYm9vbCBpbml0aWFsaXplZF87CisjZW5kaWYKK307CisKKy8vIFJlc2l6YWJsZSBsaW5lYXIgcHJvYmluZyBoYXNoIHRhYmxlLiAgVGhpcyBvd25zIHRoZSBtZW1vcnkuCit0ZW1wbGF0ZSA8Y2xhc3MgRW50cnlULCBjbGFzcyBIYXNoVCwgY2xhc3MgRXF1YWxUID0gc3RkOjplcXVhbF90bzx0eXBlbmFtZSBFbnRyeVQ6OktleT4gPiBjbGFzcyBBdXRvUHJvYmluZyB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBQcm9iaW5nSGFzaFRhYmxlPEVudHJ5VCwgSGFzaFQsIEVxdWFsVCwgUG93ZXIyTW9kPiBCYWNrZW5kOworICBwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c2l6ZV90IE1lbVVzYWdlKHN0ZDo6c2l6ZV90IHNpemUsIGZsb2F0IG11bHRpcGxpZXIgPSAxLjUpIHsKKyAgICAgIHJldHVybiBCYWNrZW5kOjpTaXplKHNpemUsIG11bHRpcGxpZXIpOworICAgIH0KKworICAgIHR5cGVkZWYgRW50cnlUIEVudHJ5OworICAgIHR5cGVkZWYgdHlwZW5hbWUgRW50cnk6OktleSBLZXk7CisgICAgdHlwZWRlZiBjb25zdCBFbnRyeSAqQ29uc3RJdGVyYXRvcjsKKyAgICB0eXBlZGVmIEVudHJ5ICpNdXRhYmxlSXRlcmF0b3I7CisgICAgdHlwZWRlZiBIYXNoVCBIYXNoOworICAgIHR5cGVkZWYgRXF1YWxUIEVxdWFsOworCisgICAgQXV0b1Byb2Jpbmcoc3RkOjpzaXplX3QgaW5pdGlhbF9zaXplID0gNSwgY29uc3QgS2V5ICZpbnZhbGlkID0gS2V5KCksIGNvbnN0IEhhc2ggJmhhc2hfZnVuYyA9IEhhc2goKSwgY29uc3QgRXF1YWwgJmVxdWFsX2Z1bmMgPSBFcXVhbCgpKSA6CisgICAgICBhbGxvY2F0ZWRfKEJhY2tlbmQ6OlNpemUoaW5pdGlhbF9zaXplLCAxLjIpKSwgbWVtXyhhbGxvY2F0ZWRfLCBLZXlJc1Jhd1plcm8oaW52YWxpZCkpLCBiYWNrZW5kXyhtZW1fLmdldCgpLCBhbGxvY2F0ZWRfLCBpbnZhbGlkLCBoYXNoX2Z1bmMsIGVxdWFsX2Z1bmMpIHsKKyAgICAgIHRocmVzaG9sZF8gPSBzdGQ6Om1pbjxzdGQ6OnNpemVfdD4oYmFja2VuZF8uYnVja2V0c18gLSAxLCBiYWNrZW5kXy5idWNrZXRzXyAqIDAuOSk7CisgICAgICBpZiAoIUtleUlzUmF3WmVybyhpbnZhbGlkKSkgeworICAgICAgICBDbGVhcigpOworICAgICAgfQorICAgIH0KKworICAgIC8vIEFzc3VtZXMgdGhhdCB0aGUga2V5IGlzIHVuaXF1ZS4gIE11bHRpcGxlIGluc2VydGlvbnMgd29uJ3QgY2F1c2UgYSBmYWlsdXJlLCBqdXN0IGluY29uc2lzdGVudCBsb29rdXAuCisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IE11dGFibGVJdGVyYXRvciBJbnNlcnQoY29uc3QgVCAmdCkgeworICAgICAgKytiYWNrZW5kXy5lbnRyaWVzXzsKKyAgICAgIERvdWJsZUlmTmVlZGVkKCk7CisgICAgICByZXR1cm4gYmFja2VuZF8uVW5jaGVja2VkSW5zZXJ0KHQpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBib29sIEZpbmRPckluc2VydChjb25zdCBUICZ0LCBNdXRhYmxlSXRlcmF0b3IgJm91dCkgeworICAgICAgRG91YmxlSWZOZWVkZWQoKTsKKyAgICAgIHJldHVybiBiYWNrZW5kXy5GaW5kT3JJbnNlcnQodCwgb3V0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5PiBib29sIFVuc2FmZU11dGFibGVGaW5kKGNvbnN0IEtleSBrZXksIE11dGFibGVJdGVyYXRvciAmb3V0KSB7CisgICAgICByZXR1cm4gYmFja2VuZF8uVW5zYWZlTXV0YWJsZUZpbmQoa2V5LCBvdXQpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBLZXk+IE11dGFibGVJdGVyYXRvciBVbnNhZmVNdXRhYmxlTXVzdEZpbmQoY29uc3QgS2V5IGtleSkgeworICAgICAgcmV0dXJuIGJhY2tlbmRfLlVuc2FmZU11dGFibGVNdXN0RmluZChrZXkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBLZXk+IGJvb2wgRmluZChjb25zdCBLZXkga2V5LCBDb25zdEl0ZXJhdG9yICZvdXQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYWNrZW5kXy5GaW5kKGtleSwgb3V0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5PiBDb25zdEl0ZXJhdG9yIE11c3RGaW5kKGNvbnN0IEtleSBrZXkpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYWNrZW5kXy5NdXN0RmluZChrZXkpOworICAgIH0KKworICAgIHN0ZDo6c2l6ZV90IFNpemUoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFja2VuZF8uU2l6ZU5vU2VyaWFsaXphdGlvbigpOworICAgIH0KKworICAgIHZvaWQgQ2xlYXIoKSB7CisgICAgICBiYWNrZW5kXy5DbGVhcigpOworICAgIH0KKworICAgIENvbnN0SXRlcmF0b3IgUmF3QmVnaW4oKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFja2VuZF8uUmF3QmVnaW4oKTsKKyAgICB9CisgICAgQ29uc3RJdGVyYXRvciBSYXdFbmQoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFja2VuZF8uUmF3RW5kKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBEb3VibGVJZk5lZWRlZCgpIHsKKyAgICAgIGlmIChVVElMX0xJS0VMWShTaXplKCkgPCB0aHJlc2hvbGRfKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgSHVnZVJlYWxsb2MoYmFja2VuZF8uRG91YmxlVG8oKSwgS2V5SXNSYXdaZXJvKGJhY2tlbmRfLmludmFsaWRfKSwgbWVtXyk7CisgICAgICBhbGxvY2F0ZWRfID0gYmFja2VuZF8uRG91YmxlVG8oKTsKKyAgICAgIGJhY2tlbmRfLkRvdWJsZShtZW1fLmdldCgpLCAhS2V5SXNSYXdaZXJvKGJhY2tlbmRfLmludmFsaWRfKSk7CisgICAgICB0aHJlc2hvbGRfID0gc3RkOjptaW48c3RkOjpzaXplX3Q+KGJhY2tlbmRfLmJ1Y2tldHNfIC0gMSwgYmFja2VuZF8uYnVja2V0c18gKiAwLjkpOworICAgIH0KKworICAgIGJvb2wgS2V5SXNSYXdaZXJvKGNvbnN0IEtleSAma2V5KSB7CisgICAgICBmb3IgKGNvbnN0IHVpbnQ4X3QgKmkgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigma2V5KTsgaSA8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCZrZXkpICsgc2l6ZW9mKEtleSk7ICsraSkgeworICAgICAgICBpZiAoKmkpIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0ZDo6c2l6ZV90IGFsbG9jYXRlZF87CisgICAgdXRpbDo6c2NvcGVkX21lbW9yeSBtZW1fOworICAgIEJhY2tlbmQgYmFja2VuZF87CisgICAgc3RkOjpzaXplX3QgdGhyZXNob2xkXzsKK307CisKK30gLy8gbmFtZXNwYWNlIHV0aWwKKworI2VuZGlmIC8vIFVUSUxfUFJPQklOR19IQVNIX1RBQkxFX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3Byb2JpbmdfaGFzaF90YWJsZV9iZW5jaG1hcmtfbWFpbi5jYyBiL3NyYy9rZW5sbS91dGlsL3Byb2JpbmdfaGFzaF90YWJsZV9iZW5jaG1hcmtfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODNkMjFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvcHJvYmluZ19oYXNoX3RhYmxlX2JlbmNobWFya19tYWluLmNjCkBAIC0wLDAgKzEsMTgxIEBACisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvcHJvYmluZ19oYXNoX3RhYmxlLmhoIgorI2luY2x1ZGUgInV0aWwvbW1hcC5oaCIKKyNpbmNsdWRlICJ1dGlsL3VzYWdlLmhoIgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBFbnRyeSB7CisgIHR5cGVkZWYgdWludDY0X3QgS2V5OworICBLZXkga2V5OworICBLZXkgR2V0S2V5KCkgY29uc3QgeyByZXR1cm4ga2V5OyB9Cit9OworCisvLyBJIGRvbid0IGNhcmUgaWYgdGhpcyBkb2Vzbid0IHJ1biBvbiBXaW5kb3dzLiAgRW1waXJpY2FsbHkgL2Rldi91cmFuZG9tIHdhcyBmYXN0ZXIgdGhhbiBib29zdDo6cmFuZG9tJ3MgTWVyc2VubmUgVHdpc3Rlci4KK2NsYXNzIFVSYW5kb20geworICBwdWJsaWM6CisgICAgVVJhbmRvbSgpIDoKKyAgICAgIGl0XyhidWZfICsgMTAyNCksIGVuZF8oYnVmXyArIDEwMjQpLAorICAgICAgZmlsZV8odXRpbDo6T3BlblJlYWRPclRocm93KCIvZGV2L3VyYW5kb20iKSkge30KKworICAgIHVpbnQ2NF90IEdldCgpIHsKKyAgICAgIGlmIChpdF8gPT0gZW5kXykgeworICAgICAgICBpdF8gPSBidWZfOworICAgICAgICB1dGlsOjpSZWFkT3JUaHJvdyhmaWxlXy5nZXQoKSwgYnVmXywgc2l6ZW9mKGJ1Zl8pKTsKKyAgICAgICAgaXRfID0gYnVmXzsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqaXRfKys7CisgICAgfQorCisgICAgdm9pZCBCYXRjaCh1aW50NjRfdCAqYmVnaW4sIHVpbnQ2NF90ICplbmQpIHsKKyAgICAgIHV0aWw6OlJlYWRPclRocm93KGZpbGVfLmdldCgpLCBiZWdpbiwgKGVuZCAtIGJlZ2luKSAqIHNpemVvZih1aW50NjRfdCkpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHVpbnQ2NF90IGJ1Zl9bMTAyNF07CisgICAgdWludDY0X3QgKml0XywgKmVuZF87CisKKyAgICB1dGlsOjpzY29wZWRfZmQgZmlsZV87Cit9OworCitzdHJ1Y3QgUHJlZmV0Y2hFbnRyeSB7CisgIHVpbnQ2NF90IGtleTsKKyAgY29uc3QgRW50cnkgKnBvaW50ZXI7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVGFibGVULCB1bnNpZ25lZCBQcmVmZXRjaFNpemU+IGNsYXNzIFByZWZldGNoUXVldWUgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBUYWJsZVQgVGFibGU7CisKKyAgICBleHBsaWNpdCBQcmVmZXRjaFF1ZXVlKFRhYmxlICZ0YWJsZSkgOiB0YWJsZV8odGFibGUpLCBjdXJfKDApLCB0d2lkZGxlXyhmYWxzZSkgeworICAgICAgZm9yIChQcmVmZXRjaEVudHJ5ICppID0gZW50cmllc187IGkgIT0gZW50cmllc18gKyBQcmVmZXRjaFNpemU7ICsraSkKKyAgICAgICAgaS0+cG9pbnRlciA9IE5VTEw7CisgICAgfQorCisgICAgdm9pZCBBZGQodWludDY0X3Qga2V5KSB7CisgICAgICBpZiAoQ3VyKCkucG9pbnRlcikgeworICAgICAgICB0d2lkZGxlXyBePSB0YWJsZV8uRmluZEZyb21JZGVhbChDdXIoKS5rZXksIEN1cigpLnBvaW50ZXIpOworICAgICAgfQorICAgICAgQ3VyKCkua2V5ID0ga2V5OworICAgICAgQ3VyKCkucG9pbnRlciA9IHRhYmxlXy5JZGVhbChrZXkpOworICAgICAgX19idWlsdGluX3ByZWZldGNoKEN1cigpLnBvaW50ZXIsIDAsIDApOworICAgICAgTmV4dCgpOworICAgIH0KKworICAgIGJvb2wgRHJhaW4oKSB7CisgICAgICBpZiAoQ3VyKCkucG9pbnRlcikgeworICAgICAgICBmb3IgKFByZWZldGNoRW50cnkgKmkgPSAmQ3VyKCk7IGkgPCBlbnRyaWVzXyArIFByZWZldGNoU2l6ZTsgKytpKSB7CisgICAgICAgICAgdHdpZGRsZV8gXj0gdGFibGVfLkZpbmRGcm9tSWRlYWwoaS0+a2V5LCBpLT5wb2ludGVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChQcmVmZXRjaEVudHJ5ICppID0gZW50cmllc187IGkgPCAmQ3VyKCk7ICsraSkgeworICAgICAgICB0d2lkZGxlXyBePSB0YWJsZV8uRmluZEZyb21JZGVhbChpLT5rZXksIGktPnBvaW50ZXIpOworICAgICAgfQorICAgICAgcmV0dXJuIHR3aWRkbGVfOworICAgIH0KKworICBwcml2YXRlOgorICAgIFByZWZldGNoRW50cnkgJkN1cigpIHsgcmV0dXJuIGVudHJpZXNfW2N1cl9dOyB9CisgICAgdm9pZCBOZXh0KCkgeworICAgICAgKytjdXJfOworICAgICAgY3VyXyA9IGN1cl8gJSBQcmVmZXRjaFNpemU7CisgICAgfQorCisgICAgVGFibGUgJnRhYmxlXzsKKyAgICBQcmVmZXRjaEVudHJ5IGVudHJpZXNfW1ByZWZldGNoU2l6ZV07CisgICAgc3RkOjpzaXplX3QgY3VyXzsKKworICAgIGJvb2wgdHdpZGRsZV87CisKKyAgICBQcmVmZXRjaFF1ZXVlKGNvbnN0IFByZWZldGNoUXVldWUmKTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBQcmVmZXRjaFF1ZXVlJik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVGFibGVUPiBjbGFzcyBJbW1lZGlhdGUgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBUYWJsZVQgVGFibGU7CisKKyAgICBleHBsaWNpdCBJbW1lZGlhdGUoVGFibGUgJnRhYmxlKSA6IHRhYmxlXyh0YWJsZSksIHR3aWRkbGVfKGZhbHNlKSB7fQorCisgICAgdm9pZCBBZGQodWludDY0X3Qga2V5KSB7CisgICAgICB0eXBlbmFtZSBUYWJsZTo6Q29uc3RJdGVyYXRvciBpdDsKKyAgICAgIHR3aWRkbGVfIF49IHRhYmxlXy5GaW5kKGtleSwgaXQpOworICAgIH0KKworICAgIGJvb2wgRHJhaW4oKSBjb25zdCB7IHJldHVybiB0d2lkZGxlXzsgfQorCisgIHByaXZhdGU6CisgICAgVGFibGUgJnRhYmxlXzsKKyAgICBib29sIHR3aWRkbGVfOworfTsKKworc3RkOjpzaXplX3QgU2l6ZSh1aW50NjRfdCBlbnRyaWVzLCBmbG9hdCBtdWx0aXBsaWVyID0gMS41KSB7CisgIHR5cGVkZWYgdXRpbDo6UHJvYmluZ0hhc2hUYWJsZTxFbnRyeSwgdXRpbDo6SWRlbnRpdHlIYXNoLCBzdGQ6OmVxdWFsX3RvPEVudHJ5OjpLZXk+LCBQb3dlcjJNb2Q+IFRhYmxlOworICAvLyBBbHdheXMgcm91bmQgdXAgdG8gcG93ZXIgb2YgMiBmb3IgZmFpciBjb21wYXJpc29uLgorICByZXR1cm4gUG93ZXIyTW9kOjpSb3VuZEJ1Y2tldHMoVGFibGU6OlNpemUoZW50cmllcywgbXVsdGlwbGllcikgLyBzaXplb2YoRW50cnkpKSAqIHNpemVvZihFbnRyeSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBRdWV1ZT4gYm9vbCBUZXN0KFVSYW5kb20gJnJuLCB1aW50NjRfdCBlbnRyaWVzLCBjb25zdCB1aW50NjRfdCAqY29uc3QgcXVlcmllc19iZWdpbiwgY29uc3QgdWludDY0X3QgKmNvbnN0IHF1ZXJpZXNfZW5kLCBib29sIG9yZGluYXJ5X21hbGxvYywgZmxvYXQgbXVsdGlwbGllciA9IDEuNSkgeworICBzdGQ6OnNpemVfdCBzaXplID0gU2l6ZShlbnRyaWVzLCBtdWx0aXBsaWVyKTsKKyAgc2NvcGVkX21lbW9yeSBiYWNraW5nOworICBpZiAob3JkaW5hcnlfbWFsbG9jKSB7CisgICAgYmFja2luZy5yZXNldCh1dGlsOjpDYWxsb2NPclRocm93KHNpemUpLCBzaXplLCBzY29wZWRfbWVtb3J5OjpNQUxMT0NfQUxMT0NBVEVEKTsKKyAgfSBlbHNlIHsKKyAgICB1dGlsOjpIdWdlTWFsbG9jKHNpemUsIHRydWUsIGJhY2tpbmcpOworICB9CisgIHR5cGVuYW1lIFF1ZXVlOjpUYWJsZSB0YWJsZShiYWNraW5nLmdldCgpLCBzaXplKTsKKworICBkb3VibGUgc3RhcnQgPSBDUFVUaW1lKCk7CisgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBlbnRyaWVzOyArK2kpIHsKKyAgICBFbnRyeSBlbnRyeTsKKyAgICBlbnRyeS5rZXkgPSBybi5HZXQoKTsKKyAgICB0YWJsZS5JbnNlcnQoZW50cnkpOworICB9CisgIGRvdWJsZSBpbnNlcnRlZCA9IENQVVRpbWUoKSAtIHN0YXJ0OworICBkb3VibGUgYmVmb3JlX2xvb2t1cCA9IENQVVRpbWUoKTsKKyAgUXVldWUgcXVldWUodGFibGUpOworICBmb3IgKGNvbnN0IHVpbnQ2NF90ICppID0gcXVlcmllc19iZWdpbjsgaSAhPSBxdWVyaWVzX2VuZDsgKytpKSB7CisgICAgcXVldWUuQWRkKCppKTsKKyAgfQorICBib29sIG1lYW5pbmdsZXNzID0gcXVldWUuRHJhaW4oKTsKKyAgc3RkOjpjb3V0IDw8ICcgJyA8PCAoaW5zZXJ0ZWQgLyBzdGF0aWNfY2FzdDxkb3VibGU+KGVudHJpZXMpKSA8PCAnICcgPDwgKENQVVRpbWUoKSAtIGJlZm9yZV9sb29rdXApIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihxdWVyaWVzX2VuZCAtIHF1ZXJpZXNfYmVnaW4pIDw8IHN0ZDo6Zmx1c2g7CisgIHJldHVybiBtZWFuaW5nbGVzczsKK30KKworYm9vbCBUZXN0UnVuKHVpbnQ2NF90IGxvb2t1cHMgPSAyMDAwMDAwMCwgZmxvYXQgbXVsdGlwbGllciA9IDEuNSkgeworICBVUmFuZG9tIHJuOworICB1dGlsOjpzY29wZWRfbWVtb3J5IHF1ZXJpZXM7CisgIEh1Z2VNYWxsb2MobG9va3VwcyAqIHNpemVvZih1aW50NjRfdCksIHRydWUsIHF1ZXJpZXMpOworICBybi5CYXRjaChzdGF0aWNfY2FzdDx1aW50NjRfdCo+KHF1ZXJpZXMuZ2V0KCkpLCBzdGF0aWNfY2FzdDx1aW50NjRfdCo+KHF1ZXJpZXMuZ2V0KCkpICsgbG9va3Vwcyk7CisgIHVpbnQ2NF90IHBoeXNpY2FsX21lbV9saW1pdCA9IHV0aWw6Okd1ZXNzUGh5c2ljYWxNZW1vcnkoKSAvIDI7CisgIGJvb2wgbWVhbmluZ2xlc3MgPSB0cnVlOworICBmb3IgKHVpbnQ2NF90IGkgPSA0OyBTaXplKGkgLyBtdWx0aXBsaWVyKSA8IHBoeXNpY2FsX21lbV9saW1pdDsgaSAqPSA0KSB7CisgICAgc3RkOjpjb3V0IDw8IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihpIC8gbXVsdGlwbGllcikgPDwgJyAnIDw8IFNpemUoaSAvIG11bHRpcGxpZXIpOworICAgIHR5cGVkZWYgdXRpbDo6UHJvYmluZ0hhc2hUYWJsZTxFbnRyeSwgdXRpbDo6SWRlbnRpdHlIYXNoLCBzdGQ6OmVxdWFsX3RvPEVudHJ5OjpLZXk+LCBQb3dlcjJNb2Q+IFRhYmxlOworICAgIHR5cGVkZWYgdXRpbDo6UHJvYmluZ0hhc2hUYWJsZTxFbnRyeSwgdXRpbDo6SWRlbnRpdHlIYXNoLCBzdGQ6OmVxdWFsX3RvPEVudHJ5OjpLZXk+LCBEaXZNb2Q+IFRhYmxlRGl2OworICAgIGNvbnN0IHVpbnQ2NF90ICpjb25zdCBxdWVyaWVzX2JlZ2luID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDY0X3QqPihxdWVyaWVzLmdldCgpKTsKKyAgICBtZWFuaW5nbGVzcyBePSB1dGlsOjpUZXN0PEltbWVkaWF0ZTxUYWJsZURpdj4gPihybiwgaSAvIG11bHRpcGxpZXIsIHF1ZXJpZXNfYmVnaW4sIHF1ZXJpZXNfYmVnaW4gKyBsb29rdXBzLCB0cnVlLCBtdWx0aXBsaWVyKTsKKyAgICBtZWFuaW5nbGVzcyBePSB1dGlsOjpUZXN0PEltbWVkaWF0ZTxUYWJsZT4gPihybiwgaSAvIG11bHRpcGxpZXIsIHF1ZXJpZXNfYmVnaW4sIHF1ZXJpZXNfYmVnaW4gKyBsb29rdXBzLCB0cnVlLCBtdWx0aXBsaWVyKTsKKyAgICBtZWFuaW5nbGVzcyBePSB1dGlsOjpUZXN0PFByZWZldGNoUXVldWU8VGFibGUsIDQ+ID4ocm4sIGkgLyBtdWx0aXBsaWVyLCBxdWVyaWVzX2JlZ2luLCBxdWVyaWVzX2JlZ2luICsgbG9va3VwcywgdHJ1ZSwgbXVsdGlwbGllcik7CisgICAgbWVhbmluZ2xlc3MgXj0gdXRpbDo6VGVzdDxJbW1lZGlhdGU8VGFibGU+ID4ocm4sIGkgLyBtdWx0aXBsaWVyLCBxdWVyaWVzX2JlZ2luLCBxdWVyaWVzX2JlZ2luICsgbG9va3VwcywgZmFsc2UsIG11bHRpcGxpZXIpOworICAgIG1lYW5pbmdsZXNzIF49IHV0aWw6OlRlc3Q8UHJlZmV0Y2hRdWV1ZTxUYWJsZSwgMj4gPihybiwgaSAvIG11bHRpcGxpZXIsIHF1ZXJpZXNfYmVnaW4sIHF1ZXJpZXNfYmVnaW4gKyBsb29rdXBzLCBmYWxzZSwgbXVsdGlwbGllcik7CisgICAgbWVhbmluZ2xlc3MgXj0gdXRpbDo6VGVzdDxQcmVmZXRjaFF1ZXVlPFRhYmxlLCA0PiA+KHJuLCBpIC8gbXVsdGlwbGllciwgcXVlcmllc19iZWdpbiwgcXVlcmllc19iZWdpbiArIGxvb2t1cHMsIGZhbHNlLCBtdWx0aXBsaWVyKTsKKyAgICBtZWFuaW5nbGVzcyBePSB1dGlsOjpUZXN0PFByZWZldGNoUXVldWU8VGFibGUsIDg+ID4ocm4sIGkgLyBtdWx0aXBsaWVyLCBxdWVyaWVzX2JlZ2luLCBxdWVyaWVzX2JlZ2luICsgbG9va3VwcywgZmFsc2UsIG11bHRpcGxpZXIpOworICAgIG1lYW5pbmdsZXNzIF49IHV0aWw6OlRlc3Q8UHJlZmV0Y2hRdWV1ZTxUYWJsZSwgMTY+ID4ocm4sIGkgLyBtdWx0aXBsaWVyLCBxdWVyaWVzX2JlZ2luLCBxdWVyaWVzX2JlZ2luICsgbG9va3VwcywgZmFsc2UsIG11bHRpcGxpZXIpOworICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisgIH0KKyAgcmV0dXJuIG1lYW5pbmdsZXNzOworfQorCit9IC8vIG5hbWVzcGFjZQorfSAvLyBuYW1lc3BhY2UgdXRpbAorCitpbnQgbWFpbigpIHsKKyAgYm9vbCBtZWFuaW5nbGVzcyA9IGZhbHNlOworICBzdGQ6OmNvdXQgPDwgIiNDUFUgdGltZVxuIjsKKyAgbWVhbmluZ2xlc3MgXj0gdXRpbDo6VGVzdFJ1bigpOworICBzdGQ6OmNlcnIgPDwgIk1lYW5pbmdsZXNzOiAiIDw8IG1lYW5pbmdsZXNzIDw8ICdcbic7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9wcm9iaW5nX2hhc2hfdGFibGVfdGVzdC5jYyBiL3NyYy9rZW5sbS91dGlsL3Byb2JpbmdfaGFzaF90YWJsZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDU0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9wcm9iaW5nX2hhc2hfdGFibGVfdGVzdC5jYwpAQCAtMCwwICsxLDEwMiBAQAorI2luY2x1ZGUgInV0aWwvcHJvYmluZ19oYXNoX3RhYmxlLmhoIgorCisjaW5jbHVkZSAidXRpbC9tdXJtdXJfaGFzaC5oaCIKKyNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBQcm9iaW5nSGFzaFRhYmxlVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9zY29wZWRfYXJyYXkuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uYWwvaGFzaC5ocHA+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHsKKworc3RydWN0IEVudHJ5IHsKKyAgdW5zaWduZWQgY2hhciBrZXk7CisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBLZXk7CisKKyAgdW5zaWduZWQgY2hhciBHZXRLZXkoKSBjb25zdCB7CisgICAgcmV0dXJuIGtleTsKKyAgfQorCisgIHZvaWQgU2V0S2V5KHVuc2lnbmVkIGNoYXIgdG8pIHsKKyAgICBrZXkgPSB0bzsKKyAgfQorCisgIHVpbnQ2NF90IEdldFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHVpbnQ2NF90IHZhbHVlOworfTsKKwordHlwZWRlZiBQcm9iaW5nSGFzaFRhYmxlPEVudHJ5LCBib29zdDo6aGFzaDx1bnNpZ25lZCBjaGFyPiA+IFRhYmxlOworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShzaW1wbGUpIHsKKyAgc2l6ZV90IHNpemUgPSBUYWJsZTo6U2l6ZSgxMCwgMS4yKTsKKyAgYm9vc3Q6OnNjb3BlZF9hcnJheTxjaGFyPiBtZW0obmV3IGNoYXJbc2l6ZV0pOworICBtZW1zZXQobWVtLmdldCgpLCAwLCBzaXplKTsKKworICBUYWJsZSB0YWJsZShtZW0uZ2V0KCksIHNpemUpOworICBjb25zdCBFbnRyeSAqaSA9IE5VTEw7CisgIEJPT1NUX0NIRUNLKCF0YWJsZS5GaW5kKDIsIGkpKTsKKyAgRW50cnkgdG9faW5zOworICB0b19pbnMua2V5ID0gMzsKKyAgdG9faW5zLnZhbHVlID0gMzI4OTIwOworICB0YWJsZS5JbnNlcnQodG9faW5zKTsKKyAgQk9PU1RfUkVRVUlSRSh0YWJsZS5GaW5kKDMsIGkpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMywgaS0+R2V0S2V5KCkpOworICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDx1aW50NjRfdD4oMzI4OTIwKSwgaS0+R2V0VmFsdWUoKSk7CisgIEJPT1NUX0NIRUNLKCF0YWJsZS5GaW5kKDIsIGkpKTsKK30KKworc3RydWN0IEVudHJ5NjQgeworICB1aW50NjRfdCBrZXk7CisgIHR5cGVkZWYgdWludDY0X3QgS2V5OworCisgIEVudHJ5NjQoKSB7fQorCisgIGV4cGxpY2l0IEVudHJ5NjQodWludDY0X3Qga2V5X2luKSB7CisgICAga2V5ID0ga2V5X2luOworICB9CisKKyAgS2V5IEdldEtleSgpIGNvbnN0IHsgcmV0dXJuIGtleTsgfQorICB2b2lkIFNldEtleSh1aW50NjRfdCB0bykgeyBrZXkgPSB0bzsgfQorfTsKKworc3RydWN0IE11cm11ckhhc2hFbnRyeTY0IHsKKyAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKSh1aW50NjRfdCB2YWx1ZSkgY29uc3QgeworICAgIHJldHVybiB1dGlsOjpNdXJtdXJIYXNoNjRBKCZ2YWx1ZSwgOCk7CisgIH0KK307CisKK3R5cGVkZWYgUHJvYmluZ0hhc2hUYWJsZTxFbnRyeTY0LCBNdXJtdXJIYXNoRW50cnk2ND4gVGFibGU2NDsKKworQk9PU1RfQVVUT19URVNUX0NBU0UoRG91YmxlKSB7CisgIGZvciAoc3RkOjpzaXplX3QgaW5pdGlhbCA9IDE5OyBpbml0aWFsIDwgMzA7ICsraW5pdGlhbCkgeworICAgIHNpemVfdCBzaXplID0gVGFibGU2NDo6U2l6ZShpbml0aWFsLCAxLjIpOworICAgIHNjb3BlZF9tYWxsb2MgbWVtKE1hbGxvY09yVGhyb3coc2l6ZSkpOworICAgIFRhYmxlNjQgdGFibGUobWVtLmdldCgpLCBzaXplLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpOworICAgIHRhYmxlLkNsZWFyKCk7CisgICAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IDE5OyArK2kpIHsKKyAgICAgIHRhYmxlLkluc2VydChFbnRyeTY0KGkpKTsKKyAgICB9CisgICAgdGFibGUuQ2hlY2tDb25zaXN0ZW5jeSgpOworICAgIG1lbS5jYWxsX3JlYWxsb2ModGFibGUuRG91YmxlVG8oKSk7CisgICAgdGFibGUuRG91YmxlKG1lbS5nZXQoKSk7CisgICAgdGFibGUuQ2hlY2tDb25zaXN0ZW5jeSgpOworICAgIGZvciAodWludDY0X3QgaSA9IDIwOyBpIDwgNDAgOyArK2kpIHsKKyAgICAgIHRhYmxlLkluc2VydChFbnRyeTY0KGkpKTsKKyAgICB9CisgICAgbWVtLmNhbGxfcmVhbGxvYyh0YWJsZS5Eb3VibGVUbygpKTsKKyAgICB0YWJsZS5Eb3VibGUobWVtLmdldCgpKTsKKyAgICB0YWJsZS5DaGVja0NvbnNpc3RlbmN5KCk7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3Byb3h5X2l0ZXJhdG9yLmhoIGIvc3JjL2tlbmxtL3V0aWwvcHJveHlfaXRlcmF0b3IuaGgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3Byb3h5X2l0ZXJhdG9yLmhoCnJlbmFtZSB0byBzcmMva2VubG0vdXRpbC9wcm94eV9pdGVyYXRvci5oaApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvcmVhZF9jb21wcmVzc2VkLmNjIGIvc3JjL2tlbmxtL3V0aWwvcmVhZF9jb21wcmVzc2VkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNGM1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9yZWFkX2NvbXByZXNzZWQuY2MKQEAgLTAsMCArMSw0NDggQEAKKyNpbmNsdWRlICJ1dGlsL3JlYWRfY29tcHJlc3NlZC5oaCIKKworI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKKyNpbmNsdWRlICJ1dGlsL2hhdmUuaGgiCisjaW5jbHVkZSAidXRpbC9zY29wZWQuaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCisjaWZkZWYgSEFWRV9aTElCCisjaW5jbHVkZSA8emxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0JaTElCCisjaW5jbHVkZSA8YnpsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9YWkxJQgorI2luY2x1ZGUgPGx6bWEuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgdXRpbCB7CisKK0NvbXByZXNzZWRFeGNlcHRpb246OkNvbXByZXNzZWRFeGNlcHRpb24oKSB0aHJvdygpIHt9CitDb21wcmVzc2VkRXhjZXB0aW9uOjp+Q29tcHJlc3NlZEV4Y2VwdGlvbigpIHRocm93KCkge30KKworR1pFeGNlcHRpb246OkdaRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorR1pFeGNlcHRpb246On5HWkV4Y2VwdGlvbigpIHRocm93KCkge30KKworQlpFeGNlcHRpb246OkJaRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorQlpFeGNlcHRpb246On5CWkV4Y2VwdGlvbigpIHRocm93KCkge30KKworWFpFeGNlcHRpb246OlhaRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorWFpFeGNlcHRpb246On5YWkV4Y2VwdGlvbigpIHRocm93KCkge30KKworY2xhc3MgUmVhZEJhc2UgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+UmVhZEJhc2UoKSB7fQorCisgICAgdmlydHVhbCBzdGQ6OnNpemVfdCBSZWFkKHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQsIFJlYWRDb21wcmVzc2VkICZ0aHVuaykgPSAwOworCisgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBSZXBsYWNlVGhpcyhSZWFkQmFzZSAqd2l0aCwgUmVhZENvbXByZXNzZWQgJnRodW5rKSB7CisgICAgICB0aHVuay5pbnRlcm5hbF8ucmVzZXQod2l0aCk7CisgICAgfQorCisgICAgUmVhZEJhc2UgKkN1cnJlbnQoUmVhZENvbXByZXNzZWQgJnRodW5rKSB7IHJldHVybiB0aHVuay5pbnRlcm5hbF8uZ2V0KCk7IH0KKworICAgIHN0YXRpYyB1aW50NjRfdCAmUmVhZENvdW50KFJlYWRDb21wcmVzc2VkICZ0aHVuaykgeworICAgICAgcmV0dXJuIHRodW5rLnJhd19hbW91bnRfOworICAgIH0KK307CisKK25hbWVzcGFjZSB7CisKK1JlYWRCYXNlICpSZWFkRmFjdG9yeShpbnQgZmQsIHVpbnQ2NF90ICZyYXdfYW1vdW50LCBjb25zdCB2b2lkICphbHJlYWR5X2RhdGEsIHN0ZDo6c2l6ZV90IGFscmVhZHlfc2l6ZSwgYm9vbCByZXF1aXJlX2NvbXByZXNzZWQpOworCisvLyBDb21wbGV0ZWQgZmlsZSB0aGF0IG90aGVyIGNsYXNzZXMgY2FuIHRodW5rIHRvLgorY2xhc3MgQ29tcGxldGUgOiBwdWJsaWMgUmVhZEJhc2UgeworICBwdWJsaWM6CisgICAgc3RkOjpzaXplX3QgUmVhZCh2b2lkICosIHN0ZDo6c2l6ZV90LCBSZWFkQ29tcHJlc3NlZCAmKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworCitjbGFzcyBVbmNvbXByZXNzZWQgOiBwdWJsaWMgUmVhZEJhc2UgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgVW5jb21wcmVzc2VkKGludCBmZCkgOiBmZF8oZmQpIHt9CisKKyAgICBzdGQ6OnNpemVfdCBSZWFkKHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQsIFJlYWRDb21wcmVzc2VkICZ0aHVuaykgeworICAgICAgc3RkOjpzaXplX3QgZ290ID0gUGFydGlhbFJlYWQoZmRfLmdldCgpLCB0bywgYW1vdW50KTsKKyAgICAgIFJlYWRDb3VudCh0aHVuaykgKz0gZ290OworICAgICAgcmV0dXJuIGdvdDsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzY29wZWRfZmQgZmRfOworfTsKKworY2xhc3MgVW5jb21wcmVzc2VkV2l0aEhlYWRlciA6IHB1YmxpYyBSZWFkQmFzZSB7CisgIHB1YmxpYzoKKyAgICBVbmNvbXByZXNzZWRXaXRoSGVhZGVyKGludCBmZCwgY29uc3Qgdm9pZCAqYWxyZWFkeV9kYXRhLCBzdGQ6OnNpemVfdCBhbHJlYWR5X3NpemUpIDogZmRfKGZkKSB7CisgICAgICBhc3NlcnQoYWxyZWFkeV9zaXplKTsKKyAgICAgIGJ1Zl8ucmVzZXQobWFsbG9jKGFscmVhZHlfc2l6ZSkpOworICAgICAgaWYgKCFidWZfLmdldCgpKSB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgICAgbWVtY3B5KGJ1Zl8uZ2V0KCksIGFscmVhZHlfZGF0YSwgYWxyZWFkeV9zaXplKTsKKyAgICAgIHJlbWFpbl8gPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmXy5nZXQoKSk7CisgICAgICBlbmRfID0gcmVtYWluXyArIGFscmVhZHlfc2l6ZTsKKyAgICB9CisKKyAgICBzdGQ6OnNpemVfdCBSZWFkKHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQsIFJlYWRDb21wcmVzc2VkICZ0aHVuaykgeworICAgICAgYXNzZXJ0KGJ1Zl8uZ2V0KCkpOworICAgICAgYXNzZXJ0KHJlbWFpbl8gIT0gZW5kXyk7CisgICAgICBzdGQ6OnNpemVfdCBzZW5kaW5nID0gc3RkOjptaW48c3RkOjpzaXplX3Q+KGFtb3VudCwgZW5kXyAtIHJlbWFpbl8pOworICAgICAgbWVtY3B5KHRvLCByZW1haW5fLCBzZW5kaW5nKTsKKyAgICAgIHJlbWFpbl8gKz0gc2VuZGluZzsKKyAgICAgIGlmIChyZW1haW5fID09IGVuZF8pIHsKKyAgICAgICAgUmVwbGFjZVRoaXMobmV3IFVuY29tcHJlc3NlZChmZF8ucmVsZWFzZSgpKSwgdGh1bmspOworICAgICAgfQorICAgICAgcmV0dXJuIHNlbmRpbmc7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc2NvcGVkX21hbGxvYyBidWZfOworICAgIHVpbnQ4X3QgKnJlbWFpbl87CisgICAgdWludDhfdCAqZW5kXzsKKworICAgIHNjb3BlZF9mZCBmZF87Cit9OworCitzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3Qga0lucHV0QnVmZmVyID0gMTYzODQ7CisKK3RlbXBsYXRlIDxjbGFzcyBDb21wcmVzc2lvbj4gY2xhc3MgU3RyZWFtQ29tcHJlc3NlZCA6IHB1YmxpYyBSZWFkQmFzZSB7CisgIHB1YmxpYzoKKyAgICBTdHJlYW1Db21wcmVzc2VkKGludCBmZCwgY29uc3Qgdm9pZCAqYWxyZWFkeV9kYXRhLCBzdGQ6OnNpemVfdCBhbHJlYWR5X3NpemUpCisgICAgICA6IGZpbGVfKGZkKSwKKyAgICAgICAgaW5fYnVmZmVyXyhNYWxsb2NPclRocm93KGtJbnB1dEJ1ZmZlcikpLAorICAgICAgICBiYWNrXyhtZW1jcHkoaW5fYnVmZmVyXy5nZXQoKSwgYWxyZWFkeV9kYXRhLCBhbHJlYWR5X3NpemUpLCBhbHJlYWR5X3NpemUpIHt9CisKKyAgICBzdGQ6OnNpemVfdCBSZWFkKHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQsIFJlYWRDb21wcmVzc2VkICZ0aHVuaykgeworICAgICAgaWYgKGFtb3VudCA9PSAwKSByZXR1cm4gMDsKKyAgICAgIGJhY2tfLlNldE91dHB1dCh0bywgYW1vdW50KTsKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKCFiYWNrXy5TdHJlYW0oKS5hdmFpbF9pbikgUmVhZElucHV0KHRodW5rKTsKKyAgICAgICAgaWYgKCFiYWNrXy5Qcm9jZXNzKCkpIHsKKyAgICAgICAgICAvLyByZWFjaGVkIGVuZCwgYXQgbGVhc3QgZm9yIHRoZSBjb21wcmVzc2VkIHBvcnRpb24uCisgICAgICAgICAgc3RkOjpzaXplX3QgcmV0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihzdGF0aWNfY2FzdDx2b2lkKj4oYmFja18uU3RyZWFtKCkubmV4dF9vdXQpKSAtIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPih0byk7CisgICAgICAgICAgUmVwbGFjZVRoaXMoUmVhZEZhY3RvcnkoZmlsZV8ucmVsZWFzZSgpLCBSZWFkQ291bnQodGh1bmspLCBiYWNrXy5TdHJlYW0oKS5uZXh0X2luLCBiYWNrXy5TdHJlYW0oKS5hdmFpbF9pbiwgdHJ1ZSksIHRodW5rKTsKKyAgICAgICAgICBpZiAocmV0KSByZXR1cm4gcmV0OworICAgICAgICAgIC8vIFdlIGRpZCBub3QgcmVhZCBhbnl0aGluZyB0aGlzIHJvdW5kLCBzbyBjbGllbnRzIG1pZ2h0IHRoaW5rIEVPRi4gIFRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IHRvIHRoZSBuZXh0IHJlYWRlci4KKyAgICAgICAgICByZXR1cm4gQ3VycmVudCh0aHVuayktPlJlYWQodG8sIGFtb3VudCwgdGh1bmspOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChiYWNrXy5TdHJlYW0oKS5uZXh0X291dCA9PSB0byk7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KHN0YXRpY19jYXN0PHZvaWQqPihiYWNrXy5TdHJlYW0oKS5uZXh0X291dCkpIC0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRvKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIFJlYWRJbnB1dChSZWFkQ29tcHJlc3NlZCAmdGh1bmspIHsKKyAgICAgIGFzc2VydCghYmFja18uU3RyZWFtKCkuYXZhaWxfaW4pOworICAgICAgc3RkOjpzaXplX3QgZ290ID0gUmVhZE9yRU9GKGZpbGVfLmdldCgpLCBpbl9idWZmZXJfLmdldCgpLCBrSW5wdXRCdWZmZXIpOworICAgICAgYmFja18uU2V0SW5wdXQoaW5fYnVmZmVyXy5nZXQoKSwgZ290KTsKKyAgICAgIFJlYWRDb3VudCh0aHVuaykgKz0gZ290OworICAgIH0KKworICAgIHNjb3BlZF9mZCBmaWxlXzsKKyAgICBzY29wZWRfbWFsbG9jIGluX2J1ZmZlcl87CisKKyAgICBDb21wcmVzc2lvbiBiYWNrXzsKK307CisKKyNpZmRlZiBIQVZFX1pMSUIKK2NsYXNzIEdaaXAgeworICBwdWJsaWM6CisgICAgR1ppcChjb25zdCB2b2lkICpiYXNlLCBzdGQ6OnNpemVfdCBhbW91bnQpIHsKKyAgICAgIFNldElucHV0KGJhc2UsIGFtb3VudCk7CisgICAgICBzdHJlYW1fLnphbGxvYyA9IFpfTlVMTDsKKyAgICAgIHN0cmVhbV8uemZyZWUgPSBaX05VTEw7CisgICAgICBzdHJlYW1fLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICAgIHN0cmVhbV8ubXNnID0gTlVMTDsKKyAgICAgIC8vIDMyIGZvciB6bGliIGFuZCBnemlwIGRlY29kaW5nIHdpdGggYXV0b21hdGljIGhlYWRlciBkZXRlY3Rpb24uCisgICAgICAvLyAxNSBmb3IgbWF4aW11bSB3aW5kb3cgc2l6ZS4KKyAgICAgIFVUSUxfVEhST1dfSUYoWl9PSyAhPSBpbmZsYXRlSW5pdDIoJnN0cmVhbV8sIDMyICsgMTUpLCBHWkV4Y2VwdGlvbiwgIkZhaWxlZCB0byBpbml0aWFsaXplIHpsaWIuIik7CisgICAgfQorCisgICAgfkdaaXAoKSB7CisgICAgICBpZiAoWl9PSyAhPSBpbmZsYXRlRW5kKCZzdHJlYW1fKSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgInpsaWIgY291bGQgbm90IGNsb3NlIHByb3Blcmx5LiIgPDwgc3RkOjplbmRsOworICAgICAgICBhYm9ydCgpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgU2V0T3V0cHV0KHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQpIHsKKyAgICAgIHN0cmVhbV8ubmV4dF9vdXQgPSBzdGF0aWNfY2FzdDxCeXRlZio+KHRvKTsKKyAgICAgIHN0cmVhbV8uYXZhaWxfb3V0ID0gc3RkOjptaW48c3RkOjpzaXplX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8dUludD46Om1heCgpLCBhbW91bnQpOworICAgIH0KKworICAgIHZvaWQgU2V0SW5wdXQoY29uc3Qgdm9pZCAqYmFzZSwgc3RkOjpzaXplX3QgYW1vdW50KSB7CisgICAgICBhc3NlcnQoYW1vdW50IDwgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8dUludD46Om1heCgpKSk7CisgICAgICBzdHJlYW1fLm5leHRfaW4gPSBjb25zdF9jYXN0PEJ5dGVmKj4oc3RhdGljX2Nhc3Q8Y29uc3QgQnl0ZWYqPihiYXNlKSk7CisgICAgICBzdHJlYW1fLmF2YWlsX2luID0gYW1vdW50OworICAgIH0KKworICAgIGNvbnN0IHpfc3RyZWFtICZTdHJlYW0oKSBjb25zdCB7IHJldHVybiBzdHJlYW1fOyB9CisKKyAgICBib29sIFByb2Nlc3MoKSB7CisgICAgICBpbnQgcmVzdWx0ID0gaW5mbGF0ZSgmc3RyZWFtXywgMCk7CisgICAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIFpfT0s6CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgWl9TVFJFQU1fRU5EOgorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBaX0VSUk5POgorICAgICAgICAgIFVUSUxfVEhST1coRXJybm9FeGNlcHRpb24sICJ6bGliIGVycm9yIik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgVVRJTF9USFJPVyhHWkV4Y2VwdGlvbiwgInpsaWIgZW5jb3VudGVyZWQgIiA8PCAoc3RyZWFtXy5tc2cgPyBzdHJlYW1fLm1zZyA6ICJhbiBlcnJvciAiKSA8PCAiIGNvZGUgIiA8PCByZXN1bHQpOworICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIHpfc3RyZWFtIHN0cmVhbV87Cit9OworI2VuZGlmIC8vIEhBVkVfWkxJQgorCisjaWZkZWYgSEFWRV9CWkxJQgorY2xhc3MgQlppcCB7CisgIHB1YmxpYzoKKyAgICBCWmlwKGNvbnN0IHZvaWQgKmJhc2UsIHN0ZDo6c2l6ZV90IGFtb3VudCkgeworICAgICAgbWVtc2V0KCZzdHJlYW1fLCAwLCBzaXplb2Yoc3RyZWFtXykpOworICAgICAgU2V0SW5wdXQoYmFzZSwgYW1vdW50KTsKKyAgICAgIEhhbmRsZUVycm9yKEJaMl9iekRlY29tcHJlc3NJbml0KCZzdHJlYW1fLCAwLCAwKSk7CisgICAgfQorCisgICAgfkJaaXAoKSB7CisgICAgICB0cnkgeworICAgICAgICBIYW5kbGVFcnJvcihCWjJfYnpEZWNvbXByZXNzRW5kKCZzdHJlYW1fKSk7CisgICAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmZSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgICAgICBhYm9ydCgpOworICAgICAgfQorICAgIH0KKworICAgIGJvb2wgUHJvY2VzcygpIHsKKyAgICAgIGludCByZXQgPSBCWjJfYnpEZWNvbXByZXNzKCZzdHJlYW1fKTsKKyAgICAgIGlmIChyZXQgPT0gQlpfU1RSRUFNX0VORCkgcmV0dXJuIGZhbHNlOworICAgICAgSGFuZGxlRXJyb3IocmV0KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgU2V0T3V0cHV0KHZvaWQgKmJhc2UsIHN0ZDo6c2l6ZV90IGFtb3VudCkgeworICAgICAgc3RyZWFtXy5uZXh0X291dCA9IHN0YXRpY19jYXN0PGNoYXIqPihiYXNlKTsKKyAgICAgIHN0cmVhbV8uYXZhaWxfb3V0ID0gc3RkOjptaW48c3RkOjpzaXplX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWF4KCksIGFtb3VudCk7CisgICAgfQorCisgICAgdm9pZCBTZXRJbnB1dChjb25zdCB2b2lkICpiYXNlLCBzdGQ6OnNpemVfdCBhbW91bnQpIHsKKyAgICAgIHN0cmVhbV8ubmV4dF9pbiA9IGNvbnN0X2Nhc3Q8Y2hhcio+KHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihiYXNlKSk7CisgICAgICBzdHJlYW1fLmF2YWlsX2luID0gYW1vdW50OworICAgIH0KKworICAgIGNvbnN0IGJ6X3N0cmVhbSAmU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gc3RyZWFtXzsgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBIYW5kbGVFcnJvcihpbnQgdmFsdWUpIHsKKyAgICAgIHN3aXRjaCh2YWx1ZSkgeworICAgICAgICBjYXNlIEJaX09LOgorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBCWl9DT05GSUdfRVJST1I6CisgICAgICAgICAgVVRJTF9USFJPVyhCWkV4Y2VwdGlvbiwgImJ6aXAyIHNlZW1zIHRvIGJlIG1pc2NvbXBpbGVkLiIpOworICAgICAgICBjYXNlIEJaX1BBUkFNX0VSUk9SOgorICAgICAgICAgIFVUSUxfVEhST1coQlpFeGNlcHRpb24sICJiemlwMiBQYXJhbWV0ZXIgZXJyb3IiKTsKKyAgICAgICAgY2FzZSBCWl9EQVRBX0VSUk9SOgorICAgICAgICAgIFVUSUxfVEhST1coQlpFeGNlcHRpb24sICJiemlwMiBkZXRlY3RlZCBhIGNvcnJ1cHQgZmlsZSIpOworICAgICAgICBjYXNlIEJaX0RBVEFfRVJST1JfTUFHSUM6CisgICAgICAgICAgVVRJTF9USFJPVyhCWkV4Y2VwdGlvbiwgImJ6aXAyIGRldGVjdGVkIGJhZCBtYWdpYyBieXRlcy4gIFBlcmhhcHMgdGhpcyB3YXMgbm90IGEgYnppcDIgZmlsZSBhZnRlciBhbGw/Iik7CisgICAgICAgIGNhc2UgQlpfTUVNX0VSUk9SOgorICAgICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgVVRJTF9USFJPVyhCWkV4Y2VwdGlvbiwgIlVua25vd24gYnppcDIgZXJyb3IgY29kZSAiIDw8IHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBiel9zdHJlYW0gc3RyZWFtXzsKK307CisjZW5kaWYgLy8gSEFWRV9CWkxJQgorCisjaWZkZWYgSEFWRV9YWkxJQgorY2xhc3MgWFppcCB7CisgIHB1YmxpYzoKKyAgICBYWmlwKGNvbnN0IHZvaWQgKmJhc2UsIHN0ZDo6c2l6ZV90IGFtb3VudCkKKyAgICAgIDogc3RyZWFtXygpLCBhY3Rpb25fKExaTUFfUlVOKSB7CisgICAgICBtZW1zZXQoJnN0cmVhbV8sIDAsIHNpemVvZihzdHJlYW1fKSk7CisgICAgICBTZXRJbnB1dChiYXNlLCBhbW91bnQpOworICAgICAgSGFuZGxlRXJyb3IobHptYV9zdHJlYW1fZGVjb2Rlcigmc3RyZWFtXywgVUlOVDY0X01BWCwgMCkpOworICAgIH0KKworICAgIH5YWmlwKCkgeworICAgICAgbHptYV9lbmQoJnN0cmVhbV8pOworICAgIH0KKworICAgIHZvaWQgU2V0T3V0cHV0KHZvaWQgKmJhc2UsIHN0ZDo6c2l6ZV90IGFtb3VudCkgeworICAgICAgc3RyZWFtXy5uZXh0X291dCA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihiYXNlKTsKKyAgICAgIHN0cmVhbV8uYXZhaWxfb3V0ID0gYW1vdW50OworICAgIH0KKworICAgIHZvaWQgU2V0SW5wdXQoY29uc3Qgdm9pZCAqYmFzZSwgc3RkOjpzaXplX3QgYW1vdW50KSB7CisgICAgICBzdHJlYW1fLm5leHRfaW4gPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYmFzZSk7CisgICAgICBzdHJlYW1fLmF2YWlsX2luID0gYW1vdW50OworICAgICAgaWYgKCFhbW91bnQpIGFjdGlvbl8gPSBMWk1BX0ZJTklTSDsKKyAgICB9CisKKyAgICBjb25zdCBsem1hX3N0cmVhbSAmU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gc3RyZWFtXzsgfQorCisgICAgYm9vbCBQcm9jZXNzKCkgeworICAgICAgbHptYV9yZXQgc3RhdHVzID0gbHptYV9jb2RlKCZzdHJlYW1fLCBhY3Rpb25fKTsKKyAgICAgIGlmIChzdGF0dXMgPT0gTFpNQV9TVFJFQU1fRU5EKSByZXR1cm4gZmFsc2U7CisgICAgICBIYW5kbGVFcnJvcihzdGF0dXMpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBIYW5kbGVFcnJvcihsem1hX3JldCB2YWx1ZSkgeworICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICBjYXNlIExaTUFfT0s6CisgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIExaTUFfTUVNX0VSUk9SOgorICAgICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgICAgIGNhc2UgTFpNQV9GT1JNQVRfRVJST1I6CisgICAgICAgICAgVVRJTF9USFJPVyhYWkV4Y2VwdGlvbiwgInh6bGliIHNheXMgZmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiKTsKKyAgICAgICAgY2FzZSBMWk1BX09QVElPTlNfRVJST1I6CisgICAgICAgICAgVVRJTF9USFJPVyhYWkV4Y2VwdGlvbiwgInh6bGliIHNheXMgdW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gb3B0aW9ucyIpOworICAgICAgICBjYXNlIExaTUFfREFUQV9FUlJPUjoKKyAgICAgICAgICBVVElMX1RIUk9XKFhaRXhjZXB0aW9uLCAieHpsaWIgc2F5cyB0aGlzIGZpbGUgaXMgY29ycnVwdCIpOworICAgICAgICBjYXNlIExaTUFfQlVGX0VSUk9SOgorICAgICAgICAgIFVUSUxfVEhST1coWFpFeGNlcHRpb24sICJ4emxpYiBzYXlzIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgVVRJTF9USFJPVyhYWkV4Y2VwdGlvbiwgInVucmVjb2duaXplZCB4emxpYiBlcnJvciAiIDw8IHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBsem1hX3N0cmVhbSBzdHJlYW1fOworICAgIGx6bWFfYWN0aW9uIGFjdGlvbl87Cit9OworI2VuZGlmIC8vIEhBVkVfWFpMSUIKKworY2xhc3MgSVN0cmVhbVJlYWRlciA6IHB1YmxpYyBSZWFkQmFzZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJU3RyZWFtUmVhZGVyKHN0ZDo6aXN0cmVhbSAmc3RyZWFtKSA6IHN0cmVhbV8oc3RyZWFtKSB7fQorCisgICAgc3RkOjpzaXplX3QgUmVhZCh2b2lkICp0bywgc3RkOjpzaXplX3QgYW1vdW50LCBSZWFkQ29tcHJlc3NlZCAmdGh1bmspIHsKKyAgICAgIGlmICghc3RyZWFtXy5yZWFkKHN0YXRpY19jYXN0PGNoYXIqPih0byksIGFtb3VudCkpIHsKKyAgICAgICAgVVRJTF9USFJPV19JRighc3RyZWFtXy5lb2YoKSwgRXJybm9FeGNlcHRpb24sICJpc3RyZWFtIGVycm9yIik7CisgICAgICAgIGFtb3VudCA9IHN0cmVhbV8uZ2NvdW50KCk7CisgICAgICB9CisgICAgICBSZWFkQ291bnQodGh1bmspICs9IGFtb3VudDsKKyAgICAgIHJldHVybiBhbW91bnQ7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjppc3RyZWFtICZzdHJlYW1fOworfTsKKworZW51bSBNYWdpY1Jlc3VsdCB7CisgIFVUSUxfVU5LTk9XTiwgVVRJTF9HWklQLCBVVElMX0JaSVAsIFVUSUxfWFpJUAorfTsKKworTWFnaWNSZXN1bHQgRGV0ZWN0TWFnaWMoY29uc3Qgdm9pZCAqZnJvbV92b2lkLCBzdGQ6OnNpemVfdCBsZW5ndGgpIHsKKyAgY29uc3QgdWludDhfdCAqaGVhZGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGZyb21fdm9pZCk7CisgIGlmIChsZW5ndGggPj0gMiAmJiBoZWFkZXJbMF0gPT0gMHgxZiAmJiBoZWFkZXJbMV0gPT0gMHg4YikgeworICAgIHJldHVybiBVVElMX0daSVA7CisgIH0KKyAgY29uc3QgdWludDhfdCBrQlpNYWdpY1szXSA9IHsnQicsICdaJywgJ2gnfTsKKyAgaWYgKGxlbmd0aCA+PSBzaXplb2Yoa0JaTWFnaWMpICYmICFtZW1jbXAoaGVhZGVyLCBrQlpNYWdpYywgc2l6ZW9mKGtCWk1hZ2ljKSkpIHsKKyAgICByZXR1cm4gVVRJTF9CWklQOworICB9CisgIGNvbnN0IHVpbnQ4X3Qga1haTWFnaWNbNl0gPSB7IDB4RkQsICc3JywgJ3onLCAnWCcsICdaJywgMHgwMCB9OworICBpZiAobGVuZ3RoID49IHNpemVvZihrWFpNYWdpYykgJiYgIW1lbWNtcChoZWFkZXIsIGtYWk1hZ2ljLCBzaXplb2Yoa1haTWFnaWMpKSkgeworICAgIHJldHVybiBVVElMX1haSVA7CisgIH0KKyAgcmV0dXJuIFVUSUxfVU5LTk9XTjsKK30KKworUmVhZEJhc2UgKlJlYWRGYWN0b3J5KGludCBmZCwgdWludDY0X3QgJnJhd19hbW91bnQsIGNvbnN0IHZvaWQgKmFscmVhZHlfZGF0YSwgY29uc3Qgc3RkOjpzaXplX3QgYWxyZWFkeV9zaXplLCBib29sIHJlcXVpcmVfY29tcHJlc3NlZCkgeworICBzY29wZWRfZmQgaG9sZChmZCk7CisgIHN0ZDo6c3RyaW5nIGhlYWRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihhbHJlYWR5X2RhdGEpLCBhbHJlYWR5X3NpemUpOworICBpZiAoaGVhZGVyLnNpemUoKSA8IFJlYWRDb21wcmVzc2VkOjprTWFnaWNTaXplKSB7CisgICAgc3RkOjpzaXplX3Qgb3JpZ2luYWwgPSBoZWFkZXIuc2l6ZSgpOworICAgIGhlYWRlci5yZXNpemUoUmVhZENvbXByZXNzZWQ6OmtNYWdpY1NpemUpOworICAgIHN0ZDo6c2l6ZV90IGdvdCA9IFJlYWRPckVPRihmZCwgJmhlYWRlcltvcmlnaW5hbF0sIFJlYWRDb21wcmVzc2VkOjprTWFnaWNTaXplIC0gb3JpZ2luYWwpOworICAgIHJhd19hbW91bnQgKz0gZ290OworICAgIGhlYWRlci5yZXNpemUob3JpZ2luYWwgKyBnb3QpOworICB9CisgIGlmIChoZWFkZXIuZW1wdHkoKSkgeworICAgIHJldHVybiBuZXcgQ29tcGxldGUoKTsKKyAgfQorICBzd2l0Y2ggKERldGVjdE1hZ2ljKCZoZWFkZXJbMF0sIGhlYWRlci5zaXplKCkpKSB7CisgICAgY2FzZSBVVElMX0daSVA6CisjaWZkZWYgSEFWRV9aTElCCisgICAgICByZXR1cm4gbmV3IFN0cmVhbUNvbXByZXNzZWQ8R1ppcD4oaG9sZC5yZWxlYXNlKCksIGhlYWRlci5kYXRhKCksIGhlYWRlci5zaXplKCkpOworI2Vsc2UKKyAgICAgIFVUSUxfVEhST1coQ29tcHJlc3NlZEV4Y2VwdGlvbiwgIlRoaXMgbG9va3MgbGlrZSBhIGd6aXAgZmlsZSBidXQgZ3ppcCBzdXBwb3J0IHdhcyBub3QgY29tcGlsZWQgaW4uIik7CisjZW5kaWYKKyAgICBjYXNlIFVUSUxfQlpJUDoKKyNpZmRlZiBIQVZFX0JaTElCCisgICAgICByZXR1cm4gbmV3IFN0cmVhbUNvbXByZXNzZWQ8QlppcD4oaG9sZC5yZWxlYXNlKCksICZoZWFkZXJbMF0sIGhlYWRlci5zaXplKCkpOworI2Vsc2UKKyAgICAgIFVUSUxfVEhST1coQ29tcHJlc3NlZEV4Y2VwdGlvbiwgIlRoaXMgbG9va3MgbGlrZSBhIGJ6aXAgZmlsZSAoaXQgYmVnaW5zIHdpdGggQlpoKSwgYnV0IGJ6aXAgc3VwcG9ydCB3YXMgbm90IGNvbXBpbGVkIGluLiIpOworI2VuZGlmCisgICAgY2FzZSBVVElMX1haSVA6CisjaWZkZWYgSEFWRV9YWkxJQgorICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Db21wcmVzc2VkPFhaaXA+KGhvbGQucmVsZWFzZSgpLCBoZWFkZXIuZGF0YSgpLCBoZWFkZXIuc2l6ZSgpKTsKKyNlbHNlCisgICAgICBVVElMX1RIUk9XKENvbXByZXNzZWRFeGNlcHRpb24sICJUaGlzIGxvb2tzIGxpa2UgYW4geHogZmlsZSwgYnV0IHh6IHN1cHBvcnQgd2FzIG5vdCBjb21waWxlZCBpbi4iKTsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBVVElMX1RIUk9XX0lGKHJlcXVpcmVfY29tcHJlc3NlZCwgQ29tcHJlc3NlZEV4Y2VwdGlvbiwgIlVuY29tcHJlc3NlZCBkYXRhIGRldGVjdGVkIGFmdGVyIGEgY29tcHJlc3NzZWQgZmlsZS4gIFRoaXMgY291bGQgYmUgc3VwcG9ydGVkIGJ1dCB1c3VhbGx5IGluZGljYXRlcyBhbiBlcnJvci4iKTsKKyAgICAgIHJldHVybiBuZXcgVW5jb21wcmVzc2VkV2l0aEhlYWRlcihob2xkLnJlbGVhc2UoKSwgaGVhZGVyLmRhdGEoKSwgaGVhZGVyLnNpemUoKSk7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UKKworYm9vbCBSZWFkQ29tcHJlc3NlZDo6RGV0ZWN0Q29tcHJlc3NlZE1hZ2ljKGNvbnN0IHZvaWQgKmZyb21fdm9pZCkgeworICByZXR1cm4gRGV0ZWN0TWFnaWMoZnJvbV92b2lkLCBrTWFnaWNTaXplKSAhPSBVVElMX1VOS05PV047Cit9CisKK1JlYWRDb21wcmVzc2VkOjpSZWFkQ29tcHJlc3NlZChpbnQgZmQpIHsKKyAgUmVzZXQoZmQpOworfQorCitSZWFkQ29tcHJlc3NlZDo6UmVhZENvbXByZXNzZWQoc3RkOjppc3RyZWFtICZpbikgeworICBSZXNldChpbik7Cit9CisKK1JlYWRDb21wcmVzc2VkOjpSZWFkQ29tcHJlc3NlZCgpIHt9CisKK1JlYWRDb21wcmVzc2VkOjp+UmVhZENvbXByZXNzZWQoKSB7fQorCit2b2lkIFJlYWRDb21wcmVzc2VkOjpSZXNldChpbnQgZmQpIHsKKyAgcmF3X2Ftb3VudF8gPSAwOworICBpbnRlcm5hbF8ucmVzZXQoKTsKKyAgaW50ZXJuYWxfLnJlc2V0KFJlYWRGYWN0b3J5KGZkLCByYXdfYW1vdW50XywgTlVMTCwgMCwgZmFsc2UpKTsKK30KKwordm9pZCBSZWFkQ29tcHJlc3NlZDo6UmVzZXQoc3RkOjppc3RyZWFtICZpbikgeworICBpbnRlcm5hbF8ucmVzZXQoKTsKKyAgaW50ZXJuYWxfLnJlc2V0KG5ldyBJU3RyZWFtUmVhZGVyKGluKSk7Cit9CisKK3N0ZDo6c2l6ZV90IFJlYWRDb21wcmVzc2VkOjpSZWFkKHZvaWQgKnRvLCBzdGQ6OnNpemVfdCBhbW91bnQpIHsKKyAgcmV0dXJuIGludGVybmFsXy0+UmVhZCh0bywgYW1vdW50LCAqdGhpcyk7Cit9CisKK3N0ZDo6c2l6ZV90IFJlYWRDb21wcmVzc2VkOjpSZWFkT3JFT0Yodm9pZCAqY29uc3QgdG9faW4sIHN0ZDo6c2l6ZV90IGFtb3VudCkgeworICB1aW50OF90ICp0byA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHRvX2luKTsKKyAgd2hpbGUgKGFtb3VudCkgeworICAgIHN0ZDo6c2l6ZV90IGdvdCA9IFJlYWQodG8sIGFtb3VudCk7CisgICAgaWYgKCFnb3QpIGJyZWFrOworICAgIHRvICs9IGdvdDsKKyAgICBhbW91bnQgLT0gZ290OworICB9CisgIHJldHVybiB0byAtIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHRvX2luKTsKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvcmVhZF9jb21wcmVzc2VkLmhoIGIvc3JjL2tlbmxtL3V0aWwvcmVhZF9jb21wcmVzc2VkLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNWE0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9yZWFkX2NvbXByZXNzZWQuaGgKQEAgLTAsMCArMSw4NCBAQAorI2lmbmRlZiBVVElMX1JFQURfQ09NUFJFU1NFRF9ICisjZGVmaW5lIFVUSUxfUkVBRF9DT01QUkVTU0VEX0gKKworI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHV0aWwgeworCitjbGFzcyBDb21wcmVzc2VkRXhjZXB0aW9uIDogcHVibGljIEV4Y2VwdGlvbiB7CisgIHB1YmxpYzoKKyAgICBDb21wcmVzc2VkRXhjZXB0aW9uKCkgdGhyb3coKTsKKyAgICB2aXJ0dWFsIH5Db21wcmVzc2VkRXhjZXB0aW9uKCkgdGhyb3coKTsKK307CisKK2NsYXNzIEdaRXhjZXB0aW9uIDogcHVibGljIENvbXByZXNzZWRFeGNlcHRpb24geworICBwdWJsaWM6CisgICAgR1pFeGNlcHRpb24oKSB0aHJvdygpOworICAgIH5HWkV4Y2VwdGlvbigpIHRocm93KCk7Cit9OworCitjbGFzcyBCWkV4Y2VwdGlvbiA6IHB1YmxpYyBDb21wcmVzc2VkRXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIEJaRXhjZXB0aW9uKCkgdGhyb3coKTsKKyAgICB+QlpFeGNlcHRpb24oKSB0aHJvdygpOworfTsKKworY2xhc3MgWFpFeGNlcHRpb24gOiBwdWJsaWMgQ29tcHJlc3NlZEV4Y2VwdGlvbiB7CisgIHB1YmxpYzoKKyAgICBYWkV4Y2VwdGlvbigpIHRocm93KCk7CisgICAgflhaRXhjZXB0aW9uKCkgdGhyb3coKTsKK307CisKK2NsYXNzIFJlYWRCYXNlOworCitjbGFzcyBSZWFkQ29tcHJlc3NlZCB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3Qga01hZ2ljU2l6ZSA9IDY7CisgICAgLy8gTXVzdCBoYXZlIGF0IGxlYXN0IGtNYWdpY1NpemUgYnl0ZXMuCisgICAgc3RhdGljIGJvb2wgRGV0ZWN0Q29tcHJlc3NlZE1hZ2ljKGNvbnN0IHZvaWQgKmZyb20pOworCisgICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIGZkLgorICAgIGV4cGxpY2l0IFJlYWRDb21wcmVzc2VkKGludCBmZCk7CisKKyAgICAvLyBUcnkgdG8gYXZvaWQgdXNpbmcgdGhpcy4gIFVzZSB0aGUgZmQgaW5zdGVhZC4KKyAgICAvLyBUaGVyZSBpcyBubyBkZWNvbXByZXNzaW9uIHN1cHBvcnQgZm9yIGlzdHJlYW1zLgorICAgIGV4cGxpY2l0IFJlYWRDb21wcmVzc2VkKHN0ZDo6aXN0cmVhbSAmaW4pOworCisgICAgLy8gTXVzdCBjYWxsIFJlc2V0IGxhdGVyLgorICAgIFJlYWRDb21wcmVzc2VkKCk7CisKKyAgICB+UmVhZENvbXByZXNzZWQoKTsKKworICAgIC8vIFRha2VzIG93bmVyc2hpcCBvZiBmZC4KKyAgICB2b2lkIFJlc2V0KGludCBmZCk7CisKKyAgICAvLyBTYW1lIGFkdmljZSBhcyB0aGUgY29uc3RydWN0b3IuCisgICAgdm9pZCBSZXNldChzdGQ6OmlzdHJlYW0gJmluKTsKKworICAgIHN0ZDo6c2l6ZV90IFJlYWQodm9pZCAqdG8sIHN0ZDo6c2l6ZV90IGFtb3VudCk7CisKKyAgICAvLyBSZXBlYXRlZGx5IGNhbGwgcmVhZCB0byBmaWxsIGEgYnVmZmVyIHVubGVzcyBFT0YgaXMgaGl0LgorICAgIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAgICBzdGQ6OnNpemVfdCBSZWFkT3JFT0Yodm9pZCAqY29uc3QgdG8sIHN0ZDo6c2l6ZV90IGFtb3VudCk7CisKKyAgICB1aW50NjRfdCBSYXdBbW91bnQoKSBjb25zdCB7IHJldHVybiByYXdfYW1vdW50XzsgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFJlYWRCYXNlOworCisgICAgc2NvcGVkX3B0cjxSZWFkQmFzZT4gaW50ZXJuYWxfOworCisgICAgdWludDY0X3QgcmF3X2Ftb3VudF87CisKKyAgICAvLyBObyBjb3B5aW5nLgorICAgIFJlYWRDb21wcmVzc2VkKGNvbnN0IFJlYWRDb21wcmVzc2VkICYpOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFJlYWRDb21wcmVzc2VkICYpOworfTsKKworfSAvLyBuYW1lc3BhY2UgdXRpbAorCisjZW5kaWYgLy8gVVRJTF9SRUFEX0NPTVBSRVNTRURfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvcmVhZF9jb21wcmVzc2VkX3Rlc3QuY2MgYi9zcmMva2VubG0vdXRpbC9yZWFkX2NvbXByZXNzZWRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTgzY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvcmVhZF9jb21wcmVzc2VkX3Rlc3QuY2MKQEAgLTAsMCArMSwxMzAgQEAKKyNpbmNsdWRlICJ1dGlsL3JlYWRfY29tcHJlc3NlZC5oaCIKKworI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKKyNpbmNsdWRlICJ1dGlsL2hhdmUuaGgiCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgUmVhZENvbXByZXNzZWRUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworI2lmIGRlZmluZWQgX19NSU5HVzMyX18KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaWYgIWRlZmluZWQgbWtzdGVtcAorLy8gVE9ETyBpbnNlY3VyZQoraW50IG1rc3RlbXAoY2hhciAqIHN0ZW1wbGF0ZSkKK3sKKyAgICBjaGFyICpmaWxlbmFtZSA9IG1rdGVtcChzdGVtcGxhdGUpOworICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIG9wZW4oZmlsZW5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQsIDA2MDApOworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBkZWZpbmVkCisKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSB7CisKK3ZvaWQgUmVhZExvb3AoUmVhZENvbXByZXNzZWQgJnJlYWRlciwgdm9pZCAqdG9fdm9pZCwgc3RkOjpzaXplX3QgYW1vdW50KSB7CisgIHVpbnQ4X3QgKnRvID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KHRvX3ZvaWQpOworICB3aGlsZSAoYW1vdW50KSB7CisgICAgc3RkOjpzaXplX3QgcmV0ID0gcmVhZGVyLlJlYWQodG8sIGFtb3VudCk7CisgICAgQk9PU1RfUkVRVUlSRShyZXQpOworICAgIHRvICs9IHJldDsKKyAgICBhbW91bnQgLT0gcmV0OworICB9Cit9CisKK2NvbnN0IHVpbnQzMl90IGtTaXplNCA9IDEwMDAwMCAvIDQ7CisKK3N0ZDo6c3RyaW5nIFdyaXRlUmFuZG9tKCkgeworICBjaGFyIG5hbWVbXSA9ICJ0ZW1wWFhYWFhYIjsKKyAgc2NvcGVkX2ZkIG9yaWdpbmFsKG1rc3RlbXAobmFtZSkpOworICBCT09TVF9SRVFVSVJFKG9yaWdpbmFsLmdldCgpID4gMCk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrU2l6ZTQ7ICsraSkgeworICAgIFdyaXRlT3JUaHJvdyhvcmlnaW5hbC5nZXQoKSwgJmksIHNpemVvZih1aW50MzJfdCkpOworICB9CisgIHJldHVybiBuYW1lOworfQorCit2b2lkIFZlcmlmeVJlYWQoUmVhZENvbXByZXNzZWQgJnJlYWRlcikgeworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga1NpemU0OyArK2kpIHsKKyAgICB1aW50MzJfdCBnb3Q7CisgICAgUmVhZExvb3AocmVhZGVyLCAmZ290LCBzaXplb2YodWludDMyX3QpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChpLCBnb3QpOworICB9CisKKyAgY2hhciBpZ25vcmVkOworICBCT09TVF9DSEVDS19FUVVBTCgoc3RkOjpzaXplX3QpMCwgcmVhZGVyLlJlYWQoJmlnbm9yZWQsIDEpKTsKKyAgLy8gVGVzdCBkb3VibGUgRU9GIGNhbGwuCisgIEJPT1NUX0NIRUNLX0VRVUFMKChzdGQ6OnNpemVfdCkwLCByZWFkZXIuUmVhZCgmaWdub3JlZCwgMSkpOworfQorCit2b2lkIFRlc3RSYW5kb20oY29uc3QgY2hhciAqY29tcHJlc3NvcikgeworICBzdGQ6OnN0cmluZyBuYW1lKFdyaXRlUmFuZG9tKCkpOworCisgIGNoYXIgZ3puYW1lW10gPSAidGVtcFhYWFhYWCI7CisgIHNjb3BlZF9mZCBnemlwcGVkKG1rc3RlbXAoZ3puYW1lKSk7CisKKyAgc3RkOjpzdHJpbmcgY29tbWFuZChjb21wcmVzc29yKTsKKyNpZmRlZiBfX0NZR1dJTl9fCisgIGNvbW1hbmQgKz0gIi5leGUiOworI2VuZGlmCisgIGNvbW1hbmQgKz0gIiA8XCIiOworICBjb21tYW5kICs9IG5hbWU7CisgIGNvbW1hbmQgKz0gIlwiID5cIiI7CisgIGNvbW1hbmQgKz0gZ3puYW1lOworICBjb21tYW5kICs9ICJcIiI7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoMCwgc3lzdGVtKGNvbW1hbmQuY19zdHIoKSkpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHVubGluayhuYW1lLmNfc3RyKCkpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgdW5saW5rKGd6bmFtZSkpOworCisgIFJlYWRDb21wcmVzc2VkIHJlYWRlcihnemlwcGVkLnJlbGVhc2UoKSk7CisgIFZlcmlmeVJlYWQocmVhZGVyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVW5jb21wcmVzc2VkKSB7CisgIFRlc3RSYW5kb20oImNhdCIpOworfQorCisjaWZkZWYgSEFWRV9aTElCCitCT09TVF9BVVRPX1RFU1RfQ0FTRShSZWFkR1opIHsKKyAgVGVzdFJhbmRvbSgiZ3ppcCIpOworfQorI2VuZGlmIC8vIEhBVkVfWkxJQgorCisjaWZkZWYgSEFWRV9CWkxJQgorQk9PU1RfQVVUT19URVNUX0NBU0UoUmVhZEJaKSB7CisgIFRlc3RSYW5kb20oImJ6aXAyIik7Cit9CisjZW5kaWYgLy8gSEFWRV9CWkxJQgorCisjaWZkZWYgSEFWRV9YWkxJQgorQk9PU1RfQVVUT19URVNUX0NBU0UoUmVhZFhaKSB7CisgIFRlc3RSYW5kb20oInh6Iik7Cit9CisjZW5kaWYKKworI2lmZGVmIEhBVkVfWkxJQgorQk9PU1RfQVVUT19URVNUX0NBU0UoQXBwZW5kR1opIHsKK30KKyNlbmRpZgorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShJU3RyZWFtKSB7CisgIHN0ZDo6c3RyaW5nIG5hbWUoV3JpdGVSYW5kb20oKSk7CisgIHN0ZDo6ZnN0cmVhbSBzdHJlYW0obmFtZS5jX3N0cigpLCBzdGQ6Omlvczo6aW4pOworICBCT09TVF9DSEVDS19FUVVBTCgwLCB1bmxpbmsobmFtZS5jX3N0cigpKSk7CisgIFJlYWRDb21wcmVzc2VkIHJlYWRlcjsKKyAgcmVhZGVyLlJlc2V0KHN0cmVhbSk7CisgIFZlcmlmeVJlYWQocmVhZGVyKTsKK30KKworfSAvLyBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIHV0aWwKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3Njb3BlZC5jYyBiL3NyYy9rZW5sbS91dGlsL3Njb3BlZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTdhYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvc2NvcGVkLmNjCkBAIC0wLDAgKzEsNDMgQEAKKyNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorCituYW1lc3BhY2UgdXRpbCB7CisKKy8vIFRPRE86IGlmIHdlJ3JlIHJlYWxseSB1bmRlciBtZW1vcnkgcHJlc3N1cmUsIGRvbid0IGFsbG9jYXRlIG1lbW9yeSB0bworLy8gZGlzcGxheSB0aGUgZXJyb3IuCitNYWxsb2NFeGNlcHRpb246Ok1hbGxvY0V4Y2VwdGlvbihzdGQ6OnNpemVfdCByZXF1ZXN0ZWQpIHRocm93KCkgeworICAqdGhpcyA8PCAiZm9yICIgPDwgcmVxdWVzdGVkIDw8ICIgYnl0ZXMgIjsKK30KKworTWFsbG9jRXhjZXB0aW9uOjp+TWFsbG9jRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorCituYW1lc3BhY2Ugewordm9pZCAqSW5zcGVjdEFkZHIodm9pZCAqYWRkciwgc3RkOjpzaXplX3QgcmVxdWVzdGVkLCBjb25zdCBjaGFyICpmdW5jX25hbWUpIHsKKyAgVVRJTF9USFJPV19JRl9BUkcoIWFkZHIgJiYgcmVxdWVzdGVkLCBNYWxsb2NFeGNlcHRpb24sIChyZXF1ZXN0ZWQpLCAiaW4gIiA8PCBmdW5jX25hbWUpOworICByZXR1cm4gYWRkcjsKK30KK30gLy8gbmFtZXNwYWNlCisKK3ZvaWQgKk1hbGxvY09yVGhyb3coc3RkOjpzaXplX3QgcmVxdWVzdGVkKSB7CisgIHJldHVybiBJbnNwZWN0QWRkcihzdGQ6Om1hbGxvYyhyZXF1ZXN0ZWQpLCByZXF1ZXN0ZWQsICJtYWxsb2MiKTsKK30KKwordm9pZCAqQ2FsbG9jT3JUaHJvdyhzdGQ6OnNpemVfdCByZXF1ZXN0ZWQpIHsKKyAgcmV0dXJuIEluc3BlY3RBZGRyKHN0ZDo6Y2FsbG9jKHJlcXVlc3RlZCwgMSksIHJlcXVlc3RlZCwgImNhbGxvYyIpOworfQorCit2b2lkIHNjb3BlZF9tYWxsb2M6OmNhbGxfcmVhbGxvYyhzdGQ6OnNpemVfdCByZXF1ZXN0ZWQpIHsKKyAgcF8gPSBJbnNwZWN0QWRkcihzdGQ6OnJlYWxsb2MocF8sIHJlcXVlc3RlZCksIHJlcXVlc3RlZCwgInJlYWxsb2MiKTsKK30KKwordm9pZCBBZHZpc2VIdWdlUGFnZXMoY29uc3Qgdm9pZCAqYWRkciwgc3RkOjpzaXplX3Qgc2l6ZSkgeworI2lmIE1BRFZfSFVHRVBBR0UKKyAgbWFkdmlzZSgodm9pZCopYWRkciwgc2l6ZSwgTUFEVl9IVUdFUEFHRSk7CisjZW5kaWYKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvc2NvcGVkLmhoIGIvc3JjL2tlbmxtL3V0aWwvc2NvcGVkLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTlhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zY29wZWQuaGgKQEAgLTAsMCArMSwxMTEgQEAKKyNpZm5kZWYgVVRJTF9TQ09QRURfSAorI2RlZmluZSBVVElMX1NDT1BFRF9ICisvKiBPdGhlciBzY29wZWQgb2JqZWN0cyBpbiB0aGUgc3R5bGUgb2Ygc2NvcGVkX3B0ci4gKi8KKworI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworbmFtZXNwYWNlIHV0aWwgeworCitjbGFzcyBNYWxsb2NFeGNlcHRpb24gOiBwdWJsaWMgRXJybm9FeGNlcHRpb24geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgTWFsbG9jRXhjZXB0aW9uKHN0ZDo6c2l6ZV90IHJlcXVlc3RlZCkgdGhyb3coKTsKKyAgICB+TWFsbG9jRXhjZXB0aW9uKCkgdGhyb3coKTsKK307CisKK3ZvaWQgKk1hbGxvY09yVGhyb3coc3RkOjpzaXplX3QgcmVxdWVzdGVkKTsKK3ZvaWQgKkNhbGxvY09yVGhyb3coc3RkOjpzaXplX3QgcmVxdWVzdGVkKTsKKworLyogVW5mb3J0dW5hdGVseSwgZGVmaW5pbmcgdGhlIG9wZXJhdG9yKiBmb3Igdm9pZCAqIG1ha2VzIHRoZSBjb21waWxlciBjb21wbGFpbi4KKyAqIFNvIHNjb3BlZCBpcyBzcGVjaWFsaXplZCB0byB2b2lkLiAgVGhpcyBpbmNsdWRlcyB0aGUgZnVuY3Rpb25hbGl0eSBjb21tb24gdG8KKyAqIGJvdGgsIG5hbWVseSBldmVyeXRoaW5nIGV4Y2VwdCByZWZlcmVuY2UuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDbG9zZXI+IGNsYXNzIHNjb3BlZF9iYXNlIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IHNjb3BlZF9iYXNlKFQgKnAgPSBOVUxMKSA6IHBfKHApIHt9CisKKyAgICB+c2NvcGVkX2Jhc2UoKSB7IENsb3Nlcjo6Q2xvc2UocF8pOyB9CisKKyAgICB2b2lkIHJlc2V0KFQgKnAgPSBOVUxMKSB7CisgICAgICBzY29wZWRfYmFzZSBvdGhlcihwXyk7CisgICAgICBwXyA9IHA7CisgICAgfQorCisgICAgVCAqZ2V0KCkgeyByZXR1cm4gcF87IH0KKyAgICBjb25zdCBUICpnZXQoKSBjb25zdCB7IHJldHVybiBwXzsgfQorCisgICAgVCAqb3BlcmF0b3ItPigpIHsgcmV0dXJuIHBfOyB9CisgICAgY29uc3QgVCAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHBfOyB9CisKKyAgICBUICpyZWxlYXNlKCkgeworICAgICAgVCAqcmV0ID0gcF87CisgICAgICBwXyA9IE5VTEw7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgVCAqcF87CisKKyAgcHJpdmF0ZToKKyAgICBzY29wZWRfYmFzZShjb25zdCBzY29wZWRfYmFzZSAmKTsKKyAgICBzY29wZWRfYmFzZSAmb3BlcmF0b3I9KGNvbnN0IHNjb3BlZF9iYXNlICYpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENsb3Nlcj4gY2xhc3Mgc2NvcGVkIDogcHVibGljIHNjb3BlZF9iYXNlPFQsIENsb3Nlcj4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgc2NvcGVkKFQgKnAgPSBOVUxMKSA6IHNjb3BlZF9iYXNlPFQsIENsb3Nlcj4ocCkge30KKworICAgIFQgJm9wZXJhdG9yKigpIHsgcmV0dXJuICpzY29wZWRfYmFzZTxULCBDbG9zZXI+OjpwXzsgfQorICAgIGNvbnN0IFQmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnNjb3BlZF9iYXNlPFQsIENsb3Nlcj46OnBfOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQ2xvc2VyPiBjbGFzcyBzY29wZWQ8dm9pZCwgQ2xvc2VyPiA6IHB1YmxpYyBzY29wZWRfYmFzZTx2b2lkLCBDbG9zZXI+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IHNjb3BlZCh2b2lkICpwID0gTlVMTCkgOiBzY29wZWRfYmFzZTx2b2lkLCBDbG9zZXI+KHApIHt9Cit9OworCisvKiBDbG9zZXIgZm9yIGMgZnVuY3Rpb25zIGxpa2Ugc3RkOjpmcmVlIGFuZCBjbXBoIGNsZWFudXAgZnVuY3Rpb25zICovCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgdm9pZCAoKmNsZWFuKShUKik+IHN0cnVjdCBzY29wZWRfY19mb3J3YXJkIHsKKyAgc3RhdGljIHZvaWQgQ2xvc2UoVCAqcCkgeyBjbGVhbihwKTsgfQorfTsKKy8vIENhbGwgYSBDIGZ1bmN0aW9uIHRvIGRlbGV0ZSBzdHVmZgordGVtcGxhdGUgPGNsYXNzIFQsIHZvaWQgKCpjbGVhbikoVCopPiBjbGFzcyBzY29wZWRfYyA6IHB1YmxpYyBzY29wZWQ8VCwgc2NvcGVkX2NfZm9yd2FyZDxULCBjbGVhbj4gPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBzY29wZWRfYyhUICpwID0gTlVMTCkgOiBzY29wZWQ8VCwgc2NvcGVkX2NfZm9yd2FyZDxULCBjbGVhbj4gPihwKSB7fQorfTsKKworY2xhc3Mgc2NvcGVkX21hbGxvYyA6IHB1YmxpYyBzY29wZWRfYzx2b2lkLCBzdGQ6OmZyZWU+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IHNjb3BlZF9tYWxsb2Modm9pZCAqcCA9IE5VTEwpIDogc2NvcGVkX2M8dm9pZCwgc3RkOjpmcmVlPihwKSB7fQorCisgICAgdm9pZCBjYWxsX3JlYWxsb2Moc3RkOjpzaXplX3QgdG8pOworfTsKKworLyogc2NvcGVkX2FycmF5IHVzaW5nIGRlbGV0ZVtdICovCitzdHJ1Y3Qgc2NvcGVkX2RlbGV0ZV9hcnJheV9mb3J3YXJkIHsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIENsb3NlKFQgKnApIHsgZGVsZXRlIFtdIHA7IH0KK307CisvLyBIYXQgdGlwIHRvIGJvb3N0LgordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIHNjb3BlZF9hcnJheSA6IHB1YmxpYyBzY29wZWQ8VCwgc2NvcGVkX2RlbGV0ZV9hcnJheV9mb3J3YXJkPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBzY29wZWRfYXJyYXkoVCAqcCA9IE5VTEwpIDogc2NvcGVkPFQsIHNjb3BlZF9kZWxldGVfYXJyYXlfZm9yd2FyZD4ocCkge30KKworICAgIFQgJm9wZXJhdG9yW10oc3RkOjpzaXplX3QgaWR4KSB7IHJldHVybiBzY29wZWQ8VCwgc2NvcGVkX2RlbGV0ZV9hcnJheV9mb3J3YXJkPjo6cF9baWR4XTsgfQorICAgIGNvbnN0IFQgJm9wZXJhdG9yW10oc3RkOjpzaXplX3QgaWR4KSBjb25zdCB7IHJldHVybiBzY29wZWQ8VCwgc2NvcGVkX2RlbGV0ZV9hcnJheV9mb3J3YXJkPjo6cF9baWR4XTsgfQorfTsKKworLyogc2NvcGVkX3B0ciB1c2luZyBkZWxldGUuICBJZiBvbmx5IHRoZXJlIHdlcmUgYSB0ZW1wbGF0ZSB0eXBlZGVmLiAqLworc3RydWN0IHNjb3BlZF9kZWxldGVfZm9yd2FyZCB7CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgdm9pZCBDbG9zZShUICpwKSB7IGRlbGV0ZSBwOyB9Cit9OwordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIHNjb3BlZF9wdHIgOiBwdWJsaWMgc2NvcGVkPFQsIHNjb3BlZF9kZWxldGVfZm9yd2FyZD4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgc2NvcGVkX3B0cihUICpwID0gTlVMTCkgOiBzY29wZWQ8VCwgc2NvcGVkX2RlbGV0ZV9mb3J3YXJkPihwKSB7fQorfTsKKwordm9pZCBBZHZpc2VIdWdlUGFnZXMoY29uc3Qgdm9pZCAqYWRkciwgc3RkOjpzaXplX3Qgc2l6ZSk7CisKK30gLy8gbmFtZXNwYWNlIHV0aWwKKworI2VuZGlmIC8vIFVUSUxfU0NPUEVEX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3NpemVkX2l0ZXJhdG9yLmhoIGIvc3JjL2tlbmxtL3V0aWwvc2l6ZWRfaXRlcmF0b3IuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4ZDhlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3NpemVkX2l0ZXJhdG9yLmhoCkBAIC0wLDAgKzEsMTIwIEBACisjaWZuZGVmIFVUSUxfU0laRURfSVRFUkFUT1JfSAorI2RlZmluZSBVVElMX1NJWkVEX0lURVJBVE9SX0gKKworI2luY2x1ZGUgInV0aWwvcHJveHlfaXRlcmF0b3IuaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgdXRpbCB7CisKK2NsYXNzIFNpemVkSW5uZXJJdGVyYXRvciB7CisgIHB1YmxpYzoKKyAgICBTaXplZElubmVySXRlcmF0b3IoKSB7fQorCisgICAgU2l6ZWRJbm5lckl0ZXJhdG9yKHZvaWQgKnB0ciwgc3RkOjpzaXplX3Qgc2l6ZSkgOiBwdHJfKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihwdHIpKSwgc2l6ZV8oc2l6ZSkge30KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTaXplZElubmVySXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gcHRyXyA9PSBvdGhlci5wdHJfOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBTaXplZElubmVySXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gcHRyXyA8IG90aGVyLnB0cl87CisgICAgfQorICAgIFNpemVkSW5uZXJJdGVyYXRvciAmb3BlcmF0b3IrPShzdGQ6OnB0cmRpZmZfdCBhbW91bnQpIHsKKyAgICAgIHB0cl8gKz0gYW1vdW50ICogc2l6ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHN0ZDo6cHRyZGlmZl90IG9wZXJhdG9yLShjb25zdCBTaXplZElubmVySXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gKHB0cl8gLSBvdGhlci5wdHJfKSAvIHNpemVfOworICAgIH0KKworICAgIGNvbnN0IHZvaWQgKkRhdGEoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisgICAgdm9pZCAqRGF0YSgpIHsgcmV0dXJuIHB0cl87IH0KKyAgICBzdGQ6OnNpemVfdCBFbnRyeVNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQorCisgICAgZnJpZW5kIHZvaWQgc3dhcChTaXplZElubmVySXRlcmF0b3IgJmZpcnN0LCBTaXplZElubmVySXRlcmF0b3IgJnNlY29uZCkgeworICAgICAgc3RkOjpzd2FwKGZpcnN0LnB0cl8sIHNlY29uZC5wdHJfKTsKKyAgICAgIHN0ZDo6c3dhcChmaXJzdC5zaXplXywgc2Vjb25kLnNpemVfKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB1aW50OF90ICpwdHJfOworICAgIHN0ZDo6c2l6ZV90IHNpemVfOworfTsKKworY2xhc3MgU2l6ZWRQcm94eSB7CisgIHB1YmxpYzoKKyAgICBTaXplZFByb3h5KCkge30KKworICAgIFNpemVkUHJveHkodm9pZCAqcHRyLCBzdGQ6OnNpemVfdCBzaXplKSA6IGlubmVyXyhwdHIsIHNpemUpIHt9CisKKyAgICBvcGVyYXRvciBzdGQ6OnN0cmluZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbm5lcl8uRGF0YSgpKSwgaW5uZXJfLkVudHJ5U2l6ZSgpKTsKKyAgICB9CisKKyAgICBTaXplZFByb3h5ICZvcGVyYXRvcj0oY29uc3QgU2l6ZWRQcm94eSAmZnJvbSkgeworICAgICAgbWVtY3B5KGlubmVyXy5EYXRhKCksIGZyb20uaW5uZXJfLkRhdGEoKSwgaW5uZXJfLkVudHJ5U2l6ZSgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTaXplZFByb3h5ICZvcGVyYXRvcj0oY29uc3Qgc3RkOjpzdHJpbmcgJmZyb20pIHsKKyAgICAgIG1lbWNweShpbm5lcl8uRGF0YSgpLCBmcm9tLmRhdGEoKSwgaW5uZXJfLkVudHJ5U2l6ZSgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBjb25zdCB2b2lkICpEYXRhKCkgY29uc3QgeyByZXR1cm4gaW5uZXJfLkRhdGEoKTsgfQorICAgIHZvaWQgKkRhdGEoKSB7IHJldHVybiBpbm5lcl8uRGF0YSgpOyB9CisKKyAgICBmcmllbmQgdm9pZCBzd2FwKFNpemVkUHJveHkgZmlyc3QsIFNpemVkUHJveHkgc2Vjb25kKSB7CisgICAgICBzdGQ6OnN3YXBfcmFuZ2VzKAorICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihmaXJzdC5pbm5lcl8uRGF0YSgpKSwKKyAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4oZmlyc3QuaW5uZXJfLkRhdGEoKSkgKyBmaXJzdC5pbm5lcl8uRW50cnlTaXplKCksCisgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KHNlY29uZC5pbm5lcl8uRGF0YSgpKSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIHV0aWw6OlByb3h5SXRlcmF0b3I8U2l6ZWRQcm94eT47CisKKyAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nIHZhbHVlX3R5cGU7CisKKyAgICB0eXBlZGVmIFNpemVkSW5uZXJJdGVyYXRvciBJbm5lckl0ZXJhdG9yOworCisgICAgSW5uZXJJdGVyYXRvciAmSW5uZXIoKSB7IHJldHVybiBpbm5lcl87IH0KKyAgICBjb25zdCBJbm5lckl0ZXJhdG9yICZJbm5lcigpIGNvbnN0IHsgcmV0dXJuIGlubmVyXzsgfQorICAgIElubmVySXRlcmF0b3IgaW5uZXJfOworfTsKKwordHlwZWRlZiBQcm94eUl0ZXJhdG9yPFNpemVkUHJveHk+IFNpemVkSXRlcmF0b3I7CisKK2lubGluZSBTaXplZEl0ZXJhdG9yIFNpemVkSXQodm9pZCAqcHRyLCBzdGQ6OnNpemVfdCBzaXplKSB7IHJldHVybiBTaXplZEl0ZXJhdG9yKFNpemVkUHJveHkocHRyLCBzaXplKSk7IH0KKworLy8gVXNlZnVsIHdyYXBwZXIgZm9yIGEgY29tcGFyaXNvbiBmdW5jdGlvbiBpLmUuIHNvcnQuCit0ZW1wbGF0ZSA8Y2xhc3MgRGVsZWdhdGUsIGNsYXNzIFByb3h5ID0gU2l6ZWRQcm94eT4gY2xhc3MgU2l6ZWRDb21wYXJlIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPGNvbnN0IFByb3h5ICYsIGNvbnN0IFByb3h5ICYsIGJvb2w+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFNpemVkQ29tcGFyZShjb25zdCBEZWxlZ2F0ZSAmZGVsZWdhdGUgPSBEZWxlZ2F0ZSgpKSA6IGRlbGVnYXRlXyhkZWxlZ2F0ZSkge30KKworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBQcm94eSAmZmlyc3QsIGNvbnN0IFByb3h5ICZzZWNvbmQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBkZWxlZ2F0ZV8oZmlyc3QuRGF0YSgpLCBzZWNvbmQuRGF0YSgpKTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFByb3h5ICZmaXJzdCwgY29uc3Qgc3RkOjpzdHJpbmcgJnNlY29uZCkgY29uc3QgeworICAgICAgcmV0dXJuIGRlbGVnYXRlXyhmaXJzdC5EYXRhKCksIHNlY29uZC5kYXRhKCkpOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcgJmZpcnN0LCBjb25zdCBQcm94eSAmc2Vjb25kKSBjb25zdCB7CisgICAgICByZXR1cm4gZGVsZWdhdGVfKGZpcnN0LmRhdGEoKSwgc2Vjb25kLkRhdGEoKSk7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyAmZmlyc3QsIGNvbnN0IHN0ZDo6c3RyaW5nICZzZWNvbmQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBkZWxlZ2F0ZV8oZmlyc3QuZGF0YSgpLCBzZWNvbmQuZGF0YSgpKTsKKyAgICB9CisKKyAgICBjb25zdCBEZWxlZ2F0ZSAmR2V0RGVsZWdhdGUoKSBjb25zdCB7IHJldHVybiBkZWxlZ2F0ZV87IH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IERlbGVnYXRlIGRlbGVnYXRlXzsKK307CisKK30gLy8gbmFtZXNwYWNlIHV0aWwKKyNlbmRpZiAvLyBVVElMX1NJWkVEX0lURVJBVE9SX0gKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3NpemVkX2l0ZXJhdG9yX3Rlc3QuY2MgYi9zcmMva2VubG0vdXRpbC9zaXplZF9pdGVyYXRvcl90ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zaXplZF9pdGVyYXRvcl90ZXN0LmNjCnJlbmFtZSB0byBzcmMva2VubG0vdXRpbC9zaXplZF9pdGVyYXRvcl90ZXN0LmNjCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9zb3J0ZWRfdW5pZm9ybS5oaCBiL3NyYy9rZW5sbS91dGlsL3NvcnRlZF91bmlmb3JtLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZDJiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zb3J0ZWRfdW5pZm9ybS5oaApAQCAtMCwwICsxLDEwNSBAQAorI2lmbmRlZiBVVElMX1NPUlRFRF9VTklGT1JNX0gKKyNkZWZpbmUgVVRJTF9TT1JURURfVU5JRk9STV9ICisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgdXRpbCB7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBJZGVudGl0eUFjY2Vzc29yIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgVCBLZXk7CisgICAgVCBvcGVyYXRvcigpKGNvbnN0IFQgKmluKSBjb25zdCB7IHJldHVybiAqaW47IH0KK307CisKK3N0cnVjdCBQaXZvdDY0IHsKKyAgc3RhdGljIGlubGluZSBzdGQ6OnNpemVfdCBDYWxjKHVpbnQ2NF90IG9mZiwgdWludDY0X3QgcmFuZ2UsIHN0ZDo6c2l6ZV90IHdpZHRoKSB7CisgICAgc3RkOjpzaXplX3QgcmV0ID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHN0YXRpY19jYXN0PGZsb2F0PihvZmYpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJhbmdlKSAqIHN0YXRpY19jYXN0PGZsb2F0Pih3aWR0aCkpOworICAgIC8vIENhcCBmb3IgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcKKyAgICByZXR1cm4gKHJldCA8IHdpZHRoKSA/IHJldCA6IHdpZHRoIC0gMTsKKyAgfQorfTsKKworLy8gVXNlIHdoZW4gb2ZmICogd2lkdGggaXMgPDJeNjQuICBUaGlzIGlzIGd1YXJhbnRlZWQgd2hlbiBlYWNoIG9mIHRoZW0gaXMgYWN0dWFsbHkgYSAzMi1iaXQgdmFsdWUuCitzdHJ1Y3QgUGl2b3QzMiB7CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzaXplX3QgQ2FsYyh1aW50NjRfdCBvZmYsIHVpbnQ2NF90IHJhbmdlLCB1aW50NjRfdCB3aWR0aCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oKG9mZiAqIHdpZHRoKSAvIChyYW5nZSArIDEpKTsKKyAgfQorfTsKKworLy8gVXNhZ2U6IFBpdm90U2VsZWN0PHNpemVvZihEYXRhVHlwZSk+OjpUCit0ZW1wbGF0ZSA8dW5zaWduZWQ+IHN0cnVjdCBQaXZvdFNlbGVjdDsKK3RlbXBsYXRlIDw+IHN0cnVjdCBQaXZvdFNlbGVjdDw4PiB7IHR5cGVkZWYgUGl2b3Q2NCBUOyB9OwordGVtcGxhdGUgPD4gc3RydWN0IFBpdm90U2VsZWN0PDQ+IHsgdHlwZWRlZiBQaXZvdDMyIFQ7IH07Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgUGl2b3RTZWxlY3Q8Mj4geyB0eXBlZGVmIFBpdm90MzIgVDsgfTsKKworLyogQmluYXJ5IHNlYXJjaC4gKi8KK3RlbXBsYXRlIDxjbGFzcyBJdGVyYXRvciwgY2xhc3MgQWNjZXNzb3I+IGJvb2wgQmluYXJ5RmluZCgKKyAgICBjb25zdCBBY2Nlc3NvciAmYWNjZXNzb3IsCisgICAgSXRlcmF0b3IgYmVnaW4sCisgICAgSXRlcmF0b3IgZW5kLAorICAgIGNvbnN0IHR5cGVuYW1lIEFjY2Vzc29yOjpLZXkga2V5LCBJdGVyYXRvciAmb3V0KSB7CisgIHdoaWxlIChlbmQgPiBiZWdpbikgeworICAgIEl0ZXJhdG9yIHBpdm90KGJlZ2luICsgKGVuZCAtIGJlZ2luKSAvIDIpOworICAgIHR5cGVuYW1lIEFjY2Vzc29yOjpLZXkgbWlkKGFjY2Vzc29yKHBpdm90KSk7CisgICAgaWYgKG1pZCA8IGtleSkgeworICAgICAgYmVnaW4gPSBwaXZvdCArIDE7CisgICAgfSBlbHNlIGlmIChtaWQgPiBrZXkpIHsKKyAgICAgIGVuZCA9IHBpdm90OworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPSBwaXZvdDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFNlYXJjaCB0aGUgcmFuZ2UgW2JlZm9yZV9pdCArIDEsIGFmdGVyX2l0IC0gMV0gZm9yIGtleS4KKy8vIFByZWNvbmRpdGlvbnM6CisvLyBiZWZvcmVfdiA8PSBrZXkgPD0gYWZ0ZXJfdgorLy8gYmVmb3JlX3YgPD0gYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UgW2JlZm9yZV9pdCArIDEsIGFmdGVyX2l0IC0gMV0gPD0gYWZ0ZXJfdgorLy8gcmFuZ2UgaXMgc29ydGVkLgordGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yLCBjbGFzcyBBY2Nlc3NvciwgY2xhc3MgUGl2b3Q+IGJvb2wgQm91bmRlZFNvcnRlZFVuaWZvcm1GaW5kKAorICAgIGNvbnN0IEFjY2Vzc29yICZhY2Nlc3NvciwKKyAgICBJdGVyYXRvciBiZWZvcmVfaXQsIHR5cGVuYW1lIEFjY2Vzc29yOjpLZXkgYmVmb3JlX3YsCisgICAgSXRlcmF0b3IgYWZ0ZXJfaXQsIHR5cGVuYW1lIEFjY2Vzc29yOjpLZXkgYWZ0ZXJfdiwKKyAgICBjb25zdCB0eXBlbmFtZSBBY2Nlc3Nvcjo6S2V5IGtleSwgSXRlcmF0b3IgJm91dCkgeworICB3aGlsZSAoYWZ0ZXJfaXQgLSBiZWZvcmVfaXQgPiAxKSB7CisgICAgSXRlcmF0b3IgcGl2b3QoYmVmb3JlX2l0ICsgKDEgKyBQaXZvdDo6Q2FsYyhrZXkgLSBiZWZvcmVfdiwgYWZ0ZXJfdiAtIGJlZm9yZV92LCBhZnRlcl9pdCAtIGJlZm9yZV9pdCAtIDEpKSk7CisgICAgdHlwZW5hbWUgQWNjZXNzb3I6OktleSBtaWQoYWNjZXNzb3IocGl2b3QpKTsKKyAgICBpZiAobWlkIDwga2V5KSB7CisgICAgICBiZWZvcmVfaXQgPSBwaXZvdDsKKyAgICAgIGJlZm9yZV92ID0gbWlkOworICAgIH0gZWxzZSBpZiAobWlkID4ga2V5KSB7CisgICAgICBhZnRlcl9pdCA9IHBpdm90OworICAgICAgYWZ0ZXJfdiA9IG1pZDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0ID0gcGl2b3Q7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IsIGNsYXNzIEFjY2Vzc29yLCBjbGFzcyBQaXZvdD4gYm9vbCBTb3J0ZWRVbmlmb3JtRmluZChjb25zdCBBY2Nlc3NvciAmYWNjZXNzb3IsIEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQsIGNvbnN0IHR5cGVuYW1lIEFjY2Vzc29yOjpLZXkga2V5LCBJdGVyYXRvciAmb3V0KSB7CisgIGlmIChiZWdpbiA9PSBlbmQpIHJldHVybiBmYWxzZTsKKyAgdHlwZW5hbWUgQWNjZXNzb3I6OktleSBiZWxvdyhhY2Nlc3NvcihiZWdpbikpOworICBpZiAoa2V5IDw9IGJlbG93KSB7CisgICAgaWYgKGtleSA9PSBiZWxvdykgeyBvdXQgPSBiZWdpbjsgcmV0dXJuIHRydWU7IH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTWFrZSB0aGUgcmFuZ2UgW2JlZ2luLCBlbmRdLgorICAtLWVuZDsKKyAgdHlwZW5hbWUgQWNjZXNzb3I6OktleSBhYm92ZShhY2Nlc3NvcihlbmQpKTsKKyAgaWYgKGtleSA+PSBhYm92ZSkgeworICAgIGlmIChrZXkgPT0gYWJvdmUpIHsgb3V0ID0gZW5kOyByZXR1cm4gdHJ1ZTsgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gQm91bmRlZFNvcnRlZFVuaWZvcm1GaW5kPEl0ZXJhdG9yLCBBY2Nlc3NvciwgUGl2b3Q+KGFjY2Vzc29yLCBiZWdpbiwgYmVsb3csIGVuZCwgYWJvdmUsIGtleSwgb3V0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbAorCisjZW5kaWYgLy8gVVRJTF9TT1JURURfVU5JRk9STV9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9zb3J0ZWRfdW5pZm9ybV90ZXN0LmNjIGIvc3JjL2tlbmxtL3V0aWwvc29ydGVkX3VuaWZvcm1fdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYwNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvc29ydGVkX3VuaWZvcm1fdGVzdC5jYwpAQCAtMCwwICsxLDEyNyBAQAorI2luY2x1ZGUgInV0aWwvc29ydGVkX3VuaWZvcm0uaGgiCisKKyNpbmNsdWRlIDxib29zdC9yYW5kb20vbWVyc2VubmVfdHdpc3Rlci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZG9tL3VuaWZvcm1faW50LmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5kb20vdmFyaWF0ZV9nZW5lcmF0b3IuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9hcnJheS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdW5vcmRlcmVkX21hcC5ocHA+CisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgU29ydGVkVW5pZm9ybVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHsKKwordGVtcGxhdGUgPGNsYXNzIEtleVQsIGNsYXNzIFZhbHVlVD4gc3RydWN0IEVudHJ5IHsKKyAgdHlwZWRlZiBLZXlUIEtleTsKKyAgdHlwZWRlZiBWYWx1ZVQgVmFsdWU7CisKKyAgS2V5IGtleTsKKyAgVmFsdWUgdmFsdWU7CisKKyAgS2V5IEdldEtleSgpIGNvbnN0IHsKKyAgICByZXR1cm4ga2V5OworICB9CisKKyAgVmFsdWUgR2V0VmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRW50cnk8S2V5LFZhbHVlPiAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4ga2V5IDwgb3RoZXIua2V5OworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5VD4gc3RydWN0IEFjY2Vzc29yIHsKKyAgdHlwZWRlZiBLZXlUIEtleTsKKyAgdGVtcGxhdGUgPGNsYXNzIFZhbHVlPiBLZXkgb3BlcmF0b3IoKShjb25zdCBFbnRyeTxLZXksIFZhbHVlPiAqZW50cnkpIGNvbnN0IHsKKyAgICByZXR1cm4gZW50cnktPkdldEtleSgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBWYWx1ZT4gdm9pZCBDaGVjayhjb25zdCBFbnRyeTxLZXksIFZhbHVlPiAqYmVnaW4sIGNvbnN0IEVudHJ5PEtleSwgVmFsdWU+ICplbmQsIGNvbnN0IGJvb3N0Ojp1bm9yZGVyZWRfbWFwPEtleSwgVmFsdWU+ICZyZWZlcmVuY2UsIGNvbnN0IEtleSBrZXkpIHsKKyAgdHlwZW5hbWUgYm9vc3Q6OnVub3JkZXJlZF9tYXA8S2V5LCBWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIHJlZiA9IHJlZmVyZW5jZS5maW5kKGtleSk7CisgIHR5cGVkZWYgY29uc3QgRW50cnk8S2V5LCBWYWx1ZT4gKkl0OworICAvLyBnKysgY2FuJ3QgdGVsbCB0aGF0IHJlcXVpcmUgd2lsbCBjcmFzaCBhbmQgYnVybi4KKyAgSXQgaSA9IE5VTEw7CisgIGJvb2wgcmV0ID0gU29ydGVkVW5pZm9ybUZpbmQ8SXQsIEFjY2Vzc29yPEtleT4sIFBpdm90NjQ+KEFjY2Vzc29yPEtleT4oKSwgYmVnaW4sIGVuZCwga2V5LCBpKTsKKyAgaWYgKHJlZiA9PSByZWZlcmVuY2UuZW5kKCkpIHsKKyAgICBCT09TVF9DSEVDSyghcmV0KTsKKyAgfSBlbHNlIHsKKyAgICBCT09TVF9SRVFVSVJFKHJldCk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwocmVmLT5zZWNvbmQsIGktPkdldFZhbHVlKCkpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGVtcHR5KSB7CisgIHR5cGVkZWYgY29uc3QgRW50cnk8dWludDY0X3QsIGZsb2F0PiBUOworICBjb25zdCBUICppOworICBib29sIHJldCA9IFNvcnRlZFVuaWZvcm1GaW5kPGNvbnN0IFQqLCBBY2Nlc3Nvcjx1aW50NjRfdD4sIFBpdm90NjQ+KEFjY2Vzc29yPHVpbnQ2NF90PigpLCAoY29uc3QgVCopTlVMTCwgKGNvbnN0IFQqKU5VTEwsICh1aW50NjRfdCkxMCwgaSk7CisgIEJPT1NUX0NIRUNLKCFyZXQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5PiB2b2lkIFJhbmRvbVRlc3QoS2V5IHVwcGVyLCBzaXplX3QgZW50cmllcywgc2l6ZV90IHF1ZXJpZXMpIHsKKyAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFZhbHVlOworICBib29zdDo6bXQxOTkzNyBybmc7CisgIGJvb3N0Ojp1bmlmb3JtX2ludDxLZXk+IHJhbmdlX2tleSgwLCB1cHBlcik7CisgIGJvb3N0Ojp1bmlmb3JtX2ludDxWYWx1ZT4gcmFuZ2VfdmFsdWUoMCwgMjU1KTsKKyAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPGJvb3N0OjptdDE5OTM3JiwgYm9vc3Q6OnVuaWZvcm1faW50PEtleT4gPiBnZW5fa2V5KHJuZywgcmFuZ2Vfa2V5KTsKKyAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPGJvb3N0OjptdDE5OTM3JiwgYm9vc3Q6OnVuaWZvcm1faW50PHVuc2lnbmVkIGNoYXI+ID4gZ2VuX3ZhbHVlKHJuZywgcmFuZ2VfdmFsdWUpOworCisgIHR5cGVkZWYgRW50cnk8S2V5LCBWYWx1ZT4gRW50OworICBzdGQ6OnZlY3RvcjxFbnQ+IGJhY2tpbmc7CisgIGJvb3N0Ojp1bm9yZGVyZWRfbWFwPEtleSwgdW5zaWduZWQgY2hhcj4gcmVmZXJlbmNlOworICBFbnQgZW50OworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJpZXM7ICsraSkgeworICAgIEtleSBrZXkgPSBnZW5fa2V5KCk7CisgICAgdW5zaWduZWQgY2hhciB2YWx1ZSA9IGdlbl92YWx1ZSgpOworICAgIGlmIChyZWZlcmVuY2UuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWUpKS5zZWNvbmQpIHsKKyAgICAgIGVudC5rZXkgPSBrZXk7CisgICAgICBlbnQudmFsdWUgPSB2YWx1ZTsKKyAgICAgIGJhY2tpbmcucHVzaF9iYWNrKGVudCk7CisgICAgfQorICB9CisgIHN0ZDo6c29ydChiYWNraW5nLmJlZ2luKCksIGJhY2tpbmcuZW5kKCkpOworCisgIC8vIFJhbmRvbSBxdWVyaWVzLgorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHF1ZXJpZXM7ICsraSkgeworICAgIGNvbnN0IEtleSBrZXkgPSBnZW5fa2V5KCk7CisgICAgQ2hlY2s8S2V5LCB1bnNpZ25lZCBjaGFyPigmKmJhY2tpbmcuYmVnaW4oKSwgJipiYWNraW5nLmVuZCgpLCByZWZlcmVuY2UsIGtleSk7CisgIH0KKworICB0eXBlbmFtZSBib29zdDo6dW5vcmRlcmVkX21hcDxLZXksIHVuc2lnbmVkIGNoYXI+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHJlZmVyZW5jZS5iZWdpbigpOworICBmb3IgKHNpemVfdCBpID0gMDsgKGkgPCBxdWVyaWVzKSAmJiAoaXQgIT0gcmVmZXJlbmNlLmVuZCgpKTsgKytpLCArK2l0KSB7CisgICAgQ2hlY2s8S2V5LCB1bnNpZ25lZCBjaGFyPigmKmJhY2tpbmcuYmVnaW4oKSwgJipiYWNraW5nLmVuZCgpLCByZWZlcmVuY2UsIGl0LT5zZWNvbmQpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGJhc2ljKSB7CisgIFJhbmRvbVRlc3Q8dWludDhfdD4oMTEsIDEwLCAyMDApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0aW55X2RlbnNlX3JhbmRvbSkgeworICBSYW5kb21UZXN0PHVpbnQ4X3Q+KDExLCA1MCwgMjAwKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0Uoc21hbGxfZGVuc2VfcmFuZG9tKSB7CisgIFJhbmRvbVRlc3Q8dWludDhfdD4oMTAwLCAxMDAsIDIwMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHNtYWxsX3NwYXJzZV9yYW5kb20pIHsKKyAgUmFuZG9tVGVzdDx1aW50OF90PigyMDAsIDE1LCAyMDApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShtZWRpdW1fc3BhcnNlX3JhbmRvbSkgeworICBSYW5kb21UZXN0PHVpbnQxNl90PigzMjAwMCwgMTAwMCwgMjAwMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHNwYXJzZV9yYW5kb20pIHsKKyAgUmFuZG9tVGVzdDx1aW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpLCAxMDAwMDAsIDIwMDApOworfQorCit9IC8vIG5hbWVzcGFjZQorfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL0NNYWtlTGlzdHMudHh0IGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNGMxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1MCBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC44KQorIworIyBUaGUgS2VuTE0gY21ha2UgZmlsZXMgbWFrZSB1c2Ugb2YgYWRkX2xpYnJhcnkoLi4uIE9CSkVDVFMgLi4uKQorIyAKKyMgVGhpcyBzeW50YXggYWxsb3dzIGdyb3VwaW5nIG9mIHNvdXJjZSBmaWxlcyB3aGVuIGNvbXBpbGluZworIyAoZWZmZWN0aXZlbHkgY3JlYXRpbmcgImZha2UiIGxpYnJhcmllcyBiYXNlZCBvbiBzb3VyY2Ugc3ViZGlycykuCisjIAorIyBUaGlzIHN5bnRheCB3YXMgb25seSBhZGRlZCBpbiBjbWFrZSB2ZXJzaW9uIDIuOC44CisjCisjIHNlZSBodHRwOi8vd3d3LmNtYWtlLm9yZy9XaWtpL0NNYWtlL1R1dG9yaWFscy9PYmplY3RfTGlicmFyeQorCisKKyMgVGhpcyBDTWFrZSBmaWxlIHdhcyBjcmVhdGVkIGJ5IExhbmUgU2Nod2FydHogPGRvd29iZWhhQGdtYWlsLmNvbT4KKworIyBFeHBsaWNpdGx5IGxpc3QgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhpcyBzdWJkaXJlY3RvcnkKKyMKKyMgSWYgeW91IGFkZCBhbnkgc291cmNlIGZpbGVzIHRvIHRoaXMgc3ViZGlyZWN0b3J5CisjICAgIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBrZW5sbSBsaWJyYXJ5LAorIyAgICAgICAgKHRoaXMgZXhjbHVkZXMgYW55IHVuaXQgdGVzdCBmaWxlcykKKyMgICAgeW91IHNob3VsZCBhZGQgdGhlbSB0byB0aGUgZm9sbG93aW5nIGxpc3Q6CisjCisjIEluIG9yZGVyIHRvIGFsbG93IENNYWtlIGZpbGVzIGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5CisjICAgIHRvIHNlZSB0aGlzIHZhcmlhYmxlIGRlZmluaXRpb24sIHdlIHNldCBQQVJFTlRfU0NPUEUuCisjCisjIEluIG9yZGVyIHRvIHNldCBjb3JyZWN0IHBhdGhzIHRvIHRoZXNlIGZpbGVzCisjICAgIHdoZW4gdGhpcyB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGJ5IENNYWtlIGZpbGVzIGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5LAorIyAgICB3ZSBwcmVmaXggYWxsIGZpbGVzIHdpdGggJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LgorIworc2V0KEtFTkxNX1VUSUxfU1RSRUFNX1NPVVJDRSAKKwkJJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NoYWluLmNjCisJCSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pby5jYworCQkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGluZV9pbnB1dC5jYworCQkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbXVsdGlfcHJvZ3Jlc3MuY2MKKwkJJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Jld2luZGFibGVfc3RyZWFtLmNjCisJUEFSRU5UX1NDT1BFKQorCisKKworaWYoQlVJTERfVEVTVElORykKKyAgIyBFeHBsaWNpdGx5IGxpc3QgdGhlIEJvb3N0IHRlc3QgZmlsZXMgdG8gYmUgY29tcGlsZWQKKyAgc2V0KEtFTkxNX0JPT1NUX1RFU1RTX0xJU1QKKyAgICBpb190ZXN0CisgICAgc29ydF90ZXN0CisgICAgc3RyZWFtX3Rlc3QKKyAgKQorCisgIEFkZFRlc3RzKFRFU1RTICR7S0VOTE1fQk9PU1RfVEVTVFNfTElTVH0KKyAgICAgICAgICAgREVQRU5EUyAkPFRBUkdFVF9PQkpFQ1RTOmtlbmxtX3V0aWw+CisgICAgICAgICAgIExJQlJBUklFUyAke0Jvb3N0X0xJQlJBUklFU30gcHRocmVhZCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9KYW1maWxlIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL0phbWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5ZDQxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9KYW1maWxlCkBAIC0wLDAgKzEsNyBAQAorZmFrZWxpYiBzdHJlYW0gOiBbIGdsb2IgKi5jYyA6ICpfdGVzdC5jYyBdIC4uLy9rZW51dGlsIC90b3AvL2Jvb3N0X3RocmVhZCA6IDogOiA8bGlicmFyeT4vdG9wLy9ib29zdF90aHJlYWQgOworCitpbXBvcnQgdGVzdGluZyA7Cit1bml0LXRlc3QgaW9fdGVzdCA6IGlvX3Rlc3QuY2Mgc3RyZWFtIC90b3AvL2Jvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsgOwordW5pdC10ZXN0IHN0cmVhbV90ZXN0IDogc3RyZWFtX3Rlc3QuY2Mgc3RyZWFtIC90b3AvL2Jvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsgOwordW5pdC10ZXN0IHJld2luZGFibGVfc3RyZWFtX3Rlc3QgOiByZXdpbmRhYmxlX3N0cmVhbV90ZXN0LmNjIHN0cmVhbSAvdG9wLy9ib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrIDsKK3VuaXQtdGVzdCBzb3J0X3Rlc3QgOiBzb3J0X3Rlc3QuY2Mgc3RyZWFtIC90b3AvL2Jvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsgOwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL2Jsb2NrLmhoIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL2Jsb2NrLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZGYxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vYmxvY2suaGgKQEAgLTAsMCArMSw5MyBAQAorI2lmbmRlZiBVVElMX1NUUkVBTV9CTE9DS19ICisjZGVmaW5lIFVUSUxfU1RSRUFNX0JMT0NLX0gKKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBzdHJlYW0geworCisvKioKKyAqIEVuY2Fwc3VsYXRlcyBhIGJsb2NrIG9mIG1lbW9yeS4KKyAqLworY2xhc3MgQmxvY2sgeworICBwdWJsaWM6CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IGJsb2NrLgorICAgICAqLworICAgIEJsb2NrKCkgOiBtZW1fKE5VTEwpLCB2YWxpZF9zaXplXygwKSB7fQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGJsb2NrIHRoYXQgZW5jYXBzdWxhdGVzIGEgc2VnbWVudCBvZiBtZW1vcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG1lbSAgVGhlIHNlZ21lbnQgb2YgbWVtb3J5IHRvIGVuY2Fwc3VsYXRlCisgICAgICogQHBhcmFtW2luXSBzaXplIFRoZSBzaXplIG9mIHRoZSBtZW1vcnkgc2VnbWVudCBpbiBieXRlcworICAgICAqLworICAgIEJsb2NrKHZvaWQgKm1lbSwgc3RkOjpzaXplX3Qgc2l6ZSkgOiBtZW1fKG1lbSksIHZhbGlkX3NpemVfKHNpemUpIHt9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGlzIGJsb2NrIHRoYXQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIHZhbGlkLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB0byBOdW1iZXIgb2YgYnl0ZXMKKyAgICAgKi8KKyAgICB2b2lkIFNldFZhbGlkU2l6ZShzdGQ6OnNpemVfdCB0bykgeyB2YWxpZF9zaXplXyA9IHRvOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBibG9jayB0aGF0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyB2YWxpZC4KKyAgICAgKiBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHJlYWQgbWlnaHQgZmlsbCBpbiBsZXNzIHRoYW4gQWxsb2NhdGVkIGF0IEVPRi4KKyAgICAgKi8KKyAgICBzdGQ6OnNpemVfdCBWYWxpZFNpemUoKSBjb25zdCB7IHJldHVybiB2YWxpZF9zaXplXzsgfQorCisgICAgLyoqIEdldHMgYSB2b2lkIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSB1bmRlcmx5aW5nIHRoaXMgYmxvY2suICovCisgICAgdm9pZCAqR2V0KCkgeyByZXR1cm4gbWVtXzsgfQorCisgICAgLyoqIEdldHMgYSBjb25zdCB2b2lkIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSB1bmRlcmx5aW5nIHRoaXMgYmxvY2suICovCisgICAgY29uc3Qgdm9pZCAqR2V0KCkgY29uc3QgeyByZXR1cm4gbWVtXzsgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgY29uc3Qgdm9pZCBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHZhbGlkIHNlY3Rpb24gb2YgbWVtb3J5CisgICAgICogZW5jYXBzdWxhdGVkIGJ5IHRoaXMgYmxvY2suCisgICAgICovCisgICAgY29uc3Qgdm9pZCAqVmFsaWRFbmQoKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4obWVtXykgKyB2YWxpZF9zaXplXzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBibG9jayBlbmNhcHN1bGF0ZXMgYSB2YWxpZCAobm9uLU5VTEwpIGJsb2NrIG9mIG1lbW9yeS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGEgdXNlci1kZWZpbmVkIGltcGxpY2l0IGNvbnZlcnNpb24gZnVuY3Rpb24gdG8gYm9vbGVhbjsKKyAgICAgKiBhbW9uZyBvdGhlciB0aGluZ3MsIHRoaXMgbWV0aG9kIGVuYWJsZXMgYmFyZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcworICAgICAqIHRvIGJlIHVzZWQgYXMgdGhlIGNvbmRpdGlvbiBvZiBhbiBpZiBzdGF0ZW1lbnQuCisgICAgICovCisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1lbV8gIT0gTlVMTDsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYmxvY2sgaXMgZW1wdHkuCisgICAgICoKKyAgICAgKiBJbiBvdGhlciB3b3JkcywgaWYgR2V0KCk9PU5VTEwsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuCisgICAgICovCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiBtZW1fID09IE5VTEw7IH0KKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBMaW5rOworICAgIGZyaWVuZCBjbGFzcyBSZXdpbmRhYmxlU3RyZWFtOworCisgICAgLyoqCisgICAgICogUG9pbnRzIHRoaXMgYmxvY2sncyBtZW1vcnkgYXQgTlVMTC4KKyAgICAgKgorICAgICAqIFRoaXMgY2xhc3MgZGVmaW5lcyBwb2lzb24gYXMgYSBibG9jayB3aG9zZSBtZW1vcnkgcG9pbnRlciBpcyBOVUxMLgorICAgICAqLworICAgIHZvaWQgU2V0VG9Qb2lzb24oKSB7CisgICAgICBtZW1fID0gTlVMTDsKKyAgICB9CisKKyAgICB2b2lkICptZW1fOworICAgIHN0ZDo6c2l6ZV90IHZhbGlkX3NpemVfOworfTsKKworfSAvLyBuYW1lc3BhY2Ugc3RyZWFtCit9IC8vIG5hbWVzcGFjZSB1dGlsCisKKyNlbmRpZiAvLyBVVElMX1NUUkVBTV9CTE9DS19ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9zdHJlYW0vY2hhaW4uY2MgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vY2hhaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjMDAwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9jaGFpbi5jYwpAQCAtMCwwICsxLDE2MyBAQAorI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NoYWluLmhoIgorCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vaW8uaGgiCisKKyNpbmNsdWRlICJ1dGlsL2V4Y2VwdGlvbi5oaCIKKyNpbmNsdWRlICJ1dGlsL3BjcXVldWUuaGgiCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHN0cmVhbSB7CisKK0NoYWluQ29uZmlnRXhjZXB0aW9uOjpDaGFpbkNvbmZpZ0V4Y2VwdGlvbigpIHRocm93KCkgeyAqdGhpcyA8PCAiQ2hhaW4gY29uZmlndXJlZCB3aXRoICI7IH0KK0NoYWluQ29uZmlnRXhjZXB0aW9uOjp+Q2hhaW5Db25maWdFeGNlcHRpb24oKSB0aHJvdygpIHt9CisKK1RocmVhZDo6flRocmVhZCgpIHsKKyAgdGhyZWFkXy5qb2luKCk7Cit9CisKK3ZvaWQgVGhyZWFkOjpVbmhhbmRsZWRFeGNlcHRpb24oY29uc3Qgc3RkOjpleGNlcHRpb24gJmUpIHsKKyAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgYWJvcnQoKTsKK30KKwordm9pZCBSZWN5Y2xlcjo6UnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7CisgIGZvciAoTGluayBsKHBvc2l0aW9uKTsgbDsgKytsKSB7CisgICAgbC0+U2V0VmFsaWRTaXplKHBvc2l0aW9uLkdldENoYWluKCkuQmxvY2tTaXplKCkpOworICB9Cit9CisKK2NvbnN0IFJlY3ljbGVyIGtSZWN5Y2xlID0gUmVjeWNsZXIoKTsKKworQ2hhaW46OkNoYWluKGNvbnN0IENoYWluQ29uZmlnICZjb25maWcpIDogY29uZmlnXyhjb25maWcpLCBjb21wbGV0ZV9jYWxsZWRfKGZhbHNlKSB7CisgIFVUSUxfVEhST1dfSUYoIWNvbmZpZy5lbnRyeV9zaXplLCBDaGFpbkNvbmZpZ0V4Y2VwdGlvbiwgInplcm8tc2l6ZSBlbnRyaWVzLiIpOworICBVVElMX1RIUk9XX0lGKCFjb25maWcuYmxvY2tfY291bnQsIENoYWluQ29uZmlnRXhjZXB0aW9uLCAiYmxvY2sgY291bnQgemVybyIpOworICBVVElMX1RIUk9XX0lGKGNvbmZpZy50b3RhbF9tZW1vcnkgPCBjb25maWcuZW50cnlfc2l6ZSAqIGNvbmZpZy5ibG9ja19jb3VudCwgQ2hhaW5Db25maWdFeGNlcHRpb24sIGNvbmZpZy50b3RhbF9tZW1vcnkgPDwgIiB0b3RhbCBtZW1vcnksIHRvbyBzbWFsbCBmb3IgIiA8PCBjb25maWcuYmxvY2tfY291bnQgPDwgIiBibG9ja3Mgb2YgY29udGFpbmluZyBlbnRyaWVzIG9mIHNpemUgIiA8PCBjb25maWcuZW50cnlfc2l6ZSk7CisgIC8vIFJvdW5kIGRvd24gYmxvY2sgc2l6ZSB0byBhIG11bHRpcGxlIG9mIGVudHJ5IHNpemUuCisgIGJsb2NrX3NpemVfID0gY29uZmlnLnRvdGFsX21lbW9yeSAvIChjb25maWcuYmxvY2tfY291bnQgKiBjb25maWcuZW50cnlfc2l6ZSkgKiBjb25maWcuZW50cnlfc2l6ZTsKK30KKworQ2hhaW46On5DaGFpbigpIHsKKyAgV2FpdCgpOworfQorCitDaGFpblBvc2l0aW9uIENoYWluOjpBZGQoKSB7CisgIGlmICghUnVubmluZygpKSBTdGFydCgpOworICBQQ1F1ZXVlPEJsb2NrPiAmaW4gPSBxdWV1ZXNfLmJhY2soKTsKKyAgcXVldWVzXy5wdXNoX2JhY2sobmV3IFBDUXVldWU8QmxvY2s+KGNvbmZpZ18uYmxvY2tfY291bnQpKTsKKyAgcmV0dXJuIENoYWluUG9zaXRpb24oaW4sIHF1ZXVlc18uYmFjaygpLCB0aGlzLCBwcm9ncmVzc18pOworfQorCitDaGFpbiAmQ2hhaW46Om9wZXJhdG9yPj4oY29uc3QgV3JpdGVBbmRSZWN5Y2xlICZ3cml0ZXIpIHsKKyAgdGhyZWFkc18ucHVzaF9iYWNrKG5ldyBUaHJlYWQoQ29tcGxldGUoKSwgd3JpdGVyKSk7CisgIHJldHVybiAqdGhpczsKK30KKworQ2hhaW4gJkNoYWluOjpvcGVyYXRvcj4+KGNvbnN0IFBXcml0ZUFuZFJlY3ljbGUgJndyaXRlcikgeworICB0aHJlYWRzXy5wdXNoX2JhY2sobmV3IFRocmVhZChDb21wbGV0ZSgpLCB3cml0ZXIpKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIENoYWluOjpXYWl0KGJvb2wgcmVsZWFzZV9tZW1vcnkpIHsKKyAgaWYgKHF1ZXVlc18uZW1wdHkoKSkgeworICAgIGFzc2VydCh0aHJlYWRzXy5lbXB0eSgpKTsKKyAgICByZXR1cm47IC8vIE5vdGhpbmcgdG8gd2FpdCBmb3IuCisgIH0KKyAgaWYgKCFjb21wbGV0ZV9jYWxsZWRfKSBDb21wbGV0ZUxvb3AoKTsKKyAgdGhyZWFkc18uY2xlYXIoKTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgcXVldWVzXy5mcm9udCgpLkNvbnN1bWUoKTsgKytpKSB7CisgICAgaWYgKGkgPT0gY29uZmlnXy5ibG9ja19jb3VudCkgeworICAgICAgc3RkOjpjZXJyIDw8ICJDaGFpbiBlbmRpbmcgd2l0aG91dCBwb2lzb24uIiA8PCBzdGQ6OmVuZGw7CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgfQorICBxdWV1ZXNfLmNsZWFyKCk7CisgIHByb2dyZXNzXy5GaW5pc2hlZCgpOworICBjb21wbGV0ZV9jYWxsZWRfID0gZmFsc2U7CisgIGlmIChyZWxlYXNlX21lbW9yeSkgbWVtb3J5Xy5yZXNldCgpOworfQorCit2b2lkIENoYWluOjpTdGFydCgpIHsKKyAgV2FpdChmYWxzZSk7CisgIGlmICghbWVtb3J5Xy5nZXQoKSkgeworICAgIC8vIEFsbG9jYXRlIG1lbW9yeS4KKyAgICBhc3NlcnQodGhyZWFkc18uZW1wdHkoKSk7CisgICAgYXNzZXJ0KHF1ZXVlc18uZW1wdHkoKSk7CisgICAgc3RkOjpzaXplX3QgbWFsbG9jX3NpemUgPSBibG9ja19zaXplXyAqIGNvbmZpZ18uYmxvY2tfY291bnQ7CisgICAgbWVtb3J5Xy5yZXNldChNYWxsb2NPclRocm93KG1hbGxvY19zaXplKSk7CisgIH0KKyAgLy8gVGhpcyBxdWV1ZSBjYW4gYWNjb21vZGF0ZSBhbGwgYmxvY2tzLgorICBxdWV1ZXNfLnB1c2hfYmFjayhuZXcgUENRdWV1ZTxCbG9jaz4oY29uZmlnXy5ibG9ja19jb3VudCkpOworICAvLyBQb3B1bGF0ZSB0aGUgbGVhZCBxdWV1ZSB3aXRoIGJsb2Nrcy4KKyAgdWludDhfdCAqYmFzZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihtZW1vcnlfLmdldCgpKTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGNvbmZpZ18uYmxvY2tfY291bnQ7ICsraSkgeworICAgIHF1ZXVlc18uZnJvbnQoKS5Qcm9kdWNlKEJsb2NrKGJhc2UsIGJsb2NrX3NpemVfKSk7CisgICAgYmFzZSArPSBibG9ja19zaXplXzsKKyAgfQorfQorCitDaGFpblBvc2l0aW9uIENoYWluOjpDb21wbGV0ZSgpIHsKKyAgYXNzZXJ0KFJ1bm5pbmcoKSk7CisgIFVUSUxfVEhST1dfSUYoY29tcGxldGVfY2FsbGVkXywgdXRpbDo6RXhjZXB0aW9uLCAiQ29tcGxldGVMb29wKCkgY2FsbGVkIHR3aWNlIik7CisgIGNvbXBsZXRlX2NhbGxlZF8gPSB0cnVlOworICByZXR1cm4gQ2hhaW5Qb3NpdGlvbihxdWV1ZXNfLmJhY2soKSwgcXVldWVzXy5mcm9udCgpLCB0aGlzLCBwcm9ncmVzc18pOworfQorCitMaW5rOjpMaW5rKCkgOiBpbl8oTlVMTCksIG91dF8oTlVMTCksIHBvaXNvbmVkXyh0cnVlKSB7fQorCit2b2lkIExpbms6OkluaXQoY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKKyAgVVRJTF9USFJPV19JRihpbl8sIHV0aWw6OkV4Y2VwdGlvbiwgIkxpbms6OkluaXQgdHdpY2UiKTsKKyAgaW5fID0gcG9zaXRpb24uaW5fOworICBvdXRfID0gcG9zaXRpb24ub3V0XzsKKyAgcG9pc29uZWRfID0gZmFsc2U7CisgIHByb2dyZXNzXyA9IHBvc2l0aW9uLnByb2dyZXNzXzsKKyAgaW5fLT5Db25zdW1lKGN1cnJlbnRfKTsKK30KKworTGluazo6TGluayhjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgOiBpbl8oTlVMTCkgeworICBJbml0KHBvc2l0aW9uKTsKK30KKworTGluazo6fkxpbmsoKSB7CisgIGlmIChjdXJyZW50XykgeworICAgIC8vIFByb2JhYmx5IGFuIGV4Y2VwdGlvbiB1bndpbmRpbmcuCisgICAgc3RkOjpjZXJyIDw8ICJMYXN0IGlucHV0IHNob3VsZCBoYXZlIGJlZW4gcG9pc29uLiIgPDwgc3RkOjplbmRsOworICAgIGFib3J0KCk7CisgIH0gZWxzZSB7CisgICAgaWYgKCFwb2lzb25lZF8pIHsKKyAgICAgIC8vIFBvaXNvbiBpcyBhIGJsb2NrIHdob3NlIG1lbW9yeSBwb2ludGVyIGlzIE5VTEwuCisgICAgICAvLworICAgICAgLy8gQmVjYXVzZSB3ZSdyZSBpbiB0aGUgZWxzZSBibG9jaywKKyAgICAgIC8vICAgd2Uga25vdyB0aGF0IHRoZSBtZW1vcnkgcG9pbnRlciBvZiBjdXJyZW50XyBpcyBOVUxMLgorICAgICAgLy8KKyAgICAgIC8vIFBhc3MgdGhlIGN1cnJlbnQgKHBvaXNvbikgYmxvY2shCisgICAgICBvdXRfLT5Qcm9kdWNlKGN1cnJlbnRfKTsKKyAgICB9CisgIH0KK30KKworTGluayAmTGluazo6b3BlcmF0b3IrKygpIHsKKyAgYXNzZXJ0KGN1cnJlbnRfKTsKKyAgcHJvZ3Jlc3NfICs9IGN1cnJlbnRfLlZhbGlkU2l6ZSgpOworICBvdXRfLT5Qcm9kdWNlKGN1cnJlbnRfKTsKKyAgaW5fLT5Db25zdW1lKGN1cnJlbnRfKTsKKyAgaWYgKCFjdXJyZW50XykgeworICAgIHBvaXNvbmVkXyA9IHRydWU7CisgICAgb3V0Xy0+UHJvZHVjZShjdXJyZW50Xyk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIExpbms6OlBvaXNvbigpIHsKKyAgYXNzZXJ0KCFwb2lzb25lZF8pOworICBjdXJyZW50Xy5TZXRUb1BvaXNvbigpOworICBvdXRfLT5Qcm9kdWNlKGN1cnJlbnRfKTsKKyAgcG9pc29uZWRfID0gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2Ugc3RyZWFtCit9IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9zdHJlYW0vY2hhaW4uaGggYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vY2hhaW4uaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2OTgyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9jaGFpbi5oaApAQCAtMCwwICsxLDM0NyBAQAorI2lmbmRlZiBVVElMX1NUUkVBTV9DSEFJTl9ICisjZGVmaW5lIFVUSUxfU1RSRUFNX0NIQUlOX0gKKworI2luY2x1ZGUgInV0aWwvc3RyZWFtL2Jsb2NrLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NvbmZpZy5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9tdWx0aV9wcm9ncmVzcy5oaCIKKyNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKKworI2luY2x1ZGUgPGJvb3N0L3B0cl9jb250YWluZXIvcHRyX3ZlY3Rvci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL3RocmVhZC5ocHA+CisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSB1dGlsIHsKK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBQQ1F1ZXVlOworbmFtZXNwYWNlIHN0cmVhbSB7CisKK2NsYXNzIENoYWluQ29uZmlnRXhjZXB0aW9uIDogcHVibGljIEV4Y2VwdGlvbiB7CisgIHB1YmxpYzoKKyAgICBDaGFpbkNvbmZpZ0V4Y2VwdGlvbigpIHRocm93KCk7CisgICAgfkNoYWluQ29uZmlnRXhjZXB0aW9uKCkgdGhyb3coKTsKK307CisKK2NsYXNzIENoYWluOworY2xhc3MgUmV3aW5kYWJsZVN0cmVhbTsKKworLyoqCisgKiBFbmNhcHN1bGF0ZXMgYSBAcmVmIFBDUXVldWUgInByb2R1Y2VyIHF1ZXVlIiBhbmQgYSBAcmVmIFBDUXVldWUgImNvbnN1bWVyIHF1ZXVlIiB3aXRoaW4gYSBAcmVmIENoYWluICJjaGFpbiIuCisgKgorICogU3BlY2lmaWVzIHBvc2l0aW9uIGluIGNoYWluIGZvciBMaW5rIGNvbnN0cnVjdG9yLgorICovCitjbGFzcyBDaGFpblBvc2l0aW9uIHsKKyAgcHVibGljOgorICAgIGNvbnN0IENoYWluICZHZXRDaGFpbigpIGNvbnN0IHsgcmV0dXJuICpjaGFpbl87IH0KKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQ2hhaW47CisgICAgZnJpZW5kIGNsYXNzIExpbms7CisgICAgZnJpZW5kIGNsYXNzIFJld2luZGFibGVTdHJlYW07CisgICAgQ2hhaW5Qb3NpdGlvbihQQ1F1ZXVlPEJsb2NrPiAmaW4sIFBDUXVldWU8QmxvY2s+ICZvdXQsIENoYWluICpjaGFpbiwgTXVsdGlQcm9ncmVzcyAmcHJvZ3Jlc3MpCisgICAgICA6IGluXygmaW4pLCBvdXRfKCZvdXQpLCBjaGFpbl8oY2hhaW4pLCBwcm9ncmVzc18ocHJvZ3Jlc3MuQWRkKCkpIHt9CisKKyAgICBQQ1F1ZXVlPEJsb2NrPiAqaW5fLCAqb3V0XzsKKworICAgIENoYWluICpjaGFpbl87CisKKyAgICBXb3JrZXJQcm9ncmVzcyBwcm9ncmVzc187Cit9OworCisKKy8qKgorICogRW5jYXBzdWxhdGVzIGEgd29ya2VyIHRocmVhZCBwcm9jZXNzaW5nIGRhdGEgYXQgYSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgY2hhaW4uCisgKgorICogRWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIG93bnMgb25lIGJvb3N0IHRocmVhZCBpbiB3aGljaCB0aGUgd29ya2VyIGlzIFJ1bigpLgorICovCitjbGFzcyBUaHJlYWQgeworICBwdWJsaWM6CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRocmVhZCBpbiB3aGljaCB0aGUgcHJvdmlkZWQgV29ya2VyIGlzIFJ1bigpLgorICAgICAqCisgICAgICogUG9zaXRpb24gaXMgdXN1YWxseSBDaGFpblBvc2l0aW9uIGJ1dCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3RyZWFtcyBpbnZvbHZlZCwgdGhpcyBjYW4gYmUgQ2hhaW5Qb3NpdGlvbnMuCisgICAgICoKKyAgICAgKiBBZnRlciBhIGNhbGwgdG8gdGhpcyBjb25zdHJ1Y3RvciwgdGhlIHByb3ZpZGVkIHdvcmtlciB3aWxsIGJlIHJ1bm5pbmcgd2l0aGluIGEgYm9vc3QgdGhyZWFkIG93bmVkIGJ5IHRoZSBuZXdseSBjb25zdHJ1Y3RlZCBUaHJlYWQgb2JqZWN0LgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBQb3NpdGlvbiwgY2xhc3MgV29ya2VyPiBUaHJlYWQoY29uc3QgUG9zaXRpb24gJnBvc2l0aW9uLCBjb25zdCBXb3JrZXIgJndvcmtlcikKKyAgICAgIDogdGhyZWFkXyhib29zdDo6cmVmKCp0aGlzKSwgcG9zaXRpb24sIHdvcmtlcikge30KKworICAgIH5UaHJlYWQoKTsKKworICAgIC8qKgorICAgICAqIExhdW5jaGVzIHRoZSBwcm92aWRlZCB3b3JrZXIgaW4gdGhpcyBvYmplY3QncyBib29zdCB0aHJlYWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGlzIGNsYXNzJ3MgQHJlZiBUaHJlYWQoKSAiY29uc3RydWN0b3IiLgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBQb3NpdGlvbiwgY2xhc3MgV29ya2VyPiB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUG9zaXRpb24gJnBvc2l0aW9uLCBXb3JrZXIgJndvcmtlcikgeworLy8gICAgICB0cnkgeworICAgICAgICB3b3JrZXIuUnVuKHBvc2l0aW9uKTsKKy8vICAgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24gJmUpIHsKKy8vICAgICAgICBVbmhhbmRsZWRFeGNlcHRpb24oZSk7CisvLyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIFVuaGFuZGxlZEV4Y2VwdGlvbihjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmZSk7CisKKyAgICBib29zdDo6dGhyZWFkIHRocmVhZF87Cit9OworCisvKioKKyAqIFRoaXMgcmVzZXRzIGJsb2NrcyB0byBmdWxsIHZhbGlkIHNpemUuICBVc2VkIHRvIGNsb3NlIHRoZSBsb29wIGluIENoYWluIGJ5IHJlY3ljbGluZyBibG9ja3MuCisgKi8KK2NsYXNzIFJlY3ljbGVyIHsKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgYmxvY2tzIGluIHRoZSBjaGFpbiBzdWNoIHRoYXQgdGhlIGJsb2NrcycgcmVzcGVjdGl2ZSB2YWxpZCBzaXplcyBtYXRjaCB0aGUgY2hhaW4ncyBibG9jayBzaXplLgorICAgICAqCisgICAgICogQHNlZSBCbG9jazo6U2V0VmFsaWRTaXplKCkKKyAgICAgKiBAc2VlIENoYWluOjpCbG9ja1NpemUoKQorICAgICAqLworICAgIHZvaWQgUnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKTsKK307CisKK2V4dGVybiBjb25zdCBSZWN5Y2xlciBrUmVjeWNsZTsKK2NsYXNzIFdyaXRlQW5kUmVjeWNsZTsKK2NsYXNzIFBXcml0ZUFuZFJlY3ljbGU7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIHdvcmtlcnMsIHRocm91Z2ggd2hpY2ggQHJlZiBCbG9jayAiYmxvY2tzIiBjYW4gcGFzcy4KKyAqLworY2xhc3MgQ2hhaW4geworICBwcml2YXRlOgorICAgIHRlbXBsYXRlIDxjbGFzcyBULCB2b2lkIChUOjoqcHRyKShjb25zdCBDaGFpblBvc2l0aW9uICYpID0gJlQ6OlJ1bj4gc3RydWN0IENoZWNrRm9yUnVuIHsKKyAgICAgIHR5cGVkZWYgQ2hhaW4gdHlwZTsKKyAgICB9OworCisgIHB1YmxpYzoKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBjb25maWd1cmVkIENoYWluLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBTcGVjaWZpZXMgaG93IHRvIGNvbmZpZ3VyZSB0aGUgQ2hhaW4uCisgICAgICovCisgICAgZXhwbGljaXQgQ2hhaW4oY29uc3QgQ2hhaW5Db25maWcgJmNvbmZpZyk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdHMgYSBDaGFpbi4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdhaXRzIGZvciB0aGUgY2hhaW4ncyB0aHJlYWRzIHRvIGNvbXBsZXRlLAorICAgICAqIGFuZCBmcmVlcyB0aGUgbWVtb3J5IGhlbGQgYnkgdGhpcyBjaGFpbi4KKyAgICAgKi8KKyAgICB+Q2hhaW4oKTsKKworICAgIHZvaWQgQWN0aXZhdGVQcm9ncmVzcygpIHsKKyAgICAgIGFzc2VydCghUnVubmluZygpKTsKKyAgICAgIHByb2dyZXNzXy5BY3RpdmF0ZSgpOworICAgIH0KKworICAgIHZvaWQgU2V0UHJvZ3Jlc3NUYXJnZXQodWludDY0X3QgdGFyZ2V0KSB7CisgICAgICBwcm9ncmVzc18uU2V0VGFyZ2V0KHRhcmdldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggcmVjb3JkIG9mIGEgQmxvY2suCisgICAgICoKKyAgICAgKiBAc2VlIENoYWluQ29uZmlnOjplbnRyeV9zaXplCisgICAgICovCisgICAgc3RkOjpzaXplX3QgRW50cnlTaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbmZpZ18uZW50cnlfc2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBpbml0YWwgQHJlZiBCbG9jazo6VmFsaWRTaXplICJ2YWxpZCBzaXplIiBmb3IgQHJlZiBCbG9jayAiYmxvY2tzIiBpbiB0aGlzIGNoYWluLgorICAgICAqCisgICAgICogQHNlZSBCbG9jazo6VmFsaWRTaXplCisgICAgICovCisgICAgc3RkOjpzaXplX3QgQmxvY2tTaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJsb2NrX3NpemVfOworICAgIH0KKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBibG9ja3MgZ29pbmcgdGhyb3VnaCB0aGUgQ2hhaW4uCisgICAgICovCisgICAgc3RkOjpzaXplX3QgQmxvY2tDb3VudCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25maWdfLmJsb2NrX2NvdW50OworICAgIH0KKworICAgIC8qKiBUd28gd2F5cyB0byBhZGQgdG8gdGhlIGNoYWluOiBBZGQoKSBvciBvcGVyYXRvcj4+LiAqLworICAgIENoYWluUG9zaXRpb24gQWRkKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IHdvcmtlciB0byB0aGlzIGNoYWluLAorICAgICAqIGFuZCBydW5zIHRoYXQgd29ya2VyIGluIGEgbmV3IFRocmVhZCBvd25lZCBieSB0aGlzIGNoYWluLgorICAgICAqCisgICAgICogVGhlIHdvcmtlciBtdXN0IGhhdmUgYSBSdW4gbWV0aG9kIHRoYXQgYWNjZXB0cyBhIHBvc2l0aW9uIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHNlZSBUaHJlYWQ6Om9wZXJhdG9yKCkoKQorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBXb3JrZXI+IHR5cGVuYW1lIENoZWNrRm9yUnVuPFdvcmtlcj46OnR5cGUgJm9wZXJhdG9yPj4oY29uc3QgV29ya2VyICZ3b3JrZXIpIHsKKyAgICAgIGFzc2VydCghY29tcGxldGVfY2FsbGVkXyk7CisgICAgICB0aHJlYWRzXy5wdXNoX2JhY2sobmV3IFRocmVhZChBZGQoKSwgd29ya2VyKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIC8qKgorICAgKiBBZGRzIGEgbmV3IHdvcmtlciB0byB0aGlzIGNoYWluIChidXQgYXZvaWRzIGNvcHlpbmcgdGhhdCB3b3JrZXIpLAorICAgKiBhbmQgcnVucyB0aGF0IHdvcmtlciBpbiBhIG5ldyBUaHJlYWQgb3duZWQgYnkgdGhpcyBjaGFpbi4KKyAgICoKKyAgICogVGhlIHdvcmtlciBtdXN0IGhhdmUgYSBSdW4gbWV0aG9kIHRoYXQgYWNjZXB0cyBhIHBvc2l0aW9uIGFyZ3VtZW50LgorICAgKgorICAgKiBAc2VlIFRocmVhZDo6b3BlcmF0b3IoKSgpCisgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBXb3JrZXI+IHR5cGVuYW1lIENoZWNrRm9yUnVuPFdvcmtlcj46OnR5cGUgJm9wZXJhdG9yPj4oY29uc3QgYm9vc3Q6OnJlZmVyZW5jZV93cmFwcGVyPFdvcmtlcj4gJndvcmtlcikgeworICAgICAgYXNzZXJ0KCFjb21wbGV0ZV9jYWxsZWRfKTsKKyAgICAgIHRocmVhZHNfLnB1c2hfYmFjayhuZXcgVGhyZWFkKEFkZCgpLCB3b3JrZXIpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBOb3RlIHRoYXQgTGluayBhbmQgU3RyZWFtIGFsc28gZGVmaW5lIG9wZXJhdG9yPj4gb3V0c2lkZSB0aGlzIGNsYXNzLgorCisgICAgLy8gVG8gY29tcGxldGUgdGhlIGxvb3AsIGNhbGwgQ29tcGxldGVMb29wKCksID4+IGtSZWN5Y2xlLCBvciB0aGUgZGVzdHJ1Y3Rvci4KKyAgICB2b2lkIENvbXBsZXRlTG9vcCgpIHsKKyAgICAgIHRocmVhZHNfLnB1c2hfYmFjayhuZXcgVGhyZWFkKENvbXBsZXRlKCksIGtSZWN5Y2xlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIFJlY3ljbGVyIHdvcmtlciB0byB0aGlzIGNoYWluLAorICAgICAqIGFuZCBydW5zIHRoYXQgd29ya2VyIGluIGEgbmV3IFRocmVhZCBvd25lZCBieSB0aGlzIGNoYWluLgorICAgICAqLworICAgIENoYWluICZvcGVyYXRvcj4+KGNvbnN0IFJlY3ljbGVyICYpIHsKKyAgICAgIENvbXBsZXRlTG9vcCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBXcml0ZUFuZFJlY3ljbGUgd29ya2VyIHRvIHRoaXMgY2hhaW4sCisgICAgICogYW5kIHJ1bnMgdGhhdCB3b3JrZXIgaW4gYSBuZXcgVGhyZWFkIG93bmVkIGJ5IHRoaXMgY2hhaW4uCisgICAgICovCisgICAgQ2hhaW4gJm9wZXJhdG9yPj4oY29uc3QgV3JpdGVBbmRSZWN5Y2xlICZ3cml0ZXIpOworICAgIENoYWluICZvcGVyYXRvcj4+KGNvbnN0IFBXcml0ZUFuZFJlY3ljbGUgJndyaXRlcik7CisKKyAgICAvLyBDaGFpbnMgYXJlIHJldXNhYmxlLiAgQ2FsbCBXYWl0IHRvIHdhaXQgZm9yIGV2ZXJ5dGhpbmcgdG8gZmluaXNoIGFuZCBmcmVlIG1lbW9yeS4KKyAgICB2b2lkIFdhaXQoYm9vbCByZWxlYXNlX21lbW9yeSA9IHRydWUpOworCisgICAgLy8gV2FpdHMgZm9yIHRoZSBjdXJyZW50IGNoYWluIHRvIGNvbXBsZXRlIChpZiBhbnkpIHRoZW4gc3RhcnRzIGFnYWluLgorICAgIHZvaWQgU3RhcnQoKTsKKworICAgIGJvb2wgUnVubmluZygpIGNvbnN0IHsgcmV0dXJuICFxdWV1ZXNfLmVtcHR5KCk7IH0KKworICBwcml2YXRlOgorICAgIENoYWluUG9zaXRpb24gQ29tcGxldGUoKTsKKworICAgIENoYWluQ29uZmlnIGNvbmZpZ187CisKKyAgICBzdGQ6OnNpemVfdCBibG9ja19zaXplXzsKKworICAgIHNjb3BlZF9tYWxsb2MgbWVtb3J5XzsKKworICAgIGJvb3N0OjpwdHJfdmVjdG9yPFBDUXVldWU8QmxvY2s+ID4gcXVldWVzXzsKKworICAgIGJvb2wgY29tcGxldGVfY2FsbGVkXzsKKworICAgIGJvb3N0OjpwdHJfdmVjdG9yPFRocmVhZD4gdGhyZWFkc187CisKKyAgICBNdWx0aVByb2dyZXNzIHByb2dyZXNzXzsKK307CisKKy8vIENyZWF0ZSB0aGUgbGluayBpbiB0aGUgd29ya2VyIHRocmVhZCB1c2luZyB0aGUgcG9zaXRpb24gdG9rZW4uCisvKioKKyAqIFJlcHJlc2VudHMgYSBDKysgc3R5bGUgaXRlcmF0b3Igb3ZlciBAcmVmIEJsb2NrICJibG9ja3MiLgorICovCitjbGFzcyBMaW5rIHsKKyAgcHVibGljOgorCisgICAgLy8gRWl0aGVyIGRlZmF1bHQgY29uc3RydWN0IGFuZCBJbml0IG9yIGp1c3QgY29uc3RydWN0IGFsbCBhdCBvbmNlLgorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBAcmVmIEluaXQgImluaXRpYWxpemVkIiBsaW5rLgorICAgICAqCisgICAgICogQHNlZSBJbml0CisgICAgICovCisgICAgZXhwbGljaXQgTGluayhjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbGluayB0aGF0IG11c3Qgc3Vic2VxdWVudGx5IGJlIEByZWYgSW5pdCAiaW5pdGlhbGl6ZWQiLgorICAgICAqCisgICAgICogQHNlZSBJbml0CisgICAgICovCisgICAgTGluaygpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGxpbmsgd2l0aCB0aGUgaW5wdXQgQHJlZiBQQ1F1ZXVlICJjb25zdW1lciBxdWV1ZSIgYW5kIG91dHB1dCBAcmVmIFBDUXVldWUgInByb2R1Y2VyIHF1ZXVlIiBhdCBhIGdpdmVuIEByZWYgQ2hhaW5Qb3NpdGlvbiAicG9zaXRpb24iIGluIHRoZSBAcmVmIENoYWluICJjaGFpbiIuCisgICAgICoKKyAgICAgKiBAc2VlIExpbmsoKQorICAgICAqLworICAgIHZvaWQgSW5pdChjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdHMgdGhlIGxpbmsgb2JqZWN0LgorICAgICAqCisgICAgICogSWYgbmVjZXNzYXJ5LCB0aGlzIG1ldGhvZCB3aWxsIHBhc3MgYSBwb2lzb24gYmxvY2sKKyAgICAgKiB0byB0aGlzIGxpbmsncyBvdXRwdXQgQHJlZiBQQ1F1ZXVlICJwcm9kdWNlciBxdWV1ZSIuCisgICAgICoKKyAgICAgKiBAc2VlIEJsb2NrOjpTZXRUb1BvaXNvbigpCisgICAgICovCisgICAgfkxpbmsoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIEByZWYgQmxvY2sgImJsb2NrIiBhdCB0aGlzIGxpbmsuCisgICAgICovCisgICAgQmxvY2sgJm9wZXJhdG9yKigpIHsgcmV0dXJuIGN1cnJlbnRfOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBAcmVmIEJsb2NrICJibG9jayIgYXQgdGhpcyBsaW5rLgorICAgICAqLworICAgIGNvbnN0IEJsb2NrICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBjdXJyZW50XzsgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIHBvaW50ZXIgdG8gdGhlIEByZWYgQmxvY2sgImJsb2NrIiBhdCB0aGlzIGxpbmsuCisgICAgICovCisgICAgQmxvY2sgKm9wZXJhdG9yLT4oKSB7IHJldHVybiAmY3VycmVudF87IH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBAcmVmIEJsb2NrICJibG9jayIgYXQgdGhpcyBsaW5rLgorICAgICAqLworICAgIGNvbnN0IEJsb2NrICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaW5rIGF0IHRoZSBuZXh0IEByZWYgQ2hhaW5Qb3NpdGlvbiAicG9zaXRpb24iIGluIHRoZSBAcmVmIENoYWluICJjaGFpbiIuCisgICAgICovCisgICAgTGluayAmb3BlcmF0b3IrKygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBAcmVmIEJsb2NrICJibG9jayIgYXQgdGhpcyBsaW5rIGVuY2Fwc3VsYXRlcyBhIHZhbGlkIChub24tTlVMTCkgYmxvY2sgb2YgbWVtb3J5LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgYSB1c2VyLWRlZmluZWQgaW1wbGljaXQgY29udmVyc2lvbiBmdW5jdGlvbiB0byBib29sZWFuOworICAgICAqIGFtb25nIG90aGVyIHRoaW5ncywgdGhpcyBtZXRob2QgZW5hYmxlcyBiYXJlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzCisgICAgICogdG8gYmUgdXNlZCBhcyB0aGUgY29uZGl0aW9uIG9mIGFuIGlmIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF87IH0KKworICAgIC8qKgorICAgICAqIEByZWYgQmxvY2s6OlNldFRvUG9pc29uKCkgIlBvaXNvbnMiIHRoZSBAcmVmIEJsb2NrICJibG9jayIgYXQgdGhpcyBsaW5rLAorICAgICAqIGFuZCBwYXNzZXMgdGhpcyBub3ctcG9pc29uZWQgYmxvY2sgdG8gdGhpcyBsaW5rJ3Mgb3V0cHV0IEByZWYgUENRdWV1ZSAicHJvZHVjZXIgcXVldWUiLgorICAgICAqCisgICAgICogQHNlZSBCbG9jazo6U2V0VG9Qb2lzb24oKQorICAgICAqLworICAgIHZvaWQgUG9pc29uKCk7CisKKyAgcHJpdmF0ZToKKyAgICBCbG9jayBjdXJyZW50XzsKKyAgICBQQ1F1ZXVlPEJsb2NrPiAqaW5fLCAqb3V0XzsKKworICAgIGJvb2wgcG9pc29uZWRfOworCisgICAgV29ya2VyUHJvZ3Jlc3MgcHJvZ3Jlc3NfOworfTsKKworaW5saW5lIENoYWluICZvcGVyYXRvcj4+KENoYWluICZjaGFpbiwgTGluayAmbGluaykgeworICBsaW5rLkluaXQoY2hhaW4uQWRkKCkpOworICByZXR1cm4gY2hhaW47Cit9CisKK30gLy8gbmFtZXNwYWNlIHN0cmVhbQorfSAvLyBuYW1lc3BhY2UgdXRpbAorCisjZW5kaWYgLy8gVVRJTF9TVFJFQU1fQ0hBSU5fSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL2NvbmZpZy5oaCBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9jb25maWcuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0Y2YzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9jb25maWcuaGgKQEAgLTAsMCArMSw2MyBAQAorI2lmbmRlZiBVVElMX1NUUkVBTV9DT05GSUdfSAorI2RlZmluZSBVVElMX1NUUkVBTV9DT05GSUdfSAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSB1dGlsIHsgbmFtZXNwYWNlIHN0cmVhbSB7CisKKy8qKgorICogUmVwcmVzZW50cyBob3cgYSBjaGFpbiBzaG91bGQgYmUgY29uZmlndXJlZC4KKyAqLworc3RydWN0IENoYWluQ29uZmlnIHsKKworICAvKiogQ29uc3RydWN0cyBhbiBjb25maWd1cmF0aW9uIHdpdGggdW5kZXJzcGVjaWZpZWQgKG9yIGRlZmF1bHQpIHBhcmFtZXRlcnMuICovCisgIENoYWluQ29uZmlnKCkge30KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIGNoYWluIGNvbmZpZ3VyYXRpb24gb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gW2luXSBpbl9lbnRyeV9zaXplICAgTnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggcmVjb3JkLgorICAgKiBAcGFyYW0gW2luXSBpbl9ibG9ja19jb3VudCAgTnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgY2hhaW4uCisgICAqIEBwYXJhbSBbaW5dIGluX3RvdGFsX21lbW9yeSBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIHRvIHRoZSBjaGFpbi4KKyAgICogICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIGRpdmlkZWQgYW1vbmdzdCB0aGUgYmxvY2tzIGluIHRoZSBjaGFpbi4KKyAgICovCisgIENoYWluQ29uZmlnKHN0ZDo6c2l6ZV90IGluX2VudHJ5X3NpemUsIHN0ZDo6c2l6ZV90IGluX2Jsb2NrX2NvdW50LCBzdGQ6OnNpemVfdCBpbl90b3RhbF9tZW1vcnkpCisgICAgOiBlbnRyeV9zaXplKGluX2VudHJ5X3NpemUpLCBibG9ja19jb3VudChpbl9ibG9ja19jb3VudCksIHRvdGFsX21lbW9yeShpbl90b3RhbF9tZW1vcnkpIHt9CisKKyAgLyoqCisgICAqIE51bWJlciBvZiBieXRlcyBpbiBlYWNoIHJlY29yZC4KKyAgICovCisgIHN0ZDo6c2l6ZV90IGVudHJ5X3NpemU7CisKKyAgLyoqCisgICAqIE51bWJlciBvZiBibG9ja3MgaW4gdGhlIGNoYWluLgorICAgKi8KKyAgc3RkOjpzaXplX3QgYmxvY2tfY291bnQ7CisKKyAgLyoqCisgICAqIFRvdGFsIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgdG8gdGhlIGNoYWluLgorICAgKiBUaGlzIHZhbHVlIHdpbGwgYmUgZGl2aWRlZCBhbW9uZ3N0IHRoZSBibG9ja3MgaW4gdGhlIGNoYWluLgorICAgKiBDaGFpbidzIGNvbnN0cnVjdG9yIHdpbGwgbWFrZSB0aGlzIGEgbXVsdGlwbGUgb2YgZW50cnlfc2l6ZS4KKyAgICovCisgIHN0ZDo6c2l6ZV90IHRvdGFsX21lbW9yeTsKK307CisKKworLyoqCisgKiBSZXByZXNlbnRzIGhvdyBhIHNvcnRlciBzaG91bGQgYmUgY29uZmlndXJlZC4KKyAqLworc3RydWN0IFNvcnRDb25maWcgeworCisgIC8qKiBGaWxlbmFtZSBwcmVmaXggd2hlcmUgdGVtcG9yYXJ5IGZpbGVzIHNob3VsZCBiZSBwbGFjZWQuICovCisgIHN0ZDo6c3RyaW5nIHRlbXBfcHJlZml4OworCisgIC8qKiBTaXplIG9mIGVhY2ggaW5wdXQvb3V0cHV0IGJ1ZmZlci4gKi8KKyAgc3RkOjpzaXplX3QgYnVmZmVyX3NpemU7CisKKyAgLyoqIFRvdGFsIG1lbW9yeSB0byB1c2Ugd2hlbiBydW5uaW5nIGFsb25lLiAqLworICBzdGQ6OnNpemVfdCB0b3RhbF9tZW1vcnk7Cit9OworCit9fSAvLyBuYW1lc3BhY2VzCisjZW5kaWYgLy8gVVRJTF9TVFJFQU1fQ09ORklHX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9jb3VudF9yZWNvcmRzLmNjIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL2NvdW50X3JlY29yZHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhZGFkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9jb3VudF9yZWNvcmRzLmNjCkBAIC0wLDAgKzEsMTIgQEAKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9jb3VudF9yZWNvcmRzLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NoYWluLmhoIgorCituYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0geworCit2b2lkIENvdW50UmVjb3Jkczo6UnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7CisgIGZvciAoTGluayBsaW5rKHBvc2l0aW9uKTsgbGluazsgKytsaW5rKSB7CisgICAgKmNvdW50XyArPSBsaW5rLT5WYWxpZFNpemUoKSAvIHBvc2l0aW9uLkdldENoYWluKCkuRW50cnlTaXplKCk7CisgIH0KK30KKworfX0gLy8gbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL2NvdW50X3JlY29yZHMuaGggYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vY291bnRfcmVjb3Jkcy5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Y3Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL2NvdW50X3JlY29yZHMuaGgKQEAgLTAsMCArMSwyMCBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0geworCitjbGFzcyBDaGFpblBvc2l0aW9uOworCitjbGFzcyBDb3VudFJlY29yZHMgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQ291bnRSZWNvcmRzKHVpbnQ2NF90ICpvdXQpCisgICAgICA6IGNvdW50XyhvdXQpIHsKKyAgICAgICpjb3VudF8gPSAwOworICAgIH0KKworICAgIHZvaWQgUnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKTsKKworICBwcml2YXRlOgorICAgIHVpbnQ2NF90ICpjb3VudF87Cit9OworCit9fSAvLyBuYW1lc3BhY2VzCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9zdHJlYW0vaW8uY2MgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vaW8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3MmQ3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9pby5jYwpAQCAtMCwwICsxLDc4IEBACisjaW5jbHVkZSAidXRpbC9zdHJlYW0vaW8uaGgiCisKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY2hhaW4uaGgiCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2Ugc3RyZWFtIHsKKworUmVhZFNpemVFeGNlcHRpb246OlJlYWRTaXplRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorUmVhZFNpemVFeGNlcHRpb246On5SZWFkU2l6ZUV4Y2VwdGlvbigpIHRocm93KCkge30KKwordm9pZCBSZWFkOjpSdW4oY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKKyAgY29uc3Qgc3RkOjpzaXplX3QgYmxvY2tfc2l6ZSA9IHBvc2l0aW9uLkdldENoYWluKCkuQmxvY2tTaXplKCk7CisgIGNvbnN0IHN0ZDo6c2l6ZV90IGVudHJ5X3NpemUgPSBwb3NpdGlvbi5HZXRDaGFpbigpLkVudHJ5U2l6ZSgpOworICBmb3IgKExpbmsgbGluayhwb3NpdGlvbik7IGxpbms7ICsrbGluaykgeworICAgIHN0ZDo6c2l6ZV90IGdvdCA9IHV0aWw6OlJlYWRPckVPRihmaWxlXywgbGluay0+R2V0KCksIGJsb2NrX3NpemUpOworICAgIFVUSUxfVEhST1dfSUYoZ290ICUgZW50cnlfc2l6ZSwgUmVhZFNpemVFeGNlcHRpb24sICJGaWxlIGVuZGVkIHdpdGggIiA8PCBnb3QgPDwgIiBieXRlcywgbm90IGEgbXVsdGlwbGUgb2YgIiA8PCBlbnRyeV9zaXplIDw8ICIuIik7CisgICAgaWYgKGdvdCA9PSAwKSB7CisgICAgICBsaW5rLlBvaXNvbigpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICBsaW5rLT5TZXRWYWxpZFNpemUoZ290KTsKKyAgICB9CisgIH0KK30KKwordm9pZCBQUmVhZDo6UnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7CisgIHNjb3BlZF9mZCBvd25lcjsKKyAgaWYgKG93bl8pIG93bmVyLnJlc2V0KGZpbGVfKTsKKyAgY29uc3QgdWludDY0X3Qgc2l6ZSA9IFNpemVPclRocm93KGZpbGVfKTsKKyAgVVRJTF9USFJPV19JRihzaXplICUgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHBvc2l0aW9uLkdldENoYWluKCkuRW50cnlTaXplKCkpLCBSZWFkU2l6ZUV4Y2VwdGlvbiwgIkZpbGUgc2l6ZSAiIDw8IGZpbGVfIDw8ICIgc2l6ZSBpcyAiIDw8IHNpemUgPDwgIiBub3QgYSBtdWx0aXBsZSBvZiAiIDw8IHBvc2l0aW9uLkdldENoYWluKCkuRW50cnlTaXplKCkpOworICBjb25zdCBzdGQ6OnNpemVfdCBibG9ja19zaXplID0gcG9zaXRpb24uR2V0Q2hhaW4oKS5CbG9ja1NpemUoKTsKKyAgY29uc3QgdWludDY0X3QgYmxvY2tfc2l6ZTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJsb2NrX3NpemUpOworICBMaW5rIGxpbmsocG9zaXRpb24pOworICB1aW50NjRfdCBvZmZzZXQgPSAwOworICBmb3IgKDsgb2Zmc2V0ICsgYmxvY2tfc2l6ZTY0IDwgc2l6ZTsgb2Zmc2V0ICs9IGJsb2NrX3NpemU2NCwgKytsaW5rKSB7CisgICAgRXJzYXR6UFJlYWQoZmlsZV8sIGxpbmstPkdldCgpLCBibG9ja19zaXplLCBvZmZzZXQpOworICAgIGxpbmstPlNldFZhbGlkU2l6ZShibG9ja19zaXplKTsKKyAgfQorICAvLyBzaXplIC0gb2Zmc2V0IGlzIDw9IGJsb2NrX3NpemUsIHNvIGl0IGNhc3RzIHRvIDMyLWJpdCBmaW5lLgorICBpZiAoc2l6ZSAtIG9mZnNldCkgeworICAgIEVyc2F0elBSZWFkKGZpbGVfLCBsaW5rLT5HZXQoKSwgc2l6ZSAtIG9mZnNldCwgb2Zmc2V0KTsKKyAgICBsaW5rLT5TZXRWYWxpZFNpemUoc2l6ZSAtIG9mZnNldCk7CisgICAgKytsaW5rOworICB9CisgIGxpbmsuUG9pc29uKCk7Cit9CisKK3ZvaWQgV3JpdGU6OlJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICBmb3IgKExpbmsgbGluayhwb3NpdGlvbik7IGxpbms7ICsrbGluaykgeworICAgIFdyaXRlT3JUaHJvdyhmaWxlXywgbGluay0+R2V0KCksIGxpbmstPlZhbGlkU2l6ZSgpKTsKKyAgfQorfQorCit2b2lkIFdyaXRlQW5kUmVjeWNsZTo6UnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7CisgIGNvbnN0IHN0ZDo6c2l6ZV90IGJsb2NrX3NpemUgPSBwb3NpdGlvbi5HZXRDaGFpbigpLkJsb2NrU2l6ZSgpOworICBmb3IgKExpbmsgbGluayhwb3NpdGlvbik7IGxpbms7ICsrbGluaykgeworICAgIFdyaXRlT3JUaHJvdyhmaWxlXywgbGluay0+R2V0KCksIGxpbmstPlZhbGlkU2l6ZSgpKTsKKyAgICBsaW5rLT5TZXRWYWxpZFNpemUoYmxvY2tfc2l6ZSk7CisgIH0KK30KKwordm9pZCBQV3JpdGVBbmRSZWN5Y2xlOjpSdW4oY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKKyAgY29uc3Qgc3RkOjpzaXplX3QgYmxvY2tfc2l6ZSA9IHBvc2l0aW9uLkdldENoYWluKCkuQmxvY2tTaXplKCk7CisgIHVpbnQ2NF90IG9mZnNldCA9IDA7CisgIGZvciAoTGluayBsaW5rKHBvc2l0aW9uKTsgbGluazsgKytsaW5rKSB7CisgICAgRXJzYXR6UFdyaXRlKGZpbGVfLCBsaW5rLT5HZXQoKSwgbGluay0+VmFsaWRTaXplKCksIG9mZnNldCk7CisgICAgb2Zmc2V0ICs9IGxpbmstPlZhbGlkU2l6ZSgpOworICAgIGxpbmstPlNldFZhbGlkU2l6ZShibG9ja19zaXplKTsKKyAgfQorICAvLyBUcmltIGZpbGUgdG8gc2l6ZS4KKyAgdXRpbDo6UmVzaXplT3JUaHJvdyhmaWxlXywgb2Zmc2V0KTsKK30KKworfSAvLyBuYW1lc3BhY2Ugc3RyZWFtCit9IC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9zdHJlYW0vaW8uaGggYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vaW8uaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwNWE4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9pby5oaApAQCAtMCwwICsxLDg3IEBACisjaWZuZGVmIFVUSUxfU1RSRUFNX0lPX0gKKyNkZWZpbmUgVVRJTF9TVFJFQU1fSU9fSAorCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorCituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2Ugc3RyZWFtIHsKKworY2xhc3MgQ2hhaW5Qb3NpdGlvbjsKKworY2xhc3MgUmVhZFNpemVFeGNlcHRpb24gOiBwdWJsaWMgdXRpbDo6RXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIFJlYWRTaXplRXhjZXB0aW9uKCkgdGhyb3coKTsKKyAgICB+UmVhZFNpemVFeGNlcHRpb24oKSB0aHJvdygpOworfTsKKworY2xhc3MgUmVhZCB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBSZWFkKGludCBmZCkgOiBmaWxlXyhmZCkge30KKyAgICB2b2lkIFJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbik7CisgIHByaXZhdGU6CisgICAgaW50IGZpbGVfOworfTsKKworLy8gTGlrZSByZWFkIGJ1dCB1c2VzIHByZWFkIHNvIHRoYXQgdGhlIGZpbGUgY2FuIGJlIGFjY2Vzc2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KK2NsYXNzIFBSZWFkIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFBSZWFkKGludCBmZCwgYm9vbCB0YWtlX293biA9IGZhbHNlKSA6IGZpbGVfKGZkKSwgb3duXyh0YWtlX293bikge30KKyAgICB2b2lkIFJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbik7CisgIHByaXZhdGU6CisgICAgaW50IGZpbGVfOworICAgIGJvb2wgb3duXzsKK307CisKK2NsYXNzIFdyaXRlIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFdyaXRlKGludCBmZCkgOiBmaWxlXyhmZCkge30KKyAgICB2b2lkIFJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbik7CisgIHByaXZhdGU6CisgICAgaW50IGZpbGVfOworfTsKKworLy8gSXQncyBhIGNvbW1vbiBjYXNlIHRoYXQgc3R1ZmYgaXMgd3JpdHRlbiBhbmQgdGhlbiByZWN5Y2xlZC4gIFNvIHJhdGhlciB0aGFuCisvLyBzcGF3biBhbm90aGVyIHRocmVhZCB0byBSZWN5Y2xlLCB0aGlzIGNvbWJpbmVzIHRoZSB0d28gcm9sZXMuCitjbGFzcyBXcml0ZUFuZFJlY3ljbGUgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgV3JpdGVBbmRSZWN5Y2xlKGludCBmZCkgOiBmaWxlXyhmZCkge30KKyAgICB2b2lkIFJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbik7CisgIHByaXZhdGU6CisgICAgaW50IGZpbGVfOworfTsKKworY2xhc3MgUFdyaXRlQW5kUmVjeWNsZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBQV3JpdGVBbmRSZWN5Y2xlKGludCBmZCkgOiBmaWxlXyhmZCkge30KKyAgICB2b2lkIFJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbik7CisgIHByaXZhdGU6CisgICAgaW50IGZpbGVfOworfTsKKworCisvLyBSZXVzZSB0aGUgc2FtZSBmaWxlIG92ZXIgYW5kIG92ZXIgYWdhaW4gdG8gYnVmZmVyIG91dHB1dC4KK2NsYXNzIEZpbGVCdWZmZXIgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRmlsZUJ1ZmZlcihpbnQgZmQpIDogZmlsZV8oZmQpIHt9CisKKyAgICBQV3JpdGVBbmRSZWN5Y2xlIFNpbmsoKSBjb25zdCB7CisgICAgICB1dGlsOjpTZWVrT3JUaHJvdyhmaWxlXy5nZXQoKSwgMCk7CisgICAgICByZXR1cm4gUFdyaXRlQW5kUmVjeWNsZShmaWxlXy5nZXQoKSk7CisgICAgfQorCisgICAgUFJlYWQgU291cmNlKGJvb2wgZGlzY2FyZCA9IGZhbHNlKSB7CisgICAgICByZXR1cm4gUFJlYWQoZGlzY2FyZCA/IGZpbGVfLnJlbGVhc2UoKSA6IGZpbGVfLmdldCgpLCBkaXNjYXJkKTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBTaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNpemVPclRocm93KGZpbGVfLmdldCgpKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzY29wZWRfZmQgZmlsZV87Cit9OworCit9IC8vIG5hbWVzcGFjZSBzdHJlYW0KK30gLy8gbmFtZXNwYWNlIHV0aWwKKyNlbmRpZiAvLyBVVElMX1NUUkVBTV9JT19ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vaW9fdGVzdC5jYyBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9pb190ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vaW9fdGVzdC5jYwpyZW5hbWUgdG8gc3JjL2tlbmxtL3V0aWwvc3RyZWFtL2lvX3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9saW5lX2lucHV0LmNjIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL2xpbmVfaW5wdXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkODgwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9saW5lX2lucHV0LmNjCkBAIC0wLDAgKzEsNTIgQEAKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9saW5lX2lucHV0LmhoIgorCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9maWxlLmhoIgorI2luY2x1ZGUgInV0aWwvcmVhZF9jb21wcmVzc2VkLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NoYWluLmhoIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHV0aWwgeyBuYW1lc3BhY2Ugc3RyZWFtIHsKKwordm9pZCBMaW5lSW5wdXQ6OlJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbikgeworICBSZWFkQ29tcHJlc3NlZCByZWFkZXIoZmRfKTsKKyAgLy8gSG9sZGluZyBhcmVhIGZvciBiZWdpbm5pbmcgb2YgbGluZSB0byBiZSBwbGFjZWQgaW4gbmV4dCBibG9jay4KKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gY2Fycnk7CisKKyAgZm9yIChMaW5rIGJsb2NrKHBvc2l0aW9uKTsgOyArK2Jsb2NrKSB7CisgICAgY2hhciAqdG8gPSBzdGF0aWNfY2FzdDxjaGFyKj4oYmxvY2stPkdldCgpKTsKKyAgICBjaGFyICpiZWdpbiA9IHRvOworICAgIGNoYXIgKmVuZCA9IHRvICsgcG9zaXRpb24uR2V0Q2hhaW4oKS5CbG9ja1NpemUoKTsKKyAgICBzdGQ6OmNvcHkoY2FycnkuYmVnaW4oKSwgY2FycnkuZW5kKCksIHRvKTsKKyAgICB0byArPSBjYXJyeS5zaXplKCk7CisgICAgd2hpbGUgKHRvICE9IGVuZCkgeworICAgICAgc3RkOjpzaXplX3QgZ290ID0gcmVhZGVyLlJlYWQodG8sIGVuZCAtIHRvKTsKKyAgICAgIGlmICghZ290KSB7CisgICAgICAgIC8vIEVPRgorICAgICAgICBibG9jay0+U2V0VmFsaWRTaXplKHRvIC0gYmVnaW4pOworICAgICAgICArK2Jsb2NrOworICAgICAgICBibG9jay5Qb2lzb24oKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdG8gKz0gZ290OworICAgIH0KKworICAgIC8vIEZpbmQgdGhlIGxhc3QgbmV3bGluZS4KKyAgICBjaGFyICpuZXdsaW5lOworICAgIGZvciAobmV3bGluZSA9IHRvIC0gMTsgOyAtLW5ld2xpbmUpIHsKKyAgICAgIFVUSUxfVEhST1dfSUYobmV3bGluZSA8IGJlZ2luLCBFeGNlcHRpb24sICJEaWQgbm90IGZpbmQgYSBuZXdsaW5lIGluICIgPDwgcG9zaXRpb24uR2V0Q2hhaW4oKS5CbG9ja1NpemUoKSA8PCAiIGJ5dGVzIG9mIGlucHV0IG9mICIgPDwgTmFtZUZyb21GRChmZF8pIDw8ICIuICBJcyB0aGlzIGEgdGV4dCBmaWxlPyIpOworICAgICAgaWYgKCpuZXdsaW5lID09ICdcbicpIGJyZWFrOworICAgIH0KKworICAgIC8vIENvcHkgZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdCBuZXdsaW5lIHRvIHRoZSBjYXJyeS4KKyAgICBjYXJyeS5jbGVhcigpOworICAgIGNhcnJ5LnJlc2l6ZSh0byAtIChuZXdsaW5lICsgMSkpOworICAgIHN0ZDo6Y29weShuZXdsaW5lICsgMSwgdG8sICYqY2FycnkuYmVnaW4oKSk7CisKKyAgICBibG9jay0+U2V0VmFsaWRTaXplKG5ld2xpbmUgKyAxIC0gYmVnaW4pOworICB9Cit9CisKK319IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9saW5lX2lucHV0LmhoIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL2xpbmVfaW5wdXQuaGgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3N0cmVhbS9saW5lX2lucHV0LmhoCnJlbmFtZSB0byBzcmMva2VubG0vdXRpbC9zdHJlYW0vbGluZV9pbnB1dC5oaApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL211bHRpX3Byb2dyZXNzLmNjIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL211bHRpX3Byb2dyZXNzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzUwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vbXVsdGlfcHJvZ3Jlc3MuY2MKQEAgLTAsMCArMSw4NiBAQAorI2luY2x1ZGUgInV0aWwvc3RyZWFtL211bHRpX3Byb2dyZXNzLmhoIgorCisvLyBUT0RPOiBtZXJnZSBzb21lIGZ1bmN0aW9uYWxpdHkgd2l0aCB0aGUgc2ltcGxlIHByb2dyZXNzIGJhcj8KKyNpbmNsdWRlICJ1dGlsL2Vyc2F0el9wcm9ncmVzcy5oaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU42NCkKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0geworCituYW1lc3BhY2UgeworY29uc3QgY2hhciBrRGlzcGxheUNoYXJhY3RlcnNbXSA9ICItKyojMDEyMzQ1Njc4OSI7CisKK3VpbnQ2NF90IE5leHQodW5zaWduZWQgY2hhciBzdG9uZSwgdWludDY0X3QgY29tcGxldGUpIHsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RvbmUgKyAxKSAqIGNvbXBsZXRlICsgTXVsdGlQcm9ncmVzczo6a1dpZHRoIC0gMSkgLyBNdWx0aVByb2dyZXNzOjprV2lkdGg7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKK011bHRpUHJvZ3Jlc3M6Ok11bHRpUHJvZ3Jlc3MoKSA6IGFjdGl2ZV8oZmFsc2UpLCBjb21wbGV0ZV8oc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpKSwgY2hhcmFjdGVyX2hhbmRvdXRfKDApIHt9CisKK011bHRpUHJvZ3Jlc3M6On5NdWx0aVByb2dyZXNzKCkgeworICBpZiAoYWN0aXZlXyAmJiBjb21wbGV0ZV8gIT0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpKQorICAgIHN0ZDo6Y2VyciA8PCAnXG4nOworfQorCit2b2lkIE11bHRpUHJvZ3Jlc3M6OkFjdGl2YXRlKCkgeworICBhY3RpdmVfID0KKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU42NCkKKyAgICAvLyBJcyBzdGRlcnIgYSB0ZXJtaW5hbD8KKyAgICAoaXNhdHR5KDIpID09IDEpCisjZWxzZQorICAgIHRydWUKKyNlbmRpZgorICAgIDsKK30KKwordm9pZCBNdWx0aVByb2dyZXNzOjpTZXRUYXJnZXQodWludDY0X3QgY29tcGxldGUpIHsKKyAgaWYgKCFhY3RpdmVfKSByZXR1cm47CisgIGNvbXBsZXRlXyA9IGNvbXBsZXRlOworICBpZiAoIWNvbXBsZXRlKSBjb21wbGV0ZV8gPSAxOworICBtZW1zZXQoZGlzcGxheV8sIDAsIHNpemVvZihkaXNwbGF5XykpOworICBjaGFyYWN0ZXJfaGFuZG91dF8gPSAwOworICBzdGQ6OmNlcnIgPDwga1Byb2dyZXNzQmFubmVyOworfQorCitXb3JrZXJQcm9ncmVzcyBNdWx0aVByb2dyZXNzOjpBZGQoKSB7CisgIGlmICghYWN0aXZlXykKKyAgICByZXR1cm4gV29ya2VyUHJvZ3Jlc3Moc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpLCAqdGhpcywgJ1wwJyk7CisgIHN0ZDo6c2l6ZV90IGNoYXJhY3Rlcl9pbmRleDsKKyAgeworICAgIGJvb3N0Ojp1bmlxdWVfbG9jazxib29zdDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKKyAgICBjaGFyYWN0ZXJfaW5kZXggPSBjaGFyYWN0ZXJfaGFuZG91dF8rKzsKKyAgICBpZiAoY2hhcmFjdGVyX2hhbmRvdXRfID09IHNpemVvZihrRGlzcGxheUNoYXJhY3RlcnMpIC0gMSkKKyAgICAgIGNoYXJhY3Rlcl9oYW5kb3V0XyA9IDA7CisgIH0KKyAgcmV0dXJuIFdvcmtlclByb2dyZXNzKE5leHQoMCwgY29tcGxldGVfKSwgKnRoaXMsIGtEaXNwbGF5Q2hhcmFjdGVyc1tjaGFyYWN0ZXJfaW5kZXhdKTsKK30KKwordm9pZCBNdWx0aVByb2dyZXNzOjpGaW5pc2hlZCgpIHsKKyAgaWYgKCFhY3RpdmVfIHx8IGNvbXBsZXRlXyA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpIHJldHVybjsKKyAgc3RkOjpjZXJyIDw8ICdcbic7CisgIGNvbXBsZXRlXyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKTsKK30KKwordm9pZCBNdWx0aVByb2dyZXNzOjpNaWxlc3RvbmUoV29ya2VyUHJvZ3Jlc3MgJndvcmtlcikgeworICBpZiAoIWFjdGl2ZV8gfHwgY29tcGxldGVfID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSkgcmV0dXJuOworICB1bnNpZ25lZCBjaGFyIHN0b25lID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGtXaWR0aCksIHdvcmtlci5jdXJyZW50XyAqIGtXaWR0aCAvIGNvbXBsZXRlXyk7CisgIGZvciAoY2hhciAqaSA9ICZkaXNwbGF5X1t3b3JrZXIuc3RvbmVfXTsgaSA8ICZkaXNwbGF5X1tzdG9uZV07ICsraSkgeworICAgICppID0gd29ya2VyLmNoYXJhY3Rlcl87CisgIH0KKyAgd29ya2VyLm5leHRfID0gTmV4dChzdG9uZSwgY29tcGxldGVfKTsKKyAgd29ya2VyLnN0b25lXyA9IHN0b25lOworICB7CisgICAgYm9vc3Q6OnVuaXF1ZV9sb2NrPGJvb3N0OjptdXRleD4gbG9jayhtdXRleF8pOworICAgIHN0ZDo6Y2VyciA8PCAnXHInIDw8IGRpc3BsYXlfIDw8IHN0ZDo6Zmx1c2g7CisgIH0KK30KKworfX0gLy8gbmFtZXNwYWNlcwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL211bHRpX3Byb2dyZXNzLmhoIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL211bHRpX3Byb2dyZXNzLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTY0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vbXVsdGlfcHJvZ3Jlc3MuaGgKQEAgLTAsMCArMSw4OSBAQAorLyogUHJvZ3Jlc3MgYmFyIHN1aXRhYmxlIGZvciBjaGFpbnMgb2Ygd29ya2VycyAqLworI2lmbmRlZiBVVElMX1NUUkVBTV9NVUxUSV9QUk9HUkVTU19ICisjZGVmaW5lIFVUSUxfU1RSRUFNX01VTFRJX1BST0dSRVNTX0gKKworI2luY2x1ZGUgPGJvb3N0L3RocmVhZC9tdXRleC5ocHA+CisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSBzdHJlYW0geworCitjbGFzcyBXb3JrZXJQcm9ncmVzczsKKworY2xhc3MgTXVsdGlQcm9ncmVzcyB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrV2lkdGggPSAxMDA7CisKKyAgICBNdWx0aVByb2dyZXNzKCk7CisKKyAgICB+TXVsdGlQcm9ncmVzcygpOworCisgICAgLy8gVHVybnMgb24gc2hvd2luZyAocmVxdWlyZXMgU2V0VGFyZ2V0IHRvbykuCisgICAgdm9pZCBBY3RpdmF0ZSgpOworCisgICAgdm9pZCBTZXRUYXJnZXQodWludDY0X3QgY29tcGxldGUpOworCisgICAgV29ya2VyUHJvZ3Jlc3MgQWRkKCk7CisKKyAgICB2b2lkIEZpbmlzaGVkKCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgV29ya2VyUHJvZ3Jlc3M7CisgICAgdm9pZCBNaWxlc3RvbmUoV29ya2VyUHJvZ3Jlc3MgJndvcmtlcik7CisKKyAgICBib29sIGFjdGl2ZV87CisKKyAgICB1aW50NjRfdCBjb21wbGV0ZV87CisKKyAgICBib29zdDo6bXV0ZXggbXV0ZXhfOworCisgICAgLy8gXDAgYXQgdGhlIGVuZC4KKyAgICBjaGFyIGRpc3BsYXlfW2tXaWR0aCArIDFdOworCisgICAgc3RkOjpzaXplX3QgY2hhcmFjdGVyX2hhbmRvdXRfOworCisgICAgTXVsdGlQcm9ncmVzcyhjb25zdCBNdWx0aVByb2dyZXNzICYpOworICAgIE11bHRpUHJvZ3Jlc3MgJm9wZXJhdG9yPShjb25zdCBNdWx0aVByb2dyZXNzICYpOworfTsKKworY2xhc3MgV29ya2VyUHJvZ3Jlc3MgeworICBwdWJsaWM6CisgICAgLy8gRGVmYXVsdCBjb250cnV0b3IgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIG9wZXJhdG9yPSBsYXRlci4KKyAgICBXb3JrZXJQcm9ncmVzcygpIDogcGFyZW50XyhOVUxMKSB7fQorCisgICAgLy8gTm90IHRocmVhZHNhZmUgZm9yIHRoZSBzYW1lIHdvcmtlciBieSBkZWZhdWx0LgorICAgIFdvcmtlclByb2dyZXNzICZvcGVyYXRvcisrKCkgeworICAgICAgaWYgKCsrY3VycmVudF8gPj0gbmV4dF8pIHsKKyAgICAgICAgcGFyZW50Xy0+TWlsZXN0b25lKCp0aGlzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBXb3JrZXJQcm9ncmVzcyAmb3BlcmF0b3IrPSh1aW50NjRfdCBhbW91bnQpIHsKKyAgICAgIGN1cnJlbnRfICs9IGFtb3VudDsKKyAgICAgIGlmIChjdXJyZW50XyA+PSBuZXh0XykgeworICAgICAgICBwYXJlbnRfLT5NaWxlc3RvbmUoKnRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBNdWx0aVByb2dyZXNzOworICAgIFdvcmtlclByb2dyZXNzKHVpbnQ2NF90IG5leHQsIE11bHRpUHJvZ3Jlc3MgJnBhcmVudCwgY2hhciBjaGFyYWN0ZXIpCisgICAgICA6IGN1cnJlbnRfKDApLCBuZXh0XyhuZXh0KSwgcGFyZW50XygmcGFyZW50KSwgc3RvbmVfKDApLCBjaGFyYWN0ZXJfKGNoYXJhY3Rlcikge30KKworICAgIHVpbnQ2NF90IGN1cnJlbnRfLCBuZXh0XzsKKworICAgIE11bHRpUHJvZ3Jlc3MgKnBhcmVudF87CisKKyAgICAvLyBQcmV2aW91cyBtaWxlc3RvbmUgcmVhY2hlZC4KKyAgICB1bnNpZ25lZCBjaGFyIHN0b25lXzsKKworICAgIC8vIENoYXJhY3RlciB0byBkaXNwbGF5IGluIGJhci4KKyAgICBjaGFyIGNoYXJhY3Rlcl87Cit9OworCit9fSAvLyBuYW1lc3BhY2VzCisKKyNlbmRpZiAvLyBVVElMX1NUUkVBTV9NVUxUSV9QUk9HUkVTU19ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9zdHJlYW0vbXVsdGlfc3RyZWFtLmhoIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL211bHRpX3N0cmVhbS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzgxZmMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL211bHRpX3N0cmVhbS5oaApAQCAtMCwwICsxLDEyNCBAQAorI2lmbmRlZiBVVElMX1NUUkVBTV9NVUxUSV9TVFJFQU1fSAorI2RlZmluZSBVVElMX1NUUkVBTV9NVUxUSV9TVFJFQU1fSAorCisjaW5jbHVkZSAidXRpbC9maXhlZF9hcnJheS5oaCIKKyNpbmNsdWRlICJ1dGlsL3Njb3BlZC5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9jaGFpbi5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9zdHJlYW0uaGgiCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPG5ldz4KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworbmFtZXNwYWNlIHV0aWwgeyBuYW1lc3BhY2Ugc3RyZWFtIHsKKworY2xhc3MgQ2hhaW5zOworCitjbGFzcyBDaGFpblBvc2l0aW9ucyA6IHB1YmxpYyB1dGlsOjpGaXhlZEFycmF5PHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbj4geworICBwdWJsaWM6CisgICAgQ2hhaW5Qb3NpdGlvbnMoKSB7fQorCisgICAgZXhwbGljaXQgQ2hhaW5Qb3NpdGlvbnMoc3RkOjpzaXplX3QgYm91bmQpIDoKKyAgICAgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uPihib3VuZCkge30KKworICAgIHZvaWQgSW5pdChDaGFpbnMgJmNoYWlucyk7CisKKyAgICBleHBsaWNpdCBDaGFpblBvc2l0aW9ucyhDaGFpbnMgJmNoYWlucykgeworICAgICAgSW5pdChjaGFpbnMpOworICAgIH0KK307CisKK2NsYXNzIENoYWlucyA6IHB1YmxpYyB1dGlsOjpGaXhlZEFycmF5PHV0aWw6OnN0cmVhbTo6Q2hhaW4+IHsKKyAgcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgdm9pZCAoVDo6KnB0cikoY29uc3QgQ2hhaW5Qb3NpdGlvbnMgJikgPSAmVDo6UnVuPiBzdHJ1Y3QgQ2hlY2tGb3JSdW4geworICAgICAgdHlwZWRlZiBDaGFpbnMgdHlwZTsKKyAgICB9OworCisgIHB1YmxpYzoKKyAgICAvLyBNdXN0IGNhbGwgSW5pdC4KKyAgICBDaGFpbnMoKSB7fQorCisgICAgZXhwbGljaXQgQ2hhaW5zKHN0ZDo6c2l6ZV90IGxpbWl0KSA6IHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpbj4obGltaXQpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgV29ya2VyPiB0eXBlbmFtZSBDaGVja0ZvclJ1bjxXb3JrZXI+Ojp0eXBlICZvcGVyYXRvcj4+KGNvbnN0IFdvcmtlciAmd29ya2VyKSB7CisgICAgICB0aHJlYWRzXy5wdXNoX2JhY2sobmV3IHV0aWw6OnN0cmVhbTo6VGhyZWFkKENoYWluUG9zaXRpb25zKCp0aGlzKSwgd29ya2VyKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIFdvcmtlcj4gdHlwZW5hbWUgQ2hlY2tGb3JSdW48V29ya2VyPjo6dHlwZSAmb3BlcmF0b3I+Pihjb25zdCBib29zdDo6cmVmZXJlbmNlX3dyYXBwZXI8V29ya2VyPiAmd29ya2VyKSB7CisgICAgICB0aHJlYWRzXy5wdXNoX2JhY2sobmV3IHV0aWw6OnN0cmVhbTo6VGhyZWFkKENoYWluUG9zaXRpb25zKCp0aGlzKSwgd29ya2VyKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2hhaW5zICZvcGVyYXRvcj4+KGNvbnN0IHV0aWw6OnN0cmVhbTo6UmVjeWNsZXIgJnJlY3ljbGVyKSB7CisgICAgICBmb3IgKHV0aWw6OnN0cmVhbTo6Q2hhaW4gKmkgPSBiZWdpbigpOyBpICE9IGVuZCgpOyArK2kpCisgICAgICAgICppID4+IHJlY3ljbGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQgV2FpdChib29sIHJlbGVhc2VfbWVtb3J5ID0gdHJ1ZSkgeworICAgICAgdGhyZWFkc18uY2xlYXIoKTsKKyAgICAgIGZvciAodXRpbDo6c3RyZWFtOjpDaGFpbiAqaSA9IGJlZ2luKCk7IGkgIT0gZW5kKCk7ICsraSkgeworICAgICAgICBpLT5XYWl0KHJlbGVhc2VfbWVtb3J5KTsKKyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBib29zdDo6cHRyX3ZlY3Rvcjx1dGlsOjpzdHJlYW06OlRocmVhZD4gdGhyZWFkc187CisKKyAgICBDaGFpbnMoY29uc3QgQ2hhaW5zICYpOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENoYWlucyAmKTsKK307CisKK2lubGluZSB2b2lkIENoYWluUG9zaXRpb25zOjpJbml0KENoYWlucyAmY2hhaW5zKSB7CisgIHV0aWw6OkZpeGVkQXJyYXk8dXRpbDo6c3RyZWFtOjpDaGFpblBvc2l0aW9uPjo6SW5pdChjaGFpbnMuc2l6ZSgpKTsKKyAgZm9yICh1dGlsOjpzdHJlYW06OkNoYWluICppID0gY2hhaW5zLmJlZ2luKCk7IGkgIT0gY2hhaW5zLmVuZCgpOyArK2kpIHsKKyAgICAvLyB1c2UgInBsYWNlbWVudCBuZXciIHN5bnRheCB0byBpbml0YWxpemUgQ2hhaW5Qb3NpdGlvbiBpbiBhbiBhbHJlYWR5LWFsbG9jYXRlZCBtZW1vcnkgbG9jYXRpb24KKyAgICBuZXcgKGVuZCgpKSB1dGlsOjpzdHJlYW06OkNoYWluUG9zaXRpb24oaS0+QWRkKCkpOyBDb25zdHJ1Y3RlZCgpOworICB9Cit9CisKK2lubGluZSBDaGFpbnMgJm9wZXJhdG9yPj4oQ2hhaW5zICZjaGFpbnMsIENoYWluUG9zaXRpb25zICZwb3NpdGlvbnMpIHsKKyAgcG9zaXRpb25zLkluaXQoY2hhaW5zKTsKKyAgcmV0dXJuIGNoYWluczsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIEdlbmVyaWNTdHJlYW1zIDogcHVibGljIHV0aWw6OkZpeGVkQXJyYXk8VD4geworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdXRpbDo6Rml4ZWRBcnJheTxUPiBQOworICBwdWJsaWM6CisgICAgR2VuZXJpY1N0cmVhbXMoKSB7fQorCisgICAgLy8gTGltaXQgcmVzdHJpY3RzIHRvIHBvc2l0aW9uc1swLGxpbWl0KQorICAgIHZvaWQgSW5pdChjb25zdCBDaGFpblBvc2l0aW9ucyAmcG9zaXRpb25zLCBzdGQ6OnNpemVfdCBsaW1pdCkgeworICAgICAgUDo6SW5pdChsaW1pdCk7CisgICAgICBmb3IgKGNvbnN0IHV0aWw6OnN0cmVhbTo6Q2hhaW5Qb3NpdGlvbiAqaSA9IHBvc2l0aW9ucy5iZWdpbigpOyBpICE9IHBvc2l0aW9ucy5iZWdpbigpICsgbGltaXQ7ICsraSkgeworICAgICAgICBQOjpwdXNoX2JhY2soKmkpOworICAgICAgfQorICAgIH0KKyAgICB2b2lkIEluaXQoY29uc3QgQ2hhaW5Qb3NpdGlvbnMgJnBvc2l0aW9ucykgeworICAgICAgSW5pdChwb3NpdGlvbnMsIHBvc2l0aW9ucy5zaXplKCkpOworICAgIH0KKworICAgIEdlbmVyaWNTdHJlYW1zKGNvbnN0IENoYWluUG9zaXRpb25zICZwb3NpdGlvbnMpIHsKKyAgICAgIEluaXQocG9zaXRpb25zKTsKKyAgICB9CisKKyAgICB2b2lkIEluaXQoc3RkOjpzaXplX3QgYW1vdW50KSB7CisgICAgICBQOjpJbml0KGFtb3VudCk7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBDaGFpbnMgJm9wZXJhdG9yPj4oQ2hhaW5zICZjaGFpbnMsIEdlbmVyaWNTdHJlYW1zPFQ+ICZzdHJlYW1zKSB7CisgIENoYWluUG9zaXRpb25zIHBvc2l0aW9uczsKKyAgY2hhaW5zID4+IHBvc2l0aW9uczsKKyAgc3RyZWFtcy5Jbml0KHBvc2l0aW9ucyk7CisgIHJldHVybiBjaGFpbnM7Cit9CisKK3R5cGVkZWYgR2VuZXJpY1N0cmVhbXM8U3RyZWFtPiBTdHJlYW1zOworCit9fSAvLyBuYW1lc3BhY2VzCisjZW5kaWYgLy8gVVRJTF9TVFJFQU1fTVVMVElfU1RSRUFNX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9yZXdpbmRhYmxlX3N0cmVhbS5jYyBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9yZXdpbmRhYmxlX3N0cmVhbS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjZlMmE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL3Jld2luZGFibGVfc3RyZWFtLmNjCkBAIC0wLDAgKzEsMTM0IEBACisjaW5jbHVkZSAidXRpbC9zdHJlYW0vcmV3aW5kYWJsZV9zdHJlYW0uaGgiCisjaW5jbHVkZSAidXRpbC9wY3F1ZXVlLmhoIgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBzdHJlYW0geworCitSZXdpbmRhYmxlU3RyZWFtOjpSZXdpbmRhYmxlU3RyZWFtKCkKKyAgICA6IGN1cnJlbnRfKE5VTEwpLCBpbl8oTlVMTCksIG91dF8oTlVMTCksIHBvaXNvbmVkXyh0cnVlKSB7CisgIC8vIG5vdGhpbmcKK30KKwordm9pZCBSZXdpbmRhYmxlU3RyZWFtOjpJbml0KGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7CisgIFVUSUxfVEhST1dfSUYyKGluXywgIlJld2luZGFibGVTdHJlYW06OkluaXQgdHdpY2UiKTsKKyAgaW5fID0gcG9zaXRpb24uaW5fOworICBvdXRfID0gcG9zaXRpb24ub3V0XzsKKyAgaGl0X3BvaXNvbl8gPSBmYWxzZTsKKyAgcG9pc29uZWRfID0gZmFsc2U7CisgIHByb2dyZXNzXyA9IHBvc2l0aW9uLnByb2dyZXNzXzsKKyAgZW50cnlfc2l6ZV8gPSBwb3NpdGlvbi5HZXRDaGFpbigpLkVudHJ5U2l6ZSgpOworICBibG9ja19zaXplXyA9IHBvc2l0aW9uLkdldENoYWluKCkuQmxvY2tTaXplKCk7CisgIGJsb2NrX2NvdW50XyA9IHBvc2l0aW9uLkdldENoYWluKCkuQmxvY2tDb3VudCgpOworICBibG9ja3NfaXRfID0gMDsKKyAgbWFya2VkXyA9IE5VTEw7CisgIFVUSUxfVEhST1dfSUYyKGJsb2NrX2NvdW50XyA8IDIsICJSZXdpbmRhYmxlU3RyZWFtIG5lZWRzIGJsb2NrX2NvdW50IGF0IGxlYXN0IHR3byIpOworICBBcHBlbmRCbG9jaygpOworfQorCitSZXdpbmRhYmxlU3RyZWFtICZSZXdpbmRhYmxlU3RyZWFtOjpvcGVyYXRvcisrKCkgeworICBhc3NlcnQoKnRoaXMpOworICBhc3NlcnQoY3VycmVudF8gPCBibG9ja19lbmRfKTsKKyAgYXNzZXJ0KGN1cnJlbnRfKTsKKyAgYXNzZXJ0KGJsb2Nrc19pdF8gPCBibG9ja3NfLnNpemUoKSk7CisgIGN1cnJlbnRfICs9IGVudHJ5X3NpemVfOworICBpZiAoVVRJTF9VTkxJS0VMWShjdXJyZW50XyA9PSBibG9ja19lbmRfKSkgeworICAgIC8vIEZldGNoIGFub3RoZXIgYmxvY2sgaWYgbmVjZXNzYXJ5LgorICAgIGlmICgrK2Jsb2Nrc19pdF8gPT0gYmxvY2tzXy5zaXplKCkpIHsKKyAgICAgIGlmICghbWFya2VkXykgeworICAgICAgICBGbHVzaChibG9ja3NfLmJlZ2luKCkgKyBibG9ja3NfaXRfKTsKKyAgICAgICAgYmxvY2tzX2l0XyA9IDA7CisgICAgICB9CisgICAgICBBcHBlbmRCbG9jaygpOworICAgICAgYXNzZXJ0KHBvaXNvbmVkXyB8fCAoYmxvY2tzX2l0XyA9PSBibG9ja3NfLnNpemUoKSAtIDEpKTsKKyAgICAgIGlmIChwb2lzb25lZF8pIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgQmxvY2sgJmN1cl9ibG9jayA9IGJsb2Nrc19bYmxvY2tzX2l0X107CisgICAgY3VycmVudF8gPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oY3VyX2Jsb2NrLkdldCgpKTsKKyAgICBibG9ja19lbmRfID0gY3VycmVudF8gKyBjdXJfYmxvY2suVmFsaWRTaXplKCk7CisgIH0KKyAgYXNzZXJ0KGN1cnJlbnRfKTsKKyAgYXNzZXJ0KGN1cnJlbnRfID49IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihibG9ja3NfW2Jsb2Nrc19pdF9dLkdldCgpKSk7CisgIGFzc2VydChjdXJyZW50XyA8IGJsb2NrX2VuZF8pOworICBhc3NlcnQoYmxvY2tfZW5kXyA9PSBibG9ja3NfW2Jsb2Nrc19pdF9dLlZhbGlkRW5kKCkpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3ZvaWQgUmV3aW5kYWJsZVN0cmVhbTo6TWFyaygpIHsKKyAgbWFya2VkXyA9IGN1cnJlbnRfOworICBGbHVzaChibG9ja3NfLmJlZ2luKCkgKyBibG9ja3NfaXRfKTsKKyAgYmxvY2tzX2l0XyA9IDA7Cit9CisKK3ZvaWQgUmV3aW5kYWJsZVN0cmVhbTo6UmV3aW5kKCkgeworICBpZiAoY3VycmVudF8gIT0gbWFya2VkXykgeworICAgIHBvaXNvbmVkXyA9IGZhbHNlOworICB9CisgIGJsb2Nrc19pdF8gPSAwOworICBjdXJyZW50XyA9IG1hcmtlZF87CisgIGJsb2NrX2VuZF8gPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYmxvY2tzX1tibG9ja3NfaXRfXS5WYWxpZEVuZCgpKTsKKworICBhc3NlcnQoY3VycmVudF8pOworICBhc3NlcnQoY3VycmVudF8gPj0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJsb2Nrc19bYmxvY2tzX2l0X10uR2V0KCkpKTsKKyAgYXNzZXJ0KGN1cnJlbnRfIDwgYmxvY2tfZW5kXyk7CisgIGFzc2VydChibG9ja19lbmRfID09IGJsb2Nrc19bYmxvY2tzX2l0X10uVmFsaWRFbmQoKSk7Cit9CisKK3ZvaWQgUmV3aW5kYWJsZVN0cmVhbTo6UG9pc29uKCkgeworICBpZiAoYmxvY2tzXy5lbXB0eSgpKSByZXR1cm47CisgIGFzc2VydCgqdGhpcyk7CisgIGFzc2VydChibG9ja3NfaXRfID09IGJsb2Nrc18uc2l6ZSgpIC0gMSk7CisKKyAgLy8gUHJvZHVjZSBhbGwgYnVmZmVyZWQgYmxvY2tzLgorICBibG9ja3NfLmJhY2soKS5TZXRWYWxpZFNpemUoY3VycmVudF8gLSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYmxvY2tzXy5iYWNrKCkuR2V0KCkpKTsKKyAgRmx1c2goYmxvY2tzXy5lbmQoKSk7CisgIGJsb2Nrc19pdF8gPSAwOworCisgIEJsb2NrIHBvaXNvbjsKKyAgaWYgKCFoaXRfcG9pc29uXykgeworICAgIGluXy0+Q29uc3VtZShwb2lzb24pOworICB9CisgIHBvaXNvbi5TZXRUb1BvaXNvbigpOworICBvdXRfLT5Qcm9kdWNlKHBvaXNvbik7CisgIGhpdF9wb2lzb25fID0gdHJ1ZTsKKyAgcG9pc29uZWRfID0gdHJ1ZTsKK30KKwordm9pZCBSZXdpbmRhYmxlU3RyZWFtOjpBcHBlbmRCbG9jaygpIHsKKyAgaWYgKFVUSUxfVU5MSUtFTFkoYmxvY2tzXy5zaXplKCkgPj0gYmxvY2tfY291bnRfKSkgeworICAgIHN0ZDo6Y2VyciA8PCAiUmV3aW5kYWJsZVN0cmVhbSB0cnlpbmcgdG8gdXNlIG1vcmUgYmxvY2tzIHRoYW4gYXZhaWxhYmxlIiA8PCBzdGQ6OmVuZGw7CisgICAgYWJvcnQoKTsKKyAgfQorICBpZiAoVVRJTF9VTkxJS0VMWShoaXRfcG9pc29uXykpIHsKKyAgICBwb2lzb25lZF8gPSB0cnVlOworICAgIHJldHVybjsKKyAgfQorICBCbG9jayBnZXQ7CisgIC8vIFRoZSBsb29wIGlzIG5lZWRlZCBzaW5jZSBpdCBpcyAqZmVhc2libGUqIHRoYXQgd2UncmUgZ2l2ZW4gMCBzaXplZCBidXQKKyAgLy8gdmFsaWQgYmxvY2tzCisgIGRvIHsKKyAgICBpbl8tPkNvbnN1bWUoZ2V0KTsKKyAgICBpZiAoVVRJTF9MSUtFTFkoZ2V0KSkgeworICAgICAgYmxvY2tzXy5wdXNoX2JhY2soZ2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgaGl0X3BvaXNvbl8gPSB0cnVlOworICAgICAgcG9pc29uZWRfID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gd2hpbGUgKFVUSUxfVU5MSUtFTFkoZ2V0LlZhbGlkU2l6ZSgpID09IDApKTsKKyAgY3VycmVudF8gPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYmxvY2tzXy5iYWNrKCkuR2V0KCkpOworICBibG9ja19lbmRfID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJsb2Nrc18uYmFjaygpLlZhbGlkRW5kKCkpOworICBibG9ja3NfaXRfID0gYmxvY2tzXy5zaXplKCkgLSAxOworfQorCit2b2lkIFJld2luZGFibGVTdHJlYW06OkZsdXNoKHN0ZDo6ZGVxdWU8QmxvY2s+OjppdGVyYXRvciB0bykgeworICBmb3IgKHN0ZDo6ZGVxdWU8QmxvY2s+OjppdGVyYXRvciBpID0gYmxvY2tzXy5iZWdpbigpOyBpICE9IHRvOyArK2kpIHsKKyAgICBvdXRfLT5Qcm9kdWNlKCppKTsKKyAgICBwcm9ncmVzc18gKz0gaS0+VmFsaWRTaXplKCk7CisgIH0KKyAgYmxvY2tzXy5lcmFzZShibG9ja3NfLmJlZ2luKCksIHRvKTsKK30KKworfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL3Jld2luZGFibGVfc3RyZWFtLmhoIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL3Jld2luZGFibGVfc3RyZWFtLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDgyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vcmV3aW5kYWJsZV9zdHJlYW0uaGgKQEAgLTAsMCArMSwxMzIgQEAKKyNpZm5kZWYgVVRJTF9TVFJFQU1fUkVXSU5EQUJMRV9TVFJFQU1fSAorI2RlZmluZSBVVElMX1NUUkVBTV9SRVdJTkRBQkxFX1NUUkVBTV9ICisKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9jaGFpbi5oaCIKKworI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKworI2luY2x1ZGUgPGRlcXVlPgorCituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2Ugc3RyZWFtIHsKKworLyoqCisgKiBBIFJld2luZGFibGVTdHJlYW0gaXMgbGlrZSBhIFN0cmVhbSAoYnV0IG9uZSB0aGF0IGlzIG9ubHkgdXNlZCBmb3IKKyAqIGNyZWF0aW5nIGlucHV0IGF0IHRoZSBzdGFydCBvZiBhIGNoYWluKSBleGNlcHQgdGhhdCBpdCBjYW4gYmUgcmV3b3VuZCB0bworICogYmUgYWJsZSB0byByZS13cml0ZSBhIHBhcnQgb2YgdGhlIHN0cmVhbSBiZWZvcmUgaXQgaXMgc2VudC4gUmV3aW5kaW5nCisgKiBoYXMgYSBsaW1pdCBvZiAyICogYmxvY2tfc2l6ZV8gLSAxIGluIGRpc3RhbmNlIChpdCBkb2VzICpub3QqIGJ1ZmZlciBhbgorICogZW50aXJlIHN0cmVhbSBpbnRvIG1lbW9yeSwgb25seSBhIG1heGltdW0gb2YgMiAqIGJsb2NrX3NpemVfKS4KKyAqLworY2xhc3MgUmV3aW5kYWJsZVN0cmVhbSA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgUmV3aW5kYWJsZVN0cmVhbS4gWW91ICoqbXVzdCoqIGNhbGwgSW5pdCgpCisgICAgICogb24gaXQgbGF0ZXIhCisgICAgICovCisgICAgUmV3aW5kYWJsZVN0cmVhbSgpOworCisgICAgflJld2luZGFibGVTdHJlYW0oKSB7CisgICAgICBQb2lzb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhbiBleGlzdGluZyBSZXdpbmRhYmxlU3RyZWFtIGF0IGEgc3BlY2lmaWMgcG9zaXRpb24gaW4KKyAgICAgKiBhIENoYWluLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBpbiB0aGUgY2hhaW4gdG8gZ2V0IGlucHV0IGZyb20gYW5kCisgICAgICogIHByb2R1Y2Ugb3V0cHV0IG9uCisgICAgICovCisgICAgdm9pZCBJbml0KGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBSZXdpbmRhYmxlU3RyZWFtIGF0IGEgc3BlY2lmaWMgcG9zaXRpb24gaW4gYSBDaGFpbiBhbGwKKyAgICAgKiBpbiBvbmUgc3RlcC4KKyAgICAgKgorICAgICAqIEVxdWl2YWxlbnQgdG8gUmV3aW5kYWJsZVN0cmVhbSBhKCk7IGEuSW5pdCguLi4uKTsKKyAgICAgKi8KKyAgICBleHBsaWNpdCBSZXdpbmRhYmxlU3RyZWFtKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKQorICAgICAgOiBpbl8oTlVMTCkgeworICAgICAgSW5pdChwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcmVjb3JkIGF0IHRoZSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbi4gQ29uc3QgdmVyc2lvbi4KKyAgICAgKi8KKyAgICBjb25zdCB2b2lkICpHZXQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoIXBvaXNvbmVkXyk7CisgICAgICBhc3NlcnQoY3VycmVudF8pOworICAgICAgcmV0dXJuIGN1cnJlbnRfOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJlY29yZCBhdCB0aGUgY3VycmVudCBzdHJlYW0gcG9zaXRpb24uCisgICAgICovCisgICAgdm9pZCAqR2V0KCkgeworICAgICAgYXNzZXJ0KCFwb2lzb25lZF8pOworICAgICAgYXNzZXJ0KGN1cnJlbnRfKTsKKyAgICAgIHJldHVybiBjdXJyZW50XzsKKyAgICB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gIXBvaXNvbmVkXzsgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiBwb2lzb25lZF87IH0KKworICAgIC8qKgorICAgICAqIE1hcmtzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gdG8gYmUgcmV3b3VuZCB0byBsYXRlci4KKyAgICAgKiBOb3RlIHRoYXQgeW91IGNhbiBvbmx5IHJld2luZCBiYWNrIGFzIGZhciBhcyAyICogYmxvY2tfc2l6ZV8gLSAxIQorICAgICAqLworICAgIHZvaWQgTWFyaygpOworCisgICAgLyoqCisgICAgICogUmV3aW5kcyB0aGUgc3RyZWFtIGJhY2sgdG8gdGhlIG1hcmtlZCBwb3NpdGlvbi4gVGhpcyB3aWxsIHRocm93IGFuCisgICAgICogZXhjZXB0aW9uIGlmIHRoZSBtYXJrZWQgcG9zaXRpb24gaXMgdG9vIGZhciBhd2F5LgorICAgICAqLworICAgIHZvaWQgUmV3aW5kKCk7CisKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0aGUgc3RyZWFtIGZvcndhcmQgdG8gdGhlIG5leHQgcmVjb3JkLiBUaGlzIGludGVybmFsbHkgbWF5CisgICAgICogYnVmZmVyIGEgYmxvY2sgZm9yIHRoZSBwdXJwb3NlcyBvZiByZXdpbmRpbmcuCisgICAgICovCisgICAgUmV3aW5kYWJsZVN0cmVhbSYgb3BlcmF0b3IrKygpOworCisgICAgLyoqCisgICAgICogUG9pc29ucyB0aGUgc3RyZWFtLiBUaGlzIHNlbmRzIGFueSBidWZmZXJlZCBibG9ja3MgZG93biB0aGUgY2hhaW4KKyAgICAgKiBhbmQgc2VuZHMgYSBwb2lzb24gYmxvY2sgYXMgd2VsbCAoc2VuZGluZyBhdCBtb3N0IDIgbm9uLXBvaXNvbiBhbmQgMQorICAgICAqIHBvaXNvbiBibG9jaykuCisgICAgICovCisgICAgdm9pZCBQb2lzb24oKTsKKworICBwcml2YXRlOgorICAgIHZvaWQgQXBwZW5kQmxvY2soKTsKKworICAgIHZvaWQgRmx1c2goc3RkOjpkZXF1ZTxCbG9jaz46Oml0ZXJhdG9yIHRvKTsKKworICAgIHN0ZDo6ZGVxdWU8QmxvY2s+IGJsb2Nrc187CisgICAgLy8gY3VycmVudF8gaXMgaW4gYmxvY2tzX1tibG9ja3NfaXRfXSB1bmxlc3MgcG9pc29uZWRfLgorICAgIHN0ZDo6c2l6ZV90IGJsb2Nrc19pdF87CisKKyAgICBzdGQ6OnNpemVfdCBlbnRyeV9zaXplXzsKKyAgICBzdGQ6OnNpemVfdCBibG9ja19zaXplXzsKKyAgICBzdGQ6OnNpemVfdCBibG9ja19jb3VudF87CisKKyAgICB1aW50OF90ICptYXJrZWRfLCAqY3VycmVudF87CisgICAgY29uc3QgdWludDhfdCAqYmxvY2tfZW5kXzsKKworICAgIFBDUXVldWU8QmxvY2s+ICppbl8sICpvdXRfOworCisgICAgLy8gSGF2ZSB3ZSBoaXQgcG9pc29uIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgZXZlbiBpZiByZXdpbmRpbmc/CisgICAgYm9vbCBoaXRfcG9pc29uXzsKKyAgICAvLyBJcyB0aGUgY3VycmVuIHBvc2l0aW9uIHBvaXNvbj8KKyAgICBib29sIHBvaXNvbmVkXzsKKworICAgIFdvcmtlclByb2dyZXNzIHByb2dyZXNzXzsKK307CisKK2lubGluZSBDaGFpbiAmb3BlcmF0b3I+PihDaGFpbiAmY2hhaW4sIFJld2luZGFibGVTdHJlYW0gJnN0cmVhbSkgeworICBzdHJlYW0uSW5pdChjaGFpbi5BZGQoKSk7CisgIHJldHVybiBjaGFpbjsKK30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9zdHJlYW0vcmV3aW5kYWJsZV9zdHJlYW1fdGVzdC5jYyBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9yZXdpbmRhYmxlX3N0cmVhbV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OTI0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vcmV3aW5kYWJsZV9zdHJlYW1fdGVzdC5jYwpAQCAtMCwwICsxLDQxIEBACisjaW5jbHVkZSAidXRpbC9zdHJlYW0vaW8uaGgiCisKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9yZXdpbmRhYmxlX3N0cmVhbS5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpbGUuaGgiCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgUmV3aW5kYWJsZVN0cmVhbVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBzdHJlYW0geworbmFtZXNwYWNlIHsKKworQk9PU1RfQVVUT19URVNUX0NBU0UoUmV3aW5kYWJsZVN0cmVhbVRlc3QpIHsKKyAgc2NvcGVkX2ZkIGluKE1ha2VUZW1wKCJpb190ZXN0X3RlbXAiKSk7CisgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCAxMDAwMDA7ICsraSkgeworICAgIFdyaXRlT3JUaHJvdyhpbi5nZXQoKSwgJmksIHNpemVvZih1aW50NjRfdCkpOworICB9CisgIFNlZWtPclRocm93KGluLmdldCgpLCAwKTsKKworICBDaGFpbkNvbmZpZyBjb25maWc7CisgIGNvbmZpZy5lbnRyeV9zaXplID0gODsKKyAgY29uZmlnLnRvdGFsX21lbW9yeSA9IDEwMDsKKyAgY29uZmlnLmJsb2NrX2NvdW50ID0gNjsKKworICBDaGFpbiBjaGFpbihjb25maWcpOworICBSZXdpbmRhYmxlU3RyZWFtIHM7CisgIGNoYWluID4+IFJlYWQoaW4uZ2V0KCkpID4+IHMgPj4ga1JlY3ljbGU7CisgIHVpbnQ2NF90IGkgPSAwOworICBmb3IgKDsgczsgKytzLCArK2kpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChpLCAqc3RhdGljX2Nhc3Q8Y29uc3QgdWludDY0X3QqPihzLkdldCgpKSk7CisgICAgaWYgKDEwMDAwMFVMIC0gaSA9PSAyKQorICAgICAgcy5NYXJrKCk7CisgIH0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMTAwMDAwVUxMLCBpKTsKKyAgcy5SZXdpbmQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMTAwMDAwVUxMIC0gMiwgKnN0YXRpY19jYXN0PGNvbnN0IHVpbnQ2NF90Kj4ocy5HZXQoKSkpOworfQorCit9Cit9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VubG0vdXRpbC9zdHJlYW0vc29ydC5oaCBiL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9zb3J0LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNDgwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vc29ydC5oaApAQCAtMCwwICsxLDU5OSBAQAorLyogVXNhZ2U6CisgKiBTb3J0PENvbXBhcmU+IHNvcnRlcih0ZW1wLCBjb21wYXJlKTsKKyAqIENoYWluKGNvbmZpZykgPj4gUmVhZChmaWxlKSA+PiBzb3J0ZXIuVW5zb3J0ZWQoKTsKKyAqIFN0cmVhbSBzdHJlYW07CisgKiBDaGFpbiBjaGFpbihjb25maWcpID4+IHNvcnRlci5Tb3J0ZWQoaW50ZXJuYWxfY29uZmlnLCBsYXp5X2NvbmZpZykgPj4gc3RyZWFtOworICoKKyAqIE5vdGUgdGhhdCBzb3J0ZXIgbXVzdCBvdXRsaXZlIGFueSB0aHJlYWRzIHRoYXQgdXNlIFVuc29ydGVkIG9yIFNvcnRlZC4KKyAqCisgKiBDb21iaW5lcnMgdGFrZSB0aGUgZm9ybToKKyAqIGJvb2wgb3BlcmF0b3IoKSh2b2lkICppbnRvLCBjb25zdCB2b2lkICpvcHRpb24sIGNvbnN0IENvbXBhcmUgJmNvbXBhcmUpIGNvbnN0CisgKiB3aGljaCByZXR1cm5zIHRydWUgaWZmIGEgY29tYmluYXRpb24gaGFwcGVuZWQuICBUaGUgc29ydGluZyBhbGdvcml0aG0KKyAqIGd1YXJhbnRlZXMgY29tcGFyZShpbnRvLCBvcHRpb24pLiAgQnV0IGl0IGRvZXMgbm90IGd1YXJhbnRlZQorICogY29tcGFyZShvcHRpb24sIGludG8pLgorICogQ3VycmVudGx5LCBjb21iaW5pbmcgaXMgb25seSBkb25lIGluIG1lcmdlIHN0ZXBzLCBub3QgZHVyaW5nIG9uLXRoZS1mbHkKKyAqIHNvcnQuICBVc2UgYSBoYXNoIHRhYmxlIGZvciB0aGF0LgorICovCisKKyNpZm5kZWYgVVRJTF9TVFJFQU1fU09SVF9ICisjZGVmaW5lIFVUSUxfU1RSRUFNX1NPUlRfSAorCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY2hhaW4uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJlYW0vY29uZmlnLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL2lvLmhoIgorI2luY2x1ZGUgInV0aWwvc3RyZWFtL3N0cmVhbS5oaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS90aW1lci5oaCIKKworI2luY2x1ZGUgInV0aWwvZmlsZS5oaCIKKyNpbmNsdWRlICJ1dGlsL2ZpeGVkX2FycmF5LmhoIgorI2luY2x1ZGUgInV0aWwvc2NvcGVkLmhoIgorI2luY2x1ZGUgInV0aWwvc2l6ZWRfaXRlcmF0b3IuaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2Ugc3RyZWFtIHsKKworc3RydWN0IE5ldmVyQ29tYmluZSB7CisgIHRlbXBsYXRlIDxjbGFzcyBDb21wYXJlPiBib29sIG9wZXJhdG9yKCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIGNvbnN0IENvbXBhcmUgJikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8gTWFuYWdlIHRoZSBvZmZzZXRzIG9mIHNvcnRlZCBibG9ja3MgaW4gYSBmaWxlLgorY2xhc3MgT2Zmc2V0cyB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBPZmZzZXRzKGludCBmZCkgOiBsb2dfKGZkKSB7CisgICAgICBSZXNldCgpOworICAgIH0KKworICAgIGludCBGaWxlKCkgY29uc3QgeyByZXR1cm4gbG9nXzsgfQorCisgICAgdm9pZCBBcHBlbmQodWludDY0X3QgbGVuZ3RoKSB7CisgICAgICBpZiAoIWxlbmd0aCkgcmV0dXJuOworICAgICAgKytibG9ja19jb3VudF87CisgICAgICBpZiAobGVuZ3RoID09IGN1cl8ubGVuZ3RoKSB7CisgICAgICAgICsrY3VyXy5ydW47CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIFdyaXRlT3JUaHJvdyhsb2dfLCAmY3VyXywgc2l6ZW9mKEVudHJ5KSk7CisgICAgICBjdXJfLmxlbmd0aCA9IGxlbmd0aDsKKyAgICAgIGN1cl8ucnVuID0gMTsKKyAgICB9CisKKyAgICB2b2lkIEZpbmlzaGVkQXBwZW5kaW5nKCkgeworICAgICAgV3JpdGVPclRocm93KGxvZ18sICZjdXJfLCBzaXplb2YoRW50cnkpKTsKKyAgICAgIFNlZWtPclRocm93KGxvZ18sIHNpemVvZihFbnRyeSkpOyAvLyBTa2lwIDAsMCBhdCBiZWdpbm5pbmcuCisgICAgICBjdXJfLnJ1biA9IDA7CisgICAgICBpZiAoYmxvY2tfY291bnRfKSB7CisgICAgICAgIFJlYWRPclRocm93KGxvZ18sICZjdXJfLCBzaXplb2YoRW50cnkpKTsKKyAgICAgICAgYXNzZXJ0KGN1cl8ubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0KGN1cl8ucnVuKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB1aW50NjRfdCBSZW1haW5pbmdCbG9ja3MoKSBjb25zdCB7IHJldHVybiBibG9ja19jb3VudF87IH0KKworICAgIHVpbnQ2NF90IFRvdGFsT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gb3V0cHV0X3N1bV87IH0KKworICAgIHVpbnQ2NF90IFBlZWtTaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIGN1cl8ubGVuZ3RoOworICAgIH0KKworICAgIHVpbnQ2NF90IE5leHRTaXplKCkgeworICAgICAgYXNzZXJ0KGJsb2NrX2NvdW50Xyk7CisgICAgICB1aW50NjRfdCByZXQgPSBjdXJfLmxlbmd0aDsKKyAgICAgIG91dHB1dF9zdW1fICs9IHJldDsKKworICAgICAgLS1jdXJfLnJ1bjsKKyAgICAgIC0tYmxvY2tfY291bnRfOworICAgICAgaWYgKCFjdXJfLnJ1biAmJiBibG9ja19jb3VudF8pIHsKKyAgICAgICAgUmVhZE9yVGhyb3cobG9nXywgJmN1cl8sIHNpemVvZihFbnRyeSkpOworICAgICAgICBhc3NlcnQoY3VyXy5sZW5ndGgpOworICAgICAgICBhc3NlcnQoY3VyXy5ydW4pOworICAgICAgfQorICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICB2b2lkIFJlc2V0KCkgeworICAgICAgU2Vla09yVGhyb3cobG9nXywgMCk7CisgICAgICBSZXNpemVPclRocm93KGxvZ18sIDApOworICAgICAgY3VyXy5sZW5ndGggPSAwOworICAgICAgY3VyXy5ydW4gPSAwOworICAgICAgYmxvY2tfY291bnRfID0gMDsKKyAgICAgIG91dHB1dF9zdW1fID0gMDsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBpbnQgbG9nXzsKKworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICB1aW50NjRfdCBsZW5ndGg7CisgICAgICB1aW50NjRfdCBydW47CisgICAgfTsKKyAgICBFbnRyeSBjdXJfOworCisgICAgdWludDY0X3QgYmxvY2tfY291bnRfOworCisgICAgdWludDY0X3Qgb3V0cHV0X3N1bV87Cit9OworCisvLyBBIHByaW9yaXR5IHF1ZXVlIG9mIGVudHJpZXMgYmFja2VkIGJ5IGZpbGUgYnVmZmVycwordGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+IGNsYXNzIE1lcmdlUXVldWUgeworICBwdWJsaWM6CisgICAgTWVyZ2VRdWV1ZShpbnQgZmQsIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplLCBzdGQ6OnNpemVfdCBlbnRyeV9zaXplLCBjb25zdCBDb21wYXJlICZjb21wYXJlKQorICAgICAgOiBxdWV1ZV8oR3JlYXRlcihjb21wYXJlKSksIGluXyhmZCksIGJ1ZmZlcl9zaXplXyhidWZmZXJfc2l6ZSksIGVudHJ5X3NpemVfKGVudHJ5X3NpemUpIHt9CisKKyAgICB2b2lkIFB1c2godm9pZCAqYmFzZSwgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBhbW91bnQpIHsKKyAgICAgIHF1ZXVlXy5wdXNoKEVudHJ5KGJhc2UsIGluXywgb2Zmc2V0LCBhbW91bnQsIGJ1ZmZlcl9zaXplXykpOworICAgIH0KKworICAgIGNvbnN0IHZvaWQgKlRvcCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBxdWV1ZV8udG9wKCkuQ3VycmVudCgpOworICAgIH0KKworICAgIHZvaWQgUG9wKCkgeworICAgICAgRW50cnkgdG9wKHF1ZXVlXy50b3AoKSk7CisgICAgICBxdWV1ZV8ucG9wKCk7CisgICAgICBpZiAodG9wLkluY3JlbWVudChpbl8sIGJ1ZmZlcl9zaXplXywgZW50cnlfc2l6ZV8pKQorICAgICAgICBxdWV1ZV8ucHVzaCh0b3ApOworICAgIH0KKworICAgIHN0ZDo6c2l6ZV90IFNpemUoKSBjb25zdCB7CisgICAgICByZXR1cm4gcXVldWVfLnNpemUoKTsKKyAgICB9CisKKyAgICBib29sIEVtcHR5KCkgY29uc3QgeworICAgICAgcmV0dXJuIHF1ZXVlXy5lbXB0eSgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIC8vIFByaW9yaXR5IHF1ZXVlIGNvbnRhaW5zIHRoZXNlIGVudHJpZXMuCisgICAgY2xhc3MgRW50cnkgeworICAgICAgcHVibGljOgorICAgICAgICBFbnRyeSgpIHt9CisKKyAgICAgICAgRW50cnkodm9pZCAqYmFzZSwgaW50IGZkLCB1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IGFtb3VudCwgc3RkOjpzaXplX3QgYnVmX3NpemUpIHsKKyAgICAgICAgICBvZmZzZXRfID0gb2Zmc2V0OworICAgICAgICAgIHJlbWFpbmluZ18gPSBhbW91bnQ7CisgICAgICAgICAgYnVmZmVyX2VuZF8gPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYmFzZSkgKyBidWZfc2l6ZTsKKyAgICAgICAgICBSZWFkKGZkLCBidWZfc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBib29sIEluY3JlbWVudChpbnQgZmQsIHN0ZDo6c2l6ZV90IGJ1Zl9zaXplLCBzdGQ6OnNpemVfdCBlbnRyeV9zaXplKSB7CisgICAgICAgICAgY3VycmVudF8gKz0gZW50cnlfc2l6ZTsKKyAgICAgICAgICBpZiAoY3VycmVudF8gIT0gYnVmZmVyX2VuZF8pIHJldHVybiB0cnVlOworICAgICAgICAgIHJldHVybiBSZWFkKGZkLCBidWZfc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB2b2lkICpDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gY3VycmVudF87IH0KKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBSZWFkKGludCBmZCwgc3RkOjpzaXplX3QgYnVmX3NpemUpIHsKKyAgICAgICAgICBjdXJyZW50XyA9IGJ1ZmZlcl9lbmRfIC0gYnVmX3NpemU7CisgICAgICAgICAgc3RkOjpzaXplX3QgYW1vdW50OworICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oYnVmX3NpemUpIDwgcmVtYWluaW5nXykgeworICAgICAgICAgICAgYW1vdW50ID0gYnVmX3NpemU7CisgICAgICAgICAgfSBlbHNlIGlmICghcmVtYWluaW5nXykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbW91bnQgPSByZW1haW5pbmdfOworICAgICAgICAgICAgYnVmZmVyX2VuZF8gPSBjdXJyZW50XyArIHJlbWFpbmluZ187CisgICAgICAgICAgfQorICAgICAgICAgIEVyc2F0elBSZWFkKGZkLCBjdXJyZW50XywgYW1vdW50LCBvZmZzZXRfKTsKKyAgICAgICAgICBvZmZzZXRfICs9IGFtb3VudDsKKyAgICAgICAgICBhc3NlcnQoY3VycmVudF8gPD0gYnVmZmVyX2VuZF8pOworICAgICAgICAgIHJlbWFpbmluZ18gLT0gYW1vdW50OworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQnVmZmVyCisgICAgICAgIHVpbnQ4X3QgKmN1cnJlbnRfLCAqYnVmZmVyX2VuZF87CisgICAgICAgIC8vIEZpbGUKKyAgICAgICAgdWludDY0X3QgcmVtYWluaW5nXywgb2Zmc2V0XzsKKyAgICB9OworCisgICAgLy8gV3JhcHBlciBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciBxdWV1ZSBlbnRyaWVzLgorICAgIGNsYXNzIEdyZWF0ZXIgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248Y29uc3QgRW50cnkgJiwgY29uc3QgRW50cnkgJiwgYm9vbD4geworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBHcmVhdGVyKGNvbnN0IENvbXBhcmUgJmNvbXBhcmUpIDogY29tcGFyZV8oY29tcGFyZSkge30KKworICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgRW50cnkgJmZpcnN0LCBjb25zdCBFbnRyeSAmc2Vjb25kKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIGNvbXBhcmVfKHNlY29uZC5DdXJyZW50KCksIGZpcnN0LkN1cnJlbnQoKSk7CisgICAgICAgIH0KKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQ29tcGFyZSBjb21wYXJlXzsKKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnByaW9yaXR5X3F1ZXVlPEVudHJ5LCBzdGQ6OnZlY3RvcjxFbnRyeT4sIEdyZWF0ZXI+IFF1ZXVlOworICAgIFF1ZXVlIHF1ZXVlXzsKKworICAgIGNvbnN0IGludCBpbl87CisgICAgY29uc3Qgc3RkOjpzaXplX3QgYnVmZmVyX3NpemVfOworICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGVudHJ5X3NpemVfOworfTsKKworLyogQSB3b3JrZXIgb2JqZWN0IHRoYXQgbWVyZ2VzLiAgSWYgdGhlIG51bWJlciBvZiBwaWVjZXMgdG8gbWVyZ2UgZXhjZWVkcyB0aGUKKyAqIGFyaXR5LCBpdCBvdXRwdXRzIG11bHRpcGxlIHNvcnRlZCBibG9ja3MsIHJlY29yZGluZyB0byBvdXRfb2Zmc2V0cy4KKyAqIEhvd2V2ZXIsIHVzZXJzIHdpbGwgb25seSBldmVyeSBzZWUgYSBzaW5nbGUgc29ydGVkIGJsb2NrIG91dCBvdXRwdXQgYmVjYXVzZQorICogU29ydDo6U29ydGVkIGluc3VyZXMgdGhlIGFyaXR5IGlzIGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgb2YgcGllY2VzIGJlZm9yZQorICogcmV0dXJuaW5nIHRoaXMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBDb21wYXJlLCBjbGFzcyBDb21iaW5lPiBjbGFzcyBNZXJnaW5nUmVhZGVyIHsKKyAgcHVibGljOgorICAgIE1lcmdpbmdSZWFkZXIoaW50IGluLCBPZmZzZXRzICppbl9vZmZzZXRzLCBPZmZzZXRzICpvdXRfb2Zmc2V0cywgc3RkOjpzaXplX3QgYnVmZmVyX3NpemUsIHN0ZDo6c2l6ZV90IHRvdGFsX21lbW9yeSwgY29uc3QgQ29tcGFyZSAmY29tcGFyZSwgY29uc3QgQ29tYmluZSAmY29tYmluZSkgOgorICAgICAgICBjb21wYXJlXyhjb21wYXJlKSwgY29tYmluZV8oY29tYmluZSksCisgICAgICAgIGluXyhpbiksCisgICAgICAgIGluX29mZnNldHNfKGluX29mZnNldHMpLCBvdXRfb2Zmc2V0c18ob3V0X29mZnNldHMpLAorICAgICAgICBidWZmZXJfc2l6ZV8oYnVmZmVyX3NpemUpLCB0b3RhbF9tZW1vcnlfKHRvdGFsX21lbW9yeSkge30KKworICAgIHZvaWQgUnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7CisgICAgICBSdW4ocG9zaXRpb24sIGZhbHNlKTsKKyAgICB9CisKKyAgICB2b2lkIFJ1bihjb25zdCBDaGFpblBvc2l0aW9uICZwb3NpdGlvbiwgYm9vbCBhc3NlcnRfb25lKSB7CisgICAgICAvLyBTcGVjaWFsIGNhc2U6IG5vdGhpbmcgdG8gcmVhZC4KKyAgICAgIGlmICghaW5fb2Zmc2V0c18tPlJlbWFpbmluZ0Jsb2NrcygpKSB7CisgICAgICAgIExpbmsgbChwb3NpdGlvbik7CisgICAgICAgIGwuUG9pc29uKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8vIElmIHRoZXJlJ3MganVzdCBvbmUgZW50cnksIGp1c3QgcmVhZC4KKyAgICAgIGlmIChpbl9vZmZzZXRzXy0+UmVtYWluaW5nQmxvY2tzKCkgPT0gMSkgeworICAgICAgICAvLyBTZXF1ZW5jaW5nIGlzIGltcG9ydGFudC4KKyAgICAgICAgdWludDY0X3Qgb2Zmc2V0ID0gaW5fb2Zmc2V0c18tPlRvdGFsT2Zmc2V0KCk7CisgICAgICAgIHVpbnQ2NF90IGFtb3VudCA9IGluX29mZnNldHNfLT5OZXh0U2l6ZSgpOworICAgICAgICBSZWFkU2luZ2xlKG9mZnNldCwgYW1vdW50LCBwb3NpdGlvbik7CisgICAgICAgIGlmIChvdXRfb2Zmc2V0c18pIG91dF9vZmZzZXRzXy0+QXBwZW5kKGFtb3VudCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgU3RyZWFtIHN0cihwb3NpdGlvbik7CisgICAgICBzY29wZWRfbWFsbG9jIGJ1ZmZlcihNYWxsb2NPclRocm93KHRvdGFsX21lbW9yeV8pKTsKKyAgICAgIHVpbnQ4X3QgKmNvbnN0IGJ1ZmZlcl9lbmQgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyLmdldCgpKSArIHRvdGFsX21lbW9yeV87CisKKyAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGVudHJ5X3NpemUgPSBwb3NpdGlvbi5HZXRDaGFpbigpLkVudHJ5U2l6ZSgpOworCisgICAgICB3aGlsZSAoaW5fb2Zmc2V0c18tPlJlbWFpbmluZ0Jsb2NrcygpKSB7CisgICAgICAgIC8vIFVzZSBiaWdnZXIgYnVmZmVycyBpZiB0aGVyZSdzIGxlc3MgcmVtYWluaW5nLgorICAgICAgICB1aW50NjRfdCBwZXJfYnVmZmVyID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0ZDo6bWF4PHN0ZDo6c2l6ZV90PigKKyAgICAgICAgICAgIGJ1ZmZlcl9zaXplXywKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90Pigoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHRvdGFsX21lbW9yeV8pIC8gaW5fb2Zmc2V0c18tPlJlbWFpbmluZ0Jsb2NrcygpKSkpKTsKKyAgICAgICAgcGVyX2J1ZmZlciAtPSBwZXJfYnVmZmVyICUgZW50cnlfc2l6ZTsKKyAgICAgICAgYXNzZXJ0KHBlcl9idWZmZXIpOworCisgICAgICAgIC8vIFBvcHVsYXRlIHF1ZXVlLgorICAgICAgICBNZXJnZVF1ZXVlPENvbXBhcmU+IHF1ZXVlKGluXywgcGVyX2J1ZmZlciwgZW50cnlfc2l6ZSwgY29tcGFyZV8pOworICAgICAgICBmb3IgKHVpbnQ4X3QgKmJ1ZiA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIuZ2V0KCkpOworICAgICAgICAgICAgaW5fb2Zmc2V0c18tPlJlbWFpbmluZ0Jsb2NrcygpICYmIChidWYgKyBzdGQ6Om1pbihwZXJfYnVmZmVyLCBpbl9vZmZzZXRzXy0+UGVla1NpemUoKSkgPD0gYnVmZmVyX2VuZCk7KSB7CisgICAgICAgICAgdWludDY0X3Qgb2Zmc2V0ID0gaW5fb2Zmc2V0c18tPlRvdGFsT2Zmc2V0KCk7CisgICAgICAgICAgdWludDY0X3Qgc2l6ZSA9IGluX29mZnNldHNfLT5OZXh0U2l6ZSgpOworICAgICAgICAgIHF1ZXVlLlB1c2goYnVmLCBvZmZzZXQsIHNpemUpOworICAgICAgICAgIGJ1ZiArPSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oc3RkOjptaW48dWludDY0X3Q+KHNpemUsIHBlcl9idWZmZXIpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYnV0IGl0J3MgcHJvYmFibHkgYmV0dGVyIHRvIGRpZSB0aGFuIGxvb3AgaW5kZWZpbml0ZWx5LgorICAgICAgICBpZiAocXVldWUuU2l6ZSgpIDwgMiAmJiBpbl9vZmZzZXRzXy0+UmVtYWluaW5nQmxvY2tzKCkpIHsKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkJ1ZyBpbiBzb3J0IGltcGxlbWVudGF0aW9uOiBub3QgbWVyZ2luZyBhdCBsZWFzdCB0d28gc3RyaXBlcy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICAgIGlmIChhc3NlcnRfb25lICYmIGluX29mZnNldHNfLT5SZW1haW5pbmdCbG9ja3MoKSkgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiQnVnIGluIHNvcnQgaW1wbGVtZW50YXRpb246IHNob3VsZCBvbmx5IGJlIG9uZSBtZXJnZSBncm91cCBmb3IgbGF6eSBzb3J0IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ2NF90IHdyaXR0ZW4gPSAwOworICAgICAgICAvLyBNZXJnZSBpbmNsdWRpbmcgY29tYmluZXIgc3VwcG9ydC4KKyAgICAgICAgbWVtY3B5KHN0ci5HZXQoKSwgcXVldWUuVG9wKCksIGVudHJ5X3NpemUpOworICAgICAgICBmb3IgKHF1ZXVlLlBvcCgpOyAhcXVldWUuRW1wdHkoKTsgcXVldWUuUG9wKCkpIHsKKyAgICAgICAgICBpZiAoIWNvbWJpbmVfKHN0ci5HZXQoKSwgcXVldWUuVG9wKCksIGNvbXBhcmVfKSkgeworICAgICAgICAgICAgKyt3cml0dGVuOyArK3N0cjsKKyAgICAgICAgICAgIG1lbWNweShzdHIuR2V0KCksIHF1ZXVlLlRvcCgpLCBlbnRyeV9zaXplKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKyt3cml0dGVuOyArK3N0cjsKKyAgICAgICAgaWYgKG91dF9vZmZzZXRzXykKKyAgICAgICAgICBvdXRfb2Zmc2V0c18tPkFwcGVuZCh3cml0dGVuICogZW50cnlfc2l6ZSk7CisgICAgICB9CisgICAgICBzdHIuUG9pc29uKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBSZWFkU2luZ2xlKHVpbnQ2NF90IG9mZnNldCwgY29uc3QgdWludDY0X3Qgc2l6ZSwgY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKKyAgICAgIC8vIFNwZWNpYWwgY2FzZTogb25seSBvbmUgdG8gcmVhZC4KKyAgICAgIGNvbnN0IHVpbnQ2NF90IGVuZCA9IG9mZnNldCArIHNpemU7CisgICAgICBjb25zdCB1aW50NjRfdCBibG9ja19zaXplID0gcG9zaXRpb24uR2V0Q2hhaW4oKS5CbG9ja1NpemUoKTsKKyAgICAgIExpbmsgbChwb3NpdGlvbik7CisgICAgICBmb3IgKDsgb2Zmc2V0ICsgYmxvY2tfc2l6ZSA8IGVuZDsgKytsLCBvZmZzZXQgKz0gYmxvY2tfc2l6ZSkgeworICAgICAgICBFcnNhdHpQUmVhZChpbl8sIGwtPkdldCgpLCBibG9ja19zaXplLCBvZmZzZXQpOworICAgICAgICBsLT5TZXRWYWxpZFNpemUoYmxvY2tfc2l6ZSk7CisgICAgICB9CisgICAgICBFcnNhdHpQUmVhZChpbl8sIGwtPkdldCgpLCBlbmQgLSBvZmZzZXQsIG9mZnNldCk7CisgICAgICBsLT5TZXRWYWxpZFNpemUoZW5kIC0gb2Zmc2V0KTsKKyAgICAgICgrK2wpLlBvaXNvbigpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENvbXBhcmUgY29tcGFyZV87CisgICAgQ29tYmluZSBjb21iaW5lXzsKKworICAgIGludCBpbl87CisKKyAgcHJvdGVjdGVkOgorICAgIE9mZnNldHMgKmluX29mZnNldHNfOworCisgIHByaXZhdGU6CisgICAgT2Zmc2V0cyAqb3V0X29mZnNldHNfOworCisgICAgc3RkOjpzaXplX3QgYnVmZmVyX3NpemVfOworICAgIHN0ZDo6c2l6ZV90IHRvdGFsX21lbW9yeV87Cit9OworCisvLyBUaGUgbGF6eSBzdGVwIG93bnMgdGhlIHJlbWFpbmluZyBmaWxlcy4gIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlbS4KK3RlbXBsYXRlIDxjbGFzcyBDb21wYXJlLCBjbGFzcyBDb21iaW5lPiBjbGFzcyBPd25pbmdNZXJnaW5nUmVhZGVyIDogcHVibGljIE1lcmdpbmdSZWFkZXI8Q29tcGFyZSwgQ29tYmluZT4geworICBwcml2YXRlOgorICAgIHR5cGVkZWYgTWVyZ2luZ1JlYWRlcjxDb21wYXJlLCBDb21iaW5lPiBQOworICBwdWJsaWM6CisgICAgT3duaW5nTWVyZ2luZ1JlYWRlcihpbnQgZGF0YSwgY29uc3QgT2Zmc2V0cyAmb2Zmc2V0cywgc3RkOjpzaXplX3QgYnVmZmVyLCBzdGQ6OnNpemVfdCBsYXp5LCBjb25zdCBDb21wYXJlICZjb21wYXJlLCBjb25zdCBDb21iaW5lICZjb21iaW5lKQorICAgICAgOiBQKGRhdGEsIE5VTEwsIE5VTEwsIGJ1ZmZlciwgbGF6eSwgY29tcGFyZSwgY29tYmluZSksCisgICAgICAgIGRhdGFfKGRhdGEpLAorICAgICAgICBvZmZzZXRzXyhvZmZzZXRzKSB7fQorCisgICAgdm9pZCBSdW4oY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKKyAgICAgIFA6OmluX29mZnNldHNfID0gJm9mZnNldHNfOworICAgICAgc2NvcGVkX2ZkIGRhdGEoZGF0YV8pOworICAgICAgc2NvcGVkX2ZkIG9mZnNldHNfZmlsZShvZmZzZXRzXy5GaWxlKCkpOworICAgICAgUDo6UnVuKHBvc2l0aW9uLCB0cnVlKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBpbnQgZGF0YV87CisgICAgT2Zmc2V0cyBvZmZzZXRzXzsKK307CisKKy8vIERvbid0IHVzZSB0aGlzIGRpcmVjdGx5LiAgV29ya2VyIHRoYXQgc29ydHMgYmxvY2tzLgordGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+IGNsYXNzIEJsb2NrU29ydGVyIHsKKyAgcHVibGljOgorICAgIEJsb2NrU29ydGVyKE9mZnNldHMgJm9mZnNldHMsIGNvbnN0IENvbXBhcmUgJmNvbXBhcmUpIDoKKyAgICAgIG9mZnNldHNfKCZvZmZzZXRzKSwgY29tcGFyZV8oY29tcGFyZSkge30KKworICAgIHZvaWQgUnVuKGNvbnN0IENoYWluUG9zaXRpb24gJnBvc2l0aW9uKSB7CisgICAgICBjb25zdCBzdGQ6OnNpemVfdCBlbnRyeV9zaXplID0gcG9zaXRpb24uR2V0Q2hhaW4oKS5FbnRyeVNpemUoKTsKKyAgICAgIGZvciAoTGluayBsaW5rKHBvc2l0aW9uKTsgbGluazsgKytsaW5rKSB7CisgICAgICAgIC8vIFJlY29yZCB0aGUgc2l6ZSBvZiBlYWNoIGJsb2NrIGluIGEgc2VwYXJhdGUgZmlsZS4KKyAgICAgICAgb2Zmc2V0c18tPkFwcGVuZChsaW5rLT5WYWxpZFNpemUoKSk7CisgICAgICAgIHZvaWQgKmVuZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihsaW5rLT5HZXQoKSkgKyBsaW5rLT5WYWxpZFNpemUoKTsKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisgICAgICAgIHN0ZDo6c3RhYmxlX3NvcnQKKyNlbHNlCisgICAgICAgIHN0ZDo6c29ydAorI2VuZGlmCisgICAgICAgICAgKFNpemVkSXQobGluay0+R2V0KCksIGVudHJ5X3NpemUpLAorICAgICAgICAgICBTaXplZEl0KGVuZCwgZW50cnlfc2l6ZSksCisgICAgICAgICAgIGNvbXBhcmVfKTsKKyAgICAgIH0KKyAgICAgIG9mZnNldHNfLT5GaW5pc2hlZEFwcGVuZGluZygpOworICAgIH0KKworICBwcml2YXRlOgorICAgIE9mZnNldHMgKm9mZnNldHNfOworICAgIFNpemVkQ29tcGFyZTxDb21wYXJlPiBjb21wYXJlXzsKK307CisKK2NsYXNzIEJhZFNvcnRDb25maWcgOiBwdWJsaWMgRXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIEJhZFNvcnRDb25maWcoKSB0aHJvdygpIHt9CisgICAgfkJhZFNvcnRDb25maWcoKSB0aHJvdygpIHt9Cit9OworCisvKiogU29ydCAqLwordGVtcGxhdGUgPGNsYXNzIENvbXBhcmUsIGNsYXNzIENvbWJpbmUgPSBOZXZlckNvbWJpbmU+IGNsYXNzIFNvcnQgeworICBwdWJsaWM6CisgICAgLyoqIENvbnN0cnVjdHMgYW4gb2JqZWN0IGNhcGFibGUgb2Ygc29ydGluZyAqLworICAgIFNvcnQoQ2hhaW4gJmluLCBjb25zdCBTb3J0Q29uZmlnICZjb25maWcsIGNvbnN0IENvbXBhcmUgJmNvbXBhcmUgPSBDb21wYXJlKCksIGNvbnN0IENvbWJpbmUgJmNvbWJpbmUgPSBDb21iaW5lKCkpCisgICAgICA6IGNvbmZpZ18oY29uZmlnKSwKKyAgICAgICAgZGF0YV8oTWFrZVRlbXAoY29uZmlnLnRlbXBfcHJlZml4KSksCisgICAgICAgIG9mZnNldHNfZmlsZV8oTWFrZVRlbXAoY29uZmlnLnRlbXBfcHJlZml4KSksIG9mZnNldHNfKG9mZnNldHNfZmlsZV8uZ2V0KCkpLAorICAgICAgICBjb21wYXJlXyhjb21wYXJlKSwgY29tYmluZV8oY29tYmluZSksCisgICAgICAgIGVudHJ5X3NpemVfKGluLkVudHJ5U2l6ZSgpKSB7CisgICAgICBVVElMX1RIUk9XX0lGKCFlbnRyeV9zaXplXywgQmFkU29ydENvbmZpZywgIlNvcnRpbmcgZW50cmllcyBvZiBzaXplIDAiKTsKKyAgICAgIC8vIE1ha2UgYnVmZmVyX3NpemUgYSBtdWx0aXBsZSBvZiB0aGUgZW50cnlfc2l6ZS4KKyAgICAgIGNvbmZpZ18uYnVmZmVyX3NpemUgLT0gY29uZmlnXy5idWZmZXJfc2l6ZSAlIGVudHJ5X3NpemVfOworICAgICAgVVRJTF9USFJPV19JRighY29uZmlnXy5idWZmZXJfc2l6ZSwgQmFkU29ydENvbmZpZywgIlNvcnQgYnVmZmVyIHRvbyBzbWFsbCIpOworICAgICAgVVRJTF9USFJPV19JRihjb25maWdfLnRvdGFsX21lbW9yeSA8IGNvbmZpZ18uYnVmZmVyX3NpemUgKiA0LCBCYWRTb3J0Q29uZmlnLCAiU29ydGluZyBtZW1vcnkgIiA8PCBjb25maWdfLnRvdGFsX21lbW9yeSA8PCAiIGlzIHRvbyBzbWFsbCBmb3IgZm91ciBidWZmZXJzICh0d28gcmVhZCBhbmQgdHdvIHdyaXRlKS4iKTsKKyAgICAgIGluID4+IEJsb2NrU29ydGVyPENvbXBhcmU+KG9mZnNldHNfLCBjb21wYXJlXykgPj4gV3JpdGVBbmRSZWN5Y2xlKGRhdGFfLmdldCgpKTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBTaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNpemVPclRocm93KGRhdGFfLmdldCgpKTsKKyAgICB9CisKKyAgICAvLyBEbyBtZXJnZSBzb3J0LCB0ZXJtaW5hdGluZyB3aGVuIGxhenkgbWVyZ2UgY291bGQgYmUgZG9uZSB3aXRoIHRoZQorICAgIC8vIHNwZWNpZmllZCBtZW1vcnkuICBSZXR1cm4gdGhlIG1pbmltdW0gbWVtb3J5IG5lY2Vzc2FyeSB0byBkbyBsYXp5IG1lcmdlLgorICAgIHN0ZDo6c2l6ZV90IE1lcmdlKHN0ZDo6c2l6ZV90IGxhenlfbWVtb3J5KSB7CisgICAgICBpZiAob2Zmc2V0c18uUmVtYWluaW5nQmxvY2tzKCkgPD0gMSkgcmV0dXJuIDA7CisgICAgICBjb25zdCB1aW50NjRfdCBsYXp5X2FyaXR5ID0gc3RkOjptYXg8dWludDY0X3Q+KDEsIGxhenlfbWVtb3J5IC8gY29uZmlnXy5idWZmZXJfc2l6ZSk7CisgICAgICB1aW50NjRfdCBzaXplID0gU2l6ZSgpOworICAgICAgLyogTm8gb3ZlcmZsb3cgYmVjYXVzZQorICAgICAgICogb2Zmc2V0c18uUmVtYWluaW5nQmxvY2tzKCkgKiBjb25maWdfLmJ1ZmZlcl9zaXplIDw9IGxhenlfbWVtb3J5IHx8CisgICAgICAgKiBzaXplIDwgbGF6eV9tZW1vcnkKKyAgICAgICAqLworICAgICAgaWYgKG9mZnNldHNfLlJlbWFpbmluZ0Jsb2NrcygpIDw9IGxhenlfYXJpdHkgfHwgc2l6ZSA8PSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obGF6eV9tZW1vcnkpKQorICAgICAgICByZXR1cm4gc3RkOjptaW48c3RkOjpzaXplX3Q+KHNpemUsIG9mZnNldHNfLlJlbWFpbmluZ0Jsb2NrcygpICogY29uZmlnXy5idWZmZXJfc2l6ZSk7CisKKyAgICAgIHNjb3BlZF9mZCBkYXRhMihNYWtlVGVtcChjb25maWdfLnRlbXBfcHJlZml4KSk7CisgICAgICBpbnQgZmRfaW4gPSBkYXRhXy5nZXQoKSwgZmRfb3V0ID0gZGF0YTIuZ2V0KCk7CisgICAgICBzY29wZWRfZmQgb2Zmc2V0czJfZmlsZShNYWtlVGVtcChjb25maWdfLnRlbXBfcHJlZml4KSk7CisgICAgICBPZmZzZXRzIG9mZnNldHMyKG9mZnNldHMyX2ZpbGUuZ2V0KCkpOworICAgICAgT2Zmc2V0cyAqb2Zmc2V0c19pbiA9ICZvZmZzZXRzXywgKm9mZnNldHNfb3V0ID0gJm9mZnNldHMyOworCisgICAgICAvLyBEb3VibGUgYnVmZmVyZWQgd3JpdGluZy4KKyAgICAgIENoYWluQ29uZmlnIGNoYWluX2NvbmZpZzsKKyAgICAgIGNoYWluX2NvbmZpZy5lbnRyeV9zaXplID0gZW50cnlfc2l6ZV87CisgICAgICBjaGFpbl9jb25maWcuYmxvY2tfY291bnQgPSAyOworICAgICAgY2hhaW5fY29uZmlnLnRvdGFsX21lbW9yeSA9IGNvbmZpZ18uYnVmZmVyX3NpemUgKiAyOworICAgICAgQ2hhaW4gY2hhaW4oY2hhaW5fY29uZmlnKTsKKworICAgICAgd2hpbGUgKG9mZnNldHNfaW4tPlJlbWFpbmluZ0Jsb2NrcygpID4gbGF6eV9hcml0eSkgeworICAgICAgICBpZiAoc2l6ZSA8PSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obGF6eV9tZW1vcnkpKSBicmVhazsKKyAgICAgICAgc3RkOjpzaXplX3QgcmVhZGluZ19tZW1vcnkgPSBjb25maWdfLnRvdGFsX21lbW9yeSAtIDIgKiBjb25maWdfLmJ1ZmZlcl9zaXplOworICAgICAgICBpZiAoc2l6ZSA8IHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZWFkaW5nX21lbW9yeSkpIHsKKyAgICAgICAgICByZWFkaW5nX21lbW9yeSA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzaXplKTsKKyAgICAgICAgfQorICAgICAgICBTZWVrT3JUaHJvdyhmZF9pbiwgMCk7CisgICAgICAgIGNoYWluID4+CisgICAgICAgICAgTWVyZ2luZ1JlYWRlcjxDb21wYXJlLCBDb21iaW5lPigKKyAgICAgICAgICAgICAgZmRfaW4sCisgICAgICAgICAgICAgIG9mZnNldHNfaW4sIG9mZnNldHNfb3V0LAorICAgICAgICAgICAgICBjb25maWdfLmJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICByZWFkaW5nX21lbW9yeSwKKyAgICAgICAgICAgICAgY29tcGFyZV8sIGNvbWJpbmVfKSA+PgorICAgICAgICAgIFdyaXRlQW5kUmVjeWNsZShmZF9vdXQpOworICAgICAgICBjaGFpbi5XYWl0KCk7CisgICAgICAgIG9mZnNldHNfb3V0LT5GaW5pc2hlZEFwcGVuZGluZygpOworICAgICAgICBSZXNpemVPclRocm93KGZkX2luLCAwKTsKKyAgICAgICAgb2Zmc2V0c19pbi0+UmVzZXQoKTsKKyAgICAgICAgc3RkOjpzd2FwKGZkX2luLCBmZF9vdXQpOworICAgICAgICBzdGQ6OnN3YXAob2Zmc2V0c19pbiwgb2Zmc2V0c19vdXQpOworICAgICAgICBzaXplID0gU2l6ZU9yVGhyb3coZmRfaW4pOworICAgICAgfQorCisgICAgICBTZWVrT3JUaHJvdyhmZF9pbiwgMCk7CisgICAgICBpZiAoZmRfaW4gPT0gZGF0YTIuZ2V0KCkpIHsKKyAgICAgICAgZGF0YV8ucmVzZXQoZGF0YTIucmVsZWFzZSgpKTsKKyAgICAgICAgb2Zmc2V0c19maWxlXy5yZXNldChvZmZzZXRzMl9maWxlLnJlbGVhc2UoKSk7CisgICAgICAgIG9mZnNldHNfID0gb2Zmc2V0czI7CisgICAgICB9CisgICAgICBpZiAob2Zmc2V0c18uUmVtYWluaW5nQmxvY2tzKCkgPD0gMSkgcmV0dXJuIDA7CisgICAgICAvLyBObyBvdmVyZmxvdyBiZWNhdXNlIHRoZSB3aGlsZSBsb29wIGV4aXRlZC4KKyAgICAgIHJldHVybiBzdGQ6Om1pbihzaXplLCBvZmZzZXRzXy5SZW1haW5pbmdCbG9ja3MoKSAqIHN0YXRpY19jYXN0PHVpbnQ2NF90Pihjb25maWdfLmJ1ZmZlcl9zaXplKSk7CisgICAgfQorCisgICAgLy8gT3V0cHV0IHRvIGNoYWluLCB1c2luZyB0aGlzIGFtb3VudCBvZiBtZW1vcnksIG1heGltdW0sIGZvciBsYXp5IG1lcmdlCisgICAgLy8gc29ydC4KKyAgICB2b2lkIE91dHB1dChDaGFpbiAmb3V0LCBzdGQ6OnNpemVfdCBsYXp5X21lbW9yeSkgeworICAgICAgTWVyZ2UobGF6eV9tZW1vcnkpOworICAgICAgb3V0LlNldFByb2dyZXNzVGFyZ2V0KFNpemUoKSk7CisgICAgICBvdXQgPj4gT3duaW5nTWVyZ2luZ1JlYWRlcjxDb21wYXJlLCBDb21iaW5lPihkYXRhXy5nZXQoKSwgb2Zmc2V0c18sIGNvbmZpZ18uYnVmZmVyX3NpemUsIGxhenlfbWVtb3J5LCBjb21wYXJlXywgY29tYmluZV8pOworICAgICAgZGF0YV8ucmVsZWFzZSgpOworICAgICAgb2Zmc2V0c19maWxlXy5yZWxlYXNlKCk7CisgICAgfQorCisgICAgLyogSWYgYSBwaXBlbGluZSBzdGVwIGlzIHJlYWRpbmcgc29ydGVkIGlucHV0IGFuZCB3cml0aW5nIHRvIGEgZGlmZmVyZW50CisgICAgICogc29ydCBvcmRlciwgdGhlbiB0aGVyZSdzIGEgdHJhZGUtb2ZmIGJldHdlZW4gdXNpbmcgUkFNIHRvIHJlYWQgbGF6aWx5CisgICAgICogKGF2b2lkaW5nIGNvcHlpbmcgdGhlIGZpbGUpIGFuZCB1c2luZyBSQU0gdG8gaW5jcmVhc2UgYmxvY2sgc2l6ZSBhbmQsCisgICAgICogdGhlcmVmb3JlLCBkZWNyZWFzZSB0aGUgbnVtYmVyIG9mIG1lcmdlIHNvcnQgcGFzc2VzIGluIHRoZSBuZXh0CisgICAgICogaXRlcmF0aW9uLgorICAgICAqCisgICAgICogTWVyZ2Ugc29ydCB0YWtlcyBsb2dfe2FyaXR5fShwaWVjZXMpIHBhc3Nlcy4gIFRodXMsIGVhY2ggdGltZSB0aGUgY2hhaW4KKyAgICAgKiBibG9jayBzaXplIGlzIG11bHRpcGxpZWQgYnkgYXJpdHksIHRoZSBudW1iZXIgb2Ygb3V0cHV0IHBhc3NlcyBkZWNyZWFzZXMKKyAgICAgKiBieSBvbmUuICBVcCB0byBhIGNvbnN0YW50LCB0aGVuLCBsb2dfe2FyaXR5fShjaGFpbikgaXMgdGhlIG51bWJlciBvZgorICAgICAqIHBhc3NlcyBzYXZlZC4gIENoYWluIHNpbXBseSBkaXZpZGVzIHRoZSBtZW1vcnkgZXZlbmx5IG92ZXIgYWxsIGJsb2Nrcy4KKyAgICAgKgorICAgICAqIExhenkgc29ydCBzYXZlcyB0aGlzIG1hbnkgcGFzc2VzICh1cCB0byBhIGNvbnN0YW50KQorICAgICAqICAgbG9nX3thcml0eX0oKG1lbW9yeS1sYXp5KS9ibG9ja19jb3VudCkgKyAxCisgICAgICogTm9uLWxhenkgc29ydCBzYXZlcyB0aGlzIG1hbnkgcGFzc2VzICh1cCB0byB0aGUgc2FtZSBjb25zdGFudCk6CisgICAgICogICBsb2dfe2FyaXR5fShtZW1vcnkvYmxvY2tfY291bnQpCisgICAgICogQWRkIGxvZ197YXJpdHl9KGJsb2NrX2NvdW50KSB0byBib3RoOgorICAgICAqICAgbG9nX3thcml0eX0obWVtb3J5LWxhenkpICsgMSB2ZXJzdXMgbG9nX3thcml0eX0obWVtb3J5KQorICAgICAqIFRha2UgYXJpdHkgdG8gdGhlIHBvd2VyIG9mIGJvdGggc2l6ZXMgKGFyaXR5ID4gMSkKKyAgICAgKiAgIChtZW1vcnkgLSBsYXp5KSphcml0eSB2ZXJzdXMgbWVtb3J5CisgICAgICogU29sdmUgZm9yIGxhenkKKyAgICAgKiAgIGxhenkgPSBtZW1vcnkgKiAoYXJpdHkgLSAxKSAvIGFyaXR5CisgICAgICovCisgICAgc3RkOjpzaXplX3QgRGVmYXVsdExhenkoKSB7CisgICAgICBmbG9hdCBhcml0eSA9IHN0YXRpY19jYXN0PGZsb2F0Pihjb25maWdfLnRvdGFsX21lbW9yeSAvIGNvbmZpZ18uYnVmZmVyX3NpemUpOworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzdGF0aWNfY2FzdDxmbG9hdD4oY29uZmlnXy50b3RhbF9tZW1vcnkpICogKGFyaXR5IC0gMS4wKSAvIGFyaXR5KTsKKyAgICB9CisKKyAgICAvLyBTYW1lIGFzIE91dHB1dCB3aXRoIGRlZmF1bHQgbGF6eSBtZW1vcnkgc2V0dGluZy4KKyAgICB2b2lkIE91dHB1dChDaGFpbiAmb3V0KSB7CisgICAgICBPdXRwdXQob3V0LCBEZWZhdWx0TGF6eSgpKTsKKyAgICB9CisKKyAgICAvLyBDb21wbGV0ZWx5IG1lcmdlIHNvcnQgYW5kIHRyYW5zZmVyIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyLgorICAgIGludCBTdGVhbENvbXBsZXRlZCgpIHsKKyAgICAgIC8vIE1lcmdlIGFsbCB0aGUgd2F5LgorICAgICAgTWVyZ2UoMCk7CisgICAgICBTZWVrT3JUaHJvdyhkYXRhXy5nZXQoKSwgMCk7CisgICAgICBvZmZzZXRzX2ZpbGVfLnJlc2V0KCk7CisgICAgICByZXR1cm4gZGF0YV8ucmVsZWFzZSgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFNvcnRDb25maWcgY29uZmlnXzsKKworICAgIHNjb3BlZF9mZCBkYXRhXzsKKworICAgIHNjb3BlZF9mZCBvZmZzZXRzX2ZpbGVfOworICAgIE9mZnNldHMgb2Zmc2V0c187CisKKyAgICBjb25zdCBDb21wYXJlIGNvbXBhcmVfOworICAgIGNvbnN0IENvbWJpbmUgY29tYmluZV87CisgICAgY29uc3Qgc3RkOjpzaXplX3QgZW50cnlfc2l6ZV87Cit9OworCisvLyByZXR1cm5zIGJ5dGVzIHRvIGJlIHJlYWQgb24gZGVtYW5kLgordGVtcGxhdGUgPGNsYXNzIENvbXBhcmUsIGNsYXNzIENvbWJpbmU+IHVpbnQ2NF90IEJsb2NraW5nU29ydChDaGFpbiAmY2hhaW4sIGNvbnN0IFNvcnRDb25maWcgJmNvbmZpZywgY29uc3QgQ29tcGFyZSAmY29tcGFyZSA9IENvbXBhcmUoKSwgY29uc3QgQ29tYmluZSAmY29tYmluZSA9IE5ldmVyQ29tYmluZSgpKSB7CisgIFNvcnQ8Q29tcGFyZSwgQ29tYmluZT4gc29ydGVyKGNoYWluLCBjb25maWcsIGNvbXBhcmUsIGNvbWJpbmUpOworICBjaGFpbi5XYWl0KHRydWUpOworICB1aW50NjRfdCBzaXplID0gc29ydGVyLlNpemUoKTsKKyAgc29ydGVyLk91dHB1dChjaGFpbik7CisgIHJldHVybiBzaXplOworfQorCisvKioKKyAqIFJlcHJlc2VudHMgYW4gQHJlZiB1dGlsOjpGaXhlZEFycmF5ICJhcnJheSIgY2FwYWJsZSBvZiBzdG9yaW5nIEByZWYgdXRpbDo6c3RyZWFtOjpTb3J0ICJTb3J0IiBvYmplY3RzLgorICoKKyAqIEluIHRoZSBhbnRpY2lwYXRlZCB1c2UgY2FzZSwgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aWxsIG1haW50YWluIG9uZSBAcmVmIHV0aWw6OnN0cmVhbTo6U29ydCAiU29ydCIgb2JqZWN0CisgKiBmb3IgZWFjaCBuLWdyYW0gb3JkZXIgKHJhbmdpbmcgZnJvbSAxIHVwIHRvIHRoZSBtYXhpbXVtIG4tZ3JhbSBvcmRlciBiZWluZyBwcm9jZXNzZWQpLgorICogVXNlIGluIHRoaXMgbWFubmVyIHdvdWxkIGVuYWJsZSB0aGUgbi1ncmFtcyBlYWNoIG4tZ3JhbSBvcmRlciB0byBiZSBzb3J0ZWQsIGluIHBhcmFsbGVsLgorICoKKyAqIEB0cGFyYW0gQ29tcGFyZSBBbiBAcmVmIENvbXBhcmF0b3IgIm5ncmFtIGNvbXBhcmF0b3IiIHRvIHVzZSBkdXJpbmcgc29ydGluZy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIENvbXBhcmUsIGNsYXNzIENvbWJpbmUgPSBOZXZlckNvbWJpbmU+IGNsYXNzIFNvcnRzIDogcHVibGljIEZpeGVkQXJyYXk8U29ydDxDb21wYXJlLCBDb21iaW5lPiA+IHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFNvcnQ8Q29tcGFyZSwgQ29tYmluZT4gUzsKKyAgICB0eXBlZGVmIEZpeGVkQXJyYXk8Uz4gUDsKKworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cywgYnV0IGRvZXMgbm90IGluaXRpYWxpemUuCisgICAgICoKKyAgICAgKiBAcmVmIHV0aWw6OkZpeGVkQXJyYXk6OkluaXQoKSAiSW5pdCIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVzZS4KKyAgICAgKgorICAgICAqIEBzZWUgdXRpbDo6Rml4ZWRBcnJheTo6SW5pdCgpCisgICAgICovCisgICAgU29ydHMoKSB7fQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBAcmVmIHV0aWw6OkZpeGVkQXJyYXkgImFycmF5IiBjYXBhYmxlIG9mIHN0b3JpbmcgYSBmaXhlZCBudW1iZXIgb2YgQHJlZiB1dGlsOjpzdHJlYW06OlNvcnQgIlNvcnQiIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBtYXhpbXVtIG51bWJlciBvZiBAcmVmIHV0aWw6OnN0cmVhbTo6U29ydCAic29ydGVycyIgdGhhdCBjYW4gYmUgaGVsZCBieSB0aGlzIEByZWYgdXRpbDo6Rml4ZWRBcnJheSAiYXJyYXkiCisgICAgICogQHNlZSB1dGlsOjpGaXhlZEFycmF5OjpGaXhlZEFycmF5KCkKKyAgICAgKi8KKyAgICBleHBsaWNpdCBTb3J0cyhzdGQ6OnNpemVfdCBudW1iZXIpIDogRml4ZWRBcnJheTxTb3J0PENvbXBhcmUsIENvbWJpbmU+ID4obnVtYmVyKSB7fQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBAcmVmIHV0aWw6OnN0cmVhbTo6U29ydCAiU29ydCIgb2JqZWN0IHdoaWNoIGlzIHN0b3JlZCBpbiB0aGlzIEByZWYgdXRpbDo6Rml4ZWRBcnJheSAiYXJyYXkiLgorICAgICAqCisgICAgICogVGhlIG5ldyBAcmVmIHV0aWw6OnN0cmVhbTo6U29ydCAiU29ydCIgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBwcm92aWRlZCBAcmVmIHV0aWw6OnN0cmVhbTo6U29ydENvbmZpZyAiU29ydENvbmZpZyIgYW5kIEByZWYgQ29tcGFyYXRvciAibmdyYW0gICBjb21wYXJhdG9yIjsKKyAgICAgKiBvbmNlIGNvbnN0cnVjdGVkLCBhIG5ldyB3b3JrZXIgQHJlZiB1dGlsOjpzdHJlYW06OlRocmVhZCAidGhyZWFkIiAob3duZWQgYnkgdGhlIEByZWYgdXRpbDo6c3RyZWFtOjpDaGFpbiAiY2hhaW4iKSB3aWxsIHNvcnQgdGhlIG4tZ3JhbSBkYXRhIHN0b3JlZAorICAgICAqIGluIHRoZSBAcmVmIHV0aWw6OnN0cmVhbTo6QmxvY2sgImJsb2NrcyIgb2YgdGhlIHByb3ZpZGVkIEByZWYgdXRpbDo6c3RyZWFtOjpDaGFpbiAiY2hhaW4iLgorICAgICAqCisgICAgICogQHNlZSB1dGlsOjpzdHJlYW06OlNvcnQ6OlNvcnQoKQorICAgICAqIEBzZWUgdXRpbDo6c3RyZWFtOjpDaGFpbjo6b3BlcmF0b3I+PigpCisgICAgICovCisgICAgdm9pZCBwdXNoX2JhY2sodXRpbDo6c3RyZWFtOjpDaGFpbiAmY2hhaW4sIGNvbnN0IHV0aWw6OnN0cmVhbTo6U29ydENvbmZpZyAmY29uZmlnLCBjb25zdCBDb21wYXJlICZjb21wYXJlID0gQ29tcGFyZSgpLCBjb25zdCBDb21iaW5lICZjb21iaW5lID0gQ29tYmluZSgpKSB7CisgICAgICBuZXcgKFA6OmVuZCgpKSBTKGNoYWluLCBjb25maWcsIGNvbXBhcmUsIGNvbWJpbmUpOyAvLyB1c2UgInBsYWNlbWVudCBuZXciIHN5bnRheCB0byBpbml0YWxpemUgUyBpbiBhbiBhbHJlYWR5LWFsbG9jYXRlZCBtZW1vcnkgbG9jYXRpb24KKyAgICAgIFA6OkNvbnN0cnVjdGVkKCk7CisgICAgfQorfTsKKworfSAvLyBuYW1lc3BhY2Ugc3RyZWFtCit9IC8vIG5hbWVzcGFjZSB1dGlsCisKKyNlbmRpZiAvLyBVVElMX1NUUkVBTV9TT1JUX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9zb3J0X3Rlc3QuY2MgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vc29ydF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTdmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vc29ydF90ZXN0LmNjCkBAIC0wLDAgKzEsNjIgQEAKKyNpbmNsdWRlICJ1dGlsL3N0cmVhbS9zb3J0LmhoIgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFNvcnRUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSB1dGlsIHsgbmFtZXNwYWNlIHN0cmVhbSB7IG5hbWVzcGFjZSB7CisKK3N0cnVjdCBDb21wYXJlVUludDY0IDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBib29sPiB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCB2b2lkICpmaXJzdCwgY29uc3Qgdm9pZCAqc2Vjb25kKSBjb25zdCB7CisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCB1aW50NjRfdCo+KGZpcnN0KSA8ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oc2Vjb25kKTsKKyAgfQorfTsKKworY29uc3QgdWludDY0X3Qga1NpemUgPSAxMDAwMDA7CisKK3N0cnVjdCBQdXR0ZXIgeworICBQdXR0ZXIoc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZzaHVmZmxlZCkgOiBzaHVmZmxlZF8oc2h1ZmZsZWQpIHt9CisKKyAgdm9pZCBSdW4oY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKKyAgICBTdHJlYW0gcHV0X3NodWZmbGVkKHBvc2l0aW9uKTsKKyAgICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgc2h1ZmZsZWRfLnNpemUoKTsgKytpLCArK3B1dF9zaHVmZmxlZCkgeworICAgICAgKnN0YXRpY19jYXN0PHVpbnQ2NF90Kj4ocHV0X3NodWZmbGVkLkdldCgpKSA9IHNodWZmbGVkX1tpXTsKKyAgICB9CisgICAgcHV0X3NodWZmbGVkLlBvaXNvbigpOworICB9CisgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmc2h1ZmZsZWRfOworfTsKKworQk9PU1RfQVVUT19URVNUX0NBU0UoRnJvbVNodWZmbGVkKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBzaHVmZmxlZDsKKyAgc2h1ZmZsZWQucmVzZXJ2ZShrU2l6ZSk7CisgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBrU2l6ZTsgKytpKSB7CisgICAgc2h1ZmZsZWQucHVzaF9iYWNrKGkpOworICB9CisgIHN0ZDo6cmFuZG9tX3NodWZmbGUoc2h1ZmZsZWQuYmVnaW4oKSwgc2h1ZmZsZWQuZW5kKCkpOworCisgIENoYWluQ29uZmlnIGNvbmZpZzsKKyAgY29uZmlnLmVudHJ5X3NpemUgPSA4OworICBjb25maWcudG90YWxfbWVtb3J5ID0gODAwOworICBjb25maWcuYmxvY2tfY291bnQgPSAzOworCisgIFNvcnRDb25maWcgbWVyZ2VfY29uZmlnOworICBtZXJnZV9jb25maWcudGVtcF9wcmVmaXggPSAic29ydF90ZXN0X3RlbXAiOworICBtZXJnZV9jb25maWcuYnVmZmVyX3NpemUgPSA4MDA7CisgIG1lcmdlX2NvbmZpZy50b3RhbF9tZW1vcnkgPSAzMzAwOworCisgIENoYWluIGNoYWluKGNvbmZpZyk7CisgIGNoYWluID4+IFB1dHRlcihzaHVmZmxlZCk7CisgIEJsb2NraW5nU29ydChjaGFpbiwgbWVyZ2VfY29uZmlnLCBDb21wYXJlVUludDY0KCksIE5ldmVyQ29tYmluZSgpKTsKKyAgU3RyZWFtIHNvcnRlZDsKKyAgY2hhaW4gPj4gc29ydGVkID4+IGtSZWN5Y2xlOworICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwga1NpemU7ICsraSwgKytzb3J0ZWQpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChpLCAqc3RhdGljX2Nhc3Q8Y29uc3QgdWludDY0X3QqPihzb3J0ZWQuR2V0KCkpKTsKKyAgfQorICBCT09TVF9DSEVDSyghc29ydGVkKTsKK30KKworfX19IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3N0cmVhbS9zdHJlYW0uaGggYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vc3RyZWFtLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMWU5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vc3RyZWFtLmhoCkBAIC0wLDAgKzEsNzcgQEAKKyNpZm5kZWYgVVRJTF9TVFJFQU1fU1RSRUFNX0gKKyNkZWZpbmUgVVRJTF9TVFJFQU1fU1RSRUFNX0gKKworI2luY2x1ZGUgInV0aWwvc3RyZWFtL2NoYWluLmhoIgorCisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHN0cmVhbSB7CisKK2NsYXNzIFN0cmVhbSA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIHB1YmxpYzoKKyAgICBTdHJlYW0oKSA6IGN1cnJlbnRfKE5VTEwpLCBlbmRfKE5VTEwpIHt9CisKKyAgICB2b2lkIEluaXQoY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKKyAgICAgIGVudHJ5X3NpemVfID0gcG9zaXRpb24uR2V0Q2hhaW4oKS5FbnRyeVNpemUoKTsKKyAgICAgIGJsb2NrX3NpemVfID0gcG9zaXRpb24uR2V0Q2hhaW4oKS5CbG9ja1NpemUoKTsKKyAgICAgIGJsb2NrX2l0Xy5Jbml0KHBvc2l0aW9uKTsKKyAgICAgIFN0YXJ0QmxvY2soKTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBTdHJlYW0oY29uc3QgQ2hhaW5Qb3NpdGlvbiAmcG9zaXRpb24pIHsKKyAgICAgIEluaXQocG9zaXRpb24pOworICAgIH0KKworICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBjdXJyZW50XyAhPSBOVUxMOyB9CisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiBjdXJyZW50XyA9PSBOVUxMOyB9CisKKyAgICBjb25zdCB2b2lkICpHZXQoKSBjb25zdCB7IHJldHVybiBjdXJyZW50XzsgfQorICAgIHZvaWQgKkdldCgpIHsgcmV0dXJuIGN1cnJlbnRfOyB9CisKKyAgICB2b2lkIFBvaXNvbigpIHsKKyAgICAgIGJsb2NrX2l0Xy0+U2V0VmFsaWRTaXplKGN1cnJlbnRfIC0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJsb2NrX2l0Xy0+R2V0KCkpKTsKKyAgICAgICsrYmxvY2tfaXRfOworICAgICAgYmxvY2tfaXRfLlBvaXNvbigpOworICAgIH0KKworICAgIFN0cmVhbSAmb3BlcmF0b3IrKygpIHsKKyAgICAgIGFzc2VydCgqdGhpcyk7CisgICAgICBhc3NlcnQoY3VycmVudF8gPCBlbmRfKTsKKyAgICAgIGN1cnJlbnRfICs9IGVudHJ5X3NpemVfOworICAgICAgaWYgKGN1cnJlbnRfID09IGVuZF8pIHsKKyAgICAgICAgKytibG9ja19pdF87CisgICAgICAgIFN0YXJ0QmxvY2soKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIFN0YXJ0QmxvY2soKSB7CisgICAgICBmb3IgKDsgYmxvY2tfaXRfICYmICFibG9ja19pdF8tPlZhbGlkU2l6ZSgpOyArK2Jsb2NrX2l0Xykge30KKyAgICAgIGN1cnJlbnRfID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJsb2NrX2l0Xy0+R2V0KCkpOworICAgICAgZW5kXyA9IGN1cnJlbnRfICsgYmxvY2tfaXRfLT5WYWxpZFNpemUoKTsKKyAgICB9CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBwb2ludGVycyB0byByYXcgbWVtb3J5CisgICAgLy8gY3VycmVudF8gaXMgdGhlIGN1cnJlbnQgcmVjb3JkCisgICAgLy8gZW5kXyBpcyB0aGUgZW5kIG9mIHRoZSBibG9jayAoc28gd2Uga25vdyB3aGVuIHRvIG1vdmUgdG8gdGhlIG5leHQgYmxvY2spCisgICAgdWludDhfdCAqY3VycmVudF8sICplbmRfOworCisgICAgc3RkOjpzaXplX3QgZW50cnlfc2l6ZV87CisgICAgc3RkOjpzaXplX3QgYmxvY2tfc2l6ZV87CisKKyAgICBMaW5rIGJsb2NrX2l0XzsKK307CisKK2lubGluZSBDaGFpbiAmb3BlcmF0b3I+PihDaGFpbiAmY2hhaW4sIFN0cmVhbSAmc3RyZWFtKSB7CisgIHN0cmVhbS5Jbml0KGNoYWluLkFkZCgpKTsKKyAgcmV0dXJuIGNoYWluOworfQorCit9IC8vIG5hbWVzcGFjZSBzdHJlYW0KK30gLy8gbmFtZXNwYWNlIHV0aWwKKyNlbmRpZiAvLyBVVElMX1NUUkVBTV9TVFJFQU1fSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvc3RyZWFtL3N0cmVhbV90ZXN0LmNjIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL3N0cmVhbV90ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJlYW0vc3RyZWFtX3Rlc3QuY2MKcmVuYW1lIHRvIHNyYy9rZW5sbS91dGlsL3N0cmVhbS9zdHJlYW1fdGVzdC5jYwpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL3RpbWVyLmhoIGIvc3JjL2tlbmxtL3V0aWwvc3RyZWFtL3RpbWVyLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOTU3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJlYW0vdGltZXIuaGgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBVVElMX1NUUkVBTV9USU1FUl9ICisjZGVmaW5lIFVUSUxfU1RSRUFNX1RJTUVSX0gKKworLy8gU29ycnkgSm9uLCB0aGlzIHdhcyBhZGRpbmcgbGlicmFyeSBkZXBlbmRlbmNpZXMgaW4gTW9zZXMgYW5kIHBlb3BsZSBjb21wbGFpbmVkLgorCisvKiNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KKworI2lmIEJPT1NUX1ZFUlNJT04gPj0gMTA0ODAwCisjaW5jbHVkZSA8Ym9vc3QvdGltZXIvdGltZXIuaHBwPgorI2RlZmluZSBVVElMX1RJTUVSKHN0cikgYm9vc3Q6OnRpbWVyOjphdXRvX2NwdV90aW1lciB0aW1lcihzdGQ6OmNlcnIsIDEsIChzdHIpKQorI2Vsc2UKKy8vI3dhcm5pbmcgVXNpbmcgQm9vc3Qgb2xkZXIgdGhhbiAxLjQ4LiBUaW1pbmcgaW5mb3JtYXRpb24gd2lsbCBub3QgYmUgYXZhaWxhYmxlLiovCisjZGVmaW5lIFVUSUxfVElNRVIoc3RyKQorLy8jZW5kaWYKKworI2VuZGlmIC8vIFVUSUxfU1RSRUFNX1RJTUVSX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3N0cmluZ19waWVjZS5jYyBiL3NyYy9rZW5sbS91dGlsL3N0cmluZ19waWVjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBiNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvc3RyaW5nX3BpZWNlLmNjCkBAIC0wLDAgKzEsMTkyIEBACisvLyBDb3B5cmlnaHQgMjAwNCBUaGUgUkUyIEF1dGhvcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKKy8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gc3RyaW5nX3BpZWNlLmhoLgorCisjaW5jbHVkZSAidXRpbC9zdHJpbmdfcGllY2UuaGgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKworI2lmbmRlZiBIQVZFX0lDVQorCit0eXBlZGVmIFN0cmluZ1BpZWNlOjpzaXplX3R5cGUgc2l6ZV90eXBlOworCit2b2lkIFN0cmluZ1BpZWNlOjpDb3B5VG9TdHJpbmcoc3RkOjpzdHJpbmcqIHRhcmdldCkgY29uc3QgeworICB0YXJnZXQtPmFzc2lnbihwdHJfLCBsZW5ndGhfKTsKK30KKworc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kKGNvbnN0IFN0cmluZ1BpZWNlJiBzLCBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIC8vIE5vdCBzdXJlIHdoeSBsZW5ndGhfIDwgMCB3YXMgaGVyZSBzaW5jZSBpdCdzIHN0ZDo6c2l6ZV90LgorICBpZiAoLypsZW5ndGhfIDwgMCB8fCAqL3BvcyA+IHN0YXRpY19jYXN0PHNpemVfdHlwZT4obGVuZ3RoXykpCisgICAgcmV0dXJuIG5wb3M7CisKKyAgY29uc3QgY2hhciogcmVzdWx0ID0gc3RkOjpzZWFyY2gocHRyXyArIHBvcywgcHRyXyArIGxlbmd0aF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHRyXywgcy5wdHJfICsgcy5sZW5ndGhfKTsKKyAgY29uc3Qgc2l6ZV90eXBlIHhwb3MgPSByZXN1bHQgLSBwdHJfOworICByZXR1cm4geHBvcyArIHMubGVuZ3RoXyA8PSBsZW5ndGhfID8geHBvcyA6IG5wb3M7Cit9CisKK3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZChjaGFyIGMsIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKKyAgaWYgKGxlbmd0aF8gPD0gMCB8fCBwb3MgPj0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihsZW5ndGhfKSkgeworICAgIHJldHVybiBucG9zOworICB9CisgIGNvbnN0IGNoYXIqIHJlc3VsdCA9IHN0ZDo6ZmluZChwdHJfICsgcG9zLCBwdHJfICsgbGVuZ3RoXywgYyk7CisgIHJldHVybiByZXN1bHQgIT0gcHRyXyArIGxlbmd0aF8gPyByZXN1bHQgLSBwdHJfIDogbnBvczsKK30KKworc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpyZmluZChjb25zdCBTdHJpbmdQaWVjZSYgcywgc2l6ZV90eXBlIHBvcykgY29uc3QgeworICBpZiAobGVuZ3RoXyA8IHMubGVuZ3RoXykgcmV0dXJuIG5wb3M7CisgIGNvbnN0IHNpemVfdCB1bGVuID0gbGVuZ3RoXzsKKyAgaWYgKHMubGVuZ3RoXyA9PSAwKSByZXR1cm4gc3RkOjptaW4odWxlbiwgcG9zKTsKKworICBjb25zdCBjaGFyKiBsYXN0ID0gcHRyXyArIHN0ZDo6bWluKHVsZW4gLSBzLmxlbmd0aF8sIHBvcykgKyBzLmxlbmd0aF87CisgIGNvbnN0IGNoYXIqIHJlc3VsdCA9IHN0ZDo6ZmluZF9lbmQocHRyXywgbGFzdCwgcy5wdHJfLCBzLnB0cl8gKyBzLmxlbmd0aF8pOworICByZXR1cm4gcmVzdWx0ICE9IGxhc3QgPyByZXN1bHQgLSBwdHJfIDogbnBvczsKK30KKworc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpyZmluZChjaGFyIGMsIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKKyAgaWYgKGxlbmd0aF8gPD0gMCkgcmV0dXJuIG5wb3M7CisgIGZvciAoaW50IGkgPSBzdGQ6Om1pbihwb3MsIHN0YXRpY19jYXN0PHNpemVfdHlwZT4obGVuZ3RoXyAtIDEpKTsKKyAgICAgICBpID49IDA7IC0taSkgeworICAgIGlmIChwdHJfW2ldID09IGMpIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorICByZXR1cm4gbnBvczsKK30KKworLy8gRm9yIGVhY2ggY2hhcmFjdGVyIGluIGNoYXJhY3RlcnNfd2FudGVkLCBzZXRzIHRoZSBpbmRleCBjb3JyZXNwb25kaW5nCisvLyB0byB0aGUgQVNDSUkgY29kZSBvZiB0aGF0IGNoYXJhY3RlciB0byAxIGluIHRhYmxlLiAgVGhpcyBpcyB1c2VkIGJ5CisvLyB0aGUgZmluZF8uKl9vZiBtZXRob2RzIGJlbG93IHRvIHRlbGwgd2hldGhlciBvciBub3QgYSBjaGFyYWN0ZXIgaXMgaW4KKy8vIHRoZSBsb29rdXAgdGFibGUgaW4gY29uc3RhbnQgdGltZS4KKy8vIFRoZSBhcmd1bWVudCBgdGFibGUnIG11c3QgYmUgYW4gYXJyYXkgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwKKy8vIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgYW4gdW5zaWduZWQgY2hhci4gIFRodXMgaXQgc2hvdWxkIGJlIGJlIGRlY2xhcmVkCisvLyBhcyBmb2xsb3dzOgorLy8gICBib29sIHRhYmxlW1VDSEFSX01BWCArIDFdCitzdGF0aWMgaW5saW5lIHZvaWQgQnVpbGRMb29rdXBUYWJsZShjb25zdCBTdHJpbmdQaWVjZSYgY2hhcmFjdGVyc193YW50ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB0YWJsZSkgeworICBjb25zdCBzaXplX3R5cGUgbGVuZ3RoID0gY2hhcmFjdGVyc193YW50ZWQubGVuZ3RoKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGRhdGEgPSBjaGFyYWN0ZXJzX3dhbnRlZC5kYXRhKCk7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICB0YWJsZVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihkYXRhW2ldKV0gPSB0cnVlOworICB9Cit9CisKK3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9maXJzdF9vZihjb25zdCBTdHJpbmdQaWVjZSYgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIGlmIChsZW5ndGhfID09IDAgfHwgcy5sZW5ndGhfID09IDApCisgICAgcmV0dXJuIG5wb3M7CisKKyAgLy8gQXZvaWQgdGhlIGNvc3Qgb2YgQnVpbGRMb29rdXBUYWJsZSgpIGZvciBhIHNpbmdsZS1jaGFyYWN0ZXIgc2VhcmNoLgorICBpZiAocy5sZW5ndGhfID09IDEpCisgICAgcmV0dXJuIGZpbmRfZmlyc3Rfb2Yocy5wdHJfWzBdLCBwb3MpOworCisgIGJvb2wgbG9va3VwW1VDSEFSX01BWCArIDFdID0geyBmYWxzZSB9OworICBCdWlsZExvb2t1cFRhYmxlKHMsIGxvb2t1cCk7CisgIGZvciAoc2l6ZV90eXBlIGkgPSBwb3M7IGkgPCBsZW5ndGhfOyArK2kpIHsKKyAgICBpZiAobG9va3VwW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHB0cl9baV0pXSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIHJldHVybiBucG9zOworfQorCitzaXplX3R5cGUgU3RyaW5nUGllY2U6OmZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IFN0cmluZ1BpZWNlJiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIGlmIChsZW5ndGhfID09IDApCisgICAgcmV0dXJuIG5wb3M7CisKKyAgaWYgKHMubGVuZ3RoXyA9PSAwKQorICAgIHJldHVybiAwOworCisgIC8vIEF2b2lkIHRoZSBjb3N0IG9mIEJ1aWxkTG9va3VwVGFibGUoKSBmb3IgYSBzaW5nbGUtY2hhcmFjdGVyIHNlYXJjaC4KKyAgaWYgKHMubGVuZ3RoXyA9PSAxKQorICAgIHJldHVybiBmaW5kX2ZpcnN0X25vdF9vZihzLnB0cl9bMF0sIHBvcyk7CisKKyAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07CisgIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKKyAgZm9yIChzaXplX3R5cGUgaSA9IHBvczsgaSA8IGxlbmd0aF87ICsraSkgeworICAgIGlmICghbG9va3VwW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHB0cl9baV0pXSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIHJldHVybiBucG9zOworfQorCitzaXplX3R5cGUgU3RyaW5nUGllY2U6OmZpbmRfZmlyc3Rfbm90X29mKGNoYXIgYywgc2l6ZV90eXBlIHBvcykgY29uc3QgeworICBpZiAobGVuZ3RoXyA9PSAwKQorICAgIHJldHVybiBucG9zOworCisgIGZvciAoOyBwb3MgPCBsZW5ndGhfOyArK3BvcykgeworICAgIGlmIChwdHJfW3Bvc10gIT0gYykgeworICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5wb3M7Cit9CisKK3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9sYXN0X29mKGNvbnN0IFN0cmluZ1BpZWNlJiBzLCBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIGlmIChsZW5ndGhfID09IDAgfHwgcy5sZW5ndGhfID09IDApCisgICAgcmV0dXJuIG5wb3M7CisKKyAgLy8gQXZvaWQgdGhlIGNvc3Qgb2YgQnVpbGRMb29rdXBUYWJsZSgpIGZvciBhIHNpbmdsZS1jaGFyYWN0ZXIgc2VhcmNoLgorICBpZiAocy5sZW5ndGhfID09IDEpCisgICAgcmV0dXJuIGZpbmRfbGFzdF9vZihzLnB0cl9bMF0sIHBvcyk7CisKKyAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07CisgIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKKyAgZm9yIChzaXplX3R5cGUgaSA9IHN0ZDo6bWluKHBvcywgbGVuZ3RoXyAtIDEpOyA7IC0taSkgeworICAgIGlmIChsb29rdXBbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocHRyX1tpXSldKQorICAgICAgcmV0dXJuIGk7CisgICAgaWYgKGkgPT0gMCkKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBucG9zOworfQorCitzaXplX3R5cGUgU3RyaW5nUGllY2U6OmZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgU3RyaW5nUGllY2UmIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgeworICBpZiAobGVuZ3RoXyA9PSAwKQorICAgIHJldHVybiBucG9zOworCisgIHNpemVfdHlwZSBpID0gc3RkOjptaW4ocG9zLCBsZW5ndGhfIC0gMSk7CisgIGlmIChzLmxlbmd0aF8gPT0gMCkKKyAgICByZXR1cm4gaTsKKworICAvLyBBdm9pZCB0aGUgY29zdCBvZiBCdWlsZExvb2t1cFRhYmxlKCkgZm9yIGEgc2luZ2xlLWNoYXJhY3RlciBzZWFyY2guCisgIGlmIChzLmxlbmd0aF8gPT0gMSkKKyAgICByZXR1cm4gZmluZF9sYXN0X25vdF9vZihzLnB0cl9bMF0sIHBvcyk7CisKKyAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07CisgIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKKyAgZm9yICg7IDsgLS1pKSB7CisgICAgaWYgKCFsb29rdXBbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocHRyX1tpXSldKQorICAgICAgcmV0dXJuIGk7CisgICAgaWYgKGkgPT0gMCkKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBucG9zOworfQorCitzaXplX3R5cGUgU3RyaW5nUGllY2U6OmZpbmRfbGFzdF9ub3Rfb2YoY2hhciBjLCBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIGlmIChsZW5ndGhfID09IDApCisgICAgcmV0dXJuIG5wb3M7CisKKyAgZm9yIChzaXplX3R5cGUgaSA9IHN0ZDo6bWluKHBvcywgbGVuZ3RoXyAtIDEpOyA7IC0taSkgeworICAgIGlmIChwdHJfW2ldICE9IGMpCisgICAgICByZXR1cm4gaTsKKyAgICBpZiAoaSA9PSAwKQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG5wb3M7Cit9CisKK1N0cmluZ1BpZWNlIFN0cmluZ1BpZWNlOjpzdWJzdHIoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0IHsKKyAgaWYgKHBvcyA+IGxlbmd0aF8pIHBvcyA9IGxlbmd0aF87CisgIGlmIChuID4gbGVuZ3RoXyAtIHBvcykgbiA9IGxlbmd0aF8gLSBwb3M7CisgIHJldHVybiBTdHJpbmdQaWVjZShwdHJfICsgcG9zLCBuKTsKK30KKworY29uc3Qgc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpucG9zID0gc2l6ZV90eXBlKC0xKTsKKworI2VuZGlmIC8vICFIQVZFX0lDVQpkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvc3RyaW5nX3BpZWNlLmhoIGIvc3JjL2tlbmxtL3V0aWwvc3RyaW5nX3BpZWNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNDc5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJpbmdfcGllY2UuaGgKQEAgLTAsMCArMSwyNzAgQEAKKy8qIElmIHlvdSB1c2UgSUNVIGluIHlvdXIgcHJvZ3JhbSwgdGhlbiBjb21waWxlIHdpdGggLURIQVZFX0lDVSAtbGljdWkxOG4uICBJZgorICogeW91IGRvbid0IHVzZSBJQ1UsIHRoZW4gdGhpcyB3aWxsIHVzZSB0aGUgR29vZ2xlIGltcGxlbWVudGF0aW9uIGZyb20gQ2hyb21lLgorICogVGhpcyBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHRvIGxldCB5b3UgY2hvb3NlLgorICovCisKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vIENvcGllZCBmcm9tIHN0cmluZ3Mvc3RyaW5ncGllY2UuaCB3aXRoIG1vZGlmaWNhdGlvbnMKKy8vCisvLyBBIHN0cmluZy1saWtlIG9iamVjdCB0aGF0IHBvaW50cyB0byBhIHNpemVkIHBpZWNlIG9mIG1lbW9yeS4KKy8vCisvLyBGdW5jdGlvbnMgb3IgbWV0aG9kcyBtYXkgdXNlIGNvbnN0IFN0cmluZ1BpZWNlJiBwYXJhbWV0ZXJzIHRvIGFjY2VwdCBlaXRoZXIKKy8vIGEgImNvbnN0IGNoYXIqIiBvciBhICJzdHJpbmciIHZhbHVlIHRoYXQgd2lsbCBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bworLy8gYSBTdHJpbmdQaWVjZS4gIFRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIG1lYW5zIHRoYXQgaXQgaXMgb2Z0ZW4gYXBwcm9wcmlhdGUKKy8vIHRvIGluY2x1ZGUgdGhpcyAuaCBmaWxlIGluIG90aGVyIGZpbGVzIHJhdGhlciB0aGFuIGZvcndhcmQtZGVjbGFyaW5nCisvLyBTdHJpbmdQaWVjZSBhcyB3b3VsZCBiZSBhcHByb3ByaWF0ZSBmb3IgbW9zdCBvdGhlciBHb29nbGUgY2xhc3Nlcy4KKy8vCisvLyBTeXN0ZW1hdGljIHVzYWdlIG9mIFN0cmluZ1BpZWNlIGlzIGVuY291cmFnZWQgYXMgaXQgd2lsbCByZWR1Y2UgdW5uZWNlc3NhcnkKKy8vIGNvbnZlcnNpb25zIGZyb20gImNvbnN0IGNoYXIqIiB0byAic3RyaW5nIiBhbmQgYmFjayBhZ2Fpbi4KKy8vCisKKyNpZm5kZWYgVVRJTF9TVFJJTkdfUElFQ0VfSAorI2RlZmluZSBVVElMX1NUUklOR19QSUVDRV9ICisKKyNpbmNsdWRlICJ1dGlsL2hhdmUuaGgiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxvc3RyZWFtPgorCisjaWZkZWYgSEFWRV9JQ1UKKyNpbmNsdWRlIDx1bmljb2RlL3N0cmluZ3BpZWNlLmg+CisjaW5jbHVkZSA8dW5pY29kZS91dmVyc2lvbi5oPgorCisvLyBPbGQgdmVyc2lvbnMgb2YgSUNVIGRvbid0IGRlZmluZSBvcGVyYXRvcj09IGFuZCBvcGVyYXRvciE9LgorI2lmIChVX0lDVV9WRVJTSU9OX01BSk9SX05VTSA8IDQpIHx8ICgoVV9JQ1VfVkVSU0lPTl9NQUpPUl9OVU0gPT0gNCkgJiYgKFVfSUNVX1ZFUlNJT05fTUlOT1JfTlVNIDwgNCkpCisjd2FybmluZyBZb3UgYXJlIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIG9mIElDVS4gIENvbnNpZGVyIHVwZ3JhZGluZyB0byBJQ1UgPj0gNC42LgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJpbmdQaWVjZSYgeCwgY29uc3QgU3RyaW5nUGllY2UmIHkpIHsKKyAgaWYgKHguc2l6ZSgpICE9IHkuc2l6ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gc3RkOjptZW1jbXAoeC5kYXRhKCksIHkuZGF0YSgpLCB4LnNpemUoKSkgPT0gMDsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJpbmdQaWVjZSYgeCwgY29uc3QgU3RyaW5nUGllY2UmIHkpIHsKKyAgcmV0dXJuICEoeCA9PSB5KTsKK30KKyNlbmRpZiAvLyBvbGQgdmVyc2lvbiBvZiBJQ1UKKworVV9OQU1FU1BBQ0VfQkVHSU4KKworaW5saW5lIGJvb2wgc3RhcnRzX3dpdGgoY29uc3QgU3RyaW5nUGllY2UmIGxvbmdlciwgY29uc3QgU3RyaW5nUGllY2UmIHByZWZpeCkgeworICBpbnQgbG9uZ2Vyc2l6ZSA9IGxvbmdlci5zaXplKCksIHByZWZpeHNpemUgPSBwcmVmaXguc2l6ZSgpOworICByZXR1cm4gbG9uZ2Vyc2l6ZSA+PSBwcmVmaXhzaXplICYmIHN0ZDo6bWVtY21wKGxvbmdlci5kYXRhKCksIHByZWZpeC5kYXRhKCksIHByZWZpeHNpemUpID09IDA7Cit9CisKKyNlbHNlCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworI2lmZGVmIFdJTjMyCisjdW5kZWYgbWF4CisjdW5kZWYgbWluCisjZW5kaWYKKworY2xhc3MgU3RyaW5nUGllY2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworCisgcHJpdmF0ZToKKyAgY29uc3QgY2hhciogICBwdHJfOworICBzaXplX3R5cGUgICAgIGxlbmd0aF87CisKKyBwdWJsaWM6CisgIC8vIFdlIHByb3ZpZGUgbm9uLWV4cGxpY2l0IHNpbmdsZXRvbiBjb25zdHJ1Y3RvcnMgc28gdXNlcnMgY2FuIHBhc3MKKyAgLy8gaW4gYSAiY29uc3QgY2hhcioiIG9yIGEgInN0cmluZyIgd2hlcmV2ZXIgYSAiU3RyaW5nUGllY2UiIGlzCisgIC8vIGV4cGVjdGVkLgorICBTdHJpbmdQaWVjZSgpIDogcHRyXyhOVUxMKSwgbGVuZ3RoXygwKSB7IH0KKyAgU3RyaW5nUGllY2UoY29uc3QgY2hhciogc3RyKQorICAgIDogcHRyXyhzdHIpLCBsZW5ndGhfKChzdHIgPT0gTlVMTCkgPyAwIDogc3RybGVuKHN0cikpIHsgfQorICBTdHJpbmdQaWVjZShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKQorICAgIDogcHRyXyhzdHIuZGF0YSgpKSwgbGVuZ3RoXyhzdHIuc2l6ZSgpKSB7IH0KKyAgU3RyaW5nUGllY2UoY29uc3QgY2hhciogb2Zmc2V0LCBzaXplX3R5cGUgbGVuKQorICAgIDogcHRyXyhvZmZzZXQpLCBsZW5ndGhfKGxlbikgeyB9CisKKyAgLy8gZGF0YSgpIG1heSByZXR1cm4gYSBwb2ludGVyIHRvIGEgYnVmZmVyIHdpdGggZW1iZWRkZWQgTlVMcywgYW5kIHRoZQorICAvLyByZXR1cm5lZCBidWZmZXIgbWF5IG9yIG1heSBub3QgYmUgbnVsbCB0ZXJtaW5hdGVkLiAgVGhlcmVmb3JlIGl0IGlzCisgIC8vIHR5cGljYWxseSBhIG1pc3Rha2UgdG8gcGFzcyBkYXRhKCkgdG8gYSByb3V0aW5lIHRoYXQgZXhwZWN0cyBhIE5VTAorICAvLyB0ZXJtaW5hdGVkIHN0cmluZy4KKyAgY29uc3QgY2hhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBsZW5ndGhfOyB9CisgIHNpemVfdHlwZSBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBsZW5ndGhfOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBsZW5ndGhfID09IDA7IH0KKworICB2b2lkIGNsZWFyKCkgeyBwdHJfID0gTlVMTDsgbGVuZ3RoXyA9IDA7IH0KKyAgdm9pZCBzZXQoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90eXBlIGxlbikgeyBwdHJfID0gZGF0YTsgbGVuZ3RoXyA9IGxlbjsgfQorICB2b2lkIHNldChjb25zdCBjaGFyKiBzdHIpIHsKKyAgICBwdHJfID0gc3RyOworICAgIGxlbmd0aF8gPSBzdHIgPyBzdHJsZW4oc3RyKSA6IDA7CisgIH0KKyAgdm9pZCBzZXQoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90eXBlIGxlbikgeworICAgIHB0cl8gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkYXRhKTsKKyAgICBsZW5ndGhfID0gbGVuOworICB9CisKKyAgY2hhciBvcGVyYXRvcltdKHNpemVfdHlwZSBpKSBjb25zdCB7IHJldHVybiBwdHJfW2ldOyB9CisKKyAgdm9pZCByZW1vdmVfcHJlZml4KHNpemVfdHlwZSBuKSB7CisgICAgcHRyXyArPSBuOworICAgIGxlbmd0aF8gLT0gbjsKKyAgfQorCisgIHZvaWQgcmVtb3ZlX3N1ZmZpeChzaXplX3R5cGUgbikgeworICAgIGxlbmd0aF8gLT0gbjsKKyAgfQorCisgIGludCBjb21wYXJlKGNvbnN0IFN0cmluZ1BpZWNlJiB4KSBjb25zdCB7CisgICAgaW50IHIgPSB3b3JkbWVtY21wKHB0cl8sIHgucHRyXywgc3RkOjptaW4obGVuZ3RoXywgeC5sZW5ndGhfKSk7CisgICAgaWYgKHIgPT0gMCkgeworICAgICAgaWYgKGxlbmd0aF8gPCB4Lmxlbmd0aF8pIHIgPSAtMTsKKyAgICAgIGVsc2UgaWYgKGxlbmd0aF8gPiB4Lmxlbmd0aF8pIHIgPSArMTsKKyAgICB9CisgICAgcmV0dXJuIHI7CisgIH0KKworICBzdGQ6OnN0cmluZyBhc19zdHJpbmcoKSBjb25zdCB7CisgICAgLy8gc3RkOjpzdHJpbmcgZG9lc24ndCBsaWtlIHRvIHRha2UgYSBOVUxMIHBvaW50ZXIgZXZlbiB3aXRoIGEgMCBzaXplLgorICAgIHJldHVybiBzdGQ6OnN0cmluZyghZW1wdHkoKSA/IGRhdGEoKSA6ICIiLCBzaXplKCkpOworICB9CisKKyAgdm9pZCBDb3B5VG9TdHJpbmcoc3RkOjpzdHJpbmcqIHRhcmdldCkgY29uc3Q7CisgIHZvaWQgQXBwZW5kVG9TdHJpbmcoc3RkOjpzdHJpbmcqIHRhcmdldCkgY29uc3Q7CisKKyAgLy8gRG9lcyAidGhpcyIgc3RhcnQgd2l0aCAieCIKKyAgYm9vbCBzdGFydHNfd2l0aChjb25zdCBTdHJpbmdQaWVjZSYgeCkgY29uc3QgeworICAgIHJldHVybiAoKGxlbmd0aF8gPj0geC5sZW5ndGhfKSAmJgorICAgICAgICAgICAgKHdvcmRtZW1jbXAocHRyXywgeC5wdHJfLCB4Lmxlbmd0aF8pID09IDApKTsKKyAgfQorCisgIC8vIERvZXMgInRoaXMiIGVuZCB3aXRoICJ4IgorICBib29sIGVuZHNfd2l0aChjb25zdCBTdHJpbmdQaWVjZSYgeCkgY29uc3QgeworICAgIHJldHVybiAoKGxlbmd0aF8gPj0geC5sZW5ndGhfKSAmJgorICAgICAgICAgICAgKHdvcmRtZW1jbXAocHRyXyArIChsZW5ndGhfLXgubGVuZ3RoXyksIHgucHRyXywgeC5sZW5ndGhfKSA9PSAwKSk7CisgIH0KKworICAvLyBzdGFuZGFyZCBTVEwgY29udGFpbmVyIGJvaWxlcnBsYXRlCisgIHR5cGVkZWYgY2hhciB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbnN0IGNoYXIqIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgY2hhciYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IGNoYXImIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5wb3M7CisgIHR5cGVkZWYgY29uc3QgY2hhciogY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3QgY2hhciogaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gcmV2ZXJzZV9pdGVyYXRvcjsKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHB0cl8gKyBsZW5ndGhfOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHB0cl8gKyBsZW5ndGhfKTsKKyAgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IocHRyXyk7CisgIH0KKworICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBsZW5ndGhfOyB9CisgIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIGxlbmd0aF87IH0KKworICBzaXplX3R5cGUgY29weShjaGFyKiBidWYsIHNpemVfdHlwZSBuLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisKKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgU3RyaW5nUGllY2UmIHMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKKyAgc2l6ZV90eXBlIGZpbmQoY2hhciBjLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisgIHNpemVfdHlwZSByZmluZChjb25zdCBTdHJpbmdQaWVjZSYgcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OworICBzaXplX3R5cGUgcmZpbmQoY2hhciBjLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7CisKKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY29uc3QgU3RyaW5nUGllY2UmIHMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY2hhciBjLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3QgeworICAgIHJldHVybiBmaW5kKGMsIHBvcyk7CisgIH0KKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IFN0cmluZ1BpZWNlJiBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjaGFyIGMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBTdHJpbmdQaWVjZSYgcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OworICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNoYXIgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gcmZpbmQoYywgcG9zKTsKKyAgfQorICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjb25zdCBTdHJpbmdQaWVjZSYgcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OworICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjaGFyIGMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKKworICBTdHJpbmdQaWVjZSBzdWJzdHIoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4gPSBucG9zKSBjb25zdDsKKworICBzdGF0aWMgaW50IHdvcmRtZW1jbXAoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogcDIsIHNpemVfdHlwZSBOKSB7CisgICAgcmV0dXJuIHN0ZDo6bWVtY21wKHAsIHAyLCBOKTsKKyAgfQorfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJpbmdQaWVjZSYgeCwgY29uc3QgU3RyaW5nUGllY2UmIHkpIHsKKyAgaWYgKHguc2l6ZSgpICE9IHkuc2l6ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gc3RkOjptZW1jbXAoeC5kYXRhKCksIHkuZGF0YSgpLCB4LnNpemUoKSkgPT0gMDsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJpbmdQaWVjZSYgeCwgY29uc3QgU3RyaW5nUGllY2UmIHkpIHsKKyAgcmV0dXJuICEoeCA9PSB5KTsKK30KKworaW5saW5lIGJvb2wgc3RhcnRzX3dpdGgoY29uc3QgU3RyaW5nUGllY2UmIGxvbmdlciwgY29uc3QgU3RyaW5nUGllY2UmIHByZWZpeCkgeworICByZXR1cm4gbG9uZ2VyLnN0YXJ0c193aXRoKHByZWZpeCk7Cit9CisKKyNlbmRpZiAvLyBIQVZFX0lDVSB1bmRlZmluZWQKKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN0cmluZ1BpZWNlJiB4LCBjb25zdCBTdHJpbmdQaWVjZSYgeSkgeworICBjb25zdCBpbnQgciA9IHN0ZDo6bWVtY21wKHguZGF0YSgpLCB5LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKHguc2l6ZSgpLCB5LnNpemUoKSkpOworICByZXR1cm4gKChyIDwgMCkgfHwgKChyID09IDApICYmICh4LnNpemUoKSA8IHkuc2l6ZSgpKSkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgU3RyaW5nUGllY2UmIHgsIGNvbnN0IFN0cmluZ1BpZWNlJiB5KSB7CisgIHJldHVybiB5IDwgeDsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBTdHJpbmdQaWVjZSYgeCwgY29uc3QgU3RyaW5nUGllY2UmIHkpIHsKKyAgcmV0dXJuICEoeCA+IHkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFN0cmluZ1BpZWNlJiB4LCBjb25zdCBTdHJpbmdQaWVjZSYgeSkgeworICByZXR1cm4gISh4IDwgeSk7Cit9CisKKy8vIGFsbG93IFN0cmluZ1BpZWNlIHRvIGJlIGxvZ2dlZCAobmVlZGVkIGZvciB1bml0IHRlc3RpbmcpLgoraW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG8sIGNvbnN0IFN0cmluZ1BpZWNlJiBwaWVjZSkgeworICByZXR1cm4gby53cml0ZShwaWVjZS5kYXRhKCksIHN0YXRpY19jYXN0PHN0ZDo6c3RyZWFtc2l6ZT4ocGllY2Uuc2l6ZSgpKSk7Cit9CisKKyNpZmRlZiBIQVZFX0lDVQorVV9OQU1FU1BBQ0VfRU5ECit1c2luZyBVX05BTUVTUEFDRV9RVUFMSUZJRVIgU3RyaW5nUGllY2U7CisjZW5kaWYKKworI2VuZGlmICAvLyBVVElMX1NUUklOR19QSUVDRV9ICmRpZmYgLS1naXQgYS9zcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJpbmdfcGllY2VfaGFzaC5oaCBiL3NyYy9rZW5sbS91dGlsL3N0cmluZ19waWVjZV9oYXNoLmhoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvam9zaHVhL2RlY29kZXIvZmYvbG0va2VubG0vdXRpbC9zdHJpbmdfcGllY2VfaGFzaC5oaApyZW5hbWUgdG8gc3JjL2tlbmxtL3V0aWwvc3RyaW5nX3BpZWNlX2hhc2guaGgKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3N0cmluZ19zdHJlYW0uaGggYi9zcmMva2VubG0vdXRpbC9zdHJpbmdfc3RyZWFtLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMDQwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vdXRpbC9zdHJpbmdfc3RyZWFtLmhoCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgVVRJTF9TVFJJTkdfU1RSRUFNX0gKKyNkZWZpbmUgVVRJTF9TVFJJTkdfU1RSRUFNX0gKKworI2luY2x1ZGUgInV0aWwvZmFrZV9vc3RyZWFtLmhoIgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSB1dGlsIHsKKworY2xhc3MgU3RyaW5nU3RyZWFtIDogcHVibGljIEZha2VPU3RyZWFtPFN0cmluZ1N0cmVhbT4geworICBwdWJsaWM6CisgICAgLy8gU2VtYW50aWNzOiBhcHBlbmRzIHRvIHN0cmluZy4gIFJlbWVtYmVyIHRvIGNsZWFyIGZpcnN0IQorICAgIGV4cGxpY2l0IFN0cmluZ1N0cmVhbShzdGQ6OnN0cmluZyAmb3V0KQorICAgICAgOiBvdXRfKG91dCkge30KKworICAgIFN0cmluZ1N0cmVhbSAmZmx1c2goKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgU3RyaW5nU3RyZWFtICZ3cml0ZShjb25zdCB2b2lkICpkYXRhLCBzdGQ6OnNpemVfdCBsZW5ndGgpIHsKKyAgICAgIG91dF8uYXBwZW5kKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgbGVuZ3RoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGZyaWVuZCBjbGFzcyBGYWtlT1N0cmVhbTxTdHJpbmdTdHJlYW0+OworICAgIGNoYXIgKkVuc3VyZShzdGQ6OnNpemVfdCBhbW91bnQpIHsKKyAgICAgIHN0ZDo6c2l6ZV90IGN1cnJlbnQgPSBvdXRfLnNpemUoKTsKKyAgICAgIG91dF8ucmVzaXplKG91dF8uc2l6ZSgpICsgYW1vdW50KTsKKyAgICAgIHJldHVybiAmb3V0X1tjdXJyZW50XTsKKyAgICB9CisKKyAgICB2b2lkIEFkdmFuY2VUbyhjaGFyICp0bykgeworICAgICAgYXNzZXJ0KHRvIDw9ICYqb3V0Xy5lbmQoKSk7CisgICAgICBhc3NlcnQodG8gPj0gJipvdXRfLmJlZ2luKCkpOworICAgICAgb3V0Xy5yZXNpemUodG8gLSAmKm91dF8uYmVnaW4oKSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgJm91dF87Cit9OworCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gVVRJTF9TVFJJTkdfU1RSRUFNX0gKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3N0cmluZ19zdHJlYW1fdGVzdC5jYyBiL3NyYy9rZW5sbS91dGlsL3N0cmluZ19zdHJlYW1fdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTc3MzRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvc3RyaW5nX3N0cmVhbV90ZXN0LmNjCkBAIC0wLDAgKzEsODAgQEAKKyNkZWZpbmUgQk9PU1RfTEVYSUNBTF9DQVNUX0FTU1VNRV9DX0xPQ0FMRQorI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBGYWtlT1N0cmVhbVRlc3QKKworI2luY2x1ZGUgInV0aWwvc3RyaW5nX3N0cmVhbS5oaCIKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgdXRpbCB7IG5hbWVzcGFjZSB7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIFRlc3RFcXVhbChjb25zdCBUIHZhbHVlKSB7CisgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgU3RyaW5nU3RyZWFtKHN0cikgPDwgdmFsdWU7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHZhbHVlKSwgc3RyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgVGVzdENvcm5lcnMoKSB7CisgIFRlc3RFcXVhbChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSk7CisgIFRlc3RFcXVhbChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptaW4oKSk7CisgIFRlc3RFcXVhbChzdGF0aWNfY2FzdDxUPigwKSk7CisgIFRlc3RFcXVhbChzdGF0aWNfY2FzdDxUPigtMSkpOworICBUZXN0RXF1YWwoc3RhdGljX2Nhc3Q8VD4oMSkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShJbnRlZ2VyKSB7CisgIFRlc3RDb3JuZXJzPGNoYXI+KCk7CisgIFRlc3RDb3JuZXJzPHNpZ25lZCBjaGFyPigpOworICBUZXN0Q29ybmVyczx1bnNpZ25lZCBjaGFyPigpOworCisgIFRlc3RDb3JuZXJzPHNob3J0PigpOworICBUZXN0Q29ybmVyczxzaWduZWQgc2hvcnQ+KCk7CisgIFRlc3RDb3JuZXJzPHVuc2lnbmVkIHNob3J0PigpOworCisgIFRlc3RDb3JuZXJzPGludD4oKTsKKyAgVGVzdENvcm5lcnM8dW5zaWduZWQgaW50PigpOworICBUZXN0Q29ybmVyczxzaWduZWQgaW50PigpOworCisgIFRlc3RDb3JuZXJzPGxvbmc+KCk7CisgIFRlc3RDb3JuZXJzPHVuc2lnbmVkIGxvbmc+KCk7CisgIFRlc3RDb3JuZXJzPHNpZ25lZCBsb25nPigpOworCisgIFRlc3RDb3JuZXJzPGxvbmcgbG9uZz4oKTsKKyAgVGVzdENvcm5lcnM8dW5zaWduZWQgbG9uZyBsb25nPigpOworICBUZXN0Q29ybmVyczxzaWduZWQgbG9uZyBsb25nPigpOworCisgIFRlc3RDb3JuZXJzPHN0ZDo6c2l6ZV90PigpOworfQorCitlbnVtIFRpbnlFbnVtIHsgRW51bVZhbHVlIH07CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVudW1DYXNlKSB7CisgIFRlc3RFcXVhbChFbnVtVmFsdWUpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTdHJpbmdzKSB7CisgIFRlc3RFcXVhbCgiZm9vIik7CisgIGNvbnN0IGNoYXIgKmEgPSAiYmFyIjsKKyAgVGVzdEVxdWFsKGEpOworICBTdHJpbmdQaWVjZSBwaWVjZSgiYWJjZGVmIik7CisgIFRlc3RFcXVhbChwaWVjZSk7CisgIFRlc3RFcXVhbChTdHJpbmdQaWVjZSgpKTsKKworICBjaGFyIG5vbl9jb25zdFszXTsKKyAgbm9uX2NvbnN0WzBdID0gJ2InOworICBub25fY29uc3RbMV0gPSAnYyc7CisgIG5vbl9jb25zdFsyXSA9IDA7CisgIHN0ZDo6c3RyaW5nIG91dDsKKyAgU3RyaW5nU3RyZWFtKG91dCkgPDwgImEiIDw8IG5vbl9jb25zdCA8PCAnYyc7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCJhYmNjIiwgb3V0KTsKKworICAvLyBOb3cgdGVzdCBhcyBhIHNlcGFyYXRlIG9iamVjdC4KKyAgb3V0LmNsZWFyKCk7CisgIFN0cmluZ1N0cmVhbSBzdHJlYW0ob3V0KTsKKyAgc3RyZWFtIDw8ICJhIiA8PCBub25fY29uc3QgPDwgJ2MnIDw8IHBpZWNlOworICBCT09TVF9DSEVDS19FUVVBTCgiYWJjY2FiY2RlZiIsIG91dCk7Cit9CisKK319IC8vIG5hbWVzcGFjZXMKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3RocmVhZF9wb29sLmhoIGIvc3JjL2tlbmxtL3V0aWwvdGhyZWFkX3Bvb2wuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlOTg3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3RocmVhZF9wb29sLmhoCkBAIC0wLDAgKzEsOTQgQEAKKyNpZm5kZWYgVVRJTF9USFJFQURfUE9PTF9ICisjZGVmaW5lIFVUSUxfVEhSRUFEX1BPT0xfSAorCisjaW5jbHVkZSAidXRpbC9wY3F1ZXVlLmhoIgorCisjaW5jbHVkZSA8Ym9vc3QvcHRyX2NvbnRhaW5lci9wdHJfdmVjdG9yLmhwcD4KKyNpbmNsdWRlIDxib29zdC9vcHRpb25hbC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGNzdGRsaWI+CisKK25hbWVzcGFjZSB1dGlsIHsKKwordGVtcGxhdGUgPGNsYXNzIEhhbmRsZXJUPiBjbGFzcyBXb3JrZXIgOiBib29zdDo6bm9uY29weWFibGUgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBIYW5kbGVyVCBIYW5kbGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgSGFuZGxlcjo6UmVxdWVzdCBSZXF1ZXN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIENvbnN0cnVjdD4gV29ya2VyKFBDUXVldWU8UmVxdWVzdD4gJmluLCBDb25zdHJ1Y3QgJmNvbnN0cnVjdCwgY29uc3QgUmVxdWVzdCAmcG9pc29uKQorICAgICAgOiBpbl8oaW4pLCBoYW5kbGVyXyhjb25zdHJ1Y3QpLCBwb2lzb25fKHBvaXNvbiksIHRocmVhZF8oYm9vc3Q6OnJlZigqdGhpcykpIHt9CisKKyAgICAvLyBPbmx5IGNhbGwgZnJvbSB0aHJlYWQuCisgICAgdm9pZCBvcGVyYXRvcigpKCkgeworICAgICAgUmVxdWVzdCByZXF1ZXN0OworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW5fLkNvbnN1bWUocmVxdWVzdCk7CisgICAgICAgIGlmIChyZXF1ZXN0ID09IHBvaXNvbl8pIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAoKmhhbmRsZXJfKShyZXF1ZXN0KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmZSkgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiSGFuZGxlciB0aHJldyAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKC4uLikgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiSGFuZGxlciB0aHJldyBhbiBleGNlcHRpb24sIGRyb3BwaW5nIHJlcXVlc3QiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBKb2luKCkgeworICAgICAgdGhyZWFkXy5qb2luKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgUENRdWV1ZTxSZXF1ZXN0PiAmaW5fOworCisgICAgYm9vc3Q6Om9wdGlvbmFsPEhhbmRsZXI+IGhhbmRsZXJfOworCisgICAgY29uc3QgUmVxdWVzdCBwb2lzb25fOworCisgICAgYm9vc3Q6OnRocmVhZCB0aHJlYWRfOworfTsKKwordGVtcGxhdGUgPGNsYXNzIEhhbmRsZXJUPiBjbGFzcyBUaHJlYWRQb29sIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgSGFuZGxlclQgSGFuZGxlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEhhbmRsZXI6OlJlcXVlc3QgUmVxdWVzdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBDb25zdHJ1Y3Q+IFRocmVhZFBvb2woc2l6ZV90IHF1ZXVlX2xlbmd0aCwgc2l6ZV90IHdvcmtlcnMsIENvbnN0cnVjdCBoYW5kbGVyX2NvbnN0cnVjdCwgUmVxdWVzdCBwb2lzb24pIDogaW5fKHF1ZXVlX2xlbmd0aCksIHBvaXNvbl8ocG9pc29uKSB7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmtlcnM7ICsraSkgeworICAgICAgICB3b3JrZXJzXy5wdXNoX2JhY2sobmV3IFdvcmtlcjxIYW5kbGVyPihpbl8sIGhhbmRsZXJfY29uc3RydWN0LCBwb2lzb24pKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB+VGhyZWFkUG9vbCgpIHsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd29ya2Vyc18uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUHJvZHVjZShwb2lzb25fKTsKKyAgICAgIH0KKyAgICAgIGZvciAodHlwZW5hbWUgYm9vc3Q6OnB0cl92ZWN0b3I8V29ya2VyPEhhbmRsZXI+ID46Oml0ZXJhdG9yIGkgPSB3b3JrZXJzXy5iZWdpbigpOyBpICE9IHdvcmtlcnNfLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaS0+Sm9pbigpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgUHJvZHVjZShjb25zdCBSZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgICBpbl8uUHJvZHVjZShyZXF1ZXN0KTsKKyAgICB9CisKKyAgICAvLyBGb3IgYWRkaW5nIHRvIHRoZSBxdWV1ZS4KKyAgICBQQ1F1ZXVlPFJlcXVlc3Q+ICZJbigpIHsgcmV0dXJuIGluXzsgfQorCisgIHByaXZhdGU6CisgICAgUENRdWV1ZTxSZXF1ZXN0PiBpbl87CisKKyAgICBib29zdDo6cHRyX3ZlY3RvcjxXb3JrZXI8SGFuZGxlcj4gPiB3b3JrZXJzXzsKKworICAgIFJlcXVlc3QgcG9pc29uXzsKK307CisKK30gLy8gbmFtZXNwYWNlIHV0aWwKKworI2VuZGlmIC8vIFVUSUxfVEhSRUFEX1BPT0xfSApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvdG9rZW5pemVfcGllY2UuaGggYi9zcmMva2VubG0vdXRpbC90b2tlbml6ZV9waWVjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGE1ZmEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvdG9rZW5pemVfcGllY2UuaGgKQEAgLTAsMCArMSwxNTAgQEAKKyNpZm5kZWYgVVRJTF9UT0tFTklaRV9QSUVDRV9ICisjZGVmaW5lIFVUSUxfVE9LRU5JWkVfUElFQ0VfSAorCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaGgiCisjaW5jbHVkZSAidXRpbC9zdHJpbmdfcGllY2UuaGgiCisKKyNpbmNsdWRlIDxib29zdC9pdGVyYXRvci9pdGVyYXRvcl9mYWNhZGUuaHBwPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSB1dGlsIHsKKworLy8gVGhyb3duIG9uIGRlcmVmZXJlbmNlIHdoZW4gb3V0IG9mIHRva2VucyB0byBwYXJzZQorY2xhc3MgT3V0T2ZUb2tlbnMgOiBwdWJsaWMgRXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIE91dE9mVG9rZW5zKCkgdGhyb3coKSB7fQorICAgIH5PdXRPZlRva2VucygpIHRocm93KCkge30KK307CisKK2NsYXNzIFNpbmdsZUNoYXJhY3RlciB7CisgIHB1YmxpYzoKKyAgICBTaW5nbGVDaGFyYWN0ZXIoKSB7fQorICAgIGV4cGxpY2l0IFNpbmdsZUNoYXJhY3RlcihjaGFyIGRlbGltKSA6IGRlbGltXyhkZWxpbSkge30KKworICAgIFN0cmluZ1BpZWNlIEZpbmQoY29uc3QgU3RyaW5nUGllY2UgJmluKSBjb25zdCB7CisgICAgICByZXR1cm4gU3RyaW5nUGllY2Uoc3RkOjpmaW5kKGluLmRhdGEoKSwgaW4uZGF0YSgpICsgaW4uc2l6ZSgpLCBkZWxpbV8pLCAxKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjaGFyIGRlbGltXzsKK307CisKK2NsYXNzIE11bHRpQ2hhcmFjdGVyIHsKKyAgcHVibGljOgorICAgIE11bHRpQ2hhcmFjdGVyKCkge30KKworICAgIGV4cGxpY2l0IE11bHRpQ2hhcmFjdGVyKGNvbnN0IFN0cmluZ1BpZWNlICZkZWxpbWl0ZXIpIDogZGVsaW1pdGVyXyhkZWxpbWl0ZXIpIHt9CisKKyAgICBTdHJpbmdQaWVjZSBGaW5kKGNvbnN0IFN0cmluZ1BpZWNlICZpbikgY29uc3QgeworICAgICAgcmV0dXJuIFN0cmluZ1BpZWNlKHN0ZDo6c2VhcmNoKGluLmRhdGEoKSwgaW4uZGF0YSgpICsgaW4uc2l6ZSgpLCBkZWxpbWl0ZXJfLmRhdGEoKSwgZGVsaW1pdGVyXy5kYXRhKCkgKyBkZWxpbWl0ZXJfLnNpemUoKSksIGRlbGltaXRlcl8uc2l6ZSgpKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBTdHJpbmdQaWVjZSBkZWxpbWl0ZXJfOworfTsKKworY2xhc3MgQW55Q2hhcmFjdGVyIHsKKyAgcHVibGljOgorICAgIEFueUNoYXJhY3RlcigpIHt9CisgICAgZXhwbGljaXQgQW55Q2hhcmFjdGVyKGNvbnN0IFN0cmluZ1BpZWNlICZjaGFycykgOiBjaGFyc18oY2hhcnMpIHt9CisKKyAgICBTdHJpbmdQaWVjZSBGaW5kKGNvbnN0IFN0cmluZ1BpZWNlICZpbikgY29uc3QgeworICAgICAgcmV0dXJuIFN0cmluZ1BpZWNlKHN0ZDo6ZmluZF9maXJzdF9vZihpbi5kYXRhKCksIGluLmRhdGEoKSArIGluLnNpemUoKSwgY2hhcnNfLmRhdGEoKSwgY2hhcnNfLmRhdGEoKSArIGNoYXJzXy5zaXplKCkpLCAxKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBTdHJpbmdQaWVjZSBjaGFyc187Cit9OworCitjbGFzcyBCb29sQ2hhcmFjdGVyIHsKKyAgcHVibGljOgorICAgIEJvb2xDaGFyYWN0ZXIoKSB7fQorCisgICAgZXhwbGljaXQgQm9vbENoYXJhY3Rlcihjb25zdCBib29sICpkZWxpbWl0ZXIpIHsgZGVsaW1pdGVyXyA9IGRlbGltaXRlcjsgfQorCisgICAgU3RyaW5nUGllY2UgRmluZChjb25zdCBTdHJpbmdQaWVjZSAmaW4pIGNvbnN0IHsKKyAgICAgIGZvciAoY29uc3QgY2hhciAqaSA9IGluLmRhdGEoKTsgaSAhPSBpbi5kYXRhKCkgKyBpbi5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoZGVsaW1pdGVyX1tzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigqaSldKSByZXR1cm4gU3RyaW5nUGllY2UoaSwgMSk7CisgICAgICB9CisgICAgICByZXR1cm4gU3RyaW5nUGllY2UoaW4uZGF0YSgpICsgaW4uc2l6ZSgpLCAwKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dW5zaWduZWQgTGVuZ3RoPiBzdGF0aWMgdm9pZCBCdWlsZChjb25zdCBjaGFyICgmY2hhcmFjdGVycylbTGVuZ3RoXSwgYm9vbCAoJm91dClbMjU2XSkgeworICAgICAgbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworICAgICAgZm9yIChjb25zdCBjaGFyICppID0gY2hhcmFjdGVyczsgaSAhPSBjaGFyYWN0ZXJzICsgTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgb3V0W3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCppKV0gPSB0cnVlOworICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IGJvb2wgKmRlbGltaXRlcl87Cit9OworCitjbGFzcyBBbnlDaGFyYWN0ZXJMYXN0IHsKKyAgcHVibGljOgorICAgIEFueUNoYXJhY3Rlckxhc3QoKSB7fQorCisgICAgZXhwbGljaXQgQW55Q2hhcmFjdGVyTGFzdChjb25zdCBTdHJpbmdQaWVjZSAmY2hhcnMpIDogY2hhcnNfKGNoYXJzKSB7fQorCisgICAgU3RyaW5nUGllY2UgRmluZChjb25zdCBTdHJpbmdQaWVjZSAmaW4pIGNvbnN0IHsKKyAgICAgIHJldHVybiBTdHJpbmdQaWVjZShzdGQ6OmZpbmRfZW5kKGluLmRhdGEoKSwgaW4uZGF0YSgpICsgaW4uc2l6ZSgpLCBjaGFyc18uZGF0YSgpLCBjaGFyc18uZGF0YSgpICsgY2hhcnNfLnNpemUoKSksIDEpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFN0cmluZ1BpZWNlIGNoYXJzXzsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBGaW5kLCBib29sIFNraXBFbXB0eSA9IGZhbHNlPiBjbGFzcyBUb2tlbkl0ZXIgOiBwdWJsaWMgYm9vc3Q6Oml0ZXJhdG9yX2ZhY2FkZTxUb2tlbkl0ZXI8RmluZCwgU2tpcEVtcHR5PiwgY29uc3QgU3RyaW5nUGllY2UsIGJvb3N0Ojpmb3J3YXJkX3RyYXZlcnNhbF90YWc+IHsKKyAgcHVibGljOgorICAgIFRva2VuSXRlcigpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ29uc3RydWN0PiBUb2tlbkl0ZXIoY29uc3QgU3RyaW5nUGllY2UgJnN0ciwgY29uc3QgQ29uc3RydWN0ICZjb25zdHJ1Y3QpIDogYWZ0ZXJfKHN0ciksIGZpbmRlcl8oY29uc3RydWN0KSB7CisgICAgICBpbmNyZW1lbnQoKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjdXJyZW50Xy5kYXRhKCkgPT0gMDsKKyAgICB9CisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjdXJyZW50Xy5kYXRhKCkgIT0gMDsKKyAgICB9CisKKyAgICBzdGF0aWMgVG9rZW5JdGVyPEZpbmQsIFNraXBFbXB0eT4gZW5kKCkgeworICAgICAgcmV0dXJuIFRva2VuSXRlcjxGaW5kLCBTa2lwRW1wdHk+KCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIGJvb3N0OjppdGVyYXRvcl9jb3JlX2FjY2VzczsKKworICAgIHZvaWQgaW5jcmVtZW50KCkgeworICAgICAgZG8geworICAgICAgICBTdHJpbmdQaWVjZSBmb3VuZChmaW5kZXJfLkZpbmQoYWZ0ZXJfKSk7CisgICAgICAgIGN1cnJlbnRfID0gU3RyaW5nUGllY2UoYWZ0ZXJfLmRhdGEoKSwgZm91bmQuZGF0YSgpIC0gYWZ0ZXJfLmRhdGEoKSk7CisgICAgICAgIGlmIChmb3VuZC5kYXRhKCkgPT0gYWZ0ZXJfLmRhdGEoKSArIGFmdGVyXy5zaXplKCkpIHsKKyAgICAgICAgICBhZnRlcl8gPSBTdHJpbmdQaWVjZShOVUxMLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhZnRlcl8gPSBTdHJpbmdQaWVjZShmb3VuZC5kYXRhKCkgKyBmb3VuZC5zaXplKCksIGFmdGVyXy5kYXRhKCkgLSBmb3VuZC5kYXRhKCkgKyBhZnRlcl8uc2l6ZSgpIC0gZm91bmQuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoU2tpcEVtcHR5ICYmIGN1cnJlbnRfLmRhdGEoKSAmJiBjdXJyZW50Xy5lbXB0eSgpKTsgLy8gQ29tcGlsZXIgc2hvdWxkIG9wdGltaXplIHRoaXMgYXdheSBpZiBTa2lwRW1wdHkgaXMgZmFsc2UuCisgICAgfQorCisgICAgYm9vbCBlcXVhbChjb25zdCBUb2tlbkl0ZXI8RmluZCwgU2tpcEVtcHR5PiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjdXJyZW50Xy5kYXRhKCkgPT0gb3RoZXIuY3VycmVudF8uZGF0YSgpOworICAgIH0KKworICAgIGNvbnN0IFN0cmluZ1BpZWNlICZkZXJlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICAgIFVUSUxfVEhST1dfSUYoIWN1cnJlbnRfLmRhdGEoKSwgT3V0T2ZUb2tlbnMsICJSYW4gb3V0IG9mIHRva2VucyIpOworICAgICAgcmV0dXJuIGN1cnJlbnRfOworICAgIH0KKworICAgIFN0cmluZ1BpZWNlIGN1cnJlbnRfOworICAgIFN0cmluZ1BpZWNlIGFmdGVyXzsKKworICAgIEZpbmQgZmluZGVyXzsKK307CisKK30gLy8gbmFtZXNwYWNlIHV0aWwKKworI2VuZGlmIC8vIFVUSUxfVE9LRU5JWkVfUElFQ0VfSApkaWZmIC0tZ2l0IGEvc3JjL2pvc2h1YS9kZWNvZGVyL2ZmL2xtL2tlbmxtL3V0aWwvdG9rZW5pemVfcGllY2VfdGVzdC5jYyBiL3NyYy9rZW5sbS91dGlsL3Rva2VuaXplX3BpZWNlX3Rlc3QuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9qb3NodWEvZGVjb2Rlci9mZi9sbS9rZW5sbS91dGlsL3Rva2VuaXplX3BpZWNlX3Rlc3QuY2MKcmVuYW1lIHRvIHNyYy9rZW5sbS91dGlsL3Rva2VuaXplX3BpZWNlX3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS91dGlsL3VzYWdlLmNjIGIvc3JjL2tlbmxtL3V0aWwvdXNhZ2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlZmUyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS91dGlsL3VzYWdlLmNjCkBAIC0wLDAgKzEsMzA1IEBACisjaW5jbHVkZSAidXRpbC91c2FnZS5oaCIKKworI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmhoIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxjdGltZT4KKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisvLyBUaGlzIGNvZGUgbGlmdGVkIGZyb20gcGh5c21lbS5jIGluIGdudWxpYi4gIFNlZSB0aGUgY29weXJpZ2h0IHN0YXRlbWVudAorLy8gYmVsb3cuCisjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKy8qICBNRU1PUllTVEFUVVNFWCBpcyBtaXNzaW5nIGZyb20gb2xkZXIgd2luZG93cyBoZWFkZXJzLCBzbyBkZWZpbmUKKyAgICBhIGxvY2FsIHJlcGxhY2VtZW50LiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIERXT1JEIGR3TGVuZ3RoOworICBEV09SRCBkd01lbW9yeUxvYWQ7CisgIERXT1JETE9ORyB1bGxUb3RhbFBoeXM7CisgIERXT1JETE9ORyB1bGxBdmFpbFBoeXM7CisgIERXT1JETE9ORyB1bGxUb3RhbFBhZ2VGaWxlOworICBEV09SRExPTkcgdWxsQXZhaWxQYWdlRmlsZTsKKyAgRFdPUkRMT05HIHVsbFRvdGFsVmlydHVhbDsKKyAgRFdPUkRMT05HIHVsbEF2YWlsVmlydHVhbDsKKyAgRFdPUkRMT05HIHVsbEF2YWlsRXh0ZW5kZWRWaXJ0dWFsOworfSBsTUVNT1JZU1RBVFVTRVg7CisvLyBJcyB0aGlzIHJlYWxseSBzdXBwb3NlZCB0byBiZSBkZWZpbmVkIGxpa2UgdGhpcz8KK3R5cGVkZWYgaW50IFdJTkJPT0w7Cit0eXBlZGVmIFdJTkJPT0wgKFdJTkFQSSAqUEZOX01TX0VYKSAobE1FTU9SWVNUQVRVU0VYKik7CisjZWxzZQorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NQUNIX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19BUFBMRV9fKQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgeworCisjaWYgZGVmaW5lZChfX01BQ0hfXykKK3R5cGVkZWYgc3RydWN0IHRpbWV2YWwgV2FsbDsKK1dhbGwgR2V0V2FsbCgpIHsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworICByZXR1cm4gdHY7Cit9CisjZWxpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCit0eXBlZGVmIHRpbWVfdCBXYWxsOworV2FsbCBHZXRXYWxsKCkgeworICByZXR1cm4gdGltZShOVUxMKTsKK30KKyNlbHNlCit0eXBlZGVmIHN0cnVjdCB0aW1lc3BlYyBXYWxsOworV2FsbCBHZXRXYWxsKCkgeworICBXYWxsIHJldDsKKyAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZyZXQpOworICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKKy8vIGdjYyBwb3NzaWJsZS11bnVzZWQgZnVuY3Rpb24gZmxhZ3MKKyNpZmRlZiBfX0dOVUNfXworZG91YmxlIFN1YnRyYWN0KHRpbWVfdCBmaXJzdCwgdGltZV90IHNlY29uZCkgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworZG91YmxlIERvdWJsZVNlYyh0aW1lX3QgdHYpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU42NCkKK2RvdWJsZSBTdWJ0cmFjdChjb25zdCBzdHJ1Y3QgdGltZXZhbCAmZmlyc3QsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICZzZWNvbmQpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKK2RvdWJsZSBTdWJ0cmFjdChjb25zdCBzdHJ1Y3QgdGltZXNwZWMgJmZpcnN0LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgJnNlY29uZCkgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworZG91YmxlIERvdWJsZVNlYyhjb25zdCBzdHJ1Y3QgdGltZXZhbCAmdHYpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKK2RvdWJsZSBEb3VibGVTZWMoY29uc3Qgc3RydWN0IHRpbWVzcGVjICZ0dikgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworI2VuZGlmCisjZW5kaWYKKworLy8gU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgdXNlZCBvbiBzb21lIHBsYXRmb3Jtcy4KKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtZnVuY3Rpb24iCisjZW5kaWYKKy8vIFRoZXNlIGFsbCBhc3N1bWUgZmlyc3QgPiBzZWNvbmQKK2RvdWJsZSBTdWJ0cmFjdCh0aW1lX3QgZmlyc3QsIHRpbWVfdCBzZWNvbmQpIHsKKyAgcmV0dXJuIGRpZmZ0aW1lKGZpcnN0LCBzZWNvbmQpOworfQorZG91YmxlIERvdWJsZVNlYyh0aW1lX3QgdHYpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4odHYpOworfQorI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjY0KQorZG91YmxlIFN1YnRyYWN0KGNvbnN0IHN0cnVjdCB0aW1ldmFsICZmaXJzdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwgJnNlY29uZCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihmaXJzdC50dl9zZWMgLSBzZWNvbmQudHZfc2VjKSArIHN0YXRpY19jYXN0PGRvdWJsZT4oZmlyc3QudHZfdXNlYyAtIHNlY29uZC50dl91c2VjKSAvIDEwMDAwMDAuMDsKK30KK2RvdWJsZSBTdWJ0cmFjdChjb25zdCBzdHJ1Y3QgdGltZXNwZWMgJmZpcnN0LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgJnNlY29uZCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihmaXJzdC50dl9zZWMgLSBzZWNvbmQudHZfc2VjKSArIHN0YXRpY19jYXN0PGRvdWJsZT4oZmlyc3QudHZfbnNlYyAtIHNlY29uZC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDsKK30KK2RvdWJsZSBEb3VibGVTZWMoY29uc3Qgc3RydWN0IHRpbWV2YWwgJnR2KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KHR2LnR2X3NlYykgKyAoc3RhdGljX2Nhc3Q8ZG91YmxlPih0di50dl91c2VjKSAvIDEwMDAwMDAuMCk7Cit9Citkb3VibGUgRG91YmxlU2VjKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdHYpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4odHYudHZfc2VjKSArIChzdGF0aWNfY2FzdDxkb3VibGU+KHR2LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wKTsKK30KKyNlbmRpZgorI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKK2NsYXNzIFJlY29yZFN0YXJ0IHsKKyAgcHVibGljOgorICAgIFJlY29yZFN0YXJ0KCkgeworICAgICAgc3RhcnRlZF8gPSBHZXRXYWxsKCk7CisgICAgfQorCisgICAgY29uc3QgV2FsbCAmU3RhcnRlZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGFydGVkXzsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBXYWxsIHN0YXJ0ZWRfOworfTsKKworY29uc3QgUmVjb3JkU3RhcnQga1JlY29yZFN0YXJ0OworCitjb25zdCBjaGFyICpTa2lwU3BhY2VzKGNvbnN0IGNoYXIgKmF0KSB7CisgIGZvciAoOyAqYXQgPT0gJyAnIHx8ICphdCA9PSAnXHQnOyArK2F0KSB7fQorICByZXR1cm4gYXQ7Cit9Cit9IC8vIG5hbWVzcGFjZQorCitkb3VibGUgV2FsbFRpbWUoKSB7CisgIHJldHVybiBTdWJ0cmFjdChHZXRXYWxsKCksIGtSZWNvcmRTdGFydC5TdGFydGVkKCkpOworfQorCitkb3VibGUgQ1BVVGltZSgpIHsKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisgIHJldHVybiAwLjA7CisjZWxzZQorICBzdHJ1Y3QgcnVzYWdlIHVzYWdlOworICBpZiAoZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmdXNhZ2UpKQorICAgIHJldHVybiAwLjA7CisgIHJldHVybiBEb3VibGVTZWModXNhZ2UucnVfdXRpbWUpICsgRG91YmxlU2VjKHVzYWdlLnJ1X3N0aW1lKTsKKyNlbmRpZgorfQorCit1aW50NjRfdCBSU1NNYXgoKSB7CisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQorICByZXR1cm4gMDsKKyNlbHNlCisgIHN0cnVjdCBydXNhZ2UgdXNhZ2U7CisgIGlmIChnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZ1c2FnZSkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50NjRfdD4odXNhZ2UucnVfbWF4cnNzKSAqIDEwMjQ7CisjZW5kaWYKK30KKwordm9pZCBQcmludFVzYWdlKHN0ZDo6b3N0cmVhbSAmb3V0KSB7CisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpCisgIC8vIExpbnV4IGRvZXNuJ3Qgc2V0IG1lbW9yeSB1c2FnZSBpbiBnZXRydXNhZ2UgOi0oCisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBoZWFkZXJzOworICBoZWFkZXJzLmluc2VydCgiVm1QZWFrOiIpOworICBoZWFkZXJzLmluc2VydCgiVm1SU1M6Iik7CisgIGhlYWRlcnMuaW5zZXJ0KCJOYW1lOiIpOworCisgIHN0ZDo6aWZzdHJlYW0gc3RhdHVzKCIvcHJvYy9zZWxmL3N0YXR1cyIsIHN0ZDo6aW9zOjppbik7CisgIHN0ZDo6c3RyaW5nIGhlYWRlciwgdmFsdWU7CisgIHdoaWxlICgoc3RhdHVzID4+IGhlYWRlcikgJiYgZ2V0bGluZShzdGF0dXMsIHZhbHVlKSkgeworICAgIGlmIChoZWFkZXJzLmZpbmQoaGVhZGVyKSAhPSBoZWFkZXJzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgaGVhZGVyIDw8IFNraXBTcGFjZXModmFsdWUuY19zdHIoKSkgPDwgJ1x0JzsKKyAgICB9CisgIH0KKworICBzdHJ1Y3QgcnVzYWdlIHVzYWdlOworICBpZiAoZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmdXNhZ2UpKSB7CisgICAgcGVycm9yKCJnZXRydXNhZ2UiKTsKKyAgICByZXR1cm47CisgIH0KKyAgb3V0IDw8ICJSU1NNYXg6IiA8PCB1c2FnZS5ydV9tYXhyc3MgPDwgIiBrQiIgPDwgJ1x0JzsKKyAgb3V0IDw8ICJ1c2VyOiIgPDwgRG91YmxlU2VjKHVzYWdlLnJ1X3V0aW1lKSA8PCAiXHRzeXM6IiA8PCBEb3VibGVTZWModXNhZ2UucnVfc3RpbWUpIDw8ICdcdCc7CisgIG91dCA8PCAiQ1BVOiIgPDwgKERvdWJsZVNlYyh1c2FnZS5ydV91dGltZSkgKyBEb3VibGVTZWModXNhZ2UucnVfc3RpbWUpKTsKKyAgb3V0IDw8ICdcdCc7CisjZW5kaWYKKworICBvdXQgPDwgInJlYWw6IiA8PCBXYWxsVGltZSgpIDw8ICdcbic7Cit9CisKKy8qIEFkYXB0ZWQgZnJvbSBwaHlzbWVtLmMgaW4gZ251bGliIDgzMWI4NGM1OWVmNDEzYzU3YTM2YjY3MzQ0NDY3ZDY2YThhMmJhNzAgKi8KKy8qIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBwaHlzaWNhbCBtZW1vcnkuCisKKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxLCAyMDAzLCAyMDA1LTIwMDYsIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogV3JpdHRlbiBieSBQYXVsIEVnZ2VydC4gICovCit1aW50NjRfdCBHdWVzc1BoeXNpY2FsTWVtb3J5KCkgeworI2lmIGRlZmluZWQoX1NDX1BIWVNfUEFHRVMpICYmIGRlZmluZWQoX1NDX1BBR0VTSVpFKQorICB7CisgICAgbG9uZyBwYWdlcyA9IHN5c2NvbmYoX1NDX1BIWVNfUEFHRVMpOworICAgIGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworICAgIGlmIChwYWdlcyAhPSAtMSAmJiBwYWdlX3NpemUgIT0gLTEpCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHBhZ2VzKSAqIHN0YXRpY19jYXN0PHVpbnQ2NF90PihwYWdlX3NpemUpOworICB9CisjZW5kaWYKKyNpZmRlZiBIV19QSFlTTUVNCisgIHsgLyogVGhpcyB3b3JrcyBvbiAqYnNkIGFuZCBkYXJ3aW4uICAqLworICAgIHVuc2lnbmVkIGludCBwaHlzbWVtOworICAgIHNpemVfdCBsZW4gPSBzaXplb2YgcGh5c21lbTsKKyAgICBzdGF0aWMgaW50IG1pYlsyXSA9IHsgQ1RMX0hXLCBIV19QSFlTTUVNIH07CisKKyAgICBpZiAoc3lzY3RsIChtaWIsIHNpemVvZihtaWIpIC8gc2l6ZW9mKG1pYlswXSksICZwaHlzbWVtLCAmbGVuLCBOVUxMLCAwKSA9PSAwCisgICAgICAgICYmIGxlbiA9PSBzaXplb2YgKHBoeXNtZW0pKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90PihwaHlzbWVtKTsKKyAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisgIHsgLyogdGhpcyB3b3JrcyBvbiB3aW5kb3dzICovCisgICAgUEZOX01TX0VYIHBmbmV4OworICAgIEhNT0RVTEUgaCA9IEdldE1vZHVsZUhhbmRsZSAoVEVYVCgia2VybmVsMzIuZGxsIikpOworCisgICAgaWYgKCFoKQorICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiAgVXNlIEdsb2JhbE1lbW9yeVN0YXR1c0V4IGlmIGF2YWlsYWJsZS4gICovCisgICAgaWYgKChwZm5leCA9IChQRk5fTVNfRVgpIEdldFByb2NBZGRyZXNzIChoLCAiR2xvYmFsTWVtb3J5U3RhdHVzRXgiKSkpCisgICAgICB7CisgICAgICAgIGxNRU1PUllTVEFUVVNFWCBsbXNfZXg7CisgICAgICAgIGxtc19leC5kd0xlbmd0aCA9IHNpemVvZiBsbXNfZXg7CisgICAgICAgIGlmICghcGZuZXggKCZsbXNfZXgpKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gbG1zX2V4LnVsbFRvdGFsUGh5czsKKyAgICAgIH0KKworICAgIC8qICBGYWxsIGJhY2sgdG8gR2xvYmFsTWVtb3J5U3RhdHVzIHdoaWNoIGlzIGFsd2F5cyBhdmFpbGFibGUuCisgICAgICAgIGJ1dCByZXR1cm5zIHdyb25nIHJlc3VsdHMgZm9yIHBoeXNpY2FsIG1lbW9yeSA+IDRHQi4gICovCisgICAgZWxzZQorICAgICAgeworICAgICAgICBNRU1PUllTVEFUVVMgbXM7CisgICAgICAgIEdsb2JhbE1lbW9yeVN0YXR1cyAoJm1zKTsKKyAgICAgICAgcmV0dXJuIG1zLmR3VG90YWxQaHlzOworICAgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK25hbWVzcGFjZSB7CitjbGFzcyBTaXplUGFyc2VFcnJvciA6IHB1YmxpYyBFeGNlcHRpb24geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgU2l6ZVBhcnNlRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgdGhyb3coKSB7CisgICAgICAqdGhpcyA8PCAiRmFpbGVkIHRvIHBhcnNlICIgPDwgc3RyIDw8ICIgaW50byBhIG1lbW9yeSBzaXplICI7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIE51bT4gdWludDY0X3QgUGFyc2VOdW0oY29uc3Qgc3RkOjpzdHJpbmcgJmFyZykgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW0oYXJnKTsKKyAgTnVtIHZhbHVlOworICBzdHJlYW0gPj4gdmFsdWU7CisgIFVUSUxfVEhST1dfSUZfQVJHKCFzdHJlYW0sIFNpemVQYXJzZUVycm9yLCAoYXJnKSwgImZvciB0aGUgbGVhZGluZyBudW1iZXIuIik7CisgIHN0ZDo6c3RyaW5nIGFmdGVyOworICBzdHJlYW0gPj4gYWZ0ZXI7CisgIFVUSUxfVEhST1dfSUZfQVJHKGFmdGVyLnNpemUoKSA+IDEsIFNpemVQYXJzZUVycm9yLCAoYXJnKSwgImJlY2F1c2UgdGhlcmUgYXJlIG1vcmUgdGhhbiB0d28gY2hhcmFjdGVycyBhZnRlciB0aGUgbnVtYmVyLiIpOworICBzdGQ6OnN0cmluZyB0aHJvd2F3YXk7CisgIFVUSUxfVEhST1dfSUZfQVJHKHN0cmVhbSA+PiB0aHJvd2F3YXksIFNpemVQYXJzZUVycm9yLCAoYXJnKSwgImJlY2F1c2UgdGhlcmUgd2FzIG1vcmUgY3J1ZnQgIiA8PCB0aHJvd2F3YXkgPDwgIiBhZnRlciB0aGUgbnVtYmVyLiIpOworCisgIC8vIFNpbGx5IHNvcnQsIHVzaW5nIGtpbG9ieXRlcyBhcyB5b3VyIGRlZmF1bHQgdW5pdC4KKyAgaWYgKGFmdGVyLmVtcHR5KCkpIGFmdGVyID0gIksiOworICBpZiAoYWZ0ZXIgPT0gIiUiKSB7CisgICAgdWludDY0X3QgbWVtID0gR3Vlc3NQaHlzaWNhbE1lbW9yeSgpOworICAgIFVUSUxfVEhST1dfSUZfQVJHKCFtZW0sIFNpemVQYXJzZUVycm9yLCAoYXJnKSwgImJlY2F1c2UgJSB3YXMgc3BlY2lmaWVkIGJ1dCB0aGUgcGh5c2ljYWwgbWVtb3J5IHNpemUgY291bGQgbm90IGJlIGRldGVybWluZWQuIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSAqIHN0YXRpY19jYXN0PGRvdWJsZT4obWVtKSAvIDEwMC4wKTsKKyAgfQorCisgIGlmIChhZnRlciA9PSAiayIpIGFmdGVyID0gIksiOworICBzdGQ6OnN0cmluZyB1bml0cygiYktNR1RQRVpZIik7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaW5kZXggPSB1bml0cy5maW5kKGFmdGVyWzBdKTsKKyAgVVRJTF9USFJPV19JRl9BUkcoaW5kZXggPT0gc3RkOjpzdHJpbmc6Om5wb3MsIFNpemVQYXJzZUVycm9yLCAoYXJnKSwgInRoZSBhbGxvd2VkIHN1ZmZpeGVzIGFyZSAiIDw8IHVuaXRzIDw8ICIlLiIpOworICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBpbmRleDsgKytpKSB7CisgICAgdmFsdWUgKj0gMTAyNDsKKyAgfQorICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHZhbHVlKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKwordWludDY0X3QgUGFyc2VTaXplKGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcpIHsKKyAgcmV0dXJuIGFyZy5maW5kKCcuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgPyBQYXJzZU51bTxkb3VibGU+KGFyZykgOiBQYXJzZU51bTx1aW50NjRfdD4oYXJnKTsKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc3JjL2tlbmxtL3V0aWwvdXNhZ2UuaGggYi9zcmMva2VubG0vdXRpbC91c2FnZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjFiM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3V0aWwvdXNhZ2UuaGgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBVVElMX1VTQUdFX0gKKyNkZWZpbmUgVVRJTF9VU0FHRV9ICisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgdXRpbCB7CisvLyBUaW1lIGluIHNlY29uZHMgc2luY2UgcHJvY2VzcyBzdGFydGVkLiAgWmVybyBvbiB1bnN1cHBvcnRlZCBwbGF0Zm9ybXMuCitkb3VibGUgV2FsbFRpbWUoKTsKKworLy8gVXNlciArIHN5c3RlbSB0aW1lLgorZG91YmxlIENQVVRpbWUoKTsKKworLy8gUmVzaWRlbnQgdXNhZ2UgaW4gYnl0ZXMuCit1aW50NjRfdCBSU1NNYXgoKTsKKwordm9pZCBQcmludFVzYWdlKHN0ZDo6b3N0cmVhbSAmdG8pOworCisvLyBEZXRlcm1pbmUgaG93IG11Y2ggcGh5c2ljYWwgbWVtb3J5IHRoZXJlIGlzLiAgUmV0dXJuIDAgb24gZmFpbHVyZS4KK3VpbnQ2NF90IEd1ZXNzUGh5c2ljYWxNZW1vcnkoKTsKKworLy8gUGFyc2UgYSBzaXplIGxpa2UgdW5peCBzb3J0LiAgU2FkbHksIHRoaXMgbWVhbnMgdGhlIGRlZmF1bHQgbXVsdGlwbGllciBpcyBLLgordWludDY0X3QgUGFyc2VTaXplKGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcpOworCit9IC8vIG5hbWVzcGFjZSB1dGlsCisjZW5kaWYgLy8gVVRJTF9VU0FHRV9ICmRpZmYgLS1naXQgYS9zcmMva2VubG0vd2luZG93cy9idWlsZF9iaW5hcnkudmN4cHJvaiBiL3NyYy9rZW5sbS93aW5kb3dzL2J1aWxkX2JpbmFyeS52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMzFjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vd2luZG93cy9idWlsZF9iaW5hcnkudmN4cHJvagpAQCAtMCwwICsxLDE3NCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iMTIuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPns3MjZCODE0OS03RjU4LTQ0MTUtQkQ2NC05RURFQ0RGMzQwOUF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5idWlsZF9iaW5hcnk8L1Jvb3ROYW1lc3BhY2U+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPg0KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTIwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPg0KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTIwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTIwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEyMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxPdXREaXI+JChTb2x1dGlvbkRpcikkKFBsYXRmb3JtKVwkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyPiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybSlcJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8VGFyZ2V0TmFtZT4kKFByb2plY3ROYW1lKTwvVGFyZ2V0TmFtZT4NCisgICAgPE91dERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXI+JChTb2x1dGlvbkRpcikkKFBsYXRmb3JtKVwkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPE91dERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXI+JChTb2x1dGlvbkRpcikkKFBsYXRmb3JtKVwkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxUYXJnZXROYW1lPiQoUHJvamVjdE5hbWUpPC9UYXJnZXROYW1lPg0KKyAgICA8T3V0RGlyPiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybSlcJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5UdXJuT2ZmQWxsV2FybmluZ3M8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPktFTkxNX01BWF9PUkRFUj02O1dJTjMyO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKVwuLjwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8V2FybmluZ0xldmVsPlR1cm5PZmZBbGxXYXJuaW5nczwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+S0VOTE1fTUFYX09SREVSPTY7V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFByb2plY3REaXIpXC4uPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8V2FybmluZ0xldmVsPlR1cm5PZmZBbGxXYXJuaW5nczwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPktFTkxNX01BWF9PUkRFUj02O1dJTjMyO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKVwuLjwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5UdXJuT2ZmQWxsV2FybmluZ3M8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5LRU5MTV9NQVhfT1JERVI9NjtXSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoUHJvamVjdERpcilcLi48L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVxidWlsZF9iaW5hcnlfbWFpbi5jYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0ia2VubG0udmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+e2U4MzRkNzFjLTVkNWYtNGZiNC1hMzYxLTg4Njk0YzQzOGZmOX08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMva2VubG0vd2luZG93cy9rZW5sbS5zbG4gYi9zcmMva2VubG0vd2luZG93cy9rZW5sbS5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxYzQ5NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZW5sbS93aW5kb3dzL2tlbmxtLnNsbgpAQCAtMCwwICsxLDY0IEBACivvu78NCitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMA0KKyMgVmlzdWFsIFN0dWRpbyAyMDEzDQorVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEyLjAuNDA2MjkuMA0KK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xDQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJrZW5sbSIsICJrZW5sbS52Y3hwcm9qIiwgIntFODM0RDcxQy01RDVGLTRGQjQtQTM2MS04ODY5NEM0MzhGRjl9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIm5ncmFtX3F1ZXJ5IiwgIm5ncmFtX3F1ZXJ5LnZjeHByb2oiLCAiezgyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNDAyQn0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXtFODM0RDcxQy01RDVGLTRGQjQtQTM2MS04ODY5NEM0MzhGRjl9ID0ge0U4MzRENzFDLTVENUYtNEZCNC1BMzYxLTg4Njk0QzQzOEZGOX0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJidWlsZF9iaW5hcnkiLCAiYnVpbGRfYmluYXJ5LnZjeHByb2oiLCAiezcyNkI4MTQ5LTdGNTgtNDQxNS1CRDY0LTlFREVDREYzNDA5QX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXtFODM0RDcxQy01RDVGLTRGQjQtQTM2MS04ODY5NEM0MzhGRjl9ID0ge0U4MzRENzFDLTVENUYtNEZCNC1BMzYxLTg4Njk0QzQzOEZGOX0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsbXBseiIsICJsbXBsei52Y3hwcm9qIiwgIns5MjZCODA0OS03RTU4LTQ0MTUtQkQ2NC05RURFQ0RGMTUwMkN9Ig0KK0VuZFByb2plY3QNCitHbG9iYWwNCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzINCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NA0KKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzINCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KKwkJe0U4MzRENzFDLTVENUYtNEZCNC1BMzYxLTg4Njk0QzQzOEZGOX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtFODM0RDcxQy01RDVGLTRGQjQtQTM2MS04ODY5NEM0MzhGRjl9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0U4MzRENzFDLTVENUYtNEZCNC1BMzYxLTg4Njk0QzQzOEZGOX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJe0U4MzRENzFDLTVENUYtNEZCNC1BMzYxLTg4Njk0QzQzOEZGOX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXtFODM0RDcxQy01RDVGLTRGQjQtQTM2MS04ODY5NEM0MzhGRjl9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0U4MzRENzFDLTVENUYtNEZCNC1BMzYxLTg4Njk0QzQzOEZGOX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0U4MzRENzFDLTVENUYtNEZCNC1BMzYxLTg4Njk0QzQzOEZGOX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXtFODM0RDcxQy01RDVGLTRGQjQtQTM2MS04ODY5NEM0MzhGRjl9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezgyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNDAyQn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs4MjZCODA0OS03RTU4LTQ0MTUtQkQ2NC05RURFQ0RGMTQwMkJ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezgyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNDAyQn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezgyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNDAyQn0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXs4MjZCODA0OS03RTU4LTQ0MTUtQkQ2NC05RURFQ0RGMTQwMkJ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezgyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNDAyQn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezgyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNDAyQn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs4MjZCODA0OS03RTU4LTQ0MTUtQkQ2NC05RURFQ0RGMTQwMkJ9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezcyNkI4MTQ5LTdGNTgtNDQxNS1CRDY0LTlFREVDREYzNDA5QX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs3MjZCODE0OS03RjU4LTQ0MTUtQkQ2NC05RURFQ0RGMzQwOUF9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezcyNkI4MTQ5LTdGNTgtNDQxNS1CRDY0LTlFREVDREYzNDA5QX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezcyNkI4MTQ5LTdGNTgtNDQxNS1CRDY0LTlFREVDREYzNDA5QX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXs3MjZCODE0OS03RjU4LTQ0MTUtQkQ2NC05RURFQ0RGMzQwOUF9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezcyNkI4MTQ5LTdGNTgtNDQxNS1CRDY0LTlFREVDREYzNDA5QX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezcyNkI4MTQ5LTdGNTgtNDQxNS1CRDY0LTlFREVDREYzNDA5QX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs3MjZCODE0OS03RjU4LTQ0MTUtQkQ2NC05RURFQ0RGMzQwOUF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezkyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNTAyQ30uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs5MjZCODA0OS03RTU4LTQ0MTUtQkQ2NC05RURFQ0RGMTUwMkN9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezkyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNTAyQ30uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezkyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNTAyQ30uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXs5MjZCODA0OS03RTU4LTQ0MTUtQkQ2NC05RURFQ0RGMTUwMkN9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezkyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNTAyQ30uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezkyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNTAyQ30uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs5MjZCODA0OS03RTU4LTQ0MTUtQkQ2NC05RURFQ0RGMTUwMkN9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS93aW5kb3dzL2tlbmxtLnZjeHByb2ogYi9zcmMva2VubG0vd2luZG93cy9rZW5sbS52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YWU1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vd2luZG93cy9rZW5sbS52Y3hwcm9qCkBAIC0wLDAgKzEsMjkxIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSIxMi4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+e0U4MzRENzFDLTVENUYtNEZCNC1BMzYxLTg4Njk0QzQzOEZGOX08L1Byb2plY3RHdWlkPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICAgIDxSb290TmFtZXNwYWNlPmtlbmxtPC9Sb290TmFtZXNwYWNlPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPg0KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTIwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+DQorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMjA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEyMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEyMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPFRhcmdldE5hbWU+JChQcm9qZWN0TmFtZSk8L1RhcmdldE5hbWU+DQorICAgIDxPdXREaXI+JChTb2x1dGlvbkRpcikkKFBsYXRmb3JtKVwkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyPiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybSlcJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxUYXJnZXROYW1lPiQoUHJvamVjdE5hbWUpPC9UYXJnZXROYW1lPg0KKyAgICA8T3V0RGlyPiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybSlcJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxPdXREaXI+JChTb2x1dGlvbkRpcikkKFBsYXRmb3JtKVwkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8VGFyZ2V0TmFtZT4kKFByb2plY3ROYW1lKTwvVGFyZ2V0TmFtZT4NCisgICAgPEludERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPE91dERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXI+JChTb2x1dGlvbkRpcikkKFBsYXRmb3JtKVwkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+VHVybk9mZkFsbFdhcm5pbmdzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5LRU5MTV9NQVhfT1JERVI9NjtXSU4zMjtEX1NDTF9TRUNVUkVfTk9fV0FSTklOR1NfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKVwuLjskKEJPT1NURElSKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4tRF9TQ0xfU0VDVVJFX05PX1dBUk5JTkdTICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+VHVybk9mZkFsbFdhcm5pbmdzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5LRU5MTV9NQVhfT1JERVI9NjtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKVwuLjskKEJPT1NURElSKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+VHVybk9mZkFsbFdhcm5pbmdzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+S0VOTE1fTUFYX09SREVSPTY7V0lOMzI7RF9TQ0xfU0VDVVJFX05PX1dBUk5JTkdTTkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoUHJvamVjdERpcilcLi47JChCT09TVERJUik7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi1EX1NDTF9TRUNVUkVfTk9fV0FSTklOR1MgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+VHVybk9mZkFsbFdhcm5pbmdzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+S0VOTE1fTUFYX09SREVSPTY7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoUHJvamVjdERpcilcLi47JChCT09TVERJUik7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVxiaGlrc2hhLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVxiaW5hcnlfZm9ybWF0LmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVxibGFuay5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cbG1cY29uZmlnLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVxlbnVtZXJhdGVfdm9jYWIuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXGZhY2FkZS5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cbG1cbGVmdC5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cbG1cbG1fZXhjZXB0aW9uLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVxtYXhfb3JkZXIuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXG1vZGVsLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVxtb2RlbF90eXBlLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVxxdWFudGl6ZS5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cbG1ccmVhZF9hcnBhLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVxyZXR1cm4uaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXHNlYXJjaF9oYXNoZWQuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXHNlYXJjaF90cmllLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVx0ZXN0LmFycGEiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXHRlc3Rfbm91bmsuYXJwYSIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cbG1cdHJpZS5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cbG1cdHJpZV9zb3J0LmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVx2aXJ0dWFsX2ludGVyZmFjZS5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cbG1cdm9jYWIuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXHdlaWdodHMuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXHdvcmRfaW5kZXguaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXHV0aWxcYml0X3BhY2tpbmcuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXHV0aWxcZXJzYXR6X3Byb2dyZXNzLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlx1dGlsXGV4Y2VwdGlvbi5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cdXRpbFxmaWxlLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlx1dGlsXGZpbGVfcGllY2UuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXHV0aWxcZ2V0b3B0LmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlx1dGlsXGhhdmUuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXHV0aWxcam9pbnRfc29ydC5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cdXRpbFxrZXlfdmFsdWVfcGFja2luZy5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cdXRpbFxtbWFwLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlx1dGlsXG11cm11cl9oYXNoLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlx1dGlsXHByb2JpbmdfaGFzaF90YWJsZS5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cdXRpbFxwcm94eV9pdGVyYXRvci5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cdXRpbFxzY29wZWQuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXHV0aWxcc2l6ZWRfaXRlcmF0b3IuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXHV0aWxcc29ydGVkX3VuaWZvcm0uaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXHV0aWxcc3RyaW5nX3BpZWNlLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlx1dGlsXHRva2VuaXplX3BpZWNlLmhoIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxtXHZhbHVlX2J1aWxkLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxcZG91YmxlLWNvbnZlcnNpb25cYmlnbnVtLWR0b2EuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFxkb3VibGUtY29udmVyc2lvblxiaWdudW0uY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFxkb3VibGUtY29udmVyc2lvblxjYWNoZWQtcG93ZXJzLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxcZG91YmxlLWNvbnZlcnNpb25cZGl5LWZwLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxcZG91YmxlLWNvbnZlcnNpb25cZG91YmxlLWNvbnZlcnNpb24uY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFxkb3VibGUtY29udmVyc2lvblxmYXN0LWR0b2EuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFxkb3VibGUtY29udmVyc2lvblxmaXhlZC1kdG9hLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxcZG91YmxlLWNvbnZlcnNpb25cc3RydG9kLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxcZmxvYXRfdG9fc3RyaW5nLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxcaW50ZWdlcl90b19zdHJpbmcuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFxqb2ludF9zb3J0X3Rlc3QuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFxwYXJhbGxlbF9yZWFkLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxccG9vbC5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx1dGlsXHJlYWRfY29tcHJlc3NlZC5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx1dGlsXHNjb3BlZC5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx1dGlsXHN0cmVhbVxjaGFpbi5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx1dGlsXHN0cmVhbVxjb3VudF9yZWNvcmRzLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxcc3RyZWFtXGlvLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxcc3RyZWFtXGxpbmVfaW5wdXQuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFxzdHJlYW1cbXVsdGlfcHJvZ3Jlc3MuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFxzdHJlYW1ccmV3aW5kYWJsZV9zdHJlYW0uY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFxzdHJpbmdfcGllY2UuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFx1c2FnZS5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVxiaGlrc2hhLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxtXGJpbmFyeV9mb3JtYXQuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cbG1cY29uZmlnLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxtXGxtX2V4Y2VwdGlvbi5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVxtb2RlbC5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVxxdWFudGl6ZS5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVxyZWFkX2FycGEuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cbG1cc2VhcmNoX2hhc2hlZC5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVxzZWFyY2hfdHJpZS5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVxzaXplcy5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVx0cmllLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxtXHRyaWVfc29ydC5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVx2aXJ0dWFsX2ludGVyZmFjZS5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVx2b2NhYi5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx1dGlsXGJpdF9wYWNraW5nLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxcZXJzYXR6X3Byb2dyZXNzLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxcZXhjZXB0aW9uLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHV0aWxcZmlsZS5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx1dGlsXGZpbGVfcGllY2UuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFxnZXRvcHQuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx1dGlsXG1tYXAuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cdXRpbFxtdXJtdXJfaGFzaC5jYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXGRvdWJsZS1jb252ZXJzaW9uXGJpZ251bS1kdG9hLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cdXRpbFxkb3VibGUtY29udmVyc2lvblxiaWdudW0uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXGRvdWJsZS1jb252ZXJzaW9uXGNhY2hlZC1wb3dlcnMuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXGRvdWJsZS1jb252ZXJzaW9uXGRpeS1mcC5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxcZG91YmxlLWNvbnZlcnNpb25cZG91YmxlLWNvbnZlcnNpb24uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXGRvdWJsZS1jb252ZXJzaW9uXGZhc3QtZHRvYS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxcZG91YmxlLWNvbnZlcnNpb25cZml4ZWQtZHRvYS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxcZG91YmxlLWNvbnZlcnNpb25caWVlZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxcZG91YmxlLWNvbnZlcnNpb25cc3RydG9kLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cdXRpbFxkb3VibGUtY29udmVyc2lvblx1dGlscy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxcZmlsZV9zdHJlYW0uaGgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cdXRpbFxzdHJpbmdfc3RyZWFtLmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxcZmFrZV9vc3RyZWFtLmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxcZml4ZWRfYXJyYXkuaGgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cdXRpbFxmbG9hdF90b19zdHJpbmcuaGgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cdXRpbFxpbnRlZ2VyX3RvX3N0cmluZy5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXG11bHRpX2ludGVyc2VjdGlvbi5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXHBhcmFsbGVsX3JlYWQuaGgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cdXRpbFxwY3F1ZXVlLmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxccG9vbC5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXHJlYWRfY29tcHJlc3NlZC5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXHN0cmVhbVxibG9jay5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXHN0cmVhbVxjaGFpbi5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXHN0cmVhbVxjb25maWcuaGgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cdXRpbFxzdHJlYW1cY291bnRfcmVjb3Jkcy5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXHN0cmVhbVxpby5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXHN0cmVhbVxsaW5lX2lucHV0LmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxcc3RyZWFtXG11bHRpX3Byb2dyZXNzLmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxcc3RyZWFtXG11bHRpX3N0cmVhbS5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXHN0cmVhbVxyZXdpbmRhYmxlX3N0cmVhbS5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXHN0cmVhbVxzb3J0LmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxcc3RyZWFtXHN0cmVhbS5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXHN0cmVhbVx0aW1lci5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx1dGlsXHN0cmluZ19waWVjZV9oYXNoLmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHV0aWxcdGhyZWFkX3Bvb2wuaGgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cdXRpbFx1c2FnZS5oaCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zcmMva2VubG0vd2luZG93cy9sbXBsei52Y3hwcm9qIGIvc3JjL2tlbmxtL3dpbmRvd3MvbG1wbHoudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MTNlYWRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlbmxtL3dpbmRvd3MvbG1wbHoudmN4cHJvagpAQCAtMCwwICsxLDIxNCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iMTIuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPns5MjZCODA0OS03RTU4LTQ0MTUtQkQ2NC05RURFQ0RGMTUwMkN9PC9Qcm9qZWN0R3VpZD4NCisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5sbXBsejwvUm9vdE5hbWVzcGFjZT4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+DQorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMjA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+DQorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMjA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMjA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTIwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPE91dERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXI+JChTb2x1dGlvbkRpcikkKFBsYXRmb3JtKVwkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxUYXJnZXROYW1lPiQoUHJvamVjdE5hbWUpPC9UYXJnZXROYW1lPg0KKyAgICA8T3V0RGlyPiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybSlcJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8SW5jbHVkZVBhdGg+QzpcUHJvZ3JhbSBGaWxlc1xib29zdFxib29zdF8xXzUxOyQoVkNJbnN0YWxsRGlyKWluY2x1ZGU7JChWQ0luc3RhbGxEaXIpYXRsbWZjXGluY2x1ZGU7JChXaW5kb3dzU2RrRGlyKWluY2x1ZGU7JChGcmFtZXdvcmtTREtEaXIpXGluY2x1ZGU7PC9JbmNsdWRlUGF0aD4NCisgICAgPExpYnJhcnlQYXRoPkM6XFByb2dyYW0gRmlsZXNcYm9vc3RcYm9vc3RfMV81MVxsaWI7JChWQ0luc3RhbGxEaXIpbGliOyQoVkNJbnN0YWxsRGlyKWF0bG1mY1xsaWI7JChXaW5kb3dzU2RrRGlyKWxpYjskKEZyYW1ld29ya1NES0RpcilcbGliPC9MaWJyYXJ5UGF0aD4NCisgICAgPE91dERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXI+JChTb2x1dGlvbkRpcikkKFBsYXRmb3JtKVwkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxUYXJnZXROYW1lPiQoUHJvamVjdE5hbWUpPC9UYXJnZXROYW1lPg0KKyAgICA8T3V0RGlyPiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybSlcJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5UdXJuT2ZmQWxsV2FybmluZ3M8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPktFTkxNX01BWF9PUkRFUj02O1dJTjMyO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKVwuLjskKEJPT1NURElSKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKEJPT1NURElSKVxzdGFnZVxsaWI8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5UdXJuT2ZmQWxsV2FybmluZ3M8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPktFTkxNX01BWF9PUkRFUj02O1dJTjMyO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKVwuLjskKEJPT1NURElSKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKEJPT1NURElSKVxzdGFnZVxsaWJceDY0PC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8V2FybmluZ0xldmVsPlR1cm5PZmZBbGxXYXJuaW5nczwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPktFTkxNX01BWF9PUkRFUj02O1dJTjMyO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKVwuLjskKEJPT1NURElSKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoQk9PU1RESVIpXHN0YWdlXGxpYjtjOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBTREtzXFdpbmRvd3NcdjcuMUFcTGliXDwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+VHVybk9mZkFsbFdhcm5pbmdzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+S0VOTE1fTUFYX09SREVSPTY7V0lOMzI7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFByb2plY3REaXIpXC4uOyQoQk9PU1RESVIpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChCT09TVERJUilcc3RhZ2VcbGliXHg2NDs8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXGJ1aWxkZXJcYWRqdXN0X2NvdW50cy5oaCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cbG1cYnVpbGRlclxjb3JwdXNfY291bnQuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXGJ1aWxkZXJcZGlzY291bnQuaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXGJ1aWxkZXJcaGVhZGVyX2luZm8uaGgiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXGJ1aWxkZXJcaW5pdGlhbF9wcm9iYWJpbGl0aWVzLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVxidWlsZGVyXGludGVycG9sYXRlLmhoIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbVxidWlsZGVyXHBpcGVsaW5lLmhoIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxtXGJ1aWxkZXJcYWRqdXN0X2NvdW50cy5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVxidWlsZGVyXGNvcnB1c19jb3VudC5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVxidWlsZGVyXGluaXRpYWxfcHJvYmFiaWxpdGllcy5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVxidWlsZGVyXGludGVycG9sYXRlLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxtXGJ1aWxkZXJcb3V0cHV0LmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxtXGJ1aWxkZXJccGlwZWxpbmUuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cbG1cYnVpbGRlclxsbXBsel9tYWluLmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxtXGNvbW1vblxtb2RlbF9idWZmZXIuY2MiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cbG1cY29tbW9uXHByaW50LmNjIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxtXGNvbW1vblxyZW51bWJlci5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxsbVxjb21tb25cc2l6ZV9vcHRpb24uY2MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9ImtlbmxtLnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0PntlODM0ZDcxYy01ZDVmLTRmYjQtYTM2MS04ODY5NGM0MzhmZjl9PC9Qcm9qZWN0Pg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cbG1cYnVpbGRlclxkZWJ1Z19wcmludC5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxsbVxidWlsZGVyXGhhc2hfZ2FtbWEuaGgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cbG1cYnVpbGRlclxvdXRwdXQuaGgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cbG1cYnVpbGRlclxwYXlsb2FkLmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGxtXGNvbW1vblxjb21wYXJlLmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGxtXGNvbW1vblxqb2ludF9vcmRlci5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxsbVxjb21tb25cbW9kZWxfYnVmZmVyLmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGxtXGNvbW1vblxuZ3JhbS5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxsbVxjb21tb25cbmdyYW1fc3RyZWFtLmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGxtXGNvbW1vblxwcmludC5oaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxsbVxjb21tb25ccmVudW1iZXIuaGgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cbG1cY29tbW9uXHNpemVfb3B0aW9uLmhoIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGxtXGNvbW1vblxzcGVjaWFsLmhoIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9rZW5sbS93aW5kb3dzL25ncmFtX3F1ZXJ5LnZjeHByb2ogYi9zcmMva2VubG0vd2luZG93cy9uZ3JhbV9xdWVyeS52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjM2RhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VubG0vd2luZG93cy9uZ3JhbV9xdWVyeS52Y3hwcm9qCkBAIC0wLDAgKzEsMTc3IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSIxMi4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+ezgyNkI4MDQ5LTdFNTgtNDQxNS1CRDY0LTlFREVDREYxNDAyQn08L1Byb2plY3RHdWlkPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICAgIDxSb290TmFtZXNwYWNlPm5ncmFtX3F1ZXJ5PC9Sb290TmFtZXNwYWNlPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEyMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEyMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEyMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMjA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8T3V0RGlyPiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybSlcJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPg0KKyAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPFRhcmdldE5hbWU+JChQcm9qZWN0TmFtZSk8L1RhcmdldE5hbWU+DQorICAgIDxPdXREaXI+JChTb2x1dGlvbkRpcikkKFBsYXRmb3JtKVwkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyPiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybSlcJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxPdXREaXI+JChTb2x1dGlvbkRpcikkKFBsYXRmb3JtKVwkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyPiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybSlcJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8VGFyZ2V0TmFtZT4kKFByb2plY3ROYW1lKTwvVGFyZ2V0TmFtZT4NCisgICAgPE91dERpcj4kKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm0pXCQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXI+JChTb2x1dGlvbkRpcikkKFBsYXRmb3JtKVwkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+VHVybk9mZkFsbFdhcm5pbmdzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5LRU5MTV9NQVhfT1JERVI9NjtXSU4zMjtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoUHJvamVjdERpcilcLi48L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5UdXJuT2ZmQWxsV2FybmluZ3M8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPktFTkxNX01BWF9PUkRFUj02O1dJTjMyO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKVwuLjwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5UdXJuT2ZmQWxsV2FybmluZ3M8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5LRU5MTV9NQVhfT1JERVI9NjtXSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoUHJvamVjdERpcilcLi48L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+VHVybk9mZkFsbFdhcm5pbmdzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+S0VOTE1fTUFYX09SREVSPTY7V0lOMzI7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFByb2plY3REaXIpXC4uPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGxtXG5ncmFtX3F1ZXJ5LmhoIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxtXHF1ZXJ5X21haW4uY2MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9ImtlbmxtLnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0PntlODM0ZDcxYy01ZDVmLTRmYjQtYTM2MS04ODY5NGM0MzhmZjl9PC9Qcm9qZWN0Pg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9zeW1hbC9NYWtlZmlsZSBiL3NyYy9zeW1hbC9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9zeW1hbC9NYWtlZmlsZQpyZW5hbWUgdG8gc3JjL3N5bWFsL01ha2VmaWxlCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL3N5bWFsL2NtZC5jIGIvc3JjL3N5bWFsL2NtZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzY3JpcHRzL3RyYWluaW5nL3N5bWFsL2NtZC5jCnJlbmFtZSB0byBzcmMvc3ltYWwvY21kLmMKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhaW5pbmcvc3ltYWwvY21kLmggYi9zcmMvc3ltYWwvY21kLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvc3ltYWwvY21kLmgKcmVuYW1lIHRvIHNyYy9zeW1hbC9jbWQuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFpbmluZy9zeW1hbC9naXphMmJhbC5wbCBiL3NyYy9zeW1hbC9naXphMmJhbC5wbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2NyaXB0cy90cmFpbmluZy9zeW1hbC9naXphMmJhbC5wbApyZW5hbWUgdG8gc3JjL3N5bWFsL2dpemEyYmFsLnBsCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RyYWluaW5nL3N5bWFsL3N5bWFsLmNwcCBiL3NyYy9zeW1hbC9zeW1hbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNjcmlwdHMvdHJhaW5pbmcvc3ltYWwvc3ltYWwuY3BwCnJlbmFtZSB0byBzcmMvc3ltYWwvc3ltYWwuY3BwCmRpZmYgLS1naXQgYS90ZXN0L2JuLWVuL2hpZXJvL2pvc2h1YS1jbGFzc2xtLmNvbmZpZyBiL3Rlc3QvYm4tZW4vaGllcm8vam9zaHVhLWNsYXNzbG0uY29uZmlnCmluZGV4IDEzMzExYTguLjk3MGI5YjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvYm4tZW4vaGllcm8vam9zaHVhLWNsYXNzbG0uY29uZmlnCisrKyBiL3Rlc3QvYm4tZW4vaGllcm8vam9zaHVhLWNsYXNzbG0uY29uZmlnCkBAIC0yMyw4ICsyMyw4IEBACiB1c2VfdW5pcXVlX25iZXN0PXRydWUKIHRvcF9uID0gMTAKIAotZmVhdHVyZS1mdW5jdGlvbiA9IE9PVlBlbmFsdHkKIGZlYXR1cmUtZnVuY3Rpb24gPSBXb3JkUGVuYWx0eQorZmVhdHVyZS1mdW5jdGlvbiA9IE9PVlBlbmFsdHkKIAogIyMjIyMjIG1vZGVsIHdlaWdodHMKIGxtXzAgMS4yMzczNjc2ODAyMTc5NDUyCmRpZmYgLS1naXQgYS90ZXN0L2JuLWVuL2hpZXJvL291dHB1dC1jbGFzc2xtLmdvbGQgYi90ZXN0L2JuLWVuL2hpZXJvL291dHB1dC1jbGFzc2xtLmdvbGQKaW5kZXggNjEyOGQ1Yy4uNDRkOWE5OSAxMDA2NDQKLS0tIGEvdGVzdC9ibi1lbi9oaWVyby9vdXRwdXQtY2xhc3NsbS5nb2xkCisrKyBiL3Rlc3QvYm4tZW4vaGllcm8vb3V0cHV0LWNsYXNzbG0uZ29sZApAQCAtMSw2OTAgKzEsNjkwIEBACi0wIHx8fCByYWJpbmRyYW5hdGggd2FzIGJvcm4gaW4gYSDgpqrgpr/gprDgpr7gprLgp4Ag4Kas4KeN4Kaw4Ka+4Ka54KeN4Kau4KajIGluIHRoZSBmYW1pbHkgfHx8IGxtXzA9LTIzLjcxMiBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMzAuNDA5IHRtX3B0XzY9LTE1LjcxMiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS4xMzUgdG1fcHRfMTA9LTE0Ljk3OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuNzI5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNzAuNjkwCi0wIHx8fCByYWJpbmRyYW5hdGggYm9ybiBpbiBrb2xrYXRhIGEg4Kaq4Ka/4Kaw4Ka+4Kay4KeAIOCmrOCnjeCmsOCmvuCmueCnjeCmruCmoyBpbiB0aGUgZmFtaWx5IHx8fCBsbV8wPS0yNy44MDMgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTI5LjAyOSB0bV9wdF82PS0xNi4wMDIgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTIuMDAwIHRtX3B0XzEwPS0xMC4wOTAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjI4MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjcyLjY1NAotMCB8fHwgcmFiaW5kcmFuYXRoIGJvcm4gaW4gdGhlIGEg4Kaq4Ka/4Kaw4Ka+4Kay4KeAIOCmrOCnjeCmsOCmvuCmueCnjeCmruCmoyBpbiB0aGUgZmFtaWx5IHx8fCBsbV8wPS0yNi45ODAgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTMyLjczNyB0bV9wdF82PS0xNi4wOTIgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTIuMDAwIHRtX3B0XzEwPS0xMi4xODggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjg3NiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjcyLjc3NgotMCB8fHwgcmFiaW5kcmFuYXRoIHdhcyBib3JuIGluIG9uZSDgpqrgpr/gprDgpr7gprLgp4Ag4Kas4KeN4Kaw4Ka+4Ka54KeN4Kau4KajIGluIHRoZSBmYW1pbHkgfHx8IGxtXzA9LTI1LjY3NiBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMjkuNjM5IHRtX3B0XzY9LTE2LjcxMCB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS4xMzUgdG1fcHRfMTA9LTEzLjQzOCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguMzUwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNzMuMTMzCi0wIHx8fCByYWJpbmRyYW5hdGggYm9ybiBpbiB0aGUgb25lIOCmquCmv+CmsOCmvuCmsuCngCDgpqzgp43gprDgpr7gprngp43gpq7gpqMgaW4gdGhlIGZhbWlseSB8fHwgbG1fMD0tMjcuMzIwIGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0zMS45NjcgdG1fcHRfNj0tMTcuMDkwIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0tMTAuNjQ4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC40OTcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI3My4yMTAKLTAgfHx8IHJhYmluZHJhbmF0aCBib3JuIGluIGtvbGthdGEgb25lIOCmquCmv+CmsOCmvuCmsuCngCDgpqzgp43gprDgpr7gprngp43gpq7gpqMgaW4gdGhlIGZhbWlseSB8fHwgbG1fMD0tMjguNTU1IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0yOC4yNTkgdG1fcHRfNj0tMTYuOTk5IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0tOC41NTAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjkwMyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjczLjU5NwotMCB8fHwgcmFiaW5kcmFuYXRoIHdhcyBib3JuIGluIGEg4Kaq4Ka/4Kaw4Ka+4Kay4KeAIOCmrOCnjeCmsOCmvuCmueCnjeCmruCmoyDgpqrgprDgpr/gpqzgpr7gprDgp4cgLiB8fHwgbG1fMD0tMjMuNTc0IGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMi44NjcgdG1fcHRfNj0tNy4xNTMgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMTM1IHRtX3B0XzEwPS0xNC45ODggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjczMiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzYwLjY0NgotMCB8fHwgcmFiaW5kcmFuYXRoIGJvcm4gaW4ga29sa2F0YSBhIOCmquCmv+CmsOCmvuCmsuCngCDgpqzgp43gprDgpr7gprngp43gpq7gpqMg4Kaq4Kaw4Ka/4Kas4Ka+4Kaw4KeHIC4gfHx8IGxtXzA9LTI3LjY2NSBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTEuNDg3IHRtX3B0XzY9LTcuNDQyIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tMTAuMTAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4yODUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM2Mi42MTAKLTAgfHx8IHJhYmluZHJhbmF0aCBib3JuIGluIHRoZSBhIOCmquCmv+CmsOCmvuCmsuCngCDgpqzgp43gprDgpr7gprngp43gpq7gpqMg4Kaq4Kaw4Ka/4Kas4Ka+4Kaw4KeHIC4gfHx8IGxtXzA9LTI2Ljg0MSBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTUuMTk1IHRtX3B0XzY9LTcuNTMzIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tMTIuMTk4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy44ODAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM2Mi43MzIKLTEgfHx8IHJlY2VudGx5IGluZGlhIHdpdGggdW5pdGVkIHJlbGF0aW9uIGltcHJvdmVkIC4gfHx8IGxtXzA9LTIxLjU4NSBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTMuODEwIHRtX3B0XzY9LTE1Ljc1OSB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4xMDQgdG1fcHRfMTA9LTExLjUyNyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMTc0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IHx8fCAtNTguOTI5Ci0xIHx8fCByZWNlbnRseSB3aXRoIHRoZSB1bml0ZWQgcmVsYXRpb24gaW1wcm92ZWQgLiB8fHwgbG1fMD0tMTkuMjA1IGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xNy4wNjIgdG1fcHRfNj0tMTUuODU3IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0yLjEwNSB0bV9wdF8xMD0tMTUuNTI4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4zOTYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD00LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgfHx8IC01OS40MjgKLTEgfHx8IHJlY2VudGx5IGluZGlhIHdpdGggdW5pdGVkIG1hdHRlcnMgaW1wcm92ZWQgLiB8fHwgbG1fMD0tMjEuNDgxIGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNS4xNTYgdG1fcHRfNj0tMTcuMTQ2IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0yLjEwNCB0bV9wdF8xMD0tMTEuMzIwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4xNzQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgfHx8IC01OS40NzcKLTEgfHx8IHJlY2VudGx5IGluZGlhIHdpdGggdW5pdGVkIHN0YXRlcyByZWxhdGlvbiBpbXByb3ZlZCAuIHx8fCBsbV8wPS0yMS40OTEgbG1fMT0tMjkuMzUwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE1LjY2MSB0bV9wdF82PS0xNS44NDkgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTEuNzQyIHRtX3B0XzEwPS0xMC44ODUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjQxMiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIFdvcmRQZW5hbHR5PS00LjM0MyB8fHwgLTU5LjYwMgotMSB8fHwgcmVjZW50bHkgdGhlIHdpdGggdW5pdGVkIHJlbGF0aW9uIGltcHJvdmVkIC4gfHx8IGxtXzA9LTIwLjgzNSBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTcuMDYyIHRtX3B0XzY9LTE1Ljg1NyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4xMDQgdG1fcHRfMTA9LTE0LjQ2MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuODIyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IHx8fCAtNTkuNjQ3Ci0xIHx8fCByZWNlbnRseSB3aXRoIHRoZSB1bml0ZWQgc3RhdGVzIHJlbGF0aW9uIGltcHJvdmVkIC4gfHx8IGxtXzA9LTE4Ljg3MyBsbV8xPS0yOS4zNTAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTguOTEzIHRtX3B0XzY9LTE1Ljk0NiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS43NDMgdG1fcHRfMTA9LTE0Ljg4NiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNjMzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTQuMzQzIHx8fCAtNTkuODA2Ci0yIHx8fCBtYXRoZW1hdGljcyBzbyBzY2llbmNlIGxhbmd1YWdlIC4gfHx8IGxtXzA9LTE1LjE0MSBsbV8xPS0xOS41NjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tNi40ODMgdG1fcHRfNj0tMy4zODcgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTAuMDAyIHRtX3B0XzEwPS0zLjM3OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuNjI2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTMuMDQwIHx8fCAtMzQuNjgyCi0yIHx8fCBtYXRoZW1hdGljcyBpcyBzY2llbmNlIGxhbmd1YWdlIC4gfHx8IGxtXzA9LTEyLjg5MCBsbV8xPS0xOS41NjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTAuMzc1IHRtX3B0XzY9LTMuOTI2IHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjA1MiB0bV9wdF8xMD0tOC4zMjYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjMzMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCB8fHwgLTM0Ljc1NAotMiB8fHwgbWF0aGVtYXRpY3MgdGhhdCBzY2llbmNlIGxhbmd1YWdlIC4gfHx8IGxtXzA9LTE0LjAwMSBsbV8xPS0xOS41NjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tOS42MjUgdG1fcHRfNj0tMy45MjYgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTAuMDUyIHRtX3B0XzEwPS03LjYwNyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMzMwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTMuMDQwIHx8fCAtMzUuNzk4Ci0yIHx8fCBtYXRoZW1hdGljcyBzbyBzY2llbmNlIGxhbmd1YWdlIHx8fCBsbV8wPS0xNS4wNzggbG1fMT0tMTYuMzA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTcuMDYwIHRtX3B0XzY9LTEwLjQ4MSB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4xMzggdG1fcHRfMTA9LTcuODg4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy40MTcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD00LjAwMCBXb3JkUGVuYWx0eT0tMi42MDYgfHx8IC0zNi45NTIKLTIgfHx8IG1hdGhlbWF0aWNzIGlzIHNjaWVuY2UgbGFuZ3VhZ2UgfHx8IGxtXzA9LTEyLjgyNyBsbV8xPS0xNi4zMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTAuOTUxIHRtX3B0XzY9LTExLjAyMCB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4xODggdG1fcHRfMTA9LTEyLjgzNSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMTIyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTIuNjA2IHx8fCAtMzcuMDI0Ci0zIHx8fCBmcm9tIHRoaXMgaXQgdW5kZXJzdG9vZCB0aGF0IHRoaXMg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaV4Kaf4Ka/IHdpbGwg4KaP4Kar4KaG4Kaw4Kah4Kas4KeN4Kay4Ka/4KaJIOCmruCnh+Cmn+CnjeCmsOCmv+CmlSAuIHx8fCBsbV8wPS0zMi4zNzEgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE0LjU5NSB0bV9wdF82PS0xMy4xNzEgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTEuNDA1IHRtX3B0XzEwPS05LjQ5OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuOTE1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNzcuMjg3Ci0zIHx8fCBmcm9tIHRoaXMgaXQgd2lsbCBiZSB1bmRlcnN0b29kIHRoYXQgdGhlIOCmruCnh+Cmn+CnjeCmsOCmv+CmleCmn+CmvyDgpo/gpqvgpobgprDgpqHgpqzgp43gprLgpr/gpokg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaVIC4gfHx8IGxtXzA9LTI4LjQ3NCBsbV8xPS00Mi4zOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMjAuMzY2IHRtX3B0XzY9LTE0LjQxNiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS4zODkgdG1fcHRfMTA9LTYuOTQzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC40NTcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM3Ny42NDMKLTMgfHx8IGZyb20gdGhpcyBpdCB1bmRlcnN0b29kIHRoYXQgdGhpcyDgpq7gp4fgpp/gp43gprDgpr/gppXgpp/gpr8gYmUg4KaP4Kar4KaG4Kaw4Kah4Kas4KeN4Kay4Ka/4KaJIOCmruCnh+Cmn+CnjeCmsOCmv+CmlSAuIHx8fCBsbV8wPS0zMi42NTYgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE1LjczMyB0bV9wdF82PS0xMy4wNzkgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTEuNDA1IHRtX3B0XzEwPS0xMC41MTMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjkxNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzc4LjA4OQotMyB8fHwgZnJvbSB0aGlzIGl0IHVuZGVyc3Rvb2QgdGhhdCB0aGlzIHdpbGwg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaV4Kaf4Ka/IOCmj+Cmq+CmhuCmsOCmoeCmrOCnjeCmsuCmv+CmiSDgpq7gp4fgpp/gp43gprDgpr/gppUgLiB8fHwgbG1fMD0tMzEuOTAzIGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNC41OTUgdG1fcHRfNj0tMTMuMTcxIHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0xLjUyMiB0bV9wdF8xMD0tNy43NDAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjMwOSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzc4LjA5OQotMyB8fHwgZnJvbSB0aGlzIGVhc2lseSB1bmRlcnN0b29kIHRoYXQgdGhpcyDgpq7gp4fgpp/gp43gprDgpr/gppXgpp/gpr8gd2lsbCDgpo/gpqvgpobgprDgpqHgpqzgp43gprLgpr/gpokg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaVIC4gfHx8IGxtXzA9LTM1LjE5NiBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMTAuNjkzIHRtX3B0XzY9LTEyLjI3NyB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMS41MjIgdG1fcHRfMTA9LTYuNjU5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4wNjkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNzguMTgwCi0zIHx8fCBmcm9tIHRoaXMgaXQgd2lsbCBiZSB1bmRlcnN0b29kIHRoYXQgdGhpcyDgpq7gp4fgpp/gp43gprDgpr/gppXgpp/gpr8g4KaP4Kar4KaG4Kaw4Kah4Kas4KeN4Kay4Ka/4KaJIOCmruCnh+Cmn+CnjeCmsOCmv+CmlSAuIHx8fCBsbV8wPS0yOC45NzQgbG1fMT0tNDIuMzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTE3LjAzMCB0bV9wdF82PS0xMy4xMjQgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTEuMzg2IHRtX3B0XzEwPS03Ljg5MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuNzk5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNzguMzQ4Ci0zIHx8fCBmcm9tIHRoaXMgaXQgdW5kZXJzdG9vZCB0aGF0IHRoZSDgpq7gp4fgpp/gp43gprDgpr/gppXgpp/gpr8gd2lsbCDgpo/gpqvgpobgprDgpqHgpqzgp43gprLgpr/gpokg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaVIC4gfHx8IGxtXzA9LTMxLjg3MSBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTcuOTMwIHRtX3B0XzY9LTE0LjQ2MyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS40MjMgdG1fcHRfMTA9LTkuMTQ1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4xNjMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM3OC41MzQKLTMgfHx8IGZyb20gdGhpcyBpdCB3aWxsIHVuZGVyc3Rvb2QgdGhhdCB0aGUg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaV4Kaf4Ka/IOCmj+Cmq+CmhuCmsOCmoeCmrOCnjeCmsuCmv+CmiSDgpq7gp4fgpp/gp43gprDgpr/gppUgLiB8fHwgbG1fMD0tMzAuMzEzIGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0xNy45MzAgdG1fcHRfNj0tMTQuNDYzIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjUyNCB0bV9wdF8xMD0tNi40MzIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjQ3OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzc4LjcwOAotNCB8fHwgc2FtZSB3aXRoIHRoZSBlYXJ0aGNlbnRlcmVkIOCmuOCmvuCmruCmqOCnjeCmpOCmpOCmqOCnjeCmpOCnjeCmsOCnh+CmsCDgpqrgpqTgpqjgp4fgprAgaW5kaWNhdGlvbiBtYXRjaCBmcm9tIHRoaXMgbm92ZWwgLiB8fHwgbG1fMD0tMzkuNjQxIGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xNi4yMTIgdG1fcHRfNj0tMTAuMDg0IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjAwNSB0bV9wdF8xMD0tMTIuMzM4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4wMTggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjkwLjQyMwotNCB8fHwgc2FtZSB3aXRoIHRoZSBlYXJ0aGNlbnRlcmVkIOCmuOCmvuCmruCmqOCnjeCmpOCmpOCmqOCnjeCmpOCnjeCmsOCnh+CmsCDgpqrgpqTgpqjgp4fgprAgcHJlc2FnZSBtYXRjaCBmcm9tIHRoaXMgbm92ZWwgLiB8fHwgbG1fMD0tMzkuOTE2IGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xNS4xMTMgdG1fcHRfNj0tMTAuMDg0IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjAwNSB0bV9wdF8xMD0tMTIuMzM4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4wMTggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjkwLjU1MwotNCB8fHwgdGhlIHdpdGggdGhlIGVhcnRoY2VudGVyZWQg4Ka44Ka+4Kau4Kao4KeN4Kak4Kak4Kao4KeN4Kak4KeN4Kaw4KeH4KawIOCmquCmpOCmqOCnh+CmsCBpbmRpY2F0aW9uIG1hdGNoIGZyb20gdGhpcyBub3ZlbCAuIHx8fCBsbV8wPS0zNy41NDYgbG1fMT0tNDIuMzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIwLjY0MCB0bV9wdF82PS05Ljk4MyB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMy4wMjQgdG1fcHRfMTA9LTE4LjU0NCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNDA1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI5MC43NTcKLTQgfHx8IHRoZSB3aXRoIHRoZSBlYXJ0aGNlbnRlcmVkIOCmuOCmvuCmruCmqOCnjeCmpOCmpOCmqOCnjeCmpOCnjeCmsOCnh+CmsCDgpqrgpqTgpqjgp4fgprAgcHJlc2FnZSBtYXRjaCBmcm9tIHRoaXMgbm92ZWwgLiB8fHwgbG1fMD0tMzcuODIwIGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xOS41NDEgdG1fcHRfNj0tOS45ODMgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuMDI0IHRtX3B0XzEwPS0xOC41NDQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjQwNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTAuODg3Ci00IHx8fCBzYW1lIHdpdGggdGhlIGVhcnRoY2VudGVyZWQg4Ka44Ka+4Kau4Kao4KeN4Kak4Kak4Kao4KeN4Kak4KeN4Kaw4KeH4KawIOCmquCmpOCmqOCnh+CmsCBpbmRpY2F0aW9uIG1hdGNoIGZyb20gdGhpcyBub3ZlbHMgLiB8fHwgbG1fMD0tNDEuNzk4IGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xNS4xNjQgdG1fcHRfNj0tOS42MzcgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuMDA1IHRtX3B0XzEwPS0xMS4xODIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjY1MSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTIuMzA4Ci00IHx8fCBzYW1lIHdpdGggdGhlIGVhcnRoY2VudGVyZWQg4Ka44Ka+4Kau4Kao4KeN4Kak4Kak4Kao4KeN4Kak4KeN4Kaw4KeH4KawIOCmquCmpOCmqOCnh+CmsCBpbmRpY2F0aW9uIG1hdGNoIHRoaXMgbm92ZWwgZnJvbSAuIHx8fCBsbV8wPS00MS44MjcgbG1fMT0tNDIuMzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMTYuMjEyIHRtX3B0XzY9LTEwLjA4NCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuMDAzIHRtX3B0XzEwPS0xMi4wNTQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjM0MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTIuMzkyCi00IHx8fCBzYW1lIHdpdGggdGhlIGVhcnRoY2VudGVyZWQg4Ka44Ka+4Kau4Kao4KeN4Kak4Kak4Kao4KeN4Kak4KeN4Kaw4KeH4KawIOCmquCmpOCmqOCnh+CmsCBwcmVzYWdlIG1hdGNoIGZyb20gdGhpcyBub3ZlbHMgLiB8fHwgbG1fMD0tNDIuMDczIGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xNC4wNjYgdG1fcHRfNj0tOS42MzcgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuMDA1IHRtX3B0XzEwPS0xMS4xODIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjY1MSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTIuNDM4Ci00IHx8fCBzYW1lIHdpdGggdGhlIGVhcnRoY2VudGVyZWQg4Ka44Ka+4Kau4Kao4KeN4Kak4Kak4Kao4KeN4Kak4KeN4Kaw4KeH4KawIOCmquCmpOCmqOCnh+CmsCBwcmVzYWdlIG1hdGNoIHRoaXMgbm92ZWwgZnJvbSAuIHx8fCBsbV8wPS00Mi4xMDIgbG1fMT0tNDIuMzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMTUuMTEzIHRtX3B0XzY9LTEwLjA4NCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuMDAzIHRtX3B0XzEwPS0xMi4wNTQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjM0MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTIuNTIyCi00IHx8fCB0aGUgd2l0aCB0aGUgZWFydGhjZW50ZXJlZCDgprjgpr7gpq7gpqjgp43gpqTgpqTgpqjgp43gpqTgp43gprDgp4fgprAg4Kaq4Kak4Kao4KeH4KawIGluZGljYXRpb24gbWF0Y2ggdGhpcyBub3ZlbCBmcm9tIC4gfHx8IGxtXzA9LTM5LjczMiBsbV8xPS00Mi4zOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yMC42NDAgdG1fcHRfNj0tOS45ODMgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0zLjAyMSB0bV9wdF8xMD0tMTguMjYwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi43MjkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjkyLjcyNwotNCB8fHwgd2l0aCB0aGUgc2FtZSBlYXJ0aGNlbnRlcmVkIOCmuOCmvuCmruCmqOCnjeCmpOCmpOCmqOCnjeCmpOCnjeCmsOCnh+CmsCDgpqrgpqTgpqjgp4fgprAgaW5kaWNhdGlvbiBtYXRjaCBmcm9tIHRoaXMgbm92ZWwgLiB8fHwgbG1fMD0tMzcuNzk2IGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNi4yMTIgdG1fcHRfNj0tMTAuMDg0IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjM3MyB0bV9wdF8xMD0tMTQuMTg4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy44MDkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTIuODAyCi01IHx8fCDgpqjgpr/gprDgp43gpqzgpprgpqjgp4cgbXVqaWIgYW5kIGhpcyBwYXJ0eSDgpqjgpr/gprDgppngp43gppXgp4HgprcgbWFqb3JpdHkgaW4gLiB8fHwgbG1fMD0tMjUuMTI0IGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMy4xMDIgdG1fcHRfNj0tOC40ODIgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMjg5IHRtX3B0XzEwPS0xNC4yMTYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjI1NiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjYyLjI3NQotNSB8fHwg4Kao4Ka/4Kaw4KeN4Kas4Kaa4Kao4KeHIG11amliIGFuZCBoaXMgcGFydHkg4Kao4Ka/4Kaw4KaZ4KeN4KaV4KeB4Ka3IG1ham9yaXR5IGluIHRoZSAuIHx8fCBsbV8wPS0yNS4yNjMgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTE2LjMxMCB0bV9wdF82PS02LjY5NSB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMC4yODkgdG1fcHRfMTA9LTEwLjM0NCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuNDI4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNjIuMjgyCi01IHx8fCDgpqjgpr/gprDgp43gpqzgpprgpqjgp4cgbXVqaWIgYW5kIGhpcyBwYXJ0eSDgpqjgpr/gprDgppngp43gppXgp4HgprcgbWFqb3JpdHkgbWFqb3JpdHkgLiB8fHwgbG1fMD0tMjYuOTQ0IGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS05Ljc4NyB0bV9wdF82PS05Ljg2OCB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC42MzkgdG1fcHRfMTA9LTEwLjQxMyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMTcyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNjMuOTkwCi01IHx8fCDgpqjgpr/gprDgp43gpqzgpprgpqjgp4cgbXVqaWIgYW5kIGhpcyBwYXJ0eSDgpqjgpr/gprDgppngp43gppXgp4HgprcgbWFqb3JpdHkgdGhhdCAuIHx8fCBsbV8wPS0yNi4yMzUgbG1fMT0tMzIuNjExIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEyLjgxMCB0bV9wdF82PS05LjM1NyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC40MDYgdG1fcHRfMTA9LTEzLjc3MCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuNzY3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNjQuMDU0Ci01IHx8fCDgpqjgpr/gprDgp43gpqzgpprgpqjgp4cgbXVqaWIgYW5kIGhpcyBwYXJ0eSBtYWpvcml0eSBpbiDgpqjgpr/gprDgppngp43gppXgp4HgprcgLiB8fHwgbG1fMD0tMjUuMTI0IGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xMy4xMDIgdG1fcHRfNj0tOC40ODIgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuNTIyIHRtX3B0XzEwPS0xMi45MTcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjM3NCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjY0LjEzNQotNSB8fHwg4Kao4Ka/4Kaw4KeN4Kas4Kaa4Kao4KeHIG11amliIGFuZCBoaXMgcGFydHkg4Kao4Ka/4Kaw4KaZ4KeN4KaV4KeB4Ka3IG1ham9yaXR5IHRoYXQgdGhlIC4gfHx8IGxtXzA9LTI3LjcwMiBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTYuMDE4IHRtX3B0XzY9LTcuNTcxIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjI3MSB0bV9wdF8xMD0tNS42MTkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xLjE2MSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjY0LjQ4NAotNSB8fHwg4Kao4Ka/4Kaw4KeN4Kas4Kaa4Kao4KeHIG11amliIGFuZCBoaXMgcGFydHkg4Kao4Ka/4Kaw4KaZ4KeN4KaV4KeB4Ka3IG1ham9yaXR5IHdoZXJlIHRoZSAuIHx8fCBsbV8wPS0yOC4xODggbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE1LjAzMiB0bV9wdF82PS05LjE4MCB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC40MDYgdG1fcHRfMTA9LTIuMTUzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMC40NjggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI2NC41NTgKLTYgfHx8IOCmueCmv+Cmn+CmsuCmvuCmsOCmkyDgpqzgpr7gpq3gpr7gprDgpr/gpq/gprzgpr7gprAg4Kau4Ka/4KaJ4Kao4Ka/4KaWIOCmtuCmueCmsOCnh+CmhyBoaXMgd29yayB3aXRoIHRvIHRoYXQgLiB8fHwgbG1fMD0tMzMuNDI1IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMi41MDkgdG1fcHRfNj0tMTEuMTYzIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjM3MCB0bV9wdF8xMD0tMTguODQ1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi42ODEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC00NzYuNzQ0Ci02IHx8fCDgprngpr/gpp/gprLgpr7gprDgppMg4Kas4Ka+4Kat4Ka+4Kaw4Ka/4Kav4Ka84Ka+4KawIOCmruCmv+CmieCmqOCmv+CmliDgprbgprngprDgp4fgpocgaGlzIHdvcmsgd2l0aCBjYW4gdGhhdCAuIHx8fCBsbV8wPS0zNS4yOTIgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE5LjI0MiB0bV9wdF82PS05LjgzMiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS41MDMgdG1fcHRfMTA9LTE3LjAxMSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuNTI4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNDc3LjkwOAotNiB8fHwg4Ka54Ka/4Kaf4Kay4Ka+4Kaw4KaTIOCmrOCmvuCmreCmvuCmsOCmv+Cmr+CmvOCmvuCmsCDgpq7gpr/gpongpqjgpr/gppYg4Ka24Ka54Kaw4KeH4KaHIGhpcyB3b3JrIHdpdGggdGhhdCBjYW4gLiB8fHwgbG1fMD0tMzMuOTczIGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xOS4yNDIgdG1fcHRfNj0tOS44MzIgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0xNy4zNzYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjMwNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNDc3Ljk2NAotNiB8fHwg4Ka54Ka/4Kaf4Kay4Ka+4Kaw4KaTIOCmrOCmvuCmreCmvuCmsOCmv+Cmr+CmvOCmvuCmsCDgpq7gpr/gpongpqjgpr/gppYg4Ka24Ka54Kaw4KeH4KaHIGhpcyB3b3JrcyB3aXRoIHRvIHRoYXQgLiB8fHwgbG1fMD0tMzMuNjk0IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMi44MzkgdG1fcHRfNj0tMTIuMDkwIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjM3MSB0bV9wdF8xMD0tMTkuMzE3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC41NzggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC00NzguMjUxCi02IHx8fCDgprngpr/gpp/gprLgpr7gprDgppMg4Kas4Ka+4Kat4Ka+4Kaw4Ka/4Kav4Ka84Ka+4KawIOCmruCmv+CmieCmqOCmv+CmliDgprbgprngprDgp4fgpocgaGlzIHdvcmsgd2l0aCBhIHRoYXQgLiB8fHwgbG1fMD0tMzMuMTA4IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0yNC4yMjkgdG1fcHRfNj0tMTMuMTA5IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjQxOCB0bV9wdF8xMD0tMTguOTg2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi42MTIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ3OC4zNjIKLTYgfHx8IOCmueCmv+Cmn+CmsuCmvuCmsOCmkyDgpqzgpr7gpq3gpr7gprDgpr/gpq/gprzgpr7gprAg4Kau4Ka/4KaJ4Kao4Ka/4KaWIOCmtuCmueCmsOCnh+CmhyBoaXMgd29ya3Mgd2l0aCBjYW4gdGhhdCAuIHx8fCBsbV8wPS0zNS41NjIgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE5LjU3MiB0bV9wdF82PS0xMC43NTkgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTEuNTA0IHRtX3B0XzEwPS0xNy40ODMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjQyNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ3OS40MTQKLTYgfHx8IOCmueCmv+Cmn+CmsuCmvuCmsOCmkyDgpqzgpr7gpq3gpr7gprDgpr/gpq/gprzgpr7gprAg4Kau4Ka/4KaJ4Kao4Ka/4KaWIOCmtuCmueCmsOCnh+CmhyBoaXMgd29ya3Mgd2l0aCB0aGF0IGNhbiAuIHx8fCBsbV8wPS0zNC4yNDIgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE5LjU3MiB0bV9wdF82PS0xMC43NTkgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0xNy44NDcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjIwMiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNDc5LjQ3MQotNyB8fHwgdGFzayAsIOCmk+Cmj+CmuC3gpp/gp43gpq/gpr7gpqggYW5kIGFsc28gc29tZSBsaW51eCDgpqrgp43gprDgpqTgpr/gpqjgpr/gpqfgpr/gpqTgp43gpqzgppXgpr7gprDgp4AgY2hhcmFjdGVyIGlzIGJ1dCB0aGVzZSB2ZXJ5IGlzIG5vdCAuIHx8fCBsbV8wPS00Ny4zOTAgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tMzYuODA1IHRtX3B0XzY9LTE1LjM3MiB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTEuODcxIHRtX3B0XzEwPS0yNC4zODAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjAzMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMTcuNTc2Ci03IHx8fCB0YXNrICwg4KaT4KaP4Ka4LeCmn+CnjeCmr+CmvuCmqCBhbmQgc29tZSBtb3JlIGxpbnV4IOCmquCnjeCmsOCmpOCmv+CmqOCmv+Cmp+Cmv+CmpOCnjeCmrOCmleCmvuCmsOCngCBjaGFyYWN0ZXIgaXMgYnV0IHRoZXNlIHZlcnkgaXMgbm90IC4gfHx8IGxtXzA9LTQ3LjQxNiBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS0zNC44MjEgdG1fcHRfNj0tMTQuMDc5IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44NzQgdG1fcHRfMTA9LTI0LjQ2MCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuMjA0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMxNy44MzUKLTcgfHx8IHRhc2sgLCDgppPgpo/gprgt4Kaf4KeN4Kav4Ka+4KaoIGFuZCBhbHNvIHNvbWUgbGludXgg4Kaq4KeN4Kaw4Kak4Ka/4Kao4Ka/4Kan4Ka/4Kak4KeN4Kas4KaV4Ka+4Kaw4KeAIGNoYXJhY3RlciBhcmUgYnV0IHRoZXNlIHZlcnkgaXMgbm90IC4gfHx8IGxtXzA9LTQ4LjMyNiBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS0zNS43MjcgdG1fcHRfNj0tMTUuMTE4IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44NzEgdG1fcHRfMTA9LTIzLjEyMyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguNjQ3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMxNy45NzkKLTcgfHx8IHRhc2sgLCDgppPgpo/gprgt4Kaf4KeN4Kav4Ka+4KaoIGFuZCBzb21lIG1vcmUgbGludXgg4Kaq4KeN4Kaw4Kak4Ka/4Kao4Ka/4Kan4Ka/4Kak4KeN4Kas4KaV4Ka+4Kaw4KeAIGNoYXJhY3RlciBhcmUgYnV0IHRoZXNlIHZlcnkgaXMgbm90IC4gfHx8IGxtXzA9LTQ4LjM1MiBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS0zMy43NDMgdG1fcHRfNj0tMTMuODI1IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44NzQgdG1fcHRfMTA9LTIzLjIwMyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguODIxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMxOC4yMzgKLTcgfHx8IHRhc2sgLCDgppPgpo/gprgt4Kaf4KeN4Kav4Ka+4KaoIGFuZCBhbHNvIHNvbWUgbGludXgg4Kaq4KeN4Kaw4Kak4Ka/4Kao4Ka/4Kan4Ka/4Kak4KeN4Kas4KaV4Ka+4Kaw4KeAIGNoYXJhY3RlciB0aGVyZSBidXQgdGhlc2UgdmVyeSBpcyBub3QgLiB8fHwgbG1fMD0tNDguNjgwIGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTM0LjQzOSB0bV9wdF82PS0xNC45MzkgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0xLjg3MSB0bV9wdF8xMD0tMjIuNDc2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOS41NDEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTUuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzE4LjI1OAotNyB8fHwgdGFzayAsIOCmk+Cmj+CmuC3gpp/gp43gpq/gpr7gpqggYW5kIG1vcmUgc29tZSBsaW51eCDgpqrgp43gprDgpqTgpr/gpqjgpr/gpqfgpr/gpqTgp43gpqzgppXgpr7gprDgp4AgY2hhcmFjdGVyIGlzIGJ1dCB0aGVzZSB2ZXJ5IGlzIG5vdCAuIHx8fCBsbV8wPS00OS4yMDIgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tMzQuODIxIHRtX3B0XzY9LTE0LjA3OSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTEuODcxIHRtX3B0XzEwPS0yMy41OTkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04LjE4MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMTguNDkzCi03IHx8fCB0YXNrICwg4KaT4KaP4Ka4LeCmn+CnjeCmr+CmvuCmqCBhbmQgc29tZSBtb3JlIGxpbnV4IOCmquCnjeCmsOCmpOCmv+CmqOCmv+Cmp+Cmv+CmpOCnjeCmrOCmleCmvuCmsOCngCBjaGFyYWN0ZXIgdGhlcmUgYnV0IHRoZXNlIHZlcnkgaXMgbm90IC4gfHx8IGxtXzA9LTQ4LjcwNiBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS0zMi40NTYgdG1fcHRfNj0tMTMuNjQ2IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44NzQgdG1fcHRfMTA9LTIyLjU1NyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuNzE1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMxOC41MTcKLTcgfHx8IHRhc2sgd2l0aG91dCDgppPgpo/gprgt4Kaf4KeN4Kav4Ka+4KaoIGFuZCBzb21lIG1vcmUgbGludXgg4Kaq4KeN4Kaw4Kak4Ka/4Kao4Ka/4Kan4Ka/4Kak4KeN4Kas4KaV4Ka+4Kaw4KeAIGNoYXJhY3RlciBpcyBidXQgdGhlc2UgdmVyeSBpcyBub3QgLiB8fHwgbG1fMD0tNDkuNDAyIGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTMxLjQxMyB0bV9wdF82PS0xNi40MzEgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0xLjg3NCB0bV9wdF8xMD0tMTcuMjQ0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOS4yMDQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzE4LjU3MgotNyB8fHwgdGFzayAsIOCmk+Cmj+CmuC3gpp/gp43gpq/gpr7gpqggYW5kIGFsc28gc29tZSBsaW51eCDgpqrgp43gprDgpqTgpr/gpqjgpr/gpqfgpr/gpqTgp43gpqzgppXgpr7gprDgp4AgY2hhcmFjdGVyIGlzIGJ1dCB0aGVzZSBhIGlzIG5vdCAuIHx8fCBsbV8wPS00Ni4yMDUgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNDAuNTIxIHRtX3B0XzY9LTE2LjQ0MCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTEuODg5IHRtX3B0XzEwPS0yOC40ODMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjkwNiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMTguNTc0Ci03IHx8fCB0YXNrICwg4KaT4KaP4Ka4LeCmn+CnjeCmr+CmvuCmqCBhbmQgc29tZSBtb3JlIGxpbnV4IOCmquCnjeCmsOCmpOCmv+CmqOCmv+Cmp+Cmv+CmpOCnjeCmrOCmleCmvuCmsOCngCBjaGFyYWN0ZXIgaXMgYnV0IHRoZXNlIGEgaXMgbm90IC4gfHx8IGxtXzA9LTQ2LjIzMCBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS0zOC41MzggdG1fcHRfNj0tMTUuMTQ3IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44OTIgdG1fcHRfMTA9LTI4LjU2MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEwLjA3OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMTguODMzCi04IHx8fCBpdCBzb2NpYWwgc2l0dWF0aW9uIGluIOCmuOCmv+CmpuCnjeCmp+CmvuCmqOCnjeCmpOCml+CnjeCmsOCmueCmqOCmleCmvuCmsOCngCBoaXMgb3Bwb3NpdGlvbnMgd2l0aCDgppXgp43gprDgp4DgpqHgprzgpr7gppXgp43gprfgp4fgpqTgp43gprDgp4cgZGVjaXNpb24gbWFraW5nIHRoZSBydWxlIG9mIHNlcnZpY2VzIC4gfHx8IGxtXzA9LTQ1LjUzMSBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS00NS45MzAgdG1fcHRfNj0tMzAuNDEyIHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMy40MzIgdG1fcHRfMTA9LTMzLjAzNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguNzU4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyNi41NTQKLTggfHx8IHRoaXMgc29jaWFsIHNpdHVhdGlvbiBpbiDgprjgpr/gpqbgp43gpqfgpr7gpqjgp43gpqTgppfgp43gprDgprngpqjgppXgpr7gprDgp4AgaGlzIG9wcG9zaXRpb25zIHdpdGgg4KaV4KeN4Kaw4KeA4Kah4Ka84Ka+4KaV4KeN4Ka34KeH4Kak4KeN4Kaw4KeHIGRlY2lzaW9uIG1ha2luZyB0aGUgcnVsZSBvZiBzZXJ2aWNlcyAuIHx8fCBsbV8wPS00NC43NzAgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNDcuNTI0IHRtX3B0XzY9LTMxLjM1OSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTMuNDMyIHRtX3B0XzEwPS0zNC45NjcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjM5MCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjYuOTY3Ci04IHx8fCBpdCBzb2NpYWwgc2l0dWF0aW9uIGluIOCmuOCmv+CmpuCnjeCmp+CmvuCmqOCnjeCmpOCml+CnjeCmsOCmueCmqOCmleCmvuCmsOCngCBoaXMgb3Bwb3NpdGlvbnMgd2l0aCDgppXgp43gprDgp4DgpqHgprzgpr7gppXgp43gprfgp4fgpqTgp43gprDgp4cgZGVjaXNpb24gbWFraW5nIHRoZSBydWxlcyBvZiBzZXJ2aWNlcyAuIHx8fCBsbV8wPS00Ni4wMTggbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNDUuMzMyIHRtX3B0XzY9LTMxLjAwMCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTMuNTYxIHRtX3B0XzEwPS0zMi42NjYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjQ1MSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjcuNDk4Ci04IHx8fCB0aGlzIHNvY2lhbCBzaXR1YXRpb24gaW4g4Ka44Ka/4Kam4KeN4Kan4Ka+4Kao4KeN4Kak4KaX4KeN4Kaw4Ka54Kao4KaV4Ka+4Kaw4KeAIGhpcyBvcHBvc2l0aW9ucyB3aXRoIOCmleCnjeCmsOCngOCmoeCmvOCmvuCmleCnjeCmt+Cnh+CmpOCnjeCmsOCnhyBkZWNpc2lvbiBtYWtpbmcgdGhlIHJ1bGVzIG9mIHNlcnZpY2VzIC4gfHx8IGxtXzA9LTQ1LjI1NyBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS00Ni45MjUgdG1fcHRfNj0tMzEuOTQ3IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMy41NjEgdG1fcHRfMTA9LTM0LjU5OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEwLjA4MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjcuOTExCi04IHx8fCBpdCBzb2NpYWwgc2l0dWF0aW9uIGluIOCmuOCmv+CmpuCnjeCmp+CmvuCmqOCnjeCmpOCml+CnjeCmsOCmueCmqOCmleCmvuCmsOCngCBoaXMgb3Bwb3NpdGlvbnMgd2l0aCDgppXgp43gprDgp4DgpqHgprzgpr7gppXgp43gprfgp4fgpqTgp43gprDgp4cgZGVjaXNpb24gbWFraW5nIHRoZSBydWxlIG9mIHRoZSBmaW5nZXJzIC4gfHx8IGxtXzA9LTQ3LjA5MCBsbV8xPS01OC4xNjkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00OC40OTcgdG1fcHRfNj0tMjQuODM4IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMy42NjUgdG1fcHRfMTA9LTM0LjAzMiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEwLjU4MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTguMjUyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjguNjQ0Ci04IHx8fCBpdCBzb2NpYWwgc2l0dWF0aW9uIGluIOCmuOCmv+CmpuCnjeCmp+CmvuCmqOCnjeCmpOCml+CnjeCmsOCmueCmqOCmleCmvuCmsOCngCBoaXMgb3Bwb3NpdGlvbnMgd2l0aCDgppXgp43gprDgp4DgpqHgprzgpr7gppXgp43gprfgp4fgpqTgp43gprDgp4cgZGVjaXNpb24gbWFraW5nIGlzIHJ1bGUgb2Ygc2VydmljZXMgLiB8fHwgbG1fMD0tNDguMzg0IGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTQ0LjMwNSB0bV9wdF82PS0zMC4xMzggdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0zLjQxNCB0bV9wdF8xMD0tMzEuMTQwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOC4xNzAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzI4Ljk2NwotOCB8fHwgdGhpcyBzb2NpYWwgc2l0dWF0aW9uIGluIOCmuOCmv+CmpuCnjeCmp+CmvuCmqOCnjeCmpOCml+CnjeCmsOCmueCmqOCmleCmvuCmsOCngCBoaXMgb3Bwb3NpdGlvbnMgd2l0aCDgppXgp43gprDgp4DgpqHgprzgpr7gppXgp43gprfgp4fgpqTgp43gprDgp4cgZGVjaXNpb24gbWFraW5nIHRoZSBydWxlIG9mIHRoZSBmaW5nZXJzIC4gfHx8IGxtXzA9LTQ2LjMyOSBsbV8xPS01OC4xNjkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS01MC4wOTEgdG1fcHRfNj0tMjUuNzg1IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMy42NjUgdG1fcHRfMTA9LTM1Ljk2NSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTExLjIxNCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTguMjUyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjkuMDU2Ci05IHx8fCDgpqzgp4Pgprfgp43gpp/gpr/gpqrgpr7gpqTgpoMgYW5udWFsIOCnqOCnq+CnquCnpiDgpq7gpr/gprLgpr8gbWV0ZXJzIHx8fCBsbV8wPS0yNi4zNDAgbG1fMT0tMTkuNTY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTMuMzcyIHRtX3B0XzY9LTMuMDU0IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPS0yLjE0MCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuMjYzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNDUuMjg4Ci05IHx8fCDgpqzgp4Pgprfgp43gpp/gpr/gpqrgpr7gpqTgpoMgYW5udWFsIOCnqOCnq+CnquCnpiDgpq7gpr/gprLgpr8gbWV0ZXIgfHx8IGxtXzA9LTI2LjMxNiBsbV8xPS0xOS41NjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMy44ODUgdG1fcHRfNj0tMi44MjEgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTIuMTQwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS4zMzcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM0NS4zMDMKLTkgfHx8IOCmrOCng+Cmt+CnjeCmn+Cmv+CmquCmvuCmpOCmgyBhcnJhbmdlIOCnqOCnq+CnquCnpiDgpq7gpr/gprLgpr8gbWV0ZXJzIHx8fCBsbV8wPS0yNi41MzIgbG1fMT0tMTkuNTY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTIuOTE2IHRtX3B0XzY9LTMuNzQ4IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS45NTYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM0NS44ODQKLTkgfHx8IOCmrOCng+Cmt+CnjeCmn+Cmv+CmquCmvuCmpOCmgyBhcnJhbmdlIOCnqOCnq+CnquCnpiDgpq7gpr/gprLgpr8gbWV0ZXIgfHx8IGxtXzA9LTI2LjUwOSBsbV8xPS0xOS41NjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMy40MzAgdG1fcHRfNj0tMy41MTQgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMS4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjAzMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzQ1LjkwMAotOSB8fHwg4Kas4KeD4Ka34KeN4Kaf4Ka/4Kaq4Ka+4Kak4KaDIGFubnVhbCDgp6jgp6vgp6rgp6Yg4Kau4Ka/4Kay4Ka/IG1ldHJlcyB8fHwgbG1fMD0tMjYuNzcxIGxtXzE9LTE5LjU2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0zLjYwOCB0bV9wdF82PS00LjM4OSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjUwMyB0bV9wdF8xMD0tMi4xNDAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjgwMyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzQ2Ljk3OQotOSB8fHwg4Kas4KeD4Ka34KeN4Kaf4Ka/4Kaq4Ka+4Kak4KaDIGFycmFuZ2Ug4Keo4Ker4Keq4KemIOCmruCmv+CmsuCmvyBtZXRyZXMgfHx8IGxtXzA9LTI2Ljk2MyBsbV8xPS0xOS41NjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMy4xNTMgdG1fcHRfNj0tNS4wODMgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMS4xMzUgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjQ5NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzQ3LjU3NgotMTAgfHx8IGluIDIwMDQg4Kau4KeN4Kav4Ka+4Ka44Ka+4Kaa4KeB4Ka44KeH4Kaf4Ka4IOCmheCmmeCnjeCml+CmsOCmvuCmnOCnjeCmr+Cnh+CmsCDgpqzgprjgp43gpp/gpqggaW4g4Kah4KeH4Kau4KeL4KaV4KeN4Kaw4KeN4Kav4Ka+4KafIGluIHRoZSBuYXRpb25hbCB3YXMgaGUgbWFpbiBzcGVlY2ggLWxyYi0ga2V5bm90ZSBzcGVlY2ggLXJyYi0gb24gdGhlIC4gfHx8IGxtXzA9LTY0LjczNSBsbV8xPS03MS43NDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00My4xMzMgdG1fcHRfNj0tMTcuMTM2IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMS43MzggdG1fcHRfMTA9LTM1LjM3MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguMTI3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc1NC40MDcKLTEwIHx8fCBpbiAyMDA0IOCmruCnjeCmr+CmvuCmuOCmvuCmmuCngeCmuOCnh+Cmn+CmuCDgpoXgppngp43gppfgprDgpr7gppzgp43gpq/gp4fgprAg4Kas4Ka44KeN4Kaf4KaoIGluIOCmoeCnh+CmruCni+CmleCnjeCmsOCnjeCmr+CmvuCmnyBpbiB0aGUgbmF0aW9uYWwgd2FzIGhlIG1haW4gc3BlZWNoIC1scmItIGtleW5vdGUgc3BlZWNoIC1ycmItIHRvIHRoZSAuIHx8fCBsbV8wPS02NC40NTcgbG1fMT0tNzEuNzQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNDQuMjEyIHRtX3B0XzY9LTE3LjI5MCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTEuNzA3IHRtX3B0XzEwPS0zNi4zNzIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjkwNCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgV29yZFBlbmFsdHk9LTkuOTg5IE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03NTQuNDc4Ci0xMCB8fHwgaW4gMjAwNCDgpq7gp43gpq/gpr7gprjgpr7gpprgp4Hgprjgp4fgpp/gprgg4KaF4KaZ4KeN4KaX4Kaw4Ka+4Kac4KeN4Kav4KeH4KawIOCmrOCmuOCnjeCmn+CmqCBpbiDgpqHgp4fgpq7gp4vgppXgp43gprDgp43gpq/gpr7gpp8gaW4gdGhlIG5hdGlvbmFsIGhlIHdhcyB0aGUgc3BlZWNoIC1scmItIGtleW5vdGUgc3BlZWNoIC1ycmItIG9uIHRoZSAuIHx8fCBsbV8wPS02MC41MDkgbG1fMT0tNzEuNzQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNDcuNTc5IHRtX3B0XzY9LTE3Ljg4NCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTEuNzM4IHRtX3B0XzEwPS00Mi42NjEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMi4yNjQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTcuMDAwIFdvcmRQZW5hbHR5PS05Ljk4OSBPT1ZQZW5hbHR5PS02MDAuMDAwIHx8fCAtNzU0LjYwNAotMTAgfHx8IGluIDIwMDQg4Kau4KeN4Kav4Ka+4Ka44Ka+4Kaa4KeB4Ka44KeH4Kaf4Ka4IOCmheCmmeCnjeCml+CmsOCmvuCmnOCnjeCmr+Cnh+CmsCDgpqzgprjgp43gpp/gpqggaW4g4Kah4KeH4Kau4KeL4KaV4KeN4Kaw4KeN4Kav4Ka+4KafIGluIHRoZSBuYXRpb25hbCBoZSB3YXMgdGhlIHNwZWVjaCAtbHJiLSBrZXlub3RlIHNwZWVjaCAtcnJiLSB0byB0aGUgLiB8fHwgbG1fMD0tNjAuMjMxIGxtXzE9LTcxLjc0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTQ4LjY1OCB0bV9wdF82PS0xOC4wMzggdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0xLjcwNyB0bV9wdF8xMD0tNDMuNjYxIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTIuMDQxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE3LjAwMCBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc1NC42NzQKLTEwIHx8fCBpbiAyMDA0IOCmruCnjeCmr+CmvuCmuOCmvuCmmuCngeCmuOCnh+Cmn+CmuCDgpoXgppngp43gppfgprDgpr7gppzgp43gpq/gp4fgprAg4Kas4Ka44KeN4Kaf4KaoIGluIOCmoeCnh+CmruCni+CmleCnjeCmsOCnjeCmr+CmvuCmnyBpbiB0aGUgbmF0aW9uYWwgd2FzIGhlIG1haW4gc3BlZWNoIC1scmItIGtleW5vdGUgc3BlZWNoIC1ycmItICwgdGhlIC4gfHx8IGxtXzA9LTYzLjYwNCBsbV8xPS03MS43NDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00NS4zNDMgdG1fcHRfNj0tMTYuODMxIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi4wNTYgdG1fcHRfMTA9LTM5LjExNSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguODIwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc1NC44MDQKLTEwIHx8fCBpbiAyMDA0IOCmruCnjeCmr+CmvuCmuOCmvuCmmuCngeCmuOCnh+Cmn+CmuCDgpoXgppngp43gppfgprDgpr7gppzgp43gpq/gp4fgprAg4Kas4Ka44KeN4Kaf4KaoIGluIOCmoeCnh+CmruCni+CmleCnjeCmsOCnjeCmr+CmvuCmnyBpbiB0aGUgbmF0aW9uYWwgaGUgd2FzIHRoZSBzcGVlY2ggLWxyYi0ga2V5bm90ZSBzcGVlY2ggLXJyYi0gLCB0aGUgLiB8fHwgbG1fMD0tNTkuMzc4IGxtXzE9LTcxLjc0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTQ5Ljc4OSB0bV9wdF82PS0xNy41NzggdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0yLjA1NiB0bV9wdF8xMD0tNDYuNDA1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTIuOTU3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE3LjAwMCBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc1NS4wMDAKLTEwIHx8fCBpbiAyMDA0IOCmruCnjeCmr+CmvuCmuOCmvuCmmuCngeCmuOCnh+Cmn+CmuCDgpoXgppngp43gppfgprDgpr7gppzgp43gpq/gp4fgprAg4Kas4Ka44KeN4Kaf4KaoIGluIOCmoeCnh+CmruCni+CmleCnjeCmsOCnjeCmr+CmvuCmnyBpbiB0aGUgbmF0aW9uYWwgaGUgd2FzIG1haW4gc3BlZWNoIC1scmItIGtleW5vdGUgc3BlZWNoIC1ycmItICwgdGhlIC4gfHx8IGxtXzA9LTYyLjEyOSBsbV8xPS03MS43NDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS00NS4zNDMgdG1fcHRfNj0tMTYuODMxIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi4wNTYgdG1fcHRfMTA9LTQxLjc5NyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEwLjk3MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNy4wMDAgV29yZFBlbmFsdHk9LTkuOTg5IE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03NTUuNDAwCi0xMSB8fHwgcG9wdWxhdGlvbiAsIHBvd2VyIGRpc3RyaWJ1dGlvbiBlYXN0IHBha2lzdGFuIHdoZXJlIHRvIHdlc3QgcGFraXN0YW4gIiBvbmUgdW5pdCB0aGVvcnkgIiBpcyBhIOCmheCmreCmv+CmqOCmrCBzdGFydGVkIHdpdGggdGhlIHdoZXJlIHRoZSByZWdhcmRlZCBhcyBhIHByb3ZpbmNlIHdlc3QgcGFraXN0YW4gLiB8fHwgbG1fMD0tNjkuODE1IGxtXzE9LTEwMS4wOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMjUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIwLjAwMCB0bV9wdF81PS03NS4wMzggdG1fcHRfNj0tNDUuNDg0IHRtX3B0Xzc9LTI1LjAwMCB0bV9wdF84PS02Ny45NTAgdG1fcHRfOT0tMy45NDggdG1fcHRfMTA9LTU4LjM5NCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEzLjcwNiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTI5LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yMC4wMDAgV29yZFBlbmFsdHk9LTEzLjg5NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMzEzLjMxMgotMTEgfHx8IHBvcHVsYXRpb24gLCBwb3dlciBkaXN0cmlidXRpb24gZWFzdCBwYWtpc3RhbiB3aGVyZSB0byB3ZXN0IHBha2lzdGFuICIgb25lIHVuaXQgdGhlb3J5ICIgaXMgYSDgpoXgpq3gpr/gpqjgpqwgdGhleSBzdGFydGVkIHRoZSB3aGVyZSB0aGUgcmVnYXJkZWQgYXMgYSBwcm92aW5jZSB3ZXN0IHBha2lzdGFuIC4gfHx8IGxtXzA9LTcxLjM2NSBsbV8xPS0xMDEuMDk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTI1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yMS4wMDAgdG1fcHRfNT0tNzMuNjQ1IHRtX3B0XzY9LTQ1LjQ4NCB0bV9wdF83PS0yNS4wMDAgdG1fcHRfOD0tNjcuOTUwIHRtX3B0Xzk9LTMuNjMwIHRtX3B0XzEwPS01Ny4zMTMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMy44MjQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yOS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MjEuMDAwIFdvcmRQZW5hbHR5PS0xMy44OTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTMxMy40OTgKLTExIHx8fCBwb3B1bGF0aW9uICwgcG93ZXIgZGlzdHJpYnV0aW9uIGVhc3QgcGFraXN0YW4gd2hlcmUgdG8gd2VzdCBwYWtpc3RhbiAiIG9uZSB1bml0IHRoZW9yeSAiIGlzIGEg4KaF4Kat4Ka/4Kao4KasIHN0YXJ0ZWQgd2l0aCB0aGUgd2hlcmUgdGhlIHdlc3QgcGFraXN0YW4gcmVnYXJkZWQgYXMgYSBwcm92aW5jZSAuIHx8fCBsbV8wPS03MS42NDMgbG1fMT0tMTAxLjA5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMjEuMDAwIHRtX3B0XzU9LTc1LjAzOCB0bV9wdF82PS00NS40ODQgdG1fcHRfNz0tMjUuMDAwIHRtX3B0Xzg9LTY3Ljk1MCB0bV9wdF85PS0zLjg5OCB0bV9wdF8xMD0tNTYuOTI2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTIuODQ3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIxLjAwMCBXb3JkUGVuYWx0eT0tMTMuODk3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0zMTMuODg0Ci0xMSB8fHwgcG9wdWxhdGlvbiAsIHBvd2VyIGRpc3RyaWJ1dGlvbiBlYXN0IHBha2lzdGFuIHdoZXJlIHRvIHdlc3QgcGFraXN0YW4gIiBvbmUgdW5pdCB0aGVvcnkgIiBpcyBhIOCmheCmreCmv+CmqOCmrCB0aGV5IHN0YXJ0ZWQgdGhlIHdoZXJlIHRoZSB3ZXN0IHBha2lzdGFuIHJlZ2FyZGVkIGFzIGEgcHJvdmluY2UgLiB8fHwgbG1fMD0tNzMuMTkyIGxtXzE9LTEwMS4wOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMjUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIyLjAwMCB0bV9wdF81PS03My42NDUgdG1fcHRfNj0tNDUuNDg0IHRtX3B0Xzc9LTI1LjAwMCB0bV9wdF84PS02Ny45NTAgdG1fcHRfOT0tMy41ODAgdG1fcHRfMTA9LTU1Ljg0NCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEyLjk2NSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTI5LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yMi4wMDAgV29yZFBlbmFsdHk9LTEzLjg5NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMzE0LjA3MAotMTEgfHx8IHBvcHVsYXRpb24gb24gcG93ZXIgZGlzdHJpYnV0aW9uIGVhc3QgcGFraXN0YW4gd2hlcmUgdG8gd2VzdCBwYWtpc3RhbiAiIG9uZSB1bml0IHRoZW9yeSAiIGlzIGEg4KaF4Kat4Ka/4Kao4KasIHN0YXJ0ZWQgd2l0aCB0aGUgd2hlcmUgdGhlIHdlc3QgcGFraXN0YW4gcmVnYXJkZWQgYXMgYSBwcm92aW5jZSAuIHx8fCBsbV8wPS03Mi43MTkgbG1fMT0tMTAxLjA5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMjEuMDAwIHRtX3B0XzU9LTcxLjA1NiB0bV9wdF82PS00NC4wMTggdG1fcHRfNz0tMjUuMDAwIHRtX3B0Xzg9LTY3Ljk1MCB0bV9wdF85PS00LjUzMCB0bV9wdF8xMD0tNTQuNTY4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTMuNTQwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIxLjAwMCBXb3JkUGVuYWx0eT0tMTMuODk3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0zMTQuMTA0Ci0xMSB8fHwgcG9wdWxhdGlvbiAsIHBvd2VyIGRpc3RyaWJ1dGlvbiBlYXN0IHBha2lzdGFuIHdoZXJlIHRvIHdlc3QgcGFraXN0YW4gIiBvbmUgdW5pdCB0aGVvcnkgIiBpcyBhIOCmheCmreCmv+CmqOCmrCBzdGFydGVkIHdpdGggdGhlIHdoZXJlIHRoZSB3ZXN0IHBha2lzdGFuIGNvbnNpZGVyZWQgYXMgYSBwcm92aW5jZSAuIHx8fCBsbV8wPS03MS4xNzAgbG1fMT0tMTAxLjA5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMjEuMDAwIHRtX3B0XzU9LTc1LjE0NyB0bV9wdF82PS00My45MjYgdG1fcHRfNz0tMjUuMDAwIHRtX3B0Xzg9LTY3Ljk1MCB0bV9wdF85PS00LjUzMCB0bV9wdF8xMD0tNTkuMjI4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTMuNTQwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIxLjAwMCBXb3JkUGVuYWx0eT0tMTMuODk3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0zMTQuMTQ4Ci0xMSB8fHwgcG9wdWxhdGlvbiAsIHBvd2VyIGRpc3RyaWJ1dGlvbiBlYXN0IHBha2lzdGFuIHdoZXJlIHRvIHdlc3QgcGFraXN0YW4gIiBvbmUgdW5pdCB0aGVvcnkgIiBpcyBhIOCmheCmreCmv+CmqOCmrCB0aGV5IHN0YXJ0ZWQgdGhlIHdoZXJlIHRoZSB3ZXN0IHBha2lzdGFuIGNvbnNpZGVyZWQgYXMgYSBwcm92aW5jZSAuIHx8fCBsbV8wPS03Mi43MTkgbG1fMT0tMTAxLjA5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMjIuMDAwIHRtX3B0XzU9LTczLjc1NSB0bV9wdF82PS00My45MjYgdG1fcHRfNz0tMjUuMDAwIHRtX3B0Xzg9LTY3Ljk1MCB0bV9wdF85PS00LjIxMiB0bV9wdF8xMD0tNTguMTQ3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTMuNjU4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIyLjAwMCBXb3JkUGVuYWx0eT0tMTMuODk3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0zMTQuMzM0Ci0xMSB8fHwgcG9wdWxhdGlvbiBvbiBwb3dlciBkaXN0cmlidXRpb24gZWFzdCBwYWtpc3RhbiB3aGVyZSB0byB3ZXN0IHBha2lzdGFuICIgb25lIHVuaXQgdGhlb3J5ICIgaXMgYSDgpoXgpq3gpr/gpqjgpqwgc3RhcnRlZCB3aXRoIHRoZSB3aGVyZSB0aGUgd2VzdCBwYWtpc3RhbiBjb25zaWRlcmVkIGFzIGEgcHJvdmluY2UgLiB8fHwgbG1fMD0tNzIuMjQ2IGxtXzE9LTEwMS4wOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMjUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIxLjAwMCB0bV9wdF81PS03MS4xNjYgdG1fcHRfNj0tNDIuNDU5IHRtX3B0Xzc9LTI1LjAwMCB0bV9wdF84PS02Ny45NTAgdG1fcHRfOT0tNS4xNjMgdG1fcHRfMTA9LTU2Ljg3MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTE0LjIzMyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTI5LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yMS4wMDAgV29yZFBlbmFsdHk9LTEzLjg5NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMzE0LjM2OAotMTEgfHx8IHBvcHVsYXRpb24gb24gcG93ZXIgZGlzdHJpYnV0aW9uIGVhc3QgcGFraXN0YW4gd2hlcmUgdG8gd2VzdCBwYWtpc3RhbiAiIG9uZSB1bml0IHRoZW9yeSAiIGlzIGEg4KaF4Kat4Ka/4Kao4KasIHN0YXJ0ZWQgd2l0aCB0aGUgd2hlcmUgdGhlIHJlZ2FyZGVkIGFzIGEgcHJvdmluY2Ugd2VzdCBwYWtpc3RhbiAuIHx8fCBsbV8wPS03MC44OTEgbG1fMT0tMTAxLjA5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTkuMDAwIHRtX3B0XzU9LTcxLjA1NiB0bV9wdF82PS00NC4wMTggdG1fcHRfNz0tMjUuMDAwIHRtX3B0Xzg9LTY3Ljk1MCB0bV9wdF85PS00LjU4MCB0bV9wdF8xMD0tNTYuMDM5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTQuNDAxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE5LjAwMCBXb3JkUGVuYWx0eT0tMTMuODk3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0zMTQuNDk4Ci0xMiB8fHwgdGhlIOCmquCmsOCmv+CmruCmvuCmquCmqCB0aGVvcnkgfHx8IGxtXzA9LTExLjExMiBsbV8xPS0xMy4wNDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tOS4zMDkgdG1fcHRfNj0tMy45ODggdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTcuOTE2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS4zMTYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBXb3JkUGVuYWx0eT0tMi4xNzEgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEyNi41NTYKLTEyIHx8fCBtYXRoZW1hdGljYWwg4Kaq4Kaw4Ka/4Kau4Ka+4Kaq4KaoIHRoZW9yeSB8fHwgbG1fMD0tMTIuNjY1IGxtXzE9LTEzLjA0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0yLjg2OSB0bV9wdF82PS0yLjg5MCB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tNC44ODggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjAxMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTI2Ljg0OAotMTIgfHx8IOKAoiDgpqrgprDgpr/gpq7gpr7gpqrgpqggdGhlb3J5IHx8fCBsbV8wPS0xNC4yMTcgbG1fMT0tMTMuMDQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTEuMDQ2IHRtX3B0XzY9LTUuMjQxIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPS0wLjQyMiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuMzE2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9My4wMDAgV29yZFBlbmFsdHk9LTIuMTcxIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMjcuMzAxCi0xMiB8fHwgLiDgpqrgprDgpr/gpq7gpr7gpqrgpqggdGhlb3J5IHx8fCBsbV8wPS0xMi43NTggbG1fMT0tMTMuMDQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTcuOTAwIHRtX3B0XzY9LTIuOTkwIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMDE4IHRtX3B0XzEwPS0zLjY0MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuNzEyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTIuMTcxIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMjcuNjkxCi0xMyB8fHwgZXh0ZXJuYWwgbGlua3Mgb2YgfHx8IGxtXzA9LTYuOTg2IGxtXzE9LTEzLjA0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS03LjM5MCB0bV9wdF82PS0yLjcyOSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjAxOCB0bV9wdF8xMD0tNS4yODUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xLjYxMSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTMuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0yLjE3MSB8fHwgLTIwLjQ1OQotMTMgfHx8IG91dC1saW5rcyBvZiB8fHwgbG1fMD0tOC4wNzggbG1fMT0tOS43ODMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tNi45MzggdG1fcHRfNj0tNC43OTUgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4wMTggdG1fcHRfMTA9LTUuMjg1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy4yOTcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgfHx8IC0yMC45MjUKLTEzIHx8fCBleHRlcm5hbCBsaW5rIG9mIHx8fCBsbV8wPS03LjUzMyBsbV8xPS0xMy4wNDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tOC4wOTEgdG1fcHRfNj0tMi44NzEgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4wMTggdG1fcHRfMTA9LTUuMjg1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi43NjcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMi4xNzEgfHx8IC0yMS43MjgKLTEzIHx8fCBleHRlcm5hbCBjb21tdW5pY2F0aW9uIG9mIHx8fCBsbV8wPS03LjY5MiBsbV8xPS0xMy4wNDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tOC4yNjUgdG1fcHRfNj0tMi44ODYgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4wMTggdG1fcHRfMTA9LTUuMjg1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi41NTUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMi4xNzEgfHx8IC0yMS44ODgKLTEzIHx8fCBkZXNjcmlwdGlvbiBvZiB8fHwgbG1fMD0tNi4yODEgbG1fMT0tOS43ODMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMTAuNTIxIHRtX3B0XzY9LTcuMDk4IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTEuMDE4IHRtX3B0XzEwPS01Ljk3OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuNjAwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IHx8fCAtMjEuOTg5Ci0xMyB8fHwgb3V0LWxpbmtzIGJ5IHx8fCBsbV8wPS04LjQ5NSBsbV8xPS05Ljc4MyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS01Ljg2NiB0bV9wdF82PS01Ljk0OCB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tNC44MTYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjIxNCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyB8fHwgLTIyLjExOQotMTMgfHx8IGludGVyLWNvbm5lY3Rpdml0eSBvZiB8fHwgbG1fMD0tOC40NDcgbG1fMT0tOS43ODMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tNi45MzggdG1fcHRfNj0tNi40MDUgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4zODYgdG1fcHRfMTA9LTUuMjg1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC45MDcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgfHx8IC0yMi44MDMKLTE0IHx8fCB0YXRhIGNvbW11bmljYXRpb25lciAiIGZvcmVpZ24gc2FuY2hhciBuaWdhbSBsaW1pdGVkIGJ1aWxkaW5nIGl0IGluIHRlbGVjb21tdW5pY2F0aW9uIHN5c3RlbSBhIG1haW4gcHJvdmlkZXJzIHx8fCBsbV8wPS00Ny42MTggbG1fMT0tNTIuMTc4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEyLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMzEuMTgyIHRtX3B0XzY9LTE4Ljg0OCB0bV9wdF83PS0xMi4wMDAgdG1fcHRfOD0tMzIuNjE2IHRtX3B0Xzk9LTQuNDIwIHRtX3B0XzEwPS0yMC4wMjggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMS41MDYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS03LjM4MyB8fHwgLTExOS44MjIKLTE0IHx8fCB0YXRhIGNvbW11bmljYXRpb25lciAiIGZvcmVpZ24gc2FuY2hhciBuaWdhbSBsaW1pdGVkIGJ1aWxkaW5nIGl0IHRoZSB0ZWxlY29tbXVuaWNhdGlvbiBzeXN0ZW0gYSBtYWluIHByb3ZpZGVycyB8fHwgbG1fMD0tNDguODY2IGxtXzE9LTUyLjE3OCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTMwLjI5NCB0bV9wdF82PS0xNy4wMjggdG1fcHRfNz0tMTIuMDAwIHRtX3B0Xzg9LTMyLjYxNiB0bV9wdF85PS00LjM3MCB0bV9wdF8xMD0tMTkuNzc1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTAuMTg0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tNy4zODMgfHx8IC0xMjAuMDAwCi0xNCB8fHwgdGF0YSBjb21tdW5pY2F0aW9uICIgZm9yZWlnbiBzYW5jaGFyIG5pZ2FtIGxpbWl0ZWQgYnVpbGRpbmcgaXQgdGhlIHRlbGVjb21tdW5pY2F0aW9uIHN5c3RlbSBhIG1haW4gcHJvdmlkZXJzIHx8fCBsbV8wPS00Ny42MTIgbG1fMT0tNTIuMTc4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEyLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMzQuODQ4IHRtX3B0XzY9LTE3LjAyOCB0bV9wdF83PS0xMi4wMDAgdG1fcHRfOD0tMzIuNjE2IHRtX3B0Xzk9LTQuMzcwIHRtX3B0XzEwPS0yMi45MTEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMC4xODQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS03LjM4MyB8fHwgLTEyMC4xMzMKLTE0IHx8fCB0YXRhIGNvbW11bmljYXRpb25lciAiIGZvcmVpZ24gc2FuY2hhciBuaWdhbSBsaW1pdGVkIGJ1aWxkaW5nIGl0IGNpdHkgdGVsZWNvbW11bmljYXRpb24gc3lzdGVtIGEgbWFpbiBwcm92aWRlcnMgfHx8IGxtXzA9LTUwLjg1OSBsbV8xPS01Mi4xNzggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yNy4yMDQgdG1fcHRfNj0tMTcuOTQxIHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tNS4zNzAgdG1fcHRfMTA9LTE1LjQyMSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguODkyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNy4zODMgfHx8IC0xMjEuMjI5Ci0xNSB8fHwgaGUgdGhhdCB5ZWFyIOCnquCmhyDgpqjgpq3gp4fgpq7gp43gpqzgprDgp4fgprAgbmF0aW9uYWwgYXNzZW1ibHkgaW4gZWxlY3Rpb24gd29uIGFsbCBhbmQgdW5pdGVkIHN0YXRlcyBlbGVjdGVkIGFzIDQ0dGggcHJlc2lkZW50IC4gfHx8IGxtXzA9LTUyLjUzOCBsbV8xPS02NS4yMjMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTM1Ljg0NSB0bV9wdF82PS0xNi40NjUgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjc5MyB0bV9wdF8xMD0tMTEuMzAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4xMjAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTkuMTIwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjkuNzU4Ci0xNSB8fHwgaGUgdGhhdCB5ZWFyIOCnquCmhyDgpqjgpq3gp4fgpq7gp43gpqzgprDgp4fgprAgbmF0aW9uYWwgYXNzZW1ibHkgaW4gdGhlIHdvbiBhbGwgYW5kIHVuaXRlZCBzdGF0ZXMgZWxlY3RlZCBhcyA0NHRoIHByZXNpZGVudCAuIHx8fCBsbV8wPS00OS44NDggbG1fMT0tNjUuMjIzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS00Mi41MjUgdG1fcHRfNj0tMTcuNjI4IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMS43OTkgdG1fcHRfMTA9LTE3LjE1NiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuOTY3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTcuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS05LjEyMCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzI5LjkzMAotMTUgfHx8IGhlIHRoYXQgeWVhciDgp6rgpocg4Kao4Kat4KeH4Kau4KeN4Kas4Kaw4KeH4KawIGFzc2VtYmx5IGluIG5hdGlvbmFsIGVsZWN0aW9uIHdvbiBhbGwgYW5kIHVuaXRlZCBzdGF0ZXMgZWxlY3RlZCBhcyA0NHRoIHByZXNpZGVudCAuIHx8fCBsbV8wPS01Mi40NTMgbG1fMT0tNjUuMjIzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0zNS44NDUgdG1fcHRfNj0tMTYuNDY1IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMS43OTMgdG1fcHRfMTA9LTExLjA5NyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuOTA0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTcuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS05LjEyMCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzMwLjQ4OAotMTUgfHx8IGhlIHRoYXQgeWVhciDgp6rgpocg4Kao4Kat4KeH4Kau4KeN4Kas4Kaw4KeH4KawIGFzc2VtYmx5IHRoZSBuYXRpb25hbCBlbGVjdGlvbiB3b24gYWxsIGFuZCB1bml0ZWQgc3RhdGVzIGVsZWN0ZWQgYXMgNDR0aCBwcmVzaWRlbnQgLiB8fHwgbG1fMD0tNTEuNjY1IGxtXzE9LTY1LjIyMyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMzcuNjM3IHRtX3B0XzY9LTE3LjMyNSB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTEuODA0IHRtX3B0XzEwPS0xMi4zNDkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjA4NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE3LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tOS4xMjAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMzMC41NTAKLTE1IHx8fCBpbiB0aGUgeWVhciDgp6rgpocg4Kao4Kat4KeH4Kau4KeN4Kas4Kaw4KeH4KawIG5hdGlvbmFsIGFzc2VtYmx5IGluIGVsZWN0aW9uIHdvbiBhbGwgYW5kIHVuaXRlZCBzdGF0ZXMgZWxlY3RlZCBhcyA0NHRoIHByZXNpZGVudCAuIHx8fCBsbV8wPS00Ny45NTcgbG1fMT0tNjUuMjIzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEyLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS00Mi45NzggdG1fcHRfNj0tMTkuNjc0IHRtX3B0Xzc9LTEyLjAwMCB0bV9wdF84PS0zMi42MTYgdG1fcHRfOT0tMS40MjUgdG1fcHRfMTA9LTIxLjUzMSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguMzI3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTcuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS05LjEyMCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzMwLjU4MwotMTUgfHx8IGluIHRoYXQgeWVhciDgp6rgpocg4Kao4Kat4KeH4Kau4KeN4Kas4Kaw4KeH4KawIG5hdGlvbmFsIGFzc2VtYmx5IGluIGVsZWN0aW9uIHdvbiBhbGwgYW5kIHVuaXRlZCBzdGF0ZXMgZWxlY3RlZCBhcyA0NHRoIHByZXNpZGVudCAuIHx8fCBsbV8wPS00OS42MTQgbG1fMT0tNjUuMjIzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS00MC45NDggdG1fcHRfNj0tMTkuNzQ1IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMS43OTMgdG1fcHRfMTA9LTE1LjQ5OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuNzUzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTcuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS05LjEyMCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzMwLjYxMwotMTUgfHx8IGhlIHRoYXQgeWVhciDgp6rgpocg4Kao4Kat4KeH4Kau4KeN4Kas4Kaw4KeH4KawIG5hdGlvbmFsIGFzc2VtYmx5IDQ0dGggcHJlc2lkZW50IGFuZCB1bml0ZWQgc3RhdGVzIHdhcyBlbGVjdGVkIGFzIHRoZSB3b24gYWxsIC4gfHx8IGxtXzA9LTQ3LjI4OSBsbV8xPS02NS4yMjMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTQxLjkwNiB0bV9wdF82PS0xOC4wMjQgdG1fcHRfNz0tMTIuMDAwIHRtX3B0Xzg9LTMyLjYxNiB0bV9wdF85PS0zLjQyNCB0bV9wdF8xMD0tMTguODg5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC44NDUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTkuMTIwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMzAuNjM5Ci0xNiB8fHwgbWFueSBpbmRpYW4g4Kaq4KeN4Kaw4Kac4Ka+4Kak4Ka/IGZpZ2h0aW5nIOCmnOCmvuCmpCDgpp/gp4fgppXgp43gprjgpr4gZnJvbSB1cHBlciBzdGFnZSB8fHwgbG1fMD0tMzUuNzI4IGxtXzE9LTMyLjA4MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNC41NTYgdG1fcHRfNj0tMTIuMTI1IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0tMi42NzAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0wLjkxMiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzcxLjgxNwotMTYgfHx8IG1hbnkgaW5kaWFuIOCmquCnjeCmsOCmnOCmvuCmpOCmvyBmaWdodGluZyDgppzgpr7gpqQgZnJvbSDgpp/gp4fgppXgp43gprjgpr4gdXBwZXIgc3RhZ2UgfHx8IGxtXzA9LTM1LjcyOCBsbV8xPS0zMi4wODAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTQuNTU2IHRtX3B0XzY9LTEyLjEyNSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTMuMDAyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS41MzcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM3My4wODkKLTE2IHx8fCBtYW55IGluZGlhbiDgpqrgp43gprDgppzgpr7gpqTgpr8gZmlnaHRpbmcg4Kac4Ka+4KakIOCmn+Cnh+CmleCnjeCmuOCmviB0byB1cHBlciBzdGFnZSB8fHwgbG1fMD0tMzUuNDY0IGxtXzE9LTMyLjA4MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNi41MTggdG1fcHRfNj0tMTMuMDA0IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0tNC40NzQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjI0MSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzczLjEwNQotMTYgfHx8IG1hbnkgaW5kaWFuIOCmquCnjeCmsOCmnOCmvuCmpOCmvyBmaWdodGluZyDgppzgpr7gpqQg4Kaf4KeH4KaV4KeN4Ka44Ka+IHVwcGVyIHN0YWdlIGZyb20gfHx8IGxtXzA9LTM2LjI3OCBsbV8xPS0zMi4wODAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTQuNTU2IHRtX3B0XzY9LTEyLjEyNSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTIuODMwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS42NTAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM3My43NjYKLTE2IHx8fCBtYW55IHRoZSDgpqrgp43gprDgppzgpr7gpqTgpr8gZmlnaHRpbmcg4Kac4Ka+4KakIOCmn+Cnh+CmleCnjeCmuOCmviBmcm9tIHVwcGVyIHN0YWdlIHx8fCBsbV8wPS0zNS4wOTggbG1fMT0tMzIuMDgwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE4Ljk2MiB0bV9wdF82PS0xMi43NTUgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTIuMDAwIHRtX3B0XzEwPS03LjAyNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuODYyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNzMuOTE1Ci0xNiB8fHwgb2YgaW5kaWFuIOCmquCnjeCmsOCmnOCmvuCmpOCmvyBmaWdodGluZyDgppzgpr7gpqQg4Kaf4KeH4KaV4KeN4Ka44Ka+IGZyb20gdXBwZXIgc3RhZ2UgfHx8IGxtXzA9LTM0LjYzMCBsbV8xPS0zMi4wODAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTkuOTkwIHRtX3B0XzY9LTE0LjA0NyB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMi4wNTAgdG1fcHRfMTA9LTYuNjcwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy40NzcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM3NC4xNDEKLTE3IHx8fCBicml0YWluIHdyaXRlcnMgd3JpdHRlbiBkcmFtYSBub3ZlbHMgYW5kIHN0b3JpZXMgcmVjZW50bHkgc2NyaXB0cyBpbiDgpobgpqbgp4PgpqQgLiB8fHwgbG1fMD0tMzYuOTcwIGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjAuNjQyIHRtX3B0XzY9LTEwLjkyNyB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTAuODc0IHRtX3B0XzEwPS0yMS4yNTkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04Ljc3NCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE5My4xMjgKLTE3IHx8fCBicml0YWluIHdyaXRlcnMgd3JpdHRlbiBkcmFtYSBub3ZlbHMgc3RvcmllcyBhbmQgcmVjZW50bHkgc2NyaXB0cyBpbiDgpobgpqbgp4PgpqQgLiB8fHwgbG1fMD0tNDAuNzE3IGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTIwLjY0MiB0bV9wdF82PS0xMC45MjcgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0wLjg3NCB0bV9wdF8xMD0tMTYuNzMyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4wMjQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTkzLjMzNAotMTcgfHx8IGJyaXRhaW4gd3JpdGVycyB3cml0dGVuIGRyYW1hIG5vdmVsIHN0b3JpZXMgYW5kIHJlY2VudGx5IHNjcmlwdHMgaW4g4KaG4Kam4KeD4KakIC4gfHx8IGxtXzA9LTQwLjUzNiBsbV8xPS00Mi4zOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yMS42OTAgdG1fcHRfNj0tMTEuMzc0IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMC44NzQgdG1fcHRfMTA9LTE3Ljg4OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMzkxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE5My44OTQKLTE3IHx8fCBicml0YWluIHdyaXRlcnMgd3JpdHRlbiBkcmFtYSBub3ZlbHMgYW5kIHN0b3JpZXMgcmVjZW50bHkgc2NyaXB0IGluIOCmhuCmpuCng+CmpCAuIHx8fCBsbV8wPS0zNi42NzQgbG1fMT0tNDIuMzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMS40MTggdG1fcHRfNj0tMTAuNDQyIHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMS44MjQgdG1fcHRfMTA9LTIxLjU0NyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEwLjE2MCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE5NC4wODkKLTE3IHx8fCBicml0YWluIHdyaXRlcnMgd3JpdHRlbiBkcmFtYSBub3ZlbHMgc3RvcnkgYW5kIHJlY2VudGx5IHNjcmlwdHMgaW4g4KaG4Kam4KeD4KakIC4gfHx8IGxtXzA9LTQwLjY2OSBsbV8xPS00Mi4zOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yMS41NTYgdG1fcHRfNj0tMTEuNzQ2IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMC44NzQgdG1fcHRfMTA9LTE3LjQ2MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuNzU1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE5NC4xNzgKLTE3IHx8fCBicml0YWluIHdyaXRlcnMgd3JpdHRlbiBkcmFtYSBub3ZlbHMgc3RvcmllcyBhbmQgcmVjZW50bHkgc2NyaXB0IGluIOCmhuCmpuCng+CmpCAuIHx8fCBsbV8wPS00MC40MjEgbG1fMT0tNDIuMzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMjEuNDE4IHRtX3B0XzY9LTEwLjQ0MiB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTEuODI0IHRtX3B0XzEwPS0xNy4wMTkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjQxMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xOTQuMjk1Ci0xNyB8fHwgYnJpdGFpbiB3cml0ZXJzIHRoZSBkcmFtYSBub3ZlbHMgYW5kIHN0b3JpZXMgcmVjZW50bHkgc2NyaXB0cyBpbiDgpobgpqbgp4PgpqQgLiB8fHwgbG1fMD0tMzYuMTk0IGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjUuNTA5IHRtX3B0XzY9LTExLjA5NSB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTAuOTU5IHRtX3B0XzEwPS0yNS41NTkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjA2MSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE5NC40NDQKLTE4IHx8fCBvbiBtYXkgMTkxOSAsIGl0IHNhb2dhdCBtYWdhemluZSBwdWJsaXNoZWQgLiB8fHwgbG1fMD0tMjMuNTE0IGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xNS44MDYgdG1fcHRfNj0tMTMuNzE2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0wLjE1MiB0bV9wdF8xMD0tOC44NDMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01Ljc2NSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyB8fHwgLTY1LjQ1OQotMTggfHx8IDE5MTkgb24gbWF5ICwgaXQgc2FvZ2F0IG1hZ2F6aW5lIHB1Ymxpc2hlZCAuIHx8fCBsbV8wPS0yNS41NzIgbG1fMT0tMzIuNjExIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE1LjgwNiB0bV9wdF82PS0xMy43MTYgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTEuMTUxIHRtX3B0XzEwPS00LjQ3OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuODQzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IHx8fCAtNjYuMTc4Ci0xOCB8fHwgMTkxOSBpbiBtYXkgLCBpdCBzYW9nYXQgbWFnYXppbmUgcHVibGlzaGVkIC4gfHx8IGxtXzA9LTI1Ljk3NSBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTcuODg0IHRtX3B0XzY9LTE0LjMzNyB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMC41MTkgdG1fcHRfMTA9LTMuNzg0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4xNTAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgfHx8IC02Ni4zNDIKLTE4IHx8fCBvbiBtYXkgMTkxOSBpbiBpdCBzYW9nYXQgbWFnYXppbmUgcHVibGlzaGVkIC4gfHx8IGxtXzA9LTI0LjcwNCBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTQuMTkzIHRtX3B0XzY9LTEzLjE2MiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4yMDEgdG1fcHRfMTA9LTcuOTQ3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi41NzYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgfHx8IC02Ni41MjkKLTE4IHx8fCAxOTE5IG9uIG1heSBtb250aCBpdCBzYW9nYXQgbWFnYXppbmUgcHVibGlzaGVkIC4gfHx8IGxtXzA9LTI3LjUzMyBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tOS45MzQgdG1fcHRfNj0tMTMuNTE2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0wLjI4NyB0bV9wdF8xMD0tNC41ODIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02Ljc3NSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyB8fHwgLTY2LjYzOQotMTggfHx8IG9uIG1heSAxOTE5ICwgdGhpcyBzYW9nYXQgbWFnYXppbmUgcHVibGlzaGVkIC4gfHx8IGxtXzA9LTIzLjE4NSBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTcuMzg4IHRtX3B0XzY9LTE0LjY1MSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4xNTIgdG1fcHRfMTA9LTExLjUwOCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuMTMwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IHx8fCAtNjYuODQ4Ci0xOSB8fHwgMjAwNSAsIOCmieCmh+CmruCnh+CmqOCmuCB0ZW5uaXMgYXNzb2NpYXRpb24gdG91ciDgpp/gpr7gpq/gprzgpr7gprAt4Kal4KeN4Kaw4Ka/IOCmn+CngeCmsOCnjeCmqOCmvuCmruCnh+CmqOCnjeCmnyDgprjgpr7gpqjgpqvgpr/gprjgp43gpp8gb3BlbiBuZXRhamkgaW5kb29yIHN0YWRpdW0gd2FzIGFycmFuZ2VkIC4gfHx8IGxtXzA9LTU3LjYwNCBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yMS4yNDQgdG1fcHRfNj0tOC43MDcgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0yLjI0OSB0bV9wdF8xMD0tMTUuNzMwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4xNDggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTIwLjg5MgotMTkgfHx8IDIwMDUgLCDgpongpofgpq7gp4fgpqjgprggdGVubmlzIGFzc29jaWF0aW9uIHRvdXIg4Kaf4Ka+4Kav4Ka84Ka+4KawLeCmpeCnjeCmsOCmvyDgpp/gp4HgprDgp43gpqjgpr7gpq7gp4fgpqjgp43gpp8g4Ka44Ka+4Kao4Kar4Ka/4Ka44KeN4KafIG9wZW4gbmV0YWppIGluZG9vciBzdGFkaXVtIGlzIHRoZSAuIHx8fCBsbV8wPS01NS43NDAgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMjkuMDczIHRtX3B0XzY9LTkuMTk3IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMi4yNDkgdG1fcHRfMTA9LTIyLjY5MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuNTUyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUyMS4yMzUKLTE5IHx8fCAyMDA1ICwg4KaJ4KaH4Kau4KeH4Kao4Ka4IHRlbm5pcyBhc3NvY2lhdGlvbiB0b3VyIOCmn+CmvuCmr+CmvOCmvuCmsC3gpqXgp43gprDgpr8g4Kaf4KeB4Kaw4KeN4Kao4Ka+4Kau4KeH4Kao4KeN4KafIOCmuOCmvuCmqOCmq+Cmv+CmuOCnjeCmnyBvcGVuIG5ldGFqaSBpbmRvb3Igc3RhZGl1bSB3YXMgb3JnYW5pemVkIC4gfHx8IGxtXzA9LTU3LjY3NyBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yMi4wMzkgdG1fcHRfNj0tOC44NDEgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0yLjI0OSB0bV9wdF8xMD0tMTYuMjQwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4xNDggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTIxLjMxMwotMTkgfHx8IDIwMDUgLCDgpongpofgpq7gp4fgpqjgprggdGVubmlzIGFzc29jaWF0aW9uIHRvdXIg4Kaf4Ka+4Kav4Ka84Ka+4KawLeCmpeCnjeCmsOCmvyDgpp/gp4HgprDgp43gpqjgpr7gpq7gp4fgpqjgp43gpp8g4Ka44Ka+4Kao4Kar4Ka/4Ka44KeN4KafIG9wZW4gbmV0YWppIGluZG9vciBzdGFkaXVtIGFycmFuZ2VkIGluIC4gfHx8IGxtXzA9LTU4LjQ1NCBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yMy4zNzcgdG1fcHRfNj0tOS44MjYgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0yLjI0OSB0bV9wdF8xMD0tMTUuMzgzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4yNDcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTIyLjMyNwotMTkgfHx8IDIwMDUgLCDgpongpofgpq7gp4fgpqjgprggdGVubmlzIGFzc29jaWF0aW9uIHRvdXIg4Kaf4Ka+4Kav4Ka84Ka+4KawLeCmpeCnjeCmsOCmvyDgpp/gp4HgprDgp43gpqjgpr7gpq7gp4fgpqjgp43gpp8g4Ka44Ka+4Kao4Kar4Ka/4Ka44KeN4KafIG9wZW4gbmV0YWppIGluZG9vciBzdGFkaXVtIG9yZ2FuaXplZCBpbiAuIHx8fCBsbV8wPS01OC4zMzYgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMjQuMTcyIHRtX3B0XzY9LTkuOTU5IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMi4yNDkgdG1fcHRfMTA9LTE2Ljk5MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuMTkzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUyMi41MTkKLTE5IHx8fCAyMDA1ICwg4KaJ4KaH4Kau4KeH4Kao4Ka4IHRlbm5pcyBhc3NvY2lhdGlvbiB0b3VyIOCmn+CmvuCmr+CmvOCmvuCmsC3gpqXgp43gprDgpr8g4Kaf4KeB4Kaw4KeN4Kao4Ka+4Kau4KeH4Kao4KeN4KafIOCmuOCmvuCmqOCmq+Cmv+CmuOCnjeCmnyBvcGVuIG5ldGFqaSBpbmRvb3Igc3RhZGl1bSBpcyB3YXMgLiB8fHwgbG1fMD0tNTcuOTkyIGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTI2LjMxNyB0bV9wdF82PS04LjM4OSB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMjQ5IHRtX3B0XzEwPS0yMC43OTEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjA2MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MjIuNTUyCi0yMCB8fHwgdG8gcHJldmVudCB0aGlzIHNldmVyYWwgbWVhc3VyZXMgYXJlIHRha2VuIC4gfHx8IGxtXzA9LTExLjYzMiBsbV8xPS0yOS4zNTAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMjIuNjgwIHRtX3B0XzY9LTMwLjgxMiB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuMzg2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgV29yZFBlbmFsdHk9LTQuMzQzIHx8fCAtNDguNDA1Ci0yMCB8fHwgdG8gcHJldmVudCB0aGlzIHNldmVyYWwgbWVhc3VyZXMgYXJlIC4gfHx8IGxtXzA9LTEyLjY4NiBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMjAuMjE5IHRtX3B0XzY9LTI5LjE4OSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tNi44NTEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xLjk0NiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0zLjkwOSB8fHwgLTUwLjI2NQotMjAgfHx8IHRvIHByZXZlbnQgdGhpcyBzZXZlcmFsIG1lYXN1cmVzIGFyZSB0aGUgLiB8fHwgbG1fMD0tMTQuMDY2IGxtXzE9LTI5LjM1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0yNC4yMjcgdG1fcHRfNj0tMjcuMjUxIHRtX3B0Xzc9LTMuMDAwIHRtX3B0Xzg9LTguMTU0IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPS0zLjQyNiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuMjg1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9My4wMDAgV29yZFBlbmFsdHk9LTQuMzQzIHx8fCAtNTIuMDg0Ci0yMCB8fHwgdG8gcHJldmVudCB0aGlzIHNldmVyYWwgbWVhc3VyZXMgYXJlIGluIC4gfHx8IGxtXzA9LTE0LjY0OSBsbV8xPS0yOS4zNTAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMjMuMzg4IHRtX3B0XzY9LTI3LjM0NCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tMi43NzEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjY5OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIFdvcmRQZW5hbHR5PS00LjM0MyB8fHwgLTUyLjY1MwotMjAgfHx8IHRvIGF2b2lkIHRoaXMgcG9zc2liaWxpdHkgc2V2ZXJhbCBtZWFzdXJlcyBhcmUgdGFrZW4gLiB8fHwgbG1fMD0tMTMuNDYxIGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0yNC41OTcgdG1fcHRfNj0tMzEuNzMzIHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS4zODYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgfHx8IC01My40NTIKLTIwIHx8fCB0byBwcmV2ZW50IHRoaXMgc2V2ZXJhbCBtZWFzdXJlcyBhcmUgdG8gLiB8fHwgbG1fMD0tMTUuMDA5IGxtXzE9LTI5LjM1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0yMy4yODYgdG1fcHRfNj0tMjcuNzc1IHRtX3B0Xzc9LTMuMDAwIHRtX3B0Xzg9LTguMTU0IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPS0zLjg3MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuOTIwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9My4wMDAgV29yZFBlbmFsdHk9LTQuMzQzIHx8fCAtNTMuOTQ0Ci0yMCB8fHwgdG8gcHJldmVudCB0aGlzIHNldmVyYWwgbWVhc3VyZXMgYXJlIHRvIHx8fCBsbV8wPS0xNC45MTMgbG1fMT0tMjYuMDg5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTIzLjc0NCB0bV9wdF82PS0zMy41MTkgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTYuOTk5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC43MzYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgfHx8IC01NS41MDMKLTIxIHx8fCDgp6fgp6/gp6zgp6wgb24gNSBmZWJydWFyeSDgprLgpr7gprngp4vgprDgp4cgb2Yg4Kam4Kay4Ka44Kau4KeC4Ka54KeH4KawIGEgbmF0aW9uYWwgd2FzIGhlbGQgLiB8fHwgbG1fMD0tNDEuMTU0IGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0yMS40ODEgdG1fcHRfNj0tMTQuNjQ1IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0wLjQzNiB0bV9wdF8xMD0tMTUuMTgzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy42NzIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTEuMzgxCi0yMSB8fHwg4Ken4Kev4Kes4KesIG9uIDUgZmVicnVhcnkg4Kay4Ka+4Ka54KeL4Kaw4KeHIOCmpuCmsuCmuOCmruCnguCmueCnh+CmsCBhZ2FpbnN0IGEgbmF0aW9uYWwgd2FzIGhlbGQgLiB8fHwgbG1fMD0tNDEuODc5IGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xNi43MzIgdG1fcHRfNj0tMTQuMzM1IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMTIuMTY3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy45NjAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTEuNjQzCi0yMSB8fHwg4Ken4Kev4Kes4KesIG9uIDUgZmVicnVhcnkg4Kay4Ka+4Ka54KeL4Kaw4KeHIGFnYWluc3Qg4Kam4Kay4Ka44Kau4KeC4Ka54KeH4KawIGEgbmF0aW9uYWwgd2FzIGhlbGQgLiB8fHwgbG1fMD0tNDIuNDM5IGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0xNi43MzIgdG1fcHRfNj0tMTQuMzM1IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMTIuOTg5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4xODMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTEuNjY0Ci0yMSB8fHwg4Ken4Kev4Kes4KesIG9uIDUgZmVicnVhcnkg4Kay4Ka+4Ka54KeL4Kaw4KeHIG9wcG9zaXRpb24g4Kam4Kay4Ka44Kau4KeC4Ka54KeH4KawIGEgbmF0aW9uYWwgd2FzIGhlbGQgLiB8fHwgbG1fMD0tNDMuMzIzIGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0xNS4yNzggdG1fcHRfNj0tMTQuNzQwIHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMTAuMTg2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4xODMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTEuODkxCi0yMSB8fHwg4Ken4Kev4Kes4KesIG9uIDUgZmVicnVhcnkg4Kay4Ka+4Ka54KeL4Kaw4KeHIG9mIOCmpuCmsuCmuOCmruCnguCmueCnh+CmsCBhIG5hdGlvbmFsIHdhcyBoZWxkIGluIC4gfHx8IGxtXzA9LTQyLjE0NyBsbV8xPS00NS42NTYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjQuNjUxIHRtX3B0XzY9LTExLjg0MCB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS4wMTggdG1fcHRfMTA9LTguMjg5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy41MTggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzkyLjgwNAotMjEgfHx8IOCnp+Cnr+CnrOCnrCBvbiA1IGZlYnJ1YXJ5IOCmsuCmvuCmueCni+CmsOCnhyDgpqbgprLgprjgpq7gp4Lgprngp4fgprAgYWdhaW5zdCBhIG5hdGlvbmFsIHdhcyBoZWxkIGluIC4gfHx8IGxtXzA9LTQyLjg3MyBsbV8xPS00NS42NTYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMTkuOTAxIHRtX3B0XzY9LTExLjUyOSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS4xMzUgdG1fcHRfMTA9LTUuMjcyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy44MDYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzkzLjA2NwotMjIgfHx8IGJhbmdsYWRlc2gg4KaF4Kaw4KeN4KaX4Ka+4Kao4Ka+4KaH4Kac4KeH4Ka24KaoIG9mIHRoZSBpc2xhbWljIOCmleCmqOCmq+CmvuCmsOCnh+CmqOCnjeCmuCBhbmQgaXNsYW1pYyDgpqHgp4fgpq3gp4fgprLgpqrgpq7gp4fgpqPgp43gpp8gYmFuayBzZWN1cmVkIGl0cyBwbGFjZSBpbiBpbiAuIHx8fCBsbV8wPS00NC4xNzMgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS00Ny4zMDUgdG1fcHRfNj0tMTEuNjc0IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMi4wNTAgdG1fcHRfMTA9LTI3LjAxOCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuOTEzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxMi45MjcKLTIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGlzbGFtaWMg4Kah4KeH4Kat4KeH4Kay4Kaq4Kau4KeH4Kaj4KeN4KafIGJhbmsgc2VjdXJlZCBpdHMgcGxhY2UgaW4gdG9vayAuIHx8fCBsbV8wPS00NS4zNTQgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS00My4zOTUgdG1fcHRfNj0tMTEuNDgwIHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTIzLjg1MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuNjA3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxMy4yNTkKLTIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGlzbGFtaWMg4Kah4KeH4Kat4KeH4Kay4Kaq4Kau4KeH4Kaj4KeN4KafIGJhbmsgc2VjdXJlZCBpdHMgcGxhY2UgaW4gYWRvcHRlZCAuIHx8fCBsbV8wPS00NS4zMjEgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS00Mi4zODIgdG1fcHRfNj0tMTIuMTE2IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMy4wMDAgdG1fcHRfMTA9LTIxLjk3OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMzAwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxMy41MjEKLTIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGlzbGFtaWMg4Kah4KeH4Kat4KeH4Kay4Kaq4Kau4KeH4Kaj4KeN4KafIGJhbmsgc2VjdXJlZCBpdHMgcGxhY2UgaW4gaW4gdGhlIC4gfHx8IGxtXzA9LTQ1LjEwNCBsbV8xPS01OC43MDAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS01MC41MTIgdG1fcHRfNj0tOS44ODggdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0yLjA1MCB0bV9wdF8xMD0tMjMuMTQ1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi4wODYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDEzLjkxNQotMjIgfHx8IGJhbmdsYWRlc2gg4KaF4Kaw4KeN4KaX4Ka+4Kao4Ka+4KaH4Kac4KeH4Ka24KaoIG9mIHRoZSBpc2xhbWljIOCmleCmqOCmq+CmvuCmsOCnh+CmqOCnjeCmuCBhbmQgaXNsYW1pYyDgpqHgp4fgpq3gp4fgprLgpqrgpq7gp4fgpqPgp43gpp8gYmFuayB0b29rIHNlY3VyZWQgaXRzIHBsYWNlIGluIC4gfHx8IGxtXzA9LTQ1LjM1NCBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTQzLjM5NSB0bV9wdF82PS0xMS40ODAgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tMjMuNzI4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy4wMzcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDE0LjM0NAotMjIgfHx8IGJhbmdsYWRlc2gg4KaF4Kaw4KeN4KaX4Ka+4Kao4Ka+4KaH4Kac4KeH4Ka24KaoIG9mIHRoZSBpc2xhbWljIOCmleCmqOCmq+CmvuCmsOCnh+CmqOCnjeCmuCBhbmQgaXNsYW1pYyDgpqHgp4fgpq3gp4fgprLgpqrgpq7gp4fgpqPgp43gpp8gYmFuayBzZWN1cmVkIGl0cyBwbGFjZSBpbiBoYWQgLiB8fHwgbG1fMD0tNDQuODg5IGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tNDUuMzIwIHRtX3B0XzY9LTEyLjUyMSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuMDAwIHRtX3B0XzEwPS0yNS4xMTUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjMwMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEzLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MTQuNTAwCi0yMiB8fHwgYmFuZ2xhZGVzaCDgpoXgprDgp43gppfgpr7gpqjgpr7gpofgppzgp4fgprbgpqggb2YgdGhlIGlzbGFtaWMg4KaV4Kao4Kar4Ka+4Kaw4KeH4Kao4KeN4Ka4IGFuZCBpc2xhbWljIOCmoeCnh+CmreCnh+CmsuCmquCmruCnh+Cmo+CnjeCmnyBiYW5rIHNlY3VyZWQgaXRzIHBsYWNlIGluIHRvb2sgdGhlIC4gfHx8IGxtXzA9LTQ2LjU2MyBsbV8xPS01OC43MDAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS00Ni42MDMgdG1fcHRfNj0tOS42OTMgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tMTkuOTc4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi43NzkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDE0LjU5MQotMjIgfHx8IGJhbmdsYWRlc2gg4KaF4Kaw4KeN4KaX4Ka+4Kao4Ka+4KaH4Kac4KeH4Ka24KaoIG9mIHRoZSBpc2xhbWljIOCmleCmqOCmq+CmvuCmsOCnh+CmqOCnjeCmuCBhbmQgaXNsYW1pYyDgpqHgp4fgpq3gp4fgprLgpqrgpq7gp4fgpqPgp43gpp8gYmFuayB0b29rIHNlY3VyZWQgaXRzIHBsYWNlIGluIHRoZSAuIHx8fCBsbV8wPS00NS43MzcgbG1fMT0tNTguNzAwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDYuNjAzIHRtX3B0XzY9LTkuNjkzIHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTE5Ljg1NiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMjEwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBXb3JkUGVuYWx0eT0tOC4yNTIgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxNC42NTQKLTIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGhhZCDgpqHgp4fgpq3gp4fgprLgpqrgpq7gp4fgpqPgp43gpp8gYmFuayBzZWN1cmVkIGl0cyBwbGFjZSBpbiBpbiAuIHx8fCBsbV8wPS00My45MDcgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS01Mi4wOTggdG1fcHRfNj0tMTQuNjE4IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMy4wNTAgdG1fcHRfMTA9LTI5LjQ2MCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMjE2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxNi43OTAKLTIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGhhZCDgpqHgp4fgpq3gp4fgprLgpqrgpq7gp4fgpqPgp43gpp8gYmFuayBzZWN1cmVkIGl0cyBwbGFjZSBpbiB0b29rIC4gfHx8IGxtXzA9LTQ1LjA4OCBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTQ4LjE4OCB0bV9wdF82PS0xNC40MjQgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0zLjM2OCB0bV9wdF8xMD0tMjYuMjkzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC45MDkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDE3LjEyMQotMjMgfHx8IHN1YmplY3QgOiBlbmN5Y2xvcGVkaWEgfHx8IGxtXzA9LTUuNTI4IGxtXzE9LTEzLjA0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0xLjY1NyB0bV9wdF82PS0xLjU0MiB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMC40MjAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xLjUwMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTMuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0yLjE3MSB8fHwgLTE1LjgzNgotMjMgfHx8IGNhdGVnb3J5IDogZW5jeWNsb3BlZGlhIHx8fCBsbV8wPS01LjcwNyBsbV8xPS0xMy4wNDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMS40MjUgdG1fcHRfNj0tMi4wMTIgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4xMzUgdG1fcHRfMTA9LTAuMDIwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS44MTcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMi4xNzEgfHx8IC0xNi4yOTMKLTIzIHx8fCBzdWJqZWN0LWNsYXNzIDogZW5jeWNsb3BlZGlhIHx8fCBsbV8wPS01Ljk4OSBsbV8xPS0xMy4wNDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMS4zNzkgdG1fcHRfNj0tMy41NjEgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4xMzUgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjcwMyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTMuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0yLjE3MSB8fHwgLTE3LjQ3MgotMjMgfHx8IHRvcGljcyA6IGVuY3ljbG9wZWRpYSB8fHwgbG1fMD0tNi4yMjAgbG1fMT0tMTMuMDQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTEuNTM3IHRtX3B0XzY9LTMuODc0IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMTM1IHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi45OTEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMi4xNzEgfHx8IC0xNy45OTYKLTI0IHx8fCBydXNzaWEgZnJhbmNlIGFuZCBpc3JhZWwgdGhlIG1haW4g4KaF4Ka44KeN4Kak4KeN4Kaw4Ka44Kaw4Kas4Kaw4Ka+4Ka54KaV4Ka+4Kaw4KeAIGNvdW50cnkgYW5kIGRlZmVuc2Ugc3ViIGNvdW50cnkgLiB8fHwgbG1fMD0tMzguODQ0IGxtXzE9LTQ1LjY1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTE4LjUzMCB0bV9wdF82PS04LjM1NiB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuMTA2IHRtX3B0XzEwPS0xMC40NzEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01Ljg0MSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODkuNTM2Ci0yNCB8fHwgcnVzc2lhIGZyYW5jZSBhbmQgaXNyYWVsIHRoZSBtYWluIOCmheCmuOCnjeCmpOCnjeCmsOCmuOCmsOCmrOCmsOCmvuCmueCmleCmvuCmsOCngCBzdGF0ZSBhbmQgZGVmZW5zZSBzdWIgY291bnRyeSAuIHx8fCBsbV8wPS0zOC44MDIgbG1fMT0tNDUuNjU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTE4LjQ2NyB0bV9wdF82PS05LjIwNiB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMS40NzQgdG1fcHRfMTA9LTEwLjUzNSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuOTMzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNi41MTQgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4OS45MjQKLTI0IHx8fCBydXNzaWEgZnJhbmNlIGFuZCBpc3JhZWwgdGhlIG1haW4g4KaF4Ka44KeN4Kak4KeN4Kaw4Ka44Kaw4Kas4Kaw4Ka+4Ka54KaV4Ka+4Kaw4KeAIGNvdW50cnkgYW5kIGRlZmVuY2Ugc3ViIGNvdW50cnkgLiB8fHwgbG1fMD0tMzguNTM1IGxtXzE9LTQ1LjY1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTE4Ljk0MiB0bV9wdF82PS05Ljc0MiB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuNzM4IHRtX3B0XzEwPS0xMC4wNjUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjUzNCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xOTAuMzY2Ci0yNCB8fHwgcnVzc2lhIGZyYW5jZSBhbmQgaXNyYWVsIHRoZSBtYWluIOCmheCmuOCnjeCmpOCnjeCmsOCmuOCmsOCmrOCmsOCmvuCmueCmleCmvuCmsOCngCBjb3VudHJpZXMgYW5kIGRlZmVuc2Ugc3ViIGNvdW50cnkgLiB8fHwgbG1fMD0tMzguODE1IGxtXzE9LTQ1LjY1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0xOS40MjYgdG1fcHRfNj0tMTAuMzQzIHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0xLjQ3NCB0bV9wdF8xMD0tMTAuMTMwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS45MzMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTkwLjQwNwotMjUgfHx8IHRoaXMgaXMgdGhlIGtub3duIGltYWdpbmFyeSBtYXRoZW1hdGljcyBmb3JtZWQgd2l0aCB3aGljaCBhcmUgcmVhbCBudW1iZXIgc2V0IGZyb20g4Ka44KeH4Kaf4KeHIHBhciB3aXRoIHRoZSBjb21wbGV4IG51bWJlciAuIHx8fCBsbV8wPS00OC44MzUgbG1fMT0tNzEuNzQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE0LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNTEuMzEzIHRtX3B0XzY9LTIxLjkzNyB0bV9wdF83PS0xNC4wMDAgdG1fcHRfOD0tMzguMDUyIHRtX3B0Xzk9LTQuODg5IHRtX3B0XzEwPS0yMS44NzUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjAwMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTkuOTg5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNDEuNzE5Ci0yNSB8fHwgdGhpcyBpcyBvdXIga25vd24gaW1hZ2luYXJ5IG1hdGhlbWF0aWNzIGZvcm1lZCB3aXRoIHdoaWNoIGFyZSByZWFsIG51bWJlciBzZXQgZnJvbSDgprjgp4fgpp/gp4cgcGFyIHdpdGggdGhlIGNvbXBsZXggbnVtYmVyIC4gfHx8IGxtXzA9LTUwLjM5NiBsbV8xPS03MS43NDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS00NC43MTEgdG1fcHRfNj0tMjEuMTc0IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMy44ODkgdG1fcHRfMTA9LTIyLjYzMyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuNjkwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI0MS45MzgKLTI1IHx8fCB0aGlzIGlzIHRoZSBrbm93biBpbWFnaW5hcnkgbWF0aGVtYXRpY3MgZm9ybWVkIHdpdGggd2hpY2ggYXJlIHJlYWwgbnVtYmVyIHNldCBmcm9tIOCmuOCnh+Cmn+CnhyBwYXIgd2l0aCBjb21wbGV4IG51bWJlciAuIHx8fCBsbV8wPS00OC4xNzYgbG1fMT0tNjguNDg0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDcuMzA0IHRtX3B0XzY9LTIzLjg3NCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTMuODkwIHRtX3B0XzEwPS0zMC45NDYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjUxNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE5LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTkuNTU0IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNDIuODI2Ci0yNSB8fHwgdGhpcyBpcyB0aGUga25vd24gaW1hZ2luYXJ5IG1hdGhlbWF0aWNzIGZvcm1lZCB3aXRoIHdoaWNoIGFyZSByZWFsIG51bWJlcnMgc2V0IGZyb20g4Ka44KeH4Kaf4KeHIHBhciB3aXRoIHRoZSBjb21wbGV4IG51bWJlciAuIHx8fCBsbV8wPS00OS42NjMgbG1fMT0tNzEuNzQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE0LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNTEuMDc4IHRtX3B0XzY9LTIyLjYzNyB0bV9wdF83PS0xNC4wMDAgdG1fcHRfOD0tMzguMDUyIHRtX3B0Xzk9LTQuODg5IHRtX3B0XzEwPS0yMS41OTQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjAwMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTkuOTg5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNDIuODY1Ci0yNSB8fHwgdGhpcyBpcyB0aGUga25vd24gaW1hZ2luYXJ5IG1hdGhlbWF0aWNzIGZvcm1lZCB3aXRoIHdoaWNoIGFyZSByZWFsIG51bWJlciBzZXQgdG8g4Ka44KeH4Kaf4KeHIHBhciB3aXRoIHRoZSBjb21wbGV4IG51bWJlciAuIHx8fCBsbV8wPS00OC41NzEgbG1fMT0tNzEuNzQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE0LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNTMuMjc1IHRtX3B0XzY9LTIyLjgxNiB0bV9wdF83PS0xNC4wMDAgdG1fcHRfOD0tMzguMDUyIHRtX3B0Xzk9LTQuODg5IHRtX3B0XzEwPS0yMy42ODAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04LjMyOSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTkuOTg5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNDMuMDA3Ci0yNSB8fHwgdGhpcyBpcyBvdXIga25vd24gaW1hZ2luYXJ5IG1hdGhlbWF0aWNzIGZvcm1lZCB3aXRoIHdoaWNoIGFyZSByZWFsIG51bWJlciBzZXQgZnJvbSDgprjgp4fgpp/gp4cgcGFyIHdpdGggY29tcGxleCBudW1iZXIgLiB8fHwgbG1fMD0tNDkuNzM3IGxtXzE9LTY4LjQ4NCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTQwLjcwMyB0bV9wdF82PS0yMy4xMTIgdG1fcHRfNz0tMTYuMDAwIHRtX3B0Xzg9LTQzLjQ4OCB0bV9wdF85PS0yLjg5MCB0bV9wdF8xMD0tMzEuNzA0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTAuMjA1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTkuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI0My4wNDUKLTI1IHx8fCB0aGlzIGlzIG91ciBrbm93biBpbWFnaW5hcnkgbWF0aGVtYXRpY3MgZm9ybWVkIHdpdGggd2hpY2ggYXJlIHJlYWwgbnVtYmVycyBzZXQgZnJvbSDgprjgp4fgpp/gp4cgcGFyIHdpdGggdGhlIGNvbXBsZXggbnVtYmVyIC4gfHx8IGxtXzA9LTUxLjIyNSBsbV8xPS03MS43NDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS00NC40NzYgdG1fcHRfNj0tMjEuODc1IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMy44ODkgdG1fcHRfMTA9LTIyLjM1MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuNjkwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI0My4wODQKLTI1IHx8fCB0aGlzIGlzIHRoZSBrbm93biBpbWFnaW5hcnkgbWF0aGVtYXRpY3MgZm9ybWVkIHdpdGggd2hpY2ggYXJlIGZyb20gcmVhbCBudW1iZXIgc2V0IOCmuOCnh+Cmn+CnhyBwYXIgd2l0aCB0aGUgY29tcGxleCBudW1iZXIgLiB8fHwgbG1fMD0tNDguOTE2IGxtXzE9LTcxLjc0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tNTEuMzEzIHRtX3B0XzY9LTIxLjkzNyB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTUuODg5IHRtX3B0XzEwPS0yMC44MDIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjkzMiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI0My4xMTAKLTI2IHx8fCA8YWRkcmVzcz4gfHx8IGxtXzA9LTQuMjQwIGxtXzE9LTYuNTIyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTEuNDk0IHRtX3B0XzY9LTM4LjE4NCB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjA1MCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9MC4wMDAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgfHx8IC0yMS43NDMKLTI2IHx8fCA8IOCmoOCmv+CmleCmvuCmqOCmviA+IHx8fCBsbV8wPS0xNS44NTMgbG1fMT0tMTMuMDQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTIuNTE4IHRtX3B0XzY9LTI5LjIzMSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMC4xMTggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPTAuMDAwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9My4wMDAgV29yZFBlbmFsdHk9LTIuMTcxIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMzYuOTYxCi0yNiB8fHwgdGhlIGx0IOCmoOCmv+CmleCmvuCmqOCmviA+IHx8fCBsbV8wPS0xNy43MDkgbG1fMT0tMTYuMzA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTYuMzYyIHRtX3B0XzY9LTIwLjU4OSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjEzNSB0bV9wdF8xMD0tMi40NTMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPTAuMDAwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDEuNzA0Ci0yNiB8fHwgPCDgpqDgpr/gppXgpr7gpqjgpr4gLCBndCAsIHx8fCBsbV8wPS0yMC42NzggbG1fMT0tMTkuNTY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTQuMjU4IHRtX3B0XzY9LTE1LjcyMCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tNS4zMjggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xLjI2MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTMuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjQ0LjE2NgotMjYgfHx8ICwgbHQgLCDgpqDgpr/gppXgpr7gpqjgpr4gPiB8fHwgbG1fMD0tMjAuOTYxIGxtXzE9LTE5LjU2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS00LjI0NSB0bV9wdF82PS0xNS45OTggdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTUuNDQ2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS4yNjIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0NC42NDAKLTI2IHx8fCA8IOCmoOCmv+CmleCmvuCmqOCmviAsIGd0IDsgfHx8IGxtXzA9LTIxLjU2MSBsbV8xPS0xOS41NjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMy4yMDEgdG1fcHRfNj0tMTguNDQ5IHRtX3B0Xzc9LTMuMDAwIHRtX3B0Xzg9LTguMTU0IHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0xLjU5NiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuMjQ4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDUuMDE3Ci0yNyB8fHwgc2VwdGVtYmVyIHx8fCBsbV8wPS0zLjAyNCBsbV8xPS02LjUyMiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0wLjE3NiB0bV9wdF82PS0wLjA0NyB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMC4wMTMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0wLjAyNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyB8fHwgLTYuOTIzCi0yNyB8fHwgc2VwdGVtYmVyIC4gfHx8IGxtXzA9LTQuODMyIGxtXzE9LTkuNzgzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTkuMjgyIHRtX3B0XzY9LTAuNzE2IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPS0xLjA5OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuNjg5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IHx8fCAtMTUuMTEyCi0yNyB8fHwg4Ka44KeH4Kaq4KeN4Kaf4KeH4Kau4KeN4Kas4KawIHx8fCBsbV8wPS03LjM1NSBsbV8xPS02LjUyMiB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0wLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9MC4wMDAgdG1fcHRfNT0wLjAwMCB0bV9wdF82PTAuMDAwIHRtX3B0Xzc9MC4wMDAgdG1fcHRfOD0wLjAwMCB0bV9wdF85PTAuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPTAuMDAwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTExMS4zNTgKLTI4IHx8fCBmcm9tIHRoaXMgdGhlb3J5IHRob3VnaCBiaWcg4Kas4Ka/4Ka44KeN4Kar4KeL4Kaw4Kaj4KeL4KawIGFnYWluc3QgY2FuIG5vdCBiZSBidXQgaXQgY2FuIGJlIHN1cHBvcnQgLiB8fHwgbG1fMD0tMzUuOTUwIGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjcuOTYwIHRtX3B0XzY9LTIzLjEwOCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuNjkyIHRtX3B0XzEwPS0xNS42NzMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjA0NiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTIwMi41ODUKLTI4IHx8fCBmcm9tIHRoaXMgdGhlb3J5IHRob3VnaCBiaWcg4Kas4Ka/4Ka44KeN4Kar4KeL4Kaw4Kaj4KeL4KawIGFnYWluc3QgY2FuIG5vdCBiZSByYXRoZXIgaXQgY2FuIGJlIHN1cHBvcnQgLiB8fHwgbG1fMD0tMzcuMDY4IGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjUuMDg3IHRtX3B0XzY9LTIzLjI4MyB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuNjkyIHRtX3B0XzEwPS0xMy4yNzUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjA0NiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTIwMi44NTYKLTI4IHx8fCBmcm9tIHRoaXMgdGhlb3J5IHRob3VnaCBiaWcg4Kas4Ka/4Ka44KeN4Kar4KeL4Kaw4Kaj4KeL4KawIGFnYWluc3QgY2FuIG5vdCBiZSBidXQgaXQgY2FuIGJlIHN1cHBvcnRlZCAuIHx8fCBsbV8wPS0zNC45OTYgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yNy41NDMgdG1fcHRfNj0tMjIuNjE2IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMi42OTEgdG1fcHRfMTA9LTE2Ljc5NyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuMTI2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjAzLjAwNAotMjggfHx8IGZyb20gdGhpcyB0aGVvcnkgdGhvdWdoIGJpZyDgpqzgpr/gprjgp43gpqvgp4vgprDgpqPgp4vgprAgYWdhaW5zdCBjYW4gbm90IGJlIHJhdGhlciBpdCBjYW4gYmUgc3VwcG9ydGVkIC4gfHx8IGxtXzA9LTM2LjExNCBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTI0LjY3MCB0bV9wdF82PS0yMi43OTAgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0yLjY5MSB0bV9wdF8xMD0tMTQuMzk5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4xMjYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yMDMuMjc0Ci0yOCB8fHwgZnJvbSB0aGlzIHRoZW9yeSB0aG91Z2ggdGhlIOCmrOCmv+CmuOCnjeCmq+Cni+CmsOCmo+Cni+CmsCBhZ2FpbnN0IGNhbiBub3QgYmUgYnV0IGl0IGNhbiBiZSBzdXBwb3J0IC4gfHx8IGxtXzA9LTM1LjIwNyBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTMyLjU0OCB0bV9wdF82PS0yMy4xOTkgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0xLjY5MiB0bV9wdF8xMD0tMTkuOTg5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4xMjYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yMDMuNzIyCi0yOCB8fHwgdGhpcyB0aGVvcnkgZnJvbSB0aG91Z2ggYmlnIOCmrOCmv+CmuOCnjeCmq+Cni+CmsOCmo+Cni+CmsCBhZ2FpbnN0IGNhbiBub3QgYmUgYnV0IGl0IGNhbiBiZSBzdXBwb3J0IC4gfHx8IGxtXzA9LTM3LjQ2OCBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTI3Ljk2MCB0bV9wdF82PS0yMy4xMDggdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0xLjU3MiB0bV9wdF8xMD0tMTQuMzQzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4zNTQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yMDMuNzc1Ci0yOSB8fHwgYWdyaWN1bHR1cmFsIGluIHByb2R1Y3Rpb24gZnJhbmNlIGNvdW50cnkgOyBpdCBpcyBtb3N0IGltcG9ydGFudCBtYWlubHkg4KaW4Ka+4Kam4KeN4Kav4Ka24Ka44KeN4KavIHdpbmUgY2hlZXNlIGFuZCBvdGhlciDgppXgp4Pgprfgpr/gpqbgp43gprDgpqzgp43gpq8gZXVyb3BlIGFuZCB0aGUgd29ybGQgZXhwb3J0IC4gfHx8IGxtXzA9LTY1LjI2MiBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00MS42NzYgdG1fcHRfNj0tMTkuNjgwIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi43NDUgdG1fcHRfMTA9LTE5LjkxOSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuMjAzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNTkuNTgxCi0yOSB8fHwgYWdyaWN1bHR1cmFsIGluIHByb2R1Y3Rpb24gZnJhbmNlIGNvdW50cnkgOyBpdCBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgbWFpbmx5IOCmluCmvuCmpuCnjeCmr+CmtuCmuOCnjeCmryB3aW5lIGNoZWVzZSBhbmQgb3RoZXIg4KaV4KeD4Ka34Ka/4Kam4KeN4Kaw4Kas4KeN4KavIGV1cm9wZSBhbmQgdGhlIHdvcmxkIGV4cG9ydCAuIHx8fCBsbV8wPS02My4zNzcgbG1fMT0tODEuNTI4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNDcuMDk3IHRtX3B0XzY9LTE5Ljc1NCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTIuNjEyIHRtX3B0XzEwPS0xOC45NjcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjM1NSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIyLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgV29yZFBlbmFsdHk9LTExLjI5MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzU5Ljc1NwotMjkgfHx8IGFncmljdWx0dXJlIGluIHByb2R1Y3Rpb24gZnJhbmNlIGNvdW50cnkgOyBpdCBpcyBtb3N0IGltcG9ydGFudCBtYWlubHkg4KaW4Ka+4Kam4KeN4Kav4Ka24Ka44KeN4KavIHdpbmUgY2hlZXNlIGFuZCBvdGhlciDgppXgp4Pgprfgpr/gpqbgp43gprDgpqzgp43gpq8gZXVyb3BlIGFuZCB0aGUgd29ybGQgZXhwb3J0IC4gfHx8IGxtXzA9LTY1Ljc1NCBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00MS45NDAgdG1fcHRfNj0tMjAuMjQwIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi43NDYgdG1fcHRfMTA9LTE5Ljg2OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguMDY4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjAuNzI0Ci0yOSB8fHwgYWdyaWN1bHR1cmFsIGluIHByb2R1Y3Rpb24gZnJhbmNlIGlzIG1vc3QgaW1wb3J0YW50IGNvdW50cnkgOyBpdCBtYWlubHkg4KaW4Ka+4Kam4KeN4Kav4Ka24Ka44KeN4KavIHdpbmUgY2hlZXNlIGFuZCBvdGhlciDgppXgp4Pgprfgpr/gpqbgp43gprDgpqzgp43gpq8gZXVyb3BlIGFuZCB0aGUgd29ybGQgZXhwb3J0IC4gfHx8IGxtXzA9LTY2LjE1NyBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE2LjAwMCB0bV9wdF81PS00MS42NzYgdG1fcHRfNj0tMTkuNjgwIHRtX3B0Xzc9LTE3LjAwMCB0bV9wdF84PS00Ni4yMDYgdG1fcHRfOT0tMS42NTkgdG1fcHRfMTA9LTI2LjQzNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuNzcxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjAuODEzCi0yOSB8fHwgYWdyaWN1bHR1cmFsIGluIHByb2R1Y3Rpb24gZnJhbmNlIGlzIG1vc3QgaW1wb3J0YW50IGNvdW50cnkgLCBpdCBiYXNpY2FsbHkg4KaW4Ka+4Kam4KeN4Kav4Ka24Ka44KeN4KavIHdpbmUgY2hlZXNlIGFuZCBvdGhlciDgppXgp4Pgprfgpr/gpqbgp43gprDgpqzgp43gpq8gZXVyb3BlIGFuZCB0aGUgd29ybGQgZXhwb3J0IC4gfHx8IGxtXzA9LTY1LjM3NyBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE2LjAwMCB0bV9wdF81PS00Mi40NjIgdG1fcHRfNj0tMTcuOTQ3IHRtX3B0Xzc9LTE3LjAwMCB0bV9wdF84PS00Ni4yMDYgdG1fcHRfOT0tMi42MTAgdG1fcHRfMTA9LTI5LjU3OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuNjYwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjAuOTYwCi0yOSB8fHwgYWdyaWN1bHR1cmFsIGluIHByb2R1Y3Rpb24gZnJhbmNlIGNvdW50cnkgOyBpdCBpcyBtb3N0IGltcG9ydGFudCBtYWlubHkg4KaW4Ka+4Kam4KeN4Kav4Ka24Ka44KeN4KavIHdpbmUgY2hlZXNlIGFuZCBvdGhlciDgppXgp4Pgprfgpr/gpqbgp43gprDgpqzgp43gpq8gZXVyb3BlIGFuZCB3aG9sZSB3b3JsZCBleHBvcnQgLiB8fHwgbG1fMD0tNjcuODYzIGxtXzE9LTc4LjI2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTM3LjQ3NyB0bV9wdF82PS0yMC4yNTIgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0yLjc0NSB0bV9wdF8xMD0tMTUuMTEzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy41MzkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2MS4wNjQKLTI5IHx8fCBhZ3JpY3VsdHVyYWwgaW4gcHJvZHVjdGlvbiBmcmFuY2UgY291bnRyeSA7IGl0IGlzIHRoZSBtb3N0IGltcG9ydGFudCBtYWlubHkg4KaW4Ka+4Kam4KeN4Kav4Ka24Ka44KeN4KavIHdpbmUgY2hlZXNlIGFuZCBvdGhlciDgppXgp4Pgprfgpr/gpqbgp43gprDgpqzgp43gpq8gZXVyb3BlIGFuZCB3aG9sZSB3b3JsZCBleHBvcnQgLiB8fHwgbG1fMD0tNjUuOTc3IGxtXzE9LTgxLjUyOCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTQyLjg5OCB0bV9wdF82PS0yMC4zMjYgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0yLjYxMiB0bV9wdF8xMD0tMTQuMTYxIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi42OTIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMi4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS0xMS4yOTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2MS4yMzkKLTI5IHx8fCBhZ3JpY3VsdHVyYWwgaW4gcHJvZHVjdGlvbiBmcmFuY2UgY291bnRyeSA7IGl0IGlzIG1vc3QgaW1wb3J0YW50IG1haW5seSDgppbgpr7gpqbgp43gpq/gprbgprjgp43gpq8gd2luZSBjaGVlc2UgYW5kIG90aGVyIOCmleCng+Cmt+Cmv+CmpuCnjeCmsOCmrOCnjeCmryBldXJvcGUgYW5kIHRoZSB0aGUgZXhwb3J0IC4gfHx8IGxtXzA9LTY1LjA3OSBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS00NS42MzEgdG1fcHRfNj0tMjAuMzAyIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi42NTkgdG1fcHRfMTA9LTIyLjY1OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNDI5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjEuNjU0Ci0yOSB8fHwgYWdyaWN1bHR1cmFsIGluIHByb2R1Y3Rpb24gZnJhbmNlIGNvdW50cnkgOyBpdCBpcyBtb3N0IGltcG9ydGFudCBtYWlubHkg4KaW4Ka+4Kam4KeN4Kav4Ka24Ka44KeN4KavIHdpbmUgY2hlZXNlIGFuZCBvdGhlciDgppXgp4Pgprfgpr/gpqbgp43gprDgpqzgp43gpq8gZXVyb3BlIGFuZCB0aGUgaW4gZXhwb3J0IC4gfHx8IGxtXzA9LTY1LjU4NSBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00NC4zNTIgdG1fcHRfNj0tMTkuOTU1IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi45NzcgdG1fcHRfMTA9LTIyLjg1OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuNjA4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjEuNjgzCi0yOSB8fHwgYWdyaWN1bHR1cmFsIGluIHByb2R1Y3Rpb24gZnJhbmNlIGNvdW50cnkgOyBpdCBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgbWFpbmx5IOCmluCmvuCmpuCnjeCmr+CmtuCmuOCnjeCmryB3aW5lIGNoZWVzZSBhbmQgb3RoZXIg4KaV4KeD4Ka34Ka/4Kam4KeN4Kaw4Kas4KeN4KavIGV1cm9wZSBhbmQgdGhlIHRoZSBleHBvcnQgLiB8fHwgbG1fMD0tNjMuMTkzIGxtXzE9LTgxLjUyOCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTUxLjA1MiB0bV9wdF82PS0yMC4zNzYgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0yLjUyNiB0bV9wdF8xMD0tMjEuNzA3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS41ODIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMi4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIFdvcmRQZW5hbHR5PS0xMS4yOTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2MS44MzAKLTMwIHx8fCB0aGVpciBpbiBtYXRoZW1hdGljcyDgpqrgpr7gpp/gp4DgppfgpqPgpr/gpqTgp4fgprAgcGVyc29uIHdhcyAuIHx8fCBsbV8wPS0yMC45NjcgbG1fMT0tMjUuNTU4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE3Ljc1NCB0bV9wdF82PS02LjIyMiB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMS4wMTggdG1fcHRfMTA9LTAuMzI2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMC41MDAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE0Ny41MzcKLTMwIHx8fCB0aGVpciBpbiBtYXRoZW1hdGljcyDgpqrgpr7gpp/gp4DgppfgpqPgpr/gpqTgp4fgprAgd2VyZSB3YXMgLiB8fHwgbG1fMD0tMjAuODY3IGxtXzE9LTI1LjU1OCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xOC45ODMgdG1fcHRfNj0tNS4xMjMgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuMzg2IHRtX3B0XzEwPS00LjMxOSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuNTUzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNDkuMzE2Ci0zMCB8fHwgdGhlaXIgaW4gbWF0aGVtYXRpY3Mg4Kaq4Ka+4Kaf4KeA4KaX4Kaj4Ka/4Kak4KeH4KawIGFyZSB3YXMgLiB8fHwgbG1fMD0tMjAuNjUxIGxtXzE9LTI1LjU1OCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xOS42NDUgdG1fcHRfNj0tNC42MTMgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTEuMDE4IHRtX3B0XzEwPS03LjAxMSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuNDI4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNDkuNTY0Ci0zMCB8fHwgdGhlaXIgaW4gbWF0aGVtYXRpY3Mgd2FzIOCmquCmvuCmn+CngOCml+Cmo+Cmv+CmpOCnh+CmsCB3ZXJlIC4gfHx8IGxtXzA9LTE5LjY0OCBsbV8xPS0yNS41NTggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMTguOTgzIHRtX3B0XzY9LTUuMTIzIHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjc1NCB0bV9wdF8xMD0tNy40MjYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xLjQxMyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTQ5LjY0MQotMzAgfHx8IHRoZWlyIGluIG1hdGhlbWF0aWNzIOCmquCmvuCmn+CngOCml+Cmo+Cmv+CmpOCnh+CmsCBwcmlvcml0eSB3YXMgLiB8fHwgbG1fMD0tMjIuNjEyIGxtXzE9LTI1LjU1OCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNC42ODcgdG1fcHRfNj0tNS4xMjMgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTEuMDE4IHRtX3B0XzEwPS0xLjAwNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuNDI4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNDkuNjU4Ci0zMCB8fHwgdGhlaXIgaW4gbWF0aGVtYXRpY3Mg4Kaq4Ka+4Kaf4KeA4KaX4Kaj4Ka/4Kak4KeH4KawIGluIHdhcyAuIHx8fCBsbV8wPS0yMC4zNTcgbG1fMT0tMjUuNTU4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTIxLjExMSB0bV9wdF82PS00LjgzNiB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMS4wMTggdG1fcHRfMTA9LTguMTIyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi40MjggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE0OS44NDUKLTMwIHx8fCB0aGVpciBpbiBtYXRoZW1hdGljcyDgpqrgpr7gpp/gp4DgppfgpqPgpr/gpqTgp4fgprAgZG9taW5hbmNlIHdhcyAuIHx8fCBsbV8wPS0yMi42MjIgbG1fMT0tMjUuNTU4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE0LjkyNiB0bV9wdF82PS01LjUyOSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4zODYgdG1fcHRfMTA9LTEuMDA0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS41NTMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE0OS45OTAKLTMxIHx8fCBkZXNoZ3VsbyBhcmUgOiBmcmFuY2UgY2FsbCAsIG1ha2Ugbm9pc2UgY2hpbmEgYmVsZ2l1bSBzd2l0emVybGFuZCBnZXJtYW55IGRlbm1hcmsgc3dlZGVuIGF1c3RyaWEgY2hla29zbG92YWtpYSBhcmdlbnRpbmEgaXRhbHkgbm9yd2F5IOCmueCmvuCmmeCnjeCml+Cnh+CmsOCngCB5dWdvc2xhdmlhIGJ1bGdhcmlhIHJvbWFuaWEg4KaX4KeN4Kaw4KeA4Ka4IGVneXB0IHNpbmdhcG9yZSBpbmRvbmVzaWEg4Kal4Ka+4KaH4Kay4KeN4Kav4Ka+4Kao4KeN4KahIGphcGFuIGJ1cm1hIOCmueCmsuCnjeCmr+CmvuCmqOCnjeCmoSBzb3ZpZXQgcnVzc2lhIGlyYW4gaXJhcSBhbmQgc3JpIGxhbmthIC4gfHx8IGxtXzA9LTE1NC41MTQgbG1fMT0tMTMwLjQ0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMzAuMDAwIHRtX3B0XzU9LTcyLjE0NiB0bV9wdF82PS0xNC45MTIgdG1fcHRfNz0tMzAuMDAwIHRtX3B0Xzg9LTgxLjU0MCB0bV9wdF85PS0xMC4yMzYgdG1fcHRfMTA9LTE1LjkyNiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuNjU0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMzUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTM0LjAwMCBXb3JkUGVuYWx0eT0tMTcuODA2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC03MTAuMDg3Ci0zMSB8fHwgZGVzaGd1bG8gYXJlIDogZnJhbmNlIGNhbGwgLCBtYWtlIG5vaXNlIGNoaW5hIGJlbGdpdW0gc3dpdHplcmxhbmQgZ2VybWFueSBkZW5tYXJrIHN3ZWRlbiBhdXN0cmlhIGNoZWtvc2xvdmFraWEgYXJnZW50aW5hIGl0YWx5IG5vcndheSDgprngpr7gppngp43gppfgp4fgprDgp4AgeXVnb3NsYXZpYSBidWxnYXJpYSBydW1hbmlhIOCml+CnjeCmsOCngOCmuCBlZ3lwdCBzaW5nYXBvcmUgaW5kb25lc2lhIOCmpeCmvuCmh+CmsuCnjeCmr+CmvuCmqOCnjeCmoSBqYXBhbiBidXJtYSDgprngprLgp43gpq/gpr7gpqjgp43gpqEgc292aWV0IHJ1c3NpYSBpcmFuIGlyYXEgYW5kIHNyaSBsYW5rYSAuIHx8fCBsbV8wPS0xNTQuNDc4IGxtXzE9LTEzMC40NDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMzAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMwLjAwMCB0bV9wdF81PS03MC42MjAgdG1fcHRfNj0tMTQuOTEyIHRtX3B0Xzc9LTMwLjAwMCB0bV9wdF84PS04MS41NDAgdG1fcHRfOT0tMTAuODY4IHRtX3B0XzEwPS0xNS45MjYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjM0NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTM1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zNC4wMDAgV29yZFBlbmFsdHk9LTE3LjgwNiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNzEwLjUxMwotMzEgfHx8IGRlc2hndWxvIGZyYW5jZSBhcmUgOiBjYWxsICwgbWFrZSBub2lzZSBjaGluYSBiZWxnaXVtIHN3aXR6ZXJsYW5kIGdlcm1hbnkgZGVubWFyayBzd2VkZW4gYXVzdHJpYSBjaGVrb3Nsb3Zha2lhIGFyZ2VudGluYSBpdGFseSBub3J3YXkg4Ka54Ka+4KaZ4KeN4KaX4KeH4Kaw4KeAIHl1Z29zbGF2aWEgYnVsZ2FyaWEgcm9tYW5pYSDgppfgp43gprDgp4DgprggZWd5cHQgc2luZ2Fwb3JlIGluZG9uZXNpYSDgpqXgpr7gpofgprLgp43gpq/gpr7gpqjgp43gpqEgamFwYW4gYnVybWEg4Ka54Kay4KeN4Kav4Ka+4Kao4KeN4KahIHNvdmlldCBydXNzaWEgaXJhbiBpcmFxIGFuZCBzcmkgbGFua2EgLiB8fHwgbG1fMD0tMTUzLjU4MyBsbV8xPS0xMzAuNDQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTMwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yOS4wMDAgdG1fcHRfNT0tNzIuMTQ2IHRtX3B0XzY9LTE0LjkxMiB0bV9wdF83PS0zMC4wMDAgdG1fcHRfOD0tODEuNTQwIHRtX3B0Xzk9LTEwLjIzNiB0bV9wdF8xMD0tMTguNjY5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4wMjIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MzMuMDAwIFdvcmRQZW5hbHR5PS0xNy44MDYgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTcxMS40NDgKLTMxIHx8fCBkZXNoZ3VsbyBmcmFuY2UgYXJlIDogY2FsbCAsIG1ha2Ugbm9pc2UgY2hpbmEgYmVsZ2l1bSBzd2l0emVybGFuZCBnZXJtYW55IGRlbm1hcmsgc3dlZGVuIGF1c3RyaWEgY2hla29zbG92YWtpYSBhcmdlbnRpbmEgaXRhbHkgbm9yd2F5IOCmueCmvuCmmeCnjeCml+Cnh+CmsOCngCB5dWdvc2xhdmlhIGJ1bGdhcmlhIHJ1bWFuaWEg4KaX4KeN4Kaw4KeA4Ka4IGVneXB0IHNpbmdhcG9yZSBpbmRvbmVzaWEg4Kal4Ka+4KaH4Kay4KeN4Kav4Ka+4Kao4KeN4KahIGphcGFuIGJ1cm1hIOCmueCmsuCnjeCmr+CmvuCmqOCnjeCmoSBzb3ZpZXQgcnVzc2lhIGlyYW4gaXJhcSBhbmQgc3JpIGxhbmthIC4gfHx8IGxtXzA9LTE1My41NDYgbG1fMT0tMTMwLjQ0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMjkuMDAwIHRtX3B0XzU9LTcwLjYyMCB0bV9wdF82PS0xNC45MTIgdG1fcHRfNz0tMzAuMDAwIHRtX3B0Xzg9LTgxLjU0MCB0bV9wdF85PS0xMC44NjggdG1fcHRfMTA9LTE4LjY2OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuNzE1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMzUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTMzLjAwMCBXb3JkUGVuYWx0eT0tMTcuODA2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC03MTEuODc1Ci0zMSB8fHwgZGVzaGd1bG8gYXJlIDogZnJhbmNlIGNhbGwgLCBtYWtlIG5vaXNlIGNoaW5hIGJlbGdpdW0gc3dpdHplcmxhbmQgZ2VybWFueSBkZW5tYXJrIGNoZWtvc2xvdmFraWEgc3dlZGVuIGF1c3RyaWEgYXJnZW50aW5hIGl0YWx5IG5vcndheSDgprngpr7gppngp43gppfgp4fgprDgp4AgeXVnb3NsYXZpYSBidWxnYXJpYSByb21hbmlhIOCml+CnjeCmsOCngOCmuCBlZ3lwdCBzaW5nYXBvcmUgaW5kb25lc2lhIOCmpeCmvuCmh+CmsuCnjeCmr+CmvuCmqOCnjeCmoSBqYXBhbiBidXJtYSDgprngprLgp43gpq/gpr7gpqjgp43gpqEgc292aWV0IHJ1c3NpYSBpcmFuIGlyYXEgYW5kIHNyaSBsYW5rYSAuIHx8fCBsbV8wPS0xNTQuNTE0IGxtXzE9LTEzMC40NDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMzAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTI5LjAwMCB0bV9wdF81PS03Mi4xNDYgdG1fcHRfNj0tMTQuOTEyIHRtX3B0Xzc9LTMwLjAwMCB0bV9wdF84PS04MS41NDAgdG1fcHRfOT0tMTAuNDY4IHRtX3B0XzEwPS0xNS42MzkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjY1NCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTM1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zMi4wMDAgV29yZFBlbmFsdHk9LTE3LjgwNiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNzEyLjE2OAotMzEgfHx8IGRlc2hndWxvIGFyZSA6IGZyYW5jZSBjYWxsICwgbWFrZSBub2lzZSBiZWxnaXVtIGNoaW5hIHN3aXR6ZXJsYW5kIGdlcm1hbnkgZGVubWFyayBzd2VkZW4gYXVzdHJpYSBjaGVrb3Nsb3Zha2lhIGFyZ2VudGluYSBpdGFseSBub3J3YXkg4Ka54Ka+4KaZ4KeN4KaX4KeH4Kaw4KeAIHl1Z29zbGF2aWEgYnVsZ2FyaWEgcm9tYW5pYSDgppfgp43gprDgp4DgprggZWd5cHQgc2luZ2Fwb3JlIGluZG9uZXNpYSDgpqXgpr7gpofgprLgp43gpq/gpr7gpqjgp43gpqEgamFwYW4gYnVybWEg4Ka54Kay4KeN4Kav4Ka+4Kao4KeN4KahIHNvdmlldCBydXNzaWEgaXJhbiBpcmFxIGFuZCBzcmkgbGFua2EgLiB8fHwgbG1fMD0tMTU0LjUxNCBsbV8xPS0xMzAuNDQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTMwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yOS4wMDAgdG1fcHRfNT0tNzIuMTQ2IHRtX3B0XzY9LTE0LjkxMiB0bV9wdF83PS0zMC4wMDAgdG1fcHRfOD0tODEuNTQwIHRtX3B0Xzk9LTEwLjI1NCB0bV9wdF8xMD0tMTguMTQ2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4wNzAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MzMuMDAwIFdvcmRQZW5hbHR5PS0xNy44MDYgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTcxMi40OTcKLTMxIHx8fCBkZXNoZ3VsbyBhcmUgOiBmcmFuY2UgY2FsbCAsIG1ha2Ugbm9pc2UgY2hpbmEgYmVsZ2l1bSBzd2l0emVybGFuZCBnZXJtYW55IGRlbm1hcmsgc3dlZGVuIGF1c3RyaWEgY2hla29zbG92YWtpYSBhcmdlbnRpbmEgaXRhbHkgbm9yd2F5IOCmueCmvuCmmeCnjeCml+Cnh+CmsOCngCB5dWdvc2xhdmlhIGJ1bGdhcmlhIHJvbWFuaWEg4KaX4KeN4Kaw4KeA4Ka4IGVneXB0IHNpbmdhcG9yZSBpbmRvbmVzaWEg4Kal4Ka+4KaH4Kay4KeN4Kav4Ka+4Kao4KeN4KahIGphcGFuIGJ1cm1hIOCmueCmsuCnjeCmr+CmvuCmqOCnjeCmoSBzb3ZpZXQgdW5pb24gaXJhbiBpcmFxIGFuZCBzcmkgbGFua2EgLiB8fHwgbG1fMD0tMTUzLjUxNSBsbV8xPS0xMzAuNDQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTMwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zMC4wMDAgdG1fcHRfNT0tNzUuNTMwIHRtX3B0XzY9LTE3LjM2OSB0bV9wdF83PS0zMC4wMDAgdG1fcHRfOD0tODEuNTQwIHRtX3B0Xzk9LTEwLjYwNCB0bV9wdF8xMD0tMTkuNjQzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy40MjcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MzQuMDAwIFdvcmRQZW5hbHR5PS0xNy44MDYgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTcxMi41ODUKLTMxIHx8fCBkZXNoZ3VsbyBhcmUgOiBmcmFuY2UgY2FsbCAsIG1ha2Ugbm9pc2UgY2hpbmEgYmVsZ2l1bSBzd2l0emVybGFuZCBnYXJtYW55IGRlbm1hcmsgc3dlZGVuIGF1c3RyaWEgY2hla29zbG92YWtpYSBhcmdlbnRpbmEgaXRhbHkgbm9yd2F5IOCmueCmvuCmmeCnjeCml+Cnh+CmsOCngCB5dWdvc2xhdmlhIGJ1bGdhcmlhIHJvbWFuaWEg4KaX4KeN4Kaw4KeA4Ka4IGVneXB0IHNpbmdhcG9yZSBpbmRvbmVzaWEg4Kal4Ka+4KaH4Kay4KeN4Kav4Ka+4Kao4KeN4KahIGphcGFuIGJ1cm1hIOCmueCmsuCnjeCmr+CmvuCmqOCnjeCmoSBzb3ZpZXQgcnVzc2lhIGlyYW4gaXJhcSBhbmQgc3JpIGxhbmthIC4gfHx8IGxtXzA9LTE1NS45MjUgbG1fMT0tMTMwLjQ0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMzAuMDAwIHRtX3B0XzU9LTY5LjczMCB0bV9wdF82PS0xOC4wOTAgdG1fcHRfNz0tMzAuMDAwIHRtX3B0Xzg9LTgxLjU0MCB0bV9wdF85PS0xMS4xODYgdG1fcHRfMTA9LTEyLjU1MCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuMDQwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMzUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTM0LjAwMCBXb3JkUGVuYWx0eT0tMTcuODA2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC03MTIuODUwCi0zMSB8fHwgZGVzaGd1bG8gYXJlIDogZnJhbmNlIGNhbGwgLCBtYWtlIG5vaXNlIGJlbGdpdW0gY2hpbmEgc3dpdHplcmxhbmQgZ2VybWFueSBkZW5tYXJrIHN3ZWRlbiBhdXN0cmlhIGNoZWtvc2xvdmFraWEgYXJnZW50aW5hIGl0YWx5IG5vcndheSDgprngpr7gppngp43gppfgp4fgprDgp4AgeXVnb3NsYXZpYSBidWxnYXJpYSBydW1hbmlhIOCml+CnjeCmsOCngOCmuCBlZ3lwdCBzaW5nYXBvcmUgaW5kb25lc2lhIOCmpeCmvuCmh+CmsuCnjeCmr+CmvuCmqOCnjeCmoSBqYXBhbiBidXJtYSDgprngprLgp43gpq/gpr7gpqjgp43gpqEgc292aWV0IHJ1c3NpYSBpcmFuIGlyYXEgYW5kIHNyaSBsYW5rYSAuIHx8fCBsbV8wPS0xNTQuNDc4IGxtXzE9LTEzMC40NDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMzAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTI5LjAwMCB0bV9wdF81PS03MC42MjAgdG1fcHRfNj0tMTQuOTEyIHRtX3B0Xzc9LTMwLjAwMCB0bV9wdF84PS04MS41NDAgdG1fcHRfOT0tMTAuODg2IHRtX3B0XzEwPS0xOC4xNDYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03Ljc2MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTM1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zMy4wMDAgV29yZFBlbmFsdHk9LTE3LjgwNiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNzEyLjkyMwotMzEgfHx8IGRlc2hndWxvIGFyZSA6IGZyYW5jZSBjYWxsICwgbWFrZSBub2lzZSBjaGluYSBiZWxnaXVtIHN3aXR6ZXJsYW5kIGdlcm1hbnkgZGVubWFyayBzd2VkZW4gYXVzdHJpYSBjaGVrb3Nsb3Zha2lhIGFyZ2VudGluYSBpdGFseSBub3J3YXkg4Ka54Ka+4KaZ4KeN4KaX4KeH4Kaw4KeAIHl1Z29zbGF2aWEgYnVsZ2FyaWEgcnVtYW5pYSDgppfgp43gprDgp4DgprggZWd5cHQgc2luZ2Fwb3JlIGluZG9uZXNpYSDgpqXgpr7gpofgprLgp43gpq/gpr7gpqjgp43gpqEgamFwYW4gYnVybWEg4Ka54Kay4KeN4Kav4Ka+4Kao4KeN4KahIHNvdmlldCB1bmlvbiBpcmFuIGlyYXEgYW5kIHNyaSBsYW5rYSAuIHx8fCBsbV8wPS0xNTMuNDc5IGxtXzE9LTEzMC40NDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMzAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMwLjAwMCB0bV9wdF81PS03NC4wMDQgdG1fcHRfNj0tMTcuMzY5IHRtX3B0Xzc9LTMwLjAwMCB0bV9wdF84PS04MS41NDAgdG1fcHRfOT0tMTEuMjM2IHRtX3B0XzEwPS0xOS42NDMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04LjEyMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTM1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zNC4wMDAgV29yZFBlbmFsdHk9LTE3LjgwNiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNzEzLjAxMQotMzIgfHx8IHRoaXMg4Kas4KeN4Kav4Ka+4Ka44Ka/4Kay4Ka/4KaV4Ka+4KawIHBsYWNlcyBub3cgc2l0dWF0ZWQgYmFuayBvZiBlbmdsYW5kIC4gfHx8IGxtXzA9LTI0LjI1NiBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTEuOTQ1IHRtX3B0XzY9LTYuNjE5IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjAzMiB0bV9wdF8xMD0tMy40NzggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjgwOCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTU4Ljk3OQotMzIgfHx8IHRoaXMg4Kas4KeN4Kav4Ka+4Ka44Ka/4Kay4Ka/4KaV4Ka+4KawIHBsYWNlcyBub3cgbG9jYXRlZCBiYW5rIG9mIGVuZ2xhbmQgLiB8fHwgbG1fMD0tMjQuMjMxIGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xMi4xMzYgdG1fcHRfNj0tNi44MjcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMDYzIHRtX3B0XzEwPS0zLjcwMSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMDMxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTkuMjE5Ci0zMiB8fHwgdGhpcyDgpqzgp43gpq/gpr7gprjgpr/gprLgpr/gppXgpr7gprAgcGxhY2VzIG5vdyBiYW5rIG9mIGVuZ2xhbmQgaXMgLiB8fHwgbG1fMD0tMjQuMDA1IGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0xNS40MjggdG1fcHRfNj0tNi40ODEgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTAuMTQ1IHRtX3B0XzEwPS04LjYwNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMDY0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTkuNDE2Ci0zMiB8fHwgdGhpcyDgpqzgp43gpq/gpr7gprjgpr/gprLgpr/gppXgpr7gprAgcGxhY2VzIGlzIHNpdHVhdGVkIGJhbmsgb2YgZW5nbGFuZCAuIHx8fCBsbV8wPS0yMi41NTkgbG1fMT0tMzIuNjExIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE2LjMwNiB0bV9wdF82PS03LjU0MyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4wMzIgdG1fcHRfMTA9LTcuMTQwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4xNDMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE1OS40NTIKLTMyIHx8fCB0aGlzIOCmrOCnjeCmr+CmvuCmuOCmv+CmsuCmv+CmleCmvuCmsCBwbGFjZXMgbm93IGJhbmsgb2YgZW5nbGFuZCBzaXR1YXRlZCAuIHx8fCBsbV8wPS0yNi4wMTcgbG1fMT0tMzIuNjExIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTExLjk0NSB0bV9wdF82PS02LjYxOSB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC41MTAgdG1fcHRfMTA9LTMuNjYwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy41MjEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE1OS41NjcKLTMyIHx8fCB0aGlzIOCmrOCnjeCmr+CmvuCmuOCmv+CmsuCmv+CmleCmvuCmsCBwYXJ0cyBpcyBzaXR1YXRlZCBiYW5rIG9mIGVuZ2xhbmQgLiB8fHwgbG1fMD0tMjEuOTU4IGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xNy43ODMgdG1fcHRfNj0tOC4zMzIgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMDc1IHRtX3B0XzEwPS03Ljc5NiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuNTQ5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTkuNjEwCi0zMiB8fHwgdGhpcyDgpqzgp43gpq/gpr7gprjgpr/gprLgpr/gppXgpr7gprAgcGxhY2VzIGlzIGxvY2F0ZWQgYmFuayBvZiBlbmdsYW5kIC4gfHx8IGxtXzA9LTIyLjYyNyBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTYuNDk3IHRtX3B0XzY9LTcuNzUxIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjA2MyB0bV9wdF8xMD0tNy4zNjMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjM2NiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTU5LjgwNwotMzIgfHx8IHRoaXMg4Kas4KeN4Kav4Ka+4Ka44Ka/4Kay4Ka/4KaV4Ka+4KawIHBsYWNlcyBhcmUgc2l0dWF0ZWQgYmFuayBvZiBlbmdsYW5kIC4gfHx8IGxtXzA9LTIxLjU0MCBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTYuODMyIHRtX3B0XzY9LTguODkzIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjQwMCB0bV9wdF8xMD0tNy44NzUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02Ljc1MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTU5LjgxNAotMzIgfHx8IHRoaXMg4Kas4KeN4Kav4Ka+4Ka44Ka/4Kay4Ka/4KaV4Ka+4KawIHBhcnRzIG5vdyBzaXR1YXRlZCBiYW5rIG9mIGVuZ2xhbmQgLiB8fHwgbG1fMD0tMjQuMjA3IGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xMy40MjIgdG1fcHRfNj0tNy40MDggdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMDc1IHRtX3B0XzEwPS00LjEzNSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMjE0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTkuODIwCi0zMiB8fHwgdGhpcyDgpqzgp43gpq/gpr7gprjgpr/gprLgpr/gppXgpr7gprAgcGxhY2VzIG5vdyBiYW5rIG9mIGVuZ2xhbmQgbG9jYXRlZCAuIHx8fCBsbV8wPS0yNi4xOTIgbG1fMT0tMzIuNjExIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTEyLjEzNiB0bV9wdF82PS02LjgyNyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC41MTAgdG1fcHRfMTA9LTMuNjYwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy41MjEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE1OS44OTEKLTMzIHx8fCBjb3VudHJ5IGluIOCmrOCmv+CmuOCnjeCmleCmvuCmhyBzdWItc2VhIHNvdXRoIHRoZSDgppzgpr/gpqzgp43gprDgpr7gprLgp43gpp/gpr7gprAgc3RyYWl0IOCmquCnjeCmsOCmo+CmvuCmsuCngOCmsCBpbiDgpq7gprDgppXgp43gppXgp4sgdGhlIHdlc3QgYW5kIHRoZSBhdGxhbnRpYyBvY2VhbiAuIHx8fCBsbV8wPS01Mi44NTggbG1fMT0tNjEuOTYxIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMzYuMTEwIHRtX3B0XzY9LTE0Ljk1OSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTQuMTkyIHRtX3B0XzEwPS0zOS43NDMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMy4zNDYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM3LjIzNwotMzMgfHx8IGNvdW50cnkgaW4g4Kas4Ka/4Ka44KeN4KaV4Ka+4KaHIHN1Yi1zZWEgc291dGggdGhlIOCmnOCmv+CmrOCnjeCmsOCmvuCmsuCnjeCmn+CmvuCmsCBzdHJhaXQg4Kaq4KeN4Kaw4Kaj4Ka+4Kay4KeA4KawIHRoZSDgpq7gprDgppXgp43gppXgp4sgdGhlIHdlc3QgYW5kIHRoZSBhdGxhbnRpYyBvY2VhbiAuIHx8fCBsbV8wPS01Mi44NzIgbG1fMT0tNjEuOTYxIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMzYuMjYyIHRtX3B0XzY9LTE0LjE3OSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTQuMTkyIHRtX3B0XzEwPS00MC44MTIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMy4zNDYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM3LjI5NAotMzMgfHx8IGNvdW50cnkgaW4g4Kas4Ka/4Ka44KeN4KaV4Ka+4KaHIHN1Yi1zZWEgc291dGggb2Yg4Kac4Ka/4Kas4KeN4Kaw4Ka+4Kay4KeN4Kaf4Ka+4KawIHN0cmFpdCDgpqrgp43gprDgpqPgpr7gprLgp4DgprAgaW4g4Kau4Kaw4KaV4KeN4KaV4KeLIHRoZSB3ZXN0IGFuZCB0aGUgYXRsYW50aWMgb2NlYW4gLiB8fHwgbG1fMD0tNTIuNzA1IGxtXzE9LTYxLjk2MSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTM2LjI5OCB0bV9wdF82PS0xNS40NzQgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS00LjE5MiB0bV9wdF8xMD0tMzkuMDg2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTMuOTgyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tOC42ODYgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNy4zMTQKLTMzIHx8fCBjb3VudHJ5IGluIOCmrOCmv+CmuOCnjeCmleCmvuCmhyBzdWItc2VhIHNvdXRoIG9mIOCmnOCmv+CmrOCnjeCmsOCmvuCmsuCnjeCmn+CmvuCmsCBzdHJhaXQg4Kaq4KeN4Kaw4Kaj4Ka+4Kay4KeA4KawIHRoZSDgpq7gprDgppXgp43gppXgp4sgdGhlIHdlc3QgYW5kIHRoZSBhdGxhbnRpYyBvY2VhbiAuIHx8fCBsbV8wPS01Mi43MTkgbG1fMT0tNjEuOTYxIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMzYuNDUwIHRtX3B0XzY9LTE0LjY5NCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTQuMTkyIHRtX3B0XzEwPS00MC4xNTUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMy45ODIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM3LjM3MQotMzMgfHx8IGNvdW50cnkgaW4g4Kas4Ka/4Ka44KeN4KaV4Ka+4KaHIHN1Yi1zZWEgc291dGggdGhlIOCmnOCmv+CmrOCnjeCmsOCmvuCmsuCnjeCmn+CmvuCmsCBzdHJhaXQg4Kaq4KeN4Kaw4Kaj4Ka+4Kay4KeA4KawIHNvdXRoIOCmruCmsOCmleCnjeCmleCniyB0aGUgd2VzdCBhbmQgdGhlIGF0bGFudGljIG9jZWFuIC4gfHx8IGxtXzA9LTU0LjU4MSBsbV8xPS02MS45NjEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0zMS43OTggdG1fcHRfNj0tMTQuMzM3IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tNC4wNzUgdG1fcHRfMTA9LTM3LjIzMiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEyLjgzNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgV29yZFBlbmFsdHk9LTguNjg2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MzcuNDAyCi0zMyB8fHwgY291bnRyeSBpbiDgpqzgpr/gprjgp43gppXgpr7gpocgc3ViLXNlYSBzb3V0aCBvZiDgppzgpr/gpqzgp43gprDgpr7gprLgp43gpp/gpr7gprAgc3RyYWl0IOCmquCnjeCmsOCmo+CmvuCmsuCngOCmsCBzb3V0aCDgpq7gprDgppXgp43gppXgp4sgdGhlIHdlc3QgYW5kIHRoZSBhdGxhbnRpYyBvY2VhbiAuIHx8fCBsbV8wPS01NC40MjggbG1fMT0tNjEuOTYxIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMzEuOTg2IHRtX3B0XzY9LTE0Ljg1MSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTQuMDc1IHRtX3B0XzEwPS0zNi41NzYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMy40NzEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM3LjQ4MAotMzMgfHx8IHRoZSBjb3VudHJ5IGluIOCmrOCmv+CmuOCnjeCmleCmvuCmhyBzdWItc2VhIHNvdXRoIHRoZSDgppzgpr/gpqzgp43gprDgpr7gprLgp43gpp/gpr7gprAgc3RyYWl0IOCmquCnjeCmsOCmo+CmvuCmsuCngOCmsCBpbiDgpq7gprDgppXgp43gppXgp4sgdGhlIHdlc3QgYW5kIHRoZSBhdGxhbnRpYyBvY2VhbiAuIHx8fCBsbV8wPS01Mi45MTQgbG1fMT0tNjUuMjIzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDEuODQxIHRtX3B0XzY9LTE0Ljg2OSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTMuMTk4IHRtX3B0XzEwPS0zNS45ODkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMS41NTQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS05LjEyMCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM4LjA1MQotMzMgfHx8IHRoZSBjb3VudHJ5IGluIOCmrOCmv+CmuOCnjeCmleCmvuCmhyBzdWItc2VhIHNvdXRoIHRoZSDgppzgpr/gpqzgp43gprDgpr7gprLgp43gpp/gpr7gprAgc3RyYWl0IOCmquCnjeCmsOCmo+CmvuCmsuCngOCmsCB0aGUg4Kau4Kaw4KaV4KeN4KaV4KeLIHRoZSB3ZXN0IGFuZCB0aGUgYXRsYW50aWMgb2NlYW4gLiB8fHwgbG1fMD0tNTIuOTI4IGxtXzE9LTY1LjIyMyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTQxLjk5NCB0bV9wdF82PS0xNC4wODkgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0zLjE5OCB0bV9wdF8xMD0tMzcuMDU4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTEuNTU0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tOS4xMjAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzOC4xMDgKLTMzIHx8fCB0aGUgY291bnRyeSBpbiDgpqzgpr/gprjgp43gppXgpr7gpocgc3ViLXNlYSBzb3V0aCBvZiDgppzgpr/gpqzgp43gprDgpr7gprLgp43gpp/gpr7gprAgc3RyYWl0IOCmquCnjeCmsOCmo+CmvuCmsuCngOCmsCBpbiDgpq7gprDgppXgp43gppXgp4sgdGhlIHdlc3QgYW5kIHRoZSBhdGxhbnRpYyBvY2VhbiAuIHx8fCBsbV8wPS01Mi43NjEgbG1fMT0tNjUuMjIzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDIuMDI5IHRtX3B0XzY9LTE1LjM4NCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTMuMTk5IHRtX3B0XzEwPS0zNS4zMzMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMi4xOTAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS05LjEyMCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM4LjEyOQotMzMgfHx8IHRoZSBjb3VudHJ5IGluIOCmrOCmv+CmuOCnjeCmleCmvuCmhyBzdWItc2VhIHNvdXRoIG9mIOCmnOCmv+CmrOCnjeCmsOCmvuCmsuCnjeCmn+CmvuCmsCBzdHJhaXQg4Kaq4KeN4Kaw4Kaj4Ka+4Kay4KeA4KawIHRoZSDgpq7gprDgppXgp43gppXgp4sgdGhlIHdlc3QgYW5kIHRoZSBhdGxhbnRpYyBvY2VhbiAuIHx8fCBsbV8wPS01Mi43NzUgbG1fMT0tNjUuMjIzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS00Mi4xODEgdG1fcHRfNj0tMTQuNjAzIHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMy4xMTMgdG1fcHRfMTA9LTM1LjU0MCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTExLjU4NCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgV29yZFBlbmFsdHk9LTkuMTIwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MzguNjQyCi0zNCB8fHwgYXBhcnQgZnJvbSB0aGlzIHNpdHVhdGlvbiB1bmRlcnN0b29kIGEg4Kau4KeB4Ka54KeC4Kaw4KeN4Kak4KeHIHRoZSB0aGUgZGVjaXNpb24gd2l0aGluIOCmheCmleCnjeCmt+CmruCmpOCmviBhZnRlciB0YWtpbmcgLiB8fHwgbG1fMD0tNDMuMjg1IGxtXzE9LTUyLjE3OCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tNTIuODg5IHRtX3B0XzY9LTE5Ljg3NSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTUuMzY4IHRtX3B0XzEwPS0zMS4yOTcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjkxMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEzLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTcuMzgzIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMTkuNjcwCi0zNCB8fHwgb3RoZXIgdGhhbiB0aGlzIHNpdHVhdGlvbiB1bmRlcnN0b29kIGEg4Kau4KeB4Ka54KeC4Kaw4KeN4Kak4KeHIHRoZSB0aGUgZGVjaXNpb24gd2l0aGluIOCmheCmleCnjeCmt+CmruCmpOCmviBhZnRlciB0YWtpbmcgLiB8fHwgbG1fMD0tNDIuODgwIGxtXzE9LTUyLjE3OCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tNTQuNTgwIHRtX3B0XzY9LTIwLjU2OCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTUuMzY4IHRtX3B0XzEwPS0zMS41NDggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjkxMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEzLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTcuMzgzIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMTkuNzk0Ci0zNCB8fHwgbW9yZW92ZXIgdGhpcyBzaXR1YXRpb24gdW5kZXJzdG9vZCBhIOCmruCngeCmueCnguCmsOCnjeCmpOCnhyB0aGUgdGhlIGRlY2lzaW9uIHdpdGhpbiDgpoXgppXgp43gprfgpq7gpqTgpr4gYWZ0ZXIgdGFraW5nIC4gfHx8IGxtXzA9LTQ2LjIzNCBsbV8xPS00OC45MTcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTQ2LjIyNSB0bV9wdF82PS0yMS4yNjEgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS00LjUwMyB0bV9wdF8xMD0tMzAuMzkyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi40NzUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzE5LjkyOQotMzQgfHx8IGFwYXJ0IGZyb20gdGhpcyBzaXR1YXRpb24gdW5kZXJzdG9vZCBhIOCmruCngeCmueCnguCmsOCnjeCmpOCnhyB0aGUgdGhlIHdpdGhpbiDgpoXgppXgp43gprfgpq7gpqTgpr4gYWZ0ZXIgdGFraW5nIGRlY2lzaW9uIC4gfHx8IGxtXzA9LTQxLjg5MiBsbV8xPS01Mi4xNzggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTUyLjg4OSB0bV9wdF82PS0xOS44NzUgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS01LjczNiB0bV9wdF8xMD0tMzIuNjI3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOC45NzkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS03LjM4MyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzE5LjkzNgotMzQgfHx8IGFwYXJ0IGZyb20gdGhpcyBzaXR1YXRpb24gdW5kZXJzdG9vZCBhIOCmruCngeCmueCnguCmsOCnjeCmpOCnhyB0aGUgZmFzdCB3aXRoaW4g4KaF4KaV4KeN4Ka34Kau4Kak4Ka+IGFmdGVyIHRha2luZyBkZWNpc2lvbiAuIHx8fCBsbV8wPS00My42OTEgbG1fMT0tNTIuMTc4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS00Ny4yNDEgdG1fcHRfNj0tMjAuNzIyIHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tNS43MzcgdG1fcHRfMTA9LTI2Ljk2NSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuMjAyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNy4zODMgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMxOS45ODIKLTM0IHx8fCBvdGhlciB0aGFuIHRoaXMgc2l0dWF0aW9uIHVuZGVyc3Rvb2QgYSDgpq7gp4Hgprngp4LgprDgp43gpqTgp4cgdGhlIHRoZSB3aXRoaW4g4KaF4KaV4KeN4Ka34Kau4Kak4Ka+IGFmdGVyIHRha2luZyBkZWNpc2lvbiAuIHx8fCBsbV8wPS00MS40ODcgbG1fMT0tNTIuMTc4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS01NC41ODAgdG1fcHRfNj0tMjAuNTY4IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tNS43MzYgdG1fcHRfMTA9LTMyLjg3OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguOTc5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNy4zODMgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyMC4wNjAKLTM0IHx8fCBvdGhlciB0aGFuIHRoaXMgc2l0dWF0aW9uIHVuZGVyc3Rvb2QgYSDgpq7gp4Hgprngp4LgprDgp43gpqTgp4cgdGhlIGZhc3Qgd2l0aGluIOCmheCmleCnjeCmt+CmruCmpOCmviBhZnRlciB0YWtpbmcgZGVjaXNpb24gLiB8fHwgbG1fMD0tNDMuMjg2IGxtXzE9LTUyLjE3OCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tNDguOTMyIHRtX3B0XzY9LTIxLjQxNSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTUuNzM3IHRtX3B0XzEwPS0yNy4yMTcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjIwMiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEzLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTcuMzgzIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjAuMTA2Ci0zNCB8fHwgbW9yZW92ZXIgdGhpcyBzaXR1YXRpb24gdW5kZXJzdG9vZCBhIOCmruCngeCmueCnguCmsOCnjeCmpOCnhyB0aGUgdGhlIHdpdGhpbiDgpoXgppXgp43gprfgpq7gpqTgpr4gYWZ0ZXIgdGFraW5nIGRlY2lzaW9uIC4gfHx8IGxtXzA9LTQ0Ljg0MSBsbV8xPS00OC45MTcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTQ2LjIyNSB0bV9wdF82PS0yMS4yNjEgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS00Ljg3MSB0bV9wdF8xMD0tMzEuNzIyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy41NDQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjAuMTk1Ci0zNCB8fHwgbW9yZW92ZXIgdGhpcyBzaXR1YXRpb24gdW5kZXJzdG9vZCBhIOCmruCngeCmueCnguCmsOCnjeCmpOCnhyB0aGUgZmFzdCB3aXRoaW4g4KaF4KaV4KeN4Ka34Kau4Kak4Ka+IGFmdGVyIHRha2luZyBkZWNpc2lvbiAuIHx8fCBsbV8wPS00Ni42NDAgbG1fMT0tNDguOTE3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS00MC41NzggdG1fcHRfNj0tMjIuMTA5IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tNC44NzIgdG1fcHRfMTA9LTI2LjA2MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuNzY3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIwLjI0MQotMzUgfHx8IOCmleCmvuCmsOCnjeCmsiB0aGVyZSBpcyB3b3JrIHRocm91Z2ggaXQgYnkgLiB8fHwgbG1fMD0tMjIuMjI4IGxtXzE9LTI5LjM1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0yNy4yOTggdG1fcHRfNj0tMTAuNzA0IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMjIuNzM5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC42NzIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tNC4zNDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2NC45ODMKLTM1IHx8fCDgppXgpr7gprDgp43gprIgdGhlcmUgaXMgd29yayB0aHJvdWdoIHRoaXMgYnkgLiB8fHwgbG1fMD0tMjEuNjE1IGxtXzE9LTI5LjM1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0yOC44OTEgdG1fcHRfNj0tMTEuNjUwIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMjQuNjcyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4zMDUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tNC4zNDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2NS41NzgKLTM1IHx8fCDgppXgpr7gprDgp43gprIgdGhlcmUgaXMgd29yayB0aHJvdWdoIGl0IGJ5IHRoZSAuIHx8fCBsbV8wPS0yMi43NjcgbG1fMT0tMzIuNjExIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTMxLjMwNiB0bV9wdF82PS04Ljc2NiB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMC41NTMgdG1fcHRfMTA9LTE5LjMxMyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMDExIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjUuNzYxCi0zNSB8fHwg4KaV4Ka+4Kaw4KeN4KayIHRoZXJlIGlzIG9ubHkgdGhyb3VnaCBpdCBieSAuIHx8fCBsbV8wPS0yMC42NDQgbG1fMT0tMjkuMzUwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTMwLjQwNiB0bV9wdF82PS0xMy42NDggdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuOTIxIHRtX3B0XzEwPS0yNS4yNzkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjY4NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS00LjM0MyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTY2LjI5NwotMzUgfHx8IOCmleCmvuCmsOCnjeCmsiB0aGVyZSBpcyB3b3JrcyB0aGF0IGl0IGJ5IC4gfHx8IGxtXzA9LTIxLjMzNSBsbV8xPS0yOS4zNTAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMzEuNzc2IHRtX3B0XzY9LTEzLjc4MiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4yNDIgdG1fcHRfMTA9LTIyLjYxNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuODk1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjYuNTQzCi0zNSB8fHwg4KaV4Ka+4Kaw4KeN4KayIHRoZXJlIGlzIHdvcmsgdGhyb3VnaCB0aGlzIGFyZSAuIHx8fCBsbV8wPS0yMS4yNDAgbG1fMT0tMjkuMzUwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTMwLjQ5MSB0bV9wdF82PS0xMi44NzQgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuODcxIHRtX3B0XzEwPS0yNS44NjIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01Ljk5OCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS00LjM0MyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTY2LjY1NAotMzUgfHx8IOCmleCmvuCmsOCnjeCmsiB0aGVyZSBpcyB3b3JrIHRoYXQgaXQgYnkgLiB8fHwgbG1fMD0tMjEuOTM1IGxtXzE9LTI5LjM1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0zMS4zNzQgdG1fcHRfNj0tMTIuNzgzIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjIzNSB0bV9wdF8xMD0tMjMuMTIzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy45NzkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD00LjAwMCBXb3JkUGVuYWx0eT0tNC4zNDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2Ni42NjkKLTM1IHx8fCDgppXgpr7gprDgp43gprIgdGhlcmUgaXMgd29yayB0aHJvdWdoIHRoaXMgYnkgdGhlIC4gfHx8IGxtXzA9LTIyLjUzOCBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMzIuOTAwIHRtX3B0XzY9LTkuNzEzIHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMjEuMjQ2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS42NDQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2Ni44MzIKLTM1IHx8fCDgppXgpr7gprDgp43gprIgdGhlcmUgaXMgb25seSB0aHJvdWdoIHRoaXMgYnkgLiB8fHwgbG1fMD0tMjAuMDMwIGxtXzE9LTI5LjM1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0zMi4wMDAgdG1fcHRfNj0tMTQuNTk1IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjkyMSB0bV9wdF8xMD0tMjcuMjEyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4zMjAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tNC4zNDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2Ni44OTIKLTM2IHx8fCB0aGUgc3ViamVjdCBzb21ldGltZXMgcHVyYW4gLWxyYi0gZnJvbSBzb21ldGltZXMgbWFpbnRhaW4gbG92ZSBzdG9yeSBzb21ldGltZXMgYWdhaW4gZnJvbSB0b2RheSAncyBzb2NpYWwgYW5kIHBvbGl0aWNhbCDgppjgpp/gpqjgpr7gpqzgprLgpr8gdGFrZW4gZnJvbSAuIHx8fCBsbV8wPS02MC4xMTMgbG1fMT0tNzUuMDA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNDkuMzIwIHRtX3B0XzY9LTE5LjUxNCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTQuMzIxIHRtX3B0XzEwPS0xMy41NzIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04LjA4NiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjUyLjU1NgotMzYgfHx8IHRoZSBzdWJqZWN0IHNvbWV0aW1lcyBwdXJhbiAtbHJiLSBmcm9tIHNvbWV0aW1lcyBtYWludGFpbiBsb3ZlIHN0b3J5IHNvbWV0aW1lcyBhZ2FpbiBmcm9tIHRvZGF5ICdzIHNvY2lhbCBhbmQgcG9saXRpY2FsIOCmmOCmn+CmqOCmvuCmrOCmsuCmvyBmcm9tIGFjY2VwdGVkIC4gfHx8IGxtXzA9LTYxLjA2MyBsbV8xPS03NS4wMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00Ny44MjIgdG1fcHRfNj0tMTguNjE2IHRtX3B0Xzc9LTE2LjAwMCB0bV9wdF84PS00My40ODggdG1fcHRfOT0tMy4zMjEgdG1fcHRfMTA9LTEzLjc0OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguNzg3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNTIuODAyCi0zNiB8fHwgdGhlIHN1YmplY3Qgc29tZXRpbWVzIHB1cmFuIC1scmItIGZyb20gc29tZXRpbWVzIG1haW50YWluIGxvdmUgc3RvcnkgZnJvbSBzb21ldGltZXMgYWdhaW4gdG9kYXkgJ3Mgc29jaWFsIGFuZCBwb2xpdGljYWwg4KaY4Kaf4Kao4Ka+4Kas4Kay4Ka/IHRha2VuIGZyb20gLiB8fHwgbG1fMD0tNjIuMDM2IGxtXzE9LTc1LjAwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTQ5LjMyMCB0bV9wdF82PS0xOS41MTQgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS00LjMyMSB0bV9wdF8xMD0tMTMuNDEzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4zNDggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI1My42NjkKLTM2IHx8fCB0aGUgc3ViamVjdCBzb21ldGltZXMgcHVyYW4gLWxyYi0gZnJvbSBzb21ldGltZXMgbWFpbnRhaW4gbG92ZSBzdG9yeSBmcm9tIHNvbWV0aW1lcyBhZ2FpbiB0b2RheSAncyBzb2NpYWwgYW5kIHBvbGl0aWNhbCDgppjgpp/gpqjgpr7gpqzgprLgpr8gZnJvbSBhY2NlcHRlZCAuIHx8fCBsbV8wPS02Mi45ODYgbG1fMT0tNzUuMDA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE2LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNC4wMDAgdG1fcHRfNT0tNDcuODIyIHRtX3B0XzY9LTE4LjYxNiB0bV9wdF83PS0xNi4wMDAgdG1fcHRfOD0tNDMuNDg4IHRtX3B0Xzk9LTMuMzIxIHRtX3B0XzEwPS0xMy41ODkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04LjA0OCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjUzLjkxNAotMzYgfHx8IHRoZSBzdWJqZWN0IHNvbWV0aW1lcyBwdXJhbiAtbHJiLSBzb21ldGltZXMgZnJvbSBtYWludGFpbiBsb3ZlIHN0b3J5IGZyb20gc29tZXRpbWVzIGFnYWluIHRvZGF5ICdzIHNvY2lhbCBhbmQgcG9saXRpY2FsIOCmmOCmn+CmqOCmvuCmrOCmsuCmvyB0YWtlbiBmcm9tIC4gfHx8IGxtXzA9LTYxLjM4NSBsbV8xPS03NS4wMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS00OS4zMjAgdG1fcHRfNj0tMTkuNTE0IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tNC4zMjEgdG1fcHRfMTA9LTEzLjU3MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguMDg2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNTQuMTMwCi0zNiB8fHwgdGhlIHN1YmplY3Qgc29tZXRpbWVzIHB1cmFuIC1scmItIGZyb20gc29tZXRpbWVzIG1haW50YWluIGxvdmUgc3Rvcnkgc29tZXRpbWVzIGFnYWluIGZyb20gdG9kYXkgJ3Mgc29jaWFsIGFuZCBwb2xpdGljYWwg4KaY4Kaf4Kao4Ka+4Kas4Kay4Ka/IHRvIGFjY2VwdGVkIC4gfHx8IGxtXzA9LTYwLjc5OSBsbV8xPS03NS4wMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS00OS43ODQgdG1fcHRfNj0tMTkuNDk1IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMy4zMjcgdG1fcHRfMTA9LTE0LjU4OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuNDk5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNTQuNDAxCi0zNiB8fHwgdGhlIHN1YmplY3Qgc29tZXRpbWVzIHB1cmFuIC1scmItIGZyb20gc29tZXRpbWVzIG1haW50YWluIGxvdmUgc3Rvcnkgc29tZXRpbWVzIGFnYWluIGZyb20gdG9kYXkgJ3Mgc29jaWFsIGFuZCBwb2xpdGljYWwg4KaY4Kaf4Kao4Ka+4Kas4Kay4Ka/IGZyb20gYWNjZXB0ZWQgfHx8IGxtXzA9LTYxLjcwMiBsbV8xPS03MS43NDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS00OC40MTIgdG1fcHRfNj0tMjguMzQ5IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tNC4zMjEgdG1fcHRfMTA9LTE2LjEzNyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuMTAyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI1Ni4yOTEKLTM2IHx8fCB0aGUgc3ViamVjdCBzb21ldGltZXMgcHVyYW4gLWxyYi0gZnJvbSBzb21ldGltZXMgbWFpbnRhaW4gbG92ZSBzdG9yeSBzb21ldGltZXMgYWdhaW4gZnJvbSB0b2RheSAncyBzb2NpYWwgYW5kIHBvbGl0aWNhbCDgppjgpp/gpqjgpr7gpqzgprLgpr8gZnJvbSB0YWtlbiB8fHwgbG1fMD0tNjEuNjQ2IGxtXzE9LTcxLjc0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTQ5LjcwNiB0bV9wdF82PS0yOC4xNDggdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS00LjMyMSB0bV9wdF8xMD0tMTUuNzc0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOS4xMDIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIFdvcmRQZW5hbHR5PS05Ljk4OSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjU2LjMwNwotMzcgfHx8IHRocmVlIG1lYXN1cmUgYmFzZWQgb24gdGhlIHRoYXQgYWdlIGlzIGZvdW5kIHRoYXQgaXMgYWxtb3N0IOCnp+CnqS7gp60gwrEg4KemLuCnqCBiaWxsaW9uIHllYXJzIC4gfHx8IGxtXzA9LTUwLjA3OCBsbV8xPS02MS45NjEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0zNC41MTEgdG1fcHRfNj0tMjMuODQ4IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMy4xNDMgdG1fcHRfMTA9LTE3LjgxOSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMDg2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBXb3JkUGVuYWx0eT0tOC42ODYgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQyNS40MjEKLTM3IHx8fCB0aHJlZSBtZWFzdXJlIGJhc2VkIG9uIHRoZSB0aGF0IGlzIGZvdW5kIGluIHRoYXQgaXMgYWxtb3N0IOCnp+CnqS7gp60gwrEg4KemLuCnqCBiaWxsaW9uIHllYXJzIC4gfHx8IGxtXzA9LTQ3LjAwNSBsbV8xPS02MS45NjEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS00MS40MzEgdG1fcHRfNj0tMjcuMDc4IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMy41MDQgdG1fcHRfMTA9LTIzLjM1NiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuMjcyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBXb3JkUGVuYWx0eT0tOC42ODYgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQyNi4xOTkKLTM3IHx8fCB0aHJlZSBtZWFzdXJlIGJhc2Ugb24gdGhlIHRoYXQgaXMgZm91bmQgaW4gdGhhdCBpcyBhbG1vc3Qg4Ken4KepLuCnrSDCsSDgp6Yu4KeoIGJpbGxpb24geWVhcnMgLiB8fHwgbG1fMD0tNDguMDY2IGxtXzE9LTYxLjk2MSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTQwLjM5NCB0bV9wdF82PS0yNS40MjcgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0zLjczNiB0bV9wdF8xMD0tMjEuMTk3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi42NzcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDI2LjUyMwotMzcgfHx8IHRocmVlIG1lYXN1cmUgYmFzZWQgb24gdGhlIGFnZSBpcyBmb3VuZCBpbiB0aGUgaXMgYWxtb3N0IOCnp+CnqS7gp60gwrEg4KemLuCnqCBiaWxsaW9uIHllYXJzIC4gfHx8IGxtXzA9LTQ3LjY1NiBsbV8xPS02MS45NjEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTM4LjgxMCB0bV9wdF82PS0yNC44NzkgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0zLjUxMCB0bV9wdF8xMD0tMTQuNTAxIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi42ODEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDI2LjUzNAotMzcgfHx8IHRocmVlIG1lYXN1cmUgYmFzZWQgb24gdGhlIHRoYXQgYXJlIGZvdW5kIGluIHRoYXQgaXMgYWxtb3N0IOCnp+CnqS7gp60gwrEg4KemLuCnqCBiaWxsaW9uIHllYXJzIC4gfHx8IGxtXzA9LTQ3Ljc3NCBsbV8xPS02MS45NjEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0zOC41MjcgdG1fcHRfNj0tMjQuOTk5IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMy41MDQgdG1fcHRfMTA9LTIzLjMzMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuNTc5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBXb3JkUGVuYWx0eT0tOC42ODYgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQyNi42MzIKLTM4IHx8fCDgppXgpr7gppvgp4fgpocgYXJlIGVhc3QgcnVzc2lhIHdoaWNoIOCmk+CmluCmn+CmuOCnjeCmlSBzZWEgYW5kIGphcGFuIHNlYSBhbm90aGVyIGNhbiBzaXR1YXRlZCAuIHx8fCBsbV8wPS00NS43OTkgbG1fMT0tNDguOTE3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTE1LjA5MCB0bV9wdF82PS05LjU1MiB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMC43NTQgdG1fcHRfMTA9LTguNTkyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi41MDcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjk4LjU5MwotMzggfHx8IOCmleCmvuCmm+Cnh+CmhyBhcmUgZWFzdCBydXNzaWEgd2hpY2gg4KaT4KaW4Kaf4Ka44KeN4KaVIHNlYSBhbmQgamFwYW4gc2VhIG90aGVyIGNhbiBzaXR1YXRlZCAuIHx8fCBsbV8wPS00NS41NDAgbG1fMT0tNDguOTE3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTE2LjEyOSB0bV9wdF82PS04Ljk5MiB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMC43NTQgdG1fcHRfMTA9LTEwLjY1NiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNTA3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI5OC44MTYKLTM4IHx8fCDgppXgpr7gppvgp4fgpocgYXJlIGVhc3QgcnVzc2lhIHdoaWNoIOCmk+CmluCmn+CmuOCnjeCmlSBzZWEgYW5kIGphcGFuIHNlYSBhbm90aGVyIGNhbiBsb2NhdGVkIC4gfHx8IGxtXzA9LTQ1Ljk3MyBsbV8xPS00OC45MTcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMTUuMjgyIHRtX3B0XzY9LTkuNzU5IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0wLjc1NCB0bV9wdF8xMD0tOC41OTIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjUwNyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTguOTE3Ci0zOCB8fHwg4KaV4Ka+4Kab4KeH4KaHIGFyZSBlYXN0IHJ1c3NpYSB3aGljaCDgppPgppbgpp/gprjgp43gppUgc2VhIGFuZCBqYXBhbiBzZWEgb3RoZXIgY2FuIGxvY2F0ZWQgLiB8fHwgbG1fMD0tNDUuNzE1IGxtXzE9LTQ4LjkxNyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0xNi4zMjEgdG1fcHRfNj0tOS4yMDAgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTAuNzU0IHRtX3B0XzEwPS0xMC42NTYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjUwNyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTkuMTQwCi0zOCB8fHwg4KaV4Ka+4Kab4KeH4KaHIGlzIGVhc3QgcnVzc2lhIHdoaWNoIOCmk+CmluCmn+CmuOCnjeCmlSBzZWEgYW5kIGphcGFuIHNlYSBhbm90aGVyIGNhbiBzaXR1YXRlZCAuIHx8fCBsbV8wPS00NS43MDkgbG1fMT0tNDguOTE3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTE2LjE2OCB0bV9wdF82PS05LjgwNSB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMC43NTQgdG1fcHRfMTA9LTkuODQ5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi44OTAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjk5LjIzNwotMzggfHx8IOCmleCmvuCmm+Cnh+CmhyBhcmUgZWFzdCBydXNzaWEgd2hpY2gg4KaT4KaW4Kaf4Ka44KeN4KaVIHNlYSBhbmQgamFwYW4gc2VhIGFub3RoZXIgY2FuIGF0IHx8fCBsbV8wPS00NS4zNjMgbG1fMT0tNDUuNjU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTE4LjQyNyB0bV9wdF82PS0xOC4zMzggdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTEuMzg2IHRtX3B0XzEwPS0xMi44ODIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjIwMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMDEuNDcwCi0zOCB8fHwg4KaV4Ka+4Kab4KeH4KaHIGFyZSBlYXN0IHJ1c3NpYSB3aGljaCDgppPgppbgpp/gprjgp43gppUgc2VhIGFuZCBqYXBhbiBzZWEgb3RoZXIgY2FuIGF0IHx8fCBsbV8wPS00NS4xMDUgbG1fMT0tNDUuNjU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTE5LjQ2NiB0bV9wdF82PS0xNy43NzggdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTEuMzg2IHRtX3B0XzEwPS0xNC45NDYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjIwMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMDEuNjkzCi0zOSB8fHwga29sa2F0YSB0aGUgbmF0aW9uYWwgbGlicmFyeSB0aGUgbGVhZGluZyBwdWJsaWMg4Kay4Ka+4KaH4Kas4KeN4Kaw4KeH4Kaw4Ka/IC4gfHx8IGxtXzA9LTI1Ljc5NSBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMTcuNjE0IHRtX3B0XzY9LTEyLjk1NSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS4zNzAgdG1fcHRfMTA9LTE3LjI1NCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMzUyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjcuODAzCi0zOSB8fHwga29sa2F0YSBpbmRpYW4gbmF0aW9uYWwgbGlicmFyeSB0aGUgbGVhZGluZyBwdWJsaWMg4Kay4Ka+4KaH4Kas4KeN4Kaw4KeH4Kaw4Ka/IC4gfHx8IGxtXzA9LTI3LjExMyBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMTUuMTU4IHRtX3B0XzY9LTE0LjI3NCB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMS43MzggdG1fcHRfMTA9LTEzLjk3NSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMTQxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjguMjQ2Ci0zOSB8fHwga29sa2F0YSB0aGUgbmF0aW9uYWwgbGlicmFyeSBjb3VudHJpZXMgbGVhZGluZyBwdWJsaWMg4Kay4Ka+4KaH4Kas4KeN4Kaw4KeH4Kaw4Ka/IC4gfHx8IGxtXzA9LTI3LjkzNiBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMTQuNTE4IHRtX3B0XzY9LTE0LjM0MSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS4zNzAgdG1fcHRfMTA9LTEzLjQyMyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMjA5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjkuMjg5Ci0zOSB8fHwga29sa2F0YSBpcyB0aGUgbmF0aW9uYWwgbGlicmFyeSB0aGUgbGVhZGluZyBwdWJsaWMg4Kay4Ka+4KaH4Kas4KeN4Kaw4KeH4Kaw4Ka/IC4gfHx8IGxtXzA9LTI0LjE2NiBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMjAuNzk2IHRtX3B0XzY9LTcuOTY0IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0wLjM3MyB0bV9wdF8xMD0tMTcuOTcyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOC45ODQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2OS41NjUKLTM5IHx8fCBrb2xrYXRhIHRoZSBsZWFkaW5nIGluZGlhbiBuYXRpb25hbCBsaWJyYXJ5IHB1YmxpYyDgprLgpr7gpofgpqzgp43gprDgp4fgprDgpr8gLiB8fHwgbG1fMD0tMjUuNTE4IGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNS4xNTggdG1fcHRfNj0tMTQuMjc0IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0yLjczNiB0bV9wdF8xMD0tMTMuMTQ5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy42MzMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2OS42MjYKLTQwIHx8fCDgppvgpqTgp43gprDgpr7gppXgpqzgpr/gpqbgp43gpq/gpr4gfHx8IGxtXzA9LTcuMzU1IGxtXzE9LTYuNTIyIHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0wLjAwMCB0bV9wdF81PTAuMDAwIHRtX3B0XzY9MC4wMDAgdG1fcHRfNz0wLjAwMCB0bV9wdF84PTAuMDAwIHRtX3B0Xzk9MC4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9MC4wMDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9MC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTExLjM1OAotNDEgfHx8IOCmsOCmvuCmt+CnjeCmn+CnjeCmsOCmuOCmmeCnjeCmmOCnh+CmsCBnZW5lcmFsIHNlY3JldGFyeSDgpqzgpr7gpqgga2kgbW9vbiB8fHwgbG1fMD0tMjQuNDc5IGxtXzE9LTIyLjgyOCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS01Ljg0NCB0bV9wdF82PS00LjE2NCB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0xLjEzNSB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTAuNTExIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDYuNDE5Ci00MSB8fHwg4Kaw4Ka+4Ka34KeN4Kaf4KeN4Kaw4Ka44KaZ4KeN4KaY4KeH4KawIHNlY3JldGFyeSBnZW5lcmFsIOCmrOCmvuCmqCBraSBtb29uIHx8fCBsbV8wPS0yMy44ODIgbG1fMT0tMjIuODI4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTUuODQ0IHRtX3B0XzY9LTQuMTY0IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTEuMDUwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMC4yMjMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0Ni40NzMKLTQxIHx8fCDgprDgpr7gprfgp43gpp/gp43gprDgprjgppngp43gppjgp4fgprAgY2hpZWYgc2VjcmV0YXJ5IOCmrOCmvuCmqCBraSBtb29uIHx8fCBsbV8wPS0yNC44MzIgbG1fMT0tMjIuODI4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTcuMDgyIHRtX3B0XzY9LTQuNjQ5IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTIuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS42MDkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD00LjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0OC4zNTUKLTQxIHx8fCDgpqzgpr7gpqgg4Kaw4Ka+4Ka34KeN4Kaf4KeN4Kaw4Ka44KaZ4KeN4KaY4KeH4KawIGdlbmVyYWwgc2VjcmV0YXJ5IGtpIG1vb24gfHx8IGxtXzA9LTI0LjQ3OSBsbV8xPS0yMi44MjggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tNS44NDQgdG1fcHRfNj0tNC4xNjQgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xLjYwOSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0zLjQ3NCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjQ5LjQ4MQotNDEgfHx8IOCmsOCmvuCmt+CnjeCmn+CnjeCmsOCmuOCmmeCnjeCmmOCnh+CmsCBnZW5lcmFsIHNlY3JldGFyeSDgpqzgpr7gpqggd2hhdCBtb29uIHx8fCBsbV8wPS0yNi43MDkgbG1fMT0tMjIuODI4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTcuMDU4IHRtX3B0XzY9LTMuNjUzIHRtX3B0Xzc9LTMuMDAwIHRtX3B0Xzg9LTguMTU0IHRtX3B0Xzk9LTAuNTEwIHRtX3B0XzEwPS0xLjMyMiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuMDE1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDkuNzg4Ci00MiB8fHwg4Kau4Ka/4Kao4Ka/4KaV4KeN4Ka44KeH4KawIG9mIHdhcyBzbWVsbHMg4Kaf4Ka+4Kao4KeH4Kao4Kas4KauIGEgZmFtb3VzIG9wZXJhdGluZyBzeXN0ZW0gZGVzaWduIOCmquCnjeCmsOCmtuCmv+CmleCnjeCmt+CmlSAuIHx8fCBsbV8wPS00MC4zOTggbG1fMT0tNDIuMzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIyLjE4NSB0bV9wdF82PS04LjAzOCB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTE3LjU2MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuNjA0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzkwLjMwOQotNDIgfHx8IOCmruCmv+CmqOCmv+CmleCnjeCmuOCnh+CmsCBvZiB3YXMgc21lbGxzIOCmn+CmvuCmqOCnh+CmqOCmrOCmriBhIGZhbW91cyBvcGVyYXRpbmcgc3lzdGVtIGRlc2lnbmluZyDgpqrgp43gprDgprbgpr/gppXgp43gprfgppUgLiB8fHwgbG1fMD0tNDAuMzA5IGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMS43MTggdG1fcHRfNj0tOC43ODUgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuNDE4IHRtX3B0XzEwPS0xNi42NTAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjQxNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5MC40NTYKLTQyIHx8fCDgpq7gpr/gpqjgpr/gppXgp43gprjgp4fgprAgdG8gd2FzIHNtZWxscyDgpp/gpr7gpqjgp4fgpqjgpqzgpq4gYSBmYW1vdXMgb3BlcmF0aW5nIHN5c3RlbSBkZXNpZ24g4Kaq4KeN4Kaw4Ka24Ka/4KaV4KeN4Ka34KaVIC4gfHx8IGxtXzA9LTQwLjY4MSBsbV8xPS00Mi4zOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMjIuNDMzIHRtX3B0XzY9LTkuNDI0IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjM3NSB0bV9wdF8xMD0tMTcuMDQyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy43NDcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTIuMDY2Ci00MiB8fHwg4Kau4Ka/4Kao4Ka/4KaV4KeN4Ka44KeH4KawIG9mIHdlcmUgc21lbGxzIOCmn+CmvuCmqOCnh+CmqOCmrOCmriBhIGZhbW91cyBvcGVyYXRpbmcgc3lzdGVtIGRlc2lnbiDgpqrgp43gprDgprbgpr/gppXgp43gprfgppUgLiB8fHwgbG1fMD0tNDAuNTkyIGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0yMi4yNDQgdG1fcHRfNj0tOS40OTggdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzc1IHRtX3B0XzEwPS0xNS45MzMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjE0OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5Mi4xNTQKLTQzIHx8fCB0aGUg4Kaf4Ka+4KaH4Kau4KeNIHRoZSAncyBvZiDgpofgpqjgp43gpqHgpr/gpq/gprzgpr4t4Kak4KeHIHdyaXR0ZW4gaW4gdGhlICIgaXQgaXMgYWJzdXJkIHRvIGNvbXBhcmUgaXQgd2l0aCBhbnkgb3RoZXIgaW5kaWFuIGNpbmVtYSAuLi4gcGF0aGVyIHBhbmNoYWxpIGlzIHB1cmUgY2luZW1hICIgLWxyYi0gIiBpdCBvdGhlciBieSBpbmRpYW4gZmlsbXMgd2l0aCBjb21wYXJlZCB0byB1bnJlYWwgLi4uIHBhdGhlciBwYW5jaGFsaSBhcmUgcHVyZSBmaWxtICIgLXJyYi0gLiB8fHwgbG1fMD0tMTMyLjUxMCBsbV8xPS0xNTkuNzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTI4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yNy4wMDAgdG1fcHRfNT0tODUuOTU5IHRtX3B0XzY9LTQyLjUxOCB0bV9wdF83PS0yOC4wMDAgdG1fcHRfOD0tNzYuMTA0IHRtX3B0Xzk9LTIuMTY4IHRtX3B0XzEwPS01NC42OTcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMi4yMDIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NDMuMDAwIFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEyLjQ5NQotNDMgfHx8IHRoZSDgpp/gpr7gpofgpq7gp40gb2YgJ3Mgb2Yg4KaH4Kao4KeN4Kah4Ka/4Kav4Ka84Ka+LeCmpOCnhyB3cml0dGVuIGluIHRoZSAiIGl0IGlzIGFic3VyZCB0byBjb21wYXJlIGl0IHdpdGggYW55IG90aGVyIGluZGlhbiBjaW5lbWEgLi4uIHBhdGhlciBwYW5jaGFsaSBpcyBwdXJlIGNpbmVtYSAiIC1scmItICIgaXQgb3RoZXIgYnkgaW5kaWFuIGZpbG1zIHdpdGggY29tcGFyZWQgdG8gdW5yZWFsIC4uLiBwYXRoZXIgcGFuY2hhbGkgYXJlIHB1cmUgZmlsbSAiIC1ycmItIC4gfHx8IGxtXzA9LTEzMi4zMjcgbG1fMT0tMTU5Ljc5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMjcuMDAwIHRtX3B0XzU9LTg1Ljk2MiB0bV9wdF82PS00Mi44NDggdG1fcHRfNz0tMjguMDAwIHRtX3B0Xzg9LTc2LjEwNCB0bV9wdF85PS0yLjI5NiB0bV9wdF8xMD0tNTQuMDk4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTIuODk1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMzIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTQzLjAwMCBXb3JkUGVuYWx0eT0tMjEuNzE1IE9PVlBlbmFsdHk9LTE2MDAuMDAwIHx8fCAtMTkxMi41NzcKLTQzIHx8fCB0aGUg4Kaf4Ka+4KaH4Kau4KeNIHRoZSAncyBvZiDgpofgpqjgp43gpqHgpr/gpq/gprzgpr4t4Kak4KeHIHdyaXR0ZW4gaW4gdGhhdCAiIGl0IGlzIGFic3VyZCB0byBjb21wYXJlIGl0IHdpdGggYW55IG90aGVyIGluZGlhbiBjaW5lbWEgLi4uIHBhdGhlciBwYW5jaGFsaSBpcyBwdXJlIGNpbmVtYSAiIC1scmItICIgaXQgb3RoZXIgYnkgaW5kaWFuIGZpbG1zIHdpdGggY29tcGFyZWQgdG8gdW5yZWFsIC4uLiBwYXRoZXIgcGFuY2hhbGkgYXJlIHB1cmUgZmlsbSAiIC1ycmItIC4gfHx8IGxtXzA9LTEzMy43NDIgbG1fMT0tMTU5Ljc5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMjcuMDAwIHRtX3B0XzU9LTgzLjQ5OSB0bV9wdF82PS00Mi4xNTkgdG1fcHRfNz0tMjguMDAwIHRtX3B0Xzg9LTc2LjEwNCB0bV9wdF85PS0yLjE2OCB0bV9wdF8xMD0tNTIuMzUxIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTEuODgyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMzIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTQzLjAwMCBXb3JkUGVuYWx0eT0tMjEuNzE1IE9PVlBlbmFsdHk9LTE2MDAuMDAwIHx8fCAtMTkxMi43MDMKLTQzIHx8fCB0aGUg4Kaf4Ka+4KaH4Kau4KeNIG9mICdzIG9mIOCmh+CmqOCnjeCmoeCmv+Cmr+CmvOCmvi3gpqTgp4cgd3JpdHRlbiBpbiB0aGF0ICIgaXQgaXMgYWJzdXJkIHRvIGNvbXBhcmUgaXQgd2l0aCBhbnkgb3RoZXIgaW5kaWFuIGNpbmVtYSAuLi4gcGF0aGVyIHBhbmNoYWxpIGlzIHB1cmUgY2luZW1hICIgLWxyYi0gIiBpdCBvdGhlciBieSBpbmRpYW4gZmlsbXMgd2l0aCBjb21wYXJlZCB0byB1bnJlYWwgLi4uIHBhdGhlciBwYW5jaGFsaSBhcmUgcHVyZSBmaWxtICIgLXJyYi0gLiB8fHwgbG1fMD0tMTMzLjU1OCBsbV8xPS0xNTkuNzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTI4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yNy4wMDAgdG1fcHRfNT0tODMuNTAzIHRtX3B0XzY9LTQyLjQ4OSB0bV9wdF83PS0yOC4wMDAgdG1fcHRfOD0tNzYuMTA0IHRtX3B0Xzk9LTIuMjk2IHRtX3B0XzEwPS01MS43NTIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMi41NzUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NDMuMDAwIFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEyLjc4NQotNDMgfHx8IHRoZSDgpp/gpr7gpofgpq7gp40gdGhlICdzIG9mIOCmh+CmqOCnjeCmoeCmv+Cmr+CmvOCmvi3gpqTgp4cgd3JpdHRlbiBpbiB0aGUgIiBpdCBpcyBhYnN1cmQgdG8gY29tcGFyZSBpdCB3aXRoIGFueSBvdGhlciBpbmRpYW4gY2luZW1hIC4uLiBwYXRoZXIgcGFuY2hhbGkgaXMgcHVyZSBjaW5lbWEgIiAtbHJiLSAiIGl0IG90aGVyIGJ5IGluZGlhbiBmaWxtcyB3aXRoIGNvbXBhcmVkIHRvIHVucmVhbCAuLi4gcGF0aGVyIHBhbmNoYWxpIGlzIHB1cmUgZmlsbSAiIC1ycmItIC4gfHx8IGxtXzA9LTEzMi40MjAgbG1fMT0tMTU5Ljc5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMjguMDAwIHRtX3B0XzU9LTg2LjY2NSB0bV9wdF82PS00Mi40MDAgdG1fcHRfNz0tMjkuMDAwIHRtX3B0Xzg9LTc4LjgyMiB0bV9wdF85PS0yLjE2OCB0bV9wdF8xMD0tNTUuOTkwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTIuNDY4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMzIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTQ0LjAwMCBXb3JkUGVuYWx0eT0tMjEuNzE1IE9PVlBlbmFsdHk9LTE2MDAuMDAwIHx8fCAtMTkxMy4wOTgKLTQzIHx8fCB0aGUg4Kaf4Ka+4KaH4Kau4KeNIHRoZSAncyBvZiDgpofgpqjgp43gpqHgpr/gpq/gprzgpr4t4Kak4KeHIHdyaXR0ZW4gaW4gdGhlICIgaXQgaXMgYWJzdXJkIHRvIGNvbXBhcmUgaXQgd2l0aCBhbnkgb3RoZXIgaW5kaWFuIGNpbmVtYSAuLi4gcGF0aGVyIHBhbmNoYWxpIGlzIHB1cmUgY2luZW1hICIgLWxyYi0gIiBpdCBvdGhlciBieSBpbmRpYW4gZmlsbXMgd2l0aCBjb21wYXJlZCB0byB1bnJlYWwgLi4uIHBhdGhlciBwYW5jaGFsaSBhcmUgcHVyZSBmaWxtICcgLXJyYi0gLiB8fHwgbG1fMD0tMTMyLjg5NSBsbV8xPS0xNTkuNzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTI4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yNy4wMDAgdG1fcHRfNT0tODUuOTE5IHRtX3B0XzY9LTQyLjk2NyB0bV9wdF83PS0yOC4wMDAgdG1fcHRfOD0tNzYuMTA0IHRtX3B0Xzk9LTIuMTY4IHRtX3B0XzEwPS01NC4yMjQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMi42ODcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NDMuMDAwIFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEzLjE2NgotNDMgfHx8IHRoZSDgpp/gpr7gpofgpq7gp40gb2YgJ3Mgb2Yg4KaH4Kao4KeN4Kah4Ka/4Kav4Ka84Ka+LeCmpOCnhyB3cml0dGVuIGluIHRoZSAiIGl0IGlzIGFic3VyZCB0byBjb21wYXJlIGl0IHdpdGggYW55IG90aGVyIGluZGlhbiBjaW5lbWEgLi4uIHBhdGhlciBwYW5jaGFsaSBpcyBwdXJlIGNpbmVtYSAiIC1scmItICIgaXQgb3RoZXIgYnkgaW5kaWFuIGZpbG1zIHdpdGggY29tcGFyZWQgdG8gdW5yZWFsIC4uLiBwYXRoZXIgcGFuY2hhbGkgaXMgcHVyZSBmaWxtICIgLXJyYi0gLiB8fHwgbG1fMD0tMTMyLjIzNyBsbV8xPS0xNTkuNzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTI5LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yOC4wMDAgdG1fcHRfNT0tODYuNjY4IHRtX3B0XzY9LTQyLjczMCB0bV9wdF83PS0yOS4wMDAgdG1fcHRfOD0tNzguODIyIHRtX3B0Xzk9LTIuMjk2IHRtX3B0XzEwPS01NS4zOTEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMy4xNjEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NDQuMDAwIFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEzLjE4MAotNDMgfHx8IHRoZSDgpp/gpr7gpofgpq7gp40gb2YgJ3Mgb2Yg4KaH4Kao4KeN4Kah4Ka/4Kav4Ka84Ka+LeCmpOCnhyB3cml0dGVuIGluIHRoZSAiIGl0IGlzIGFic3VyZCB0byBjb21wYXJlIGl0IHdpdGggYW55IG90aGVyIGluZGlhbiBjaW5lbWEgLi4uIHBhdGhlciBwYW5jaGFsaSBpcyBwdXJlIGNpbmVtYSAiIC1scmItICIgaXQgb3RoZXIgYnkgaW5kaWFuIGZpbG1zIHdpdGggY29tcGFyZWQgdG8gdW5yZWFsIC4uLiBwYXRoZXIgcGFuY2hhbGkgYXJlIHB1cmUgZmlsbSAnIC1ycmItIC4gfHx8IGxtXzA9LTEzMi43MTIgbG1fMT0tMTU5Ljc5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMjcuMDAwIHRtX3B0XzU9LTg1LjkyMyB0bV9wdF82PS00My4yOTggdG1fcHRfNz0tMjguMDAwIHRtX3B0Xzg9LTc2LjEwNCB0bV9wdF85PS0yLjI5NiB0bV9wdF8xMD0tNTMuNjI1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTMuMzgwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMzIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTQzLjAwMCBXb3JkUGVuYWx0eT0tMjEuNzE1IE9PVlBlbmFsdHk9LTE2MDAuMDAwIHx8fCAtMTkxMy4yNDgKLTQzIHx8fCB0aGUg4Kaf4Ka+4KaH4Kau4KeNIHRoZSAncyBvZiDgpofgpqjgp43gpqHgpr/gpq/gprzgpr4t4Kak4KeHIHdyaXR0ZW4gaW4gdGhhdCAiIGl0IGlzIGFic3VyZCB0byBjb21wYXJlIGl0IHdpdGggYW55IG90aGVyIGluZGlhbiBjaW5lbWEgLi4uIHBhdGhlciBwYW5jaGFsaSBpcyBwdXJlIGNpbmVtYSAiIC1scmItICIgaXQgb3RoZXIgYnkgaW5kaWFuIGZpbG1zIHdpdGggY29tcGFyZWQgdG8gdW5yZWFsIC4uLiBwYXRoZXIgcGFuY2hhbGkgaXMgcHVyZSBmaWxtICIgLXJyYi0gLiB8fHwgbG1fMD0tMTMzLjY1MiBsbV8xPS0xNTkuNzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTI5LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yOC4wMDAgdG1fcHRfNT0tODQuMjA1IHRtX3B0XzY9LTQyLjA0MCB0bV9wdF83PS0yOS4wMDAgdG1fcHRfOD0tNzguODIyIHRtX3B0Xzk9LTIuMTY4IHRtX3B0XzEwPS01My42NDQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMi4xNDggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NDQuMDAwIFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEzLjMwNwotNDMgfHx8IHRoZSDgpp/gpr7gpofgpq7gp40gdGhlICdzIG9mIOCmh+CmqOCnjeCmoeCmv+Cmr+CmvOCmvi3gpqTgp4cgd3JpdHRlbiBpbiB0aGF0ICIgaXQgaXMgYWJzdXJkIHRvIGNvbXBhcmUgaXQgd2l0aCBhbnkgb3RoZXIgaW5kaWFuIGNpbmVtYSAuLi4gcGF0aGVyIHBhbmNoYWxpIGlzIHB1cmUgY2luZW1hICIgLWxyYi0gIiBpdCBvdGhlciBieSBpbmRpYW4gZmlsbXMgd2l0aCBjb21wYXJlZCB0byB1bnJlYWwgLi4uIHBhdGhlciBwYW5jaGFsaSBhcmUgcHVyZSBmaWxtICcgLXJyYi0gLiB8fHwgbG1fMD0tMTM0LjEyNiBsbV8xPS0xNTkuNzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTI4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yNy4wMDAgdG1fcHRfNT0tODMuNDYwIHRtX3B0XzY9LTQyLjYwOCB0bV9wdF83PS0yOC4wMDAgdG1fcHRfOD0tNzYuMTA0IHRtX3B0Xzk9LTIuMTY4IHRtX3B0XzEwPS01MS44NzggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMi4zNjcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NDMuMDAwIFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEzLjM3NQotNDQgfHx8IGFmdGVyIDE5NTMgb24gbWF5ICwgbmF6cnVsIGFuZCDgpqrgp43gprDgpq7gp4DgprLgpr4g4Kam4KeH4Kas4KeA4KaV4KeHIOCmmuCmv+CmleCmv+CnjuCmuOCmvuCmsCBmb3IgbG9uZG9uIHNlbnQgLiB8fHwgbG1fMD0tNDYuMDI0IGxtXzE9LTQ4LjkxNyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMjEuMTExIHRtX3B0XzY9LTE3LjI0NCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuNDY3IHRtX3B0XzEwPS05LjY0OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuMTgzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQwMy44ODEKLTQ0IHx8fCBhZnRlciAxOTUzIG9uIG1heSAsIG5henJ1bCBhbmQg4Kaq4KeN4Kaw4Kau4KeA4Kay4Ka+IOCmpuCnh+CmrOCngOCmleCnhyDgpprgpr/gppXgpr/gp47gprjgpr7gprAgZm9yIGxvbmRvbiBzZW50IHRvIC4gfHx8IGxtXzA9LTQ2Ljk4OCBsbV8xPS01Mi4xNzggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTI0LjE0NiB0bV9wdF82PS0xMS40OTkgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0wLjYwMyB0bV9wdF8xMD0tOC4wMzkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjA4NCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgV29yZFBlbmFsdHk9LTcuMzgzIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDQuMjc4Ci00NCB8fHwgYWZ0ZXIgb24gbWF5ICwgMTk1MyBuYXpydWwgYW5kIOCmquCnjeCmsOCmruCngOCmsuCmviDgpqbgp4fgpqzgp4DgppXgp4cg4Kaa4Ka/4KaV4Ka/4KeO4Ka44Ka+4KawIGZvciBsb25kb24gc2VudCAuIHx8fCBsbV8wPS00NS43NDQgbG1fMT0tNDguOTE3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0yMS4xMTEgdG1fcHRfNj0tMTcuMjQ0IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMS40NjcgdG1fcHRfMTA9LTkuNDA3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4xODMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDA0LjQ3MwotNDQgfHx8IHRoZXJlYWZ0ZXIgb24gbWF5ICwgMTk1MyBuYXpydWwgYW5kIOCmquCnjeCmsOCmruCngOCmsuCmviDgpqbgp4fgpqzgp4DgppXgp4cg4Kaa4Ka/4KaV4Ka/4KeO4Ka44Ka+4KawIGZvciBsb25kb24gc2VudCAuIHx8fCBsbV8wPS00NS45MzcgbG1fMT0tNDguOTE3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0yMC41NjQgdG1fcHRfNj0tMTkuODcxIHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMS41NTMgdG1fcHRfMTA9LTUuODU3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi40NzAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDA0Ljc1NgotNDQgfHx8IGFmdGVyIG5henJ1bCBvbiBtYXkgLCAxOTUzIGFuZCDgpqrgp43gprDgpq7gp4DgprLgpr4g4Kam4KeH4Kas4KeA4KaV4KeHIOCmmuCmv+CmleCmv+CnjuCmuOCmvuCmsCBmb3IgbG9uZG9uIHNlbnQgLiB8fHwgbG1fMD0tNDUuMTM1IGxtXzE9LTQ4LjkxNyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMS4xMTEgdG1fcHRfNj0tMTcuMjQ0IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjAxOCB0bV9wdF8xMD0tMy43NTAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjgwNyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQwNC43NzYKLTQ0IHx8fCBvbiBtYXkgLCBhZnRlciAxOTUzIG5henJ1bCBhbmQg4Kaq4KeN4Kaw4Kau4KeA4Kay4Ka+IOCmpuCnh+CmrOCngOCmleCnhyDgpprgpr/gppXgpr/gp47gprjgpr7gprAgZm9yIGxvbmRvbiBzZW50IC4gfHx8IGxtXzA9LTQ1LjY2NCBsbV8xPS00OC45MTcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIxLjExMSB0bV9wdF82PS0xNy4yNDQgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0xLjQxOSB0bV9wdF8xMD0tNy44NjIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01Ljg0NiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDQuNzc4Ci00NCB8fHwgYWZ0ZXIgb24gbWF5ICwgMTk1MyBuYXpydWwgYW5kIOCmquCnjeCmsOCmruCngOCmsuCmviDgpqbgp4fgpqzgp4DgppXgp4cg4Kaa4Ka/4KaV4Ka/4KeO4Ka44Ka+4KawIGZvciBsb25kb24gc2VudCB0byAuIHx8fCBsbV8wPS00Ni43MDkgbG1fMT0tNTIuMTc4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0yNC4xNDYgdG1fcHRfNj0tMTEuNDk5IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMC42MDMgdG1fcHRfMTA9LTcuNzk4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4wODQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS03LjM4MyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDA0Ljg3MAotNDQgfHx8IGFmdGVyIDE5NTMgb24gbWF5ICwgbmF6cnVsIGFuZCDgpqrgp43gprDgpq7gp4DgprLgpr4g4Kam4KeH4Kas4KeA4KaV4KeHIOCmmuCmv+CmleCmv+CnjuCmuOCmvuCmsCBzZW5kIHRvIGxvbmRvbiAuIHx8fCBsbV8wPS00My4zMjggbG1fMT0tNDguOTE3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMi40MjkgdG1fcHRfNj0tMTQuNzg0IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMC44MzUgdG1fcHRfMTA9LTE2LjY2OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuMDgxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDA1LjAyMgotNDUgfHx8IHRoZSBzb3V0aGVybiBhbmQgdGhlIGFyZSDgpqzgpr/gprjgp43gpqTgp4DgprDgp43gpqMgbGFuZCAsIHdlc3QgYW5kIGluIGFyZSDgprDgp4HgppXgp43gprcgbW91bnRhaW4gYW5kIG1vdW50YWluIC4gfHx8IGxtXzA9LTQzLjg4NiBsbV8xPS01OC43MDAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zNy44NjUgdG1fcHRfNj0tMTYuMTY1IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44MjIgdG1fcHRfMTA9LTMyLjQ1NCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTExLjg5NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgV29yZFBlbmFsdHk9LTguMjUyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjAuODExCi00NSB8fHwgdGhlIHNvdXRoZXJuIGFuZCB0aGUgYXJlIOCmrOCmv+CmuOCnjeCmpOCngOCmsOCnjeCmoyBsYW5kICwgd2VzdCBhbmQgaW4gaXMg4Kaw4KeB4KaV4KeN4Ka3IG1vdW50YWluIGFuZCBtb3VudGFpbiAuIHx8fCBsbV8wPS00My43OTYgbG1fMT0tNTguNzAwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMzguODE1IHRtX3B0XzY9LTE2LjI5MSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTEuODIyIHRtX3B0XzEwPS0zMy4xNjEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMS43MzAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIxLjA1MAotNDUgfHx8IHRoZSBzb3V0aGVybiBhbmQgdGhlIGlzIOCmrOCmv+CmuOCnjeCmpOCngOCmsOCnjeCmoyBsYW5kICwgd2VzdCBhbmQgaW4gYXJlIOCmsOCngeCmleCnjeCmtyBtb3VudGFpbiBhbmQgbW91bnRhaW4gLiB8fHwgbG1fMD0tNDMuNzk3IGxtXzE9LTU4LjcwMCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTM4LjgxNSB0bV9wdF82PS0xNi4yOTEgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0xLjgyMiB0bV9wdF8xMD0tMzMuMTYxIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTEuNzMwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBXb3JkUGVuYWx0eT0tOC4yNTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyMS4wNTEKLTQ1IHx8fCB0aGUgc291dGggYW5kIHRoZSBhcmUg4Kas4Ka/4Ka44KeN4Kak4KeA4Kaw4KeN4KajIGxhbmQgLCB3ZXN0IGFuZCBpbiBhcmUg4Kaw4KeB4KaV4KeN4Ka3IG1vdW50YWluIGFuZCBtb3VudGFpbiAuIHx8fCBsbV8wPS00NC43NDggbG1fMT0tNTguNzAwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMzcuNTY5IHRtX3B0XzY9LTE0LjM2MCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTIuODA0IHRtX3B0XzEwPS0zMS40MTMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMC4yNTkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIxLjE2MQotNDUgfHx8IHRoZSBzb3V0aGVybiBhbmQgdGhlIGlzIOCmrOCmv+CmuOCnjeCmpOCngOCmsOCnjeCmoyBsYW5kICwgd2VzdCBhbmQgaW4gaXMg4Kaw4KeB4KaV4KeN4Ka3IG1vdW50YWluIGFuZCBtb3VudGFpbiAuIHx8fCBsbV8wPS00My43MDcgbG1fMT0tNTguNzAwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMzkuNzY1IHRtX3B0XzY9LTE2LjQxNyB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTEuODIyIHRtX3B0XzEwPS0zMy44NjggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMS41NjMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIxLjI4OQotNDUgfHx8IHRoZSBzb3V0aCBhbmQgdGhlIGFyZSDgpqzgpr/gprjgp43gpqTgp4DgprDgp43gpqMgbGFuZCAsIHdlc3QgYW5kIGluIGlzIOCmsOCngeCmleCnjeCmtyBtb3VudGFpbiBhbmQgbW91bnRhaW4gLiB8fHwgbG1fMD0tNDQuNjU4IGxtXzE9LTU4LjcwMCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTM4LjUyMCB0bV9wdF82PS0xNC40ODYgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0yLjgwNCB0bV9wdF8xMD0tMzIuMTIwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTAuMDkyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBXb3JkUGVuYWx0eT0tOC4yNTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyMS4zOTkKLTQ1IHx8fCB0aGUgc291dGggYW5kIHRoZSBpcyDgpqzgpr/gprjgp43gpqTgp4DgprDgp43gpqMgbGFuZCAsIHdlc3QgYW5kIGluIGFyZSDgprDgp4HgppXgp43gprcgbW91bnRhaW4gYW5kIG1vdW50YWluIC4gfHx8IGxtXzA9LTQ0LjY1OSBsbV8xPS01OC43MDAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zOC41MjAgdG1fcHRfNj0tMTQuNDg2IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMi44MDQgdG1fcHRfMTA9LTMyLjEyMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEwLjA5MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgV29yZFBlbmFsdHk9LTguMjUyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjEuNDAwCi00NSB8fHwgdGhlIHNvdXRoZXJuIGFuZCB0aGUgYXJlIOCmrOCmv+CmuOCnjeCmpOCngOCmsOCnjeCmoyBsYW5kICwgd2VzdCBhbmQgaW4gYXJlIOCmsOCngeCmleCnjeCmtyBoaWxsIGFuZCBtb3VudGFpbiAuIHx8fCBsbV8wPS00NC4zNDggbG1fMT0tNTguNzAwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEyLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMzguNjgwIHRtX3B0XzY9LTE3Ljk1NiB0bV9wdF83PS0xMi4wMDAgdG1fcHRfOD0tMzIuNjE2IHRtX3B0Xzk9LTIuNDU0IHRtX3B0XzEwPS0yOS43ODkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMS4xOTIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIxLjUzOQotNDUgfHx8IHRoZSBzb3V0aCBhbmQgdGhlIGlzIOCmrOCmv+CmuOCnjeCmpOCngOCmsOCnjeCmoyBsYW5kICwgd2VzdCBhbmQgaW4gaXMg4Kaw4KeB4KaV4KeN4Ka3IG1vdW50YWluIGFuZCBtb3VudGFpbiAuIHx8fCBsbV8wPS00NC41NzAgbG1fMT0tNTguNzAwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMzkuNDcwIHRtX3B0XzY9LTE0LjYxMiB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTIuODA0IHRtX3B0XzEwPS0zMi44MjcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjkyNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgV29yZFBlbmFsdHk9LTguMjUyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjEuNjM4Ci00NiB8fHwg4Kaf4KeN4Kaw4KeH4Kah4Kau4Ka+4Kaw4KeN4KaVIHx8fCBsbV8wPS03LjM1NSBsbV8xPS02LjUyMiB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0wLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9MC4wMDAgdG1fcHRfNT0wLjAwMCB0bV9wdF82PTAuMDAwIHRtX3B0Xzc9MC4wMDAgdG1fcHRfOD0wLjAwMCB0bV9wdF85PTAuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPTAuMDAwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTExMS4zNTgKLTQ3IHx8fCDgprLgprDgp43gpqEg4KaT4Kav4Ka84KeH4Kay4KeH4Ka44Kay4Ka/4KawIC1scmItIOCml+CmreCmsOCnjeCmqOCmsC3gppzgp4fgpqjgpr7gprDgp4fgprIg4Ken4Ket4Kev4KetLeCnp+CnruCnpuCnqyAtcnJiLSBkdXJpbmcgaGlzIGNpdHkgYXJlIHRoZSBnaG90ZWNoaWxvIHx8fCBsbV8wPS00Mi45NTcgbG1fMT0tNDIuMzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIzLjA1OCB0bV9wdF82PS0xOS41NTQgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTIuMDAwIHRtX3B0XzEwPS0xMS41NjMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjQ5MCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ5NS41MjgKLTQ3IHx8fCDgprLgprDgp43gpqEg4KaT4Kav4Ka84KeH4Kay4KeH4Ka44Kay4Ka/4KawIC1scmItIOCml+CmreCmsOCnjeCmqOCmsC3gppzgp4fgpqjgpr7gprDgp4fgprIg4Ken4Ket4Kev4KetLeCnp+CnruCnpuCnqyAtcnJiLSBkdXJpbmcgaGlzIHRoZSBhcmUgdGhlIGdob3RlY2hpbG8gfHx8IGxtXzA9LTQyLjM1MCBsbV8xPS00Mi4zOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMjYuNTQxIHRtX3B0XzY9LTE5LjIzNSB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTE1LjA1NiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuMTE0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNDk2LjQ2MAotNDcgfHx8IOCmsuCmsOCnjeCmoSDgppPgpq/gprzgp4fgprLgp4fgprjgprLgpr/gprAgLWxyYi0g4KaX4Kat4Kaw4KeN4Kao4KawLeCmnOCnh+CmqOCmvuCmsOCnh+CmsiDgp6fgp63gp6/gp60t4Ken4Keu4Kem4KerIC1ycmItIGR1cmluZyBoaXMgY2l0eSBhcmUgaW5jcmVhc2VkIGdob3RlY2hpbG8gfHx8IGxtXzA9LTQ0LjkzNiBsbV8xPS00Mi4zOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMTguMTIwIHRtX3B0XzY9LTIwLjEzNCB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMi4wMDcgdG1fcHRfMTA9LTcuNDczIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi42NDMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC00OTYuNTgyCi00NyB8fHwg4Kay4Kaw4KeN4KahIOCmk+Cmr+CmvOCnh+CmsuCnh+CmuOCmsuCmv+CmsCAtbHJiLSDgppfgpq3gprDgp43gpqjgprAt4Kac4KeH4Kao4Ka+4Kaw4KeH4KayIOCnp+CnreCnr+CnrS3gp6fgp67gp6bgp6sgLXJyYi0gZHVyaW5nIGhpcyB0aGUgbWVudGlvbmFibGUgdGhlIGdob3RlY2hpbG8gfHx8IGxtXzA9LTQzLjc0NSBsbV8xPS00Mi4zOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMjMuMjMzIHRtX3B0XzY9LTE5LjgxOCB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTExLjcyMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuNzM5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNDk2Ljc1NQotNDcgfHx8IOCmsuCmsOCnjeCmoSDgppPgpq/gprzgp4fgprLgp4fgprjgprLgpr/gprAgLWxyYi0g4KaX4Kat4Kaw4KeN4Kao4KawLeCmnOCnh+CmqOCmvuCmsOCnh+CmsiDgp6fgp63gp6/gp60t4Ken4Keu4Kem4KerIC1ycmItIGR1cmluZyBoaXMgdGhlIG1lbnRpb25hYmxlIGluY3JlYXNlZCBnaG90ZWNoaWxvIHx8fCBsbV8wPS00NS4yMTQgbG1fMT0tNDIuMzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTE4LjI5NSB0bV9wdF82PS0yMC4zOTggdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTIuMDA3IHRtX3B0XzEwPS03LjYzMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuODkyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNDk3LjE3OQotNDcgfHx8IOCmsuCmsOCnjeCmoSDgppPgpq/gprzgp4fgprLgp4fgprjgprLgpr/gprAgLWxyYi0g4KaX4Kat4Kaw4KeN4Kao4KawLeCmnOCnh+CmqOCmvuCmsOCnh+CmsiDgp6fgp63gp6/gp60t4Ken4Keu4Kem4KerIC1ycmItIGR1cmluZyBoaXMgdGhlIGltcG9ydGFudCB0aGUgZ2hvdGVjaGlsbyB8fHwgbG1fMD0tNDMuNTMyIGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0yNC45MzcgdG1fcHRfNj0tMTkuOTQyIHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0tMTMuNzcyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS44NzMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC00OTcuNDM5Ci00NyB8fHwg4Kay4Kaw4KeN4KahIOCmk+Cmr+CmvOCnh+CmsuCnh+CmuOCmsuCmv+CmsCAtbHJiLSDgppfgpq3gprDgp43gpqjgprAt4Kac4KeH4Kao4Ka+4Kaw4KeH4KayIOCnp+CnreCnr+CnrS3gp6fgp67gp6bgp6sgLXJyYi0gZHVyaW5nIGhpcyB0aGUgYXJlIGluY3JlYXNlZCBnaG90ZWNoaWxvIHx8fCBsbV8wPS00NC4zMjggbG1fMT0tNDIuMzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIxLjYwMyB0bV9wdF82PS0xOS44MTUgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTIuMDA3IHRtX3B0XzEwPS0xMC45NjcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjI2NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ5Ny41MTQKLTQ3IHx8fCDgprLgprDgp43gpqEg4KaT4Kav4Ka84KeH4Kay4KeH4Ka44Kay4Ka/4KawIC1scmItIOCml+CmreCmsOCnjeCmqOCmsC3gppzgp4fgpqjgpr7gprDgp4fgprIg4Ken4Ket4Kev4KetLeCnp+CnruCnpuCnqyAtcnJiLSBkdXJpbmcgaGlzIHRoZSBub3RhYmxlIHRoZSBnaG90ZWNoaWxvIHx8fCBsbV8wPS00NC4xMDQgbG1fMT0tNDIuMzk1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIzLjMyMSB0bV9wdF82PS0yMC4zNjAgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTIuMDAwIHRtX3B0XzEwPS0xMS43ODQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjIwOSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ5Ny41ODQKLTQ4IHx8fCBtYW55IGltcG9ydGFudCBhbmQgcmVhbCB0byBzb2x2ZSBwcm9ibGVtcyBjb21wbGV4IG51bWJlciBhcGFyaWhhcnphIHx8fCBsbV8wPS0yNi45MzYgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTE4LjkwNSB0bV9wdF82PS0xMS42MzAgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS04Ljk1OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuNTI3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiB8fHwgLTcxLjEyMQotNDggfHx8IG1hbnkgaW1wb3J0YW50IGFuZCByZWFsIHByb2JsZW0gdG8gc29sdmUgY29tcGxleCBudW1iZXIgYXBhcmloYXJ6YSB8fHwgbG1fMD0tMjcuMTg5IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xOC43NjQgdG1fcHRfNj0tMTEuMzY3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0zLjAwMCB0bV9wdF8xMD0tMTAuMzQ4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC41NjUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIHx8fCAtNzEuMjQ1Ci00OCB8fHwgbWFueSBpbXBvcnRhbnQgYW5kIHJlYWwgcHJvYmxlbSB0byBmb3IgY29tcGxleCBudW1iZXIgYXBhcmloYXJ6YSB8fHwgbG1fMD0tMjguMjI5IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0xOC4wMDEgdG1fcHRfNj0tNy43NjUgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0xNC40NTMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjkxMiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgfHx8IC03MS42NTkKLTQ4IHx8fCBtYW55IGltcG9ydGFudCBhbmQgcmVhbCB0byBzb2x2ZSBwcm9ibGVtcyBjb21wbGV4IG51bWJlciBpbmV2aXRhYmxlIHx8fCBsbV8wPS0yNy4xNTggbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIwLjI5MiB0bV9wdF82PS0xMS42MzAgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS04Ljk1OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuNTI3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiB8fHwgLTcxLjY2MQotNDggfHx8IG1hbnkgaW1wb3J0YW50IGFuZCByZWFsIHRvIHNvbHZlIHByb2JsZW1zIGNvbXBsZXggbnVtYmVycyBhcGFyaWhhcnphIHx8fCBsbV8wPS0yNy4yODQgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTE4LjY3MyB0bV9wdF82PS0xMi4zMzIgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS04LjQyNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuODM2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiB8fHwgLTcxLjcxNwotNDggfHx8IG1hbnkgaW1wb3J0YW50IGFuZCByZWFsIHByb2JsZW0gdG8gc29sdmUgY29tcGxleCBudW1iZXIgaW5ldml0YWJsZSB8fHwgbG1fMD0tMjcuNDExIGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMC4xNTAgdG1fcHRfNj0tMTEuMzY3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0zLjAwMCB0bV9wdF8xMD0tMTAuMzQ4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC41NjUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIHx8fCAtNzEuNzg0Ci00OCB8fHwgbWFueSBpbXBvcnRhbnQgYW5kIHJlYWwgcHJvYmxlbSB0byBzb2x2ZSBjb21wbGV4IG51bWJlcnMgYXBhcmloYXJ6YSB8fHwgbG1fMD0tMjcuNTM2IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xOC41MzEgdG1fcHRfNj0tMTIuMDcwIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0zLjAwMCB0bV9wdF8xMD0tOS44MTMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00Ljg3MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgfHx8IC03MS44NDEKLTQ4IHx8fCBtYW55IGltcG9ydGFudCBhbmQgcmVhbCBwcm9ibGVtIHRvIGZvciBjb21wbGV4IG51bWJlciBpbmV2aXRhYmxlIHx8fCBsbV8wPS0yOC40NTEgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTE5LjM4NyB0bV9wdF82PS03Ljc2NSB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTE0LjQ1MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuOTEyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiB8fHwgLTcyLjE5OQotNDggfHx8IG1hbnkgaW1wb3J0YW50IGFuZCByZWFsIHRvIHNvbHZlIHByb2JsZW1zIGNvbXBsZXggbnVtYmVycyBpbmV2aXRhYmxlIHx8fCBsbV8wPS0yNy41MDUgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIwLjA1OSB0bV9wdF82PS0xMi4zMzIgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS04LjQyNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuODM2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiB8fHwgLTcyLjI1NwotNDggfHx8IG1hbnkgaW1wb3J0YW50IGFuZCByZWFsIHByb2JsZW0gdG8gc29sdmUgY29tcGxleCBudW1iZXJzIGluZXZpdGFibGUgfHx8IGxtXzA9LTI3Ljc1OCBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMTkuOTE3IHRtX3B0XzY9LTEyLjA3MCB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMy4wMDAgdG1fcHRfMTA9LTkuODEzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC44NzMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIHx8fCAtNzIuMzgwCi00OSB8fHwgYmlnIGJhbmcgaXMgYSBmYW1vdXMgcmVzdWx0IGluIHRoZSBzdGF0ZSBzbyBhbmQgcmVjZW50IHNpdHVhdGlvbiBmcm9tIHRoZSBzZXBhcmF0ZSAuIHx8fCBsbV8wPS0zNi43MjEgbG1fMT0tNTguNzAwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNDkuNzI4IHRtX3B0XzY9LTI0LjI1MyB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTIuMjIxIHRtX3B0XzEwPS0zOS43NjcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xNC45NDUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIFdvcmRQZW5hbHR5PS04LjI1MiB8fHwgLTEyMi45NzAKLTQ5IHx8fCBiaWcgYmFuZyBpcyBhIGZhbW91cyByZXN1bHQgaW4gdGhlIHN0YXRlIHNvIGFuZCByZWNlbnQgc2l0dWF0aW9uIGZyb20gdGhlIHRoZSAuIHx8fCBsbV8wPS0zNC43NjEgbG1fMT0tNTguNzAwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTYuNDg3IHRtX3B0XzY9LTI0LjU0MSB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTIuMjI1IHRtX3B0XzEwPS00NS40NzAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xNS4wOTkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIFdvcmRQZW5hbHR5PS04LjI1MiB8fHwgLTEyMy40NzMKLTQ5IHx8fCBiaWcgYmFuZyBpcyBhIGZhbW91cyByZXN1bHQgaW4gdGhlIHN0YXRlIHNvIGFuZCByZWNlbnQgc2l0dWF0aW9uIGZyb20gdGhlIGRpZmZlcmVudCAuIHx8fCBsbV8wPS0zNS4wMzQgbG1fMT0tNTguNzAwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTIuOTAxIHRtX3B0XzY9LTI0LjgyOCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTIuNTg2IHRtX3B0XzEwPS00My45OTggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xNi4xOTggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIFdvcmRQZW5hbHR5PS04LjI1MiB8fHwgLTEyMy41MjcKLTQ5IHx8fCBiaWcgYmFuZyBpcyBhIGZhbW91cyByZXN1bHQgaW4gdGhlIHN0YXRlIHNvIGFuZCByZWNlbnQgc3RhdGUgZnJvbSB0aGUgc2VwYXJhdGUgLiB8fHwgbG1fMD0tMzguMjQyIGxtXzE9LTU4LjcwMCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTQ5Ljg1OSB0bV9wdF82PS0yMy4wNjMgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0xLjg2MCB0bV9wdF8xMD0tNDAuMDExIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTMuODQ2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTcuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBXb3JkUGVuYWx0eT0tOC4yNTIgfHx8IC0xMjMuODQ5Ci00OSB8fHwgYmlnIGJhbmcgaXMgYSBmYW1vdXMgcmVzdWx0IGluIHRoZSBzdGF0ZSBzbyBhbmQgcmVjZW50IHN0YXRlIGZyb20gdGhlIHRoZSAuIHx8fCBsbV8wPS0zNi4yODIgbG1fMT0tNTguNzAwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTYuNjE4IHRtX3B0XzY9LTIzLjM1MSB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTEuODY0IHRtX3B0XzEwPS00NS43MTMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xNC4wMDAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIFdvcmRQZW5hbHR5PS04LjI1MiB8fHwgLTEyNC4zNTIKLTQ5IHx8fCB0aGUgYmlnIGJhbmcgaXMgYSBmYW1vdXMgcmVzdWx0IGluIHRoZSBzdGF0ZSBzbyBhbmQgcmVjZW50IHNpdHVhdGlvbiBmcm9tIHRoZSBzZXBhcmF0ZSAuIHx8fCBsbV8wPS0zNS4zNDEgbG1fMT0tNjEuOTYxIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTQuODY4IHRtX3B0XzY9LTI0LjM5MCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTIuMjE2IHRtX3B0XzEwPS0zOS45MDYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xNC43OTEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xOC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIFdvcmRQZW5hbHR5PS04LjY4NiB8fHwgLTEyNC4zNzMKLTQ5IHx8fCBiaWcgYmFuZyBpcyBhIGZhbW91cyByZXN1bHQgaW4gdGhlIHN0YXRlIHNvIGFuZCByZWNlbnQgc3RhdGUgZnJvbSB0aGUgZGlmZmVyZW50IC4gfHx8IGxtXzA9LTM2LjU1NSBsbV8xPS01OC43MDAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS01My4wMzIgdG1fcHRfNj0tMjMuNjM5IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi4yMjUgdG1fcHRfMTA9LTQ0LjI0MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTE1LjA5OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE3LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgV29yZFBlbmFsdHk9LTguMjUyIHx8fCAtMTI0LjQwNgotNTAgfHx8IHdpbmRvd3Mg4Kau4Ka/4Kay4Ka/4Kao4Ka/4Kav4Ka84Ka+4KauIHx8fCBsbV8wPS05Ljk3NiBsbV8xPS05Ljc4MyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0wLjIzMSB0bV9wdF82PS0wLjA2MCB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMC4wMjUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPTAuMDAwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMTYuOTY0Ci01MCB8fHwg4KaJ4KaH4Kao4KeN4Kah4KeL4KacIOCmruCmv+CmsuCmv+CmqOCmv+Cmr+CmvOCmvuCmriB8fHwgbG1fMD0tMTIuNTI4IGxtXzE9LTkuNzgzIHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0wLjAwMCB0bV9wdF81PTAuMDAwIHRtX3B0XzY9MC4wMDAgdG1fcHRfNz0wLjAwMCB0bV9wdF84PTAuMDAwIHRtX3B0Xzk9MC4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9MC4wMDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9MC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjE5LjE4OQotNTEgfHx8IHJhYmluZHJhbmF0aCAsIG1hbnkg4Ka24KeI4Kay4KeAIOCmhuCmr+CmvOCmpOCnjeCmpOCnjeCmrCB3YXMgLiB8fHwgbG1fMD0tMjEuMDc1IGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNy4xNTMgdG1fcHRfNj0tNy40NTggdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTEuMDE5IHRtX3B0XzEwPS0xNy40MTcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjM4MSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjU0LjMxNAotNTEgfHx8IHJhYmluZHJhbmF0aCAsIG1vcmUg4Ka24KeI4Kay4KeAIOCmhuCmr+CmvOCmpOCnjeCmpOCnjeCmrCB3YXMgLiB8fHwgbG1fMD0tMjEuOTA5IGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNi4xNzggdG1fcHRfNj0tNi41NDEgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTEuMDE4IHRtX3B0XzEwPS0xNi4yMDMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjA5MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjU0LjQyOQotNTEgfHx8IHJhYmluZHJhbmF0aCAsIG1hbnkg4Ka24KeI4Kay4KeAIOCmhuCmr+CmvOCmpOCnjeCmpOCnjeCmrCBhIC4gfHx8IGxtXzA9LTIxLjEwMSBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTcuMTY4IHRtX3B0XzY9LTcuMjE3IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0xLjEzNiB0bV9wdF8xMD0tMTguNTA2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS44OTIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI1NC44MjUKLTUxIHx8fCByYWJpbmRyYW5hdGggYWx0aG91Z2ggbWFueSDgprbgp4jgprLgp4Ag4KaG4Kav4Ka84Kak4KeN4Kak4KeN4KasIHdhcyAuIHx8fCBsbV8wPS0yNC4xMzEgbG1fMT0tMjYuMDg5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEyLjIyOCB0bV9wdF82PS05LjEwNiB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4xNTQgdG1fcHRfMTA9LTEwLjYyOSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMjgyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTQuODU4Ci01MSB8fHwgcmFiaW5kcmFuYXRoIHRob3VnaCBtb3JlIOCmtuCniOCmsuCngCDgpobgpq/gprzgpqTgp43gpqTgp43gpqwgd2FzIC4gfHx8IGxtXzA9LTI0LjYxMCBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTIuNDU3IHRtX3B0XzY9LTcuMzE1IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0wLjE1NCB0bV9wdF8xMD0tMTEuMjEzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy45OTUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI1NC45MzIKLTUxIHx8fCByYWJpbmRyYW5hdGggLCBtYW55IOCmtuCniOCmsuCngCDgpobgpq/gprzgpqTgp43gpqTgp43gpqwgYnkgLiB8fHwgbG1fMD0tMjEuMDI3IGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xNy4zMzcgdG1fcHRfNj0tOC4yNDYgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTEuMDUwIHRtX3B0XzEwPS0xNS41OTEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00Ljk5OCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjU0Ljk0MAotNTEgfHx8IHJhYmluZHJhbmF0aCAsIG1vcmUg4Ka24KeI4Kay4KeAIOCmhuCmr+CmvOCmpOCnjeCmpOCnjeCmrCBhIC4gfHx8IGxtXzA9LTIxLjkzNSBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTYuMTk0IHRtX3B0XzY9LTYuMzAwIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0xLjEzNSB0bV9wdF8xMD0tMTcuMjkxIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS42MDQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI1NC45NDAKLTUxIHx8fCByYWJpbmRyYW5hdGggdGhvdWdoIG1hbnkg4Ka24KeI4Kay4KeAIOCmhuCmr+CmvOCmpOCnjeCmpOCnjeCmrCB3YXMgLiB8fHwgbG1fMD0tMjMuOTAzIGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMy40MzIgdG1fcHRfNj0tOC4yMzEgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuMTU0IHRtX3B0XzEwPS0xMi40MjggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjI4MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjU0Ljk3NAotNTEgfHx8IHJhYmluZHJhbmF0aCAsIG1vcmUg4Ka24KeI4Kay4KeAIOCmhuCmr+CmvOCmpOCnjeCmpOCnjeCmrCBieSAuIHx8fCBsbV8wPS0yMS44NjEgbG1fMT0tMjYuMDg5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE2LjM2MyB0bV9wdF82PS03LjMzMCB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMS4wNTAgdG1fcHRfMTA9LTE0LjM3NyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuNzEwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTUuMDU1Ci01MiB8fHwgbGFib3VyIGVjb25vbWljcyB8fHwgbG1fMD0tNS4zODkgbG1fMT0tOS43ODMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMS4yNzQgdG1fcHRfNj0tMi4wMTMgdG1fcHRfNz0tMS4wMDAgdG1fcHRfOD0tMi43MTggdG1fcHRfOT0tMC4wMDcgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0wLjc3MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyB8fHwgLTEzLjA5OQotNTIgfHx8IGxhYm9yIGVjb25vbXkgfHx8IGxtXzA9LTUuMzA5IGxtXzE9LTkuNzgzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTEuNDUyIHRtX3B0XzY9LTIuMzk0IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMDUwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS4xNzkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgfHx8IC0xMy4zNDMKLTUyIHx8fCBsYWJvciBlY29ub21pY3MgfHx8IGxtXzA9LTcuMjQ2IGxtXzE9LTkuNzgzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTEuMjMxIHRtX3B0XzY9LTEuNjgyIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0wLjM4OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuMTU4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IHx8fCAtMTUuNjk4Ci01MiB8fHwgbGFib3VyIGVjb25vbXkgfHx8IGxtXzA9LTYuOTk0IGxtXzE9LTkuNzgzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTEuNDk2IHRtX3B0XzY9LTIuNzI1IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0wLjY3MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuMzY4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IHx8fCAtMTYuMjk0Ci01MiB8fHwgdGhlIGVjb25vbWljcyB8fHwgbG1fMD0tNS40ODcgbG1fMT0tOS43ODMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tOC4wMTMgdG1fcHRfNj0tMi42MzcgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4wNTAgdG1fcHRfMTA9LTYuOTQ3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi44NjMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgfHx8IC0xNy40OTAKLTUyIHx8fCB0aGUgZWNvbm9teSB8fHwgbG1fMD0tNS4zNzIgbG1fMT0tOS43ODMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tOC4yMzUgdG1fcHRfNj0tMy4zNDkgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4wNTAgdG1fcHRfMTA9LTcuMTE3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy42MjAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgfHx8IC0xNy45NDUKLTUzIHx8fCBicml0YWluIGF0IHRoZSBtYWluIGFuZCBoaXMgZWNvbm9taWMgcG93ZXIgd2FzIC4gfHx8IGxtXzA9LTIzLjM1NSBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjEuNjAxIHRtX3B0XzY9LTguMzkxIHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0xLjczOCB0bV9wdF8xMD0tMTguNjg5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4zODkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIHx8fCAtNjguOTU1Ci01MyB8fHwgYnJpdGFpbiBhdCB0aGUgbWFpbiBhbmQgd2hvIHdhcyBlY29ub21pY2FsIHBvd2VyIC4gfHx8IGxtXzA9LTIyLjQwNCBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjEuMTEwIHRtX3B0XzY9LTkuOTU5IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjEwNiB0bV9wdF8xMD0tMTkuMTc2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4yNDkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIHx8fCAtNjkuMzcyCi01MyB8fHwgYnJpdGFpbiBhdCB0aGUgbWFpbiBhbmQgaGlzIGVjb25vbWljIHBvd2VycyB3YXMgLiB8fHwgbG1fMD0tMjMuMzg3IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMS43NjkgdG1fcHRfNj0tMTAuMDU0IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0xLjczOCB0bV9wdF8xMD0tMTguMjg0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4zODkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIHx8fCAtNjkuNDg5Ci01MyB8fHwgYnJpdGFpbiBhdCB0aGUgbWFpbiBhbmQgd2hvIHdhcyBlY29ub21pYyBwb3dlciAuIHx8fCBsbV8wPS0yMi43MjEgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTIxLjEyOSB0bV9wdF82PS05LjA4NCB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4xMDYgdG1fcHRfMTA9LTE5LjU4MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuMjQ5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiB8fHwgLTY5LjU3NQotNTMgfHx8IGJyaXRhaW4gYXQgdGhlIG1haW4gYW5kIGhpcyBlY29ub21pY2FsIHBvd2VyIHdhcyAuIHx8fCBsbV8wPS0yMy43NzQgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIxLjU4MiB0bV9wdF82PS05LjI2NSB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMS43MzggdG1fcHRfMTA9LTE4LjI4NCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuMzg5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS01LjIxMiB8fHwgLTY5LjY2MwotNTMgfHx8IGJyaXRhaW4gYXQgdGhlIG1haW4gZWNvbm9taWMgcG93ZXIgYW5kIHdobyB3YXMgLiB8fHwgbG1fMD0tMjEuNjg4IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMS4xMjkgdG1fcHRfNj0tOS4wODQgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTIuMzcwIHRtX3B0XzEwPS0xNi4yMTcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjEwNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgfHx8IC02OS43NDQKLTUzIHx8fCBicml0YWluIGF0IHRoZSBtYWluIGFuZCB3aG8gd2FzIGVjb25vbWljIHBvd2VycyAuIHx8fCBsbV8wPS0yMi41NjkgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTIxLjI5NyB0bV9wdF82PS0xMC43NDcgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMTA2IHRtX3B0XzEwPS0xOS4xNzYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjI0OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgfHx8IC02OS44ODEKLTUzIHx8fCBicml0YWluIGF0IHRoZSBtYWluIGFuZCBoaXMgd2FzIGVjb25vbWljYWwgcG93ZXIgLiB8fHwgbG1fMD0tMjIuNjExIGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMS41ODIgdG1fcHRfNj0tOS4yNjUgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMTA2IHRtX3B0XzEwPS0yMS4zOTEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjI0OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgfHx8IC03MC4wNTYKLTUzIHx8fCBicml0YWluIGF0IHRoZSBtYWluIGFuZCBoaXMgd2FzIGVjb25vbWljIHBvd2VyIC4gfHx8IGxtXzA9LTIyLjkyOSBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjEuNjAxIHRtX3B0XzY9LTguMzkxIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjEwNiB0bV9wdF8xMD0tMjEuNzk3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4yNDkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIHx8fCAtNzAuMjU5Ci01NCB8fHwgbW92ZW1lbnQgYWdhaW5zdCB0aGUgbWlsaXRhcnkgcnVsZSBhbmQgcGFraXN0YW4g4KaX4KeL4Ka34KeN4Kag4KeA4KaX4KakIHdhcyBhZ2FpbnN0IHByb3Rlc3QgYW5kIGJlbmdhbGlzIGluZGVwZW5kZW5jZSBtb3ZlbWVudCAsIOCmp+CmvuCmrOCmv+CmpCB0byBmb3IgaGUgd2lkZWx5IHByYWlzZWQgLiB8fHwgbG1fMD0tNjIuOTE4IGxtXzE9LTc4LjI2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTQ4Ljk5NCB0bV9wdF82PS0yMi45MDMgdG1fcHRfNz0tMTguMDAwIHRtX3B0Xzg9LTQ4LjkyNCB0bV9wdF85PS01LjEyNCB0bV9wdF8xMD0tMzAuMzc3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOC42NjQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2NS4zNDYKLTU0IHx8fCB0aGUgbWlsaXRhcnkgcnVsZSBtb3ZlbWVudCBhZ2FpbnN0IGFuZCBwYWtpc3RhbiDgppfgp4vgprfgp43gpqDgp4DgppfgpqQgd2FzIGFnYWluc3QgcHJvdGVzdCBhbmQgYmVuZ2FsaXMgaW5kZXBlbmRlbmNlIG1vdmVtZW50ICwg4Kan4Ka+4Kas4Ka/4KakIHRvIGZvciBoZSB3aWRlbHkgcHJhaXNlZCAuIHx8fCBsbV8wPS02NC4yOTQgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNi4wMDAgdG1fcHRfNT0tNDguOTk0IHRtX3B0XzY9LTIyLjkwMyB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTUuMDc1IHRtX3B0XzEwPS0zMS4yMTUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04Ljk1MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzY1LjM2MwotNTQgfHx8IG1vdmVtZW50IGFnYWluc3QgdGhlIG1pbGl0YXJ5IHJ1bGUgYW5kIHRoZSDgppfgp4vgprfgp43gpqDgp4DgppfgpqQgd2FzIGFnYWluc3QgcHJvdGVzdCBhbmQgYmVuZ2FsaXMgaW5kZXBlbmRlbmNlIG1vdmVtZW50ICwg4Kan4Ka+4Kas4Ka/4KakIHRvIGZvciBoZSB3aWRlbHkgcHJhaXNlZCAuIHx8fCBsbV8wPS02MC44MzEgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNTMuNjE1IHRtX3B0XzY9LTIzLjY2NyB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTUuMTI0IHRtX3B0XzEwPS0zNC4yOTYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMC4yNjAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2NS40OTAKLTU0IHx8fCB0aGUgbWlsaXRhcnkgcnVsZSBtb3ZlbWVudCBhZ2FpbnN0IGFuZCB0aGUg4KaX4KeL4Ka34KeN4Kag4KeA4KaX4KakIHdhcyBhZ2FpbnN0IHByb3Rlc3QgYW5kIGJlbmdhbGlzIGluZGVwZW5kZW5jZSBtb3ZlbWVudCAsIOCmp+CmvuCmrOCmv+CmpCB0byBmb3IgaGUgd2lkZWx5IHByYWlzZWQgLiB8fHwgbG1fMD0tNjIuMjA3IGxtXzE9LTc4LjI2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTYuMDAwIHRtX3B0XzU9LTUzLjYxNSB0bV9wdF82PS0yMy42NjcgdG1fcHRfNz0tMTguMDAwIHRtX3B0Xzg9LTQ4LjkyNCB0bV9wdF85PS01LjA3NSB0bV9wdF8xMD0tMzUuMTM0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTAuNTQ4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjUuNTA3Ci01NCB8fHwgbW92ZW1lbnQgYWdhaW5zdCB0aGUgbWlsaXRhcnkgcnVsZSBhbmQgcGFraXN0YW4g4KaX4KeL4Ka34KeN4Kag4KeA4KaX4KakIHdhcyBhZ2FpbnN0IHByb3Rlc3QgYW5kIGJlbmdhbGlzIGluZGVwZW5kZW5jZSBtb3ZlbWVudCBvbiDgpqfgpr7gpqzgpr/gpqQgdG8gZm9yIGhlIHdpZGVseSBwcmFpc2VkIC4gfHx8IGxtXzA9LTYzLjc5MCBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS00Ni43MzAgdG1fcHRfNj0tMjMuMTU1IHRtX3B0Xzc9LTE4LjAwMCB0bV9wdF84PS00OC45MjQgdG1fcHRfOT0tNS4yNDEgdG1fcHRfMTA9LTI3LjgzNyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuMTc1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjUuNjk3Ci01NCB8fHwgdGhlIG1pbGl0YXJ5IHJ1bGUgbW92ZW1lbnQgYWdhaW5zdCBhbmQgcGFraXN0YW4g4KaX4KeL4Ka34KeN4Kag4KeA4KaX4KakIHdhcyBhZ2FpbnN0IHByb3Rlc3QgYW5kIGJlbmdhbGlzIGluZGVwZW5kZW5jZSBtb3ZlbWVudCBvbiDgpqfgpr7gpqzgpr/gpqQgdG8gZm9yIGhlIHdpZGVseSBwcmFpc2VkIC4gfHx8IGxtXzA9LTY1LjE2NyBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE2LjAwMCB0bV9wdF81PS00Ni43MzAgdG1fcHRfNj0tMjMuMTU1IHRtX3B0Xzc9LTE4LjAwMCB0bV9wdF84PS00OC45MjQgdG1fcHRfOT0tNS4xOTIgdG1fcHRfMTA9LTI4LjY3NSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuNDYzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjUuNzE0Ci01NCB8fHwgbW92ZW1lbnQgYWdhaW5zdCB0aGUgbWlsaXRhcnkgcnVsZSBhbmQgdGhlIOCml+Cni+Cmt+CnjeCmoOCngOCml+CmpCB3YXMgYWdhaW5zdCBwcm90ZXN0IGFuZCBiZW5nYWxpcyBpbmRlcGVuZGVuY2UgbW92ZW1lbnQgb24g4Kan4Ka+4Kas4Ka/4KakIHRvIGZvciBoZSB3aWRlbHkgcHJhaXNlZCAuIHx8fCBsbV8wPS02MS43MDMgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNTEuMzUxIHRtX3B0XzY9LTIzLjkxOCB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTUuMjQxIHRtX3B0XzEwPS0zMS43NTYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMC43NzEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2NS44NDEKLTU0IHx8fCBtb3ZlbWVudCBhZ2FpbnN0IHRoZSBtaWxpdGFyeSBydWxlIGFuZCBwYWtpc3RhbiDgppfgp4vgprfgp43gpqDgp4DgppfgpqQgd2FzIHByb3Rlc3QgYWdhaW5zdCBhbmQgYmVuZ2FsaXMgaW5kZXBlbmRlbmNlIG1vdmVtZW50ICwg4Kan4Ka+4Kas4Ka/4KakIHRvIGZvciBoZSB3aWRlbHkgcHJhaXNlZCAuIHx8fCBsbV8wPS02MS43MjUgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE5LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNDguOTk0IHRtX3B0XzY9LTIyLjkwMyB0bV9wdF83PS0xOS4wMDAgdG1fcHRfOD0tNTEuNjQyIHRtX3B0Xzk9LTUuMTI0IHRtX3B0XzEwPS0zMi4wMzEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjgwNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzY1Ljg1OAotNTQgfHx8IG1vdmVtZW50IGFnYWluc3QgdGhlIG1pbGl0YXJ5IHJ1bGUgYW5kIHBha2lzdGFuIOCml+Cni+Cmt+CnjeCmoOCngOCml+CmpCB3YXMgYWdhaW5zdCBwcm90ZXN0IGFuZCBiZW5nYWxpcyBpbmRlcGVuZGVuY2UgbW92ZW1lbnQgLCDgpqfgpr7gpqzgpr/gpqQgZm9yIHRoZSBoZSB3aWRlbHkgcHJhaXNlZCAuIHx8fCBsbV8wPS02MS4zMDQgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNC4wMDAgdG1fcHRfNT0tNTEuMTMwIHRtX3B0XzY9LTIzLjU3NSB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTUuMTI0IHRtX3B0XzEwPS0zMi43MDMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjU0OCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzY1Ljg2OAotNTQgfHx8IHRoZSBtaWxpdGFyeSBydWxlIG1vdmVtZW50IGFnYWluc3QgYW5kIHBha2lzdGFuIOCml+Cni+Cmt+CnjeCmoOCngOCml+CmpCB3YXMgcHJvdGVzdCBhZ2FpbnN0IGFuZCBiZW5nYWxpcyBpbmRlcGVuZGVuY2UgbW92ZW1lbnQgLCDgpqfgpr7gpqzgpr/gpqQgdG8gZm9yIGhlIHdpZGVseSBwcmFpc2VkIC4gfHx8IGxtXzA9LTYzLjEwMSBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE2LjAwMCB0bV9wdF81PS00OC45OTQgdG1fcHRfNj0tMjIuOTAzIHRtX3B0Xzc9LTE5LjAwMCB0bV9wdF84PS01MS42NDIgdG1fcHRfOT0tNS4wNzUgdG1fcHRfMTA9LTMyLjg2OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEwLjA5MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzY1Ljg3NQotNTUgfHx8IGhlcmUgaXMgbWVudGlvbmVkIHRoYXQgd2VyZSBpbnRlcm5ldCBhbmQgd29ybGQgd2lkZSB3ZWIgb3RoZXIgbmFtZSB3b3JkIHRvIGJlIGJ1dCBhY3R1YWxseSDgprbgpqzgp43gpqbgpqbgp43gpqzgpq/gprwgZGlmZmVyZW50IHN1YmplY3QgdG8gLiB8fHwgbG1fMD0tNTUuMzY2IGxtXzE9LTc1LjAwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTc1LjQ2MiB0bV9wdF82PS0zNi4xMzIgdG1fcHRfNz0tMTguMDAwIHRtX3B0Xzg9LTQ4LjkyNCB0bV9wdF85PS02LjQzMSB0bV9wdF8xMD0tNTAuMDI0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOS40NjggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI3MC4xNjIKLTU1IHx8fCBoZXJlIGlzIG1lbnRpb25lZCB0aGF0IHdlcmUgaW50ZXJuZXQgYW5kIHdvcmxkIHdpZGUgd2ViIG90aGVyIG5hbWUgdG8gYmUgd29yZCBidXQgYWN0dWFsbHkg4Ka24Kas4KeN4Kam4Kam4KeN4Kas4Kav4Ka8IGRpZmZlcmVudCBzdWJqZWN0IHRvIC4gfHx8IGxtXzA9LTU1LjQ5MiBsbV8xPS03NS4wMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE0LjAwMCB0bV9wdF81PS03NS40NjIgdG1fcHRfNj0tMzYuMTMyIHRtX3B0Xzc9LTE4LjAwMCB0bV9wdF84PS00OC45MjQgdG1fcHRfOT0tNi40MzEgdG1fcHRfMTA9LTQ4LjU1OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuNDY4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNzAuOTAyCi01NSB8fHwgaGVyZSBpcyBtZW50aW9uZWQgdGhhdCB3ZXJlIGludGVybmV0IGFuZCB3b3JsZCB3aWRlIHdlYiBvdGhlciBuYW1lIHdvcmQgdG8gYmUgdGhvdWdoIGFjdHVhbGx5IOCmtuCmrOCnjeCmpuCmpuCnjeCmrOCmr+CmvCBkaWZmZXJlbnQgc3ViamVjdCB0byAuIHx8fCBsbV8wPS01Ni45MTkgbG1fMT0tNzUuMDA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNzQuMjU1IHRtX3B0XzY9LTM1Ljg0NCB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTYuMzE0IHRtX3B0XzEwPS00OC4wNTcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04Ljk1NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjcwLjk2OAotNTUgfHx8IGhlcmUgaXMgbWVudGlvbmVkIHRoYXQgd2VyZSBpbnRlcm5ldCBhbmQgb3RoZXIgbmFtZSBvZiB3b3JsZCB3aWRlIHdlYiB3b3JkIHRvIGJlIGJ1dCBhY3R1YWxseSDgprbgpqzgp43gpqbgpqbgp43gpqzgpq/gprwgZGlmZmVyZW50IHN1YmplY3QgdG8gLiB8fHwgbG1fMD0tNTMuNTY2IGxtXzE9LTc4LjI2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTQuMDAwIHRtX3B0XzU9LTc2LjA4NCB0bV9wdF82PS0zNi4xMzIgdG1fcHRfNz0tMTguMDAwIHRtX3B0Xzg9LTQ4LjkyNCB0bV9wdF85PS02LjQzMSB0bV9wdF8xMD0tNDguNjM4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOS40NjggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMi4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0xLjAwMCB0bV9nbHVlXzA9MTUuMDAwIFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI3MC45OTUKLTU1IHx8fCBoZXJlIGlzIG1lbnRpb25lZCB0aGF0IHdlcmUgaW50ZXJuZXQgYW5kIHdvcmxkIHdpZGUgd2ViIG90aGVyIG5hbWUgd29yZCB0byBiZSBidXQgYWN0dWFsbHkg4Ka24Kas4KeN4Kam4Kam4KeN4Kas4Kav4Ka8IGRpZmZlcmVudCBzdWJqZWN0IGEgLiB8fHwgbG1fMD0tNTUuODczIGxtXzE9LTc1LjAwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTc1LjEwMiB0bV9wdF82PS0zNS45OTggdG1fcHRfNz0tMTguMDAwIHRtX3B0Xzg9LTQ4LjkyNCB0bV9wdF85PS02LjY2NCB0bV9wdF8xMD0tNTAuNzg1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOS44NzMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI3MS4yMDcKLTU1IHx8fCBoZXJlIGlzIG1lbnRpb25lZCB0aGF0IHdlcmUgaW50ZXJuZXQgYW5kIHdvcmxkIHdpZGUgd2ViIG90aGVyIG5hbWUgd29yZCB0byBiZSBidXQgYWN0dWFsbHkg4Ka24Kas4KeN4Kam4Kam4KeN4Kas4Kav4Ka8IGRpZmZlcmVudCBzdWJqZWN0IGluZGljYXRlcyAuIHx8fCBsbV8wPS01Ny45NzIgbG1fMT0tNzUuMDA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNzAuMDA4IHRtX3B0XzY9LTM2LjI4NiB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTYuNjY0IHRtX3B0XzEwPS00NC41MzAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05Ljg3MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjcxLjMwNAotNTUgfHx8IGhlcmUgaXMgbWVudGlvbmVkIHRoYXQgd2VyZSBpbnRlcm5ldCBhbmQgd29ybGQgd2lkZSB3ZWIgb3RoZXIgbmFtZSB3b3JkIHRvIGJlIGJ1dCBhY3R1YWxseSDgprbgpqzgp43gpqbgpqbgp43gpqzgpq/gprwgZGlmZmVyZW50IHN1YmplY3QgdG8gdGhlIC4gfHx8IGxtXzA9LTU2LjUzNSBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE3LjAwMCB0bV9wdF81PS03OC42NzAgdG1fcHRfNj0tMzQuMzQ2IHRtX3B0Xzc9LTE5LjAwMCB0bV9wdF84PS01MS42NDIgdG1fcHRfOT0tNi40MzEgdG1fcHRfMTA9LTQ2LjE1MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuNjQwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNzEuNDQ0Ci01NSB8fHwgaGVyZSBpcyBtZW50aW9uZWQgdGhhdCB3ZXJlIGludGVybmV0IGFuZCB3b3JsZCB3aWRlIHdlYiBvdGhlciBuYW1lIHdvcmQgdG8gYmUgYnV0IGFjdHVhbGx5IOCmtuCmrOCnjeCmpuCmpuCnjeCmrOCmr+CmvCBkaWZmZXJlbnQgc3ViamVjdHMgdG8gLiB8fHwgbG1fMD0tNTUuNTU0IGxtXzE9LTc1LjAwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTQuMDAwIHRtX3B0XzU9LTc1LjAwMiB0bV9wdF82PS0zNy44MzcgdG1fcHRfNz0tMTguMDAwIHRtX3B0Xzg9LTQ4LjkyNCB0bV9wdF85PS02LjQzMiB0bV9wdF8xMD0tNDcuMzIyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTAuNDMyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNzEuNDk0Ci01NSB8fHwgaGVyZSBpcyBtZW50aW9uZWQgdGhhdCBtYW55IGludGVybmV0IGFuZCB3b3JsZCB3aWRlIHdlYiBvdGhlciBuYW1lIHdvcmQgdG8gYmUgYnV0IGFjdHVhbGx5IOCmtuCmrOCnjeCmpuCmpuCnjeCmrOCmr+CmvCBkaWZmZXJlbnQgc3ViamVjdCB0byAuIHx8fCBsbV8wPS01Ni4zMDUgbG1fMT0tNzUuMDA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNzQuOTcxIHRtX3B0XzY9LTM2LjEzMiB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTYuNDMxIHRtX3B0XzEwPS01MS4xMTQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjQ2OCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjcxLjUxMgotNTUgfHx8IGhlcmUgaXMgbWVudGlvbmVkIHRoYXQgd2VyZSBpbnRlcm5ldCBhbmQgd29ybGQgd2lkZSB3ZWIgb3RoZXIgbmFtZSB3b3JkIHRvIGJlIHRob3VnaCBhY3R1YWxseSDgprbgpqzgp43gpqbgpqbgp43gpqzgpq/gprwgZGlmZmVyZW50IHN1YmplY3QgYSAuIHx8fCBsbV8wPS01Ny40MjcgbG1fMT0tNzUuMDA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNzMuODk1IHRtX3B0XzY9LTM1LjcxMSB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTYuNTQ3IHRtX3B0XzEwPS00OC44MTkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjM2MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjcyLjAxMwotNTYgfHx8IC4geiByZWxhdGVkIHBvbGFyIGNvLW9yZGluYXRlIHR3byBhcmUgciA9IC4gfHx8IGxtXzA9LTI5Ljc4NCBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMjUuNTQ1IHRtX3B0XzY9LTEyLjEyOCB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMy40MTggdG1fcHRfMTA9LTE2LjQ4NiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTAuMTI4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiB8fHwgLTc3LjM0MgotNTYgfHx8IC4geiByZWxhdGVkIHBvbGFyIGNvLW9yZGluYXRlIHR3byBpcyByID0gLiB8fHwgbG1fMD0tMjkuNjk5IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yNS42MDIgdG1fcHRfNj0tMTEuMzYxIHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjA1MCB0bV9wdF8xMD0tMTkuNTI0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMC41MzUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIHx8fCAtNzcuODA2Ci01NyB8fHwgbm92ZW1iZXIgfHx8IGxtXzA9LTMuMDcxIGxtXzE9LTYuNTIyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTAuMDQxIHRtX3B0XzY9LTAuMDU3IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMC4wMDggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgfHx8IC02Ljk0OQotNTcgfHx8IG5vdmVtYmVyIC4gfHx8IGxtXzA9LTUuMjQyIGxtXzE9LTkuNzgzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTkuODQwIHRtX3B0XzY9LTAuNzQyIHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC43NzkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgfHx8IC0xNi4zNTQKLTU3IHx8fCDgpqjgpq3gp4fgpq7gp43gpqzgprAgfHx8IGxtXzA9LTcuMzU1IGxtXzE9LTYuNTIyIHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0wLjAwMCB0bV9wdF81PTAuMDAwIHRtX3B0XzY9MC4wMDAgdG1fcHRfNz0wLjAwMCB0bV9wdF84PTAuMDAwIHRtX3B0Xzk9MC4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9MC4wMDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9MC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTExLjM1OAotNTggfHx8IDE5NzIg4KaW4KeN4Kaw4KeA4Ka44KeN4Kaf4Ka+4Kas4KeN4Kam4KeHIHRoZW4g4KaG4Kaw4Kaq4Ka+4Kao4KeH4Kaf4KeHIGZpcnN0IOCmh+CmsuCnh+CmleCnjeCmn+CnjeCmsOCmqOCmv+CmlSBtYWlsIHRvIHRvIC4gfHx8IGxtXzA9LTM4LjQzMCBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTguNjI5IHRtX3B0XzY9LTguNzY1IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0wLjM2OSB0bV9wdF8xMD0tMTcuMjA0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi44OTkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM4Mi4wMzAKLTU4IHx8fCAxOTcyIOCmluCnjeCmsOCngOCmuOCnjeCmn+CmvuCmrOCnjeCmpuCnhyAiIOCmhuCmsOCmquCmvuCmqOCnh+Cmn+CnhyBmaXJzdCDgpofgprLgp4fgppXgp43gpp/gp43gprDgpqjgpr/gppUgbWFpbCB0byB0byAuIHx8fCBsbV8wPS0zNy43MTAgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIxLjM1MyB0bV9wdF82PS05LjQ1OCB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMS4zNjggdG1fcHRfMTA9LTIwLjcxNSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMzkxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzgyLjgzNwotNTggfHx8IDE5NzIg4KaW4KeN4Kaw4KeA4Ka44KeN4Kaf4Ka+4Kas4KeN4Kam4KeHIHRoZW4g4KaG4Kaw4Kaq4Ka+4Kao4KeH4Kaf4KeHIGZpcnN0IOCmh+CmsuCnh+CmleCnjeCmn+CnjeCmsOCmqOCmv+CmlSBtYWlsIHRvIHVzZWQgLiB8fHwgbG1fMD0tMzguNjQzIGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNy4zNTAgdG1fcHRfNj0tMTAuMTgwIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjM2OSB0bV9wdF8xMD0tMTUuNjg1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4xNTggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM4My4yMTQKLTU4IHx8fCAxOTcyIOCmluCnjeCmsOCngOCmuOCnjeCmn+CmvuCmrOCnjeCmpuCnhyB0aGVuIOCmhuCmsOCmquCmvuCmqOCnh+Cmn+CnhyBmaXJzdCDgpofgprLgp4fgppXgp43gpp/gp43gprDgpqjgpr/gppUgdG8gbWFpbCB0byAuIHx8fCBsbV8wPS0zNy45MzYgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE4LjYyOSB0bV9wdF82PS04Ljc2NSB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMC43MzYgdG1fcHRfMTA9LTE3Ljg3MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuNDAzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zODMuMzkxCi01OCB8fHwg4KaW4KeN4Kaw4KeA4Ka44KeN4Kaf4Ka+4Kas4KeN4Kam4KeHIDE5NzIgdGhlbiDgpobgprDgpqrgpr7gpqjgp4fgpp/gp4cgZmlyc3Qg4KaH4Kay4KeH4KaV4KeN4Kaf4KeN4Kaw4Kao4Ka/4KaVIG1haWwgdG8gdG8gLiB8fHwgbG1fMD0tMzguNDMwIGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xOC42MjkgdG1fcHRfNj0tOC43NjUgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTAuMzg3IHRtX3B0XzEwPS0xOC4wODAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjUxMiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzgzLjQ1MwotNTggfHx8IDE5NzIg4KaW4KeN4Kaw4KeA4Ka44KeN4Kaf4Ka+4Kas4KeN4Kam4KeHIHRoZW4g4KaG4Kaw4Kaq4Ka+4Kao4KeH4Kaf4KeHIGZpcnN0IOCmh+CmsuCnh+CmleCnjeCmn+CnjeCmsOCmqOCmv+CmlSBtYWlsIHRvIGFycmVzdGVkIC4gfHx8IGxtXzA9LTM5LjYyNSBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTYuODMwIHRtX3B0XzY9LTEyLjQ5MCB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC43MzYgdG1fcHRfMTA9LTEzLjAwMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuNDY1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zODMuNjYwCi01OCB8fHwgMTk3MiDgppbgp43gprDgp4Dgprjgp43gpp/gpr7gpqzgp43gpqbgp4cgZmlyc3Qg4KaH4Kay4KeH4KaV4KeN4Kaf4KeN4Kaw4Kao4Ka/4KaVIHRoZW4g4KaG4Kaw4Kaq4Ka+4Kao4KeH4Kaf4KeHIG1haWwgdG8gdG8gLiB8fHwgbG1fMD0tMzguNDMwIGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xOC42MjkgdG1fcHRfNj0tOC43NjUgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTEuMDAxIHRtX3B0XzEwPS0xNC4wMjIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjg5OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzgzLjY4OAotNTggfHx8IDE5NzIg4KaW4KeN4Kaw4KeA4Ka44KeN4Kaf4Ka+4Kas4KeN4Kam4KeHIHRoZW4gZmlyc3Qg4KaH4Kay4KeH4KaV4KeN4Kaf4KeN4Kaw4Kao4Ka/4KaVIOCmhuCmsOCmquCmvuCmqOCnh+Cmn+CnhyBtYWlsIHRvIHRvIC4gfHx8IGxtXzA9LTM4LjQzMCBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTguNjI5IHRtX3B0XzY9LTguNzY1IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0xLjAwMSB0bV9wdF8xMD0tMTQuMDIyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi44OTkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM4My42ODgKLTU5IHx8fCDgppzgp4Dgpqwgc2NpZW5jZSB0aGF0IOCmtuCmvuCmluCmvuCmr+CmvCBmdW5naSBhbmQgdGhlIHByYWN0aWNhbCBzdWJqZWN0IHRvIGhlIGRpc2N1c3NlZCDgppvgpqTgp43gprDgpr7gppXgpqzgpr/gpqbgp43gpq/gpr4gLWxyYi0gbXljb2xvZ3kgLXJyYi0gfHx8IGxtXzA9LTU2LjI1OSBsbV8xPS01NS40MzkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTIyLjI4NyB0bV9wdF82PS0yMS40NzEgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjI3NCB0bV9wdF8xMD0tMTguMzcwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi41NTAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTI1LjEzNgotNTkgfHx8IOCmnOCngOCmrCBzY2llbmNlIHRoYXQg4Ka24Ka+4KaW4Ka+4Kav4Ka8IGZ1bmdpIGFuZCBpdHMgcHJhY3RpY2FsIHN1YmplY3QgdG8gaGUgZGlzY3Vzc2VkIOCmm+CmpOCnjeCmsOCmvuCmleCmrOCmv+CmpuCnjeCmr+CmviAtbHJiLSBteWNvbG9neSAtcnJiLSB8fHwgbG1fMD0tNTYuODg0IGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTE5LjQzNyB0bV9wdF82PS0yMi40NDEgdG1fcHRfNz0tMTIuMDAwIHRtX3B0Xzg9LTMyLjYxNiB0bV9wdF85PS0xLjEzOSB0bV9wdF8xMD0tMTYuMjgzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy41NjkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTI1LjU5NQotNTkgfHx8IOCmnOCngOCmrCBzY2llbmNlIHRoYXQg4Ka24Ka+4KaW4Ka+4Kav4Ka8IGZ1bmdpIGFuZCB0aGUgcHJhY3RpY2FsIHN1YmplY3QgdG8gZGlzY3Vzc2VkIGhlIOCmm+CmpOCnjeCmsOCmvuCmleCmrOCmv+CmpuCnjeCmr+CmviAtbHJiLSBteWNvbG9neSAtcnJiLSB8fHwgbG1fMD0tNTcuNTAzIGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTIyLjI4NyB0bV9wdF82PS0yMS40NzEgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjI3MyB0bV9wdF8xMD0tMTguOTQ1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4zMjcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTI1Ljc4MQotNTkgfHx8IOCmnOCngOCmrCBzY2llbmNlIHRoYXQg4Ka24Ka+4KaW4Ka+4Kav4Ka8IGZ1bmdpIGFuZCB0aGUgcHJhY3RpY2FsIHN1YmplY3QgYWJvdXQgdG8gaGUg4Kab4Kak4KeN4Kaw4Ka+4KaV4Kas4Ka/4Kam4KeN4Kav4Ka+IC1scmItIG15Y29sb2d5IC1ycmItIHx8fCBsbV8wPS01Ni44MzkgbG1fMT0tNTUuNDM5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMjMuOTI1IHRtX3B0XzY9LTIxLjk1NiB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTEuMjczIHRtX3B0XzEwPS0yMy4yMjEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjI0NCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MjUuOTA4Ci01OSB8fHwg4Kac4KeA4KasIHNjaWVuY2UgdGhhdCDgprbgpr7gppbgpr7gpq/gprwgZnVuZ3VzIGFuZCB0aGUgcHJhY3RpY2FsIHN1YmplY3QgdG8gaGUgZGlzY3Vzc2VkIOCmm+CmpOCnjeCmsOCmvuCmleCmrOCmv+CmpuCnjeCmr+CmviAtbHJiLSBteWNvbG9neSAtcnJiLSB8fHwgbG1fMD0tNTYuMjUyIGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMjIuODkzIHRtX3B0XzY9LTIyLjI0NCB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTEuNDA5IHRtX3B0XzEwPS0xOC4zNzAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03Ljg1MCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MjYuMDc5Ci01OSB8fHwg4Kac4KeA4KasIHNjaWVuY2UgdGhhdCDgprbgpr7gppbgpr7gpq/gprwgZnVuZ2kgYW5kIHRoZSBwcmFjdGljYWwgc3ViamVjdCB0byBkaXNjdXNzZWQgd2FzIOCmm+CmpOCnjeCmsOCmvuCmleCmrOCmv+CmpuCnjeCmr+CmviAtbHJiLSBteWNvbG9neSAtcnJiLSB8fHwgbG1fMD0tNTYuNTE2IGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTIzLjMxNiB0bV9wdF82PS0yMS42OTIgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjY0MSB0bV9wdF8xMD0tMjAuODczIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOC4wMzIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTI2LjIzNwotNTkgfHx8IOCmnOCngOCmrCBzY2llbmNlIHRoYXQg4Ka24Ka+4KaW4Ka+4Kav4Ka8IGZ1bmdpIGFuZCBpdHMgcHJhY3RpY2FsIHN1YmplY3QgdG8gZGlzY3Vzc2VkIGhlIOCmm+CmpOCnjeCmsOCmvuCmleCmrOCmv+CmpuCnjeCmr+CmviAtbHJiLSBteWNvbG9neSAtcnJiLSB8fHwgbG1fMD0tNTguMTI5IGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTE5LjQzNyB0bV9wdF82PS0yMi40NDEgdG1fcHRfNz0tMTIuMDAwIHRtX3B0Xzg9LTMyLjYxNiB0bV9wdF85PS0xLjEzOCB0bV9wdF8xMD0tMTYuODU3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4zNDYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTUuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTI2LjIzOQotNTkgfHx8IOCmnOCngOCmrCBzY2llbmNlIHRoYXQg4Ka24Ka+4KaW4Ka+4Kav4Ka8IGZ1bmdpIGFuZCB0aGUgcHJhY3RpY2FsIHN1YmplY3QgZGlzY3Vzc2VkIHRvIGhlIOCmm+CmpOCnjeCmsOCmvuCmleCmrOCmv+CmpuCnjeCmr+CmviAtbHJiLSBteWNvbG9neSAtcnJiLSB8fHwgbG1fMD0tNTguMTU2IGxtXzE9LTU1LjQzOSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTIyLjI4NyB0bV9wdF82PS0yMS40NzEgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjI3MyB0bV9wdF8xMD0tMjAuNTU0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4yNDQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTUuMDAwIFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTI2LjM2NQotNjAgfHx8IHdhdGVyIHJpdmVyIGZyb20g4KaJ4Kag4Ka+4Kao4KeLIHdhcyBzb21lIGEg4Kam4Ka/4Kav4Ka84KeHLSDgpqbgpqHgprzgpr8gYW5kIOCmrOCmvuCmsuCmn+Cmv+CmsCB0aHJvdWdoIHdhdGVyIHVzZWQgYnkgYW5pbWFsIHdvcmxkIGEgc3lzdGVtIC4gfHx8IGxtXzA9LTYyLjI1NSBsbV8xPS02OC40ODQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS00NC44ODAgdG1fcHRfNj0tMTcuNjM3IHRtX3B0Xzc9LTE2LjAwMCB0bV9wdF84PS00My40ODggdG1fcHRfOT0tNC4wNTkgdG1fcHRfMTA9LTM2LjMzNiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguMjYxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU1Mi41MTIKLTYwIHx8fCB3YXRlciByaXZlciBmcm9tIOCmieCmoOCmvuCmqOCniyB3YXMgc29tZSBhIOCmpuCmv+Cmr+CmvOCnhy0g4Kam4Kah4Ka84Ka/IGFuZCDgpqzgpr7gprLgpp/gpr/gprAgdGhyb3VnaCB3YXRlciB1c2VkIGJ5IGFuaW1hbCB3b3JsZCBhIG1ldGhvZCAuIHx8fCBsbV8wPS02My42MjQgbG1fMT0tNjguNDg0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE2LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNDIuNDcwIHRtX3B0XzY9LTE3LjQ3MCB0bV9wdF83PS0xNi4wMDAgdG1fcHRfOD0tNDMuNDg4IHRtX3B0Xzk9LTQuMDUzIHRtX3B0XzEwPS0zMy4zMjYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03Ljk3MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgV29yZFBlbmFsdHk9LTkuNTU0IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NTIuODAwCi02MCB8fHwgd2F0ZXIgcml2ZXIgZnJvbSDgpongpqDgpr7gpqjgp4sgd2FzIHNvbWUgcHVycyDgpqbgpr/gpq/gprzgp4ctIOCmpuCmoeCmvOCmvyBhbmQg4Kas4Ka+4Kay4Kaf4Ka/4KawIHRocm91Z2ggd2F0ZXIgdXNlZCBieSBhbmltYWwgd29ybGQgYSBzeXN0ZW0gLiB8fHwgbG1fMD0tNjQuNDQ3IGxtXzE9LTY4LjQ4NCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTQwLjIzMyB0bV9wdF82PS0xOS4wMjMgdG1fcHRfNz0tMTYuMDAwIHRtX3B0Xzg9LTQzLjQ4OCB0bV9wdF85PS00LjA1OSB0bV9wdF8xMD0tMjguOTgyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOC4yNjEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTguMDAwIFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTUyLjkwMgotNjAgfHx8IHdhdGVyIHJpdmVyIGZyb20g4KaJ4Kag4Ka+4Kao4KeLIHdhcyBzb21lIGEg4Kam4Ka/4Kav4Ka84KeHLSDgpqbgpqHgprzgpr8gYW5kIOCmrOCmvuCmsuCmn+Cmv+CmsCB0aHJvdWdoIHdhdGVyIHVzZWQgYnkgYW5pbWFsIHdvcmxkIGEgcHJvY2VzcyAuIHx8fCBsbV8wPS02Mi45ODggbG1fMT0tNjguNDg0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE2LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNDMuNTI4IHRtX3B0XzY9LTE3LjczMiB0bV9wdF83PS0xNi4wMDAgdG1fcHRfOD0tNDMuNDg4IHRtX3B0Xzk9LTQuMDcxIHRtX3B0XzEwPS0zNS4yMTggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04LjQ0MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgV29yZFBlbmFsdHk9LTkuNTU0IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NTIuOTc3Ci02MCB8fHwgd2F0ZXIgcml2ZXIgZnJvbSDgpongpqDgpr7gpqjgp4sgd2FzIHNvbWUgcHVycyDgpqbgpr/gpq/gprzgp4ctIOCmpuCmoeCmvOCmvyBhbmQg4Kas4Ka+4Kay4Kaf4Ka/4KawIHRocm91Z2ggd2F0ZXIgdXNlZCBieSBhbmltYWwgd29ybGQgYSBtZXRob2QgLiB8fHwgbG1fMD0tNjUuODE2IGxtXzE9LTY4LjQ4NCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTM3LjgyNCB0bV9wdF82PS0xOC44NTYgdG1fcHRfNz0tMTYuMDAwIHRtX3B0Xzg9LTQzLjQ4OCB0bV9wdF85PS00LjA1MyB0bV9wdF8xMD0tMjUuOTcyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy45NzMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTguMDAwIFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTUzLjE4OQotNjAgfHx8IHdhdGVyIHJpdmVyIGZyb20g4KaJ4Kag4Ka+4Kao4KeLIHdhcyBzb21lIHB1cnMg4Kam4Ka/4Kav4Ka84KeHLSDgpqbgpqHgprzgpr8gYW5kIOCmrOCmvuCmsuCmn+Cmv+CmsCB0aHJvdWdoIHdhdGVyIHVzZWQgYnkgYW5pbWFsIHdvcmxkIGEgcHJvY2VzcyAuIHx8fCBsbV8wPS02NS4xODAgbG1fMT0tNjguNDg0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE2LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tMzguODgyIHRtX3B0XzY9LTE5LjExOCB0bV9wdF83PS0xNi4wMDAgdG1fcHRfOD0tNDMuNDg4IHRtX3B0Xzk9LTQuMDcxIHRtX3B0XzEwPS0yNy44NjMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04LjQ0MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgV29yZFBlbmFsdHk9LTkuNTU0IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NTMuMzY3Ci02MCB8fHwgd2F0ZXIgcml2ZXIgZnJvbSDgpongpqDgpr7gpqjgp4sgd2FzIHNvbWUgYSDgpqbgpr/gpq/gprzgp4ctIOCmpuCmoeCmvOCmvyBhbmQg4Kas4Ka+4Kay4Kaf4Ka/4KawIHRocm91Z2ggd2F0ZXIgdXNlZCBieSBhbmltYWwgd29ybGQgYSBtZXRob2RzIC4gfHx8IGxtXzA9LTY0LjA0NSBsbV8xPS02OC40ODQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS00MS44MzAgdG1fcHRfNj0tMTcuNjM3IHRtX3B0Xzc9LTE2LjAwMCB0bV9wdF84PS00My40ODggdG1fcHRfOT0tNC4wNzEgdG1fcHRfMTA9LTMzLjM1NCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguNDQzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU1My40NDQKLTYxIHx8fCBpbmNsdWRlIHRyaWJhbCBkYW5jZSBsb2t1aiBkYW5jZSBjbGFzc2ljYWwgZGFuY2UgZXRjIC4gfHx8IGxtXzA9LTMxLjAzMSBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMTEuNjExIHRtX3B0XzY9LTIxLjE4NyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMy4wMDAgdG1fcHRfMTA9LTUuMzI3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy42OTEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgfHx8IC03NC4yNzMKLTYxIHx8fCBhbW9uZyB0aGVtIGFyZSB0cmliYWwgZGFuY2UgbG9rdWogZGFuY2UgY2xhc3NpY2FsIGRhbmNlIGV0YyAuIHx8fCBsbV8wPS0zMS4wMDUgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE1LjQwNiB0bV9wdF82PS0xMy4zMTkgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0zLjUzNSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuOTk4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS01LjY0NiB8fHwgLTc1LjI1MwotNjEgfHx8IGFtb25nIHRoZXNlIGFyZSB0cmliYWwgZGFuY2UgbG9rdWogZGFuY2UgY2xhc3NpY2FsIGRhbmNlIGV0YyAuIHx8fCBsbV8wPS0zMS40MjMgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE2LjM0OCB0bV9wdF82PS0xMy4zNTEgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0zLjUzNSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuOTk4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS01LjY0NiB8fHwgLTc1Ljk2MgotNjEgfHx8IGFtb25nIHRoZXNlIHRoZXJlIHRyaWJhbCBkYW5jZSBsb2t1aiBkYW5jZSBjbGFzc2ljYWwgZGFuY2UgZXRjIC4gfHx8IGxtXzA9LTMxLjIzNSBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMTUuMDYxIHRtX3B0XzY9LTEzLjE3MiB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMi4wMDEgdG1fcHRfMTA9LTYuMzE1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC44NzUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IHx8fCAtNzYuNjk1Ci02MiB8fHwgdGhlIG9sZGVzdCBsaXRlcmF0dXJlIGZpcnN0IOCmruCnjOCmluCmv+CmleCmreCmvuCmrOCnhyBhbmQgbGF0ZXIgd3JpdHRlbiBmb3JtIGlzIC4gfHx8IGxtXzA9LTI5LjcwMiBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjEuMjkwIHRtX3B0XzY9LTEzLjQ0NiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4xNDMgdG1fcHRfMTA9LTIwLjg0NSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuMTQzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgwLjM5NwotNjIgfHx8IHRoZSBvbGRlc3QgbGl0ZXJhdHVyZSBmaXJzdCDgpq7gp4zgppbgpr/gppXgpq3gpr7gpqzgp4cgYW5kIGxhdGVyIHdyaXR0ZW4gaW4gdGhlIC4gfHx8IGxtXzA9LTI3Ljg5NiBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjUuODQ5IHRtX3B0XzY9LTEzLjExNCB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4xNjEgdG1fcHRfMTA9LTI2LjQ5MCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNzMxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgwLjYwOAotNjIgfHx8IHRoZSBvbGRlc3QgbGl0ZXJhdHVyZSBmaXJzdCDgpq7gp4zgppbgpr/gppXgpq3gpr7gpqzgp4cgYW5kIGxhdGVyIHdyaXR0ZW4gZm9ybSB0aGUgLiB8fHwgbG1fMD0tMjkuMjkwIGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMi45MTUgdG1fcHRfNj0tMTMuNzIwIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0wLjE2MSB0bV9wdF8xMD0tMjIuNzM5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi43MzEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODEuMDA3Ci02MiB8fHwgdGhlIG9sZGVzdCBsaXRlcmF0dXJlIGZpcnN0IOCmruCnjOCmluCmv+CmleCmreCmvuCmrOCnhyBhbmQgbGF0ZXIgaXMgd3JpdHRlbiBmb3JtIC4gfHx8IGxtXzA9LTI4LjgzNyBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMjEuMjkwIHRtX3B0XzY9LTEzLjQ0NiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS4wMDcgdG1fcHRfMTA9LTE5LjI2OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMjk2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgxLjI5MwotNjIgfHx8IHRoZSBvbGRlc3QgbGl0ZXJhdHVyZSBmaXJzdCDgpq7gp4zgppbgpr/gppXgpq3gpr7gpqzgp4cgYW5kIHRoZW4gd3JpdHRlbiBpbiB0aGUgLiB8fHwgbG1fMD0tMjcuNzc0IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yOC4yNTQgdG1fcHRfNj0tMTQuODU2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0wLjE2NyB0bV9wdF8xMD0tMjYuMjgyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4xMzcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODEuNjA4Ci02MiB8fHwgdGhlIG9sZGVzdCBsaXRlcmFyeSBmaXJzdCDgpq7gp4zgppbgpr/gppXgpq3gpr7gpqzgp4cgYW5kIGxhdGVyIHdyaXR0ZW4gaW4gdGhlIC4gfHx8IGxtXzA9LTI3LjkwNiBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjUuOTk3IHRtX3B0XzY9LTE0LjM5MiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4xNjIgdG1fcHRfMTA9LTI2LjM4MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguNDgwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgxLjY3OAotNjIgfHx8IHRoZSBvbGRlc3QgbGl0ZXJhdHVyZSBmaXJzdCDgpq7gp4zgppbgpr/gppXgpq3gpr7gpqzgp4cgYW5kIGxhdGVyIHdyaXR0ZW4gZm9ybSB1c2VkIC4gfHx8IGxtXzA9LTMwLjkxMyBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjAuMDg2IHRtX3B0XzY9LTE0LjM2MiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4xNDkgdG1fcHRfMTA9LTE5LjQ4MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNTQ5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgxLjc3NAotNjIgfHx8IHRoZSBvbGRlc3QgbGl0ZXJhdHVyZSBmaXJzdCDgpq7gp4zgppbgpr/gppXgpq3gpr7gpqzgp4cgYW5kIGxhdGVyIHdyaXR0ZW4gaW4gaXMgLiB8fHwgbG1fMD0tMjkuNzc3IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yNC4yMjMgdG1fcHRfNj0tMTIuODQwIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0wLjE0MyB0bV9wdF8xMD0tMjQuNTk2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4xNDMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODEuODE3Ci02MiB8fHwgdGhlIG9sZGVzdCBsaXRlcmF0dXJlIGZpcnN0IOCmruCnjOCmluCmv+CmleCmreCmvuCmrOCnhyBhbmQgbGF0ZXIgd3JpdHRlbiBpbiB1c2VkIC4gfHx8IGxtXzA9LTI5Ljk3NSBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjMuMDIwIHRtX3B0XzY9LTEzLjc1NiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4xNDkgdG1fcHRfMTA9LTIzLjIzMyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNTQ5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgxLjk0MAotNjIgfHx8IHRoZSBvbGRlc3QgbGl0ZXJhdHVyZSBmaXJzdCDgpq7gp4zgppbgpr/gppXgpq3gpr7gpqzgp4cgYW5kIHRoZW4gd3JpdHRlbiBmb3JtIHRoZSAuIHx8fCBsbV8wPS0yOS4xNjggbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTI1LjMyMCB0bV9wdF82PS0xNS40NjIgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTAuMTY3IHRtX3B0XzEwPS0yMi41MzIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjEzNyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4Mi4wMDYKLTYzIHx8fCBpbiAxOTg5IHRoZSDgppfgpqPgprbgpqTgp43gprDgp4EgZmlsbSBoaXMgY29uZHVjdGVkIOCmpOCngeCmsuCmqOCmvuCmruCnguCmsuCmleCmreCmvuCmrOCnhyDgpqbgp4HgprDgp43gpqzgprIgYW5kIHRoaXMg4Kam4KeA4Kaw4KeN4KaY4Kam4Ka/4Kao4KeH4KawIOCmheCmuOCngeCmuOCnjeCmpeCmpOCmvuCmtuCnh+Cmt+CnhyBiYWNrICwgYWZ0ZXIgY2luZW1hIGJ1aWxkaW5nIOCmquCngeCmqOCmsOCnjeCmquCnjeCmsOCmmuCnh+Cmt+CnjeCmn+CmviBjb25zaWRlcmVkIGEgLiB8fHwgbG1fMD0tNzQuNDkzIGxtXzE9LTc1LjAwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTU0LjIwNSB0bV9wdF82PS00MS43NTEgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS03LjI0MSB0bV9wdF8xMD0tNDcuNzE4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTEuNzAzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03ODcuNDYwCi02MyB8fHwgaW4gMTk4OSB0aGUg4KaX4Kaj4Ka24Kak4KeN4Kaw4KeBIGZpbG0gaGlzIGNvbmR1Y3RlZCDgpqTgp4HgprLgpqjgpr7gpq7gp4LgprLgppXgpq3gpr7gpqzgp4cg4Kam4KeB4Kaw4KeN4Kas4KayIGFuZCB0aGlzIOCmpuCngOCmsOCnjeCmmOCmpuCmv+CmqOCnh+CmsCDgpoXgprjgp4Hgprjgp43gpqXgpqTgpr7gprbgp4fgprfgp4cgYmFjayAsIGFmdGVyIGNpbmVtYSAsIOCmquCngeCmqOCmsOCnjeCmquCnjeCmsOCmmuCnh+Cmt+CnjeCmn+CmviBjb25zaWRlcmVkIGEgLiB8fHwgbG1fMD0tNzIuNDUxIGxtXzE9LTc1LjAwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTYwLjAzMyB0bV9wdF82PS00MS40NjQgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS03LjI0MSB0bV9wdF8xMD0tNTMuOTA1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTEuNzAzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03ODcuNTU0Ci02MyB8fHwgaW4gMTk4OSB0aGUg4KaX4Kaj4Ka24Kak4KeN4Kaw4KeBIGZpbG0gaGlzIGNvbmR1Y3RlZCDgpqTgp4HgprLgpqjgpr7gpq7gp4LgprLgppXgpq3gpr7gpqzgp4cg4Kam4KeB4Kaw4KeN4Kas4KayIGFuZCB0aGlzIOCmpuCngOCmsOCnjeCmmOCmpuCmv+CmqOCnh+CmsCDgpoXgprjgp4Hgprjgp43gpqXgpqTgpr7gprbgp4fgprfgp4cgYmFjayAsIGFmdGVyIGNpbmVtYSBidWlsZGluZyDgpqrgp4HgpqjgprDgp43gpqrgp43gprDgpprgp4fgprfgp43gpp/gpr4gYSBjb25zaWRlcmVkIC4gfHx8IGxtXzA9LTc1LjQ3MCBsbV8xPS03NS4wMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS01NC4yMDUgdG1fcHRfNj0tNDEuNzUxIHRtX3B0Xzc9LTE0LjAwMCB0bV9wdF84PS0zOC4wNTIgdG1fcHRfOT0tNy4yNDEgdG1fcHRfMTA9LTQ3LjUzNiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTExLjcwMyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xOS4wMDAgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS02MDAuMDAwIHx8fCAtNzg3LjY1NwotNjMgfHx8IGluIDE5ODkgdGhlIOCml+Cmo+CmtuCmpOCnjeCmsOCngSBmaWxtIGhpcyBiZXR3ZWVuIOCmpOCngeCmsuCmqOCmvuCmruCnguCmsuCmleCmreCmvuCmrOCnhyDgpqbgp4HgprDgp43gpqzgprIgYW5kIHRoaXMg4Kam4KeA4Kaw4KeN4KaY4Kam4Ka/4Kao4KeH4KawIOCmheCmuOCngeCmuOCnjeCmpeCmpOCmvuCmtuCnh+Cmt+CnhyBiYWNrICwgYWZ0ZXIgY2luZW1hIGJ1aWxkaW5nIOCmquCngeCmqOCmsOCnjeCmquCnjeCmsOCmmuCnh+Cmt+CnjeCmn+CmviBjb25zaWRlcmVkIGEgLiB8fHwgbG1fMD0tNzMuNjI5IGxtXzE9LTc1LjAwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTU2Ljg3NiB0bV9wdF82PS00Mi40NDQgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS02LjYwOSB0bV9wdF8xMD0tNDguNzMwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTEuMjMzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE3LjAwMCBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03ODcuNjgwCi02MyB8fHwgaW4gMTk4OSB0aGUg4KaX4Kaj4Ka24Kak4KeN4Kaw4KeBIGZpbG0gaGlzIGNvbmR1Y3RlZCDgpqTgp4HgprLgpqjgpr7gpq7gp4LgprLgppXgpq3gpr7gpqzgp4cg4Kam4KeB4Kaw4KeN4Kas4KayIGFuZCB0aGlzIOCmpuCngOCmsOCnjeCmmOCmpuCmv+CmqOCnh+CmsCDgpoXgprjgp4Hgprjgp43gpqXgpqTgpr7gprbgp4fgprfgp4cgYmFjayAsIGFmdGVyIGNpbmVtYSAsIOCmquCngeCmqOCmsOCnjeCmquCnjeCmsOCmmuCnh+Cmt+CnjeCmn+CmviBhIGNvbnNpZGVyZWQgLiB8fHwgbG1fMD0tNzMuNDI4IGxtXzE9LTc1LjAwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTYwLjAzMyB0bV9wdF82PS00MS40NjQgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS03LjI0MSB0bV9wdF8xMD0tNTMuNzIyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTEuNzAzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE5LjAwMCBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03ODcuNzUxCi02MyB8fHwgaW4gMTk4OSB0aGUg4KaX4Kaj4Ka24Kak4KeN4Kaw4KeBIGZpbG0gaGlzIGJldHdlZW4g4Kak4KeB4Kay4Kao4Ka+4Kau4KeC4Kay4KaV4Kat4Ka+4Kas4KeHIOCmpuCngeCmsOCnjeCmrOCmsiBhbmQgdGhpcyDgpqbgp4DgprDgp43gppjgpqbgpr/gpqjgp4fgprAg4KaF4Ka44KeB4Ka44KeN4Kal4Kak4Ka+4Ka24KeH4Ka34KeHIGJhY2sgLCBhZnRlciBjaW5lbWEgLCDgpqrgp4HgpqjgprDgp43gpqrgp43gprDgpprgp4fgprfgp43gpp/gpr4gY29uc2lkZXJlZCBhIC4gfHx8IGxtXzA9LTcxLjU4NiBsbV8xPS03NS4wMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS02Mi43MDQgdG1fcHRfNj0tNDIuMTU3IHRtX3B0Xzc9LTE0LjAwMCB0bV9wdF84PS0zOC4wNTIgdG1fcHRfOT0tNi42MDkgdG1fcHRfMTA9LTU0LjkxNiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTExLjIzMyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNy4wMDAgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS02MDAuMDAwIHx8fCAtNzg3Ljc3NAotNjMgfHx8IGluIDE5ODkgdGhlIOCml+Cmo+CmtuCmpOCnjeCmsOCngSBmaWxtIGhpcyBiZXR3ZWVuIOCmpOCngeCmsuCmqOCmvuCmruCnguCmsuCmleCmreCmvuCmrOCnhyDgpqbgp4HgprDgp43gpqzgprIgYW5kIHRoaXMg4Kam4KeA4Kaw4KeN4KaY4Kam4Ka/4Kao4KeH4KawIOCmheCmuOCngeCmuOCnjeCmpeCmpOCmvuCmtuCnh+Cmt+CnhyBiYWNrICwgYWZ0ZXIgY2luZW1hIGJ1aWxkaW5nIOCmquCngeCmqOCmsOCnjeCmquCnjeCmsOCmmuCnh+Cmt+CnjeCmn+CmviBhIGNvbnNpZGVyZWQgLiB8fHwgbG1fMD0tNzQuNjA2IGxtXzE9LTc1LjAwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTU2Ljg3NiB0bV9wdF82PS00Mi40NDQgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS02LjYwOSB0bV9wdF8xMD0tNDguNTQ3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTEuMjMzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03ODcuODc3Ci02MyB8fHwgaW4gMTk4OSB0aGUg4KaX4Kaj4Ka24Kak4KeN4Kaw4KeBIGZpbG0gaGlzICwg4Kak4KeB4Kay4Kao4Ka+4Kau4KeC4Kay4KaV4Kat4Ka+4Kas4KeHIOCmpuCngeCmsOCnjeCmrOCmsiBhbmQgdGhpcyDgpqbgp4DgprDgp43gppjgpqbgpr/gpqjgp4fgprAg4KaF4Ka44KeB4Ka44KeN4Kal4Kak4Ka+4Ka24KeH4Ka34KeHIGJhY2sgLCBhZnRlciBjaW5lbWEgYnVpbGRpbmcg4Kaq4KeB4Kao4Kaw4KeN4Kaq4KeN4Kaw4Kaa4KeH4Ka34KeN4Kaf4Ka+IGNvbnNpZGVyZWQgYSAuIHx8fCBsbV8wPS03Mi4zNTIgbG1fMT0tNzUuMDA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE0LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNjAuMTY0IHRtX3B0XzY9LTQxLjM0NiB0bV9wdF83PS0xNC4wMDAgdG1fcHRfOD0tMzguMDUyIHRtX3B0Xzk9LTcuMjQxIHRtX3B0XzEwPS01NS44NTAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMS43MDMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTguMDAwIFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc4Ny45MjEKLTYzIHx8fCBpbiAxOTg5IHRoZSDgppfgpqPgprbgpqTgp43gprDgp4EgZmlsbSBoaXMgYmV0d2VlbiDgpqTgp4HgprLgpqjgpr7gpq7gp4LgprLgppXgpq3gpr7gpqzgp4cg4Kam4KeB4Kaw4KeN4Kas4KayIGFuZCB0aGlzIOCmpuCngOCmsOCnjeCmmOCmpuCmv+CmqOCnh+CmsCDgpoXgprjgp4Hgprjgp43gpqXgpqTgpr7gprbgp4fgprfgp4cgYmFjayAsIGFmdGVyIGNpbmVtYSAsIOCmquCngeCmqOCmsOCnjeCmquCnjeCmsOCmmuCnh+Cmt+CnjeCmn+CmviBhIGNvbnNpZGVyZWQgLiB8fHwgbG1fMD0tNzIuNTY0IGxtXzE9LTc1LjAwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTYyLjcwNCB0bV9wdF82PS00Mi4xNTcgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS02LjYwOSB0bV9wdF8xMD0tNTQuNzM0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTEuMjMzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03ODcuOTcxCi02MyB8fHwgaW4gMTk4OSB0aGUg4KaX4Kaj4Ka24Kak4KeN4Kaw4KeBIGZpbG0gaGlzICwg4Kak4KeB4Kay4Kao4Ka+4Kau4KeC4Kay4KaV4Kat4Ka+4Kas4KeHIOCmpuCngeCmsOCnjeCmrOCmsiBhbmQgdGhpcyDgpqbgp4DgprDgp43gppjgpqbgpr/gpqjgp4fgprAg4KaF4Ka44KeB4Ka44KeN4Kal4Kak4Ka+4Ka24KeH4Ka34KeHIGJhY2sgLCBhZnRlciBjaW5lbWEgLCDgpqrgp4HgpqjgprDgp43gpqrgp43gprDgpprgp4fgprfgp43gpp/gpr4gY29uc2lkZXJlZCBhIC4gfHx8IGxtXzA9LTcwLjMxMCBsbV8xPS03NS4wMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS02NS45OTIgdG1fcHRfNj0tNDEuMDU4IHRtX3B0Xzc9LTE0LjAwMCB0bV9wdF84PS0zOC4wNTIgdG1fcHRfOT0tNy4yNDEgdG1fcHRfMTA9LTYyLjAzNyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTExLjcwMyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS02MDAuMDAwIHx8fCAtNzg4LjAxNQotNjQgfHx8IHRoZSDgpqzgprLgpqzgpr/gpqbgp43gpq/gpr4gfHx8IGxtXzA9LTguMzY0IGxtXzE9LTkuNzgzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTguMjYzIHRtX3B0XzY9LTMuNTU5IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPS03LjQ5NCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuMjUzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMjAuMzg1Ci02NCB8fHwgbWF0aGVtYXRpY2FsIOCmrOCmsuCmrOCmv+CmpuCnjeCmr+CmviB8fHwgbG1fMD0tOS45MTcgbG1fMT0tOS43ODMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMS44MjMgdG1fcHRfNj0tMi40NjEgdG1fcHRfNz0tMS4wMDAgdG1fcHRfOD0tMi43MTggdG1fcHRfOT0tMS4wMDAgdG1fcHRfMTA9LTQuNDY2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS45NDYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEyMC42NzcKLTY0IHx8fCDigKIg4Kas4Kay4Kas4Ka/4Kam4KeN4Kav4Ka+IHx8fCBsbV8wPS0xMS40NjkgbG1fMT0tOS43ODMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0wLjAwMCB0bV9wdF82PS00LjgxMiB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuMjUzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMjEuMTMwCi02NCB8fHwgLiDgpqzgprLgpqzgpr/gpqbgp43gpq/gpr4gfHx8IGxtXzA9LTEwLjAxMCBsbV8xPS05Ljc4MyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0wLjAwMCB0bV9wdF81PS02Ljg1NSB0bV9wdF82PS0yLjU2MSB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjAxOCB0bV9wdF8xMD0tMy4yMTkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xLjY0OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTIxLjUyMQotNjQgfHx8IOCmrOCmsuCmrOCmv+CmpuCnjeCmr+CmviBtYXRoZW1hdGljYWwgdGhlb3J5IC4gfHx8IGxtXzA9LTEyLjg4MCBsbV8xPS0xNi4zMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMC4wMDAgdG1fcHRfNT0tMTMuMTU3IHRtX3B0XzY9LTIuNzk3IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy4yNTggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEzMS4xMDIKLTY0IHx8fCBtYXRoZW1hdGljYWwgdGhlb3J5IC4g4Kas4Kay4Kas4Ka/4Kam4KeN4Kav4Ka+IHx8fCBsbV8wPS0xNS44NTUgbG1fMT0tMTYuMzA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTEzLjE1NyB0bV9wdF82PS0yLjc5NyB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuOTQ2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMzMuMzU0Ci02NSB8fHwgb3RoZXIg4Ka44KeN4Kas4Kak4KeN4Kak4KeN4KasLeCmuOCmguCmsOCmleCnjeCmt+Cmv+CmpCBsaW51eCBvcGVyYXRpbmcgc3lzdGVtIGxpa2Ugd2luZG93cyBhbmQgbWFjIG9zIHRvIGFjcXVpcmUgZGlmZmVyZW50IC4gfHx8IGxtXzA9LTM0LjAwMyBsbV8xPS00OC45MTcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTkuNTU0IHRtX3B0XzY9LTExLjY4MSB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMi41MDMgdG1fcHRfMTA9LTQuNTk1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi45ODUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xOTAuMjI0Ci02NSB8fHwgb3RoZXIg4Ka44KeN4Kas4Kak4KeN4Kak4KeN4KasLeCmuOCmguCmsOCmleCnjeCmt+Cmv+CmpCBvcGVyYXRpbmcgc3lzdGVtIGxpa2Ugd2luZG93cyBhbmQgbWFjIG9zIHRvIGxpbnV4IGFjcXVpcmUgZGlmZmVyZW50IC4gfHx8IGxtXzA9LTM2LjY1MCBsbV8xPS00OC45MTcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMTkuODA0IHRtX3B0XzY9LTExLjg4NSB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMi4xMzUgdG1fcHRfMTA9LTUuNjQ3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy40NTMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xOTAuODYwCi02NSB8fHwgb3RoZXIg4Ka44KeN4Kas4Kak4KeN4Kak4KeN4KasLeCmuOCmguCmsOCmleCnjeCmt+Cmv+CmpCBvcGVyYXRpbmcgc3lzdGVtcyBsaWtlIHdpbmRvd3MgYW5kIG1hYyBvcyB0byBsaW51eCBhY3F1aXJlIGRpZmZlcmVudCAuIHx8fCBsbV8wPS0zNi4yMzQgbG1fMT0tNDguOTE3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTE5LjY0NiB0bV9wdF82PS0xMi41ODcgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTIuMTM1IHRtX3B0XzEwPS01LjU1NSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuODcwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTkxLjAzMwotNjUgfHx8IG90aGVyIOCmuOCnjeCmrOCmpOCnjeCmpOCnjeCmrC3gprjgpoLgprDgppXgp43gprfgpr/gpqQgbGludXggb3BlcmF0aW5nIHN5c3RlbSBsaWtlIHdpbmRvd3MgYW5kIG1hYyBvcyB0byBhY3F1aXJlIGEgLiB8fHwgbG1fMD0tMzEuNzkyIGxtXzE9LTQ4LjkxNyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMjIuNzg3IHRtX3B0XzY9LTEyLjczMSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTIuNTAzIHRtX3B0XzEwPS0xMS45NTkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjAzMyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEzLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE5MS42NDQKLTY1IHx8fCBvdGhlciDgprjgp43gpqzgpqTgp43gpqTgp43gpqwt4Ka44KaC4Kaw4KaV4KeN4Ka34Ka/4KakIGxpbnV4IG9wZXJhdGluZyBzeXN0ZW0gbGlrZSB3aW5kb3dzIGFuZCBtYWMgb3MgdG8gYWNxdWlyZSBzZXBhcmF0ZSAuIHx8fCBsbV8wPS0zNC45ODYgbG1fMT0tNDguOTE3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNy43NTYgdG1fcHRfNj0tMTIuNDgwIHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMS41NTMgdG1fcHRfMTA9LTUuODU3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC42NDcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xOTEuNjk2Ci02NiB8fHwgYXNpYSDgpp/gpr7gpofgpq7gprjgp4fgprAg4Kat4Ka+4Ka34KeN4KavIHRvICwgfHx8IGxtXzA9LTIwLjI3OCBsbV8xPS0xOS41NjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tNy4yMDUgdG1fcHRfNj0tMy43NTAgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTcuMzQ4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi41NTMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0MS40MjYKLTY2IHx8fCBhc2lhIOCmn+CmvuCmh+CmruCmuOCnh+CmsCDgpq3gpr7gprfgp43gpq8gYWNjb3JkaW5nIHRvICwgfHx8IGxtXzA9LTIxLjc3OCBsbV8xPS0yMi44MjggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tOS4xOTEgdG1fcHRfNj0tMy43ODMgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTIuMTYwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMC40MTMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0My4zNzIKLTY2IHx8fCB0aGUg4Kaf4Ka+4KaH4Kau4Ka44KeH4KawIOCmreCmvuCmt+CnjeCmryB0byAsIHx8fCBsbV8wPS0xNy43NzUgbG1fMT0tMTkuNTY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTE1LjIyOCB0bV9wdF82PS02Ljc3OCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjUwMyB0bV9wdF8xMD0tMTMuODM1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS40OTggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0My43MzYKLTY2IHx8fCBhc2lhIOCmn+CmvuCmh+CmruCmuOCnh+CmsCBhY2NvcmRpbmcgdG8g4Kat4Ka+4Ka34KeN4KavICwgfHx8IGxtXzA9LTIxLjc4MSBsbV8xPS0yMi44MjggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tOS4xOTEgdG1fcHRfNj0tMy43ODMgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4wMDIgdG1fcHRfMTA9LTIuMjMyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMC40NjggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD00LjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0NC4zODAKLTY2IHx8fCDgpp/gpr7gpofgpq7gprjgp4fgprAgYXNpYSDgpq3gpr7gprfgp43gpq8gdG8gLCB8fHwgbG1fMD0tMjAuODE2IGxtXzE9LTE5LjU2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS03LjIwNSB0bV9wdF82PS0zLjc1MCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tOS42NDkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjYwOSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTMuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjQ0LjM4MQotNjcgfHx8IG9wZW4gc291cmNlIG9yIG9wZW4gc291cmNlIC1scmItIG9wZW4gc291cmNlIC1ycmItIHRoZSBtb25leSBpcyBjb21wdXRlciBzb2Z0d2FyZSB0aGUgc291cmNlIGNvZGUgb3IgdGhlIOCmuOCmvuCmguCmleCnh+CmpOCmv+CmlSBsYW5ndWFnZSBvcGVuIHdheSDgpqzgpr/gpqTgprDgpqMgdG8gLiB8fHwgbG1fMD0tNjkuOTUxIGxtXzE9LTg4LjA1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTkuMDAwIHRtX3B0XzU9LTQ3LjIzNiB0bV9wdF82PS0yMi43MzYgdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS0yLjUwOCB0bV9wdF8xMD0tMjQuODM0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4xNzIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MjMuMDAwIFdvcmRQZW5hbHR5PS0xMi4xNjAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU3MC44MDUKLTY3IHx8fCBvcGVuIHNvdXJjZSBvciBvcGVuIHNvdXJjZSAtbHJiLSBvcGVuIHNvdXJjZSAtcnJiLSB0aGUgbW9uZXkgaXMgY29tcHV0ZXIgc29mdHdhcmUgdGhlIHNvdXJjZSBjb2RlIG9yIG1haW4g4Ka44Ka+4KaC4KaV4KeH4Kak4Ka/4KaVIGxhbmd1YWdlIG9wZW4gd2F5IOCmrOCmv+CmpOCmsOCmoyB0byAuIHx8fCBsbV8wPS03MS43MjcgbG1fMT0tODguMDUwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE5LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xOS4wMDAgdG1fcHRfNT0tNDIuNzg5IHRtX3B0XzY9LTIxLjk4OCB0bV9wdF83PS0xOS4wMDAgdG1fcHRfOD0tNTEuNjQyIHRtX3B0Xzk9LTEuODc2IHRtX3B0XzEwPS0yMy43MzYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjQ3OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yMy4wMDAgV29yZFBlbmFsdHk9LTEyLjE2MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTcwLjg0OAotNjcgfHx8IG9wZW4gc291cmNlIG9yIG9wZW4gc291cmNlIC1scmItIG9wZW4gc291cmNlIC1ycmItIHRoZSBtb25leSBpcyBjb21wdXRlciBzb2Z0d2FyZSB0aGUgc291cmNlIGNvZGUgb3IgdGhlIOCmuOCmvuCmguCmleCnh+CmpOCmv+CmlSBsYW5ndWFnZSBvcGVuIHdheSDgpqzgpr/gpqTgprDgpqMgaXMgLiB8fHwgbG1fMD0tNzAuMDIyIGxtXzE9LTg4LjA1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTkuMDAwIHRtX3B0XzU9LTQ3Ljk0OSB0bV9wdF82PS0yMy4zMzYgdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS0yLjUwOCB0bV9wdF8xMD0tMjQuNjc4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4xMzQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MjMuMDAwIFdvcmRQZW5hbHR5PS0xMi4xNjAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU3MS4xODAKLTY3IHx8fCBvcGVuIHNvdXJjZSBvciBvcGVuIHNvdXJjZSAtbHJiLSBvcGVuIHNvdXJjZSAtcnJiLSB0aGUgbW9uZXkgaXMgY29tcHV0ZXIgc29mdHdhcmUgdGhlIHNvdXJjZSBjb2RlIG9yIHRoZSDgprjgpr7gpoLgppXgp4fgpqTgpr/gppUgbGFuZ3VhZ2Ug4Kas4Ka/4Kak4Kaw4KajIHRvIG9wZW4gd2F5IC4gfHx8IGxtXzA9LTY4LjE3OSBsbV8xPS04OC4wNTAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE2LjAwMCB0bV9wdF81PS00Ny4yMzYgdG1fcHRfNj0tMjIuNzM2IHRtX3B0Xzc9LTE4LjAwMCB0bV9wdF84PS00OC45MjQgdG1fcHRfOT0tMi44NzUgdG1fcHRfMTA9LTIzLjkyNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNTI3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE5LjAwMCBXb3JkUGVuYWx0eT0tMTIuMTYwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NzEuMTg3Ci02NyB8fHwgb3BlbiBzb3VyY2Ugb3Igb3BlbiBzb3VyY2UgLWxyYi0gb3BlbiBzb3VyY2UgLXJyYi0gdGhlIG1vbmV5IGlzIGNvbXB1dGVyIHNvZnR3YXJlIHRoZSBzb3VyY2UgY29kZSBvciBtYWluIOCmuOCmvuCmguCmleCnh+CmpOCmv+CmlSBsYW5ndWFnZSBvcGVuIHdheSDgpqzgpr/gpqTgprDgpqMgaXMgLiB8fHwgbG1fMD0tNzEuNzk4IGxtXzE9LTg4LjA1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTkuMDAwIHRtX3B0XzU9LTQzLjUwMyB0bV9wdF82PS0yMi41ODggdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS0xLjg3NiB0bV9wdF8xMD0tMjMuNTgwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi40NDEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MjMuMDAwIFdvcmRQZW5hbHR5PS0xMi4xNjAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU3MS4yMjMKLTY3IHx8fCBvcGVuIHNvdXJjZSBvciBvcGVuIHNvdXJjZSAtbHJiLSBvcGVuIHNvdXJjZSAtcnJiLSB0aGUgbW9uZXkgaXMgY29tcHV0ZXIgc29mdHdhcmUgdGhlIHNvdXJjZSBjb2RlIG9yIG1haW4g4Ka44Ka+4KaC4KaV4KeH4Kak4Ka/4KaVIGxhbmd1YWdlIOCmrOCmv+CmpOCmsOCmoyB0byBvcGVuIHdheSAuIHx8fCBsbV8wPS02OS45NTUgbG1fMT0tODguMDUwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNi4wMDAgdG1fcHRfNT0tNDIuNzg5IHRtX3B0XzY9LTIxLjk4OCB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTIuMjQzIHRtX3B0XzEwPS0yMi44MjUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjgzNCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xOS4wMDAgV29yZFBlbmFsdHk9LTEyLjE2MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTcxLjIzMAotNjcgfHx8IG9wZW4gc291cmNlIG9yIG9wZW4gc291cmNlIC1scmItIG9wZW4gc291cmNlIC1ycmItIHRoZSBtb25leSBpcyBjb21wdXRlciBzb2Z0d2FyZSB0aGUgc291cmNlIGNvZGUgb3IgdGhlIOCmuOCmvuCmguCmleCnh+CmpOCmv+CmlSBsYW5ndWFnZSBmcmVlIHdheSDgpqzgpr/gpqTgprDgpqMgdG8gLiB8fHwgbG1fMD0tNjkuODg0IGxtXzE9LTg4LjA1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTkuMDAwIHRtX3B0XzU9LTQ3LjIxMCB0bV9wdF82PS0yMi45MjUgdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS0yLjUxMSB0bV9wdF8xMD0tMjUuMjAzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOC4zNjEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MjMuMDAwIFdvcmRQZW5hbHR5PS0xMi4xNjAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU3MS4zMDAKLTY3IHx8fCBvcGVuIHNvdXJjZSBvciBvcGVuIHNvdXJjZSAtbHJiLSBvcGVuIHNvdXJjZSAtcnJiLSB0aGUgbW9uZXkgaXMgY29tcHV0ZXIgc29mdHdhcmUgdGhlIHNvdXJjZSBjb2RlIG9yIG1haW4g4Ka44Ka+4KaC4KaV4KeH4Kak4Ka/4KaVIGxhbmd1YWdlIGZyZWUgd2F5IOCmrOCmv+CmpOCmsOCmoyB0byAuIHx8fCBsbV8wPS03MS42NjAgbG1fMT0tODguMDUwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE5LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xOS4wMDAgdG1fcHRfNT0tNDIuNzY0IHRtX3B0XzY9LTIyLjE3NyB0bV9wdF83PS0xOS4wMDAgdG1fcHRfOD0tNTEuNjQyIHRtX3B0Xzk9LTEuODc5IHRtX3B0XzEwPS0yNC4xMDQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjY2OCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yMy4wMDAgV29yZFBlbmFsdHk9LTEyLjE2MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTcxLjM0MwotNjcgfHx8IG9wZW4gc291cmNlIG9yIG9wZW4gc291cmNlIC1scmItIG9wZW4gc291cmNlIC1ycmItIHRoZSBtb25leSBpcyBjb21wdXRlciBzb2Z0d2FyZSB0aGUgc291cmNlIGNvZGUgb3IgdGhlIOCmuOCmvuCmguCmleCnh+CmpOCmv+CmlSBsYW5ndWFnZSBvcGVuIGluIOCmrOCmv+CmpOCmsOCmoyB0byAuIHx8fCBsbV8wPS02OC4zNzQgbG1fMT0tODguMDUwIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE5LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xOS4wMDAgdG1fcHRfNT0tNTEuNzM2IHRtX3B0XzY9LTIzLjE0MSB0bV9wdF83PS0xOS4wMDAgdG1fcHRfOD0tNTEuNjQyIHRtX3B0Xzk9LTIuNTU3IHRtX3B0XzEwPS0yOS45MzcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03Ljg2NSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIyLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yMy4wMDAgV29yZFBlbmFsdHk9LTEyLjE2MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTcxLjQ2MgotNjcgfHx8IG9wZW4gc291cmNlIG9yIG9wZW4gc291cmNlIC1scmItIG9wZW4gc291cmNlIC1ycmItIHRoZSBtb25leSBpcyBjb21wdXRlciBzb2Z0d2FyZSB0aGUgc291cmNlIGNvZGUgb3IgbWFpbiDgprjgpr7gpoLgppXgp4fgpqTgpr/gppUgbGFuZ3VhZ2Ugb3BlbiBpbiDgpqzgpr/gpqTgprDgpqMgdG8gLiB8fHwgbG1fMD0tNzAuMTUxIGxtXzE9LTg4LjA1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTkuMDAwIHRtX3B0XzU9LTQ3LjI4OSB0bV9wdF82PS0yMi4zOTQgdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS0xLjkyNSB0bV9wdF8xMD0tMjguODM5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4xNzIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MjMuMDAwIFdvcmRQZW5hbHR5PS0xMi4xNjAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU3MS41MDUKLTY4IHx8fCBiYW5nbGFkZXNoIOCmheCmqOCmsuCmvuCmh+CmqOCnhyBkaGFrYSB8fHwgbG1fMD0tMTIuOTk5IGxtXzE9LTEzLjA0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0xLjY2NSB0bV9wdF82PS0wLjQ3MSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMC4zNzUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0wLjA1NSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTIzLjUyMwotNjggfHx8IGJhbmdsYWRlc2gg4KaF4Kao4Kay4Ka+4KaH4Kao4KeHIHRoZSB8fHwgbG1fMD0tMTIuMTIzIGxtXzE9LTEzLjA0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS03Ljk2NiB0bV9wdF82PS0yLjcxMSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tNi4xNzIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjE5NSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTI3LjAyNAotNjggfHx8IGJhbmdsYWRlc2ggZGhha2Eg4KaF4Kao4Kay4Ka+4KaH4Kao4KeHIHx8fCBsbV8wPS0xMy40NTcgbG1fMT0tMTMuMDQ1IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTEuNjY1IHRtX3B0XzY9LTAuNDcxIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMDA3IHRtX3B0XzEwPS00LjM5MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMzUwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTIuMTcxIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMjcuMjY3Ci02OCB8fHwg4KaF4Kao4Kay4Ka+4KaH4Kao4KeHIGJhbmdsYWRlc2ggZGhha2EgfHx8IGxtXzA9LTE0LjAzOCBsbV8xPS0xMy4wNDUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMS42NjUgdG1fcHRfNj0tMC40NzEgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTMuMDk5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy4zNzggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMi4xNzEgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEyNy42NTUKLTY4IHx8fCDgpoXgpqjgprLgpr7gpofgpqjgp4cgZGhha2EgYmFuZ2xhZGVzaCB8fHwgbG1fMD0tMTQuMTQ4IGxtXzE9LTEzLjA0NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0wLjAwMCB0bV9wdF81PS0xLjY2NSB0bV9wdF82PS0wLjQ3MSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMy4yMTcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjQyOCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTI4LjgwNAotNjkgfHx8IGZpcnN0IHdvcmxkIHdhciBnZXJtYW55IOCmueCnh+CmsOCnhyBiZSAuIHx8fCBsbV8wPS0yMC4yNjEgbG1fMT0tMjYuMDg5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEwLjQ2NCB0bV9wdF82PS00LjAwNCB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4wMzcgdG1fcHRfMTA9LTUuNzUyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy4wNTcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE0Ni44NjQKLTY5IHx8fCBmaXJzdCB3b3JsZCB3YXIgZ2VybWFueSDgprngp4fgprDgp4cgZWFzaWx5IC4gfHx8IGxtXzA9LTIwLjA5MCBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTEuNzYxIHRtX3B0XzY9LTcuODYwIHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjM4NiB0bV9wdF8xMD0tMi45NzAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xLjg3MCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTQ3LjE3NAotNjkgfHx8IGZpcnN0IHdvcmxkIHdhciBnZXJtYW55IOCmueCnh+CmsOCnhyBjYW4gLiB8fHwgbG1fMD0tMTkuODE3IGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMC40MDcgdG1fcHRfNj0tNC4yMDkgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuMzg2IHRtX3B0XzEwPS02LjYwNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuOTc0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNDcuMjA2Ci02OSB8fHwgZmlyc3Qgd29ybGQgd2FyIGdlcm1hbnkg4Ka54KeH4Kaw4KeHIGJlIHx8fCBsbV8wPS0yMC4xMDUgbG1fMT0tMjIuODI4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTExLjA0NSB0bV9wdF82PS0xMS41NDAgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTEuMDE4IHRtX3B0XzEwPS03LjM1MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuNTYzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNDguMTEyCi02OSB8fHwgZ2VybWFueSBmaXJzdCB3b3JsZCB3YXIg4Ka54KeH4Kaw4KeHIGJlIHx8fCBsbV8wPS0xOS45ODQgbG1fMT0tMjIuODI4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTExLjA0NSB0bV9wdF82PS0xMS41NDAgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTEuMDUwIHRtX3B0XzEwPS02LjEyOCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuNTYzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9My4wMDAgV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNDkuNjM1Ci02OSB8fHwgZmlyc3Qgd29ybGQgd2FyIGdlcm1hbiDgprngp4fgprDgp4cgYmUgfHx8IGxtXzA9LTE5LjEwNyBsbV8xPS0yMi44MjggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTIuOTkxIHRtX3B0XzY9LTEzLjk1MSB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMS4wMzcgdG1fcHRfMTA9LTkuOTQ1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4xNzMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE0OS42ODMKLTY5IHx8fCB0aGUgZmlyc3Qgd29ybGQgd2FyIGdlcm1hbnkg4Ka54KeH4Kaw4KeHIGJlIHx8fCBsbV8wPS0xOS4zMjYgbG1fMT0tMjYuMDg5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTE1Ljc0MCB0bV9wdF82PS0xMS43ODMgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMS4xMzUgdG1fcHRfMTA9LTYuMTI5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi4xOTEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD00LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE0OS42ODgKLTcwIHx8fCBidXQgdGhpcyBpcyB0byBmb3IgZXZlbiByZXNlYXJjaCB0byBnb2luZyBvbiAuIHx8fCBsbV8wPS0yNS40MDMgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDEuNTk1IHRtX3B0XzY9LTExLjA1NSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuNTAzIHRtX3B0XzEwPS0zMC4xOTggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjcxOSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IHx8fCAtODIuNDU3Ci03MCB8fHwgYnV0IHRoaXMgaXMgdG8gZm9yIGV2ZW4gcmVzZWFyY2ggcHJvZ3Jlc3MgZ29pbmcgb24gLiB8fHwgbG1fMD0tMjcuMTQ1IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTM3LjA4NyB0bV9wdF82PS0xMS41MDcgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0zLjUwMyB0bV9wdF8xMD0tMjUuNTAyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy43MTkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiB8fHwgLTgyLjY4NQotNzAgfHx8IGJ1dCB0aGlzIGlzIHRvIGV2ZW4gZm9yIHJlc2VhcmNoIHRvIGdvaW5nIG9uIC4gfHx8IGxtXzA9LTI0LjY5MyBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTQxLjU5NSB0bV9wdF82PS0xMS4wNTUgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0zLjUwMyB0bV9wdF8xMD0tMzAuNzEwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOC4xMDQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IHx8fCAtODIuODExCi03MCB8fHwgYnV0IHRoaXMgaXMgdG8gZXZlbiBmb3IgcmVzZWFyY2ggcHJvZ3Jlc3MgZ29pbmcgb24gLiB8fHwgbG1fMD0tMjYuNDM1IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMzcuMDg3IHRtX3B0XzY9LTExLjUwNyB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuNTAzIHRtX3B0XzEwPS0yNi4wMTQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04LjEwNCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgfHx8IC04My4wNDAKLTcwIHx8fCBidXQgdGhpcyBpcyB0byBmb3IgZXZlbiByZXNlYXJjaCB0byBnb2luZyBvbiB8fHwgbG1fMD0tMjYuNzE3IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS00MS40MTEgdG1fcHRfNj0tMTkuMTc4IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjUwMyB0bV9wdF8xMD0tMzAuMTg5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4wMjMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIHx8fCAtODQuMjgzCi03MCB8fHwgYnV0IHRoaXMgaXMgdG8gZm9yIGV2ZW4gcmVzZWFyY2ggcHJvZ3Jlc3MgZ29pbmcgb24gfHx8IGxtXzA9LTI4LjQ1OCBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMzYuOTAzIHRtX3B0XzY9LTE5LjYzMCB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMy41MDMgdG1fcHRfMTA9LTI1LjQ5MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuMDIzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS01LjIxMiB8fHwgLTg0LjUxMQotNzAgfHx8IGJ1dCB0aGlzIGlzIHRvIGV2ZW4gZm9yIHJlc2VhcmNoIHRvIGdvaW5nIG9uIHx8fCBsbV8wPS0yNi4wMDcgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTQxLjQxMSB0bV9wdF82PS0xOS4xNzggdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuNTAzIHRtX3B0XzEwPS0zMC43MDEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjQwNyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgfHx8IC04NC42MzcKLTcwIHx8fCBidXQgdGhpcyBpcyB0byBmb3IgcHJlc2VudGx5IHJlc2VhcmNoIHRvIGdvaW5nIG9uIHx8fCBsbV8wPS0yNy4xNjIgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTQwLjc0MiB0bV9wdF82PS0xOS4xNzggdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuNTAzIHRtX3B0XzEwPS0zMC4yNTUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjAyMyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgfHx8IC04NC43MjIKLTcwIHx8fCBidXQgdGhpcyBpcyB0byBwcmVzZW50bHkgZm9yIHJlc2VhcmNoIHRvIGdvaW5nIG9uIHx8fCBsbV8wPS0yNi4xNzIgbG1fMT0tMzUuODcyIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTQwLjc0MiB0bV9wdF82PS0xOS4xNzggdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuNTAzIHRtX3B0XzEwPS0zMC43NjYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjQwNyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgfHx8IC04NC43MzAKLTcwIHx8fCBidXQgdGhpcyBpcyB0byBldmVuIGZvciByZXNlYXJjaCBwcm9ncmVzcyBnb2luZyBvbiB8fHwgbG1fMD0tMjcuNzQ4IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0zNi45MDMgdG1fcHRfNj0tMTkuNjMwIHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjUwMyB0bV9wdF8xMD0tMjYuMDA1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy40MDcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIHx8fCAtODQuODY2Ci03MSB8fHwg4Ka44KeB4Kaq4Ka+4Kaw4KaP4KaH4KaaIHx8fCBsbV8wPS03LjM1NSBsbV8xPS02LjUyMiB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0wLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9MC4wMDAgdG1fcHRfNT0wLjAwMCB0bV9wdF82PTAuMDAwIHRtX3B0Xzc9MC4wMDAgdG1fcHRfOD0wLjAwMCB0bV9wdF85PTAuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPTAuMDAwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTExMS4zNTgKLTcyIHx8fCBoZSBhcm15IGZvciDgpobgpqjgpqvgpr/gpp8gd2FzIGRlY2xhcmVkIC4gfHx8IGxtXzA9LTIwLjE4MyBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTIuMDU0IHRtX3B0XzY9LTEzLjk3NyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTEzLjQ1NSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuNjI3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTUuMDcxCi03MiB8fHwgaGUgYXJteSBmb3Ig4KaG4Kao4Kar4Ka/4KafIGRlY2xhcmVkIHdhcyAuIHx8fCBsbV8wPS0yMS40NTAgbG1fMT0tMjYuMDg5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEyLjA1NCB0bV9wdF82PS0xMy45NzcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPS0xMi43MzUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjU0MSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTU1LjQ1NgotNzIgfHx8IGhlIGFybXkgZm9yIOCmhuCmqOCmq+Cmv+CmnyBkZWNsYXJlZCB0aGUgLiB8fHwgbG1fMD0tMjAuNTQxIGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNC44MTAgdG1fcHRfNj0tMTQuNzg1IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tMTQuNjM1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4wMzAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE1NS44MDEKLTcyIHx8fCBoZSBhcm15IHRvIOCmhuCmqOCmq+Cmv+CmnyB3YXMgZGVjbGFyZWQgLiB8fHwgbG1fMD0tMTkuOTcyIGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xMy45NDAgdG1fcHRfNj0tMTQuODE0IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tMTUuNTM2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC45MzQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE1Ni40NTkKLTcyIHx8fCBoZSBhcm15IGZvciDgpobgpqjgpqvgpr/gpp8gZGVjbGFyZWQgaW4gLiB8fHwgbG1fMD0tMjEuMDQwIGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNC4xODcgdG1fcHRfNj0tMTUuMDk1IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tMTQuMjA3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC42NzIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE1Ni41MjMKLTcyIHx8fCBoZSBhcm15IOCmhuCmqOCmq+Cmv+CmnyBmb3Igd2FzIGRlY2xhcmVkIC4gfHx8IGxtXzA9LTIwLjU2MiBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMTIuMDU0IHRtX3B0XzY9LTEzLjk3NyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTEzLjk2NyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMDExIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTYuNzczCi03MiB8fHwgaGUgYXJteSB0byDgpobgpqjgpqvgpr/gpp8gZGVjbGFyZWQgd2FzIC4gfHx8IGxtXzA9LTIxLjIzOSBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTMuOTQwIHRtX3B0XzY9LTE0LjgxNCB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTE0LjgxNSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuODQ4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTYuODQ1Ci03MyB8fHwgYmh1dHRvIOCmj+CnjeCmr+CmvuCmuOCnh+CmruCnjeCmrOCmsuCmvyDgpqzgpq/gprzgppXgpp8gdG8gMi41IHdpdGggYW5ub3VuY2VkIHRoYXQgdGhlIHlhaHlhIGtoYW4gbXVqaWIgZm9ybSBnb3Zlcm5tZW50IGZvciBmb3Ig4Kac4Ka+4Kao4Ka+4Kay4KeHIGhlIG5vIGdvdmVybm1lbnQgaGFzIOCmqOCnh+CmrOCnh+CmqCAuIHx8fCBsbV8wPS03NC4yOTkgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTEuNTUwIHRtX3B0XzY9LTMyLjcxMSB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTYuMzg3IHRtX3B0XzEwPS0zMi4zNzcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjcyNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE5LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTgxLjIyNgotNzMgfHx8IGJodXR0byDgpo/gp43gpq/gpr7gprjgp4fgpq7gp43gpqzgprLgpr8g4Kas4Kav4Ka84KaV4KafIHRvIDIuNSB3aXRoIGFubm91bmNlZCB0aGF0IHRoZSB5YWh5YSBraGFuIHdhcyBmb3JtIGdvdmVybm1lbnQgZm9yIGZvciDgppzgpr7gpqjgpr7gprLgp4cgaGUgbm8gZ292ZXJubWVudCBoYXMg4Kao4KeH4Kas4KeH4KaoIC4gfHx8IGxtXzA9LTcyLjE0OCBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS01NC40NjggdG1fcHRfNj0tMzIuOTYyIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tNy4zNjkgdG1fcHRfMTA9LTM1LjczMyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguMzM1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01ODEuNDUzCi03MyB8fHwgYmh1dHRvIOCmj+CnjeCmr+CmvuCmuOCnh+CmruCnjeCmrOCmsuCmvyDgpqzgpq/gprzgppXgpp8gdG8gMi41IHdpdGggYW5ub3VuY2VkIHRoYXQgdGhlIHlhaHlhIGtoYW4gbXVqaWIgZm9ybSBnb3Zlcm5tZW50IGZvciB0byDgppzgpr7gpqjgpr7gprLgp4cgaGUgbm8gZ292ZXJubWVudCBoYXMg4Kao4KeH4Kas4KeH4KaoIC4gfHx8IGxtXzA9LTc0LjIwMCBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS01My4wMDUgdG1fcHRfNj0tMzMuMTE2IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tNi4zODcgdG1fcHRfMTA9LTMzLjE1MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNzI1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01ODEuNzIxCi03MyB8fHwgYmh1dHRvIOCmj+CnjeCmr+CmvuCmuOCnh+CmruCnjeCmrOCmsuCmvyDgpqzgpq/gprzgppXgpp8gdG8gMi41IHdpdGggZGVjbGFyZWQgaW4gdGhlIHlhaHlhIGtoYW4gbXVqaWIgZm9ybSBnb3Zlcm5tZW50IGZvciBmb3Ig4Kac4Ka+4Kao4Ka+4Kay4KeHIGhlIG5vIGdvdmVybm1lbnQgaGFzIOCmqOCnh+CmrOCnh+CmqCAuIHx8fCBsbV8wPS03NC4wNDYgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE2LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNTAuNzM1IHRtX3B0XzY9LTI5LjQ5MSB0bV9wdF83PS0xNi4wMDAgdG1fcHRfOD0tNDMuNDg4IHRtX3B0Xzk9LTUuNDU1IHRtX3B0XzEwPS0zOS4zOTAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05LjIxOSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE5LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNy4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTgxLjc4NAotNzMgfHx8IGJodXR0byDgpo/gp43gpq/gpr7gprjgp4fgpq7gp43gpqzgprLgpr8g4Kas4Kav4Ka84KaV4KafIHRvIDIuNSBieSBtdWppYiBhbm5vdW5jZWQgdGhhdCB0aGUgeWFoeWEga2hhbiBmb3JtIGdvdmVybm1lbnQgZm9yIGZvciDgppzgpr7gpqjgpr7gprLgp4cgaGUgbm8gZ292ZXJubWVudCBoYXMg4Kao4KeH4Kas4KeH4KaoIC4gfHx8IGxtXzA9LTcxLjE0NSBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTUyLjQ2NCB0bV9wdF82PS0zMy41ODggdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS02LjM3NiB0bV9wdF8xMD0tMzMuNDQ5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOS4wNTMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xOS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU4MS43ODQKLTczIHx8fCBiaHV0dG8g4KaP4KeN4Kav4Ka+4Ka44KeH4Kau4KeN4Kas4Kay4Ka/IOCmrOCmr+CmvOCmleCmnyB0byAyLjUgd2l0aCBtdWppYiBhbm5vdW5jZWQgdGhhdCB0aGUgeWFoeWEga2hhbiBmb3JtIGdvdmVybm1lbnQgZm9yIGZvciDgppzgpr7gpqjgpr7gprLgp4cgaGUgbm8gZ292ZXJubWVudCBoYXMg4Kao4KeH4Kas4KeH4KaoIC4gfHx8IGxtXzA9LTcyLjAyMyBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTUxLjU1MCB0bV9wdF82PS0zMi43MTEgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS02LjM3NiB0bV9wdF8xMD0tMzMuMTEyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy45ODUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xOS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU4MS45MzAKLTczIHx8fCBiaHV0dG8g4KaP4KeN4Kav4Ka+4Ka44KeH4Kau4KeN4Kas4Kay4Ka/IOCmrOCmr+CmvOCmleCmnyB0byAyLjUgd2l0aCBhbm5vdW5jZWQgdGhhdCB0aGUgeWFoeWEga2hhbiBtdWppYiBnb3Zlcm5tZW50IGZvciB0aGUgZm9yIOCmnOCmvuCmqOCmvuCmsuCnhyBoZSBubyBnb3Zlcm5tZW50IGhhcyDgpqjgp4fgpqzgp4fgpqggLiB8fHwgbG1fMD0tNzIuMjMyIGxtXzE9LTc4LjI2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTU1LjIxMiB0bV9wdF82PS0zMS45MDAgdG1fcHRfNz0tMTYuMDAwIHRtX3B0Xzg9LTQzLjQ4OCB0bV9wdF85PS01LjUyMiB0bV9wdF8xMD0tNDAuNDUwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy42MDAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xOS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU4MS45NDEKLTczIHx8fCBiaHV0dG8g4KaP4KeN4Kav4Ka+4Ka44KeH4Kau4KeN4Kas4Kay4Ka/IOCmrOCmr+CmvOCmleCmnyB0byAyLjUgd2l0aCBhbm5vdW5jZWQgdGhhdCB0aGUgeWFoeWEga2hhbiB3YXMgZm9ybSBnb3Zlcm5tZW50IGZvciB0byDgppzgpr7gpqjgpr7gprLgp4cgaGUgbm8gZ292ZXJubWVudCBoYXMg4Kao4KeH4Kas4KeH4KaoIC4gfHx8IGxtXzA9LTcyLjA0OSBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS01NS45MjMgdG1fcHRfNj0tMzMuMzY3IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tNy4zNjkgdG1fcHRfMTA9LTM2LjUwNyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTguMzM1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01ODEuOTQ5Ci03MyB8fHwgYmh1dHRvIOCmj+CnjeCmr+CmvuCmuOCnh+CmruCnjeCmrOCmsuCmvyDgpqzgpq/gprzgppXgpp8gdG8gMi41IGFubm91bmNlZCB0aGF0IHdpdGggdGhlIHlhaHlhIGtoYW4gbXVqaWIgZm9ybSBnb3Zlcm5tZW50IGZvciBmb3Ig4Kac4Ka+4Kao4Ka+4Kay4KeHIGhlIG5vIGdvdmVybm1lbnQgaGFzIOCmqOCnh+CmrOCnh+CmqCAuIHx8fCBsbV8wPS03My42MzggbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tNTEuNTUwIHRtX3B0XzY9LTMyLjcxMSB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTYuNDA1IHRtX3B0XzEwPS0zMy4yNzYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjczNCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE5LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTgxLjk3OAotNzMgfHx8IGJodXR0byDgpo/gp43gpq/gpr7gprjgp4fgpq7gp43gpqzgprLgpr8g4Kas4Kav4Ka84KaV4KafIHRvIDIuNSB3aXRoIGFubm91bmNlZCB0aGF0IHRoZSB5YWh5YSBraGFuIG11amliIGZvcm0gZ292ZXJubWVudCBmb3IgZm9yIOCmnOCmvuCmqOCmvuCmsuCnhyBoZSB0aGF0IGdvdmVybm1lbnQgYnkg4Kao4KeH4Kas4KeH4KaoIG5vdCAuIHx8fCBsbV8wPS03Ny43NDIgbG1fMT0tODEuNTI4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE3LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNy4wMDAgdG1fcHRfNT0tNTMuMTgzIHRtX3B0XzY9LTI0LjkwNyB0bV9wdF83PS0xNy4wMDAgdG1fcHRfOD0tNDYuMjA2IHRtX3B0Xzk9LTMuODA1IHRtX3B0XzEwPS0zNC43NDEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04Ljg5OCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yMS4wMDAgV29yZFBlbmFsdHk9LTExLjI5MiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTgxLjk4NAotNzQgfHx8IGFuZCBjb21wdXRlciB3b3JkcyBtb25leSDgppfgpqPgpqjgpr7gppXgpr7gprDgp4AgbWFjaGluZSAuIHx8fCBsbV8wPS0yMy42ODUgbG1fMT0tMjYuMDg5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTguNDQ4IHRtX3B0XzY9LTUuNTA2IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0wLjAwMiB0bV9wdF8xMD0tNS45NDMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjA5MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjUwLjIzOAotNzQgfHx8IHRoZSBjb21wdXRlciB3b3JkcyBtb25leSDgppfgpqPgpqjgpr7gppXgpr7gprDgp4AgbWFjaGluZSAuIHx8fCBsbV8wPS0yMi4wMjUgbG1fMT0tMjYuMDg5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTExLjMzNyB0bV9wdF82PS03LjM3OCB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4wMDMgdG1fcHRfMTA9LTcuMzgyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4yOTkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI1MC41MzEKLTc0IHx8fCBhbmQgY29tcHV0ZXIgd29yZCBtZWFuaW5nIOCml+Cmo+CmqOCmvuCmleCmvuCmsOCngCBtYWNoaW5lIC4gfHx8IGxtXzA9LTIyLjI1NiBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tOS4zNjggdG1fcHRfNj0tNi4wNzQgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuMzc1IHRtX3B0XzEwPS04LjYyOCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMzI1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTAuNjMyCi03NCB8fHwgYW5kIGNvbXB1dGVyIHdvcmRzIG1lYW5zIOCml+Cmo+CmqOCmvuCmleCmvuCmsOCngCBtYWNoaW5lIC4gfHx8IGxtXzA9LTIzLjU1MiBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tOS41OTIgdG1fcHRfNj0tNS44NTggdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuMDA5IHRtX3B0XzEwPS03LjM3NiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMDczIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTEuMTM2Ci03NCB8fHwgYW5kIGNvbXB1dGVyIHdvcmRzIG1lYW5pbmcg4KaX4Kaj4Kao4Ka+4KaV4Ka+4Kaw4KeAIG1hY2hpbmUgLiB8fHwgbG1fMD0tMjMuOTA4IGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS04LjU2NSB0bV9wdF82PS01Ljk2OSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4wMDkgdG1fcHRfMTA9LTYuOTcwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy4wNzMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI1MS4zMTMKLTc0IHx8fCBhbmQgY29tcHV0ZXIgd29yZHMgdGhlIOCml+Cmo+CmqOCmvuCmleCmvuCmsOCngCBtYWNoaW5lIC4gfHx8IGxtXzA9LTIxLjg5NCBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTQuNzc0IHRtX3B0XzY9LTYuMDMwIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0wLjAwOSB0bV9wdF8xMD0tMTIuMDY2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy4wNzMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI1MS4zNTEKLTc0IHx8fCB0aGUgY29tcHV0ZXIgd29yZHMgbWVhbnMg4KaX4Kaj4Kao4Ka+4KaV4Ka+4Kaw4KeAIG1hY2hpbmUgLiB8fHwgbG1fMD0tMjEuODkyIGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMi40ODAgdG1fcHRfNj0tNy43MzAgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuMDA5IHRtX3B0XzEwPS04LjgxNSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMjgwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTEuNDI5Ci03NSB8fHwgb24gNHRoIGp1bHkg4Ken4Ket4Ket4KesIHRoaXMgY29uc3RpdHVlbnRzIGEgaW5kZXBlbmRlbmNlIG5vdGljZSDgppzgpr7gprDgpr8gLiB8fHwgbG1fMD0tMzYuMzk1IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xMi40MjMgdG1fcHRfNj0tMTQuODM3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tMTEuNTc3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4xOTAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ni41MTgKLTc1IHx8fCDgp6fgp63gp63gp6wgb24gNHRoIGp1bHkgdGhpcyBjb25zdGl0dWVudHMgYSBpbmRlcGVuZGVuY2Ugbm90aWNlIOCmnOCmvuCmsOCmvyAuIHx8fCBsbV8wPS0zNy44MzggbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTEyLjQyMyB0bV9wdF82PS0xNC44MzcgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0xMi42NDUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjEwMSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg2LjU4NAotNzUgfHx8IG9uIDR0aCBqdWx5IHRoaXMg4Ken4Ket4Ket4KesIGNvbnN0aXR1ZW50cyBhIGluZGVwZW5kZW5jZSBub3RpY2Ug4Kac4Ka+4Kaw4Ka/IC4gfHx8IGxtXzA9LTM2LjM5NSBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTIuNDIzIHRtX3B0XzY9LTE0LjgzNyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTExLjU3NyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuNzg0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODcuMzM5Ci03NSB8fHwgb24gNHRoIGp1bHkg4Ken4Ket4Ket4KesIHRoaXMgY29uc3RpdHVlbnRzIGluZGVwZW5kZW5jZSBhIG5vdGljZSDgppzgpr7gprDgpr8gLiB8fHwgbG1fMD0tMzYuMzk1IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMi40MjMgdG1fcHRfNj0tMTQuODM3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjQxOCB0bV9wdF8xMD0tMTEuODE1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy44MzggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ny40NjAKLTc1IHx8fCDgp6fgp63gp63gp6wgb24gNHRoIGp1bHkgdGhpcyBjb25zdGl0dWVudHMgaW5kZXBlbmRlbmNlIGEgbm90aWNlIOCmnOCmvuCmsOCmvyAuIHx8fCBsbV8wPS0zNy44MzggbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTEyLjQyMyB0bV9wdF82PS0xNC44MzcgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuNDE4IHRtX3B0XzEwPS0xMi44ODIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjc0OCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg3LjUyNQotNzUgfHx8IG9uIDR0aCBqdWx5IOCnp+CnreCnreCnrCB0aGUgY29uc3RpdHVlbnRzIGEgaW5kZXBlbmRlbmNlIG5vdGljZSDgppzgpr7gprDgpr8gLiB8fHwgbG1fMD0tMzUuNDU2IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xNS43NTggdG1fcHRfNj0tMTYuMTI5IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tMTQuMzc0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4xMDggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ny44NDAKLTc1IHx8fCBvbiA0dGgganVseSDgp6fgp63gp63gp6wgdGhpcyBjb25zdGl0dWVudHMgYSBvZiBub3RpY2Ug4Kac4Ka+4Kaw4Ka/IC4gfHx8IGxtXzA9LTM0LjUxNyBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTcuMTEyIHRtX3B0XzY9LTE0LjU4NiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMy4zNjggdG1fcHRfMTA9LTE2LjQwNyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuMzg3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODcuODU1Ci03NSB8fHwg4Ken4Ket4Ket4KesIG9uIDR0aCBqdWx5IHRoaXMgY29uc3RpdHVlbnRzIGEgb2Ygbm90aWNlIOCmnOCmvuCmsOCmvyAuIHx8fCBsbV8wPS0zNS45NjAgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTE3LjExMiB0bV9wdF82PS0xNC41ODYgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTMuMzY4IHRtX3B0XzEwPS0xNy40NzQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjI5OCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg3LjkyMQotNzUgfHx8IG9uIDR0aCBqdWx5IOCnp+CnreCnreCnrCB0aGlzIGNvbnN0aXR1ZW50cyBhIG5vdGljZSBpbmRlcGVuZGVuY2Ug4Kac4Ka+4Kaw4Ka/IC4gfHx8IGxtXzA9LTM2LjM5NSBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTIuNDIzIHRtX3B0XzY9LTE0LjgzNyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMy4zNjggdG1fcHRfMTA9LTEyLjUwOCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMzA4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODguNTg1Ci03NSB8fHwg4Ken4Ket4Ket4KesIG9uIDR0aCBqdWx5IHRoaXMgY29uc3RpdHVlbnRzIGEgbm90aWNlIGluZGVwZW5kZW5jZSDgppzgpr7gprDgpr8gLiB8fHwgbG1fMD0tMzcuODM4IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xMi40MjMgdG1fcHRfNj0tMTQuODM3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0zLjM2OCB0bV9wdF8xMD0tMTMuNTc1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4yMTggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4OC42NTEKLTc2IHx8fCBnZXJtYW55IC1scmItIGluIGdlcm1hbiA6IGRldXRzY2hsYW5kIOCmoeCmr+CmvOCmmuCnjSB0aGUg4Kay4Ka+4Kao4KeN4Kaf4KeNIG9mIHByb25vdW5jZWQgWyBkyZTKj3TKg2xhbnQgXSAtcnJiLSB0aGUgaXMgYSBjb3VudHJ5IC4gfHx8IGxtXzA9LTU0LjUxOSBsbV8xPS02OC40ODQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTQwLjAzNyB0bV9wdF82PS0yNy4wODcgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0yLjQxOSB0bV9wdF8xMD0tMTQuNDgxIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi4zNTAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM0Ljk2MAotNzYgfHx8IGdlcm1hbnkgLWxyYi0gaW4gZ2VybWFuIDogZGV1dHNjaGxhbmQg4Kah4Kav4Ka84Kaa4KeNIHRoZSDgprLgpr7gpqjgp43gpp/gp40gb2YgcHJvbm91bmNlZCBbIGTJlMqPdMqDbGFudCBdIC1ycmItIHRocm91Z2ggaXMgYSBjb3VudHJ5IC4gfHx8IGxtXzA9LTU1LjA5MyBsbV8xPS02OC40ODQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTM2Ljc4NyB0bV9wdF82PS0yNy45MzQgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0yLjQzNyB0bV9wdF8xMD0tMTEuOTE5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy4xMzggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM0Ljk2NwotNzYgfHx8IGdlcm1hbnkgLWxyYi0gaW4gZ2VybWFuIDogZGV1dHNjaGxhbmQg4Kah4Kav4Ka84Kaa4KeNIHRoZSDgprLgpr7gpqjgp43gpp/gp40gb2YgcHJvbm91bmNlZCBbIGTJlMqPdMqDbGFudCBdIC1ycmItIG1pZGRsZSBpcyBhIGNvdW50cnkgLiB8fHwgbG1fMD0tNTYuNjI4IGxtXzE9LTY4LjQ4NCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMzQuOTAzIHRtX3B0XzY9LTI3LjA4NyB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTIuNDE5IHRtX3B0XzEwPS05LjM4NSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuOTc1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNS4xMzMKLTc2IHx8fCBnZXJtYW55IC1scmItIGluIGdlcm1hbiA6IGRldXRzY2hsYW5kIOCmoeCmr+CmvOCmmuCnjSB0aGUg4Kay4Ka+4Kao4KeN4Kaf4KeNIG9mIHByb25vdW5jZWQgWyBkyZTKj3TKg2xhbnQgXSAtcnJiLSBjZW50cmFsIGlzIGEgY291bnRyeSAuIHx8fCBsbV8wPS01Ni4zMDkgbG1fMT0tNjguNDg0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0zNS4xNDAgdG1fcHRfNj0tMjcuMjAwIHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMi40MTkgdG1fcHRfMTA9LTEwLjcyOSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuMDM5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNS4xOTQKLTc2IHx8fCBnZXJtYW55IC1scmItIGluIGdlcm1hbiA6IGRldXRzY2hsYW5kIOCmoeCmr+CmvOCmmuCnjSB0aGUg4Kay4Ka+4Kao4KeN4Kaf4KeNIHRoZSBwcm9ub3VuY2VkIFsgZMmUyo90yoNsYW50IF0gLXJyYi0gdGhlIGlzIGEgY291bnRyeSAuIHx8fCBsbV8wPS01NC43MDMgbG1fMT0tNjguNDg0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDAuMDM0IHRtX3B0XzY9LTI2Ljc1NyB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMDY0IHRtX3B0XzEwPS0yNC40OTkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjQzMiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgV29yZFBlbmFsdHk9LTkuNTU0IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MzcuMzQ0Ci03NiB8fHwgZ2VybWFueSAtbHJiLSBpbiBnZXJtYW4gOiBkZXV0c2NobGFuZCDgpqHgpq/gprzgpprgp40gdGhlIOCmsuCmvuCmqOCnjeCmn+CnjSB0aGUgcHJvbm91bmNlZCBbIGTJlMqPdMqDbGFudCBdIC1ycmItIHRocm91Z2ggaXMgYSBjb3VudHJ5IC4gfHx8IGxtXzA9LTU1LjI3NiBsbV8xPS02OC40ODQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0zNi43ODQgdG1fcHRfNj0tMjcuNjA0IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMi4wODIgdG1fcHRfMTA9LTIxLjkzNyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMjIxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNy4zNTAKLTc2IHx8fCBnZXJtYW55IC1scmItIGluIGdlcm1hbiA6IGRldXRzY2hsYW5kIOCmoeCmr+CmvOCmmuCnjSBvZiDgprLgpr7gpqjgp43gpp/gp40gdGhlIHByb25vdW5jZWQgWyBkyZTKj3TKg2xhbnQgXSAtcnJiLSB0aGUgaXMgYSBjb3VudHJ5IC4gfHx8IGxtXzA9LTU0LjUxOSBsbV8xPS02OC40ODQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS00MC4wMzcgdG1fcHRfNj0tMjcuMDg3IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMi4xOTMgdG1fcHRfMTA9LTIzLjkwMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMTI2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNy40MjYKLTc2IHx8fCBnZXJtYW55IC1scmItIGluIGdlcm1hbiA6IGRldXRzY2hsYW5kIOCmoeCmr+CmvOCmmuCnjSBvZiDgprLgpr7gpqjgp43gpp/gp40gdGhlIHByb25vdW5jZWQgWyBkyZTKj3TKg2xhbnQgXSAtcnJiLSB0aHJvdWdoIGlzIGEgY291bnRyeSAuIHx8fCBsbV8wPS01NS4wOTMgbG1fMT0tNjguNDg0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMzYuNzg3IHRtX3B0XzY9LTI3LjkzNCB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMjExIHRtX3B0XzEwPS0yMS4zMzggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjkxNCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgV29yZFBlbmFsdHk9LTkuNTU0IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MzcuNDMyCi03NiB8fHwgZ2VybWFueSAtbHJiLSBpbiBnZXJtYW4gOiBkZXV0c2NobGFuZCDgpqHgpq/gprzgpprgp40gb2Yg4Kay4Ka+4Kao4KeN4Kaf4KeNIG9mIHByb25vdW5jZWQgWyBkyZTKj3TKg2xhbnQgXSAtcnJiLSB0aGUgaXMgYSBjb3VudHJ5IC4gfHx8IGxtXzA9LTU0LjMzNiBsbV8xPS02OC40ODQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS00MC4wNDAgdG1fcHRfNj0tMjcuNDE3IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMi4zMjEgdG1fcHRfMTA9LTIzLjMwMSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuODE5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNy41MDgKLTc2IHx8fCBnZXJtYW55IC1scmItIGluIGdlcm1hbiA6IGRldXRzY2hsYW5kIOCmoeCmr+CmvOCmmuCnjSBvZiDgprLgpr7gpqjgp43gpp/gp40gb2YgcHJvbm91bmNlZCBbIGTJlMqPdMqDbGFudCBdIC1ycmItIHRocm91Z2ggaXMgYSBjb3VudHJ5IC4gfHx8IGxtXzA9LTU0LjkwOSBsbV8xPS02OC40ODQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0zNi43OTAgdG1fcHRfNj0tMjguMjY1IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMi4zNDAgdG1fcHRfMTA9LTIwLjczOSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNjA3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNy41MTUKLTc3IHx8fCDgppbgp43gprDgpr/gprjgp43gpp/gpqfgprDgp43gpq4gdGhlIG1haW4gcmVsaWdpb24gLiB8fHwgbG1fMD0tMTMuMzkwIGxtXzE9LTE5LjU2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS04LjY4MiB0bV9wdF82PS0zLjIyMiB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0xLjM2OCB0bV9wdF8xMD0tOC4xOTYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjgwNyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTM0LjgwNgotNzcgfHx8IOCmluCnjeCmsOCmv+CmuOCnjeCmn+Cmp+CmsOCnjeCmriBydXNzaWEgbWFpbiByZWxpZ2lvbiAuIHx8fCBsbV8wPS0xNy41NDcgbG1fMT0tMTkuNTY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTIuODY1IHRtX3B0XzY9LTMuMjU3IHRtX3B0Xzc9LTMuMDAwIHRtX3B0Xzg9LTguMTU0IHRtX3B0Xzk9LTAuMzcwIHRtX3B0XzEwPS0xLjgwMSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTAuODYxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMzUuNjg0Ci03NyB8fHwg4KaW4KeN4Kaw4Ka/4Ka44KeN4Kaf4Kan4Kaw4KeN4KauIHJ1c3NpYSB0aGUgcmVsaWdpb24gLiB8fHwgbG1fMD0tMTYuMjgxIGxtXzE9LTE5LjU2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS00LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS02LjY1MCB0bV9wdF82PS0zLjM0NCB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4wMDIgdG1fcHRfMTA9LTYuNTcyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi4zNjcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEzNi41MzEKLTc3IHx8fCDgppbgp43gprDgpr/gprjgp43gpp/gpqfgprDgp43gpq4gcnVzc2lhciBtYWluIHJlbGlnaW9uIC4gfHx8IGxtXzA9LTE4LjM2MCBsbV8xPS0xOS41NjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMi4yNDUgdG1fcHRfNj0tNS4yMDMgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC43MzYgdG1fcHRfMTA9LTAuMDA5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi4xMTQgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD00LjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEzNy41MTQKLTc4IHx8fCBidXQg4KaX4Kay4Kam4KeH4KawIGVkdWNhdGlvbiDgprDgp4vgpq7gpr7gpqjgp4DgppXgprDgpqPgp4fgprAg4KaX4Kak4Ka/IHdhcyBzbG93IGRvd24gLiB8fHwgbG1fMD0tMzAuODE5IGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS05LjM4OCB0bV9wdF82PS0zLjMwMSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4zODYgdG1fcHRfMTA9LTQuMTA4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi4wNjAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM2MS44NTEKLTc4IHx8fCBidXQg4KaX4Kay4Kam4KeH4KawIHRoZSDgprDgp4vgpq7gpr7gpqjgp4DgppXgprDgpqPgp4fgprAg4KaX4Kak4Ka/IHdhcyBzbG93IGRvd24gLiB8fHwgbG1fMD0tMjkuMzQzIGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNC44OTYgdG1fcHRfNj0tMy43MjQgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuNTAzIHRtX3B0XzEwPS04LjM0MCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuNTcwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNjIuNTk4Ci03OCB8fHwgYnV0IOCml+CmsuCmpuCnh+CmsCBhcmUg4Kaw4KeL4Kau4Ka+4Kao4KeA4KaV4Kaw4Kaj4KeH4KawIOCml+CmpOCmvyB3YXMgc2xvdyBkb3duIC4gfHx8IGxtXzA9LTI5LjYyMyBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTMuODc0IHRtX3B0XzY9LTQuODc3IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0xLjM2OCB0bV9wdF8xMD0tNy4yNTggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjY2OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzYzLjk2MAotNzggfHx8IGJ1dCDgppfgprLgpqbgp4fgprAgZWR1Y2F0aW9uIOCmsOCni+CmruCmvuCmqOCngOCmleCmsOCmo+Cnh+CmsCDgppfgpqTgpr8gd2FzIHRvbyBzbG93IC4gfHx8IGxtXzA9LTMxLjc2MCBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTAuNzMxIHRtX3B0XzY9LTMuNTI0IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0xLjAxOCB0bV9wdF8xMD0tNC4xMDggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjc1MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzY0LjExMgotNzkgfHx8IHN1YmplY3QgOiBnbnUgZm91bmRhdGlvbiB8fHwgbG1fMD0tMTEuODIyIGxtXzE9LTE2LjMwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0yLjI0NCB0bV9wdF82PS0xLjc2OCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMC42NTYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xLjY4NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIFdvcmRQZW5hbHR5PS0yLjYwNiB8fHwgLTI2LjIzMwotNzkgfHx8IGNhdGVnb3J5IDogZ251IGZvdW5kYXRpb24gfHx8IGxtXzA9LTEyLjAwMSBsbV8xPS0xNi4zMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMi4wMTIgdG1fcHRfNj0tMi4yMzggdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTAuNjQyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi4wNDcgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYgfHx8IC0yNi42OTUKLTc5IHx8fCBzdWJqZWN0LWNsYXNzIDogZ251IGZvdW5kYXRpb24gfHx8IGxtXzA9LTEyLjI4MyBsbV8xPS0xNi4zMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMS45NjYgdG1fcHRfNj0tMy43ODcgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTAuNjY5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy4wMTAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYgfHx8IC0yNy45MTMKLTc5IHx8fCBzdWJqZWN0IDogZ29udSBmb3VuZGF0aW9uIHx8fCBsbV8wPS0xMi4zMjQgbG1fMT0tMTYuMzA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTIuMTI2IHRtX3B0XzY9LTMuMzA4IHRtX3B0Xzc9LTMuMDAwIHRtX3B0Xzg9LTguMTU0IHRtX3B0Xzk9LTAuMDUwIHRtX3B0XzEwPS0wLjQ1MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMzkyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9My4wMDAgV29yZFBlbmFsdHk9LTIuNjA2IHx8fCAtMjcuOTQ5Ci03OSB8fHwgdG9waWNzIDogZ251IGZvdW5kYXRpb24gfHx8IGxtXzA9LTEyLjUxNCBsbV8xPS0xNi4zMDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMi4xMjQgdG1fcHRfNj0tNC4xMDAgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTAuNjQyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy4yMjAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYgfHx8IC0yOC40MDMKLTc5IHx8fCBjYXRlZ29yeSA6IGdvbnUgZm91bmRhdGlvbiB8fHwgbG1fMD0tMTIuNTAzIGxtXzE9LTE2LjMwNiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0xLjg5NCB0bV9wdF82PS0zLjc3OSB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjA1MCB0bV9wdF8xMD0tMC40MzcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjc1MSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIFdvcmRQZW5hbHR5PS0yLjYwNiB8fHwgLTI4LjQxMQotODAgfHx8IGVjb25vbWljIHBvbGljeSBhbmQgcmV2ZW51ZSDgpqjgp4DgpqTgpr/gppXgp4fgppMgaXQgc3R1ZHkgLiB8fHwgbG1fMD0tMjUuMzQ0IGxtXzE9LTI5LjM1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMS4zOTEgdG1fcHRfNj0tMTAuMjgzIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjM4NiB0bV9wdF8xMD0tMTEuMTk2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi44MTYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tNC4zNDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2MS43MjAKLTgwIHx8fCBlY29ub21pYyBwb2xpY3kgYW5kIHRheCDgpqjgp4DgpqTgpr/gppXgp4fgppMgaXQgc3R1ZHkgLiB8fHwgbG1fMD0tMjUuMTc4IGxtXzE9LTI5LjM1MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMS43MTAgdG1fcHRfNj0tMTAuMjgzIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjM4NiB0bV9wdF8xMD0tMTIuMTc3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi44MTYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tNC4zNDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2MS44MzAKLTgwIHx8fCBlY29ub21pYyBwb2xpY3kgYW5kIHJldmVudWUg4Kao4KeA4Kak4Ka/4KaV4KeH4KaTIHN0dWR5aW5nIGl0IC4gfHx8IGxtXzA9LTI0LjQ5OSBsbV8xPS0yOS4zNTAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTEuNTI5IHRtX3B0XzY9LTExLjYwNSB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTEwLjA5NyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMDM5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjIuNzE1Ci04MCB8fHwgZWNvbm9taWMgcG9saWN5IGFuZCBmb3Ig4Kao4KeA4Kak4Ka/4KaV4KeH4KaTIGl0IHN0dWR5IC4gfHx8IGxtXzA9LTIzLjM1OSBsbV8xPS0yOS4zNTAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTYuNjAxIHRtX3B0XzY9LTEwLjk3NiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4wMTggdG1fcHRfMTA9LTE3LjAxNSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuNTA5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjIuNzcwCi04MCB8fHwgZWNvbm9taWMgcG9saWN5IGFuZCB0YXgg4Kao4KeA4Kak4Ka/4KaV4KeH4KaTIHN0dWR5aW5nIGl0IC4gfHx8IGxtXzA9LTI0LjMzMyBsbV8xPS0yOS4zNTAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTEuODQ4IHRtX3B0XzY9LTExLjYwNSB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTExLjA3OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMDM5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjIuODI1Ci04MCB8fHwgZWNvbm9taWMgcG9saWN5IGFuZCByZXZlbnVlIOCmqOCngOCmpOCmv+CmleCnh+CmkyB0aGlzIHN0dWR5IC4gfHx8IGxtXzA9LTI1LjE4OSBsbV8xPS0yOS4zNTAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTIuOTg1IHRtX3B0XzY9LTExLjIzMCB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS4zODYgdG1fcHRfMTA9LTEzLjEyOSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuNDQ5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjIuODgyCi04MCB8fHwgZWNvbm9taWMgcG9saWN5IHRheCBhbmQg4Kao4KeA4Kak4Ka/4KaV4KeH4KaTIGl0IHN0dWR5IC4gfHx8IGxtXzA9LTI0LjU5MiBsbV8xPS0yOS4zNTAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTEuNzEwIHRtX3B0XzY9LTEwLjI4MyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4wMTggdG1fcHRfMTA9LTEyLjg3MCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuODI4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjMuMTI1Ci04MCB8fHwgZWNvbm9taWMgcG9saWN5IGFuZCDgpqjgp4DgpqTgpr/gppXgp4fgppMgZm9yIGl0IHN0dWR5IC4gfHx8IGxtXzA9LTIzLjE4NyBsbV8xPS0yOS4zNTAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTYuNjAxIHRtX3B0XzY9LTEwLjk3NiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4wMTggdG1fcHRfMTA9LTE2LjA0OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuNjI3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjMuMzEyCi04MSB8fHwgYW1vbmcgdGhlbSBhcmUgOiBtYXkgYmUg4Kak4KeL4Kau4Ka+4KawIGdldCBzZWVuIOCmk+CmsOCnhyB0aGlzIGFueSDgprjgp43gpqjgp4fgprkt4Ka44KeB4Kaw4Kan4KeB4Kao4KeAIC4gfHx8IGxtXzA9LTQxLjE2NCBsbV8xPS00OC45MTcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMjYuMzUwIHRtX3B0XzY9LTE2LjUxNiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS43MzYgdG1fcHRfMTA9LTYuNjIzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4yNDAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzk3LjY5NwotODEgfHx8IGFtb25nIHRoZXNlIGFyZSA6IG1heSBiZSDgpqTgp4vgpq7gpr7gprAgZ2V0IHNlZW4g4KaT4Kaw4KeHIHRoaXMgYW55IOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgbG1fMD0tNDEuMzk4IGxtXzE9LTQ4LjkxNyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0yNy4yOTMgdG1fcHRfNj0tMTYuNTQ4IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0zLjAwMCB0bV9wdF8xMD0tNy45OTkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjQ5MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTcuNzk4Ci04MSB8fHwgYW1vbmcgdGhlbSBhcmUgOiBtYXkgYmUg4Kak4KeL4Kau4Ka+4KawIGdldCBpcyDgppPgprDgp4cgdGhpcyBhbnkg4Ka44KeN4Kao4KeH4Ka5LeCmuOCngeCmsOCmp+CngeCmqOCngCAuIHx8fCBsbV8wPS0zOS41OTUgbG1fMT0tNDguOTE3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTMwLjMwNSB0bV9wdF82PS0xNy4wNjkgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTEuNzM4IHRtX3B0XzEwPS0xMC42NDIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02Ljc3OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTcuOTM3Ci04MSB8fHwgYW1vbmcgdGhlc2UgYXJlIDogbWF5IGJlIOCmpOCni+CmruCmvuCmsCBnZXQgaXMg4KaT4Kaw4KeHIHRoaXMgYW55IOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgbG1fMD0tMzkuODI5IGxtXzE9LTQ4LjkxNyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0zMS4yNDggdG1fcHRfNj0tMTcuMTAxIHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0zLjAwMiB0bV9wdF8xMD0tMTIuMDE3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4wMzIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzk4LjAzOAotODEgfHx8IGFtb25nIHRoZW0gYXJlIDogd291bGQgaGF2ZSDgpqTgp4vgpq7gpr7gprAgZ2V0IHNlZW4g4KaT4Kaw4KeHIHRoaXMgYW55IOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgbG1fMD0tNDIuMTY3IGxtXzE9LTQ4LjkxNyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yNC42OTIgdG1fcHRfNj0tMTUuOTU2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tNi42MjMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjUyNyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTguMDg2Ci04MSB8fHwgYW1vbmcgdGhlc2UgYXJlIDogd291bGQgaGF2ZSDgpqTgp4vgpq7gpr7gprAgZ2V0IHNlZW4g4KaT4Kaw4KeHIHRoaXMgYW55IOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgbG1fMD0tNDIuNDAxIGxtXzE9LTQ4LjkxNyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0yNS42MzUgdG1fcHRfNj0tMTUuOTg5IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0zLjAwMCB0bV9wdF8xMD0tNi42MTMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjQ5MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTguMTcyCi04MSB8fHwgYW1vbmcgdGhlbSBhcmUgOiBtYXkgYmUg4Kak4KeL4Kau4Ka+4KawIG51bWJlcnMgaXMg4KaT4Kaw4KeHIHRoaXMgYW55IOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgbG1fMD0tMzkuMTU5IGxtXzE9LTQ4LjkxNyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0zMC42NDUgdG1fcHRfNj0tMTcuMDY5IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0xLjczOCB0bV9wdF8xMD0tMTMuNDA4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi43NzkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzk4LjE3OAotODEgfHx8IGFtb25nIHRoZW0gYXJlIDogd291bGQgaGF2ZSDgpqTgp4vgpq7gpr7gprAgZ2V0IGlzIOCmk+CmsOCnhyB0aGlzIGFueSDgprjgp43gpqjgp4fgprkt4Ka44KeB4Kaw4Kan4KeB4Kao4KeAIC4gfHx8IGxtXzA9LTQwLjU5OSBsbV8xPS00OC45MTcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjguNjQ3IHRtX3B0XzY9LTE2LjUwOSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4zNzAgdG1fcHRfMTA9LTEwLjY0MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuMDY2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5OC4zMjYKLTgxIHx8fCBhbW9uZyB0aGVtIGFyZSA6IG1heSBiZSDgpqTgp4vgpq7gpr7gprAgZ2V0IHNlZW4g4KaT4Kaw4KeHIHRoaXMgbm8g4Ka44KeN4Kao4KeH4Ka5LeCmuOCngeCmsOCmp+CngeCmqOCngCAuIHx8fCBsbV8wPS00MS4xNDcgbG1fMT0tNDguOTE3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTI2LjY1OCB0bV9wdF82PS0xNy4xMjMgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTEuNzM2IHRtX3B0XzEwPS02LjY3NyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuMjg1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5OC4zMjYKLTgxIHx8fCBhbW9uZyB0aGVzZSBhcmUgOiBtYXkgYmUg4Kak4KeL4Kau4Ka+4KawIGdldCBzZWVuIOCmk+CmsOCnhyB0aGlzIG5vIOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgbG1fMD0tNDEuMzgxIGxtXzE9LTQ4LjkxNyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0yNy42MDAgdG1fcHRfNj0tMTcuMTU1IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0zLjAwMCB0bV9wdF8xMD0tOC4wNTIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjUzOCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTguNDI4Ci04MiB8fHwgb24gMjNyZCBhcHJpbCAxOTkyIHNhdHlhaml0IGRpZWQgLiB8fHwgbG1fMD0tMTQuMzk0IGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS03LjU0NCB0bV9wdF82PS0xMi4xNjcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTEuMzY5IHRtX3B0XzEwPS0zLjk2OSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMTgwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IHx8fCAtNDUuMzM1Ci04MiB8fHwgb24gMjNyZCBhcHJpbCAxOTkyIHNhdHlhaml0IGV4cGlyZWQgLiB8fHwgbG1fMD0tMTQuNjU5IGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS02LjI5MSB0bV9wdF82PS0xMy41NTMgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTIuMDAxIHRtX3B0XzEwPS0xLjUxNyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuMzU4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9My4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IHx8fCAtNDUuNjUzCi04MiB8fHwgc2F0eWFqaXQgZGllZCBvbiAyM3JkIGFwcmlsIDE5OTIgLiB8fHwgbG1fMD0tMTQuMTcxIGxtXzE9LTI2LjA4OSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS03LjU0NCB0bV9wdF82PS0xMi4xNjcgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTIuMzY5IHRtX3B0XzEwPS00LjUyMiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuNDg3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgV29yZFBlbmFsdHk9LTMuOTA5IHx8fCAtNDguMjYwCi04MyB8fHwgdGhpcyB0aW1lIG5henJ1bCBtZWRpY2FsIOCmsOCmv+CmquCni+CmsOCnjeCmnyBzdGF5IGZhbW91cyDgpprgpr/gppXgpr/gp47gprjgppXgpqbgp4fgprAgdG8gc2VudCAuIHx8fCBsbV8wPS0zNy4yNTYgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE2LjAzMCB0bV9wdF82PS0xNi42NTMgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMDUyIHRtX3B0XzEwPS0xMy45NjMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjM4OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ni4xOTcKLTgzIHx8fCB0aGlzIHRpbWUgbmF6cnVsIG1lZGljYWwg4Kaw4Ka/4Kaq4KeL4Kaw4KeN4KafIHNlbnQgdG8gc3RheSBmYW1vdXMg4Kaa4Ka/4KaV4Ka/4KeO4Ka44KaV4Kam4KeH4KawIC4gfHx8IGxtXzA9LTM0LjAwNCBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTYuMDMwIHRtX3B0XzY9LTE2LjY1MyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi40MjAgdG1fcHRfMTA9LTEyLjEzMiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuMzMzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODYuMjYzCi04MyB8fHwgdGhpcyB0aW1lIG5henJ1bCBtZWRpY2FsIOCmsOCmv+CmquCni+CmsOCnjeCmnyBzdGF5IGZhbW91cyBzZW50IHRvIOCmmuCmv+CmleCmv+CnjuCmuOCmleCmpuCnh+CmsCAuIHx8fCBsbV8wPS0zNS43NTYgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTE2LjAzMCB0bV9wdF82PS0xNi42NTMgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuNDIwIHRtX3B0XzEwPS0xMS44MDEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjIzNiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg2LjM0NQotODMgfHx8IHRoaXMgdGltZSBuYXpydWwgbWVkaWNhbCDgprDgpr/gpqrgp4vgprDgp43gpp8gc3RheSBmYW1vdXMg4Kaa4Ka/4KaV4Ka/4KeO4Ka44KaV4Kam4KeH4KawIHRvIHNlbmQgdG8gLiB8fHwgbG1fMD0tMzcuMjc1IGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xOS4xNDMgdG1fcHRfNj0tMTEuMjQ4IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjA1MiB0bV9wdF8xMD0tMTEuNjYwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4zODkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg2LjQ3MwotODMgfHx8IHRoaXMgdGltZSBuYXpydWwgbWVkaWNhbCDgprDgpr/gpqrgp4vgprDgp43gpp8gZWFybmluZyBmYW1vdXMg4Kaa4Ka/4KaV4Ka/4KeO4Ka44KaV4Kam4KeH4KawIHRvIHNlbnQgLiB8fHwgbG1fMD0tMzcuMTQ3IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xNy4wMjAgdG1fcHRfNj0tMTcuNzUyIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjA1MiB0bV9wdF8xMD0tMTMuNDUyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4zODkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODYuNDkzCi04MyB8fHwgdGhpcyB0aW1lIG5henJ1bCBtZWRpY2FsIOCmsOCmv+CmquCni+CmsOCnjeCmnyBzdGF5IGZhbW91cyDgpprgpr/gppXgpr/gp47gprjgppXgpqbgp4fgprAgdG8gc2VuZCAuIHx8fCBsbV8wPS0zNS43ODcgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE1LjQ2MiB0bV9wdF82PS0xMy4zNTUgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTEuMTUyIHRtX3B0XzEwPS0xOS44ODUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01Ljc2MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg2LjU1NAotODMgfHx8IHRoaXMgdGltZSBuYXpydWwgbWVkaWNhbCDgprDgpr/gpqrgp4vgprDgp43gpp8gc3RheSBmYW1vdXMg4Kaa4Ka/4KaV4Ka/4KeO4Ka44KaV4Kam4KeH4KawIHRvIHNlbnQgdG8gLiB8fHwgbG1fMD0tMzguMjIxIGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xOS4wNjUgdG1fcHRfNj0tMTAuOTA3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0xLjE4OCB0bV9wdF8xMD0tMTIuMzU0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4yOTAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg2LjU5NAotODMgfHx8IHRoaXMgdGltZSBuYXpydWwgbWVkaWNhbCDgprDgpr/gpqrgp4vgprDgp43gpp8gZWFybmluZyBmYW1vdXMg4Kaa4Ka/4KaV4Ka/4KeO4Ka44KaV4Kam4KeH4KawIHRvIHNlbmQgdG8gLiB8fHwgbG1fMD0tMzcuMTY2IGxtXzE9LTQyLjM5NSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMC4xMzIgdG1fcHRfNj0tMTIuMzQ3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjA1MiB0bV9wdF8xMD0tMTEuMTUwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4zODkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg2Ljc3MAotODMgfHx8IHRoaXMgdGltZSBuYXpydWwgbWVkaWNhbCDgprDgpr/gpqrgp4vgprDgp43gpp8gZWFybmluZyBmYW1vdXMg4Kaa4Ka/4KaV4Ka/4KeO4Ka44KaV4Kam4KeH4KawIHRvIHNlbmQgLiB8fHwgbG1fMD0tMzUuNjc4IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xNi40NTEgdG1fcHRfNj0tMTQuNDU0IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0xLjE1MiB0bV9wdF8xMD0tMTkuMzc0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS43NjMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ni44NTEKLTgzIHx8fCB0aGlzIHRpbWUgbmF6cnVsIG1lZGljYWwg4Kaw4Ka/4Kaq4KeL4Kaw4KeN4KafIGVhcm5pbmcgZmFtb3VzIOCmmuCmv+CmleCmv+CnjuCmuOCmleCmpuCnh+CmsCB0byBzZW50IHRvIC4gfHx8IGxtXzA9LTM4LjExMiBsbV8xPS00Mi4zOTUgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjAuMDU1IHRtX3B0XzY9LTEyLjAwNiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS4xODggdG1fcHRfMTA9LTExLjg0MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMjkwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ni44OTAKLTg0IHx8fCBhY3RlZCBpbiBkaWZmZXJlbnQgdGltZXMgcmFuaSDgpq7gp4Hgppbgpr7gprDgp43gppzgp4AgZGlmZmVyZW50IOCmpuCmvuCmpOCmrOCnjeCmryBhcmUgY29ubmVjdGVkIHdpdGgg4Kal4KeH4KaV4KeH4Kab4KeH4KaoIC4gfHx8IGxtXzA9LTQwLjk1OCBsbV8xPS00NS42NTYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjIuMzgwIHRtX3B0XzY9LTE0LjU0OSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMy40MjQgdG1fcHRfMTA9LTEzLjU2MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNTkxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tNi41MTQgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5Ni4yNTMKLTg0IHx8fCBhY3RpbmcgaW4gZGlmZmVyZW50IHRpbWVzIHJhbmkg4Kau4KeB4KaW4Ka+4Kaw4KeN4Kac4KeAIGRpZmZlcmVudCDgpqbgpr7gpqTgpqzgp43gpq8gYXJlIGNvbm5lY3RlZCB3aXRoIOCmpeCnh+CmleCnh+Cmm+Cnh+CmqCAuIHx8fCBsbV8wPS00MC45MjQgbG1fMT0tNDUuNjU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIzLjAzMiB0bV9wdF82PS0xNS40MTQgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTMuNTUzIHRtX3B0XzEwPS0xNC4zNzMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjI4NCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTcuMTkyCi04NCB8fHwgYWN0ZWQgaW4gZGlmZmVyZW50IHRpbWUgcmFuaSDgpq7gp4Hgppbgpr7gprDgp43gppzgp4AgZGlmZmVyZW50IOCmpuCmvuCmpOCmrOCnjeCmryBhcmUgY29ubmVjdGVkIHdpdGgg4Kal4KeH4KaV4KeH4Kab4KeH4KaoIC4gfHx8IGxtXzA9LTQyLjE4NyBsbV8xPS00NS42NTYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjIuNjAyIHRtX3B0XzY9LTEzLjAzMyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMy40MjQgdG1fcHRfMTA9LTEzLjU2MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNTkxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBXb3JkUGVuYWx0eT0tNi41MTQgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5Ny4yOTcKLTg0IHx8fCBhY3RlZCBpbiBkaWZmZXJlbnQgdGltZXMgcmFuaSDgpq7gp4Hgppbgpr7gprDgp43gppzgp4AgdmFyaW91cyDgpqbgpr7gpqTgpqzgp43gpq8gYXJlIGNvbm5lY3RlZCB3aXRoIOCmpeCnh+CmleCnh+Cmm+Cnh+CmqCAuIHx8fCBsbV8wPS00MS40MDkgbG1fMT0tNDUuNjU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIyLjM5NiB0bV9wdF82PS0xNS43NzEgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTMuNDI0IHRtX3B0XzEwPS0xMy41MDAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03Ljc3NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTcuNjM1Ci04NCB8fHwgZGlmZmVyZW50IHRpbWVzICwgYWN0ZWQgcmFuaSDgpq7gp4Hgppbgpr7gprDgp43gppzgp4AgZGlmZmVyZW50IOCmpuCmvuCmpOCmrOCnjeCmryBhcmUgY29ubmVjdGVkIHdpdGgg4Kal4KeH4KaV4KeH4Kab4KeH4KaoIC4gfHx8IGxtXzA9LTQxLjc3NyBsbV8xPS00NS42NTYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjIuNTkxIHRtX3B0XzY9LTEzLjcwMiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMy4xNTMgdG1fcHRfMTA9LTE0LjI4OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuOTA1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzk3Ljk2MQotODQgfHx8IGFjdGVkICwgZGlmZmVyZW50IHRpbWVzIHJhbmkg4Kau4KeB4KaW4Ka+4Kaw4KeN4Kac4KeAIGRpZmZlcmVudCDgpqbgpr7gpqTgpqzgp43gpq8gYXJlIGNvbm5lY3RlZCB3aXRoIOCmpeCnh+CmleCnh+Cmm+Cnh+CmqCAuIHx8fCBsbV8wPS00My4wNTYgbG1fMT0tNDUuNjU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIyLjU5MSB0bV9wdF82PS0xMy43MDIgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuNzkyIHRtX3B0XzEwPS0xNC41NzYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01Ljg5NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTguMDk5Ci04NCB8fHwgaW4gZGlmZmVyZW50IHRpbWVzIGFjdGVkIHJhbmkg4Kau4KeB4KaW4Ka+4Kaw4KeN4Kac4KeAIGRpZmZlcmVudCDgpqbgpr7gpqTgpqzgp43gpq8gYXJlIGNvbm5lY3RlZCB3aXRoIOCmpeCnh+CmleCnh+Cmm+Cnh+CmqCAuIHx8fCBsbV8wPS00MS40NjYgbG1fMT0tNDUuNjU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTIyLjM4MCB0bV9wdF82PS0xNC41NDkgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTMuNzg2IHRtX3B0XzEwPS0xMi40ODQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjY1NSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNi41MTQgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5OC4xNDIKLTg1IHx8fCBiZW5nYWxpIGxpdGVyYXR1cmUgYW5kIGN1bHR1cmUgYSBzcGVjaWFsIGNvbnRyaWJ1dGlvbiBvbiDgprjgp43gpqzgp4DgppXgp4PgpqTgpr/gprjgp43gpqzgprDgp4HgpqogeWVhciBvbiA5dGggZGVjZW1iZXIgLCBkaGFrYSB1bml2ZXJzaXR5IGhlIGhvbm9yYXJ5IOCmoeCmvy7gprLgpr/gpp8g4KaJ4Kaq4Ka+4Kan4Ka/4Kak4KeHIGF3YXJkZWQgd2l0aCAuIHx8fCBsbV8wPS02Mi4wODAgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTUuNTkxIHRtX3B0XzY9LTI2Ljk3NyB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTQuMTA2IHRtX3B0XzEwPS0yNi40NjAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjYxMyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDU5LjMyNwotODUgfHx8IGJlbmdhbGkgbGl0ZXJhdHVyZSBhbmQgY3VsdHVyZSBhIHNwZWNpYWwgY29udHJpYnV0aW9uIG9uIOCmuOCnjeCmrOCngOCmleCng+CmpOCmv+CmuOCnjeCmrOCmsOCngeCmqiB5ZWFyIG9uIDl0aCBkZWNlbWJlciAsIGRoYWthIHVuaXZlcnNpdHkgd2FzIGhvbm9yYXJ5IOCmoeCmvy7gprLgpr/gpp8g4KaJ4Kaq4Ka+4Kan4Ka/4Kak4KeHIGF3YXJkZWQgd2l0aCAuIHx8fCBsbV8wPS02MC43MzQgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTYuNjIxIHRtX3B0XzY9LTI3LjE5OCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTQuNDc0IHRtX3B0XzEwPS0yOC4zODggdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjMxOCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDU5LjMzOQotODUgfHx8IGJlbmdhbGkgbGl0ZXJhdHVyZSBhbmQgY3VsdHVyZSBoaXMgc3BlY2lhbCBjb250cmlidXRpb24gb24g4Ka44KeN4Kas4KeA4KaV4KeD4Kak4Ka/4Ka44KeN4Kas4Kaw4KeB4KaqIHllYXIgb24gOXRoIGRlY2VtYmVyICwgZGhha2EgdW5pdmVyc2l0eSBoZSBob25vcmFyeSDgpqHgpr8u4Kay4Ka/4KafIOCmieCmquCmvuCmp+Cmv+CmpOCnhyBhd2FyZGVkIHdpdGggLiB8fHwgbG1fMD0tNjQuMTY2IGxtXzE9LTc4LjI2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTUwLjE3NiB0bV9wdF82PS0yMi42MTcgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS0zLjczOCB0bV9wdF8xMD0tMjYuNTg1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy45MjUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQ1OS40MTMKLTg1IHx8fCBiZW5nYWxpIGxpdGVyYXR1cmUgYW5kIGN1bHR1cmUgaGlzIHNwZWNpYWwgY29udHJpYnV0aW9uIG9uIOCmuOCnjeCmrOCngOCmleCng+CmpOCmv+CmuOCnjeCmrOCmsOCngeCmqiB5ZWFyIG9uIDl0aCBkZWNlbWJlciAsIGRoYWthIHVuaXZlcnNpdHkgd2FzIGhvbm9yYXJ5IOCmoeCmvy7gprLgpr/gpp8g4KaJ4Kaq4Ka+4Kan4Ka/4Kak4KeHIGF3YXJkZWQgd2l0aCAuIHx8fCBsbV8wPS02Mi44MjAgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE0LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNTEuMjA1IHRtX3B0XzY9LTIyLjgzOCB0bV9wdF83PS0xNC4wMDAgdG1fcHRfOD0tMzguMDUyIHRtX3B0Xzk9LTQuMTA2IHRtX3B0XzEwPS0yOC41MTQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjYzMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDU5LjQyNQotODUgfHx8IGJlbmdhbGkgbGl0ZXJhdHVyZSBhbmQgY3VsdHVyZSBpbiBzcGVjaWFsIGNvbnRyaWJ1dGlvbiBvbiDgprjgp43gpqzgp4DgppXgp4PgpqTgpr/gprjgp43gpqzgprDgp4HgpqogeWVhciBvbiA5dGggZGVjZW1iZXIgLCBkaGFrYSB1bml2ZXJzaXR5IGhlIGhvbm9yYXJ5IOCmoeCmvy7gprLgpr/gpp8g4KaJ4Kaq4Ka+4Kan4Ka/4Kak4KeHIGF3YXJkZWQgd2l0aCAuIHx8fCBsbV8wPS02MS45OTkgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE0LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNTQuMjQwIHRtX3B0XzY9LTI0Ljg2NyB0bV9wdF83PS0xNC4wMDAgdG1fcHRfOD0tMzguMDUyIHRtX3B0Xzk9LTMuNzM4IHRtX3B0XzEwPS0yOS43NTUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjU0OSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDYwLjAyOQotODUgfHx8IGJlbmdhbGkgbGl0ZXJhdHVyZSBhbmQgY3VsdHVyZSBpbiBzcGVjaWFsIGNvbnRyaWJ1dGlvbiBvbiDgprjgp43gpqzgp4DgppXgp4PgpqTgpr/gprjgp43gpqzgprDgp4HgpqogeWVhciBvbiA5dGggZGVjZW1iZXIgLCBkaGFrYSB1bml2ZXJzaXR5IHdhcyBob25vcmFyeSDgpqHgpr8u4Kay4Ka/4KafIOCmieCmquCmvuCmp+Cmv+CmpOCnhyBhd2FyZGVkIHdpdGggLiB8fHwgbG1fMD0tNjAuNjUzIGxtXzE9LTc4LjI2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTU1LjI2OSB0bV9wdF82PS0yNS4wODggdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS00LjEwNiB0bV9wdF8xMD0tMzEuNjg0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOC4yNTMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQ2MC4wNDEKLTg1IHx8fCBiZW5nYWxpIGxpdGVyYXR1cmUgYW5kIGN1bHR1cmUgYSBzcGVjaWFsIGNvbnRyaWJ1dGlvbiBvbiDgprjgp43gpqzgp4DgppXgp4PgpqTgpr/gprjgp43gpqzgprDgp4HgpqogeWVhciBvbiA5dGggZGVjZW1iZXIgLCBkaGFrYSB1bml2ZXJzaXR5IGhlIGhvbm9yYXJ5IOCmoeCmvy7gprLgpr/gpp8g4KaJ4Kaq4Ka+4Kan4Ka/4Kak4KeHIGF3YXJkZWQgd2l0aCB0aGUgLiB8fHwgbG1fMD0tNjIuOTUwIGxtXzE9LTgxLjUyOCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTQuMDAwIHRtX3B0XzU9LTU4Ljc5OSB0bV9wdF82PS0yNS4xOTEgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS00LjEwNiB0bV9wdF8xMD0tMjIuNTg3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy43ODYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTcuMDAwIFdvcmRQZW5hbHR5PS0xMS4yOTIgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQ2MC4yMzkKLTg1IHx8fCBiZW5nYWxpIGxpdGVyYXR1cmUgYW5kIGN1bHR1cmUgYSBzcGVjaWFsIGNvbnRyaWJ1dGlvbiBvbiDgprjgp43gpqzgp4DgppXgp4PgpqTgpr/gprjgp43gpqzgprDgp4HgpqogeWVhciBvbiA5dGggZGVjZW1iZXIgLCBkaGFrYSB1bml2ZXJzaXR5IHdhcyBob25vcmFyeSDgpqHgpr8u4Kay4Ka/4KafIOCmieCmquCmvuCmp+Cmv+CmpOCnhyBhd2FyZGVkIHdpdGggdGhlIC4gfHx8IGxtXzA9LTYxLjYwNCBsbV8xPS04MS41MjggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE0LjAwMCB0bV9wdF81PS01OS44MjggdG1fcHRfNj0tMjUuNDEyIHRtX3B0Xzc9LTE0LjAwMCB0bV9wdF84PS0zOC4wNTIgdG1fcHRfOT0tNC40NzQgdG1fcHRfMTA9LTI0LjUxNiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuNDkwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE3LjAwMCBXb3JkUGVuYWx0eT0tMTEuMjkyIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00NjAuMjUxCi04NSB8fHwgYmVuZ2FsaSBsaXRlcmF0dXJlIGFuZCBjdWx0dXJlIGl0cyBzcGVjaWFsIGNvbnRyaWJ1dGlvbiBvbiDgprjgp43gpqzgp4DgppXgp4PgpqTgpr/gprjgp43gpqzgprDgp4HgpqogeWVhciBvbiA5dGggZGVjZW1iZXIgLCBkaGFrYSB1bml2ZXJzaXR5IGhlIGhvbm9yYXJ5IOCmoeCmvy7gprLgpr/gpp8g4KaJ4Kaq4Ka+4Kan4Ka/4Kak4KeHIGF3YXJkZWQgd2l0aCAuIHx8fCBsbV8wPS02My43NjYgbG1fMT0tNzguMjY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTE0LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNTEuMDY1IHRtX3B0XzY9LTI0LjU3OSB0bV9wdF83PS0xNC4wMDAgdG1fcHRfOD0tMzguMDUyIHRtX3B0Xzk9LTMuNzM4IHRtX3B0XzEwPS0yNy4wNTUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjkzMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDYwLjU5MAotODUgfHx8IGJlbmdhbGkgbGl0ZXJhdHVyZSBhbmQgY3VsdHVyZSBpdHMgc3BlY2lhbCBjb250cmlidXRpb24gb24g4Ka44KeN4Kas4KeA4KaV4KeD4Kak4Ka/4Ka44KeN4Kas4Kaw4KeB4KaqIHllYXIgb24gOXRoIGRlY2VtYmVyICwgZGhha2EgdW5pdmVyc2l0eSB3YXMgaG9ub3Jhcnkg4Kah4Ka/LuCmsuCmv+CmnyDgpongpqrgpr7gpqfgpr/gpqTgp4cgYXdhcmRlZCB3aXRoIC4gfHx8IGxtXzA9LTYyLjQyMCBsbV8xPS03OC4yNjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS01Mi4wOTQgdG1fcHRfNj0tMjQuODAwIHRtX3B0Xzc9LTE0LjAwMCB0bV9wdF84PS0zOC4wNTIgdG1fcHRfOT0tNC4xMDYgdG1fcHRfMTA9LTI4Ljk4MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuNjM0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00NjAuNjAyCi04NiB8fHwga29sa2F0YSBkdXJnYSBwdWphIGNpdHkgb2YgdG91cmlzbSDgpobgppXgprDgp43gprfgpqPgppMgaXMgYWxzbyBhIHJlYXNvbiB8fHwgbG1fMD0tMjguODI0IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0zOC4zNDggdG1fcHRfNj0tMTguMTI2IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0yLjEzNSB0bV9wdF8xMD0tMTEuMzA2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS44NzggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODAuMzgwCi04NiB8fHwga29sa2F0YSBkdXJnYSBwdWphIG9mIHRoZSB0b3VyaXNtIOCmhuCmleCmsOCnjeCmt+Cmo+CmkyBpcyBhbHNvIGEgcmVhc29uIHx8fCBsbV8wPS0yNi4zODUgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTQxLjgzMSB0bV9wdF82PS0xNy44MDcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMjcxIHRtX3B0XzEwPS0xNS44OTYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02Ljk0NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4MC41NjQKLTg2IHx8fCBrb2xrYXRhIGR1cmdhIHB1amEgdG91cmlzbSBvZiB0aGUg4KaG4KaV4Kaw4KeN4Ka34Kaj4KaTIGlzIGFsc28gYSByZWFzb24gfHx8IGxtXzA9LTI2Ljc1MiBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tNDEuODMxIHRtX3B0XzY9LTE3LjgwNyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4xODUgdG1fcHRfMTA9LTExLjcyMiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuODI5IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgwLjgyMwotODYgfHx8IHRoZSBkdXJnYSBwdWphIGNpdHkgb2YgdG91cmlzbSDgpobgppXgprDgp43gprfgpqPgppMgaXMgYWxzbyBhIHJlYXNvbiB8fHwgbG1fMD0tMjguMzkyIGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS00Mi4wNTYgdG1fcHRfNj0tMTguMjE2IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0yLjEzNSB0bV9wdF8xMD0tMTMuNDA0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS40NzMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODAuOTg2Ci04NiB8fHwgdGhlIGR1cmdhIHB1amEgb2YgdGhlIHRvdXJpc20g4KaG4KaV4Kaw4KeN4Ka34Kaj4KaTIGlzIGFsc28gYSByZWFzb24gfHx8IGxtXzA9LTI1Ljk1MyBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tNDUuNTM4IHRtX3B0XzY9LTE3Ljg5NyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4yNzEgdG1fcHRfMTA9LTE3Ljk5NCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuNTQyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgxLjE2OQotODYgfHx8IHRoZSBkdXJnYSBwdWphIHRvdXJpc20gb2YgdGhlIOCmhuCmleCmsOCnjeCmt+Cmo+CmkyBpcyBhbHNvIGEgcmVhc29uIHx8fCBsbV8wPS0yNi4zMTkgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTQ1LjUzOCB0bV9wdF82PS0xNy44OTcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMTg1IHRtX3B0XzEwPS0xMy44MjAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjQyNCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4MS40MjkKLTg2IHx8fCB0b3VyaXNtIG9mIGtvbGthdGEgZHVyZ2EgcHVqYSB0aGUg4KaG4KaV4Kaw4KeN4Ka34Kaj4KaTIGlzIGFsc28gYSByZWFzb24gfHx8IGxtXzA9LTI2LjA4NyBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tNDEuODMxIHRtX3B0XzY9LTE3LjgwNyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4wNjggdG1fcHRfMTA9LTEwLjkwOSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTYuMjg2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgxLjQzMAotODYgfHx8IHRvdXJpc20gb2Yga29sa2F0YSBkdXJnYSBwdWphIGNpdHkg4KaG4KaV4Kaw4KeN4Ka34Kaj4KaTIGlzIGFsc28gYSByZWFzb24gfHx8IGxtXzA9LTI3LjMzNCBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMzguMzQ4IHRtX3B0XzY9LTE4LjEyNiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4wNjggdG1fcHRfMTA9LTguNjEwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS41OTMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9My4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODEuNTc0Ci04NiB8fHwga29sa2F0YSBkdXJnYSBwdWphIHRvdXJpc20gb2YgY2l0eSDgpobgppXgprDgp43gprfgpqPgppMgaXMgYWxzbyBhIHJlYXNvbiB8fHwgbG1fMD0tMjguNzkwIGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0zOC4zNDggdG1fcHRfNj0tMTguMTI2IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0yLjE4NSB0bV9wdF8xMD0tOC4yMjkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjIwNSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4MS42NjIKLTg2IHx8fCBrb2xrYXRhIGR1cmdhIHB1amEgY2l0eSBvZiB0b3VyaXNtIOCmhuCmleCmsOCnjeCmt+Cmo+CmkyDgpqzgpp/gp4cgLiB8fHwgbG1fMD0tMjguMTQ0IGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xMS4xOTIgdG1fcHRfNj0tNi40OTYgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTEuMTM1IHRtX3B0XzEwPS0xMS4zMTUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01Ljg4MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjY0LjY3NgotODcgfHx8IGJ1dCBtYW55IG9mIGVhc3QgZ2VybWFuIHN0YXJ0ZWQgbGl2aW5nIGluIGVjb25vbWljYWxseSByZWFjaCBhbmQgZGVtb2NyYXRpYyB3ZXN0IGdlcm1hbnkgLCBlYXN0IGdlcm1hbnkgZ292ZXJubWVudCBidWlsdCBhIHdhbGwgaW4gYmVybGluIGluIDE5NjEgYW5kIHJlaW5mb3JjZWQgaXRzIGJvdW5kYXJpZXMgLiB8fHwgbG1fMD0tNDkuMTU0IGxtXzE9LTEwMC41NjMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tNzMuODAyIHRtX3B0XzY9LTUzLjc1NyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMy4wMDcgdG1fcHRfMTA9LTcuMTc1IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS44NjkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgV29yZFBlbmFsdHk9LTEzLjg5NyB8fHwgLTE2Mi42NjgKLTg3IHx8fCBidXQgbWFueSBvZiBlYXN0IGdlcm1hbnkgc3RhcnRlZCBsaXZpbmcgaW4gZWNvbm9taWNhbGx5IHJlYWNoIGFuZCBkZW1vY3JhdGljIHdlc3QgZ2VybWFueSAsIGVhc3QgZ2VybWFueSBnb3Zlcm5tZW50IGJ1aWx0IGEgd2FsbCBpbiBiZXJsaW4gaW4gMTk2MSBhbmQgcmVpbmZvcmNlZCBpdHMgYm91bmRhcmllcyAuIHx8fCBsbV8wPS00Ny42MzcgbG1fMT0tMTAwLjU2MyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS03Ny4wNzUgdG1fcHRfNj0tNTYuNTY1IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS00LjAwNyB0bV9wdF8xMD0tOS44ODQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjU2MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTMwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD03LjAwMCBXb3JkUGVuYWx0eT0tMTMuODk3IHx8fCAtMTY0LjMzNQotODcgfHx8IGJ1dCB3aGVuIGxha2hzIGVhc3QgZ2VybWFuIHN0YXJ0ZWQgbGl2aW5nIGluIGVjb25vbWljYWxseSByZWFjaCBhbmQgZGVtb2NyYXRpYyB3ZXN0IGdlcm1hbnkgLCBlYXN0IGdlcm1hbnkgZ292ZXJubWVudCBidWlsdCBhIHdhbGwgaW4gYmVybGluIGluIDE5NjEgYW5kIHJlaW5mb3JjZWQgaXRzIGJvdW5kYXJpZXMgLiB8fHwgbG1fMD0tNTEuODg5IGxtXzE9LTEwMC41NjMgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tNzEuMzM1IHRtX3B0XzY9LTU3LjM4OSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMy4zNjggdG1fcHRfMTA9LTAuNzQ3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS4yNjkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0zMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTEzLjg5NyB8fHwgLTE2NS4wNDgKLTg3IHx8fCBidXQgd2hlbiBvZiBlYXN0IGdlcm1hbiBzdGFydGVkIGxpdmluZyBpbiBlY29ub21pY2FsbHkgcmVhY2ggYW5kIGRlbW9jcmF0aWMgd2VzdCBnZXJtYW55ICwgZWFzdCBnZXJtYW55IGdvdmVybm1lbnQgYnVpbHQgYSB3YWxsIGluIGJlcmxpbiBpbiAxOTYxIGFuZCByZWluZm9yY2VkIGl0cyBib3VuZGFyaWVzIC4gfHx8IGxtXzA9LTUwLjExMyBsbV8xPS0xMDAuNTYzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTc2Ljg5MiB0bV9wdF82PS01Ny40NzEgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTMuMzc1IHRtX3B0XzEwPS01LjEwMyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuNjc0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMzAuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS0xMy44OTcgfHx8IC0xNjUuMjE5Ci04NyB8fHwgYnV0IG1hbnkgbGFraHMgZWFzdCBnZXJtYW4gc3RhcnRlZCBsaXZpbmcgaW4gZWNvbm9taWNhbGx5IHJlYWNoIGFuZCBkZW1vY3JhdGljIHdlc3QgZ2VybWFueSAsIGVhc3QgZ2VybWFueSBnb3Zlcm5tZW50IGJ1aWx0IGEgd2FsbCBpbiBiZXJsaW4gaW4gMTk2MSBhbmQgcmVpbmZvcmNlZCBpdHMgYm91bmRhcmllcyAuIHx8fCBsbV8wPS01My42NzEgbG1fMT0tMTAwLjU2MyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS02OC4yNDUgdG1fcHRfNj0tNTMuNjc1IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0zLjAwMCB0bV9wdF8xMD0tMi44MjAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xLjQ2MyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTMwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tMTMuODk3IHx8fCAtMTY1Ljg4OAotODggfHx8IGZpcnN0IG9uZSBpcyB0aGUg4Kao4Ka/4Kaw4KeN4Kas4Ka+4KaVIGZpcnN0IHNldmVuIOCmruCmv+CmqOCmv+CmnyB3aGljaCDgpprgpr7gprDgp4HgprAg4KaP4KaV4KaY4KeH4Kav4Ka84KeH4Kau4Ka/IGxpZmUgc2hvd24gbGV2ZWwgYW5kIHNlY29uZCBvbmUgaXMgIiB0aGUg4Kam4KeL4Kay4Kao4Ka+4KawIHNjZW5lICIgd2hlcmUg4Kaa4Ka+4Kaw4KeBIOCmheCmruCmsuCnh+CmsCBmb3IgaGlzIGxvdmUg4Kau4KeB4KaW4KeL4Kau4KeB4KaW4Ka/IC4gfHx8IGxtXzA9LTEwMi4wNDggbG1fMT0tMTA0LjM1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTcuMDAwIHRtX3B0XzU9LTYzLjQ3NiB0bV9wdF82PS0zNi4xODIgdG1fcHRfNz0tMjAuMDAwIHRtX3B0Xzg9LTU0LjM2MCB0bV9wdF85PS00LjEwNiB0bV9wdF8xMD0tMzcuOTQ0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTAuNjA2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTI1LjAwMCBXb3JkUGVuYWx0eT0tMTQuMzMyIE9PVlBlbmFsdHk9LTgwMC4wMDAgfHx8IC0xMDM1LjYxMQotODggfHx8IGZpcnN0IG9uZSBpcyBmaWxtIOCmqOCmv+CmsOCnjeCmrOCmvuCmlSBmaXJzdCBzZXZlbiDgpq7gpr/gpqjgpr/gpp8gd2hpY2gg4Kaa4Ka+4Kaw4KeB4KawIOCmj+CmleCmmOCnh+Cmr+CmvOCnh+CmruCmvyBsaWZlIHNob3duIGxldmVsIGFuZCBzZWNvbmQgb25lIGlzICIgdGhlIOCmpuCni+CmsuCmqOCmvuCmsCBzY2VuZSAiIHdoZXJlIOCmmuCmvuCmsOCngSDgpoXgpq7gprLgp4fgprAgZm9yIGhpcyBsb3ZlIOCmruCngeCmluCni+CmruCngeCmluCmvyAuIHx8fCBsbV8wPS0xMDQuNjE1IGxtXzE9LTEwNC4zNTYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMjAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE3LjAwMCB0bV9wdF81PS01OS42OTUgdG1fcHRfNj0tMzYuMzQ2IHRtX3B0Xzc9LTIwLjAwMCB0bV9wdF84PS01NC4zNjAgdG1fcHRfOT0tMy4xNTYgdG1fcHRfMTA9LTMzLjc0MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuMjIwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTI1LjAwMCBXb3JkUGVuYWx0eT0tMTQuMzMyIE9PVlBlbmFsdHk9LTgwMC4wMDAgfHx8IC0xMDM1Ljc2MAotODggfHx8IGZpcnN0IG9uZSBpcyB0aGUg4Kao4Ka/4Kaw4KeN4Kas4Ka+4KaVIGZpcnN0IHNldmVuIOCmruCmv+CmqOCmv+CmnyB3aGljaCDgpprgpr7gprDgp4HgprAg4KaP4KaV4KaY4KeH4Kav4Ka84KeH4Kau4Ka/IGxpZmUgc2hvd24gdGhlbSBhbmQgc2Vjb25kIG9uZSBpcyAiIHRoZSDgpqbgp4vgprLgpqjgpr7gprAgc2NlbmUgIiB3aGVyZSDgpprgpr7gprDgp4Eg4KaF4Kau4Kay4KeH4KawIGZvciBoaXMgbG92ZSDgpq7gp4Hgppbgp4vgpq7gp4Hgppbgpr8gLiB8fHwgbG1fMD0tMTAxLjc4NSBsbV8xPS0xMDQuMzU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xOC4wMDAgdG1fcHRfNT0tNjQuNjE3IHRtX3B0XzY9LTM2LjE4MiB0bV9wdF83PS0yMC4wMDAgdG1fcHRfOD0tNTQuMzYwIHRtX3B0Xzk9LTQuNzM4IHRtX3B0XzEwPS0zOS4xMTkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMS45OTIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MjYuMDAwIFdvcmRQZW5hbHR5PS0xNC4zMzIgT09WUGVuYWx0eT0tODAwLjAwMCB8fHwgLTEwMzUuODUzCi04OCB8fHwgZmlyc3Qgb25lIGlzIHRoZSDgpqjgpr/gprDgp43gpqzgpr7gppUgZmlyc3Qgc2V2ZW4g4Kau4Ka/4Kao4Ka/4KafIHdoaWNoIOCmmuCmvuCmsOCngeCmsCDgpo/gppXgppjgp4fgpq/gprzgp4fgpq7gpr8gbGlmZSBzaG93biBzb3VuZCBhbmQgc2Vjb25kIG9uZSBpcyAiIHRoZSDgpqbgp4vgprLgpqjgpr7gprAgc2NlbmUgIiB3aGVyZSDgpprgpr7gprDgp4Eg4KaF4Kau4Kay4KeH4KawIGZvciBoaXMgbG92ZSDgpq7gp4Hgppbgp4vgpq7gp4Hgppbgpr8gLiB8fHwgbG1fMD0tMTAyLjU1MCBsbV8xPS0xMDQuMzU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xOC4wMDAgdG1fcHRfNT0tNjIuMjA1IHRtX3B0XzY9LTM2LjE4MiB0bV9wdF83PS0yMC4wMDAgdG1fcHRfOD0tNTQuMzYwIHRtX3B0Xzk9LTQuNzM4IHRtX3B0XzEwPS0zNy42NzIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMS45OTIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MjYuMDAwIFdvcmRQZW5hbHR5PS0xNC4zMzIgT09WUGVuYWx0eT0tODAwLjAwMCB8fHwgLTEwMzUuOTYzCi04OCB8fHwgZmlyc3Qgb25lIGlzIGZpbG0g4Kao4Ka/4Kaw4KeN4Kas4Ka+4KaVIGZpcnN0IHNldmVuIOCmruCmv+CmqOCmv+CmnyB3aGljaCDgpprgpr7gprDgp4HgprAg4KaP4KaV4KaY4KeH4Kav4Ka84KeH4Kau4Ka/IGxpZmUgc2hvd24gdGhlbSBhbmQgc2Vjb25kIG9uZSBpcyAiIHRoZSDgpqbgp4vgprLgpqjgpr7gprAgc2NlbmUgIiB3aGVyZSDgpprgpr7gprDgp4Eg4KaF4Kau4Kay4KeH4KawIGZvciBoaXMgbG92ZSDgpq7gp4Hgppbgp4vgpq7gp4Hgppbgpr8gLiB8fHwgbG1fMD0tMTA0LjM1MiBsbV8xPS0xMDQuMzU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xOC4wMDAgdG1fcHRfNT0tNjAuODM2IHRtX3B0XzY9LTM2LjM0NiB0bV9wdF83PS0yMC4wMDAgdG1fcHRfOD0tNTQuMzYwIHRtX3B0Xzk9LTMuNzg4IHRtX3B0XzEwPS0zNC45MTYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMC42MDYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MjYuMDAwIFdvcmRQZW5hbHR5PS0xNC4zMzIgT09WUGVuYWx0eT0tODAwLjAwMCB8fHwgLTEwMzYuMDAyCi04OCB8fHwgZmlyc3Qgb25lIGlzIGZpbG0g4Kao4Ka/4Kaw4KeN4Kas4Ka+4KaVIGZpcnN0IHNldmVuIOCmruCmv+CmqOCmv+CmnyB3aGljaCDgpprgpr7gprDgp4HgprAg4KaP4KaV4KaY4KeH4Kav4Ka84KeH4Kau4Ka/IGxpZmUgc2hvd24gc291bmQgYW5kIHNlY29uZCBvbmUgaXMgIiB0aGUg4Kam4KeL4Kay4Kao4Ka+4KawIHNjZW5lICIgd2hlcmUg4Kaa4Ka+4Kaw4KeBIOCmheCmruCmsuCnh+CmsCBmb3IgaGlzIGxvdmUg4Kau4KeB4KaW4KeL4Kau4KeB4KaW4Ka/IC4gfHx8IGxtXzA9LTEwNS4xMTcgbG1fMT0tMTA0LjM1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTguMDAwIHRtX3B0XzU9LTU4LjQyNCB0bV9wdF82PS0zNi4zNDYgdG1fcHRfNz0tMjAuMDAwIHRtX3B0Xzg9LTU0LjM2MCB0bV9wdF85PS0zLjc4OCB0bV9wdF8xMD0tMzMuNDY5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTAuNjA2IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTI2LjAwMCBXb3JkUGVuYWx0eT0tMTQuMzMyIE9PVlBlbmFsdHk9LTgwMC4wMDAgfHx8IC0xMDM2LjExMgotODggfHx8IGZpcnN0IG9uZSBpcyB0aGUg4Kao4Ka/4Kaw4KeN4Kas4Ka+4KaVIGZpcnN0IHNldmVuIOCmruCmv+CmqOCmv+CmnyB3aGljaCDgpprgpr7gprDgp4HgprAg4KaP4KaV4KaY4KeH4Kav4Ka84KeH4Kau4Ka/IGxpZmUgc2hvd24gbGV2ZWwgYW5kIHRoZSBzZWNvbmQgb25lIGlzICIg4Kam4KeL4Kay4Kao4Ka+4KawIHNjZW5lICIgd2hlcmUg4Kaa4Ka+4Kaw4KeBIOCmheCmruCmsuCnh+CmsCBmb3IgaGlzIGxvdmUg4Kau4KeB4KaW4KeL4Kau4KeB4KaW4Ka/IC4gfHx8IGxtXzA9LTk4Ljc2MSBsbV8xPS0xMDQuMzU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIxLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xNi4wMDAgdG1fcHRfNT0tNjMuNDc2IHRtX3B0XzY9LTM2LjE4MiB0bV9wdF83PS0yMS4wMDAgdG1fcHRfOD0tNTcuMDc4IHRtX3B0Xzk9LTMuNzQ1IHRtX3B0XzEwPS0zOS4xOTQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xNS41MDYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MjMuMDAwIFdvcmRQZW5hbHR5PS0xNC4zMzIgT09WUGVuYWx0eT0tODAwLjAwMCB8fHwgLTEwMzYuNDI2Ci04OCB8fHwgZmlyc3Qgb25lIGlzIGZpbG0g4Kao4Ka/4Kaw4KeN4Kas4Ka+4KaVIGZpcnN0IHNldmVuIOCmruCmv+CmqOCmv+CmnyB3aGljaCDgpprgpr7gprDgp4HgprAg4KaP4KaV4KaY4KeH4Kav4Ka84KeH4Kau4Ka/IGxpZmUgc2hvd24gbGV2ZWwgYW5kIHRoZSBzZWNvbmQgb25lIGlzICIg4Kam4KeL4Kay4Kao4Ka+4KawIHNjZW5lICIgd2hlcmUg4Kaa4Ka+4Kaw4KeBIOCmheCmruCmsuCnh+CmsCBmb3IgaGlzIGxvdmUg4Kau4KeB4KaW4KeL4Kau4KeB4KaW4Ka/IC4gfHx8IGxtXzA9LTEwMS4zMjkgbG1fMT0tMTA0LjM1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTYuMDAwIHRtX3B0XzU9LTU5LjY5NSB0bV9wdF82PS0zNi4zNDYgdG1fcHRfNz0tMjEuMDAwIHRtX3B0Xzg9LTU3LjA3OCB0bV9wdF85PS0yLjc5NSB0bV9wdF8xMD0tMzQuOTkxIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTQuMTIwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIzLjAwMCBXb3JkUGVuYWx0eT0tMTQuMzMyIE9PVlBlbmFsdHk9LTgwMC4wMDAgfHx8IC0xMDM2LjU3NQotODggfHx8IGZpcnN0IG9uZSBpcyB0aGUg4Kao4Ka/4Kaw4KeN4Kas4Ka+4KaVIGZpcnN0IHNldmVuIOCmruCmv+CmqOCmv+CmnyB3aGljaCDgpprgpr7gprDgp4HgprAg4KaP4KaV4KaY4KeH4Kav4Ka84KeH4Kau4Ka/IGxpZmUgc2hvd24gbGV2ZWwgYW5kIHNlY29uZCBvbmUgaXMgIiB0aGUg4Kam4KeL4Kay4Kao4Ka+4KawIHNjZW5lICIgd2hlcmUg4Kaa4Ka+4Kaw4KeBIOCmheCmruCmsuCnh+CmsCBsb3ZlIGZvciBoaXMg4Kau4KeB4KaW4KeL4Kau4KeB4KaW4Ka/IC4gfHx8IGxtXzA9LTEwMS45MjkgbG1fMT0tMTA0LjM1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTYzLjQ3NiB0bV9wdF82PS0zNi4xODIgdG1fcHRfNz0tMjAuMDAwIHRtX3B0Xzg9LTU0LjM2MCB0bV9wdF85PS00LjA3NSB0bV9wdF8xMD0tMzcuNTA5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTEuNjI3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMjMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIzLjAwMCBXb3JkUGVuYWx0eT0tMTQuMzMyIE9PVlBlbmFsdHk9LTgwMC4wMDAgfHx8IC0xMDM3LjYxNQotODggfHx8IGZpcnN0IG9uZSBpcyBmaWxtIOCmqOCmv+CmsOCnjeCmrOCmvuCmlSBmaXJzdCBzZXZlbiDgpq7gpr/gpqjgpr/gpp8gd2hpY2gg4Kaa4Ka+4Kaw4KeB4KawIOCmj+CmleCmmOCnh+Cmr+CmvOCnh+CmruCmvyBsaWZlIHNob3duIGxldmVsIGFuZCBzZWNvbmQgb25lIGlzICIgdGhlIOCmpuCni+CmsuCmqOCmvuCmsCBzY2VuZSAiIHdoZXJlIOCmmuCmvuCmsOCngSDgpoXgpq7gprLgp4fgprAgbG92ZSBmb3IgaGlzIOCmruCngeCmluCni+CmruCngeCmluCmvyAuIHx8fCBsbV8wPS0xMDQuNDk2IGxtXzE9LTEwNC4zNTYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMjAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS01OS42OTUgdG1fcHRfNj0tMzYuMzQ2IHRtX3B0Xzc9LTIwLjAwMCB0bV9wdF84PS01NC4zNjAgdG1fcHRfOT0tMy4xMjQgdG1fcHRfMTA9LTMzLjMwNyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEwLjI0MCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIzLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yMy4wMDAgV29yZFBlbmFsdHk9LTE0LjMzMiBPT1ZQZW5hbHR5PS04MDAuMDAwIHx8fCAtMTAzNy43NjQKLTg5IHx8fCAxOHRoIGNlbnR1cnkgYSBncm91cCDgpprgpr/gpqjgp43gpqTgpr7gpqzgpr/gpqYgYW5kIHdyaXRlciBpbmNvbWUgYW5kIHByb2R1Y3Rpb24g4Kaa4KaV4KeN4Kaw4Ka+4KaV4Ka+4KawIGN1cnJlbnQgdGhyb3VnaCBlY29ub21pYyB0aG91Z2h0cyBkZXZlbG9wbWVudCBpdCAuIHx8fCBsbV8wPS01NS44NzIgbG1fMT0tNjEuOTYxIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMzMuNzQzIHRtX3B0XzY9LTE1LjIzMSB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTYuMDY4IHRtX3B0XzEwPS0xNC4zNDIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjI1NSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgV29yZFBlbmFsdHk9LTguNjg2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMzAuNDA4Ci04OSB8fHwgMTh0aCBjZW50dXJ5IGEgZ3JvdXAg4Kaa4Ka/4Kao4KeN4Kak4Ka+4Kas4Ka/4KamIGFuZCB3cml0ZXIgaW5jb21lIGFuZCBwcm9kdWN0aW9uIOCmmuCmleCnjeCmsOCmvuCmleCmvuCmsCBjdXJyZW50IHRocm91Z2ggZWNvbm9taWMgdGhvdWdodHMgZGV2ZWxvcG1lbnQgcGVvcGxlIC4gfHx8IGxtXzA9LTU1Ljg4NiBsbV8xPS02MS45NjEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zMy4zOTkgdG1fcHRfNj0tMTUuOTI0IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tNi4wNjggdG1fcHRfMTA9LTE0LjM0MiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMjU1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBXb3JkUGVuYWx0eT0tOC42ODYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMzMC41OTcKLTg5IHx8fCAxOCBjZW50dXJ5IGEgZ3JvdXAg4Kaa4Ka/4Kao4KeN4Kak4Ka+4Kas4Ka/4KamIGFuZCB3cml0ZXIgaW5jb21lIGFuZCBwcm9kdWN0aW9uIOCmmuCmleCnjeCmsOCmvuCmleCmvuCmsCBjdXJyZW50IHRocm91Z2ggZWNvbm9taWMgdGhvdWdodHMgZGV2ZWxvcG1lbnQgaXQgLiB8fHwgbG1fMD0tNTcuMDExIGxtXzE9LTYxLjk2MSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTMyLjI5MyB0bV9wdF82PS0xMy44MDYgdG1fcHRfNz0tMTIuMDAwIHRtX3B0Xzg9LTMyLjYxNiB0bV9wdF85PS01LjExOCB0bV9wdF8xMD0tMTYuMTY5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC43MjYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzMxLjEwNQotODkgfHx8IDE4IGNlbnR1cnkgYSBncm91cCDgpprgpr/gpqjgp43gpqTgpr7gpqzgpr/gpqYgYW5kIHdyaXRlciBpbmNvbWUgYW5kIHByb2R1Y3Rpb24g4Kaa4KaV4KeN4Kaw4Ka+4KaV4Ka+4KawIGN1cnJlbnQgdGhyb3VnaCBlY29ub21pYyB0aG91Z2h0cyBkZXZlbG9wbWVudCBwZW9wbGUgLiB8fHwgbG1fMD0tNTcuMDI2IGxtXzE9LTYxLjk2MSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTMxLjk0OSB0bV9wdF82PS0xNC40OTkgdG1fcHRfNz0tMTIuMDAwIHRtX3B0Xzg9LTMyLjYxNiB0bV9wdF85PS01LjExOCB0bV9wdF8xMD0tMTYuMTY5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC43MjYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzMxLjI5NQotODkgfHx8IDE4dGggY2VudHVyeSBhIGdyb3VwIOCmmuCmv+CmqOCnjeCmpOCmvuCmrOCmv+CmpiBhbmQgd3JpdGVyIGluY29tZSBhbmQgcHJvZHVjdGlvbiDgpprgppXgp43gprDgpr7gppXgpr7gprAgY3VycmVudCB0aHJvdWdoIGVjb25vbWljIHRob3VnaHRzIGRldmVsb3BtZW50IGVtcGVyb3IgLiB8fHwgbG1fMD0tNTcuNDI1IGxtXzE9LTYxLjk2MSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTMwLjgxMCB0bV9wdF82PS0xNS45MjQgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS02LjA2OCB0bV9wdF8xMD0tMTIuNzMyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4yNTUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzMxLjU4OAotOTAgfHx8IHRoZSBhcm91c2FsIGFjdGl2aXRpZXMgYmVmb3JlIHBlbmV0cmF0aW5nIG1hbGUgb3JnYW4gaW50byB2YWdpbmEgaXMgY2FsbGVkIGZvcmVwbGF5IC4gfHx8IGxtXzA9LTIyLjIxMCBsbV8xPS00MS4xMzAgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tNDAuOTM3IHRtX3B0XzY9LTIxLjU5NCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0xLjAwNyB0bV9wdF8xMD0tMC40MTUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0wLjkyMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEzLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBXb3JkUGVuYWx0eT0tNi41MTQgfHx8IC02Ny4wNzUKLTkwIHx8fCB0aGUgYXJvdXNhbCBhY3Rpdml0aWVzIGJlZm9yZSBwZW5ldHJhdGluZyBtYWxlIG9yZ2FuIGludG8gdmFnaW5hIGNhbGxlZCBmb3JlcGxheSAuIHx8fCBsbV8wPS0yNC4yMDkgbG1fMT0tMzcuODY5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTM3LjEyMiB0bV9wdF82PS0yMS41MzUgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTAuMDA5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMC4wMDMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9My4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIHx8fCAtNjcuMDgxCi05MCB8fHwgdGhlIGFyb3VzYWwgYWN0aXZpdGllcyBiZWZvcmUgcGVuZXRyYXRpbmcgbWFsZSBvcmdhbiBpbnRvIHZhZ2luYSBpcyBjYWxsZWQgc3RpbXVsYXRpb24gfHx8IGxtXzA9LTIyLjY5MSBsbV8xPS0zNy4zMzggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tNDEuODkwIHRtX3B0XzY9LTMxLjA3NiB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTAuNjkzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS02LjA4MCB8fHwgLTY3Ljc2MAotOTAgfHx8IHZhZ2luYSBhcm91c2FsIGFjdGl2aXRpZXMgYmVmb3JlIHBlbmV0cmF0aW5nIG1hbGUgb3JnYW4gaW50byB2YWdpbmEgaXMgY2FsbGVkIHN0aW11bGF0aW9uIHx8fCBsbV8wPS0yNS40OTQgbG1fMT0tMzUuOTA5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTM2LjY1MCB0bV9wdF82PS0zMC45MzIgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMS4xMzUgdG1fcHRfMTA9LTIuMTk3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS4wOTkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTYuMDgwIHx8fCAtNjkuNDI0Ci05MCB8fHwgdGhlIGFyb3VzYWwgYWN0aXZpdGllcyBiZWZvcmUgcGVuZXRyYXRpbmcgbWFsZSBvcmdhbiBpbnRvIHZhZ2luYSBjYWxsZWQgc3RpbXVsYXRpb24gfHx8IGxtXzA9LTI0LjY5MCBsbV8xPS0zNC4wNzYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMzguMDc1IHRtX3B0XzY9LTMxLjAxNyB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0tMi42MjMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0zLjQ3NiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgfHx8IC03MC4yNDcKLTkxIHx8fCBpdCBpcyDgprbgp4LgppXgprDgp4fgprAgaW4gaW4gd2FzIHdoaWNoIGNhbiDgprbgp4LgppXgprDgppXgp4cg4KaH4Kao4Kar4KeN4Kay4KeB4Kav4Ka84KeH4Kae4KeN4Kac4Ka+4Kak4KeHIGJ5IGJyaXRpc2ggLiB8fHwgbG1fMD0tMzYuODk5IGxtXzE9LTQ1LjY1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS00My41MDMgdG1fcHRfNj0tMTYuNDUzIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjA2MyB0bV9wdF8xMD0tMjkuNjQ4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tOC41MDkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDAwLjYyMQotOTEgfHx8IGl0IGJhc2ljYWxseSDgprbgp4LgppXgprDgp4fgprAgaW4gaW4gd2FzIHdoaWNoIGNhbiDgprbgp4LgppXgprDgppXgp4cg4KaH4Kao4Kar4KeN4Kay4KeB4Kav4Ka84KeH4Kae4KeN4Kac4Ka+4Kak4KeHIGJ5IGJyaXRpc2ggLiB8fHwgbG1fMD0tMzkuODgxIGxtXzE9LTQ1LjY1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0zOC4zMDQgdG1fcHRfNj0tMTYuNjE2IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0yLjkyOCB0bV9wdF8xMD0tMjIuNzc3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC43NTUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDAuNzgwCi05MSB8fHwgaXQgaXMg4Ka24KeC4KaV4Kaw4KeH4KawIGluIGluIHdhcyB3aGljaCBjYW4g4Ka24KeC4KaV4Kaw4KaV4KeHIOCmh+CmqOCmq+CnjeCmsuCngeCmr+CmvOCnh+CmnuCnjeCmnOCmvuCmpOCnhyBieSBjdWx0dXJlcyAuIHx8fCBsbV8wPS0zOC43MzYgbG1fMT0tNDUuNjU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTQwLjgwMiB0bV9wdF82PS0xNi40NTMgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMDYzIHRtX3B0XzEwPS0yOC43MzEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04LjUwOSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDIuMTM5Ci05MSB8fHwgaXQgaXMg4Ka24KeC4KaV4Kaw4KeH4KawIGluIGluIHdhcyB3aGljaCBjYW4g4Ka24KeC4KaV4Kaw4KaV4KeHIOCmh+CmqOCmq+CnjeCmsuCngeCmr+CmvOCnh+CmnuCnjeCmnOCmvuCmpOCnhyB3b3VsZCBieSAuIHx8fCBsbV8wPS0zOC44NDIgbG1fMT0tNDUuNjU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTQxLjQ0NiB0bV9wdF82PS0xNC44NDQgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTEuNDMxIHRtX3B0XzEwPS0yOC45NjQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS03LjgxOSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDIuMjk3Ci05MSB8fHwgaXQgYmFzaWNhbGx5IOCmtuCnguCmleCmsOCnh+CmsCBpbiBpbiB3YXMgd2hpY2ggY2FuIOCmtuCnguCmleCmsOCmleCnhyDgpofgpqjgpqvgp43gprLgp4Hgpq/gprzgp4fgpp7gp43gppzgpr7gpqTgp4cgYnkgY3VsdHVyZXMgLiB8fHwgbG1fMD0tNDEuNzE4IGxtXzE9LTQ1LjY1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0zNS42MDMgdG1fcHRfNj0tMTYuNjE2IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0yLjkyOCB0bV9wdF8xMD0tMjEuODYxIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC43NTUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDIuMjk4Ci05MSB8fHwgaXQgYmFzaWNhbGx5IOCmtuCnguCmleCmsOCnh+CmsCBpbiBpbiB3YXMgd2hpY2ggY2FuIOCmtuCnguCmleCmsOCmleCnhyDgpofgpqjgpqvgp43gprLgp4Hgpq/gprzgp4fgpp7gp43gppzgpr7gpqTgp4cgd291bGQgYnkgLiB8fHwgbG1fMD0tNDEuODI0IGxtXzE9LTQ1LjY1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0zNi4yNDcgdG1fcHRfNj0tMTUuMDA2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjI5NSB0bV9wdF8xMD0tMjIuMDkzIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC4wNjUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDIuNDU1Ci05MSB8fHwgaXQgaXMg4Ka24KeC4KaV4Kaw4KeH4KawIGluIGluIHdhcyB3aGljaCBjYW4g4Ka24KeC4KaV4Kaw4KaV4KeHIOCmh+CmqOCmq+CnjeCmsuCngeCmr+CmvOCnh+CmnuCnjeCmnOCmvuCmpOCnhyBhZmZlY3RlZCBjdWx0dXJlcyAuIHx8fCBsbV8wPS00MC41MDMgbG1fMT0tNDUuNjU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTM3LjI5NiB0bV9wdF82PS0xNy4zNDcgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMDYzIHRtX3B0XzEwPS0yMy45MTUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04LjUwOSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDIuNzEyCi05MSB8fHwgaXQgaXMg4Ka24KeC4KaV4Kaw4KeH4KawIGluIGluIHdhcyB3aGljaCBjYW4g4Ka24KeC4KaV4Kaw4KaV4KeHIOCmh+CmqOCmq+CnjeCmsuCngeCmr+CmvOCnh+CmnuCnjeCmnOCmvuCmpOCnhyBieSB3b3VsZCAuIHx8fCBsbV8wPS0zOC44NjggbG1fMT0tNDUuNjU2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTQxLjQ0NiB0bV9wdF82PS0xNC44NDQgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTIuMDYzIHRtX3B0XzEwPS0yOS44MzkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS05Ljc2NSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDIuNzk4Ci05MSB8fHwgaXQgYmFzaWNhbGx5IOCmtuCnguCmleCmsOCnh+CmsCBpbiBpbiB3YXMgd2hpY2ggY2FuIOCmtuCnguCmleCmsOCmleCnhyDgpofgpqjgpqvgp43gprLgp4Hgpq/gprzgp4fgpp7gp43gppzgpr7gpqTgp4cgYWZmZWN0ZWQgY3VsdHVyZXMgLiB8fHwgbG1fMD0tNDMuNDg1IGxtXzE9LTQ1LjY1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0zMi4wOTcgdG1fcHRfNj0tMTcuNTEwIHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0yLjkyOCB0bV9wdF8xMD0tMTcuMDQ0IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC43NTUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDIuODcxCi05MSB8fHwgaXQgYmFzaWNhbGx5IOCmtuCnguCmleCmsOCnh+CmsCBpbiBpbiB3YXMgd2hpY2ggY2FuIOCmtuCnguCmleCmsOCmleCnhyDgpofgpqjgpqvgp43gprLgp4Hgpq/gprzgp4fgpp7gp43gppzgpr7gpqTgp4cgYnkgd291bGQgLiB8fHwgbG1fMD0tNDEuODUwIGxtXzE9LTQ1LjY1NiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0zNi4yNDcgdG1fcHRfNj0tMTUuMDA2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjkyOCB0bV9wdF8xMD0tMjIuOTY4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNi4wMTEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDAyLjk1NwotOTIgfHx8IHRoZXNlIOCmj+CmleCmjyB0aGUgbXljZWxpdW0gc3RydWN0dXJlIC4gfHx8IGxtXzA9LTE5LjcxNyBsbV8xPS0yMi44MjggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMTEuMDMyIHRtX3B0XzY9LTguMzU5IHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMTUuMzU3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi44NTIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0OC43MzAKLTkyIHx8fCB0aGVzZSDgpo/gppXgpo8gdG8gbXljZWxpdW0gc3RydWN0dXJlIC4gfHx8IGxtXzA9LTE5LjgxMSBsbV8xPS0yMi44MjggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMTAuMzUzIHRtX3B0XzY9LTkuMTQ1IHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMTQuNzQ4IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy40MzIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0OS4wMzMKLTkyIHx8fCB0aGVzZSDgpo/gppXgpo8gdGhlIG15Y2VsaXVtIGZvcm1lZCAuIHx8fCBsbV8wPS0yMC4wNDMgbG1fMT0tMjIuODI4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTEwLjk4OSB0bV9wdF82PS03Ljc0MCB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTE1LjgwNyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTMuNDk0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDkuMjU4Ci05MiB8fHwgdGhlc2Ug4KaP4KaV4KaPIHRvIG15Y2VsaXVtIGZvcm1lZCAuIHx8fCBsbV8wPS0yMC4xMzcgbG1fMT0tMjIuODI4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTEwLjMxMSB0bV9wdF82PS04LjUyNiB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTE1LjE5OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMDc0IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDkuNTYxCi05MiB8fHwgdGhlc2Ug4KaP4KaV4KaPIHRoZSBteWNlbGl1bSBmb3JtZWQgdGhlIC4gfHx8IGxtXzA9LTIxLjgyNiBsbV8xPS0yNi4wODkgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTQuMTk2IHRtX3B0XzY9LTUuOTUzIHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjA1MCB0bV9wdF8xMD0tOC4yODEgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjAxNiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjQ5LjYxOQotOTIgfHx8IHRoZXNlIOCmj+CmleCmjyBieSBteWNlbGl1bSBzdHJ1Y3R1cmUgLiB8fHwgbG1fMD0tMjAuMDAxIGxtXzE9LTIyLjgyOCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS00LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0xMC4zNjUgdG1fcHRfNj0tMTAuMjQ0IHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjAxOSB0bV9wdF8xMD0tMTQuMjg5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC40NjEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0OS45MDYKLTkyIHx8fCB0aGVzZSDgpo/gppXgpo8gdG8gbXljZWxpdW0gZm9ybWVkIHRoZSAuIHx8fCBsbV8wPS0yMS45MjAgbG1fMT0tMjYuMDg5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTEzLjUxOCB0bV9wdF82PS02Ljc0MCB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4wNTAgdG1fcHRfMTA9LTcuNjczIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi41OTUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD02LjAwMCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0OS45MjEKLTkyIHx8fCB0aGVzZSDgpo/gppXgpo8gaW4gbXljZWxpdW0gc3RydWN0dXJlIC4gfHx8IGxtXzA9LTE5LjcwMyBsbV8xPS0yMi44MjggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMTEuNTU5IHRtX3B0XzY9LTkuODE5IHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjAxOSB0bV9wdF8xMD0tMTUuODk3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNC40NjEgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI1MC4wMzgKLTkzIHx8fCBydXNzaWEgbm93IGEgZGVtb2NyYXRpYyBjb3VudHJ5IC4gfHx8IGxtXzA9LTEzLjgyMyBsbV8xPS0yMi44MjggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tNi4zMzIgdG1fcHRfNj0tNC40NjYgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTAuMDUwIHRtX3B0XzEwPS0xLjkwNiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuNzIyIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTMuNDc0IHx8fCAtMzUuNTM4Ci05MyB8fHwgcnVzc2lhIGF0IGEgZGVtb2NyYXRpYyBjb3VudHJ5IC4gfHx8IGxtXzA9LTEyLjgzMyBsbV8xPS0yMi44MjggdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tNy40NjggdG1fcHRfNj0tMy44MTcgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTAuMTg1IHRtX3B0XzEwPS00LjA0MCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMTIwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTMuNDc0IHx8fCAtMzUuODIyCi05MyB8fHwgcnVzc2lhIHByZXNlbnRseSBhIGRlbW9jcmF0aWMgY291bnRyeSAuIHx8fCBsbV8wPS0xNC44NDggbG1fMT0tMjIuODI4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTUuMTY1IHRtX3B0XzY9LTQuMDc1IHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjA1MCB0bV9wdF8xMD0tMS4xMDAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjMyNyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIFdvcmRQZW5hbHR5PS0zLjQ3NCB8fHwgLTM2LjEwMQotOTMgfHx8IHJ1c3NpYSBpcyBhIGRlbW9jcmF0aWMgY291bnRyeSAuIHx8fCBsbV8wPS0xMS42NTMgbG1fMT0tMjIuODI4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTEwLjYwMiB0bV9wdF82PS01LjI5OCB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4xODUgdG1fcHRfMTA9LTYuNjMwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNS4xMjAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD00LjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgfHx8IC0zNi4xNDAKLTk0IHx8fCBwZW5pcyB8fHwgbG1fMD0tNS41ODYgbG1fMT0tNS45OTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMS43NzEgdG1fcHRfNj0tMS4zMDUgdG1fcHRfNz0tMS4wMDAgdG1fcHRfOD0tMi43MTggdG1fcHRfOT0tMC4wMTggdG1fcHRfMTA9LTEuNjA5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS4wOTkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgfHx8IC0xMC45NzkKLTk0IHx8fCBzZXggfHx8IGxtXzA9LTQuNzAyIGxtXzE9LTUuOTkxIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTMuOTg5IHRtX3B0XzY9LTMuMzg0IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPS0yLjI1MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuMDE1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgV29yZFBlbmFsdHk9LTEuMzAzIHx8fCAtMTEuNzk4Ci05NCB8fHwgZ2VuZGVyIHx8fCBsbV8wPS02LjM4NyBsbV8xPS02LjUyMiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0wLjgxMSB0bV9wdF82PS0xLjMwNSB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjAwNyB0bV9wdF8xMD0tMC40MDUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0wLjkxNiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyB8fHwgLTEyLjA1OAotOTQgfHx8IHRoZSB8fHwgbG1fMD0tMy4yMDggbG1fMT0tNi41MjIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tOS4xMTAgdG1fcHRfNj0tMi45NzkgdG1fcHRfNz0tMS4wMDAgdG1fcHRfOD0tMi43MTggdG1fcHRfOT0tMS4wMDAgdG1fcHRfMTA9LTguMTg3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi43MDggdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgfHx8IC0xMy43NTIKLTk0IHx8fCBzZXh1YWwgb3JnYW5zIHx8fCBsbV8wPS01Ljk0NiBsbV8xPS05LjI1MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS05LjEwMiB0bV9wdF82PS00LjA3OCB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tMS4zODYgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjcwOCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyB8fHwgLTE3LjE5NAotOTQgfHx8IOCmsuCmv+CmmeCnjeCmlyB8fHwgbG1fMD0tNy4zNTUgbG1fMT0tNi41MjIgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9MC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PTAuMDAwIHRtX3B0XzU9MC4wMDAgdG1fcHRfNj0wLjAwMCB0bV9wdF83PTAuMDAwIHRtX3B0Xzg9MC4wMDAgdG1fcHRfOT0wLjAwMCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0wLjAwMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0wLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgV29yZFBlbmFsdHk9LTEuMzAzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMTEuMzU4Ci05NSB8fHwgdGhpcyBzdGF0ZSBpcyBjYWxsZWQgb3JnYXNtIC4gfHx8IGxtXzA9LTUuOTQ1IGxtXzE9LTIyLjgyOCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0xMi43MzggdG1fcHRfNj0tMjEuMzI0IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMC42OTMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgfHx8IC0zMS4yNTUKLTk1IHx8fCB0aGlzIHN0YXRlIGNhbGxlZCBvcmdhc20gLiB8fHwgbG1fMD0tMTAuNzA5IGxtXzE9LTE5LjU2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS04LjkyNCB0bV9wdF82PS0yMS4yNjUgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC41MDQgdG1fcHRfMTA9LTIuNDQxIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMi43ODMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgfHx8IC0zNi4xNjQKLTk1IHx8fCB0aGlzIHNpdHVhdGlvbiBpcyBjYWxsZWQgb3JnYXNtIC4gfHx8IGxtXzA9LTkuODAwIGxtXzE9LTIyLjgyOCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0xMS44MjMgdG1fcHRfNj0tMjEuNzI5IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS4zODYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMy40NzQgfHx8IC0zNi43NTQKLTk2IHx8fCBkaWZmZXJlbnQgcGVyaW9kIGhlcmUgd2FzIGVzdGFibGlzaGVkIHJveWFsIG1vcmUgZW1waXJlIC4gfHx8IGxtXzA9LTI2LjU5MSBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMjEuMjc1IHRtX3B0XzY9LTEyLjUxNSB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMi43NTQgdG1fcHRfMTA9LTE2Ljg5MyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTQuMzI3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IHx8fCAtNzcuNzAxCi05NiB8fHwgZGlmZmVyZW50IHBlcmlvZCB3YXMgZXN0YWJsaXNoZWQgdGhpcyByb3lhbCBtb3JlIGVtcGlyZSAuIHx8fCBsbV8wPS0yNC44MjAgbG1fMT0tMzIuNjExIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTI1LjAwNSB0bV9wdF82PS0xMy42NzkgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuMzg2IHRtX3B0XzEwPS0xOC42NDAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjAyMCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyB8fHwgLTc3LjgzNwotOTYgfHx8IGRpZmZlcmVudCBwZXJpb2QgaGVyZSBlc3RhYmxpc2hlZCB0aGUgcm95YWwgbW9yZSBlbXBpcmUgLiB8fHwgbG1fMD0tMjYuMjMyIGxtXzE9LTMyLjYxMSB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0yNC4wMzEgdG1fcHRfNj0tMTMuMzI0IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0yLjUwMyB0bV9wdF8xMD0tMTkuNTUyIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMy45OTYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgfHx8IC03OC4zOTAKLTk2IHx8fCBkaWZmZXJlbnQgcGVyaW9kIHdhcyBlc3RhYmxpc2hlZCByb3lhbCB0aGlzIG1vcmUgZW1waXJlIC4gfHx8IGxtXzA9LTI1LjQ4NCBsbV8xPS0zMi42MTEgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMjUuMDA1IHRtX3B0XzY9LTEzLjY3OSB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMy4zODYgdG1fcHRfMTA9LTE4LjY0MCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTUuMDIwIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IHx8fCAtNzguNjU4Ci05NiB8fHwgaGlzdG9yeSBkaWZmZXJlbnQgcGVyaW9kIGhlcmUgd2FzIGVzdGFibGlzaGVkIHJveWFsIG1vcmUgZW1waXJlIC4gfHx8IGxtXzA9LTMwLjc0MiBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIzLjAzNyB0bV9wdF82PS05LjMzNyB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuMzg3IHRtX3B0XzEwPS0yMC43OTUgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS01LjY5NCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD04LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgfHx8IC03OS44NjAKLTk2IHx8fCBoaXN0b3J5IGRpZmZlcmVudCBwZXJpb2QgdGhpcyB3YXMgZXN0YWJsaXNoZWQgcm95YWwgbW9yZSBlbXBpcmUgLiB8fHwgbG1fMD0tMjkuMzE0IGxtXzE9LTM1Ljg3MiB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMjYuNzY3IHRtX3B0XzY9LTEwLjUwMSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTIuMDE5IHRtX3B0XzEwPS0yNC4wMTAgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS02LjY3NSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD05LjAwMCBXb3JkUGVuYWx0eT0tNS4yMTIgfHx8IC03OS45MzkKLTk3IHx8fCBtaWNybyBlY29ub21pY3MgfHx8IGxtXzA9LTUuMDIxIGxtXzE9LTkuNzgzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTIuNzY0IHRtX3B0XzY9LTEuNTUyIHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMDUwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMC41NjAgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgfHx8IC0xMi43MzEKLTk3IHx8fCBtaWNyb2Vjb25vbWljcyB8fHwgbG1fMD0tNS4zMzYgbG1fMT0tNi41MjIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMS4zODYgdG1fcHRfNj0tNS44OTQgdG1fcHRfNz0tMS4wMDAgdG1fcHRfOD0tMi43MTggdG1fcHRfOT0tMS4wMDAgdG1fcHRfMTA9LTEuMDk5IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS45NDYgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgfHx8IC0xMy43OTUKLTk3IHx8fCBtYWNybyBlY29ub21pY3MgfHx8IGxtXzA9LTUuNjkxIGxtXzE9LTkuNzgzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTIuOTk3IHRtX3B0XzY9LTIuMjQ1IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS4yNTMgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgfHx8IC0xNC4zNDgKLTk3IHx8fCBtYWNybyBlY29ub215IHx8fCBsbV8wPS02LjU2NiBsbV8xPS05Ljc4MyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0zLjIxOSB0bV9wdF82PS0yLjk1NyB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tMS4wMDkgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjI3NyB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyB8fHwgLTE2LjUzMQotOTcgfHx8IG1pY3JvIGVjb25vbXkgfHx8IGxtXzA9LTguMDY1IGxtXzE9LTkuNzgzIHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTIuOTg1IHRtX3B0XzY9LTIuMjY0IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMDUwIHRtX3B0XzEwPS0xLjg3NCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTEuNTgzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IHx8fCAtMTcuODIzCi05NyB8fHwgZWNvbm9taWNzIG1pY3JvIHx8fCBsbV8wPS05LjQ5MSBsbV8xPS05Ljc4MyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0yLjc2NCB0bV9wdF82PS0xLjU1MiB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjA1MSB0bV9wdF8xMD0tNC40NDIgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS00LjQ3MiB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyB8fHwgLTIxLjk1NQotOTggfHx8IHVzZXIgdG8gb3BlcmF0aW5nIHN5c3RlbSB0aGUgdmlzaWJsZSBvZiB0aGUgY29tcHV0ZXIgaW50ZXJmYWNlIC4gfHx8IGxtXzA9LTI3LjM5OCBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0zMC40OTQgdG1fcHRfNj0tMTAuMDc0IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMC41NTMgdG1fcHRfMTA9LTI1LjEzNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTkuMTkzIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgfHx8IC03OS4yNTQKLTk4IHx8fCB1c2VyIHRvIG9wZXJhdGluZyBzeXN0ZW0gdGhlIHZpc2libGUgZm9ybSBpcyBjb21wdXRlciBpbnRlcmZhY2UgLiB8fHwgbG1fMD0tMzAuNjE4IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTI0LjQwMSB0bV9wdF82PS05LjQ3NyB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTAuNTUzIHRtX3B0XzEwPS0xOS4yNjcgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS04LjE2MCB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgV29yZFBlbmFsdHk9LTUuNjQ2IHx8fCAtNzkuOTgxCi05OCB8fHwgdXNlciB0byBvcGVyYXRpbmcgc3lzdGVtIHRoZSB2aXNpYmxlIGZvcm0gYXJlIGNvbXB1dGVyIGludGVyZmFjZSAuIHx8fCBsbV8wPS0zMS4xMjIgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMjMuNjk1IHRtX3B0XzY9LTkuNTk2IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMC41NTMgdG1fcHRfMTA9LTE3Ljk3MSB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuNzM3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgfHx8IC04MC4wMjUKLTk4IHx8fCB1c2VyIHRvIG9wZXJhdGluZyBzeXN0ZW0gdGhlIHZpc2libGUgb2YgYXJlIGNvbXB1dGVyIGludGVyZmFjZSAuIHx8fCBsbV8wPS0zMC4yMjAgbG1fMT0tMzkuMTM0IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMjcuMjc1IHRtX3B0XzY9LTkuMDMxIHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMC41NTMgdG1fcHRfMTA9LTIxLjQ5OCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuNzM3IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgfHx8IC04MC4zMTUKLTk4IHx8fCB1c2VyIHRvIG9wZXJhdGluZyBzeXN0ZW0gdGhlIHZpc2libGUgb2YgdGhlIGNvbXB1dGVycyBpbnRlcmZhY2UgLiB8fHwgbG1fMD0tMjcuNTkyIGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTMwLjY1NyB0bV9wdF82PS0xMS42MzIgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMjQuOTE2IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMTAuNzE1IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBXb3JkUGVuYWx0eT0tNS42NDYgfHx8IC04MC41NDAKLTk4IHx8fCB0aGUgdXNlciB0byBvcGVyYXRpbmcgdmlzaWJsZSBvZiBhcmUgY29tcHV0ZXIgaW50ZXJmYWNlIC4gfHx8IGxtXzA9LTI4LjYxMSBsbV8xPS0zNS44NzIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTI1LjI4NCB0bV9wdF82PS05LjUwOCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuNjAzIHRtX3B0XzEwPS0yMC45NTMgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0xMC43MTUgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgV29yZFBlbmFsdHk9LTUuMjEyIHx8fCAtODAuNzA3Ci05OCB8fHwgdXNlciB0byBvcGVyYXRpbmcgc3lzdGVtIG1vc3QgdmlzaWJsZSBvZiBhcmUgY29tcHV0ZXIgaW50ZXJmYWNlIC4gfHx8IGxtXzA9LTMyLjIzMSBsbV8xPS0zOS4xMzQgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yMy4zNjcgdG1fcHRfNj0tOC44NzYgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMTcuNTEwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tNy4wOTkgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIFdvcmRQZW5hbHR5PS01LjY0NiB8fHwgLTgwLjc0MgotOTggfHx8IG9wZXJhdGluZyBzeXN0ZW0gdG8gdXNlcnMgbW9zdCB2aXNpYmxlIG9mIGFyZSBjb21wdXRlciBpbnRlcmZhY2UgLiB8fHwgbG1fMD0tMzAuODI1IGxtXzE9LTM5LjEzNCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMjMuMjk1IHRtX3B0XzY9LTkuMzEyIHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMC44NzggdG1fcHRfMTA9LTE0LjUzNiB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTcuNTQxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTguMDAwIFdvcmRQZW5hbHR5PS01LjY0NiB8fHwgLTgwLjc1NAotOTkgfHx8IOCmrOCmv+CmuOCnjeCmpOCmvuCmsOCmv+CmpOCmgyAxOTcxIHRlbXBvcmFyeSBnb3Zlcm5tZW50IHx8fCBsbV8wPS0xNi40MTAgbG1fMT0tMTYuMzA2IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTIuNzE3IHRtX3B0XzY9LTkuNTQzIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuNTAzIHRtX3B0XzEwPS00LjQ0NyB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuMzk4IHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9My4wMDAgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMzUuNDQ0Ci05OSB8fHwg4Kas4Ka/4Ka44KeN4Kak4Ka+4Kaw4Ka/4Kak4KaDIDE5NzEgdGVtcG9yYXJ5IGJhbmdsYWRlc2ggZ292ZXJubWVudCB8fHwgbG1fMD0tMTcuMzU4IGxtXzE9LTE5LjU2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0zLjI5NiB0bV9wdF82PS01LjI4NiB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tMy45MzQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjEyOSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTM3LjIyNgotOTkgfHx8IOCmrOCmv+CmuOCnjeCmpOCmvuCmsOCmv+CmpOCmgyAsIDE5NzEgdGVtcG9yYXJ5IGdvdmVybm1lbnQgfHx8IGxtXzA9LTE2LjkzOSBsbV8xPS0xOS41NjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tNy4yNzIgdG1fcHRfNj0tNy4wMzYgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4yNzEgdG1fcHRfMTA9LTIuNTkwIHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS45OTIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEzNy40MDAKLTk5IHx8fCDgpqzgpr/gprjgp43gpqTgpr7gprDgpr/gpqTgpoMgdGVtcG9yYXJ5IGdvdmVybm1lbnQgLCAxOTcxIHx8fCBsbV8wPS0xNi40ODQgbG1fMT0tMTkuNTY3IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9LTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTcuMjcyIHRtX3B0XzY9LTcuMDM2IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMTg1IHRtX3B0XzEwPS0xLjIwNCB0bV9wdF8xMT0tMC4wMDAgdG1fcHRfMTI9LTIuMzUxIHRtX3B0XzEzPS0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9LTAuMDAwIHRtX3B0XzE2PS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMzcuNDk4Ci05OSB8fHwg4Kas4Ka/4Ka44KeN4Kak4Ka+4Kaw4Ka/4Kak4KaDIGluIDE5NzEgdGVtcG9yYXJ5IGdvdmVybm1lbnQgfHx8IGxtXzA9LTE2Ljk0NiBsbV8xPS0xOS41NjcgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0tMC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tNi44MjMgdG1fcHRfNj0tNy42NDUgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4yNzEgdG1fcHRfMTA9LTIuODI3IHRtX3B0XzExPS0wLjAwMCB0bV9wdF8xMj0tMS45OTIgdG1fcHRfMTM9LTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMC4wMDAgdG1fcHRfMTY9LTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEzNy41OTIKLTk5IHx8fCDgpqzgpr/gprjgp43gpqTgpr7gprDgpr/gpqTgpoMgdGVtcG9yYXJ5IGdvdmVybm1lbnQgaW4gMTk3MSB8fHwgbG1fMD0tMTYuNDA0IGxtXzE9LTE5LjU2NyB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPS0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS02LjgyMyB0bV9wdF82PS03LjY0NSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjE4NSB0bV9wdF8xMD0tMS42NzQgdG1fcHRfMTE9LTAuMDAwIHRtX3B0XzEyPS0yLjM1MSB0bV9wdF8xMz0tMC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PS0wLjAwMCB0bV9wdF8xNj0tMC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTM3LjY0MworMCB8fHwgcmFiaW5kcmFuYXRoIHdhcyBib3JuIGluIGEg4Kaq4Ka/4Kaw4Ka+4Kay4KeAIOCmrOCnjeCmsOCmvuCmueCnjeCmruCmoyBpbiB0aGUgZmFtaWx5IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0zMC40MDkgdG1fcHRfNj0tMTUuNzEyIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjEzNSB0bV9wdF8xMD0tMTQuOTc5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjcyOSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTIzLjcxMiBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNzAuNjkwCiswIHx8fCByYWJpbmRyYW5hdGggYm9ybiBpbiBrb2xrYXRhIGEg4Kaq4Ka/4Kaw4Ka+4Kay4KeAIOCmrOCnjeCmsOCmvuCmueCnjeCmruCmoyBpbiB0aGUgZmFtaWx5IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0yOS4wMjkgdG1fcHRfNj0tMTYuMDAyIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0tMTAuMDkwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjI4MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTI3LjgwMyBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNzIuNjU0CiswIHx8fCByYWJpbmRyYW5hdGggYm9ybiBpbiB0aGUgYSDgpqrgpr/gprDgpr7gprLgp4Ag4Kas4KeN4Kaw4Ka+4Ka54KeN4Kau4KajIGluIHRoZSBmYW1pbHkgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTMyLjczNyB0bV9wdF82PS0xNi4wOTIgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTIuMDAwIHRtX3B0XzEwPS0xMi4xODggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuODc2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjYuOTgwIGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI3Mi43NzYKKzAgfHx8IHJhYmluZHJhbmF0aCB3YXMgYm9ybiBpbiBvbmUg4Kaq4Ka/4Kaw4Ka+4Kay4KeAIOCmrOCnjeCmsOCmvuCmueCnjeCmruCmoyBpbiB0aGUgZmFtaWx5IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0yOS42MzkgdG1fcHRfNj0tMTYuNzEwIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjEzNSB0bV9wdF8xMD0tMTMuNDM4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04LjM1MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTI1LjY3NiBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNzMuMTMzCiswIHx8fCByYWJpbmRyYW5hdGggYm9ybiBpbiB0aGUgb25lIOCmquCmv+CmsOCmvuCmsuCngCDgpqzgp43gprDgpr7gprngp43gpq7gpqMgaW4gdGhlIGZhbWlseSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMzEuOTY3IHRtX3B0XzY9LTE3LjA5MCB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTEwLjY0OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC40OTcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yNy4zMjAgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjczLjIxMAorMCB8fHwgcmFiaW5kcmFuYXRoIGJvcm4gaW4ga29sa2F0YSBvbmUg4Kaq4Ka/4Kaw4Ka+4Kay4KeAIOCmrOCnjeCmsOCmvuCmueCnjeCmruCmoyBpbiB0aGUgZmFtaWx5IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0yOC4yNTkgdG1fcHRfNj0tMTYuOTk5IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0tOC41NTAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuOTAzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjguNTU1IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI3My41OTcKKzAgfHx8IHJhYmluZHJhbmF0aCB3YXMgYm9ybiBpbiBhIOCmquCmv+CmsOCmvuCmsuCngCDgpqzgp43gprDgpr7gprngp43gpq7gpqMg4Kaq4Kaw4Ka/4Kas4Ka+4Kaw4KeHIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEyLjg2NyB0bV9wdF82PS03LjE1MyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4xMzUgdG1fcHRfMTA9LTE0Ljk4OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy43MzIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0yMy41NzQgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzYwLjY0NgorMCB8fHwgcmFiaW5kcmFuYXRoIGJvcm4gaW4ga29sa2F0YSBhIOCmquCmv+CmsOCmvuCmsuCngCDgpqzgp43gprDgpr7gprngp43gpq7gpqMg4Kaq4Kaw4Ka/4Kas4Ka+4Kaw4KeHIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTExLjQ4NyB0bV9wdF82PS03LjQ0MiB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMS4wMDAgdG1fcHRfMTA9LTEwLjEwMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4yODUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0yNy42NjUgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzYyLjYxMAorMCB8fHwgcmFiaW5kcmFuYXRoIGJvcm4gaW4gdGhlIGEg4Kaq4Ka/4Kaw4Ka+4Kay4KeAIOCmrOCnjeCmsOCmvuCmueCnjeCmruCmoyDgpqrgprDgpr/gpqzgpr7gprDgp4cgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTUuMTk1IHRtX3B0XzY9LTcuNTMzIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tMTIuMTk4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjg4MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTI2Ljg0MSBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNjIuNzMyCisxIHx8fCByZWNlbnRseSBpbmRpYSB3aXRoIHVuaXRlZCByZWxhdGlvbiBpbXByb3ZlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMy44MTAgdG1fcHRfNj0tMTUuNzU5IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0yLjEwNCB0bV9wdF8xMD0tMTEuNTI3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjE3NCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIxLjU4NSBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC01OC45MjkKKzEgfHx8IHJlY2VudGx5IHdpdGggdGhlIHVuaXRlZCByZWxhdGlvbiBpbXByb3ZlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xNy4wNjIgdG1fcHRfNj0tMTUuODU3IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0yLjEwNSB0bV9wdF8xMD0tMTUuNTI4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjM5NiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIGxtXzA9LTE5LjIwNSBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC01OS40MjgKKzEgfHx8IHJlY2VudGx5IGluZGlhIHdpdGggdW5pdGVkIG1hdHRlcnMgaW1wcm92ZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTUuMTU2IHRtX3B0XzY9LTE3LjE0NiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4xMDQgdG1fcHRfMTA9LTExLjMyMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS4xNzQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yMS40ODEgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNTkuNDc3CisxIHx8fCByZWNlbnRseSBpbmRpYSB3aXRoIHVuaXRlZCBzdGF0ZXMgcmVsYXRpb24gaW1wcm92ZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTUuNjYxIHRtX3B0XzY9LTE1Ljg0OSB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS43NDIgdG1fcHRfMTA9LTEwLjg4NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC40MTIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD02LjAwMCBsbV8wPS0yMS40OTEgbG1fMT0tMjkuMzUwIFdvcmRQZW5hbHR5PS00LjM0MyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNTkuNjAyCisxIHx8fCByZWNlbnRseSB0aGUgd2l0aCB1bml0ZWQgcmVsYXRpb24gaW1wcm92ZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTcuMDYyIHRtX3B0XzY9LTE1Ljg1NyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4xMDQgdG1fcHRfMTA9LTE0LjQ2MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS44MjIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yMC44MzUgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNTkuNjQ3CisxIHx8fCByZWNlbnRseSB3aXRoIHRoZSB1bml0ZWQgc3RhdGVzIHJlbGF0aW9uIGltcHJvdmVkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE4LjkxMyB0bV9wdF82PS0xNS45NDYgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTEuNzQzIHRtX3B0XzEwPS0xNC44ODYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNjMzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMTguODczIGxtXzE9LTI5LjM1MCBXb3JkUGVuYWx0eT0tNC4zNDMgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTU5LjgwNgorMiB8fHwgbWF0aGVtYXRpY3Mgc28gc2NpZW5jZSBsYW5ndWFnZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS02LjQ4MyB0bV9wdF82PS0zLjM4NyB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4wMDIgdG1fcHRfMTA9LTMuMzc4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjYyNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIGxtXzA9LTE1LjE0MSBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0zNC42ODIKKzIgfHx8IG1hdGhlbWF0aWNzIGlzIHNjaWVuY2UgbGFuZ3VhZ2UgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTAuMzc1IHRtX3B0XzY9LTMuOTI2IHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjA1MiB0bV9wdF8xMD0tOC4zMjYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuMzMwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgbG1fMD0tMTIuODkwIGxtXzE9LTE5LjU2NyBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTM0Ljc1NAorMiB8fHwgbWF0aGVtYXRpY3MgdGhhdCBzY2llbmNlIGxhbmd1YWdlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS00LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTkuNjI1IHRtX3B0XzY9LTMuOTI2IHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjA1MiB0bV9wdF8xMD0tNy42MDcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuMzMwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgbG1fMD0tMTQuMDAxIGxtXzE9LTE5LjU2NyBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTM1Ljc5OAorMiB8fHwgbWF0aGVtYXRpY3Mgc28gc2NpZW5jZSBsYW5ndWFnZSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tNy4wNjAgdG1fcHRfNj0tMTAuNDgxIHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjEzOCB0bV9wdF8xMD0tNy44ODggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNDE3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgbG1fMD0tMTUuMDc4IGxtXzE9LTE2LjMwNiBXb3JkUGVuYWx0eT0tMi42MDYgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTM2Ljk1MgorMiB8fHwgbWF0aGVtYXRpY3MgaXMgc2NpZW5jZSBsYW5ndWFnZSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTAuOTUxIHRtX3B0XzY9LTExLjAyMCB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4xODggdG1fcHRfMTA9LTEyLjgzNSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS4xMjIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD00LjAwMCBsbV8wPS0xMi44MjcgbG1fMT0tMTYuMzA2IFdvcmRQZW5hbHR5PS0yLjYwNiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMzcuMDI0CiszIHx8fCBmcm9tIHRoaXMgaXQgdW5kZXJzdG9vZCB0aGF0IHRoaXMg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaV4Kaf4Ka/IHdpbGwg4KaP4Kar4KaG4Kaw4Kah4Kas4KeN4Kay4Ka/4KaJIOCmruCnh+Cmn+CnjeCmsOCmv+CmlSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xNC41OTUgdG1fcHRfNj0tMTMuMTcxIHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0xLjQwNSB0bV9wdF8xMD0tOS40OTggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuOTE1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tMzIuMzcxIGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM3Ny4yODcKKzMgfHx8IGZyb20gdGhpcyBpdCB3aWxsIGJlIHVuZGVyc3Rvb2QgdGhhdCB0aGUg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaV4Kaf4Ka/IOCmj+Cmq+CmhuCmsOCmoeCmrOCnjeCmsuCmv+CmiSDgpq7gp4fgpp/gp43gprDgpr/gppUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMjAuMzY2IHRtX3B0XzY9LTE0LjQxNiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS4zODkgdG1fcHRfMTA9LTYuOTQzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjQ1NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI4LjQ3NCBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNzcuNjQzCiszIHx8fCBmcm9tIHRoaXMgaXQgdW5kZXJzdG9vZCB0aGF0IHRoaXMg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaV4Kaf4Ka/IGJlIOCmj+Cmq+CmhuCmsOCmoeCmrOCnjeCmsuCmv+CmiSDgpq7gp4fgpp/gp43gprDgpr/gppUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTUuNzMzIHRtX3B0XzY9LTEzLjA3OSB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMS40MDUgdG1fcHRfMTA9LTEwLjUxMyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS45MTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS0zMi42NTYgbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzc4LjA4OQorMyB8fHwgZnJvbSB0aGlzIGl0IHVuZGVyc3Rvb2QgdGhhdCB0aGlzIHdpbGwg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaV4Kaf4Ka/IOCmj+Cmq+CmhuCmsOCmoeCmrOCnjeCmsuCmv+CmiSDgpq7gp4fgpp/gp43gprDgpr/gppUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTQuNTk1IHRtX3B0XzY9LTEzLjE3MSB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMS41MjIgdG1fcHRfMTA9LTcuNzQwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjMwOSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTMxLjkwMyBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNzguMDk5CiszIHx8fCBmcm9tIHRoaXMgZWFzaWx5IHVuZGVyc3Rvb2QgdGhhdCB0aGlzIOCmruCnh+Cmn+CnjeCmsOCmv+CmleCmn+CmvyB3aWxsIOCmj+Cmq+CmhuCmsOCmoeCmrOCnjeCmsuCmv+CmiSDgpq7gp4fgpp/gp43gprDgpr/gppUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMTAuNjkzIHRtX3B0XzY9LTEyLjI3NyB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMS41MjIgdG1fcHRfMTA9LTYuNjU5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjA2OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS0zNS4xOTYgbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzc4LjE4MAorMyB8fHwgZnJvbSB0aGlzIGl0IHdpbGwgYmUgdW5kZXJzdG9vZCB0aGF0IHRoaXMg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaV4Kaf4Ka/IOCmj+Cmq+CmhuCmsOCmoeCmrOCnjeCmsuCmv+CmiSDgpq7gp4fgpp/gp43gprDgpr/gppUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMTcuMDMwIHRtX3B0XzY9LTEzLjEyNCB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMS4zODYgdG1fcHRfMTA9LTcuODkyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjc5OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI4Ljk3NCBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNzguMzQ4CiszIHx8fCBmcm9tIHRoaXMgaXQgdW5kZXJzdG9vZCB0aGF0IHRoZSDgpq7gp4fgpp/gp43gprDgpr/gppXgpp/gpr8gd2lsbCDgpo/gpqvgpobgprDgpqHgpqzgp43gprLgpr/gpokg4Kau4KeH4Kaf4KeN4Kaw4Ka/4KaVIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE3LjkzMCB0bV9wdF82PS0xNC40NjMgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTEuNDIzIHRtX3B0XzEwPS05LjE0NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi4xNjMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0zMS44NzEgbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzc4LjUzNAorMyB8fHwgZnJvbSB0aGlzIGl0IHdpbGwgdW5kZXJzdG9vZCB0aGF0IHRoZSDgpq7gp4fgpp/gp43gprDgpr/gppXgpp/gpr8g4KaP4Kar4KaG4Kaw4Kah4Kas4KeN4Kay4Ka/4KaJIOCmruCnh+Cmn+CnjeCmsOCmv+CmlSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0xNy45MzAgdG1fcHRfNj0tMTQuNDYzIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjUyNCB0bV9wdF8xMD0tNi40MzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuNDc5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgbG1fMD0tMzAuMzEzIGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM3OC43MDgKKzQgfHx8IHNhbWUgd2l0aCB0aGUgZWFydGhjZW50ZXJlZCDgprjgpr7gpq7gpqjgp43gpqTgpqTgpqjgp43gpqTgp43gprDgp4fgprAg4Kaq4Kak4Kao4KeH4KawIGluZGljYXRpb24gbWF0Y2ggZnJvbSB0aGlzIG5vdmVsIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE2LjIxMiB0bV9wdF82PS0xMC4wODQgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuMDA1IHRtX3B0XzEwPS0xMi4zMzggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMDE4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS0zOS42NDEgbG1fMT0tNDIuMzk1IFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjkwLjQyMworNCB8fHwgc2FtZSB3aXRoIHRoZSBlYXJ0aGNlbnRlcmVkIOCmuOCmvuCmruCmqOCnjeCmpOCmpOCmqOCnjeCmpOCnjeCmsOCnh+CmsCDgpqrgpqTgpqjgp4fgprAgcHJlc2FnZSBtYXRjaCBmcm9tIHRoaXMgbm92ZWwgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMTUuMTEzIHRtX3B0XzY9LTEwLjA4NCB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMy4wMDUgdG1fcHRfMTA9LTEyLjMzOCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS4wMTggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTM5LjkxNiBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTAuNTUzCis0IHx8fCB0aGUgd2l0aCB0aGUgZWFydGhjZW50ZXJlZCDgprjgpr7gpq7gpqjgp43gpqTgpqTgpqjgp43gpqTgp43gprDgp4fgprAg4Kaq4Kak4Kao4KeH4KawIGluZGljYXRpb24gbWF0Y2ggZnJvbSB0aGlzIG5vdmVsIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIwLjY0MCB0bV9wdF82PS05Ljk4MyB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMy4wMjQgdG1fcHRfMTA9LTE4LjU0NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi40MDUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTM3LjU0NiBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTAuNzU3Cis0IHx8fCB0aGUgd2l0aCB0aGUgZWFydGhjZW50ZXJlZCDgprjgpr7gpq7gpqjgp43gpqTgpqTgpqjgp43gpqTgp43gprDgp4fgprAg4Kaq4Kak4Kao4KeH4KawIHByZXNhZ2UgbWF0Y2ggZnJvbSB0aGlzIG5vdmVsIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE5LjU0MSB0bV9wdF82PS05Ljk4MyB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMy4wMjQgdG1fcHRfMTA9LTE4LjU0NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi40MDUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTM3LjgyMCBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTAuODg3Cis0IHx8fCBzYW1lIHdpdGggdGhlIGVhcnRoY2VudGVyZWQg4Ka44Ka+4Kau4Kao4KeN4Kak4Kak4Kao4KeN4Kak4KeN4Kaw4KeH4KawIOCmquCmpOCmqOCnh+CmsCBpbmRpY2F0aW9uIG1hdGNoIGZyb20gdGhpcyBub3ZlbHMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMTUuMTY0IHRtX3B0XzY9LTkuNjM3IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjAwNSB0bV9wdF8xMD0tMTEuMTgyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjY1MSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tNDEuNzk4IGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI5Mi4zMDgKKzQgfHx8IHNhbWUgd2l0aCB0aGUgZWFydGhjZW50ZXJlZCDgprjgpr7gpq7gpqjgp43gpqTgpqTgpqjgp43gpqTgp43gprDgp4fgprAg4Kaq4Kak4Kao4KeH4KawIGluZGljYXRpb24gbWF0Y2ggdGhpcyBub3ZlbCBmcm9tIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMTYuMjEyIHRtX3B0XzY9LTEwLjA4NCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuMDAzIHRtX3B0XzEwPS0xMi4wNTQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMzQyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBsbV8wPS00MS44MjcgbG1fMT0tNDIuMzk1IFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjkyLjM5MgorNCB8fHwgc2FtZSB3aXRoIHRoZSBlYXJ0aGNlbnRlcmVkIOCmuOCmvuCmruCmqOCnjeCmpOCmpOCmqOCnjeCmpOCnjeCmsOCnh+CmsCDgpqrgpqTgpqjgp4fgprAgcHJlc2FnZSBtYXRjaCBmcm9tIHRoaXMgbm92ZWxzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE0LjA2NiB0bV9wdF82PS05LjYzNyB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMy4wMDUgdG1fcHRfMTA9LTExLjE4MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC42NTEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTQyLjA3MyBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTIuNDM4Cis0IHx8fCBzYW1lIHdpdGggdGhlIGVhcnRoY2VudGVyZWQg4Ka44Ka+4Kau4Kao4KeN4Kak4Kak4Kao4KeN4Kak4KeN4Kaw4KeH4KawIOCmquCmpOCmqOCnh+CmsCBwcmVzYWdlIG1hdGNoIHRoaXMgbm92ZWwgZnJvbSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTE1LjExMyB0bV9wdF82PS0xMC4wODQgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0zLjAwMyB0bV9wdF8xMD0tMTIuMDU0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjM0MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tNDIuMTAyIGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI5Mi41MjIKKzQgfHx8IHRoZSB3aXRoIHRoZSBlYXJ0aGNlbnRlcmVkIOCmuOCmvuCmruCmqOCnjeCmpOCmpOCmqOCnjeCmpOCnjeCmsOCnh+CmsCDgpqrgpqTgpqjgp4fgprAgaW5kaWNhdGlvbiBtYXRjaCB0aGlzIG5vdmVsIGZyb20gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yMC42NDAgdG1fcHRfNj0tOS45ODMgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0zLjAyMSB0bV9wdF8xMD0tMTguMjYwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjcyOSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tMzkuNzMyIGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI5Mi43MjcKKzQgfHx8IHdpdGggdGhlIHNhbWUgZWFydGhjZW50ZXJlZCDgprjgpr7gpq7gpqjgp43gpqTgpqTgpqjgp43gpqTgp43gprDgp4fgprAg4Kaq4Kak4Kao4KeH4KawIGluZGljYXRpb24gbWF0Y2ggZnJvbSB0aGlzIG5vdmVsIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE2LjIxMiB0bV9wdF82PS0xMC4wODQgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuMzczIHRtX3B0XzEwPS0xNC4xODggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuODA5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTM3Ljc5NiBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTIuODAyCis1IHx8fCDgpqjgpr/gprDgp43gpqzgpprgpqjgp4cgbXVqaWIgYW5kIGhpcyBwYXJ0eSDgpqjgpr/gprDgppngp43gppXgp4HgprcgbWFqb3JpdHkgaW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTMuMTAyIHRtX3B0XzY9LTguNDgyIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjI4OSB0bV9wdF8xMD0tMTQuMjE2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjI1NiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yNS4xMjQgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjYyLjI3NQorNSB8fHwg4Kao4Ka/4Kaw4KeN4Kas4Kaa4Kao4KeHIG11amliIGFuZCBoaXMgcGFydHkg4Kao4Ka/4Kaw4KaZ4KeN4KaV4KeB4Ka3IG1ham9yaXR5IGluIHRoZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0xNi4zMTAgdG1fcHRfNj0tNi42OTUgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTAuMjg5IHRtX3B0XzEwPS0xMC4zNDQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuNDI4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tMjUuMjYzIGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI2Mi4yODIKKzUgfHx8IOCmqOCmv+CmsOCnjeCmrOCmmuCmqOCnhyBtdWppYiBhbmQgaGlzIHBhcnR5IOCmqOCmv+CmsOCmmeCnjeCmleCngeCmtyBtYWpvcml0eSBtYWpvcml0eSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS05Ljc4NyB0bV9wdF82PS05Ljg2OCB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC42MzkgdG1fcHRfMTA9LTEwLjQxMyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy4xNzIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjYuOTQ0IGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI2My45OTAKKzUgfHx8IOCmqOCmv+CmsOCnjeCmrOCmmuCmqOCnhyBtdWppYiBhbmQgaGlzIHBhcnR5IOCmqOCmv+CmsOCmmeCnjeCmleCngeCmtyBtYWpvcml0eSB0aGF0IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEyLjgxMCB0bV9wdF82PS05LjM1NyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC40MDYgdG1fcHRfMTA9LTEzLjc3MCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi43NjcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjYuMjM1IGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI2NC4wNTQKKzUgfHx8IOCmqOCmv+CmsOCnjeCmrOCmmuCmqOCnhyBtdWppYiBhbmQgaGlzIHBhcnR5IG1ham9yaXR5IGluIOCmqOCmv+CmsOCmmeCnjeCmleCngeCmtyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xMy4xMDIgdG1fcHRfNj0tOC40ODIgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuNTIyIHRtX3B0XzEwPS0xMi45MTcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuMzc0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI1LjEyNCBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNjQuMTM1Cis1IHx8fCDgpqjgpr/gprDgp43gpqzgpprgpqjgp4cgbXVqaWIgYW5kIGhpcyBwYXJ0eSDgpqjgpr/gprDgppngp43gppXgp4HgprcgbWFqb3JpdHkgdGhhdCB0aGUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTYuMDE4IHRtX3B0XzY9LTcuNTcxIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjI3MSB0bV9wdF8xMD0tNS42MTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuMTYxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMjcuNzAyIGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI2NC40ODQKKzUgfHx8IOCmqOCmv+CmsOCnjeCmrOCmmuCmqOCnhyBtdWppYiBhbmQgaGlzIHBhcnR5IOCmqOCmv+CmsOCmmeCnjeCmleCngeCmtyBtYWpvcml0eSB3aGVyZSB0aGUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTUuMDMyIHRtX3B0XzY9LTkuMTgwIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjQwNiB0bV9wdF8xMD0tMi4xNTMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTAuNDY4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjguMTg4IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI2NC41NTgKKzYgfHx8IOCmueCmv+Cmn+CmsuCmvuCmsOCmkyDgpqzgpr7gpq3gpr7gprDgpr/gpq/gprzgpr7gprAg4Kau4Ka/4KaJ4Kao4Ka/4KaWIOCmtuCmueCmsOCnh+CmhyBoaXMgd29yayB3aXRoIHRvIHRoYXQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjIuNTA5IHRtX3B0XzY9LTExLjE2MyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS4zNzAgdG1fcHRfMTA9LTE4Ljg0NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi42ODEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tMzMuNDI1IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ3Ni43NDQKKzYgfHx8IOCmueCmv+Cmn+CmsuCmvuCmsOCmkyDgpqzgpr7gpq3gpr7gprDgpr/gpq/gprzgpr7gprAg4Kau4Ka/4KaJ4Kao4Ka/4KaWIOCmtuCmueCmsOCnh+CmhyBoaXMgd29yayB3aXRoIGNhbiB0aGF0IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE5LjI0MiB0bV9wdF82PS05LjgzMiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS41MDMgdG1fcHRfMTA9LTE3LjAxMSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy41MjggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tMzUuMjkyIGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ3Ny45MDgKKzYgfHx8IOCmueCmv+Cmn+CmsuCmvuCmsOCmkyDgpqzgpr7gpq3gpr7gprDgpr/gpq/gprzgpr7gprAg4Kau4Ka/4KaJ4Kao4Ka/4KaWIOCmtuCmueCmsOCnh+CmhyBoaXMgd29yayB3aXRoIHRoYXQgY2FuIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE5LjI0MiB0bV9wdF82PS05LjgzMiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTE3LjM3NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy4zMDUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS0zMy45NzMgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNDc3Ljk2NAorNiB8fHwg4Ka54Ka/4Kaf4Kay4Ka+4Kaw4KaTIOCmrOCmvuCmreCmvuCmsOCmv+Cmr+CmvOCmvuCmsCDgpq7gpr/gpongpqjgpr/gppYg4Ka24Ka54Kaw4KeH4KaHIGhpcyB3b3JrcyB3aXRoIHRvIHRoYXQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjIuODM5IHRtX3B0XzY9LTEyLjA5MCB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS4zNzEgdG1fcHRfMTA9LTE5LjMxNyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC41NzggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tMzMuNjk0IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ3OC4yNTEKKzYgfHx8IOCmueCmv+Cmn+CmsuCmvuCmsOCmkyDgpqzgpr7gpq3gpr7gprDgpr/gpq/gprzgpr7gprAg4Kau4Ka/4KaJ4Kao4Ka/4KaWIOCmtuCmueCmsOCnh+CmhyBoaXMgd29yayB3aXRoIGEgdGhhdCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0yNC4yMjkgdG1fcHRfNj0tMTMuMTA5IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjQxOCB0bV9wdF8xMD0tMTguOTg2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjYxMiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTMzLjEwOCBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC00NzguMzYyCis2IHx8fCDgprngpr/gpp/gprLgpr7gprDgppMg4Kas4Ka+4Kat4Ka+4Kaw4Ka/4Kav4Ka84Ka+4KawIOCmruCmv+CmieCmqOCmv+CmliDgprbgprngprDgp4fgpocgaGlzIHdvcmtzIHdpdGggY2FuIHRoYXQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTkuNTcyIHRtX3B0XzY9LTEwLjc1OSB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS41MDQgdG1fcHRfMTA9LTE3LjQ4MyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS40MjUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tMzUuNTYyIGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ3OS40MTQKKzYgfHx8IOCmueCmv+Cmn+CmsuCmvuCmsOCmkyDgpqzgpr7gpq3gpr7gprDgpr/gpq/gprzgpr7gprAg4Kau4Ka/4KaJ4Kao4Ka/4KaWIOCmtuCmueCmsOCnh+CmhyBoaXMgd29ya3Mgd2l0aCB0aGF0IGNhbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xOS41NzIgdG1fcHRfNj0tMTAuNzU5IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tMTcuODQ3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjIwMiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTM0LjI0MiBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC00NzkuNDcxCis3IHx8fCB0YXNrICwg4KaT4KaP4Ka4LeCmn+CnjeCmr+CmvuCmqCBhbmQgYWxzbyBzb21lIGxpbnV4IOCmquCnjeCmsOCmpOCmv+CmqOCmv+Cmp+Cmv+CmpOCnjeCmrOCmleCmvuCmsOCngCBjaGFyYWN0ZXIgaXMgYnV0IHRoZXNlIHZlcnkgaXMgbm90IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tMzYuODA1IHRtX3B0XzY9LTE1LjM3MiB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTEuODcxIHRtX3B0XzEwPS0yNC4zODAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuMDMwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBsbV8wPS00Ny4zOTAgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzE3LjU3NgorNyB8fHwgdGFzayAsIOCmk+Cmj+CmuC3gpp/gp43gpq/gpr7gpqggYW5kIHNvbWUgbW9yZSBsaW51eCDgpqrgp43gprDgpqTgpr/gpqjgpr/gpqfgpr/gpqTgp43gpqzgppXgpr7gprDgp4AgY2hhcmFjdGVyIGlzIGJ1dCB0aGVzZSB2ZXJ5IGlzIG5vdCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTM0LjgyMSB0bV9wdF82PS0xNC4wNzkgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0xLjg3NCB0bV9wdF8xMD0tMjQuNDYwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS05LjIwNCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNDcuNDE2IGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMxNy44MzUKKzcgfHx8IHRhc2sgLCDgppPgpo/gprgt4Kaf4KeN4Kav4Ka+4KaoIGFuZCBhbHNvIHNvbWUgbGludXgg4Kaq4KeN4Kaw4Kak4Ka/4Kao4Ka/4Kan4Ka/4Kak4KeN4Kas4KaV4Ka+4Kaw4KeAIGNoYXJhY3RlciBhcmUgYnV0IHRoZXNlIHZlcnkgaXMgbm90IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tMzUuNzI3IHRtX3B0XzY9LTE1LjExOCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTEuODcxIHRtX3B0XzEwPS0yMy4xMjMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguNjQ3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBsbV8wPS00OC4zMjYgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzE3Ljk3OQorNyB8fHwgdGFzayAsIOCmk+Cmj+CmuC3gpp/gp43gpq/gpr7gpqggYW5kIHNvbWUgbW9yZSBsaW51eCDgpqrgp43gprDgpqTgpr/gpqjgpr/gpqfgpr/gpqTgp43gpqzgppXgpr7gprDgp4AgY2hhcmFjdGVyIGFyZSBidXQgdGhlc2UgdmVyeSBpcyBub3QgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS0zMy43NDMgdG1fcHRfNj0tMTMuODI1IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44NzQgdG1fcHRfMTA9LTIzLjIwMyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC44MjEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIGxtXzA9LTQ4LjM1MiBsbV8xPS01NS40MzkgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMTguMjM4Cis3IHx8fCB0YXNrICwg4KaT4KaP4Ka4LeCmn+CnjeCmr+CmvuCmqCBhbmQgYWxzbyBzb21lIGxpbnV4IOCmquCnjeCmsOCmpOCmv+CmqOCmv+Cmp+Cmv+CmpOCnjeCmrOCmleCmvuCmsOCngCBjaGFyYWN0ZXIgdGhlcmUgYnV0IHRoZXNlIHZlcnkgaXMgbm90IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tMzQuNDM5IHRtX3B0XzY9LTE0LjkzOSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTEuODcxIHRtX3B0XzEwPS0yMi40NzYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuNTQxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBsbV8wPS00OC42ODAgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzE4LjI1OAorNyB8fHwgdGFzayAsIOCmk+Cmj+CmuC3gpp/gp43gpq/gpr7gpqggYW5kIG1vcmUgc29tZSBsaW51eCDgpqrgp43gprDgpqTgpr/gpqjgpr/gpqfgpr/gpqTgp43gpqzgppXgpr7gprDgp4AgY2hhcmFjdGVyIGlzIGJ1dCB0aGVzZSB2ZXJ5IGlzIG5vdCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTM0LjgyMSB0bV9wdF82PS0xNC4wNzkgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0xLjg3MSB0bV9wdF8xMD0tMjMuNTk5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04LjE4MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgbG1fMD0tNDkuMjAyIGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMxOC40OTMKKzcgfHx8IHRhc2sgLCDgppPgpo/gprgt4Kaf4KeN4Kav4Ka+4KaoIGFuZCBzb21lIG1vcmUgbGludXgg4Kaq4KeN4Kaw4Kak4Ka/4Kao4Ka/4Kan4Ka/4Kak4KeN4Kas4KaV4Ka+4Kaw4KeAIGNoYXJhY3RlciB0aGVyZSBidXQgdGhlc2UgdmVyeSBpcyBub3QgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS0zMi40NTYgdG1fcHRfNj0tMTMuNjQ2IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44NzQgdG1fcHRfMTA9LTIyLjU1NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOS43MTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIGxtXzA9LTQ4LjcwNiBsbV8xPS01NS40MzkgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMTguNTE3Cis3IHx8fCB0YXNrIHdpdGhvdXQg4KaT4KaP4Ka4LeCmn+CnjeCmr+CmvuCmqCBhbmQgc29tZSBtb3JlIGxpbnV4IOCmquCnjeCmsOCmpOCmv+CmqOCmv+Cmp+Cmv+CmpOCnjeCmrOCmleCmvuCmsOCngCBjaGFyYWN0ZXIgaXMgYnV0IHRoZXNlIHZlcnkgaXMgbm90IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tMzEuNDEzIHRtX3B0XzY9LTE2LjQzMSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTEuODc0IHRtX3B0XzEwPS0xNy4yNDQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuMjA0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS00OS40MDIgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzE4LjU3MgorNyB8fHwgdGFzayAsIOCmk+Cmj+CmuC3gpp/gp43gpq/gpr7gpqggYW5kIGFsc28gc29tZSBsaW51eCDgpqrgp43gprDgpqTgpr/gpqjgpr/gpqfgpr/gpqTgp43gpqzgppXgpr7gprDgp4AgY2hhcmFjdGVyIGlzIGJ1dCB0aGVzZSBhIGlzIG5vdCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTQwLjUyMSB0bV9wdF82PS0xNi40NDAgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0xLjg4OSB0bV9wdF8xMD0tMjguNDgzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS05LjkwNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgbG1fMD0tNDYuMjA1IGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMxOC41NzQKKzcgfHx8IHRhc2sgLCDgppPgpo/gprgt4Kaf4KeN4Kav4Ka+4KaoIGFuZCBzb21lIG1vcmUgbGludXgg4Kaq4KeN4Kaw4Kak4Ka/4Kao4Ka/4Kan4Ka/4Kak4KeN4Kas4KaV4Ka+4Kaw4KeAIGNoYXJhY3RlciBpcyBidXQgdGhlc2UgYSBpcyBub3QgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS0zOC41MzggdG1fcHRfNj0tMTUuMTQ3IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44OTIgdG1fcHRfMTA9LTI4LjU2MyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTAuMDc5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS00Ni4yMzAgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzE4LjgzMworOCB8fHwgaXQgc29jaWFsIHNpdHVhdGlvbiBpbiDgprjgpr/gpqbgp43gpqfgpr7gpqjgp43gpqTgppfgp43gprDgprngpqjgppXgpr7gprDgp4AgaGlzIG9wcG9zaXRpb25zIHdpdGgg4KaV4KeN4Kaw4KeA4Kah4Ka84Ka+4KaV4KeN4Ka34KeH4Kak4KeN4Kaw4KeHIGRlY2lzaW9uIG1ha2luZyB0aGUgcnVsZSBvZiBzZXJ2aWNlcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTQ1LjkzMCB0bV9wdF82PS0zMC40MTIgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0zLjQzMiB0bV9wdF8xMD0tMzMuMDM0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04Ljc1OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNDUuNTMxIGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyNi41NTQKKzggfHx8IHRoaXMgc29jaWFsIHNpdHVhdGlvbiBpbiDgprjgpr/gpqbgp43gpqfgpr7gpqjgp43gpqTgppfgp43gprDgprngpqjgppXgpr7gprDgp4AgaGlzIG9wcG9zaXRpb25zIHdpdGgg4KaV4KeN4Kaw4KeA4Kah4Ka84Ka+4KaV4KeN4Ka34KeH4Kak4KeN4Kaw4KeHIGRlY2lzaW9uIG1ha2luZyB0aGUgcnVsZSBvZiBzZXJ2aWNlcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTQ3LjUyNCB0bV9wdF82PS0zMS4zNTkgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0zLjQzMiB0bV9wdF8xMD0tMzQuOTY3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS05LjM5MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNDQuNzcwIGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyNi45NjcKKzggfHx8IGl0IHNvY2lhbCBzaXR1YXRpb24gaW4g4Ka44Ka/4Kam4KeN4Kan4Ka+4Kao4KeN4Kak4KaX4KeN4Kaw4Ka54Kao4KaV4Ka+4Kaw4KeAIGhpcyBvcHBvc2l0aW9ucyB3aXRoIOCmleCnjeCmsOCngOCmoeCmvOCmvuCmleCnjeCmt+Cnh+CmpOCnjeCmsOCnhyBkZWNpc2lvbiBtYWtpbmcgdGhlIHJ1bGVzIG9mIHNlcnZpY2VzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNDUuMzMyIHRtX3B0XzY9LTMxLjAwMCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTMuNTYxIHRtX3B0XzEwPS0zMi42NjYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuNDUxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS00Ni4wMTggbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzI3LjQ5OAorOCB8fHwgdGhpcyBzb2NpYWwgc2l0dWF0aW9uIGluIOCmuOCmv+CmpuCnjeCmp+CmvuCmqOCnjeCmpOCml+CnjeCmsOCmueCmqOCmleCmvuCmsOCngCBoaXMgb3Bwb3NpdGlvbnMgd2l0aCDgppXgp43gprDgp4DgpqHgprzgpr7gppXgp43gprfgp4fgpqTgp43gprDgp4cgZGVjaXNpb24gbWFraW5nIHRoZSBydWxlcyBvZiBzZXJ2aWNlcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTQ2LjkyNSB0bV9wdF82PS0zMS45NDcgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0zLjU2MSB0bV9wdF8xMD0tMzQuNTk5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMC4wODMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIGxtXzA9LTQ1LjI1NyBsbV8xPS01NS40MzkgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjcuOTExCis4IHx8fCBpdCBzb2NpYWwgc2l0dWF0aW9uIGluIOCmuOCmv+CmpuCnjeCmp+CmvuCmqOCnjeCmpOCml+CnjeCmsOCmueCmqOCmleCmvuCmsOCngCBoaXMgb3Bwb3NpdGlvbnMgd2l0aCDgppXgp43gprDgp4DgpqHgprzgpr7gppXgp43gprfgp4fgpqTgp43gprDgp4cgZGVjaXNpb24gbWFraW5nIHRoZSBydWxlIG9mIHRoZSBmaW5nZXJzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNDguNDk3IHRtX3B0XzY9LTI0LjgzOCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTMuNjY1IHRtX3B0XzEwPS0zNC4wMzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEwLjU4MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgbG1fMD0tNDcuMDkwIGxtXzE9LTU4LjE2OSBXb3JkUGVuYWx0eT0tOC4yNTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyOC42NDQKKzggfHx8IGl0IHNvY2lhbCBzaXR1YXRpb24gaW4g4Ka44Ka/4Kam4KeN4Kan4Ka+4Kao4KeN4Kak4KaX4KeN4Kaw4Ka54Kao4KaV4Ka+4Kaw4KeAIGhpcyBvcHBvc2l0aW9ucyB3aXRoIOCmleCnjeCmsOCngOCmoeCmvOCmvuCmleCnjeCmt+Cnh+CmpOCnjeCmsOCnhyBkZWNpc2lvbiBtYWtpbmcgaXMgcnVsZSBvZiBzZXJ2aWNlcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTQ0LjMwNSB0bV9wdF82PS0zMC4xMzggdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0zLjQxNCB0bV9wdF8xMD0tMzEuMTQwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04LjE3MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNDguMzg0IGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyOC45NjcKKzggfHx8IHRoaXMgc29jaWFsIHNpdHVhdGlvbiBpbiDgprjgpr/gpqbgp43gpqfgpr7gpqjgp43gpqTgppfgp43gprDgprngpqjgppXgpr7gprDgp4AgaGlzIG9wcG9zaXRpb25zIHdpdGgg4KaV4KeN4Kaw4KeA4Kah4Ka84Ka+4KaV4KeN4Ka34KeH4Kak4KeN4Kaw4KeHIGRlY2lzaW9uIG1ha2luZyB0aGUgcnVsZSBvZiB0aGUgZmluZ2VycyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTUwLjA5MSB0bV9wdF82PS0yNS43ODUgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0zLjY2NSB0bV9wdF8xMD0tMzUuOTY1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMS4yMTQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTUuMDAwIGxtXzA9LTQ2LjMyOSBsbV8xPS01OC4xNjkgV29yZFBlbmFsdHk9LTguMjUyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjkuMDU2Cis5IHx8fCDgpqzgp4Pgprfgp43gpp/gpr/gpqrgpr7gpqTgpoMgYW5udWFsIOCnqOCnq+CnquCnpiDgpq7gpr/gprLgpr8gbWV0ZXJzIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0zLjM3MiB0bV9wdF82PS0zLjA1NCB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tMi4xNDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuMjYzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjYuMzQwIGxtXzE9LTE5LjU2NyBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM0NS4yODgKKzkgfHx8IOCmrOCng+Cmt+CnjeCmn+Cmv+CmquCmvuCmpOCmgyBhbm51YWwg4Keo4Ker4Keq4KemIOCmruCmv+CmsuCmvyBtZXRlciB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMy44ODUgdG1fcHRfNj0tMi44MjEgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTIuMTQwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjMzNyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI2LjMxNiBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNDUuMzAzCis5IHx8fCDgpqzgp4Pgprfgp43gpp/gpr/gpqrgpr7gpqTgpoMgYXJyYW5nZSDgp6jgp6vgp6rgp6Yg4Kau4Ka/4Kay4Ka/IG1ldGVycyB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMi45MTYgdG1fcHRfNj0tMy43NDggdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMS4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuOTU2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjYuNTMyIGxtXzE9LTE5LjU2NyBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM0NS44ODQKKzkgfHx8IOCmrOCng+Cmt+CnjeCmn+Cmv+CmquCmvuCmpOCmgyBhcnJhbmdlIOCnqOCnq+CnquCnpiDgpq7gpr/gprLgpr8gbWV0ZXIgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTMuNDMwIHRtX3B0XzY9LTMuNTE0IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjAzMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI2LjUwOSBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNDUuOTAwCis5IHx8fCDgpqzgp4Pgprfgp43gpp/gpr/gpqrgpr7gpqTgpoMgYW5udWFsIOCnqOCnq+CnquCnpiDgpq7gpr/gprLgpr8gbWV0cmVzIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0zLjYwOCB0bV9wdF82PS00LjM4OSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjUwMyB0bV9wdF8xMD0tMi4xNDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuODAzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjYuNzcxIGxtXzE9LTE5LjU2NyBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM0Ni45NzkKKzkgfHx8IOCmrOCng+Cmt+CnjeCmn+Cmv+CmquCmvuCmpOCmgyBhcnJhbmdlIOCnqOCnq+CnquCnpiDgpq7gpr/gprLgpr8gbWV0cmVzIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0zLjE1MyB0bV9wdF82PS01LjA4MyB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0xLjEzNSB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy40OTcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yNi45NjMgbG1fMT0tMTkuNTY3IFdvcmRQZW5hbHR5PS0zLjA0MCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzQ3LjU3NgorMTAgfHx8IGluIDIwMDQg4Kau4KeN4Kav4Ka+4Ka44Ka+4Kaa4KeB4Ka44KeH4Kaf4Ka4IOCmheCmmeCnjeCml+CmsOCmvuCmnOCnjeCmr+Cnh+CmsCDgpqzgprjgp43gpp/gpqggaW4g4Kah4KeH4Kau4KeL4KaV4KeN4Kaw4KeN4Kav4Ka+4KafIGluIHRoZSBuYXRpb25hbCB3YXMgaGUgbWFpbiBzcGVlY2ggLWxyYi0ga2V5bm90ZSBzcGVlY2ggLXJyYi0gb24gdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNDMuMTMzIHRtX3B0XzY9LTE3LjEzNiB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTEuNzM4IHRtX3B0XzEwPS0zNS4zNzEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguMTI3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBsbV8wPS02NC43MzUgbG1fMT0tNzEuNzQ1IFdvcmRQZW5hbHR5PS05Ljk4OSBPT1ZQZW5hbHR5PS02MDAuMDAwIHx8fCAtNzU0LjQwNworMTAgfHx8IGluIDIwMDQg4Kau4KeN4Kav4Ka+4Ka44Ka+4Kaa4KeB4Ka44KeH4Kaf4Ka4IOCmheCmmeCnjeCml+CmsOCmvuCmnOCnjeCmr+Cnh+CmsCDgpqzgprjgp43gpp/gpqggaW4g4Kah4KeH4Kau4KeL4KaV4KeN4Kaw4KeN4Kav4Ka+4KafIGluIHRoZSBuYXRpb25hbCB3YXMgaGUgbWFpbiBzcGVlY2ggLWxyYi0ga2V5bm90ZSBzcGVlY2ggLXJyYi0gdG8gdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNDQuMjEyIHRtX3B0XzY9LTE3LjI5MCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTEuNzA3IHRtX3B0XzEwPS0zNi4zNzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuOTA0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBsbV8wPS02NC40NTcgbG1fMT0tNzEuNzQ1IFdvcmRQZW5hbHR5PS05Ljk4OSBPT1ZQZW5hbHR5PS02MDAuMDAwIHx8fCAtNzU0LjQ3OAorMTAgfHx8IGluIDIwMDQg4Kau4KeN4Kav4Ka+4Ka44Ka+4Kaa4KeB4Ka44KeH4Kaf4Ka4IOCmheCmmeCnjeCml+CmsOCmvuCmnOCnjeCmr+Cnh+CmsCDgpqzgprjgp43gpp/gpqggaW4g4Kah4KeH4Kau4KeL4KaV4KeN4Kaw4KeN4Kav4Ka+4KafIGluIHRoZSBuYXRpb25hbCBoZSB3YXMgdGhlIHNwZWVjaCAtbHJiLSBrZXlub3RlIHNwZWVjaCAtcnJiLSBvbiB0aGUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS00Ny41NzkgdG1fcHRfNj0tMTcuODg0IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMS43MzggdG1fcHRfMTA9LTQyLjY2MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTIuMjY0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE3LjAwMCBsbV8wPS02MC41MDkgbG1fMT0tNzEuNzQ1IFdvcmRQZW5hbHR5PS05Ljk4OSBPT1ZQZW5hbHR5PS02MDAuMDAwIHx8fCAtNzU0LjYwNAorMTAgfHx8IGluIDIwMDQg4Kau4KeN4Kav4Ka+4Ka44Ka+4Kaa4KeB4Ka44KeH4Kaf4Ka4IOCmheCmmeCnjeCml+CmsOCmvuCmnOCnjeCmr+Cnh+CmsCDgpqzgprjgp43gpp/gpqggaW4g4Kah4KeH4Kau4KeL4KaV4KeN4Kaw4KeN4Kav4Ka+4KafIGluIHRoZSBuYXRpb25hbCBoZSB3YXMgdGhlIHNwZWVjaCAtbHJiLSBrZXlub3RlIHNwZWVjaCAtcnJiLSB0byB0aGUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS00OC42NTggdG1fcHRfNj0tMTguMDM4IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMS43MDcgdG1fcHRfMTA9LTQzLjY2MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTIuMDQxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE3LjAwMCBsbV8wPS02MC4yMzEgbG1fMT0tNzEuNzQ1IFdvcmRQZW5hbHR5PS05Ljk4OSBPT1ZQZW5hbHR5PS02MDAuMDAwIHx8fCAtNzU0LjY3NAorMTAgfHx8IGluIDIwMDQg4Kau4KeN4Kav4Ka+4Ka44Ka+4Kaa4KeB4Ka44KeH4Kaf4Ka4IOCmheCmmeCnjeCml+CmsOCmvuCmnOCnjeCmr+Cnh+CmsCDgpqzgprjgp43gpp/gpqggaW4g4Kah4KeH4Kau4KeL4KaV4KeN4Kaw4KeN4Kav4Ka+4KafIGluIHRoZSBuYXRpb25hbCB3YXMgaGUgbWFpbiBzcGVlY2ggLWxyYi0ga2V5bm90ZSBzcGVlY2ggLXJyYi0gLCB0aGUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00NS4zNDMgdG1fcHRfNj0tMTYuODMxIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi4wNTYgdG1fcHRfMTA9LTM5LjExNSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC44MjAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTguMDAwIGxtXzA9LTYzLjYwNCBsbV8xPS03MS43NDUgV29yZFBlbmFsdHk9LTkuOTg5IE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03NTQuODA0CisxMCB8fHwgaW4gMjAwNCDgpq7gp43gpq/gpr7gprjgpr7gpprgp4Hgprjgp4fgpp/gprgg4KaF4KaZ4KeN4KaX4Kaw4Ka+4Kac4KeN4Kav4KeH4KawIOCmrOCmuOCnjeCmn+CmqCBpbiDgpqHgp4fgpq7gp4vgppXgp43gprDgp43gpq/gpr7gpp8gaW4gdGhlIG5hdGlvbmFsIGhlIHdhcyB0aGUgc3BlZWNoIC1scmItIGtleW5vdGUgc3BlZWNoIC1ycmItICwgdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNDkuNzg5IHRtX3B0XzY9LTE3LjU3OCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTIuMDU2IHRtX3B0XzEwPS00Ni40MDUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEyLjk1NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNy4wMDAgbG1fMD0tNTkuMzc4IGxtXzE9LTcxLjc0NSBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc1NS4wMDAKKzEwIHx8fCBpbiAyMDA0IOCmruCnjeCmr+CmvuCmuOCmvuCmmuCngeCmuOCnh+Cmn+CmuCDgpoXgppngp43gppfgprDgpr7gppzgp43gpq/gp4fgprAg4Kas4Ka44KeN4Kaf4KaoIGluIOCmoeCnh+CmruCni+CmleCnjeCmsOCnjeCmr+CmvuCmnyBpbiB0aGUgbmF0aW9uYWwgaGUgd2FzIG1haW4gc3BlZWNoIC1scmItIGtleW5vdGUgc3BlZWNoIC1ycmItICwgdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNDUuMzQzIHRtX3B0XzY9LTE2LjgzMSB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTIuMDU2IHRtX3B0XzEwPS00MS43OTcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEwLjk3MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNy4wMDAgbG1fMD0tNjIuMTI5IGxtXzE9LTcxLjc0NSBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc1NS40MDAKKzExIHx8fCBwb3B1bGF0aW9uICwgcG93ZXIgZGlzdHJpYnV0aW9uIGVhc3QgcGFraXN0YW4gd2hlcmUgdG8gd2VzdCBwYWtpc3RhbiAiIG9uZSB1bml0IHRoZW9yeSAiIGlzIGEg4KaF4Kat4Ka/4Kao4KasIHN0YXJ0ZWQgd2l0aCB0aGUgd2hlcmUgdGhlIHJlZ2FyZGVkIGFzIGEgcHJvdmluY2Ugd2VzdCBwYWtpc3RhbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMjAuMDAwIHRtX3B0XzU9LTc1LjAzOCB0bV9wdF82PS00NS40ODQgdG1fcHRfNz0tMjUuMDAwIHRtX3B0Xzg9LTY3Ljk1MCB0bV9wdF85PS0zLjk0OCB0bV9wdF8xMD0tNTguMzk0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMy43MDYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTI5LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MjAuMDAwIGxtXzA9LTY5LjgxNSBsbV8xPS0xMDEuMDk1IFdvcmRQZW5hbHR5PS0xMy44OTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTMxMy4zMTIKKzExIHx8fCBwb3B1bGF0aW9uICwgcG93ZXIgZGlzdHJpYnV0aW9uIGVhc3QgcGFraXN0YW4gd2hlcmUgdG8gd2VzdCBwYWtpc3RhbiAiIG9uZSB1bml0IHRoZW9yeSAiIGlzIGEg4KaF4Kat4Ka/4Kao4KasIHRoZXkgc3RhcnRlZCB0aGUgd2hlcmUgdGhlIHJlZ2FyZGVkIGFzIGEgcHJvdmluY2Ugd2VzdCBwYWtpc3RhbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMjEuMDAwIHRtX3B0XzU9LTczLjY0NSB0bV9wdF82PS00NS40ODQgdG1fcHRfNz0tMjUuMDAwIHRtX3B0Xzg9LTY3Ljk1MCB0bV9wdF85PS0zLjYzMCB0bV9wdF8xMD0tNTcuMzEzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMy44MjQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTI5LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MjEuMDAwIGxtXzA9LTcxLjM2NSBsbV8xPS0xMDEuMDk1IFdvcmRQZW5hbHR5PS0xMy44OTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTMxMy40OTgKKzExIHx8fCBwb3B1bGF0aW9uICwgcG93ZXIgZGlzdHJpYnV0aW9uIGVhc3QgcGFraXN0YW4gd2hlcmUgdG8gd2VzdCBwYWtpc3RhbiAiIG9uZSB1bml0IHRoZW9yeSAiIGlzIGEg4KaF4Kat4Ka/4Kao4KasIHN0YXJ0ZWQgd2l0aCB0aGUgd2hlcmUgdGhlIHdlc3QgcGFraXN0YW4gcmVnYXJkZWQgYXMgYSBwcm92aW5jZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMjEuMDAwIHRtX3B0XzU9LTc1LjAzOCB0bV9wdF82PS00NS40ODQgdG1fcHRfNz0tMjUuMDAwIHRtX3B0Xzg9LTY3Ljk1MCB0bV9wdF85PS0zLjg5OCB0bV9wdF8xMD0tNTYuOTI2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMi44NDcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTI5LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MjEuMDAwIGxtXzA9LTcxLjY0MyBsbV8xPS0xMDEuMDk1IFdvcmRQZW5hbHR5PS0xMy44OTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTMxMy44ODQKKzExIHx8fCBwb3B1bGF0aW9uICwgcG93ZXIgZGlzdHJpYnV0aW9uIGVhc3QgcGFraXN0YW4gd2hlcmUgdG8gd2VzdCBwYWtpc3RhbiAiIG9uZSB1bml0IHRoZW9yeSAiIGlzIGEg4KaF4Kat4Ka/4Kao4KasIHRoZXkgc3RhcnRlZCB0aGUgd2hlcmUgdGhlIHdlc3QgcGFraXN0YW4gcmVnYXJkZWQgYXMgYSBwcm92aW5jZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMjIuMDAwIHRtX3B0XzU9LTczLjY0NSB0bV9wdF82PS00NS40ODQgdG1fcHRfNz0tMjUuMDAwIHRtX3B0Xzg9LTY3Ljk1MCB0bV9wdF85PS0zLjU4MCB0bV9wdF8xMD0tNTUuODQ0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMi45NjUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTI5LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MjIuMDAwIGxtXzA9LTczLjE5MiBsbV8xPS0xMDEuMDk1IFdvcmRQZW5hbHR5PS0xMy44OTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTMxNC4wNzAKKzExIHx8fCBwb3B1bGF0aW9uIG9uIHBvd2VyIGRpc3RyaWJ1dGlvbiBlYXN0IHBha2lzdGFuIHdoZXJlIHRvIHdlc3QgcGFraXN0YW4gIiBvbmUgdW5pdCB0aGVvcnkgIiBpcyBhIOCmheCmreCmv+CmqOCmrCBzdGFydGVkIHdpdGggdGhlIHdoZXJlIHRoZSB3ZXN0IHBha2lzdGFuIHJlZ2FyZGVkIGFzIGEgcHJvdmluY2UgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTI1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIxLjAwMCB0bV9wdF81PS03MS4wNTYgdG1fcHRfNj0tNDQuMDE4IHRtX3B0Xzc9LTI1LjAwMCB0bV9wdF84PS02Ny45NTAgdG1fcHRfOT0tNC41MzAgdG1fcHRfMTA9LTU0LjU2OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTMuNTQwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIxLjAwMCBsbV8wPS03Mi43MTkgbG1fMT0tMTAxLjA5NSBXb3JkUGVuYWx0eT0tMTMuODk3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0zMTQuMTA0CisxMSB8fHwgcG9wdWxhdGlvbiAsIHBvd2VyIGRpc3RyaWJ1dGlvbiBlYXN0IHBha2lzdGFuIHdoZXJlIHRvIHdlc3QgcGFraXN0YW4gIiBvbmUgdW5pdCB0aGVvcnkgIiBpcyBhIOCmheCmreCmv+CmqOCmrCBzdGFydGVkIHdpdGggdGhlIHdoZXJlIHRoZSB3ZXN0IHBha2lzdGFuIGNvbnNpZGVyZWQgYXMgYSBwcm92aW5jZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMjEuMDAwIHRtX3B0XzU9LTc1LjE0NyB0bV9wdF82PS00My45MjYgdG1fcHRfNz0tMjUuMDAwIHRtX3B0Xzg9LTY3Ljk1MCB0bV9wdF85PS00LjUzMCB0bV9wdF8xMD0tNTkuMjI4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMy41NDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTI5LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MjEuMDAwIGxtXzA9LTcxLjE3MCBsbV8xPS0xMDEuMDk1IFdvcmRQZW5hbHR5PS0xMy44OTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTMxNC4xNDgKKzExIHx8fCBwb3B1bGF0aW9uICwgcG93ZXIgZGlzdHJpYnV0aW9uIGVhc3QgcGFraXN0YW4gd2hlcmUgdG8gd2VzdCBwYWtpc3RhbiAiIG9uZSB1bml0IHRoZW9yeSAiIGlzIGEg4KaF4Kat4Ka/4Kao4KasIHRoZXkgc3RhcnRlZCB0aGUgd2hlcmUgdGhlIHdlc3QgcGFraXN0YW4gY29uc2lkZXJlZCBhcyBhIHByb3ZpbmNlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yMi4wMDAgdG1fcHRfNT0tNzMuNzU1IHRtX3B0XzY9LTQzLjkyNiB0bV9wdF83PS0yNS4wMDAgdG1fcHRfOD0tNjcuOTUwIHRtX3B0Xzk9LTQuMjEyIHRtX3B0XzEwPS01OC4xNDcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEzLjY1OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yMi4wMDAgbG1fMD0tNzIuNzE5IGxtXzE9LTEwMS4wOTUgV29yZFBlbmFsdHk9LTEzLjg5NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMzE0LjMzNAorMTEgfHx8IHBvcHVsYXRpb24gb24gcG93ZXIgZGlzdHJpYnV0aW9uIGVhc3QgcGFraXN0YW4gd2hlcmUgdG8gd2VzdCBwYWtpc3RhbiAiIG9uZSB1bml0IHRoZW9yeSAiIGlzIGEg4KaF4Kat4Ka/4Kao4KasIHN0YXJ0ZWQgd2l0aCB0aGUgd2hlcmUgdGhlIHdlc3QgcGFraXN0YW4gY29uc2lkZXJlZCBhcyBhIHByb3ZpbmNlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yMS4wMDAgdG1fcHRfNT0tNzEuMTY2IHRtX3B0XzY9LTQyLjQ1OSB0bV9wdF83PS0yNS4wMDAgdG1fcHRfOD0tNjcuOTUwIHRtX3B0Xzk9LTUuMTYzIHRtX3B0XzEwPS01Ni44NzEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTE0LjIzMyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yMS4wMDAgbG1fMD0tNzIuMjQ2IGxtXzE9LTEwMS4wOTUgV29yZFBlbmFsdHk9LTEzLjg5NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMzE0LjM2OAorMTEgfHx8IHBvcHVsYXRpb24gb24gcG93ZXIgZGlzdHJpYnV0aW9uIGVhc3QgcGFraXN0YW4gd2hlcmUgdG8gd2VzdCBwYWtpc3RhbiAiIG9uZSB1bml0IHRoZW9yeSAiIGlzIGEg4KaF4Kat4Ka/4Kao4KasIHN0YXJ0ZWQgd2l0aCB0aGUgd2hlcmUgdGhlIHJlZ2FyZGVkIGFzIGEgcHJvdmluY2Ugd2VzdCBwYWtpc3RhbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTkuMDAwIHRtX3B0XzU9LTcxLjA1NiB0bV9wdF82PS00NC4wMTggdG1fcHRfNz0tMjUuMDAwIHRtX3B0Xzg9LTY3Ljk1MCB0bV9wdF85PS00LjU4MCB0bV9wdF8xMD0tNTYuMDM5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xNC40MDEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTI5LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTkuMDAwIGxtXzA9LTcwLjg5MSBsbV8xPS0xMDEuMDk1IFdvcmRQZW5hbHR5PS0xMy44OTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTMxNC40OTgKKzEyIHx8fCB0aGUg4Kaq4Kaw4Ka/4Kau4Ka+4Kaq4KaoIHRoZW9yeSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tOS4zMDkgdG1fcHRfNj0tMy45ODggdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTcuOTE2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjMxNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTExLjExMiBsbV8xPS0xMy4wNDUgV29yZFBlbmFsdHk9LTIuMTcxIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMjYuNTU2CisxMiB8fHwgbWF0aGVtYXRpY2FsIOCmquCmsOCmv+CmruCmvuCmquCmqCB0aGVvcnkgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTIuODY5IHRtX3B0XzY9LTIuODkwIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPS00Ljg4OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi4wMTAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBsbV8wPS0xMi42NjUgbG1fMT0tMTMuMDQ1IFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTI2Ljg0OAorMTIgfHx8IOKAoiDgpqrgprDgpr/gpq7gpr7gpqrgpqggdGhlb3J5IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0xLjA0NiB0bV9wdF82PS01LjI0MSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tMC40MjIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuMzE2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMTQuMjE3IGxtXzE9LTEzLjA0NSBXb3JkUGVuYWx0eT0tMi4xNzEgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEyNy4zMDEKKzEyIHx8fCAuIOCmquCmsOCmv+CmruCmvuCmquCmqCB0aGVvcnkgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTcuOTAwIHRtX3B0XzY9LTIuOTkwIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMDE4IHRtX3B0XzEwPS0zLjY0MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMS43MTIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0xMi43NTggbG1fMT0tMTMuMDQ1IFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTI3LjY5MQorMTMgfHx8IGV4dGVybmFsIGxpbmtzIG9mIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS03LjM5MCB0bV9wdF82PS0yLjcyOSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjAxOCB0bV9wdF8xMD0tNS4yODUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuNjExIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tNi45ODYgbG1fMT0tMTMuMDQ1IFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMjAuNDU5CisxMyB8fHwgb3V0LWxpbmtzIG9mIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS02LjkzOCB0bV9wdF82PS00Ljc5NSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjAxOCB0bV9wdF8xMD0tNS4yODUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuMjk3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tOC4wNzggbG1fMT0tOS43ODMgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0yMC45MjUKKzEzIHx8fCBleHRlcm5hbCBsaW5rIG9mIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS04LjA5MSB0bV9wdF82PS0yLjg3MSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjAxOCB0bV9wdF8xMD0tNS4yODUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuNzY3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tNy41MzMgbG1fMT0tMTMuMDQ1IFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMjEuNzI4CisxMyB8fHwgZXh0ZXJuYWwgY29tbXVuaWNhdGlvbiBvZiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tOC4yNjUgdG1fcHRfNj0tMi44ODYgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4wMTggdG1fcHRfMTA9LTUuMjg1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjU1NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTcuNjkyIGxtXzE9LTEzLjA0NSBXb3JkUGVuYWx0eT0tMi4xNzEgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTIxLjg4OAorMTMgfHx8IGRlc2NyaXB0aW9uIG9mIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0xMC41MjEgdG1fcHRfNj0tNy4wOTggdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMS4wMTggdG1fcHRfMTA9LTUuOTc4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjYwMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTYuMjgxIGxtXzE9LTkuNzgzIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMjEuOTg5CisxMyB8fHwgb3V0LWxpbmtzIGJ5IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS01Ljg2NiB0bV9wdF82PS01Ljk0OCB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tNC44MTYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuMjE0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tOC40OTUgbG1fMT0tOS43ODMgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0yMi4xMTkKKzEzIHx8fCBpbnRlci1jb25uZWN0aXZpdHkgb2YgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTYuOTM4IHRtX3B0XzY9LTYuNDA1IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMzg2IHRtX3B0XzEwPS01LjI4NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC45MDcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS04LjQ0NyBsbV8xPS05Ljc4MyBXb3JkUGVuYWx0eT0tMS43MzcgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTIyLjgwMworMTQgfHx8IHRhdGEgY29tbXVuaWNhdGlvbmVyICIgZm9yZWlnbiBzYW5jaGFyIG5pZ2FtIGxpbWl0ZWQgYnVpbGRpbmcgaXQgaW4gdGVsZWNvbW11bmljYXRpb24gc3lzdGVtIGEgbWFpbiBwcm92aWRlcnMgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMzEuMTgyIHRtX3B0XzY9LTE4Ljg0OCB0bV9wdF83PS0xMi4wMDAgdG1fcHRfOD0tMzIuNjE2IHRtX3B0Xzk9LTQuNDIwIHRtX3B0XzEwPS0yMC4wMjggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTExLjUwNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDcuNjE4IGxtXzE9LTUyLjE3OCBXb3JkUGVuYWx0eT0tNy4zODMgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTExOS44MjIKKzE0IHx8fCB0YXRhIGNvbW11bmljYXRpb25lciAiIGZvcmVpZ24gc2FuY2hhciBuaWdhbSBsaW1pdGVkIGJ1aWxkaW5nIGl0IHRoZSB0ZWxlY29tbXVuaWNhdGlvbiBzeXN0ZW0gYSBtYWluIHByb3ZpZGVycyB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEyLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zMC4yOTQgdG1fcHRfNj0tMTcuMDI4IHRtX3B0Xzc9LTEyLjAwMCB0bV9wdF84PS0zMi42MTYgdG1fcHRfOT0tNC4zNzAgdG1fcHRfMTA9LTE5Ljc3NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTAuMTg0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00OC44NjYgbG1fMT0tNTIuMTc4IFdvcmRQZW5hbHR5PS03LjM4MyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTIwLjAwMAorMTQgfHx8IHRhdGEgY29tbXVuaWNhdGlvbiAiIGZvcmVpZ24gc2FuY2hhciBuaWdhbSBsaW1pdGVkIGJ1aWxkaW5nIGl0IHRoZSB0ZWxlY29tbXVuaWNhdGlvbiBzeXN0ZW0gYSBtYWluIHByb3ZpZGVycyB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEyLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zNC44NDggdG1fcHRfNj0tMTcuMDI4IHRtX3B0Xzc9LTEyLjAwMCB0bV9wdF84PS0zMi42MTYgdG1fcHRfOT0tNC4zNzAgdG1fcHRfMTA9LTIyLjkxMSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTAuMTg0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00Ny42MTIgbG1fMT0tNTIuMTc4IFdvcmRQZW5hbHR5PS03LjM4MyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTIwLjEzMworMTQgfHx8IHRhdGEgY29tbXVuaWNhdGlvbmVyICIgZm9yZWlnbiBzYW5jaGFyIG5pZ2FtIGxpbWl0ZWQgYnVpbGRpbmcgaXQgY2l0eSB0ZWxlY29tbXVuaWNhdGlvbiBzeXN0ZW0gYSBtYWluIHByb3ZpZGVycyB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yNy4yMDQgdG1fcHRfNj0tMTcuOTQxIHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tNS4zNzAgdG1fcHRfMTA9LTE1LjQyMSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC44OTIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTUwLjg1OSBsbV8xPS01Mi4xNzggV29yZFBlbmFsdHk9LTcuMzgzIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xMjEuMjI5CisxNSB8fHwgaGUgdGhhdCB5ZWFyIOCnquCmhyDgpqjgpq3gp4fgpq7gp43gpqzgprDgp4fgprAgbmF0aW9uYWwgYXNzZW1ibHkgaW4gZWxlY3Rpb24gd29uIGFsbCBhbmQgdW5pdGVkIHN0YXRlcyBlbGVjdGVkIGFzIDQ0dGggcHJlc2lkZW50IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0zNS44NDUgdG1fcHRfNj0tMTYuNDY1IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMS43OTMgdG1fcHRfMTA9LTExLjMwMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4xMjAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE3LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tNTIuNTM4IGxtXzE9LTY1LjIyMyBXb3JkUGVuYWx0eT0tOS4xMjAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyOS43NTgKKzE1IHx8fCBoZSB0aGF0IHllYXIg4Keq4KaHIOCmqOCmreCnh+CmruCnjeCmrOCmsOCnh+CmsCBuYXRpb25hbCBhc3NlbWJseSBpbiB0aGUgd29uIGFsbCBhbmQgdW5pdGVkIHN0YXRlcyBlbGVjdGVkIGFzIDQ0dGggcHJlc2lkZW50IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS00Mi41MjUgdG1fcHRfNj0tMTcuNjI4IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMS43OTkgdG1fcHRfMTA9LTE3LjE1NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC45NjcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE3LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tNDkuODQ4IGxtXzE9LTY1LjIyMyBXb3JkUGVuYWx0eT0tOS4xMjAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyOS45MzAKKzE1IHx8fCBoZSB0aGF0IHllYXIg4Keq4KaHIOCmqOCmreCnh+CmruCnjeCmrOCmsOCnh+CmsCBhc3NlbWJseSBpbiBuYXRpb25hbCBlbGVjdGlvbiB3b24gYWxsIGFuZCB1bml0ZWQgc3RhdGVzIGVsZWN0ZWQgYXMgNDR0aCBwcmVzaWRlbnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTM1Ljg0NSB0bV9wdF82PS0xNi40NjUgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjc5MyB0bV9wdF8xMD0tMTEuMDk3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjkwNCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTcuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS01Mi40NTMgbG1fMT0tNjUuMjIzIFdvcmRQZW5hbHR5PS05LjEyMCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzMwLjQ4OAorMTUgfHx8IGhlIHRoYXQgeWVhciDgp6rgpocg4Kao4Kat4KeH4Kau4KeN4Kas4Kaw4KeH4KawIGFzc2VtYmx5IHRoZSBuYXRpb25hbCBlbGVjdGlvbiB3b24gYWxsIGFuZCB1bml0ZWQgc3RhdGVzIGVsZWN0ZWQgYXMgNDR0aCBwcmVzaWRlbnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTM3LjYzNyB0bV9wdF82PS0xNy4zMjUgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjgwNCB0bV9wdF8xMD0tMTIuMzQ5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjA4NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTcuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS01MS42NjUgbG1fMT0tNjUuMjIzIFdvcmRQZW5hbHR5PS05LjEyMCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzMwLjU1MAorMTUgfHx8IGluIHRoZSB5ZWFyIOCnquCmhyDgpqjgpq3gp4fgpq7gp43gpqzgprDgp4fgprAgbmF0aW9uYWwgYXNzZW1ibHkgaW4gZWxlY3Rpb24gd29uIGFsbCBhbmQgdW5pdGVkIHN0YXRlcyBlbGVjdGVkIGFzIDQ0dGggcHJlc2lkZW50IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS00Mi45NzggdG1fcHRfNj0tMTkuNjc0IHRtX3B0Xzc9LTEyLjAwMCB0bV9wdF84PS0zMi42MTYgdG1fcHRfOT0tMS40MjUgdG1fcHRfMTA9LTIxLjUzMSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC4zMjcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE3LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tNDcuOTU3IGxtXzE9LTY1LjIyMyBXb3JkUGVuYWx0eT0tOS4xMjAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMzMC41ODMKKzE1IHx8fCBpbiB0aGF0IHllYXIg4Keq4KaHIOCmqOCmreCnh+CmruCnjeCmrOCmsOCnh+CmsCBuYXRpb25hbCBhc3NlbWJseSBpbiBlbGVjdGlvbiB3b24gYWxsIGFuZCB1bml0ZWQgc3RhdGVzIGVsZWN0ZWQgYXMgNDR0aCBwcmVzaWRlbnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTQwLjk0OCB0bV9wdF82PS0xOS43NDUgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjc5MyB0bV9wdF8xMD0tMTUuNDk4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03Ljc1MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTcuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS00OS42MTQgbG1fMT0tNjUuMjIzIFdvcmRQZW5hbHR5PS05LjEyMCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzMwLjYxMworMTUgfHx8IGhlIHRoYXQgeWVhciDgp6rgpocg4Kao4Kat4KeH4Kau4KeN4Kas4Kaw4KeH4KawIG5hdGlvbmFsIGFzc2VtYmx5IDQ0dGggcHJlc2lkZW50IGFuZCB1bml0ZWQgc3RhdGVzIHdhcyBlbGVjdGVkIGFzIHRoZSB3b24gYWxsIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS00MS45MDYgdG1fcHRfNj0tMTguMDI0IHRtX3B0Xzc9LTEyLjAwMCB0bV9wdF84PS0zMi42MTYgdG1fcHRfOT0tMy40MjQgdG1fcHRfMTA9LTE4Ljg4OSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC44NDUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE3LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tNDcuMjg5IGxtXzE9LTY1LjIyMyBXb3JkUGVuYWx0eT0tOS4xMjAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMzMC42MzkKKzE2IHx8fCBtYW55IGluZGlhbiDgpqrgp43gprDgppzgpr7gpqTgpr8gZmlnaHRpbmcg4Kac4Ka+4KakIOCmn+Cnh+CmleCnjeCmuOCmviBmcm9tIHVwcGVyIHN0YWdlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNC41NTYgdG1fcHRfNj0tMTIuMTI1IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0tMi42NzAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTAuOTEyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMzUuNzI4IGxtXzE9LTMyLjA4MCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM3MS44MTcKKzE2IHx8fCBtYW55IGluZGlhbiDgpqrgp43gprDgppzgpr7gpqTgpr8gZmlnaHRpbmcg4Kac4Ka+4KakIGZyb20g4Kaf4KeH4KaV4KeN4Ka44Ka+IHVwcGVyIHN0YWdlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xNC41NTYgdG1fcHRfNj0tMTIuMTI1IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0tMy4wMDIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuNTM3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMzUuNzI4IGxtXzE9LTMyLjA4MCBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM3My4wODkKKzE2IHx8fCBtYW55IGluZGlhbiDgpqrgp43gprDgppzgpr7gpqTgpr8gZmlnaHRpbmcg4Kac4Ka+4KakIOCmn+Cnh+CmleCnjeCmuOCmviB0byB1cHBlciBzdGFnZSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTYuNTE4IHRtX3B0XzY9LTEzLjAwNCB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTQuNDc0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjI0MSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTM1LjQ2NCBsbV8xPS0zMi4wODAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNzMuMTA1CisxNiB8fHwgbWFueSBpbmRpYW4g4Kaq4KeN4Kaw4Kac4Ka+4Kak4Ka/IGZpZ2h0aW5nIOCmnOCmvuCmpCDgpp/gp4fgppXgp43gprjgpr4gdXBwZXIgc3RhZ2UgZnJvbSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTQuNTU2IHRtX3B0XzY9LTEyLjEyNSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTIuODMwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjY1MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTM2LjI3OCBsbV8xPS0zMi4wODAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNzMuNzY2CisxNiB8fHwgbWFueSB0aGUg4Kaq4KeN4Kaw4Kac4Ka+4Kak4Ka/IGZpZ2h0aW5nIOCmnOCmvuCmpCDgpp/gp4fgppXgp43gprjgpr4gZnJvbSB1cHBlciBzdGFnZSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTguOTYyIHRtX3B0XzY9LTEyLjc1NSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTcuMDI0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjg2MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTM1LjA5OCBsbV8xPS0zMi4wODAgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zNzMuOTE1CisxNiB8fHwgb2YgaW5kaWFuIOCmquCnjeCmsOCmnOCmvuCmpOCmvyBmaWdodGluZyDgppzgpr7gpqQg4Kaf4KeH4KaV4KeN4Ka44Ka+IGZyb20gdXBwZXIgc3RhZ2UgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE5Ljk5MCB0bV9wdF82PS0xNC4wNDcgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTIuMDUwIHRtX3B0XzEwPS02LjY3MCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy40NzcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0zNC42MzAgbG1fMT0tMzIuMDgwIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzc0LjE0MQorMTcgfHx8IGJyaXRhaW4gd3JpdGVycyB3cml0dGVuIGRyYW1hIG5vdmVscyBhbmQgc3RvcmllcyByZWNlbnRseSBzY3JpcHRzIGluIOCmhuCmpuCng+CmpCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjAuNjQyIHRtX3B0XzY9LTEwLjkyNyB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTAuODc0IHRtX3B0XzEwPS0yMS4yNTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguNzc0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTM2Ljk3MCBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xOTMuMTI4CisxNyB8fHwgYnJpdGFpbiB3cml0ZXJzIHdyaXR0ZW4gZHJhbWEgbm92ZWxzIHN0b3JpZXMgYW5kIHJlY2VudGx5IHNjcmlwdHMgaW4g4KaG4Kam4KeD4KakIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMjAuNjQyIHRtX3B0XzY9LTEwLjkyNyB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTAuODc0IHRtX3B0XzEwPS0xNi43MzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMDI0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00MC43MTcgbG1fMT0tNDIuMzk1IFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTkzLjMzNAorMTcgfHx8IGJyaXRhaW4gd3JpdGVycyB3cml0dGVuIGRyYW1hIG5vdmVsIHN0b3JpZXMgYW5kIHJlY2VudGx5IHNjcmlwdHMgaW4g4KaG4Kam4KeD4KakIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMjEuNjkwIHRtX3B0XzY9LTExLjM3NCB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTAuODc0IHRtX3B0XzEwPS0xNy44ODggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMzkxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00MC41MzYgbG1fMT0tNDIuMzk1IFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTkzLjg5NAorMTcgfHx8IGJyaXRhaW4gd3JpdGVycyB3cml0dGVuIGRyYW1hIG5vdmVscyBhbmQgc3RvcmllcyByZWNlbnRseSBzY3JpcHQgaW4g4KaG4Kam4KeD4KakIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMS40MTggdG1fcHRfNj0tMTAuNDQyIHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMS44MjQgdG1fcHRfMTA9LTIxLjU0NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTAuMTYwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTM2LjY3NCBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xOTQuMDg5CisxNyB8fHwgYnJpdGFpbiB3cml0ZXJzIHdyaXR0ZW4gZHJhbWEgbm92ZWxzIHN0b3J5IGFuZCByZWNlbnRseSBzY3JpcHRzIGluIOCmhuCmpuCng+CmpCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTIxLjU1NiB0bV9wdF82PS0xMS43NDYgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0wLjg3NCB0bV9wdF8xMD0tMTcuNDYzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01Ljc1NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDAuNjY5IGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE5NC4xNzgKKzE3IHx8fCBicml0YWluIHdyaXRlcnMgd3JpdHRlbiBkcmFtYSBub3ZlbHMgc3RvcmllcyBhbmQgcmVjZW50bHkgc2NyaXB0IGluIOCmhuCmpuCng+CmpCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTIxLjQxOCB0bV9wdF82PS0xMC40NDIgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjgyNCB0bV9wdF8xMD0tMTcuMDE5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjQxMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDAuNDIxIGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE5NC4yOTUKKzE3IHx8fCBicml0YWluIHdyaXRlcnMgdGhlIGRyYW1hIG5vdmVscyBhbmQgc3RvcmllcyByZWNlbnRseSBzY3JpcHRzIGluIOCmhuCmpuCng+CmpCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjUuNTA5IHRtX3B0XzY9LTExLjA5NSB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTAuOTU5IHRtX3B0XzEwPS0yNS41NTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuMDYxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTM2LjE5NCBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xOTQuNDQ0CisxOCB8fHwgb24gbWF5IDE5MTkgLCBpdCBzYW9nYXQgbWFnYXppbmUgcHVibGlzaGVkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE1LjgwNiB0bV9wdF82PS0xMy43MTYgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTAuMTUyIHRtX3B0XzEwPS04Ljg0MyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS43NjUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yMy41MTQgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNjUuNDU5CisxOCB8fHwgMTkxOSBvbiBtYXkgLCBpdCBzYW9nYXQgbWFnYXppbmUgcHVibGlzaGVkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE1LjgwNiB0bV9wdF82PS0xMy43MTYgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTEuMTUxIHRtX3B0XzEwPS00LjQ3OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC44NDMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yNS41NzIgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNjYuMTc4CisxOCB8fHwgMTkxOSBpbiBtYXkgLCBpdCBzYW9nYXQgbWFnYXppbmUgcHVibGlzaGVkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE3Ljg4NCB0bV9wdF82PS0xNC4zMzcgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTAuNTE5IHRtX3B0XzEwPS0zLjc4NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4xNTAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yNS45NzUgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNjYuMzQyCisxOCB8fHwgb24gbWF5IDE5MTkgaW4gaXQgc2FvZ2F0IG1hZ2F6aW5lIHB1Ymxpc2hlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xNC4xOTMgdG1fcHRfNj0tMTMuMTYyIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0wLjIwMSB0bV9wdF8xMD0tNy45NDcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNTc2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjQuNzA0IGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTY2LjUyOQorMTggfHx8IDE5MTkgb24gbWF5IG1vbnRoIGl0IHNhb2dhdCBtYWdhemluZSBwdWJsaXNoZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tOS45MzQgdG1fcHRfNj0tMTMuNTE2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0wLjI4NyB0bV9wdF8xMD0tNC41ODIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNzc1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjcuNTMzIGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTY2LjYzOQorMTggfHx8IG9uIG1heSAxOTE5ICwgdGhpcyBzYW9nYXQgbWFnYXppbmUgcHVibGlzaGVkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE3LjM4OCB0bV9wdF82PS0xNC42NTEgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTAuMTUyIHRtX3B0XzEwPS0xMS41MDggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuMTMwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjMuMTg1IGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTY2Ljg0OAorMTkgfHx8IDIwMDUgLCDgpongpofgpq7gp4fgpqjgprggdGVubmlzIGFzc29jaWF0aW9uIHRvdXIg4Kaf4Ka+4Kav4Ka84Ka+4KawLeCmpeCnjeCmsOCmvyDgpp/gp4HgprDgp43gpqjgpr7gpq7gp4fgpqjgp43gpp8g4Ka44Ka+4Kao4Kar4Ka/4Ka44KeN4KafIG9wZW4gbmV0YWppIGluZG9vciBzdGFkaXVtIHdhcyBhcnJhbmdlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTIxLjI0NCB0bV9wdF82PS04LjcwNyB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMjQ5IHRtX3B0XzEwPS0xNS43MzAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMTQ4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS01Ny42MDQgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTIwLjg5MgorMTkgfHx8IDIwMDUgLCDgpongpofgpq7gp4fgpqjgprggdGVubmlzIGFzc29jaWF0aW9uIHRvdXIg4Kaf4Ka+4Kav4Ka84Ka+4KawLeCmpeCnjeCmsOCmvyDgpp/gp4HgprDgp43gpqjgpr7gpq7gp4fgpqjgp43gpp8g4Ka44Ka+4Kao4Kar4Ka/4Ka44KeN4KafIG9wZW4gbmV0YWppIGluZG9vciBzdGFkaXVtIGlzIHRoZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTI5LjA3MyB0bV9wdF82PS05LjE5NyB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMjQ5IHRtX3B0XzEwPS0yMi42OTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuNTUyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBsbV8wPS01NS43NDAgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTIxLjIzNQorMTkgfHx8IDIwMDUgLCDgpongpofgpq7gp4fgpqjgprggdGVubmlzIGFzc29jaWF0aW9uIHRvdXIg4Kaf4Ka+4Kav4Ka84Ka+4KawLeCmpeCnjeCmsOCmvyDgpp/gp4HgprDgp43gpqjgpr7gpq7gp4fgpqjgp43gpp8g4Ka44Ka+4Kao4Kar4Ka/4Ka44KeN4KafIG9wZW4gbmV0YWppIGluZG9vciBzdGFkaXVtIHdhcyBvcmdhbml6ZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yMi4wMzkgdG1fcHRfNj0tOC44NDEgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0yLjI0OSB0bV9wdF8xMD0tMTYuMjQwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjE0OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNTcuNjc3IGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUyMS4zMTMKKzE5IHx8fCAyMDA1ICwg4KaJ4KaH4Kau4KeH4Kao4Ka4IHRlbm5pcyBhc3NvY2lhdGlvbiB0b3VyIOCmn+CmvuCmr+CmvOCmvuCmsC3gpqXgp43gprDgpr8g4Kaf4KeB4Kaw4KeN4Kao4Ka+4Kau4KeH4Kao4KeN4KafIOCmuOCmvuCmqOCmq+Cmv+CmuOCnjeCmnyBvcGVuIG5ldGFqaSBpbmRvb3Igc3RhZGl1bSBhcnJhbmdlZCBpbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTIzLjM3NyB0bV9wdF82PS05LjgyNiB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMjQ5IHRtX3B0XzEwPS0xNS4zODMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuMjQ3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS01OC40NTQgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTIyLjMyNworMTkgfHx8IDIwMDUgLCDgpongpofgpq7gp4fgpqjgprggdGVubmlzIGFzc29jaWF0aW9uIHRvdXIg4Kaf4Ka+4Kav4Ka84Ka+4KawLeCmpeCnjeCmsOCmvyDgpp/gp4HgprDgp43gpqjgpr7gpq7gp4fgpqjgp43gpp8g4Ka44Ka+4Kao4Kar4Ka/4Ka44KeN4KafIG9wZW4gbmV0YWppIGluZG9vciBzdGFkaXVtIG9yZ2FuaXplZCBpbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTI0LjE3MiB0bV9wdF82PS05Ljk1OSB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMjQ5IHRtX3B0XzEwPS0xNi45OTMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuMTkzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBsbV8wPS01OC4zMzYgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTIyLjUxOQorMTkgfHx8IDIwMDUgLCDgpongpofgpq7gp4fgpqjgprggdGVubmlzIGFzc29jaWF0aW9uIHRvdXIg4Kaf4Ka+4Kav4Ka84Ka+4KawLeCmpeCnjeCmsOCmvyDgpp/gp4HgprDgp43gpqjgpr7gpq7gp4fgpqjgp43gpp8g4Ka44Ka+4Kao4Kar4Ka/4Ka44KeN4KafIG9wZW4gbmV0YWppIGluZG9vciBzdGFkaXVtIGlzIHdhcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTI2LjMxNyB0bV9wdF82PS04LjM4OSB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMjQ5IHRtX3B0XzEwPS0yMC43OTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMDYyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBsbV8wPS01Ny45OTIgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTIyLjU1MgorMjAgfHx8IHRvIHByZXZlbnQgdGhpcyBzZXZlcmFsIG1lYXN1cmVzIGFyZSB0YWtlbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0yMi42ODAgdG1fcHRfNj0tMzAuODEyIHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjM4NiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTExLjYzMiBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC00OC40MDUKKzIwIHx8fCB0byBwcmV2ZW50IHRoaXMgc2V2ZXJhbCBtZWFzdXJlcyBhcmUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMjAuMjE5IHRtX3B0XzY9LTI5LjE4OSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tNi44NTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuOTQ2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTEyLjY4NiBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC01MC4yNjUKKzIwIHx8fCB0byBwcmV2ZW50IHRoaXMgc2V2ZXJhbCBtZWFzdXJlcyBhcmUgdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTI0LjIyNyB0bV9wdF82PS0yNy4yNTEgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMS4wMDAgdG1fcHRfMTA9LTMuNDI2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjI4NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTE0LjA2NiBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC01Mi4wODQKKzIwIHx8fCB0byBwcmV2ZW50IHRoaXMgc2V2ZXJhbCBtZWFzdXJlcyBhcmUgaW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMjMuMzg4IHRtX3B0XzY9LTI3LjM0NCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tMi43NzEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuNjk5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMTQuNjQ5IGxtXzE9LTI5LjM1MCBXb3JkUGVuYWx0eT0tNC4zNDMgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTUyLjY1MworMjAgfHx8IHRvIGF2b2lkIHRoaXMgcG9zc2liaWxpdHkgc2V2ZXJhbCBtZWFzdXJlcyBhcmUgdGFrZW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMjQuNTk3IHRtX3B0XzY9LTMxLjczMyB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMS4zODYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xMy40NjEgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNTMuNDUyCisyMCB8fHwgdG8gcHJldmVudCB0aGlzIHNldmVyYWwgbWVhc3VyZXMgYXJlIHRvIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTIzLjI4NiB0bV9wdF82PS0yNy43NzUgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMS4wMDAgdG1fcHRfMTA9LTMuODcyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjkyMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTE1LjAwOSBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC01My45NDQKKzIwIHx8fCB0byBwcmV2ZW50IHRoaXMgc2V2ZXJhbCBtZWFzdXJlcyBhcmUgdG8gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTIzLjc0NCB0bV9wdF82PS0zMy41MTkgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTYuOTk5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjczNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTE0LjkxMyBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC01NS41MDMKKzIxIHx8fCDgp6fgp6/gp6zgp6wgb24gNSBmZWJydWFyeSDgprLgpr7gprngp4vgprDgp4cgb2Yg4Kam4Kay4Ka44Kau4KeC4Ka54KeH4KawIGEgbmF0aW9uYWwgd2FzIGhlbGQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMjEuNDgxIHRtX3B0XzY9LTE0LjY0NSB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMC40MzYgdG1fcHRfMTA9LTE1LjE4MyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy42NzIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tNDEuMTU0IGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5MS4zODEKKzIxIHx8fCDgp6fgp6/gp6zgp6wgb24gNSBmZWJydWFyeSDgprLgpr7gprngp4vgprDgp4cg4Kam4Kay4Ka44Kau4KeC4Ka54KeH4KawIGFnYWluc3QgYSBuYXRpb25hbCB3YXMgaGVsZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xNi43MzIgdG1fcHRfNj0tMTQuMzM1IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMTIuMTY3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjk2MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00MS44NzkgbG1fMT0tNDIuMzk1IFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzkxLjY0MworMjEgfHx8IOCnp+Cnr+CnrOCnrCBvbiA1IGZlYnJ1YXJ5IOCmsuCmvuCmueCni+CmsOCnhyBhZ2FpbnN0IOCmpuCmsuCmuOCmruCnguCmueCnh+CmsCBhIG5hdGlvbmFsIHdhcyBoZWxkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTE2LjczMiB0bV9wdF82PS0xNC4zMzUgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTAuNTUzIHRtX3B0XzEwPS0xMi45ODkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuMTgzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIGxtXzA9LTQyLjQzOSBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTEuNjY0CisyMSB8fHwg4Ken4Kev4Kes4KesIG9uIDUgZmVicnVhcnkg4Kay4Ka+4Ka54KeL4Kaw4KeHIG9wcG9zaXRpb24g4Kam4Kay4Ka44Kau4KeC4Ka54KeH4KawIGEgbmF0aW9uYWwgd2FzIGhlbGQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMTUuMjc4IHRtX3B0XzY9LTE0Ljc0MCB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMC41NTMgdG1fcHRfMTA9LTEwLjE4NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4xODMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tNDMuMzIzIGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5MS44OTEKKzIxIHx8fCDgp6fgp6/gp6zgp6wgb24gNSBmZWJydWFyeSDgprLgpr7gprngp4vgprDgp4cgb2Yg4Kam4Kay4Ka44Kau4KeC4Ka54KeH4KawIGEgbmF0aW9uYWwgd2FzIGhlbGQgaW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjQuNjUxIHRtX3B0XzY9LTExLjg0MCB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS4wMTggdG1fcHRfMTA9LTguMjg5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjUxOCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDIuMTQ3IGxtXzE9LTQ1LjY1NiBXb3JkUGVuYWx0eT0tNi41MTQgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5Mi44MDQKKzIxIHx8fCDgp6fgp6/gp6zgp6wgb24gNSBmZWJydWFyeSDgprLgpr7gprngp4vgprDgp4cg4Kam4Kay4Ka44Kau4KeC4Ka54KeH4KawIGFnYWluc3QgYSBuYXRpb25hbCB3YXMgaGVsZCBpbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0xOS45MDEgdG1fcHRfNj0tMTEuNTI5IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0xLjEzNSB0bV9wdF8xMD0tNS4yNzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuODA2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS00Mi44NzMgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzkzLjA2NworMjIgfHx8IGJhbmdsYWRlc2gg4KaF4Kaw4KeN4KaX4Ka+4Kao4Ka+4KaH4Kac4KeH4Ka24KaoIG9mIHRoZSBpc2xhbWljIOCmleCmqOCmq+CmvuCmsOCnh+CmqOCnjeCmuCBhbmQgaXNsYW1pYyDgpqHgp4fgpq3gp4fgprLgpqrgpq7gp4fgpqPgp43gpp8gYmFuayBzZWN1cmVkIGl0cyBwbGFjZSBpbiBpbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tNDcuMzA1IHRtX3B0XzY9LTExLjY3NCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTIuMDUwIHRtX3B0XzEwPS0yNy4wMTggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuOTEzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tNDQuMTczIGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxMi45MjcKKzIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGlzbGFtaWMg4Kah4KeH4Kat4KeH4Kay4Kaq4Kau4KeH4Kaj4KeN4KafIGJhbmsgc2VjdXJlZCBpdHMgcGxhY2UgaW4gdG9vayAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tNDMuMzk1IHRtX3B0XzY9LTExLjQ4MCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0yMy44NTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuNjA3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tNDUuMzU0IGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxMy4yNTkKKzIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGlzbGFtaWMg4Kah4KeH4Kat4KeH4Kay4Kaq4Kau4KeH4Kaj4KeN4KafIGJhbmsgc2VjdXJlZCBpdHMgcGxhY2UgaW4gYWRvcHRlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tNDIuMzgyIHRtX3B0XzY9LTEyLjExNiB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuMDAwIHRtX3B0XzEwPS0yMS45NzkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuMzAwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tNDUuMzIxIGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxMy41MjEKKzIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGlzbGFtaWMg4Kah4KeH4Kat4KeH4Kay4Kaq4Kau4KeH4Kaj4KeN4KafIGJhbmsgc2VjdXJlZCBpdHMgcGxhY2UgaW4gaW4gdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tNTAuNTEyIHRtX3B0XzY9LTkuODg4IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMi4wNTAgdG1fcHRfMTA9LTIzLjE0NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi4wODYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIGxtXzA9LTQ1LjEwNCBsbV8xPS01OC43MDAgV29yZFBlbmFsdHk9LTguMjUyIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MTMuOTE1CisyMiB8fHwgYmFuZ2xhZGVzaCDgpoXgprDgp43gppfgpr7gpqjgpr7gpofgppzgp4fgprbgpqggb2YgdGhlIGlzbGFtaWMg4KaV4Kao4Kar4Ka+4Kaw4KeH4Kao4KeN4Ka4IGFuZCBpc2xhbWljIOCmoeCnh+CmreCnh+CmsuCmquCmruCnh+Cmo+CnjeCmnyBiYW5rIHRvb2sgc2VjdXJlZCBpdHMgcGxhY2UgaW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTQzLjM5NSB0bV9wdF82PS0xMS40ODAgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tMjMuNzI4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjAzNyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTQ1LjM1NCBsbV8xPS01NS40MzkgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MTQuMzQ0CisyMiB8fHwgYmFuZ2xhZGVzaCDgpoXgprDgp43gppfgpr7gpqjgpr7gpofgppzgp4fgprbgpqggb2YgdGhlIGlzbGFtaWMg4KaV4Kao4Kar4Ka+4Kaw4KeH4Kao4KeN4Ka4IGFuZCBpc2xhbWljIOCmoeCnh+CmreCnh+CmsuCmquCmruCnh+Cmo+CnjeCmnyBiYW5rIHNlY3VyZWQgaXRzIHBsYWNlIGluIGhhZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tNDUuMzIwIHRtX3B0XzY9LTEyLjUyMSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuMDAwIHRtX3B0XzEwPS0yNS4xMTUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuMzAwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tNDQuODg5IGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxNC41MDAKKzIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGlzbGFtaWMg4Kah4KeH4Kat4KeH4Kay4Kaq4Kau4KeH4Kaj4KeN4KafIGJhbmsgc2VjdXJlZCBpdHMgcGxhY2UgaW4gdG9vayB0aGUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS00Ni42MDMgdG1fcHRfNj0tOS42OTMgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tMTkuOTc4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjc3OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNDYuNTYzIGxtXzE9LTU4LjcwMCBXb3JkUGVuYWx0eT0tOC4yNTIgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxNC41OTEKKzIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGlzbGFtaWMg4Kah4KeH4Kat4KeH4Kay4Kaq4Kau4KeH4Kaj4KeN4KafIGJhbmsgdG9vayBzZWN1cmVkIGl0cyBwbGFjZSBpbiB0aGUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS00Ni42MDMgdG1fcHRfNj0tOS42OTMgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tMTkuODU2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjIxMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgbG1fMD0tNDUuNzM3IGxtXzE9LTU4LjcwMCBXb3JkUGVuYWx0eT0tOC4yNTIgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxNC42NTQKKzIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGhhZCDgpqHgp4fgpq3gp4fgprLgpqrgpq7gp4fgpqPgp43gpp8gYmFuayBzZWN1cmVkIGl0cyBwbGFjZSBpbiBpbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tNTIuMDk4IHRtX3B0XzY9LTE0LjYxOCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuMDUwIHRtX3B0XzEwPS0yOS40NjAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuMjE2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tNDMuOTA3IGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQxNi43OTAKKzIyIHx8fCBiYW5nbGFkZXNoIOCmheCmsOCnjeCml+CmvuCmqOCmvuCmh+CmnOCnh+CmtuCmqCBvZiB0aGUgaXNsYW1pYyDgppXgpqjgpqvgpr7gprDgp4fgpqjgp43gprggYW5kIGhhZCDgpqHgp4fgpq3gp4fgprLgpqrgpq7gp4fgpqPgp43gpp8gYmFuayBzZWN1cmVkIGl0cyBwbGFjZSBpbiB0b29rIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS00OC4xODggdG1fcHRfNj0tMTQuNDI0IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMy4zNjggdG1fcHRfMTA9LTI2LjI5MyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC45MDkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEzLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBsbV8wPS00NS4wODggbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDE3LjEyMQorMjMgfHx8IHN1YmplY3QgOiBlbmN5Y2xvcGVkaWEgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTEuNjU3IHRtX3B0XzY9LTEuNTQyIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0wLjQyMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMS41MDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTMuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS01LjUyOCBsbV8xPS0xMy4wNDUgV29yZFBlbmFsdHk9LTIuMTcxIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xNS44MzYKKzIzIHx8fCBjYXRlZ29yeSA6IGVuY3ljbG9wZWRpYSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMS40MjUgdG1fcHRfNj0tMi4wMTIgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4xMzUgdG1fcHRfMTA9LTAuMDIwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjgxNyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTUuNzA3IGxtXzE9LTEzLjA0NSBXb3JkUGVuYWx0eT0tMi4xNzEgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTE2LjI5MworMjMgfHx8IHN1YmplY3QtY2xhc3MgOiBlbmN5Y2xvcGVkaWEgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTEuMzc5IHRtX3B0XzY9LTMuNTYxIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMTM1IHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjcwMyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTUuOTg5IGxtXzE9LTEzLjA0NSBXb3JkUGVuYWx0eT0tMi4xNzEgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTE3LjQ3MgorMjMgfHx8IHRvcGljcyA6IGVuY3ljbG9wZWRpYSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMS41MzcgdG1fcHRfNj0tMy44NzQgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4xMzUgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuOTkxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tNi4yMjAgbG1fMT0tMTMuMDQ1IFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTcuOTk2CisyNCB8fHwgcnVzc2lhIGZyYW5jZSBhbmQgaXNyYWVsIHRoZSBtYWluIOCmheCmuOCnjeCmpOCnjeCmsOCmuOCmsOCmrOCmsOCmvuCmueCmleCmvuCmsOCngCBjb3VudHJ5IGFuZCBkZWZlbnNlIHN1YiBjb3VudHJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMTguNTMwIHRtX3B0XzY9LTguMzU2IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMS4xMDYgdG1fcHRfMTA9LTEwLjQ3MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS44NDEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTM4Ljg0NCBsbV8xPS00NS42NTYgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODkuNTM2CisyNCB8fHwgcnVzc2lhIGZyYW5jZSBhbmQgaXNyYWVsIHRoZSBtYWluIOCmheCmuOCnjeCmpOCnjeCmsOCmuOCmsOCmrOCmsOCmvuCmueCmleCmvuCmsOCngCBzdGF0ZSBhbmQgZGVmZW5zZSBzdWIgY291bnRyeSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0xOC40NjcgdG1fcHRfNj0tOS4yMDYgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTEuNDc0IHRtX3B0XzEwPS0xMC41MzUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuOTMzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS0zOC44MDIgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTg5LjkyNAorMjQgfHx8IHJ1c3NpYSBmcmFuY2UgYW5kIGlzcmFlbCB0aGUgbWFpbiDgpoXgprjgp43gpqTgp43gprDgprjgprDgpqzgprDgpr7gprngppXgpr7gprDgp4AgY291bnRyeSBhbmQgZGVmZW5jZSBzdWIgY291bnRyeSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTE4Ljk0MiB0bV9wdF82PS05Ljc0MiB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuNzM4IHRtX3B0XzEwPS0xMC4wNjUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNTM0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS0zOC41MzUgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTkwLjM2NgorMjQgfHx8IHJ1c3NpYSBmcmFuY2UgYW5kIGlzcmFlbCB0aGUgbWFpbiDgpoXgprjgp43gpqTgp43gprDgprjgprDgpqzgprDgpr7gprngppXgpr7gprDgp4AgY291bnRyaWVzIGFuZCBkZWZlbnNlIHN1YiBjb3VudHJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTE5LjQyNiB0bV9wdF82PS0xMC4zNDMgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTEuNDc0IHRtX3B0XzEwPS0xMC4xMzAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuOTMzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS0zOC44MTUgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTkwLjQwNworMjUgfHx8IHRoaXMgaXMgdGhlIGtub3duIGltYWdpbmFyeSBtYXRoZW1hdGljcyBmb3JtZWQgd2l0aCB3aGljaCBhcmUgcmVhbCBudW1iZXIgc2V0IGZyb20g4Ka44KeH4Kaf4KeHIHBhciB3aXRoIHRoZSBjb21wbGV4IG51bWJlciAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTUxLjMxMyB0bV9wdF82PS0yMS45MzcgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS00Ljg4OSB0bV9wdF8xMD0tMjEuODc1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjAwMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tNDguODM1IGxtXzE9LTcxLjc0NSBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI0MS43MTkKKzI1IHx8fCB0aGlzIGlzIG91ciBrbm93biBpbWFnaW5hcnkgbWF0aGVtYXRpY3MgZm9ybWVkIHdpdGggd2hpY2ggYXJlIHJlYWwgbnVtYmVyIHNldCBmcm9tIOCmuOCnh+Cmn+CnhyBwYXIgd2l0aCB0aGUgY29tcGxleCBudW1iZXIgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS00NC43MTEgdG1fcHRfNj0tMjEuMTc0IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMy44ODkgdG1fcHRfMTA9LTIyLjYzMyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy42OTAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTUwLjM5NiBsbV8xPS03MS43NDUgV29yZFBlbmFsdHk9LTkuOTg5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNDEuOTM4CisyNSB8fHwgdGhpcyBpcyB0aGUga25vd24gaW1hZ2luYXJ5IG1hdGhlbWF0aWNzIGZvcm1lZCB3aXRoIHdoaWNoIGFyZSByZWFsIG51bWJlciBzZXQgZnJvbSDgprjgp4fgpp/gp4cgcGFyIHdpdGggY29tcGxleCBudW1iZXIgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS00Ny4zMDQgdG1fcHRfNj0tMjMuODc0IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMy44OTAgdG1fcHRfMTA9LTMwLjk0NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOS41MTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE5LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS00OC4xNzYgbG1fMT0tNjguNDg0IFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjQyLjgyNgorMjUgfHx8IHRoaXMgaXMgdGhlIGtub3duIGltYWdpbmFyeSBtYXRoZW1hdGljcyBmb3JtZWQgd2l0aCB3aGljaCBhcmUgcmVhbCBudW1iZXJzIHNldCBmcm9tIOCmuOCnh+Cmn+CnhyBwYXIgd2l0aCB0aGUgY29tcGxleCBudW1iZXIgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE0LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS01MS4wNzggdG1fcHRfNj0tMjIuNjM3IHRtX3B0Xzc9LTE0LjAwMCB0bV9wdF84PS0zOC4wNTIgdG1fcHRfOT0tNC44ODkgdG1fcHRfMTA9LTIxLjU5NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4wMDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTQ5LjY2MyBsbV8xPS03MS43NDUgV29yZFBlbmFsdHk9LTkuOTg5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNDIuODY1CisyNSB8fHwgdGhpcyBpcyB0aGUga25vd24gaW1hZ2luYXJ5IG1hdGhlbWF0aWNzIGZvcm1lZCB3aXRoIHdoaWNoIGFyZSByZWFsIG51bWJlciBzZXQgdG8g4Ka44KeH4Kaf4KeHIHBhciB3aXRoIHRoZSBjb21wbGV4IG51bWJlciAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTUzLjI3NSB0bV9wdF82PS0yMi44MTYgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS00Ljg4OSB0bV9wdF8xMD0tMjMuNjgwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04LjMyOSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tNDguNTcxIGxtXzE9LTcxLjc0NSBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI0My4wMDcKKzI1IHx8fCB0aGlzIGlzIG91ciBrbm93biBpbWFnaW5hcnkgbWF0aGVtYXRpY3MgZm9ybWVkIHdpdGggd2hpY2ggYXJlIHJlYWwgbnVtYmVyIHNldCBmcm9tIOCmuOCnh+Cmn+CnhyBwYXIgd2l0aCBjb21wbGV4IG51bWJlciAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTQwLjcwMyB0bV9wdF82PS0yMy4xMTIgdG1fcHRfNz0tMTYuMDAwIHRtX3B0Xzg9LTQzLjQ4OCB0bV9wdF85PS0yLjg5MCB0bV9wdF8xMD0tMzEuNzA0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMC4yMDUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE5LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00OS43MzcgbG1fMT0tNjguNDg0IFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjQzLjA0NQorMjUgfHx8IHRoaXMgaXMgb3VyIGtub3duIGltYWdpbmFyeSBtYXRoZW1hdGljcyBmb3JtZWQgd2l0aCB3aGljaCBhcmUgcmVhbCBudW1iZXJzIHNldCBmcm9tIOCmuOCnh+Cmn+CnhyBwYXIgd2l0aCB0aGUgY29tcGxleCBudW1iZXIgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS00NC40NzYgdG1fcHRfNj0tMjEuODc1IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMy44ODkgdG1fcHRfMTA9LTIyLjM1MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy42OTAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTUxLjIyNSBsbV8xPS03MS43NDUgV29yZFBlbmFsdHk9LTkuOTg5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNDMuMDg0CisyNSB8fHwgdGhpcyBpcyB0aGUga25vd24gaW1hZ2luYXJ5IG1hdGhlbWF0aWNzIGZvcm1lZCB3aXRoIHdoaWNoIGFyZSBmcm9tIHJlYWwgbnVtYmVyIHNldCDgprjgp4fgpp/gp4cgcGFyIHdpdGggdGhlIGNvbXBsZXggbnVtYmVyIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS01MS4zMTMgdG1fcHRfNj0tMjEuOTM3IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tNS44ODkgdG1fcHRfMTA9LTIwLjgwMiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi45MzIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tNDguOTE2IGxtXzE9LTcxLjc0NSBXb3JkUGVuYWx0eT0tOS45ODkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI0My4xMTAKKzI2IHx8fCA8YWRkcmVzcz4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTEuNDk0IHRtX3B0XzY9LTM4LjE4NCB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjA1MCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0wLjAwMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTQuMjQwIGxtXzE9LTYuNTIyIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMjEuNzQzCisyNiB8fHwgPCDgpqDgpr/gppXgpr7gpqjgpr4gPiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMi41MTggdG1fcHRfNj0tMjkuMjMxIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0wLjExOCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0wLjAwMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTE1Ljg1MyBsbV8xPS0xMy4wNDUgV29yZFBlbmFsdHk9LTIuMTcxIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMzYuOTYxCisyNiB8fHwgdGhlIGx0IOCmoOCmv+CmleCmvuCmqOCmviA+IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS02LjM2MiB0bV9wdF82PS0yMC41ODkgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4xMzUgdG1fcHRfMTA9LTIuNDUzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPTAuMDAwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTE3LjcwOSBsbV8xPS0xNi4zMDYgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDEuNzA0CisyNiB8fHwgPCDgpqDgpr/gppXgpr7gpqjgpr4gLCBndCAsIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS00LjI1OCB0bV9wdF82PS0xNS43MjAgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTUuMzI4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjI2MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIwLjY3OCBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDQuMTY2CisyNiB8fHwgLCBsdCAsIOCmoOCmv+CmleCmvuCmqOCmviA+IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS00LjI0NSB0bV9wdF82PS0xNS45OTggdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTUuNDQ2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjI2MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIwLjk2MSBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDQuNjQwCisyNiB8fHwgPCDgpqDgpr/gppXgpr7gpqjgpr4gLCBndCA7IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0zLjIwMSB0bV9wdF82PS0xOC40NDkgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTEuNTk2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjI0OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIxLjU2MSBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDUuMDE3CisyNyB8fHwgc2VwdGVtYmVyIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0wLjE3NiB0bV9wdF82PS0wLjA0NyB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMC4wMTMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTAuMDI1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMy4wMjQgbG1fMT0tNi41MjIgV29yZFBlbmFsdHk9LTEuMzAzIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC02LjkyMworMjcgfHx8IHNlcHRlbWJlciAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS05LjI4MiB0bV9wdF82PS0wLjcxNiB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tMS4wOTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNjg5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tNC44MzIgbG1fMT0tOS43ODMgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xNS4xMTIKKzI3IHx8fCDgprjgp4fgpqrgp43gpp/gp4fgpq7gp43gpqzgprAgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0wLjAwMCB0bV9wdF81PTAuMDAwIHRtX3B0XzY9MC4wMDAgdG1fcHRfNz0wLjAwMCB0bV9wdF84PTAuMDAwIHRtX3B0Xzk9MC4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9MC4wMDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9MC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTcuMzU1IGxtXzE9LTYuNTIyIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTExLjM1OAorMjggfHx8IGZyb20gdGhpcyB0aGVvcnkgdGhvdWdoIGJpZyDgpqzgpr/gprjgp43gpqvgp4vgprDgpqPgp4vgprAgYWdhaW5zdCBjYW4gbm90IGJlIGJ1dCBpdCBjYW4gYmUgc3VwcG9ydCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjcuOTYwIHRtX3B0XzY9LTIzLjEwOCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuNjkyIHRtX3B0XzEwPS0xNS42NzMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMDQ2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTM1Ljk1MCBsbV8xPS01NS40MzkgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yMDIuNTg1CisyOCB8fHwgZnJvbSB0aGlzIHRoZW9yeSB0aG91Z2ggYmlnIOCmrOCmv+CmuOCnjeCmq+Cni+CmsOCmo+Cni+CmsCBhZ2FpbnN0IGNhbiBub3QgYmUgcmF0aGVyIGl0IGNhbiBiZSBzdXBwb3J0IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yNS4wODcgdG1fcHRfNj0tMjMuMjgzIHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMS42OTIgdG1fcHRfMTA9LTEzLjI3NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS4wNDYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tMzcuMDY4IGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTIwMi44NTYKKzI4IHx8fCBmcm9tIHRoaXMgdGhlb3J5IHRob3VnaCBiaWcg4Kas4Ka/4Ka44KeN4Kar4KeL4Kaw4Kaj4KeL4KawIGFnYWluc3QgY2FuIG5vdCBiZSBidXQgaXQgY2FuIGJlIHN1cHBvcnRlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjcuNTQzIHRtX3B0XzY9LTIyLjYxNiB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTIuNjkxIHRtX3B0XzEwPS0xNi43OTcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuMTI2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTM0Ljk5NiBsbV8xPS01NS40MzkgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yMDMuMDA0CisyOCB8fHwgZnJvbSB0aGlzIHRoZW9yeSB0aG91Z2ggYmlnIOCmrOCmv+CmuOCnjeCmq+Cni+CmsOCmo+Cni+CmsCBhZ2FpbnN0IGNhbiBub3QgYmUgcmF0aGVyIGl0IGNhbiBiZSBzdXBwb3J0ZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTI0LjY3MCB0bV9wdF82PS0yMi43OTAgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0yLjY5MSB0bV9wdF8xMD0tMTQuMzk5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjEyNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS0zNi4xMTQgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjAzLjI3NAorMjggfHx8IGZyb20gdGhpcyB0aGVvcnkgdGhvdWdoIHRoZSDgpqzgpr/gprjgp43gpqvgp4vgprDgpqPgp4vgprAgYWdhaW5zdCBjYW4gbm90IGJlIGJ1dCBpdCBjYW4gYmUgc3VwcG9ydCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMzIuNTQ4IHRtX3B0XzY9LTIzLjE5OSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuNjkyIHRtX3B0XzEwPS0xOS45ODkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMTI2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTM1LjIwNyBsbV8xPS01NS40MzkgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yMDMuNzIyCisyOCB8fHwgdGhpcyB0aGVvcnkgZnJvbSB0aG91Z2ggYmlnIOCmrOCmv+CmuOCnjeCmq+Cni+CmsOCmo+Cni+CmsCBhZ2FpbnN0IGNhbiBub3QgYmUgYnV0IGl0IGNhbiBiZSBzdXBwb3J0IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yNy45NjAgdG1fcHRfNj0tMjMuMTA4IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMS41NzIgdG1fcHRfMTA9LTE0LjM0MyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4zNTQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tMzcuNDY4IGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTIwMy43NzUKKzI5IHx8fCBhZ3JpY3VsdHVyYWwgaW4gcHJvZHVjdGlvbiBmcmFuY2UgY291bnRyeSA7IGl0IGlzIG1vc3QgaW1wb3J0YW50IG1haW5seSDgppbgpr7gpqbgp43gpq/gprbgprjgp43gpq8gd2luZSBjaGVlc2UgYW5kIG90aGVyIOCmleCng+Cmt+Cmv+CmpuCnjeCmsOCmrOCnjeCmryBldXJvcGUgYW5kIHRoZSB3b3JsZCBleHBvcnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00MS42NzYgdG1fcHRfNj0tMTkuNjgwIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi43NDUgdG1fcHRfMTA9LTE5LjkxOSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4yMDMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS02NS4yNjIgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM1OS41ODEKKzI5IHx8fCBhZ3JpY3VsdHVyYWwgaW4gcHJvZHVjdGlvbiBmcmFuY2UgY291bnRyeSA7IGl0IGlzIHRoZSBtb3N0IGltcG9ydGFudCBtYWlubHkg4KaW4Ka+4Kam4KeN4Kav4Ka24Ka44KeN4KavIHdpbmUgY2hlZXNlIGFuZCBvdGhlciDgppXgp4Pgprfgpr/gpqbgp43gprDgpqzgp43gpq8gZXVyb3BlIGFuZCB0aGUgd29ybGQgZXhwb3J0IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNDcuMDk3IHRtX3B0XzY9LTE5Ljc1NCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTIuNjEyIHRtX3B0XzEwPS0xOC45NjcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuMzU1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMi4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNjMuMzc3IGxtXzE9LTgxLjUyOCBXb3JkUGVuYWx0eT0tMTEuMjkyIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNTkuNzU3CisyOSB8fHwgYWdyaWN1bHR1cmUgaW4gcHJvZHVjdGlvbiBmcmFuY2UgY291bnRyeSA7IGl0IGlzIG1vc3QgaW1wb3J0YW50IG1haW5seSDgppbgpr7gpqbgp43gpq/gprbgprjgp43gpq8gd2luZSBjaGVlc2UgYW5kIG90aGVyIOCmleCng+Cmt+Cmv+CmpuCnjeCmsOCmrOCnjeCmryBldXJvcGUgYW5kIHRoZSB3b3JsZCBleHBvcnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00MS45NDAgdG1fcHRfNj0tMjAuMjQwIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi43NDYgdG1fcHRfMTA9LTE5Ljg2OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC4wNjggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS02NS43NTQgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2MC43MjQKKzI5IHx8fCBhZ3JpY3VsdHVyYWwgaW4gcHJvZHVjdGlvbiBmcmFuY2UgaXMgbW9zdCBpbXBvcnRhbnQgY291bnRyeSA7IGl0IG1haW5seSDgppbgpr7gpqbgp43gpq/gprbgprjgp43gpq8gd2luZSBjaGVlc2UgYW5kIG90aGVyIOCmleCng+Cmt+Cmv+CmpuCnjeCmsOCmrOCnjeCmryBldXJvcGUgYW5kIHRoZSB3b3JsZCBleHBvcnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE3LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE2LjAwMCB0bV9wdF81PS00MS42NzYgdG1fcHRfNj0tMTkuNjgwIHRtX3B0Xzc9LTE3LjAwMCB0bV9wdF84PS00Ni4yMDYgdG1fcHRfOT0tMS42NTkgdG1fcHRfMTA9LTI2LjQzNCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOS43NzEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBsbV8wPS02Ni4xNTcgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2MC44MTMKKzI5IHx8fCBhZ3JpY3VsdHVyYWwgaW4gcHJvZHVjdGlvbiBmcmFuY2UgaXMgbW9zdCBpbXBvcnRhbnQgY291bnRyeSAsIGl0IGJhc2ljYWxseSDgppbgpr7gpqbgp43gpq/gprbgprjgp43gpq8gd2luZSBjaGVlc2UgYW5kIG90aGVyIOCmleCng+Cmt+Cmv+CmpuCnjeCmsOCmrOCnjeCmryBldXJvcGUgYW5kIHRoZSB3b3JsZCBleHBvcnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE3LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE2LjAwMCB0bV9wdF81PS00Mi40NjIgdG1fcHRfNj0tMTcuOTQ3IHRtX3B0Xzc9LTE3LjAwMCB0bV9wdF84PS00Ni4yMDYgdG1fcHRfOT0tMi42MTAgdG1fcHRfMTA9LTI5LjU3OSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOS42NjAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBsbV8wPS02NS4zNzcgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2MC45NjAKKzI5IHx8fCBhZ3JpY3VsdHVyYWwgaW4gcHJvZHVjdGlvbiBmcmFuY2UgY291bnRyeSA7IGl0IGlzIG1vc3QgaW1wb3J0YW50IG1haW5seSDgppbgpr7gpqbgp43gpq/gprbgprjgp43gpq8gd2luZSBjaGVlc2UgYW5kIG90aGVyIOCmleCng+Cmt+Cmv+CmpuCnjeCmsOCmrOCnjeCmryBldXJvcGUgYW5kIHdob2xlIHdvcmxkIGV4cG9ydCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTM3LjQ3NyB0bV9wdF82PS0yMC4yNTIgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0yLjc0NSB0bV9wdF8xMD0tMTUuMTEzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjUzOSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIGxtXzA9LTY3Ljg2MyBsbV8xPS03OC4yNjcgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzYxLjA2NAorMjkgfHx8IGFncmljdWx0dXJhbCBpbiBwcm9kdWN0aW9uIGZyYW5jZSBjb3VudHJ5IDsgaXQgaXMgdGhlIG1vc3QgaW1wb3J0YW50IG1haW5seSDgppbgpr7gpqbgp43gpq/gprbgprjgp43gpq8gd2luZSBjaGVlc2UgYW5kIG90aGVyIOCmleCng+Cmt+Cmv+CmpuCnjeCmsOCmrOCnjeCmryBldXJvcGUgYW5kIHdob2xlIHdvcmxkIGV4cG9ydCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTQyLjg5OCB0bV9wdF82PS0yMC4zMjYgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0yLjYxMiB0bV9wdF8xMD0tMTQuMTYxIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjY5MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjIuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIGxtXzA9LTY1Ljk3NyBsbV8xPS04MS41MjggV29yZFBlbmFsdHk9LTExLjI5MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzYxLjIzOQorMjkgfHx8IGFncmljdWx0dXJhbCBpbiBwcm9kdWN0aW9uIGZyYW5jZSBjb3VudHJ5IDsgaXQgaXMgbW9zdCBpbXBvcnRhbnQgbWFpbmx5IOCmluCmvuCmpuCnjeCmr+CmtuCmuOCnjeCmryB3aW5lIGNoZWVzZSBhbmQgb3RoZXIg4KaV4KeD4Ka34Ka/4Kam4KeN4Kaw4Kas4KeN4KavIGV1cm9wZSBhbmQgdGhlIHRoZSBleHBvcnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS00NS42MzEgdG1fcHRfNj0tMjAuMzAyIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi42NTkgdG1fcHRfMTA9LTIyLjY1OSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi40MjkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS02NS4wNzkgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2MS42NTQKKzI5IHx8fCBhZ3JpY3VsdHVyYWwgaW4gcHJvZHVjdGlvbiBmcmFuY2UgY291bnRyeSA7IGl0IGlzIG1vc3QgaW1wb3J0YW50IG1haW5seSDgppbgpr7gpqbgp43gpq/gprbgprjgp43gpq8gd2luZSBjaGVlc2UgYW5kIG90aGVyIOCmleCng+Cmt+Cmv+CmpuCnjeCmsOCmrOCnjeCmryBldXJvcGUgYW5kIHRoZSBpbiBleHBvcnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00NC4zNTIgdG1fcHRfNj0tMTkuOTU1IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi45NzcgdG1fcHRfMTA9LTIyLjg1OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy42MDggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS02NS41ODUgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2MS42ODMKKzI5IHx8fCBhZ3JpY3VsdHVyYWwgaW4gcHJvZHVjdGlvbiBmcmFuY2UgY291bnRyeSA7IGl0IGlzIHRoZSBtb3N0IGltcG9ydGFudCBtYWlubHkg4KaW4Ka+4Kam4KeN4Kav4Ka24Ka44KeN4KavIHdpbmUgY2hlZXNlIGFuZCBvdGhlciDgppXgp4Pgprfgpr/gpqbgp43gprDgpqzgp43gpq8gZXVyb3BlIGFuZCB0aGUgdGhlIGV4cG9ydCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTUxLjA1MiB0bV9wdF82PS0yMC4zNzYgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0yLjUyNiB0bV9wdF8xMD0tMjEuNzA3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjU4MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjIuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIGxtXzA9LTYzLjE5MyBsbV8xPS04MS41MjggV29yZFBlbmFsdHk9LTExLjI5MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzYxLjgzMAorMzAgfHx8IHRoZWlyIGluIG1hdGhlbWF0aWNzIOCmquCmvuCmn+CngOCml+Cmo+Cmv+CmpOCnh+CmsCBwZXJzb24gd2FzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS00LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE3Ljc1NCB0bV9wdF82PS02LjIyMiB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMS4wMTggdG1fcHRfMTA9LTAuMzI2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0wLjUwMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIwLjk2NyBsbV8xPS0yNS41NTggV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNDcuNTM3CiszMCB8fHwgdGhlaXIgaW4gbWF0aGVtYXRpY3Mg4Kaq4Ka+4Kaf4KeA4KaX4Kaj4Ka/4Kak4KeH4KawIHdlcmUgd2FzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE4Ljk4MyB0bV9wdF82PS01LjEyMyB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4zODYgdG1fcHRfMTA9LTQuMzE5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjU1MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIwLjg2NyBsbV8xPS0yNS41NTggV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNDkuMzE2CiszMCB8fHwgdGhlaXIgaW4gbWF0aGVtYXRpY3Mg4Kaq4Ka+4Kaf4KeA4KaX4Kaj4Ka/4Kak4KeH4KawIGFyZSB3YXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTkuNjQ1IHRtX3B0XzY9LTQuNjEzIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0xLjAxOCB0bV9wdF8xMD0tNy4wMTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuNDI4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgbG1fMD0tMjAuNjUxIGxtXzE9LTI1LjU1OCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE0OS41NjQKKzMwIHx8fCB0aGVpciBpbiBtYXRoZW1hdGljcyB3YXMg4Kaq4Ka+4Kaf4KeA4KaX4Kaj4Ka/4Kak4KeH4KawIHdlcmUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMTguOTgzIHRtX3B0XzY9LTUuMTIzIHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjc1NCB0bV9wdF8xMD0tNy40MjYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuNDEzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMTkuNjQ4IGxtXzE9LTI1LjU1OCBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE0OS42NDEKKzMwIHx8fCB0aGVpciBpbiBtYXRoZW1hdGljcyDgpqrgpr7gpp/gp4DgppfgpqPgpr/gpqTgp4fgprAgcHJpb3JpdHkgd2FzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE0LjY4NyB0bV9wdF82PS01LjEyMyB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMS4wMTggdG1fcHRfMTA9LTEuMDA0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjQyOCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTIyLjYxMiBsbV8xPS0yNS41NTggV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNDkuNjU4CiszMCB8fHwgdGhlaXIgaW4gbWF0aGVtYXRpY3Mg4Kaq4Ka+4Kaf4KeA4KaX4Kaj4Ka/4Kak4KeH4KawIGluIHdhcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0yMS4xMTEgdG1fcHRfNj0tNC44MzYgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTEuMDE4IHRtX3B0XzEwPS04LjEyMiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi40MjggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD02LjAwMCBsbV8wPS0yMC4zNTcgbG1fMT0tMjUuNTU4IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTQ5Ljg0NQorMzAgfHx8IHRoZWlyIGluIG1hdGhlbWF0aWNzIOCmquCmvuCmn+CngOCml+Cmo+Cmv+CmpOCnh+CmsCBkb21pbmFuY2Ugd2FzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE0LjkyNiB0bV9wdF82PS01LjUyOSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4zODYgdG1fcHRfMTA9LTEuMDA0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjU1MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIyLjYyMiBsbV8xPS0yNS41NTggV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNDkuOTkwCiszMSB8fHwgZGVzaGd1bG8gYXJlIDogZnJhbmNlIGNhbGwgLCBtYWtlIG5vaXNlIGNoaW5hIGJlbGdpdW0gc3dpdHplcmxhbmQgZ2VybWFueSBkZW5tYXJrIHN3ZWRlbiBhdXN0cmlhIGNoZWtvc2xvdmFraWEgYXJnZW50aW5hIGl0YWx5IG5vcndheSDgprngpr7gppngp43gppfgp4fgprDgp4AgeXVnb3NsYXZpYSBidWxnYXJpYSByb21hbmlhIOCml+CnjeCmsOCngOCmuCBlZ3lwdCBzaW5nYXBvcmUgaW5kb25lc2lhIOCmpeCmvuCmh+CmsuCnjeCmr+CmvuCmqOCnjeCmoSBqYXBhbiBidXJtYSDgprngprLgp43gpq/gpr7gpqjgp43gpqEgc292aWV0IHJ1c3NpYSBpcmFuIGlyYXEgYW5kIHNyaSBsYW5rYSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMzAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMzAuMDAwIHRtX3B0XzU9LTcyLjE0NiB0bV9wdF82PS0xNC45MTIgdG1fcHRfNz0tMzAuMDAwIHRtX3B0Xzg9LTgxLjU0MCB0bV9wdF85PS0xMC4yMzYgdG1fcHRfMTA9LTE1LjkyNiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC42NTQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTM1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MzQuMDAwIGxtXzA9LTE1NC41MTQgbG1fMT0tMTMwLjQ0NSBXb3JkUGVuYWx0eT0tMTcuODA2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC03MTAuMDg3CiszMSB8fHwgZGVzaGd1bG8gYXJlIDogZnJhbmNlIGNhbGwgLCBtYWtlIG5vaXNlIGNoaW5hIGJlbGdpdW0gc3dpdHplcmxhbmQgZ2VybWFueSBkZW5tYXJrIHN3ZWRlbiBhdXN0cmlhIGNoZWtvc2xvdmFraWEgYXJnZW50aW5hIGl0YWx5IG5vcndheSDgprngpr7gppngp43gppfgp4fgprDgp4AgeXVnb3NsYXZpYSBidWxnYXJpYSBydW1hbmlhIOCml+CnjeCmsOCngOCmuCBlZ3lwdCBzaW5nYXBvcmUgaW5kb25lc2lhIOCmpeCmvuCmh+CmsuCnjeCmr+CmvuCmqOCnjeCmoSBqYXBhbiBidXJtYSDgprngprLgp43gpq/gpr7gpqjgp43gpqEgc292aWV0IHJ1c3NpYSBpcmFuIGlyYXEgYW5kIHNyaSBsYW5rYSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMzAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMzAuMDAwIHRtX3B0XzU9LTcwLjYyMCB0bV9wdF82PS0xNC45MTIgdG1fcHRfNz0tMzAuMDAwIHRtX3B0Xzg9LTgxLjU0MCB0bV9wdF85PS0xMC44NjggdG1fcHRfMTA9LTE1LjkyNiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS4zNDcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTM1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MzQuMDAwIGxtXzA9LTE1NC40NzggbG1fMT0tMTMwLjQ0NSBXb3JkUGVuYWx0eT0tMTcuODA2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC03MTAuNTEzCiszMSB8fHwgZGVzaGd1bG8gZnJhbmNlIGFyZSA6IGNhbGwgLCBtYWtlIG5vaXNlIGNoaW5hIGJlbGdpdW0gc3dpdHplcmxhbmQgZ2VybWFueSBkZW5tYXJrIHN3ZWRlbiBhdXN0cmlhIGNoZWtvc2xvdmFraWEgYXJnZW50aW5hIGl0YWx5IG5vcndheSDgprngpr7gppngp43gppfgp4fgprDgp4AgeXVnb3NsYXZpYSBidWxnYXJpYSByb21hbmlhIOCml+CnjeCmsOCngOCmuCBlZ3lwdCBzaW5nYXBvcmUgaW5kb25lc2lhIOCmpeCmvuCmh+CmsuCnjeCmr+CmvuCmqOCnjeCmoSBqYXBhbiBidXJtYSDgprngprLgp43gpq/gpr7gpqjgp43gpqEgc292aWV0IHJ1c3NpYSBpcmFuIGlyYXEgYW5kIHNyaSBsYW5rYSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMzAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMjkuMDAwIHRtX3B0XzU9LTcyLjE0NiB0bV9wdF82PS0xNC45MTIgdG1fcHRfNz0tMzAuMDAwIHRtX3B0Xzg9LTgxLjU0MCB0bV9wdF85PS0xMC4yMzYgdG1fcHRfMTA9LTE4LjY2OSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4wMjIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTM1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MzMuMDAwIGxtXzA9LTE1My41ODMgbG1fMT0tMTMwLjQ0NSBXb3JkUGVuYWx0eT0tMTcuODA2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC03MTEuNDQ4CiszMSB8fHwgZGVzaGd1bG8gZnJhbmNlIGFyZSA6IGNhbGwgLCBtYWtlIG5vaXNlIGNoaW5hIGJlbGdpdW0gc3dpdHplcmxhbmQgZ2VybWFueSBkZW5tYXJrIHN3ZWRlbiBhdXN0cmlhIGNoZWtvc2xvdmFraWEgYXJnZW50aW5hIGl0YWx5IG5vcndheSDgprngpr7gppngp43gppfgp4fgprDgp4AgeXVnb3NsYXZpYSBidWxnYXJpYSBydW1hbmlhIOCml+CnjeCmsOCngOCmuCBlZ3lwdCBzaW5nYXBvcmUgaW5kb25lc2lhIOCmpeCmvuCmh+CmsuCnjeCmr+CmvuCmqOCnjeCmoSBqYXBhbiBidXJtYSDgprngprLgp43gpq/gpr7gpqjgp43gpqEgc292aWV0IHJ1c3NpYSBpcmFuIGlyYXEgYW5kIHNyaSBsYW5rYSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMzAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMjkuMDAwIHRtX3B0XzU9LTcwLjYyMCB0bV9wdF82PS0xNC45MTIgdG1fcHRfNz0tMzAuMDAwIHRtX3B0Xzg9LTgxLjU0MCB0bV9wdF85PS0xMC44NjggdG1fcHRfMTA9LTE4LjY2OSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy43MTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTM1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MzMuMDAwIGxtXzA9LTE1My41NDYgbG1fMT0tMTMwLjQ0NSBXb3JkUGVuYWx0eT0tMTcuODA2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC03MTEuODc1CiszMSB8fHwgZGVzaGd1bG8gYXJlIDogZnJhbmNlIGNhbGwgLCBtYWtlIG5vaXNlIGNoaW5hIGJlbGdpdW0gc3dpdHplcmxhbmQgZ2VybWFueSBkZW5tYXJrIGNoZWtvc2xvdmFraWEgc3dlZGVuIGF1c3RyaWEgYXJnZW50aW5hIGl0YWx5IG5vcndheSDgprngpr7gppngp43gppfgp4fgprDgp4AgeXVnb3NsYXZpYSBidWxnYXJpYSByb21hbmlhIOCml+CnjeCmsOCngOCmuCBlZ3lwdCBzaW5nYXBvcmUgaW5kb25lc2lhIOCmpeCmvuCmh+CmsuCnjeCmr+CmvuCmqOCnjeCmoSBqYXBhbiBidXJtYSDgprngprLgp43gpq/gpr7gpqjgp43gpqEgc292aWV0IHJ1c3NpYSBpcmFuIGlyYXEgYW5kIHNyaSBsYW5rYSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMzAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMjkuMDAwIHRtX3B0XzU9LTcyLjE0NiB0bV9wdF82PS0xNC45MTIgdG1fcHRfNz0tMzAuMDAwIHRtX3B0Xzg9LTgxLjU0MCB0bV9wdF85PS0xMC40NjggdG1fcHRfMTA9LTE1LjYzOSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC42NTQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTM1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MzIuMDAwIGxtXzA9LTE1NC41MTQgbG1fMT0tMTMwLjQ0NSBXb3JkUGVuYWx0eT0tMTcuODA2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC03MTIuMTY4CiszMSB8fHwgZGVzaGd1bG8gYXJlIDogZnJhbmNlIGNhbGwgLCBtYWtlIG5vaXNlIGJlbGdpdW0gY2hpbmEgc3dpdHplcmxhbmQgZ2VybWFueSBkZW5tYXJrIHN3ZWRlbiBhdXN0cmlhIGNoZWtvc2xvdmFraWEgYXJnZW50aW5hIGl0YWx5IG5vcndheSDgprngpr7gppngp43gppfgp4fgprDgp4AgeXVnb3NsYXZpYSBidWxnYXJpYSByb21hbmlhIOCml+CnjeCmsOCngOCmuCBlZ3lwdCBzaW5nYXBvcmUgaW5kb25lc2lhIOCmpeCmvuCmh+CmsuCnjeCmr+CmvuCmqOCnjeCmoSBqYXBhbiBidXJtYSDgprngprLgp43gpq/gpr7gpqjgp43gpqEgc292aWV0IHJ1c3NpYSBpcmFuIGlyYXEgYW5kIHNyaSBsYW5rYSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMzAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMjkuMDAwIHRtX3B0XzU9LTcyLjE0NiB0bV9wdF82PS0xNC45MTIgdG1fcHRfNz0tMzAuMDAwIHRtX3B0Xzg9LTgxLjU0MCB0bV9wdF85PS0xMC4yNTQgdG1fcHRfMTA9LTE4LjE0NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4wNzAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTM1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MzMuMDAwIGxtXzA9LTE1NC41MTQgbG1fMT0tMTMwLjQ0NSBXb3JkUGVuYWx0eT0tMTcuODA2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC03MTIuNDk3CiszMSB8fHwgZGVzaGd1bG8gYXJlIDogZnJhbmNlIGNhbGwgLCBtYWtlIG5vaXNlIGNoaW5hIGJlbGdpdW0gc3dpdHplcmxhbmQgZ2VybWFueSBkZW5tYXJrIHN3ZWRlbiBhdXN0cmlhIGNoZWtvc2xvdmFraWEgYXJnZW50aW5hIGl0YWx5IG5vcndheSDgprngpr7gppngp43gppfgp4fgprDgp4AgeXVnb3NsYXZpYSBidWxnYXJpYSByb21hbmlhIOCml+CnjeCmsOCngOCmuCBlZ3lwdCBzaW5nYXBvcmUgaW5kb25lc2lhIOCmpeCmvuCmh+CmsuCnjeCmr+CmvuCmqOCnjeCmoSBqYXBhbiBidXJtYSDgprngprLgp43gpq/gpr7gpqjgp43gpqEgc292aWV0IHVuaW9uIGlyYW4gaXJhcSBhbmQgc3JpIGxhbmthIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0zMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zMC4wMDAgdG1fcHRfNT0tNzUuNTMwIHRtX3B0XzY9LTE3LjM2OSB0bV9wdF83PS0zMC4wMDAgdG1fcHRfOD0tODEuNTQwIHRtX3B0Xzk9LTEwLjYwNCB0bV9wdF8xMD0tMTkuNjQzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjQyNyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMzUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0zNC4wMDAgbG1fMD0tMTUzLjUxNSBsbV8xPS0xMzAuNDQ1IFdvcmRQZW5hbHR5PS0xNy44MDYgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTcxMi41ODUKKzMxIHx8fCBkZXNoZ3VsbyBhcmUgOiBmcmFuY2UgY2FsbCAsIG1ha2Ugbm9pc2UgY2hpbmEgYmVsZ2l1bSBzd2l0emVybGFuZCBnYXJtYW55IGRlbm1hcmsgc3dlZGVuIGF1c3RyaWEgY2hla29zbG92YWtpYSBhcmdlbnRpbmEgaXRhbHkgbm9yd2F5IOCmueCmvuCmmeCnjeCml+Cnh+CmsOCngCB5dWdvc2xhdmlhIGJ1bGdhcmlhIHJvbWFuaWEg4KaX4KeN4Kaw4KeA4Ka4IGVneXB0IHNpbmdhcG9yZSBpbmRvbmVzaWEg4Kal4Ka+4KaH4Kay4KeN4Kav4Ka+4Kao4KeN4KahIGphcGFuIGJ1cm1hIOCmueCmsuCnjeCmr+CmvuCmqOCnjeCmoSBzb3ZpZXQgcnVzc2lhIGlyYW4gaXJhcSBhbmQgc3JpIGxhbmthIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0zMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zMC4wMDAgdG1fcHRfNT0tNjkuNzMwIHRtX3B0XzY9LTE4LjA5MCB0bV9wdF83PS0zMC4wMDAgdG1fcHRfOD0tODEuNTQwIHRtX3B0Xzk9LTExLjE4NiB0bV9wdF8xMD0tMTIuNTUwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjA0MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMzUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0zNC4wMDAgbG1fMD0tMTU1LjkyNSBsbV8xPS0xMzAuNDQ1IFdvcmRQZW5hbHR5PS0xNy44MDYgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTcxMi44NTAKKzMxIHx8fCBkZXNoZ3VsbyBhcmUgOiBmcmFuY2UgY2FsbCAsIG1ha2Ugbm9pc2UgYmVsZ2l1bSBjaGluYSBzd2l0emVybGFuZCBnZXJtYW55IGRlbm1hcmsgc3dlZGVuIGF1c3RyaWEgY2hla29zbG92YWtpYSBhcmdlbnRpbmEgaXRhbHkgbm9yd2F5IOCmueCmvuCmmeCnjeCml+Cnh+CmsOCngCB5dWdvc2xhdmlhIGJ1bGdhcmlhIHJ1bWFuaWEg4KaX4KeN4Kaw4KeA4Ka4IGVneXB0IHNpbmdhcG9yZSBpbmRvbmVzaWEg4Kal4Ka+4KaH4Kay4KeN4Kav4Ka+4Kao4KeN4KahIGphcGFuIGJ1cm1hIOCmueCmsuCnjeCmr+CmvuCmqOCnjeCmoSBzb3ZpZXQgcnVzc2lhIGlyYW4gaXJhcSBhbmQgc3JpIGxhbmthIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0zMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yOS4wMDAgdG1fcHRfNT0tNzAuNjIwIHRtX3B0XzY9LTE0LjkxMiB0bV9wdF83PS0zMC4wMDAgdG1fcHRfOD0tODEuNTQwIHRtX3B0Xzk9LTEwLjg4NiB0bV9wdF8xMD0tMTguMTQ2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03Ljc2MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMzUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0zMy4wMDAgbG1fMD0tMTU0LjQ3OCBsbV8xPS0xMzAuNDQ1IFdvcmRQZW5hbHR5PS0xNy44MDYgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTcxMi45MjMKKzMxIHx8fCBkZXNoZ3VsbyBhcmUgOiBmcmFuY2UgY2FsbCAsIG1ha2Ugbm9pc2UgY2hpbmEgYmVsZ2l1bSBzd2l0emVybGFuZCBnZXJtYW55IGRlbm1hcmsgc3dlZGVuIGF1c3RyaWEgY2hla29zbG92YWtpYSBhcmdlbnRpbmEgaXRhbHkgbm9yd2F5IOCmueCmvuCmmeCnjeCml+Cnh+CmsOCngCB5dWdvc2xhdmlhIGJ1bGdhcmlhIHJ1bWFuaWEg4KaX4KeN4Kaw4KeA4Ka4IGVneXB0IHNpbmdhcG9yZSBpbmRvbmVzaWEg4Kal4Ka+4KaH4Kay4KeN4Kav4Ka+4Kao4KeN4KahIGphcGFuIGJ1cm1hIOCmueCmsuCnjeCmr+CmvuCmqOCnjeCmoSBzb3ZpZXQgdW5pb24gaXJhbiBpcmFxIGFuZCBzcmkgbGFua2EgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTMwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMwLjAwMCB0bV9wdF81PS03NC4wMDQgdG1fcHRfNj0tMTcuMzY5IHRtX3B0Xzc9LTMwLjAwMCB0bV9wdF84PS04MS41NDAgdG1fcHRfOT0tMTEuMjM2IHRtX3B0XzEwPS0xOS42NDMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguMTIwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0zNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTM0LjAwMCBsbV8wPS0xNTMuNDc5IGxtXzE9LTEzMC40NDUgV29yZFBlbmFsdHk9LTE3LjgwNiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNzEzLjAxMQorMzIgfHx8IHRoaXMg4Kas4KeN4Kav4Ka+4Ka44Ka/4Kay4Ka/4KaV4Ka+4KawIHBsYWNlcyBub3cgc2l0dWF0ZWQgYmFuayBvZiBlbmdsYW5kIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTExLjk0NSB0bV9wdF82PS02LjYxOSB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4wMzIgdG1fcHRfMTA9LTMuNDc4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjgwOCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI0LjI1NiBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTguOTc5CiszMiB8fHwgdGhpcyDgpqzgp43gpq/gpr7gprjgpr/gprLgpr/gppXgpr7gprAgcGxhY2VzIG5vdyBsb2NhdGVkIGJhbmsgb2YgZW5nbGFuZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xMi4xMzYgdG1fcHRfNj0tNi44MjcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMDYzIHRtX3B0XzEwPS0zLjcwMSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4wMzEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yNC4yMzEgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTU5LjIxOQorMzIgfHx8IHRoaXMg4Kas4KeN4Kav4Ka+4Ka44Ka/4Kay4Ka/4KaV4Ka+4KawIHBsYWNlcyBub3cgYmFuayBvZiBlbmdsYW5kIGlzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTE1LjQyOCB0bV9wdF82PS02LjQ4MSB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMC4xNDUgdG1fcHRfMTA9LTguNjA0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjA2NCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTI0LjAwNSBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTkuNDE2CiszMiB8fHwgdGhpcyDgpqzgp43gpq/gpr7gprjgpr/gprLgpr/gppXgpr7gprAgcGxhY2VzIGlzIHNpdHVhdGVkIGJhbmsgb2YgZW5nbGFuZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xNi4zMDYgdG1fcHRfNj0tNy41NDMgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMDMyIHRtX3B0XzEwPS03LjE0MCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS4xNDMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yMi41NTkgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTU5LjQ1MgorMzIgfHx8IHRoaXMg4Kas4KeN4Kav4Ka+4Ka44Ka/4Kay4Ka/4KaV4Ka+4KawIHBsYWNlcyBub3cgYmFuayBvZiBlbmdsYW5kIHNpdHVhdGVkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTExLjk0NSB0bV9wdF82PS02LjYxOSB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC41MTAgdG1fcHRfMTA9LTMuNjYwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjUyMSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTI2LjAxNyBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTkuNTY3CiszMiB8fHwgdGhpcyDgpqzgp43gpq/gpr7gprjgpr/gprLgpr/gppXgpr7gprAgcGFydHMgaXMgc2l0dWF0ZWQgYmFuayBvZiBlbmdsYW5kIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE3Ljc4MyB0bV9wdF82PS04LjMzMiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4wNzUgdG1fcHRfMTA9LTcuNzk2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjU0OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIxLjk1OCBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTkuNjEwCiszMiB8fHwgdGhpcyDgpqzgp43gpq/gpr7gprjgpr/gprLgpr/gppXgpr7gprAgcGxhY2VzIGlzIGxvY2F0ZWQgYmFuayBvZiBlbmdsYW5kIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE2LjQ5NyB0bV9wdF82PS03Ljc1MSB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4wNjMgdG1fcHRfMTA9LTcuMzYzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjM2NiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIyLjYyNyBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTkuODA3CiszMiB8fHwgdGhpcyDgpqzgp43gpq/gpr7gprjgpr/gprLgpr/gppXgpr7gprAgcGxhY2VzIGFyZSBzaXR1YXRlZCBiYW5rIG9mIGVuZ2xhbmQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTYuODMyIHRtX3B0XzY9LTguODkzIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjQwMCB0bV9wdF8xMD0tNy44NzUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNzUzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjEuNTQwIGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE1OS44MTQKKzMyIHx8fCB0aGlzIOCmrOCnjeCmr+CmvuCmuOCmv+CmsuCmv+CmleCmvuCmsCBwYXJ0cyBub3cgc2l0dWF0ZWQgYmFuayBvZiBlbmdsYW5kIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTEzLjQyMiB0bV9wdF82PS03LjQwOCB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4wNzUgdG1fcHRfMTA9LTQuMTM1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjIxNCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI0LjIwNyBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTkuODIwCiszMiB8fHwgdGhpcyDgpqzgp43gpq/gpr7gprjgpr/gprLgpr/gppXgpr7gprAgcGxhY2VzIG5vdyBiYW5rIG9mIGVuZ2xhbmQgbG9jYXRlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xMi4xMzYgdG1fcHRfNj0tNi44MjcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuNTEwIHRtX3B0XzEwPS0zLjY2MCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy41MjEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yNi4xOTIgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTU5Ljg5MQorMzMgfHx8IGNvdW50cnkgaW4g4Kas4Ka/4Ka44KeN4KaV4Ka+4KaHIHN1Yi1zZWEgc291dGggdGhlIOCmnOCmv+CmrOCnjeCmsOCmvuCmsuCnjeCmn+CmvuCmsCBzdHJhaXQg4Kaq4KeN4Kaw4Kaj4Ka+4Kay4KeA4KawIGluIOCmruCmsOCmleCnjeCmleCniyB0aGUgd2VzdCBhbmQgdGhlIGF0bGFudGljIG9jZWFuIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMzYuMTEwIHRtX3B0XzY9LTE0Ljk1OSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTQuMTkyIHRtX3B0XzEwPS0zOS43NDMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEzLjM0NiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNTIuODU4IGxtXzE9LTYxLjk2MSBXb3JkUGVuYWx0eT0tOC42ODYgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNy4yMzcKKzMzIHx8fCBjb3VudHJ5IGluIOCmrOCmv+CmuOCnjeCmleCmvuCmhyBzdWItc2VhIHNvdXRoIHRoZSDgppzgpr/gpqzgp43gprDgpr7gprLgp43gpp/gpr7gprAgc3RyYWl0IOCmquCnjeCmsOCmo+CmvuCmsuCngOCmsCB0aGUg4Kau4Kaw4KaV4KeN4KaV4KeLIHRoZSB3ZXN0IGFuZCB0aGUgYXRsYW50aWMgb2NlYW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0zNi4yNjIgdG1fcHRfNj0tMTQuMTc5IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tNC4xOTIgdG1fcHRfMTA9LTQwLjgxMiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTMuMzQ2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS01Mi44NzIgbG1fMT0tNjEuOTYxIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM3LjI5NAorMzMgfHx8IGNvdW50cnkgaW4g4Kas4Ka/4Ka44KeN4KaV4Ka+4KaHIHN1Yi1zZWEgc291dGggb2Yg4Kac4Ka/4Kas4KeN4Kaw4Ka+4Kay4KeN4Kaf4Ka+4KawIHN0cmFpdCDgpqrgp43gprDgpqPgpr7gprLgp4DgprAgaW4g4Kau4Kaw4KaV4KeN4KaV4KeLIHRoZSB3ZXN0IGFuZCB0aGUgYXRsYW50aWMgb2NlYW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0zNi4yOTggdG1fcHRfNj0tMTUuNDc0IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tNC4xOTIgdG1fcHRfMTA9LTM5LjA4NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTMuOTgyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS01Mi43MDUgbG1fMT0tNjEuOTYxIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM3LjMxNAorMzMgfHx8IGNvdW50cnkgaW4g4Kas4Ka/4Ka44KeN4KaV4Ka+4KaHIHN1Yi1zZWEgc291dGggb2Yg4Kac4Ka/4Kas4KeN4Kaw4Ka+4Kay4KeN4Kaf4Ka+4KawIHN0cmFpdCDgpqrgp43gprDgpqPgpr7gprLgp4DgprAgdGhlIOCmruCmsOCmleCnjeCmleCniyB0aGUgd2VzdCBhbmQgdGhlIGF0bGFudGljIG9jZWFuIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMzYuNDUwIHRtX3B0XzY9LTE0LjY5NCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTQuMTkyIHRtX3B0XzEwPS00MC4xNTUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEzLjk4MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNTIuNzE5IGxtXzE9LTYxLjk2MSBXb3JkUGVuYWx0eT0tOC42ODYgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNy4zNzEKKzMzIHx8fCBjb3VudHJ5IGluIOCmrOCmv+CmuOCnjeCmleCmvuCmhyBzdWItc2VhIHNvdXRoIHRoZSDgppzgpr/gpqzgp43gprDgpr7gprLgp43gpp/gpr7gprAgc3RyYWl0IOCmquCnjeCmsOCmo+CmvuCmsuCngOCmsCBzb3V0aCDgpq7gprDgppXgp43gppXgp4sgdGhlIHdlc3QgYW5kIHRoZSBhdGxhbnRpYyBvY2VhbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTMxLjc5OCB0bV9wdF82PS0xNC4zMzcgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS00LjA3NSB0bV9wdF8xMD0tMzcuMjMyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMi44MzUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIGxtXzA9LTU0LjU4MSBsbV8xPS02MS45NjEgV29yZFBlbmFsdHk9LTguNjg2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MzcuNDAyCiszMyB8fHwgY291bnRyeSBpbiDgpqzgpr/gprjgp43gppXgpr7gpocgc3ViLXNlYSBzb3V0aCBvZiDgppzgpr/gpqzgp43gprDgpr7gprLgp43gpp/gpr7gprAgc3RyYWl0IOCmquCnjeCmsOCmo+CmvuCmsuCngOCmsCBzb3V0aCDgpq7gprDgppXgp43gppXgp4sgdGhlIHdlc3QgYW5kIHRoZSBhdGxhbnRpYyBvY2VhbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTMxLjk4NiB0bV9wdF82PS0xNC44NTEgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS00LjA3NSB0bV9wdF8xMD0tMzYuNTc2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMy40NzEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE0LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIGxtXzA9LTU0LjQyOCBsbV8xPS02MS45NjEgV29yZFBlbmFsdHk9LTguNjg2IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MzcuNDgwCiszMyB8fHwgdGhlIGNvdW50cnkgaW4g4Kas4Ka/4Ka44KeN4KaV4Ka+4KaHIHN1Yi1zZWEgc291dGggdGhlIOCmnOCmv+CmrOCnjeCmsOCmvuCmsuCnjeCmn+CmvuCmsCBzdHJhaXQg4Kaq4KeN4Kaw4Kaj4Ka+4Kay4KeA4KawIGluIOCmruCmsOCmleCnjeCmleCniyB0aGUgd2VzdCBhbmQgdGhlIGF0bGFudGljIG9jZWFuIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDEuODQxIHRtX3B0XzY9LTE0Ljg2OSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTMuMTk4IHRtX3B0XzEwPS0zNS45ODkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTExLjU1NCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNTIuOTE0IGxtXzE9LTY1LjIyMyBXb3JkUGVuYWx0eT0tOS4xMjAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzOC4wNTEKKzMzIHx8fCB0aGUgY291bnRyeSBpbiDgpqzgpr/gprjgp43gppXgpr7gpocgc3ViLXNlYSBzb3V0aCB0aGUg4Kac4Ka/4Kas4KeN4Kaw4Ka+4Kay4KeN4Kaf4Ka+4KawIHN0cmFpdCDgpqrgp43gprDgpqPgpr7gprLgp4DgprAgdGhlIOCmruCmsOCmleCnjeCmleCniyB0aGUgd2VzdCBhbmQgdGhlIGF0bGFudGljIG9jZWFuIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDEuOTk0IHRtX3B0XzY9LTE0LjA4OSB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTMuMTk4IHRtX3B0XzEwPS0zNy4wNTggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTExLjU1NCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNTIuOTI4IGxtXzE9LTY1LjIyMyBXb3JkUGVuYWx0eT0tOS4xMjAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzOC4xMDgKKzMzIHx8fCB0aGUgY291bnRyeSBpbiDgpqzgpr/gprjgp43gppXgpr7gpocgc3ViLXNlYSBzb3V0aCBvZiDgppzgpr/gpqzgp43gprDgpr7gprLgp43gpp/gpr7gprAgc3RyYWl0IOCmquCnjeCmsOCmo+CmvuCmsuCngOCmsCBpbiDgpq7gprDgppXgp43gppXgp4sgdGhlIHdlc3QgYW5kIHRoZSBhdGxhbnRpYyBvY2VhbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTQyLjAyOSB0bV9wdF82PS0xNS4zODQgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0zLjE5OSB0bV9wdF8xMD0tMzUuMzMzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMi4xOTAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIGxtXzA9LTUyLjc2MSBsbV8xPS02NS4yMjMgV29yZFBlbmFsdHk9LTkuMTIwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MzguMTI5CiszMyB8fHwgdGhlIGNvdW50cnkgaW4g4Kas4Ka/4Ka44KeN4KaV4Ka+4KaHIHN1Yi1zZWEgc291dGggb2Yg4Kac4Ka/4Kas4KeN4Kaw4Ka+4Kay4KeN4Kaf4Ka+4KawIHN0cmFpdCDgpqrgp43gprDgpqPgpr7gprLgp4DgprAgdGhlIOCmruCmsOCmleCnjeCmleCniyB0aGUgd2VzdCBhbmQgdGhlIGF0bGFudGljIG9jZWFuIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS00Mi4xODEgdG1fcHRfNj0tMTQuNjAzIHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMy4xMTMgdG1fcHRfMTA9LTM1LjU0MCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTEuNTg0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS01Mi43NzUgbG1fMT0tNjUuMjIzIFdvcmRQZW5hbHR5PS05LjEyMCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM4LjY0MgorMzQgfHx8IGFwYXJ0IGZyb20gdGhpcyBzaXR1YXRpb24gdW5kZXJzdG9vZCBhIOCmruCngeCmueCnguCmsOCnjeCmpOCnhyB0aGUgdGhlIGRlY2lzaW9uIHdpdGhpbiDgpoXgppXgp43gprfgpq7gpqTgpr4gYWZ0ZXIgdGFraW5nIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS01Mi44ODkgdG1fcHRfNj0tMTkuODc1IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tNS4zNjggdG1fcHRfMTA9LTMxLjI5NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy45MTAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEzLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTQzLjI4NSBsbV8xPS01Mi4xNzggV29yZFBlbmFsdHk9LTcuMzgzIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMTkuNjcwCiszNCB8fHwgb3RoZXIgdGhhbiB0aGlzIHNpdHVhdGlvbiB1bmRlcnN0b29kIGEg4Kau4KeB4Ka54KeC4Kaw4KeN4Kak4KeHIHRoZSB0aGUgZGVjaXNpb24gd2l0aGluIOCmheCmleCnjeCmt+CmruCmpOCmviBhZnRlciB0YWtpbmcgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTU0LjU4MCB0bV9wdF82PS0yMC41NjggdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS01LjM2OCB0bV9wdF8xMD0tMzEuNTQ4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjkxMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDIuODgwIGxtXzE9LTUyLjE3OCBXb3JkUGVuYWx0eT0tNy4zODMgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMxOS43OTQKKzM0IHx8fCBtb3Jlb3ZlciB0aGlzIHNpdHVhdGlvbiB1bmRlcnN0b29kIGEg4Kau4KeB4Ka54KeC4Kaw4KeN4Kak4KeHIHRoZSB0aGUgZGVjaXNpb24gd2l0aGluIOCmheCmleCnjeCmt+CmruCmpOCmviBhZnRlciB0YWtpbmcgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTQ2LjIyNSB0bV9wdF82PS0yMS4yNjEgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS00LjUwMyB0bV9wdF8xMD0tMzAuMzkyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjQ3NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tNDYuMjM0IGxtXzE9LTQ4LjkxNyBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMxOS45MjkKKzM0IHx8fCBhcGFydCBmcm9tIHRoaXMgc2l0dWF0aW9uIHVuZGVyc3Rvb2QgYSDgpq7gp4Hgprngp4LgprDgp43gpqTgp4cgdGhlIHRoZSB3aXRoaW4g4KaF4KaV4KeN4Ka34Kau4Kak4Ka+IGFmdGVyIHRha2luZyBkZWNpc2lvbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tNTIuODg5IHRtX3B0XzY9LTE5Ljg3NSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTUuNzM2IHRtX3B0XzEwPS0zMi42MjcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguOTc5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS00MS44OTIgbG1fMT0tNTIuMTc4IFdvcmRQZW5hbHR5PS03LjM4MyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzE5LjkzNgorMzQgfHx8IGFwYXJ0IGZyb20gdGhpcyBzaXR1YXRpb24gdW5kZXJzdG9vZCBhIOCmruCngeCmueCnguCmsOCnjeCmpOCnhyB0aGUgZmFzdCB3aXRoaW4g4KaF4KaV4KeN4Ka34Kau4Kak4Ka+IGFmdGVyIHRha2luZyBkZWNpc2lvbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tNDcuMjQxIHRtX3B0XzY9LTIwLjcyMiB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTUuNzM3IHRtX3B0XzEwPS0yNi45NjUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuMjAyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS00My42OTEgbG1fMT0tNTIuMTc4IFdvcmRQZW5hbHR5PS03LjM4MyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzE5Ljk4MgorMzQgfHx8IG90aGVyIHRoYW4gdGhpcyBzaXR1YXRpb24gdW5kZXJzdG9vZCBhIOCmruCngeCmueCnguCmsOCnjeCmpOCnhyB0aGUgdGhlIHdpdGhpbiDgpoXgppXgp43gprfgpq7gpqTgpr4gYWZ0ZXIgdGFraW5nIGRlY2lzaW9uIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS01NC41ODAgdG1fcHRfNj0tMjAuNTY4IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tNS43MzYgdG1fcHRfMTA9LTMyLjg3OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC45NzkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEzLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTQxLjQ4NyBsbV8xPS01Mi4xNzggV29yZFBlbmFsdHk9LTcuMzgzIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjAuMDYwCiszNCB8fHwgb3RoZXIgdGhhbiB0aGlzIHNpdHVhdGlvbiB1bmRlcnN0b29kIGEg4Kau4KeB4Ka54KeC4Kaw4KeN4Kak4KeHIHRoZSBmYXN0IHdpdGhpbiDgpoXgppXgp43gprfgpq7gpqTgpr4gYWZ0ZXIgdGFraW5nIGRlY2lzaW9uIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS00OC45MzIgdG1fcHRfNj0tMjEuNDE1IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tNS43MzcgdG1fcHRfMTA9LTI3LjIxNyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOS4yMDIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEzLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTQzLjI4NiBsbV8xPS01Mi4xNzggV29yZFBlbmFsdHk9LTcuMzgzIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMjAuMTA2CiszNCB8fHwgbW9yZW92ZXIgdGhpcyBzaXR1YXRpb24gdW5kZXJzdG9vZCBhIOCmruCngeCmueCnguCmsOCnjeCmpOCnhyB0aGUgdGhlIHdpdGhpbiDgpoXgppXgp43gprfgpq7gpqTgpr4gYWZ0ZXIgdGFraW5nIGRlY2lzaW9uIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS00Ni4yMjUgdG1fcHRfNj0tMjEuMjYxIHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tNC44NzEgdG1fcHRfMTA9LTMxLjcyMiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy41NDQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tNDQuODQxIGxtXzE9LTQ4LjkxNyBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyMC4xOTUKKzM0IHx8fCBtb3Jlb3ZlciB0aGlzIHNpdHVhdGlvbiB1bmRlcnN0b29kIGEg4Kau4KeB4Ka54KeC4Kaw4KeN4Kak4KeHIHRoZSBmYXN0IHdpdGhpbiDgpoXgppXgp43gprfgpq7gpqTgpr4gYWZ0ZXIgdGFraW5nIGRlY2lzaW9uIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS00MC41NzggdG1fcHRfNj0tMjIuMTA5IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tNC44NzIgdG1fcHRfMTA9LTI2LjA2MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy43NjcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tNDYuNjQwIGxtXzE9LTQ4LjkxNyBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyMC4yNDEKKzM1IHx8fCDgppXgpr7gprDgp43gprIgdGhlcmUgaXMgd29yayB0aHJvdWdoIGl0IGJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTI3LjI5OCB0bV9wdF82PS0xMC43MDQgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuNTUzIHRtX3B0XzEwPS0yMi43MzkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuNjcyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIyLjIyOCBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjQuOTgzCiszNSB8fHwg4KaV4Ka+4Kaw4KeN4KayIHRoZXJlIGlzIHdvcmsgdGhyb3VnaCB0aGlzIGJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTI4Ljg5MSB0bV9wdF82PS0xMS42NTAgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuNTUzIHRtX3B0XzEwPS0yNC42NzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMzA1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIxLjYxNSBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjUuNTc4CiszNSB8fHwg4KaV4Ka+4Kaw4KeN4KayIHRoZXJlIGlzIHdvcmsgdGhyb3VnaCBpdCBieSB0aGUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMzEuMzA2IHRtX3B0XzY9LTguNzY2IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMTkuMzEzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjAxMSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTIyLjc2NyBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjUuNzYxCiszNSB8fHwg4KaV4Ka+4Kaw4KeN4KayIHRoZXJlIGlzIG9ubHkgdGhyb3VnaCBpdCBieSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0zMC40MDYgdG1fcHRfNj0tMTMuNjQ4IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjkyMSB0bV9wdF8xMD0tMjUuMjc5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjY4NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yMC42NDQgbG1fMT0tMjkuMzUwIFdvcmRQZW5hbHR5PS00LjM0MyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTY2LjI5NworMzUgfHx8IOCmleCmvuCmsOCnjeCmsiB0aGVyZSBpcyB3b3JrcyB0aGF0IGl0IGJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTMxLjc3NiB0bV9wdF82PS0xMy43ODIgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMjQyIHRtX3B0XzEwPS0yMi42MTQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuODk1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIGxtXzA9LTIxLjMzNSBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjYuNTQzCiszNSB8fHwg4KaV4Ka+4Kaw4KeN4KayIHRoZXJlIGlzIHdvcmsgdGhyb3VnaCB0aGlzIGFyZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0zMC40OTEgdG1fcHRfNj0tMTIuODc0IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjg3MSB0bV9wdF8xMD0tMjUuODYyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01Ljk5OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yMS4yNDAgbG1fMT0tMjkuMzUwIFdvcmRQZW5hbHR5PS00LjM0MyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTY2LjY1NAorMzUgfHx8IOCmleCmvuCmsOCnjeCmsiB0aGVyZSBpcyB3b3JrIHRoYXQgaXQgYnkgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMzEuMzc0IHRtX3B0XzY9LTEyLjc4MyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4yMzUgdG1fcHRfMTA9LTIzLjEyMyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy45NzkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgbG1fMD0tMjEuOTM1IGxtXzE9LTI5LjM1MCBXb3JkUGVuYWx0eT0tNC4zNDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2Ni42NjkKKzM1IHx8fCDgppXgpr7gprDgp43gprIgdGhlcmUgaXMgd29yayB0aHJvdWdoIHRoaXMgYnkgdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTMyLjkwMCB0bV9wdF82PS05LjcxMyB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMC41NTMgdG1fcHRfMTA9LTIxLjI0NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS42NDQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yMi41MzggbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTY2LjgzMgorMzUgfHx8IOCmleCmvuCmsOCnjeCmsiB0aGVyZSBpcyBvbmx5IHRocm91Z2ggdGhpcyBieSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0zMi4wMDAgdG1fcHRfNj0tMTQuNTk1IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjkyMSB0bV9wdF8xMD0tMjcuMjEyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjMyMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yMC4wMzAgbG1fMT0tMjkuMzUwIFdvcmRQZW5hbHR5PS00LjM0MyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTY2Ljg5MgorMzYgfHx8IHRoZSBzdWJqZWN0IHNvbWV0aW1lcyBwdXJhbiAtbHJiLSBmcm9tIHNvbWV0aW1lcyBtYWludGFpbiBsb3ZlIHN0b3J5IHNvbWV0aW1lcyBhZ2FpbiBmcm9tIHRvZGF5ICdzIHNvY2lhbCBhbmQgcG9saXRpY2FsIOCmmOCmn+CmqOCmvuCmrOCmsuCmvyB0YWtlbiBmcm9tIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNDkuMzIwIHRtX3B0XzY9LTE5LjUxNCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTQuMzIxIHRtX3B0XzEwPS0xMy41NzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguMDg2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS02MC4xMTMgbG1fMT0tNzUuMDA2IFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI1Mi41NTYKKzM2IHx8fCB0aGUgc3ViamVjdCBzb21ldGltZXMgcHVyYW4gLWxyYi0gZnJvbSBzb21ldGltZXMgbWFpbnRhaW4gbG92ZSBzdG9yeSBzb21ldGltZXMgYWdhaW4gZnJvbSB0b2RheSAncyBzb2NpYWwgYW5kIHBvbGl0aWNhbCDgppjgpp/gpqjgpr7gpqzgprLgpr8gZnJvbSBhY2NlcHRlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTQ3LjgyMiB0bV9wdF82PS0xOC42MTYgdG1fcHRfNz0tMTYuMDAwIHRtX3B0Xzg9LTQzLjQ4OCB0bV9wdF85PS0zLjMyMSB0bV9wdF8xMD0tMTMuNzQ4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04Ljc4NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNjEuMDYzIGxtXzE9LTc1LjAwNiBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNTIuODAyCiszNiB8fHwgdGhlIHN1YmplY3Qgc29tZXRpbWVzIHB1cmFuIC1scmItIGZyb20gc29tZXRpbWVzIG1haW50YWluIGxvdmUgc3RvcnkgZnJvbSBzb21ldGltZXMgYWdhaW4gdG9kYXkgJ3Mgc29jaWFsIGFuZCBwb2xpdGljYWwg4KaY4Kaf4Kao4Ka+4Kas4Kay4Ka/IHRha2VuIGZyb20gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS00OS4zMjAgdG1fcHRfNj0tMTkuNTE0IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tNC4zMjEgdG1fcHRfMTA9LTEzLjQxMyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4zNDggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIGxtXzA9LTYyLjAzNiBsbV8xPS03NS4wMDYgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjUzLjY2OQorMzYgfHx8IHRoZSBzdWJqZWN0IHNvbWV0aW1lcyBwdXJhbiAtbHJiLSBmcm9tIHNvbWV0aW1lcyBtYWludGFpbiBsb3ZlIHN0b3J5IGZyb20gc29tZXRpbWVzIGFnYWluIHRvZGF5ICdzIHNvY2lhbCBhbmQgcG9saXRpY2FsIOCmmOCmn+CmqOCmvuCmrOCmsuCmvyBmcm9tIGFjY2VwdGVkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xNC4wMDAgdG1fcHRfNT0tNDcuODIyIHRtX3B0XzY9LTE4LjYxNiB0bV9wdF83PS0xNi4wMDAgdG1fcHRfOD0tNDMuNDg4IHRtX3B0Xzk9LTMuMzIxIHRtX3B0XzEwPS0xMy41ODkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguMDQ4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBsbV8wPS02Mi45ODYgbG1fMT0tNzUuMDA2IFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI1My45MTQKKzM2IHx8fCB0aGUgc3ViamVjdCBzb21ldGltZXMgcHVyYW4gLWxyYi0gc29tZXRpbWVzIGZyb20gbWFpbnRhaW4gbG92ZSBzdG9yeSBmcm9tIHNvbWV0aW1lcyBhZ2FpbiB0b2RheSAncyBzb2NpYWwgYW5kIHBvbGl0aWNhbCDgppjgpp/gpqjgpr7gpqzgprLgpr8gdGFrZW4gZnJvbSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTQ5LjMyMCB0bV9wdF82PS0xOS41MTQgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS00LjMyMSB0bV9wdF8xMD0tMTMuNTcyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04LjA4NiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgbG1fMD0tNjEuMzg1IGxtXzE9LTc1LjAwNiBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNTQuMTMwCiszNiB8fHwgdGhlIHN1YmplY3Qgc29tZXRpbWVzIHB1cmFuIC1scmItIGZyb20gc29tZXRpbWVzIG1haW50YWluIGxvdmUgc3Rvcnkgc29tZXRpbWVzIGFnYWluIGZyb20gdG9kYXkgJ3Mgc29jaWFsIGFuZCBwb2xpdGljYWwg4KaY4Kaf4Kao4Ka+4Kas4Kay4Ka/IHRvIGFjY2VwdGVkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tNDkuNzg0IHRtX3B0XzY9LTE5LjQ5NSB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTMuMzI3IHRtX3B0XzEwPS0xNC41ODggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuNDk5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBsbV8wPS02MC43OTkgbG1fMT0tNzUuMDA2IFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI1NC40MDEKKzM2IHx8fCB0aGUgc3ViamVjdCBzb21ldGltZXMgcHVyYW4gLWxyYi0gZnJvbSBzb21ldGltZXMgbWFpbnRhaW4gbG92ZSBzdG9yeSBzb21ldGltZXMgYWdhaW4gZnJvbSB0b2RheSAncyBzb2NpYWwgYW5kIHBvbGl0aWNhbCDgppjgpp/gpqjgpr7gpqzgprLgpr8gZnJvbSBhY2NlcHRlZCB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS00OC40MTIgdG1fcHRfNj0tMjguMzQ5IHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tNC4zMjEgdG1fcHRfMTA9LTE2LjEzNyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOS4xMDIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIGxtXzA9LTYxLjcwMiBsbV8xPS03MS43NDUgV29yZFBlbmFsdHk9LTkuOTg5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNTYuMjkxCiszNiB8fHwgdGhlIHN1YmplY3Qgc29tZXRpbWVzIHB1cmFuIC1scmItIGZyb20gc29tZXRpbWVzIG1haW50YWluIGxvdmUgc3Rvcnkgc29tZXRpbWVzIGFnYWluIGZyb20gdG9kYXkgJ3Mgc29jaWFsIGFuZCBwb2xpdGljYWwg4KaY4Kaf4Kao4Ka+4Kas4Kay4Ka/IGZyb20gdGFrZW4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNDkuNzA2IHRtX3B0XzY9LTI4LjE0OCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTQuMzIxIHRtX3B0XzEwPS0xNS43NzQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuMTAyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS02MS42NDYgbG1fMT0tNzEuNzQ1IFdvcmRQZW5hbHR5PS05Ljk4OSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjU2LjMwNworMzcgfHx8IHRocmVlIG1lYXN1cmUgYmFzZWQgb24gdGhlIHRoYXQgYWdlIGlzIGZvdW5kIHRoYXQgaXMgYWxtb3N0IOCnp+CnqS7gp60gwrEg4KemLuCnqCBiaWxsaW9uIHllYXJzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMzQuNTExIHRtX3B0XzY9LTIzLjg0OCB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTMuMTQzIHRtX3B0XzEwPS0xNy44MTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMDg2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS01MC4wNzggbG1fMT0tNjEuOTYxIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDI1LjQyMQorMzcgfHx8IHRocmVlIG1lYXN1cmUgYmFzZWQgb24gdGhlIHRoYXQgaXMgZm91bmQgaW4gdGhhdCBpcyBhbG1vc3Qg4Ken4KepLuCnrSDCsSDgp6Yu4KeoIGJpbGxpb24geWVhcnMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS00MS40MzEgdG1fcHRfNj0tMjcuMDc4IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMy41MDQgdG1fcHRfMTA9LTIzLjM1NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi4yNzIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIGxtXzA9LTQ3LjAwNSBsbV8xPS02MS45NjEgV29yZFBlbmFsdHk9LTguNjg2IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MjYuMTk5CiszNyB8fHwgdGhyZWUgbWVhc3VyZSBiYXNlIG9uIHRoZSB0aGF0IGlzIGZvdW5kIGluIHRoYXQgaXMgYWxtb3N0IOCnp+CnqS7gp60gwrEg4KemLuCnqCBiaWxsaW9uIHllYXJzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDAuMzk0IHRtX3B0XzY9LTI1LjQyNyB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTMuNzM2IHRtX3B0XzEwPS0yMS4xOTcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNjc3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS00OC4wNjYgbG1fMT0tNjEuOTYxIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDI2LjUyMworMzcgfHx8IHRocmVlIG1lYXN1cmUgYmFzZWQgb24gdGhlIGFnZSBpcyBmb3VuZCBpbiB0aGUgaXMgYWxtb3N0IOCnp+CnqS7gp60gwrEg4KemLuCnqCBiaWxsaW9uIHllYXJzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0zOC44MTAgdG1fcHRfNj0tMjQuODc5IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMy41MTAgdG1fcHRfMTA9LTE0LjUwMSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi42ODEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTQ3LjY1NiBsbV8xPS02MS45NjEgV29yZFBlbmFsdHk9LTguNjg2IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MjYuNTM0CiszNyB8fHwgdGhyZWUgbWVhc3VyZSBiYXNlZCBvbiB0aGUgdGhhdCBhcmUgZm91bmQgaW4gdGhhdCBpcyBhbG1vc3Qg4Ken4KepLuCnrSDCsSDgp6Yu4KeoIGJpbGxpb24geWVhcnMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0zOC41MjcgdG1fcHRfNj0tMjQuOTk5IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMy41MDQgdG1fcHRfMTA9LTIzLjMzMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS41NzkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE1LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIGxtXzA9LTQ3Ljc3NCBsbV8xPS02MS45NjEgV29yZFBlbmFsdHk9LTguNjg2IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MjYuNjMyCiszOCB8fHwg4KaV4Ka+4Kab4KeH4KaHIGFyZSBlYXN0IHJ1c3NpYSB3aGljaCDgppPgppbgpp/gprjgp43gppUgc2VhIGFuZCBqYXBhbiBzZWEgYW5vdGhlciBjYW4gc2l0dWF0ZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMTUuMDkwIHRtX3B0XzY9LTkuNTUyIHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0wLjc1NCB0bV9wdF8xMD0tOC41OTIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNTA3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00NS43OTkgbG1fMT0tNDguOTE3IFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjk4LjU5MworMzggfHx8IOCmleCmvuCmm+Cnh+CmhyBhcmUgZWFzdCBydXNzaWEgd2hpY2gg4KaT4KaW4Kaf4Ka44KeN4KaVIHNlYSBhbmQgamFwYW4gc2VhIG90aGVyIGNhbiBzaXR1YXRlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0xNi4xMjkgdG1fcHRfNj0tOC45OTIgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTAuNzU0IHRtX3B0XzEwPS0xMC42NTYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNTA3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00NS41NDAgbG1fMT0tNDguOTE3IFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjk4LjgxNgorMzggfHx8IOCmleCmvuCmm+Cnh+CmhyBhcmUgZWFzdCBydXNzaWEgd2hpY2gg4KaT4KaW4Kaf4Ka44KeN4KaVIHNlYSBhbmQgamFwYW4gc2VhIGFub3RoZXIgY2FuIGxvY2F0ZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMTUuMjgyIHRtX3B0XzY9LTkuNzU5IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0wLjc1NCB0bV9wdF8xMD0tOC41OTIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNTA3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00NS45NzMgbG1fMT0tNDguOTE3IFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjk4LjkxNworMzggfHx8IOCmleCmvuCmm+Cnh+CmhyBhcmUgZWFzdCBydXNzaWEgd2hpY2gg4KaT4KaW4Kaf4Ka44KeN4KaVIHNlYSBhbmQgamFwYW4gc2VhIG90aGVyIGNhbiBsb2NhdGVkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTE2LjMyMSB0bV9wdF82PS05LjIwMCB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMC43NTQgdG1fcHRfMTA9LTEwLjY1NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi41MDcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTQ1LjcxNSBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTkuMTQwCiszOCB8fHwg4KaV4Ka+4Kab4KeH4KaHIGlzIGVhc3QgcnVzc2lhIHdoaWNoIOCmk+CmluCmn+CmuOCnjeCmlSBzZWEgYW5kIGphcGFuIHNlYSBhbm90aGVyIGNhbiBzaXR1YXRlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0xNi4xNjggdG1fcHRfNj0tOS44MDUgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTAuNzU0IHRtX3B0XzEwPS05Ljg0OSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi44OTAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTQ1LjcwOSBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yOTkuMjM3CiszOCB8fHwg4KaV4Ka+4Kab4KeH4KaHIGFyZSBlYXN0IHJ1c3NpYSB3aGljaCDgppPgppbgpp/gprjgp43gppUgc2VhIGFuZCBqYXBhbiBzZWEgYW5vdGhlciBjYW4gYXQgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTE4LjQyNyB0bV9wdF82PS0xOC4zMzggdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTEuMzg2IHRtX3B0XzEwPS0xMi44ODIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuMjAwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00NS4zNjMgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzAxLjQ3MAorMzggfHx8IOCmleCmvuCmm+Cnh+CmhyBhcmUgZWFzdCBydXNzaWEgd2hpY2gg4KaT4KaW4Kaf4Ka44KeN4KaVIHNlYSBhbmQgamFwYW4gc2VhIG90aGVyIGNhbiBhdCB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMTkuNDY2IHRtX3B0XzY9LTE3Ljc3OCB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMS4zODYgdG1fcHRfMTA9LTE0Ljk0NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4yMDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTQ1LjEwNSBsbV8xPS00NS42NTYgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMDEuNjkzCiszOSB8fHwga29sa2F0YSB0aGUgbmF0aW9uYWwgbGlicmFyeSB0aGUgbGVhZGluZyBwdWJsaWMg4Kay4Ka+4KaH4Kas4KeN4Kaw4KeH4Kaw4Ka/IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE3LjYxNCB0bV9wdF82PS0xMi45NTUgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTEuMzcwIHRtX3B0XzEwPS0xNy4yNTQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMzUyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tMjUuNzk1IGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2Ny44MDMKKzM5IHx8fCBrb2xrYXRhIGluZGlhbiBuYXRpb25hbCBsaWJyYXJ5IHRoZSBsZWFkaW5nIHB1YmxpYyDgprLgpr7gpofgpqzgp43gprDgp4fgprDgpr8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMTUuMTU4IHRtX3B0XzY9LTE0LjI3NCB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMS43MzggdG1fcHRfMTA9LTEzLjk3NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4xNDEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0yNy4xMTMgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTY4LjI0NgorMzkgfHx8IGtvbGthdGEgdGhlIG5hdGlvbmFsIGxpYnJhcnkgY291bnRyaWVzIGxlYWRpbmcgcHVibGljIOCmsuCmvuCmh+CmrOCnjeCmsOCnh+CmsOCmvyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xNC41MTggdG1fcHRfNj0tMTQuMzQxIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0xLjM3MCB0bV9wdF8xMD0tMTMuNDIzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjIwOSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTI3LjkzNiBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjkuMjg5CiszOSB8fHwga29sa2F0YSBpcyB0aGUgbmF0aW9uYWwgbGlicmFyeSB0aGUgbGVhZGluZyBwdWJsaWMg4Kay4Ka+4KaH4Kas4KeN4Kaw4KeH4Kaw4Ka/IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIwLjc5NiB0bV9wdF82PS03Ljk2NCB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMC4zNzMgdG1fcHRfMTA9LTE3Ljk3MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC45ODQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0yNC4xNjYgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTY5LjU2NQorMzkgfHx8IGtvbGthdGEgdGhlIGxlYWRpbmcgaW5kaWFuIG5hdGlvbmFsIGxpYnJhcnkgcHVibGljIOCmsuCmvuCmh+CmrOCnjeCmsOCnh+CmsOCmvyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNS4xNTggdG1fcHRfNj0tMTQuMjc0IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0yLjczNiB0bV9wdF8xMD0tMTMuMTQ5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjYzMyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI1LjUxOCBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjkuNjI2Cis0MCB8fHwg4Kab4Kak4KeN4Kaw4Ka+4KaV4Kas4Ka/4Kam4KeN4Kav4Ka+IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0wLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9MC4wMDAgdG1fcHRfNT0wLjAwMCB0bV9wdF82PTAuMDAwIHRtX3B0Xzc9MC4wMDAgdG1fcHRfOD0wLjAwMCB0bV9wdF85PTAuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPTAuMDAwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS03LjM1NSBsbV8xPS02LjUyMiBXb3JkUGVuYWx0eT0tMS4zMDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTExMS4zNTgKKzQxIHx8fCDgprDgpr7gprfgp43gpp/gp43gprDgprjgppngp43gppjgp4fgprAgZ2VuZXJhbCBzZWNyZXRhcnkg4Kas4Ka+4KaoIGtpIG1vb24gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTUuODQ0IHRtX3B0XzY9LTQuMTY0IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTEuMTM1IHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0wLjUxMSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIGxtXzA9LTI0LjQ3OSBsbV8xPS0yMi44MjggV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDYuNDE5Cis0MSB8fHwg4Kaw4Ka+4Ka34KeN4Kaf4KeN4Kaw4Ka44KaZ4KeN4KaY4KeH4KawIHNlY3JldGFyeSBnZW5lcmFsIOCmrOCmvuCmqCBraSBtb29uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS01Ljg0NCB0bV9wdF82PS00LjE2NCB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0xLjA1MCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMC4yMjMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBsbV8wPS0yMy44ODIgbG1fMT0tMjIuODI4IFdvcmRQZW5hbHR5PS0zLjQ3NCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjQ2LjQ3MworNDEgfHx8IOCmsOCmvuCmt+CnjeCmn+CnjeCmsOCmuOCmmeCnjeCmmOCnh+CmsCBjaGllZiBzZWNyZXRhcnkg4Kas4Ka+4KaoIGtpIG1vb24gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTcuMDgyIHRtX3B0XzY9LTQuNjQ5IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTIuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjYwOSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIGxtXzA9LTI0LjgzMiBsbV8xPS0yMi44MjggV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDguMzU1Cis0MSB8fHwg4Kas4Ka+4KaoIOCmsOCmvuCmt+CnjeCmn+CnjeCmsOCmuOCmmeCnjeCmmOCnh+CmsCBnZW5lcmFsIHNlY3JldGFyeSBraSBtb29uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS01Ljg0NCB0bV9wdF82PS00LjE2NCB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMS42MDkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0yNC40NzkgbG1fMT0tMjIuODI4IFdvcmRQZW5hbHR5PS0zLjQ3NCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjQ5LjQ4MQorNDEgfHx8IOCmsOCmvuCmt+CnjeCmn+CnjeCmsOCmuOCmmeCnjeCmmOCnh+CmsCBnZW5lcmFsIHNlY3JldGFyeSDgpqzgpr7gpqggd2hhdCBtb29uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS03LjA1OCB0bV9wdF82PS0zLjY1MyB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjUxMCB0bV9wdF8xMD0tMS4zMjIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuMDE1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjYuNzA5IGxtXzE9LTIyLjgyOCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0OS43ODgKKzQyIHx8fCDgpq7gpr/gpqjgpr/gppXgp43gprjgp4fgprAgb2Ygd2FzIHNtZWxscyDgpp/gpr7gpqjgp4fgpqjgpqzgpq4gYSBmYW1vdXMgb3BlcmF0aW5nIHN5c3RlbSBkZXNpZ24g4Kaq4KeN4Kaw4Ka24Ka/4KaV4KeN4Ka34KaVIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIyLjE4NSB0bV9wdF82PS04LjAzOCB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTE3LjU2MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy42MDQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDAuMzk4IGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5MC4zMDkKKzQyIHx8fCDgpq7gpr/gpqjgpr/gppXgp43gprjgp4fgprAgb2Ygd2FzIHNtZWxscyDgpp/gpr7gpqjgp4fgpqjgpqzgpq4gYSBmYW1vdXMgb3BlcmF0aW5nIHN5c3RlbSBkZXNpZ25pbmcg4Kaq4KeN4Kaw4Ka24Ka/4KaV4KeN4Ka34KaVIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIxLjcxOCB0bV9wdF82PS04Ljc4NSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi40MTggdG1fcHRfMTA9LTE2LjY1MCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC40MTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDAuMzA5IGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5MC40NTYKKzQyIHx8fCDgpq7gpr/gpqjgpr/gppXgp43gprjgp4fgprAgdG8gd2FzIHNtZWxscyDgpp/gpr7gpqjgp4fgpqjgpqzgpq4gYSBmYW1vdXMgb3BlcmF0aW5nIHN5c3RlbSBkZXNpZ24g4Kaq4KeN4Kaw4Ka24Ka/4KaV4KeN4Ka34KaVIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIyLjQzMyB0bV9wdF82PS05LjQyNCB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4zNzUgdG1fcHRfMTA9LTE3LjA0MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy43NDcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tNDAuNjgxIGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5Mi4wNjYKKzQyIHx8fCDgpq7gpr/gpqjgpr/gppXgp43gprjgp4fgprAgb2Ygd2VyZSBzbWVsbHMg4Kaf4Ka+4Kao4KeH4Kao4Kas4KauIGEgZmFtb3VzIG9wZXJhdGluZyBzeXN0ZW0gZGVzaWduIOCmquCnjeCmsOCmtuCmv+CmleCnjeCmt+CmlSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0yMi4yNDQgdG1fcHRfNj0tOS40OTggdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzc1IHRtX3B0XzEwPS0xNS45MzMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMTQ5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTQwLjU5MiBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTIuMTU0Cis0MyB8fHwgdGhlIOCmn+CmvuCmh+CmruCnjSB0aGUgJ3Mgb2Yg4KaH4Kao4KeN4Kah4Ka/4Kav4Ka84Ka+LeCmpOCnhyB3cml0dGVuIGluIHRoZSAiIGl0IGlzIGFic3VyZCB0byBjb21wYXJlIGl0IHdpdGggYW55IG90aGVyIGluZGlhbiBjaW5lbWEgLi4uIHBhdGhlciBwYW5jaGFsaSBpcyBwdXJlIGNpbmVtYSAiIC1scmItICIgaXQgb3RoZXIgYnkgaW5kaWFuIGZpbG1zIHdpdGggY29tcGFyZWQgdG8gdW5yZWFsIC4uLiBwYXRoZXIgcGFuY2hhbGkgYXJlIHB1cmUgZmlsbSAiIC1ycmItIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yNy4wMDAgdG1fcHRfNT0tODUuOTU5IHRtX3B0XzY9LTQyLjUxOCB0bV9wdF83PS0yOC4wMDAgdG1fcHRfOD0tNzYuMTA0IHRtX3B0Xzk9LTIuMTY4IHRtX3B0XzEwPS01NC42OTcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEyLjIwMiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMzIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD00My4wMDAgbG1fMD0tMTMyLjUxMCBsbV8xPS0xNTkuNzk1IFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEyLjQ5NQorNDMgfHx8IHRoZSDgpp/gpr7gpofgpq7gp40gb2YgJ3Mgb2Yg4KaH4Kao4KeN4Kah4Ka/4Kav4Ka84Ka+LeCmpOCnhyB3cml0dGVuIGluIHRoZSAiIGl0IGlzIGFic3VyZCB0byBjb21wYXJlIGl0IHdpdGggYW55IG90aGVyIGluZGlhbiBjaW5lbWEgLi4uIHBhdGhlciBwYW5jaGFsaSBpcyBwdXJlIGNpbmVtYSAiIC1scmItICIgaXQgb3RoZXIgYnkgaW5kaWFuIGZpbG1zIHdpdGggY29tcGFyZWQgdG8gdW5yZWFsIC4uLiBwYXRoZXIgcGFuY2hhbGkgYXJlIHB1cmUgZmlsbSAiIC1ycmItIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yNy4wMDAgdG1fcHRfNT0tODUuOTYyIHRtX3B0XzY9LTQyLjg0OCB0bV9wdF83PS0yOC4wMDAgdG1fcHRfOD0tNzYuMTA0IHRtX3B0Xzk9LTIuMjk2IHRtX3B0XzEwPS01NC4wOTggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEyLjg5NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMzIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD00My4wMDAgbG1fMD0tMTMyLjMyNyBsbV8xPS0xNTkuNzk1IFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEyLjU3NworNDMgfHx8IHRoZSDgpp/gpr7gpofgpq7gp40gdGhlICdzIG9mIOCmh+CmqOCnjeCmoeCmv+Cmr+CmvOCmvi3gpqTgp4cgd3JpdHRlbiBpbiB0aGF0ICIgaXQgaXMgYWJzdXJkIHRvIGNvbXBhcmUgaXQgd2l0aCBhbnkgb3RoZXIgaW5kaWFuIGNpbmVtYSAuLi4gcGF0aGVyIHBhbmNoYWxpIGlzIHB1cmUgY2luZW1hICIgLWxyYi0gIiBpdCBvdGhlciBieSBpbmRpYW4gZmlsbXMgd2l0aCBjb21wYXJlZCB0byB1bnJlYWwgLi4uIHBhdGhlciBwYW5jaGFsaSBhcmUgcHVyZSBmaWxtICIgLXJyYi0gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTI4LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTI3LjAwMCB0bV9wdF81PS04My40OTkgdG1fcHRfNj0tNDIuMTU5IHRtX3B0Xzc9LTI4LjAwMCB0bV9wdF84PS03Ni4xMDQgdG1fcHRfOT0tMi4xNjggdG1fcHRfMTA9LTUyLjM1MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTEuODgyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0zMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQzLjAwMCBsbV8wPS0xMzMuNzQyIGxtXzE9LTE1OS43OTUgV29yZFBlbmFsdHk9LTIxLjcxNSBPT1ZQZW5hbHR5PS0xNjAwLjAwMCB8fHwgLTE5MTIuNzAzCis0MyB8fHwgdGhlIOCmn+CmvuCmh+CmruCnjSBvZiAncyBvZiDgpofgpqjgp43gpqHgpr/gpq/gprzgpr4t4Kak4KeHIHdyaXR0ZW4gaW4gdGhhdCAiIGl0IGlzIGFic3VyZCB0byBjb21wYXJlIGl0IHdpdGggYW55IG90aGVyIGluZGlhbiBjaW5lbWEgLi4uIHBhdGhlciBwYW5jaGFsaSBpcyBwdXJlIGNpbmVtYSAiIC1scmItICIgaXQgb3RoZXIgYnkgaW5kaWFuIGZpbG1zIHdpdGggY29tcGFyZWQgdG8gdW5yZWFsIC4uLiBwYXRoZXIgcGFuY2hhbGkgYXJlIHB1cmUgZmlsbSAiIC1ycmItIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yNy4wMDAgdG1fcHRfNT0tODMuNTAzIHRtX3B0XzY9LTQyLjQ4OSB0bV9wdF83PS0yOC4wMDAgdG1fcHRfOD0tNzYuMTA0IHRtX3B0Xzk9LTIuMjk2IHRtX3B0XzEwPS01MS43NTIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEyLjU3NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMzIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD00My4wMDAgbG1fMD0tMTMzLjU1OCBsbV8xPS0xNTkuNzk1IFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEyLjc4NQorNDMgfHx8IHRoZSDgpp/gpr7gpofgpq7gp40gdGhlICdzIG9mIOCmh+CmqOCnjeCmoeCmv+Cmr+CmvOCmvi3gpqTgp4cgd3JpdHRlbiBpbiB0aGUgIiBpdCBpcyBhYnN1cmQgdG8gY29tcGFyZSBpdCB3aXRoIGFueSBvdGhlciBpbmRpYW4gY2luZW1hIC4uLiBwYXRoZXIgcGFuY2hhbGkgaXMgcHVyZSBjaW5lbWEgIiAtbHJiLSAiIGl0IG90aGVyIGJ5IGluZGlhbiBmaWxtcyB3aXRoIGNvbXBhcmVkIHRvIHVucmVhbCAuLi4gcGF0aGVyIHBhbmNoYWxpIGlzIHB1cmUgZmlsbSAiIC1ycmItIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yOC4wMDAgdG1fcHRfNT0tODYuNjY1IHRtX3B0XzY9LTQyLjQwMCB0bV9wdF83PS0yOS4wMDAgdG1fcHRfOD0tNzguODIyIHRtX3B0Xzk9LTIuMTY4IHRtX3B0XzEwPS01NS45OTAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEyLjQ2OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMzIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD00NC4wMDAgbG1fMD0tMTMyLjQyMCBsbV8xPS0xNTkuNzk1IFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEzLjA5OAorNDMgfHx8IHRoZSDgpp/gpr7gpofgpq7gp40gdGhlICdzIG9mIOCmh+CmqOCnjeCmoeCmv+Cmr+CmvOCmvi3gpqTgp4cgd3JpdHRlbiBpbiB0aGUgIiBpdCBpcyBhYnN1cmQgdG8gY29tcGFyZSBpdCB3aXRoIGFueSBvdGhlciBpbmRpYW4gY2luZW1hIC4uLiBwYXRoZXIgcGFuY2hhbGkgaXMgcHVyZSBjaW5lbWEgIiAtbHJiLSAiIGl0IG90aGVyIGJ5IGluZGlhbiBmaWxtcyB3aXRoIGNvbXBhcmVkIHRvIHVucmVhbCAuLi4gcGF0aGVyIHBhbmNoYWxpIGFyZSBwdXJlIGZpbG0gJyAtcnJiLSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMjcuMDAwIHRtX3B0XzU9LTg1LjkxOSB0bV9wdF82PS00Mi45NjcgdG1fcHRfNz0tMjguMDAwIHRtX3B0Xzg9LTc2LjEwNCB0bV9wdF85PS0yLjE2OCB0bV9wdF8xMD0tNTQuMjI0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMi42ODcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTMyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NDMuMDAwIGxtXzA9LTEzMi44OTUgbG1fMT0tMTU5Ljc5NSBXb3JkUGVuYWx0eT0tMjEuNzE1IE9PVlBlbmFsdHk9LTE2MDAuMDAwIHx8fCAtMTkxMy4xNjYKKzQzIHx8fCB0aGUg4Kaf4Ka+4KaH4Kau4KeNIG9mICdzIG9mIOCmh+CmqOCnjeCmoeCmv+Cmr+CmvOCmvi3gpqTgp4cgd3JpdHRlbiBpbiB0aGUgIiBpdCBpcyBhYnN1cmQgdG8gY29tcGFyZSBpdCB3aXRoIGFueSBvdGhlciBpbmRpYW4gY2luZW1hIC4uLiBwYXRoZXIgcGFuY2hhbGkgaXMgcHVyZSBjaW5lbWEgIiAtbHJiLSAiIGl0IG90aGVyIGJ5IGluZGlhbiBmaWxtcyB3aXRoIGNvbXBhcmVkIHRvIHVucmVhbCAuLi4gcGF0aGVyIHBhbmNoYWxpIGlzIHB1cmUgZmlsbSAiIC1ycmItIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yOC4wMDAgdG1fcHRfNT0tODYuNjY4IHRtX3B0XzY9LTQyLjczMCB0bV9wdF83PS0yOS4wMDAgdG1fcHRfOD0tNzguODIyIHRtX3B0Xzk9LTIuMjk2IHRtX3B0XzEwPS01NS4zOTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEzLjE2MSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMzIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD00NC4wMDAgbG1fMD0tMTMyLjIzNyBsbV8xPS0xNTkuNzk1IFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEzLjE4MAorNDMgfHx8IHRoZSDgpp/gpr7gpofgpq7gp40gb2YgJ3Mgb2Yg4KaH4Kao4KeN4Kah4Ka/4Kav4Ka84Ka+LeCmpOCnhyB3cml0dGVuIGluIHRoZSAiIGl0IGlzIGFic3VyZCB0byBjb21wYXJlIGl0IHdpdGggYW55IG90aGVyIGluZGlhbiBjaW5lbWEgLi4uIHBhdGhlciBwYW5jaGFsaSBpcyBwdXJlIGNpbmVtYSAiIC1scmItICIgaXQgb3RoZXIgYnkgaW5kaWFuIGZpbG1zIHdpdGggY29tcGFyZWQgdG8gdW5yZWFsIC4uLiBwYXRoZXIgcGFuY2hhbGkgYXJlIHB1cmUgZmlsbSAnIC1ycmItIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yNy4wMDAgdG1fcHRfNT0tODUuOTIzIHRtX3B0XzY9LTQzLjI5OCB0bV9wdF83PS0yOC4wMDAgdG1fcHRfOD0tNzYuMTA0IHRtX3B0Xzk9LTIuMjk2IHRtX3B0XzEwPS01My42MjUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEzLjM4MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMzIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD00My4wMDAgbG1fMD0tMTMyLjcxMiBsbV8xPS0xNTkuNzk1IFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEzLjI0OAorNDMgfHx8IHRoZSDgpp/gpr7gpofgpq7gp40gdGhlICdzIG9mIOCmh+CmqOCnjeCmoeCmv+Cmr+CmvOCmvi3gpqTgp4cgd3JpdHRlbiBpbiB0aGF0ICIgaXQgaXMgYWJzdXJkIHRvIGNvbXBhcmUgaXQgd2l0aCBhbnkgb3RoZXIgaW5kaWFuIGNpbmVtYSAuLi4gcGF0aGVyIHBhbmNoYWxpIGlzIHB1cmUgY2luZW1hICIgLWxyYi0gIiBpdCBvdGhlciBieSBpbmRpYW4gZmlsbXMgd2l0aCBjb21wYXJlZCB0byB1bnJlYWwgLi4uIHBhdGhlciBwYW5jaGFsaSBpcyBwdXJlIGZpbG0gIiAtcnJiLSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMjguMDAwIHRtX3B0XzU9LTg0LjIwNSB0bV9wdF82PS00Mi4wNDAgdG1fcHRfNz0tMjkuMDAwIHRtX3B0Xzg9LTc4LjgyMiB0bV9wdF85PS0yLjE2OCB0bV9wdF8xMD0tNTMuNjQ0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMi4xNDggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTMyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NDQuMDAwIGxtXzA9LTEzMy42NTIgbG1fMT0tMTU5Ljc5NSBXb3JkUGVuYWx0eT0tMjEuNzE1IE9PVlBlbmFsdHk9LTE2MDAuMDAwIHx8fCAtMTkxMy4zMDcKKzQzIHx8fCB0aGUg4Kaf4Ka+4KaH4Kau4KeNIHRoZSAncyBvZiDgpofgpqjgp43gpqHgpr/gpq/gprzgpr4t4Kak4KeHIHdyaXR0ZW4gaW4gdGhhdCAiIGl0IGlzIGFic3VyZCB0byBjb21wYXJlIGl0IHdpdGggYW55IG90aGVyIGluZGlhbiBjaW5lbWEgLi4uIHBhdGhlciBwYW5jaGFsaSBpcyBwdXJlIGNpbmVtYSAiIC1scmItICIgaXQgb3RoZXIgYnkgaW5kaWFuIGZpbG1zIHdpdGggY29tcGFyZWQgdG8gdW5yZWFsIC4uLiBwYXRoZXIgcGFuY2hhbGkgYXJlIHB1cmUgZmlsbSAnIC1ycmItIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yNy4wMDAgdG1fcHRfNT0tODMuNDYwIHRtX3B0XzY9LTQyLjYwOCB0bV9wdF83PS0yOC4wMDAgdG1fcHRfOD0tNzYuMTA0IHRtX3B0Xzk9LTIuMTY4IHRtX3B0XzEwPS01MS44NzggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEyLjM2NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMzIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD00My4wMDAgbG1fMD0tMTM0LjEyNiBsbV8xPS0xNTkuNzk1IFdvcmRQZW5hbHR5PS0yMS43MTUgT09WUGVuYWx0eT0tMTYwMC4wMDAgfHx8IC0xOTEzLjM3NQorNDQgfHx8IGFmdGVyIDE5NTMgb24gbWF5ICwgbmF6cnVsIGFuZCDgpqrgp43gprDgpq7gp4DgprLgpr4g4Kam4KeH4Kas4KeA4KaV4KeHIOCmmuCmv+CmleCmv+CnjuCmuOCmvuCmsCBmb3IgbG9uZG9uIHNlbnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTIxLjExMSB0bV9wdF82PS0xNy4yNDQgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0xLjQ2NyB0bV9wdF8xMD0tOS42NDggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuMTgzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBsbV8wPS00Ni4wMjQgbG1fMT0tNDguOTE3IFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDAzLjg4MQorNDQgfHx8IGFmdGVyIDE5NTMgb24gbWF5ICwgbmF6cnVsIGFuZCDgpqrgp43gprDgpq7gp4DgprLgpr4g4Kam4KeH4Kas4KeA4KaV4KeHIOCmmuCmv+CmleCmv+CnjuCmuOCmvuCmsCBmb3IgbG9uZG9uIHNlbnQgdG8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTI0LjE0NiB0bV9wdF82PS0xMS40OTkgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0wLjYwMyB0bV9wdF8xMD0tOC4wMzkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMDg0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBsbV8wPS00Ni45ODggbG1fMT0tNTIuMTc4IFdvcmRQZW5hbHR5PS03LjM4MyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDA0LjI3OAorNDQgfHx8IGFmdGVyIG9uIG1heSAsIDE5NTMgbmF6cnVsIGFuZCDgpqrgp43gprDgpq7gp4DgprLgpr4g4Kam4KeH4Kas4KeA4KaV4KeHIOCmmuCmv+CmleCmv+CnjuCmuOCmvuCmsCBmb3IgbG9uZG9uIHNlbnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTIxLjExMSB0bV9wdF82PS0xNy4yNDQgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0xLjQ2NyB0bV9wdF8xMD0tOS40MDcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuMTgzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00NS43NDQgbG1fMT0tNDguOTE3IFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDA0LjQ3MworNDQgfHx8IHRoZXJlYWZ0ZXIgb24gbWF5ICwgMTk1MyBuYXpydWwgYW5kIOCmquCnjeCmsOCmruCngOCmsuCmviDgpqbgp4fgpqzgp4DgppXgp4cg4Kaa4Ka/4KaV4Ka/4KeO4Ka44Ka+4KawIGZvciBsb25kb24gc2VudCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMjAuNTY0IHRtX3B0XzY9LTE5Ljg3MSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuNTUzIHRtX3B0XzEwPS01Ljg1NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi40NzAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTQ1LjkzNyBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDQuNzU2Cis0NCB8fHwgYWZ0ZXIgbmF6cnVsIG9uIG1heSAsIDE5NTMgYW5kIOCmquCnjeCmsOCmruCngOCmsuCmviDgpqbgp4fgpqzgp4DgppXgp4cg4Kaa4Ka/4KaV4Ka/4KeO4Ka44Ka+4KawIGZvciBsb25kb24gc2VudCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMS4xMTEgdG1fcHRfNj0tMTcuMjQ0IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjAxOCB0bV9wdF8xMD0tMy43NTAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuODA3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTQ1LjEzNSBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDQuNzc2Cis0NCB8fHwgb24gbWF5ICwgYWZ0ZXIgMTk1MyBuYXpydWwgYW5kIOCmquCnjeCmsOCmruCngOCmsuCmviDgpqbgp4fgpqzgp4DgppXgp4cg4Kaa4Ka/4KaV4Ka/4KeO4Ka44Ka+4KawIGZvciBsb25kb24gc2VudCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjEuMTExIHRtX3B0XzY9LTE3LjI0NCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuNDE5IHRtX3B0XzEwPS03Ljg2MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS44NDYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTQ1LjY2NCBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDQuNzc4Cis0NCB8fHwgYWZ0ZXIgb24gbWF5ICwgMTk1MyBuYXpydWwgYW5kIOCmquCnjeCmsOCmruCngOCmsuCmviDgpqbgp4fgpqzgp4DgppXgp4cg4Kaa4Ka/4KaV4Ka/4KeO4Ka44Ka+4KawIGZvciBsb25kb24gc2VudCB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMjQuMTQ2IHRtX3B0XzY9LTExLjQ5OSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTAuNjAzIHRtX3B0XzEwPS03Ljc5OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS4wODQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTQ2LjcwOSBsbV8xPS01Mi4xNzggV29yZFBlbmFsdHk9LTcuMzgzIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDQuODcwCis0NCB8fHwgYWZ0ZXIgMTk1MyBvbiBtYXkgLCBuYXpydWwgYW5kIOCmquCnjeCmsOCmruCngOCmsuCmviDgpqbgp4fgpqzgp4DgppXgp4cg4Kaa4Ka/4KaV4Ka/4KeO4Ka44Ka+4KawIHNlbmQgdG8gbG9uZG9uIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMi40MjkgdG1fcHRfNj0tMTQuNzg0IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMC44MzUgdG1fcHRfMTA9LTE2LjY2OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4wODEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTQzLjMyOCBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDUuMDIyCis0NSB8fHwgdGhlIHNvdXRoZXJuIGFuZCB0aGUgYXJlIOCmrOCmv+CmuOCnjeCmpOCngOCmsOCnjeCmoyBsYW5kICwgd2VzdCBhbmQgaW4gYXJlIOCmsOCngeCmleCnjeCmtyBtb3VudGFpbiBhbmQgbW91bnRhaW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zNy44NjUgdG1fcHRfNj0tMTYuMTY1IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44MjIgdG1fcHRfMTA9LTMyLjQ1NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTEuODk3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS00My44ODYgbG1fMT0tNTguNzAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIwLjgxMQorNDUgfHx8IHRoZSBzb3V0aGVybiBhbmQgdGhlIGFyZSDgpqzgpr/gprjgp43gpqTgp4DgprDgp43gpqMgbGFuZCAsIHdlc3QgYW5kIGluIGlzIOCmsOCngeCmleCnjeCmtyBtb3VudGFpbiBhbmQgbW91bnRhaW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zOC44MTUgdG1fcHRfNj0tMTYuMjkxIHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44MjIgdG1fcHRfMTA9LTMzLjE2MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTEuNzMwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS00My43OTYgbG1fMT0tNTguNzAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIxLjA1MAorNDUgfHx8IHRoZSBzb3V0aGVybiBhbmQgdGhlIGlzIOCmrOCmv+CmuOCnjeCmpOCngOCmsOCnjeCmoyBsYW5kICwgd2VzdCBhbmQgaW4gYXJlIOCmsOCngeCmleCnjeCmtyBtb3VudGFpbiBhbmQgbW91bnRhaW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zOC44MTUgdG1fcHRfNj0tMTYuMjkxIHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44MjIgdG1fcHRfMTA9LTMzLjE2MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTEuNzMwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS00My43OTcgbG1fMT0tNTguNzAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIxLjA1MQorNDUgfHx8IHRoZSBzb3V0aCBhbmQgdGhlIGFyZSDgpqzgpr/gprjgp43gpqTgp4DgprDgp43gpqMgbGFuZCAsIHdlc3QgYW5kIGluIGFyZSDgprDgp4HgppXgp43gprcgbW91bnRhaW4gYW5kIG1vdW50YWluIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMzcuNTY5IHRtX3B0XzY9LTE0LjM2MCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTIuODA0IHRtX3B0XzEwPS0zMS40MTMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEwLjI1OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgbG1fMD0tNDQuNzQ4IGxtXzE9LTU4LjcwMCBXb3JkUGVuYWx0eT0tOC4yNTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyMS4xNjEKKzQ1IHx8fCB0aGUgc291dGhlcm4gYW5kIHRoZSBpcyDgpqzgpr/gprjgp43gpqTgp4DgprDgp43gpqMgbGFuZCAsIHdlc3QgYW5kIGluIGlzIOCmsOCngeCmleCnjeCmtyBtb3VudGFpbiBhbmQgbW91bnRhaW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zOS43NjUgdG1fcHRfNj0tMTYuNDE3IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMS44MjIgdG1fcHRfMTA9LTMzLjg2OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTEuNTYzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS00My43MDcgbG1fMT0tNTguNzAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIxLjI4OQorNDUgfHx8IHRoZSBzb3V0aCBhbmQgdGhlIGFyZSDgpqzgpr/gprjgp43gpqTgp4DgprDgp43gpqMgbGFuZCAsIHdlc3QgYW5kIGluIGlzIOCmsOCngeCmleCnjeCmtyBtb3VudGFpbiBhbmQgbW91bnRhaW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zOC41MjAgdG1fcHRfNj0tMTQuNDg2IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMi44MDQgdG1fcHRfMTA9LTMyLjEyMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTAuMDkyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS00NC42NTggbG1fMT0tNTguNzAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIxLjM5OQorNDUgfHx8IHRoZSBzb3V0aCBhbmQgdGhlIGlzIOCmrOCmv+CmuOCnjeCmpOCngOCmsOCnjeCmoyBsYW5kICwgd2VzdCBhbmQgaW4gYXJlIOCmsOCngeCmleCnjeCmtyBtb3VudGFpbiBhbmQgbW91bnRhaW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEzLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zOC41MjAgdG1fcHRfNj0tMTQuNDg2IHRtX3B0Xzc9LTEzLjAwMCB0bV9wdF84PS0zNS4zMzQgdG1fcHRfOT0tMi44MDQgdG1fcHRfMTA9LTMyLjEyMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTAuMDkyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS00NC42NTkgbG1fMT0tNTguNzAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIxLjQwMAorNDUgfHx8IHRoZSBzb3V0aGVybiBhbmQgdGhlIGFyZSDgpqzgpr/gprjgp43gpqTgp4DgprDgp43gpqMgbGFuZCAsIHdlc3QgYW5kIGluIGFyZSDgprDgp4HgppXgp43gprcgaGlsbCBhbmQgbW91bnRhaW4gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEyLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0zOC42ODAgdG1fcHRfNj0tMTcuOTU2IHRtX3B0Xzc9LTEyLjAwMCB0bV9wdF84PS0zMi42MTYgdG1fcHRfOT0tMi40NTQgdG1fcHRfMTA9LTI5Ljc4OSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTEuMTkyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBsbV8wPS00NC4zNDggbG1fMT0tNTguNzAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzIxLjUzOQorNDUgfHx8IHRoZSBzb3V0aCBhbmQgdGhlIGlzIOCmrOCmv+CmuOCnjeCmpOCngOCmsOCnjeCmoyBsYW5kICwgd2VzdCBhbmQgaW4gaXMg4Kaw4KeB4KaV4KeN4Ka3IG1vdW50YWluIGFuZCBtb3VudGFpbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTM5LjQ3MCB0bV9wdF82PS0xNC42MTIgdG1fcHRfNz0tMTMuMDAwIHRtX3B0Xzg9LTM1LjMzNCB0bV9wdF85PS0yLjgwNCB0bV9wdF8xMD0tMzIuODI3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS05LjkyNSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgbG1fMD0tNDQuNTcwIGxtXzE9LTU4LjcwMCBXb3JkUGVuYWx0eT0tOC4yNTIgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMyMS42MzgKKzQ2IHx8fCDgpp/gp43gprDgp4fgpqHgpq7gpr7gprDgp43gppUgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0wLjAwMCB0bV9wdF81PTAuMDAwIHRtX3B0XzY9MC4wMDAgdG1fcHRfNz0wLjAwMCB0bV9wdF84PTAuMDAwIHRtX3B0Xzk9MC4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9MC4wMDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9MC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTcuMzU1IGxtXzE9LTYuNTIyIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTExLjM1OAorNDcgfHx8IOCmsuCmsOCnjeCmoSDgppPgpq/gprzgp4fgprLgp4fgprjgprLgpr/gprAgLWxyYi0g4KaX4Kat4Kaw4KeN4Kao4KawLeCmnOCnh+CmqOCmvuCmsOCnh+CmsiDgp6fgp63gp6/gp60t4Ken4Keu4Kem4KerIC1ycmItIGR1cmluZyBoaXMgY2l0eSBhcmUgdGhlIGdob3RlY2hpbG8gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIzLjA1OCB0bV9wdF82PS0xOS41NTQgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTIuMDAwIHRtX3B0XzEwPS0xMS41NjMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuNDkwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTQyLjk1NyBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC00OTUuNTI4Cis0NyB8fHwg4Kay4Kaw4KeN4KahIOCmk+Cmr+CmvOCnh+CmsuCnh+CmuOCmsuCmv+CmsCAtbHJiLSDgppfgpq3gprDgp43gpqjgprAt4Kac4KeH4Kao4Ka+4Kaw4KeH4KayIOCnp+CnreCnr+CnrS3gp6fgp67gp6bgp6sgLXJyYi0gZHVyaW5nIGhpcyB0aGUgYXJlIHRoZSBnaG90ZWNoaWxvIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0yNi41NDEgdG1fcHRfNj0tMTkuMjM1IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0yLjAwMCB0bV9wdF8xMD0tMTUuMDU2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjExNCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00Mi4zNTAgbG1fMT0tNDIuMzk1IFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNDk2LjQ2MAorNDcgfHx8IOCmsuCmsOCnjeCmoSDgppPgpq/gprzgp4fgprLgp4fgprjgprLgpr/gprAgLWxyYi0g4KaX4Kat4Kaw4KeN4Kao4KawLeCmnOCnh+CmqOCmvuCmsOCnh+CmsiDgp6fgp63gp6/gp60t4Ken4Keu4Kem4KerIC1ycmItIGR1cmluZyBoaXMgY2l0eSBhcmUgaW5jcmVhc2VkIGdob3RlY2hpbG8gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTE4LjEyMCB0bV9wdF82PS0yMC4xMzQgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTIuMDA3IHRtX3B0XzEwPS03LjQ3MyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi42NDMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDQuOTM2IGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ5Ni41ODIKKzQ3IHx8fCDgprLgprDgp43gpqEg4KaT4Kav4Ka84KeH4Kay4KeH4Ka44Kay4Ka/4KawIC1scmItIOCml+CmreCmsOCnjeCmqOCmsC3gppzgp4fgpqjgpr7gprDgp4fgprIg4Ken4Ket4Kev4KetLeCnp+CnruCnpuCnqyAtcnJiLSBkdXJpbmcgaGlzIHRoZSBtZW50aW9uYWJsZSB0aGUgZ2hvdGVjaGlsbyB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMjMuMjMzIHRtX3B0XzY9LTE5LjgxOCB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTExLjcyMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS43MzkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDMuNzQ1IGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ5Ni43NTUKKzQ3IHx8fCDgprLgprDgp43gpqEg4KaT4Kav4Ka84KeH4Kay4KeH4Ka44Kay4Ka/4KawIC1scmItIOCml+CmreCmsOCnjeCmqOCmsC3gppzgp4fgpqjgpr7gprDgp4fgprIg4Ken4Ket4Kev4KetLeCnp+CnruCnpuCnqyAtcnJiLSBkdXJpbmcgaGlzIHRoZSBtZW50aW9uYWJsZSBpbmNyZWFzZWQgZ2hvdGVjaGlsbyB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMTguMjk1IHRtX3B0XzY9LTIwLjM5OCB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMi4wMDcgdG1fcHRfMTA9LTcuNjMwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02Ljg5MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00NS4yMTQgbG1fMT0tNDIuMzk1IFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNDk3LjE3OQorNDcgfHx8IOCmsuCmsOCnjeCmoSDgppPgpq/gprzgp4fgprLgp4fgprjgprLgpr/gprAgLWxyYi0g4KaX4Kat4Kaw4KeN4Kao4KawLeCmnOCnh+CmqOCmvuCmsOCnh+CmsiDgp6fgp63gp6/gp60t4Ken4Keu4Kem4KerIC1ycmItIGR1cmluZyBoaXMgdGhlIGltcG9ydGFudCB0aGUgZ2hvdGVjaGlsbyB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMjQuOTM3IHRtX3B0XzY9LTE5Ljk0MiB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTEzLjc3MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS44NzMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDMuNTMyIGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ5Ny40MzkKKzQ3IHx8fCDgprLgprDgp43gpqEg4KaT4Kav4Ka84KeH4Kay4KeH4Ka44Kay4Ka/4KawIC1scmItIOCml+CmreCmsOCnjeCmqOCmsC3gppzgp4fgpqjgpr7gprDgp4fgprIg4Ken4Ket4Kev4KetLeCnp+CnruCnpuCnqyAtcnJiLSBkdXJpbmcgaGlzIHRoZSBhcmUgaW5jcmVhc2VkIGdob3RlY2hpbG8gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIxLjYwMyB0bV9wdF82PS0xOS44MTUgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTIuMDA3IHRtX3B0XzEwPS0xMC45NjcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuMjY3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS04LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTQ0LjMyOCBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC00OTcuNTE0Cis0NyB8fHwg4Kay4Kaw4KeN4KahIOCmk+Cmr+CmvOCnh+CmsuCnh+CmuOCmsuCmv+CmsCAtbHJiLSDgppfgpq3gprDgp43gpqjgprAt4Kac4KeH4Kao4Ka+4Kaw4KeH4KayIOCnp+CnreCnr+CnrS3gp6fgp67gp6bgp6sgLXJyYi0gZHVyaW5nIGhpcyB0aGUgbm90YWJsZSB0aGUgZ2hvdGVjaGlsbyB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMjMuMzIxIHRtX3B0XzY9LTIwLjM2MCB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTExLjc4NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi4yMDkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTguMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDQuMTA0IGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTQ5Ny41ODQKKzQ4IHx8fCBtYW55IGltcG9ydGFudCBhbmQgcmVhbCB0byBzb2x2ZSBwcm9ibGVtcyBjb21wbGV4IG51bWJlciBhcGFyaWhhcnphIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0xOC45MDUgdG1fcHRfNj0tMTEuNjMwIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tOC45NTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuNTI3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTI2LjkzNiBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03MS4xMjEKKzQ4IHx8fCBtYW55IGltcG9ydGFudCBhbmQgcmVhbCBwcm9ibGVtIHRvIHNvbHZlIGNvbXBsZXggbnVtYmVyIGFwYXJpaGFyemEgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE4Ljc2NCB0bV9wdF82PS0xMS4zNjcgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTMuMDAwIHRtX3B0XzEwPS0xMC4zNDggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuNTY1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTI3LjE4OSBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03MS4yNDUKKzQ4IHx8fCBtYW55IGltcG9ydGFudCBhbmQgcmVhbCBwcm9ibGVtIHRvIGZvciBjb21wbGV4IG51bWJlciBhcGFyaWhhcnphIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0xOC4wMDEgdG1fcHRfNj0tNy43NjUgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0xNC40NTMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuOTEyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTI4LjIyOSBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03MS42NTkKKzQ4IHx8fCBtYW55IGltcG9ydGFudCBhbmQgcmVhbCB0byBzb2x2ZSBwcm9ibGVtcyBjb21wbGV4IG51bWJlciBpbmV2aXRhYmxlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0yMC4yOTIgdG1fcHRfNj0tMTEuNjMwIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tOC45NTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuNTI3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTI3LjE1OCBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03MS42NjEKKzQ4IHx8fCBtYW55IGltcG9ydGFudCBhbmQgcmVhbCB0byBzb2x2ZSBwcm9ibGVtcyBjb21wbGV4IG51bWJlcnMgYXBhcmloYXJ6YSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMTguNjczIHRtX3B0XzY9LTEyLjMzMiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTguNDI0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjgzNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yNy4yODQgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNzEuNzE3Cis0OCB8fHwgbWFueSBpbXBvcnRhbnQgYW5kIHJlYWwgcHJvYmxlbSB0byBzb2x2ZSBjb21wbGV4IG51bWJlciBpbmV2aXRhYmxlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMC4xNTAgdG1fcHRfNj0tMTEuMzY3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0zLjAwMCB0bV9wdF8xMD0tMTAuMzQ4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjU2NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0yNy40MTEgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNzEuNzg0Cis0OCB8fHwgbWFueSBpbXBvcnRhbnQgYW5kIHJlYWwgcHJvYmxlbSB0byBzb2x2ZSBjb21wbGV4IG51bWJlcnMgYXBhcmloYXJ6YSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMTguNTMxIHRtX3B0XzY9LTEyLjA3MCB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMy4wMDAgdG1fcHRfMTA9LTkuODEzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00Ljg3MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0yNy41MzYgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNzEuODQxCis0OCB8fHwgbWFueSBpbXBvcnRhbnQgYW5kIHJlYWwgcHJvYmxlbSB0byBmb3IgY29tcGxleCBudW1iZXIgaW5ldml0YWJsZSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMTkuMzg3IHRtX3B0XzY9LTcuNzY1IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tMTQuNDUzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjkxMiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS0yOC40NTEgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNzIuMTk5Cis0OCB8fHwgbWFueSBpbXBvcnRhbnQgYW5kIHJlYWwgdG8gc29sdmUgcHJvYmxlbXMgY29tcGxleCBudW1iZXJzIGluZXZpdGFibGUgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIwLjA1OSB0bV9wdF82PS0xMi4zMzIgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS04LjQyNCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC44MzYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjcuNTA1IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTcyLjI1NworNDggfHx8IG1hbnkgaW1wb3J0YW50IGFuZCByZWFsIHByb2JsZW0gdG8gc29sdmUgY29tcGxleCBudW1iZXJzIGluZXZpdGFibGUgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE5LjkxNyB0bV9wdF82PS0xMi4wNzAgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTMuMDAwIHRtX3B0XzEwPS05LjgxMyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC44NzMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMjcuNzU4IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTcyLjM4MAorNDkgfHx8IGJpZyBiYW5nIGlzIGEgZmFtb3VzIHJlc3VsdCBpbiB0aGUgc3RhdGUgc28gYW5kIHJlY2VudCBzaXR1YXRpb24gZnJvbSB0aGUgc2VwYXJhdGUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE1LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS00OS43MjggdG1fcHRfNj0tMjQuMjUzIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tMi4yMjEgdG1fcHRfMTA9LTM5Ljc2NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTQuOTQ1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBsbV8wPS0zNi43MjEgbG1fMT0tNTguNzAwIFdvcmRQZW5hbHR5PS04LjI1MiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTIyLjk3MAorNDkgfHx8IGJpZyBiYW5nIGlzIGEgZmFtb3VzIHJlc3VsdCBpbiB0aGUgc3RhdGUgc28gYW5kIHJlY2VudCBzaXR1YXRpb24gZnJvbSB0aGUgdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTYuNDg3IHRtX3B0XzY9LTI0LjU0MSB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTIuMjI1IHRtX3B0XzEwPS00NS40NzAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTE1LjA5OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTcuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tMzQuNzYxIGxtXzE9LTU4LjcwMCBXb3JkUGVuYWx0eT0tOC4yNTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTEyMy40NzMKKzQ5IHx8fCBiaWcgYmFuZyBpcyBhIGZhbW91cyByZXN1bHQgaW4gdGhlIHN0YXRlIHNvIGFuZCByZWNlbnQgc2l0dWF0aW9uIGZyb20gdGhlIGRpZmZlcmVudCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTUyLjkwMSB0bV9wdF82PS0yNC44MjggdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0yLjU4NiB0bV9wdF8xMD0tNDMuOTk4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xNi4xOTggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE3LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIGxtXzA9LTM1LjAzNCBsbV8xPS01OC43MDAgV29yZFBlbmFsdHk9LTguMjUyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xMjMuNTI3Cis0OSB8fHwgYmlnIGJhbmcgaXMgYSBmYW1vdXMgcmVzdWx0IGluIHRoZSBzdGF0ZSBzbyBhbmQgcmVjZW50IHN0YXRlIGZyb20gdGhlIHNlcGFyYXRlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNDkuODU5IHRtX3B0XzY9LTIzLjA2MyB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTEuODYwIHRtX3B0XzEwPS00MC4wMTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEzLjg0NiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTcuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tMzguMjQyIGxtXzE9LTU4LjcwMCBXb3JkUGVuYWx0eT0tOC4yNTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTEyMy44NDkKKzQ5IHx8fCBiaWcgYmFuZyBpcyBhIGZhbW91cyByZXN1bHQgaW4gdGhlIHN0YXRlIHNvIGFuZCByZWNlbnQgc3RhdGUgZnJvbSB0aGUgdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTYuNjE4IHRtX3B0XzY9LTIzLjM1MSB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTEuODY0IHRtX3B0XzEwPS00NS43MTMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTE0LjAwMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTcuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tMzYuMjgyIGxtXzE9LTU4LjcwMCBXb3JkUGVuYWx0eT0tOC4yNTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTEyNC4zNTIKKzQ5IHx8fCB0aGUgYmlnIGJhbmcgaXMgYSBmYW1vdXMgcmVzdWx0IGluIHRoZSBzdGF0ZSBzbyBhbmQgcmVjZW50IHNpdHVhdGlvbiBmcm9tIHRoZSBzZXBhcmF0ZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTU0Ljg2OCB0bV9wdF82PS0yNC4zOTAgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0yLjIxNiB0bV9wdF8xMD0tMzkuOTA2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xNC43OTEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE4LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIGxtXzA9LTM1LjM0MSBsbV8xPS02MS45NjEgV29yZFBlbmFsdHk9LTguNjg2IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xMjQuMzczCis0OSB8fHwgYmlnIGJhbmcgaXMgYSBmYW1vdXMgcmVzdWx0IGluIHRoZSBzdGF0ZSBzbyBhbmQgcmVjZW50IHN0YXRlIGZyb20gdGhlIGRpZmZlcmVudCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTUzLjAzMiB0bV9wdF82PS0yMy42MzkgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS0yLjIyNSB0bV9wdF8xMD0tNDQuMjQyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xNS4wOTkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE3LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIGxtXzA9LTM2LjU1NSBsbV8xPS01OC43MDAgV29yZFBlbmFsdHk9LTguMjUyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xMjQuNDA2Cis1MCB8fHwgd2luZG93cyDgpq7gpr/gprLgpr/gpqjgpr/gpq/gprzgpr7gpq4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTAuMjMxIHRtX3B0XzY9LTAuMDYwIHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0wLjAyNSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0wLjAwMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTkuOTc2IGxtXzE9LTkuNzgzIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTE2Ljk2NAorNTAgfHx8IOCmieCmh+CmqOCnjeCmoeCni+CmnCDgpq7gpr/gprLgpr/gpqjgpr/gpq/gprzgpr7gpq4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0wLjAwMCB0bV9wdF81PTAuMDAwIHRtX3B0XzY9MC4wMDAgdG1fcHRfNz0wLjAwMCB0bV9wdF84PTAuMDAwIHRtX3B0Xzk9MC4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9MC4wMDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9MC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTEyLjUyOCBsbV8xPS05Ljc4MyBXb3JkUGVuYWx0eT0tMS43MzcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTIxOS4xODkKKzUxIHx8fCByYWJpbmRyYW5hdGggLCBtYW55IOCmtuCniOCmsuCngCDgpobgpq/gprzgpqTgp43gpqTgp43gpqwgd2FzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE3LjE1MyB0bV9wdF82PS03LjQ1OCB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMS4wMTkgdG1fcHRfMTA9LTE3LjQxNyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS4zODEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yMS4wNzUgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjU0LjMxNAorNTEgfHx8IHJhYmluZHJhbmF0aCAsIG1vcmUg4Ka24KeI4Kay4KeAIOCmhuCmr+CmvOCmpOCnjeCmpOCnjeCmrCB3YXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTYuMTc4IHRtX3B0XzY9LTYuNTQxIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0xLjAxOCB0bV9wdF8xMD0tMTYuMjAzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjA5MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTIxLjkwOSBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTQuNDI5Cis1MSB8fHwgcmFiaW5kcmFuYXRoICwgbWFueSDgprbgp4jgprLgp4Ag4KaG4Kav4Ka84Kak4KeN4Kak4KeN4KasIGEgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTcuMTY4IHRtX3B0XzY9LTcuMjE3IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0xLjEzNiB0bV9wdF8xMD0tMTguNTA2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01Ljg5MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTIxLjEwMSBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTQuODI1Cis1MSB8fHwgcmFiaW5kcmFuYXRoIGFsdGhvdWdoIG1hbnkg4Ka24KeI4Kay4KeAIOCmhuCmr+CmvOCmpOCnjeCmpOCnjeCmrCB3YXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTIuMjI4IHRtX3B0XzY9LTkuMTA2IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0wLjE1NCB0bV9wdF8xMD0tMTAuNjI5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjI4MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTI0LjEzMSBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTQuODU4Cis1MSB8fHwgcmFiaW5kcmFuYXRoIHRob3VnaCBtb3JlIOCmtuCniOCmsuCngCDgpobgpq/gprzgpqTgp43gpqTgp43gpqwgd2FzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEyLjQ1NyB0bV9wdF82PS03LjMxNSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4xNTQgdG1fcHRfMTA9LTExLjIxMyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy45OTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yNC42MTAgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjU0LjkzMgorNTEgfHx8IHJhYmluZHJhbmF0aCAsIG1hbnkg4Ka24KeI4Kay4KeAIOCmhuCmr+CmvOCmpOCnjeCmpOCnjeCmrCBieSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xNy4zMzcgdG1fcHRfNj0tOC4yNDYgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTEuMDUwIHRtX3B0XzEwPS0xNS41OTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuOTk4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgbG1fMD0tMjEuMDI3IGxtXzE9LTI2LjA4OSBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI1NC45NDAKKzUxIHx8fCByYWJpbmRyYW5hdGggLCBtb3JlIOCmtuCniOCmsuCngCDgpobgpq/gprzgpqTgp43gpqTgp43gpqwgYSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNi4xOTQgdG1fcHRfNj0tNi4zMDAgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTEuMTM1IHRtX3B0XzEwPS0xNy4yOTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuNjA0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjEuOTM1IGxtXzE9LTI2LjA4OSBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI1NC45NDAKKzUxIHx8fCByYWJpbmRyYW5hdGggdGhvdWdoIG1hbnkg4Ka24KeI4Kay4KeAIOCmhuCmr+CmvOCmpOCnjeCmpOCnjeCmrCB3YXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTMuNDMyIHRtX3B0XzY9LTguMjMxIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0wLjE1NCB0bV9wdF8xMD0tMTIuNDI4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjI4MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTIzLjkwMyBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTQuOTc0Cis1MSB8fHwgcmFiaW5kcmFuYXRoICwgbW9yZSDgprbgp4jgprLgp4Ag4KaG4Kav4Ka84Kak4KeN4Kak4KeN4KasIGJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE2LjM2MyB0bV9wdF82PS03LjMzMCB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMS4wNTAgdG1fcHRfMTA9LTE0LjM3NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC43MTAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD02LjAwMCBsbV8wPS0yMS44NjEgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjU1LjA1NQorNTIgfHx8IGxhYm91ciBlY29ub21pY3MgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTEuMjc0IHRtX3B0XzY9LTIuMDEzIHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMDA3IHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0wLjc3MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTUuMzg5IGxtXzE9LTkuNzgzIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTMuMDk5Cis1MiB8fHwgbGFib3IgZWNvbm9teSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMS40NTIgdG1fcHRfNj0tMi4zOTQgdG1fcHRfNz0tMS4wMDAgdG1fcHRfOD0tMi43MTggdG1fcHRfOT0tMC4wNTAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuMTc5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tNS4zMDkgbG1fMT0tOS43ODMgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xMy4zNDMKKzUyIHx8fCBsYWJvciBlY29ub21pY3MgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTEuMjMxIHRtX3B0XzY9LTEuNjgyIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0wLjM4OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMS4xNTggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS03LjI0NiBsbV8xPS05Ljc4MyBXb3JkUGVuYWx0eT0tMS43MzcgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTE1LjY5OAorNTIgfHx8IGxhYm91ciBlY29ub215IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0xLjQ5NiB0bV9wdF82PS0yLjcyNSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMC42NzMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuMzY4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tNi45OTQgbG1fMT0tOS43ODMgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xNi4yOTQKKzUyIHx8fCB0aGUgZWNvbm9taWNzIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS04LjAxMyB0bV9wdF82PS0yLjYzNyB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjA1MCB0bV9wdF8xMD0tNi45NDcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuODYzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tNS40ODcgbG1fMT0tOS43ODMgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xNy40OTAKKzUyIHx8fCB0aGUgZWNvbm9teSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tOC4yMzUgdG1fcHRfNj0tMy4zNDkgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4wNTAgdG1fcHRfMTA9LTcuMTE3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjYyMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTUuMzcyIGxtXzE9LTkuNzgzIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTcuOTQ1Cis1MyB8fHwgYnJpdGFpbiBhdCB0aGUgbWFpbiBhbmQgaGlzIGVjb25vbWljIHBvd2VyIHdhcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMS42MDEgdG1fcHRfNj0tOC4zOTEgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTEuNzM4IHRtX3B0XzEwPS0xOC42ODkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuMzg5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTIzLjM1NSBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC02OC45NTUKKzUzIHx8fCBicml0YWluIGF0IHRoZSBtYWluIGFuZCB3aG8gd2FzIGVjb25vbWljYWwgcG93ZXIgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjEuMTEwIHRtX3B0XzY9LTkuOTU5IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjEwNiB0bV9wdF8xMD0tMTkuMTc2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjI0OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD02LjAwMCBsbV8wPS0yMi40MDQgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNjkuMzcyCis1MyB8fHwgYnJpdGFpbiBhdCB0aGUgbWFpbiBhbmQgaGlzIGVjb25vbWljIHBvd2VycyB3YXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjEuNzY5IHRtX3B0XzY9LTEwLjA1NCB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMS43MzggdG1fcHRfMTA9LTE4LjI4NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi4zODkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMjMuMzg3IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTY5LjQ4OQorNTMgfHx8IGJyaXRhaW4gYXQgdGhlIG1haW4gYW5kIHdobyB3YXMgZWNvbm9taWMgcG93ZXIgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjEuMTI5IHRtX3B0XzY9LTkuMDg0IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjEwNiB0bV9wdF8xMD0tMTkuNTgxIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjI0OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD02LjAwMCBsbV8wPS0yMi43MjEgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNjkuNTc1Cis1MyB8fHwgYnJpdGFpbiBhdCB0aGUgbWFpbiBhbmQgaGlzIGVjb25vbWljYWwgcG93ZXIgd2FzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIxLjU4MiB0bV9wdF82PS05LjI2NSB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMS43MzggdG1fcHRfMTA9LTE4LjI4NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi4zODkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMjMuNzc0IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTY5LjY2MworNTMgfHx8IGJyaXRhaW4gYXQgdGhlIG1haW4gZWNvbm9taWMgcG93ZXIgYW5kIHdobyB3YXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjEuMTI5IHRtX3B0XzY9LTkuMDg0IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0yLjM3MCB0bV9wdF8xMD0tMTYuMjE3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjEwNSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yMS42ODggbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNjkuNzQ0Cis1MyB8fHwgYnJpdGFpbiBhdCB0aGUgbWFpbiBhbmQgd2hvIHdhcyBlY29ub21pYyBwb3dlcnMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjEuMjk3IHRtX3B0XzY9LTEwLjc0NyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4xMDYgdG1fcHRfMTA9LTE5LjE3NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi4yNDkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgbG1fMD0tMjIuNTY5IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTY5Ljg4MQorNTMgfHx8IGJyaXRhaW4gYXQgdGhlIG1haW4gYW5kIGhpcyB3YXMgZWNvbm9taWNhbCBwb3dlciAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMS41ODIgdG1fcHRfNj0tOS4yNjUgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMTA2IHRtX3B0XzEwPS0yMS4zOTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuMjQ5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTIyLjYxMSBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03MC4wNTYKKzUzIHx8fCBicml0YWluIGF0IHRoZSBtYWluIGFuZCBoaXMgd2FzIGVjb25vbWljIHBvd2VyIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTIxLjYwMSB0bV9wdF82PS04LjM5MSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4xMDYgdG1fcHRfMTA9LTIxLjc5NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi4yNDkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgbG1fMD0tMjIuOTI5IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTcwLjI1OQorNTQgfHx8IG1vdmVtZW50IGFnYWluc3QgdGhlIG1pbGl0YXJ5IHJ1bGUgYW5kIHBha2lzdGFuIOCml+Cni+Cmt+CnjeCmoOCngOCml+CmpCB3YXMgYWdhaW5zdCBwcm90ZXN0IGFuZCBiZW5nYWxpcyBpbmRlcGVuZGVuY2UgbW92ZW1lbnQgLCDgpqfgpr7gpqzgpr/gpqQgdG8gZm9yIGhlIHdpZGVseSBwcmFpc2VkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNDguOTk0IHRtX3B0XzY9LTIyLjkwMyB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTUuMTI0IHRtX3B0XzEwPS0zMC4zNzcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguNjY0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBsbV8wPS02Mi45MTggbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2NS4zNDYKKzU0IHx8fCB0aGUgbWlsaXRhcnkgcnVsZSBtb3ZlbWVudCBhZ2FpbnN0IGFuZCBwYWtpc3RhbiDgppfgp4vgprfgp43gpqDgp4DgppfgpqQgd2FzIGFnYWluc3QgcHJvdGVzdCBhbmQgYmVuZ2FsaXMgaW5kZXBlbmRlbmNlIG1vdmVtZW50ICwg4Kan4Ka+4Kas4Ka/4KakIHRvIGZvciBoZSB3aWRlbHkgcHJhaXNlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTYuMDAwIHRtX3B0XzU9LTQ4Ljk5NCB0bV9wdF82PS0yMi45MDMgdG1fcHRfNz0tMTguMDAwIHRtX3B0Xzg9LTQ4LjkyNCB0bV9wdF85PS01LjA3NSB0bV9wdF8xMD0tMzEuMjE1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04Ljk1MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgbG1fMD0tNjQuMjk0IGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjUuMzYzCis1NCB8fHwgbW92ZW1lbnQgYWdhaW5zdCB0aGUgbWlsaXRhcnkgcnVsZSBhbmQgdGhlIOCml+Cni+Cmt+CnjeCmoOCngOCml+CmpCB3YXMgYWdhaW5zdCBwcm90ZXN0IGFuZCBiZW5nYWxpcyBpbmRlcGVuZGVuY2UgbW92ZW1lbnQgLCDgpqfgpr7gpqzgpr/gpqQgdG8gZm9yIGhlIHdpZGVseSBwcmFpc2VkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNTMuNjE1IHRtX3B0XzY9LTIzLjY2NyB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTUuMTI0IHRtX3B0XzEwPS0zNC4yOTYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEwLjI2MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgbG1fMD0tNjAuODMxIGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjUuNDkwCis1NCB8fHwgdGhlIG1pbGl0YXJ5IHJ1bGUgbW92ZW1lbnQgYWdhaW5zdCBhbmQgdGhlIOCml+Cni+Cmt+CnjeCmoOCngOCml+CmpCB3YXMgYWdhaW5zdCBwcm90ZXN0IGFuZCBiZW5nYWxpcyBpbmRlcGVuZGVuY2UgbW92ZW1lbnQgLCDgpqfgpr7gpqzgpr/gpqQgdG8gZm9yIGhlIHdpZGVseSBwcmFpc2VkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xNi4wMDAgdG1fcHRfNT0tNTMuNjE1IHRtX3B0XzY9LTIzLjY2NyB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTUuMDc1IHRtX3B0XzEwPS0zNS4xMzQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEwLjU0OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgbG1fMD0tNjIuMjA3IGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjUuNTA3Cis1NCB8fHwgbW92ZW1lbnQgYWdhaW5zdCB0aGUgbWlsaXRhcnkgcnVsZSBhbmQgcGFraXN0YW4g4KaX4KeL4Ka34KeN4Kag4KeA4KaX4KakIHdhcyBhZ2FpbnN0IHByb3Rlc3QgYW5kIGJlbmdhbGlzIGluZGVwZW5kZW5jZSBtb3ZlbWVudCBvbiDgpqfgpr7gpqzgpr/gpqQgdG8gZm9yIGhlIHdpZGVseSBwcmFpc2VkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNDYuNzMwIHRtX3B0XzY9LTIzLjE1NSB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTUuMjQxIHRtX3B0XzEwPS0yNy44MzcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuMTc1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBsbV8wPS02My43OTAgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2NS42OTcKKzU0IHx8fCB0aGUgbWlsaXRhcnkgcnVsZSBtb3ZlbWVudCBhZ2FpbnN0IGFuZCBwYWtpc3RhbiDgppfgp4vgprfgp43gpqDgp4DgppfgpqQgd2FzIGFnYWluc3QgcHJvdGVzdCBhbmQgYmVuZ2FsaXMgaW5kZXBlbmRlbmNlIG1vdmVtZW50IG9uIOCmp+CmvuCmrOCmv+CmpCB0byBmb3IgaGUgd2lkZWx5IHByYWlzZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE2LjAwMCB0bV9wdF81PS00Ni43MzAgdG1fcHRfNj0tMjMuMTU1IHRtX3B0Xzc9LTE4LjAwMCB0bV9wdF84PS00OC45MjQgdG1fcHRfOT0tNS4xOTIgdG1fcHRfMTA9LTI4LjY3NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOS40NjMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTguMDAwIGxtXzA9LTY1LjE2NyBsbV8xPS03OC4yNjcgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzY1LjcxNAorNTQgfHx8IG1vdmVtZW50IGFnYWluc3QgdGhlIG1pbGl0YXJ5IHJ1bGUgYW5kIHRoZSDgppfgp4vgprfgp43gpqDgp4DgppfgpqQgd2FzIGFnYWluc3QgcHJvdGVzdCBhbmQgYmVuZ2FsaXMgaW5kZXBlbmRlbmNlIG1vdmVtZW50IG9uIOCmp+CmvuCmrOCmv+CmpCB0byBmb3IgaGUgd2lkZWx5IHByYWlzZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS01MS4zNTEgdG1fcHRfNj0tMjMuOTE4IHRtX3B0Xzc9LTE4LjAwMCB0bV9wdF84PS00OC45MjQgdG1fcHRfOT0tNS4yNDEgdG1fcHRfMTA9LTMxLjc1NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTAuNzcxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBsbV8wPS02MS43MDMgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2NS44NDEKKzU0IHx8fCBtb3ZlbWVudCBhZ2FpbnN0IHRoZSBtaWxpdGFyeSBydWxlIGFuZCBwYWtpc3RhbiDgppfgp4vgprfgp43gpqDgp4DgppfgpqQgd2FzIHByb3Rlc3QgYWdhaW5zdCBhbmQgYmVuZ2FsaXMgaW5kZXBlbmRlbmNlIG1vdmVtZW50ICwg4Kan4Ka+4Kas4Ka/4KakIHRvIGZvciBoZSB3aWRlbHkgcHJhaXNlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTQ4Ljk5NCB0bV9wdF82PS0yMi45MDMgdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS01LjEyNCB0bV9wdF8xMD0tMzIuMDMxIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS05LjgwNSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgbG1fMD0tNjEuNzI1IGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zNjUuODU4Cis1NCB8fHwgbW92ZW1lbnQgYWdhaW5zdCB0aGUgbWlsaXRhcnkgcnVsZSBhbmQgcGFraXN0YW4g4KaX4KeL4Ka34KeN4Kag4KeA4KaX4KakIHdhcyBhZ2FpbnN0IHByb3Rlc3QgYW5kIGJlbmdhbGlzIGluZGVwZW5kZW5jZSBtb3ZlbWVudCAsIOCmp+CmvuCmrOCmv+CmpCBmb3IgdGhlIGhlIHdpZGVseSBwcmFpc2VkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xNC4wMDAgdG1fcHRfNT0tNTEuMTMwIHRtX3B0XzY9LTIzLjU3NSB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTUuMTI0IHRtX3B0XzEwPS0zMi43MDMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuNTQ4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBsbV8wPS02MS4zMDQgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTM2NS44NjgKKzU0IHx8fCB0aGUgbWlsaXRhcnkgcnVsZSBtb3ZlbWVudCBhZ2FpbnN0IGFuZCBwYWtpc3RhbiDgppfgp4vgprfgp43gpqDgp4DgppfgpqQgd2FzIHByb3Rlc3QgYWdhaW5zdCBhbmQgYmVuZ2FsaXMgaW5kZXBlbmRlbmNlIG1vdmVtZW50ICwg4Kan4Ka+4Kas4Ka/4KakIHRvIGZvciBoZSB3aWRlbHkgcHJhaXNlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTYuMDAwIHRtX3B0XzU9LTQ4Ljk5NCB0bV9wdF82PS0yMi45MDMgdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS01LjA3NSB0bV9wdF8xMD0tMzIuODY5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMC4wOTIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTguMDAwIGxtXzA9LTYzLjEwMSBsbV8xPS03OC4yNjcgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzY1Ljg3NQorNTUgfHx8IGhlcmUgaXMgbWVudGlvbmVkIHRoYXQgd2VyZSBpbnRlcm5ldCBhbmQgd29ybGQgd2lkZSB3ZWIgb3RoZXIgbmFtZSB3b3JkIHRvIGJlIGJ1dCBhY3R1YWxseSDgprbgpqzgp43gpqbgpqbgp43gpqzgpq/gprwgZGlmZmVyZW50IHN1YmplY3QgdG8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS03NS40NjIgdG1fcHRfNj0tMzYuMTMyIHRtX3B0Xzc9LTE4LjAwMCB0bV9wdF84PS00OC45MjQgdG1fcHRfOT0tNi40MzEgdG1fcHRfMTA9LTUwLjAyNCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOS40NjggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBsbV8wPS01NS4zNjYgbG1fMT0tNzUuMDA2IFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI3MC4xNjIKKzU1IHx8fCBoZXJlIGlzIG1lbnRpb25lZCB0aGF0IHdlcmUgaW50ZXJuZXQgYW5kIHdvcmxkIHdpZGUgd2ViIG90aGVyIG5hbWUgdG8gYmUgd29yZCBidXQgYWN0dWFsbHkg4Ka24Kas4KeN4Kam4Kam4KeN4Kas4Kav4Ka8IGRpZmZlcmVudCBzdWJqZWN0IHRvIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xNC4wMDAgdG1fcHRfNT0tNzUuNDYyIHRtX3B0XzY9LTM2LjEzMiB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTYuNDMxIHRtX3B0XzEwPS00OC41NTggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuNDY4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgbG1fMD0tNTUuNDkyIGxtXzE9LTc1LjAwNiBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNzAuOTAyCis1NSB8fHwgaGVyZSBpcyBtZW50aW9uZWQgdGhhdCB3ZXJlIGludGVybmV0IGFuZCB3b3JsZCB3aWRlIHdlYiBvdGhlciBuYW1lIHdvcmQgdG8gYmUgdGhvdWdoIGFjdHVhbGx5IOCmtuCmrOCnjeCmpuCmpuCnjeCmrOCmr+CmvCBkaWZmZXJlbnQgc3ViamVjdCB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTc0LjI1NSB0bV9wdF82PS0zNS44NDQgdG1fcHRfNz0tMTguMDAwIHRtX3B0Xzg9LTQ4LjkyNCB0bV9wdF85PS02LjMxNCB0bV9wdF8xMD0tNDguMDU3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04Ljk1NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIGxtXzA9LTU2LjkxOSBsbV8xPS03NS4wMDYgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjcwLjk2OAorNTUgfHx8IGhlcmUgaXMgbWVudGlvbmVkIHRoYXQgd2VyZSBpbnRlcm5ldCBhbmQgb3RoZXIgbmFtZSBvZiB3b3JsZCB3aWRlIHdlYiB3b3JkIHRvIGJlIGJ1dCBhY3R1YWxseSDgprbgpqzgp43gpqbgpqbgp43gpqzgpq/gprwgZGlmZmVyZW50IHN1YmplY3QgdG8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE0LjAwMCB0bV9wdF81PS03Ni4wODQgdG1fcHRfNj0tMzYuMTMyIHRtX3B0Xzc9LTE4LjAwMCB0bV9wdF84PS00OC45MjQgdG1fcHRfOT0tNi40MzEgdG1fcHRfMTA9LTQ4LjYzOCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOS40NjggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIyLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9LTEuMDAwIHRtX2dsdWVfMD0xNS4wMDAgbG1fMD0tNTMuNTY2IGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNzAuOTk1Cis1NSB8fHwgaGVyZSBpcyBtZW50aW9uZWQgdGhhdCB3ZXJlIGludGVybmV0IGFuZCB3b3JsZCB3aWRlIHdlYiBvdGhlciBuYW1lIHdvcmQgdG8gYmUgYnV0IGFjdHVhbGx5IOCmtuCmrOCnjeCmpuCmpuCnjeCmrOCmr+CmvCBkaWZmZXJlbnQgc3ViamVjdCBhIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNzUuMTAyIHRtX3B0XzY9LTM1Ljk5OCB0bV9wdF83PS0xOC4wMDAgdG1fcHRfOD0tNDguOTI0IHRtX3B0Xzk9LTYuNjY0IHRtX3B0XzEwPS01MC43ODUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuODczIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgbG1fMD0tNTUuODczIGxtXzE9LTc1LjAwNiBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNzEuMjA3Cis1NSB8fHwgaGVyZSBpcyBtZW50aW9uZWQgdGhhdCB3ZXJlIGludGVybmV0IGFuZCB3b3JsZCB3aWRlIHdlYiBvdGhlciBuYW1lIHdvcmQgdG8gYmUgYnV0IGFjdHVhbGx5IOCmtuCmrOCnjeCmpuCmpuCnjeCmrOCmr+CmvCBkaWZmZXJlbnQgc3ViamVjdCBpbmRpY2F0ZXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS03MC4wMDggdG1fcHRfNj0tMzYuMjg2IHRtX3B0Xzc9LTE4LjAwMCB0bV9wdF84PS00OC45MjQgdG1fcHRfOT0tNi42NjQgdG1fcHRfMTA9LTQ0LjUzMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOS44NzMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIxLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBsbV8wPS01Ny45NzIgbG1fMT0tNzUuMDA2IFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTI3MS4zMDQKKzU1IHx8fCBoZXJlIGlzIG1lbnRpb25lZCB0aGF0IHdlcmUgaW50ZXJuZXQgYW5kIHdvcmxkIHdpZGUgd2ViIG90aGVyIG5hbWUgd29yZCB0byBiZSBidXQgYWN0dWFsbHkg4Ka24Kas4KeN4Kam4Kam4KeN4Kas4Kav4Ka8IGRpZmZlcmVudCBzdWJqZWN0IHRvIHRoZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTcuMDAwIHRtX3B0XzU9LTc4LjY3MCB0bV9wdF82PS0zNC4zNDYgdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS02LjQzMSB0bV9wdF8xMD0tNDYuMTUxIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS05LjY0MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgbG1fMD0tNTYuNTM1IGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNzEuNDQ0Cis1NSB8fHwgaGVyZSBpcyBtZW50aW9uZWQgdGhhdCB3ZXJlIGludGVybmV0IGFuZCB3b3JsZCB3aWRlIHdlYiBvdGhlciBuYW1lIHdvcmQgdG8gYmUgYnV0IGFjdHVhbGx5IOCmtuCmrOCnjeCmpuCmpuCnjeCmrOCmr+CmvCBkaWZmZXJlbnQgc3ViamVjdHMgdG8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE0LjAwMCB0bV9wdF81PS03NS4wMDIgdG1fcHRfNj0tMzcuODM3IHRtX3B0Xzc9LTE4LjAwMCB0bV9wdF84PS00OC45MjQgdG1fcHRfOT0tNi40MzIgdG1fcHRfMTA9LTQ3LjMyMiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTAuNDMyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgbG1fMD0tNTUuNTU0IGxtXzE9LTc1LjAwNiBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0yNzEuNDk0Cis1NSB8fHwgaGVyZSBpcyBtZW50aW9uZWQgdGhhdCBtYW55IGludGVybmV0IGFuZCB3b3JsZCB3aWRlIHdlYiBvdGhlciBuYW1lIHdvcmQgdG8gYmUgYnV0IGFjdHVhbGx5IOCmtuCmrOCnjeCmpuCmpuCnjeCmrOCmr+CmvCBkaWZmZXJlbnQgc3ViamVjdCB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTc0Ljk3MSB0bV9wdF82PS0zNi4xMzIgdG1fcHRfNz0tMTguMDAwIHRtX3B0Xzg9LTQ4LjkyNCB0bV9wdF85PS02LjQzMSB0bV9wdF8xMD0tNTEuMTE0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS05LjQ2OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIGxtXzA9LTU2LjMwNSBsbV8xPS03NS4wMDYgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjcxLjUxMgorNTUgfHx8IGhlcmUgaXMgbWVudGlvbmVkIHRoYXQgd2VyZSBpbnRlcm5ldCBhbmQgd29ybGQgd2lkZSB3ZWIgb3RoZXIgbmFtZSB3b3JkIHRvIGJlIHRob3VnaCBhY3R1YWxseSDgprbgpqzgp43gpqbgpqbgp43gpqzgpq/gprwgZGlmZmVyZW50IHN1YmplY3QgYSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTczLjg5NSB0bV9wdF82PS0zNS43MTEgdG1fcHRfNz0tMTguMDAwIHRtX3B0Xzg9LTQ4LjkyNCB0bV9wdF85PS02LjU0NyB0bV9wdF8xMD0tNDguODE5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS05LjM2MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIGxtXzA9LTU3LjQyNyBsbV8xPS03NS4wMDYgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMjcyLjAxMworNTYgfHx8IC4geiByZWxhdGVkIHBvbGFyIGNvLW9yZGluYXRlIHR3byBhcmUgciA9IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTI1LjU0NSB0bV9wdF82PS0xMi4xMjggdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTMuNDE4IHRtX3B0XzEwPS0xNi40ODYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTAuMTI4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTI5Ljc4NCBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03Ny4zNDIKKzU2IHx8fCAuIHogcmVsYXRlZCBwb2xhciBjby1vcmRpbmF0ZSB0d28gaXMgciA9IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTI1LjYwMiB0bV9wdF82PS0xMS4zNjEgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuMDUwIHRtX3B0XzEwPS0xOS41MjQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTAuNTM1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTI5LjY5OSBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03Ny44MDYKKzU3IHx8fCBub3ZlbWJlciB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMC4wNDEgdG1fcHRfNj0tMC4wNTcgdG1fcHRfNz0tMS4wMDAgdG1fcHRfOD0tMi43MTggdG1fcHRfOT0wLjAwMCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMC4wMDggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0zLjA3MSBsbV8xPS02LjUyMiBXb3JkUGVuYWx0eT0tMS4zMDMgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTYuOTQ5Cis1NyB8fHwgbm92ZW1iZXIgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tOS44NDAgdG1fcHRfNj0tMC43NDIgdG1fcHRfNz0tMS4wMDAgdG1fcHRfOD0tMi43MTggdG1fcHRfOT0tMS4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuNzc5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tNS4yNDIgbG1fMT0tOS43ODMgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xNi4zNTQKKzU3IHx8fCDgpqjgpq3gp4fgpq7gp43gpqzgprAgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0wLjAwMCB0bV9wdF81PTAuMDAwIHRtX3B0XzY9MC4wMDAgdG1fcHRfNz0wLjAwMCB0bV9wdF84PTAuMDAwIHRtX3B0Xzk9MC4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9MC4wMDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9MC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTcuMzU1IGxtXzE9LTYuNTIyIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTExLjM1OAorNTggfHx8IDE5NzIg4KaW4KeN4Kaw4KeA4Ka44KeN4Kaf4Ka+4Kas4KeN4Kam4KeHIHRoZW4g4KaG4Kaw4Kaq4Ka+4Kao4KeH4Kaf4KeHIGZpcnN0IOCmh+CmsuCnh+CmleCnjeCmn+CnjeCmsOCmqOCmv+CmlSBtYWlsIHRvIHRvIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE4LjYyOSB0bV9wdF82PS04Ljc2NSB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMC4zNjkgdG1fcHRfMTA9LTE3LjIwNCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi44OTkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS0zOC40MzAgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzgyLjAzMAorNTggfHx8IDE5NzIg4KaW4KeN4Kaw4KeA4Ka44KeN4Kaf4Ka+4Kas4KeN4Kam4KeHICIg4KaG4Kaw4Kaq4Ka+4Kao4KeH4Kaf4KeHIGZpcnN0IOCmh+CmsuCnh+CmleCnjeCmn+CnjeCmsOCmqOCmv+CmlSBtYWlsIHRvIHRvIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTIxLjM1MyB0bV9wdF82PS05LjQ1OCB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMS4zNjggdG1fcHRfMTA9LTIwLjcxNSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy4zOTEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tMzcuNzEwIGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM4Mi44MzcKKzU4IHx8fCAxOTcyIOCmluCnjeCmsOCngOCmuOCnjeCmn+CmvuCmrOCnjeCmpuCnhyB0aGVuIOCmhuCmsOCmquCmvuCmqOCnh+Cmn+CnhyBmaXJzdCDgpofgprLgp4fgppXgp43gpp/gp43gprDgpqjgpr/gppUgbWFpbCB0byB1c2VkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE3LjM1MCB0bV9wdF82PS0xMC4xODAgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTEuMzY5IHRtX3B0XzEwPS0xNS42ODUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuMTU4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMzguNjQzIGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM4My4yMTQKKzU4IHx8fCAxOTcyIOCmluCnjeCmsOCngOCmuOCnjeCmn+CmvuCmrOCnjeCmpuCnhyB0aGVuIOCmhuCmsOCmquCmvuCmqOCnh+Cmn+CnhyBmaXJzdCDgpofgprLgp4fgppXgp43gpp/gp43gprDgpqjgpr/gppUgdG8gbWFpbCB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xOC42MjkgdG1fcHRfNj0tOC43NjUgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTAuNzM2IHRtX3B0XzEwPS0xNy44NzMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuNDAzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMzcuOTM2IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM4My4zOTEKKzU4IHx8fCDgppbgp43gprDgp4Dgprjgp43gpp/gpr7gpqzgp43gpqbgp4cgMTk3MiB0aGVuIOCmhuCmsOCmquCmvuCmqOCnh+Cmn+CnhyBmaXJzdCDgpofgprLgp4fgppXgp43gpp/gp43gprDgpqjgpr/gppUgbWFpbCB0byB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xOC42MjkgdG1fcHRfNj0tOC43NjUgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTAuMzg3IHRtX3B0XzEwPS0xOC4wODAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNTEyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMzguNDMwIGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM4My40NTMKKzU4IHx8fCAxOTcyIOCmluCnjeCmsOCngOCmuOCnjeCmn+CmvuCmrOCnjeCmpuCnhyB0aGVuIOCmhuCmsOCmquCmvuCmqOCnh+Cmn+CnhyBmaXJzdCDgpofgprLgp4fgppXgp43gpp/gp43gprDgpqjgpr/gppUgbWFpbCB0byBhcnJlc3RlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNi44MzAgdG1fcHRfNj0tMTIuNDkwIHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjczNiB0bV9wdF8xMD0tMTMuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjQ2NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTM5LjYyNSBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zODMuNjYwCis1OCB8fHwgMTk3MiDgppbgp43gprDgp4Dgprjgp43gpp/gpr7gpqzgp43gpqbgp4cgZmlyc3Qg4KaH4Kay4KeH4KaV4KeN4Kaf4KeN4Kaw4Kao4Ka/4KaVIHRoZW4g4KaG4Kaw4Kaq4Ka+4Kao4KeH4Kaf4KeHIG1haWwgdG8gdG8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTguNjI5IHRtX3B0XzY9LTguNzY1IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0xLjAwMSB0bV9wdF8xMD0tMTQuMDIyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjg5OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTM4LjQzMCBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zODMuNjg4Cis1OCB8fHwgMTk3MiDgppbgp43gprDgp4Dgprjgp43gpp/gpr7gpqzgp43gpqbgp4cgdGhlbiBmaXJzdCDgpofgprLgp4fgppXgp43gpp/gp43gprDgpqjgpr/gppUg4KaG4Kaw4Kaq4Ka+4Kao4KeH4Kaf4KeHIG1haWwgdG8gdG8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTguNjI5IHRtX3B0XzY9LTguNzY1IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0xLjAwMSB0bV9wdF8xMD0tMTQuMDIyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjg5OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTM4LjQzMCBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zODMuNjg4Cis1OSB8fHwg4Kac4KeA4KasIHNjaWVuY2UgdGhhdCDgprbgpr7gppbgpr7gpq/gprwgZnVuZ2kgYW5kIHRoZSBwcmFjdGljYWwgc3ViamVjdCB0byBoZSBkaXNjdXNzZWQg4Kab4Kak4KeN4Kaw4Ka+4KaV4Kas4Ka/4Kam4KeN4Kav4Ka+IC1scmItIG15Y29sb2d5IC1ycmItIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMjIuMjg3IHRtX3B0XzY9LTIxLjQ3MSB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTEuMjc0IHRtX3B0XzEwPS0xOC4zNzAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNTUwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS01Ni4yNTkgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTI1LjEzNgorNTkgfHx8IOCmnOCngOCmrCBzY2llbmNlIHRoYXQg4Ka24Ka+4KaW4Ka+4Kav4Ka8IGZ1bmdpIGFuZCBpdHMgcHJhY3RpY2FsIHN1YmplY3QgdG8gaGUgZGlzY3Vzc2VkIOCmm+CmpOCnjeCmsOCmvuCmleCmrOCmv+CmpuCnjeCmr+CmviAtbHJiLSBteWNvbG9neSAtcnJiLSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEyLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0xOS40MzcgdG1fcHRfNj0tMjIuNDQxIHRtX3B0Xzc9LTEyLjAwMCB0bV9wdF84PS0zMi42MTYgdG1fcHRfOT0tMS4xMzkgdG1fcHRfMTA9LTE2LjI4MyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy41NjkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTQuMDAwIGxtXzA9LTU2Ljg4NCBsbV8xPS01NS40MzkgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MjUuNTk1Cis1OSB8fHwg4Kac4KeA4KasIHNjaWVuY2UgdGhhdCDgprbgpr7gppbgpr7gpq/gprwgZnVuZ2kgYW5kIHRoZSBwcmFjdGljYWwgc3ViamVjdCB0byBkaXNjdXNzZWQgaGUg4Kab4Kak4KeN4Kaw4Ka+4KaV4Kas4Ka/4Kam4KeN4Kav4Ka+IC1scmItIG15Y29sb2d5IC1ycmItIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTIyLjI4NyB0bV9wdF82PS0yMS40NzEgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjI3MyB0bV9wdF8xMD0tMTguOTQ1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjMyNyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNTcuNTAzIGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUyNS43ODEKKzU5IHx8fCDgppzgp4Dgpqwgc2NpZW5jZSB0aGF0IOCmtuCmvuCmluCmvuCmr+CmvCBmdW5naSBhbmQgdGhlIHByYWN0aWNhbCBzdWJqZWN0IGFib3V0IHRvIGhlIOCmm+CmpOCnjeCmsOCmvuCmleCmrOCmv+CmpuCnjeCmr+CmviAtbHJiLSBteWNvbG9neSAtcnJiLSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0yMy45MjUgdG1fcHRfNj0tMjEuOTU2IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMS4yNzMgdG1fcHRfMTA9LTIzLjIyMSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4yNDQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTUuMDAwIGxtXzA9LTU2LjgzOSBsbV8xPS01NS40MzkgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MjUuOTA4Cis1OSB8fHwg4Kac4KeA4KasIHNjaWVuY2UgdGhhdCDgprbgpr7gppbgpr7gpq/gprwgZnVuZ3VzIGFuZCB0aGUgcHJhY3RpY2FsIHN1YmplY3QgdG8gaGUgZGlzY3Vzc2VkIOCmm+CmpOCnjeCmsOCmvuCmleCmrOCmv+CmpuCnjeCmr+CmviAtbHJiLSBteWNvbG9neSAtcnJiLSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTIyLjg5MyB0bV9wdF82PS0yMi4yNDQgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjQwOSB0bV9wdF8xMD0tMTguMzcwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03Ljg1MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMy4wMDAgbG1fMD0tNTYuMjUyIGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUyNi4wNzkKKzU5IHx8fCDgppzgp4Dgpqwgc2NpZW5jZSB0aGF0IOCmtuCmvuCmluCmvuCmr+CmvCBmdW5naSBhbmQgdGhlIHByYWN0aWNhbCBzdWJqZWN0IHRvIGRpc2N1c3NlZCB3YXMg4Kab4Kak4KeN4Kaw4Ka+4KaV4Kas4Ka/4Kam4KeN4Kav4Ka+IC1scmItIG15Y29sb2d5IC1ycmItIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTIzLjMxNiB0bV9wdF82PS0yMS42OTIgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0xLjY0MSB0bV9wdF8xMD0tMjAuODczIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04LjAzMiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNTYuNTE2IGxtXzE9LTU1LjQzOSBXb3JkUGVuYWx0eT0tNy44MTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUyNi4yMzcKKzU5IHx8fCDgppzgp4Dgpqwgc2NpZW5jZSB0aGF0IOCmtuCmvuCmluCmvuCmr+CmvCBmdW5naSBhbmQgaXRzIHByYWN0aWNhbCBzdWJqZWN0IHRvIGRpc2N1c3NlZCBoZSDgppvgpqTgp43gprDgpr7gppXgpqzgpr/gpqbgp43gpq/gpr4gLWxyYi0gbXljb2xvZ3kgLXJyYi0gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMTkuNDM3IHRtX3B0XzY9LTIyLjQ0MSB0bV9wdF83PS0xMi4wMDAgdG1fcHRfOD0tMzIuNjE2IHRtX3B0Xzk9LTEuMTM4IHRtX3B0XzEwPS0xNi44NTcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuMzQ2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE1LjAwMCBsbV8wPS01OC4xMjkgbG1fMT0tNTUuNDM5IFdvcmRQZW5hbHR5PS03LjgxNyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTI2LjIzOQorNTkgfHx8IOCmnOCngOCmrCBzY2llbmNlIHRoYXQg4Ka24Ka+4KaW4Ka+4Kav4Ka8IGZ1bmdpIGFuZCB0aGUgcHJhY3RpY2FsIHN1YmplY3QgZGlzY3Vzc2VkIHRvIGhlIOCmm+CmpOCnjeCmsOCmvuCmleCmrOCmv+CmpuCnjeCmr+CmviAtbHJiLSBteWNvbG9neSAtcnJiLSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0yMi4yODcgdG1fcHRfNj0tMjEuNDcxIHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tMS4yNzMgdG1fcHRfMTA9LTIwLjU1NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4yNDQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTUuMDAwIGxtXzA9LTU4LjE1NiBsbV8xPS01NS40MzkgV29yZFBlbmFsdHk9LTcuODE3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MjYuMzY1Cis2MCB8fHwgd2F0ZXIgcml2ZXIgZnJvbSDgpongpqDgpr7gpqjgp4sgd2FzIHNvbWUgYSDgpqbgpr/gpq/gprzgp4ctIOCmpuCmoeCmvOCmvyBhbmQg4Kas4Ka+4Kay4Kaf4Ka/4KawIHRocm91Z2ggd2F0ZXIgdXNlZCBieSBhbmltYWwgd29ybGQgYSBzeXN0ZW0gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE2LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS00NC44ODAgdG1fcHRfNj0tMTcuNjM3IHRtX3B0Xzc9LTE2LjAwMCB0bV9wdF84PS00My40ODggdG1fcHRfOT0tNC4wNTkgdG1fcHRfMTA9LTM2LjMzNiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC4yNjEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTguMDAwIGxtXzA9LTYyLjI1NSBsbV8xPS02OC40ODQgV29yZFBlbmFsdHk9LTkuNTU0IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NTIuNTEyCis2MCB8fHwgd2F0ZXIgcml2ZXIgZnJvbSDgpongpqDgpr7gpqjgp4sgd2FzIHNvbWUgYSDgpqbgpr/gpq/gprzgp4ctIOCmpuCmoeCmvOCmvyBhbmQg4Kas4Ka+4Kay4Kaf4Ka/4KawIHRocm91Z2ggd2F0ZXIgdXNlZCBieSBhbmltYWwgd29ybGQgYSBtZXRob2QgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE2LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS00Mi40NzAgdG1fcHRfNj0tMTcuNDcwIHRtX3B0Xzc9LTE2LjAwMCB0bV9wdF84PS00My40ODggdG1fcHRfOT0tNC4wNTMgdG1fcHRfMTA9LTMzLjMyNiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy45NzMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTguMDAwIGxtXzA9LTYzLjYyNCBsbV8xPS02OC40ODQgV29yZFBlbmFsdHk9LTkuNTU0IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NTIuODAwCis2MCB8fHwgd2F0ZXIgcml2ZXIgZnJvbSDgpongpqDgpr7gpqjgp4sgd2FzIHNvbWUgcHVycyDgpqbgpr/gpq/gprzgp4ctIOCmpuCmoeCmvOCmvyBhbmQg4Kas4Ka+4Kay4Kaf4Ka/4KawIHRocm91Z2ggd2F0ZXIgdXNlZCBieSBhbmltYWwgd29ybGQgYSBzeXN0ZW0gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE2LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS00MC4yMzMgdG1fcHRfNj0tMTkuMDIzIHRtX3B0Xzc9LTE2LjAwMCB0bV9wdF84PS00My40ODggdG1fcHRfOT0tNC4wNTkgdG1fcHRfMTA9LTI4Ljk4MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC4yNjEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTguMDAwIGxtXzA9LTY0LjQ0NyBsbV8xPS02OC40ODQgV29yZFBlbmFsdHk9LTkuNTU0IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NTIuOTAyCis2MCB8fHwgd2F0ZXIgcml2ZXIgZnJvbSDgpongpqDgpr7gpqjgp4sgd2FzIHNvbWUgYSDgpqbgpr/gpq/gprzgp4ctIOCmpuCmoeCmvOCmvyBhbmQg4Kas4Ka+4Kay4Kaf4Ka/4KawIHRocm91Z2ggd2F0ZXIgdXNlZCBieSBhbmltYWwgd29ybGQgYSBwcm9jZXNzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tNDMuNTI4IHRtX3B0XzY9LTE3LjczMiB0bV9wdF83PS0xNi4wMDAgdG1fcHRfOD0tNDMuNDg4IHRtX3B0Xzk9LTQuMDcxIHRtX3B0XzEwPS0zNS4yMTggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguNDQzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBsbV8wPS02Mi45ODggbG1fMT0tNjguNDg0IFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTUyLjk3NworNjAgfHx8IHdhdGVyIHJpdmVyIGZyb20g4KaJ4Kag4Ka+4Kao4KeLIHdhcyBzb21lIHB1cnMg4Kam4Ka/4Kav4Ka84KeHLSDgpqbgpqHgprzgpr8gYW5kIOCmrOCmvuCmsuCmn+Cmv+CmsCB0aHJvdWdoIHdhdGVyIHVzZWQgYnkgYW5pbWFsIHdvcmxkIGEgbWV0aG9kIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xNS4wMDAgdG1fcHRfNT0tMzcuODI0IHRtX3B0XzY9LTE4Ljg1NiB0bV9wdF83PS0xNi4wMDAgdG1fcHRfOD0tNDMuNDg4IHRtX3B0Xzk9LTQuMDUzIHRtX3B0XzEwPS0yNS45NzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuOTczIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBsbV8wPS02NS44MTYgbG1fMT0tNjguNDg0IFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTUzLjE4OQorNjAgfHx8IHdhdGVyIHJpdmVyIGZyb20g4KaJ4Kag4Ka+4Kao4KeLIHdhcyBzb21lIHB1cnMg4Kam4Ka/4Kav4Ka84KeHLSDgpqbgpqHgprzgpr8gYW5kIOCmrOCmvuCmsuCmn+Cmv+CmsCB0aHJvdWdoIHdhdGVyIHVzZWQgYnkgYW5pbWFsIHdvcmxkIGEgcHJvY2VzcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTM4Ljg4MiB0bV9wdF82PS0xOS4xMTggdG1fcHRfNz0tMTYuMDAwIHRtX3B0Xzg9LTQzLjQ4OCB0bV9wdF85PS00LjA3MSB0bV9wdF8xMD0tMjcuODYzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04LjQ0MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgbG1fMD0tNjUuMTgwIGxtXzE9LTY4LjQ4NCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU1My4zNjcKKzYwIHx8fCB3YXRlciByaXZlciBmcm9tIOCmieCmoOCmvuCmqOCniyB3YXMgc29tZSBhIOCmpuCmv+Cmr+CmvOCnhy0g4Kam4Kah4Ka84Ka/IGFuZCDgpqzgpr7gprLgpp/gpr/gprAgdGhyb3VnaCB3YXRlciB1c2VkIGJ5IGFuaW1hbCB3b3JsZCBhIG1ldGhvZHMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE2LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS00MS44MzAgdG1fcHRfNj0tMTcuNjM3IHRtX3B0Xzc9LTE2LjAwMCB0bV9wdF84PS00My40ODggdG1fcHRfOT0tNC4wNzEgdG1fcHRfMTA9LTMzLjM1NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC40NDMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTguMDAwIGxtXzA9LTY0LjA0NSBsbV8xPS02OC40ODQgV29yZFBlbmFsdHk9LTkuNTU0IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NTMuNDQ0Cis2MSB8fHwgaW5jbHVkZSB0cmliYWwgZGFuY2UgbG9rdWogZGFuY2UgY2xhc3NpY2FsIGRhbmNlIGV0YyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xMS42MTEgdG1fcHRfNj0tMjEuMTg3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0zLjAwMCB0bV9wdF8xMD0tNS4zMjcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNjkxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMzEuMDMxIGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTc0LjI3MworNjEgfHx8IGFtb25nIHRoZW0gYXJlIHRyaWJhbCBkYW5jZSBsb2t1aiBkYW5jZSBjbGFzc2ljYWwgZGFuY2UgZXRjIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE1LjQwNiB0bV9wdF82PS0xMy4zMTkgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0zLjUzNSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi45OTggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMzEuMDA1IGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTc1LjI1MworNjEgfHx8IGFtb25nIHRoZXNlIGFyZSB0cmliYWwgZGFuY2UgbG9rdWogZGFuY2UgY2xhc3NpY2FsIGRhbmNlIGV0YyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xNi4zNDggdG1fcHRfNj0tMTMuMzUxIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tMy41MzUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuOTk4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTMxLjQyMyBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03NS45NjIKKzYxIHx8fCBhbW9uZyB0aGVzZSB0aGVyZSB0cmliYWwgZGFuY2UgbG9rdWogZGFuY2UgY2xhc3NpY2FsIGRhbmNlIGV0YyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0xNS4wNjEgdG1fcHRfNj0tMTMuMTcyIHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0yLjAwMSB0bV9wdF8xMD0tNi4zMTUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuODc1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTMxLjIzNSBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03Ni42OTUKKzYyIHx8fCB0aGUgb2xkZXN0IGxpdGVyYXR1cmUgZmlyc3Qg4Kau4KeM4KaW4Ka/4KaV4Kat4Ka+4Kas4KeHIGFuZCBsYXRlciB3cml0dGVuIGZvcm0gaXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjEuMjkwIHRtX3B0XzY9LTEzLjQ0NiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4xNDMgdG1fcHRfMTA9LTIwLjg0NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi4xNDMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTI5LjcwMiBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODAuMzk3Cis2MiB8fHwgdGhlIG9sZGVzdCBsaXRlcmF0dXJlIGZpcnN0IOCmruCnjOCmluCmv+CmleCmreCmvuCmrOCnhyBhbmQgbGF0ZXIgd3JpdHRlbiBpbiB0aGUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjUuODQ5IHRtX3B0XzY9LTEzLjExNCB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4xNjEgdG1fcHRfMTA9LTI2LjQ5MCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi43MzEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTI3Ljg5NiBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODAuNjA4Cis2MiB8fHwgdGhlIG9sZGVzdCBsaXRlcmF0dXJlIGZpcnN0IOCmruCnjOCmluCmv+CmleCmreCmvuCmrOCnhyBhbmQgbGF0ZXIgd3JpdHRlbiBmb3JtIHRoZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMi45MTUgdG1fcHRfNj0tMTMuNzIwIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0wLjE2MSB0bV9wdF8xMD0tMjIuNzM5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjczMSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjkuMjkwIGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4MS4wMDcKKzYyIHx8fCB0aGUgb2xkZXN0IGxpdGVyYXR1cmUgZmlyc3Qg4Kau4KeM4KaW4Ka/4KaV4Kat4Ka+4Kas4KeHIGFuZCBsYXRlciBpcyB3cml0dGVuIGZvcm0gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMjEuMjkwIHRtX3B0XzY9LTEzLjQ0NiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS4wMDcgdG1fcHRfMTA9LTE5LjI2OSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS4yOTYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI4LjgzNyBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODEuMjkzCis2MiB8fHwgdGhlIG9sZGVzdCBsaXRlcmF0dXJlIGZpcnN0IOCmruCnjOCmluCmv+CmleCmreCmvuCmrOCnhyBhbmQgdGhlbiB3cml0dGVuIGluIHRoZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yOC4yNTQgdG1fcHRfNj0tMTQuODU2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0wLjE2NyB0bV9wdF8xMD0tMjYuMjgyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjEzNyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjcuNzc0IGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4MS42MDgKKzYyIHx8fCB0aGUgb2xkZXN0IGxpdGVyYXJ5IGZpcnN0IOCmruCnjOCmluCmv+CmleCmreCmvuCmrOCnhyBhbmQgbGF0ZXIgd3JpdHRlbiBpbiB0aGUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjUuOTk3IHRtX3B0XzY9LTE0LjM5MiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4xNjIgdG1fcHRfMTA9LTI2LjM4MyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC40ODAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTI3LjkwNiBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODEuNjc4Cis2MiB8fHwgdGhlIG9sZGVzdCBsaXRlcmF0dXJlIGZpcnN0IOCmruCnjOCmluCmv+CmleCmreCmvuCmrOCnhyBhbmQgbGF0ZXIgd3JpdHRlbiBmb3JtIHVzZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjAuMDg2IHRtX3B0XzY9LTE0LjM2MiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4xNDkgdG1fcHRfMTA9LTE5LjQ4MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi41NDkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTMwLjkxMyBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODEuNzc0Cis2MiB8fHwgdGhlIG9sZGVzdCBsaXRlcmF0dXJlIGZpcnN0IOCmruCnjOCmluCmv+CmleCmreCmvuCmrOCnhyBhbmQgbGF0ZXIgd3JpdHRlbiBpbiBpcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yNC4yMjMgdG1fcHRfNj0tMTIuODQwIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0wLjE0MyB0bV9wdF8xMD0tMjQuNTk2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjE0MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjkuNzc3IGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4MS44MTcKKzYyIHx8fCB0aGUgb2xkZXN0IGxpdGVyYXR1cmUgZmlyc3Qg4Kau4KeM4KaW4Ka/4KaV4Kat4Ka+4Kas4KeHIGFuZCBsYXRlciB3cml0dGVuIGluIHVzZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjMuMDIwIHRtX3B0XzY9LTEzLjc1NiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMC4xNDkgdG1fcHRfMTA9LTIzLjIzMyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi41NDkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTI5Ljk3NSBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODEuOTQwCis2MiB8fHwgdGhlIG9sZGVzdCBsaXRlcmF0dXJlIGZpcnN0IOCmruCnjOCmluCmv+CmleCmreCmvuCmrOCnhyBhbmQgdGhlbiB3cml0dGVuIGZvcm0gdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTI1LjMyMCB0bV9wdF82PS0xNS40NjIgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTAuMTY3IHRtX3B0XzEwPS0yMi41MzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuMTM3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yOS4xNjggbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgyLjAwNgorNjMgfHx8IGluIDE5ODkgdGhlIOCml+Cmo+CmtuCmpOCnjeCmsOCngSBmaWxtIGhpcyBjb25kdWN0ZWQg4Kak4KeB4Kay4Kao4Ka+4Kau4KeC4Kay4KaV4Kat4Ka+4Kas4KeHIOCmpuCngeCmsOCnjeCmrOCmsiBhbmQgdGhpcyDgpqbgp4DgprDgp43gppjgpqbgpr/gpqjgp4fgprAg4KaF4Ka44KeB4Ka44KeN4Kal4Kak4Ka+4Ka24KeH4Ka34KeHIGJhY2sgLCBhZnRlciBjaW5lbWEgYnVpbGRpbmcg4Kaq4KeB4Kao4Kaw4KeN4Kaq4KeN4Kaw4Kaa4KeH4Ka34KeN4Kaf4Ka+IGNvbnNpZGVyZWQgYSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTU0LjIwNSB0bV9wdF82PS00MS43NTEgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS03LjI0MSB0bV9wdF8xMD0tNDcuNzE4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMS43MDMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBsbV8wPS03NC40OTMgbG1fMT0tNzUuMDA2IFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc4Ny40NjAKKzYzIHx8fCBpbiAxOTg5IHRoZSDgppfgpqPgprbgpqTgp43gprDgp4EgZmlsbSBoaXMgY29uZHVjdGVkIOCmpOCngeCmsuCmqOCmvuCmruCnguCmsuCmleCmreCmvuCmrOCnhyDgpqbgp4HgprDgp43gpqzgprIgYW5kIHRoaXMg4Kam4KeA4Kaw4KeN4KaY4Kam4Ka/4Kao4KeH4KawIOCmheCmuOCngeCmuOCnjeCmpeCmpOCmvuCmtuCnh+Cmt+CnhyBiYWNrICwgYWZ0ZXIgY2luZW1hICwg4Kaq4KeB4Kao4Kaw4KeN4Kaq4KeN4Kaw4Kaa4KeH4Ka34KeN4Kaf4Ka+IGNvbnNpZGVyZWQgYSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTYwLjAzMyB0bV9wdF82PS00MS40NjQgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS03LjI0MSB0bV9wdF8xMD0tNTMuOTA1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMS43MDMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBsbV8wPS03Mi40NTEgbG1fMT0tNzUuMDA2IFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc4Ny41NTQKKzYzIHx8fCBpbiAxOTg5IHRoZSDgppfgpqPgprbgpqTgp43gprDgp4EgZmlsbSBoaXMgY29uZHVjdGVkIOCmpOCngeCmsuCmqOCmvuCmruCnguCmsuCmleCmreCmvuCmrOCnhyDgpqbgp4HgprDgp43gpqzgprIgYW5kIHRoaXMg4Kam4KeA4Kaw4KeN4KaY4Kam4Ka/4Kao4KeH4KawIOCmheCmuOCngeCmuOCnjeCmpeCmpOCmvuCmtuCnh+Cmt+CnhyBiYWNrICwgYWZ0ZXIgY2luZW1hIGJ1aWxkaW5nIOCmquCngeCmqOCmsOCnjeCmquCnjeCmsOCmmuCnh+Cmt+CnjeCmn+CmviBhIGNvbnNpZGVyZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE0LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEzLjAwMCB0bV9wdF81PS01NC4yMDUgdG1fcHRfNj0tNDEuNzUxIHRtX3B0Xzc9LTE0LjAwMCB0bV9wdF84PS0zOC4wNTIgdG1fcHRfOT0tNy4yNDEgdG1fcHRfMTA9LTQ3LjUzNiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTEuNzAzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xOS4wMDAgbG1fMD0tNzUuNDcwIGxtXzE9LTc1LjAwNiBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03ODcuNjU3Cis2MyB8fHwgaW4gMTk4OSB0aGUg4KaX4Kaj4Ka24Kak4KeN4Kaw4KeBIGZpbG0gaGlzIGJldHdlZW4g4Kak4KeB4Kay4Kao4Ka+4Kau4KeC4Kay4KaV4Kat4Ka+4Kas4KeHIOCmpuCngeCmsOCnjeCmrOCmsiBhbmQgdGhpcyDgpqbgp4DgprDgp43gppjgpqbgpr/gpqjgp4fgprAg4KaF4Ka44KeB4Ka44KeN4Kal4Kak4Ka+4Ka24KeH4Ka34KeHIGJhY2sgLCBhZnRlciBjaW5lbWEgYnVpbGRpbmcg4Kaq4KeB4Kao4Kaw4KeN4Kaq4KeN4Kaw4Kaa4KeH4Ka34KeN4Kaf4Ka+IGNvbnNpZGVyZWQgYSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTU2Ljg3NiB0bV9wdF82PS00Mi40NDQgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS02LjYwOSB0bV9wdF8xMD0tNDguNzMwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMS4yMzMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE3LjAwMCBsbV8wPS03My42MjkgbG1fMT0tNzUuMDA2IFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc4Ny42ODAKKzYzIHx8fCBpbiAxOTg5IHRoZSDgppfgpqPgprbgpqTgp43gprDgp4EgZmlsbSBoaXMgY29uZHVjdGVkIOCmpOCngeCmsuCmqOCmvuCmruCnguCmsuCmleCmreCmvuCmrOCnhyDgpqbgp4HgprDgp43gpqzgprIgYW5kIHRoaXMg4Kam4KeA4Kaw4KeN4KaY4Kam4Ka/4Kao4KeH4KawIOCmheCmuOCngeCmuOCnjeCmpeCmpOCmvuCmtuCnh+Cmt+CnhyBiYWNrICwgYWZ0ZXIgY2luZW1hICwg4Kaq4KeB4Kao4Kaw4KeN4Kaq4KeN4Kaw4Kaa4KeH4Ka34KeN4Kaf4Ka+IGEgY29uc2lkZXJlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTYwLjAzMyB0bV9wdF82PS00MS40NjQgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS03LjI0MSB0bV9wdF8xMD0tNTMuNzIyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMS43MDMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE5LjAwMCBsbV8wPS03My40MjggbG1fMT0tNzUuMDA2IFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc4Ny43NTEKKzYzIHx8fCBpbiAxOTg5IHRoZSDgppfgpqPgprbgpqTgp43gprDgp4EgZmlsbSBoaXMgYmV0d2VlbiDgpqTgp4HgprLgpqjgpr7gpq7gp4LgprLgppXgpq3gpr7gpqzgp4cg4Kam4KeB4Kaw4KeN4Kas4KayIGFuZCB0aGlzIOCmpuCngOCmsOCnjeCmmOCmpuCmv+CmqOCnh+CmsCDgpoXgprjgp4Hgprjgp43gpqXgpqTgpr7gprbgp4fgprfgp4cgYmFjayAsIGFmdGVyIGNpbmVtYSAsIOCmquCngeCmqOCmsOCnjeCmquCnjeCmsOCmmuCnh+Cmt+CnjeCmn+CmviBjb25zaWRlcmVkIGEgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE0LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS02Mi43MDQgdG1fcHRfNj0tNDIuMTU3IHRtX3B0Xzc9LTE0LjAwMCB0bV9wdF84PS0zOC4wNTIgdG1fcHRfOT0tNi42MDkgdG1fcHRfMTA9LTU0LjkxNiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTEuMjMzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNy4wMDAgbG1fMD0tNzEuNTg2IGxtXzE9LTc1LjAwNiBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03ODcuNzc0Cis2MyB8fHwgaW4gMTk4OSB0aGUg4KaX4Kaj4Ka24Kak4KeN4Kaw4KeBIGZpbG0gaGlzIGJldHdlZW4g4Kak4KeB4Kay4Kao4Ka+4Kau4KeC4Kay4KaV4Kat4Ka+4Kas4KeHIOCmpuCngeCmsOCnjeCmrOCmsiBhbmQgdGhpcyDgpqbgp4DgprDgp43gppjgpqbgpr/gpqjgp4fgprAg4KaF4Ka44KeB4Ka44KeN4Kal4Kak4Ka+4Ka24KeH4Ka34KeHIGJhY2sgLCBhZnRlciBjaW5lbWEgYnVpbGRpbmcg4Kaq4KeB4Kao4Kaw4KeN4Kaq4KeN4Kaw4Kaa4KeH4Ka34KeN4Kaf4Ka+IGEgY29uc2lkZXJlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTU2Ljg3NiB0bV9wdF82PS00Mi40NDQgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS02LjYwOSB0bV9wdF8xMD0tNDguNTQ3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMS4yMzMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBsbV8wPS03NC42MDYgbG1fMT0tNzUuMDA2IFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc4Ny44NzcKKzYzIHx8fCBpbiAxOTg5IHRoZSDgppfgpqPgprbgpqTgp43gprDgp4EgZmlsbSBoaXMgLCDgpqTgp4HgprLgpqjgpr7gpq7gp4LgprLgppXgpq3gpr7gpqzgp4cg4Kam4KeB4Kaw4KeN4Kas4KayIGFuZCB0aGlzIOCmpuCngOCmsOCnjeCmmOCmpuCmv+CmqOCnh+CmsCDgpoXgprjgp4Hgprjgp43gpqXgpqTgpr7gprbgp4fgprfgp4cgYmFjayAsIGFmdGVyIGNpbmVtYSBidWlsZGluZyDgpqrgp4HgpqjgprDgp43gpqrgp43gprDgpprgp4fgprfgp43gpp/gpr4gY29uc2lkZXJlZCBhIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNjAuMTY0IHRtX3B0XzY9LTQxLjM0NiB0bV9wdF83PS0xNC4wMDAgdG1fcHRfOD0tMzguMDUyIHRtX3B0Xzk9LTcuMjQxIHRtX3B0XzEwPS01NS44NTAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTExLjcwMyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTguMDAwIGxtXzA9LTcyLjM1MiBsbV8xPS03NS4wMDYgV29yZFBlbmFsdHk9LTEwLjQyMyBPT1ZQZW5hbHR5PS02MDAuMDAwIHx8fCAtNzg3LjkyMQorNjMgfHx8IGluIDE5ODkgdGhlIOCml+Cmo+CmtuCmpOCnjeCmsOCngSBmaWxtIGhpcyBiZXR3ZWVuIOCmpOCngeCmsuCmqOCmvuCmruCnguCmsuCmleCmreCmvuCmrOCnhyDgpqbgp4HgprDgp43gpqzgprIgYW5kIHRoaXMg4Kam4KeA4Kaw4KeN4KaY4Kam4Ka/4Kao4KeH4KawIOCmheCmuOCngeCmuOCnjeCmpeCmpOCmvuCmtuCnh+Cmt+CnhyBiYWNrICwgYWZ0ZXIgY2luZW1hICwg4Kaq4KeB4Kao4Kaw4KeN4Kaq4KeN4Kaw4Kaa4KeH4Ka34KeN4Kaf4Ka+IGEgY29uc2lkZXJlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTYyLjcwNCB0bV9wdF82PS00Mi4xNTcgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS02LjYwOSB0bV9wdF8xMD0tNTQuNzM0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMS4yMzMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE4LjAwMCBsbV8wPS03Mi41NjQgbG1fMT0tNzUuMDA2IFdvcmRQZW5hbHR5PS0xMC40MjMgT09WUGVuYWx0eT0tNjAwLjAwMCB8fHwgLTc4Ny45NzEKKzYzIHx8fCBpbiAxOTg5IHRoZSDgppfgpqPgprbgpqTgp43gprDgp4EgZmlsbSBoaXMgLCDgpqTgp4HgprLgpqjgpr7gpq7gp4LgprLgppXgpq3gpr7gpqzgp4cg4Kam4KeB4Kaw4KeN4Kas4KayIGFuZCB0aGlzIOCmpuCngOCmsOCnjeCmmOCmpuCmv+CmqOCnh+CmsCDgpoXgprjgp4Hgprjgp43gpqXgpqTgpr7gprbgp4fgprfgp4cgYmFjayAsIGFmdGVyIGNpbmVtYSAsIOCmquCngeCmqOCmsOCnjeCmquCnjeCmsOCmmuCnh+Cmt+CnjeCmn+CmviBjb25zaWRlcmVkIGEgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE0LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEyLjAwMCB0bV9wdF81PS02NS45OTIgdG1fcHRfNj0tNDEuMDU4IHRtX3B0Xzc9LTE0LjAwMCB0bV9wdF84PS0zOC4wNTIgdG1fcHRfOT0tNy4yNDEgdG1fcHRfMTA9LTYyLjAzNyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTEuNzAzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xOC4wMDAgbG1fMD0tNzAuMzEwIGxtXzE9LTc1LjAwNiBXb3JkUGVuYWx0eT0tMTAuNDIzIE9PVlBlbmFsdHk9LTYwMC4wMDAgfHx8IC03ODguMDE1Cis2NCB8fHwgdGhlIOCmrOCmsuCmrOCmv+CmpuCnjeCmr+CmviB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tOC4yNjMgdG1fcHRfNj0tMy41NTkgdG1fcHRfNz0tMS4wMDAgdG1fcHRfOD0tMi43MTggdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTcuNDk0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjI1MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTguMzY0IGxtXzE9LTkuNzgzIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTIwLjM4NQorNjQgfHx8IG1hdGhlbWF0aWNhbCDgpqzgprLgpqzgpr/gpqbgp43gpq/gpr4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTEuODIzIHRtX3B0XzY9LTIuNDYxIHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPS00LjQ2NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMS45NDYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS05LjkxNyBsbV8xPS05Ljc4MyBXb3JkUGVuYWx0eT0tMS43MzcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEyMC42NzcKKzY0IHx8fCDigKIg4Kas4Kay4Kas4Ka/4Kam4KeN4Kav4Ka+IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PTAuMDAwIHRtX3B0XzY9LTQuODEyIHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjI1MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTExLjQ2OSBsbV8xPS05Ljc4MyBXb3JkUGVuYWx0eT0tMS43MzcgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEyMS4xMzAKKzY0IHx8fCAuIOCmrOCmsuCmrOCmv+CmpuCnjeCmr+CmviB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0wLjAwMCB0bV9wdF81PS02Ljg1NSB0bV9wdF82PS0yLjU2MSB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjAxOCB0bV9wdF8xMD0tMy4yMTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuNjQ5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMTAuMDEwIGxtXzE9LTkuNzgzIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTIxLjUyMQorNjQgfHx8IOCmrOCmsuCmrOCmv+CmpuCnjeCmr+CmviBtYXRoZW1hdGljYWwgdGhlb3J5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9MC4wMDAgdG1fcHRfNT0tMTMuMTU3IHRtX3B0XzY9LTIuNzk3IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjI1OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTEyLjg4MCBsbV8xPS0xNi4zMDYgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMzEuMTAyCis2NCB8fHwgbWF0aGVtYXRpY2FsIHRoZW9yeSAuIOCmrOCmsuCmrOCmv+CmpuCnjeCmr+CmviB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMTMuMTU3IHRtX3B0XzY9LTIuNzk3IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjk0NiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTE1Ljg1NSBsbV8xPS0xNi4zMDYgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMzMuMzU0Cis2NSB8fHwgb3RoZXIg4Ka44KeN4Kas4Kak4KeN4Kak4KeN4KasLeCmuOCmguCmsOCmleCnjeCmt+Cmv+CmpCBsaW51eCBvcGVyYXRpbmcgc3lzdGVtIGxpa2Ugd2luZG93cyBhbmQgbWFjIG9zIHRvIGFjcXVpcmUgZGlmZmVyZW50IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE5LjU1NCB0bV9wdF82PS0xMS42ODEgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTIuNTAzIHRtX3B0XzEwPS00LjU5NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi45ODUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEzLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMzQuMDAzIGxtXzE9LTQ4LjkxNyBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE5MC4yMjQKKzY1IHx8fCBvdGhlciDgprjgp43gpqzgpqTgp43gpqTgp43gpqwt4Ka44KaC4Kaw4KaV4KeN4Ka34Ka/4KakIG9wZXJhdGluZyBzeXN0ZW0gbGlrZSB3aW5kb3dzIGFuZCBtYWMgb3MgdG8gbGludXggYWNxdWlyZSBkaWZmZXJlbnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMTkuODA0IHRtX3B0XzY9LTExLjg4NSB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMi4xMzUgdG1fcHRfMTA9LTUuNjQ3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjQ1MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0zNi42NTAgbG1fMT0tNDguOTE3IFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTkwLjg2MAorNjUgfHx8IG90aGVyIOCmuOCnjeCmrOCmpOCnjeCmpOCnjeCmrC3gprjgpoLgprDgppXgp43gprfgpr/gpqQgb3BlcmF0aW5nIHN5c3RlbXMgbGlrZSB3aW5kb3dzIGFuZCBtYWMgb3MgdG8gbGludXggYWNxdWlyZSBkaWZmZXJlbnQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMTkuNjQ2IHRtX3B0XzY9LTEyLjU4NyB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMi4xMzUgdG1fcHRfMTA9LTUuNTU1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00Ljg3MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0zNi4yMzQgbG1fMT0tNDguOTE3IFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTkxLjAzMworNjUgfHx8IG90aGVyIOCmuOCnjeCmrOCmpOCnjeCmpOCnjeCmrC3gprjgpoLgprDgppXgp43gprfgpr/gpqQgbGludXggb3BlcmF0aW5nIHN5c3RlbSBsaWtlIHdpbmRvd3MgYW5kIG1hYyBvcyB0byBhY3F1aXJlIGEgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTIyLjc4NyB0bV9wdF82PS0xMi43MzEgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0yLjUwMyB0bV9wdF8xMD0tMTEuOTU5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjAzMyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD02LjAwMCBsbV8wPS0zMS43OTIgbG1fMT0tNDguOTE3IFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTkxLjY0NAorNjUgfHx8IG90aGVyIOCmuOCnjeCmrOCmpOCnjeCmpOCnjeCmrC3gprjgpoLgprDgppXgp43gprfgpr/gpqQgbGludXggb3BlcmF0aW5nIHN5c3RlbSBsaWtlIHdpbmRvd3MgYW5kIG1hYyBvcyB0byBhY3F1aXJlIHNlcGFyYXRlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNy43NTYgdG1fcHRfNj0tMTIuNDgwIHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMS41NTMgdG1fcHRfMTA9LTUuODU3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjY0NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTMuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD02LjAwMCBsbV8wPS0zNC45ODYgbG1fMT0tNDguOTE3IFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTkxLjY5NgorNjYgfHx8IGFzaWEg4Kaf4Ka+4KaH4Kau4Ka44KeH4KawIOCmreCmvuCmt+CnjeCmryB0byAsIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS03LjIwNSB0bV9wdF82PS0zLjc1MCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tNy4zNDggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuNTUzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjAuMjc4IGxtXzE9LTE5LjU2NyBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0MS40MjYKKzY2IHx8fCBhc2lhIOCmn+CmvuCmh+CmruCmuOCnh+CmsCDgpq3gpr7gprfgp43gpq8gYWNjb3JkaW5nIHRvICwgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTkuMTkxIHRtX3B0XzY9LTMuNzgzIHRtX3B0Xzc9LTMuMDAwIHRtX3B0Xzg9LTguMTU0IHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0yLjE2MCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMC40MTMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yMS43NzggbG1fMT0tMjIuODI4IFdvcmRQZW5hbHR5PS0zLjQ3NCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjQzLjM3MgorNjYgfHx8IHRoZSDgpp/gpr7gpofgpq7gprjgp4fgprAg4Kat4Ka+4Ka34KeN4KavIHRvICwgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTE1LjIyOCB0bV9wdF82PS02Ljc3OCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjUwMyB0bV9wdF8xMD0tMTMuODM1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjQ5OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3Ljc3NSBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDMuNzM2Cis2NiB8fHwgYXNpYSDgpp/gpr7gpofgpq7gprjgp4fgprAgYWNjb3JkaW5nIHRvIOCmreCmvuCmt+CnjeCmryAsIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS05LjE5MSB0bV9wdF82PS0zLjc4MyB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjAwMiB0bV9wdF8xMD0tMi4yMzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTAuNDY4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgbG1fMD0tMjEuNzgxIGxtXzE9LTIyLjgyOCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0NC4zODAKKzY2IHx8fCDgpp/gpr7gpofgpq7gprjgp4fgprAgYXNpYSDgpq3gpr7gprfgp43gpq8gdG8gLCB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tNy4yMDUgdG1fcHRfNj0tMy43NTAgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTkuNjQ5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjYwOSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIGxtXzA9LTIwLjgxNiBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDQuMzgxCis2NyB8fHwgb3BlbiBzb3VyY2Ugb3Igb3BlbiBzb3VyY2UgLWxyYi0gb3BlbiBzb3VyY2UgLXJyYi0gdGhlIG1vbmV5IGlzIGNvbXB1dGVyIHNvZnR3YXJlIHRoZSBzb3VyY2UgY29kZSBvciB0aGUg4Ka44Ka+4KaC4KaV4KeH4Kak4Ka/4KaVIGxhbmd1YWdlIG9wZW4gd2F5IOCmrOCmv+CmpOCmsOCmoyB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTkuMDAwIHRtX3B0XzU9LTQ3LjIzNiB0bV9wdF82PS0yMi43MzYgdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS0yLjUwOCB0bV9wdF8xMD0tMjQuODM0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjE3MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yMy4wMDAgbG1fMD0tNjkuOTUxIGxtXzE9LTg4LjA1MCBXb3JkUGVuYWx0eT0tMTIuMTYwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NzAuODA1Cis2NyB8fHwgb3BlbiBzb3VyY2Ugb3Igb3BlbiBzb3VyY2UgLWxyYi0gb3BlbiBzb3VyY2UgLXJyYi0gdGhlIG1vbmV5IGlzIGNvbXB1dGVyIHNvZnR3YXJlIHRoZSBzb3VyY2UgY29kZSBvciBtYWluIOCmuOCmvuCmguCmleCnh+CmpOCmv+CmlSBsYW5ndWFnZSBvcGVuIHdheSDgpqzgpr/gpqTgprDgpqMgdG8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE5LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE5LjAwMCB0bV9wdF81PS00Mi43ODkgdG1fcHRfNj0tMjEuOTg4IHRtX3B0Xzc9LTE5LjAwMCB0bV9wdF84PS01MS42NDIgdG1fcHRfOT0tMS44NzYgdG1fcHRfMTA9LTIzLjczNiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi40NzkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MjMuMDAwIGxtXzA9LTcxLjcyNyBsbV8xPS04OC4wNTAgV29yZFBlbmFsdHk9LTEyLjE2MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTcwLjg0OAorNjcgfHx8IG9wZW4gc291cmNlIG9yIG9wZW4gc291cmNlIC1scmItIG9wZW4gc291cmNlIC1ycmItIHRoZSBtb25leSBpcyBjb21wdXRlciBzb2Z0d2FyZSB0aGUgc291cmNlIGNvZGUgb3IgdGhlIOCmuOCmvuCmguCmleCnh+CmpOCmv+CmlSBsYW5ndWFnZSBvcGVuIHdheSDgpqzgpr/gpqTgprDgpqMgaXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE5LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE5LjAwMCB0bV9wdF81PS00Ny45NDkgdG1fcHRfNj0tMjMuMzM2IHRtX3B0Xzc9LTE5LjAwMCB0bV9wdF84PS01MS42NDIgdG1fcHRfOT0tMi41MDggdG1fcHRfMTA9LTI0LjY3OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4xMzQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MjMuMDAwIGxtXzA9LTcwLjAyMiBsbV8xPS04OC4wNTAgV29yZFBlbmFsdHk9LTEyLjE2MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTcxLjE4MAorNjcgfHx8IG9wZW4gc291cmNlIG9yIG9wZW4gc291cmNlIC1scmItIG9wZW4gc291cmNlIC1ycmItIHRoZSBtb25leSBpcyBjb21wdXRlciBzb2Z0d2FyZSB0aGUgc291cmNlIGNvZGUgb3IgdGhlIOCmuOCmvuCmguCmleCnh+CmpOCmv+CmlSBsYW5ndWFnZSDgpqzgpr/gpqTgprDgpqMgdG8gb3BlbiB3YXkgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE4LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE2LjAwMCB0bV9wdF81PS00Ny4yMzYgdG1fcHRfNj0tMjIuNzM2IHRtX3B0Xzc9LTE4LjAwMCB0bV9wdF84PS00OC45MjQgdG1fcHRfOT0tMi44NzUgdG1fcHRfMTA9LTIzLjkyNCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi41MjcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTkuMDAwIGxtXzA9LTY4LjE3OSBsbV8xPS04OC4wNTAgV29yZFBlbmFsdHk9LTEyLjE2MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTcxLjE4NworNjcgfHx8IG9wZW4gc291cmNlIG9yIG9wZW4gc291cmNlIC1scmItIG9wZW4gc291cmNlIC1ycmItIHRoZSBtb25leSBpcyBjb21wdXRlciBzb2Z0d2FyZSB0aGUgc291cmNlIGNvZGUgb3IgbWFpbiDgprjgpr7gpoLgppXgp4fgpqTgpr/gppUgbGFuZ3VhZ2Ugb3BlbiB3YXkg4Kas4Ka/4Kak4Kaw4KajIGlzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xOS4wMDAgdG1fcHRfNT0tNDMuNTAzIHRtX3B0XzY9LTIyLjU4OCB0bV9wdF83PS0xOS4wMDAgdG1fcHRfOD0tNTEuNjQyIHRtX3B0Xzk9LTEuODc2IHRtX3B0XzEwPS0yMy41ODAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNDQxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIzLjAwMCBsbV8wPS03MS43OTggbG1fMT0tODguMDUwIFdvcmRQZW5hbHR5PS0xMi4xNjAgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU3MS4yMjMKKzY3IHx8fCBvcGVuIHNvdXJjZSBvciBvcGVuIHNvdXJjZSAtbHJiLSBvcGVuIHNvdXJjZSAtcnJiLSB0aGUgbW9uZXkgaXMgY29tcHV0ZXIgc29mdHdhcmUgdGhlIHNvdXJjZSBjb2RlIG9yIG1haW4g4Ka44Ka+4KaC4KaV4KeH4Kak4Ka/4KaVIGxhbmd1YWdlIOCmrOCmv+CmpOCmsOCmoyB0byBvcGVuIHdheSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTYuMDAwIHRtX3B0XzU9LTQyLjc4OSB0bV9wdF82PS0yMS45ODggdG1fcHRfNz0tMTguMDAwIHRtX3B0Xzg9LTQ4LjkyNCB0bV9wdF85PS0yLjI0MyB0bV9wdF8xMD0tMjIuODI1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjgzNCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xOS4wMDAgbG1fMD0tNjkuOTU1IGxtXzE9LTg4LjA1MCBXb3JkUGVuYWx0eT0tMTIuMTYwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NzEuMjMwCis2NyB8fHwgb3BlbiBzb3VyY2Ugb3Igb3BlbiBzb3VyY2UgLWxyYi0gb3BlbiBzb3VyY2UgLXJyYi0gdGhlIG1vbmV5IGlzIGNvbXB1dGVyIHNvZnR3YXJlIHRoZSBzb3VyY2UgY29kZSBvciB0aGUg4Ka44Ka+4KaC4KaV4KeH4Kak4Ka/4KaVIGxhbmd1YWdlIGZyZWUgd2F5IOCmrOCmv+CmpOCmsOCmoyB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTkuMDAwIHRtX3B0XzU9LTQ3LjIxMCB0bV9wdF82PS0yMi45MjUgdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS0yLjUxMSB0bV9wdF8xMD0tMjUuMjAzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04LjM2MSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yMy4wMDAgbG1fMD0tNjkuODg0IGxtXzE9LTg4LjA1MCBXb3JkUGVuYWx0eT0tMTIuMTYwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NzEuMzAwCis2NyB8fHwgb3BlbiBzb3VyY2Ugb3Igb3BlbiBzb3VyY2UgLWxyYi0gb3BlbiBzb3VyY2UgLXJyYi0gdGhlIG1vbmV5IGlzIGNvbXB1dGVyIHNvZnR3YXJlIHRoZSBzb3VyY2UgY29kZSBvciBtYWluIOCmuOCmvuCmguCmleCnh+CmpOCmv+CmlSBsYW5ndWFnZSBmcmVlIHdheSDgpqzgpr/gpqTgprDgpqMgdG8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTE5LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE5LjAwMCB0bV9wdF81PS00Mi43NjQgdG1fcHRfNj0tMjIuMTc3IHRtX3B0Xzc9LTE5LjAwMCB0bV9wdF84PS01MS42NDIgdG1fcHRfOT0tMS44NzkgdG1fcHRfMTA9LTI0LjEwNCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy42NjggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MjMuMDAwIGxtXzA9LTcxLjY2MCBsbV8xPS04OC4wNTAgV29yZFBlbmFsdHk9LTEyLjE2MCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTcxLjM0MworNjcgfHx8IG9wZW4gc291cmNlIG9yIG9wZW4gc291cmNlIC1scmItIG9wZW4gc291cmNlIC1ycmItIHRoZSBtb25leSBpcyBjb21wdXRlciBzb2Z0d2FyZSB0aGUgc291cmNlIGNvZGUgb3IgdGhlIOCmuOCmvuCmguCmleCnh+CmpOCmv+CmlSBsYW5ndWFnZSBvcGVuIGluIOCmrOCmv+CmpOCmsOCmoyB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTkuMDAwIHRtX3B0XzU9LTUxLjczNiB0bV9wdF82PS0yMy4xNDEgdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS0yLjU1NyB0bV9wdF8xMD0tMjkuOTM3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03Ljg2NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yMy4wMDAgbG1fMD0tNjguMzc0IGxtXzE9LTg4LjA1MCBXb3JkUGVuYWx0eT0tMTIuMTYwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NzEuNDYyCis2NyB8fHwgb3BlbiBzb3VyY2Ugb3Igb3BlbiBzb3VyY2UgLWxyYi0gb3BlbiBzb3VyY2UgLXJyYi0gdGhlIG1vbmV5IGlzIGNvbXB1dGVyIHNvZnR3YXJlIHRoZSBzb3VyY2UgY29kZSBvciBtYWluIOCmuOCmvuCmguCmleCnh+CmpOCmv+CmlSBsYW5ndWFnZSBvcGVuIGluIOCmrOCmv+CmpOCmsOCmoyB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTkuMDAwIHRtX3B0XzU9LTQ3LjI4OSB0bV9wdF82PS0yMi4zOTQgdG1fcHRfNz0tMTkuMDAwIHRtX3B0Xzg9LTUxLjY0MiB0bV9wdF85PS0xLjkyNSB0bV9wdF8xMD0tMjguODM5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjE3MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yMy4wMDAgbG1fMD0tNzAuMTUxIGxtXzE9LTg4LjA1MCBXb3JkUGVuYWx0eT0tMTIuMTYwIE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01NzEuNTA1Cis2OCB8fHwgYmFuZ2xhZGVzaCDgpoXgpqjgprLgpr7gpofgpqjgp4cgZGhha2EgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTEuNjY1IHRtX3B0XzY9LTAuNDcxIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9MC4wMDAgdG1fcHRfMTA9LTAuMzc1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0wLjA1NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTEyLjk5OSBsbV8xPS0xMy4wNDUgV29yZFBlbmFsdHk9LTIuMTcxIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMjMuNTIzCis2OCB8fHwgYmFuZ2xhZGVzaCDgpoXgpqjgprLgpr7gpofgpqjgp4cgdGhlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS03Ljk2NiB0bV9wdF82PS0yLjcxMSB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tNi4xNzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuMTk1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMTIuMTIzIGxtXzE9LTEzLjA0NSBXb3JkUGVuYWx0eT0tMi4xNzEgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEyNy4wMjQKKzY4IHx8fCBiYW5nbGFkZXNoIGRoYWthIOCmheCmqOCmsuCmvuCmh+CmqOCnhyB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMS42NjUgdG1fcHRfNj0tMC40NzEgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4wMDcgdG1fcHRfMTA9LTQuMzkzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjM1MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTEzLjQ1NyBsbV8xPS0xMy4wNDUgV29yZFBlbmFsdHk9LTIuMTcxIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMjcuMjY3Cis2OCB8fHwg4KaF4Kao4Kay4Ka+4KaH4Kao4KeHIGJhbmdsYWRlc2ggZGhha2EgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTEuNjY1IHRtX3B0XzY9LTAuNDcxIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0zLjA5OSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy4zNzggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0xNC4wMzggbG1fMT0tMTMuMDQ1IFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTI3LjY1NQorNjggfHx8IOCmheCmqOCmsuCmvuCmh+CmqOCnhyBkaGFrYSBiYW5nbGFkZXNoIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PTAuMDAwIHRtX3B0XzU9LTEuNjY1IHRtX3B0XzY9LTAuNDcxIHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0zLjIxNyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy40MjggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xNC4xNDggbG1fMT0tMTMuMDQ1IFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTI4LjgwNAorNjkgfHx8IGZpcnN0IHdvcmxkIHdhciBnZXJtYW55IOCmueCnh+CmsOCnhyBiZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMC40NjQgdG1fcHRfNj0tNC4wMDQgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuMDM3IHRtX3B0XzEwPS01Ljc1MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy4wNTcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD02LjAwMCBsbV8wPS0yMC4yNjEgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTQ2Ljg2NAorNjkgfHx8IGZpcnN0IHdvcmxkIHdhciBnZXJtYW55IOCmueCnh+CmsOCnhyBlYXNpbHkgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTEuNzYxIHRtX3B0XzY9LTcuODYwIHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjM4NiB0bV9wdF8xMD0tMi45NzAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuODcwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjAuMDkwIGxtXzE9LTI2LjA4OSBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE0Ny4xNzQKKzY5IHx8fCBmaXJzdCB3b3JsZCB3YXIgZ2VybWFueSDgprngp4fgprDgp4cgY2FuIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEwLjQwNyB0bV9wdF82PS00LjIwOSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4zODYgdG1fcHRfMTA9LTYuNjA0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjk3NCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTE5LjgxNyBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNDcuMjA2Cis2OSB8fHwgZmlyc3Qgd29ybGQgd2FyIGdlcm1hbnkg4Ka54KeH4Kaw4KeHIGJlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xMS4wNDUgdG1fcHRfNj0tMTEuNTQwIHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0xLjAxOCB0bV9wdF8xMD0tNy4zNTIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuNTYzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjAuMTA1IGxtXzE9LTIyLjgyOCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE0OC4xMTIKKzY5IHx8fCBnZXJtYW55IGZpcnN0IHdvcmxkIHdhciDgprngp4fgprDgp4cgYmUgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS00LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTExLjA0NSB0bV9wdF82PS0xMS41NDAgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTEuMDUwIHRtX3B0XzEwPS02LjEyOCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi41NjMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBsbV8wPS0xOS45ODQgbG1fMT0tMjIuODI4IFdvcmRQZW5hbHR5PS0zLjQ3NCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTQ5LjYzNQorNjkgfHx8IGZpcnN0IHdvcmxkIHdhciBnZXJtYW4g4Ka54KeH4Kaw4KeHIGJlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0xMi45OTEgdG1fcHRfNj0tMTMuOTUxIHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0xLjAzNyB0bV9wdF8xMD0tOS45NDUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMTczIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS01LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMTkuMTA3IGxtXzE9LTIyLjgyOCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE0OS42ODMKKzY5IHx8fCB0aGUgZmlyc3Qgd29ybGQgd2FyIGdlcm1hbnkg4Ka54KeH4Kaw4KeHIGJlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0xNS43NDAgdG1fcHRfNj0tMTEuNzgzIHRtX3B0Xzc9LTMuMDAwIHRtX3B0Xzg9LTguMTU0IHRtX3B0Xzk9LTEuMTM1IHRtX3B0XzEwPS02LjEyOSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi4xOTEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD00LjAwMCBsbV8wPS0xOS4zMjYgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTQ5LjY4OAorNzAgfHx8IGJ1dCB0aGlzIGlzIHRvIGZvciBldmVuIHJlc2VhcmNoIHRvIGdvaW5nIG9uIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDEuNTk1IHRtX3B0XzY9LTExLjA1NSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuNTAzIHRtX3B0XzEwPS0zMC4xOTggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuNzE5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS0yNS40MDMgbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtODIuNDU3Cis3MCB8fHwgYnV0IHRoaXMgaXMgdG8gZm9yIGV2ZW4gcmVzZWFyY2ggcHJvZ3Jlc3MgZ29pbmcgb24gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0zNy4wODcgdG1fcHRfNj0tMTEuNTA3IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMy41MDMgdG1fcHRfMTA9LTI1LjUwMiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy43MTkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTI3LjE0NSBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC04Mi42ODUKKzcwIHx8fCBidXQgdGhpcyBpcyB0byBldmVuIGZvciByZXNlYXJjaCB0byBnb2luZyBvbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tNDEuNTk1IHRtX3B0XzY9LTExLjA1NSB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuNTAzIHRtX3B0XzEwPS0zMC43MTAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguMTA0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTI0LjY5MyBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC04Mi44MTEKKzcwIHx8fCBidXQgdGhpcyBpcyB0byBldmVuIGZvciByZXNlYXJjaCBwcm9ncmVzcyBnb2luZyBvbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMzcuMDg3IHRtX3B0XzY9LTExLjUwNyB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTMuNTAzIHRtX3B0XzEwPS0yNi4wMTQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguMTA0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTkuMDAwIGxtXzA9LTI2LjQzNSBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC04My4wNDAKKzcwIHx8fCBidXQgdGhpcyBpcyB0byBmb3IgZXZlbiByZXNlYXJjaCB0byBnb2luZyBvbiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tNDEuNDExIHRtX3B0XzY9LTE5LjE3OCB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMy41MDMgdG1fcHRfMTA9LTMwLjE4OSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4wMjMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tMjYuNzE3IGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTg0LjI4MworNzAgfHx8IGJ1dCB0aGlzIGlzIHRvIGZvciBldmVuIHJlc2VhcmNoIHByb2dyZXNzIGdvaW5nIG9uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS0zNi45MDMgdG1fcHRfNj0tMTkuNjMwIHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjUwMyB0bV9wdF8xMD0tMjUuNDkzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjAyMyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS0yOC40NTggbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtODQuNTExCis3MCB8fHwgYnV0IHRoaXMgaXMgdG8gZXZlbiBmb3IgcmVzZWFyY2ggdG8gZ29pbmcgb24gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTQxLjQxMSB0bV9wdF82PS0xOS4xNzggdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuNTAzIHRtX3B0XzEwPS0zMC43MDEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuNDA3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTI2LjAwNyBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC04NC42MzcKKzcwIHx8fCBidXQgdGhpcyBpcyB0byBmb3IgcHJlc2VudGx5IHJlc2VhcmNoIHRvIGdvaW5nIG9uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS00MC43NDIgdG1fcHRfNj0tMTkuMTc4IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjUwMyB0bV9wdF8xMD0tMzAuMjU1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjAyMyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS0yNy4xNjIgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtODQuNzIyCis3MCB8fHwgYnV0IHRoaXMgaXMgdG8gcHJlc2VudGx5IGZvciByZXNlYXJjaCB0byBnb2luZyBvbiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tNDAuNzQyIHRtX3B0XzY9LTE5LjE3OCB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMy41MDMgdG1fcHRfMTA9LTMwLjc2NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy40MDcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMjYuMTcyIGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTg0LjczMAorNzAgfHx8IGJ1dCB0aGlzIGlzIHRvIGV2ZW4gZm9yIHJlc2VhcmNoIHByb2dyZXNzIGdvaW5nIG9uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0zNi45MDMgdG1fcHRfNj0tMTkuNjMwIHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjUwMyB0bV9wdF8xMD0tMjYuMDA1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjQwNyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0yNy43NDggbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtODQuODY2Cis3MSB8fHwg4Ka44KeB4Kaq4Ka+4Kaw4KaP4KaH4KaaIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0wLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9MC4wMDAgdG1fcHRfNT0wLjAwMCB0bV9wdF82PTAuMDAwIHRtX3B0Xzc9MC4wMDAgdG1fcHRfOD0wLjAwMCB0bV9wdF85PTAuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPTAuMDAwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS03LjM1NSBsbV8xPS02LjUyMiBXb3JkUGVuYWx0eT0tMS4zMDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTExMS4zNTgKKzcyIHx8fCBoZSBhcm15IGZvciDgpobgpqjgpqvgpr/gpp8gd2FzIGRlY2xhcmVkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTEyLjA1NCB0bV9wdF82PS0xMy45NzcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPS0xMy40NTUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNjI3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjAuMTgzIGxtXzE9LTI2LjA4OSBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE1NS4wNzEKKzcyIHx8fCBoZSBhcm15IGZvciDgpobgpqjgpqvgpr/gpp8gZGVjbGFyZWQgd2FzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEyLjA1NCB0bV9wdF82PS0xMy45NzcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPS0xMi43MzUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNTQxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgbG1fMD0tMjEuNDUwIGxtXzE9LTI2LjA4OSBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE1NS40NTYKKzcyIHx8fCBoZSBhcm15IGZvciDgpobgpqjgpqvgpr/gpp8gZGVjbGFyZWQgdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE0LjgxMCB0bV9wdF82PS0xNC43ODUgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPS0xNC42MzUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuMDMwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgbG1fMD0tMjAuNTQxIGxtXzE9LTI2LjA4OSBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE1NS44MDEKKzcyIHx8fCBoZSBhcm15IHRvIOCmhuCmqOCmq+Cmv+CmnyB3YXMgZGVjbGFyZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTMuOTQwIHRtX3B0XzY9LTE0LjgxNCB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTE1LjUzNiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC45MzQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0xOS45NzIgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTU2LjQ1OQorNzIgfHx8IGhlIGFybXkgZm9yIOCmhuCmqOCmq+Cmv+CmnyBkZWNsYXJlZCBpbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xNC4xODcgdG1fcHRfNj0tMTUuMDk1IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tMTQuMjA3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjY3MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTIxLjA0MCBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTYuNTIzCis3MiB8fHwgaGUgYXJteSDgpobgpqjgpqvgpr/gpp8gZm9yIHdhcyBkZWNsYXJlZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0xMi4wNTQgdG1fcHRfNj0tMTMuOTc3IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tMTMuOTY3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjAxMSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIGxtXzA9LTIwLjU2MiBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNTYuNzczCis3MiB8fHwgaGUgYXJteSB0byDgpobgpqjgpqvgpr/gpp8gZGVjbGFyZWQgd2FzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEzLjk0MCB0bV9wdF82PS0xNC44MTQgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPS0xNC44MTUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuODQ4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgbG1fMD0tMjEuMjM5IGxtXzE9LTI2LjA4OSBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE1Ni44NDUKKzczIHx8fCBiaHV0dG8g4KaP4KeN4Kav4Ka+4Ka44KeH4Kau4KeN4Kas4Kay4Ka/IOCmrOCmr+CmvOCmleCmnyB0byAyLjUgd2l0aCBhbm5vdW5jZWQgdGhhdCB0aGUgeWFoeWEga2hhbiBtdWppYiBmb3JtIGdvdmVybm1lbnQgZm9yIGZvciDgppzgpr7gpqjgpr7gprLgp4cgaGUgbm8gZ292ZXJubWVudCBoYXMg4Kao4KeH4Kas4KeH4KaoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTEuNTUwIHRtX3B0XzY9LTMyLjcxMSB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTYuMzg3IHRtX3B0XzEwPS0zMi4zNzcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNzI1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBsbV8wPS03NC4yOTkgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU4MS4yMjYKKzczIHx8fCBiaHV0dG8g4KaP4KeN4Kav4Ka+4Ka44KeH4Kau4KeN4Kas4Kay4Ka/IOCmrOCmr+CmvOCmleCmnyB0byAyLjUgd2l0aCBhbm5vdW5jZWQgdGhhdCB0aGUgeWFoeWEga2hhbiB3YXMgZm9ybSBnb3Zlcm5tZW50IGZvciBmb3Ig4Kac4Ka+4Kao4Ka+4Kay4KeHIGhlIG5vIGdvdmVybm1lbnQgaGFzIOCmqOCnh+CmrOCnh+CmqCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTU0LjQ2OCB0bV9wdF82PS0zMi45NjIgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS03LjM2OSB0bV9wdF8xMD0tMzUuNzMzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04LjMzNSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgbG1fMD0tNzIuMTQ4IGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01ODEuNDUzCis3MyB8fHwgYmh1dHRvIOCmj+CnjeCmr+CmvuCmuOCnh+CmruCnjeCmrOCmsuCmvyDgpqzgpq/gprzgppXgpp8gdG8gMi41IHdpdGggYW5ub3VuY2VkIHRoYXQgdGhlIHlhaHlhIGtoYW4gbXVqaWIgZm9ybSBnb3Zlcm5tZW50IGZvciB0byDgppzgpr7gpqjgpr7gprLgp4cgaGUgbm8gZ292ZXJubWVudCBoYXMg4Kao4KeH4Kas4KeH4KaoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTMuMDA1IHRtX3B0XzY9LTMzLjExNiB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTYuMzg3IHRtX3B0XzEwPS0zMy4xNTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNzI1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE2LjAwMCBsbV8wPS03NC4yMDAgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU4MS43MjEKKzczIHx8fCBiaHV0dG8g4KaP4KeN4Kav4Ka+4Ka44KeH4Kau4KeN4Kas4Kay4Ka/IOCmrOCmr+CmvOCmleCmnyB0byAyLjUgd2l0aCBkZWNsYXJlZCBpbiB0aGUgeWFoeWEga2hhbiBtdWppYiBmb3JtIGdvdmVybm1lbnQgZm9yIGZvciDgppzgpr7gpqjgpr7gprLgp4cgaGUgbm8gZ292ZXJubWVudCBoYXMg4Kao4KeH4Kas4KeH4KaoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNTAuNzM1IHRtX3B0XzY9LTI5LjQ5MSB0bV9wdF83PS0xNi4wMDAgdG1fcHRfOD0tNDMuNDg4IHRtX3B0Xzk9LTUuNDU1IHRtX3B0XzEwPS0zOS4zOTAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuMjE5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE3LjAwMCBsbV8wPS03NC4wNDYgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU4MS43ODQKKzczIHx8fCBiaHV0dG8g4KaP4KeN4Kav4Ka+4Ka44KeH4Kau4KeN4Kas4Kay4Ka/IOCmrOCmr+CmvOCmleCmnyB0byAyLjUgYnkgbXVqaWIgYW5ub3VuY2VkIHRoYXQgdGhlIHlhaHlhIGtoYW4gZm9ybSBnb3Zlcm5tZW50IGZvciBmb3Ig4Kac4Ka+4Kao4Ka+4Kay4KeHIGhlIG5vIGdvdmVybm1lbnQgaGFzIOCmqOCnh+CmrOCnh+CmqCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tNTIuNDY0IHRtX3B0XzY9LTMzLjU4OCB0bV9wdF83PS0xNS4wMDAgdG1fcHRfOD0tNDAuNzcwIHRtX3B0Xzk9LTYuMzc2IHRtX3B0XzEwPS0zMy40NDkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTkuMDUzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS03MS4xNDUgbG1fMT0tNzguMjY3IFdvcmRQZW5hbHR5PS0xMC44NTcgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU4MS43ODQKKzczIHx8fCBiaHV0dG8g4KaP4KeN4Kav4Ka+4Ka44KeH4Kau4KeN4Kas4Kay4Ka/IOCmrOCmr+CmvOCmleCmnyB0byAyLjUgd2l0aCBtdWppYiBhbm5vdW5jZWQgdGhhdCB0aGUgeWFoeWEga2hhbiBmb3JtIGdvdmVybm1lbnQgZm9yIGZvciDgppzgpr7gpqjgpr7gprLgp4cgaGUgbm8gZ292ZXJubWVudCBoYXMg4Kao4KeH4Kas4KeH4KaoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS05LjAwMCB0bV9wdF81PS01MS41NTAgdG1fcHRfNj0tMzIuNzExIHRtX3B0Xzc9LTE1LjAwMCB0bV9wdF84PS00MC43NzAgdG1fcHRfOT0tNi4zNzYgdG1fcHRfMTA9LTMzLjExMiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy45ODUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE5LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIGxtXzA9LTcyLjAyMyBsbV8xPS03OC4yNjcgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTgxLjkzMAorNzMgfHx8IGJodXR0byDgpo/gp43gpq/gpr7gprjgp4fgpq7gp43gpqzgprLgpr8g4Kas4Kav4Ka84KaV4KafIHRvIDIuNSB3aXRoIGFubm91bmNlZCB0aGF0IHRoZSB5YWh5YSBraGFuIG11amliIGdvdmVybm1lbnQgZm9yIHRoZSBmb3Ig4Kac4Ka+4Kao4Ka+4Kay4KeHIGhlIG5vIGdvdmVybm1lbnQgaGFzIOCmqOCnh+CmrOCnh+CmqCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTU1LjIxMiB0bV9wdF82PS0zMS45MDAgdG1fcHRfNz0tMTYuMDAwIHRtX3B0Xzg9LTQzLjQ4OCB0bV9wdF85PS01LjUyMiB0bV9wdF8xMD0tNDAuNDUwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjYwMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgbG1fMD0tNzIuMjMyIGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01ODEuOTQxCis3MyB8fHwgYmh1dHRvIOCmj+CnjeCmr+CmvuCmuOCnh+CmruCnjeCmrOCmsuCmvyDgpqzgpq/gprzgppXgpp8gdG8gMi41IHdpdGggYW5ub3VuY2VkIHRoYXQgdGhlIHlhaHlhIGtoYW4gd2FzIGZvcm0gZ292ZXJubWVudCBmb3IgdG8g4Kac4Ka+4Kao4Ka+4Kay4KeHIGhlIG5vIGdvdmVybm1lbnQgaGFzIOCmqOCnh+CmrOCnh+CmqCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTU1LjkyMyB0bV9wdF82PS0zMy4zNjcgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS03LjM2OSB0bV9wdF8xMD0tMzYuNTA3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04LjMzNSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgbG1fMD0tNzIuMDQ5IGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01ODEuOTQ5Cis3MyB8fHwgYmh1dHRvIOCmj+CnjeCmr+CmvuCmuOCnh+CmruCnjeCmrOCmsuCmvyDgpqzgpq/gprzgppXgpp8gdG8gMi41IGFubm91bmNlZCB0aGF0IHdpdGggdGhlIHlhaHlhIGtoYW4gbXVqaWIgZm9ybSBnb3Zlcm5tZW50IGZvciBmb3Ig4Kac4Ka+4Kao4Ka+4Kay4KeHIGhlIG5vIGdvdmVybm1lbnQgaGFzIOCmqOCnh+CmrOCnh+CmqCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTEuMDAwIHRtX3B0XzU9LTUxLjU1MCB0bV9wdF82PS0zMi43MTEgdG1fcHRfNz0tMTUuMDAwIHRtX3B0Xzg9LTQwLjc3MCB0bV9wdF85PS02LjQwNSB0bV9wdF8xMD0tMzMuMjc2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjczNCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgbG1fMD0tNzMuNjM4IGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01ODEuOTc4Cis3MyB8fHwgYmh1dHRvIOCmj+CnjeCmr+CmvuCmuOCnh+CmruCnjeCmrOCmsuCmvyDgpqzgpq/gprzgppXgpp8gdG8gMi41IHdpdGggYW5ub3VuY2VkIHRoYXQgdGhlIHlhaHlhIGtoYW4gbXVqaWIgZm9ybSBnb3Zlcm5tZW50IGZvciBmb3Ig4Kac4Ka+4Kao4Ka+4Kay4KeHIGhlIHRoYXQgZ292ZXJubWVudCBieSDgpqjgp4fgpqzgp4fgpqggbm90IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xNy4wMDAgdG1fcHRfNT0tNTMuMTgzIHRtX3B0XzY9LTI0LjkwNyB0bV9wdF83PS0xNy4wMDAgdG1fcHRfOD0tNDYuMjA2IHRtX3B0Xzk9LTMuODA1IHRtX3B0XzEwPS0zNC43NDEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguODk4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIxLjAwMCBsbV8wPS03Ny43NDIgbG1fMT0tODEuNTI4IFdvcmRQZW5hbHR5PS0xMS4yOTIgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTU4MS45ODQKKzc0IHx8fCBhbmQgY29tcHV0ZXIgd29yZHMgbW9uZXkg4KaX4Kaj4Kao4Ka+4KaV4Ka+4Kaw4KeAIG1hY2hpbmUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tOC40NDggdG1fcHRfNj0tNS41MDYgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuMDAyIHRtX3B0XzEwPS01Ljk0MyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi4wOTIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yMy42ODUgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjUwLjIzOAorNzQgfHx8IHRoZSBjb21wdXRlciB3b3JkcyBtb25leSDgppfgpqPgpqjgpr7gppXgpr7gprDgp4AgbWFjaGluZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMS4zMzcgdG1fcHRfNj0tNy4zNzggdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuMDAzIHRtX3B0XzEwPS03LjM4MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4yOTkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yMi4wMjUgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjUwLjUzMQorNzQgfHx8IGFuZCBjb21wdXRlciB3b3JkIG1lYW5pbmcg4KaX4Kaj4Kao4Ka+4KaV4Ka+4Kaw4KeAIG1hY2hpbmUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tOS4zNjggdG1fcHRfNj0tNi4wNzQgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuMzc1IHRtX3B0XzEwPS04LjYyOCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4zMjUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yMi4yNTYgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjUwLjYzMgorNzQgfHx8IGFuZCBjb21wdXRlciB3b3JkcyBtZWFucyDgppfgpqPgpqjgpr7gppXgpr7gprDgp4AgbWFjaGluZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS05LjU5MiB0bV9wdF82PS01Ljg1OCB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4wMDkgdG1fcHRfMTA9LTcuMzc2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjA3MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTIzLjU1MiBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTEuMTM2Cis3NCB8fHwgYW5kIGNvbXB1dGVyIHdvcmRzIG1lYW5pbmcg4KaX4Kaj4Kao4Ka+4KaV4Ka+4Kaw4KeAIG1hY2hpbmUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tOC41NjUgdG1fcHRfNj0tNS45NjkgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTAuMDA5IHRtX3B0XzEwPS02Ljk3MCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy4wNzMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTUuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD03LjAwMCBsbV8wPS0yMy45MDggbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjUxLjMxMworNzQgfHx8IGFuZCBjb21wdXRlciB3b3JkcyB0aGUg4KaX4Kaj4Kao4Ka+4KaV4Ka+4Kaw4KeAIG1hY2hpbmUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTQuNzc0IHRtX3B0XzY9LTYuMDMwIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0wLjAwOSB0bV9wdF8xMD0tMTIuMDY2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjA3MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTIxLjg5NCBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTEuMzUxCis3NCB8fHwgdGhlIGNvbXB1dGVyIHdvcmRzIG1lYW5zIOCml+Cmo+CmqOCmvuCmleCmvuCmsOCngCBtYWNoaW5lIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEyLjQ4MCB0bV9wdF82PS03LjczMCB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMC4wMDkgdG1fcHRfMTA9LTguODE1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjI4MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTIxLjg5MiBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTEuNDI5Cis3NSB8fHwgb24gNHRoIGp1bHkg4Ken4Ket4Ket4KesIHRoaXMgY29uc3RpdHVlbnRzIGEgaW5kZXBlbmRlbmNlIG5vdGljZSDgppzgpr7gprDgpr8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTIuNDIzIHRtX3B0XzY9LTE0LjgzNyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTExLjU3NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4xOTAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMzYuMzk1IGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ni41MTgKKzc1IHx8fCDgp6fgp63gp63gp6wgb24gNHRoIGp1bHkgdGhpcyBjb25zdGl0dWVudHMgYSBpbmRlcGVuZGVuY2Ugbm90aWNlIOCmnOCmvuCmsOCmvyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0xMi40MjMgdG1fcHRfNj0tMTQuODM3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tMTIuNjQ1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjEwMSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS0zNy44MzggbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg2LjU4NAorNzUgfHx8IG9uIDR0aCBqdWx5IHRoaXMg4Ken4Ket4Ket4KesIGNvbnN0aXR1ZW50cyBhIGluZGVwZW5kZW5jZSBub3RpY2Ug4Kac4Ka+4Kaw4Ka/IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEyLjQyMyB0bV9wdF82PS0xNC44MzcgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0xMS41NzcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNzg0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTM2LjM5NSBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODcuMzM5Cis3NSB8fHwgb24gNHRoIGp1bHkg4Ken4Ket4Ket4KesIHRoaXMgY29uc3RpdHVlbnRzIGluZGVwZW5kZW5jZSBhIG5vdGljZSDgppzgpr7gprDgpr8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTIuNDIzIHRtX3B0XzY9LTE0LjgzNyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi40MTggdG1fcHRfMTA9LTExLjgxNSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy44MzggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgbG1fMD0tMzYuMzk1IGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ny40NjAKKzc1IHx8fCDgp6fgp63gp63gp6wgb24gNHRoIGp1bHkgdGhpcyBjb25zdGl0dWVudHMgaW5kZXBlbmRlbmNlIGEgbm90aWNlIOCmnOCmvuCmsOCmvyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xMi40MjMgdG1fcHRfNj0tMTQuODM3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjQxOCB0bV9wdF8xMD0tMTIuODgyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjc0OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0zNy44MzggbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg3LjUyNQorNzUgfHx8IG9uIDR0aCBqdWx5IOCnp+CnreCnreCnrCB0aGUgY29uc3RpdHVlbnRzIGEgaW5kZXBlbmRlbmNlIG5vdGljZSDgppzgpr7gprDgpr8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTUuNzU4IHRtX3B0XzY9LTE2LjEyOSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4zNjggdG1fcHRfMTA9LTE0LjM3NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi4xMDggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMzUuNDU2IGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ny44NDAKKzc1IHx8fCBvbiA0dGgganVseSDgp6fgp63gp63gp6wgdGhpcyBjb25zdGl0dWVudHMgYSBvZiBub3RpY2Ug4Kac4Ka+4Kaw4Ka/IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE3LjExMiB0bV9wdF82PS0xNC41ODYgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTMuMzY4IHRtX3B0XzEwPS0xNi40MDcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuMzg3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTM0LjUxNyBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODcuODU1Cis3NSB8fHwg4Ken4Ket4Ket4KesIG9uIDR0aCBqdWx5IHRoaXMgY29uc3RpdHVlbnRzIGEgb2Ygbm90aWNlIOCmnOCmvuCmsOCmvyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0xNy4xMTIgdG1fcHRfNj0tMTQuNTg2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0zLjM2OCB0bV9wdF8xMD0tMTcuNDc0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjI5OCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS0zNS45NjAgbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg3LjkyMQorNzUgfHx8IG9uIDR0aCBqdWx5IOCnp+CnreCnreCnrCB0aGlzIGNvbnN0aXR1ZW50cyBhIG5vdGljZSBpbmRlcGVuZGVuY2Ug4Kac4Ka+4Kaw4Ka/IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEyLjQyMyB0bV9wdF82PS0xNC44MzcgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTMuMzY4IHRtX3B0XzEwPS0xMi41MDggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuMzA4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTM2LjM5NSBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODguNTg1Cis3NSB8fHwg4Ken4Ket4Ket4KesIG9uIDR0aCBqdWx5IHRoaXMgY29uc3RpdHVlbnRzIGEgbm90aWNlIGluZGVwZW5kZW5jZSDgppzgpr7gprDgpr8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTIuNDIzIHRtX3B0XzY9LTE0LjgzNyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMy4zNjggdG1fcHRfMTA9LTEzLjU3NSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4yMTggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMzcuODM4IGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4OC42NTEKKzc2IHx8fCBnZXJtYW55IC1scmItIGluIGdlcm1hbiA6IGRldXRzY2hsYW5kIOCmoeCmr+CmvOCmmuCnjSB0aGUg4Kay4Ka+4Kao4KeN4Kaf4KeNIG9mIHByb25vdW5jZWQgWyBkyZTKj3TKg2xhbnQgXSAtcnJiLSB0aGUgaXMgYSBjb3VudHJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS00MC4wMzcgdG1fcHRfNj0tMjcuMDg3IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMi40MTkgdG1fcHRfMTA9LTE0LjQ4MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi4zNTAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTIuMDAwIGxtXzA9LTU0LjUxOSBsbV8xPS02OC40ODQgV29yZFBlbmFsdHk9LTkuNTU0IE9PVlBlbmFsdHk9LTQwMC4wMDAgfHx8IC01MzQuOTYwCis3NiB8fHwgZ2VybWFueSAtbHJiLSBpbiBnZXJtYW4gOiBkZXV0c2NobGFuZCDgpqHgpq/gprzgpprgp40gdGhlIOCmsuCmvuCmqOCnjeCmn+CnjSBvZiBwcm9ub3VuY2VkIFsgZMmUyo90yoNsYW50IF0gLXJyYi0gdGhyb3VnaCBpcyBhIGNvdW50cnkgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTM2Ljc4NyB0bV9wdF82PS0yNy45MzQgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0yLjQzNyB0bV9wdF8xMD0tMTEuOTE5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjEzOCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tNTUuMDkzIGxtXzE9LTY4LjQ4NCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNC45NjcKKzc2IHx8fCBnZXJtYW55IC1scmItIGluIGdlcm1hbiA6IGRldXRzY2hsYW5kIOCmoeCmr+CmvOCmmuCnjSB0aGUg4Kay4Ka+4Kao4KeN4Kaf4KeNIG9mIHByb25vdW5jZWQgWyBkyZTKj3TKg2xhbnQgXSAtcnJiLSBtaWRkbGUgaXMgYSBjb3VudHJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0zNC45MDMgdG1fcHRfNj0tMjcuMDg3IHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMi40MTkgdG1fcHRfMTA9LTkuMzg1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjk3NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMi4wMDAgbG1fMD0tNTYuNjI4IGxtXzE9LTY4LjQ4NCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNS4xMzMKKzc2IHx8fCBnZXJtYW55IC1scmItIGluIGdlcm1hbiA6IGRldXRzY2hsYW5kIOCmoeCmr+CmvOCmmuCnjSB0aGUg4Kay4Ka+4Kao4KeN4Kaf4KeNIG9mIHByb25vdW5jZWQgWyBkyZTKj3TKg2xhbnQgXSAtcnJiLSBjZW50cmFsIGlzIGEgY291bnRyeSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMzUuMTQwIHRtX3B0XzY9LTI3LjIwMCB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTIuNDE5IHRtX3B0XzEwPS0xMC43MjkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuMDM5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEyLjAwMCBsbV8wPS01Ni4zMDkgbG1fMT0tNjguNDg0IFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM1LjE5NAorNzYgfHx8IGdlcm1hbnkgLWxyYi0gaW4gZ2VybWFuIDogZGV1dHNjaGxhbmQg4Kah4Kav4Ka84Kaa4KeNIHRoZSDgprLgpr7gpqjgp43gpp/gp40gdGhlIHByb25vdW5jZWQgWyBkyZTKj3TKg2xhbnQgXSAtcnJiLSB0aGUgaXMgYSBjb3VudHJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDAuMDM0IHRtX3B0XzY9LTI2Ljc1NyB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMDY0IHRtX3B0XzEwPS0yNC40OTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuNDMyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS01NC43MDMgbG1fMT0tNjguNDg0IFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM3LjM0NAorNzYgfHx8IGdlcm1hbnkgLWxyYi0gaW4gZ2VybWFuIDogZGV1dHNjaGxhbmQg4Kah4Kav4Ka84Kaa4KeNIHRoZSDgprLgpr7gpqjgp43gpp/gp40gdGhlIHByb25vdW5jZWQgWyBkyZTKj3TKg2xhbnQgXSAtcnJiLSB0aHJvdWdoIGlzIGEgY291bnRyeSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTM2Ljc4NCB0bV9wdF82PS0yNy42MDQgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0yLjA4MiB0bV9wdF8xMD0tMjEuOTM3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjIyMSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNTUuMjc2IGxtXzE9LTY4LjQ4NCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNy4zNTAKKzc2IHx8fCBnZXJtYW55IC1scmItIGluIGdlcm1hbiA6IGRldXRzY2hsYW5kIOCmoeCmr+CmvOCmmuCnjSBvZiDgprLgpr7gpqjgp43gpp/gp40gdGhlIHByb25vdW5jZWQgWyBkyZTKj3TKg2xhbnQgXSAtcnJiLSB0aGUgaXMgYSBjb3VudHJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tNDAuMDM3IHRtX3B0XzY9LTI3LjA4NyB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMTkzIHRtX3B0XzEwPS0yMy45MDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMTI2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS01NC41MTkgbG1fMT0tNjguNDg0IFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM3LjQyNgorNzYgfHx8IGdlcm1hbnkgLWxyYi0gaW4gZ2VybWFuIDogZGV1dHNjaGxhbmQg4Kah4Kav4Ka84Kaa4KeNIG9mIOCmsuCmvuCmqOCnjeCmn+CnjSB0aGUgcHJvbm91bmNlZCBbIGTJlMqPdMqDbGFudCBdIC1ycmItIHRocm91Z2ggaXMgYSBjb3VudHJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMzYuNzg3IHRtX3B0XzY9LTI3LjkzNCB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMjExIHRtX3B0XzEwPS0yMS4zMzggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuOTE0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS01NS4wOTMgbG1fMT0tNjguNDg0IFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM3LjQzMgorNzYgfHx8IGdlcm1hbnkgLWxyYi0gaW4gZ2VybWFuIDogZGV1dHNjaGxhbmQg4Kah4Kav4Ka84Kaa4KeNIG9mIOCmsuCmvuCmqOCnjeCmn+CnjSBvZiBwcm9ub3VuY2VkIFsgZMmUyo90yoNsYW50IF0gLXJyYi0gdGhlIGlzIGEgY291bnRyeSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTQwLjA0MCB0bV9wdF82PS0yNy40MTcgdG1fcHRfNz0tMTEuMDAwIHRtX3B0Xzg9LTI5Ljg5OCB0bV9wdF85PS0yLjMyMSB0bV9wdF8xMD0tMjMuMzAxIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjgxOSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNTQuMzM2IGxtXzE9LTY4LjQ4NCBXb3JkUGVuYWx0eT0tOS41NTQgT09WUGVuYWx0eT0tNDAwLjAwMCB8fHwgLTUzNy41MDgKKzc2IHx8fCBnZXJtYW55IC1scmItIGluIGdlcm1hbiA6IGRldXRzY2hsYW5kIOCmoeCmr+CmvOCmmuCnjSBvZiDgprLgpr7gpqjgp43gpp/gp40gb2YgcHJvbm91bmNlZCBbIGTJlMqPdMqDbGFudCBdIC1ycmItIHRocm91Z2ggaXMgYSBjb3VudHJ5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMC4wMDAgdG1fcHRfNT0tMzYuNzkwIHRtX3B0XzY9LTI4LjI2NSB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTIuMzQwIHRtX3B0XzEwPS0yMC43MzkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNjA3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS01NC45MDkgbG1fMT0tNjguNDg0IFdvcmRQZW5hbHR5PS05LjU1NCBPT1ZQZW5hbHR5PS00MDAuMDAwIHx8fCAtNTM3LjUxNQorNzcgfHx8IOCmluCnjeCmsOCmv+CmuOCnjeCmn+Cmp+CmsOCnjeCmriB0aGUgbWFpbiByZWxpZ2lvbiAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS04LjY4MiB0bV9wdF82PS0zLjIyMiB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0xLjM2OCB0bV9wdF8xMD0tOC4xOTYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuODA3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgbG1fMD0tMTMuMzkwIGxtXzE9LTE5LjU2NyBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEzNC44MDYKKzc3IHx8fCDgppbgp43gprDgpr/gprjgp43gpp/gpqfgprDgp43gpq4gcnVzc2lhIG1haW4gcmVsaWdpb24gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMi44NjUgdG1fcHRfNj0tMy4yNTcgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4zNzAgdG1fcHRfMTA9LTEuODAxIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0wLjg2MSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIGxtXzA9LTE3LjU0NyBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMzUuNjg0Cis3NyB8fHwg4KaW4KeN4Kaw4Ka/4Ka44KeN4Kaf4Kan4Kaw4KeN4KauIHJ1c3NpYSB0aGUgcmVsaWdpb24gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tNi42NTAgdG1fcHRfNj0tMy4zNDQgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTAuMDAyIHRtX3B0XzEwPS02LjU3MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi4zNjcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0xNi4yODEgbG1fMT0tMTkuNTY3IFdvcmRQZW5hbHR5PS0zLjA0MCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTM2LjUzMQorNzcgfHx8IOCmluCnjeCmsOCmv+CmuOCnjeCmn+Cmp+CmsOCnjeCmriBydXNzaWFyIG1haW4gcmVsaWdpb24gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMi4yNDUgdG1fcHRfNj0tNS4yMDMgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC43MzYgdG1fcHRfMTA9LTAuMDA5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjExNCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIGxtXzA9LTE4LjM2MCBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMzcuNTE0Cis3OCB8fHwgYnV0IOCml+CmsuCmpuCnh+CmsCBlZHVjYXRpb24g4Kaw4KeL4Kau4Ka+4Kao4KeA4KaV4Kaw4Kaj4KeH4KawIOCml+CmpOCmvyB3YXMgc2xvdyBkb3duIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTkuMzg4IHRtX3B0XzY9LTMuMzAxIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0wLjM4NiB0bV9wdF8xMD0tNC4xMDggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuMDYwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMzAuODE5IGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM2MS44NTEKKzc4IHx8fCBidXQg4KaX4Kay4Kam4KeH4KawIHRoZSDgprDgp4vgpq7gpr7gpqjgp4DgppXgprDgpqPgp4fgprAg4KaX4Kak4Ka/IHdhcyBzbG93IGRvd24gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTQuODk2IHRtX3B0XzY9LTMuNzI0IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0wLjUwMyB0bV9wdF8xMD0tOC4zNDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuNTcwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMjkuMzQzIGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM2Mi41OTgKKzc4IHx8fCBidXQg4KaX4Kay4Kam4KeH4KawIGFyZSDgprDgp4vgpq7gpr7gpqjgp4DgppXgprDgpqPgp4fgprAg4KaX4Kak4Ka/IHdhcyBzbG93IGRvd24gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTMuODc0IHRtX3B0XzY9LTQuODc3IHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0xLjM2OCB0bV9wdF8xMD0tNy4yNTggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNjY5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMjkuNjIzIGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM2My45NjAKKzc4IHx8fCBidXQg4KaX4Kay4Kam4KeH4KawIGVkdWNhdGlvbiDgprDgp4vgpq7gpr7gpqjgp4DgppXgprDgpqPgp4fgprAg4KaX4Kak4Ka/IHdhcyB0b28gc2xvdyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS0xMC43MzEgdG1fcHRfNj0tMy41MjQgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTEuMDE4IHRtX3B0XzEwPS00LjEwOCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi43NTMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0zMS43NjAgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzY0LjExMgorNzkgfHx8IHN1YmplY3QgOiBnbnUgZm91bmRhdGlvbiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMi4yNDQgdG1fcHRfNj0tMS43NjggdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTAuNjU2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjY4NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTExLjgyMiBsbV8xPS0xNi4zMDYgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0yNi4yMzMKKzc5IHx8fCBjYXRlZ29yeSA6IGdudSBmb3VuZGF0aW9uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0yLjAxMiB0bV9wdF82PS0yLjIzOCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMC42NDIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuMDQ3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMTIuMDAxIGxtXzE9LTE2LjMwNiBXb3JkUGVuYWx0eT0tMi42MDYgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTI2LjY5NQorNzkgfHx8IHN1YmplY3QtY2xhc3MgOiBnbnUgZm91bmRhdGlvbiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMS45NjYgdG1fcHRfNj0tMy43ODcgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTAuNjY5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjAxMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTEyLjI4MyBsbV8xPS0xNi4zMDYgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0yNy45MTMKKzc5IHx8fCBzdWJqZWN0IDogZ29udSBmb3VuZGF0aW9uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0yLjEyNiB0bV9wdF82PS0zLjMwOCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjA1MCB0bV9wdF8xMD0tMC40NTEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuMzkyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMTIuMzI0IGxtXzE9LTE2LjMwNiBXb3JkUGVuYWx0eT0tMi42MDYgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTI3Ljk0OQorNzkgfHx8IHRvcGljcyA6IGdudSBmb3VuZGF0aW9uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0yLjEyNCB0bV9wdF82PS00LjEwMCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjAwMCB0bV9wdF8xMD0tMC42NDIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuMjIwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMTIuNTE0IGxtXzE9LTE2LjMwNiBXb3JkUGVuYWx0eT0tMi42MDYgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTI4LjQwMworNzkgfHx8IGNhdGVnb3J5IDogZ29udSBmb3VuZGF0aW9uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0xLjg5NCB0bV9wdF82PS0zLjc3OSB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjA1MCB0bV9wdF8xMD0tMC40MzcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNzUxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMTIuNTAzIGxtXzE9LTE2LjMwNiBXb3JkUGVuYWx0eT0tMi42MDYgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTI4LjQxMQorODAgfHx8IGVjb25vbWljIHBvbGljeSBhbmQgcmV2ZW51ZSDgpqjgp4DgpqTgpr/gppXgp4fgppMgaXQgc3R1ZHkgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTEuMzkxIHRtX3B0XzY9LTEwLjI4MyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS4zODYgdG1fcHRfMTA9LTExLjE5NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi44MTYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgbG1fMD0tMjUuMzQ0IGxtXzE9LTI5LjM1MCBXb3JkUGVuYWx0eT0tNC4zNDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2MS43MjAKKzgwIHx8fCBlY29ub21pYyBwb2xpY3kgYW5kIHRheCDgpqjgp4DgpqTgpr/gppXgp4fgppMgaXQgc3R1ZHkgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tMTEuNzEwIHRtX3B0XzY9LTEwLjI4MyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMS4zODYgdG1fcHRfMTA9LTEyLjE3NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi44MTYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgbG1fMD0tMjUuMTc4IGxtXzE9LTI5LjM1MCBXb3JkUGVuYWx0eT0tNC4zNDMgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE2MS44MzAKKzgwIHx8fCBlY29ub21pYyBwb2xpY3kgYW5kIHJldmVudWUg4Kao4KeA4Kak4Ka/4KaV4KeH4KaTIHN0dWR5aW5nIGl0IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTExLjUyOSB0bV9wdF82PS0xMS42MDUgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0xMC4wOTcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuMDM5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI0LjQ5OSBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjIuNzE1Cis4MCB8fHwgZWNvbm9taWMgcG9saWN5IGFuZCBmb3Ig4Kao4KeA4Kak4Ka/4KaV4KeH4KaTIGl0IHN0dWR5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTE2LjYwMSB0bV9wdF82PS0xMC45NzYgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMDE4IHRtX3B0XzEwPS0xNy4wMTUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNTA5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTIzLjM1OSBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjIuNzcwCis4MCB8fHwgZWNvbm9taWMgcG9saWN5IGFuZCB0YXgg4Kao4KeA4Kak4Ka/4KaV4KeH4KaTIHN0dWR5aW5nIGl0IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTExLjg0OCB0bV9wdF82PS0xMS42MDUgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMzY4IHRtX3B0XzEwPS0xMS4wNzggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuMDM5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI0LjMzMyBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjIuODI1Cis4MCB8fHwgZWNvbm9taWMgcG9saWN5IGFuZCByZXZlbnVlIOCmqOCngOCmpOCmv+CmleCnh+CmkyB0aGlzIHN0dWR5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTEyLjk4NSB0bV9wdF82PS0xMS4yMzAgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTEuMzg2IHRtX3B0XzEwPS0xMy4xMjkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNDQ5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTI1LjE4OSBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjIuODgyCis4MCB8fHwgZWNvbm9taWMgcG9saWN5IHRheCBhbmQg4Kao4KeA4Kak4Ka/4KaV4KeH4KaTIGl0IHN0dWR5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTExLjcxMCB0bV9wdF82PS0xMC4yODMgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMDE4IHRtX3B0XzEwPS0xMi44NzAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuODI4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTI0LjU5MiBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjMuMTI1Cis4MCB8fHwgZWNvbm9taWMgcG9saWN5IGFuZCDgpqjgp4DgpqTgpr/gppXgp4fgppMgZm9yIGl0IHN0dWR5IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE2LjYwMSB0bV9wdF82PS0xMC45NzYgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMDE4IHRtX3B0XzEwPS0xNi4wNDggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNjI3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIzLjE4NyBsbV8xPS0yOS4zNTAgV29yZFBlbmFsdHk9LTQuMzQzIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xNjMuMzEyCis4MSB8fHwgYW1vbmcgdGhlbSBhcmUgOiBtYXkgYmUg4Kak4KeL4Kau4Ka+4KawIGdldCBzZWVuIOCmk+CmsOCnhyB0aGlzIGFueSDgprjgp43gpqjgp4fgprkt4Ka44KeB4Kaw4Kan4KeB4Kao4KeAIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTI2LjM1MCB0bV9wdF82PS0xNi41MTYgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTEuNzM2IHRtX3B0XzEwPS02LjYyMyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi4yNDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTQxLjE2NCBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTcuNjk3Cis4MSB8fHwgYW1vbmcgdGhlc2UgYXJlIDogbWF5IGJlIOCmpOCni+CmruCmvuCmsCBnZXQgc2VlbiDgppPgprDgp4cgdGhpcyBhbnkg4Ka44KeN4Kao4KeH4Ka5LeCmuOCngeCmsOCmp+CngeCmqOCngCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0yNy4yOTMgdG1fcHRfNj0tMTYuNTQ4IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0zLjAwMCB0bV9wdF8xMD0tNy45OTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuNDkzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS00MS4zOTggbG1fMT0tNDguOTE3IFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzk3Ljc5OAorODEgfHx8IGFtb25nIHRoZW0gYXJlIDogbWF5IGJlIOCmpOCni+CmruCmvuCmsCBnZXQgaXMg4KaT4Kaw4KeHIHRoaXMgYW55IOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMzAuMzA1IHRtX3B0XzY9LTE3LjA2OSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS43MzggdG1fcHRfMTA9LTEwLjY0MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi43NzkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTM5LjU5NSBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTcuOTM3Cis4MSB8fHwgYW1vbmcgdGhlc2UgYXJlIDogbWF5IGJlIOCmpOCni+CmruCmvuCmsCBnZXQgaXMg4KaT4Kaw4KeHIHRoaXMgYW55IOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMzEuMjQ4IHRtX3B0XzY9LTE3LjEwMSB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMy4wMDIgdG1fcHRfMTA9LTEyLjAxNyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS4wMzIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTM5LjgyOSBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTguMDM4Cis4MSB8fHwgYW1vbmcgdGhlbSBhcmUgOiB3b3VsZCBoYXZlIOCmpOCni+CmruCmvuCmsCBnZXQgc2VlbiDgppPgprDgp4cgdGhpcyBhbnkg4Ka44KeN4Kao4KeH4Ka5LeCmuOCngeCmsOCmp+CngeCmqOCngCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yNC42OTIgdG1fcHRfNj0tMTUuOTU2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjM2OCB0bV9wdF8xMD0tNi42MjMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNTI3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00Mi4xNjcgbG1fMT0tNDguOTE3IFdvcmRQZW5hbHR5PS02Ljk0OSBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzk4LjA4NgorODEgfHx8IGFtb25nIHRoZXNlIGFyZSA6IHdvdWxkIGhhdmUg4Kak4KeL4Kau4Ka+4KawIGdldCBzZWVuIOCmk+CmsOCnhyB0aGlzIGFueSDgprjgp43gpqjgp4fgprkt4Ka44KeB4Kaw4Kan4KeB4Kao4KeAIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS03LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTI1LjYzNSB0bV9wdF82PS0xNS45ODkgdG1fcHRfNz0tNy4wMDAgdG1fcHRfOD0tMTkuMDI2IHRtX3B0Xzk9LTMuMDAwIHRtX3B0XzEwPS02LjYxMyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC40OTMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTQyLjQwMSBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTguMTcyCis4MSB8fHwgYW1vbmcgdGhlbSBhcmUgOiBtYXkgYmUg4Kak4KeL4Kau4Ka+4KawIG51bWJlcnMgaXMg4KaT4Kaw4KeHIHRoaXMgYW55IOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMzAuNjQ1IHRtX3B0XzY9LTE3LjA2OSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS43MzggdG1fcHRfMTA9LTEzLjQwOCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi43NzkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTM5LjE1OSBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTguMTc4Cis4MSB8fHwgYW1vbmcgdGhlbSBhcmUgOiB3b3VsZCBoYXZlIOCmpOCni+CmruCmvuCmsCBnZXQgaXMg4KaT4Kaw4KeHIHRoaXMgYW55IOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjguNjQ3IHRtX3B0XzY9LTE2LjUwOSB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4zNzAgdG1fcHRfMTA9LTEwLjY0MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy4wNjYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTQwLjU5OSBsbV8xPS00OC45MTcgV29yZFBlbmFsdHk9LTYuOTQ5IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTguMzI2Cis4MSB8fHwgYW1vbmcgdGhlbSBhcmUgOiBtYXkgYmUg4Kak4KeL4Kau4Ka+4KawIGdldCBzZWVuIOCmk+CmsOCnhyB0aGlzIG5vIOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMjYuNjU4IHRtX3B0XzY9LTE3LjEyMyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS43MzYgdG1fcHRfMTA9LTYuNjc3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjI4NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tNDEuMTQ3IGxtXzE9LTQ4LjkxNyBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5OC4zMjYKKzgxIHx8fCBhbW9uZyB0aGVzZSBhcmUgOiBtYXkgYmUg4Kak4KeL4Kau4Ka+4KawIGdldCBzZWVuIOCmk+CmsOCnhyB0aGlzIG5vIOCmuOCnjeCmqOCnh+CmuS3gprjgp4HgprDgpqfgp4Hgpqjgp4AgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMjcuNjAwIHRtX3B0XzY9LTE3LjE1NSB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMy4wMDAgdG1fcHRfMTA9LTguMDUyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjUzOCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tNDEuMzgxIGxtXzE9LTQ4LjkxNyBXb3JkUGVuYWx0eT0tNi45NDkgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5OC40MjgKKzgyIHx8fCBvbiAyM3JkIGFwcmlsIDE5OTIgc2F0eWFqaXQgZGllZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS03LjU0NCB0bV9wdF82PS0xMi4xNjcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTEuMzY5IHRtX3B0XzEwPS0zLjk2OSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy4xODAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTcuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD00LjAwMCBsbV8wPS0xNC4zOTQgbG1fMT0tMjYuMDg5IFdvcmRQZW5hbHR5PS0zLjkwOSBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNDUuMzM1Cis4MiB8fHwgb24gMjNyZCBhcHJpbCAxOTkyIHNhdHlhaml0IGV4cGlyZWQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tNi4yOTEgdG1fcHRfNj0tMTMuNTUzIHRtX3B0Xzc9LTUuMDAwIHRtX3B0Xzg9LTEzLjU5MCB0bV9wdF85PS0yLjAwMSB0bV9wdF8xMD0tMS41MTcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuMzU4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS03LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMTQuNjU5IGxtXzE9LTI2LjA4OSBXb3JkUGVuYWx0eT0tMy45MDkgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTQ1LjY1MworODIgfHx8IHNhdHlhaml0IGRpZWQgb24gMjNyZCBhcHJpbCAxOTkyIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTcuNTQ0IHRtX3B0XzY9LTEyLjE2NyB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMi4zNjkgdG1fcHRfMTA9LTQuNTIyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjQ4NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTE0LjE3MSBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC00OC4yNjAKKzgzIHx8fCB0aGlzIHRpbWUgbmF6cnVsIG1lZGljYWwg4Kaw4Ka/4Kaq4KeL4Kaw4KeN4KafIHN0YXkgZmFtb3VzIOCmmuCmv+CmleCmv+CnjuCmuOCmleCmpuCnh+CmsCB0byBzZW50IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE2LjAzMCB0bV9wdF82PS0xNi42NTMgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMDUyIHRtX3B0XzEwPS0xMy45NjMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMzg5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTM3LjI1NiBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODYuMTk3Cis4MyB8fHwgdGhpcyB0aW1lIG5henJ1bCBtZWRpY2FsIOCmsOCmv+CmquCni+CmsOCnjeCmnyBzZW50IHRvIHN0YXkgZmFtb3VzIOCmmuCmv+CmleCmv+CnjuCmuOCmleCmpuCnh+CmsCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xNi4wMzAgdG1fcHRfNj0tMTYuNjUzIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjQyMCB0bV9wdF8xMD0tMTIuMTMyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjMzMyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTM0LjAwNCBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODYuMjYzCis4MyB8fHwgdGhpcyB0aW1lIG5henJ1bCBtZWRpY2FsIOCmsOCmv+CmquCni+CmsOCnjeCmnyBzdGF5IGZhbW91cyBzZW50IHRvIOCmmuCmv+CmleCmv+CnjuCmuOCmleCmpuCnh+CmsCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS0xNi4wMzAgdG1fcHRfNj0tMTYuNjUzIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjQyMCB0bV9wdF8xMD0tMTEuODAxIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjIzNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTM1Ljc1NiBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODYuMzQ1Cis4MyB8fHwgdGhpcyB0aW1lIG5henJ1bCBtZWRpY2FsIOCmsOCmv+CmquCni+CmsOCnjeCmnyBzdGF5IGZhbW91cyDgpprgpr/gppXgpr/gp47gprjgppXgpqbgp4fgprAgdG8gc2VuZCB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0xOS4xNDMgdG1fcHRfNj0tMTEuMjQ4IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjA1MiB0bV9wdF8xMD0tMTEuNjYwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjM4OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tMzcuMjc1IGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ni40NzMKKzgzIHx8fCB0aGlzIHRpbWUgbmF6cnVsIG1lZGljYWwg4Kaw4Ka/4Kaq4KeL4Kaw4KeN4KafIGVhcm5pbmcgZmFtb3VzIOCmmuCmv+CmleCmv+CnjuCmuOCmleCmpuCnh+CmsCB0byBzZW50IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTE3LjAyMCB0bV9wdF82PS0xNy43NTIgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMDUyIHRtX3B0XzEwPS0xMy40NTIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMzg5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTM3LjE0NyBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODYuNDkzCis4MyB8fHwgdGhpcyB0aW1lIG5henJ1bCBtZWRpY2FsIOCmsOCmv+CmquCni+CmsOCnjeCmnyBzdGF5IGZhbW91cyDgpprgpr/gppXgpr/gp47gprjgppXgpqbgp4fgprAgdG8gc2VuZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0xNS40NjIgdG1fcHRfNj0tMTMuMzU1IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0xLjE1MiB0bV9wdF8xMD0tMTkuODg1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01Ljc2MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD04LjAwMCBsbV8wPS0zNS43ODcgbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjg2LjU1NAorODMgfHx8IHRoaXMgdGltZSBuYXpydWwgbWVkaWNhbCDgprDgpr/gpqrgp4vgprDgp43gpp8gc3RheSBmYW1vdXMg4Kaa4Ka/4KaV4Ka/4KeO4Ka44KaV4Kam4KeH4KawIHRvIHNlbnQgdG8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMTkuMDY1IHRtX3B0XzY9LTEwLjkwNyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMS4xODggdG1fcHRfMTA9LTEyLjM1NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4yOTAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTM4LjIyMSBsbV8xPS00Mi4zOTUgV29yZFBlbmFsdHk9LTYuMDgwIE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODYuNTk0Cis4MyB8fHwgdGhpcyB0aW1lIG5henJ1bCBtZWRpY2FsIOCmsOCmv+CmquCni+CmsOCnjeCmnyBlYXJuaW5nIGZhbW91cyDgpprgpr/gppXgpr/gp47gprjgppXgpqbgp4fgprAgdG8gc2VuZCB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMC4xMzIgdG1fcHRfNj0tMTIuMzQ3IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjA1MiB0bV9wdF8xMD0tMTEuMTUwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjM4OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tMzcuMTY2IGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ni43NzAKKzgzIHx8fCB0aGlzIHRpbWUgbmF6cnVsIG1lZGljYWwg4Kaw4Ka/4Kaq4KeL4Kaw4KeN4KafIGVhcm5pbmcgZmFtb3VzIOCmmuCmv+CmleCmv+CnjuCmuOCmleCmpuCnh+CmsCB0byBzZW5kIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTYuMDAwIHRtX3B0XzU9LTE2LjQ1MSB0bV9wdF82PS0xNC40NTQgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTEuMTUyIHRtX3B0XzEwPS0xOS4zNzQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuNzYzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTM1LjY3OCBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yODYuODUxCis4MyB8fHwgdGhpcyB0aW1lIG5henJ1bCBtZWRpY2FsIOCmsOCmv+CmquCni+CmsOCnjeCmnyBlYXJuaW5nIGZhbW91cyDgpprgpr/gppXgpr/gp47gprjgppXgpqbgp4fgprAgdG8gc2VudCB0byAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMC4wNTUgdG1fcHRfNj0tMTIuMDA2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0xLjE4OCB0bV9wdF8xMD0tMTEuODQzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjI5MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tMzguMTEyIGxtXzE9LTQyLjM5NSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI4Ni44OTAKKzg0IHx8fCBhY3RlZCBpbiBkaWZmZXJlbnQgdGltZXMgcmFuaSDgpq7gp4Hgppbgpr7gprDgp43gppzgp4AgZGlmZmVyZW50IOCmpuCmvuCmpOCmrOCnjeCmryBhcmUgY29ubmVjdGVkIHdpdGgg4Kal4KeH4KaV4KeH4Kab4KeH4KaoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIyLjM4MCB0bV9wdF82PS0xNC41NDkgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTMuNDI0IHRtX3B0XzEwPS0xMy41NjIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNTkxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00MC45NTggbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzk2LjI1MworODQgfHx8IGFjdGluZyBpbiBkaWZmZXJlbnQgdGltZXMgcmFuaSDgpq7gp4Hgppbgpr7gprDgp43gppzgp4AgZGlmZmVyZW50IOCmpuCmvuCmpOCmrOCnjeCmryBhcmUgY29ubmVjdGVkIHdpdGgg4Kal4KeH4KaV4KeH4Kab4KeH4KaoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIzLjAzMiB0bV9wdF82PS0xNS40MTQgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTMuNTUzIHRtX3B0XzEwPS0xNC4zNzMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuMjg0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTExLjAwMCBsbV8wPS00MC45MjQgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzk3LjE5MgorODQgfHx8IGFjdGVkIGluIGRpZmZlcmVudCB0aW1lIHJhbmkg4Kau4KeB4KaW4Ka+4Kaw4KeN4Kac4KeAIGRpZmZlcmVudCDgpqbgpr7gpqTgpqzgp43gpq8gYXJlIGNvbm5lY3RlZCB3aXRoIOCmpeCnh+CmleCnh+Cmm+Cnh+CmqCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMi42MDIgdG1fcHRfNj0tMTMuMDMzIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0zLjQyNCB0bV9wdF8xMD0tMTMuNTYyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjU5MSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDIuMTg3IGxtXzE9LTQ1LjY1NiBXb3JkUGVuYWx0eT0tNi41MTQgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5Ny4yOTcKKzg0IHx8fCBhY3RlZCBpbiBkaWZmZXJlbnQgdGltZXMgcmFuaSDgpq7gp4Hgppbgpr7gprDgp43gppzgp4AgdmFyaW91cyDgpqbgpr7gpqTgpqzgp43gpq8gYXJlIGNvbm5lY3RlZCB3aXRoIOCmpeCnh+CmleCnh+Cmm+Cnh+CmqCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yMi4zOTYgdG1fcHRfNj0tMTUuNzcxIHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0zLjQyNCB0bV9wdF8xMD0tMTMuNTAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03Ljc3NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tNDEuNDA5IGxtXzE9LTQ1LjY1NiBXb3JkUGVuYWx0eT0tNi41MTQgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5Ny42MzUKKzg0IHx8fCBkaWZmZXJlbnQgdGltZXMgLCBhY3RlZCByYW5pIOCmruCngeCmluCmvuCmsOCnjeCmnOCngCBkaWZmZXJlbnQg4Kam4Ka+4Kak4Kas4KeN4KavIGFyZSBjb25uZWN0ZWQgd2l0aCDgpqXgp4fgppXgp4fgppvgp4fgpqggLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMjIuNTkxIHRtX3B0XzY9LTEzLjcwMiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMy4xNTMgdG1fcHRfMTA9LTE0LjI4OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy45MDUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tNDEuNzc3IGxtXzE9LTQ1LjY1NiBXb3JkUGVuYWx0eT0tNi41MTQgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTM5Ny45NjEKKzg0IHx8fCBhY3RlZCAsIGRpZmZlcmVudCB0aW1lcyByYW5pIOCmruCngeCmluCmvuCmsOCnjeCmnOCngCBkaWZmZXJlbnQg4Kam4Ka+4Kak4Kas4KeN4KavIGFyZSBjb25uZWN0ZWQgd2l0aCDgpqXgp4fgppXgp4fgppvgp4fgpqggLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOC4wMDAgdG1fcHRfNT0tMjIuNTkxIHRtX3B0XzY9LTEzLjcwMiB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi43OTIgdG1fcHRfMTA9LTE0LjU3NiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS44OTcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTEuMDAwIGxtXzA9LTQzLjA1NiBsbV8xPS00NS42NTYgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC0zOTguMDk5Cis4NCB8fHwgaW4gZGlmZmVyZW50IHRpbWVzIGFjdGVkIHJhbmkg4Kau4KeB4KaW4Ka+4Kaw4KeN4Kac4KeAIGRpZmZlcmVudCDgpqbgpr7gpqTgpqzgp43gpq8gYXJlIGNvbm5lY3RlZCB3aXRoIOCmpeCnh+CmleCnh+Cmm+Cnh+CmqCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0yMi4zODAgdG1fcHRfNj0tMTQuNTQ5IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0zLjc4NiB0bV9wdF8xMD0tMTIuNDg0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjY1NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS00MS40NjYgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtMzk4LjE0MgorODUgfHx8IGJlbmdhbGkgbGl0ZXJhdHVyZSBhbmQgY3VsdHVyZSBhIHNwZWNpYWwgY29udHJpYnV0aW9uIG9uIOCmuOCnjeCmrOCngOCmleCng+CmpOCmv+CmuOCnjeCmrOCmsOCngeCmqiB5ZWFyIG9uIDl0aCBkZWNlbWJlciAsIGRoYWthIHVuaXZlcnNpdHkgaGUgaG9ub3Jhcnkg4Kah4Ka/LuCmsuCmv+CmnyDgpongpqrgpr7gpqfgpr/gpqTgp4cgYXdhcmRlZCB3aXRoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTUuNTkxIHRtX3B0XzY9LTI2Ljk3NyB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTQuMTA2IHRtX3B0XzEwPS0yNi40NjAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNjEzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgbG1fMD0tNjIuMDgwIGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00NTkuMzI3Cis4NSB8fHwgYmVuZ2FsaSBsaXRlcmF0dXJlIGFuZCBjdWx0dXJlIGEgc3BlY2lhbCBjb250cmlidXRpb24gb24g4Ka44KeN4Kas4KeA4KaV4KeD4Kak4Ka/4Ka44KeN4Kas4Kaw4KeB4KaqIHllYXIgb24gOXRoIGRlY2VtYmVyICwgZGhha2EgdW5pdmVyc2l0eSB3YXMgaG9ub3Jhcnkg4Kah4Ka/LuCmsuCmv+CmnyDgpongpqrgpr7gpqfgpr/gpqTgp4cgYXdhcmRlZCB3aXRoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tNTYuNjIxIHRtX3B0XzY9LTI3LjE5OCB0bV9wdF83PS0xMy4wMDAgdG1fcHRfOD0tMzUuMzM0IHRtX3B0Xzk9LTQuNDc0IHRtX3B0XzEwPS0yOC4zODggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMzE4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNS4wMDAgbG1fMD0tNjAuNzM0IGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00NTkuMzM5Cis4NSB8fHwgYmVuZ2FsaSBsaXRlcmF0dXJlIGFuZCBjdWx0dXJlIGhpcyBzcGVjaWFsIGNvbnRyaWJ1dGlvbiBvbiDgprjgp43gpqzgp4DgppXgp4PgpqTgpr/gprjgp43gpqzgprDgp4HgpqogeWVhciBvbiA5dGggZGVjZW1iZXIgLCBkaGFrYSB1bml2ZXJzaXR5IGhlIGhvbm9yYXJ5IOCmoeCmvy7gprLgpr/gpp8g4KaJ4Kaq4Ka+4Kan4Ka/4Kak4KeHIGF3YXJkZWQgd2l0aCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTUwLjE3NiB0bV9wdF82PS0yMi42MTcgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS0zLjczOCB0bV9wdF8xMD0tMjYuNTg1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjkyNSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIGxtXzA9LTY0LjE2NiBsbV8xPS03OC4yNjcgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDU5LjQxMworODUgfHx8IGJlbmdhbGkgbGl0ZXJhdHVyZSBhbmQgY3VsdHVyZSBoaXMgc3BlY2lhbCBjb250cmlidXRpb24gb24g4Ka44KeN4Kas4KeA4KaV4KeD4Kak4Ka/4Ka44KeN4Kas4Kaw4KeB4KaqIHllYXIgb24gOXRoIGRlY2VtYmVyICwgZGhha2EgdW5pdmVyc2l0eSB3YXMgaG9ub3Jhcnkg4Kah4Ka/LuCmsuCmv+CmnyDgpongpqrgpr7gpqfgpr/gpqTgp4cgYXdhcmRlZCB3aXRoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNTEuMjA1IHRtX3B0XzY9LTIyLjgzOCB0bV9wdF83PS0xNC4wMDAgdG1fcHRfOD0tMzguMDUyIHRtX3B0Xzk9LTQuMTA2IHRtX3B0XzEwPS0yOC41MTQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuNjMwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgbG1fMD0tNjIuODIwIGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00NTkuNDI1Cis4NSB8fHwgYmVuZ2FsaSBsaXRlcmF0dXJlIGFuZCBjdWx0dXJlIGluIHNwZWNpYWwgY29udHJpYnV0aW9uIG9uIOCmuOCnjeCmrOCngOCmleCng+CmpOCmv+CmuOCnjeCmrOCmsOCngeCmqiB5ZWFyIG9uIDl0aCBkZWNlbWJlciAsIGRoYWthIHVuaXZlcnNpdHkgaGUgaG9ub3Jhcnkg4Kah4Ka/LuCmsuCmv+CmnyDgpongpqrgpr7gpqfgpr/gpqTgp4cgYXdhcmRlZCB3aXRoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNTQuMjQwIHRtX3B0XzY9LTI0Ljg2NyB0bV9wdF83PS0xNC4wMDAgdG1fcHRfOD0tMzguMDUyIHRtX3B0Xzk9LTMuNzM4IHRtX3B0XzEwPS0yOS43NTUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuNTQ5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgbG1fMD0tNjEuOTk5IGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00NjAuMDI5Cis4NSB8fHwgYmVuZ2FsaSBsaXRlcmF0dXJlIGFuZCBjdWx0dXJlIGluIHNwZWNpYWwgY29udHJpYnV0aW9uIG9uIOCmuOCnjeCmrOCngOCmleCng+CmpOCmv+CmuOCnjeCmrOCmsOCngeCmqiB5ZWFyIG9uIDl0aCBkZWNlbWJlciAsIGRoYWthIHVuaXZlcnNpdHkgd2FzIGhvbm9yYXJ5IOCmoeCmvy7gprLgpr/gpp8g4KaJ4Kaq4Ka+4Kan4Ka/4Kak4KeHIGF3YXJkZWQgd2l0aCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTU1LjI2OSB0bV9wdF82PS0yNS4wODggdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS00LjEwNiB0bV9wdF8xMD0tMzEuNjg0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS04LjI1MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIGxtXzA9LTYwLjY1MyBsbV8xPS03OC4yNjcgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDYwLjA0MQorODUgfHx8IGJlbmdhbGkgbGl0ZXJhdHVyZSBhbmQgY3VsdHVyZSBhIHNwZWNpYWwgY29udHJpYnV0aW9uIG9uIOCmuOCnjeCmrOCngOCmleCng+CmpOCmv+CmuOCnjeCmrOCmsOCngeCmqiB5ZWFyIG9uIDl0aCBkZWNlbWJlciAsIGRoYWthIHVuaXZlcnNpdHkgaGUgaG9ub3Jhcnkg4Kah4Ka/LuCmsuCmv+CmnyDgpongpqrgpr7gpqfgpr/gpqTgp4cgYXdhcmRlZCB3aXRoIHRoZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTQuMDAwIHRtX3B0XzU9LTU4Ljc5OSB0bV9wdF82PS0yNS4xOTEgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS00LjEwNiB0bV9wdF8xMD0tMjIuNTg3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjc4NiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNy4wMDAgbG1fMD0tNjIuOTUwIGxtXzE9LTgxLjUyOCBXb3JkUGVuYWx0eT0tMTEuMjkyIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00NjAuMjM5Cis4NSB8fHwgYmVuZ2FsaSBsaXRlcmF0dXJlIGFuZCBjdWx0dXJlIGEgc3BlY2lhbCBjb250cmlidXRpb24gb24g4Ka44KeN4Kas4KeA4KaV4KeD4Kak4Ka/4Ka44KeN4Kas4Kaw4KeB4KaqIHllYXIgb24gOXRoIGRlY2VtYmVyICwgZGhha2EgdW5pdmVyc2l0eSB3YXMgaG9ub3Jhcnkg4Kah4Ka/LuCmsuCmv+CmnyDgpongpqrgpr7gpqfgpr/gpqTgp4cgYXdhcmRlZCB3aXRoIHRoZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTQuMDAwIHRtX3B0XzU9LTU5LjgyOCB0bV9wdF82PS0yNS40MTIgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS00LjQ3NCB0bV9wdF8xMD0tMjQuNTE2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjQ5MCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNy4wMDAgbG1fMD0tNjEuNjA0IGxtXzE9LTgxLjUyOCBXb3JkUGVuYWx0eT0tMTEuMjkyIE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00NjAuMjUxCis4NSB8fHwgYmVuZ2FsaSBsaXRlcmF0dXJlIGFuZCBjdWx0dXJlIGl0cyBzcGVjaWFsIGNvbnRyaWJ1dGlvbiBvbiDgprjgp43gpqzgp4DgppXgp4PgpqTgpr/gprjgp43gpqzgprDgp4HgpqogeWVhciBvbiA5dGggZGVjZW1iZXIgLCBkaGFrYSB1bml2ZXJzaXR5IGhlIGhvbm9yYXJ5IOCmoeCmvy7gprLgpr/gpp8g4KaJ4Kaq4Ka+4Kan4Ka/4Kak4KeHIGF3YXJkZWQgd2l0aCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTMuMDAwIHRtX3B0XzU9LTUxLjA2NSB0bV9wdF82PS0yNC41NzkgdG1fcHRfNz0tMTQuMDAwIHRtX3B0Xzg9LTM4LjA1MiB0bV9wdF85PS0zLjczOCB0bV9wdF8xMD0tMjcuMDU1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjkzMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjAuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTYuMDAwIGxtXzA9LTYzLjc2NiBsbV8xPS03OC4yNjcgV29yZFBlbmFsdHk9LTEwLjg1NyBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDYwLjU5MAorODUgfHx8IGJlbmdhbGkgbGl0ZXJhdHVyZSBhbmQgY3VsdHVyZSBpdHMgc3BlY2lhbCBjb250cmlidXRpb24gb24g4Ka44KeN4Kas4KeA4KaV4KeD4Kak4Ka/4Ka44KeN4Kas4Kaw4KeB4KaqIHllYXIgb24gOXRoIGRlY2VtYmVyICwgZGhha2EgdW5pdmVyc2l0eSB3YXMgaG9ub3Jhcnkg4Kah4Ka/LuCmsuCmv+CmnyDgpongpqrgpr7gpqfgpr/gpqTgp4cgYXdhcmRlZCB3aXRoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMy4wMDAgdG1fcHRfNT0tNTIuMDk0IHRtX3B0XzY9LTI0LjgwMCB0bV9wdF83PS0xNC4wMDAgdG1fcHRfOD0tMzguMDUyIHRtX3B0Xzk9LTQuMTA2IHRtX3B0XzEwPS0yOC45ODMgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuNjM0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNi4wMDAgbG1fMD0tNjIuNDIwIGxtXzE9LTc4LjI2NyBXb3JkUGVuYWx0eT0tMTAuODU3IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00NjAuNjAyCis4NiB8fHwga29sa2F0YSBkdXJnYSBwdWphIGNpdHkgb2YgdG91cmlzbSDgpobgppXgprDgp43gprfgpqPgppMgaXMgYWxzbyBhIHJlYXNvbiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMzguMzQ4IHRtX3B0XzY9LTE4LjEyNiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4xMzUgdG1fcHRfMTA9LTExLjMwNiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS44NzggdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjguODI0IGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4MC4zODAKKzg2IHx8fCBrb2xrYXRhIGR1cmdhIHB1amEgb2YgdGhlIHRvdXJpc20g4KaG4KaV4Kaw4KeN4Ka34Kaj4KaTIGlzIGFsc28gYSByZWFzb24gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTQxLjgzMSB0bV9wdF82PS0xNy44MDcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMjcxIHRtX3B0XzEwPS0xNS44OTYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuOTQ3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTI2LjM4NSBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODAuNTY0Cis4NiB8fHwga29sa2F0YSBkdXJnYSBwdWphIHRvdXJpc20gb2YgdGhlIOCmhuCmleCmsOCnjeCmt+Cmo+CmkyBpcyBhbHNvIGEgcmVhc29uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS01LjAwMCB0bV9wdF81PS00MS44MzEgdG1fcHRfNj0tMTcuODA3IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0yLjE4NSB0bV9wdF8xMD0tMTEuNzIyIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjgyOSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yNi43NTIgbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgwLjgyMworODYgfHx8IHRoZSBkdXJnYSBwdWphIGNpdHkgb2YgdG91cmlzbSDgpobgppXgprDgp43gprfgpqPgppMgaXMgYWxzbyBhIHJlYXNvbiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tNDIuMDU2IHRtX3B0XzY9LTE4LjIxNiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4xMzUgdG1fcHRfMTA9LTEzLjQwNCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS40NzMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjguMzkyIGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4MC45ODYKKzg2IHx8fCB0aGUgZHVyZ2EgcHVqYSBvZiB0aGUgdG91cmlzbSDgpobgppXgprDgp43gprfgpqPgppMgaXMgYWxzbyBhIHJlYXNvbiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tNDUuNTM4IHRtX3B0XzY9LTE3Ljg5NyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4yNzEgdG1fcHRfMTA9LTE3Ljk5NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi41NDIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ni4wMDAgbG1fMD0tMjUuOTUzIGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4MS4xNjkKKzg2IHx8fCB0aGUgZHVyZ2EgcHVqYSB0b3VyaXNtIG9mIHRoZSDgpobgppXgprDgp43gprfgpqPgppMgaXMgYWxzbyBhIHJlYXNvbiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tNDUuNTM4IHRtX3B0XzY9LTE3Ljg5NyB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4xODUgdG1fcHRfMTA9LTEzLjgyMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi40MjQgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjYuMzE5IGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4MS40MjkKKzg2IHx8fCB0b3VyaXNtIG9mIGtvbGthdGEgZHVyZ2EgcHVqYSB0aGUg4KaG4KaV4Kaw4KeN4Ka34Kaj4KaTIGlzIGFsc28gYSByZWFzb24gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTQxLjgzMSB0bV9wdF82PS0xNy44MDcgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMDY4IHRtX3B0XzEwPS0xMC45MDkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuMjg2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTI2LjA4NyBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xODEuNDMwCis4NiB8fHwgdG91cmlzbSBvZiBrb2xrYXRhIGR1cmdhIHB1amEgY2l0eSDgpobgppXgprDgp43gprfgpqPgppMgaXMgYWxzbyBhIHJlYXNvbiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMzguMzQ4IHRtX3B0XzY9LTE4LjEyNiB0bV9wdF83PS02LjAwMCB0bV9wdF84PS0xNi4zMDggdG1fcHRfOT0tMi4wNjggdG1fcHRfMTA9LTguNjEwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjU5MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBsbV8wPS0yNy4zMzQgbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTgxLjU3NAorODYgfHx8IGtvbGthdGEgZHVyZ2EgcHVqYSB0b3VyaXNtIG9mIGNpdHkg4KaG4KaV4Kaw4KeN4Ka34Kaj4KaTIGlzIGFsc28gYSByZWFzb24gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS02LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTM4LjM0OCB0bV9wdF82PS0xOC4xMjYgdG1fcHRfNz0tNi4wMDAgdG1fcHRfOD0tMTYuMzA4IHRtX3B0Xzk9LTIuMTg1IHRtX3B0XzEwPS04LjIyOSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNi4yMDUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMjguNzkwIGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTE4MS42NjIKKzg2IHx8fCBrb2xrYXRhIGR1cmdhIHB1amEgY2l0eSBvZiB0b3VyaXNtIOCmhuCmleCmsOCnjeCmt+Cmo+CmkyDgpqzgpp/gp4cgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTYuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMTEuMTkyIHRtX3B0XzY9LTYuNDk2IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0xLjEzNSB0bV9wdF8xMD0tMTEuMzE1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01Ljg4MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTI4LjE0NCBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNjQuNjc2Cis4NyB8fHwgYnV0IG1hbnkgb2YgZWFzdCBnZXJtYW4gc3RhcnRlZCBsaXZpbmcgaW4gZWNvbm9taWNhbGx5IHJlYWNoIGFuZCBkZW1vY3JhdGljIHdlc3QgZ2VybWFueSAsIGVhc3QgZ2VybWFueSBnb3Zlcm5tZW50IGJ1aWx0IGEgd2FsbCBpbiBiZXJsaW4gaW4gMTk2MSBhbmQgcmVpbmZvcmNlZCBpdHMgYm91bmRhcmllcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS03My44MDIgdG1fcHRfNj0tNTMuNzU3IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0zLjAwNyB0bV9wdF8xMD0tNy4xNzUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuODY5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0zMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTQ5LjE1NCBsbV8xPS0xMDAuNTYzIFdvcmRQZW5hbHR5PS0xMy44OTcgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTE2Mi42NjgKKzg3IHx8fCBidXQgbWFueSBvZiBlYXN0IGdlcm1hbnkgc3RhcnRlZCBsaXZpbmcgaW4gZWNvbm9taWNhbGx5IHJlYWNoIGFuZCBkZW1vY3JhdGljIHdlc3QgZ2VybWFueSAsIGVhc3QgZ2VybWFueSBnb3Zlcm5tZW50IGJ1aWx0IGEgd2FsbCBpbiBiZXJsaW4gaW4gMTk2MSBhbmQgcmVpbmZvcmNlZCBpdHMgYm91bmRhcmllcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS03LjAwMCB0bV9wdF81PS03Ny4wNzUgdG1fcHRfNj0tNTYuNTY1IHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS00LjAwNyB0bV9wdF8xMD0tOS44ODQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuNTYyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0zMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTcuMDAwIGxtXzA9LTQ3LjYzNyBsbV8xPS0xMDAuNTYzIFdvcmRQZW5hbHR5PS0xMy44OTcgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTE2NC4zMzUKKzg3IHx8fCBidXQgd2hlbiBsYWtocyBlYXN0IGdlcm1hbiBzdGFydGVkIGxpdmluZyBpbiBlY29ub21pY2FsbHkgcmVhY2ggYW5kIGRlbW9jcmF0aWMgd2VzdCBnZXJtYW55ICwgZWFzdCBnZXJtYW55IGdvdmVybm1lbnQgYnVpbHQgYSB3YWxsIGluIGJlcmxpbiBpbiAxOTYxIGFuZCByZWluZm9yY2VkIGl0cyBib3VuZGFyaWVzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS01LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTUuMDAwIHRtX3B0XzU9LTcxLjMzNSB0bV9wdF82PS01Ny4zODkgdG1fcHRfNz0tNS4wMDAgdG1fcHRfOD0tMTMuNTkwIHRtX3B0Xzk9LTMuMzY4IHRtX3B0XzEwPS0wLjc0NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMS4yNjkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTMwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tNTEuODg5IGxtXzE9LTEwMC41NjMgV29yZFBlbmFsdHk9LTEzLjg5NyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTY1LjA0OAorODcgfHx8IGJ1dCB3aGVuIG9mIGVhc3QgZ2VybWFuIHN0YXJ0ZWQgbGl2aW5nIGluIGVjb25vbWljYWxseSByZWFjaCBhbmQgZGVtb2NyYXRpYyB3ZXN0IGdlcm1hbnkgLCBlYXN0IGdlcm1hbnkgZ292ZXJubWVudCBidWlsdCBhIHdhbGwgaW4gYmVybGluIGluIDE5NjEgYW5kIHJlaW5mb3JjZWQgaXRzIGJvdW5kYXJpZXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTUuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNS4wMDAgdG1fcHRfNT0tNzYuODkyIHRtX3B0XzY9LTU3LjQ3MSB0bV9wdF83PS01LjAwMCB0bV9wdF84PS0xMy41OTAgdG1fcHRfOT0tMy4zNzUgdG1fcHRfMTA9LTUuMTAzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjY3NCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMzAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS01MC4xMTMgbG1fMT0tMTAwLjU2MyBXb3JkUGVuYWx0eT0tMTMuODk3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xNjUuMjE5Cis4NyB8fHwgYnV0IG1hbnkgbGFraHMgZWFzdCBnZXJtYW4gc3RhcnRlZCBsaXZpbmcgaW4gZWNvbm9taWNhbGx5IHJlYWNoIGFuZCBkZW1vY3JhdGljIHdlc3QgZ2VybWFueSAsIGVhc3QgZ2VybWFueSBnb3Zlcm5tZW50IGJ1aWx0IGEgd2FsbCBpbiBiZXJsaW4gaW4gMTk2MSBhbmQgcmVpbmZvcmNlZCBpdHMgYm91bmRhcmllcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS02OC4yNDUgdG1fcHRfNj0tNTMuNjc1IHRtX3B0Xzc9LTYuMDAwIHRtX3B0Xzg9LTE2LjMwOCB0bV9wdF85PS0zLjAwMCB0bV9wdF8xMD0tMi44MjAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuNDYzIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0zMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTUzLjY3MSBsbV8xPS0xMDAuNTYzIFdvcmRQZW5hbHR5PS0xMy44OTcgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTE2NS44ODgKKzg4IHx8fCBmaXJzdCBvbmUgaXMgdGhlIOCmqOCmv+CmsOCnjeCmrOCmvuCmlSBmaXJzdCBzZXZlbiDgpq7gpr/gpqjgpr/gpp8gd2hpY2gg4Kaa4Ka+4Kaw4KeB4KawIOCmj+CmleCmmOCnh+Cmr+CmvOCnh+CmruCmvyBsaWZlIHNob3duIGxldmVsIGFuZCBzZWNvbmQgb25lIGlzICIgdGhlIOCmpuCni+CmsuCmqOCmvuCmsCBzY2VuZSAiIHdoZXJlIOCmmuCmvuCmsOCngSDgpoXgpq7gprLgp4fgprAgZm9yIGhpcyBsb3ZlIOCmruCngeCmluCni+CmruCngeCmluCmvyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTcuMDAwIHRtX3B0XzU9LTYzLjQ3NiB0bV9wdF82PS0zNi4xODIgdG1fcHRfNz0tMjAuMDAwIHRtX3B0Xzg9LTU0LjM2MCB0bV9wdF85PS00LjEwNiB0bV9wdF8xMD0tMzcuOTQ0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMC42MDYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIzLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTI1LjAwMCBsbV8wPS0xMDIuMDQ4IGxtXzE9LTEwNC4zNTYgV29yZFBlbmFsdHk9LTE0LjMzMiBPT1ZQZW5hbHR5PS04MDAuMDAwIHx8fCAtMTAzNS42MTEKKzg4IHx8fCBmaXJzdCBvbmUgaXMgZmlsbSDgpqjgpr/gprDgp43gpqzgpr7gppUgZmlyc3Qgc2V2ZW4g4Kau4Ka/4Kao4Ka/4KafIHdoaWNoIOCmmuCmvuCmsOCngeCmsCDgpo/gppXgppjgp4fgpq/gprzgp4fgpq7gpr8gbGlmZSBzaG93biBsZXZlbCBhbmQgc2Vjb25kIG9uZSBpcyAiIHRoZSDgpqbgp4vgprLgpqjgpr7gprAgc2NlbmUgIiB3aGVyZSDgpprgpr7gprDgp4Eg4KaF4Kau4Kay4KeH4KawIGZvciBoaXMgbG92ZSDgpq7gp4Hgppbgp4vgpq7gp4Hgppbgpr8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE3LjAwMCB0bV9wdF81PS01OS42OTUgdG1fcHRfNj0tMzYuMzQ2IHRtX3B0Xzc9LTIwLjAwMCB0bV9wdF84PS01NC4zNjAgdG1fcHRfOT0tMy4xNTYgdG1fcHRfMTA9LTMzLjc0MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOS4yMjAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIzLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTI1LjAwMCBsbV8wPS0xMDQuNjE1IGxtXzE9LTEwNC4zNTYgV29yZFBlbmFsdHk9LTE0LjMzMiBPT1ZQZW5hbHR5PS04MDAuMDAwIHx8fCAtMTAzNS43NjAKKzg4IHx8fCBmaXJzdCBvbmUgaXMgdGhlIOCmqOCmv+CmsOCnjeCmrOCmvuCmlSBmaXJzdCBzZXZlbiDgpq7gpr/gpqjgpr/gpp8gd2hpY2gg4Kaa4Ka+4Kaw4KeB4KawIOCmj+CmleCmmOCnh+Cmr+CmvOCnh+CmruCmvyBsaWZlIHNob3duIHRoZW0gYW5kIHNlY29uZCBvbmUgaXMgIiB0aGUg4Kam4KeL4Kay4Kao4Ka+4KawIHNjZW5lICIgd2hlcmUg4Kaa4Ka+4Kaw4KeBIOCmheCmruCmsuCnh+CmsCBmb3IgaGlzIGxvdmUg4Kau4KeB4KaW4KeL4Kau4KeB4KaW4Ka/IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xOC4wMDAgdG1fcHRfNT0tNjQuNjE3IHRtX3B0XzY9LTM2LjE4MiB0bV9wdF83PS0yMC4wMDAgdG1fcHRfOD0tNTQuMzYwIHRtX3B0Xzk9LTQuNzM4IHRtX3B0XzEwPS0zOS4xMTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTExLjk5MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MjYuMDAwIGxtXzA9LTEwMS43ODUgbG1fMT0tMTA0LjM1NiBXb3JkUGVuYWx0eT0tMTQuMzMyIE9PVlBlbmFsdHk9LTgwMC4wMDAgfHx8IC0xMDM1Ljg1MworODggfHx8IGZpcnN0IG9uZSBpcyB0aGUg4Kao4Ka/4Kaw4KeN4Kas4Ka+4KaVIGZpcnN0IHNldmVuIOCmruCmv+CmqOCmv+CmnyB3aGljaCDgpprgpr7gprDgp4HgprAg4KaP4KaV4KaY4KeH4Kav4Ka84KeH4Kau4Ka/IGxpZmUgc2hvd24gc291bmQgYW5kIHNlY29uZCBvbmUgaXMgIiB0aGUg4Kam4KeL4Kay4Kao4Ka+4KawIHNjZW5lICIgd2hlcmUg4Kaa4Ka+4Kaw4KeBIOCmheCmruCmsuCnh+CmsCBmb3IgaGlzIGxvdmUg4Kau4KeB4KaW4KeL4Kau4KeB4KaW4Ka/IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xOC4wMDAgdG1fcHRfNT0tNjIuMjA1IHRtX3B0XzY9LTM2LjE4MiB0bV9wdF83PS0yMC4wMDAgdG1fcHRfOD0tNTQuMzYwIHRtX3B0Xzk9LTQuNzM4IHRtX3B0XzEwPS0zNy42NzIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTExLjk5MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MjYuMDAwIGxtXzA9LTEwMi41NTAgbG1fMT0tMTA0LjM1NiBXb3JkUGVuYWx0eT0tMTQuMzMyIE9PVlBlbmFsdHk9LTgwMC4wMDAgfHx8IC0xMDM1Ljk2MworODggfHx8IGZpcnN0IG9uZSBpcyBmaWxtIOCmqOCmv+CmsOCnjeCmrOCmvuCmlSBmaXJzdCBzZXZlbiDgpq7gpr/gpqjgpr/gpp8gd2hpY2gg4Kaa4Ka+4Kaw4KeB4KawIOCmj+CmleCmmOCnh+Cmr+CmvOCnh+CmruCmvyBsaWZlIHNob3duIHRoZW0gYW5kIHNlY29uZCBvbmUgaXMgIiB0aGUg4Kam4KeL4Kay4Kao4Ka+4KawIHNjZW5lICIgd2hlcmUg4Kaa4Ka+4Kaw4KeBIOCmheCmruCmsuCnh+CmsCBmb3IgaGlzIGxvdmUg4Kau4KeB4KaW4KeL4Kau4KeB4KaW4Ka/IC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xOC4wMDAgdG1fcHRfNT0tNjAuODM2IHRtX3B0XzY9LTM2LjM0NiB0bV9wdF83PS0yMC4wMDAgdG1fcHRfOD0tNTQuMzYwIHRtX3B0Xzk9LTMuNzg4IHRtX3B0XzEwPS0zNC45MTYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEwLjYwNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMjMuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MjYuMDAwIGxtXzA9LTEwNC4zNTIgbG1fMT0tMTA0LjM1NiBXb3JkUGVuYWx0eT0tMTQuMzMyIE9PVlBlbmFsdHk9LTgwMC4wMDAgfHx8IC0xMDM2LjAwMgorODggfHx8IGZpcnN0IG9uZSBpcyBmaWxtIOCmqOCmv+CmsOCnjeCmrOCmvuCmlSBmaXJzdCBzZXZlbiDgpq7gpr/gpqjgpr/gpp8gd2hpY2gg4Kaa4Ka+4Kaw4KeB4KawIOCmj+CmleCmmOCnh+Cmr+CmvOCnh+CmruCmvyBsaWZlIHNob3duIHNvdW5kIGFuZCBzZWNvbmQgb25lIGlzICIgdGhlIOCmpuCni+CmsuCmqOCmvuCmsCBzY2VuZSAiIHdoZXJlIOCmmuCmvuCmsOCngSDgpoXgpq7gprLgp4fgprAgZm9yIGhpcyBsb3ZlIOCmruCngeCmluCni+CmruCngeCmluCmvyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTguMDAwIHRtX3B0XzU9LTU4LjQyNCB0bV9wdF82PS0zNi4zNDYgdG1fcHRfNz0tMjAuMDAwIHRtX3B0Xzg9LTU0LjM2MCB0bV9wdF85PS0zLjc4OCB0bV9wdF8xMD0tMzMuNDY5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMC42MDYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIzLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTI2LjAwMCBsbV8wPS0xMDUuMTE3IGxtXzE9LTEwNC4zNTYgV29yZFBlbmFsdHk9LTE0LjMzMiBPT1ZQZW5hbHR5PS04MDAuMDAwIHx8fCAtMTAzNi4xMTIKKzg4IHx8fCBmaXJzdCBvbmUgaXMgdGhlIOCmqOCmv+CmsOCnjeCmrOCmvuCmlSBmaXJzdCBzZXZlbiDgpq7gpr/gpqjgpr/gpp8gd2hpY2gg4Kaa4Ka+4Kaw4KeB4KawIOCmj+CmleCmmOCnh+Cmr+CmvOCnh+CmruCmvyBsaWZlIHNob3duIGxldmVsIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyAiIOCmpuCni+CmsuCmqOCmvuCmsCBzY2VuZSAiIHdoZXJlIOCmmuCmvuCmsOCngSDgpoXgpq7gprLgp4fgprAgZm9yIGhpcyBsb3ZlIOCmruCngeCmluCni+CmruCngeCmluCmvyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTYuMDAwIHRtX3B0XzU9LTYzLjQ3NiB0bV9wdF82PS0zNi4xODIgdG1fcHRfNz0tMjEuMDAwIHRtX3B0Xzg9LTU3LjA3OCB0bV9wdF85PS0zLjc0NSB0bV9wdF8xMD0tMzkuMTk0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xNS41MDYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIzLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIzLjAwMCBsbV8wPS05OC43NjEgbG1fMT0tMTA0LjM1NiBXb3JkUGVuYWx0eT0tMTQuMzMyIE9PVlBlbmFsdHk9LTgwMC4wMDAgfHx8IC0xMDM2LjQyNgorODggfHx8IGZpcnN0IG9uZSBpcyBmaWxtIOCmqOCmv+CmsOCnjeCmrOCmvuCmlSBmaXJzdCBzZXZlbiDgpq7gpr/gpqjgpr/gpp8gd2hpY2gg4Kaa4Ka+4Kaw4KeB4KawIOCmj+CmleCmmOCnh+Cmr+CmvOCnh+CmruCmvyBsaWZlIHNob3duIGxldmVsIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyAiIOCmpuCni+CmsuCmqOCmvuCmsCBzY2VuZSAiIHdoZXJlIOCmmuCmvuCmsOCngSDgpoXgpq7gprLgp4fgprAgZm9yIGhpcyBsb3ZlIOCmruCngeCmluCni+CmruCngeCmluCmvyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTYuMDAwIHRtX3B0XzU9LTU5LjY5NSB0bV9wdF82PS0zNi4zNDYgdG1fcHRfNz0tMjEuMDAwIHRtX3B0Xzg9LTU3LjA3OCB0bV9wdF85PS0yLjc5NSB0bV9wdF8xMD0tMzQuOTkxIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xNC4xMjAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIzLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIzLjAwMCBsbV8wPS0xMDEuMzI5IGxtXzE9LTEwNC4zNTYgV29yZFBlbmFsdHk9LTE0LjMzMiBPT1ZQZW5hbHR5PS04MDAuMDAwIHx8fCAtMTAzNi41NzUKKzg4IHx8fCBmaXJzdCBvbmUgaXMgdGhlIOCmqOCmv+CmsOCnjeCmrOCmvuCmlSBmaXJzdCBzZXZlbiDgpq7gpr/gpqjgpr/gpp8gd2hpY2gg4Kaa4Ka+4Kaw4KeB4KawIOCmj+CmleCmmOCnh+Cmr+CmvOCnh+CmruCmvyBsaWZlIHNob3duIGxldmVsIGFuZCBzZWNvbmQgb25lIGlzICIgdGhlIOCmpuCni+CmsuCmqOCmvuCmsCBzY2VuZSAiIHdoZXJlIOCmmuCmvuCmsOCngSDgpoXgpq7gprLgp4fgprAgbG92ZSBmb3IgaGlzIOCmruCngeCmluCni+CmruCngeCmluCmvyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMjAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTUuMDAwIHRtX3B0XzU9LTYzLjQ3NiB0bV9wdF82PS0zNi4xODIgdG1fcHRfNz0tMjAuMDAwIHRtX3B0Xzg9LTU0LjM2MCB0bV9wdF85PS00LjA3NSB0bV9wdF8xMD0tMzcuNTA5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMS42MjcgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIzLjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIzLjAwMCBsbV8wPS0xMDEuOTI5IGxtXzE9LTEwNC4zNTYgV29yZFBlbmFsdHk9LTE0LjMzMiBPT1ZQZW5hbHR5PS04MDAuMDAwIHx8fCAtMTAzNy42MTUKKzg4IHx8fCBmaXJzdCBvbmUgaXMgZmlsbSDgpqjgpr/gprDgp43gpqzgpr7gppUgZmlyc3Qgc2V2ZW4g4Kau4Ka/4Kao4Ka/4KafIHdoaWNoIOCmmuCmvuCmsOCngeCmsCDgpo/gppXgppjgp4fgpq/gprzgp4fgpq7gpr8gbGlmZSBzaG93biBsZXZlbCBhbmQgc2Vjb25kIG9uZSBpcyAiIHRoZSDgpqbgp4vgprLgpqjgpr7gprAgc2NlbmUgIiB3aGVyZSDgpprgpr7gprDgp4Eg4KaF4Kau4Kay4KeH4KawIGxvdmUgZm9yIGhpcyDgpq7gp4Hgppbgp4vgpq7gp4Hgppbgpr8gLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTE1LjAwMCB0bV9wdF81PS01OS42OTUgdG1fcHRfNj0tMzYuMzQ2IHRtX3B0Xzc9LTIwLjAwMCB0bV9wdF84PS01NC4zNjAgdG1fcHRfOT0tMy4xMjQgdG1fcHRfMTA9LTMzLjMwNyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMTAuMjQwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yMy4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yMy4wMDAgbG1fMD0tMTA0LjQ5NiBsbV8xPS0xMDQuMzU2IFdvcmRQZW5hbHR5PS0xNC4zMzIgT09WUGVuYWx0eT0tODAwLjAwMCB8fHwgLTEwMzcuNzY0Cis4OSB8fHwgMTh0aCBjZW50dXJ5IGEgZ3JvdXAg4Kaa4Ka/4Kao4KeN4Kak4Ka+4Kas4Ka/4KamIGFuZCB3cml0ZXIgaW5jb21lIGFuZCBwcm9kdWN0aW9uIOCmmuCmleCnjeCmsOCmvuCmleCmvuCmsCBjdXJyZW50IHRocm91Z2ggZWNvbm9taWMgdGhvdWdodHMgZGV2ZWxvcG1lbnQgaXQgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zMy43NDMgdG1fcHRfNj0tMTUuMjMxIHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tNi4wNjggdG1fcHRfMTA9LTE0LjM0MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4yNTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIGxtXzA9LTU1Ljg3MiBsbV8xPS02MS45NjEgV29yZFBlbmFsdHk9LTguNjg2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMzAuNDA4Cis4OSB8fHwgMTh0aCBjZW50dXJ5IGEgZ3JvdXAg4Kaa4Ka/4Kao4KeN4Kak4Ka+4Kas4Ka/4KamIGFuZCB3cml0ZXIgaW5jb21lIGFuZCBwcm9kdWN0aW9uIOCmmuCmleCnjeCmsOCmvuCmleCmvuCmsCBjdXJyZW50IHRocm91Z2ggZWNvbm9taWMgdGhvdWdodHMgZGV2ZWxvcG1lbnQgcGVvcGxlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMS4wMDAgdG1fcHRfNT0tMzMuMzk5IHRtX3B0XzY9LTE1LjkyNCB0bV9wdF83PS0xMS4wMDAgdG1fcHRfOD0tMjkuODk4IHRtX3B0Xzk9LTYuMDY4IHRtX3B0XzEwPS0xNC4zNDIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuMjU1IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEzLjAwMCBsbV8wPS01NS44ODYgbG1fMT0tNjEuOTYxIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzMwLjU5NworODkgfHx8IDE4IGNlbnR1cnkgYSBncm91cCDgpprgpr/gpqjgp43gpqTgpr7gpqzgpr/gpqYgYW5kIHdyaXRlciBpbmNvbWUgYW5kIHByb2R1Y3Rpb24g4Kaa4KaV4KeN4Kaw4Ka+4KaV4Ka+4KawIGN1cnJlbnQgdGhyb3VnaCBlY29ub21pYyB0aG91Z2h0cyBkZXZlbG9wbWVudCBpdCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTIuMDAwIHRtX3B0XzU9LTMyLjI5MyB0bV9wdF82PS0xMy44MDYgdG1fcHRfNz0tMTIuMDAwIHRtX3B0Xzg9LTMyLjYxNiB0bV9wdF85PS01LjExOCB0bV9wdF8xMD0tMTYuMTY5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjcyNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xNC4wMDAgbG1fMD0tNTcuMDExIGxtXzE9LTYxLjk2MSBXb3JkUGVuYWx0eT0tOC42ODYgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTMzMS4xMDUKKzg5IHx8fCAxOCBjZW50dXJ5IGEgZ3JvdXAg4Kaa4Ka/4Kao4KeN4Kak4Ka+4Kas4Ka/4KamIGFuZCB3cml0ZXIgaW5jb21lIGFuZCBwcm9kdWN0aW9uIOCmmuCmleCnjeCmsOCmvuCmleCmvuCmsCBjdXJyZW50IHRocm91Z2ggZWNvbm9taWMgdGhvdWdodHMgZGV2ZWxvcG1lbnQgcGVvcGxlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xMi4wMDAgdG1fcHRfNT0tMzEuOTQ5IHRtX3B0XzY9LTE0LjQ5OSB0bV9wdF83PS0xMi4wMDAgdG1fcHRfOD0tMzIuNjE2IHRtX3B0Xzk9LTUuMTE4IHRtX3B0XzEwPS0xNi4xNjkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuNzI2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTE0LjAwMCBsbV8wPS01Ny4wMjYgbG1fMT0tNjEuOTYxIFdvcmRQZW5hbHR5PS04LjY4NiBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMzMxLjI5NQorODkgfHx8IDE4dGggY2VudHVyeSBhIGdyb3VwIOCmmuCmv+CmqOCnjeCmpOCmvuCmrOCmv+CmpiBhbmQgd3JpdGVyIGluY29tZSBhbmQgcHJvZHVjdGlvbiDgpprgppXgp43gprDgpr7gppXgpr7gprAgY3VycmVudCB0aHJvdWdoIGVjb25vbWljIHRob3VnaHRzIGRldmVsb3BtZW50IGVtcGVyb3IgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTExLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTExLjAwMCB0bV9wdF81PS0zMC44MTAgdG1fcHRfNj0tMTUuOTI0IHRtX3B0Xzc9LTExLjAwMCB0bV9wdF84PS0yOS44OTggdG1fcHRfOT0tNi4wNjggdG1fcHRfMTA9LTEyLjczMiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC4yNTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTE2LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTMuMDAwIGxtXzA9LTU3LjQyNSBsbV8xPS02MS45NjEgV29yZFBlbmFsdHk9LTguNjg2IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0zMzEuNTg4Cis5MCB8fHwgdGhlIGFyb3VzYWwgYWN0aXZpdGllcyBiZWZvcmUgcGVuZXRyYXRpbmcgbWFsZSBvcmdhbiBpbnRvIHZhZ2luYSBpcyBjYWxsZWQgZm9yZXBsYXkgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTMuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tNDAuOTM3IHRtX3B0XzY9LTIxLjU5NCB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0xLjAwNyB0bV9wdF8xMD0tMC40MTUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTAuOTIwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMy4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTIyLjIxMCBsbV8xPS00MS4xMzAgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC02Ny4wNzUKKzkwIHx8fCB0aGUgYXJvdXNhbCBhY3Rpdml0aWVzIGJlZm9yZSBwZW5ldHJhdGluZyBtYWxlIG9yZ2FuIGludG8gdmFnaW5hIGNhbGxlZCBmb3JlcGxheSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0zNy4xMjIgdG1fcHRfNj0tMjEuNTM1IHRtX3B0Xzc9LTMuMDAwIHRtX3B0Xzg9LTguMTU0IHRtX3B0Xzk9LTIuMDAwIHRtX3B0XzEwPS0wLjAwOSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMC4wMDMgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEyLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMjQuMjA5IGxtXzE9LTM3Ljg2OSBXb3JkUGVuYWx0eT0tNi4wODAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTY3LjA4MQorOTAgfHx8IHRoZSBhcm91c2FsIGFjdGl2aXRpZXMgYmVmb3JlIHBlbmV0cmF0aW5nIG1hbGUgb3JnYW4gaW50byB2YWdpbmEgaXMgY2FsbGVkIHN0aW11bGF0aW9uIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS00MS44OTAgdG1fcHRfNj0tMzEuMDc2IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTEuMDAwIHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0wLjY5MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0yMi42OTEgbG1fMT0tMzcuMzM4IFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNjcuNzYwCis5MCB8fHwgdmFnaW5hIGFyb3VzYWwgYWN0aXZpdGllcyBiZWZvcmUgcGVuZXRyYXRpbmcgbWFsZSBvcmdhbiBpbnRvIHZhZ2luYSBpcyBjYWxsZWQgc3RpbXVsYXRpb24gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTIuMDAwIHRtX3B0XzU9LTM2LjY1MCB0bV9wdF82PS0zMC45MzIgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMS4xMzUgdG1fcHRfMTA9LTIuMTk3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjA5OSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0yNS40OTQgbG1fMT0tMzUuOTA5IFdvcmRQZW5hbHR5PS02LjA4MCBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNjkuNDI0Cis5MCB8fHwgdGhlIGFyb3VzYWwgYWN0aXZpdGllcyBiZWZvcmUgcGVuZXRyYXRpbmcgbWFsZSBvcmdhbiBpbnRvIHZhZ2luYSBjYWxsZWQgc3RpbXVsYXRpb24gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0zLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTM4LjA3NSB0bV9wdF82PS0zMS4wMTcgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMi4wMDAgdG1fcHRfMTA9LTIuNjIzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0zLjQ3NiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0zLjAwMCBsbV8wPS0yNC42OTAgbG1fMT0tMzQuMDc2IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNzAuMjQ3Cis5MSB8fHwgaXQgaXMg4Ka24KeC4KaV4Kaw4KeH4KawIGluIGluIHdhcyB3aGljaCBjYW4g4Ka24KeC4KaV4Kaw4KaV4KeHIOCmh+CmqOCmq+CnjeCmsuCngeCmr+CmvOCnh+CmnuCnjeCmnOCmvuCmpOCnhyBieSBicml0aXNoIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTQzLjUwMyB0bV9wdF82PS0xNi40NTMgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMDYzIHRtX3B0XzEwPS0yOS42NDggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguNTA5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS0zNi44OTkgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDAwLjYyMQorOTEgfHx8IGl0IGJhc2ljYWxseSDgprbgp4LgppXgprDgp4fgprAgaW4gaW4gd2FzIHdoaWNoIGNhbiDgprbgp4LgppXgprDgppXgp4cg4KaH4Kao4Kar4KeN4Kay4KeB4Kav4Ka84KeH4Kae4KeN4Kac4Ka+4Kak4KeHIGJ5IGJyaXRpc2ggLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMzguMzA0IHRtX3B0XzY9LTE2LjYxNiB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMi45MjggdG1fcHRfMTA9LTIyLjc3NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC43NTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tMzkuODgxIGxtXzE9LTQ1LjY1NiBXb3JkUGVuYWx0eT0tNi41MTQgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQwMC43ODAKKzkxIHx8fCBpdCBpcyDgprbgp4LgppXgprDgp4fgprAgaW4gaW4gd2FzIHdoaWNoIGNhbiDgprbgp4LgppXgprDgppXgp4cg4KaH4Kao4Kar4KeN4Kay4KeB4Kav4Ka84KeH4Kae4KeN4Kac4Ka+4Kak4KeHIGJ5IGN1bHR1cmVzIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTQwLjgwMiB0bV9wdF82PS0xNi40NTMgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuMDYzIHRtX3B0XzEwPS0yOC43MzEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguNTA5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS0zOC43MzYgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDAyLjEzOQorOTEgfHx8IGl0IGlzIOCmtuCnguCmleCmsOCnh+CmsCBpbiBpbiB3YXMgd2hpY2ggY2FuIOCmtuCnguCmleCmsOCmleCnhyDgpofgpqjgpqvgp43gprLgp4Hgpq/gprzgp4fgpp7gp43gppzgpr7gpqTgp4cgd291bGQgYnkgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tNDEuNDQ2IHRtX3B0XzY9LTE0Ljg0NCB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMS40MzEgdG1fcHRfMTA9LTI4Ljk2NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy44MTkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTM4Ljg0MiBsbV8xPS00NS42NTYgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDIuMjk3Cis5MSB8fHwgaXQgYmFzaWNhbGx5IOCmtuCnguCmleCmsOCnh+CmsCBpbiBpbiB3YXMgd2hpY2ggY2FuIOCmtuCnguCmleCmsOCmleCnhyDgpofgpqjgpqvgp43gprLgp4Hgpq/gprzgp4fgpp7gp43gppzgpr7gpqTgp4cgYnkgY3VsdHVyZXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTcuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNi4wMDAgdG1fcHRfNT0tMzUuNjAzIHRtX3B0XzY9LTE2LjYxNiB0bV9wdF83PS03LjAwMCB0bV9wdF84PS0xOS4wMjYgdG1fcHRfOT0tMi45MjggdG1fcHRfMTA9LTIxLjg2MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNC43NTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OS4wMDAgbG1fMD0tNDEuNzE4IGxtXzE9LTQ1LjY1NiBXb3JkUGVuYWx0eT0tNi41MTQgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQwMi4yOTgKKzkxIHx8fCBpdCBiYXNpY2FsbHkg4Ka24KeC4KaV4Kaw4KeH4KawIGluIGluIHdhcyB3aGljaCBjYW4g4Ka24KeC4KaV4Kaw4KaV4KeHIOCmh+CmqOCmq+CnjeCmsuCngeCmr+CmvOCnh+CmnuCnjeCmnOCmvuCmpOCnhyB3b3VsZCBieSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0zNi4yNDcgdG1fcHRfNj0tMTUuMDA2IHRtX3B0Xzc9LTguMDAwIHRtX3B0Xzg9LTIxLjc0NCB0bV9wdF85PS0yLjI5NSB0bV9wdF8xMD0tMjIuMDkzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjA2NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS00MS44MjQgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDAyLjQ1NQorOTEgfHx8IGl0IGlzIOCmtuCnguCmleCmsOCnh+CmsCBpbiBpbiB3YXMgd2hpY2ggY2FuIOCmtuCnguCmleCmsOCmleCnhyDgpofgpqjgpqvgp43gprLgp4Hgpq/gprzgp4fgpp7gp43gppzgpr7gpqTgp4cgYWZmZWN0ZWQgY3VsdHVyZXMgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTguMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNy4wMDAgdG1fcHRfNT0tMzcuMjk2IHRtX3B0XzY9LTE3LjM0NyB0bV9wdF83PS04LjAwMCB0bV9wdF84PS0yMS43NDQgdG1fcHRfOT0tMi4wNjMgdG1fcHRfMTA9LTIzLjkxNSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tOC41MDkgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTQwLjUwMyBsbV8xPS00NS42NTYgV29yZFBlbmFsdHk9LTYuNTE0IE9PVlBlbmFsdHk9LTMwMC4wMDAgfHx8IC00MDIuNzEyCis5MSB8fHwgaXQgaXMg4Ka24KeC4KaV4Kaw4KeH4KawIGluIGluIHdhcyB3aGljaCBjYW4g4Ka24KeC4KaV4Kaw4KaV4KeHIOCmh+CmqOCmq+CnjeCmsuCngeCmr+CmvOCnh+CmnuCnjeCmnOCmvuCmpOCnhyBieSB3b3VsZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS00MS40NDYgdG1fcHRfNj0tMTQuODQ0IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0yLjA2MyB0bV9wdF8xMD0tMjkuODM5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS05Ljc2NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMS4wMDAgbG1fMD0tMzguODY4IGxtXzE9LTQ1LjY1NiBXb3JkUGVuYWx0eT0tNi41MTQgT09WUGVuYWx0eT0tMzAwLjAwMCB8fHwgLTQwMi43OTgKKzkxIHx8fCBpdCBiYXNpY2FsbHkg4Ka24KeC4KaV4Kaw4KeH4KawIGluIGluIHdhcyB3aGljaCBjYW4g4Ka24KeC4KaV4Kaw4KaV4KeHIOCmh+CmqOCmq+CnjeCmsuCngeCmr+CmvOCnh+CmnuCnjeCmnOCmvuCmpOCnhyBhZmZlY3RlZCBjdWx0dXJlcyAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS02LjAwMCB0bV9wdF81PS0zMi4wOTcgdG1fcHRfNj0tMTcuNTEwIHRtX3B0Xzc9LTcuMDAwIHRtX3B0Xzg9LTE5LjAyNiB0bV9wdF85PS0yLjkyOCB0bV9wdF8xMD0tMTcuMDQ0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00Ljc1NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS00My40ODUgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDAyLjg3MQorOTEgfHx8IGl0IGJhc2ljYWxseSDgprbgp4LgppXgprDgp4fgprAgaW4gaW4gd2FzIHdoaWNoIGNhbiDgprbgp4LgppXgprDgppXgp4cg4KaH4Kao4Kar4KeN4Kay4KeB4Kav4Ka84KeH4Kae4KeN4Kac4Ka+4Kak4KeHIGJ5IHdvdWxkIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS04LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTcuMDAwIHRtX3B0XzU9LTM2LjI0NyB0bV9wdF82PS0xNS4wMDYgdG1fcHRfNz0tOC4wMDAgdG1fcHRfOD0tMjEuNzQ0IHRtX3B0Xzk9LTIuOTI4IHRtX3B0XzEwPS0yMi45NjggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTYuMDExIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS00MS44NTAgbG1fMT0tNDUuNjU2IFdvcmRQZW5hbHR5PS02LjUxNCBPT1ZQZW5hbHR5PS0zMDAuMDAwIHx8fCAtNDAyLjk1NworOTIgfHx8IHRoZXNlIOCmj+CmleCmjyB0aGUgbXljZWxpdW0gc3RydWN0dXJlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS00LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTExLjAzMiB0bV9wdF82PS04LjM1OSB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTE1LjM1NyB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi44NTIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMTkuNzE3IGxtXzE9LTIyLjgyOCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0OC43MzAKKzkyIHx8fCB0aGVzZSDgpo/gppXgpo8gdG8gbXljZWxpdW0gc3RydWN0dXJlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS00LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTMuMDAwIHRtX3B0XzU9LTEwLjM1MyB0bV9wdF82PS05LjE0NSB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4wMDAgdG1fcHRfMTA9LTE0Ljc0OCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy40MzIgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PS0xLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NS4wMDAgbG1fMD0tMTkuODExIGxtXzE9LTIyLjgyOCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0tMjAwLjAwMCB8fHwgLTI0OS4wMzMKKzkyIHx8fCB0aGVzZSDgpo/gppXgpo8gdGhlIG15Y2VsaXVtIGZvcm1lZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0xMC45ODkgdG1fcHRfNj0tNy43NDAgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0xNS44MDcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTMuNDk0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIwLjA0MyBsbV8xPS0yMi44MjggV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDkuMjU4Cis5MiB8fHwgdGhlc2Ug4KaP4KaV4KaPIHRvIG15Y2VsaXVtIGZvcm1lZCAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0xMC4zMTEgdG1fcHRfNj0tOC41MjYgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTAuMDAwIHRtX3B0XzEwPS0xNS4xOTggdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuMDc0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIwLjEzNyBsbV8xPS0yMi44MjggV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDkuNTYxCis5MiB8fHwgdGhlc2Ug4KaP4KaV4KaPIHRoZSBteWNlbGl1bSBmb3JtZWQgdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS00LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTE0LjE5NiB0bV9wdF82PS01Ljk1MyB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4wNTAgdG1fcHRfMTA9LTguMjgxIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjAxNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTIxLjgyNiBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDkuNjE5Cis5MiB8fHwgdGhlc2Ug4KaP4KaV4KaPIGJ5IG15Y2VsaXVtIHN0cnVjdHVyZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0xMC4zNjUgdG1fcHRfNj0tMTAuMjQ0IHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjAxOSB0bV9wdF8xMD0tMTQuMjg5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjQ2MSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9LTEuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD01LjAwMCBsbV8wPS0yMC4wMDEgbG1fMT0tMjIuODI4IFdvcmRQZW5hbHR5PS0zLjQ3NCBPT1ZQZW5hbHR5PS0yMDAuMDAwIHx8fCAtMjQ5LjkwNgorOTIgfHx8IHRoZXNlIOCmj+CmleCmjyB0byBteWNlbGl1bSBmb3JtZWQgdGhlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS00LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTEzLjUxOCB0bV9wdF82PS02Ljc0MCB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4wNTAgdG1fcHRfMTA9LTcuNjczIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjU5NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTYuMDAwIGxtXzA9LTIxLjkyMCBsbV8xPS0yNi4wODkgV29yZFBlbmFsdHk9LTMuOTA5IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNDkuOTIxCis5MiB8fHwgdGhlc2Ug4KaP4KaV4KaPIGluIG15Y2VsaXVtIHN0cnVjdHVyZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0xMS41NTkgdG1fcHRfNj0tOS44MTkgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTAuMDE5IHRtX3B0XzEwPS0xNS44OTcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuNDYxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0tMS4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE5LjcwMyBsbV8xPS0yMi44MjggV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9LTIwMC4wMDAgfHx8IC0yNTAuMDM4Cis5MyB8fHwgcnVzc2lhIG5vdyBhIGRlbW9jcmF0aWMgY291bnRyeSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS02LjMzMiB0bV9wdF82PS00LjQ2NiB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4wNTAgdG1fcHRfMTA9LTEuOTA2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjcyMiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIGxtXzA9LTEzLjgyMyBsbV8xPS0yMi44MjggV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0zNS41MzgKKzkzIHx8fCBydXNzaWEgYXQgYSBkZW1vY3JhdGljIGNvdW50cnkgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tNy40NjggdG1fcHRfNj0tMy44MTcgdG1fcHRfNz0tNC4wMDAgdG1fcHRfOD0tMTAuODcyIHRtX3B0Xzk9LTAuMTg1IHRtX3B0XzEwPS00LjA0MCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNS4xMjAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTYuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD00LjAwMCBsbV8wPS0xMi44MzMgbG1fMT0tMjIuODI4IFdvcmRQZW5hbHR5PS0zLjQ3NCBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMzUuODIyCis5MyB8fHwgcnVzc2lhIHByZXNlbnRseSBhIGRlbW9jcmF0aWMgY291bnRyeSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tNC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS01LjE2NSB0bV9wdF82PS00LjA3NSB0bV9wdF83PS00LjAwMCB0bV9wdF84PS0xMC44NzIgdG1fcHRfOT0tMC4wNTAgdG1fcHRfMTA9LTEuMTAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjMyNyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTQuMDAwIGxtXzA9LTE0Ljg0OCBsbV8xPS0yMi44MjggV29yZFBlbmFsdHk9LTMuNDc0IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0zNi4xMDEKKzkzIHx8fCBydXNzaWEgaXMgYSBkZW1vY3JhdGljIGNvdW50cnkgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTQuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tNC4wMDAgdG1fcHRfNT0tMTAuNjAyIHRtX3B0XzY9LTUuMjk4IHRtX3B0Xzc9LTQuMDAwIHRtX3B0Xzg9LTEwLjg3MiB0bV9wdF85PS0wLjE4NSB0bV9wdF8xMD0tNi42MzAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMTIwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgbG1fMD0tMTEuNjUzIGxtXzE9LTIyLjgyOCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTM2LjE0MAorOTQgfHx8IHBlbmlzIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0xLjc3MSB0bV9wdF82PS0xLjMwNSB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjAxOCB0bV9wdF8xMD0tMS42MDkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuMDk5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tNS41ODYgbG1fMT0tNS45OTEgV29yZFBlbmFsdHk9LTEuMzAzIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xMC45NzkKKzk0IHx8fCBzZXggfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTMuOTg5IHRtX3B0XzY9LTMuMzg0IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPS0yLjI1MSB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi4wMTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS00LjcwMiBsbV8xPS01Ljk5MSBXb3JkUGVuYWx0eT0tMS4zMDMgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTExLjc5OAorOTQgfHx8IGdlbmRlciB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMS4wMDAgdG1fcHRfNT0tMC44MTEgdG1fcHRfNj0tMS4zMDUgdG1fcHRfNz0tMS4wMDAgdG1fcHRfOD0tMi43MTggdG1fcHRfOT0tMC4wMDcgdG1fcHRfMTA9LTAuNDA1IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0wLjkxNiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTYuMzg3IGxtXzE9LTYuNTIyIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTIuMDU4Cis5NCB8fHwgdGhlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS05LjExMCB0bV9wdF82PS0yLjk3OSB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tOC4xODcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuNzA4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMy4yMDggbG1fMT0tNi41MjIgV29yZFBlbmFsdHk9LTEuMzAzIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xMy43NTIKKzk0IHx8fCBzZXh1YWwgb3JnYW5zIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS05LjEwMiB0bV9wdF82PS00LjA3OCB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tMS4zODYgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuNzA4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tNS45NDYgbG1fMT0tOS4yNTIgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xNy4xOTQKKzk0IHx8fCDgprLgpr/gppngp43gppcgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0wLjAwMCB0bV9wdF81PTAuMDAwIHRtX3B0XzY9MC4wMDAgdG1fcHRfNz0wLjAwMCB0bV9wdF84PTAuMDAwIHRtX3B0Xzk9MC4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9MC4wMDAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9MC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTcuMzU1IGxtXzE9LTYuNTIyIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTExLjM1OAorOTUgfHx8IHRoaXMgc3RhdGUgaXMgY2FsbGVkIG9yZ2FzbSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0xMi43MzggdG1fcHRfNj0tMjEuMzI0IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0wLjY5MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTUuOTQ1IGxtXzE9LTIyLjgyOCBXb3JkUGVuYWx0eT0tMy40NzQgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTMxLjI1NQorOTUgfHx8IHRoaXMgc3RhdGUgY2FsbGVkIG9yZ2FzbSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS04LjkyNCB0bV9wdF82PS0yMS4yNjUgdG1fcHRfNz0tMy4wMDAgdG1fcHRfOD0tOC4xNTQgdG1fcHRfOT0tMC41MDQgdG1fcHRfMTA9LTIuNDQxIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjc4MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTEwLjcwOSBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0zNi4xNjQKKzk1IHx8fCB0aGlzIHNpdHVhdGlvbiBpcyBjYWxsZWQgb3JnYXNtIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTExLjgyMyB0bV9wdF82PS0yMS43MjkgdG1fcHRfNz0tMS4wMDAgdG1fcHRfOD0tMi43MTggdG1fcHRfOT0tMS4wMDAgdG1fcHRfMTA9MC4wMDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuMzg2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS02LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tOS44MDAgbG1fMT0tMjIuODI4IFdvcmRQZW5hbHR5PS0zLjQ3NCBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMzYuNzU0Cis5NiB8fHwgZGlmZmVyZW50IHBlcmlvZCBoZXJlIHdhcyBlc3RhYmxpc2hlZCByb3lhbCBtb3JlIGVtcGlyZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0yMS4yNzUgdG1fcHRfNj0tMTIuNTE1IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0yLjc1NCB0bV9wdF8xMD0tMTYuODkzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS00LjMyNyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTI2LjU5MSBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03Ny43MDEKKzk2IHx8fCBkaWZmZXJlbnQgcGVyaW9kIHdhcyBlc3RhYmxpc2hlZCB0aGlzIHJveWFsIG1vcmUgZW1waXJlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS05LjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTQuMDAwIHRtX3B0XzU9LTI1LjAwNSB0bV9wdF82PS0xMy42NzkgdG1fcHRfNz0tOS4wMDAgdG1fcHRfOD0tMjQuNDYyIHRtX3B0Xzk9LTMuMzg2IHRtX3B0XzEwPS0xOC42NDAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuMDIwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS05LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tMjQuODIwIGxtXzE9LTMyLjYxMSBXb3JkUGVuYWx0eT0tNC43NzcgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTc3LjgzNworOTYgfHx8IGRpZmZlcmVudCBwZXJpb2QgaGVyZSBlc3RhYmxpc2hlZCB0aGUgcm95YWwgbW9yZSBlbXBpcmUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTkuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMy4wMDAgdG1fcHRfNT0tMjQuMDMxIHRtX3B0XzY9LTEzLjMyNCB0bV9wdF83PS05LjAwMCB0bV9wdF84PS0yNC40NjIgdG1fcHRfOT0tMi41MDMgdG1fcHRfMTA9LTE5LjU1MiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMy45OTYgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTkuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0yNi4yMzIgbG1fMT0tMzIuNjExIFdvcmRQZW5hbHR5PS00Ljc3NyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNzguMzkwCis5NiB8fHwgZGlmZmVyZW50IHBlcmlvZCB3YXMgZXN0YWJsaXNoZWQgcm95YWwgdGhpcyBtb3JlIGVtcGlyZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tOS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS00LjAwMCB0bV9wdF81PS0yNS4wMDUgdG1fcHRfNj0tMTMuNjc5IHRtX3B0Xzc9LTkuMDAwIHRtX3B0Xzg9LTI0LjQ2MiB0bV9wdF85PS0zLjM4NiB0bV9wdF8xMD0tMTguNjQwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS01LjAyMCB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tOS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTI1LjQ4NCBsbV8xPS0zMi42MTEgV29yZFBlbmFsdHk9LTQuNzc3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03OC42NTgKKzk2IHx8fCBoaXN0b3J5IGRpZmZlcmVudCBwZXJpb2QgaGVyZSB3YXMgZXN0YWJsaXNoZWQgcm95YWwgbW9yZSBlbXBpcmUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTguMDAwIHRtX3B0XzU9LTIzLjAzNyB0bV9wdF82PS05LjMzNyB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTEuMzg3IHRtX3B0XzEwPS0yMC43OTUgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTUuNjk0IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTguMDAwIGxtXzA9LTMwLjc0MiBsbV8xPS0zNS44NzIgV29yZFBlbmFsdHk9LTUuMjEyIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC03OS44NjAKKzk2IHx8fCBoaXN0b3J5IGRpZmZlcmVudCBwZXJpb2QgdGhpcyB3YXMgZXN0YWJsaXNoZWQgcm95YWwgbW9yZSBlbXBpcmUgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTkuMDAwIHRtX3B0XzU9LTI2Ljc2NyB0bV9wdF82PS0xMC41MDEgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0yLjAxOSB0bV9wdF8xMD0tMjQuMDEwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS02LjY3NSB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTAuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD05LjAwMCBsbV8wPS0yOS4zMTQgbG1fMT0tMzUuODcyIFdvcmRQZW5hbHR5PS01LjIxMiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNzkuOTM5Cis5NyB8fHwgbWljcm8gZWNvbm9taWNzIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0yLjc2NCB0bV9wdF82PS0xLjU1MiB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0wLjA1MCB0bV9wdF8xMD0wLjAwMCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMC41NjAgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTIuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS01LjAyMSBsbV8xPS05Ljc4MyBXb3JkUGVuYWx0eT0tMS43MzcgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTEyLjczMQorOTcgfHx8IG1pY3JvZWNvbm9taWNzIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0xLjM4NiB0bV9wdF82PS01Ljg5NCB0bV9wdF83PS0xLjAwMCB0bV9wdF84PS0yLjcxOCB0bV9wdF85PS0xLjAwMCB0bV9wdF8xMD0tMS4wOTkgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuOTQ2IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tNS4zMzYgbG1fMT0tNi41MjIgV29yZFBlbmFsdHk9LTEuMzAzIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0xMy43OTUKKzk3IHx8fCBtYWNybyBlY29ub21pY3MgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTIuOTk3IHRtX3B0XzY9LTIuMjQ1IHRtX3B0Xzc9LTEuMDAwIHRtX3B0Xzg9LTIuNzE4IHRtX3B0Xzk9LTAuMzY4IHRtX3B0XzEwPTAuMDAwIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjI1MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTUuNjkxIGxtXzE9LTkuNzgzIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTQuMzQ4Cis5NyB8fHwgbWFjcm8gZWNvbm9teSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMy4yMTkgdG1fcHRfNj0tMi45NTcgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4zNjggdG1fcHRfMTA9LTEuMDA5IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0yLjI3NyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTYuNTY2IGxtXzE9LTkuNzgzIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTYuNTMxCis5NyB8fHwgbWljcm8gZWNvbm9teSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tMi45ODUgdG1fcHRfNj0tMi4yNjQgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4wNTAgdG1fcHRfMTA9LTEuODc0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjU4MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMi4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTguMDY1IGxtXzE9LTkuNzgzIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTcuODIzCis5NyB8fHwgZWNvbm9taWNzIG1pY3JvIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS0yLjc2NCB0bV9wdF82PS0xLjU1MiB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjA1MSB0bV9wdF8xMD0tNC40NDIgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTQuNDcyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0yLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tOS40OTEgbG1fMT0tOS43ODMgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0yMS45NTUKKzk4IHx8fCB1c2VyIHRvIG9wZXJhdGluZyBzeXN0ZW0gdGhlIHZpc2libGUgb2YgdGhlIGNvbXB1dGVyIGludGVyZmFjZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTMwLjQ5NCB0bV9wdF82PS0xMC4wNzQgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMjUuMTM0IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS05LjE5MyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tMjcuMzk4IGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTc5LjI1NAorOTggfHx8IHVzZXIgdG8gb3BlcmF0aW5nIHN5c3RlbSB0aGUgdmlzaWJsZSBmb3JtIGlzIGNvbXB1dGVyIGludGVyZmFjZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTI0LjQwMSB0bV9wdF82PS05LjQ3NyB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTAuNTUzIHRtX3B0XzEwPS0xOS4yNjcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTguMTYwIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS0zMC42MTggbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNzkuOTgxCis5OCB8fHwgdXNlciB0byBvcGVyYXRpbmcgc3lzdGVtIHRoZSB2aXNpYmxlIGZvcm0gYXJlIGNvbXB1dGVyIGludGVyZmFjZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTIzLjY5NSB0bV9wdF82PS05LjU5NiB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTAuNTUzIHRtX3B0XzEwPS0xNy45NzEgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuNzM3IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS0zMS4xMjIgbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtODAuMDI1Cis5OCB8fHwgdXNlciB0byBvcGVyYXRpbmcgc3lzdGVtIHRoZSB2aXNpYmxlIG9mIGFyZSBjb21wdXRlciBpbnRlcmZhY2UgLiB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEwLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEwLjAwMCB0bV9wdF81PS0yNy4yNzUgdG1fcHRfNj0tOS4wMzEgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMjEuNDk4IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS03LjczNyB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tMTEuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0xMC4wMDAgbG1fMD0tMzAuMjIwIGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTgwLjMxNQorOTggfHx8IHVzZXIgdG8gb3BlcmF0aW5nIHN5c3RlbSB0aGUgdmlzaWJsZSBvZiB0aGUgY29tcHV0ZXJzIGludGVyZmFjZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTMwLjY1NyB0bV9wdF82PS0xMS42MzIgdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0wLjU1MyB0bV9wdF8xMD0tMjQuOTE2IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMC43MTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9MTAuMDAwIGxtXzA9LTI3LjU5MiBsbV8xPS0zOS4xMzQgV29yZFBlbmFsdHk9LTUuNjQ2IE9PVlBlbmFsdHk9MC4wMDAgfHx8IC04MC41NDAKKzk4IHx8fCB0aGUgdXNlciB0byBvcGVyYXRpbmcgdmlzaWJsZSBvZiBhcmUgY29tcHV0ZXIgaW50ZXJmYWNlIC4gfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xMC4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS04LjAwMCB0bV9wdF81PS0yNS4yODQgdG1fcHRfNj0tOS41MDggdG1fcHRfNz0tMTAuMDAwIHRtX3B0Xzg9LTI3LjE4MCB0bV9wdF85PS0xLjYwMyB0bV9wdF8xMD0tMjAuOTUzIHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xMC43MTUgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTEwLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Ny4wMDAgbG1fMD0tMjguNjExIGxtXzE9LTM1Ljg3MiBXb3JkUGVuYWx0eT0tNS4yMTIgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTgwLjcwNworOTggfHx8IHVzZXIgdG8gb3BlcmF0aW5nIHN5c3RlbSBtb3N0IHZpc2libGUgb2YgYXJlIGNvbXB1dGVyIGludGVyZmFjZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMTAuMDAwIHRtX3B0XzU9LTIzLjM2NyB0bV9wdF82PS04Ljg3NiB0bV9wdF83PS0xMC4wMDAgdG1fcHRfOD0tMjcuMTgwIHRtX3B0Xzk9LTAuNTUzIHRtX3B0XzEwPS0xNy41MTAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTcuMDk5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0xMS4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTEwLjAwMCBsbV8wPS0zMi4yMzEgbG1fMT0tMzkuMTM0IFdvcmRQZW5hbHR5PS01LjY0NiBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtODAuNzQyCis5OCB8fHwgb3BlcmF0aW5nIHN5c3RlbSB0byB1c2VycyBtb3N0IHZpc2libGUgb2YgYXJlIGNvbXB1dGVyIGludGVyZmFjZSAuIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMTAuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tOS4wMDAgdG1fcHRfNT0tMjMuMjk1IHRtX3B0XzY9LTkuMzEyIHRtX3B0Xzc9LTEwLjAwMCB0bV9wdF84PS0yNy4xODAgdG1fcHRfOT0tMC44NzggdG1fcHRfMTA9LTE0LjUzNiB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tNy41NDEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTExLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9OC4wMDAgbG1fMD0tMzAuODI1IGxtXzE9LTM5LjEzNCBXb3JkUGVuYWx0eT0tNS42NDYgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTgwLjc1NAorOTkgfHx8IOCmrOCmv+CmuOCnjeCmpOCmvuCmsOCmv+CmpOCmgyAxOTcxIHRlbXBvcmFyeSBnb3Zlcm5tZW50IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS0yLjcxNyB0bV9wdF82PS05LjU0MyB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjUwMyB0bV9wdF8xMD0tNC40NDcgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuMzk4IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS0zLjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMTYuNDEwIGxtXzE9LTE2LjMwNiBXb3JkUGVuYWx0eT0tMi42MDYgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEzNS40NDQKKzk5IHx8fCDgpqzgpr/gprjgp43gpqTgpr7gprDgpr/gpqTgpoMgMTk3MSB0ZW1wb3JhcnkgYmFuZ2xhZGVzaCBnb3Zlcm5tZW50IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMy4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0zLjAwMCB0bV9wdF81PS0zLjI5NiB0bV9wdF82PS01LjI4NiB0bV9wdF83PS0zLjAwMCB0bV9wdF84PS04LjE1NCB0bV9wdF85PS0wLjM2OCB0bV9wdF8xMD0tMy45MzQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuMTI5IHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgbG1fMD0tMTcuMzU4IGxtXzE9LTE5LjU2NyBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEzNy4yMjYKKzk5IHx8fCDgpqzgpr/gprjgp43gpqTgpr7gprDgpr/gpqTgpoMgLCAxOTcxIHRlbXBvcmFyeSBnb3Zlcm5tZW50IHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0yLjAwMCB0bV9wdF81PS03LjI3MiB0bV9wdF82PS03LjAzNiB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjI3MSB0bV9wdF8xMD0tMi41OTAgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTEuOTkyIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9My4wMDAgbG1fMD0tMTYuOTM5IGxtXzE9LTE5LjU2NyBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEzNy40MDAKKzk5IHx8fCDgpqzgpr/gprjgp43gpqTgpr7gprDgpr/gpqTgpoMgdGVtcG9yYXJ5IGdvdmVybm1lbnQgLCAxOTcxIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMi4wMDAgdG1fcHRfMz0wLjAwMCB0bV9wdF80PS0xLjAwMCB0bV9wdF81PS03LjI3MiB0bV9wdF82PS03LjAzNiB0bV9wdF83PS0yLjAwMCB0bV9wdF84PS01LjQzNiB0bV9wdF85PS0wLjE4NSB0bV9wdF8xMD0tMS4yMDQgdG1fcHRfMTE9MC4wMDAgdG1fcHRfMTI9LTIuMzUxIHRtX3B0XzEzPTAuMDAwIHRtX3B0XzE0PS00LjAwMCB0bV9wdF8xNT0wLjAwMCB0bV9wdF8xNj0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tMTYuNDg0IGxtXzE9LTE5LjU2NyBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEzNy40OTgKKzk5IHx8fCDgpqzgpr/gprjgp43gpqTgpr7gprDgpr/gpqTgpoMgaW4gMTk3MSB0ZW1wb3JhcnkgZ292ZXJubWVudCB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTIuMDAwIHRtX3B0XzM9MC4wMDAgdG1fcHRfND0tMi4wMDAgdG1fcHRfNT0tNi44MjMgdG1fcHRfNj0tNy42NDUgdG1fcHRfNz0tMi4wMDAgdG1fcHRfOD0tNS40MzYgdG1fcHRfOT0tMC4yNzEgdG1fcHRfMTA9LTIuODI3IHRtX3B0XzExPTAuMDAwIHRtX3B0XzEyPS0xLjk5MiB0bV9wdF8xMz0wLjAwMCB0bV9wdF8xND0tNC4wMDAgdG1fcHRfMTU9MC4wMDAgdG1fcHRfMTY9MC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTE2Ljk0NiBsbV8xPS0xOS41NjcgV29yZFBlbmFsdHk9LTMuMDQwIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMzcuNTkyCis5OSB8fHwg4Kas4Ka/4Ka44KeN4Kak4Ka+4Kaw4Ka/4Kak4KaDIHRlbXBvcmFyeSBnb3Zlcm5tZW50IGluIDE5NzEgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0yLjAwMCB0bV9wdF8zPTAuMDAwIHRtX3B0XzQ9LTEuMDAwIHRtX3B0XzU9LTYuODIzIHRtX3B0XzY9LTcuNjQ1IHRtX3B0Xzc9LTIuMDAwIHRtX3B0Xzg9LTUuNDM2IHRtX3B0Xzk9LTAuMTg1IHRtX3B0XzEwPS0xLjY3NCB0bV9wdF8xMT0wLjAwMCB0bV9wdF8xMj0tMi4zNTEgdG1fcHRfMTM9MC4wMDAgdG1fcHRfMTQ9LTQuMDAwIHRtX3B0XzE1PTAuMDAwIHRtX3B0XzE2PTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0xNi40MDQgbG1fMT0tMTkuNTY3IFdvcmRQZW5hbHR5PS0zLjA0MCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTM3LjY0MwpkaWZmIC0tZ2l0IGEvdGVzdC9kZWNvZGVyL251bV90cmFuc2xhdGlvbl9vcHRpb25zL291dHB1dC5nb2xkIGIvdGVzdC9kZWNvZGVyL251bV90cmFuc2xhdGlvbl9vcHRpb25zL291dHB1dC5nb2xkCmluZGV4IDcwNTU2MmIuLjQyMDM4MjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGVjb2Rlci9udW1fdHJhbnNsYXRpb25fb3B0aW9ucy9vdXRwdXQuZ29sZAorKysgYi90ZXN0L2RlY29kZXIvbnVtX3RyYW5zbGF0aW9uX29wdGlvbnMvb3V0cHV0LmdvbGQKQEAgLTEsMTIgKzEsMTIgQEAKLS0xOS4xOTYgfHx8IGkgbGlrZSB0YWNvIGJlbGwgfHx8IGxtXzA9LTE3LjQ0OSB0bV9wdF8wPTQuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYKLS0xOS43MzMgfHx8IGkgbG92ZSB0YWNvIGJlbGwgfHx8IGxtXzA9LTE4LjY5MCB0bV9wdF8wPTUuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYKLS0yMi44ODMgfHx8IGkgYXBwcmVjaWF0ZSB0YWNvIGJlbGwgfHx8IGxtXzA9LTE5LjYyMCB0bV9wdF8wPTMuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYKLS00MjQuOTU0IHx8fCB5byBxdWllcm8gdGFjbyBiZWxsIHx8fCBsbV8wPS0yMS4yOTMgdG1fcHRfMD0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTQwMC4wMDAKLS0xOS4xOTYgfHx8IGkgbGlrZSB0YWNvIGJlbGwgfHx8IGxtXzA9LTE3LjQ0OSB0bV9wdF8wPTQuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYKLS0xOS43MzMgfHx8IGkgbG92ZSB0YWNvIGJlbGwgfHx8IGxtXzA9LTE4LjY5MCB0bV9wdF8wPTUuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYKLS0yMi44ODMgfHx8IGkgYXBwcmVjaWF0ZSB0YWNvIGJlbGwgfHx8IGxtXzA9LTE5LjYyMCB0bV9wdF8wPTMuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYKLS00MjQuOTU0IHx8fCB5byBxdWllcm8gdGFjbyBiZWxsIHx8fCBsbV8wPS0yMS4yOTMgdG1fcHRfMD0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTQwMC4wMDAKLS0xOS4xOTYgfHx8IGkgbGlrZSB0YWNvIGJlbGwgfHx8IGxtXzA9LTE3LjQ0OSB0bV9wdF8wPTQuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYKLS0xOS43MzMgfHx8IGkgbG92ZSB0YWNvIGJlbGwgfHx8IGxtXzA9LTE4LjY5MCB0bV9wdF8wPTUuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYKLS0yMi44ODMgfHx8IGkgYXBwcmVjaWF0ZSB0YWNvIGJlbGwgfHx8IGxtXzA9LTE5LjYyMCB0bV9wdF8wPTMuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMi42MDYKLS00MjQuOTU0IHx8fCB5byBxdWllcm8gdGFjbyBiZWxsIHx8fCBsbV8wPS0yMS4yOTMgdG1fcHRfMD0wLjAwMCB0bV9nbHVlXzA9NC4wMDAgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTQwMC4wMDAKKy0xOS4xOTYgfHx8IGkgbGlrZSB0YWNvIGJlbGwgfHx8IHRtX3B0XzA9NC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTE3LjQ0OSBXb3JkUGVuYWx0eT0tMi42MDYgT09WUGVuYWx0eT0wLjAwMAorLTE5LjczMyB8fHwgaSBsb3ZlIHRhY28gYmVsbCB8fHwgdG1fcHRfMD01LjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMTguNjkwIFdvcmRQZW5hbHR5PS0yLjYwNiBPT1ZQZW5hbHR5PTAuMDAwCistMjIuODgzIHx8fCBpIGFwcHJlY2lhdGUgdGFjbyBiZWxsIHx8fCB0bV9wdF8wPTMuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xOS42MjAgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9MC4wMDAKKy00MjQuOTU0IHx8fCB5byBxdWllcm8gdGFjbyBiZWxsIHx8fCB0bV9wdF8wPTAuMDAwIHRtX2dsdWVfMD00LjAwMCBsbV8wPS0yMS4yOTMgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTQwMC4wMDAKKy0xOS4xOTYgfHx8IGkgbGlrZSB0YWNvIGJlbGwgfHx8IHRtX3B0XzA9NC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTE3LjQ0OSBXb3JkUGVuYWx0eT0tMi42MDYgT09WUGVuYWx0eT0wLjAwMAorLTE5LjczMyB8fHwgaSBsb3ZlIHRhY28gYmVsbCB8fHwgdG1fcHRfMD01LjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMTguNjkwIFdvcmRQZW5hbHR5PS0yLjYwNiBPT1ZQZW5hbHR5PTAuMDAwCistMjIuODgzIHx8fCBpIGFwcHJlY2lhdGUgdGFjbyBiZWxsIHx8fCB0bV9wdF8wPTMuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xOS42MjAgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9MC4wMDAKKy00MjQuOTU0IHx8fCB5byBxdWllcm8gdGFjbyBiZWxsIHx8fCB0bV9wdF8wPTAuMDAwIHRtX2dsdWVfMD00LjAwMCBsbV8wPS0yMS4yOTMgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTQwMC4wMDAKKy0xOS4xOTYgfHx8IGkgbGlrZSB0YWNvIGJlbGwgfHx8IHRtX3B0XzA9NC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTE3LjQ0OSBXb3JkUGVuYWx0eT0tMi42MDYgT09WUGVuYWx0eT0wLjAwMAorLTE5LjczMyB8fHwgaSBsb3ZlIHRhY28gYmVsbCB8fHwgdG1fcHRfMD01LjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMTguNjkwIFdvcmRQZW5hbHR5PS0yLjYwNiBPT1ZQZW5hbHR5PTAuMDAwCistMjIuODgzIHx8fCBpIGFwcHJlY2lhdGUgdGFjbyBiZWxsIHx8fCB0bV9wdF8wPTMuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xOS42MjAgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9MC4wMDAKKy00MjQuOTU0IHx8fCB5byBxdWllcm8gdGFjbyBiZWxsIHx8fCB0bV9wdF8wPTAuMDAwIHRtX2dsdWVfMD00LjAwMCBsbV8wPS0yMS4yOTMgV29yZFBlbmFsdHk9LTIuNjA2IE9PVlBlbmFsdHk9LTQwMC4wMDAKZGlmZiAtLWdpdCBhL3Rlc3QvZGVjb2Rlci9vb3YtbGlzdC9vdXRwdXQuZ29sZCBiL3Rlc3QvZGVjb2Rlci9vb3YtbGlzdC9vdXRwdXQuZ29sZAppbmRleCA4YWQ1YjU2Li5kOTExYzUyIDEwMDY0NAotLS0gYS90ZXN0L2RlY29kZXIvb292LWxpc3Qvb3V0cHV0LmdvbGQKKysrIGIvdGVzdC9kZWNvZGVyL29vdi1saXN0L291dHB1dC5nb2xkCkBAIC0xLDMgKzEsMyBAQAotMCB8fHwgR29hdHMgZWF0IGNoZWVzZSB8fHwgbG1fMD0tMTYuNTg3IHRtX3BocmFzZV8wPS0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgV29yZFBlbmFsdHk9LTIuMTcxIHx8fCAtMTEuNTAzCi0xIHx8fCBpIHdpbGwgZ28gaG9tZSB8fHwgbG1fMD0tMTIuMTU1IHRtX3BocmFzZV8wPS0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgV29yZFBlbmFsdHk9LTIuNjA2IHx8fCAtNC40MTQKLTIgfHx8IGdvZXRzX09PViBlZXRfT09WIGNoZWV6X09PViB8fHwgbG1fMD0tMTcuNzAwIHRtX3BocmFzZV8wPS0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgV29yZFBlbmFsdHk9LTIuMTcxIE9PVlBlbmFsdHk9LTcuNzQ5IHx8fCAtMjAuNjI5CiswIHx8fCBHb2F0cyBlYXQgY2hlZXNlIHx8fCB0bV9waHJhc2VfMD0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMTYuNTg3IFdvcmRQZW5hbHR5PS0yLjE3MSBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMTEuNTAzCisxIHx8fCBpIHdpbGwgZ28gaG9tZSB8fHwgdG1fcGhyYXNlXzA9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTEyLjE1NSBXb3JkUGVuYWx0eT0tMi42MDYgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTQuNDE0CisyIHx8fCBnb2V0c19PT1YgZWV0X09PViBjaGVlel9PT1YgfHx8IHRtX3BocmFzZV8wPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xNy43MDAgV29yZFBlbmFsdHk9LTIuMTcxIE9PVlBlbmFsdHk9LTcuNzQ5IHx8fCAtMjAuNjI5CmRpZmYgLS1naXQgYS90ZXN0L2RlY29kZXIvcGhyYXNlL2NvbnN0cmFpbmVkL291dHB1dC5nb2xkIGIvdGVzdC9kZWNvZGVyL3BocmFzZS9jb25zdHJhaW5lZC9vdXRwdXQuZ29sZAppbmRleCA5NmQ5NTgyLi4yMzgzODdjIDEwMDY0NAotLS0gYS90ZXN0L2RlY29kZXIvcGhyYXNlL2NvbnN0cmFpbmVkL291dHB1dC5nb2xkCisrKyBiL3Rlc3QvZGVjb2Rlci9waHJhc2UvY29uc3RyYWluZWQvb3V0cHV0LmdvbGQKQEAgLTEsNSArMSw1IEBACi0wIHx8fCBQcmVzaWRlbnQgT2JhbWEgfDgtOHwgdG8gfDctN3wgaGluZGVyIHw0LTR8IGEgc3RyYXRlZ3kgfDAtMXwgZm9yIHwzLTN8IFJlcHVibGljYW4gfDItMnwgcmUgQC1AIGVsZWN0aW9uIHw1LTZ8IHx8fCBEaXN0b3J0aW9uPS0yNC4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IFBocmFzZVBlbmFsdHk9Ny4wMDAgdG1fcHRfMD0tMTUuNzkyIHRtX3B0XzE9LTE3LjU1MCB0bV9wdF8yPS0xNC41OTkgdG1fcHRfMz0tMTguMjk4IGxtXzA9LTI5LjQ1MiB8fHwgLTE1LjE2MwotMCB8fHwgUHJlc2lkZW50IE9iYW1hIHw4LTh8IHRvIHw3LTd8IGhpbmRlciB8NC00fCBhIHwwLTB8IHN0cmF0ZWd5IHwxLTF8IGZvciB8My0zfCBSZXB1YmxpY2FuIHwyLTJ8IHJlIEAtQCBlbGVjdGlvbiB8NS02fCB8fHwgRGlzdG9ydGlvbj0tMjQuMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBQaHJhc2VQZW5hbHR5PTguMDAwIHRtX3B0XzA9LTE2LjkxOSB0bV9wdF8xPS0xNy41NTAgdG1fcHRfMj0tMTQuOTE3IHRtX3B0XzM9LTE4LjI5OCBsbV8wPS0yOS40NTIgfHx8IC0xNS41MDUKLTAgfHx8IFByZXNpZGVudCBPYmFtYSB8OC04fCB0byBoaW5kZXIgfDMtNHwgYSBzdHJhdGVneSB8MC0xfCBmb3IgfDctN3wgUmVwdWJsaWNhbiB8Mi0yfCByZSBALUAgZWxlY3Rpb24gfDUtNnwgfHx8IERpc3RvcnRpb249LTMyLjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgUGhyYXNlUGVuYWx0eT02LjAwMCB0bV9wdF8wPS0xNC45ODYgdG1fcHRfMT0tMTcuOTUxIHRtX3B0XzI9LTE0LjA3NSB0bV9wdF8zPS0xOC42OTkgbG1fMD0tMjkuNDUyIHx8fCAtMTUuNzYyCi0wIHx8fCBQcmVzaWRlbnQgT2JhbWEgfDgtOHwgdG8gaGluZGVyIHwzLTR8IGEgfDAtMHwgc3RyYXRlZ3kgfDEtMXwgZm9yIHw3LTd8IFJlcHVibGljYW4gfDItMnwgcmUgQC1AIGVsZWN0aW9uIHw1LTZ8IHx8fCBEaXN0b3J0aW9uPS0zMi4wMDAgV29yZFBlbmFsdHk9LTQuNzc3IFBocmFzZVBlbmFsdHk9Ny4wMDAgdG1fcHRfMD0tMTYuMTEyIHRtX3B0XzE9LTE3Ljk1MSB0bV9wdF8yPS0xNC4zOTMgdG1fcHRfMz0tMTguNjk5IGxtXzA9LTI5LjQ1MiB8fHwgLTE2LjEwMwotMCB8fHwgUHJlc2lkZW50IE9iYW1hIHw4LTh8IHRvIHwzLTN8IGhpbmRlciB8NC00fCBhIHN0cmF0ZWd5IHwwLTF8IGZvciB8Ny03fCBSZXB1YmxpY2FuIHwyLTJ8IHJlIEAtQCBlbGVjdGlvbiB8NS02fCB8fHwgRGlzdG9ydGlvbj0tMzIuMDAwIFdvcmRQZW5hbHR5PS00Ljc3NyBQaHJhc2VQZW5hbHR5PTcuMDAwIHRtX3B0XzA9LTE2LjMyOSB0bV9wdF8xPS0xNy45NTEgdG1fcHRfMj0tMTUuMTM2IHRtX3B0XzM9LTE4LjY5OSBsbV8wPS0yOS40NTIgfHx8IC0xNi4yNTcKKzAgfHx8IFByZXNpZGVudCBPYmFtYSB8OC04fCB0byB8Ny03fCBoaW5kZXIgfDQtNHwgYSBzdHJhdGVneSB8MC0xfCBmb3IgfDMtM3wgUmVwdWJsaWNhbiB8Mi0yfCByZSBALUAgZWxlY3Rpb24gfDUtNnwgfHx8IHRtX3B0XzA9LTE1Ljc5MiB0bV9wdF8xPS0xNy41NTAgdG1fcHRfMj0tMTQuNTk5IHRtX3B0XzM9LTE4LjI5OCBsbV8wPS0yOS40NTIgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgRGlzdG9ydGlvbj0tMjQuMDAwIFBocmFzZVBlbmFsdHk9Ny4wMDAgfHx8IC0xNS4xNjMKKzAgfHx8IFByZXNpZGVudCBPYmFtYSB8OC04fCB0byB8Ny03fCBoaW5kZXIgfDQtNHwgYSB8MC0wfCBzdHJhdGVneSB8MS0xfCBmb3IgfDMtM3wgUmVwdWJsaWNhbiB8Mi0yfCByZSBALUAgZWxlY3Rpb24gfDUtNnwgfHx8IHRtX3B0XzA9LTE2LjkxOSB0bV9wdF8xPS0xNy41NTAgdG1fcHRfMj0tMTQuOTE3IHRtX3B0XzM9LTE4LjI5OCBsbV8wPS0yOS40NTIgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgRGlzdG9ydGlvbj0tMjQuMDAwIFBocmFzZVBlbmFsdHk9OC4wMDAgfHx8IC0xNS41MDUKKzAgfHx8IFByZXNpZGVudCBPYmFtYSB8OC04fCB0byBoaW5kZXIgfDMtNHwgYSBzdHJhdGVneSB8MC0xfCBmb3IgfDctN3wgUmVwdWJsaWNhbiB8Mi0yfCByZSBALUAgZWxlY3Rpb24gfDUtNnwgfHx8IHRtX3B0XzA9LTE0Ljk4NiB0bV9wdF8xPS0xNy45NTEgdG1fcHRfMj0tMTQuMDc1IHRtX3B0XzM9LTE4LjY5OSBsbV8wPS0yOS40NTIgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgRGlzdG9ydGlvbj0tMzIuMDAwIFBocmFzZVBlbmFsdHk9Ni4wMDAgfHx8IC0xNS43NjIKKzAgfHx8IFByZXNpZGVudCBPYmFtYSB8OC04fCB0byBoaW5kZXIgfDMtNHwgYSB8MC0wfCBzdHJhdGVneSB8MS0xfCBmb3IgfDctN3wgUmVwdWJsaWNhbiB8Mi0yfCByZSBALUAgZWxlY3Rpb24gfDUtNnwgfHx8IHRtX3B0XzA9LTE2LjExMiB0bV9wdF8xPS0xNy45NTEgdG1fcHRfMj0tMTQuMzkzIHRtX3B0XzM9LTE4LjY5OSBsbV8wPS0yOS40NTIgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgRGlzdG9ydGlvbj0tMzIuMDAwIFBocmFzZVBlbmFsdHk9Ny4wMDAgfHx8IC0xNi4xMDMKKzAgfHx8IFByZXNpZGVudCBPYmFtYSB8OC04fCB0byB8My0zfCBoaW5kZXIgfDQtNHwgYSBzdHJhdGVneSB8MC0xfCBmb3IgfDctN3wgUmVwdWJsaWNhbiB8Mi0yfCByZSBALUAgZWxlY3Rpb24gfDUtNnwgfHx8IHRtX3B0XzA9LTE2LjMyOSB0bV9wdF8xPS0xNy45NTEgdG1fcHRfMj0tMTUuMTM2IHRtX3B0XzM9LTE4LjY5OSBsbV8wPS0yOS40NTIgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tNC43NzcgRGlzdG9ydGlvbj0tMzIuMDAwIFBocmFzZVBlbmFsdHk9Ny4wMDAgfHx8IC0xNi4yNTcKZGlmZiAtLWdpdCBhL3Rlc3QvZGVjb2Rlci9waHJhc2UvZGVjb2RlL291dHB1dC5nb2xkIGIvdGVzdC9kZWNvZGVyL3BocmFzZS9kZWNvZGUvb3V0cHV0LmdvbGQKaW5kZXggZjNmN2VjYS4uNTA5YTNkZSAxMDA2NDQKLS0tIGEvdGVzdC9kZWNvZGVyL3BocmFzZS9kZWNvZGUvb3V0cHV0LmdvbGQKKysrIGIvdGVzdC9kZWNvZGVyL3BocmFzZS9kZWNvZGUvb3V0cHV0LmdvbGQKQEAgLTEgKzEgQEAKLTAgfHx8IGEgc3RyYXRlZ3kgfDAtMXwgcmVwdWJsaWNhbiB8Mi0yfCB0byBoaW5kZXIgfDMtNHwgcmVlbGVjdGlvbiB8NS02fCBPYmFtYSB8Ny04fCB8fHwgRGlzdG9ydGlvbj0wLjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgUGhyYXNlUGVuYWx0eT01LjAwMCB0bV9wdF8wPS05LjcwMiB0bV9wdF8xPS0xMC44MDAgdG1fcHRfMj0tNy41NDMgdG1fcHRfMz0tOC41NTUgbG1fMD0tMTkuMTE3IHx8fCAtNy40OTYKKzAgfHx8IGEgc3RyYXRlZ3kgfDAtMXwgcmVwdWJsaWNhbiB8Mi0yfCB0byBoaW5kZXIgfDMtNHwgcmVlbGVjdGlvbiB8NS02fCBPYmFtYSB8Ny04fCB8fHwgdG1fcHRfMD0tOS43MDIgdG1fcHRfMT0tMTAuODAwIHRtX3B0XzI9LTcuNTQzIHRtX3B0XzM9LTguNTU1IGxtXzA9LTE5LjExNyBPT1ZQZW5hbHR5PTAuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCBEaXN0b3J0aW9uPTAuMDAwIFBocmFzZVBlbmFsdHk9NS4wMDAgfHx8IC03LjQ5NgpkaWZmIC0tZ2l0IGEvdGVzdC9kZWNvZGVyL3JlZ2V4cC1ncmFtbWFyLWJvdGgtcnVsZS10eXBlcy9vdXRwdXQuZ29sZCBiL3Rlc3QvZGVjb2Rlci9yZWdleHAtZ3JhbW1hci1ib3RoLXJ1bGUtdHlwZXMvb3V0cHV0LmdvbGQKaW5kZXggNTJiMTQyOS4uYzhlZGI4NiAxMDA2NDQKLS0tIGEvdGVzdC9kZWNvZGVyL3JlZ2V4cC1ncmFtbWFyLWJvdGgtcnVsZS10eXBlcy9vdXRwdXQuZ29sZAorKysgYi90ZXN0L2RlY29kZXIvcmVnZXhwLWdyYW1tYXItYm90aC1ydWxlLXR5cGVzL291dHB1dC5nb2xkCkBAIC0xLDEyICsxLDEyIEBACi0wIHx8fCBnaXJsIGZlbWluaW5lLXNpbmd1bGFyLXByZXR0eSB8fHwgdG1fcmVnZXhwXzA9LTIuMDAwIHRtX3JlZ2V4cF8xPS0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgfHx8IC00LjAwMAotMCB8fHwgZ2lybCBmZW1pbmluZS1wcmV0dHkgfHx8IHRtX3JlZ2V4cF8wPS0yLjAwMCB0bV9yZWdleHBfMT0tMS4wMDAgdG1fZ2x1ZV8wPTIuMDAwIHx8fCAtNS4wMDAKLTAgfHx8IGdpcmwgZ2VuZXJpYy1wcmV0dHkgfHx8IHRtX3JlZ2V4cF8wPS0yLjAwMCB0bV9yZWdleHBfMT0tMi4wMDAgdG1fZ2x1ZV8wPTIuMDAwIHx8fCAtNi4wMDAKLTEgfHx8IGJveXMgbWFzY3VsaW5lLXByZXR0eSB8fHwgdG1fcmVnZXhwXzA9LTIuMDAwIHRtX3JlZ2V4cF8xPS0xLjAwMCB0bV9nbHVlXzA9Mi4wMDAgfHx8IC01LjAwMAotMSB8fHwgYm95cyBnZW5lcmljLXByZXR0eSB8fHwgdG1fcmVnZXhwXzA9LTIuMDAwIHRtX3JlZ2V4cF8xPS0yLjAwMCB0bV9nbHVlXzA9Mi4wMDAgfHx8IC02LjAwMAotMSB8fHwgYm95cyBsaW5kb3NfT09WIHx8fCB0bV9yZWdleHBfMD0tMS4wMDAgdG1fcmVnZXhwXzE9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTAzLjAwMAotMiB8fHwgYm95cyBnZW5lcmljLXByZXR0eSB8fHwgdG1fcmVnZXhwXzA9LTIuMDAwIHRtX3JlZ2V4cF8xPS0yLjAwMCB0bV9nbHVlXzA9Mi4wMDAgfHx8IC02LjAwMAotMiB8fHwgYm95cyBsaW5kP3NfT09WIHx8fCB0bV9yZWdleHBfMD0tMS4wMDAgdG1fcmVnZXhwXzE9LTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTAzLjAwMAorMCB8fHwgZ2lybCBmZW1pbmluZS1zaW5ndWxhci1wcmV0dHkgfHx8IHRtX3JlZ2V4cF8wPS0yLjAwMCB0bV9yZWdleHBfMT0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTQuMDAwCiswIHx8fCBnaXJsIGZlbWluaW5lLXByZXR0eSB8fHwgdG1fcmVnZXhwXzA9LTIuMDAwIHRtX3JlZ2V4cF8xPS0xLjAwMCB0bV9nbHVlXzA9Mi4wMDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTUuMDAwCiswIHx8fCBnaXJsIGdlbmVyaWMtcHJldHR5IHx8fCB0bV9yZWdleHBfMD0tMi4wMDAgdG1fcmVnZXhwXzE9LTIuMDAwIHRtX2dsdWVfMD0yLjAwMCBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNi4wMDAKKzEgfHx8IGJveXMgbWFzY3VsaW5lLXByZXR0eSB8fHwgdG1fcmVnZXhwXzA9LTIuMDAwIHRtX3JlZ2V4cF8xPS0xLjAwMCB0bV9nbHVlXzA9Mi4wMDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTUuMDAwCisxIHx8fCBib3lzIGdlbmVyaWMtcHJldHR5IHx8fCB0bV9yZWdleHBfMD0tMi4wMDAgdG1fcmVnZXhwXzE9LTIuMDAwIHRtX2dsdWVfMD0yLjAwMCBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtNi4wMDAKKzEgfHx8IGJveXMgbGluZG9zX09PViB8fHwgdG1fcmVnZXhwXzA9LTEuMDAwIHRtX3JlZ2V4cF8xPTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTAzLjAwMAorMiB8fHwgYm95cyBnZW5lcmljLXByZXR0eSB8fHwgdG1fcmVnZXhwXzA9LTIuMDAwIHRtX3JlZ2V4cF8xPS0yLjAwMCB0bV9nbHVlXzA9Mi4wMDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTYuMDAwCisyIHx8fCBib3lzIGxpbmQ/c19PT1YgfHx8IHRtX3JlZ2V4cF8wPS0xLjAwMCB0bV9yZWdleHBfMT0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgT09WUGVuYWx0eT0tMTAwLjAwMCB8fHwgLTEwMy4wMDAKIDIgfHx8IGNoaWNvc19PT1YgZ2VuZXJpYy1wcmV0dHkgfHx8IHRtX3JlZ2V4cF8wPS0xLjAwMCB0bV9yZWdleHBfMT0tMi4wMDAgdG1fZ2x1ZV8wPTIuMDAwIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMDUuMDAwCi0zIHx8fCByZWFsbHkgYmlnIG51bWJlciB8fHwgdG1fcmVnZXhwXzA9LTEuMDAwIHRtX3JlZ2V4cF8xPS0xLjAwMCB0bV9nbHVlXzA9MS4wMDAgfHx8IC0zLjAwMAorMyB8fHwgcmVhbGx5IGJpZyBudW1iZXIgfHx8IHRtX3JlZ2V4cF8wPS0xLjAwMCB0bV9yZWdleHBfMT0tMS4wMDAgdG1fZ2x1ZV8wPTEuMDAwIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC0zLjAwMAogMyB8fHwgMTkyODM3MTAyOF9PT1YgfHx8IHRtX3JlZ2V4cF8wPTAuMDAwIHRtX3JlZ2V4cF8xPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTAxLjAwMAogNCB8fHwgMTkyODM3MTAyX09PViB8fHwgdG1fcmVnZXhwXzA9MC4wMDAgdG1fcmVnZXhwXzE9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIE9PVlBlbmFsdHk9LTEwMC4wMDAgfHx8IC0xMDEuMDAwCmRpZmYgLS1naXQgYS90ZXN0L2RlY29kZXIvcmVnZXhwLWdyYW1tYXIvb3V0cHV0LmdvbGQgYi90ZXN0L2RlY29kZXIvcmVnZXhwLWdyYW1tYXIvb3V0cHV0LmdvbGQKaW5kZXggYWZhZjRhOC4uNDljNWVhNCAxMDA2NDQKLS0tIGEvdGVzdC9kZWNvZGVyL3JlZ2V4cC1ncmFtbWFyL291dHB1dC5nb2xkCisrKyBiL3Rlc3QvZGVjb2Rlci9yZWdleHAtZ3JhbW1hci9vdXRwdXQuZ29sZApAQCAtMSw0ICsxLDQgQEAKLTAgfHx8IGdpcmwgcHJldHR5IHx8fCB0bV9yZWdleHBfMD0tMi4wMDAgdG1fcmVnZXhwXzE9LTEuMDAwIHRtX2dsdWVfMD0yLjAwMCB8fHwgLTUuMDAwCi0xIHx8fCBib3kgcHJldHR5IHx8fCB0bV9yZWdleHBfMD0tMi4wMDAgdG1fcmVnZXhwXzE9LTEuMDAwIHRtX2dsdWVfMD0yLjAwMCB8fHwgLTUuMDAwCi0yIHx8fCByZWFsbHkgYmlnIG51bWJlciB8fHwgdG1fcmVnZXhwXzA9LTEuMDAwIHRtX3JlZ2V4cF8xPS0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgfHx8IC0yLjAwMAorMCB8fHwgZ2lybCBwcmV0dHkgfHx8IHRtX3JlZ2V4cF8wPS0yLjAwMCB0bV9yZWdleHBfMT0tMS4wMDAgdG1fZ2x1ZV8wPTIuMDAwIE9PVlBlbmFsdHk9MC4wMDAgfHx8IC01LjAwMAorMSB8fHwgYm95IHByZXR0eSB8fHwgdG1fcmVnZXhwXzA9LTIuMDAwIHRtX3JlZ2V4cF8xPS0xLjAwMCB0bV9nbHVlXzA9Mi4wMDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTUuMDAwCisyIHx8fCByZWFsbHkgYmlnIG51bWJlciB8fHwgdG1fcmVnZXhwXzA9LTEuMDAwIHRtX3JlZ2V4cF8xPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBPT1ZQZW5hbHR5PTAuMDAwIHx8fCAtMi4wMDAKIDMgfHx8IDE5MjgzNzEwMl9PT1YgfHx8IHRtX3JlZ2V4cF8wPTAuMDAwIHRtX3JlZ2V4cF8xPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBPT1ZQZW5hbHR5PS0xMDAuMDAwIHx8fCAtMTAxLjAwMApkaWZmIC0tZ2l0IGEvdGVzdC9kZWNvZGVyL3Jlc2NvcmluZy9vdXRwdXQuZ29sZCBiL3Rlc3QvZGVjb2Rlci9yZXNjb3Jpbmcvb3V0cHV0LmdvbGQKaW5kZXggNGQ2YzUxMi4uNWQ2NjAwZCAxMDA2NDQKLS0tIGEvdGVzdC9kZWNvZGVyL3Jlc2NvcmluZy9vdXRwdXQuZ29sZAorKysgYi90ZXN0L2RlY29kZXIvcmVzY29yaW5nL291dHB1dC5nb2xkCkBAIC0xLDEyICsxLDEyIEBACi0wIHx8fCB0aGUgYm95IGF0ZSB0aGUgY29ja3JvYWNoIHx8fCBsbV8wPS0xNy4xOTggdG1fcHRfMD0tNi4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCB8fHwgLTE5LjI0MAotMCB8fHwgdGhlIGJveSBlYXRlZCB0aGUgY29ja3JvYWNoIHx8fCBsbV8wPS0xNy4xOTggdG1fcHRfMD0tMTEuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgfHx8IC0yNC4yNDAKLTAgfHx8IHRoZSBib3kgZWF0ZWQgdGhlIGNvY2tyb2FjaCB8fHwgbG1fMD0tMTcuMTk4IHRtX3B0XzA9LTExLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuMDQwIHx8fCAtMjQuMjQwCi0wIHx8fCB0aGUga2lkIGVhdGVkIHRoZSBjb2Nrcm9hY2ggfHx8IGxtXzA9LTIwLjA1MyB0bV9wdF8wPS0xNS4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCB8fHwgLTMxLjc3MwotMCB8fHwgdGhlIGJveSBhdGUgdGhlIGNvY2tyb2FjaCB8fHwgbG1fMD0tMTcuMTk4IHRtX3B0XzA9LTYuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgfHx8IC0xOS4yNDAKLTAgfHx8IHRoZSBib3kgYXRlIHRoZSBidWcgfHx8IGxtXzA9LTE4LjA1OSB0bV9wdF8wPS0xNS4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCB8fHwgLTI5LjMwNgotMSB8fHwgdGhlIGJveSBhdGUgdGhlIGNvY2tyb2FjaCB8fHwgbG1fMD0tMTcuMTk4IHRtX3B0XzA9LTYuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgfHx8IC0xOS4yNDAKLTEgfHx8IHRoZSBib3kgZWF0ZWQgdGhlIGNvY2tyb2FjaCB8fHwgbG1fMD0tMTcuMTk4IHRtX3B0XzA9LTExLjAwMCB0bV9nbHVlXzA9NS4wMDAgV29yZFBlbmFsdHk9LTMuMDQwIHx8fCAtMjQuMjQwCi0xIHx8fCB0aGUgYm95IGF0ZSB0aGUgY29ja3JvYWNoIHx8fCBsbV8wPS0xNy4xOTggdG1fcHRfMD0tNi4wMDAgdG1fZ2x1ZV8wPTUuMDAwIFdvcmRQZW5hbHR5PS0zLjA0MCB8fHwgLTE5LjI0MAotMSB8fHwgdGhlIGJveSBlYXRlZCB0aGUgY29ja3JvYWNoIHx8fCBsbV8wPS0xNy4xOTggdG1fcHRfMD0tMTEuMDAwIHRtX2dsdWVfMD01LjAwMCBXb3JkUGVuYWx0eT0tMy4wNDAgfHx8IC0yNC4yNDAKLTEgfHx8IHRoZSBiaWcgc3Rvcm0gc3dhcm1lZCB0aGUgY29hc3QgfHx8IGxtXzA9LTIxLjI5MyB0bV9wdF8wPS00OC4wMDAgdG1fZ2x1ZV8wPTMuMDAwIFdvcmRQZW5hbHR5PS0zLjQ3NCB8fHwgLTY3Ljg3MwotMSB8fHwgdGhlIGJpZyBzdG9ybSBzd2FybWVkIHRoZSBjb2Nrcm9hY2ggfHx8IGxtXzA9LTIyLjExNSB0bV9wdF8wPS0zMS4wMDAgdG1fZ2x1ZV8wPTQuMDAwIFdvcmRQZW5hbHR5PS0zLjQ3NCB8fHwgLTUwLjg5MAorMCB8fHwgdGhlIGJveSBhdGUgdGhlIGNvY2tyb2FjaCB8fHwgdG1fcHRfMD0tNi4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3LjE5OCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTE5LjI0MAorMCB8fHwgdGhlIGJveSBlYXRlZCB0aGUgY29ja3JvYWNoIHx8fCB0bV9wdF8wPS0xMS4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3LjE5OCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTI0LjI0MAorMCB8fHwgdGhlIGJveSBlYXRlZCB0aGUgY29ja3JvYWNoIHx8fCB0bV9wdF8wPS0xMS4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3LjE5OCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTI0LjI0MAorMCB8fHwgdGhlIGtpZCBlYXRlZCB0aGUgY29ja3JvYWNoIHx8fCB0bV9wdF8wPS0xNS4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTIwLjA1MyBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTMxLjc3MworMCB8fHwgdGhlIGJveSBhdGUgdGhlIGNvY2tyb2FjaCB8fHwgdG1fcHRfMD0tNi4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3LjE5OCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTE5LjI0MAorMCB8fHwgdGhlIGJveSBlYXRlZCB0aGUgY29ja3JvYWNoIHx8fCB0bV9wdF8wPS0xMS4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3LjE5OCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTI0LjI0MAorMSB8fHwgdGhlIGJveSBhdGUgdGhlIGNvY2tyb2FjaCB8fHwgdG1fcHRfMD0tNi4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3LjE5OCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTE5LjI0MAorMSB8fHwgdGhlIGJveSBlYXRlZCB0aGUgY29ja3JvYWNoIHx8fCB0bV9wdF8wPS0xMS4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3LjE5OCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTI0LjI0MAorMSB8fHwgdGhlIGJveSBhdGUgdGhlIGNvY2tyb2FjaCB8fHwgdG1fcHRfMD0tNi4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3LjE5OCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTE5LjI0MAorMSB8fHwgdGhlIGJveSBlYXRlZCB0aGUgY29ja3JvYWNoIHx8fCB0bV9wdF8wPS0xMS4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3LjE5OCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTI0LjI0MAorMSB8fHwgdGhlIGJveSBhdGUgdGhlIGNvY2tyb2FjaCB8fHwgdG1fcHRfMD0tNi4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3LjE5OCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTE5LjI0MAorMSB8fHwgdGhlIGJveSBlYXRlZCB0aGUgY29ja3JvYWNoIHx8fCB0bV9wdF8wPS0xMS4wMDAgdG1fZ2x1ZV8wPTUuMDAwIGxtXzA9LTE3LjE5OCBXb3JkUGVuYWx0eT0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCB8fHwgLTI0LjI0MApkaWZmIC0tZ2l0IGEvdGVzdC9kZWNvZGVyL3NvdXJjZS1hbm5vdGF0aW9ucy9vdXRwdXQuZ29sZCBiL3Rlc3QvZGVjb2Rlci9zb3VyY2UtYW5ub3RhdGlvbnMvb3V0cHV0LmdvbGQKaW5kZXggMjY0MGYzNS4uMTAxMjVmNSAxMDA2NDQKLS0tIGEvdGVzdC9kZWNvZGVyL3NvdXJjZS1hbm5vdGF0aW9ucy9vdXRwdXQuZ29sZAorKysgYi90ZXN0L2RlY29kZXIvc291cmNlLWFubm90YXRpb25zL291dHB1dC5nb2xkCkBAIC0xLDIgKzEsMiBAQAotMCB8fHwgbXkgZnJpZW5kcyBjYWxsIG1lIHx8fCBsbV8wPS0xMS45NzQgdG1fcHRfMD0tMy4wMDAgdG1fZ2x1ZV8wPTMuMDAwIFdvcmRQZW5hbHR5PS0yLjYwNiB8fHwgLTcuNjUwCi0wIHx8fCBteSBmcmllbmRzIGNhbGwgbWUgfHx8IGxtXzA9LTExMS41MTMgdG1fcHRfMD0tMy4wMDAgdG1fZ2x1ZV8wPTMuMDAwIFdvcmRQZW5hbHR5PS0yLjYwNiB8fHwgLTEwNy4xODkKKzAgfHx8IG15IGZyaWVuZHMgY2FsbCBtZSB8fHwgdG1fcHRfMD0tMy4wMDAgdG1fZ2x1ZV8wPTMuMDAwIGxtXzA9LTExLjk3NCBPT1ZQZW5hbHR5PTAuMDAwIFdvcmRQZW5hbHR5PS0yLjYwNiB8fHwgLTcuNjUwCiswIHx8fCBteSBmcmllbmRzIGNhbGwgbWUgfHx8IHRtX3B0XzA9LTMuMDAwIHRtX2dsdWVfMD0zLjAwMCBsbV8wPS0xMTEuNTEzIE9PVlBlbmFsdHk9MC4wMDAgV29yZFBlbmFsdHk9LTIuNjA2IHx8fCAtMTA3LjE4OQpkaWZmIC0tZ2l0IGEvdGVzdC9kZWNvZGVyL3RhcmdldC1iaWdyYW0vb3V0LmdvbGQgYi90ZXN0L2RlY29kZXIvdGFyZ2V0LWJpZ3JhbS9vdXQuZ29sZAppbmRleCA3NmFiMmNiLi44ZDUzYTI4IDEwMDY0NAotLS0gYS90ZXN0L2RlY29kZXIvdGFyZ2V0LWJpZ3JhbS9vdXQuZ29sZAorKysgYi90ZXN0L2RlY29kZXIvdGFyZ2V0LWJpZ3JhbS9vdXQuZ29sZApAQCAtMSwzICsxLDMgQEAKLTAgfHx8IHRoaXMgaXMgYSB0ZXN0IHx8fCBUYXJnZXRCaWdyYW1fPHM+X3RoaXM9MS4wMDAgVGFyZ2V0QmlncmFtX1VOS188L3M+PTEuMDAwIFRhcmdldEJpZ3JhbV9VTktfVU5LPTEuMDAwIFRhcmdldEJpZ3JhbV9pc19VTks9MS4wMDAgVGFyZ2V0QmlncmFtX3RoaXNfaXM9MS4wMDAgdG1fZ2x1ZV8wPTQuMDAwIHx8fCAwLjAwMAotMCB8fHwgdGhpcyBpcyBhIHRlc3QgfHx8IFRhcmdldEJpZ3JhbV88cz5fVU5LPTEuMDAwIFRhcmdldEJpZ3JhbV9VTktfPC9zPj0xLjAwMCBUYXJnZXRCaWdyYW1fVU5LX1VOSz0xLjAwMCBUYXJnZXRCaWdyYW1fVU5LX2E9MS4wMDAgVGFyZ2V0QmlncmFtX2FfVU5LPTEuMDAwIHRtX2dsdWVfMD00LjAwMCB8fHwgMC4wMDAKLTAgfHx8IHRoaXMgaXMgYSB0ZXN0IHx8fCBUYXJnZXRCaWdyYW1fPHM+X1VOSz0xLjAwMCBUYXJnZXRCaWdyYW1fVU5LXzwvcz49MS4wMDAgVGFyZ2V0QmlncmFtX1VOS19pcz0xLjAwMCBUYXJnZXRCaWdyYW1fYV9VTks9MS4wMDAgVGFyZ2V0QmlncmFtX2lzX2E9MS4wMDAgdG1fZ2x1ZV8wPTQuMDAwIHx8fCAwLjAwMAorMCB8fHwgdGhpcyBpcyBhIHRlc3QgfHx8IHRtX2dsdWVfMD00LjAwMCBUYXJnZXRCaWdyYW1fPHM+X3RoaXM9MS4wMDAgVGFyZ2V0QmlncmFtX1VOS188L3M+PTEuMDAwIFRhcmdldEJpZ3JhbV9VTktfVU5LPTEuMDAwIFRhcmdldEJpZ3JhbV9pc19VTks9MS4wMDAgVGFyZ2V0QmlncmFtX3RoaXNfaXM9MS4wMDAgfHx8IDAuMDAwCiswIHx8fCB0aGlzIGlzIGEgdGVzdCB8fHwgdG1fZ2x1ZV8wPTQuMDAwIFRhcmdldEJpZ3JhbV88cz5fVU5LPTEuMDAwIFRhcmdldEJpZ3JhbV9VTktfPC9zPj0xLjAwMCBUYXJnZXRCaWdyYW1fVU5LX1VOSz0xLjAwMCBUYXJnZXRCaWdyYW1fVU5LX2E9MS4wMDAgVGFyZ2V0QmlncmFtX2FfVU5LPTEuMDAwIHx8fCAwLjAwMAorMCB8fHwgdGhpcyBpcyBhIHRlc3QgfHx8IHRtX2dsdWVfMD00LjAwMCBUYXJnZXRCaWdyYW1fPHM+X1VOSz0xLjAwMCBUYXJnZXRCaWdyYW1fVU5LXzwvcz49MS4wMDAgVGFyZ2V0QmlncmFtX1VOS19pcz0xLjAwMCBUYXJnZXRCaWdyYW1fYV9VTks9MS4wMDAgVGFyZ2V0QmlncmFtX2lzX2E9MS4wMDAgfHx8IDAuMDAwCmRpZmYgLS1naXQgYS90ZXN0L2RlY29kZXIvdGFyZ2V0LWJpZ3JhbS90ZXN0LnNoIGIvdGVzdC9kZWNvZGVyL3RhcmdldC1iaWdyYW0vdGVzdC5zaAppbmRleCAwN2Y3YWNiLi42NDE0YjYxIDEwMDc1NQotLS0gYS90ZXN0L2RlY29kZXIvdGFyZ2V0LWJpZ3JhbS90ZXN0LnNoCisrKyBiL3Rlc3QvZGVjb2Rlci90YXJnZXQtYmlncmFtL3Rlc3Quc2gKQEAgLTEsOCArMSw4IEBACiAjIS9iaW4vYmFzaAogCi0oZWNobyAidGhpcyBpcyBhIHRlc3QiIHwgZGVjb2RlciAtZmVhdHVyZS1mdW5jdGlvbiAiVGFyZ2V0QmlncmFtIC12b2NhYiB2b2NhYiAtdG9wLW4gMiI7Ci1lY2hvICJ0aGlzIGlzIGEgdGVzdCIgfCBkZWNvZGVyIC1mZWF0dXJlLWZ1bmN0aW9uICJUYXJnZXRCaWdyYW0gLXZvY2FiIHZvY2FiIC10b3AtbiAzIC10aHJlc2hvbGQgMjAiOwotZWNobyAidGhpcyBpcyBhIHRlc3QiIHwgZGVjb2RlciAtZmVhdHVyZS1mdW5jdGlvbiAiVGFyZ2V0QmlncmFtIC12b2NhYiB2b2NhYiAtdGhyZXNob2xkIDEwIikgMj5sb2cgPiBvdXQKKyhlY2hvICJ0aGlzIGlzIGEgdGVzdCIgfCAkSk9TSFVBL2Jpbi9qb3NodWEtZGVjb2RlciAtZmVhdHVyZS1mdW5jdGlvbiAiVGFyZ2V0QmlncmFtIC12b2NhYiB2b2NhYiAtdG9wLW4gMiI7CitlY2hvICJ0aGlzIGlzIGEgdGVzdCIgfCAkSk9TSFVBL2Jpbi9qb3NodWEtZGVjb2RlciAtZmVhdHVyZS1mdW5jdGlvbiAiVGFyZ2V0QmlncmFtIC12b2NhYiB2b2NhYiAtdG9wLW4gMyAtdGhyZXNob2xkIDIwIjsKK2VjaG8gInRoaXMgaXMgYSB0ZXN0IiB8ICRKT1NIVUEvYmluL2pvc2h1YS1kZWNvZGVyIC1mZWF0dXJlLWZ1bmN0aW9uICJUYXJnZXRCaWdyYW0gLXZvY2FiIHZvY2FiIC10aHJlc2hvbGQgMTAiKSAyPmxvZyA+IG91dAogCiAjIENvbXBhcmUKIGRpZmYgLXUgb3V0IG91dC5nb2xkID4gZGlmZgpkaWZmIC0tZ2l0IGEvdGVzdC9kZWNvZGVyL3RyZWUtb3V0cHV0L2dsdWUtZ3JhbW1hciBiL3Rlc3QvZGVjb2Rlci90cmVlLW91dHB1dC9nbHVlLWdyYW1tYXIKaW5kZXggZDllNDBhZS4uMWVjMTNlMiAxMDA2NDQKLS0tIGEvdGVzdC9kZWNvZGVyL3RyZWUtb3V0cHV0L2dsdWUtZ3JhbW1hcgorKysgYi90ZXN0L2RlY29kZXIvdHJlZS1vdXRwdXQvZ2x1ZS1ncmFtbWFyCkBAIC0zLDMgKzMsNCBAQAogW0dPQUxdIHx8fCBbR09BTCwxXSBbRCwyXSB8fHwgW0dPQUwsMV0gW0QsMl0gfHx8IC0xCiBbR09BTF0gfHx8IFtHT0FMLDFdIFtTLDJdIHx8fCBbR09BTCwxXSBbUywyXSB8fHwgLTEKIFtHT0FMXSB8fHwgW0dPQUwsMV0gPC9zPiB8fHwgW0dPQUwsMV0gPC9zPiB8fHwgMAorW0dPQUxdIHx8fCA8cz4gW05QXERUXSA8L3M+IHx8fCA8cz4gW05QXERULDFdIDwvcz4gfHx8IC0xCmRpZmYgLS1naXQgYS90ZXN0L2RlY29kZXIvdHJlZS1vdXRwdXQvZ3JhbW1hci5neiBiL3Rlc3QvZGVjb2Rlci90cmVlLW91dHB1dC9ncmFtbWFyLmd6CmluZGV4IGE5NTEwZWYuLmE1Mzg1MDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGVjb2Rlci90cmVlLW91dHB1dC9ncmFtbWFyLmd6CisrKyBiL3Rlc3QvZGVjb2Rlci90cmVlLW91dHB1dC9ncmFtbWFyLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGVjb2Rlci90cmVlLW91dHB1dC9pbnB1dCBiL3Rlc3QvZGVjb2Rlci90cmVlLW91dHB1dC9pbnB1dAppbmRleCAxNDQyNTY3Li5hNWExOGI0IDEwMDY0NAotLS0gYS90ZXN0L2RlY29kZXIvdHJlZS1vdXRwdXQvaW5wdXQKKysrIGIvdGVzdC9kZWNvZGVyL3RyZWUtb3V0cHV0L2lucHV0CkBAIC0yLDMgKzIsNCBAQAogYW4gdW5wYXJzZWFibGUgc2VudGVuY2UKIGJhegogeW8gc295CitwdXJjaGFzZSB4c2xvdApkaWZmIC0tZ2l0IGEvdGVzdC9kZWNvZGVyL3RyZWUtb3V0cHV0L291dHB1dC5nb2xkIGIvdGVzdC9kZWNvZGVyL3RyZWUtb3V0cHV0L291dHB1dC5nb2xkCmluZGV4IGQ0NWExNDguLjk0NzQwNDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGVjb2Rlci90cmVlLW91dHB1dC9vdXRwdXQuZ29sZAorKysgYi90ZXN0L2RlY29kZXIvdHJlZS1vdXRwdXQvb3V0cHV0LmdvbGQKQEAgLTIsMyArMiw0IEBACiAxICgpCiAyIChHT0FMIChHT0FMIChHT0FMIDxzPikgKEQgYmF6KSkgPC9zPikKIDMgKEdPQUwgKEdPQUwgKEdPQUwgPHM+KSAoUyBJIEFNKSkgPC9zPikKKzQgKEdPQUwgPHM+IChOUFxEVCByaWdodCAoTk4geHNsb3QpKSA8L3M+KQpkaWZmIC0tZ2l0IGEvdGVzdC9ncmFtbWFyL3NwYXJzZS1mZWF0dXJlcy9vdXRwdXQuZ29sZCBiL3Rlc3QvZ3JhbW1hci9zcGFyc2UtZmVhdHVyZXMvb3V0cHV0LmdvbGQKaW5kZXggYzJkZmM4OC4uN2UwN2M2NiAxMDA2NDQKLS0tIGEvdGVzdC9ncmFtbWFyL3NwYXJzZS1mZWF0dXJlcy9vdXRwdXQuZ29sZAorKysgYi90ZXN0L2dyYW1tYXIvc3BhcnNlLWZlYXR1cmVzL291dHB1dC5nb2xkCkBAIC0xICsxIEBACi0wIHx8fCB0aGUgYm95IHx8fCBsbV8wPTAuMDAwIHRtX3B0XzA9MS4wMDAgc3BhcnNlX3Rlc3RfZmVhdHVyZT0xLjAwMCBzdmQ9MS4wMDAgdGhlX2JveT0xLjAwMCB0bV9nbHVlXzA9MS4wMDAgfHx8IDEuMDAwCiswIHx8fCB0aGUgYm95IHx8fCB0bV9wdF8wPTEuMDAwIHRtX2dsdWVfMD0xLjAwMCBzcGFyc2VfdGVzdF9mZWF0dXJlPTEuMDAwIHN2ZD0xLjAwMCB0aGVfYm95PTEuMDAwIHx8fCAxLjAwMApkaWZmIC0tZ2l0IGEvdGVzdC9ncmFtbWFyL3NwYXJzZS1mZWF0dXJlcy90ZXN0LnNoIGIvdGVzdC9ncmFtbWFyL3NwYXJzZS1mZWF0dXJlcy90ZXN0LnNoCmluZGV4IDA3ZjQ2ZDIuLjY4NzhkZDcgMTAwNzU1Ci0tLSBhL3Rlc3QvZ3JhbW1hci9zcGFyc2UtZmVhdHVyZXMvdGVzdC5zaAorKysgYi90ZXN0L2dyYW1tYXIvc3BhcnNlLWZlYXR1cmVzL3Rlc3Quc2gKQEAgLTIsMTMgKzIsMTMgQEAKIAogc2V0IC11CiAKLWVjaG8gZWwgY2hpY28gfCAkSk9TSFVBL2Jpbi9kZWNvZGVyIC1jIGpvc2h1YS5jb25maWcgLXYgMCA+IG91dHB1dAorZWNobyBlbCBjaGljbyB8ICRKT1NIVUEvYmluL2RlY29kZXIgLWMgam9zaHVhLmNvbmZpZyAtdiAwID4gb3V0cHV0IDI+IGxvZwogCiAjIENvbXBhcmUKIGRpZmYgLXUgb3V0cHV0IG91dHB1dC5nb2xkID4gZGlmZgogCiBpZiBbICQ/IC1lcSAwIF07IHRoZW4KLSAgcm0gLWYgZGlmZiBvdXRwdXQKKyAgcm0gLWYgZGlmZiBvdXRwdXQgbG9nCiAgIGV4aXQgMAogZWxzZQogICBleGl0IDEKZGlmZiAtLWdpdCBhL3Rlc3QvbGF0dGljZS1zaG9ydC9vdXRwdXQuZXhwZWN0ZWQgYi90ZXN0L2xhdHRpY2Utc2hvcnQvb3V0cHV0LmV4cGVjdGVkCmluZGV4IGZiM2JhZjEuLmU5ZDQyZjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvbGF0dGljZS1zaG9ydC9vdXRwdXQuZXhwZWN0ZWQKKysrIGIvdGVzdC9sYXR0aWNlLXNob3J0L291dHB1dC5leHBlY3RlZApAQCAtMSwxNyArMSwxNyBAQAotMCB8fHwgQSB8fHwgbG1fMD0tMy4wNDAgdG1fcHRfMD0tMS4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBTb3VyY2VQYXRoPTAuMDAwIHx8fCAtMi43MzcKLTAgfHx8IGEgfHx8IGxtXzA9LTEwMC42ODEgdG1fcHRfMD0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgV29yZFBlbmFsdHk9LTEuMzAzIE9PVlBlbmFsdHk9LTEwMC4wMDAgU291cmNlUGF0aD0wLjAwMCB8fHwgLTE5OS4zNzgKLTEgfHx8IEEgWCB8fHwgbG1fMD0tMTAxLjgyNyB0bV9wdF8wPS00LjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0xMDQuMDkwCi0xIHx8fCBBIHggfHx8IGxtXzA9LTEwMS44MjcgdG1fcHRfMD0tMS4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0yMDEuMDkwCi0xIHx8fCBhIFggfHx8IGxtXzA9LTIwMC42ODEgdG1fcHRfMD0tMy4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0zMDEuOTQ0Ci0xIHx8fCBhIHggfHx8IGxtXzA9LTIwMC42ODEgdG1fcHRfMD0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9LTIwMC4wMDAgU291cmNlUGF0aD0wLjAwMCB8fHwgLTM5OC45NDQKLTIgfHx8IEIgfHx8IGxtXzA9LTEwMC42ODEgdG1fcHRfMD0tMi4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBTb3VyY2VQYXRoPTAuMDAwIHx8fCAtMTAxLjM3OAotMiB8fHwgYiB8fHwgbG1fMD0tMTAwLjY4MSB0bV9wdF8wPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgT09WUGVuYWx0eT0tMTAwLjAwMCBTb3VyY2VQYXRoPTAuMDAwIHx8fCAtMTk5LjM3OAotMyB8fHwgQiBYIHx8fCBsbV8wPS0yMDAuNjgxIHRtX3B0XzA9LTUuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0wLjAwMCB8fHwgLTIwMy45NDQKLTMgfHx8IEIgeCB8fHwgbG1fMD0tMjAwLjY4MSB0bV9wdF8wPS0yLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9LTEwMC4wMDAgU291cmNlUGF0aD0wLjAwMCB8fHwgLTMwMC45NDQKLTMgfHx8IGIgWCB8fHwgbG1fMD0tMjAwLjY4MSB0bV9wdF8wPS0zLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IE9PVlBlbmFsdHk9LTEwMC4wMDAgU291cmNlUGF0aD0wLjAwMCB8fHwgLTMwMS45NDQKLTMgfHx8IGIgeCB8fHwgbG1fMD0tMjAwLjY4MSB0bV9wdF8wPTAuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgT09WUGVuYWx0eT0tMjAwLjAwMCBTb3VyY2VQYXRoPTAuMDAwIHx8fCAtMzk4Ljk0NAotNCB8fHwgQSBYIHx8fCBsbV8wPS0xMDEuMTQ2IHRtX3B0XzA9LTQuMDAwIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgU291cmNlUGF0aD0yLjAwMCB8fHwgLTEwMS44NDMKLTQgfHx8IEEgeCB8fHwgbG1fMD0tMTAxLjE0NiB0bV9wdF8wPS0xLjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuMzAzIE9PVlBlbmFsdHk9LTEwMC4wMDAgU291cmNlUGF0aD0yLjAwMCB8fHwgLTE5OC44NDMKLTQgfHx8IEIgWCB8fHwgbG1fMD0tMjAwLjAwMCB0bV9wdF8wPS01LjAwMCB0bV9nbHVlXzA9Mi4wMDAgV29yZFBlbmFsdHk9LTEuMzAzIFNvdXJjZVBhdGg9Mi4wMDAgfHx8IC0yMDEuNjk3Ci00IHx8fCBCIHggfHx8IGxtXzA9LTIwMC4wMDAgdG1fcHRfMD0tMi4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9Mi4wMDAgfHx8IC0yOTguNjk3Ci00IHx8fCBhIFggfHx8IGxtXzA9LTIwMC4wMDAgdG1fcHRfMD0tMy4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9Mi4wMDAgfHx8IC0yOTkuNjk3CiswIHx8fCBBIHx8fCB0bV9wdF8wPS0xLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMy4wNDAgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgU291cmNlUGF0aD0wLjAwMCB8fHwgLTIuNzM3CiswIHx8fCBhIHx8fCB0bV9wdF8wPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xMDAuNjgxIE9PVlBlbmFsdHk9LTEwMC4wMDAgV29yZFBlbmFsdHk9LTEuMzAzIFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0xOTkuMzc4CisxIHx8fCBBIFggfHx8IHRtX3B0XzA9LTQuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0xMDEuODI3IE9PVlBlbmFsdHk9MC4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0xMDQuMDkwCisxIHx8fCBBIHggfHx8IHRtX3B0XzA9LTEuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0xMDEuODI3IE9PVlBlbmFsdHk9LTEwMC4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0yMDEuMDkwCisxIHx8fCBhIFggfHx8IHRtX3B0XzA9LTMuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0yMDAuNjgxIE9PVlBlbmFsdHk9LTEwMC4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0zMDEuOTQ0CisxIHx8fCBhIHggfHx8IHRtX3B0XzA9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTIwMC42ODEgT09WUGVuYWx0eT0tMjAwLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0wLjAwMCB8fHwgLTM5OC45NDQKKzIgfHx8IEIgfHx8IHRtX3B0XzA9LTIuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xMDAuNjgxIE9PVlBlbmFsdHk9MC4wMDAgV29yZFBlbmFsdHk9LTEuMzAzIFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0xMDEuMzc4CisyIHx8fCBiIHx8fCB0bV9wdF8wPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xMDAuNjgxIE9PVlBlbmFsdHk9LTEwMC4wMDAgV29yZFBlbmFsdHk9LTEuMzAzIFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0xOTkuMzc4CiszIHx8fCBCIFggfHx8IHRtX3B0XzA9LTUuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0yMDAuNjgxIE9PVlBlbmFsdHk9MC4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0yMDMuOTQ0CiszIHx8fCBCIHggfHx8IHRtX3B0XzA9LTIuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0yMDAuNjgxIE9PVlBlbmFsdHk9LTEwMC4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0zMDAuOTQ0CiszIHx8fCBiIFggfHx8IHRtX3B0XzA9LTMuMDAwIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0yMDAuNjgxIE9PVlBlbmFsdHk9LTEwMC4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0zMDEuOTQ0CiszIHx8fCBiIHggfHx8IHRtX3B0XzA9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTIwMC42ODEgT09WUGVuYWx0eT0tMjAwLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0wLjAwMCB8fHwgLTM5OC45NDQKKzQgfHx8IEEgWCB8fHwgdG1fcHRfMD0tNC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTEwMS44MjcgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0yLjAwMCB8fHwgLTEwMi4wOTAKKzQgfHx8IEEgeCB8fHwgdG1fcHRfMD0tMS4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTEwMS44MjcgT09WUGVuYWx0eT0tMTAwLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0yLjAwMCB8fHwgLTE5OS4wOTAKKzQgfHx8IEIgWCB8fHwgdG1fcHRfMD0tNS4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTIwMC42ODEgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0yLjAwMCB8fHwgLTIwMS45NDQKKzQgfHx8IEIgeCB8fHwgdG1fcHRfMD0tMi4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTIwMC42ODEgT09WUGVuYWx0eT0tMTAwLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0yLjAwMCB8fHwgLTI5OC45NDQKKzQgfHx8IGIgWCB8fHwgdG1fcHRfMD0tMy4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTIwMC42ODEgT09WUGVuYWx0eT0tMTAwLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0yLjAwMCB8fHwgLTI5OS45NDQKZGlmZiAtLWdpdCBhL3Rlc3QvbGF0dGljZS9vdXRwdXQuZXhwZWN0ZWQgYi90ZXN0L2xhdHRpY2Uvb3V0cHV0LmV4cGVjdGVkCmluZGV4IDljYzZkODkuLjI1MjhmMTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvbGF0dGljZS9vdXRwdXQuZXhwZWN0ZWQKKysrIGIvdGVzdC9sYXR0aWNlL291dHB1dC5leHBlY3RlZApAQCAtMSwzMiArMSwzMyBAQAotMCB8fHwgZGllc2VzIGhhdXMgfHx8IHRoaXMgaG91c2UgfHx8IGxtXzA9LTEuNzQ4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTAuMDIxIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgU291cmNlUGF0aD0tMS4wMDAgfHx8IC0xLjQ1NgotMCB8fHwgZWluIGhhdXMgfHx8IGEgaG91c2UgfHx8IGxtXzA9LTEuODA5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMjI4IHRtX3B0XzI9LTAuMDIxIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgU291cmNlUGF0aD0tMC45MDAgfHx8IC0xLjUzMQotMCB8fHwgaGF1cyB8fHwgaG91c2UgfHx8IGxtXzA9LTIuNDM3IHRtX3B0XzA9LTAuMDIyIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTAuMDIxIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMC44NjkgU291cmNlUGF0aD0tMC41MDAgfHx8IC0yLjEwMQotMCB8fHwgZWluIGhhdXMgfHx8IGEgc21hbGwgaG91c2UgfHx8IGxtXzA9LTEuOTU3IHRtX3B0XzA9LTAuNzc4IHRtX3B0XzE9LTAuMjI4IHRtX3B0XzI9LTEuMzQzIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0tMC45MDAgfHx8IC0yLjY4NAotMCB8fHwgZGllc2VzIGhhdXMgfHx8IHRoaXMgc21hbGwgaG91c2UgfHx8IGxtXzA9LTIuODQ0IHRtX3B0XzA9LTEuMzAxIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMzQzIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0tMS4wMDAgfHx8IC00LjA4MAotMCB8fHwgaGF1cyB8fHwgc21hbGwgaG91c2UgfHx8IGxtXzA9LTMuNTU1IHRtX3B0XzA9LTEuMzAxIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMzQzIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgU291cmNlUGF0aD0tMC41MDAgfHx8IC00LjcyNAotMCB8fHwgaGF1cyB8fHwgaGF1c19PT1YgfHx8IGxtXzA9LTEwMC4wMDAgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0wLjg2OSBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTAuNTAwIHx8fCAtMTk5LjYzMQotMCB8fHwgZWluIGhhdXMgfHx8IGVpbl9PT1YgaG91c2UgfHx8IGxtXzA9LTEwMC45OTIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMC4wMjEgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTAuOTAwIHx8fCAtMjAwLjYwMAotMCB8fHwgZGllc2VzIGhhdXMgfHx8IGRpZXNlc19PT1YgaG91c2UgfHx8IGxtXzA9LTEwMC45OTIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMC4wMjEgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTEuMDAwIHx8fCAtMjAwLjcwMAotMCB8fHwgZGllc2VzIGhhdXMgfHx8IHRoaXMgaGF1c19PT1YgfHx8IGxtXzA9LTEwMS4xNDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTEuMDAwIHx8fCAtMjAwLjg0MwotMCB8fHwgZWluIGhhdXMgfHx8IGEgaGF1c19PT1YgfHx8IGxtXzA9LTEwMS4xNDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4yMjggdG1fcHRfMj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTAuOTAwIHx8fCAtMjAwLjg1NwotMCB8fHwgZWluIGhhdXMgfHx8IGVpbl9PT1Ygc21hbGwgaG91c2UgfHx8IGxtXzA9LTEwMi4xMTAgdG1fcHRfMD0tMS4zMDEgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4zNDMgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTAuOTAwIHx8fCAtMjAzLjI0NgotMCB8fHwgZGllc2VzIGhhdXMgfHx8IGRpZXNlc19PT1Ygc21hbGwgaG91c2UgfHx8IGxtXzA9LTEwMi4xMTAgdG1fcHRfMD0tMS4zMDEgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4zNDMgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTEuMDAwIHx8fCAtMjAzLjM0NgotMCB8fHwgZWluIGhhdXMgfHx8IGVpbl9PT1YgaGF1c19PT1YgfHx8IGxtXzA9LTIwMC4wMDAgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0yMDAuMDAwIFNvdXJjZVBhdGg9LTAuOTAwIHx8fCAtMzk5LjU5NwotMCB8fHwgZGllc2VzIGhhdXMgfHx8IGRpZXNlc19PT1YgaGF1c19PT1YgfHx8IGxtXzA9LTIwMC4wMDAgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0yMDAuMDAwIFNvdXJjZVBhdGg9LTEuMDAwIHx8fCAtMzk5LjY5NwotMSB8fHwgZWluIHx8fCBhIHx8fCBsbV8wPS0zLjA0MCB0bV9wdF8wPS0wLjAwMCB0bV9wdF8xPS0wLjIyOCB0bV9wdF8yPS0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgV29yZFBlbmFsdHk9LTEuMzAzIFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0xLjg1MQotMSB8fHwgZWluIHx8fCBlaW5fT09WIHx8fCBsbV8wPS0xMDAuNjgxIHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgT09WUGVuYWx0eT0tMTAwLjAwMCBTb3VyY2VQYXRoPTAuMDAwIHx8fCAtMTk5LjM3OAotMiB8fHwgZWluIGhhdXMgfHx8IGEgaG91c2UgfHx8IGxtXzA9LTEuODA5IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMjI4IHRtX3B0XzI9LTAuMDIxIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgU291cmNlUGF0aD0tMC43MDAgfHx8IC0xLjMzMQotMiB8fHwgZGllc2VzIGhhdXMgfHx8IHRoaXMgaG91c2UgfHx8IGxtXzA9LTEuNzQ4IHRtX3B0XzA9LTAuMDAwIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTAuMDIxIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgU291cmNlUGF0aD0tMS4wMDAgfHx8IC0xLjQ1NgotMiB8fHwgaGF1cyB8fHwgaG91c2UgfHx8IGxtXzA9LTIuNDM3IHRtX3B0XzA9LTAuMDIyIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTAuMDIxIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMC44NjkgU291cmNlUGF0aD0tMC41MDAgfHx8IC0yLjEwMQotMiB8fHwgZWluIGhhdXMgfHx8IGEgc21hbGwgaG91c2UgfHx8IGxtXzA9LTEuOTU3IHRtX3B0XzA9LTAuNzc4IHRtX3B0XzE9LTAuMjI4IHRtX3B0XzI9LTEuMzQzIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0tMC43MDAgfHx8IC0yLjQ4NAotMiB8fHwgZGllc2VzIGhhdXMgfHx8IHRoaXMgc21hbGwgaG91c2UgfHx8IGxtXzA9LTIuODQ0IHRtX3B0XzA9LTEuMzAxIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMzQzIHRtX2dsdWVfMD0yLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0tMS4wMDAgfHx8IC00LjA4MAotMiB8fHwgaGF1cyB8fHwgc21hbGwgaG91c2UgfHx8IGxtXzA9LTMuNTU1IHRtX3B0XzA9LTEuMzAxIHRtX3B0XzE9LTAuMDAwIHRtX3B0XzI9LTEuMzQzIHRtX2dsdWVfMD0xLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgU291cmNlUGF0aD0tMC41MDAgfHx8IC00LjcyNAotMiB8fHwgaGF1cyB8fHwgaGF1c19PT1YgfHx8IGxtXzA9LTEwMC4wMDAgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0wLjg2OSBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTAuNTAwIHx8fCAtMTk5LjYzMQotMiB8fHwgZWluIGhhdXMgfHx8IGVpbl9PT1YgaG91c2UgfHx8IGxtXzA9LTEwMC45OTIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMC4wMjEgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTAuNzAwIHx8fCAtMjAwLjQwMAotMiB8fHwgZWluIGhhdXMgfHx8IGEgaGF1c19PT1YgfHx8IGxtXzA9LTEwMS4xNDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4yMjggdG1fcHRfMj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTAuNzAwIHx8fCAtMjAwLjY1NwotMiB8fHwgZGllc2VzIGhhdXMgfHx8IGRpZXNlc19PT1YgaG91c2UgfHx8IGxtXzA9LTEwMC45OTIgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMC4wMjEgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTEuMDAwIHx8fCAtMjAwLjcwMAotMiB8fHwgZGllc2VzIGhhdXMgfHx8IHRoaXMgaGF1c19PT1YgfHx8IGxtXzA9LTEwMS4xNDYgdG1fcHRfMD0tMC4wMDAgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTEuMDAwIHx8fCAtMjAwLjg0MwotMiB8fHwgZWluIGhhdXMgfHx8IGVpbl9PT1Ygc21hbGwgaG91c2UgfHx8IGxtXzA9LTEwMi4xMTAgdG1fcHRfMD0tMS4zMDEgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4zNDMgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTAuNzAwIHx8fCAtMjAzLjA0NgotMiB8fHwgZGllc2VzIGhhdXMgfHx8IGRpZXNlc19PT1Ygc21hbGwgaG91c2UgfHx8IGxtXzA9LTEwMi4xMTAgdG1fcHRfMD0tMS4zMDEgdG1fcHRfMT0tMC4wMDAgdG1fcHRfMj0tMS4zNDMgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFNvdXJjZVBhdGg9LTEuMDAwIHx8fCAtMjAzLjM0NgotMiB8fHwgZWluIGhhdXMgfHx8IGVpbl9PT1YgaGF1c19PT1YgfHx8IGxtXzA9LTIwMC4wMDAgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0yMDAuMDAwIFNvdXJjZVBhdGg9LTAuNzAwIHx8fCAtMzk5LjM5NwotMiB8fHwgZGllc2VzIGhhdXMgfHx8IGRpZXNlc19PT1YgaGF1c19PT1YgfHx8IGxtXzA9LTIwMC4wMDAgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBPT1ZQZW5hbHR5PS0yMDAuMDAwIFNvdXJjZVBhdGg9LTEuMDAwIHx8fCAtMzk5LjY5NworMCB8fHwgZGllc2VzIGhhdXMgfHx8IHRoaXMgaG91c2UgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0wLjAyMSB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMS44NjYgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0tMS4wMDAgfHx8IC0xLjE0MAorMCB8fHwgZWluIGhhdXMgfHx8IGEgaG91c2UgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0tMC4yMjggdG1fcHRfMj0tMC4wMjEgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTEuODg4IE9PVlBlbmFsdHk9MC4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IFNvdXJjZVBhdGg9LTAuOTAwIHx8fCAtMS4xNzYKKzAgfHx8IGhhdXMgfHx8IGhvdXNlIHx8fCB0bV9wdF8wPS0wLjAyMiB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTAuMDIxIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0yLjU1NSBPT1ZQZW5hbHR5PTAuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBTb3VyY2VQYXRoPS0wLjUwMCB8fHwgLTEuNzg1CiswIHx8fCBlaW4gaGF1cyB8fHwgYSBzbWFsbCBob3VzZSB8fHwgdG1fcHRfMD0tMC43NzggdG1fcHRfMT0tMC4yMjggdG1fcHRfMj0tMS4zNDMgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTIuMjc5IE9PVlBlbmFsdHk9MC4wMDAgV29yZFBlbmFsdHk9LTIuMTcxIFNvdXJjZVBhdGg9LTAuOTAwIHx8fCAtMi41NzIKKzAgfHx8IGRpZXNlcyBoYXVzIHx8fCB0aGlzIHNtYWxsIGhvdXNlIHx8fCB0bV9wdF8wPS0xLjMwMSB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEuMzQzIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0zLjE2NiBPT1ZQZW5hbHR5PTAuMDAwIFdvcmRQZW5hbHR5PS0yLjE3MSBTb3VyY2VQYXRoPS0xLjAwMCB8fHwgLTMuOTY3CiswIHx8fCBoYXVzIHx8fCBzbWFsbCBob3VzZSB8fHwgdG1fcHRfMD0tMS4zMDEgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xLjM0MyB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMy44NzcgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0tMC41MDAgfHx8IC00LjYxMgorMCB8fHwgaGF1cyB8fHwgaGF1c19PT1YgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xMDAuNjgxIE9PVlBlbmFsdHk9LTEwMC4wMDAgV29yZFBlbmFsdHk9LTEuMzAzIFNvdXJjZVBhdGg9LTAuNTAwIHx8fCAtMTk5Ljg3OAorMCB8fHwgZWluIGhhdXMgfHx8IGVpbl9PT1YgaG91c2UgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0wLjAyMSB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMTAxLjExMCBPT1ZQZW5hbHR5PS0xMDAuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBTb3VyY2VQYXRoPS0wLjkwMCB8fHwgLTIwMC4yODQKKzAgfHx8IGRpZXNlcyBoYXVzIHx8fCBkaWVzZXNfT09WIGhvdXNlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMC4wMjEgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTEwMS4xMTAgT09WUGVuYWx0eT0tMTAwLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0tMS4wMDAgfHx8IC0yMDAuMzg0CiswIHx8fCBkaWVzZXMgaGF1cyB8fHwgdGhpcyBoYXVzX09PViB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTEwMS44MjcgT09WUGVuYWx0eT0tMTAwLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0tMS4wMDAgfHx8IC0yMDEuMDkwCiswIHx8fCBlaW4gaGF1cyB8fHwgYSBoYXVzX09PViB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPS0wLjIyOCB0bV9wdF8yPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xMDEuODI3IE9PVlBlbmFsdHk9LTEwMC4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IFNvdXJjZVBhdGg9LTAuOTAwIHx8fCAtMjAxLjEwNAorMCB8fHwgZWluIGhhdXMgfHx8IGVpbl9PT1Ygc21hbGwgaG91c2UgfHx8IHRtX3B0XzA9LTEuMzAxIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4zNDMgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTEwMi40MzMgT09WUGVuYWx0eT0tMTAwLjAwMCBXb3JkUGVuYWx0eT0tMi4xNzEgU291cmNlUGF0aD0tMC45MDAgfHx8IC0yMDMuMTM0CiswIHx8fCBkaWVzZXMgaGF1cyB8fHwgZGllc2VzX09PViBzbWFsbCBob3VzZSB8fHwgdG1fcHRfMD0tMS4zMDEgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xLjM0MyB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tMTAyLjQzMyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFdvcmRQZW5hbHR5PS0yLjE3MSBTb3VyY2VQYXRoPS0xLjAwMCB8fHwgLTIwMy4yMzQKKzAgfHx8IGVpbiBoYXVzIHx8fCBlaW5fT09WIGhhdXNfT09WIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tMjAwLjY4MSBPT1ZQZW5hbHR5PS0yMDAuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBTb3VyY2VQYXRoPS0wLjkwMCB8fHwgLTM5OS44NDQKKzAgfHx8IGRpZXNlcyBoYXVzIHx8fCBkaWVzZXNfT09WIGhhdXNfT09WIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0wLjAwMCB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tMjAwLjY4MSBPT1ZQZW5hbHR5PS0yMDAuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBTb3VyY2VQYXRoPS0xLjAwMCB8fHwgLTM5OS45NDQKKzEgfHx8IGVpbiB8fHwgYSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPS0wLjIyOCB0bV9wdF8yPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0zLjA0MCBPT1ZQZW5hbHR5PTAuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBTb3VyY2VQYXRoPTAuMDAwIHx8fCAtMS44NTEKKzEgfHx8IGVpbiB8fHwgZWluX09PViB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9MC4wMDAgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTEwMC42ODEgT09WUGVuYWx0eT0tMTAwLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgU291cmNlUGF0aD0wLjAwMCB8fHwgLTE5OS4zNzgKKzIgfHx8IGVpbiBoYXVzIHx8fCBhIGhvdXNlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9LTAuMjI4IHRtX3B0XzI9LTAuMDIxIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xLjg4OCBPT1ZQZW5hbHR5PTAuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBTb3VyY2VQYXRoPS0wLjcwMCB8fHwgLTAuOTc2CisyIHx8fCBkaWVzZXMgaGF1cyB8fHwgdGhpcyBob3VzZSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTAuMDIxIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xLjg2NiBPT1ZQZW5hbHR5PTAuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBTb3VyY2VQYXRoPS0xLjAwMCB8fHwgLTEuMTQwCisyIHx8fCBoYXVzIHx8fCBob3VzZSB8fHwgdG1fcHRfMD0tMC4wMjIgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0wLjAyMSB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMi41NTUgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tMS4zMDMgU291cmNlUGF0aD0tMC41MDAgfHx8IC0xLjc4NQorMiB8fHwgZWluIGhhdXMgfHx8IGEgc21hbGwgaG91c2UgfHx8IHRtX3B0XzA9LTAuNzc4IHRtX3B0XzE9LTAuMjI4IHRtX3B0XzI9LTEuMzQzIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0yLjI3OSBPT1ZQZW5hbHR5PTAuMDAwIFdvcmRQZW5hbHR5PS0yLjE3MSBTb3VyY2VQYXRoPS0wLjcwMCB8fHwgLTIuMzcyCisyIHx8fCBkaWVzZXMgaGF1cyB8fHwgdGhpcyBzbWFsbCBob3VzZSB8fHwgdG1fcHRfMD0tMS4zMDEgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPS0xLjM0MyB0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tMy4xNjYgT09WUGVuYWx0eT0wLjAwMCBXb3JkUGVuYWx0eT0tMi4xNzEgU291cmNlUGF0aD0tMS4wMDAgfHx8IC0zLjk2NworMiB8fHwgaGF1cyB8fHwgc21hbGwgaG91c2UgfHx8IHRtX3B0XzA9LTEuMzAxIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4zNDMgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTMuODc3IE9PVlBlbmFsdHk9MC4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IFNvdXJjZVBhdGg9LTAuNTAwIHx8fCAtNC42MTIKKzIgfHx8IGhhdXMgfHx8IGhhdXNfT09WIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMTAwLjY4MSBPT1ZQZW5hbHR5PS0xMDAuMDAwIFdvcmRQZW5hbHR5PS0xLjMwMyBTb3VyY2VQYXRoPS0wLjUwMCB8fHwgLTE5OS44NzgKKzIgfHx8IGVpbiBoYXVzIHx8fCBlaW5fT09WIGhvdXNlIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMC4wMjEgdG1fZ2x1ZV8wPTEuMDAwIGxtXzA9LTEwMS4xMTAgT09WUGVuYWx0eT0tMTAwLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0tMC43MDAgfHx8IC0yMDAuMDg0CisyIHx8fCBkaWVzZXMgaGF1cyB8fHwgZGllc2VzX09PViBob3VzZSB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTAuMDIxIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xMDEuMTEwIE9PVlBlbmFsdHk9LTEwMC4wMDAgV29yZFBlbmFsdHk9LTEuNzM3IFNvdXJjZVBhdGg9LTEuMDAwIHx8fCAtMjAwLjM4NAorMiB8fHwgZWluIGhhdXMgfHx8IGEgaGF1c19PT1YgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0tMC4yMjggdG1fcHRfMj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMTAxLjgyNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBTb3VyY2VQYXRoPS0wLjcwMCB8fHwgLTIwMC45MDQKKzIgfHx8IGRpZXNlcyBoYXVzIHx8fCB0aGlzIGhhdXNfT09WIHx8fCB0bV9wdF8wPTAuMDAwIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0wLjAwMCB0bV9nbHVlXzA9MS4wMDAgbG1fMD0tMTAxLjgyNyBPT1ZQZW5hbHR5PS0xMDAuMDAwIFdvcmRQZW5hbHR5PS0xLjczNyBTb3VyY2VQYXRoPS0xLjAwMCB8fHwgLTIwMS4wOTAKKzIgfHx8IGVpbiBoYXVzIHx8fCBlaW5fT09WIHNtYWxsIGhvdXNlIHx8fCB0bV9wdF8wPS0xLjMwMSB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9LTEuMzQzIHRtX2dsdWVfMD0yLjAwMCBsbV8wPS0xMDIuNDMzIE9PVlBlbmFsdHk9LTEwMC4wMDAgV29yZFBlbmFsdHk9LTIuMTcxIFNvdXJjZVBhdGg9LTAuNzAwIHx8fCAtMjAyLjkzNAorMiB8fHwgZGllc2VzIGhhdXMgfHx8IGRpZXNlc19PT1Ygc21hbGwgaG91c2UgfHx8IHRtX3B0XzA9LTEuMzAxIHRtX3B0XzE9MC4wMDAgdG1fcHRfMj0tMS4zNDMgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTEwMi40MzMgT09WUGVuYWx0eT0tMTAwLjAwMCBXb3JkUGVuYWx0eT0tMi4xNzEgU291cmNlUGF0aD0tMS4wMDAgfHx8IC0yMDMuMjM0CisyIHx8fCBlaW4gaGF1cyB8fHwgZWluX09PViBoYXVzX09PViB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTIwMC42ODEgT09WUGVuYWx0eT0tMjAwLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0tMC43MDAgfHx8IC0zOTkuNjQ0CisyIHx8fCBkaWVzZXMgaGF1cyB8fHwgZGllc2VzX09PViBoYXVzX09PViB8fHwgdG1fcHRfMD0wLjAwMCB0bV9wdF8xPTAuMDAwIHRtX3B0XzI9MC4wMDAgdG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTIwMC42ODEgT09WUGVuYWx0eT0tMjAwLjAwMCBXb3JkUGVuYWx0eT0tMS43MzcgU291cmNlUGF0aD0tMS4wMDAgfHx8IC0zOTkuOTQ0CiszIHx8fCBzw60gfHx8IHPDrV9PT1YgfHx8IHRtX3B0XzA9MC4wMDAgdG1fcHRfMT0wLjAwMCB0bV9wdF8yPTAuMDAwIHRtX2dsdWVfMD0xLjAwMCBsbV8wPS0xMDAuNjgxIE9PVlBlbmFsdHk9LTEwMC4wMDAgV29yZFBlbmFsdHk9LTEuMzAzIFNvdXJjZVBhdGg9MC4wMDAgfHx8IC0xOTkuMzc4CmRpZmYgLS1naXQgYS90ZXN0L2xhdHRpY2UvdGVzdC5wbGYgYi90ZXN0L2xhdHRpY2UvdGVzdC5wbGYKaW5kZXggMmFhMjc2MS4uNjMyZTk1MiAxMDA2NDQKLS0tIGEvdGVzdC9sYXR0aWNlL3Rlc3QucGxmCisrKyBiL3Rlc3QvbGF0dGljZS90ZXN0LnBsZgpAQCAtMSwzICsxLDQgQEAKICgoKCdlaW4nLC0wLjIsMSksKCdkaWVzZXMnLC0wLjMsMSksKCdoYXVzJywtMC41LDIpLCksKCgnaGF1cycsLTAuNywxKSwpLCkKIGVpbiBoYXVzCiAoKCgnZWluJywxLjU2NDYyMTkzZS0wNywxKSwoJ2RpZXNlcycsLTAuMywxKSwoJ2hhdXMnLC0wLjUsMiksKSwoKCdoYXVzJywtMC43LDEpLCksKQorKCgoJ3PDrScsIDAsIDEpLCksKQpkaWZmIC0tZ2l0IGEvdGVzdC9sbS9iZXJrZWxleS9vdXRwdXQuZ29sZCBiL3Rlc3QvbG0vYmVya2VsZXkvb3V0cHV0LmdvbGQKaW5kZXggZmNhMDY3NC4uYzBkMzBhNCAxMDA2NDQKLS0tIGEvdGVzdC9sbS9iZXJrZWxleS9vdXRwdXQuZ29sZAorKysgYi90ZXN0L2xtL2JlcmtlbGV5L291dHB1dC5nb2xkCkBAIC0xLDQgKzEsNCBAQAotbG1fMD0tNy4xNTMgdG1fZ2x1ZV8wPTIuMDAwCi1sbV8wPS03LjE1MyB0bV9nbHVlXzA9Mi4wMDAKLWxtXzA9LTcuMTUzIHRtX2dsdWVfMD0yLjAwMAotbG1fMD0tNy4xNTMgdG1fZ2x1ZV8wPTIuMDAwCit0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tNy4xNTMKK3RtX2dsdWVfMD0yLjAwMCBsbV8wPS03LjE1MwordG1fZ2x1ZV8wPTIuMDAwIGxtXzA9LTcuMTUzCit0bV9nbHVlXzA9Mi4wMDAgbG1fMD0tNy4xNTMKZGlmZiAtLWdpdCBhL3Rlc3QvbG0vYmVya2VsZXkvdGVzdC5zaCBiL3Rlc3QvbG0vYmVya2VsZXkvdGVzdC5zaAppbmRleCAyNWZmOTQ0Li43MWZhNDEzIDEwMDc1NQotLS0gYS90ZXN0L2xtL2JlcmtlbGV5L3Rlc3Quc2gKKysrIGIvdGVzdC9sbS9iZXJrZWxleS90ZXN0LnNoCkBAIC0xLDcgKzEsNyBAQAogIyEvYmluL2Jhc2gKIAogKGZvciBmaWxlIGluIGxtIGxtLmd6IGxtLmJlcmtlbGV5bG0gbG0uYmVya2VsZXlsbS5nejsgZG8KLSAgICBlY2hvIHRoZSBjaGF0LXJvb21zIHwgam9zaHVhLWRlY29kZXIgLWZlYXR1cmUtZnVuY3Rpb24gIkxhbmd1YWdlTW9kZWwgLWxtX3R5cGUgYmVya2VsZXlsbSAtbG1fb3JkZXIgMiAtbG1fZmlsZSAkZmlsZSIgLXYgMCAtb3V0cHV0LWZvcm1hdCAlZiAyPiBsb2cKKyAgICBlY2hvIHRoZSBjaGF0LXJvb21zIHwgJEpPU0hVQS9iaW4vam9zaHVhLWRlY29kZXIgLWZlYXR1cmUtZnVuY3Rpb24gIkxhbmd1YWdlTW9kZWwgLWxtX3R5cGUgYmVya2VsZXlsbSAtbG1fb3JkZXIgMiAtbG1fZmlsZSAkZmlsZSIgLXYgMCAtb3V0cHV0LWZvcm1hdCAlZiAyPiBsb2cKIGRvbmUpID4gb3V0cHV0CiAKICMgQ29tcGFyZQpkaWZmIC0tZ2l0IGEvdGVzdC9wYWNrZWQtZ3JhbW1hci9qb3NodWEuY29uZmlnIGIvdGVzdC9wYWNrZWQtZ3JhbW1hci9qb3NodWEuY29uZmlnCmluZGV4IDFkNWUyZjAuLmIxZjAyYTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvcGFja2VkLWdyYW1tYXIvam9zaHVhLmNvbmZpZworKysgYi90ZXN0L3BhY2tlZC1ncmFtbWFyL2pvc2h1YS5jb25maWcKQEAgLTEsNiArMSw2IEBACiBsbSA9IGtlbmxtIDUgZmFsc2UgZmFsc2UgMTAwIGxtLmd6Ci10bSA9IHBhY2tlZCBwdCAxMiBncmFtbWFyLnBhY2tlZAotdG0gPSB0aHJheCBnbHVlIC0xIGdyYW1tYXIuZ2x1ZQordG0gPSB0aHJheCAtb3duZXIgcHQgLW1heHNwYW4gMTIgLXBhdGggZ3JhbW1hci5wYWNrZWQKK3RtID0gdGhyYXggLW93bmVyIGdsdWUgLW1heHNwYW4gLTEgLXBhdGggZ3JhbW1hci5nbHVlCiAKIG1hcmtfb292cz1mYWxzZQogCmRpZmYgLS1naXQgYS90ZXN0L3BhY2tlZC1ncmFtbWFyL3Rlc3QtbXVsdGlwbGUuc2ggYi90ZXN0L3BhY2tlZC1ncmFtbWFyL3Rlc3QtbXVsdGlwbGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRhNzU1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGFja2VkLWdyYW1tYXIvdGVzdC1tdWx0aXBsZS5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vYmFzaAorCitzZXQgLXUKKworIyBwYWNrIHRoZSBncmFtbWFyCitybSAtcmYgZm9vLnBhY2tlZCBiYXIucGFja2VkCiskSk9TSFVBL3NjcmlwdHMvc3VwcG9ydC9ncmFtbWFyLXBhY2tlci5wbCAtdiAtZyAnZ3JhbW1hci5neiBncmFtbWFyLmd6JyAtbyAnZm9vLnBhY2tlZCBiYXIucGFja2VkJyAyPiBwYWNrZXItbXVsdGlwbGUubG9nCisKK2RpZmYgLXEgZm9vLnBhY2tlZC92b2NhYnVsYXJ5IGJhci5wYWNrZWQvdm9jYWJ1bGFyeSA+IGRpZmYKKworaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisgIHJtIC1yZiBmb28ucGFja2VkIGJhci5wYWNrZWQgcGFja2VyLW11bHRpcGxlLmxvZworICBleGl0IDAKK2Vsc2UKKyAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvdGVzdC9wYWNrZWQtZ3JhbW1hci90ZXN0LnNoIGIvdGVzdC9wYWNrZWQtZ3JhbW1hci90ZXN0LnNoCmluZGV4IGZkZTZlOGIuLmNjYTE1ZmEgMTAwNzU1Ci0tLSBhL3Rlc3QvcGFja2VkLWdyYW1tYXIvdGVzdC5zaAorKysgYi90ZXN0L3BhY2tlZC1ncmFtbWFyL3Rlc3Quc2gKQEAgLTIsMTQgKzIsMTIgQEAKIAogc2V0IC11CiAKLWV4cG9ydCBUSFJBWD0kSk9TSFVBL3RocmF4Ci0KICMgcGFjayB0aGUgZ3JhbW1hcgogcm0gLXJmIGdyYW1tYXIucGFja2VkCi0kSk9TSFVBL3NjcmlwdHMvc3VwcG9ydC9ncmFtbWFyLXBhY2tlci5wbCBncmFtbWFyLmd6IGdyYW1tYXIucGFja2VkIDI+IHBhY2tlci5sb2cKKyRKT1NIVUEvc2NyaXB0cy9zdXBwb3J0L2dyYW1tYXItcGFja2VyLnBsIC12IC1nIGdyYW1tYXIuZ3ogLW8gZ3JhbW1hci5wYWNrZWQgMj4gcGFja2VyLmxvZwogCiAjIGdlbmVyYXRlIHRoZSBnbHVlIGdyYW1tYXIKLWphdmEgLVhteDJnIC1jcCAkSk9TSFVBL2xpYi8qOiRUSFJBWC9iaW4vdGhyYXguamFyIGVkdS5qaHUudGhyYXgudXRpbC5DcmVhdGVHbHVlR3JhbW1hciBncmFtbWFyLnBhY2tlZCA+IGdyYW1tYXIuZ2x1ZSAyPiBnbHVlLmxvZworamF2YSAtWG14MmcgLWNwICRKT1NIVUEvbGliL2FyZ3M0ai0yLjAuMjkuamFyOiRKT1NIVUEvY2xhc3Mgam9zaHVhLmRlY29kZXIuZmYudG0uQ3JlYXRlR2x1ZUdyYW1tYXIgLWcgZ3JhbW1hci5wYWNrZWQgPiBncmFtbWFyLmdsdWUgMj4gZ2x1ZS5sb2cKIAogIyBkZWNvZGUKIGNhdCBpbnB1dC5ibiB8ICRKT1NIVUEvYmluL2pvc2h1YS1kZWNvZGVyIC1tIDFnIC10aHJlYWRzIDIgLWMgam9zaHVhLmNvbmZpZyA+IG91dHB1dCAyPiBsb2cKQEAgLTE3LDcgKzE1LDcgQEAKIGRpZmYgLXUgb3V0cHV0IG91dHB1dC5nb2xkID4gZGlmZgogCiBpZiBbICQ/IC1lcSAwIF07IHRoZW4KLQlybSAtZiBwYWNrZXIubG9nIGRpZmYgbG9nIG91dHB1dC5ibGV1IG91dHB1dCBncmFtbWFyLmdsdWUgZ2x1ZS5sb2cKKwkjcm0gLWYgcGFja2VyLmxvZyBkaWZmIGxvZyBvdXRwdXQuYmxldSBvdXRwdXQgZ3JhbW1hci5nbHVlIGdsdWUubG9nCiAJcm0gLXJmIGdyYW1tYXIucGFja2VkCiAJZXhpdCAwCiBlbHNlCmRpZmYgLS1naXQgYS90ZXN0L3RocmF4L2V4dHJhY3Rpb24vdGVzdC5zaCBiL3Rlc3QvdGhyYXgvZXh0cmFjdGlvbi90ZXN0LnNoCmluZGV4IDZhODBhOTkuLjNmNmVkZjggMTAwNzU1Ci0tLSBhL3Rlc3QvdGhyYXgvZXh0cmFjdGlvbi90ZXN0LnNoCisrKyBiL3Rlc3QvdGhyYXgvZXh0cmFjdGlvbi90ZXN0LnNoCkBAIC00LDE0ICs0LDE0IEBACiAKIHNldCAtdQogCitleHBvcnQgVkVSU0lPTj0yLjUuMgorCiBybSAtcmYgdGhyYXgubG9nIGdyYW1tYXIuZ3ogLmdyYW1tYXIuY3JjIHRocmF4CiAKLWhhZG9vcF9kbF91cmw9aHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L2hhZG9vcC9jb3JlL2hhZG9vcC0wLjIwLjIvaGFkb29wLTAuMjAuMi50YXIuZ3oKLVtbICEgLWYgJEpPU0hVQS9saWIvaGFkb29wLTAuMjAuMi50YXIuZ3ogXV0gJiYgd2dldCAtcSAtTyAkSk9TSFVBL2xpYi9oYWRvb3AtMC4yMC4yLnRhci5neiAkaGFkb29wX2RsX3VybAotW1sgISAtZCBoYWRvb3AtMC4yMC4yIF1dICYmIHRhciB4emYgJEpPU0hVQS9saWIvaGFkb29wLTAuMjAuMi50YXIuZ3oKK1tbICEgLWQgaGFkb29wLSRWRVJTSU9OIF1dICYmIHRhciB4emYgJEpPU0hVQS9saWIvaGFkb29wLSRWRVJTSU9OLnRhci5negogCiB1bnNldCBIQURPT1AgSEFET09QX0hPTUUgSEFET09QX0NPTkZfRElSCi1leHBvcnQgSEFET09QPSQocHdkKS9oYWRvb3AtMC4yMC4yCitleHBvcnQgSEFET09QPSQocHdkKS9oYWRvb3AtJFZFUlNJT04KIAogIyBydW4gaGFkb29wCiAkSEFET09QL2Jpbi9oYWRvb3AgamFyICRKT1NIVUEvdGhyYXgvYmluL3RocmF4LmphciBpbnB1dC90aHJheC5jb25mIHRocmF4ID4gdGhyYXgubG9nIDI+JjEgCkBAIC0xOSw4ICsxOSw4IEBACiAKIHNpemU9JChwZXJsIC1lICJwcmludCArKHN0YXQoJ2dyYW1tYXIuZ3onKSlbN10gLiAkLyIpCiAKLXJtIC1yZiBoYWRvb3AtMC4yMC4yCi1pZiBbWyAkc2l6ZSAtZXEgOTg5ODE3IF1dOyB0aGVuCitybSAtcmYgaGFkb29wLSRWRVJTSU9OCitpZiBbWyAkc2l6ZSAtZXEgMTAwNDQwMSBdXTsgdGhlbgogICBybSAtcmYgdGhyYXgubG9nIGdyYW1tYXIuZ3ogLmdyYW1tYXIuY3JjIHRocmF4CiAgIGV4aXQgMAogZWxzZQpkaWZmIC0tZ2l0IGEvdGhyYXggYi90aHJheAppbmRleCAzZmQ2YjEwLi41MTI2MjJjIDE2MDAwMAotLS0gYS90aHJheAorKysgYi90aHJheApAQCAtMSArMSBAQAotU3VicHJvamVjdCBjb21taXQgM2ZkNmIxMGE0YzAxMDg0MDg4ZmNhNjcyNDZlODczYTlkYjY5YmUzNQorU3VicHJvamVjdCBjb21taXQgNTEyNjIyYzY4NTM3ZWM3OWEzNzliODUyYjJlYzA3MmU4NWE0NmZjMgo=